ZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9DaGFuZ2VMb2cgYi9kcml2ZXJzL2NoYXIvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjhhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNzc1IEBACisyMDAxLTA4LTExICBUaW0gV2F1Z2ggIDx0d2F1Z2hAcmVkaGF0LmNvbT4KKworCSogc2VyaWFsLmMgKGdldF9wY2lfcG9ydCk6IERlYWwgd2l0aCBhd2t3YXJkIFRpdGFuIGNhcmRzLgorCisxOTk4LTA4LTI2ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiBzZXJpYWwuYyAocnNfb3Blbik6IENvcnJlY3RseSBkZWNyZW1lbnQgdGhlIG1vZHVsZSBpbi11c2UgY291bnQKKwkJb24gZXJyb3JzLgorCitUaHUgRmViIDE5IDE0OjI0OjA4IDE5OTggIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHR0eV9pby5jICh0dHlfbmFtZSk6IFJlbW92ZSB0aGUgbm9uLXJlZW50cmFudCAoYW5kIG5vbi1TTVAgc2FmZSkKKwkJdmVyc2lvbiBvZiB0dHlfbmFtZSwgYW5kIHJlbmFtZSB0aGUgcmVlbnRyYW50IF90dHlfbmFtZQorCQlmdW5jdGlvbiB0byBiZSB0dHlfbmFtZS4KKwkJKHR0eV9vcGVuKTogQWRkIGEgd2FybmluZyBtZXNzYWdlIHN0YXRpbmcgY2FsbG91dCBkZXZpY2VzCisJCWFyZSBkZXByZWNhdGVkLgorCitNb24gRGVjICAxIDA4OjI0OjE1IDE5OTcgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHR0eV9pby5jICh0dHlfZ2V0X2JhdWRfcmF0ZSk6IFByaW50IGEgd2FybmluZyBzeXNsb2cgaWYgdGhlCisJCXR0eS0+YWx0X3NwZWVkIGtsdWRnZSBpcyB1c2VkOyB0aGlzIG1lYW5zIHRoZSBzeXN0ZW0gaXMKKwkJdXNpbmcgdGhlIGRlcHJlY2F0ZWQgU1BEX0hJIGlvY3Rscy4KKworTW9uIE5vdiAyNCAxMDozNzo0OSAxOTk3ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiBzZXJpYWwuYywgZXNwLmMsIHJvY2tldC5jOiBDaGFuZ2UgZHJpdmVycyB0byB0YWtlIGFkdmFudGFnZSBvZgorCSAJdHR5X2dldF9iYXVkX3JhdGUoKS4KKwkKKwkqIHR0eV9pby5jICh0dHlfZ2V0X2JhdWRfcmF0ZSk6IE5ldyBmdW5jdGlvbiB3aGljaCBjb21wdXRlcyB0aGUKKwkJY29ycmVjdCBiYXVkIHJhdGUgZm9yIHRoZSB0dHkuICBNb3JlIGZhY3RvcmluZyBvdXQgb2YKKwkJY29tbW9uIGNvZGUgb3V0IG9mIHRoZSBzZXJpYWwgZHJpdmVyIHRvIHRoZSBoaWdoLWxldmVsIHR0eQorCQlmdW5jdGlvbnMuLi4uCisKK1NhdCBOb3YgMjIgMDc6NTM6MzYgMTk5NyAgVGhlb2RvcmUgVHMnbyAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogc2VyaWFsLmMsIGVzcC5jLCByb2NrZXQuYzogQWRkIHR0eS0+ZHJpdmVyLmJyZWFrKCkgcm91dGluZSwgYW5kCisgCQlhbGxvdyBoaWdoLWxldmVsIHR0eSBjb2RlIHRvIGhhbmRsZSB0aGUgYnJlYWsgYW5kIHNvZnQKKyAJCWNhcnJpZXIgaW9jdGxzLgorCQorCSogdHR5X2lvY3RsLmMgKG5fdHR5X2lvY3RsKTogU3VwcG9ydCBUSU9DR1NPRlRDQVIgYW5kCisgCQlUSU9DU1NPRlRDQVIsIHNvIHRoYXQgZGV2aWNlIGRyaXZlcnMgZG9uJ3QgaGF2ZSB0byBzdXBwb3J0CisgCQlpdC4KKworCSogc2VyaWFsLmMgKGF1dG9jb25maWcpOiBDaGFuZ2UgMTY3NTAgdGVzdCB0byBob3BlZnVsbHkgZWxpbWluYXRlCisJCWZhbHNlIHJlc3VsdHMgYnkgcGVvcGxlIHdpdGggc3RyYW5nZSAxNjU1MEFzIGJlaW5nCisJCWRldGVjdGVkIGFzIDE2NzUwcy4gIEhvcGVmdWxseSAxNjc1MHMgd2lsbCBzdGlsbCBiZQorCQlkZXRlY3RlZCBhcyAxNjc1MCwgYW5kIG90aGVyIHdlaXJkIFVBUlRzIHdvbid0IGdldCBwb29ybHkKKwkJYXV0b2RldGVjdGVkLiAgSWYgdGhpcyBkb2Vzbid0IHdvcmssIEknbGwgaGF2ZSB0byBkaXNhYmxlCisJCXRoZSBhdXRvIGlkZW50aWZpY2F0aW9uIGZvciB0aGUgMTY3NTAuCisKKwkqIHR0eV9pby5jICh0dHlfaGFuZ3VwKTogTm93IGFjdHVhbGx5IGRvIHRoZSB0dHkgaGFuZ3VwCisJCXByb2Nlc3NpbmcgZHVyaW5nIHRoZSB0aW1lciBwcm9jZXNzaW5nLCBhbmQgZGlzYWJsZQorCQlpbnRlcnJ1cHRzIHdoaWxlIGRvaW5nIHRoZSBoYW5ndXAgcHJvY2Vzc2luZy4gIFRoaXMgYXZvaWRzCisJCXNldmVyYWwgbmFzdHkgcmFjZSBjb25kaXRpb25zIHdoaWNoIGhhcHBlbmVkIHdoZW4gdGhlCisJCWhhbmd1cCBwcm9jZXNzaW5nIHdhcyBkb25lIGFzeW5jaHJvbm91c2x5LgorCQkodHR5X2lvY3RsKTogRG8gYnJlYWsgaGFuZGxpbmcgaW4gdGhlIHR0eSBkcml2ZXIgaWYKKwkJZHJpdmVyJ3MgYnJlYWsgZnVuY3Rpb24gaXMgc3VwcG9ydGVkLiAgCisJCSh0dHlfZmxpcF9idWZmZXJfcHVzaCk6IE5ldyBleHBvcnRlZCBmdW5jdGlvbiB3aGljaCBzaG91bGQKKwkJYmUgdXNlZCBieSBkcml2ZXJzIHRvIHB1c2ggY2hhcmFjdGVycyBpbiB0aGUgZmxpcCBidWZmZXIKKwkJdG8gdGhlIHR0eSBoYW5kbGVyLiAgVGhpcyBtYXkgZWl0aGVyIGJlIGRvbmUgdXNpbmcgYSB0YXNrCisJCXF1ZXVlIGZ1bmN0aW9uIGZvciBiZXR0ZXIgQ1BVIGVmZmljaWVuY3ksIG9yIGRpcmVjdGx5IGZvcgorCQlsb3cgbGF0ZW5jeSBvcGVyYXRpb24uCisKKwkqIHNlcmlhbC5jIChyc19zZXRfdGVybWlvcyk6IEZpeCBidWcgcnNfc2V0X3Rlcm1pb3Mgd2hlbgorCQl0cmFuc2l0aW9uaW5nIGF3YXkgZnJvbSBCMCwgc3VibWl0dGVkIGJ5IFN0YW5pc2xhdgorCQlWb3JvbnlpLiAKKworVGh1IEp1biAxOSAyMDowNTo1OCAxOTk3ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiBzZXJpYWwuYyAoYmVnaW5fYnJlYWssIGVuZF9icmVhaywgcnNfaW9jdGwpOiBBcHBsaWVkIHBhdGNoCisJCXRvIHN1cHBvcnQgQlNEIGlvY3RscyB0byBzZXQgYW5kIGNsZWFyIHRoZSBicmVhaworCQljb25kaXRpb24gZXhwbGljaXRseS4KKworCSogY29uc29sZS5jIChzY3J1cCwgc2NyZG93biwgaW5zZXJ0X2xpbmUsIGRlbGV0ZV9saW5lKTogQXBwbGllZAorCQlmaXggc3VnZ2VzdGVkIGJ5IEFhcm9uIFRpZW5zaXZ1IHRvIHNwZWVkIHVwIGJsb2NrIHNjcm9sbHMKKwkJdXAgYW5kIGRvd24uCisKKwkqIG5fdHR5LmMgKG9wb3N0X2Jsb2NrLCB3cml0ZV9jaGFuKTogQWRkZWQgYSBtb2RpZmllZCAiZmFzdAorIAkJY29uc29sZSIgcGF0Y2ggd2hpY2ggcHJvY2Vzc2VzIGEgYmxvY2sgb2YgdGV4dCB2aWEKKwkJImNvb2tpbmciIGVmZmljaWVudGx5LgorCitXZWQgSnVuIDE4IDE1OjI1OjUwIDE5OTcgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHR0eV9pby5jIChpbml0X2RldiwgcmVsZWFzZV9kZXYpOiBBcHBsaWVkIGZpeCBzdWdnZXN0ZWQgYnkgQmlsbAorCQlIYXdlcyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBpbiB0aGUgdHR5IGNvZGUuCisKKwkqIG5fdHR5LmMgKG5fdHR5X2NoYXJzX2luX2J1ZmZlcik6IEFwcGxpZWQgZml4IHN1Z2dlc3RlZCBieSBCaWxsCisJCUhhd2VzIHNvIHRoYXQgbl90dHlfY2hhcnNfaW5fYnVmZmVyIHJldHVybnMgdGhlIGNvcnJlY3QKKwkJdmFsdWUgaW4gdGhlIGNhc2Ugd2hlbiB0aGUgdHR5IGlzIGluIGNhbm5vbmljYWwgbW9kZS4gIChUbworCQlhdm9pZCBhIHB0eSBkZWFkbG9jayB3aXRoIHRlbG5ldGQuKQorCitUaHUgRmViIDI3IDAxOjUzOjA4IDE5OTcgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHNlcmlhbC5jIChjaGFuZ2Vfc3BlZWQpOiBBZGQgc3VwcG9ydCBmb3IgdGhlIHRlcm1pb3MgZmxhZworCQlDTVNQQVIsIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBzZWxlY3Qgc3RpY2sgcGFyaXR5LgorCQkoaS5lLCBpZiBQQVJPREQgaXMgc2V0LCB0aGUgcGFyaXR5IGJpdCBpcyBhbHdheXMgMTsgaWYKKwkJUEFSUk9ERCBpcyBub3Qgc2V0LCB0aGVuIHRoZSBwYXJpdHkgYml0IGlzIGFsd2F5cyAwKS4KKworV2VkIEZlYiAyNiAxOTowMzoxMCAxOTk3ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiBzZXJpYWwuYyAoY2xlYW51cF9tb2R1bGUpOiBGaXggbWVtb3J5IGxlYWsgd2hlbiB1c2luZyB0aGUgc2VyaWFsCisJCWRyaXZlciBhcyBhIG1vZHVsZTsgbWFrZSBzdXJlIHRtcF9idWYgZ2V0cyBmcmVlZCEKKworVHVlIEZlYiAyNSAxMTowMTo1OSAxOTk3ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiBzZXJpYWwuYyAoc2V0X21vZGVtX2luZm8pOiBBZGQgc3VwcG9ydCBmb3Igc2V0dGluZyBhbmQgY2xlYXJpbmcKKwkJdGhlIE9VVDEgYW5kIE9VVDIgYml0cy4gIChGb3Igc3BlY2lhbCBjYXNlIFVBUlQncywgdXN1YWxseQorCQlmb3IgaGFsZi1kdXBsZXguKQorCQkoYXV0b2NvbmZpZywgY2hhbmdlX3NwZWVkKTogRml4IFRJIDE2NzUwIHN1cHBvcnQuCisKK1N1biBGZWIgMTYgMDA6MTQ6NDMgMTk5NyAgVGhlb2RvcmUgVHMnbyAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogdHR5X2lvLmMgKHJlbGVhc2VfZGV2KTogQWRkIHNhbml0eSBjaGVjayB0byBtYWtlIHN1cmUgdGhlcmUgYXJlCisJCW5vIHdhaXRlcnMgb24gdHR5LT5yZWFkX3dhaXQgb3IgdHR5LT53cml0ZV93YWl0LgorCisJKiBzZXJpYWwuYyAocnNfaW5pdCk6IERvbid0IGF1dG9jb25maWcgYSBkZXZpY2UgaWYgdGhlIEkvTyByZWdpb24KKwkJaXMgYWxyZWFkeSByZXNlcnZlZC4KKworCSogc2VyaWFsLmMgKHNlcmlhbF9wcm9jX2luZm8pOiBBZGQgc3VwcG9ydCBmb3IgL3Byb2Mvc2VyaWFsLgorCitUaHUgRmViIDEzIDAwOjQ5OjEwIDE5OTcgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHNlcmlhbC5jIChyZWNlaXZlX2NoYXJzKTogV2hlbiB0aGUgVUFSVCByZXBvdHJzIGFuIG92ZXJydW4KKyAJCWNvbmRpdGlvbiwgaXQgZG9lcyBzbyB3aXRoIGEgdmFsaWQgY2hhcmFjdGVyLiAgQ2hhbmdlZCB0bworIAkJbm90IHRocm93IGF3YXkgdGhlIHZhbGlkIGNoYXJhY3RlciwgYnV0IGluc3RlYWQgcmVwb3J0IHRoZQorCQlvdmVycnVuIGFmdGVyIHRoZSB2YWxpZCBjaGFyYWN0ZXIuCisKKwkqIHNlcmlhbC5jOiBBZGRlZCBuZXcgI2lmZGVmJ3MgZm9yIHNvbWUgb2YgdGhlIGFkdmFuY2VkIHNlcmlhbAorCQlkcml2ZXIgZmVhdHVyZXMuICBBIG1pbmltYWwgZHJpdmVyIHRoYXQgb25seSBzdXBwb3J0cyBDT00KKwkJMS8yLzMvNCB3aXRob3V0IHNoYXJpbmcgc2VyaWFsIGludGVycnVwdHMgb25seSB0YWtlcyAxN2s7CisJCXRoZSBmdWxsIGRyaXZlciB0YWtlcyAzMmsuCisJCQorV2VkIEZlYiAxMiAxNDo1MDo0NCAxOTk3ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiB2dC5jOgorCSogcHR5LmM6IAorCSogdHR5X2lvY3RsLmM6IAorCSogc2VyaWFsLmM6IFVwZGF0ZSByb3V0aW5lcyB0byB1c2UgdGhlIG5ldyAyLjEgbWVtb3J5IGFjY2VzcworCSAJcm91dGluZXMuCisKK1dlZCBEZWMgIDQgMDc6NTE6NTIgMTk5NiAgVGhlb2RvcmUgVHMnbyAgPHR5dHNvQGxvY2FsaG9zdC5taXQuZWR1PgorCisJKiBzZXJpYWwuYyAoY2hhbmdlX3NwZWVkKTogVXNlIHNhdmVfZmxhZ3MoKTsgY2xpKCkgYW5kCisJCXJlc3RvcmVfZmxhZ3MoKSBpbiBvcmRlciB0byBlbnN1cmUgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5CisJCXR1cm4gb24gaW50ZXJydXB0cyB3aGVuIHN0YXJ0aW5nIHVwIHRoZSBwb3J0LgorCQkoc3RhcnR1cCk6IE1vdmUgdGhlIGluc2VydGlvbiBvZiBzZXJpYWwgc3RydWN0dXJlIGludG8gdGhlCisJCUlSUSBjaGFpbiBlYXJsaWVyIGludG8gdGhlIHN0YXJ0dXAgcHJvY2Vzc2luZy4gIEludGVycnVwdHMKKwkJc2hvdWxkIGJlIG9mZiB0aGlzIHdob2xlIHRpbWUsIGJ1dCB3ZSBldmVudHVhbGx5IHdpbGwgd2FudAorCQl0byByZWR1Y2UgdGhpcyB3aW5kb3cuCisKK1RodSBOb3YgMjEgMTA6MDU6MjIgMTk5NiAgVGhlb2RvcmUgVHMnbyAgPHR5dHNvQGxvY2FsaG9zdC5taXQuZWR1PgorCisJKiB0dHlfaW9jdGwuYyAodHR5X3dhaXRfdW50aWxfc2VudCk6IEFsd2F5cyBjaGVjayB0aGUgZHJpdmVyCisgCQl3YWl0X3VudGlsX3JlYWR5IHJvdXRpbmUsIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGNoYXJhY3RlcnMKKyAJCWluIHRoZSB4bWl0IGJ1ZmZlci4gIChUaGVyZSBtYXkgYmUgY2hhcmFjdGVzIGluIHRoZSBkZXZpY2UKKyAJCUZJRk8uKQorCQkobl90dHlfaW9jdGwpOiBBZGQgbmV3IGZsYWcgdHR5LT5mbG93X3N0b3BwZWQgd2hpY2gKKyAJCWluZGljYXRlcyB3aGV0aGVyIHRoZSB0dHkgaXMgc3RvcHBlZCBkdWUgdG8gYSByZXF1ZXN0IGJ5CisgCQl0aGUgVENYT05DIGlvY3RsICh1c2VkIGJ5IHRjZmxvdykuICBJZiBzbywgZG9uJ3QgbGV0IGFuCisgCQlpbmNvbWluZyBYT0ZGIGNoYXJhY3RlciByZXN0YXJ0IHRoZSB0dHkuICBUaGUgdHR5IGNhbiBvbmx5CisgCQliZSByZXN0YXJ0ZWQgYnkgYW5vdGhlciBUQ1hPTkMgcmVxdWVzdC4KKworCSogdHR5X2lvLmMgKHN0YXJ0X3R0eSk6IERvbid0IGFsbG93IHRoZSB0dHkgdG8gYmUgcmVzdGFydGVkIGlmCisJCXR0eS0+Zmxvd19zdG9wcGVkIGlzIHRydWUuCisKKwkqIG5fdHR5LmMgKG5fdHR5X3JlY2VpdmVfY2hhcik6IElmIHR0eS0+Zmxvd19zdG9wcGVkIGlzIHRydWUsIGFuZAorIAkJSVhBTlkgaXMgc2V0LCBkb24ndCBlYXQgYSBjaGFyYWN0ZXIgdHJ5aW5nIHRvIHJlc3RhcnQgdGhlCisgCQl0dHkuCisKKwkqIHNlcmlhbC5jIChzdGFydHVwKTogUmVtb3ZlIG5lZWQgZm9yIE1DUl9ub2ludCBmcm9tIHRoZQorIAkJYXN5bmNfc3RydWN0IHN0cnVjdHVyZS4gIE9ubHkgdHVybiBvbiBEVFIgYW5kIFJUUyBpZiB0aGUKKyAJCWJhdWQgcmF0ZSBpcyBub3QgemVyby4KKwkJKGNoYW5nZV9zcGVlZCk6IE1vcmUgYWNjdXJhdGVseSBjYWxjdWxhdGUgdGhlIHRpbWVvdXQKKyAJCXZhbHVlIGJhc2VkIG9uIHRoZSB3b3JkIHNpemUuICBNb3ZlIHJlc3BvbnNpYmlsaXR5IG9mCisgCQloYW5ndXAgd2hlbiBzcGVlZCBiZWNvbWVzIEIwIHRvIHJzX3NldF90ZXJtaW9zKCkKKwkJKHNldF9zZXJpYWxfaW5mbyk6IFdoZW4gY2hhbmdpbmcgdGhlIFVBUlQgdHlwZSBzZXQgdGhlCisgCQljdXJyZW50IHhtaXRfZmlmb19zaXplIGFzIHdlbGwgYXMgdGhlIHBlcm1hbmVudAorIAkJeG1pdF9maWZvX3NpemUuCisJCShyc19pb2N0bCk6IEZpeCBUQ1NCUksgKHVzZWQgYnkgdGNkcmFpbikgYW5kIFRDU0JSS1AKKyAJCWlvY3RscyB0byByZXR1cm4gRUlOVFIgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCisJCShyc19zZXRfdGVybWlvcyk6IElmIHRoZSBiYXVkIHJhdGUgY2hhbmdlcyB0byBvciBmcm9tIEIwLAorIAkJdGhpcyBmdW5jdGlvbiBpcyBub3cgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgb3IgY2xlYXJpbmcKKyAJCURUUiBhbmQgUlRTLiAgRFRSIGFuZCBSVFMgYXJlIG9ubHkgYmUgY2hhbmdlZCBvbiB0aGUKKyAJCXRyYW5zaXRpb24gdG8gb3IgZnJvbSB0aGUgQjAgc3RhdGUuCisJCShyc19jbG9zZSk6IFdhaXQgZm9yIHRoZSBjaGFyYWN0ZXJzIHRvIGRyYWluIGJhc2VkIG9uCisgCQlpbmZvLT50aW1lb3V0LiAgQXQgbG93IGJhdWQgcmF0ZXMgKDUwIGJwcyksIGl0IG1heSB0YWtlIGEKKyAJCWxvbmcgdGltZSBmb3IgdGhlIEZJRk8gdG8gY29tcGxldGVseSBkcmFpbiBvdXQhCisJCShyc193YWl0X3VudGlsX3NlbnQpOiBGaXhlZCB0aW1lb3V0IGhhbmRsaW5nLiAgTm93CisgCQlyZWxlYXNlcyBjb250cm9sIHRvIHRoZSBzY2hlZHVsZXIsIGJ1dCBjaGVja3MgZnJlcXVlbnRseQorIAkJZW5vdWdoIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIHNlbnNpdGl2ZSBlbm91Z2ggdG8gcGFzcworIAkJdGhlIHRpbWluZyByZXF1aXJlbWVudHMgb2YgdGhlIE5JU1QtUENUUy4KKwkJKGJsb2NrX3RpbF9yZWFkeSk6IFdoZW4gb3BlbmluZyB0aGUgZGV2aWNlLCBkb24ndCB0dXJuIG9uCisgCQlEVFIgYW5kIFJUUyBpZiB0aGUgYmF1ZCByYXRlIGlzIEIwLgorCitUaHUgTm92IDE0IDAwOjA2OjA5IDE5OTYgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHNlcmlhbC5jIChhdXRvY29uZmlnKTogRml4IGF1dG9jb25maWd1cmF0aW9uIHByb2JsZW1zOworCQlpbmZvLT5mbGFncyB3YXNuJ3QgZ2V0dGluZyBpbml0aWFsaXplZCBmcm9tIHRoZSBzdGF0ZQorCQlzdHJ1Y3R1cmUuICBQdXQgaW4gbW9yZSBwYXJhbm9pZCB0ZXN0IGZvciB0aGUgMTY3NTAuCisKK0ZyaSBOb3YgIDggMjA6MTk6NTAgMTk5NiAgVGhlb2RvcmUgVHMnbyAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogbl90dHkuYyAobl90dHlfZmx1c2hfYnVmZmVyKTogT25seSBjYWxsIGRyaXZlci0+dW50aHJvdHRsZSgpIGlmCisgCQl0aGUgdHR5IHdhcyBwcmV2aW91cyB0aHJvdHRsZWQuCisJCShuX3R0eV9zZXRfdGVybWlvcywgd3JpdGVfY2hhbik6IEFkZCBjaGFuZ2VzIHN1Z2dlc3RlZCBieQorIAkJCVNpbW9uIFAuIEFsbGVuIHRvIGFsbG93IGhhcmR3YXJlIGNvb2tpbmcuCisKKwkqIHR0eV9pb2N0bC5jIChzZXRfdGVybWlvcyk6IElmIHdlIGdldCBhIHNpZ25hbCB3aGlsZSB3YWl0aW5nIGZvcgorCQl0aGUgdHR5IHRvIGRyYWluLCByZXR1cm4gLUVJTlRSLgorCQorCSogc2VyaWFsLmMgKGNoYW5nZV9zcGVlZCk6IEFkZCBzdXBwb3J0IGZvciBDUkVBRCwgYXMgcmVxdWlyZWQgYnkKKwkgCVBPU0lYLgorCitTYXQgTm92ICAyIDIwOjQzOjEwIDE5OTYgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHNlcmlhbC5jOiBXaG9sZXNhbGUgY2hhbmdlcy4gIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBTdGFydGVjaAorIAkJMTY2NTAgYW5kIDE2NjUwVjIgY2hpcHMuICAoV0FSTklORzogdGhlIG5ldyBzdGFydGVjaAorIAkJMTY2NTBBIG1heSBvciBtYXkgbm90IHdvcmshKSAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlCisgCQlUSTE2NzUwIChub3QgeWV0IHRlc3RlZCkuICBTcGxpdCBhc3luY19zdHJ1Y3QgaW50byBhCisgCQl0cmFuc2llbnQgcGFydCAoYXN5bmNfc3RydWN0KSBhbmQgYSBwZXJtYW5lbnQgcGFydAorCQkoc2VyaWFsX3N0YXRlKSB3aGljaCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbgorIAkJaW5mb3JtYXRpb24gZm9yIHRoZSBwb3J0cy4gIEFkZGVkIG5ldyBkcml2ZXIgcm91dGluZXMKKyAJCXdhaXRfdW50aWxfc2VudCgpIGFuZCBzZW5kX3hjaGFyKCkgdG8gaGVscCB3aXRoIFBPU0lYCisgCQljb21wbGlhbmNlLiAgQWRkZWQgc3VwcG9ydCBmb3IgcmFkaW8gY2xvY2tzIHdoaWNoIHdhZ2dsZQorCQl0aGUgY2FycmllciBkZXRlY3QgbGluZSAoQ09ORklHX0hBUkRfUFBTKS4KKwkKKwkqIHR0eV9pb2N0bC5jICh0dHlfd2FpdF91bnRpbF9zZW50KTogQWRkZWQgY2FsbCB0byBuZXcgZHJpdmVyCisJCWZ1bmN0aW9uIHR0eS0+ZHJpdmVyLndhaXRfdW50aWxfc2VudCgpLCB3aGljaCByZXR1cm5zIHdoZW4KKwkJdGhlIHR0eSdzIGRldmljZSB4bWl0IGJ1ZmZlcnMgYXJlIGRyYWluZWQuICBOZWVkZWQgZm9yCisJCWZ1bGwgUE9TSVggY29tcGxpYW5jZS4KKworCQkoc2VuZF9wcmlvX2NoYXIpOiBOZXcgZnVuY3Rpb24sIGNhbGxlZCBieSB0aGUgaW9jdGwncworCQlUQ0lPRkYgYW5kIFRDSU9OOyB1c2VzIHRoZSBuZXcgZHJpdmVyIGNhbGwgc2VuZF94Y2hhcigpLAorCQl3aGljaCB3aWxsIHNlbmQgdGhlIFhPTiBvciBYT0ZGIGNoYXJhY3RlciBhdCBoaWdoIHByaW9yaXR5CisJCShhbmQgZXZlbiBpZiB0dHkgb3V0cHV0IGlzIHN0b3BwZWQpLgorCitXZWQgSnVuICA1IDE4OjUyOjA0IDE5OTYgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHB0eS5jIChwdHlfY2xvc2UpOiBXaGVuIGNsb3NpbmcgYSBwdHksIG1ha2Ugc3VyZSBwYWNrZXQgbW9kZSBpcworCSAJY2xlYXJlZC4KKworU3VuIE1heSAyNiAwOTozMzo1MiAxOTk2ICBUaGVvZG9yZSBUcydvICA8dHl0c29AcnN0cy0xMS5taXQuZWR1PgorCisJKiB2ZXNhX2JsYW5rLmMgKHNldF92ZXNhX2JsYW5raW5nKTogQWRkIG1pc3NpbmcgdmVyaWZ5X2FyZWEoKSBjYWxsLgorCisJKiBzZWxlY3Rpb24uYyAoc2V0X3NlbGVjdGlvbik6IEFkZCBtaXNzaW5nIHZlcmlmeV9hcmVhKCkgY2FsbC4KKworCSogdHR5X2lvLmMgKHR0eV9pb2N0bCk6IEFkZCBtaXNzaW5nIHZlcmlmeV9hcmVhKCkgY2FsbHMuCisKKwkqIHNlcmlhbC5jIChyc19pb2N0bCk6IEFkZCBtaXNzaW5nIHZlcmlmeV9hcmVhKCkgY2FsbHMuCisJCShyc19pbml0KTogQWxsb3cgaW5pdGlhbGl6YXRpb24gb2Ygc2VyaWFsIGRyaXZlcgorCQljb25maWd1cmF0aW9uIGZyb20gYSBtb2R1bGUuCisKKwkqIHJhbmRvbS5jIChleHRyYWN0X2VudHJvcHkpOiBBZGQgbWlzc2luZyB2ZXJpZnlfYXJlYSBjYWxsLgorCQlEb24ndCBsaW1pdCBudW1iZXIgb2YgY2hhcmFjdGVycyByZXR1cm5lZCB0bworCQkzMiw3NjguIEV4dHJhY3QgZW50cm9weSBpcyBub3cgbm8gbG9uZ2VyIGEgaW5saW5lZAorCQlmdW5jdGlvbi4KKworCQkocmFuZG9tX3JlYWQpOiBDaGVjayByZXR1cm4gdmFsdWUgaW4gY2FzZSBleHRyYWN0X2VudHJvcHkKKwkJcmV0dXJucyBhbiBlcnJvci4KKworCQkoc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIpOiBOZXcgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhCisJCXNlY3VyZSBUQ1Agc2VxdWVuY2UgbnVtYmVyLiAgVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudCBzb21lCisJCW5hc3R5IFRDUCBoaWphY2tpbmcgYXR0YWNrcy4KKwkKKwkJKGluaXRfc3RkX2RhdGEpOiBJbml0aWFsaXplIHVzaW5nIGdldHRpbWVvZmRheSgpIGluc3RlYWQgb2YKKwkJc3RydWN0IHRpbWV2YWwgeHRpbWUuCisKKwkJKGZhc3RfYWRkX2VudHJvcHlfd29yZCwgYWRkX2VudHJvcHlfd29yZCk6IFJlbmFtZSB0aGUKKwkJaW5saW5lIGZ1bmN0aW9uIGFkZF9lbnRyb3B5X3dvcmQoKSB0bworCQlmYXN0X2FkZF9lbnRyb3B5X3dvcmQoKS4gIE1ha2UgYWRkX2VudHJvcHlfd29yZCgpIGJlIHRoZQorCQlub24taW5saW5lZCBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIGluIG5vbi10aW1pbmcgY3JpdGljYWwKKwkJcGxhY2VzLCBpbiBvcmRlciB0byBzYXZlIHNwYWNlLgorCisJCShpbml0aWFsaXplX2JlbmNobWFyaywgYmVnaW5fYmVuY2htYXJrLCBlbmRfYmVuY2htYXJrKTogTmV3CisJCWZ1bmN0aW9ucyBkZWZpbmVkIHdoZW4gUkFORE9NX0JFTkNITUFSSyBpcyBkZWZpbmVkLiAgVGhleQorCQlhbGxvdyB1cyB0byBiZW5jaG1hcmsgdGhlIHNwZWVkIG9mIHRoZQorCQlhZGRfdGltZXJfcmFuZG9tbmVzcygpIGNhbGwuCisKKwkJKGludF9sbiwgcm90YXRlX2xlZnQpOiBBZGQgdHdvIG5ldyBpbmxpbmUgZnVuY3Rpb25zIHdpdGgKKwkJaTM4NiBvcHRpbWl6ZWQgYXNtIGluc3RydWN0aW9ucy4gIFRoaXMgc3BlZWRzIHVwIHRoZQorCQljcml0aWNhbCBhZGRfZW50cm9weV93b3JkKCkgYW5kIGFkZF90aW1lcl9yYW5kb21uZXNzKCkKKwkJZnVuY3Rpb25zLCB3aGljaCBhcmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGhhbmRsZXJzLgorCitUdWUgTWF5ICA3IDIyOjUxOjExIDE5OTYgICAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogcmFuZG9tLmMgKGFkZF90aW1lcl9yYW5kb21uZXNzKTogTGltaXQgdGhlIGFtb3VudCByYW5kb21uZXNzCisJCXRoYXQgd2UgZXN0aW1hdGUgdG8gMTIgYml0cy4gIChBbiBhcmJpdHJhcnkgYW1vdW50KS4KKworCQkoZXh0cmFjdF9lbnRyb3B5KTogVG8gbWFrZSBpdCBoYXJkZXIgdG8gYW5hbHl6ZSB0aGUgaGFzaAorCQlmdW5jdGlvbiwgZm9sZCB0aGUgaGFzaCBmdW5jdGlvbiBpbiBoYWxmIHVzaW5nIFhPUiwgYW5kCisJCXVzZSB0aGUgZm9sZGVkIHJlc3VsdCBhcyB0aGUgdmFsdWUgdG8gZW1pdCB0byB0aGUgdXNlci4KKwkJQWxzbywgYWRkIHRpbWVyIHJhbmRvbW5lc3MgZWFjaCBwYXNzIHRocm91Z2ggdGhlCisJCWV4YWN0X2VudHJvcHkgY2FsbCwgdG8gaW5jcmVhc2UgdGhlIGFtb3VudCBvZiB1bmtub3duCisJCXZhbHVlcyBkdXJpbmcgdGhlIGV4dHJhY3Rpb24gcHJvY2Vzcy4KKworCQkocmFuZG9tX2lvY3RsKTogVXNlIElPUi9JT1cgZGVmaW5pdGlvbnMgdG8gZGVmaW5lIHRoZQorCQlpb2N0bCB2YWx1ZXMgdXNlZCBieSB0aGUgL2Rldi9yYW5kb20gZHJpdmVyLiAgQWxsb3cgdGhlCisJCW9sZCBpb2N0bCB2YWx1ZXMgdG8gYmUgdXNlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKwkJKGZvciBhIGxpbWl0ZWQgYW1vdW50IG9mIHRpbWUpLgorCitXZWQgQXByIDI0IDE0OjAyOjA0IDE5OTYgIFRoZW9kb3JlIFRzJ28gIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHJhbmRvbS5jIChhZGRfdGltZXJfcmFuZG9tbmVzcyk6IFVzZSAybmQgZGVyaXZhdGl2ZSBhcyB3ZWxsIHRvCisJCWJldHRlciBlc3RpbWF0ZSBlbnRyb3B5LgorCisJCShyYW5kX2luaXRpYWxpemUpOiBFeHBsaWNpdGx5IGluaXRpYWxpemUgYWxsIHRoZSBwb2ludGVycworCQl0byBOVUxMLiAgKENsZWFyaW5nIHBvaW50ZXJzIHVzaW5nIG1lbXNldCBpc24ndCBwb3J0YWJsZS4pCisJCUluaXRpYWxpemUgdGhlIHJhbmRvbSBwb29sIHdpdGggT1MtZGVwZW5kZW50IGRhdGEuCisKKwkJKHJhbmRvbV93cml0ZSk6IEFkZCBzYW5pdHkgY2hlY2tpbmcgdG8gdGhlIGFyZ3VtZW50cyB0bworCQlyYW5kb21fd3JpdGUoKSwgc28gdGhhdCBiYWQgYXJndW1lbnRzIHdvbid0IGNhdXNlIGEga2VybmVsCisJCVNFR1YuIAorCisJCShyYW5kb21fcmVhZCk6IFVwZGF0ZSB0aGUgYWNjZXNzIHRpbWUgb2YgdGhlIGRldmljZSBpbm9kZQorCQl3aGVuIHlvdSByZXR1cm4gZGF0YSB0byB0aGUgdXNlci4KKworCQkocmFuZG9tX2lvY3RsKTogV2FrZSB1cCB0aGUgcmFuZG9tX3dhaXQgY2hhbm5lbCB3aGVuIHRoZXJlCisJCWFyZSBvbmx5IFdBSVRfSU5QVVRfQklUUyBhdmFpbGFibGUuICBBZGQgbW9yZSBwYXJhbm9pYQorCQljaGVja3MgdG8gbWFrZSBzdXJlIGVudHJvcHlfY291bnQgZG9lc24ndCBnbyBiZXlvbmQgdGhlCisJCWJvdW5kcyBvZiAoMCwgUE9PTFNJWkUpLiAgQWRkIGEgZmV3IG1pc3NpbmcgdmVyaWZ5X2FyZWEKKwkJY2hlY2tzLiAgQWRkIHN1cHBvcnQgZm9yIHRoZSBSTkRDTEVBUlBPT0wgaW9jdGwsIHdoaWNoCisJCXphcHMgdGhlIHJhbmRvbSBwb29sLgorCisJCShhZGRfdGltZXJfcmFuZG9tbmVzcyk6IFdha2UgdXAgdGhlIHJhbmRvbV93YWl0CisJCWNoYW5uZWwgb25seSB3aGVuIHRoZXJlIGFyZSBXQUlUX0lOUFVUX0JJVFMgYXZhaWxhYmxlLgorCisJCShyYW5kb21fc2VsZWN0KTogQWxsb3cgYSByYW5kb20gcmVmcmVzaCBkYWVtb24gcHJvY2VzcyB0bworCQlzZWxlY3Qgb24gL2Rldi9yYW5kb20gZm9yIHdyaXRpbmc7IHdha2UgdXAgdGhlIGRhZW1vbiB3aGVuCisJCXRoZXJlIGFyZSBsZXNzIHRoYW4gV0FJVF9PVVRQVVRfQklUUyBiaXRzIG9mIHJhbmRvbW5lc3MKKwkJYXZhaWxhYmxlLgorCitUdWUgQXByIDIzIDIyOjU2OjA3IDE5OTYgICAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogdHR5X2lvLmMgKGluaXRfZGV2KTogQ2hhbmdlIHJldHVybiBjb2RlIHdoZW4gdXNlciBhdHRlbXB0cyB0bworCQlvcGVuIG1hc3RlciBwdHkgd2hpY2ggaXMgYWxyZWFkeSBvcGVuIGZyb20gRUFHQUlOIHRvIEVJTywKKwkJdG8gbWF0Y2ggd2l0aCBCU0QgZXhwZWN0YXRpb25zLiAgRUlPIGlzIG1vcmUgY29ycmVjdAorCQlhbnl3YXksIHNpbmNlIEVBR0FJTiBpbXBsaWVzIHRoYXQgcmV0cnlpbmcgd2lsbCBiZQorCQlzdWNjZXNzZnVsIC0tLSB3aGljaCBpdCBtaWdodCBiZS4uLi4gRXZlbnR1YWxseSEhCisKKwkqIHB0eS5jIChwdHlfb3BlbiwgcHR5X2Nsb3NlKTogRml4IHdhaXQgbG9vcCBzbyB0aGF0IHdlIGRvbid0CisJCWJ1c3kgbG9vcCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbWFzdGVyIHNpZGUgdG8gb3Blbi4KKwkJRml4IHR0eSBvcGVuaW5nL2Nsb3NpbmcgbG9naWMuICBUVFlfU0xBVkVfQ0xPU0VEIHdhcworCQlyZW5hbWVkIHRvIFRUWV9PVEhFUl9DTE9TRUQsIHNvIHRoYXQgdGhlIG5hbWUgaXMgbW9yZQorCQlkZXNjcmlwdGl2ZS4gIEFsc28gZml4ZWQgY29kZSBzbyB0aGF0IHRoZSB0dHkgZmxhZworCQlhY3R1YWxseSB3b3JrcyBjb3JyZWN0bHkgbm93Li4uLgorCitNb24gQXByICAxIDEwOjIyOjAxIDE5OTYgICAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogc2VyaWFsLmMgKHJzX2Nsb3NlKTogQ2xlYW5lZCB1cCBtb2R1bGFyaXphdGlvbiBjaGFuZ2VzLgorCQlSZW1vdmUgY29kZSB3aGljaCBmb3JjZWQgbGluZSBkaXNjaXBsaW5lIGJhY2sgdG8gTl9UVFkKKwkJdGhpcyBpcyBkb25lIGluIHRoZSB0dHkgdXBwZXIgbGF5ZXJzLCBhbmQgdGhlcmUncyBubworCQlyZWFzb24gdG8gZG8gaXQgaGVyZS4gIChNYWtpbmcgdGhpcyBjaGFuZ2UgYWxzbworCQlyZW1vdmVkIHRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSBzZXJpYWwgbW9kdWxlIGFjY2VzcworCQl0aGUgaW50ZXJuYWwga2VybmVsIHN5bWJvbCAibGRpc2NzIi4pCisKKwkqIHR0eV9pby5jICh0dHlfaW5pdCk6IEZvcm1hbGx5IHJlZ2lzdGVyIGEgdHR5X2RyaXZlciBlbnRyeSBmb3IKKwkJL2Rldi90dHkgKGRldmljZSA0LCAwKSBhbmQgL2Rldi9jb25zb2xlIChkZXZpY2UgNSwgMCkuCisJCVRoaXMgZ3VhcmFudGVlcyB0aGF0IG1ham9yIGRldmljZSBudW1iZXJzIDQgYW5kIDUgd2lsbCBiZQorCQlyZXNlcnZlZCBmb3IgdGhlIHR0eSBzdWJzeXN0ZW0gKGFzIHRoZXkgaGF2ZSB0byBiZSBiZWNhdXNlCisJCW9mIC9kZXYvdHR5IGFuZCAvZGV2L2NvbnNvbGUpLiAgUmVtb3ZlZCB0dHlfcmVnZGV2LCBhcworCQl0aGlzIGludGVyZmFjZSBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LgorCitTdW4gTWFyIDE3IDIwOjQyOjQ3IEdNVCAxOTk2IDxhaEBkb2MuaWMuYWMudWs+CisKKwkqIHNlcmlhbC5jIDogbW9kdWxhcmlzYXRpb24gKGNoYW5nZXMgaW4gbGludXgvZnMvZGV2aWNlLmMgYWxsb3cKKwkJa2VybmVsZCB0byBhdXRvbWF0aWNhbGx5IGxvYWQgdGhlIHNlcmlhbCBtb2R1bGUpLgorCisJKiBNYWtlZmlsZSwgQ29uZmlnLmluIDogc2VyaWFsIG1vZHVsYXJpc2F0aW9uIGFkZHMuCisKKwkqIHR0eV9pby5jIDogdHR5X2luaXRfY3R0eSB1c2VkIGJ5IHRvIHJlZ2lzdGVyICJjdWEiIGRyaXZlciBqdXN0CisJCWZvciB0aGUgL2Rldi90dHkgZGV2aWNlICg1LDApLiAgQWRkZWQgdHR5X3JlZ2Rldi4KKwkKKwkqIHNlcmlhbC5jIChzaHV0ZG93biwgcnNfaW9jdGwpIDogd2hlbiBwb3J0IHNodXRzIGRvd24gd2FrZXVwIHByb2Nlc3NlcworCSAgd2FpdGluZyBvbiBkZWx0YV9tc3Jfd2FpdC4gVGhlIFRJT0NNSVdBSVQgaW9jdGwgcmV0dXJucyBFSU8KKwkgIGlmIG5vIGNoYW5nZSB3YXMgZG9uZSBzaW5jZSB0aGUgdGltZSBvZiBjYWxsLgorCitTYXQgTWFyIDE2IDE0OjMzOjEzIDE5OTYgPGFlYkBjd2kubmw+CisKKwkqIHR0eV9pby5jIChkaXNhc3NvY2lhdGVfY3R0eSk6IElmIGRpc2Fzc29jaWF0ZV9jdHR5IGlzIGNhbGxlZCBieQorCQlleGl0LCBkbyBub3QgcGVyZm9ybSBhbiBpbXBsaWNpdCB2aGFuZ3VwIG9uIGEgcHR5LgorCitGcmkgRmViICA5IDE0OjE1OjQ3IDE5OTYgICAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogc2VyaWFsLmMgKGJsb2NrX3RpbF9yZWFkeSk6IEZpeGVkIGFub3RoZXIgcmFjZSBjb25kaXRpb24gd2hpY2gKKwkJaGFwcGVucyBpZiBhIGhhbmd1cCBoYXBwZW5zIGR1cmluZyB0aGUgb3Blbi4KKworV2VkIEphbiAxMCAxMDowODowMCAxOTk2ICAgIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHNlcmlhbC5jIChibG9ja190aWxfcmVhZHkpOiBSZW1vdmUgcmFjZSBjb25kaXRpb24gd2hpY2ggaGFwcGVuZWQKKwkJaWYgYSBoYW5ndXAgY29uZGl0aW9uIGhhcHBlbmVkIGR1cmluZyB0aGUgc2V0dXAgb2YgdGhlCisJCVVBUlQsIGJlZm9yZSByc19vcGVuKCkgY2FsbGVkIGJsb2NrX3RpbF9yZWFkeSgpLiAgVGhpcworCQljYXVzZWQgdGhlIGluZm8tPmNvdW50IGNvdW50ZXIgdG8gYmUgZXJyb25lb3VzbHkKKwkJZGVjcmVtZW50ZWQuCisKKwkqIHNlcmlhbC5jIChzdGFydHVwLCByc19vcGVuKTogUmVtb3ZlIHJhY2UgY29uZGl0aW9uIHRoYXQgY291bGQKKwkJY2F1c2UgYSBtZW1vcnkgbGVhayBvZiBvbmUgcGFnZS4gIChGb3J0dW5hdGVseSwgYm90aCByYWNlCisJCWNvbmRpdGlvbnMgd2VyZSByZWxhdGl2ZWx5IHJhcmUgaW4gcHJhY3RpY2UuKQorCitUdWUgRGVjICA1IDEzOjIxOjI3IDE5OTUgICAgPHR5dHNvQHJzdHMtMTEubWl0LmVkdT4KKworCSogc2VyaWFsLmMgKGNoZWNrX21vZGVtX3N0YXR1cywgcnNfaW9jdGwpOiBTdXBwb3J0IHRoZSBuZXcKKwkJaW9jdGwoKSdzIFRJT0NHSUNPVU5ULCBUSU9DTUlXQUlULiAgVGhlc2UgYWxsb3cgYW4KKwkJYXBwbGljYXRpb24gcHJvZ3JhbSB0byB3YWl0IG9uIGEgbW9kZW0gc2VyaWFsIHJlZ2lzdGVyCisJCXN0YXR1cyBiaXQgY2hhbmdlLCBhbmQgdG8gZmluZCBvdXQgaG93IG1hbnkgY2hhbmdlcyBoYXZlCisJCXRha2VuIHBsYWNlIGZvciB0aGUgTVNSIGJpdHMuCisKKwkJKHJzX3dyaXRlKTogRWxpbWluYXRlIGEgcmFjZSBjb25kaXRpb24gd2hpY2ggaXMgaW50cm9kdWNlZAorCQlpZiBpdCBpcyBuZWNlc3NhcnkgdG8gd2FpdCBmb3IgdGhlIHNlbWFwaG9yZS4KKworU2F0IE5vdiAgNCAxNzoxNDo0NSAxOTk1ICAgIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHR0eV9pby5jICh0dHlfaW5pdCk6IE1vdmUgcmVnaXN0cmF0aW9uIG9mIFRUWV9NQUpPUiBhbmQKKwkJVFRZX0FVWF9NQUpPUiB0byB0aGUgZW5kLCBzbyB0aGF0IC9wcm9jL2RldmljZXMgbG9va3MKKwkJcHJldHRpZXIuIAorCisJKiBwdHkuYyAocHR5X2luaXQpOiBVc2UgbmV3IG1ham9yIG51bWJlcnMgZm9yIFBUWSBtYXN0ZXIgYW5kIHNsYXZlCisJCWRldmljZXMuICBUaGlzIGFsbG93IHVzIHRvIGhhdmUgbW9yZSB0aGFuIDY0IHB0eSdzLiAgV2UKKwkJcmVnaXN0ZXIgdGhlIG9sZCBwdHkgZGV2aWNlcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisJCU5vdGUgdGhhdCBhIHN5c3RlbSBzaG91bGQgZWl0aGVyIGJlIHVzaW5nIHRoZSBvbGQgcHR5CisJCWRldmljZXMgb3IgdGhlIG5ldyBwdHkgZGV2aWNlcyAtLS0gaW4gZ2VuZXJhbCwgaXQgc2hvdWxkCisJCXRyeSB0byB1c2UgYm90aCwgc2luY2UgdGhleSBtYXAgaW50byB0aGUgc2FtZSBwdHkgdGFibGUuCisJCVRoZSBvbGQgcHR5IGRldmljZXMgYXJlIHN0cmljdGx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKworV2VkIE9jdCAxMSAxMjo0NToyNCAxOTk1ICAgIDx0eXRzb0Byc3RzLTExLm1pdC5lZHU+CisKKwkqIHR0eV9pby5jIChkaXNhc3NvY2lhdGVfY3R0eSk6IElmIGRpc2Fzc29jaWF0ZV9jdHR5IGlzIGNhbGxlZCBieQorCQlleGl0LCBwZXJmb3JtIGFuIGltcGxpY2l0IHZoYW5ndXAgb24gdGhlIHR0eS4KKworCSogcHR5LmMgKHB0eV9jbG9zZSk6IFdoZW4gdGhlIG1hc3RlciBwdHkgaXMgY2xvc2VkLCBzZW5kIGEgaGFuZ3VwCisJCXRvIHRoZSBzbGF2ZSBwdHkuCisJCShwdHlfb3Blbik6IFVzZSB0aGUgZmxhZyBUVFlfU0xBVkVfQ0xPU0VEIHRvIHRlc3QgdG8gc2VlCisJCWlmIHRoZXJlIGFyZSBhbnkgb3BlbiBzbGF2ZSBwdHlzLCBpbnN0ZWFkIG9mIHVzaW5nCisJCXR0eS0+bGluay0+Y291bnQuICBUaGUgb2xkIG1ldGhvZCBnb3QgY29uZnVzZWQgaWYgdGhlcmUKKwkJd2VyZSBwcm9jZXNzZXMgdGhhdCBoYWQgaHVuZy11cCBmaWxlIGRlc2NyaXB0b3JzIG9uIHRoZQorCQlzbGF2ZSB0dHkuCisKK1R1ZSBNYXkgIDIgMDA6NTM6MjUgMTk5NSAgICA8dHl0c29AcnN4LTExLm1pdC5lZHU+CisKKwkqIHR0eV9pby5jICh0dHlfc2V0X2xkaXNjKTogV2FpdCB1bnRpbCB0aGUgb3V0cHV0IGJ1ZmZlciBpcworCQlkcmFpbmVkIGJlZm9yZSBjbG9zaW5nIHRoZSBvbGQgbGluZSBkaXNjaXBsaW5lIC0tLSBuZWVkZWQKKwkJaW4gb25seSBvbmUgY2FzZTogWE9OL1hPRkYgcHJvY2Vzc2luZy4KKworCSogbl90dHkuYyAobl90dHlfY2xvc2UpOiBEb24ndCBib3RoZXIgd2FpdGluZyB1bnRpbCB0aGUgb3V0cHV0CisJCWRyaXZlciBpcyBjbG9zZWQ7IGluIGdlbmVyYWwsIHRoZSBsaW5lIGRpc2NpcGxpbmUKKwkJc2hvdWxkbid0IGNhcmUgaWYgdGhlIGhhcmR3YXJlIGlzIGZpbmlzaGVkCisJCXRyYW5zbWl0dGluZyBiZWZvcmUgdGhlIGxpbmUgZGlzY2lwbGluZSB0ZXJtaW5hdGVzLgorCisJKiB0dHlfaW8uYyAocmVsZWFzZV9kZXYpOiBTaHV0ZG93biB0aGUgbGluZSBkaXNjaXBsaW5lIGFmdGVyCisJCWRlY3JlbWVudGluZyB0aGUgdHR5IGNvdW50IHZhcmlhYmxlOyBidXQgc2V0IHRoZQorCQlUVFlfQ0xPU0lORyBmbGFnIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgdHR5IHN0cnVjdHVyZQorCQlpc24ndCBsb25nIGZvciB0aGlzIHdvcmxkLgorCisJKiB0dHlfaW8uYyAoaW5pdF9kZXYpOiBBZGQgc2FuaXR5IGNvZGUgdG8gY2hlY2sgdG8gc2VlIGlmCisJCVRUWV9DTE9TSU5HIGlzIHNldCBvbiBhIHR0eSBzdHJ1Y3R1cmU7IGlmIHNvLCBzb21ldGhpbmcKKwkJYmFkIGhhcyBoYXBwZW5lZCAocHJvYmFibHkgYSBsaW5lIGRpc2NpcGxpbmUgY2xvc2UgYmxvY2tlZAorCQl3aGVuIGl0IHNob3VsZG4ndCBoYXZlOyBzbyBkbyBhIGtlcm5lbCBwcmludGsgYW5kIHRoZW4KKwkJcmV0dXJuIGFuIGVycm9yKS4KKworV2VkIEFwciAyNiAxMDoyMzo0NCAxOTk1ICBUaGVvZG9yZSBZLiBUcydvICA8dHl0c29AbG9jYWxob3N0PgorCisJKiB0dHlfaW8uYyAocmVsZWFzZV9kZXYpOiBUcnkgdG8gc2h1dGRvd24gdGhlIGxpbmUgZGlzY2lwbGluZQorCQkqYmVmb3JlKiBkZWNyZW1lbnRpbmcgdGhlIHR0eSBjb3VudCB2YXJpYWJsZTsgdGhpcyByZW1vdmVzCisJCWEgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIHdoaWNoIG9jY3VycyB3aGVuIHRoZSBsaW5lCisJCWRpc2NpcGxpbmUgY2xvc2UgYmxvY2tzLCBhbmQgYW5vdGhlciBwcm9jZXNzIHRoZW4gdHJpZXMKKwkJb3BlbiB0aGUgc2FtZSBzZXJpYWwgcG9ydC4KKworCSogc2VyaWFsLmMgKHJzX2hhbmd1cCk6IFdoZW4gaGFuZ2luZyB1cCwgZmx1c2ggdGhlIG91dHB1dCBidWZmZXIKKwkJYmVmb3JlIHNodXR0aW5nIGRvd24gdGhlIFVBUlQuICBPdGhlcndpc2UgdGhlIGxpbmUKKwkJZGlzY2lwbGluZSBjbG9zZSBibG9ja3Mgd2FpdGluZyBmb3IgdGhlIGNoYXJhY3RlcnMgdG8gZ2V0CisJCWZsdXNoZWQsIHdoaWNoIG5ldmVyIGhhcHBlbnMgdW50aWwgdGhlIHNlcmlhbCBwb3J0IGdldHMgcmV1c2VkLgorCitXZWQgQXByIDEyIDA4OjA2OjE2IDE5OTUgIFRoZW9kb3JlIFkuIFRzJ28gIDx0eXRzb0Bsb2NhbGhvc3Q+CisKKwkqIHNlcmlhbC5jIChkb19zZXJpYWxfaGFuZ3VwLCBkb19zb2Z0aW50LCBjaGVja19tb2RlbV9zdGF0dXMsCisJCXJzX2luaXQpOiAgSGFuZ3VwcyBhcmUgbm93IHNjaGVkdWxlZCB2aWEgYSBzZXBhcmF0ZSB0cXVldWUKKwkJc3RydWN0dXJlIGluIHRoZSBhc3luY19zdHJ1Y3Qgc3RydWN0dXJlLCB0cXVldWVfaGFuZ3VwLgorCQlUaGlzIHRhc2sgaXMgcHVzaGVkIG9uIHRvIHRoZSB0cV9zY2hlZHVsZSBxdWV1ZSwgc28gdGhhdAorCQlpdCBpcyBwcm9jZXNzZWQgc3luY2hyb25vdXNseSBieSB0aGUgc2NoZWR1bGVyLgorCitTYXQgRmViIDE4IDEyOjEzOjUxIDE5OTUgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogdHR5X2lvLmMgKGRpc2Fzc29jaWF0ZV9jdHR5LCB0dHlfb3BlbiwgdHR5X2lvY3RsKTogQ2xlYXIKKwkJY3VycmVudC0+dHR5X29sZF9wZ3JwIGZpZWxkIHdoZW4gYSBzZXNzaW9uIGxlYWRlcgorCQlhY3F1aXJlcyBhIGNvbnRyb2xsaW5nIHR0eSwgYW5kIGFmdGVyIGEgc2Vzc2lvbiBsZWFkZXIKKwkJaGFzIGRpc2Fzc29jaWF0ZWQgZnJvbSBhIGNvbnRyb2xsaW5nIHR0eS4KKworRnJpIEZlYiAxNyAwOTozNDowOSAxOTk1ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIHNlcmlhbC5jIChyc19pbnRlcnJ1cHRfc2luZ2xlLCByc19pbnRlcnJ1cHQsIHJzX2ludGVycnVwdF9tdWx0aSk6IAorCQlDaGFuZ2UgdGhlIG51bWJlciBvZiBwYXNzZXMgbWFkZSBmcm9tIDY0IHRvIGJlIDI1NiwKKwkJY29uZmlndXJhYmxlIHdpdGggdGhlICNkZWZpbmUgUlNfSVNSX1BBU1NfTElNSVQuCisKKwkqIHNlcmlhbC5jIChyc19pbml0LCBzZXRfc2VyaWFsX2luZm8sIGdldF9zZXJpYWxfaW5mbywgcnNfY2xvc2UpOgorCQlSZW1vdmUgc3VwcG9ydCBmb3IgY2xvc2luZ193YWl0Mi4gIEluc3RlYWQsIHNldAorCQl0dHktPmNsb3NpbmcgYW5kIHJlbHkgb24gdGhlIGxpbmUgZGlzY2lwbGluZSB0byBwcmV2ZW50CisJCWVjaG8gd2Fycy4KKworCSogbl90dHkuYyAobl90dHlfcmVjZWl2ZV9jaGFyKTogIElFWFRFTiBkb2VzIG5vdCBuZWVkIHRvIGJlCisJCWVuYWJsZWQgaW4gb3JkZXIgZm9yIElYQU5ZIHRvIGJlIGFjdGl2ZS4KKworCQlJZiB0dHktPmNsb3NpbmcgaXMgc2V0LCB0aGVuIG9ubHkgcHJvY2VzcyBYT04gYW5kIFhPRkYKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLgorCitTdW4gRmViIDEyIDIzOjU3OjQ4IDE5OTUgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogc2VyaWFsLmMgKHJzX3RpbWVyKTogQ2hhbmdlIHRoZSBpbnRlcnJ1cHQgcG9sbCB0aW1lIGZyb20gNjAKKwkJc2Vjb25kcyB0byAxMCBzZWNvbmRzLCBjb25maWd1cmFibGUgd2l0aCB0aGUgI2RlZmluZQorCQlSU19TVFJPQkVfVElNRS4KKworCSogc2VyaWFsLmMgKHJzX2ludGVycnVwdF9tdWx0aSwgc3RhcnR1cCwgc2h1dGRvd24sIHJzX2lvY3RsLAorCQlzZXRfbXVsdGlwb3J0X3N0cnVjdCwgZ2V0X211bHRpcG9ydF9zdHJ1Y3QpOiBBZGQKKwkJcHJvdmlzaW9ucyBmb3IgYSBuZXcgdHlwZSBvZiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLAorCQl3aGljaCBiZXR0ZXIgc3VwcG9ydHMgbXVsdGlwbGUgc2VyaWFsIHBvcnRzIG9uIGEgc2luZ2xlCisJCUlSUS4gIAorCitTdW4gRmViICA1IDE5OjM1OjExIDE5OTUgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogdHR5X2lvY3RsLmMgKG5fdHR5X2lvY3RsLCBzZXRfdGVybWlvcywgdHR5X3dhaXRfdW50aWxfc2VudCk6IAorCSogc2VyaWFsLmMgKHJzX2lvY3RsLCByc19jbG9zZSk6IAorCSogY3ljbGFkZXMuYyAoY3lfaW9jdGwsIGN5X2Nsb3NlKTogCisJKiBuX3R0eS5jIChuX3R0eV9jbG9zZSk6ICBSZW5hbWUgd2FpdF91bnRpbF9zZW50IHRvCisJCXR0eV93YWl0X3VudGlsX3NlbnQsIHNvIHRoYXQgaXQncyBhIGJldHRlciBuYW1lIHRvIGV4cG9ydAorCQlpbiBrc3ltcy5jLgorCitTYXQgRmViICA0IDIzOjM2OjIwIDE5OTUgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogc2VyaWFsLmMgKHJzX2Nsb3NlKTogQWRkZWQgbWlzc2luZyBjaGVjayBmb3IgY2xvc2luZ193YWl0MiBiZWluZworCQlBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORS4KKworVGh1IEphbiAyNiAwOTowMjo0OSAxOTk1ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIHNlcmlhbC5jIChyc19pbml0LCBzZXRfc2VyaWFsX2luZm8sIGdldF9zZXJpYWxfaW5mbywKKwkJcnNfY2xvc2UpOiBTdXBwb3J0IGNsb3NlX3dhaXQgaW4gdGhlIHNlcmlhbCBkcml2ZXIuCisJCVRoaXMgaXMgaGVscGZ1bCBmb3Igc2xvdyBkZXZpY2VzIChsaWtlIHNlcmlhbAorCQlwbG90dGVycykgc28gdGhhdCB0aGVpciBvdXRwdXRzIGRvbid0IGdldCBmbHVzaGVkIHVwb24KKwkJZGV2aWNlIGNsb3NlLiAgVGhpcyBoYXMgdG8gYmUgY29uZmlndXJhYmxlIGJlY2F1c2UKKwkJbm9ybWFsbHkgd2UgZG9uJ3Qgd2FudCBwb3J0cyB0byBiZSBodW5nIHVwIGZvciBsb25nCisJCXBlcmlvZHMgb2YgdGltZSBkdXJpbmcgYSBjbG9zZSB3aGVuIHRoZXkgYXJlIG5vdAorCQljb25uZWN0ZWQgdG8gYSBkZXZpY2UsIG9yIHRoZSBkZXZpY2UgaXMgcG93ZXJlZCBvZmYuCisKKwkJVGhlIGRlZmF1bHQgaXMgdG8gd2FpdCAzMCBzZWNvbmRzOyBpbiB0aGUgY2FzZSBvZiBhCisJCXZlcnkgc2xvdyBkZXZpY2UsIHRoZSBjbG9zZV93YWl0IHRpbWVvdXQgc2hvdWxkIGJlCisJCWxlbmd0aGVuZWQuICBJZiBpdCBpcyBzZXQgdG8gMCwgdGhlIGtlcm5lbCB3aWxsIHdhaXQKKwkJZm9yZXZlciBmb3IgYWxsIG9mIHRoZSBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkLgorCitUaHUgSmFuIDE3IDAxOjE3OjIwIDE5OTUgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogc2VyaWFsLmMgKHN0YXJ0dXAsIGNoYW5nZV9zcGVlZCwgcnNfaW5pdCk6IEFkZCBzdXBwb3J0IHRvIGRldGVjdAorCQl0aGUgU3RhclRlY2ggMTY2NTAgY2hpcC4gIFRyZWF0IGl0IGFzIGEgMTY0NTAgZm9yIG5vdywKKwkJYmVjYXVzZSBvZiBpdHMgRklGTyBidWdzLgorCitUaHUgSmFuICA1IDIxOjIxOjU3IDE5OTUgIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc2VyaWFsLmM6IChyZWNlaXZlX2NoYXIpOiBBZGRlZCBjb3VudGVyIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcAorCQl3aGVuIGEgUENNQ0lBIHNlcmlhbCBkZXZpY2UgaXMgZWplY3RlZC4KKworVGh1IERlYyAyOSAxNzo1Mzo0OCAxOTk0ICAgIDx0eXRzb0Byc3gtMTEubWl0LmVkdT4KKworCSogdHR5X2lvLmMgKGNoZWNrX3R0eV9jb3VudCk6IE5ldyBwcm9jZWR1cmUgd2hpY2ggY2hlY2tzCisJCXR0eS0+Y291bnQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgbWF0Y2hlcyB3aXRoIHRoZSBudW1iZXIgb2YKKwkJb3BlbiBmaWxlIGRlc2NyaXB0b3JzIHdoaWNoIHBvaW50IGF0IHRoZSBzdHJ1Y3R1cmUuICBJZgorCQl0aGUgbnVtYmVyIGRvZXNuJ3QgbWF0Y2gsIGl0IHByaW50cyBhIHdhcm5pbmcgbWVzc2FnZS4KKworV2VkIERlYyAyOCAxNTo0MTo1MSAxOTk0ICAgIDx0eXRzb0Byc3gtMTEubWl0LmVkdT4KKworCSogdHR5X2lvLmMgKGRvX3R0eV9oYW5ndXAsIGRpc2Fzc29jaWF0ZV9jdHR5KTogQXQgaGFuZ3VwIHRpbWUsCisJCXNhdmUgdGhlIHR0eSdzIGN1cnJlbnQgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwIGluIHRoZQorCQlzZXNzaW9uIGxlYWRlcidzIHRhc2sgc3RydWN0dXJlLiAgV2hlbiB0aGUgc2Vzc2lvbiBsZWFkZXIKKwkJdGVybWluYXRlcywgc2VuZCBhIFNJR0hVUCwgU0lHQ09OVCB0byB0aGF0IHByb2Nlc3MgZ3JvdXAuCisJCVRoaXMgaXMgbm90IHJlcXVpcmVkIGJ5IFBPU0lYLCBidXQgaXQncyBub3QgcHJvaGliaXRlZAorCQllaXRoZXIsIGFuZCBpdCBhcHBlYXJzIHRvIGJlIHRoZSBsZWFzdCBpbnRydXNpdmUgd2F5CisJCXRvIGZpeCBhIHByb2JsZW0gdGhhdCBkaWFsdXAgc2VydmVycyBoYXZlIHdpdGgKKwkJb3JwaGFuZWQgcHJvY2VzcyBncm91cHMgY2F1c2VkIGJ5IG1vZGVtIGhhbmd1cHMuCisKK1RodSBEZWMgIDggMTQ6NTI6MTEgMTk5NCAgICA8dHl0c29AcnN4LTExLm1pdC5lZHU+CisKKwkqIHNlcmlhbC5jIChyc19pb2N0bCk6IERvbid0IGFsbG93IG1vc3QgaW9jdGwncyBpZiB0aGUgc2VyaWFsIHBvcnQKKwkJaXNuJ3QgaW5pdGlhbGl6ZWQuCisKKwkqIHNlcmlhbC5jIChyc19jbG9zZSk6IERvbid0IGNsZWFyIHRoZSBJRVIgaWYgdGhlIHNlcmlhbCBwb3J0CisJCWlzbid0IGluaXRpYWxpemVkLiAKKworCSogc2VyaWFsLmMgKGJsb2NrX3RpbF9yZWFkeSk6IERvbid0IHRyeSB0byBibG9jayBvbiB0aGUgZGlhbGluCisJCXBvcnQgaWYgdGhlIHNlcmlhbCBwb3J0IGlzbid0IGluaXRpYWxpemVkLgorCitXZWQgRGVjICA3IDEwOjQ4OjMwIDE5OTQgIFNpIFBhcmsgKHNpQHdpbXBvbC5kZW1vbi5jby51aykKKwkqIHR0eV9pby5jICh0dHlfcmVnaXN0ZXJfZHJpdmVyKTogRml4IGJ1ZyB3aGVuIGxpbmtpbmcgb250bworCQl0aGUgdHR5X2RyaXZlcnMgbGlzdC4gV2Ugbm93IHRlc3QgdGhhdCB0aGVyZSBhcmUgZWxlbWVudHMKKwkJYWxyZWFkeSBvbiB0aGUgbGlzdCBiZWZvcmUgc2V0dGluZyB0aGUgYmFjayBsaW5rIGZyb20gdGhlCisJCWZpcnN0IGVsZW1lbnQgdG8gdGhlIG5ldyBkcml2ZXIuCisKKwkqIHR0eV9pby5jICh0dHlfdW5yZWdpc3Rlcl9kcml2ZXIpOiBGaXggYnVnIGluIHVubGlua2luZyB0aGUKKwkJc3BlY2lmaWVkIGRyaXZlciBmcm9tIHRoZSB0dHlfZHJpdmVycyBsaXN0LiBXZSB3ZXJlIG5vdAorCQlzZXR0aW5nIHRoZSBiYWNrIGxpbmsgY29ycmVjdGx5LiBUaGlzIHVzZWQgdG8gcmVzdWx0IGluCisJCWEgZGFuZ2xpbmcgYmFjayBsaW5rIHBvaW50ZXIgYW5kIGNhdXNlIHBhbmljcyBvbiB0aGUgbmV4dAorCQljYWxsIHRvIGdldF90dHlfZHJpdmVyKCkuCisKK1R1ZSBOb3YgMjkgMTA6MjE6MDkgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiB0dHlfaW8uYyAodHR5X3VucmVnaXN0ZXJfZHJpdmVyKTogRml4IGJ1ZyBpbgorCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIgd2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIHJlZmNvdW50IGlzCisJCXRlc3RlZCwgaW5zdGVhZCBvZiB0aGUgcmVmY291bnQgaXRzZWxmLiAgVGhpcyBjYXVzZWQKKwkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyIHRvIGFsd2F5cyByZXR1cm4gRUJVU1kuCisKK1NhdCBOb3YgMjYgMTE6NTk6MjQgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiB0dHlfaW8uYyAodHR5X2lvY3RsKTogQWRkIHN1cHBvcnQgZm9yIHRoZSBuZXcgaW9jdGwKKwkJVElPQ1RUWUdTVFJVQ1QsIHdoaWNoIGFsbG93IGEga2VybmVsIGRlYnVnZ2luZyBwcm9ncmFtCisJCWRpcmVjdCByZWFkIGFjY2VzcyB0byB0aGUgdHR5IGFuZCB0dHlfZHJpdmVyIHN0cnVjdHVyZXMuCisKK0ZyaSBOb3YgMjUgMTc6MjY6MjIgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiBzZXJpYWwuYyAocnNfc2V0X3Rlcm1pb3MpOiBEb24ndCB3YWtlIHVwIHByb2Nlc3NlcyBibG9ja2VkIGluCisJCW9wZW4gd2hlbiB0aGUgQ0xPQ0FMIGZsYWcgY2hhbmdlcywgc2luY2UgYSBibG9ja2luZworCQlvcGVuIG9ubHkgc2FtcGxlcyB0aGUgQ0xPQ0FMIGZsYWcgb25jZSB3aGVuIGl0IGJsb2NrcywKKwkJYW5kIGRvZXNuJ3QgY2hlY2sgaXQgYWdhaW4uICAobi5iLiAgRnJlZUJTRCBoYXMgYQorCQlkaWZmZXJlbnQgYmVoYXZpb3IgZm9yIGJsb2NraW5nIG9wZW5zOyBpdCdzIG5vdCBjbGVhcgorCQl3aGV0aGVyIExpbnV4IG9yIEZyZWVCU0QncyBpbnRlcnByZXRhdGlvbiBpcyBjb3JyZWN0LgorCQlQT1NJWCBkb2Vzbid0IGdpdmUgY2xlYXIgZ3VpZGFuY2Ugb24gdGhpcyBpc3N1ZSwgc28KKwkJdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuLi4uKQorCisJKiBzZXJpYWwuYyAoYmxvY2tfdGlsX3JlYWR5KTogVXNlIHRoZSBjb3JyZWN0IHRlcm1pb3Mgc3RydWN0dXJlIHRvCisJCWNoZWNrIHRoZSBDTE9DQUwgZmxhZy4gIElmIHRoZSBjdWFYWCBkZXZpY2UgaXMgYWN0aXZlLAorCQl0aGVuIGNoZWNrIHRoZSBzYXZlZCB0ZXJtaW9zIGZvciB0aGUgdHR5U1hYIGRldmljZS4KKwkJT3RoZXJ3aXNlLCB1c2UgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGVybWlvcyBzdHJ1Y3R1cmUuCisKK1N1biBOb3YgIDYgMjE6MDU6NDQgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiBzZXJpYWwuYyAoY2hhbmdlX3NwZWVkKTogQWRkIHN1cHBvcnQgZm9yIGRpcmVjdCBhY2Nlc3Mgb2YKKwkJNTcsNjAwIGFuZCAxMTUsMjAwIGJwcy4KKworV2VkIE5vdiAgMiAxMDozMjozNiAxOTk0ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIG5fdHR5LmMgKG5fdHR5X3JlY2VpdmVfcm9vbSk6IE9ubHkgYWxsb3cgZXhjZXNzIGNoYXJhY3RlcnMKKwkJdGhyb3VnaCBpZiB3ZSBhcmUgaW4gSUNBTk9OIG1vZGUgKmFuZCogdGhlcmUgYXJlIG90aGVyIG5vCisJCXBlbmRpbmcgbGluZXMgaW4gdGhlIGJ1ZmZlci4gIE90aGVyd2lzZSBjdXQgYW5kIHBhc3RlIG92ZXIKKwkJNGsgYnJlYWtzLgorCitTYXQgT2N0IDI5IDE4OjE3OjM0IDE5OTQgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogc2VyaWFsLmMgKHJzX2lvY3RsLCBnZXRfbHNyX2luZm8pOiBBZGRlZCBwYXRjaCBzdWdnZXN0ZWQgYnkgQXJuZQorCQlSaWliZXIgc28gdGhhdCB1c2VyIG1vZGUgcHJvZ3JhbXMgY2FuIHRlbGwgd2hlbiB0aGUKKwkJdHJhbnNtaXR0ZXIgc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHkuCisKK1RodSBPY3QgMjcgMjM6MTQ6MjkgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiB0dHlfaW9jdGwuYyAod2FpdF91bnRpbF9zZW50KTogQWRkZWQgZGVidWdnaW5nIHByaW50ayBzdGF0ZW1lbnRzCisJCSh1bmRlciB0aGUgI2lmZGVmIFRUWV9ERUJVR19XQUlUX1VOVElMX1NFTlQpICAKKworCSogc2VyaWFsLmMgKHJzX2ludGVycnVwdCwgcnNfaW50ZXJydXB0X3NpbmdsZSwgcmVjZWl2ZV9jaGFycywKKwkJY2hhbmdlX3NwZWVkLCByc19jbG9zZSk6IHJzX2Nsb3NlIG5vdyBkaXNhYmxlcyByZWNlaXZlcgorCQlpbnRlcnJ1cHRzIHdoZW4gY2xvc2luZyB0aGUgc2VyaWFsIHBvcnQuICBUaGlzIGFsbG93cyB0aGUKKwkJc2VyaWFsIHBvcnQgdG8gY2xvc2UgcXVpY2tseSB3aGVuIExpbnV4IGFuZCBhIG1vZGVtIChvciBhCisJCW1vdXNlKSBhcmUgZW5nYWdlZCBpbiBhbiBlY2hvIHdhcjsgd2hlbiBjbG9zaW5nIHRoZSBzZXJpYWwKKwkJcG9ydCwgd2Ugbm93IGZpcnN0IHN0b3AgbGlzdGVuaW5nIHRvIGluY29taW5nIGNoYXJhY3RlcnMsCisJCWFuZCAqdGhlbiogd2FpdCBmb3IgdGhlIHRyYW5zbWl0IGJ1ZmZlciB0byBkcmFpbi4gIAorCisJCUluIG9yZGVyIHRvIG1ha2UgdGhpcyBjaGFuZ2UsIHRoZSBpbmZvLT5yZWFkX3N0YXR1c19tYXNrCisJCWlzIG5vdyB1c2VkIHRvIGNvbnRyb2wgd2hhdCBiaXRzIG9mIHRoZSBsaW5lIHN0YXR1cworCQlyZWdpc3RlciBhcmUgbG9va2VkIGF0IGluIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBpbiBhbGwKKwkJY2FzZXM7IHByZXZpb3VzbHkgaXQgd2FzIG9ubHkgdXNlZCBpbiByZWNlaXZlX2NoYXJzIHRvCisJCXNlbGVjdCBhIGZldyBvZiB0aGUgc3RhdHVzIGJpdHMuCisKK01vbiBPY3QgMjQgMjM6MzY6MjEgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiBzZXJpYWwuYyAocnNfY2xvc2UpOiBBZGQgYSB0aW1lb3V0IHRvIHRoZSB0cmFuc21pdHRlciBmbHVzaAorCQlsb29wOyB0aGlzIGlzIGp1c3QgYSBzYW5pdHkgY2hlY2sgaW4gY2FzZSB3ZSBoYXZlIGZsYWt5CisJCShvciBub24tZXhpc3RlbnQtYnV0LWNvbmZpZ3VyZWQtYnktdGhlLXVzZXIpIGhhcmR3YXJlLgorCitGcmkgT2N0IDIxIDA5OjM3OjIzIDE5OTQgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogdHR5X2lvLmMgKHR0eV9mYXN5bmMpOiBXaGVuIGFzeW5jaHJvbm91cyBJL08gaXMgZW5hYmxlZCwgaWYgdGhlCisJCXByb2Nlc3Mgb3IgcHJvY2VzcyBncm91cCBoYXMgbm90IGJlIHNwZWNpZmllZCB5ZXQsIHNldCBpdAorCQl0byBiZSB0aGUgdHR5J3MgcHJvY2VzcyBncm91cCwgb3IgaWYgdGhhdCBpcyBub3QgeWV0IHNldCwKKwkJdG8gdGhlIGN1cnJlbnQgcHJvY2VzcydzIHBpZC4KKworVGh1IE9jdCAyMCAyMzoxNzoyOCAxOTk0ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIG5fdHR5LmMgKG5fdHR5X3JlY2VpdmVfcm9vbSk6IElmIHdlIGFyZSBkb2luZyBpbnB1dAorCQljYW5vbmljYWxpemF0aW9uLCBsZXQgYXMgbWFueSBjaGFyYWN0ZXJzIHRocm91Z2ggYXMKKwkJcG9zc2libGUsIHNvIHRoYXQgdGhlIGV4Y2VzcyBjaGFyYWN0ZXJzIGNhbiBiZSAiYmVlcGVkIi4KKworVHVlIE9jdCAxOCAxMDowMjo0MyAxOTk0ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIHNlcmlhbC5jIChyc19zdGFydCk6IFJlbW92ZWQgYW4gaW5jb3JyZWN0ICchJyB0aGF0IHdhcworCQlwcmV2ZW50aW5nIHRyYW5zbWl0IGludGVycnVwdHMgZnJvbSBiZWluZyByZS1lbmFibGVkIGluCisJCXJzX3N0YXJ0KCkuICBGb3J0dW5hdGVseSBpbiBtb3N0IGNhc2VzIGl0IHdvdWxkIGJlCisJCXJlLWVuYWJsZWQgZWxzZXdoZXJlLCBidXQgdGhpcyBzdGlsbCBzaG91bGQgYmUgZml4ZWQKKwkJY29ycmVjdGx5LgorCitTdW4gT2N0ICA5IDIzOjQ2OjAzIDE5OTQgIFRoZW9kb3JlIFkuIFRzJ28gICh0eXRzb0BydC0xMSkKKworCSogdHR5X2lvLmMgKGRvX3R0eV9oYW5ndXApOiBJZiB0aGUgdHR5IGRyaXZlciBmbGFncworCQlUVFlfRFJJVkVSX1JFU0VUX1RFUk1JT1MgaXMgc2V0LCB0aGVuIHJlc2V0IHRoZSB0ZXJtaW9zCisJCXNldHRpbmdzIGJhY2sgdG8gdGhlIGRyaXZlcidzIGluaXRpYWwgY29uZmlndXJhdGlvbi4gIFRoaXMKKwkJYWxsb3dzIHRoZSB0ZXJtaW9zIHNldHRpbmdzIHRvIGJlIHJlc2V0IGV2ZW4gaWYgYSBwcm9jZXNzCisJCWhhcyBodW5nIHVwIGZpbGUgZGVzY3JpcHRvcnMga2VlcGluZyBhIHB0eSdzIHRlcm1pb3MgZnJvbQorCQliZWluZyBmcmVlZCBhbmQgcmVzZXQuCisKKwkqIHR0eV9pby5jIChyZWxlYXNlX2Rldik6IEZpeCBtZW1vcnkgbGVhay4gIFRoZSBwdHkncyBvdGhlcgorCQl0ZXJtaW9zIHN0cnVjdHVyZSBzaG91bGQgYWxzbyBiZSBmcmVlZC4KKworCSogc2VyaWFsLmMgKHJzX2Nsb3NlLCBzaHV0ZG93bik6IENoYW5nZSBob3cgd2Ugd2FpdCBmb3IgdGhlCisJCXRyYW5zbWl0dGVyIHRvIGNvbXBsZXRlbHkgZHJhaW4gYmVmb3JlIHNodXR0aW5nIGRvd24gdGhlCisJCXNlcmlhbCBwb3J0LiAgV2Ugbm93IGRvIGl0IGJ5IHNjaGVkdWxpbmcgaW4gYW5vdGhlcgorCQlwcm9jZXNzIGluc3RlYWQgb2YgYnVzeSBsb29waW5nIHdpdGggdGhlIGludGVycnVwdHMgdHVybmVkCisJCW9uLiAgVGhpcyBtYXkgZWxpbWluYXRlIHNvbWUgcmFjZSBjb25kaXRpb24gcHJvYmxlbXMgdGhhdAorCQlzb21lIHBlb3BsZSBzZWVtIHRvIGJlIHJlcG9ydGluZy4KKworU3VuIFNlcCAyNSAxNDoxODoxNCAxOTk0ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIHR0eV9pby5jIChyZWxlYXNlX2Rldik6IFdoZW4gZnJlZWluZyBhIHR0eSBtYWtlIHN1cmUgdGhhdCBib3RoCisJCXRoZSB0dHkgYW5kIHRoZSBvX3R0eSAoaWYgcHJlc2VudCkgYXJlbid0IGEgcHJvY2VzcydzCisJCWNvbnRyb2xsaW5nIHR0eS4gIChQcmV2aW91c2x5LCB3ZSBvbmx5IGNoZWNrZWQgdGhlIHR0eS4pCisKKwkqIHNlcmlhbC5jIChjaGFuZ2Vfc3BlZWQpOiBPbmx5IGVuYWJsZSB0aGUgTW9kZW0gU3RhdHVzCisJCUludGVycnVwdCBmb3IgYSBwb3J0IGlmIENMT0NBTCBpcyBub3Qgc2V0IG9yIENSVFNDVFMKKwkJaXMgc2V0LiAgSWYgd2UncmUgbm90IGNoZWNraW5nIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQKKwkJQ1RTIGxpbmUsIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gZW5hYmxpbmcgdGhlIG1vZGVtCisJCXN0YXR1cyBpbnRlcnJ1cHQuICBUaGlzIHdpbGwgc2F2ZSBzcHVyaW91cyBpbnRlcnJ1cHRzCisJCWZyb20gc2xvd2luZyBkb3duIHN5c3RlbXMgd2hvIGhhdmUgdGVybWluYWxzIHRoYXQKKwkJZG9uJ3Qgc3VwcG9ydCBlaXRoZXIgbGluZS4gIChPZiBjb3Vyc2UsIGlmIHlvdSB3YW50CisJCW9ubHkgb25lIG9mIENEIGFuZCBDVFMgc3VwcG9ydCwgeW91IHdpbGwgbmVlZCBhCisJCXByb3Blcmx5IHdpcmVkIHNlcmlhbCBjYWJsZS4pCisKK1RodSBTZXAgMjIgMDg6MzI6NDggMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiB0dHlfaW8uYyAoZG9fU0FLKTogUmV0dXJuIGlmIHR0eSBpcyBudWxsLgorCisJKiB0dHlfaW8uYyAoX3R0eV9uYW1lKTogUmV0dXJuICJOVUxMIHR0eSIgaWYgdGhlIHBhc3NlZCBpbiB0dHkgaXMKKwkJTlVMTC4KKworU2F0IFNlcCAxNyAxMzoxOToyNSAxOTk0ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIHR0eV9pb2N0bC5jIChuX3R0eV9pb2N0bCk6IEZpeCBUSU9DR0xDS1RSTUlPUyBhbmQKKwkJVElPQ1NMQ0tUUk1JT1MsIHdoaWNoIHdlcmUgdG90YWxseSBicm9rZW4uICBSZW1vdmUKKwkJZXh0cmEgaW5kaXJlY3Rpb24gZnJvbSBhcmd1bWVudDsgaXQgc2hvdWxkIGJlIGEgc3RydWN0CisJCXRlcm1pb3MgKiwgbm90IGEgc3RydWN0IHRlcm1pb3MgKiouCisJCSZyZWFsX3R0eS0+dGVybWlvc19sb2NrZWQgc2hvdWxkIGhhdmUgYmVlbgorCQlyZWFsX3R0eS0+dGVybWlvc19sb2NrZWQuICBUaGlzIGNhdXNlZCB1cyB0byBiZQorCQlyZWFkaW5nIGFuZCB3cml0aW5nIHRoZSB0ZXJtaW9zX2xvY2tlZCBzdHJ1Y3R1cmUgdG8KKwkJcmFuZG9tIHBsYWNlcyBpbiBrZXJuZWwgbWVtb3J5LiAgCisKKwkqIHR0eV9pby5jIChyZWxlYXNlX2Rldik6IE9vcHMhICBGb3Jnb3QgdG8gZGVsZXRlIGEgY3JpdGljYWwga2ZyZWUKKwkJb2YgdGhlIGxvY2tlZF90ZXJtaW9zLiAgVGhpcyBsZWF2ZXMgdGhlIGxvY2tlZF90ZXJtaW9zCisJCXN0cnVjdHVyZSBwb2ludGVkIGF0IGEgZnJlZWQgb2JqZWN0LiAgCisKK0ZyaSBTZXAgMTYgMDg6MTM6MjUgMTk5NCAgVGhlb2RvcmUgWS4gVHMnbyAgKHR5dHNvQHJ0LTExKQorCisJKiB0dHlfaW8uYyAodHR5X29wZW4pOiBEb24ndCBjaGVjayBmb3IgYW4gZXhjbHVzaXZlIG9wZW4gdW50aWwKKwkJYWZ0ZXIgdGhlIGRldmljZSBzcGVjaWZpYyBvcGVuIHJvdXRpbmUgaGFzIGJlZW4gY2FsbGVkLgorCQlPdGhlcndpc2UsIHRoZSBzZXJpYWwgZGV2aWNlIHJlZiBjb3VudGluZyB3aWxsIGJlIHNjcmV3ZWQKKwkJdXAuCisKKwkqIHNlcmlhbC5jIChyc19vcGVuLCBibG9ja190aWxfcmVhZHkpOiBEb24ndCBzZXQgdGVybWlvcyBzdHJ1Y3R1cmUKKwkJdW50aWwgYWZ0ZXIgYmxvY2tfdGlsX3JlYWR5IGhhcyByZXR1cm5lZCBzdWNjZXNzZnVsbHkuCisJCU1vZGlmeSBibG9ja190aWxfcmVhZHkgdG8gY2hlY2sgdGhlIG5vcm1hbF90ZXJtaW9zCisJCXN0cnVjdHVyZSBkaXJlY3RseSwgc28gaXQgZG9lc24ndCByZWx5IG9uIHRlcm1pb3MgYmVpbmcKKwkJc2V0IGJlZm9yZSBpdCdzIGNhbGxlZC4KKworVGh1IFNlcCAxNSAyMzozNDowMSAxOTk0ICBUaGVvZG9yZSBZLiBUcydvICAodHl0c29AcnQtMTEpCisKKwkqIHNlcmlhbC5jIChyc19jbG9zZSk6IFR1cm4gb2ZmIGludGVycnVwdHMgZHVyaW5nIHJzX2Nsb3NlKCkgdG8KKwkJcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGhhbmd1cCBjb2RlICh3aGljaAorCQlydW5zIGR1cmluZyBhIHNvZnR3YXJlIGludGVycnVwdCkuCisKKwkqIHR0eV9pby5jIChyZWxlYXNlX2Rldik6IERvbid0IGZyZWUgdGhlIGxvY2tlZF90ZXJtaW9zIHN0cnVjdHVyZTsKKwkJaXRzIHN0YXRlIG11c3QgYmUgcmV0YWluZWQgYWNyb3NzIGRldmljZSBvcGVucy4KKworCisJKiB0dHlfaW8uYyAodHR5X3VucmVnaXN0ZXJfZHJpdmVyKTogQWRkZWQgZnVuY3Rpb24gdG8gdW5yZWdpc3RlciBhCisJCXR0eSBkcml2ZXIuICAoRm9yIGxvYWRhYmxlIGRldmljZSBkcml2ZXJzLikKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NmExMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwpAQCAtMCwwICsxLDk4OCBAQAorIworIyBDaGFyYWN0ZXIgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiQ2hhcmFjdGVyIGRldmljZXMiCisKK2NvbmZpZyBWVAorCWJvb2wgIlZpcnR1YWwgdGVybWluYWwiIGlmIEVNQkVEREVECisJc2VsZWN0IElOUFVUCisJZGVmYXVsdCB5IGlmICFWSU9DT05TCisJLS0taGVscC0tLQorCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0ZXJtaW5hbCBkZXZpY2VzIHdpdGgKKwkgIGRpc3BsYXkgYW5kIGtleWJvYXJkIGRldmljZXMuIFRoZXNlIGFyZSBjYWxsZWQgInZpcnR1YWwiIGJlY2F1c2UgeW91CisJICBjYW4gcnVuIHNldmVyYWwgdmlydHVhbCB0ZXJtaW5hbHMgKGFsc28gY2FsbGVkIHZpcnR1YWwgY29uc29sZXMpIG9uCisJICBvbmUgcGh5c2ljYWwgdGVybWluYWwuIFRoaXMgaXMgcmF0aGVyIHVzZWZ1bCwgZm9yIGV4YW1wbGUgb25lCisJICB2aXJ0dWFsIHRlcm1pbmFsIGNhbiBjb2xsZWN0IHN5c3RlbSBtZXNzYWdlcyBhbmQgd2FybmluZ3MsIGFub3RoZXIKKwkgIG9uZSBjYW4gYmUgdXNlZCBmb3IgYSB0ZXh0LW1vZGUgdXNlciBzZXNzaW9uLCBhbmQgYSB0aGlyZCBjb3VsZCBydW4KKwkgIGFuIFggc2Vzc2lvbiwgYWxsIGluIHBhcmFsbGVsLiBTd2l0Y2hpbmcgYmV0d2VlbiB2aXJ0dWFsIHRlcm1pbmFscworCSAgaXMgZG9uZSB3aXRoIGNlcnRhaW4ga2V5IGNvbWJpbmF0aW9ucywgdXN1YWxseSBBbHQtPGZ1bmN0aW9uIGtleT4uCisKKwkgIFRoZSBzZXR0ZXJtIGNvbW1hbmQgKCJtYW4gc2V0dGVybSIpIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUKKwkgIHByb3BlcnRpZXMgKHN1Y2ggYXMgY29sb3JzIG9yIGJlZXBpbmcpIG9mIGEgdmlydHVhbCB0ZXJtaW5hbC4gVGhlCisJICBtYW4gcGFnZSBjb25zb2xlX2NvZGVzKDQpICgibWFuIGNvbnNvbGVfY29kZXMiKSBjb250YWlucyB0aGUgc3BlY2lhbAorCSAgY2hhcmFjdGVyIHNlcXVlbmNlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aG9zZSBwcm9wZXJ0aWVzCisJICBkaXJlY3RseS4gVGhlIGZvbnRzIHVzZWQgb24gdmlydHVhbCB0ZXJtaW5hbHMgY2FuIGJlIGNoYW5nZWQgd2l0aAorCSAgdGhlIHNldGZvbnQgKCJtYW4gc2V0Zm9udCIpIGNvbW1hbmQgYW5kIHRoZSBrZXkgYmluZGluZ3MgYXJlIGRlZmluZWQKKwkgIHdpdGggdGhlIGxvYWRrZXlzICgibWFuIGxvYWRrZXlzIikgY29tbWFuZC4KKworCSAgWW91IG5lZWQgYXQgbGVhc3Qgb25lIHZpcnR1YWwgdGVybWluYWwgZGV2aWNlIGluIG9yZGVyIHRvIG1ha2UgdXNlCisJICBvZiB5b3VyIGtleWJvYXJkIGFuZCBtb25pdG9yLiBUaGVyZWZvcmUsIG9ubHkgcGVvcGxlIGNvbmZpZ3VyaW5nIGFuCisJICBlbWJlZGRlZCBzeXN0ZW0gd291bGQgd2FudCB0byBzYXkgTiBoZXJlIGluIG9yZGVyIHRvIHNhdmUgc29tZQorCSAgbWVtb3J5OyB0aGUgb25seSB3YXkgdG8gbG9nIGludG8gc3VjaCBhIHN5c3RlbSBpcyB0aGVuIHZpYSBhIHNlcmlhbAorCSAgb3IgbmV0d29yayBjb25uZWN0aW9uLgorCisJICBJZiB1bnN1cmUsIHNheSBZLCBvciBlbHNlIHlvdSB3b24ndCBiZSBhYmxlIHRvIGRvIG11Y2ggd2l0aCB5b3VyIG5ldworCSAgc2hpbnkgTGludXggc3lzdGVtIDotKQorCitjb25maWcgVlRfQ09OU09MRQorCWJvb2wgIlN1cHBvcnQgZm9yIGNvbnNvbGUgb24gdmlydHVhbCB0ZXJtaW5hbCIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIFZUCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhlIHN5c3RlbSBjb25zb2xlIGlzIHRoZSBkZXZpY2Ugd2hpY2ggcmVjZWl2ZXMgYWxsIGtlcm5lbCBtZXNzYWdlcworCSAgYW5kIHdhcm5pbmdzIGFuZCB3aGljaCBhbGxvd3MgbG9naW5zIGluIHNpbmdsZSB1c2VyIG1vZGUuIElmIHlvdQorCSAgYW5zd2VyIFkgaGVyZSwgYSB2aXJ0dWFsIHRlcm1pbmFsICh0aGUgZGV2aWNlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aAorCSAgYSBwaHlzaWNhbCB0ZXJtaW5hbCkgY2FuIGJlIHVzZWQgYXMgc3lzdGVtIGNvbnNvbGUuIFRoaXMgaXMgdGhlIG1vc3QKKwkgIGNvbW1vbiBtb2RlIG9mIG9wZXJhdGlvbnMsIHNvIHlvdSBzaG91bGQgc2F5IFkgaGVyZSB1bmxlc3MgeW91IHdhbnQKKwkgIHRoZSBrZXJuZWwgbWVzc2FnZXMgYmUgb3V0cHV0IG9ubHkgdG8gYSBzZXJpYWwgcG9ydCAoaW4gd2hpY2ggY2FzZQorCSAgeW91IHNob3VsZCBzYXkgWSB0byAiQ29uc29sZSBvbiBzZXJpYWwgcG9ydCIsIGJlbG93KS4KKworCSAgSWYgeW91IGRvIHNheSBZIGhlcmUsIGJ5IGRlZmF1bHQgdGhlIGN1cnJlbnRseSB2aXNpYmxlIHZpcnR1YWwKKwkgIHRlcm1pbmFsICgvZGV2L3R0eTApIHdpbGwgYmUgdXNlZCBhcyBzeXN0ZW0gY29uc29sZS4gWW91IGNhbiBjaGFuZ2UKKwkgIHRoYXQgd2l0aCBhIGtlcm5lbCBjb21tYW5kIGxpbmUgb3B0aW9uIHN1Y2ggYXMgImNvbnNvbGU9dHR5MyIgd2hpY2gKKwkgIHdvdWxkIHVzZSB0aGUgdGhpcmQgdmlydHVhbCB0ZXJtaW5hbCBhcyBzeXN0ZW0gY29uc29sZS4gKFRyeSAibWFuCisJICBib290cGFyYW0iIG9yIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIGJvb3QgbG9hZGVyIChsaWxvIG9yCisJICBsb2FkbGluKSBhYm91dCBob3cgdG8gcGFzcyBvcHRpb25zIHRvIHRoZSBrZXJuZWwgYXQgYm9vdCB0aW1lLikKKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIEhXX0NPTlNPTEUKKwlib29sCisJZGVwZW5kcyBvbiBWVCAmJiAhUzM5MCAmJiAhVU1MCisJZGVmYXVsdCB5CisKK2NvbmZpZyBTRVJJQUxfTk9OU1RBTkRBUkQKKwlib29sICJOb24tc3RhbmRhcmQgc2VyaWFsIHBvcnQgc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFueSBub24tc3RhbmRhcmQgc2VyaWFsIGJvYXJkcyAtLSBib2FyZHMKKwkgIHdoaWNoIGFyZW4ndCBzdXBwb3J0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkICJkdW1iIiBzZXJpYWwgZHJpdmVyLgorCSAgVGhpcyBpbmNsdWRlcyBpbnRlbGxpZ2VudCBzZXJpYWwgYm9hcmRzIHN1Y2ggYXMgQ3ljbGFkZXMsCisJICBEaWdpYm9hcmRzLCBldGMuIFRoZXNlIGFyZSB1c3VhbGx5IHVzZWQgZm9yIHN5c3RlbXMgdGhhdCBuZWVkIG1hbnkKKwkgIHNlcmlhbCBwb3J0cyBiZWNhdXNlIHRoZXkgc2VydmUgbWFueSB0ZXJtaW5hbHMgb3IgZGlhbC1pbgorCSAgY29ubmVjdGlvbnMuCisKKwkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBub24tc3RhbmRhcmQgc2VyaWFsIGJvYXJkcy4KKworCSAgTW9zdCBwZW9wbGUgY2FuIHNheSBOIGhlcmUuCisKK2NvbmZpZyBDT01QVVRPTkUKKwl0cmlzdGF0ZSAiQ29tcHV0b25lIEludGVsbGlQb3J0IFBsdXMgc2VyaWFsIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgQlJPS0VOX09OX1NNUAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBlbnRpcmUgZmFtaWx5IG9mIEludGVsbGlwb3J0IElJL1BsdXMKKwkgIGNvbnRyb2xsZXJzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgTWljcm9DaGFubmVsIGNvbnRyb2xsZXJzIGFuZAorCSAgcHJvZHVjdHMgcHJldmlvdXMgdG8gdGhlIEludGVsbGlwb3J0IElJLiBUaGVzZSBhcmUgbXVsdGlwb3J0IGNhcmRzLAorCSAgd2hpY2ggZ2l2ZSB5b3UgbWFueSBzZXJpYWwgcG9ydHMuIFlvdSB3b3VsZCBuZWVkIHNvbWV0aGluZyBsaWtlIHRoaXMKKwkgIHRvIGNvbm5lY3QgbW9yZSB0aGFuIHR3byBtb2RlbXMgdG8geW91ciBMaW51eCBib3gsIGZvciBpbnN0YW5jZSBpbgorCSAgb3JkZXIgdG8gYmVjb21lIGEgZGlhbC1pbiBzZXJ2ZXIuIElmIHlvdSBoYXZlIGEgY2FyZCBsaWtlIHRoYXQsIHNheQorCSAgWSBoZXJlIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vY29tcHV0b25lLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgbW9kdWxlcywgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGVzIHdpbGwgYmUgY2FsbGVkIGlwMiBhbmQgaXAybWFpbi4KKworY29uZmlnIFJPQ0tFVFBPUlQKKwl0cmlzdGF0ZSAiQ29tdHJvbCBSb2NrZXRQb3J0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBDb210cm9sIFJvY2tldFBvcnQgYW5kIFJvY2tldE1vZGVtIFBDSSBib2FyZHMuICAgCisgICAgICAgICAgVGhlc2UgYm9hcmRzIHByb3ZpZGUgMiwgNCwgOCwgMTYsIG9yIDMyIGhpZ2gtc3BlZWQgc2VyaWFsIHBvcnRzIG9yCisgICAgICAgICAgbW9kZW1zLiAgRm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBSb2NrZXRQb3J0L1JvY2tldE1vZGVtICBib2FyZHMKKyAgICAgICAgICBhbmQgdGhpcyBkcml2ZXIgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3JvY2tldC50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByb2NrZXQuCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgaW50byB0aGUga2VybmVsLCBzYXkgWSBoZXJlLiAgSWYKKyAgICAgICAgICB5b3UgZG9uJ3QgaGF2ZSBhIENvbXRyb2wgUm9ja2V0UG9ydC9Sb2NrZXRNb2RlbSBjYXJkIGluc3RhbGxlZCwgc2F5IE4uCisKK2NvbmZpZyBDWUNMQURFUworCXRyaXN0YXRlICJDeWNsYWRlcyBhc3luYyBtdXggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIEN5Y2xhZGVzIFogYW5kIFkgbXVsdGlzZXJpYWwgYm9hcmRzLgorCSAgWW91IHdvdWxkIG5lZWQgc29tZXRoaW5nIGxpa2UgdGhpcyB0byBjb25uZWN0IG1vcmUgdGhhbiB0d28gbW9kZW1zIHRvCisJICB5b3VyIExpbnV4IGJveCwgZm9yIGluc3RhbmNlIGluIG9yZGVyIHRvIGJlY29tZSBhIGRpYWwtaW4gc2VydmVyLgorCisJICBGb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEN5Y2xhZGVzLVogY2FyZCwgcmVhZAorCSAgPGZpbGU6ZHJpdmVycy9jaGFyL1JFQURNRS5jeWNsYWRlc1o+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjeWNsYWRlcy4KKworCSAgSWYgeW91IGhhdmVuJ3QgaGVhcmQgYWJvdXQgaXQsIGl0J3Mgc2FmZSB0byBzYXkgTi4KKworY29uZmlnIENZWl9JTlRSCisJYm9vbCAiQ3ljbGFkZXMtWiBpbnRlcnJ1cHQgbW9kZSBvcGVyYXRpb24gKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgQ1lDTEFERVMKKwloZWxwCisJICBUaGUgQ3ljbGFkZXMtWiBmYW1pbHkgb2YgbXVsdGlwb3J0IGNhcmRzIGFsbG93cyAyICh0d28pIGRyaXZlciBvcAorCSAgbW9kZXM6IHBvbGxpbmcgYW5kIGludGVycnVwdC4gSW4gcG9sbGluZyBtb2RlLCB0aGUgZHJpdmVyIHdpbGwgY2hlY2sKKwkgIHRoZSBzdGF0dXMgb2YgdGhlIEN5Y2xhZGVzLVogcG9ydHMgZXZlcnkgY2VydGFpbiBhbW91bnQgb2YgdGltZQorCSAgKHdoaWNoIGlzIGNhbGxlZCBwb2xsaW5nIGN5Y2xlIGFuZCBpcyBjb25maWd1cmFibGUpLiBJbiBpbnRlcnJ1cHQKKwkgIG1vZGUsIGl0IHdpbGwgdXNlIGFuIGludGVycnVwdCBsaW5lIChJUlEpIGluIG9yZGVyIHRvIGNoZWNrIHRoZQorCSAgc3RhdHVzIG9mIHRoZSBDeWNsYWRlcy1aIHBvcnRzLiBUaGUgZGVmYXVsdCBvcCBtb2RlIGlzIHBvbGxpbmcuIElmCisJICB1bnN1cmUsIHNheSBOLgorCitjb25maWcgRElHSUVQQ0EKKwl0cmlzdGF0ZSAiRGlnaWJvYXJkIEludGVsbGlnZW50IEFzeW5jIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgQlJPS0VOX09OX1NNUAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIERpZ2kgSW50ZXJuYXRpb25hbCdzIFh4LCBYZXZlLCBhbmQgWGVtIHNlcmllcworCSAgb2YgY2FyZHMgd2hpY2ggcHJvdmlkZSBtdWx0aXBsZSBzZXJpYWwgcG9ydHMuIFlvdSB3b3VsZCBuZWVkCisJICBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIGNvbm5lY3QgbW9yZSB0aGFuIHR3byBtb2RlbXMgdG8geW91ciBMaW51eAorCSAgYm94LCBmb3IgaW5zdGFuY2UgaW4gb3JkZXIgdG8gYmVjb21lIGEgZGlhbC1pbiBzZXJ2ZXIuIFRoaXMgZHJpdmVyCisJICBzdXBwb3J0cyB0aGUgb3JpZ2luYWwgUEMgKElTQSkgYm9hcmRzIGFzIHdlbGwgYXMgUENJLCBhbmQgRUlTQS4gSWYKKwkgIHlvdSBoYXZlIGEgY2FyZCBsaWtlIHRoaXMsIHNheSBZIGhlcmUgYW5kIHJlYWQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZGlnaWVwY2EudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXBjYS4KKworY29uZmlnIEVTUFNFUklBTAorCXRyaXN0YXRlICJIYXllcyBFU1Agc2VyaWFsIHBvcnQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBJU0EgJiYgQlJPS0VOX09OX1NNUAorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgd2hpY2ggc3VwcG9ydHMgSGF5ZXMgRVNQIHNlcmlhbCBwb3J0cy4gIEJvdGggc2luZ2xlCisJICBwb3J0IGNhcmRzIGFuZCBtdWx0aXBvcnQgY2FyZHMgYXJlIHN1cHBvcnRlZC4gIE1ha2Ugc3VyZSB0byByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2hheWVzLWVzcC50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBlc3AuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBNT1hBX0lOVEVMTElPCisJdHJpc3RhdGUgIk1veGEgSW50ZWxsaW8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBCUk9LRU5fT05fU01QCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIE1veGEgSW50ZWxsaW8gbXVsdGlwb3J0IHNlcmlhbCBjYXJkLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtb3hhLgorCitjb25maWcgTU9YQV9TTUFSVElPCisJdHJpc3RhdGUgIk1veGEgU21hcnRJTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJECisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIE1veGEgU21hcnRJTyBtdWx0aXBvcnQgc2VyaWFsIGNhcmQuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBteHNlci4gSWYgeW91IHdhbnQgdG8gZG8gdGhhdCwgc2F5IE0KKwkgIGhlcmUuCisKK2NvbmZpZyBJU0kKKwl0cmlzdGF0ZSAiTXVsdGktVGVjaCBtdWx0aXBvcnQgY2FyZCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJECisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIE11bHRpLVRlY2ggY2FyZHMgd2hpY2ggcHJvdmlkZSBzZXZlcmFsCisJICBzZXJpYWwgcG9ydHMuICBUaGUgZHJpdmVyIGlzIGV4cGVyaW1lbnRhbCBhbmQgY2FuIGN1cnJlbnRseSBvbmx5IGJlCisJICBidWlsdCBhcyBhIG1vZHVsZS4gVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpc2ljb20uCisJICBJZiB5b3Ugd2FudCB0byBkbyB0aGF0LCBjaG9vc2UgTSBoZXJlLgorCitjb25maWcgU1lOQ0xJTksKKwl0cmlzdGF0ZSAiTWljcm9nYXRlIFN5bmNMaW5rIGNhcmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBQQ0kKKwloZWxwCisJICBQcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgU3luY0xpbmsgSVNBIGFuZCBQQ0kgbXVsdGlwcm90b2NvbCBzZXJpYWwKKwkgIGFkYXB0ZXJzLiBUaGVzZSBhZGFwdGVycyBzdXBwb3J0IGFzeW5jaHJvbm91cyBhbmQgSERMQyBiaXQKKwkgIHN5bmNocm9ub3VzIGNvbW11bmljYXRpb24gdXAgdG8gMTBNYnBzIChQQ0kgYWRhcHRlcikuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBvbmx5IGJlIGJ1aWx0IGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzeW5jbGluay4gIElmIHlvdSB3YW50IHRvIGRvIHRoYXQsIHNheSBNCisJICBoZXJlLgorCitjb25maWcgU1lOQ0xJTktNUAorCXRyaXN0YXRlICJTeW5jTGluayBNdWx0aXBvcnQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgU3luY0xpbmsgTXVsdGlwb3J0ICgyIG9yIDQgcG9ydHMpCisJICBzZXJpYWwgYWRhcHRlciwgcnVubmluZyBhc3luY2hyb25vdXMgYW5kIEhETEMgY29tbXVuaWNhdGlvbnMgdXAKKwkgIHRvIDIuMDQ4TWJwcy4gRWFjaCBwb3J0cyBpcyBpbmRlcGVuZGVudGx5IHNlbGVjdGFibGUgZm9yCisJICBSUy0yMzIsIFYuMzUsIFJTLTQ0OSwgUlMtNTMwLCBhbmQgWC4yMQorCisJICBUaGlzIGRyaXZlciBtYXkgYmUgYnVpbHQgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlCisJICBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCkuCisJICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHN5bmNsaW5rbXAuICBJZiB5b3Ugd2FudCB0byBkbyB0aGF0LCBzYXkgTQorCSAgaGVyZS4KKworY29uZmlnIE5fSERMQworCXRyaXN0YXRlICJIRExDIGxpbmUgZGlzY2lwbGluZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJECisJaGVscAorCSAgQWxsb3dzIHN5bmNocm9ub3VzIEhETEMgY29tbXVuaWNhdGlvbnMgd2l0aCB0dHkgZGV2aWNlIGRyaXZlcnMgdGhhdAorCSAgc3VwcG9ydCBzeW5jaHJvbm91cyBIRExDIHN1Y2ggYXMgdGhlIE1pY3JvZ2F0ZSBTeW5jTGluayBhZGFwdGVyLgorCisJICBUaGlzIGRyaXZlciBjYW4gb25seSBiZSBidWlsdCBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKKwkgIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4KKwkgIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbl9oZGxjLiBJZiB5b3Ugd2FudCB0byBkbyB0aGF0LCBzYXkgTQorCSAgaGVyZS4KKworY29uZmlnIFJJU0NPTTgKKwl0cmlzdGF0ZSAiU0RMIFJJU0NvbS84IGNhcmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBCUk9LRU5fT05fU01QCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNETCBDb21tdW5pY2F0aW9ucyBSSVNDb20vOCBtdWx0aXBvcnQgY2FyZCwKKwkgIHdoaWNoIGdpdmVzIHlvdSBtYW55IHNlcmlhbCBwb3J0cy4gWW91IHdvdWxkIG5lZWQgc29tZXRoaW5nIGxpa2UKKwkgIHRoaXMgdG8gY29ubmVjdCBtb3JlIHRoYW4gdHdvIG1vZGVtcyB0byB5b3VyIExpbnV4IGJveCwgZm9yIGluc3RhbmNlCisJICBpbiBvcmRlciB0byBiZWNvbWUgYSBkaWFsLWluIHNlcnZlci4gSWYgeW91IGhhdmUgYSBjYXJkIGxpa2UgdGhhdCwKKwkgIHNheSBZIGhlcmUgYW5kIHJlYWQgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9yaXNjb204LnR4dD4uCisKKwkgIEFsc28gaXQncyBwb3NzaWJsZSB0byBzYXkgTSBoZXJlIGFuZCBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGtlcm5lbAorCSAgbG9hZGFibGUgbW9kdWxlOyB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJpc2NvbTguCisKK2NvbmZpZyBTUEVDSUFMSVgKKwl0cmlzdGF0ZSAiU3BlY2lhbGl4IElPOCsgY2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJECisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNwZWNpYWxpeCBJTzgrIG11bHRpcG9ydCBjYXJkIChib3RoIHRoZQorCSAgSVNBIGFuZCB0aGUgUENJIHZlcnNpb24pIHdoaWNoIGdpdmVzIHlvdSBtYW55IHNlcmlhbCBwb3J0cy4gWW91CisJICB3b3VsZCBuZWVkIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gY29ubmVjdCBtb3JlIHRoYW4gdHdvIG1vZGVtcyB0bworCSAgeW91ciBMaW51eCBib3gsIGZvciBpbnN0YW5jZSBpbiBvcmRlciB0byBiZWNvbWUgYSBkaWFsLWluIHNlcnZlci4KKworCSAgSWYgeW91IGhhdmUgYSBjYXJkIGxpa2UgdGhhdCwgc2F5IFkgaGVyZSBhbmQgcmVhZCB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zcGVjaWFsaXgudHh0Pi4gQWxzbyBpdCdzIHBvc3NpYmxlIHRvIHNheSBNIGhlcmUKKwkgIGFuZCBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGtlcm5lbCBsb2FkYWJsZSBtb2R1bGUgd2hpY2ggd2lsbCBiZQorCSAgY2FsbGVkIHNwZWNpYWxpeC4KKworY29uZmlnIFNQRUNJQUxJWF9SVFNDVFMKKwlib29sICJTcGVjaWFsaXggRFRSL1JUUyBwaW4gaXMgUlRTIgorCWRlcGVuZHMgb24gU1BFQ0lBTElYCisJaGVscAorCSAgVGhlIFNwZWNpYWxpeCBJTzgrIGNhcmQgY2FuIG9ubHkgc3VwcG9ydCBlaXRoZXIgUlRTIG9yIERUUi4gSWYgeW91CisJICBzYXkgTiBoZXJlLCB0aGUgZHJpdmVyIHdpbGwgdXNlIHRoZSBwaW4gYXMgIkRUUiIgd2hlbiB0aGUgdHR5IGlzIGluCisJICBzb2Z0d2FyZSBoYW5kc2hha2UgbW9kZS4gIElmIHlvdSBzYXkgWSBoZXJlIG9yIGhhcmR3YXJlIGhhbmRzaGFrZSBpcworCSAgb24sIGl0IHdpbGwgYWx3YXlzIGJlIFJUUy4gIFJlYWQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc3BlY2lhbGl4LnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK2NvbmZpZyBTWAorCXRyaXN0YXRlICJTcGVjaWFsaXggU1ggKGFuZCBTSSkgY2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJECisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNYIGFuZCBTSSBtdWx0aXBvcnQgc2VyaWFsIGNhcmRzLgorCSAgUGxlYXNlIHJlYWQgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zeC50eHQ+IGZvciBkZXRhaWxzLgorCisJICBUaGlzIGRyaXZlciBjYW4gb25seSBiZSBidWlsdCBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKKwkgIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4KKwkgIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc3guIElmIHlvdSB3YW50IHRvIGRvIHRoYXQsIHNheSBNIGhlcmUuCisKK2NvbmZpZyBSSU8KKwl0cmlzdGF0ZSAiU3BlY2lhbGl4IFJJTyBzeXN0ZW0gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBCUk9LRU5fT05fU01QCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNwZWNpYWxpeCBSSU8sIGEgc21hcnQgc2VyaWFsIGNhcmQgd2hpY2gKKwkgIGRyaXZlcyBhbiBvdXRib2FyZCBib3ggdGhhdCBjYW4gc3VwcG9ydCB1cCB0byAxMjggcG9ydHMuICBQcm9kdWN0CisJICBpbmZvcm1hdGlvbiBpcyBhdCA8aHR0cDovL3d3dy5wZXJsZS5jb20vc3VwcG9ydC9kb2N1bWVudGF0aW9uLmh0bWwjbXVsdGlwb3J0Pi4KKwkgIFRoZXJlIGFyZSBib3RoIElTQSBhbmQgUENJIHZlcnNpb25zLgorCitjb25maWcgUklPX09MRFBDSQorCWJvb2wgIlN1cHBvcnQgcmVhbGx5IG9sZCBSSU8vUENJIGNhcmRzIgorCWRlcGVuZHMgb24gUklPCisJaGVscAorCSAgT2xkZXIgUklPIFBDSSBjYXJkcyBuZWVkIHNvbWUgaW5pdGlhbGl6YXRpb24tdGltZSBjb25maWd1cmF0aW9uIHRvCisJICBkZXRlcm1pbmUgdGhlIElSUSBhbmQgc29tZSBjb250cm9sIGFkZHJlc3Nlcy4gIElmIHlvdSBoYXZlIGEgUklPIGFuZAorCSAgdGhpcyBkb2Vzbid0IHNlZW0gdG8gd29yaywgdHJ5IHNldHRpbmcgdGhpcyB0byBZLgorCitjb25maWcgU1RBTERSVgorCWJvb2wgIlN0YWxsaW9uIG11bHRpcG9ydCBzZXJpYWwgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRAorCWhlbHAKKwkgIFN0YWxsaW9uIGNhcmRzIGdpdmUgeW91IG1hbnkgc2VyaWFsIHBvcnRzLiAgWW91IHdvdWxkIG5lZWQgc29tZXRoaW5nCisJICBsaWtlIHRoaXMgdG8gY29ubmVjdCBtb3JlIHRoYW4gdHdvIG1vZGVtcyB0byB5b3VyIExpbnV4IGJveCwgZm9yCisJICBpbnN0YW5jZSBpbiBvcmRlciB0byBiZWNvbWUgYSBkaWFsLWluIHNlcnZlci4gIElmIHlvdSBzYXkgWSBoZXJlLAorCSAgeW91IHdpbGwgYmUgYXNrZWQgZm9yIHlvdXIgc3BlY2lmaWMgY2FyZCBtb2RlbCBpbiB0aGUgbmV4dAorCSAgcXVlc3Rpb25zLiAgTWFrZSBzdXJlIHRvIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9zdGFsbGlvbi50eHQ+IGluCisJICB0aGlzIGNhc2UuICBJZiB5b3UgaGF2ZSBuZXZlciBoZWFyZCBhYm91dCBhbGwgdGhpcywgaXQncyBzYWZlIHRvCisJICBzYXkgTi4KKworY29uZmlnIFNUQUxMSU9OCisJdHJpc3RhdGUgIlN0YWxsaW9uIEVhc3lJTyBvciBFQzgvMzIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNUQUxEUlYgJiYgQlJPS0VOX09OX1NNUAorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEVhc3lJTyBvciBFYXN5Q29ubmVjdGlvbiA4LzMyIG11bHRpcG9ydCBTdGFsbGlvbgorCSAgY2FyZCwgdGhlbiB0aGlzIGlzIGZvciB5b3U7IHNheSBZLiAgTWFrZSBzdXJlIHRvIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc3RhbGxpb24udHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc3RhbGxpb24uCisKK2NvbmZpZyBJU1RBTExJT04KKwl0cmlzdGF0ZSAiU3RhbGxpb24gRUM4LzY0LCBPTmJvYXJkLCBCcnVtYnkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNUQUxEUlYgJiYgQlJPS0VOX09OX1NNUAorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEVhc3lDb25uZWN0aW9uIDgvNjQsIE9OYm9hcmQsIEJydW1ieSBvciBTdGFsbGlvbgorCSAgc2VyaWFsIG11bHRpcG9ydCBjYXJkLCBzYXkgWSBoZXJlLiBNYWtlIHN1cmUgdG8gcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zdGFsbGlvbi50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpc3RhbGxpb24uCisKK2NvbmZpZyBBVTEwMDBfVUFSVAorCWJvb2wgIkVuYWJsZSBBdTEwMDAgVUFSVCBTdXBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIE1JUFMKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhbiBBbGNoZW15IEFVMTAwMCBwcm9jZXNzb3IgKE1JUFMgYmFzZWQpIGFuZCB5b3Ugd2FudAorCSAgdG8gdXNlIHNlcmlhbCBwb3J0cywgc2F5IFkuICBPdGhlcndpc2UsIHNheSBOLgorCitjb25maWcgQVUxMDAwX1NFUklBTF9DT05TT0xFCisJYm9vbCAiRW5hYmxlIEF1MTAwMCBzZXJpYWwgY29uc29sZSIKKwlkZXBlbmRzIG9uIEFVMTAwMF9VQVJUCisJaGVscAorCSAgSWYgeW91IGhhdmUgYW4gQWxjaGVteSBBVTEwMDAgcHJvY2Vzc29yIChNSVBTIGJhc2VkKSBhbmQgeW91IHdhbnQKKwkgIHRvIHVzZSBhIGNvbnNvbGUgb24gYSBzZXJpYWwgcG9ydCwgc2F5IFkuICBPdGhlcndpc2UsIHNheSBOLgorCitjb25maWcgUVRST05JWF9LRVlCT0FSRAorCWJvb2wgIkVuYWJsZSBRdHJvbml4IDk5MFAgS2V5Ym9hcmQgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIElUODcxMgorCWhlbHAKKwkgIEltYWdlcyBvZiBRdHJvbml4IGtleWJvYXJkcyBhcmUgYXQKKwkgIDxodHRwOi8vd3d3LnF0cm9uaXguY29tL2tleWJvYXJkLmh0bWw+LgorCitjb25maWcgSVQ4MTcyX0NJUgorCWJvb2wKKwlkZXBlbmRzIG9uIFFUUk9OSVhfS0VZQk9BUkQKKwlkZWZhdWx0IHkKKworY29uZmlnIElUODE3Ml9TQ1IwCisJYm9vbCAiRW5hYmxlIFNtYXJ0IENhcmQgUmVhZGVyIDAgU3VwcG9ydCAiCisJZGVwZW5kcyBvbiBJVDg3MTIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgc21hcnQtY2FyZCByZWFkZXIgMCAoU0NSMCkgb24gdGhlIEludGVncmF0ZWQKKwkgIFRlY2hub2xvZ3kgRXhwcmVzcywgSW5jLiBJVEU4MTcyIFNCQy4gIFZlbmRvciBwYWdlIGF0CisJICA8aHR0cDovL3d3dy5pdGUuY29tLnR3L2lhL2JyaWVmX2l0ODE3MmJzcC5odG0+OyBwaWN0dXJlIG9mIHRoZQorCSAgYm9hcmQgYXQgPGh0dHA6Ly93d3cubXZpc3RhLmNvbS9wYXJ0bmVycy9zZW1pY29uZHVjdG9yL2l0ZS5odG1sPi4KKworY29uZmlnIElUODE3Ml9TQ1IxCisJYm9vbCAiRW5hYmxlIFNtYXJ0IENhcmQgUmVhZGVyIDEgU3VwcG9ydCAiCisJZGVwZW5kcyBvbiBJVDg3MTIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgc21hcnQtY2FyZCByZWFkZXIgMSAoU0NSMSkgb24gdGhlIEludGVncmF0ZWQKKwkgIFRlY2hub2xvZ3kgRXhwcmVzcywgSW5jLiBJVEU4MTcyIFNCQy4gIFZlbmRvciBwYWdlIGF0CisJICA8aHR0cDovL3d3dy5pdGUuY29tLnR3L2lhL2JyaWVmX2l0ODE3MmJzcC5odG0+OyBwaWN0dXJlIG9mIHRoZQorCSAgYm9hcmQgYXQgPGh0dHA6Ly93d3cubXZpc3RhLmNvbS9wYXJ0bmVycy9zZW1pY29uZHVjdG9yL2l0ZS5odG1sPi4KKworY29uZmlnIEEyMjMyCisJdHJpc3RhdGUgIkNvbW1vZG9yZSBBMjIzMiBzZXJpYWwgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBaT1JSTyAmJiBCUk9LRU5fT05fU01QCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gc3VwcG9ydHMgdGhlIDIyMzIgNy1wb3J0IHNlcmlhbCBjYXJkIHNoaXBwZWQgd2l0aCB0aGUKKwkgIEFtaWdhIDIwMDAgYW5kIG90aGVyIFpvcnJvLWJ1cyBtYWNoaW5lcywgZGF0aW5nIGZyb20gMTk4OS4gIEF0CisJICBhIG1heCBvZiAxOSwyMDAgYnBzLCB0aGUgcG9ydHMgYXJlIHNlcnZlZCBieSBhIDY1NTEgQUNJQSBVQVJUIGNoaXAKKwkgIGVhY2gsIHBsdXMgYSA4NTIwIENJQSwgYW5kIGEgbWFzdGVyIDY1MDIgQ1BVIGFuZCBidWZmZXIgYXMgd2VsbC4gVGhlCisJICBwb3J0cyB3ZXJlIGNvbm5lY3RlZCB3aXRoIDggcGluIERJTiBjb25uZWN0b3JzIG9uIHRoZSBjYXJkIGJyYWNrZXQsCisJICBmb3Igd2hpY2ggOCBwaW4gdG8gREIyNSBhZGFwdGVycyB3ZXJlIHN1cHBsaWVkLiBUaGUgY2FyZCBhbHNvIGhhZAorCSAganVtcGVycyBpbnRlcm5hbGx5IHRvIHRvZ2dsZSB2YXJpb3VzIHBpbm5pbmcgY29uZmlndXJhdGlvbnMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBiZSBidWlsdCBhcyBhIG1vZHVsZTsgYnV0IHRoZW4gImdlbmVyaWNfc2VyaWFsIgorCSAgd2lsbCBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBUaGlzIGhhcyB0byBiZSBsb2FkZWQgYmVmb3JlCisJICAic2VyX2EyMjMyIi4gSWYgeW91IHdhbnQgdG8gZG8gdGhpcywgYW5zd2VyIE0gaGVyZS4KKworY29uZmlnIFNHSV9TTlNDCisJYm9vbCAiU0dJIEFsdGl4IHN5c3RlbSBjb250cm9sbGVyIGNvbW11bmljYXRpb24gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIChJQTY0X1NHSV9TTjIgfHwgSUE2NF9HRU5FUklDKQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIFNHSSBBbHRpeCBhbmQgeW91IHdhbnQgdG8gZW5hYmxlIHN5c3RlbQorCSAgY29udHJvbGxlciBjb21tdW5pY2F0aW9uIGZyb20gdXNlciBzcGFjZSAoeW91IHdhbnQgdGhpcyEpLAorCSAgc2F5IFkuICBPdGhlcndpc2UsIHNheSBOLgorCitzb3VyY2UgImRyaXZlcnMvc2VyaWFsL0tjb25maWciCisKK2NvbmZpZyBVTklYOThfUFRZUworCWJvb2wgIlVuaXg5OCBQVFkgc3VwcG9ydCIgaWYgRU1CRURERUQKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBBIHBzZXVkbyB0ZXJtaW5hbCAoUFRZKSBpcyBhIHNvZnR3YXJlIGRldmljZSBjb25zaXN0aW5nIG9mIHR3bworCSAgaGFsdmVzOiBhIG1hc3RlciBhbmQgYSBzbGF2ZS4gVGhlIHNsYXZlIGRldmljZSBiZWhhdmVzIGlkZW50aWNhbCB0bworCSAgYSBwaHlzaWNhbCB0ZXJtaW5hbDsgdGhlIG1hc3RlciBkZXZpY2UgaXMgdXNlZCBieSBhIHByb2Nlc3MgdG8KKwkgIHJlYWQgZGF0YSBmcm9tIGFuZCB3cml0ZSBkYXRhIHRvIHRoZSBzbGF2ZSwgdGhlcmVieSBlbXVsYXRpbmcgYQorCSAgdGVybWluYWwuIFR5cGljYWwgcHJvZ3JhbXMgZm9yIHRoZSBtYXN0ZXIgc2lkZSBhcmUgdGVsbmV0IHNlcnZlcnMKKwkgIGFuZCB4dGVybXMuCisKKwkgIExpbnV4IGhhcyB0cmFkaXRpb25hbGx5IHVzZWQgdGhlIEJTRC1saWtlIG5hbWVzIC9kZXYvcHR5eHggZm9yCisJICBtYXN0ZXJzIGFuZCAvZGV2L3R0eXh4IGZvciBzbGF2ZXMgb2YgcHNldWRvIHRlcm1pbmFscy4gVGhpcyBzY2hlbWUKKwkgIGhhcyBhIG51bWJlciBvZiBwcm9ibGVtcy4gVGhlIEdOVSBDIGxpYnJhcnkgZ2xpYmMgMi4xIGFuZCBsYXRlciwKKwkgIGhvd2V2ZXIsIHN1cHBvcnRzIHRoZSBVbml4OTggbmFtaW5nIHN0YW5kYXJkOiBpbiBvcmRlciB0byBhY3F1aXJlIGEKKwkgIHBzZXVkbyB0ZXJtaW5hbCwgYSBwcm9jZXNzIG9wZW5zIC9kZXYvcHRteDsgdGhlIG51bWJlciBvZiB0aGUgcHNldWRvCisJICB0ZXJtaW5hbCBpcyB0aGVuIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBwcm9jZXNzIGFuZCB0aGUgcHNldWRvCisJICB0ZXJtaW5hbCBzbGF2ZSBjYW4gYmUgYWNjZXNzZWQgYXMgL2Rldi9wdHMvPG51bWJlcj4uIFdoYXQgd2FzCisJICB0cmFkaXRpb25hbGx5IC9kZXYvdHR5cDIgd2lsbCB0aGVuIGJlIC9kZXYvcHRzLzIsIGZvciBleGFtcGxlLgorCisJICBBbGwgbW9kZXJuIExpbnV4IHN5c3RlbXMgdXNlIHRoZSBVbml4OTggcHR5cy4gIFNheSBZIHVubGVzcworCSAgeW91J3JlIG9uIGFuIGVtYmVkZGVkIHN5c3RlbSBhbmQgd2FudCB0byBjb25zZXJ2ZSBtZW1vcnkuCisKK2NvbmZpZyBMRUdBQ1lfUFRZUworCWJvb2wgIkxlZ2FjeSAoQlNEKSBQVFkgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBBIHBzZXVkbyB0ZXJtaW5hbCAoUFRZKSBpcyBhIHNvZnR3YXJlIGRldmljZSBjb25zaXN0aW5nIG9mIHR3bworCSAgaGFsdmVzOiBhIG1hc3RlciBhbmQgYSBzbGF2ZS4gVGhlIHNsYXZlIGRldmljZSBiZWhhdmVzIGlkZW50aWNhbCB0bworCSAgYSBwaHlzaWNhbCB0ZXJtaW5hbDsgdGhlIG1hc3RlciBkZXZpY2UgaXMgdXNlZCBieSBhIHByb2Nlc3MgdG8KKwkgIHJlYWQgZGF0YSBmcm9tIGFuZCB3cml0ZSBkYXRhIHRvIHRoZSBzbGF2ZSwgdGhlcmVieSBlbXVsYXRpbmcgYQorCSAgdGVybWluYWwuIFR5cGljYWwgcHJvZ3JhbXMgZm9yIHRoZSBtYXN0ZXIgc2lkZSBhcmUgdGVsbmV0IHNlcnZlcnMKKwkgIGFuZCB4dGVybXMuCisKKwkgIExpbnV4IGhhcyB0cmFkaXRpb25hbGx5IHVzZWQgdGhlIEJTRC1saWtlIG5hbWVzIC9kZXYvcHR5eHgKKwkgIGZvciBtYXN0ZXJzIGFuZCAvZGV2L3R0eXh4IGZvciBzbGF2ZXMgb2YgcHNldWRvCisJICB0ZXJtaW5hbHMuIFRoaXMgc2NoZW1lIGhhcyBhIG51bWJlciBvZiBwcm9ibGVtcywgaW5jbHVkaW5nCisJICBzZWN1cml0eS4gIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlc2UgbGVnYWN5IGRldmljZXM7IG9uIG1vc3QKKwkgIHN5c3RlbXMsIGl0IGlzIHNhZmUgdG8gc2F5IE4uCisKKworY29uZmlnIExFR0FDWV9QVFlfQ09VTlQKKwlpbnQgIk1heGltdW0gbnVtYmVyIG9mIGxlZ2FjeSBQVFkgaW4gdXNlIgorCWRlcGVuZHMgb24gTEVHQUNZX1BUWVMKKwlyYW5nZSAxIDI1NgorCWRlZmF1bHQgIjI1NiIKKwktLS1oZWxwLS0tCisJICBUaGUgbWF4aW11bSBudW1iZXIgb2YgbGVnYWN5IFBUWXMgdGhhdCBjYW4gYmUgdXNlZCBhdCBhbnkgb25lIHRpbWUuCisJICBUaGUgZGVmYXVsdCBpcyAyNTYsIGFuZCBzaG91bGQgYmUgbW9yZSB0aGFuIGVub3VnaC4gIEVtYmVkZGVkCisJICBzeXN0ZW1zIG1heSB3YW50IHRvIHJlZHVjZSB0aGlzIHRvIHNhdmUgbWVtb3J5LgorCisJICBXaGVuIG5vdCBpbiB1c2UsIGVhY2ggbGVnYWN5IFBUWSBvY2N1cGllcyAxMiBieXRlcyBvbiAzMi1iaXQKKwkgIGFyY2hpdGVjdHVyZXMgYW5kIDI0IGJ5dGVzIG9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzLgorCitjb25maWcgUFJJTlRFUgorCXRyaXN0YXRlICJQYXJhbGxlbCBwcmludGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQVJQT1JUCisJLS0taGVscC0tLQorCSAgSWYgeW91IGludGVuZCB0byBhdHRhY2ggYSBwcmludGVyIHRvIHRoZSBwYXJhbGxlbCBwb3J0IG9mIHlvdXIgTGludXgKKwkgIGJveCAoYXMgb3Bwb3NlZCB0byB1c2luZyBhIHNlcmlhbCBwcmludGVyOyBpZiB0aGUgY29ubmVjdG9yIGF0IHRoZQorCSAgcHJpbnRlciBoYXMgOSBvciAyNSBob2xlcyBbImZlbWFsZSJdLCB0aGVuIGl0J3Mgc2VyaWFsKSwgc2F5IFkuCisJICBBbHNvIHJlYWQgdGhlIFByaW50aW5nLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgSXQgaXMgcG9zc2libGUgdG8gc2hhcmUgb25lIHBhcmFsbGVsIHBvcnQgYW1vbmcgc2V2ZXJhbCBkZXZpY2VzCisJICAoZS5nLiBwcmludGVyIGFuZCBaSVAgZHJpdmUpIGFuZCBpdCBpcyBzYWZlIHRvIGNvbXBpbGUgdGhlCisJICBjb3JyZXNwb25kaW5nIGRyaXZlcnMgaW50byB0aGUga2VybmVsLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3BhcnBvcnQudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbHAuCisKKwkgIElmIHlvdSBoYXZlIHNldmVyYWwgcGFyYWxsZWwgcG9ydHMsIHlvdSBjYW4gc3BlY2lmeSB3aGljaCBwb3J0cyB0bworCSAgdXNlIHdpdGggdGhlICJscCIga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24uICAoVHJ5ICJtYW4gYm9vdHBhcmFtIgorCSAgb3Igc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgYm9vdCBsb2FkZXIgKGxpbG8gb3IgbG9hZGxpbikgYWJvdXQKKwkgIGhvdyB0byBwYXNzIG9wdGlvbnMgdG8gdGhlIGtlcm5lbCBhdCBib290IHRpbWUuKSAgVGhlIHN5bnRheCBvZiB0aGUKKwkgICJscCIgY29tbWFuZCBsaW5lIG9wdGlvbiBjYW4gYmUgZm91bmQgaW4gPGZpbGU6ZHJpdmVycy9jaGFyL2xwLmM+LgorCisJICBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gOCBwcmludGVycywgeW91IG5lZWQgdG8gaW5jcmVhc2UgdGhlIExQX05PCisJICBtYWNybyBpbiBscC5jIGFuZCB0aGUgUEFSUE9SVF9NQVggbWFjcm8gaW4gcGFycG9ydC5oLgorCitjb25maWcgTFBfQ09OU09MRQorCWJvb2wgIlN1cHBvcnQgZm9yIGNvbnNvbGUgb24gbGluZSBwcmludGVyIgorCWRlcGVuZHMgb24gUFJJTlRFUgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSB3YW50IGtlcm5lbCBtZXNzYWdlcyB0byBiZSBwcmludGVkIG91dCBhcyB0aGV5IG9jY3VyLCB5b3UKKwkgIGNhbiBoYXZlIGEgY29uc29sZSBvbiB0aGUgcHJpbnRlci4gVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvcgorCSAgZG9pbmcgdGhhdDsgdG8gYWN0dWFsbHkgZ2V0IGl0IHRvIGhhcHBlbiB5b3UgbmVlZCB0byBwYXNzIHRoZQorCSAgb3B0aW9uICJjb25zb2xlPWxwMCIgdG8gdGhlIGtlcm5lbCBhdCBib290IHRpbWUuCisKKwkgIElmIHRoZSBwcmludGVyIGlzIG91dCBvZiBwYXBlciAob3Igb2ZmLCBvciB1bnBsdWdnZWQsIG9yIHRvbworCSAgYnVzeS4uKSB0aGUga2VybmVsIHdpbGwgc3RhbGwgdW50aWwgdGhlIHByaW50ZXIgaXMgcmVhZHkgYWdhaW4uCisJICBCeSBkZWZpbmluZyBDT05TT0xFX0xQX1NUUklDVCB0byAwIChhdCB5b3VyIG93biByaXNrKSB5b3UKKwkgIGNhbiBtYWtlIHRoZSBrZXJuZWwgY29udGludWUgd2hlbiB0aGlzIGhhcHBlbnMsCisJICBidXQgaXQnbGwgbG9zZSB0aGUga2VybmVsIG1lc3NhZ2VzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUFBERVYKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgdXNlci1zcGFjZSBwYXJhbGxlbCBwb3J0IGRldmljZSBkcml2ZXJzIgorCWRlcGVuZHMgb24gUEFSUE9SVAorCS0tLWhlbHAtLS0KKwkgIFNheWluZyBZIHRvIHRoaXMgYWRkcyBzdXBwb3J0IGZvciAvZGV2L3BhcnBvcnQgZGV2aWNlIG5vZGVzLiAgVGhpcworCSAgaXMgbmVlZGVkIGZvciBwcm9ncmFtcyB0aGF0IHdhbnQgcG9ydGFibGUgYWNjZXNzIHRvIHRoZSBwYXJhbGxlbAorCSAgcG9ydCwgZm9yIGluc3RhbmNlIGRldmljZWlkICh3aGljaCBkaXNwbGF5cyBQbHVnLWFuZC1QbGF5IGRldmljZQorCSAgSURzKS4KKworCSAgVGhpcyBpcyB0aGUgcGFyYWxsZWwgcG9ydCBlcXVpdmFsZW50IG9mIFNDU0kgZ2VuZXJpYyBzdXBwb3J0IChzZykuCisJICBJdCBpcyBzYWZlIHRvIHNheSBOIHRvIHRoaXMgLS0gaXQgaXMgbm90IG5lZWRlZCBmb3Igbm9ybWFsIHByaW50aW5nCisJICBvciBwYXJhbGxlbCBwb3J0IENELVJPTS9kaXNrIHN1cHBvcnQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBwZGV2LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVElQQVIKKwl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgcGFyYWxsZWwgbGluayBjYWJsZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUEFSUE9SVAorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBvd24gYSBUZXhhcyBJbnN0cnVtZW50cyBncmFwaGluZyBjYWxjdWxhdG9yIGFuZCB1c2UgYQorCSAgcGFyYWxsZWwgbGluayBjYWJsZSwgdGhlbiB5b3UgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiB0aGlzIGRyaXZlci4KKworCSAgSWYgeW91IGVuYWJsZSB0aGlzIGRyaXZlciwgeW91IHdpbGwgYmUgYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoCisJICB5b3VyIGNhbGN1bGF0b3IgdGhyb3VnaCBhIHNldCBvZiBkZXZpY2Ugbm9kZXMgdW5kZXIgL2Rldi4gVGhlCisJICBtYWluIGFkdmFudGFnZSBvZiB0aGlzIGRyaXZlciBpcyB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIGJlIHJvb3QKKwkgIHRvIHVzZSB0aGlzIHByZWNpc2UgbGluayBjYWJsZSAoZGVwZW5kaW5nIG9uIHRoZSBwZXJtaXNzaW9ucyBvbgorCSAgdGhlIGRldmljZSBub2RlcywgdGhvdWdoKS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdGlwYXIuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgYSBwYXJhbGxlbCBsaW5rIGNhYmxlIGlzIG9yIHdoYXQgYSBUZXhhcworCSAgSW5zdHJ1bWVudHMgZ3JhcGhpbmcgY2FsY3VsYXRvciBpcywgdGhlbiB5b3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0aGlzCisJICBkcml2ZXIuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIVkNfQ09OU09MRQorCWJvb2wgInBTZXJpZXMgSHlwZXJ2aXNvciBWaXJ0dWFsIENvbnNvbGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBQQ19QU0VSSUVTCisJaGVscAorCSAgcFNlcmllcyBtYWNoaW5lcyB3aGVuIHBhcnRpdGlvbmVkIHN1cHBvcnQgYSBoeXBlcnZpc29yIHZpcnR1YWwKKwkgIGNvbnNvbGUuIFRoaXMgZHJpdmVyIGFsbG93cyBlYWNoIHBTZXJpZXMgcGFydGl0aW9uIHRvIGhhdmUgYSBjb25zb2xlCisJICB3aGljaCBpcyBhY2Nlc3NlZCB2aWEgdGhlIEhNQy4KKworY29uZmlnIEhWQ1MKKwl0cmlzdGF0ZSAiSUJNIEh5cGVydmlzb3IgVmlydHVhbCBDb25zb2xlIFNlcnZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gUFBDX1BTRVJJRVMKKwloZWxwCisJICBQYXJ0aXRpb25hYmxlIElCTSBQb3dlcjUgcHBjNjQgbWFjaGluZXMgYWxsb3cgaG9zdGluZyBvZgorCSAgZmlybXdhcmUgdmlydHVhbCBjb25zb2xlcyBmcm9tIG9uZSBMaW51eCBwYXJ0aXRpb24gYnkKKwkgIGFub3RoZXIgTGludXggcGFydGl0aW9uLiAgVGhpcyBkcml2ZXIgYWxsb3dzIGNvbnNvbGUgZGF0YQorCSAgZnJvbSBMaW51eCBwYXJ0aXRpb25zIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggVFRZIGRldmljZQorCSAgaW50ZXJmYWNlcyBpbiB0aGUgZGV2aWNlIHRyZWUgb2YgYSBMaW51eCBwYXJ0aXRpb24gcnVubmluZworCSAgdGhpcyBkcml2ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGh2Y3Mua28uICBBZGRpdGlvbmFsbHksIHRoaXMgbW9kdWxlCisJICB3aWxsIGRlcGVuZCBvbiBhcmNoIHNwZWNpZmljIEFQSXMgZXhwb3J0ZWQgZnJvbSBodmNzZXJ2ZXIua28KKwkgIHdoaWNoIHdpbGwgYWxzbyBiZSBjb21waWxlZCB3aGVuIHRoaXMgZHJpdmVyIGlzIGJ1aWx0IGFzIGEKKwkgIG1vZHVsZS4KKworc291cmNlICJkcml2ZXJzL2NoYXIvaXBtaS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnIgorCitjb25maWcgRFMxNjIwCisJdHJpc3RhdGUgIk5ldFdpbmRlciB0aGVybW9tZXRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9ORVRXSU5ERVIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIHRoZXJtYWwgbWFuYWdlbWVudCBoYXJkd2FyZQorCSAgZm91bmQgaW4gdGhlIE5ldFdpbmRlci4gVGhpcyBkcml2ZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbnRyb2wgdGhlCisJICB0ZW1wZXJhdHVyZSBzZXQgcG9pbnRzIGFuZCB0byByZWFkIHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlLgorCisJICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNheSBNIGhlcmUgdG8gYnVpbGQgaXQgYXMgYSBtb2R1bGUgKGRzMTYyMCkKKwkgIEl0IGlzIHJlY29tbWVuZGVkIHRvIGJlIHVzZWQgb24gYSBOZXRXaW5kZXIsIGJ1dCBpdCBpcyBub3QgYQorCSAgbmVjZXNzaXR5LgorCitjb25maWcgTldCVVRUT04KKwl0cmlzdGF0ZSAiTmV0V2luZGVyIEJ1dHRvbiIKKwlkZXBlbmRzIG9uIEFSQ0hfTkVUV0lOREVSCisJLS0taGVscC0tLQorCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIGNyZWF0ZSBhIGNoYXJhY3RlciBkZXZpY2Ugbm9kZSAvZGV2L253YnV0dG9uCisJICB3aXRoIG1ham9yIGFuZCBtaW5vciBudW1iZXJzIDEwIGFuZCAxNTggKCJtYW4gbWtub2QiKSwgdGhlbiBldmVyeQorCSAgdGltZSB0aGUgb3JhbmdlIGJ1dHRvbiBpcyBwcmVzc2VkIGEgbnVtYmVyIG9mIHRpbWVzLCB0aGUgbnVtYmVyIG9mCisJICB0aW1lcyB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkIHdpbGwgYmUgd3JpdHRlbiB0byB0aGF0IGRldmljZS4KKworCSAgVGhpcyBpcyBtb3N0IHVzZWZ1bCBmb3IgYXBwbGljYXRpb25zLCBhcyB5ZXQgdW53cml0dGVuLCB3aGljaAorCSAgcGVyZm9ybSBhY3Rpb25zIGJhc2VkIG9uIGhvdyBtYW55IHRpbWVzIHRoZSBidXR0b24gaXMgcHJlc3NlZCBpbiBhCisJICByb3cuCisKKwkgIERvIG5vdCBob2xkIHRoZSBidXR0b24gZG93biBmb3IgdG9vIGxvbmcsIGFzIHRoZSBkcml2ZXIgZG9lcyBub3QKKwkgIGFsdGVyIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGhhcmR3YXJlIHJlc2V0IGNpcmN1aXRyeSBhdHRhY2hlZCB0byB0aGUKKwkgIGJ1dHRvbjsgaXQgd2lsbCBzdGlsbCBleGVjdXRlIGEgaGFyZCByZXNldCBpZiB0aGUgYnV0dG9uIGlzIGhlbGQKKwkgIGRvd24gZm9yIGxvbmdlciB0aGFuIGFwcHJveGltYXRlbHkgZml2ZSBzZWNvbmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBud2J1dHRvbi4KKworCSAgTW9zdCBwZW9wbGUgd2lsbCBhbnN3ZXIgWSB0byB0aGlzIHF1ZXN0aW9uIGFuZCAiUmVib290IFVzaW5nIEJ1dHRvbiIKKwkgIGJlbG93IHRvIGJlIGFibGUgdG8gaW5pdGlhdGUgYSBzeXN0ZW0gc2h1dGRvd24gZnJvbSB0aGUgYnV0dG9uLgorCitjb25maWcgTldCVVRUT05fUkVCT09UCisJYm9vbCAiUmVib290IFVzaW5nIEJ1dHRvbiIKKwlkZXBlbmRzIG9uIE5XQlVUVE9OCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZW4geW91IHdpbGwgYmUgYWJsZSB0byBpbml0aWF0ZSBhIHN5c3RlbQorCSAgc2h1dGRvd24gYW5kIHJlYm9vdCBieSBwcmVzc2luZyB0aGUgb3JhbmdlIGJ1dHRvbiBhIG51bWJlciBvZiB0aW1lcy4KKwkgIFRoZSBudW1iZXIgb2YgcHJlc3NlcyB0byBpbml0aWF0ZSB0aGUgc2h1dGRvd24gaXMgdHdvIGJ5IGRlZmF1bHQsCisJICBidXQgdGhpcyBjYW4gYmUgYWx0ZXJlZCBieSBtb2RpZnlpbmcgdGhlIHZhbHVlIG9mIE5VTV9QUkVTU0VTX1JFQk9PVAorCSAgaW4gbndidXR0b24uaCBhbmQgcmVjb21waWxpbmcgdGhlIGRyaXZlciBvciwgaWYgeW91IGNvbXBpbGUgdGhlCisJICBkcml2ZXIgYXMgYSBtb2R1bGUsIHlvdSBjYW4gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHByZXNzZXMgYXQgbG9hZAorCSAgdGltZSB3aXRoICJpbnNtb2QgYnV0dG9uIHJlYm9vdF9jb3VudD08c29tZXRoaW5nPiIuCisKK2NvbmZpZyBOV0ZMQVNICisJdHJpc3RhdGUgIk5ldFdpbmRlciBmbGFzaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9ORVRXSU5ERVIKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIGRldmljZSAvZGV2L2ZsYXNoIHdpdGgKKwkgIG1ham9yIDEwIGFuZCBtaW5vciAxNjAgeW91IGNhbiBtYW5pcHVsYXRlIHRoZSBmbGFzaCBST00gY29udGFpbmluZworCSAgdGhlIE5ldFdpbmRlciBmaXJtd2FyZS4gQmUgY2FyZWZ1bCBhcyBhY2NpZGVudGFsbHkgb3ZlcndyaXRpbmcgdGhlCisJICBmbGFzaCBjb250ZW50cyBjYW4gcmVuZGVyIHlvdXIgY29tcHV0ZXIgdW5ib290YWJsZS4gT24gbm8gYWNjb3VudAorCSAgYWxsb3cgcmFuZG9tIHVzZXJzIGFjY2VzcyB0byB0aGlzIGRldmljZS4gOi0pCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG53Zmxhc2guCisKKwkgIElmIHlvdSdyZSBub3Qgc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIV19SQU5ET00KKwl0cmlzdGF0ZSAiSW50ZWwvQU1EL1ZJQSBIVyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gKFg4NiB8fCBJQTY0KSAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBrZXJuZWwtc2lkZSBzdXBwb3J0IGZvciB0aGUgUmFuZG9tIE51bWJlcgorCSAgR2VuZXJhdG9yIGhhcmR3YXJlIGZvdW5kIG9uIEludGVsIGk4eHgtYmFzZWQgbW90aGVyYm9hcmRzLAorCSAgQU1EIDc2eC1iYXNlZCBtb3RoZXJib2FyZHMsIGFuZCBWaWEgTmVoZW1pYWggQ1BVcy4KKworCSAgUHJvdmlkZXMgYSBjaGFyYWN0ZXIgZHJpdmVyLCB1c2VkIHRvIHJlYWQoKSBlbnRyb3B5IGRhdGEuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGh3X3JhbmRvbS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5WUkFNCisJdHJpc3RhdGUgIi9kZXYvbnZyYW0gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFUQVJJIHx8IFg4NiB8fCBYODZfNjQgfHwgQVJNIHx8IEdFTkVSSUNfTlZSQU0KKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L252cmFtCisJICB3aXRoIG1ham9yIG51bWJlciAxMCBhbmQgbWlub3IgbnVtYmVyIDE0NCB1c2luZyBta25vZCAoIm1hbiBta25vZCIpLAorCSAgeW91IGdldCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gdGhlIGV4dHJhIGJ5dGVzIG9mIG5vbi12b2xhdGlsZQorCSAgbWVtb3J5IGluIHRoZSByZWFsIHRpbWUgY2xvY2sgKFJUQyksIHdoaWNoIGlzIGNvbnRhaW5lZCBpbiBldmVyeSBQQworCSAgYW5kIG1vc3QgQXRhcmlzLiAgVGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgdmFyaWVzLCBkZXBlbmRpbmcgb24gdGhlCisJICBudnJhbSBpbiB0aGUgc3lzdGVtLCBidXQgaXMgdXN1YWxseSAxMTQgKDEyOC0xNCBmb3IgdGhlIFJUQykuCisKKwkgIFRoaXMgbWVtb3J5IGlzIGNvbnZlbnRpb25hbGx5IGNhbGxlZCAiQ01PUyBSQU0iIG9uIFBDcyBhbmQgIk5WUkFNIgorCSAgb24gQXRhcmlzLiAvZGV2L252cmFtIG1heSBiZSB1c2VkIHRvIHZpZXcgc2V0dGluZ3MgdGhlcmUsIG9yIHRvCisJICBjaGFuZ2UgdGhlbSAod2l0aCBzb21lIHV0aWxpdHkpLiBJdCBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gZnJlcXVlbnRseQorCSAgc2F2ZSBhIGZldyBiaXRzIG9mIHZlcnkgaW1wb3J0YW50IGRhdGEgdGhhdCBtYXkgbm90IGJlIGxvc3Qgb3ZlcgorCSAgcG93ZXItb2ZmIGFuZCBmb3Igd2hpY2ggd3JpdGluZyB0byBkaXNrIGlzIHRvbyBpbnNlY3VyZS4gTm90ZQorCSAgaG93ZXZlciB0aGF0IG1vc3QgTlZSQU0gc3BhY2UgaW4gYSBQQyBiZWxvbmdzIHRvIHRoZSBCSU9TIGFuZCB5b3UKKwkgIHNob3VsZCBORVZFUiBpZGx5IHRhbXBlciB3aXRoIGl0LiBTZWUgUmFsZiBCcm93bidzIGludGVycnVwdCBsaXN0CisJICBmb3IgYSBndWlkZSB0byB0aGUgdXNlIG9mIENNT1MgYnl0ZXMgYnkgeW91ciBCSU9TLgorCisJICBPbiBBdGFyaSBtYWNoaW5lcywgL2Rldi9udnJhbSBpcyBhbHdheXMgY29uZmlndXJlZCBhbmQgZG9lcyBub3QgbmVlZAorCSAgdG8gYmUgc2VsZWN0ZWQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG52cmFtLgorCitjb25maWcgUlRDCisJdHJpc3RhdGUgIkVuaGFuY2VkIFJlYWwgVGltZSBDbG9jayBTdXBwb3J0IgorCWRlcGVuZHMgb24gIVBQQzMyICYmICFQQVJJU0MgJiYgIUlBNjQgJiYgIU02OEsKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3J0YyB3aXRoCisJICBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yIG51bWJlciAxMzUgdXNpbmcgbWtub2QgKCJtYW4gbWtub2QiKSwgeW91CisJICB3aWxsIGdldCBhY2Nlc3MgdG8gdGhlIHJlYWwgdGltZSBjbG9jayAob3IgaGFyZHdhcmUgY2xvY2spIGJ1aWx0CisJICBpbnRvIHlvdXIgY29tcHV0ZXIuCisKKwkgIEV2ZXJ5IFBDIGhhcyBzdWNoIGEgY2xvY2sgYnVpbHQgaW4uIEl0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlCisJICBzaWduYWxzIGZyb20gYXMgbG93IGFzIDFIeiB1cCB0byA4MTkySHosIGFuZCBjYW4gYWxzbyBiZSB1c2VkCisJICBhcyBhIDI0IGhvdXIgYWxhcm0uIEl0IHJlcG9ydHMgc3RhdHVzIGluZm9ybWF0aW9uIHZpYSB0aGUgZmlsZQorCSAgL3Byb2MvZHJpdmVyL3J0YyBhbmQgaXRzIGJlaGF2aW91ciBpcyBzZXQgYnkgdmFyaW91cyBpb2N0bHMgb24KKwkgIC9kZXYvcnRjLgorCisJICBJZiB5b3UgcnVuIExpbnV4IG9uIGEgbXVsdGlwcm9jZXNzb3IgbWFjaGluZSBhbmQgc2FpZCBZIHRvCisJICAiU3ltbWV0cmljIE11bHRpIFByb2Nlc3NpbmciIGFib3ZlLCB5b3Ugc2hvdWxkIHNheSBZIGhlcmUgdG8gcmVhZAorCSAgYW5kIHNldCB0aGUgUlRDIGluIGFuIFNNUCBjb21wYXRpYmxlIGZhc2hpb24uCisKKwkgIElmIHlvdSB0aGluayB5b3UgaGF2ZSBhIHVzZSBmb3Igc3VjaCBhIGRldmljZSAoc3VjaCBhcyBwZXJpb2RpYyBkYXRhCisJICBzYW1wbGluZyksIHRoZW4gc2F5IFkgaGVyZSwgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9ydGMudHh0PgorCSAgZm9yIGRldGFpbHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJ0Yy4KKworY29uZmlnIFNHSV9EUzEyODYKKwl0cmlzdGF0ZSAiU0dJIERTMTI4NiBSVEMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNHSV9JUDIyCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIGNyZWF0ZSBhIGNoYXJhY3RlciBzcGVjaWFsIGZpbGUgL2Rldi9ydGMgd2l0aAorCSAgbWFqb3IgbnVtYmVyIDEwIGFuZCBtaW5vciBudW1iZXIgMTM1IHVzaW5nIG1rbm9kICgibWFuIG1rbm9kIiksIHlvdQorCSAgd2lsbCBnZXQgYWNjZXNzIHRvIHRoZSByZWFsIHRpbWUgY2xvY2sgYnVpbHQgaW50byB5b3VyIGNvbXB1dGVyLgorCSAgRXZlcnkgU0dJIGhhcyBzdWNoIGEgY2xvY2sgYnVpbHQgaW4uIEl0IHJlcG9ydHMgc3RhdHVzIGluZm9ybWF0aW9uCisJICB2aWEgdGhlIGZpbGUgL3Byb2MvcnRjIGFuZCBpdHMgYmVoYXZpb3VyIGlzIHNldCBieSB2YXJpb3VzIGlvY3RscyBvbgorCSAgL2Rldi9ydGMuCisKK2NvbmZpZyBTR0lfSVAyN19SVEMKKwlib29sICJTR0kgTTQ4VDM1IFJUQyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0dJX0lQMjcKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3J0YyB3aXRoCisJICBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yIG51bWJlciAxMzUgdXNpbmcgbWtub2QgKCJtYW4gbWtub2QiKSwgeW91CisJICB3aWxsIGdldCBhY2Nlc3MgdG8gdGhlIHJlYWwgdGltZSBjbG9jayBidWlsdCBpbnRvIHlvdXIgY29tcHV0ZXIuCisJICBFdmVyeSBTR0kgaGFzIHN1Y2ggYSBjbG9jayBidWlsdCBpbi4gSXQgcmVwb3J0cyBzdGF0dXMgaW5mb3JtYXRpb24KKwkgIHZpYSB0aGUgZmlsZSAvcHJvYy9ydGMgYW5kIGl0cyBiZWhhdmlvdXIgaXMgc2V0IGJ5IHZhcmlvdXMgaW9jdGxzIG9uCisJICAvZGV2L3J0Yy4KKworY29uZmlnIEdFTl9SVEMKKwl0cmlzdGF0ZSAiR2VuZXJpYyAvZGV2L3J0YyBlbXVsYXRpb24iCisJZGVwZW5kcyBvbiBSVEMhPXkgJiYgIUlBNjQgJiYgIUFSTQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBzYXkgWSBoZXJlIGFuZCBjcmVhdGUgYSBjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlIC9kZXYvcnRjIHdpdGgKKwkgIG1ham9yIG51bWJlciAxMCBhbmQgbWlub3IgbnVtYmVyIDEzNSB1c2luZyBta25vZCAoIm1hbiBta25vZCIpLCB5b3UKKwkgIHdpbGwgZ2V0IGFjY2VzcyB0byB0aGUgcmVhbCB0aW1lIGNsb2NrIChvciBoYXJkd2FyZSBjbG9jaykgYnVpbHQKKwkgIGludG8geW91ciBjb21wdXRlci4KKworCSAgSXQgcmVwb3J0cyBzdGF0dXMgaW5mb3JtYXRpb24gdmlhIHRoZSBmaWxlIC9wcm9jL2RyaXZlci9ydGMgYW5kIGl0cworCSAgYmVoYXZpb3VyIGlzIHNldCBieSB2YXJpb3VzIGlvY3RscyBvbiAvZGV2L3J0Yy4gSWYgeW91IGVuYWJsZSB0aGUKKwkgICJleHRlbmRlZCBSVEMgb3BlcmF0aW9uIiBiZWxvdyBpdCB3aWxsIGFsc28gcHJvdmlkZSBhbiBlbXVsYXRpb24KKwkgIGZvciBSVENfVUlFIHdoaWNoIGlzIHJlcXVpcmVkIGJ5IHNvbWUgcHJvZ3JhbXMgYW5kIG1heSBpbXByb3ZlCisJICBwcmVjaXNpb24gaW4gc29tZSBjYXNlcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ2VucnRjLgorCitjb25maWcgR0VOX1JUQ19YCisJYm9vbCAiRXh0ZW5kZWQgUlRDIG9wZXJhdGlvbiIKKwlkZXBlbmRzIG9uIEdFTl9SVEMKKwloZWxwCisJICBQcm92aWRlcyBhbiBlbXVsYXRpb24gZm9yIFJUQ19VSUUgd2hpY2ggaXMgcmVxdWlyZWQgYnkgc29tZSBwcm9ncmFtcworCSAgYW5kIG1heSBpbXByb3ZlIHByZWNpc2lvbiBvZiB0aGUgZ2VuZXJpYyBSVEMgc3VwcG9ydCBpbiBzb21lIGNhc2VzLgorCitjb25maWcgRUZJX1JUQworCWJvb2wgIkVGSSBSZWFsIFRpbWUgQ2xvY2sgU2VydmljZXMiCisJZGVwZW5kcyBvbiBJQTY0CisKK2NvbmZpZyBEUzEzMDIKKwl0cmlzdGF0ZSAiRFMxMzAyIFJUQyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTTMyUiAmJiAoUExBVF9NMzI3MDBVVCB8fCBQTEFUX09QU1BVVCkKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3J0YyB3aXRoCisJICBtYWpvciBudW1iZXIgMTIxIGFuZCBtaW5vciBudW1iZXIgMCB1c2luZyBta25vZCAoIm1hbiBta25vZCIpLCB5b3UKKwkgIHdpbGwgZ2V0IGFjY2VzcyB0byB0aGUgcmVhbCB0aW1lIGNsb2NrIChvciBoYXJkd2FyZSBjbG9jaykgYnVpbHQKKwkgIGludG8geW91ciBjb21wdXRlci4KKworY29uZmlnIFMzQzI0MTBfUlRDCisJYm9vbCAiUzNDMjQxMCBSVEMgRHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwCisJaGVscAorCSAgUlRDIChSZWFsdGltZSBDbG9jaykgZHJpdmVyIGZvciB0aGUgY2xvY2sgaW5idWlsdCBpbnRvIHRoZQorCSAgU2Ftc3VuZyBTM0MyNDEwLiBUaGlzIGNhbiBwcm92aWRlIHBlcmlvZGljIGludGVycnVwdCByYXRlcworCSAgZnJvbSAxSHogdG8gNjRIeiBmb3IgdXNlciBwcm9ncmFtcywgYW5kIHdha2V1cCBmcm9tIEFsYXJtLgorCitjb25maWcgUlRDX1ZSNDFYWAorCXRyaXN0YXRlICJORUMgVlI0MTAwIHNlcmllcyBSZWFsIFRpbWUgQ2xvY2sgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIENQVV9WUjQxWFgKKworY29uZmlnIENPQkFMVF9MQ0QKKwlib29sICJTdXBwb3J0IGZvciBDb2JhbHQgTENEIgorCWRlcGVuZHMgb24gTUlQU19DT0JBTFQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBMQ0QgZGlzcGxheSBhbmQgYnV0dG9ucyBmb3VuZAorCSAgb24gQ29iYWx0IHN5c3RlbXMgdGhyb3VnaCBhIG1pc2MgZGV2aWNlLgorCitjb25maWcgRFRMSworCXRyaXN0YXRlICJEb3VibGUgVGFsayBQQyBpbnRlcm5hbCBzcGVlY2ggY2FyZCBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgRG91YmxlVGFsayBQQywgYSBzcGVlY2ggc3ludGhlc2l6ZXIKKwkgIG1hbnVmYWN0dXJlZCBieSBSQyBTeXN0ZW1zICg8aHR0cDovL3d3dy5yY3N5cy5jb20vPikuICBJdCBpcyBhbHNvCisJICBjYWxsZWQgdGhlIGBpbnRlcm5hbCBEb3VibGVUYWxrJy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZHRsay4KKworY29uZmlnIFIzOTY0CisJdHJpc3RhdGUgIlNpZW1lbnMgUjM5NjQgbGluZSBkaXNjaXBsaW5lIgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGFsbG93cyBzeW5jaHJvbm91cyBjb21tdW5pY2F0aW9uIHdpdGggZGV2aWNlcyB1c2luZyB0aGUKKwkgIFNpZW1lbnMgUjM5NjQgcGFja2V0IHByb3RvY29sLiBVbmxlc3MgeW91IGFyZSBkZWFsaW5nIHdpdGggc3BlY2lhbAorCSAgaGFyZHdhcmUgbGlrZSBQTENzLCB5b3UgYXJlIHVubGlrZWx5IHRvIG5lZWQgdGhpcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbl9yMzk2NC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEFQUExJQ09NCisJdHJpc3RhdGUgIkFwcGxpY29tIGludGVsbGlnZW50IGZpZWxkYnVzIGNhcmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHRoZSBrZXJuZWwtc2lkZSBzdXBwb3J0IGZvciB0aGUgaW50ZWxsaWdlbnQKKwkgIGZpZWxkYnVzIGNhcmRzIG1hZGUgYnkgQXBwbGljb20gSW50ZXJuYXRpb25hbC4gTW9yZSBpbmZvcm1hdGlvbgorCSAgYWJvdXQgdGhlc2UgY2FyZHMgY2FuIGJlIGZvdW5kIG9uIHRoZSBXV1cgYXQgdGhlIGFkZHJlc3MKKwkgIDxodHRwOi8vd3d3LmFwcGxpY29tLWludC5jb20vPiwgb3IgYnkgZW1haWwgZnJvbSBEYXZpZCBXb29kaG91c2UKKwkgIDxkd213MkBpbmZyYWRlYWQub3JnPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXBwbGljb20uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTT05ZUEkKKwl0cmlzdGF0ZSAiU29ueSBWYWlvIFByb2dyYW1tYWJsZSBJL08gQ29udHJvbCBEZXZpY2Ugc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBYODYgJiYgUENJICYmIElOUFVUICYmICE2NEJJVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbAorCSAgRGV2aWNlIHdoaWNoIGNhbiBiZSBmb3VuZCBpbiBtYW55IChhbGwgPykgU29ueSBWYWlvIGxhcHRvcHMuCisKKwkgIElmIHlvdSBoYXZlIG9uZSBvZiB0aG9zZSBsYXB0b3BzLCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvbnlwaS50eHQ+LCBhbmQgc2F5IFkgb3IgTSBoZXJlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzb255cGkuCisKK2NvbmZpZyBUQU5CQUNfVEIwMjE5CisJdHJpc3RhdGUgIlRBTkJBQyBUQjAyMTkgYmFzZSBib2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgVEFOQkFDX1RCMDIyOQorCisKK21lbnUgIkZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlciIKKworY29uZmlnIEZUQVBFCisJdHJpc3RhdGUgIkZ0YXBlIChRSUMtODAvVHJhdmFuKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlJPS0VOX09OX1NNUCAmJiAoQUxQSEEgfHwgWDg2KQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgdGFwZSBkcml2ZSB0aGF0IGlzIGNvbm5lY3RlZCB0byB5b3VyIGZsb3BweQorCSAgY29udHJvbGxlciwgc2F5IFkgaGVyZS4KKworCSAgU29tZSB0YXBlIGRyaXZlcyAobGlrZSB0aGUgU2VhZ2F0ZSAiVGFwZSBTdG9yZSAzMjAwIiBvciB0aGUgSW9tZWdhCisJICAiRGl0dG8gMzIwMCIgb3IgdGhlIEV4YWJ5dGUgIkVhZ2xlIFRSLTMiKSBjb21lIHdpdGggYSAiaGlnaCBzcGVlZCIKKwkgIGNvbnRyb2xsZXIgb2YgdGhlaXIgb3duLiBUaGVzZSBkcml2ZXMgKGFuZCB0aGVpciBjb21wYW5pb24KKwkgIGNvbnRyb2xsZXJzKSBhcmUgYWxzbyBzdXBwb3J0ZWQgaWYgeW91IHNheSBZIGhlcmUuCisKKwkgIElmIHlvdSBoYXZlIGEgc3BlY2lhbCBjb250cm9sbGVyIChzdWNoIGFzIHRoZSBDTVMgRkMtMTAsIEZDLTIwLAorCSAgTW91bnRhaW4gTWFjaC1JSSwgb3IgYW55IGNvbnRyb2xsZXIgdGhhdCBpcyBiYXNlZCBvbiB0aGUgSW50ZWwgODIwNzgKKwkgIEZEQyBsaWtlIHRoZSBoaWdoIHNwZWVkIGNvbnRyb2xsZXJzIGJ5IFNlYWdhdGUgYW5kIEV4YWJ5dGUgYW5kCisJICBJb21lZ2EncyAiRGl0dG8gRGFzaCIpIHlvdSBtdXN0IGNvbmZpZ3VyZSBpdCBieSBzZWxlY3RpbmcgdGhlCisJICBhcHByb3ByaWF0ZSBlbnRyaWVzIGZyb20gdGhlICJGbG9wcHkgdGFwZSBjb250cm9sbGVycyIgc3ViLW1lbnUKKwkgIGJlbG93IGFuZCBwb3NzaWJseSBtb2RpZnkgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgSVJRIGFuZCBETUEKKwkgIGNoYW5uZWwgYW5kIHRoZSBJTyBiYXNlIGluIGZ0YXBlJ3MgY29uZmlndXJhdGlvbiBtZW51LgorCisJICBJZiB5b3Ugd2FudCB0byB1c2UgeW91ciBmbG9wcHkgdGFwZSBkcml2ZSBvbiBhIFBDSS1idXMgYmFzZWQgc3lzdGVtLAorCSAgcGxlYXNlIHJlYWQgdGhlIGZpbGUgPGZpbGU6ZHJpdmVycy9jaGFyL2Z0YXBlL1JFQURNRS5QQ0k+LgorCisJICBUaGUgZnRhcGUga2VybmVsIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIHJ1bnRpbWUgbG9hZGFibGUKKwkgIG1vZHVsZS4gVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZnRhcGUuCisKKwkgIE5vdGUgdGhhdCB0aGUgRnRhcGUtSE9XVE8gaXMgb3V0IG9mIGRhdGUgKHNvcnJ5KSBhbmQgZG9jdW1lbnRzIHRoZQorCSAgb2xkZXIgdmVyc2lvbiAyLjA4IG9mIHRoaXMgc29mdHdhcmUgYnV0IHN0aWxsIGNvbnRhaW5zIHVzZWZ1bAorCSAgaW5mb3JtYXRpb24uICBUaGVyZSBpcyBhIHdlYiBwYWdlIHdpdGggbW9yZSByZWNlbnQgZG9jdW1lbnRhdGlvbiBhdAorCSAgPGh0dHA6Ly93d3cuaW5zdG1hdGgucnd0aC1hYWNoZW4uZGUvfmhlaW5lL2Z0YXBlLz4uICBUaGlzIHBhZ2UKKwkgIGFsd2F5cyBjb250YWlucyB0aGUgbGF0ZXN0IHJlbGVhc2Ugb2YgdGhlIGZ0YXBlIGRyaXZlciBhbmQgdXNlZnVsCisJICBpbmZvcm1hdGlvbiAoYmFja3VwIHNvZnR3YXJlLCBmdGFwZSByZWxhdGVkIHBhdGNoZXMgYW5kCisJICBkb2N1bWVudGF0aW9uLCBGQVEpLiAgTm90ZSB0aGF0IHRoZSBmaWxlIHN5c3RlbSBpbnRlcmZhY2UgaGFzCisJICBjaGFuZ2VkIHF1aXRlIGEgYml0IGNvbXBhcmVkIHRvIHByZXZpb3VzIHZlcnNpb25zIG9mIGZ0YXBlLiAgUGxlYXNlCisJICByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vZnRhcGUudHh0Pi4KKworc291cmNlICJkcml2ZXJzL2NoYXIvZnRhcGUvS2NvbmZpZyIKKworZW5kbWVudQorCitzb3VyY2UgImRyaXZlcnMvY2hhci9hZ3AvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL2NoYXIvZHJtL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9jaGFyL3BjbWNpYS9LY29uZmlnIgorCitjb25maWcgTVdBVkUKKwl0cmlzdGF0ZSAiQUNQIE1vZGVtIChNd2F2ZSkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFg4NgorCXNlbGVjdCBTRVJJQUxfODI1MAorCS0tLWhlbHAtLS0KKwkgIFRoZSBBQ1AgbW9kZW0gKE13YXZlKSBmb3IgTGludXggaXMgYSBXaW5Nb2RlbS4gSXQgaXMgY29tcG9zZWQgb2YgYQorCSAga2VybmVsIGRyaXZlciBhbmQgYSB1c2VyIGxldmVsIGFwcGxpY2F0aW9uLiBUb2dldGhlciB0aGVzZSBjb21wb25lbnRzCisJICBzdXBwb3J0IGRpcmVjdCBhdHRhY2htZW50IHRvIHB1YmxpYyBzd2l0Y2hlZCB0ZWxlcGhvbmUgbmV0d29ya3MgKFBTVE5zKQorCSAgYW5kIHN1cHBvcnQgc2VsZWN0ZWQgd29ybGQgd2lkZSBjb3VudHJpZXMuCisKKwkgIFRoaXMgdmVyc2lvbiBvZiB0aGUgQUNQIE1vZGVtIGRyaXZlciBzdXBwb3J0cyB0aGUgSUJNIFRoaW5rcGFkIDYwMEUsCisJICA2MDAsIGFuZCA3NzAgdGhhdCBpbmNsdWRlIG9uIGJvYXJkIEFDUCBtb2RlbSBoYXJkd2FyZS4KKworCSAgVGhlIG1vZGVtIGFsc28gc3VwcG9ydHMgdGhlIHN0YW5kYXJkIGNvbW11bmljYXRpb25zIHBvcnQgaW50ZXJmYWNlCisJICAodHR5U3gpIGFuZCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEhheWVzIEFUIENvbW1hbmQgU2V0LgorCisJICBUaGUgdXNlciBsZXZlbCBhcHBsaWNhdGlvbiBuZWVkZWQgdG8gdXNlIHRoaXMgZHJpdmVyIGNhbiBiZSBmb3VuZCBhdAorCSAgdGhlIElCTSBMaW51eCBUZWNobm9sb2d5IENlbnRlciAoTFRDKSB3ZWIgc2l0ZToKKwkgIDxodHRwOi8vd3d3LmlibS5jb20vbGludXgvbHRjLz4uCisKKwkgIElmIHlvdSBvd24gb25lIG9mIHRoZSBhYm92ZSBJQk0gVGhpbmtwYWRzIHdoaWNoIGhhcyB0aGUgTXdhdmUgY2hpcHNldAorCSAgaW4gaXQsIHNheSBZLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtd2F2ZS4KKworY29uZmlnIFNDeDIwMF9HUElPCisJdHJpc3RhdGUgIk5hdFNlbWkgU0N4MjAwIEdQSU8gU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDeDIwMAorCWhlbHAKKwkgIEdpdmUgdXNlcnNwYWNlIGFjY2VzcyB0byB0aGUgR1BJTyBwaW5zIG9uIHRoZSBOYXRpb25hbAorCSAgU2VtaWNvbmR1Y3RvciBTQ3gyMDAgcHJvY2Vzc29ycy4KKworCSAgSWYgY29tcGlsZWQgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYmUgY2FsbGVkIHNjeDIwMF9ncGlvLgorCitjb25maWcgUkFXX0RSSVZFUgorCXRyaXN0YXRlICJSQVcgZHJpdmVyICgvZGV2L3Jhdy9yYXdOKSAoT0JTT0xFVEUpIgorCWhlbHAKKwkgIFRoZSByYXcgZHJpdmVyIHBlcm1pdHMgYmxvY2sgZGV2aWNlcyB0byBiZSBib3VuZCB0byAvZGV2L3Jhdy9yYXdOLiAKKwkgIE9uY2UgYm91bmQsIEkvTyBhZ2FpbnN0IC9kZXYvcmF3L3Jhd04gdXNlcyBlZmZpY2llbnQgemVyby1jb3B5IEkvTy4gCisJICBTZWUgdGhlIHJhdyg4KSBtYW5wYWdlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAgICAgICBUaGUgcmF3IGRyaXZlciBpcyBkZXByZWNhdGVkIGFuZCBtYXkgYmUgcmVtb3ZlZCBmcm9tIDIuNworICAgICAgICAgIGtlcm5lbHMuICBBcHBsaWNhdGlvbnMgc2hvdWxkIHNpbXBseSBvcGVuIHRoZSBkZXZpY2UgKGVnIC9kZXYvaGRhMSkKKyAgICAgICAgICB3aXRoIHRoZSBPX0RJUkVDVCBmbGFnLgorCitjb25maWcgSFBFVAorCWJvb2wgIkhQRVQgLSBIaWdoIFByZWNpc2lvbiBFdmVudCBUaW1lciIgaWYgKFg4NiB8fCBJQTY0KQorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQUNQSQorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBoYXZlIGEgbWlzY2RldmljZSBuYW1lZCAiL2Rldi9ocGV0LyIuICBFYWNoCisJICBvcGVuIHNlbGVjdHMgb25lIG9mIHRoZSB0aW1lcnMgc3VwcG9ydGVkIGJ5IHRoZSBIUEVULiAgVGhlIHRpbWVycyBhcmUKKwkgIG5vbi1wZXJpb2Rpb2MgYW5kL29yIHBlcmlvZGljLgorCitjb25maWcgSFBFVF9SVENfSVJRCisJYm9vbCAiSFBFVCBDb250cm9sIFJUQyBJUlEiIGlmICFIUEVUX0VNVUxBVEVfUlRDCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBIUEVUCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGRpc2FibGUgUlRDX0lSUSBpbiBkcml2ZXJzL2NoYXIvcnRjLmMuIEl0CisJICBpcyBhc3N1bWVkIHRoZSBwbGF0Zm9ybSBjYWxsZWQgaHBldF9hbGxvYyB3aXRoIHRoZSBSVEMgSVJRIHZhbHVlcyBmb3IKKwkgIHRoZSBIUEVUIHRpbWVycy4KKworY29uZmlnIEhQRVRfTU1BUAorCWJvb2wgIkFsbG93IG1tYXAgb2YgSFBFVCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhQRVQKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdXNlciBhcHBsaWNhdGlvbnMgd2lsbCBiZSBhYmxlIHRvIG1tYXAKKwkgIHRoZSBIUEVUIHJlZ2lzdGVycy4KKworCSAgSW4gc29tZSBoYXJkd2FyZSBpbXBsZW1lbnRhdGlvbnMsIHRoZSBwYWdlIGNvbnRhaW5pbmcgSFBFVAorCSAgcmVnaXN0ZXJzIG1heSBhbHNvIGNvbnRhaW4gb3RoZXIgdGhpbmdzIHRoYXQgc2hvdWxkbid0IGJlCisJICBleHBvc2VkIHRvIHRoZSB1c2VyLiAgSWYgdGhpcyBhcHBsaWVzIHRvIHlvdXIgaGFyZHdhcmUsCisJICBzYXkgTiBoZXJlLgorCitjb25maWcgTUFYX1JBV19ERVZTCisJaW50ICJNYXhpbXVtIG51bWJlciBvZiBSQVcgZGV2aWNlcyB0byBzdXBwb3J0ICgxLTgxOTIpIgorCWRlcGVuZHMgb24gUkFXX0RSSVZFUgorCWRlZmF1bHQgIjI1NiIKKwloZWxwCisJICBUaGUgbWF4aW11bSBudW1iZXIgb2YgUkFXIGRldmljZXMgdGhhdCBhcmUgc3VwcG9ydGVkLgorCSAgRGVmYXVsdCBpcyAyNTYuIEluY3JlYXNlIHRoaXMgbnVtYmVyIGluIGNhc2UgeW91IG5lZWQgbG90cyBvZgorCSAgcmF3IGRldmljZXMuCisKK2NvbmZpZyBIQU5HQ0hFQ0tfVElNRVIKKwl0cmlzdGF0ZSAiSGFuZ2NoZWNrIHRpbWVyIgorCWRlcGVuZHMgb24gWDg2XzY0IHx8IFg4NgorCWhlbHAKKwkgIFRoZSBoYW5nY2hlY2stdGltZXIgbW9kdWxlIGRldGVjdHMgd2hlbiB0aGUgc3lzdGVtIGhhcyBnb25lCisJICBvdXQgdG8gbHVuY2ggcGFzdCBhIGNlcnRhaW4gbWFyZ2luLiAgSXQgY2FuIHJlYm9vdCB0aGUgc3lzdGVtCisJICBvciBtZXJlbHkgcHJpbnQgYSB3YXJuaW5nLgorCitjb25maWcgTU1USU1FUgorCXRyaXN0YXRlICJNTVRJTUVSIE1lbW9yeSBtYXBwZWQgUlRDIGZvciBTR0kgQWx0aXgiCisJZGVwZW5kcyBvbiBJQTY0X0dFTkVSSUMgfHwgSUE2NF9TR0lfU04yCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIG1tdGltZXIgZGV2aWNlIGFsbG93cyBkaXJlY3QgdXNlcnNwYWNlIGFjY2VzcyB0byB0aGUKKwkgIEFsdGl4IHN5c3RlbSB0aW1lci4KKworc291cmNlICJkcml2ZXJzL2NoYXIvdHBtL0tjb25maWciCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZWQ3NmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxMTggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBrZXJuZWwgY2hhcmFjdGVyIGRldmljZSBkcml2ZXJzLgorIworCisjCisjIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZm9udCBtYXAgZm9yIHRoZSBkZWZhdWx0IChoYXJkd2FyZSkgZm9udAorIworRk9OVE1BUEZJTEUgPSBjcDQzNy51bmkKKworb2JqLXkJICs9IG1lbS5vIHJhbmRvbS5vIHR0eV9pby5vIG5fdHR5Lm8gdHR5X2lvY3RsLm8KKworb2JqLSQoQ09ORklHX0xFR0FDWV9QVFlTKQkrPSBwdHkubworb2JqLSQoQ09ORklHX1VOSVg5OF9QVFlTKQkrPSBwdHkubworb2JqLXkJCQkJKz0gbWlzYy5vCitvYmotJChDT05GSUdfVlQpCQkrPSB2dF9pb2N0bC5vIHZjX3NjcmVlbi5vIGNvbnNvbGVtYXAubyBcCisJCQkJICAgY29uc29sZW1hcF9kZWZ0YmwubyBzZWxlY3Rpb24ubyBrZXlib2FyZC5vCitvYmotJChDT05GSUdfSFdfQ09OU09MRSkJKz0gdnQubyBkZWZrZXltYXAubworb2JqLSQoQ09ORklHX01BR0lDX1NZU1JRKQkrPSBzeXNycS5vCitvYmotJChDT05GSUdfRVNQU0VSSUFMKQkJKz0gZXNwLm8KK29iai0kKENPTkZJR19NVk1FMTQ3X1NDQykJKz0gZ2VuZXJpY19zZXJpYWwubyB2bWVfc2NjLm8KK29iai0kKENPTkZJR19NVk1FMTYyX1NDQykJKz0gZ2VuZXJpY19zZXJpYWwubyB2bWVfc2NjLm8KK29iai0kKENPTkZJR19CVk1FNjAwMF9TQ0MpCSs9IGdlbmVyaWNfc2VyaWFsLm8gdm1lX3NjYy5vCitvYmotJChDT05GSUdfUk9DS0VUUE9SVCkJKz0gcm9ja2V0Lm8KK29iai0kKENPTkZJR19TRVJJQUwxNjcpCQkrPSBzZXJpYWwxNjcubworb2JqLSQoQ09ORklHX0NZQ0xBREVTKQkJKz0gY3ljbGFkZXMubworb2JqLSQoQ09ORklHX1NUQUxMSU9OKQkJKz0gc3RhbGxpb24ubworb2JqLSQoQ09ORklHX0lTVEFMTElPTikJCSs9IGlzdGFsbGlvbi5vCitvYmotJChDT05GSUdfRElHSUVQQ0EpCQkrPSBlcGNhLm8KK29iai0kKENPTkZJR19TUEVDSUFMSVgpCQkrPSBzcGVjaWFsaXgubworb2JqLSQoQ09ORklHX01PWEFfSU5URUxMSU8pCSs9IG1veGEubworb2JqLSQoQ09ORklHX0EyMjMyKQkJKz0gc2VyX2EyMjMyLm8gZ2VuZXJpY19zZXJpYWwubworb2JqLSQoQ09ORklHX0FUQVJJX0RTUDU2SykJKz0gZHNwNTZrLm8KK29iai0kKENPTkZJR19NT1hBX1NNQVJUSU8pCSs9IG14c2VyLm8KK29iai0kKENPTkZJR19DT01QVVRPTkUpCQkrPSBpcDIubyBpcDJtYWluLm8KK29iai0kKENPTkZJR19SSVNDT004KQkJKz0gcmlzY29tOC5vCitvYmotJChDT05GSUdfSVNJKQkJKz0gaXNpY29tLm8KK29iai0kKENPTkZJR19TWU5DTElOSykJCSs9IHN5bmNsaW5rLm8KK29iai0kKENPTkZJR19TWU5DTElOS01QKQkrPSBzeW5jbGlua21wLm8KK29iai0kKENPTkZJR19OX0hETEMpCQkrPSBuX2hkbGMubworb2JqLSQoQ09ORklHX0FNSUdBX0JVSUxUSU5fU0VSSUFMKSArPSBhbWlzZXJpYWwubworb2JqLSQoQ09ORklHX1NYKQkJKz0gc3gubyBnZW5lcmljX3NlcmlhbC5vCitvYmotJChDT05GSUdfUklPKQkJKz0gcmlvLyBnZW5lcmljX3NlcmlhbC5vCitvYmotJChDT05GSUdfSFZDX0NPTlNPTEUpCSs9IGh2Y19jb25zb2xlLm8gaHZzaS5vCitvYmotJChDT05GSUdfUkFXX0RSSVZFUikJKz0gcmF3Lm8KK29iai0kKENPTkZJR19TR0lfU05TQykJCSs9IHNuc2Mubworb2JqLSQoQ09ORklHX01NVElNRVIpCQkrPSBtbXRpbWVyLm8KK29iai0kKENPTkZJR19WSU9DT05TKSArPSB2aW9jb25zLm8KK29iai0kKENPTkZJR19WSU9UQVBFKQkJKz0gdmlvdGFwZS5vCitvYmotJChDT05GSUdfSFZDUykJCSs9IGh2Y3MubworCitvYmotJChDT05GSUdfUFJJTlRFUikgKz0gbHAubworb2JqLSQoQ09ORklHX1RJUEFSKSArPSB0aXBhci5vCisKK29iai0kKENPTkZJR19EVExLKSArPSBkdGxrLm8KK29iai0kKENPTkZJR19SMzk2NCkgKz0gbl9yMzk2NC5vCitvYmotJChDT05GSUdfQVBQTElDT00pICs9IGFwcGxpY29tLm8KK29iai0kKENPTkZJR19TT05ZUEkpICs9IHNvbnlwaS5vCitvYmotJChDT05GSUdfUlRDKSArPSBydGMubworb2JqLSQoQ09ORklHX0hQRVQpICs9IGhwZXQubworb2JqLSQoQ09ORklHX0dFTl9SVEMpICs9IGdlbnJ0Yy5vCitvYmotJChDT05GSUdfRUZJX1JUQykgKz0gZWZpcnRjLm8KK29iai0kKENPTkZJR19TR0lfRFMxMjg2KSArPSBkczEyODYubworb2JqLSQoQ09ORklHX1NHSV9JUDI3X1JUQykgKz0gaXAyNy1ydGMubworb2JqLSQoQ09ORklHX0RTMTMwMikgKz0gZHMxMzAyLm8KK29iai0kKENPTkZJR19TM0MyNDEwX1JUQykgKz0gczNjMjQxMC1ydGMubworb2JqLSQoQ09ORklHX1JUQ19WUjQxWFgpICs9IHZyNDF4eF9ydGMubworaWZlcSAoJChDT05GSUdfR0VORVJJQ19OVlJBTSkseSkKKyAgb2JqLSQoQ09ORklHX05WUkFNKSArPSBnZW5lcmljX252cmFtLm8KK2Vsc2UKKyAgb2JqLSQoQ09ORklHX05WUkFNKSArPSBudnJhbS5vCitlbmRpZgorb2JqLSQoQ09ORklHX1RPU0hJQkEpICs9IHRvc2hpYmEubworb2JqLSQoQ09ORklHX0k4SykgKz0gaThrLm8KK29iai0kKENPTkZJR19EUzE2MjApICs9IGRzMTYyMC5vCitvYmotJChDT05GSUdfSFdfUkFORE9NKSArPSBod19yYW5kb20ubworb2JqLSQoQ09ORklHX0ZUQVBFKSArPSBmdGFwZS8KK29iai0kKENPTkZJR19DT0JBTFRfTENEKSArPSBsY2Qubworb2JqLSQoQ09ORklHX1BQREVWKSArPSBwcGRldi5vCitvYmotJChDT05GSUdfTldCVVRUT04pICs9IG53YnV0dG9uLm8KK29iai0kKENPTkZJR19OV0ZMQVNIKSArPSBud2ZsYXNoLm8KK29iai0kKENPTkZJR19TQ3gyMDBfR1BJTykgKz0gc2N4MjAwX2dwaW8ubworb2JqLSQoQ09ORklHX1RBTkJBQ19UQjAyMTkpICs9IHRiMDIxOS5vCisKK29iai0kKENPTkZJR19XQVRDSERPRykJKz0gd2F0Y2hkb2cvCitvYmotJChDT05GSUdfTVdBVkUpICs9IG13YXZlLworb2JqLSQoQ09ORklHX0FHUCkgKz0gYWdwLworb2JqLSQoQ09ORklHX0RSTSkgKz0gZHJtLworb2JqLSQoQ09ORklHX1BDTUNJQSkgKz0gcGNtY2lhLworb2JqLSQoQ09ORklHX0lQTUlfSEFORExFUikgKz0gaXBtaS8KKworb2JqLSQoQ09ORklHX0hBTkdDSEVDS19USU1FUikgKz0gaGFuZ2NoZWNrLXRpbWVyLm8KK29iai0kKENPTkZJR19UQ0dfVFBNKSArPSB0cG0vCisjIEZpbGVzIGdlbmVyYXRlZCB0aGF0IHNoYWxsIGJlIHJlbW92ZWQgdXBvbiBtYWtlIGNsZWFuCitjbGVhbi1maWxlcyA6PSBjb25zb2xlbWFwX2RlZnRibC5jIGRlZmtleW1hcC5jIHF0cm9uaXhtYXAuYworCitxdWlldF9jbWRfY29ubWsgPSBDT05NSyAgICRACisgICAgICBjbWRfY29ubWsgPSBzY3JpcHRzL2Nvbm1ha2VoYXNoICQ8ID4gJEAKKworJChvYmopL2NvbnNvbGVtYXBfZGVmdGJsLmM6ICQoc3JjKS8kKEZPTlRNQVBGSUxFKQorCSQoY2FsbCBjbWQsY29ubWspCisKKyQob2JqKS9kZWZrZXltYXAubzogICQob2JqKS9kZWZrZXltYXAuYworCiskKG9iaikvcXRyb25peG1hcC5vOiAkKG9iaikvcXRyb25peG1hcC5jCisKKyMgVW5jb21tZW50IGlmIHlvdSdyZSBjaGFuZ2luZyB0aGUga2V5bWFwIGFuZCBoYXZlIGFuIGFwcHJvcHJpYXRlCisjIGxvYWRrZXlzIHZlcnNpb24gZm9yIHRoZSBtYXAuIEJ5IGRlZmF1bHQsIHdlJ2xsIHVzZSB0aGUgc2hpcHBlZAorIyB2ZXJzaW9ucy4KKyMgR0VORVJBVEVfS0VZTUFQIDo9IDEKKworaWZkZWYgR0VORVJBVEVfS0VZTUFQCisKKyQob2JqKS9kZWZrZXltYXAuYyAkKG9iaikvcXRyb25peG1hcC5jOiAkKG9iaikvJS5jOiAkKHNyYykvJS5tYXAKKwlsb2Fka2V5cyAtLW1rdGFibGUgJDwgPiAkQC50bXAKKwlzZWQgLWUgJ3MvXnN0YXRpYyAqLy8nICRALnRtcCA+ICRACisJcm0gJEAudG1wCisKK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvYWdwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4YzFiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvS2NvbmZpZwpAQCAtMCwwICsxLDE3MSBAQAorY29uZmlnIEFHUAorCXRyaXN0YXRlICIvZGV2L2FncGdhcnQgKEFHUCBTdXBwb3J0KSIgaWYgIUdBUlRfSU9NTVUKKwlkZXBlbmRzIG9uIEFMUEhBIHx8IElBNjQgfHwgUFBDIHx8IFg4NgorCWRlZmF1bHQgeSBpZiBHQVJUX0lPTU1VCisJLS0taGVscC0tLQorCSAgQUdQIChBY2NlbGVyYXRlZCBHcmFwaGljcyBQb3J0KSBpcyBhIGJ1cyBzeXN0ZW0gbWFpbmx5IHVzZWQgdG8KKwkgIGNvbm5lY3QgZ3JhcGhpY3MgY2FyZHMgdG8gdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4KKworCSAgSWYgeW91IGhhdmUgYW4gQUdQIHN5c3RlbSBhbmQgeW91IHNheSBZIGhlcmUsIGl0IHdpbGwgYmUgcG9zc2libGUgdG8KKwkgIHVzZSB0aGUgQUdQIGZlYXR1cmVzIG9mIHlvdXIgM0QgcmVuZGVyaW5nIHZpZGVvIGNhcmQuIFRoaXMgY29kZSBhY3RzCisJICBhcyBhIHNvcnQgb2YgIkFHUCBkcml2ZXIiIGZvciB0aGUgbW90aGVyYm9hcmQncyBjaGlwc2V0LgorCisJICBJZiB5b3UgbmVlZCBtb3JlIHRleHR1cmUgbWVtb3J5IHRoYW4geW91IGNhbiBnZXQgd2l0aCB0aGUgQUdQIEdBUlQKKwkgICh0aGVvcmV0aWNhbGx5IHVwIHRvIDI1NiBNQiwgYnV0IGluIHByYWN0aWNlIHVzdWFsbHkgNjQgb3IgMTI4IE1CCisJICBkdWUgdG8ga2VybmVsIGFsbG9jYXRpb24gaXNzdWVzKSwgeW91IGNvdWxkIHVzZSBQQ0kgYWNjZXNzZXMKKwkgIGFuZCBoYXZlIHVwIHRvIGEgY291cGxlIGdpZ3Mgb2YgdGV4dHVyZSBzcGFjZS4KKworCSAgTm90ZSB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgbWVhbnMgdG8gaGF2ZSBYRnJlZTQvR0xYIHVzZQorCSAgd3JpdGUtY29tYmluaW5nIHdpdGggTVRSUiBzdXBwb3J0IG9uIHRoZSBBR1AgYnVzLiBXaXRob3V0IGl0LCBPcGVuR0wKKwkgIGRpcmVjdCByZW5kZXJpbmcgd2lsbCBiZSBhIGxvdCBzbG93ZXIgYnV0IHN0aWxsIGZhc3RlciB0aGFuIFBJTy4KKworCSAgWW91IHNob3VsZCBzYXkgWSBoZXJlIGlmIHlvdSB1c2UgWEZyZWU4NiAzLjMuNiBvciA0LnggYW5kIHdhbnQgdG8KKwkgIHVzZSBHTFggb3IgRFJJLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWdwZ2FydC4KKworY29uZmlnIEFHUF9BTEkKKwl0cmlzdGF0ZSAiQUxJIGNoaXBzZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFHUCAmJiBYODYgJiYgIVg4Nl82NAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1Agc3VwcG9ydCBmb3IgdGhlIEdMWCBjb21wb25lbnQgb2YKKwkgIFhGcmVlODYgNC54IG9uIHRoZSBmb2xsb3dpbmcgQUxpIGNoaXBzZXRzLiAgVGhlIHN1cHBvcnRlZCBjaGlwc2V0cworCSAgaW5jbHVkZSBNMTU0MSwgTTE2MjEsIE0xNjMxLCBNMTYzMiwgTTE2NDEsTTE2NDcsYW5kIE0xNjUxLgorCSAgRm9yIHRoZSBBTGktY2hpcHNldCBxdWVzdGlvbiwgQUxpIHN1Z2dlc3RzIHlvdSByZWZlciB0bworCSAgPGh0dHA6Ly93d3cuYWxpLmNvbS50dy9lbmcvc3VwcG9ydC9pbmRleC5zaHRtbD4uCisKKwkgIFRoZSBNMTU0MSBjaGlwc2V0IGNhbiBkbyBBR1AgMXggYW5kIDJ4LCBidXQgbm90ZSB0aGF0IHRoZXJlIGlzIGFuCisJICBhY2tub3dsZWRnZWQgaW5jb21wYXRpYmlsaXR5IHdpdGggTWF0cm94IEcyMDAgY2FyZHMuIER1ZSB0bworCSAgdGltaW5nIGlzc3VlcywgdGhpcyBjaGlwc2V0IGNhbm5vdCBkbyBBR1AgMnggd2l0aCB0aGUgRzIwMC4KKwkgIFRoaXMgaXMgYSBoYXJkd2FyZSBsaW1pdGF0aW9uLiBBR1AgMXggc2VlbXMgdG8gYmUgZmluZSwgdGhvdWdoLgorCisJICBZb3Ugc2hvdWxkIHNheSBZIGhlcmUgaWYgeW91IHVzZSBYRnJlZTg2IDMuMy42IG9yIDQueCBhbmQgd2FudCB0bworCSAgdXNlIEdMWCBvciBEUkkuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQUdQX0FUSQorCXRyaXN0YXRlICJBVEkgY2hpcHNldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQUdQICYmIFg4NiAmJiAhWDg2XzY0CisJLS0taGVscC0tLQorICAgICAgVGhpcyBvcHRpb24gZ2l2ZXMgeW91IEFHUCBzdXBwb3J0IGZvciB0aGUgR0xYIGNvbXBvbmVudCBvZgorICAgICAgWEZyZWU4NiA0Lnggb24gdGhlIEFUSSBSYWRlb25JR1AgZmFtaWx5IG9mIGNoaXBzZXRzLgorCisgICAgICBZb3Ugc2hvdWxkIHNheSBZIGhlcmUgaWYgeW91IHVzZSBYRnJlZTg2IDMuMy42IG9yIDQueCBhbmQgd2FudCB0bworICAgICAgdXNlIEdMWCBvciBEUkkuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQUdQX0FNRAorCXRyaXN0YXRlICJBTUQgSXJvbmdhdGUsIDc2MSwgYW5kIDc2MiBjaGlwc2V0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBR1AgJiYgWDg2ICYmICFYODZfNjQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBnaXZlcyB5b3UgQUdQIHN1cHBvcnQgZm9yIHRoZSBHTFggY29tcG9uZW50IG9mCisJICBYRnJlZTg2IDQueCBvbiBBTUQgSXJvbmdhdGUsIDc2MSwgYW5kIDc2MiBjaGlwc2V0cy4KKworCSAgWW91IHNob3VsZCBzYXkgWSBoZXJlIGlmIHlvdSB1c2UgWEZyZWU4NiAzLjMuNiBvciA0LnggYW5kIHdhbnQgdG8KKwkgIHVzZSBHTFggb3IgRFJJLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEFHUF9BTUQ2NAorCXRyaXN0YXRlICJBTUQgT3B0ZXJvbi9BdGhsb242NCBvbi1DUFUgR0FSVCBzdXBwb3J0IiBpZiAhR0FSVF9JT01NVQorCWRlcGVuZHMgb24gQUdQICYmIFg4NgorCWRlZmF1bHQgeSBpZiBHQVJUX0lPTU1VCisJaGVscAorCSAgVGhpcyBvcHRpb24gZ2l2ZXMgeW91IEFHUCBzdXBwb3J0IGZvciB0aGUgR0xYIGNvbXBvbmVudCBvZgorCSAgWEZyZWU4NiA0LnggdXNpbmcgdGhlIG9uLUNQVSBub3J0aGJyaWRnZSBvZiB0aGUgQU1EIEF0aGxvbjY0L09wdGVyb24gQ1BVcy4KKwkgIFlvdSBzdGlsbCBuZWVkIGFuIGV4dGVybmFsIEFHUCBicmlkZ2UgbGlrZSB0aGUgQU1EIDgxNTEsIFZJQQorICAgICAgICAgIEs4VDQwME0sIFNpUzc1NS4gSXQgbWF5IGFsc28gc3VwcG9ydCBvdGhlciBBR1AgYnJpZGdlcyB3aGVuIGxvYWRlZAorCSAgd2l0aCBhZ3BfdHJ5X3Vuc3VwcG9ydGVkPTEuCisJICBZb3Ugc2hvdWxkIHNheSBZIGhlcmUgaWYgeW91IHVzZSBYRnJlZTg2IDMuMy42IG9yIDQueCBhbmQgd2FudCB0bworCSAgdXNlIEdMWCBvciBEUkkuICBJZiB1bnN1cmUsIHNheSBZCisKK2NvbmZpZyBBR1BfSU5URUwKKwl0cmlzdGF0ZSAiSW50ZWwgNDQwTFgvQlgvR1gsIEk4eHggYW5kIEU3eDA1IGNoaXBzZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFHUCAmJiBYODYKKwloZWxwCisJICBUaGlzIG9wdGlvbiBnaXZlcyB5b3UgQUdQIHN1cHBvcnQgZm9yIHRoZSBHTFggY29tcG9uZW50IG9mIFhGcmVlODYgNC54CisJICBvbiBJbnRlbCA0NDBMWC9CWC9HWCwgODE1LCA4MjAsIDgzMCwgODQwLCA4NDUsIDg1MCwgODYwLCA4NzUsCisJICBFNzIwNSBhbmQgRTc1MDUgY2hpcHNldHMgYW5kIGZ1bGwgc3VwcG9ydCBmb3IgdGhlIDgxMCwgODE1LCA4MzBNLCA4NDVHLAorCSAgODUyR00sIDg1NUdNLCA4NjVHIGFuZCBJOTE1IGludGVncmF0ZWQgZ3JhcGhpY3MgY2hpcHNldHMuCisKKwkgIFlvdSBzaG91bGQgc2F5IFkgaGVyZSBpZiB5b3UgdXNlIFhGcmVlODYgMy4zLjYgb3IgNC54IGFuZCB3YW50IHRvCisJICB1c2UgR0xYIG9yIERSSSwgb3IgaWYgeW91IGhhdmUgYW55IEludGVsIGludGVncmF0ZWQgZ3JhcGhpY3MKKwkgIGNoaXBzZXRzLiAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIEFHUF9OVklESUEKKwl0cmlzdGF0ZSAiTlZJRElBIG5Gb3JjZS9uRm9yY2UyIGNoaXBzZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFHUCAmJiBYODYgJiYgIVg4Nl82NAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1Agc3VwcG9ydCBmb3IgdGhlIEdMWCBjb21wb25lbnQgb2YKKwkgIFhGcmVlODYgNC54IG9uIHRoZSBmb2xsb3dpbmcgTlZJRElBIGNoaXBzZXRzLiAgVGhlIHN1cHBvcnRlZCBjaGlwc2V0cworCSAgaW5jbHVkZSBuRm9yY2UgYW5kIG5Gb3JjZTIKKworY29uZmlnIEFHUF9TSVMKKwl0cmlzdGF0ZSAiU2lTIGNoaXBzZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFHUCAmJiBYODYgJiYgIVg4Nl82NAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1Agc3VwcG9ydCBmb3IgdGhlIEdMWCBjb21wb25lbnQgb2YKKwkgIFhGcmVlODYgNC54IG9uIFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIFtTaVNdIGNoaXBzZXRzLgorCisJICBOb3RlIHRoYXQgNTU5MS81NTkyIEFHUCBjaGlwc2V0cyBhcmUgTk9UIHN1cHBvcnRlZC4KKworCSAgWW91IHNob3VsZCBzYXkgWSBoZXJlIGlmIHlvdSB1c2UgWEZyZWU4NiAzLjMuNiBvciA0LnggYW5kIHdhbnQgdG8KKwkgIHVzZSBHTFggb3IgRFJJLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEFHUF9TV09SS1MKKwl0cmlzdGF0ZSAiU2VydmVyd29ya3MgTEUvSEUgY2hpcHNldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQUdQICYmIFg4NiAmJiAhWDg2XzY0CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBTZXJ2ZXJ3b3JrcyBBR1AgY2FyZC4gIFNlZSAKKwkgIDxodHRwOi8vd3d3LnNlcnZlcndvcmtzLmNvbS8+IGZvciBwcm9kdWN0IGRlc2NyaXB0aW9ucyBhbmQgaW1hZ2VzLgorCitjb25maWcgQUdQX1ZJQQorCXRyaXN0YXRlICJWSUEgY2hpcHNldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQUdQICYmIFg4NiAmJiAhWDg2XzY0CisJaGVscAorCSAgVGhpcyBvcHRpb24gZ2l2ZXMgeW91IEFHUCBzdXBwb3J0IGZvciB0aGUgR0xYIGNvbXBvbmVudCBvZgorCSAgWEZyZWU4NiA0Lnggb24gVklBIE1WUDMvQXBvbGxvIFBybyBjaGlwc2V0cy4KKworCSAgWW91IHNob3VsZCBzYXkgWSBoZXJlIGlmIHlvdSB1c2UgWEZyZWU4NiAzLjMuNiBvciA0LnggYW5kIHdhbnQgdG8KKwkgIHVzZSBHTFggb3IgRFJJLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEFHUF9JNDYwCisJdHJpc3RhdGUgIkludGVsIDQ2MEdYIGNoaXBzZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFHUCAmJiAoSUE2NF9ESUcgfHwgSUE2NF9HRU5FUklDKQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1AgR0FSVCBzdXBwb3J0IGZvciB0aGUgSW50ZWwgNDYwR1ggY2hpcHNldAorCSAgZm9yIElBNjQgcHJvY2Vzc29ycy4KKworY29uZmlnIEFHUF9IUF9aWDEKKwl0cmlzdGF0ZSAiSFAgWlgxIGNoaXBzZXQgQUdQIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBR1AgJiYgKElBNjRfSFBfWlgxIHx8IElBNjRfSFBfWlgxX1NXSU9UTEIgfHwgSUE2NF9HRU5FUklDKQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1AgR0FSVCBzdXBwb3J0IGZvciB0aGUgSFAgWlgxIGNoaXBzZXQKKwkgIGZvciBJQTY0IHByb2Nlc3NvcnMuCisKK2NvbmZpZyBBR1BfQUxQSEFfQ09SRQorCXRyaXN0YXRlICJBbHBoYSBBR1Agc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFHUCAmJiAoQUxQSEFfR0VORVJJQyB8fCBBTFBIQV9USVRBTiB8fCBBTFBIQV9NQVJWRUwpCisJZGVmYXVsdCBBR1AKKworY29uZmlnIEFHUF9VTklOT1JUSAorCXRyaXN0YXRlICJBcHBsZSBVbmlOb3J0aCAmIFUzIEFHUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQUdQICYmIFBQQ19QTUFDCisJaGVscAorCSAgVGhpcyBvcHRpb24gZ2l2ZXMgeW91IEFHUCBzdXBwb3J0IGZvciBBcHBsZSBtYWNoaW5lcyB3aXRoIGEKKwkgIFVuaU5vcnRoIG9yIFUzIChBcHBsZSBHNSkgYnJpZGdlLgorCitjb25maWcgQUdQX0VGRklDRU9OCisJdHJpc3RhdGUgIlRyYW5zbWV0YSBFZmZpY2VvbiBzdXBwb3J0IgorCWRlcGVuZHMgb24gQUdQICYmIFg4NiAmJiAhWDg2XzY0CisJaGVscAorCSAgVGhpcyBvcHRpb24gZ2l2ZXMgeW91IEFHUCBzdXBwb3J0IGZvciB0aGUgVHJhbnNtZXRhIEVmZmljZW9uCisJICBzZXJpZXMgcHJvY2Vzc29ycyB3aXRoIGludGVncmF0ZWQgbm9ydGhicmlkZ2VzLgorCisJICBZb3Ugc2hvdWxkIHNheSBZIGhlcmUgaWYgeW91IHVzZSBYRnJlZTg2IDMuMy42IG9yIDQueCBhbmQgd2FudCB0bworCSAgdXNlIEdMWCBvciBEUkkuICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgQUdQX1NHSV9USU9DQQorICAgICAgICB0cmlzdGF0ZSAiU0dJIFRJTyBjaGlwc2V0IEFHUCBzdXBwb3J0IgorICAgICAgICBkZXBlbmRzIG9uIEFHUCAmJiAoSUE2NF9TR0lfU04yIHx8IElBNjRfR0VORVJJQykKKyAgICAgICAgaGVscAorICAgICAgICAgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1AgR0FSVCBzdXBwb3J0IGZvciB0aGUgU0dJIFRJTyBjaGlwc2V0CisgICAgICAgICAgZm9yIElBNjQgcHJvY2Vzc29ycy4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9hZ3AvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzYTIyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvTWFrZWZpbGUKQEAgLTAsMCArMSwxOCBAQAorYWdwZ2FydC15IDo9IGJhY2tlbmQubyBmcm9udGVuZC5vIGdlbmVyaWMubyBpc29jaC5vCisKK29iai0kKENPTkZJR19BR1ApCQkrPSBhZ3BnYXJ0Lm8KK29iai0kKENPTkZJR19BR1BfQUxJKQkJKz0gYWxpLWFncC5vCitvYmotJChDT05GSUdfQUdQX0FUSSkJCSs9IGF0aS1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9BTUQpCQkrPSBhbWQtazctYWdwLm8KK29iai0kKENPTkZJR19BR1BfQU1ENjQpCQkrPSBhbWQ2NC1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9BTFBIQV9DT1JFKQkrPSBhbHBoYS1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9FRkZJQ0VPTikJKz0gZWZmaWNlb24tYWdwLm8KK29iai0kKENPTkZJR19BR1BfSFBfWlgxKQkrPSBocC1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9JNDYwKQkJKz0gaTQ2MC1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9JTlRFTCkJCSs9IGludGVsLWFncC5vCitvYmotJChDT05GSUdfQUdQX05WSURJQSkJKz0gbnZpZGlhLWFncC5vCitvYmotJChDT05GSUdfQUdQX1NHSV9USU9DQSkJKz0gc2dpLWFncC5vCitvYmotJChDT05GSUdfQUdQX1NJUykJCSs9IHNpcy1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9TV09SS1MpCSs9IHN3b3Jrcy1hZ3Aubworb2JqLSQoQ09ORklHX0FHUF9VTklOT1JUSCkJKz0gdW5pbm9ydGgtYWdwLm8KK29iai0kKENPTkZJR19BR1BfVklBKQkJKz0gdmlhLWFncC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2FncC5oIGIvZHJpdmVycy9jaGFyL2FncC9hZ3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDljMTEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hZ3AuaApAQCAtMCwwICsxLDMzMSBAQAorLyoKKyAqIEFHUEdBUlQKKyAqIENvcHlyaWdodCAoQykgMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBEYXZlIEpvbmVzCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgSmVmZiBIYXJ0bWFubgorICogQ29weXJpZ2h0IChDKSAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgWGkgR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEpFRkYgSEFSVE1BTk4sIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIAorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIAorICogT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX0FHUF9CQUNLRU5EX1BSSVZfSAorI2RlZmluZSBfQUdQX0JBQ0tFTkRfUFJJVl9IIDEKKworI2luY2x1ZGUgPGFzbS9hZ3AuaD4JLyogZm9yIGZsdXNoX2FncF9jYWNoZSgpICovCisKKyNkZWZpbmUgUEZYICJhZ3BnYXJ0OiAiCisKKy8vI2RlZmluZSBBR1BfREVCVUcgMQorI2lmZGVmIEFHUF9ERUJVRworI2RlZmluZSBEQkcoeCx5Li4uKSBwcmludGsgKEtFUk5fREVCVUcgUEZYICIlczogIiB4ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjIHkpCisjZWxzZQorI2RlZmluZSBEQkcoeCx5Li4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9icmlkZ2U7CisKK2VudW0gYXBlcl9zaXplX3R5cGUgeworCVU4X0FQRVJfU0laRSwKKwlVMTZfQVBFUl9TSVpFLAorCVUzMl9BUEVSX1NJWkUsCisJTFZMMl9BUEVSX1NJWkUsCisJRklYRURfQVBFUl9TSVpFCit9OworCitzdHJ1Y3QgZ2F0dF9tYXNrIHsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdTMyIHR5cGU7CisJLyogdG90YWxseSBkZXZpY2Ugc3BlY2lmaWMsIGZvciBpbnRlZ3JhdGVkIGNoaXBzZXRzIHRoYXQgCisJICogbWlnaHQgaGF2ZSBkaWZmZXJlbnQgdHlwZXMgb2YgbWVtb3J5IG1hc2tzLiAgRm9yIG90aGVyCisJICogZGV2aWNlcyB0aGlzIHdpbGwgcHJvYmFibHkgYmUgaWdub3JlZCAqLworfTsKKworc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggeworCWludCBzaXplOworCWludCBudW1fZW50cmllczsKKwlpbnQgcGFnZV9vcmRlcjsKKwl1OCBzaXplX3ZhbHVlOworfTsKKworc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzE2IHsKKwlpbnQgc2l6ZTsKKwlpbnQgbnVtX2VudHJpZXM7CisJaW50IHBhZ2Vfb3JkZXI7CisJdTE2IHNpemVfdmFsdWU7Cit9OworCitzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgeworCWludCBzaXplOworCWludCBudW1fZW50cmllczsKKwlpbnQgcGFnZV9vcmRlcjsKKwl1MzIgc2l6ZV92YWx1ZTsKK307CisKK3N0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyIHsKKwlpbnQgc2l6ZTsKKwlpbnQgbnVtX2VudHJpZXM7CisJdTMyIHNpemVfdmFsdWU7Cit9OworCitzdHJ1Y3QgYXBlcl9zaXplX2luZm9fZml4ZWQgeworCWludCBzaXplOworCWludCBudW1fZW50cmllczsKKwlpbnQgcGFnZV9vcmRlcjsKK307CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciB7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisJdm9pZCAqYXBlcnR1cmVfc2l6ZXM7CisJaW50IG51bV9hcGVydHVyZV9zaXplczsKKwllbnVtIGFwZXJfc2l6ZV90eXBlIHNpemVfdHlwZTsKKwlpbnQgY2FudF91c2VfYXBlcnR1cmU7CisJaW50IG5lZWRzX3NjcmF0Y2hfcGFnZTsKKwlzdHJ1Y3QgZ2F0dF9tYXNrICptYXNrczsKKwlpbnQgKCpmZXRjaF9zaXplKSh2b2lkKTsKKwlpbnQgKCpjb25maWd1cmUpKHZvaWQpOworCXZvaWQgKCphZ3BfZW5hYmxlKShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICosIHUzMik7CisJdm9pZCAoKmNsZWFudXApKHZvaWQpOworCXZvaWQgKCp0bGJfZmx1c2gpKHN0cnVjdCBhZ3BfbWVtb3J5ICopOworCXVuc2lnbmVkIGxvbmcgKCptYXNrX21lbW9yeSkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqLAorCQl1bnNpZ25lZCBsb25nLCBpbnQpOworCXZvaWQgKCpjYWNoZV9mbHVzaCkodm9pZCk7CisJaW50ICgqY3JlYXRlX2dhdHRfdGFibGUpKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKik7CisJaW50ICgqZnJlZV9nYXR0X3RhYmxlKShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICopOworCWludCAoKmluc2VydF9tZW1vcnkpKHN0cnVjdCBhZ3BfbWVtb3J5ICosIG9mZl90LCBpbnQpOworCWludCAoKnJlbW92ZV9tZW1vcnkpKHN0cnVjdCBhZ3BfbWVtb3J5ICosIG9mZl90LCBpbnQpOworCXN0cnVjdCBhZ3BfbWVtb3J5ICooKmFsbG9jX2J5X3R5cGUpIChzaXplX3QsIGludCk7CisJdm9pZCAoKmZyZWVfYnlfdHlwZSkoc3RydWN0IGFncF9tZW1vcnkgKik7CisJdm9pZCAqKCphZ3BfYWxsb2NfcGFnZSkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqKTsKKwl2b2lkICgqYWdwX2Rlc3Ryb3lfcGFnZSkodm9pZCAqKTsKK307CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgeworCXN0cnVjdCBhZ3BfdmVyc2lvbiAqdmVyc2lvbjsKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgKmRyaXZlcjsKKwlzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgKnZtX29wczsKKwl2b2lkICpwcmV2aW91c19zaXplOworCXZvaWQgKmN1cnJlbnRfc2l6ZTsKKwl2b2lkICpkZXZfcHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJdTMyIF9faW9tZW0gKmdhdHRfdGFibGU7CisJdTMyICpnYXR0X3RhYmxlX3JlYWw7CisJdW5zaWduZWQgbG9uZyBzY3JhdGNoX3BhZ2U7CisJdW5zaWduZWQgbG9uZyBzY3JhdGNoX3BhZ2VfcmVhbDsKKwl1bnNpZ25lZCBsb25nIGdhcnRfYnVzX2FkZHI7CisJdW5zaWduZWQgbG9uZyBnYXR0X2J1c19hZGRyOworCXUzMiBtb2RlOworCWVudW0gY2hpcHNldF90eXBlIHR5cGU7CisJdW5zaWduZWQgbG9uZyAqa2V5X2xpc3Q7CisJYXRvbWljX3QgY3VycmVudF9tZW1vcnlfYWdwOworCWF0b21pY190IGFncF9pbl91c2U7CisJaW50IG1heF9tZW1vcnlfYWdwOwkvKiBpbiBudW1iZXIgb2YgcGFnZXMgKi8KKwlpbnQgYXBlcnR1cmVfc2l6ZV9pZHg7CisJaW50IGNhcG5keDsKKwlpbnQgZmxhZ3M7CisJY2hhciBtYWpvcl92ZXJzaW9uOworCWNoYXIgbWlub3JfdmVyc2lvbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisjZGVmaW5lIEtCKHgpCSgoeCkgKiAxMDI0KQorI2RlZmluZSBNQih4KQkoS0IgKEtCICh4KSkpCisjZGVmaW5lIEdCKHgpCShNQiAoS0IgKHgpKSkKKworI2RlZmluZSBBX1NJWkVfOCh4KQkoKHN0cnVjdCBhcGVyX3NpemVfaW5mb184ICopIHgpCisjZGVmaW5lIEFfU0laRV8xNih4KQkoKHN0cnVjdCBhcGVyX3NpemVfaW5mb18xNiAqKSB4KQorI2RlZmluZSBBX1NJWkVfMzIoeCkJKChzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgKikgeCkKKyNkZWZpbmUgQV9TSVpFX0xWTDIoeCkJKChzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiAqKSB4KQorI2RlZmluZSBBX1NJWkVfRklYKHgpCSgoc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICopIHgpCisjZGVmaW5lIEFfSURYOChicmlkZ2UpCShBX1NJWkVfOCgoYnJpZGdlKS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcykgKyBpKQorI2RlZmluZSBBX0lEWDE2KGJyaWRnZSkJKEFfU0laRV8xNigoYnJpZGdlKS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcykgKyBpKQorI2RlZmluZSBBX0lEWDMyKGJyaWRnZSkJKEFfU0laRV8zMigoYnJpZGdlKS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcykgKyBpKQorI2RlZmluZSBNQVhLRVkJCSg0MDk2ICogMzIpCisKKyNkZWZpbmUgUEdFX0VNUFRZKGIsIHApCSghKHApIHx8IChwKSA9PSAodW5zaWduZWQgbG9uZykgKGIpLT5zY3JhdGNoX3BhZ2UpCisKKworLyogSW50ZWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIElOVEVMX0FQU0laRQkweGI0CisjZGVmaW5lIElOVEVMX0FUVEJBU0UJMHhiOAorI2RlZmluZSBJTlRFTF9BR1BDVFJMCTB4YjAKKyNkZWZpbmUgSU5URUxfTkJYQ0ZHCTB4NTAKKyNkZWZpbmUgSU5URUxfRVJSU1RTCTB4OTEKKworLyogSW50ZWwgaTgzMCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSTgzMF9HTUNIX0NUUkwJCQkweDUyCisjZGVmaW5lIEk4MzBfR01DSF9FTkFCTEVECQkweDQKKyNkZWZpbmUgSTgzMF9HTUNIX01FTV9NQVNLCQkweDEKKyNkZWZpbmUgSTgzMF9HTUNIX01FTV82NE0JCTB4MQorI2RlZmluZSBJODMwX0dNQ0hfTUVNXzEyOE0JCTAKKyNkZWZpbmUgSTgzMF9HTUNIX0dNU19NQVNLCQkweDcwCisjZGVmaW5lIEk4MzBfR01DSF9HTVNfRElTQUJMRUQJCTB4MDAKKyNkZWZpbmUgSTgzMF9HTUNIX0dNU19MT0NBTAkJMHgxMAorI2RlZmluZSBJODMwX0dNQ0hfR01TX1NUT0xFTl81MTIJMHgyMAorI2RlZmluZSBJODMwX0dNQ0hfR01TX1NUT0xFTl8xMDI0CTB4MzAKKyNkZWZpbmUgSTgzMF9HTUNIX0dNU19TVE9MRU5fODE5MgkweDQwCisjZGVmaW5lIEk4MzBfUkRSQU1fQ0hBTk5FTF9UWVBFCQkweDAzMDEwCisjZGVmaW5lIEk4MzBfUkRSQU1fTkQoeCkJCSgoKHgpICYgMHgyMCkgPj4gNSkKKyNkZWZpbmUgSTgzMF9SRFJBTV9ERFQoeCkJCSgoKHgpICYgMHgxOCkgPj4gMykKKworLyogVGhpcyBvbmUgaXMgZm9yIEk4MzBNUCB3LiBhbiBleHRlcm5hbCBncmFwaGljIGNhcmQgKi8KKyNkZWZpbmUgSU5URUxfSTgzMF9FUlJTVFMJMHg5MgorCisvKiBJbnRlbCA4NTVHTS84NTJHTSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSTg1NV9HTUNIX0dNU19TVE9MRU5fME0JCTB4MAorI2RlZmluZSBJODU1X0dNQ0hfR01TX1NUT0xFTl8xTQkJKDB4MSA8PCA0KQorI2RlZmluZSBJODU1X0dNQ0hfR01TX1NUT0xFTl80TQkJKDB4MiA8PCA0KQorI2RlZmluZSBJODU1X0dNQ0hfR01TX1NUT0xFTl84TQkJKDB4MyA8PCA0KQorI2RlZmluZSBJODU1X0dNQ0hfR01TX1NUT0xFTl8xNk0JKDB4NCA8PCA0KQorI2RlZmluZSBJODU1X0dNQ0hfR01TX1NUT0xFTl8zMk0JKDB4NSA8PCA0KQorI2RlZmluZSBJODVYX0NBUElECQkJMHg0NAorI2RlZmluZSBJODVYX1ZBUklBTlRfTUFTSwkJMHg3CisjZGVmaW5lIEk4NVhfVkFSSUFOVF9TSElGVAkJNQorI2RlZmluZSBJODU1X0dNRQkJCTB4MAorI2RlZmluZSBJODU1X0dNCQkJCTB4NAorI2RlZmluZSBJODUyX0dNRQkJCTB4MgorI2RlZmluZSBJODUyX0dNCQkJCTB4NQorCisvKiBJbnRlbCBpODQ1IHJlZ2lzdGVycyAqLworI2RlZmluZSBJTlRFTF9JODQ1X0FHUE0JCTB4NTEKKyNkZWZpbmUgSU5URUxfSTg0NV9FUlJTVFMJMHhjOAorCisvKiBJbnRlbCBpODYwIHJlZ2lzdGVycyAqLworI2RlZmluZSBJTlRFTF9JODYwX01DSENGRwkweDUwCisjZGVmaW5lIElOVEVMX0k4NjBfRVJSU1RTCTB4YzgKKworLyogSW50ZWwgaTgxMCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSTgxMF9HTUFERFIJCTB4MTAKKyNkZWZpbmUgSTgxMF9NTUFERFIJCTB4MTQKKyNkZWZpbmUgSTgxMF9QVEVfQkFTRQkJMHgxMDAwMAorI2RlZmluZSBJODEwX1BURV9NQUlOX1VOQ0FDSEVECTB4MDAwMDAwMDAKKyNkZWZpbmUgSTgxMF9QVEVfTE9DQUwJCTB4MDAwMDAwMDIKKyNkZWZpbmUgSTgxMF9QVEVfVkFMSUQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgSTgxMF9TTVJBTV9NSVNDQwkweDcwCisjZGVmaW5lIEk4MTBfR0ZYX01FTV9XSU5fU0laRQkweDAwMDEwMDAwCisjZGVmaW5lIEk4MTBfR0ZYX01FTV9XSU5fMzJNCTB4MDAwMTAwMDAKKyNkZWZpbmUgSTgxMF9HTVMJCTB4MDAwMDAwYzAKKyNkZWZpbmUgSTgxMF9HTVNfRElTQUJMRQkweDAwMDAwMDAwCisjZGVmaW5lIEk4MTBfUEdFVEJMX0NUTAkJMHgyMDIwCisjZGVmaW5lIEk4MTBfUEdFVEJMX0VOQUJMRUQJMHgwMDAwMDAwMQorI2RlZmluZSBJODEwX0RSQU1fQ1RMCQkweDMwMDAKKyNkZWZpbmUgSTgxMF9EUkFNX1JPV18wCQkweDAwMDAwMDAxCisjZGVmaW5lIEk4MTBfRFJBTV9ST1dfMF9TRFJBTQkweDAwMDAwMDAxCisKK3N0cnVjdCBhZ3BfZGV2aWNlX2lkcyB7CisJdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkOyAvKiBmaXJzdCwgdG8gbWFrZSB0YWJsZSBlYXNpZXIgdG8gcmVhZCAqLworCWVudW0gY2hpcHNldF90eXBlIGNoaXBzZXQ7CisJY29uc3QgY2hhciAqY2hpcHNldF9uYW1lOworCWludCAoKmNoaXBzZXRfc2V0dXApIChzdHJ1Y3QgcGNpX2RldiAqcGRldik7CS8qIHVzZWQgdG8gb3ZlcnJpZGUgZ2VuZXJpYyAqLworfTsKKworLyogRHJpdmVyIHJlZ2lzdHJhdGlvbiAqLworc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYWdwX2FsbG9jX2JyaWRnZSh2b2lkKTsKK3ZvaWQgYWdwX3B1dF9icmlkZ2Uoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKTsKK2ludCBhZ3BfYWRkX2JyaWRnZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpOwordm9pZCBhZ3BfcmVtb3ZlX2JyaWRnZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpOworCisvKiBGcm9udGVuZCByb3V0aW5lcy4gKi8KK2ludCBhZ3BfZnJvbnRlbmRfaW5pdGlhbGl6ZSh2b2lkKTsKK3ZvaWQgYWdwX2Zyb250ZW5kX2NsZWFudXAodm9pZCk7CisKKy8qIEdlbmVyaWMgcm91dGluZXMuICovCit2b2lkIGFncF9nZW5lcmljX2VuYWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHUzMiBtb2RlKTsKK2ludCBhZ3BfZ2VuZXJpY19jcmVhdGVfZ2F0dF90YWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpOworaW50IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpOworc3RydWN0IGFncF9tZW1vcnkgKmFncF9jcmVhdGVfbWVtb3J5KGludCBzY3JhdGNoX3BhZ2VzKTsKK2ludCBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSk7CitpbnQgYWdwX2dlbmVyaWNfcmVtb3ZlX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpOworc3RydWN0IGFncF9tZW1vcnkgKmFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUoc2l6ZV90IHBhZ2VfY291bnQsIGludCB0eXBlKTsKK3ZvaWQgYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlKHN0cnVjdCBhZ3BfbWVtb3J5ICpjdXJyKTsKK3ZvaWQgKmFncF9nZW5lcmljX2FsbG9jX3BhZ2Uoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKTsKK3ZvaWQgYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlKHZvaWQgKmFkZHIpOwordm9pZCBhZ3BfZnJlZV9rZXkoaW50IGtleSk7CitpbnQgYWdwX251bV9lbnRyaWVzKHZvaWQpOwordTMyIGFncF9jb2xsZWN0X2RldmljZV9zdGF0dXMoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCB1MzIgbW9kZSwgdTMyIGNvbW1hbmQpOwordm9pZCBhZ3BfZGV2aWNlX2NvbW1hbmQodTMyIGNvbW1hbmQsIGludCBhZ3BfdjMpOworaW50IGFncF8zXzVfZW5hYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSk7Cit2b2lkIGdsb2JhbF9jYWNoZV9mbHVzaCh2b2lkKTsKK3ZvaWQgZ2V0X2FncF92ZXJzaW9uKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSk7Cit1bnNpZ25lZCBsb25nIGFncF9nZW5lcmljX21hc2tfbWVtb3J5KHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGludCB0eXBlKTsKK3N0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9nZW5lcmljX2ZpbmRfYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworLyogZ2VuZXJpYyByb3V0aW5lcyBmb3IgYWdwPj0zICovCitpbnQgYWdwM19nZW5lcmljX2ZldGNoX3NpemUodm9pZCk7Cit2b2lkIGFncDNfZ2VuZXJpY190bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKTsKK2ludCBhZ3AzX2dlbmVyaWNfY29uZmlndXJlKHZvaWQpOwordm9pZCBhZ3AzX2dlbmVyaWNfY2xlYW51cCh2b2lkKTsKKworLyogYXBlcnR1cmUgc2l6ZXMgaGF2ZSBiZWVuIHN0YW5kYXJkaXNlZCBzaW5jZSB2MyAqLworI2RlZmluZSBBR1BfR0VORVJJQ19TSVpFU19FTlRSSUVTIDExCitleHRlcm4gc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzE2IGFncDNfZ2VuZXJpY19zaXplc1tdOworCisKK2V4dGVybiBpbnQgYWdwX29mZjsKK2V4dGVybiBpbnQgYWdwX3RyeV91bnN1cHBvcnRlZF9ib290OworCisvKiBDaGlwc2V0IGluZGVwZW5kYW50IHJlZ2lzdGVycyAoZnJvbSBBR1AgU3BlYykgKi8KKyNkZWZpbmUgQUdQX0FQQkFTRQkweDEwCisKKyNkZWZpbmUgQUdQU1RBVAkJMHg0CisjZGVmaW5lIEFHUENNRAkJMHg4CisjZGVmaW5lIEFHUE5JU1RBVAkweGMKKyNkZWZpbmUgQUdQQ1RSTAkJMHgxMAorI2RlZmluZSBBR1BBUFNJWkUJMHgxNAorI2RlZmluZSBBR1BORVBHCQkweDE2CisjZGVmaW5lIEFHUEdBUlRMTwkweDE4CisjZGVmaW5lIEFHUEdBUlRISQkweDFjCisjZGVmaW5lIEFHUE5JQ01ECTB4MjAKKworI2RlZmluZSBBR1BfTUFKT1JfVkVSU0lPTl9TSElGVAkoMjApCisjZGVmaW5lIEFHUF9NSU5PUl9WRVJTSU9OX1NISUZUCSgxNikKKworI2RlZmluZSBBR1BTVEFUX1JRX0RFUFRICSgweGZmMDAwMDAwKQorI2RlZmluZSBBR1BTVEFUX1JRX0RFUFRIX1NISUZUCTI0CisKKyNkZWZpbmUgQUdQU1RBVF9DQUxfTUFTSwkoMTw8MTJ8MTw8MTF8MTw8MTApCisjZGVmaW5lIEFHUFNUQVRfQVJRU1oJCSgxPDwxNXwxPDwxNHwxPDwxMykKKyNkZWZpbmUgQUdQU1RBVF9BUlFTWl9TSElGVAkxMworCisjZGVmaW5lIEFHUFNUQVRfU0JBCQkoMTw8OSkKKyNkZWZpbmUgQUdQU1RBVF9BR1BfRU5BQkxFCSgxPDw4KQorI2RlZmluZSBBR1BTVEFUX0ZXCQkoMTw8NCkKKyNkZWZpbmUgQUdQU1RBVF9NT0RFXzNfMAkoMTw8MykKKworI2RlZmluZSBBR1BTVEFUMl8xWAkJKDE8PDApCisjZGVmaW5lIEFHUFNUQVQyXzJYCQkoMTw8MSkKKyNkZWZpbmUgQUdQU1RBVDJfNFgJCSgxPDwyKQorCisjZGVmaW5lIEFHUFNUQVQzX1JTVkQJCSgxPDwyKQorI2RlZmluZSBBR1BTVEFUM184WAkJKDE8PDEpCisjZGVmaW5lIEFHUFNUQVQzXzRYCQkoMSkKKworI2RlZmluZSBBR1BDVFJMX0FQRVJFTkIJCSgxPDw4KQorI2RlZmluZSBBR1BDVFJMX0dUTEJFTgkJKDE8PDcpCisKKyNkZWZpbmUgQUdQMl9SRVNFUlZFRF9NQVNLIDB4MDBmZmZjYzgKKyNkZWZpbmUgQUdQM19SRVNFUlZFRF9NQVNLIDB4MDBmZjAwYzQKKworI2RlZmluZSBBR1BfRVJSQVRBX0ZBU1RXUklURVMgMTw8MAorI2RlZmluZSBBR1BfRVJSQVRBX1NCQQkgMTw8MQorI2RlZmluZSBBR1BfRVJSQVRBXzFYIDE8PDIKKworI2VuZGlmCS8qIF9BR1BfQkFDS0VORF9QUklWX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYWxpLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9hbGktYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2YTIyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYWxpLWFncC5jCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogQUxpIEFHUEdBUlQgcm91dGluZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSAiYWdwLmgiCisKKyNkZWZpbmUgQUxJX0FHUENUUkwJMHhiOAorI2RlZmluZSBBTElfQVRUQkFTRQkweGJjCisjZGVmaW5lIEFMSV9UTEJDVFJMCTB4YzAKKyNkZWZpbmUgQUxJX1RBR0NUUkwJMHhjNAorI2RlZmluZSBBTElfQ0FDSEVfRkxVU0hfQ1RSTAkweEQwCisjZGVmaW5lIEFMSV9DQUNIRV9GTFVTSF9BRERSX01BU0sJMHhGRkZGRjAwMAorI2RlZmluZSBBTElfQ0FDSEVfRkxVU0hfRU4JMHgxMDAKKworc3RhdGljIGludCBhbGlfZmV0Y2hfc2l6ZSh2b2lkKQoreworCWludCBpOworCXUzMiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb18zMiAqdmFsdWVzOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUxJX0FUVEJBU0UsICZ0ZW1wKTsKKwl0ZW1wICY9IH4oMHhmZmZmZmZmMCk7CisJdmFsdWVzID0gQV9TSVpFXzMyKGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJaWYgKHRlbXAgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKwkJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKKwkJCXJldHVybiB2YWx1ZXNbaV0uc2l6ZTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbGlfdGxiZmx1c2goc3RydWN0IGFncF9tZW1vcnkgKm1lbSkKK3sKKwl1MzIgdGVtcDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFMSV9UTEJDVFJMLCAmdGVtcCk7CisJdGVtcCAmPSAweGZmZmZmZmYwOworCXRlbXAgfD0gKDE8PDAgfCAxPDwxKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUxJX1RBR0NUUkwsIHRlbXApOworfQorCitzdGF0aWMgdm9pZCBhbGlfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb18zMiAqcHJldmlvdXNfc2l6ZTsKKwl1MzIgdGVtcDsKKworCXByZXZpb3VzX3NpemUgPSBBX1NJWkVfMzIoYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfVExCQ1RSTCwgJnRlbXApOworLy8gY2xlYXIgdGFnCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFMSV9UQUdDVFJMLAorCQkJKCh0ZW1wICYgMHhmZmZmZmYwMCkgfCAweDAwMDAwMDAxfDB4MDAwMDAwMDIpKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsICBBTElfQVRUQkFTRSwgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfQVRUQkFTRSwKKwkJCSgodGVtcCAmIDB4MDAwMDBmZjApIHwgcHJldmlvdXNfc2l6ZS0+c2l6ZV92YWx1ZSkpOworfQorCitzdGF0aWMgaW50IGFsaV9jb25maWd1cmUodm9pZCkKK3sKKwl1MzIgdGVtcDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgKmN1cnJlbnRfc2l6ZTsKKworCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV8zMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJLyogYXBlcnR1cmUgc2l6ZSBhbmQgZ2F0dCBhZGRyICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUxJX0FUVEJBU0UsICZ0ZW1wKTsKKwl0ZW1wID0gKCgodGVtcCAmIDB4MDAwMDBmZjApIHwgKGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIgJiAweGZmZmZmMDAwKSkKKwkJCXwgKGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSAmIDB4ZikpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfQVRUQkFTRSwgdGVtcCk7CisKKwkvKiB0bGIgY29udHJvbCAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFMSV9UTEJDVFJMLCAmdGVtcCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFMSV9UTEJDVFJMLCAoKHRlbXAgJiAweGZmZmZmZjAwKSB8IDB4MDAwMDAwMTApKTsKKworCS8qIGFkZHJlc3MgdG8gbWFwIHRvICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisjaWYgMAorCWlmIChhZ3BfYnJpZGdlLT50eXBlID09IEFMSV9NMTU0MSkgeworCQl1MzIgbmx2bV9hZGRyID0gMDsKKworCQlzd2l0Y2ggKGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSkgeworCQkJY2FzZSAwOiAgYnJlYWs7CisJCQljYXNlIDE6ICBubHZtX2FkZHIgPSAweDEwMDAwMDticmVhazsKKwkJCWNhc2UgMjogIG5sdm1fYWRkciA9IDB4MjAwMDAwO2JyZWFrOworCQkJY2FzZSAzOiAgbmx2bV9hZGRyID0gMHg0MDAwMDA7YnJlYWs7CisJCQljYXNlIDQ6ICBubHZtX2FkZHIgPSAweDgwMDAwMDticmVhazsKKwkJCWNhc2UgNjogIG5sdm1fYWRkciA9IDB4MTAwMDAwMDticmVhazsKKwkJCWNhc2UgNzogIG5sdm1fYWRkciA9IDB4MjAwMDAwMDticmVhazsKKwkJCWNhc2UgODogIG5sdm1fYWRkciA9IDB4NDAwMDAwMDticmVhazsKKwkJCWNhc2UgOTogIG5sdm1fYWRkciA9IDB4ODAwMDAwMDticmVhazsKKwkJCWNhc2UgMTA6IG5sdm1fYWRkciA9IDB4MTAwMDAwMDA7YnJlYWs7CisJCQlkZWZhdWx0OiBicmVhazsKKwkJfQorCQlubHZtX2FkZHItLTsKKwkJbmx2bV9hZGRyJj0weGZmZjAwMDAwOworCisJCW5sdm1fYWRkcis9IGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHI7CisJCW5sdm1fYWRkcnw9KGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHI+PjEyKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIm5sdm0gdG9wICZiYXNlID0gJTh4XG4iLG5sdm1fYWRkcik7CisJfQorI2VuZGlmCisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfVExCQ1RSTCwgJnRlbXApOworCXRlbXAgJj0gMHhmZmZmZmY3ZjsJCS8vZW5hYmxlIFRMQgorCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfVExCQ1RSTCwgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBtMTU0MV9jYWNoZV9mbHVzaCh2b2lkKQoreworCWludCBpLCBwYWdlX2NvdW50OworCXUzMiB0ZW1wOworCisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisKKwlwYWdlX2NvdW50ID0gMSA8PCBBX1NJWkVfMzIoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKS0+cGFnZV9vcmRlcjsKKwlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFICogcGFnZV9jb3VudDsgaSArPSBQQUdFX1NJWkUpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUxJX0NBQ0hFX0ZMVVNIX0NUUkwsCisJCQkJJnRlbXApOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUxJX0NBQ0hFX0ZMVVNIX0NUUkwsCisJCQkJKCgodGVtcCAmIEFMSV9DQUNIRV9GTFVTSF9BRERSX01BU0spIHwKKwkJCQkgIChhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyICsgaSkpIHwKKwkJCQkgQUxJX0NBQ0hFX0ZMVVNIX0VOKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCAqbTE1NDFfYWxsb2NfcGFnZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJdm9pZCAqYWRkciA9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UoYWdwX2JyaWRnZSk7CisJdTMyIHRlbXA7CisKKwlpZiAoIWFkZHIpCisJCXJldHVybiBOVUxMOworCQorCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFMSV9DQUNIRV9GTFVTSF9DVFJMLCAmdGVtcCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFMSV9DQUNIRV9GTFVTSF9DVFJMLAorCQkJKCgodGVtcCAmIEFMSV9DQUNIRV9GTFVTSF9BRERSX01BU0spIHwKKwkJCSAgdmlydF90b19waHlzKGFkZHIpKSB8IEFMSV9DQUNIRV9GTFVTSF9FTiApKTsKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIHZvaWQgYWxpX2Rlc3Ryb3lfcGFnZSh2b2lkICogYWRkcikKK3sKKwlpZiAoYWRkcikgeworCQlnbG9iYWxfY2FjaGVfZmx1c2goKTsJLyogaXMgdGhpcyByZWFsbHkgbmVlZGVkPyAgLS1oY2ggKi8KKwkJYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlKGFkZHIpOworCX0KK30KKworc3RhdGljIHZvaWQgbTE1NDFfZGVzdHJveV9wYWdlKHZvaWQgKiBhZGRyKQoreworCXUzMiB0ZW1wOworCisJaWYgKGFkZHIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfQ0FDSEVfRkxVU0hfQ1RSTCwgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTElfQ0FDSEVfRkxVU0hfQ1RSTCwKKwkJCSgoKHRlbXAgJiBBTElfQ0FDSEVfRkxVU0hfQUREUl9NQVNLKSB8CisJCQkgIHZpcnRfdG9fcGh5cyhhZGRyKSkgfCBBTElfQ0FDSEVfRkxVU0hfRU4pKTsKKwlhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UoYWRkcik7Cit9CisKKworLyogU2V0dXAgZnVuY3Rpb24gKi8KKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb18zMiBhbGlfZ2VuZXJpY19zaXplc1s3XSA9Cit7CisJezI1NiwgNjU1MzYsIDYsIDEwfSwKKwl7MTI4LCAzMjc2OCwgNSwgOX0sCisJezY0LCAxNjM4NCwgNCwgOH0sCisJezMyLCA4MTkyLCAzLCA3fSwKKwl7MTYsIDQwOTYsIDIsIDZ9LAorCXs4LCAyMDQ4LCAxLCA0fSwKKwl7NCwgMTAyNCwgMCwgM30KK307CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBhbGlfZ2VuZXJpY19icmlkZ2UgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gYWxpX2dlbmVyaWNfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVMzJfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSA3LAorCS5jb25maWd1cmUJCT0gYWxpX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSBhbGlfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSBhbGlfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGFsaV90bGJmbHVzaCwKKwkubWFza19tZW1vcnkJCT0gYWdwX2dlbmVyaWNfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBOVUxMLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gYWdwX2dlbmVyaWNfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhbGlfZGVzdHJveV9wYWdlLAorfTsKKworc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGFsaV9tMTU0MV9icmlkZ2UgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gYWxpX2dlbmVyaWNfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVMzJfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSA3LAorCS5jb25maWd1cmUJCT0gYWxpX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSBhbGlfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSBhbGlfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGFsaV90bGJmbHVzaCwKKwkubWFza19tZW1vcnkJCT0gYWdwX2dlbmVyaWNfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBOVUxMLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gbTE1NDFfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gbTE1NDFfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IG0xNTQxX2Rlc3Ryb3lfcGFnZSwKK307CisKKworc3RhdGljIHN0cnVjdCBhZ3BfZGV2aWNlX2lkcyBhbGlfYWdwX2RldmljZV9pZHNbXSBfX2RldmluaXRkYXRhID0KK3sKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FMX00xNTQxLAorCQkuY2hpcHNldF9uYW1lCT0gIk0xNTQxIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQUxfTTE2MjEsCisJCS5jaGlwc2V0X25hbWUJPSAiTTE2MjEiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9BTF9NMTYzMSwKKwkJLmNoaXBzZXRfbmFtZQk9ICJNMTYzMSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FMX00xNjMyLAorCQkuY2hpcHNldF9uYW1lCT0gIk0xNjMyIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQUxfTTE2NDEsCisJCS5jaGlwc2V0X25hbWUJPSAiTTE2NDEiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9BTF9NMTY0NCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJNMTY0NCIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FMX00xNjQ3LAorCQkuY2hpcHNldF9uYW1lCT0gIk0xNjQ3IiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQUxfTTE2NTEsCisJCS5jaGlwc2V0X25hbWUJPSAiTTE2NTEiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9BTF9NMTY3MSwKKwkJLmNoaXBzZXRfbmFtZQk9ICJNMTY3MSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FMX00xNjgxLAorCQkuY2hpcHNldF9uYW1lCT0gIk0xNjgxIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQUxfTTE2ODMsCisJCS5jaGlwc2V0X25hbWUJPSAiTTE2ODMiLAorCX0sCisKKwl7IH0sIC8qIGR1bW15IGZpbmFsIGVudHJ5LCBhbHdheXMgcHJlc2VudCAqLworfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWdwX2FsaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBhZ3BfZGV2aWNlX2lkcyAqZGV2cyA9IGFsaV9hZ3BfZGV2aWNlX2lkczsKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisJdTggaGlkZGVuXzE2MjFfaWQsIGNhcF9wdHI7CisJaW50IGo7CisKKwljYXBfcHRyID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0FHUCk7CisJaWYgKCFjYXBfcHRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHByb2JlIGZvciBrbm93biBjaGlwc2V0cyAqLworCWZvciAoaiA9IDA7IGRldnNbal0uY2hpcHNldF9uYW1lOyBqKyspIHsKKwkJaWYgKHBkZXYtPmRldmljZSA9PSBkZXZzW2pdLmRldmljZV9pZCkKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5zdXBwb3J0ZWQgQUxpIGNoaXBzZXQgKGRldmljZSBpZDogJTA0eClcbiIsCisJICAgICBwZGV2LT5kZXZpY2UpOworCXJldHVybiAtRU5PREVWOworCisKK2ZvdW5kOgorCWJyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlicmlkZ2UtPmRldiA9IHBkZXY7CisJYnJpZGdlLT5jYXBuZHggPSBjYXBfcHRyOworCisJc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfQUxfTTE1NDE6CisJCWJyaWRnZS0+ZHJpdmVyID0gJmFsaV9tMTU0MV9icmlkZ2U7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9BTF9NMTYyMToKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHhGQiwgJmhpZGRlbl8xNjIxX2lkKTsKKwkJc3dpdGNoIChoaWRkZW5fMTYyMV9pZCkgeworCQljYXNlIDB4MzE6CisJCQlkZXZzW2pdLmNoaXBzZXRfbmFtZSA9ICJNMTYzMSI7CisJCQlicmVhazsKKwkJY2FzZSAweDMyOgorCQkJZGV2c1tqXS5jaGlwc2V0X25hbWUgPSAiTTE2MzIiOworCQkJYnJlYWs7CisJCWNhc2UgMHg0MToKKwkJCWRldnNbal0uY2hpcHNldF9uYW1lID0gIk0xNjQxIjsKKwkJCWJyZWFrOworCQljYXNlIDB4NDM6CisJCQlkZXZzW2pdLmNoaXBzZXRfbmFtZSA9ICJNPz8/PyI7CisJCQlicmVhazsKKwkJY2FzZSAweDQ3OgorCQkJZGV2c1tqXS5jaGlwc2V0X25hbWUgPSAiTTE2NDciOworCQkJYnJlYWs7CisJCWNhc2UgMHg1MToKKwkJCWRldnNbal0uY2hpcHNldF9uYW1lID0gIk0xNjUxIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJLypGQUxMVEhST1VHSCovCisJZGVmYXVsdDoKKwkJYnJpZGdlLT5kcml2ZXIgPSAmYWxpX2dlbmVyaWNfYnJpZGdlOworCX0KKworCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBBTGkgJXMgY2hpcHNldFxuIiwKKwkJCWRldnNbal0uY2hpcHNldF9uYW1lKTsKKworCS8qIEZpbGwgaW4gdGhlIG1vZGUgcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKKwkJCWJyaWRnZS0+Y2FwbmR4K1BDSV9BR1BfU1RBVFVTLAorCQkJJmJyaWRnZS0+bW9kZSk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgYnJpZGdlKTsKKwlyZXR1cm4gYWdwX2FkZF9icmlkZ2UoYnJpZGdlKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGFncF9hbGlfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFncF9yZW1vdmVfYnJpZGdlKGJyaWRnZSk7CisJYWdwX3B1dF9icmlkZ2UoYnJpZGdlKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFncF9hbGlfcGNpX3RhYmxlW10gPSB7CisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0FMLAorCS5kZXZpY2UJCT0gUENJX0FOWV9JRCwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFncF9hbGlfcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFncF9hbGlfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYWdwZ2FydC1hbGkiLAorCS5pZF90YWJsZQk9IGFncF9hbGlfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBhZ3BfYWxpX3Byb2JlLAorCS5yZW1vdmUJCT0gYWdwX2FsaV9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZ3BfYWxpX2luaXQodm9pZCkKK3sKKwlpZiAoYWdwX29mZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFncF9hbGlfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3BfYWxpX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFncF9hbGlfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFncF9hbGlfaW5pdCk7Cittb2R1bGVfZXhpdChhZ3BfYWxpX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYWxwaGEtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FscGhhLWFncC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzJkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FscGhhLWFncC5jCkBAIC0wLDAgKzEsMjE2IEBACisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorI2luY2x1ZGUgPGFzbS9hZ3BfYmFja2VuZC5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pbXBsLmgiCisKKyNpbmNsdWRlICJhZ3AuaCIKKworc3RhdGljIHN0cnVjdCBwYWdlICphbHBoYV9jb3JlX2FncF92bV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJCQkgICAgIGludCAqdHlwZSkKK3sKKwlhbHBoYV9hZ3BfaW5mbyAqYWdwID0gYWdwX2JyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YTsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXVuc2lnbmVkIGxvbmcgcGE7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlkbWFfYWRkciA9IGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0ICsgYWdwLT5hcGVydHVyZS5idXNfYmFzZTsKKwlwYSA9IGFncC0+b3BzLT50cmFuc2xhdGUoYWdwLCBkbWFfYWRkcik7CisKKwlpZiAocGEgPT0gKHVuc2lnbmVkIGxvbmcpLUVJTlZBTCkgcmV0dXJuIE5VTEw7CS8qIG5vIHRyYW5zbGF0aW9uICovCisJCisJLyoKKwkgKiBHZXQgdGhlIHBhZ2UsIGluYyB0aGUgdXNlIGNvdW50LCBhbmQgcmV0dXJuIGl0CisJICovCisJcGFnZSA9IHZpcnRfdG9fcGFnZShfX3ZhKHBhKSk7CisJZ2V0X3BhZ2UocGFnZSk7CisJaWYgKHR5cGUpCisJCSp0eXBlID0gVk1fRkFVTFRfTUlOT1I7CisJcmV0dXJuIHBhZ2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fZml4ZWQgYWxwaGFfY29yZV9hZ3Bfc2l6ZXNbXSA9Cit7CisJeyAwLCAwLCAwIH0sIC8qIGZpbGxlZCBpbiBieSBhbHBoYV9jb3JlX2FncF9zZXR1cCAqLworfTsKKworc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGFscGhhX2NvcmVfYWdwX3ZtX29wcyA9IHsKKwkubm9wYWdlID0gYWxwaGFfY29yZV9hZ3Bfdm1fbm9wYWdlLAorfTsKKworCitzdGF0aWMgaW50IGFscGhhX2NvcmVfYWdwX25vcCh2b2lkKQoreworCS8qIGp1c3QgcmV0dXJuIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbHBoYV9jb3JlX2FncF9mZXRjaF9zaXplKHZvaWQpCit7CisJcmV0dXJuIGFscGhhX2NvcmVfYWdwX3NpemVzWzBdLnNpemU7Cit9CisKK3N0YXRpYyBpbnQgYWxwaGFfY29yZV9hZ3BfY29uZmlndXJlKHZvaWQpCit7CisJYWxwaGFfYWdwX2luZm8gKmFncCA9IGFncF9icmlkZ2UtPmRldl9wcml2YXRlX2RhdGE7CisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9IGFncC0+YXBlcnR1cmUuYnVzX2Jhc2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFscGhhX2NvcmVfYWdwX2NsZWFudXAodm9pZCkKK3sKKwlhbHBoYV9hZ3BfaW5mbyAqYWdwID0gYWdwX2JyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YTsKKworCWFncC0+b3BzLT5jbGVhbnVwKGFncCk7Cit9CisKK3N0YXRpYyB2b2lkIGFscGhhX2NvcmVfYWdwX3RsYmZsdXNoKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit7CisJYWxwaGFfYWdwX2luZm8gKmFncCA9IGFncF9icmlkZ2UtPmRldl9wcml2YXRlX2RhdGE7CisJYWxwaGFfbXYubXZfcGNpX3RiaShhZ3AtPmhvc2UsIDAsIC0xKTsKK30KKworc3RhdGljIHZvaWQgYWxwaGFfY29yZV9hZ3BfZW5hYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwgdTMyIG1vZGUpCit7CisJYWxwaGFfYWdwX2luZm8gKmFncCA9IGJyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YTsKKworCWFncC0+bW9kZS5sdyA9IGFncF9jb2xsZWN0X2RldmljZV9zdGF0dXMoYnJpZGdlLCBtb2RlLAorCQkJCQlhZ3AtPmNhcGFiaWxpdHkubHcpOworCisJYWdwLT5tb2RlLmJpdHMuZW5hYmxlID0gMTsKKwlhZ3AtPm9wcy0+Y29uZmlndXJlKGFncCk7CisKKwlhZ3BfZGV2aWNlX2NvbW1hbmQoYWdwLT5tb2RlLmx3LCAwKTsKK30KKworc3RhdGljIGludCBhbHBoYV9jb3JlX2FncF9pbnNlcnRfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCAKKwkJCQkJaW50IHR5cGUpCit7CisJYWxwaGFfYWdwX2luZm8gKmFncCA9IGFncF9icmlkZ2UtPmRldl9wcml2YXRlX2RhdGE7CisJaW50IG51bV9lbnRyaWVzLCBzdGF0dXM7CisJdm9pZCAqdGVtcDsKKworCXRlbXAgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemU7CisJbnVtX2VudHJpZXMgPSBBX1NJWkVfRklYKHRlbXApLT5udW1fZW50cmllczsKKwlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKSByZXR1cm4gLUVJTlZBTDsKKworCXN0YXR1cyA9IGFncC0+b3BzLT5iaW5kKGFncCwgcGdfc3RhcnQsIG1lbSk7CisJbWIoKTsKKwlhbHBoYV9jb3JlX2FncF90bGJmbHVzaChtZW0pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBhbHBoYV9jb3JlX2FncF9yZW1vdmVfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCAKKwkJCQkJaW50IHR5cGUpCit7CisJYWxwaGFfYWdwX2luZm8gKmFncCA9IGFncF9icmlkZ2UtPmRldl9wcml2YXRlX2RhdGE7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGFncC0+b3BzLT51bmJpbmQoYWdwLCBwZ19zdGFydCwgbWVtKTsKKwlhbHBoYV9jb3JlX2FncF90bGJmbHVzaChtZW0pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBhbHBoYV9jb3JlX2FncF9kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gYWxwaGFfY29yZV9hZ3Bfc2l6ZXMsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDEsCisJLnNpemVfdHlwZQkJPSBGSVhFRF9BUEVSX1NJWkUsCisJLmNhbnRfdXNlX2FwZXJ0dXJlCT0gMSwKKwkubWFza3MJCQk9IE5VTEwsCisJCisJLmZldGNoX3NpemUJCT0gYWxwaGFfY29yZV9hZ3BfZmV0Y2hfc2l6ZSwKKwkuY29uZmlndXJlCQk9IGFscGhhX2NvcmVfYWdwX2NvbmZpZ3VyZSwKKwkuYWdwX2VuYWJsZQkJPSBhbHBoYV9jb3JlX2FncF9lbmFibGUsCisJLmNsZWFudXAJCT0gYWxwaGFfY29yZV9hZ3BfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGFscGhhX2NvcmVfYWdwX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFscGhhX2NvcmVfYWdwX25vcCwKKwkuZnJlZV9nYXR0X3RhYmxlCT0gYWxwaGFfY29yZV9hZ3Bfbm9wLAorCS5pbnNlcnRfbWVtb3J5CQk9IGFscGhhX2NvcmVfYWdwX2luc2VydF9tZW1vcnksCisJLnJlbW92ZV9tZW1vcnkJCT0gYWxwaGFfY29yZV9hZ3BfcmVtb3ZlX21lbW9yeSwKKwkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAorCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAorCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorfTsKKworc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYWxwaGFfYnJpZGdlOworCitpbnQgX19pbml0CithbHBoYV9jb3JlX2FncF9zZXR1cCh2b2lkKQoreworCWFscGhhX2FncF9pbmZvICphZ3AgPSBhbHBoYV9tdi5hZ3BfaW5mbygpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkvKiBmYWtlZCAqLworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCAqYXBlcl9zaXplOworCisJaWYgKCFhZ3ApCisJCXJldHVybiAtRU5PREVWOworCWlmIChhZ3AtPm9wcy0+c2V0dXAoYWdwKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIEJ1aWxkIHRoZSBhcGVydHVyZSBzaXplIGRlc2NyaXB0b3IKKwkgKi8KKwlhcGVyX3NpemUgPSBhbHBoYV9jb3JlX2FncF9zaXplczsKKwlhcGVyX3NpemUtPnNpemUgPSBhZ3AtPmFwZXJ0dXJlLnNpemUgLyAoMTAyNCAqIDEwMjQpOworCWFwZXJfc2l6ZS0+bnVtX2VudHJpZXMgPSBhZ3AtPmFwZXJ0dXJlLnNpemUgLyBQQUdFX1NJWkU7CisJYXBlcl9zaXplLT5wYWdlX29yZGVyID0gX19mZnMoYXBlcl9zaXplLT5udW1fZW50cmllcyAvIDEwMjQpOworCisJLyoKKwkgKiBCdWlsZCBhIGZha2UgcGNpX2RldiBzdHJ1Y3QKKwkgKi8KKwlwZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkZXYpCisJCXJldHVybiAtRU5PTUVNOworCXBkZXYtPnZlbmRvciA9IDB4ZmZmZjsKKwlwZGV2LT5kZXZpY2UgPSAweGZmZmY7CisJcGRldi0+c3lzZGF0YSA9IGFncC0+aG9zZTsKKworCWFscGhhX2JyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWFscGhhX2JyaWRnZSkKKwkJZ290byBmYWlsOworCisJYWxwaGFfYnJpZGdlLT5kcml2ZXIgPSAmYWxwaGFfY29yZV9hZ3BfZHJpdmVyOworCWFscGhhX2JyaWRnZS0+dm1fb3BzID0gJmFscGhhX2NvcmVfYWdwX3ZtX29wczsKKwlhbHBoYV9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9IGFwZXJfc2l6ZTsgLyogb25seSAxIHNpemUgKi8KKwlhbHBoYV9icmlkZ2UtPmRldl9wcml2YXRlX2RhdGEgPSBhZ3A7CisJYWxwaGFfYnJpZGdlLT5kZXYgPSBwZGV2OworCWFscGhhX2JyaWRnZS0+bW9kZSA9IGFncC0+Y2FwYWJpbGl0eS5sdzsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBBR1Agb24gaG9zZSAlZFxuIiwgYWdwLT5ob3NlLT5pbmRleCk7CisJcmV0dXJuIGFncF9hZGRfYnJpZGdlKGFscGhhX2JyaWRnZSk7CisKKyBmYWlsOgorCWtmcmVlKHBkZXYpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZ3BfYWxwaGFfY29yZV9pbml0KHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChhbHBoYV9tdi5hZ3BfaW5mbykKKwkJcmV0dXJuIGFscGhhX2NvcmVfYWdwX3NldHVwKCk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3BfYWxwaGFfY29yZV9jbGVhbnVwKHZvaWQpCit7CisJYWdwX3JlbW92ZV9icmlkZ2UoYWxwaGFfYnJpZGdlKTsKKwlhZ3BfcHV0X2JyaWRnZShhbHBoYV9icmlkZ2UpOworfQorCittb2R1bGVfaW5pdChhZ3BfYWxwaGFfY29yZV9pbml0KTsKK21vZHVsZV9leGl0KGFncF9hbHBoYV9jb3JlX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJKZWZmIFdpZWRlbWVpZXIgPEplZmYuV2llZGVtZWllckBocC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9hbWQtazctYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZC1rNy1hZ3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWVhODdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hbWQtazctYWdwLmMKQEAgLTAsMCArMSw1NDIgQEAKKy8qCisgKiBBTUQgSzcgQUdQR0FSVCByb3V0aW5lcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSAiYWdwLmgiCisKKyNkZWZpbmUgQU1EX01NQkFTRQkweDE0CisjZGVmaW5lIEFNRF9BUFNJWkUJMHhhYworI2RlZmluZSBBTURfTU9ERUNOVEwJMHhiMAorI2RlZmluZSBBTURfTU9ERUNOVEwyCTB4YjIKKyNkZWZpbmUgQU1EX0dBUlRFTkFCTEUJMHgwMgkvKiBJbiBtbWlvIHJlZ2lvbiAoMTYtYml0IHJlZ2lzdGVyKSAqLworI2RlZmluZSBBTURfQVRUQkFTRQkweDA0CS8qIEluIG1taW8gcmVnaW9uICgzMi1iaXQgcmVnaXN0ZXIpICovCisjZGVmaW5lIEFNRF9UTEJGTFVTSAkweDBjCS8qIEluIG1taW8gcmVnaW9uICgzMi1iaXQgcmVnaXN0ZXIpICovCisjZGVmaW5lIEFNRF9DQUNIRUVOVFJZCTB4MTAJLyogSW4gbW1pbyByZWdpb24gKDMyLWJpdCByZWdpc3RlcikgKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFncF9hbWRrN19wY2lfdGFibGVbXTsKKworc3RydWN0IGFtZF9wYWdlX21hcCB7CisJdW5zaWduZWQgbG9uZyAqcmVhbDsKKwl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnJlbWFwcGVkOworfTsKKworc3RhdGljIHN0cnVjdCBfYW1kX2lyb25nYXRlX3ByaXZhdGUgeworCXZvbGF0aWxlIHU4IF9faW9tZW0gKnJlZ2lzdGVyczsKKwlzdHJ1Y3QgYW1kX3BhZ2VfbWFwICoqZ2F0dF9wYWdlczsKKwlpbnQgbnVtX3RhYmxlczsKK30gYW1kX2lyb25nYXRlX3ByaXZhdGU7CisKK3N0YXRpYyBpbnQgYW1kX2NyZWF0ZV9wYWdlX21hcChzdHJ1Y3QgYW1kX3BhZ2VfbWFwICpwYWdlX21hcCkKK3sKKwlpbnQgaTsKKworCXBhZ2VfbWFwLT5yZWFsID0gKHVuc2lnbmVkIGxvbmcgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmIChwYWdlX21hcC0+cmVhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwlwYWdlX21hcC0+cmVtYXBwZWQgPSBpb3JlbWFwX25vY2FjaGUodmlydF90b19waHlzKHBhZ2VfbWFwLT5yZWFsKSwKKwkJCQkJICAgIFBBR0VfU0laRSk7CisJaWYgKHBhZ2VfbWFwLT5yZW1hcHBlZCA9PSBOVUxMKSB7CisJCUNsZWFyUGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShwYWdlX21hcC0+cmVhbCkpOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2VfbWFwLT5yZWFsKTsKKwkJcGFnZV9tYXAtPnJlYWwgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOyBpKyspIHsKKwkJd3JpdGVsKGFncF9icmlkZ2UtPnNjcmF0Y2hfcGFnZSwgcGFnZV9tYXAtPnJlbWFwcGVkK2kpOworCQlyZWFkbChwYWdlX21hcC0+cmVtYXBwZWQraSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbWRfZnJlZV9wYWdlX21hcChzdHJ1Y3QgYW1kX3BhZ2VfbWFwICpwYWdlX21hcCkKK3sKKwlpb3VubWFwKHBhZ2VfbWFwLT5yZW1hcHBlZCk7CisJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHBhZ2VfbWFwLT5yZWFsKSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlX21hcC0+cmVhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZF9mcmVlX2dhdHRfcGFnZXModm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYW1kX3BhZ2VfbWFwICoqdGFibGVzOworCXN0cnVjdCBhbWRfcGFnZV9tYXAgKmVudHJ5OworCisJdGFibGVzID0gYW1kX2lyb25nYXRlX3ByaXZhdGUuZ2F0dF9wYWdlczsKKwlmb3IgKGkgPSAwOyBpIDwgYW1kX2lyb25nYXRlX3ByaXZhdGUubnVtX3RhYmxlczsgaSsrKSB7CisJCWVudHJ5ID0gdGFibGVzW2ldOworCQlpZiAoZW50cnkgIT0gTlVMTCkgeworCQkJaWYgKGVudHJ5LT5yZWFsICE9IE5VTEwpCisJCQkJYW1kX2ZyZWVfcGFnZV9tYXAoZW50cnkpOworCQkJa2ZyZWUoZW50cnkpOworCQl9CisJfQorCWtmcmVlKHRhYmxlcyk7CisJYW1kX2lyb25nYXRlX3ByaXZhdGUuZ2F0dF9wYWdlcyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYW1kX2NyZWF0ZV9nYXR0X3BhZ2VzKGludCBucl90YWJsZXMpCit7CisJc3RydWN0IGFtZF9wYWdlX21hcCAqKnRhYmxlczsKKwlzdHJ1Y3QgYW1kX3BhZ2VfbWFwICplbnRyeTsKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgaTsKKworCXRhYmxlcyA9IGttYWxsb2MoKG5yX3RhYmxlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBhbWRfcGFnZV9tYXAgKiksCisJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKHRhYmxlcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCAodGFibGVzLCAwLCBzaXplb2Yoc3RydWN0IGFtZF9wYWdlX21hcCAqKSAqIChucl90YWJsZXMgKyAxKSk7CisJZm9yIChpID0gMDsgaSA8IG5yX3RhYmxlczsgaSsrKSB7CisJCWVudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFtZF9wYWdlX21hcCksIEdGUF9LRVJORUwpOworCQlpZiAoZW50cnkgPT0gTlVMTCkgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisJCW1lbXNldCAoZW50cnksIDAsIHNpemVvZihzdHJ1Y3QgYW1kX3BhZ2VfbWFwKSk7CisJCXRhYmxlc1tpXSA9IGVudHJ5OworCQlyZXR2YWwgPSBhbWRfY3JlYXRlX3BhZ2VfbWFwKGVudHJ5KTsKKwkJaWYgKHJldHZhbCAhPSAwKQorCQkJYnJlYWs7CisJfQorCWFtZF9pcm9uZ2F0ZV9wcml2YXRlLm51bV90YWJsZXMgPSBucl90YWJsZXM7CisJYW1kX2lyb25nYXRlX3ByaXZhdGUuZ2F0dF9wYWdlcyA9IHRhYmxlczsKKworCWlmIChyZXR2YWwgIT0gMCkKKwkJYW1kX2ZyZWVfZ2F0dF9wYWdlcygpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogU2luY2Ugd2UgZG9uJ3QgbmVlZCBjb250aWdpb3VzIG1lbW9yeSB3ZSBqdXN0IHRyeQorICogdG8gZ2V0IHRoZSBnYXR0IHRhYmxlIG9uY2UKKyAqLworCisjZGVmaW5lIEdFVF9QQUdFX0RJUl9PRkYoYWRkcikgKGFkZHIgPj4gMjIpCisjZGVmaW5lIEdFVF9QQUdFX0RJUl9JRFgoYWRkcikgKEdFVF9QQUdFX0RJUl9PRkYoYWRkcikgLSBcCisJR0VUX1BBR0VfRElSX09GRihhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyKSkKKyNkZWZpbmUgR0VUX0dBVFRfT0ZGKGFkZHIpICgoYWRkciAmIDB4MDAzZmYwMDApID4+IDEyKQorI2RlZmluZSBHRVRfR0FUVChhZGRyKSAoYW1kX2lyb25nYXRlX3ByaXZhdGUuZ2F0dF9wYWdlc1tcCisJR0VUX1BBR0VfRElSX0lEWChhZGRyKV0tPnJlbWFwcGVkKQorCitzdGF0aWMgaW50IGFtZF9jcmVhdGVfZ2F0dF90YWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2x2bDIgKnZhbHVlOworCXN0cnVjdCBhbWRfcGFnZV9tYXAgcGFnZV9kaXI7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCWludCByZXR2YWw7CisJdTMyIHRlbXA7CisJaW50IGk7CisKKwl2YWx1ZSA9IEFfU0laRV9MVkwyKGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisJcmV0dmFsID0gYW1kX2NyZWF0ZV9wYWdlX21hcCgmcGFnZV9kaXIpOworCWlmIChyZXR2YWwgIT0gMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IGFtZF9jcmVhdGVfZ2F0dF9wYWdlcyh2YWx1ZS0+bnVtX2VudHJpZXMgLyAxMDI0KTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJYW1kX2ZyZWVfcGFnZV9tYXAoJnBhZ2VfZGlyKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwgPSAodTMyICopcGFnZV9kaXIucmVhbDsKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlID0gKHUzMiBfX2lvbWVtICopcGFnZV9kaXIucmVtYXBwZWQ7CisJYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkciA9IHZpcnRfdG9fcGh5cyhwYWdlX2Rpci5yZWFsKTsKKworCS8qIEdldCB0aGUgYWRkcmVzcyBmb3IgdGhlIGdhcnQgcmVnaW9uLgorCSAqIFRoaXMgaXMgYSBidXMgYWRkcmVzcyBldmVuIG9uIHRoZSBhbHBoYSwgYi9jIGl0cworCSAqIHVzZWQgdG8gcHJvZ3JhbSB0aGUgYWdwIG1hc3RlciBub3QgdGhlIGNwdQorCSAqLworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSBhZGRyOworCisJLyogQ2FsY3VsYXRlIHRoZSBhZ3Agb2Zmc2V0ICovCisJZm9yIChpID0gMDsgaSA8IHZhbHVlLT5udW1fZW50cmllcyAvIDEwMjQ7IGkrKywgYWRkciArPSAweDAwNDAwMDAwKSB7CisJCXdyaXRlbCh2aXJ0X3RvX3BoeXMoYW1kX2lyb25nYXRlX3ByaXZhdGUuZ2F0dF9wYWdlc1tpXS0+cmVhbCkgfCAxLAorCQkJcGFnZV9kaXIucmVtYXBwZWQrR0VUX1BBR0VfRElSX09GRihhZGRyKSk7CisJCXJlYWRsKHBhZ2VfZGlyLnJlbWFwcGVkK0dFVF9QQUdFX0RJUl9PRkYoYWRkcikpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfZnJlZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgYW1kX3BhZ2VfbWFwIHBhZ2VfZGlyOworCisJcGFnZV9kaXIucmVhbCA9ICh1bnNpZ25lZCBsb25nICopYWdwX2JyaWRnZS0+Z2F0dF90YWJsZV9yZWFsOworCXBhZ2VfZGlyLnJlbWFwcGVkID0gKHVuc2lnbmVkIGxvbmcgX19pb21lbSAqKWFncF9icmlkZ2UtPmdhdHRfdGFibGU7CisKKwlhbWRfZnJlZV9nYXR0X3BhZ2VzKCk7CisJYW1kX2ZyZWVfcGFnZV9tYXAoJnBhZ2VfZGlyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfaXJvbmdhdGVfZmV0Y2hfc2l6ZSh2b2lkKQoreworCWludCBpOworCXUzMiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyICp2YWx1ZXM7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTURfQVBTSVpFLCAmdGVtcCk7CisJdGVtcCA9ICh0ZW1wICYgMHgwMDAwMDAwZSk7CisJdmFsdWVzID0gQV9TSVpFX0xWTDIoYWdwX2JyaWRnZS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcyk7CisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJaWYgKHRlbXAgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKworCQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQkJcmV0dXJuIHZhbHVlc1tpXS5zaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1kX2lyb25nYXRlX2NvbmZpZ3VyZSh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyICpjdXJyZW50X3NpemU7CisJdTMyIHRlbXA7CisJdTE2IGVuYWJsZV9yZWc7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJLyogR2V0IHRoZSBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFNRF9NTUJBU0UsICZ0ZW1wKTsKKwl0ZW1wID0gKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKTsKKwlhbWRfaXJvbmdhdGVfcHJpdmF0ZS5yZWdpc3RlcnMgPSAodm9sYXRpbGUgdTggX19pb21lbSAqKSBpb3JlbWFwKHRlbXAsIDQwOTYpOworCisJLyogV3JpdGUgb3V0IHRoZSBhZGRyZXNzIG9mIHRoZSBnYXR0IHRhYmxlICovCisJd3JpdGVsKGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIsIGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfQVRUQkFTRSk7CisJcmVhZGwoYW1kX2lyb25nYXRlX3ByaXZhdGUucmVnaXN0ZXJzK0FNRF9BVFRCQVNFKTsJLyogUENJIFBvc3RpbmcuICovCisKKwkvKiBXcml0ZSB0aGUgU3luYyByZWdpc3RlciAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIEFNRF9NT0RFQ05UTCwgMHg4MCk7CisKKwkvKiBTZXQgaW5kZXhpbmcgbW9kZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIEFNRF9NT0RFQ05UTDIsIDB4MDApOworCisJLyogV3JpdGUgdGhlIGVuYWJsZSByZWdpc3RlciAqLworCWVuYWJsZV9yZWcgPSByZWFkdyhhbWRfaXJvbmdhdGVfcHJpdmF0ZS5yZWdpc3RlcnMrQU1EX0dBUlRFTkFCTEUpOworCWVuYWJsZV9yZWcgPSAoZW5hYmxlX3JlZyB8IDB4MDAwNCk7CisJd3JpdGV3KGVuYWJsZV9yZWcsIGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfR0FSVEVOQUJMRSk7CisJcmVhZHcoYW1kX2lyb25nYXRlX3ByaXZhdGUucmVnaXN0ZXJzK0FNRF9HQVJURU5BQkxFKTsJLyogUENJIFBvc3RpbmcuICovCisKKwkvKiBXcml0ZSBvdXQgdGhlIHNpemUgcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBTURfQVBTSVpFLCAmdGVtcCk7CisJdGVtcCA9ICgoKHRlbXAgJiB+KDB4MDAwMDAwMGUpKSB8IGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSkgfCAxKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQU1EX0FQU0laRSwgdGVtcCk7CisKKwkvKiBGbHVzaCB0aGUgdGxiICovCisJd3JpdGVsKDEsIGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfVExCRkxVU0gpOworCXJlYWRsKGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfVExCRkxVU0gpOwkvKiBQQ0kgUG9zdGluZy4qLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbWRfaXJvbmdhdGVfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyICpwcmV2aW91c19zaXplOworCXUzMiB0ZW1wOworCXUxNiBlbmFibGVfcmVnOworCisJcHJldmlvdXNfc2l6ZSA9IEFfU0laRV9MVkwyKGFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUpOworCisJZW5hYmxlX3JlZyA9IHJlYWR3KGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfR0FSVEVOQUJMRSk7CisJZW5hYmxlX3JlZyA9IChlbmFibGVfcmVnICYgfigweDAwMDQpKTsKKwl3cml0ZXcoZW5hYmxlX3JlZywgYW1kX2lyb25nYXRlX3ByaXZhdGUucmVnaXN0ZXJzK0FNRF9HQVJURU5BQkxFKTsKKwlyZWFkdyhhbWRfaXJvbmdhdGVfcHJpdmF0ZS5yZWdpc3RlcnMrQU1EX0dBUlRFTkFCTEUpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKworCS8qIFdyaXRlIGJhY2sgdGhlIHByZXZpb3VzIHNpemUgYW5kIGRpc2FibGUgZ2FydCB0cmFuc2xhdGlvbiAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFNRF9BUFNJWkUsICZ0ZW1wKTsKKwl0ZW1wID0gKCh0ZW1wICYgfigweDAwMDAwMDBmKSkgfCBwcmV2aW91c19zaXplLT5zaXplX3ZhbHVlKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQU1EX0FQU0laRSwgdGVtcCk7CisJaW91bm1hcCgodm9pZCBfX2lvbWVtICopIGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycyk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY291bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGFraW5nIHRoZSBhZGRyZXNzZXMKKyAqIHdyaXR0ZW4gdG8gdGhlIEdBVFQsIGFuZCBmbHVzaGluZyB0aGVtIGluZGl2aWR1YWxseS4gIEhvd2V2ZXIKKyAqIGN1cnJlbnRseSBpdCBqdXN0IGZsdXNoZXMgdGhlIHdob2xlIHRhYmxlLiAgV2hpY2ggaXMgcHJvYmFibHkKKyAqIG1vcmUgZWZmaWNlbnQsIHNpbmNlIGFncF9tZW1vcnkgYmxvY2tzIGNhbiBiZSBhIGxhcmdlIG51bWJlciBvZgorICogZW50cmllcy4KKyAqLworCitzdGF0aWMgdm9pZCBhbWRfaXJvbmdhdGVfdGxiZmx1c2goc3RydWN0IGFncF9tZW1vcnkgKnRlbXApCit7CisJd3JpdGVsKDEsIGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfVExCRkxVU0gpOworCXJlYWRsKGFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycytBTURfVExCRkxVU0gpOwkvKiBQQ0kgUG9zdGluZy4gKi8KK30KKworc3RhdGljIGludCBhbWRfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJaW50IGksIGosIG51bV9lbnRyaWVzOworCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqY3VyX2dhdHQ7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJbnVtX2VudHJpZXMgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpLT5udW1fZW50cmllczsKKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlqID0gcGdfc3RhcnQ7CisJd2hpbGUgKGogPCAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpKSB7CisJCWFkZHIgPSAoaiAqIFBBR0VfU0laRSkgKyBhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyOworCQljdXJfZ2F0dCA9IEdFVF9HQVRUKGFkZHIpOworCQlpZiAoIVBHRV9FTVBUWShhZ3BfYnJpZGdlLCByZWFkbChjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWorKzsKKwl9CisKKwlpZiAobWVtLT5pc19mbHVzaGVkID09IEZBTFNFKSB7CisJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCQltZW0tPmlzX2ZsdXNoZWQgPSBUUlVFOworCX0KKworCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKKwkJYWRkciA9IChqICogUEFHRV9TSVpFKSArIGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHI7CisJCWN1cl9nYXR0ID0gR0VUX0dBVFQoYWRkcik7CisJCXdyaXRlbChhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAorCQkJbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksIGN1cl9nYXR0K0dFVF9HQVRUX09GRihhZGRyKSk7CisJCXJlYWRsKGN1cl9nYXR0K0dFVF9HQVRUX09GRihhZGRyKSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKwlhbWRfaXJvbmdhdGVfdGxiZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfcmVtb3ZlX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBfX2lvbWVtICpjdXJfZ2F0dDsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKG1lbS0+cGFnZV9jb3VudCArIHBnX3N0YXJ0KTsgaSsrKSB7CisJCWFkZHIgPSAoaSAqIFBBR0VfU0laRSkgKyBhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyOworCQljdXJfZ2F0dCA9IEdFVF9HQVRUKGFkZHIpOworCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpOworCQlyZWFkbChjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisKKwlhbWRfaXJvbmdhdGVfdGxiZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyIGFtZF9pcm9uZ2F0ZV9zaXplc1s3XSA9Cit7CisJezIwNDgsIDUyNDI4OCwgMHgwMDAwMDAwY30sCisJezEwMjQsIDI2MjE0NCwgMHgwMDAwMDAwYX0sCisJezUxMiwgMTMxMDcyLCAweDAwMDAwMDA4fSwKKwl7MjU2LCA2NTUzNiwgMHgwMDAwMDAwNn0sCisJezEyOCwgMzI3NjgsIDB4MDAwMDAwMDR9LAorCXs2NCwgMTYzODQsIDB4MDAwMDAwMDJ9LAorCXszMiwgODE5MiwgMHgwMDAwMDAwMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2F0dF9tYXNrIGFtZF9pcm9uZ2F0ZV9tYXNrc1tdID0KK3sKKwl7Lm1hc2sgPSAxLCAudHlwZSA9IDB9Cit9OworCitzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgYW1kX2lyb25nYXRlX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBhbWRfaXJvbmdhdGVfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBMVkwyX0FQRVJfU0laRSwKKwkubnVtX2FwZXJ0dXJlX3NpemVzCT0gNywKKwkuY29uZmlndXJlCQk9IGFtZF9pcm9uZ2F0ZV9jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gYW1kX2lyb25nYXRlX2ZldGNoX3NpemUsCisJLmNsZWFudXAJCT0gYW1kX2lyb25nYXRlX2NsZWFudXAsCisJLnRsYl9mbHVzaAkJPSBhbWRfaXJvbmdhdGVfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGFncF9nZW5lcmljX21hc2tfbWVtb3J5LAorCS5tYXNrcwkJCT0gYW1kX2lyb25nYXRlX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFtZF9jcmVhdGVfZ2F0dF90YWJsZSwKKwkuZnJlZV9nYXR0X3RhYmxlCT0gYW1kX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhbWRfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhbWRfcmVtb3ZlX21lbW9yeSwKKwkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAorCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAorCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorfTsKKworc3RhdGljIHN0cnVjdCBhZ3BfZGV2aWNlX2lkcyBhbWRfYWdwX2RldmljZV9pZHNbXSBfX2RldmluaXRkYXRhID0KK3sKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FNRF9GRV9HQVRFXzcwMDYsCisJCS5jaGlwc2V0X25hbWUJPSAiSXJvbmdhdGUiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9BTURfRkVfR0FURV83MDBFLAorCQkuY2hpcHNldF9uYW1lCT0gIjc2MSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FNRF9GRV9HQVRFXzcwMEMsCisJCS5jaGlwc2V0X25hbWUJPSAiNzYwTVAiLAorCX0sCisJeyB9LCAvKiBkdW1teSBmaW5hbCBlbnRyeSwgYWx3YXlzIHByZXNlbnQgKi8KK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFncF9hbWRrN19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCXU4IGNhcF9wdHI7CisJaW50IGo7CisKKwljYXBfcHRyID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0FHUCk7CisJaWYgKCFjYXBfcHRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWogPSBlbnQgLSBhZ3BfYW1kazdfcGNpX3RhYmxlOworCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBBTUQgJXMgY2hpcHNldFxuIiwKKwkgICAgICAgYW1kX2FncF9kZXZpY2VfaWRzW2pdLmNoaXBzZXRfbmFtZSk7CisKKwlicmlkZ2UgPSBhZ3BfYWxsb2NfYnJpZGdlKCk7CisJaWYgKCFicmlkZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJYnJpZGdlLT5kcml2ZXIgPSAmYW1kX2lyb25nYXRlX2RyaXZlcjsKKwlicmlkZ2UtPmRldl9wcml2YXRlX2RhdGEgPSAmYW1kX2lyb25nYXRlX3ByaXZhdGUsCisJYnJpZGdlLT5kZXYgPSBwZGV2OworCWJyaWRnZS0+Y2FwbmR4ID0gY2FwX3B0cjsKKworCS8qIDc1MSBFcnJhdGEgKDIyNTY0X0ItMS5QREYpCisJICAgZXJyYXR1bSAyMDogc3Ryb2JlIGdsaXRjaCB3aXRoIE52aWRpYSBOVjEwIEdlRm9yY2UgY2FyZHMuCisJICAgc3lzdGVtIGNvbnRyb2xsZXIgbWF5IGV4cGVyaWVuY2Ugbm9pc2UgZHVlIHRvIHN0cm9uZyBkcml2ZSBzdHJlbmd0aHMKKwkgKi8KKwlpZiAoYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BTURfRkVfR0FURV83MDA2KSB7CisJCXU4IGNhcF9wdHI9MDsKKwkJc3RydWN0IHBjaV9kZXYgKmdmeGNhcmQ9TlVMTDsKKwkJd2hpbGUgKCFjYXBfcHRyKSB7CisJCQlnZnhjYXJkID0gcGNpX2dldF9jbGFzcyhQQ0lfQ0xBU1NfRElTUExBWV9WR0E8PDgsIGdmeGNhcmQpOworCQkJaWYgKCFnZnhjYXJkKSB7CisJCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJDb3VsZG4ndCBmaW5kIGFuIEFHUCBWR0EgY29udHJvbGxlci5cbiIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQkJY2FwX3B0ciA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZ2Z4Y2FyZCwgUENJX0NBUF9JRF9BR1ApOworCQkJaWYgKCFjYXBfcHRyKSB7CisJCQkJcGNpX2Rldl9wdXQoZ2Z4Y2FyZCk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBXaXRoIHNvIG1hbnkgdmFyaWFudHMgb2YgTlZpZGlhIGNhcmRzLCBpdCdzIHNpbXBsZXIganVzdAorCQkgICB0byBibGFja2xpc3QgdGhlbSBhbGwsIGFuZCB0aGVuIHdoaXRlbGlzdCB0aGVtIGFzIG5lZWRlZAorCQkgICAoaWYgbmVjZXNzYXJ5IGF0IGFsbCkuICovCisJCWlmIChnZnhjYXJkLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9OVklESUEpIHsKKwkJCWFncF9icmlkZ2UtPmZsYWdzIHw9IEFHUF9FUlJBVEFfMVg7CisJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkFNRCA3NTEgY2hpcHNldCB3aXRoIE5WaWRpYSBHZUZvcmNlIGRldGVjdGVkLiBGb3JjaW5nIHRvIDFYIGR1ZSB0byBlcnJhdGEuXG4iKTsKKwkJfQorCQlwY2lfZGV2X3B1dChnZnhjYXJkKTsKKwl9CisKKwkvKiA3NjEgRXJyYXRhICgyMzYxM19GLnBkZikKKwkgKiBSZXZpc2lvbnMgQjAvQjEgd2VyZSBhIGRpc2FzdGVyLgorCSAqIGVycmF0dW0gNDQ6IFNZU0NMSy9BR1BDTEsgc2tldyBjYXVzZXMgMlggZmFpbHVyZXMgLS0gRm9yY2UgbW9kZSB0byAxWAorCSAqIGVycmF0dW0gNDU6IFRpbWluZyBwcm9ibGVtIHByZXZlbnRzIGZhc3Qgd3JpdGVzIC0tIERpc2FibGUgZmFzdCB3cml0ZS4KKwkgKiBlcnJhdHVtIDQ2OiBTZXR1cCB2aW9sYXRpb24gb24gQUdQIFNCQSBwaW5zIC0gRGlzYWJsZSBzaWRlIGJhbmQgYWRkcmVzc2luZy4KKwkgKiBXaXRoIHRoaXMgbG90IGRpc2FibGVkLCB3ZSBzaG91bGQgcHJldmVudCBsb2NrdXBzLiAqLworCWlmIChhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FNRF9GRV9HQVRFXzcwMEUpIHsKKwkJdTggcmV2aXNpb249MDsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmcmV2aXNpb24pOworCQlpZiAocmV2aXNpb24gPT0gMHgxMCB8fCByZXZpc2lvbiA9PSAweDExKSB7CisJCQlhZ3BfYnJpZGdlLT5mbGFncyA9IEFHUF9FUlJBVEFfRkFTVFdSSVRFUzsKKwkJCWFncF9icmlkZ2UtPmZsYWdzIHw9IEFHUF9FUlJBVEFfU0JBOworCQkJYWdwX2JyaWRnZS0+ZmxhZ3MgfD0gQUdQX0VSUkFUQV8xWDsKKwkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQU1EIDc2MSBjaGlwc2V0IHdpdGggZXJyYXRhIGRldGVjdGVkIC0gZGlzYWJsaW5nIEFHUCBmYXN0IHdyaXRlcyAmIFNCQSBhbmQgZm9yY2luZyB0byAxWC5cbiIpOworCQl9CisJfQorCisJLyogRmlsbCBpbiB0aGUgbW9kZSByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LAorCQkJYnJpZGdlLT5jYXBuZHgrUENJX0FHUF9TVEFUVVMsCisJCQkmYnJpZGdlLT5tb2RlKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX2FtZGs3X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlhZ3BfcmVtb3ZlX2JyaWRnZShicmlkZ2UpOworCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7Cit9CisKKy8qIG11c3QgYmUgdGhlIHNhbWUgb3JkZXIgYXMgbmFtZSB0YWJsZSBhYm92ZSAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFncF9hbWRrN19wY2lfdGFibGVbXSA9IHsKKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfQU1ELAorCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9BTURfRkVfR0FURV83MDA2LAorCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCX0sCisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0FNRCwKKwkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfQU1EX0ZFX0dBVEVfNzAwRSwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9BTUQsCisJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0FNRF9GRV9HQVRFXzcwMEMsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZ3BfYW1kazdfcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFncF9hbWRrN19wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJhZ3BnYXJ0LWFtZGs3IiwKKwkuaWRfdGFibGUJPSBhZ3BfYW1kazdfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBhZ3BfYW1kazdfcHJvYmUsCisJLnJlbW92ZQkJPSBhZ3BfYW1kazdfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWdwX2FtZGs3X2luaXQodm9pZCkKK3sKKwlpZiAoYWdwX29mZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFncF9hbWRrN19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFncF9hbWRrN19jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZ3BfYW1kazdfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFncF9hbWRrN19pbml0KTsKK21vZHVsZV9leGl0KGFncF9hbWRrN19jbGVhbnVwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNWYwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCkBAIC0wLDAgKzEsNzYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTdVNFIExhYnMuCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIHB1YmxpYyBsaWNlbnNlLCB2Mi4KKyAqCisgKiBUaGlzIGlzIGEgR0FSVCBkcml2ZXIgZm9yIHRoZSBBTUQgT3B0ZXJvbi9BdGhsb242NCBvbi1DUFUgbm9ydGhicmlkZ2UuCisgKiBJdCBhbHNvIGluY2x1ZGVzIHN1cHBvcnQgZm9yIHRoZSBBTUQgODE1MSBBR1AgYnJpZGdlLAorICogYWx0aG91Z2ggaXQgZG9lc24ndCBhY3R1YWxseSBkbyBtdWNoLCBhcyBhbGwgdGhlIHJlYWwKKyAqIHdvcmsgaXMgZG9uZSBpbiB0aGUgbm9ydGhicmlkZ2UocykuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgorI2luY2x1ZGUgImFncC5oIgorCisvKiBXaWxsIG5lZWQgdG8gYmUgaW5jcmVhc2VkIGlmIEFNRDY0IGV2ZXIgZ29lcyA+OC13YXkuICovCisjZGVmaW5lIE1BWF9IQU1NRVJfR0FSVFMgICA4CisKKy8qIFBURSBiaXRzLiAqLworI2RlZmluZSBHUFRFX1ZBTElECTEKKyNkZWZpbmUgR1BURV9DT0hFUkVOVAkyCisKKy8qIEFwZXJ0dXJlIGNvbnRyb2wgcmVnaXN0ZXIgYml0cy4gKi8KKyNkZWZpbmUgR0FSVEVOCQkoMTw8MCkKKyNkZWZpbmUgRElTR0FSVENQVQkoMTw8NCkKKyNkZWZpbmUgRElTR0FSVElPCSgxPDw1KQorCisvKiBHQVJUIGNhY2hlIGNvbnRyb2wgcmVnaXN0ZXIgYml0cy4gKi8KKyNkZWZpbmUgSU5WR0FSVAkJKDE8PDApCisjZGVmaW5lIEdBUlRQVEVFUlIJKDE8PDEpCisKKy8qIEs4IE9uLWNwdSBHQVJUIHJlZ2lzdGVycyAqLworI2RlZmluZSBBTUQ2NF9HQVJUQVBFUlRVUkVDVEwJMHg5MAorI2RlZmluZSBBTUQ2NF9HQVJUQVBFUlRVUkVCQVNFCTB4OTQKKyNkZWZpbmUgQU1ENjRfR0FSVFRBQkxFQkFTRQkweDk4CisjZGVmaW5lIEFNRDY0X0dBUlRDQUNIRUNUTAkweDljCisjZGVmaW5lIEFNRDY0X0dBUlRFTgkJKDE8PDApCisKKy8qIE5WSURJQSBLOCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlZJRElBX1g4Nl82NF8wX0FQQkFTRQkJMHgxMAorI2RlZmluZSBOVklESUFfWDg2XzY0XzFfQVBCQVNFMQkJMHg1MAorI2RlZmluZSBOVklESUFfWDg2XzY0XzFfQVBMSU1JVDEJMHg1NAorI2RlZmluZSBOVklESUFfWDg2XzY0XzFfQVBTSVpFCQkweGE4CisjZGVmaW5lIE5WSURJQV9YODZfNjRfMV9BUEJBU0UyCQkweGQ4CisjZGVmaW5lIE5WSURJQV9YODZfNjRfMV9BUExJTUlUMgkweGRjCisKKy8qIFVMaSBLOCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVUxJX1g4Nl82NF9CQVNFX0FERFIJCTB4MTAKKyNkZWZpbmUgVUxJX1g4Nl82NF9IVFRfRkVBX1JFRwkJMHg1MAorI2RlZmluZSBVTElfWDg2XzY0X0VOVV9TQ1JfUkVHCQkweDU0CisKK3N0YXRpYyBpbnQgbnJfZ2FydHM7CitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKiBoYW1tZXJzW01BWF9IQU1NRVJfR0FSVFNdOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlICphcGVydHVyZV9yZXNvdXJjZTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBhZ3BfdHJ5X3Vuc3VwcG9ydGVkOworCitzdGF0aWMgaW50IGdhcnRfaXRlcmF0b3I7CisjZGVmaW5lIGZvcl9lYWNoX25iKCkgZm9yKGdhcnRfaXRlcmF0b3I9MDtnYXJ0X2l0ZXJhdG9yPG5yX2dhcnRzO2dhcnRfaXRlcmF0b3IrKykKKworc3RhdGljIHZvaWQgZmx1c2hfYW1kNjRfdGxiKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTMyIHRtcDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoZGV2LCBBTUQ2NF9HQVJUQ0FDSEVDVEwsICZ0bXApOworCXRtcCB8PSBJTlZHQVJUOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKGRldiwgQU1ENjRfR0FSVENBQ0hFQ1RMLCB0bXApOworfQorCitzdGF0aWMgdm9pZCBhbWQ2NF90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqdGVtcCkKK3sKKwlmb3JfZWFjaF9uYigpCisJCWZsdXNoX2FtZDY0X3RsYihoYW1tZXJzW2dhcnRfaXRlcmF0b3JdKTsKK30KKworc3RhdGljIGludCBhbWQ2NF9pbnNlcnRfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKK3sKKwlpbnQgaSwgaiwgbnVtX2VudHJpZXM7CisJbG9uZyBsb25nIHRtcDsKKwl1MzIgcHRlOworCisJbnVtX2VudHJpZXMgPSBhZ3BfbnVtX2VudHJpZXMoKTsKKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogTWFrZSBzdXJlIHdlIGNhbiBmaXQgdGhlIHJhbmdlIGluIHRoZSBnYXR0IHRhYmxlLiAqLworCS8qIEZJWE1FOiBjb3VsZCB3cmFwICovCisJaWYgKCgodW5zaWduZWQgbG9uZylwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlqID0gcGdfc3RhcnQ7CisKKwkvKiBnYXR0IHRhYmxlIHNob3VsZCBiZSBlbXB0eS4gKi8KKwl3aGlsZSAoaiA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkpIHsKKwkJaWYgKCFQR0VfRU1QVFkoYWdwX2JyaWRnZSwgcmVhZGwoYWdwX2JyaWRnZS0+Z2F0dF90YWJsZStqKSkpCisJCQlyZXR1cm4gLUVCVVNZOworCQlqKys7CisJfQorCisJaWYgKG1lbS0+aXNfZmx1c2hlZCA9PSBGQUxTRSkgeworCQlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwkJbWVtLT5pc19mbHVzaGVkID0gVFJVRTsKKwl9CisKKwlmb3IgKGkgPSAwLCBqID0gcGdfc3RhcnQ7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKywgaisrKSB7CisJCXRtcCA9IGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKKwkJCW1lbS0+bWVtb3J5W2ldLCBtZW0tPnR5cGUpOworCisJCUJVR19PTih0bXAgJiAweGZmZmZmZjAwMDAwMDBmZmNVTEwpOworCQlwdGUgPSAodG1wICYgMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAyODsKKwkJcHRlIHw9KHRtcCAmIDB4MDAwMDAwMDBmZmZmZjAwMFVMTCk7CisJCXB0ZSB8PSBHUFRFX1ZBTElEIHwgR1BURV9DT0hFUkVOVDsKKworCQl3cml0ZWwocHRlLCBhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlK2opOworCQlyZWFkbChhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlK2opOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisJYW1kNjRfdGxiZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaGFjayBhbHRlcnMgdGhlIG9yZGVyIGVsZW1lbnQgYWNjb3JkaW5nCisgKiB0byB0aGUgc2l6ZSBvZiBhIGxvbmcuIEl0IHN1Y2tzLiBJIHRvdGFsbHkgZGlzb3duIHRoaXMsIGV2ZW4KKyAqIHRob3VnaCBpdCBkb2VzIGFwcGVhciB0byB3b3JrIGZvciB0aGUgbW9zdCBwYXJ0LgorICovCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzMyIGFtZDY0X2FwZXJ0dXJlX3NpemVzWzddID0KK3sKKwl7MzIsICAgODE5MiwgICAzKyhzaXplb2YobG9uZykvOCksIDAgfSwKKwl7NjQsICAgMTYzODQsICA0KyhzaXplb2YobG9uZykvOCksIDE8PDEgfSwKKwl7MTI4LCAgMzI3NjgsICA1KyhzaXplb2YobG9uZykvOCksIDE8PDIgfSwKKwl7MjU2LCAgNjU1MzYsICA2KyhzaXplb2YobG9uZykvOCksIDE8PDEgfCAxPDwyIH0sCisJezUxMiwgIDEzMTA3MiwgNysoc2l6ZW9mKGxvbmcpLzgpLCAxPDwzIH0sCisJezEwMjQsIDI2MjE0NCwgOCsoc2l6ZW9mKGxvbmcpLzgpLCAxPDwxIHwgMTw8M30sCisJezIwNDgsIDUyNDI4OCwgOSsoc2l6ZW9mKGxvbmcpLzgpLCAxPDwyIHwgMTw8M30KK307CisKKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBBcGVydHVyZSBzaXplIGZyb20gdGhlIHg4Ni02NC4KKyAqIE5vdGUsIHRoYXQgdGhlcmUgbWF5IGJlIG11bHRpcGxlIHg4Ni02NCdzLCBidXQgd2UganVzdCByZXR1cm4KKyAqIHRoZSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBvbmUgd2UgZmluZC4gVGhlIHNldF9zaXplIGZ1bmN0aW9ucworICoga2VlcCB0aGUgcmVzdCBjb2hlcmVudCBhbnl3YXkuIE9yIGF0IGxlYXN0IHNob3VsZCBkby4KKyAqLworc3RhdGljIGludCBhbWQ2NF9mZXRjaF9zaXplKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQgaTsKKwl1MzIgdGVtcDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgKnZhbHVlczsKKworCWRldiA9IGhhbW1lcnNbMF07CisJaWYgKGRldj09TlVMTCkKKwkJcmV0dXJuIDA7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBBTUQ2NF9HQVJUQVBFUlRVUkVDVEwsICZ0ZW1wKTsKKwl0ZW1wID0gKHRlbXAgJiAweGUpOworCXZhbHVlcyA9IEFfU0laRV8zMihhbWQ2NF9hcGVydHVyZV9zaXplcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWdwX2JyaWRnZS0+ZHJpdmVyLT5udW1fYXBlcnR1cmVfc2l6ZXM7IGkrKykgeworCQlpZiAodGVtcCA9PSB2YWx1ZXNbaV0uc2l6ZV92YWx1ZSkgeworCQkJYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSA9CisJCQkgICAgYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgKHZhbHVlcyArIGkpOworCisJCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IGk7CisJCQlyZXR1cm4gdmFsdWVzW2ldLnNpemU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbiBhIG11bHRpcHJvY2Vzc29yIHg4Ni02NCBzeXN0ZW0sIHRoaXMgZnVuY3Rpb24gZ2V0cworICogY2FsbGVkIG9uY2UgZm9yIGVhY2ggQ1BVLgorICovCitzdGF0aWMgdTY0IGFtZDY0X2NvbmZpZ3VyZSAoc3RydWN0IHBjaV9kZXYgKmhhbW1lciwgdTY0IGdhdHRfdGFibGUpCit7CisJdTY0IGFwZXJ0dXJlYmFzZTsKKwl1MzIgdG1wOworCXU2NCBhZGRyLCBhcGVyX2Jhc2U7CisKKwkvKiBBZGRyZXNzIHRvIG1hcCB0byAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoaGFtbWVyLCBBTUQ2NF9HQVJUQVBFUlRVUkVCQVNFLCAmdG1wKTsKKwlhcGVydHVyZWJhc2UgPSB0bXAgPDwgMjU7CisJYXBlcl9iYXNlID0gKGFwZXJ0dXJlYmFzZSAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJLyogYWRkcmVzcyBvZiB0aGUgbWFwcGluZ3MgdGFibGUgKi8KKwlhZGRyID0gKHU2NCkgZ2F0dF90YWJsZTsKKwlhZGRyID4+PSAxMjsKKwl0bXAgPSAodTMyKSBhZGRyPDw0OworCXRtcCAmPSB+MHhmOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKGhhbW1lciwgQU1ENjRfR0FSVFRBQkxFQkFTRSwgdG1wKTsKKworCS8qIEVuYWJsZSBHQVJUIHRyYW5zbGF0aW9uIGZvciB0aGlzIGhhbW1lci4gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaGFtbWVyLCBBTUQ2NF9HQVJUQVBFUlRVUkVDVEwsICZ0bXApOworCXRtcCB8PSBHQVJURU47CisJdG1wICY9IH4oRElTR0FSVENQVSB8IERJU0dBUlRJTyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChoYW1tZXIsIEFNRDY0X0dBUlRBUEVSVFVSRUNUTCwgdG1wKTsKKworCS8qIGtlZXAgQ1BVJ3MgY29oZXJlbnQuICovCisJZmx1c2hfYW1kNjRfdGxiIChoYW1tZXIpOworCisJcmV0dXJuIGFwZXJfYmFzZTsKK30KKworCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzMyIGFtZF84MTUxX3NpemVzWzddID0KK3sKKwl7MjA0OCwgNTI0Mjg4LCA5LCAweDAwMDAwMDAwIH0sCS8qIDAgMCAwIDAgMCAwICovCisJezEwMjQsIDI2MjE0NCwgOCwgMHgwMDAwMDQwMCB9LAkvKiAxIDAgMCAwIDAgMCAqLworCXs1MTIsICAxMzEwNzIsIDcsIDB4MDAwMDA2MDAgfSwJLyogMSAxIDAgMCAwIDAgKi8KKwl7MjU2LCAgNjU1MzYsICA2LCAweDAwMDAwNzAwIH0sCS8qIDEgMSAxIDAgMCAwICovCisJezEyOCwgIDMyNzY4LCAgNSwgMHgwMDAwMDcyMCB9LAkvKiAxIDEgMSAxIDAgMCAqLworCXs2NCwgICAxNjM4NCwgIDQsIDB4MDAwMDA3MzAgfSwJLyogMSAxIDEgMSAxIDAgKi8KKwl7MzIsICAgODE5MiwgICAzLCAweDAwMDAwNzM4IH0gCS8qIDEgMSAxIDEgMSAxICovCit9OworCitzdGF0aWMgaW50IGFtZF84MTUxX2NvbmZpZ3VyZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZ2F0dF9idXMgPSB2aXJ0X3RvX3BoeXMoYWdwX2JyaWRnZS0+Z2F0dF90YWJsZV9yZWFsKTsKKworCS8qIENvbmZpZ3VyZSBBR1AgcmVncyBpbiBlYWNoIHg4Ni02NCBob3N0IGJyaWRnZS4gKi8KKwlmb3JfZWFjaF9uYigpIHsKKwkJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9CisJCQkJYW1kNjRfY29uZmlndXJlKGhhbW1lcnNbZ2FydF9pdGVyYXRvcl0sZ2F0dF9idXMpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBhbWQ2NF9jbGVhbnVwKHZvaWQpCit7CisJdTMyIHRtcDsKKworCWZvcl9lYWNoX25iKCkgeworCQkvKiBkaXNhYmxlIGdhcnQgdHJhbnNsYXRpb24gKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkIChoYW1tZXJzW2dhcnRfaXRlcmF0b3JdLCBBTUQ2NF9HQVJUQVBFUlRVUkVDVEwsICZ0bXApOworCQl0bXAgJj0gfkFNRDY0X0dBUlRFTjsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAoaGFtbWVyc1tnYXJ0X2l0ZXJhdG9yXSwgQU1ENjRfR0FSVEFQRVJUVVJFQ1RMLCB0bXApOworCX0KK30KKworCitzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgYW1kXzgxNTFfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9IGFtZF84MTUxX3NpemVzLAorCS5zaXplX3R5cGUJCT0gVTMyX0FQRVJfU0laRSwKKwkubnVtX2FwZXJ0dXJlX3NpemVzCT0gNywKKwkuY29uZmlndXJlCQk9IGFtZF84MTUxX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSBhbWQ2NF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGFtZDY0X2NsZWFudXAsCisJLnRsYl9mbHVzaAkJPSBhbWQ2NF90bGJmbHVzaCwKKwkubWFza19tZW1vcnkJCT0gYWdwX2dlbmVyaWNfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBOVUxMLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gYW1kNjRfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCit9OworCisvKiBTb21lIGJhc2ljIHNhbml0eSBjaGVja3MgZm9yIHRoZSBhcGVydHVyZS4gKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGFwZXJ0dXJlX3ZhbGlkKHU2NCBhcGVyLCB1MzIgc2l6ZSkKK3sKKwl1MzIgcGZuLCBjOworCWlmIChhcGVyID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gYXBlcnR1cmVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHNpemUgPCAzMioxMDI0KjEwMjQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQXBlcnR1cmUgdG9vIHNtYWxsICglZCBNQilcbiIsIHNpemU+PjIwKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChhcGVyICsgc2l6ZSA+IDB4ZmZmZmZmZmYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQXBlcnR1cmUgb3V0IG9mIGJvdW5kc1xuIik7CisJCXJldHVybiAwOworCX0KKwlwZm4gPSBhcGVyID4+IFBBR0VfU0hJRlQ7CisJZm9yIChjID0gMDsgYyA8IHNpemUvUEFHRV9TSVpFOyBjKyspIHsKKwkJaWYgKCFwZm5fdmFsaWQocGZuICsgYykpCisJCQlicmVhazsKKwkJaWYgKCFQYWdlUmVzZXJ2ZWQocGZuX3RvX3BhZ2UocGZuICsgYykpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJBcGVydHVyZSBwb2ludGluZyB0byBSQU1cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBSZXF1ZXN0IHRoZSBBcGVydHVyZS4gVGhpcyBjYXRjaGVzIGNhc2VzIHdoZW4gc29tZW9uZSBlbHNlCisJICAgYWxyZWFkeSBwdXQgYSBtYXBwaW5nIGluIHRoZXJlIC0gaGFwcGVucyB3aXRoIHNvbWUgdmVyeSBicm9rZW4gQklPUworCisJICAgTWF5YmUgYmV0dGVyIHRvIHVzZSBwY2lfYXNzaWduX3Jlc291cmNlL3BjaV9lbmFibGVfZGV2aWNlIGluc3RlYWQKKwkgICB0cnVzdGluZyB0aGUgYnJpZGdlcz8gKi8KKwlpZiAoIWFwZXJ0dXJlX3Jlc291cmNlICYmCisJICAgICEoYXBlcnR1cmVfcmVzb3VyY2UgPSByZXF1ZXN0X21lbV9yZWdpb24oYXBlciwgc2l6ZSwgImFwZXJ0dXJlIikpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkFwZXJ0dXJlIGNvbmZsaWN0cyB3aXRoIFBDSSBtYXBwaW5nLlxuIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFcqcyBjZW50cmljIEJJT1Mgc29tZXRpbWVzIG9ubHkgc2V0IHVwIHRoZSBhcGVydHVyZSBpbiB0aGUgQUdQCisgKiBicmlkZ2UsIG5vdCB0aGUgbm9ydGhicmlkZ2UuIE9uIEFNRDY0IHRoaXMgaXMgaGFuZGxlZCBlYXJseQorICogaW4gYXBlcnR1cmUuYywgYnV0IHdoZW4gR0FSVF9JT01NVSBpcyBub3QgZW5hYmxlZCBvciB3ZSBydW4KKyAqIG9uIGEgMzJiaXQga2VybmVsIHRoaXMgbmVlZHMgdG8gYmUgcmVkb25lLgorICogVW5mb3J0dW5hdGVseSBpdCBpcyBpbXBvc3NpYmxlIHRvIGZpeCB0aGUgYXBlcnR1cmUgaGVyZSBiZWNhdXNlIGl0J3MgdG9vIGxhdGUKKyAqIHRvIGFsbG9jYXRlIHRoYXQgbXVjaCBtZW1vcnkuIEJ1dCBhdCBsZWFzdCBlcnJvciBvdXQgY2xlYW5seSBpbnN0ZWFkIG9mCisgKiBjcmFzaGluZy4KKyAqLworc3RhdGljIF9fZGV2aW5pdCBpbnQgZml4X25vcnRoYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpuYiwgc3RydWN0IHBjaV9kZXYgKmFncCwKKwkJCQkJCQkJIHUxNiBjYXApCit7CisJdTMyIGFwZXJfbG93LCBhcGVyX2hpOworCXU2NCBhcGVyLCBuYl9hcGVyOworCWludCBvcmRlciA9IDA7CisJdTMyIG5iX29yZGVyLCBuYl9iYXNlOworCXUxNiBhcHNpemU7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQobmIsIDB4OTAsICZuYl9vcmRlcik7CisJbmJfb3JkZXIgPSAobmJfb3JkZXIgPj4gMSkgJiA3OworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChuYiwgMHg5NCwgJm5iX2Jhc2UpOworCW5iX2FwZXIgPSBuYl9iYXNlIDw8IDI1OworCWlmIChhcGVydHVyZV92YWxpZChuYl9hcGVyLCAoMzIqMTAyNCoxMDI0KTw8bmJfb3JkZXIpKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIE5vcnRoYnJpZGdlIHNlZW1zIHRvIGNvbnRhaW4gY3JhcC4gVHJ5IHRoZSBBR1AgYnJpZGdlLiAqLworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwLCBjYXArMHgxNCwgJmFwc2l6ZSk7CisJaWYgKGFwc2l6ZSA9PSAweGZmZmYpCisJCXJldHVybiAtMTsKKworCWFwc2l6ZSAmPSAweGZmZjsKKwkvKiBTb21lIEJJT1MgdXNlIHdlaXJkIGVuY29kaW5ncyBub3QgaW4gdGhlIEFHUHYzIHRhYmxlLiAqLworCWlmIChhcHNpemUgJiAweGZmKQorCQlhcHNpemUgfD0gMHhmMDA7CisJb3JkZXIgPSA3IC0gaHdlaWdodDE2KGFwc2l6ZSk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwLCAweDEwLCAmYXBlcl9sb3cpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3AsIDB4MTQsICZhcGVyX2hpKTsKKwlhcGVyID0gKGFwZXJfbG93ICYgfigoMTw8MjIpLTEpKSB8ICgodTY0KWFwZXJfaGkgPDwgMzIpOworCXByaW50ayhLRVJOX0lORk8gUEZYICJBcGVydHVyZSBmcm9tIEFHUCBAICVMeCBzaXplICV1IE1CXG4iLCBhcGVyLCAzMiA8PCBvcmRlcik7CisJaWYgKG9yZGVyIDwgMCB8fCAhYXBlcnR1cmVfdmFsaWQoYXBlciwgKDMyKjEwMjQqMTAyNCk8PG9yZGVyKSkKKwkJcmV0dXJuIC0xOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChuYiwgMHg5MCwgb3JkZXIgPDwgMSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChuYiwgMHg5NCwgYXBlciA+PiAyNSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fZGV2aW5pdCBpbnQgY2FjaGVfbmJzIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIGNhcF9wdHIpCit7CisJc3RydWN0IHBjaV9kZXYgKmxvb3BfZGV2ID0gTlVMTDsKKwlpbnQgaSA9IDA7CisKKwkvKiBjYWNoZSBwY2lfZGV2cyBvZiBub3J0aGJyaWRnZXMuICovCisJd2hpbGUgKChsb29wX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQU1ELCAweDExMDMsIGxvb3BfZGV2KSkKKwkJCSE9IE5VTEwpIHsKKwkJaWYgKGkgPT0gTUFYX0hBTU1FUl9HQVJUUykgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVG9vIG1hbnkgbm9ydGhicmlkZ2VzIGZvciBBR1BcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChmaXhfbm9ydGhicmlkZ2UobG9vcF9kZXYsIHBkZXYsIGNhcF9wdHIpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gdXNhYmxlIGFwZXJ0dXJlIGZvdW5kLlxuIik7CisjaWZkZWYgX194ODZfNjRfXworCQkJLyogc2hvdWxkIHBvcnQgdGhpcyB0byBpMzg2ICovCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb25zaWRlciByZWJvb3Rpbmcgd2l0aCBpb21tdT1tZW1hcGVyPTIgdG8gZ2V0IGEgZ29vZCBhcGVydHVyZS5cbiIpOworI2VuZGlmCisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaGFtbWVyc1tpKytdID0gbG9vcF9kZXY7CisJfQorCQlucl9nYXJ0cyA9IGk7CisJcmV0dXJuIGkgPT0gMCA/IC0xIDogMDsKK30KKworLyogSGFuZGxlIEFNRCA4MTUxIHF1aXJrcyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGFtZDgxNTFfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCWNoYXIgKnJldnN0cmluZzsKKwl1OCByZXZfaWQ7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZyZXZfaWQpOworCXN3aXRjaCAocmV2X2lkKSB7CisJY2FzZSAweDAxOiByZXZzdHJpbmc9IkEwIjsgYnJlYWs7CisJY2FzZSAweDAyOiByZXZzdHJpbmc9IkExIjsgYnJlYWs7CisJY2FzZSAweDExOiByZXZzdHJpbmc9IkIwIjsgYnJlYWs7CisJY2FzZSAweDEyOiByZXZzdHJpbmc9IkIxIjsgYnJlYWs7CisJY2FzZSAweDEzOiByZXZzdHJpbmc9IkIyIjsgYnJlYWs7CisJY2FzZSAweDE0OiByZXZzdHJpbmc9IkIzIjsgYnJlYWs7CisJZGVmYXVsdDogICByZXZzdHJpbmc9Ij8/IjsgYnJlYWs7CisJfQorCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBBTUQgODE1MSBBR1AgQnJpZGdlIHJldiAlc1xuIiwgcmV2c3RyaW5nKTsKKworCS8qCisJICogV29yayBhcm91bmQgZXJyYXRhLgorCSAqIENoaXBzIGJlZm9yZSBCMiBzdGVwcGluZyBpbmNvcnJlY3RseSByZXBvcnRpbmcgdjMuNQorCSAqLworCWlmIChyZXZfaWQgPCAweDEzKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQ29ycmVjdGluZyBBR1AgcmV2aXNpb24gKHJlcG9ydHMgMy41LCBpcyByZWFsbHkgMy4wKVxuIik7CisJCWJyaWRnZS0+bWFqb3JfdmVyc2lvbiA9IDM7CisJCWJyaWRnZS0+bWlub3JfdmVyc2lvbiA9IDA7CisJfQorfQorCisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgdWxpX3NpemVzWzddID0KK3sKKwl7MjU2LCA2NTUzNiwgNiwgMTB9LAorCXsxMjgsIDMyNzY4LCA1LCA5fSwKKwl7NjQsIDE2Mzg0LCA0LCA4fSwKKwl7MzIsIDgxOTIsIDMsIDd9LAorCXsxNiwgNDA5NiwgMiwgNn0sCisJezgsIDIwNDgsIDEsIDR9LAorCXs0LCAxMDI0LCAwLCAzfQorfTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IHVsaV9hZ3BfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MzIgaHR0ZmVhLGJhc2VhZGRyLGVudXNjcjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2MTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaXplID0gYW1kNjRfZmV0Y2hfc2l6ZSgpOworCXByaW50ayhLRVJOX0lORk8gIlNldHRpbmcgdXAgVUxpIEFHUC4gXG4iKTsKKwlkZXYxID0gcGNpX2ZpbmRfc2xvdCAoKHVuc2lnbmVkIGludClwZGV2LT5idXMtPm51bWJlcixQQ0lfREVWRk4oMCwwKSk7CisJaWYgKGRldjEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiRGV0ZWN0ZWQgYSBVTGkgY2hpcHNldCwgIgorCQkJImJ1dCBjb3VsZCBub3QgZmluZSB0aGUgc2Vjb25kYXJ5IGRldmljZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh1bGlfc2l6ZXMpOyBpKyspCisJCWlmICh1bGlfc2l6ZXNbaV0uc2l6ZSA9PSBzaXplKQorCQkJYnJlYWs7CisKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKHVsaV9zaXplcykpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIk5vIFVMaSBzaXplIGZvdW5kIGZvciAlZFxuIiwgc2l6ZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIHNoYWRvdyB4ODYtNjQgcmVnaXN0ZXJzIGludG8gVUxpIHJlZ2lzdGVycyAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoaGFtbWVyc1swXSwgQU1ENjRfR0FSVEFQRVJUVVJFQkFTRSwgJmh0dGZlYSk7CisKKwkvKiBpZiB4ODYtNjQgYXBlcnR1cmUgYmFzZSBpcyBiZXlvbmQgNEcsIGV4aXQgaGVyZSAqLworCWlmICgoaHR0ZmVhICYgMHg3ZmZmKSA+PiAoMzIgLSAyNSkpCisJCXJldHVybiAtRU5PREVWOworCisJaHR0ZmVhID0gKGh0dGZlYSYgMHg3ZmZmKSA8PCAyNTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBVTElfWDg2XzY0X0JBU0VfQUREUiwgJmJhc2VhZGRyKTsKKwliYXNlYWRkciY9IH5QQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCWJhc2VhZGRyfD0gaHR0ZmVhOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgVUxJX1g4Nl82NF9CQVNFX0FERFIsIGJhc2VhZGRyKTsKKworCWVudXNjcj0gaHR0ZmVhKyAoc2l6ZSAqIDEwMjQgKiAxMDI0KSAtIDE7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYxLCBVTElfWDg2XzY0X0hUVF9GRUFfUkVHLCBodHRmZWEpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2MSwgVUxJX1g4Nl82NF9FTlVfU0NSX1JFRywgZW51c2NyKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzMyIG5mb3JjZTNfc2l6ZXNbNV0gPQoreworCXs1MTIsICAxMzEwNzIsIDcsIDB4MDAwMDAwMDAgfSwKKwl7MjU2LCAgNjU1MzYsICA2LCAweDAwMDAwMDA4IH0sCisJezEyOCwgIDMyNzY4LCAgNSwgMHgwMDAwMDAwQyB9LAorCXs2NCwgICAxNjM4NCwgIDQsIDB4MDAwMDAwMEUgfSwKKwl7MzIsICAgODE5MiwgICAzLCAweDAwMDAwMDBGIH0KK307CisKKy8qIEhhbmRsZSBzaGFkb3cgZGV2aWNlIG9mIHRoZSBOdmlkaWEgTkZvcmNlMyAqLworLyogQ0hFQ0stTUUgb3JpZ2luYWwgMi40IHZlcnNpb24gc2V0IHVwIHNvbWUgSU9SUnMuIENoZWNrIGlmIHRoYXQgaXMgbmVlZGVkLiAqLworc3RhdGljIGludCBfX2RldmluaXQgbmZvcmNlM19hZ3BfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MzIgdG1wLCBhcGJhc2UsIGFwYmFyLCBhcGxpbWl0OworCXN0cnVjdCBwY2lfZGV2ICpkZXYxOworCWludCBpOworCXVuc2lnbmVkIHNpemUgPSBhbWQ2NF9mZXRjaF9zaXplKCk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiU2V0dGluZyB1cCBOZm9yY2UzIEFHUC5cbiIpOworCisJZGV2MSA9IHBjaV9maW5kX3Nsb3QoKHVuc2lnbmVkIGludClwZGV2LT5idXMtPm51bWJlciwgUENJX0RFVkZOKDExLCAwKSk7CisJaWYgKGRldjEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiYWdwZ2FydDogRGV0ZWN0ZWQgYW4gTlZJRElBICIKKwkJCSJuRm9yY2UzIGNoaXBzZXQsIGJ1dCBjb3VsZCBub3QgZmluZCAiCisJCQkidGhlIHNlY29uZGFyeSBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmZvcmNlM19zaXplcyk7IGkrKykKKwkJaWYgKG5mb3JjZTNfc2l6ZXNbaV0uc2l6ZSA9PSBzaXplKQorCQkJYnJlYWs7CisKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKG5mb3JjZTNfc2l6ZXMpKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJObyBORm9yY2UzIHNpemUgZm91bmQgZm9yICVkXG4iLCBzaXplKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldjEsIE5WSURJQV9YODZfNjRfMV9BUFNJWkUsICZ0bXApOworCXRtcCAmPSB+KDB4Zik7CisJdG1wIHw9IG5mb3JjZTNfc2l6ZXNbaV0uc2l6ZV92YWx1ZTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldjEsIE5WSURJQV9YODZfNjRfMV9BUFNJWkUsIHRtcCk7CisKKwkvKiBzaGFkb3cgeDg2LTY0IHJlZ2lzdGVycyBpbnRvIE5WSURJQSByZWdpc3RlcnMgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQgKGhhbW1lcnNbMF0sIEFNRDY0X0dBUlRBUEVSVFVSRUJBU0UsICZhcGJhc2UpOworCisJLyogaWYgeDg2LTY0IGFwZXJ0dXJlIGJhc2UgaXMgYmV5b25kIDRHLCBleGl0IGhlcmUgKi8KKwlpZiAoIChhcGJhc2UgJiAweDdmZmYpID4+ICgzMiAtIDI1KSApCisJCSByZXR1cm4gLUVOT0RFVjsKKworCWFwYmFzZSA9IChhcGJhc2UgJiAweDdmZmYpIDw8IDI1OworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIE5WSURJQV9YODZfNjRfMF9BUEJBU0UsICZhcGJhcik7CisJYXBiYXIgJj0gflBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJYXBiYXIgfD0gYXBiYXNlOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgTlZJRElBX1g4Nl82NF8wX0FQQkFTRSwgYXBiYXIpOworCisJYXBsaW1pdCA9IGFwYmFzZSArIChzaXplICogMTAyNCAqIDEwMjQpIC0gMTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldjEsIE5WSURJQV9YODZfNjRfMV9BUEJBU0UxLCBhcGJhc2UpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2MSwgTlZJRElBX1g4Nl82NF8xX0FQTElNSVQxLCBhcGxpbWl0KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldjEsIE5WSURJQV9YODZfNjRfMV9BUEJBU0UyLCBhcGJhc2UpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2MSwgTlZJRElBX1g4Nl82NF8xX0FQTElNSVQyLCBhcGxpbWl0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZ3BfYW1kNjRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZTsKKwl1OCBjYXBfcHRyOworCisJY2FwX3B0ciA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9BR1ApOworCWlmICghY2FwX3B0cikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBDb3VsZCBjaGVjayBmb3IgQUdQdjMgaGVyZSAqLworCisJYnJpZGdlID0gYWdwX2FsbG9jX2JyaWRnZSgpOworCWlmICghYnJpZGdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BTUQgJiYKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQU1EXzgxNTFfMCkgeworCQlhbWQ4MTUxX2luaXQocGRldiwgYnJpZGdlKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiRGV0ZWN0ZWQgQUdQIGJyaWRnZSAleFxuIiwgcGRldi0+ZGV2Zm4pOworCX0KKworCWJyaWRnZS0+ZHJpdmVyID0gJmFtZF84MTUxX2RyaXZlcjsKKwlicmlkZ2UtPmRldiA9IHBkZXY7CisJYnJpZGdlLT5jYXBuZHggPSBjYXBfcHRyOworCisJLyogRmlsbCBpbiB0aGUgbW9kZSByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBicmlkZ2UtPmNhcG5keCtQQ0lfQUdQX1NUQVRVUywgJmJyaWRnZS0+bW9kZSk7CisKKwlpZiAoY2FjaGVfbmJzKHBkZXYsIGNhcF9wdHIpID09IC0xKSB7CisJCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9OVklESUEpIHsKKwkJaW50IHJldCA9IG5mb3JjZTNfYWdwX2luaXQocGRldik7CisJCWlmIChyZXQpIHsKKwkJCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FMKSB7CisJCWludCByZXQgPSB1bGlfYWdwX2luaXQocGRldik7CisJCWlmIChyZXQpIHsKKwkJCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGJyaWRnZSk7CisJcmV0dXJuIGFncF9hZGRfYnJpZGdlKGJyaWRnZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhZ3BfYW1kNjRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJlbGVhc2VfbWVtX3JlZ2lvbih2aXJ0X3RvX3BoeXMoYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwpLAorCQkJICAgYW1kNjRfYXBlcnR1cmVfc2l6ZXNbYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeF0uc2l6ZSk7CisJYWdwX3JlbW92ZV9icmlkZ2UoYnJpZGdlKTsKKwlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWdwX2FtZDY0X3BjaV90YWJsZVtdID0geworCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9BTUQsCisJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0FNRF84MTUxXzAsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwkvKiBVTGkgTTE2ODkgKi8KKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfQUwsCisJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0FMX00xNjg5LAorCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCX0sCisJLyogVklBIEs4VDgwMFBybyAqLworCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9WSUEsCisJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1ZJQV9LOFQ4MDBQUk9fMCwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCS8qIFZJQSBLOFQ4MDAgKi8KKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfVklBLAorCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9WSUFfODM4NV8wLAorCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCX0sCisJLyogVklBIEs4TTgwMCAvIEs4TjgwMCAqLworCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9WSUEsCisJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1ZJQV84MzgwXzAsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwkvKiBWSUEgSzhUODkwICovCisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1ZJQSwKKwkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfVklBXzMyMzhfMCwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCS8qIFZJQSBLOFQ4MDAvSzhNODAwL0s4TjgwMCAqLworCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9WSUEsCisJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1ZJQV84MzhYXzEsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwkvKiBORm9yY2UzICovCisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTMsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFM1MsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwkvKiBTSVMgNzU1ICovCisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1NJLAorCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9TSV83NTUsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZ3BfYW1kNjRfcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFncF9hbWQ2NF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJhZ3BnYXJ0LWFtZDY0IiwKKwkuaWRfdGFibGUJPSBhZ3BfYW1kNjRfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBhZ3BfYW1kNjRfcHJvYmUsCisJLnJlbW92ZQkJPSBhZ3BfYW1kNjRfcmVtb3ZlLAorfTsKKworCisvKiBOb3Qgc3RhdGljIGR1ZSB0byBJT01NVSBjb2RlIGNhbGxpbmcgaXQgZWFybHkuICovCitpbnQgX19pbml0IGFncF9hbWQ2NF9pbml0KHZvaWQpCit7CisJaW50IGVyciA9IDA7CisJc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFtZDY0bmJbXSA9IHsKKwkJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCAweDExMDMpIH0sCisJCXsgfSwKKwl9OworCisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3BfYW1kNjRfcGNpX2RyaXZlcikgPiAwKSB7CisJCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJCWlmICghYWdwX3RyeV91bnN1cHBvcnRlZCAmJiAhYWdwX3RyeV91bnN1cHBvcnRlZF9ib290KSB7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiTm8gc3VwcG9ydGVkIEFHUCBicmlkZ2UgZm91bmQuXG4iKTsKKyNpZmRlZiBNT0RVTEUKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJZb3UgY2FuIHRyeSBhZ3BfdHJ5X3Vuc3VwcG9ydGVkPTFcbiIpOworI2Vsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJZb3UgY2FuIGJvb3Qgd2l0aCBhZ3A9dHJ5X3Vuc3VwcG9ydGVkXG4iKTsKKyNlbmRpZgorCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQkvKiBGaXJzdCBjaGVjayB0aGF0IHdlIGhhdmUgYXQgbGVhc3Qgb25lIEFNRDY0IE5CICovCisJCWlmICghcGNpX2Rldl9wcmVzZW50KGFtZDY0bmIpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJLyogTG9vayBmb3IgYW55IEFHUCBicmlkZ2UgKi8KKwkJZGV2ID0gTlVMTDsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKKwkJCWlmICghcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfQUdQKSkKKwkJCQljb250aW51ZTsKKwkJCS8qIE9ubHkgb25lIGJyaWRnZSBzdXBwb3J0ZWQgcmlnaHQgbm93ICovCisJCQlpZiAoYWdwX2FtZDY0X3Byb2JlKGRldiwgTlVMTCkgPT0gMCkgeworCQkJCWVyciA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFncF9hbWQ2NF9jbGVhbnVwKHZvaWQpCit7CisJaWYgKGFwZXJ0dXJlX3Jlc291cmNlKQorCQlyZWxlYXNlX3Jlc291cmNlKGFwZXJ0dXJlX3Jlc291cmNlKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFncF9hbWQ2NF9wY2lfZHJpdmVyKTsKK30KKworLyogT24gQU1ENjQgdGhlIFBDSSBkcml2ZXIgbmVlZHMgdG8gaW5pdGlhbGl6ZSB0aGlzIGRyaXZlciBlYXJseQorICAgZm9yIHRoZSBJT01NVSwgc28gaXQgaGFzIHRvIGJlIGNhbGxlZCB2aWEgYSBiYWNrZG9vci4gKi8KKyNpZm5kZWYgQ09ORklHX0dBUlRfSU9NTVUKK21vZHVsZV9pbml0KGFncF9hbWQ2NF9pbml0KTsKK21vZHVsZV9leGl0KGFncF9hbWQ2NF9jbGVhbnVwKTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4sIEFuZGkgS2xlZW4iKTsKK21vZHVsZV9wYXJhbShhZ3BfdHJ5X3Vuc3VwcG9ydGVkLCBib29sLCAwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9hdGktYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3ZGRlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCkBAIC0wLDAgKzEsNTQ4IEBACisvKgorICogQVRpIEFHUEdBUlQgcm91dGluZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSA8YXNtL2FncC5oPgorI2luY2x1ZGUgImFncC5oIgorCisjZGVmaW5lIEFUSV9HQVJUX01NQkFTRV9BRERSCTB4MTQKKyNkZWZpbmUgQVRJX1JTMTAwX0FQU0laRQkweGFjCisjZGVmaW5lIEFUSV9SUzEwMF9JR19BR1BNT0RFCTB4YjAKKyNkZWZpbmUgQVRJX1JTMzAwX0FQU0laRQkweGY4CisjZGVmaW5lIEFUSV9SUzMwMF9JR19BR1BNT0RFCTB4ZmMKKyNkZWZpbmUgQVRJX0dBUlRfRkVBVFVSRV9JRAkJMHgwMAorI2RlZmluZSBBVElfR0FSVF9CQVNFCQkJMHgwNAorI2RlZmluZSBBVElfR0FSVF9DQUNIRV9TWkJBU0UJCTB4MDgKKyNkZWZpbmUgQVRJX0dBUlRfQ0FDSEVfQ05UUkwJCTB4MGMKKyNkZWZpbmUgQVRJX0dBUlRfQ0FDSEVfRU5UUllfQ05UUkwJMHgxMAorCisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiBhdGlfZ2VuZXJpY19zaXplc1s3XSA9Cit7CisJezIwNDgsIDUyNDI4OCwgMHgwMDAwMDAwY30sCisJezEwMjQsIDI2MjE0NCwgMHgwMDAwMDAwYX0sCisJezUxMiwgMTMxMDcyLCAweDAwMDAwMDA4fSwKKwl7MjU2LCA2NTUzNiwgMHgwMDAwMDAwNn0sCisJezEyOCwgMzI3NjgsIDB4MDAwMDAwMDR9LAorCXs2NCwgMTYzODQsIDB4MDAwMDAwMDJ9LAorCXszMiwgODE5MiwgMHgwMDAwMDAwMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2F0dF9tYXNrIGF0aV9nZW5lcmljX21hc2tzW10gPQoreworCXsgLm1hc2sgPSAxLCAudHlwZSA9IDB9Cit9OworCisKKwordHlwZWRlZiBzdHJ1Y3QgX2F0aV9wYWdlX21hcCB7CisJdW5zaWduZWQgbG9uZyAqcmVhbDsKKwl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnJlbWFwcGVkOworfSBhdGlfcGFnZV9tYXA7CisKK3N0YXRpYyBzdHJ1Y3QgX2F0aV9nZW5lcmljX3ByaXZhdGUgeworCXZvbGF0aWxlIHU4IF9faW9tZW0gKnJlZ2lzdGVyczsKKwlhdGlfcGFnZV9tYXAgKipnYXR0X3BhZ2VzOworCWludCBudW1fdGFibGVzOworfSBhdGlfZ2VuZXJpY19wcml2YXRlOworCitzdGF0aWMgaW50IGF0aV9jcmVhdGVfcGFnZV9tYXAoYXRpX3BhZ2VfbWFwICpwYWdlX21hcCkKK3sKKwlpbnQgaSwgZXJyID0gMDsKKworCXBhZ2VfbWFwLT5yZWFsID0gKHVuc2lnbmVkIGxvbmcgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmIChwYWdlX21hcC0+cmVhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwllcnIgPSBtYXBfcGFnZV9pbnRvX2FncCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwlwYWdlX21hcC0+cmVtYXBwZWQgPSBpb3JlbWFwX25vY2FjaGUodmlydF90b19waHlzKHBhZ2VfbWFwLT5yZWFsKSwKKwkJCQkJICAgIFBBR0VfU0laRSk7CisJaWYgKHBhZ2VfbWFwLT5yZW1hcHBlZCA9PSBOVUxMIHx8IGVycikgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlX21hcC0+cmVhbCk7CisJCXBhZ2VfbWFwLT5yZWFsID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qQ0FDSEVfRkxVU0goKTsqLworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCisJZm9yKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOyBpKyspIHsKKwkJd3JpdGVsKGFncF9icmlkZ2UtPnNjcmF0Y2hfcGFnZSwgcGFnZV9tYXAtPnJlbWFwcGVkK2kpOworCQlyZWFkbChwYWdlX21hcC0+cmVtYXBwZWQraSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGF0aV9mcmVlX3BhZ2VfbWFwKGF0aV9wYWdlX21hcCAqcGFnZV9tYXApCit7CisJdW5tYXBfcGFnZV9mcm9tX2FncCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwlpb3VubWFwKHBhZ2VfbWFwLT5yZW1hcHBlZCk7CisJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHBhZ2VfbWFwLT5yZWFsKSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlX21hcC0+cmVhbCk7Cit9CisKKworc3RhdGljIHZvaWQgYXRpX2ZyZWVfZ2F0dF9wYWdlcyh2b2lkKQoreworCWludCBpOworCWF0aV9wYWdlX21hcCAqKnRhYmxlczsKKwlhdGlfcGFnZV9tYXAgKmVudHJ5OworCisJdGFibGVzID0gYXRpX2dlbmVyaWNfcHJpdmF0ZS5nYXR0X3BhZ2VzOworCWZvcihpID0gMDsgaSA8IGF0aV9nZW5lcmljX3ByaXZhdGUubnVtX3RhYmxlczsgaSsrKSB7CisJCWVudHJ5ID0gdGFibGVzW2ldOworCQlpZiAoZW50cnkgIT0gTlVMTCkgeworCQkJaWYgKGVudHJ5LT5yZWFsICE9IE5VTEwpCisJCQkJYXRpX2ZyZWVfcGFnZV9tYXAoZW50cnkpOworCQkJa2ZyZWUoZW50cnkpOworCQl9CisJfQorCWtmcmVlKHRhYmxlcyk7Cit9CisKKworc3RhdGljIGludCBhdGlfY3JlYXRlX2dhdHRfcGFnZXMoaW50IG5yX3RhYmxlcykKK3sKKwlhdGlfcGFnZV9tYXAgKip0YWJsZXM7CisJYXRpX3BhZ2VfbWFwICplbnRyeTsKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgaTsKKworCXRhYmxlcyA9IGttYWxsb2MoKG5yX3RhYmxlcyArIDEpICogc2l6ZW9mKGF0aV9wYWdlX21hcCAqKSwKKwkJCSBHRlBfS0VSTkVMKTsKKwlpZiAodGFibGVzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHRhYmxlcywgMCwgc2l6ZW9mKGF0aV9wYWdlX21hcCAqKSAqIChucl90YWJsZXMgKyAxKSk7CisJZm9yIChpID0gMDsgaSA8IG5yX3RhYmxlczsgaSsrKSB7CisJCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoYXRpX3BhZ2VfbWFwKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCQl3aGlsZSAoaT4wKSB7CisJCQkJa2ZyZWUgKHRhYmxlc1tpLTFdKTsKKwkJCQlpLS07CisJCQl9CisJCQlrZnJlZSAodGFibGVzKTsKKwkJCXRhYmxlcyA9IE5VTEw7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoYXRpX3BhZ2VfbWFwKSk7CisJCXRhYmxlc1tpXSA9IGVudHJ5OworCQlyZXR2YWwgPSBhdGlfY3JlYXRlX3BhZ2VfbWFwKGVudHJ5KTsKKwkJaWYgKHJldHZhbCAhPSAwKSBicmVhazsKKwl9CisJYXRpX2dlbmVyaWNfcHJpdmF0ZS5udW1fdGFibGVzID0gbnJfdGFibGVzOworCWF0aV9nZW5lcmljX3ByaXZhdGUuZ2F0dF9wYWdlcyA9IHRhYmxlczsKKworCWlmIChyZXR2YWwgIT0gMCkgYXRpX2ZyZWVfZ2F0dF9wYWdlcygpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBpc19yMjAwKHZvaWQpCit7CisJaWYgKChhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FUSV9SUzEwMCkgfHwKKwkgICAgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQVRJX1JTMjAwKSB8fAorCSAgICAoYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BVElfUlMyMDBfQikgfHwKKwkgICAgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQVRJX1JTMjUwKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRpX2ZldGNoX3NpemUodm9pZCkKK3sKKwlpbnQgaTsKKwl1MzIgdGVtcDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiAqdmFsdWVzOworCisJaWYgKGlzX3IyMDAoKSkKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX1JTMTAwX0FQU0laRSwgJnRlbXApOworCWVsc2UKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX1JTMzAwX0FQU0laRSwgJnRlbXApOworCisJdGVtcCA9ICh0ZW1wICYgMHgwMDAwMDAwZSk7CisJdmFsdWVzID0gQV9TSVpFX0xWTDIoYWdwX2JyaWRnZS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcyk7CisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJaWYgKHRlbXAgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKworCQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQkJcmV0dXJuIHZhbHVlc1tpXS5zaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0aV90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqIG1lbSkKK3sKKwl3cml0ZWwoMSwgYXRpX2dlbmVyaWNfcHJpdmF0ZS5yZWdpc3RlcnMrQVRJX0dBUlRfQ0FDSEVfQ05UUkwpOworCXJlYWRsKGF0aV9nZW5lcmljX3ByaXZhdGUucmVnaXN0ZXJzK0FUSV9HQVJUX0NBQ0hFX0NOVFJMKTsJLyogUENJIFBvc3RpbmcuICovCit9CisKK3N0YXRpYyB2b2lkIGF0aV9jbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2x2bDIgKnByZXZpb3VzX3NpemU7CisJdTMyIHRlbXA7CisKKwlwcmV2aW91c19zaXplID0gQV9TSVpFX0xWTDIoYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSk7CisKKwkvKiBXcml0ZSBiYWNrIHRoZSBwcmV2aW91cyBzaXplIGFuZCBkaXNhYmxlIGdhcnQgdHJhbnNsYXRpb24gKi8KKwlpZiAoaXNfcjIwMCgpKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFUSV9SUzEwMF9BUFNJWkUsICZ0ZW1wKTsKKwkJdGVtcCA9ICgodGVtcCAmIH4oMHgwMDAwMDAwZikpIHwgcHJldmlvdXNfc2l6ZS0+c2l6ZV92YWx1ZSk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBVElfUlMxMDBfQVBTSVpFLCB0ZW1wKTsKKwl9IGVsc2UgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBVElfUlMzMDBfQVBTSVpFLCAmdGVtcCk7CisJCXRlbXAgPSAoKHRlbXAgJiB+KDB4MDAwMDAwMGYpKSB8IHByZXZpb3VzX3NpemUtPnNpemVfdmFsdWUpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX1JTMzAwX0FQU0laRSwgdGVtcCk7CisJfQorCWlvdW5tYXAoKHZvbGF0aWxlIHU4IF9faW9tZW0gKilhdGlfZ2VuZXJpY19wcml2YXRlLnJlZ2lzdGVycyk7Cit9CisKKworc3RhdGljIGludCBhdGlfY29uZmlndXJlKHZvaWQpCit7CisJdTMyIHRlbXA7CisKKwkvKiBHZXQgdGhlIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX0dBUlRfTU1CQVNFX0FERFIsICZ0ZW1wKTsKKwl0ZW1wID0gKHRlbXAgJiAweGZmZmZmMDAwKTsKKwlhdGlfZ2VuZXJpY19wcml2YXRlLnJlZ2lzdGVycyA9ICh2b2xhdGlsZSB1OCBfX2lvbWVtICopIGlvcmVtYXAodGVtcCwgNDA5Nik7CisKKwlpZiAoaXNfcjIwMCgpKQorICAgICAgIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX1JTMTAwX0lHX0FHUE1PREUsIDB4MjAwMDApOworCWVsc2UKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFUSV9SUzMwMF9JR19BR1BNT0RFLCAweDIwMDAwKTsKKworCS8qIGFkZHJlc3MgdG8gbWFwIHRvbyAqLworICAgICAgICAvKgorCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UuZ2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIklHUDMyMCBnYXJ0X2J1c19hZGRyOiAleFxuIiwgYWdwX2JyaWRnZS5nYXJ0X2J1c19hZGRyKTsKKyAgICAgICAgKi8KKwl3cml0ZWwoMHg2MDAwMCwgYXRpX2dlbmVyaWNfcHJpdmF0ZS5yZWdpc3RlcnMrQVRJX0dBUlRfRkVBVFVSRV9JRCk7CisJcmVhZGwoYXRpX2dlbmVyaWNfcHJpdmF0ZS5yZWdpc3RlcnMrQVRJX0dBUlRfRkVBVFVSRV9JRCk7CS8qIFBDSSBQb3N0aW5nLiovCisKKwkvKiBTSUdOQUxFRF9TWVNURU1fRVJST1IgQCBOQl9TVEFUVVMgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCA0LCAmdGVtcCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIDQsIHRlbXAgfCAoMTw8MTQpKTsKKworCS8qIFdyaXRlIG91dCB0aGUgYWRkcmVzcyBvZiB0aGUgZ2F0dCB0YWJsZSAqLworCXdyaXRlbChhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyLCBhdGlfZ2VuZXJpY19wcml2YXRlLnJlZ2lzdGVycytBVElfR0FSVF9CQVNFKTsKKwlyZWFkbChhdGlfZ2VuZXJpY19wcml2YXRlLnJlZ2lzdGVycytBVElfR0FSVF9CQVNFKTsJLyogUENJIFBvc3RpbmcuICovCisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICpTaW5jZSB3ZSBkb24ndCBuZWVkIGNvbnRpZ2lvdXMgbWVtb3J5IHdlIGp1c3QgdHJ5CisgKiB0byBnZXQgdGhlIGdhdHQgdGFibGUgb25jZQorICovCisKKyNkZWZpbmUgR0VUX1BBR0VfRElSX09GRihhZGRyKSAoYWRkciA+PiAyMikKKyNkZWZpbmUgR0VUX1BBR0VfRElSX0lEWChhZGRyKSAoR0VUX1BBR0VfRElSX09GRihhZGRyKSAtIFwKKwlHRVRfUEFHRV9ESVJfT0ZGKGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIpKQorI2RlZmluZSBHRVRfR0FUVF9PRkYoYWRkcikgKChhZGRyICYgMHgwMDNmZjAwMCkgPj4gMTIpCisjdW5kZWYgIEdFVF9HQVRUCisjZGVmaW5lIEdFVF9HQVRUKGFkZHIpIChhdGlfZ2VuZXJpY19wcml2YXRlLmdhdHRfcGFnZXNbXAorCUdFVF9QQUdFX0RJUl9JRFgoYWRkcildLT5yZW1hcHBlZCkKKworc3RhdGljIGludCBhdGlfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqIG1lbSwKKwkJCSAgICAgb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWludCBpLCBqLCBudW1fZW50cmllczsKKwl1bnNpZ25lZCBsb25nIF9faW9tZW0gKmN1cl9nYXR0OworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCW51bV9lbnRyaWVzID0gQV9TSVpFX0xWTDIoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKS0+bnVtX2VudHJpZXM7CisKKwlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4gbnVtX2VudHJpZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJaiA9IHBnX3N0YXJ0OworCXdoaWxlIChqIDwgKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSkgeworCQlhZGRyID0gKGogKiBQQUdFX1NJWkUpICsgYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkcjsKKwkJY3VyX2dhdHQgPSBHRVRfR0FUVChhZGRyKTsKKwkJaWYgKCFQR0VfRU1QVFkoYWdwX2JyaWRnZSxyZWFkbChjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWorKzsKKwl9CisKKwlpZiAobWVtLT5pc19mbHVzaGVkID09IEZBTFNFKSB7CisJCS8qQ0FDSEVfRkxVU0goKTsgKi8KKwkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJCW1lbS0+aXNfZmx1c2hlZCA9IFRSVUU7CisJfQorCisJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgeworCQlhZGRyID0gKGogKiBQQUdFX1NJWkUpICsgYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkcjsKKwkJY3VyX2dhdHQgPSBHRVRfR0FUVChhZGRyKTsKKwkJd3JpdGVsKGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKKwkJCW1lbS0+bWVtb3J5W2ldLCBtZW0tPnR5cGUpLCBjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpOworCQlyZWFkbChjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisJYWdwX2JyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGlfcmVtb3ZlX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqIG1lbSwgb2ZmX3QgcGdfc3RhcnQsCisJCQkgICAgIGludCB0eXBlKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqY3VyX2dhdHQ7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYgKHR5cGUgIT0gMCB8fCBtZW0tPnR5cGUgIT0gMCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZm9yIChpID0gcGdfc3RhcnQ7IGkgPCAobWVtLT5wYWdlX2NvdW50ICsgcGdfc3RhcnQpOyBpKyspIHsKKwkJYWRkciA9IChpICogUEFHRV9TSVpFKSArIGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHI7CisJCWN1cl9nYXR0ID0gR0VUX0dBVFQoYWRkcik7CisJCXdyaXRlbChhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2UsIGN1cl9nYXR0K0dFVF9HQVRUX09GRihhZGRyKSk7CisJCXJlYWRsKGN1cl9nYXR0K0dFVF9HQVRUX09GRihhZGRyKSk7IC8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRpX2NyZWF0ZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiAqdmFsdWU7CisJYXRpX3BhZ2VfbWFwIHBhZ2VfZGlyOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlpbnQgcmV0dmFsOworCXUzMiB0ZW1wOworCWludCBpOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyICpjdXJyZW50X3NpemU7CisKKwl2YWx1ZSA9IEFfU0laRV9MVkwyKGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisJcmV0dmFsID0gYXRpX2NyZWF0ZV9wYWdlX21hcCgmcGFnZV9kaXIpOworCWlmIChyZXR2YWwgIT0gMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IGF0aV9jcmVhdGVfZ2F0dF9wYWdlcyh2YWx1ZS0+bnVtX2VudHJpZXMgLyAxMDI0KTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJYXRpX2ZyZWVfcGFnZV9tYXAoJnBhZ2VfZGlyKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwgPSAodTMyICopcGFnZV9kaXIucmVhbDsKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlID0gKHUzMiBfX2lvbWVtICopIHBhZ2VfZGlyLnJlbWFwcGVkOworCWFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIgPSB2aXJ0X3RvX2J1cyhwYWdlX2Rpci5yZWFsKTsKKworCS8qIFdyaXRlIG91dCB0aGUgc2l6ZSByZWdpc3RlciAqLworCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV9MVkwyKGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwlpZiAoaXNfcjIwMCgpKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFUSV9SUzEwMF9BUFNJWkUsICZ0ZW1wKTsKKwkJdGVtcCA9ICgoKHRlbXAgJiB+KDB4MDAwMDAwMGUpKSB8IGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSkKKwkJCXwgMHgwMDAwMDAwMSk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBVElfUlMxMDBfQVBTSVpFLCB0ZW1wKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX1JTMTAwX0FQU0laRSwgJnRlbXApOworCX0gZWxzZSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFUSV9SUzMwMF9BUFNJWkUsICZ0ZW1wKTsKKwkJdGVtcCA9ICgoKHRlbXAgJiB+KDB4MDAwMDAwMGUpKSB8IGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSkKKwkJCXwgMHgwMDAwMDAwMSk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBVElfUlMzMDBfQVBTSVpFLCB0ZW1wKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQVRJX1JTMzAwX0FQU0laRSwgJnRlbXApOworCX0KKworCS8qCisJICogR2V0IHRoZSBhZGRyZXNzIGZvciB0aGUgZ2FydCByZWdpb24uCisJICogVGhpcyBpcyBhIGJ1cyBhZGRyZXNzIGV2ZW4gb24gdGhlIGFscGhhLCBiL2MgaXRzCisJICogdXNlZCB0byBwcm9ncmFtIHRoZSBhZ3AgbWFzdGVyIG5vdCB0aGUgY3B1CisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSBhZGRyOworCisJLyogQ2FsY3VsYXRlIHRoZSBhZ3Agb2Zmc2V0ICovCisJZm9yKGkgPSAwOyBpIDwgdmFsdWUtPm51bV9lbnRyaWVzIC8gMTAyNDsgaSsrLCBhZGRyICs9IDB4MDA0MDAwMDApIHsKKwkJd3JpdGVsKHZpcnRfdG9fYnVzKGF0aV9nZW5lcmljX3ByaXZhdGUuZ2F0dF9wYWdlc1tpXS0+cmVhbCkgfCAxLAorCQkJcGFnZV9kaXIucmVtYXBwZWQrR0VUX1BBR0VfRElSX09GRihhZGRyKSk7CisJCXJlYWRsKHBhZ2VfZGlyLnJlbWFwcGVkK0dFVF9QQUdFX0RJUl9PRkYoYWRkcikpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGlfZnJlZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlhdGlfcGFnZV9tYXAgcGFnZV9kaXI7CisKKwlwYWdlX2Rpci5yZWFsID0gKHVuc2lnbmVkIGxvbmcgKilhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWw7CisJcGFnZV9kaXIucmVtYXBwZWQgPSAodW5zaWduZWQgbG9uZyBfX2lvbWVtICopYWdwX2JyaWRnZS0+Z2F0dF90YWJsZTsKKworCWF0aV9mcmVlX2dhdHRfcGFnZXMoKTsKKwlhdGlfZnJlZV9wYWdlX21hcCgmcGFnZV9kaXIpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgYXRpX2dlbmVyaWNfYnJpZGdlID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9IGF0aV9nZW5lcmljX3NpemVzLAorCS5zaXplX3R5cGUJCT0gTFZMMl9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBhdGlfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGF0aV9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGF0aV9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gYXRpX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGF0aV9nZW5lcmljX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGF0aV9jcmVhdGVfZ2F0dF90YWJsZSwKKwkuZnJlZV9nYXR0X3RhYmxlCT0gYXRpX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhdGlfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhdGlfcmVtb3ZlX21lbW9yeSwKKwkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAorCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAorCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorfTsKKworCitzdGF0aWMgc3RydWN0IGFncF9kZXZpY2VfaWRzIGF0aV9hZ3BfZGV2aWNlX2lkc1tdIF9fZGV2aW5pdGRhdGEgPQoreworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQVRJX1JTMTAwLAorCQkuY2hpcHNldF9uYW1lCT0gIklHUDMyMC9NIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQVRJX1JTMjAwLAorCQkuY2hpcHNldF9uYW1lCT0gIklHUDMzMC8zNDAvMzQ1LzM1MC9NIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQVRJX1JTMjAwX0IsCisJCS5jaGlwc2V0X25hbWUJPSAiSUdQMzQ1TSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FUSV9SUzI1MCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJJR1A3MDAwL00iLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9BVElfUlMzMDBfMTAwLAorCQkuY2hpcHNldF9uYW1lCT0gIklHUDkxMDAvTSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FUSV9SUzMwMF8xMzMsCisJCS5jaGlwc2V0X25hbWUJPSAiSUdQOTEwMC9NIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQVRJX1JTMzAwXzE2NiwKKwkJLmNoaXBzZXRfbmFtZQk9ICJJR1A5MTAwL00iLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9BVElfUlMzMDBfMjAwLAorCQkuY2hpcHNldF9uYW1lCT0gIklHUDkxMDAvTSIsCisJfSwKKwl7IH0sIC8qIGR1bW15IGZpbmFsIGVudHJ5LCBhbHdheXMgcHJlc2VudCAqLworfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWdwX2F0aV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBhZ3BfZGV2aWNlX2lkcyAqZGV2cyA9IGF0aV9hZ3BfZGV2aWNlX2lkczsKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisJdTggY2FwX3B0cjsKKwlpbnQgajsKKworCWNhcF9wdHIgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfQUdQKTsKKwlpZiAoIWNhcF9wdHIpCisJCXJldHVybiAtRU5PREVWOworCisJLyogcHJvYmUgZm9yIGtub3duIGNoaXBzZXRzICovCisJZm9yIChqID0gMDsgZGV2c1tqXS5jaGlwc2V0X25hbWU7IGorKykgeworCQlpZiAocGRldi0+ZGV2aWNlID09IGRldnNbal0uZGV2aWNlX2lkKQorCQkJZ290byBmb3VuZDsKKwl9CisKKwlwcmludGsoS0VSTl9FUlIgUEZYCisJICAgICAiVW5zdXBwb3J0ZWQgQXRpIGNoaXBzZXQgKGRldmljZSBpZDogJTA0eClcbiIsIHBkZXYtPmRldmljZSk7CisJcmV0dXJuIC1FTk9ERVY7CisKK2ZvdW5kOgorCWJyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlicmlkZ2UtPmRldiA9IHBkZXY7CisJYnJpZGdlLT5jYXBuZHggPSBjYXBfcHRyOworCQorCWJyaWRnZS0+ZHJpdmVyID0gJmF0aV9nZW5lcmljX2JyaWRnZTsKKworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldGVjdGVkIEF0aSAlcyBjaGlwc2V0XG4iLAorCQkJZGV2c1tqXS5jaGlwc2V0X25hbWUpOworCisJLyogRmlsbCBpbiB0aGUgbW9kZSByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LAorCQkJYnJpZGdlLT5jYXBuZHgrUENJX0FHUF9TVEFUVVMsCisJCQkmYnJpZGdlLT5tb2RlKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX2F0aV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJYWdwX3JlbW92ZV9icmlkZ2UoYnJpZGdlKTsKKwlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWdwX2F0aV9wY2lfdGFibGVbXSA9IHsKKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfQVRJLAorCS5kZXZpY2UJCT0gUENJX0FOWV9JRCwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFncF9hdGlfcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFncF9hdGlfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYWdwZ2FydC1hdGkiLAorCS5pZF90YWJsZQk9IGFncF9hdGlfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBhZ3BfYXRpX3Byb2JlLAorCS5yZW1vdmUJCT0gYWdwX2F0aV9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZ3BfYXRpX2luaXQodm9pZCkKK3sKKwlpZiAoYWdwX29mZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFncF9hdGlfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3BfYXRpX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFncF9hdGlfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFncF9hdGlfaW5pdCk7Cittb2R1bGVfZXhpdChhZ3BfYXRpX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYmFja2VuZC5jIGIvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0NDJmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2JhY2tlbmQuYwpAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIEFHUEdBUlQgZHJpdmVyIGJhY2tlbmQgcm91dGluZXMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRGF2ZSBKb25lcy4KKyAqIENvcHlyaWdodCAoQykgMTk5OSBKZWZmIEhhcnRtYW5uLgorICogQ29weXJpZ2h0IChDKSAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgWGkgR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEpFRkYgSEFSVE1BTk4sIERBVkUgSk9ORVMsIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRQorICogT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogVE9ETzoKKyAqIC0gQWxsb2NhdGUgbW9yZSB0aGFuIG9yZGVyIDAgcGFnZXMgdG8gYXZvaWQgdG9vIG11Y2ggbGluZWFyIG1hcCBzcGxpdHRpbmcuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSA8bGludXgvYWdwZ2FydC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworLyogRHVlIHRvIFhGcmVlODYgYnJhaW4tZGFtYWdlLCB3ZSBjYW4ndCBnbyB0byAxLjAgdW50aWwgdGhleQorICogZml4IHNvbWUgcmVhbCBzdHVwaWRpdHkuIEl0J3Mgb25seSBieSBjaGFuY2Ugd2UgY2FuIGJ1bXAKKyAqIHBhc3QgMC45OSBhdCBhbGwgZHVlIHRvIHNvbWUgYm9vbGVhbiBsb2dpYyBlcnJvci4gKi8KKyNkZWZpbmUgQUdQR0FSVF9WRVJTSU9OX01BSk9SIDAKKyNkZWZpbmUgQUdQR0FSVF9WRVJTSU9OX01JTk9SIDEwMQorc3RhdGljIHN0cnVjdCBhZ3BfdmVyc2lvbiBhZ3BfY3VycmVudF92ZXJzaW9uID0KK3sKKwkubWFqb3IgPSBBR1BHQVJUX1ZFUlNJT05fTUFKT1IsCisJLm1pbm9yID0gQUdQR0FSVF9WRVJTSU9OX01JTk9SLAorfTsKKworc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqKCphZ3BfZmluZF9icmlkZ2UpKHN0cnVjdCBwY2lfZGV2ICopID0KKwkmYWdwX2dlbmVyaWNfZmluZF9icmlkZ2U7CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9icmlkZ2U7CitMSVNUX0hFQUQoYWdwX2JyaWRnZXMpOworRVhQT1JUX1NZTUJPTChhZ3BfYnJpZGdlKTsKK0VYUE9SVF9TWU1CT0woYWdwX2JyaWRnZXMpOworRVhQT1JUX1NZTUJPTChhZ3BfZmluZF9icmlkZ2UpOworCisvKioKKyAqCWFncF9iYWNrZW5kX2FjcXVpcmUgIC0gIGF0dGVtcHQgdG8gYWNxdWlyZSBhbiBhZ3AgYmFja2VuZC4KKyAqCisgKi8KK3N0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9iYWNrZW5kX2FjcXVpcmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCisJYnJpZGdlID0gYWdwX2ZpbmRfYnJpZGdlKHBkZXYpOworCisJaWYgKCFicmlkZ2UpCisJCXJldHVybiBOVUxMOworCisJaWYgKGF0b21pY19yZWFkKCZicmlkZ2UtPmFncF9pbl91c2UpKQorCQlyZXR1cm4gTlVMTDsKKwlhdG9taWNfaW5jKCZicmlkZ2UtPmFncF9pbl91c2UpOworCXJldHVybiBicmlkZ2U7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9iYWNrZW5kX2FjcXVpcmUpOworCisKKy8qKgorICoJYWdwX2JhY2tlbmRfcmVsZWFzZSAgLSAgcmVsZWFzZSB0aGUgbG9jayBvbiB0aGUgYWdwIGJhY2tlbmQuCisgKgorICoJVGhlIGNhbGxlciBtdXN0IGluc3VyZSB0aGF0IHRoZSBncmFwaGljcyBhcGVydHVyZSB0cmFuc2xhdGlvbiB0YWJsZQorICoJaXMgcmVhZCBmb3IgdXNlIGJ5IGFub3RoZXIgZW50aXR5LgorICoKKyAqCShFbnN1cmUgdGhhdCBhbGwgbWVtb3J5IGl0IGJvdW5kIGlzIHVuYm91bmQuKQorICovCit2b2lkIGFncF9iYWNrZW5kX3JlbGVhc2Uoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCisJaWYgKGJyaWRnZSkKKwkJYXRvbWljX2RlYygmYnJpZGdlLT5hZ3BfaW5fdXNlKTsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2JhY2tlbmRfcmVsZWFzZSk7CisKKworc3RydWN0IHsgaW50IG1lbSwgYWdwOyB9IG1heGVzX3RhYmxlW10gPSB7CisJezAsIDB9LAorCXszMiwgNH0sCisJezY0LCAyOH0sCisJezEyOCwgOTZ9LAorCXsyNTYsIDIwNH0sCisJezUxMiwgNDQwfSwKKwl7MTAyNCwgOTQyfSwKKwl7MjA0OCwgMTkyMH0sCisJezQwOTYsIDM5MzJ9Cit9OworCitzdGF0aWMgaW50IGFncF9maW5kX21heCh2b2lkKQoreworCWxvbmcgbWVtb3J5LCBpbmRleCwgcmVzdWx0OworCisjaWYgUEFHRV9TSElGVCA8IDIwCisJbWVtb3J5ID0gbnVtX3BoeXNwYWdlcyA+PiAoMjAgLSBQQUdFX1NISUZUKTsKKyNlbHNlCisJbWVtb3J5ID0gbnVtX3BoeXNwYWdlcyA8PCAoUEFHRV9TSElGVCAtIDIwKTsKKyNlbmRpZgorCWluZGV4ID0gMTsKKworCXdoaWxlICgobWVtb3J5ID4gbWF4ZXNfdGFibGVbaW5kZXhdLm1lbSkgJiYgKGluZGV4IDwgOCkpCisJCWluZGV4Kys7CisKKwlyZXN1bHQgPSBtYXhlc190YWJsZVtpbmRleCAtIDFdLmFncCArCisJICAgKCAobWVtb3J5IC0gbWF4ZXNfdGFibGVbaW5kZXggLSAxXS5tZW0pICAqCisJICAgICAobWF4ZXNfdGFibGVbaW5kZXhdLmFncCAtIG1heGVzX3RhYmxlW2luZGV4IC0gMV0uYWdwKSkgLworCSAgIChtYXhlc190YWJsZVtpbmRleF0ubWVtIC0gbWF4ZXNfdGFibGVbaW5kZXggLSAxXS5tZW0pOworCisJcmVzdWx0ID0gcmVzdWx0IDw8ICgyMCAtIFBBR0VfU0hJRlQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGludCBhZ3BfYmFja2VuZF9pbml0aWFsaXplKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlpbnQgc2l6ZV92YWx1ZSwgcmMsIGdvdF9nYXR0PTAsIGdvdF9rZXlsaXN0PTA7CisKKwlicmlkZ2UtPm1heF9tZW1vcnlfYWdwID0gYWdwX2ZpbmRfbWF4KCk7CisJYnJpZGdlLT52ZXJzaW9uID0gJmFncF9jdXJyZW50X3ZlcnNpb247CisKKwlpZiAoYnJpZGdlLT5kcml2ZXItPm5lZWRzX3NjcmF0Y2hfcGFnZSkgeworCQl2b2lkICphZGRyID0gYnJpZGdlLT5kcml2ZXItPmFncF9hbGxvY19wYWdlKGJyaWRnZSk7CisKKwkJaWYgKCFhZGRyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gZ2V0IG1lbW9yeSBmb3Igc2NyYXRjaCBwYWdlLlxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWJyaWRnZS0+c2NyYXRjaF9wYWdlX3JlYWwgPSB2aXJ0X3RvX3BoeXMoYWRkcik7CisJCWJyaWRnZS0+c2NyYXRjaF9wYWdlID0KKwkJICAgIGJyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShicmlkZ2UsIGJyaWRnZS0+c2NyYXRjaF9wYWdlX3JlYWwsIDApOworCX0KKworCXNpemVfdmFsdWUgPSBicmlkZ2UtPmRyaXZlci0+ZmV0Y2hfc2l6ZSgpOworCWlmIChzaXplX3ZhbHVlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGRldGVybWluZSBhcGVydHVyZSBzaXplLlxuIik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAoYnJpZGdlLT5kcml2ZXItPmNyZWF0ZV9nYXR0X3RhYmxlKGJyaWRnZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgInVuYWJsZSB0byBnZXQgbWVtb3J5IGZvciBncmFwaGljcyB0cmFuc2xhdGlvbiB0YWJsZS5cbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJZ290X2dhdHQgPSAxOworCisJYnJpZGdlLT5rZXlfbGlzdCA9IHZtYWxsb2MoUEFHRV9TSVpFICogNCk7CisJaWYgKGJyaWRnZS0+a2V5X2xpc3QgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJlcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3Iga2V5IGxpc3RzLlxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlnb3Rfa2V5bGlzdCA9IDE7CisKKwkvKiBGSVhNRSB2bWFsbG9jJ2QgbWVtb3J5IG5vdCBndWFyYW50ZWVkIGNvbnRpZ3VvdXMgKi8KKwltZW1zZXQoYnJpZGdlLT5rZXlfbGlzdCwgMCwgUEFHRV9TSVpFICogNCk7CisKKwlpZiAoYnJpZGdlLT5kcml2ZXItPmNvbmZpZ3VyZSgpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImVycm9yIGNvbmZpZ3VyaW5nIGhvc3QgY2hpcHNldC5cbiIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlpZiAoYnJpZGdlLT5kcml2ZXItPm5lZWRzX3NjcmF0Y2hfcGFnZSkKKwkJYnJpZGdlLT5kcml2ZXItPmFncF9kZXN0cm95X3BhZ2UoCisJCQkJcGh5c190b192aXJ0KGJyaWRnZS0+c2NyYXRjaF9wYWdlX3JlYWwpKTsKKwlpZiAoZ290X2dhdHQpCisJCWJyaWRnZS0+ZHJpdmVyLT5mcmVlX2dhdHRfdGFibGUoYnJpZGdlKTsKKwlpZiAoZ290X2tleWxpc3QpIHsKKwkJdmZyZWUoYnJpZGdlLT5rZXlfbGlzdCk7CisJCWJyaWRnZS0+a2V5X2xpc3QgPSBOVUxMOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qIGNhbm5vdCBiZSBfX2V4aXQgYi9jIGFzIGl0IGNvdWxkIGJlIGNhbGxlZCBmcm9tIF9faW5pdCBjb2RlICovCitzdGF0aWMgdm9pZCBhZ3BfYmFja2VuZF9jbGVhbnVwKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlpZiAoYnJpZGdlLT5kcml2ZXItPmNsZWFudXApCisJCWJyaWRnZS0+ZHJpdmVyLT5jbGVhbnVwKCk7CisJaWYgKGJyaWRnZS0+ZHJpdmVyLT5mcmVlX2dhdHRfdGFibGUpCisJCWJyaWRnZS0+ZHJpdmVyLT5mcmVlX2dhdHRfdGFibGUoYnJpZGdlKTsKKwlpZiAoYnJpZGdlLT5rZXlfbGlzdCkgeworCQl2ZnJlZShicmlkZ2UtPmtleV9saXN0KTsKKwkJYnJpZGdlLT5rZXlfbGlzdCA9IE5VTEw7CisJfQorCisJaWYgKGJyaWRnZS0+ZHJpdmVyLT5hZ3BfZGVzdHJveV9wYWdlICYmCisJICAgIGJyaWRnZS0+ZHJpdmVyLT5uZWVkc19zY3JhdGNoX3BhZ2UpCisJCWJyaWRnZS0+ZHJpdmVyLT5hZ3BfZGVzdHJveV9wYWdlKAorCQkJCXBoeXNfdG9fdmlydChicmlkZ2UtPnNjcmF0Y2hfcGFnZV9yZWFsKSk7Cit9CisKKy8qIFdoZW4gd2UgcmVtb3ZlIHRoZSBnbG9iYWwgdmFyaWFibGUgYWdwX2JyaWRnZSBmcm9tIGFsbCBkcml2ZXJzCisgKiB0aGVuIGFncF9hbGxvY19icmlkZ2UgYW5kIGFncF9nZW5lcmljX2ZpbmRfYnJpZGdlIG5lZWQgdG8gYmUgdXBkYXRlZAorICovCisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9hbGxvY19icmlkZ2Uodm9pZCkKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBrbWFsbG9jKHNpemVvZigqYnJpZGdlKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoYnJpZGdlLCAwLCBzaXplb2YoKmJyaWRnZSkpOworCWF0b21pY19zZXQoJmJyaWRnZS0+YWdwX2luX3VzZSwgMCk7CisJYXRvbWljX3NldCgmYnJpZGdlLT5jdXJyZW50X21lbW9yeV9hZ3AsIDApOworCisJaWYgKGxpc3RfZW1wdHkoJmFncF9icmlkZ2VzKSkKKwkJYWdwX2JyaWRnZSA9IGJyaWRnZTsKKworCXJldHVybiBicmlkZ2U7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9hbGxvY19icmlkZ2UpOworCisKK3ZvaWQgYWdwX3B1dF9icmlkZ2Uoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworICAgICAgICBrZnJlZShicmlkZ2UpOworCisgICAgICAgIGlmIChsaXN0X2VtcHR5KCZhZ3BfYnJpZGdlcykpCisgICAgICAgICAgICAgICAgYWdwX2JyaWRnZSA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9wdXRfYnJpZGdlKTsKKworCitpbnQgYWdwX2FkZF9icmlkZ2Uoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCWludCBlcnJvcjsKKworCWlmIChhZ3Bfb2ZmKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghYnJpZGdlLT5kZXYpIHsKKwkJcHJpbnRrIChLRVJOX0RFQlVHIFBGWCAiRXJrLCByZWdpc3RlcmluZyB3aXRoIG5vIHBjaV9kZXYhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogR3JhYiByZWZlcmVuY2Ugb24gdGhlIGNoaXBzZXQgZHJpdmVyLiAqLworCWlmICghdHJ5X21vZHVsZV9nZXQoYnJpZGdlLT5kcml2ZXItPm93bmVyKSkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkNvdWxkbid0IGxvY2sgY2hpcHNldCBkcml2ZXIuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXJyb3IgPSBhZ3BfYmFja2VuZF9pbml0aWFsaXplKGJyaWRnZSk7CisJaWYgKGVycm9yKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiYWdwX2JhY2tlbmRfaW5pdGlhbGl6ZSgpIGZhaWxlZC5cbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKGxpc3RfZW1wdHkoJmFncF9icmlkZ2VzKSkgeworCQllcnJvciA9IGFncF9mcm9udGVuZF9pbml0aWFsaXplKCk7CisJCWlmIChlcnJvcikgeworCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJhZ3BfZnJvbnRlbmRfaW5pdGlhbGl6ZSgpIGZhaWxlZC5cbiIpOworCQkJZ290byBmcm9udGVuZF9lcnI7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQUdQIGFwZXJ0dXJlIGlzICVkTSBAIDB4JWx4XG4iLAorCQkJYnJpZGdlLT5kcml2ZXItPmZldGNoX3NpemUoKSwgYnJpZGdlLT5nYXJ0X2J1c19hZGRyKTsKKworCX0KKworCWxpc3RfYWRkKCZicmlkZ2UtPmxpc3QsICZhZ3BfYnJpZGdlcyk7CisJcmV0dXJuIDA7CisKK2Zyb250ZW5kX2VycjoKKwlhZ3BfYmFja2VuZF9jbGVhbnVwKGJyaWRnZSk7CitlcnJfb3V0OgorCW1vZHVsZV9wdXQoYnJpZGdlLT5kcml2ZXItPm93bmVyKTsKKwlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFncF9hZGRfYnJpZGdlKTsKKworCit2b2lkIGFncF9yZW1vdmVfYnJpZGdlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlhZ3BfYmFja2VuZF9jbGVhbnVwKGJyaWRnZSk7CisJbGlzdF9kZWwoJmJyaWRnZS0+bGlzdCk7CisJaWYgKGxpc3RfZW1wdHkoJmFncF9icmlkZ2VzKSkKKwkJYWdwX2Zyb250ZW5kX2NsZWFudXAoKTsKKwltb2R1bGVfcHV0KGJyaWRnZS0+ZHJpdmVyLT5vd25lcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhZ3BfcmVtb3ZlX2JyaWRnZSk7CisKK2ludCBhZ3Bfb2ZmOworaW50IGFncF90cnlfdW5zdXBwb3J0ZWRfYm9vdDsKK0VYUE9SVF9TWU1CT0woYWdwX29mZik7CitFWFBPUlRfU1lNQk9MKGFncF90cnlfdW5zdXBwb3J0ZWRfYm9vdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGFncF9pbml0KHZvaWQpCit7CisJaWYgKCFhZ3Bfb2ZmKQorCQlwcmludGsoS0VSTl9JTkZPICJMaW51eCBhZ3BnYXJ0IGludGVyZmFjZSB2JWQuJWQgKGMpIERhdmUgSm9uZXNcbiIsCisJCQlBR1BHQVJUX1ZFUlNJT05fTUFKT1IsIEFHUEdBUlRfVkVSU0lPTl9NSU5PUik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19leGl0IGFncF9leGl0KHZvaWQpCit7Cit9CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgX19pbml0IGludCBhZ3Bfc2V0dXAoY2hhciAqcykKK3sKKwlpZiAoIXN0cmNtcChzLCJvZmYiKSkKKwkJYWdwX29mZiA9IDE7CisJaWYgKCFzdHJjbXAocywidHJ5X3Vuc3VwcG9ydGVkIikpCisJCWFncF90cnlfdW5zdXBwb3J0ZWRfYm9vdCA9IDE7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJhZ3A9IiwgYWdwX3NldHVwKTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUdQIEdBUlQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoQUdQR0FSVF9NSU5PUik7CisKK21vZHVsZV9pbml0KGFncF9pbml0KTsKK21vZHVsZV9leGl0KGFncF9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9lZmZpY2Vvbi1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZWZmaWNlb24tYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjMGEwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZWZmaWNlb24tYWdwLmMKQEAgLTAsMCArMSw0NjMgQEAKKy8qCisgKiBUcmFuc21ldGEncyBFZmZpY2VvbiBBR1BHQVJUIGRyaXZlci4KKyAqIAorICogQmFzZWQgdXBvbiBhIGRpZmYgYnkgTGludXMgYXJvdW5kIE5vdmVtYmVyICcwMi4KKyAqCisgKiBQb3J0ZWQgdG8gdGhlIDIuNiBrZXJuZWwgYnkgQ2FybG9zIFB1Y2hvbCA8Y3BnbGludXhAcHVjaG9sLmNvbT4KKyAqIGFuZCBILiBQZXRlciBBbnZpbiA8aHBhQHRyYW5zbWV0YS5jb20+LgorICovCisKKy8qCisgKiBOT1RFLWNwZy0wNDAyMTc6CisgKiAKKyAqICAgLSB3aGVuIGNvbXBpbGVkIGFzIGEgbW9kdWxlLCBhZnRlciBsb2FkaW5nIHRoZSBtb2R1bGUsCisgKiAgICAgaXQgd2lsbCByZWZ1c2UgdG8gdW5sb2FkLCBpbmRpY2F0aW5nIGl0IGlzIGluIHVzZSwKKyAqICAgICB3aGVuIGl0IGlzIG5vdC4KKyAqICAgLSBubyBzMyAoc3VzcGVuZCB0byByYW0pIHRlc3RpbmcuCisgKiAgIC0gdGVzdGVkIG9uIHRoZSBlZmZpY2VvbiBpbnRlZ3JhdGVkIG5vdGhicmlkZ2UgZm9yIHRlbnMKKyAqICAgICBvZiBpdGVyYXRpb25zIG9mIHN0YXJ0aW5nIHggYW5kIGdseGdlYXJzLgorICogICAtIHRlc3RlZCB3aXRoIHJhZGVvbiA5MDAwIGFuZCByYWRlb24gbW9iaWxpdHkgbTkgY2FyZHMKKyAqICAgLSB0ZXN0ZWQgd2l0aCBjMy9jNCBlbmFibGVkICh3aXRoIHRoZSBtb2JpbGl0eSBtOSBjYXJkKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworLyoKKyAqIFRoZSByZWFsIGRpZmZlcmVuY2VzIHRvIHRoZSBnZW5lcmljIEFHUCBjb2RlIGlzCisgKiBpbiB0aGUgR0FSVCBtYXBwaW5ncyAtIGEgdHdvLWxldmVsIHNldHVwIHdpdGggdGhlCisgKiBmaXJzdCBsZXZlbCBiZWluZyBhbiBvbi1jaGlwIDY0LWVudHJ5IHRhYmxlLgorICoKKyAqIFRoZSBwYWdlIGFycmF5IGlzIGZpbGxlZCB0aHJvdWdoIHRoZSBBVFRQQUdFIHJlZ2lzdGVyCisgKiAoQXBlcnR1cmUgVHJhbnNsYXRpb24gVGFibGUgUGFnZSBSZWdpc3RlcikgYXQgMHhCOC4gQml0czoKKyAqICAzMToyMDogcGh5c2ljYWwgcGFnZSBhZGRyZXNzCisgKiAgIDExOjk6IFBhZ2UgQXR0cmlidXRlIFRhYmxlIEluZGV4IChQQVRJKQorICoJICAgbXVzdCBtYXRjaCB0aGUgUEFUIGluZGV4IGZvciB0aGUKKyAqCSAgIG1hcHBlZCBwYWdlcyAodGhlIDJuZCBsZXZlbCBwYWdlIHRhYmxlIHBhZ2VzCisgKgkgICB0aGVtc2VsdmVzIHNob3VsZCBiZSBqdXN0IHJlZ3VsYXIgV0ItY2FjaGVhYmxlLAorICoJICAgc28gdGhpcyBpcyBub3JtYWxseSB6ZXJvLikKKyAqICAgICAgODogUHJlc2VudAorICogICAgNzo2OiByZXNlcnZlZCwgd3JpdGUgYXMgemVybworICogICAgNTowOiBHQVRUIGRpcmVjdG9yeSBpbmRleDogd2hpY2ggMXN0LWxldmVsIGVudHJ5CisgKiAKKyAqIFRoZSBFZmZpY2VvbiBBR1Agc3BlYyByZXF1aXJlcyBwYWdlcyB0byBiZSBXQi1jYWNoZWFibGUKKyAqIGJ1dCB0byBiZSBleHBsaWNpdGx5IENMRkxVU0gnZCBhZnRlciBhbnkgY2hhbmdlcy4KKyAqLworI2RlZmluZSBFRkZJQ0VPTl9BVFRQQUdFCTB4YjgKKyNkZWZpbmUgRUZGSUNFT05fTDFfU0laRQk2NAkvKiBOdW1iZXIgb2YgUERFIHBhZ2VzICovCisKKyNkZWZpbmUgRUZGSUNFT05fUEFUSQkJKDAgPDwgOSkKKyNkZWZpbmUgRUZGSUNFT05fUFJFU0VOVAkoMSA8PCA4KQorCitzdGF0aWMgc3RydWN0IF9lZmZpY2Vvbl9wcml2YXRlIHsKKwl1bnNpZ25lZCBsb25nIGwxX3RhYmxlW0VGRklDRU9OX0wxX1NJWkVdOworfSBlZmZpY2Vvbl9wcml2YXRlOworCitzdGF0aWMgc3RydWN0IGdhdHRfbWFzayBlZmZpY2Vvbl9nZW5lcmljX21hc2tzW10gPQoreworCXsubWFzayA9IDB4MDAwMDAwMDEsIC50eXBlID0gMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiBlZmZpY2Vvbl9nZW5lcmljX3NpemVzWzRdID0KK3sKKwl7MjU2LCA2NTUzNiwgMH0sCisJezEyOCwgMzI3NjgsIDMyfSwKKwl7NjQsIDE2Mzg0LCA0OH0sCisJezMyLCA4MTkyLCA1Nn0KK307CisKKy8qCisgKiBDb250cm9sIGludGVyZmFjZXMgYXJlIGxhcmdlbHkgaWRlbnRpY2FsIHRvCisgKiB0aGUgbGVnYWN5IEludGVsIDQ0MEJYLi4KKyAqLworCitzdGF0aWMgaW50IGVmZmljZW9uX2ZldGNoX3NpemUodm9pZCkKK3sKKwlpbnQgaTsKKwl1MTYgdGVtcDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiAqdmFsdWVzOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsICZ0ZW1wKTsKKwl2YWx1ZXMgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5kcml2ZXItPmFwZXJ0dXJlX3NpemVzKTsKKworCWZvciAoaSA9IDA7IGkgPCBhZ3BfYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplczsgaSsrKSB7CisJCWlmICh0ZW1wID09IHZhbHVlc1tpXS5zaXplX3ZhbHVlKSB7CisJCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0KKwkJCSAgICBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzICsgaSk7CisJCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IGk7CisJCQlyZXR1cm4gdmFsdWVzW2ldLnNpemU7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWZmaWNlb25fdGxiZmx1c2goc3RydWN0IGFncF9tZW1vcnkgKiBtZW0pCit7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJlZmZpY2Vvbl90bGJmbHVzaCgpXG4iKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQUdQQ1RSTCwgMHgyMjAwKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQUdQQ1RSTCwgMHgyMjgwKTsKK30KKworc3RhdGljIHZvaWQgZWZmaWNlb25fY2xlYW51cCh2b2lkKQoreworCXUxNiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyICpwcmV2aW91c19zaXplOworCisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJlZmZpY2Vvbl9jbGVhbnVwKClcbiIpOworCXByZXZpb3VzX3NpemUgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX05CWENGRywgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX05CWENGRywgdGVtcCAmIH4oMSA8PCA5KSk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVBTSVpFLAorCQkJICAgICAgcHJldmlvdXNfc2l6ZS0+c2l6ZV92YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgZWZmaWNlb25fY29uZmlndXJlKHZvaWQpCit7CisJdTMyIHRlbXA7CisJdTE2IHRlbXAyOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19sdmwyICpjdXJyZW50X3NpemU7CisKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggImVmZmljZW9uX2NvbmZpZ3VyZSgpXG4iKTsKKwkKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJLyogYXBlcnR1cmUgc2l6ZSAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FQU0laRSwKKwkJCSAgICAgIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKiBhZGRyZXNzIHRvIG1hcCB0byAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFHUF9BUEJBU0UsICZ0ZW1wKTsKKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKTsKKworCS8qIGFncGN0cmwgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQUdQQ1RSTCwgMHgyMjgwKTsKKworCS8qIHBhY2NmZy9uYnhjZmcgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX05CWENGRywgJnRlbXAyKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9OQlhDRkcsCisJCQkgICAgICAodGVtcDIgJiB+KDEgPDwgMTApKSB8ICgxIDw8IDkpIHwgKDEgPDwgMTEpKTsKKwkvKiBjbGVhciBhbnkgcG9zc2libGUgZXJyb3IgY29uZGl0aW9ucyAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0VSUlNUUyArIDEsIDcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVmZmljZW9uX2ZyZWVfZ2F0dF90YWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJaW50IGluZGV4LCBmcmVlZCA9IDA7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBFRkZJQ0VPTl9MMV9TSVpFOyBpbmRleCsrKSB7CisJCXVuc2lnbmVkIGxvbmcgcGFnZSA9IGVmZmljZW9uX3ByaXZhdGUubDFfdGFibGVbaW5kZXhdOworCQlpZiAocGFnZSkgeworCQkJZWZmaWNlb25fcHJpdmF0ZS5sMV90YWJsZVtpbmRleF0gPSAwOworCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKChjaGFyICopcGFnZSkpOworCQkJZnJlZV9wYWdlKHBhZ2UpOworCQkJZnJlZWQrKzsKKwkJfQorCQlwcmludGsoS0VSTl9ERUJVRyBQRlggImVmZmljZW9uX2ZyZWVfZ2F0dF90YWJsZSglcCwgJTAyeCwgJTA4eClcbiIsCisJCQlhZ3BfYnJpZGdlLT5kZXYsIEVGRklDRU9OX0FUVFBBR0UsIGluZGV4KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsCisJCQlFRkZJQ0VPTl9BVFRQQUdFLCBpbmRleCk7CisJfQorCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiZWZmaWNlb25fZnJlZV9nYXR0X3RhYmxlKCkgZnJlZWQgJWQgcGFnZXNcbiIsIGZyZWVkKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogU2luY2Ugd2UgZG9uJ3QgbmVlZCBjb250aWdpb3VzIG1lbW9yeSB3ZSBqdXN0IHRyeQorICogdG8gZ2V0IHRoZSBnYXR0IHRhYmxlIG9uY2UKKyAqLworCisjZGVmaW5lIEdFVF9QQUdFX0RJUl9PRkYoYWRkcikgKGFkZHIgPj4gMjIpCisjZGVmaW5lIEdFVF9QQUdFX0RJUl9JRFgoYWRkcikgKEdFVF9QQUdFX0RJUl9PRkYoYWRkcikgLSBcCisJR0VUX1BBR0VfRElSX09GRihhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyKSkKKyNkZWZpbmUgR0VUX0dBVFRfT0ZGKGFkZHIpICgoYWRkciAmIDB4MDAzZmYwMDApID4+IDEyKQorI3VuZGVmICBHRVRfR0FUVAorI2RlZmluZSBHRVRfR0FUVChhZGRyKSAoZWZmaWNlb25fcHJpdmF0ZS5nYXR0X3BhZ2VzW1wKKwlHRVRfUEFHRV9ESVJfSURYKGFkZHIpXS0+cmVtYXBwZWQpCisKK3N0YXRpYyBpbnQgZWZmaWNlb25fY3JlYXRlX2dhdHRfdGFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCWludCBpbmRleDsKKwljb25zdCBpbnQgcGF0aSAgICA9IEVGRklDRU9OX1BBVEk7CisJY29uc3QgaW50IHByZXNlbnQgPSBFRkZJQ0VPTl9QUkVTRU5UOworCWNvbnN0IGludCBjbGZsdXNoX2NodW5rID0gKChjcHVpZF9lYngoMSkgPj4gOCkgJiAweGZmKSA8PCAzOworCWludCBudW1fZW50cmllcywgbDFfcGFnZXM7CisJCisJbnVtX2VudHJpZXMgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpLT5udW1fZW50cmllczsKKworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiZWZmaWNlb25fY3JlYXRlX2dhdHRfdGFibGUoJWQpXG4iLCBudW1fZW50cmllcyk7CisKKwkvKiBUaGVyZSBhcmUgMl4xMCBQVEUgcGFnZXMgcGVyIFBERSBwYWdlICovCisJQlVHX09OKG51bV9lbnRyaWVzICYgMHgzZmYpOworCWwxX3BhZ2VzID0gbnVtX2VudHJpZXMgPj4gMTA7CisKKwlmb3IgKGluZGV4ID0gMCA7IGluZGV4IDwgbDFfcGFnZXMgOyBpbmRleCsrKSB7CisJCWludCBvZmZzZXQ7CisJCXVuc2lnbmVkIGxvbmcgcGFnZTsKKwkJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCQlwYWdlID0gZWZmaWNlb25fcHJpdmF0ZS5sMV90YWJsZVtpbmRleF07CisJCUJVR19PTihwYWdlKTsKKworCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIXBhZ2UpIHsKKwkJCWVmZmljZW9uX2ZyZWVfZ2F0dF90YWJsZShhZ3BfYnJpZGdlKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoKGNoYXIgKilwYWdlKSk7CisKKwkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBQQUdFX1NJWkU7IG9mZnNldCArPSBjbGZsdXNoX2NodW5rKQorCQkJYXNtIHZvbGF0aWxlKCJjbGZsdXNoICUwIiA6IDogIm0iICgqKGNoYXIgKikocGFnZStvZmZzZXQpKSk7CisKKwkJZWZmaWNlb25fcHJpdmF0ZS5sMV90YWJsZVtpbmRleF0gPSBwYWdlOworCisJCXZhbHVlID0gX19wYShwYWdlKSB8IHBhdGkgfCBwcmVzZW50IHwgaW5kZXg7CisKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsCisJCQlFRkZJQ0VPTl9BVFRQQUdFLCB2YWx1ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWZmaWNlb25faW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqIG1lbSwgb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWludCBpLCBjb3VudCA9IG1lbS0+cGFnZV9jb3VudCwgbnVtX2VudHJpZXM7CisJdW5zaWduZWQgaW50ICpwYWdlLCAqbGFzdF9wYWdlOworCWNvbnN0IGludCBjbGZsdXNoX2NodW5rID0gKChjcHVpZF9lYngoMSkgPj4gOCkgJiAweGZmKSA8PCAzOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgY2xmbHVzaF9tYXNrID0gfihjbGZsdXNoX2NodW5rLTEpOworCisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJlZmZpY2Vvbl9pbnNlcnRfbWVtb3J5KCVseCwgJWQpXG4iLCBwZ19zdGFydCwgY291bnQpOworCisJbnVtX2VudHJpZXMgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpLT5udW1fZW50cmllczsKKwlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtZW0tPmlzX2ZsdXNoZWQgPT0gRkFMU0UpIHsKKwkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJCW1lbS0+aXNfZmx1c2hlZCA9IFRSVUU7CisJfQorCisJbGFzdF9wYWdlID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpbnQgaW5kZXggPSBwZ19zdGFydCArIGk7CisJCXVuc2lnbmVkIGxvbmcgaW5zZXJ0ID0gbWVtLT5tZW1vcnlbaV07CisKKwkJcGFnZSA9ICh1bnNpZ25lZCBpbnQgKikgZWZmaWNlb25fcHJpdmF0ZS5sMV90YWJsZVtpbmRleCA+PiAxMF07CisKKwkJaWYgKCFwYWdlKQorCQkJY29udGludWU7CisJCQorCQlwYWdlICs9IChpbmRleCAmIDB4M2ZmKTsKKwkJKnBhZ2UgPSBpbnNlcnQ7CisKKwkJLyogY2xmbHVzaCBpcyBzbG93LCBzbyBkb24ndCBjbGZsdXNoIHVudGlsIHdlIGhhdmUgdG8gKi8KKwkJaWYgKCBsYXN0X3BhZ2UgJiYgCisJCSAgICAgKCh1bnNpZ25lZCBsb25nKXBhZ2VeKHVuc2lnbmVkIGxvbmcpbGFzdF9wYWdlKSAmIGNsZmx1c2hfbWFzayApCisJCSAgICBhc20gdm9sYXRpbGUoImNsZmx1c2ggJTAiIDogOiAibSIgKCpsYXN0X3BhZ2UpKTsKKworCQlsYXN0X3BhZ2UgPSBwYWdlOworCX0KKworCWlmICggbGFzdF9wYWdlICkKKwkJYXNtIHZvbGF0aWxlKCJjbGZsdXNoICUwIiA6IDogIm0iICgqbGFzdF9wYWdlKSk7CisKKwlhZ3BfYnJpZGdlLT5kcml2ZXItPnRsYl9mbHVzaChtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVmZmljZW9uX3JlbW92ZV9tZW1vcnkoc3RydWN0IGFncF9tZW1vcnkgKiBtZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKK3sKKwlpbnQgaSwgY291bnQgPSBtZW0tPnBhZ2VfY291bnQsIG51bV9lbnRyaWVzOworCisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJlZmZpY2Vvbl9yZW1vdmVfbWVtb3J5KCVseCwgJWQpXG4iLCBwZ19zdGFydCwgY291bnQpOworCisJbnVtX2VudHJpZXMgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpLT5udW1fZW50cmllczsKKworCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4gbnVtX2VudHJpZXMpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaW50IGluZGV4ID0gcGdfc3RhcnQgKyBpOworCQl1bnNpZ25lZCBpbnQgKnBhZ2UgPSAodW5zaWduZWQgaW50ICopIGVmZmljZW9uX3ByaXZhdGUubDFfdGFibGVbaW5kZXggPj4gMTBdOworCisJCWlmICghcGFnZSkKKwkJCWNvbnRpbnVlOworCQlwYWdlICs9IChpbmRleCAmIDB4M2ZmKTsKKwkJKnBhZ2UgPSAwOworCX0KKwlhZ3BfYnJpZGdlLT5kcml2ZXItPnRsYl9mbHVzaChtZW0pOworCXJldHVybiAwOworfQorCisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBlZmZpY2Vvbl9kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gZWZmaWNlb25fZ2VuZXJpY19zaXplcywKKwkuc2l6ZV90eXBlCQk9IExWTDJfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSA0LAorCS5jb25maWd1cmUJCT0gZWZmaWNlb25fY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGVmZmljZW9uX2ZldGNoX3NpemUsCisJLmNsZWFudXAJCT0gZWZmaWNlb25fY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGVmZmljZW9uX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGVmZmljZW9uX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisKKwkvLyBFZmZpY2Vvbi1zcGVjaWZpYyBHQVRUIHRhYmxlIHNldHVwIC8gcG9wdWxhdGUgLyB0ZWFyZG93bgorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGVmZmljZW9uX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBlZmZpY2Vvbl9mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gZWZmaWNlb25faW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBlZmZpY2Vvbl9yZW1vdmVfbWVtb3J5LAorCS5jYW50X3VzZV9hcGVydHVyZQk9IDAsCS8vIDEgbWlnaHQgYmUgZmFzdGVyPworCisJLy8gR2VuZXJpYworCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCit9OworCisKK3N0YXRpYyBpbnQgYWdwX2VmZmljZW9uX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggImFncF9lZmZpY2Vvbl9yZXN1bWUoKVxuIik7CisJcmV0dXJuIGVmZmljZW9uX2NvbmZpZ3VyZSgpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZ3BfZWZmaWNlb25fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZTsKKwl1OCBjYXBfcHRyOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKworCWNhcF9wdHIgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfQUdQKTsKKwlpZiAoIWNhcF9wdHIpCisJCXJldHVybiAtRU5PREVWOworCisJLyogUHJvYmUgZm9yIEVmZmljZW9uIGNvbnRyb2xsZXIgKi8KKwlpZiAocGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfRUZGSUNFT04pIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5zdXBwb3J0ZWQgRWZmaWNlb24gY2hpcHNldCAoZGV2aWNlIGlkOiAlMDR4KVxuIiwKKwkJICAgIHBkZXYtPmRldmljZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBUcmFuc21ldGEgRWZmaWNlb24gVE04MDAwIHNlcmllcyBjaGlwc2V0XG4iKTsKKworCWJyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlicmlkZ2UtPmRyaXZlciA9ICZlZmZpY2Vvbl9kcml2ZXI7CisJYnJpZGdlLT5kZXYgPSBwZGV2OworCWJyaWRnZS0+Y2FwbmR4ID0gY2FwX3B0cjsKKworCS8qCisJKiBUaGUgZm9sbG93aW5nIGZpeGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBCSU9TIGhhcyAiZm9yZ290dGVuIiB0bworCSogcHJvdmlkZSBhbiBhZGRyZXNzIHJhbmdlIGZvciB0aGUgR0FSVC4KKwkqIDIwMDMwNjEwIC0gaGFtaXNoQHpvdC5vcmcKKwkqLworCXIgPSAmcGRldi0+cmVzb3VyY2VbMF07CisJaWYgKCFyLT5zdGFydCAmJiByLT5lbmQpIHsKKwkJaWYocGNpX2Fzc2lnbl9yZXNvdXJjZShwZGV2LCAwKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY291bGQgbm90IGFzc2lnbiByZXNvdXJjZSAwXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyoKKwkqIElmIHRoZSBkZXZpY2UgaGFzIG5vdCBiZWVuIHByb3Blcmx5IHNldHVwLCB0aGUgZm9sbG93aW5nIHdpbGwgY2F0Y2gKKwkqIHRoZSBwcm9ibGVtIGFuZCBzaG91bGQgc3RvcCB0aGUgc3lzdGVtIGZyb20gY3Jhc2hpbmcuCisJKiAyMDAzMDYxMCAtIGhhbWlzaEB6b3Qub3JnCisJKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIEVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogRmlsbCBpbiB0aGUgbW9kZSByZWdpc3RlciAqLworCWlmIChjYXBfcHRyKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LAorCQkJCWJyaWRnZS0+Y2FwbmR4K1BDSV9BR1BfU1RBVFVTLAorCQkJCSZicmlkZ2UtPm1vZGUpOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX2VmZmljZW9uX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlhZ3BfcmVtb3ZlX2JyaWRnZShicmlkZ2UpOworCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7Cit9CisKK3N0YXRpYyBpbnQgYWdwX2VmZmljZW9uX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhZ3BfZWZmaWNlb25fcGNpX3RhYmxlW10gPSB7CisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1RSQU5TTUVUQSwKKwkuZGV2aWNlCQk9IFBDSV9BTllfSUQsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZ3BfZWZmaWNlb25fcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFncF9lZmZpY2Vvbl9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJhZ3BnYXJ0LWVmZmljZW9uIiwKKwkuaWRfdGFibGUJPSBhZ3BfZWZmaWNlb25fcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBhZ3BfZWZmaWNlb25fcHJvYmUsCisJLnJlbW92ZQkJPSBhZ3BfZWZmaWNlb25fcmVtb3ZlLAorCS5zdXNwZW5kCT0gYWdwX2VmZmljZW9uX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhZ3BfZWZmaWNlb25fcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWdwX2VmZmljZW9uX2luaXQodm9pZCkKK3sKKwlzdGF0aWMgaW50IGFncF9pbml0aWFsaXNlZD0wOworCisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFncF9pbml0aWFsaXNlZCA9PSAxKQorCQlyZXR1cm4gMDsKKwlhZ3BfaW5pdGlhbGlzZWQ9MTsKKworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3BfZWZmaWNlb25fcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3BfZWZmaWNlb25fY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWdwX2VmZmljZW9uX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZ3BfZWZmaWNlb25faW5pdCk7Cittb2R1bGVfZXhpdChhZ3BfZWZmaWNlb25fY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIkNhcmxvcyBQdWNob2wgPGNwZ2xpbnV4QHB1Y2hvbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jIGIvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MzM2MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMKQEAgLTAsMCArMSwxMTAzIEBACisvKgorICogQUdQR0FSVCBkcml2ZXIgZnJvbnRlbmQKKyAqIENvcHlyaWdodCAoQykgMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEYXZlIEpvbmVzCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgSmVmZiBIYXJ0bWFubgorICogQ29weXJpZ2h0IChDKSAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgWGkgR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEpFRkYgSEFSVE1BTk4sIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRQorICogT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSA8bGludXgvYWdwZ2FydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworc3RhdGljIHN0cnVjdCBhZ3BfZnJvbnRfZGF0YSBhZ3BfZmU7CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2ZpbmRfbWVtX2J5X2tleShpbnQga2V5KQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICpjdXJyOworCisJaWYgKGFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwljdXJyID0gYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlci0+cG9vbDsKKworCXdoaWxlIChjdXJyICE9IE5VTEwpIHsKKwkJaWYgKGN1cnItPmtleSA9PSBrZXkpCisJCQlicmVhazsKKwkJY3VyciA9IGN1cnItPm5leHQ7CisJfQorCisJREJHKCJrZXk9JWQgLT4gbWVtPSVwIiwga2V5LCBjdXJyKTsKKwlyZXR1cm4gY3VycjsKK30KKworc3RhdGljIHZvaWQgYWdwX3JlbW92ZV9mcm9tX3Bvb2woc3RydWN0IGFncF9tZW1vcnkgKnRlbXApCit7CisJc3RydWN0IGFncF9tZW1vcnkgKnByZXY7CisJc3RydWN0IGFncF9tZW1vcnkgKm5leHQ7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBldmVuIGluIHRoZSBtZW1vcnkgcG9vbCAqLworCisJREJHKCJtZW09JXAiLCB0ZW1wKTsKKwlpZiAoYWdwX2ZpbmRfbWVtX2J5X2tleSh0ZW1wLT5rZXkpICE9IE5VTEwpIHsKKwkJbmV4dCA9IHRlbXAtPm5leHQ7CisJCXByZXYgPSB0ZW1wLT5wcmV2OworCisJCWlmIChwcmV2ICE9IE5VTEwpIHsKKwkJCXByZXYtPm5leHQgPSBuZXh0OworCQkJaWYgKG5leHQgIT0gTlVMTCkKKwkJCQluZXh0LT5wcmV2ID0gcHJldjsKKworCQl9IGVsc2UgeworCQkJLyogVGhpcyBpcyB0aGUgZmlyc3QgaXRlbSBvbiB0aGUgbGlzdCAqLworCQkJaWYgKG5leHQgIT0gTlVMTCkKKwkJCQluZXh0LT5wcmV2ID0gTlVMTDsKKworCQkJYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlci0+cG9vbCA9IG5leHQ7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSb3V0aW5lcyBmb3IgbWFuYWdpbmcgZWFjaCBjbGllbnQncyBzZWdtZW50IGxpc3QgLQorICogVGhlc2Ugcm91dGluZXMgaGFuZGxlIGFkZGluZyBhbmQgcmVtb3Zpbmcgc2VnbWVudHMKKyAqIHRvIGVhY2ggYXV0aCdlZCBjbGllbnQuCisgKi8KKworc3RhdGljIHN0cnVjdAorYWdwX3NlZ21lbnRfcHJpdiAqYWdwX2ZpbmRfc2VnX2luX2NsaWVudChjb25zdCBzdHJ1Y3QgYWdwX2NsaWVudCAqY2xpZW50LAorCQkJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJCSAgICBpbnQgc2l6ZSwgcGdwcm90X3QgcGFnZV9wcm90KQoreworCXN0cnVjdCBhZ3Bfc2VnbWVudF9wcml2ICpzZWc7CisJaW50IG51bV9zZWdtZW50cywgaTsKKwlvZmZfdCBwZ19zdGFydDsKKwlzaXplX3QgcGdfY291bnQ7CisKKwlwZ19zdGFydCA9IG9mZnNldCAvIDQwOTY7CisJcGdfY291bnQgPSBzaXplIC8gNDA5NjsKKwlzZWcgPSAqKGNsaWVudC0+c2VnbWVudHMpOworCW51bV9zZWdtZW50cyA9IGNsaWVudC0+bnVtX3NlZ21lbnRzOworCisJZm9yIChpID0gMDsgaSA8IGNsaWVudC0+bnVtX3NlZ21lbnRzOyBpKyspIHsKKwkJaWYgKChzZWdbaV0ucGdfc3RhcnQgPT0gcGdfc3RhcnQpICYmCisJCSAgICAoc2VnW2ldLnBnX2NvdW50ID09IHBnX2NvdW50KSAmJgorCQkgICAgKHBncHJvdF92YWwoc2VnW2ldLnByb3QpID09IHBncHJvdF92YWwocGFnZV9wcm90KSkpIHsKKwkJCXJldHVybiBzZWcgKyBpOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGFncF9yZW1vdmVfc2VnX2Zyb21fY2xpZW50KHN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQpCit7CisJREJHKCJjbGllbnQ9JXAiLCBjbGllbnQpOworCisJaWYgKGNsaWVudC0+c2VnbWVudHMgIT0gTlVMTCkgeworCQlpZiAoKihjbGllbnQtPnNlZ21lbnRzKSAhPSBOVUxMKSB7CisJCQlEQkcoIkZyZWVpbmcgJXAgZnJvbSBjbGllbnQgJXAiLCAqKGNsaWVudC0+c2VnbWVudHMpLCBjbGllbnQpOworCQkJa2ZyZWUoKihjbGllbnQtPnNlZ21lbnRzKSk7CisJCX0KKwkJREJHKCJGcmVlaW5nICVwIGZyb20gY2xpZW50ICVwIiwgY2xpZW50LT5zZWdtZW50cywgY2xpZW50KTsKKwkJa2ZyZWUoY2xpZW50LT5zZWdtZW50cyk7CisJCWNsaWVudC0+c2VnbWVudHMgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgYWdwX2FkZF9zZWdfdG9fY2xpZW50KHN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQsCisJCQkgICAgICAgc3RydWN0IGFncF9zZWdtZW50X3ByaXYgKiogc2VnLCBpbnQgbnVtX3NlZ21lbnRzKQoreworCXN0cnVjdCBhZ3Bfc2VnbWVudF9wcml2ICoqcHJldl9zZWc7CisKKwlwcmV2X3NlZyA9IGNsaWVudC0+c2VnbWVudHM7CisKKwlpZiAocHJldl9zZWcgIT0gTlVMTCkKKwkJYWdwX3JlbW92ZV9zZWdfZnJvbV9jbGllbnQoY2xpZW50KTsKKworCURCRygiQWRkaW5nIHNlZyAlcCAoJWQgc2VnbWVudHMpIHRvIGNsaWVudCAlcCIsIHNlZywgbnVtX3NlZ21lbnRzLCBjbGllbnQpOworCWNsaWVudC0+bnVtX3NlZ21lbnRzID0gbnVtX3NlZ21lbnRzOworCWNsaWVudC0+c2VnbWVudHMgPSBzZWc7Cit9CisKKy8qIE9yaWdpbmFsbHkgdGFrZW4gZnJvbSBsaW51eC9tbS9tbWFwLmMgZnJvbSB0aGUgYXJyYXkKKyAqIHByb3RlY3Rpb25fbWFwLgorICogVGhlIG9yaWdpbmFsIHJlYWxseSBzaG91bGQgYmUgZXhwb3J0ZWQgdG8gbW9kdWxlcywgb3IKKyAqIHNvbWUgcm91dGluZSB3aGljaCBkb2VzIHRoZSBjb252ZXJzaW9uIGZvciB5b3UKKyAqLworCitzdGF0aWMgY29uc3QgcGdwcm90X3QgbXlfcHJvdGVjdF9tYXBbMTZdID0KK3sKKwlfX1AwMDAsIF9fUDAwMSwgX19QMDEwLCBfX1AwMTEsIF9fUDEwMCwgX19QMTAxLCBfX1AxMTAsIF9fUDExMSwKKwlfX1MwMDAsIF9fUzAwMSwgX19TMDEwLCBfX1MwMTEsIF9fUzEwMCwgX19TMTAxLCBfX1MxMTAsIF9fUzExMQorfTsKKworc3RhdGljIHBncHJvdF90IGFncF9jb252ZXJ0X21tYXBfZmxhZ3MoaW50IHByb3QpCit7CisjZGVmaW5lIF90cmFucyh4LGJpdDEsYml0MikgXAorKChiaXQxPT1iaXQyKT8oeCZiaXQxKTooeCZiaXQxKT9iaXQyOjApCisKKwl1bnNpZ25lZCBsb25nIHByb3RfYml0czsKKwlwZ3Byb3RfdCB0ZW1wOworCisJcHJvdF9iaXRzID0gX3RyYW5zKHByb3QsIFBST1RfUkVBRCwgVk1fUkVBRCkgfAorCSAgICBfdHJhbnMocHJvdCwgUFJPVF9XUklURSwgVk1fV1JJVEUpIHwKKwkgICAgX3RyYW5zKHByb3QsIFBST1RfRVhFQywgVk1fRVhFQyk7CisKKwlwcm90X2JpdHMgfD0gVk1fU0hBUkVEOworCisJdGVtcCA9IG15X3Byb3RlY3RfbWFwW3Byb3RfYml0cyAmIDB4MDAwMDAwMGZdOworCisJcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyBpbnQgYWdwX2NyZWF0ZV9zZWdtZW50KHN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBhZ3BfcmVnaW9uICpyZWdpb24pCit7CisJc3RydWN0IGFncF9zZWdtZW50X3ByaXYgKipyZXRfc2VnOworCXN0cnVjdCBhZ3Bfc2VnbWVudF9wcml2ICpzZWc7CisJc3RydWN0IGFncF9zZWdtZW50ICp1c2VyX3NlZzsKKwlzaXplX3QgaTsKKworCXNlZyA9IGttYWxsb2MoKHNpemVvZihzdHJ1Y3QgYWdwX3NlZ21lbnRfcHJpdikgKiByZWdpb24tPnNlZ19jb3VudCksIEdGUF9LRVJORUwpOworCWlmIChzZWcgPT0gTlVMTCkgeworCQlrZnJlZShyZWdpb24tPnNlZ19saXN0KTsKKwkJcmVnaW9uLT5zZWdfbGlzdCA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoc2VnLCAwLCAoc2l6ZW9mKHN0cnVjdCBhZ3Bfc2VnbWVudF9wcml2KSAqIHJlZ2lvbi0+c2VnX2NvdW50KSk7CisJdXNlcl9zZWcgPSByZWdpb24tPnNlZ19saXN0OworCisJZm9yIChpID0gMDsgaSA8IHJlZ2lvbi0+c2VnX2NvdW50OyBpKyspIHsKKwkJc2VnW2ldLnBnX3N0YXJ0ID0gdXNlcl9zZWdbaV0ucGdfc3RhcnQ7CisJCXNlZ1tpXS5wZ19jb3VudCA9IHVzZXJfc2VnW2ldLnBnX2NvdW50OworCQlzZWdbaV0ucHJvdCA9IGFncF9jb252ZXJ0X21tYXBfZmxhZ3ModXNlcl9zZWdbaV0ucHJvdCk7CisJfQorCWtmcmVlKHJlZ2lvbi0+c2VnX2xpc3QpOworCXJlZ2lvbi0+c2VnX2xpc3QgPSBOVUxMOworCisJcmV0X3NlZyA9IGttYWxsb2Moc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpOworCWlmIChyZXRfc2VnID09IE5VTEwpIHsKKwkJa2ZyZWUoc2VnKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCSpyZXRfc2VnID0gc2VnOworCWFncF9hZGRfc2VnX3RvX2NsaWVudChjbGllbnQsIHJldF9zZWcsIHJlZ2lvbi0+c2VnX2NvdW50KTsKKwlyZXR1cm4gMDsKK30KKworLyogRW5kIC0gUm91dGluZXMgZm9yIG1hbmFnaW5nIGVhY2ggY2xpZW50J3Mgc2VnbWVudCBsaXN0ICovCisKKy8qIFRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlIGNhbGxlZCB3aGVuIGN1cnJlbnRfY29udHJvbGxlciAhPSBOVUxMICovCitzdGF0aWMgdm9pZCBhZ3BfaW5zZXJ0X2ludG9fcG9vbChzdHJ1Y3QgYWdwX21lbW9yeSAqIHRlbXApCit7CisJc3RydWN0IGFncF9tZW1vcnkgKnByZXY7CisKKwlwcmV2ID0gYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlci0+cG9vbDsKKworCWlmIChwcmV2ICE9IE5VTEwpIHsKKwkJcHJldi0+cHJldiA9IHRlbXA7CisJCXRlbXAtPm5leHQgPSBwcmV2OworCX0KKwlhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyLT5wb29sID0gdGVtcDsKK30KKworCisvKiBGaWxlIHByaXZhdGUgbGlzdCByb3V0aW5lcyAqLworCitzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqYWdwX2ZpbmRfcHJpdmF0ZShwaWRfdCBwaWQpCit7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmN1cnI7CisKKwljdXJyID0gYWdwX2ZlLmZpbGVfcHJpdl9saXN0OworCisJd2hpbGUgKGN1cnIgIT0gTlVMTCkgeworCQlpZiAoY3Vyci0+bXlfcGlkID09IHBpZCkKKwkJCXJldHVybiBjdXJyOworCQljdXJyID0gY3Vyci0+bmV4dDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBhZ3BfaW5zZXJ0X2ZpbGVfcHJpdmF0ZShzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqIHByaXYpCit7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByZXY7CisKKwlwcmV2ID0gYWdwX2ZlLmZpbGVfcHJpdl9saXN0OworCisJaWYgKHByZXYgIT0gTlVMTCkKKwkJcHJldi0+cHJldiA9IHByaXY7CisJcHJpdi0+bmV4dCA9IHByZXY7CisJYWdwX2ZlLmZpbGVfcHJpdl9saXN0ID0gcHJpdjsKK30KKwordm9pZCBhZ3BfcmVtb3ZlX2ZpbGVfcHJpdmF0ZShzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqIHByaXYpCit7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKm5leHQ7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByZXY7CisKKwluZXh0ID0gcHJpdi0+bmV4dDsKKwlwcmV2ID0gcHJpdi0+cHJldjsKKworCWlmIChwcmV2ICE9IE5VTEwpIHsKKwkJcHJldi0+bmV4dCA9IG5leHQ7CisKKwkJaWYgKG5leHQgIT0gTlVMTCkKKwkJCW5leHQtPnByZXYgPSBwcmV2OworCisJfSBlbHNlIHsKKwkJaWYgKG5leHQgIT0gTlVMTCkKKwkJCW5leHQtPnByZXYgPSBOVUxMOworCisJCWFncF9mZS5maWxlX3ByaXZfbGlzdCA9IG5leHQ7CisJfQorfQorCisvKiBFbmQgLSBGaWxlIGZsYWcgbGlzdCByb3V0aW5lcyAqLworCisvKgorICogV3JhcHBlcnMgZm9yIGFncF9mcmVlX21lbW9yeSAmIGFncF9hbGxvY2F0ZV9tZW1vcnkKKyAqIFRoZXNlIG1ha2Ugc3VyZSB0aGF0IGludGVybmFsIGxpc3RzIGFyZSBrZXB0IHVwZGF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGFncF9mcmVlX21lbW9yeV93cmFwKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnkpCit7CisJYWdwX3JlbW92ZV9mcm9tX3Bvb2wobWVtb3J5KTsKKwlhZ3BfZnJlZV9tZW1vcnkobWVtb3J5KTsKK30KKworc3RhdGljIHN0cnVjdCBhZ3BfbWVtb3J5ICphZ3BfYWxsb2NhdGVfbWVtb3J5X3dyYXAoc2l6ZV90IHBnX2NvdW50LCB1MzIgdHlwZSkKK3sKKwlzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtb3J5OworCisJbWVtb3J5ID0gYWdwX2FsbG9jYXRlX21lbW9yeShhZ3BfYnJpZGdlLCBwZ19jb3VudCwgdHlwZSk7CisJaWYgKG1lbW9yeSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWFncF9pbnNlcnRfaW50b19wb29sKG1lbW9yeSk7CisJcmV0dXJuIG1lbW9yeTsKK30KKworLyogUm91dGluZXMgZm9yIG1hbmFnaW5nIHRoZSBsaXN0IG9mIGNvbnRyb2xsZXJzIC0KKyAqIFRoZXNlIHJvdXRpbmVzIG1hbmFnZSB0aGUgY3VycmVudCBjb250cm9sbGVyLCBhbmQgdGhlIGxpc3Qgb2YKKyAqIGNvbnRyb2xsZXJzCisgKi8KKworc3RhdGljIHN0cnVjdCBhZ3BfY29udHJvbGxlciAqYWdwX2ZpbmRfY29udHJvbGxlcl9ieV9waWQocGlkX3QgaWQpCit7CisJc3RydWN0IGFncF9jb250cm9sbGVyICpjb250cm9sbGVyOworCisJY29udHJvbGxlciA9IGFncF9mZS5jb250cm9sbGVyczsKKworCXdoaWxlIChjb250cm9sbGVyICE9IE5VTEwpIHsKKwkJaWYgKGNvbnRyb2xsZXItPnBpZCA9PSBpZCkKKwkJCXJldHVybiBjb250cm9sbGVyOworCQljb250cm9sbGVyID0gY29udHJvbGxlci0+bmV4dDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBhZ3BfY29udHJvbGxlciAqYWdwX2NyZWF0ZV9jb250cm9sbGVyKHBpZF90IGlkKQoreworCXN0cnVjdCBhZ3BfY29udHJvbGxlciAqY29udHJvbGxlcjsKKworCWNvbnRyb2xsZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIpLCBHRlBfS0VSTkVMKTsKKworCWlmIChjb250cm9sbGVyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KGNvbnRyb2xsZXIsIDAsIHNpemVvZihzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIpKTsKKwljb250cm9sbGVyLT5waWQgPSBpZDsKKworCXJldHVybiBjb250cm9sbGVyOworfQorCitzdGF0aWMgaW50IGFncF9pbnNlcnRfY29udHJvbGxlcihzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpCit7CisJc3RydWN0IGFncF9jb250cm9sbGVyICpwcmV2X2NvbnRyb2xsZXI7CisKKwlwcmV2X2NvbnRyb2xsZXIgPSBhZ3BfZmUuY29udHJvbGxlcnM7CisJY29udHJvbGxlci0+bmV4dCA9IHByZXZfY29udHJvbGxlcjsKKworCWlmIChwcmV2X2NvbnRyb2xsZXIgIT0gTlVMTCkKKwkJcHJldl9jb250cm9sbGVyLT5wcmV2ID0gY29udHJvbGxlcjsKKworCWFncF9mZS5jb250cm9sbGVycyA9IGNvbnRyb2xsZXI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWdwX3JlbW92ZV9hbGxfY2xpZW50cyhzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpCit7CisJc3RydWN0IGFncF9jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgYWdwX2NsaWVudCAqdGVtcDsKKworCWNsaWVudCA9IGNvbnRyb2xsZXItPmNsaWVudHM7CisKKwl3aGlsZSAoY2xpZW50KSB7CisJCXN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2OworCisJCXRlbXAgPSBjbGllbnQ7CisJCWFncF9yZW1vdmVfc2VnX2Zyb21fY2xpZW50KHRlbXApOworCQlwcml2ID0gYWdwX2ZpbmRfcHJpdmF0ZSh0ZW1wLT5waWQpOworCisJCWlmIChwcml2ICE9IE5VTEwpIHsKKwkJCWNsZWFyX2JpdChBR1BfRkZfSVNfVkFMSUQsICZwcml2LT5hY2Nlc3NfZmxhZ3MpOworCQkJY2xlYXJfYml0KEFHUF9GRl9JU19DTElFTlQsICZwcml2LT5hY2Nlc3NfZmxhZ3MpOworCQl9CisJCWNsaWVudCA9IGNsaWVudC0+bmV4dDsKKwkJa2ZyZWUodGVtcCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZ3BfcmVtb3ZlX2FsbF9tZW1vcnkoc3RydWN0IGFncF9jb250cm9sbGVyICpjb250cm9sbGVyKQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnk7CisJc3RydWN0IGFncF9tZW1vcnkgKnRlbXA7CisKKwltZW1vcnkgPSBjb250cm9sbGVyLT5wb29sOworCisJd2hpbGUgKG1lbW9yeSkgeworCQl0ZW1wID0gbWVtb3J5OworCQltZW1vcnkgPSBtZW1vcnktPm5leHQ7CisJCWFncF9mcmVlX21lbW9yeV93cmFwKHRlbXApOworCX0KK30KKworc3RhdGljIGludCBhZ3BfcmVtb3ZlX2NvbnRyb2xsZXIoc3RydWN0IGFncF9jb250cm9sbGVyICpjb250cm9sbGVyKQoreworCXN0cnVjdCBhZ3BfY29udHJvbGxlciAqcHJldl9jb250cm9sbGVyOworCXN0cnVjdCBhZ3BfY29udHJvbGxlciAqbmV4dF9jb250cm9sbGVyOworCisJcHJldl9jb250cm9sbGVyID0gY29udHJvbGxlci0+cHJldjsKKwluZXh0X2NvbnRyb2xsZXIgPSBjb250cm9sbGVyLT5uZXh0OworCisJaWYgKHByZXZfY29udHJvbGxlciAhPSBOVUxMKSB7CisJCXByZXZfY29udHJvbGxlci0+bmV4dCA9IG5leHRfY29udHJvbGxlcjsKKwkJaWYgKG5leHRfY29udHJvbGxlciAhPSBOVUxMKQorCQkJbmV4dF9jb250cm9sbGVyLT5wcmV2ID0gcHJldl9jb250cm9sbGVyOworCisJfSBlbHNlIHsKKwkJaWYgKG5leHRfY29udHJvbGxlciAhPSBOVUxMKQorCQkJbmV4dF9jb250cm9sbGVyLT5wcmV2ID0gTlVMTDsKKworCQlhZ3BfZmUuY29udHJvbGxlcnMgPSBuZXh0X2NvbnRyb2xsZXI7CisJfQorCisJYWdwX3JlbW92ZV9hbGxfbWVtb3J5KGNvbnRyb2xsZXIpOworCWFncF9yZW1vdmVfYWxsX2NsaWVudHMoY29udHJvbGxlcik7CisKKwlpZiAoYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlciA9PSBjb250cm9sbGVyKSB7CisJCWFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXIgPSBOVUxMOworCQlhZ3BfZmUuYmFja2VuZF9hY3F1aXJlZCA9IEZBTFNFOworCQlhZ3BfYmFja2VuZF9yZWxlYXNlKGFncF9icmlkZ2UpOworCX0KKwlrZnJlZShjb250cm9sbGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWdwX2NvbnRyb2xsZXJfbWFrZV9jdXJyZW50KHN0cnVjdCBhZ3BfY29udHJvbGxlciAqY29udHJvbGxlcikKK3sKKwlzdHJ1Y3QgYWdwX2NsaWVudCAqY2xpZW50czsKKworCWNsaWVudHMgPSBjb250cm9sbGVyLT5jbGllbnRzOworCisJd2hpbGUgKGNsaWVudHMgIT0gTlVMTCkgeworCQlzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdjsKKworCQlwcml2ID0gYWdwX2ZpbmRfcHJpdmF0ZShjbGllbnRzLT5waWQpOworCisJCWlmIChwcml2ICE9IE5VTEwpIHsKKwkJCXNldF9iaXQoQUdQX0ZGX0lTX1ZBTElELCAmcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwkJCXNldF9iaXQoQUdQX0ZGX0lTX0NMSUVOVCwgJnByaXYtPmFjY2Vzc19mbGFncyk7CisJCX0KKwkJY2xpZW50cyA9IGNsaWVudHMtPm5leHQ7CisJfQorCisJYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlciA9IGNvbnRyb2xsZXI7Cit9CisKK3N0YXRpYyB2b2lkIGFncF9jb250cm9sbGVyX3JlbGVhc2VfY3VycmVudChzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIsCisJCQkJICAgICAgc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmNvbnRyb2xsZXJfcHJpdikKK3sKKwlzdHJ1Y3QgYWdwX2NsaWVudCAqY2xpZW50czsKKworCWNsZWFyX2JpdChBR1BfRkZfSVNfVkFMSUQsICZjb250cm9sbGVyX3ByaXYtPmFjY2Vzc19mbGFncyk7CisJY2xpZW50cyA9IGNvbnRyb2xsZXItPmNsaWVudHM7CisKKwl3aGlsZSAoY2xpZW50cyAhPSBOVUxMKSB7CisJCXN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2OworCisJCXByaXYgPSBhZ3BfZmluZF9wcml2YXRlKGNsaWVudHMtPnBpZCk7CisKKwkJaWYgKHByaXYgIT0gTlVMTCkKKwkJCWNsZWFyX2JpdChBR1BfRkZfSVNfVkFMSUQsICZwcml2LT5hY2Nlc3NfZmxhZ3MpOworCisJCWNsaWVudHMgPSBjbGllbnRzLT5uZXh0OworCX0KKworCWFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXIgPSBOVUxMOworCWFncF9mZS51c2VkX2J5X2NvbnRyb2xsZXIgPSBGQUxTRTsKKwlhZ3BfYmFja2VuZF9yZWxlYXNlKGFncF9icmlkZ2UpOworfQorCisvKgorICogUm91dGluZXMgZm9yIG1hbmFnaW5nIGNsaWVudCBsaXN0cyAtCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgZm9yIG1hbmFnaW5nIHRoZSBsaXN0IG9mIGF1dGgnZWQgY2xpZW50cy4KKyAqLworCitzdGF0aWMgc3RydWN0IGFncF9jbGllbnQKKyphZ3BfZmluZF9jbGllbnRfaW5fY29udHJvbGxlcihzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIsIHBpZF90IGlkKQoreworCXN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQ7CisKKwlpZiAoY29udHJvbGxlciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWNsaWVudCA9IGNvbnRyb2xsZXItPmNsaWVudHM7CisKKwl3aGlsZSAoY2xpZW50ICE9IE5VTEwpIHsKKwkJaWYgKGNsaWVudC0+cGlkID09IGlkKQorCQkJcmV0dXJuIGNsaWVudDsKKwkJY2xpZW50ID0gY2xpZW50LT5uZXh0OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGFncF9jb250cm9sbGVyICphZ3BfZmluZF9jb250cm9sbGVyX2Zvcl9jbGllbnQocGlkX3QgaWQpCit7CisJc3RydWN0IGFncF9jb250cm9sbGVyICpjb250cm9sbGVyOworCisJY29udHJvbGxlciA9IGFncF9mZS5jb250cm9sbGVyczsKKworCXdoaWxlIChjb250cm9sbGVyICE9IE5VTEwpIHsKKwkJaWYgKChhZ3BfZmluZF9jbGllbnRfaW5fY29udHJvbGxlcihjb250cm9sbGVyLCBpZCkpICE9IE5VTEwpCisJCQlyZXR1cm4gY29udHJvbGxlcjsKKwkJY29udHJvbGxlciA9IGNvbnRyb2xsZXItPm5leHQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2NsaWVudCAqYWdwX2ZpbmRfY2xpZW50X2J5X3BpZChwaWRfdCBpZCkKK3sKKwlzdHJ1Y3QgYWdwX2NsaWVudCAqdGVtcDsKKworCWlmIChhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJdGVtcCA9IGFncF9maW5kX2NsaWVudF9pbl9jb250cm9sbGVyKGFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXIsIGlkKTsKKwlyZXR1cm4gdGVtcDsKK30KKworc3RhdGljIHZvaWQgYWdwX2luc2VydF9jbGllbnQoc3RydWN0IGFncF9jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWdwX2NsaWVudCAqcHJldl9jbGllbnQ7CisKKwlwcmV2X2NsaWVudCA9IGFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXItPmNsaWVudHM7CisJY2xpZW50LT5uZXh0ID0gcHJldl9jbGllbnQ7CisKKwlpZiAocHJldl9jbGllbnQgIT0gTlVMTCkKKwkJcHJldl9jbGllbnQtPnByZXYgPSBjbGllbnQ7CisKKwlhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyLT5jbGllbnRzID0gY2xpZW50OworCWFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXItPm51bV9jbGllbnRzKys7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2NsaWVudCAqYWdwX2NyZWF0ZV9jbGllbnQocGlkX3QgaWQpCit7CisJc3RydWN0IGFncF9jbGllbnQgKm5ld19jbGllbnQ7CisKKwluZXdfY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFncF9jbGllbnQpLCBHRlBfS0VSTkVMKTsKKworCWlmIChuZXdfY2xpZW50ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KG5ld19jbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgYWdwX2NsaWVudCkpOworCW5ld19jbGllbnQtPnBpZCA9IGlkOworCWFncF9pbnNlcnRfY2xpZW50KG5ld19jbGllbnQpOworCXJldHVybiBuZXdfY2xpZW50OworfQorCitzdGF0aWMgaW50IGFncF9yZW1vdmVfY2xpZW50KHBpZF90IGlkKQoreworCXN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGFncF9jbGllbnQgKnByZXZfY2xpZW50OworCXN0cnVjdCBhZ3BfY2xpZW50ICpuZXh0X2NsaWVudDsKKwlzdHJ1Y3QgYWdwX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7CisKKwljb250cm9sbGVyID0gYWdwX2ZpbmRfY29udHJvbGxlcl9mb3JfY2xpZW50KGlkKTsKKwlpZiAoY29udHJvbGxlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNsaWVudCA9IGFncF9maW5kX2NsaWVudF9pbl9jb250cm9sbGVyKGNvbnRyb2xsZXIsIGlkKTsKKwlpZiAoY2xpZW50ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJldl9jbGllbnQgPSBjbGllbnQtPnByZXY7CisJbmV4dF9jbGllbnQgPSBjbGllbnQtPm5leHQ7CisKKwlpZiAocHJldl9jbGllbnQgIT0gTlVMTCkgeworCQlwcmV2X2NsaWVudC0+bmV4dCA9IG5leHRfY2xpZW50OworCQlpZiAobmV4dF9jbGllbnQgIT0gTlVMTCkKKwkJCW5leHRfY2xpZW50LT5wcmV2ID0gcHJldl9jbGllbnQ7CisKKwl9IGVsc2UgeworCQlpZiAobmV4dF9jbGllbnQgIT0gTlVMTCkKKwkJCW5leHRfY2xpZW50LT5wcmV2ID0gTlVMTDsKKwkJY29udHJvbGxlci0+Y2xpZW50cyA9IG5leHRfY2xpZW50OworCX0KKworCWNvbnRyb2xsZXItPm51bV9jbGllbnRzLS07CisJYWdwX3JlbW92ZV9zZWdfZnJvbV9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShjbGllbnQpOworCXJldHVybiAwOworfQorCisvKiBFbmQgLSBSb3V0aW5lcyBmb3IgbWFuYWdpbmcgY2xpZW50IGxpc3RzICovCisKKy8qIEZpbGUgT3BlcmF0aW9ucyAqLworCitzdGF0aWMgaW50IGFncF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgY3VycmVudF9zaXplOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFncF9rZXJuX2luZm8ga2VybmluZm87CisKKwlkb3duKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCisJaWYgKGFncF9mZS5iYWNrZW5kX2FjcXVpcmVkICE9IFRSVUUpCisJCWdvdG8gb3V0X2VwZXJtOworCisJaWYgKCEodGVzdF9iaXQoQUdQX0ZGX0lTX1ZBTElELCAmcHJpdi0+YWNjZXNzX2ZsYWdzKSkpCisJCWdvdG8gb3V0X2VwZXJtOworCisJYWdwX2NvcHlfaW5mbyhhZ3BfYnJpZGdlLCAma2VybmluZm8pOworCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJY3VycmVudF9zaXplID0ga2VybmluZm8uYXBlcl9zaXplOworCWN1cnJlbnRfc2l6ZSA9IGN1cnJlbnRfc2l6ZSAqIDB4MTAwMDAwOworCW9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKwlEQkcoIiVseDolbHgiLCBvZmZzZXQsIG9mZnNldCtzaXplKTsKKworCWlmICh0ZXN0X2JpdChBR1BfRkZfSVNfQ0xJRU5ULCAmcHJpdi0+YWNjZXNzX2ZsYWdzKSkgeworCQlpZiAoKHNpemUgKyBvZmZzZXQpID4gY3VycmVudF9zaXplKQorCQkJZ290byBvdXRfaW52YWw7CisKKwkJY2xpZW50ID0gYWdwX2ZpbmRfY2xpZW50X2J5X3BpZChjdXJyZW50LT5waWQpOworCisJCWlmIChjbGllbnQgPT0gTlVMTCkKKwkJCWdvdG8gb3V0X2VwZXJtOworCisJCWlmICghYWdwX2ZpbmRfc2VnX2luX2NsaWVudChjbGllbnQsIG9mZnNldCwgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQkJZ290byBvdXRfaW52YWw7CisKKwkJREJHKCJjbGllbnQgdm1fb3BzPSVwIiwga2VybmluZm8udm1fb3BzKTsKKwkJaWYgKGtlcm5pbmZvLnZtX29wcykgeworCQkJdm1hLT52bV9vcHMgPSBrZXJuaW5mby52bV9vcHM7CisJCX0gZWxzZSBpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQkoa2VybmluZm8uYXBlcl9iYXNlICsgb2Zmc2V0KSA+PiBQQUdFX1NISUZULAorCQkJCQkgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCQlnb3RvIG91dF9hZ2FpbjsKKwkJfQorCQl1cCgmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHRlc3RfYml0KEFHUF9GRl9JU19DT05UUk9MTEVSLCAmcHJpdi0+YWNjZXNzX2ZsYWdzKSkgeworCQlpZiAoc2l6ZSAhPSBjdXJyZW50X3NpemUpCisJCQlnb3RvIG91dF9pbnZhbDsKKworCQlEQkcoImNvbnRyb2xsZXIgdm1fb3BzPSVwIiwga2VybmluZm8udm1fb3BzKTsKKwkJaWYgKGtlcm5pbmZvLnZtX29wcykgeworCQkJdm1hLT52bV9vcHMgPSBrZXJuaW5mby52bV9vcHM7CisJCX0gZWxzZSBpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQkJICAgIGtlcm5pbmZvLmFwZXJfYmFzZSA+PiBQQUdFX1NISUZULAorCQkJCQkgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCQlnb3RvIG91dF9hZ2FpbjsKKwkJfQorCQl1cCgmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKwkJcmV0dXJuIDA7CisJfQorCitvdXRfZXBlcm06CisJdXAoJihhZ3BfZmUuYWdwX211dGV4KSk7CisJcmV0dXJuIC1FUEVSTTsKKworb3V0X2ludmFsOgorCXVwKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCXJldHVybiAtRUlOVkFMOworCitvdXRfYWdhaW46CisJdXAoJihhZ3BfZmUuYWdwX211dGV4KSk7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKK3N0YXRpYyBpbnQgYWdwX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlkb3duKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCisJREJHKCJwcml2PSVwIiwgcHJpdik7CisKKwlpZiAodGVzdF9iaXQoQUdQX0ZGX0lTX0NPTlRST0xMRVIsICZwcml2LT5hY2Nlc3NfZmxhZ3MpKSB7CisJCXN0cnVjdCBhZ3BfY29udHJvbGxlciAqY29udHJvbGxlcjsKKworCQljb250cm9sbGVyID0gYWdwX2ZpbmRfY29udHJvbGxlcl9ieV9waWQocHJpdi0+bXlfcGlkKTsKKworCQlpZiAoY29udHJvbGxlciAhPSBOVUxMKSB7CisJCQlpZiAoY29udHJvbGxlciA9PSBhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyKQorCQkJCWFncF9jb250cm9sbGVyX3JlbGVhc2VfY3VycmVudChjb250cm9sbGVyLCBwcml2KTsKKwkJCWFncF9yZW1vdmVfY29udHJvbGxlcihjb250cm9sbGVyKTsKKwkJCWNvbnRyb2xsZXIgPSBOVUxMOworCQl9CisJfQorCisJaWYgKHRlc3RfYml0KEFHUF9GRl9JU19DTElFTlQsICZwcml2LT5hY2Nlc3NfZmxhZ3MpKQorCQlhZ3BfcmVtb3ZlX2NsaWVudChwcml2LT5teV9waWQpOworCisJYWdwX3JlbW92ZV9maWxlX3ByaXZhdGUocHJpdik7CisJa2ZyZWUocHJpdik7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwl1cCgmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZ3Bfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2OworCXN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQ7CisJaW50IHJjID0gLUVOWElPOworCisJZG93bigmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKworCWlmIChtaW5vciAhPSBBR1BHQVJUX01JTk9SKQorCQlnb3RvIGVycl9vdXQ7CisKKwlwcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFncF9maWxlX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdiA9PSBOVUxMKQorCQlnb3RvIGVycl9vdXRfbm9tZW07CisKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlKSk7CisJc2V0X2JpdChBR1BfRkZfQUxMT1dfQ0xJRU5ULCAmcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwlwcml2LT5teV9waWQgPSBjdXJyZW50LT5waWQ7CisKKwlpZiAoKGN1cnJlbnQtPnVpZCA9PSAwKSB8fCAoY3VycmVudC0+c3VpZCA9PSAwKSkgeworCQkvKiBSb290IHByaXYsIGNhbiBiZSBjb250cm9sbGVyICovCisJCXNldF9iaXQoQUdQX0ZGX0FMTE9XX0NPTlRST0xMRVIsICZwcml2LT5hY2Nlc3NfZmxhZ3MpOworCX0KKwljbGllbnQgPSBhZ3BfZmluZF9jbGllbnRfYnlfcGlkKGN1cnJlbnQtPnBpZCk7CisKKwlpZiAoY2xpZW50ICE9IE5VTEwpIHsKKwkJc2V0X2JpdChBR1BfRkZfSVNfQ0xJRU5ULCAmcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwkJc2V0X2JpdChBR1BfRkZfSVNfVkFMSUQsICZwcml2LT5hY2Nlc3NfZmxhZ3MpOworCX0KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSBwcml2OworCWFncF9pbnNlcnRfZmlsZV9wcml2YXRlKHByaXYpOworCURCRygicHJpdmF0ZT0lcCwgY2xpZW50PSVwIiwgcHJpdiwgY2xpZW50KTsKKwl1cCgmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKwlyZXR1cm4gMDsKKworZXJyX291dF9ub21lbToKKwlyYyA9IC1FTk9NRU07CitlcnJfb3V0OgorCXVwKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgc3NpemVfdCBhZ3BfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNzaXplX3QgYWdwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhZ3Bpb2NfaW5mb193cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhZ3BfaW5mbyB1c2VyaW5mbzsKKwlzdHJ1Y3QgYWdwX2tlcm5faW5mbyBrZXJuaW5mbzsKKworCWFncF9jb3B5X2luZm8oYWdwX2JyaWRnZSwgJmtlcm5pbmZvKTsKKworCXVzZXJpbmZvLnZlcnNpb24ubWFqb3IgPSBrZXJuaW5mby52ZXJzaW9uLm1ham9yOworCXVzZXJpbmZvLnZlcnNpb24ubWlub3IgPSBrZXJuaW5mby52ZXJzaW9uLm1pbm9yOworCXVzZXJpbmZvLmJyaWRnZV9pZCA9IGtlcm5pbmZvLmRldmljZS0+dmVuZG9yIHwKKwkgICAgKGtlcm5pbmZvLmRldmljZS0+ZGV2aWNlIDw8IDE2KTsKKwl1c2VyaW5mby5hZ3BfbW9kZSA9IGtlcm5pbmZvLm1vZGU7CisJdXNlcmluZm8uYXBlcl9iYXNlID0ga2VybmluZm8uYXBlcl9iYXNlOworCXVzZXJpbmZvLmFwZXJfc2l6ZSA9IGtlcm5pbmZvLmFwZXJfc2l6ZTsKKwl1c2VyaW5mby5wZ190b3RhbCA9IHVzZXJpbmZvLnBnX3N5c3RlbSA9IGtlcm5pbmZvLm1heF9tZW1vcnk7CisJdXNlcmluZm8ucGdfdXNlZCA9IGtlcm5pbmZvLmN1cnJlbnRfbWVtb3J5OworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ1c2VyaW5mbywgc2l6ZW9mKHN0cnVjdCBhZ3BfaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFncGlvY19hY3F1aXJlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IGFncF9jb250cm9sbGVyICpjb250cm9sbGVyOworCisJREJHKCIiKTsKKworCWlmICghKHRlc3RfYml0KEFHUF9GRl9BTExPV19DT05UUk9MTEVSLCAmcHJpdi0+YWNjZXNzX2ZsYWdzKSkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlciAhPSBOVUxMKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYoIWFncF9icmlkZ2UpCisJCXJldHVybiAtRU5PREVWOworCisgICAgICAgIGlmIChhdG9taWNfcmVhZCgmYWdwX2JyaWRnZS0+YWdwX2luX3VzZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKworCWF0b21pY19pbmMoJmFncF9icmlkZ2UtPmFncF9pbl91c2UpOworCisJYWdwX2ZlLmJhY2tlbmRfYWNxdWlyZWQgPSBUUlVFOworCisJY29udHJvbGxlciA9IGFncF9maW5kX2NvbnRyb2xsZXJfYnlfcGlkKHByaXYtPm15X3BpZCk7CisKKwlpZiAoY29udHJvbGxlciAhPSBOVUxMKSB7CisJCWFncF9jb250cm9sbGVyX21ha2VfY3VycmVudChjb250cm9sbGVyKTsKKwl9IGVsc2UgeworCQljb250cm9sbGVyID0gYWdwX2NyZWF0ZV9jb250cm9sbGVyKHByaXYtPm15X3BpZCk7CisKKwkJaWYgKGNvbnRyb2xsZXIgPT0gTlVMTCkgeworCQkJYWdwX2ZlLmJhY2tlbmRfYWNxdWlyZWQgPSBGQUxTRTsKKwkJCWFncF9iYWNrZW5kX3JlbGVhc2UoYWdwX2JyaWRnZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlhZ3BfaW5zZXJ0X2NvbnRyb2xsZXIoY29udHJvbGxlcik7CisJCWFncF9jb250cm9sbGVyX21ha2VfY3VycmVudChjb250cm9sbGVyKTsKKwl9CisKKwlzZXRfYml0KEFHUF9GRl9JU19DT05UUk9MTEVSLCAmcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwlzZXRfYml0KEFHUF9GRl9JU19WQUxJRCwgJnByaXYtPmFjY2Vzc19mbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWdwaW9jX3JlbGVhc2Vfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdikKK3sKKwlEQkcoIiIpOworCWFncF9jb250cm9sbGVyX3JlbGVhc2VfY3VycmVudChhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyLCBwcml2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZ3Bpb2Nfc2V0dXBfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWdwX3NldHVwIG1vZGU7CisKKwlEQkcoIiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmbW9kZSwgYXJnLCBzaXplb2Yoc3RydWN0IGFncF9zZXR1cCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWFncF9lbmFibGUoYWdwX2JyaWRnZSwgbW9kZS5hZ3BfbW9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWdwaW9jX3Jlc2VydmVfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWdwX3JlZ2lvbiByZXNlcnZlOworCXN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmNsaWVudF9wcml2OworCisJREJHKCIiKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlc2VydmUsIGFyZywgc2l6ZW9mKHN0cnVjdCBhZ3BfcmVnaW9uKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCh1bnNpZ25lZCkgcmVzZXJ2ZS5zZWdfY291bnQgPj0gfjBVL3NpemVvZihzdHJ1Y3QgYWdwX3NlZ21lbnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNsaWVudCA9IGFncF9maW5kX2NsaWVudF9ieV9waWQocmVzZXJ2ZS5waWQpOworCisJaWYgKHJlc2VydmUuc2VnX2NvdW50ID09IDApIHsKKwkJLyogcmVtb3ZlIGEgY2xpZW50ICovCisJCWNsaWVudF9wcml2ID0gYWdwX2ZpbmRfcHJpdmF0ZShyZXNlcnZlLnBpZCk7CisKKwkJaWYgKGNsaWVudF9wcml2ICE9IE5VTEwpIHsKKwkJCXNldF9iaXQoQUdQX0ZGX0lTX0NMSUVOVCwgJmNsaWVudF9wcml2LT5hY2Nlc3NfZmxhZ3MpOworCQkJc2V0X2JpdChBR1BfRkZfSVNfVkFMSUQsICZjbGllbnRfcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwkJfQorCQlpZiAoY2xpZW50ID09IE5VTEwpIHsKKwkJCS8qIGNsaWVudCBpcyBhbHJlYWR5IHJlbW92ZWQgKi8KKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiBhZ3BfcmVtb3ZlX2NsaWVudChyZXNlcnZlLnBpZCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGFncF9zZWdtZW50ICpzZWdtZW50OworCisJCWlmIChyZXNlcnZlLnNlZ19jb3VudCA+PSAxNjM4NCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNlZ21lbnQgPSBrbWFsbG9jKChzaXplb2Yoc3RydWN0IGFncF9zZWdtZW50KSAqIHJlc2VydmUuc2VnX2NvdW50KSwKKwkJCQkgIEdGUF9LRVJORUwpOworCisJCWlmIChzZWdtZW50ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoc2VnbWVudCwgKHZvaWQgX191c2VyICopIHJlc2VydmUuc2VnX2xpc3QsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBhZ3Bfc2VnbWVudCkgKiByZXNlcnZlLnNlZ19jb3VudCkpIHsKKwkJCWtmcmVlKHNlZ21lbnQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmVzZXJ2ZS5zZWdfbGlzdCA9IHNlZ21lbnQ7CisKKwkJaWYgKGNsaWVudCA9PSBOVUxMKSB7CisJCQkvKiBDcmVhdGUgdGhlIGNsaWVudCBhbmQgYWRkIHRoZSBzZWdtZW50ICovCisJCQljbGllbnQgPSBhZ3BfY3JlYXRlX2NsaWVudChyZXNlcnZlLnBpZCk7CisKKwkJCWlmIChjbGllbnQgPT0gTlVMTCkgeworCQkJCWtmcmVlKHNlZ21lbnQpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJY2xpZW50X3ByaXYgPSBhZ3BfZmluZF9wcml2YXRlKHJlc2VydmUucGlkKTsKKworCQkJaWYgKGNsaWVudF9wcml2ICE9IE5VTEwpIHsKKwkJCQlzZXRfYml0KEFHUF9GRl9JU19DTElFTlQsICZjbGllbnRfcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwkJCQlzZXRfYml0KEFHUF9GRl9JU19WQUxJRCwgJmNsaWVudF9wcml2LT5hY2Nlc3NfZmxhZ3MpOworCQkJfQorCQl9CisJCXJldHVybiBhZ3BfY3JlYXRlX3NlZ21lbnQoY2xpZW50LCAmcmVzZXJ2ZSk7CisJfQorCS8qIFdpbGwgbmV2ZXIgcmVhbGx5IGhhcHBlbiAqLworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGFncGlvY19wcm90ZWN0X3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpCit7CisJREJHKCIiKTsKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhZ3Bpb2NfYWxsb2NhdGVfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtb3J5OworCXN0cnVjdCBhZ3BfYWxsb2NhdGUgYWxsb2M7CisKKwlEQkcoIiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmYWxsb2MsIGFyZywgc2l6ZW9mKHN0cnVjdCBhZ3BfYWxsb2NhdGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1vcnkgPSBhZ3BfYWxsb2NhdGVfbWVtb3J5X3dyYXAoYWxsb2MucGdfY291bnQsIGFsbG9jLnR5cGUpOworCisJaWYgKG1lbW9yeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFsbG9jLmtleSA9IG1lbW9yeS0+a2V5OworCWFsbG9jLnBoeXNpY2FsID0gbWVtb3J5LT5waHlzaWNhbDsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYWxsb2MsIHNpemVvZihzdHJ1Y3QgYWdwX2FsbG9jYXRlKSkpIHsKKwkJYWdwX2ZyZWVfbWVtb3J5X3dyYXAobWVtb3J5KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFncGlvY19kZWFsbG9jYXRlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIGludCBhcmcpCit7CisJc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeTsKKworCURCRygiIik7CisJbWVtb3J5ID0gYWdwX2ZpbmRfbWVtX2J5X2tleShhcmcpOworCisJaWYgKG1lbW9yeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFncF9mcmVlX21lbW9yeV93cmFwKG1lbW9yeSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWdwaW9jX2JpbmRfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWdwX2JpbmQgYmluZF9pbmZvOworCXN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnk7CisKKwlEQkcoIiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmYmluZF9pbmZvLCBhcmcsIHNpemVvZihzdHJ1Y3QgYWdwX2JpbmQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1vcnkgPSBhZ3BfZmluZF9tZW1fYnlfa2V5KGJpbmRfaW5mby5rZXkpOworCisJaWYgKG1lbW9yeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBhZ3BfYmluZF9tZW1vcnkobWVtb3J5LCBiaW5kX2luZm8ucGdfc3RhcnQpOworfQorCitzdGF0aWMgaW50IGFncGlvY191bmJpbmRfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtb3J5OworCXN0cnVjdCBhZ3BfdW5iaW5kIHVuYmluZDsKKworCURCRygiIik7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1bmJpbmQsIGFyZywgc2l6ZW9mKHN0cnVjdCBhZ3BfdW5iaW5kKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtb3J5ID0gYWdwX2ZpbmRfbWVtX2J5X2tleSh1bmJpbmQua2V5KTsKKworCWlmIChtZW1vcnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gYWdwX3VuYmluZF9tZW1vcnkobWVtb3J5KTsKK30KKworc3RhdGljIGludCBhZ3BfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmN1cnJfcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0X3ZhbCA9IC1FTk9UVFk7CisKKwlEQkcoInByaXY9JXAsIGNtZD0leCIsIGN1cnJfcHJpdiwgY21kKTsKKwlkb3duKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCisJaWYgKChhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyID09IE5VTEwpICYmCisJICAgIChjbWQgIT0gQUdQSU9DX0FDUVVJUkUpKSB7CisJCXJldF92YWwgPSAtRUlOVkFMOworCQlnb3RvIGlvY3RsX291dDsKKwl9CisJaWYgKChhZ3BfZmUuYmFja2VuZF9hY3F1aXJlZCAhPSBUUlVFKSAmJgorCSAgICAoY21kICE9IEFHUElPQ19BQ1FVSVJFKSkgeworCQlyZXRfdmFsID0gLUVCVVNZOworCQlnb3RvIGlvY3RsX291dDsKKwl9CisJaWYgKGNtZCAhPSBBR1BJT0NfQUNRVUlSRSkgeworCQlpZiAoISh0ZXN0X2JpdChBR1BfRkZfSVNfQ09OVFJPTExFUiwgJmN1cnJfcHJpdi0+YWNjZXNzX2ZsYWdzKSkpIHsKKwkJCXJldF92YWwgPSAtRVBFUk07CisJCQlnb3RvIGlvY3RsX291dDsKKwkJfQorCQkvKiBVc2UgdGhlIG9yaWdpbmFsIHBpZCBvZiB0aGUgY29udHJvbGxlciwKKwkJICogaW4gY2FzZSBpdCdzIHRocmVhZGVkICovCisKKwkJaWYgKGFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXItPnBpZCAhPSBjdXJyX3ByaXYtPm15X3BpZCkgeworCQkJcmV0X3ZhbCA9IC1FQlVTWTsKKwkJCWdvdG8gaW9jdGxfb3V0OworCQl9CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFHUElPQ19JTkZPOgorCQlyZXRfdmFsID0gYWdwaW9jX2luZm9fd3JhcChjdXJyX3ByaXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX0FDUVVJUkU6CisJCXJldF92YWwgPSBhZ3Bpb2NfYWNxdWlyZV93cmFwKGN1cnJfcHJpdik7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfUkVMRUFTRToKKwkJcmV0X3ZhbCA9IGFncGlvY19yZWxlYXNlX3dyYXAoY3Vycl9wcml2KTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19TRVRVUDoKKwkJcmV0X3ZhbCA9IGFncGlvY19zZXR1cF93cmFwKGN1cnJfcHJpdiwgKHZvaWQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfUkVTRVJWRToKKwkJcmV0X3ZhbCA9IGFncGlvY19yZXNlcnZlX3dyYXAoY3Vycl9wcml2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19QUk9URUNUOgorCQlyZXRfdmFsID0gYWdwaW9jX3Byb3RlY3Rfd3JhcChjdXJyX3ByaXYpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX0FMTE9DQVRFOgorCQlyZXRfdmFsID0gYWdwaW9jX2FsbG9jYXRlX3dyYXAoY3Vycl9wcml2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19ERUFMTE9DQVRFOgorCQlyZXRfdmFsID0gYWdwaW9jX2RlYWxsb2NhdGVfd3JhcChjdXJyX3ByaXYsIChpbnQpIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfQklORDoKKwkJcmV0X3ZhbCA9IGFncGlvY19iaW5kX3dyYXAoY3Vycl9wcml2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19VTkJJTkQ6CisJCXJldF92YWwgPSBhZ3Bpb2NfdW5iaW5kX3dyYXAoY3Vycl9wcml2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisJfQorCitpb2N0bF9vdXQ6CisJREJHKCJpb2N0bCByZXR1cm5zICVkXG4iLCByZXRfdmFsKTsKKwl1cCgmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWdwX2ZvcHMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBhZ3BfcmVhZCwKKwkud3JpdGUJCT0gYWdwX3dyaXRlLAorCS5pb2N0bAkJPSBhZ3BfaW9jdGwsCisJLm1tYXAJCT0gYWdwX21tYXAsCisJLm9wZW4JCT0gYWdwX29wZW4sCisJLnJlbGVhc2UJPSBhZ3BfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhZ3BfbWlzY2RldiA9Cit7CisJLm1pbm9yCT0gQUdQR0FSVF9NSU5PUiwKKwkubmFtZQk9ICJhZ3BnYXJ0IiwKKwkuZm9wcwk9ICZhZ3BfZm9wcworfTsKKworaW50IGFncF9mcm9udGVuZF9pbml0aWFsaXplKHZvaWQpCit7CisJbWVtc2V0KCZhZ3BfZmUsIDAsIHNpemVvZihzdHJ1Y3QgYWdwX2Zyb250X2RhdGEpKTsKKwlzZW1hX2luaXQoJihhZ3BfZmUuYWdwX211dGV4KSwgMSk7CisKKwlpZiAobWlzY19yZWdpc3RlcigmYWdwX21pc2NkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBnZXQgbWlub3I6ICVkXG4iLCBBR1BHQVJUX01JTk9SKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGFncF9mcm9udGVuZF9jbGVhbnVwKHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZhZ3BfbWlzY2Rldik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMjFhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYwpAQCAtMCwwICsxLDEyMjIgQEAKKy8qCisgKiBBR1BHQVJUIGRyaXZlci4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBEYXZlIEpvbmVzLgorICogQ29weXJpZ2h0IChDKSAxOTk5IEplZmYgSGFydG1hbm4uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMTk5OSBYaSBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogSkVGRiBIQVJUTUFOTiwgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFCisgKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBUT0RPOgorICogLSBBbGxvY2F0ZSBtb3JlIHRoYW4gb3JkZXIgMCBwYWdlcyB0byBhdm9pZCB0b28gbXVjaCBsaW5lYXIgbWFwIHNwbGl0dGluZy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworX191MzIgKmFncF9nYXR0X3RhYmxlOworaW50IGFncF9tZW1vcnlfcmVzZXJ2ZWQ7CisKKy8qCisgKiBOZWVkZWQgYnkgdGhlIE5mb3JjZSBHQVJUIGRyaXZlciBmb3IgdGhlIHRpbWUgYmVpbmcuIFdvdWxkIGJlCisgKiBuaWNlIHRvIGRvIHRoaXMgc29tZSBvdGhlciB3YXkgaW5zdGVhZCBvZiBuZWVkaW5nIHRoaXMgZXhwb3J0LgorICovCitFWFBPUlRfU1lNQk9MX0dQTChhZ3BfbWVtb3J5X3Jlc2VydmVkKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1g4NikKK2ludCBtYXBfcGFnZV9pbnRvX2FncChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpbnQgaTsKKwlpID0gY2hhbmdlX3BhZ2VfYXR0cihwYWdlLCAxLCBQQUdFX0tFUk5FTF9OT0NBQ0hFKTsKKwlnbG9iYWxfZmx1c2hfdGxiKCk7CisJcmV0dXJuIGk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtYXBfcGFnZV9pbnRvX2FncCk7CisKK2ludCB1bm1hcF9wYWdlX2Zyb21fYWdwKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWludCBpOworCWkgPSBjaGFuZ2VfcGFnZV9hdHRyKHBhZ2UsIDEsIFBBR0VfS0VSTkVMKTsKKwlnbG9iYWxfZmx1c2hfdGxiKCk7CisJcmV0dXJuIGk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1bm1hcF9wYWdlX2Zyb21fYWdwKTsKKyNlbmRpZgorCisvKgorICogR2VuZXJpYyByb3V0aW5lcyBmb3IgaGFuZGxpbmcgYWdwX21lbW9yeSBzdHJ1Y3R1cmVzIC0KKyAqIFRoZXkgdXNlIHRoZSBiYXNpYyBwYWdlIGFsbG9jYXRpb24gcm91dGluZXMgdG8gZG8gdGhlIGJydW50IG9mIHRoZSB3b3JrLgorICovCisKK3ZvaWQgYWdwX2ZyZWVfa2V5KGludCBrZXkpCit7CisJaWYgKGtleSA8IDApCisJCXJldHVybjsKKworCWlmIChrZXkgPCBNQVhLRVkpCisJCWNsZWFyX2JpdChrZXksIGFncF9icmlkZ2UtPmtleV9saXN0KTsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2ZyZWVfa2V5KTsKKworCitzdGF0aWMgaW50IGFncF9nZXRfa2V5KHZvaWQpCit7CisJaW50IGJpdDsKKworCWJpdCA9IGZpbmRfZmlyc3RfemVyb19iaXQoYWdwX2JyaWRnZS0+a2V5X2xpc3QsIE1BWEtFWSk7CisJaWYgKGJpdCA8IE1BWEtFWSkgeworCQlzZXRfYml0KGJpdCwgYWdwX2JyaWRnZS0+a2V5X2xpc3QpOworCQlyZXR1cm4gYml0OworCX0KKwlyZXR1cm4gLTE7Cit9CisKKworc3RydWN0IGFncF9tZW1vcnkgKmFncF9jcmVhdGVfbWVtb3J5KGludCBzY3JhdGNoX3BhZ2VzKQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICpuZXc7CisKKwluZXcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWdwX21lbW9yeSksIEdGUF9LRVJORUwpOworCisJaWYgKG5ldyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChuZXcsIDAsIHNpemVvZihzdHJ1Y3QgYWdwX21lbW9yeSkpOworCW5ldy0+a2V5ID0gYWdwX2dldF9rZXkoKTsKKworCWlmIChuZXctPmtleSA8IDApIHsKKwkJa2ZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW5ldy0+bWVtb3J5ID0gdm1hbGxvYyhQQUdFX1NJWkUgKiBzY3JhdGNoX3BhZ2VzKTsKKworCWlmIChuZXctPm1lbW9yeSA9PSBOVUxMKSB7CisJCWFncF9mcmVlX2tleShuZXctPmtleSk7CisJCWtmcmVlKG5ldyk7CisJCXJldHVybiBOVUxMOworCX0KKwluZXctPm51bV9zY3JhdGNoX3BhZ2VzID0gc2NyYXRjaF9wYWdlczsKKwlyZXR1cm4gbmV3OworfQorRVhQT1JUX1NZTUJPTChhZ3BfY3JlYXRlX21lbW9yeSk7CisKKy8qKgorICoJYWdwX2ZyZWVfbWVtb3J5IC0gZnJlZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGFuIGFncF9tZW1vcnkgcG9pbnRlci4KKyAqCisgKglAY3VycjoJCWFncF9tZW1vcnkgcG9pbnRlciB0byBiZSBmcmVlZC4KKyAqCisgKglJdCBpcyB0aGUgb25seSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgd2hlbiB0aGUgYmFja2VuZCBpcyBub3Qgb3duZWQKKyAqCWJ5IHRoZSBjYWxsZXIuICAoU28gaXQgY2FuIGZyZWUgbWVtb3J5IG9uIGNsaWVudCBkZWF0aC4pCisgKi8KK3ZvaWQgYWdwX2ZyZWVfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICpjdXJyKQoreworCXNpemVfdCBpOworCisJaWYgKGN1cnIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGN1cnItPmlzX2JvdW5kID09IFRSVUUpCisJCWFncF91bmJpbmRfbWVtb3J5KGN1cnIpOworCisJaWYgKGN1cnItPnR5cGUgIT0gMCkgeworCQljdXJyLT5icmlkZ2UtPmRyaXZlci0+ZnJlZV9ieV90eXBlKGN1cnIpOworCQlyZXR1cm47CisJfQorCWlmIChjdXJyLT5wYWdlX2NvdW50ICE9IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGN1cnItPnBhZ2VfY291bnQ7IGkrKykgeworCQkJY3Vyci0+YnJpZGdlLT5kcml2ZXItPmFncF9kZXN0cm95X3BhZ2UocGh5c190b192aXJ0KGN1cnItPm1lbW9yeVtpXSkpOworCQl9CisJfQorCWFncF9mcmVlX2tleShjdXJyLT5rZXkpOworCXZmcmVlKGN1cnItPm1lbW9yeSk7CisJa2ZyZWUoY3Vycik7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9mcmVlX21lbW9yeSk7CisKKyNkZWZpbmUgRU5UUklFU19QRVJfUEFHRQkJKFBBR0VfU0laRSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKworLyoqCisgKglhZ3BfYWxsb2NhdGVfbWVtb3J5ICAtICBhbGxvY2F0ZSBhIGdyb3VwIG9mIHBhZ2VzIG9mIGEgY2VydGFpbiB0eXBlLgorICoKKyAqCUBwYWdlX2NvdW50OglzaXplX3QgYXJndW1lbnQgb2YgdGhlIG51bWJlciBvZiBwYWdlcworICoJQHR5cGU6CXUzMiBhcmd1bWVudCBvZiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkLgorICoKKyAqCUV2ZXJ5IGFncCBicmlkZ2UgZGV2aWNlIHdpbGwgYWxsb3cgeW91IHRvIGFsbG9jYXRlIEFHUF9OT1JNQUxfTUVNT1JZIHdoaWNoCisgKgltYXBzIHRvIHBoeXNpY2FsIHJhbS4gIEFueSBvdGhlciB0eXBlIGlzIGRldmljZSBkZXBlbmRlbnQuCisgKgorICoJSXQgcmV0dXJucyBOVUxMIHdoZW5ldmVyIG1lbW9yeSBpcyB1bmF2YWlsYWJsZS4KKyAqLworc3RydWN0IGFncF9tZW1vcnkgKmFncF9hbGxvY2F0ZV9tZW1vcnkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLAorCQkJCQlzaXplX3QgcGFnZV9jb3VudCwgdTMyIHR5cGUpCit7CisJaW50IHNjcmF0Y2hfcGFnZXM7CisJc3RydWN0IGFncF9tZW1vcnkgKm5ldzsKKwlzaXplX3QgaTsKKworCWlmICghYnJpZGdlKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgoYXRvbWljX3JlYWQoJmJyaWRnZS0+Y3VycmVudF9tZW1vcnlfYWdwKSArIHBhZ2VfY291bnQpID4gYnJpZGdlLT5tYXhfbWVtb3J5X2FncCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodHlwZSAhPSAwKSB7CisJCW5ldyA9IGJyaWRnZS0+ZHJpdmVyLT5hbGxvY19ieV90eXBlKHBhZ2VfY291bnQsIHR5cGUpOworCQlpZiAobmV3KQorCQkJbmV3LT5icmlkZ2UgPSBicmlkZ2U7CisJCXJldHVybiBuZXc7CisJfQorCisJc2NyYXRjaF9wYWdlcyA9IChwYWdlX2NvdW50ICsgRU5UUklFU19QRVJfUEFHRSAtIDEpIC8gRU5UUklFU19QRVJfUEFHRTsKKworCW5ldyA9IGFncF9jcmVhdGVfbWVtb3J5KHNjcmF0Y2hfcGFnZXMpOworCisJaWYgKG5ldyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspIHsKKwkJdm9pZCAqYWRkciA9IGJyaWRnZS0+ZHJpdmVyLT5hZ3BfYWxsb2NfcGFnZShicmlkZ2UpOworCisJCWlmIChhZGRyID09IE5VTEwpIHsKKwkJCWFncF9mcmVlX21lbW9yeShuZXcpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbmV3LT5tZW1vcnlbaV0gPSB2aXJ0X3RvX3BoeXMoYWRkcik7CisJCW5ldy0+cGFnZV9jb3VudCsrOworCX0KKyAgICAgICBuZXctPmJyaWRnZSA9IGJyaWRnZTsKKworCWZsdXNoX2FncF9tYXBwaW5ncygpOworCisJcmV0dXJuIG5ldzsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2FsbG9jYXRlX21lbW9yeSk7CisKKworLyogRW5kIC0gR2VuZXJpYyByb3V0aW5lcyBmb3IgaGFuZGxpbmcgYWdwX21lbW9yeSBzdHJ1Y3R1cmVzICovCisKKworc3RhdGljIGludCBhZ3BfcmV0dXJuX3NpemUodm9pZCkKK3sKKwlpbnQgY3VycmVudF9zaXplOworCXZvaWQgKnRlbXA7CisKKwl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOworCisJc3dpdGNoIChhZ3BfYnJpZGdlLT5kcml2ZXItPnNpemVfdHlwZSkgeworCWNhc2UgVThfQVBFUl9TSVpFOgorCQljdXJyZW50X3NpemUgPSBBX1NJWkVfOCh0ZW1wKS0+c2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBVMTZfQVBFUl9TSVpFOgorCQljdXJyZW50X3NpemUgPSBBX1NJWkVfMTYodGVtcCktPnNpemU7CisJCWJyZWFrOworCWNhc2UgVTMyX0FQRVJfU0laRToKKwkJY3VycmVudF9zaXplID0gQV9TSVpFXzMyKHRlbXApLT5zaXplOworCQlicmVhazsKKwljYXNlIExWTDJfQVBFUl9TSVpFOgorCQljdXJyZW50X3NpemUgPSBBX1NJWkVfTFZMMih0ZW1wKS0+c2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBGSVhFRF9BUEVSX1NJWkU6CisJCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV9GSVgodGVtcCktPnNpemU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWN1cnJlbnRfc2l6ZSA9IDA7CisJCWJyZWFrOworCX0KKworCWN1cnJlbnRfc2l6ZSAtPSAoYWdwX21lbW9yeV9yZXNlcnZlZCAvICgxMDI0KjEwMjQpKTsKKwlpZiAoY3VycmVudF9zaXplIDwwKQorCQljdXJyZW50X3NpemUgPSAwOworCXJldHVybiBjdXJyZW50X3NpemU7Cit9CisKKworaW50IGFncF9udW1fZW50cmllcyh2b2lkKQoreworCWludCBudW1fZW50cmllczsKKwl2b2lkICp0ZW1wOworCisJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKworCXN3aXRjaCAoYWdwX2JyaWRnZS0+ZHJpdmVyLT5zaXplX3R5cGUpIHsKKwljYXNlIFU4X0FQRVJfU0laRToKKwkJbnVtX2VudHJpZXMgPSBBX1NJWkVfOCh0ZW1wKS0+bnVtX2VudHJpZXM7CisJCWJyZWFrOworCWNhc2UgVTE2X0FQRVJfU0laRToKKwkJbnVtX2VudHJpZXMgPSBBX1NJWkVfMTYodGVtcCktPm51bV9lbnRyaWVzOworCQlicmVhazsKKwljYXNlIFUzMl9BUEVSX1NJWkU6CisJCW51bV9lbnRyaWVzID0gQV9TSVpFXzMyKHRlbXApLT5udW1fZW50cmllczsKKwkJYnJlYWs7CisJY2FzZSBMVkwyX0FQRVJfU0laRToKKwkJbnVtX2VudHJpZXMgPSBBX1NJWkVfTFZMMih0ZW1wKS0+bnVtX2VudHJpZXM7CisJCWJyZWFrOworCWNhc2UgRklYRURfQVBFUl9TSVpFOgorCQludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQludW1fZW50cmllcyA9IDA7CisJCWJyZWFrOworCX0KKworCW51bV9lbnRyaWVzIC09IGFncF9tZW1vcnlfcmVzZXJ2ZWQ+PlBBR0VfU0hJRlQ7CisJaWYgKG51bV9lbnRyaWVzPDApCisJCW51bV9lbnRyaWVzID0gMDsKKwlyZXR1cm4gbnVtX2VudHJpZXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhZ3BfbnVtX2VudHJpZXMpOworCisKK3N0YXRpYyBpbnQgY2hlY2tfYnJpZGdlX21vZGUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MzIgYWdwMzsKKwl1OCBjYXBfcHRyOworCisJY2FwX3B0ciA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0FHUCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgY2FwX3B0citBR1BTVEFULCAmYWdwMyk7CisJaWYgKGFncDMgJiBBR1BTVEFUX01PREVfM18wKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqCWFncF9jb3B5X2luZm8gIC0gIGNvcHkgYnJpZGdlIHN0YXRlIGluZm9ybWF0aW9uCisgKgorICoJQGluZm86CQlhZ3Bfa2Vybl9pbmZvIHBvaW50ZXIuICBUaGUgY2FsbGVyIHNob3VsZCBpbnN1cmUgdGhhdCB0aGlzIHBvaW50ZXIgaXMgdmFsaWQuIAorICoKKyAqCVRoaXMgZnVuY3Rpb24gY29waWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhZ3AgYnJpZGdlIGRldmljZSBhbmQgdGhlIHN0YXRlIG9mCisgKgl0aGUgYWdwIGJhY2tlbmQgaW50byBhbiBhZ3Bfa2Vybl9pbmZvIHBvaW50ZXIuCisgKi8KK2ludCBhZ3BfY29weV9pbmZvKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwgc3RydWN0IGFncF9rZXJuX2luZm8gKmluZm8pCit7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgYWdwX2tlcm5faW5mbykpOworCWlmICghYnJpZGdlKSB7CisJCWluZm8tPmNoaXBzZXQgPSBOT1RfU1VQUE9SVEVEOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpbmZvLT52ZXJzaW9uLm1ham9yID0gYnJpZGdlLT52ZXJzaW9uLT5tYWpvcjsKKwlpbmZvLT52ZXJzaW9uLm1pbm9yID0gYnJpZGdlLT52ZXJzaW9uLT5taW5vcjsKKwlpbmZvLT5jaGlwc2V0ID0gU1VQUE9SVEVEOworCWluZm8tPmRldmljZSA9IGJyaWRnZS0+ZGV2OworCWlmIChjaGVja19icmlkZ2VfbW9kZShicmlkZ2UtPmRldikpCisJCWluZm8tPm1vZGUgPSBicmlkZ2UtPm1vZGUgJiB+QUdQM19SRVNFUlZFRF9NQVNLOworCWVsc2UKKwkJaW5mby0+bW9kZSA9IGJyaWRnZS0+bW9kZSAmIH5BR1AyX1JFU0VSVkVEX01BU0s7CisJaW5mby0+bW9kZSA9IGJyaWRnZS0+bW9kZTsKKwlpbmZvLT5hcGVyX2Jhc2UgPSBicmlkZ2UtPmdhcnRfYnVzX2FkZHI7CisJaW5mby0+YXBlcl9zaXplID0gYWdwX3JldHVybl9zaXplKCk7CisJaW5mby0+bWF4X21lbW9yeSA9IGJyaWRnZS0+bWF4X21lbW9yeV9hZ3A7CisJaW5mby0+Y3VycmVudF9tZW1vcnkgPSBhdG9taWNfcmVhZCgmYnJpZGdlLT5jdXJyZW50X21lbW9yeV9hZ3ApOworCWluZm8tPmNhbnRfdXNlX2FwZXJ0dXJlID0gYnJpZGdlLT5kcml2ZXItPmNhbnRfdXNlX2FwZXJ0dXJlOworCWluZm8tPnZtX29wcyA9IGJyaWRnZS0+dm1fb3BzOworCWluZm8tPnBhZ2VfbWFzayA9IH4wVUw7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9jb3B5X2luZm8pOworCisvKiBFbmQgLSBSb3V0aW5lIHRvIGNvcHkgb3ZlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKi8KKworLyoKKyAqIFJvdXRpbmVzIGZvciBoYW5kbGluZyBzd2FwcGluZyBvZiBhZ3BfbWVtb3J5IGludG8gdGhlIEdBVFQgLQorICogVGhlc2Ugcm91dGluZXMgdGFrZSBhZ3BfbWVtb3J5IGFuZCBpbnNlcnQgdGhlbSBpbnRvIHRoZSBHQVRULgorICogVGhleSBjYWxsIGRldmljZSBzcGVjaWZpYyByb3V0aW5lcyB0byBhY3R1YWxseSB3cml0ZSB0byB0aGUgR0FUVC4KKyAqLworCisvKioKKyAqCWFncF9iaW5kX21lbW9yeSAgLSAgQmluZCBhbiBhZ3BfbWVtb3J5IHN0cnVjdHVyZSBpbnRvIHRoZSBHQVRULgorICoKKyAqCUBjdXJyOgkJYWdwX21lbW9yeSBwb2ludGVyCisgKglAcGdfc3RhcnQ6CWFuIG9mZnNldCBpbnRvIHRoZSBncmFwaGljcyBhcGVydHVyZSB0cmFuc2xhdGlvbiB0YWJsZQorICoKKyAqCUl0IHJldHVybnMgLUVJTlZBTCBpZiB0aGUgcG9pbnRlciA9PSBOVUxMLgorICoJSXQgcmV0dXJucyAtRUJVU1kgaWYgdGhlIGFyZWEgb2YgdGhlIHRhYmxlIHJlcXVlc3RlZCBpcyBhbHJlYWR5IGluIHVzZS4KKyAqLworaW50IGFncF9iaW5kX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqY3Vyciwgb2ZmX3QgcGdfc3RhcnQpCit7CisJaW50IHJldF92YWw7CisKKwlpZiAoY3VyciA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjdXJyLT5pc19ib3VuZCA9PSBUUlVFKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAibWVtb3J5ICVwIGlzIGFscmVhZHkgYm91bmQhXG4iLCBjdXJyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjdXJyLT5pc19mbHVzaGVkID09IEZBTFNFKSB7CisJCWN1cnItPmJyaWRnZS0+ZHJpdmVyLT5jYWNoZV9mbHVzaCgpOworCQljdXJyLT5pc19mbHVzaGVkID0gVFJVRTsKKwl9CisJcmV0X3ZhbCA9IGN1cnItPmJyaWRnZS0+ZHJpdmVyLT5pbnNlcnRfbWVtb3J5KGN1cnIsIHBnX3N0YXJ0LCBjdXJyLT50eXBlKTsKKworCWlmIChyZXRfdmFsICE9IDApCisJCXJldHVybiByZXRfdmFsOworCisJY3Vyci0+aXNfYm91bmQgPSBUUlVFOworCWN1cnItPnBnX3N0YXJ0ID0gcGdfc3RhcnQ7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9iaW5kX21lbW9yeSk7CisKKworLyoqCisgKglhZ3BfdW5iaW5kX21lbW9yeSAgLSAgUmVtb3ZlcyBhbiBhZ3BfbWVtb3J5IHN0cnVjdHVyZSBmcm9tIHRoZSBHQVRUCisgKgorICogQGN1cnI6CWFncF9tZW1vcnkgcG9pbnRlciB0byBiZSByZW1vdmVkIGZyb20gdGhlIEdBVFQuCisgKgorICogSXQgcmV0dXJucyAtRUlOVkFMIGlmIHRoaXMgcGllY2Ugb2YgYWdwX21lbW9yeSBpcyBub3QgY3VycmVudGx5IGJvdW5kIHRvCisgKiB0aGUgZ3JhcGhpY3MgYXBlcnR1cmUgdHJhbnNsYXRpb24gdGFibGUgb3IgaWYgdGhlIGFncF9tZW1vcnkgcG9pbnRlciA9PSBOVUxMCisgKi8KK2ludCBhZ3BfdW5iaW5kX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqY3VycikKK3sKKwlpbnQgcmV0X3ZhbDsKKworCWlmIChjdXJyID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGN1cnItPmlzX2JvdW5kICE9IFRSVUUpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJtZW1vcnkgJXAgd2FzIG5vdCBib3VuZCFcbiIsIGN1cnIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXRfdmFsID0gY3Vyci0+YnJpZGdlLT5kcml2ZXItPnJlbW92ZV9tZW1vcnkoY3VyciwgY3Vyci0+cGdfc3RhcnQsIGN1cnItPnR5cGUpOworCisJaWYgKHJldF92YWwgIT0gMCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwljdXJyLT5pc19ib3VuZCA9IEZBTFNFOworCWN1cnItPnBnX3N0YXJ0ID0gMDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWdwX3VuYmluZF9tZW1vcnkpOworCisvKiBFbmQgLSBSb3V0aW5lcyBmb3IgaGFuZGxpbmcgc3dhcHBpbmcgb2YgYWdwX21lbW9yeSBpbnRvIHRoZSBHQVRUICovCisKKworLyogR2VuZXJpYyBBZ3Agcm91dGluZXMgLSBTdGFydCAqLworc3RhdGljIHZvaWQgYWdwX3YyX3BhcnNlX29uZSh1MzIgKnJlcXVlc3RlZF9tb2RlLCB1MzIgKmJyaWRnZV9hZ3BzdGF0LCB1MzIgKnZnYV9hZ3BzdGF0KQoreworCXUzMiB0bXA7CisKKwlpZiAoKnJlcXVlc3RlZF9tb2RlICYgQUdQMl9SRVNFUlZFRF9NQVNLKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAicmVzZXJ2ZWQgYml0cyBzZXQgaW4gbW9kZSAweCV4LiBGaXhlZC5cbiIsICpyZXF1ZXN0ZWRfbW9kZSk7CisJCSpyZXF1ZXN0ZWRfbW9kZSAmPSB+QUdQMl9SRVNFUlZFRF9NQVNLOworCX0KKworCS8qIENoZWNrIHRoZSBzcGVlZCBiaXRzIG1ha2Ugc2Vuc2UuIE9ubHkgb25lIHNob3VsZCBiZSBzZXQuICovCisJdG1wID0gKnJlcXVlc3RlZF9tb2RlICYgNzsKKwlzd2l0Y2ggKHRtcCkgeworCQljYXNlIDA6CisJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIiVzIHRyaWVkIHRvIHNldCByYXRlPXgwLiBTZXR0aW5nIHRvIHgxIG1vZGUuXG4iLCBjdXJyZW50LT5jb21tKTsKKwkJCSpyZXF1ZXN0ZWRfbW9kZSB8PSBBR1BTVEFUMl8xWDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQkqcmVxdWVzdGVkX21vZGUgJj0gfihBR1BTVEFUMl8xWCk7CS8qIHJhdGU9MiAqLworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCWNhc2UgNjoKKwkJY2FzZSA3OgorCQkJKnJlcXVlc3RlZF9tb2RlICY9IH4oQUdQU1RBVDJfMVh8QUdQU1RBVDJfMlgpOyAvKiByYXRlPTQqLworCQkJYnJlYWs7CisJfQorCisJLyogZGlzYWJsZSBTQkEgaWYgaXQncyBub3Qgc3VwcG9ydGVkICovCisJaWYgKCEoKCpicmlkZ2VfYWdwc3RhdCAmIEFHUFNUQVRfU0JBKSAmJiAoKnZnYV9hZ3BzdGF0ICYgQUdQU1RBVF9TQkEpICYmICgqcmVxdWVzdGVkX21vZGUgJiBBR1BTVEFUX1NCQSkpKQorCQkqYnJpZGdlX2FncHN0YXQgJj0gfkFHUFNUQVRfU0JBOworCisJLyogU2V0IHJhdGUgKi8KKwlpZiAoISgoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDJfNFgpICYmICgqdmdhX2FncHN0YXQgJiBBR1BTVEFUMl80WCkgJiYgKCpyZXF1ZXN0ZWRfbW9kZSAmIEFHUFNUQVQyXzRYKSkpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+QUdQU1RBVDJfNFg7CisKKwlpZiAoISgoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDJfMlgpICYmICgqdmdhX2FncHN0YXQgJiBBR1BTVEFUMl8yWCkgJiYgKCpyZXF1ZXN0ZWRfbW9kZSAmIEFHUFNUQVQyXzJYKSkpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+QUdQU1RBVDJfMlg7CisKKwlpZiAoISgoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDJfMVgpICYmICgqdmdhX2FncHN0YXQgJiBBR1BTVEFUMl8xWCkgJiYgKCpyZXF1ZXN0ZWRfbW9kZSAmIEFHUFNUQVQyXzFYKSkpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+QUdQU1RBVDJfMVg7CisKKwkvKiBOb3cgd2Uga25vdyB3aGF0IG1vZGUgaXQgc2hvdWxkIGJlLCBjbGVhciBvdXQgdGhlIHVud2FudGVkIGJpdHMuICovCisJaWYgKCpicmlkZ2VfYWdwc3RhdCAmIEFHUFNUQVQyXzRYKQorCQkqYnJpZGdlX2FncHN0YXQgJj0gfihBR1BTVEFUMl8xWCB8IEFHUFNUQVQyXzJYKTsJLyogNFggKi8KKworCWlmICgqYnJpZGdlX2FncHN0YXQgJiBBR1BTVEFUMl8yWCkKKwkJKmJyaWRnZV9hZ3BzdGF0ICY9IH4oQUdQU1RBVDJfMVggfCBBR1BTVEFUMl80WCk7CS8qIDJYICovCisKKwlpZiAoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDJfMVgpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+KEFHUFNUQVQyXzJYIHwgQUdQU1RBVDJfNFgpOwkvKiAxWCAqLworCisJLyogQXBwbHkgYW55IGVycmF0YS4gKi8KKwlpZiAoYWdwX2JyaWRnZS0+ZmxhZ3MgJiBBR1BfRVJSQVRBX0ZBU1RXUklURVMpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+QUdQU1RBVF9GVzsKKworCWlmIChhZ3BfYnJpZGdlLT5mbGFncyAmIEFHUF9FUlJBVEFfU0JBKQorCQkqYnJpZGdlX2FncHN0YXQgJj0gfkFHUFNUQVRfU0JBOworCisJaWYgKGFncF9icmlkZ2UtPmZsYWdzICYgQUdQX0VSUkFUQV8xWCkgeworCQkqYnJpZGdlX2FncHN0YXQgJj0gfihBR1BTVEFUMl8yWCB8IEFHUFNUQVQyXzRYKTsKKwkJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVQyXzFYOworCX0KKworCS8qIElmIHdlJ3ZlIGRyb3BwZWQgZG93biB0byAxWCwgZGlzYWJsZSBmYXN0IHdyaXRlcy4gKi8KKwlpZiAoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDJfMVgpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+QUdQU1RBVF9GVzsKK30KKworLyoKKyAqIHJlcXVlc3RlZF9tb2RlID0gTW9kZSByZXF1ZXN0ZWQgYnkgKHR5cGljYWxseSkgWC4KKyAqIGJyaWRnZV9hZ3BzdGF0ID0gUENJX0FHUF9TVEFUVVMgZnJvbSBhZ3AgYnJpZGdlLgorICogdmdhX2FncHN0YXQgPSBQQ0lfQUdQX1NUQVRVUyBmcm9tIGdyYXBoaWMgY2FyZC4KKyAqLworc3RhdGljIHZvaWQgYWdwX3YzX3BhcnNlX29uZSh1MzIgKnJlcXVlc3RlZF9tb2RlLCB1MzIgKmJyaWRnZV9hZ3BzdGF0LCB1MzIgKnZnYV9hZ3BzdGF0KQoreworCXUzMiBvcmlnYnJpZGdlPSpicmlkZ2VfYWdwc3RhdCwgb3JpZ3ZnYT0qdmdhX2FncHN0YXQ7CisJdTMyIHRtcDsKKworCWlmICgqcmVxdWVzdGVkX21vZGUgJiBBR1AzX1JFU0VSVkVEX01BU0spIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJyZXNlcnZlZCBiaXRzIHNldCBpbiBtb2RlIDB4JXguIEZpeGVkLlxuIiwgKnJlcXVlc3RlZF9tb2RlKTsKKwkJKnJlcXVlc3RlZF9tb2RlICY9IH5BR1AzX1JFU0VSVkVEX01BU0s7CisJfQorCisJLyogQ2hlY2sgdGhlIHNwZWVkIGJpdHMgbWFrZSBzZW5zZS4gKi8KKwl0bXAgPSAqcmVxdWVzdGVkX21vZGUgJiA3OworCWlmICh0bXAgPT0gMCkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIiVzIHRyaWVkIHRvIHNldCByYXRlPXgwLiBTZXR0aW5nIHRvIEFHUDMgeDQgbW9kZS5cbiIsIGN1cnJlbnQtPmNvbW0pOworCQkqcmVxdWVzdGVkX21vZGUgfD0gQUdQU1RBVDNfNFg7CisJfQorCWlmICh0bXAgPj0gMykgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIiVzIHRyaWVkIHRvIHNldCByYXRlPXglZC4gU2V0dGluZyB0byBBR1AzIHg4IG1vZGUuXG4iLCBjdXJyZW50LT5jb21tLCB0bXAgKiA0KTsKKwkJKnJlcXVlc3RlZF9tb2RlID0gKCpyZXF1ZXN0ZWRfbW9kZSAmIH43KSB8IEFHUFNUQVQzXzhYOworCX0KKworCS8qIEFSUVNaIC0gU2V0IHRoZSB2YWx1ZSB0byB0aGUgbWF4aW11bSBvbmUuCisJICogRG9uJ3QgYWxsb3cgdGhlIG1vZGUgcmVnaXN0ZXIgdG8gb3ZlcnJpZGUgdmFsdWVzLiAqLworCSpicmlkZ2VfYWdwc3RhdCA9ICgoKmJyaWRnZV9hZ3BzdGF0ICYgfkFHUFNUQVRfQVJRU1opIHwKKwkJbWF4X3QodTMyLCgqYnJpZGdlX2FncHN0YXQgJiBBR1BTVEFUX0FSUVNaKSwoKnZnYV9hZ3BzdGF0ICYgQUdQU1RBVF9BUlFTWikpKTsKKworCS8qIENhbGlicmF0aW9uIGN5Y2xlLgorCSAqIERvbid0IGFsbG93IHRoZSBtb2RlIHJlZ2lzdGVyIHRvIG92ZXJyaWRlIHZhbHVlcy4gKi8KKwkqYnJpZGdlX2FncHN0YXQgPSAoKCpicmlkZ2VfYWdwc3RhdCAmIH5BR1BTVEFUX0NBTF9NQVNLKSB8CisJCW1pbl90KHUzMiwoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVF9DQUxfTUFTSyksKCp2Z2FfYWdwc3RhdCAmIEFHUFNUQVRfQ0FMX01BU0spKSk7CisKKwkvKiBTQkEgKm11c3QqIGJlIHN1cHBvcnRlZCBmb3IgQUdQIHYzICovCisJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVRfU0JBOworCisJLyoKKwkgKiBTZXQgc3BlZWQuCisJICogQ2hlY2sgZm9yIGludmFsaWQgc3BlZWRzLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhcHBsaWNhdGlvbnMKKwkgKiB3cml0dGVuIGJlZm9yZSB0aGUgQUdQIDMuMCBzdGFuZGFyZCBwYXNzIEFHUDIueCBtb2RlcyB0byBBR1AzIGhhcmR3YXJlCisJICovCisJaWYgKCpyZXF1ZXN0ZWRfbW9kZSAmIEFHUFNUQVRfTU9ERV8zXzApIHsKKwkJLyoKKwkJICogQ2FsbGVyIGhhc24ndCBhIGNsdWUgd2hhdCBpdCBpcyBkb2luZy4gQnJpZGdlIGlzIGluIDMuMCBtb2RlLAorCQkgKiBoYXZlIGJlZW4gcGFzc2VkIGEgMy4wIG1vZGUsIGJ1dCB3aXRoIDIueCBzcGVlZCBiaXRzIHNldC4KKwkJICogQUdQMi54IDR4IC0+IEFHUDMuMCA0eC4KKwkJICovCisJCWlmICgqcmVxdWVzdGVkX21vZGUgJiBBR1BTVEFUMl80WCkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICIlcyBwYXNzZXMgYnJva2VuIEFHUDMgZmxhZ3MgKCV4KS4gRml4ZWQuXG4iLAorCQkJCQkJY3VycmVudC0+Y29tbSwgKnJlcXVlc3RlZF9tb2RlKTsKKwkJCSpyZXF1ZXN0ZWRfbW9kZSAmPSB+QUdQU1RBVDJfNFg7CisJCQkqcmVxdWVzdGVkX21vZGUgfD0gQUdQU1RBVDNfNFg7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgY2FsbGVyIGRvZXNuJ3Qga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nLiBXZSBhcmUgaW4gMy4wIG1vZGUsCisJCSAqIGJ1dCBoYXZlIGJlZW4gcGFzc2VkIGFuIEFHUCAyLnggbW9kZS4KKwkJICogQ29udmVydCBBR1AgMXgsMngsNHggLT4gQUdQIDMuMCA0eC4KKwkJICovCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiJXMgcGFzc2VzIGJyb2tlbiBBR1AyIGZsYWdzICgleCkgaW4gQUdQMyBtb2RlLiBGaXhlZC5cbiIsCisJCQkJCWN1cnJlbnQtPmNvbW0sICpyZXF1ZXN0ZWRfbW9kZSk7CisJCSpyZXF1ZXN0ZWRfbW9kZSAmPSB+KEFHUFNUQVQyXzRYIHwgQUdQU1RBVDJfMlggfCBBR1BTVEFUMl8xWCk7CisJCSpyZXF1ZXN0ZWRfbW9kZSB8PSBBR1BTVEFUM180WDsKKwl9CisKKwlpZiAoKnJlcXVlc3RlZF9tb2RlICYgQUdQU1RBVDNfOFgpIHsKKwkJaWYgKCEoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDNfOFgpKSB7CisJCQkqYnJpZGdlX2FncHN0YXQgJj0gfihBR1BTVEFUM184WCB8IEFHUFNUQVQzX1JTVkQpOworCQkJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVQzXzRYOworCQkJcHJpbnRrICgiJXMgcmVxdWVzdGVkIEFHUHg4IGJ1dCBicmlkZ2Ugbm90IGNhcGFibGUuXG4iLCBjdXJyZW50LT5jb21tKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoISgqdmdhX2FncHN0YXQgJiBBR1BTVEFUM184WCkpIHsKKwkJCSpicmlkZ2VfYWdwc3RhdCAmPSB+KEFHUFNUQVQzXzhYIHwgQUdQU1RBVDNfUlNWRCk7CisJCQkqYnJpZGdlX2FncHN0YXQgfD0gQUdQU1RBVDNfNFg7CisJCQlwcmludGsgKCIlcyByZXF1ZXN0ZWQgQUdQeDggYnV0IGdyYXBoaWMgY2FyZCBub3QgY2FwYWJsZS5cbiIsIGN1cnJlbnQtPmNvbW0pOworCQkJcmV0dXJuOworCQl9CisJCS8qIEFsbCBzZXQsIGJyaWRnZSAmIGRldmljZSBjYW4gZG8gQUdQIHg4Ki8KKwkJKmJyaWRnZV9hZ3BzdGF0ICY9IH4oQUdQU1RBVDNfNFggfCBBR1BTVEFUM19SU1ZEKTsKKwkJZ290byBkb25lOworCisJfSBlbHNlIHsKKworCQkvKgorCQkgKiBJZiB3ZSBkaWRuJ3Qgc3BlY2lmeSBBR1B4OCwgd2UgY2FuIG9ubHkgZG8geDQuCisJCSAqIElmIHRoZSBoYXJkd2FyZSBjYW4ndCBkbyB4NCwgd2UncmUgdXAgc2hpdCBjcmVlaywgYW5kIG5ldmVyCisJCSAqICBzaG91bGQgaGF2ZSBnb3QgdGhpcyBmYXIuCisJCSAqLworCQkqYnJpZGdlX2FncHN0YXQgJj0gfihBR1BTVEFUM184WCB8IEFHUFNUQVQzX1JTVkQpOworCQlpZiAoKCpicmlkZ2VfYWdwc3RhdCAmIEFHUFNUQVQzXzRYKSAmJiAoKnZnYV9hZ3BzdGF0ICYgQUdQU1RBVDNfNFgpKQorCQkJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVQzXzRYOworCQllbHNlIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQmFkbmVzcy4gRG9uJ3Qga25vdyB3aGljaCBBR1AgbW9kZSB0byBzZXQuICIKKwkJCQkJCQkiW2JyaWRnZV9hZ3BzdGF0OiV4IHZnYV9hZ3BzdGF0OiV4IGZlbGwgYmFjayB0bzotIGJyaWRnZV9hZ3BzdGF0OiV4IHZnYV9hZ3BzdGF0OiV4XVxuIiwKKwkJCQkJCQlvcmlnYnJpZGdlLCBvcmlndmdhLCAqYnJpZGdlX2FncHN0YXQsICp2Z2FfYWdwc3RhdCk7CisJCQlpZiAoISgqYnJpZGdlX2FncHN0YXQgJiBBR1BTVEFUM180WCkpCisJCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJCcmlkZ2UgY291bGRuJ3QgZG8gQUdQIHg0LlxuIik7CisJCQlpZiAoISgqdmdhX2FncHN0YXQgJiBBR1BTVEFUM180WCkpCisJCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJHcmFwaGljIGNhcmQgY291bGRuJ3QgZG8gQUdQIHg0LlxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKK2RvbmU6CisJLyogQXBwbHkgYW55IGVycmF0YS4gKi8KKwlpZiAoYWdwX2JyaWRnZS0+ZmxhZ3MgJiBBR1BfRVJSQVRBX0ZBU1RXUklURVMpCisJCSpicmlkZ2VfYWdwc3RhdCAmPSB+QUdQU1RBVF9GVzsKKworCWlmIChhZ3BfYnJpZGdlLT5mbGFncyAmIEFHUF9FUlJBVEFfU0JBKQorCQkqYnJpZGdlX2FncHN0YXQgJj0gfkFHUFNUQVRfU0JBOworCisJaWYgKGFncF9icmlkZ2UtPmZsYWdzICYgQUdQX0VSUkFUQV8xWCkgeworCQkqYnJpZGdlX2FncHN0YXQgJj0gfihBR1BTVEFUMl8yWCB8IEFHUFNUQVQyXzRYKTsKKwkJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVQyXzFYOworCX0KK30KKworCisvKioKKyAqIGFncF9jb2xsZWN0X2RldmljZV9zdGF0dXMgLSBkZXRlcm1pbmUgY29ycmVjdCBhZ3BfY21kIGZyb20gdmFyaW91cyBhZ3Bfc3RhdCdzCisgKiBAYnJpZGdlOiBhbiBhZ3BfYnJpZGdlX2RhdGEgc3RydWN0IGFsbG9jYXRlZCBmb3IgdGhlIEFHUCBob3N0IGJyaWRnZS4KKyAqIEByZXF1ZXN0ZWRfbW9kZTogcmVxdWVzdGVkIGFncF9zdGF0IGZyb20gdXNlcnNwYWNlIChUeXBpY2FsbHkgZnJvbSBYKQorICogQGJyaWRnZV9hZ3BzdGF0OiBjdXJyZW50IGFncF9zdGF0IGZyb20gQUdQIGJyaWRnZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaHVudCBmb3IgYW4gQUdQIGdyYXBoaWNzIGNhcmQsIGFuZCB0cnkgdG8gbWF0Y2gKKyAqIHRoZSByZXF1ZXN0ZWQgbW9kZSB0byB0aGUgY2FwYWJpbGl0aWVzIG9mIGJvdGggdGhlIGJyaWRnZSBhbmQgdGhlIGNhcmQuCisgKi8KK3UzMiBhZ3BfY29sbGVjdF9kZXZpY2Vfc3RhdHVzKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwgdTMyIHJlcXVlc3RlZF9tb2RlLCB1MzIgYnJpZGdlX2FncHN0YXQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldmljZSA9IE5VTEw7CisJdTMyIHZnYV9hZ3BzdGF0OworCXU4IGNhcF9wdHI7CisKKwlmb3IgKDs7KSB7CisJCWRldmljZSA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIGRldmljZSk7CisJCWlmICghZGV2aWNlKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkNvdWxkbid0IGZpbmQgYW4gQUdQIFZHQSBjb250cm9sbGVyLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXBfcHRyID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXZpY2UsIFBDSV9DQVBfSURfQUdQKTsKKwkJaWYgKGNhcF9wdHIpCisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqIE9rLCBoZXJlIHdlIGhhdmUgYSBBR1AgZGV2aWNlLiBEaXNhYmxlIGltcG9zc2libGUKKwkgKiBzZXR0aW5ncywgYW5kIGFkanVzdCB0aGUgcmVhZHF1ZXVlIHRvIHRoZSBtaW5pbXVtLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXZpY2UsIGNhcF9wdHIrUENJX0FHUF9TVEFUVVMsICZ2Z2FfYWdwc3RhdCk7CisKKwkvKiBhZGp1c3QgUlEgZGVwdGggKi8KKwlicmlkZ2VfYWdwc3RhdCA9ICgoYnJpZGdlX2FncHN0YXQgJiB+QUdQU1RBVF9SUV9ERVBUSCkgfAorCSAgICAgbWluX3QodTMyLCAocmVxdWVzdGVkX21vZGUgJiBBR1BTVEFUX1JRX0RFUFRIKSwKKwkJIG1pbl90KHUzMiwgKGJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVF9SUV9ERVBUSCksICh2Z2FfYWdwc3RhdCAmIEFHUFNUQVRfUlFfREVQVEgpKSkpOworCisJLyogZGlzYWJsZSBGVyBpZiBpdCdzIG5vdCBzdXBwb3J0ZWQgKi8KKwlpZiAoISgoYnJpZGdlX2FncHN0YXQgJiBBR1BTVEFUX0ZXKSAmJgorCQkgKHZnYV9hZ3BzdGF0ICYgQUdQU1RBVF9GVykgJiYKKwkJIChyZXF1ZXN0ZWRfbW9kZSAmIEFHUFNUQVRfRlcpKSkKKwkJYnJpZGdlX2FncHN0YXQgJj0gfkFHUFNUQVRfRlc7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIG9wZXJhdGluZyBpbiAzLjAgbW9kZSAqLworCWlmIChjaGVja19icmlkZ2VfbW9kZShhZ3BfYnJpZGdlLT5kZXYpKQorCQlhZ3BfdjNfcGFyc2Vfb25lKCZyZXF1ZXN0ZWRfbW9kZSwgJmJyaWRnZV9hZ3BzdGF0LCAmdmdhX2FncHN0YXQpOworCWVsc2UKKwkJYWdwX3YyX3BhcnNlX29uZSgmcmVxdWVzdGVkX21vZGUsICZicmlkZ2VfYWdwc3RhdCwgJnZnYV9hZ3BzdGF0KTsKKworCXBjaV9kZXZfcHV0KGRldmljZSk7CisJcmV0dXJuIGJyaWRnZV9hZ3BzdGF0OworfQorRVhQT1JUX1NZTUJPTChhZ3BfY29sbGVjdF9kZXZpY2Vfc3RhdHVzKTsKKworCit2b2lkIGFncF9kZXZpY2VfY29tbWFuZCh1MzIgYnJpZGdlX2FncHN0YXQsIGludCBhZ3BfdjMpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldmljZSA9IE5VTEw7CisJaW50IG1vZGU7CisKKwltb2RlID0gYnJpZGdlX2FncHN0YXQgJiAweDc7CisJaWYgKGFncF92MykKKwkJbW9kZSAqPSA0OworCisJZm9yX2VhY2hfcGNpX2RldihkZXZpY2UpIHsKKwkJdTggYWdwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXZpY2UsIFBDSV9DQVBfSURfQUdQKTsKKwkJaWYgKCFhZ3ApCisJCQljb250aW51ZTsKKworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUHV0dGluZyBBR1AgViVkIGRldmljZSBhdCAlcyBpbnRvICVkeCBtb2RlXG4iLAorCQkJCWFncF92MyA/IDMgOiAyLCBwY2lfbmFtZShkZXZpY2UpLCBtb2RlKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXZpY2UsIGFncCArIFBDSV9BR1BfQ09NTUFORCwgYnJpZGdlX2FncHN0YXQpOworCX0KK30KK0VYUE9SVF9TWU1CT0woYWdwX2RldmljZV9jb21tYW5kKTsKKworCit2b2lkIGdldF9hZ3BfdmVyc2lvbihzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJdTMyIG5jYXBpZDsKKworCS8qIEV4aXQgZWFybHkgaWYgYWxyZWFkeSBzZXQgYnkgZXJyYXRhIHdvcmthcm91bmRzLiAqLworCWlmIChicmlkZ2UtPm1ham9yX3ZlcnNpb24gIT0gMCkKKwkJcmV0dXJuOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyaWRnZS0+ZGV2LCBicmlkZ2UtPmNhcG5keCwgJm5jYXBpZCk7CisJYnJpZGdlLT5tYWpvcl92ZXJzaW9uID0gKG5jYXBpZCA+PiBBR1BfTUFKT1JfVkVSU0lPTl9TSElGVCkgJiAweGY7CisJYnJpZGdlLT5taW5vcl92ZXJzaW9uID0gKG5jYXBpZCA+PiBBR1BfTUlOT1JfVkVSU0lPTl9TSElGVCkgJiAweGY7Cit9CitFWFBPUlRfU1lNQk9MKGdldF9hZ3BfdmVyc2lvbik7CisKKwordm9pZCBhZ3BfZ2VuZXJpY19lbmFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCB1MzIgcmVxdWVzdGVkX21vZGUpCit7CisJdTMyIGJyaWRnZV9hZ3BzdGF0LCB0ZW1wOworCisJZ2V0X2FncF92ZXJzaW9uKGFncF9icmlkZ2UpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkZvdW5kIGFuIEFHUCAlZC4lZCBjb21wbGlhbnQgZGV2aWNlIGF0ICVzLlxuIiwKKwkJCQlhZ3BfYnJpZGdlLT5tYWpvcl92ZXJzaW9uLAorCQkJCWFncF9icmlkZ2UtPm1pbm9yX3ZlcnNpb24sCisJCQkJcGNpX25hbWUoYWdwX2JyaWRnZS0+ZGV2KSk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LAorCQkgICAgICBhZ3BfYnJpZGdlLT5jYXBuZHggKyBQQ0lfQUdQX1NUQVRVUywgJmJyaWRnZV9hZ3BzdGF0KTsKKworCWJyaWRnZV9hZ3BzdGF0ID0gYWdwX2NvbGxlY3RfZGV2aWNlX3N0YXR1cyhhZ3BfYnJpZGdlLCByZXF1ZXN0ZWRfbW9kZSwgYnJpZGdlX2FncHN0YXQpOworCWlmIChicmlkZ2VfYWdwc3RhdCA9PSAwKQorCQkvKiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLiBGSVhNRTogUmV0dXJuIGVycm9yIGNvZGU/ICovCisJCXJldHVybjsKKworCWJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVRfQUdQX0VOQUJMRTsKKworCS8qIERvIEFHUCB2ZXJzaW9uIHNwZWNpZmljIGZyb2JiaW5nLiAqLworCWlmIChicmlkZ2UtPm1ham9yX3ZlcnNpb24gPj0gMykgeworCQlpZiAoY2hlY2tfYnJpZGdlX21vZGUoYnJpZGdlLT5kZXYpKSB7CisJCQkvKiBJZiB3ZSBoYXZlIDMuNSwgd2UgY2FuIGRvIHRoZSBpc29jaCBzdHVmZi4gKi8KKwkJCWlmIChicmlkZ2UtPm1pbm9yX3ZlcnNpb24gPj0gNSkKKwkJCQlhZ3BfM181X2VuYWJsZShicmlkZ2UpOworCQkJYWdwX2RldmljZV9jb21tYW5kKGJyaWRnZV9hZ3BzdGF0LCBUUlVFKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJICAgIC8qIERpc2FibGUgY2FsaWJyYXRpb24gY3ljbGUgaW4gUlg5MTwxPiB3aGVuIG5vdCBpbiBBR1AzLjAgbW9kZSBvZiBvcGVyYXRpb24uKi8KKwkJICAgIGJyaWRnZV9hZ3BzdGF0ICY9IH4oNzw8MTApIDsKKwkJICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChicmlkZ2UtPmRldiwKKwkJCQkJYnJpZGdlLT5jYXBuZHgrQUdQQ1RSTCwgJnRlbXApOworCQkgICAgdGVtcCB8PSAoMTw8OSk7CisJCSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZS0+ZGV2LAorCQkJCQlicmlkZ2UtPmNhcG5keCtBR1BDVFJMLCB0ZW1wKTsKKworCQkgICAgcHJpbnRrIChLRVJOX0lORk8gUEZYICJEZXZpY2UgaXMgaW4gbGVnYWN5IG1vZGUsIgorCQkJCSIgZmFsbGluZyBiYWNrIHRvIDIueFxuIik7CisJCX0KKwl9CisKKwkvKiBBR1AgdjwzICovCisJYWdwX2RldmljZV9jb21tYW5kKGJyaWRnZV9hZ3BzdGF0LCBGQUxTRSk7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9nZW5lcmljX2VuYWJsZSk7CisKKworaW50IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwljaGFyICp0YWJsZTsKKwljaGFyICp0YWJsZV9lbmQ7CisJaW50IHNpemU7CisJaW50IHBhZ2Vfb3JkZXI7CisJaW50IG51bV9lbnRyaWVzOworCWludCBpOworCXZvaWQgKnRlbXA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkvKiBUaGUgZ2VuZXJpYyByb3V0aW5lcyBjYW4ndCBoYW5kbGUgMiBsZXZlbCBnYXR0J3MgKi8KKwlpZiAoYnJpZGdlLT5kcml2ZXItPnNpemVfdHlwZSA9PSBMVkwyX0FQRVJfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0YWJsZSA9IE5VTEw7CisJaSA9IGJyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHg7CisJdGVtcCA9IGJyaWRnZS0+Y3VycmVudF9zaXplOworCXNpemUgPSBwYWdlX29yZGVyID0gbnVtX2VudHJpZXMgPSAwOworCisJaWYgKGJyaWRnZS0+ZHJpdmVyLT5zaXplX3R5cGUgIT0gRklYRURfQVBFUl9TSVpFKSB7CisJCWRvIHsKKwkJCXN3aXRjaCAoYnJpZGdlLT5kcml2ZXItPnNpemVfdHlwZSkgeworCQkJY2FzZSBVOF9BUEVSX1NJWkU6CisJCQkJc2l6ZSA9IEFfU0laRV84KHRlbXApLT5zaXplOworCQkJCXBhZ2Vfb3JkZXIgPQorCQkJCSAgICBBX1NJWkVfOCh0ZW1wKS0+cGFnZV9vcmRlcjsKKwkJCQludW1fZW50cmllcyA9CisJCQkJICAgIEFfU0laRV84KHRlbXApLT5udW1fZW50cmllczsKKwkJCQlicmVhazsKKwkJCWNhc2UgVTE2X0FQRVJfU0laRToKKwkJCQlzaXplID0gQV9TSVpFXzE2KHRlbXApLT5zaXplOworCQkJCXBhZ2Vfb3JkZXIgPSBBX1NJWkVfMTYodGVtcCktPnBhZ2Vfb3JkZXI7CisJCQkJbnVtX2VudHJpZXMgPSBBX1NJWkVfMTYodGVtcCktPm51bV9lbnRyaWVzOworCQkJCWJyZWFrOworCQkJY2FzZSBVMzJfQVBFUl9TSVpFOgorCQkJCXNpemUgPSBBX1NJWkVfMzIodGVtcCktPnNpemU7CisJCQkJcGFnZV9vcmRlciA9IEFfU0laRV8zMih0ZW1wKS0+cGFnZV9vcmRlcjsKKwkJCQludW1fZW50cmllcyA9IEFfU0laRV8zMih0ZW1wKS0+bnVtX2VudHJpZXM7CisJCQkJYnJlYWs7CisJCQkJLyogVGhpcyBjYXNlIHdpbGwgbmV2ZXIgcmVhbGx5IGhhcHBlbi4gKi8KKwkJCWNhc2UgRklYRURfQVBFUl9TSVpFOgorCQkJY2FzZSBMVkwyX0FQRVJfU0laRToKKwkJCWRlZmF1bHQ6CisJCQkJc2l6ZSA9IHBhZ2Vfb3JkZXIgPSBudW1fZW50cmllcyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXRhYmxlID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCQkJCQkJCSAgcGFnZV9vcmRlcik7CisKKwkJCWlmICh0YWJsZSA9PSBOVUxMKSB7CisJCQkJaSsrOworCQkJCXN3aXRjaCAoYnJpZGdlLT5kcml2ZXItPnNpemVfdHlwZSkgeworCQkJCWNhc2UgVThfQVBFUl9TSVpFOgorCQkJCQlicmlkZ2UtPmN1cnJlbnRfc2l6ZSA9IEFfSURYOChicmlkZ2UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFUxNl9BUEVSX1NJWkU6CisJCQkJCWJyaWRnZS0+Y3VycmVudF9zaXplID0gQV9JRFgxNihicmlkZ2UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFUzMl9BUEVSX1NJWkU6CisJCQkJCWJyaWRnZS0+Y3VycmVudF9zaXplID0gQV9JRFgzMihicmlkZ2UpOworCQkJCQlicmVhazsKKwkJCQkJLyogVGhpcyBjYXNlIHdpbGwgbmV2ZXIgcmVhbGx5IGhhcHBlbi4gKi8KKwkJCQljYXNlIEZJWEVEX0FQRVJfU0laRToKKwkJCQljYXNlIExWTDJfQVBFUl9TSVpFOgorCQkJCWRlZmF1bHQ6CisJCQkJCWJyaWRnZS0+Y3VycmVudF9zaXplID0KKwkJCQkJICAgIGJyaWRnZS0+Y3VycmVudF9zaXplOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJdGVtcCA9IGJyaWRnZS0+Y3VycmVudF9zaXplOworCQkJfSBlbHNlIHsKKwkJCQlicmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKKwkJCX0KKwkJfSB3aGlsZSAoIXRhYmxlICYmIChpIDwgYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplcykpOworCX0gZWxzZSB7CisJCXNpemUgPSAoKHN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCAqKSB0ZW1wKS0+c2l6ZTsKKwkJcGFnZV9vcmRlciA9ICgoc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICopIHRlbXApLT5wYWdlX29yZGVyOworCQludW1fZW50cmllcyA9ICgoc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICopIHRlbXApLT5udW1fZW50cmllczsKKwkJdGFibGUgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIHBhZ2Vfb3JkZXIpOworCX0KKworCWlmICh0YWJsZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRhYmxlX2VuZCA9IHRhYmxlICsgKChQQUdFX1NJWkUgKiAoMSA8PCBwYWdlX29yZGVyKSkgLSAxKTsKKworCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZSh0YWJsZSk7IHBhZ2UgPD0gdmlydF90b19wYWdlKHRhYmxlX2VuZCk7IHBhZ2UrKykKKwkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCisJYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwgPSAodTMyICopIHRhYmxlOworCWFncF9nYXR0X3RhYmxlID0gKHZvaWQgKil0YWJsZTsKKworCWJyaWRnZS0+ZHJpdmVyLT5jYWNoZV9mbHVzaCgpOworCWJyaWRnZS0+Z2F0dF90YWJsZSA9IGlvcmVtYXBfbm9jYWNoZSh2aXJ0X3RvX3BoeXModGFibGUpLAorCQkJCQkoUEFHRV9TSVpFICogKDEgPDwgcGFnZV9vcmRlcikpKTsKKwlicmlkZ2UtPmRyaXZlci0+Y2FjaGVfZmx1c2goKTsKKworCWlmIChicmlkZ2UtPmdhdHRfdGFibGUgPT0gTlVMTCkgeworCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UodGFibGUpOyBwYWdlIDw9IHZpcnRfdG9fcGFnZSh0YWJsZV9lbmQpOyBwYWdlKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSB0YWJsZSwgcGFnZV9vcmRlcik7CisKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWJyaWRnZS0+Z2F0dF9idXNfYWRkciA9IHZpcnRfdG9fcGh5cyhicmlkZ2UtPmdhdHRfdGFibGVfcmVhbCk7CisKKwkvKiBBSzogYm9ndXMsIHNob3VsZCBlbmNvZGUgYWRkcmVzc2VzID4gNEdCICovCisJZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKwkJd3JpdGVsKGJyaWRnZS0+c2NyYXRjaF9wYWdlLCBicmlkZ2UtPmdhdHRfdGFibGUraSk7CisJCXJlYWRsKGJyaWRnZS0+Z2F0dF90YWJsZStpKTsJLyogUENJIFBvc3RpbmcuICovCisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlKTsKKworaW50IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJaW50IHBhZ2Vfb3JkZXI7CisJY2hhciAqdGFibGUsICp0YWJsZV9lbmQ7CisJdm9pZCAqdGVtcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXRlbXAgPSBicmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKworCXN3aXRjaCAoYnJpZGdlLT5kcml2ZXItPnNpemVfdHlwZSkgeworCWNhc2UgVThfQVBFUl9TSVpFOgorCQlwYWdlX29yZGVyID0gQV9TSVpFXzgodGVtcCktPnBhZ2Vfb3JkZXI7CisJCWJyZWFrOworCWNhc2UgVTE2X0FQRVJfU0laRToKKwkJcGFnZV9vcmRlciA9IEFfU0laRV8xNih0ZW1wKS0+cGFnZV9vcmRlcjsKKwkJYnJlYWs7CisJY2FzZSBVMzJfQVBFUl9TSVpFOgorCQlwYWdlX29yZGVyID0gQV9TSVpFXzMyKHRlbXApLT5wYWdlX29yZGVyOworCQlicmVhazsKKwljYXNlIEZJWEVEX0FQRVJfU0laRToKKwkJcGFnZV9vcmRlciA9IEFfU0laRV9GSVgodGVtcCktPnBhZ2Vfb3JkZXI7CisJCWJyZWFrOworCWNhc2UgTFZMMl9BUEVSX1NJWkU6CisJCS8qIFRoZSBnZW5lcmljIHJvdXRpbmVzIGNhbid0IGRlYWwgd2l0aCAyIGxldmVsIGdhdHQncyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFnZV9vcmRlciA9IDA7CisJCWJyZWFrOworCX0KKworCS8qIERvIG5vdCB3b3JyeSBhYm91dCBmcmVlaW5nIG1lbW9yeSwgYmVjYXVzZSBpZiB0aGlzIGlzCisJICogY2FsbGVkLCB0aGVuIGFsbCBhZ3AgbWVtb3J5IGlzIGRlYWxsb2NhdGVkIGFuZCByZW1vdmVkCisJICogZnJvbSB0aGUgdGFibGUuICovCisKKwlpb3VubWFwKGJyaWRnZS0+Z2F0dF90YWJsZSk7CisJdGFibGUgPSAoY2hhciAqKSBicmlkZ2UtPmdhdHRfdGFibGVfcmVhbDsKKwl0YWJsZV9lbmQgPSB0YWJsZSArICgoUEFHRV9TSVpFICogKDEgPDwgcGFnZV9vcmRlcikpIC0gMSk7CisKKwlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UodGFibGUpOyBwYWdlIDw9IHZpcnRfdG9fcGFnZSh0YWJsZV9lbmQpOyBwYWdlKyspCisJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworCisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwsIHBhZ2Vfb3JkZXIpOworCisJYWdwX2dhdHRfdGFibGUgPSBOVUxMOworCWJyaWRnZS0+Z2F0dF90YWJsZSA9IE5VTEw7CisJYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwgPSBOVUxMOworCWJyaWRnZS0+Z2F0dF9idXNfYWRkciA9IDA7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2dlbmVyaWNfZnJlZV9nYXR0X3RhYmxlKTsKKworCitpbnQgYWdwX2dlbmVyaWNfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqIG1lbSwgb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWludCBudW1fZW50cmllczsKKwlzaXplX3QgaTsKKwlvZmZfdCBqOworCXZvaWQgKnRlbXA7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCisJYnJpZGdlID0gbWVtLT5icmlkZ2U7CisJaWYgKCFicmlkZ2UpCisJCXJldHVybiAtRUlOVkFMOworCisJdGVtcCA9IGJyaWRnZS0+Y3VycmVudF9zaXplOworCisJc3dpdGNoIChicmlkZ2UtPmRyaXZlci0+c2l6ZV90eXBlKSB7CisJY2FzZSBVOF9BUEVSX1NJWkU6CisJCW51bV9lbnRyaWVzID0gQV9TSVpFXzgodGVtcCktPm51bV9lbnRyaWVzOworCQlicmVhazsKKwljYXNlIFUxNl9BUEVSX1NJWkU6CisJCW51bV9lbnRyaWVzID0gQV9TSVpFXzE2KHRlbXApLT5udW1fZW50cmllczsKKwkJYnJlYWs7CisJY2FzZSBVMzJfQVBFUl9TSVpFOgorCQludW1fZW50cmllcyA9IEFfU0laRV8zMih0ZW1wKS0+bnVtX2VudHJpZXM7CisJCWJyZWFrOworCWNhc2UgRklYRURfQVBFUl9TSVpFOgorCQludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOworCQlicmVhazsKKwljYXNlIExWTDJfQVBFUl9TSVpFOgorCQkvKiBUaGUgZ2VuZXJpYyByb3V0aW5lcyBjYW4ndCBkZWFsIHdpdGggMiBsZXZlbCBnYXR0J3MgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW51bV9lbnRyaWVzID0gMDsKKwkJYnJlYWs7CisJfQorCisJbnVtX2VudHJpZXMgLT0gYWdwX21lbW9yeV9yZXNlcnZlZC9QQUdFX1NJWkU7CisJaWYgKG51bV9lbnRyaWVzIDwgMCkgbnVtX2VudHJpZXMgPSAwOworCisJaWYgKHR5cGUgIT0gMCB8fCBtZW0tPnR5cGUgIT0gMCkgeworCQkvKiBUaGUgZ2VuZXJpYyByb3V0aW5lcyBrbm93IG5vdGhpbmcgb2YgbWVtb3J5IHR5cGVzICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEFLOiBjb3VsZCB3cmFwICovCisJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlqID0gcGdfc3RhcnQ7CisKKwl3aGlsZSAoaiA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkpIHsKKwkJaWYgKCFQR0VfRU1QVFkoYnJpZGdlLCByZWFkbChicmlkZ2UtPmdhdHRfdGFibGUraikpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJaisrOworCX0KKworCWlmIChtZW0tPmlzX2ZsdXNoZWQgPT0gRkFMU0UpIHsKKwkJYnJpZGdlLT5kcml2ZXItPmNhY2hlX2ZsdXNoKCk7CisJCW1lbS0+aXNfZmx1c2hlZCA9IFRSVUU7CisJfQorCisJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgeworCQl3cml0ZWwoYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGJyaWRnZSwgbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksIGJyaWRnZS0+Z2F0dF90YWJsZStqKTsKKwkJcmVhZGwoYnJpZGdlLT5nYXR0X3RhYmxlK2opOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisKKwlicmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9nZW5lcmljX2luc2VydF9tZW1vcnkpOworCisKK2ludCBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKK3sKKwlzaXplX3QgaTsKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisKKwlicmlkZ2UgPSBtZW0tPmJyaWRnZTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKSB7CisJCS8qIFRoZSBnZW5lcmljIHJvdXRpbmVzIGtub3cgbm90aGluZyBvZiBtZW1vcnkgdHlwZXMgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQUs6IGJvZ3VzLCBzaG91bGQgZW5jb2RlIGFkZHJlc3NlcyA+IDRHQiAqLworCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKG1lbS0+cGFnZV9jb3VudCArIHBnX3N0YXJ0KTsgaSsrKSB7CisJCXdyaXRlbChicmlkZ2UtPnNjcmF0Y2hfcGFnZSwgYnJpZGdlLT5nYXR0X3RhYmxlK2kpOworCQlyZWFkbChicmlkZ2UtPmdhdHRfdGFibGUraSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCWJyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2dlbmVyaWNfcmVtb3ZlX21lbW9yeSk7CisKKworc3RydWN0IGFncF9tZW1vcnkgKmFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUoc2l6ZV90IHBhZ2VfY291bnQsIGludCB0eXBlKQoreworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlKTsKKworCit2b2lkIGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZShzdHJ1Y3QgYWdwX21lbW9yeSAqY3VycikKK3sKKwl2ZnJlZShjdXJyLT5tZW1vcnkpOworCWFncF9mcmVlX2tleShjdXJyLT5rZXkpOworCWtmcmVlKGN1cnIpOworfQorRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUpOworCisKKy8qCisgKiBCYXNpYyBQYWdlIEFsbG9jYXRpb24gUm91dGluZXMgLQorICogVGhlc2Ugcm91dGluZXMgaGFuZGxlIHBhZ2UgYWxsb2NhdGlvbiBhbmQgYnkgZGVmYXVsdCB0aGV5IHJlc2VydmUgdGhlIGFsbG9jYXRlZAorICogbWVtb3J5LiAgVGhleSBhbHNvIGhhbmRsZSBpbmNyZW1lbnRpbmcgdGhlIGN1cnJlbnRfbWVtb3J5X2FncCB2YWx1ZSwgV2hpY2ggaXMgY2hlY2tlZAorICogYWdhaW5zdCBhIG1heGltdW0gdmFsdWUuCisgKi8KKwordm9pZCAqYWdwX2dlbmVyaWNfYWxsb2NfcGFnZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJc3RydWN0IHBhZ2UgKiBwYWdlOworCisJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKHBhZ2UgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltYXBfcGFnZV9pbnRvX2FncChwYWdlKTsKKworCWdldF9wYWdlKHBhZ2UpOworCVNldFBhZ2VMb2NrZWQocGFnZSk7CisJYXRvbWljX2luYygmYWdwX2JyaWRnZS0+Y3VycmVudF9tZW1vcnlfYWdwKTsKKwlyZXR1cm4gcGFnZV9hZGRyZXNzKHBhZ2UpOworfQorRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19hbGxvY19wYWdlKTsKKworCit2b2lkIGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSh2b2lkICphZGRyKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKGFkZHIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcGFnZSA9IHZpcnRfdG9fcGFnZShhZGRyKTsKKwl1bm1hcF9wYWdlX2Zyb21fYWdwKHBhZ2UpOworCXB1dF9wYWdlKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGRyKTsKKwlhdG9taWNfZGVjKCZhZ3BfYnJpZGdlLT5jdXJyZW50X21lbW9yeV9hZ3ApOworfQorRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UpOworCisvKiBFbmQgQmFzaWMgUGFnZSBBbGxvY2F0aW9uIFJvdXRpbmVzICovCisKKworLyoqCisgKiBhZ3BfZW5hYmxlICAtICBpbml0aWFsaXNlIHRoZSBhZ3AgcG9pbnQtdG8tcG9pbnQgY29ubmVjdGlvbi4KKyAqCisgKiBAbW9kZToJYWdwIG1vZGUgcmVnaXN0ZXIgdmFsdWUgdG8gY29uZmlndXJlIHdpdGguCisgKi8KK3ZvaWQgYWdwX2VuYWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHUzMiBtb2RlKQoreworCWlmICghYnJpZGdlKQorCQlyZXR1cm47CisJYnJpZGdlLT5kcml2ZXItPmFncF9lbmFibGUoYnJpZGdlLCBtb2RlKTsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2VuYWJsZSk7CisKKy8qIFdoZW4gd2UgcmVtb3ZlIHRoZSBnbG9iYWwgdmFyaWFibGUgYWdwX2JyaWRnZSBmcm9tIGFsbCBkcml2ZXJzCisgKiB0aGVuIGFncF9hbGxvY19icmlkZ2UgYW5kIGFncF9nZW5lcmljX2ZpbmRfYnJpZGdlIG5lZWQgdG8gYmUgdXBkYXRlZAorICovCisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9nZW5lcmljX2ZpbmRfYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChsaXN0X2VtcHR5KCZhZ3BfYnJpZGdlcykpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGFncF9icmlkZ2U7Cit9CisKK3N0YXRpYyB2b2lkIGlwaV9oYW5kbGVyKHZvaWQgKm51bGwpCit7CisJZmx1c2hfYWdwX2NhY2hlKCk7Cit9CisKK3ZvaWQgZ2xvYmFsX2NhY2hlX2ZsdXNoKHZvaWQpCit7CisJaWYgKG9uX2VhY2hfY3B1KGlwaV9oYW5kbGVyLCBOVUxMLCAxLCAxKSAhPSAwKQorCQlwYW5pYyhQRlggInRpbWVkIG91dCB3YWl0aW5nIGZvciB0aGUgb3RoZXIgQ1BVcyFcbiIpOworfQorRVhQT1JUX1NZTUJPTChnbG9iYWxfY2FjaGVfZmx1c2gpOworCit1bnNpZ25lZCBsb25nIGFncF9nZW5lcmljX21hc2tfbWVtb3J5KHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGludCB0eXBlKQoreworCS8qIG1lbW9yeSB0eXBlIGlzIGlnbm9yZWQgaW4gdGhlIGdlbmVyaWMgcm91dGluZSAqLworCWlmIChicmlkZ2UtPmRyaXZlci0+bWFza3MpCisJCXJldHVybiBhZGRyIHwgYnJpZGdlLT5kcml2ZXItPm1hc2tzWzBdLm1hc2s7CisJZWxzZQorCQlyZXR1cm4gYWRkcjsKK30KK0VYUE9SVF9TWU1CT0woYWdwX2dlbmVyaWNfbWFza19tZW1vcnkpOworCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBhY2NvcmRpbmcgdG8gdGhlIEFHUHYzIHNwZWMsCisgKiB3aGljaCBjb3ZlcnMgaW1wbGVtZW50YXRpb24gZGV0YWlscyB0aGF0IGhhZCBwcmV2aW91c2x5IGJlZW4KKyAqIGxlZnQgb3Blbi4KKyAqLworCitpbnQgYWdwM19nZW5lcmljX2ZldGNoX3NpemUodm9pZCkKK3sKKwl1MTYgdGVtcF9zaXplOworCWludCBpOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb18xNiAqdmFsdWVzOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHgrQUdQQVBTSVpFLCAmdGVtcF9zaXplKTsKKwl2YWx1ZXMgPSBBX1NJWkVfMTYoYWdwX2JyaWRnZS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWdwX2JyaWRnZS0+ZHJpdmVyLT5udW1fYXBlcnR1cmVfc2l6ZXM7IGkrKykgeworCQlpZiAodGVtcF9zaXplID09IHZhbHVlc1tpXS5zaXplX3ZhbHVlKSB7CisJCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0KKwkJCQlhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzICsgaSk7CisKKwkJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKKwkJCXJldHVybiB2YWx1ZXNbaV0uc2l6ZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWdwM19nZW5lcmljX2ZldGNoX3NpemUpOworCit2b2lkIGFncDNfZ2VuZXJpY190bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXUzMiBjdHJsOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIGFncF9icmlkZ2UtPmNhcG5keCtBR1BDVFJMLCAmY3RybCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIGFncF9icmlkZ2UtPmNhcG5keCtBR1BDVFJMLCBjdHJsICYgfkFHUENUUkxfR1RMQkVOKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgYWdwX2JyaWRnZS0+Y2FwbmR4K0FHUENUUkwsIGN0cmwpOworfQorRVhQT1JUX1NZTUJPTChhZ3AzX2dlbmVyaWNfdGxiZmx1c2gpOworCitpbnQgYWdwM19nZW5lcmljX2NvbmZpZ3VyZSh2b2lkKQoreworCXUzMiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb18xNiAqY3VycmVudF9zaXplOworCisJY3VycmVudF9zaXplID0gQV9TSVpFXzE2KGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBR1BfQVBCQVNFLCAmdGVtcCk7CisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisKKwkvKiBzZXQgYXBlcnR1cmUgc2l6ZSAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIGFncF9icmlkZ2UtPmNhcG5keCtBR1BBUFNJWkUsIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisJLyogc2V0IGdhcnQgcG9pbnRlciAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHgrQUdQR0FSVExPLCBhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyKTsKKwkvKiBlbmFibGUgYXBlcnR1cmUgYW5kIEdUTEIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHgrQUdQQ1RSTCwgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHgrQUdQQ1RSTCwgdGVtcCB8IEFHUENUUkxfQVBFUkVOQiB8IEFHUENUUkxfR1RMQkVOKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWdwM19nZW5lcmljX2NvbmZpZ3VyZSk7CisKK3ZvaWQgYWdwM19nZW5lcmljX2NsZWFudXAodm9pZCkKK3sKKwl1MzIgY3RybDsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHgrQUdQQ1RSTCwgJmN0cmwpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHgrQUdQQ1RSTCwgY3RybCAmIH5BR1BDVFJMX0FQRVJFTkIpOworfQorRVhQT1JUX1NZTUJPTChhZ3AzX2dlbmVyaWNfY2xlYW51cCk7CisKK3N0cnVjdCBhcGVyX3NpemVfaW5mb18xNiBhZ3AzX2dlbmVyaWNfc2l6ZXNbQUdQX0dFTkVSSUNfU0laRVNfRU5UUklFU10gPQoreworCXs0MDk2LCAxMDQ4NTc2LCAxMCwweDAwMH0sCisJezIwNDgsICA1MjQyODgsIDksIDB4ODAwfSwKKwl7MTAyNCwgIDI2MjE0NCwgOCwgMHhjMDB9LAorCXsgNTEyLCAgMTMxMDcyLCA3LCAweGUwMH0sCisJeyAyNTYsICAgNjU1MzYsIDYsIDB4ZjAwfSwKKwl7IDEyOCwgICAzMjc2OCwgNSwgMHhmMjB9LAorCXsgIDY0LCAgIDE2Mzg0LCA0LCAweGYzMH0sCisJeyAgMzIsICAgIDgxOTIsIDMsIDB4ZjM4fSwKKwl7ICAxNiwgICAgNDA5NiwgMiwgMHhmM2N9LAorCXsgICA4LCAgICAyMDQ4LCAxLCAweGYzZX0sCisJeyAgIDQsICAgIDEwMjQsIDAsIDB4ZjNmfQorfTsKK0VYUE9SVF9TWU1CT0woYWdwM19nZW5lcmljX3NpemVzKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9ocC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvaHAtYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1MmJmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaHAtYWdwLmMKQEAgLTAsMCArMSw1NTIgQEAKKy8qCisgKiBIUCB6eDEgQUdQR0FSVCByb3V0aW5lcy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDIsIDIwMDMgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KKyAqCUJqb3JuIEhlbGdhYXMgPGJqb3JuLmhlbGdhYXNAaHAuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKworI2luY2x1ZGUgPGFzbS9hY3BpLWV4dC5oPgorCisjaW5jbHVkZSAiYWdwLmgiCisKKyNpZm5kZWYgbG9nMgorI2RlZmluZSBsb2cyKHgpCQlmZnoofih4KSkKKyNlbmRpZgorCisjZGVmaW5lIEhQX1pYMV9JT0NfT0ZGU0VUCTB4MTAwMCAgLyogQUNQSSByZXBvcnRzIFNCQSwgd2Ugd2FudCBJT0MgKi8KKworLyogSFAgWlgxIElPQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSFBfWlgxX0lCQVNFCQkweDMwMAorI2RlZmluZSBIUF9aWDFfSU1BU0sJCTB4MzA4CisjZGVmaW5lIEhQX1pYMV9QQ09NCQkweDMxMAorI2RlZmluZSBIUF9aWDFfVENORkcJCTB4MzE4CisjZGVmaW5lIEhQX1pYMV9QRElSX0JBU0UJMHgzMjAKKworI2RlZmluZSBIUF9aWDFfSU9WQV9CQVNFCUdCKDFVTCkKKyNkZWZpbmUgSFBfWlgxX0lPVkFfU0laRQlHQigxVUwpCisjZGVmaW5lIEhQX1pYMV9HQVJUX1NJWkUJKEhQX1pYMV9JT1ZBX1NJWkUgLyAyKQorI2RlZmluZSBIUF9aWDFfU0JBX0lPTU1VX0NPT0tJRQkweDAwMDBiYWRiYWRjMGZmZWVVTAorCisjZGVmaW5lIEhQX1pYMV9QRElSX1ZBTElEX0JJVAkweDgwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBIUF9aWDFfSU9WQV9UT19QRElSKHZhKQkoKHZhIC0gaHBfcHJpdmF0ZS5pb3ZhX2Jhc2UpID4+IGhwX3ByaXZhdGUuaW9fdGxiX3NoaWZ0KQorCisjZGVmaW5lIEFHUDhYX01PREVfQklUCQkzCisjZGVmaW5lIEFHUDhYX01PREUJCSgxIDw8IEFHUDhYX01PREVfQklUKQorCisvKiBBR1AgYnJpZGdlIG5lZWQgbm90IGJlIFBDSSBkZXZpY2UsIGJ1dCBEUk0gdGhpbmtzIGl0IGlzLiAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2IGZha2VfYnJpZGdlX2RldjsKKworc3RhdGljIGludCBocF96eDFfZ2FydF9mb3VuZDsKKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCBocF96eDFfc2l6ZXNbXSA9Cit7CisJezAsIDAsIDB9LAkJLyogZmlsbGVkIGluIGJ5IGhwX3p4MV9mZXRjaF9zaXplKCkgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2F0dF9tYXNrIGhwX3p4MV9tYXNrc1tdID0KK3sKKwl7Lm1hc2sgPSBIUF9aWDFfUERJUl9WQUxJRF9CSVQsIC50eXBlID0gMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgX2hwX3ByaXZhdGUgeworCXZvbGF0aWxlIHU4IF9faW9tZW0gKmlvY19yZWdzOworCXZvbGF0aWxlIHU4IF9faW9tZW0gKmxiYV9yZWdzOworCWludCBsYmFfY2FwX29mZnNldDsKKwl1NjQgKmlvX3BkaXI7CQkvLyBQRElSIGZvciBlbnRpcmUgSU9WQQorCXU2NCAqZ2F0dDsJCS8vIFBESVIganVzdCBmb3IgR0FSVCAoc3Vic2V0IG9mIGFib3ZlKQorCXU2NCBnYXR0X2VudHJpZXM7CisJdTY0IGlvdmFfYmFzZTsKKwl1NjQgZ2FydF9iYXNlOworCXU2NCBnYXJ0X3NpemU7CisJdTY0IGlvX3BkaXJfc2l6ZTsKKwlpbnQgaW9fcGRpcl9vd25lcjsJLy8gZG8gd2Ugb3duIGl0LCBvciBzaGFyZSBpdCB3aXRoIHNiYV9pb21tdT8KKwlpbnQgaW9fcGFnZV9zaXplOworCWludCBpb190bGJfc2hpZnQ7CisJaW50IGlvX3RsYl9wczsJCS8vIElPQyBwcyBjb25maWcKKwlpbnQgaW9fcGFnZXNfcGVyX2twYWdlOworfSBocF9wcml2YXRlOworCitzdGF0aWMgaW50IF9faW5pdCBocF96eDFfaW9jX3NoYXJlZCh2b2lkKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJIUCBaWDEgSU9DOiBJT1BESVIgc2hhcmVkIHdpdGggc2JhX2lvbW11XG4iKTsKKworCS8qCisJICogSU9DIGFscmVhZHkgY29uZmlndXJlZCBieSBzYmFfaW9tbXUgbW9kdWxlOyBqdXN0IHVzZQorCSAqIGl0cyBzZXR1cC4gIFdlIGFzc3VtZToKKwkgKiAJLSBJT1ZBIHNwYWNlIGlzIDFHYiBpbiBzaXplCisJICogCS0gZmlyc3QgNTEyTWIgaXMgSU9NTVUsIHNlY29uZCA1MTJNYiBpcyBHQVJUCisJICovCisJaHAtPmlvX3RsYl9wcyA9IHJlYWRxKGhwLT5pb2NfcmVncytIUF9aWDFfVENORkcpOworCXN3aXRjaCAoaHAtPmlvX3RsYl9wcykgeworCQljYXNlIDA6IGhwLT5pb190bGJfc2hpZnQgPSAxMjsgYnJlYWs7CisJCWNhc2UgMTogaHAtPmlvX3RsYl9zaGlmdCA9IDEzOyBicmVhazsKKwkJY2FzZSAyOiBocC0+aW9fdGxiX3NoaWZ0ID0gMTQ7IGJyZWFrOworCQljYXNlIDM6IGhwLT5pb190bGJfc2hpZnQgPSAxNjsgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbnZhbGlkIElPVExCIHBhZ2Ugc2l6ZSAiCisJCQkgICAgICAgImNvbmZpZ3VyYXRpb24gMHgleFxuIiwgaHAtPmlvX3RsYl9wcyk7CisJCQlocC0+Z2F0dCA9IE5VTEw7CisJCQlocC0+Z2F0dF9lbnRyaWVzID0gMDsKKwkJCXJldHVybiAtRU5PREVWOworCX0KKwlocC0+aW9fcGFnZV9zaXplID0gMSA8PCBocC0+aW9fdGxiX3NoaWZ0OworCWhwLT5pb19wYWdlc19wZXJfa3BhZ2UgPSBQQUdFX1NJWkUgLyBocC0+aW9fcGFnZV9zaXplOworCisJaHAtPmlvdmFfYmFzZSA9IHJlYWRxKGhwLT5pb2NfcmVncytIUF9aWDFfSUJBU0UpICYgfjB4MTsKKwlocC0+Z2FydF9iYXNlID0gaHAtPmlvdmFfYmFzZSArIEhQX1pYMV9JT1ZBX1NJWkUgLSBIUF9aWDFfR0FSVF9TSVpFOworCisJaHAtPmdhcnRfc2l6ZSA9IEhQX1pYMV9HQVJUX1NJWkU7CisJaHAtPmdhdHRfZW50cmllcyA9IGhwLT5nYXJ0X3NpemUgLyBocC0+aW9fcGFnZV9zaXplOworCisJaHAtPmlvX3BkaXIgPSBwaHlzX3RvX3ZpcnQocmVhZHEoaHAtPmlvY19yZWdzK0hQX1pYMV9QRElSX0JBU0UpKTsKKwlocC0+Z2F0dCA9ICZocC0+aW9fcGRpcltIUF9aWDFfSU9WQV9UT19QRElSKGhwLT5nYXJ0X2Jhc2UpXTsKKworCWlmIChocC0+Z2F0dFswXSAhPSBIUF9aWDFfU0JBX0lPTU1VX0NPT0tJRSkgeworCQkvKiBOb3JtYWwgY2FzZSB3aGVuIG5vIEFHUCBkZXZpY2UgaW4gc3lzdGVtICovCisJICAgIAlocC0+Z2F0dCA9IE5VTEw7CisJCWhwLT5nYXR0X2VudHJpZXMgPSAwOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJObyByZXNlcnZlZCBJTyBQRElSIGVudHJ5IGZvdW5kOyAiCisJCSAgICAgICAiR0FSVCBkaXNhYmxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdAoraHBfengxX2lvY19vd25lciAodm9pZCkKK3sKKwlzdHJ1Y3QgX2hwX3ByaXZhdGUgKmhwID0gJmhwX3ByaXZhdGU7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiSFAgWlgxIElPQzogSU9QRElSIGRlZGljYXRlZCB0byBHQVJUXG4iKTsKKworCS8qCisJICogU2VsZWN0IGFuIElPViBwYWdlIHNpemUgbm8gbGFyZ2VyIHRoYW4gc3lzdGVtIHBhZ2Ugc2l6ZS4KKwkgKi8KKwlpZiAoUEFHRV9TSVpFID49IEtCKDY0KSkgeworCQlocC0+aW9fdGxiX3NoaWZ0ID0gMTY7CisJCWhwLT5pb190bGJfcHMgPSAzOworCX0gZWxzZSBpZiAoUEFHRV9TSVpFID49IEtCKDE2KSkgeworCQlocC0+aW9fdGxiX3NoaWZ0ID0gMTQ7CisJCWhwLT5pb190bGJfcHMgPSAyOworCX0gZWxzZSBpZiAoUEFHRV9TSVpFID49IEtCKDgpKSB7CisJCWhwLT5pb190bGJfc2hpZnQgPSAxMzsKKwkJaHAtPmlvX3RsYl9wcyA9IDE7CisJfSBlbHNlIHsKKwkJaHAtPmlvX3RsYl9zaGlmdCA9IDEyOworCQlocC0+aW9fdGxiX3BzID0gMDsKKwl9CisJaHAtPmlvX3BhZ2Vfc2l6ZSA9IDEgPDwgaHAtPmlvX3RsYl9zaGlmdDsKKwlocC0+aW9fcGFnZXNfcGVyX2twYWdlID0gUEFHRV9TSVpFIC8gaHAtPmlvX3BhZ2Vfc2l6ZTsKKworCWhwLT5pb3ZhX2Jhc2UgPSBIUF9aWDFfSU9WQV9CQVNFOworCWhwLT5nYXJ0X3NpemUgPSBIUF9aWDFfR0FSVF9TSVpFOworCWhwLT5nYXJ0X2Jhc2UgPSBocC0+aW92YV9iYXNlICsgSFBfWlgxX0lPVkFfU0laRSAtIGhwLT5nYXJ0X3NpemU7CisKKwlocC0+Z2F0dF9lbnRyaWVzID0gaHAtPmdhcnRfc2l6ZSAvIGhwLT5pb19wYWdlX3NpemU7CisJaHAtPmlvX3BkaXJfc2l6ZSA9IChIUF9aWDFfSU9WQV9TSVpFIC8gaHAtPmlvX3BhZ2Vfc2l6ZSkgKiBzaXplb2YodTY0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdAoraHBfengxX2lvY19pbml0ICh1NjQgaHBhKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKworCWhwLT5pb2NfcmVncyA9IGlvcmVtYXAoaHBhLCAxMDI0KTsKKwlpZiAoIWhwLT5pb2NfcmVncykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIElmIHRoZSBJT1RMQiBpcyBjdXJyZW50bHkgZGlzYWJsZWQsIHdlIGNhbiB0YWtlIGl0IG92ZXIuCisJICogT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIHNoYXJlIHdpdGggc2JhX2lvbW11LgorCSAqLworCWhwLT5pb19wZGlyX293bmVyID0gKHJlYWRxKGhwLT5pb2NfcmVncytIUF9aWDFfSUJBU0UpICYgMHgxKSA9PSAwOworCisJaWYgKGhwLT5pb19wZGlyX293bmVyKQorCQlyZXR1cm4gaHBfengxX2lvY19vd25lcigpOworCisJcmV0dXJuIGhwX3p4MV9pb2Nfc2hhcmVkKCk7Cit9CisKK3N0YXRpYyBpbnQKK2hwX3p4MV9sYmFfZmluZF9jYXBhYmlsaXR5ICh2b2xhdGlsZSB1OCBfX2lvbWVtICpocGEsIGludCBjYXApCit7CisJdTE2IHN0YXR1czsKKwl1OCBwb3MsIGlkOworCWludCB0dGwgPSA0ODsKKworCXN0YXR1cyA9IHJlYWR3KGhwYStQQ0lfU1RBVFVTKTsKKwlpZiAoIShzdGF0dXMgJiBQQ0lfU1RBVFVTX0NBUF9MSVNUKSkKKwkJcmV0dXJuIDA7CisJcG9zID0gcmVhZGIoaHBhK1BDSV9DQVBBQklMSVRZX0xJU1QpOworCXdoaWxlICh0dGwtLSAmJiBwb3MgPj0gMHg0MCkgeworCQlwb3MgJj0gfjM7CisJCWlkID0gcmVhZGIoaHBhK3BvcytQQ0lfQ0FQX0xJU1RfSUQpOworCQlpZiAoaWQgPT0gMHhmZikKKwkJCWJyZWFrOworCQlpZiAoaWQgPT0gY2FwKQorCQkJcmV0dXJuIHBvczsKKwkJcG9zID0gcmVhZGIoaHBhK3BvcytQQ0lfQ0FQX0xJU1RfTkVYVCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdAoraHBfengxX2xiYV9pbml0ICh1NjQgaHBhKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKwlpbnQgY2FwOworCisJaHAtPmxiYV9yZWdzID0gaW9yZW1hcChocGEsIDI1Nik7CisJaWYgKCFocC0+bGJhX3JlZ3MpCisJCXJldHVybiAtRU5PTUVNOworCisJaHAtPmxiYV9jYXBfb2Zmc2V0ID0gaHBfengxX2xiYV9maW5kX2NhcGFiaWxpdHkoaHAtPmxiYV9yZWdzLCBQQ0lfQ0FQX0lEX0FHUCk7CisKKwljYXAgPSByZWFkbChocC0+bGJhX3JlZ3MraHAtPmxiYV9jYXBfb2Zmc2V0KSAmIDB4ZmY7CisJaWYgKGNhcCAhPSBQQ0lfQ0FQX0lEX0FHUCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbnZhbGlkIGNhcGFiaWxpdHkgSUQgMHglMDJ4IGF0IDB4JXhcbiIsCisJCSAgICAgICBjYXAsIGhwLT5sYmFfY2FwX29mZnNldCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitocF96eDFfZmV0Y2hfc2l6ZSh2b2lkKQoreworCWludCBzaXplOworCisJc2l6ZSA9IGhwX3ByaXZhdGUuZ2FydF9zaXplIC8gTUIoMSk7CisJaHBfengxX3NpemVzWzBdLnNpemUgPSBzaXplOworCWFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICZocF96eDFfc2l6ZXNbMF07CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQKK2hwX3p4MV9jb25maWd1cmUgKHZvaWQpCit7CisJc3RydWN0IF9ocF9wcml2YXRlICpocCA9ICZocF9wcml2YXRlOworCisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9IGhwLT5nYXJ0X2Jhc2U7CisJYWdwX2JyaWRnZS0+Y2FwbmR4ID0gaHAtPmxiYV9jYXBfb2Zmc2V0OworCWFncF9icmlkZ2UtPm1vZGUgPSByZWFkbChocC0+bGJhX3JlZ3MraHAtPmxiYV9jYXBfb2Zmc2V0K1BDSV9BR1BfU1RBVFVTKTsKKworCWlmIChocC0+aW9fcGRpcl9vd25lcikgeworCQl3cml0ZWwodmlydF90b19waHlzKGhwLT5pb19wZGlyKSwgaHAtPmlvY19yZWdzK0hQX1pYMV9QRElSX0JBU0UpOworCQlyZWFkbChocC0+aW9jX3JlZ3MrSFBfWlgxX1BESVJfQkFTRSk7CisJCXdyaXRlbChocC0+aW9fdGxiX3BzLCBocC0+aW9jX3JlZ3MrSFBfWlgxX1RDTkZHKTsKKwkJcmVhZGwoaHAtPmlvY19yZWdzK0hQX1pYMV9UQ05GRyk7CisJCXdyaXRlbCh+KEhQX1pYMV9JT1ZBX1NJWkUtMSksIGhwLT5pb2NfcmVncytIUF9aWDFfSU1BU0spOworCQlyZWFkbChocC0+aW9jX3JlZ3MrSFBfWlgxX0lNQVNLKTsKKwkJd3JpdGVsKGhwLT5pb3ZhX2Jhc2V8MSwgaHAtPmlvY19yZWdzK0hQX1pYMV9JQkFTRSk7CisJCXJlYWRsKGhwLT5pb2NfcmVncytIUF9aWDFfSUJBU0UpOworCQl3cml0ZWwoaHAtPmlvdmFfYmFzZXxsb2cyKEhQX1pYMV9JT1ZBX1NJWkUpLCBocC0+aW9jX3JlZ3MrSFBfWlgxX1BDT00pOworCQlyZWFkbChocC0+aW9jX3JlZ3MrSFBfWlgxX1BDT00pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraHBfengxX2NsZWFudXAgKHZvaWQpCit7CisJc3RydWN0IF9ocF9wcml2YXRlICpocCA9ICZocF9wcml2YXRlOworCisJaWYgKGhwLT5pb2NfcmVncykgeworCQlpZiAoaHAtPmlvX3BkaXJfb3duZXIpIHsKKwkJCXdyaXRlcSgwLCBocC0+aW9jX3JlZ3MrSFBfWlgxX0lCQVNFKTsKKwkJCXJlYWRxKGhwLT5pb2NfcmVncytIUF9aWDFfSUJBU0UpOworCQl9CisJCWlvdW5tYXAoaHAtPmlvY19yZWdzKTsKKwl9CisJaWYgKGhwLT5sYmFfcmVncykKKwkJaW91bm1hcChocC0+bGJhX3JlZ3MpOworfQorCitzdGF0aWMgdm9pZAoraHBfengxX3RsYmZsdXNoIChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKworCXdyaXRlcShocC0+Z2FydF9iYXNlIHwgbG9nMihocC0+Z2FydF9zaXplKSwgaHAtPmlvY19yZWdzK0hQX1pYMV9QQ09NKTsKKwlyZWFkcShocC0+aW9jX3JlZ3MrSFBfWlgxX1BDT00pOworfQorCitzdGF0aWMgaW50CitocF96eDFfY3JlYXRlX2dhdHRfdGFibGUgKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgX2hwX3ByaXZhdGUgKmhwID0gJmhwX3ByaXZhdGU7CisJaW50IGk7CisKKwlpZiAoaHAtPmlvX3BkaXJfb3duZXIpIHsKKwkJaHAtPmlvX3BkaXIgPSAodTY0ICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJCQkJCWdldF9vcmRlcihocC0+aW9fcGRpcl9zaXplKSk7CisJCWlmICghaHAtPmlvX3BkaXIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkbid0IGFsbG9jYXRlIGNvbnRpZ3VvdXMgIgorCQkJCSJtZW1vcnkgZm9yIEkvTyBQRElSXG4iKTsKKwkJCWhwLT5nYXR0ID0gTlVMTDsKKwkJCWhwLT5nYXR0X2VudHJpZXMgPSAwOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtc2V0KGhwLT5pb19wZGlyLCAwLCBocC0+aW9fcGRpcl9zaXplKTsKKworCQlocC0+Z2F0dCA9ICZocC0+aW9fcGRpcltIUF9aWDFfSU9WQV9UT19QRElSKGhwLT5nYXJ0X2Jhc2UpXTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaHAtPmdhdHRfZW50cmllczsgaSsrKSB7CisJCWhwLT5nYXR0W2ldID0gKHVuc2lnbmVkIGxvbmcpIGFncF9icmlkZ2UtPnNjcmF0Y2hfcGFnZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraHBfengxX2ZyZWVfZ2F0dF90YWJsZSAoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKworCWlmIChocC0+aW9fcGRpcl9vd25lcikKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgaHAtPmlvX3BkaXIsCisJCQkgICAgZ2V0X29yZGVyKGhwLT5pb19wZGlyX3NpemUpKTsKKwllbHNlCisJCWhwLT5nYXR0WzBdID0gSFBfWlgxX1NCQV9JT01NVV9DT09LSUU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2hwX3p4MV9pbnNlcnRfbWVtb3J5IChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJc3RydWN0IF9ocF9wcml2YXRlICpocCA9ICZocF9wcml2YXRlOworCWludCBpLCBrOworCW9mZl90IGosIGlvX3BnX3N0YXJ0OworCWludCBpb19wZ19jb3VudDsKKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW9fcGdfc3RhcnQgPSBocC0+aW9fcGFnZXNfcGVyX2twYWdlICogcGdfc3RhcnQ7CisJaW9fcGdfY291bnQgPSBocC0+aW9fcGFnZXNfcGVyX2twYWdlICogbWVtLT5wYWdlX2NvdW50OworCWlmICgoaW9fcGdfc3RhcnQgKyBpb19wZ19jb3VudCkgPiBocC0+Z2F0dF9lbnRyaWVzKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWogPSBpb19wZ19zdGFydDsKKwl3aGlsZSAoaiA8IChpb19wZ19zdGFydCArIGlvX3BnX2NvdW50KSkgeworCQlpZiAoaHAtPmdhdHRbal0pIHsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJaisrOworCX0KKworCWlmIChtZW0tPmlzX2ZsdXNoZWQgPT0gRkFMU0UpIHsKKwkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJCW1lbS0+aXNfZmx1c2hlZCA9IFRSVUU7CisJfQorCisJZm9yIChpID0gMCwgaiA9IGlvX3BnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBwYWRkcjsKKworCQlwYWRkciA9IG1lbS0+bWVtb3J5W2ldOworCQlmb3IgKGsgPSAwOworCQkgICAgIGsgPCBocC0+aW9fcGFnZXNfcGVyX2twYWdlOworCQkgICAgIGsrKywgaisrLCBwYWRkciArPSBocC0+aW9fcGFnZV9zaXplKSB7CisJCQlocC0+Z2F0dFtqXSA9CisJCQkJYWdwX2JyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAorCQkJCQlwYWRkciwgdHlwZSk7CisJCX0KKwl9CisKKwlhZ3BfYnJpZGdlLT5kcml2ZXItPnRsYl9mbHVzaChtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitocF96eDFfcmVtb3ZlX21lbW9yeSAoc3RydWN0IGFncF9tZW1vcnkgKm1lbSwgb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKwlpbnQgaSwgaW9fcGdfc3RhcnQsIGlvX3BnX2NvdW50OworCisJaWYgKHR5cGUgIT0gMCB8fCBtZW0tPnR5cGUgIT0gMCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpb19wZ19zdGFydCA9IGhwLT5pb19wYWdlc19wZXJfa3BhZ2UgKiBwZ19zdGFydDsKKwlpb19wZ19jb3VudCA9IGhwLT5pb19wYWdlc19wZXJfa3BhZ2UgKiBtZW0tPnBhZ2VfY291bnQ7CisJZm9yIChpID0gaW9fcGdfc3RhcnQ7IGkgPCBpb19wZ19jb3VudCArIGlvX3BnX3N0YXJ0OyBpKyspIHsKKwkJaHAtPmdhdHRbaV0gPSBhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2U7CisJfQorCisJYWdwX2JyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2hwX3p4MV9tYXNrX21lbW9yeSAoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLAorCXVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHR5cGUpCit7CisJcmV0dXJuIEhQX1pYMV9QRElSX1ZBTElEX0JJVCB8IGFkZHI7Cit9CisKK3N0YXRpYyB2b2lkCitocF96eDFfZW5hYmxlIChzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHUzMiBtb2RlKQoreworCXN0cnVjdCBfaHBfcHJpdmF0ZSAqaHAgPSAmaHBfcHJpdmF0ZTsKKwl1MzIgY29tbWFuZDsKKworCWNvbW1hbmQgPSByZWFkbChocC0+bGJhX3JlZ3MraHAtPmxiYV9jYXBfb2Zmc2V0K1BDSV9BR1BfU1RBVFVTKTsKKwljb21tYW5kID0gYWdwX2NvbGxlY3RfZGV2aWNlX3N0YXR1cyhicmlkZ2UsIG1vZGUsIGNvbW1hbmQpOworCWNvbW1hbmQgfD0gMHgwMDAwMDEwMDsKKworCXdyaXRlbChjb21tYW5kLCBocC0+bGJhX3JlZ3MraHAtPmxiYV9jYXBfb2Zmc2V0K1BDSV9BR1BfQ09NTUFORCk7CisKKwlhZ3BfZGV2aWNlX2NvbW1hbmQoY29tbWFuZCwgKG1vZGUgJiBBR1A4WF9NT0RFKSAhPSAwKTsKK30KKworc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGhwX3p4MV9kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuc2l6ZV90eXBlCQk9IEZJWEVEX0FQRVJfU0laRSwKKwkuY29uZmlndXJlCQk9IGhwX3p4MV9jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gaHBfengxX2ZldGNoX3NpemUsCisJLmNsZWFudXAJCT0gaHBfengxX2NsZWFudXAsCisJLnRsYl9mbHVzaAkJPSBocF96eDFfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGhwX3p4MV9tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGhwX3p4MV9tYXNrcywKKwkuYWdwX2VuYWJsZQkJPSBocF96eDFfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gaHBfengxX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBocF96eDFfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5CQk9IGhwX3p4MV9pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGhwX3p4MV9yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmNhbnRfdXNlX2FwZXJ0dXJlCT0gMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitocF96eDFfc2V0dXAgKHU2NCBpb2NfaHBhLCB1NjQgbGJhX2hwYSkKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisJaW50IGVycm9yID0gMDsKKworCWVycm9yID0gaHBfengxX2lvY19pbml0KGlvY19ocGEpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsOworCisJZXJyb3IgPSBocF96eDFfbGJhX2luaXQobGJhX2hwYSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw7CisKKwlicmlkZ2UgPSBhZ3BfYWxsb2NfYnJpZGdlKCk7CisJaWYgKCFicmlkZ2UpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCWJyaWRnZS0+ZHJpdmVyID0gJmhwX3p4MV9kcml2ZXI7CisKKwlmYWtlX2JyaWRnZV9kZXYudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9IUDsKKwlmYWtlX2JyaWRnZV9kZXYuZGV2aWNlID0gUENJX0RFVklDRV9JRF9IUF9QQ0lYX0xCQTsKKwlicmlkZ2UtPmRldiA9ICZmYWtlX2JyaWRnZV9kZXY7CisKKwllcnJvciA9IGFncF9hZGRfYnJpZGdlKGJyaWRnZSk7CisgIGZhaWw6CisJaWYgKGVycm9yKQorCQlocF96eDFfY2xlYW51cCgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdAorengxX2dhcnRfcHJvYmUgKGFjcGlfaGFuZGxlIG9iaiwgdTMyIGRlcHRoLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0KQoreworCWFjcGlfaGFuZGxlIGhhbmRsZSwgcGFyZW50OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyOworCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvICppbmZvOworCXU2NCBsYmFfaHBhLCBzYmFfaHBhLCBsZW5ndGg7CisJaW50IG1hdGNoOworCisJc3RhdHVzID0gaHBfYWNwaV9jc3Jfc3BhY2Uob2JqLCAmbGJhX2hwYSwgJmxlbmd0aCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gQUVfT0s7IC8qIGtlZXAgbG9va2luZyBmb3IgYW5vdGhlciBicmlkZ2UgKi8KKworCS8qIExvb2sgZm9yIGFuIGVuY2xvc2luZyBJT0Mgc2NvcGUgYW5kIGZpbmQgaXRzIENTUiBzcGFjZSAqLworCWhhbmRsZSA9IG9iajsKKwlkbyB7CisJCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUjsKKwkJc3RhdHVzID0gYWNwaV9nZXRfb2JqZWN0X2luZm8oaGFuZGxlLCAmYnVmZmVyKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkvKiBUQkQgY2hlY2sgX0NJRCBhbHNvICovCisJCQlpbmZvID0gYnVmZmVyLnBvaW50ZXI7CisJCQlpbmZvLT5oYXJkd2FyZV9pZC52YWx1ZVtzaXplb2YoaW5mby0+aGFyZHdhcmVfaWQpLTFdID0gJ1wwJzsKKwkJCW1hdGNoID0gKHN0cmNtcChpbmZvLT5oYXJkd2FyZV9pZC52YWx1ZSwgIkhXUDAwMDEiKSA9PSAwKTsKKwkJCUFDUElfTUVNX0ZSRUUoaW5mbyk7CisJCQlpZiAobWF0Y2gpIHsKKwkJCQlzdGF0dXMgPSBocF9hY3BpX2Nzcl9zcGFjZShoYW5kbGUsICZzYmFfaHBhLCAmbGVuZ3RoKTsKKwkJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCQkJCWJyZWFrOworCQkJCWVsc2UgeworCQkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJEZXRlY3RlZCBIUCBaWDEgIgorCQkJCQkgICAgICAgIkFHUCBMQkEgYnV0IG5vIElPQy5cbiIpOworCQkJCQlyZXR1cm4gQUVfT0s7CisJCQkJfQorCQkJfQorCQl9CisKKwkJc3RhdHVzID0gYWNwaV9nZXRfcGFyZW50KGhhbmRsZSwgJnBhcmVudCk7CisJCWhhbmRsZSA9IHBhcmVudDsKKwl9IHdoaWxlIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSk7CisKKwlpZiAoaHBfengxX3NldHVwKHNiYV9ocGEgKyBIUF9aWDFfSU9DX09GRlNFVCwgbGJhX2hwYSkpCisJCXJldHVybiBBRV9PSzsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBIUCBaWDEgJXMgQUdQIGNoaXBzZXQgKGlvYz0lbHgsIGxiYT0lbHgpXG4iLAorCQkoY2hhciAqKSBjb250ZXh0LCBzYmFfaHBhICsgSFBfWlgxX0lPQ19PRkZTRVQsIGxiYV9ocGEpOworCisJaHBfengxX2dhcnRfZm91bmQgPSAxOworCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsgLyogd2Ugb25seSBzdXBwb3J0IG9uZSBicmlkZ2U7IHF1aXQgbG9va2luZyAqLworfQorCitzdGF0aWMgaW50IF9faW5pdAorYWdwX2hwX2luaXQgKHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJYWNwaV9nZXRfZGV2aWNlcygiSFdQMDAwMyIsIHp4MV9nYXJ0X3Byb2JlLCAiSFdQMDAwMyIsIE5VTEwpOworCWlmIChocF96eDFfZ2FydF9mb3VuZCkKKwkJcmV0dXJuIDA7CisKKwlhY3BpX2dldF9kZXZpY2VzKCJIV1AwMDA3IiwgengxX2dhcnRfcHJvYmUsICJIV1AwMDA3IiwgTlVMTCk7CisJaWYgKGhwX3p4MV9nYXJ0X2ZvdW5kKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2FncF9ocF9jbGVhbnVwICh2b2lkKQoreworfQorCittb2R1bGVfaW5pdChhZ3BfaHBfaW5pdCk7Cittb2R1bGVfZXhpdChhZ3BfaHBfY2xlYW51cCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2k0NjAtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2k0NjAtYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiZWE4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaTQ2MC1hZ3AuYwpAQCAtMCwwICsxLDY0MiBAQAorLyoKKyAqIEZvciBkb2N1bWVudGF0aW9uIG9uIHRoZSBpNDYwIEFHUCBpbnRlcmZhY2UsIHNlZSBDaGFwdGVyIDcgKEFHUCBTdWJzeXN0ZW0pIG9mCisgKiB0aGUgIkludGVsIDQ2MEdUWCBDaGlwc2V0IFNvZnR3YXJlIERldmVsb3BlcidzIE1hbnVhbCI6CisgKiBodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS9kZXNpZ24vaXRhbml1bS9kb3dubG9hZHMvMjQ4NzA0MDFzLmh0bQorICovCisvKgorICogNDYwR1ggc3VwcG9ydCBieSBDaHJpcyBBaG5hIDxjaHJpc3RvcGhlci5qLmFobmFAaW50ZWwuY29tPgorICogQ2xlYW4gdXAgJiBzaW1wbGlmaWNhdGlvbiBieSBEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKworI2luY2x1ZGUgImFncC5oIgorCisjZGVmaW5lIElOVEVMX0k0NjBfQkFQQkFTRQkJMHg5OAorI2RlZmluZSBJTlRFTF9JNDYwX0dYQkNUTAkJMHhhMAorI2RlZmluZSBJTlRFTF9JNDYwX0FHUFNJWgkJMHhhMgorI2RlZmluZSBJTlRFTF9JNDYwX0FUVEJBU0UJCTB4ZmUyMDAwMDAKKyNkZWZpbmUgSU5URUxfSTQ2MF9HQVRUX1ZBTElECQkoMVVMIDw8IDI0KQorI2RlZmluZSBJTlRFTF9JNDYwX0dBVFRfQ09IRVJFTlQJKDFVTCA8PCAyNSkKKworLyoKKyAqIFRoZSBpNDYwIGNhbiBvcGVyYXRlIHdpdGggbGFyZ2UgKDRNQikgcGFnZXMsIGJ1dCB0aGVyZSBpcyBubyBzYW5lIHdheSB0byBzdXBwb3J0IHRoaXMKKyAqIHdpdGhpbiB0aGUgY3VycmVudCBrZXJuZWwvRFJNIGVudmlyb25tZW50LCBzbyB3ZSBkaXNhYmxlIHRoZSByZWxldmFudCBjb2RlIGZvciBub3cuCisgKiBTZWUgYWxzbyBjb21tZW50cyBpbiBpYTY0X2FsbG9jX3BhZ2UoKS4uLgorICovCisjZGVmaW5lIEk0NjBfTEFSR0VfSU9fUEFHRVMJCTAKKworI2lmIEk0NjBfTEFSR0VfSU9fUEFHRVMKKyMgZGVmaW5lIEk0NjBfSU9fUEFHRV9TSElGVAkJaTQ2MC5pb19wYWdlX3NoaWZ0CisjZWxzZQorIyBkZWZpbmUgSTQ2MF9JT19QQUdFX1NISUZUCQkxMgorI2VuZGlmCisKKyNkZWZpbmUgSTQ2MF9JT1BBR0VTX1BFUl9LUEFHRQkJKFBBR0VfU0laRSA+PiBJNDYwX0lPX1BBR0VfU0hJRlQpCisjZGVmaW5lIEk0NjBfS1BBR0VTX1BFUl9JT1BBR0UJCSgxIDw8IChJNDYwX0lPX1BBR0VfU0hJRlQgLSBQQUdFX1NISUZUKSkKKyNkZWZpbmUgSTQ2MF9TUkFNX0lPX0RJU0FCTEUJCSgxIDw8IDQpCisjZGVmaW5lIEk0NjBfQkFQQkFTRV9FTkFCTEUJCSgxIDw8IDMpCisjZGVmaW5lIEk0NjBfQUdQU0laX01BU0sJCTB4NworI2RlZmluZSBJNDYwXzRNX1BTCQkJKDEgPDwgMSkKKworLyogQ29udHJvbCBiaXRzIGZvciBPdXQtT2YtR0FSVCBjb2hlcmVuY3kgYW5kIEJ1cnN0IFdyaXRlIENvbWJpbmluZyAqLworI2RlZmluZSBJNDYwX0dYQkNUTF9PT0cJCSgxVUwgPDwgMCkKKyNkZWZpbmUgSTQ2MF9HWEJDVExfQldDCQkoMVVMIDw8IDIpCisKKy8qCisgKiBnYXR0X3RhYmxlIGVudHJpZXMgYXJlIDMyLWJpdHMgd2lkZSBvbiB0aGUgaTQ2MDsgdGhlIGdlbmVyaWMgY29kZSBvdWdodCB0byBkZWNsYXJlIHRoZQorICogZ2F0dF90YWJsZSBhbmQgZ2F0dF90YWJsZV9yZWFsIHBvaW50ZXJzIGEgInZvaWQgKiIuLi4KKyAqLworI2RlZmluZSBSRF9HQVRUKGluZGV4KQkJcmVhZGwoKHUzMiAqKSBpNDYwLmdhdHQgKyAoaW5kZXgpKQorI2RlZmluZSBXUl9HQVRUKGluZGV4LCB2YWwpCXdyaXRlbCgodmFsKSwgKHUzMiAqKSBpNDYwLmdhdHQgKyAoaW5kZXgpKQorLyoKKyAqIFRoZSA0NjAgc3BlYyBzYXlzIHdlIGhhdmUgdG8gcmVhZCB0aGUgbGFzdCBsb2NhdGlvbiB3cml0dGVuIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbAorICogd3JpdGVzIGhhdmUgdGFrZW4gZWZmZWN0CisgKi8KKyNkZWZpbmUgV1JfRkxVU0hfR0FUVChpbmRleCkJUkRfR0FUVChpbmRleCkKKworI2RlZmluZSBsb2cyKHgpCQkJZmZ6KH4oeCkpCisKK3N0YXRpYyBzdHJ1Y3QgeworCXZvaWQgKmdhdHQ7CQkJCS8qIGlvcmVtYXAnZCBHQVRUIGFyZWEgKi8KKworCS8qIGk0NjAgc3VwcG9ydHMgbXVsdGlwbGUgR0FSVCBwYWdlIHNpemVzLCBzbyBHQVJUIHBhZ2VzaGlmdCBpcyBkeW5hbWljOiAqLworCXU4IGlvX3BhZ2Vfc2hpZnQ7CisKKwkvKiBCSU9TIGNvbmZpZ3VyZXMgY2hpcHNldCB0byBvbmUgb2YgMiBwb3NzaWJsZSBhcGJhc2UgdmFsdWVzOiAqLworCXU4IGR5bmFtaWNfYXBiYXNlOworCisJLyogc3RydWN0dXJlIGZvciB0cmFja2luZyBwYXJ0aWFsIHVzZSBvZiA0TUIgR0FSVCBwYWdlczogKi8KKwlzdHJ1Y3QgbHBfZGVzYyB7CisJCXVuc2lnbmVkIGxvbmcgKmFsbG9jZWRfbWFwOwkvKiBiaXRtYXAgb2Yga2VybmVsLXBhZ2VzIGluIHVzZSAqLworCQlpbnQgcmVmY291bnQ7CQkJLyogbnVtYmVyIG9mIGtlcm5lbCBwYWdlcyB1c2luZyB0aGUgbGFyZ2UgcGFnZSAqLworCQl1NjQgcGFkZHI7CQkJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBsYXJnZSBwYWdlICovCisJfSAqbHBfZGVzYzsKK30gaTQ2MDsKKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb184IGk0NjBfc2l6ZXNbM10gPQoreworCS8qCisJICogVGhlIDMyR0IgYXBlcnR1cmUgaXMgb25seSBhdmFpbGFibGUgd2l0aCBhIDRNIEdBUlQgcGFnZSBzaXplLiAgRHVlIHRvIHRoZQorCSAqIGR5bmFtaWMgR0FSVCBwYWdlIHNpemUsIHdlIGNhbid0IGZpZ3VyZSBvdXQgcGFnZV9vcmRlciBvciBudW1fZW50cmllcyB1bnRpbAorCSAqIHJ1bnRpbWUuCisJICovCisJezMyNzY4LCAwLCAwLCA0fSwKKwl7MTAyNCwgMCwgMCwgMn0sCisJezI1NiwgMCwgMCwgMX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2F0dF9tYXNrIGk0NjBfbWFza3NbXSA9Cit7CisJeworCSAgLm1hc2sgPSBJTlRFTF9JNDYwX0dBVFRfVkFMSUQgfCBJTlRFTF9JNDYwX0dBVFRfQ09IRVJFTlQsCisJICAudHlwZSA9IDAKKwl9Cit9OworCitzdGF0aWMgaW50IGk0NjBfZmV0Y2hfc2l6ZSAodm9pZCkKK3sKKwlpbnQgaTsKKwl1OCB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICp2YWx1ZXM7CisKKwkvKiBEZXRlcm1pbmUgdGhlIEdBUlQgcGFnZSBzaXplICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JNDYwX0dYQkNUTCwgJnRlbXApOworCWk0NjAuaW9fcGFnZV9zaGlmdCA9ICh0ZW1wICYgSTQ2MF80TV9QUykgPyAyMiA6IDEyOworCXByX2RlYnVnKCJpNDYwX2ZldGNoX3NpemU6IGlvX3BhZ2Vfc2hpZnQ9JWRcbiIsIGk0NjAuaW9fcGFnZV9zaGlmdCk7CisKKwlpZiAoaTQ2MC5pb19wYWdlX3NoaWZ0ICE9IEk0NjBfSU9fUEFHRV9TSElGVCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiSS9PIChHQVJUKSBwYWdlLXNpemUgJVp1S0IgZG9lc24ndCBtYXRjaCBleHBlY3RlZCBzaXplICVadUtCXG4iLAorCQkgICAgICAgMVVMIDw8IChpNDYwLmlvX3BhZ2Vfc2hpZnQgLSAxMCksIDFVTCA8PCAoSTQ2MF9JT19QQUdFX1NISUZUKSk7CisJCXJldHVybiAwOworCX0KKworCXZhbHVlcyA9IEFfU0laRV84KGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JNDYwX0FHUFNJWiwgJnRlbXApOworCisJLyogRXhpdCBub3cgaWYgdGhlIElPIGRyaXZlcnMgZm9yIHRoZSBHQVJUIFNSQU1TIGFyZSB0dXJuZWQgb2ZmICovCisJaWYgKHRlbXAgJiBJNDYwX1NSQU1fSU9fRElTQUJMRSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJHQVJUIFNSQU1TIGRpc2FibGVkIG9uIDQ2MEdYIGNoaXBzZXRcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJBR1BHQVJUIG9wZXJhdGlvbiBub3QgcG9zc2libGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgdHJ5IHRvIGNyZWF0ZSBhbiAyIF4gMjMgZW50cnkgR0FUVCAqLworCWlmICgoaTQ2MC5pb19wYWdlX3NoaWZ0ID09IDApICYmICgodGVtcCAmIEk0NjBfQUdQU0laX01BU0spID09IDQpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIldlIGNhbid0IGhhdmUgYSAzMkdCIGFwZXJ0dXJlIHdpdGggNEtCIEdBUlQgcGFnZXNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIHByb3BlciBBUEJBU0UgcmVnaXN0ZXIgKi8KKwlpZiAodGVtcCAmIEk0NjBfQkFQQkFTRV9FTkFCTEUpCisJCWk0NjAuZHluYW1pY19hcGJhc2UgPSBJTlRFTF9JNDYwX0JBUEJBU0U7CisJZWxzZQorCQlpNDYwLmR5bmFtaWNfYXBiYXNlID0gQUdQX0FQQkFTRTsKKworCWZvciAoaSA9IDA7IGkgPCBhZ3BfYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplczsgaSsrKSB7CisJCS8qCisJCSAqIER5bmFtaWNhbGx5IGNhbGN1bGF0ZSB0aGUgcHJvcGVyIG51bV9lbnRyaWVzIGFuZCBwYWdlX29yZGVyIHZhbHVlcyBmb3IKKwkJICogdGhlIGRlZmluZSBhcGVydHVyZSBzaXplcy4gVGFrZSBjYXJlIG5vdCB0byBzaGlmdCBvZmYgdGhlIGVuZCBvZgorCQkgKiB2YWx1ZXNbaV0uc2l6ZS4KKwkJICovCisJCXZhbHVlc1tpXS5udW1fZW50cmllcyA9ICh2YWx1ZXNbaV0uc2l6ZSA8PCA4KSA+PiAoSTQ2MF9JT19QQUdFX1NISUZUIC0gMTIpOworCQl2YWx1ZXNbaV0ucGFnZV9vcmRlciA9IGxvZzIoKHNpemVvZih1MzIpKnZhbHVlc1tpXS5udW1fZW50cmllcykgPj4gUEFHRV9TSElGVCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJLyogTmVnbGVjdCBjb250cm9sIGJpdHMgd2hlbiBtYXRjaGluZyB1cCBzaXplX3ZhbHVlICovCisJCWlmICgodGVtcCAmIEk0NjBfQUdQU0laX01BU0spID09IHZhbHVlc1tpXS5zaXplX3ZhbHVlKSB7CisJCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgKHZhbHVlcyArIGkpOworCQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQkJcmV0dXJuIHZhbHVlc1tpXS5zaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZXJlIGlzbid0IGFueXRoaW5nIHRvIGRvIGhlcmUgc2luY2UgNDYwIGhhcyBubyBHQVJUIFRMQi4gKi8KK3N0YXRpYyB2b2lkIGk0NjBfdGxiX2ZsdXNoIChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXJldHVybjsKK30KKworLyoKKyAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBpcyBuZWVkZWQgdG8gcHJldmVudCBjb3JydXB0aW9uIG9mIHRoZSBjb250cm9sIGJpdHMKKyAqIHdoaWNoIGFyZSBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgYXBlcnR1cmUgc2l6ZSBpbiA0NjAncyBBR1BTSVogcmVnaXN0ZXIKKyAqLworc3RhdGljIHZvaWQgaTQ2MF93cml0ZV9hZ3BzaXogKHU4IHNpemVfdmFsdWUpCit7CisJdTggdGVtcDsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTQ2MF9BR1BTSVosICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JNDYwX0FHUFNJWiwKKwkJCSAgICAgICgodGVtcCAmIH5JNDYwX0FHUFNJWl9NQVNLKSB8IHNpemVfdmFsdWUpKTsKK30KKworc3RhdGljIHZvaWQgaTQ2MF9jbGVhbnVwICh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpwcmV2aW91c19zaXplOworCisJcHJldmlvdXNfc2l6ZSA9IEFfU0laRV84KGFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUpOworCWk0NjBfd3JpdGVfYWdwc2l6KHByZXZpb3VzX3NpemUtPnNpemVfdmFsdWUpOworCisJaWYgKEk0NjBfSU9fUEFHRV9TSElGVCA+IFBBR0VfU0hJRlQpCisJCWtmcmVlKGk0NjAubHBfZGVzYyk7Cit9CisKK3N0YXRpYyBpbnQgaTQ2MF9jb25maWd1cmUgKHZvaWQpCit7CisJdW5pb24geworCQl1MzIgc21hbGxbMl07CisJCXU2NCBsYXJnZTsKKwl9IHRlbXA7CisJc2l6ZV90IHNpemU7CisJdTggc2NyYXRjaDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCAqY3VycmVudF9zaXplOworCisJdGVtcC5sYXJnZSA9IDA7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCWk0NjBfd3JpdGVfYWdwc2l6KGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKgorCSAqIERvIHRoZSBuZWNlc3NhcnkgcmlnbWFyb2xlIHRvIHJlYWQgYWxsIGVpZ2h0IGJ5dGVzIG9mIEFQQkFTRS4KKwkgKiBUaGlzIGhhcyB0byBiZSBkb25lIHNpbmNlIHRoZSBBR1AgYXBlcnR1cmUgY2FuIGJlIGFib3ZlIDRHQiBvbgorCSAqIDQ2MCBiYXNlZCBzeXN0ZW1zLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIGk0NjAuZHluYW1pY19hcGJhc2UsICYodGVtcC5zbWFsbFswXSkpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIGk0NjAuZHluYW1pY19hcGJhc2UgKyA0LCAmKHRlbXAuc21hbGxbMV0pKTsKKworCS8qIENsZWFyIEJBUiBjb250cm9sIGJpdHMgKi8KKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gdGVtcC5sYXJnZSAmIH4oKDFVTCA8PCAzKSAtIDEpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JNDYwX0dYQkNUTCwgJnNjcmF0Y2gpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k0NjBfR1hCQ1RMLAorCQkJICAgICAgKHNjcmF0Y2ggJiAweDAyKSB8IEk0NjBfR1hCQ1RMX09PRyB8IEk0NjBfR1hCQ1RMX0JXQyk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgcGFydGlhbCBhbGxvY2F0aW9uIHRyYWNrZXJzIGlmIGEgR0FSVCBwYWdlIGlzIGJpZ2dlciB0aGFuIGEga2VybmVsCisJICogcGFnZS4KKwkgKi8KKwlpZiAoSTQ2MF9JT19QQUdFX1NISUZUID4gUEFHRV9TSElGVCkgeworCQlzaXplID0gY3VycmVudF9zaXplLT5udW1fZW50cmllcyAqIHNpemVvZihpNDYwLmxwX2Rlc2NbMF0pOworCQlpNDYwLmxwX2Rlc2MgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWk0NjAubHBfZGVzYykKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1zZXQoaTQ2MC5scF9kZXNjLCAwLCBzaXplKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTQ2MF9jcmVhdGVfZ2F0dF90YWJsZSAoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCWludCBwYWdlX29yZGVyLCBudW1fZW50cmllcywgaTsKKwl2b2lkICp0ZW1wOworCisJLyoKKwkgKiBMb2FkIHVwIHRoZSBmaXhlZCBhZGRyZXNzIG9mIHRoZSBHQVJUIFNSQU1TIHdoaWNoIGhvbGQgb3VyIEdBVFQgdGFibGUuCisJICovCisJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKwlwYWdlX29yZGVyID0gQV9TSVpFXzgodGVtcCktPnBhZ2Vfb3JkZXI7CisJbnVtX2VudHJpZXMgPSBBX1NJWkVfOCh0ZW1wKS0+bnVtX2VudHJpZXM7CisKKwlpNDYwLmdhdHQgPSBpb3JlbWFwKElOVEVMX0k0NjBfQVRUQkFTRSwgUEFHRV9TSVpFIDw8IHBhZ2Vfb3JkZXIpOworCisJLyogVGhlc2UgYXJlIG5vIGdvb2QsIHRoZSBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBhZ3BfYnJpZGdlIHN0cnVjdXJlLi4uICovCisJYWdwX2JyaWRnZS0+Z2F0dF90YWJsZV9yZWFsID0gTlVMTDsKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlID0gTlVMTDsKKwlhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgKytpKQorCQlXUl9HQVRUKGksIDApOworCVdSX0ZMVVNIX0dBVFQoaSAtIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk0NjBfZnJlZV9nYXR0X3RhYmxlIChzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJaW50IG51bV9lbnRyaWVzLCBpOworCXZvaWQgKnRlbXA7CisKKwl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOworCisJbnVtX2VudHJpZXMgPSBBX1NJWkVfOCh0ZW1wKS0+bnVtX2VudHJpZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7ICsraSkKKwkJV1JfR0FUVChpLCAwKTsKKwlXUl9GTFVTSF9HQVRUKG51bV9lbnRyaWVzIC0gMSk7CisKKwlpb3VubWFwKGk0NjAuZ2F0dCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdoZW4gdGhlIEkvTyAoR0FSVCkgcGFnZSBzaXplIGlzIHNtYWxsZXIgdGhhbgorICogUEFHRV9TSVpFLgorICovCisKK3N0YXRpYyBpbnQgaTQ2MF9pbnNlcnRfbWVtb3J5X3NtYWxsX2lvX3BhZ2UgKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sCisJCQkJb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCXVuc2lnbmVkIGxvbmcgcGFkZHIsIGlvX3BnX3N0YXJ0LCBpb19wYWdlX3NpemU7CisJaW50IGksIGosIGssIG51bV9lbnRyaWVzOworCXZvaWQgKnRlbXA7CisKKwlwcl9kZWJ1ZygiaTQ2MF9pbnNlcnRfbWVtb3J5X3NtYWxsX2lvX3BhZ2UobWVtPSVwLCBwZ19zdGFydD0lbGQsIHR5cGU9JWQsIHBhZGRyMD0weCVseClcbiIsCisJCSBtZW0sIHBnX3N0YXJ0LCB0eXBlLCBtZW0tPm1lbW9yeVswXSk7CisKKwlpb19wZ19zdGFydCA9IEk0NjBfSU9QQUdFU19QRVJfS1BBR0UgKiBwZ19zdGFydDsKKworCXRlbXAgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemU7CisJbnVtX2VudHJpZXMgPSBBX1NJWkVfOCh0ZW1wKS0+bnVtX2VudHJpZXM7CisKKwlpZiAoKGlvX3BnX3N0YXJ0ICsgSTQ2MF9JT1BBR0VTX1BFUl9LUEFHRSAqIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJMb29rcyBsaWtlIHdlJ3JlIG91dCBvZiBBR1AgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaiA9IGlvX3BnX3N0YXJ0OworCXdoaWxlIChqIDwgKGlvX3BnX3N0YXJ0ICsgSTQ2MF9JT1BBR0VTX1BFUl9LUEFHRSAqIG1lbS0+cGFnZV9jb3VudCkpIHsKKwkJaWYgKCFQR0VfRU1QVFkoYWdwX2JyaWRnZSwgUkRfR0FUVChqKSkpIHsKKwkJCXByX2RlYnVnKCJpNDYwX2luc2VydF9tZW1vcnlfc21hbGxfaW9fcGFnZTogR0FUVFslZF09MHgleCBpcyBidXN5XG4iLAorCQkJCSBqLCBSRF9HQVRUKGopKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJaisrOworCX0KKworCWlvX3BhZ2Vfc2l6ZSA9IDFVTCA8PCBJNDYwX0lPX1BBR0VfU0hJRlQ7CisJZm9yIChpID0gMCwgaiA9IGlvX3BnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyspIHsKKwkJcGFkZHIgPSBtZW0tPm1lbW9yeVtpXTsKKwkJZm9yIChrID0gMDsgayA8IEk0NjBfSU9QQUdFU19QRVJfS1BBR0U7IGsrKywgaisrLCBwYWRkciArPSBpb19wYWdlX3NpemUpCisJCQlXUl9HQVRUKGosIGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKKwkJCQlwYWRkciwgbWVtLT50eXBlKSk7CisJfQorCVdSX0ZMVVNIX0dBVFQoaiAtIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk0NjBfcmVtb3ZlX21lbW9yeV9zbWFsbF9pb19wYWdlKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sCisJCQkJb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWludCBpOworCisJcHJfZGVidWcoImk0NjBfcmVtb3ZlX21lbW9yeV9zbWFsbF9pb19wYWdlKG1lbT0lcCwgcGdfc3RhcnQ9JWxkLCB0eXBlPSVkKVxuIiwKKwkJIG1lbSwgcGdfc3RhcnQsIHR5cGUpOworCisJcGdfc3RhcnQgPSBJNDYwX0lPUEFHRVNfUEVSX0tQQUdFICogcGdfc3RhcnQ7CisKKwlmb3IgKGkgPSBwZ19zdGFydDsgaSA8IChwZ19zdGFydCArIEk0NjBfSU9QQUdFU19QRVJfS1BBR0UgKiBtZW0tPnBhZ2VfY291bnQpOyBpKyspCisJCVdSX0dBVFQoaSwgMCk7CisJV1JfRkxVU0hfR0FUVChpIC0gMSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZiBJNDYwX0xBUkdFX0lPX1BBR0VTCisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aGVuIHRoZSBJL08gKEdBUlQpIHBhZ2Ugc2l6ZSBleGNlZWRzIFBBR0VfU0laRS4KKyAqCisgKiBUaGlzIHNpdHVhdGlvbiBpcyBpbnRlcmVzdGluZyBzaW5jZSBBR1AgbWVtb3J5IGFsbG9jYXRpb25zIHRoYXQgYXJlIHNtYWxsZXIgdGhhbiBhCisgKiBzaW5nbGUgR0FSVCBwYWdlIGFyZSBwb3NzaWJsZS4gIFRoZSBpNDYwLmxwX2Rlc2MgYXJyYXkgdHJhY2tzIHBhcnRpYWwgYWxsb2NhdGlvbiBvZiB0aGUKKyAqIGxhcmdlIEdBUlQgcGFnZXMgdG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZS4KKyAqCisgKiBpNDYwLmxwX2Rlc2NbcGdfbnVtXS5yZWZjb3VudCB0cmFja3MgdGhlIG51bWJlciBvZiBrZXJuZWwgcGFnZXMgaW4gdXNlIHdpdGhpbiBHQVJUIHBhZ2UKKyAqIHBnX251bS4gIGk0NjAubHBfZGVzY1twZ19udW1dLnBhZGRyIGlzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBsYXJnZSBwYWdlIGFuZAorICogaTQ2MC5scF9kZXNjW3BnX251bV0uYWxsb2NlZF9tYXAgaXMgYSBiaXRtYXAgb2Yga2VybmVsIHBhZ2VzIHRoYXQgYXJlIGluIHVzZSAoYWxsb2NhdGVkKS4KKyAqLworCitzdGF0aWMgaW50IGk0NjBfYWxsb2NfbGFyZ2VfcGFnZSAoc3RydWN0IGxwX2Rlc2MgKmxwKQoreworCXVuc2lnbmVkIGxvbmcgb3JkZXIgPSBJNDYwX0lPX1BBR0VfU0hJRlQgLSBQQUdFX1NISUZUOworCXNpemVfdCBtYXBfc2l6ZTsKKwl2b2lkICpscGFnZTsKKworCWxwYWdlID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7CisJaWYgKCFscGFnZSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZG4ndCBhbGxvYyA0TSBHQVJUIHBhZ2UuLi5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltYXBfc2l6ZSA9ICgoSTQ2MF9LUEFHRVNfUEVSX0lPUEFHRSArIEJJVFNfUEVSX0xPTkcgLSAxKSAmIC1CSVRTX1BFUl9MT05HKS84OworCWxwLT5hbGxvY2VkX21hcCA9IGttYWxsb2MobWFwX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghbHAtPmFsbG9jZWRfbWFwKSB7CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGxwYWdlLCBvcmRlcik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIk91dCBvZiBtZW1vcnksIHdlJ3JlIGluIHRyb3VibGUuLi5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGxwLT5hbGxvY2VkX21hcCwgMCwgbWFwX3NpemUpOworCisJbHAtPnBhZGRyID0gdmlydF90b19waHlzKGxwYWdlKTsKKwlscC0+cmVmY291bnQgPSAwOworCWF0b21pY19hZGQoSTQ2MF9LUEFHRVNfUEVSX0lPUEFHRSwgJmFncF9icmlkZ2UtPmN1cnJlbnRfbWVtb3J5X2FncCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGk0NjBfZnJlZV9sYXJnZV9wYWdlIChzdHJ1Y3QgbHBfZGVzYyAqbHApCit7CisJa2ZyZWUobHAtPmFsbG9jZWRfbWFwKTsKKwlscC0+YWxsb2NlZF9tYXAgPSBOVUxMOworCisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgcGh5c190b192aXJ0KGxwLT5wYWRkciksIEk0NjBfSU9fUEFHRV9TSElGVCAtIFBBR0VfU0hJRlQpOworCWF0b21pY19zdWIoSTQ2MF9LUEFHRVNfUEVSX0lPUEFHRSwgJmFncF9icmlkZ2UtPmN1cnJlbnRfbWVtb3J5X2FncCk7Cit9CisKK3N0YXRpYyBpbnQgaTQ2MF9pbnNlcnRfbWVtb3J5X2xhcmdlX2lvX3BhZ2UgKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sCisJCQkJb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWludCBpLCBzdGFydF9vZmZzZXQsIGVuZF9vZmZzZXQsIGlkeCwgcGcsIG51bV9lbnRyaWVzOworCXN0cnVjdCBscF9kZXNjICpzdGFydCwgKmVuZCwgKmxwOworCXZvaWQgKnRlbXA7CisKKwl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOworCW51bV9lbnRyaWVzID0gQV9TSVpFXzgodGVtcCktPm51bV9lbnRyaWVzOworCisJLyogRmlndXJlIG91dCB3aGF0IHBnX3N0YXJ0IG1lYW5zIGluIHRlcm1zIG9mIG91ciBsYXJnZSBHQVJUIHBhZ2VzICovCisJc3RhcnQJIAk9ICZpNDYwLmxwX2Rlc2NbcGdfc3RhcnQgLyBJNDYwX0tQQUdFU19QRVJfSU9QQUdFXTsKKwllbmQgCQk9ICZpNDYwLmxwX2Rlc2NbKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50IC0gMSkgLyBJNDYwX0tQQUdFU19QRVJfSU9QQUdFXTsKKwlzdGFydF9vZmZzZXQgCT0gcGdfc3RhcnQgJSBJNDYwX0tQQUdFU19QRVJfSU9QQUdFOworCWVuZF9vZmZzZXQgCT0gKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50IC0gMSkgJSBJNDYwX0tQQUdFU19QRVJfSU9QQUdFOworCisJaWYgKGVuZCA+IGk0NjAubHBfZGVzYyArIG51bV9lbnRyaWVzKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkxvb2tzIGxpa2Ugd2UncmUgb3V0IG9mIEFHUCBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBvZiB0aGUgYXBlcnR1cmUgaXMgZnJlZSAqLworCWZvciAobHAgPSBzdGFydDsgbHAgPD0gZW5kOyArK2xwKSB7CisJCWlmICghbHAtPmFsbG9jZWRfbWFwKQorCQkJY29udGludWU7CS8qIE9LLCB0aGUgZW50aXJlIGxhcmdlIHBhZ2UgaXMgYXZhaWxhYmxlLi4uICovCisKKwkJZm9yIChpZHggPSAoKGxwID09IHN0YXJ0KSA/IHN0YXJ0X29mZnNldCA6IDApOworCQkgICAgIGlkeCA8ICgobHAgPT0gZW5kKSA/IChlbmRfb2Zmc2V0ICsgMSkgOiBJNDYwX0tQQUdFU19QRVJfSU9QQUdFKTsKKwkJICAgICBpZHgrKykKKwkJeworCQkJaWYgKHRlc3RfYml0KGlkeCwgbHAtPmFsbG9jZWRfbWFwKSkKKwkJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCisJZm9yIChscCA9IHN0YXJ0LCBpID0gMDsgbHAgPD0gZW5kOyArK2xwKSB7CisJCWlmICghbHAtPmFsbG9jZWRfbWFwKSB7CisJCQkvKiBBbGxvY2F0ZSBuZXcgR0FSVCBwYWdlcy4uLiAqLworCQkJaWYgKGk0NjBfYWxsb2NfbGFyZ2VfcGFnZShscCkgPCAwKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJcGcgPSBscCAtIGk0NjAubHBfZGVzYzsKKwkJCVdSX0dBVFQocGcsIGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKKwkJCQlscC0+cGFkZHIsIDApKTsKKwkJCVdSX0ZMVVNIX0dBVFQocGcpOworCQl9CisKKwkJZm9yIChpZHggPSAoKGxwID09IHN0YXJ0KSA/IHN0YXJ0X29mZnNldCA6IDApOworCQkgICAgIGlkeCA8ICgobHAgPT0gZW5kKSA/IChlbmRfb2Zmc2V0ICsgMSkgOiBJNDYwX0tQQUdFU19QRVJfSU9QQUdFKTsKKwkJICAgICBpZHgrKywgaSsrKQorCQl7CisJCQltZW0tPm1lbW9yeVtpXSA9IGxwLT5wYWRkciArIGlkeCpQQUdFX1NJWkU7CisJCQlfX3NldF9iaXQoaWR4LCBscC0+YWxsb2NlZF9tYXApOworCQkJKytscC0+cmVmY291bnQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTQ2MF9yZW1vdmVfbWVtb3J5X2xhcmdlX2lvX3BhZ2UgKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sCisJCQkJb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWludCBpLCBwZywgc3RhcnRfb2Zmc2V0LCBlbmRfb2Zmc2V0LCBpZHgsIG51bV9lbnRyaWVzOworCXN0cnVjdCBscF9kZXNjICpzdGFydCwgKmVuZCwgKmxwOworCXZvaWQgKnRlbXA7CisKKwl0ZW1wID0gYWdwX2JyaWRnZS0+ZHJpdmVyLT5jdXJyZW50X3NpemU7CisJbnVtX2VudHJpZXMgPSBBX1NJWkVfOCh0ZW1wKS0+bnVtX2VudHJpZXM7CisKKwkvKiBGaWd1cmUgb3V0IHdoYXQgcGdfc3RhcnQgbWVhbnMgaW4gdGVybXMgb2Ygb3VyIGxhcmdlIEdBUlQgcGFnZXMgKi8KKwlzdGFydAkgCT0gJmk0NjAubHBfZGVzY1twZ19zdGFydCAvIEk0NjBfS1BBR0VTX1BFUl9JT1BBR0VdOworCWVuZCAJCT0gJmk0NjAubHBfZGVzY1socGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQgLSAxKSAvIEk0NjBfS1BBR0VTX1BFUl9JT1BBR0VdOworCXN0YXJ0X29mZnNldCAJPSBwZ19zdGFydCAlIEk0NjBfS1BBR0VTX1BFUl9JT1BBR0U7CisJZW5kX29mZnNldCAJPSAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQgLSAxKSAlIEk0NjBfS1BBR0VTX1BFUl9JT1BBR0U7CisKKwlmb3IgKGkgPSAwLCBscCA9IHN0YXJ0OyBscCA8PSBlbmQ7ICsrbHApIHsKKwkJZm9yIChpZHggPSAoKGxwID09IHN0YXJ0KSA/IHN0YXJ0X29mZnNldCA6IDApOworCQkgICAgIGlkeCA8ICgobHAgPT0gZW5kKSA/IChlbmRfb2Zmc2V0ICsgMSkgOiBJNDYwX0tQQUdFU19QRVJfSU9QQUdFKTsKKwkJICAgICBpZHgrKywgaSsrKQorCQl7CisJCQltZW0tPm1lbW9yeVtpXSA9IDA7CisJCQlfX2NsZWFyX2JpdChpZHgsIGxwLT5hbGxvY2VkX21hcCk7CisJCQktLWxwLT5yZWZjb3VudDsKKwkJfQorCisJCS8qIEZyZWUgR0FSVCBwYWdlcyBpZiB0aGV5IGFyZSB1bnVzZWQgKi8KKwkJaWYgKGxwLT5yZWZjb3VudCA9PSAwKSB7CisJCQlwZyA9IGxwIC0gaTQ2MC5scF9kZXNjOworCQkJV1JfR0FUVChwZywgMCk7CisJCQlXUl9GTFVTSF9HQVRUKHBnKTsKKwkJCWk0NjBfZnJlZV9sYXJnZV9wYWdlKGxwKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogV3JhcHBlciByb3V0aW5lcyB0byBjYWxsIHRoZSBhcHByb3JpYXRlIHtzbWFsbF9pb19wYWdlLGxhcmdlX2lvX3BhZ2V9IGZ1bmN0aW9uICovCisKK3N0YXRpYyBpbnQgaTQ2MF9pbnNlcnRfbWVtb3J5IChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLAorCQkJCW9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKK3sKKwlpZiAoSTQ2MF9JT19QQUdFX1NISUZUIDw9IFBBR0VfU0hJRlQpCisJCXJldHVybiBpNDYwX2luc2VydF9tZW1vcnlfc21hbGxfaW9fcGFnZShtZW0sIHBnX3N0YXJ0LCB0eXBlKTsKKwllbHNlCisJCXJldHVybiBpNDYwX2luc2VydF9tZW1vcnlfbGFyZ2VfaW9fcGFnZShtZW0sIHBnX3N0YXJ0LCB0eXBlKTsKK30KKworc3RhdGljIGludCBpNDYwX3JlbW92ZV9tZW1vcnkgKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sCisJCQkJb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWlmIChJNDYwX0lPX1BBR0VfU0hJRlQgPD0gUEFHRV9TSElGVCkKKwkJcmV0dXJuIGk0NjBfcmVtb3ZlX21lbW9yeV9zbWFsbF9pb19wYWdlKG1lbSwgcGdfc3RhcnQsIHR5cGUpOworCWVsc2UKKwkJcmV0dXJuIGk0NjBfcmVtb3ZlX21lbW9yeV9sYXJnZV9pb19wYWdlKG1lbSwgcGdfc3RhcnQsIHR5cGUpOworfQorCisvKgorICogSWYgdGhlIEkvTyAoR0FSVCkgcGFnZSBzaXplIGlzIGJpZ2dlciB0aGFuIHRoZSBrZXJuZWwgcGFnZSBzaXplLCB3ZSBkb24ndCB3YW50IHRvCisgKiBhbGxvY2F0ZSBtZW1vcnkgdW50aWwgd2Uga25vdyB3aGVyZSBpdCBpcyB0byBiZSBib3VuZCBpbiB0aGUgYXBlcnR1cmUgKGEKKyAqIG11bHRpLWtlcm5lbC1wYWdlIGFsbG9jIG1pZ2h0IGZpdCBpbnNpZGUgb2YgYW4gYWxyZWFkeSBhbGxvY2F0ZWQgR0FSVCBwYWdlKS4KKyAqCisgKiBMZXQncyBqdXN0IGhvcGUgbm9ib2R5IGNvdW50cyBvbiB0aGUgYWxsb2NhdGVkIEFHUCBtZW1vcnkgYmVpbmcgdGhlcmUgYmVmb3JlIGJpbmQgdGltZQorICogKEkgZG9uJ3QgdGhpbmsgY3VycmVudCBkcml2ZXJzIGRvKS4uLgorICovCitzdGF0aWMgdm9pZCAqaTQ2MF9hbGxvY19wYWdlIChzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJdm9pZCAqcGFnZTsKKworCWlmIChJNDYwX0lPX1BBR0VfU0hJRlQgPD0gUEFHRV9TSElGVCkKKwkJcGFnZSA9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UoYWdwX2JyaWRnZSk7CisJZWxzZQorCQkvKiBSZXR1cm5pbmcgTlVMTCB3b3VsZCBjYXVzZSBwcm9ibGVtcyAqLworCQkvKiBBSzogcmVhbGx5IGR1YmlvdXMgY29kZS4gKi8KKwkJcGFnZSA9ICh2b2lkICopfjBVTDsKKwlyZXR1cm4gcGFnZTsKK30KKworc3RhdGljIHZvaWQgaTQ2MF9kZXN0cm95X3BhZ2UgKHZvaWQgKnBhZ2UpCit7CisJaWYgKEk0NjBfSU9fUEFHRV9TSElGVCA8PSBQQUdFX1NISUZUKQorCQlhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UocGFnZSk7Cit9CisKKyNlbmRpZiAvKiBJNDYwX0xBUkdFX0lPX1BBR0VTICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGk0NjBfbWFza19tZW1vcnkgKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGludCB0eXBlKQoreworCS8qIE1ha2Ugc3VyZSB0aGUgcmV0dXJuZWQgYWRkcmVzcyBpcyBhIHZhbGlkIEdBVFQgZW50cnkgKi8KKwlyZXR1cm4gYnJpZGdlLT5kcml2ZXItPm1hc2tzWzBdLm1hc2sKKwkJfCAoKChhZGRyICYgfigoMSA8PCBJNDYwX0lPX1BBR0VfU0hJRlQpIC0gMSkpICYgMHhmZmZmZmYwMDApID4+IDEyKTsKK30KKworc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsX2k0NjBfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9IGk0NjBfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDMsCisJLmNvbmZpZ3VyZQkJPSBpNDYwX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSBpNDYwX2ZldGNoX3NpemUsCisJLmNsZWFudXAJCT0gaTQ2MF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaTQ2MF90bGJfZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGk0NjBfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBpNDYwX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGk0NjBfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGk0NjBfZnJlZV9nYXR0X3RhYmxlLAorI2lmIEk0NjBfTEFSR0VfSU9fUEFHRVMKKwkuaW5zZXJ0X21lbW9yeQkJPSBpNDYwX2luc2VydF9tZW1vcnksCisJLnJlbW92ZV9tZW1vcnkJCT0gaTQ2MF9yZW1vdmVfbWVtb3J5LAorCS5hZ3BfYWxsb2NfcGFnZQkJPSBpNDYwX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBpNDYwX2Rlc3Ryb3lfcGFnZSwKKyNlbHNlCisJLmluc2VydF9tZW1vcnkJCT0gaTQ2MF9pbnNlcnRfbWVtb3J5X3NtYWxsX2lvX3BhZ2UsCisJLnJlbW92ZV9tZW1vcnkJCT0gaTQ2MF9yZW1vdmVfbWVtb3J5X3NtYWxsX2lvX3BhZ2UsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisjZW5kaWYKKwkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAorCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAorCS5jYW50X3VzZV9hcGVydHVyZQk9IDEsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZ3BfaW50ZWxfaTQ2MF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZTsKKwl1OCBjYXBfcHRyOworCisJY2FwX3B0ciA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9BR1ApOworCWlmICghY2FwX3B0cikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlicmlkZ2UgPSBhZ3BfYWxsb2NfYnJpZGdlKCk7CisJaWYgKCFicmlkZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfaTQ2MF9kcml2ZXI7CisJYnJpZGdlLT5kZXYgPSBwZGV2OworCWJyaWRnZS0+Y2FwbmR4ID0gY2FwX3B0cjsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBJbnRlbCA0NjBHWCBjaGlwc2V0XG4iKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX2ludGVsX2k0NjBfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFncF9yZW1vdmVfYnJpZGdlKGJyaWRnZSk7CisJYWdwX3B1dF9icmlkZ2UoYnJpZGdlKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFncF9pbnRlbF9pNDYwX3BjaV90YWJsZVtdID0geworCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfSU5URUxfODQ0NjBHWCwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFncF9pbnRlbF9pNDYwX3BjaV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZ3BfaW50ZWxfaTQ2MF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJhZ3BnYXJ0LWludGVsLWk0NjAiLAorCS5pZF90YWJsZQk9IGFncF9pbnRlbF9pNDYwX3BjaV90YWJsZSwKKwkucHJvYmUJCT0gYWdwX2ludGVsX2k0NjBfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZ3BfaW50ZWxfaTQ2MF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWdwX2ludGVsX2k0NjBfaW5pdCh2b2lkKQoreworCWlmIChhZ3Bfb2ZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWdwX2ludGVsX2k0NjBfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3BfaW50ZWxfaTQ2MF9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZ3BfaW50ZWxfaTQ2MF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWdwX2ludGVsX2k0NjBfaW5pdCk7Cittb2R1bGVfZXhpdChhZ3BfaW50ZWxfaTQ2MF9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiQ2hyaXMgQWhuYSA8Q2hyaXN0b3BoZXIuSi5BaG5hQGludGVsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzdkNzI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYwpAQCAtMCwwICsxLDE4MzMgQEAKKy8qCisgKiBJbnRlbCBBR1BHQVJUIHJvdXRpbmVzLgorICovCisKKy8qCisgKiBJbnRlbChSKSA4NTVHTS84NTJHTSBhbmQgODY1RyBzdXBwb3J0IGFkZGVkIGJ5IERhdmlkIERhd2VzCisgKiA8ZGF3ZXNAdHVuZ3N0ZW5ncmFwaGljcy5jb20+LgorICoKKyAqIEludGVsKFIpIDkxNUcvOTE1R00gc3VwcG9ydCBhZGRlZCBieSBBbGFuIEhvdXJpaGFuZQorICogPGFsYW5oQHR1bmdzdGVuZ3JhcGhpY3MuY29tPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgorI2luY2x1ZGUgImFncC5oIgorCisvKiBJbnRlbCA4MTUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU5URUxfODE1X0FQQ09OVAkweDUxCisjZGVmaW5lIElOVEVMXzgxNV9BVFRCQVNFX01BU0sJfjB4MUZGRkZGRkYKKworLyogSW50ZWwgaTgyMCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSU5URUxfSTgyMF9SRENSCQkweDUxCisjZGVmaW5lIElOVEVMX0k4MjBfRVJSU1RTCTB4YzgKKworLyogSW50ZWwgaTg0MCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSU5URUxfSTg0MF9NQ0hDRkcJMHg1MAorI2RlZmluZSBJTlRFTF9JODQwX0VSUlNUUwkweGM4CisKKy8qIEludGVsIGk4NTAgcmVnaXN0ZXJzICovCisjZGVmaW5lIElOVEVMX0k4NTBfTUNIQ0ZHCTB4NTAKKyNkZWZpbmUgSU5URUxfSTg1MF9FUlJTVFMJMHhjOAorCisvKiBpbnRlbCA5MTVHIHJlZ2lzdGVycyAqLworI2RlZmluZSBJOTE1X0dNQUREUgkweDE4CisjZGVmaW5lIEk5MTVfTU1BRERSCTB4MTAKKyNkZWZpbmUgSTkxNV9QVEVBRERSCTB4MUMKKyNkZWZpbmUgSTkxNV9HTUNIX0dNU19TVE9MRU5fNDhNCSgweDYgPDwgNCkKKyNkZWZpbmUgSTkxNV9HTUNIX0dNU19TVE9MRU5fNjRNCSgweDcgPDwgNCkKKworCisvKiBJbnRlbCA3NTA1IHJlZ2lzdGVycyAqLworI2RlZmluZSBJTlRFTF9JNzUwNV9BUFNJWkUJMHg3NAorI2RlZmluZSBJTlRFTF9JNzUwNV9OQ0FQSUQJMHg2MAorI2RlZmluZSBJTlRFTF9JNzUwNV9OSVNUQVQJMHg2YworI2RlZmluZSBJTlRFTF9JNzUwNV9BVFRCQVNFCTB4NzgKKyNkZWZpbmUgSU5URUxfSTc1MDVfRVJSU1RTCTB4NDIKKyNkZWZpbmUgSU5URUxfSTc1MDVfQUdQQ1RSTAkweDcwCisjZGVmaW5lIElOVEVMX0k3NTA1X01DSENGRwkweDUwCisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fZml4ZWQgaW50ZWxfaTgxMF9zaXplc1tdID0KK3sKKwl7NjQsIDE2Mzg0LCA0fSwKKwkvKiBUaGUgMzJNIG1vZGUgc3RpbGwgcmVxdWlyZXMgYSA2NGsgZ2F0dCAqLworCXszMiwgODE5MiwgNH0KK307CisKKyNkZWZpbmUgQUdQX0RDQUNIRV9NRU1PUlkJMQorI2RlZmluZSBBR1BfUEhZU19NRU1PUlkJCTIKKworc3RhdGljIHN0cnVjdCBnYXR0X21hc2sgaW50ZWxfaTgxMF9tYXNrc1tdID0KK3sKKwl7Lm1hc2sgPSBJODEwX1BURV9WQUxJRCwgLnR5cGUgPSAwfSwKKwl7Lm1hc2sgPSAoSTgxMF9QVEVfVkFMSUQgfCBJODEwX1BURV9MT0NBTCksIC50eXBlID0gQUdQX0RDQUNIRV9NRU1PUll9LAorCXsubWFzayA9IEk4MTBfUFRFX1ZBTElELCAudHlwZSA9IDB9Cit9OworCitzdGF0aWMgc3RydWN0IF9pbnRlbF9pODEwX3ByaXZhdGUgeworCXN0cnVjdCBwY2lfZGV2ICppODEwX2RldjsJLyogZGV2aWNlIG9uZSAqLworCXZvbGF0aWxlIHU4IF9faW9tZW0gKnJlZ2lzdGVyczsKKwlpbnQgbnVtX2RjYWNoZV9lbnRyaWVzOworfSBpbnRlbF9pODEwX3ByaXZhdGU7CisKK3N0YXRpYyBpbnQgaW50ZWxfaTgxMF9mZXRjaF9zaXplKHZvaWQpCit7CisJdTMyIHNtcmFtX21pc2NjOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCAqdmFsdWVzOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSTgxMF9TTVJBTV9NSVNDQywgJnNtcmFtX21pc2NjKTsKKwl2YWx1ZXMgPSBBX1NJWkVfRklYKGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCisJaWYgKChzbXJhbV9taXNjYyAmIEk4MTBfR01TKSA9PSBJODEwX0dNU19ESVNBQkxFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJpODEwIGlzIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICgoc21yYW1fbWlzY2MgJiBJODEwX0dGWF9NRU1fV0lOX1NJWkUpID09IEk4MTBfR0ZYX01FTV9XSU5fMzJNKSB7CisJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgKHZhbHVlcyArIDEpOworCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IDE7CisJCXJldHVybiB2YWx1ZXNbMV0uc2l6ZTsKKwl9IGVsc2UgeworCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0KKwkJCWFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMpOworCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IDA7CisJCXJldHVybiB2YWx1ZXNbMF0uc2l6ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF9pODEwX2NvbmZpZ3VyZSh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCAqY3VycmVudF9zaXplOworCXUzMiB0ZW1wOworCWludCBpOworCisJY3VycmVudF9zaXplID0gQV9TSVpFX0ZJWChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGludGVsX2k4MTBfcHJpdmF0ZS5pODEwX2RldiwgSTgxMF9NTUFERFIsICZ0ZW1wKTsKKwl0ZW1wICY9IDB4ZmZmODAwMDA7CisKKwlpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzID0gaW9yZW1hcCh0ZW1wLCAxMjggKiA0MDk2KTsKKwlpZiAoIWludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHJlbWFwIG1lbW9yeS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoKHJlYWRsKGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9EUkFNX0NUTCkKKwkJJiBJODEwX0RSQU1fUk9XXzApID09IEk4MTBfRFJBTV9ST1dfMF9TRFJBTSkgeworCQkvKiBUaGlzIHdpbGwgbmVlZCB0byBiZSBkeW5hbWljYWxseSBhc3NpZ25lZCAqLworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZGV0ZWN0ZWQgNE1CIGRlZGljYXRlZCB2aWRlbyByYW0uXG4iKTsKKwkJaW50ZWxfaTgxMF9wcml2YXRlLm51bV9kY2FjaGVfZW50cmllcyA9IDEwMjQ7CisJfQorCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpbnRlbF9pODEwX3ByaXZhdGUuaTgxMF9kZXYsIEk4MTBfR01BRERSLCAmdGVtcCk7CisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisJd3JpdGVsKGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIgfCBJODEwX1BHRVRCTF9FTkFCTEVELCBpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7CisJcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BHRVRCTF9DVEwpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKworCWlmIChhZ3BfYnJpZGdlLT5kcml2ZXItPm5lZWRzX3NjcmF0Y2hfcGFnZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY3VycmVudF9zaXplLT5udW1fZW50cmllczsgaSsrKSB7CisJCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGkqNCkpOworCQkJcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKyhpKjQpKTsJLyogUENJIHBvc3RpbmcuICovCisJCX0KKwl9CisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2k4MTBfY2xlYW51cCh2b2lkKQoreworCXdyaXRlbCgwLCBpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7CisJcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycyk7CS8qIFBDSSBQb3N0aW5nLiAqLworCWlvdW5tYXAoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycyk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2k4MTBfdGxiZmx1c2goc3RydWN0IGFncF9tZW1vcnkgKm1lbSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2k4MTBfYWdwX2VuYWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHUzMiBtb2RlKQoreworCXJldHVybjsKK30KKworLyogRXhpc3RzIHRvIHN1cHBvcnQgQVJHQiBjdXJzb3JzICovCitzdGF0aWMgdm9pZCAqaTh4eF9hbGxvY19wYWdlcyh2b2lkKQoreworCXN0cnVjdCBwYWdlICogcGFnZTsKKworCXBhZ2UgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMLCAyKTsKKwlpZiAocGFnZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChjaGFuZ2VfcGFnZV9hdHRyKHBhZ2UsIDQsIFBBR0VfS0VSTkVMX05PQ0FDSEUpIDwgMCkgeworCQlnbG9iYWxfZmx1c2hfdGxiKCk7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZ2xvYmFsX2ZsdXNoX3RsYigpOworCWdldF9wYWdlKHBhZ2UpOworCVNldFBhZ2VMb2NrZWQocGFnZSk7CisJYXRvbWljX2luYygmYWdwX2JyaWRnZS0+Y3VycmVudF9tZW1vcnlfYWdwKTsKKwlyZXR1cm4gcGFnZV9hZGRyZXNzKHBhZ2UpOworfQorCitzdGF0aWMgdm9pZCBpOHh4X2Rlc3Ryb3lfcGFnZXModm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWlmIChhZGRyID09IE5VTEwpCisJCXJldHVybjsKKworCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoYWRkcik7CisJY2hhbmdlX3BhZ2VfYXR0cihwYWdlLCA0LCBQQUdFX0tFUk5FTCk7CisJZ2xvYmFsX2ZsdXNoX3RsYigpOworCXB1dF9wYWdlKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYWRkciwgMik7CisJYXRvbWljX2RlYygmYWdwX2JyaWRnZS0+Y3VycmVudF9tZW1vcnlfYWdwKTsKK30KKworc3RhdGljIGludCBpbnRlbF9pODEwX2luc2VydF9lbnRyaWVzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LAorCQkJCWludCB0eXBlKQoreworCWludCBpLCBqLCBudW1fZW50cmllczsKKwl2b2lkICp0ZW1wOworCisJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKwludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOworCisJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZm9yIChqID0gcGdfc3RhcnQ7IGogPCAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpOyBqKyspIHsKKwkJaWYgKCFQR0VfRU1QVFkoYWdwX2JyaWRnZSwgcmVhZGwoYWdwX2JyaWRnZS0+Z2F0dF90YWJsZStqKSkpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKKwkJaWYgKCh0eXBlID09IEFHUF9EQ0FDSEVfTUVNT1JZKSAmJiAobWVtLT50eXBlID09IEFHUF9EQ0FDSEVfTUVNT1JZKSkgeworCQkJLyogc3BlY2lhbCBpbnNlcnQgKi8KKwkJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCQkJZm9yIChpID0gcGdfc3RhcnQ7IGkgPCAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpOyBpKyspIHsKKwkJCQl3cml0ZWwoKGkqNDA5Nil8STgxMF9QVEVfTE9DQUx8STgxMF9QVEVfVkFMSUQsIGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CisJCQkJcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKyhpKjQpKTsJLyogUENJIFBvc3RpbmcuICovCisJCQl9CisJCQlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwkJCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZigodHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpICYmIChtZW0tPnR5cGUgPT0gQUdQX1BIWVNfTUVNT1JZKSkKKwkJCWdvdG8gaW5zZXJ0OworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKK2luc2VydDoKKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwlmb3IgKGkgPSAwLCBqID0gcGdfc3RhcnQ7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKywgaisrKSB7CisJCXdyaXRlbChhZ3BfYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGFncF9icmlkZ2UsCisJCQltZW0tPm1lbW9yeVtpXSwgbWVtLT50eXBlKSwKKwkJCWludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaio0KSk7CisJCXJlYWRsKGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaio0KSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKworCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfaTgxMF9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwKKwkJCQlpbnQgdHlwZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKG1lbS0+cGFnZV9jb3VudCArIHBnX3N0YXJ0KTsgaSsrKSB7CisJCXdyaXRlbChhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2UsIGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CisJCXJlYWRsKGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgaTgxMC9pODMwIHJlcXVpcmVzIGEgcGh5c2ljYWwgYWRkcmVzcyB0byBwcm9ncmFtIGl0cyBtb3VzZQorICogcG9pbnRlciBpbnRvIGhhcmR3YXJlLgorICogSG93ZXZlciB0aGUgWHNlcnZlciBzdGlsbCB3cml0ZXMgdG8gaXQgdGhyb3VnaCB0aGUgYWdwIGFwZXJ0dXJlLgorICovCitzdGF0aWMgc3RydWN0IGFncF9tZW1vcnkgKmFsbG9jX2FncHBoeXNtZW1faTh4eChzaXplX3QgcGdfY291bnQsIGludCB0eXBlKQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICpuZXc7CisJdm9pZCAqYWRkcjsKKworCWlmIChwZ19jb3VudCAhPSAxICYmIHBnX2NvdW50ICE9IDQpCisJCXJldHVybiBOVUxMOworCisJc3dpdGNoIChwZ19jb3VudCkgeworCWNhc2UgMTogYWRkciA9IGFncF9icmlkZ2UtPmRyaXZlci0+YWdwX2FsbG9jX3BhZ2UoYWdwX2JyaWRnZSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJLyoga2x1ZGdlIHRvIGdldCA0IHBoeXNpY2FsIHBhZ2VzIGZvciBBUkdCIGN1cnNvciAqLworCQlhZGRyID0gaTh4eF9hbGxvY19wYWdlcygpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoYWRkciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW5ldyA9IGFncF9jcmVhdGVfbWVtb3J5KHBnX2NvdW50KTsKKwlpZiAobmV3ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbmV3LT5tZW1vcnlbMF0gPSB2aXJ0X3RvX3BoeXMoYWRkcik7CisJaWYgKHBnX2NvdW50ID09IDQpIHsKKwkJLyoga2x1ZGdlIHRvIGdldCA0IHBoeXNpY2FsIHBhZ2VzIGZvciBBUkdCIGN1cnNvciAqLworCQluZXctPm1lbW9yeVsxXSA9IG5ldy0+bWVtb3J5WzBdICsgUEFHRV9TSVpFOworCQluZXctPm1lbW9yeVsyXSA9IG5ldy0+bWVtb3J5WzFdICsgUEFHRV9TSVpFOworCQluZXctPm1lbW9yeVszXSA9IG5ldy0+bWVtb3J5WzJdICsgUEFHRV9TSVpFOworCX0KKwluZXctPnBhZ2VfY291bnQgPSBwZ19jb3VudDsKKwluZXctPm51bV9zY3JhdGNoX3BhZ2VzID0gcGdfY291bnQ7CisJbmV3LT50eXBlID0gQUdQX1BIWVNfTUVNT1JZOworCW5ldy0+cGh5c2ljYWwgPSBuZXctPm1lbW9yeVswXTsKKwlyZXR1cm4gbmV3OworfQorCitzdGF0aWMgc3RydWN0IGFncF9tZW1vcnkgKmludGVsX2k4MTBfYWxsb2NfYnlfdHlwZShzaXplX3QgcGdfY291bnQsIGludCB0eXBlKQoreworCXN0cnVjdCBhZ3BfbWVtb3J5ICpuZXc7CisKKwlpZiAodHlwZSA9PSBBR1BfRENBQ0hFX01FTU9SWSkgeworCQlpZiAocGdfY291bnQgIT0gaW50ZWxfaTgxMF9wcml2YXRlLm51bV9kY2FjaGVfZW50cmllcykKKwkJCXJldHVybiBOVUxMOworCisJCW5ldyA9IGFncF9jcmVhdGVfbWVtb3J5KDEpOworCQlpZiAobmV3ID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKworCQluZXctPnR5cGUgPSBBR1BfRENBQ0hFX01FTU9SWTsKKwkJbmV3LT5wYWdlX2NvdW50ID0gcGdfY291bnQ7CisJCW5ldy0+bnVtX3NjcmF0Y2hfcGFnZXMgPSAwOworCQl2ZnJlZShuZXctPm1lbW9yeSk7CisJCXJldHVybiBuZXc7CisJfQorCWlmICh0eXBlID09IEFHUF9QSFlTX01FTU9SWSkKKwkJcmV0dXJuIGFsbG9jX2FncHBoeXNtZW1faTh4eChwZ19jb3VudCwgdHlwZSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfaTgxMF9mcmVlX2J5X3R5cGUoc3RydWN0IGFncF9tZW1vcnkgKmN1cnIpCit7CisJYWdwX2ZyZWVfa2V5KGN1cnItPmtleSk7CisJaWYoY3Vyci0+dHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpIHsKKwkJaWYgKGN1cnItPnBhZ2VfY291bnQgPT0gNCkKKwkJCWk4eHhfZGVzdHJveV9wYWdlcyhwaHlzX3RvX3ZpcnQoY3Vyci0+bWVtb3J5WzBdKSk7CisJCWVsc2UKKwkJCWFncF9icmlkZ2UtPmRyaXZlci0+YWdwX2Rlc3Ryb3lfcGFnZSgKKwkJCQkgcGh5c190b192aXJ0KGN1cnItPm1lbW9yeVswXSkpOworCQl2ZnJlZShjdXJyLT5tZW1vcnkpOworCX0KKwlrZnJlZShjdXJyKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50ZWxfaTgxMF9tYXNrX21lbW9yeShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsCisJdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgdHlwZSkKK3sKKwkvKiBUeXBlIGNoZWNraW5nIG11c3QgYmUgZG9uZSBlbHNld2hlcmUgKi8KKwlyZXR1cm4gYWRkciB8IGJyaWRnZS0+ZHJpdmVyLT5tYXNrc1t0eXBlXS5tYXNrOworfQorCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkIGludGVsX2k4MzBfc2l6ZXNbXSA9Cit7CisJezEyOCwgMzI3NjgsIDV9LAorCS8qIFRoZSA2NE0gbW9kZSBzdGlsbCByZXF1aXJlcyBhIDEyOGsgZ2F0dCAqLworCXs2NCwgMTYzODQsIDV9LAorCXsyNTYsIDY1NTM2LCA2fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgX2ludGVsX2k4MzBfcHJpdmF0ZSB7CisJc3RydWN0IHBjaV9kZXYgKmk4MzBfZGV2OwkJLyogZGV2aWNlIG9uZSAqLworCXZvbGF0aWxlIHU4IF9faW9tZW0gKnJlZ2lzdGVyczsKKwl2b2xhdGlsZSB1MzIgX19pb21lbSAqZ3R0OwkJLyogSTkxNUcgKi8KKwlpbnQgZ3R0X2VudHJpZXM7Cit9IGludGVsX2k4MzBfcHJpdmF0ZTsKKworc3RhdGljIHZvaWQgaW50ZWxfaTgzMF9pbml0X2d0dF9lbnRyaWVzKHZvaWQpCit7CisJdTE2IGdtY2hfY3RybDsKKwlpbnQgZ3R0X2VudHJpZXM7CisJdTggcmRjdDsKKwlpbnQgbG9jYWwgPSAwOworCXN0YXRpYyBjb25zdCBpbnQgZGR0WzRdID0geyAwLCAxNiwgMzIsIDY0IH07CisJaW50IHNpemU7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsSTgzMF9HTUNIX0NUUkwsJmdtY2hfY3RybCk7CisKKwkvKiBXZSBvYnRhaW4gdGhlIHNpemUgb2YgdGhlIEdUVCwgd2hpY2ggaXMgYWxzbyBzdG9yZWQgKGZvciBzb21lCisJICogcmVhc29uKSBhdCB0aGUgdG9wIG9mIHN0b2xlbiBtZW1vcnkuIFRoZW4gd2UgYWRkIDRLQiB0byB0aGF0CisJICogZm9yIHRoZSB2aWRlbyBCSU9TIHBvcHVwLCB3aGljaCBpcyBhbHNvIHN0b3JlZCBpbiB0aGVyZS4gKi8KKwlzaXplID0gYWdwX2JyaWRnZS0+ZHJpdmVyLT5mZXRjaF9zaXplKCkgKyA0OworCisJaWYgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MzBfSEIgfHwKKwkgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjg0NUdfSEIpIHsKKwkJc3dpdGNoIChnbWNoX2N0cmwgJiBJODMwX0dNQ0hfR01TX01BU0spIHsKKwkJY2FzZSBJODMwX0dNQ0hfR01TX1NUT0xFTl81MTI6CisJCQlndHRfZW50cmllcyA9IEtCKDUxMikgLSBLQihzaXplKTsKKwkJCWJyZWFrOworCQljYXNlIEk4MzBfR01DSF9HTVNfU1RPTEVOXzEwMjQ6CisJCQlndHRfZW50cmllcyA9IE1CKDEpIC0gS0Ioc2l6ZSk7CisJCQlicmVhazsKKwkJY2FzZSBJODMwX0dNQ0hfR01TX1NUT0xFTl84MTkyOgorCQkJZ3R0X2VudHJpZXMgPSBNQig4KSAtIEtCKHNpemUpOworCQkJYnJlYWs7CisJCWNhc2UgSTgzMF9HTUNIX0dNU19MT0NBTDoKKwkJCXJkY3QgPSByZWFkYihpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MzBfUkRSQU1fQ0hBTk5FTF9UWVBFKTsKKwkJCWd0dF9lbnRyaWVzID0gKEk4MzBfUkRSQU1fTkQocmRjdCkgKyAxKSAqCisJCQkJCU1CKGRkdFtJODMwX1JEUkFNX0REVChyZGN0KV0pOworCQkJbG9jYWwgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlndHRfZW50cmllcyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoZ21jaF9jdHJsICYgSTgzMF9HTUNIX0dNU19NQVNLKSB7CisJCWNhc2UgSTg1NV9HTUNIX0dNU19TVE9MRU5fMU06CisJCQlndHRfZW50cmllcyA9IE1CKDEpIC0gS0Ioc2l6ZSk7CisJCQlicmVhazsKKwkJY2FzZSBJODU1X0dNQ0hfR01TX1NUT0xFTl80TToKKwkJCWd0dF9lbnRyaWVzID0gTUIoNCkgLSBLQihzaXplKTsKKwkJCWJyZWFrOworCQljYXNlIEk4NTVfR01DSF9HTVNfU1RPTEVOXzhNOgorCQkJZ3R0X2VudHJpZXMgPSBNQig4KSAtIEtCKHNpemUpOworCQkJYnJlYWs7CisJCWNhc2UgSTg1NV9HTUNIX0dNU19TVE9MRU5fMTZNOgorCQkJZ3R0X2VudHJpZXMgPSBNQigxNikgLSBLQihzaXplKTsKKwkJCWJyZWFrOworCQljYXNlIEk4NTVfR01DSF9HTVNfU1RPTEVOXzMyTToKKwkJCWd0dF9lbnRyaWVzID0gTUIoMzIpIC0gS0Ioc2l6ZSk7CisJCQlicmVhazsKKwkJY2FzZSBJOTE1X0dNQ0hfR01TX1NUT0xFTl80OE06CisJCQkvKiBDaGVjayBpdCdzIHJlYWxseSBJOTE1RyAqLworCQkJaWYgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5MTVHX0hCIHx8CisJCQkgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjkxNUdNX0hCKQorCQkJCWd0dF9lbnRyaWVzID0gTUIoNDgpIC0gS0Ioc2l6ZSk7CisJCQllbHNlCisJCQkJZ3R0X2VudHJpZXMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgSTkxNV9HTUNIX0dNU19TVE9MRU5fNjRNOgorCQkJLyogQ2hlY2sgaXQncyByZWFsbHkgSTkxNUcgKi8KKwkJCWlmIChhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTE1R19IQiB8fAorCQkJICAgIGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5MTVHTV9IQikKKwkJCQlndHRfZW50cmllcyA9IE1CKDY0KSAtIEtCKHNpemUpOworCQkJZWxzZQorCQkJCWd0dF9lbnRyaWVzID0gMDsKKwkJZGVmYXVsdDoKKwkJCWd0dF9lbnRyaWVzID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChndHRfZW50cmllcyA+IDApCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCAlZEsgJXMgbWVtb3J5LlxuIiwKKwkJICAgICAgIGd0dF9lbnRyaWVzIC8gS0IoMSksIGxvY2FsID8gImxvY2FsIiA6ICJzdG9sZW4iKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCSAgICAgICAiTm8gcHJlLWFsbG9jYXRlZCB2aWRlbyBtZW1vcnkgZGV0ZWN0ZWQuXG4iKTsKKwlndHRfZW50cmllcyAvPSBLQig0KTsKKworCWludGVsX2k4MzBfcHJpdmF0ZS5ndHRfZW50cmllcyA9IGd0dF9lbnRyaWVzOworfQorCisvKiBUaGUgaW50ZWwgaTgzMCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVzIHRoZSBhZ3AgYXBlcnR1cmUgZHVyaW5nIFBPU1QuCisgKiBVc2UgdGhlIG1lbW9yeSBhbHJlYWR5IHNldCBhc2lkZSBmb3IgaW4gdGhlIEdUVC4KKyAqLworc3RhdGljIGludCBpbnRlbF9pODMwX2NyZWF0ZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlpbnQgcGFnZV9vcmRlcjsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fZml4ZWQgKnNpemU7CisJaW50IG51bV9lbnRyaWVzOworCXUzMiB0ZW1wOworCisJc2l6ZSA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKwlwYWdlX29yZGVyID0gc2l6ZS0+cGFnZV9vcmRlcjsKKwludW1fZW50cmllcyA9IHNpemUtPm51bV9lbnRyaWVzOworCWFncF9icmlkZ2UtPmdhdHRfdGFibGVfcmVhbCA9IE5VTEw7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfaTgzMF9wcml2YXRlLmk4MzBfZGV2LEk4MTBfTU1BRERSLCZ0ZW1wKTsKKwl0ZW1wICY9IDB4ZmZmODAwMDA7CisKKwlpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzID0gaW9yZW1hcCh0ZW1wLDEyOCAqIDQwOTYpOworCWlmICghaW50ZWxfaTgzMF9wcml2YXRlLnJlZ2lzdGVycykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0ZW1wID0gcmVhZGwoaW50ZWxfaTgzMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BHRVRCTF9DVEwpICYgMHhmZmZmZjAwMDsKKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsJLyogRklYTUU6ID8/ICovCisKKwkvKiB3ZSBoYXZlIHRvIGNhbGwgdGhpcyBhcyBlYXJseSBhcyBwb3NzaWJsZSBhZnRlciB0aGUgTU1JTyBiYXNlIGFkZHJlc3MgaXMga25vd24gKi8KKwlpbnRlbF9pODMwX2luaXRfZ3R0X2VudHJpZXMoKTsKKworCWFncF9icmlkZ2UtPmdhdHRfdGFibGUgPSBOVUxMOworCisJYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkciA9IHRlbXA7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSBnYXR0IHRhYmxlIHRvIGEgc2FuZSBzdGF0ZS4gVXNlIHRoZSB0b3Agb2Ygc3RvbGVuCisgKiBtZW1vcnkgZm9yIHRoZSBHVFQuCisgKi8KK3N0YXRpYyBpbnQgaW50ZWxfaTgzMF9mcmVlX2dhdHRfdGFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsX2k4MzBfZmV0Y2hfc2l6ZSh2b2lkKQoreworCXUxNiBnbWNoX2N0cmw7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICp2YWx1ZXM7CisKKwl2YWx1ZXMgPSBBX1NJWkVfRklYKGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCisJaWYgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MzBfSEIgJiYKKwkgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjg0NUdfSEIpIHsKKwkJLyogODU1R00vODUyR00vODY1RyBoYXMgMTI4TUIgYXBlcnR1cmUgc2l6ZSAqLworCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgdmFsdWVzOworCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IDA7CisJCXJldHVybiB2YWx1ZXNbMF0uc2l6ZTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsSTgzMF9HTUNIX0NUUkwsJmdtY2hfY3RybCk7CisKKwlpZiAoKGdtY2hfY3RybCAmIEk4MzBfR01DSF9NRU1fTUFTSykgPT0gSTgzMF9HTUNIX01FTV8xMjhNKSB7CisJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSB2YWx1ZXM7CisJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gMDsKKwkJcmV0dXJuIHZhbHVlc1swXS5zaXplOworCX0gZWxzZSB7CisJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzICsgMSk7CisJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gMTsKKwkJcmV0dXJuIHZhbHVlc1sxXS5zaXplOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsX2k4MzBfY29uZmlndXJlKHZvaWQpCit7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICpjdXJyZW50X3NpemU7CisJdTMyIHRlbXA7CisJdTE2IGdtY2hfY3RybDsKKwlpbnQgaTsKKworCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV9GSVgoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpbnRlbF9pODMwX3ByaXZhdGUuaTgzMF9kZXYsSTgxMF9HTUFERFIsJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LEk4MzBfR01DSF9DVFJMLCZnbWNoX2N0cmwpOworCWdtY2hfY3RybCB8PSBJODMwX0dNQ0hfRU5BQkxFRDsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LEk4MzBfR01DSF9DVFJMLGdtY2hfY3RybCk7CisKKwl3cml0ZWwoYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkcnxJODEwX1BHRVRCTF9FTkFCTEVELCBpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7CisJcmVhZGwoaW50ZWxfaTgzMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BHRVRCTF9DVEwpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKworCWlmIChhZ3BfYnJpZGdlLT5kcml2ZXItPm5lZWRzX3NjcmF0Y2hfcGFnZSkgeworCQlmb3IgKGkgPSBpbnRlbF9pODMwX3ByaXZhdGUuZ3R0X2VudHJpZXM7IGkgPCBjdXJyZW50X3NpemUtPm51bV9lbnRyaWVzOyBpKyspIHsKKwkJCXdyaXRlbChhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2UsIGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CisJCQlyZWFkbChpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGkqNCkpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwkJfQorCX0KKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9pODMwX2NsZWFudXAodm9pZCkKK3sKKwlpb3VubWFwKGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMpOworfQorCitzdGF0aWMgaW50IGludGVsX2k4MzBfaW5zZXJ0X2VudHJpZXMoc3RydWN0IGFncF9tZW1vcnkgKm1lbSxvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJaW50IGksaixudW1fZW50cmllczsKKwl2b2lkICp0ZW1wOworCisJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKwludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOworCisJaWYgKHBnX3N0YXJ0IDwgaW50ZWxfaTgzMF9wcml2YXRlLmd0dF9lbnRyaWVzKSB7CisJCXByaW50ayAoS0VSTl9ERUJVRyBQRlggInBnX3N0YXJ0ID09IDB4JS44bHgsaW50ZWxfaTgzMF9wcml2YXRlLmd0dF9lbnRyaWVzID09IDB4JS44eFxuIiwKKwkJCQlwZ19zdGFydCxpbnRlbF9pODMwX3ByaXZhdGUuZ3R0X2VudHJpZXMpOworCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVHJ5aW5nIHRvIGluc2VydCBpbnRvIGxvY2FsL3N0b2xlbiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoZSBpODMwIGNhbid0IGNoZWNrIHRoZSBHVFQgZm9yIGVudHJpZXMgc2luY2UgaXRzIHJlYWQgb25seSwKKwkgKiBkZXBlbmQgb24gdGhlIGNhbGxlciB0byBtYWtlIHRoZSBjb3JyZWN0IG9mZnNldCBkZWNpc2lvbnMuCisJICovCisKKwlpZiAoKHR5cGUgIT0gMCAmJiB0eXBlICE9IEFHUF9QSFlTX01FTU9SWSkgfHwKKwkJKG1lbS0+dHlwZSAhPSAwICYmIG1lbS0+dHlwZSAhPSBBR1BfUEhZU19NRU1PUlkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOwkvKiBGSVhNRTogTmVjZXNzYXJ5ID8qLworCisJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgeworCQl3cml0ZWwoYWdwX2JyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAorCQkJbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksCisJCQlpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGoqNCkpOworCQlyZWFkbChpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGoqNCkpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisKKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwlhZ3BfYnJpZGdlLT5kcml2ZXItPnRsYl9mbHVzaChtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsX2k4MzBfcmVtb3ZlX2VudHJpZXMoc3RydWN0IGFncF9tZW1vcnkgKm1lbSxvZmZfdCBwZ19zdGFydCwKKwkJCQlpbnQgdHlwZSkKK3sKKwlpbnQgaTsKKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCisJaWYgKHBnX3N0YXJ0IDwgaW50ZWxfaTgzMF9wcml2YXRlLmd0dF9lbnRyaWVzKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVHJ5aW5nIHRvIGRpc2FibGUgbG9jYWwvc3RvbGVuIG1lbW9yeVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKG1lbS0+cGFnZV9jb3VudCArIHBnX3N0YXJ0KTsgaSsrKSB7CisJCXdyaXRlbChhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2UsIGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CisJCXJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX21lbW9yeSAqaW50ZWxfaTgzMF9hbGxvY19ieV90eXBlKHNpemVfdCBwZ19jb3VudCxpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpCisJCXJldHVybiBhbGxvY19hZ3BwaHlzbWVtX2k4eHgocGdfY291bnQsIHR5cGUpOworCisJLyogYWx3YXlzIHJldHVybiBOVUxMIGZvciBvdGhlciBhbGxvY2F0aW9uIHR5cGVzIGZvciBub3cgKi8KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBpbnRlbF9pOTE1X2NvbmZpZ3VyZSh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCAqY3VycmVudF9zaXplOworCXUzMiB0ZW1wOworCXUxNiBnbWNoX2N0cmw7CisJaW50IGk7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfRklYKGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfaTgzMF9wcml2YXRlLmk4MzBfZGV2LCBJOTE1X0dNQUREUiwgJnRlbXApOworCisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsSTgzMF9HTUNIX0NUUkwsJmdtY2hfY3RybCk7CisJZ21jaF9jdHJsIHw9IEk4MzBfR01DSF9FTkFCTEVEOworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsSTgzMF9HTUNIX0NUUkwsZ21jaF9jdHJsKTsKKworCXdyaXRlbChhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyfEk4MTBfUEdFVEJMX0VOQUJMRUQsIGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsKKwlyZWFkbChpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7CS8qIFBDSSBQb3N0aW5nLiAqLworCisJaWYgKGFncF9icmlkZ2UtPmRyaXZlci0+bmVlZHNfc2NyYXRjaF9wYWdlKSB7CisJCWZvciAoaSA9IGludGVsX2k4MzBfcHJpdmF0ZS5ndHRfZW50cmllczsgaSA8IGN1cnJlbnRfc2l6ZS0+bnVtX2VudHJpZXM7IGkrKykgeworCQkJd3JpdGVsKGFncF9icmlkZ2UtPnNjcmF0Y2hfcGFnZSwgaW50ZWxfaTgzMF9wcml2YXRlLmd0dCtpKTsKKwkJCXJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5ndHQraSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCQl9CisJfQorCisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2k5MTVfY2xlYW51cCh2b2lkKQoreworCWlvdW5tYXAoaW50ZWxfaTgzMF9wcml2YXRlLmd0dCk7CisJaW91bm1hcChpbnRlbF9pODMwX3ByaXZhdGUucmVnaXN0ZXJzKTsKK30KKworc3RhdGljIGludCBpbnRlbF9pOTE1X2luc2VydF9lbnRyaWVzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sb2ZmX3QgcGdfc3RhcnQsCisJCQkJaW50IHR5cGUpCit7CisJaW50IGksaixudW1fZW50cmllczsKKwl2b2lkICp0ZW1wOworCisJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKwludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOworCisJaWYgKHBnX3N0YXJ0IDwgaW50ZWxfaTgzMF9wcml2YXRlLmd0dF9lbnRyaWVzKSB7CisJCXByaW50ayAoS0VSTl9ERUJVRyBQRlggInBnX3N0YXJ0ID09IDB4JS44bHgsaW50ZWxfaTgzMF9wcml2YXRlLmd0dF9lbnRyaWVzID09IDB4JS44eFxuIiwKKwkJCQlwZ19zdGFydCxpbnRlbF9pODMwX3ByaXZhdGUuZ3R0X2VudHJpZXMpOworCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVHJ5aW5nIHRvIGluc2VydCBpbnRvIGxvY2FsL3N0b2xlbiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoZSBpODMwIGNhbid0IGNoZWNrIHRoZSBHVFQgZm9yIGVudHJpZXMgc2luY2UgaXRzIHJlYWQgb25seSwKKwkgKiBkZXBlbmQgb24gdGhlIGNhbGxlciB0byBtYWtlIHRoZSBjb3JyZWN0IG9mZnNldCBkZWNpc2lvbnMuCisJICovCisKKwlpZiAoKHR5cGUgIT0gMCAmJiB0eXBlICE9IEFHUF9QSFlTX01FTU9SWSkgfHwKKwkJKG1lbS0+dHlwZSAhPSAwICYmIG1lbS0+dHlwZSAhPSBBR1BfUEhZU19NRU1PUlkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCisJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgeworCQl3cml0ZWwoYWdwX2JyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAorCQkJbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksIGludGVsX2k4MzBfcHJpdmF0ZS5ndHQraik7CisJCXJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5ndHQraik7CS8qIFBDSSBQb3N0aW5nLiAqLworCX0KKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfaTkxNV9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLG9mZl90IHBnX3N0YXJ0LAorCQkJCWludCB0eXBlKQoreworCWludCBpOworCisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisKKwlpZiAocGdfc3RhcnQgPCBpbnRlbF9pODMwX3ByaXZhdGUuZ3R0X2VudHJpZXMpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJUcnlpbmcgdG8gZGlzYWJsZSBsb2NhbC9zdG9sZW4gbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gcGdfc3RhcnQ7IGkgPCAobWVtLT5wYWdlX2NvdW50ICsgcGdfc3RhcnQpOyBpKyspIHsKKwkJd3JpdGVsKGFncF9icmlkZ2UtPnNjcmF0Y2hfcGFnZSwgaW50ZWxfaTgzMF9wcml2YXRlLmd0dCtpKTsKKwkJcmVhZGwoaW50ZWxfaTgzMF9wcml2YXRlLmd0dCtpKTsKKwl9CisKKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwlhZ3BfYnJpZGdlLT5kcml2ZXItPnRsYl9mbHVzaChtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsX2k5MTVfZmV0Y2hfc2l6ZSh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCAqdmFsdWVzOworCXUzMiB0ZW1wLCBvZmZzZXQgPSAwOworCisjZGVmaW5lIEk5MTVfMjU2TUJfQUREUkVTU19NQVNLICgxPDwyNykKKworCXZhbHVlcyA9IEFfU0laRV9GSVgoYWdwX2JyaWRnZS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcyk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfaTgzMF9wcml2YXRlLmk4MzBfZGV2LCBJOTE1X0dNQUREUiwgJnRlbXApOworCWlmICh0ZW1wICYgSTkxNV8yNTZNQl9BRERSRVNTX01BU0spCisJCW9mZnNldCA9IDA7CS8qIDEyOE1CIGFwZXJ0dXJlICovCisJZWxzZQorCQlvZmZzZXQgPSAyOwkvKiAyNTZNQiBhcGVydHVyZSAqLworCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSh2YWx1ZXMgKyBvZmZzZXQpOworCXJldHVybiB2YWx1ZXNbb2Zmc2V0XS5zaXplOworfQorCisvKiBUaGUgaW50ZWwgaTkxNSBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVzIHRoZSBhZ3AgYXBlcnR1cmUgZHVyaW5nIFBPU1QuCisgKiBVc2UgdGhlIG1lbW9yeSBhbHJlYWR5IHNldCBhc2lkZSBmb3IgaW4gdGhlIEdUVC4KKyAqLworc3RhdGljIGludCBpbnRlbF9pOTE1X2NyZWF0ZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlpbnQgcGFnZV9vcmRlcjsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fZml4ZWQgKnNpemU7CisJaW50IG51bV9lbnRyaWVzOworCXUzMiB0ZW1wLCB0ZW1wMjsKKworCXNpemUgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemU7CisJcGFnZV9vcmRlciA9IHNpemUtPnBhZ2Vfb3JkZXI7CisJbnVtX2VudHJpZXMgPSBzaXplLT5udW1fZW50cmllczsKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwgPSBOVUxMOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGludGVsX2k4MzBfcHJpdmF0ZS5pODMwX2RldiwgSTkxNV9NTUFERFIsICZ0ZW1wKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfaTgzMF9wcml2YXRlLmk4MzBfZGV2LCBJOTE1X1BURUFERFIsJnRlbXAyKTsKKworCWludGVsX2k4MzBfcHJpdmF0ZS5ndHQgPSBpb3JlbWFwKHRlbXAyLCAyNTYgKiAxMDI0KTsKKwlpZiAoIWludGVsX2k4MzBfcHJpdmF0ZS5ndHQpCisJCXJldHVybiAtRU5PTUVNOworCisJdGVtcCAmPSAweGZmZjgwMDAwOworCisJaW50ZWxfaTgzMF9wcml2YXRlLnJlZ2lzdGVycyA9IGlvcmVtYXAodGVtcCwxMjggKiA0MDk2KTsKKwlpZiAoIWludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMpCisJCXJldHVybiAtRU5PTUVNOworCisJdGVtcCA9IHJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKSAmIDB4ZmZmZmYwMDA7CisJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CS8qIEZJWE1FOiA/ICovCisKKwkvKiB3ZSBoYXZlIHRvIGNhbGwgdGhpcyBhcyBlYXJseSBhcyBwb3NzaWJsZSBhZnRlciB0aGUgTU1JTyBiYXNlIGFkZHJlc3MgaXMga25vd24gKi8KKwlpbnRlbF9pODMwX2luaXRfZ3R0X2VudHJpZXMoKTsKKworCWFncF9icmlkZ2UtPmdhdHRfdGFibGUgPSBOVUxMOworCisJYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkciA9IHRlbXA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF9mZXRjaF9zaXplKHZvaWQpCit7CisJaW50IGk7CisJdTE2IHRlbXA7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzE2ICp2YWx1ZXM7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FQU0laRSwgJnRlbXApOworCXZhbHVlcyA9IEFfU0laRV8xNihhZ3BfYnJpZGdlLT5kcml2ZXItPmFwZXJ0dXJlX3NpemVzKTsKKworCWZvciAoaSA9IDA7IGkgPCBhZ3BfYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplczsgaSsrKSB7CisJCWlmICh0ZW1wID09IHZhbHVlc1tpXS5zaXplX3ZhbHVlKSB7CisJCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgKHZhbHVlcyArIGkpOworCQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQkJcmV0dXJuIHZhbHVlc1tpXS5zaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbnRlbF84eHhfZmV0Y2hfc2l6ZSh1OCB0ZW1wKQoreworCWludCBpOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICp2YWx1ZXM7CisKKwl2YWx1ZXMgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5kcml2ZXItPmFwZXJ0dXJlX3NpemVzKTsKKworCWZvciAoaSA9IDA7IGkgPCBhZ3BfYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplczsgaSsrKSB7CisJCWlmICh0ZW1wID09IHZhbHVlc1tpXS5zaXplX3ZhbHVlKSB7CisJCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0KKwkJCQlhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzICsgaSk7CisJCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IGk7CisJCQlyZXR1cm4gdmFsdWVzW2ldLnNpemU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfOHh4X2ZldGNoX3NpemUodm9pZCkKK3sKKwl1OCB0ZW1wOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsICZ0ZW1wKTsKKwlyZXR1cm4gX19pbnRlbF84eHhfZmV0Y2hfc2l6ZSh0ZW1wKTsKK30KKworc3RhdGljIGludCBpbnRlbF84MTVfZmV0Y2hfc2l6ZSh2b2lkKQoreworCXU4IHRlbXA7CisKKwkvKiBJbnRlbCA4MTUgY2hpcHNldHMgaGF2ZSBhIF93ZWlyZF8gQVBTSVpFIHJlZ2lzdGVyIHdpdGggb25seQorCSAqIG9uZSBub24tcmVzZXJ2ZWQgYml0LCBzbyBtYXNrIHRoZSBvdGhlcnMgb3V0IC4uLiAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVBTSVpFLCAmdGVtcCk7CisJdGVtcCAmPSAoMSA8PCAzKTsKKworCXJldHVybiBfX2ludGVsXzh4eF9mZXRjaF9zaXplKHRlbXApOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDIyMDApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDIyODApOworfQorCisKK3N0YXRpYyB2b2lkIGludGVsXzh4eF90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXUzMiB0ZW1wOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FHUENUUkwsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQUdQQ1RSTCwgdGVtcCAmIH4oMSA8PCA3KSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQUdQQ1RSTCwgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCB0ZW1wIHwgKDEgPDwgNykpOworfQorCisKK3N0YXRpYyB2b2lkIGludGVsX2NsZWFudXAodm9pZCkKK3sKKwl1MTYgdGVtcDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMTYgKnByZXZpb3VzX3NpemU7CisKKwlwcmV2aW91c19zaXplID0gQV9TSVpFXzE2KGFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfTkJYQ0ZHLCAmdGVtcCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfTkJYQ0ZHLCB0ZW1wICYgfigxIDw8IDkpKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsIHByZXZpb3VzX3NpemUtPnNpemVfdmFsdWUpOworfQorCisKK3N0YXRpYyB2b2lkIGludGVsXzh4eF9jbGVhbnVwKHZvaWQpCit7CisJdTE2IHRlbXA7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKnByZXZpb3VzX3NpemU7CisKKwlwcmV2aW91c19zaXplID0gQV9TSVpFXzgoYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9OQlhDRkcsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9OQlhDRkcsIHRlbXAgJiB+KDEgPDwgOSkpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FQU0laRSwgcHJldmlvdXNfc2l6ZS0+c2l6ZV92YWx1ZSk7Cit9CisKKworc3RhdGljIGludCBpbnRlbF9jb25maWd1cmUodm9pZCkKK3sKKwl1MzIgdGVtcDsKKwl1MTYgdGVtcDI7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzE2ICpjdXJyZW50X3NpemU7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfMTYoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKKworCS8qIGFwZXJ0dXJlIHNpemUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKiBhZGRyZXNzIHRvIG1hcCB0byAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFHUF9BUEJBU0UsICZ0ZW1wKTsKKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKTsKKworCS8qIGF0dGJhc2UgLSBhcGVydHVyZSBiYXNlICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FUVEJBU0UsIGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIpOworCisJLyogYWdwY3RybCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDIyODApOworCisJLyogcGFjY2ZnL25ieGNmZyAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfTkJYQ0ZHLCAmdGVtcDIpOworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX05CWENGRywKKwkJCSh0ZW1wMiAmIH4oMSA8PCAxMCkpIHwgKDEgPDwgOSkpOworCS8qIGNsZWFyIGFueSBwb3NzaWJsZSBlcnJvciBjb25kaXRpb25zICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfRVJSU1RTICsgMSwgNyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfODE1X2NvbmZpZ3VyZSh2b2lkKQoreworCXUzMiB0ZW1wLCBhZGRyOworCXU4IHRlbXAyOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpjdXJyZW50X3NpemU7CisKKwkvKiBhdHRiYXNlIC0gYXBlcnR1cmUgYmFzZSAqLworCS8qIHRoZSBJbnRlbCA4MTUgY2hpcHNldCBzcGVjLiBzYXlzIHRoYXQgYml0cyAyOS0zMSBpbiB0aGUKKwkqIEFUVEJBU0UgcmVnaXN0ZXIgYXJlIHJlc2VydmVkIC0+IHRyeSBub3QgdG8gd3JpdGUgdGhlbSAqLworCWlmIChhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyICYgSU5URUxfODE1X0FUVEJBU0VfTUFTSykgeworCQlwcmludGsgKEtFUk5fRU1FUkcgUEZYICJnYXR0IGJ1cyBhZGRyIHRvbyBoaWdoIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV84KGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwkvKiBhcGVydHVyZSBzaXplICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVBTSVpFLAorCQkJY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKworCS8qIGFkZHJlc3MgdG8gbWFwIHRvICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVRUQkFTRSwgJmFkZHIpOworCWFkZHIgJj0gSU5URUxfODE1X0FUVEJBU0VfTUFTSzsKKwlhZGRyIHw9IGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHI7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FUVEJBU0UsIGFkZHIpOworCisJLyogYWdwY3RybCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDAwMDApOworCisJLyogYXBjb250ICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF84MTVfQVBDT05ULCAmdGVtcDIpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMXzgxNV9BUENPTlQsIHRlbXAyIHwgKDEgPDwgMSkpOworCisJLyogY2xlYXIgYW55IHBvc3NpYmxlIGVycm9yIGNvbmRpdGlvbnMgKi8KKwkvKiBPZGRuZXNzIDogdGhpcyBjaGlwc2V0IHNlZW1zIHRvIGhhdmUgbm8gRVJSU1RTIHJlZ2lzdGVyICEgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfODIwX3RsYmZsdXNoKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF84MjBfY2xlYW51cCh2b2lkKQoreworCXU4IHRlbXA7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKnByZXZpb3VzX3NpemU7CisKKwlwcmV2aW91c19zaXplID0gQV9TSVpFXzgoYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JODIwX1JEQ1IsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JODIwX1JEQ1IsCisJCQl0ZW1wICYgfigxIDw8IDEpKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsCisJCQlwcmV2aW91c19zaXplLT5zaXplX3ZhbHVlKTsKK30KKworCitzdGF0aWMgaW50IGludGVsXzgyMF9jb25maWd1cmUodm9pZCkKK3sKKwl1MzIgdGVtcDsKKwl1OCB0ZW1wMjsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCAqY3VycmVudF9zaXplOworCisJY3VycmVudF9zaXplID0gQV9TSVpFXzgoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKKworCS8qIGFwZXJ0dXJlIHNpemUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKiBhZGRyZXNzIHRvIG1hcCB0byAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFHUF9BUEJBU0UsICZ0ZW1wKTsKKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKTsKKworCS8qIGF0dGJhc2UgLSBhcGVydHVyZSBiYXNlICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FUVEJBU0UsIGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIpOworCisJLyogYWdwY3RybCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDAwMDApOworCisJLyogZ2xvYmFsIGVuYWJsZSBhcGVydHVyZSBhY2Nlc3MgKi8KKwkvKiBUaGlzIGZsYWcgaXMgbm90IGFjY2Vzc2VkIHRocm91Z2ggTUNIQ0ZHIHJlZ2lzdGVyIGFzIGluICovCisJLyogaTg1MCBjaGlwc2V0LiAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTgyMF9SRENSLCAmdGVtcDIpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4MjBfUkRDUiwgdGVtcDIgfCAoMSA8PCAxKSk7CisJLyogY2xlYXIgYW55IHBvc3NpYmxlIEFHUC1yZWxhdGVkIGVycm9yIGNvbmRpdGlvbnMgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JODIwX0VSUlNUUywgMHgwMDFjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF84NDBfY29uZmlndXJlKHZvaWQpCit7CisJdTMyIHRlbXA7CisJdTE2IHRlbXAyOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpjdXJyZW50X3NpemU7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJLyogYXBlcnR1cmUgc2l6ZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FQU0laRSwgY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKworCS8qIGFkZHJlc3MgdG8gbWFwIHRvICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJLyogYXR0YmFzZSAtIGFwZXJ0dXJlIGJhc2UgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVRUQkFTRSwgYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkcik7CisKKwkvKiBhZ3BjdHJsICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FHUENUUkwsIDB4MDAwMCk7CisKKwkvKiBtY2djZmcgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NDBfTUNIQ0ZHLCAmdGVtcDIpOworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NDBfTUNIQ0ZHLCB0ZW1wMiB8ICgxIDw8IDkpKTsKKwkvKiBjbGVhciBhbnkgcG9zc2libGUgZXJyb3IgY29uZGl0aW9ucyAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NDBfRVJSU1RTLCAweGMwMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsXzg0NV9jb25maWd1cmUodm9pZCkKK3sKKwl1MzIgdGVtcDsKKwl1OCB0ZW1wMjsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCAqY3VycmVudF9zaXplOworCisJY3VycmVudF9zaXplID0gQV9TSVpFXzgoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKKworCS8qIGFwZXJ0dXJlIHNpemUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKiBhZGRyZXNzIHRvIG1hcCB0byAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFHUF9BUEJBU0UsICZ0ZW1wKTsKKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKTsKKworCS8qIGF0dGJhc2UgLSBhcGVydHVyZSBiYXNlICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FUVEJBU0UsIGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIpOworCisJLyogYWdwY3RybCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDAwMDApOworCisJLyogYWdwbSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTg0NV9BR1BNLCAmdGVtcDIpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NDVfQUdQTSwgdGVtcDIgfCAoMSA8PCAxKSk7CisJLyogY2xlYXIgYW55IHBvc3NpYmxlIGVycm9yIGNvbmRpdGlvbnMgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JODQ1X0VSUlNUUywgMHgwMDFjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF84NTBfY29uZmlndXJlKHZvaWQpCit7CisJdTMyIHRlbXA7CisJdTE2IHRlbXAyOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpjdXJyZW50X3NpemU7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJLyogYXBlcnR1cmUgc2l6ZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FQU0laRSwgY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKworCS8qIGFkZHJlc3MgdG8gbWFwIHRvICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJLyogYXR0YmFzZSAtIGFwZXJ0dXJlIGJhc2UgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVRUQkFTRSwgYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkcik7CisKKwkvKiBhZ3BjdHJsICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FHUENUUkwsIDB4MDAwMCk7CisKKwkvKiBtY2djZmcgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NTBfTUNIQ0ZHLCAmdGVtcDIpOworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NTBfTUNIQ0ZHLCB0ZW1wMiB8ICgxIDw8IDkpKTsKKwkvKiBjbGVhciBhbnkgcG9zc2libGUgQUdQLXJlbGF0ZWQgZXJyb3IgY29uZGl0aW9ucyAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4NTBfRVJSU1RTLCAweDAwMWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsXzg2MF9jb25maWd1cmUodm9pZCkKK3sKKwl1MzIgdGVtcDsKKwl1MTYgdGVtcDI7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKmN1cnJlbnRfc2l6ZTsKKworCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV84KGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwkvKiBhcGVydHVyZSBzaXplICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVBTSVpFLCBjdXJyZW50X3NpemUtPnNpemVfdmFsdWUpOworCisJLyogYWRkcmVzcyB0byBtYXAgdG8gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBR1BfQVBCQVNFLCAmdGVtcCk7CisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisKKwkvKiBhdHRiYXNlIC0gYXBlcnR1cmUgYmFzZSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BVFRCQVNFLCBhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyKTsKKworCS8qIGFncGN0cmwgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQUdQQ1RSTCwgMHgwMDAwKTsKKworCS8qIG1jZ2NmZyAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTg2MF9NQ0hDRkcsICZ0ZW1wMik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTg2MF9NQ0hDRkcsIHRlbXAyIHwgKDEgPDwgOSkpOworCS8qIGNsZWFyIGFueSBwb3NzaWJsZSBBR1AtcmVsYXRlZCBlcnJvciBjb25kaXRpb25zICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTg2MF9FUlJTVFMsIDB4ZjcwMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfODMwbXBfY29uZmlndXJlKHZvaWQpCit7CisJdTMyIHRlbXA7CisJdTE2IHRlbXAyOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpjdXJyZW50X3NpemU7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJLyogYXBlcnR1cmUgc2l6ZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FQU0laRSwgY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKworCS8qIGFkZHJlc3MgdG8gbWFwIHRvICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJLyogYXR0YmFzZSAtIGFwZXJ0dXJlIGJhc2UgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfQVRUQkFTRSwgYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkcik7CisKKwkvKiBhZ3BjdHJsICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FHUENUUkwsIDB4MDAwMCk7CisKKwkvKiBnbWNoICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9OQlhDRkcsICZ0ZW1wMik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfTkJYQ0ZHLCB0ZW1wMiB8ICgxIDw8IDkpKTsKKwkvKiBjbGVhciBhbnkgcG9zc2libGUgQUdQLXJlbGF0ZWQgZXJyb3IgY29uZGl0aW9ucyAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0k4MzBfRVJSU1RTLCAweDFjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF83NTA1X2NvbmZpZ3VyZSh2b2lkKQoreworCXUzMiB0ZW1wOworCXUxNiB0ZW1wMjsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCAqY3VycmVudF9zaXplOworCisJY3VycmVudF9zaXplID0gQV9TSVpFXzgoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKKworCS8qIGFwZXJ0dXJlIHNpemUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BUFNJWkUsIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKiBhZGRyZXNzIHRvIG1hcCB0byAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIEFHUF9BUEJBU0UsICZ0ZW1wKTsKKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKTsKKworCS8qIGF0dGJhc2UgLSBhcGVydHVyZSBiYXNlICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIElOVEVMX0FUVEJBU0UsIGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIpOworCisJLyogYWdwY3RybCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9BR1BDVFJMLCAweDAwMDApOworCisJLyogbWNoY2ZnICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBJTlRFTF9JNzUwNV9NQ0hDRkcsICZ0ZW1wMik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFncF9icmlkZ2UtPmRldiwgSU5URUxfSTc1MDVfTUNIQ0ZHLCB0ZW1wMiB8ICgxIDw8IDkpKTsKKworCXJldHVybiAwOworfQorCisvKiBTZXR1cCBmdW5jdGlvbiAqLworc3RhdGljIHN0cnVjdCBnYXR0X21hc2sgaW50ZWxfZ2VuZXJpY19tYXNrc1tdID0KK3sKKwl7Lm1hc2sgPSAweDAwMDAwMDE3LCAudHlwZSA9IDB9Cit9OworCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggaW50ZWxfODE1X3NpemVzWzJdID0KK3sKKwl7NjQsIDE2Mzg0LCA0LCAwfSwKKwl7MzIsIDgxOTIsIDMsIDh9LAorfTsKKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb184IGludGVsXzh4eF9zaXplc1s3XSA9Cit7CisJezI1NiwgNjU1MzYsIDYsIDB9LAorCXsxMjgsIDMyNzY4LCA1LCAzMn0sCisJezY0LCAxNjM4NCwgNCwgNDh9LAorCXszMiwgODE5MiwgMywgNTZ9LAorCXsxNiwgNDA5NiwgMiwgNjB9LAorCXs4LCAyMDQ4LCAxLCA2Mn0sCisJezQsIDEwMjQsIDAsIDYzfQorfTsKKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb18xNiBpbnRlbF9nZW5lcmljX3NpemVzWzddID0KK3sKKwl7MjU2LCA2NTUzNiwgNiwgMH0sCisJezEyOCwgMzI3NjgsIDUsIDMyfSwKKwl7NjQsIDE2Mzg0LCA0LCA0OH0sCisJezMyLCA4MTkyLCAzLCA1Nn0sCisJezE2LCA0MDk2LCAyLCA2MH0sCisJezgsIDIwNDgsIDEsIDYyfSwKKwl7NCwgMTAyNCwgMCwgNjN9Cit9OworCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggaW50ZWxfODMwbXBfc2l6ZXNbNF0gPQoreworCXsyNTYsIDY1NTM2LCA2LCAwfSwKKwl7MTI4LCAzMjc2OCwgNSwgMzJ9LAorCXs2NCwgMTYzODQsIDQsIDQ4fSwKKwl7MzIsIDgxOTIsIDMsIDU2fQorfTsKKworc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF9nZW5lcmljX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF9nZW5lcmljX3NpemVzLAorCS5zaXplX3R5cGUJCT0gVTE2X0FQRVJfU0laRSwKKwkubnVtX2FwZXJ0dXJlX3NpemVzCT0gNywKKwkuY29uZmlndXJlCQk9IGludGVsX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSBpbnRlbF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsX2NsZWFudXAsCisJLnRsYl9mbHVzaAkJPSBpbnRlbF90bGJmbHVzaCwKKwkubWFza19tZW1vcnkJCT0gYWdwX2dlbmVyaWNfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBpbnRlbF9nZW5lcmljX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gYWdwX2dlbmVyaWNfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCit9OworCitzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzgxMF9kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gaW50ZWxfaTgxMF9zaXplcywKKwkuc2l6ZV90eXBlCQk9IEZJWEVEX0FQRVJfU0laRSwKKwkubnVtX2FwZXJ0dXJlX3NpemVzCT0gMiwKKwkubmVlZHNfc2NyYXRjaF9wYWdlCT0gVFJVRSwKKwkuY29uZmlndXJlCQk9IGludGVsX2k4MTBfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsX2k4MTBfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSBpbnRlbF9pODEwX2NsZWFudXAsCisJLnRsYl9mbHVzaAkJPSBpbnRlbF9pODEwX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBpbnRlbF9pODEwX21hc2tfbWVtb3J5LAorCS5tYXNrcwkJCT0gaW50ZWxfaTgxMF9tYXNrcywKKwkuYWdwX2VuYWJsZQkJPSBpbnRlbF9pODEwX2FncF9lbmFibGUsCisJLmNhY2hlX2ZsdXNoCQk9IGdsb2JhbF9jYWNoZV9mbHVzaCwKKwkuY3JlYXRlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19jcmVhdGVfZ2F0dF90YWJsZSwKKwkuZnJlZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5CQk9IGludGVsX2k4MTBfaW5zZXJ0X2VudHJpZXMsCisJLnJlbW92ZV9tZW1vcnkJCT0gaW50ZWxfaTgxMF9yZW1vdmVfZW50cmllcywKKwkuYWxsb2NfYnlfdHlwZQkJPSBpbnRlbF9pODEwX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBpbnRlbF9pODEwX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODE1X2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84MTVfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDIsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF84MTVfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzgxNV9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzh4eF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfOHh4X3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODMwX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF9pODMwX3NpemVzLAorCS5zaXplX3R5cGUJCT0gRklYRURfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSAzLAorCS5uZWVkc19zY3JhdGNoX3BhZ2UJPSBUUlVFLAorCS5jb25maWd1cmUJCT0gaW50ZWxfaTgzMF9jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gaW50ZWxfaTgzMF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsX2k4MzBfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGludGVsX2k4MTBfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGludGVsX2k4MTBfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBpbnRlbF9pODEwX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGludGVsX2k4MTBfYWdwX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGludGVsX2k4MzBfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGludGVsX2k4MzBfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5CQk9IGludGVsX2k4MzBfaW5zZXJ0X2VudHJpZXMsCisJLnJlbW92ZV9tZW1vcnkJCT0gaW50ZWxfaTgzMF9yZW1vdmVfZW50cmllcywKKwkuYWxsb2NfYnlfdHlwZQkJPSBpbnRlbF9pODMwX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBpbnRlbF9pODEwX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODIwX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84eHhfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF84MjBfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzh4eF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzgyMF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfODIwX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODMwbXBfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9IGludGVsXzgzMG1wX3NpemVzLAorCS5zaXplX3R5cGUJCT0gVThfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSA0LAorCS5jb25maWd1cmUJCT0gaW50ZWxfODMwbXBfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzh4eF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzh4eF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfOHh4X3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODQwX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84eHhfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF84NDBfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzh4eF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzh4eF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfOHh4X3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODQ1X2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84eHhfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF84NDVfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzh4eF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzh4eF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfOHh4X3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODUwX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84eHhfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF84NTBfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzh4eF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzh4eF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfOHh4X3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODYwX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84eHhfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF84NjBfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IGludGVsXzh4eF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsXzh4eF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gaW50ZWxfOHh4X3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2dlbmVyaWNfbWFza3MsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfOTE1X2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF9pODMwX3NpemVzLAorCS5zaXplX3R5cGUJCT0gRklYRURfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSAzLAorCS5uZWVkc19zY3JhdGNoX3BhZ2UJPSBUUlVFLAorCS5jb25maWd1cmUJCT0gaW50ZWxfaTkxNV9jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gaW50ZWxfaTkxNV9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsX2k5MTVfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGludGVsX2k4MTBfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGludGVsX2k4MTBfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBpbnRlbF9pODEwX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGludGVsX2k4MTBfYWdwX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGludGVsX2k5MTVfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGludGVsX2k4MzBfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5CQk9IGludGVsX2k5MTVfaW5zZXJ0X2VudHJpZXMsCisJLnJlbW92ZV9tZW1vcnkJCT0gaW50ZWxfaTkxNV9yZW1vdmVfZW50cmllcywKKwkuYWxsb2NfYnlfdHlwZQkJPSBpbnRlbF9pODMwX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBpbnRlbF9pODEwX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKKworc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF83NTA1X2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF84eHhfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBpbnRlbF83NTA1X2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSBpbnRlbF84eHhfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSBpbnRlbF84eHhfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IGludGVsXzh4eF90bGJmbHVzaCwKKwkubWFza19tZW1vcnkJCT0gYWdwX2dlbmVyaWNfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBpbnRlbF9nZW5lcmljX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gYWdwX2dlbmVyaWNfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCit9OworCitzdGF0aWMgaW50IGZpbmRfaTgxMCh1MTYgZGV2aWNlKQoreworCXN0cnVjdCBwY2lfZGV2ICppODEwX2RldjsKKworCWk4MTBfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgZGV2aWNlLCBOVUxMKTsKKwlpZiAoIWk4MTBfZGV2KQorCQlyZXR1cm4gMDsKKwlpbnRlbF9pODEwX3ByaXZhdGUuaTgxMF9kZXYgPSBpODEwX2RldjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmaW5kX2k4MzAodTE2IGRldmljZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqaTgzMF9kZXY7CisKKwlpODMwX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIGRldmljZSwgTlVMTCk7CisJaWYgKGk4MzBfZGV2ICYmIFBDSV9GVU5DKGk4MzBfZGV2LT5kZXZmbikgIT0gMCkgeworCQlpODMwX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkJZGV2aWNlLCBpODMwX2Rldik7CisJfQorCisJaWYgKCFpODMwX2RldikKKwkJcmV0dXJuIDA7CisKKwlpbnRlbF9pODMwX3ByaXZhdGUuaTgzMF9kZXYgPSBpODMwX2RldjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWdwX2ludGVsX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisJY2hhciAqbmFtZSA9ICIodW5rbm93bikiOworCXU4IGNhcF9wdHIgPSAwOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKworCWNhcF9wdHIgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfQUdQKTsKKworCWJyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzd2l0Y2ggKHBkZXYtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M0xYXzA6CisJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsX2dlbmVyaWNfZHJpdmVyOworCQluYW1lID0gIjQ0MExYIjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzQlhfMDoKKwkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfZ2VuZXJpY19kcml2ZXI7CisJCW5hbWUgPSAiNDQwQlgiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNHWF8wOgorCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF9nZW5lcmljX2RyaXZlcjsKKwkJbmFtZSA9ICI0NDBHWCI7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMF9NQzE6CisJCW5hbWUgPSAiaTgxMCI7CisJCWlmICghZmluZF9pODEwKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBfSUcxKSkKKwkJCWdvdG8gZmFpbDsKKwkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfODEwX2RyaXZlcjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODEwX01DMzoKKwkJbmFtZSA9ICJpODEwIERDMTAwIjsKKwkJaWYgKCFmaW5kX2k4MTAoUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMF9JRzMpKQorCQkJZ290byBmYWlsOworCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84MTBfZHJpdmVyOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBFX01DOgorCQluYW1lID0gImk4MTAgRSI7CisJCWlmICghZmluZF9pODEwKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBFX0lHKSkKKwkJCWdvdG8gZmFpbDsKKwkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfODEwX2RyaXZlcjsKKwkJYnJlYWs7CisJIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxNV9NQzoKKwkJLyoKKwkJICogVGhlIGk4MTUgY2FuIG9wZXJhdGUgZWl0aGVyIGFzIGFuIGk4MTAgc3R5bGUKKwkJICogaW50ZWdyYXRlZCBkZXZpY2UsIG9yIGFzIGFuIEFHUDRYIG1vdGhlcmJvYXJkLgorCQkgKi8KKwkJaWYgKGZpbmRfaTgxMChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODE1X0NHQykpCisJCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84MTBfZHJpdmVyOworCQllbHNlCisJCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84MTVfZHJpdmVyOworCQluYW1lID0gImk4MTUiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MjBfSEI6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODIwX1VQX0hCOgorCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84MjBfZHJpdmVyOworCQluYW1lID0gImk4MjAiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MzBfSEI6CisJCWlmIChmaW5kX2k4MzAoUENJX0RFVklDRV9JRF9JTlRFTF84MjgzMF9DR0MpKSB7CisJCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84MzBfZHJpdmVyOworCQl9IGVsc2UgeworCQkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfODMwbXBfZHJpdmVyOworCQl9CisJCW5hbWUgPSAiODMwTSI7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg0MF9IQjoKKwkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfODQwX2RyaXZlcjsKKwkJbmFtZSA9ICJpODQwIjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODQ1X0hCOgorCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84NDVfZHJpdmVyOworCQluYW1lID0gImk4NDUiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVHX0hCOgorCQlpZiAoZmluZF9pODMwKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVHX0lHKSkgeworCQkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfODMwX2RyaXZlcjsKKwkJfSBlbHNlIHsKKwkJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsXzg0NV9kcml2ZXI7CisJCX0KKwkJbmFtZSA9ICI4NDVHIjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODUwX0hCOgorCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84NTBfZHJpdmVyOworCQluYW1lID0gImk4NTAiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTVQTV9IQjoKKwkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfODQ1X2RyaXZlcjsKKwkJbmFtZSA9ICI4NTVQTSI7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg1NUdNX0hCOgorCQlpZiAoZmluZF9pODMwKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTVHTV9JRykpIHsKKwkJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsXzgzMF9kcml2ZXI7CisJCQluYW1lID0gIjg1NSI7CisJCX0gZWxzZSB7CisJCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84NDVfZHJpdmVyOworCQkJbmFtZSA9ICI4NTVHTSI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODYwX0hCOgorCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84NjBfZHJpdmVyOworCQluYW1lID0gImk4NjAiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NjVfSEI6CisJCWlmIChmaW5kX2k4MzAoUENJX0RFVklDRV9JRF9JTlRFTF84Mjg2NV9JRykpIHsKKwkJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsXzgzMF9kcml2ZXI7CisJCX0gZWxzZSB7CisJCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84NDVfZHJpdmVyOworCQl9CisJCW5hbWUgPSAiODY1IjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODc1X0hCOgorCQlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF84NDVfZHJpdmVyOworCQluYW1lID0gImk4NzUiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI5MTVHX0hCOgorCQlpZiAoZmluZF9pODMwKFBDSV9ERVZJQ0VfSURfSU5URUxfODI5MTVHX0lHKSkgeworCQkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfOTE1X2RyaXZlcjsKKwkJfSBlbHNlIHsKKwkJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsXzg0NV9kcml2ZXI7CisJCX0KKwkJbmFtZSA9ICI5MTVHIjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTE1R01fSEI6CisJCWlmIChmaW5kX2k4MzAoUENJX0RFVklDRV9JRF9JTlRFTF84MjkxNUdNX0lHKSkgeworCQkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfOTE1X2RyaXZlcjsKKwkJfSBlbHNlIHsKKwkJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsXzg0NV9kcml2ZXI7CisJCX0KKwkJbmFtZSA9ICI5MTVHTSI7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF83NTA1XzA6CisJCWJyaWRnZS0+ZHJpdmVyID0gJmludGVsXzc1MDVfZHJpdmVyOworCQluYW1lID0gIkU3NTA1IjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzcyMDVfMDoKKwkJYnJpZGdlLT5kcml2ZXIgPSAmaW50ZWxfNzUwNV9kcml2ZXI7CisJCW5hbWUgPSAiRTcyMDUiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoY2FwX3B0cikKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbnN1cHBvcnRlZCBJbnRlbCBjaGlwc2V0IChkZXZpY2UgaWQ6ICUwNHgpXG4iLAorCQkJICAgIHBkZXYtPmRldmljZSk7CisJCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7CisJCXJldHVybiAtRU5PREVWOworCX07CisKKwlicmlkZ2UtPmRldiA9IHBkZXY7CisJYnJpZGdlLT5jYXBuZHggPSBjYXBfcHRyOworCisJaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF84MTBfZHJpdmVyKQorCQlicmlkZ2UtPmRldl9wcml2YXRlX2RhdGEgPSAmaW50ZWxfaTgxMF9wcml2YXRlOworCWVsc2UgaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF84MzBfZHJpdmVyKQorCQlicmlkZ2UtPmRldl9wcml2YXRlX2RhdGEgPSAmaW50ZWxfaTgzMF9wcml2YXRlOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldGVjdGVkIGFuIEludGVsICVzIENoaXBzZXQuXG4iLCBuYW1lKTsKKworCS8qCisJKiBUaGUgZm9sbG93aW5nIGZpeGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBCSU9TIGhhcyAiZm9yZ290dGVuIiB0bworCSogcHJvdmlkZSBhbiBhZGRyZXNzIHJhbmdlIGZvciB0aGUgR0FSVC4KKwkqIDIwMDMwNjEwIC0gaGFtaXNoQHpvdC5vcmcKKwkqLworCXIgPSAmcGRldi0+cmVzb3VyY2VbMF07CisJaWYgKCFyLT5zdGFydCAmJiByLT5lbmQpIHsKKwkJaWYocGNpX2Fzc2lnbl9yZXNvdXJjZShwZGV2LCAwKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY291bGQgbm90IGFzc2lnbiByZXNvdXJjZSAwXG4iKTsKKwkJCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCS8qCisJKiBJZiB0aGUgZGV2aWNlIGhhcyBub3QgYmVlbiBwcm9wZXJseSBzZXR1cCwgdGhlIGZvbGxvd2luZyB3aWxsIGNhdGNoCisJKiB0aGUgcHJvYmxlbSBhbmQgc2hvdWxkIHN0b3AgdGhlIHN5c3RlbSBmcm9tIGNyYXNoaW5nLgorCSogMjAwMzA2MTAgLSBoYW1pc2hAem90Lm9yZworCSovCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBFbmFibGUgUENJIGRldmljZVxuIik7CisJCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEZpbGwgaW4gdGhlIG1vZGUgcmVnaXN0ZXIgKi8KKwlpZiAoY2FwX3B0cikgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKKwkJCQlicmlkZ2UtPmNhcG5keCtQQ0lfQUdQX1NUQVRVUywKKwkJCQkmYnJpZGdlLT5tb2RlKTsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgYnJpZGdlKTsKKwlyZXR1cm4gYWdwX2FkZF9icmlkZ2UoYnJpZGdlKTsKKworZmFpbDoKKwlwcmludGsoS0VSTl9FUlIgUEZYICJEZXRlY3RlZCBhbiBJbnRlbCAlcyBjaGlwc2V0LCAiCisJCSJidXQgY291bGQgbm90IGZpbmQgdGhlIHNlY29uZGFyeSBkZXZpY2UuXG4iLCBuYW1lKTsKKwlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX2ludGVsX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlhZ3BfcmVtb3ZlX2JyaWRnZShicmlkZ2UpOworCisJaWYgKGludGVsX2k4MTBfcHJpdmF0ZS5pODEwX2RldikKKwkJcGNpX2Rldl9wdXQoaW50ZWxfaTgxMF9wcml2YXRlLmk4MTBfZGV2KTsKKwlpZiAoaW50ZWxfaTgzMF9wcml2YXRlLmk4MzBfZGV2KQorCQlwY2lfZGV2X3B1dChpbnRlbF9pODMwX3ByaXZhdGUuaTgzMF9kZXYpOworCisJYWdwX3B1dF9icmlkZ2UoYnJpZGdlKTsKK30KKworc3RhdGljIGludCBhZ3BfaW50ZWxfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF9nZW5lcmljX2RyaXZlcikKKwkJaW50ZWxfY29uZmlndXJlKCk7CisJZWxzZSBpZiAoYnJpZGdlLT5kcml2ZXIgPT0gJmludGVsXzg1MF9kcml2ZXIpCisJCWludGVsXzg1MF9jb25maWd1cmUoKTsKKwllbHNlIGlmIChicmlkZ2UtPmRyaXZlciA9PSAmaW50ZWxfODQ1X2RyaXZlcikKKwkJaW50ZWxfODQ1X2NvbmZpZ3VyZSgpOworCWVsc2UgaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF84MzBtcF9kcml2ZXIpCisJCWludGVsXzgzMG1wX2NvbmZpZ3VyZSgpOworCWVsc2UgaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF85MTVfZHJpdmVyKQorCQlpbnRlbF9pOTE1X2NvbmZpZ3VyZSgpOworCWVsc2UgaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF84MzBfZHJpdmVyKQorCQlpbnRlbF9pODMwX2NvbmZpZ3VyZSgpOworCWVsc2UgaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF84MTBfZHJpdmVyKQorCQlpbnRlbF9pODEwX2NvbmZpZ3VyZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhZ3BfaW50ZWxfcGNpX3RhYmxlW10gPSB7CisjZGVmaW5lIElEKHgpCQkJCQkJXAorCXsJCQkJCQlcCisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCVwKKwkuY2xhc3NfbWFzawk9IH4wLAkJCQlcCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAkJXAorCS5kZXZpY2UJCT0geCwJCQkJXAorCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAkJCVwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwJCQlcCisJfQorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNMWF8wKSwKKwlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzQlhfMCksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M0dYXzApLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBfTUMxKSwKKwlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODEwX01DMyksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMEVfTUMpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTVfTUMpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MjBfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MjBfVVBfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MzBfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDBfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVHX0hCKSwKKwlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODUwX0hCKSwKKwlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODU1UE1fSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTVHTV9IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84Mjg2MF9IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84Mjg2NV9IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84Mjg3NV9IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF83NTA1XzApLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfNzIwNV8wKSwKKwlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTE1R19IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84MjkxNUdNX0hCKSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZ3BfaW50ZWxfcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFncF9pbnRlbF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJhZ3BnYXJ0LWludGVsIiwKKwkuaWRfdGFibGUJPSBhZ3BfaW50ZWxfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBhZ3BfaW50ZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZ3BfaW50ZWxfcmVtb3ZlKSwKKwkucmVzdW1lCQk9IGFncF9pbnRlbF9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZ3BfaW50ZWxfaW5pdCh2b2lkKQoreworCWlmIChhZ3Bfb2ZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWdwX2ludGVsX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWdwX2ludGVsX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFncF9pbnRlbF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWdwX2ludGVsX2luaXQpOworbW9kdWxlX2V4aXQoYWdwX2ludGVsX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2lzb2NoLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2lzb2NoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhYzczMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaXNvY2guYwpAQCAtMCwwICsxLDQ3MCBAQAorLyoKKyAqIFNldHVwIHJvdXRpbmVzIGZvciBBR1AgMy41IGNvbXBsaWFudCBicmlkZ2VzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImFncC5oIgorCisvKiBHZW5lcmljIEFHUCAzLjUgZW5hYmxpbmcgcm91dGluZXMgKi8KKworc3RydWN0IGFncF8zXzVfZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdTggY2FwbmR4OworCXUzMiBtYXhidzsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworfTsKKworc3RhdGljIHZvaWQgYWdwXzNfNV9kZXZfbGlzdF9pbnNlcnQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IGxpc3RfaGVhZCAqbmV3KQoreworCXN0cnVjdCBhZ3BfM181X2RldiAqY3VyLCAqbiA9IGxpc3RfZW50cnkobmV3LCBzdHJ1Y3QgYWdwXzNfNV9kZXYsIGxpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworCWxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSB7CisJCWN1ciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgYWdwXzNfNV9kZXYsIGxpc3QpOworCQlpZihjdXItPm1heGJ3ID4gbi0+bWF4YncpCisJCQlicmVhazsKKwl9CisJbGlzdF9hZGRfdGFpbChuZXcsIHBvcyk7Cit9CisKK3N0YXRpYyB2b2lkIGFncF8zXzVfZGV2X2xpc3Rfc29ydChzdHJ1Y3QgYWdwXzNfNV9kZXYgKmxpc3QsIHVuc2lnbmVkIGludCBuZGV2cykKK3sKKwlzdHJ1Y3QgYWdwXzNfNV9kZXYgKmN1cjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRtcCwgKmhlYWQgPSAmbGlzdC0+bGlzdCwgKnN0YXJ0ID0gaGVhZC0+bmV4dDsKKwl1MzIgbmlzdGF0OworCisJSU5JVF9MSVNUX0hFQUQoaGVhZCk7CisKKwlmb3IgKHBvcz1zdGFydDsgcG9zIT1oZWFkOyApIHsKKwkJY3VyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBhZ3BfM181X2RldiwgbGlzdCk7CisJCWRldiA9IGN1ci0+ZGV2OworCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGN1ci0+Y2FwbmR4K0FHUE5JU1RBVCwgJm5pc3RhdCk7CisJCWN1ci0+bWF4YncgPSAobmlzdGF0ID4+IDE2KSAmIDB4ZmY7CisKKwkJdG1wID0gcG9zOworCQlwb3MgPSBwb3MtPm5leHQ7CisJCWFncF8zXzVfZGV2X2xpc3RfaW5zZXJ0KGhlYWQsIHRtcCk7CisJfQorfQorCisvKiAKKyAqIEluaXRpYWxpemUgYWxsIGlzb2Nocm9ub3VzIHRyYW5zZmVyIHBhcmFtZXRlcnMgZm9yIGFuIEFHUCAzLjAgCisgKiBub2RlIChpLmUuIGEgaG9zdCBicmlkZ2UgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgYWRhcHRlcnMgCisgKiBseWluZyBiZWhpbmQgaXQuLi4pCisgKi8KKworc3RhdGljIGludCBhZ3BfM181X2lzb2Nocm9ub3VzX25vZGVfZW5hYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwkJc3RydWN0IGFncF8zXzVfZGV2ICpkZXZfbGlzdCwgdW5zaWduZWQgaW50IG5kZXZzKQoreworCS8qCisJICogQ29udmVuaWVuY2Ugc3RydWN0dXJlIHRvIG1ha2UgdGhlIGNhbGN1bGF0aW9ucyBjbGVhcmVyCisJICogaGVyZS4gIFRoZSBmaWVsZCBuYW1lcyBjb21lIHN0cmFpZ2h0IGZyb20gdGhlIEFHUCAzLjAgc3BlYy4KKwkgKi8KKwlzdHJ1Y3QgaXNvY2hfZGF0YSB7CisJCXUzMiBtYXhidzsKKwkJdTMyIG47CisJCXUzMiB5OworCQl1MzIgbDsKKwkJdTMyIHJxOworCQlzdHJ1Y3QgYWdwXzNfNV9kZXYgKmRldjsKKwl9OworCisJc3RydWN0IHBjaV9kZXYgKnRkID0gYnJpZGdlLT5kZXYsICpkZXY7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZkZXZfbGlzdC0+bGlzdCwgKnBvczsKKwlzdHJ1Y3QgYWdwXzNfNV9kZXYgKmN1cjsKKwlzdHJ1Y3QgaXNvY2hfZGF0YSAqbWFzdGVyLCB0YXJnZXQ7CisJdW5zaWduZWQgaW50IGNkZXYgPSAwOworCXUzMiBtbmlzdGF0LCB0bmlzdGF0LCB0c3RhdHVzLCBtY21kOworCXUxNiB0bmljbWQsIG1uaWNtZDsKKwl1OCBtY2FwbmR4OworCXUzMiB0b3RfYncgPSAwLCB0b3RfbiA9IDAsIHRvdF9ycSA9IDAsIHlfbWF4LCBycV9pc29jaCwgcnFfYXN5bmM7CisJdTMyIHN0ZXAsIHJlbSwgcmVtX2lzb2NoLCByZW1fYXN5bmM7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIFdlJ2xsIHdvcmsgd2l0aCBhbiBhcnJheSBvZiBpc29jaF9kYXRhJ3MgKG9uZSBmb3IgZWFjaAorCSAqIGRldmljZSBpbiBkZXZfbGlzdCkgdGhyb3VnaG91dCB0aGlzIGZ1bmN0aW9uLgorCSAqLworCWlmICgobWFzdGVyID0ga21hbGxvYyhuZGV2cyAqIHNpemVvZigqbWFzdGVyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBnZXRfb3V0OworCX0KKworCS8qCisJICogU29ydCB0aGUgZGV2aWNlIGxpc3QgYnkgbWF4YncuICBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSB0aGUKKwkgKiBzcGVjIHN1Z2dlc3RzIHRoYXQgdGhlIGRldmljZXMgd2l0aCB0aGUgc21hbGxlc3QgcmVxdWlyZW1lbnRzCisJICogaGF2ZSB0aGVpciByZXNvdXJjZXMgYWxsb2NhdGVkIGZpcnN0LCB3aXRoIGFsbCByZW1haW5pbmcgcmVzb3VyY2VzCisJICogZmFsbGluZyB0byB0aGUgZGV2aWNlIHdpdGggdGhlIGxhcmdlc3QgcmVxdWlyZW1lbnQuCisJICoKKwkgKiBXZSBkb24ndCBleGFjdGx5IGRvIHRoaXMsIHdlIGRpdmlkZSB0YXJnZXQgcmVzb3VyY2VzIGJ5IG5kZXZzCisJICogYW5kIHNwbGl0IHRoZW0gYW1vbmdzdCB0aGUgQUdQIDMuMCBkZXZpY2VzLiAgVGhlIHJlbWFpbmRlciBvZiBzdWNoCisJICogZGl2aXNpb24gb3BlcmF0aW9ucyBhcmUgZHJvcHBlZCBvbiB0aGUgbGFzdCBkZXZpY2UsIHNvcnQgb2YgbGlrZQorCSAqIHRoZSBzcGVjIG1lbnRpb25zIGl0IHNob3VsZCBiZSBkb25lLgorCSAqCisJICogV2UgY2FuJ3QgZG8gdGhpcyBzb3J0IHdoZW4gd2UgaW5pdGlhbGx5IGNvbnN0cnVjdCB0aGUgZGV2X2xpc3QKKwkgKiBiZWNhdXNlIHdlIGRvbid0IGtub3cgdW50aWwgdGhpcyBmdW5jdGlvbiB3aGV0aGVyIGlzb2Nocm9ub3VzCisJICogdHJhbnNmZXJzIGFyZSBlbmFibGVkIGFuZCBjb25zZXF1ZW50bHkgd2hldGhlciBtYXhidyB3aWxsIG1lYW4KKwkgKiBhbnl0aGluZy4KKwkgKi8KKwlhZ3BfM181X2Rldl9saXN0X3NvcnQoZGV2X2xpc3QsIG5kZXZzKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0ZCwgYnJpZGdlLT5jYXBuZHgrQUdQTklTVEFULCAmdG5pc3RhdCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRkLCBicmlkZ2UtPmNhcG5keCtBR1BTVEFULCAmdHN0YXR1cyk7CisKKwkvKiBFeHRyYWN0IHBvd2VyLW9uIGRlZmF1bHRzIGZyb20gdGhlIHRhcmdldCAqLworCXRhcmdldC5tYXhidyA9ICh0bmlzdGF0ID4+IDE2KSAmIDB4ZmY7CisJdGFyZ2V0Lm4gICAgID0gKHRuaXN0YXQgPj4gOCkgICYgMHhmZjsKKwl0YXJnZXQueSAgICAgPSAodG5pc3RhdCA+PiA2KSAgJiAweDM7CisJdGFyZ2V0LmwgICAgID0gKHRuaXN0YXQgPj4gMykgICYgMHg3OworCXRhcmdldC5ycSAgICA9ICh0c3RhdHVzID4+IDI0KSAmIDB4ZmY7CisKKwl5X21heCA9IHRhcmdldC55OworCisJLyoKKwkgKiBFeHRyYWN0IHBvd2VyLW9uIGRlZmF1bHRzIGZvciBlYWNoIGRldmljZSBpbiBkZXZfbGlzdC4gIEFsb25nCisJICogdGhlIHdheSwgY2FsY3VsYXRlIHRoZSB0b3RhbCBpc29jaHJvbm91cyBiYW5kd2lkdGggcmVxdWlyZWQKKwkgKiBieSB0aGVzZSBkZXZpY2VzIGFuZCB0aGUgbGFyZ2VzdCByZXF1ZXN0ZWQgcGF5bG9hZCBzaXplLgorCSAqLworCWxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSB7CisJCWN1ciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgYWdwXzNfNV9kZXYsIGxpc3QpOworCQlkZXYgPSBjdXItPmRldjsKKworCQltY2FwbmR4ID0gY3VyLT5jYXBuZHg7CisKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgY3VyLT5jYXBuZHgrQUdQTklTVEFULCAmbW5pc3RhdCk7CisKKwkJbWFzdGVyW2NkZXZdLm1heGJ3ID0gKG1uaXN0YXQgPj4gMTYpICYgMHhmZjsKKwkJbWFzdGVyW2NkZXZdLm4gICAgID0gKG1uaXN0YXQgPj4gOCkgICYgMHhmZjsKKwkJbWFzdGVyW2NkZXZdLnkgICAgID0gKG1uaXN0YXQgPj4gNikgICYgMHgzOworCQltYXN0ZXJbY2Rldl0uZGV2ICAgPSBjdXI7CisKKwkJdG90X2J3ICs9IG1hc3RlcltjZGV2XS5tYXhidzsKKwkJeV9tYXggPSBtYXgoeV9tYXgsIG1hc3RlcltjZGV2XS55KTsKKworCQljZGV2Kys7CisJfQorCisJLyogQ2hlY2sgaWYgdGhpcyBjb25maWd1cmF0aW9uIGhhcyBhbnkgY2hhbmNlIG9mIHdvcmtpbmcgKi8KKwlpZiAodG90X2J3ID4gdGFyZ2V0Lm1heGJ3KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImlzb2Nocm9ub3VzIGJhbmR3aWR0aCByZXF1aXJlZCAiCisJCQkiYnkgQUdQIDMuMCBkZXZpY2VzIGV4Y2VlZHMgdGhhdCB3aGljaCBpcyBzdXBwb3J0ZWQgYnkgIgorCQkJInRoZSBBR1AgMy4wIGJyaWRnZSFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfYW5kX2V4aXQ7CisJfQorCisJdGFyZ2V0LnkgPSB5X21heDsKKworCS8qCisJICogV3JpdGUgdGhlIGNhbGN1bGF0ZWQgcGF5bG9hZCBzaXplIGludG8gdGhlIHRhcmdldCdzIE5JQ01ECisJICogcmVnaXN0ZXIuICBEb2luZyB0aGlzIGRpcmVjdGx5IGVmZmVjdHMgdGhlIElTT0NIX04gdmFsdWUKKwkgKiBpbiB0aGUgdGFyZ2V0J3MgTklTVEFUIHJlZ2lzdGVyLCBzbyB3ZSBuZWVkIHRvIGRvIHRoaXMgbm93CisJICogdG8gZ2V0IGFuIGFjY3VyYXRlIHZhbHVlIGZvciBJU09DSF9OIGxhdGVyLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRkLCBicmlkZ2UtPmNhcG5keCtBR1BOSUNNRCwgJnRuaWNtZCk7CisJdG5pY21kICY9IH4oMHgzIDw8IDYpOworCXRuaWNtZCB8PSB0YXJnZXQueSA8PCA2OworCXBjaV93cml0ZV9jb25maWdfd29yZCh0ZCwgYnJpZGdlLT5jYXBuZHgrQUdQTklDTUQsIHRuaWNtZCk7CisKKwkvKiBSZXJlYWQgdGhlIHRhcmdldCdzIElTT0NIX04gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodGQsIGJyaWRnZS0+Y2FwbmR4K0FHUE5JU1RBVCwgJnRuaXN0YXQpOworCXRhcmdldC5uID0gKHRuaXN0YXQgPj4gOCkgJiAweGZmOworCisJLyogQ2FsY3VsYXRlIHRoZSBtaW5pbXVtIElTT0NIX04gbmVlZGVkIGJ5IGVhY2ggbWFzdGVyICovCisJZm9yIChjZGV2PTA7IGNkZXY8bmRldnM7IGNkZXYrKykgeworCQltYXN0ZXJbY2Rldl0ueSA9IHRhcmdldC55OworCQltYXN0ZXJbY2Rldl0ubiA9IG1hc3RlcltjZGV2XS5tYXhidyAvIChtYXN0ZXJbY2Rldl0ueSArIDEpOworCisJCXRvdF9uICs9IG1hc3RlcltjZGV2XS5uOworCX0KKworCS8qIEV4aXQgaWYgdGhlIG1pbmltYWwgSVNPQ0hfTiBhbGxvY2F0aW9uIGFtb25nIHRoZSBtYXN0ZXJzIGlzIG1vcmUKKwkgKiB0aGFuIHRoZSB0YXJnZXQgY2FuIGhhbmRsZS4gKi8KKwlpZiAodG90X24gPiB0YXJnZXQubikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJudW1iZXIgb2YgaXNvY2hyb25vdXMgIgorCQkJInRyYW5zYWN0aW9ucyBwZXIgcGVyaW9kIHJlcXVpcmVkIGJ5IEFHUCAzLjAgZGV2aWNlcyAiCisJCQkiZXhjZWVkcyB0aGF0IHdoaWNoIGlzIHN1cHBvcnRlZCBieSB0aGUgQUdQIDMuMCAiCisJCQkiYnJpZGdlIVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9hbmRfZXhpdDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgbGVmdCBvdmVyIElTT0NIX04gY2FwYWJpbGl0eSBpbiB0aGUgdGFyZ2V0LiAgV2UnbGwgZ2l2ZQorCSAqIHRoaXMgdG8gdGhlIGh1bmdyaWVzdCBkZXZpY2UgKGFzIHBlciB0aGUgc3BlYykgKi8KKwlyZW0gID0gdGFyZ2V0Lm4gLSB0b3RfbjsKKworCS8qIAorCSAqIENhbGN1bGF0ZSB0aGUgbWluaW11bSBpc29jaHJvbm91cyBSUSBkZXB0aCBuZWVkZWQgYnkgZWFjaCBtYXN0ZXIuCisJICogQWxvbmcgdGhlIHdheSwgZGlzdHJpYnV0ZSB0aGUgZXh0cmEgSVNPQ0hfTiBjYXBhYmlsaXR5IGNhbGN1bGF0ZWQKKwkgKiBhYm92ZS4KKwkgKi8KKwlmb3IgKGNkZXY9MDsgY2RldjxuZGV2czsgY2RldisrKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgYSBsaXR0bGUgc3VidGxlLiAgSWYgSVNPQ0hfWSA+IDY0QiwgdGhlbiBJU09DSF9ZCisJCSAqIGJ5dGUgaXNvY2hyb25vdXMgd3JpdGVzIHdpbGwgYmUgYnJva2VuIGludG8gNjRCIHBpZWNlcy4KKwkJICogVGhpcyBtZWFucyB3ZSBuZWVkIHRvIGJ1ZGdldCBtb3JlIFJRIGRlcHRoIHRvIGFjY291bnQgZm9yCisJCSAqIHRoZXNlIGtpbmQgb2Ygd3JpdGVzIChlYWNoIGlzb2Nocm9ub3VzIHdyaXRlIGlzIGFjdHVhbGx5CisJCSAqIG1hbnkgd3JpdGVzIG9uIHRoZSBBR1AgYnVzKS4KKwkJICovCisJCW1hc3RlcltjZGV2XS5ycSA9IG1hc3RlcltjZGV2XS5uOworCQlpZihtYXN0ZXJbY2Rldl0ueSA+IDB4MSkKKwkJCW1hc3RlcltjZGV2XS5ycSAqPSAoMSA8PCAobWFzdGVyW2NkZXZdLnkgLSAxKSk7CisKKwkJdG90X3JxICs9IG1hc3RlcltjZGV2XS5ycTsKKworCQlpZiAoY2RldiA9PSBuZGV2cy0xKQorCQkJbWFzdGVyW2NkZXZdLm4gKz0gcmVtOworCX0KKworCS8qIEZpZ3VyZSB0aGUgbnVtYmVyIG9mIGlzb2Nocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgUlEgc2xvdHMgdGhlCisJICogdGFyZ2V0IGlzIHByb3ZpZGluZy4gKi8KKwlycV9pc29jaCA9ICh0YXJnZXQueSA+IDB4MSkgPyB0YXJnZXQubiAqICgxIDw8ICh0YXJnZXQueSAtIDEpKSA6IHRhcmdldC5uOworCXJxX2FzeW5jID0gdGFyZ2V0LnJxIC0gcnFfaXNvY2g7CisKKwkvKiBFeGl0IGlmIHRoZSBtaW5pbWFsIFJRIG5lZWRzIG9mIHRoZSBtYXN0ZXJzIGV4Y2VlZHMgd2hhdCB0aGUgdGFyZ2V0CisJICogY2FuIHByb3ZpZGUuICovCisJaWYgKHRvdF9ycSA+IHJxX2lzb2NoKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIm51bWJlciBvZiByZXF1ZXN0IHF1ZXVlIHNsb3RzICIKKwkJCSJyZXF1aXJlZCBieSB0aGUgaXNvY2hyb25vdXMgYmFuZHdpZHRoIHJlcXVlc3RlZCBieSAiCisJCQkiQUdQIDMuMCBkZXZpY2VzIGV4Y2VlZHMgdGhlIG51bWJlciBwcm92aWRlZCBieSB0aGUgIgorCQkJIkFHUCAzLjAgYnJpZGdlIVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9hbmRfZXhpdDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgYXN5bmNocm9ub3VzIFJRIGNhcGFiaWxpdHkgaW4gdGhlIHRhcmdldCAocGVyIG1hc3RlcikgYXMKKwkgKiB3ZWxsIGFzIHRoZSB0b3RhbCBudW1iZXIgb2YgbGVmdG92ZXIgaXNvY2hyb25vdXMgUlEgc2xvdHMuICovCisJc3RlcCAgICAgID0gcnFfYXN5bmMgLyBuZGV2czsKKwlyZW1fYXN5bmMgPSBzdGVwICsgKHJxX2FzeW5jICUgbmRldnMpOworCXJlbV9pc29jaCA9IHJxX2lzb2NoIC0gdG90X3JxOworCisJLyogRGlzdHJpYnV0ZSB0aGUgZXh0cmEgUlEgc2xvdHMgY2FsY3VsYXRlZCBhYm92ZSBhbmQgd3JpdGUgb3VyCisJICogaXNvY2hyb25vdXMgc2V0dGluZ3Mgb3V0IHRvIHRoZSBhY3R1YWwgZGV2aWNlcy4gKi8KKwlmb3IgKGNkZXY9MDsgY2RldjxuZGV2czsgY2RldisrKSB7CisJCWN1ciA9IG1hc3RlcltjZGV2XS5kZXY7CisJCWRldiA9IGN1ci0+ZGV2OworCisJCW1jYXBuZHggPSBjdXItPmNhcG5keDsKKworCQltYXN0ZXJbY2Rldl0ucnEgKz0gKGNkZXYgPT0gbmRldnMgLSAxKQorCQkgICAgICAgICAgICAgID8gKHJlbV9hc3luYyArIHJlbV9pc29jaCkgOiBzdGVwOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgY3VyLT5jYXBuZHgrQUdQTklDTUQsICZtbmljbWQpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBjdXItPmNhcG5keCtBR1BDTUQsICZtY21kKTsKKworCQltbmljbWQgJj0gfigweGZmIDw8IDgpOworCQltbmljbWQgJj0gfigweDMgIDw8IDYpOworCQltY21kICAgJj0gfigweGZmIDw8IDI0KTsKKworCQltbmljbWQgfD0gbWFzdGVyW2NkZXZdLm4gIDw8IDg7CisJCW1uaWNtZCB8PSBtYXN0ZXJbY2Rldl0ueSAgPDwgNjsKKwkJbWNtZCAgIHw9IG1hc3RlcltjZGV2XS5ycSA8PCAyNDsKKworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgY3VyLT5jYXBuZHgrQUdQQ01ELCBtY21kKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgY3VyLT5jYXBuZHgrQUdQTklDTUQsIG1uaWNtZCk7CisJfQorCitmcmVlX2FuZF9leGl0OgorCWtmcmVlKG1hc3Rlcik7CisKK2dldF9vdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYmFzaWNhbGx5IGFsbG9jYXRlcyByZXF1ZXN0IHF1ZXVlIHNsb3RzIGFtb25nIHRoZQorICogQUdQIDMuMCBzeXN0ZW1zIGluIG5vbmlzb2Nocm9ub3VzIG5vZGVzLiAgVGhlIGFsZ29yaXRobSBpcworICogcHJldHR5IHN0dXBpZCwgZGl2aWRlIHRoZSB0b3RhbCBudW1iZXIgb2YgUlEgc2xvdHMgcHJvdmlkZWQgYnkgdGhlCisgKiB0YXJnZXQgYnkgbmRldnMuICBEaXN0cmlidXRlIHRoaXMgbWFueSBzbG90cyB0byBlYWNoIEFHUCAzLjAgZGV2aWNlLAorICogZ2l2aW5nIGFueSBsZWZ0IG92ZXIgc2xvdHMgdG8gdGhlIGxhc3QgZGV2aWNlIGluIGRldl9saXN0LgorICovCitzdGF0aWMgdm9pZCBhZ3BfM181X25vbmlzb2Nocm9ub3VzX25vZGVfZW5hYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwkJc3RydWN0IGFncF8zXzVfZGV2ICpkZXZfbGlzdCwgdW5zaWduZWQgaW50IG5kZXZzKQoreworCXN0cnVjdCBhZ3BfM181X2RldiAqY3VyOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmZGV2X2xpc3QtPmxpc3QsICpwb3M7CisJdTMyIHRzdGF0dXMsIG1jbWQ7CisJdTMyIHRycSwgbXJxLCByZW07CisJdW5zaWduZWQgaW50IGNkZXYgPSAwOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyaWRnZS0+ZGV2LCBicmlkZ2UtPmNhcG5keCtBR1BTVEFULCAmdHN0YXR1cyk7CisKKwl0cnEgPSAodHN0YXR1cyA+PiAyNCkgJiAweGZmOworCW1ycSA9IHRycSAvIG5kZXZzOworCisJcmVtID0gbXJxICsgKHRycSAlIG5kZXZzKTsKKworCWZvciAocG9zPWhlYWQtPm5leHQ7IGNkZXY8bmRldnM7IGNkZXYrKywgcG9zPXBvcy0+bmV4dCkgeworCQljdXIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGFncF8zXzVfZGV2LCBsaXN0KTsKKworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoY3VyLT5kZXYsIGN1ci0+Y2FwbmR4K0FHUENNRCwgJm1jbWQpOworCQltY21kICY9IH4oMHhmZiA8PCAyNCk7CisJCW1jbWQgfD0gKChjZGV2ID09IG5kZXZzIC0gMSkgPyByZW0gOiBtcnEpIDw8IDI0OworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGN1ci0+ZGV2LCBjdXItPmNhcG5keCtBR1BDTUQsIG1jbWQpOworCX0KK30KKworLyoKKyAqIEZ1bGx5IGNvbmZpZ3VyZSBhbmQgZW5hYmxlIGFuIEFHUCAzLjAgaG9zdCBicmlkZ2UgYW5kIGFsbCB0aGUgZGV2aWNlcworICogbHlpbmcgYmVoaW5kIGl0LgorICovCitpbnQgYWdwXzNfNV9lbmFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXN0cnVjdCBwY2lfZGV2ICp0ZCA9IGJyaWRnZS0+ZGV2LCAqZGV2ID0gTlVMTDsKKwl1OCBtY2FwbmR4OworCXUzMiBpc29jaCwgYXJxc3o7CisJdTMyIHRzdGF0dXMsIG1zdGF0dXMsIG5jYXBpZDsKKwl1MzIgbW1ham9yOworCXUxNiBtcHN0YXQ7CisJc3RydWN0IGFncF8zXzVfZGV2ICpkZXZfbGlzdCwgKmN1cjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCAqcG9zOworCXVuc2lnbmVkIGludCBuZGV2cyA9IDA7CisJaW50IHJldCA9IDA7CisKKwkvKiBFeHRyYWN0IHNvbWUgcG93ZXItb24gZGVmYXVsdHMgZnJvbSB0aGUgdGFyZ2V0ICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRkLCBicmlkZ2UtPmNhcG5keCtBR1BTVEFULCAmdHN0YXR1cyk7CisJaXNvY2ggICAgID0gKHRzdGF0dXMgPj4gMTcpICYgMHgxOworCWlmIChpc29jaCA9PSAwKQkvKiBpc29jaCB4ZmVycyBub3QgYXZhaWxhYmxlLCBiYWlsIG91dC4gKi8KKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhcnFzeiAgICAgPSAodHN0YXR1cyA+PiAxMykgJiAweDc7CisKKwkvKiAKKwkgKiBBbGxvY2F0ZSBhIGhlYWQgZm9yIG91ciBBR1AgMy41IGRldmljZSBsaXN0CisJICogKG11bHRpcGxlIEFHUCB2MyBkZXZpY2VzIGFyZSBhbGxvd2VkIGJlaGluZCBhIHNpbmdsZSBicmlkZ2UpLiAKKwkgKi8KKwlpZiAoKGRldl9saXN0ID0ga21hbGxvYyhzaXplb2YoKmRldl9saXN0KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBnZXRfb3V0OworCX0KKwloZWFkID0gJmRldl9saXN0LT5saXN0OworCUlOSVRfTElTVF9IRUFEKGhlYWQpOworCisJLyogRmluZCBhbGwgQUdQIGRldmljZXMsIGFuZCBhZGQgdGhlbSB0byBkZXZfbGlzdC4gKi8KKwlmb3JfZWFjaF9wY2lfZGV2KGRldikgeworCQltY2FwbmR4ID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfQUdQKTsKKwkJaWYgKG1jYXBuZHggPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoKGRldi0+Y2xhc3MgPj44KSAmIDB4ZmYwMCkgeworCQkJY2FzZSAweDA2MDA6ICAgIC8qIEJyaWRnZSAqLworCQkJCS8qIFNraXAgYnJpZGdlcy4gV2Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgZWFjaCBvbmUuICovCisJCQkJY29udGludWU7CisKKwkJCWNhc2UgMHgwMDAxOiAgICAvKiBVbmNsYXNzaWZpZWQgZGV2aWNlICovCisJCQkJLyogRG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMsIGJ1dCBsb2cgaXQgZm9yIGludmVzdGlnYXRpb24uICovCisJCQkJaWYgKG1jYXBuZHggIT0gMCkgeworCQkJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIldhY2t5LCBmb3VuZCB1bmNsYXNzaWZpZWQgQUdQIGRldmljZS4gJXg6JXhcbiIsCisJCQkJCQlkZXYtPnZlbmRvciwgZGV2LT5kZXZpY2UpOworCQkJCX0KKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAweDAzMDA6ICAgIC8qIERpc3BsYXkgY29udHJvbGxlciAqLworCQkJY2FzZSAweDA0MDA6ICAgIC8qIE11bHRpbWVkaWEgY29udHJvbGxlciAqLworCQkJCWlmKChjdXIgPSBrbWFsbG9jKHNpemVvZigqY3VyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQkJZ290byBmcmVlX2FuZF9leGl0OworCQkJCX0KKwkJCQljdXItPmRldiA9IGRldjsKKworCQkJCXBvcyA9ICZjdXItPmxpc3Q7CisJCQkJbGlzdF9hZGQocG9zLCBoZWFkKTsKKwkJCQluZGV2cysrOworCQkJCWNvbnRpbnVlOworCisJCQlkZWZhdWx0OgorCQkJCWNvbnRpbnVlOworCQl9CisJfQorCisJLyoKKwkgKiBUYWtlIGFuIGluaXRpYWwgcGFzcyB0aHJvdWdoIHRoZSBkZXZpY2VzIGx5aW5nIGJlaGluZCBvdXIgaG9zdAorCSAqIGJyaWRnZS4gIE1ha2Ugc3VyZSBlYWNoIG9uZSBpcyBhY3R1YWxseSBhbiBBR1AgMy4wIGRldmljZSwgb3RoZXJ3aXNlCisJICogZXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuICBBbG9uZyB0aGUgd2F5IHN0b3JlIHRoZSBBR1AgMy4wCisJICogY2FwX3B0ciBmb3IgZWFjaCBkZXZpY2UKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkgeworCQljdXIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGFncF8zXzVfZGV2LCBsaXN0KTsKKwkJZGV2ID0gY3VyLT5kZXY7CisJCQorCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9TVEFUVVMsICZtcHN0YXQpOworCQlpZiAoKG1wc3RhdCAmIFBDSV9TVEFUVVNfQ0FQX0xJU1QpID09IDApCisJCQljb250aW51ZTsKKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DQVBBQklMSVRZX0xJU1QsICZtY2FwbmR4KTsKKwkJaWYgKG1jYXBuZHggIT0gMCkgeworCQkJZG8geworCQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIG1jYXBuZHgsICZuY2FwaWQpOworCQkJCWlmICgobmNhcGlkICYgMHhmZikgIT0gMikKKwkJCQkJbWNhcG5keCA9IChuY2FwaWQgPj4gOCkgJiAweGZmOworCQkJfQorCQkJd2hpbGUgKCgobmNhcGlkICYgMHhmZikgIT0gMikgJiYgKG1jYXBuZHggIT0gMCkpOworCQl9CisKKwkJaWYgKG1jYXBuZHggPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAid29haCEgIE5vbi1BR1AgZGV2aWNlICIKKwkJCQkiZm91bmQgb24gdGhlIHNlY29uZGFyeSBidXMgb2YgYW4gQUdQIDMuNSBicmlkZ2UhXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGZyZWVfYW5kX2V4aXQ7CisJCX0KKworCQltbWFqb3IgPSAobmNhcGlkID4+IEFHUF9NQUpPUl9WRVJTSU9OX1NISUZUKSAmIDB4ZjsKKwkJaWYgKG1tYWpvciA8IDMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIndvYWghICBBR1AgMi4wIGRldmljZSAiCisJCQkJImZvdW5kIG9uIHRoZSBzZWNvbmRhcnkgYnVzIG9mIGFuIEFHUCAzLjUgIgorCQkJCSJicmlkZ2Ugb3BlcmF0aW5nIHdpdGggQUdQIDMuMCBlbGVjdHJpY2FscyFcbiIpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZnJlZV9hbmRfZXhpdDsKKwkJfQorCisJCWN1ci0+Y2FwbmR4ID0gbWNhcG5keDsKKworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBjdXItPmNhcG5keCtBR1BTVEFULCAmbXN0YXR1cyk7CisKKwkJaWYgKCgobXN0YXR1cyA+PiAzKSAmIDB4MSkgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAid29haCEgIEFHUCAzLnggZGV2aWNlICIKKwkJCQkibm90IG9wZXJhdGluZyBpbiBBR1AgMy54IG1vZGUgZm91bmQgb24gdGhlICIKKwkJCQkic2Vjb25kYXJ5IGJ1cyBvZiBhbiBBR1AgMy41IGJyaWRnZSBvcGVyYXRpbmcgIgorCQkJCSJ3aXRoIEFHUCAzLjAgZWxlY3RyaWNhbHMhXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGZyZWVfYW5kX2V4aXQ7CisJCX0KKwl9CQkKKworCS8qCisJICogQ2FsbCBmdW5jdGlvbnMgdG8gZGl2aWRlIHRhcmdldCByZXNvdXJjZXMgYW1vbmdzdCB0aGUgQUdQIDMuMAorCSAqIG1hc3RlcnMuICBUaGlzIHByb2Nlc3MgaXMgZHJhbWF0aWNhbGx5IGRpZmZlcmVudCBkZXBlbmRpbmcgb24KKwkgKiB3aGV0aGVyIGlzb2Nocm9ub3VzIHRyYW5zZmVycyBhcmUgc3VwcG9ydGVkLgorCSAqLworCWlmIChpc29jaCkgeworCQlyZXQgPSBhZ3BfM181X2lzb2Nocm9ub3VzX25vZGVfZW5hYmxlKGJyaWRnZSwgZGV2X2xpc3QsIG5kZXZzKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlNvbWV0aGluZyBiYWQgaGFwcGVuZWQgc2V0dGluZyAiCisJCQkgICAgICAgInVwIGlzb2Nocm9ub3VzIHhmZXJzLiAgRmFsbGluZyBiYWNrIHRvICIKKwkJCSAgICAgICAibm9uLWlzb2Nocm9ub3VzIHhmZXIgbW9kZS5cbiIpOworCQl9IGVsc2UgeworCQkJZ290byBmcmVlX2FuZF9leGl0OworCQl9CisJfQorCWFncF8zXzVfbm9uaXNvY2hyb25vdXNfbm9kZV9lbmFibGUoYnJpZGdlLCBkZXZfbGlzdCwgbmRldnMpOworCitmcmVlX2FuZF9leGl0OgorCS8qIEJlIHN1cmUgdG8gZnJlZSB0aGUgZGV2X2xpc3QgKi8KKwlmb3IgKHBvcz1oZWFkLT5uZXh0OyBwb3MhPWhlYWQ7ICkgeworCQljdXIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGFncF8zXzVfZGV2LCBsaXN0KTsKKworCQlwb3MgPSBwb3MtPm5leHQ7CisJCWtmcmVlKGN1cik7CisJfQorCWtmcmVlKGRldl9saXN0KTsKKworZ2V0X291dDoKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL252aWRpYS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvbnZpZGlhLWFncC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmN2EzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL252aWRpYS1hZ3AuYwpAQCAtMCwwICsxLDQyNCBAQAorLyoKKyAqIE52aWRpYSBBR1BHQVJUIHJvdXRpbmVzLgorICogQmFzZWQgdXBvbiBhIDIuNCBhZ3BnYXJ0IGRpZmYgYnkgdGhlIGZvbGtzIGZyb20gTlZJRElBLCBhbmQgaGFja2VkIHVwCisgKiB0byB3b3JrIGluIDIuNSBieSBEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSAiYWdwLmgiCisKKy8qIE5WSURJQSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlZJRElBXzBfQVBTSVpFCQkweDgwCisjZGVmaW5lIE5WSURJQV8xX1dCQwkJMHhmMAorI2RlZmluZSBOVklESUFfMl9HQVJUQ1RSTAkweGQwCisjZGVmaW5lIE5WSURJQV8yX0FQQkFTRQkJMHhkOAorI2RlZmluZSBOVklESUFfMl9BUExJTUlUCTB4ZGMKKyNkZWZpbmUgTlZJRElBXzJfQVRUQkFTRShpKQkoMHhlMCArIChpKSAqIDQpCisjZGVmaW5lIE5WSURJQV8zX0FQQkFTRQkJMHg1MAorI2RlZmluZSBOVklESUFfM19BUExJTUlUCTB4NTQKKworCitzdGF0aWMgc3RydWN0IF9udmlkaWFfcHJpdmF0ZSB7CisJc3RydWN0IHBjaV9kZXYgKmRldl8xOworCXN0cnVjdCBwY2lfZGV2ICpkZXZfMjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2XzM7CisJdm9sYXRpbGUgdTMyIF9faW9tZW0gKmFwZXJ0dXJlOworCWludCBudW1fYWN0aXZlX2VudHJpZXM7CisJb2ZmX3QgcGdfb2Zmc2V0OworCXUzMiB3YmNfbWFzazsKK30gbnZpZGlhX3ByaXZhdGU7CisKKworc3RhdGljIGludCBudmlkaWFfZmV0Y2hfc2l6ZSh2b2lkKQoreworCWludCBpOworCXU4IHNpemVfdmFsdWU7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKnZhbHVlczsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgTlZJRElBXzBfQVBTSVpFLCAmc2l6ZV92YWx1ZSk7CisJc2l6ZV92YWx1ZSAmPSAweDBmOworCXZhbHVlcyA9IEFfU0laRV84KGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJaWYgKHNpemVfdmFsdWUgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJCWFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKwkJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKKwkJCXJldHVybiB2YWx1ZXNbaV0uc2l6ZTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFNZU0NGRyAgICAgICAgICAweEMwMDEwMDEwCisjZGVmaW5lIElPUlJfQkFTRTAgICAgICAweEMwMDEwMDE2CisjZGVmaW5lIElPUlJfTUFTSzAgICAgICAweEMwMDEwMDE3CisjZGVmaW5lIEFNRF9LN19OVU1fSU9SUiAyCisKK3N0YXRpYyBpbnQgbnZpZGlhX2luaXRfaW9ycih1MzIgYmFzZSwgdTMyIHNpemUpCit7CisJdTMyIGJhc2VfaGksIGJhc2VfbG87CisJdTMyIG1hc2tfaGksIG1hc2tfbG87CisJdTMyIHN5c19oaSwgc3lzX2xvOworCXUzMiBpb3JyX2FkZHIsIGZyZWVfaW9ycl9hZGRyOworCisJLyogRmluZCB0aGUgaW9yciB0aGF0IGlzIGFscmVhZHkgdXNlZCBmb3IgdGhlIGJhc2UgKi8KKwkvKiBJZiBub3QgZm91bmQsIGRldGVybWluZSB0aGUgdXBwZXJtb3N0IGF2YWlsYWJsZSBpb3JyICovCisJZnJlZV9pb3JyX2FkZHIgPSBBTURfSzdfTlVNX0lPUlI7CisJZm9yKGlvcnJfYWRkciA9IDA7IGlvcnJfYWRkciA8IEFNRF9LN19OVU1fSU9SUjsgaW9ycl9hZGRyKyspIHsKKwkJcmRtc3IoSU9SUl9CQVNFMCArIDIgKiBpb3JyX2FkZHIsIGJhc2VfbG8sIGJhc2VfaGkpOworCQlyZG1zcihJT1JSX01BU0swICsgMiAqIGlvcnJfYWRkciwgbWFza19sbywgbWFza19oaSk7CisKKwkJaWYgKChiYXNlX2xvICYgMHhmZmZmZjAwMCkgPT0gKGJhc2UgJiAweGZmZmZmMDAwKSkKKwkJCWJyZWFrOworCisJCWlmICgobWFza19sbyAmIDB4MDAwMDA4MDApID09IDApCisJCQlmcmVlX2lvcnJfYWRkciA9IGlvcnJfYWRkcjsKKwl9CisJCisJaWYgKGlvcnJfYWRkciA+PSBBTURfSzdfTlVNX0lPUlIpIHsKKwkJaW9ycl9hZGRyID0gZnJlZV9pb3JyX2FkZHI7CisJCWlmIChpb3JyX2FkZHIgPj0gQU1EX0s3X05VTV9JT1JSKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorICAgIGJhc2VfaGkgPSAweDA7CisgICAgYmFzZV9sbyA9IChiYXNlICYgfjB4ZmZmKSB8IDB4MTg7CisgICAgbWFza19oaSA9IDB4ZjsKKyAgICBtYXNrX2xvID0gKCh+KHNpemUgLSAxKSkgJiAweGZmZmZmMDAwKSB8IDB4ODAwOworICAgIHdybXNyKElPUlJfQkFTRTAgKyAyICogaW9ycl9hZGRyLCBiYXNlX2xvLCBiYXNlX2hpKTsKKyAgICB3cm1zcihJT1JSX01BU0swICsgMiAqIGlvcnJfYWRkciwgbWFza19sbywgbWFza19oaSk7CisKKyAgICByZG1zcihTWVNDRkcsIHN5c19sbywgc3lzX2hpKTsKKyAgICBzeXNfbG8gfD0gMHgwMDEwMDAwMDsKKyAgICB3cm1zcihTWVNDRkcsIHN5c19sbywgc3lzX2hpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG52aWRpYV9jb25maWd1cmUodm9pZCkKK3sKKwlpbnQgaSwgcmMsIG51bV9kaXJzOworCXUzMiBhcGJhc2UsIGFwbGltaXQ7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKmN1cnJlbnRfc2l6ZTsKKwl1MzIgdGVtcDsKKworCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV84KGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwkvKiBhcGVydHVyZSBzaXplICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgTlZJRElBXzBfQVBTSVpFLAorCQljdXJyZW50X3NpemUtPnNpemVfdmFsdWUpOworCisgICAgLyogYWRkcmVzcyB0byBtYXAgdG8gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBR1BfQVBCQVNFLCAmYXBiYXNlKTsKKwlhcGJhc2UgJj0gUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gYXBiYXNlOworCWFwbGltaXQgPSBhcGJhc2UgKyAoY3VycmVudF9zaXplLT5zaXplICogMTAyNCAqIDEwMjQpIC0gMTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG52aWRpYV9wcml2YXRlLmRldl8yLCBOVklESUFfMl9BUEJBU0UsIGFwYmFzZSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChudmlkaWFfcHJpdmF0ZS5kZXZfMiwgTlZJRElBXzJfQVBMSU1JVCwgYXBsaW1pdCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChudmlkaWFfcHJpdmF0ZS5kZXZfMywgTlZJRElBXzNfQVBCQVNFLCBhcGJhc2UpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobnZpZGlhX3ByaXZhdGUuZGV2XzMsIE5WSURJQV8zX0FQTElNSVQsIGFwbGltaXQpOworCWlmICgwICE9IChyYyA9IG52aWRpYV9pbml0X2lvcnIoYXBiYXNlLCBjdXJyZW50X3NpemUtPnNpemUgKiAxMDI0ICogMTAyNCkpKQorCQlyZXR1cm4gcmM7CisKKwkvKiBkaXJlY3Rvcnkgc2l6ZSBpcyA2NGsgKi8KKwludW1fZGlycyA9IGN1cnJlbnRfc2l6ZS0+c2l6ZSAvIDY0OworCW52aWRpYV9wcml2YXRlLm51bV9hY3RpdmVfZW50cmllcyA9IGN1cnJlbnRfc2l6ZS0+bnVtX2VudHJpZXM7CisJbnZpZGlhX3ByaXZhdGUucGdfb2Zmc2V0ID0gMDsKKwlpZiAobnVtX2RpcnMgPT0gMCkgeworCQludW1fZGlycyA9IDE7CisJCW52aWRpYV9wcml2YXRlLm51bV9hY3RpdmVfZW50cmllcyAvPSAoNjQgLyBjdXJyZW50X3NpemUtPnNpemUpOworCQludmlkaWFfcHJpdmF0ZS5wZ19vZmZzZXQgPSAoYXBiYXNlICYgKDY0ICogMTAyNCAqIDEwMjQgLSAxKSAmCisJCQl+KGN1cnJlbnRfc2l6ZS0+c2l6ZSAqIDEwMjQgKiAxMDI0IC0gMSkpIC8gUEFHRV9TSVpFOworCX0KKworCS8qIGF0dGJhc2UgKi8KKwlmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChudmlkaWFfcHJpdmF0ZS5kZXZfMiwgTlZJRElBXzJfQVRUQkFTRShpKSwKKwkJCShhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyICsgKGkgJSBudW1fZGlycykgKiA2NCAqIDEwMjQpIHwgMSk7CisJfQorCisJLyogZ3RsYiBjb250cm9sICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG52aWRpYV9wcml2YXRlLmRldl8yLCBOVklESUFfMl9HQVJUQ1RSTCwgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobnZpZGlhX3ByaXZhdGUuZGV2XzIsIE5WSURJQV8yX0dBUlRDVFJMLCB0ZW1wIHwgMHgxMSk7CisKKwkvKiBnYXJ0IGNvbnRyb2wgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBOVklESUFfMF9BUFNJWkUsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgTlZJRElBXzBfQVBTSVpFLCB0ZW1wIHwgMHgxMDApOworCisJLyogbWFwIGFwZXJ0dXJlICovCisJbnZpZGlhX3ByaXZhdGUuYXBlcnR1cmUgPQorCQkodm9sYXRpbGUgdTMyIF9faW9tZW0gKikgaW9yZW1hcChhcGJhc2UsIDMzICogUEFHRV9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBudmlkaWFfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpwcmV2aW91c19zaXplOworCXUzMiB0ZW1wOworCisJLyogZ2FydCBjb250cm9sICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgTlZJRElBXzBfQVBTSVpFLCAmdGVtcCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIE5WSURJQV8wX0FQU0laRSwgdGVtcCAmIH4oMHgxMDApKTsKKworCS8qIGd0bGIgY29udHJvbCAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChudmlkaWFfcHJpdmF0ZS5kZXZfMiwgTlZJRElBXzJfR0FSVENUUkwsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG52aWRpYV9wcml2YXRlLmRldl8yLCBOVklESUFfMl9HQVJUQ1RSTCwgdGVtcCAmIH4oMHgxMSkpOworCisJLyogdW5tYXAgYXBlcnR1cmUgKi8KKwlpb3VubWFwKCh2b2lkIF9faW9tZW0gKikgbnZpZGlhX3ByaXZhdGUuYXBlcnR1cmUpOworCisJLyogcmVzdG9yZSBwcmV2aW91cyBhcGVydHVyZSBzaXplICovCisJcHJldmlvdXNfc2l6ZSA9IEFfU0laRV84KGFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIE5WSURJQV8wX0FQU0laRSwKKwkJcHJldmlvdXNfc2l6ZS0+c2l6ZV92YWx1ZSk7CisKKwkvKiByZXN0b3JlIGlvcnIgZm9yIHByZXZpb3VzIGFwZXJ0dXJlIHNpemUgKi8KKwludmlkaWFfaW5pdF9pb3JyKGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIsCisJCXByZXZpb3VzX3NpemUtPnNpemUgKiAxMDI0ICogMTAyNCk7Cit9CisKKworLyoKKyAqIE5vdGUgd2UgY2FuJ3QgdXNlIHRoZSBnZW5lcmljIHJvdXRpbmVzLCBldmVuIHRob3VnaCB0aGV5IGFyZSA5OSUgdGhlIHNhbWUuCisgKiBBcGVydHVyZSBzaXplcyA8NjRNIHN0aWxsIHJlcXVpcmVzIGEgZnVsbCA2NGsgR0FSVCBkaXJlY3RvcnksIGJ1dAorICogb25seSB1c2UgdGhlIHBvcnRpb24gb2YgdGhlIFRMQiBlbnRyaWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgYXBlcnR1cmVzCisgKiBhbGlnbm1lbnQgaW5zaWRlIHRoZSBzdXJyb3VuZGluZyA2NE0gYmxvY2suCisgKi8KK2V4dGVybiBpbnQgYWdwX21lbW9yeV9yZXNlcnZlZDsKKworc3RhdGljIGludCBudmlkaWFfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJaW50IGksIGo7CisJCisJaWYgKCh0eXBlICE9IDApIHx8IChtZW0tPnR5cGUgIT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCQorCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4KKwkJKG52aWRpYV9wcml2YXRlLm51bV9hY3RpdmVfZW50cmllcyAtIGFncF9tZW1vcnlfcmVzZXJ2ZWQvUEFHRV9TSVpFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJZm9yKGogPSBwZ19zdGFydDsgaiA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCk7IGorKykgeworCQlpZiAoIVBHRV9FTVBUWShhZ3BfYnJpZGdlLCByZWFkbChhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlK252aWRpYV9wcml2YXRlLnBnX29mZnNldCtqKSkpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChtZW0tPmlzX2ZsdXNoZWQgPT0gRkFMU0UpIHsKKwkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJCW1lbS0+aXNfZmx1c2hlZCA9IFRSVUU7CisJfQorCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKKwkJd3JpdGVsKGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKKwkJCW1lbS0+bWVtb3J5W2ldLCBtZW0tPnR5cGUpLAorCQkJYWdwX2JyaWRnZS0+Z2F0dF90YWJsZStudmlkaWFfcHJpdmF0ZS5wZ19vZmZzZXQraik7CisJCXJlYWRsKGFncF9icmlkZ2UtPmdhdHRfdGFibGUrbnZpZGlhX3ByaXZhdGUucGdfb2Zmc2V0K2opOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisJYWdwX2JyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG52aWRpYV9yZW1vdmVfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKK3sKKwlpbnQgaTsKKworCWlmICgodHlwZSAhPSAwKSB8fCAobWVtLT50eXBlICE9IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKG1lbS0+cGFnZV9jb3VudCArIHBnX3N0YXJ0KTsgaSsrKQorCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlK252aWRpYV9wcml2YXRlLnBnX29mZnNldCtpKTsKKworCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgbnZpZGlhX3RsYmZsdXNoKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisJdTMyIHdiY19yZWcsIHRlbXA7CisJaW50IGk7CisKKwkvKiBmbHVzaCBjaGlwc2V0ICovCisJaWYgKG52aWRpYV9wcml2YXRlLndiY19tYXNrKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChudmlkaWFfcHJpdmF0ZS5kZXZfMSwgTlZJRElBXzFfV0JDLCAmd2JjX3JlZyk7CisJCXdiY19yZWcgfD0gbnZpZGlhX3ByaXZhdGUud2JjX21hc2s7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQobnZpZGlhX3ByaXZhdGUuZGV2XzEsIE5WSURJQV8xX1dCQywgd2JjX3JlZyk7CisKKwkJZW5kID0gamlmZmllcyArIDMqSFo7CisJCWRvIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChudmlkaWFfcHJpdmF0ZS5kZXZfMSwKKwkJCQkJTlZJRElBXzFfV0JDLCAmd2JjX3JlZyk7CisJCQlpZiAoKHNpZ25lZCkoZW5kIC0gamlmZmllcykgPD0gMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCQkgICAgIlRMQiBmbHVzaCB0b29rIG1vcmUgdGhhbiAzIHNlY29uZHMuXG4iKTsKKwkJCX0KKwkJfSB3aGlsZSAod2JjX3JlZyAmIG52aWRpYV9wcml2YXRlLndiY19tYXNrKTsKKwl9CisKKwkvKiBmbHVzaCBUTEIgZW50cmllcyAqLworCWZvcihpID0gMDsgaSA8IDMyICsgMTsgaSsrKQorCQl0ZW1wID0gcmVhZGwobnZpZGlhX3ByaXZhdGUuYXBlcnR1cmUrKGkgKiBQQUdFX1NJWkUgLyBzaXplb2YodTMyKSkpOworCWZvcihpID0gMDsgaSA8IDMyICsgMTsgaSsrKQorCQl0ZW1wID0gcmVhZGwobnZpZGlhX3ByaXZhdGUuYXBlcnR1cmUrKGkgKiBQQUdFX1NJWkUgLyBzaXplb2YodTMyKSkpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCBudmlkaWFfZ2VuZXJpY19zaXplc1s1XSA9Cit7CisJezUxMiwgMTMxMDcyLCA3LCAwfSwKKwl7MjU2LCA2NTUzNiwgNiwgOH0sCisJezEyOCwgMzI3NjgsIDUsIDEyfSwKKwl7NjQsIDE2Mzg0LCA0LCAxNH0sCisJLyogVGhlIDMyTSBtb2RlIHN0aWxsIHJlcXVpcmVzIGEgNjRrIGdhdHQgKi8KKwl7MzIsIDE2Mzg0LCA0LCAxNX0KK307CisKKworc3RhdGljIHN0cnVjdCBnYXR0X21hc2sgbnZpZGlhX2dlbmVyaWNfbWFza3NbXSA9Cit7CisJeyAubWFzayA9IDEsIC50eXBlID0gMH0KK307CisKKworc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIG52aWRpYV9kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gbnZpZGlhX2dlbmVyaWNfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDUsCisJLmNvbmZpZ3VyZQkJPSBudmlkaWFfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IG52aWRpYV9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IG52aWRpYV9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gbnZpZGlhX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IG52aWRpYV9nZW5lcmljX21hc2tzLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gbnZpZGlhX2luc2VydF9tZW1vcnksCisJLnJlbW92ZV9tZW1vcnkJCT0gbnZpZGlhX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFncF9udmlkaWFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisJdTggY2FwX3B0cjsKKworCW52aWRpYV9wcml2YXRlLmRldl8xID0KKwkJcGNpX2ZpbmRfc2xvdCgodW5zaWduZWQgaW50KXBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfREVWRk4oMCwgMSkpOworCW52aWRpYV9wcml2YXRlLmRldl8yID0KKwkJcGNpX2ZpbmRfc2xvdCgodW5zaWduZWQgaW50KXBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfREVWRk4oMCwgMikpOworCW52aWRpYV9wcml2YXRlLmRldl8zID0KKwkJcGNpX2ZpbmRfc2xvdCgodW5zaWduZWQgaW50KXBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfREVWRk4oMzAsIDApKTsKKwkKKwlpZiAoIW52aWRpYV9wcml2YXRlLmRldl8xIHx8ICFudmlkaWFfcHJpdmF0ZS5kZXZfMiB8fCAhbnZpZGlhX3ByaXZhdGUuZGV2XzMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldGVjdGVkIGFuIE5WSURJQSBuRm9yY2UvbkZvcmNlMiAiCisJCQkiY2hpcHNldCwgYnV0IGNvdWxkIG5vdCBmaW5kIHRoZSBzZWNvbmRhcnkgZGV2aWNlcy5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljYXBfcHRyID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0FHUCk7CisJaWYgKCFjYXBfcHRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN3aXRjaCAocGRldi0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0U6CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBOVklESUEgbkZvcmNlIGNoaXBzZXRcbiIpOworCQludmlkaWFfcHJpdmF0ZS53YmNfbWFzayA9IDB4MDAwMTAwMDA7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFMjoKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldGVjdGVkIE5WSURJQSBuRm9yY2UyIGNoaXBzZXRcbiIpOworCQludmlkaWFfcHJpdmF0ZS53YmNfbWFzayA9IDB4ODAwMDAwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuc3VwcG9ydGVkIE5WSURJQSBjaGlwc2V0IChkZXZpY2UgaWQ6ICUwNHgpXG4iLAorCQkJICAgIHBkZXYtPmRldmljZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWJyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlicmlkZ2UtPmRyaXZlciA9ICZudmlkaWFfZHJpdmVyOworCWJyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YSA9ICZudmlkaWFfcHJpdmF0ZSwKKwlicmlkZ2UtPmRldiA9IHBkZXY7CisJYnJpZGdlLT5jYXBuZHggPSBjYXBfcHRyOworCisJLyogRmlsbCBpbiB0aGUgbW9kZSByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LAorCQkJYnJpZGdlLT5jYXBuZHgrUENJX0FHUF9TVEFUVVMsCisJCQkmYnJpZGdlLT5tb2RlKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX252aWRpYV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJYWdwX3JlbW92ZV9icmlkZ2UoYnJpZGdlKTsKKwlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWdwX252aWRpYV9wY2lfdGFibGVbXSA9IHsKKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFLAorCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCX0sCisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTIsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZ3BfbnZpZGlhX3BjaV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZ3BfbnZpZGlhX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFncGdhcnQtbnZpZGlhIiwKKwkuaWRfdGFibGUJPSBhZ3BfbnZpZGlhX3BjaV90YWJsZSwKKwkucHJvYmUJCT0gYWdwX252aWRpYV9wcm9iZSwKKwkucmVtb3ZlCQk9IGFncF9udmlkaWFfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWdwX252aWRpYV9pbml0KHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3BfbnZpZGlhX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWdwX252aWRpYV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZ3BfbnZpZGlhX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZ3BfbnZpZGlhX2luaXQpOworbW9kdWxlX2V4aXQoYWdwX252aWRpYV9jbGVhbnVwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKK01PRFVMRV9BVVRIT1IoIk5WSURJQSBDb3Jwb3JhdGlvbiIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3NnaS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3Avc2dpLWFncC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiM2VkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL3NnaS1hZ3AuYwpAQCAtMCwwICsxLDMzMSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKworLyoKKyAqIFNHSSBUSU9DQSBBR1BHQVJUIHJvdXRpbmVzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgorI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KKyNpbmNsdWRlIDxhc20vc24vdGlvY2FfcHJvdmlkZXIuaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworZXh0ZXJuIGludCBhZ3BfbWVtb3J5X3Jlc2VydmVkOworZXh0ZXJuIHVpbnQzMl90IHRpb2NhX2dhcnRfZm91bmQ7CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCB0aW9jYV9saXN0Oworc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKipzZ2lfdGlvY2FfYWdwX2JyaWRnZXM7CisKKy8qCisgKiBUaGUgYXBlcmF0dXJlIHNpemUgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24gaXMgc2V0IHVwIGF0IFRJT0NBIGluaXQgdGltZS4KKyAqIFZhbHVlcyBmb3IgdGhpcyB0YWJsZSB3aWxsIGJlIGV4dHJhY3RlZCBhbmQgZmlsbGVkIGluIGF0CisgKiBzZ2lfdGlvY2FfZmV0Y2hfc2l6ZSgpIHRpbWUuCisgKi8KKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCBzZ2lfdGlvY2Ffc2l6ZXNbXSA9IHsKKwl7MCwgMCwgMH0sCit9OworCitzdGF0aWMgdm9pZCAqc2dpX3Rpb2NhX2FsbG9jX3BhZ2Uoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBuaWQ7CisJc3RydWN0IHRpb2NhX2tlcm5lbCAqaW5mbyA9CisJICAgIChzdHJ1Y3QgdGlvY2Ffa2VybmVsICopYnJpZGdlLT5kZXZfcHJpdmF0ZV9kYXRhOworCisJbmlkID0gaW5mby0+Y2FfY2xvc2VzdF9ub2RlOworCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKG5pZCwgR0ZQX0tFUk5FTCwgMCk7CisJaWYgKHBhZ2UgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlnZXRfcGFnZShwYWdlKTsKKwlTZXRQYWdlTG9ja2VkKHBhZ2UpOworCWF0b21pY19pbmMoJmFncF9icmlkZ2UtPmN1cnJlbnRfbWVtb3J5X2FncCk7CisJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKK30KKworLyoKKyAqIEZsdXNoIEdBUlQgdGxiJ3MuICBDYW5ub3Qgc2VsZWN0aXZlbHkgZmx1c2ggYmFzZWQgb24gbWVtb3J5IHNvIHRoZSBtZW0KKyAqIGFyZyBpcyBpZ25vcmVkLgorICovCisKK3N0YXRpYyB2b2lkIHNnaV90aW9jYV90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXRpb2NhX3RsYmZsdXNoKG1lbS0+YnJpZGdlLT5kZXZfcHJpdmF0ZV9kYXRhKTsKK30KKworLyoKKyAqIEdpdmVuIGFuIGFkZHJlc3Mgb2YgYSBob3N0IHBoeXNpY2FsIHBhZ2UsIHR1cm4gaXQgaW50byBhIHZhbGlkIGdhcnQKKyAqIGVudHJ5LgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZworc2dpX3Rpb2NhX21hc2tfbWVtb3J5KHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gdGlvY2FfcGh5c3BhZ2VfdG9fZ2FydChhZGRyKTsKK30KKworc3RhdGljIHZvaWQgc2dpX3Rpb2NhX2FncF9lbmFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCB1MzIgbW9kZSkKK3sKKwl0aW9jYV9mYXN0d3JpdGVfZW5hYmxlKGJyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YSk7Cit9CisKKy8qCisgKiBzZ2lfdGlvY2FfY29uZmlndXJlKCkgZG9lc24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIHNpbmNlIHRoZSBiYXNlIENBIGRyaXZlcgorICogaGFzIGFscmVheSBzZXQgdXAgdGhlIEdBUlQuCisgKi8KKworc3RhdGljIGludCBzZ2lfdGlvY2FfY29uZmlndXJlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgZ2Z4IGFwZXJhdHVyZSBzaXplLiAgVGhpcyBoYXMgYWxyZWFkeSBiZWVuIGRldGVybWluZWQgYnkgdGhlCisgKiBDQSBkcml2ZXIgaW5pdCwgc28ganVzdCBuZWVkIHRvIHNldCBhZ3BfYnJpZGdlIHZhbHVlcyBhY2NvcmRpbmdseS4KKyAqLworCitzdGF0aWMgaW50IHNnaV90aW9jYV9mZXRjaF9zaXplKHZvaWQpCit7CisJc3RydWN0IHRpb2NhX2tlcm5lbCAqaW5mbyA9CisJICAgIChzdHJ1Y3QgdGlvY2Ffa2VybmVsICopYWdwX2JyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YTsKKworCXNnaV90aW9jYV9zaXplc1swXS5zaXplID0gaW5mby0+Y2FfZ2Z4YXBfc2l6ZSAvIE1CKDEpOworCXNnaV90aW9jYV9zaXplc1swXS5udW1fZW50cmllcyA9IGluZm8tPmNhX2dmeGdhcnRfZW50cmllczsKKworCXJldHVybiBzZ2lfdGlvY2Ffc2l6ZXNbMF0uc2l6ZTsKK30KKworc3RhdGljIGludCBzZ2lfdGlvY2FfY3JlYXRlX2dhdHRfdGFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXN0cnVjdCB0aW9jYV9rZXJuZWwgKmluZm8gPQorCSAgICAoc3RydWN0IHRpb2NhX2tlcm5lbCAqKWJyaWRnZS0+ZGV2X3ByaXZhdGVfZGF0YTsKKworCWJyaWRnZS0+Z2F0dF90YWJsZV9yZWFsID0gKHUzMiAqKSBpbmZvLT5jYV9nZnhnYXJ0OworCWJyaWRnZS0+Z2F0dF90YWJsZSA9IGJyaWRnZS0+Z2F0dF90YWJsZV9yZWFsOworCWJyaWRnZS0+Z2F0dF9idXNfYWRkciA9IGluZm8tPmNhX2dmeGdhcnRfYmFzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNnaV90aW9jYV9mcmVlX2dhdHRfdGFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNnaV90aW9jYV9pbnNlcnRfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LAorCQkJCSAgIGludCB0eXBlKQoreworCWludCBudW1fZW50cmllczsKKwlzaXplX3QgaTsKKwlvZmZfdCBqOworCXZvaWQgKnRlbXA7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCisJYnJpZGdlID0gbWVtLT5icmlkZ2U7CisJaWYgKCFicmlkZ2UpCisJCXJldHVybiAtRUlOVkFMOworCisJdGVtcCA9IGJyaWRnZS0+Y3VycmVudF9zaXplOworCisJc3dpdGNoIChicmlkZ2UtPmRyaXZlci0+c2l6ZV90eXBlKSB7CisJY2FzZSBVOF9BUEVSX1NJWkU6CisJCW51bV9lbnRyaWVzID0gQV9TSVpFXzgodGVtcCktPm51bV9lbnRyaWVzOworCQlicmVhazsKKwljYXNlIFUxNl9BUEVSX1NJWkU6CisJCW51bV9lbnRyaWVzID0gQV9TSVpFXzE2KHRlbXApLT5udW1fZW50cmllczsKKwkJYnJlYWs7CisJY2FzZSBVMzJfQVBFUl9TSVpFOgorCQludW1fZW50cmllcyA9IEFfU0laRV8zMih0ZW1wKS0+bnVtX2VudHJpZXM7CisJCWJyZWFrOworCWNhc2UgRklYRURfQVBFUl9TSVpFOgorCQludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOworCQlicmVhazsKKwljYXNlIExWTDJfQVBFUl9TSVpFOgorCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbnVtX2VudHJpZXMgPSAwOworCQlicmVhazsKKwl9CisKKwludW1fZW50cmllcyAtPSBhZ3BfbWVtb3J5X3Jlc2VydmVkIC8gUEFHRV9TSVpFOworCWlmIChudW1fZW50cmllcyA8IDApCisJCW51bV9lbnRyaWVzID0gMDsKKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlqID0gcGdfc3RhcnQ7CisKKwl3aGlsZSAoaiA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkpIHsKKwkJaWYgKCooYnJpZGdlLT5nYXR0X3RhYmxlICsgaikpCisJCQlyZXR1cm4gLUVCVVNZOworCQlqKys7CisJfQorCisJaWYgKG1lbS0+aXNfZmx1c2hlZCA9PSBGQUxTRSkgeworCQlicmlkZ2UtPmRyaXZlci0+Y2FjaGVfZmx1c2goKTsKKwkJbWVtLT5pc19mbHVzaGVkID0gVFJVRTsKKwl9CisKKwlmb3IgKGkgPSAwLCBqID0gcGdfc3RhcnQ7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKywgaisrKSB7CisJCSooYnJpZGdlLT5nYXR0X3RhYmxlICsgaikgPQorCQkgICAgYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGJyaWRnZSwgbWVtLT5tZW1vcnlbaV0sCisJCQkJCQltZW0tPnR5cGUpOworCX0KKworCWJyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZ2lfdGlvY2FfcmVtb3ZlX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwKKwkJCQkgICBpbnQgdHlwZSkKK3sKKwlzaXplX3QgaTsKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisKKwlicmlkZ2UgPSBtZW0tPmJyaWRnZTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKG1lbS0+cGFnZV9jb3VudCArIHBnX3N0YXJ0KTsgaSsrKSB7CisJCSooYnJpZGdlLT5nYXR0X3RhYmxlICsgaSkgPSAwOworCX0KKworCWJyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2dpX3Rpb2NhX2NhY2hlX2ZsdXNoKHZvaWQpCit7Cit9CisKKy8qCisgKiBDbGVhbnVwLiAgTm90aGluZyB0byBkbyBhcyB0aGUgQ0EgZHJpdmVyIG93bnMgdGhlIEdBUlQuCisgKi8KKworc3RhdGljIHZvaWQgc2dpX3Rpb2NhX2NsZWFudXAodm9pZCkKK3sKK30KKworc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKnNnaV90aW9jYV9maW5kX2JyaWRnZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJyaWRnZSwgJmFncF9icmlkZ2VzLCBsaXN0KSB7CisJCWlmIChicmlkZ2UtPmRldi0+YnVzID09IHBkZXYtPmJ1cykKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gYnJpZGdlOworfQorCitzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgc2dpX3Rpb2NhX2RyaXZlciA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuc2l6ZV90eXBlID0gVTE2X0FQRVJfU0laRSwKKwkuY29uZmlndXJlID0gc2dpX3Rpb2NhX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZSA9IHNnaV90aW9jYV9mZXRjaF9zaXplLAorCS5jbGVhbnVwID0gc2dpX3Rpb2NhX2NsZWFudXAsCisJLnRsYl9mbHVzaCA9IHNnaV90aW9jYV90bGJmbHVzaCwKKwkubWFza19tZW1vcnkgPSBzZ2lfdGlvY2FfbWFza19tZW1vcnksCisJLmFncF9lbmFibGUgPSBzZ2lfdGlvY2FfYWdwX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2ggPSBzZ2lfdGlvY2FfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlID0gc2dpX3Rpb2NhX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUgPSBzZ2lfdGlvY2FfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5ID0gc2dpX3Rpb2NhX2luc2VydF9tZW1vcnksCisJLnJlbW92ZV9tZW1vcnkgPSBzZ2lfdGlvY2FfcmVtb3ZlX21lbW9yeSwKKwkuYWxsb2NfYnlfdHlwZSA9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZSA9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UgPSBzZ2lfdGlvY2FfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZSA9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuY2FudF91c2VfYXBlcnR1cmUgPSAxLAorCS5uZWVkc19zY3JhdGNoX3BhZ2UgPSAwLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMgPSAxLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWdwX3NnaV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGo7CisJc3RydWN0IHRpb2NhX2tlcm5lbCAqaW5mbzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisKKwlpZiAodGlvY2FfZ2FydF9mb3VuZCkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlNHSSBUSU8gQ0EgR0FSVCBkcml2ZXIgaW5pdGlhbGl6ZWQuXG4iKTsKKwllbHNlCisJCXJldHVybiAwOworCisJc2dpX3Rpb2NhX2FncF9icmlkZ2VzID0KKwkgICAgKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKiopa21hbGxvYyh0aW9jYV9nYXJ0X2ZvdW5kICoKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICopLAorCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisKKwlqID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZ0aW9jYV9saXN0LCBjYV9saXN0KSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwkJbGlzdF9mb3JfZWFjaCh0bXAsIGluZm8tPmNhX2RldmljZXMpIHsKKwkJCXU4IGNhcF9wdHI7CisJCQlwZGV2ID0gcGNpX2Rldl9iKHRtcCk7CisJCQlpZiAocGRldi0+Y2xhc3MgIT0gKFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4KSkKKwkJCQljb250aW51ZTsKKwkJCWNhcF9wdHIgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfQUdQKTsKKwkJCWlmICghY2FwX3B0cikKKwkJCQljb250aW51ZTsKKwkJfQorCQlzZ2lfdGlvY2FfYWdwX2JyaWRnZXNbal0gPSBhZ3BfYWxsb2NfYnJpZGdlKCk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJicmlkZ2UgJWQgPSAweCVwXG4iLCBqLAorCQkgICAgICAgc2dpX3Rpb2NhX2FncF9icmlkZ2VzW2pdKTsKKwkJaWYgKHNnaV90aW9jYV9hZ3BfYnJpZGdlc1tqXSkgeworCQkJc2dpX3Rpb2NhX2FncF9icmlkZ2VzW2pdLT5kZXYgPSBwZGV2OworCQkJc2dpX3Rpb2NhX2FncF9icmlkZ2VzW2pdLT5kZXZfcHJpdmF0ZV9kYXRhID0gaW5mbzsKKwkJCXNnaV90aW9jYV9hZ3BfYnJpZGdlc1tqXS0+ZHJpdmVyID0gJnNnaV90aW9jYV9kcml2ZXI7CisJCQlzZ2lfdGlvY2FfYWdwX2JyaWRnZXNbal0tPmdhcnRfYnVzX2FkZHIgPQorCQkJICAgIGluZm8tPmNhX2dmeGFwX2Jhc2U7CisJCQlzZ2lfdGlvY2FfYWdwX2JyaWRnZXNbal0tPm1vZGUgPSAoMHg3RCA8PCAyNCkgfAkvKiAxMjYgcmVxdWVzdHMgKi8KKwkJCSAgICAoMHgxIDw8IDkpIHwJLyogU0JBIHN1cHBvcnRlZCAqLworCQkJICAgICgweDEgPDwgNSkgfAkvKiA2NC1iaXQgYWRkcmVzc2VzIHN1cHBvcnRlZCAqLworCQkJICAgICgweDEgPDwgNCkgfAkvKiBGVyBzdXBwb3J0ZWQgKi8KKwkJCSAgICAoMHgxIDw8IDMpIHwJLyogQUdQIDMuMCBtb2RlICovCisJCQkgICAgMHgyOwkvKiA4eCB0cmFuc2ZlciBvbmx5ICovCisJCQlzZ2lfdGlvY2FfYWdwX2JyaWRnZXNbal0tPmN1cnJlbnRfc2l6ZSA9CisJCQkgICAgc2dpX3Rpb2NhX2FncF9icmlkZ2VzW2pdLT5wcmV2aW91c19zaXplID0KKwkJCSAgICAodm9pZCAqKSZzZ2lfdGlvY2Ffc2l6ZXNbMF07CisJCQlhZ3BfYWRkX2JyaWRnZShzZ2lfdGlvY2FfYWdwX2JyaWRnZXNbal0pOworCQl9CisJCWorKzsKKwl9CisKKwlhZ3BfZmluZF9icmlkZ2UgPSAmc2dpX3Rpb2NhX2ZpbmRfYnJpZGdlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX3NnaV9jbGVhbnVwKHZvaWQpCit7CisJaWYoc2dpX3Rpb2NhX2FncF9icmlkZ2VzKQorCQlrZnJlZShzZ2lfdGlvY2FfYWdwX2JyaWRnZXMpOworCXNnaV90aW9jYV9hZ3BfYnJpZGdlcz1OVUxMOworfQorCittb2R1bGVfaW5pdChhZ3Bfc2dpX2luaXQpOworbW9kdWxlX2V4aXQoYWdwX3NnaV9jbGVhbnVwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3Avc2lzLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9zaXMtYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjY2FjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3Avc2lzLWFncC5jCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogU2lTIEFHUEdBUlQgcm91dGluZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiYWdwLmgiCisKKyNkZWZpbmUgU0lTX0FUVEJBU0UJMHg5MAorI2RlZmluZSBTSVNfQVBTSVpFCTB4OTQKKyNkZWZpbmUgU0lTX1RMQkNOVFJMCTB4OTcKKyNkZWZpbmUgU0lTX1RMQkZMVVNICTB4OTgKKworc3RhdGljIGludCBfX2RldmluaXRkYXRhIGFncF9zaXNfZm9yY2VfZGVsYXkgPSAwOworc3RhdGljIGludCBfX2RldmluaXRkYXRhIGFncF9zaXNfYWdwX3NwZWMgPSAtMTsKKworc3RhdGljIGludCBzaXNfZmV0Y2hfc2l6ZSh2b2lkKQoreworCXU4IHRlbXBfc2l6ZTsKKwlpbnQgaTsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCAqdmFsdWVzOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBTSVNfQVBTSVpFLCAmdGVtcF9zaXplKTsKKwl2YWx1ZXMgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5kcml2ZXItPmFwZXJ0dXJlX3NpemVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWdwX2JyaWRnZS0+ZHJpdmVyLT5udW1fYXBlcnR1cmVfc2l6ZXM7IGkrKykgeworCQlpZiAoKHRlbXBfc2l6ZSA9PSB2YWx1ZXNbaV0uc2l6ZV92YWx1ZSkgfHwKKwkJICAgICgodGVtcF9zaXplICYgfigweDAzKSkgPT0KKwkJICAgICAodmFsdWVzW2ldLnNpemVfdmFsdWUgJiB+KDB4MDMpKSkpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKworCQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQkJcmV0dXJuIHZhbHVlc1tpXS5zaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNpc190bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIFNJU19UTEJGTFVTSCwgMHgwMik7Cit9CisKK3N0YXRpYyBpbnQgc2lzX2NvbmZpZ3VyZSh2b2lkKQoreworCXUzMiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpjdXJyZW50X3NpemU7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIFNJU19UTEJDTlRSTCwgMHgwNSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQUdQX0FQQkFTRSwgJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBTSVNfQVRUQkFTRSwKKwkJCSAgICAgICBhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBTSVNfQVBTSVpFLAorCQkJICAgICAgY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2lzX2NsZWFudXAodm9pZCkKK3sKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCAqcHJldmlvdXNfc2l6ZTsKKworCXByZXZpb3VzX3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBTSVNfQVBTSVpFLAorCQkJICAgICAgKHByZXZpb3VzX3NpemUtPnNpemVfdmFsdWUgJiB+KDB4MDMpKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNpc19kZWxheWVkX2VuYWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHUzMiBtb2RlKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXZpY2UgPSBOVUxMOworCXUzMiBjb21tYW5kOworCWludCByYXRlOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkZvdW5kIGFuIEFHUCAlZC4lZCBjb21wbGlhbnQgZGV2aWNlIGF0ICVzLlxuIiwKKwkJYWdwX2JyaWRnZS0+bWFqb3JfdmVyc2lvbiwKKwkJYWdwX2JyaWRnZS0+bWlub3JfdmVyc2lvbiwKKwkJcGNpX25hbWUoYWdwX2JyaWRnZS0+ZGV2KSk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBhZ3BfYnJpZGdlLT5jYXBuZHggKyBQQ0lfQUdQX1NUQVRVUywgJmNvbW1hbmQpOworCWNvbW1hbmQgPSBhZ3BfY29sbGVjdF9kZXZpY2Vfc3RhdHVzKGJyaWRnZSwgbW9kZSwgY29tbWFuZCk7CisJY29tbWFuZCB8PSBBR1BTVEFUX0FHUF9FTkFCTEU7CisJcmF0ZSA9IChjb21tYW5kICYgMHg3KSA8PCAyOworCisJZm9yX2VhY2hfcGNpX2RldihkZXZpY2UpIHsKKwkJdTggYWdwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXZpY2UsIFBDSV9DQVBfSURfQUdQKTsKKwkJaWYgKCFhZ3ApCisJCQljb250aW51ZTsKKworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUHV0dGluZyBBR1AgVjMgZGV2aWNlIGF0ICVzIGludG8gJWR4IG1vZGVcbiIsCisJCQlwY2lfbmFtZShkZXZpY2UpLCByYXRlKTsKKworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldmljZSwgYWdwICsgUENJX0FHUF9DT01NQU5ELCBjb21tYW5kKTsKKworCQkvKgorCQkgKiBXZWlyZDogb24gc29tZSBzaXMgY2hpcHNldHMgYW55IHJhdGUgY2hhbmdlIGluIHRoZSB0YXJnZXQKKwkJICogY29tbWFuZCByZWdpc3RlciB0cmlnZ2VycyBhIDVtcyBzY3Jld3VwIGR1cmluZyB3aGljaCB0aGUgbWFzdGVyCisJCSAqIGNhbm5vdCBiZSBjb25maWd1cmVkCisJCSAqLworCQlpZiAoZGV2aWNlLT5kZXZpY2UgPT0gYnJpZGdlLT5kZXYtPmRldmljZSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlNpUyBkZWxheSB3b3JrYXJvdW5kOiBnaXZpbmcgYnJpZGdlIHRpbWUgdG8gcmVjb3Zlci5cbiIpOworCQkJbXNsZWVwKDEwKTsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCBhcGVyX3NpemVfaW5mb184IHNpc19nZW5lcmljX3NpemVzWzddID0KK3sKKwl7MjU2LCA2NTUzNiwgNiwgOTl9LAorCXsxMjgsIDMyNzY4LCA1LCA4M30sCisJezY0LCAxNjM4NCwgNCwgNjd9LAorCXszMiwgODE5MiwgMywgNTF9LAorCXsxNiwgNDA5NiwgMiwgMzV9LAorCXs4LCAyMDQ4LCAxLCAxOX0sCisJezQsIDEwMjQsIDAsIDN9Cit9OworCitzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgc2lzX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcyAJPSBzaXNfZ2VuZXJpY19zaXplcywKKwkuc2l6ZV90eXBlCQk9IFU4X0FQRVJfU0laRSwKKwkubnVtX2FwZXJ0dXJlX3NpemVzCT0gNywKKwkuY29uZmlndXJlCQk9IHNpc19jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gc2lzX2ZldGNoX3NpemUsCisJLmNsZWFudXAJCT0gc2lzX2NsZWFudXAsCisJLnRsYl9mbHVzaAkJPSBzaXNfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGFncF9nZW5lcmljX21hc2tfbWVtb3J5LAorCS5tYXNrcwkJCT0gTlVMTCwKKwkuYWdwX2VuYWJsZQkJPSBhZ3BfZ2VuZXJpY19lbmFibGUsCisJLmNhY2hlX2ZsdXNoCQk9IGdsb2JhbF9jYWNoZV9mbHVzaCwKKwkuY3JlYXRlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19jcmVhdGVfZ2F0dF90YWJsZSwKKwkuZnJlZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5CQk9IGFncF9nZW5lcmljX2luc2VydF9tZW1vcnksCisJLnJlbW92ZV9tZW1vcnkJCT0gYWdwX2dlbmVyaWNfcmVtb3ZlX21lbW9yeSwKKwkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAorCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAorCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorfTsKKworc3RhdGljIHN0cnVjdCBhZ3BfZGV2aWNlX2lkcyBzaXNfYWdwX2RldmljZV9pZHNbXSBfX2RldmluaXRkYXRhID0KK3sKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzU1OTFfQUdQLAorCQkuY2hpcHNldF9uYW1lCT0gIjU1OTEiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV81MzAsCisJCS5jaGlwc2V0X25hbWUJPSAiNTMwIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfU0lfNTQwLAorCQkuY2hpcHNldF9uYW1lCT0gIjU0MCIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzU1MCwKKwkJLmNoaXBzZXRfbmFtZQk9ICI1NTAiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV82MjAsCisJCS5jaGlwc2V0X25hbWUJPSAiNjIwIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfU0lfNjMwLAorCQkuY2hpcHNldF9uYW1lCT0gIjYzMCIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzYzNSwKKwkJLmNoaXBzZXRfbmFtZQk9ICI2MzUiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV82NDUsCisJCS5jaGlwc2V0X25hbWUJPSAiNjQ1IiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfU0lfNjQ2LAorCQkuY2hpcHNldF9uYW1lCT0gIjY0NiIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzY0OCwKKwkJLmNoaXBzZXRfbmFtZQk9ICI2NDgiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV82NTAsCisJCS5jaGlwc2V0X25hbWUJPSAiNjUwIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZCAgPSBQQ0lfREVWSUNFX0lEX1NJXzY1MSwKKwkJLmNoaXBzZXRfbmFtZSAgID0gIjY1MSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzY1NSwKKwkJLmNoaXBzZXRfbmFtZQk9ICI2NTUiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV82NjEsCisJCS5jaGlwc2V0X25hbWUJPSAiNjYxIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfU0lfNzMwLAorCQkuY2hpcHNldF9uYW1lCT0gIjczMCIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzczNSwKKwkJLmNoaXBzZXRfbmFtZQk9ICI3MzUiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV83NDAsCisJCS5jaGlwc2V0X25hbWUJPSAiNzQwIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfU0lfNzQxLAorCQkuY2hpcHNldF9uYW1lCT0gIjc0MSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1NJXzc0NSwKKwkJLmNoaXBzZXRfbmFtZQk9ICI3NDUiLAorCX0sCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9TSV83NDYsCisJCS5jaGlwc2V0X25hbWUJPSAiNzQ2IiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfU0lfNzYwLAorCQkuY2hpcHNldF9uYW1lCT0gIjc2MCIsCisJfSwKKwl7IH0sIC8qIGR1bW15IGZpbmFsIGVudHJ5LCBhbHdheXMgcHJlc2VudCAqLworfTsKKworCisvLyBjaGlwc2V0cyB0aGF0IHJlcXVpcmUgdGhlICdkZWxheSBoYWNrJworc3RhdGljIGludCBzaXNfYnJva2VuX2NoaXBzZXRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwlQQ0lfREVWSUNFX0lEX1NJXzY0OCwKKwlQQ0lfREVWSUNFX0lEX1NJXzc0NiwKKwkwIC8vIHRlcm1pbmF0b3IKK307CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzaXNfZ2V0X2RyaXZlcihzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJaW50IGk7CisKKwlmb3IoaT0wOyBzaXNfYnJva2VuX2NoaXBzZXRzW2ldIT0wOyArK2kpCisJCWlmKGJyaWRnZS0+ZGV2LT5kZXZpY2U9PXNpc19icm9rZW5fY2hpcHNldHNbaV0pCisJCQlicmVhazsKKworCWlmKHNpc19icm9rZW5fY2hpcHNldHNbaV0gfHwgYWdwX3Npc19mb3JjZV9kZWxheSkKKwkJc2lzX2RyaXZlci5hZ3BfZW5hYmxlPXNpc19kZWxheWVkX2VuYWJsZTsKKworCS8vIHNpcyBjaGlwc2V0cyB0aGF0IGluZGljYXRlIGxlc3MgdGhhbiBhZ3AzLjUKKwkvLyBhcmUgbm90IGFjdHVhbGx5IGZ1bGx5IGFncDMgY29tcGxpYW50CisJaWYgKChhZ3BfYnJpZGdlLT5tYWpvcl92ZXJzaW9uID09IDMgJiYgYWdwX2JyaWRnZS0+bWlub3JfdmVyc2lvbiA+PSA1CisJICAgICAmJiBhZ3Bfc2lzX2FncF9zcGVjIT0wKSB8fCBhZ3Bfc2lzX2FncF9zcGVjPT0xKSB7CisJCXNpc19kcml2ZXIuYXBlcnR1cmVfc2l6ZXMgPSBhZ3AzX2dlbmVyaWNfc2l6ZXM7CisJCXNpc19kcml2ZXIuc2l6ZV90eXBlID0gVTE2X0FQRVJfU0laRTsKKwkJc2lzX2RyaXZlci5udW1fYXBlcnR1cmVfc2l6ZXMgPSBBR1BfR0VORVJJQ19TSVpFU19FTlRSSUVTOworCQlzaXNfZHJpdmVyLmNvbmZpZ3VyZSA9IGFncDNfZ2VuZXJpY19jb25maWd1cmU7CisJCXNpc19kcml2ZXIuZmV0Y2hfc2l6ZSA9IGFncDNfZ2VuZXJpY19mZXRjaF9zaXplOworCQlzaXNfZHJpdmVyLmNsZWFudXAgPSBhZ3AzX2dlbmVyaWNfY2xlYW51cDsKKwkJc2lzX2RyaXZlci50bGJfZmx1c2ggPSBhZ3AzX2dlbmVyaWNfdGxiZmx1c2g7CisJfQorfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFncF9zaXNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgYWdwX2RldmljZV9pZHMgKmRldnMgPSBzaXNfYWdwX2RldmljZV9pZHM7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCXU4IGNhcF9wdHI7CisJaW50IGo7CisKKwljYXBfcHRyID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0FHUCk7CisJaWYgKCFjYXBfcHRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHByb2JlIGZvciBrbm93biBjaGlwc2V0cyAqLworCWZvciAoaiA9IDA7IGRldnNbal0uY2hpcHNldF9uYW1lOyBqKyspIHsKKwkJaWYgKHBkZXYtPmRldmljZSA9PSBkZXZzW2pdLmRldmljZV9pZCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldGVjdGVkIFNpUyAlcyBjaGlwc2V0XG4iLAorCQkJCQlkZXZzW2pdLmNoaXBzZXRfbmFtZSk7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5zdXBwb3J0ZWQgU2lTIGNoaXBzZXQgKGRldmljZSBpZDogJTA0eClcbiIsCisJCSAgICBwZGV2LT5kZXZpY2UpOworCXJldHVybiAtRU5PREVWOworCitmb3VuZDoKKwlicmlkZ2UgPSBhZ3BfYWxsb2NfYnJpZGdlKCk7CisJaWYgKCFicmlkZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJYnJpZGdlLT5kcml2ZXIgPSAmc2lzX2RyaXZlcjsKKwlicmlkZ2UtPmRldiA9IHBkZXY7CisJYnJpZGdlLT5jYXBuZHggPSBjYXBfcHRyOworCisJZ2V0X2FncF92ZXJzaW9uKGJyaWRnZSk7CisKKwkvKiBGaWxsIGluIHRoZSBtb2RlIHJlZ2lzdGVyICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGJyaWRnZS0+Y2FwbmR4K1BDSV9BR1BfU1RBVFVTLCAmYnJpZGdlLT5tb2RlKTsKKwlzaXNfZ2V0X2RyaXZlcihicmlkZ2UpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGJyaWRnZSk7CisJcmV0dXJuIGFncF9hZGRfYnJpZGdlKGJyaWRnZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhZ3Bfc2lzX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlhZ3BfcmVtb3ZlX2JyaWRnZShicmlkZ2UpOworCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhZ3Bfc2lzX3BjaV90YWJsZVtdID0geworCXsKKwkuY2xhc3MJCT0gKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4KSwKKwkuY2xhc3NfbWFzawk9IH4wLAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9TSSwKKwkuZGV2aWNlCQk9IFBDSV9BTllfSUQsCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZ3Bfc2lzX3BjaV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZ3Bfc2lzX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFncGdhcnQtc2lzIiwKKwkuaWRfdGFibGUJPSBhZ3Bfc2lzX3BjaV90YWJsZSwKKwkucHJvYmUJCT0gYWdwX3Npc19wcm9iZSwKKwkucmVtb3ZlCQk9IGFncF9zaXNfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWdwX3Npc19pbml0KHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3Bfc2lzX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWdwX3Npc19jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZ3Bfc2lzX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZ3Bfc2lzX2luaXQpOworbW9kdWxlX2V4aXQoYWdwX3Npc19jbGVhbnVwKTsKKworbW9kdWxlX3BhcmFtKGFncF9zaXNfZm9yY2VfZGVsYXksIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhhZ3Bfc2lzX2ZvcmNlX2RlbGF5LCJmb3JjZXMgc2lzIGRlbGF5IGhhY2siKTsKK21vZHVsZV9wYXJhbShhZ3Bfc2lzX2FncF9zcGVjLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhZ3Bfc2lzX2FncF9zcGVjLCIwPWZvcmNlIHNpcyBpbml0LCAxPWZvcmNlIGdlbmVyaWMgYWdwMyBpbml0LCBkZWZhdWx0OiBhdXRvZGV0ZWN0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9zd29ya3MtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3N3b3Jrcy1hZ3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjMzOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2FncC9zd29ya3MtYWdwLmMKQEAgLTAsMCArMSw1NTYgQEAKKy8qCisgKiBTZXJ2ZXJ3b3JrcyBBR1BHQVJUIHJvdXRpbmVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworI2RlZmluZSBTVldSS1NfQ09NTUFORAkJMHgwNAorI2RlZmluZSBTVldSS1NfQVBTSVpFCQkweDEwCisjZGVmaW5lIFNWV1JLU19NTUJBU0UJCTB4MTQKKyNkZWZpbmUgU1ZXUktTX0NBQ0hJTkcJCTB4NGIKKyNkZWZpbmUgU1ZXUktTX0FHUF9FTkFCTEUJMHg2MAorI2RlZmluZSBTVldSS1NfRkVBVFVSRQkJMHg2OAorCisjZGVmaW5lIFNWV1JLU19TSVpFX01BU0sJMHhmZTAwMDAwMAorCisvKiBNZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyAqLworI2RlZmluZSBTVldSS1NfR0FSVF9DQUNIRQkweDAyCisjZGVmaW5lIFNWV1JLU19HQVRUQkFTRQkJMHgwNAorI2RlZmluZSBTVldSS1NfVExCRkxVU0gJCTB4MTAKKyNkZWZpbmUgU1ZXUktTX1BPU1RGTFVTSAkweDE0CisjZGVmaW5lIFNWV1JLU19ESVJGTFVTSAkJMHgwYworCisKK3N0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCB7CisJdW5zaWduZWQgbG9uZyAqcmVhbDsKKwl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnJlbWFwcGVkOworfTsKKworc3RhdGljIHN0cnVjdCBfc2VydmVyd29ya3NfcHJpdmF0ZSB7CisJc3RydWN0IHBjaV9kZXYgKnN2cndya3NfZGV2OwkvKiBkZXZpY2Ugb25lICovCisJdm9sYXRpbGUgdTggX19pb21lbSAqcmVnaXN0ZXJzOworCXN0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCAqKmdhdHRfcGFnZXM7CisJaW50IG51bV90YWJsZXM7CisJc3RydWN0IHNlcnZlcndvcmtzX3BhZ2VfbWFwIHNjcmF0Y2hfZGlyOworCisJaW50IGdhcnRfYWRkcl9vZnM7CisJaW50IG1tX2FkZHJfb2ZzOworfSBzZXJ2ZXJ3b3Jrc19wcml2YXRlOworCitzdGF0aWMgaW50IHNlcnZlcndvcmtzX2NyZWF0ZV9wYWdlX21hcChzdHJ1Y3Qgc2VydmVyd29ya3NfcGFnZV9tYXAgKnBhZ2VfbWFwKQoreworCWludCBpOworCisJcGFnZV9tYXAtPnJlYWwgPSAodW5zaWduZWQgbG9uZyAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKHBhZ2VfbWFwLT5yZWFsID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwlnbG9iYWxfY2FjaGVfZmx1c2goKTsKKwlwYWdlX21hcC0+cmVtYXBwZWQgPSBpb3JlbWFwX25vY2FjaGUodmlydF90b19waHlzKHBhZ2VfbWFwLT5yZWFsKSwgCisJCQkJCSAgICBQQUdFX1NJWkUpOworCWlmIChwYWdlX21hcC0+cmVtYXBwZWQgPT0gTlVMTCkgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UocGFnZV9tYXAtPnJlYWwpKTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlX21hcC0+cmVhbCk7CisJCXBhZ2VfbWFwLT5yZWFsID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCisJZm9yKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOyBpKyspCisJCXdyaXRlbChhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2UsIHBhZ2VfbWFwLT5yZW1hcHBlZCtpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXJ2ZXJ3b3Jrc19mcmVlX3BhZ2VfbWFwKHN0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCAqcGFnZV9tYXApCit7CisJaW91bm1hcChwYWdlX21hcC0+cmVtYXBwZWQpOworCUNsZWFyUGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShwYWdlX21hcC0+cmVhbCkpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZV9tYXAtPnJlYWwpOworfQorCitzdGF0aWMgdm9pZCBzZXJ2ZXJ3b3Jrc19mcmVlX2dhdHRfcGFnZXModm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2VydmVyd29ya3NfcGFnZV9tYXAgKip0YWJsZXM7CisJc3RydWN0IHNlcnZlcndvcmtzX3BhZ2VfbWFwICplbnRyeTsKKworCXRhYmxlcyA9IHNlcnZlcndvcmtzX3ByaXZhdGUuZ2F0dF9wYWdlczsKKwlmb3IoaSA9IDA7IGkgPCBzZXJ2ZXJ3b3Jrc19wcml2YXRlLm51bV90YWJsZXM7IGkrKykgeworCQllbnRyeSA9IHRhYmxlc1tpXTsKKwkJaWYgKGVudHJ5ICE9IE5VTEwpIHsKKwkJCWlmIChlbnRyeS0+cmVhbCAhPSBOVUxMKSB7CisJCQkJc2VydmVyd29ya3NfZnJlZV9wYWdlX21hcChlbnRyeSk7CisJCQl9CisJCQlrZnJlZShlbnRyeSk7CisJCX0KKwl9CisJa2ZyZWUodGFibGVzKTsKK30KKworc3RhdGljIGludCBzZXJ2ZXJ3b3Jrc19jcmVhdGVfZ2F0dF9wYWdlcyhpbnQgbnJfdGFibGVzKQoreworCXN0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCAqKnRhYmxlczsKKwlzdHJ1Y3Qgc2VydmVyd29ya3NfcGFnZV9tYXAgKmVudHJ5OworCWludCByZXR2YWwgPSAwOworCWludCBpOworCisJdGFibGVzID0ga21hbGxvYygobnJfdGFibGVzICsgMSkgKiBzaXplb2Yoc3RydWN0IHNlcnZlcndvcmtzX3BhZ2VfbWFwICopLCAKKwkJCSBHRlBfS0VSTkVMKTsKKwlpZiAodGFibGVzID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCh0YWJsZXMsIDAsIHNpemVvZihzdHJ1Y3Qgc2VydmVyd29ya3NfcGFnZV9tYXAgKikgKiAobnJfdGFibGVzICsgMSkpOworCWZvciAoaSA9IDA7IGkgPCBucl90YWJsZXM7IGkrKykgeworCQllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCksIEdGUF9LRVJORUwpOworCQlpZiAoZW50cnkgPT0gTlVMTCkgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisJCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKHN0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCkpOworCQl0YWJsZXNbaV0gPSBlbnRyeTsKKwkJcmV0dmFsID0gc2VydmVyd29ya3NfY3JlYXRlX3BhZ2VfbWFwKGVudHJ5KTsKKwkJaWYgKHJldHZhbCAhPSAwKSBicmVhazsKKwl9CisJc2VydmVyd29ya3NfcHJpdmF0ZS5udW1fdGFibGVzID0gbnJfdGFibGVzOworCXNlcnZlcndvcmtzX3ByaXZhdGUuZ2F0dF9wYWdlcyA9IHRhYmxlczsKKworCWlmIChyZXR2YWwgIT0gMCkgc2VydmVyd29ya3NfZnJlZV9nYXR0X3BhZ2VzKCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIFNWUldSS1NfR0VUX0dBVFQoYWRkcikgKHNlcnZlcndvcmtzX3ByaXZhdGUuZ2F0dF9wYWdlc1tcCisJR0VUX1BBR0VfRElSX0lEWChhZGRyKV0tPnJlbWFwcGVkKQorCisjaWZuZGVmIEdFVF9QQUdFX0RJUl9PRkYKKyNkZWZpbmUgR0VUX1BBR0VfRElSX09GRihhZGRyKSAoYWRkciA+PiAyMikKKyNlbmRpZgorCisjaWZuZGVmIEdFVF9QQUdFX0RJUl9JRFgKKyNkZWZpbmUgR0VUX1BBR0VfRElSX0lEWChhZGRyKSAoR0VUX1BBR0VfRElSX09GRihhZGRyKSAtIFwKKwlHRVRfUEFHRV9ESVJfT0ZGKGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIpKQorI2VuZGlmCisKKyNpZm5kZWYgR0VUX0dBVFRfT0ZGCisjZGVmaW5lIEdFVF9HQVRUX09GRihhZGRyKSAoKGFkZHIgJiAweDAwM2ZmMDAwKSA+PiAxMikKKyNlbmRpZgorCitzdGF0aWMgaW50IHNlcnZlcndvcmtzX2NyZWF0ZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiAqdmFsdWU7CisJc3RydWN0IHNlcnZlcndvcmtzX3BhZ2VfbWFwIHBhZ2VfZGlyOworCWludCByZXR2YWw7CisJdTMyIHRlbXA7CisJaW50IGk7CisKKwl2YWx1ZSA9IEFfU0laRV9MVkwyKGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisJcmV0dmFsID0gc2VydmVyd29ya3NfY3JlYXRlX3BhZ2VfbWFwKCZwYWdlX2Rpcik7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHNlcnZlcndvcmtzX2NyZWF0ZV9wYWdlX21hcCgmc2VydmVyd29ya3NfcHJpdmF0ZS5zY3JhdGNoX2Rpcik7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCXNlcnZlcndvcmtzX2ZyZWVfcGFnZV9tYXAoJnBhZ2VfZGlyKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJLyogQ3JlYXRlIGEgZmFrZSBzY3JhdGNoIGRpcmVjdG9yeSAqLworCWZvcihpID0gMDsgaSA8IDEwMjQ7IGkrKykgeworCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBzZXJ2ZXJ3b3Jrc19wcml2YXRlLnNjcmF0Y2hfZGlyLnJlbWFwcGVkK2kpOworCQl3cml0ZWwodmlydF90b19waHlzKHNlcnZlcndvcmtzX3ByaXZhdGUuc2NyYXRjaF9kaXIucmVhbCkgfCAxLCBwYWdlX2Rpci5yZW1hcHBlZCtpKTsKKwl9CisKKwlyZXR2YWwgPSBzZXJ2ZXJ3b3Jrc19jcmVhdGVfZ2F0dF9wYWdlcyh2YWx1ZS0+bnVtX2VudHJpZXMgLyAxMDI0KTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJc2VydmVyd29ya3NfZnJlZV9wYWdlX21hcCgmcGFnZV9kaXIpOworCQlzZXJ2ZXJ3b3Jrc19mcmVlX3BhZ2VfbWFwKCZzZXJ2ZXJ3b3Jrc19wcml2YXRlLnNjcmF0Y2hfZGlyKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWwgPSAodTMyICopcGFnZV9kaXIucmVhbDsKKwlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlID0gKHUzMiBfX2lvbWVtICopcGFnZV9kaXIucmVtYXBwZWQ7CisJYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkciA9IHZpcnRfdG9fcGh5cyhwYWdlX2Rpci5yZWFsKTsKKworCS8qIEdldCB0aGUgYWRkcmVzcyBmb3IgdGhlIGdhcnQgcmVnaW9uLgorCSAqIFRoaXMgaXMgYSBidXMgYWRkcmVzcyBldmVuIG9uIHRoZSBhbHBoYSwgYi9jIGl0cworCSAqIHVzZWQgdG8gcHJvZ3JhbSB0aGUgYWdwIG1hc3RlciBub3QgdGhlIGNwdQorCSAqLworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldixzZXJ2ZXJ3b3Jrc19wcml2YXRlLmdhcnRfYWRkcl9vZnMsJnRlbXApOworCWFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHIgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisJLyogQ2FsY3VsYXRlIHRoZSBhZ3Agb2Zmc2V0ICovCQorCisJZm9yKGkgPSAwOyBpIDwgdmFsdWUtPm51bV9lbnRyaWVzIC8gMTAyNDsgaSsrKQorCQl3cml0ZWwodmlydF90b19waHlzKHNlcnZlcndvcmtzX3ByaXZhdGUuZ2F0dF9wYWdlc1tpXS0+cmVhbCl8MSwgcGFnZV9kaXIucmVtYXBwZWQraSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXJ2ZXJ3b3Jrc19mcmVlX2dhdHRfdGFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQoreworCXN0cnVjdCBzZXJ2ZXJ3b3Jrc19wYWdlX21hcCBwYWdlX2RpcjsKKyAgIAorCXBhZ2VfZGlyLnJlYWwgPSAodW5zaWduZWQgbG9uZyAqKWFncF9icmlkZ2UtPmdhdHRfdGFibGVfcmVhbDsKKwlwYWdlX2Rpci5yZW1hcHBlZCA9ICh1bnNpZ25lZCBsb25nIF9faW9tZW0gKilhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlOworCisJc2VydmVyd29ya3NfZnJlZV9nYXR0X3BhZ2VzKCk7CisJc2VydmVyd29ya3NfZnJlZV9wYWdlX21hcCgmcGFnZV9kaXIpOworCXNlcnZlcndvcmtzX2ZyZWVfcGFnZV9tYXAoJnNlcnZlcndvcmtzX3ByaXZhdGUuc2NyYXRjaF9kaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlcnZlcndvcmtzX2ZldGNoX3NpemUodm9pZCkKK3sKKwlpbnQgaTsKKwl1MzIgdGVtcDsKKwl1MzIgdGVtcDI7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2x2bDIgKnZhbHVlczsKKworCXZhbHVlcyA9IEFfU0laRV9MVkwyKGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsc2VydmVyd29ya3NfcHJpdmF0ZS5nYXJ0X2FkZHJfb2ZzLCZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldixzZXJ2ZXJ3b3Jrc19wcml2YXRlLmdhcnRfYWRkcl9vZnMsCisJCQkJCVNWV1JLU19TSVpFX01BU0spOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsc2VydmVyd29ya3NfcHJpdmF0ZS5nYXJ0X2FkZHJfb2ZzLCZ0ZW1wMik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsc2VydmVyd29ya3NfcHJpdmF0ZS5nYXJ0X2FkZHJfb2ZzLHRlbXApOworCXRlbXAyICY9IFNWV1JLU19TSVpFX01BU0s7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWdwX2JyaWRnZS0+ZHJpdmVyLT5udW1fYXBlcnR1cmVfc2l6ZXM7IGkrKykgeworCQlpZiAodGVtcDIgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKworCQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQkJcmV0dXJuIHZhbHVlc1tpXS5zaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY291bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGFraW5nIHRoZSBhZGRyZXNzZXMKKyAqIHdyaXR0ZW4gdG8gdGhlIEdBVFQsIGFuZCBmbHVzaGluZyB0aGVtIGluZGl2aWR1YWxseS4gIEhvd2V2ZXIKKyAqIGN1cnJlbnRseSBpdCBqdXN0IGZsdXNoZXMgdGhlIHdob2xlIHRhYmxlLiAgV2hpY2ggaXMgcHJvYmFibHkKKyAqIG1vcmUgZWZmaWNlbnQsIHNpbmNlIGFncF9tZW1vcnkgYmxvY2tzIGNhbiBiZSBhIGxhcmdlIG51bWJlciBvZgorICogZW50cmllcy4KKyAqLworc3RhdGljIHZvaWQgc2VydmVyd29ya3NfdGxiZmx1c2goc3RydWN0IGFncF9tZW1vcnkgKnRlbXApCit7CisJd3JpdGViKDEsIHNlcnZlcndvcmtzX3ByaXZhdGUucmVnaXN0ZXJzK1NWV1JLU19QT1NURkxVU0gpOworCXdoaWxlIChyZWFkYihzZXJ2ZXJ3b3Jrc19wcml2YXRlLnJlZ2lzdGVycytTVldSS1NfUE9TVEZMVVNIKSA9PSAxKQorCQljcHVfcmVsYXgoKTsKKworCXdyaXRlbCgxLCBzZXJ2ZXJ3b3Jrc19wcml2YXRlLnJlZ2lzdGVycytTVldSS1NfRElSRkxVU0gpOworCXdoaWxlKHJlYWRsKHNlcnZlcndvcmtzX3ByaXZhdGUucmVnaXN0ZXJzK1NWV1JLU19ESVJGTFVTSCkgPT0gMSkKKwkJY3B1X3JlbGF4KCk7Cit9CisKK3N0YXRpYyBpbnQgc2VydmVyd29ya3NfY29uZmlndXJlKHZvaWQpCit7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2x2bDIgKmN1cnJlbnRfc2l6ZTsKKwl1MzIgdGVtcDsKKwl1OCBlbmFibGVfcmVnOworCXUxNiBjYXBfcmVnOworCisJY3VycmVudF9zaXplID0gQV9TSVpFX0xWTDIoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKKworCS8qIEdldCB0aGUgbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBzZXJ2ZXJ3b3Jrc19wcml2YXRlLm1tX2FkZHJfb2ZzLCAmdGVtcCk7CisJdGVtcCA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisJc2VydmVyd29ya3NfcHJpdmF0ZS5yZWdpc3RlcnMgPSAodm9sYXRpbGUgdTggX19pb21lbSAqKSBpb3JlbWFwKHRlbXAsIDQwOTYpOworCWlmICghc2VydmVyd29ya3NfcHJpdmF0ZS5yZWdpc3RlcnMpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBpb3JlbWFwKCkgbWVtb3J5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXdyaXRlYigweEEsIHNlcnZlcndvcmtzX3ByaXZhdGUucmVnaXN0ZXJzK1NWV1JLU19HQVJUX0NBQ0hFKTsKKwlyZWFkYihzZXJ2ZXJ3b3Jrc19wcml2YXRlLnJlZ2lzdGVycytTVldSS1NfR0FSVF9DQUNIRSk7CS8qIFBDSSBQb3N0aW5nLiAqLworCisJd3JpdGVsKGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIsIHNlcnZlcndvcmtzX3ByaXZhdGUucmVnaXN0ZXJzK1NWV1JLU19HQVRUQkFTRSk7CisJcmVhZGwoc2VydmVyd29ya3NfcHJpdmF0ZS5yZWdpc3RlcnMrU1ZXUktTX0dBVFRCQVNFKTsJLyogUENJIFBvc3RpbmcuICovCisKKwljYXBfcmVnID0gcmVhZHcoc2VydmVyd29ya3NfcHJpdmF0ZS5yZWdpc3RlcnMrU1ZXUktTX0NPTU1BTkQpOworCWNhcF9yZWcgJj0gfjB4MDAwNzsKKwljYXBfcmVnIHw9IDB4NDsKKwl3cml0ZXcoY2FwX3JlZywgc2VydmVyd29ya3NfcHJpdmF0ZS5yZWdpc3RlcnMrU1ZXUktTX0NPTU1BTkQpOworCXJlYWR3KHNlcnZlcndvcmtzX3ByaXZhdGUucmVnaXN0ZXJzK1NWV1JLU19DT01NQU5EKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHNlcnZlcndvcmtzX3ByaXZhdGUuc3Zyd3Jrc19kZXYsU1ZXUktTX0FHUF9FTkFCTEUsICZlbmFibGVfcmVnKTsKKwllbmFibGVfcmVnIHw9IDB4MTsgLyogQWdwIEVuYWJsZSBiaXQgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoc2VydmVyd29ya3NfcHJpdmF0ZS5zdnJ3cmtzX2RldixTVldSS1NfQUdQX0VOQUJMRSwgZW5hYmxlX3JlZyk7CisJc2VydmVyd29ya3NfdGxiZmx1c2goTlVMTCk7CisKKwlhZ3BfYnJpZGdlLT5jYXBuZHggPSBwY2lfZmluZF9jYXBhYmlsaXR5KHNlcnZlcndvcmtzX3ByaXZhdGUuc3Zyd3Jrc19kZXYsIFBDSV9DQVBfSURfQUdQKTsKKworCS8qIEZpbGwgaW4gdGhlIG1vZGUgcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2VydmVyd29ya3NfcHJpdmF0ZS5zdnJ3cmtzX2RldiwKKwkJCSAgICAgIGFncF9icmlkZ2UtPmNhcG5keCtQQ0lfQUdQX1NUQVRVUywgJmFncF9icmlkZ2UtPm1vZGUpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBTVldSS1NfQ0FDSElORywgJmVuYWJsZV9yZWcpOworCWVuYWJsZV9yZWcgJj0gfjB4MzsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBTVldSS1NfQ0FDSElORywgZW5hYmxlX3JlZyk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIFNWV1JLU19GRUFUVVJFLCAmZW5hYmxlX3JlZyk7CisJZW5hYmxlX3JlZyB8PSAoMTw8Nik7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldixTVldSS1NfRkVBVFVSRSwgZW5hYmxlX3JlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2VydmVyd29ya3NfY2xlYW51cCh2b2lkKQoreworCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBzZXJ2ZXJ3b3Jrc19wcml2YXRlLnJlZ2lzdGVycyk7Cit9CisKK3N0YXRpYyBpbnQgc2VydmVyd29ya3NfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLAorCQkJICAgICBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJaW50IGksIGosIG51bV9lbnRyaWVzOworCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqY3VyX2dhdHQ7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJbnVtX2VudHJpZXMgPSBBX1NJWkVfTFZMMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpLT5udW1fZW50cmllczsKKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4gbnVtX2VudHJpZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaiA9IHBnX3N0YXJ0OworCXdoaWxlIChqIDwgKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSkgeworCQlhZGRyID0gKGogKiBQQUdFX1NJWkUpICsgYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkcjsKKwkJY3VyX2dhdHQgPSBTVlJXUktTX0dFVF9HQVRUKGFkZHIpOworCQlpZiAoIVBHRV9FTVBUWShhZ3BfYnJpZGdlLCByZWFkbChjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWorKzsKKwl9CisKKwlpZiAobWVtLT5pc19mbHVzaGVkID09IEZBTFNFKSB7CisJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCQltZW0tPmlzX2ZsdXNoZWQgPSBUUlVFOworCX0KKworCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKKwkJYWRkciA9IChqICogUEFHRV9TSVpFKSArIGFncF9icmlkZ2UtPmdhcnRfYnVzX2FkZHI7CisJCWN1cl9nYXR0ID0gU1ZSV1JLU19HRVRfR0FUVChhZGRyKTsKKwkJd3JpdGVsKGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwgbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksIGN1cl9nYXR0K0dFVF9HQVRUX09GRihhZGRyKSk7CisJfQorCXNlcnZlcndvcmtzX3RsYmZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VydmVyd29ya3NfcmVtb3ZlX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwKKwkJCSAgICAgaW50IHR5cGUpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBfX2lvbWVtICpjdXJfZ2F0dDsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCXNlcnZlcndvcmtzX3RsYmZsdXNoKG1lbSk7CisKKwlmb3IgKGkgPSBwZ19zdGFydDsgaSA8IChtZW0tPnBhZ2VfY291bnQgKyBwZ19zdGFydCk7IGkrKykgeworCQlhZGRyID0gKGkgKiBQQUdFX1NJWkUpICsgYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkcjsKKwkJY3VyX2dhdHQgPSBTVlJXUktTX0dFVF9HQVRUKGFkZHIpOworCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBjdXJfZ2F0dCtHRVRfR0FUVF9PRkYoYWRkcikpOworCX0KKworCXNlcnZlcndvcmtzX3RsYmZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2F0dF9tYXNrIHNlcnZlcndvcmtzX21hc2tzW10gPQoreworCXsubWFzayA9IDEsIC50eXBlID0gMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fbHZsMiBzZXJ2ZXJ3b3Jrc19zaXplc1s3XSA9Cit7CisJezIwNDgsIDUyNDI4OCwgMHg4MDAwMDAwMH0sCisJezEwMjQsIDI2MjE0NCwgMHhjMDAwMDAwMH0sCisJezUxMiwgMTMxMDcyLCAweGUwMDAwMDAwfSwKKwl7MjU2LCA2NTUzNiwgMHhmMDAwMDAwMH0sCisJezEyOCwgMzI3NjgsIDB4ZjgwMDAwMDB9LAorCXs2NCwgMTYzODQsIDB4ZmMwMDAwMDB9LAorCXszMiwgODE5MiwgMHhmZTAwMDAwMH0KK307CisKK3N0YXRpYyB2b2lkIHNlcnZlcndvcmtzX2FncF9lbmFibGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCB1MzIgbW9kZSkKK3sKKwl1MzIgY29tbWFuZDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzZXJ2ZXJ3b3Jrc19wcml2YXRlLnN2cndya3NfZGV2LAorCQkJICAgICAgYnJpZGdlLT5jYXBuZHggKyBQQ0lfQUdQX1NUQVRVUywKKwkJCSAgICAgICZjb21tYW5kKTsKKworCWNvbW1hbmQgPSBhZ3BfY29sbGVjdF9kZXZpY2Vfc3RhdHVzKGJyaWRnZSwgbW9kZSwgY29tbWFuZCk7CisKKwljb21tYW5kICY9IH4weDEwOwkvKiBkaXNhYmxlIEZXICovCisJY29tbWFuZCAmPSB+MHgwODsKKworCWNvbW1hbmQgfD0gMHgxMDA7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNlcnZlcndvcmtzX3ByaXZhdGUuc3Zyd3Jrc19kZXYsCisJCQkgICAgICAgYnJpZGdlLT5jYXBuZHggKyBQQ0lfQUdQX0NPTU1BTkQsCisJCQkgICAgICAgY29tbWFuZCk7CisKKwlhZ3BfZGV2aWNlX2NvbW1hbmQoY29tbWFuZCwgMCk7Cit9CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBzd29ya3NfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9IHNlcnZlcndvcmtzX3NpemVzLAorCS5zaXplX3R5cGUJCT0gTFZMMl9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDcsCisJLmNvbmZpZ3VyZQkJPSBzZXJ2ZXJ3b3Jrc19jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gc2VydmVyd29ya3NfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSBzZXJ2ZXJ3b3Jrc19jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gc2VydmVyd29ya3NfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGFncF9nZW5lcmljX21hc2tfbWVtb3J5LAorCS5tYXNrcwkJCT0gc2VydmVyd29ya3NfbWFza3MsCisJLmFncF9lbmFibGUJCT0gc2VydmVyd29ya3NfYWdwX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IHNlcnZlcndvcmtzX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBzZXJ2ZXJ3b3Jrc19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gc2VydmVyd29ya3NfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBzZXJ2ZXJ3b3Jrc19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZ3Bfc2VydmVyd29ya3NfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfZGV2OworCXUzMiB0ZW1wLCB0ZW1wMjsKKwl1OCBjYXBfcHRyID0gMDsKKworCS8qIEV2ZXJ5dGhpbmcgaXMgb24gZnVuYyAxIGhlcmUgc28gd2UgYXJlIGhhcmRjb2RpbmcgZnVuY3Rpb24gb25lICovCisJYnJpZGdlX2RldiA9IHBjaV9maW5kX3Nsb3QoKHVuc2lnbmVkIGludClwZGV2LT5idXMtPm51bWJlciwKKwkJCVBDSV9ERVZGTigwLCAxKSk7CisJaWYgKCFicmlkZ2VfZGV2KSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBhIFNlcnZlcndvcmtzIGNoaXBzZXQgIgorCQkgICAgICAgImJ1dCBjb3VsZCBub3QgZmluZCB0aGUgc2Vjb25kYXJ5IGRldmljZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljYXBfcHRyID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0FHUCk7CisKKwlzd2l0Y2ggKHBkZXYtPmRldmljZSkgeworCWNhc2UgMHgwMDA2OgorCQkvKiBTZXJ2ZXJXb3JrcyBDTkIyMEhFCisJCUZhaWwgc2lsZW50bHkuKi8KKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIkRldGVjdGVkIFNlcnZlcldvcmtzIENOQjIwSEUgY2hpcHNldDogTm8gQUdQIHByZXNlbnQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfSEU6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0xFOgorCWNhc2UgMHgwMDA3OgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmIChjYXBfcHRyKQorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5zdXBwb3J0ZWQgU2VydmVyd29ya3MgY2hpcHNldCAiCisJCQkJCSIoZGV2aWNlIGlkOiAlMDR4KVxuIiwgcGRldi0+ZGV2aWNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc2VydmVyd29ya3NfcHJpdmF0ZS5zdnJ3cmtzX2RldiA9IGJyaWRnZV9kZXY7CisJc2VydmVyd29ya3NfcHJpdmF0ZS5nYXJ0X2FkZHJfb2ZzID0gMHgxMDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBTVldSS1NfQVBTSVpFLCAmdGVtcCk7CisJaWYgKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBTVldSS1NfQVBTSVpFICsgNCwgJnRlbXAyKTsKKwkJaWYgKHRlbXAyICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCA2NCBiaXQgYXBlcnR1cmUgYWRkcmVzcywgIgorCQkJICAgICAgICJidXQgdG9wIGJpdHMgYXJlIG5vdCB6ZXJvLiAgRGlzYWJsaW5nIGFncFxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlzZXJ2ZXJ3b3Jrc19wcml2YXRlLm1tX2FkZHJfb2ZzID0gMHgxODsKKwl9IGVsc2UKKwkJc2VydmVyd29ya3NfcHJpdmF0ZS5tbV9hZGRyX29mcyA9IDB4MTQ7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgc2VydmVyd29ya3NfcHJpdmF0ZS5tbV9hZGRyX29mcywgJnRlbXApOworCWlmICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NCkgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKKwkJCQlzZXJ2ZXJ3b3Jrc19wcml2YXRlLm1tX2FkZHJfb2ZzICsgNCwgJnRlbXAyKTsKKwkJaWYgKHRlbXAyICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCA2NCBiaXQgTU1JTyBhZGRyZXNzLCAiCisJCQkgICAgICAgImJ1dCB0b3AgYml0cyBhcmUgbm90IHplcm8uICBEaXNhYmxpbmcgYWdwXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJYnJpZGdlID0gYWdwX2FsbG9jX2JyaWRnZSgpOworCWlmICghYnJpZGdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJyaWRnZS0+ZHJpdmVyID0gJnN3b3Jrc19kcml2ZXI7CisJYnJpZGdlLT5kZXZfcHJpdmF0ZV9kYXRhID0gJnNlcnZlcndvcmtzX3ByaXZhdGUsCisJYnJpZGdlLT5kZXYgPSBwZGV2OworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGJyaWRnZSk7CisJcmV0dXJuIGFncF9hZGRfYnJpZGdlKGJyaWRnZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhZ3Bfc2VydmVyd29ya3NfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFncF9yZW1vdmVfYnJpZGdlKGJyaWRnZSk7CisJYWdwX3B1dF9icmlkZ2UoYnJpZGdlKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFncF9zZXJ2ZXJ3b3Jrc19wY2lfdGFibGVbXSA9IHsKKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsCisJLmRldmljZQkJPSBQQ0lfQU5ZX0lELAorCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCX0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWdwX3NlcnZlcndvcmtzX3BjaV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZ3Bfc2VydmVyd29ya3NfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYWdwZ2FydC1zZXJ2ZXJ3b3JrcyIsCisJLmlkX3RhYmxlCT0gYWdwX3NlcnZlcndvcmtzX3BjaV90YWJsZSwKKwkucHJvYmUJCT0gYWdwX3NlcnZlcndvcmtzX3Byb2JlLAorCS5yZW1vdmUJCT0gYWdwX3NlcnZlcndvcmtzX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFncF9zZXJ2ZXJ3b3Jrc19pbml0KHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3Bfc2VydmVyd29ya3NfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3Bfc2VydmVyd29ya3NfY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWdwX3NlcnZlcndvcmtzX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZ3Bfc2VydmVyd29ya3NfaW5pdCk7Cittb2R1bGVfZXhpdChhZ3Bfc2VydmVyd29ya3NfY2xlYW51cCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvdW5pbm9ydGgtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3VuaW5vcnRoLWFncC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMjQ4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL3VuaW5vcnRoLWFncC5jCkBAIC0wLDAgKzEsNjQ3IEBACisvKgorICogVW5pTm9ydGggQUdQR0FSVCByb3V0aW5lcy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91bmlub3J0aC5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlICJhZ3AuaCIKKworLyoKKyAqIE5PVEVTIGZvciB1bmlub3J0aDMgKEc1IEFHUCkgc3VwcG9ydHMgOgorICoKKyAqIFRoZXJlIG1heWJlIGFsc28gcG9zc2liaWxpdHkgdG8gaGF2ZSBiaWdnZXIgY2FjaGUgbGluZSBzaXplIGZvcgorICogYWdwIChzZWUgcG1hY19wY2kuYyBhbmQgbG9vayBmb3IgY2FjaGUgbGluZSkuIE5lZWQgdG8gYmUgaW52ZXN0aWdhdGVkCisgKiBieSBzb21lb25lLgorICoKKyAqIFBBR0Ugc2l6ZSBhcmUgaGFyZGNvZGVkIGJ1dCB0aGlzIG1heSBjaGFuZ2UsIHNlZSBhc20vcGFnZS5oLgorICoKKyAqIEplcm9tZSBHbGlzc2UgPGouZ2xpc3NlQGdtYWlsLmNvbT4KKyAqLworc3RhdGljIGludCB1bmlub3J0aF9yZXY7CitzdGF0aWMgaW50IGlzX3UzOworCitzdGF0aWMgaW50IHVuaW5vcnRoX2ZldGNoX3NpemUodm9pZCkKK3sKKwlpbnQgaTsKKwl1MzIgdGVtcDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgKnZhbHVlczsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIFVOSV9OX0NGR19HQVJUX0JBU0UsICZ0ZW1wKTsKKwl0ZW1wICY9IH4oMHhmZmZmZjAwMCk7CisJdmFsdWVzID0gQV9TSVpFXzMyKGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJaWYgKHRlbXAgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKwkJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKKwkJCXJldHVybiB2YWx1ZXNbaV0uc2l6ZTsKKwkJfQorCX0KKworCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCSAgICBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzICsgMSk7CisJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSAxOworCXJldHVybiB2YWx1ZXNbMV0uc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1bmlub3J0aF90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXUzMiBjdHJsID0gVU5JX05fQ0ZHX0dBUlRfRU5BQkxFOworCisJaWYgKGlzX3UzKQorCQljdHJsIHw9IFUzX05fQ0ZHX0dBUlRfUEVSRlJEOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBVTklfTl9DRkdfR0FSVF9DVFJMLAorCQkJICAgICAgIGN0cmwgfCBVTklfTl9DRkdfR0FSVF9JTlZBTCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIFVOSV9OX0NGR19HQVJUX0NUUkwsIGN0cmwpOworCisJaWYgKHVuaW5vcnRoX3JldiA8PSAweDMwKSB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBVTklfTl9DRkdfR0FSVF9DVFJMLAorCQkJCSAgICAgICBjdHJsIHwgVU5JX05fQ0ZHX0dBUlRfMnhSRVNFVCk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBVTklfTl9DRkdfR0FSVF9DVFJMLAorCQkJCSAgICAgICBjdHJsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVuaW5vcnRoX2NsZWFudXAodm9pZCkKK3sKKwl1MzIgdG1wOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVU5JX05fQ0ZHX0dBUlRfQ1RSTCwgJnRtcCk7CisJaWYgKCEodG1wICYgVU5JX05fQ0ZHX0dBUlRfRU5BQkxFKSkKKwkJcmV0dXJuOworCXRtcCB8PSBVTklfTl9DRkdfR0FSVF9JTlZBTDsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVU5JX05fQ0ZHX0dBUlRfQ1RSTCwgdG1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVU5JX05fQ0ZHX0dBUlRfQ1RSTCwgMCk7CisKKwlpZiAodW5pbm9ydGhfcmV2IDw9IDB4MzApIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIFVOSV9OX0NGR19HQVJUX0NUUkwsCisJCQkJICAgICAgIFVOSV9OX0NGR19HQVJUXzJ4UkVTRVQpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVU5JX05fQ0ZHX0dBUlRfQ1RSTCwKKwkJCQkgICAgICAgMCk7CisJfQorfQorCitzdGF0aWMgaW50IHVuaW5vcnRoX2NvbmZpZ3VyZSh2b2lkKQoreworCXN0cnVjdCBhcGVyX3NpemVfaW5mb18zMiAqY3VycmVudF9zaXplOworCQorCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV8zMihhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImNvbmZpZ3VyaW5nIGZvciBzaXplIGlkeDogJWRcbiIsCisJICAgICAgIGN1cnJlbnRfc2l6ZS0+c2l6ZV92YWx1ZSk7CisJCisJLyogYXBlcnR1cmUgc2l6ZSBhbmQgZ2F0dCBhZGRyICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsCisJCVVOSV9OX0NGR19HQVJUX0JBU0UsCisJCShhZ3BfYnJpZGdlLT5nYXR0X2J1c19hZGRyICYgMHhmZmZmZjAwMCkKKwkJCXwgY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKworCS8qIEhBQ0sgQUxFUlQKKwkgKiBVbmlOb3J0aCBzZWVtIHRvIGJlIGJ1Z2d5IGVub3VnaCBub3QgdG8gaGFuZGxlIHByb3Blcmx5IHdoZW4KKwkgKiB0aGUgQUdQIGFwZXJ0dXJlIGlzbid0IG1hcHBlZCBhdCBidXMgcGh5c2ljYWwgYWRkcmVzcyAwCisJICovCisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9IDA7CisjaWZkZWYgQ09ORklHX1BQQzY0CisJLyogQXNzdW1lIFUzIG9yIGxhdGVyIG9uIFBQQzY0IHN5c3RlbXMgKi8KKwkvKiBoaWdoIDQgYml0cyBvZiBHQVJUIHBoeXNpY2FsIGFkZHJlc3MgZ28gaW4gVU5JX05fQ0ZHX0FHUF9CQVNFICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIFVOSV9OX0NGR19BR1BfQkFTRSwKKwkJCSAgICAgICAoYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkciA+PiAzMikgJiAweGYpOworI2Vsc2UKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwKKwkJVU5JX05fQ0ZHX0FHUF9CQVNFLCBhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyKTsKKyNlbmRpZgorCisJaWYgKGlzX3UzKSB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LAorCQkJCSAgICAgICBVTklfTl9DRkdfR0FSVF9EVU1NWV9QQUdFLAorCQkJCSAgICAgICBhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2VfcmVhbCA+PiAxMik7CisJfQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVuaW5vcnRoX2luc2VydF9tZW1vcnkoc3RydWN0IGFncF9tZW1vcnkgKm1lbSwgb2ZmX3QgcGdfc3RhcnQsCisJCQkJaW50IHR5cGUpCit7CisJaW50IGksIGosIG51bV9lbnRyaWVzOworCXZvaWQgKnRlbXA7CisKKwl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOworCW51bV9lbnRyaWVzID0gQV9TSVpFXzMyKHRlbXApLT5udW1fZW50cmllczsKKworCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApCisJCS8qIFdlIGtub3cgbm90aGluZyBvZiBtZW1vcnkgdHlwZXMgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlqID0gcGdfc3RhcnQ7CisKKwl3aGlsZSAoaiA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkpIHsKKwkJaWYgKGFncF9icmlkZ2UtPmdhdHRfdGFibGVbal0pCisJCQlyZXR1cm4gLUVCVVNZOworCQlqKys7CisJfQorCisJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgeworCQlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlW2pdID0KKwkJICAgIGNwdV90b19sZTMyKChtZW0tPm1lbW9yeVtpXSAmIDB4RkZGRkYwMDBVTCkgfCAweDFVTCk7CisJCWZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylfX3ZhKG1lbS0+bWVtb3J5W2ldKSwKKwkJCQkgICAodW5zaWduZWQgbG9uZylfX3ZhKG1lbS0+bWVtb3J5W2ldKSsweDEwMDApOworCX0KKwkodm9pZClpbl9sZTMyKCh2b2xhdGlsZSB1MzIqKSZhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlW3BnX3N0YXJ0XSk7CisJbWIoKTsKKwlmbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpJmFncF9icmlkZ2UtPmdhdHRfdGFibGVbcGdfc3RhcnRdLCAKKwkJKHVuc2lnbmVkIGxvbmcpJmFncF9icmlkZ2UtPmdhdHRfdGFibGVbcGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnRdKTsKKworCXVuaW5vcnRoX3RsYmZsdXNoKG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdTNfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJaW50IGksIG51bV9lbnRyaWVzOworCXZvaWQgKnRlbXA7CisJdTMyICpncDsKKworCXRlbXAgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemU7CisJbnVtX2VudHJpZXMgPSBBX1NJWkVfMzIodGVtcCktPm51bV9lbnRyaWVzOworCisJaWYgKHR5cGUgIT0gMCB8fCBtZW0tPnR5cGUgIT0gMCkKKwkJLyogV2Uga25vdyBub3RoaW5nIG9mIG1lbW9yeSB0eXBlcyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdwID0gKHUzMiAqKSAmYWdwX2JyaWRnZS0+Z2F0dF90YWJsZVtwZ19zdGFydF07CisJZm9yIChpID0gMDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgKytpKSB7CisJCWlmIChncFtpXSkgeworCQkJcHJpbnRrKCJ1M19pbnNlcnRfbWVtb3J5OiBlbnRyeSAweCV4IG9jY3VwaWVkICgleClcbiIsCisJCQkgICAgICAgaSwgZ3BbaV0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKykgeworCQlncFtpXSA9IChtZW0tPm1lbW9yeVtpXSA+PiBQQUdFX1NISUZUKSB8IDB4ODAwMDAwMDBVTDsKKwkJZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKV9fdmEobWVtLT5tZW1vcnlbaV0pLAorCQkJCSAgICh1bnNpZ25lZCBsb25nKV9fdmEobWVtLT5tZW1vcnlbaV0pKzB4MTAwMCk7CisJfQorCW1iKCk7CisJZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWdwLCAodW5zaWduZWQgbG9uZykgJmdwW2ldKTsKKwl1bmlub3J0aF90bGJmbHVzaChtZW0pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB1M19yZW1vdmVfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKK3sKKwlzaXplX3QgaTsKKwl1MzIgKmdwOworCisJaWYgKHR5cGUgIT0gMCB8fCBtZW0tPnR5cGUgIT0gMCkKKwkJLyogV2Uga25vdyBub3RoaW5nIG9mIG1lbW9yeSB0eXBlcyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCWdwID0gKHUzMiAqKSAmYWdwX2JyaWRnZS0+Z2F0dF90YWJsZVtwZ19zdGFydF07CisJZm9yIChpID0gMDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgKytpKQorCQlncFtpXSA9IDA7CisJbWIoKTsKKwlmbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpZ3AsICh1bnNpZ25lZCBsb25nKSAmZ3BbaV0pOworCXVuaW5vcnRoX3RsYmZsdXNoKG1lbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdW5pbm9ydGhfYWdwX2VuYWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHUzMiBtb2RlKQoreworCXUzMiBjb21tYW5kLCBzY3JhdGNoLCBzdGF0dXM7CisJaW50IHRpbWVvdXQ7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnJpZGdlLT5kZXYsCisJCQkgICAgICBicmlkZ2UtPmNhcG5keCArIFBDSV9BR1BfU1RBVFVTLAorCQkJICAgICAgJnN0YXR1cyk7CisKKwljb21tYW5kID0gYWdwX2NvbGxlY3RfZGV2aWNlX3N0YXR1cyhicmlkZ2UsIG1vZGUsIHN0YXR1cyk7CisJY29tbWFuZCB8PSBQQ0lfQUdQX0NPTU1BTkRfQUdQOworCQorCWlmICh1bmlub3J0aF9yZXYgPT0gMHgyMSkgeworCQkvKgorCQkgKiBEYXJ3aW4gZGlzYWJsZSBBR1AgNHggb24gdGhpcyByZXZpc2lvbiwgdGh1cyB3ZQorCQkgKiBtYXkgYXNzdW1lIGl0J3MgYnJva2VuLiBUaGlzIGlzIGFuIEFHUDIgY29udHJvbGxlci4KKwkJICovCisJCWNvbW1hbmQgJj0gfkFHUFNUQVQyXzRYOworCX0KKworCWlmICgodW5pbm9ydGhfcmV2ID49IDB4MzApICYmICh1bmlub3J0aF9yZXYgPD0gMHgzMykpIHsKKwkJLyoKKwkJICogV2UgbmVlZCB0byB0byBzZXQgUkVRX0RFUFRIIHRvIDcgZm9yIFUzIHZlcnNpb25zIDEuMCwgMi4xLAorCQkgKiAyLjIgYW5kIDIuMywgRGFyd2luIGRvIHNvLgorCQkgKi8KKwkJaWYgKChjb21tYW5kID4+IEFHUFNUQVRfUlFfREVQVEhfU0hJRlQpID4gNykKKwkJCWNvbW1hbmQgPSAoY29tbWFuZCAmIH5BR1BTVEFUX1JRX0RFUFRIKQorCQkJCXwgKDcgPDwgQUdQU1RBVF9SUV9ERVBUSF9TSElGVCk7CisJfQorCisJdW5pbm9ydGhfdGxiZmx1c2goTlVMTCk7CisKKwl0aW1lb3V0ID0gMDsKKwlkbyB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLT5kZXYsCisJCQkJICAgICAgIGJyaWRnZS0+Y2FwbmR4ICsgUENJX0FHUF9DT01NQU5ELAorCQkJCSAgICAgICBjb21tYW5kKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyaWRnZS0+ZGV2LAorCQkJCSAgICAgIGJyaWRnZS0+Y2FwbmR4ICsgUENJX0FHUF9DT01NQU5ELAorCQkJCSAgICAgICAmc2NyYXRjaCk7CisJfSB3aGlsZSAoKHNjcmF0Y2ggJiBQQ0lfQUdQX0NPTU1BTkRfQUdQKSA9PSAwICYmICsrdGltZW91dCA8IDEwMDApOworCWlmICgoc2NyYXRjaCAmIFBDSV9BR1BfQ09NTUFORF9BR1ApID09IDApCisJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byB3cml0ZSBVbmlOb3J0aCBBR1AgY29tbWFuZCByZWdcbiIpOworCisJaWYgKHVuaW5vcnRoX3JldiA+PSAweDMwKSB7CisJCS8qIFRoaXMgaXMgYW4gQUdQIFYzICovCisJCWFncF9kZXZpY2VfY29tbWFuZChjb21tYW5kLCAoc3RhdHVzICYgQUdQU1RBVF9NT0RFXzNfMCkpOworCX0gZWxzZSB7CisJCS8qIEFHUCBWMiAqLworCQlhZ3BfZGV2aWNlX2NvbW1hbmQoY29tbWFuZCwgMCk7CisJfQorCisJdW5pbm9ydGhfdGxiZmx1c2goTlVMTCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWdwX3VuaW5vcnRoX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwl1MzIgY21kOworCXU4IGFncDsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2aWNlID0gTlVMTDsKKworCWlmIChzdGF0ZSAhPSBQTVNHX1NVU1BFTkQpCisJCXJldHVybiAwOworCisJLyogdHVybiBvZmYgQUdQIG9uIHRoZSB2aWRlbyBjaGlwLCBpZiBpdCB3YXMgZW5hYmxlZCAqLworCWZvcl9lYWNoX3BjaV9kZXYoZGV2aWNlKSB7CisJCS8qIERvbid0IHRvdWNoIHRoZSBicmlkZ2UgeWV0LCBkZXZpY2UgZmlyc3QgKi8KKwkJaWYgKGRldmljZSA9PSBwZGV2KQorCQkJY29udGludWU7CisJCS8qIE9ubHkgZGVhbCB3aXRoIGRldmljZXMgb24gdGhlIHNhbWUgYnVzIGhlcmUsIG5vIE1hYyBoYXMgYSBQMlAKKwkJICogYnJpZGdlIG9uIHRoZSBBR1AgcG9ydCwgYW5kIG11Y2tpbmcgYXJvdW5kIHRoZSBlbnRpcmUgUENJCisJCSAqIHRyZWUgaXMgc291cmNlIG9mIHByb2JsZW1zIG9uIHNvbWUgbWFjaGluZXMgYmVjYXVzZSBvZiBhIGJ1ZworCQkgKiBpbiBzb21lIHZlcnNpb25zIG9mIHBjaV9maW5kX2NhcGFiaWxpdHkoKSB3aGVuIGhpdHRpbmcgYSBkZWFkCisJCSAqIGRldmljZQorCQkgKi8KKwkJaWYgKGRldmljZS0+YnVzICE9IHBkZXYtPmJ1cykKKwkJCWNvbnRpbnVlOworCQlhZ3AgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldmljZSwgUENJX0NBUF9JRF9BR1ApOworCQlpZiAoIWFncCkKKwkJCWNvbnRpbnVlOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2aWNlLCBhZ3AgKyBQQ0lfQUdQX0NPTU1BTkQsICZjbWQpOworCQlpZiAoIShjbWQgJiBQQ0lfQUdQX0NPTU1BTkRfQUdQKSkKKwkJCWNvbnRpbnVlOworCQlwcmludGsoInVuaW5vcnRoLWFncDogZGlzYWJsaW5nIEFHUCBvbiBkZXZpY2UgJXNcbiIsCisJCQkJcGNpX25hbWUoZGV2aWNlKSk7CisJCWNtZCAmPSB+UENJX0FHUF9DT01NQU5EX0FHUDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXZpY2UsIGFncCArIFBDSV9BR1BfQ09NTUFORCwgY21kKTsKKwl9CisKKwkvKiB0dXJuIG9mZiBBR1Agb24gdGhlIGJyaWRnZSAqLworCWFncCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9BR1ApOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBhZ3AgKyBQQ0lfQUdQX0NPTU1BTkQsICZjbWQpOworCWlmIChjbWQgJiBQQ0lfQUdQX0NPTU1BTkRfQUdQKSB7CisJCXByaW50aygidW5pbm9ydGgtYWdwOiBkaXNhYmxpbmcgQUdQIG9uIGJyaWRnZSAlc1xuIiwKKwkJCQlwY2lfbmFtZShwZGV2KSk7CisJCWNtZCAmPSB+UENJX0FHUF9DT01NQU5EX0FHUDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBhZ3AgKyBQQ0lfQUdQX0NPTU1BTkQsIGNtZCk7CisJfQorCS8qIHR1cm4gb2ZmIHRoZSBHQVJUICovCisJdW5pbm9ydGhfY2xlYW51cCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWdwX3VuaW5vcnRoX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHVuaW5vcnRoX2NyZWF0ZV9nYXR0X3RhYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKK3sKKwljaGFyICp0YWJsZTsKKwljaGFyICp0YWJsZV9lbmQ7CisJaW50IHNpemU7CisJaW50IHBhZ2Vfb3JkZXI7CisJaW50IG51bV9lbnRyaWVzOworCWludCBpOworCXZvaWQgKnRlbXA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkvKiBXZSBjYW4ndCBoYW5kbGUgMiBsZXZlbCBnYXR0J3MgKi8KKwlpZiAoYnJpZGdlLT5kcml2ZXItPnNpemVfdHlwZSA9PSBMVkwyX0FQRVJfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0YWJsZSA9IE5VTEw7CisJaSA9IGJyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHg7CisJdGVtcCA9IGJyaWRnZS0+Y3VycmVudF9zaXplOworCXNpemUgPSBwYWdlX29yZGVyID0gbnVtX2VudHJpZXMgPSAwOworCisJZG8geworCQlzaXplID0gQV9TSVpFXzMyKHRlbXApLT5zaXplOworCQlwYWdlX29yZGVyID0gQV9TSVpFXzMyKHRlbXApLT5wYWdlX29yZGVyOworCQludW1fZW50cmllcyA9IEFfU0laRV8zMih0ZW1wKS0+bnVtX2VudHJpZXM7CisKKwkJdGFibGUgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIHBhZ2Vfb3JkZXIpOworCisJCWlmICh0YWJsZSA9PSBOVUxMKSB7CisJCQlpKys7CisJCQlicmlkZ2UtPmN1cnJlbnRfc2l6ZSA9IEFfSURYMzIoYnJpZGdlKTsKKwkJfSBlbHNlIHsKKwkJCWJyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOworCQl9CisJfSB3aGlsZSAoIXRhYmxlICYmIChpIDwgYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplcykpOworCisJaWYgKHRhYmxlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdGFibGVfZW5kID0gdGFibGUgKyAoKFBBR0VfU0laRSAqICgxIDw8IHBhZ2Vfb3JkZXIpKSAtIDEpOworCisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHRhYmxlKTsgcGFnZSA8PSB2aXJ0X3RvX3BhZ2UodGFibGVfZW5kKTsgcGFnZSsrKQorCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CisKKwlicmlkZ2UtPmdhdHRfdGFibGVfcmVhbCA9ICh1MzIgKikgdGFibGU7CisJYnJpZGdlLT5nYXR0X3RhYmxlID0gKHUzMiAqKXRhYmxlOworCWJyaWRnZS0+Z2F0dF9idXNfYWRkciA9IHZpcnRfdG9fcGh5cyh0YWJsZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykKKwkJYnJpZGdlLT5nYXR0X3RhYmxlW2ldID0gMDsKKworCWZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyl0YWJsZSwgKHVuc2lnbmVkIGxvbmcpdGFibGVfZW5kKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVuaW5vcnRoX2ZyZWVfZ2F0dF90YWJsZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJaW50IHBhZ2Vfb3JkZXI7CisJY2hhciAqdGFibGUsICp0YWJsZV9lbmQ7CisJdm9pZCAqdGVtcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXRlbXAgPSBicmlkZ2UtPmN1cnJlbnRfc2l6ZTsKKwlwYWdlX29yZGVyID0gQV9TSVpFXzMyKHRlbXApLT5wYWdlX29yZGVyOworCisJLyogRG8gbm90IHdvcnJ5IGFib3V0IGZyZWVpbmcgbWVtb3J5LCBiZWNhdXNlIGlmIHRoaXMgaXMKKwkgKiBjYWxsZWQsIHRoZW4gYWxsIGFncCBtZW1vcnkgaXMgZGVhbGxvY2F0ZWQgYW5kIHJlbW92ZWQKKwkgKiBmcm9tIHRoZSB0YWJsZS4KKwkgKi8KKworCXRhYmxlID0gKGNoYXIgKikgYnJpZGdlLT5nYXR0X3RhYmxlX3JlYWw7CisJdGFibGVfZW5kID0gdGFibGUgKyAoKFBBR0VfU0laRSAqICgxIDw8IHBhZ2Vfb3JkZXIpKSAtIDEpOworCisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHRhYmxlKTsgcGFnZSA8PSB2aXJ0X3RvX3BhZ2UodGFibGVfZW5kKTsgcGFnZSsrKQorCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGJyaWRnZS0+Z2F0dF90YWJsZV9yZWFsLCBwYWdlX29yZGVyKTsKKworCXJldHVybiAwOworfQorCit2b2lkIG51bGxfY2FjaGVfZmx1c2godm9pZCkKK3sKKwltYigpOworfQorCisvKiBTZXR1cCBmdW5jdGlvbiAqLworCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzMyIHVuaW5vcnRoX3NpemVzWzddID0KK3sKKyNpZiAwIC8qIE5vdCBzdXJlIHVuaW5vcnRoIHN1cHBvcnRzIHRoYXQgaGlnaCBhcGVydHVyZSBzaXplcyAqLworCXsyNTYsIDY1NTM2LCA2LCA2NH0sCisJezEyOCwgMzI3NjgsIDUsIDMyfSwKKwl7NjQsIDE2Mzg0LCA0LCAxNn0sCisjZW5kaWYJCisJezMyLCA4MTkyLCAzLCA4fSwKKwl7MTYsIDQwOTYsIDIsIDR9LAorCXs4LCAyMDQ4LCAxLCAyfSwKKwl7NCwgMTAyNCwgMCwgMX0KK307CisKKy8qCisgKiBOb3Qgc3VyZSB0aGF0IHUzIHN1cHBvcnRzIHRoYXQgaGlnaCBhcGVydHVyZSBzaXplcyBidXQgaXQKKyAqIHdvdWxkIHN0cmFuZ2UgaWYgaXQgZGlkIG5vdCA6KQorICovCitzdGF0aWMgc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzMyIHUzX3NpemVzWzhdID0KK3sKKwl7NTEyLCAxMzEwNzIsIDcsIDEyOH0sCisJezI1NiwgNjU1MzYsIDYsIDY0fSwKKwl7MTI4LCAzMjc2OCwgNSwgMzJ9LAorCXs2NCwgMTYzODQsIDQsIDE2fSwKKwl7MzIsIDgxOTIsIDMsIDh9LAorCXsxNiwgNDA5NiwgMiwgNH0sCisJezgsIDIwNDgsIDEsIDJ9LAorCXs0LCAxMDI0LCAwLCAxfQorfTsKKworc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIHVuaW5vcnRoX2FncF9kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuYXBlcnR1cmVfc2l6ZXMJCT0gKHZvaWQgKil1bmlub3J0aF9zaXplcywKKwkuc2l6ZV90eXBlCQk9IFUzMl9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDQsCisJLmNvbmZpZ3VyZQkJPSB1bmlub3J0aF9jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gdW5pbm9ydGhfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSB1bmlub3J0aF9jbGVhbnVwLAorCS50bGJfZmx1c2gJCT0gdW5pbm9ydGhfdGxiZmx1c2gsCisJLm1hc2tfbWVtb3J5CQk9IGFncF9nZW5lcmljX21hc2tfbWVtb3J5LAorCS5tYXNrcwkJCT0gTlVMTCwKKwkuY2FjaGVfZmx1c2gJCT0gbnVsbF9jYWNoZV9mbHVzaCwKKwkuYWdwX2VuYWJsZQkJPSB1bmlub3J0aF9hZ3BfZW5hYmxlLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IHVuaW5vcnRoX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSB1bmlub3J0aF9mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gdW5pbm9ydGhfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmNhbnRfdXNlX2FwZXJ0dXJlCT0gMSwKK307CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciB1M19hZ3BfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9ICh2b2lkICopdTNfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVMzJfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSA4LAorCS5jb25maWd1cmUJCT0gdW5pbm9ydGhfY29uZmlndXJlLAorCS5mZXRjaF9zaXplCQk9IHVuaW5vcnRoX2ZldGNoX3NpemUsCisJLmNsZWFudXAJCT0gdW5pbm9ydGhfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IHVuaW5vcnRoX3RsYmZsdXNoLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IE5VTEwsCisJLmNhY2hlX2ZsdXNoCQk9IG51bGxfY2FjaGVfZmx1c2gsCisJLmFncF9lbmFibGUJCT0gdW5pbm9ydGhfYWdwX2VuYWJsZSwKKwkuY3JlYXRlX2dhdHRfdGFibGUJPSB1bmlub3J0aF9jcmVhdGVfZ2F0dF90YWJsZSwKKwkuZnJlZV9nYXR0X3RhYmxlCT0gdW5pbm9ydGhfZnJlZV9nYXR0X3RhYmxlLAorCS5pbnNlcnRfbWVtb3J5CQk9IHUzX2luc2VydF9tZW1vcnksCisJLnJlbW92ZV9tZW1vcnkJCT0gdTNfcmVtb3ZlX21lbW9yeSwKKwkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAorCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAorCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5jYW50X3VzZV9hcGVydHVyZQk9IDEsCisJLm5lZWRzX3NjcmF0Y2hfcGFnZQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGFncF9kZXZpY2VfaWRzIHVuaW5vcnRoX2FncF9kZXZpY2VfaWRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0FHUCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJVbmlOb3J0aCIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0FHUF9QLAorCQkuY2hpcHNldF9uYW1lCT0gIlVuaU5vcnRoL1BhbmdlYSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0FHUDE1LAorCQkuY2hpcHNldF9uYW1lCT0gIlVuaU5vcnRoIDEuNSIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0FHUDIsCisJCS5jaGlwc2V0X25hbWUJPSAiVW5pTm9ydGggMiIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FQUExFX1UzX0FHUCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJVMyIsCisJfSwKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX0FQUExFX1UzTF9BR1AsCisJCS5jaGlwc2V0X25hbWUJPSAiVTNMIiwKKwl9LAorCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfQVBQTEVfVTNIX0FHUCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJVM0giLAorCX0sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZ3BfdW5pbm9ydGhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGFncF9kZXZpY2VfaWRzICpkZXZzID0gdW5pbm9ydGhfYWdwX2RldmljZV9pZHM7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdW5pbm9ydGhfbm9kZTsKKwl1OCBjYXBfcHRyOworCWludCBqOworCisJY2FwX3B0ciA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9BR1ApOworCWlmIChjYXBfcHRyID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogcHJvYmUgZm9yIGtub3duIGNoaXBzZXRzICovCisJZm9yIChqID0gMDsgZGV2c1tqXS5jaGlwc2V0X25hbWUgIT0gTlVMTDsgKytqKSB7CisJCWlmIChwZGV2LT5kZXZpY2UgPT0gZGV2c1tqXS5kZXZpY2VfaWQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBBcHBsZSAlcyBjaGlwc2V0XG4iLAorCQkJICAgICAgIGRldnNbal0uY2hpcHNldF9uYW1lKTsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9FUlIgUEZYICJVbnN1cHBvcnRlZCBBcHBsZSBjaGlwc2V0IChkZXZpY2UgaWQ6ICUwNHgpLlxuIiwKKwkJcGRldi0+ZGV2aWNlKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworIGZvdW5kOgorCS8qIFNldCByZXZpc2lvbiB0byAwIGlmIHdlIGNvdWxkIG5vdCByZWFkIGl0LiAqLworCXVuaW5vcnRoX3JldiA9IDA7CisJaXNfdTMgPSAwOworCS8qIExvY2F0ZSBjb3JlOTkgVW5pLU4gKi8KKwl1bmlub3J0aF9ub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInVuaS1uIik7CisJLyogTG9jYXRlIEc1IHUzICovCisJaWYgKHVuaW5vcnRoX25vZGUgPT0gTlVMTCkgeworCQlpc191MyA9IDE7CisJCXVuaW5vcnRoX25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidTMiKTsKKwl9CisJaWYgKHVuaW5vcnRoX25vZGUpIHsKKwkJaW50ICpyZXZwcm9wID0gKGludCAqKQorCQkJZ2V0X3Byb3BlcnR5KHVuaW5vcnRoX25vZGUsICJkZXZpY2UtcmV2IiwgTlVMTCk7CisJCWlmIChyZXZwcm9wICE9IE5VTEwpCisJCQl1bmlub3J0aF9yZXYgPSAqcmV2cHJvcCAmIDB4M2Y7CisJCW9mX25vZGVfcHV0KHVuaW5vcnRoX25vZGUpOworCX0KKworCWJyaWRnZSA9IGFncF9hbGxvY19icmlkZ2UoKTsKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoaXNfdTMpCisJCWJyaWRnZS0+ZHJpdmVyID0gJnUzX2FncF9kcml2ZXI7CisJZWxzZQorCQlicmlkZ2UtPmRyaXZlciA9ICZ1bmlub3J0aF9hZ3BfZHJpdmVyOworCisJYnJpZGdlLT5kZXYgPSBwZGV2OworCWJyaWRnZS0+Y2FwbmR4ID0gY2FwX3B0cjsKKwlicmlkZ2UtPmZsYWdzID0gQUdQX0VSUkFUQV9GQVNUV1JJVEVTOworCisJLyogRmlsbCBpbiB0aGUgbW9kZSByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBjYXBfcHRyK1BDSV9BR1BfU1RBVFVTLCAmYnJpZGdlLT5tb2RlKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX3VuaW5vcnRoX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlhZ3BfcmVtb3ZlX2JyaWRnZShicmlkZ2UpOworCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhZ3BfdW5pbm9ydGhfcGNpX3RhYmxlW10gPSB7CisJeworCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAorCS5jbGFzc19tYXNrCT0gfjAsCisJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0FQUExFLAorCS5kZXZpY2UJCT0gUENJX0FOWV9JRCwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFncF91bmlub3J0aF9wY2lfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWdwX3VuaW5vcnRoX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFncGdhcnQtdW5pbm9ydGgiLAorCS5pZF90YWJsZQk9IGFncF91bmlub3J0aF9wY2lfdGFibGUsCisJLnByb2JlCQk9IGFncF91bmlub3J0aF9wcm9iZSwKKwkucmVtb3ZlCQk9IGFncF91bmlub3J0aF9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBhZ3BfdW5pbm9ydGhfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFncF91bmlub3J0aF9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFncF91bmlub3J0aF9pbml0KHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3BfdW5pbm9ydGhfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ3BfdW5pbm9ydGhfY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWdwX3VuaW5vcnRoX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZ3BfdW5pbm9ydGhfaW5pdCk7Cittb2R1bGVfZXhpdChhZ3BfdW5pbm9ydGhfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIkJlbiBIZXJyZW5zY2htaWR0ICYgUGF1bCBNYWNrZXJyYXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvdmlhLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC92aWEtYWdwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0NTFkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvdmlhLWFncC5jCkBAIC0wLDAgKzEsNTQ4IEBACisvKgorICogVklBIEFHUEdBUlQgcm91dGluZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjaW5jbHVkZSAiYWdwLmgiCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhZ3BfdmlhX3BjaV90YWJsZVtdOworCisjZGVmaW5lIFZJQV9HQVJUQ1RSTAkweDgwCisjZGVmaW5lIFZJQV9BUFNJWkUJMHg4NAorI2RlZmluZSBWSUFfQVRUQkFTRQkweDg4CisKKyNkZWZpbmUgVklBX0FHUDNfR0FSVENUUkwJMHg5MAorI2RlZmluZSBWSUFfQUdQM19BUFNJWkUJCTB4OTQKKyNkZWZpbmUgVklBX0FHUDNfQVRUQkFTRQkweDk4CisjZGVmaW5lIFZJQV9BR1BTRUwJCTB4ZmQKKworc3RhdGljIGludCB2aWFfZmV0Y2hfc2l6ZSh2b2lkKQoreworCWludCBpOworCXU4IHRlbXA7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKnZhbHVlczsKKworCXZhbHVlcyA9IEFfU0laRV84KGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgVklBX0FQU0laRSwgJnRlbXApOworCWZvciAoaSA9IDA7IGkgPCBhZ3BfYnJpZGdlLT5kcml2ZXItPm51bV9hcGVydHVyZV9zaXplczsgaSsrKSB7CisJCWlmICh0ZW1wID09IHZhbHVlc1tpXS5zaXplX3ZhbHVlKSB7CisJCQlhZ3BfYnJpZGdlLT5wcmV2aW91c19zaXplID0KKwkJCSAgICBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzICsgaSk7CisJCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IGk7CisJCQlyZXR1cm4gdmFsdWVzW2ldLnNpemU7CisJCX0KKwl9CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5rbm93biBhcGVydHVyZSBzaXplIGZyb20gQUdQIGJyaWRnZSAoMHgleClcbiIsIHRlbXApOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdmlhX2NvbmZpZ3VyZSh2b2lkKQoreworCXUzMiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb184ICpjdXJyZW50X3NpemU7CisKKwljdXJyZW50X3NpemUgPSBBX1NJWkVfOChhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUpOworCS8qIGFwZXJ0dXJlIHNpemUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWdwX2JyaWRnZS0+ZGV2LCBWSUFfQVBTSVpFLAorCQkJICAgICAgY3VycmVudF9zaXplLT5zaXplX3ZhbHVlKTsKKwkvKiBhZGRyZXNzIHRvIG1hcCB0b28gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBR1BfQVBCQVNFLCAmdGVtcCk7CisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisKKwkvKiBHQVJUIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVklBX0dBUlRDVFJMLCAweDAwMDAwMDBmKTsKKworCS8qIGF0dGJhc2UgLSBhcGVydHVyZSBHQVRUIGJhc2UgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVklBX0FUVEJBU0UsCisJCQkgICAgKGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIgJiAweGZmZmZmMDAwKSB8IDMpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHZpYV9jbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzggKnByZXZpb3VzX3NpemU7CisKKwlwcmV2aW91c19zaXplID0gQV9TSVpFXzgoYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFncF9icmlkZ2UtPmRldiwgVklBX0FQU0laRSwKKwkJCSAgICAgIHByZXZpb3VzX3NpemUtPnNpemVfdmFsdWUpOworCS8qIERvIG5vdCBkaXNhYmxlIGJ5IHdyaXRpbmcgMCB0byBWSUFfQVRUQkFTRSwgaXQgc2NyZXdzIHRoaW5ncyB1cAorCSAqIGR1cmluZyByZWluaXRpYWxpemF0aW9uLgorCSAqLworfQorCisKK3N0YXRpYyB2b2lkIHZpYV90bGJmbHVzaChzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQoreworCXUzMiB0ZW1wOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVklBX0dBUlRDVFJMLCAmdGVtcCk7CisJdGVtcCB8PSAoMTw8Nyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIFZJQV9HQVJUQ1RSTCwgdGVtcCk7CisJdGVtcCAmPSB+KDE8PDcpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBWSUFfR0FSVENUUkwsIHRlbXApOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgYXBlcl9zaXplX2luZm9fOCB2aWFfZ2VuZXJpY19zaXplc1s5XSA9Cit7CisJezI1NiwgNjU1MzYsIDYsIDB9LAorCXsxMjgsIDMyNzY4LCA1LCAxMjh9LAorCXs2NCwgMTYzODQsIDQsIDE5Mn0sCisJezMyLCA4MTkyLCAzLCAyMjR9LAorCXsxNiwgNDA5NiwgMiwgMjQwfSwKKwl7OCwgMjA0OCwgMSwgMjQ4fSwKKwl7NCwgMTAyNCwgMCwgMjUyfSwKKwl7MiwgNTEyLCAwLCAyNTR9LAorCXsxLCAyNTYsIDAsIDI1NX0KK307CisKKworc3RhdGljIGludCB2aWFfZmV0Y2hfc2l6ZV9hZ3AzKHZvaWQpCit7CisJaW50IGk7CisJdTE2IHRlbXA7CisJc3RydWN0IGFwZXJfc2l6ZV9pbmZvXzE2ICp2YWx1ZXM7CisKKwl2YWx1ZXMgPSBBX1NJWkVfMTYoYWdwX2JyaWRnZS0+ZHJpdmVyLT5hcGVydHVyZV9zaXplcyk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWdwX2JyaWRnZS0+ZGV2LCBWSUFfQUdQM19BUFNJWkUsICZ0ZW1wKTsKKwl0ZW1wICY9IDB4ZmZmOworCisJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspIHsKKwkJaWYgKHRlbXAgPT0gdmFsdWVzW2ldLnNpemVfdmFsdWUpIHsKKwkJCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQorCQkJCWFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopICh2YWx1ZXMgKyBpKTsKKwkJCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKKwkJCXJldHVybiB2YWx1ZXNbaV0uc2l6ZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHZpYV9jb25maWd1cmVfYWdwMyh2b2lkKQoreworCXUzMiB0ZW1wOworCXN0cnVjdCBhcGVyX3NpemVfaW5mb18xNiAqY3VycmVudF9zaXplOworCisJY3VycmVudF9zaXplID0gQV9TSVpFXzE2KGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CisKKwkvKiBhZGRyZXNzIHRvIG1hcCB0b28gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBBR1BfQVBCQVNFLCAmdGVtcCk7CisJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisKKwkvKiBhdHRiYXNlIC0gYXBlcnR1cmUgR0FUVCBiYXNlICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIFZJQV9BR1AzX0FUVEJBU0UsCisJCWFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIgJiAweGZmZmZmMDAwKTsKKworCS8qIDEuIEVuYWJsZSBHVExCIGluIFJYOTA8Nz4sIGFsbCBBR1AgYXBlcnR1cmUgYWNjZXNzIG5lZWRzIHRvIGZldGNoCisJICogICAgdHJhbnNsYXRpb24gdGFibGUgZmlyc3QuCisJICogMi4gRW5hYmxlIEFHUCBhcGVydHVyZSBpbiBSWDkxPDA+LiBUaGlzIGJpdCBjb250cm9scyB0aGUgZW5hYmxpbmcgb2YgdGhlCisJICogICAgZ3JhcGhpY3MgQUdQIGFwZXJ0dXJlIGZvciB0aGUgQUdQMy4wIHBvcnQuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVklBX0FHUDNfR0FSVENUUkwsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgVklBX0FHUDNfR0FSVENUUkwsIHRlbXAgfCAoMzw8NykpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHZpYV9jbGVhbnVwX2FncDModm9pZCkKK3sKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMTYgKnByZXZpb3VzX3NpemU7CisKKwlwcmV2aW91c19zaXplID0gQV9TSVpFXzE2KGFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZ3BfYnJpZGdlLT5kZXYsIFZJQV9BUFNJWkUsIHByZXZpb3VzX3NpemUtPnNpemVfdmFsdWUpOworfQorCisKK3N0YXRpYyB2b2lkIHZpYV90bGJmbHVzaF9hZ3AzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit7CisJdTMyIHRlbXA7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBWSUFfQUdQM19HQVJUQ1RSTCwgJnRlbXApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBWSUFfQUdQM19HQVJUQ1RSTCwgdGVtcCAmIH4oMTw8NykpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWdwX2JyaWRnZS0+ZGV2LCBWSUFfQUdQM19HQVJUQ1RSTCwgdGVtcCk7Cit9CisKKworc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIHZpYV9hZ3AzX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBhZ3AzX2dlbmVyaWNfc2l6ZXMsCisJLnNpemVfdHlwZQkJPSBVOF9BUEVSX1NJWkUsCisJLm51bV9hcGVydHVyZV9zaXplcwk9IDEwLAorCS5jb25maWd1cmUJCT0gdmlhX2NvbmZpZ3VyZV9hZ3AzLAorCS5mZXRjaF9zaXplCQk9IHZpYV9mZXRjaF9zaXplX2FncDMsCisJLmNsZWFudXAJCT0gdmlhX2NsZWFudXBfYWdwMywKKwkudGxiX2ZsdXNoCQk9IHZpYV90bGJmbHVzaF9hZ3AzLAorCS5tYXNrX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IE5VTEwsCisJLmFncF9lbmFibGUJCT0gYWdwX2dlbmVyaWNfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCisJLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKKwkuaW5zZXJ0X21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19pbnNlcnRfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnksCisJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKKwkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKK307CisKK3N0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciB2aWFfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmFwZXJ0dXJlX3NpemVzCQk9IHZpYV9nZW5lcmljX3NpemVzLAorCS5zaXplX3R5cGUJCT0gVThfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSA5LAorCS5jb25maWd1cmUJCT0gdmlhX2NvbmZpZ3VyZSwKKwkuZmV0Y2hfc2l6ZQkJPSB2aWFfZmV0Y2hfc2l6ZSwKKwkuY2xlYW51cAkJPSB2aWFfY2xlYW51cCwKKwkudGxiX2ZsdXNoCQk9IHZpYV90bGJmbHVzaCwKKwkubWFza19tZW1vcnkJCT0gYWdwX2dlbmVyaWNfbWFza19tZW1vcnksCisJLm1hc2tzCQkJPSBOVUxMLAorCS5hZ3BfZW5hYmxlCQk9IGFncF9nZW5lcmljX2VuYWJsZSwKKwkuY2FjaGVfZmx1c2gJCT0gZ2xvYmFsX2NhY2hlX2ZsdXNoLAorCS5jcmVhdGVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2NyZWF0ZV9nYXR0X3RhYmxlLAorCS5mcmVlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gYWdwX2dlbmVyaWNfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5LAorCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCisJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCit9OworCitzdGF0aWMgc3RydWN0IGFncF9kZXZpY2VfaWRzIHZpYV9hZ3BfZGV2aWNlX2lkc1tdIF9fZGV2aW5pdGRhdGEgPQoreworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzgyQzU5N18wLAorCQkuY2hpcHNldF9uYW1lCT0gIkFwb2xsbyBWUDMiLAorCX0sCisKKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OThfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJBcG9sbG8gTVZQMyIsCisJfSwKKworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzg1MDFfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJBcG9sbG8gTVZQNCIsCisJfSwKKworCS8qIFZUODYwMSAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzg2MDFfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJBcG9sbG8gUHJvTWVkaWEvUExFMTMzVGEiLAorCX0sCisKKwkvKiBWVDgyQzY5M0EgLyBWVDI4QzY5NFQgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2OTFfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJBcG9sbG8gUHJvIDEzMyIsCisJfSwKKworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzgzNzFfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJLWDEzMyIsCisJfSwKKworCS8qIFZUODYzMyAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzg2MzNfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJQcm8gMjY2IiwKKwl9LAorCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9WSUFfWE4yNjYsCisJCS5jaGlwc2V0X25hbWUJPSAiQXBvbGxvIFBybzI2NiIsCisJfSwKKworCS8qIFZUODM2MSAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzgzNjEsCisJCS5jaGlwc2V0X25hbWUJPSAiS0xFMTMzIiwKKwl9LAorCisJLyogVlQ4MzY1IC8gVlQ4MzYyICovCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9WSUFfODM2M18wLAorCQkuY2hpcHNldF9uYW1lCT0gIlR3aXN0ZXItSy9LVDEzM3gvS00xMzMiLAorCX0sCisKKwkvKiBWVDg3NTNBICovCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9WSUFfODc1M18wLAorCQkuY2hpcHNldF9uYW1lCT0gIlA0WDI2NiIsCisJfSwKKworCS8qIFZUODM2NiAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzgzNjdfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJLVDI2Ni9LWTI2NngvS1QzMzMiLAorCX0sCisKKwkvKiBWVDg2MzMgKGZvciBDdU1pbmUvIENlbGVyb24pICovCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9WSUFfODY1M18wLAorCQkuY2hpcHNldF9uYW1lCT0gIlBybzI2NlQiLAorCX0sCisKKwkvKiBLTTI2NiAvIFBNMjY2ICovCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9WSUFfWE0yNjYsCisJCS5jaGlwc2V0X25hbWUJPSAiUE0yNjYvS00yNjYiLAorCX0sCisKKwkvKiBDTEUyNjYgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84NjJYXzAsCisJCS5jaGlwc2V0X25hbWUJPSAiQ0xFMjY2IiwKKwl9LAorCisJeworCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9WSUFfODM3N18wLAorCQkuY2hpcHNldF9uYW1lCT0gIktUNDAwL0tUNDAwQS9LVDYwMCIsCisJfSwKKworCS8qIFZUODYwNCAvIFZUODYwNSAvIFZUODYwMworCSAqIChBcG9sbG8gUHJvMTMzQSBjaGlwc2V0IHdpdGggUzMgU2F2YWdlNCkgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84NjA1XzAsCisJCS5jaGlwc2V0X25hbWUJPSAiUHJvU2F2YWdlIFBNMTMzL1BMMTMzL1BOMTMzIgorCX0sCisKKwkvKiBQNE0yNjZ4L1A0TjI2NiAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzg3MDNfNTFfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJQNE0yNjZ4L1A0TjI2NiIsCisJfSwKKworCS8qIFZUODc1NCAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzg3NTRDXzAsCisJCS5jaGlwc2V0X25hbWUJPSAiUFQ4MDAiLAorCX0sCisKKwkvKiBQNFg2MDAgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84NzYzXzAsCisJCS5jaGlwc2V0X25hbWUJPSAiUDRYNjAwIgorCX0sCisKKwkvKiBLTTQwMCAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBXzgzNzhfMCwKKwkJLmNoaXBzZXRfbmFtZQk9ICJLTTQwMC9LTTQwMEEiLAorCX0sCisKKwkvKiBQVDg4MCAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBX1BUODgwLAorCQkuY2hpcHNldF9uYW1lCT0gIlBUODgwIiwKKwl9LAorCisJLyogUFQ4OTAgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84NzgzXzAsCisJCS5jaGlwc2V0X25hbWUJPSAiUFQ4OTAiLAorCX0sCisKKwkvKiBQTTgwMC9QTjgwMC9QTTg4MC9QTjg4MCAqLworCXsKKwkJLmRldmljZV9pZAk9IFBDSV9ERVZJQ0VfSURfVklBX1BYOFgwXzAsCisJCS5jaGlwc2V0X25hbWUJPSAiUE04MDAvUE44MDAvUE04ODAvUE44ODAiLAorCX0sCisJLyogS1Q4ODAgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV8zMjY5XzAsCisJCS5jaGlwc2V0X25hbWUJPSAiS1Q4ODAiLAorCX0sCisJLyogS1R4eHgvUHg4eHggKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV84M184N1hYXzEsCisJCS5jaGlwc2V0X25hbWUJPSAiVlQ4M3h4L1ZUODd4eC9LVHh4eC9QeDh4eCIsCisJfSwKKwkvKiBQNE04MDAgKi8KKwl7CisJCS5kZXZpY2VfaWQJPSBQQ0lfREVWSUNFX0lEX1ZJQV8zMjk2XzAsCisJCS5jaGlwc2V0X25hbWUJPSAiUDRNODAwIiwKKwl9LAorCisJeyB9LCAvKiBkdW1teSBmaW5hbCBlbnRyeSwgYWx3YXlzIHByZXNlbnQgKi8KK307CisKKworLyoKKyAqIFZJQSdzIEFHUDMgY2hpcHNldHMgZG8gbWFnaWNrIHRvIHB1dCB0aGUgQUdQIGJyaWRnZSBjb21wbGlhbnQKKyAqIHdpdGggdGhlIHNhbWUgc3RhbmRhcmRzIHZlcnNpb24gYXMgdGhlIGdyYXBoaWNzIGNhcmQuCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX3ZpYV9hZ3AzIChzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCit7CisJdTggcmVnOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYnJpZGdlLT5kZXYsIFZJQV9BR1BTRUwsICZyZWcpOworCS8qIENoZWNrIEFHUCAyLjAgY29tcGF0aWJpbGl0eSBtb2RlLiAqLworCWlmICgocmVnICYgKDE8PDEpKT09MCkKKwkJYnJpZGdlLT5kcml2ZXIgPSAmdmlhX2FncDNfZHJpdmVyOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFncF92aWFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgYWdwX2RldmljZV9pZHMgKmRldnMgPSB2aWFfYWdwX2RldmljZV9pZHM7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCWludCBqID0gMDsKKwl1OCBjYXBfcHRyOworCisJY2FwX3B0ciA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9BR1ApOworCWlmICghY2FwX3B0cikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlqID0gZW50IC0gYWdwX3ZpYV9wY2lfdGFibGU7CisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJEZXRlY3RlZCBWSUEgJXMgY2hpcHNldFxuIiwgZGV2c1tqXS5jaGlwc2V0X25hbWUpOworCisJYnJpZGdlID0gYWdwX2FsbG9jX2JyaWRnZSgpOworCWlmICghYnJpZGdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJyaWRnZS0+ZGV2ID0gcGRldjsKKwlicmlkZ2UtPmNhcG5keCA9IGNhcF9wdHI7CisJYnJpZGdlLT5kcml2ZXIgPSAmdmlhX2RyaXZlcjsKKworCS8qCisJICogR2FyZywgdGhlcmUgYXJlIEtUNDAwcyB3aXRoIEtUMjY2IElEcy4KKwkgKi8KKwlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVklBXzgzNjdfMCkgeworCQkvKiBJcyB0aGVyZSBhIEtUNDAwIHN1YnN5c3RlbSA/ICovCisJCWlmIChwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVklBXzgzNzdfMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkZvdW5kIEtUNDAwIGluIGRpc2d1aXNlIGFzIGEgS1QyNjYuXG4iKTsKKwkJCWNoZWNrX3ZpYV9hZ3AzKGJyaWRnZSk7CisJCX0KKwl9CisKKwkvKiBJZiB0aGlzIGlzIGFuIEFHUDMgYnJpZGdlLCBjaGVjayB3aGljaCBtb2RlIGl0cyBpbiBhbmQgYWRqdXN0LiAqLworCWdldF9hZ3BfdmVyc2lvbihicmlkZ2UpOworCWlmIChicmlkZ2UtPm1ham9yX3ZlcnNpb24gPj0gMykKKwkJY2hlY2tfdmlhX2FncDMoYnJpZGdlKTsKKworCS8qIEZpbGwgaW4gdGhlIG1vZGUgcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKKwkJCWJyaWRnZS0+Y2FwbmR4K1BDSV9BR1BfU1RBVFVTLCAmYnJpZGdlLT5tb2RlKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmlkZ2UpOworCXJldHVybiBhZ3BfYWRkX2JyaWRnZShicmlkZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdwX3ZpYV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJYWdwX3JlbW92ZV9icmlkZ2UoYnJpZGdlKTsKKwlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgYWdwX3ZpYV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJcGNpX3NhdmVfc3RhdGUgKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUgKHBkZXYsIFBDSV9EM2hvdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZ3BfdmlhX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlIChwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZ2aWFfYWdwM19kcml2ZXIpCisJCXJldHVybiB2aWFfY29uZmlndXJlX2FncDMoKTsKKwllbHNlIGlmIChicmlkZ2UtPmRyaXZlciA9PSAmdmlhX2RyaXZlcikKKwkJcmV0dXJuIHZpYV9jb25maWd1cmUoKTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKy8qIG11c3QgYmUgdGhlIHNhbWUgb3JkZXIgYXMgbmFtZSB0YWJsZSBhYm92ZSAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFncF92aWFfcGNpX3RhYmxlW10gPSB7CisjZGVmaW5lIElEKHgpIFwKKwl7CQkJCQkJXAorCS5jbGFzcwkJPSAoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgpLAlcCisJLmNsYXNzX21hc2sJPSB+MCwJCQkJXAorCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9WSUEsCQlcCisJLmRldmljZQkJPSB4LAkJCQlcCisJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCQkJXAorCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAkJCVwKKwl9CisJSUQoUENJX0RFVklDRV9JRF9WSUFfODJDNTk3XzApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzgyQzU5OF8wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV84NTAxXzApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzg2MDFfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODJDNjkxXzApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzgzNzFfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODYzM18wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV9YTjI2NiksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODM2MSksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODM2M18wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV84NzUzXzApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzgzNjdfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODY1M18wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV9YTTI2NiksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODYyWF8wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV84Mzc3XzApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzg2MDVfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfODcwM181MV8wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV84NzU0Q18wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV84NzYzXzApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzgzNzhfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfUFQ4ODApLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzg3ODNfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfUFg4WDBfMCksCisJSUQoUENJX0RFVklDRV9JRF9WSUFfMzI2OV8wKSwKKwlJRChQQ0lfREVWSUNFX0lEX1ZJQV84M184N1hYXzEpLAorCUlEKFBDSV9ERVZJQ0VfSURfVklBXzMyOTZfMCksCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWdwX3ZpYV9wY2lfdGFibGUpOworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZ3BfdmlhX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFncGdhcnQtdmlhIiwKKwkuaWRfdGFibGUJPSBhZ3BfdmlhX3BjaV90YWJsZSwKKwkucHJvYmUJCT0gYWdwX3ZpYV9wcm9iZSwKKwkucmVtb3ZlCQk9IGFncF92aWFfcmVtb3ZlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gYWdwX3ZpYV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYWdwX3ZpYV9yZXN1bWUsCisjZW5kaWYKK307CisKKworc3RhdGljIGludCBfX2luaXQgYWdwX3ZpYV9pbml0KHZvaWQpCit7CisJaWYgKGFncF9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZ3BfdmlhX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWdwX3ZpYV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZ3BfdmlhX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZ3BfdmlhX2luaXQpOworbW9kdWxlX2V4aXQoYWdwX3ZpYV9jbGVhbnVwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMgYi9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjNDI1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYwpAQCAtMCwwICsxLDIxNzkgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jCisgKgorICogU2VyaWFsIGRyaXZlciBmb3IgdGhlIGFtaWdhIGJ1aWx0aW4gcG9ydC4KKyAqCisgKiBUaGlzIGNvZGUgd2FzIGNyZWF0ZWQgYnkgdGFraW5nIHNlcmlhbC5jIHZlcnNpb24gNC4zMCBmcm9tIGtlcm5lbAorICogcmVsZWFzZSAyLjMuMjIsIHJlcGxhY2luZyBhbGwgaGFyZHdhcmUgcmVsYXRlZCBzdHVmZiB3aXRoIHRoZQorICogY29ycmVzcG9uZGluZyBhbWlnYSBoYXJkd2FyZSBhY3Rpb25zLCBhbmQgcmVtb3ZpbmcgYWxsIGlycmVsZXZhbnQKKyAqIGNvZGUuIEFzIGEgY29uc2VxdWVuY2UsIGl0IHVzZXMgbWFueSBvZiB0aGUgY29uc3RhbnRzIGFuZCBuYW1lcworICogYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RlcnMgYW5kIGJpdHMgb2YgMTY1NTAgY29tcGF0aWJsZSBVQVJUUyAtCisgKiBidXQgb25seSB0byBrZWVwIHRyYWNrIG9mIHN0YXR1cywgZXRjIGluIHRoZSBzdGF0ZSB2YXJpYWJsZXMuIEl0CisgKiB3YXMgZG9uZSB0aGlzIHdhcyB0byBtYWtlIGl0IGVhc2llciB0byBrZWVwIHRoZSBjb2RlIGluIGxpbmUgd2l0aAorICogKG5vbiBoYXJkd2FyZSBzcGVjaWZpYykgY2hhbmdlcyB0byBzZXJpYWwuYy4KKyAqCisgKiBUaGUgcG9ydCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIHR0eSBkcml2ZXIgYXMgbWlub3IgZGV2aWNlIDY0LCBhbmQKKyAqIHRoZXJlZm9yZSBvdGhlciBwb3J0cyBzaG91bGQgc2hvdWxkIG9ubHkgdXNlIDY1IHVwd2FyZHMuCisgKgorICogUmljaGFyZCBMdWNvY2sgMjgvMTIvOTkKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICogIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgCisgKiAJCTE5OTgsIDE5OTkgIFRoZW9kb3JlIFRzJ28KKyAqCisgKi8KKworLyoKKyAqIFNlcmlhbCBkcml2ZXIgY29uZmlndXJhdGlvbiBzZWN0aW9uLiAgSGVyZSBhcmUgdGhlIHZhcmlvdXMgb3B0aW9uczoKKyAqCisgKiBTRVJJQUxfUEFSQU5PSUFfQ0hFQ0sKKyAqIAkJQ2hlY2sgdGhlIG1hZ2ljIG51bWJlciBmb3IgdGhlIGFzeW5jX3N0cnVjdHVyZSB3aGVyZQorICogCQlldmVyIHBvc3NpYmxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjdW5kZWYgU0VSSUFMX1BBUkFOT0lBX0NIRUNLCisjZGVmaW5lIFNFUklBTF9ET19SRVNUQVJUCisKKy8qIFNldCBvZiBkZWJ1Z2dpbmcgZGVmaW5lcyAqLworCisjdW5kZWYgU0VSSUFMX0RFQlVHX0lOVFIKKyN1bmRlZiBTRVJJQUxfREVCVUdfT1BFTgorI3VuZGVmIFNFUklBTF9ERUJVR19GTE9XCisjdW5kZWYgU0VSSUFMX0RFQlVHX1JTX1dBSVRfVU5USUxfU0VOVAorCisvKiBTYW5pdHkgY2hlY2tzICovCisKKyNkZWZpbmUgU0VSSUFMX0lOTElORQorICAKKyNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChTRVJJQUxfREVCVUdfTUNPVU5UKQorI2RlZmluZSBEQkdfQ05UKHMpIHByaW50aygiKCVzKTogWyV4XSByZWZjPSVkLCBzZXJjPSVkLCB0dHljPSVkIC0+ICVzXG4iLCBcCisgdHR5LT5uYW1lLCAoaW5mby0+ZmxhZ3MpLCBzZXJpYWxfZHJpdmVyLT5yZWZjb3VudCxpbmZvLT5jb3VudCx0dHktPmNvdW50LHMpCisjZWxzZQorI2RlZmluZSBEQkdfQ05UKHMpCisjZW5kaWYKKworLyoKKyAqIEVuZCBvZiBzZXJpYWwgZHJpdmVyIGNvbmZpZ3VyYXRpb24gc2VjdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbFAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CitzdGF0aWMgY2hhciAqc2VyaWFsX3ZlcnNpb24gPSAiNC4zMCI7CisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKworI2lmZGVmIFNFUklBTF9JTkxJTkUKKyNkZWZpbmUgX0lOTElORV8gaW5saW5lCisjZW5kaWYKKworc3RhdGljIGNoYXIgKnNlcmlhbF9uYW1lID0gIkFtaWdhLWJ1aWx0aW4gc2VyaWFsIGRyaXZlciI7CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKKworLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgbGVmdCBpbiB4bWl0IGJ1ZmZlciBiZWZvcmUgd2UgYXNrIGZvciBtb3JlICovCisjZGVmaW5lIFdBS0VVUF9DSEFSUyAyNTYKKworc3RhdGljIHN0cnVjdCBhc3luY19zdHJ1Y3QgKklSUV9wb3J0czsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY3VycmVudF9jdGxfYml0czsKKworc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkKHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8sIHN0cnVjdCB0ZXJtaW9zICpvbGQpOworc3RhdGljIHZvaWQgcnNfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKKworCitzdGF0aWMgc3RydWN0IHNlcmlhbF9zdGF0ZSByc190YWJsZVsxXTsKKworI2RlZmluZSBOUl9QT1JUUwkoc2l6ZW9mKHJzX3RhYmxlKS9zaXplb2Yoc3RydWN0IHNlcmlhbF9zdGF0ZSkpCisKKy8qCisgKiB0bXBfYnVmIGlzIHVzZWQgYXMgYSB0ZW1wb3JhcnkgYnVmZmVyIGJ5IHNlcmlhbF93cml0ZS4gIFdlIG5lZWQgdG8KKyAqIGxvY2sgaXQgaW4gY2FzZSB0aGUgY29weV9mcm9tX3VzZXIgYmxvY2tzIHdoaWxlIHN3YXBwaW5nIGluIGEgcGFnZSwKKyAqIGFuZCBzb21lIG90aGVyIHByb2dyYW0gdHJpZXMgdG8gZG8gYSBzZXJpYWwgd3JpdGUgYXQgdGhlIHNhbWUgdGltZS4KKyAqIFNpbmNlIHRoZSBsb2NrIHdpbGwgb25seSBjb21lIHVuZGVyIGNvbnRlbnRpb24gd2hlbiB0aGUgc3lzdGVtIGlzCisgKiBzd2FwcGluZyBhbmQgYXZhaWxhYmxlIG1lbW9yeSBpcyBsb3csIGl0IG1ha2VzIHNlbnNlIHRvIHNoYXJlIG9uZQorICogYnVmZmVyIGFjcm9zcyBhbGwgdGhlIHNlcmlhbCBwb3J0cywgc2luY2UgaXQgc2lnbmlmaWNhbnRseSBzYXZlcworICogbWVtb3J5IGlmIGxhcmdlIG51bWJlcnMgb2Ygc2VyaWFsIHBvcnRzIGFyZSBvcGVuLgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqdG1wX2J1ZjsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgc2VyaWFsX2lzcm9vdCgpCShjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvLAorCQkJCQljaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworI2lmZGVmIFNFUklBTF9QQVJBTk9JQV9DSEVDSworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRtYWdpYyA9CisJCSJXYXJuaW5nOiBiYWQgbWFnaWMgbnVtYmVyIGZvciBzZXJpYWwgc3RydWN0ICglcykgaW4gJXNcbiI7CisJc3RhdGljIGNvbnN0IGNoYXIgKmJhZGluZm8gPQorCQkiV2FybmluZzogbnVsbCBhc3luY19zdHJ1Y3QgZm9yICglcykgaW4gJXNcbiI7CisKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGluZm8tPm1hZ2ljICE9IFNFUklBTF9NQUdJQykgeworCQlwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyogc29tZSBzZXJpYWwgaGFyZHdhcmUgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU0RSX09WUlVOICAgKDE8PDE1KQorI2RlZmluZSBTRFJfUkJGICAgICAoMTw8MTQpCisjZGVmaW5lIFNEUl9UQkUgICAgICgxPDwxMykKKyNkZWZpbmUgU0RSX1RTUkUgICAgKDE8PDEyKQorCisjZGVmaW5lIFNFUlBFUl9QQVJFTkIgICAgKDE8PDE1KQorCisjZGVmaW5lIEFDX1NFVENMUiAgICgxPDwxNSkKKyNkZWZpbmUgQUNfVUFSVEJSSyAgKDE8PDExKQorCisjZGVmaW5lIFNFUl9EVFIgICAgICgxPDw3KQorI2RlZmluZSBTRVJfUlRTICAgICAoMTw8NikKKyNkZWZpbmUgU0VSX0RDRCAgICAgKDE8PDUpCisjZGVmaW5lIFNFUl9DVFMgICAgICgxPDw0KQorI2RlZmluZSBTRVJfRFNSICAgICAoMTw8MykKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBydHNkdHJfY3RybChpbnQgYml0cykKK3sKKyAgICBjaWFiLnByYSA9ICgoYml0cyAmIChTRVJfUlRTIHwgU0VSX0RUUikpIF4gKFNFUl9SVFMgfCBTRVJfRFRSKSkgfCAoY2lhYi5wcmEgJiB+KFNFUl9SVFMgfCBTRVJfRFRSKSk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJzX3N0b3AoKSBhbmQgcnNfc3RhcnQoKQorICoKKyAqIFRoaXMgcm91dGluZXMgYXJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyBvciByZXNldHRpbmcgdHR5LT5zdG9wcGVkLgorICogVGhleSBlbmFibGUgb3IgZGlzYWJsZSB0cmFuc21pdHRlciBpbnRlcnJ1cHRzLCBhcyBuZWNlc3NhcnkuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgcnNfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfc3RvcCIpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpIHsKKwkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQkvKiBkaXNhYmxlIFR4IGludGVycnVwdCBhbmQgcmVtb3ZlIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KKwkJY3VzdG9tLmludGVuYSA9IElGX1RCRTsKKwkJbWIoKTsKKwkJY3VzdG9tLmludHJlcSA9IElGX1RCRTsKKwkJbWIoKTsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByc19zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfc3RhcnQiKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChpbmZvLT54bWl0LmhlYWQgIT0gaW5mby0+eG1pdC50YWlsCisJICAgICYmIGluZm8tPnhtaXQuYnVmCisJICAgICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKKwkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9UQkU7CisJCW1iKCk7CisJCS8qIHNldCBhIHBlbmRpbmcgVHggSW50ZXJydXB0LCB0cmFuc21pdHRlciBzaG91bGQgcmVzdGFydCBub3cgKi8KKwkJY3VzdG9tLmludHJlcSA9IElGX1NFVENMUiB8IElGX1RCRTsKKwkJbWIoKTsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEhlcmUgc3RhcnRzIHRoZSBpbnRlcnJ1cHQgaGFuZGxpbmcgcm91dGluZXMuICBBbGwgb2YgdGhlIGZvbGxvd2luZworICogc3Vicm91dGluZXMgYXJlIGRlY2xhcmVkIGFzIGlubGluZSBhbmQgYXJlIGZvbGRlZCBpbnRvCisgKiByc19pbnRlcnJ1cHQoKS4gIFRoZXkgd2VyZSBzZXBhcmF0ZWQgb3V0IGZvciByZWFkYWJpbGl0eSdzIHNha2UuCisgKgorICogTm90ZTogcnNfaW50ZXJydXB0KCkgaXMgYSAiZmFzdCIgaW50ZXJydXB0LCB3aGljaCBtZWFucyB0aGF0IGl0CisgKiBydW5zIHdpdGggaW50ZXJydXB0cyB0dXJuZWQgb2ZmLiAgUGVvcGxlIHdobyBtYXkgd2FudCB0byBtb2RpZnkKKyAqIHJzX2ludGVycnVwdCgpIHNob3VsZCB0cnkgdG8ga2VlcCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYXMgZmFzdCBhcworICogcG9zc2libGUuICBBZnRlciB5b3UgYXJlIGRvbmUgbWFraW5nIG1vZGlmaWNhdGlvbnMsIGl0IGlzIG5vdCBhIGJhZAorICogaWRlYSB0byBkbzoKKyAqIAorICogZ2NjIC1TIC1ES0VSTkVMIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIHNlcmlhbC5jCisgKgorICogYW5kIGxvb2sgYXQgdGhlIHJlc3VsdGluZyBhc3NlbWJsZSBjb2RlIGluIHNlcmlhbC5zLgorICoKKyAqIAkJCQktIFRlZCBUcydvICh0eXRzb0BtaXQuZWR1KSwgNy1NYXItOTMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBzY2hlZHVsZQorICogcHJvY2Vzc2luZyBpbiB0aGUgc29mdHdhcmUgaW50ZXJydXB0IHBvcnRpb24gb2YgdGhlIGRyaXZlci4KKyAqLworc3RhdGljIF9JTkxJTkVfIHZvaWQgcnNfc2NoZWRfZXZlbnQoc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbywKKwkJCQkgIGludCBldmVudCkKK3sKKwlpbmZvLT5ldmVudCB8PSAxIDw8IGV2ZW50OworCXRhc2tsZXRfc2NoZWR1bGUoJmluZm8tPnRsZXQpOworfQorCitzdGF0aWMgX0lOTElORV8gdm9pZCByZWNlaXZlX2NoYXJzKHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8pCit7CisgICAgICAgIGludCBzdGF0dXM7CisJaW50IHNlcmRhdHI7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKwl1bnNpZ25lZCBjaGFyIGNoOworCXN0cnVjdAlhc3luY19pY291bnQgKmljb3VudDsKKworCWljb3VudCA9ICZpbmZvLT5zdGF0ZS0+aWNvdW50OworCisJc3RhdHVzID0gVUFSVF9MU1JfRFI7IC8qIFdlIG9idmlvdXNseSBoYXZlIGEgY2hhcmFjdGVyISAqLworCXNlcmRhdHIgPSBjdXN0b20uc2VyZGF0cjsKKwltYigpOworCWN1c3RvbS5pbnRyZXEgPSBJRl9SQkY7CisJbWIoKTsKKworCWlmKChzZXJkYXRyICYgMHgxZmYpID09IDApCisJICAgIHN0YXR1cyB8PSBVQVJUX0xTUl9CSTsKKwlpZihzZXJkYXRyICYgU0RSX09WUlVOKQorCSAgICBzdGF0dXMgfD0gVUFSVF9MU1JfT0U7CisKKwljaCA9IHNlcmRhdHIgJiAweGZmOworCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKKwkgIGdvdG8gaWdub3JlX2NoYXI7CisJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBjaDsKKwlpY291bnQtPnJ4Kys7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgorCXByaW50aygiRFIlMDJ4OiUwMnguLi4iLCBjaCwgc3RhdHVzKTsKKyNlbmRpZgorCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gMDsKKworCS8qCisJICogV2UgZG9uJ3QgaGFuZGxlIHBhcml0eSBvciBmcmFtZSBlcnJvcnMgLSBidXQgSSBoYXZlIGxlZnQKKwkgKiB0aGUgY29kZSBpbiwgc2luY2UgSSdtIG5vdCBzdXJlIHRoYXQgdGhlIGVycm9ycyBjYW4ndCBiZQorCSAqIGRldGVjdGVkLgorCSAqLworCisJaWYgKHN0YXR1cyAmIChVQVJUX0xTUl9CSSB8IFVBUlRfTFNSX1BFIHwKKwkJICAgICAgVUFSVF9MU1JfRkUgfCBVQVJUX0xTUl9PRSkpIHsKKwkgIC8qCisJICAgKiBGb3Igc3RhdGlzdGljcyBvbmx5CisJICAgKi8KKwkgIGlmIChzdGF0dXMgJiBVQVJUX0xTUl9CSSkgeworCSAgICBzdGF0dXMgJj0gfihVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFKTsKKwkgICAgaWNvdW50LT5icmsrKzsKKwkgIH0gZWxzZSBpZiAoc3RhdHVzICYgVUFSVF9MU1JfUEUpCisJICAgIGljb3VudC0+cGFyaXR5Kys7CisJICBlbHNlIGlmIChzdGF0dXMgJiBVQVJUX0xTUl9GRSkKKwkgICAgaWNvdW50LT5mcmFtZSsrOworCSAgaWYgKHN0YXR1cyAmIFVBUlRfTFNSX09FKQorCSAgICBpY291bnQtPm92ZXJydW4rKzsKKworCSAgLyoKKwkgICAqIE5vdyBjaGVjayB0byBzZWUgaWYgY2hhcmFjdGVyIHNob3VsZCBiZQorCSAgICogaWdub3JlZCwgYW5kIG1hc2sgb2ZmIGNvbmRpdGlvbnMgd2hpY2gKKwkgICAqIHNob3VsZCBiZSBpZ25vcmVkLgorCSAgICovCisJICBpZiAoc3RhdHVzICYgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrKQorCSAgICBnb3RvIGlnbm9yZV9jaGFyOworCisJICBzdGF0dXMgJj0gaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKKworCSAgaWYgKHN0YXR1cyAmIChVQVJUX0xTUl9CSSkpIHsKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgorCSAgICBwcmludGsoImhhbmRsaW5nIGJyZWFrLi4uLiIpOworI2VuZGlmCisJICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0JSRUFLOworCSAgICBpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJICAgICAgZG9fU0FLKHR0eSk7CisJICB9IGVsc2UgaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1BFKQorCSAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9QQVJJVFk7CisJICBlbHNlIGlmIChzdGF0dXMgJiBVQVJUX0xTUl9GRSkKKwkgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJICBpZiAoc3RhdHVzICYgVUFSVF9MU1JfT0UpIHsKKwkgICAgLyoKKwkgICAgICogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzCisJICAgICAqIHJlcG9ydGVkIGltbWVkaWF0ZWx5LCBhbmQgZG9lc24ndAorCSAgICAgKiBhZmZlY3QgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCisJICAgICAqLworCSAgICBpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgeworCSAgICAgIHR0eS0+ZmxpcC5jb3VudCsrOworCSAgICAgIHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKKwkgICAgICB0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7CisJICAgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfT1ZFUlJVTjsKKwkgICAgfQorCSAgfQorCX0KKwl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7CisJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOworCXR0eS0+ZmxpcC5jb3VudCsrOworIGlnbm9yZV9jaGFyOgorCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworc3RhdGljIF9JTkxJTkVfIHZvaWQgdHJhbnNtaXRfY2hhcnMoc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbykKK3sKKwljdXN0b20uaW50cmVxID0gSUZfVEJFOworCW1iKCk7CisJaWYgKGluZm8tPnhfY2hhcikgeworCSAgICAgICAgY3VzdG9tLnNlcmRhdCA9IGluZm8tPnhfY2hhciB8IDB4MTAwOworCQltYigpOworCQlpbmZvLT5zdGF0ZS0+aWNvdW50LnR4Kys7CisJCWluZm8tPnhfY2hhciA9IDA7CisJCXJldHVybjsKKwl9CisJaWYgKGluZm8tPnhtaXQuaGVhZCA9PSBpbmZvLT54bWl0LnRhaWwKKwkgICAgfHwgaW5mby0+dHR5LT5zdG9wcGVkCisJICAgIHx8IGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgeworCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CisJICAgICAgICBjdXN0b20uaW50ZW5hID0gSUZfVEJFOworCQltYigpOworCQlyZXR1cm47CisJfQorCisJY3VzdG9tLnNlcmRhdCA9IGluZm8tPnhtaXQuYnVmW2luZm8tPnhtaXQudGFpbCsrXSB8IDB4MTAwOworCW1iKCk7CisJaW5mby0+eG1pdC50YWlsID0gaW5mby0+eG1pdC50YWlsICYgKFNFUklBTF9YTUlUX1NJWkUtMSk7CisJaW5mby0+c3RhdGUtPmljb3VudC50eCsrOworCisJaWYgKENJUkNfQ05UKGluZm8tPnhtaXQuaGVhZCwKKwkJICAgICBpbmZvLT54bWl0LnRhaWwsCisJCSAgICAgU0VSSUFMX1hNSVRfU0laRSkgPCBXQUtFVVBfQ0hBUlMpCisJCXJzX3NjaGVkX2V2ZW50KGluZm8sIFJTX0VWRU5UX1dSSVRFX1dBS0VVUCk7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgorCXByaW50aygiVEhSRS4uLiIpOworI2VuZGlmCisJaWYgKGluZm8tPnhtaXQuaGVhZCA9PSBpbmZvLT54bWl0LnRhaWwpIHsKKwkgICAgICAgIGN1c3RvbS5pbnRlbmEgPSBJRl9UQkU7CisJCW1iKCk7CisJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwl9Cit9CisKK3N0YXRpYyBfSU5MSU5FXyB2b2lkIGNoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzID0gY2lhYi5wcmEgJiAoU0VSX0RDRCB8IFNFUl9DVFMgfCBTRVJfRFNSKTsKKwl1bnNpZ25lZCBjaGFyIGRzdGF0dXM7CisJc3RydWN0CWFzeW5jX2ljb3VudCAqaWNvdW50OworCisJLyogRGV0ZXJtaW5lIGJpdHMgdGhhdCBoYXZlIGNoYW5nZWQgKi8KKwlkc3RhdHVzID0gc3RhdHVzIF4gY3VycmVudF9jdGxfYml0czsKKwljdXJyZW50X2N0bF9iaXRzID0gc3RhdHVzOworCisJaWYgKGRzdGF0dXMpIHsKKwkJaWNvdW50ID0gJmluZm8tPnN0YXRlLT5pY291bnQ7CisJCS8qIHVwZGF0ZSBpbnB1dCBsaW5lIGNvdW50ZXJzICovCisJCWlmIChkc3RhdHVzICYgU0VSX0RTUikKKwkJCWljb3VudC0+ZHNyKys7CisJCWlmIChkc3RhdHVzICYgU0VSX0RDRCkgeworCQkJaWNvdW50LT5kY2QrKzsKKyNpZmRlZiBDT05GSUdfSEFSRF9QUFMKKwkJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IQVJEUFBTX0NEKSAmJgorCQkJICAgICEoc3RhdHVzICYgU0VSX0RDRCkpCisJCQkJaGFyZHBwcygpOworI2VuZGlmCisJCX0KKwkJaWYgKGRzdGF0dXMgJiBTRVJfQ1RTKQorCQkJaWNvdW50LT5jdHMrKzsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJfQorCisJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAmJiAoZHN0YXR1cyAmIFNFUl9EQ0QpKSB7CisjaWYgKGRlZmluZWQoU0VSSUFMX0RFQlVHX09QRU4pIHx8IGRlZmluZWQoU0VSSUFMX0RFQlVHX0lOVFIpKQorCQlwcmludGsoInR0eVMlZCBDRCBub3cgJXMuLi4iLCBpbmZvLT5saW5lLAorCQkgICAgICAgKCEoc3RhdHVzICYgU0VSX0RDRCkpID8gIm9uIiA6ICJvZmYiKTsKKyNlbmRpZgorCQlpZiAoIShzdGF0dXMgJiBTRVJfRENEKSkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKwkJZWxzZSB7CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwkJCXByaW50aygiZG9pbmcgc2VyaWFsIGhhbmd1cC4uLiIpOworI2VuZGlmCisJCQlpZiAoaW5mby0+dHR5KQorCQkJCXR0eV9oYW5ndXAoaW5mby0+dHR5KTsKKwkJfQorCX0KKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgeworCQlpZiAoaW5mby0+dHR5LT5od19zdG9wcGVkKSB7CisJCQlpZiAoIShzdGF0dXMgJiBTRVJfQ1RTKSkgeworI2lmIChkZWZpbmVkKFNFUklBTF9ERUJVR19JTlRSKSB8fCBkZWZpbmVkKFNFUklBTF9ERUJVR19GTE9XKSkKKwkJCQlwcmludGsoIkNUUyB0eCBzdGFydC4uLiIpOworI2VuZGlmCisJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMDsKKwkJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJCQljdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgSUZfVEJFOworCQkJCW1iKCk7CisJCQkJLyogc2V0IGEgcGVuZGluZyBUeCBJbnRlcnJ1cHQsIHRyYW5zbWl0dGVyIHNob3VsZCByZXN0YXJ0IG5vdyAqLworCQkJCWN1c3RvbS5pbnRyZXEgPSBJRl9TRVRDTFIgfCBJRl9UQkU7CisJCQkJbWIoKTsKKwkJCQlyc19zY2hlZF9ldmVudChpbmZvLCBSU19FVkVOVF9XUklURV9XQUtFVVApOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICgoc3RhdHVzICYgU0VSX0NUUykpIHsKKyNpZiAoZGVmaW5lZChTRVJJQUxfREVCVUdfSU5UUikgfHwgZGVmaW5lZChTRVJJQUxfREVCVUdfRkxPVykpCisJCQkJcHJpbnRrKCJDVFMgdHggc3RvcC4uLiIpOworI2VuZGlmCisJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMTsKKwkJCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CisJCQkJLyogZGlzYWJsZSBUeCBpbnRlcnJ1cHQgYW5kIHJlbW92ZSBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJCQkJY3VzdG9tLmludGVuYSA9IElGX1RCRTsKKwkJCQltYigpOworCQkJCWN1c3RvbS5pbnRyZXEgPSBJRl9UQkU7CisJCQkJbWIoKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHNlcl92YmxfaW50KCBpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgLyogdmJsIGlzIGp1c3QgYSBwZXJpb2RpYyBpbnRlcnJ1cHQgd2UgdGllIGludG8gdG8gdXBkYXRlIG1vZGVtIHN0YXR1cyAqLworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvID0gSVJRX3BvcnRzOworCS8qCisJICogVEJEIC0gaXMgaXQgYmV0dGVyIHRvIHVucmVnaXN0ZXIgZnJvbSB0aGlzIGludGVycnVwdCBvciB0bworCSAqIGlnbm9yZSBpdCBpZiBNU0kgaXMgY2xlYXIgPworCSAqLworCWlmKGluZm8tPklFUiAmIFVBUlRfSUVSX01TSSkKKwkgIGNoZWNrX21vZGVtX3N0YXR1cyhpbmZvKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzZXJfcnhfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKKwlwcmludGsoInNlcl9yeF9pbnQuLi4iKTsKKyNlbmRpZgorCisJaW5mbyA9IElSUV9wb3J0czsKKwlpZiAoIWluZm8gfHwgIWluZm8tPnR0eSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJcmVjZWl2ZV9jaGFycyhpbmZvKTsKKwlpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisjaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKKwlwcmludGsoImVuZC5cbiIpOworI2VuZGlmCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2VyX3R4X2ludChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbzsKKworCWlmIChjdXN0b20uc2VyZGF0ciAmIFNEUl9UQkUpIHsKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgorCSAgcHJpbnRrKCJzZXJfdHhfaW50Li4uIik7CisjZW5kaWYKKworCSAgaW5mbyA9IElSUV9wb3J0czsKKwkgIGlmICghaW5mbyB8fCAhaW5mby0+dHR5KQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkgIHRyYW5zbWl0X2NoYXJzKGluZm8pOworCSAgaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCisJICBwcmludGsoImVuZC5cbiIpOworI2VuZGlmCisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEhlcmUgZW5kcyB0aGUgc2VyaWFsIGludGVycnVwdCByb3V0aW5lcy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gaGFuZGxlIHRoZSAiYm90dG9tIGhhbGYiIHByb2Nlc3NpbmcgZm9yIHRoZQorICogc2VyaWFsIGRyaXZlciwga25vd24gYWxzbyB0aGUgInNvZnR3YXJlIGludGVycnVwdCIgcHJvY2Vzc2luZy4KKyAqIFRoaXMgcHJvY2Vzc2luZyBpcyBkb25lIGF0IHRoZSBrZXJuZWwgaW50ZXJydXB0IGxldmVsLCBhZnRlciB0aGUKKyAqIHJzX2ludGVycnVwdCgpIGhhcyByZXR1cm5lZCwgQlVUIFdJVEggSU5URVJSVVBUUyBUVVJORUQgT04uICBUaGlzCisgKiBpcyB3aGVyZSB0aW1lLWNvbnN1bWluZyBhY3Rpdml0aWVzIHdoaWNoIGNhbiBub3QgYmUgZG9uZSBpbiB0aGUKKyAqIGludGVycnVwdCBkcml2ZXIgcHJvcGVyIGFyZSBkb25lOyB0aGUgaW50ZXJydXB0IGRyaXZlciBzY2hlZHVsZXMKKyAqIHRoZW0gdXNpbmcgcnNfc2NoZWRfZXZlbnQoKSwgYW5kIHRoZXkgZ2V0IGRvbmUgaGVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBkb19zb2Z0aW50KHVuc2lnbmVkIGxvbmcgcHJpdmF0ZV8pCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdAkqaW5mbyA9IChzdHJ1Y3QgYXN5bmNfc3RydWN0ICopIHByaXZhdGVfOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisKKwl0dHkgPSBpbmZvLT50dHk7CisJaWYgKCF0dHkpCisJCXJldHVybjsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlNfRVZFTlRfV1JJVEVfV0FLRVVQLCAmaW5mby0+ZXZlbnQpKSB7CisJCXR0eV93YWtldXAodHR5KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCX0KK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG93IGxldmVsIHV0aWxpdHkgc3Vicm91dGluZXMgZm9yIHRoZSBzZXJpYWwgZHJpdmVyOiAgcm91dGluZXMgdG8KKyAqIGZpZ3VyZSBvdXQgdGhlIGFwcHJvcHJpYXRlIHRpbWVvdXQgZm9yIGFuIGludGVycnVwdCBjaGFpbiwgcm91dGluZXMKKyAqIHRvIGluaXRpYWxpemUgYW5kIHN0YXJ0dXAgYSBzZXJpYWwgcG9ydCwgYW5kIHJvdXRpbmVzIHRvIHNodXRkb3duIGEKKyAqIHNlcmlhbCBwb3J0LiAgVXNlZnVsIHN0dWZmIGxpa2UgdGhhdC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbnQgc3RhcnR1cChzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludAlyZXR2YWw9MDsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisKKwlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlmcmVlX3BhZ2UocGFnZSk7CisJCWdvdG8gZXJyb3V0OworCX0KKworCWlmIChpbmZvLT54bWl0LmJ1ZikKKwkJZnJlZV9wYWdlKHBhZ2UpOworCWVsc2UKKwkJaW5mby0+eG1pdC5idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoInN0YXJ0aW5nIHVwIHR0eXMlZCAuLi4iLCBpbmZvLT5saW5lKTsKKyNlbmRpZgorCisJLyogQ2xlYXIgYW55dGhpbmcgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLworCisJY3VzdG9tLmludHJlcSA9IElGX1JCRjsKKwltYigpOworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1ZFUlRCLCBzZXJfdmJsX2ludCwgMCwgInNlcmlhbCBzdGF0dXMiLCBpbmZvKTsKKwlpZiAocmV0dmFsKSB7CisJICBpZiAoc2VyaWFsX2lzcm9vdCgpKSB7CisJICAgIGlmIChpbmZvLT50dHkpCisJICAgICAgc2V0X2JpdChUVFlfSU9fRVJST1IsCisJCSAgICAgICZpbmZvLT50dHktPmZsYWdzKTsKKwkgICAgcmV0dmFsID0gMDsKKwkgIH0KKwkgIGdvdG8gZXJyb3V0OworCX0KKworCS8qIGVuYWJsZSBib3RoIFJ4IGFuZCBUeCBpbnRlcnJ1cHRzICovCisJY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX1JCRiB8IElGX1RCRTsKKwltYigpOworCWluZm8tPklFUiA9IFVBUlRfSUVSX01TSTsKKworCS8qIHJlbWVtYmVyIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERDRCBhbmQgQ1RTIGJpdHMgKi8KKwljdXJyZW50X2N0bF9iaXRzID0gY2lhYi5wcmEgJiAoU0VSX0RDRCB8IFNFUl9DVFMgfCBTRVJfRFNSKTsKKworCUlSUV9wb3J0cyA9IGluZm87CisKKwlpbmZvLT5NQ1IgPSAwOworCWlmIChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkKKwkgIGluZm8tPk1DUiA9IFNFUl9EVFIgfCBTRVJfUlRTOworCXJ0c2R0cl9jdHJsKGluZm8tPk1DUik7CisKKwlpZiAoaW5mby0+dHR5KQorCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJaW5mby0+eG1pdC5oZWFkID0gaW5mby0+eG1pdC50YWlsID0gMDsKKworCS8qCisJICogU2V0IHVwIHRoZSB0dHktPmFsdF9zcGVlZCBrbHVkZ2UKKwkgKi8KKwlpZiAoaW5mby0+dHR5KSB7CisJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA1NzYwMDsKKwkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSAxMTUyMDA7CisJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKKwkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMjMwNDAwOworCQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA0NjA4MDA7CisJfQorCisJLyoKKwkgKiBhbmQgc2V0IHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQKKwkgKi8KKwljaGFuZ2Vfc3BlZWQoaW5mbywgTlVMTCk7CisKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIDA7CisKK2Vycm91dDoKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSB3aWxsIHNodXRkb3duIGEgc2VyaWFsIHBvcnQ7IGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBhbmQKKyAqIERUUiBpcyBkcm9wcGVkIGlmIHRoZSBoYW5ndXAgb24gY2xvc2UgdGVybWlvIGZsYWcgaXMgb24uCisgKi8KK3N0YXRpYyB2b2lkIHNodXRkb3duKHN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGU7CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJcmV0dXJuOworCisJc3RhdGUgPSBpbmZvLT5zdGF0ZTsKKworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisJcHJpbnRrKCJTaHV0dGluZyBkb3duIHNlcmlhbCBwb3J0ICVkIC4uLi5cbiIsIGluZm8tPmxpbmUpOworI2VuZGlmCisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCisJLyoKKwkgKiBjbGVhciBkZWx0YV9tc3Jfd2FpdCBxdWV1ZSB0byBhdm9pZCBtZW0gbGVha3M6IHdlIG1heSBmcmVlIHRoZSBpcnEKKwkgKiBoZXJlIHNvIHRoZSBxdWV1ZSBtaWdodCBuZXZlciBiZSB3YWtlbiB1cAorCSAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCisJSVJRX3BvcnRzID0gTlVMTDsKKworCS8qCisJICogRnJlZSB0aGUgSVJRLCBpZiBuZWNlc3NhcnkKKwkgKi8KKwlmcmVlX2lycShJUlFfQU1JR0FfVkVSVEIsIGluZm8pOworCisJaWYgKGluZm8tPnhtaXQuYnVmKSB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5mby0+eG1pdC5idWYpOworCQlpbmZvLT54bWl0LmJ1ZiA9IE5VTEw7CisJfQorCisJaW5mby0+SUVSID0gMDsKKwljdXN0b20uaW50ZW5hID0gSUZfUkJGIHwgSUZfVEJFOworCW1iKCk7CisKKwkvKiBkaXNhYmxlIGJyZWFrIGNvbmRpdGlvbiAqLworCWN1c3RvbS5hZGtjb24gPSBBQ19VQVJUQlJLOworCW1iKCk7CisKKwlpZiAoIWluZm8tPnR0eSB8fCAoaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpKQorCQlpbmZvLT5NQ1IgJj0gfihTRVJfRFRSfFNFUl9SVFMpOworCXJ0c2R0cl9jdHJsKGluZm8tPk1DUik7CisKKwlpZiAoaW5mby0+dHR5KQorCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBzZXQgdGhlIFVBUlQgZGl2aXNvciByZWdpc3RlcnMgdG8gbWF0Y2gKKyAqIHRoZSBzcGVjaWZpZWQgYmF1ZCByYXRlIGZvciBhIHNlcmlhbCBwb3J0LgorICovCitzdGF0aWMgdm9pZCBjaGFuZ2Vfc3BlZWQoc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbywKKwkJCSBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJaW50CXF1b3QgPSAwLCBiYXVkX2Jhc2UsIGJhdWQ7CisJdW5zaWduZWQgY2ZsYWcsIGN2YWwgPSAwOworCWludAliaXRzOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAoIWluZm8tPnR0eSB8fCAhaW5mby0+dHR5LT50ZXJtaW9zKQorCQlyZXR1cm47CisJY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisKKwkvKiBCeXRlIHNpemUgaXMgYWx3YXlzIDggYml0cyBwbHVzIHBhcml0eSBiaXQgaWYgcmVxdWVzdGVkICovCisKKwljdmFsID0gMzsgYml0cyA9IDEwOworCWlmIChjZmxhZyAmIENTVE9QQikgeworCQljdmFsIHw9IDB4MDQ7CisJCWJpdHMrKzsKKwl9CisJaWYgKGNmbGFnICYgUEFSRU5CKSB7CisJCWN2YWwgfD0gVUFSVF9MQ1JfUEFSSVRZOworCQliaXRzKys7CisJfQorCWlmICghKGNmbGFnICYgUEFST0REKSkKKwkJY3ZhbCB8PSBVQVJUX0xDUl9FUEFSOworI2lmZGVmIENNU1BBUgorCWlmIChjZmxhZyAmIENNU1BBUikKKwkJY3ZhbCB8PSBVQVJUX0xDUl9TUEFSOworI2VuZGlmCisKKwkvKiBEZXRlcm1pbmUgZGl2aXNvciBiYXNlZCBvbiBiYXVkIHJhdGUgKi8KKwliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKKwlpZiAoIWJhdWQpCisJCWJhdWQgPSA5NjAwOwkvKiBCMCB0cmFuc2l0aW9uIGhhbmRsZWQgaW4gcnNfc2V0X3Rlcm1pb3MgKi8KKwliYXVkX2Jhc2UgPSBpbmZvLT5zdGF0ZS0+YmF1ZF9iYXNlOworCWlmIChiYXVkID09IDM4NDAwICYmCisJICAgICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QpKQorCQlxdW90ID0gaW5mby0+c3RhdGUtPmN1c3RvbV9kaXZpc29yOworCWVsc2UgeworCQlpZiAoYmF1ZCA9PSAxMzQpCisJCQkvKiBTcGVjaWFsIGNhc2Ugc2luY2UgMTM0IGlzIHJlYWxseSAxMzQuNSAqLworCQkJcXVvdCA9ICgyKmJhdWRfYmFzZSAvIDI2OSk7CisJCWVsc2UgaWYgKGJhdWQpCisJCQlxdW90ID0gYmF1ZF9iYXNlIC8gYmF1ZDsKKwl9CisJLyogSWYgdGhlIHF1b3RpZW50IGlzIHplcm8gcmVmdXNlIHRoZSBjaGFuZ2UgKi8KKwlpZiAoIXF1b3QgJiYgb2xkX3Rlcm1pb3MpIHsKKwkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVRDsKKwkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKTsKKwkJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKGluZm8tPnR0eSk7CisJCWlmICghYmF1ZCkKKwkJCWJhdWQgPSA5NjAwOworCQlpZiAoYmF1ZCA9PSAzODQwMCAmJgorCQkgICAgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkpCisJCQlxdW90ID0gaW5mby0+c3RhdGUtPmN1c3RvbV9kaXZpc29yOworCQllbHNlIHsKKwkJCWlmIChiYXVkID09IDEzNCkKKwkJCQkvKiBTcGVjaWFsIGNhc2Ugc2luY2UgMTM0IGlzIHJlYWxseSAxMzQuNSAqLworCQkJCXF1b3QgPSAoMipiYXVkX2Jhc2UgLyAyNjkpOworCQkJZWxzZSBpZiAoYmF1ZCkKKwkJCQlxdW90ID0gYmF1ZF9iYXNlIC8gYmF1ZDsKKwkJfQorCX0KKwkvKiBBcyBhIGxhc3QgcmVzb3J0LCBpZiB0aGUgcXVvdGllbnQgaXMgemVybywgZGVmYXVsdCB0byA5NjAwIGJwcyAqLworCWlmICghcXVvdCkKKwkJcXVvdCA9IGJhdWRfYmFzZSAvIDk2MDA7CisJaW5mby0+cXVvdCA9IHF1b3Q7CisJaW5mby0+dGltZW91dCA9ICgoaW5mby0+eG1pdF9maWZvX3NpemUqSFoqYml0cypxdW90KSAvIGJhdWRfYmFzZSk7CisJaW5mby0+dGltZW91dCArPSBIWi81MDsJCS8qIEFkZCAuMDIgc2Vjb25kcyBvZiBzbG9wICovCisKKwkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgYW5kIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzICovCisJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9NU0k7CisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSEFSRFBQU19DRCkKKwkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX01TSTsKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfTVNJOworCX0gZWxzZQorCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ1RTX0ZMT1c7CisJaWYgKGNmbGFnICYgQ0xPQ0FMKQorCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJZWxzZSB7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfTVNJOworCX0KKwkvKiBUQkQ6CisJICogRG9lcyBjbGVhcmluZyBJRVJfTVNJIGltcGx5IHRoYXQgd2Ugc2hvdWxkIGRpc2JhbGUgdGhlIFZCTCBpbnRlcnJ1cHQgPworCSAqLworCisJLyoKKwkgKiBTZXQgdXAgcGFyaXR5IGNoZWNrIGZsYWcKKwkgKi8KKyNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQorCisJaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfRFI7CisJaWYgKElfSU5QQ0soaW5mby0+dHR5KSkKKwkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFOworCWlmIChJX0JSS0lOVChpbmZvLT50dHkpIHx8IElfUEFSTVJLKGluZm8tPnR0eSkpCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7CisKKwkvKgorCSAqIENoYXJhY3RlcnMgdG8gaWdub3JlCisJICovCisJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrID0gMDsKKwlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7CisJaWYgKElfSUdOQlJLKGluZm8tPnR0eSkpIHsKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCQkvKgorCQkgKiBJZiB3ZSdyZSBpZ25vcmUgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLCBpZ25vcmUgCisJCSAqIG92ZXJydW5zIHRvby4gIChGb3IgcmVhbCByYXcgc3VwcG9ydCkuCisJCSAqLworCQlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkKKwkJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9PRTsKKwl9CisJLyoKKwkgKiAhISEgaWdub3JlIGFsbCBjaGFyYWN0ZXJzIGlmIENSRUFEIGlzIG5vdCBzZXQKKwkgKi8KKwlpZiAoKGNmbGFnICYgQ1JFQUQpID09IDApCisJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9EUjsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwl7CisJICBzaG9ydCBzZXJwZXI7CisKKwkvKiBTZXQgdXAgdGhlIGJhdWQgcmF0ZSAqLworCSAgc2VycGVyID0gcXVvdCAtIDE7CisKKwkvKiBFbmFibGUgb3IgZGlzYWJsZSBwYXJpdHkgYml0ICovCisKKwlpZihjdmFsICYgVUFSVF9MQ1JfUEFSSVRZKQorCSAgc2VycGVyIHw9IChTRVJQRVJfUEFSRU5CKTsKKworCWN1c3RvbS5zZXJwZXIgPSBzZXJwZXI7CisJbWIoKTsKKwl9CisKKwlpbmZvLT5MQ1IgPSBjdmFsOwkJCQkvKiBTYXZlIExDUiAqLworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnNfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3B1dF9jaGFyIikpCisJCXJldHVybjsKKworCWlmICghdHR5IHx8ICFpbmZvLT54bWl0LmJ1ZikKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChDSVJDX1NQQUNFKGluZm8tPnhtaXQuaGVhZCwKKwkJICAgICAgIGluZm8tPnhtaXQudGFpbCwKKwkJICAgICAgIFNFUklBTF9YTUlUX1NJWkUpID09IDApIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJaW5mby0+eG1pdC5idWZbaW5mby0+eG1pdC5oZWFkKytdID0gY2g7CisJaW5mby0+eG1pdC5oZWFkICY9IFNFUklBTF9YTUlUX1NJWkUtMTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJzX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgYXN5bmNfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19mbHVzaF9jaGFycyIpKQorCQlyZXR1cm47CisKKwlpZiAoaW5mby0+eG1pdC5oZWFkID09IGluZm8tPnhtaXQudGFpbAorCSAgICB8fCB0dHktPnN0b3BwZWQKKwkgICAgfHwgdHR5LT5od19zdG9wcGVkCisJICAgIHx8ICFpbmZvLT54bWl0LmJ1ZikKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9UQkU7CisJbWIoKTsKKwkvKiBzZXQgYSBwZW5kaW5nIFR4IEludGVycnVwdCwgdHJhbnNtaXR0ZXIgc2hvdWxkIHJlc3RhcnQgbm93ICovCisJY3VzdG9tLmludHJlcSA9IElGX1NFVENMUiB8IElGX1RCRTsKKwltYigpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGludCByc193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50CWMsIHJldCA9IDA7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgYXN5bmNfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc193cml0ZSIpKQorCQlyZXR1cm4gMDsKKworCWlmICghdHR5IHx8ICFpbmZvLT54bWl0LmJ1ZiB8fCAhdG1wX2J1ZikKKwkJcmV0dXJuIDA7CisKKwlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXdoaWxlICgxKSB7CisJCWMgPSBDSVJDX1NQQUNFX1RPX0VORChpbmZvLT54bWl0LmhlYWQsCisJCQkJICAgICAgaW5mby0+eG1pdC50YWlsLAorCQkJCSAgICAgIFNFUklBTF9YTUlUX1NJWkUpOworCQlpZiAoY291bnQgPCBjKQorCQkJYyA9IGNvdW50OworCQlpZiAoYyA8PSAwKSB7CisJCQlicmVhazsKKwkJfQorCQltZW1jcHkoaW5mby0+eG1pdC5idWYgKyBpbmZvLT54bWl0LmhlYWQsIGJ1ZiwgYyk7CisJCWluZm8tPnhtaXQuaGVhZCA9ICgoaW5mby0+eG1pdC5oZWFkICsgYykgJgorCQkJCSAgIChTRVJJQUxfWE1JVF9TSVpFLTEpKTsKKwkJYnVmICs9IGM7CisJCWNvdW50IC09IGM7CisJCXJldCArPSBjOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlpZiAoaW5mby0+eG1pdC5oZWFkICE9IGluZm8tPnhtaXQudGFpbAorCSAgICAmJiAhdHR5LT5zdG9wcGVkCisJICAgICYmICF0dHktPmh3X3N0b3BwZWQKKwkgICAgJiYgIShpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSkgeworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX1RCRTsKKwkJbWIoKTsKKwkJLyogc2V0IGEgcGVuZGluZyBUeCBJbnRlcnJ1cHQsIHRyYW5zbWl0dGVyIHNob3VsZCByZXN0YXJ0IG5vdyAqLworCQljdXN0b20uaW50cmVxID0gSUZfU0VUQ0xSIHwgSUZfVEJFOworCQltYigpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3dyaXRlX3Jvb20iKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIENJUkNfU1BBQ0UoaW5mby0+eG1pdC5oZWFkLCBpbmZvLT54bWl0LnRhaWwsIFNFUklBTF9YTUlUX1NJWkUpOworfQorCitzdGF0aWMgaW50IHJzX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2NoYXJzX2luX2J1ZmZlciIpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gQ0lSQ19DTlQoaW5mby0+eG1pdC5oZWFkLCBpbmZvLT54bWl0LnRhaWwsIFNFUklBTF9YTUlUX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCByc19mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2ZsdXNoX2J1ZmZlciIpKQorCQlyZXR1cm47CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWluZm8tPnhtaXQuaGVhZCA9IGluZm8tPnhtaXQudGFpbCA9IDA7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl0dHlfd2FrZXVwKHR0eSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGhpZ2gtcHJpb3JpdHkgWE9OL1hPRkYgY2hhcmFjdGVyIHRvCisgKiB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHJzX3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19zZW5kX2NoYXIiKSkKKwkJcmV0dXJuOworCisJaW5mby0+eF9jaGFyID0gY2g7CisJaWYgKGNoKSB7CisJCS8qIE1ha2Ugc3VyZSB0cmFuc21pdCBpbnRlcnJ1cHRzIGFyZSBvbiAqLworCisJICAgICAgICAvKiBDaGVjayB0aGlzICEgKi8KKwkgICAgICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJaWYoIShjdXN0b20uaW50ZW5hciAmIElGX1RCRSkpIHsKKwkJICAgIGN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9UQkU7CisJCSAgICBtYigpOworCQkgICAgLyogc2V0IGEgcGVuZGluZyBUeCBJbnRlcnJ1cHQsIHRyYW5zbWl0dGVyIHNob3VsZCByZXN0YXJ0IG5vdyAqLworCQkgICAgY3VzdG9tLmludHJlcSA9IElGX1NFVENMUiB8IElGX1RCRTsKKwkJICAgIG1iKCk7CisJCX0KKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCX0KK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnNfdGhyb3R0bGUoKQorICogCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSB1cHBlci1sYXllciB0dHkgbGF5ZXIgdG8gc2lnbmFsIHRoYXQKKyAqIGluY29taW5nIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHRocm90dGxlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCByc190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgU0VSSUFMX0RFQlVHX1RIUk9UVExFCisJY2hhcglidWZbNjRdOworCisJcHJpbnRrKCJ0aHJvdHRsZSAlczogJWQuLi4uXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZiksCisJICAgICAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSkpOworI2VuZGlmCisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3Rocm90dGxlIikpCisJCXJldHVybjsKKworCWlmIChJX0lYT0ZGKHR0eSkpCisJCXJzX3NlbmRfeGNoYXIodHR5LCBTVE9QX0NIQVIodHR5KSk7CisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykKKwkJaW5mby0+TUNSICY9IH5TRVJfUlRTOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXJ0c2R0cl9jdHJsKGluZm8tPk1DUik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByc191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBTRVJJQUxfREVCVUdfVEhST1RUTEUKKwljaGFyCWJ1Zls2NF07CisKKwlwcmludGsoInVudGhyb3R0bGUgJXM6ICVkLi4uLlxuIiwgdHR5X25hbWUodHR5LCBidWYpLAorCSAgICAgICB0dHktPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0dHkpKTsKKyNlbmRpZgorCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc191bnRocm90dGxlIikpCisJCXJldHVybjsKKworCWlmIChJX0lYT0ZGKHR0eSkpIHsKKwkJaWYgKGluZm8tPnhfY2hhcikKKwkJCWluZm8tPnhfY2hhciA9IDA7CisJCWVsc2UKKwkJCXJzX3NlbmRfeGNoYXIodHR5LCBTVEFSVF9DSEFSKHR0eSkpOworCX0KKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykKKwkJaW5mby0+TUNSIHw9IFNFUl9SVFM7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXJ0c2R0cl9jdHJsKGluZm8tPk1DUik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByc19pb2N0bCgpIGFuZCBmcmllbmRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdGF0aWMgaW50IGdldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbywKKwkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0ICogcmV0aW5mbykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7CisJc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGUgPSBpbmZvLT5zdGF0ZTsKKyAgIAorCWlmICghcmV0aW5mbykKKwkJcmV0dXJuIC1FRkFVTFQ7CisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAudHlwZSA9IHN0YXRlLT50eXBlOworCXRtcC5saW5lID0gc3RhdGUtPmxpbmU7CisJdG1wLnBvcnQgPSBzdGF0ZS0+cG9ydDsKKwl0bXAuaXJxID0gc3RhdGUtPmlycTsKKwl0bXAuZmxhZ3MgPSBzdGF0ZS0+ZmxhZ3M7CisJdG1wLnhtaXRfZmlmb19zaXplID0gc3RhdGUtPnhtaXRfZmlmb19zaXplOworCXRtcC5iYXVkX2Jhc2UgPSBzdGF0ZS0+YmF1ZF9iYXNlOworCXRtcC5jbG9zZV9kZWxheSA9IHN0YXRlLT5jbG9zZV9kZWxheTsKKwl0bXAuY2xvc2luZ193YWl0ID0gc3RhdGUtPmNsb3Npbmdfd2FpdDsKKwl0bXAuY3VzdG9tX2Rpdmlzb3IgPSBzdGF0ZS0+Y3VzdG9tX2Rpdmlzb3I7CisJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCZ0bXAsc2l6ZW9mKCpyZXRpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbywKKwkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0ICogbmV3X2luZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKKyAJc3RydWN0IHNlcmlhbF9zdGF0ZSBvbGRfc3RhdGUsICpzdGF0ZTsKKwl1bnNpZ25lZCBpbnQJCWNoYW5nZV9pcnEsY2hhbmdlX3BvcnQ7CisJaW50IAkJCXJldHZhbCA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsbmV3X2luZm8sc2l6ZW9mKG5ld19zZXJpYWwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc3RhdGUgPSBpbmZvLT5zdGF0ZTsKKwlvbGRfc3RhdGUgPSAqc3RhdGU7CisgIAorCWNoYW5nZV9pcnEgPSBuZXdfc2VyaWFsLmlycSAhPSBzdGF0ZS0+aXJxOworCWNoYW5nZV9wb3J0ID0gKG5ld19zZXJpYWwucG9ydCAhPSBzdGF0ZS0+cG9ydCk7CisJaWYoY2hhbmdlX2lycSB8fCBjaGFuZ2VfcG9ydCB8fCAobmV3X3NlcmlhbC54bWl0X2ZpZm9fc2l6ZSAhPSBzdGF0ZS0+eG1pdF9maWZvX3NpemUpKQorCSAgcmV0dXJuIC1FSU5WQUw7CisgIAorCWlmICghc2VyaWFsX2lzcm9vdCgpKSB7CisJCWlmICgobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gc3RhdGUtPmJhdWRfYmFzZSkgfHwKKwkJICAgIChuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICE9IHN0YXRlLT5jbG9zZV9kZWxheSkgfHwKKwkJICAgIChuZXdfc2VyaWFsLnhtaXRfZmlmb19zaXplICE9IHN0YXRlLT54bWl0X2ZpZm9fc2l6ZSkgfHwKKwkJICAgICgobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KKwkJICAgICAoc3RhdGUtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCisJCQlyZXR1cm4gLUVQRVJNOworCQlzdGF0ZS0+ZmxhZ3MgPSAoKHN0YXRlLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAorCQkJICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKKwkJaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CisJCQkgICAgICAgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOworCQlzdGF0ZS0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOworCQlnb3RvIGNoZWNrX2FuZF9leGl0OworCX0KKworCWlmIChuZXdfc2VyaWFsLmJhdWRfYmFzZSA8IDk2MDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBPSywgcGFzdCB0aGlzIHBvaW50LCBhbGwgdGhlIGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRvbmUuCisJICogQXQgdGhpcyBwb2ludCwgd2Ugc3RhcnQgbWFraW5nIGNoYW5nZXMuLi4uLgorCSAqLworCisJc3RhdGUtPmJhdWRfYmFzZSA9IG5ld19zZXJpYWwuYmF1ZF9iYXNlOworCXN0YXRlLT5mbGFncyA9ICgoc3RhdGUtPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CisJCQkobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CisJaW5mby0+ZmxhZ3MgPSAoKHN0YXRlLT5mbGFncyAmIH5BU1lOQ19JTlRFUk5BTF9GTEFHUykgfAorCQkgICAgICAgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5URVJOQUxfRkxBR1MpKTsKKwlzdGF0ZS0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOworCXN0YXRlLT5jbG9zZV9kZWxheSA9IG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgKiBIWi8xMDA7CisJc3RhdGUtPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFovMTAwOworCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKworY2hlY2tfYW5kX2V4aXQ6CisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKKwkJaWYgKCgob2xkX3N0YXRlLmZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9CisJCSAgICAgKHN0YXRlLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSkgfHwKKwkJICAgIChvbGRfc3RhdGUuY3VzdG9tX2Rpdmlzb3IgIT0gc3RhdGUtPmN1c3RvbV9kaXZpc29yKSkgeworCQkJaWYgKChzdGF0ZS0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQorCQkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gNTc2MDA7CisJCQlpZiAoKHN0YXRlLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMTE1MjAwOworCQkJaWYgKChzdGF0ZS0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKKwkJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDIzMDQwMDsKKwkJCWlmICgoc3RhdGUtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQorCQkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gNDYwODAwOworCQkJY2hhbmdlX3NwZWVkKGluZm8sIE5VTEwpOworCQl9CisJfSBlbHNlCisJCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKgorICogZ2V0X2xzcl9pbmZvIC0gZ2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyIGluZm8KKyAqCisgKiBQdXJwb3NlOiBMZXQgdXNlciBjYWxsIGlvY3RsKCkgdG8gZ2V0IGluZm8gd2hlbiB0aGUgVUFSVCBwaHlzaWNhbGx5CisgKiAJICAgIGlzIGVtcHRpZWQuICBPbiBidXMgdHlwZXMgbGlrZSBSUzQ4NSwgdGhlIHRyYW5zbWl0dGVyIG11c3QKKyAqIAkgICAgcmVsZWFzZSB0aGUgYnVzIGFmdGVyIHRyYW5zbWl0dGluZy4gVGhpcyBtdXN0IGJlIGRvbmUgd2hlbgorICogCSAgICB0aGUgdHJhbnNtaXQgc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHksIG5vdCBiZSBkb25lIHdoZW4gdGhlCisgKiAJICAgIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgaXMgZW1wdHkuICBUaGlzIGZ1bmN0aW9uYWxpdHkKKyAqIAkgICAgYWxsb3dzIGFuIFJTNDg1IGRyaXZlciB0byBiZSB3cml0dGVuIGluIHVzZXIgc3BhY2UuIAorICovCitzdGF0aWMgaW50IGdldF9sc3JfaW5mbyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbywgdW5zaWduZWQgaW50ICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc3RhdHVzID0gY3VzdG9tLnNlcmRhdHI7CisJbWIoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmVzdWx0ID0gKChzdGF0dXMgJiBTRFJfVFNSRSkgPyBUSU9DU0VSX1RFTVQgOiAwKTsKKwlpZiAoY29weV90b191c2VyKHZhbHVlLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcnNfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgY2hhciBjb250cm9sLCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfaW9jdGwiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQlyZXR1cm4gLUVJTzsKKworCWNvbnRyb2wgPSBpbmZvLT5NQ1I7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXN0YXR1cyA9IGNpYWIucHJhOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gICAgKChjb250cm9sICYgU0VSX1JUUykgPyBUSU9DTV9SVFMgOiAwKQorCQl8ICgoY29udHJvbCAmIFNFUl9EVFIpID8gVElPQ01fRFRSIDogMCkKKwkJfCAoIShzdGF0dXMgICYgU0VSX0RDRCkgPyBUSU9DTV9DQVIgOiAwKQorCQl8ICghKHN0YXR1cyAgJiBTRVJfRFNSKSA/IFRJT0NNX0RTUiA6IDApCisJCXwgKCEoc3RhdHVzICAmIFNFUl9DVFMpID8gVElPQ01fQ1RTIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgcnNfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfaW9jdGwiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQlyZXR1cm4gLUVJTzsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlpbmZvLT5NQ1IgfD0gU0VSX1JUUzsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlpbmZvLT5NQ1IgfD0gU0VSX0RUUjsKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCWluZm8tPk1DUiAmPSB+U0VSX1JUUzsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWluZm8tPk1DUiAmPSB+U0VSX0RUUjsKKwlydHNkdHJfY3RybChpbmZvLT5NQ1IpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJzX2JyZWFrKCkgLS0tIHJvdXRpbmUgd2hpY2ggdHVybnMgdGhlIGJyZWFrIGhhbmRsaW5nIG9uIG9yIG9mZgorICovCitzdGF0aWMgdm9pZCByc19icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfYnJlYWsiKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChicmVha19zdGF0ZSA9PSAtMSkKKwkgIGN1c3RvbS5hZGtjb24gPSBBQ19TRVRDTFIgfCBBQ19VQVJUQlJLOworCWVsc2UKKwkgIGN1c3RvbS5hZGtjb24gPSBBQ19VQVJUQlJLOworCW1iKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisKK3N0YXRpYyBpbnQgcnNfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGFzeW5jX2ljb3VudCBjcHJldiwgY25vdzsJLyoga2VybmVsIGNvdW50ZXIgdGVtcHMgKi8KKwlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBpY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfaW9jdGwiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKGNtZCAhPSBUSU9DR1NFUklBTCkgJiYgKGNtZCAhPSBUSU9DU1NFUklBTCkgJiYKKwkgICAgKGNtZCAhPSBUSU9DU0VSQ09ORklHKSAmJiAoY21kICE9IFRJT0NTRVJHU1RSVUNUKSAmJgorCSAgICAoY21kICE9IFRJT0NNSVdBSVQpICYmIChjbWQgIT0gVElPQ0dJQ09VTlQpKSB7CisJCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJICAgIHJldHVybiAtRUlPOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgVElPQ0dTRVJJQUw6CisJCQlyZXR1cm4gZ2V0X3NlcmlhbF9pbmZvKGluZm8sCisJCQkJCSAgICAgICAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKikgYXJnKTsKKwkJY2FzZSBUSU9DU1NFUklBTDoKKwkJCXJldHVybiBzZXRfc2VyaWFsX2luZm8oaW5mbywKKwkJCQkJICAgICAgIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOworCQljYXNlIFRJT0NTRVJDT05GSUc6CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRJT0NTRVJHRVRMU1I6IC8qIEdldCBsaW5lIHN0YXR1cyByZWdpc3RlciAqLworCQkJcmV0dXJuIGdldF9sc3JfaW5mbyhpbmZvLCAodW5zaWduZWQgaW50ICopIGFyZyk7CisKKwkJY2FzZSBUSU9DU0VSR1NUUlVDVDoKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBhc3luY19zdHJ1Y3QgKikgYXJnLAorCQkJCQkgaW5mbywgc2l6ZW9mKHN0cnVjdCBhc3luY19zdHJ1Y3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCisJCS8qCisJCSAqIFdhaXQgZm9yIGFueSBvZiB0aGUgNCBtb2RlbSBpbnB1dHMgKERDRCxSSSxEU1IsQ1RTKSB0byBjaGFuZ2UKKwkJICogLSBtYXNrIHBhc3NlZCBpbiBhcmcgZm9yIGxpbmVzIG9mIGludGVyZXN0CisgCQkgKiAgICh1c2UgfCdlZCBUSU9DTV9STkcvRFNSL0NEL0NUUyBmb3IgbWFza2luZykKKwkJICogQ2FsbGVyIHNob3VsZCB1c2UgVElPQ0dJQ09VTlQgdG8gc2VlIHdoaWNoIG9uZSBpdCB3YXMKKwkJICovCisJCWNhc2UgVElPQ01JV0FJVDoKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCS8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCisJCQljcHJldiA9IGluZm8tPnN0YXRlLT5pY291bnQ7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQl3aGlsZSAoMSkgeworCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKwkJCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCQljbm93ID0gaW5mby0+c3RhdGUtPmljb3VudDsgLyogYXRvbWljIGNvcHkgKi8KKwkJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQkJaWYgKGNub3cucm5nID09IGNwcmV2LnJuZyAmJiBjbm93LmRzciA9PSBjcHJldi5kc3IgJiYgCisJCQkJICAgIGNub3cuZGNkID09IGNwcmV2LmRjZCAmJiBjbm93LmN0cyA9PSBjcHJldi5jdHMpCisJCQkJCXJldHVybiAtRUlPOyAvKiBubyBjaGFuZ2UgPT4gZXJyb3IgKi8KKwkJCQlpZiAoICgoYXJnICYgVElPQ01fUk5HKSAmJiAoY25vdy5ybmcgIT0gY3ByZXYucm5nKSkgfHwKKwkJCQkgICAgICgoYXJnICYgVElPQ01fRFNSKSAmJiAoY25vdy5kc3IgIT0gY3ByZXYuZHNyKSkgfHwKKwkJCQkgICAgICgoYXJnICYgVElPQ01fQ0QpICAmJiAoY25vdy5kY2QgIT0gY3ByZXYuZGNkKSkgfHwKKwkJCQkgICAgICgoYXJnICYgVElPQ01fQ1RTKSAmJiAoY25vdy5jdHMgIT0gY3ByZXYuY3RzKSkgKSB7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQljcHJldiA9IGNub3c7CisJCQl9CisJCQkvKiBOT1RSRUFDSEVEICovCisKKwkJLyogCisJCSAqIEdldCBjb3VudGVyIG9mIGlucHV0IHNlcmlhbCBsaW5lIGludGVycnVwdHMgKERDRCxSSSxEU1IsQ1RTKQorCQkgKiBSZXR1cm46IHdyaXRlIGNvdW50ZXJzIHRvIHRoZSB1c2VyIHBhc3NlZCBjb3VudGVyIHN0cnVjdAorCQkgKiBOQjogYm90aCAxLT4wIGFuZCAwLT4xIHRyYW5zaXRpb25zIGFyZSBjb3VudGVkIGV4Y2VwdCBmb3IKKwkJICogICAgIFJJIHdoZXJlIG9ubHkgMC0+MSBpcyBjb3VudGVkLgorCQkgKi8KKwkJY2FzZSBUSU9DR0lDT1VOVDoKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCWNub3cgPSBpbmZvLT5zdGF0ZS0+aWNvdW50OworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJaWNvdW50LmN0cyA9IGNub3cuY3RzOworCQkJaWNvdW50LmRzciA9IGNub3cuZHNyOworCQkJaWNvdW50LnJuZyA9IGNub3cucm5nOworCQkJaWNvdW50LmRjZCA9IGNub3cuZGNkOworCQkJaWNvdW50LnJ4ID0gY25vdy5yeDsKKwkJCWljb3VudC50eCA9IGNub3cudHg7CisJCQlpY291bnQuZnJhbWUgPSBjbm93LmZyYW1lOworCQkJaWNvdW50Lm92ZXJydW4gPSBjbm93Lm92ZXJydW47CisJCQlpY291bnQucGFyaXR5ID0gY25vdy5wYXJpdHk7CisJCQlpY291bnQuYnJrID0gY25vdy5icms7CisJCQlpY291bnQuYnVmX292ZXJydW4gPSBjbm93LmJ1Zl9vdmVycnVuOworCisJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmaWNvdW50LCBzaXplb2YoaWNvdW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBUSU9DU0VSR1dJTEQ6CisJCWNhc2UgVElPQ1NFUlNXSUxEOgorCQkJLyogInNldHNlcmlhbCAtVyIgaXMgY2FsbGVkIGluIERlYmlhbiBib290ICovCisJCQlwcmludGsgKCJUSU9DU0VSP1dJTEQgaW9jdGwgb2Jzb2xldGUsIGlnbm9yZWQuXG4iKTsKKwkJCXJldHVybiAwOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJzX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJaWYgKCAgIChjZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKKwkgICAgJiYgKCAgIFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgCisJCT09IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpCisJICByZXR1cm47CisKKwljaGFuZ2Vfc3BlZWQoaW5mbywgb2xkX3Rlcm1pb3MpOworCisJLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJgorCSAgICAhKGNmbGFnICYgQ0JBVUQpKSB7CisJCWluZm8tPk1DUiAmPSB+KFNFUl9EVFJ8U0VSX1JUUyk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJcnRzZHRyX2N0cmwoaW5mby0+TUNSKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKworCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGF3YXkgZnJvbSBCMCBzdGF0dXMgKi8KKwlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJgorCSAgICAoY2ZsYWcgJiBDQkFVRCkpIHsKKwkJaW5mby0+TUNSIHw9IFNFUl9EVFI7CisJCWlmICghKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHx8IAorCQkgICAgIXRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSkgeworCQkJaW5mby0+TUNSIHw9IFNFUl9SVFM7CisJCX0KKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlydHNkdHJfY3RybChpbmZvLT5NQ1IpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCisJLyogSGFuZGxlIHR1cm5pbmcgb2ZmIENSVFNDVFMgKi8KKwlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKKwkgICAgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQlyc19zdGFydCh0dHkpOworCX0KKworI2lmIDAKKwkvKgorCSAqIE5vIG5lZWQgdG8gd2FrZSB1cCBwcm9jZXNzZXMgaW4gb3BlbiB3YWl0LCBzaW5jZSB0aGV5CisJICogc2FtcGxlIHRoZSBDTE9DQUwgZmxhZyBvbmNlLCBhbmQgZG9uJ3QgcmVjaGVjayBpdC4KKwkgKiBYWFggIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgdGhlIGN1cnJlbnQgYmVoYXZpb3IgaXMgY29ycmVjdAorCSAqIG9yIG5vdC4gIEhlbmNlLCB0aGlzIG1heSBjaGFuZ2UuLi4uLgorCSAqLworCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAmJgorCSAgICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworI2VuZGlmCit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJzX2Nsb3NlKCkKKyAqIAorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBzZXJpYWwgcG9ydCBnZXRzIGNsb3NlZC4gIEZpcnN0LCB3ZQorICogd2FpdCBmb3IgdGhlIGxhc3QgcmVtYWluaW5nIGRhdGEgdG8gYmUgc2VudC4gIFRoZW4sIHdlIHVubGluayBpdHMKKyAqIGFzeW5jIHN0cnVjdHVyZSBmcm9tIHRoZSBpbnRlcnJ1cHQgY2hhaW4gaWYgbmVjZXNzYXJ5LCBhbmQgd2UgZnJlZQorICogdGhhdCBJUlEgaWYgbm90aGluZyBpcyBsZWZ0IGluIHRoZSBjaGFpbi4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCByc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaW5mbyB8fCBzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfY2xvc2UiKSkKKwkJcmV0dXJuOworCisJc3RhdGUgPSBpbmZvLT5zdGF0ZTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCURCR19DTlQoImJlZm9yZSBERUMtaHVuZyIpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygicnNfY2xvc2UgdHR5cyVkLCBjb3VudCA9ICVkXG4iLCBpbmZvLT5saW5lLCBzdGF0ZS0+Y291bnQpOworI2VuZGlmCisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChzdGF0ZS0+Y291bnQgIT0gMSkpIHsKKwkJLyoKKwkJICogVWgsIG9oLiAgdHR5LT5jb3VudCBpcyAxLCB3aGljaCBtZWFucyB0aGF0IHRoZSB0dHkKKwkJICogc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuICBzdGF0ZS0+Y291bnQgc2hvdWxkIGFsd2F5cworCQkgKiBiZSBvbmUgaW4gdGhlc2UgY29uZGl0aW9ucy4gIElmIGl0J3MgZ3JlYXRlciB0aGFuCisJCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQorCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KKwkJICovCisJCXByaW50aygicnNfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCisJCSAgICAgICAic3RhdGUtPmNvdW50IGlzICVkXG4iLCBzdGF0ZS0+Y291bnQpOworCQlzdGF0ZS0+Y291bnQgPSAxOworCX0KKwlpZiAoLS1zdGF0ZS0+Y291bnQgPCAwKSB7CisJCXByaW50aygicnNfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudCBmb3IgdHR5cyVkOiAlZFxuIiwKKwkJICAgICAgIGluZm8tPmxpbmUsIHN0YXRlLT5jb3VudCk7CisJCXN0YXRlLT5jb3VudCA9IDA7CisJfQorCWlmIChzdGF0ZS0+Y291bnQpIHsKKwkJREJHX0NOVCgiYmVmb3JlIERFQy0yIik7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19DTE9TSU5HOworCS8qCisJICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkgCisJICogdGhlIGxpbmUgZGlzY2lwbGluZSB0byBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycy4KKwkgKi8KKwl0dHktPmNsb3NpbmcgPSAxOworCWlmIChpbmZvLT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT5jbG9zaW5nX3dhaXQpOworCS8qCisJICogQXQgdGhpcyBwb2ludCB3ZSBzdG9wIGFjY2VwdGluZyBpbnB1dC4gIFRvIGRvIHRoaXMsIHdlCisJICogZGlzYWJsZSB0aGUgcmVjZWl2ZSBsaW5lIHN0YXR1cyBpbnRlcnJ1cHRzLCBhbmQgdGVsbCB0aGUKKwkgKiBpbnRlcnJ1cHQgZHJpdmVyIHRvIHN0b3AgY2hlY2tpbmcgdGhlIGRhdGEgcmVhZHkgYml0IGluIHRoZQorCSAqIGxpbmUgc3RhdHVzIHJlZ2lzdGVyLgorCSAqLworCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgJj0gflVBUlRfTFNSX0RSOworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJICAgICAgICAvKiBkaXNhYmxlIHJlY2VpdmUgaW50ZXJydXB0cyAqLworCSAgICAgICAgY3VzdG9tLmludGVuYSA9IElGX1JCRjsKKwkJbWIoKTsKKwkJLyogY2xlYXIgYW55IHBlbmRpbmcgcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKwkJY3VzdG9tLmludHJlcSA9IElGX1JCRjsKKwkJbWIoKTsKKworCQkvKgorCQkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgorCQkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkOyB0aGlzIGlzIGVzcGVjaWFsbHkKKwkJICogaW1wb3J0YW50IGlmIHRoZXJlIGlzIGEgdHJhbnNtaXQgRklGTyEKKwkJICovCisJCXJzX3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPnRpbWVvdXQpOworCX0KKwlzaHV0ZG93bihpbmZvKTsKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCQkKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKwl0dHktPmNsb3NpbmcgPSAwOworCWluZm8tPmV2ZW50ID0gMDsKKwlpbmZvLT50dHkgPSBOVUxMOworCWlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKGluZm8tPmNsb3NlX2RlbGF5KSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCX0KKwlpbmZvLT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5jbG9zZV93YWl0KTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCisgKiByc193YWl0X3VudGlsX3NlbnQoKSAtLS0gd2FpdCB1bnRpbCB0aGUgdHJhbnNtaXR0ZXIgaXMgZW1wdHkKKyAqLworc3RhdGljIHZvaWQgcnNfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgb3JpZ19qaWZmaWVzLCBjaGFyX3RpbWU7CisJaW50IGxzcjsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfd2FpdF91bnRpbF9zZW50IikpCisJCXJldHVybjsKKworCWlmIChpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9PSAwKQorCQlyZXR1cm47IC8qIEp1c3QgaW4gY2FzZS4uLi4gKi8KKworCW9yaWdfamlmZmllcyA9IGppZmZpZXM7CisJLyoKKwkgKiBTZXQgdGhlIGNoZWNrIGludGVydmFsIHRvIGJlIDEvNSBvZiB0aGUgZXN0aW1hdGVkIHRpbWUgdG8KKwkgKiBzZW5kIGEgc2luZ2xlIGNoYXJhY3RlciwgYW5kIG1ha2UgaXQgYXQgbGVhc3QgMS4gIFRoZSBjaGVjaworCSAqIGludGVydmFsIHNob3VsZCBhbHNvIGJlIGxlc3MgdGhhbiB0aGUgdGltZW91dC4KKwkgKiAKKwkgKiBOb3RlOiB3ZSBoYXZlIHRvIHVzZSBwcmV0dHkgdGlnaHQgdGltaW5ncyBoZXJlIHRvIHNhdGlzZnkKKwkgKiB0aGUgTklTVC1QQ1RTLgorCSAqLworCWNoYXJfdGltZSA9IChpbmZvLT50aW1lb3V0IC0gSFovNTApIC8gaW5mby0+eG1pdF9maWZvX3NpemU7CisJY2hhcl90aW1lID0gY2hhcl90aW1lIC8gNTsKKwlpZiAoY2hhcl90aW1lID09IDApCisJCWNoYXJfdGltZSA9IDE7CisJaWYgKHRpbWVvdXQpCisJICBjaGFyX3RpbWUgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBjaGFyX3RpbWUsIHRpbWVvdXQpOworCS8qCisJICogSWYgdGhlIHRyYW5zbWl0dGVyIGhhc24ndCBjbGVhcmVkIGluIHR3aWNlIHRoZSBhcHByb3hpbWF0ZQorCSAqIGFtb3VudCBvZiB0aW1lIHRvIHNlbmQgdGhlIGVudGlyZSBGSUZPLCBpdCBwcm9iYWJseSB3b24ndAorCSAqIGV2ZXIgY2xlYXIuICBUaGlzIGFzc3VtZXMgdGhlIFVBUlQgaXNuJ3QgZG9pbmcgZmxvdworCSAqIGNvbnRyb2wsIHdoaWNoIGlzIGN1cnJlbnRseSB0aGUgY2FzZS4gIEhlbmNlLCBpZiBpdCBldmVyCisJICogdGFrZXMgbG9uZ2VyIHRoYW4gaW5mby0+dGltZW91dCwgdGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gYQorCSAqIFVBUlQgYnVnIG9mIHNvbWUga2luZC4gIFNvLCB3ZSBjbGFtcCB0aGUgdGltZW91dCBwYXJhbWV0ZXIgYXQKKwkgKiAyKmluZm8tPnRpbWVvdXQuCisJICovCisJaWYgKCF0aW1lb3V0IHx8IHRpbWVvdXQgPiAyKmluZm8tPnRpbWVvdXQpCisJCXRpbWVvdXQgPSAyKmluZm8tPnRpbWVvdXQ7CisjaWZkZWYgU0VSSUFMX0RFQlVHX1JTX1dBSVRfVU5USUxfU0VOVAorCXByaW50aygiSW4gcnNfd2FpdF91bnRpbF9zZW50KCVkKSBjaGVjaz0lbHUuLi4iLCB0aW1lb3V0LCBjaGFyX3RpbWUpOworCXByaW50aygiamlmZj0lbHUuLi4iLCBqaWZmaWVzKTsKKyNlbmRpZgorCXdoaWxlKCEoKGxzciA9IGN1c3RvbS5zZXJkYXRyKSAmIFNEUl9UU1JFKSkgeworI2lmZGVmIFNFUklBTF9ERUJVR19SU19XQUlUX1VOVElMX1NFTlQKKwkJcHJpbnRrKCJzZXJkYXRyID0gJWQgKGppZmY9JWx1KS4uLiIsIGxzciwgamlmZmllcyk7CisjZW5kaWYKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGFyX3RpbWUpKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpCisJCQlicmVhazsKKwl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisjaWZkZWYgU0VSSUFMX0RFQlVHX1JTX1dBSVRfVU5USUxfU0VOVAorCXByaW50aygibHNyID0gJWQgKGppZmY9JWx1KS4uLmRvbmVcbiIsIGxzciwgamlmZmllcyk7CisjZW5kaWYKK30KKworLyoKKyAqIHJzX2hhbmd1cCgpIC0tLSBjYWxsZWQgYnkgdHR5X2hhbmd1cCgpIHdoZW4gYSBoYW5ndXAgaXMgc2lnbmFsZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJzX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBzZXJpYWxfc3RhdGUgKnN0YXRlID0gaW5mby0+c3RhdGU7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2hhbmd1cCIpKQorCQlyZXR1cm47CisKKwlzdGF0ZSA9IGluZm8tPnN0YXRlOworCisJcnNfZmx1c2hfYnVmZmVyKHR0eSk7CisJc2h1dGRvd24oaW5mbyk7CisJaW5mby0+ZXZlbnQgPSAwOworCXN0YXRlLT5jb3VudCA9IDA7CisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJaW5mby0+dHR5ID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJzX29wZW4oKSBhbmQgZnJpZW5kcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCwKKwkJCSAgIHN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8pCit7CisjaWZkZWYgREVDTEFSRV9XQUlUUVVFVUUKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKyNlbHNlCisJc3RydWN0IHdhaXRfcXVldWUgd2FpdCA9IHsgY3VycmVudCwgTlVMTCB9OworI2VuZGlmCisJc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGUgPSBpbmZvLT5zdGF0ZTsKKwlpbnQJCXJldHZhbDsKKwlpbnQJCWRvX2Nsb2NhbCA9IDAsIGV4dHJhX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCisJICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCisJICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkgICAgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykpIHsKKwkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOworI2lmZGVmIFNFUklBTF9ET19SRVNUQVJUCisJCXJldHVybiAoKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPworCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisjZWxzZQorCQlyZXR1cm4gLUVBR0FJTjsKKyNlbmRpZgorCX0KKworCS8qCisJICogSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCBvciB0aGUgcG9ydCBpcyBub3QgZW5hYmxlZCwKKwkgKiB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250IGFuZCB0aGVuIGV4aXQuCisJICovCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwKKwkgICAgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgeworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQlkb19jbG9jYWwgPSAxOworCisJLyoKKwkgKiBCbG9jayB3YWl0aW5nIGZvciB0aGUgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZQorCSAqIGZyZWUgKGkuZS4sIG5vdCBpbiB1c2UgYnkgdGhlIGNhbGxvdXQpLiAgV2hpbGUgd2UgYXJlIGluCisJICogdGhpcyBsb29wLCBzdGF0ZS0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKwkgKiByc19jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisJcHJpbnRrKCJibG9ja190aWxfcmVhZHkgYmVmb3JlIGJsb2NrOiB0dHlzJWQsIGNvdW50ID0gJWRcbiIsCisJICAgICAgIHN0YXRlLT5saW5lLCBzdGF0ZS0+Y291bnQpOworI2VuZGlmCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlleHRyYV9jb3VudCA9IDE7CisJCXN0YXRlLT5jb3VudC0tOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJaW5mby0+YmxvY2tlZF9vcGVuKys7CisJd2hpbGUgKDEpIHsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpCisJCSAgICAgICAgcnRzZHRyX2N0cmwoU0VSX0RUUnxTRVJfUlRTKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fAorCQkgICAgIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgeworI2lmZGVmIFNFUklBTF9ET19SRVNUQVJUCisJCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQllbHNlCisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworI2Vsc2UKKwkJCXJldHZhbCA9IC1FQUdBSU47CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKKwkJICAgIChkb19jbG9jYWwgfHwgKCEoY2lhYi5wcmEgJiBTRVJfRENEKSkgKSkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwkJcHJpbnRrKCJibG9ja190aWxfcmVhZHkgYmxvY2tpbmc6IHR0eXMlZCwgY291bnQgPSAlZFxuIiwKKwkJICAgICAgIGluZm8tPmxpbmUsIHN0YXRlLT5jb3VudCk7CisjZW5kaWYKKwkJc2NoZWR1bGUoKTsKKwl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworCWlmIChleHRyYV9jb3VudCkKKwkJc3RhdGUtPmNvdW50Kys7CisJaW5mby0+YmxvY2tlZF9vcGVuLS07CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoImJsb2NrX3RpbF9yZWFkeSBhZnRlciBibG9ja2luZzogdHR5cyVkLCBjb3VudCA9ICVkXG4iLAorCSAgICAgICBpbmZvLT5saW5lLCBzdGF0ZS0+Y291bnQpOworI2VuZGlmCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9hc3luY19zdHJ1Y3QoaW50IGxpbmUsIHN0cnVjdCBhc3luY19zdHJ1Y3QgKipyZXRfaW5mbykKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvOworCXN0cnVjdCBzZXJpYWxfc3RhdGUgKnNzdGF0ZTsKKworCXNzdGF0ZSA9IHJzX3RhYmxlICsgbGluZTsKKwlzc3RhdGUtPmNvdW50Kys7CisJaWYgKHNzdGF0ZS0+aW5mbykgeworCQkqcmV0X2luZm8gPSBzc3RhdGUtPmluZm87CisJCXJldHVybiAwOworCX0KKwlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFzeW5jX3N0cnVjdCksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykgeworCQlzc3RhdGUtPmNvdW50LS07CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhc3luY19zdHJ1Y3QpKTsKKyNpZmRlZiBERUNMQVJFX1dBSVRRVUVVRQorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworI2VuZGlmCisJaW5mby0+bWFnaWMgPSBTRVJJQUxfTUFHSUM7CisJaW5mby0+cG9ydCA9IHNzdGF0ZS0+cG9ydDsKKwlpbmZvLT5mbGFncyA9IHNzdGF0ZS0+ZmxhZ3M7CisJaW5mby0+eG1pdF9maWZvX3NpemUgPSBzc3RhdGUtPnhtaXRfZmlmb19zaXplOworCWluZm8tPmxpbmUgPSBsaW5lOworCXRhc2tsZXRfaW5pdCgmaW5mby0+dGxldCwgZG9fc29mdGludCwgKHVuc2lnbmVkIGxvbmcpaW5mbyk7CisJaW5mby0+c3RhdGUgPSBzc3RhdGU7CisJaWYgKHNzdGF0ZS0+aW5mbykgeworCQlrZnJlZShpbmZvKTsKKwkJKnJldF9pbmZvID0gc3N0YXRlLT5pbmZvOworCQlyZXR1cm4gMDsKKwl9CisJKnJldF9pbmZvID0gc3N0YXRlLT5pbmZvID0gaW5mbzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBzZXJpYWwgcG9ydCBpcyBvcGVuZWQuICBJdAorICogZW5hYmxlcyBpbnRlcnJ1cHRzIGZvciBhIHNlcmlhbCBwb3J0LCBsaW5raW5nIGluIGl0cyBhc3luYyBzdHJ1Y3R1cmUgaW50bworICogdGhlIElSUSBjaGFpbi4gICBJdCBhbHNvIHBlcmZvcm1zIHRoZSBzZXJpYWwtc3BlY2lmaWMKKyAqIGluaXRpYWxpemF0aW9uIGZvciB0aGUgdHR5IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGludCByc19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgYXN5bmNfc3RydWN0CSppbmZvOworCWludCAJCQlyZXR2YWwsIGxpbmU7CisJdW5zaWduZWQgbG9uZwkJcGFnZTsKKworCWxpbmUgPSB0dHktPmluZGV4OworCWlmICgobGluZSA8IDApIHx8IChsaW5lID49IE5SX1BPUlRTKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dmFsID0gZ2V0X2FzeW5jX3N0cnVjdChsaW5lLCAmaW5mbyk7CisJaWYgKHJldHZhbCkgeworCQlyZXR1cm4gcmV0dmFsOworCX0KKwl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKKwlpbmZvLT50dHkgPSB0dHk7CisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19vcGVuIikpCisJCXJldHVybiAtRU5PREVWOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoInJzX29wZW4gJXMsIGNvdW50ID0gJWRcbiIsIHR0eS0+bmFtZSwgaW5mby0+c3RhdGUtPmNvdW50KTsKKyNlbmRpZgorCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKworCWlmICghdG1wX2J1ZikgeworCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIXBhZ2UpIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWlmICh0bXBfYnVmKQorCQkJZnJlZV9wYWdlKHBhZ2UpOworCQllbHNlCisJCQl0bXBfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBwb3J0IGlzIHRoZSBtaWRkbGUgb2YgY2xvc2luZywgYmFpbCBvdXQgbm93CisJICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkgICAgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykpIHsKKwkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOworI2lmZGVmIFNFUklBTF9ET19SRVNUQVJUCisJCXJldHVybiAoKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPworCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisjZWxzZQorCQlyZXR1cm4gLUVBR0FJTjsKKyNlbmRpZgorCX0KKworCS8qCisJICogU3RhcnQgdXAgc2VyaWFsIHBvcnQKKwkgKi8KKwlyZXR2YWwgPSBzdGFydHVwKGluZm8pOworCWlmIChyZXR2YWwpIHsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR2YWwgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBpbmZvKTsKKwlpZiAocmV0dmFsKSB7CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwkJcHJpbnRrKCJyc19vcGVuIHJldHVybmluZyBhZnRlciBibG9ja190aWxfcmVhZHkgd2l0aCAlZFxuIiwKKwkJICAgICAgIHJldHZhbCk7CisjZW5kaWYKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygicnNfb3BlbiAlcyBzdWNjZXNzZnVsLi4uIiwgdHR5LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogL3Byb2MgZnMgcm91dGluZXMuLi4uCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgbGluZV9pbmZvKGNoYXIgKmJ1Ziwgc3RydWN0IHNlcmlhbF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbyA9IHN0YXRlLT5pbmZvLCBzY3JfaW5mbzsKKwljaGFyCXN0YXRfYnVmWzMwXSwgY29udHJvbCwgc3RhdHVzOworCWludAlyZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJldCA9IHNwcmludGYoYnVmLCAiJWQ6IHVhcnQ6YW1pZ2FfYnVpbHRpbiIsc3RhdGUtPmxpbmUpOworCisJLyoKKwkgKiBGaWd1cmUgb3V0IHRoZSBjdXJyZW50IFJTLTIzMiBsaW5lcworCSAqLworCWlmICghaW5mbykgeworCQlpbmZvID0gJnNjcl9pbmZvOwkvKiBUaGlzIGlzIGp1c3QgZm9yIHNlcmlhbF97aW4sb3V0fSAqLworCisJCWluZm8tPm1hZ2ljID0gU0VSSUFMX01BR0lDOworCQlpbmZvLT5mbGFncyA9IHN0YXRlLT5mbGFnczsKKwkJaW5mby0+cXVvdCA9IDA7CisJCWluZm8tPnR0eSA9IE5VTEw7CisJfQorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzdGF0dXMgPSBjaWFiLnByYTsKKwljb250cm9sID0gaW5mbyA/IGluZm8tPk1DUiA6IHN0YXR1czsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlzdGF0X2J1ZlswXSA9IDA7CisJc3RhdF9idWZbMV0gPSAwOworCWlmKCEoY29udHJvbCAmIFNFUl9SVFMpKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8UlRTIik7CisJaWYoIShzdGF0dXMgJiBTRVJfQ1RTKSkKKwkJc3RyY2F0KHN0YXRfYnVmLCAifENUUyIpOworCWlmKCEoY29udHJvbCAmIFNFUl9EVFIpKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8RFRSIik7CisJaWYoIShzdGF0dXMgJiBTRVJfRFNSKSkKKwkJc3RyY2F0KHN0YXRfYnVmLCAifERTUiIpOworCWlmKCEoc3RhdHVzICYgU0VSX0RDRCkpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxDRCIpOworCisJaWYgKGluZm8tPnF1b3QpIHsKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBiYXVkOiVkIiwKKwkJCSAgICAgICBzdGF0ZS0+YmF1ZF9iYXNlIC8gaW5mby0+cXVvdCk7CisJfQorCisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiB0eDolZCByeDolZCIsCisJCSAgICAgIHN0YXRlLT5pY291bnQudHgsIHN0YXRlLT5pY291bnQucngpOworCisJaWYgKHN0YXRlLT5pY291bnQuZnJhbWUpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgZmU6JWQiLCBzdGF0ZS0+aWNvdW50LmZyYW1lKTsKKworCWlmIChzdGF0ZS0+aWNvdW50LnBhcml0eSkKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBwZTolZCIsIHN0YXRlLT5pY291bnQucGFyaXR5KTsKKworCWlmIChzdGF0ZS0+aWNvdW50LmJyaykKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBicms6JWQiLCBzdGF0ZS0+aWNvdW50LmJyayk7CisKKwlpZiAoc3RhdGUtPmljb3VudC5vdmVycnVuKQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIG9lOiVkIiwgc3RhdGUtPmljb3VudC5vdmVycnVuKTsKKworCS8qCisJICogTGFzdCB0aGluZyBpcyB0aGUgUlMtMjMyIHN0YXR1cyBsaW5lcworCSAqLworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgJXNcbiIsIHN0YXRfYnVmKzEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCisJCQlpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMCwgbDsKKwlvZmZfdAliZWdpbiA9IDA7CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlLCAic2VyaW5mbzoxLjAgZHJpdmVyOiVzXG4iLCBzZXJpYWxfdmVyc2lvbik7CisJbCA9IGxpbmVfaW5mbyhwYWdlICsgbGVuLCAmcnNfdGFibGVbMF0pOworCWxlbiArPSBsOworCWlmIChsZW4rYmVnaW4gPiBvZmYrY291bnQpCisJICBnb3RvIGRvbmU7CisJaWYgKGxlbitiZWdpbiA8IG9mZikgeworCSAgYmVnaW4gKz0gbGVuOworCSAgbGVuID0gMDsKKwl9CisJKmVvZiA9IDE7Citkb25lOgorCWlmIChvZmYgPj0gbGVuK2JlZ2luKQorCQlyZXR1cm4gMDsKKwkqc3RhcnQgPSBwYWdlICsgKG9mZi1iZWdpbik7CisJcmV0dXJuICgoY291bnQgPCBiZWdpbitsZW4tb2ZmKSA/IGNvdW50IDogYmVnaW4rbGVuLW9mZik7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJzX2luaXQoKSBhbmQgZnJpZW5kcworICoKKyAqIHJzX2luaXQoKSBpcyBjYWxsZWQgYXQgYm9vdC10aW1lIHRvIGluaXRpYWxpemUgdGhlIHNlcmlhbCBkcml2ZXIuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogVGhpcyByb3V0aW5lIHByaW50cyBvdXQgdGhlIGFwcHJvcHJpYXRlIHNlcmlhbCBkcml2ZXIgdmVyc2lvbgorICogbnVtYmVyLCBhbmQgaWRlbnRpZmllcyB3aGljaCBvcHRpb25zIHdlcmUgY29uZmlndXJlZCBpbnRvIHRoaXMKKyAqIGRyaXZlci4KKyAqLworc3RhdGljIF9JTkxJTkVfIHZvaWQgc2hvd19zZXJpYWxfdmVyc2lvbih2b2lkKQoreworIAlwcmludGsoS0VSTl9JTkZPICIlcyB2ZXJzaW9uICVzXG4iLCBzZXJpYWxfbmFtZSwgc2VyaWFsX3ZlcnNpb24pOworfQorCisKK2ludCByZWdpc3Rlcl9zZXJpYWwoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnJlcSk7Cit2b2lkIHVucmVnaXN0ZXJfc2VyaWFsKGludCBsaW5lKTsKKworCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHNlcmlhbF9vcHMgPSB7CisJLm9wZW4gPSByc19vcGVuLAorCS5jbG9zZSA9IHJzX2Nsb3NlLAorCS53cml0ZSA9IHJzX3dyaXRlLAorCS5wdXRfY2hhciA9IHJzX3B1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IHJzX2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gcnNfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gcnNfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSByc19mbHVzaF9idWZmZXIsCisJLmlvY3RsID0gcnNfaW9jdGwsCisJLnRocm90dGxlID0gcnNfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSByc191bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IHJzX3NldF90ZXJtaW9zLAorCS5zdG9wID0gcnNfc3RvcCwKKwkuc3RhcnQgPSByc19zdGFydCwKKwkuaGFuZ3VwID0gcnNfaGFuZ3VwLAorCS5icmVha19jdGwgPSByc19icmVhaywKKwkuc2VuZF94Y2hhciA9IHJzX3NlbmRfeGNoYXIsCisJLndhaXRfdW50aWxfc2VudCA9IHJzX3dhaXRfdW50aWxfc2VudCwKKwkucmVhZF9wcm9jID0gcnNfcmVhZF9wcm9jLAorCS50aW9jbWdldCA9IHJzX3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9IHJzX3Rpb2Ntc2V0LAorfTsKKworLyoKKyAqIFRoZSBzZXJpYWwgZHJpdmVyIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBjb2RlIQorICovCitzdGF0aWMgaW50IF9faW5pdCByc19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2VyaWFsX3N0YXRlICogc3RhdGU7CisKKwlpZiAoIU1BQ0hfSVNfQU1JR0EgfHwgIUFNSUdBSFdfUFJFU0VOVChBTUlfU0VSSUFMKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzZXJpYWxfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcigxKTsKKwlpZiAoIXNlcmlhbF9kcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiAgV2UgcmVxdWVzdCBTRVJEQVQgYW5kIFNFUlBFUiBvbmx5LCBiZWNhdXNlIHRoZSBzZXJpYWwgcmVnaXN0ZXJzIGFyZQorCSAqICB0b28gc3ByZWFkZWQgb3ZlciB0aGUgY3VzdG9tIHJlZ2lzdGVyIHNwYWNlCisJICovCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oQ1VTVE9NX1BIWVNBRERSKzB4MzAsIDQsICJhbWlzZXJpYWwgW1BhdWxhXSIpKQorCQlyZXR1cm4gLUVCVVNZOworCisJSVJRX3BvcnRzID0gTlVMTDsKKworCXNob3dfc2VyaWFsX3ZlcnNpb24oKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCisKKwlzZXJpYWxfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXNlcmlhbF9kcml2ZXItPmRyaXZlcl9uYW1lID0gImFtaXNlcmlhbCI7CisJc2VyaWFsX2RyaXZlci0+bmFtZSA9ICJ0dHlTIjsKKwlzZXJpYWxfZHJpdmVyLT5tYWpvciA9IFRUWV9NQUpPUjsKKwlzZXJpYWxfZHJpdmVyLT5taW5vcl9zdGFydCA9IDY0OworCXNlcmlhbF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXNlcmlhbF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXNlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkJQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCXNlcmlhbF9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoc2VyaWFsX2RyaXZlciwgJnNlcmlhbF9vcHMpOworCisJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcikpCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBzZXJpYWwgZHJpdmVyXG4iKTsKKworCXN0YXRlID0gcnNfdGFibGU7CisJc3RhdGUtPm1hZ2ljID0gU1NUQVRFX01BR0lDOworCXN0YXRlLT5wb3J0ID0gKGludCkmY3VzdG9tLnNlcmRhdHI7IC8qIEp1c3QgdG8gZ2l2ZSBpdCBhIHZhbHVlICovCisJc3RhdGUtPmxpbmUgPSAwOworCXN0YXRlLT5jdXN0b21fZGl2aXNvciA9IDA7CisJc3RhdGUtPmNsb3NlX2RlbGF5ID0gNSpIWi8xMDsKKwlzdGF0ZS0+Y2xvc2luZ193YWl0ID0gMzAqSFo7CisJc3RhdGUtPmljb3VudC5jdHMgPSBzdGF0ZS0+aWNvdW50LmRzciA9IAorCSAgc3RhdGUtPmljb3VudC5ybmcgPSBzdGF0ZS0+aWNvdW50LmRjZCA9IDA7CisJc3RhdGUtPmljb3VudC5yeCA9IHN0YXRlLT5pY291bnQudHggPSAwOworCXN0YXRlLT5pY291bnQuZnJhbWUgPSBzdGF0ZS0+aWNvdW50LnBhcml0eSA9IDA7CisJc3RhdGUtPmljb3VudC5vdmVycnVuID0gc3RhdGUtPmljb3VudC5icmsgPSAwOworCS8qCisJaWYoc3RhdGUtPnBvcnQgJiYgY2hlY2tfcmVnaW9uKHN0YXRlLT5wb3J0LFJFR0lPTl9MRU5HVEgoc3RhdGUpKSkKKwkgIGNvbnRpbnVlOworCSovCisKKwlwcmludGsoS0VSTl9JTkZPICJ0dHlTJWQgaXMgdGhlIGFtaWdhIGJ1aWx0aW4gc2VyaWFsIHBvcnRcbiIsCisJCSAgICAgICBzdGF0ZS0+bGluZSk7CisKKwkvKiBIYXJkd2FyZSBzZXQgdXAgKi8KKworCXN0YXRlLT5iYXVkX2Jhc2UgPSBhbWlnYV9jb2xvcmNsb2NrOworCXN0YXRlLT54bWl0X2ZpZm9fc2l6ZSA9IDE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBzZXQgSVNScywgYW5kIHRoZW4gZGlzYWJsZSB0aGUgcnggaW50ZXJydXB0cyAqLworCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9UQkUsIHNlcl90eF9pbnQsIDAsICJzZXJpYWwgVFgiLCBzdGF0ZSk7CisJcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1JCRiwgc2VyX3J4X2ludCwgU0FfSU5URVJSVVBULCAic2VyaWFsIFJYIiwgc3RhdGUpOworCisJLyogdHVybiBvZmYgUnggYW5kIFR4IGludGVycnVwdHMgKi8KKwljdXN0b20uaW50ZW5hID0gSUZfUkJGIHwgSUZfVEJFOworCW1iKCk7CisKKwkvKiBjbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKwljdXN0b20uaW50cmVxID0gSUZfUkJGIHwgSUZfVEJFOworCW1iKCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkvKgorCSAqIHNldCB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0aW9ucyBmb3IgdGhlIG1vZGVtIGNvbnRyb2wgZmxhZ3MsCisJICogYW5kIGNsZWFyIFJUUyBhbmQgRFRSCisJICovCisJY2lhYi5kZHJhIHw9IChTRVJfRFRSIHwgU0VSX1JUUyk7ICAgLyogb3V0cHV0cyAqLworCWNpYWIuZGRyYSAmPSB+KFNFUl9EQ0QgfCBTRVJfQ1RTIHwgU0VSX0RTUik7ICAvKiBpbnB1dHMgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgcnNfZXhpdCh2b2lkKSAKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbyA9IHJzX3RhYmxlWzBdLmluZm87CisKKwkvKiBwcmludGsoIlVubG9hZGluZyAlczogdmVyc2lvbiAlc1xuIiwgc2VyaWFsX25hbWUsIHNlcmlhbF92ZXJzaW9uKTsgKi8KKwl0YXNrbGV0X2tpbGwoJmluZm8tPnRsZXQpOworCWlmICgoZXJyb3IgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcikpKQorCQlwcmludGsoIlNFUklBTDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgc2VyaWFsIGRyaXZlciAoJWQpXG4iLAorCQkgICAgICAgZXJyb3IpOworCXB1dF90dHlfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOworCisJaWYgKGluZm8pIHsKKwkgIHJzX3RhYmxlWzBdLmluZm8gPSBOVUxMOworCSAga2ZyZWUoaW5mbyk7CisJfQorCisJaWYgKHRtcF9idWYpIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSB0bXBfYnVmKTsKKwkJdG1wX2J1ZiA9IE5VTEw7CisJfQorCisJcmVsZWFzZV9tZW1fcmVnaW9uKENVU1RPTV9QSFlTQUREUisweDMwLCA0KTsKK30KKworbW9kdWxlX2luaXQocnNfaW5pdCkKK21vZHVsZV9leGl0KHJzX2V4aXQpCisKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2VyaWFsIGNvbnNvbGUgZHJpdmVyCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmZGVmIENPTkZJR19TRVJJQUxfQ09OU09MRQorCitzdGF0aWMgdm9pZCBhbWlnYV9zZXJpYWxfcHV0YyhjaGFyIGMpCit7CisJY3VzdG9tLnNlcmRhdCA9ICh1bnNpZ25lZCBjaGFyKWMgfCAweDEwMDsKKwl3aGlsZSAoIShjdXN0b20uc2VyZGF0ciAmIDB4MjAwMCkpCisJCWJhcnJpZXIoKTsKK30KKworLyoKKyAqCVByaW50IGEgc3RyaW5nIHRvIHRoZSBzZXJpYWwgcG9ydCB0cnlpbmcgbm90IHRvIGRpc3R1cmIKKyAqCWFueSBwb3NzaWJsZSByZWFsIHVzZSBvZiB0aGUgcG9ydC4uLgorICoKKyAqCVRoZSBjb25zb2xlIG11c3QgYmUgbG9ja2VkIHdoZW4gd2UgZ2V0IGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkIHNlcmlhbF9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywKKwkJCQl1bnNpZ25lZCBjb3VudCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBpbnRlbmEgPSBjdXN0b20uaW50ZW5hcjsKKworCWN1c3RvbS5pbnRlbmEgPSBJRl9UQkU7CisKKwl3aGlsZSAoY291bnQtLSkgeworCQlpZiAoKnMgPT0gJ1xuJykKKwkJCWFtaWdhX3NlcmlhbF9wdXRjKCdccicpOworCQlhbWlnYV9zZXJpYWxfcHV0YygqcysrKTsKKwl9CisKKwljdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgKGludGVuYSAmIElGX1RCRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2NvbnNvbGVfZGV2aWNlKHN0cnVjdCBjb25zb2xlICpjLCBpbnQgKmluZGV4KQoreworCSppbmRleCA9IDA7CisJcmV0dXJuIHNlcmlhbF9kcml2ZXI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSBzZXJjb25zID0geworCS5uYW1lID0JCSJ0dHlTIiwKKwkud3JpdGUgPQlzZXJpYWxfY29uc29sZV93cml0ZSwKKwkuZGV2aWNlID0Jc2VyaWFsX2NvbnNvbGVfZGV2aWNlLAorCS5mbGFncyA9CUNPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXggPQktMSwKK307CisKKy8qCisgKglSZWdpc3RlciBjb25zb2xlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhbWlzZXJpYWxfY29uc29sZV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfY29uc29sZSgmc2VyY29ucyk7CisJcmV0dXJuIDA7Cit9Citjb25zb2xlX2luaXRjYWxsKGFtaXNlcmlhbF9jb25zb2xlX2luaXQpOworI2VuZGlmCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jIGIvZHJpdmVycy9jaGFyL2FwcGxpY29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmMmUyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jCkBAIC0wLDAgKzEsODYyIEBACisvKiBEZXJpdmVkIGZyb20gQXBwbGljb20gZHJpdmVyIGFjLmMgZm9yIFNDTyBVbml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQb3J0ZWQgYnkgRGF2aWQgV29vZGhvdXNlLCBBeGlvbSAoQ2FtYnJpZGdlKSBMdGQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBkd213MkBpbmZyYWRlYWQub3JnIDMwLzgvOTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAkSWQ6IGFjLmMsdiAxLjMwIDIwMDAvMDMvMjIgMTY6MDM6NTcgZHdtdzIgRXhwICQJCQkgICAgICovCisvKiBUaGlzIG1vZHVsZSBpcyBmb3IgTGludXggMi4xIGFuZCAyLjIgc2VyaWVzIGtlcm5lbHMuICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBKIFBBR0VUIDE4LzAyLzk0IHBhc3NhZ2UgVjIuNC4yIGlvY3RsIGF2ZWMgY29kZSAyIHJlc2V0IHRvIGxlcyBpbnRlcnJ1cHQgICovCisvKiBjZWNpIHBvdXIgcmVzZXRlciBjb3JyZWN0ZW1lbnQgYXByZXMgdW5lIHNvcnRpZSBzYXV2YWdlICAgICAgICAgICAgICAgICAgICovCisvKiBKIFBBR0VUIDAyLzA1Lzk0IHBhc3NhZ2UgVjIuNC4zIGRhbnMgbGUgdHJhaXRlbWVudCBkZSBkJ2ludGVycnVwdGlvbiwgICAgICovCisvKiBMb29wQ291bnQgbidldGFpdCBwYXMgaW5pdGlhbGlzZSBhIDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGIExBRk9SU0UgMDQvMDcvOTUgdmVyc2lvbiBWMi42LjAgbGVjdHVyZSBiaWRvbiBhcHJlcyBhY2NlcyBhIHVuZSBjYXJ0ZSAgICovCisvKiAgICAgICAgICAgcG91ciBsaWJlcmVyIGxlIGJ1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBKLlBBR0VUIDE5LzExLzk1IHZlcnNpb24gVjIuNi4xIE5vbWJyZSwgYWRkcmVzc2UsaXJxIG4nZXN0IHBsdXMgY29uZmlndXJlICovCisvKiBldCBwYXNzZSBlbiBhcmd1bWVudCBhIGFjaW5pdCwgbWFpcyBlc3Qgc2NydXRlIHN1ciBsZSBidXMgcG91ciBzJ2FkYXB0ZXIgICovCisvKiBhdSBub21icmUgZGUgY2FydGVzIHByZXNlbnRlcyBzdXIgbGUgYnVzLiBJT0NMIGNvZGUgNiBhZmZpY2hhaXQgVjIuNC4zICAgICovCisvKiBGLkxBRk9SU0UgMjgvMTEvOTUgY3JlYXRpb24gZGUgZmljaGllcnMgYWNYWC5vIGF2ZWMgbGVzIGRpZmZlcmVudGVzICAgICAgICovCisvKiBhZHJlc3NlcyBkZSBiYXNlIGRlcyBjYXJ0ZXMsIElPQ1RMIDYgcGx1cyBjb21wbGV0ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBKLlBBR0VUIGxlIDE5LzA4Lzk2IGNvcGllIGRlIGxhIHZlcnNpb24gVjIuNiBlbiBWMi44LjAgc2FucyBtb2RpZmljYXRpb24gICovCisvKiBkZSBjb2RlIGF1dHJlIHF1ZSBsZSB0ZXh0ZSBWMi42LjEgZW4gVjIuOC4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiYXBwbGljb20uaCIKKworCisvKiBOT1RFOiBXZSB1c2UgZm9yIGxvb3BzIHdpdGgge3dyaXRlLHJlYWR9YigpIGluc3RlYWQgb2YgCisgICBtZW1jcHlfe2Zyb20sdG99aW8gdGhyb3VnaG91dCB0aGlzIGRyaXZlci4gVGhpcyBpcyBiZWNhdXNlCisgICB0aGUgYm9hcmQgZG9lc24ndCBjb3JyZWN0bHkgaGFuZGxlIHdvcmQgYWNjZXNzZXMgLSBvbmx5CisgICBieXRlcy4gCisqLworCisKKyN1bmRlZiBERUJVRworCisjZGVmaW5lIE1BWF9CT0FSRCA4CQkvKiBtYXhpbXVtIG9mIHBjIGJvYXJkIHBvc3NpYmxlICovCisjZGVmaW5lIE1BWF9JU0FfQk9BUkQgNAorI2RlZmluZSBMRU5fUkFNX0lPIDB4ODAwCisjZGVmaW5lIEFDX01JTk9SIDE1NworCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQVBQTElDT00KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BUFBMSUNPTSAgICAgICAgICAgICAgICAweDEzODkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMSUNPTV9QQ0lHRU5FUklDICAgICAweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMSUNPTV9QQ0kyMDAwSUJTX0NBTiAweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMSUNPTV9QQ0kyMDAwUEZCICAgICAweDAwMDMKKyNlbmRpZgorI2RlZmluZSBNQVhfUENJX0RFVklDRV9OVU0gMworCitzdGF0aWMgY2hhciAqYXBwbGljb21fcGNpX2Rldm5hbWVzW10gPSB7CisJIlBDSSBib2FyZCIsCisJIlBDSTIwMDBJQlMgLyBQQ0kyMDAwQ0FOIiwKKwkiUENJMjAwMFBGQiIKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhcHBsaWNvbV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0FQUExJQ09NLCBQQ0lfREVWSUNFX0lEX0FQUExJQ09NX1BDSUdFTkVSSUMsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FQUExJQ09NLCBQQ0lfREVWSUNFX0lEX0FQUExJQ09NX1BDSTIwMDBJQlNfQ0FOLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9BUFBMSUNPTSwgUENJX0RFVklDRV9JRF9BUFBMSUNPTV9QQ0kyMDAwUEZCLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFwcGxpY29tX3BjaV90YmwpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBXb29kaG91c2UgJiBBcHBsaWNvbSBJbnRlcm5hdGlvbmFsIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgQXBwbGljb20gUHJvZmlidXMgY2FyZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiYWMiKTsKKworCitzdGF0aWMgc3RydWN0IGFwcGxpY29tX2JvYXJkIHsKKwl1bnNpZ25lZCBsb25nIFBoeXNJTzsKKwl2b2lkIF9faW9tZW0gKlJhbUlPOworCXdhaXRfcXVldWVfaGVhZF90IEZsYWdTbGVlcFNlbmQ7CisJbG9uZyBpcnE7CisJc3BpbmxvY2tfdCBtdXRleDsKK30gYXBic1tNQVhfQk9BUkRdOworCitzdGF0aWMgdW5zaWduZWQgaW50IGlycSA9IDA7CS8qIGludGVycnVwdCBudW1iZXIgSVJRICAgICAgICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW0gPSAwOwkvKiBwaHlzaWNhbCBzZWdtZW50IG9mIGJvYXJkICAqLworCittb2R1bGVfcGFyYW0oaXJxLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIG9mIHRoZSBBcHBsaWNvbSBib2FyZCIpOworbW9kdWxlX3BhcmFtKG1lbSwgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhtZW0sICJTaGFyZWQgTWVtb3J5IEFkZHJlc3Mgb2YgQXBwbGljb20gYm9hcmQiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBudW1ib2FyZHM7CS8qIG51bWJlciBvZiBpbnN0YWxsZWQgYm9hcmRzICovCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBEdW1teTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChGbGFnU2xlZXBSZWMpOworc3RhdGljIHVuc2lnbmVkIGludCBXcml0ZUVycm9yQ291bnQ7CS8qIG51bWJlciBvZiB3cml0ZSBlcnJvciAgICAgICovCitzdGF0aWMgdW5zaWduZWQgaW50IFJlYWRFcnJvckNvdW50OwkvKiBudW1iZXIgb2YgcmVhZCBlcnJvciAgICAgICAqLworc3RhdGljIHVuc2lnbmVkIGludCBEZXZpY2VFcnJvckNvdW50OwkvKiBudW1iZXIgb2YgZGV2aWNlIGVycm9yICAgICAqLworCitzdGF0aWMgc3NpemVfdCBhY19yZWFkIChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3N0YXRpYyBzc2l6ZV90IGFjX3dyaXRlIChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3N0YXRpYyBpbnQgYWNfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKKwkJICAgIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGlycXJldHVybl90IGFjX2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IG5vX2xsc2VlaywKKwkucmVhZCA9IGFjX3JlYWQsCisJLndyaXRlID0gYWNfd3JpdGUsCisJLmlvY3RsID0gYWNfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYWNfbWlzY2RldiA9IHsKKwlBQ19NSU5PUiwKKwkiYWMiLAorCSZhY19mb3BzCit9OworCitzdGF0aWMgaW50IGR1bW15OwkvKiBkZXZfaWQgZm9yIHJlcXVlc3RfaXJxKCkgKi8KKworc3RhdGljIGludCBhY19yZWdpc3Rlcl9ib2FyZCh1bnNpZ25lZCBsb25nIHBoeXNsb2MsIHZvaWQgX19pb21lbSAqbG9jLCAKKwkJICAgICAgdW5zaWduZWQgY2hhciBib2FyZG5vKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgYnl0ZV9yZXNldF9pdDsKKworCWlmKChyZWFkYihsb2MgKyBDT05GX0VORF9URVNUKSAgICAgIT0gMHgwMCkgfHwKKwkgICAocmVhZGIobG9jICsgQ09ORl9FTkRfVEVTVCArIDEpICE9IDB4NTUpIHx8CisJICAgKHJlYWRiKGxvYyArIENPTkZfRU5EX1RFU1QgKyAyKSAhPSAweEFBKSB8fAorCSAgIChyZWFkYihsb2MgKyBDT05GX0VORF9URVNUICsgMykgIT0gMHhGRikpCisJCXJldHVybiAwOworCisJaWYgKCFib2FyZG5vKQorCQlib2FyZG5vID0gcmVhZGIobG9jICsgTlVNQ0FSRF9PV05FUl9UT19QQyk7CisKKwlpZiAoIWJvYXJkbm8gJiYgYm9hcmRubyA+IE1BWF9CT0FSRCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCb2FyZCAjJWQgKGF0IDB4JWx4KSBpcyBvdXQgb2YgcmFuZ2UgKDEgPD0geCA8PSAlZCkuXG4iLAorCQkgICAgICAgYm9hcmRubywgcGh5c2xvYywgTUFYX0JPQVJEKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFwYnNbYm9hcmRubyAtIDFdLlJhbUlPKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJvYXJkICMlZCAoYXQgMHglbHgpIGNvbmZsaWN0cyB3aXRoIHByZXZpb3VzIGJvYXJkICMlZCAoYXQgMHglbHgpXG4iLCAKKwkJICAgICAgIGJvYXJkbm8sIHBoeXNsb2MsIGJvYXJkbm8sIGFwYnNbYm9hcmRuby0xXS5QaHlzSU8pOworCQlyZXR1cm4gMDsKKwl9CisKKwlib2FyZG5vLS07CisKKwlhcGJzW2JvYXJkbm9dLlBoeXNJTyA9IHBoeXNsb2M7CisJYXBic1tib2FyZG5vXS5SYW1JTyA9IGxvYzsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhcGJzW2JvYXJkbm9dLkZsYWdTbGVlcFNlbmQpOworCXNwaW5fbG9ja19pbml0KCZhcGJzW2JvYXJkbm9dLm11dGV4KTsKKwlieXRlX3Jlc2V0X2l0ID0gcmVhZGIobG9jICsgUkFNX0lUX1RPX1BDKTsKKworCW51bWJvYXJkcysrOworCXJldHVybiBib2FyZG5vICsgMTsKK30KKworI2lmZGVmIE1PRFVMRQorCisjZGVmaW5lIGFwcGxpY29tX2luaXQgaW5pdF9tb2R1bGUKKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCBpOworCisJbWlzY19kZXJlZ2lzdGVyKCZhY19taXNjZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQk9BUkQ7IGkrKykgeworCisJCWlmICghYXBic1tpXS5SYW1JTykKKwkJCWNvbnRpbnVlOworCisJCWlmIChhcGJzW2ldLmlycSkKKwkJCWZyZWVfaXJxKGFwYnNbaV0uaXJxLCAmZHVtbXkpOworCisJCWlvdW5tYXAoYXBic1tpXS5SYW1JTyk7CisJfQorfQorCisjZW5kaWYJCQkJLyogTU9EVUxFICovCisKK2ludCBfX2luaXQgYXBwbGljb21faW5pdCh2b2lkKQoreworCWludCBpLCBudW1pc2EgPSAwOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCXZvaWQgX19pb21lbSAqUmFtSU87CisJaW50IGJvYXJkbm87CisKKwlwcmludGsoS0VSTl9JTkZPICJBcHBsaWNvbSBkcml2ZXI6ICRJZDogYWMuYyx2IDEuMzAgMjAwMC8wMy8yMiAxNjowMzo1NyBkd213MiBFeHAgJFxuIik7CisKKwkvKiBObyBtZW0gYW5kIGlycSBnaXZlbiAtIGNoZWNrIGZvciBhIFBDSSBjYXJkICovCisKKwl3aGlsZSAoIChkZXYgPSBwY2lfZ2V0X2NsYXNzKFBDSV9DTEFTU19PVEhFUlMgPDwgMTYsIGRldikpKSB7CisKKwkJaWYgKGRldi0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfQVBQTElDT00pCisJCQljb250aW51ZTsKKwkJCisJCWlmIChkZXYtPmRldmljZSAgPiBNQVhfUENJX0RFVklDRV9OVU0gfHwgZGV2LT5kZXZpY2UgPT0gMCkKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpCisJCQlyZXR1cm4gLUVJTzsKKworCQlSYW1JTyA9IGlvcmVtYXAoZGV2LT5yZXNvdXJjZVswXS5zdGFydCwgTEVOX1JBTV9JTyk7CisKKwkJaWYgKCFSYW1JTykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYWMubzogRmFpbGVkIHRvIGlvcmVtYXAgUENJIG1lbW9yeSBzcGFjZSBhdCAweCVseFxuIiwgZGV2LT5yZXNvdXJjZVswXS5zdGFydCk7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQXBwbGljb20gJXMgZm91bmQgYXQgbWVtIDB4JWx4LCBpcnEgJWRcbiIsCisJCSAgICAgICBhcHBsaWNvbV9wY2lfZGV2bmFtZXNbZGV2LT5kZXZpY2UtMV0sIGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIAorCQkgICAgICAgZGV2LT5pcnEpOworCisJCWJvYXJkbm8gPSBhY19yZWdpc3Rlcl9ib2FyZChkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCBSYW1JTywwKTsKKwkJaWYgKCFib2FyZG5vKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJhYy5vOiBQQ0kgQXBwbGljb20gZGV2aWNlIGRvZXNuJ3QgaGF2ZSBjb3JyZWN0IHNpZ25hdHVyZS5cbiIpOworCQkJaW91bm1hcChSYW1JTyk7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmYWNfaW50ZXJydXB0LCBTQV9TSElSUSwgIkFwcGxpY29tIFBDSSIsICZkdW1teSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkNvdWxkIG5vdCBhbGxvY2F0ZSBJUlEgJWQgZm9yIFBDSSBBcHBsaWNvbSBkZXZpY2UuXG4iLCBkZXYtPmlycSk7CisJCQlpb3VubWFwKFJhbUlPKTsKKwkJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworCQkJYXBic1tib2FyZG5vIC0gMV0uUmFtSU8gPSBOVUxMOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBFbmFibGUgaW50ZXJydXB0cy4gKi8KKworCQl3cml0ZWIoMHg0MCwgYXBic1tib2FyZG5vIC0gMV0uUmFtSU8gKyBSQU1fSVRfRlJPTV9QQyk7CisKKwkJYXBic1tib2FyZG5vIC0gMV0uaXJxID0gZGV2LT5pcnE7CisJfQorCisJLyogRmluaXNoZWQgd2l0aCBQQ0kgY2FyZHMuIElmIG5vbmUgcmVnaXN0ZXJlZCwgCisJICogYW5kIHRoZXJlIHdhcyBubyBtZW0vaXJxIHNwZWNpZmllZCwgZXhpdCAqLworCisJaWYgKCFtZW0gfHwgIWlycSkgeworCQlpZiAobnVtYm9hcmRzKQorCQkJZ290byBmaW47CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYWMubzogTm8gUENJIGJvYXJkcyBmb3VuZC5cbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYWMubzogRm9yIGFuIElTQSBib2FyZCB5b3UgbXVzdCBzdXBwbHkgbWVtb3J5IGFuZCBpcnEgcGFyYW1ldGVycy5cbiIpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCX0KKworCS8qIE5vdyB0cnkgdGhlIHNwZWNpZmllZCBJU0EgY2FyZHMgKi8KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNBX0JPQVJEOyBpKyspIHsKKwkJUmFtSU8gPSBpb3JlbWFwKG1lbSArIChMRU5fUkFNX0lPICogaSksIExFTl9SQU1fSU8pOworCisJCWlmICghUmFtSU8pIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImFjLm86IEZhaWxlZCB0byBpb3JlbWFwIHRoZSBJU0EgY2FyZCdzIG1lbW9yeSBzcGFjZSAoc2xvdCAjJWQpXG4iLCBpICsgMSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghKGJvYXJkbm8gPSBhY19yZWdpc3Rlcl9ib2FyZCgodW5zaWduZWQgbG9uZyltZW0rIChMRU5fUkFNX0lPKmkpLAorCQkJCQkJICBSYW1JTyxpKzEpKSkgeworCQkJaW91bm1hcChSYW1JTyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByaW50ayhLRVJOX05PVElDRSAiQXBwbGljb20gSVNBIGNhcmQgZm91bmQgYXQgbWVtIDB4JWx4LCBpcnEgJWRcbiIsIG1lbSArIChMRU5fUkFNX0lPKmkpLCBpcnEpOworCisJCWlmICghbnVtaXNhKSB7CisJCQlpZiAocmVxdWVzdF9pcnEoaXJxLCAmYWNfaW50ZXJydXB0LCBTQV9TSElSUSwgIkFwcGxpY29tIElTQSIsICZkdW1teSkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDb3VsZCBub3QgYWxsb2NhdGUgSVJRICVkIGZvciBJU0EgQXBwbGljb20gZGV2aWNlLlxuIiwgaXJxKTsKKwkJCQlpb3VubWFwKFJhbUlPKTsKKwkJCQlhcGJzW2JvYXJkbm8gLSAxXS5SYW1JTyA9IE5VTEw7CisJCQl9CisJCQllbHNlCisJCQkJYXBic1tib2FyZG5vIC0gMV0uaXJxID0gaXJxOworCQl9CisJCWVsc2UKKwkJCWFwYnNbYm9hcmRubyAtIDFdLmlycSA9IDA7CisKKwkJbnVtaXNhKys7CisJfQorCisJaWYgKCFudW1pc2EpCisJCXByaW50ayhLRVJOX1dBUk5JTkciYWMubzogTm8gdmFsaWQgSVNBIEFwcGxpY29tIGJvYXJkcyBmb3VuZCBhdCBtZW0gMHglbHhcbiIsbWVtKTsKKworIGZpbjoKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZGbGFnU2xlZXBSZWMpOworCisJV3JpdGVFcnJvckNvdW50ID0gMDsKKwlSZWFkRXJyb3JDb3VudCA9IDA7CisJRGV2aWNlRXJyb3JDb3VudCA9IDA7CisKKwlpZiAobnVtYm9hcmRzKSB7CisJCW1pc2NfcmVnaXN0ZXIoJmFjX21pc2NkZXYpOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JPQVJEOyBpKyspIHsKKwkJCWludCBzZXJpYWw7CisJCQljaGFyIGJvYXJkbmFtZVsoU0VSSUFMX05VTUJFUiAtIFRZUEVfQ0FSRCkgKyAxXTsKKworCQkJaWYgKCFhcGJzW2ldLlJhbUlPKQorCQkJCWNvbnRpbnVlOworCisJCQlmb3IgKHNlcmlhbCA9IDA7IHNlcmlhbCA8IFNFUklBTF9OVU1CRVIgLSBUWVBFX0NBUkQ7IHNlcmlhbCsrKQorCQkJCWJvYXJkbmFtZVtzZXJpYWxdID0gcmVhZGIoYXBic1tpXS5SYW1JTyArIFRZUEVfQ0FSRCArIHNlcmlhbCk7CisKKwkJCWJvYXJkbmFtZVtzZXJpYWxdID0gMDsKKworCisJCQlwcmludGsoS0VSTl9JTkZPICJBcHBsaWNvbSBib2FyZCAlZDogJXMsIFBST00gViVkLiVkIiwKKwkJCSAgICAgICBpKzEsIGJvYXJkbmFtZSwKKwkJCSAgICAgICAoaW50KShyZWFkYihhcGJzW2ldLlJhbUlPICsgVkVSUykgPj4gNCksCisJCQkgICAgICAgKGludCkocmVhZGIoYXBic1tpXS5SYW1JTyArIFZFUlMpICYgMHhGKSk7CisJCQkKKwkJCXNlcmlhbCA9IChyZWFkYihhcGJzW2ldLlJhbUlPICsgU0VSSUFMX05VTUJFUikgPDwgMTYpICsgCisJCQkJKHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBTRVJJQUxfTlVNQkVSICsgMSkgPDwgOCkgKyAKKwkJCQkocmVhZGIoYXBic1tpXS5SYW1JTyArIFNFUklBTF9OVU1CRVIgKyAyKSApOworCisJCQlpZiAoc2VyaWFsICE9IDApCisJCQkJcHJpbnRrKCIgUy9OICVkXG4iLCBzZXJpYWwpOworCQkJZWxzZQorCQkJCXByaW50aygiXG4iKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwllbHNlCisJCXJldHVybiAtRU5YSU87Cit9CisKKworI2lmbmRlZiBNT0RVTEUKK19faW5pdGNhbGwoYXBwbGljb21faW5pdCk7CisjZW5kaWYKKworc3RhdGljIHNzaXplX3QgYWNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwl1bnNpZ25lZCBpbnQgTnVtQ2FyZDsJLyogQm9hcmQgbnVtYmVyIDEgLT4gOCAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgSW5kZXhDYXJkOwkvKiBJbmRleCBib2FyZCBudW1iZXIgMCAtPiA3ICAgICAqLworCXVuc2lnbmVkIGNoYXIgVGljQ2FyZDsJLyogQm9hcmQgVElDIHRvIHNlbmQgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBDdXJyZW50IHByaW9yaXR5ICAgICAgICAgICAgICAqLworCXN0cnVjdCBzdF9yYW1faW8gc3RfbG9jOworCXN0cnVjdCBtYWlsYm94IHRtcG1haWxib3g7CisjaWZkZWYgREVCVUcKKwlpbnQgYzsKKyNlbmRpZgorCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJaWYgKGNvdW50ICE9IHNpemVvZihzdHJ1Y3Qgc3RfcmFtX2lvKSArIHNpemVvZihzdHJ1Y3QgbWFpbGJveCkpIHsKKwkJc3RhdGljIGludCB3YXJuY291bnQgPSA1OworCQlpZiAod2FybmNvdW50KSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJIbW1tLiB3cml0ZSgpIG9mIEFwcGxpY29tIGNhcmQsIGxlbmd0aCAlemQgIT0gZXhwZWN0ZWQgJXpkXG4iLAorCQkJICAgICAgIGNvdW50LCBzaXplb2Yoc3RydWN0IHN0X3JhbV9pbykgKyBzaXplb2Yoc3RydWN0IG1haWxib3gpKTsKKwkJCXdhcm5jb3VudC0tOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmKGNvcHlfZnJvbV91c2VyKCZzdF9sb2MsIGJ1Ziwgc2l6ZW9mKHN0cnVjdCBzdF9yYW1faW8pKSkgCisJCXJldHVybiAtRUZBVUxUOworCQorCWlmKGNvcHlfZnJvbV91c2VyKCZ0bXBtYWlsYm94LCAmYnVmW3NpemVvZihzdHJ1Y3Qgc3RfcmFtX2lvKV0sCisJCQkgIHNpemVvZihzdHJ1Y3QgbWFpbGJveCkpKSAKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlOdW1DYXJkID0gc3RfbG9jLm51bV9jYXJkOwkvKiBib2FyZCBudW1iZXIgdG8gc2VuZCAgICAgICAgICAqLworCVRpY0NhcmQgPSBzdF9sb2MudGljX2Rlc19mcm9tX3BjOwkvKiB0aWMgbnVtYmVyIHRvIHNlbmQgICAgICAgICAgICAqLworCUluZGV4Q2FyZCA9IE51bUNhcmQgLSAxOworCisJaWYoKE51bUNhcmQgPCAxKSB8fCAoTnVtQ2FyZCA+IE1BWF9CT0FSRCkgfHwgIWFwYnNbSW5kZXhDYXJkXS5SYW1JTykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiV3JpdGUgdG8gYXBwbGljb20gY2FyZCAjJWQuIHN0cnVjdCBzdF9yYW1faW8gZm9sbG93czoiLAorCSAgICAgICBJbmRleENhcmQrMSk7CisKKwkJZm9yIChjID0gMDsgYyA8IHNpemVvZihzdHJ1Y3Qgc3RfcmFtX2lvKTspIHsKKwkJCisJCQlwcmludGsoIlxuJTUuNVg6ICUyLjJYIiwgYywgKCh1bnNpZ25lZCBjaGFyICopICZzdF9sb2MpW2NdKTsKKworCQkJZm9yIChjKys7IGMgJSA4ICYmIGMgPCBzaXplb2Yoc3RydWN0IHN0X3JhbV9pbyk7IGMrKykgeworCQkJCXByaW50aygiICUyLjJYIiwgKCh1bnNpZ25lZCBjaGFyICopICZzdF9sb2MpW2NdKTsKKwkJCX0KKwkJfQorCisJCXByaW50aygiXG5zdHJ1Y3QgbWFpbGJveCBmb2xsb3dzOiIpOworCisJCWZvciAoYyA9IDA7IGMgPCBzaXplb2Yoc3RydWN0IG1haWxib3gpOykgeworCQkJcHJpbnRrKCJcbiU1LjVYOiAlMi4yWCIsIGMsICgodW5zaWduZWQgY2hhciAqKSAmdG1wbWFpbGJveClbY10pOworCisJCQlmb3IgKGMrKzsgYyAlIDggJiYgYyA8IHNpemVvZihzdHJ1Y3QgbWFpbGJveCk7IGMrKykgeworCQkJCXByaW50aygiICUyLjJYIiwgKCh1bnNpZ25lZCBjaGFyICopICZ0bXBtYWlsYm94KVtjXSk7CisJCQl9CisJCX0KKworCQlwcmludGsoIlxuIik7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhcGJzW0luZGV4Q2FyZF0ubXV0ZXgsIGZsYWdzKTsKKworCS8qIFRlc3Qgb2N0ZXQgcmVhZHkgY29ycmVjdCAqLworCWlmKHJlYWRiKGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIERBVEFfRlJPTV9QQ19SRUFEWSkgPiAyKSB7IAorCQlEdW1teSA9IHJlYWRiKGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIFZFUlMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcGJzW0luZGV4Q2FyZF0ubXV0ZXgsIGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVBQTElDT00gZHJpdmVyIHdyaXRlIGVycm9yIGJvYXJkICVkLCBEYXRhRnJvbVBjUmVhZHkgPSAlZFxuIiwKKwkJICAgICAgIEluZGV4Q2FyZCwoaW50KXJlYWRiKGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIERBVEFfRlJPTV9QQ19SRUFEWSkpOworCQlEZXZpY2VFcnJvckNvdW50Kys7CisJCXJldHVybiAtRUlPOworCX0KKwkKKwkvKiBQbGFjZSBvdXJzZWx2ZXMgb24gdGhlIHdhaXQgcXVldWUgKi8KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWFkZF93YWl0X3F1ZXVlKCZhcGJzW0luZGV4Q2FyZF0uRmxhZ1NsZWVwU2VuZCwgJndhaXQpOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgY2FyZCBpcyByZWFkeSBmb3IgdXMgKi8KKwl3aGlsZSAocmVhZGIoYXBic1tJbmRleENhcmRdLlJhbUlPICsgREFUQV9GUk9NX1BDX1JFQURZKSAhPSAwKSB7CisJCUR1bW15ID0gcmVhZGIoYXBic1tJbmRleENhcmRdLlJhbUlPICsgVkVSUyk7CisJCS8qIEl0J3MgYnVzeS4gU2xlZXAuICovCisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXBic1tJbmRleENhcmRdLm11dGV4LCBmbGFncyk7CisJCXNjaGVkdWxlKCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmFwYnNbSW5kZXhDYXJkXS5GbGFnU2xlZXBTZW5kLAorCQkJCQkgICZ3YWl0KTsKKwkJCXJldHVybiAtRUlOVFI7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFwYnNbSW5kZXhDYXJkXS5tdXRleCwgZmxhZ3MpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKworCS8qIFdlIG1heSBub3QgaGF2ZSBhY3R1YWxseSBzbGVwdCAqLworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmFwYnNbSW5kZXhDYXJkXS5GbGFnU2xlZXBTZW5kLCAmd2FpdCk7CisKKwl3cml0ZWIoMSwgYXBic1tJbmRleENhcmRdLlJhbUlPICsgREFUQV9GUk9NX1BDX1JFQURZKTsKKworCS8qIFdoaWNoIGlzIGJlc3QgLSBsb2NrIGRvd24gdGhlIHBhZ2VzIHdpdGggcmF3aW8gYW5kIHRoZW4KKwkgICBjb3B5IGRpcmVjdGx5LCBvciB1c2UgYm91bmNlIGJ1ZmZlcnM/IEZvciBub3cgd2UgZG8gdGhlIGxhdHRlciAKKwkgICBiZWNhdXNlIGl0IHdvcmtzIHdpdGggMi4yIHN0aWxsICovCisJeworCQl1bnNpZ25lZCBjaGFyICpmcm9tID0gKHVuc2lnbmVkIGNoYXIgKikgJnRtcG1haWxib3g7CisJCXZvaWQgX19pb21lbSAqdG8gPSBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBSQU1fRlJPTV9QQzsKKwkJaW50IGM7CisKKwkJZm9yIChjID0gMDsgYyA8IHNpemVvZihzdHJ1Y3QgbWFpbGJveCk7IGMrKykKKwkJCXdyaXRlYigqKGZyb20rKyksIHRvKyspOworCX0KKworCXdyaXRlYigweDIwLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBUSUNfT1dORVJfRlJPTV9QQyk7CisJd3JpdGViKDB4ZmYsIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIE5VTUNBUkRfT1dORVJfRlJPTV9QQyk7CisJd3JpdGViKFRpY0NhcmQsIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIFRJQ19ERVNfRlJPTV9QQyk7CisJd3JpdGViKE51bUNhcmQsIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIE5VTUNBUkRfREVTX0ZST01fUEMpOworCXdyaXRlYigyLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBEQVRBX0ZST01fUENfUkVBRFkpOworCXdyaXRlYigxLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBSQU1fSVRfRlJPTV9QQyk7CisJRHVtbXkgPSByZWFkYihhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBWRVJTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcGJzW0luZGV4Q2FyZF0ubXV0ZXgsIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19hY19yZWFkKGludCBJbmRleENhcmQsIGNoYXIgX191c2VyICpidWYsCisJCXN0cnVjdCBzdF9yYW1faW8gKnN0X2xvYywgc3RydWN0IG1haWxib3ggKm1haWxib3gpCit7CisJdm9pZCBfX2lvbWVtICpmcm9tID0gYXBic1tJbmRleENhcmRdLlJhbUlPICsgUkFNX1RPX1BDOworCXVuc2lnbmVkIGNoYXIgKnRvID0gKHVuc2lnbmVkIGNoYXIgKikmbWFpbGJveDsKKyNpZmRlZiBERUJVRworCWludCBjOworI2VuZGlmCisKKwlzdF9sb2MtPnRpY19vd25lcl90b19wYyA9IHJlYWRiKGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIFRJQ19PV05FUl9UT19QQyk7CisJc3RfbG9jLT5udW1jYXJkX293bmVyX3RvX3BjID0gcmVhZGIoYXBic1tJbmRleENhcmRdLlJhbUlPICsgTlVNQ0FSRF9PV05FUl9UT19QQyk7CisKKworCXsKKwkJaW50IGM7CisKKwkJZm9yIChjID0gMDsgYyA8IHNpemVvZihzdHJ1Y3QgbWFpbGJveCk7IGMrKykKKwkJCSoodG8rKykgPSByZWFkYihmcm9tKyspOworCX0KKwl3cml0ZWIoMSwgYXBic1tJbmRleENhcmRdLlJhbUlPICsgQUNLX0ZST01fUENfUkVBRFkpOworCXdyaXRlYigxLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBUWVBfQUNLX0ZST01fUEMpOworCXdyaXRlYihJbmRleENhcmQrMSwgYXBic1tJbmRleENhcmRdLlJhbUlPICsgTlVNQ0FSRF9BQ0tfRlJPTV9QQyk7CisJd3JpdGViKHJlYWRiKGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIFRJQ19PV05FUl9UT19QQyksIAorCSAgICAgICBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBUSUNfQUNLX0ZST01fUEMpOworCXdyaXRlYigyLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBBQ0tfRlJPTV9QQ19SRUFEWSk7CisJd3JpdGViKDAsIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIERBVEFfVE9fUENfUkVBRFkpOworCXdyaXRlYigyLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBSQU1fSVRfRlJPTV9QQyk7CisJRHVtbXkgPSByZWFkYihhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBWRVJTKTsKKworI2lmZGVmIERFQlVHCisJCXByaW50aygiUmVhZCBmcm9tIGFwcGxpY29tIGNhcmQgIyVkLiBzdHJ1Y3Qgc3RfcmFtX2lvIGZvbGxvd3M6IiwgTnVtQ2FyZCk7CisKKwkJZm9yIChjID0gMDsgYyA8IHNpemVvZihzdHJ1Y3Qgc3RfcmFtX2lvKTspIHsKKwkJCXByaW50aygiXG4lNS41WDogJTIuMlgiLCBjLCAoKHVuc2lnbmVkIGNoYXIgKilzdF9sb2MpW2NdKTsKKworCQkJZm9yIChjKys7IGMgJSA4ICYmIGMgPCBzaXplb2Yoc3RydWN0IHN0X3JhbV9pbyk7IGMrKykgeworCQkJCXByaW50aygiICUyLjJYIiwgKCh1bnNpZ25lZCBjaGFyICopc3RfbG9jKVtjXSk7CisJCQl9CisJCX0KKworCQlwcmludGsoIlxuc3RydWN0IG1haWxib3ggZm9sbG93czoiKTsKKworCQlmb3IgKGMgPSAwOyBjIDwgc2l6ZW9mKHN0cnVjdCBtYWlsYm94KTspIHsKKwkJCXByaW50aygiXG4lNS41WDogJTIuMlgiLCBjLCAoKHVuc2lnbmVkIGNoYXIgKiltYWlsYm94KVtjXSk7CisKKwkJCWZvciAoYysrOyBjICUgOCAmJiBjIDwgc2l6ZW9mKHN0cnVjdCBtYWlsYm94KTsgYysrKSB7CisJCQkJcHJpbnRrKCIgJTIuMlgiLCAoKHVuc2lnbmVkIGNoYXIgKiltYWlsYm94KVtjXSk7CisJCQl9CisJCX0KKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IHN0X3JhbV9pbykgKyBzaXplb2Yoc3RydWN0IG1haWxib3gpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWNfcmVhZCAoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwdHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlpbnQgcmV0ID0gMDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKyNpZmRlZiBERUJVRworCWludCBsb29wY291bnQ9MDsKKyNlbmRpZgorCS8qIE5vIG5lZWQgdG8gcmF0ZWxpbWl0IHRoaXMuIE9ubHkgcm9vdCBjYW4gdHJpZ2dlciBpdCBhbnl3YXkgKi8KKwlpZiAoY291bnQgIT0gc2l6ZW9mKHN0cnVjdCBzdF9yYW1faW8pICsgc2l6ZW9mKHN0cnVjdCBtYWlsYm94KSkgeworCQlwcmludGsoIEtFUk5fV0FSTklORyAiSG1tbS4gcmVhZCgpIG9mIEFwcGxpY29tIGNhcmQsIGxlbmd0aCAlemQgIT0gZXhwZWN0ZWQgJXpkXG4iLAorCQkJY291bnQsc2l6ZW9mKHN0cnVjdCBzdF9yYW1faW8pICsgc2l6ZW9mKHN0cnVjdCBtYWlsYm94KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwl3aGlsZSgxKSB7CisJCS8qIFN0aWNrIG91cnNlbGYgb24gdGhlIHdhaXQgcXVldWUgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoJkZsYWdTbGVlcFJlYywgJndhaXQpOworCQkKKwkJLyogU2NhbiBlYWNoIGJvYXJkLCBsb29raW5nIGZvciBvbmUgd2hpY2ggaGFzIGEgcGFja2V0IGZvciB1cyAqLworCQlmb3IgKGk9MDsgaSA8IE1BWF9CT0FSRDsgaSsrKSB7CisJCQlpZiAoIWFwYnNbaV0uUmFtSU8pCisJCQkJY29udGludWU7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXBic1tpXS5tdXRleCwgZmxhZ3MpOworCQkJCisJCQl0bXAgPSByZWFkYihhcGJzW2ldLlJhbUlPICsgREFUQV9UT19QQ19SRUFEWSk7CisJCQkKKwkJCWlmICh0bXAgPT0gMikgeworCQkJCXN0cnVjdCBzdF9yYW1faW8gc3RfbG9jOworCQkJCXN0cnVjdCBtYWlsYm94IG1haWxib3g7CisKKwkJCQkvKiBHb3QgYSBwYWNrZXQgZm9yIHVzICovCisJCQkJcmV0ID0gZG9fYWNfcmVhZChpLCBidWYsICZzdF9sb2MsICZtYWlsYm94KTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcGJzW2ldLm11dGV4LCBmbGFncyk7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmRmxhZ1NsZWVwUmVjLCAmd2FpdCk7CisKKwkJCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJnN0X2xvYywgc2l6ZW9mKHN0X2xvYykpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoY29weV90b191c2VyKGJ1ZiArIHNpemVvZihzdF9sb2MpLCAmbWFpbGJveCwgc2l6ZW9mKG1haWxib3gpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcmV0dXJuIHRtcDsKKwkJCX0KKwkJCQorCQkJaWYgKHRtcCA+IDIpIHsKKwkJCQkvKiBHb3QgYW4gZXJyb3IgKi8KKwkJCQlEdW1teSA9IHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBWRVJTKTsKKwkJCQkKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcGJzW2ldLm11dGV4LCBmbGFncyk7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmRmxhZ1NsZWVwUmVjLCAmd2FpdCk7CisJCQkJCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVBQTElDT00gZHJpdmVyIHJlYWQgZXJyb3IgYm9hcmQgJWQsIERhdGFUb1BjUmVhZHkgPSAlZFxuIiwKKwkJCQkgICAgICAgaSwoaW50KXJlYWRiKGFwYnNbaV0uUmFtSU8gKyBEQVRBX1RPX1BDX1JFQURZKSk7CisJCQkJRGV2aWNlRXJyb3JDb3VudCsrOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJCisJCQkvKiBOb3RoaW5nIGZvciB1cy4gVHJ5IHRoZSBuZXh0IGJvYXJkICovCisJCQlEdW1teSA9IHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBWRVJTKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwYnNbaV0ubXV0ZXgsIGZsYWdzKTsKKwkJCQorCQl9IC8qIHBlciBib2FyZCAqLworCisJCS8qIE9LIC0gTm8gYm9hcmRzIGhhZCBkYXRhIGZvciB1cy4gU2xlZXAgbm93ICovCisKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJkZsYWdTbGVlcFJlYywgJndhaXQpOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRUlOVFI7CisKKyNpZmRlZiBERUJVRworCQlpZiAobG9vcGNvdW50KysgPiAyKSB7CisJCQlwcmludGsoIkxvb3BpbmcgaW4gYWNfcmVhZC4gbG9vcGNvdW50ICVkXG4iLCBsb29wY291bnQpOworCQl9CisjZW5kaWYKKwl9IAorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWNfaW50ZXJydXB0KGludCB2ZWMsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IEZsYWdJbnQ7CisJdW5zaWduZWQgaW50IExvb3BDb3VudDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwkvLyAgICBwcmludGsoIkFwcGxpY29tIGludGVycnVwdCBvbiBJUlEgJWQgb2NjdXJyZWRcbiIsIHZlYyk7CisKKwlMb29wQ291bnQgPSAwOworCisJZG8geworCQlGbGFnSW50ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9CT0FSRDsgaSsrKSB7CisJCQkKKwkJCS8qIFNraXAgaWYgdGhpcyBib2FyZCBkb2Vzbid0IGV4aXN0ICovCisJCQlpZiAoIWFwYnNbaV0uUmFtSU8pCisJCQkJY29udGludWU7CisKKwkJCXNwaW5fbG9jaygmYXBic1tpXS5tdXRleCk7CisKKwkJCS8qIFNraXAgaWYgdGhpcyBib2FyZCBkb2Vzbid0IHdhbnQgYXR0ZW50aW9uICovCisJCQlpZihyZWFkYihhcGJzW2ldLlJhbUlPICsgUkFNX0lUX1RPX1BDKSA9PSAwKSB7CisJCQkJc3Bpbl91bmxvY2soJmFwYnNbaV0ubXV0ZXgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQloYW5kbGVkID0gMTsKKwkJCUZsYWdJbnQgPSAxOworCQkJd3JpdGViKDAsIGFwYnNbaV0uUmFtSU8gKyBSQU1fSVRfVE9fUEMpOworCisJCQlpZiAocmVhZGIoYXBic1tpXS5SYW1JTyArIERBVEFfVE9fUENfUkVBRFkpID4gMikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFQUExJQ09NIGRyaXZlciBpbnRlcnJ1cHQgZXJyIGJvYXJkICVkLCBEYXRhVG9QY1JlYWR5ID0gJWRcbiIsCisJCQkJICAgICAgIGkrMSwoaW50KXJlYWRiKGFwYnNbaV0uUmFtSU8gKyBEQVRBX1RPX1BDX1JFQURZKSk7CisJCQkJRGV2aWNlRXJyb3JDb3VudCsrOworCQkJfQorCisJCQlpZigocmVhZGIoYXBic1tpXS5SYW1JTyArIERBVEFfRlJPTV9QQ19SRUFEWSkgPiAyKSAmJiAKKwkJCSAgIChyZWFkYihhcGJzW2ldLlJhbUlPICsgREFUQV9GUk9NX1BDX1JFQURZKSAhPSA2KSkgeworCQkJCQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFQUExJQ09NIGRyaXZlciBpbnRlcnJ1cHQgZXJyIGJvYXJkICVkLCBEYXRhRnJvbVBjUmVhZHkgPSAlZFxuIiwKKwkJCQkgICAgICAgaSsxLChpbnQpcmVhZGIoYXBic1tpXS5SYW1JTyArIERBVEFfRlJPTV9QQ19SRUFEWSkpOworCQkJCURldmljZUVycm9yQ291bnQrKzsKKwkJCX0KKworCQkJaWYgKHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBEQVRBX1RPX1BDX1JFQURZKSA9PSAyKSB7CS8qIG1haWxib3ggc2VudCBieSB0aGUgY2FyZCA/ICAgKi8KKwkJCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmRmxhZ1NsZWVwUmVjKSkgeworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmRmxhZ1NsZWVwUmVjKTsKKwkJCX0KKwkJCX0KKworCQkJaWYgKHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBEQVRBX0ZST01fUENfUkVBRFkpID09IDApIHsJLyogcmFtIGkvbyBmcmVlIGZvciB3cml0ZSBieSBwYyA/ICovCisJCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmFwYnNbaV0uRmxhZ1NsZWVwU2VuZCkpIHsJLyogcHJvY2VzcyBzbGVlcCBkdXJpbmcgcmVhZCA/ICAgICovCisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYXBic1tpXS5GbGFnU2xlZXBTZW5kKTsKKwkJCQl9CisJCQl9CisJCQlEdW1teSA9IHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBWRVJTKTsKKworCQkJaWYocmVhZGIoYXBic1tpXS5SYW1JTyArIFJBTV9JVF9UT19QQykpIHsKKwkJCQkvKiBUaGVyZSdzIGFub3RoZXIgaW50IHdhaXRpbmcgb24gdGhpcyBjYXJkICovCisJCQkJc3Bpbl91bmxvY2soJmFwYnNbaV0ubXV0ZXgpOworCQkJCWktLTsKKwkJCX0gZWxzZSB7CisJCQkJc3Bpbl91bmxvY2soJmFwYnNbaV0ubXV0ZXgpOworCQkJfQorCQl9CisJCWlmIChGbGFnSW50KQorCQkJTG9vcENvdW50ID0gMDsKKwkJZWxzZQorCQkJTG9vcENvdW50Kys7CisJfSB3aGlsZShMb29wQ291bnQgPCAyKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCisKK3N0YXRpYyBpbnQgYWNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorICAgICAKK3sJCQkJLyogQCBBREcgb3UgQVRPIHNlbG9uIGxlIGNhcyAqLworCWludCBpOworCXVuc2lnbmVkIGNoYXIgSW5kZXhDYXJkOworCXZvaWQgX19pb21lbSAqcG1lbTsKKwlpbnQgcmV0ID0gMDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGJ5dGVfcmVzZXRfaXQ7CisJc3RydWN0IHN0X3JhbV9pbyAqYWRnbDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCS8qIEluIGdlbmVyYWwsIHRoZSBkZXZpY2UgaXMgb25seSBvcGVuYWJsZSBieSByb290IGFueXdheSwgc28gd2UncmUgbm90CisJICAgcGFydGljdWxhcmx5IGNvbmNlcm5lZCB0aGF0IGJvZ3VzIGlvY3RscyBjYW4gZmxvb2QgdGhlIGNvbnNvbGUuICovCisKKwlhZGdsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHN0X3JhbV9pbyksIEdGUF9LRVJORUwpOworCWlmICghYWRnbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYWRnbCwgYXJncCwgc2l6ZW9mKHN0cnVjdCBzdF9yYW1faW8pKSkgeworCQlrZnJlZShhZGdsKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCQorCUluZGV4Q2FyZCA9IGFkZ2wtPm51bV9jYXJkLTE7CisJIAorCWlmKGNtZCAhPSAwICYmIGNtZCAhPSA2ICYmCisJICAgKChJbmRleENhcmQgPj0gTUFYX0JPQVJEKSB8fCAhYXBic1tJbmRleENhcmRdLlJhbUlPKSkgeworCQlzdGF0aWMgaW50IHdhcm5jb3VudCA9IDEwOworCQlpZiAod2FybmNvdW50KSB7CisJCQlwcmludGsoIEtFUk5fV0FSTklORyAiQVBQTElDT00gZHJpdmVyIElPQ1RMLCBiYWQgYm9hcmQgbnVtYmVyICVkXG4iLChpbnQpSW5kZXhDYXJkKzEpOworCQkJd2FybmNvdW50LS07CisJCX0KKwkJa2ZyZWUoYWRnbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJCQorCWNhc2UgMDoKKwkJcG1lbSA9IGFwYnNbSW5kZXhDYXJkXS5SYW1JTzsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3Qgc3RfcmFtX2lvKTsgaSsrKQorCQkJKCh1bnNpZ25lZCBjaGFyICopYWRnbClbaV09cmVhZGIocG1lbSsrKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBhZGdsLCBzaXplb2Yoc3RydWN0IHN0X3JhbV9pbykpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwbWVtID0gYXBic1tJbmRleENhcmRdLlJhbUlPICsgQ09ORl9FTkRfVEVTVDsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWFkZ2wtPmNvbmZfZW5kX3Rlc3RbaV0gPSByZWFkYihwbWVtKyspOworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJYWRnbC0+ZXJyb3JfY29kZVtpXSA9IHJlYWRiKHBtZW0rKyk7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQlhZGdsLT5wYXJhbWV0ZXJfZXJyb3JbaV0gPSByZWFkYihwbWVtKyspOworCQlwbWVtID0gYXBic1tJbmRleENhcmRdLlJhbUlPICsgVkVSUzsKKwkJYWRnbC0+dmVycyA9IHJlYWRiKHBtZW0pOworCQlwbWVtID0gYXBic1tJbmRleENhcmRdLlJhbUlPICsgVFlQRV9DQVJEOworCQlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKwkJCWFkZ2wtPnJlc2VydjFbaV0gPSByZWFkYihwbWVtKyspOworCQkqKGludCAqKSZhZGdsLT5yZXNlcnYxWzIwXSA9ICAKKwkJCShyZWFkYihhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBTRVJJQUxfTlVNQkVSKSA8PCAxNikgKyAKKwkJCShyZWFkYihhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBTRVJJQUxfTlVNQkVSICsgMSkgPDwgOCkgKyAKKwkJCShyZWFkYihhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBTRVJJQUxfTlVNQkVSICsgMikgKTsKKworCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGFkZ2wsIHNpemVvZihzdHJ1Y3Qgc3RfcmFtX2lvKSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIDI6CisJCXBtZW0gPSBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBDT05GX0VORF9URVNUOworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJCXdyaXRlYigweGZmLCBwbWVtKyspOworCQl3cml0ZWIoYWRnbC0+ZGF0YV9mcm9tX3BjX3JlYWR5LCAKKwkJICAgICAgIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIERBVEFfRlJPTV9QQ19SRUFEWSk7CisKKwkJd3JpdGViKDEsIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIFJBTV9JVF9GUk9NX1BDKTsKKwkJCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQk9BUkQ7IGkrKykgeworCQkJaWYgKGFwYnNbaV0uUmFtSU8pIHsKKwkJCQlieXRlX3Jlc2V0X2l0ID0gcmVhZGIoYXBic1tpXS5SYW1JTyArIFJBTV9JVF9UT19QQyk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSAzOgorCQlwbWVtID0gYXBic1tJbmRleENhcmRdLlJhbUlPICsgVElDX0RFU19GUk9NX1BDOworCQl3cml0ZWIoYWRnbC0+dGljX2Rlc19mcm9tX3BjLCBwbWVtKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlwbWVtID0gYXBic1tJbmRleENhcmRdLlJhbUlPICsgVElDX09XTkVSX1RPX1BDOworCQlhZGdsLT50aWNfb3duZXJfdG9fcGMgICAgID0gcmVhZGIocG1lbSsrKTsKKwkJYWRnbC0+bnVtY2FyZF9vd25lcl90b19wYyA9IHJlYWRiKHBtZW0pOworCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGFkZ2wsc2l6ZW9mKHN0cnVjdCBzdF9yYW1faW8pKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgNToKKwkJd3JpdGViKGFkZ2wtPm51bV9jYXJkLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBOVU1DQVJEX09XTkVSX1RPX1BDKTsKKwkJd3JpdGViKGFkZ2wtPm51bV9jYXJkLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBOVU1DQVJEX0RFU19GUk9NX1BDKTsKKwkJd3JpdGViKGFkZ2wtPm51bV9jYXJkLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBOVU1DQVJEX0FDS19GUk9NX1BDKTsKKwkJd3JpdGViKDQsIGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIERBVEFfRlJPTV9QQ19SRUFEWSk7CisJCXdyaXRlYigxLCBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBSQU1fSVRfRlJPTV9QQyk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQVBQTElDT00gZHJpdmVyIHJlbGVhc2UgLi4uLiBWMi44LjAgKCRSZXZpc2lvbjogMS4zMCAkKVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIk51bWJlciBvZiBpbnN0YWxsZWQgYm9hcmRzIC4gJWRcbiIsIChpbnQpIG51bWJvYXJkcyk7CisJCXByaW50ayhLRVJOX0lORk8gIlNlZ21lbnQgb2YgYm9hcmQgLi4uLi4uLi4uLi4gJVhcbiIsIChpbnQpIG1lbSk7CisJCXByaW50ayhLRVJOX0lORk8gIkludGVycnVwdCBJUlEgbnVtYmVyIC4uLi4uLi4gJWRcbiIsIChpbnQpIGlycSk7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQk9BUkQ7IGkrKykgeworCQkJaW50IHNlcmlhbDsKKwkJCWNoYXIgYm9hcmRuYW1lWyhTRVJJQUxfTlVNQkVSIC0gVFlQRV9DQVJEKSArIDFdOworCisJCQlpZiAoIWFwYnNbaV0uUmFtSU8pCisJCQkJY29udGludWU7CisKKwkJCWZvciAoc2VyaWFsID0gMDsgc2VyaWFsIDwgU0VSSUFMX05VTUJFUiAtIFRZUEVfQ0FSRDsgc2VyaWFsKyspCisJCQkJYm9hcmRuYW1lW3NlcmlhbF0gPSByZWFkYihhcGJzW2ldLlJhbUlPICsgVFlQRV9DQVJEICsgc2VyaWFsKTsKKwkJCWJvYXJkbmFtZVtzZXJpYWxdID0gMDsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUHJvbSB2ZXJzaW9uIGJvYXJkICVkIC4uLi4uLi4gViVkLiVkICVzIiwKKwkJCSAgICAgICBpKzEsCisJCQkgICAgICAgKGludCkocmVhZGIoYXBic1tJbmRleENhcmRdLlJhbUlPICsgVkVSUykgPj4gNCksCisJCQkgICAgICAgKGludCkocmVhZGIoYXBic1tJbmRleENhcmRdLlJhbUlPICsgVkVSUykgJiAweEYpLAorCQkJICAgICAgIGJvYXJkbmFtZSk7CisKKworCQkJc2VyaWFsID0gKHJlYWRiKGFwYnNbaV0uUmFtSU8gKyBTRVJJQUxfTlVNQkVSKSA8PCAxNikgKyAKKwkJCQkocmVhZGIoYXBic1tpXS5SYW1JTyArIFNFUklBTF9OVU1CRVIgKyAxKSA8PCA4KSArIAorCQkJCShyZWFkYihhcGJzW2ldLlJhbUlPICsgU0VSSUFMX05VTUJFUiArIDIpICk7CisKKwkJCWlmIChzZXJpYWwgIT0gMCkKKwkJCQlwcmludGsoIiBTL04gJWRcbiIsIHNlcmlhbCk7CisJCQllbHNlCisJCQkJcHJpbnRrKCJcbiIpOworCQl9CisJCWlmIChEZXZpY2VFcnJvckNvdW50ICE9IDApCisJCQlwcmludGsoS0VSTl9JTkZPICJEZXZpY2VFcnJvckNvdW50IC4uLi4uLi4uLi4uICVkXG4iLCBEZXZpY2VFcnJvckNvdW50KTsKKwkJaWYgKFJlYWRFcnJvckNvdW50ICE9IDApCisJCQlwcmludGsoS0VSTl9JTkZPICJSZWFkRXJyb3JDb3VudCAuLi4uLi4uLi4uLi4uICVkXG4iLCBSZWFkRXJyb3JDb3VudCk7CisJCWlmIChXcml0ZUVycm9yQ291bnQgIT0gMCkKKwkJCXByaW50ayhLRVJOX0lORk8gIldyaXRlRXJyb3JDb3VudCAuLi4uLi4uLi4uLi4gJWRcbiIsIFdyaXRlRXJyb3JDb3VudCk7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZGbGFnU2xlZXBSZWMpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiUHJvY2VzcyBpbiByZWFkIHBlbmRpbmdcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JPQVJEOyBpKyspIHsKKwkJCWlmIChhcGJzW2ldLlJhbUlPICYmIHdhaXRxdWV1ZV9hY3RpdmUoJmFwYnNbaV0uRmxhZ1NsZWVwU2VuZCkpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiUHJvY2VzcyBpbiB3cml0ZSBwZW5kaW5nIGJvYXJkICVkXG4iLGkrMSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQVBQTElDT00gZHJpdmVyIGlvY3RsLCB1bmtub3duIGZ1bmN0aW9uIGNvZGUgJWRcbiIsY21kKSA7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlEdW1teSA9IHJlYWRiKGFwYnNbSW5kZXhDYXJkXS5SYW1JTyArIFZFUlMpOworCWtmcmVlKGFkZ2wpOworCXJldHVybiAwOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgYXBwbGljb21fc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpbnRzWzRdOworCisJKHZvaWQpIGdldF9vcHRpb25zKHN0ciwgNCwgaW50cyk7CisKKwlpZiAoaW50c1swXSA+IDIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVG9vIG1hbnkgYXJndW1lbnRzIHRvICdhcHBsaWNvbT0nLCBleHBlY3RlZCBtZW0saXJxIG9ubHkuXG4iKTsKKwl9CisKKwlpZiAoaW50c1swXSA8IDIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyJhcHBsaWNvbSBudW1hcmdzOiAlZFxuIiwgaW50c1swXSk7CisJCXJldHVybiAwOworCX0KKworCW1lbSA9IGludHNbMV07CisJaXJxID0gaW50c1syXTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYXBwbGljb209IiwgYXBwbGljb21fc2V0dXApOworCisjZW5kaWYJCQkJLyogTU9EVUxFICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5oIGIvZHJpdmVycy9jaGFyL2FwcGxpY29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1MzBiMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qICRJZDogYXBwbGljb20uaCx2IDEuMiAxOTk5LzA4LzI4IDE1OjA5OjQ5IGR3bXcyIEV4cCAkICovCisKKworI2lmbmRlZiBfX0xJTlVYX0FQUExJQ09NX0hfXworI2RlZmluZSBfX0xJTlVYX0FQUExJQ09NX0hfXworCisKKyNkZWZpbmUgREFUQV9UT19QQ19SRUFEWSAgICAgIDB4MDAKKyNkZWZpbmUgVElDX09XTkVSX1RPX1BDICAgICAgIDB4MDEKKyNkZWZpbmUgTlVNQ0FSRF9PV05FUl9UT19QQyAgIDB4MDIKKyNkZWZpbmUgVElDX0RFU19UT19QQyAgICAgICAgIDB4MDMKKyNkZWZpbmUgTlVNQ0FSRF9ERVNfVE9fUEMgICAgIDB4MDQKKyNkZWZpbmUgREFUQV9GUk9NX1BDX1JFQURZICAgIDB4MDUKKyNkZWZpbmUgVElDX09XTkVSX0ZST01fUEMgICAgIDB4MDYKKyNkZWZpbmUgTlVNQ0FSRF9PV05FUl9GUk9NX1BDIDB4MDcKKyNkZWZpbmUgVElDX0RFU19GUk9NX1BDICAgICAgIDB4MDgKKyNkZWZpbmUgTlVNQ0FSRF9ERVNfRlJPTV9QQyAgIDB4MDkKKyNkZWZpbmUgQUNLX0ZST01fUENfUkVBRFkgICAgIDB4MEUKKyNkZWZpbmUgVElDX0FDS19GUk9NX1BDICAgICAgIDB4MEYKKyNkZWZpbmUgTlVNQ0FSRF9BQ0tfRlJPTV9QQyAgIDB4MDEwCisjZGVmaW5lIFRZUF9BQ0tfRlJPTV9QQyAgICAgICAweDAxMQorI2RlZmluZSBDT05GX0VORF9URVNUICAgICAgICAgMHgwMTIKKyNkZWZpbmUgRVJST1JfQ09ERSAgICAgICAgICAgIDB4MDE2IAorI2RlZmluZSBQQVJBTUVURVJfRVJST1IgICAgICAgMHgwMTggCisjZGVmaW5lIFZFUlMgICAgICAgICAgICAgICAgICAweDAxRSAKKyNkZWZpbmUgUkFNX1RPX1BDICAgICAgICAgICAgIDB4MDQwCisjZGVmaW5lIFJBTV9GUk9NX1BDICAgICAgICAgICAweDAxNzAKKyNkZWZpbmUgVFlQRV9DQVJEICAgICAgICAgICAgIDB4MDNDMAorI2RlZmluZSBTRVJJQUxfTlVNQkVSICAgICAgICAgMHgwM0RBCisjZGVmaW5lIFJBTV9JVF9GUk9NX1BDICAgICAgICAweDAzRkUKKyNkZWZpbmUgUkFNX0lUX1RPX1BDICAgICAgICAgIDB4MDNGRgorCitzdHJ1Y3QgbWFpbGJveHsKKwl1MTYgIHN0amJfY29kZWY7CQkvKiBvZmZzZXQgMDAgKi8KKwlzMTYgIHN0amJfc3RhdHVzOyAgICAgCQkvKiBvZmZzZXQgMDIgKi8KKwl1MTYgIHN0amJfdGljdXNlcl9yb290OwkJLyogb2Zmc2V0IDA0ICovCisJdTggICBzdGpiX3BpZHVzZXJbNF07CQkvKiBvZmZzZXQgMDYgKi8KKwl1MTYgIHN0amJfbW9kZTsJCQkvKiBvZmZzZXQgMEEgKi8KKwl1MTYgIHN0amJfdGltZTsJCQkvKiBvZmZzZXQgMEMgKi8KKwl1MTYgIHN0amJfc3RvcDsJCQkvKiBvZmZzZXQgMEUgKi8KKwl1MTYgIHN0amJfbmZvbmM7CQkvKiBvZmZzZXQgMTAgKi8KKwl1MTYgIHN0amJfbmNhcmQ7CQkvKiBvZmZzZXQgMTIgKi8KKwl1MTYgIHN0amJfbmNoYW47CQkvKiBvZmZzZXQgMTQgKi8KKwl1MTYgIHN0amJfbmVzOwkJCS8qIG9mZnNldCAxNiAqLworCXUxNiAgc3RqYl9uYjsJCQkvKiBvZmZzZXQgMTggKi8KKwl1MTYgIHN0amJfdHlwdmFyOwkJLyogb2Zmc2V0IDFBICovCisJdTMyICBzdGpiX2FkcjsJCQkvKiBvZmZzZXQgMUMgKi8KKwl1MTYgIHN0amJfdGljdXNlcl9kaXNwY3ljOwkvKiBvZmZzZXQgMjAgKi8KKwl1MTYgIHN0amJfdGljdXNlcl9wcm90b2NvbDsJLyogb2Zmc2V0IDIyICovCisJdTggICBzdGpiX2ZpbGxlclsxMl07CQkvKiBvZmZzZXQgMjQgKi8KKwl1OCAgIHN0amJfZGF0YVsyNTZdOwkJLyogb2Zmc2V0IDMwICovCisJfTsKKworc3RydWN0IHN0X3JhbV9pbyAKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGFfdG9fcGNfcmVhZHk7CisJdW5zaWduZWQgY2hhciB0aWNfb3duZXJfdG9fcGM7CisJdW5zaWduZWQgY2hhciBudW1jYXJkX293bmVyX3RvX3BjOworCXVuc2lnbmVkIGNoYXIgdGljX2Rlc190b19wYzsKKwl1bnNpZ25lZCBjaGFyIG51bWNhcmRfZGVzX3RvX3BjOworCXVuc2lnbmVkIGNoYXIgZGF0YV9mcm9tX3BjX3JlYWR5OworCXVuc2lnbmVkIGNoYXIgdGljX293bmVyX2Zyb21fcGM7CisJdW5zaWduZWQgY2hhciBudW1jYXJkX293bmVyX2Zyb21fcGM7CisJdW5zaWduZWQgY2hhciB0aWNfZGVzX2Zyb21fcGM7CisJdW5zaWduZWQgY2hhciBudW1jYXJkX2Rlc19mcm9tX3BjOworCXVuc2lnbmVkIGNoYXIgYWNrX3RvX3BjX3JlYWR5OworCXVuc2lnbmVkIGNoYXIgdGljX2Fja190b19wYzsKKwl1bnNpZ25lZCBjaGFyIG51bWNhcmRfYWNrX3RvX3BjOworCXVuc2lnbmVkIGNoYXIgdHlwX2Fja190b19wYzsKKwl1bnNpZ25lZCBjaGFyIGFja19mcm9tX3BjX3JlYWR5OworCXVuc2lnbmVkIGNoYXIgdGljX2Fja19mcm9tX3BjOworCXVuc2lnbmVkIGNoYXIgbnVtY2FyZF9hY2tfZnJvbV9wYzsKKwl1bnNpZ25lZCBjaGFyIHR5cF9hY2tfZnJvbV9wYzsKKwl1bnNpZ25lZCBjaGFyIGNvbmZfZW5kX3Rlc3RbNF07CisJdW5zaWduZWQgY2hhciBlcnJvcl9jb2RlWzJdOworCXVuc2lnbmVkIGNoYXIgcGFyYW1ldGVyX2Vycm9yWzRdOworCXVuc2lnbmVkIGNoYXIgdGltZV9iYXNlOworCXVuc2lnbmVkIGNoYXIgbnVsX2luYzsKKwl1bnNpZ25lZCBjaGFyIHZlcnM7CisJdW5zaWduZWQgY2hhciBudW1fY2FyZDsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydjFbMzJdOworfTsKKworCisjZW5kaWYgLyogX19MSU5VWF9BUFBMSUNPTV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9jZDE4NjUuaCBiL2RyaXZlcnMvY2hhci9jZDE4NjUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQwOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2NkMTg2NS5oCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogICAgICBsaW51eC9kcml2ZXJzL2NoYXIvY2QxODY1LmggLS0gRGVmaW5pdGlvbnMgcmVsYXRpbmcgdG8gdGhlIENEMTg2NQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgU3BlY2lhbGl4IElPOCsgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgUm9nZXIgV29sZmYgKFIuRS5Xb2xmZkBCaXRXaXphcmQubmwpCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2ICBEbWl0cnkgR29yb2RjaGFuaW4gKHBnbWRzZ0BpYmkuY29tKQorICoKKyAqICAgICAgU3BlY2lhbGl4IHBheXMgZm9yIHRoZSBkZXZlbG9wbWVudCBhbmQgc3VwcG9ydCBvZiB0aGlzIGRyaXZlci4KKyAqICAgICAgUGxlYXNlIERPIGNvbnRhY3QgaW84LWxpbnV4QHNwZWNpYWxpeC5jby51ayBpZiB5b3UgcmVxdWlyZQorICogICAgICBzdXBwb3J0LgorICoKKyAqICAgICAgVGhpcyBkcml2ZXIgd2FzIGRldmVsb3BwZWQgaW4gdGhlIEJpdFdpemFyZCBsaW51eCBkZXZpY2UKKyAqICAgICAgZHJpdmVyIHNlcnZpY2UuIElmIHlvdSByZXF1aXJlIGEgbGludXggZGV2aWNlIGRyaXZlciBmb3IgeW91cgorICogICAgICBwcm9kdWN0LCBwbGVhc2UgY29udGFjdCBkZXZpY2VzQEJpdFdpemFyZC5ubCBmb3IgYSBxdW90ZS4KKyAqCisgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBEcml2aW5nIENEMTgwL0NEMTg2NC9DRDE4NjUgYmFzZWQgZWlnaHRwb3J0IHNlcmlhbCBjYXJkcy4KKyAqLworCisKKy8qIFZhbHVlcyBvZiBjaG9pY2UgZm9yIEludGVycnVwdCBBQ0tzICovCisvKiBUaGVzZSB2YWx1ZXMgYXJlICJvYmxpZ2F0b3J5IiBpZiB5b3UgdXNlIHRoZSByZWdpc3RlciBiYXNlZAorICogaW50ZXJydXB0IGFja25vd2xlZGdlbWVudHMuIFNlZSBwYWdlIDk5LTEwMSBvZiBWMi4wIG9mIHRoZSBDRDE4NjUKKyAqIGRhdGFib29rICovCisjZGVmaW5lIFNYX0FDS19NSU5UICAgICAweDc1ICAgIC8qIGdvZXMgdG8gUElMUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTWF9BQ0tfVElOVCAgICAgMHg3NiAgICAvKiBnb2VzIHRvIFBJTFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1hfQUNLX1JJTlQgICAgIDB4NzcgICAgLyogZ29lcyB0byBQSUxSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIENoaXAgSUQgKGlzIHVzZWQgd2hlbiBjaGlwcyBhciBkYWlzeSBjaGFpbmVkLikgKi8KKyNkZWZpbmUgU1hfSUQgICAgICAgICAgIDB4MTAKKworLyogRGVmaW5pdGlvbnMgZm9yIENpcnJ1cyBMb2dpYyBDTC1DRDE4NnggOC1wb3J0IGFzeW5jIG11eCBjaGlwICovCisgCisjZGVmaW5lIENEMTg2eF9OQ0ggICAgICAgOCAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1RQQyAgICAgICAxNiAgICAgIC8qIFRpY2tzIHBlciBjaGFyYWN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfTkZJRk8JIDgJIC8qIFRYIEZJRk8gc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIEdsb2JhbCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBDRDE4NnhfR0lWUiAgICAgIDB4NDAgICAgLyogR2xvYmFsIEludGVycnVwdCBWZWN0b3IgUmVnaXN0ZXIgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9HSUNSICAgICAgMHg0MSAgICAvKiBHbG9iYWwgSW50ZXJydXB0aW5nIENoYW5uZWwgUmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1BJTFIxICAgICAweDYxICAgIC8qIFByaW9yaXR5IEludGVycnVwdCBMZXZlbCBSZWdpc3RlciAxICAgICAqLworI2RlZmluZSBDRDE4NnhfUElMUjIgICAgIDB4NjIgICAgLyogUHJpb3JpdHkgSW50ZXJydXB0IExldmVsIFJlZ2lzdGVyIDIgICAgICovCisjZGVmaW5lIENEMTg2eF9QSUxSMyAgICAgMHg2MyAgICAvKiBQcmlvcml0eSBJbnRlcnJ1cHQgTGV2ZWwgUmVnaXN0ZXIgMyAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X0NBUiAgICAgICAweDY0ICAgIC8qIENoYW5uZWwgQWNjZXNzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfU1JTUiAgICAgIDB4NjUgICAgLyogQ2hhbm5lbCBBY2Nlc3MgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9HRlJDUiAgICAgMHg2YiAgICAvKiBHbG9iYWwgRmlybXdhcmUgUmV2aXNpb24gQ29kZSBSZWdpc3RlciAgKi8KKyNkZWZpbmUgQ0QxODZ4X1BQUkggICAgICAweDcwICAgIC8qIFByZXNjYWxlciBQZXJpb2QgUmVnaXN0ZXIgSGlnaCAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfUFBSTCAgICAgIDB4NzEgICAgLyogUHJlc2NhbGVyIFBlcmlvZCBSZWdpc3RlciBMb3cgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9SRFIgICAgICAgMHg3OCAgICAvKiBSZWNlaXZlciBEYXRhIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1JDU1IgICAgICAweDdhICAgIC8qIFJlY2VpdmVyIENoYXJhY3RlciBTdGF0dXMgUmVnaXN0ZXIgICAgICAqLworI2RlZmluZSBDRDE4NnhfVERSICAgICAgIDB4N2IgICAgLyogVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9FT0lSICAgICAgMHg3ZiAgICAvKiBFbmQgb2YgSW50ZXJydXB0IFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X01SQVIgICAgICAweDc1ICAgIC8qIE1vZGVtIFJlcXVlc3QgQWNrbm93bGVkZ2UgcmVnaXN0ZXIgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1RSQVIgICAgICAweDc2ICAgIC8qIFRyYW5zbWl0IFJlcXVlc3QgQWNrbm93bGVkZ2UgcmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1JSQVIgICAgICAweDc3ICAgIC8qIFJlY2VpdmUgUmVxdWVzdCBBY2tub3dsZWRnZSByZWdpc3RlciAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1NSQ1IgICAgICAweDY2ICAgIC8qIFNlcnZpY2UgUmVxdWVzdCBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICAqLworCisvKiBDaGFubmVsIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIENEMTg2eF9DQ1IgICAgICAgMHgwMSAgICAvKiBDaGFubmVsIENvbW1hbmQgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X0lFUiAgICAgICAweDAyICAgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfQ09SMSAgICAgIDB4MDMgICAgLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9DT1IyICAgICAgMHgwNCAgICAvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X0NPUjMgICAgICAweDA1ICAgIC8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDMgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfQ0NTUiAgICAgIDB4MDYgICAgLyogQ2hhbm5lbCBDb250cm9sIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9SRENSICAgICAgMHgwNyAgICAvKiBSZWNlaXZlIERhdGEgQ291bnQgUmVnaXN0ZXIgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1NDSFIxICAgICAweDA5ICAgIC8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDEgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfU0NIUjIgICAgIDB4MGEgICAgLyogU3BlY2lhbCBDaGFyYWN0ZXIgUmVnaXN0ZXIgMiAgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9TQ0hSMyAgICAgMHgwYiAgICAvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciAzICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X1NDSFI0ICAgICAweDBjICAgIC8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDQgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfTUNPUjEgICAgIDB4MTAgICAgLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiAxIFJlZ2lzdGVyICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9NQ09SMiAgICAgMHgxMSAgICAvKiBNb2RlbSBDaGFuZ2UgT3B0aW9uIDIgUmVnaXN0ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X01DUiAgICAgICAweDEyICAgIC8qIE1vZGVtIENoYW5nZSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfUlRQUiAgICAgIDB4MTggICAgLyogUmVjZWl2ZSBUaW1lb3V0IFBlcmlvZCBSZWdpc3RlciAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9NU1ZSICAgICAgMHgyOCAgICAvKiBNb2RlbSBTaWduYWwgVmFsdWUgUmVnaXN0ZXIgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X01TVlJUUyAgICAweDI5ICAgIC8qIE1vZGVtIFNpZ25hbCBWYWx1ZSBSZWdpc3RlciAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfTVNWRFRSICAgIDB4MmEgICAgLyogTW9kZW0gU2lnbmFsIFZhbHVlIFJlZ2lzdGVyICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9SQlBSSCAgICAgMHgzMSAgICAvKiBSZWNlaXZlIEJhdWQgUmF0ZSBQZXJpb2QgUmVnaXN0ZXIgSGlnaCAgKi8KKyNkZWZpbmUgQ0QxODZ4X1JCUFJMICAgICAweDMyICAgIC8qIFJlY2VpdmUgQmF1ZCBSYXRlIFBlcmlvZCBSZWdpc3RlciBMb3cgICAqLworI2RlZmluZSBDRDE4NnhfVEJQUkggICAgIDB4MzkgICAgLyogVHJhbnNtaXQgQmF1ZCBSYXRlIFBlcmlvZCBSZWdpc3RlciBIaWdoICovCisjZGVmaW5lIENEMTg2eF9UQlBSTCAgICAgMHgzYSAgICAvKiBUcmFuc21pdCBCYXVkIFJhdGUgUGVyaW9kIFJlZ2lzdGVyIExvdyAgKi8KKworCisvKiBHbG9iYWwgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAoUi9XKSAqLworCisjZGVmaW5lIEdJVlJfSVRNQVNLICAgICAweDA3ICAgICAvKiBJbnRlcnJ1cHQgdHlwZSBtYXNrICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdJVlJfSVRfTU9ERU0gICAweDAxICAgIC8qIE1vZGVtIFNpZ25hbCBDaGFuZ2UgSW50ZXJydXB0ICAgICAgICAgICAqLworI2RlZmluZSAgR0lWUl9JVF9UWCAgICAgIDB4MDIgICAgLyogVHJhbnNtaXQgRGF0YSBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBHSVZSX0lUX1JDViAgICAgMHgwMyAgICAvKiBSZWNlaXZlIEdvb2QgRGF0YSBJbnRlcnJ1cHQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdJVlJfSVRfUkVYQyAgICAweDA3ICAgIC8qIFJlY2VpdmUgRXhjZXB0aW9uIEludGVycnVwdCAgICAgICAgICAgICAqLworCisKKy8qIEdsb2JhbCBJbnRlcnJ1cHQgQ2hhbm5lbCBSZWdpc3RlciAoUi9XKSAqLworIAorI2RlZmluZSBHSUNSX0NIQU4gICAgICAgMHgxYyAgICAvKiBDaGFubmVsIE51bWJlciBNYXNrICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0lDUl9DSEFOX09GRiAgIDIgICAgICAgLyogQ2hhbm5lbCBOdW1iZXIgc2hpZnQgICAgICAgICAgICAgICAgICAgICovCisKKworLyogQ2hhbm5lbCBBZGRyZXNzIFJlZ2lzdGVyIChSL1cpICovCisKKyNkZWZpbmUgQ0FSX0NIQU4gICAgICAgIDB4MDcgICAgLyogQ2hhbm5lbCBOdW1iZXIgTWFzayAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBUl9BNyAgICAgICAgICAweDA4ICAgIC8qIEE3IEFkZHJlc3MgRXh0ZW5zaW9uICh1bnVzZWQpICAgICAgICAgICAqLworCisKKy8qIFJlY2VpdmUgQ2hhcmFjdGVyIFN0YXR1cyBSZWdpc3RlciAoUi9PKSAqLworCisjZGVmaW5lIFJDU1JfVE9VVCAgICAgICAweDgwICAgIC8qIFJ4IFRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1NSX1NDREVUICAgICAgMHg3MCAgICAvKiBTcGVjaWFsIENoYXJhY3RlciBEZXRlY3RlZCBNYXNrICAgICAgICAgKi8KKyNkZWZpbmUgIFJDU1JfTk9fU0MgICAgICAweDAwICAgLyogTm8gU3BlY2lhbCBDaGFyYWN0ZXJzIERldGVjdGVkICAgICAgICAgICovCisjZGVmaW5lICBSQ1NSX1NDXzEgICAgICAgMHgxMCAgIC8qIFNwZWNpYWwgQ2hhciAxIChvciAxICYgMykgRGV0ZWN0ZWQgICAgICAqLworI2RlZmluZSAgUkNTUl9TQ18yICAgICAgIDB4MjAgICAvKiBTcGVjaWFsIENoYXIgMiAob3IgMiAmIDQpIERldGVjdGVkICAgICAgKi8KKyNkZWZpbmUgIFJDU1JfU0NfMyAgICAgICAweDMwICAgLyogU3BlY2lhbCBDaGFyIDMgRGV0ZWN0ZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBSQ1NSX1NDXzQgICAgICAgMHg0MCAgIC8qIFNwZWNpYWwgQ2hhciA0IERldGVjdGVkICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1NSX0JSRUFLICAgICAgMHgwOCAgICAvKiBCcmVhayBoYXMgYmVlbiBkZXRlY3RlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNTUl9QRSAgICAgICAgIDB4MDQgICAgLyogUGFyaXR5IEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDU1JfRkUgICAgICAgICAweDAyICAgIC8qIEZyYW1lIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1NSX09FICAgICAgICAgMHgwMSAgICAvKiBPdmVycnVuIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBDaGFubmVsIENvbW1hbmQgUmVnaXN0ZXIgKFIvVykgKGNvbW1hbmRzIGluIGdyb3VwcyBjYW4gYmUgT1ItZWQpICovCisKKyNkZWZpbmUgQ0NSX0hBUkRSRVNFVCAgIDB4ODEgICAgLyogUmVzZXQgdGhlIGNoaXAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0NSX1NPRlRSRVNFVCAgIDB4ODAgICAgLyogU29mdCBDaGFubmVsIFJlc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0NSX0NPUkNIRzEgICAgIDB4NDIgICAgLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSBDaGFuZ2VkICAgICAgICovCisjZGVmaW5lIENDUl9DT1JDSEcyICAgICAweDQ0ICAgIC8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDIgQ2hhbmdlZCAgICAgICAqLworI2RlZmluZSBDQ1JfQ09SQ0hHMyAgICAgMHg0OCAgICAvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAzIENoYW5nZWQgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDEgICAgICAgMHgyMSAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDEgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDIgICAgICAgMHgyMiAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDIgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDMgICAgICAgMHgyMyAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDMgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDQgICAgICAgMHgyNCAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDQgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfVFhFTiAgICAgICAgMHgxOCAgICAvKiBFbmFibGUgVHJhbnNtaXR0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NSX1JYRU4gICAgICAgIDB4MTIgICAgLyogRW5hYmxlIFJlY2VpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0NSX1RYRElTICAgICAgIDB4MTQgICAgLyogRGlzYWJsZSBUcmFuc21pdHRlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENDUl9SWERJUyAgICAgICAweDExICAgIC8qIERpc2FibGUgUmVjZWl2ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKFIvVykgKi8KKworI2RlZmluZSBJRVJfRFNSICAgICAgICAgMHg4MCAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIERTUiBjaGFuZ2UgICAgICAgICAgKi8KKyNkZWZpbmUgSUVSX0NEICAgICAgICAgIDB4NDAgICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBDRCBjaGFuZ2UgICAgICAgICAgICovCisjZGVmaW5lIElFUl9DVFMgICAgICAgICAweDIwICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gQ1RTIGNoYW5nZSAgICAgICAgICAqLworI2RlZmluZSBJRVJfUlhEICAgICAgICAgMHgxMCAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIFJlY2VpdmUgRGF0YSAgICAgICAgKi8KKyNkZWZpbmUgSUVSX1JYU0MgICAgICAgIDB4MDggICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBSZWNlaXZlIFNwZWMuIENoYXIgICovCisjZGVmaW5lIElFUl9UWFJEWSAgICAgICAweDA0ICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gVFggRklGTyBlbXB0eSAgICAgICAqLworI2RlZmluZSBJRVJfVFhFTVBUWSAgICAgMHgwMiAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIFRYIGNvbXBsZXRlbHkgZW1wdHkgKi8KKyNkZWZpbmUgSUVSX1JFVCAgICAgICAgIDB4MDEgICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBSWCBFeGMuIFRpbWVvdXQgICAgICovCisKKworLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSAoUi9XKSAqLworCisjZGVmaW5lIENPUjFfT0REUCAgICAgICAweDgwICAgIC8qIE9kZCBQYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IxX1BBUk1PREUgICAgMHg2MCAgICAvKiBQYXJpdHkgTW9kZSBtYXNrICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfTk9QQVIgICAgICAweDAwICAgLyogTm8gUGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxX0ZPUkNFUEFSICAgMHgyMCAgIC8qIEZvcmNlIFBhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV9OT1JNUEFSICAgIDB4NDAgICAvKiBOb3JtYWwgUGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SMV9JR05PUkUgICAgIDB4MTAgICAgLyogSWdub3JlIFBhcml0eSBvbiBSWCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjFfU1RPUEJJVFMgICAweDBjICAgIC8qIE51bWJlciBvZiBTdG9wIEJpdHMgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV8xU0IgICAgICAgIDB4MDAgICAvKiAxIFN0b3AgQml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfMTVTQiAgICAgICAweDA0ICAgLyogMS41IFN0b3AgQml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxXzJTQiAgICAgICAgMHgwOCAgIC8qIDIgU3RvcCBCaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IxX0NIQVJMRU4gICAgMHgwMyAgICAvKiBDaGFyYWN0ZXIgTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfNUJJVFMgICAgICAweDAwICAgLyogNSBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxXzZCSVRTICAgICAgMHgwMSAgIC8qIDYgYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV83QklUUyAgICAgIDB4MDIgICAvKiA3IGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfOEJJVFMgICAgICAweDAzICAgLyogOCBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMiAoUi9XKSAqLworCisjZGVmaW5lIENPUjJfSVhNICAgICAgICAweDgwICAgIC8qIEltcGxpZWQgWE9OIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IyX1RYSUJFICAgICAgMHg0MCAgICAvKiBFbmFibGUgSW4tQmFuZCAoWE9OL1hPRkYpIEZsb3cgQ29udHJvbCAgKi8KKyNkZWZpbmUgQ09SMl9FVEMgICAgICAgIDB4MjAgICAgLyogRW1iZWRkZWQgVHggQ29tbWFuZHMgRW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjJfTExNICAgICAgICAweDEwICAgIC8qIExvY2FsIExvb3BiYWNrIE1vZGUgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IyX1JMTSAgICAgICAgMHgwOCAgICAvKiBSZW1vdGUgTG9vcGJhY2sgTW9kZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SMl9SVFNBTyAgICAgIDB4MDQgICAgLyogUlRTIEF1dG9tYXRpYyBPdXRwdXQgRW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjJfQ1RTQUUgICAgICAweDAyICAgIC8qIENUUyBBdXRvbWF0aWMgRW5hYmxlICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IyX0RTUkFFICAgICAgMHgwMSAgICAvKiBEU1IgQXV0b21hdGljIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAzIChSL1cpICovCisKKyNkZWZpbmUgQ09SM19YT05DSCAgICAgIDB4ODAgICAgLyogWE9OIGlzIGEgcGFpciBvZiBjaGFyYWN0ZXJzICgxICYgMykgICAgICovCisjZGVmaW5lIENPUjNfWE9GRkNIICAgICAweDQwICAgIC8qIFhPRkYgaXMgYSBwYWlyIG9mIGNoYXJhY3RlcnMgKDIgJiA0KSAgICAqLworI2RlZmluZSBDT1IzX0ZDVCAgICAgICAgMHgyMCAgICAvKiBGbG93LUNvbnRyb2wgVHJhbnNwYXJlbmN5IE1vZGUgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SM19TQ0RFICAgICAgIDB4MTAgICAgLyogU3BlY2lhbCBDaGFyYWN0ZXIgRGV0ZWN0aW9uIEVuYWJsZSAgICAgICovCisjZGVmaW5lIENPUjNfUlhUSCAgICAgICAweDBmICAgIC8qIFJYIEZJRk8gVGhyZXNob2xkIHZhbHVlICgxLTgpICAgICAgICAgICAqLworCisKKy8qIENoYW5uZWwgQ29udHJvbCBTdGF0dXMgUmVnaXN0ZXIgKFIvTykgKi8KKworI2RlZmluZSBDQ1NSX1JYRU4gICAgICAgMHg4MCAgICAvKiBSZWNlaXZlciBFbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NTUl9SWEZMT0ZGICAgIDB4NDAgICAgLyogUmVjZWl2ZSBGbG93IE9mZiAoWE9GRiB3YXMgc2VudCkgICAgICAgICovCisjZGVmaW5lIENDU1JfUlhGTE9OICAgICAweDIwICAgIC8qIFJlY2VpdmUgRmxvdyBPbiAoWE9OIHdhcyBzZW50KSAgICAgICAgICAqLworI2RlZmluZSBDQ1NSX1RYRU4gICAgICAgMHgwOCAgICAvKiBUcmFuc21pdHRlciBFbmFibGVkICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NTUl9UWEZMT0ZGICAgIDB4MDQgICAgLyogVHJhbnNtaXQgRmxvdyBPZmYgKGdvdCBYT0ZGKSAgICAgICAgICAgICovCisjZGVmaW5lIENDU1JfVFhGTE9OICAgICAweDAyICAgIC8qIFRyYW5zbWl0IEZsb3cgT24gKGdvdCBYT04pICAgICAgICAgICAgICAqLworCisKKy8qIE1vZGVtIENoYW5nZSBPcHRpb24gUmVnaXN0ZXIgMSAoUi9XKSAqLworCisjZGVmaW5lIE1DT1IxX0RTUlpEICAgICAweDgwICAgIC8qIERldGVjdCAwLT4xIHRyYW5zaXRpb24gb2YgRFNSICAgICAgICAgICAqLworI2RlZmluZSBNQ09SMV9DRFpEICAgICAgMHg0MCAgICAvKiBEZXRlY3QgMC0+MSB0cmFuc2l0aW9uIG9mIENEICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUNPUjFfQ1RTWkQgICAgIDB4MjAgICAgLyogRGV0ZWN0IDAtPjEgdHJhbnNpdGlvbiBvZiBDVFMgICAgICAgICAgICovCisjZGVmaW5lIE1DT1IxX0RUUlRIICAgICAweDBmICAgIC8qIEF1dG8gRFRSIGZsb3cgY29udHJvbCBUaHJlc2hvbGQgKDEtOCkgICAqLworI2RlZmluZSAgTUNPUjFfTk9EVFJGQyAgIDB4MCAgICAgLyogQXV0b21hdGljIERUUiBmbG93IGNvbnRyb2wgZGlzYWJsZWQgICAgICovCisKKworLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiBSZWdpc3RlciAyIChSL1cpICovCisKKyNkZWZpbmUgTUNPUjJfRFNST0QgICAgIDB4ODAgICAgLyogRGV0ZWN0IDEtPjAgdHJhbnNpdGlvbiBvZiBEU1IgICAgICAgICAgICovCisjZGVmaW5lIE1DT1IyX0NET0QgICAgICAweDQwICAgIC8qIERldGVjdCAxLT4wIHRyYW5zaXRpb24gb2YgQ0QgICAgICAgICAgICAqLworI2RlZmluZSBNQ09SMl9DVFNPRCAgICAgMHgyMCAgICAvKiBEZXRlY3QgMS0+MCB0cmFuc2l0aW9uIG9mIENUUyAgICAgICAgICAgKi8KKworLyogTW9kZW0gQ2hhbmdlIFJlZ2lzdGVyIChSL1cpICovCisKKyNkZWZpbmUgTUNSX0RTUkNIRyAgICAgIDB4ODAgICAgLyogRFNSIENoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1DUl9DRENIRyAgICAgICAweDQwICAgIC8qIENEIENoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQ1JfQ1RTQ0hHICAgICAgMHgyMCAgICAvKiBDVFMgQ2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBNb2RlbSBTaWduYWwgVmFsdWUgUmVnaXN0ZXIgKFIvVykgKi8KKworI2RlZmluZSBNU1ZSX0RTUiAgICAgICAgMHg4MCAgICAvKiBDdXJyZW50IHN0YXRlIG9mIERTUiBpbnB1dCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVNWUl9DRCAgICAgICAgIDB4NDAgICAgLyogQ3VycmVudCBzdGF0ZSBvZiBDRCBpbnB1dCAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1TVlJfQ1RTICAgICAgICAweDIwICAgIC8qIEN1cnJlbnQgc3RhdGUgb2YgQ1RTIGlucHV0ICAgICAgICAgICAgICAqLworI2RlZmluZSBNU1ZSX0RUUiAgICAgICAgMHgwMiAgICAvKiBDdXJyZW50IHN0YXRlIG9mIERUUiBvdXRwdXQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVNWUl9SVFMgICAgICAgIDB4MDEgICAgLyogQ3VycmVudCBzdGF0ZSBvZiBSVFMgb3V0cHV0ICAgICAgICAgICAgICovCisKKworLyogRXNjYXBlIGNoYXJhY3RlcnMgKi8KKworI2RlZmluZSBDRDE4NnhfQ19FU0MgICAgIDB4MDAgICAgLyogRXNjYXBlIGNoYXJhY3RlciAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTg2eF9DX1NCUksgICAgMHg4MSAgICAvKiBTdGFydCBzZW5kaW5nIEJSRUFLICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODZ4X0NfREVMQVkgICAweDgyICAgIC8qIERlbGF5IG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4NnhfQ19FQlJLICAgIDB4ODMgICAgLyogU3RvcCBzZW5kaW5nIEJSRUFLICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgU1JTUl9SUkVRaW50ICAgICAweDEwICAgIC8qIFRoaXMgY2hpcCB3YW50cyAicmVjIiBzZXJ2aWNlZCAgICAgICAgICAqLworI2RlZmluZSBTUlNSX1RSRVFpbnQgICAgIDB4MDQgICAgLyogVGhpcyBjaGlwIHdhbnRzICJ0cmFuc21pdCIgc2VydmljZWQgICAgICovCisjZGVmaW5lIFNSU1JfTVJFUWludCAgICAgMHgwMSAgICAvKiBUaGlzIGNoaXAgd2FudHMgIm1kbSBjaGFuZ2UiIHNlcnZpY2VkICAgKi8KKworCisKKyNkZWZpbmUgU1JDUl9QS0dUWVBFICAgIDB4ODAKKyNkZWZpbmUgU1JDUl9SRUdBQ0tFTiAgIDB4NDAKKyNkZWZpbmUgU1JDUl9EQUlTWUVOICAgIDB4MjAKKyNkZWZpbmUgU1JDUl9HTE9CUFJJICAgIDB4MTAKKyNkZWZpbmUgU1JDUl9VTkZBSVIgICAgIDB4MDgKKyNkZWZpbmUgU1JDUl9BVVRPUFJJICAgIDB4MDIKKyNkZWZpbmUgU1JDUl9QUklTRUwgICAgIDB4MDEKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jIGIvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDZkZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYwpAQCAtMCwwICsxLDY3MiBAQAorLyoKKyAqIGNvbnNvbGVtYXAuYworICoKKyAqIE1hcHBpbmcgZnJvbSBpbnRlcm5hbCBjb2RlIChzdWNoIGFzIExhdGluLTEgb3IgVW5pY29kZSBvciBJQk0gUEMgY29kZSkKKyAqIHRvIGZvbnQgcG9zaXRpb25zLgorICoKKyAqIGFlYiwgOTUwMjEwCisgKgorICogU3VwcG9ydCBmb3IgbXVsdGlwbGUgdW5pbWFwcyBieSBKYWt1YiBKZWxpbmVrIDxqakB1bHRyYS5saW51eC5jej4sIEp1bHkgMTk5OAorICoKKyAqIEZpeCBidWcgaW4gaW52ZXJzZSB0cmFuc2xhdGlvbi4gU3RhbmlzbGF2IFZvcm9ueWkgPHN0YXNAY250aS51YW5ldC5raGFya292LnVhPiwgRGVjIDE5OTgKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGVtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0cmFuc2xhdGlvbnNbXVsyNTZdID0geworICAvKiA4LWJpdCBMYXRpbi0xIG1hcHBlZCB0byBVbmljb2RlIC0tIHRyaXZpYWwgbWFwcGluZyAqLworICB7CisgICAgMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisgICAgMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLCAweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisgICAgMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLCAweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisgICAgMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLCAweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisgICAgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisgICAgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisgICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLCAweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisgICAgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisgICAgMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisgICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisgICAgMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLCAweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisgICAgMHgwMDgwLCAweDAwODEsIDB4MDA4MiwgMHgwMDgzLCAweDAwODQsIDB4MDA4NSwgMHgwMDg2LCAweDAwODcsCisgICAgMHgwMDg4LCAweDAwODksIDB4MDA4YSwgMHgwMDhiLCAweDAwOGMsIDB4MDA4ZCwgMHgwMDhlLCAweDAwOGYsCisgICAgMHgwMDkwLCAweDAwOTEsIDB4MDA5MiwgMHgwMDkzLCAweDAwOTQsIDB4MDA5NSwgMHgwMDk2LCAweDAwOTcsCisgICAgMHgwMDk4LCAweDAwOTksIDB4MDA5YSwgMHgwMDliLCAweDAwOWMsIDB4MDA5ZCwgMHgwMDllLCAweDAwOWYsCisgICAgMHgwMGEwLCAweDAwYTEsIDB4MDBhMiwgMHgwMGEzLCAweDAwYTQsIDB4MDBhNSwgMHgwMGE2LCAweDAwYTcsCisgICAgMHgwMGE4LCAweDAwYTksIDB4MDBhYSwgMHgwMGFiLCAweDAwYWMsIDB4MDBhZCwgMHgwMGFlLCAweDAwYWYsCisgICAgMHgwMGIwLCAweDAwYjEsIDB4MDBiMiwgMHgwMGIzLCAweDAwYjQsIDB4MDBiNSwgMHgwMGI2LCAweDAwYjcsCisgICAgMHgwMGI4LCAweDAwYjksIDB4MDBiYSwgMHgwMGJiLCAweDAwYmMsIDB4MDBiZCwgMHgwMGJlLCAweDAwYmYsCisgICAgMHgwMGMwLCAweDAwYzEsIDB4MDBjMiwgMHgwMGMzLCAweDAwYzQsIDB4MDBjNSwgMHgwMGM2LCAweDAwYzcsCisgICAgMHgwMGM4LCAweDAwYzksIDB4MDBjYSwgMHgwMGNiLCAweDAwY2MsIDB4MDBjZCwgMHgwMGNlLCAweDAwY2YsCisgICAgMHgwMGQwLCAweDAwZDEsIDB4MDBkMiwgMHgwMGQzLCAweDAwZDQsIDB4MDBkNSwgMHgwMGQ2LCAweDAwZDcsCisgICAgMHgwMGQ4LCAweDAwZDksIDB4MDBkYSwgMHgwMGRiLCAweDAwZGMsIDB4MDBkZCwgMHgwMGRlLCAweDAwZGYsCisgICAgMHgwMGUwLCAweDAwZTEsIDB4MDBlMiwgMHgwMGUzLCAweDAwZTQsIDB4MDBlNSwgMHgwMGU2LCAweDAwZTcsCisgICAgMHgwMGU4LCAweDAwZTksIDB4MDBlYSwgMHgwMGViLCAweDAwZWMsIDB4MDBlZCwgMHgwMGVlLCAweDAwZWYsCisgICAgMHgwMGYwLCAweDAwZjEsIDB4MDBmMiwgMHgwMGYzLCAweDAwZjQsIDB4MDBmNSwgMHgwMGY2LCAweDAwZjcsCisgICAgMHgwMGY4LCAweDAwZjksIDB4MDBmYSwgMHgwMGZiLCAweDAwZmMsIDB4MDBmZCwgMHgwMGZlLCAweDAwZmYKKyAgfSwgCisgIC8qIFZUMTAwIGdyYXBoaWNzIG1hcHBlZCB0byBVbmljb2RlICovCisgIHsKKyAgICAweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKyAgICAweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsIDB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKyAgICAweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsIDB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKyAgICAweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsIDB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKyAgICAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDIxOTIsIDB4MjE5MCwgMHgyMTkxLCAweDIxOTMsIDB4MDAyZiwKKyAgICAweDI1ODgsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsIDB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDBhMCwKKyAgICAweDI1YzYsIDB4MjU5MiwgMHgyNDA5LCAweDI0MGMsIDB4MjQwZCwgMHgyNDBhLCAweDAwYjAsIDB4MDBiMSwKKyAgICAweDI1OTEsIDB4MjQwYiwgMHgyNTE4LCAweDI1MTAsIDB4MjUwYywgMHgyNTE0LCAweDI1M2MsIDB4MjNiYSwKKyAgICAweDIzYmIsIDB4MjUwMCwgMHgyM2JjLCAweDIzYmQsIDB4MjUxYywgMHgyNTI0LCAweDI1MzQsIDB4MjUyYywKKyAgICAweDI1MDIsIDB4MjI2NCwgMHgyMjY1LCAweDAzYzAsIDB4MjI2MCwgMHgwMGEzLCAweDAwYjcsIDB4MDA3ZiwKKyAgICAweDAwODAsIDB4MDA4MSwgMHgwMDgyLCAweDAwODMsIDB4MDA4NCwgMHgwMDg1LCAweDAwODYsIDB4MDA4NywKKyAgICAweDAwODgsIDB4MDA4OSwgMHgwMDhhLCAweDAwOGIsIDB4MDA4YywgMHgwMDhkLCAweDAwOGUsIDB4MDA4ZiwKKyAgICAweDAwOTAsIDB4MDA5MSwgMHgwMDkyLCAweDAwOTMsIDB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywKKyAgICAweDAwOTgsIDB4MDA5OSwgMHgwMDlhLCAweDAwOWIsIDB4MDA5YywgMHgwMDlkLCAweDAwOWUsIDB4MDA5ZiwKKyAgICAweDAwYTAsIDB4MDBhMSwgMHgwMGEyLCAweDAwYTMsIDB4MDBhNCwgMHgwMGE1LCAweDAwYTYsIDB4MDBhNywKKyAgICAweDAwYTgsIDB4MDBhOSwgMHgwMGFhLCAweDAwYWIsIDB4MDBhYywgMHgwMGFkLCAweDAwYWUsIDB4MDBhZiwKKyAgICAweDAwYjAsIDB4MDBiMSwgMHgwMGIyLCAweDAwYjMsIDB4MDBiNCwgMHgwMGI1LCAweDAwYjYsIDB4MDBiNywKKyAgICAweDAwYjgsIDB4MDBiOSwgMHgwMGJhLCAweDAwYmIsIDB4MDBiYywgMHgwMGJkLCAweDAwYmUsIDB4MDBiZiwKKyAgICAweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzMsIDB4MDBjNCwgMHgwMGM1LCAweDAwYzYsIDB4MDBjNywKKyAgICAweDAwYzgsIDB4MDBjOSwgMHgwMGNhLCAweDAwY2IsIDB4MDBjYywgMHgwMGNkLCAweDAwY2UsIDB4MDBjZiwKKyAgICAweDAwZDAsIDB4MDBkMSwgMHgwMGQyLCAweDAwZDMsIDB4MDBkNCwgMHgwMGQ1LCAweDAwZDYsIDB4MDBkNywKKyAgICAweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsIDB4MDBkYywgMHgwMGRkLCAweDAwZGUsIDB4MDBkZiwKKyAgICAweDAwZTAsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsIDB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywKKyAgICAweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsIDB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwKKyAgICAweDAwZjAsIDB4MDBmMSwgMHgwMGYyLCAweDAwZjMsIDB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywKKyAgICAweDAwZjgsIDB4MDBmOSwgMHgwMGZhLCAweDAwZmIsIDB4MDBmYywgMHgwMGZkLCAweDAwZmUsIDB4MDBmZgorICB9LAorICAvKiBJQk0gQ29kZXBhZ2UgNDM3IG1hcHBlZCB0byBVbmljb2RlICovCisgIHsKKyAgICAweDAwMDAsIDB4MjYzYSwgMHgyNjNiLCAweDI2NjUsIDB4MjY2NiwgMHgyNjYzLCAweDI2NjAsIDB4MjAyMiwgCisgICAgMHgyNWQ4LCAweDI1Y2IsIDB4MjVkOSwgMHgyNjQyLCAweDI2NDAsIDB4MjY2YSwgMHgyNjZiLCAweDI2M2MsCisgICAgMHgyNWI2LCAweDI1YzAsIDB4MjE5NSwgMHgyMDNjLCAweDAwYjYsIDB4MDBhNywgMHgyNWFjLCAweDIxYTgsCisgICAgMHgyMTkxLCAweDIxOTMsIDB4MjE5MiwgMHgyMTkwLCAweDIyMWYsIDB4MjE5NCwgMHgyNWIyLCAweDI1YmMsCisgICAgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisgICAgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisgICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLCAweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisgICAgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisgICAgMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisgICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisgICAgMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLCAweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDIzMDIsCisgICAgMHgwMGM3LCAweDAwZmMsIDB4MDBlOSwgMHgwMGUyLCAweDAwZTQsIDB4MDBlMCwgMHgwMGU1LCAweDAwZTcsCisgICAgMHgwMGVhLCAweDAwZWIsIDB4MDBlOCwgMHgwMGVmLCAweDAwZWUsIDB4MDBlYywgMHgwMGM0LCAweDAwYzUsCisgICAgMHgwMGM5LCAweDAwZTYsIDB4MDBjNiwgMHgwMGY0LCAweDAwZjYsIDB4MDBmMiwgMHgwMGZiLCAweDAwZjksCisgICAgMHgwMGZmLCAweDAwZDYsIDB4MDBkYywgMHgwMGEyLCAweDAwYTMsIDB4MDBhNSwgMHgyMGE3LCAweDAxOTIsCisgICAgMHgwMGUxLCAweDAwZWQsIDB4MDBmMywgMHgwMGZhLCAweDAwZjEsIDB4MDBkMSwgMHgwMGFhLCAweDAwYmEsCisgICAgMHgwMGJmLCAweDIzMTAsIDB4MDBhYywgMHgwMGJkLCAweDAwYmMsIDB4MDBhMSwgMHgwMGFiLCAweDAwYmIsCisgICAgMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLCAweDI1MjQsIDB4MjU2MSwgMHgyNTYyLCAweDI1NTYsCisgICAgMHgyNTU1LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LCAweDI1NWQsIDB4MjU1YywgMHgyNTViLCAweDI1MTAsCisgICAgMHgyNTE0LCAweDI1MzQsIDB4MjUyYywgMHgyNTFjLCAweDI1MDAsIDB4MjUzYywgMHgyNTVlLCAweDI1NWYsCisgICAgMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LCAweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDI1NjcsCisgICAgMHgyNTY4LCAweDI1NjQsIDB4MjU2NSwgMHgyNTU5LCAweDI1NTgsIDB4MjU1MiwgMHgyNTUzLCAweDI1NmIsCisgICAgMHgyNTZhLCAweDI1MTgsIDB4MjUwYywgMHgyNTg4LCAweDI1ODQsIDB4MjU4YywgMHgyNTkwLCAweDI1ODAsCisgICAgMHgwM2IxLCAweDAwZGYsIDB4MDM5MywgMHgwM2MwLCAweDAzYTMsIDB4MDNjMywgMHgwMGI1LCAweDAzYzQsCisgICAgMHgwM2E2LCAweDAzOTgsIDB4MDNhOSwgMHgwM2I0LCAweDIyMWUsIDB4MDNjNiwgMHgwM2I1LCAweDIyMjksCisgICAgMHgyMjYxLCAweDAwYjEsIDB4MjI2NSwgMHgyMjY0LCAweDIzMjAsIDB4MjMyMSwgMHgwMGY3LCAweDIyNDgsCisgICAgMHgwMGIwLCAweDIyMTksIDB4MDBiNywgMHgyMjFhLCAweDIwN2YsIDB4MDBiMiwgMHgyNWEwLCAweDAwYTAKKyAgfSwgCisgIC8qIFVzZXIgbWFwcGluZyAtLSBkZWZhdWx0IHRvIGNvZGVzIGZvciBkaXJlY3QgZm9udCBtYXBwaW5nICovCisgIHsKKyAgICAweGYwMDAsIDB4ZjAwMSwgMHhmMDAyLCAweGYwMDMsIDB4ZjAwNCwgMHhmMDA1LCAweGYwMDYsIDB4ZjAwNywKKyAgICAweGYwMDgsIDB4ZjAwOSwgMHhmMDBhLCAweGYwMGIsIDB4ZjAwYywgMHhmMDBkLCAweGYwMGUsIDB4ZjAwZiwKKyAgICAweGYwMTAsIDB4ZjAxMSwgMHhmMDEyLCAweGYwMTMsIDB4ZjAxNCwgMHhmMDE1LCAweGYwMTYsIDB4ZjAxNywKKyAgICAweGYwMTgsIDB4ZjAxOSwgMHhmMDFhLCAweGYwMWIsIDB4ZjAxYywgMHhmMDFkLCAweGYwMWUsIDB4ZjAxZiwKKyAgICAweGYwMjAsIDB4ZjAyMSwgMHhmMDIyLCAweGYwMjMsIDB4ZjAyNCwgMHhmMDI1LCAweGYwMjYsIDB4ZjAyNywKKyAgICAweGYwMjgsIDB4ZjAyOSwgMHhmMDJhLCAweGYwMmIsIDB4ZjAyYywgMHhmMDJkLCAweGYwMmUsIDB4ZjAyZiwKKyAgICAweGYwMzAsIDB4ZjAzMSwgMHhmMDMyLCAweGYwMzMsIDB4ZjAzNCwgMHhmMDM1LCAweGYwMzYsIDB4ZjAzNywKKyAgICAweGYwMzgsIDB4ZjAzOSwgMHhmMDNhLCAweGYwM2IsIDB4ZjAzYywgMHhmMDNkLCAweGYwM2UsIDB4ZjAzZiwKKyAgICAweGYwNDAsIDB4ZjA0MSwgMHhmMDQyLCAweGYwNDMsIDB4ZjA0NCwgMHhmMDQ1LCAweGYwNDYsIDB4ZjA0NywKKyAgICAweGYwNDgsIDB4ZjA0OSwgMHhmMDRhLCAweGYwNGIsIDB4ZjA0YywgMHhmMDRkLCAweGYwNGUsIDB4ZjA0ZiwKKyAgICAweGYwNTAsIDB4ZjA1MSwgMHhmMDUyLCAweGYwNTMsIDB4ZjA1NCwgMHhmMDU1LCAweGYwNTYsIDB4ZjA1NywKKyAgICAweGYwNTgsIDB4ZjA1OSwgMHhmMDVhLCAweGYwNWIsIDB4ZjA1YywgMHhmMDVkLCAweGYwNWUsIDB4ZjA1ZiwKKyAgICAweGYwNjAsIDB4ZjA2MSwgMHhmMDYyLCAweGYwNjMsIDB4ZjA2NCwgMHhmMDY1LCAweGYwNjYsIDB4ZjA2NywKKyAgICAweGYwNjgsIDB4ZjA2OSwgMHhmMDZhLCAweGYwNmIsIDB4ZjA2YywgMHhmMDZkLCAweGYwNmUsIDB4ZjA2ZiwKKyAgICAweGYwNzAsIDB4ZjA3MSwgMHhmMDcyLCAweGYwNzMsIDB4ZjA3NCwgMHhmMDc1LCAweGYwNzYsIDB4ZjA3NywKKyAgICAweGYwNzgsIDB4ZjA3OSwgMHhmMDdhLCAweGYwN2IsIDB4ZjA3YywgMHhmMDdkLCAweGYwN2UsIDB4ZjA3ZiwKKyAgICAweGYwODAsIDB4ZjA4MSwgMHhmMDgyLCAweGYwODMsIDB4ZjA4NCwgMHhmMDg1LCAweGYwODYsIDB4ZjA4NywKKyAgICAweGYwODgsIDB4ZjA4OSwgMHhmMDhhLCAweGYwOGIsIDB4ZjA4YywgMHhmMDhkLCAweGYwOGUsIDB4ZjA4ZiwKKyAgICAweGYwOTAsIDB4ZjA5MSwgMHhmMDkyLCAweGYwOTMsIDB4ZjA5NCwgMHhmMDk1LCAweGYwOTYsIDB4ZjA5NywKKyAgICAweGYwOTgsIDB4ZjA5OSwgMHhmMDlhLCAweGYwOWIsIDB4ZjA5YywgMHhmMDlkLCAweGYwOWUsIDB4ZjA5ZiwKKyAgICAweGYwYTAsIDB4ZjBhMSwgMHhmMGEyLCAweGYwYTMsIDB4ZjBhNCwgMHhmMGE1LCAweGYwYTYsIDB4ZjBhNywKKyAgICAweGYwYTgsIDB4ZjBhOSwgMHhmMGFhLCAweGYwYWIsIDB4ZjBhYywgMHhmMGFkLCAweGYwYWUsIDB4ZjBhZiwKKyAgICAweGYwYjAsIDB4ZjBiMSwgMHhmMGIyLCAweGYwYjMsIDB4ZjBiNCwgMHhmMGI1LCAweGYwYjYsIDB4ZjBiNywKKyAgICAweGYwYjgsIDB4ZjBiOSwgMHhmMGJhLCAweGYwYmIsIDB4ZjBiYywgMHhmMGJkLCAweGYwYmUsIDB4ZjBiZiwKKyAgICAweGYwYzAsIDB4ZjBjMSwgMHhmMGMyLCAweGYwYzMsIDB4ZjBjNCwgMHhmMGM1LCAweGYwYzYsIDB4ZjBjNywKKyAgICAweGYwYzgsIDB4ZjBjOSwgMHhmMGNhLCAweGYwY2IsIDB4ZjBjYywgMHhmMGNkLCAweGYwY2UsIDB4ZjBjZiwKKyAgICAweGYwZDAsIDB4ZjBkMSwgMHhmMGQyLCAweGYwZDMsIDB4ZjBkNCwgMHhmMGQ1LCAweGYwZDYsIDB4ZjBkNywKKyAgICAweGYwZDgsIDB4ZjBkOSwgMHhmMGRhLCAweGYwZGIsIDB4ZjBkYywgMHhmMGRkLCAweGYwZGUsIDB4ZjBkZiwKKyAgICAweGYwZTAsIDB4ZjBlMSwgMHhmMGUyLCAweGYwZTMsIDB4ZjBlNCwgMHhmMGU1LCAweGYwZTYsIDB4ZjBlNywKKyAgICAweGYwZTgsIDB4ZjBlOSwgMHhmMGVhLCAweGYwZWIsIDB4ZjBlYywgMHhmMGVkLCAweGYwZWUsIDB4ZjBlZiwKKyAgICAweGYwZjAsIDB4ZjBmMSwgMHhmMGYyLCAweGYwZjMsIDB4ZjBmNCwgMHhmMGY1LCAweGYwZjYsIDB4ZjBmNywKKyAgICAweGYwZjgsIDB4ZjBmOSwgMHhmMGZhLCAweGYwZmIsIDB4ZjBmYywgMHhmMGZkLCAweGYwZmUsIDB4ZjBmZgorICB9Cit9OworCisvKiBUaGUgc3RhbmRhcmQga2VybmVsIGNoYXJhY3Rlci10by1mb250IG1hcHBpbmdzIGFyZSBub3QgaW52ZXJ0aWJsZQorICAgLS0gdGhpcyBpcyBqdXN0IGEgYmVzdCBlZmZvcnQuICovCisKKyNkZWZpbmUgTUFYX0dMWVBIIDUxMgkJLyogTWF4IHBvc3NpYmxlIGdseXBoIHZhbHVlICovCisKK3N0YXRpYyBpbnQgaW52X3RyYW5zbGF0ZVtNQVhfTlJfQ09OU09MRVNdOworCitzdHJ1Y3QgdW5pX3BhZ2VkaXIgeworCXUxNiAJCSoqdW5pX3BnZGlyWzMyXTsKKwl1bnNpZ25lZCBsb25nCXJlZmNvdW50OworCXVuc2lnbmVkIGxvbmcJc3VtOworCXVuc2lnbmVkIGNoYXIJKmludmVyc2VfdHJhbnNsYXRpb25zWzRdOworCWludAkJcmVhZG9ubHk7Cit9OworCitzdGF0aWMgc3RydWN0IHVuaV9wYWdlZGlyICpkZmx0OworCitzdGF0aWMgdm9pZCBzZXRfaW52ZXJzZV90cmFuc2woc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCB1bmlfcGFnZWRpciAqcCwgaW50IGkpCit7CisJaW50IGosIGdseXBoOworCXVuc2lnbmVkIHNob3J0ICp0ID0gdHJhbnNsYXRpb25zW2ldOworCXVuc2lnbmVkIGNoYXIgKnE7CisJCisJaWYgKCFwKSByZXR1cm47CisJcSA9IHAtPmludmVyc2VfdHJhbnNsYXRpb25zW2ldOworCisJaWYgKCFxKSB7CisJCXEgPSBwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1tpXSA9ICh1bnNpZ25lZCBjaGFyICopIAorCQkJa21hbGxvYyhNQVhfR0xZUEgsIEdGUF9LRVJORUwpOworCQlpZiAoIXEpIHJldHVybjsKKwl9CisJbWVtc2V0KHEsIDAsIE1BWF9HTFlQSCk7CisKKwlmb3IgKGogPSAwOyBqIDwgRV9UQUJTWjsgaisrKSB7CisJCWdseXBoID0gY29udl91bmlfdG9fcGMoY29ucCwgdFtqXSk7CisJCWlmIChnbHlwaCA+PSAwICYmIGdseXBoIDwgTUFYX0dMWVBIICYmIHFbZ2x5cGhdIDwgMzIpIHsKKwkJCS8qIHByZWZlciAnLScgYWJvdmUgU0hZIGV0Yy4gKi8KKwkJICAJcVtnbHlwaF0gPSBqOworCQl9CisJfQorfQorCit1bnNpZ25lZCBzaG9ydCAqc2V0X3RyYW5zbGF0ZShpbnQgbSwgc3RydWN0IHZjX2RhdGEgKnZjKQoreworCWludl90cmFuc2xhdGVbdmMtPnZjX251bV0gPSBtOworCXJldHVybiB0cmFuc2xhdGlvbnNbbV07Cit9CisKKy8qCisgKiBJbnZlcnNlIHRyYW5zbGF0aW9uIGlzIGltcG9zc2libGUgZm9yIHNldmVyYWwgcmVhc29uczoKKyAqIDEuIFRoZSBmb250PC0+Y2hhcmFjdGVyIG1hcHMgYXJlIG5vdCAxLTEuCisgKiAyLiBUaGUgdGV4dCBtYXkgaGF2ZSBiZWVuIHdyaXR0ZW4gd2hpbGUgYSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gbWFwCisgKiAgICB3YXMgYWN0aXZlLCBvciB1c2luZyBVbmljb2RlLgorICogU3RpbGwsIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBhIGNlcnRhaW4gZXh0ZW50IHRvIGN1dCBhbmQgcGFzdGUgbm9uLUFTQ0lJLgorICovCit1bnNpZ25lZCBjaGFyIGludmVyc2VfdHJhbnNsYXRlKHN0cnVjdCB2Y19kYXRhICpjb25wLCBpbnQgZ2x5cGgpCit7CisJc3RydWN0IHVuaV9wYWdlZGlyICpwOworCWlmIChnbHlwaCA8IDAgfHwgZ2x5cGggPj0gTUFYX0dMWVBIKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICghKHAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKmNvbnAtPnZjX3VuaV9wYWdlZGlyX2xvYykgfHwKKwkJICFwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1tpbnZfdHJhbnNsYXRlW2NvbnAtPnZjX251bV1dKQorCQlyZXR1cm4gZ2x5cGg7CisJZWxzZQorCQlyZXR1cm4gcC0+aW52ZXJzZV90cmFuc2xhdGlvbnNbaW52X3RyYW5zbGF0ZVtjb25wLT52Y19udW1dXVtnbHlwaF07Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV91c2VyX21hcHModm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnAsICpxID0gTlVMTDsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTlNPTEVTOyBpKyspIHsKKwkJaWYgKCF2Y19jb25zX2FsbG9jYXRlZChpKSkKKwkJCWNvbnRpbnVlOworCQlwID0gKHN0cnVjdCB1bmlfcGFnZWRpciAqKSp2Y19jb25zW2ldLmQtPnZjX3VuaV9wYWdlZGlyX2xvYzsKKwkJaWYgKHAgJiYgcCAhPSBxKSB7CisJCQlzZXRfaW52ZXJzZV90cmFuc2wodmNfY29uc1tpXS5kLCBwLCBVU0VSX01BUCk7CisJCQlxID0gcDsKKwkJfQorCX0KK30KKworLyoKKyAqIExvYWQgY3VzdG9taXphYmxlIHRyYW5zbGF0aW9uIHRhYmxlCisgKiBhcmcgcG9pbnRzIHRvIGEgMjU2IGJ5dGUgdHJhbnNsYXRpb24gdGFibGUuCisgKgorICogVGhlICJvbGQiIHZhcmlhbnRzIGFyZSBmb3IgdHJhbnNsYXRpb24gZGlyZWN0bHkgdG8gZm9udCAodXNpbmcgdGhlCisgKiAweGYwMDAtMHhmMGZmICJ0cmFuc3BhcmVudCIgVW5pY29kZXMpIHdoZXJlYXMgdGhlICJuZXciIHZhcmlhbnRzIHNldAorICogVW5pY29kZXMgZXhwbGljaXRseS4KKyAqLworaW50IGNvbl9zZXRfdHJhbnNfb2xkKHVuc2lnbmVkIGNoYXIgX191c2VyICogYXJnKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0ICpwID0gdHJhbnNsYXRpb25zW1VTRVJfTUFQXTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhcmcsIEVfVEFCU1opKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWZvciAoaT0wOyBpPEVfVEFCU1ogOyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciB1YzsKKwkJX19nZXRfdXNlcih1YywgYXJnK2kpOworCQlwW2ldID0gVU5JX0RJUkVDVF9CQVNFIHwgdWM7CisJfQorCisJdXBkYXRlX3VzZXJfbWFwcygpOworCXJldHVybiAwOworfQorCitpbnQgY29uX2dldF90cmFuc19vbGQodW5zaWduZWQgY2hhciBfX3VzZXIgKiBhcmcpCit7CisJaW50IGksIGNoOworCXVuc2lnbmVkIHNob3J0ICpwID0gdHJhbnNsYXRpb25zW1VTRVJfTUFQXTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYXJnLCBFX1RBQlNaKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmb3IgKGk9MDsgaTxFX1RBQlNaIDsgaSsrKQorCSAgeworCSAgICBjaCA9IGNvbnZfdW5pX3RvX3BjKHZjX2NvbnNbZmdfY29uc29sZV0uZCwgcFtpXSk7CisJICAgIF9fcHV0X3VzZXIoKGNoICYgfjB4ZmYpID8gMCA6IGNoLCBhcmcraSk7CisJICB9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjb25fc2V0X3RyYW5zX25ldyh1c2hvcnQgX191c2VyICogYXJnKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0ICpwID0gdHJhbnNsYXRpb25zW1VTRVJfTUFQXTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhcmcsIEVfVEFCU1oqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZm9yIChpPTA7IGk8RV9UQUJTWiA7IGkrKykgeworCQl1bnNpZ25lZCBzaG9ydCB1czsKKwkJX19nZXRfdXNlcih1cywgYXJnK2kpOworCQlwW2ldID0gdXM7CisJfQorCisJdXBkYXRlX3VzZXJfbWFwcygpOworCXJldHVybiAwOworfQorCitpbnQgY29uX2dldF90cmFuc19uZXcodXNob3J0IF9fdXNlciAqIGFyZykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCAqcCA9IHRyYW5zbGF0aW9uc1tVU0VSX01BUF07CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFyZywgRV9UQUJTWipzaXplb2YodW5zaWduZWQgc2hvcnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmb3IgKGk9MDsgaTxFX1RBQlNaIDsgaSsrKQorCSAgX19wdXRfdXNlcihwW2ldLCBhcmcraSk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVbmljb2RlIC0+IGN1cnJlbnQgZm9udCBjb252ZXJzaW9uIAorICoKKyAqIEEgZm9udCBoYXMgYXQgbW9zdCA1MTIgY2hhcnMsIHVzdWFsbHkgMjU2LgorICogQnV0IG9uZSBmb250IHBvc2l0aW9uIG1heSByZXByZXNlbnQgc2V2ZXJhbCBVbmljb2RlIGNoYXJzLgorICogQSBoYXNodGFibGUgaXMgc29tZXdoYXQgb2YgYSBwYWluIHRvIGRlYWwgd2l0aCwgc28gdXNlIGEKKyAqICJwYWdlZCB0YWJsZSIgaW5zdGVhZC4gIFNpbXVsYXRpb24gaGFzIHNob3duIHRoZSBtZW1vcnkgY29zdCBvZgorICogdGhpcyAzLWxldmVsIHBhZ2VkIHRhYmxlIHNjaGVtZSB0byBiZSBjb21wYXJhYmxlIHRvIGEgaGFzaCB0YWJsZS4KKyAqLworCitleHRlcm4gdTggZGZvbnRfdW5pY291bnRbXTsJLyogRGVmaW5lZCBpbiBjb25zb2xlX2RlZm1hcC5jICovCitleHRlcm4gdTE2IGRmb250X3VuaXRhYmxlW107CisKK3N0YXRpYyB2b2lkIGNvbl9yZWxlYXNlX3VuaW1hcChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnApCit7CisJdTE2ICoqcDE7CisJaW50IGksIGo7CisKKwlpZiAocCA9PSBkZmx0KSBkZmx0ID0gTlVMTDsgIAorCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmICgocDEgPSBwLT51bmlfcGdkaXJbaV0pICE9IE5VTEwpIHsKKwkJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKQorCQkJCWlmIChwMVtqXSkKKwkJCQkJa2ZyZWUocDFbal0pOworCQkJa2ZyZWUocDEpOworCQl9CisJCXAtPnVuaV9wZ2RpcltpXSA9IE5VTEw7CisJfQorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWlmIChwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1tpXSkgeworCQkJa2ZyZWUocC0+aW52ZXJzZV90cmFuc2xhdGlvbnNbaV0pOworCQkJcC0+aW52ZXJzZV90cmFuc2xhdGlvbnNbaV0gPSBOVUxMOworCQl9Cit9CisKK3ZvaWQgY29uX2ZyZWVfdW5pbWFwKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwlzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnA7CisKKwlwID0gKHN0cnVjdCB1bmlfcGFnZWRpciAqKSp2Yy0+dmNfdW5pX3BhZ2VkaXJfbG9jOworCWlmICghcCkKKwkJcmV0dXJuOworCSp2Yy0+dmNfdW5pX3BhZ2VkaXJfbG9jID0gMDsKKwlpZiAoLS1wLT5yZWZjb3VudCkKKwkJcmV0dXJuOworCWNvbl9yZWxlYXNlX3VuaW1hcChwKTsKKwlrZnJlZShwKTsKK30KKyAgCitzdGF0aWMgaW50IGNvbl91bmlmeV91bmltYXAoc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCB1bmlfcGFnZWRpciAqcCkKK3sKKwlpbnQgaSwgaiwgazsKKwlzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnE7CisJCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKSB7CisJCWlmICghdmNfY29uc19hbGxvY2F0ZWQoaSkpCisJCQljb250aW51ZTsKKwkJcSA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKikqdmNfY29uc1tpXS5kLT52Y191bmlfcGFnZWRpcl9sb2M7CisJCWlmICghcSB8fCBxID09IHAgfHwgcS0+c3VtICE9IHAtPnN1bSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgMzI7IGorKykgeworCQkJdTE2ICoqcDEsICoqcTE7CisJCQlwMSA9IHAtPnVuaV9wZ2RpcltqXTsgcTEgPSBxLT51bmlfcGdkaXJbal07CisJCQlpZiAoIXAxICYmICFxMSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghcDEgfHwgIXExKQorCQkJCWJyZWFrOworCQkJZm9yIChrID0gMDsgayA8IDMyOyBrKyspIHsKKwkJCQlpZiAoIXAxW2tdICYmICFxMVtrXSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKCFwMVtrXSB8fCAhcTFba10pCisJCQkJCWJyZWFrOworCQkJCWlmIChtZW1jbXAocDFba10sIHExW2tdLCA2NCpzaXplb2YodTE2KSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGsgPCAzMikKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaiA9PSAzMikgeworCQkJcS0+cmVmY291bnQrKzsKKwkJCSpjb25wLT52Y191bmlfcGFnZWRpcl9sb2MgPSAodW5zaWduZWQgbG9uZylxOworCQkJY29uX3JlbGVhc2VfdW5pbWFwKHApOworCQkJa2ZyZWUocCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY29uX2luc2VydF91bmlwYWlyKHN0cnVjdCB1bmlfcGFnZWRpciAqcCwgdV9zaG9ydCB1bmljb2RlLCB1X3Nob3J0IGZvbnRwb3MpCit7CisJaW50IGksIG47CisJdTE2ICoqcDEsICpwMjsKKworCWlmICghKHAxID0gcC0+dW5pX3BnZGlyW24gPSB1bmljb2RlID4+IDExXSkpIHsKKwkJcDEgPSBwLT51bmlfcGdkaXJbbl0gPSBrbWFsbG9jKDMyKnNpemVvZih1MTYgKiksIEdGUF9LRVJORUwpOworCQlpZiAoIXAxKSByZXR1cm4gLUVOT01FTTsKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCQlwMVtpXSA9IE5VTEw7CisJfQorCisJaWYgKCEocDIgPSBwMVtuID0gKHVuaWNvZGUgPj4gNikgJiAweDFmXSkpIHsKKwkJcDIgPSBwMVtuXSA9IGttYWxsb2MoNjQqc2l6ZW9mKHUxNiksIEdGUF9LRVJORUwpOworCQlpZiAoIXAyKSByZXR1cm4gLUVOT01FTTsKKwkJbWVtc2V0KHAyLCAweGZmLCA2NCpzaXplb2YodTE2KSk7IC8qIE5vIGdseXBocyBmb3IgdGhlIGNoYXJhY3RlcnMgKHlldCkgKi8KKwl9CisKKwlwMlt1bmljb2RlICYgMHgzZl0gPSBmb250cG9zOworCQorCXAtPnN1bSArPSAoZm9udHBvcyA8PCAyMCkgKyB1bmljb2RlOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHVpIGlzIGEgbGVmdG92ZXIgZnJvbSB1c2luZyBhIGhhc2h0YWJsZSwgYnV0IG1pZ2h0IGJlIHVzZWQgYWdhaW4gKi8KK2ludCBjb25fY2xlYXJfdW5pbWFwKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHVuaW1hcGluaXQgKnVpKQoreworCXN0cnVjdCB1bmlfcGFnZWRpciAqcCwgKnE7CisgIAorCXAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKnZjLT52Y191bmlfcGFnZWRpcl9sb2M7CisJaWYgKHAgJiYgcC0+cmVhZG9ubHkpIHJldHVybiAtRUlPOworCWlmICghcCB8fCAtLXAtPnJlZmNvdW50KSB7CisJCXEgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopa21hbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFxKSB7CisJCQlpZiAocCkgcC0+cmVmY291bnQrKzsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldChxLCAwLCBzaXplb2YoKnEpKTsKKwkJcS0+cmVmY291bnQ9MTsKKwkJKnZjLT52Y191bmlfcGFnZWRpcl9sb2MgPSAodW5zaWduZWQgbG9uZylxOworCX0gZWxzZSB7CisJCWlmIChwID09IGRmbHQpIGRmbHQgPSBOVUxMOworCQlwLT5yZWZjb3VudCsrOworCQlwLT5zdW0gPSAwOworCQljb25fcmVsZWFzZV91bmltYXAocCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgY29uX3NldF91bmltYXAoc3RydWN0IHZjX2RhdGEgKnZjLCB1c2hvcnQgY3QsIHN0cnVjdCB1bmlwYWlyIF9fdXNlciAqbGlzdCkKK3sKKwlpbnQgZXJyID0gMCwgZXJyMSwgaTsKKwlzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnAsICpxOworCisJcCA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKikqdmMtPnZjX3VuaV9wYWdlZGlyX2xvYzsKKwlpZiAocC0+cmVhZG9ubHkpIHJldHVybiAtRUlPOworCQorCWlmICghY3QpIHJldHVybiAwOworCQorCWlmIChwLT5yZWZjb3VudCA+IDEpIHsKKwkJaW50IGosIGs7CisJCXUxNiAqKnAxLCAqcDIsIGw7CisJCQorCQllcnIxID0gY29uX2NsZWFyX3VuaW1hcCh2YywgTlVMTCk7CisJCWlmIChlcnIxKSByZXR1cm4gZXJyMTsKKwkJCisJCXEgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKnZjLT52Y191bmlfcGFnZWRpcl9sb2M7CisJCWZvciAoaSA9IDAsIGwgPSAwOyBpIDwgMzI7IGkrKykKKwkJaWYgKChwMSA9IHAtPnVuaV9wZ2RpcltpXSkpCisJCQlmb3IgKGogPSAwOyBqIDwgMzI7IGorKykKKwkJCWlmICgocDIgPSBwMVtqXSkpCisJCQkJZm9yIChrID0gMDsgayA8IDY0OyBrKyssIGwrKykKKwkJCQlpZiAocDJba10gIT0gMHhmZmZmKSB7CisJCQkJCWVycjEgPSBjb25faW5zZXJ0X3VuaXBhaXIocSwgbCwgcDJba10pOworCQkJCQlpZiAoZXJyMSkgeworCQkJCQkJcC0+cmVmY291bnQrKzsKKwkJCQkJCSp2Yy0+dmNfdW5pX3BhZ2VkaXJfbG9jID0gKHVuc2lnbmVkIGxvbmcpcDsKKwkJCQkJCWNvbl9yZWxlYXNlX3VuaW1hcChxKTsKKwkJCQkJCWtmcmVlKHEpOworCQkJCQkJcmV0dXJuIGVycjE7IAorCQkJCQl9CisgICAgICAgICAgICAgIAkJCX0KKyAgICAgICAgICAgICAgCXAgPSBxOworCX0gZWxzZSBpZiAocCA9PSBkZmx0KQorCQlkZmx0ID0gTlVMTDsKKwkKKwl3aGlsZSAoY3QtLSkgeworCQl1bnNpZ25lZCBzaG9ydCB1bmljb2RlLCBmb250cG9zOworCQlfX2dldF91c2VyKHVuaWNvZGUsICZsaXN0LT51bmljb2RlKTsKKwkJX19nZXRfdXNlcihmb250cG9zLCAmbGlzdC0+Zm9udHBvcyk7CisJCWlmICgoZXJyMSA9IGNvbl9pbnNlcnRfdW5pcGFpcihwLCB1bmljb2RlLGZvbnRwb3MpKSAhPSAwKQorCQkJZXJyID0gZXJyMTsKKwkJCWxpc3QrKzsKKwl9CisJCisJaWYgKGNvbl91bmlmeV91bmltYXAodmMsIHApKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgaSA8PSAzOyBpKyspCisJCXNldF9pbnZlcnNlX3RyYW5zbCh2YywgcCwgaSk7IC8qIFVwZGF0ZSBhbGwgaW52ZXJzZSB0cmFuc2xhdGlvbnMgKi8KKyAgCisJcmV0dXJuIGVycjsKK30KKworLyogTG9hZHMgdGhlIHVuaW1hcCBmb3IgdGhlIGhhcmR3YXJlIGZvbnQsIGFzIGRlZmluZWQgaW4gdW5pX2hhc2gudGJsLgorICAgVGhlIHJlcHJlc2VudGF0aW9uIHVzZWQgd2FzIHRoZSBtb3N0IGNvbXBhY3QgSSBjb3VsZCBjb21lIHVwCisgICB3aXRoLiAgVGhpcyByb3V0aW5lIGlzIGV4ZWN1dGVkIGF0IHN5c19zZXR1cCB0aW1lLCBhbmQgd2hlbiB0aGUKKyAgIFBJT19GT05UUkVTRVQgaW9jdGwgaXMgY2FsbGVkLiAqLworCitpbnQgY29uX3NldF9kZWZhdWx0X3VuaW1hcChzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJaW50IGksIGosIGVyciA9IDAsIGVycjE7CisJdTE2ICpxOworCXN0cnVjdCB1bmlfcGFnZWRpciAqcDsKKworCWlmIChkZmx0KSB7CisJCXAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKnZjLT52Y191bmlfcGFnZWRpcl9sb2M7CisJCWlmIChwID09IGRmbHQpCisJCQlyZXR1cm4gMDsKKwkJZGZsdC0+cmVmY291bnQrKzsKKwkJKnZjLT52Y191bmlfcGFnZWRpcl9sb2MgPSAodW5zaWduZWQgbG9uZylkZmx0OworCQlpZiAocCAmJiAtLXAtPnJlZmNvdW50KSB7CisJCQljb25fcmVsZWFzZV91bmltYXAocCk7CisJCQlrZnJlZShwKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJCisJLyogVGhlIGRlZmF1bHQgZm9udCBpcyBhbHdheXMgMjU2IGNoYXJhY3RlcnMgKi8KKworCWVyciA9IGNvbl9jbGVhcl91bmltYXAodmMsIE5VTEwpOworCWlmIChlcnIpIHJldHVybiBlcnI7CisgICAgCisJcCA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKikqdmMtPnZjX3VuaV9wYWdlZGlyX2xvYzsKKwlxID0gZGZvbnRfdW5pdGFibGU7CisJCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlmb3IgKGogPSBkZm9udF91bmljb3VudFtpXTsgajsgai0tKSB7CisJCQllcnIxID0gY29uX2luc2VydF91bmlwYWlyKHAsICoocSsrKSwgaSk7CisJCQlpZiAoZXJyMSkKKwkJCQllcnIgPSBlcnIxOworCQl9CisJCQkKKwlpZiAoY29uX3VuaWZ5X3VuaW1hcCh2YywgcCkpIHsKKwkJZGZsdCA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKikqdmMtPnZjX3VuaV9wYWdlZGlyX2xvYzsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDw9IDM7IGkrKykKKwkJc2V0X2ludmVyc2VfdHJhbnNsKHZjLCBwLCBpKTsJLyogVXBkYXRlIGFsbCBpbnZlcnNlIHRyYW5zbGF0aW9ucyAqLworCWRmbHQgPSBwOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGNvbl9zZXRfZGVmYXVsdF91bmltYXApOworCitpbnQgY29uX2NvcHlfdW5pbWFwKHN0cnVjdCB2Y19kYXRhICpkc3RfdmMsIHN0cnVjdCB2Y19kYXRhICpzcmNfdmMpCit7CisJc3RydWN0IHVuaV9wYWdlZGlyICpxOworCisJaWYgKCEqc3JjX3ZjLT52Y191bmlfcGFnZWRpcl9sb2MpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgqZHN0X3ZjLT52Y191bmlfcGFnZWRpcl9sb2MgPT0gKnNyY192Yy0+dmNfdW5pX3BhZ2VkaXJfbG9jKQorCQlyZXR1cm4gMDsKKwljb25fZnJlZV91bmltYXAoZHN0X3ZjKTsKKwlxID0gKHN0cnVjdCB1bmlfcGFnZWRpciAqKSpzcmNfdmMtPnZjX3VuaV9wYWdlZGlyX2xvYzsKKwlxLT5yZWZjb3VudCsrOworCSpkc3RfdmMtPnZjX3VuaV9wYWdlZGlyX2xvYyA9IChsb25nKXE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjb25fZ2V0X3VuaW1hcChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVzaG9ydCBjdCwgdXNob3J0IF9fdXNlciAqdWN0LCBzdHJ1Y3QgdW5pcGFpciBfX3VzZXIgKmxpc3QpCit7CisJaW50IGksIGosIGssIGVjdDsKKwl1MTYgKipwMSwgKnAyOworCXN0cnVjdCB1bmlfcGFnZWRpciAqcDsKKworCWVjdCA9IDA7CisJaWYgKCp2Yy0+dmNfdW5pX3BhZ2VkaXJfbG9jKSB7CisJCXAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKnZjLT52Y191bmlfcGFnZWRpcl9sb2M7CisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlpZiAoKHAxID0gcC0+dW5pX3BnZGlyW2ldKSkKKwkJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKQorCQkJaWYgKChwMiA9ICoocDErKykpKQorCQkJCWZvciAoayA9IDA7IGsgPCA2NDsgaysrKSB7CisJCQkJCWlmICgqcDIgPCBNQVhfR0xZUEggJiYgZWN0KysgPCBjdCkgeworCQkJCQkJX19wdXRfdXNlcigodV9zaG9ydCkoKGk8PDExKSsoajw8NikrayksCisJCQkJCQkJICAgJmxpc3QtPnVuaWNvZGUpOworCQkJCQkJX19wdXRfdXNlcigodV9zaG9ydCkgKnAyLCAKKwkJCQkJCQkgICAmbGlzdC0+Zm9udHBvcyk7CisJCQkJCQlsaXN0Kys7CisJCQkJCX0KKwkJCQkJcDIrKzsKKwkJCQl9CisJfQorCV9fcHV0X3VzZXIoZWN0LCB1Y3QpOworCXJldHVybiAoKGVjdCA8PSBjdCkgPyAwIDogLUVOT01FTSk7Cit9CisKK3ZvaWQgY29uX3Byb3RlY3RfdW5pbWFwKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IHJkb25seSkKK3sKKwlzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKnZjLT52Y191bmlfcGFnZWRpcl9sb2M7CisJCisJaWYgKHApCisJCXAtPnJlYWRvbmx5ID0gcmRvbmx5OworfQorCitpbnQKK2NvbnZfdW5pX3RvX3BjKHN0cnVjdCB2Y19kYXRhICpjb25wLCBsb25nIHVjcykgCit7CisJaW50IGg7CisJdTE2ICoqcDEsICpwMjsKKwlzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnA7CisgIAorCS8qIE9ubHkgMTYtYml0IGNvZGVzIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUgKi8KKwlpZiAodWNzID4gMHhmZmZmKQorCQl1Y3MgPSAweGZmZmQ7CQkvKiBVK0ZGRkQ6IFJFUExBQ0VNRU5UIENIQVJBQ1RFUiAqLworCWVsc2UgaWYgKHVjcyA8IDB4MjAgfHwgdWNzID49IDB4ZmZmZSkKKwkJcmV0dXJuIC0xOwkJLyogTm90IGEgcHJpbnRhYmxlIGNoYXJhY3RlciAqLworCWVsc2UgaWYgKHVjcyA9PSAweGZlZmYgfHwgKHVjcyA+PSAweDIwMGEgJiYgdWNzIDw9IDB4MjAwZikpCisJCXJldHVybiAtMjsJCQkvKiBaZXJvLXdpZHRoIHNwYWNlICovCisJLyoKKwkgKiBVTklfRElSRUNUX0JBU0UgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiB0aGUgcmVnaW9uIGluIHRoZSBVc2VyIFpvbmUKKwkgKiB3aGljaCBhbHdheXMgaGFzIGEgMToxIG1hcHBpbmcgdG8gdGhlIGN1cnJlbnRseSBsb2FkZWQgZm9udC4gIFRoZQorCSAqIFVOSV9ESVJFQ1RfTUFTSyBpbmRpY2F0ZXMgdGhlIGJpdCBzcGFuIG9mIHRoZSByZWdpb24uCisJICovCisJZWxzZSBpZiAoKHVjcyAmIH5VTklfRElSRUNUX01BU0spID09IFVOSV9ESVJFQ1RfQkFTRSkKKwkJcmV0dXJuIHVjcyAmIFVOSV9ESVJFQ1RfTUFTSzsKKyAgCisJaWYgKCEqY29ucC0+dmNfdW5pX3BhZ2VkaXJfbG9jKQorCQlyZXR1cm4gLTM7CisKKwlwID0gKHN0cnVjdCB1bmlfcGFnZWRpciAqKSpjb25wLT52Y191bmlfcGFnZWRpcl9sb2M7ICAKKwlpZiAoKHAxID0gcC0+dW5pX3BnZGlyW3VjcyA+PiAxMV0pICYmCisJICAgIChwMiA9IHAxWyh1Y3MgPj4gNikgJiAweDFmXSkgJiYKKwkgICAgKGggPSBwMlt1Y3MgJiAweDNmXSkgPCBNQVhfR0xZUEgpCisJCXJldHVybiBoOworCisJcmV0dXJuIC00OwkJLyogbm90IGZvdW5kICovCit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBhdCBzeXNfc2V0dXAgdGltZSwgYWZ0ZXIgbWVtb3J5IGFuZCB0aGUgY29uc29sZSBhcmUKKyAqIGluaXRpYWxpemVkLiAgSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBjYWxsIGttYWxsb2MoLi4uLCBHRlBfS0VSTkVMKQorICogZnJvbSB0aGlzIGZ1bmN0aW9uLCBoZW5jZSB0aGUgY2FsbCBmcm9tIHN5c19zZXR1cC4KKyAqLwordm9pZCBfX2luaXQgCitjb25zb2xlX21hcF9pbml0KHZvaWQpCit7CisJaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKQorCQlpZiAodmNfY29uc19hbGxvY2F0ZWQoaSkgJiYgISp2Y19jb25zW2ldLmQtPnZjX3VuaV9wYWdlZGlyX2xvYykKKwkJCWNvbl9zZXRfZGVmYXVsdF91bmltYXAodmNfY29uc1tpXS5kKTsKK30KKworRVhQT1JUX1NZTUJPTChjb25fY29weV91bmltYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2NwNDM3LnVuaSBiL2RyaXZlcnMvY2hhci9jcDQzNy51bmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwNjg4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9jcDQzNy51bmkKQEAgLTAsMCArMSwyOTEgQEAKKyMKKyMgVW5pY29kZSB0YWJsZSBmb3IgSUJNIENvZGVwYWdlIDQzNy4gIE5vdGUgdGhhdCB0aGVyZSBhcmUgbWFueSBtb3JlCisjIHN1YnN0aXR1dGlvbnMgdGhhdCBjb3VsZCBiZSBjb25jZWl2ZWQgKGZvciBleGFtcGxlLCB0aGljay1saW5lCisjIGdyYXBocyBwcm9iYWJseSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBkb3VibGUtbGluZSBvbmVzLCBhY2NlbnRlZAorIyBMYXRpbiBjaGFyYWN0ZXJzIHNob3VsZCByZXBsYWNlZCB3aXRoIHRoZWlyIG5vbmFjY2VudGVkIHZlcnNpb25zLAorIyBhbmQgc29tZSB1cHBlciBjYXNlIEdyZWVrIGNoYXJhY3RlcnMgY291bGQgYmUgcmVwbGFjZWQgYnkgTGF0aW4pLCBob3dldmVyLAorIyBJIGhhdmUgbGltaXRlZCBteXNlbGYgdG8gdGhlIFVuaWNvZGVzIHVzZWQgYnkgdGhlIGtlcm5lbCBJU08gODg1OS0xLAorIyBERUMgVlQsIGFuZCBJQk0gQ1AgNDM3IHRhYmxlcy4KKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgQmFzaWMgSUJNIGRpbmdiYXRzLCBzb21lIG9mIHdoaWNoIHdpbGwgbmV2ZXIgaGF2ZSBhIHB1cnBvc2UgY2xlYXIKKyMgdG8gbWFua2luZAorIworMHgwMAlVKzAwMDAKKzB4MDEJVSsyNjNhCisweDAyCVUrMjYzYgorMHgwMwlVKzI2NjUKKzB4MDQJVSsyNjY2IFUrMjVjNgorMHgwNQlVKzI2NjMKKzB4MDYJVSsyNjYwCisweDA3CVUrMjAyMgorMHgwOAlVKzI1ZDgKKzB4MDkJVSsyNWNiCisweDBhCVUrMjVkOQorMHgwYglVKzI2NDIKKzB4MGMJVSsyNjQwCisweDBkCVUrMjY2YQorMHgwZQlVKzI2NmIKKzB4MGYJVSsyNjNjCisweDEwCVUrMjViNiBVKzI1YmEKKzB4MTEJVSsyNWMwIFUrMjVjNAorMHgxMglVKzIxOTUKKzB4MTMJVSsyMDNjCisweDE0CVUrMDBiNgorMHgxNQlVKzAwYTcKKzB4MTYJVSsyNWFjCisweDE3CVUrMjFhOAorMHgxOAlVKzIxOTEKKzB4MTkJVSsyMTkzCisweDFhCVUrMjE5MgorMHgxYglVKzIxOTAKKzB4MWMJVSsyMjFmCisweDFkCVUrMjE5NAorMHgxZQlVKzI1YjIKKzB4MWYJVSsyNWJjCisjCisjIFRoZSBBU0NJSSByYW5nZSBpcyBpZGVudGl0eS1tYXBwZWQsIGJ1dCBzb21lIG9mIHRoZSBjaGFyYWN0ZXJzIGFsc28KKyMgaGF2ZSB0byBhY3QgYXMgc3Vic3RpdHV0ZXMsIGVzcGVjaWFsbHkgdGhlIHVwcGVyLWNhc2UgY2hhcmFjdGVycy4KKyMKKzB4MjAJVSswMDIwCisweDIxCVUrMDAyMQorMHgyMglVKzAwMjIgVSswMGE4CisweDIzCVUrMDAyMworMHgyNAlVKzAwMjQKKzB4MjUJVSswMDI1CisweDI2CVUrMDAyNgorMHgyNwlVKzAwMjcKKzB4MjgJVSswMDI4CisweDI5CVUrMDAyOQorMHgyYQlVKzAwMmEKKzB4MmIJVSswMDJiCisweDJjCVUrMDAyYyBVKzAwYjgKKzB4MmQJVSswMDJkIFUrMDBhZAorMHgyZQlVKzAwMmUKKzB4MmYJVSswMDJmCisweDMwCVUrMDAzMAorMHgzMQlVKzAwMzEKKzB4MzIJVSswMDMyCisweDMzCVUrMDAzMworMHgzNAlVKzAwMzQKKzB4MzUJVSswMDM1CisweDM2CVUrMDAzNgorMHgzNwlVKzAwMzcKKzB4MzgJVSswMDM4CisweDM5CVUrMDAzOQorMHgzYQlVKzAwM2EKKzB4M2IJVSswMDNiCisweDNjCVUrMDAzYworMHgzZAlVKzAwM2QKKzB4M2UJVSswMDNlCisweDNmCVUrMDAzZgorMHg0MAlVKzAwNDAKKzB4NDEJVSswMDQxIFUrMDBjMCBVKzAwYzEgVSswMGMyIFUrMDBjMworMHg0MglVKzAwNDIKKzB4NDMJVSswMDQzIFUrMDBhOQorMHg0NAlVKzAwNDQKKzB4NDUJVSswMDQ1IFUrMDBjOCBVKzAwY2EgVSswMGNiCisweDQ2CVUrMDA0NgorMHg0NwlVKzAwNDcKKzB4NDgJVSswMDQ4CisweDQ5CVUrMDA0OSBVKzAwY2MgVSswMGNkIFUrMDBjZSBVKzAwY2YKKzB4NGEJVSswMDRhCisweDRiCVUrMDA0YiBVKzIxMmEKKzB4NGMJVSswMDRjCisweDRkCVUrMDA0ZAorMHg0ZQlVKzAwNGUKKzB4NGYJVSswMDRmIFUrMDBkMiBVKzAwZDMgVSswMGQ0IFUrMDBkNQorMHg1MAlVKzAwNTAKKzB4NTEJVSswMDUxCisweDUyCVUrMDA1MiBVKzAwYWUKKzB4NTMJVSswMDUzCisweDU0CVUrMDA1NAorMHg1NQlVKzAwNTUgVSswMGQ5IFUrMDBkYSBVKzAwZGIKKzB4NTYJVSswMDU2CisweDU3CVUrMDA1NworMHg1OAlVKzAwNTgKKzB4NTkJVSswMDU5IFUrMDBkZAorMHg1YQlVKzAwNWEKKzB4NWIJVSswMDViCisweDVjCVUrMDA1YworMHg1ZAlVKzAwNWQKKzB4NWUJVSswMDVlCisweDVmCVUrMDA1ZiBVKzIzYmQgVStmODA0CisweDYwCVUrMDA2MAorMHg2MQlVKzAwNjEgVSswMGUzCisweDYyCVUrMDA2MgorMHg2MwlVKzAwNjMKKzB4NjQJVSswMDY0CisweDY1CVUrMDA2NQorMHg2NglVKzAwNjYKKzB4NjcJVSswMDY3CisweDY4CVUrMDA2OAorMHg2OQlVKzAwNjkKKzB4NmEJVSswMDZhCisweDZiCVUrMDA2YgorMHg2YwlVKzAwNmMKKzB4NmQJVSswMDZkCisweDZlCVUrMDA2ZQorMHg2ZglVKzAwNmYgVSswMGY1CisweDcwCVUrMDA3MAorMHg3MQlVKzAwNzEKKzB4NzIJVSswMDcyCisweDczCVUrMDA3MworMHg3NAlVKzAwNzQKKzB4NzUJVSswMDc1CisweDc2CVUrMDA3NgorMHg3NwlVKzAwNzcKKzB4NzgJVSswMDc4IFUrMDBkNworMHg3OQlVKzAwNzkgVSswMGZkCisweDdhCVUrMDA3YQorMHg3YglVKzAwN2IKKzB4N2MJVSswMDdjIFUrMDBhNQorMHg3ZAlVKzAwN2QKKzB4N2UJVSswMDdlCisjCisjIE9rYXksIHdoYXQgb24gRWFydGggaXMgdGhpcyBvbmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBmb3I/CisjCisweDdmCVUrMjMwMgorIworIyBOb24tRW5nbGlzaCBjaGFyYWN0ZXJzLCBtb3N0bHkgbG93ZXIgY2FzZSBsZXR0ZXJzLi4uCisjCisweDgwCVUrMDBjNworMHg4MQlVKzAwZmMKKzB4ODIJVSswMGU5CisweDgzCVUrMDBlMgorMHg4NAlVKzAwZTQKKzB4ODUJVSswMGUwCisweDg2CVUrMDBlNQorMHg4NwlVKzAwZTcKKzB4ODgJVSswMGVhCisweDg5CVUrMDBlYgorMHg4YQlVKzAwZTgKKzB4OGIJVSswMGVmCisweDhjCVUrMDBlZQorMHg4ZAlVKzAwZWMKKzB4OGUJVSswMGM0CisweDhmCVUrMDBjNSBVKzIxMmIKKzB4OTAJVSswMGM5CisweDkxCVUrMDBlNgorMHg5MglVKzAwYzYKKzB4OTMJVSswMGY0CisweDk0CVUrMDBmNgorMHg5NQlVKzAwZjIKKzB4OTYJVSswMGZiCisweDk3CVUrMDBmOQorMHg5OAlVKzAwZmYKKzB4OTkJVSswMGQ2CisweDlhCVUrMDBkYworMHg5YglVKzAwYTIKKzB4OWMJVSswMGEzCisweDlkCVUrMDBhNQorMHg5ZQlVKzIwYTcKKzB4OWYJVSswMTkyCisweGEwCVUrMDBlMQorMHhhMQlVKzAwZWQKKzB4YTIJVSswMGYzCisweGEzCVUrMDBmYQorMHhhNAlVKzAwZjEKKzB4YTUJVSswMGQxCisweGE2CVUrMDBhYQorMHhhNwlVKzAwYmEKKzB4YTgJVSswMGJmCisweGE5CVUrMjMxMAorMHhhYQlVKzAwYWMKKzB4YWIJVSswMGJkCisweGFjCVUrMDBiYworMHhhZAlVKzAwYTEKKzB4YWUJVSswMGFiCisweGFmCVUrMDBiYgorIworIyBCbG9jayBncmFwaGljcworIworMHhiMAlVKzI1OTEKKzB4YjEJVSsyNTkyCisweGIyCVUrMjU5MworMHhiMwlVKzI1MDIKKzB4YjQJVSsyNTI0CisweGI1CVUrMjU2MQorMHhiNglVKzI1NjIKKzB4YjcJVSsyNTU2CisweGI4CVUrMjU1NQorMHhiOQlVKzI1NjMKKzB4YmEJVSsyNTUxCisweGJiCVUrMjU1NworMHhiYwlVKzI1NWQKKzB4YmQJVSsyNTVjCisweGJlCVUrMjU1YgorMHhiZglVKzI1MTAKKzB4YzAJVSsyNTE0CisweGMxCVUrMjUzNAorMHhjMglVKzI1MmMKKzB4YzMJVSsyNTFjCisweGM0CVUrMjUwMAorMHhjNQlVKzI1M2MKKzB4YzYJVSsyNTVlCisweGM3CVUrMjU1ZgorMHhjOAlVKzI1NWEKKzB4YzkJVSsyNTU0CisweGNhCVUrMjU2OQorMHhjYglVKzI1NjYKKzB4Y2MJVSsyNTYwCisweGNkCVUrMjU1MAorMHhjZQlVKzI1NmMKKzB4Y2YJVSsyNTY3CisweGQwCVUrMjU2OAorMHhkMQlVKzI1NjQKKzB4ZDIJVSsyNTY1CisweGQzCVUrMjU1OQorMHhkNAlVKzI1NTgKKzB4ZDUJVSsyNTUyCisweGQ2CVUrMjU1MworMHhkNwlVKzI1NmIKKzB4ZDgJVSsyNTZhCisweGQ5CVUrMjUxOAorMHhkYQlVKzI1MGMKKzB4ZGIJVSsyNTg4CisweGRjCVUrMjU4NAorMHhkZAlVKzI1OGMKKzB4ZGUJVSsyNTkwCisweGRmCVUrMjU4MAorIworIyBHcmVlayBsZXR0ZXJzIGFuZCBtYXRoZW1hdGljYWwgc3ltYm9scworIworMHhlMAlVKzAzYjEKKzB4ZTEJVSswM2IyIFUrMDBkZgorMHhlMglVKzAzOTMKKzB4ZTMJVSswM2MwCisweGU0CVUrMDNhMworMHhlNQlVKzAzYzMKKzB4ZTYJVSswMGI1IFUrMDNiYworMHhlNwlVKzAzYzQKKzB4ZTgJVSswM2E2IFUrMDBkOAorMHhlOQlVKzAzOTgKKzB4ZWEJVSswM2E5IFUrMjEyNgorMHhlYglVKzAzYjQKKzB4ZWMJVSsyMjFlCisweGVkCVUrMDNjNiBVKzAwZjgKKzB4ZWUJVSswM2I1CisweGVmCVUrMjIyOQorMHhmMAlVKzIyNjEKKzB4ZjEJVSswMGIxCisweGYyCVUrMjI2NQorMHhmMwlVKzIyNjQKKzB4ZjQJVSsyMzIwCisweGY1CVUrMjMyMQorMHhmNglVKzAwZjcKKzB4ZjcJVSsyMjQ4CisweGY4CVUrMDBiMAorMHhmOQlVKzIyMTkKKzB4ZmEJVSswMGI3CisweGZiCVUrMjIxYQorMHhmYwlVKzIwN2YKKzB4ZmQJVSswMGIyCisjCisjIFNxdWFyZSBidWxsZXQsIG5vbi1zcGFjaW5nIGJsYW5rCisjIE1hcHBpbmcgVStmZmZkIHRvIHRoZSBzcXVhcmUgYnVsbGV0IG1lYW5zIGl0IGlzIHRoZSBzdWJzdGl0dXRpb24KKyMgY2hhcmFjdGVyCisjIAorMHhmZQlVKzI1YTAgVStmZmZkCisweGZmCVUrMDBhMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMgYi9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTUzMzdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKQEAgLTAsMCArMSw1NTQwIEBACisjdW5kZWYJQkxPQ0tNT1ZFCisjZGVmaW5lCVpfV0FLRQorI3VuZGVmCVpfRVhUX0NIQVJTX0lOX0JVRkZFUgorc3RhdGljIGNoYXIgcmNzaWRbXSA9CisiJFJldmlzaW9uOiAyLjMuMi4yMCAkJERhdGU6IDIwMDQvMDIvMjUgMTg6MTQ6MTYgJCI7CisKKy8qCisgKiAgbGludXgvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRyaXZlciBmb3IgdGhlIEN5Y2xhZGVzIGFzeW5jIG11bHRpcG9ydAorICogc2VyaWFsIGJvYXJkcy4KKyAqCisgKiBJbml0aWFsbHkgd3JpdHRlbiBieSBSYW5kb2xwaCBCZW50c29uIDxiZW50c29uQGdyaWVnLnNlYXNsdWcub3JnPi4KKyAqIE1vZGlmaWVkIGFuZCBtYWludGFpbmVkIGJ5IE1hcmNpbyBTYWl0byA8bWFyY2lvQGN5Y2xhZGVzLmNvbT4uCisgKiBDdXJyZW50bHkgbWFpbnRhaW5lZCBieSBDeWNsYWRlcyB0ZWFtIDxhc3luY0BjeWNsYWRlcy5jb20+LgorICoKKyAqIEZvciBUZWNobmljYWwgc3VwcG9ydCBhbmQgaW5zdGFsbGF0aW9uIHByb2JsZW1zLCBwbGVhc2Ugc2VuZCBlLW1haWwKKyAqIHRvIHN1cHBvcnRAY3ljbGFkZXMuY29tLgorICoKKyAqIE11Y2ggb2YgdGhlIGRlc2lnbiBhbmQgc29tZSBvZiB0aGUgY29kZSBjYW1lIGZyb20gc2VyaWFsLmMKKyAqIHdoaWNoIHdhcyBjb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzLiAgSXQgd2FzCisgKiBleHRlbnNpdmVseSByZXdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbywgOC8xNi85MiAtLSA5LzE0LzkyLAorICogYW5kIHRoZW4gZml4ZWQgYXMgc3VnZ2VzdGVkIGJ5IE1pY2hhZWwgSy4gSm9obnNvbiAxMi8xMi85Mi4KKyAqCisgKiBUaGlzIHZlcnNpb24gc3VwcG9ydHMgc2hhcmVkIElSUSdzIChvbmx5IGZvciBQQ0kgYm9hcmRzKS4KKyAqCisgKiAkTG9nOiBjeWNsYWRlcy5jLHYgJAorICogUHJldmVudCB1c2VycyBmcm9tIG9wZW5pbmcgbm9uLWV4aXN0aW5nIFogcG9ydHMuCisgKgorICogUmV2aXNpb24gMi4zLjIuOCAgIDIwMDAvMDcvMDYgMTg6MTQ6MTYgaXZhbgorICogRml4ZWQgdGhlIFBDSSBkZXRlY3Rpb24gZnVuY3Rpb24gdG8gd29yayBwcm9wZXJseSBvbiBBbHBoYSBzeXN0ZW1zLgorICogSW1wbGVtZW50ZWQgc3VwcG9ydCBmb3IgVElPQ1NFUkdFVExTUiBpb2N0bC4KKyAqIEltcGxlbWVudGVkIGZ1bGwgc3VwcG9ydCBmb3Igbm9uLXN0YW5kYXJkIGJhdWQgcmF0ZXMuCisgKgorICogUmV2aXNpb24gMi4zLjIuNyAgIDIwMDAvMDYvMDEgMTg6MjY6MzQgaXZhbgorICogUmVxdWVzdCBQTFggSS9PIHJlZ2lvbiwgYWx0aG91Z2ggZHJpdmVyIGRvZXNuJ3QgdXNlIGl0LCB0byBhdm9pZAorICogcHJvYmxlbXMgd2l0aCBvdGhlciBkcml2ZXJzIGFjY2Vzc2luZyBpdC4KKyAqIFJlbW92ZWQgY291bnQgZm9yIG9uLWJvYXJkIGJ1ZmZlciBjaGFyYWN0ZXJzIGluIGN5X2NoYXJzX2luX2J1ZmZlcgorICogKEN5Y2xhZGVzLVogb25seSkuCisgKgorICogUmV2aXNpb24gMi4zLjIuNiAgIDIwMDAvMDUvMDUgMTM6NTY6MDUgaXZhbgorICogRHJpdmVyIG5vdyByZXBvcnRzIHBoeXNpY2FsIGluc3RlYWQgb2YgdmlydHVhbCBtZW1vcnkgYWRkcmVzc2VzLgorICogTWFza3Mgd2VyZSBhZGRlZCB0byBzb21lIEN5Y2xhZGVzLVogcmVhZCBhY2Nlc3Nlcy4KKyAqIEltcGxlbWVudGVkIHdvcmthcm91bmQgZm9yIFBMWDkwNTAgYnVnIHRoYXQgd291bGQgY2F1c2UgYSBzeXN0ZW0gbG9ja3VwCisgKiBpbiBjZXJ0YWluIHN5c3RlbXMsIGRlcGVuZGluZyBvbiB0aGUgTU1JTyBhZGRyZXNzZXMgYWxsb2NhdGVkIHRvIHRoZQorICogYm9hcmQuCisgKiBDaGFuZ2VkIHRoZSBUeCBpbnRlcnJ1cHQgcHJvZ3JhbW1pbmcgaW4gdGhlIENEMTQwMCBjaGlwcyB0byBib29zdCB1cAorICogcGVyZm9ybWFuY2UgKEN5Y2xvbS1ZIG9ubHkpLgorICogQ29kZSBpcyBub3cgY29tcGxpYW50IHdpdGggdGhlIG5ldyBtb2R1bGUgaW50ZXJmYWNlIChtb2R1bGVfW2luaXR8ZXhpdF0pLgorICogTWFrZSB1c2Ugb2YgdGhlIFBDSSBoZWxwZXIgZnVuY3Rpb25zIHRvIGFjY2VzcyBQQ0kgcmVzb3VyY2VzLgorICogRGlkIHNvbWUgY29kZSAiaG91c2VrZWVwaW5nIi4KKyAqCisgKiBSZXZpc2lvbiAyLjMuMi41ICAgMjAwMC8wMS8xOSAxNDozNTozMyBpdmFuCisgKiBGaXhlZCBidWcgaW4gY3lfc2V0X3Rlcm1pb3Mgb24gQ1JUU0NUUyBmbGFnIHR1cm5vZmYuCisgKgorICogUmV2aXNpb24gMi4zLjIuNCAgIDIwMDAvMDEvMTcgMDk6MTk6NDAgaXZhbgorICogRml4ZWQgU01QIGxvY2tpbmcgaW4gQ3ljbG9tLVkgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICogUmV2aXNpb24gMi4zLjIuMyAgIDE5OTkvMTIvMjggMTI6MTE6MzkgaXZhbgorICogQWRkZWQgYSBuZXcgY3ljbGFkZXNfY2FyZCBmaWVsZCBjYWxsZWQgbnBvcnRzIHRvIGFsbG93IHRoZSBkcml2ZXIgdG8KKyAqIGtub3cgdGhlIGV4YWN0IG51bWJlciBvZiBwb3J0cyBmb3VuZCBieSB0aGUgWiBmaXJtd2FyZSBhZnRlciBpdHMgbG9hZDsKKyAqIFJYIGJ1ZmZlciBjb250ZW50aW9uIHByZXZlbnRpb24gbG9naWMgb24gaW50ZXJydXB0IG9wIG1vZGUgcmV2aXNpdGVkCisgKiAoQ3ljbGFkZXMtWiBvbmx5KTsKKyAqIFJldmlzaXRlZCBwcmludGsncyBmb3IgWiBkZWJ1ZzsKKyAqIERyaXZlciBub3cgbWFrZXMgc3VyZSB0aGF0IHRoZSBjb25zdGFudCBTRVJJQUxfWE1JVF9TSVpFIGlzIGRlZmluZWQ7CisgKgorICogUmV2aXNpb24gMi4zLjIuMiAgIDE5OTkvMTAvMDEgMTE6Mjc6NDMgaXZhbgorICogRml4ZWQgYnVnIGluIGN5el9wb2xsIHRoYXQgd291bGQgbWFrZSBhbGwgcG9ydHMgYnV0IHBvcnQgMCAKKyAqIHVuYWJsZSB0byB0cmFuc21pdC9yZWNlaXZlIGRhdGEgKEN5Y2xhZGVzLVogb25seSk7CisgKiBJbXBsZW1lbnRlZCBsb2dpYyB0byBwcmV2ZW50IHRoZSBSWCBidWZmZXIgZnJvbSBiZWluZyBzdHVjayB3aXRoIGRhdGEKKyAqIGR1ZSB0byBhIGRyaXZlciAvIGZpcm13YXJlIHJhY2UgY29uZGl0aW9uIGluIGludGVycnVwdCBvcCBtb2RlCisgKiAoQ3ljbGFkZXMtWiBvbmx5KTsKKyAqIEZpeGVkIGJ1ZyBpbiBibG9ja190aWxfcmVhZHkgbG9naWMgdGhhdCB3b3VsZCBsZWFkIHRvIGEgc3lzdGVtIGNyYXNoOworICogUmV2aXNpdGVkIGN5X2Nsb3NlIHNwaW5sb2NrIHVzYWdlOworICoKKyAqIFJldmlzaW9uIDIuMy4yLjEgICAxOTk5LzA5LzI4IDExOjAxOjIyIGl2YW4KKyAqIFJldmlzaXRlZCBDT05GSUdfUENJIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGZvciBQQ0kgYm9hcmQgc3VwcG9ydDsKKyAqIEltcGxlbWVudGVkIFRJT0NHSUNPVU5UIGFuZCBUSU9DTUlXQUlUIGlvY3RsIHN1cHBvcnQ7CisgKiBfTWFqb3JfIGNsZWFudXAgb24gdGhlIEN5Y2xhZGVzLVogaW50ZXJydXB0IHN1cHBvcnQgY29kZSAvIGxvZ2ljOworICogUmVtb3ZlZCBDVFMgaGFuZGxpbmcgZnJvbSB0aGUgZHJpdmVyIC0tIHRoaXMgaXMgbm93IGNvbXBsZXRlbHkgaGFuZGxlZAorICogYnkgdGhlIGZpcm13YXJlIChDeWNsYWRlcy1aIG9ubHkpOworICogRmx1c2ggUlggb24tYm9hcmQgYnVmZmVycyBvbiBhIHBvcnQgb3BlbiAoQ3ljbGFkZXMtWiBvbmx5KTsKKyAqIEZpeGVkIGhhbmRsaW5nIG9mIEFTWU5DX1NQRF8qIFRUWSBmbGFnczsKKyAqIE1vZHVsZSB1bmxvYWQgbm93IHVubWFwcyBhbGwgbWVtb3J5IGFyZWEgYWxsb2NhdGVkIGJ5IGlvcmVtYXA7CisgKgorICogUmV2aXNpb24gMi4zLjEuMSAgIDE5OTkvMDcvMTUgMTY6NDU6NTMgaXZhbgorICogUmVtb3ZlZCBDWV9QUk9DIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uOworICogSW1wbGVtZW50ZWQgU01QLWF3YXJlbmVzcyBmb3IgdGhlIGRyaXZlcjsKKyAqIEltcGxlbWVudGVkIGEgbmV3IElTQSBJUlEgYXV0b3Byb2JlIHRoYXQgdXNlcyB0aGUgaXJxX3Byb2JlX1tvbnxvZmZdIAorICogZnVuY3Rpb25zOworICogVGhlIGRyaXZlciBub3cgYWNjZXB0cyBtZW1vcnkgYWRkcmVzc2VzIChtYWRkcj0weE1NTU1NKSBhbmQgSVJRcworICogKGlycT1OTikgYXMgcGFyYW1ldGVycyAob25seSBmb3IgSVNBIGJvYXJkcyk7CisgKiBGaXhlZCBidWcgaW4gc2V0X2xpbmVfY2hhciB0aGF0IHdvdWxkIHByZXZlbnQgdGhlIEN5Y2xhZGVzLVogCisgKiBwb3J0cyBmcm9tIGJlaW5nIGNvbmZpZ3VyZWQgYXQgc3BlZWRzIGFib3ZlIDExNS4yS2JwczsKKyAqIEZpeGVkIGJ1ZyBpbiBjeV9zZXRfdGVybWlvcyB0aGF0IHdvdWxkIHByZXZlbnQgWE9OL1hPRkYgZmxvdyBjb250cm9sCisgKiBzd2l0Y2hpbmcgZnJvbSB3b3JraW5nIHByb3Blcmx5OworICogVGhlIGRyaXZlciBub3cgb25seSBwcmludHMgSVJRIGluZm8gZm9yIHRoZSBDeWNsYWRlcy1aIGlmIGl0J3MgCisgKiBjb25maWd1cmVkIHRvIHdvcmsgaW4gaW50ZXJydXB0IG1vZGU7CisgKgorICogUmV2aXNpb24gMi4yLjIuMyAgIDE5OTkvMDYvMjggMTE6MTM6MjkgaXZhbgorICogQWRkZWQgc3VwcG9ydCBmb3IgaW50ZXJydXB0IG1vZGUgb3BlcmF0aW9uIGZvciB0aGUgWiBjYXJkczsKKyAqIFJlbW92ZWQgdGhlIGRyaXZlciBpbmFjdGl2aXR5IGNvbnRyb2wgZm9yIHRoZSBaOworICogQWRkZWQgYSBtaXNzaW5nIE1PRF9ERUNfVVNFX0NPVU5UIGluIHRoZSBjeV9vcGVuIGZ1bmN0aW9uIGZvciB3aGVuIAorICogdGhlIFogZmlybXdhcmUgaXMgbm90IGxvYWRlZCB5ZXQ7CisgKiBSZXBsYWNlZCB0aGUgIm1hbnVhbCIgWiBUeCBmbHVzaCBidWZmZXIgYnkgYSBjYWxsIHRvIGEgRlcgY29tbWFuZCBvZiAKKyAqIHNhbWUgZnVuY3Rpb25hbGl0eTsKKyAqIEltcGxlbWVudGVkIHdvcmthcm91bmQgZm9yIElSUSBzZXR0aW5nIGxvc3Mgb24gdGhlIFBDSSBjb25maWd1cmF0aW9uIAorICogcmVnaXN0ZXJzIGFmdGVyIGEgUENJIGJyaWRnZSBFRVBST00gcmVsb2FkIChhZmZlY3RzIFBMWDkwNjAgb25seSk7CisgKgorICogUmV2aXNpb24gMi4yLjIuMiAgMTk5OS8wNS8xNCAxNzoxODoxNSBpdmFuCisgKiAvcHJvYyBlbnRyeSBsb2NhdGlvbiBjaGFuZ2VkIHRvIC9wcm9jL3R0eS9kcml2ZXIvY3ljbGFkZXM7CisgKiBBZGRlZCBzdXBwb3J0IHRvIHNoYXJlZCBJUlEncyAob25seSBmb3IgUENJIGJvYXJkcyk7CisgKiBBZGRlZCBzdXBwb3J0IGZvciBDb2JhbHQgUXViZTIgc3lzdGVtczsKKyAqIElSUSBbZGVdYWxsb2NhdGlvbiBzY2hlbWUgcmV2aXNpdGVkOworICogQlJFQUsgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBpbiBvcmRlciB0byBtYWtlIHVzZSBvZiB0aGUgJ2JyZWFrX2N0bCcKKyAqIFRUWSBmYWNpbGl0eTsKKyAqIEZpeGVkIHR5cG8gaW4gVFRZIHN0cnVjdHVyZSBmaWVsZCAnZHJpdmVyX25hbWUnOworICogSW5jbHVkZWQgYSBQQ0kgYnJpZGdlIHJlc2V0IGFuZCBFRVBST00gcmVsb2FkIGluIHRoZSBib2FyZCAKKyAqIGluaXRpYWxpemF0aW9uIGNvZGUgKGZvciBib3RoIFkgYW5kIFogc2VyaWVzKS4KKyAqCisgKiBSZXZpc2lvbiAyLjIuMi4xICAxOTk5LzA0LzA4IDE2OjE3OjQzIGl2YW4KKyAqIEZpeGVkIGEgYnVnIGluIGN5X3dhaXRfdW50aWxfc2VudCB0aGF0IHdhcyBwcmV2ZW50aW5nIHRoZSBwb3J0IHRvIGJlIAorICogY2xvc2VkIHByb3Blcmx5IGFmdGVyIGEgU0lHSU5UOworICogTW9kdWxlIHVzYWdlIGNvdW50ZXIgc2NoZW1lIHJldmlzaXRlZDsKKyAqIEFkZGVkIHN1cHBvcnQgdG8gdGhlIHVwY29taW5nIFkgUENJIGJvYXJkcyAoaS5lLiwgc3VwcG9ydCB0byBhZGRpdGlvbmFsCisgKiBQQ0kgRGV2aWNlIElEJ3MpLgorICogCisgKiBSZXZpc2lvbiAyLjIuMS4xMCAxOTk5LzAxLzIwIDE2OjE0OjI5IGl2YW4KKyAqIFJlbW92ZWQgYWxsIHVubmVjZXNzYXJ5IHBhZ2UtYWxpZ25lbWVudCBvcGVyYXRpb25zIGluIGlvcmVtYXAgY2FsbHMKKyAqIChpb3JlbWFwIGlzIGN1cnJlbnRseSBzYWZlIGZvciB0aGVzZSBvcGVyYXRpb25zKS4KKyAqCisgKiBSZXZpc2lvbiAyLjIuMS45ICAxOTk4LzEyLzMwIDE4OjE4OjMwIGl2YW4KKyAqIENoYW5nZWQgYWNjZXNzIHRvIFBMWCBQQ0kgYnJpZGdlIHJlZ2lzdGVycyBmcm9tIEkvTyB0byBNTUlPLCBpbiAKKyAqIG9yZGVyIHRvIG1ha2UgUExYOTA1MC1iYXNlZCBib2FyZHMgd29yayB3aXRoIGNlcnRhaW4gbW90aGVyYm9hcmRzLgorICoKKyAqIFJldmlzaW9uIDIuMi4xLjggIDE5OTgvMTEvMTMgMTI6NDY6MjAgaXZhbgorICogY3lfY2xvc2UgZnVuY3Rpb24gbm93IHJlc2V0cyAoY29ycmVjdGx5KSB0aGUgdHR5LT5jbG9zaW5nIGZsYWc7CisgKiBKSUZGSUVTX0RJRkYgbWFjcm8gZml4ZWQuCisgKgorICogUmV2aXNpb24gMi4yLjEuNyAgMTk5OC8wOS8wMyAxMjowNzoyOCBpdmFuCisgKiBGaXhlZCBidWcgaW4gY3lfY2xvc2UgZnVuY3Rpb24sIHdoaWNoIHdhcyBub3QgaW5mb3JtaW5nIEhXIG9mCisgKiB3aGljaCBwb3J0IHNob3VsZCBoYXZlIHRoZSByZWNlcHRpb24gZGlzYWJsZWQgYmVmb3JlIGRvaW5nIHNvOworICogZml4ZWQgQ3ljbG9tLThZb1AgaGFyZHdhcmUgZGV0ZWN0aW9uIGJ1Zy4KKyAqCisgKiBSZXZpc2lvbiAyLjIuMS42ICAxOTk4LzA4LzIwIDE3OjE1OjM5IGl2YW4KKyAqIEZpeGVkIGJ1ZyBpbiBjeV9jbG9zZSBmdW5jdGlvbiwgd2hpY2ggY2F1c2VzIG1hbGZ1bmN0aW9uCisgKiBvZiBvbmUgb2YgdGhlIGZpcnN0IDQgcG9ydHMgd2hlbiBhIGhpZ2hlciBwb3J0IGlzIGNsb3NlZAorICogKEN5Y2xvbS1ZIG9ubHkpLgorICoKKyAqIFJldmlzaW9uIDIuMi4xLjUgIDE5OTgvMDgvMTAgMTg6MTA6MjggaXZhbgorICogRml4ZWQgQ3ljbG9tLTRZbyBoYXJkd2FyZSBkZXRlY3Rpb24gYnVnLgorICoKKyAqIFJldmlzaW9uIDIuMi4xLjQgIDE5OTgvMDgvMDQgMTE6MDI6NTAgaXZhbgorICogL3Byb2MvY3ljbGFkZXMgaW1wbGVtZW50YXRpb24gd2l0aCBncmVhdCBjb2xsYWJvcmF0aW9uIG9mIAorICogTWFyYyBMZXdpcyA8bWFyY0BibGFyZy5uZXQ+OworICogY3l5X2ludGVycnVwdCB3YXMgY2hhbmdlZCB0byBhdm9pZCBvY2N1cnJlbmNlIG9mIGtlcm5lbCBvb3BzZXMKKyAqIGR1cmluZyBQUFAgb3BlcmF0aW9uLgorICoKKyAqIFJldmlzaW9uIDIuMi4xLjMgIDE5OTgvMDYvMDEgMTI6MDk6MTAgaXZhbgorICogR2VuZXJhbCBjb2RlIHJldmlldyBpbiBvcmRlciB0byBjb21wbHkgd2l0aCAyLjEga2VybmVsIHN0YW5kYXJkczsKKyAqIGRhdGEgbG9zcyBwcmV2ZW50aW9uIGZvciBzbG93IGRldmljZXMgcmV2aXNpdGVkIChjeV93YWl0X3VudGlsX3NlbnQKKyAqIHdhcyBjcmVhdGVkKTsKKyAqIHJlbW92ZWQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZm9yIG5ldy9vbGQgUENJIHN0cnVjdHVyZSBzdXBwb3J0IAorICogKG5vdyB0aGUgZHJpdmVyIG9ubHkgc3VwcG9ydHMgdGhlIG5ldyBQQ0kgc3RydWN0dXJlKS4KKyAqCisgKiBSZXZpc2lvbiAyLjIuMS4xICAxOTk4LzAzLzE5IDE2OjQzOjEyIGl2YW4KKyAqIGFkZGVkIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGZvciBuZXcvb2xkIFBDSSBzdHJ1Y3R1cmUgc3VwcG9ydDsKKyAqIHJlbW92ZWQga2VybmVsIHNlcmllcyAoMi4wLnggLyAyLjEueCkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24uCisgKgorICogUmV2aXNpb24gMi4xLjEuMyAgMTk5OC8wMy8xNiAxODowMToxMiBpdmFuCisgKiBjbGVhbmVkIHVwIHRoZSBkYXRhIGxvc3MgZml4OworICogZml4ZWQgWE9OL1hPRkYgaGFuZGxpbmcgb25jZSBtb3JlIChDeWNsYWRlcy1aKTsKKyAqIGdlbmVyYWwgcmV2aWV3IG9mIHRoZSBkcml2ZXIgcm91dGluZXM7CisgKiBpbnRyb2R1Y3Rpb24gb2YgYSBtZWNoYW5pc20gdG8gcHJldmVudCBkYXRhIGxvc3Mgd2l0aCBzbG93IAorICogcHJpbnRlcnMsIGJ5IGZvcmNpbmcgYSBkZWxheSBiZWZvcmUgY2xvc2luZyB0aGUgcG9ydC4KKyAqCisgKiBSZXZpc2lvbiAyLjEuMS4yICAxOTk4LzAyLzE3IDE2OjUwOjAwIGl2YW4KKyAqIGZpeGVkIGRldGVjdGlvbi9oYW5kbGluZyBvZiBuZXcgQ0QxNDAwIGluIFllIGJvYXJkczsKKyAqIGZpeGVkIFhPTi9YT0ZGIGhhbmRsaW5nIChDeWNsYWRlcy1aKTsKKyAqIGZpeGVkIGRhdGEgbG9zcyBjYXVzZWQgYnkgYSBwcmVtYXR1cmUgcG9ydCBjbG9zZTsKKyAqIGludHJvZHVjdGlvbiBvZiBhIGZsYWcgdGhhdCBob2xkcyB0aGUgQ0QxNDAwIHZlcnNpb24gSUQgcGVyIHBvcnQKKyAqICh1c2VkIGJ5IHRoZSBDWUdFVENEMTQwMFZFUiBuZXcgaW9jdGwpLgorICoKKyAqIFJldmlzaW9uIDIuMS4xLjEgIDE5OTcvMTIvMDMgMTc6MzE6MTkgaXZhbgorICogQ29kZSByZXZpZXcgZm9yIHRoZSBtb2R1bGUgY2xlYW51cCByb3V0aW5lOworICogZml4ZWQgUlRTIGFuZCBEVFIgc3RhdHVzIHJlcG9ydCBmb3IgbmV3IENEMTQwMCdzIGluIGdldF9tb2RlbV9pbmZvOworICogaW5jbHVkZXMgYW5vbnltb3VzIGNoYW5nZXMgcmVnYXJkaW5nIHNpZ25hbF9wZW5kaW5nLgorICogCisgKiBSZXZpc2lvbiAyLjEgIDE5OTcvMTEvMDEgMTc6NDI6NDEgaXZhbgorICogQ2hhbmdlcyBpbiB0aGUgZHJpdmVyIHRvIHN1cHBvcnQgQWxwaGEgc3lzdGVtcyAoZXhjZXB0IDhabyBWXzEpOworICogQlJFQUsgZml4IGZvciB0aGUgQ3ljbGFkZXMtWiBib2FyZHM7CisgKiBkcml2ZXIgaW5hY3Rpdml0eSBjb250cm9sIGJ5IEZXIGltcGxlbWVudGVkOworICogaW50cm9kdWN0aW9uIG9mIGZsYWcgdGhhdCBhbGxvd3MgZHJpdmVyIHRvIHRha2UgYWR2YW50YWdlIG9mIAorICogYSBzcGVjaWFsIENEMTQwMCBmZWF0dXJlIHJlbGF0ZWQgdG8gSFcgZmxvdyBjb250cm9sOworICogYWRkZWQgc3VwcG9ydCBmb3IgdGhlIENEMTQwMCAgcmV2LiBKIChDeWNsb20tWSBib2FyZHMpOworICogaW50cm9kdWN0aW9uIG9mIGlvY3RscyB0bzoKKyAqICAtIGNvbnRyb2wgdGhlIHJ0c2R0cl9pbnYgZmxhZyAoQ3ljbG9tLVkpOworICogIC0gY29udHJvbCB0aGUgcmZsb3cgZmxhZyAoQ3ljbG9tLVkpOworICogIC0gYWRqdXN0IHRoZSBwb2xsaW5nIGludGVydmFsIChDeWNsYWRlcy1aKTsKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMzMgIDE5OTcvMDYvMjcgMTk6MDA6MDAgIGl2YW4KKyAqIEZpeGVzIHJlbGF0ZWQgdG8ga2VybmVsIHZlcnNpb24gY29uZGl0aW9uYWwgCisgKiBjb21waWxhdGlvbi4KKyAqICAKKyAqIFJldmlzaW9uIDEuMzYuNC4zMiAgMTk5Ny8wNi8xNCAxOTozMDowMCAgaXZhbgorICogQ29tcGF0aWJpbGl0eSBpc3N1ZXMgYmV0d2VlbiBrZXJuZWxzIDIuMC54IGFuZCAKKyAqIDIuMS54IChtYWlubHkgcmVsYXRlZCB0byBjbGVhcl9iaXQgZnVuY3Rpb24pLgorICogIAorICogUmV2aXNpb24gMS4zNi40LjMxICAxOTk3LzA2LzAzIDE1OjMwOjAwICBpdmFuCisgKiBDaGFuZ2VzIHRvIGRlZmluZSB0aGUgbWVtb3J5IHdpbmRvdyBhY2NvcmRpbmcgdG8gdGhlIAorICogYm9hcmQgdHlwZS4KKyAqICAKKyAqIFJldmlzaW9uIDEuMzYuNC4zMCAgMTk5Ny8wNS8xNiAxNTozMDowMCAgZGFuaWVsCisgKiBDaGFuZ2VzIHRvIHN1cHBvcnQgbmV3IGN5Y2xhZGVzWiBib2FyZHMuCisgKgorICogUmV2aXNpb24gMS4zNi40LjI5ICAxOTk3LzA1LzEyIDExOjMwOjAwICBkYW5pZWwKKyAqIE1lcmdlIG9mIEJlbnRzb24ncyBhbmQgRGFuaWVsJ3MgdmVyc2lvbiAxLjM2LjQuMjguCisgKiBDb3JyZWN0cyBidWcgaW4gY3lfZGV0ZWN0X3BjaTogY2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUKKyAqIHBvcnRzIHRoYW4gdGhlIG51bWJlciBvZiBzdGF0aWMgc3RydWN0cyBhbGxvY2F0ZWQuCisgKiBXYXJuaW5nIG1lc3NhZ2UgZHVyaW5nIGluaXRpYWxpemF0aW9uIGlmIHRoaXMgZHJpdmVyIGlzCisgKiB1c2VkIHdpdGggdGhlIG5ldyBnZW5lcmF0aW9uIG9mIGN5Y2xhZGVzWiBib2FyZHMuICBUaG9zZQorICogd2lsbCBiZSBzdXBwb3J0ZWQgb25seSBpbiBuZXh0IHJlbGVhc2Ugb2YgdGhlIGRyaXZlci4KKyAqIENvcnJlY3RzIGJ1ZyBpbiBjeV9kZXRlY3RfcGNpIGFuZCBjeV9kZXRlY3RfaXNhIHRoYXQKKyAqIHJldHVybmVkIHdyb25nIG51bWJlciBvZiBWQUxJRCBib2FyZHMsIHdoZW4gYSBjeWNsb21ZCisgKiB3YXMgZm91bmQgd2l0aCBubyBzZXJpYWwgbW9kdWxlcyBjb25uZWN0ZWQuCisgKiBDaGFuZ2VzIHRvIHVzZSBjdXJyZW50ICgyLjEueCkga2VybmVsIHN1YnJvdXRpbmUgbmFtZXMKKyAqIGFuZCBjcmVhdGVkIG1hY3JvcyBmb3IgY29tcGlsYXRpb24gd2l0aCAyLjAueCBrZXJuZWwsCisgKiBpbnN0ZWFkIG9mIHRoZSBvdGhlciB3YXkgYXJvdW5kLgorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4yOCAgMTk5Ny8wNS8/PyA/PzowMDowMCAgYmVudHNvbgorICogQ2hhbmdlIHF1ZXVlX3Rhc2tfaXJxX29mZiB0byBxdWV1ZV90YXNrX2lycS4KKyAqIFRoZSBpbmxpbmUgZnVuY3Rpb24gcXVldWVfdGFza19pcnFfb2ZmICh0cXVldWUuaCkKKyAqIHdhcyByZW1vdmVkIGZyb20gbGF0ZXN0IHJlbGVhc2VzIG9mIDIuMS54IGtlcm5lbC4KKyAqIFVzZSBvZiBtYWNybyBfX2luaXQgdG8gbWFyayB0aGUgaW5pdGlhbGl6YXRpb24KKyAqIHJvdXRpbmVzLCBzbyBtZW1vcnkgY2FuIGJlIHJldXNlZC4KKyAqIEFsc28gaW5jb3Jwb3JhdGUgaW1wbGVtZW50YXRpb24gb2YgY3JpdGljYWwgcmVnaW9uCisgKiBpbiBmdW5jdGlvbiBjbGVhbnVwX21vZHVsZSgpIGNyZWF0ZWQgYnkgYW5vbnltb3VzCisgKiBsaW51eGVyLgorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4yOCAgMTk5Ny8wNC8yNSAxNjowMDowMCAgZGFuaWVsCisgKiBDaGFuZ2UgdG8gc3VwcG9ydCBuZXcgZmlybXdhcmUgdGhhdCBzb2x2ZXMgRENEIHByb2JsZW06CisgKiBhcHBsaWNhdGlvbiBjb3VsZCBmYWlsIHRvIHJlY2VpdmUgU0lHSFVQIHNpZ25hbCB3aGVuIERDRAorICogdmFyeWluZyB0b28gZmFzdC4KKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMjcgIDE5OTcvMDMvMjYgMTA6MzA6MDAgIGRhbmllbAorICogQ2hhbmdlZCBmb3Igc3VwcG9ydCBsaW51eCB2ZXJzaW9ucyAyLjEuWC4KKyAqIEJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBsaW51eCB2ZXJzaW9ucyAyLjAuWC4KKyAqIENvcnJlY3RlZCBpbGxlZ2FsIHVzZSBvZiBmaWxsZXIgZmllbGQgaW4KKyAqIENIX0NUUkwgc3RydWN0LgorICogRGVsZXRlZCBzb21lIGRlYnVnIG1lc3NhZ2VzLgorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4yNiAgMTk5Ny8wMi8yNyAxMjowMDowMCAgZGFuaWVsCisgKiBJbmNsdWRlZCBjaGVjayBmb3IgTlVMTCB0dHkgcG9pbnRlciBpbiBjeXpfcG9sbC4KKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMjUgIDE5OTcvMDIvMjYgMTY6Mjg6MzAgIGJlbnRzb24KKyAqIEJpbGwgRm9zdGVyIGF0IEJsYXJnISBPbmxpbmUgc2VydmljZXMgbm90aWNlZCB0aGF0CisgKiBzb21lIG9mIHRoZSBzd2l0Y2ggZWxlbWVudHMgb2YgLVogbW9kZW0gY29udHJvbAorICogbGFja2VkIGEgY2xvc2luZyAiYnJlYWs7IgorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4yNCAgMTk5Ny8wMi8yNCAxMTowMDowMCAgZGFuaWVsCisgKiBDaGFuZ2VkIGxvdyB3YXRlciB0aHJlc2hvbGQgZm9yIGJ1ZmZlciB4bWl0X2J1ZgorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4yMyAgMTk5Ni8xMi8wMiAyMTo1MDoxNiAgYmVudHNvbgorICogTWFyY2lvIHByb3ZpZGVkIGZpeCB0byBtb2RlbSBzdGF0dXMgZmV0Y2ggZm9yIC1aCisgKgorICogUmV2aXNpb24gMS4zNi40LjIyICAxOTk2LzEwLzI4IDIyOjQxOjE3ICBiZW50c29uCisgKiBpbXByb3ZlIG1hcHBpbmcgb2YgLVogY29udHJvbCBwYWdlICh0aGFua3MgdG8gU3RldmUKKyAqIFByaWNlIDxzdGV2ZXBAZmEudGRrdGNhLmNvbT4gZm9yIGhlbHAgb24gdGhpcykKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMjEgIDE5OTYvMDkvMTAgMTc6MDA6MTAgIGJlbnRzb24KKyAqIHNoaWZ0IGZyb20gQ1BVLWJvdW5kIHRvIG1lbWNvcHkgaW4gY3l6X3BvbGxpbmcgb3BlcmF0aW9uCisgKgorICogUmV2aXNpb24gMS4zNi40LjIwICAxOTk2LzA5LzA5IDE4OjMwOjMyICBCZW50c29uCisgKiBBZGRlZCBzdXBwb3J0IHRvIHNldCBhbmQgcmVwb3J0IGhpZ2hlciBzcGVlZHMuCisgKgorICogUmV2aXNpb24gMS4zNi40LjE5YyAgMTk5Ni8wOC8wOSAxMDowMDowMCAgTWFyY2lvIFNhaXRvCisgKiBTb21lIGZpeGVzIGluIHRoZSBIVyBmbG93IGNvbnRyb2wgZm9yIHRoZSBCRVRBIHJlbGVhc2UuCisgKiBEb24ndCB0cnkgdG8gcmVnaXN0ZXIgdGhlIElSUS4KKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMTkgIDE5OTYvMDgvMDggMTY6MjM6MTggIEJlbnRzb24KKyAqIG1ha2Ugc3VyZSAiY3ljIiBhcHBlYXJzIGluIGFsbCBrZXJuZWwgbWVzc2FnZXM7IGFsbCBzb2Z0IGludGVycnVwdHMKKyAqIGhhbmRsZWQgYnkgc2FtZSByb3V0aW5lOyByZWNvZ25pemUgb3V0LW9mLWJhbmQgcmVjZXB0aW9uOyBjb21tZW50CisgKiBvdXQgc29tZSBkaWFnbm9zdGljIG1lc3NhZ2VzOyBsZWF2ZSBSVFMvQ1RTIGZsb3cgY29udHJvbCB0byBoYXJkd2FyZTsKKyAqIGZpeCByYWNlIGNvbmRpdGlvbiBpbiAtWiBidWZmZXIgbWFuYWdlbWVudDsgb25seSAtWSBuZWVkcyB0byBleHBsaWN0bHkKKyAqIGZsdXNoIGNoYXJzOyB0aWR5IHVwIHNvbWUgc3RhcnR1cCBtZXNzYWdlczsKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMTggIDE5OTYvMDcvMjUgMTg6NTc6MzEgIGJlbnRzb24KKyAqIHNoaWZ0IE1PRF9JTkNfVVNFX0NPVU5UIGxvY2F0aW9uIHRvIG1hdGNoCisgKiBzZXJpYWwuYzsgcHVyZ2Ugc29tZSBkaWFnbm9zdGljIG1lc3NhZ2VzOworICoKKyAqIFJldmlzaW9uIDEuMzYuNC4xNyAgMTk5Ni8wNy8yNSAxODowMTowOCAgYmVudHNvbgorICogZW5hYmxlIG1vZGVtIHN0YXR1cyBtZXNzYWdlcyBhbmQgZmV0Y2ggJiBwcm9jZXNzIHRoZW07IG5vdGUKKyAqIHRpbWUgb2YgbGFzdCBhY3Rpdml0eSB0eXBlIGZvciBlYWNoIHBvcnQ7IHNldF9saW5lX2NoYXIgbm93CisgKiBzdXBwb3J0cyBtb3JlIHRoYW4gbGluZSAwIGFuZCB0cmVhdHMgMCBiYXVkIGNvcnJlY3RseTsKKyAqIGdldF9tb2RlbV9pbmZvIHNlbnNlcyByc19zdGF0dXM7CisgKgorICogUmV2aXNpb24gMS4zNi40LjE2ICAxOTk2LzA3LzIwIDA4OjQzOjE1ICBiZW50c29uCisgKiBiYXJlbHkgd29ya3MtLW5vdydzIHRpbWUgdG8gdHVybiBvbgorICogbW9yZSBmZWF0dXJlcyAndGlsIGl0IGJyZWFrcworICoKKyAqIFJldmlzaW9uIDEuMzYuNC4xNSAgMTk5Ni8wNy8xOSAyMjozMDowNiAgYmVudHNvbgorICogY2hlY2sgbW9yZSAtWiBib2FyZCBzdGF0dXM7IHNob3J0ZW4gYm9vdCBtZXNzYWdlCisgKgorICogUmV2aXNpb24gMS4zNi40LjE0ICAxOTk2LzA3LzE5IDIyOjIwOjM3ICBiZW50c29uCisgKiBmaXggcmVmZXJlbmNlIHRvIGNoX2N0cmwgaW4gc3RhcnR1cDsgdmVyaWZ5IHJldHVybgorICogdmFsdWVzIGZyb20gY3l6X2lzc3VlX2NtZCBhbmQgY3l6X3VwZGF0ZV9jaGFubmVsOworICogbW9yZSBzdHVmZiB0byBnZXQgbW9kZW0gY29udHJvbCBjb3JyZWN0OworICoKKyAqIFJldmlzaW9uIDEuMzYuNC4xMyAgMTk5Ni8wNy8xMSAxOTo1MzozMyAgYmVudHNvbgorICogbW9yZSAtWiBzdHVmZiBmb2xkZWQgaW47IHJlLW9yZGVyIGNoYW5nZXMgdG8gcHV0IC1aIHN0dWZmCisgKiBhZnRlciAtWSBzdHVmZiAodG8gbWFrZSBjaGFuZ2VzIGNsZWFyZXIpCisgKgorICogUmV2aXNpb24gMS4zNi40LjEyICAxOTk2LzA3LzExIDE1OjQwOjU1ICBiZW50c29uCisgKiBBZGQgY29kZSB0byBwb2xsIEN5Y2xhZGVzLVouICBBZGQgY29kZSB0byBnZXQgJiBzZXQgUlMtMjMyIGNvbnRyb2wuCisgKiBBZGQgY29kZSB0byBzZW5kIGJyZWFrLiAgQ2xlYXIgZmlybXdhcmUgSUQgd29yZCBhdCBzdGFydHVwIChzbworICogdGhhdCBvdGhlciBjb2RlIHdvbid0IHRhbGsgdG8gaW5hY3RpdmUgYm9hcmQpLgorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4xMSAgMTk5Ni8wNy8wOSAwNToyODoyOSAgYmVudHNvbgorICogYWRkIGNvZGUgZm9yIC1aIGluIHNldF9saW5lX2NoYXIKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuMTAgIDE5OTYvMDcvMDggMTk6Mjg6MzcgIGJlbnRzb24KKyAqIGZvbGQgbW9yZSAtWiBzdHVmZiAob3IgaW4gc29tZSBjYXNlcywgZXJyb3IgbWVzc2FnZXMpCisgKiBpbnRvIGRyaXZlcjsgYWRkIHRleHQgdG8gImRvbid0IGtub3cgd2hhdCB0byBkbyIgbWVzc2FnZXMuCisgKgorICogUmV2aXNpb24gMS4zNi40LjkgIDE5OTYvMDcvMDggMTg6Mzg6MzggIGJlbnRzb24KKyAqIG1vdmVkIGNvbXBpbGUtdGltZSBmbGFncyBuZWFyIHRvcCBvZiBmaWxlOyBjb3NtZXRpYyBjaGFuZ2VzCisgKiB0byBuYXJyb3cgdGV4dCAodG8gYWxsb3cgMi11cCBwcmludGluZyk7IGNoYW5nZWQgbWFueSBkZWNsYXJhdGlvbnMKKyAqIHRvICJzdGF0aWMiIHRvIGxpbWl0IGV4dGVybmFsIHN5bWJvbHM7IHNodWZmbGVkIGNvZGUgb3JkZXIgdG8KKyAqIGNvYWxlc2NlIC1ZIGFuZCAtWiBzcGVjaWZpYyBjb2RlLCBhbHNvIHRvIHB1dCBpbnRlcm5hbCBmdW5jdGlvbnMKKyAqIGluIG9yZGVyIG9mIHR0eV9kcml2ZXIgc3RydWN0dXJlOyBhZGRlZCBjb2RlIHRvIHJlY29nbml6ZSAtWgorICogcG9ydHMgKGFuZCBmb3IgbW9tZW50LCBkbyBub3RoaW5nIG9yIHJlcG9ydCBlcnJvcik7IGFkZCBjeV9zdGFydHVwCisgKiB0byBwYXJzZSBib290IGNvbW1hbmQgbGluZSBmb3IgZXh0cmEgYmFzZSBhZGRyZXNzZXMgZm9yIElTQSBwcm9iZXM7CisgKgorICogUmV2aXNpb24gMS4zNi40LjggIDE5OTYvMDYvMjUgMTc6NDA6MTkgIGJlbnRzb24KKyAqIHJlb3JkZXIgc29tZSBjb2RlLCBmaXggdHlwZXMgb2Ygc29tZSB2YXJzIChpbnQgdnMuIGxvbmcpLAorICogYWRkIGN5X3NldHVwIHRvIHN1cHBvcnQgdXNlciBkZWNsYXJlZCBJU0EgYWRkcmVzc2VzCisgKgorICogUmV2aXNpb24gMS4zNi40LjcgIDE5OTYvMDYvMjEgMjM6MDY6MTggIGJlbnRzb24KKyAqIGR1bXAgaW9jdGwgYmFzZWQgZmlybXdhcmUgbG9hZCAoaXQncyBub3cgYSB1c2VyIGxldmVsCisgKiBwcm9ncmFtKTsgZW5zdXJlIHVuaW5pdGlhbHplZCBwb3J0cyBjYW5ub3QgYmUgdXNlZAorICoKKyAqIFJldmlzaW9uIDEuMzYuNC42ICAxOTk2LzA2LzIwIDIzOjE3OjE5ICBiZW50c29uCisgKiByZW5hbWUgdmFycyBhbmQgcmVzdHJ1Y3R1cmUgc29tZSBjb2RlCisgKgorICogUmV2aXNpb24gMS4zNi40LjUgIDE5OTYvMDYvMTQgMTU6MDk6NDQgIGJlbnRzb24KKyAqIGdldCByaWdodCBzdGF0dXMgYmFjayBhZnRlciBib290IGxvYWQKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjQuNCAgMTk5Ni8wNi8xMyAxOTo1MTo0NCAgYmVudHNvbgorICogc3VjY2Vzc2Z1bGx5IGxvYWRzIGZpcm13YXJlCisgKgorICogUmV2aXNpb24gMS4zNi40LjMgIDE5OTYvMDYvMTMgMDY6MDg6MzMgIGJlbnRzb24KKyAqIGFkZCBtb3JlIG9mIHRoZSBjb2RlIGZvciB0aGUgYm9vdC9sb2FkIGlvY3RscworICoKKyAqIFJldmlzaW9uIDEuMzYuNC4yICAxOTk2LzA2LzExIDIxOjAwOjUxICBiZW50c29uCisgKiBzdGFydCB0byBhZGQgWiBmdW5jdGlvbmFsaXR5LS1zdGFydGluZyB3aXRoIGlvY3RsCisgKiBmb3IgbG9hZGluZyBmaXJtd2FyZQorICoKKyAqIFJldmlzaW9uIDEuMzYuNC4xICAxOTk2LzA2LzEwIDE4OjAzOjAyICBiZW50c29uCisgKiBhZGRlZCBjb2RlIHRvIHJlY29nbml6ZSBaL1BDSSBjYXJkIGF0IGluaXRpYWxpemF0aW9uOyByZXBvcnQKKyAqIHByZXNlbmNlLCBidXQgY2FyZCBpcyBub3QgaW5pdGlhbGl6ZWQgKGJlY2F1c2UgZmlybXdhcmUgbmVlZHMKKyAqIHRvIGJlIGxvYWRlZCkKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjMuOCAgMTk5Ni8wNi8wNyAxNjoyOTowMCAgYmVudHNvbgorICogc3RhcnRpbmcgbWlub3IgbnVtYmVyIGF0IHplcm87IGFkZGVkIG1pc3NpbmcgdmVyaWZ5X2FyZWEKKyAqIGFzIG5vdGVkIGJ5IEhlaWtvIEVpc3NmZWxkdCA8aGVpa29AY29sb3NzdXMuZXNjYXBlLmRlPgorICoKKyAqIFJldmlzaW9uIDEuMzYuMy43ICAxOTk2LzA0LzE5IDIxOjA2OjE4ICBiZW50c29uCisgKiByZW1vdmUgdW5uZWVkZWQgYm9vdCBtZXNzYWdlICYgZml4IENMT0NBTCBoYXJkd2FyZSBmbG93CisgKiBjb250cm9sIChNaXF1ZWwgdmFuIFNtb29yZW5idXJnIDxtaXF1ZWxzQFEuY2lzdHJvbi5ubD4pOworICogcmVtb3ZlIHVudXNlZCBkaWFnbm9zdGljIHN0YXRlbWVudHM7IG1pbm9yIDAgaXMgZmlyc3Q7CisgKgorICogUmV2aXNpb24gMS4zNi4zLjYgIDE5OTYvMDMvMTMgMTM6MjE6MTcgIG1hcmNpbworICogVGhlIGtlcm5lbCBmdW5jdGlvbiB2cmVtYXAgKGF2YWlsYWJsZSBvbmx5IGluIGxhdGVyIDEuMy54eCBrZXJuZWxzKQorICogYWxsb3dzIHRoZSBhY2Nlc3MgdG8gbWVtb3J5IGFkZHJlc3NlcyBhYm92ZSB0aGUgUkFNLiBUaGlzIHJldmlzaW9uCisgKiBvZiB0aGUgZHJpdmVyIHN1cHBvcnRzIFBDSSBib2FyZHMgYmVsb3cgMU1iIChkZXZpY2UgaWQgMHgxMDApIGFuZAorICogYWJvdmUgMU1iIChkZXZpY2UgaWQgMHgxMDEpLgorICoKKyAqIFJldmlzaW9uIDEuMzYuMy41ICAxOTk2LzAzLzA3IDE1OjIwOjE3ICBiZW50c29uCisgKiBTb21lIGdsb2JhbCBjaGFuZ2VzIHRvIGludGVycnVwdCBoYW5kbGluZyBzcGlsbGVkIGludG8KKyAqIHRoaXMgZHJpdmVyLS1tb3N0bHkgdW51c2VkIGFyZ3VtZW50cyBpbiBzeXN0ZW0gZnVuY3Rpb24KKyAqIGNhbGxzLiAgQWxzbyBhZGRlZCBjaGFuZ2UgYnkgTWFyY2lvIFNhaXRvIHdoaWNoIHNob3VsZAorICogcmVkdWNlIGxvc3QgaW50ZXJydXB0cyBhdCBzdGFydHVwIGJ5IGZhc3QgcHJvY2Vzc29ycy4KKyAqCisgKiBSZXZpc2lvbiAxLjM2LjMuNCAgMTk5NS8xMS8xMyAgMjA6NDU6MTAgIGJlbnRzb24KKyAqIENoYW5nZXMgYnkgQ29yZXkgTWlueWFyZCA8bWlueWFyZEB3Zi1yY2guY2lyci5jb20+IGRpc3RyaWJ1dGVkCisgKiBpbiAxLjMuNDEga2VybmVsIHRvIHJlbW92ZSBhIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uLCBleHRlbmQKKyAqIHNvbWUgZXJyb3IgbWVzc2FnZXMsIGFuZCBsZXQgdGhlIGRyaXZlciBydW4gYXMgYSBsb2FkYWJsZSBtb2R1bGUKKyAqIENoYW5nZSBieSBBbGFuIFdlbmR0IDxhbGFuQGV6MC5lemxpbmsuY29tPiB0byByZW1vdmUgYQorICogcG9zc2libGUgcmFjZSBjb25kaXRpb24uCisgKiBDaGFuZ2UgYnkgTWFyY2lvIFNhaXRvIDxtYXJjaW9AY3ljbGFkZXMuY29tPiB0byBmaXggUENJIGFkZHJlc3NpbmcuCisgKgorICogUmV2aXNpb24gMS4zNi4zLjMgIDE5OTUvMTEvMTMgIDE5OjQ0OjQ4ICBiZW50c29uCisgKiBDaGFuZ2VzIGJ5IExpbnVzIFRvcnZhbGRzIGluIDEuMy4zMyBrZXJuZWwgZGlzdHJpYnV0aW9uCisgKiByZXF1aXJlZCBkdWUgdG8gcmVvcmRlcmluZyBvZiBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCisgKiBEcml2ZXJzIGFyZSBub3cgaW5pdGlhbGl6ZWQgKmFmdGVyKiBtZW1vcnkgbWFuYWdlbWVudC4KKyAqCisgKiBSZXZpc2lvbiAxLjM2LjMuMiAgMTk5NS8wOS8wOCAgMjI6MDc6MTQgIGJlbnRzb24KKyAqIHJlbW92ZSBwcmludGsgZnJvbSBJU1I7IGZpeCB0eXBvCisgKgorICogUmV2aXNpb24gMS4zNi4zLjEgIDE5OTUvMDkvMDEgIDEyOjAwOjQyICBtYXJjaW8KKyAqIE1pbm9yIGZpeGVzIGluIHRoZSBQQ0kgYm9hcmQgc3VwcG9ydC4gUENJIGZ1bmN0aW9uIGNhbGxzIGluCisgKiBjb25kaXRpb25hbCBjb21waWxhdGlvbiAoQ09ORklHX1BDSSkuIFRoYW5rcyB0byBKaW0gRHVuY2FuCisgKiA8ZHVuY2FuQG9rYXkuY29tPi4gImJhZCBzZXJpYWwgY291bnQiIG1lc3NhZ2UgcmVtb3ZlZC4KKyAqCisgKiBSZXZpc2lvbiAxLjM2LjMgIDE5OTUvMDgvMjIgIDA5OjE5OjQyICBtYXJjaW8KKyAqIEN5Y2xvbS1ZL1BDSSBzdXBwb3J0IGFkZGVkLiBDaGFuZ2VzIGluIHRoZSBjeV9pbml0IHJvdXRpbmUgYW5kCisgKiBib2FyZCBpbml0aWFsaXphdGlvbi4gQ2hhbmdlcyBpbiB0aGUgYm9vdCBtZXNzYWdlcy4gVGhlIGRyaXZlcgorICogc3VwcG9ydHMgdXAgdG8gNCBib2FyZHMgYW5kIDY0IHBvcnRzIGJ5IGRlZmF1bHQuCisgKgorICogUmV2aXNpb24gMS4zNi4xLjQgIDE5OTUvMDMvMjkgIDA2OjE0OjE0ICBiZW50c29uCisgKiBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBDeWNsb20tMTZZIGFuZCBDeWNsb20tMzJZZTsKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjEuMyAgMTk5NS8wMy8yMyAgMjI6MTU6MzUgIGJlbnRzb24KKyAqIGFkZCBtaXNzaW5nIGJyZWFrIGluIG1vZGVtIGNvbnRyb2wgYmxvY2sgaW4gaW9jdGwgc3dpdGNoIHN0YXRlbWVudAorICogKGRpc2NvdmVyZWQgYnkgTWljaGFlbCBFZHdhcmQgQ2hhc3RhaW4gPG1lY0Bqb2JlLnNoZWxsLnBvcnRhbC5jb20+KTsKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjEuMiAgMTk5NS8wMy8yMiAgMTk6MTY6MjIgIGJlbnRzb24KKyAqIG1ha2Ugc3VyZSBDVFMgZmxvdyBjb250cm9sIGlzIHNldCBhcyBzb29uIGFzIHBvc3NpYmxlICh0aGFua3MKKyAqIHRvIG5vdGUgZnJvbSBEYXZpZCBMYW1iZXJ0IDxsYW1iZXJ0QGNoZXNhcGVha2UucnBzLnNsYi5jb20+KTsKKyAqCisgKiBSZXZpc2lvbiAxLjM2LjEuMSAgMTk5NS8wMy8xMyAgMTU6NDQ6NDMgIGJlbnRzb24KKyAqIGluaXRpYWxpemUgZGVmYXVsdHMgZm9yIHJlY2VpdmUgdGhyZXNob2xkIGFuZCBzdGFsZSBkYXRhIHRpbWVvdXQ7CisgKiBjb3NtZXRpYyBjaGFuZ2VzOworICoKKyAqIFJldmlzaW9uIDEuMzYgIDE5OTUvMDMvMTAgIDIzOjMzOjUzICBiZW50c29uCisgKiBhZGRlZCBzdXBwb3J0IG9mIGNoaXBzIDQtNyBpbiAzMiBwb3J0IEN5Y2xvbS1ZZTsKKyAqIGZpeCBjeV9pbnRlcnJ1cHQgcG9pbnRlciBkZXJlZmVyZW5jZSBwcm9ibGVtCisgKiAoSm9lIFBvcnRtYW4gPGJhcm9uQGFhLm5ldD4pOworICogZ2l2ZSBiZXR0ZXIgZXJyb3IgcmVzcG9uc2UgaWYgb3BlbiBpcyBhdHRlbXB0ZWQgb24gbm9uLWV4aXN0ZW50IHBvcnQKKyAqIChaYWNoYXJpYWggVmF1bSA8amNocnlzbHJAbmV0Y29tLmNvbT4pOworICogY29ycmVjdCBjb21tYW5kIHRpbWVvdXQgKEtlbm5ldGggTGVybWFuIDxsZXJtYW5AQHNlbHRkLm5ld25ldC5jb20+KTsKKyAqIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGZvciAtMTZZIG9uIHN5c3RlbXMgd2l0aCBmYXN0LCBub2lzeSBidXM7CisgKiBjb21tZW50IG91dCBkaWFnbm9zdGljIHByaW50IGZ1bmN0aW9uOworICogY2xlYW5lZCB1cCB0YWJsZSBvZiBiYXNlIGFkZHJlc3NlczsKKyAqIHNldCByZWNlaXZlciB0aW1lLW91dCBwZXJpb2QgcmVnaXN0ZXIgdG8gY29ycmVjdCB2YWx1ZSwKKyAqIHNldCByZWNlaXZlIHRocmVzaG9sZCB0byBiZXR0ZXIgZGVmYXVsdCB2YWx1ZXMsCisgKiBzZXQgY2hpcCB0aW1lciB0byBtb3JlIGFjY3VyYXRlIDIwMCBIeiB0aWNraW5nLAorICogYWRkIGNvZGUgdG8gbW9uaXRvciBhbmQgbW9kaWZ5IHJlY2VpdmUgcGFyYW1ldGVycworICogKFJpayBGYWl0aCA8ZmFpdGhAY3MudW5jLmVkdT4gTmljayBTaW1pY2ljaAorICogPG5qc0BzY2lmaS5lbWkubmV0Pik7CisgKgorICogUmV2aXNpb24gMS4zNSAgMTk5NC8xMi8xNiAgMTM6NTQ6MTggIHN0ZWZmZW4KKyAqIGFkZGl0aW9uYWwgcGF0Y2ggYnkgTWFyY2lvIFNhaXRvIGZvciBib2FyZCBkZXRlY3Rpb24KKyAqIEFjY2lkZW50bHkgbGVmdCBvdXQgaW4gMS4zNAorICoKKyAqIFJldmlzaW9uIDEuMzQgIDE5OTQvMTIvMTAgIDEyOjM3OjEyICBzdGVmZmVuCisgKiBUaGlzIGlzIHRoZSBjb3JyZWN0ZWQgdmVyc2lvbiBhcyBzdWdnZXN0ZWQgYnkgTWFyY2lvIFNhaXRvCisgKgorICogUmV2aXNpb24gMS4zMyAgMTk5NC8xMi8wMSAgMjI6NDE6MTggIGJlbnRzb24KKyAqIGFkZCBob29rcyB0byBzdXBwb3J0IG1vcmUgaGlnaCBzcGVlZHMgZGlyZWN0bHk7IGFkZCB0eXRzbworICogcGF0Y2ggcmVnYXJkaW5nIENMT0NBTCB3YWtldXBzCisgKgorICogUmV2aXNpb24gMS4zMiAgMTk5NC8xMS8yMyAgMTk6NTA6MDQgIGJlbnRzb24KKyAqIGFsbG93IGRpcmVjdCBrZXJuZWwgY29udHJvbCBvZiBoaWdoZXIgc2lnbmFsbGluZyByYXRlczsKKyAqIGxvb2sgZm9yIGNhcmRzIGF0IGFkZGl0aW9uYWwgbG9jYXRpb25zCisgKgorICogUmV2aXNpb24gMS4zMSAgMTk5NC8xMS8xNiAgMDQ6MzM6MjggIGJlbnRzb24KKyAqIEFOT1RIRVIgZml4IGZyb20gQ29yZXkgTWlueWFyZCwgbWlueWFyZEB3Zi1yY2guY2lyci5jb20tLQorICogYSBwcm9ibGVtIGluIGNoYXJzX2luX2J1ZmZlciBoYXMgYmVlbiByZXNvbHZlZCBieSBzb21lCisgKiBzbWFsbCBjaGFuZ2VzOyAgdGhpcyBzaG91bGQgeWllbGQgc21vb3RoZXIgb3V0cHV0CisgKgorICogUmV2aXNpb24gMS4zMCAgMTk5NC8xMS8xNiAgMDQ6Mjg6MDUgIGJlbnRzb24KKyAqIEZpeCBmcm9tIENvcmV5IE1pbnlhcmQsIEludGVybmV0OiBtaW55YXJkQG1ldHJvbmV0LmNvbSwKKyAqIFVVQ1A6IG1pbnlhcmRAd2YtcmNoLmNpcnIuY29tLCBXT1JLOiBtaW55YXJkYm5yLmNhLCB0bworICogY3lfaGFuZ3VwIHRoYXQgYXBwZWFycyB0byBjbGVhciB1cCBtdWNoIChhbGw/KSBvZiB0aGUKKyAqIERUUiBnbGl0Y2hlczsgYWxzbyBoZSdzIGFkZGVkL2NsZWFuZWQtdXAgZGlhZ25vc3RpYyBtZXNzYWdlcworICoKKyAqIFJldmlzaW9uIDEuMjkgIDE5OTQvMTEvMTYgIDA0OjE2OjA3ICBiZW50c29uCisgKiBhZGQgY2hhbmdlIHByb3Bvc2VkIGJ5IFJhbHBoIFNpbXMsIHJhbHBoc0BoYWxjeW9uLmNvbSwgdG8KKyAqIG9wZXJhdGUgaGlnaGVyIHNwZWVkcyBpbiBzYW1lIHdheSBhcyBvdGhlciBzZXJpYWwgcG9ydHM7CisgKiBhZGQgbW9yZSBzZXJpYWwgcG9ydHMgKGZvciB1cCB0byB0d28gMTYtcG9ydCBtdXhlcykuCisgKgorICogUmV2aXNpb24gMS4yOCAgMTk5NC8xMS8wNCAgMDA6MTM6MTYgIHJvb3QKKyAqIHR1cm4gb2ZmIGRpYWdub3N0aWMgbWVzc2FnZXMKKyAqCisgKiBSZXZpc2lvbiAxLjI3ICAxOTk0LzExLzAzICAyMzo0NjozNyAgcm9vdAorICogYnVuY2ggb2YgY2hhbmdlcyB0byBicmluZyBkcml2ZXIgaW50byBncmVhdGVyIGNvbmZvcm1hbmNlCisgKiB3aXRoIHRoZSBzZXJpYWwuYyBkcml2ZXIgKGxvb2tpbmcgZm9yIG1pc3NlZCBmaXhlcykKKyAqCisgKiBSZXZpc2lvbiAxLjI2ICAxOTk0LzExLzAzICAyMjo0MDozNiAgcm9vdAorICogYXV0b21hdGljIGludGVycnVwdCBwcm9iaW5nIGZpeGVkLgorICoKKyAqIFJldmlzaW9uIDEuMjUgIDE5OTQvMTEvMDMgIDIwOjE3OjAyICByb290CisgKiBzdGFydCB0byBpbXBsZW1lbnQgYXV0by1pcnEKKyAqCisgKiBSZXZpc2lvbiAxLjI0ICAxOTk0LzExLzAzICAxODowMTo1NSAgcm9vdAorICogc3RpbGwgd29ya2luZyBvbiBtb2RlbSBzaWduYWxzLS10cnlpbmcgbm90IHRvIGRyb3AgRFRSCisgKiBkdXJpbmcgdGhlIGdldHR5L2xvZ2luIHByb2Nlc3NlcworICoKKyAqIFJldmlzaW9uIDEuMjMgIDE5OTQvMTEvMDMgIDE3OjUxOjM2ICByb290CisgKiBleHRlbmQgYmF1ZCByYXRlIHN1cHBvcnQ7IHNldCByZWNlaXZlIHRocmVzaG9sZCBhcyBmdW5jdGlvbgorICogb2YgYmF1ZCByYXRlOyBmaXggc29tZSBwcm9ibGVtcyB3aXRoIFJUUy9DVFM7CisgKgorICogUmV2aXNpb24gMS4yMiAgMTk5NC8xMS8wMiAgMTg6MDU6MzUgIHJvb3QKKyAqIGNoYW5nZWQgYXJndW1lbnRzIHRvIHVkZWxheSB0byB0eXBlIGxvbmcgdG8gZ2V0CisgKiBkZWxheXMgdG8gYmUgb2YgY29ycmVjdCBkdXJhdGlvbgorICoKKyAqIFJldmlzaW9uIDEuMjEgIDE5OTQvMTEvMDIgIDE3OjM3OjMwICByb290CisgKiBlbXBsb3kgdWRlbGF5IChhZnRlciBjYWxpYnJhdGluZyBsb29wc19wZXJfc2Vjb25kIGVhcmxpZXIKKyAqIGluIGluaXQvbWFpbi5jKSBpbnN0ZWFkIG9mIHVzaW5nIGhvbWUtZ3Jvd24gZGVsYXkgcm91dGluZXMKKyAqCisgKiBSZXZpc2lvbiAxLjIwICAxOTk0LzExLzAyICAwMzoxMTozOCAgcm9vdAorICogY3lfY2hhcnNfaW5fYnVmZmVyIGZvcmNlcyBhIHJldHVybiB2YWx1ZSBvZiAwIHRvIGxldAorICogbG9naW4gd29yayAoZG9uJ3Qga25vdyB3aHkgaXQgZG9lcyk7IHNvbWUgZnVuY3Rpb25zCisgKiB0aGF0IHdlcmUgcmV0dXJuaW5nIEVGQVVMVCwgbm93IGV4ZWN1dGVzIHRoZSBjb2RlOworICogbW9yZSB3b3JrIG9uIGRlY2lkaW5nIHdoZW4gdG8gZGlzYWJsZSB4bWl0IGludGVycnVwdHM7CisgKgorICogUmV2aXNpb24gMS4xOSAgMTk5NC8xMS8wMSAgMjA6MTA6MTQgIHJvb3QKKyAqIGRlZmluZSByb3V0aW5lIHRvIHN0YXJ0IHRyYW5zbWlzc2lvbiBpbnRlcnJ1cHRzIChieSBlbmFibGluZworICogdHJhbnNtaXQgaW50ZXJydXB0cyk7IGRpcmVjdGx5IGVuYWJsZS9kaXNhYmxlIG1vZGVtIGludGVycnVwdHM7CisgKgorICogUmV2aXNpb24gMS4xOCAgMTk5NC8xMS8wMSAgMTg6NDA6NDUgIGJlbnRzb24KKyAqIERvbid0IGFsd2F5cyBlbmFibGUgdHJhbnNtaXQgaW50ZXJydXB0cyBpbiBzdGFydHVwOyBpbnRlcnJ1cHQgb24KKyAqIFR4TXB0eSBpbnN0ZWFkIG9mIFR4UmR5IHRvIGhlbHAgY2hhcmFjdGVycyBnZXQgb3V0IGJlZm9yZSBzaHV0ZG93bjsKKyAqIHJlc3RydWN0dXJlIHhtaXQgaW50ZXJydXB0IHRvIGNoZWNrIGZvciBjaGFycyBmaXJzdCBhbmQgcXVpdCBpZgorICogbm9uZSBhcmUgcmVhZHkgdG8gZ287IG1vZGVtIHN0YXR1cyAoTVhWUngpIGlzIHVwcmlnaHQsIF9ub3RfIGludmVydGVkCisgKiAodG8gbXkgdmlldyk7CisgKgorICogUmV2aXNpb24gMS4xNyAgMTk5NC8xMC8zMCAgMDQ6Mzk6NDUgIGJlbnRzb24KKyAqIHJlbmFtZSBzZXJpYWxfZHJpdmVyIGFuZCBjYWxsb3V0X2RyaXZlciB0byBjeV9zZXJpYWxfZHJpdmVyIGFuZAorICogY3lfY2FsbG91dF9kcml2ZXIgdG8gYXZvaWQgbGlua2FnZSBpbnRlcmZlcmVuY2U7IGluaXRpYWxpemUKKyAqIGluZm8tPnR5cGUgdG8gUE9SVF9DSVJSVVM7IHJ1Z2dlZGl6ZSBwYXJhbm9pYSB0ZXN0OyBlbGlkZSAtPnBvcnQKKyAqIGZyb20gY3ljbGFkZXNfcG9ydCBzdHJ1Y3R1cmU7IGFkZCBwYXJhbm9pYSBjaGVjayB0byBjeV9jbG9zZTsKKyAqCisgKiBSZXZpc2lvbiAxLjE2ICAxOTk0LzEwLzMwICAwMToxNDozMyAgYmVudHNvbgorICogY2hhbmdlIG1ham9yIG51bWJlcnM7IGFkZCBzb21lIF9lYXJseV8gcmV0dXJuIHN0YXRlbWVudHM7CisgKgorICogUmV2aXNpb24gMS4xNSAgMTk5NC8xMC8yOSAgMDY6NDM6MTUgIGJlbnRzb24KKyAqIGZpbmFsIHRpZHlpbmcgdXAgZm9yIGNsZWFuIGNvbXBpbGU7ICBlbmFibGUgc29tZSBlcnJvciByZXBvcnRpbmcKKyAqCisgKiBSZXZpc2lvbiAxLjE0ICAxOTk0LzEwLzI4ICAyMDozMDoyMiAgQmVudHNvbgorICogbG90cyBvZiBjaGFuZ2VzIHRvIGRyYWcgdGhlIGRyaXZlciB0b3dhcmRzIHRoZSBuZXcgdHR5X2lvCisgKiBzdHJ1Y3R1cmVzIGFuZCBvcGVyYXRpb24uICBub3QgZXhwZWN0ZWQgdG8gd29yaywgYnV0IG1heQorICogY29tcGlsZSBjbGVhbmx5LgorICoKKyAqIFJldmlzaW9uIDEuMTMgIDE5OTQvMDcvMjEgIDIzOjA4OjU3ICBCZW50c29uCisgKiBhZGQgc29tZSBkaWFnbm9zdGljIGNydWZ0OyBzdXBwb3J0IDI0IGxpbmVzIChmb3IgdGVzdGluZworICogYm90aCAtOFkgYW5kIC0xNlkgY2FyZHM7IGJlIG1vcmUgdGhvcm91Z2ggaW4gc2VydmljaW5nIGFsbAorICogY2hpcHMgZHVyaW5nIGludGVycnVwdDsgYWRkICJ2b2xhdGlsZSIgYSBmZXcgcGxhY2VzIHRvCisgKiBjaXJjdW12ZW50IGNvbXBpbGVyIG9wdGltaXphdGlvbnM7IGZpeCBiYXNlICYgb2Zmc2V0CisgKiBjb21wdXRhdGlvbnMgaW4gYmxvY2tfdGlsX3JlYWR5ICh3YXMgY2F1c2luZyBjaGlwIDAgdG8KKyAqIHN0b3Agb3BlcmF0aW9uKQorICoKKyAqIFJldmlzaW9uIDEuMTIgIDE5OTQvMDcvMTkgIDE2OjQyOjExICBCZW50c29uCisgKiBhZGQgc29tZSBoYWNrZXJ5IGZvciBrZXJuZWwgdmVyc2lvbiAxLjEuODsgZXhwYW5kCisgKiBlcnJvciBtZXNzYWdlczsgcmVmaW5lIHRpbWluZyBmb3IgZGVsYXkgbG9vcHMgYW5kCisgKiBkZWNsYXJlIGxvb3AgcGFyYW1zIHZvbGF0aWxlCisgKgorICogUmV2aXNpb24gMS4xMSAgMTk5NC8wNi8xMSAgMjE6NTM6MTAgIGJlbnRzb24KKyAqIGdldCB1c2Ugb2Ygc2F2ZV9jYXIgcmlnaHQgaW4gdHJhbnNtaXQgaW50ZXJydXB0IHNlcnZpY2UKKyAqCisgKiBSZXZpc2lvbiAxLjEwLjEuMSAgMTk5NC8wNi8xMSAgMjE6MzE6MTggIGJlbnRzb24KKyAqIGFkZCBzb21lIGRpYWdub3N0aWMgcHJpbnRpbmc7IHRyeSB0byBmaXggc2F2ZV9jYXIgc3R1ZmYKKyAqCisgKiBSZXZpc2lvbiAxLjEwICAxOTk0LzA2LzExICAyMDozNjowOCAgYmVudHNvbgorICogY2xlYW4gdXAgY29tcGlsZXIgd2FybmluZ3MKKyAqCisgKiBSZXZpc2lvbiAxLjkgIDE5OTQvMDYvMTEgIDE5OjQyOjQ2ICBiZW50c29uCisgKiBhZGRlZCBhIGJ1bmNoIG9mIGNvZGUgdG8gc3VwcG9ydCBtb2RlbSBzaWduYWxsaW5nCisgKgorICogUmV2aXNpb24gMS44ICAxOTk0LzA2LzExICAxNzo1NzowNyAgYmVudHNvbgorICogcmVjb2duaXplIGJyZWFrICYgcGFyaXR5IGVycm9yCisgKgorICogUmV2aXNpb24gMS43ICAxOTk0LzA2LzA1ICAwNTo1MTozNCAgYmVudHNvbgorICogUmVvcmRlciBiYXVkIHRhYmxlIHRvIGJlIG1vbm90b25pYzsgYWRkIGNsaSB0byBDUDsgZGlzY2FyZAorICogaW5jb21pbmcgY2hhcmFjdGVycyBhbmQgc3RhdHVzIGlmIHRoZSBsaW5lIGlzbid0IG9wZW47IHN0YXJ0IHRvCisgKiBmb2xkIGNvZGUgaW50byBjeV90aHJvdHRsZTsgc3RhcnQgdG8gcG9ydCBnZXRfc2VyaWFsX2luZm8sCisgKiBzZXRfc2VyaWFsX2luZm8sIGdldF9tb2RlbV9pbmZvLCBzZXRfbW9kZW1faW5mbywgYW5kIHNlbmRfYnJlYWsKKyAqIGZyb20gc2VyaWFsLmM7IGV4cGFuZCBjeV9pb2N0bDsgcmVsb2NhdGUgYW5kIGV4cGFuZCBjb25maWdfc2V0dXA7CisgKiBnZXQgZmxvdyBjb250cm9sIGNoYXJhY3RlcnMgZnJvbSB0dHkgc3RydWN0OyBpbnZhbGlkYXRlIHBvcnRzIHcvbworICogaGFyZHdhcmU7CisgKgorICogUmV2aXNpb24gMS42ICAxOTk0LzA1LzMxICAxODo0MjoyMSAgYmVudHNvbgorICogYWRkIGEgbG9vcC1icmVha2VyIGluIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lOworICogbm90ZSB3aGVuIHBvcnQgaXMgaW5pdGlhbGl6ZWQgc28gdGhhdCBpdCBjYW4gYmUgc2h1dAorICogZG93biB1bmRlciB0aGUgcmlnaHQgY29uZGl0aW9uczsgcmVjZWl2ZSB3b3JrcyB3aXRob3V0CisgKiBhbnkgb2J2aW91cyBlcnJvcnMKKyAqCisgKiBSZXZpc2lvbiAxLjUgIDE5OTQvMDUvMzAgIDAwOjU1OjAyICBiZW50c29uCisgKiB0cmFuc21pdCB3b3JrcyB3aXRob3V0IG9idmlvdXMgZXJyb3JzCisgKgorICogUmV2aXNpb24gMS40ICAxOTk0LzA1LzI3ICAxODo0NjoyNyAgYmVudHNvbgorICogaW5jb3Jwb3JhdGVkIG1vcmUgY29kZSBmcm9tIGxpYl95LmM7IGNhbiBub3cgcHJpbnQgc2hvcnQKKyAqIHN0cmluZ3MgdW5kZXIgaW50ZXJydXB0IGNvbnRyb2wgdG8gcG9ydCB6ZXJvOyBzZWVtcyB0bworICogc2VsZWN0IHBvcnRzL2NoYW5uZWxzL2xpbmVzIGNvcnJlY3RseQorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5NC8wNS8yNSAgMjI6MTI6NDQgIGJlbnRzb24KKyAqIHNoaWZ0aW5nIGZyb20gbXVsdGktcG9ydCBvbiBhIGNhcmQgdG8gcHJvcGVyIG11bHRpcGxleG9yCisgKiBkYXRhIHN0cnVjdHVyZXM7ICBhZGRlZCBza2VsZXRvbnMgb2YgbW9zdCByb3V0aW5lcworICoKKyAqIFJldmlzaW9uIDEuMiAgMTk5NC8wNS8xOSAgMTM6MjE6NDMgIGJlbnRzb24KKyAqIHN0YXJ0IHRvIGNyaWIgZnJvbSBvdGhlciBzb3VyY2VzCisgKgorICovCisKKy8qIElmIHlvdSBuZWVkIHRvIGluc3RhbGwgbW9yZSBib2FyZHMgdGhhbiBOUl9DQVJEUywgY2hhbmdlIHRoZSBjb25zdGFudAorICAgaW4gdGhlIGRlZmluaXRpb24gYmVsb3cuIE5vIG90aGVyIGNoYW5nZSBpcyBuZWNlc3NhcnkgdG8gc3VwcG9ydCB1cCB0bworICAgZWlnaHQgYm9hcmRzLiBCZXlvbmQgdGhhdCB5b3UnbGwgaGF2ZSB0byBleHRlbmQgY3lfaXNhX2FkZHJlc3Nlcy4gKi8KKworI2RlZmluZSBOUl9DQVJEUyAgICAgICAgNAorCisvKgorICAgSWYgdGhlIHRvdGFsIG51bWJlciBvZiBwb3J0cyBpcyBsYXJnZXIgdGhhbiBOUl9QT1JUUywgY2hhbmdlIHRoaXMKKyAgIGNvbnN0YW50IGluIHRoZSBkZWZpbml0aW9uIGJlbG93LiBObyBvdGhlciBjaGFuZ2UgaXMgbmVjZXNzYXJ5IHRvCisgICBzdXBwb3J0IG1vcmUgYm9hcmRzL3BvcnRzLiAqLworCisjZGVmaW5lIE5SX1BPUlRTICAgICAgICAyNTYKKworI2RlZmluZSBaRV9WMV9OUE9SVFMJNjQKKyNkZWZpbmUgWk9fVjEJMAorI2RlZmluZSBaT19WMgkxCisjZGVmaW5lIFpFX1YxCTIKKworI2RlZmluZQlTRVJJQUxfUEFSQU5PSUFfQ0hFQ0sKKyN1bmRlZglDWV9ERUJVR19PUEVOCisjdW5kZWYJQ1lfREVCVUdfVEhST1RUTEUKKyN1bmRlZglDWV9ERUJVR19PVEhFUgorI3VuZGVmCUNZX0RFQlVHX0lPCisjdW5kZWYJQ1lfREVCVUdfQ09VTlQKKyN1bmRlZglDWV9ERUJVR19EVFIKKyN1bmRlZglDWV9ERUJVR19XQUlUX1VOVElMX1NFTlQKKyN1bmRlZglDWV9ERUJVR19JTlRFUlJVUFRTCisjdW5kZWYJQ1lfMTZZX0hBQ0sKKyN1bmRlZglDWV9FTkFCTEVfTU9OSVRPUklORworI3VuZGVmCUNZX1BDSV9ERUJVRworCisjaWYgMAorI2RlZmluZSBQQVVTRSBfX2FzbV9fKCJub3AiKTsKKyNlbHNlCisjZGVmaW5lIFBBVVNFIDsKKyNlbmRpZgorCisvKgorICogSW5jbHVkZSBzZWN0aW9uIAorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N5Y2xhZGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lCUNZX0xPQ0soaW5mbyxmbGFncykJCQkJCVwKKwkJZG8gewkJCQkJCVwKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmN5X2NhcmRbaW5mby0+Y2FyZF0uY2FyZF9sb2NrLCBmbGFncyk7IFwKKwkJfSB3aGlsZSAoMCkKKwkJCisjZGVmaW5lCUNZX1VOTE9DSyhpbmZvLGZsYWdzKQkJCQkJXAorCQlkbyB7CQkJCQkJXAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjeV9jYXJkW2luZm8tPmNhcmRdLmNhcmRfbG9jaywgZmxhZ3MpOyBcCisJCX0gd2hpbGUgKDApCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworc3RhdGljIHZvaWQgY3lfdGhyb3R0bGUgKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgY3lfc2VuZF94Y2hhciAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCk7CisKKyNkZWZpbmUgSVNfQ1lDX1ooY2FyZCkgKChjYXJkKS5udW1fY2hpcHMgPT0gLTEpCisKKyNkZWZpbmUgWl9GUEdBX0NIRUNLKGNhcmQpIFwKKyAgICAoKGN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKSBcCisJCSAoKGNhcmQpLmN0bF9hZGRyKSktPmluaXRfY3RybCkgJiAoMTw8MTcpKSAhPSAwKQorCisjZGVmaW5lIElTWkxPQURFRChjYXJkKQkoKChaT19WMT09Y3lfcmVhZGwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopIFwKKwkJCSgoY2FyZCkuY3RsX2FkZHIpKS0+bWFpbF9ib3hfMCkpIHx8IFwKKwkJCVpfRlBHQV9DSEVDSyhjYXJkKSkgJiYgXAorCQkJKFpGSVJNX0lEPT1jeV9yZWFkbCgmKChzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICopIFwKKwkJCSgoY2FyZCkuYmFzZV9hZGRyK0lEX0FERFJFU1MpKS0+c2lnbmF0dXJlKSkpCisKKyNpZm5kZWYgU0VSSUFMX1hNSVRfU0laRQorI2RlZmluZQlTRVJJQUxfWE1JVF9TSVpFCShtaW4oUEFHRV9TSVpFLCA0MDk2KSkKKyNlbmRpZgorI2RlZmluZSBXQUtFVVBfQ0hBUlMJCTI1NgorCisjZGVmaW5lIFNURF9DT01fRkxBR1MgKDApCisKKyNkZWZpbmUJSklGRklFU19ESUZGKG4sIGopCSgoaikgLSAobikpCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqY3lfc2VyaWFsX2RyaXZlcjsKKworI2lmZGVmIENPTkZJR19JU0EKKy8qIFRoaXMgaXMgdGhlIGFkZHJlc3MgbG9va3VwIHRhYmxlLiBUaGUgZHJpdmVyIHdpbGwgcHJvYmUgZm9yCisgICBDeWNsb20tWS9JU0EgYm9hcmRzIGF0IGFsbCBhZGRyZXNzZXMgaW4gaGVyZS4gSWYgeW91IHdhbnQgdGhlCisgICBkcml2ZXIgdG8gcHJvYmUgYWRkcmVzc2VzIGF0IGEgZGlmZmVyZW50IGFkZHJlc3MsIGFkZCBpdCB0bworICAgdGhpcyB0YWJsZS4gIElmIHRoZSBkcml2ZXIgaXMgcHJvYmluZyBzb21lIG90aGVyIGJvYXJkIGFuZAorICAgY2F1c2luZyBwcm9ibGVtcywgcmVtb3ZlIHRoZSBvZmZlbmRpbmcgYWRkcmVzcyBmcm9tIHRoaXMgdGFibGUuCisgICBUaGUgY3lfc2V0dXAgZnVuY3Rpb24gZXh0cmFjdHMgYWRkaXRpb25hbCBhZGRyZXNzZXMgZnJvbSB0aGUKKyAgIGJvb3Qgb3B0aW9ucyBsaW5lLiAgVGhlIGZvcm0gaXMgImN5Y2xhZGVzPWFkZHJlc3MsYWRkcmVzcy4uLiIKKyovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3lfaXNhX2FkZHJlc3Nlc1tdID0geworICAgICAgICAweEQwMDAwLAorICAgICAgICAweEQyMDAwLAorICAgICAgICAweEQ0MDAwLAorICAgICAgICAweEQ2MDAwLAorICAgICAgICAweEQ4MDAwLAorICAgICAgICAweERBMDAwLAorICAgICAgICAweERDMDAwLAorICAgICAgICAweERFMDAwLAorICAgICAgICAwLDAsMCwwLDAsMCwwLDAKK307CisjZGVmaW5lIE5SX0lTQV9BRERSUyAoc2l6ZW9mKGN5X2lzYV9hZGRyZXNzZXMpL3NpemVvZih1bnNpZ25lZCBjaGFyKikpCisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBsb25nIG1hZGRyW05SX0NBUkRTXSA9IHsgMCwgfTsKK3N0YXRpYyBpbnQgaXJxW05SX0NBUkRTXSAgPSB7IDAsIH07CisKK21vZHVsZV9wYXJhbV9hcnJheShtYWRkciwgbG9uZywgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworI2VuZGlmCisKKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCisKKy8qIFRoaXMgaXMgdGhlIHBlci1jYXJkIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgYWRkcmVzcywgaXJxLCBudW1iZXIgb2YKKyAgIGNoYW5uZWxzLCBldGMuIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGEgbWF4aW11bSBvZiBOUl9DQVJEUyBjYXJkcy4KKyovCitzdGF0aWMgc3RydWN0IGN5Y2xhZGVzX2NhcmQgY3lfY2FyZFtOUl9DQVJEU107CisKKy8qIFRoaXMgaXMgdGhlIHBlci1jaGFubmVsIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9pbnRlcnMsIGZsYWdzCisgYW5kIHZhcmlhYmxlcyBmb3IgdGhlIHBvcnQuIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGEgbWF4aW11bSBvZiBOUl9QT1JUUy4KKyovCitzdGF0aWMgc3RydWN0IGN5Y2xhZGVzX3BvcnQgY3lfcG9ydFtOUl9QT1JUU107CisKK3N0YXRpYyBpbnQgY3lfbmV4dF9jaGFubmVsOyAvKiBuZXh0IG1pbm9yIGF2YWlsYWJsZSAqLworCisvKgorICogdG1wX2J1ZiBpcyB1c2VkIGFzIGEgdGVtcG9yYXJ5IGJ1ZmZlciBieSBzZXJpYWxfd3JpdGUuICBXZSBuZWVkIHRvCisgKiBsb2NrIGl0IGluIGNhc2UgdGhlIGNvcHlfZnJvbV91c2VyIGJsb2NrcyB3aGlsZSBzd2FwcGluZyBpbiBhIHBhZ2UsCisgKiBhbmQgc29tZSBvdGhlciBwcm9ncmFtIHRyaWVzIHRvIGRvIGEgc2VyaWFsIHdyaXRlIGF0IHRoZSBzYW1lIHRpbWUuCisgKiBTaW5jZSB0aGUgbG9jayB3aWxsIG9ubHkgY29tZSB1bmRlciBjb250ZW50aW9uIHdoZW4gdGhlIHN5c3RlbSBpcworICogc3dhcHBpbmcgYW5kIGF2YWlsYWJsZSBtZW1vcnkgaXMgbG93LCBpdCBtYWtlcyBzZW5zZSB0byBzaGFyZSBvbmUKKyAqIGJ1ZmZlciBhY3Jvc3MgYWxsIHRoZSBzZXJpYWwgcG9ydHMsIHNpbmNlIGl0IHNpZ25pZmljYW50bHkgc2F2ZXMKKyAqIG1lbW9yeSBpZiBsYXJnZSBudW1iZXJzIG9mIHNlcmlhbCBwb3J0cyBhcmUgb3Blbi4gIFRoaXMgYnVmZmVyIGlzCisgKiBhbGxvY2F0ZWQgd2hlbiB0aGUgZmlyc3QgY3lfb3BlbiBvY2N1cnMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmOworCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGxvb2sgdXAgdGhlIGRpdmlzb3Igc3BlZWRzIGFuZCB0aGUgdGltZW91dHMKKyAqIFdlJ3JlIG5vcm1hbGx5IGxpbWl0ZWQgdG8gMTUgZGlzdGluY3QgYmF1ZCByYXRlcy4gIFRoZSBleHRyYQorICogYXJlIGFjY2Vzc2VkIHZpYSBzZXR0aW5ncyBpbiBpbmZvLT5mbGFncy4KKyAqICAgICAgMCwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwKKyAqICAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISSAgICAgICAgICAgIFZISQorICogICAgIDIwCisgKi8KK3N0YXRpYyBpbnQgYmF1ZF90YWJsZVtdID0geworICAgICAgIDAsICAgIDUwLCAgICA3NSwgICAxMTAsICAgMTM0LCAgIDE1MCwgICAyMDAsICAgMzAwLCAgIDYwMCwgIDEyMDAsCisgICAgMTgwMCwgIDI0MDAsICA0ODAwLCAgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgNzY4MDAsMTE1MjAwLDE1MDAwMCwKKyAgMjMwNDAwLCAgICAgMH07CisKK3N0YXRpYyBjaGFyIGJhdWRfY29fMjVbXSA9IHsgIC8qIDI1IE1IeiBjbG9jayBvcHRpb24gdGFibGUgKi8KKyAgICAvKiB2YWx1ZSA9PiAgICAwMCAgICAwMSAgIDAyICAgIDAzICAgIDA0ICovCisgICAgLyogZGl2aWRlIGJ5ICAgIDggICAgMzIgICAxMjggICA1MTIgIDIwNDggKi8KKyAgICAweDAwLCAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDQsICAweDAzLCAgMHgwMywgIDB4MDMsICAweDAyLAorICAgIDB4MDIsICAweDAyLCAgMHgwMSwgIDB4MDEsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDB9OworCitzdGF0aWMgY2hhciBiYXVkX2Jwcl8yNVtdID0geyAgLyogMjUgTUh6IGJhdWQgcmF0ZSBwZXJpb2QgdGFibGUgKi8KKyAgICAweDAwLCAgMHhmNSwgIDB4YTMsICAweDZmLCAgMHg1YywgIDB4NTEsICAweGY1LCAgMHhhMywgIDB4NTEsICAweGEzLAorICAgIDB4NmQsICAweDUxLCAgMHhhMywgIDB4NTEsICAweGEzLCAgMHg1MSwgIDB4MzYsICAweDI5LCAgMHgxYiwgIDB4MTV9OworCitzdGF0aWMgY2hhciBiYXVkX2NvXzYwW10gPSB7ICAvKiA2MCBNSHogY2xvY2sgb3B0aW9uIHRhYmxlIChDRDE0MDAgSikgKi8KKyAgICAvKiB2YWx1ZSA9PiAgICAwMCAgICAwMSAgIDAyICAgIDAzICAgIDA0ICovCisgICAgLyogZGl2aWRlIGJ5ICAgIDggICAgMzIgICAxMjggICA1MTIgIDIwNDggKi8KKyAgICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDA0LCAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDMsICAweDAzLAorICAgIDB4MDMsICAweDAyLCAgMHgwMiwgIDB4MDEsICAweDAxLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgICAgMHgwMH07CisKK3N0YXRpYyBjaGFyIGJhdWRfYnByXzYwW10gPSB7ICAvKiA2MCBNSHogYmF1ZCByYXRlIHBlcmlvZCB0YWJsZSAoQ0QxNDAwIEopICovCisgICAgMHgwMCwgIDB4ODIsICAweDIxLCAgMHhmZiwgIDB4ZGIsICAweGMzLCAgMHg5MiwgIDB4NjIsICAweGMzLCAgMHg2MiwKKyAgICAweDQxLCAgMHhjMywgIDB4NjIsICAweGMzLCAgMHg2MiwgIDB4YzMsICAweDgyLCAgMHg2MiwgIDB4NDEsICAweDMyLAorICAgIDB4MjF9OworCitzdGF0aWMgY2hhciBiYXVkX2NvcjNbXSA9IHsgIC8qIHJlY2VpdmUgdGhyZXNob2xkICovCisgICAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwKKyAgICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDA5LCAgMHgwOSwgIDB4MDgsICAweDA4LCAgMHgwOCwgIDB4MDgsICAweDA3LAorICAgIDB4MDd9OworCisvKgorICogVGhlIEN5Y2xhZGVzIGRyaXZlciBpbXBsZW1lbnRzIEhXIGZsb3cgY29udHJvbCBhcyBhbnkgc2VyaWFsIGRyaXZlci4KKyAqIFRoZSBjeWNsYWRlc19wb3J0IHN0cnVjdHVyZSBtZW1iZXIgcmZsb3cgYW5kIHRoZSB2ZWN0b3IgcmZsb3dfdGhyIAorICogYWxsb3dzIHVzIHRvIHRha2UgYWR2YW50YWdlIG9mIGEgc3BlY2lhbCBmZWF0dXJlIGluIHRoZSBDRDE0MDAgdG8gYXZvaWQgCisgKiBkYXRhIGxvc3MgZXZlbiB3aGVuIHRoZSBzeXN0ZW0gaW50ZXJydXB0IGxhdGVuY3kgaXMgdG9vIGhpZ2guIFRoZXNlIGZsYWdzIAorICogYXJlIHRvIGJlIHVzZWQgb25seSB3aXRoIHZlcnkgc3BlY2lhbCBhcHBsaWNhdGlvbnMuIFNldHRpbmcgdGhlc2UgZmxhZ3MgCisgKiByZXF1aXJlcyB0aGUgdXNlIG9mIGEgc3BlY2lhbCBjYWJsZSAoRFRSIGFuZCBSVFMgcmV2ZXJzZWQpLiBJbiB0aGUgbmV3IAorICogQ0QxNDAwLWJhc2VkIGJvYXJkcyAocmV2LiA2LjAwIG9yIGxhdGVyKSwgdGhlcmUgaXMgbm8gbmVlZCBmb3Igc3BlY2lhbCAKKyAqIGNhYmxlcy4KKyAqLworCitzdGF0aWMgY2hhciByZmxvd190aHJbXSA9IHsgIC8qIHJmbG93IHRocmVzaG9sZCAqLworICAgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgICAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwKKyAgICAweDBhfTsKKworLyogIFRoZSBDeWNsb20tWWUgaGFzIHBsYWNlZCB0aGUgc2VxdWVudGlhbCBjaGlwcyBpbiBub24tc2VxdWVudGlhbAorICogIGFkZHJlc3Mgb3JkZXIuICBUaGlzIGxvb2stdXAgdGFibGUgb3ZlcmNvbWVzIHRoYXQgcHJvYmxlbS4KKyAqLworc3RhdGljIGludCBjeV9jaGlwX29mZnNldCBbXSA9CisgICAgeyAweDAwMDAsCisgICAgICAweDA0MDAsCisgICAgICAweDA4MDAsCisgICAgICAweDBDMDAsCisgICAgICAweDAyMDAsCisgICAgICAweDA2MDAsCisgICAgICAweDBBMDAsCisgICAgICAweDBFMDAKKyAgICB9OworCisvKiBQQ0kgcmVsYXRlZCBkZWZpbml0aW9ucyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQJY3lfcGNpX25ib2FyZDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAljeV9pc2FfbmJvYXJkOworc3RhdGljIHVuc2lnbmVkIHNob3J0CWN5X25ib2FyZDsKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgdW5zaWduZWQgc2hvcnQJY3lfcGNpX2Rldl9pZFtdID0geworCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfTG8sCS8qIFBDSSA8IDFNYiAqLworCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfSGksCS8qIFBDSSA+IDFNYiAqLworCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NXzRZX0xvLAkvKiA0WSBQQ0kgPCAxTWIgKi8KKwkJCSAgICBQQ0lfREVWSUNFX0lEX0NZQ0xPTV80WV9IaSwJLyogNFkgUENJID4gMU1iICovCisJCQkgICAgUENJX0RFVklDRV9JRF9DWUNMT01fOFlfTG8sCS8qIDhZIFBDSSA8IDFNYiAqLworCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NXzhZX0hpLAkvKiA4WSBQQ0kgPiAxTWIgKi8KKwkJCSAgICBQQ0lfREVWSUNFX0lEX0NZQ0xPTV9aX0xvLAkvKiBaIFBDSSA8IDFNYiAqLworCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1pfSGksCS8qIFogUENJID4gMU1iICovCisJCQkgICAgMAkJCQkvKiBlbmQgb2YgdGFibGUgKi8KKwkJCX07CisjZW5kaWYKKworc3RhdGljIHZvaWQgY3lfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBzZXRfbGluZV9jaGFyKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopOworc3RhdGljIGludCBjeXpfaXNzdWVfY21kKHN0cnVjdCBjeWNsYWRlc19jYXJkICosIHVjbG9uZywgdWNjaGFyLCB1Y2xvbmcpOworI2lmZGVmIENPTkZJR19JU0EKK3N0YXRpYyB1bnNpZ25lZCBkZXRlY3RfaXNhX2lycSh2b2lkIF9faW9tZW0gKik7CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworCitzdGF0aWMgaW50IGN5Y2xhZGVzX2dldF9wcm9jX2luZm8oY2hhciAqLCBjaGFyICoqLCBvZmZfdCAsIGludCAsIGludCAqLCB2b2lkICopOworCisjaWZuZGVmIENPTkZJR19DWVpfSU5UUgorc3RhdGljIHZvaWQgY3l6X3BvbGwodW5zaWduZWQgbG9uZyk7CisKKy8qIFRoZSBDeWNsYWRlcy1aIHBvbGxpbmcgY3ljbGUgaXMgZGVmaW5lZCBieSB0aGlzIHZhcmlhYmxlICovCitzdGF0aWMgbG9uZyBjeXpfcG9sbGluZ19jeWNsZSA9IENaX0RFRl9QT0xMOworCitzdGF0aWMgaW50IGN5el90aW1lcm9uID0gMDsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBjeXpfdGltZXJsaXN0ID0gVElNRVJfSU5JVElBTElaRVIoY3l6X3BvbGwsIDAsIDApOworCisjZWxzZSAvKiBDT05GSUdfQ1laX0lOVFIgKi8KK3N0YXRpYyB2b2lkIGN5el9yeF9yZXN0YXJ0KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGN5el9yeF9mdWxsX3RpbWVyW05SX1BPUlRTXTsKKyNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KKworc3RhdGljIGlubGluZSBpbnQKK3NlcmlhbF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCit7CisjaWZkZWYgU0VSSUFMX1BBUkFOT0lBX0NIRUNLCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmJhZG1hZ2ljID0KKyAgICAgICAgImN5YyBXYXJuaW5nOiBiYWQgbWFnaWMgbnVtYmVyIGZvciBzZXJpYWwgc3RydWN0ICglcykgaW4gJXNcbiI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmJhZGluZm8gPQorICAgICAgICAiY3ljIFdhcm5pbmc6IG51bGwgY3ljbGFkZXNfcG9ydCBmb3IgKCVzKSBpbiAlc1xuIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYmFkcmFuZ2UgPQorICAgICAgICAiY3ljIFdhcm5pbmc6IGN5Y2xhZGVzX3BvcnQgb3V0IG9mIHJhbmdlIGZvciAoJXMpIGluICVzXG4iOworCisgICAgaWYgKCFpbmZvKSB7CisgICAgICAgIHByaW50ayhiYWRpbmZvLCBuYW1lLCByb3V0aW5lKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoIChsb25nKWluZm8gPCAobG9uZykoJmN5X3BvcnRbMF0pCisgICAgfHwgKGxvbmcpKCZjeV9wb3J0W05SX1BPUlRTXSkgPCAobG9uZylpbmZvICl7CisgICAgICAgIHByaW50ayhiYWRyYW5nZSwgbmFtZSwgcm91dGluZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmIChpbmZvLT5tYWdpYyAhPSBDWUNMQURFU19NQUdJQykgeworICAgICAgICBwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIDA7Cit9IC8qIHNlcmlhbF9wYXJhbm9pYV9jaGVjayAqLworCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyIHRvIHNjaGVkdWxlCisgKiBwcm9jZXNzaW5nIGluIHRoZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgcG9ydGlvbiBvZiB0aGUgZHJpdmVyCisgKiAoYWxzbyBrbm93biBhcyB0aGUgImJvdHRvbSBoYWxmIikuICBUaGlzIGNhbiBiZSBjYWxsZWQgYW55CisgKiBudW1iZXIgb2YgdGltZXMgZm9yIGFueSBjaGFubmVsIHdpdGhvdXQgaGFybS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitjeV9zY2hlZF9ldmVudChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbywgaW50IGV2ZW50KQoreworICAgIGluZm8tPmV2ZW50IHw9IDEgPDwgZXZlbnQ7IC8qIHJlbWVtYmVyIHdoYXQga2luZCBvZiBldmVudCBhbmQgd2hvICovCisgICAgc2NoZWR1bGVfd29yaygmaW5mby0+dHF1ZXVlKTsKK30gLyogY3lfc2NoZWRfZXZlbnQgKi8KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gaGFuZGxlIHRoZSAiYm90dG9tIGhhbGYiIHByb2Nlc3NpbmcgZm9yIHRoZQorICogc2VyaWFsIGRyaXZlciwga25vd24gYWxzbyB0aGUgInNvZnR3YXJlIGludGVycnVwdCIgcHJvY2Vzc2luZy4KKyAqIFRoaXMgcHJvY2Vzc2luZyBpcyBkb25lIGF0IHRoZSBrZXJuZWwgaW50ZXJydXB0IGxldmVsLCBhZnRlciB0aGUKKyAqIGN5Iy9faW50ZXJydXB0KCkgaGFzIHJldHVybmVkLCBCVVQgV0lUSCBJTlRFUlJVUFRTIFRVUk5FRCBPTi4gIFRoaXMKKyAqIGlzIHdoZXJlIHRpbWUtY29uc3VtaW5nIGFjdGl2aXRpZXMgd2hpY2ggY2FuIG5vdCBiZSBkb25lIGluIHRoZQorICogaW50ZXJydXB0IGRyaXZlciBwcm9wZXIgYXJlIGRvbmU7IHRoZSBpbnRlcnJ1cHQgZHJpdmVyIHNjaGVkdWxlcworICogdGhlbSB1c2luZyBjeV9zY2hlZF9ldmVudCgpLCBhbmQgdGhleSBnZXQgZG9uZSBoZXJlLgorICoKKyAqIFRoaXMgaXMgZG9uZSB0aHJvdWdoIG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbi0tdGhlIHRhc2sgcXVldWUuCisgKiBXaGVuIGEgaGFyZHdhcmUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSB3YW50cyBzZXJ2aWNlIGJ5IHRoZQorICogZHJpdmVyJ3MgYm90dG9tIGhhbGYsIGl0IGVucXVldWVzIHRoZSBhcHByb3ByaWF0ZSB0cV9zdHJ1Y3QgKG9uZQorICogcGVyIHBvcnQpIHRvIHRoZSBrZXZlbnRkIHdvcmsgcXVldWUgYW5kIHNldHMgYSByZXF1ZXN0IGZsYWcKKyAqIHRoYXQgdGhlIHdvcmsgcXVldWUgYmUgcHJvY2Vzc2VkLgorICoKKyAqIEFsdGhvdWdoIHRoaXMgbWF5IHNlZW0gdW53aWVsZHksIGl0IGdpdmVzIHRoZSBzeXN0ZW0gYSB3YXkgdG8KKyAqIHBhc3MgYW4gYXJndW1lbnQgKGluIHRoaXMgY2FzZSB0aGUgcG9pbnRlciB0byB0aGUgY3ljbGFkZXNfcG9ydAorICogc3RydWN0dXJlKSB0byB0aGUgYm90dG9tIGhhbGYgb2YgdGhlIGRyaXZlci4gIFByZXZpb3VzIGtlcm5lbHMKKyAqIGhhZCB0byBwb2xsIGV2ZXJ5IHBvcnQgdG8gc2VlIGlmIHRoYXQgcG9ydCBuZWVkZWQgc2VydmljaW5nLgorICovCitzdGF0aWMgdm9pZAorZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKikgcHJpdmF0ZV87CisgIHN0cnVjdCB0dHlfc3RydWN0ICAgICp0dHk7CisKKyAgICB0dHkgPSBpbmZvLT50dHk7CisgICAgaWYgKCF0dHkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfSEFOR1VQLCAmaW5mby0+ZXZlbnQpKSB7CisgICAgICAgIHR0eV9oYW5ndXAoaW5mby0+dHR5KTsKKyAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworICAgICAgICBpbmZvLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKyAgICB9CisgICAgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDeV9FVkVOVF9PUEVOX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkgeworICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisgICAgfQorI2lmZGVmIENPTkZJR19DWVpfSU5UUgorICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfWl9SWF9GVUxMLCAmaW5mby0+ZXZlbnQpKSB7CisJaWYgKGN5el9yeF9mdWxsX3RpbWVyW2luZm8tPmxpbmVdLmZ1bmN0aW9uID09IE5VTEwpIHsKKwkgICAgY3l6X3J4X2Z1bGxfdGltZXJbaW5mby0+bGluZV0uZXhwaXJlcyA9IGppZmZpZXMgKyAxOworCSAgICBjeXpfcnhfZnVsbF90aW1lcltpbmZvLT5saW5lXS5mdW5jdGlvbiA9IGN5el9yeF9yZXN0YXJ0OworCSAgICBjeXpfcnhfZnVsbF90aW1lcltpbmZvLT5saW5lXS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKKwkgICAgYWRkX3RpbWVyKCZjeXpfcnhfZnVsbF90aW1lcltpbmZvLT5saW5lXSk7CisJfQorICAgIH0KKyNlbmRpZgorICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfREVMVEFfV0FLRVVQLCAmaW5mby0+ZXZlbnQpKSB7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisgICAgfQorICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfV1JJVEVfV0FLRVVQLCAmaW5mby0+ZXZlbnQpKSB7CisgICAgICAgIHR0eV93YWtldXAodHR5KTsKKyAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworICAgIH0KKyNpZmRlZiBaX1dBS0UKKyAgICBpZiAodGVzdF9hbmRfY2xlYXJfYml0KEN5X0VWRU5UX1NIVVRET1dOX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkgeworICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnNodXRkb3duX3dhaXQpOworICAgIH0KKyNlbmRpZgorfSAvKiBkb19zb2Z0aW50ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKiBTdGFydCBvZiBibG9jayBvZiBDeWNsb20tWSBzcGVjaWZpYyBjb2RlICoqKioqKioqLworCisvKiBUaGlzIHJvdXRpbmUgd2FpdHMgdXAgdG8gMTAwMCBtaWNyby1zZWNvbmRzIGZvciB0aGUgcHJldmlvdXMKKyAgIGNvbW1hbmQgdG8gdGhlIENpcnJ1cyBjaGlwIHRvIGNvbXBsZXRlIGFuZCB0aGVuIGlzc3VlcyB0aGUKKyAgIG5ldyBjb21tYW5kLiAgQW4gZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIHByZXZpb3VzIGNvbW1hbmQKKyAgIGRpZG4ndCBmaW5pc2ggd2l0aGluIHRoZSB0aW1lIGxpbWl0LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGZyb20gaW5zaWRlIHNwaW5sb2NrLXByb3RlY3RlZCBjb2RlLgorICovCitzdGF0aWMgaW50CitjeXlfaXNzdWVfY21kKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyLCB1X2NoYXIgY21kLCBpbnQgaW5kZXgpCit7CisgIHZvbGF0aWxlIGludCAgaTsKKworICAgIC8qIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwcmV2aW91cyBjb21tYW5kIGhhcyBjb21wbGV0ZWQgKi8KKyAgICBmb3IoaSA9IDAgOyBpIDwgMTAwIDsgaSsrKXsKKwlpZiAoY3lfcmVhZGIoYmFzZV9hZGRyKyhDeUNDUjw8aW5kZXgpKSA9PSAwKXsKKwkgICAgYnJlYWs7CisJfQorCXVkZWxheSgxMEwpOworICAgIH0KKyAgICAvKiBpZiB0aGUgQ0NSIG5ldmVyIGNsZWFyZWQsIHRoZSBwcmV2aW91cyBjb21tYW5kCisgICAgICAgZGlkbid0IGZpbmlzaCB3aXRoaW4gdGhlICJyZWFzb25hYmxlIHRpbWUiICovCisgICAgaWYgKGkgPT0gMTAwKQlyZXR1cm4gKC0xKTsKKworICAgIC8qIElzc3VlIHRoZSBuZXcgY29tbWFuZCAqLworICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0NSPDxpbmRleCksIGNtZCk7CisKKyAgICByZXR1cm4oMCk7Cit9IC8qIGN5eV9pc3N1ZV9jbWQgKi8KKworI2lmZGVmIENPTkZJR19JU0EKKy8qIElTQSBpbnRlcnJ1cHQgZGV0ZWN0aW9uIGNvZGUgKi8KK3N0YXRpYyB1bnNpZ25lZCAKK2RldGVjdF9pc2FfaXJxKHZvaWQgX19pb21lbSAqYWRkcmVzcykKK3sKKyAgaW50IGlycTsKKyAgdW5zaWduZWQgbG9uZyBpcnFzLCBmbGFnczsKKyAgaW50IHNhdmVfeGlyLCBzYXZlX2NhcjsKKyAgaW50IGluZGV4ID0gMDsgLyogSVJRIHByb2JpbmcgaXMgb25seSBmb3IgSVNBICovCisKKyAgICAvKiBmb3JnZXQgcG9zc2libGUgaW5pdGlhbGx5IG1hc2tlZCBhbmQgcGVuZGluZyBJUlEgKi8KKyAgICBpcnEgPSBwcm9iZV9pcnFfb2ZmKHByb2JlX2lycV9vbigpKTsKKworICAgIC8qIENsZWFyIGludGVycnVwdHMgb24gdGhlIGJvYXJkIGZpcnN0ICovCisgICAgY3lfd3JpdGViKGFkZHJlc3MgKyAoQ3lfQ2xySW50cjw8aW5kZXgpLCAwKTsKKwkJCSAgICAgIC8qIEN5X0NsckludHIgaXMgMHgxODAwICovCisKKyAgICBpcnFzID0gcHJvYmVfaXJxX29uKCk7CisgICAgLyogV2FpdCAuLi4gKi8KKyAgICB1ZGVsYXkoNTAwMEwpOworCisgICAgLyogRW5hYmxlIHRoZSBUeCBpbnRlcnJ1cHRzIG9uIHRoZSBDRDE0MDAgKi8KKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY3lfd3JpdGViKGFkZHJlc3MgKyAoQ3lDQVI8PGluZGV4KSwgMCk7CisJY3l5X2lzc3VlX2NtZChhZGRyZXNzLCBDeUNIQU5fQ1RMfEN5RU5CX1hNVFIsIGluZGV4KTsKKworCWN5X3dyaXRlYihhZGRyZXNzICsgKEN5Q0FSPDxpbmRleCksIDApOworCWN5X3dyaXRlYihhZGRyZXNzICsgKEN5U1JFUjw8aW5kZXgpLCAKKwkJY3lfcmVhZGIoYWRkcmVzcyArIChDeVNSRVI8PGluZGV4KSkgfCBDeVR4UmR5KTsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICAvKiBXYWl0IC4uLiAqLworICAgIHVkZWxheSg1MDAwTCk7CisKKyAgICAvKiBDaGVjayB3aGljaCBpbnRlcnJ1cHQgaXMgaW4gdXNlICovCisgICAgaXJxID0gcHJvYmVfaXJxX29mZihpcnFzKTsKKworICAgIC8qIENsZWFuIHVwICovCisgICAgc2F2ZV94aXIgPSAodV9jaGFyKSBjeV9yZWFkYihhZGRyZXNzICsgKEN5VElSPDxpbmRleCkpOworICAgIHNhdmVfY2FyID0gY3lfcmVhZGIoYWRkcmVzcyArIChDeUNBUjw8aW5kZXgpKTsKKyAgICBjeV93cml0ZWIoYWRkcmVzcyArIChDeUNBUjw8aW5kZXgpLCAoc2F2ZV94aXIgJiAweDMpKTsKKyAgICBjeV93cml0ZWIoYWRkcmVzcyArIChDeVNSRVI8PGluZGV4KSwKKwljeV9yZWFkYihhZGRyZXNzICsgKEN5U1JFUjw8aW5kZXgpKSAmIH5DeVR4UmR5KTsKKyAgICBjeV93cml0ZWIoYWRkcmVzcyArIChDeVRJUjw8aW5kZXgpLCAoc2F2ZV94aXIgJiAweDNmKSk7CisgICAgY3lfd3JpdGViKGFkZHJlc3MgKyAoQ3lDQVI8PGluZGV4KSwgKHNhdmVfY2FyKSk7CisgICAgY3lfd3JpdGViKGFkZHJlc3MgKyAoQ3lfQ2xySW50cjw8aW5kZXgpLCAwKTsKKwkJCSAgICAgIC8qIEN5X0NsckludHIgaXMgMHgxODAwICovCisKKyAgICByZXR1cm4gKGlycSA+IDApPyBpcnEgOiAwOworfQorI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKworLyogVGhlIHJlYWwgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBpcyBjYWxsZWQKKyAgIHdoZW5ldmVyIHRoZSBjYXJkIHdhbnRzIGl0cyBoYW5kIGhlbGQtLWNoYXJzCisgICByZWNlaXZlZCwgb3V0IGJ1ZmZlciBlbXB0eSwgbW9kZW0gY2hhbmdlLCBldGMuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorY3l5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworICBpbnQgc3RhdHVzOworICBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm87CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkciwgKmNhcmRfYmFzZV9hZGRyOworICBpbnQgY2hpcDsKKyAgaW50IHNhdmVfeGlyLCBjaGFubmVsLCBzYXZlX2NhcjsKKyAgY2hhciBkYXRhOworICB2b2xhdGlsZSBpbnQgY2hhcl9jb3VudDsKKyAgaW50IG91dGNoOworICBpbnQgaSxqLGluZGV4OworICBpbnQgdG9vX21hbnk7CisgIGludCBoYWRfd29yazsKKyAgaW50IG1kbV9jaGFuZ2U7CisgIGludCBtZG1fc3RhdHVzOworCisgICAgaWYoKGNpbmZvID0gKHN0cnVjdCBjeWNsYWRlc19jYXJkICopZGV2X2lkKSA9PSAwKXsKKyNpZmRlZiBDWV9ERUJVR19JTlRFUlJVUFRTCisJcHJpbnRrKCJjeXlfaW50ZXJydXB0OiBzcHVyaW91cyBpbnRlcnJ1cHQgJWRcblxyIiwgaXJxKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gSVJRX05PTkU7IC8qIHNwdXJpb3VzIGludGVycnVwdCAqLworICAgIH0KKworICAgIGNhcmRfYmFzZV9hZGRyID0gY2luZm8tPmJhc2VfYWRkcjsKKyAgICBpbmRleCA9IGNpbmZvLT5idXNfaW5kZXg7CisKKworICAgIC8qIFRoaXMgbG9vcCBjaGVja3MgYWxsIGNoaXBzIGluIHRoZSBjYXJkLiAgTWFrZSBhIG5vdGUgd2hlbmV2ZXIKKyAgICAgICBfYW55XyBjaGlwIGhhZCBzb21lIHdvcmsgdG8gZG8sIGFzIHRoaXMgaXMgY29uc2lkZXJlZCBhbgorICAgICAgIGluZGljYXRpb24gdGhhdCB0aGVyZSB3aWxsIGJlIG1vcmUgdG8gZG8uICBPbmx5IHdoZW4gbm8gY2hpcAorICAgICAgIGhhcyBhbnkgd29yayBkb2VzIHRoaXMgb3V0ZXJtb3N0IGxvb3AgZXhpdC4KKyAgICAgKi8KKyAgICBkb3sKKyAgICAgICAgaGFkX3dvcmsgPSAwOworICAgICAgICBmb3IgKCBjaGlwID0gMCA7IGNoaXAgPCBjaW5mby0+bnVtX2NoaXBzIDsgY2hpcCArKykgeworICAgICAgICAgICAgYmFzZV9hZGRyID0gY2luZm8tPmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXTw8aW5kZXgpOworICAgICAgICAgICAgdG9vX21hbnkgPSAwOworICAgICAgICAgICAgd2hpbGUgKCAoc3RhdHVzID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVNWUlI8PGluZGV4KSkpICE9IDB4MDApIHsKKyAgICAgICAgICAgICAgICBoYWRfd29yaysrOworICAgICAgICAgICAgICAgIC8qIFRoZSBwdXJwb3NlIG9mIHRoZSBmb2xsb3dpbmcgdGVzdCBpcyB0byBlbnN1cmUgdGhhdAorICAgICAgICAgICAgICAgICAgIG5vIGNoaXAgY2FuIG1vbm9wb2xpemUgdGhlIGRyaXZlci4gIFRoaXMgZm9yY2VzIHRoZQorICAgICAgICAgICAgICAgICAgIGNoaXBzIHRvIGJlIGNoZWNrZWQgaW4gYSByb3VuZC1yb2JpbiBmYXNoaW9uIChhZnRlcgorICAgICAgICAgICAgICAgICAgIGRyYWluaW5nIGVhY2ggb2YgYSBidW5jaCAoMTAwMCkgb2YgY2hhcmFjdGVycykuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYoMTAwMDx0b29fbWFueSsrKXsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiBDeVNSUmVjZWl2ZSkgeyAvKiByZWNlcHRpb24gaW50ZXJydXB0ICovCisjaWZkZWYgQ1lfREVCVUdfSU5URVJSVVBUUworCQkgICAgcHJpbnRrKCJjeXlfaW50ZXJydXB0OiByY3ZkIGludHIsIGNoaXAgJWRcblxyIiwgY2hpcCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBjaGFubmVsICYgY2hhbmdlIHRvIHRoYXQgY29udGV4dCAqLworCQkgICAgc3Bpbl9sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZV94aXIgPSAodV9jaGFyKSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UklSPDxpbmRleCkpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gKHVfc2hvcnQgKSAoc2F2ZV94aXIgJiBDeUlSQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIGkgPSBjaGFubmVsICsgY2hpcCAqIDQgKyBjaW5mby0+Zmlyc3RfbGluZTsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9ICZjeV9wb3J0W2ldOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgICAgIHNhdmVfY2FyID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgc2F2ZV94aXIpOworCisgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZXJlIGlzIG5vd2hlcmUgdG8gcHV0IHRoZSBkYXRhLCBkaXNjYXJkIGl0ICovCisgICAgICAgICAgICAgICAgICAgIGlmKGluZm8tPnR0eSA9PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSAoY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVJJVlI8PGluZGV4KSkgJiBDeUlWUk1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBqID09IEN5SVZSUnhFeCApIHsgLyogZXhjZXB0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSRFNSPDxpbmRleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLyogbm9ybWFsIGNoYXJhY3RlciByZWNlcHRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2NvdW50ID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVJEQ1I8PGluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoY2hhcl9jb3VudC0tKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSRFNSPDxpbmRleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7IC8qIHRoZXJlIGlzIGFuIG9wZW4gcG9ydCBmb3IgdGhpcyBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICB0dHkgPSBpbmZvLT50dHk7CisgICAgICAgICAgICAgICAgICAgICAgICBqID0gKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSSVZSPDxpbmRleCkpICYgQ3lJVlJNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaiA9PSBDeUlWUlJ4RXggKSB7IC8qIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKTsKKworCQkJICAgIC8qIEZvciBzdGF0aXN0aWNzIG9ubHkgKi8KKwkJCSAgICBpZiAoZGF0YSAmIEN5QlJFQUspCisJCQkJaW5mby0+aWNvdW50LmJyaysrOworCQkJICAgIGVsc2UgaWYoZGF0YSAmIEN5RlJBTUUpCisJCQkJaW5mby0+aWNvdW50LmZyYW1lKys7CisJCQkgICAgZWxzZSBpZihkYXRhICYgQ3lQQVJJVFkpCisJCQkJaW5mby0+aWNvdW50LnBhcml0eSsrOworCQkJICAgIGVsc2UgaWYoZGF0YSAmIEN5T1ZFUlJVTikKKwkJCQlpbmZvLT5pY291bnQub3ZlcnJ1bisrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YSAmIGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayl7CisJCQkJaW5mby0+aWNvdW50LnJ4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eS0+ZmxpcC5jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmIGluZm8tPnJlYWRfc3RhdHVzX21hc2speworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YSAmIEN5QlJFQUspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPQorCSAgICAJCQkJCQkgICAgVFRZX0JSRUFLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPQorCQkJCQkgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSRFNSPDxpbmRleCkpOworCQkJCQlpbmZvLT5pY291bnQucngrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19TQUsodHR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihkYXRhICYgQ3lGUkFNRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9CisJCQkJCQkJICAgIFRUWV9GUkFNRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0KKwkJCQkJICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKTsKKwkJCQkJaW5mby0+aWNvdW50LnJ4Kys7CisJCQkJCWluZm8tPmlkbGVfc3RhdHMuZnJhbWVfZXJycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoZGF0YSAmIEN5UEFSSVRZKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0KKwkJCQkJCQkgICAgVFRZX1BBUklUWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0KKwkJCQkJICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKTsKKwkJCQkJaW5mby0+aWNvdW50LnJ4Kys7CisJCQkJCWluZm8tPmlkbGVfc3RhdHMucGFyaXR5X2VycnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGRhdGEgJiBDeU9WRVJSVU4peworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPQorCQkJCQkJCSAgICBUVFlfT1ZFUlJVTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKKwkJCQkJaW5mby0+aWNvdW50LnJ4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGZsaXAgYnVmZmVyIGl0c2VsZiBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93aW5nLCB3ZSBzdGlsbCBsb3NlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5leHQgaW5jb21pbmcgY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR0eS0+ZmxpcC5jb3VudAorCQkJCQkgICAgICAgICAgIDwgVFRZX0ZMSVBCVUZfU0laRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eS0+ZmxpcC5jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0KKwkJCQkJCQkgICAgIFRUWV9OT1JNQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9CisJCQkJCSAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKTsKKwkJCQkJICAgIGluZm8tPmljb3VudC5yeCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJaW5mby0+aWRsZV9zdGF0cy5vdmVycnVucysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlc2UgdHdvIGNvbmRpdGlvbnMgbWF5IGltcGx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhIG5vcm1hbCByZWFkIHNob3VsZCBiZSBkb25lLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogfWVsc2UgaWYoZGF0YSAmIEN5VElNRU9VVCl7ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB9ZWxzZSBpZihkYXRhICYgQ3lTUEVDSEFSKXsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOworCQkJCQlpbmZvLT5pY291bnQucngrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOworCQkJCSAgICBpbmZvLT5pY291bnQucngrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVyZSB3YXMgYSBzb2Z0d2FyZSBidWZmZXIKKwkJCQkgICBvdmVycnVuIGFuZCBub3RoaW5nIGNvdWxkIGJlCisJCQkJICAgZG9uZSBhYm91dCBpdCEhISAqLworCQkJCWluZm8tPmljb3VudC5idWZfb3ZlcnJ1bisrOworCQkJCWluZm8tPmlkbGVfc3RhdHMub3ZlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiBub3JtYWwgY2hhcmFjdGVyIHJlY2VwdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvYWQgIyBjaGFycyBhdmFpbGFibGUgZnJvbSB0aGUgY2hpcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfY291bnQgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRDUjw8aW5kZXgpKTsKKworI2lmZGVmIENZX0VOQUJMRV9NT05JVE9SSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpbmZvLT5tb24uaW50X2NvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1vbi5jaGFyX2NvdW50ICs9IGNoYXJfY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJfY291bnQgPiBpbmZvLT5tb24uY2hhcl9tYXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bW9uLmNoYXJfbWF4ID0gY2hhcl9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tb24uY2hhcl9sYXN0ID0gY2hhcl9jb3VudDsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGNoYXJfY291bnQtLSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5LT5mbGlwLmNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9OT1JNQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBkYXRhOworCQkJCWluZm8tPmlkbGVfc3RhdHMucmVjdl9ieXRlcysrOworCQkJCWluZm8tPmljb3VudC5yeCsrOworI2lmZGVmIENZXzE2WV9IQUNLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgxMEwpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfaWRsZSA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2Ygc2VydmljZSAqLworICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVJJUjw8aW5kZXgpLCAoc2F2ZV94aXIgJiAweDNmKSk7CisgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksIChzYXZlX2NhcikpOworCQkgICAgc3Bpbl91bmxvY2soJmNpbmZvLT5jYXJkX2xvY2spOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmIEN5U1JUcmFuc21pdCkgeyAvKiB0cmFuc21pc3Npb24gaW50ZXJydXB0ICovCisgICAgICAgICAgICAgICAgICAgIC8qIFNpbmNlIHdlIG9ubHkgZ2V0IGhlcmUgd2hlbiB0aGUgdHJhbnNtaXQgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgIGlzIGVtcHR5LCB3ZSBrbm93IHdlIGNhbiBhbHdheXMgc3R1ZmYgYSBkb3plbgorICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLiAqLworI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKKwkJICAgIHByaW50aygiY3l5X2ludGVycnVwdDogeG1pdCBpbnRyLCBjaGlwICVkXG5cciIsIGNoaXApOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBjaGFubmVsICYgY2hhbmdlIHRvIHRoYXQgY29udGV4dCAqLworCQkgICAgc3Bpbl9sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZV94aXIgPSAodV9jaGFyKSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5VElSPDxpbmRleCkpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gKHVfc2hvcnQgKSAoc2F2ZV94aXIgJiBDeUlSQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIGkgPSBjaGFubmVsICsgY2hpcCAqIDQgKyBjaW5mby0+Zmlyc3RfbGluZTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZV9jYXIgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCkpOworICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCBzYXZlX3hpcik7CisKKyAgICAgICAgICAgICAgICAgICAgLyogdmFsaWRhdGUgdGhlIHBvcnQjIChhcyBjb25maWd1cmVkIGFuZCBvcGVuKSAqLworICAgICAgICAgICAgICAgICAgICBpZiggKGkgPCAwKSB8fCAoTlJfUE9SVFMgPD0gaSkgKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSAmIH5DeVR4UmR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHhlbmQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9ICZjeV9wb3J0W2ldOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgICAgIGlmKGluZm8tPnR0eSA9PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSAmIH5DeVR4UmR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHhkb25lOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogbG9hZCB0aGUgb24tY2hpcCBzcGFjZSBmb3Igb3V0Ym91bmQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICBjaGFyX2NvdW50ID0gaW5mby0+eG1pdF9maWZvX3NpemU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoaW5mby0+eF9jaGFyKSB7IC8qIHNlbmQgc3BlY2lhbCBjaGFyICovCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRjaCA9IGluZm8tPnhfY2hhcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5VERSPDxpbmRleCksIG91dGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfY291bnQtLTsKKwkJCWluZm8tPmljb3VudC50eCsrOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+eF9jaGFyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5icmVha29uIHx8IGluZm8tPmJyZWFrb2ZmKSB7CisJCQlpZiAoaW5mby0+YnJlYWtvbikgeworCQkJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lURFI8PGluZGV4KSwgMCk7IAorCQkJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lURFI8PGluZGV4KSwgMHg4MSk7CisJCQkgICAgaW5mby0+YnJlYWtvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9jb3VudCAtPSAyOworCQkJfQorCQkJaWYgKGluZm8tPmJyZWFrb2ZmKSB7CisJCQkgICAgY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVREUjw8aW5kZXgpLCAwKTsgCisJCQkgICAgY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVREUjw8aW5kZXgpLCAweDgzKTsKKwkJCSAgICBpbmZvLT5icmVha29mZiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9jb3VudCAtPSAyOworCQkJfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoYXJfY291bnQtLSA+IDApeworCQkJaWYgKCFpbmZvLT54bWl0X2NudCl7CisJCQkgICAgaWYgKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpJkN5VHhNcHR5KSB7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksCisJCQkJCSAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSkgJgorCQkJCQkgIH5DeVR4TXB0eSk7CisJCQkgICAgfSBlbHNlIHsKKwkJCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKKwkJCQkJICAoKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpCisJCQkJCSAgICAmIH5DeVR4UmR5KQorCQkJCQkgICB8IEN5VHhNcHR5KSk7CisJCQkgICAgfQorCQkJICAgIGdvdG8gdHhkb25lOworCQkJfQorCQkJaWYgKGluZm8tPnhtaXRfYnVmID09IDApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpLAorCQkJCWN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpICYgCisJCQkJCX5DeVR4UmR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHR4ZG9uZTsKKwkJCX0KKwkJCWlmIChpbmZvLT50dHktPnN0b3BwZWQgfHwgaW5mby0+dHR5LT5od19zdG9wcGVkKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKKwkJCQljeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSAmIAorCQkJCQl+Q3lUeFJkeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0eGRvbmU7CisJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCZWNhdXNlIHRoZSBFbWJlZGRlZCBUcmFuc21pdCBDb21tYW5kcyBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWVuIGVuYWJsZWQsIHdlIG11c3QgY2hlY2sgdG8gc2VlIGlmIHRoZQorCQkJICAgZXNjYXBlIGNoYXJhY3RlciwgTlVMTCwgaXMgYmVpbmcgc2VudC4gIElmIGl0CisJCQkgICBpcywgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGVyZSBpcyByb29tIGZvciBpdAorCQkJICAgdG8gYmUgZG91YmxlZCBpbiB0aGUgb3V0cHV0IHN0cmVhbS4gIFRoZXJlZm9yZQorCQkJICAgd2Ugbm8gbG9uZ2VyIGFkdmFuY2UgdGhlIHBvaW50ZXIgd2hlbiB0aGUKKwkJCSAgIGNoYXJhY3RlciBpcyBmZXRjaGVkLCBidXQgcmF0aGVyIHdhaXQgdW50aWwKKwkJCSAgIGFmdGVyIHRoZSBjaGVjayBmb3IgYSBOVUxMIG91dHB1dCBjaGFyYWN0ZXIuCisJCQkgICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZXJlIG1heSBub3QgYmUKKwkJCSAgIHJvb20gZm9yIHRoZSB0d28gY2hhcnMgbmVlZGVkIHRvIHNlbmQgYSBOVUxMLikKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y2ggPSBpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWxdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG91dGNoICl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+eG1pdF9jbnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT54bWl0X3RhaWwgPSAoaW5mby0+eG1pdF90YWlsICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVREUjw8aW5kZXgpLCBvdXRjaCk7CisJCQkgICAgaW5mby0+aWNvdW50LnR4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjaGFyX2NvdW50ID4gMSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnhtaXRfY250LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyAxKQorCQkJCQkJICAgICAgJiAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVREUjw8aW5kZXgpLCAKKwkJCQkJICBvdXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5VERSPDxpbmRleCksIDApOworCQkJCWluZm8tPmljb3VudC50eCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgdHhkb25lOgorICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX1dSSVRFX1dBS0VVUCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgdHhlbmQ6CisgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBzZXJ2aWNlICovCisgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5VElSPDxpbmRleCksIAorCQkJICAgICAgKHNhdmVfeGlyICYgMHgzZikpOworICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAoc2F2ZV9jYXIpKTsKKwkJICAgIHNwaW5fdW5sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgQ3lTUk1vZGVtKSB7ICAgICAgICAvKiBtb2RlbSBpbnRlcnJ1cHQgKi8KKworICAgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgdGhlIGNoYW5uZWwgJiBjaGFuZ2UgdG8gdGhhdCBjb250ZXh0ICovCisJCSAgICBzcGluX2xvY2soJmNpbmZvLT5jYXJkX2xvY2spOworICAgICAgICAgICAgICAgICAgICBzYXZlX3hpciA9ICh1X2NoYXIpIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNSVI8PGluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSAodV9zaG9ydCApIChzYXZlX3hpciAmIEN5SVJDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9ICZjeV9wb3J0W2NoYW5uZWwgKyBjaGlwICogNAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNpbmZvLT5maXJzdF9saW5lXTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworICAgICAgICAgICAgICAgICAgICBzYXZlX2NhciA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksIHNhdmVfeGlyKTsKKworICAgICAgICAgICAgICAgICAgICBtZG1fY2hhbmdlID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1JU1I8PGluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIG1kbV9zdGF0dXMgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoaW5mby0+dHR5ID09IDApey8qIG5vIHBsYWNlIGZvciBkYXRhLCBpZ25vcmUgaXQqLworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKwkJCWlmIChtZG1fY2hhbmdlICYgQ3lBTllfREVMVEEpIHsKKwkJCSAgICAvKiBGb3Igc3RhdGlzdGljcyBvbmx5ICovCisJCQkgICAgaWYgKG1kbV9jaGFuZ2UgJiBDeURDRCkJaW5mby0+aWNvdW50LmRjZCsrOworCQkJICAgIGlmIChtZG1fY2hhbmdlICYgQ3lDVFMpCWluZm8tPmljb3VudC5jdHMrKzsKKwkJCSAgICBpZiAobWRtX2NoYW5nZSAmIEN5RFNSKQlpbmZvLT5pY291bnQuZHNyKys7CisJCQkgICAgaWYgKG1kbV9jaGFuZ2UgJiBDeVJJKQlpbmZvLT5pY291bnQucm5nKys7CisKKwkJCSAgICBjeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9ERUxUQV9XQUtFVVApOworCQkJfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZigobWRtX2NoYW5nZSAmIEN5RENEKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihtZG1fc3RhdHVzICYgQ3lEQ0QpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV9zY2hlZF9ldmVudChpbmZvLAorCQkJCSAgICBDeV9FVkVOVF9PUEVOX1dBS0VVUCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3NjaGVkX2V2ZW50KGluZm8sCisJCQkJICAgIEN5X0VWRU5UX0hBTkdVUCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG1kbV9jaGFuZ2UgJiBDeUNUUykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NUU19GTE9XKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mby0+dHR5LT5od19zdG9wcGVkKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobWRtX3N0YXR1cyAmIEN5Q1RTKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN5X3N0YXJ0IGlzbid0IHVzZWQKKwkJCQkgICAgICAgICBiZWNhdXNlLi4uICEhISAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+dHR5LT5od19zdG9wcGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDeVR4UmR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3NjaGVkX2V2ZW50KGluZm8sCisJCQkJICAgICAgICBDeV9FVkVOVF9XUklURV9XQUtFVVApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEobWRtX3N0YXR1cyAmIEN5Q1RTKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjeV9zdG9wIGlzbid0IHVzZWQKKwkJCQkgICAgICAgICBiZWNhdXNlIC4uLiAhISEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSAmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkN5VHhSZHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYobWRtX2NoYW5nZSAmIEN5RFNSKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1kbV9jaGFuZ2UgJiBDeVJJKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2Ygc2VydmljZSAqLworICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1JUjw8aW5kZXgpLCAKKwkJCSAgICAgIChzYXZlX3hpciAmIDB4M2YpKTsKKyAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgc2F2ZV9jYXIpOworCQkgICAgc3Bpbl91bmxvY2soJmNpbmZvLT5jYXJkX2xvY2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gICAgICAgICAgLyogZW5kIHdoaWxlIHN0YXR1cyAhPSAwICovCisgICAgICAgIH0gICAgICAgICAgICAvKiBlbmQgbG9vcCBmb3IgY2hpcHMuLi4gKi8KKyAgICB9IHdoaWxlKGhhZF93b3JrKTsKKworICAgLyogY2xlYXIgaW50ZXJydXB0cyAqLworICAgc3Bpbl9sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKKyAgIGN5X3dyaXRlYihjYXJkX2Jhc2VfYWRkciArIChDeV9DbHJJbnRyPDxpbmRleCksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDeV9DbHJJbnRyIGlzIDB4MTgwMCAqLworICAgc3Bpbl91bmxvY2soJmNpbmZvLT5jYXJkX2xvY2spOworICAgcmV0dXJuIElSUV9IQU5ETEVEOworfSAvKiBjeXlfaW50ZXJydXB0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKiogRW5kIG9mIGJsb2NrIG9mIEN5Y2xvbS1ZIHNwZWNpZmljIGNvZGUgKioqKioqKioqKi8KKy8qKioqKioqKiBTdGFydCBvZiBibG9jayBvZiBDeWNsYWRlcy1aIHNwZWNpZmljIGNvZGUgKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CitjeXpfZmV0Y2hfbXNnKCBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm8sCisJICAgIHVjbG9uZyAqY2hhbm5lbCwgdWNjaGFyICpjbWQsIHVjbG9uZyAqcGFyYW0pCit7CisgIHN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7CisgIHN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKKyAgc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKyAgdW5zaWduZWQgbG9uZyBsb2NfZG9vcmJlbGw7CisKKyAgICBmaXJtX2lkID0gY2luZm8tPmJhc2VfYWRkciArIElEX0FERFJFU1M7CisgICAgaWYgKCFJU1pMT0FERUQoKmNpbmZvKSl7CisJcmV0dXJuICgtMSk7CisgICAgfQorICAgIHpmd19jdHJsID0gY2luZm8tPmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOworICAgIGJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisKKyAgICBsb2NfZG9vcmJlbGwgPSBjeV9yZWFkbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKikKKyAgICAgICAgICAgICAgICAgICAgIChjaW5mby0+Y3RsX2FkZHIpKS0+bG9jX2Rvb3JiZWxsKTsKKyAgICBpZiAobG9jX2Rvb3JiZWxsKXsKKwkqY21kID0gKGNoYXIpKDB4ZmYgJiBsb2NfZG9vcmJlbGwpOworCSpjaGFubmVsID0gY3lfcmVhZGwoJmJvYXJkX2N0cmwtPmZ3Y21kX2NoYW5uZWwpOworCSpwYXJhbSA9ICh1Y2xvbmcpY3lfcmVhZGwoJmJvYXJkX2N0cmwtPmZ3Y21kX3BhcmFtKTsKKwljeV93cml0ZWwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopKGNpbmZvLT5jdGxfYWRkcikpLT5sb2NfZG9vcmJlbGwsIAorICAgICAgICAgICAgICAgICAweGZmZmZmZmZmKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIGN5el9mZXRjaF9tc2cgKi8KKworc3RhdGljIGludAorY3l6X2lzc3VlX2NtZCggc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvLAorCSAgICB1Y2xvbmcgY2hhbm5lbCwgdWNjaGFyIGNtZCwgdWNsb25nIHBhcmFtKQoreworICBzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOworICBzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisgIHN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7CisgIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqcGNpX2Rvb3JiZWxsOworICBpbnQgaW5kZXg7CisKKyAgICBmaXJtX2lkID0gY2luZm8tPmJhc2VfYWRkciArIElEX0FERFJFU1M7CisgICAgaWYgKCFJU1pMT0FERUQoKmNpbmZvKSl7CisJcmV0dXJuICgtMSk7CisgICAgfQorICAgIHpmd19jdHJsID0gY2luZm8tPmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOworICAgIGJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisKKyAgICBpbmRleCA9IDA7CisgICAgcGNpX2Rvb3JiZWxsID0gJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopIChjaW5mby0+Y3RsX2FkZHIpKS0+cGNpX2Rvb3JiZWxsOworICAgIHdoaWxlKCAoY3lfcmVhZGwocGNpX2Rvb3JiZWxsKSAmIDB4ZmYpICE9IDApeworICAgICAgICBpZiAoaW5kZXgrKyA9PSAxMDAwKXsKKwkgICAgcmV0dXJuKChpbnQpKGN5X3JlYWRsKHBjaV9kb29yYmVsbCkgJiAweGZmKSk7CisgICAgICAgIH0KKwl1ZGVsYXkoNTBMKTsKKyAgICB9CisgICAgY3lfd3JpdGVsKCZib2FyZF9jdHJsLT5oY21kX2NoYW5uZWwsIGNoYW5uZWwpOworICAgIGN5X3dyaXRlbCgmYm9hcmRfY3RybC0+aGNtZF9wYXJhbSAsIHBhcmFtKTsKKyAgICBjeV93cml0ZWwocGNpX2Rvb3JiZWxsLCAobG9uZyljbWQpOworCisgICAgcmV0dXJuKDApOworfSAvKiBjeXpfaXNzdWVfY21kICovCisKK3N0YXRpYyB2b2lkCitjeXpfaGFuZGxlX3J4KHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLAorCSAgICAgIHZvbGF0aWxlIHN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmwsCisJICAgICAgdm9sYXRpbGUgc3RydWN0IEJVRl9DVFJMIF9faW9tZW0gKmJ1Zl9jdHJsKQoreworICBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm8gPSAmY3lfY2FyZFtpbmZvLT5jYXJkXTsKKyAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKyAgdm9sYXRpbGUgaW50IGNoYXJfY291bnQ7CisjaWZkZWYgQkxPQ0tNT1ZFCisgIGludCBzbWFsbF9jb3VudDsKKyNlbHNlCisgIGNoYXIgZGF0YTsKKyNlbmRpZgorICB2b2xhdGlsZSB1Y2xvbmcgcnhfcHV0LCByeF9nZXQsIG5ld19yeF9nZXQsIHJ4X2J1ZnNpemUsIHJ4X2J1ZmFkZHI7CisKKyAgICByeF9nZXQgPSBuZXdfcnhfZ2V0ID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT5yeF9nZXQpOworICAgIHJ4X3B1dCA9IGN5X3JlYWRsKCZidWZfY3RybC0+cnhfcHV0KTsKKyAgICByeF9idWZzaXplID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT5yeF9idWZzaXplKTsKKyAgICByeF9idWZhZGRyID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT5yeF9idWZhZGRyKTsKKyAgICBpZiAocnhfcHV0ID49IHJ4X2dldCkKKwljaGFyX2NvdW50ID0gcnhfcHV0IC0gcnhfZ2V0OworICAgIGVsc2UKKwljaGFyX2NvdW50ID0gcnhfcHV0IC0gcnhfZ2V0ICsgcnhfYnVmc2l6ZTsKKworICAgIGlmICggY2hhcl9jb3VudCApIHsKKwlpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisJaW5mby0+amlmZmllc1sxXSA9IGppZmZpZXM7CisKKyNpZmRlZiBDWV9FTkFCTEVfTU9OSVRPUklORworCWluZm8tPm1vbi5pbnRfY291bnQrKzsKKwlpbmZvLT5tb24uY2hhcl9jb3VudCArPSBjaGFyX2NvdW50OworCWlmIChjaGFyX2NvdW50ID4gaW5mby0+bW9uLmNoYXJfbWF4KQorCSAgICBpbmZvLT5tb24uY2hhcl9tYXggPSBjaGFyX2NvdW50OworCWluZm8tPm1vbi5jaGFyX2xhc3QgPSBjaGFyX2NvdW50OworI2VuZGlmCisJaWYodHR5ID09IDApeworCSAgICAvKiBmbHVzaCByZWNlaXZlZCBjaGFyYWN0ZXJzICovCisJICAgIG5ld19yeF9nZXQgPSAobmV3X3J4X2dldCArIGNoYXJfY291bnQpICYgKHJ4X2J1ZnNpemUgLSAxKTsKKwkgICAgaW5mby0+cmZsdXNoX2NvdW50Kys7CisJfWVsc2V7CisjaWZkZWYgQkxPQ0tNT1ZFCisJICAgIC8qIHdlJ2QgbGlrZSB0byB1c2UgbWVtY3B5KHQsIGYsIG4pIGFuZCBtZW1zZXQocywgYywgY291bnQpCisJICAgICAgIGZvciBwZXJmb3JtYW5jZSwgYnV0IGJlY2F1c2Ugb2YgYnVmZmVyIGJvdW5kYXJpZXMsIHRoZXJlCisJICAgICAgIG1heSBiZSBzZXZlcmFsIHN0ZXBzIHRvIHRoZSBvcGVyYXRpb24gKi8KKwkgICAgd2hpbGUoMCA8IChzbWFsbF9jb3VudCA9IAorCQkgICAgICAgbWluX3QodW5zaWduZWQgaW50LCAocnhfYnVmc2l6ZSAtIG5ld19yeF9nZXQpLAorCQkgICAgICAgbWluX3QodW5zaWduZWQgaW50LCAoVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudCksIGNoYXJfY291bnQpKQorCQkgKSkgeworCQltZW1jcHlfZnJvbWlvKHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsCisJCQkgICAgICAoY2hhciAqKShjaW5mby0+YmFzZV9hZGRyCisJCQkJICAgICAgICsgcnhfYnVmYWRkciArIG5ld19yeF9nZXQpLAorCQkJICAgICAgc21hbGxfY291bnQpOworCisJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gc21hbGxfY291bnQ7CisJCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCBUVFlfTk9STUFMLCBzbWFsbF9jb3VudCk7CisJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gc21hbGxfY291bnQ7CisJCW5ld19yeF9nZXQgPSAobmV3X3J4X2dldCArIHNtYWxsX2NvdW50KSAmIChyeF9idWZzaXplIC0gMSk7CisJCWNoYXJfY291bnQgLT0gc21hbGxfY291bnQ7CisJCWluZm8tPmljb3VudC5yeCArPSBzbWFsbF9jb3VudDsKKwkJaW5mby0+aWRsZV9zdGF0cy5yZWN2X2J5dGVzICs9IHNtYWxsX2NvdW50OworCQl0dHktPmZsaXAuY291bnQgKz0gc21hbGxfY291bnQ7CisJICAgIH0KKyNlbHNlCisJICAgIHdoaWxlKGNoYXJfY291bnQtLSl7CisJCWlmICh0dHktPmZsaXAuY291bnQgPj0gTl9UVFlfQlVGX1NJWkUgLSB0dHktPnJlYWRfY250KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpCisJCSAgICBicmVhazsKKworCQlkYXRhID0gY3lfcmVhZGIoY2luZm8tPmJhc2VfYWRkciArIHJ4X2J1ZmFkZHIgKyBuZXdfcnhfZ2V0KTsKKwkJbmV3X3J4X2dldCA9IChuZXdfcnhfZ2V0ICsgMSkgJiAocnhfYnVmc2l6ZSAtIDEpOworCQl0dHktPmZsaXAuY291bnQrKzsKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9OT1JNQUw7CisJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBkYXRhOworCQlpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfYnl0ZXMrKzsKKwkJaW5mby0+aWNvdW50LnJ4Kys7CisJICAgIH0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19DWVpfSU5UUgorCSAgICAvKiBSZWNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBSWCBidWZmZXIgYW5kIGlzc3VlCisJICAgICAgIGEgY21kIGluIGNhc2UgaXQncyBoaWdoZXIgdGhhbiB0aGUgUlggaGlnaCB3YXRlciBtYXJrICovCisJICAgIHJ4X3B1dCA9IGN5X3JlYWRsKCZidWZfY3RybC0+cnhfcHV0KTsKKwkgICAgaWYgKHJ4X3B1dCA+PSByeF9nZXQpCisJCWNoYXJfY291bnQgPSByeF9wdXQgLSByeF9nZXQ7CisJICAgIGVsc2UKKwkJY2hhcl9jb3VudCA9IHJ4X3B1dCAtIHJ4X2dldCArIHJ4X2J1ZnNpemU7CisJICAgIGlmKGNoYXJfY291bnQgPj0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT5yeF90aHJlc2hvbGQpKSB7CisJCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX1pfUlhfRlVMTCk7CisJICAgIH0KKyNlbmRpZgorCSAgICBpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfaWRsZSA9IGppZmZpZXM7CisJICAgIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworCX0KKwkvKiBVcGRhdGUgcnhfZ2V0ICovCisJY3lfd3JpdGVsKCZidWZfY3RybC0+cnhfZ2V0LCBuZXdfcnhfZ2V0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjeXpfaGFuZGxlX3R4KHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLAorCSAgICAgIHZvbGF0aWxlIHN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmwsCisJICAgICAgdm9sYXRpbGUgc3RydWN0IEJVRl9DVFJMIF9faW9tZW0gKmJ1Zl9jdHJsKQoreworICBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm8gPSAmY3lfY2FyZFtpbmZvLT5jYXJkXTsKKyAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKyAgY2hhciBkYXRhOworICB2b2xhdGlsZSBpbnQgY2hhcl9jb3VudDsKKyNpZmRlZiBCTE9DS01PVkUKKyAgaW50IHNtYWxsX2NvdW50OworI2VuZGlmCisgIHZvbGF0aWxlIHVjbG9uZyB0eF9wdXQsIHR4X2dldCwgdHhfYnVmc2l6ZSwgdHhfYnVmYWRkcjsKKworICAgIGlmIChpbmZvLT54bWl0X2NudCA8PSAwKQkvKiBOb3RoaW5nIHRvIHRyYW5zbWl0ICovCisJcmV0dXJuOworCisgICAgdHhfZ2V0ID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT50eF9nZXQpOworICAgIHR4X3B1dCA9IGN5X3JlYWRsKCZidWZfY3RybC0+dHhfcHV0KTsKKyAgICB0eF9idWZzaXplID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT50eF9idWZzaXplKTsKKyAgICB0eF9idWZhZGRyID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT50eF9idWZhZGRyKTsKKyAgICBpZiAodHhfcHV0ID49IHR4X2dldCkKKwljaGFyX2NvdW50ID0gdHhfZ2V0IC0gdHhfcHV0IC0gMSArIHR4X2J1ZnNpemU7CisgICAgZWxzZQorCWNoYXJfY291bnQgPSB0eF9nZXQgLSB0eF9wdXQgLSAxOworCisgICAgaWYgKCBjaGFyX2NvdW50ICkgeworCisJaWYoIHR0eSA9PSAwICl7CisJICAgIGdvdG8genR4ZG9uZTsKKwl9CisKKwlpZihpbmZvLT54X2NoYXIpIHsgLyogc2VuZCBzcGVjaWFsIGNoYXIgKi8KKwkgICAgZGF0YSA9IGluZm8tPnhfY2hhcjsKKworCSAgICBjeV93cml0ZWIoKGNpbmZvLT5iYXNlX2FkZHIgKyB0eF9idWZhZGRyICsgdHhfcHV0KSwgZGF0YSk7CisJICAgIHR4X3B1dCA9ICh0eF9wdXQgKyAxKSAmICh0eF9idWZzaXplIC0gMSk7CisJICAgIGluZm8tPnhfY2hhciA9IDA7CisJICAgIGNoYXJfY291bnQtLTsKKwkgICAgaW5mby0+aWNvdW50LnR4Kys7CisJICAgIGluZm8tPmxhc3RfYWN0aXZlID0gamlmZmllczsKKwkgICAgaW5mby0+amlmZmllc1syXSA9IGppZmZpZXM7CisJfQorI2lmZGVmIEJMT0NLTU9WRQorCXdoaWxlKDAgPCAoc21hbGxfY291bnQgPSAKKwkJICAgbWluX3QodW5zaWduZWQgaW50LCAodHhfYnVmc2l6ZSAtIHR4X3B1dCksCisJCSAgICAgICBtaW5fdCh1bnNpZ25lZCBpbnQsIChTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF90YWlsKSwKKwkJCSAgIG1pbl90KHVuc2lnbmVkIGludCwgaW5mby0+eG1pdF9jbnQsIGNoYXJfY291bnQpKSkpKSB7CisKKwkgICAgbWVtY3B5X3RvaW8oKGNoYXIgKikoY2luZm8tPmJhc2VfYWRkciArIHR4X2J1ZmFkZHIgKyB0eF9wdXQpLAorCQkJJmluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF0sCisJCQlzbWFsbF9jb3VudCk7CisKKwkgICAgdHhfcHV0ID0gKHR4X3B1dCArIHNtYWxsX2NvdW50KSAmICh0eF9idWZzaXplIC0gMSk7CisJICAgIGNoYXJfY291bnQgLT0gc21hbGxfY291bnQ7CisJICAgIGluZm8tPmljb3VudC50eCArPSBzbWFsbF9jb3VudDsKKwkgICAgaW5mby0+eG1pdF9jbnQgLT0gc21hbGxfY291bnQ7CisJICAgIGluZm8tPnhtaXRfdGFpbCA9IAorCQkoaW5mby0+eG1pdF90YWlsICsgc21hbGxfY291bnQpICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkgICAgaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworCSAgICBpbmZvLT5qaWZmaWVzWzJdID0gamlmZmllczsKKwl9CisjZWxzZQorCXdoaWxlIChpbmZvLT54bWl0X2NudCAmJiBjaGFyX2NvdW50KXsKKwkgICAgZGF0YSA9IGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF07CisJICAgIGluZm8tPnhtaXRfY250LS07CisJICAgIGluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyAxKSAmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisKKwkgICAgY3lfd3JpdGViKGNpbmZvLT5iYXNlX2FkZHIgKyB0eF9idWZhZGRyICsgdHhfcHV0LCBkYXRhKTsKKwkgICAgdHhfcHV0ID0gKHR4X3B1dCArIDEpICYgKHR4X2J1ZnNpemUgLSAxKTsKKwkgICAgY2hhcl9jb3VudC0tOworCSAgICBpbmZvLT5pY291bnQudHgrKzsKKwkgICAgaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworCSAgICBpbmZvLT5qaWZmaWVzWzJdID0gamlmZmllczsKKwl9CisjZW5kaWYKKyAgICB6dHhkb25lOgorCWlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgeworCSAgICBjeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9XUklURV9XQUtFVVApOworCX0KKwkvKiBVcGRhdGUgdHhfcHV0ICovCisJY3lfd3JpdGVsKCZidWZfY3RybC0+dHhfcHV0LCB0eF9wdXQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2N5el9oYW5kbGVfY21kKHN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbykKK3sKKyAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CisgIHN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOworICBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOworICBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKyAgc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmw7CisgIHN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgQlVGX0NUUkwgX19pb21lbSAqYnVmX2N0cmw7CisgIHVjbG9uZyBjaGFubmVsOworICB1Y2NoYXIgY21kOworICB1Y2xvbmcgcGFyYW07CisgIHVjbG9uZyBod192ZXIsIGZ3X3ZlcjsKKyAgaW50IHNwZWNpYWxfY291bnQ7CisgIGludCBkZWx0YV9jb3VudDsKKworICAgIGZpcm1faWQgPSBjaW5mby0+YmFzZV9hZGRyICsgSURfQUREUkVTUzsKKyAgICB6ZndfY3RybCA9IGNpbmZvLT5iYXNlX2FkZHIgKyAoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKKyAgICBib2FyZF9jdHJsID0gJnpmd19jdHJsLT5ib2FyZF9jdHJsOworICAgIGZ3X3ZlciA9IGN5X3JlYWRsKCZib2FyZF9jdHJsLT5md192ZXJzaW9uKTsKKyAgICBod192ZXIgPSBjeV9yZWFkbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKikoY2luZm8tPmN0bF9hZGRyKSktPm1haWxfYm94XzApOworCisKKyAgICB3aGlsZShjeXpfZmV0Y2hfbXNnKGNpbmZvLCAmY2hhbm5lbCwgJmNtZCwgJnBhcmFtKSA9PSAxKSB7CisJc3BlY2lhbF9jb3VudCA9IDA7CisJZGVsdGFfY291bnQgPSAwOworCWluZm8gPSAmY3lfcG9ydFtjaGFubmVsICsgY2luZm8tPmZpcnN0X2xpbmVdOworCWlmKCh0dHkgPSBpbmZvLT50dHkpID09IDApIHsKKwkgICAgY29udGludWU7CisJfQorCWNoX2N0cmwgPSAmKHpmd19jdHJsLT5jaF9jdHJsW2NoYW5uZWxdKTsKKwlidWZfY3RybCA9ICYoemZ3X2N0cmwtPmJ1Zl9jdHJsW2NoYW5uZWxdKTsKKworCXN3aXRjaChjbWQpIHsKKwkgICAgY2FzZSBDX0NNX1BSX0VSUk9SOgorCQl0dHktPmZsaXAuY291bnQrKzsKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9QQVJJVFk7CisJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOworCQlpbmZvLT5pY291bnQucngrKzsKKwkJc3BlY2lhbF9jb3VudCsrOworCQlicmVhazsKKwkgICAgY2FzZSBDX0NNX0ZSX0VSUk9SOgorCQl0dHktPmZsaXAuY291bnQrKzsKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9GUkFNRTsKKwkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IDA7CisJCWluZm8tPmljb3VudC5yeCsrOworCQlzcGVjaWFsX2NvdW50Kys7CisJCWJyZWFrOworCSAgICBjYXNlIENfQ01fUlhCUks6CisJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0JSRUFLOworCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKKwkJaW5mby0+aWNvdW50LnJ4Kys7CisJCXNwZWNpYWxfY291bnQrKzsKKwkJYnJlYWs7CisJICAgIGNhc2UgQ19DTV9NRENEOgorCQlpbmZvLT5pY291bnQuZGNkKys7CisJCWRlbHRhX2NvdW50Kys7CisJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKXsKKwkJICAgIGlmICgoZndfdmVyID4gMjQxID8gCisJCQkgICgodV9sb25nKXBhcmFtKSA6IAorCQkJICBjeV9yZWFkbCgmY2hfY3RybC0+cnNfc3RhdHVzKSkgJiBDX1JTX0RDRCkgeworCQkJY3lfc2NoZWRfZXZlbnQoaW5mbywgQ3lfRVZFTlRfT1BFTl9XQUtFVVApOworCQkgICAgfWVsc2V7CisJCQljeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9IQU5HVVApOworCQkgICAgfQorCQl9CisJCWJyZWFrOworCSAgICBjYXNlIENfQ01fTUNUUzoKKwkJaW5mby0+aWNvdW50LmN0cysrOworCQlkZWx0YV9jb3VudCsrOworCQlicmVhazsKKwkgICAgY2FzZSBDX0NNX01SSToKKwkJaW5mby0+aWNvdW50LnJuZysrOworCQlkZWx0YV9jb3VudCsrOworCQlicmVhazsKKwkgICAgY2FzZSBDX0NNX01EU1I6CisJCWluZm8tPmljb3VudC5kc3IrKzsKKwkJZGVsdGFfY291bnQrKzsKKwkJYnJlYWs7CisjaWZkZWYgWl9XQUtFCisJICAgIGNhc2UgQ19DTV9JT0NUTFc6CisJCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX1NIVVRET1dOX1dBS0VVUCk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NZWl9JTlRSCisJICAgIGNhc2UgQ19DTV9SWEhJV006CisJICAgIGNhc2UgQ19DTV9SWE5ORFQ6CisJICAgIGNhc2UgQ19DTV9JTlRCQUNLMjoKKwkJLyogUmVjZXB0aW9uIEludGVycnVwdCAqLworI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKKwkJcHJpbnRrKCJjeXpfaW50ZXJydXB0OiByY3ZkIGludHIsIGNhcmQgJWQsIHBvcnQgJWxkXG5cciIsIAorCQkJaW5mby0+Y2FyZCwgY2hhbm5lbCk7CisjZW5kaWYKKwkJY3l6X2hhbmRsZV9yeChpbmZvLCBjaF9jdHJsLCBidWZfY3RybCk7CisJCWJyZWFrOworCSAgICBjYXNlIENfQ01fVFhCRU1QVFk6CisJICAgIGNhc2UgQ19DTV9UWExPV1dNOgorCSAgICBjYXNlIENfQ01fSU5UQkFDSzoKKwkJLyogVHJhbnNtaXNzaW9uIEludGVycnVwdCAqLworI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKKwkJcHJpbnRrKCJjeXpfaW50ZXJydXB0OiB4bWl0IGludHIsIGNhcmQgJWQsIHBvcnQgJWxkXG5cciIsIAorCQkJaW5mby0+Y2FyZCwgY2hhbm5lbCk7CisjZW5kaWYKKwkJY3l6X2hhbmRsZV90eChpbmZvLCBjaF9jdHJsLCBidWZfY3RybCk7CisJCWJyZWFrOworI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLworCSAgICBjYXNlIENfQ01fRkFUQUw6CisJCS8qIHNob3VsZCBkbyBzb21ldGhpbmcgd2l0aCB0aGlzICEhISAqLworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmKGRlbHRhX2NvdW50KQorCSAgICBjeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9ERUxUQV9XQUtFVVApOworCWlmKHNwZWNpYWxfY291bnQpCisJICAgIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworICAgIH0KK30KKworI2lmZGVmIENPTkZJR19DWVpfSU5UUgorc3RhdGljIGlycXJldHVybl90CitjeXpfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgIHN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbzsKKworICAgIGlmKChjaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqKWRldl9pZCkgPT0gMCl7CisjaWZkZWYgQ1lfREVCVUdfSU5URVJSVVBUUworCXByaW50aygiY3l6X2ludGVycnVwdDogc3B1cmlvdXMgaW50ZXJydXB0ICVkXG5cciIsIGlycSk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIElSUV9OT05FOyAvKiBzcHVyaW91cyBpbnRlcnJ1cHQgKi8KKyAgICB9CisKKyAgICBpZiAoIUlTWkxPQURFRCgqY2luZm8pKSB7CisjaWZkZWYgQ1lfREVCVUdfSU5URVJSVVBUUworCXByaW50aygiY3l6X2ludGVycnVwdDogYm9hcmQgbm90IHlldCBsb2FkZWQgKElSUSVkKS5cblxyIiwgaXJxKTsKKyNlbmRpZgorCXJldHVybiBJUlFfTk9ORTsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgdGhlIGludGVycnVwdHMgKi8KKyAgICBjeXpfaGFuZGxlX2NtZChjaW5mbyk7CisKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9IC8qIGN5el9pbnRlcnJ1cHQgKi8KKworc3RhdGljIHZvaWQKK2N5el9yeF9yZXN0YXJ0KHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopYXJnOworICAgIGludCByZXR2YWw7CisgICAgaW50IGNhcmQgPSBpbmZvLT5jYXJkOworICAgIHVjbG9uZyBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgIHJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbY2FyZF0sIGNoYW5uZWwsIENfQ01fSU5UQkFDSzIsIDBMKTsKKyAgICBpZiAocmV0dmFsICE9IDApeworCXByaW50aygiY3ljOmN5el9yeF9yZXN0YXJ0IHJldHZhbCBvbiB0dHlDJWQgd2FzICV4XG4iLCAKKwkgICAgICAgaW5mby0+bGluZSwgcmV0dmFsKTsKKyAgICB9CisgICAgY3l6X3J4X2Z1bGxfdGltZXJbaW5mby0+bGluZV0uZnVuY3Rpb24gPSBOVUxMOworICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7Cit9CisKKyNlbHNlIC8qIENPTkZJR19DWVpfSU5UUiAqLworCitzdGF0aWMgdm9pZAorY3l6X3BvbGwodW5zaWduZWQgbG9uZyBhcmcpCit7CisgIHN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbzsKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CisgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisgIHN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgRklSTV9JRCAqZmlybV9pZDsKKyAgc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBaRldfQ1RSTCAqemZ3X2N0cmw7CisgIHN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgQk9BUkRfQ1RSTCAqYm9hcmRfY3RybDsKKyAgc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBDSF9DVFJMICpjaF9jdHJsOworICBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IEJVRl9DVFJMICpidWZfY3RybDsKKyAgaW50IGNhcmQsIHBvcnQ7CisKKyAgICBjeXpfdGltZXJsaXN0LmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaKTsKKyAgICBmb3IgKGNhcmQgPSAwIDsgY2FyZCA8IE5SX0NBUkRTIDsgY2FyZCsrKXsKKwljaW5mbyA9ICZjeV9jYXJkW2NhcmRdOworCisJaWYgKCFJU19DWUNfWigqY2luZm8pKSBjb250aW51ZTsKKwlpZiAoIUlTWkxPQURFRCgqY2luZm8pKSBjb250aW51ZTsKKworCWZpcm1faWQgPSBjaW5mby0+YmFzZV9hZGRyICsgSURfQUREUkVTUzsKKwl6ZndfY3RybCA9IGNpbmZvLT5iYXNlX2FkZHIgKyAoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKKwlib2FyZF9jdHJsID0gJih6ZndfY3RybC0+Ym9hcmRfY3RybCk7CisKKwkvKiBTa2lwIGZpcnN0IHBvbGxpbmcgY3ljbGUgdG8gYXZvaWQgcmFjaW5nIGNvbmRpdGlvbnMgd2l0aCB0aGUgRlcgKi8KKwlpZiAoIWNpbmZvLT5pbnRyX2VuYWJsZWQpIHsKKwkgICAgY2luZm8tPm5wb3J0cyA9IChpbnQpIGN5X3JlYWRsKCZib2FyZF9jdHJsLT5uX2NoYW5uZWwpOworCSAgICBjaW5mby0+aW50cl9lbmFibGVkID0gMTsKKwkgICAgY29udGludWU7CisJfQorCisJY3l6X2hhbmRsZV9jbWQoY2luZm8pOworCisJZm9yIChwb3J0ID0gMCA7IHBvcnQgPCBjaW5mby0+bnBvcnRzIDsgcG9ydCsrKSB7CisJICAgIGluZm8gPSAmY3lfcG9ydFsgcG9ydCArIGNpbmZvLT5maXJzdF9saW5lIF07CisgICAgICAgICAgICB0dHkgPSBpbmZvLT50dHk7CisJICAgIGNoX2N0cmwgPSAmKHpmd19jdHJsLT5jaF9jdHJsW3BvcnRdKTsKKwkgICAgYnVmX2N0cmwgPSAmKHpmd19jdHJsLT5idWZfY3RybFtwb3J0XSk7CisKKwkgICAgaWYgKCFpbmZvLT50aHJvdHRsZSkKKwkgICAgICAgIGN5el9oYW5kbGVfcngoaW5mbywgY2hfY3RybCwgYnVmX2N0cmwpOworCSAgICBjeXpfaGFuZGxlX3R4KGluZm8sIGNoX2N0cmwsIGJ1Zl9jdHJsKTsKKwl9CisJLyogcG9sbCBldmVyeSAnY3l6X3BvbGxpbmdfY3ljbGUnIHBlcmlvZCAqLworCWN5el90aW1lcmxpc3QuZXhwaXJlcyA9IGppZmZpZXMgKyBjeXpfcG9sbGluZ19jeWNsZTsKKyAgICB9CisgICAgYWRkX3RpbWVyKCZjeXpfdGltZXJsaXN0KTsKKworICAgIHJldHVybjsKK30gLyogY3l6X3BvbGwgKi8KKworI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLworCisvKioqKioqKioqKiBFbmQgb2YgYmxvY2sgb2YgQ3ljbGFkZXMtWiBzcGVjaWZpYyBjb2RlICoqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciBhIHBvcnQgYmVjb21lcyBhY3RpdmU7CisgICBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGFuZCBEVFIgJiBSVFMgYXJlIHR1cm5lZCBvbi4KKyAqLworc3RhdGljIGludAorc3RhcnR1cChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8pCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIGludCByZXR2YWwgPSAwOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgaW50IGNhcmQsY2hpcCxjaGFubmVsLGluZGV4OworICB1bnNpZ25lZCBsb25nIHBhZ2U7CisKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisKKyAgICBwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworICAgIGlmICghcGFnZSkKKwlyZXR1cm4gLUVOT01FTTsKKworICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworCisgICAgaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpeworCWZyZWVfcGFnZShwYWdlKTsKKwlnb3RvIGVycm91dDsKKyAgICB9CisKKyAgICBpZiAoIWluZm8tPnR5cGUpeworICAgICAgICBpZiAoaW5mby0+dHR5KXsKKyAgICAgICAgICAgIHNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisgICAgICAgIH0KKwlmcmVlX3BhZ2UocGFnZSk7CisJZ290byBlcnJvdXQ7CisgICAgfQorCisgICAgaWYgKGluZm8tPnhtaXRfYnVmKQorCWZyZWVfcGFnZShwYWdlKTsKKyAgICBlbHNlCisJaW5mby0+eG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOworCisgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKworICAgIHNldF9saW5lX2NoYXIoaW5mbyk7CisKKyAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJY2hpcCA9IGNoYW5uZWw+PjI7CisJY2hhbm5lbCAmPSAweDAzOworCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKKworI2lmZGVmIENZX0RFQlVHX09QRU4KKwlwcmludGsoImN5YyBzdGFydHVwIGNhcmQgJWQsIGNoaXAgJWQsIGNoYW5uZWwgJWQsIGJhc2VfYWRkciAlbHhcbiIsCisJICAgICBjYXJkLCBjaGlwLCBjaGFubmVsLCAobG9uZyliYXNlX2FkZHIpOy8qKi8KKyNlbmRpZgorCisJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisKKwljeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAodV9jaGFyKWNoYW5uZWwpOworCisJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lSVFBSPDxpbmRleCksIChpbmZvLT5kZWZhdWx0X3RpbWVvdXQKKwkJID8gaW5mby0+ZGVmYXVsdF90aW1lb3V0IDogMHgwMikpOyAvKiAxMG1zIHJ4IHRpbWVvdXQgKi8KKworCWN5eV9pc3N1ZV9jbWQoYmFzZV9hZGRyLEN5Q0hBTl9DVEx8Q3lFTkJfUkNWUnxDeUVOQl9YTVRSLGluZGV4KTsKKworCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7CisJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCBDeVJUUyk7CisJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpLCBDeURUUik7CisKKyNpZmRlZiBDWV9ERUJVR19EVFIKKwlwcmludGsoImN5YzpzdGFydHVwIHJhaXNpbmcgRFRSXG4iKTsKKwlwcmludGsoIiAgICAgc3RhdHVzOiAweCV4LCAweCV4XG4iLAorCQljeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSksIAorICAgICAgICAgICAgICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpKSk7CisjZW5kaWYKKworCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpLAorCQljeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSB8IEN5UnhEYXRhKTsKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKworCWlmIChpbmZvLT50dHkpeworCSAgICBjbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJfQorCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKwlpbmZvLT5icmVha29uID0gaW5mby0+YnJlYWtvZmYgPSAwOworCW1lbXNldCgoY2hhciAqKSZpbmZvLT5pZGxlX3N0YXRzLCAwLCBzaXplb2YoaW5mby0+aWRsZV9zdGF0cykpOworCWluZm8tPmlkbGVfc3RhdHMuaW5fdXNlICAgID0KKwlpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfaWRsZSA9CisJaW5mby0+aWRsZV9zdGF0cy54bWl0X2lkbGUgPSBqaWZmaWVzOworCisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKworICAgIH0gZWxzZSB7CisgICAgICBzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOworICAgICAgc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOworICAgICAgc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKyAgICAgIHN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmw7CisgICAgICBpbnQgcmV0dmFsOworCisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHI7CisKKyAgICAgICAgZmlybV9pZCA9IGJhc2VfYWRkciArIElEX0FERFJFU1M7CisgICAgICAgIGlmICghSVNaTE9BREVEKGN5X2NhcmRbY2FyZF0pKXsKKwkgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCisJemZ3X2N0cmwgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOworCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisJY2hfY3RybCA9IHpmd19jdHJsLT5jaF9jdHJsOworCisjaWZkZWYgQ1lfREVCVUdfT1BFTgorCXByaW50aygiY3ljIHN0YXJ0dXAgWiBjYXJkICVkLCBjaGFubmVsICVkLCBiYXNlX2FkZHIgJWx4XG4iLAorCSAgICAgY2FyZCwgY2hhbm5lbCwgKGxvbmcpYmFzZV9hZGRyKTsvKiovCisjZW5kaWYKKworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCisJY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLm9wX21vZGUsIENfQ0hfRU5BQkxFKTsKKyNpZmRlZiBaX1dBS0UKKyNpZmRlZiBDT05GSUdfQ1laX0lOVFIKKwljeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0uaW50cl9lbmFibGUsIAorCQkgIENfSU5fVFhCRU1QVFl8Q19JTl9UWExPV1dNfENfSU5fUlhISVdNfENfSU5fUlhOTkRUfAorCQkgIENfSU5fSU9DVExXfAorCQkgIENfSU5fTURDRCk7CisjZWxzZQorCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5pbnRyX2VuYWJsZSwgCisJCSAgQ19JTl9JT0NUTFd8CisJCSAgQ19JTl9NRENEKTsKKyNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KKyNlbHNlCisjaWZkZWYgQ09ORklHX0NZWl9JTlRSCisJY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLmludHJfZW5hYmxlLCAKKwkJICBDX0lOX1RYQkVNUFRZfENfSU5fVFhMT1dXTXxDX0lOX1JYSElXTXxDX0lOX1JYTk5EVHwKKwkJICBDX0lOX01EQ0QpOworI2Vsc2UKKwljeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0uaW50cl9lbmFibGUsIAorCQkgIENfSU5fTURDRCk7CisjZW5kaWYgLyogQ09ORklHX0NZWl9JTlRSICovCisjZW5kaWYgLyogWl9XQUtFICovCisKKwlyZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0lPQ1RMLCAwTCk7CisJaWYgKHJldHZhbCAhPSAwKXsKKwkgICAgcHJpbnRrKCJjeWM6c3RhcnR1cCgxKSByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJICAgaW5mby0+bGluZSwgcmV0dmFsKTsKKwl9CisKKwkvKiBGbHVzaCBSWCBidWZmZXJzIGJlZm9yZSByYWlzaW5nIERUUiBhbmQgUlRTICovCisJcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtjYXJkXSwgY2hhbm5lbCwgQ19DTV9GTFVTSF9SWCwgMEwpOworCWlmIChyZXR2YWwgIT0gMCl7CisJICAgIHByaW50aygiY3ljOnN0YXJ0dXAoMikgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJfQorCisJLyogc2V0IHRpbWVvdXQgISEhICovCisJLyogc2V0IFJUUyBhbmQgRFRSICEhISAqLworCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sLAorICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wpIHwgQ19SU19SVFMgfCBDX1JTX0RUUikgOworCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbaW5mby0+Y2FyZF0sCisJICAgIGNoYW5uZWwsIENfQ01fSU9DVExNLCAwTCk7CisJaWYgKHJldHZhbCAhPSAwKXsKKwkgICAgcHJpbnRrKCJjeWM6c3RhcnR1cCgzKSByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJICAgaW5mby0+bGluZSwgcmV0dmFsKTsKKwl9CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJICAgIHByaW50aygiY3ljOnN0YXJ0dXAgcmFpc2luZyBaIERUUlxuIik7CisjZW5kaWYKKworCS8qIGVuYWJsZSBzZW5kLCByZWN2LCBtb2RlbSAhISEgKi8KKworCWluZm8tPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCWlmIChpbmZvLT50dHkpeworCSAgICBjbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJfQorCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKwlpbmZvLT5icmVha29uID0gaW5mby0+YnJlYWtvZmYgPSAwOworCW1lbXNldCgoY2hhciAqKSZpbmZvLT5pZGxlX3N0YXRzLCAwLCBzaXplb2YoaW5mby0+aWRsZV9zdGF0cykpOworCWluZm8tPmlkbGVfc3RhdHMuaW5fdXNlICAgID0KKwlpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfaWRsZSA9CisJaW5mby0+aWRsZV9zdGF0cy54bWl0X2lkbGUgPSBqaWZmaWVzOworCisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKyAgICB9CisKKyNpZmRlZiBDWV9ERUJVR19PUEVOCisJcHJpbnRrKCIgY3ljIHN0YXJ0dXAgZG9uZVxuIik7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworZXJyb3V0OgorCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30gLyogc3RhcnR1cCAqLworCisKK3N0YXRpYyB2b2lkCitzdGFydF94bWl0KCBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyApCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworICBpbnQgY2FyZCxjaGlwLGNoYW5uZWwsaW5kZXg7CisKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCWNoaXAgPSBjaGFubmVsPj4yOworCWNoYW5uZWwgJj0gMHgwMzsKKwlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgY2hhbm5lbCk7CisJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpLCAKKyAgICAgICAgICAgICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpIHwgQ3lUeFJkeSk7CisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKyAgICB9IGVsc2UgeworI2lmZGVmIENPTkZJR19DWVpfSU5UUgorICAgICAgaW50IHJldHZhbDsKKworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCSAgICByZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0lOVEJBQ0ssIDBMKTsKKwkgICAgaWYgKHJldHZhbCAhPSAwKXsKKwkJcHJpbnRrKCJjeWM6c3RhcnRfeG1pdCByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJICAgICAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJICAgIH0KKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworI2Vsc2UgLyogQ09ORklHX0NZWl9JTlRSICovCisJLyogRG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBhdCB0aGlzIHRpbWUgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KKyAgICB9Cit9IC8qIHN0YXJ0X3htaXQgKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSBzaHV0cyBkb3duIGEgc2VyaWFsIHBvcnQ7IGludGVycnVwdHMgYXJlIGRpc2FibGVkLAorICogYW5kIERUUiBpcyBkcm9wcGVkIGlmIHRoZSBoYW5ndXAgb24gY2xvc2UgdGVybWlvIGZsYWcgaXMgb24uCisgKi8KK3N0YXRpYyB2b2lkCitzaHV0ZG93bihzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8pCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworICBpbnQgY2FyZCxjaGlwLGNoYW5uZWwsaW5kZXg7CisKKyAgICBpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSl7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZTsKKyAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJY2hpcCA9IGNoYW5uZWw+PjI7CisJY2hhbm5lbCAmPSAweDAzOworCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKKworI2lmZGVmIENZX0RFQlVHX09QRU4KKyAgICBwcmludGsoImN5YyBzaHV0ZG93biBZIGNhcmQgJWQsIGNoaXAgJWQsIGNoYW5uZWwgJWQsIGJhc2VfYWRkciAlbHhcbiIsCisJCWNhcmQsIGNoaXAsIGNoYW5uZWwsIChsb25nKWJhc2VfYWRkcik7CisjZW5kaWYKKworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCisJICAgIC8qIENsZWFyIGRlbHRhX21zcl93YWl0IHF1ZXVlIHRvIGF2b2lkIG1lbSBsZWFrcy4gKi8KKwkgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkgICAgaWYgKGluZm8tPnhtaXRfYnVmKXsKKwkJdW5zaWduZWQgY2hhciAqIHRlbXA7CisJCXRlbXAgPSBpbmZvLT54bWl0X2J1ZjsKKwkJaW5mby0+eG1pdF9idWYgPSBOVUxMOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHRlbXApOworCSAgICB9CisJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7CisJICAgIGlmICghaW5mby0+dHR5IHx8IChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkpIHsKKwkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCB+Q3lSVFMpOworCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCksIH5DeURUUik7CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCXByaW50aygiY3ljIHNodXRkb3duIGRyb3BwaW5nIERUUlxuIik7CisJCXByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsCisJCSAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSksIAorICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSkpOworI2VuZGlmCisJICAgIH0KKwkgICAgY3l5X2lzc3VlX2NtZChiYXNlX2FkZHIsQ3lDSEFOX0NUTHxDeURJU19SQ1ZSLGluZGV4KTsKKwkgICAgIC8qIGl0IG1heSBiZSBhcHByb3ByaWF0ZSB0byBjbGVhciBfWE1JVCBhdAorCSAgICAgICBzb21lIGxhdGVyIGRhdGUgKGFmdGVyIHRlc3RpbmcpISEhICovCisKKwkgICAgaWYgKGluZm8tPnR0eSl7CisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJICAgIH0KKwkgICAgaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7CisgICAgICBzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisgICAgICBzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOworICAgICAgc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKKyAgICAgIGludCByZXR2YWw7CisKKwliYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkcjsKKyNpZmRlZiBDWV9ERUJVR19PUEVOCisgICAgcHJpbnRrKCJjeWMgc2h1dGRvd24gWiBjYXJkICVkLCBjaGFubmVsICVkLCBiYXNlX2FkZHIgJWx4XG4iLAorCQljYXJkLCBjaGFubmVsLCAobG9uZyliYXNlX2FkZHIpOworI2VuZGlmCisKKyAgICAgICAgZmlybV9pZCA9IGJhc2VfYWRkciArIElEX0FERFJFU1M7CisgICAgICAgIGlmICghSVNaTE9BREVEKGN5X2NhcmRbY2FyZF0pKSB7CisJICAgIHJldHVybjsKKwl9CisKKwl6ZndfY3RybCA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X3JlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYgMHhmZmZmZik7CisJYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKKwljaF9jdHJsID0gemZ3X2N0cmwtPmNoX2N0cmw7CisKKwlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKworCSAgICBpZiAoaW5mby0+eG1pdF9idWYpeworCQl1bnNpZ25lZCBjaGFyICogdGVtcDsKKwkJdGVtcCA9IGluZm8tPnhtaXRfYnVmOworCQlpbmZvLT54bWl0X2J1ZiA9IE5VTEw7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgdGVtcCk7CisJICAgIH0KKwkgICAgCisJICAgIGlmICghaW5mby0+dHR5IHx8IChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkpIHsKKwkJY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgKHVjbG9uZykoY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCkgJiAKKyAgICAgICAgICAgICAgICAgICB+KENfUlNfUlRTIHwgQ19SU19EVFIpKSk7CisJCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbaW5mby0+Y2FyZF0sCisJCQljaGFubmVsLCBDX0NNX0lPQ1RMTSwgMEwpOworCQlpZiAocmV0dmFsICE9IDApeworCQkgICAgcHJpbnRrKCJjeWM6c2h1dGRvd24gcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCQkgICBpbmZvLT5saW5lLCByZXR2YWwpOworCQl9CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCXByaW50aygiY3ljOnNodXRkb3duIGRyb3BwaW5nIFogRFRSXG4iKTsKKyNlbmRpZgorCSAgICB9CisJICAgIAorCSAgICBpZiAoaW5mby0+dHR5KXsKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwkgICAgfQorCSAgICBpbmZvLT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisKKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgIH0KKworI2lmZGVmIENZX0RFQlVHX09QRU4KKyAgICBwcmludGsoIiBjeWMgc2h1dGRvd24gZG9uZVxuIik7CisjZW5kaWYKKyAgICByZXR1cm47Cit9IC8qIHNodXRkb3duICovCisKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY3lfb3BlbigpIGFuZCBmcmllbmRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdGF0aWMgaW50CitibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8pCit7CisgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworICBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm87CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIGludCBjaGlwLCBjaGFubmVsLGluZGV4OworICBpbnQgcmV0dmFsOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKworICAgIGNpbmZvID0gJmN5X2NhcmRbaW5mby0+Y2FyZF07CisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjaW5mby0+Zmlyc3RfbGluZTsKKworICAgIC8qCisgICAgICogSWYgdGhlIGRldmljZSBpcyBpbiB0aGUgbWlkZGxlIG9mIGJlaW5nIGNsb3NlZCwgdGhlbiBibG9jaworICAgICAqIHVudGlsIGl0J3MgZG9uZSwgYW5kIHRoZW4gdHJ5IGFnYWluLgorICAgICAqLworICAgIGlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8IChpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpKSB7CisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgeworICAgICAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+Y2xvc2Vfd2FpdCk7CisJfQorICAgICAgICByZXR1cm4gKChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpID8gLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQKKyAgICAgKiBhbmQgdGhlbiBleGl0LgorICAgICAqLworICAgIGlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8CisJKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgeworICAgICAgICBpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCisgICAgICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KKyAgICAgKiB0aGlzIGxvb3AsIGluZm8tPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0CisgICAgICogY3lfY2xvc2UoKSBrbm93cyB3aGVuIHRvIGZyZWUgdGhpbmdzLiAgV2UgcmVzdG9yZSBpdCB1cG9uCisgICAgICogZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KKyAgICAgKi8KKyAgICByZXR2YWwgPSAwOworICAgIGFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKyNpZmRlZiBDWV9ERUJVR19PUEVOCisgICAgcHJpbnRrKCJjeWMgYmxvY2tfdGlsX3JlYWR5IGJlZm9yZSBibG9jazogdHR5QyVkLCBjb3VudCA9ICVkXG4iLAorICAgICAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7LyoqLworI2VuZGlmCisgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisgICAgaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCWluZm8tPmNvdW50LS07CisgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKyNpZmRlZiBDWV9ERUJVR19DT1VOVAorICAgIHByaW50aygiY3ljIGJsb2NrX3RpbF9yZWFkeTogKCVkKTogZGVjcmVtZW50aW5nIGNvdW50IHRvICVkXG4iLAorICAgICAgICBjdXJyZW50LT5waWQsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorICAgIGluZm8tPmJsb2NrZWRfb3BlbisrOworCisgICAgaWYgKCFJU19DWUNfWigqY2luZm8pKSB7CisJY2hpcCA9IGNoYW5uZWw+PjI7CisJY2hhbm5lbCAmPSAweDAzOworCWluZGV4ID0gY2luZm8tPmJ1c19pbmRleDsKKwliYXNlX2FkZHIgPSBjaW5mby0+YmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwl3aGlsZSAoMSkgeworCSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpeworCQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKKwkJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSwgQ3lSVFMpOworCQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpLCBDeURUUik7CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCSAgICBwcmludGsoImN5YzpibG9ja190aWxfcmVhZHkgcmFpc2luZyBEVFJcbiIpOworCQkgICAgcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwKKwkJCWN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpKSwgCisgICAgICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSkpOworI2VuZGlmCisJCX0KKwkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKworCSAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCSAgICBpZiAodHR5X2h1bmdfdXBfcChmaWxwKQorCSAgICB8fCAhKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpICl7CisJCXJldHZhbCA9ICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSA/IAorCQkgICAgLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7CisJCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJJiYgKENfQ0xPQ0FMKHR0eSkKKwkJICAgIHx8IChjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSkgJiBDeURDRCkpKSB7CisJCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQkJYnJlYWs7CisJCX0KKwkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKworCSAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlicmVhazsKKwkgICAgfQorI2lmZGVmIENZX0RFQlVHX09QRU4KKwkgICAgcHJpbnRrKCJjeWMgYmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nOiB0dHlDJWQsIGNvdW50ID0gJWRcbiIsCisJCSAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsvKiovCisjZW5kaWYKKwkgICAgc2NoZWR1bGUoKTsKKwl9CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7CisgICAgICBzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisgICAgICBzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOworICAgICAgc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKKyAgICAgIGludCByZXR2YWw7CisKKwliYXNlX2FkZHIgPSBjaW5mby0+YmFzZV9hZGRyOworCWZpcm1faWQgPSBiYXNlX2FkZHIgKyBJRF9BRERSRVNTOworICAgICAgICBpZiAoIUlTWkxPQURFRCgqY2luZm8pKXsKKyAgICAgICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCSAgICByZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisJICAgIHJldHVybiAtRUlOVkFMOworCX0KKworCXpmd19jdHJsID0gYmFzZV9hZGRyICsgKGN5X3JlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYgMHhmZmZmZik7CisJYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKKwljaF9jdHJsID0gemZ3X2N0cmwtPmNoX2N0cmw7CisKKwl3aGlsZSAoMSkgeworCSAgICBpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSl7CisJCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sLAorCQkJY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCkgfAorCQkJKENfUlNfUlRTIHwgQ19SU19EVFIpKTsKKwkJcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtpbmZvLT5jYXJkXSwKKwkJCQkgICAgICAgY2hhbm5lbCwgQ19DTV9JT0NUTE0sIDBMKTsKKwkJaWYgKHJldHZhbCAhPSAwKXsKKwkJICAgIHByaW50aygiY3ljOmJsb2NrX3RpbF9yZWFkeSByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJCX0KKyNpZmRlZiBDWV9ERUJVR19EVFIKKwkJcHJpbnRrKCJjeWM6YmxvY2tfdGlsX3JlYWR5IHJhaXNpbmcgWiBEVFJcbiIpOworI2VuZGlmCisJICAgIH0KKworCSAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCSAgICBpZiAodHR5X2h1bmdfdXBfcChmaWxwKQorCSAgICB8fCAhKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpICl7CisJCXJldHZhbCA9ICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSA/CisJCSAgICAtRUFHQUlOIDogLUVSRVNUQVJUU1lTKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKQorCSAgICAmJiAoQ19DTE9DQUwodHR5KQorCSAgICAgIHx8IChjeV9yZWFkbCgmY2hfY3RybFtjaGFubmVsXS5yc19zdGF0dXMpICYgQ19SU19EQ0QpKSkgeworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlicmVhazsKKwkgICAgfQorI2lmZGVmIENZX0RFQlVHX09QRU4KKwkgICAgcHJpbnRrKCJjeWMgYmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nOiB0dHlDJWQsIGNvdW50ID0gJWRcbiIsCisJCSAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsvKiovCisjZW5kaWYKKwkgICAgc2NoZWR1bGUoKTsKKwl9CisgICAgfQorICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKyAgICBpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpeworCWluZm8tPmNvdW50Kys7CisjaWZkZWYgQ1lfREVCVUdfQ09VTlQKKwlwcmludGsoImN5YzpibG9ja190aWxfcmVhZHkgKCVkKTogaW5jcmVtZW50aW5nIGNvdW50IHRvICVkXG4iLAorCSAgICBjdXJyZW50LT5waWQsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorICAgIH0KKyAgICBpbmZvLT5ibG9ja2VkX29wZW4tLTsKKyNpZmRlZiBDWV9ERUJVR19PUEVOCisgICAgcHJpbnRrKCJjeWM6YmxvY2tfdGlsX3JlYWR5IGFmdGVyIGJsb2NraW5nOiB0dHlDJWQsIGNvdW50ID0gJWRcbiIsCisJICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOy8qKi8KKyNlbmRpZgorICAgIGlmIChyZXR2YWwpCisJcmV0dXJuIHJldHZhbDsKKyAgICBpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworICAgIHJldHVybiAwOworfSAvKiBibG9ja190aWxfcmVhZHkgKi8KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBhIHNlcmlhbCBwb3J0IGlzIG9wZW5lZC4gIEl0CisgKiBwZXJmb3JtcyB0aGUgc2VyaWFsLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZvciB0aGUgdHR5IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGludAorY3lfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICAqaW5mbzsKKyAgaW50IHJldHZhbCwgbGluZTsKKyAgdW5zaWduZWQgbG9uZyBwYWdlOworCisgICAgbGluZSA9IHR0eS0+aW5kZXg7CisgICAgaWYgKChsaW5lIDwgMCkgfHwgKE5SX1BPUlRTIDw9IGxpbmUpKXsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIGluZm8gPSAmY3lfcG9ydFtsaW5lXTsKKyAgICBpZiAoaW5mby0+bGluZSA8IDApeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgCisgICAgLyogSWYgdGhlIGNhcmQncyBmaXJtd2FyZSBoYXNuJ3QgYmVlbiBsb2FkZWQsCisgICAgICAgdHJlYXQgaXQgYXMgYWJzZW50IGZyb20gdGhlIHN5c3RlbS4gIFRoaXMKKyAgICAgICB3aWxsIG1ha2UgdGhlIHVzZXIgcGF5IGF0dGVudGlvbi4KKyAgICAqLworICAgIGlmIChJU19DWUNfWihjeV9jYXJkW2luZm8tPmNhcmRdKSkgeworCXN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbyA9ICZjeV9jYXJkW2luZm8tPmNhcmRdOworCXN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQgPSBjaW5mby0+YmFzZV9hZGRyICsgSURfQUREUkVTUzsKKworICAgICAgICBpZiAoIUlTWkxPQURFRCgqY2luZm8pKSB7CisJICAgIGlmICgoKFpFX1YxID09Y3lfcmVhZGwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopCisJCShjaW5mby0+Y3RsX2FkZHIpKS0+bWFpbF9ib3hfMCkpICYmCisJCVpfRlBHQV9DSEVDSyAoKmNpbmZvKSkgJiYKKwkJKFpGSVJNX0hMVCA9PSBjeV9yZWFkbCAoJmZpcm1faWQtPnNpZ25hdHVyZSkpKQorCSAgICB7CisJCXByaW50ayAoImN5YzpDeWNsYWRlcy1aIEVycm9yOiB5b3UgbmVlZCBhbiBleHRlcm5hbCBwb3dlciBzdXBwbHkgZm9yIHRoaXMgbnVtYmVyIG9mIHBvcnRzLlxuXHJGaXJtd2FyZSBoYWx0ZWQuXHJcbiIpOworCSAgICB9IGVsc2UgeworCQlwcmludGsoImN5YzpDeWNsYWRlcy1aIGZpcm13YXJlIG5vdCB5ZXQgbG9hZGVkXG4iKTsKKwkgICAgfQorCSAgICByZXR1cm4gLUVOT0RFVjsKKwl9CisjaWZkZWYgQ09ORklHX0NZWl9JTlRSCisJZWxzZSB7CisJICAgIC8qIEluIGNhc2UgdGhpcyBaIGJvYXJkIGlzIG9wZXJhdGluZyBpbiBpbnRlcnJ1cHQgbW9kZSwgaXRzIAorCSAgICAgICBpbnRlcnJ1cHRzIHNob3VsZCBiZSBlbmFibGVkIGFzIHNvb24gYXMgdGhlIGZpcnN0IG9wZW4gaGFwcGVucyAKKwkgICAgICAgdG8gb25lIG9mIGl0cyBwb3J0cy4gKi8KKyAgICAgICAgICAgIGlmICghY2luZm8tPmludHJfZW5hYmxlZCkgeworCQlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisJCXN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7CisKKwkJemZ3X2N0cmwgPSBjaW5mby0+YmFzZV9hZGRyICsgKGN5X3JlYWRsICgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOworCisJCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisKKwkJLyogRW5hYmxlIGludGVycnVwdHMgb24gdGhlIFBMWCBjaGlwICovCisJCWN5X3dyaXRldyhjaW5mby0+Y3RsX2FkZHIrMHg2OCwKKwkJCWN5X3JlYWR3KGNpbmZvLT5jdGxfYWRkcisweDY4KXwweDA5MDApOworCQkvKiBFbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgRlcgKi8KKwkJcmV0dmFsID0gY3l6X2lzc3VlX2NtZChjaW5mbywKKwkJCQkJMCwgQ19DTV9JUlFfRU5CTCwgMEwpOworCQlpZiAocmV0dmFsICE9IDApeworCQkgICAgcHJpbnRrKCJjeWM6SVJRIGVuYWJsZSByZXR2YWwgd2FzICV4XG4iLCByZXR2YWwpOworCQl9CisJCWNpbmZvLT5ucG9ydHMgPSAoaW50KSBjeV9yZWFkbCAoJmJvYXJkX2N0cmwtPm5fY2hhbm5lbCk7CisJCWNpbmZvLT5pbnRyX2VuYWJsZWQgPSAxOworCSAgICB9CisJfQorI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLworCS8qIE1ha2Ugc3VyZSB0aGlzIFogcG9ydCByZWFsbHkgZXhpc3RzIGluIGhhcmR3YXJlICovCisJaWYgKGluZm8tPmxpbmUgPiAoY2luZm8tPmZpcnN0X2xpbmUgKyBjaW5mby0+bnBvcnRzIC0gMSkpCisJCXJldHVybiAtRU5PREVWOworICAgIH0KKyNpZmRlZiBDWV9ERUJVR19PVEhFUgorICAgIHByaW50aygiY3ljOmN5X29wZW4gdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsgLyogKi8KKyNlbmRpZgorICAgIHR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOworICAgIGluZm8tPnR0eSA9IHR0eTsKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X29wZW4iKSl7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyNpZmRlZiBDWV9ERUJVR19PUEVOCisgICAgcHJpbnRrKCJjeWM6Y3lfb3BlbiB0dHlDJWQsIGNvdW50ID0gJWRcbiIsCisgICAgICAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsvKiovCisjZW5kaWYKKyAgICBpbmZvLT5jb3VudCsrOworI2lmZGVmIENZX0RFQlVHX0NPVU5UCisgICAgcHJpbnRrKCJjeWM6Y3lfb3BlbiAoJWQpOiBpbmNyZW1lbnRpbmcgY291bnQgdG8gJWRcbiIsCisgICAgICAgIGN1cnJlbnQtPnBpZCwgaW5mby0+Y291bnQpOworI2VuZGlmCisgICAgaWYgKCF0bXBfYnVmKSB7CisJcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXBhZ2UpCisJICAgIHJldHVybiAtRU5PTUVNOworCWlmICh0bXBfYnVmKQorCSAgICBmcmVlX3BhZ2UocGFnZSk7CisJZWxzZQorCSAgICB0bXBfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSBwb3J0IGlzIHRoZSBtaWRkbGUgb2YgY2xvc2luZywgYmFpbCBvdXQgbm93CisgICAgICovCisgICAgaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykpIHsKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKQorCSAgICBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKKwlyZXR1cm4gKChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpID8gLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTdGFydCB1cCBzZXJpYWwgcG9ydAorICAgICAqLworICAgIHJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7CisgICAgaWYgKHJldHZhbCl7CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgcmV0dmFsID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgaW5mbyk7CisgICAgaWYgKHJldHZhbCkgeworI2lmZGVmIENZX0RFQlVHX09QRU4KKyAgICAgICAgcHJpbnRrKCJjeWM6Y3lfb3BlbiByZXR1cm5pbmcgYWZ0ZXIgYmxvY2tfdGlsX3JlYWR5IHdpdGggJWRcbiIsCisgICAgICAgICAgICAgICByZXR2YWwpOworI2VuZGlmCisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgaW5mby0+dGhyb3R0bGUgPSAwOworCisjaWZkZWYgQ1lfREVCVUdfT1BFTgorICAgIHByaW50aygiIGN5YzpjeV9vcGVuIGRvbmVcbiIpOy8qKi8KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9IC8qIGN5X29wZW4gKi8KKworCisvKgorICogY3lfd2FpdF91bnRpbF9zZW50KCkgLS0tIHdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5CisgKi8KK3N0YXRpYyB2b2lkIAorY3lfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgaW50IGNhcmQsY2hpcCxjaGFubmVsLGluZGV4OworICB1bnNpZ25lZCBsb25nIG9yaWdfamlmZmllczsKKyAgaW50IGNoYXJfdGltZTsKKwkKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3dhaXRfdW50aWxfc2VudCIpKQorCXJldHVybjsKKworICAgIGlmIChpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9PSAwKQorCXJldHVybjsgLyogSnVzdCBpbiBjYXNlLi4uLiAqLworCisKKyAgICBvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworICAgIC8qCisgICAgICogU2V0IHRoZSBjaGVjayBpbnRlcnZhbCB0byBiZSAxLzUgb2YgdGhlIGVzdGltYXRlZCB0aW1lIHRvCisgICAgICogc2VuZCBhIHNpbmdsZSBjaGFyYWN0ZXIsIGFuZCBtYWtlIGl0IGF0IGxlYXN0IDEuICBUaGUgY2hlY2sKKyAgICAgKiBpbnRlcnZhbCBzaG91bGQgYWxzbyBiZSBsZXNzIHRoYW4gdGhlIHRpbWVvdXQuCisgICAgICogCisgICAgICogTm90ZTogd2UgaGF2ZSB0byB1c2UgcHJldHR5IHRpZ2h0IHRpbWluZ3MgaGVyZSB0byBzYXRpc2Z5CisgICAgICogdGhlIE5JU1QtUENUUy4KKyAgICAgKi8KKyAgICBjaGFyX3RpbWUgPSAoaW5mby0+dGltZW91dCAtIEhaLzUwKSAvIGluZm8tPnhtaXRfZmlmb19zaXplOworICAgIGNoYXJfdGltZSA9IGNoYXJfdGltZSAvIDU7CisgICAgaWYgKGNoYXJfdGltZSA8PSAwKQorCWNoYXJfdGltZSA9IDE7CisgICAgaWYgKHRpbWVvdXQgPCAwKQorCXRpbWVvdXQgPSAwOworICAgIGlmICh0aW1lb3V0KQorCWNoYXJfdGltZSA9IG1pbihjaGFyX3RpbWUsIHRpbWVvdXQpOworICAgIC8qCisgICAgICogSWYgdGhlIHRyYW5zbWl0dGVyIGhhc24ndCBjbGVhcmVkIGluIHR3aWNlIHRoZSBhcHByb3hpbWF0ZQorICAgICAqIGFtb3VudCBvZiB0aW1lIHRvIHNlbmQgdGhlIGVudGlyZSBGSUZPLCBpdCBwcm9iYWJseSB3b24ndAorICAgICAqIGV2ZXIgY2xlYXIuICBUaGlzIGFzc3VtZXMgdGhlIFVBUlQgaXNuJ3QgZG9pbmcgZmxvdworICAgICAqIGNvbnRyb2wsIHdoaWNoIGlzIGN1cnJlbnRseSB0aGUgY2FzZS4gIEhlbmNlLCBpZiBpdCBldmVyCisgICAgICogdGFrZXMgbG9uZ2VyIHRoYW4gaW5mby0+dGltZW91dCwgdGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gYQorICAgICAqIFVBUlQgYnVnIG9mIHNvbWUga2luZC4gIFNvLCB3ZSBjbGFtcCB0aGUgdGltZW91dCBwYXJhbWV0ZXIgYXQKKyAgICAgKiAyKmluZm8tPnRpbWVvdXQuCisgICAgICovCisgICAgaWYgKCF0aW1lb3V0IHx8IHRpbWVvdXQgPiAyKmluZm8tPnRpbWVvdXQpCisJdGltZW91dCA9IDIqaW5mby0+dGltZW91dDsKKyNpZmRlZiBDWV9ERUJVR19XQUlUX1VOVElMX1NFTlQKKyAgICBwcmludGsoIkluIGN5X3dhaXRfdW50aWxfc2VudCglZCkgY2hlY2s9JWx1Li4uIiwgdGltZW91dCwgY2hhcl90aW1lKTsKKyAgICBwcmludGsoImppZmY9JWx1Li4uIiwgamlmZmllcyk7CisjZW5kaWYKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCWNoaXAgPSBjaGFubmVsPj4yOworCWNoYW5uZWwgJj0gMHgwMzsKKwlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisJd2hpbGUgKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpICYgQ3lUeFJkeSkgeworI2lmZGVmIENZX0RFQlVHX1dBSVRfVU5USUxfU0VOVAorCSAgICBwcmludGsoIk5vdCBjbGVhbiAoamlmZj0lbHUpLi4uIiwgamlmZmllcyk7CisjZW5kaWYKKwkgICAgaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hhcl90aW1lKSkpCisJCWJyZWFrOworCSAgICBpZiAodGltZW91dCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArIHRpbWVvdXQpKQorCQlicmVhazsKKwl9CisgICAgfSBlbHNlIHsKKwkvLyBOb3RoaW5nIHRvIGRvIQorICAgIH0KKyAgICAvKiBSdW4gb25lIG1vcmUgY2hhciBjeWNsZSAqLworICAgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hhcl90aW1lICogNSkpOworI2lmZGVmIENZX0RFQlVHX1dBSVRfVU5USUxfU0VOVAorICAgIHByaW50aygiQ2xlYW4gKGppZmY9JWx1KS4uLmRvbmVcbiIsIGppZmZpZXMpOworI2VuZGlmCit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYSBwYXJ0aWN1bGFyIHR0eSBkZXZpY2UgaXMgY2xvc2VkLgorICovCitzdGF0aWMgdm9pZAorY3lfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIENZX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeWM6Y3lfY2xvc2UgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsKKyNlbmRpZgorCisgICAgaWYgKCFpbmZvIHx8IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9jbG9zZSIpKXsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgIC8qIElmIHRoZSBUVFkgaXMgYmVpbmcgaHVuZyB1cCwgbm90aGluZyB0byBkbyAqLworICAgIGlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAgICAgCisjaWZkZWYgQ1lfREVCVUdfT1BFTgorICAgIHByaW50aygiY3ljOmN5X2Nsb3NlIHR0eUMlZCwgY291bnQgPSAlZFxuIiwgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisgICAgaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChpbmZvLT5jb3VudCAhPSAxKSkgeworICAgICAgICAvKgorICAgICAgICAgKiBVaCwgb2guICB0dHktPmNvdW50IGlzIDEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHR0eQorICAgICAgICAgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4gIEluZm8tPmNvdW50IHNob3VsZCBhbHdheXMKKyAgICAgICAgICogYmUgb25lIGluIHRoZXNlIGNvbmRpdGlvbnMuICBJZiBpdCdzIGdyZWF0ZXIgdGhhbgorICAgICAgICAgKiBvbmUsIHdlJ3ZlIGdvdCByZWFsIHByb2JsZW1zLCBzaW5jZSBpdCBtZWFucyB0aGUKKyAgICAgICAgICogc2VyaWFsIHBvcnQgd29uJ3QgYmUgc2h1dGRvd24uCisgICAgICAgICAqLworICAgICAgICBwcmludGsoImN5YzpjeV9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50OyB0dHktPmNvdW50IGlzIDEsICIKKyAgICAgICAgICAgImluZm8tPmNvdW50IGlzICVkXG4iLCBpbmZvLT5jb3VudCk7CisgICAgICAgIGluZm8tPmNvdW50ID0gMTsKKyAgICB9CisjaWZkZWYgQ1lfREVCVUdfQ09VTlQKKyAgICBwcmludGsoImN5YzpjeV9jbG9zZSBhdCAoJWQpOiBkZWNyZW1lbnRpbmcgY291bnQgdG8gJWRcbiIsCisgICAgICAgIGN1cnJlbnQtPnBpZCwgaW5mby0+Y291bnQgLSAxKTsKKyNlbmRpZgorICAgIGlmICgtLWluZm8tPmNvdW50IDwgMCkgeworI2lmZGVmIENZX0RFQlVHX0NPVU5UCisgICAgcHJpbnRrKCJjeWM6Y3ljX2Nsb3NlIHNldHRpbmcgY291bnQgdG8gMFxuIik7CisjZW5kaWYKKyAgICAgICAgaW5mby0+Y291bnQgPSAwOworICAgIH0KKyAgICBpZiAoaW5mby0+Y291bnQpIHsKKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGluZm8tPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisKKyAgICAvKgorICAgICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkKKyAgICAqIHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gb25seSBwcm9jZXNzIFhPTi9YT0ZGIGNoYXJhY3RlcnMuCisgICAgKi8KKyAgICB0dHktPmNsb3NpbmcgPSAxOworICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBDWV9DTE9TSU5HX1dBSVRfTk9ORSkgeworCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT5jbG9zaW5nX3dhaXQpOworICAgIH0KKyAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKKworICAgIGlmICghSVNfQ1lDX1ooY3lfY2FyZFtpbmZvLT5jYXJkXSkpIHsKKwlpbnQgY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjeV9jYXJkW2luZm8tPmNhcmRdLmZpcnN0X2xpbmU7CisJaW50IGluZGV4ID0gY3lfY2FyZFtpbmZvLT5jYXJkXS5idXNfaW5kZXg7CisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHIgPSBjeV9jYXJkW2luZm8tPmNhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGFubmVsPj4yXSA8PCBpbmRleCk7CisJLyogU3RvcCBhY2NlcHRpbmcgaW5wdXQgKi8KKwljaGFubmVsICY9IDB4MDM7CisJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKKwljeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKKwkJCWN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpICYgfkN5UnhEYXRhKTsKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCSAgICAvKiBXYWl0aW5nIGZvciBvbi1ib2FyZCBidWZmZXJzIHRvIGJlIGVtcHR5IGJlZm9yZSBjbG9zaW5nIAorCSAgICAgICB0aGUgcG9ydCAqLworCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCSAgICBjeV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT50aW1lb3V0KTsKKwkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJfQorICAgIH0gZWxzZSB7CisjaWZkZWYgWl9XQUtFCisJLyogV2FpdGluZyBmb3Igb24tYm9hcmQgYnVmZmVycyB0byBiZSBlbXB0eSBiZWZvcmUgY2xvc2luZyB0aGUgcG9ydCAqLworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyID0gY3lfY2FyZFtpbmZvLT5jYXJkXS5iYXNlX2FkZHI7CisJc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZCA9IGJhc2VfYWRkciArIElEX0FERFJFU1M7CisJc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsID0gYmFzZV9hZGRyICsgKGN5X3JlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYgMHhmZmZmZik7CisJc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybCA9IHpmd19jdHJsLT5jaF9jdHJsOworCWludCBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbaW5mby0+Y2FyZF0uZmlyc3RfbGluZTsKKwlpbnQgcmV0dmFsOworCisJaWYgKGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLmZsb3dfc3RhdHVzKSAhPSBDX0ZTX1RYSURMRSkgeworCSAgICByZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2luZm8tPmNhcmRdLCBjaGFubmVsLCAKKwkJCQkgICBDX0NNX0lPQ1RMVywgMEwpOworCSAgICBpZiAocmV0dmFsICE9IDApeworCQlwcmludGsoImN5YzpjeV9jbG9zZSByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJICAgICAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJICAgIH0KKwkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwkgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+c2h1dGRvd25fd2FpdCk7CisJICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworCX0KKyNlbmRpZgorICAgIH0KKworICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgc2h1dGRvd24oaW5mbyk7CisgICAgaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisgICAgICAgIHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKyAgICB0dHlfbGRpc2NfZmx1c2godHR5KTsgICAgICAgIAorICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworCisgICAgdHR5LT5jbG9zaW5nID0gMDsKKyAgICBpbmZvLT5ldmVudCA9IDA7CisgICAgaW5mby0+dHR5ID0gTlVMTDsKKyAgICBpZiAoaW5mby0+YmxvY2tlZF9vcGVuKSB7CisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKyAgICAgICAgaWYgKGluZm8tPmNsb3NlX2RlbGF5KSB7CisgICAgICAgICAgICBtc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7CisgICAgICAgIH0KKyAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgIH0KKyAgICBpbmZvLT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7CisgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5jbG9zZV93YWl0KTsKKworI2lmZGVmIENZX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCIgY3ljOmN5X2Nsb3NlIGRvbmVcbiIpOworI2VuZGlmCisKKyAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgIHJldHVybjsKK30gLyogY3lfY2xvc2UgKi8KKworCisvKiBUaGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgd2hlbiB0dHlfd3JpdGUgaGFzIHB1dCBzb21ldGhpbmcgaW50bworICogdGhlIHdyaXRlX3F1ZXVlLiAgVGhlIGNoYXJhY3RlcnMgbWF5IGNvbWUgZnJvbSB1c2VyIHNwYWNlIG9yCisgKiBrZXJuZWwgc3BhY2UuCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseQorICogYWNjZXB0ZWQgZm9yIHdyaXRpbmcuCisgKgorICogSWYgdGhlIHBvcnQgaXMgbm90IGFscmVhZHkgdHJhbnNtaXR0aW5nIHN0dWZmLCBzdGFydCBpdCBvZmYgYnkKKyAqIGVuYWJsaW5nIGludGVycnVwdHMuICBUaGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSB3aWxsIHRoZW4KKyAqIGVuc3VyZSB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSBzZW50LgorICogSWYgdGhlIHBvcnQgaXMgYWxyZWFkeSBhY3RpdmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8ga2ljayBpdC4KKyAqCisgKi8KK3N0YXRpYyBpbnQKK2N5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICBpbnQgYywgcmV0ID0gMDsKKworI2lmZGVmIENZX0RFQlVHX0lPCisgICAgcHJpbnRrKCJjeWM6Y3lfd3JpdGUgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsgLyogKi8KKyNlbmRpZgorCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV93cml0ZSIpKXsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICAgICAKKyAgICBpZiAoIXR0eSB8fCAhaW5mby0+eG1pdF9idWYgfHwgIXRtcF9idWYpeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKKyAgICB3aGlsZSAoMSkgeworCWMgPSBtaW4oY291bnQsIG1pbigoaW50KShTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxKSwKKwkJCShpbnQpKFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2hlYWQpKSk7CisJICAgICAgICAKKwlpZiAoYyA8PSAwKQorCSAgICBicmVhazsKKworCW1lbWNweShpbmZvLT54bWl0X2J1ZiArIGluZm8tPnhtaXRfaGVhZCwgYnVmLCBjKTsKKwlpbmZvLT54bWl0X2hlYWQgPSAoaW5mby0+eG1pdF9oZWFkICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKKwlpbmZvLT54bWl0X2NudCArPSBjOworCWJ1ZiArPSBjOworCWNvdW50IC09IGM7CisJcmV0ICs9IGM7CisgICAgfQorICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisKKyAgICBpbmZvLT5pZGxlX3N0YXRzLnhtaXRfYnl0ZXMgKz0gcmV0OworICAgIGluZm8tPmlkbGVfc3RhdHMueG1pdF9pZGxlICAgPSBqaWZmaWVzOworCisgICAgaWYgKGluZm8tPnhtaXRfY250ICYmICF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCkgeworICAgICAgICBzdGFydF94bWl0KGluZm8pOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfSAvKiBjeV93cml0ZSAqLworCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBrZXJuZWwgdG8gd3JpdGUgYSBzaW5nbGUKKyAqIGNoYXJhY3RlciB0byB0aGUgdHR5IGRldmljZS4gIElmIHRoZSBrZXJuZWwgdXNlcyB0aGlzIHJvdXRpbmUsCisgKiBpdCBtdXN0IGNhbGwgdGhlIGZsdXNoX2NoYXJzKCkgcm91dGluZSAoaWYgZGVmaW5lZCkgd2hlbiBpdCBpcworICogZG9uZSBzdHVmZmluZyBjaGFyYWN0ZXJzIGludG8gdGhlIGRyaXZlci4gIElmIHRoZXJlIGlzIG5vIHJvb20KKyAqIGluIHRoZSBxdWV1ZSwgdGhlIGNoYXJhY3RlciBpcyBpZ25vcmVkLgorICovCitzdGF0aWMgdm9pZAorY3lfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgQ1lfREVCVUdfSU8KKyAgICBwcmludGsoImN5YzpjeV9wdXRfY2hhciB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3B1dF9jaGFyIikpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZikKKyAgICAgICAgcmV0dXJuOworCisgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisgICAgICAgIGlmIChpbmZvLT54bWl0X2NudCA+PSBTRVJJQUxfWE1JVF9TSVpFIC0gMSkgeworCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF9oZWFkKytdID0gY2g7CisgICAgICAgIGluZm8tPnhtaXRfaGVhZCAmPSBTRVJJQUxfWE1JVF9TSVpFIC0gMTsKKyAgICAgICAgaW5mby0+eG1pdF9jbnQrKzsKKwlpbmZvLT5pZGxlX3N0YXRzLnhtaXRfYnl0ZXMrKzsKKwlpbmZvLT5pZGxlX3N0YXRzLnhtaXRfaWRsZSA9IGppZmZpZXM7CisgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKK30gLyogY3lfcHV0X2NoYXIgKi8KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUga2VybmVsIGFmdGVyIGl0IGhhcyB3cml0dGVuIGEKKyAqIHNlcmllcyBvZiBjaGFyYWN0ZXJzIHRvIHRoZSB0dHkgZGV2aWNlIHVzaW5nIHB1dF9jaGFyKCkuICAKKyAqLworc3RhdGljIHZvaWQKK2N5X2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjaWZkZWYgQ1lfREVCVUdfSU8KKyAgICBwcmludGsoImN5YzpjeV9mbHVzaF9jaGFycyB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOyAvKiAqLworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X2ZsdXNoX2NoYXJzIikpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChpbmZvLT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZAorICAgIHx8IHR0eS0+aHdfc3RvcHBlZCB8fCAhaW5mby0+eG1pdF9idWYpCisgICAgICAgIHJldHVybjsKKworICAgIHN0YXJ0X3htaXQoaW5mbyk7Cit9IC8qIGN5X2ZsdXNoX2NoYXJzICovCisKKworLyoKKyAqIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBudW1iZXJzIG9mIGNoYXJhY3RlcnMgdGhlIHR0eSBkcml2ZXIKKyAqIHdpbGwgYWNjZXB0IGZvciBxdWV1aW5nIHRvIGJlIHdyaXR0ZW4uICBUaGlzIG51bWJlciBpcyBzdWJqZWN0CisgKiB0byBjaGFuZ2UgYXMgb3V0cHV0IGJ1ZmZlcnMgZ2V0IGVtcHRpZWQsIG9yIGlmIHRoZSBvdXRwdXQgZmxvdworICogY29udHJvbCBpcyBhY3RpdmF0ZWQuCisgKi8KK3N0YXRpYyBpbnQKK2N5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICBpbnQgICByZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2lmZGVmIENZX0RFQlVHX0lPCisgICAgcHJpbnRrKCJjeWM6Y3lfd3JpdGVfcm9vbSB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOyAvKiAqLworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3dyaXRlX3Jvb20iKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0ID0gU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0ID0gMDsKKyAgICByZXR1cm4gcmV0OworfSAvKiBjeV93cml0ZV9yb29tICovCisKKworc3RhdGljIGludAorY3lfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgaW50IGNhcmQsIGNoYW5uZWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfY2hhcnNfaW5fYnVmZmVyIikpCisgICAgICAgIHJldHVybiAwOworCisgICAgY2FyZCA9IGluZm8tPmNhcmQ7CisgICAgY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOworCisjaWZkZWYgWl9FWFRfQ0hBUlNfSU5fQlVGRkVSCisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworI2VuZGlmIC8qIFpfRVhUX0NIQVJTX0lOX0JVRkZFUiAqLworI2lmZGVmIENZX0RFQlVHX0lPCisJcHJpbnRrKCJjeWM6Y3lfY2hhcnNfaW5fYnVmZmVyIHR0eUMlZCAlZFxuIiwKKwkJaW5mby0+bGluZSwgaW5mby0+eG1pdF9jbnQpOyAvKiAqLworI2VuZGlmCisJcmV0dXJuIGluZm8tPnhtaXRfY250OworI2lmZGVmIFpfRVhUX0NIQVJTX0lOX0JVRkZFUgorICAgIH0gZWxzZSB7CisJc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBGSVJNX0lEICpmaXJtX2lkOworCXN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgWkZXX0NUUkwgKnpmd19jdHJsOworCXN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgQ0hfQ1RSTCAqY2hfY3RybDsKKwlzdGF0aWMgdm9sYXRpbGUgc3RydWN0IEJVRl9DVFJMICpidWZfY3RybDsKKwlpbnQgY2hhcl9jb3VudDsKKwl2b2xhdGlsZSB1Y2xvbmcgdHhfcHV0LCB0eF9nZXQsIHR4X2J1ZnNpemU7CisKKwlmaXJtX2lkID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOworCXpmd19jdHJsID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKKwljaF9jdHJsID0gJih6ZndfY3RybC0+Y2hfY3RybFtjaGFubmVsXSk7CisJYnVmX2N0cmwgPSAmKHpmd19jdHJsLT5idWZfY3RybFtjaGFubmVsXSk7CisKKwl0eF9nZXQgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnR4X2dldCk7CisJdHhfcHV0ID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT50eF9wdXQpOworCXR4X2J1ZnNpemUgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnR4X2J1ZnNpemUpOworCWlmICh0eF9wdXQgPj0gdHhfZ2V0KQorCSAgICBjaGFyX2NvdW50ID0gdHhfcHV0IC0gdHhfZ2V0OworCWVsc2UKKwkgICAgY2hhcl9jb3VudCA9IHR4X3B1dCAtIHR4X2dldCArIHR4X2J1ZnNpemU7CisjaWZkZWYgQ1lfREVCVUdfSU8KKwlwcmludGsoImN5YzpjeV9jaGFyc19pbl9idWZmZXIgdHR5QyVkICVkXG4iLAorCQlpbmZvLT5saW5lLCBpbmZvLT54bWl0X2NudCArIGNoYXJfY291bnQpOyAvKiAqLworI2VuZGlmCisJcmV0dXJuIChpbmZvLT54bWl0X2NudCArIGNoYXJfY291bnQpOworICAgIH0KKyNlbmRpZiAvKiBaX0VYVF9DSEFSU19JTl9CVUZGRVIgKi8KK30gLyogY3lfY2hhcnNfaW5fYnVmZmVyICovCisKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY3lfaW9jdGwoKSBhbmQgZnJpZW5kcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIHZvaWQKK2N5eV9iYXVkX2NhbGMoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8sIHVjbG9uZyBiYXVkKQoreworICAgIGludCBjbywgY29fdmFsLCBicHI7CisgICAgdWNsb25nIGN5X2Nsb2NrID0gKChpbmZvLT5jaGlwX3JldiA+PSBDRDE0MDBfUkVWX0opID8gNjAwMDAwMDAgOiAyNTAwMDAwMCk7CisKKyAgICBpZiAoYmF1ZCA9PSAwKSB7CisJaW5mby0+dGJwciA9IGluZm8tPnRjbyA9IGluZm8tPnJicHIgPSBpbmZvLT5yY28gPSAwOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBkZXRlcm1pbmUgd2hpY2ggcHJlc2NhbGVyIHRvIHVzZSAqLworICAgIGZvciAoY28gPSA0LCBjb192YWwgPSAyMDQ4OyBjbzsgY28tLSwgY29fdmFsID4+PSAyKSB7CisJaWYgKGN5X2Nsb2NrIC8gY29fdmFsIC8gYmF1ZCA+IDYzKQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICBicHIgPSAoY3lfY2xvY2sgLyBjb192YWwgKiAyIC8gYmF1ZCArIDEpIC8gMjsKKyAgICBpZiAoYnByID4gMjU1KQorCWJwciA9IDI1NTsKKworICAgIGluZm8tPnRicHIgPSBpbmZvLT5yYnByID0gYnByOworICAgIGluZm8tPnRjbyA9IGluZm8tPnJjbyA9IGNvOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGZpbmRzIG9yIGNvbXB1dGVzIHRoZSB2YXJpb3VzIGxpbmUgY2hhcmFjdGVyaXN0aWNzLgorICogSXQgdXNlZCB0byBiZSBjYWxsZWQgY29uZmlnX3NldHVwCisgKi8KK3N0YXRpYyB2b2lkCitzZXRfbGluZV9jaGFyKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbykKK3sKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisgIGludCBjYXJkLGNoaXAsY2hhbm5lbCxpbmRleDsKKyAgdW5zaWduZWQgY2ZsYWcsIGlmbGFnOworICB1bnNpZ25lZCBzaG9ydCBjaGlwX251bWJlcjsKKyAgaW50IGJhdWQsIGJhdWRfcmF0ZSA9IDA7CisgIGludCAgIGk7CisKKworICAgIGlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpbmZvLT5saW5lID09IC0xKXsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKyAgICBpZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKKworICAgIC8qCisgICAgICogU2V0IHVwIHRoZSB0dHktPmFsdF9zcGVlZCBrbHVkZ2UKKyAgICAgKi8KKyAgICBpZiAoaW5mby0+dHR5KSB7CisJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJICAgIGluZm8tPnR0eS0+YWx0X3NwZWVkID0gNTc2MDA7CisJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCSAgICBpbmZvLT50dHktPmFsdF9zcGVlZCA9IDExNTIwMDsKKwlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9TSEkpCisJICAgIGluZm8tPnR0eS0+YWx0X3NwZWVkID0gMjMwNDAwOworCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1dBUlApCisJICAgIGluZm8tPnR0eS0+YWx0X3NwZWVkID0gNDYwODAwOworICAgIH0KKworICAgIGNhcmQgPSBpbmZvLT5jYXJkOworICAgIGNoYW5uZWwgPSAoaW5mby0+bGluZSkgLSAoY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lKTsKKyAgICBjaGlwX251bWJlciA9IGNoYW5uZWwgLyA0OworCisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCisJaW5kZXggPSBjeV9jYXJkW2NhcmRdLmJ1c19pbmRleDsKKworCS8qIGJhdWQgcmF0ZSAqLworCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpOworCWlmICgoYmF1ZCA9PSAzODQwMCkgJiYKKwkgICAgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkpIHsKKwkgICAgaWYgKGluZm8tPmN1c3RvbV9kaXZpc29yKQorCQliYXVkX3JhdGUgPSBpbmZvLT5iYXVkIC8gaW5mby0+Y3VzdG9tX2Rpdmlzb3I7CisJICAgIGVsc2UKKwkJYmF1ZF9yYXRlID0gaW5mby0+YmF1ZDsKKwl9IGVsc2UgaWYgKGJhdWQgPiBDRDE0MDBfTUFYX1NQRUVEKSB7CisJICAgIGJhdWQgPSBDRDE0MDBfTUFYX1NQRUVEOworCX0KKwkvKiBmaW5kIHRoZSBiYXVkIGluZGV4ICovCisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkgICAgaWYgKGJhdWQgPT0gYmF1ZF90YWJsZVtpXSkgeworCQlicmVhazsKKwkgICAgfQorCX0KKwlpZiAoaSA9PSAyMCkgeworCSAgICBpID0gMTk7IC8qIENEMTQwMF9NQVhfU1BFRUQgKi8KKwl9IAorCisJaWYgKChiYXVkID09IDM4NDAwKSAmJgorCSAgICAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKSkgeworCSAgICBjeXlfYmF1ZF9jYWxjKGluZm8sIGJhdWRfcmF0ZSk7CisJfSBlbHNlIHsKKwkgICAgaWYoaW5mby0+Y2hpcF9yZXYgPj0gQ0QxNDAwX1JFVl9KKSB7CisJCS8qIEl0IGlzIGEgQ0QxNDAwIHJldi4gSiBvciBsYXRlciAqLworCQlpbmZvLT50YnByID0gYmF1ZF9icHJfNjBbaV07IC8qIFR4IEJQUiAqLworCQlpbmZvLT50Y28gPSBiYXVkX2NvXzYwW2ldOyAvKiBUeCBDTyAqLworCQlpbmZvLT5yYnByID0gYmF1ZF9icHJfNjBbaV07IC8qIFJ4IEJQUiAqLworCQlpbmZvLT5yY28gPSBiYXVkX2NvXzYwW2ldOyAvKiBSeCBDTyAqLworCSAgICB9IGVsc2UgeworCQlpbmZvLT50YnByID0gYmF1ZF9icHJfMjVbaV07IC8qIFR4IEJQUiAqLworCQlpbmZvLT50Y28gPSBiYXVkX2NvXzI1W2ldOyAvKiBUeCBDTyAqLworCQlpbmZvLT5yYnByID0gYmF1ZF9icHJfMjVbaV07IC8qIFJ4IEJQUiAqLworCQlpbmZvLT5yY28gPSBiYXVkX2NvXzI1W2ldOyAvKiBSeCBDTyAqLworCSAgICB9CisJfQorCWlmIChiYXVkX3RhYmxlW2ldID09IDEzNCkgeworCSAgICAvKiBnZXQgaXQgcmlnaHQgZm9yIDEzNC41IGJhdWQgKi8KKwkgICAgaW5mby0+dGltZW91dCA9IChpbmZvLT54bWl0X2ZpZm9fc2l6ZSpIWiozMC8yNjkpICsgMjsKKwl9IGVsc2UgaWYgKChiYXVkID09IDM4NDAwKSAmJgorCQkgICAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKSkgeworCSAgICBpbmZvLT50aW1lb3V0ID0gKGluZm8tPnhtaXRfZmlmb19zaXplKkhaKjE1L2JhdWRfcmF0ZSkgKyAyOworCX0gZWxzZSBpZiAoYmF1ZF90YWJsZVtpXSkgeworCSAgICBpbmZvLT50aW1lb3V0ID0gKGluZm8tPnhtaXRfZmlmb19zaXplKkhaKjE1L2JhdWRfdGFibGVbaV0pICsgMjsKKwkgICAgLyogdGhpcyBuZWVkcyB0byBiZSBwcm9wYWdhdGVkIGludG8gdGhlIGNhcmQgaW5mbyAqLworCX0gZWxzZSB7CisJICAgIGluZm8tPnRpbWVvdXQgPSAwOworCX0KKwkvKiBCeSB0cmFkaXRpb24gKGlzIGl0IGEgc3RhbmRhcmQ/KSBhIGJhdWQgcmF0ZSBvZiB6ZXJvCisJICAgaW1wbGllcyB0aGUgbGluZSBzaG91bGQgYmUvaGFzIGJlZW4gY2xvc2VkLiAgQSBiaXQKKwkgICBsYXRlciBpbiB0aGlzIHJvdXRpbmUgc3VjaCBhIHRlc3QgaXMgcGVyZm9ybWVkLiAqLworCisJLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KKwlpbmZvLT5jb3I1ID0gMDsKKwlpbmZvLT5jb3I0ID0gMDsKKwlpbmZvLT5jb3IzID0gKGluZm8tPmRlZmF1bHRfdGhyZXNob2xkCisJCSAgICAgID8gaW5mby0+ZGVmYXVsdF90aHJlc2hvbGQKKwkJICAgICAgOiBiYXVkX2NvcjNbaV0pOyAvKiByZWNlaXZlIHRocmVzaG9sZCAqLworCWluZm8tPmNvcjIgPSBDeUVUQzsKKwlzd2l0Y2goY2ZsYWcgJiBDU0laRSl7CisJY2FzZSBDUzU6CisJICAgIGluZm8tPmNvcjEgPSBDeV81X0JJVFM7CisJICAgIGJyZWFrOworCWNhc2UgQ1M2OgorCSAgICBpbmZvLT5jb3IxID0gQ3lfNl9CSVRTOworCSAgICBicmVhazsKKwljYXNlIENTNzoKKwkgICAgaW5mby0+Y29yMSA9IEN5XzdfQklUUzsKKwkgICAgYnJlYWs7CisJY2FzZSBDUzg6CisJICAgIGluZm8tPmNvcjEgPSBDeV84X0JJVFM7CisJICAgIGJyZWFrOworCX0KKwlpZihjZmxhZyAmIENTVE9QQil7CisJICAgIGluZm8tPmNvcjEgfD0gQ3lfMl9TVE9QOworCX0KKwlpZiAoY2ZsYWcgJiBQQVJFTkIpeworCSAgICBpZiAoY2ZsYWcgJiBQQVJPREQpeworCQlpbmZvLT5jb3IxIHw9IEN5UEFSSVRZX087CisJICAgIH1lbHNleworCQlpbmZvLT5jb3IxIHw9IEN5UEFSSVRZX0U7CisJICAgIH0KKwl9ZWxzZXsKKwkgICAgaW5mby0+Y29yMSB8PSBDeVBBUklUWV9OT05FOworCX0KKwkgICAgCisJLyogQ1RTIGZsb3cgY29udHJvbCBmbGFnICovCisJaWYgKGNmbGFnICYgQ1JUU0NUUyl7CisJICAgIGluZm8tPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCSAgICBpbmZvLT5jb3IyIHw9IEN5Q3RzQUU7CisJfWVsc2V7CisJICAgIGluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKwkgICAgaW5mby0+Y29yMiAmPSB+Q3lDdHNBRTsKKwl9CisJaWYgKGNmbGFnICYgQ0xPQ0FMKQorCSAgICBpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJZWxzZQorCSAgICBpbmZvLT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKworCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgICAgVGhlIGhhcmR3YXJlIG9wdGlvbiwgQ3lSdHNBTywgcHJlc2VudHMgUlRTIHdoZW4KKwkgICAgdGhlIGNoaXAgaGFzIGNoYXJhY3RlcnMgdG8gc2VuZC4gIFNpbmNlIG1vc3QgbW9kZW1zCisJICAgIHVzZSBSVFMgYXMgcmV2ZXJzZSAoaW5ib3VuZCkgZmxvdyBjb250cm9sLCB0aGlzCisJICAgIG9wdGlvbiBpcyBub3QgdXNlZC4gIElmIGluYm91bmQgZmxvdyBjb250cm9sIGlzCisJICAgIG5lY2Vzc2FyeSwgRFRSIGNhbiBiZSBwcm9ncmFtbWVkIHRvIHByb3ZpZGUgdGhlCisJICAgIGFwcHJvcHJpYXRlIHNpZ25hbHMgZm9yIHVzZSB3aXRoIGEgbm9uLXN0YW5kYXJkCisJICAgIGNhYmxlLiAgQ29udGFjdCBNYXJjaW8gU2FpdG8gZm9yIGRldGFpbHMuCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJY2hpcCA9IGNoYW5uZWw+PjI7CisJY2hhbm5lbCAmPSAweDAzOworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKKworCSAgIC8qIHR4IGFuZCByeCBiYXVkIHJhdGUgKi8KKworCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVRDT1I8PGluZGV4KSwgaW5mby0+dGNvKTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lUQlBSPDxpbmRleCksIGluZm8tPnRicHIpOworCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVJDT1I8PGluZGV4KSwgaW5mby0+cmNvKTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lSQlBSPDxpbmRleCksIGluZm8tPnJicHIpOworCisJICAgIC8qIHNldCBsaW5lIGNoYXJhY3RlcmlzdGljcyAgYWNjb3JkaW5nIGNvbmZpZ3VyYXRpb24gKi8KKworCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNDSFIxPDxpbmRleCksIAorCQkgICAgICBTVEFSVF9DSEFSKGluZm8tPnR0eSkpOworCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNDSFIyPDxpbmRleCksIAorCQkgICAgICBTVE9QX0NIQVIoaW5mby0+dHR5KSk7CisJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q09SMTw8aW5kZXgpLCBpbmZvLT5jb3IxKTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDT1IyPDxpbmRleCksIGluZm8tPmNvcjIpOworCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNPUjM8PGluZGV4KSwgaW5mby0+Y29yMyk7CisJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q09SNDw8aW5kZXgpLCBpbmZvLT5jb3I0KTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDT1I1PDxpbmRleCksIGluZm8tPmNvcjUpOworCisJICAgIGN5eV9pc3N1ZV9jbWQoYmFzZV9hZGRyLAorCQkgICAgIEN5Q09SX0NIQU5HRXxDeUNPUjFjaHxDeUNPUjJjaHxDeUNPUjNjaCxpbmRleCk7CisKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgCisJCSAgICAgICh1X2NoYXIpY2hhbm5lbCk7IC8qICEhISBJcyB0aGlzIG5lZWRlZD8gKi8KKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lSVFBSPDxpbmRleCksIChpbmZvLT5kZWZhdWx0X3RpbWVvdXQKKwkJCQkJICAgICAgICAgPyBpbmZvLT5kZWZhdWx0X3RpbWVvdXQKKwkJCQkJICAgICAgICAgOiAweDAyKSk7IC8qIDEwbXMgcnggdGltZW91dCAqLworCisJICAgIGlmIChDX0NMT0NBTChpbmZvLT50dHkpKSB7CisJCS8qIHdpdGhvdXQgbW9kZW0gaW50ciAqLworCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSB8IEN5TWRtQ2gpOyAKKwkJCQkJLyogYWN0IG9uIDEtPjAgbW9kZW0gdHJhbnNpdGlvbnMgKi8KKyAgICAgICAgICAgICAgICBpZiAoKGNmbGFnICYgQ1JUU0NUUykgJiYgaW5mby0+cmZsb3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TUNPUjE8PGluZGV4KSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEN5Q1RTfHJmbG93X3RocltpXSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1DT1IxPDxpbmRleCksIEN5Q1RTKTsKKyAgICAgICAgICAgICAgICB9CisJCQkJCS8qIGFjdCBvbiAwLT4xIG1vZGVtIHRyYW5zaXRpb25zICovCisJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TUNPUjI8PGluZGV4KSwgQ3lDVFMpOworCSAgICB9IGVsc2UgeworCQkvKiB3aXRob3V0IG1vZGVtIGludHIgKi8KKwkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksCisgICAgICAgICAgICAgICAgICAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSkgfCBDeU1kbUNoKTsgCisJCQkJCS8qIGFjdCBvbiAxLT4wIG1vZGVtIHRyYW5zaXRpb25zICovCisgICAgICAgICAgICAgICAgaWYgKChjZmxhZyAmIENSVFNDVFMpICYmIGluZm8tPnJmbG93KSB7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1DT1IxPDxpbmRleCksIAorICAgICAgICAJICAgICAgICAgICAgICAgICAgKEN5RFNSfEN5Q1RTfEN5Ukl8Q3lEQ0R8cmZsb3dfdGhyW2ldKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TUNPUjE8PGluZGV4KSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3lEU1J8Q3lDVFN8Q3lSSXxDeURDRCk7CisgICAgICAgICAgICAgICAgfQorCQkJCQkvKiBhY3Qgb24gMC0+MSBtb2RlbSB0cmFuc2l0aW9ucyAqLworCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1DT1IyPDxpbmRleCksIAorCQkJICBDeURTUnxDeUNUU3xDeVJJfEN5RENEKTsKKwkgICAgfQorCisJICAgIGlmKGkgPT0gMCl7IC8qIGJhdWQgcmF0ZSBpcyB6ZXJvLCB0dXJuIG9mZiBsaW5lICovCisJICAgICAgICBpZiAoaW5mby0+cnRzZHRyX2ludikgeworCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCB+Q3lSVFMpOworCQl9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpLCB+Q3lEVFIpOworCQl9CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCXByaW50aygiY3ljOnNldF9saW5lX2NoYXIgZHJvcHBpbmcgRFRSXG4iKTsKKwkJcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwgCisJCSAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSksCisJCSAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSkpOworI2VuZGlmCisJICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5ydHNkdHJfaW52KSB7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIxPDxpbmRleCksIEN5UlRTKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpLCBDeURUUik7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENZX0RFQlVHX0RUUgorCQlwcmludGsoImN5YzpzZXRfbGluZV9jaGFyIHJhaXNpbmcgRFRSXG4iKTsKKwkJcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwKKwkJICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpKSwKKwkJICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpKSk7CisjZW5kaWYKKwkgICAgfQorCisJICAgIGlmIChpbmZvLT50dHkpeworCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJICAgIH0KKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCisgICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7CisgICAgICBzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisgICAgICBzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOworICAgICAgc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKKyAgICAgIHN0cnVjdCBCVUZfQ1RSTCBfX2lvbWVtICpidWZfY3RybDsKKyAgICAgIHVjbG9uZyBzd19mbG93OworICAgICAgaW50IHJldHZhbDsKKworICAgICAgICBmaXJtX2lkID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOworICAgICAgICBpZiAoIUlTWkxPQURFRChjeV9jYXJkW2NhcmRdKSkgeworCSAgICByZXR1cm47CisJfQorCisJemZ3X2N0cmwgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOworCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisJY2hfY3RybCA9ICYoemZ3X2N0cmwtPmNoX2N0cmxbY2hhbm5lbF0pOworCWJ1Zl9jdHJsID0gJnpmd19jdHJsLT5idWZfY3RybFtjaGFubmVsXTsKKworCS8qIGJhdWQgcmF0ZSAqLworCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpOworCWlmICgoYmF1ZCA9PSAzODQwMCkgJiYKKwkgICAgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkpIHsKKwkgICAgaWYgKGluZm8tPmN1c3RvbV9kaXZpc29yKQorCQliYXVkX3JhdGUgPSBpbmZvLT5iYXVkIC8gaW5mby0+Y3VzdG9tX2Rpdmlzb3I7CisJICAgIGVsc2UKKwkJYmF1ZF9yYXRlID0gaW5mby0+YmF1ZDsKKwl9IGVsc2UgaWYgKGJhdWQgPiBDWVpfTUFYX1NQRUVEKSB7CisJICAgIGJhdWQgPSBDWVpfTUFYX1NQRUVEOworCX0KKwljeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fYmF1ZCAsIGJhdWQpOworCisJaWYgKGJhdWQgPT0gMTM0KSB7CisJICAgIC8qIGdldCBpdCByaWdodCBmb3IgMTM0LjUgYmF1ZCAqLworCSAgICBpbmZvLT50aW1lb3V0ID0gKGluZm8tPnhtaXRfZmlmb19zaXplKkhaKjMwLzI2OSkgKyAyOworCX0gZWxzZSBpZiAoKGJhdWQgPT0gMzg0MDApICYmCisJCSAgICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QpKSB7CisJICAgIGluZm8tPnRpbWVvdXQgPSAoaW5mby0+eG1pdF9maWZvX3NpemUqSFoqMTUvYmF1ZF9yYXRlKSArIDI7CisJfSBlbHNlIGlmIChiYXVkKSB7CisJICAgIGluZm8tPnRpbWVvdXQgPSAoaW5mby0+eG1pdF9maWZvX3NpemUqSFoqMTUvYmF1ZCkgKyAyOworCSAgICAvKiB0aGlzIG5lZWRzIHRvIGJlIHByb3BhZ2F0ZWQgaW50byB0aGUgY2FyZCBpbmZvICovCisJfSBlbHNlIHsKKwkgICAgaW5mby0+dGltZW91dCA9IDA7CisJfQorCisJLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KKwlzd2l0Y2goY2ZsYWcgJiBDU0laRSl7CisJY2FzZSBDUzU6IGN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9kYXRhX2wgLCBDX0RMX0NTNSk7IGJyZWFrOworCWNhc2UgQ1M2OiBjeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fZGF0YV9sICwgQ19ETF9DUzYpOyBicmVhazsKKwljYXNlIENTNzogY3lfd3JpdGVsKCZjaF9jdHJsLT5jb21tX2RhdGFfbCAsIENfRExfQ1M3KTsgYnJlYWs7CisJY2FzZSBDUzg6IGN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9kYXRhX2wgLCBDX0RMX0NTOCk7IGJyZWFrOworCX0KKwlpZihjZmxhZyAmIENTVE9QQil7CisJICAgIGN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9kYXRhX2wsCisgICAgICAgICAgICAgICBjeV9yZWFkbCgmY2hfY3RybC0+Y29tbV9kYXRhX2wpIHwgQ19ETF8yU1RPUCk7CisJfWVsc2V7CisJICAgIGN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9kYXRhX2wsCisgICAgICAgICAgICAgICBjeV9yZWFkbCgmY2hfY3RybC0+Y29tbV9kYXRhX2wpIHwgQ19ETF8xU1RPUCk7CisJfQorCWlmIChjZmxhZyAmIFBBUkVOQil7CisJICAgIGlmIChjZmxhZyAmIFBBUk9ERCl7CisJCWN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9wYXJpdHkgLCBDX1BSX09ERCk7CisJICAgIH1lbHNleworCQljeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fcGFyaXR5ICwgQ19QUl9FVkVOKTsKKwkgICAgfQorCX1lbHNleworCSAgICBjeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fcGFyaXR5ICwgQ19QUl9OT05FKTsKKwl9CisKKwkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgKi8KKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKXsKKwkgICAgY3lfd3JpdGVsKCZjaF9jdHJsLT5od19mbG93LAorICAgICAgICAgICAgICAgY3lfcmVhZGwoJmNoX2N0cmwtPmh3X2Zsb3cpIHwgQ19SU19DVFMgfCBDX1JTX1JUUyk7CisJfWVsc2V7CisJICAgIGN5X3dyaXRlbCgmY2hfY3RybC0+aHdfZmxvdywKKyAgICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsLT5od19mbG93KSAmIH4oQ19SU19DVFMgfCBDX1JTX1JUUykpOworCX0KKwkvKiBBcyB0aGUgSFcgZmxvdyBjb250cm9sIGlzIGRvbmUgaW4gZmlybXdhcmUsIHRoZSBkcml2ZXIgZG9lc24ndAorCSAgIG5lZWQgdG8gY2FyZSBhYm91dCBpdCAqLworCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKworCS8qIFhPTi9YT0ZGL1hBTlkgZmxvdyBjb250cm9sIGZsYWdzICovCisJc3dfZmxvdyA9IDA7CisJaWYgKGlmbGFnICYgSVhPTil7CisJICAgIHN3X2Zsb3cgfD0gQ19GTF9PWFg7CisJICAgIGlmIChpZmxhZyAmIElYQU5ZKQorCQlzd19mbG93IHw9IENfRkxfT0lYQU5ZOworCX0KKwljeV93cml0ZWwoJmNoX2N0cmwtPnN3X2Zsb3csIHN3X2Zsb3cpOworCisJcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtjYXJkXSwgY2hhbm5lbCwgQ19DTV9JT0NUTCwgMEwpOworCWlmIChyZXR2YWwgIT0gMCl7CisJICAgIHByaW50aygiY3ljOnNldF9saW5lX2NoYXIgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJfQorCisJLyogQ0Qgc2Vuc2l0aXZpdHkgKi8KKwlpZiAoY2ZsYWcgJiBDTE9DQUwpeworCSAgICBpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJfWVsc2V7CisJICAgIGluZm8tPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCX0KKworCWlmKGJhdWQgPT0gMCl7IC8qIGJhdWQgcmF0ZSBpcyB6ZXJvLCB0dXJuIG9mZiBsaW5lICovCisJICAgIGN5X3dyaXRlbCgmY2hfY3RybC0+cnNfY29udHJvbCwKKyAgICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsLT5yc19jb250cm9sKSAmIH5DX1JTX0RUUik7CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJICAgIHByaW50aygiY3ljOnNldF9saW5lX2NoYXIgZHJvcHBpbmcgWiBEVFJcbiIpOworI2VuZGlmCisJfWVsc2V7CisJICAgIGN5X3dyaXRlbCgmY2hfY3RybC0+cnNfY29udHJvbCwKKyAgICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsLT5yc19jb250cm9sKSB8IENfUlNfRFRSKTsKKyNpZmRlZiBDWV9ERUJVR19EVFIKKwkgICAgcHJpbnRrKCJjeWM6c2V0X2xpbmVfY2hhciByYWlzaW5nIFogRFRSXG4iKTsKKyNlbmRpZgorCX0KKworCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoICZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0lPQ1RMTSwgMEwpOworCWlmIChyZXR2YWwgIT0gMCl7CisJICAgIHByaW50aygiY3ljOnNldF9saW5lX2NoYXIoMikgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJfQorCisJaWYgKGluZm8tPnR0eSl7CisJICAgIGNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwl9CisgICAgfQorfSAvKiBzZXRfbGluZV9jaGFyICovCisKKworc3RhdGljIGludAorZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqIHJldGluZm8pCit7CisgIHN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKyAgc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvID0gJmN5X2NhcmRbaW5mby0+Y2FyZF07CisKKyAgICBpZiAoIXJldGluZm8pCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICBtZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworICAgIHRtcC50eXBlID0gaW5mby0+dHlwZTsKKyAgICB0bXAubGluZSA9IGluZm8tPmxpbmU7CisgICAgdG1wLnBvcnQgPSBpbmZvLT5jYXJkICogMHgxMDAgKyBpbmZvLT5saW5lIC0gY2luZm8tPmZpcnN0X2xpbmU7CisgICAgdG1wLmlycSA9IGNpbmZvLT5pcnE7CisgICAgdG1wLmZsYWdzID0gaW5mby0+ZmxhZ3M7CisgICAgdG1wLmNsb3NlX2RlbGF5ID0gaW5mby0+Y2xvc2VfZGVsYXk7CisgICAgdG1wLmJhdWRfYmFzZSA9IGluZm8tPmJhdWQ7CisgICAgdG1wLmN1c3RvbV9kaXZpc29yID0gaW5mby0+Y3VzdG9tX2Rpdmlzb3I7CisgICAgdG1wLmh1YjYgPSAwOyAgICAgICAgICAgICAgIC8qISEhKi8KKyAgICByZXR1cm4gY29weV90b191c2VyKHJldGluZm8sJnRtcCxzaXplb2YoKnJldGluZm8pKT8tRUZBVUxUOjA7Cit9IC8qIGdldF9zZXJpYWxfaW5mbyAqLworCisKK3N0YXRpYyBpbnQKK3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiBuZXdfaW5mbykKK3sKKyAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgb2xkX2luZm87CisKKyAgICBpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsbmV3X2luZm8sc2l6ZW9mKG5ld19zZXJpYWwpKSkKKwlyZXR1cm4gLUVGQVVMVDsKKyAgICBvbGRfaW5mbyA9ICppbmZvOworCisgICAgaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisgICAgICAgICAgICBpZiAoKG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgIT0gaW5mby0+Y2xvc2VfZGVsYXkpIHx8CisJCShuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkKSB8fAorCQkoKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KKwkJIChpbmZvLT5mbGFncyAmIEFTWU5DX0ZMQUdTICYgfkFTWU5DX1VTUl9NQVNLKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgICAgICBpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKKyAgICAgICAgICAgIGluZm8tPmJhdWQgPSBuZXdfc2VyaWFsLmJhdWRfYmFzZTsKKwkgICAgaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOworICAgICAgICAgICAgZ290byBjaGVja19hbmRfZXhpdDsKKyAgICB9CisKKworICAgIC8qCisgICAgICogT0ssIHBhc3QgdGhpcyBwb2ludCwgYWxsIHRoZSBlcnJvciBjaGVja2luZyBoYXMgYmVlbiBkb25lLgorICAgICAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0YXJ0IG1ha2luZyBjaGFuZ2VzLi4uLi4KKyAgICAgKi8KKworICAgIGluZm8tPmJhdWQgPSBuZXdfc2VyaWFsLmJhdWRfYmFzZTsKKyAgICBpbmZvLT5jdXN0b21fZGl2aXNvciA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7CisgICAgaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CisgICAgICAgICAgICAgICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKKyAgICBpbmZvLT5jbG9zZV9kZWxheSA9IG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgKiBIWi8xMDA7CisgICAgaW5mby0+Y2xvc2luZ193YWl0ID0gbmV3X3NlcmlhbC5jbG9zaW5nX3dhaXQgKiBIWi8xMDA7CisKK2NoZWNrX2FuZF9leGl0OgorICAgIGlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKXsKKyAgICAgICAgc2V0X2xpbmVfY2hhcihpbmZvKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfWVsc2V7CisgICAgICAgIHJldHVybiBzdGFydHVwKGluZm8pOworICAgIH0KK30gLyogc2V0X3NlcmlhbF9pbmZvICovCisKKy8qCisgKiBnZXRfbHNyX2luZm8gLSBnZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgaW5mbworICoKKyAqIFB1cnBvc2U6IExldCB1c2VyIGNhbGwgaW9jdGwoKSB0byBnZXQgaW5mbyB3aGVuIHRoZSBVQVJUIHBoeXNpY2FsbHkKKyAqCSAgICBpcyBlbXB0aWVkLiAgT24gYnVzIHR5cGVzIGxpa2UgUlM0ODUsIHRoZSB0cmFuc21pdHRlciBtdXN0CisgKgkgICAgcmVsZWFzZSB0aGUgYnVzIGFmdGVyIHRyYW5zbWl0dGluZy4gVGhpcyBtdXN0IGJlIGRvbmUgd2hlbgorICoJICAgIHRoZSB0cmFuc21pdCBzaGlmdCByZWdpc3RlciBpcyBlbXB0eSwgbm90IGJlIGRvbmUgd2hlbiB0aGUKKyAqCSAgICB0cmFuc21pdCBob2xkaW5nIHJlZ2lzdGVyIGlzIGVtcHR5LiAgVGhpcyBmdW5jdGlvbmFsaXR5CisgKgkgICAgYWxsb3dzIGFuIFJTNDg1IGRyaXZlciB0byBiZSB3cml0dGVuIGluIHVzZXIgc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2xzcl9pbmZvKHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKK3sKKyAgICBpbnQgY2FyZCwgY2hpcCwgY2hhbm5lbCwgaW5kZXg7CisgICAgdW5zaWduZWQgY2hhciBzdGF0dXM7CisgICAgdW5zaWduZWQgaW50IHJlc3VsdDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworCisgICAgY2FyZCA9IGluZm8tPmNhcmQ7CisgICAgY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOworICAgIGlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKKwljaGlwID0gY2hhbm5lbD4+MjsKKwljaGFubmVsICY9IDB4MDM7CisJaW5kZXggPSBjeV9jYXJkW2NhcmRdLmJ1c19pbmRleDsKKwliYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXTw8aW5kZXgpOworCisJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJc3RhdHVzID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSkgJiAoQ3lUeFJkeXxDeVR4TXB0eSk7CisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwlyZXN1bHQgPSAoc3RhdHVzID8gMCA6IFRJT0NTRVJfVEVNVCk7CisgICAgfSBlbHNlIHsKKwkvKiBOb3Qgc3VwcG9ydGVkIHlldCAqLworCXJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICByZXR1cm4gcHV0X3VzZXIocmVzdWx0LCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgdmFsdWUpOworfQorCitzdGF0aWMgaW50CitjeV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgaW50IGNhcmQsY2hpcCxjaGFubmVsLGluZGV4OworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgdW5zaWduZWQgY2hhciBzdGF0dXM7CisgIHVuc2lnbmVkIGxvbmcgbHN0YXR1czsKKyAgdW5zaWduZWQgaW50IHJlc3VsdDsKKyAgc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZDsKKyAgc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOworICBzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOworICBzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOworCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsIF9fRlVOQ1RJT05fXykpCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCWNoaXAgPSBjaGFubmVsPj4yOworCWNoYW5uZWwgJj0gMHgwMzsKKwlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKKwkgICAgc3RhdHVzID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1TVlIxPDxpbmRleCkpOworCSAgICBzdGF0dXMgfD0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCkpOworCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisKKyAgICAgICAgaWYgKGluZm8tPnJ0c2R0cl9pbnYpIHsKKwkgICAgcmVzdWx0ID0gICgoc3RhdHVzICAmIEN5UlRTKSA/IFRJT0NNX0RUUiA6IDApCisJCSAgICB8ICgoc3RhdHVzICAmIEN5RFRSKSA/IFRJT0NNX1JUUyA6IDApOworCX0gZWxzZSB7CisJICAgIHJlc3VsdCA9ICAoKHN0YXR1cyAgJiBDeVJUUykgPyBUSU9DTV9SVFMgOiAwKQorCQkgICAgfCAoKHN0YXR1cyAgJiBDeURUUikgPyBUSU9DTV9EVFIgOiAwKTsKKwl9CisJcmVzdWx0IHw9ICAoKHN0YXR1cyAgJiBDeURDRCkgPyBUSU9DTV9DQVIgOiAwKQorCQkgfCAoKHN0YXR1cyAgJiBDeVJJKSA/IFRJT0NNX1JORyA6IDApCisJCSB8ICgoc3RhdHVzICAmIEN5RFNSKSA/IFRJT0NNX0RTUiA6IDApCisJCSB8ICgoc3RhdHVzICAmIEN5Q1RTKSA/IFRJT0NNX0NUUyA6IDApOworICAgIH0gZWxzZSB7CisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHI7CisKKyAgICAgICAgaWYgKGN5X2NhcmRbY2FyZF0ubnVtX2NoaXBzICE9IC0xKXsKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmlybV9pZCA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgSURfQUREUkVTUzsKKyAgICAgICAgaWYgKElTWkxPQURFRChjeV9jYXJkW2NhcmRdKSkgeworCSAgICB6ZndfY3RybCA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X3JlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYgMHhmZmZmZik7CisJICAgIGJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisJICAgIGNoX2N0cmwgPSB6ZndfY3RybC0+Y2hfY3RybDsKKwkgICAgbHN0YXR1cyA9IGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX3N0YXR1cyk7CisJICAgIHJlc3VsdCA9ICAoKGxzdGF0dXMgICYgQ19SU19SVFMpID8gVElPQ01fUlRTIDogMCkKKwkJICAgIHwgKChsc3RhdHVzICAmIENfUlNfRFRSKSA/IFRJT0NNX0RUUiA6IDApCisJICAgICAgICAgICAgfCAoKGxzdGF0dXMgICYgQ19SU19EQ0QpID8gVElPQ01fQ0FSIDogMCkKKwkJICAgIHwgKChsc3RhdHVzICAmIENfUlNfUkkpID8gVElPQ01fUk5HIDogMCkKKwkJICAgIHwgKChsc3RhdHVzICAmIENfUlNfRFNSKSA/IFRJT0NNX0RTUiA6IDApCisJCSAgICB8ICgobHN0YXR1cyAgJiBDX1JTX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKKwl9ZWxzZXsKKwkgICAgcmVzdWx0ID0gMDsKKwkgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9IC8qIGN5X3Rpb21nZXQgKi8KKworCitzdGF0aWMgaW50CitjeV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgaW50IGNhcmQsY2hpcCxjaGFubmVsLGluZGV4OworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZDsKKyAgc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOworICBzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOworICBzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOworICBpbnQgcmV0dmFsOworCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsIF9fRlVOQ1RJT05fXykpCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCWNoaXAgPSBjaGFubmVsPj4yOworCWNoYW5uZWwgJj0gMHgwMzsKKwlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKXsKKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAodV9jaGFyKWNoYW5uZWwpOworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5ydHNkdHJfaW52KSB7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCksIEN5RFRSKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCBDeVJUUyk7CisgICAgICAgICAgICAgICAgfQorCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCX0KKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpIHsKKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgaWYgKGluZm8tPnJ0c2R0cl9pbnYpIHsKKwkJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSwgfkN5RFRSKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCB+Q3lSVFMpOworICAgICAgICAgICAgICAgIH0KKwkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwl9CisJaWYgKHNldCAmIFRJT0NNX0RUUil7CisJCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAodV9jaGFyKWNoYW5uZWwpOworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5ydHNkdHJfaW52KSB7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIxPDxpbmRleCksIEN5UlRTKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpLCBDeURUUik7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENZX0RFQlVHX0RUUgorCQlwcmludGsoImN5YzpzZXRfbW9kZW1faW5mbyByYWlzaW5nIERUUlxuIik7CisJCXByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsCisJCSAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSksIAorICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSkpOworI2VuZGlmCisJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJfQorCWlmIChjbGVhciAmIFRJT0NNX0RUUikgeworCQlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mby0+cnRzZHRyX2ludikgeworCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCB+Q3lSVFMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCksIH5DeURUUik7CisgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCXByaW50aygiY3ljOnNldF9tb2RlbV9pbmZvIGRyb3BwaW5nIERUUlxuIik7CisJCXByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsCisJCSAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSksIAorICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSkpOworI2VuZGlmCisJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJfQorICAgIH0gZWxzZSB7CisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHI7CisKKwlmaXJtX2lkID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOworICAgICAgICBpZiAoSVNaTE9BREVEKGN5X2NhcmRbY2FyZF0pKSB7CisJICAgIHpmd19jdHJsID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKKwkgICAgYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKKwkgICAgY2hfY3RybCA9IHpmd19jdHJsLT5jaF9jdHJsOworCisJICAgIGlmIChzZXQgJiBUSU9DTV9SVFMpeworCQkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCSAgICBjeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCkgfCBDX1JTX1JUUyk7CisJCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCSAgICB9CisJICAgIGlmIChjbGVhciAmIFRJT0NNX1JUUykgeworCQkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCSAgICBjeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCkgJiB+Q19SU19SVFMpOworCQkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwkgICAgfQorCSAgICBpZiAoc2V0ICYgVElPQ01fRFRSKXsKKwkJICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworCQkgICAgY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wpIHwgQ19SU19EVFIpOworI2lmZGVmIENZX0RFQlVHX0RUUgorCQkgICAgcHJpbnRrKCJjeWM6c2V0X21vZGVtX2luZm8gcmFpc2luZyBaIERUUlxuIik7CisjZW5kaWYKKwkJICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIH0KKwkgICAgaWYgKGNsZWFyICYgVElPQ01fRFRSKSB7CisJCSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJICAgIGN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICBjeV9yZWFkbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sKSAmIH5DX1JTX0RUUik7CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCSAgICBwcmludGsoImN5YzpzZXRfbW9kZW1faW5mbyBjbGVhcmluZyBaIERUUlxuIik7CisjZW5kaWYKKwkJICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIH0KKwl9ZWxzZXsKKwkgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgICAgICByZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2luZm8tPmNhcmRdLAorCQkJCSAgICBjaGFubmVsLCBDX0NNX0lPQ1RMTSwwTCk7CisJaWYgKHJldHZhbCAhPSAwKXsKKwkgICAgcHJpbnRrKCJjeWM6c2V0X21vZGVtX2luZm8gcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJfQorCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBjeV90aW9jbXNldCAqLworCisvKgorICogY3lfYnJlYWsoKSAtLS0gcm91dGluZSB3aGljaCB0dXJucyB0aGUgYnJlYWsgaGFuZGxpbmcgb24gb3Igb2ZmCisgKi8KK3N0YXRpYyB2b2lkCitjeV9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCit7CisgICAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9icmVhayIpKQorCXJldHVybjsKKworICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgIGlmICghSVNfQ1lDX1ooY3lfY2FyZFtpbmZvLT5jYXJkXSkpIHsKKyAgICAgICAgLyogTGV0IHRoZSB0cmFuc21pdCBJU1IgdGFrZSBjYXJlIG9mIHRoaXMgKHNpbmNlIGl0CisJICAgcmVxdWlyZXMgc3R1ZmZpbmcgY2hhcmFjdGVycyBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtKS4KKyAgICAgICAgKi8KKwlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpIHsKKwkgICAgaWYgKCFpbmZvLT5icmVha29uKSB7CisJCWluZm8tPmJyZWFrb24gPSAxOworCQlpZiAoIWluZm8tPnhtaXRfY250KSB7CisJCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQkgICAgc3RhcnRfeG1pdChpbmZvKTsKKwkJICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiAoIWluZm8tPmJyZWFrb2ZmKSB7CisJCWluZm8tPmJyZWFrb2ZmID0gMTsKKwkJaWYgKCFpbmZvLT54bWl0X2NudCkgeworCQkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwkJICAgIHN0YXJ0X3htaXQoaW5mbyk7CisJCSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0gZWxzZSB7CisJaW50IHJldHZhbDsKKworCWlmIChicmVha19zdGF0ZSA9PSAtMSkgeworCSAgICByZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2luZm8tPmNhcmRdLAorCQkoaW5mby0+bGluZSkgLSAoY3lfY2FyZFtpbmZvLT5jYXJkXS5maXJzdF9saW5lKSwKKwkJQ19DTV9TRVRfQlJFQUssIDBMKTsKKwkgICAgaWYgKHJldHZhbCAhPSAwKSB7CisJCXByaW50aygiY3ljOmN5X2JyZWFrIChzZXQpIHJldHZhbCBvbiB0dHlDJWQgd2FzICV4XG4iLAorCQkgICAgICAgaW5mby0+bGluZSwgcmV0dmFsKTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbaW5mby0+Y2FyZF0sCisJCShpbmZvLT5saW5lKSAtIChjeV9jYXJkW2luZm8tPmNhcmRdLmZpcnN0X2xpbmUpLAorCQlDX0NNX0NMUl9CUkVBSywgMEwpOworCSAgICBpZiAocmV0dmFsICE9IDApIHsKKwkJcHJpbnRrKCJjeWM6Y3lfYnJlYWsgKGNscikgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCSAgICAgICBpbmZvLT5saW5lLCByZXR2YWwpOworCSAgICB9CisJfQorICAgIH0KKyAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworfSAvKiBjeV9icmVhayAqLworCitzdGF0aWMgaW50CitnZXRfbW9uX2luZm8oc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCBzdHJ1Y3QgY3ljbGFkZXNfbW9uaXRvciBfX3VzZXIgKiBtb24pCit7CisKKyAgICBpZihjb3B5X3RvX3VzZXIobW9uLCAmaW5mby0+bW9uLCBzaXplb2Yoc3RydWN0IGN5Y2xhZGVzX21vbml0b3IpKSkKKyAgICAJcmV0dXJuIC1FRkFVTFQ7CisgICAgaW5mby0+bW9uLmludF9jb3VudCAgPSAwOworICAgIGluZm8tPm1vbi5jaGFyX2NvdW50ID0gMDsKKyAgICBpbmZvLT5tb24uY2hhcl9tYXggICA9IDA7CisgICAgaW5mby0+bW9uLmNoYXJfbGFzdCAgPSAwOworICAgIHJldHVybiAwOworfS8qIGdldF9tb25faW5mbyAqLworCisKK3N0YXRpYyBpbnQKK3NldF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgaW50IGNhcmQsY2hhbm5lbCxjaGlwLGluZGV4OworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgCisgICAgY2FyZCA9IGluZm8tPmNhcmQ7CisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmU7CisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCWNoaXAgPSBjaGFubmVsPj4yOworCWNoYW5uZWwgJj0gMHgwMzsKKwlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwlpbmZvLT5jb3IzICY9IH5DeVJFQ19GSUZPOworCWluZm8tPmNvcjMgfD0gdmFsdWUgJiBDeVJFQ19GSUZPOworCisJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q09SMzw8aW5kZXgpLCBpbmZvLT5jb3IzKTsKKwkgICAgY3l5X2lzc3VlX2NtZChiYXNlX2FkZHIsQ3lDT1JfQ0hBTkdFfEN5Q09SM2NoLGluZGV4KTsKKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgIH0gZWxzZSB7CisJLy8gTm90aGluZyB0byBkbyEKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9Lyogc2V0X3RocmVzaG9sZCAqLworCisKK3N0YXRpYyBpbnQKK2dldF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqdmFsdWUpCit7CisgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworICBpbnQgY2FyZCxjaGFubmVsLGNoaXAsaW5kZXg7CisgIHVuc2lnbmVkIGxvbmcgdG1wOworICAgCisgICAgY2FyZCA9IGluZm8tPmNhcmQ7CisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmU7CisgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCWNoaXAgPSBjaGFubmVsPj4yOworCWNoYW5uZWwgJj0gMHgwMzsKKwlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwl0bXAgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5Q09SMzw8aW5kZXgpKSAmIEN5UkVDX0ZJRk87CisJcmV0dXJuIHB1dF91c2VyKHRtcCx2YWx1ZSk7CisgICAgfSBlbHNlIHsKKwkvLyBOb3RoaW5nIHRvIGRvIQorCXJldHVybiAwOworICAgIH0KK30vKiBnZXRfdGhyZXNob2xkICovCisKKworc3RhdGljIGludAorc2V0X2RlZmF1bHRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKyAgICBpbmZvLT5kZWZhdWx0X3RocmVzaG9sZCA9IHZhbHVlICYgMHgwZjsKKyAgICByZXR1cm4gMDsKK30vKiBzZXRfZGVmYXVsdF90aHJlc2hvbGQgKi8KKworCitzdGF0aWMgaW50CitnZXRfZGVmYXVsdF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqdmFsdWUpCit7CisgICAgcmV0dXJuIHB1dF91c2VyKGluZm8tPmRlZmF1bHRfdGhyZXNob2xkLHZhbHVlKTsKK30vKiBnZXRfZGVmYXVsdF90aHJlc2hvbGQgKi8KKworCitzdGF0aWMgaW50CitzZXRfdGltZW91dChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworICBpbnQgY2FyZCxjaGFubmVsLGNoaXAsaW5kZXg7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZTsKKyAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJY2hpcCA9IGNoYW5uZWw+PjI7CisJY2hhbm5lbCAmPSAweDAzOworCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKKworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVJUUFI8PGluZGV4KSwgdmFsdWUgJiAweGZmKTsKKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgIH0gZWxzZSB7CisJLy8gTm90aGluZyB0byBkbyEKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9Lyogc2V0X3RpbWVvdXQgKi8KKworCitzdGF0aWMgaW50CitnZXRfdGltZW91dChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgX191c2VyICp2YWx1ZSkKK3sKKyAgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisgIGludCBjYXJkLGNoYW5uZWwsY2hpcCxpbmRleDsKKyAgdW5zaWduZWQgbG9uZyB0bXA7CisgICAKKyAgICBjYXJkID0gaW5mby0+Y2FyZDsKKyAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZTsKKyAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJY2hpcCA9IGNoYW5uZWw+PjI7CisJY2hhbm5lbCAmPSAweDAzOworCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKKworCXRtcCA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSVFBSPDxpbmRleCkpOworCXJldHVybiBwdXRfdXNlcih0bXAsdmFsdWUpOworICAgIH0gZWxzZSB7CisJLy8gTm90aGluZyB0byBkbyEKKwlyZXR1cm4gMDsKKyAgICB9Cit9LyogZ2V0X3RpbWVvdXQgKi8KKworCitzdGF0aWMgaW50CitzZXRfZGVmYXVsdF90aW1lb3V0KHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKyAgICBpbmZvLT5kZWZhdWx0X3RpbWVvdXQgPSB2YWx1ZSAmIDB4ZmY7CisgICAgcmV0dXJuIDA7Cit9Lyogc2V0X2RlZmF1bHRfdGltZW91dCAqLworCisKK3N0YXRpYyBpbnQKK2dldF9kZWZhdWx0X3RpbWVvdXQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqdmFsdWUpCit7CisgICAgcmV0dXJuIHB1dF91c2VyKGluZm8tPmRlZmF1bHRfdGltZW91dCx2YWx1ZSk7Cit9LyogZ2V0X2RlZmF1bHRfdGltZW91dCAqLworCisvKgorICogVGhpcyByb3V0aW5lIGFsbG93cyB0aGUgdHR5IGRyaXZlciB0byBpbXBsZW1lbnQgZGV2aWNlLQorICogc3BlY2lmaWMgaW9jdGwncy4gIElmIHRoZSBpb2N0bCBudW1iZXIgcGFzc2VkIGluIGNtZCBpcworICogbm90IHJlY29nbml6ZWQgYnkgdGhlIGRyaXZlciwgaXQgc2hvdWxkIHJldHVybiBFTk9JT0NUTENNRC4KKyAqLworc3RhdGljIGludAorY3lfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIHN0cnVjdCBjeWNsYWRlc19pY291bnQgY3ByZXYsIGNub3c7CQkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLworICBzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBfX3VzZXIgKnBfY3VzZXI7CS8qIHVzZXIgc3BhY2UgKi8KKyAgaW50IHJldF92YWwgPSAwOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICB2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfaW9jdGwiKSkKKwlyZXR1cm4gLUVOT0RFVjsKKworI2lmZGVmIENZX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeWM6Y3lfaW9jdGwgdHR5QyVkLCBjbWQgPSAleCBhcmcgPSAlbHhcbiIsCisgICAgICAgIGluZm8tPmxpbmUsIGNtZCwgYXJnKTsgLyogKi8KKyNlbmRpZgorCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBDWUdFVE1PTjoKKyAgICAgICAgICAgIHJldF92YWwgPSBnZXRfbW9uX2luZm8oaW5mbywgYXJncCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDWUdFVFRIUkVTSDoKKyAgICAgICAgICAgIHJldF92YWwgPSBnZXRfdGhyZXNob2xkKGluZm8sIGFyZ3ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lTRVRUSFJFU0g6CisgICAgICAgICAgICByZXRfdmFsID0gc2V0X3RocmVzaG9sZChpbmZvLCBhcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lHRVRERUZUSFJFU0g6CisgICAgICAgICAgICByZXRfdmFsID0gZ2V0X2RlZmF1bHRfdGhyZXNob2xkKGluZm8sIGFyZ3ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lTRVRERUZUSFJFU0g6CisgICAgICAgICAgICByZXRfdmFsID0gc2V0X2RlZmF1bHRfdGhyZXNob2xkKGluZm8sIGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDWUdFVFRJTUVPVVQ6CisgICAgICAgICAgICByZXRfdmFsID0gZ2V0X3RpbWVvdXQoaW5mbywgYXJncCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDWVNFVFRJTUVPVVQ6CisgICAgICAgICAgICByZXRfdmFsID0gc2V0X3RpbWVvdXQoaW5mbywgYXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENZR0VUREVGVElNRU9VVDoKKyAgICAgICAgICAgIHJldF92YWwgPSBnZXRfZGVmYXVsdF90aW1lb3V0KGluZm8sIGFyZ3ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lTRVRERUZUSU1FT1VUOgorICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF9kZWZhdWx0X3RpbWVvdXQoaW5mbywgYXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgQ1lTRVRSRkxPVzoKKyAgICAJICAgIGluZm8tPnJmbG93ID0gKGludClhcmc7CisJICAgIHJldF92YWwgPSAwOworCSAgICBicmVhazsKKwljYXNlIENZR0VUUkZMT1c6CisJICAgIHJldF92YWwgPSBpbmZvLT5yZmxvdzsKKwkgICAgYnJlYWs7CisJY2FzZSBDWVNFVFJUU0RUUl9JTlY6CisgICAgCSAgICBpbmZvLT5ydHNkdHJfaW52ID0gKGludClhcmc7CisJICAgIHJldF92YWwgPSAwOworCSAgICBicmVhazsKKwljYXNlIENZR0VUUlRTRFRSX0lOVjoKKwkgICAgcmV0X3ZhbCA9IGluZm8tPnJ0c2R0cl9pbnY7CisJICAgIGJyZWFrOworCWNhc2UgQ1lHRVRDQVJESU5GTzoKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmN5X2NhcmRbaW5mby0+Y2FyZF0sIAorCQkJc2l6ZW9mIChzdHJ1Y3QgY3ljbGFkZXNfY2FyZCkpKSB7CisJCXJldF92YWwgPSAtRUZBVUxUOworCQlicmVhazsKKwkgICAgfQorCSAgICByZXRfdmFsID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgQ1lHRVRDRDE0MDBWRVI6CisJICAgIHJldF92YWwgPSBpbmZvLT5jaGlwX3JldjsKKwkgICAgYnJlYWs7CisjaWZuZGVmIENPTkZJR19DWVpfSU5UUgorCWNhc2UgQ1laU0VUUE9MTENZQ0xFOgorICAgICAgICAgICAgY3l6X3BvbGxpbmdfY3ljbGUgPSAoYXJnICogSFopIC8gMTAwMDsKKwkgICAgcmV0X3ZhbCA9IDA7CisJICAgIGJyZWFrOworCWNhc2UgQ1laR0VUUE9MTENZQ0xFOgorICAgICAgICAgICAgcmV0X3ZhbCA9IChjeXpfcG9sbGluZ19jeWNsZSAqIDEwMDApIC8gSFo7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLworCWNhc2UgQ1lTRVRXQUlUOgorICAgIAkgICAgaW5mby0+Y2xvc2luZ193YWl0ID0gKHVuc2lnbmVkIHNob3J0KWFyZyAqIEhaLzEwMDsKKwkgICAgcmV0X3ZhbCA9IDA7CisJICAgIGJyZWFrOworCWNhc2UgQ1lHRVRXQUlUOgorCSAgICByZXRfdmFsID0gaW5mby0+Y2xvc2luZ193YWl0IC8gKEhaLzEwMCk7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIFRJT0NHU0VSSUFMOgorICAgICAgICAgICAgcmV0X3ZhbCA9IGdldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRJT0NTU0VSSUFMOgorICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgVElPQ1NFUkdFVExTUjogLyogR2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCisJICAgIHJldF92YWwgPSBnZXRfbHNyX2luZm8oaW5mbywgYXJncCk7CisJICAgIGJyZWFrOworCS8qCisJICogV2FpdCBmb3IgYW55IG9mIHRoZSA0IG1vZGVtIGlucHV0cyAoRENELFJJLERTUixDVFMpIHRvIGNoYW5nZSAKKwkgKiAtIG1hc2sgcGFzc2VkIGluIGFyZyBmb3IgbGluZXMgb2YgaW50ZXJlc3QKKwkgKiAgICh1c2UgfCdlZCBUSU9DTV9STkcvRFNSL0NEL0NUUyBmb3IgbWFza2luZykKKwkgKiBDYWxsZXIgc2hvdWxkIHVzZSBUSU9DR0lDT1VOVCB0byBzZWUgd2hpY2ggb25lIGl0IHdhcworCSAqLworCWNhc2UgVElPQ01JV0FJVDoKKwkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIC8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCisJICAgIGNwcmV2ID0gaW5mby0+aWNvdW50OworCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCSAgICB3aGlsZSAoMSkgeworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJCS8qIHNlZSBpZiBhIHNpZ25hbCBkaWQgaXQgKi8KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCSAgICByZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisKKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCWNub3cgPSBpbmZvLT5pY291bnQ7IC8qIGF0b21pYyBjb3B5ICovCisJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisKKwkJaWYgKGNub3cucm5nID09IGNwcmV2LnJuZyAmJiBjbm93LmRzciA9PSBjcHJldi5kc3IgJiYgCisJCSAgICBjbm93LmRjZCA9PSBjcHJldi5kY2QgJiYgY25vdy5jdHMgPT0gY3ByZXYuY3RzKSB7CisJCSAgICByZXR1cm4gLUVJTzsgLyogbm8gY2hhbmdlID0+IGVycm9yICovCisJCX0KKwkJaWYgKCAoKGFyZyAmIFRJT0NNX1JORykgJiYgKGNub3cucm5nICE9IGNwcmV2LnJuZykpIHx8IAorCQkgICAgICgoYXJnICYgVElPQ01fRFNSKSAmJiAoY25vdy5kc3IgIT0gY3ByZXYuZHNyKSkgfHwgCisJCSAgICAgKChhcmcgJiBUSU9DTV9DRCkgICYmIChjbm93LmRjZCAhPSBjcHJldi5kY2QpKSB8fCAKKwkJICAgICAoKGFyZyAmIFRJT0NNX0NUUykgJiYgKGNub3cuY3RzICE9IGNwcmV2LmN0cykpICkgeworCQkgICAgcmV0dXJuIDA7CisJCX0KKwkJY3ByZXYgPSBjbm93OworCSAgICB9CisJICAgIC8qIE5PVFJFQUNIRUQgKi8KKworCS8qCisJICogR2V0IGNvdW50ZXIgb2YgaW5wdXQgc2VyaWFsIGxpbmUgaW50ZXJydXB0cyAoRENELFJJLERTUixDVFMpCisJICogUmV0dXJuOiB3cml0ZSBjb3VudGVycyB0byB0aGUgdXNlciBwYXNzZWQgY291bnRlciBzdHJ1Y3QKKwkgKiBOQjogYm90aCAxLT4wIGFuZCAwLT4xIHRyYW5zaXRpb25zIGFyZSBjb3VudGVkIGV4Y2VwdCBmb3IKKwkgKiAgICAgUkkgd2hlcmUgb25seSAwLT4xIGlzIGNvdW50ZWQuCisJICovCisJY2FzZSBUSU9DR0lDT1VOVDoKKwkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIGNub3cgPSBpbmZvLT5pY291bnQ7CisJICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIHBfY3VzZXIgPSBhcmdwOworCSAgICByZXRfdmFsID0gcHV0X3VzZXIoY25vdy5jdHMsICZwX2N1c2VyLT5jdHMpOworCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7CisJICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93LmRzciwgJnBfY3VzZXItPmRzcik7CisJICAgIGlmIChyZXRfdmFsKSByZXR1cm4gcmV0X3ZhbDsKKwkgICAgcmV0X3ZhbCA9IHB1dF91c2VyKGNub3cucm5nLCAmcF9jdXNlci0+cm5nKTsKKwkgICAgaWYgKHJldF92YWwpIHJldHVybiByZXRfdmFsOworCSAgICByZXRfdmFsID0gcHV0X3VzZXIoY25vdy5kY2QsICZwX2N1c2VyLT5kY2QpOworCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7CisJICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93LnJ4LCAmcF9jdXNlci0+cngpOworCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7CisJICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93LnR4LCAmcF9jdXNlci0+dHgpOworCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7CisJICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93LmZyYW1lLCAmcF9jdXNlci0+ZnJhbWUpOworCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7CisJICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93Lm92ZXJydW4sICZwX2N1c2VyLT5vdmVycnVuKTsKKwkgICAgaWYgKHJldF92YWwpIHJldHVybiByZXRfdmFsOworCSAgICByZXRfdmFsID0gcHV0X3VzZXIoY25vdy5wYXJpdHksICZwX2N1c2VyLT5wYXJpdHkpOworCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7CisJICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93LmJyaywgJnBfY3VzZXItPmJyayk7CisJICAgIGlmIChyZXRfdmFsKSByZXR1cm4gcmV0X3ZhbDsKKwkgICAgcmV0X3ZhbCA9IHB1dF91c2VyKGNub3cuYnVmX292ZXJydW4sICZwX2N1c2VyLT5idWZfb3ZlcnJ1bik7CisJICAgIGlmIChyZXRfdmFsKSByZXR1cm4gcmV0X3ZhbDsKKwkgICAgcmV0X3ZhbCA9IDA7CisJICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0X3ZhbCA9IC1FTk9JT0NUTENNRDsKKyAgICB9CisKKyNpZmRlZiBDWV9ERUJVR19PVEhFUgorICAgIHByaW50aygiIGN5YzpjeV9pb2N0bCBkb25lXG4iKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJldF92YWw7Cit9IC8qIGN5X2lvY3RsICovCisKKworLyoKKyAqIFRoaXMgcm91dGluZSBhbGxvd3MgdGhlIHR0eSBkcml2ZXIgdG8gYmUgbm90aWZpZWQgd2hlbgorICogZGV2aWNlJ3MgdGVybWlvcyBzZXR0aW5ncyBoYXZlIGNoYW5nZWQuICBOb3RlIHRoYXQgYQorICogd2VsbC1kZXNpZ25lZCB0dHkgZHJpdmVyIHNob3VsZCBiZSBwcmVwYXJlZCB0byBhY2NlcHQgdGhlIGNhc2UKKyAqIHdoZXJlIG9sZCA9PSBOVUxMLCBhbmQgdHJ5IHRvIGRvIHNvbWV0aGluZyByYXRpb25hbC4KKyAqLworc3RhdGljIHZvaWQKK2N5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICogb2xkX3Rlcm1pb3MpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKworI2lmZGVmIENZX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeWM6Y3lfc2V0X3Rlcm1pb3MgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsKKyNlbmRpZgorCisgICAgaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpICYmCisJKCh0dHktPnRlcm1pb3MtPmNfaWZsYWcgJiAoSVhPTnxJWEFOWSkpID09IAorCSAob2xkX3Rlcm1pb3MtPmNfaWZsYWcgJiAoSVhPTnxJWEFOWSkpKSkKKyAgICAgICAgcmV0dXJuOworICAgIHNldF9saW5lX2NoYXIoaW5mbyk7CisKKyAgICBpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKKyAgICAgICAgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworICAgICAgICAgICAgdHR5LT5od19zdG9wcGVkID0gMDsKKyAgICAgICAgICAgIGN5X3N0YXJ0KHR0eSk7CisgICAgfQorI2lmIDAKKyAgICAvKgorICAgICAqIE5vIG5lZWQgdG8gd2FrZSB1cCBwcm9jZXNzZXMgaW4gb3BlbiB3YWl0LCBzaW5jZSB0aGV5CisgICAgICogc2FtcGxlIHRoZSBDTE9DQUwgZmxhZyBvbmNlLCBhbmQgZG9uJ3QgcmVjaGVjayBpdC4KKyAgICAgKiBYWFggIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgdGhlIGN1cnJlbnQgYmVoYXZpb3IgaXMgY29ycmVjdAorICAgICAqIG9yIG5vdC4gIEhlbmNlLCB0aGlzIG1heSBjaGFuZ2UuLi4uLgorICAgICAqLworICAgIGlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAmJgorICAgICAgICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSkKKyAgICAgICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKyNlbmRpZgorCisgICAgcmV0dXJuOworfSAvKiBjeV9zZXRfdGVybWlvcyAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGhpZ2gtcHJpb3JpdHkgWE9OL1hPRkYgY2hhcmFjdGVyIHRvCisgICB0aGUgZGV2aWNlLgorKi8KK3N0YXRpYyB2b2lkCitjeV9zZW5kX3hjaGFyIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKQoreworCXN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IGNhcmQsIGNoYW5uZWw7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrIChpbmZvLCB0dHktPm5hbWUsICJjeV9zZW5kX3hjaGFyIikpCisJCXJldHVybjsKKworICAJaW5mby0+eF9jaGFyID0gY2g7CisKKwlpZiAoY2gpCisJCWN5X3N0YXJ0ICh0dHkpOworCisJY2FyZCA9IGluZm8tPmNhcmQ7CisJY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmU7CisKKwlpZiAoSVNfQ1lDX1ogKGN5X2NhcmRbY2FyZF0pKSB7CisJCWlmIChjaCA9PSBTVE9QX0NIQVIgKHR0eSkpCisJICAJCWN5el9pc3N1ZV9jbWQgKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX1NFTkRYT0ZGLCAwTCk7CisJCWVsc2UgaWYgKGNoID09IFNUQVJUX0NIQVIgKHR0eSkpCisJCQljeXpfaXNzdWVfY21kICgmY3lfY2FyZFtjYXJkXSwgY2hhbm5lbCwgQ19DTV9TRU5EWE9OLCAwTCk7CisJfQorfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSB1cHBlci1sYXllciB0dHkgbGF5ZXIgdG8gc2lnbmFsCisgICB0aGF0IGluY29taW5nIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHRocm90dGxlZCBiZWNhdXNlIHRoZSBpbnB1dAorICAgYnVmZmVycyBhcmUgY2xvc2UgdG8gZnVsbC4KKyAqLworc3RhdGljIHZvaWQKK2N5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworICBpbnQgY2FyZCxjaGlwLGNoYW5uZWwsaW5kZXg7CisKKyNpZmRlZiBDWV9ERUJVR19USFJPVFRMRQorICBjaGFyIGJ1Zls2NF07CisKKyAgICBwcmludGsoImN5Yzp0aHJvdHRsZSAlczogJWQuLi4udHR5QyVkXG4iLCAKKwkgICB0dHlfbmFtZSh0dHksIGJ1ZiksCisgICAgICAgICAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSksIGluZm8tPmxpbmUpOworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3Rocm90dGxlIikpeworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNhcmQgPSBpbmZvLT5jYXJkOworCisgICAgaWYgKElfSVhPRkYodHR5KSkgeworICAgICAgICBpZiAoIUlTX0NZQ19aIChjeV9jYXJkW2NhcmRdKSkKKyAgICAgICAgICAgIGN5X3NlbmRfeGNoYXIgKHR0eSwgU1RPUF9DSEFSICh0dHkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5mby0+dGhyb3R0bGUgPSAxOworICAgIH0KKworICAgIGlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisgICAgICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lOworICAgICAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisgICAgICAgICAgICBjaGlwID0gY2hhbm5lbD4+MjsKKyAgICAgICAgICAgIGNoYW5uZWwgJj0gMHgwMzsKKyAgICAgICAgICAgIGluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisgICAgICAgICAgICBiYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXTw8aW5kZXgpOworCisgICAgICAgICAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKKyAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7CisgICAgICAgICAgICBpZiAoaW5mby0+cnRzZHRyX2ludikgeworICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSwgfkN5RFRSKTsKKyAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSwgfkN5UlRTKTsKKwkgICAgIH0KKwkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwl9IGVsc2UgeworCSAgICBpbmZvLT50aHJvdHRsZSA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9IC8qIGN5X3Rocm90dGxlICovCisKKworLyoKKyAqIFRoaXMgcm91dGluZSBub3RpZmllcyB0aGUgdHR5IGRyaXZlciB0aGF0IGl0IHNob3VsZCBzaWduYWwKKyAqIHRoYXQgY2hhcmFjdGVycyBjYW4gbm93IGJlIHNlbnQgdG8gdGhlIHR0eSB3aXRob3V0IGZlYXIgb2YKKyAqIG92ZXJydW5uaW5nIHRoZSBpbnB1dCBidWZmZXJzIG9mIHRoZSBsaW5lIGRpc2NpcGxpbmVzLgorICovCitzdGF0aWMgdm9pZAorY3lfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgaW50IGNhcmQsY2hpcCxjaGFubmVsLGluZGV4OworCisjaWZkZWYgQ1lfREVCVUdfVEhST1RUTEUKKyAgY2hhciBidWZbNjRdOworICAgICAgICAKKyAgICBwcmludGsoImN5Yzp1bnRocm90dGxlICVzOiAlZC4uLi50dHlDJWRcbiIsIAorCSAgIHR0eV9uYW1lKHR0eSwgYnVmKSwKKyAgICAgICAgICAgdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSwgaW5mby0+bGluZSk7CisjZW5kaWYKKworICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfdW50aHJvdHRsZSIpKXsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoSV9JWE9GRih0dHkpKSB7CisJaWYgKGluZm8tPnhfY2hhcikKKwkgICAgaW5mby0+eF9jaGFyID0gMDsKKwllbHNlCisJICAgIGN5X3NlbmRfeGNoYXIgKHR0eSwgU1RBUlRfQ0hBUiAodHR5KSk7CisgICAgfQorCisgICAgaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKyAgICAgICAgY2FyZCA9IGluZm8tPmNhcmQ7CisgICAgICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lOworICAgICAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJICAgIGNoaXAgPSBjaGFubmVsPj4yOworCSAgICBjaGFubmVsICY9IDB4MDM7CisJICAgIGluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisJICAgIGJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisKKwkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7CisJICAgIGlmIChpbmZvLT5ydHNkdHJfaW52KSB7CisJCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCksIEN5RFRSKTsKKwkgICAgfSBlbHNlIHsKKwkJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSwgQ3lSVFMpOworCSAgICB9CisJICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgICAgIH0gZWxzZSB7CisJICAgIGluZm8tPnRocm90dGxlID0gMDsKKwl9CisgICAgfQorCisgICAgcmV0dXJuOworfSAvKiBjeV91bnRocm90dGxlICovCisKKworLyogY3lfc3RhcnQgYW5kIGN5X3N0b3AgcHJvdmlkZSBzb2Z0d2FyZSBvdXRwdXQgZmxvdyBjb250cm9sIGFzIGEKKyAgIGZ1bmN0aW9uIG9mIFhPTi9YT0ZGLCBzb2Z0d2FyZSBDVFMsIGFuZCBvdGhlciBzdWNoIHN0dWZmLgorKi8KK3N0YXRpYyB2b2lkCitjeV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbzsKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKyAgaW50IGNoaXAsY2hhbm5lbCxpbmRleDsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIENZX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeWM6Y3lfc3RvcCB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOyAvKiAqLworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3N0b3AiKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICBjaW5mbyA9ICZjeV9jYXJkW2luZm8tPmNhcmRdOworICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY2luZm8tPmZpcnN0X2xpbmU7CisgICAgaWYgKCFJU19DWUNfWigqY2luZm8pKSB7CisgICAgICAgIGluZGV4ID0gY2luZm8tPmJ1c19pbmRleDsKKyAgICAgICAgY2hpcCA9IGNoYW5uZWw+PjI7CisgICAgICAgIGNoYW5uZWwgJj0gMHgwMzsKKyAgICAgICAgYmFzZV9hZGRyID0gY3lfY2FyZFtpbmZvLT5jYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKKworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwKKwkgICAgICAgKHVfY2hhcikoY2hhbm5lbCAmIDB4MDAwMykpOyAvKiBpbmRleCBjaGFubmVsICovCisgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwgCisgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSAmIH5DeVR4UmR5KTsKKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworICAgIH0gZWxzZSB7CisJLy8gTm90aGluZyB0byBkbyEKKyAgICB9CisKKyAgICByZXR1cm47Cit9IC8qIGN5X3N0b3AgKi8KKworCitzdGF0aWMgdm9pZAorY3lfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvOworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworICBpbnQgY2hpcCxjaGFubmVsLGluZGV4OworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgQ1lfREVCVUdfT1RIRVIKKyAgICBwcmludGsoImN5YzpjeV9zdGFydCB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOyAvKiAqLworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3N0YXJ0IikpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgY2luZm8gPSAmY3lfY2FyZFtpbmZvLT5jYXJkXTsKKyAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGNpbmZvLT5maXJzdF9saW5lOworICAgIGluZGV4ID0gY2luZm8tPmJ1c19pbmRleDsKKyAgICBpZiAoIUlTX0NZQ19aKCpjaW5mbykpIHsKKyAgICAgICAgY2hpcCA9IGNoYW5uZWw+PjI7CisgICAgICAgIGNoYW5uZWwgJj0gMHgwMzsKKyAgICAgICAgYmFzZV9hZGRyID0gY3lfY2FyZFtpbmZvLT5jYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKKworCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwKKwkgICAgICAgKHVfY2hhcikoY2hhbm5lbCAmIDB4MDAwMykpOyAvKiBpbmRleCBjaGFubmVsICovCisgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwgCisgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSB8IEN5VHhSZHkpOworCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgfSBlbHNlIHsKKwkvLyBOb3RoaW5nIHRvIGRvIQorICAgIH0KKworICAgIHJldHVybjsKK30gLyogY3lfc3RhcnQgKi8KKworCitzdGF0aWMgdm9pZAorY3lfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgaW50IGNhcmQsIGNoYW5uZWwsIHJldHZhbDsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjaWZkZWYgQ1lfREVCVUdfSU8KKyAgICBwcmludGsoImN5YzpjeV9mbHVzaF9idWZmZXIgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsgLyogKi8KKyNlbmRpZgorCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9mbHVzaF9idWZmZXIiKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2FyZCA9IGluZm8tPmNhcmQ7CisgICAgY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOworCisgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisgICAgaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOworICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisKKyAgICBpZiAoSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsgLyogSWYgaXQgaXMgYSBaIGNhcmQsIGZsdXNoIHRoZSBvbi1ib2FyZCAKKwkJCQkgICAgICBidWZmZXJzIGFzIHdlbGwgKi8KKwlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwlyZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0ZMVVNIX1RYLCAwTCk7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJICAgIHByaW50aygiY3ljOiBmbHVzaF9idWZmZXIgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJfQorCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisgICAgfQorICAgIHR0eV93YWtldXAodHR5KTsKKyAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7Cit9IC8qIGN5X2ZsdXNoX2J1ZmZlciAqLworCisKKy8qCisgKiBjeV9oYW5ndXAoKSAtLS0gY2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgorICovCitzdGF0aWMgdm9pZAorY3lfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgICAgICAgIAorI2lmZGVmIENZX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeWM6Y3lfaGFuZ3VwIHR0eUMlZFxuIiwgaW5mby0+bGluZSk7IC8qICovCisjZW5kaWYKKworICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfaGFuZ3VwIikpCisgICAgICAgIHJldHVybjsKKworICAgIGN5X2ZsdXNoX2J1ZmZlcih0dHkpOworICAgIHNodXRkb3duKGluZm8pOworICAgIGluZm8tPmV2ZW50ID0gMDsKKyAgICBpbmZvLT5jb3VudCA9IDA7CisjaWZkZWYgQ1lfREVCVUdfQ09VTlQKKyAgICBwcmludGsoImN5YzpjeV9oYW5ndXAgKCVkKTogc2V0dGluZyBjb3VudCB0byAwXG4iLCBjdXJyZW50LT5waWQpOworI2VuZGlmCisgICAgaW5mby0+dHR5ID0gTlVMTDsKKyAgICBpbmZvLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKyAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9IC8qIGN5X2hhbmd1cCAqLworCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGN5X2luaXQoKSBhbmQgZnJpZW5kcworICoKKyAqIGN5X2luaXQoKSBpcyBjYWxsZWQgYXQgYm9vdC10aW1lIHRvIGluaXRpYWxpemUgdGhlIHNlcmlhbCBkcml2ZXIuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBpbml0aWFsaXplIGNoaXBzIG9uIEN5Y2xvbS1ZIGNhcmQgLS0gcmV0dXJuIG51bWJlciBvZiB2YWxpZAorICAgY2hpcHMgKHdoaWNoIGlzIG51bWJlciBvZiBwb3J0cy80KSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IF9faW5pdAorY3l5X2luaXRfY2FyZCh2b2lkIF9faW9tZW0gKnRydWVfYmFzZV9hZGRyLGludCBpbmRleCkKK3sKKyAgdW5zaWduZWQgaW50IGNoaXBfbnVtYmVyOworICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKworICAgIGN5X3dyaXRlYih0cnVlX2Jhc2VfYWRkcisoQ3lfSHdSZXNldDw8aW5kZXgpLCAwKTsgCisJCQkJCQkvKiBDeV9Id1Jlc2V0IGlzIDB4MTQwMCAqLworICAgIGN5X3dyaXRlYih0cnVlX2Jhc2VfYWRkcisoQ3lfQ2xySW50cjw8aW5kZXgpLCAwKTsgCisJCQkJCQkvKiBDeV9DbHJJbnRyIGlzIDB4MTgwMCAqLworICAgIHVkZWxheSg1MDBMKTsKKworICAgIGZvcihjaGlwX251bWJlcj0wOyBjaGlwX251bWJlcjxDeU1BWF9DSElQU19QRVJfQ0FSRDsgY2hpcF9udW1iZXIrKyl7CisgICAgICAgIGJhc2VfYWRkciA9IHRydWVfYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBfbnVtYmVyXTw8aW5kZXgpOworICAgICAgICBtZGVsYXkoMSk7CisgICAgICAgIGlmKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lDQ1I8PGluZGV4KSkgIT0gMHgwMCl7CisgICAgICAgICAgICAvKioqKioqKioqKioqKgorICAgICAgICAgICAgcHJpbnRrKCIgY2hpcCAjJWQgYXQgJSM2bHggaXMgbmV2ZXIgaWRsZSAoQ0NSICE9IDApXG4iLAorICAgICAgICAgICAgICAgY2hpcF9udW1iZXIsICh1bnNpZ25lZCBsb25nKWJhc2VfYWRkcik7CisgICAgICAgICAgICAqKioqKioqKioqKioqLworICAgICAgICAgICAgcmV0dXJuIGNoaXBfbnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lHRlJDUjw8aW5kZXgpLCAwKTsKKyAgICAgICAgdWRlbGF5KDEwTCk7CisKKyAgICAgICAgLyogVGhlIEN5Y2xvbS0xNlkgZG9lcyBub3QgZGVjb2RlIGFkZHJlc3MgYml0IDkgYW5kIHRoZXJlZm9yZQorICAgICAgICAgICBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiByZWZlcmVuY2VzIHRvIGNoaXAgMCBhbmQgYSBub24tCisgICAgICAgICAgIGV4aXN0ZW50IGNoaXAgNC4gIElmIHRoZSBwcmVjZWRpbmcgY2xlYXJpbmcgb2YgdGhlIHN1cHBvc2VkCisgICAgICAgICAgIGNoaXAgNCBHRlJDUiByZWdpc3RlciBhcHBlYXJzIGF0IGNoaXAgMCwgdGhlcmUgaXMgbm8gY2hpcCA0CisgICAgICAgICAgIGFuZCB0aGlzIG11c3QgYmUgYSBDeWNsb20tMTZZLCBub3QgYSBDeWNsb20tMzJZZS4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGNoaXBfbnVtYmVyID09IDQKKyAgICAgICAgJiYgY3lfcmVhZGIodHJ1ZV9iYXNlX2FkZHIKKwkgICAgKyAoY3lfY2hpcF9vZmZzZXRbMF08PGluZGV4KQorCSAgICArIChDeUdGUkNSPDxpbmRleCkpID09IDApeworICAgICAgICAgICAgcmV0dXJuIGNoaXBfbnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQ1I8PGluZGV4KSwgQ3lDSElQX1JFU0VUKTsKKyAgICAgICAgbWRlbGF5KDEpOworCisgICAgICAgIGlmKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lHRlJDUjw8aW5kZXgpKSA9PSAweDAwKXsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBwcmludGsoIiBjaGlwICMlZCBhdCAlIzZseCBpcyBub3QgcmVzcG9uZGluZyAiLAorICAgICAgICAgICAgICAgY2hpcF9udW1iZXIsICh1bnNpZ25lZCBsb25nKWJhc2VfYWRkcik7CisgICAgICAgICAgICBwcmludGsoIihHRlJDUiBzdGF5ZWQgMClcbiIsCisgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIGNoaXBfbnVtYmVyOworICAgICAgICB9CisgICAgICAgIGlmKCgweGYwICYgKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lHRlJDUjw8aW5kZXgpKSkpICE9IDB4NDApeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIHByaW50aygiIGNoaXAgIyVkIGF0ICUjNmx4IGlzIG5vdCB2YWxpZCAoR0ZSQ1IgPT0gJSMyeClcbiIsCisgICAgICAgICAgICAgICBjaGlwX251bWJlciwgKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyLAorCSAgICAgICBiYXNlX2FkZHJbQ3lHRlJDUjw8aW5kZXhdKTsKKyAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gY2hpcF9udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lHQ1I8PGluZGV4KSwgQ3lDSDBfU0VSSUFMKTsKKyAgICAgICAgaWYgKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lHRlJDUjw8aW5kZXgpKSA+PSBDRDE0MDBfUkVWX0opeworCSAgICAvKiBJdCBpcyBhIENEMTQwMCByZXYuIEogb3IgbGF0ZXIgKi8KKwkgICAgLyogSW1wb3NzaWJsZSB0byByZWFjaCA1bXMgd2l0aCB0aGlzIGNoaXAuIAorCSAgICAgICBDaGFuZ2VkIHRvIDJtcyBpbnN0ZWFkIChmID0gNTAwIEh6KS4gKi8KKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lQUFI8PGluZGV4KSwgQ3lDTE9DS182MF8yTVMpOworCX0gZWxzZSB7CisJICAgIC8qIGYgPSAyMDAgSHogKi8KKwkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lQUFI8PGluZGV4KSwgQ3lDTE9DS18yNV81TVMpOworCX0KKworICAgIC8qCisgICAgICAgIHByaW50aygiIGNoaXAgIyVkIGF0ICUjNmx4IGlzIHJldiAweCUyeFxuIiwKKyAgICAgICAgICAgICAgIGNoaXBfbnVtYmVyLCAodW5zaWduZWQgbG9uZyliYXNlX2FkZHIsCisJICAgICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lHRlJDUjw8aW5kZXgpKSk7CisgICAgKi8KKyAgICB9CisgICAgcmV0dXJuIGNoaXBfbnVtYmVyOworfSAvKiBjeXlfaW5pdF9jYXJkICovCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGN5X2RldGVjdF9pc2EoKSAtIFByb2JlIGZvciBDeWNsb20tWS9JU0EgYm9hcmRzLgorICogc2V0cyBnbG9iYWwgdmFyaWFibGVzIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBJU0EgYm9hcmRzIGZvdW5kLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CitjeV9kZXRlY3RfaXNhKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0lTQQorICB1bnNpZ25lZCBzaG9ydAljeV9pc2FfaXJxLG5ib2FyZDsKKyAgdm9pZCBfX2lvbWVtCQkqY3lfaXNhX2FkZHJlc3M7CisgIHVuc2lnbmVkIHNob3J0CWksaixjeV9pc2FfbmNoYW47CisjaWZkZWYgTU9EVUxFCisgIGludCBpc3BhcmFtID0gMDsKKyNlbmRpZgorCisgICAgICAgIG5ib2FyZCA9IDA7CisKKyNpZmRlZiBNT0RVTEUKKwkvKiBDaGVjayBmb3IgbW9kdWxlIHBhcmFtZXRlcnMgKi8KKwlmb3IoaSA9IDAgOyBpIDwgTlJfQ0FSRFM7IGkrKykgeworCSAgICBpZiAobWFkZHJbaV0gfHwgaSkgeworCQlpc3BhcmFtID0gMTsKKwkJY3lfaXNhX2FkZHJlc3Nlc1tpXSA9IG1hZGRyW2ldOworCSAgICB9CisJICAgIGlmICghbWFkZHJbaV0pCisJCWJyZWFrOworCX0KKyNlbmRpZgorCisgICAgICAgIC8qIHNjYW4gdGhlIGFkZHJlc3MgdGFibGUgcHJvYmluZyBmb3IgQ3ljbG9tLVkvSVNBIGJvYXJkcyAqLworICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IE5SX0lTQV9BRERSUyA7IGkrKykgeworICAgICAgICAJdW5zaWduZWQgaW50IGlzYV9hZGRyZXNzID0gY3lfaXNhX2FkZHJlc3Nlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoaXNhX2FkZHJlc3MgID09IDB4MDAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKG5ib2FyZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogcHJvYmUgZm9yIENEMTQwMC4uLiAqLworCQljeV9pc2FfYWRkcmVzcyA9IGlvcmVtYXAoaXNhX2FkZHJlc3MsIEN5SVNBX1l3aW4pOworICAgICAgICAgICAgICAgIGN5X2lzYV9uY2hhbiA9IEN5UE9SVFNfUEVSX0NISVAgKiAKKyAgICAgICAgICAgICAgICAgICAgIGN5eV9pbml0X2NhcmQoY3lfaXNhX2FkZHJlc3MsMCk7CisgICAgICAgICAgICAgICAgaWYgKGN5X2lzYV9uY2hhbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBNT0RVTEUKKwkJaWYgKGlzcGFyYW0gJiYgaXJxW2ldKQorCQkgICAgY3lfaXNhX2lycSA9IGlycVtpXTsKKwkJZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgLyogZmluZCBvdXQgdGhlIGJvYXJkJ3MgaXJxIGJ5IHByb2JpbmcgKi8KKyAgICAgICAgICAgICAgICBjeV9pc2FfaXJxID0gZGV0ZWN0X2lzYV9pcnEoY3lfaXNhX2FkZHJlc3MpOworICAgICAgICAgICAgICAgIGlmIChjeV9pc2FfaXJxID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvSVNBIGZvdW5kIGF0IDB4JWx4ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjeV9pc2FfYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCB0aGUgSVJRIGNvdWxkIG5vdCBiZSBkZXRlY3RlZC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoKGN5X25leHRfY2hhbm5lbCtjeV9pc2FfbmNoYW4pID4gTlJfUE9SVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvSVNBIGZvdW5kIGF0IDB4JWx4ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjeV9pc2FfYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCBubyBtb3JlIGNoYW5uZWxzIGFyZSBhdmFpbGFibGUuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ2hhbmdlIE5SX1BPUlRTIGluIGN5Y2xhZGVzLmMgYW5kIHJlY29tcGlsZSBrZXJuZWwuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihuYm9hcmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBuZXh0IGN5X2NhcmQgc3RydWN0dXJlIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgTlJfQ0FSRFMgOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeV9jYXJkW2pdLmJhc2VfYWRkciA9PSAwKSAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IE5SX0NBUkRTKSB7ICAgIC8qIG5vIG1vcmUgY3lfY2FyZHMgYXZhaWxhYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1ZL0lTQSBmb3VuZCBhdCAweCVseCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgY3lfaXNhX2FkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJidXQgbm8gbW9yZSBjYXJkcyBjYW4gYmUgdXNlZCAuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ2hhbmdlIE5SX0NBUkRTIGluIGN5Y2xhZGVzLmMgYW5kIHJlY29tcGlsZSBrZXJuZWwuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihuYm9hcmQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlIElSUSAqLworICAgICAgICAgICAgICAgIGlmKHJlcXVlc3RfaXJxKGN5X2lzYV9pcnEsIGN5eV9pbnRlcnJ1cHQsCisJCQkJICAgU0FfSU5URVJSVVBULCAiQ3ljbG9tLVkiLCAmY3lfY2FyZFtqXSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWS9JU0EgZm91bmQgYXQgMHglbHggIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGN5X2lzYV9hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBJUlEjJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV9pc2FfaXJxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihuYm9hcmQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHNldCBjeV9jYXJkICovCisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5iYXNlX2FkZHIgPSBjeV9pc2FfYWRkcmVzczsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmN0bF9hZGRyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmlycSA9IChpbnQpIGN5X2lzYV9pcnE7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5idXNfaW5kZXggPSAwOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uZmlyc3RfbGluZSA9IGN5X25leHRfY2hhbm5lbDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLm51bV9jaGlwcyA9IGN5X2lzYV9uY2hhbi80OworICAgICAgICAgICAgICAgIG5ib2FyZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogcHJpbnQgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvSVNBICMlZDogMHglbHgtMHglbHgsIElSUSVkLCAiLAorICAgICAgICAgICAgICAgICAgICBqKzEsICh1bnNpZ25lZCBsb25nKSBjeV9pc2FfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKGN5X2lzYV9hZGRyZXNzICsgKEN5SVNBX1l3aW4gLSAxKSksCisJCSAgICBjeV9pc2FfaXJxKTsKKyAgICAgICAgICAgICAgICBwcmludGsoIiVkIGNoYW5uZWxzIHN0YXJ0aW5nIGZyb20gcG9ydCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjeV9pc2FfbmNoYW4sIGN5X25leHRfY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgY3lfbmV4dF9jaGFubmVsICs9IGN5X2lzYV9uY2hhbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4obmJvYXJkKTsKKyNlbHNlCisgICAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCit9IC8qIGN5X2RldGVjdF9pc2EgKi8KKworc3RhdGljIHZvaWQgCitwbHhfaW5pdCh2b2lkIF9faW9tZW0gKmFkZHIsIHVjbG9uZyBpbml0Y3RsKQoreworICAgIC8qIFJlc2V0IFBMWCAqLworICAgIGN5X3dyaXRlbChhZGRyICsgaW5pdGN0bCwgY3lfcmVhZGwoYWRkciArIGluaXRjdGwpIHwgMHg0MDAwMDAwMCk7CisgICAgdWRlbGF5KDEwMEwpOworICAgIGN5X3dyaXRlbChhZGRyICsgaW5pdGN0bCwgY3lfcmVhZGwoYWRkciArIGluaXRjdGwpICYgfjB4NDAwMDAwMDApOworCisgICAgLyogUmVsb2FkIENvbmZpZy4gUmVnaXN0ZXJzIGZyb20gRUVQUk9NICovCisgICAgY3lfd3JpdGVsKGFkZHIgKyBpbml0Y3RsLCBjeV9yZWFkbChhZGRyICsgaW5pdGN0bCkgfCAweDIwMDAwMDAwKTsKKyAgICB1ZGVsYXkoMTAwTCk7CisgICAgY3lfd3JpdGVsKGFkZHIgKyBpbml0Y3RsLCBjeV9yZWFkbChhZGRyICsgaW5pdGN0bCkgJiB+MHgyMDAwMDAwMCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGN5X2RldGVjdF9wY2koKSAtIFRlc3QgUENJIGJ1cyBwcmVzZW5jZSBhbmQgQ3ljbG9tLVllL1BDSS4KKyAqIHNldHMgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgUENJIGJvYXJkcyBmb3VuZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IF9faW5pdAorY3lfZGV0ZWN0X3BjaSh2b2lkKQoreworI2lmZGVmIENPTkZJR19QQ0kKKworICBzdHJ1Y3QgcGNpX2RldgkqcGRldiA9IE5VTEw7CisgIHVuc2lnbmVkIGNoYXIJCWN5eV9yZXZfaWQ7CisgIHVuc2lnbmVkIGNoYXIJCWN5X3BjaV9pcnEgPSAwOworICB1Y2xvbmcJCWN5X3BjaV9waHlzMCwgY3lfcGNpX3BoeXMyOworICB2b2lkIF9faW9tZW0JCSpjeV9wY2lfYWRkcjAsICpjeV9wY2lfYWRkcjI7CisgIHVuc2lnbmVkIHNob3J0CWksaixjeV9wY2lfbmNoYW4sIHBseF92ZXI7CisgIHVuc2lnbmVkIHNob3J0CWRldmljZV9pZCxkZXZfaW5kZXggPSAwOworICB1Y2xvbmcJCW1haWxib3g7CisgIHVjbG9uZwkJWmVJbmRleCA9IDA7CisgIHZvaWQgX19pb21lbQkJKlplX2FkZHIwW05SX0NBUkRTXSwgKlplX2FkZHIyW05SX0NBUkRTXTsKKyAgdWNsb25nCQlaZV9waHlzMFtOUl9DQVJEU10sIFplX3BoeXMyW05SX0NBUkRTXTsKKyAgdW5zaWduZWQgY2hhcgkJWmVfaXJxW05SX0NBUkRTXTsKKyAgc3RydWN0IHBjaV9kZXYJKlplX3BkZXZbTlJfQ0FSRFNdOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOUl9DQVJEUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgLyogbG9vayBmb3IgYSBDeWNsYWRlcyBjYXJkIGJ5IHZlbmRvciBhbmQgZGV2aWNlIGlkICovCisgICAgICAgICAgICAgICAgd2hpbGUoKGRldmljZV9pZCA9IGN5X3BjaV9kZXZfaWRbZGV2X2luZGV4XSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0NZQ0xBREVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9pZCwgcGRldikpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZGV4Kys7ICAgIC8qIHRyeSBuZXh0IGRldmljZSBpZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIGZvdW5kIGEgYm9hcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKwkJaWYgKGRldmljZV9pZCA9PSAwKQorCQkgICAgYnJlYWs7CisKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQkgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAvKiByZWFkIFBDSSBjb25maWd1cmF0aW9uIGFyZWEgKi8KKwkJY3lfcGNpX2lycSA9IHBkZXYtPmlycTsKKwkJY3lfcGNpX3BoeXMwID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCQljeV9wY2lfcGh5czIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmN5eV9yZXZfaWQpOworCisJCWRldmljZV9pZCAmPSB+UENJX0RFVklDRV9JRF9NQVNLOworCisgICAgaWYgKChkZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9DWUNMT01fWV9MbykKKwkgICB8fCAoZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfSGkpKXsKKyNpZmRlZiBDWV9QQ0lfREVCVUcKKyAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvUENJIChidXM9MHgwJXgsIHBjaV9pZD0weCV4LCAiLAorCQlwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4pOworICAgICAgICAgICAgcHJpbnRrKCJyZXZfaWQ9JWQpIElSUSVkXG4iLAorCQljeXlfcmV2X2lkLCAoaW50KWN5X3BjaV9pcnEpOworICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWS9QQ0k6Zm91bmQgIHdpbmFkZHI9MHglbHggY3RsYWRkcj0weCVseFxuIiwKKwkJKHVsb25nKWN5X3BjaV9waHlzMiwgKHVsb25nKWN5X3BjaV9waHlzMCk7CisjZW5kaWYKKworCQlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDIpICYgSU9SRVNPVVJDRV9JTykgeworCQkgICAgcHJpbnRrKCIgIFdhcm5pbmc6IFBDSSBJL08gYml0IGluY29ycmVjdGx5IHNldC4gIgorCQkJICAgIklnbm9yaW5nIGl0Li4uXG4iKTsKKwkJICAgIHBkZXYtPnJlc291cmNlWzJdLmZsYWdzICY9IH5JT1JFU09VUkNFX0lPOworCQl9CisKKwkJLyogQWx0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgSS9PIHJlZ2lvbiwgd2Ugc2hvdWxkCisJCSAgIHJlcXVlc3QgaXQgZnJvbSB0aGUga2VybmVsIGFueXdheSwgdG8gYXZvaWQgcHJvYmxlbXMKKwkJICAgd2l0aCBvdGhlciBkcml2ZXJzIGFjY2Vzc2luZyBpdC4gKi8KKwkJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgIkN5Y2xvbS1ZIikgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJjeWNsYWRlczogZmFpbGVkIHRvIHJlc2VydmUgUENJIHJlc291cmNlc1xuIik7CisJCQljb250aW51ZTsKKwkJfQorCisjaWYgZGVmaW5lZChfX2FscGhhX18pCisgICAgICAgICAgICAgICAgaWYgKGRldmljZV9pZCAgPT0gUENJX0RFVklDRV9JRF9DWUNMT01fWV9MbykgeyAvKiBiZWxvdyAxTT8gKi8KKwkJICAgIHByaW50aygiQ3ljbG9tLVkvUENJIChidXM9MHgwJXgsIHBjaV9pZD0weCV4LCAiLAorCQkJcGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZuKTsKKwkJICAgIHByaW50aygicmV2X2lkPSVkKSBJUlElZFxuIiwKKwkJICAgICAgICBjeXlfcmV2X2lkLCAoaW50KWN5X3BjaV9pcnEpOworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1ZL1BDSTpmb3VuZCAgd2luYWRkcj0weCVseCBjdGxhZGRyPTB4JWx4XG4iLAorCQkgICAgICAgICh1bG9uZyljeV9wY2lfcGh5czIsICh1bG9uZyljeV9wY2lfcGh5czApOworCSAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvUENJIG5vdCBzdXBwb3J0ZWQgZm9yIGxvdyBhZGRyZXNzZXMgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFscGhhIHN5c3RlbXMuXG4iKTsKKwkJICAgIGktLTsKKwkgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKwkJY3lfcGNpX2FkZHIwID0gaW9yZW1hcChjeV9wY2lfcGh5czAsIEN5UENJX1ljdGwpOworCQljeV9wY2lfYWRkcjIgPSBpb3JlbWFwKGN5X3BjaV9waHlzMiwgQ3lQQ0lfWXdpbik7CisKKyNpZmRlZiBDWV9QQ0lfREVCVUcKKyAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvUENJOiByZWxvY2F0ZSB3aW5hZGRyPTB4JWx4IGN0bGFkZHI9MHglbHhcbiIsCisJCSh1X2xvbmcpY3lfcGNpX2FkZHIyLCAodV9sb25nKWN5X3BjaV9hZGRyMCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBjeV9wY2lfbmNoYW4gPSAodW5zaWduZWQgc2hvcnQpKEN5UE9SVFNfUEVSX0NISVAgKiAKKyAgICAgICAgICAgICAgICAgICAgICAgY3l5X2luaXRfY2FyZChjeV9wY2lfYWRkcjIsIDEpKTsKKyAgICAgICAgICAgICAgICBpZihjeV9wY2lfbmNoYW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWSBQQ0kgaG9zdCBjYXJkIHdpdGggIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIm5vIFNlcmlhbC1Nb2R1bGVzIGF0IDB4JWx4LlxuIiwKKwkJCSAgICAodWxvbmcpIGN5X3BjaV9waHlzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoKGN5X25leHRfY2hhbm5lbCtjeV9wY2lfbmNoYW4pID4gTlJfUE9SVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvUENJIGZvdW5kIGF0IDB4JWx4ICIsCisJCQkgICAgKHVsb25nKSBjeV9wY2lfcGh5czIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJidXQgbm8gY2hhbm5lbHMgYXJlIGF2YWlsYWJsZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDaGFuZ2UgTlJfUE9SVFMgaW4gY3ljbGFkZXMuYyBhbmQgcmVjb21waWxlIGtlcm5lbC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBuZXh0IGN5X2NhcmQgc3RydWN0dXJlIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgTlJfQ0FSRFMgOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeV9jYXJkW2pdLmJhc2VfYWRkciA9PSAwKSAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IE5SX0NBUkRTKSB7ICAgIC8qIG5vIG1vcmUgY3lfY2FyZHMgYXZhaWxhYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1ZL1BDSSBmb3VuZCBhdCAweCVseCAiLAorCQkJICAgICh1bG9uZykgY3lfcGNpX3BoeXMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiYnV0IG5vIG1vcmUgY2FyZHMgY2FuIGJlIHVzZWQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ2hhbmdlIE5SX0NBUkRTIGluIGN5Y2xhZGVzLmMgYW5kIHJlY29tcGlsZSBrZXJuZWwuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBJUlEgKi8KKyAgICAgICAgICAgICAgICBpZihyZXF1ZXN0X2lycShjeV9wY2lfaXJxLCBjeXlfaW50ZXJydXB0LAorCQkgICAgICAgIFNBX1NISVJRLCAiQ3ljbG9tLVkiLCAmY3lfY2FyZFtqXSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWS9QQ0kgZm91bmQgYXQgMHglbHggIiwKKwkJCSAgICAodWxvbmcpIGN5X3BjaV9waHlzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgSVJRJWQuXG4iLAorCQkJICAgIGN5X3BjaV9pcnEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHNldCBjeV9jYXJkICovCisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5iYXNlX3BoeXMgPSAodWxvbmcpY3lfcGNpX3BoeXMyOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uY3RsX3BoeXMgPSAodWxvbmcpY3lfcGNpX3BoeXMwOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uYmFzZV9hZGRyID0gY3lfcGNpX2FkZHIyOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uY3RsX2FkZHIgPSBjeV9wY2lfYWRkcjA7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5pcnEgPSAoaW50KSBjeV9wY2lfaXJxOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uYnVzX2luZGV4ID0gMTsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmZpcnN0X2xpbmUgPSBjeV9uZXh0X2NoYW5uZWw7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5udW1fY2hpcHMgPSBjeV9wY2lfbmNoYW4vNDsKKwkJY3lfY2FyZFtqXS5wZGV2ID0gcGRldjsKKwkKKyAgICAgICAgICAgICAgICAvKiBlbmFibGUgaW50ZXJydXB0cyBpbiB0aGUgUENJIGludGVyZmFjZSAqLworCQlwbHhfdmVyID0gY3lfcmVhZGIoY3lfcGNpX2FkZHIyICsgQ3lQTFhfVkVSKSAmIDB4MGY7CisJCXN3aXRjaCAocGx4X3ZlcikgeworCQkgICAgY2FzZSBQTFhfOTA1MDoKKworCQkgICAgY3lfd3JpdGViKGN5X3BjaV9hZGRyMCsweDRjLCAweDQzKTsKKwkJICAgIGJyZWFrOworCisJCSAgICBjYXNlIFBMWF85MDYwOgorCQkgICAgY2FzZSBQTFhfOTA4MDoKKwkJICAgIGRlZmF1bHQ6IC8qIE9sZCBib2FyZHMsIHVzZSBQTFhfOTA2MCAqLworCisJCSAgICBwbHhfaW5pdChjeV9wY2lfYWRkcjAsIDB4NmMpOworCQkgICAgLyogRm9yIHNvbWUgeWV0IHVua25vd24gcmVhc29uLCBvbmNlIHRoZSBQTFg5MDYwIHJlbG9hZHMKKwkJICAgICAgIHRoZSBFRVBST00sIHRoZSBJUlEgaXMgbG9zdCBhbmQsIHRodXMsIHdlIGhhdmUgdG8KKwkJICAgICAgIHJlLXdyaXRlIGl0IHRvIHRoZSBQQ0kgY29uZmlnLiByZWdpc3RlcnMuCisJCSAgICAgICBUaGlzIHdpbGwgcmVtYWluIGhlcmUgdW50aWwgd2UgZmluZCBhIHBlcm1hbmVudCBmaXguICovCisJCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBjeV9wY2lfaXJxKTsKKworCQkgICAgY3lfd3JpdGV3KGN5X3BjaV9hZGRyMCsweDY4LCAKKwkJCWN5X3JlYWR3KGN5X3BjaV9hZGRyMCsweDY4KXwweDA5MDApOworCQkgICAgYnJlYWs7CisJCX0KKworICAgICAgICAgICAgICAgIC8qIHByaW50IG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1ZL1BDSSAjJWQ6IDB4JWx4LTB4JWx4LCBJUlElZCwgIiwKKwkJICAgICAgIGorMSwgCisJCSAgICAgICAodWxvbmcpY3lfcGNpX3BoeXMyLCAKKwkJICAgICAgICh1bG9uZykoY3lfcGNpX3BoeXMyICsgQ3lQQ0lfWXdpbiAtIDEpLAorCQkgICAgICAgKGludCljeV9wY2lfaXJxKTsKKyAgICAgICAgICAgICAgICBwcmludGsoIiVkIGNoYW5uZWxzIHN0YXJ0aW5nIGZyb20gcG9ydCAlZC5cbiIsCisJCSAgICBjeV9wY2lfbmNoYW4sIGN5X25leHRfY2hhbm5lbCk7CisKKyAgICAgICAgICAgICAgICBjeV9uZXh0X2NoYW5uZWwgKz0gY3lfcGNpX25jaGFuOworICAgIH1lbHNlIGlmIChkZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9DWUNMT01fWl9Mbyl7CisJICAgIC8qIHByaW50IG1lc3NhZ2UgKi8KKwkJcHJpbnRrKCJDeWNsYWRlcy1aL1BDSSAoYnVzPTB4MCV4LCBwY2lfaWQ9MHgleCwgIiwKKwkJICAgIHBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbik7CisJCXByaW50aygicmV2X2lkPSVkKSBJUlElZFxuIiwKKwkJICAgIGN5eV9yZXZfaWQsIChpbnQpY3lfcGNpX2lycSk7CisJCXByaW50aygiQ3ljbGFkZXMtWi9QQ0k6IGZvdW5kIHdpbmFkZHI9MHglbHggY3RsYWRkcj0weCVseFxuIiwKKwkJICAgICh1bG9uZyljeV9wY2lfcGh5czIsICh1bG9uZyljeV9wY2lfcGh5czApOworCSAgICBwcmludGsoIkN5Y2xhZGVzLVovUENJIG5vdCBzdXBwb3J0ZWQgZm9yIGxvdyBhZGRyZXNzZXNcbiIpOworCSAgICBicmVhazsKKyAgICB9ZWxzZSBpZiAoZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1pfSGkpeworI2lmZGVmIENZX1BDSV9ERUJVRworICAgICAgICAgICAgcHJpbnRrKCJDeWNsYWRlcy1aL1BDSSAoYnVzPTB4MCV4LCBwY2lfaWQ9MHgleCwgIiwKKwkgICAgICAgIHBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbik7CisgICAgICAgICAgICBwcmludGsoInJldl9pZD0lZCkgSVJRJWRcbiIsCisJCWN5eV9yZXZfaWQsIChpbnQpY3lfcGNpX2lycSk7CisgICAgICAgICAgICBwcmludGsoIkN5Y2xhZGVzLVovUENJOiBmb3VuZCB3aW5hZGRyPTB4JWx4IGN0bGFkZHI9MHglbHhcbiIsCisgICAgICAgICAgICAgICAgKHVsb25nKWN5X3BjaV9waHlzMiwgKHVsb25nKWN5X3BjaV9waHlzMCk7CisjZW5kaWYKKwkJY3lfcGNpX2FkZHIwID0gaW9yZW1hcChjeV9wY2lfcGh5czAsIEN5UENJX1pjdGwpOworCisJCS8qIERpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgUExYIGJlZm9yZSByZXNldHRpbmcgaXQgKi8KKwkJY3lfd3JpdGV3KGN5X3BjaV9hZGRyMCsweDY4LAorCQkJY3lfcmVhZHcoY3lfcGNpX2FkZHIwKzB4NjgpICYgfjB4MDkwMCk7CisKKwkJcGx4X2luaXQoY3lfcGNpX2FkZHIwLCAweDZjKTsKKwkJLyogRm9yIHNvbWUgeWV0IHVua25vd24gcmVhc29uLCBvbmNlIHRoZSBQTFg5MDYwIHJlbG9hZHMKKwkJICAgdGhlIEVFUFJPTSwgdGhlIElSUSBpcyBsb3N0IGFuZCwgdGh1cywgd2UgaGF2ZSB0bworCQkgICByZS13cml0ZSBpdCB0byB0aGUgUENJIGNvbmZpZy4gcmVnaXN0ZXJzLgorCQkgICBUaGlzIHdpbGwgcmVtYWluIGhlcmUgdW50aWwgd2UgZmluZCBhIHBlcm1hbmVudCBmaXguICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGN5X3BjaV9pcnEpOworCisJCW1haWxib3ggPSAodWNsb25nKWN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKSAKKwkJCSAgIGN5X3BjaV9hZGRyMCktPm1haWxfYm94XzApOworCisJCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMikgJiBJT1JFU09VUkNFX0lPKSB7CisJCSAgICBwcmludGsoIiAgV2FybmluZzogUENJIEkvTyBiaXQgaW5jb3JyZWN0bHkgc2V0LiAiCisJCQkgICAiSWdub3JpbmcgaXQuLi5cbiIpOworCQkgICAgcGRldi0+cmVzb3VyY2VbMl0uZmxhZ3MgJj0gfklPUkVTT1VSQ0VfSU87CisJCX0KKworCQkvKiBBbHRob3VnaCB3ZSBkb24ndCB1c2UgdGhpcyBJL08gcmVnaW9uLCB3ZSBzaG91bGQKKwkJICAgcmVxdWVzdCBpdCBmcm9tIHRoZSBrZXJuZWwgYW55d2F5LCB0byBhdm9pZCBwcm9ibGVtcworCQkgICB3aXRoIG90aGVyIGRyaXZlcnMgYWNjZXNzaW5nIGl0LiAqLworCQlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiQ3ljbGFkZXMtWiIpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiY3ljbGFkZXM6IGZhaWxlZCB0byByZXNlcnZlIFBDSSByZXNvdXJjZXNcbiIpOworCQkJY29udGludWU7CisJCX0KKwkKKwkJaWYgKG1haWxib3ggPT0gWkVfVjEpIHsKKwkJICAgIGN5X3BjaV9hZGRyMiA9IGlvcmVtYXAoY3lfcGNpX3BoeXMyLCBDeVBDSV9aZV93aW4pOworCQkgICAgaWYgKFplSW5kZXggPT0gTlJfQ0FSRFMpIHsKKwkJCXByaW50aygiQ3ljbGFkZXMtWmUvUENJIGZvdW5kIGF0IDB4JWx4ICIsCisJCQkJKHVsb25nKWN5X3BjaV9waHlzMik7CisJCQlwcmludGsoImJ1dCBubyBtb3JlIGNhcmRzIGNhbiBiZSB1c2VkLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkNoYW5nZSBOUl9DQVJEUyBpbiBjeWNsYWRlcy5jIGFuZCByZWNvbXBpbGUga2VybmVsLlxuIik7CisJCSAgICB9IGVsc2UgeworCQkJWmVfcGh5czBbWmVJbmRleF0gPSBjeV9wY2lfcGh5czA7CisJCQlaZV9waHlzMltaZUluZGV4XSA9IGN5X3BjaV9waHlzMjsKKwkJCVplX2FkZHIwW1plSW5kZXhdID0gY3lfcGNpX2FkZHIwOworCQkJWmVfYWRkcjJbWmVJbmRleF0gPSBjeV9wY2lfYWRkcjI7CisJCQlaZV9pcnFbWmVJbmRleF0gPSBjeV9wY2lfaXJxOworCQkJWmVfcGRldltaZUluZGV4XSA9IHBkZXY7CisJCQlaZUluZGV4Kys7CisJCSAgICB9CisJCSAgICBpLS07CisJCSAgICBjb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJICAgIGN5X3BjaV9hZGRyMiA9IGlvcmVtYXAoY3lfcGNpX3BoeXMyLCBDeVBDSV9ad2luKTsKKwkJfQorCisjaWZkZWYgQ1lfUENJX0RFQlVHCisgICAgICAgICAgICBwcmludGsoIkN5Y2xhZGVzLVovUENJOiByZWxvY2F0ZSB3aW5hZGRyPTB4JWx4IGN0bGFkZHI9MHglbHhcbiIsCisgICAgICAgICAgICAgICAgKHVsb25nKWN5X3BjaV9hZGRyMiwgKHVsb25nKWN5X3BjaV9hZGRyMCk7CisJICAgIGlmIChtYWlsYm94ID09IFpPX1YxKSB7CisJCWN5X3dyaXRlbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwICopCisJCQkgIChjeV9wY2lfYWRkcjApKS0+bG9jX2FkZHJfYmFzZSwgV0lOX0NSRUcpOworCQlQQVVTRQorCQlwcmludGsoIkN5Y2xhZGVzLThaby9QQ0k6IEZQR0EgaWQgJWx4LCB2ZXIgJWx4XG4iLAorCQkgICAgICAgKHVsb25nKSgweGZmICYgY3lfcmVhZGwoJigoc3RydWN0IENVU1RPTV9SRUcgKikKKwkJICAgICAgICAoY3lfcGNpX2FkZHIyKSktPmZwZ2FfaWQpKSwKKwkJICAgICAgICh1bG9uZykoMHhmZiAmIGN5X3JlYWRsKCYoKHN0cnVjdCBDVVNUT01fUkVHICopCisJCSAgICAgICAgKGN5X3BjaV9hZGRyMikpLT5mcGdhX3ZlcnNpb24pKSk7CisJCWN5X3dyaXRlbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwICopCisJCQkgIChjeV9wY2lfYWRkcjApKS0+bG9jX2FkZHJfYmFzZSwgV0lOX1JBTSk7CisJICAgIH0gZWxzZSB7CisJCXByaW50aygiQ3ljbGFkZXMtWi9QQ0k6IE5ldyBDeWNsYWRlcy1aIGJvYXJkLiAgRlBHQSBub3QgbG9hZGVkXG4iKTsKKwkgICAgfQorI2VuZGlmCisJICAgIC8qIFRoZSBmb2xsb3dpbmcgY2xlYXJzIHRoZSBmaXJtd2FyZSBpZCB3b3JkLiAgVGhpcyBlbnN1cmVzCisJICAgICAgIHRoYXQgdGhlIGRyaXZlciB3aWxsIG5vdCBhdHRlbXB0IHRvIHRhbGsgdG8gdGhlIGJvYXJkCisJICAgICAgIHVudGlsIGl0IGhhcyBiZWVuIHByb3Blcmx5IGluaXRpYWxpemVkLgorCSAgICAgKi8KKwkJUEFVU0UKKwkJaWYgKChtYWlsYm94ID09IFpPX1YxKSB8fCAobWFpbGJveCA9PSBaT19WMikpCisJCSAgICBjeV93cml0ZWwoY3lfcGNpX2FkZHIyICsgSURfQUREUkVTUywgMEwpOworCisgICAgICAgICAgICAgICAgLyogVGhpcyBtdXN0IGJlIGEgQ3ljbGFkZXMtOFpvL1BDSS4gIFRoZSBleHRlbmRhYmxlCisgICAgICAgICAgICAgICAgICAgdmVyc2lvbiB3aWxsIGhhdmUgYSBkaWZmZXJlbnQgZGV2aWNlX2lkIGFuZCB3aWxsCisgICAgICAgICAgICAgICAgICAgYmUgYWxsb2NhdGVkIGl0cyBtYXhpbXVtIG51bWJlciBvZiBwb3J0cy4gKi8KKyAgICAgICAgICAgICAgICBjeV9wY2lfbmNoYW4gPSA4OworCisgICAgICAgICAgICAgICAgaWYoKGN5X25leHRfY2hhbm5lbCtjeV9wY2lfbmNoYW4pID4gTlJfUE9SVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbGFkZXMtOFpvL1BDSSBmb3VuZCBhdCAweCVseCAiLAorCQkJICAgICh1bG9uZyljeV9wY2lfcGh5czIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJidXQgbm8gY2hhbm5lbHMgYXJlIGF2YWlsYWJsZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDaGFuZ2UgTlJfUE9SVFMgaW4gY3ljbGFkZXMuYyBhbmQgcmVjb21waWxlIGtlcm5lbC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIG5leHQgY3lfY2FyZCBzdHJ1Y3R1cmUgYXZhaWxhYmxlICovCisgICAgICAgICAgICAgICAgZm9yIChqID0gMCA7IGogPCBOUl9DQVJEUyA7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5X2NhcmRbal0uYmFzZV9hZGRyID09IDApICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGogPT0gTlJfQ0FSRFMpIHsgICAgLyogbm8gbW9yZSBjeV9jYXJkcyBhdmFpbGFibGUgKi8KKwkJICAgIHByaW50aygiQ3ljbGFkZXMtOFpvL1BDSSBmb3VuZCBhdCAweCVseCAiLAorCQkJKHVsb25nKWN5X3BjaV9waHlzMik7CisJCSAgICBwcmludGsoImJ1dCBubyBtb3JlIGNhcmRzIGNhbiBiZSB1c2VkLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ2hhbmdlIE5SX0NBUkRTIGluIGN5Y2xhZGVzLmMgYW5kIHJlY29tcGlsZSBrZXJuZWwuXG4iKTsKKwkJICAgIHJldHVybihpKTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBDT05GSUdfQ1laX0lOVFIKKyAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBJUlEgb25seSBpZiBib2FyZCBoYXMgYW4gSVJRICovCisJCWlmKCAoY3lfcGNpX2lycSAhPSAwKSAmJiAoY3lfcGNpX2lycSAhPSAyNTUpICkgeworCQkgICAgaWYocmVxdWVzdF9pcnEoY3lfcGNpX2lycSwgY3l6X2ludGVycnVwdCwKKwkJCVNBX1NISVJRLCAiQ3ljbGFkZXMtWiIsICZjeV9jYXJkW2pdKSkKKwkJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLThaby9QQ0kgZm91bmQgYXQgMHglbHggIiwKKwkJCSAgICAodWxvbmcpIGN5X3BjaV9waHlzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgSVJRJWQuXG4iLAorCQkJICAgIGN5X3BjaV9pcnEpOworCQkJcmV0dXJuKGkpOworCQkgICAgfQorCQl9CisjZW5kaWYgLyogQ09ORklHX0NZWl9JTlRSICovCisKKworICAgICAgICAgICAgICAgIC8qIHNldCBjeV9jYXJkICovCisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5iYXNlX3BoeXMgPSBjeV9wY2lfcGh5czI7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5jdGxfcGh5cyA9IGN5X3BjaV9waHlzMDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmJhc2VfYWRkciA9IGN5X3BjaV9hZGRyMjsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmN0bF9hZGRyID0gY3lfcGNpX2FkZHIwOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uaXJxID0gKGludCkgY3lfcGNpX2lycTsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmJ1c19pbmRleCA9IDE7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5maXJzdF9saW5lID0gY3lfbmV4dF9jaGFubmVsOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0ubnVtX2NoaXBzID0gLTE7CisJCWN5X2NhcmRbal0ucGRldiA9IHBkZXY7CisKKyAgICAgICAgICAgICAgICAvKiBwcmludCBtZXNzYWdlICovCisjaWZkZWYgQ09ORklHX0NZWl9JTlRSCisJCS8qIGRvbid0IHJlcG9ydCBJUlEgaWYgYm9hcmQgaXMgbm8gSVJRICovCisJCWlmKCAoY3lfcGNpX2lycSAhPSAwKSAmJiAoY3lfcGNpX2lycSAhPSAyNTUpICkKKwkJICAgIHByaW50aygiQ3ljbGFkZXMtOFpvL1BDSSAjJWQ6IDB4JWx4LTB4JWx4LCBJUlElZCwgIiwKKwkJCWorMSwodWxvbmcpY3lfcGNpX3BoeXMyLAorCQkJKHVsb25nKShjeV9wY2lfcGh5czIgKyBDeVBDSV9ad2luIC0gMSksCisJCQkoaW50KWN5X3BjaV9pcnEpOworCQllbHNlCisjZW5kaWYgLyogQ09ORklHX0NZWl9JTlRSICovCisJCSAgICBwcmludGsoIkN5Y2xhZGVzLThaby9QQ0kgIyVkOiAweCVseC0weCVseCwgIiwKKwkJCWorMSwodWxvbmcpY3lfcGNpX3BoeXMyLAorCQkJKHVsb25nKShjeV9wY2lfcGh5czIgKyBDeVBDSV9ad2luIC0gMSkpOworCisgICAgICAgICAgICAgICAgcHJpbnRrKCIlZCBjaGFubmVscyBzdGFydGluZyBmcm9tIHBvcnQgJWQuXG4iLAorCQkgICAgY3lfcGNpX25jaGFuLGN5X25leHRfY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgY3lfbmV4dF9jaGFubmVsICs9IGN5X3BjaV9uY2hhbjsKKwkgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICg7IFplSW5kZXggIT0gMCAmJiBpIDwgTlJfQ0FSRFM7IGkrKykgeworCSAgICBjeV9wY2lfcGh5czAgPSBaZV9waHlzMFswXTsKKwkgICAgY3lfcGNpX3BoeXMyID0gWmVfcGh5czJbMF07CisJICAgIGN5X3BjaV9hZGRyMCA9IFplX2FkZHIwWzBdOworCSAgICBjeV9wY2lfYWRkcjIgPSBaZV9hZGRyMlswXTsKKwkgICAgY3lfcGNpX2lycSA9IFplX2lycVswXTsKKwkgICAgcGRldiA9IFplX3BkZXZbMF07CisJICAgIGZvciAoaiA9IDAgOyBqIDwgWmVJbmRleC0xIDsgaisrKSB7CisJCVplX3BoeXMwW2pdID0gWmVfcGh5czBbaisxXTsKKwkJWmVfcGh5czJbal0gPSBaZV9waHlzMltqKzFdOworCQlaZV9hZGRyMFtqXSA9IFplX2FkZHIwW2orMV07CisJCVplX2FkZHIyW2pdID0gWmVfYWRkcjJbaisxXTsKKwkJWmVfaXJxW2pdID0gWmVfaXJxW2orMV07CisJCVplX3BkZXZbal0gPSBaZV9wZGV2W2orMV07CisJICAgIH0KKwkgICAgWmVJbmRleC0tOworCQltYWlsYm94ID0gKHVjbG9uZyljeV9yZWFkbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKikgCisJCQkJCSAgIGN5X3BjaV9hZGRyMCktPm1haWxfYm94XzApOworI2lmZGVmIENZX1BDSV9ERUJVRworICAgICAgICAgICAgcHJpbnRrKCJDeWNsYWRlcy1aL1BDSTogcmVsb2NhdGUgd2luYWRkcj0weCVseCBjdGxhZGRyPTB4JWx4XG4iLAorICAgICAgICAgICAgICAgICh1bG9uZyljeV9wY2lfYWRkcjIsICh1bG9uZyljeV9wY2lfYWRkcjApOworCSAgICBwcmludGsoIkN5Y2xhZGVzLVovUENJOiBOZXcgQ3ljbGFkZXMtWiBib2FyZC4gIEZQR0Egbm90IGxvYWRlZFxuIik7CisjZW5kaWYKKwkJUEFVU0UKKyAgICAgICAgICAgICAgICAvKiBUaGlzIG11c3QgYmUgdGhlIG5ldyBDeWNsYWRlcy1aZS9QQ0kuICovCisgICAgICAgICAgICAgICAgY3lfcGNpX25jaGFuID0gWkVfVjFfTlBPUlRTOworCisgICAgICAgICAgICAgICAgaWYoKGN5X25leHRfY2hhbm5lbCtjeV9wY2lfbmNoYW4pID4gTlJfUE9SVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbGFkZXMtWmUvUENJIGZvdW5kIGF0IDB4JWx4ICIsCisJCQkgICAgKHVsb25nKWN5X3BjaV9waHlzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCBubyBjaGFubmVscyBhcmUgYXZhaWxhYmxlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkNoYW5nZSBOUl9QT1JUUyBpbiBjeWNsYWRlcy5jIGFuZCByZWNvbXBpbGUga2VybmVsLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oaSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgbmV4dCBjeV9jYXJkIHN0cnVjdHVyZSBhdmFpbGFibGUgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwIDsgaiA8IE5SX0NBUkRTIDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3lfY2FyZFtqXS5iYXNlX2FkZHIgPT0gMCkgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBOUl9DQVJEUykgeyAgICAvKiBubyBtb3JlIGN5X2NhcmRzIGF2YWlsYWJsZSAqLworCQkgICAgcHJpbnRrKCJDeWNsYWRlcy1aZS9QQ0kgZm91bmQgYXQgMHglbHggIiwKKwkJCSh1bG9uZyljeV9wY2lfcGh5czIpOworCQkgICAgcHJpbnRrKCJidXQgbm8gbW9yZSBjYXJkcyBjYW4gYmUgdXNlZC5cbiIpOworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkNoYW5nZSBOUl9DQVJEUyBpbiBjeWNsYWRlcy5jIGFuZCByZWNvbXBpbGUga2VybmVsLlxuIik7CisJCSAgICByZXR1cm4oaSk7CisgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgQ09ORklHX0NZWl9JTlRSCisgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgSVJRIG9ubHkgaWYgYm9hcmQgaGFzIGFuIElSUSAqLworCQlpZiggKGN5X3BjaV9pcnEgIT0gMCkgJiYgKGN5X3BjaV9pcnEgIT0gMjU1KSApIHsKKwkJICAgIGlmKHJlcXVlc3RfaXJxKGN5X3BjaV9pcnEsIGN5el9pbnRlcnJ1cHQsCisJCQlTQV9TSElSUSwgIkN5Y2xhZGVzLVoiLCAmY3lfY2FyZFtqXSkpCisJCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1aZS9QQ0kgZm91bmQgYXQgMHglbHggIiwKKwkJCSAgICAodWxvbmcpIGN5X3BjaV9waHlzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgSVJRJWQuXG4iLAorCQkJICAgIGN5X3BjaV9pcnEpOworCQkJcmV0dXJuKGkpOworCQkgICAgfQorCQl9CisjZW5kaWYgLyogQ09ORklHX0NZWl9JTlRSICovCisKKyAgICAgICAgICAgICAgICAvKiBzZXQgY3lfY2FyZCAqLworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uYmFzZV9waHlzID0gY3lfcGNpX3BoeXMyOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uY3RsX3BoeXMgPSBjeV9wY2lfcGh5czA7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5iYXNlX2FkZHIgPSBjeV9wY2lfYWRkcjI7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5jdGxfYWRkciA9IGN5X3BjaV9hZGRyMDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmlycSA9IChpbnQpIGN5X3BjaV9pcnE7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5idXNfaW5kZXggPSAxOworICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uZmlyc3RfbGluZSA9IGN5X25leHRfY2hhbm5lbDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLm51bV9jaGlwcyA9IC0xOworCQljeV9jYXJkW2pdLnBkZXYgPSBwZGV2OworCisgICAgICAgICAgICAgICAgLyogcHJpbnQgbWVzc2FnZSAqLworI2lmZGVmIENPTkZJR19DWVpfSU5UUgorCQkvKiBkb24ndCByZXBvcnQgSVJRIGlmIGJvYXJkIGlzIG5vIElSUSAqLworCQlpZiggKGN5X3BjaV9pcnEgIT0gMCkgJiYgKGN5X3BjaV9pcnEgIT0gMjU1KSApCisJCSAgICBwcmludGsoIkN5Y2xhZGVzLVplL1BDSSAjJWQ6IDB4JWx4LTB4JWx4LCBJUlElZCwgIiwKKwkJCWorMSwodWxvbmcpY3lfcGNpX3BoeXMyLAorCQkJKHVsb25nKShjeV9wY2lfcGh5czIgKyBDeVBDSV9aZV93aW4gLSAxKSwKKwkJCShpbnQpY3lfcGNpX2lycSk7CisJCWVsc2UKKyNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KKwkJICAgIHByaW50aygiQ3ljbGFkZXMtWmUvUENJICMlZDogMHglbHgtMHglbHgsICIsCisJCQlqKzEsKHVsb25nKWN5X3BjaV9waHlzMiwKKwkJCSh1bG9uZykoY3lfcGNpX3BoeXMyICsgQ3lQQ0lfWmVfd2luIC0gMSkpOworCisgICAgICAgICAgICAgICAgcHJpbnRrKCIlZCBjaGFubmVscyBzdGFydGluZyBmcm9tIHBvcnQgJWQuXG4iLAorCQkgICAgY3lfcGNpX25jaGFuLGN5X25leHRfY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgY3lfbmV4dF9jaGFubmVsICs9IGN5X3BjaV9uY2hhbjsKKyAgICAgICAgfQorCWlmIChaZUluZGV4ICE9IDApIHsKKwkgICAgcHJpbnRrKCJDeWNsYWRlcy1aZS9QQ0kgZm91bmQgYXQgMHgleCAiLAorCQkodW5zaWduZWQgaW50KSBaZV9waHlzMlswXSk7CisJICAgIHByaW50aygiYnV0IG5vIG1vcmUgY2FyZHMgY2FuIGJlIHVzZWQuXG4iKTsKKyAgICAgICAgICAgIHByaW50aygiQ2hhbmdlIE5SX0NBUkRTIGluIGN5Y2xhZGVzLmMgYW5kIHJlY29tcGlsZSBrZXJuZWwuXG4iKTsKKwl9CisgICAgICAgIHJldHVybihpKTsKKyNlbHNlCisgICAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBpZmRlZiBDT05GSUdfUENJICovCit9IC8qIGN5X2RldGVjdF9wY2kgKi8KKworCisvKgorICogVGhpcyByb3V0aW5lIHByaW50cyBvdXQgdGhlIGFwcHJvcHJpYXRlIHNlcmlhbCBkcml2ZXIgdmVyc2lvbiBudW1iZXIKKyAqIGFuZCBpZGVudGlmaWVzIHdoaWNoIG9wdGlvbnMgd2VyZSBjb25maWd1cmVkIGludG8gdGhpcyBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2hvd192ZXJzaW9uKHZvaWQpCit7CisgIGNoYXIgKnJjc3ZlcnMsICpyY3NkYXRlLCAqdG1wOworICAgIHJjc3ZlcnMgPSBzdHJjaHIocmNzaWQsICcgJyk7IHJjc3ZlcnMrKzsKKyAgICB0bXAgPSBzdHJjaHIocmNzdmVycywgJyAnKTsgKnRtcCsrID0gJ1wwJzsKKyAgICByY3NkYXRlID0gc3RyY2hyKHRtcCwgJyAnKTsgcmNzZGF0ZSsrOworICAgIHRtcCA9IHN0cnJjaHIocmNzZGF0ZSwgJyAnKTsgKnRtcCA9ICdcMCc7CisgICAgcHJpbnRrKCJDeWNsYWRlcyBkcml2ZXIgJXMgJXNcbiIsCisgICAgICAgIHJjc3ZlcnMsIHJjc2RhdGUpOworICAgIHByaW50aygiICAgICAgICBidWlsdCAlcyAlc1xuIiwKKwlfX0RBVEVfXywgX19USU1FX18pOworfSAvKiBzaG93X3ZlcnNpb24gKi8KKworc3RhdGljIGludCAKK2N5Y2xhZGVzX2dldF9wcm9jX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwKKwkJICAgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworICAgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICAqaW5mbzsKKyAgICBpbnQgaTsKKyAgICBpbnQgbGVuPTA7CisgICAgb2ZmX3QgYmVnaW49MDsKKyAgICBvZmZfdCBwb3M9MDsKKyAgICBpbnQgc2l6ZTsKKyAgICBfX3UzMiBjdXJfamlmcyA9IGppZmZpZXM7CisKKyAgICBzaXplID0gc3ByaW50ZihidWYsICJEZXYgVGltZU9wZW4gICBCeXRlc091dCAgSWRsZU91dCAgICBCeXRlc0luICAgSWRsZUluICBPdmVycnVucyAgTGRpc2NcbiIpOworCisgICAgcG9zICs9IHNpemU7CisgICAgbGVuICs9IHNpemU7CisKKyAgICAvKiBPdXRwdXQgb25lIGxpbmUgZm9yIGVhY2gga25vd24gcG9ydCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUyAmJiBjeV9wb3J0W2ldLmxpbmUgPj0gMDsgaSsrKSB7CisJaW5mbyA9ICZjeV9wb3J0W2ldOworCisJaWYgKGluZm8tPmNvdW50KQorCSAgICBzaXplID0gc3ByaW50ZihidWYrbGVuLAorCQkJIiUzZCAlOGx1ICUxMGx1ICU4bHUgJTEwbHUgJThsdSAlOWx1ICU2bGRcbiIsCisJCQlpbmZvLT5saW5lLAorCQkJSklGRklFU19ESUZGKGluZm8tPmlkbGVfc3RhdHMuaW5fdXNlLCBjdXJfamlmcykgLyBIWiwKKwkJCWluZm8tPmlkbGVfc3RhdHMueG1pdF9ieXRlcywKKwkJCUpJRkZJRVNfRElGRihpbmZvLT5pZGxlX3N0YXRzLnhtaXRfaWRsZSwgY3VyX2ppZnMpIC8gSFosCisJCQlpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfYnl0ZXMsCisJCQlKSUZGSUVTX0RJRkYoaW5mby0+aWRsZV9zdGF0cy5yZWN2X2lkbGUsIGN1cl9qaWZzKSAvIEhaLAorCQkJaW5mby0+aWRsZV9zdGF0cy5vdmVycnVucywKKwkJCShsb25nKSBpbmZvLT50dHktPmxkaXNjLm51bSk7CisJZWxzZQorCSAgICBzaXplID0gc3ByaW50ZihidWYrbGVuLAorCQkJIiUzZCAlOGx1ICUxMGx1ICU4bHUgJTEwbHUgJThsdSAlOWx1ICU2bGRcbiIsCisJCQlpbmZvLT5saW5lLCAwTCwgMEwsIDBMLCAwTCwgMEwsIDBMLCAwTCk7CisJbGVuICs9IHNpemU7CisJcG9zID0gYmVnaW4gKyBsZW47CisKKwlpZiAocG9zIDwgb2Zmc2V0KSB7CisJICAgIGxlbiAgID0gMDsKKwkgICAgYmVnaW4gPSBwb3M7CisJfQorCWlmIChwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCisJICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgKmVvZiA9IDE7Citkb25lOgorICAgICpzdGFydCA9IGJ1ZiArIChvZmZzZXQgLSBiZWdpbik7CS8qIFN0YXJ0IG9mIHdhbnRlZCBkYXRhICovCisgICAgbGVuIC09IChvZmZzZXQgLSBiZWdpbik7CQkvKiBTdGFydCBzbG9wICovCisgICAgaWYgKGxlbiA+IGxlbmd0aCkKKwlsZW4gPSBsZW5ndGg7CQkJLyogRW5kaW5nIHNsb3AgKi8KKyAgICBpZiAobGVuIDwgMCkKKwlsZW4gPSAwOworICAgIHJldHVybiBsZW47Cit9CisKKy8qIFRoZSBzZXJpYWwgZHJpdmVyIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBjb2RlIQorICAgIEhhcmR3YXJlIEkvTyBwb3J0cyBhcmUgbWFwcGVkIHRvIGNoYXJhY3RlciBzcGVjaWFsIGRldmljZXMgb24gYQorICAgIGZpcnN0IGZvdW5kLCBmaXJzdCBhbGxvY2F0ZWQgbWFubmVyLiAgVGhhdCBpcywgdGhpcyBjb2RlIHNlYXJjaGVzCisgICAgZm9yIEN5Y2xvbSBjYXJkcyBpbiB0aGUgc3lzdGVtLiAgQXMgZWFjaCBpcyBmb3VuZCwgaXQgaXMgcHJvYmVkCisgICAgdG8gZGlzY292ZXIgaG93IG1hbnkgY2hpcHMgKGFuZCB0aHVzIGhvdyBtYW55IHBvcnRzKSBhcmUgcHJlc2VudC4KKyAgICBUaGVzZSBwb3J0cyBhcmUgbWFwcGVkIHRvIHRoZSB0dHkgcG9ydHMgMzIgYW5kIHVwd2FyZCBpbiBtb25vdG9uaWMKKyAgICBmYXNoaW9uLiAgSWYgYW4gOC1wb3J0IGNhcmQgaXMgcmVwbGFjZWQgd2l0aCBhIDE2LXBvcnQgY2FyZCwgdGhlCisgICAgcG9ydCBtYXBwaW5nIG9uIGEgZm9sbG93aW5nIGNhcmQgd2lsbCBzaGlmdC4KKworICAgIFRoaXMgYXBwcm9hY2ggaXMgZGlmZmVyZW50IGZyb20gd2hhdCBpcyB1c2VkIGluIHRoZSBvdGhlciBzZXJpYWwKKyAgICBkZXZpY2UgZHJpdmVyIGJlY2F1c2UgdGhlIEN5Y2xvbSBpcyBtb3JlIHByb3Blcmx5IGEgbXVsdGlwbGV4ZXIsCisgICAgbm90IGp1c3QgYW4gYWdncmVnYXRpb24gb2Ygc2VyaWFsIHBvcnRzIG9uIG9uZSBjYXJkLgorCisgICAgSWYgdGhlcmUgYXJlIG1vcmUgY2FyZHMgd2l0aCBtb3JlIHBvcnRzIHRoYW4gaGF2ZSBiZWVuCisgICAgc3RhdGljYWxseSBhbGxvY2F0ZWQgYWJvdmUsIGEgd2FybmluZyBpcyBwcmludGVkIGFuZCB0aGUKKyAgICBleHRyYSBwb3J0cyBhcmUgaWdub3JlZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIGN5X29wcyA9IHsKKyAgICAub3BlbiA9IGN5X29wZW4sCisgICAgLmNsb3NlID0gY3lfY2xvc2UsCisgICAgLndyaXRlID0gY3lfd3JpdGUsCisgICAgLnB1dF9jaGFyID0gY3lfcHV0X2NoYXIsCisgICAgLmZsdXNoX2NoYXJzID0gY3lfZmx1c2hfY2hhcnMsCisgICAgLndyaXRlX3Jvb20gPSBjeV93cml0ZV9yb29tLAorICAgIC5jaGFyc19pbl9idWZmZXIgPSBjeV9jaGFyc19pbl9idWZmZXIsCisgICAgLmZsdXNoX2J1ZmZlciA9IGN5X2ZsdXNoX2J1ZmZlciwKKyAgICAuaW9jdGwgPSBjeV9pb2N0bCwKKyAgICAudGhyb3R0bGUgPSBjeV90aHJvdHRsZSwKKyAgICAudW50aHJvdHRsZSA9IGN5X3VudGhyb3R0bGUsCisgICAgLnNldF90ZXJtaW9zID0gY3lfc2V0X3Rlcm1pb3MsCisgICAgLnN0b3AgPSBjeV9zdG9wLAorICAgIC5zdGFydCA9IGN5X3N0YXJ0LAorICAgIC5oYW5ndXAgPSBjeV9oYW5ndXAsCisgICAgLmJyZWFrX2N0bCA9IGN5X2JyZWFrLAorICAgIC53YWl0X3VudGlsX3NlbnQgPSBjeV93YWl0X3VudGlsX3NlbnQsCisgICAgLnJlYWRfcHJvYyA9IGN5Y2xhZGVzX2dldF9wcm9jX2luZm8sCisgICAgLnRpb2NtZ2V0ID0gY3lfdGlvY21nZXQsCisgICAgLnRpb2Ntc2V0ID0gY3lfdGlvY21zZXQsCit9OworCitzdGF0aWMgaW50IF9faW5pdAorY3lfaW5pdCh2b2lkKQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAgKmluZm87CisgIHN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbzsKKyAgaW50IG51bWJlcl96X2JvYXJkcyA9IDA7CisgIGludCBib2FyZCxwb3J0LGksaW5kZXg7CisgIHVuc2lnbmVkIGxvbmcgbWFpbGJveDsKKyAgdW5zaWduZWQgc2hvcnQgY2hpcF9udW1iZXI7CisgIGludCBucG9ydHM7CisKKyAgICBjeV9zZXJpYWxfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihOUl9QT1JUUyk7CisgICAgaWYgKCFjeV9zZXJpYWxfZHJpdmVyKQorCXJldHVybiAtRU5PTUVNOworICAgIHNob3dfdmVyc2lvbigpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgKi8KKyAgICAKKyAgICBjeV9zZXJpYWxfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworICAgIGN5X3NlcmlhbF9kcml2ZXItPmRyaXZlcl9uYW1lID0gImN5Y2xhZGVzIjsKKyAgICBjeV9zZXJpYWxfZHJpdmVyLT5uYW1lID0gInR0eUMiOworICAgIGN5X3NlcmlhbF9kcml2ZXItPmRldmZzX25hbWUgPSAidHRzL0MiOworICAgIGN5X3NlcmlhbF9kcml2ZXItPm1ham9yID0gQ1lDTEFERVNfTUFKT1I7CisgICAgY3lfc2VyaWFsX2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworICAgIGN5X3NlcmlhbF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworICAgIGN5X3NlcmlhbF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisgICAgY3lfc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworICAgIGN5X3NlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKyAgICAgICAgICAgIEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKyAgICBjeV9zZXJpYWxfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisgICAgdHR5X3NldF9vcGVyYXRpb25zKGN5X3NlcmlhbF9kcml2ZXIsICZjeV9vcHMpOworCisgICAgaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoY3lfc2VyaWFsX2RyaXZlcikpCisgICAgICAgICAgICBwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgQ3ljbGFkZXMgc2VyaWFsIGRyaXZlclxuIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlJfQ0FSRFM7IGkrKykgeworICAgICAgICAgICAgLyogYmFzZV9hZGRyPTAgaW5kaWNhdGVzIGJvYXJkIG5vdCBmb3VuZCAqLworICAgICAgICAgICAgY3lfY2FyZFtpXS5iYXNlX2FkZHIgPSBOVUxMOworICAgIH0KKworICAgIC8qIHRoZSBjb2RlIGJlbG93IGlzIHJlc3BvbnNpYmxlIHRvIGZpbmQgdGhlIGJvYXJkcy4gRWFjaCBkaWZmZXJlbnQKKyAgICAgICB0eXBlIG9mIGJvYXJkIGhhcyBpdHMgb3duIGRldGVjdGlvbiByb3V0aW5lLiBJZiBhIGJvYXJkIGlzIGZvdW5kLAorICAgICAgIHRoZSBuZXh0IGN5X2NhcmQgc3RydWN0dXJlIGF2YWlsYWJsZSBpcyBzZXQgYnkgdGhlIGRldGVjdGlvbgorICAgICAgIHJvdXRpbmUuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRoZQorICAgICAgIGF2YWlsYWJpbGl0eSBvZiBjeV9jYXJkIGFuZCBjeV9wb3J0IGRhdGEgc3RydWN0dXJlcyBhbmQgdXBkYXRpbmcKKyAgICAgICB0aGUgY3lfbmV4dF9jaGFubmVsLiAqLworCisgICAgLyogbG9vayBmb3IgaXNhIGJvYXJkcyAqLworICAgIGN5X2lzYV9uYm9hcmQgPSBjeV9kZXRlY3RfaXNhKCk7CisKKyAgICAvKiBsb29rIGZvciBwY2kgYm9hcmRzICovCisgICAgY3lfcGNpX25ib2FyZCA9IGN5X2RldGVjdF9wY2koKTsKKworICAgIGN5X25ib2FyZCA9IGN5X2lzYV9uYm9hcmQgKyBjeV9wY2lfbmJvYXJkOworCisgICAgLyogaW52YWxpZGF0ZSByZW1haW5pbmcgY3lfY2FyZCBzdHJ1Y3R1cmVzICovCisgICAgZm9yIChpID0gMCA7IGkgPCBOUl9DQVJEUyA7IGkrKykgeworICAgICAgICBpZiAoY3lfY2FyZFtpXS5iYXNlX2FkZHIgPT0gMCkgeworICAgICAgICAgICAgICAgIGN5X2NhcmRbaV0uZmlyc3RfbGluZSA9IC0xOworICAgICAgICAgICAgICAgIGN5X2NhcmRbaV0uY3RsX2FkZHIgPSBOVUxMOworICAgICAgICAgICAgICAgIGN5X2NhcmRbaV0uaXJxID0gMDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2ldLmJ1c19pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgY3lfY2FyZFtpXS5maXJzdF9saW5lID0gMDsKKyAgICAgICAgICAgICAgICBjeV9jYXJkW2ldLm51bV9jaGlwcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogaW52YWxpZGF0ZSByZW1haW5pbmcgY3lfcG9ydCBzdHJ1Y3R1cmVzICovCisgICAgZm9yIChpID0gY3lfbmV4dF9jaGFubmVsIDsgaSA8IE5SX1BPUlRTIDsgaSsrKSB7CisgICAgICAgIGN5X3BvcnRbaV0ubGluZSA9IC0xOworICAgICAgICBjeV9wb3J0W2ldLm1hZ2ljID0gLTE7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBwZXItcG9ydCBkYXRhIHN0cnVjdHVyZXMgZm9yIGVhY2ggdmFsaWQgYm9hcmQgZm91bmQgKi8KKyAgICBmb3IgKGJvYXJkID0gMCA7IGJvYXJkIDwgY3lfbmJvYXJkIDsgYm9hcmQrKykgeworICAgICAgICAgICAgY2luZm8gPSAmY3lfY2FyZFtib2FyZF07CisgICAgICAgICAgICBpZiAoY2luZm8tPm51bV9jaGlwcyA9PSAtMSkgeyAvKiBDeWNsYWRlcy1aICovCisJCW51bWJlcl96X2JvYXJkcysrOworCQltYWlsYm94ID0gY3lfcmVhZGwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopCisJCQkgICAgIGN5X2NhcmRbYm9hcmRdLmN0bF9hZGRyKS0+bWFpbF9ib3hfMCk7CisJCW5wb3J0cyA9IChtYWlsYm94ID09IFpFX1YxKSA/IFpFX1YxX05QT1JUUyA6IDg7CisJCWNpbmZvLT5pbnRyX2VuYWJsZWQgPSAwOworCQljaW5mby0+bnBvcnRzID0gMDsgLyogV2lsbCBiZSBjb3JyZWN0bHkgc2V0IGxhdGVyLCBhZnRlciAKKwkJCQkgICAgICBaIEZXIGlzIGxvYWRlZCAqLworCQlzcGluX2xvY2tfaW5pdCgmY2luZm8tPmNhcmRfbG9jayk7CisgICAgICAgICAgICAgICAgZm9yIChwb3J0ID0gY2luZm8tPmZpcnN0X2xpbmUgOworICAgICAgICAgICAgICAgICAgICAgcG9ydCA8IGNpbmZvLT5maXJzdF9saW5lICsgbnBvcnRzOworICAgICAgICAgICAgICAgICAgICAgcG9ydCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9ICZjeV9wb3J0W3BvcnRdOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5tYWdpYyA9IENZQ0xBREVTX01BR0lDOworICAgICAgICAgICAgICAgICAgICBpbmZvLT50eXBlID0gUE9SVF9TVEFSVEVDSDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y2FyZCA9IGJvYXJkOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5saW5lID0gcG9ydDsKKwkJICAgIGluZm8tPmNoaXBfcmV2ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBTVERfQ09NX0ZMQUdTOworICAgICAgICAgICAgICAgICAgICBpbmZvLT50dHkgPSBOVUxMOworCQkgICAgaWYgKG1haWxib3ggPT0gWk9fVjEpCisJCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IENZWl9GSUZPX1NJWkU7CisJCSAgICBlbHNlCisJCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IDQgKiBDWVpfRklGT19TSVpFOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3IxID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y29yMiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmNvcjMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3I0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y29yNSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnRicHIgPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT50Y28gPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5yYnByID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+cmNvID0gMDsKKwkJICAgIGluZm8tPmN1c3RvbV9kaXZpc29yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOworCQkgICAgaW5mby0+Y2xvc2luZ193YWl0ID0gQ0xPU0lOR19XQUlUX0RFTEFZOworCQkgICAgaW5mby0+aWNvdW50LmN0cyA9IGluZm8tPmljb3VudC5kc3IgPSAKKwkJCWluZm8tPmljb3VudC5ybmcgPSBpbmZvLT5pY291bnQuZGNkID0gMDsKKwkJICAgIGluZm8tPmljb3VudC5yeCA9IGluZm8tPmljb3VudC50eCA9IDA7CisJCSAgICBpbmZvLT5pY291bnQuZnJhbWUgPSBpbmZvLT5pY291bnQucGFyaXR5ID0gMDsKKwkJICAgIGluZm8tPmljb3VudC5vdmVycnVuID0gaW5mby0+aWNvdW50LmJyayA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnhfY2hhciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmV2ZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5ibG9ja2VkX29wZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5kZWZhdWx0X3RocmVzaG9sZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmRlZmF1bHRfdGltZW91dCA9IDA7CisJCSAgICBJTklUX1dPUksoJmluZm8tPnRxdWV1ZSwgZG9fc29mdGludCwgaW5mbyk7CisJCSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOworCQkgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5zaHV0ZG93bl93YWl0KTsKKwkJICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgLyogaW5mby0+c2Vzc2lvbiAqLworICAgICAgICAgICAgICAgICAgICAvKiBpbmZvLT5wZ3JwICovCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSAwOworICAgICAgICAgICAgICAgICAgICAvKiBpbmZvLT50aW1lb3V0ICovCisJCSAgICAvKiBCZW50c29uJ3MgdmFycyAqLworICAgICAgICAgICAgICAgICAgICBpbmZvLT5qaWZmaWVzWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+amlmZmllc1sxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmppZmZpZXNbMl0gPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5yZmx1c2hfY291bnQgPSAwOworI2lmZGVmIENPTkZJR19DWVpfSU5UUgorCQkgICAgaW5pdF90aW1lcigmY3l6X3J4X2Z1bGxfdGltZXJbcG9ydF0pOworCQkgICAgY3l6X3J4X2Z1bGxfdGltZXJbcG9ydF0uZnVuY3Rpb24gPSBOVUxMOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfWVsc2V7IC8qIEN5Y2xvbS1ZIG9mIHNvbWUga2luZCovCisgICAgICAgICAgICAgICAgaW5kZXggPSBjaW5mby0+YnVzX2luZGV4OworCQlzcGluX2xvY2tfaW5pdCgmY2luZm8tPmNhcmRfbG9jayk7CisJCWNpbmZvLT5ucG9ydHMgPSBDeVBPUlRTX1BFUl9DSElQICogY2luZm8tPm51bV9jaGlwczsKKyAgICAgICAgICAgICAgICBmb3IgKHBvcnQgPSBjaW5mby0+Zmlyc3RfbGluZSA7CisgICAgICAgICAgICAgICAgICAgICBwb3J0IDwgY2luZm8tPmZpcnN0X2xpbmUgKyBjaW5mby0+bnBvcnRzIDsKKyAgICAgICAgICAgICAgICAgICAgIHBvcnQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGluZm8gPSAmY3lfcG9ydFtwb3J0XTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+bWFnaWMgPSBDWUNMQURFU19NQUdJQzsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+dHlwZSA9IFBPUlRfQ0lSUlVTOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5jYXJkID0gYm9hcmQ7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmxpbmUgPSBwb3J0OworICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IFNURF9DT01fRkxBR1M7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnR0eSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnhtaXRfZmlmb19zaXplID0gQ3lNQVhfQ0hBUl9GSUZPOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3IxID0gQ3lQQVJJVFlfTk9ORXxDeV8xX1NUT1B8Q3lfOF9CSVRTOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3IyID0gQ3lFVEM7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmNvcjMgPSAweDA4OyAvKiBfdmVyeV8gc21hbGwgcmN2IHRocmVzaG9sZCAqLworICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3I0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y29yNSA9IDA7CisJCSAgICBpbmZvLT5jdXN0b21fZGl2aXNvciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmNsb3NlX2RlbGF5ID0gNSpIWi8xMDsKKwkJICAgIGluZm8tPmNsb3Npbmdfd2FpdCA9IENMT1NJTkdfV0FJVF9ERUxBWTsKKwkJICAgIGluZm8tPmljb3VudC5jdHMgPSBpbmZvLT5pY291bnQuZHNyID0gCisJCQlpbmZvLT5pY291bnQucm5nID0gaW5mby0+aWNvdW50LmRjZCA9IDA7CisJCSAgICBpbmZvLT5pY291bnQucnggPSBpbmZvLT5pY291bnQudHggPSAwOworCQkgICAgaW5mby0+aWNvdW50LmZyYW1lID0gaW5mby0+aWNvdW50LnBhcml0eSA9IDA7CisJCSAgICBpbmZvLT5pY291bnQub3ZlcnJ1biA9IGluZm8tPmljb3VudC5icmsgPSAwOworCQkgICAgY2hpcF9udW1iZXIgPSAocG9ydCAtIGNpbmZvLT5maXJzdF9saW5lKSAvIDQ7CisJCSAgICBpZiAoKGluZm8tPmNoaXBfcmV2ID0KKwkJCSBjeV9yZWFkYihjaW5mby0+YmFzZV9hZGRyICsKKwkJCQkgIChjeV9jaGlwX29mZnNldFtjaGlwX251bWJlcl08PGluZGV4KSArCisJCQkJICAoQ3lHRlJDUjw8aW5kZXgpKSkgPj0gQ0QxNDAwX1JFVl9KKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCBpcyBhIENEMTQwMCByZXYuIEogb3IgbGF0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnRicHIgPSBiYXVkX2Jwcl82MFsxM107IC8qIFR4IEJQUiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+dGNvID0gYmF1ZF9jb182MFsxM107IC8qIFR4IENPICovCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5yYnByID0gYmF1ZF9icHJfNjBbMTNdOyAvKiBSeCBCUFIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnJjbyA9IGJhdWRfY29fNjBbMTNdOyAvKiBSeCBDTyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+cmZsb3cgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+cnRzZHRyX2ludiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT50YnByID0gYmF1ZF9icHJfMjVbMTNdOyAvKiBUeCBCUFIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnRjbyA9IGJhdWRfY29fMjVbMTNdOyAvKiBUeCBDTyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+cmJwciA9IGJhdWRfYnByXzI1WzEzXTsgLyogUnggQlBSICovCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5yY28gPSBiYXVkX2NvXzI1WzEzXTsgLyogUnggQ08gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnJmbG93ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnJ0c2R0cl9pbnYgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnhfY2hhciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmV2ZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5ibG9ja2VkX29wZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5kZWZhdWx0X3RocmVzaG9sZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmRlZmF1bHRfdGltZW91dCA9IDA7CisJCSAgICBJTklUX1dPUksoJmluZm8tPnRxdWV1ZSwgZG9fc29mdGludCwgaW5mbyk7CisJCSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOworCQkgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5zaHV0ZG93bl93YWl0KTsKKwkJICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgLyogaW5mby0+c2Vzc2lvbiAqLworICAgICAgICAgICAgICAgICAgICAvKiBpbmZvLT5wZ3JwICovCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnJlYWRfc3RhdHVzX21hc2sgPQorCQkgICAgICAgICAgICAgICAgICBDeVRJTUVPVVR8IEN5U1BFQ0hBUnwgQ3lCUkVBSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ3lQQVJJVFl8IEN5RlJBTUV8IEN5T1ZFUlJVTjsKKyAgICAgICAgICAgICAgICAgICAgLyogaW5mby0+dGltZW91dCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisKKyNpZm5kZWYgQ09ORklHX0NZWl9JTlRSCisgICAgaWYgKG51bWJlcl96X2JvYXJkcyAmJiAhY3l6X3RpbWVyb24peworCWN5el90aW1lcm9uKys7CisJY3l6X3RpbWVybGlzdC5leHBpcmVzID0gamlmZmllcyArIDE7CisJYWRkX3RpbWVyKCZjeXpfdGltZXJsaXN0KTsKKyNpZmRlZiBDWV9QQ0lfREVCVUcKKwlwcmludGsoIkN5Y2xhZGVzLVogcG9sbGluZyBpbml0aWFsaXplZFxuIik7CisjZW5kaWYKKyAgICB9CisjZW5kaWYgLyogQ09ORklHX0NZWl9JTlRSICovCisKKyAgICByZXR1cm4gMDsKKyAgICAKK30gLyogY3lfaW5pdCAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQKK2N5X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisgICAgaW50IGksIGUxOworCisjaWZuZGVmIENPTkZJR19DWVpfSU5UUgorICAgIGlmIChjeXpfdGltZXJvbil7CisJY3l6X3RpbWVyb24gPSAwOworCWRlbF90aW1lcigmY3l6X3RpbWVybGlzdCk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLworCisgICAgaWYgKChlMSA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihjeV9zZXJpYWxfZHJpdmVyKSkpCisgICAgICAgICAgICBwcmludGsoImN5YzogZmFpbGVkIHRvIHVucmVnaXN0ZXIgQ3ljbGFkZXMgc2VyaWFsIGRyaXZlciglZClcbiIsCisJCWUxKTsKKworICAgIHB1dF90dHlfZHJpdmVyKGN5X3NlcmlhbF9kcml2ZXIpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5SX0NBUkRTOyBpKyspIHsKKyAgICAgICAgaWYgKGN5X2NhcmRbaV0uYmFzZV9hZGRyKSB7CisJICAgIGlvdW5tYXAoY3lfY2FyZFtpXS5iYXNlX2FkZHIpOworCSAgICBpZiAoY3lfY2FyZFtpXS5jdGxfYWRkcikKKwkJaW91bm1hcChjeV9jYXJkW2ldLmN0bF9hZGRyKTsKKwkgICAgaWYgKGN5X2NhcmRbaV0uaXJxCisjaWZuZGVmIENPTkZJR19DWVpfSU5UUgorCQkmJiBjeV9jYXJkW2ldLm51bV9jaGlwcyAhPSAtMSAvKiBub3QgYSBaIGNhcmQgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KKwkgICAgKQorCQlmcmVlX2lycShjeV9jYXJkW2ldLmlycSwgJmN5X2NhcmRbaV0pOworI2lmZGVmIENPTkZJR19QQ0kKKwkJaWYgKGN5X2NhcmRbaV0ucGRldikKKwkJCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY3lfY2FyZFtpXS5wZGV2KTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorICAgIGlmICh0bXBfYnVmKSB7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSB0bXBfYnVmKTsKKwl0bXBfYnVmID0gTlVMTDsKKyAgICB9Cit9IC8qIGN5X2NsZWFudXBfbW9kdWxlICovCisKK21vZHVsZV9pbml0KGN5X2luaXQpOworbW9kdWxlX2V4aXQoY3lfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZGVjc2VyaWFsLmMgYi9kcml2ZXJzL2NoYXIvZGVjc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExNDQwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kZWNzZXJpYWwuYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIHNlcmNvbnMuYworICogICAgICBjaG9vc2UgdGhlIHJpZ2h0IHNlcmlhbCBkZXZpY2UgYXQgYm9vdCB0aW1lCisgKgorICogdHJpZW1lciA2LVNFUC0xOTk4CisgKiAgICAgIHNlcmNvbnMuYyBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgdGhyZWUgZGlmZmVyZW50IGtpbmRzIAorICogICAgICBvZiBzZXJpYWwgZGV2aWNlcyB1bmRlciB0aGUgZGVjc3RhdGlvbiB3b3JsZCB0byBjby1leGlzdAorICogICAgICBpbiB0aGUgc2FtZSBrZXJuZWwuICBUaGUgaWRlYSBoZXJlIGlzIHRvIGFic3RyYWN0IAorICogICAgICB0aGUgcGllY2VzIG9mIHRoZSBkcml2ZXJzIHRoYXQgYXJlIGNvbW1vbiB0byB0aGlzIGZpbGUKKyAqICAgICAgc28gdGhhdCB0aGV5IGRvIG5vdCBjbGFzaCBhdCBjb21waWxlIHRpbWUgYW5kIHJ1bnRpbWUuCisgKgorICogSEsgMTYtU0VQLTE5OTggdjAuMDAyCisgKiAgICAgIHJlbW92ZWQgdGhlIFBST00gY29uc29sZSBhcyB0aGlzIGlzIG5vdCBhIHJlYWwgc2VyaWFsCisgKiAgICAgIGRldmljZS4gQWRkZWQgc3VwcG9ydCBmb3IgUFJPTSBjb25zb2xlIGluIGRyaXZlcnMvY2hhci90dHlfaW8uYworICogICAgICBpbnN0ZWFkLiBBbHRob3VnaCBpdCBtYXkgd29yayB0byBlbmFibGUgbW9yZSB0aGFuIG9uZSAKKyAqICAgICAgY29uc29sZSBkZXZpY2UgSSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIG9ubHkgb25lLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2RlYy9tYWNodHlwZS5oPgorCisjaWZkZWYgQ09ORklHX1pTCitleHRlcm4gaW50IHpzX2luaXQodm9pZCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19EWgorZXh0ZXJuIGludCBkel9pbml0KHZvaWQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0NPTlNPTEUKKworI2lmZGVmIENPTkZJR19aUworZXh0ZXJuIHZvaWQgenNfc2VyaWFsX2NvbnNvbGVfaW5pdCh2b2lkKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RaCitleHRlcm4gdm9pZCBkel9zZXJpYWxfY29uc29sZV9pbml0KHZvaWQpOworI2VuZGlmCisKKyNlbmRpZgorCisvKiByc19pbml0IC0gc3RhcnRzIHVwIHRoZSBzZXJpYWwgaW50ZXJmYWNlIC0KKyAgIGhhbmRsZSBub3JtYWwgY2FzZSBvZiBzdGFydGluZyB1cCB0aGUgc2VyaWFsIGludGVyZmFjZSAqLworCisjaWZkZWYgQ09ORklHX1NFUklBTAorCitpbnQgX19pbml0IHJzX2luaXQodm9pZCkKK3sKKworI2lmIGRlZmluZWQoQ09ORklHX1pTKSAmJiBkZWZpbmVkKENPTkZJR19EWikKKyAgICBpZiAoSU9BU0lDKQorCXJldHVybiB6c19pbml0KCk7CisgICAgZWxzZQorCXJldHVybiBkel9pbml0KCk7CisjZWxzZQorCisjaWZkZWYgQ09ORklHX1pTCisgICAgcmV0dXJuIHpzX2luaXQoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RaCisgICAgcmV0dXJuIGR6X2luaXQoKTsKKyNlbmRpZgorCisjZW5kaWYKK30KKworX19pbml0Y2FsbChyc19pbml0KTsKKworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0NPTlNPTEUKKworLyogc2VyaWFsX2NvbnNvbGVfaW5pdCBoYW5kbGVzIHRoZSBzcGVjaWFsIGNhc2Ugb2Ygc3RhcnRpbmcKKyAqICAgdXAgdGhlIGNvbnNvbGUgb24gdGhlIHNlcmlhbCBwb3J0CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGRlY3NlcmlhbF9jb25zb2xlX2luaXQodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19aUykgJiYgZGVmaW5lZChDT05GSUdfRFopCisgICAgaWYgKElPQVNJQykKKwl6c19zZXJpYWxfY29uc29sZV9pbml0KCk7CisgICAgZWxzZQorCWR6X3NlcmlhbF9jb25zb2xlX2luaXQoKTsKKyNlbHNlCisKKyNpZmRlZiBDT05GSUdfWlMKKyAgICB6c19zZXJpYWxfY29uc29sZV9pbml0KCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19EWgorICAgIGR6X3NlcmlhbF9jb25zb2xlX2luaXQoKTsKKyNlbmRpZgorCisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KK2NvbnNvbGVfaW5pdGNhbGwoZGVjc2VyaWFsX2NvbnNvbGVfaW5pdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RlZmtleW1hcC5jX3NoaXBwZWQgYi9kcml2ZXJzL2NoYXIvZGVma2V5bWFwLmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTNhMmYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RlZmtleW1hcC5jX3NoaXBwZWQKQEAgLTAsMCArMSwyNjIgQEAKKy8qIERvIG5vdCBlZGl0IHRoaXMgZmlsZSEgSXQgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5ICAgKi8KKy8qICAgIGxvYWRrZXlzIC0tbWt0YWJsZSBkZWZrZXltYXAubWFwID4gZGVma2V5bWFwLmMgICAgICAgICAgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorCit1X3Nob3J0IHBsYWluX21hcFtOUl9LRVlTXSA9IHsKKwkweGYyMDAsCTB4ZjAxYiwJMHhmMDMxLAkweGYwMzIsCTB4ZjAzMywJMHhmMDM0LAkweGYwMzUsCTB4ZjAzNiwKKwkweGYwMzcsCTB4ZjAzOCwJMHhmMDM5LAkweGYwMzAsCTB4ZjAyZCwJMHhmMDNkLAkweGYwN2YsCTB4ZjAwOSwKKwkweGZiNzEsCTB4ZmI3NywJMHhmYjY1LAkweGZiNzIsCTB4ZmI3NCwJMHhmYjc5LAkweGZiNzUsCTB4ZmI2OSwKKwkweGZiNmYsCTB4ZmI3MCwJMHhmMDViLAkweGYwNWQsCTB4ZjIwMSwJMHhmNzAyLAkweGZiNjEsCTB4ZmI3MywKKwkweGZiNjQsCTB4ZmI2NiwJMHhmYjY3LAkweGZiNjgsCTB4ZmI2YSwJMHhmYjZiLAkweGZiNmMsCTB4ZjAzYiwKKwkweGYwMjcsCTB4ZjA2MCwJMHhmNzAwLAkweGYwNWMsCTB4ZmI3YSwJMHhmYjc4LAkweGZiNjMsCTB4ZmI3NiwKKwkweGZiNjIsCTB4ZmI2ZSwJMHhmYjZkLAkweGYwMmMsCTB4ZjAyZSwJMHhmMDJmLAkweGY3MDAsCTB4ZjMwYywKKwkweGY3MDMsCTB4ZjAyMCwJMHhmMjA3LAkweGYxMDAsCTB4ZjEwMSwJMHhmMTAyLAkweGYxMDMsCTB4ZjEwNCwKKwkweGYxMDUsCTB4ZjEwNiwJMHhmMTA3LAkweGYxMDgsCTB4ZjEwOSwJMHhmMjA4LAkweGYyMDksCTB4ZjMwNywKKwkweGYzMDgsCTB4ZjMwOSwJMHhmMzBiLAkweGYzMDQsCTB4ZjMwNSwJMHhmMzA2LAkweGYzMGEsCTB4ZjMwMSwKKwkweGYzMDIsCTB4ZjMwMywJMHhmMzAwLAkweGYzMTAsCTB4ZjIwNiwJMHhmMjAwLAkweGYwM2MsCTB4ZjEwYSwKKwkweGYxMGIsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYzMGUsCTB4ZjcwMiwJMHhmMzBkLAkweGYwMWMsCTB4ZjcwMSwJMHhmMjA1LAkweGYxMTQsCTB4ZjYwMywKKwkweGYxMTgsCTB4ZjYwMSwJMHhmNjAyLAkweGYxMTcsCTB4ZjYwMCwJMHhmMTE5LAkweGYxMTUsCTB4ZjExNiwKKwkweGYxMWEsCTB4ZjEwYywJMHhmMTBkLAkweGYxMWIsCTB4ZjExYywJMHhmMTEwLAkweGYzMTEsCTB4ZjExZCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKK307CisKK3Vfc2hvcnQgc2hpZnRfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMDFiLAkweGYwMjEsCTB4ZjA0MCwJMHhmMDIzLAkweGYwMjQsCTB4ZjAyNSwJMHhmMDVlLAorCTB4ZjAyNiwJMHhmMDJhLAkweGYwMjgsCTB4ZjAyOSwJMHhmMDVmLAkweGYwMmIsCTB4ZjA3ZiwJMHhmMDA5LAorCTB4ZmI1MSwJMHhmYjU3LAkweGZiNDUsCTB4ZmI1MiwJMHhmYjU0LAkweGZiNTksCTB4ZmI1NSwJMHhmYjQ5LAorCTB4ZmI0ZiwJMHhmYjUwLAkweGYwN2IsCTB4ZjA3ZCwJMHhmMjAxLAkweGY3MDIsCTB4ZmI0MSwJMHhmYjUzLAorCTB4ZmI0NCwJMHhmYjQ2LAkweGZiNDcsCTB4ZmI0OCwJMHhmYjRhLAkweGZiNGIsCTB4ZmI0YywJMHhmMDNhLAorCTB4ZjAyMiwJMHhmMDdlLAkweGY3MDAsCTB4ZjA3YywJMHhmYjVhLAkweGZiNTgsCTB4ZmI0MywJMHhmYjU2LAorCTB4ZmI0MiwJMHhmYjRlLAkweGZiNGQsCTB4ZjAzYywJMHhmMDNlLAkweGYwM2YsCTB4ZjcwMCwJMHhmMzBjLAorCTB4ZjcwMywJMHhmMDIwLAkweGYyMDcsCTB4ZjEwYSwJMHhmMTBiLAkweGYxMGMsCTB4ZjEwZCwJMHhmMTBlLAorCTB4ZjEwZiwJMHhmMTEwLAkweGYxMTEsCTB4ZjExMiwJMHhmMTEzLAkweGYyMTMsCTB4ZjIwMywJMHhmMzA3LAorCTB4ZjMwOCwJMHhmMzA5LAkweGYzMGIsCTB4ZjMwNCwJMHhmMzA1LAkweGYzMDYsCTB4ZjMwYSwJMHhmMzAxLAorCTB4ZjMwMiwJMHhmMzAzLAkweGYzMDAsCTB4ZjMxMCwJMHhmMjA2LAkweGYyMDAsCTB4ZjAzZSwJMHhmMTBhLAorCTB4ZjEwYiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjMwZSwJMHhmNzAyLAkweGYzMGQsCTB4ZjIwMCwJMHhmNzAxLAkweGYyMDUsCTB4ZjExNCwJMHhmNjAzLAorCTB4ZjIwYiwJMHhmNjAxLAkweGY2MDIsCTB4ZjExNywJMHhmNjAwLAkweGYyMGEsCTB4ZjExNSwJMHhmMTE2LAorCTB4ZjExYSwJMHhmMTBjLAkweGYxMGQsCTB4ZjExYiwJMHhmMTFjLAkweGYxMTAsCTB4ZjMxMSwJMHhmMTFkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorfTsKKwordV9zaG9ydCBhbHRncl9tYXBbTlJfS0VZU10gPSB7CisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMDQwLAkweGYyMDAsCTB4ZjAyNCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMDdiLAkweGYwNWIsCTB4ZjA1ZCwJMHhmMDdkLAkweGYwNWMsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmYjcxLAkweGZiNzcsCTB4ZjkxOCwJMHhmYjcyLAkweGZiNzQsCTB4ZmI3OSwJMHhmYjc1LAkweGZiNjksCisJMHhmYjZmLAkweGZiNzAsCTB4ZjIwMCwJMHhmMDdlLAkweGYyMDEsCTB4ZjcwMiwJMHhmOTE0LAkweGZiNzMsCisJMHhmOTE3LAkweGY5MTksCTB4ZmI2NywJMHhmYjY4LAkweGZiNmEsCTB4ZmI2YiwJMHhmYjZjLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjcwMCwJMHhmMjAwLAkweGZiN2EsCTB4ZmI3OCwJMHhmOTE2LAkweGZiNzYsCisJMHhmOTE1LAkweGZiNmUsCTB4ZmI2ZCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmNzAwLAkweGYzMGMsCisJMHhmNzAzLAkweGYyMDAsCTB4ZjIwNywJMHhmNTBjLAkweGY1MGQsCTB4ZjUwZSwJMHhmNTBmLAkweGY1MTAsCisJMHhmNTExLAkweGY1MTIsCTB4ZjUxMywJMHhmNTE0LAkweGY1MTUsCTB4ZjIwOCwJMHhmMjAyLAkweGY5MTEsCisJMHhmOTEyLAkweGY5MTMsCTB4ZjMwYiwJMHhmOTBlLAkweGY5MGYsCTB4ZjkxMCwJMHhmMzBhLAkweGY5MGIsCisJMHhmOTBjLAkweGY5MGQsCTB4ZjkwYSwJMHhmMzEwLAkweGYyMDYsCTB4ZjIwMCwJMHhmMDdjLAkweGY1MTYsCisJMHhmNTE3LAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMzBlLAkweGY3MDIsCTB4ZjMwZCwJMHhmMjAwLAkweGY3MDEsCTB4ZjIwNSwJMHhmMTE0LAkweGY2MDMsCisJMHhmMTE4LAkweGY2MDEsCTB4ZjYwMiwJMHhmMTE3LAkweGY2MDAsCTB4ZjExOSwJMHhmMTE1LAkweGYxMTYsCisJMHhmMTFhLAkweGYxMGMsCTB4ZjEwZCwJMHhmMTFiLAkweGYxMWMsCTB4ZjExMCwJMHhmMzExLAkweGYxMWQsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCit9OworCit1X3Nob3J0IGN0cmxfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjAwMCwJMHhmMDFiLAkweGYwMWMsCTB4ZjAxZCwJMHhmMDFlLAorCTB4ZjAxZiwJMHhmMDdmLAkweGYyMDAsCTB4ZjIwMCwJMHhmMDFmLAkweGYyMDAsCTB4ZjAwOCwJMHhmMjAwLAorCTB4ZjAxMSwJMHhmMDE3LAkweGYwMDUsCTB4ZjAxMiwJMHhmMDE0LAkweGYwMTksCTB4ZjAxNSwJMHhmMDA5LAorCTB4ZjAwZiwJMHhmMDEwLAkweGYwMWIsCTB4ZjAxZCwJMHhmMjAxLAkweGY3MDIsCTB4ZjAwMSwJMHhmMDEzLAorCTB4ZjAwNCwJMHhmMDA2LAkweGYwMDcsCTB4ZjAwOCwJMHhmMDBhLAkweGYwMGIsCTB4ZjAwYywJMHhmMjAwLAorCTB4ZjAwNywJMHhmMDAwLAkweGY3MDAsCTB4ZjAxYywJMHhmMDFhLAkweGYwMTgsCTB4ZjAwMywJMHhmMDE2LAorCTB4ZjAwMiwJMHhmMDBlLAkweGYwMGQsCTB4ZjIwMCwJMHhmMjBlLAkweGYwN2YsCTB4ZjcwMCwJMHhmMzBjLAorCTB4ZjcwMywJMHhmMDAwLAkweGYyMDcsCTB4ZjEwMCwJMHhmMTAxLAkweGYxMDIsCTB4ZjEwMywJMHhmMTA0LAorCTB4ZjEwNSwJMHhmMTA2LAkweGYxMDcsCTB4ZjEwOCwJMHhmMTA5LAkweGYyMDgsCTB4ZjIwNCwJMHhmMzA3LAorCTB4ZjMwOCwJMHhmMzA5LAkweGYzMGIsCTB4ZjMwNCwJMHhmMzA1LAkweGYzMDYsCTB4ZjMwYSwJMHhmMzAxLAorCTB4ZjMwMiwJMHhmMzAzLAkweGYzMDAsCTB4ZjMxMCwJMHhmMjA2LAkweGYyMDAsCTB4ZjIwMCwJMHhmMTBhLAorCTB4ZjEwYiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjMwZSwJMHhmNzAyLAkweGYzMGQsCTB4ZjAxYywJMHhmNzAxLAkweGYyMDUsCTB4ZjExNCwJMHhmNjAzLAorCTB4ZjExOCwJMHhmNjAxLAkweGY2MDIsCTB4ZjExNywJMHhmNjAwLAkweGYxMTksCTB4ZjExNSwJMHhmMTE2LAorCTB4ZjExYSwJMHhmMTBjLAkweGYxMGQsCTB4ZjExYiwJMHhmMTFjLAkweGYxMTAsCTB4ZjMxMSwJMHhmMTFkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorfTsKKwordV9zaG9ydCBzaGlmdF9jdHJsX21hcFtOUl9LRVlTXSA9IHsKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYwMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjAxZiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYwMTEsCTB4ZjAxNywJMHhmMDA1LAkweGYwMTIsCTB4ZjAxNCwJMHhmMDE5LAkweGYwMTUsCTB4ZjAwOSwKKwkweGYwMGYsCTB4ZjAxMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMSwJMHhmNzAyLAkweGYwMDEsCTB4ZjAxMywKKwkweGYwMDQsCTB4ZjAwNiwJMHhmMDA3LAkweGYwMDgsCTB4ZjAwYSwJMHhmMDBiLAkweGYwMGMsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmNzAwLAkweGYyMDAsCTB4ZjAxYSwJMHhmMDE4LAkweGYwMDMsCTB4ZjAxNiwKKwkweGYwMDIsCTB4ZjAwZSwJMHhmMDBkLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGY3MDAsCTB4ZjMwYywKKwkweGY3MDMsCTB4ZjIwMCwJMHhmMjA3LAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjA4LAkweGYyMDAsCTB4ZjMwNywKKwkweGYzMDgsCTB4ZjMwOSwJMHhmMzBiLAkweGYzMDQsCTB4ZjMwNSwJMHhmMzA2LAkweGYzMGEsCTB4ZjMwMSwKKwkweGYzMDIsCTB4ZjMwMywJMHhmMzAwLAkweGYzMTAsCTB4ZjIwNiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYzMGUsCTB4ZjcwMiwJMHhmMzBkLAkweGYyMDAsCTB4ZjcwMSwJMHhmMjA1LAkweGYxMTQsCTB4ZjYwMywKKwkweGYxMTgsCTB4ZjYwMSwJMHhmNjAyLAkweGYxMTcsCTB4ZjYwMCwJMHhmMTE5LAkweGYxMTUsCTB4ZjExNiwKKwkweGYxMWEsCTB4ZjEwYywJMHhmMTBkLAkweGYxMWIsCTB4ZjExYywJMHhmMTEwLAkweGYzMTEsCTB4ZjExZCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKK307CisKK3Vfc2hvcnQgYWx0X21hcFtOUl9LRVlTXSA9IHsKKwkweGYyMDAsCTB4ZjgxYiwJMHhmODMxLAkweGY4MzIsCTB4ZjgzMywJMHhmODM0LAkweGY4MzUsCTB4ZjgzNiwKKwkweGY4MzcsCTB4ZjgzOCwJMHhmODM5LAkweGY4MzAsCTB4ZjgyZCwJMHhmODNkLAkweGY4N2YsCTB4ZjgwOSwKKwkweGY4NzEsCTB4Zjg3NywJMHhmODY1LAkweGY4NzIsCTB4Zjg3NCwJMHhmODc5LAkweGY4NzUsCTB4Zjg2OSwKKwkweGY4NmYsCTB4Zjg3MCwJMHhmODViLAkweGY4NWQsCTB4ZjgwZCwJMHhmNzAyLAkweGY4NjEsCTB4Zjg3MywKKwkweGY4NjQsCTB4Zjg2NiwJMHhmODY3LAkweGY4NjgsCTB4Zjg2YSwJMHhmODZiLAkweGY4NmMsCTB4ZjgzYiwKKwkweGY4MjcsCTB4Zjg2MCwJMHhmNzAwLAkweGY4NWMsCTB4Zjg3YSwJMHhmODc4LAkweGY4NjMsCTB4Zjg3NiwKKwkweGY4NjIsCTB4Zjg2ZSwJMHhmODZkLAkweGY4MmMsCTB4ZjgyZSwJMHhmODJmLAkweGY3MDAsCTB4ZjMwYywKKwkweGY3MDMsCTB4ZjgyMCwJMHhmMjA3LAkweGY1MDAsCTB4ZjUwMSwJMHhmNTAyLAkweGY1MDMsCTB4ZjUwNCwKKwkweGY1MDUsCTB4ZjUwNiwJMHhmNTA3LAkweGY1MDgsCTB4ZjUwOSwJMHhmMjA4LAkweGYyMDksCTB4ZjkwNywKKwkweGY5MDgsCTB4ZjkwOSwJMHhmMzBiLAkweGY5MDQsCTB4ZjkwNSwJMHhmOTA2LAkweGYzMGEsCTB4ZjkwMSwKKwkweGY5MDIsCTB4ZjkwMywJMHhmOTAwLAkweGYzMTAsCTB4ZjIwNiwJMHhmMjAwLAkweGY4M2MsCTB4ZjUwYSwKKwkweGY1MGIsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYzMGUsCTB4ZjcwMiwJMHhmMzBkLAkweGYwMWMsCTB4ZjcwMSwJMHhmMjA1LAkweGYxMTQsCTB4ZjYwMywKKwkweGYxMTgsCTB4ZjIxMCwJMHhmMjExLAkweGYxMTcsCTB4ZjYwMCwJMHhmMTE5LAkweGYxMTUsCTB4ZjExNiwKKwkweGYxMWEsCTB4ZjEwYywJMHhmMTBkLAkweGYxMWIsCTB4ZjExYywJMHhmMTEwLAkweGYzMTEsCTB4ZjExZCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKK307CisKK3Vfc2hvcnQgY3RybF9hbHRfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjgxMSwJMHhmODE3LAkweGY4MDUsCTB4ZjgxMiwJMHhmODE0LAkweGY4MTksCTB4ZjgxNSwJMHhmODA5LAorCTB4ZjgwZiwJMHhmODEwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAxLAkweGY3MDIsCTB4ZjgwMSwJMHhmODEzLAorCTB4ZjgwNCwJMHhmODA2LAkweGY4MDcsCTB4ZjgwOCwJMHhmODBhLAkweGY4MGIsCTB4ZjgwYywJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGY3MDAsCTB4ZjIwMCwJMHhmODFhLAkweGY4MTgsCTB4ZjgwMywJMHhmODE2LAorCTB4ZjgwMiwJMHhmODBlLAkweGY4MGQsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjcwMCwJMHhmMzBjLAorCTB4ZjcwMywJMHhmMjAwLAkweGYyMDcsCTB4ZjUwMCwJMHhmNTAxLAkweGY1MDIsCTB4ZjUwMywJMHhmNTA0LAorCTB4ZjUwNSwJMHhmNTA2LAkweGY1MDcsCTB4ZjUwOCwJMHhmNTA5LAkweGYyMDgsCTB4ZjIwMCwJMHhmMzA3LAorCTB4ZjMwOCwJMHhmMzA5LAkweGYzMGIsCTB4ZjMwNCwJMHhmMzA1LAkweGYzMDYsCTB4ZjMwYSwJMHhmMzAxLAorCTB4ZjMwMiwJMHhmMzAzLAkweGYzMDAsCTB4ZjIwYywJMHhmMjA2LAkweGYyMDAsCTB4ZjIwMCwJMHhmNTBhLAorCTB4ZjUwYiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjMwZSwJMHhmNzAyLAkweGYzMGQsCTB4ZjIwMCwJMHhmNzAxLAkweGYyMDUsCTB4ZjExNCwJMHhmNjAzLAorCTB4ZjExOCwJMHhmNjAxLAkweGY2MDIsCTB4ZjExNywJMHhmNjAwLAkweGYxMTksCTB4ZjExNSwJMHhmMjBjLAorCTB4ZjExYSwJMHhmMTBjLAkweGYxMGQsCTB4ZjExYiwJMHhmMTFjLAkweGYxMTAsCTB4ZjMxMSwJMHhmMTFkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorfTsKKwordXNob3J0ICprZXlfbWFwc1tNQVhfTlJfS0VZTUFQU10gPSB7CisJcGxhaW5fbWFwLCBzaGlmdF9tYXAsIGFsdGdyX21hcCwgTlVMTCwKKwljdHJsX21hcCwgc2hpZnRfY3RybF9tYXAsIE5VTEwsIE5VTEwsCisJYWx0X21hcCwgTlVMTCwgTlVMTCwgTlVMTCwKKwljdHJsX2FsdF9tYXAsIE5VTEwKK307CisKK3Vuc2lnbmVkIGludCBrZXltYXBfY291bnQgPSA3OworCisvKgorICogUGhpbG9zb3BoeTogbW9zdCBwZW9wbGUgZG8gbm90IGRlZmluZSBtb3JlIHN0cmluZ3MsIGJ1dCB0aGV5IHdobyBkbworICogb2Z0ZW4gd2FudCBxdWl0ZSBhIGxvdCBvZiBzdHJpbmcgc3BhY2UuIFNvLCB3ZSBzdGF0aWNhbGx5IGFsbG9jYXRlCisgKiB0aGUgZGVmYXVsdCBhbmQgYWxsb2NhdGUgZHluYW1pY2FsbHkgaW4gY2h1bmtzIG9mIDUxMiBieXRlcy4KKyAqLworCitjaGFyIGZ1bmNfYnVmW10gPSB7CisJJ1wwMzMnLCAnWycsICdbJywgJ0EnLCAwLCAKKwknXDAzMycsICdbJywgJ1snLCAnQicsIDAsIAorCSdcMDMzJywgJ1snLCAnWycsICdDJywgMCwgCisJJ1wwMzMnLCAnWycsICdbJywgJ0QnLCAwLCAKKwknXDAzMycsICdbJywgJ1snLCAnRScsIDAsIAorCSdcMDMzJywgJ1snLCAnMScsICc3JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzEnLCAnOCcsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcxJywgJzknLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICcwJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnMScsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJzMnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICc0JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnNScsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJzYnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICc4JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnOScsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICczJywgJzEnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMycsICcyJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzMnLCAnMycsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICczJywgJzQnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMScsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzMnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnNCcsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICc1JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzYnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnTScsIDAsIAorCSdcMDMzJywgJ1snLCAnUCcsIDAsIAorfTsKKworY2hhciAqZnVuY2J1ZnB0ciA9IGZ1bmNfYnVmOworaW50IGZ1bmNidWZzaXplID0gc2l6ZW9mKGZ1bmNfYnVmKTsKK2ludCBmdW5jYnVmbGVmdCA9IDA7ICAgICAgICAgIC8qIHNwYWNlIGxlZnQgKi8KKworY2hhciAqZnVuY190YWJsZVtNQVhfTlJfRlVOQ10gPSB7CisJZnVuY19idWYgKyAwLAorCWZ1bmNfYnVmICsgNSwKKwlmdW5jX2J1ZiArIDEwLAorCWZ1bmNfYnVmICsgMTUsCisJZnVuY19idWYgKyAyMCwKKwlmdW5jX2J1ZiArIDI1LAorCWZ1bmNfYnVmICsgMzEsCisJZnVuY19idWYgKyAzNywKKwlmdW5jX2J1ZiArIDQzLAorCWZ1bmNfYnVmICsgNDksCisJZnVuY19idWYgKyA1NSwKKwlmdW5jX2J1ZiArIDYxLAorCWZ1bmNfYnVmICsgNjcsCisJZnVuY19idWYgKyA3MywKKwlmdW5jX2J1ZiArIDc5LAorCWZ1bmNfYnVmICsgODUsCisJZnVuY19idWYgKyA5MSwKKwlmdW5jX2J1ZiArIDk3LAorCWZ1bmNfYnVmICsgMTAzLAorCWZ1bmNfYnVmICsgMTA5LAorCWZ1bmNfYnVmICsgMTE1LAorCWZ1bmNfYnVmICsgMTIwLAorCWZ1bmNfYnVmICsgMTI1LAorCWZ1bmNfYnVmICsgMTMwLAorCWZ1bmNfYnVmICsgMTM1LAorCWZ1bmNfYnVmICsgMTQwLAorCWZ1bmNfYnVmICsgMTQ1LAorCU5VTEwsCisJTlVMTCwKKwlmdW5jX2J1ZiArIDE0OSwKKwlOVUxMLAorfTsKKworc3RydWN0IGtiZGlhY3IgYWNjZW50X3RhYmxlW01BWF9ESUFDUl0gPSB7CisJeydgJywgJ0EnLCAnXDMwMCd9LAl7J2AnLCAnYScsICdcMzQwJ30sCisJeydcJycsICdBJywgJ1wzMDEnfSwJeydcJycsICdhJywgJ1wzNDEnfSwKKwl7J14nLCAnQScsICdcMzAyJ30sCXsnXicsICdhJywgJ1wzNDInfSwKKwl7J34nLCAnQScsICdcMzAzJ30sCXsnficsICdhJywgJ1wzNDMnfSwKKwl7JyInLCAnQScsICdcMzA0J30sCXsnIicsICdhJywgJ1wzNDQnfSwKKwl7J08nLCAnQScsICdcMzA1J30sCXsnbycsICdhJywgJ1wzNDUnfSwKKwl7JzAnLCAnQScsICdcMzA1J30sCXsnMCcsICdhJywgJ1wzNDUnfSwKKwl7J0EnLCAnQScsICdcMzA1J30sCXsnYScsICdhJywgJ1wzNDUnfSwKKwl7J0EnLCAnRScsICdcMzA2J30sCXsnYScsICdlJywgJ1wzNDYnfSwKKwl7JywnLCAnQycsICdcMzA3J30sCXsnLCcsICdjJywgJ1wzNDcnfSwKKwl7J2AnLCAnRScsICdcMzEwJ30sCXsnYCcsICdlJywgJ1wzNTAnfSwKKwl7J1wnJywgJ0UnLCAnXDMxMSd9LAl7J1wnJywgJ2UnLCAnXDM1MSd9LAorCXsnXicsICdFJywgJ1wzMTInfSwJeydeJywgJ2UnLCAnXDM1Mid9LAorCXsnIicsICdFJywgJ1wzMTMnfSwJeyciJywgJ2UnLCAnXDM1Myd9LAorCXsnYCcsICdJJywgJ1wzMTQnfSwJeydgJywgJ2knLCAnXDM1NCd9LAorCXsnXCcnLCAnSScsICdcMzE1J30sCXsnXCcnLCAnaScsICdcMzU1J30sCisJeydeJywgJ0knLCAnXDMxNid9LAl7J14nLCAnaScsICdcMzU2J30sCisJeyciJywgJ0knLCAnXDMxNyd9LAl7JyInLCAnaScsICdcMzU3J30sCisJeyctJywgJ0QnLCAnXDMyMCd9LAl7Jy0nLCAnZCcsICdcMzYwJ30sCisJeyd+JywgJ04nLCAnXDMyMSd9LAl7J34nLCAnbicsICdcMzYxJ30sCisJeydgJywgJ08nLCAnXDMyMid9LAl7J2AnLCAnbycsICdcMzYyJ30sCisJeydcJycsICdPJywgJ1wzMjMnfSwJeydcJycsICdvJywgJ1wzNjMnfSwKKwl7J14nLCAnTycsICdcMzI0J30sCXsnXicsICdvJywgJ1wzNjQnfSwKKwl7J34nLCAnTycsICdcMzI1J30sCXsnficsICdvJywgJ1wzNjUnfSwKKwl7JyInLCAnTycsICdcMzI2J30sCXsnIicsICdvJywgJ1wzNjYnfSwKKwl7Jy8nLCAnTycsICdcMzMwJ30sCXsnLycsICdvJywgJ1wzNzAnfSwKKwl7J2AnLCAnVScsICdcMzMxJ30sCXsnYCcsICd1JywgJ1wzNzEnfSwKKwl7J1wnJywgJ1UnLCAnXDMzMid9LAl7J1wnJywgJ3UnLCAnXDM3Mid9LAorCXsnXicsICdVJywgJ1wzMzMnfSwJeydeJywgJ3UnLCAnXDM3Myd9LAorCXsnIicsICdVJywgJ1wzMzQnfSwJeyciJywgJ3UnLCAnXDM3NCd9LAorCXsnXCcnLCAnWScsICdcMzM1J30sCXsnXCcnLCAneScsICdcMzc1J30sCisJeydUJywgJ0gnLCAnXDMzNid9LAl7J3QnLCAnaCcsICdcMzc2J30sCisJeydzJywgJ3MnLCAnXDMzNyd9LAl7JyInLCAneScsICdcMzc3J30sCisJeydzJywgJ3onLCAnXDMzNyd9LAl7J2knLCAnaicsICdcMzc3J30sCit9OworCit1bnNpZ25lZCBpbnQgYWNjZW50X3RhYmxlX3NpemUgPSA2ODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kZWZrZXltYXAubWFwIGIvZHJpdmVycy9jaGFyL2RlZmtleW1hcC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiMzBjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kZWZrZXltYXAubWFwCkBAIC0wLDAgKzEsMzU3IEBACisjIERlZmF1bHQga2VybmVsIGtleW1hcC4gVGhpcyB1c2VzIDcgbW9kaWZpZXIgY29tYmluYXRpb25zLgora2V5bWFwcyAwLTIsNC01LDgsMTIKKyMgQ2hhbmdlIHRoZSBhYm92ZSBsaW5lIGludG8KKyMJa2V5bWFwcyAwLTIsNC02LDgsMTIKKyMgaW4gY2FzZSB5b3Ugd2FudCB0aGUgZW50cmllcworIwlhbHRnciAgIGNvbnRyb2wga2V5Y29kZSAgODMgPSBCb290ICAgICAgICAgICAgCisjCWFsdGdyICAgY29udHJvbCBrZXljb2RlIDExMSA9IEJvb3QgICAgICAgICAgICAKKyMgYmVsb3cuCisjCisjIEluIGZhY3QgQWx0R3IgaXMgdXNlZCB2ZXJ5IGxpdHRsZSwgYW5kIG9uZSBtb3JlIGtleW1hcCBjYW4KKyMgYmUgc2F2ZWQgYnkgbWFwcGluZyBBbHRHciB0byBBbHQgKGFuZCBhZGFwdGluZyBhIGZldyBlbnRyaWVzKToKKyMga2V5Y29kZSAxMDAgPSBBbHQKKyMKK2tleWNvZGUgICAxID0gRXNjYXBlICAgICAgICAgICBFc2NhcGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAgMSA9IE1ldGFfRXNjYXBlICAgICAKK2tleWNvZGUgICAyID0gb25lICAgICAgICAgICAgICBleGNsYW0gICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAgMiA9IE1ldGFfb25lICAgICAgICAKK2tleWNvZGUgICAzID0gdHdvICAgICAgICAgICAgICBhdCAgICAgICAgICAgICAgIGF0ICAgICAgICAgICAgICAKKwljb250cm9sCWtleWNvZGUgICAzID0gbnVsICAgICAgICAgICAgIAorCXNoaWZ0CWNvbnRyb2wJa2V5Y29kZSAgIDMgPSBudWwgICAgICAgICAgICAgCisJYWx0CWtleWNvZGUgICAzID0gTWV0YV90d28gICAgICAgIAora2V5Y29kZSAgIDQgPSB0aHJlZSAgICAgICAgICAgIG51bWJlcnNpZ24gICAgICAKKwljb250cm9sIGtleWNvZGUgICA0ID0gRXNjYXBlICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgIDQgPSBNZXRhX3RocmVlICAgICAgCitrZXljb2RlICAgNSA9IGZvdXIgICAgICAgICAgICAgZG9sbGFyICAgICAgICAgICBkb2xsYXIgICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICAgNSA9IENvbnRyb2xfYmFja3NsYXNoCisJYWx0ICAgICBrZXljb2RlICAgNSA9IE1ldGFfZm91ciAgICAgICAKK2tleWNvZGUgICA2ID0gZml2ZSAgICAgICAgICAgICBwZXJjZW50ICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICAgNiA9IENvbnRyb2xfYnJhY2tldHJpZ2h0CisJYWx0ICAgICBrZXljb2RlICAgNiA9IE1ldGFfZml2ZSAgICAgICAKK2tleWNvZGUgICA3ID0gc2l4ICAgICAgICAgICAgICBhc2NpaWNpcmN1bSAgICAgCisJY29udHJvbCBrZXljb2RlICAgNyA9IENvbnRyb2xfYXNjaWljaXJjdW0KKwlhbHQgICAgIGtleWNvZGUgICA3ID0gTWV0YV9zaXggICAgICAgIAora2V5Y29kZSAgIDggPSBzZXZlbiAgICAgICAgICAgIGFtcGVyc2FuZCAgICAgICAgYnJhY2VsZWZ0ICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgIDggPSBDb250cm9sX3VuZGVyc2NvcmUKKwlhbHQgICAgIGtleWNvZGUgICA4ID0gTWV0YV9zZXZlbiAgICAgIAora2V5Y29kZSAgIDkgPSBlaWdodCAgICAgICAgICAgIGFzdGVyaXNrICAgICAgICAgYnJhY2tldGxlZnQgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgIDkgPSBEZWxldGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAgOSA9IE1ldGFfZWlnaHQgICAgICAKK2tleWNvZGUgIDEwID0gbmluZSAgICAgICAgICAgICBwYXJlbmxlZnQgICAgICAgIGJyYWNrZXRyaWdodCAgICAKKwlhbHQgICAgIGtleWNvZGUgIDEwID0gTWV0YV9uaW5lICAgICAgIAora2V5Y29kZSAgMTEgPSB6ZXJvICAgICAgICAgICAgIHBhcmVucmlnaHQgICAgICAgYnJhY2VyaWdodCAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTEgPSBNZXRhX3plcm8gICAgICAgCitrZXljb2RlICAxMiA9IG1pbnVzICAgICAgICAgICAgdW5kZXJzY29yZSAgICAgICBiYWNrc2xhc2ggICAgICAgCisJY29udHJvbAlrZXljb2RlICAxMiA9IENvbnRyb2xfdW5kZXJzY29yZQorCXNoaWZ0CWNvbnRyb2wJa2V5Y29kZSAgMTIgPSBDb250cm9sX3VuZGVyc2NvcmUKKwlhbHQJa2V5Y29kZSAgMTIgPSBNZXRhX21pbnVzICAgICAgCitrZXljb2RlICAxMyA9IGVxdWFsICAgICAgICAgICAgcGx1cyAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTMgPSBNZXRhX2VxdWFsICAgICAgCitrZXljb2RlICAxNCA9IERlbGV0ZSAgICAgICAgICAgRGVsZXRlICAgICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTQgPSBCYWNrU3BhY2UKKwlhbHQgICAgIGtleWNvZGUgIDE0ID0gTWV0YV9EZWxldGUgICAgIAora2V5Y29kZSAgMTUgPSBUYWIgICAgICAgICAgICAgIFRhYiAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDE1ID0gTWV0YV9UYWIgICAgICAgIAora2V5Y29kZSAgMTYgPSBxICAgICAgICAgICAgICAgCitrZXljb2RlICAxNyA9IHcgICAgICAgICAgICAgICAKK2tleWNvZGUgIDE4ID0gZQorCWFsdGdyICAga2V5Y29kZSAgMTggPSBIZXhfRSAgIAora2V5Y29kZSAgMTkgPSByICAgICAgICAgICAgICAgCitrZXljb2RlICAyMCA9IHQgICAgICAgICAgICAgICAKK2tleWNvZGUgIDIxID0geSAgICAgICAgICAgICAgIAora2V5Y29kZSAgMjIgPSB1ICAgICAgICAgICAgICAgCitrZXljb2RlICAyMyA9IGkgICAgICAgICAgICAgICAKK2tleWNvZGUgIDI0ID0gbyAgICAgICAgICAgICAgIAora2V5Y29kZSAgMjUgPSBwICAgICAgICAgICAgICAgCitrZXljb2RlICAyNiA9IGJyYWNrZXRsZWZ0ICAgICAgYnJhY2VsZWZ0ICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMjYgPSBFc2NhcGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAyNiA9IE1ldGFfYnJhY2tldGxlZnQKK2tleWNvZGUgIDI3ID0gYnJhY2tldHJpZ2h0ICAgICBicmFjZXJpZ2h0ICAgICAgIGFzY2lpdGlsZGUgICAgICAKKwljb250cm9sIGtleWNvZGUgIDI3ID0gQ29udHJvbF9icmFja2V0cmlnaHQKKwlhbHQgICAgIGtleWNvZGUgIDI3ID0gTWV0YV9icmFja2V0cmlnaHQKK2tleWNvZGUgIDI4ID0gUmV0dXJuICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMjggPSBNZXRhX0NvbnRyb2xfbSAgCitrZXljb2RlICAyOSA9IENvbnRyb2wgICAgICAgICAKK2tleWNvZGUgIDMwID0gYQorCWFsdGdyICAga2V5Y29kZSAgMzAgPSBIZXhfQQora2V5Y29kZSAgMzEgPSBzICAgICAgICAgICAgICAgCitrZXljb2RlICAzMiA9IGQKKwlhbHRnciAgIGtleWNvZGUgIDMyID0gSGV4X0QgICAKK2tleWNvZGUgIDMzID0gZgorCWFsdGdyICAga2V5Y29kZSAgMzMgPSBIZXhfRiAgICAgICAgICAgICAgIAora2V5Y29kZSAgMzQgPSBnICAgICAgICAgICAgICAgCitrZXljb2RlICAzNSA9IGggICAgICAgICAgICAgICAKK2tleWNvZGUgIDM2ID0gaiAgICAgICAgICAgICAgIAora2V5Y29kZSAgMzcgPSBrICAgICAgICAgICAgICAgCitrZXljb2RlICAzOCA9IGwgICAgICAgICAgICAgICAKK2tleWNvZGUgIDM5ID0gc2VtaWNvbG9uICAgICAgICBjb2xvbiAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAzOSA9IE1ldGFfc2VtaWNvbG9uICAKK2tleWNvZGUgIDQwID0gYXBvc3Ryb3BoZSAgICAgICBxdW90ZWRibCAgICAgICAgCisJY29udHJvbCBrZXljb2RlICA0MCA9IENvbnRyb2xfZyAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDQwID0gTWV0YV9hcG9zdHJvcGhlIAora2V5Y29kZSAgNDEgPSBncmF2ZSAgICAgICAgICAgIGFzY2lpdGlsZGUgICAgICAKKwljb250cm9sIGtleWNvZGUgIDQxID0gbnVsICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNDEgPSBNZXRhX2dyYXZlICAgICAgCitrZXljb2RlICA0MiA9IFNoaWZ0ICAgICAgICAgICAKK2tleWNvZGUgIDQzID0gYmFja3NsYXNoICAgICAgICBiYXIgICAgICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICA0MyA9IENvbnRyb2xfYmFja3NsYXNoCisJYWx0ICAgICBrZXljb2RlICA0MyA9IE1ldGFfYmFja3NsYXNoICAKK2tleWNvZGUgIDQ0ID0geiAgICAgICAgICAgICAgIAora2V5Y29kZSAgNDUgPSB4ICAgICAgICAgICAgICAgCitrZXljb2RlICA0NiA9IGMKKwlhbHRnciAgIGtleWNvZGUgIDQ2ID0gSGV4X0MgICAKK2tleWNvZGUgIDQ3ID0gdiAgICAgICAgICAgICAgIAora2V5Y29kZSAgNDggPSBiCisJYWx0Z3IgICBrZXljb2RlICA0OCA9IEhleF9CCitrZXljb2RlICA0OSA9IG4gICAgICAgICAgICAgICAKK2tleWNvZGUgIDUwID0gbSAgICAgICAgICAgICAgIAora2V5Y29kZSAgNTEgPSBjb21tYSAgICAgICAgICAgIGxlc3MgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDUxID0gTWV0YV9jb21tYSAgICAgIAora2V5Y29kZSAgNTIgPSBwZXJpb2QgICAgICAgICAgIGdyZWF0ZXIgICAgICAgICAKKwljb250cm9sIGtleWNvZGUgIDUyID0gQ29tcG9zZSAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNTIgPSBNZXRhX3BlcmlvZCAgICAgCitrZXljb2RlICA1MyA9IHNsYXNoICAgICAgICAgICAgcXVlc3Rpb24gICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgNTMgPSBEZWxldGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA1MyA9IE1ldGFfc2xhc2ggICAgICAKK2tleWNvZGUgIDU0ID0gU2hpZnQgICAgICAgICAgIAora2V5Y29kZSAgNTUgPSBLUF9NdWx0aXBseSAgICAgCitrZXljb2RlICA1NiA9IEFsdCAgICAgICAgICAgICAKK2tleWNvZGUgIDU3ID0gc3BhY2UgICAgICAgICAgICBzcGFjZSAgICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICA1NyA9IG51bCAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDU3ID0gTWV0YV9zcGFjZSAgICAgIAora2V5Y29kZSAgNTggPSBDYXBzX0xvY2sgICAgICAgCitrZXljb2RlICA1OSA9IEYxICAgICAgICAgICAgICAgRjExICAgICAgICAgICAgICBDb25zb2xlXzEzICAgICAgCisJY29udHJvbCBrZXljb2RlICA1OSA9IEYxICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDU5ID0gQ29uc29sZV8xICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICA1OSA9IENvbnNvbGVfMSAgICAgICAKK2tleWNvZGUgIDYwID0gRjIgICAgICAgICAgICAgICBGMTIgICAgICAgICAgICAgIENvbnNvbGVfMTQgICAgICAKKwljb250cm9sIGtleWNvZGUgIDYwID0gRjIgICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNjAgPSBDb25zb2xlXzIgICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDYwID0gQ29uc29sZV8yICAgICAgIAora2V5Y29kZSAgNjEgPSBGMyAgICAgICAgICAgICAgIEYxMyAgICAgICAgICAgICAgQ29uc29sZV8xNSAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgNjEgPSBGMyAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA2MSA9IENvbnNvbGVfMyAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgNjEgPSBDb25zb2xlXzMgICAgICAgCitrZXljb2RlICA2MiA9IEY0ICAgICAgICAgICAgICAgRjE0ICAgICAgICAgICAgICBDb25zb2xlXzE2ICAgICAgCisJY29udHJvbCBrZXljb2RlICA2MiA9IEY0ICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDYyID0gQ29uc29sZV80ICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICA2MiA9IENvbnNvbGVfNCAgICAgICAKK2tleWNvZGUgIDYzID0gRjUgICAgICAgICAgICAgICBGMTUgICAgICAgICAgICAgIENvbnNvbGVfMTcgICAgICAKKwljb250cm9sIGtleWNvZGUgIDYzID0gRjUgICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNjMgPSBDb25zb2xlXzUgICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDYzID0gQ29uc29sZV81ICAgICAgIAora2V5Y29kZSAgNjQgPSBGNiAgICAgICAgICAgICAgIEYxNiAgICAgICAgICAgICAgQ29uc29sZV8xOCAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgNjQgPSBGNiAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA2NCA9IENvbnNvbGVfNiAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgNjQgPSBDb25zb2xlXzYgICAgICAgCitrZXljb2RlICA2NSA9IEY3ICAgICAgICAgICAgICAgRjE3ICAgICAgICAgICAgICBDb25zb2xlXzE5ICAgICAgCisJY29udHJvbCBrZXljb2RlICA2NSA9IEY3ICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDY1ID0gQ29uc29sZV83ICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICA2NSA9IENvbnNvbGVfNyAgICAgICAKK2tleWNvZGUgIDY2ID0gRjggICAgICAgICAgICAgICBGMTggICAgICAgICAgICAgIENvbnNvbGVfMjAgICAgICAKKwljb250cm9sIGtleWNvZGUgIDY2ID0gRjggICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNjYgPSBDb25zb2xlXzggICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDY2ID0gQ29uc29sZV84ICAgICAgIAora2V5Y29kZSAgNjcgPSBGOSAgICAgICAgICAgICAgIEYxOSAgICAgICAgICAgICAgQ29uc29sZV8yMSAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgNjcgPSBGOSAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA2NyA9IENvbnNvbGVfOSAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgNjcgPSBDb25zb2xlXzkgICAgICAgCitrZXljb2RlICA2OCA9IEYxMCAgICAgICAgICAgICAgRjIwICAgICAgICAgICAgICBDb25zb2xlXzIyICAgICAgCisJY29udHJvbCBrZXljb2RlICA2OCA9IEYxMCAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDY4ID0gQ29uc29sZV8xMCAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICA2OCA9IENvbnNvbGVfMTAgICAgICAKK2tleWNvZGUgIDY5ID0gTnVtX0xvY2sKKwlzaGlmdCAgIGtleWNvZGUgIDY5ID0gQmFyZV9OdW1fTG9jawora2V5Y29kZSAgNzAgPSBTY3JvbGxfTG9jayAgICAgIFNob3dfTWVtb3J5ICAgICAgU2hvd19SZWdpc3RlcnMgIAorCWNvbnRyb2wga2V5Y29kZSAgNzAgPSBTaG93X1N0YXRlICAgICAgCisJYWx0ICAgICBrZXljb2RlICA3MCA9IFNjcm9sbF9Mb2NrICAgICAKK2tleWNvZGUgIDcxID0gS1BfNyAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNzEgPSBBc2NpaV83ICAgICAgICAgCisJYWx0Z3IgICBrZXljb2RlICA3MSA9IEhleF83ICAgICAgICAgCitrZXljb2RlICA3MiA9IEtQXzggICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDcyID0gQXNjaWlfOCAgICAgICAgIAorCWFsdGdyICAga2V5Y29kZSAgNzIgPSBIZXhfOCAgICAgICAgIAora2V5Y29kZSAgNzMgPSBLUF85ICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA3MyA9IEFzY2lpXzkgICAgICAgICAKKwlhbHRnciAgIGtleWNvZGUgIDczID0gSGV4XzkgICAgICAgICAKK2tleWNvZGUgIDc0ID0gS1BfU3VidHJhY3QgICAgIAora2V5Y29kZSAgNzUgPSBLUF80ICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA3NSA9IEFzY2lpXzQgICAgICAgICAKKwlhbHRnciAgIGtleWNvZGUgIDc1ID0gSGV4XzQgICAgICAgICAKK2tleWNvZGUgIDc2ID0gS1BfNSAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNzYgPSBBc2NpaV81ICAgICAgICAgCisJYWx0Z3IgICBrZXljb2RlICA3NiA9IEhleF81ICAgICAgICAgCitrZXljb2RlICA3NyA9IEtQXzYgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDc3ID0gQXNjaWlfNiAgICAgICAgIAorCWFsdGdyICAga2V5Y29kZSAgNzcgPSBIZXhfNiAgICAgICAgIAora2V5Y29kZSAgNzggPSBLUF9BZGQgICAgICAgICAgCitrZXljb2RlICA3OSA9IEtQXzEgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDc5ID0gQXNjaWlfMSAgICAgICAgIAorCWFsdGdyICAga2V5Y29kZSAgNzkgPSBIZXhfMSAgICAgICAgIAora2V5Y29kZSAgODAgPSBLUF8yICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA4MCA9IEFzY2lpXzIgICAgICAgICAKKwlhbHRnciAgIGtleWNvZGUgIDgwID0gSGV4XzIgICAgICAgICAKK2tleWNvZGUgIDgxID0gS1BfMyAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgODEgPSBBc2NpaV8zICAgICAgICAgCisJYWx0Z3IgICBrZXljb2RlICA4MSA9IEhleF8zICAgICAgICAgCitrZXljb2RlICA4MiA9IEtQXzAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDgyID0gQXNjaWlfMCAgICAgICAgIAorCWFsdGdyICAga2V5Y29kZSAgODIgPSBIZXhfMCAgICAgICAgIAora2V5Y29kZSAgODMgPSBLUF9QZXJpb2QgICAgICAgCisjCWFsdGdyICAgY29udHJvbCBrZXljb2RlICA4MyA9IEJvb3QgICAgICAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgODMgPSBCb290ICAgICAgICAgICAgCitrZXljb2RlICA4NCA9IExhc3RfQ29uc29sZSAgICAKK2tleWNvZGUgIDg1ID0KK2tleWNvZGUgIDg2ID0gbGVzcyAgICAgICAgICAgICBncmVhdGVyICAgICAgICAgIGJhciAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDg2ID0gTWV0YV9sZXNzICAgICAgIAora2V5Y29kZSAgODcgPSBGMTEgICAgICAgICAgICAgIEYxMSAgICAgICAgICAgICAgQ29uc29sZV8yMyAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgODcgPSBGMTEgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA4NyA9IENvbnNvbGVfMTEgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgODcgPSBDb25zb2xlXzExICAgICAgCitrZXljb2RlICA4OCA9IEYxMiAgICAgICAgICAgICAgRjEyICAgICAgICAgICAgICBDb25zb2xlXzI0ICAgICAgCisJY29udHJvbCBrZXljb2RlICA4OCA9IEYxMiAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDg4ID0gQ29uc29sZV8xMiAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICA4OCA9IENvbnNvbGVfMTIgICAgICAKK2tleWNvZGUgIDg5ID0KK2tleWNvZGUgIDkwID0KK2tleWNvZGUgIDkxID0KK2tleWNvZGUgIDkyID0KK2tleWNvZGUgIDkzID0KK2tleWNvZGUgIDk0ID0KK2tleWNvZGUgIDk1ID0KK2tleWNvZGUgIDk2ID0gS1BfRW50ZXIgICAgICAgIAora2V5Y29kZSAgOTcgPSBDb250cm9sICAgICAgICAgCitrZXljb2RlICA5OCA9IEtQX0RpdmlkZSAgICAgICAKK2tleWNvZGUgIDk5ID0gQ29udHJvbF9iYWNrc2xhc2gKKwljb250cm9sIGtleWNvZGUgIDk5ID0gQ29udHJvbF9iYWNrc2xhc2gKKwlhbHQgICAgIGtleWNvZGUgIDk5ID0gQ29udHJvbF9iYWNrc2xhc2gKK2tleWNvZGUgMTAwID0gQWx0R3IgICAgICAgICAgIAora2V5Y29kZSAxMDEgPSBCcmVhayAgICAgICAgICAgCitrZXljb2RlIDEwMiA9IEZpbmQgICAgICAgICAgICAKK2tleWNvZGUgMTAzID0gVXAgICAgICAgICAgICAgIAora2V5Y29kZSAxMDQgPSBQcmlvciAgICAgICAgICAgCisJc2hpZnQgICBrZXljb2RlIDEwNCA9IFNjcm9sbF9CYWNrd2FyZCAKK2tleWNvZGUgMTA1ID0gTGVmdCAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAxMDUgPSBEZWNyX0NvbnNvbGUKK2tleWNvZGUgMTA2ID0gUmlnaHQgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAxMDYgPSBJbmNyX0NvbnNvbGUKK2tleWNvZGUgMTA3ID0gU2VsZWN0ICAgICAgICAgIAora2V5Y29kZSAxMDggPSBEb3duICAgICAgICAgICAgCitrZXljb2RlIDEwOSA9IE5leHQgICAgICAgICAgICAKKwlzaGlmdCAgIGtleWNvZGUgMTA5ID0gU2Nyb2xsX0ZvcndhcmQgIAora2V5Y29kZSAxMTAgPSBJbnNlcnQgICAgICAgICAgCitrZXljb2RlIDExMSA9IFJlbW92ZSAgICAgICAgICAKKyMJYWx0Z3IgICBjb250cm9sIGtleWNvZGUgMTExID0gQm9vdCAgICAgICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlIDExMSA9IEJvb3QgICAgICAgICAgICAKK2tleWNvZGUgMTEyID0gTWFjcm8gICAgICAgICAgIAora2V5Y29kZSAxMTMgPSBGMTMgICAgICAgICAgICAgCitrZXljb2RlIDExNCA9IEYxNCAgICAgICAgICAgICAKK2tleWNvZGUgMTE1ID0gSGVscCAgICAgICAgICAgIAora2V5Y29kZSAxMTYgPSBEbyAgICAgICAgICAgICAgCitrZXljb2RlIDExNyA9IEYxNyAgICAgICAgICAgICAKK2tleWNvZGUgMTE4ID0gS1BfTWluUGx1cyAgICAgIAora2V5Y29kZSAxMTkgPSBQYXVzZSAgICAgICAgICAgCitrZXljb2RlIDEyMCA9CitrZXljb2RlIDEyMSA9CitrZXljb2RlIDEyMiA9CitrZXljb2RlIDEyMyA9CitrZXljb2RlIDEyNCA9CitrZXljb2RlIDEyNSA9CitrZXljb2RlIDEyNiA9CitrZXljb2RlIDEyNyA9CitzdHJpbmcgRjEgPSAiXDAzM1tbQSIKK3N0cmluZyBGMiA9ICJcMDMzW1tCIgorc3RyaW5nIEYzID0gIlwwMzNbW0MiCitzdHJpbmcgRjQgPSAiXDAzM1tbRCIKK3N0cmluZyBGNSA9ICJcMDMzW1tFIgorc3RyaW5nIEY2ID0gIlwwMzNbMTd+Igorc3RyaW5nIEY3ID0gIlwwMzNbMTh+Igorc3RyaW5nIEY4ID0gIlwwMzNbMTl+Igorc3RyaW5nIEY5ID0gIlwwMzNbMjB+Igorc3RyaW5nIEYxMCA9ICJcMDMzWzIxfiIKK3N0cmluZyBGMTEgPSAiXDAzM1syM34iCitzdHJpbmcgRjEyID0gIlwwMzNbMjR+Igorc3RyaW5nIEYxMyA9ICJcMDMzWzI1fiIKK3N0cmluZyBGMTQgPSAiXDAzM1syNn4iCitzdHJpbmcgRjE1ID0gIlwwMzNbMjh+Igorc3RyaW5nIEYxNiA9ICJcMDMzWzI5fiIKK3N0cmluZyBGMTcgPSAiXDAzM1szMX4iCitzdHJpbmcgRjE4ID0gIlwwMzNbMzJ+Igorc3RyaW5nIEYxOSA9ICJcMDMzWzMzfiIKK3N0cmluZyBGMjAgPSAiXDAzM1szNH4iCitzdHJpbmcgRmluZCA9ICJcMDMzWzF+Igorc3RyaW5nIEluc2VydCA9ICJcMDMzWzJ+Igorc3RyaW5nIFJlbW92ZSA9ICJcMDMzWzN+Igorc3RyaW5nIFNlbGVjdCA9ICJcMDMzWzR+Igorc3RyaW5nIFByaW9yID0gIlwwMzNbNX4iCitzdHJpbmcgTmV4dCA9ICJcMDMzWzZ+Igorc3RyaW5nIE1hY3JvID0gIlwwMzNbTSIKK3N0cmluZyBQYXVzZSA9ICJcMDMzW1AiCitjb21wb3NlICdgJyAnQScgdG8gJ8AnCitjb21wb3NlICdgJyAnYScgdG8gJ+AnCitjb21wb3NlICdcJycgJ0EnIHRvICfBJworY29tcG9zZSAnXCcnICdhJyB0byAn4ScKK2NvbXBvc2UgJ14nICdBJyB0byAnwicKK2NvbXBvc2UgJ14nICdhJyB0byAn4icKK2NvbXBvc2UgJ34nICdBJyB0byAnwycKK2NvbXBvc2UgJ34nICdhJyB0byAn4ycKK2NvbXBvc2UgJyInICdBJyB0byAnxCcKK2NvbXBvc2UgJyInICdhJyB0byAn5CcKK2NvbXBvc2UgJ08nICdBJyB0byAnxScKK2NvbXBvc2UgJ28nICdhJyB0byAn5ScKK2NvbXBvc2UgJzAnICdBJyB0byAnxScKK2NvbXBvc2UgJzAnICdhJyB0byAn5ScKK2NvbXBvc2UgJ0EnICdBJyB0byAnxScKK2NvbXBvc2UgJ2EnICdhJyB0byAn5ScKK2NvbXBvc2UgJ0EnICdFJyB0byAnxicKK2NvbXBvc2UgJ2EnICdlJyB0byAn5icKK2NvbXBvc2UgJywnICdDJyB0byAnxycKK2NvbXBvc2UgJywnICdjJyB0byAn5ycKK2NvbXBvc2UgJ2AnICdFJyB0byAnyCcKK2NvbXBvc2UgJ2AnICdlJyB0byAn6CcKK2NvbXBvc2UgJ1wnJyAnRScgdG8gJ8knCitjb21wb3NlICdcJycgJ2UnIHRvICfpJworY29tcG9zZSAnXicgJ0UnIHRvICfKJworY29tcG9zZSAnXicgJ2UnIHRvICfqJworY29tcG9zZSAnIicgJ0UnIHRvICfLJworY29tcG9zZSAnIicgJ2UnIHRvICfrJworY29tcG9zZSAnYCcgJ0knIHRvICfMJworY29tcG9zZSAnYCcgJ2knIHRvICfsJworY29tcG9zZSAnXCcnICdJJyB0byAnzScKK2NvbXBvc2UgJ1wnJyAnaScgdG8gJ+0nCitjb21wb3NlICdeJyAnSScgdG8gJ84nCitjb21wb3NlICdeJyAnaScgdG8gJ+4nCitjb21wb3NlICciJyAnSScgdG8gJ88nCitjb21wb3NlICciJyAnaScgdG8gJ+8nCitjb21wb3NlICctJyAnRCcgdG8gJ9AnCitjb21wb3NlICctJyAnZCcgdG8gJ/AnCitjb21wb3NlICd+JyAnTicgdG8gJ9EnCitjb21wb3NlICd+JyAnbicgdG8gJ/EnCitjb21wb3NlICdgJyAnTycgdG8gJ9InCitjb21wb3NlICdgJyAnbycgdG8gJ/InCitjb21wb3NlICdcJycgJ08nIHRvICfTJworY29tcG9zZSAnXCcnICdvJyB0byAn8ycKK2NvbXBvc2UgJ14nICdPJyB0byAn1CcKK2NvbXBvc2UgJ14nICdvJyB0byAn9CcKK2NvbXBvc2UgJ34nICdPJyB0byAn1ScKK2NvbXBvc2UgJ34nICdvJyB0byAn9ScKK2NvbXBvc2UgJyInICdPJyB0byAn1icKK2NvbXBvc2UgJyInICdvJyB0byAn9icKK2NvbXBvc2UgJy8nICdPJyB0byAn2CcKK2NvbXBvc2UgJy8nICdvJyB0byAn+CcKK2NvbXBvc2UgJ2AnICdVJyB0byAn2ScKK2NvbXBvc2UgJ2AnICd1JyB0byAn+ScKK2NvbXBvc2UgJ1wnJyAnVScgdG8gJ9onCitjb21wb3NlICdcJycgJ3UnIHRvICf6JworY29tcG9zZSAnXicgJ1UnIHRvICfbJworY29tcG9zZSAnXicgJ3UnIHRvICf7JworY29tcG9zZSAnIicgJ1UnIHRvICfcJworY29tcG9zZSAnIicgJ3UnIHRvICf8JworY29tcG9zZSAnXCcnICdZJyB0byAn3ScKK2NvbXBvc2UgJ1wnJyAneScgdG8gJ/0nCitjb21wb3NlICdUJyAnSCcgdG8gJ94nCitjb21wb3NlICd0JyAnaCcgdG8gJ/4nCitjb21wb3NlICdzJyAncycgdG8gJ98nCitjb21wb3NlICciJyAneScgdG8gJ/8nCitjb21wb3NlICdzJyAneicgdG8gJ98nCitjb21wb3NlICdpJyAnaicgdG8gJ/8nCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZGlnaS5oIGIvZHJpdmVycy9jaGFyL2RpZ2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWRmMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RpZ2kuaApAQCAtMCwwICsxLDcxIEBACisvKiAgICAgICAgICBEZWZpbml0aW9ucyBmb3IgRGlnaUJvYXJkIGRpdHR5KDEpIGNvbW1hbmQuICAgICAgICAgICAgICAgICAqLworCisjaWYgIWRlZmluZWQoVElPQ01PREcpCisjZGVmaW5lCVRJT0NNT0RHCSgoJ2QnPDw4KSB8IDI1MCkJCS8qIGdldCBtb2RlbSBjdHJsIHN0YXRlCSovCisjZGVmaW5lCVRJT0NNT0RTCSgoJ2QnPDw4KSB8IDI1MSkJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFRJT0NNU0VUKQorI2RlZmluZQlUSU9DTVNFVAkoKCdkJzw8OCkgfCAyNTIpCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2RlZmluZQlUSU9DTUdFVAkoKCdkJzw8OCkgfCAyNTMpCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChUSU9DTUJJQykKKyNkZWZpbmUJVElPQ01CSUMJKCgnZCc8PDgpIHwgMjU0KQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KKyNkZWZpbmUJVElPQ01CSVMJKCgnZCc8PDgpIHwgMjU1KQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVElPQ1NEVFIpCisjZGVmaW5lCVRJT0NTRFRSCSgoJ2UnPDw4KSB8IDApCQkvKiBzZXQgRFRSCQkqLworI2RlZmluZQlUSU9DQ0RUUgkoKCdlJzw8OCkgfCAxKQkJLyogY2xlYXIgRFRSCQkqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElvY3RsIGNvbW1hbmQgYXJndW1lbnRzIGZvciBESUdJIHBhcmFtZXRlcnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBESUdJX0dFVEEJKCgnZSc8PDgpIHwgOTQpCQkvKiBSZWFkIHBhcmFtcwkJKi8KKworI2RlZmluZSBESUdJX1NFVEEJKCgnZSc8PDgpIHwgOTUpCQkvKiBTZXQgcGFyYW1zCQkqLworI2RlZmluZSBESUdJX1NFVEFXCSgoJ2UnPDw4KSB8IDk2KQkJLyogRHJhaW4gJiBzZXQgcGFyYW1zCSovCisjZGVmaW5lIERJR0lfU0VUQUYJKCgnZSc8PDgpIHwgOTcpCQkvKiBEcmFpbiwgZmx1c2ggJiBzZXQgcGFyYW1zICovCisKKyNkZWZpbmUJRElHSV9HRVRGTE9XCSgoJ2UnPDw4KSB8IDk5KQkJLyogR2V0IHN0YXJ0Yy9zdG9wYyBmbG93ICovCisJCQkJCQkvKiBjb250cm9sIGNoYXJhY3RlcnMgCSAqLworI2RlZmluZQlESUdJX1NFVEZMT1cJKCgnZSc8PDgpIHwgMTAwKQkJLyogU2V0IHN0YXJ0Yy9zdG9wYyBmbG93ICovCisJCQkJCQkvKiBjb250cm9sIGNoYXJhY3RlcnMJICovCisjZGVmaW5lCURJR0lfR0VUQUZMT1cJKCgnZSc8PDgpIHwgMTAxKQkJLyogR2V0IEF1eC4gc3RhcnRjL3N0b3BjICovCisJCQkJCQkvKiBmbG93IGNvbnRyb2wgY2hhcnMgCSAqLworI2RlZmluZQlESUdJX1NFVEFGTE9XCSgoJ2UnPDw4KSB8IDEwMikJCS8qIFNldCBBdXguIHN0YXJ0Yy9zdG9wYyAqLworCQkJCQkJLyogZmxvdyBjb250cm9sIGNoYXJzCSAqLworCitzdHJ1Y3QJZGlnaWZsb3dfc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyCXN0YXJ0YzsJCQkJLyogZmxvdyBjbnRsIHN0YXJ0IGNoYXIJKi8KKwl1bnNpZ25lZCBjaGFyCXN0b3BjOwkJCQkvKiBmbG93IGNudGwgc3RvcCBjaGFyCSovCit9OworCit0eXBlZGVmIHN0cnVjdCBkaWdpZmxvd19zdHJ1Y3QgZGlnaWZsb3dfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYWx1ZXMgZm9yIGRpZ2lfZmxhZ3MgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBESUdJX0lYT04JMHgwMDAxCQkvKiBIYW5kbGUgSVhPTiBpbiB0aGUgRkVQCSovCisjZGVmaW5lIERJR0lfRkFTVAkweDAwMDIJCS8qIEZhc3QgYmF1ZCByYXRlcwkJKi8KKyNkZWZpbmUgUlRTUEFDRQkJMHgwMDA0CQkvKiBSVFMgaW5wdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIENUU1BBQ0UJCTB4MDAwOAkJLyogQ1RTIG91dHB1dCBmbG93IGNvbnRyb2wJKi8KKyNkZWZpbmUgRFNSUEFDRQkJMHgwMDEwCQkvKiBEU1Igb3V0cHV0IGZsb3cgY29udHJvbAkqLworI2RlZmluZSBEQ0RQQUNFCQkweDAwMjAJCS8qIERDRCBvdXRwdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIERUUlBBQ0UJCTB4MDA0MAkJLyogRFRSIGlucHV0IGZsb3cgY29udHJvbAkqLworI2RlZmluZSBESUdJX0ZPUkNFRENECTB4MDEwMAkJLyogRm9yY2UgY2FycmllcgkJKi8KKyNkZWZpbmUJRElHSV9BTFRQSU4JMHgwMjAwCQkvKiBBbHRlcm5hdGUgUkotNDUgcGluIGNvbmZpZwkqLworI2RlZmluZQlESUdJX0FJWE9OCTB4MDQwMAkJLyogQXV4IGZsb3cgY29udHJvbCBpbiBmZXAJKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdHJ1Y3R1cmUgdXNlZCB3aXRoIGlvY3RsIGNvbW1hbmRzIGZvciBESUdJIHBhcmFtZXRlcnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGRpZ2lfc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydAlkaWdpX2ZsYWdzOwkJLyogRmxhZ3MgKHNlZSBhYm92ZSkJKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGRpZ2lfc3RydWN0IGRpZ2lfdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kaWdpMS5oIGIvZHJpdmVycy9jaGFyL2RpZ2kxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0Mzc4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kaWdpMS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKiAgICAgICAgICBEZWZpbml0aW9ucyBmb3IgRGlnaUJvYXJkIGRpdHR5KDEpIGNvbW1hbmQuICAgICAgICAgICAgICAgICAqLworCisjaWYgIWRlZmluZWQoVElPQ01PREcpCisjZGVmaW5lCVRJT0NNT0RHCSgnZCc8PDgpIHwgMjUwCQkvKiBnZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2RlZmluZQlUSU9DTU9EUwkoJ2QnPDw4KSB8IDI1MQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVElPQ01TRVQpCisjZGVmaW5lCVRJT0NNU0VUCSgnZCc8PDgpIHwgMjUyCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2RlZmluZQlUSU9DTUdFVAkoJ2QnPDw4KSB8IDI1MwkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVElPQ01CSUMpCisjZGVmaW5lCVRJT0NNQklDCSgnZCc8PDgpIHwgMjU0CQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZSAqLworI2RlZmluZQlUSU9DTUJJUwkoJ2QnPDw4KSB8IDI1NQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVElPQ1NEVFIpCisjZGVmaW5lCVRJT0NTRFRSCSgnZSc8PDgpIHwgMAkJLyogc2V0IERUUgkJKi8KKyNkZWZpbmUJVElPQ0NEVFIJKCdlJzw8OCkgfCAxCQkvKiBjbGVhciBEVFIJCSovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW9jdGwgY29tbWFuZCBhcmd1bWVudHMgZm9yIERJR0kgcGFyYW1ldGVycy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERJR0lfR0VUQQkoJ2UnPDw4KSB8IDk0CQkvKiBSZWFkIHBhcmFtcwkJKi8KKworI2RlZmluZSBESUdJX1NFVEEJKCdlJzw8OCkgfCA5NQkJLyogU2V0IHBhcmFtcwkJKi8KKyNkZWZpbmUgRElHSV9TRVRBVwkoJ2UnPDw4KSB8IDk2CQkvKiBEcmFpbiAmIHNldCBwYXJhbXMJKi8KKyNkZWZpbmUgRElHSV9TRVRBRgkoJ2UnPDw4KSB8IDk3CQkvKiBEcmFpbiwgZmx1c2ggJiBzZXQgcGFyYW1zICovCisKKyNkZWZpbmUJRElHSV9HRVRGTE9XCSgnZSc8PDgpIHwgOTkJCS8qIEdldCBzdGFydGMvc3RvcGMgZmxvdyAqLworCQkJCQkJLyogY29udHJvbCBjaGFyYWN0ZXJzIAkgKi8KKyNkZWZpbmUJRElHSV9TRVRGTE9XCSgnZSc8PDgpIHwgMTAwCQkvKiBTZXQgc3RhcnRjL3N0b3BjIGZsb3cgKi8KKwkJCQkJCS8qIGNvbnRyb2wgY2hhcmFjdGVycwkgKi8KKyNkZWZpbmUJRElHSV9HRVRBRkxPVwkoJ2UnPDw4KSB8IDEwMQkJLyogR2V0IEF1eC4gc3RhcnRjL3N0b3BjICovCisJCQkJCQkvKiBmbG93IGNvbnRyb2wgY2hhcnMgCSAqLworI2RlZmluZQlESUdJX1NFVEFGTE9XCSgnZSc8PDgpIHwgMTAyCQkvKiBTZXQgQXV4LiBzdGFydGMvc3RvcGMgKi8KKwkJCQkJCS8qIGZsb3cgY29udHJvbCBjaGFycwkgKi8KKworI2RlZmluZQlESUdJX0dFVElORk8JKCdlJzw8OCkgfCAxMDMJCS8qIEZpbGwgaW4gZGlnaV9pbmZvICovCisjZGVmaW5lCURJR0lfUE9MTEVSCSgnZSc8PDgpIHwgMTA0CQkvKiBUdXJuIG9uL29mZiBwb2xsZXIgKi8KKyNkZWZpbmUJRElHSV9JTklUCSgnZSc8PDgpIHwgMTA1CQkvKiBBbGxvdyB0aGluZ3MgdG8gcnVuLiAqLworCitzdHJ1Y3QJZGlnaWZsb3dfc3RydWN0IAoreworCXVuc2lnbmVkIGNoYXIJc3RhcnRjOwkJCQkvKiBmbG93IGNudGwgc3RhcnQgY2hhcgkqLworCXVuc2lnbmVkIGNoYXIJc3RvcGM7CQkJCS8qIGZsb3cgY250bCBzdG9wIGNoYXIJKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGRpZ2lmbG93X3N0cnVjdCBkaWdpZmxvd190OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhbHVlcyBmb3IgZGlnaV9mbGFncyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERJR0lfSVhPTgkweDAwMDEJCS8qIEhhbmRsZSBJWE9OIGluIHRoZSBGRVAJKi8KKyNkZWZpbmUgRElHSV9GQVNUCTB4MDAwMgkJLyogRmFzdCBiYXVkIHJhdGVzCQkqLworI2RlZmluZSBSVFNQQUNFCQkweDAwMDQJCS8qIFJUUyBpbnB1dCBmbG93IGNvbnRyb2wJKi8KKyNkZWZpbmUgQ1RTUEFDRQkJMHgwMDA4CQkvKiBDVFMgb3V0cHV0IGZsb3cgY29udHJvbAkqLworI2RlZmluZSBEU1JQQUNFCQkweDAwMTAJCS8qIERTUiBvdXRwdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIERDRFBBQ0UJCTB4MDAyMAkJLyogRENEIG91dHB1dCBmbG93IGNvbnRyb2wJKi8KKyNkZWZpbmUgRFRSUEFDRQkJMHgwMDQwCQkvKiBEVFIgaW5wdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIERJR0lfRk9SQ0VEQ0QJMHgwMTAwCQkvKiBGb3JjZSBjYXJyaWVyCQkqLworI2RlZmluZQlESUdJX0FMVFBJTgkweDAyMDAJCS8qIEFsdGVybmF0ZSBSSi00NSBwaW4gY29uZmlnCSovCisjZGVmaW5lCURJR0lfQUlYT04JMHgwNDAwCQkvKiBBdXggZmxvdyBjb250cm9sIGluIGZlcAkqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhbHVlcyBmb3IgZGlnaURsb2FkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBOT1JNQUwgIDAKKyNkZWZpbmUgUENJX0NUTCAxCisKKyNkZWZpbmUgU0laRTggIDAKKyNkZWZpbmUgU0laRTE2IDEKKyNkZWZpbmUgU0laRTMyIDIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RydWN0dXJlIHVzZWQgd2l0aCBpb2N0bCBjb21tYW5kcyBmb3IgRElHSSBwYXJhbWV0ZXJzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBkaWdpX3N0cnVjdCAKK3sKKwl1bnNpZ25lZCBzaG9ydAlkaWdpX2ZsYWdzOwkJLyogRmxhZ3MgKHNlZSBhYm92ZSkJKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGRpZ2lfc3RydWN0IGRpZ2lfdDsKKworc3RydWN0IGRpZ2lfaW5mbyAKK3sKKwl1bnNpZ25lZCBsb25nIGJvYXJkOyAgICAgICAgLyogV2hpY2ggYm9hcmQgaXMgdGhpcyA/ICovCisJdW5zaWduZWQgY2hhciBzdGF0dXM7ICAgICAgIC8qIEFsaXZlIG9yIGRlYWQgKi8KKwl1bnNpZ25lZCBjaGFyIHR5cGU7ICAgICAgICAgLyogc2VlIGVwY2EuaCAqLworCXVuc2lnbmVkIGNoYXIgc3VidHlwZTsgICAgICAvKiBGb3IgZnV0dXJlIFhFTSwgWFIsIGV0YyAuLi4gKi8KKwl1bnNpZ25lZCBzaG9ydCBudW1wb3J0czsgICAgLyogTnVtYmVyIG9mIHBvcnRzIGNvbmZpZ3VyZWQgKi8KKwl1bnNpZ25lZCBjaGFyICpwb3J0OyAgICAgICAgLyogSS9PIEFkZHJlc3MgKi8KKwl1bnNpZ25lZCBjaGFyICptZW1iYXNlOyAgICAgLyogRFBSIEFkZHJlc3MgKi8KKwl1bnNpZ25lZCBjaGFyICp2ZXJzaW9uOyAgICAgLyogRm9yIGZ1dHVyZSAuLi4gKi8KKwl1bnNpZ25lZCBzaG9ydCB3aW5kb3dEYXRhOyAgLyogRm9yIGZ1dHVyZSAuLi4gKi8KK30gOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RpZ2lGZXAxLmggYi9kcml2ZXJzL2NoYXIvZGlnaUZlcDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDdkN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RpZ2lGZXAxLmgKQEAgLTAsMCArMSwxMzYgQEAKKworI2RlZmluZSBDU1RBUlQgICAgICAgMHg0MDBMCisjZGVmaW5lIENNQVggICAgICAgICAweDgwMEwKKyNkZWZpbmUgSVNUQVJUICAgICAgIDB4ODAwTAorI2RlZmluZSBJTUFYICAgICAgICAgMHhDMDBMCisjZGVmaW5lIENJTiAgICAgICAgICAweEQxMEwKKyNkZWZpbmUgR0xPQkFMICAgICAgIDB4RDEwTAorI2RlZmluZSBFSU4gICAgICAgICAgMHhEMThMCisjZGVmaW5lIEZFUFNUQVQgICAgICAweEQyMEwKKyNkZWZpbmUgQ0hBTlNUUlVDVCAgIDB4MTAwMEwKKyNkZWZpbmUgUlhUWEJVRiAgICAgIDB4NDAwMEwKKworCitzdHJ1Y3QgZ2xvYmFsX2RhdGEgCit7CisJdm9sYXRpbGUgdXNob3J0IGNpbjsKKwl2b2xhdGlsZSB1c2hvcnQgY291dDsKKwl2b2xhdGlsZSB1c2hvcnQgY3N0YXJ0OworCXZvbGF0aWxlIHVzaG9ydCBjbWF4OworCXZvbGF0aWxlIHVzaG9ydCBlaW47CisJdm9sYXRpbGUgdXNob3J0IGVvdXQ7CisJdm9sYXRpbGUgdXNob3J0IGlzdGFydDsKKwl2b2xhdGlsZSB1c2hvcnQgaW1heDsKK307CisKKworc3RydWN0IGJvYXJkX2NoYW4gCit7CisJaW50IGZpbGxlcjE7IAorCWludCBmaWxsZXIyOworCXZvbGF0aWxlIHVzaG9ydCB0c2VnOworCXZvbGF0aWxlIHVzaG9ydCB0aW47CisJdm9sYXRpbGUgdXNob3J0IHRvdXQ7CisJdm9sYXRpbGUgdXNob3J0IHRtYXg7CisJCisJdm9sYXRpbGUgdXNob3J0IHJzZWc7CisJdm9sYXRpbGUgdXNob3J0IHJpbjsKKwl2b2xhdGlsZSB1c2hvcnQgcm91dDsKKwl2b2xhdGlsZSB1c2hvcnQgcm1heDsKKwkKKwl2b2xhdGlsZSB1c2hvcnQgdGxvdzsKKwl2b2xhdGlsZSB1c2hvcnQgcmxvdzsKKwl2b2xhdGlsZSB1c2hvcnQgcmhpZ2g7CisJdm9sYXRpbGUgdXNob3J0IGluY3I7CisJCisJdm9sYXRpbGUgdXNob3J0IGV0aW1lOworCXZvbGF0aWxlIHVzaG9ydCBlZGVsYXk7CisJdm9sYXRpbGUgdW5jaGFyICpkZXY7CisJCisJdm9sYXRpbGUgdXNob3J0IGlmbGFnOworCXZvbGF0aWxlIHVzaG9ydCBvZmxhZzsKKwl2b2xhdGlsZSB1c2hvcnQgY2ZsYWc7CisJdm9sYXRpbGUgdXNob3J0IGdtYXNrOworCQorCXZvbGF0aWxlIHVzaG9ydCBjb2w7CisJdm9sYXRpbGUgdXNob3J0IGRlbGF5OworCXZvbGF0aWxlIHVzaG9ydCBpbWFzazsKKwl2b2xhdGlsZSB1c2hvcnQgdGZsdXNoOworCisJaW50IGZpbGxlcjM7CisJaW50IGZpbGxlcjQ7CisJaW50IGZpbGxlcjU7CisJaW50IGZpbGxlcjY7CisJCisJdm9sYXRpbGUgdW5jaGFyIG51bTsKKwl2b2xhdGlsZSB1bmNoYXIgcmFjdDsKKwl2b2xhdGlsZSB1bmNoYXIgYnN0YXQ7CisJdm9sYXRpbGUgdW5jaGFyIHRidXN5OworCXZvbGF0aWxlIHVuY2hhciBpZW1wdHk7CisJdm9sYXRpbGUgdW5jaGFyIGlsb3c7CisJdm9sYXRpbGUgdW5jaGFyIGlkYXRhOworCXZvbGF0aWxlIHVuY2hhciBlZmxhZzsKKwkKKwl2b2xhdGlsZSB1bmNoYXIgdGZsYWc7CisJdm9sYXRpbGUgdW5jaGFyIHJmbGFnOworCXZvbGF0aWxlIHVuY2hhciB4bWFzazsKKwl2b2xhdGlsZSB1bmNoYXIgeHZhbDsKKwl2b2xhdGlsZSB1bmNoYXIgbXN0YXQ7CisJdm9sYXRpbGUgdW5jaGFyIG1jaGFuZ2U7CisJdm9sYXRpbGUgdW5jaGFyIG1pbnQ7CisJdm9sYXRpbGUgdW5jaGFyIGxzdGF0OworCisJdm9sYXRpbGUgdW5jaGFyIG10cmFuOworCXZvbGF0aWxlIHVuY2hhciBvcnVuOworCXZvbGF0aWxlIHVuY2hhciBzdGFydGNhOworCXZvbGF0aWxlIHVuY2hhciBzdG9wY2E7CisJdm9sYXRpbGUgdW5jaGFyIHN0YXJ0YzsKKwl2b2xhdGlsZSB1bmNoYXIgc3RvcGM7CisJdm9sYXRpbGUgdW5jaGFyIHZuZXh0OworCXZvbGF0aWxlIHVuY2hhciBoZmxvdzsKKworCXZvbGF0aWxlIHVuY2hhciBmaWxsYzsKKwl2b2xhdGlsZSB1bmNoYXIgb2NoYXI7CisJdm9sYXRpbGUgdW5jaGFyIG9tYXNrOworCisJdW5jaGFyIGZpbGxlcjc7CisJdW5jaGFyIGZpbGxlcjhbMjhdOworfTsgCisKKworI2RlZmluZSBTUlhMV0FURVIgICAgICAweEUwCisjZGVmaW5lIFNSWEhXQVRFUiAgICAgIDB4RTEKKyNkZWZpbmUgU1RPVVQgICAgICAgICAgMHhFMgorI2RlZmluZSBQQVVTRVRYICAgICAgICAweEUzCisjZGVmaW5lIFJFU1VNRVRYICAgICAgIDB4RTQKKyNkZWZpbmUgU0FVWE9OT0ZGQyAgICAgMHhFNgorI2RlZmluZSBTRU5EQlJFQUsgICAgICAweEU4CisjZGVmaW5lIFNFVE1PREVNICAgICAgIDB4RTkKKyNkZWZpbmUgU0VUSUZMQUdTICAgICAgMHhFQQorI2RlZmluZSBTT05PRkZDICAgICAgICAweEVCCisjZGVmaW5lIFNUWExXQVRFUiAgICAgIDB4RUMKKyNkZWZpbmUgUEFVU0VSWCAgICAgICAgMHhFRQorI2RlZmluZSBSRVNVTUVSWCAgICAgICAweEVGCisjZGVmaW5lIFNFVEJVRkZFUiAgICAgIDB4RjIKKyNkZWZpbmUgU0VUQ09PS0VEICAgICAgMHhGMworI2RlZmluZSBTRVRIRkxPVyAgICAgICAweEY0CisjZGVmaW5lIFNFVENUUkxGTEFHUyAgIDB4RjUKKyNkZWZpbmUgU0VUVk5FWFQgICAgICAgMHhGNgorCisKKworI2RlZmluZSBCUkVBS19JTkQgICAgICAgIDB4MDEKKyNkZWZpbmUgTE9XVFhfSU5EICAgICAgICAweDAyCisjZGVmaW5lIEVNUFRZVFhfSU5EICAgICAgMHgwNAorI2RlZmluZSBEQVRBX0lORCAgICAgICAgIDB4MDgKKyNkZWZpbmUgTU9ERU1DSEdfSU5EICAgICAweDIwCisKKyNkZWZpbmUgRkVQX0hVUENMICAwMDAyMDAwCisjaWYgMAorI2RlZmluZSBSVFMgICAweDAyCisjZGVmaW5lIENEICAgIDB4MDgKKyNkZWZpbmUgRFNSICAgMHgxMAorI2RlZmluZSBDVFMgICAweDIwCisjZGVmaW5lIFJJICAgIDB4NDAKKyNkZWZpbmUgRFRSICAgMHg4MAorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZGlnaVBDSS5oIGIvZHJpdmVycy9jaGFyL2RpZ2lQQ0kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2E3ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RpZ2lQQ0kuaApAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5lcyBhbmQgc3RydWN0dXJlIGRlZmluaXRpb25zIGZvciBQQ0kgQklPUyBJbnRlcmZhY2UgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJUENJTUFYICAzMgkJLyogbWF4aW11bSBudW1iZXIgb2YgUENJIGJvYXJkcyAqLworCisKKyNkZWZpbmUJUENJX1ZFTkRPUl9ESUdJCQkweDExNEYKKyNkZWZpbmUJUENJX0RFVklDRV9FUEMJCTB4MDAwMgorI2RlZmluZQlQQ0lfREVWSUNFX1JJR0hUU1dJVENIIDB4MDAwMyAgLyogRm9yIHRlc3RpbmcgKi8KKyNkZWZpbmUJUENJX0RFVklDRV9YRU0JCTB4MDAwNAorI2RlZmluZQlQQ0lfREVWSUNFX1hSCQkweDAwMDUKKyNkZWZpbmUJUENJX0RFVklDRV9DWAkJMHgwMDA2CisjZGVmaW5lCVBDSV9ERVZJQ0VfWFJKCQkweDAwMDkgICAvKiBKdXBpdGVyIGJvYXJkcyB3aXRoICovCisjZGVmaW5lCVBDSV9ERVZJQ0VfRVBDSgkJMHgwMDBhICAgLyogUExYIDkwNjAgY2hpcCBmb3IgUENJICAqLworCisKKy8qCisgKiBPbiB0aGUgUENJIGJvYXJkcywgdGhlcmUgaXMgbm8gSU8gc3BhY2UgYWxsb2NhdGVkIAorICogVGhlIEkvTyByZWdpc3RlcnMgd2lsbCBiZSBpbiB0aGUgZmlyc3QgMyBieXRlcyBvZiB0aGUgICAKKyAqIHVwcGVyIDJNQiBvZiB0aGUgNE1CIG1lbW9yeSBzcGFjZS4gIFRoZSBib2FyZCBtZW1vcnkgCisgKiB3aWxsIGJlIG1hcHBlZCBpbnRvIHRoZSBsb3cgMk1CIG9mIHRoZSA0TUIgbWVtb3J5IHNwYWNlIAorICovCisKKy8qIFBvdGVudGlhbCBsb2NhdGlvbiBvZiBQQ0kgQmlvcyBmcm9tIEUwMDAwIHRvIEZGRkZGKi8KKyNkZWZpbmUgUENJX0JJT1NfU0laRQkJMHgwMDAyMDAwMAkKKworLyogU2l6ZSBvZiBNZW1vcnkgYW5kIEkvTyBmb3IgUENJICg0TUIpICovCisjZGVmaW5lIFBDSV9SQU1fU0laRQkJMHgwMDQwMDAwMAkKKworLyogU2l6ZSBvZiBNZW1vcnkgKDJNQikgKi8KKyNkZWZpbmUgUENJX01FTV9TSVpFCQkweDAwMjAwMDAwCQorCisvKiBPZmZzZXQgb2YgSS8wIGluIE1lbW9yeSAoMk1CKSAqLworI2RlZmluZSBQQ0lfSU9fT0ZGU0VUIAkJMHgwMDIwMDAwMAkKKworI2RlZmluZSBNRU1PVVRCKGJhc2VtZW0sIHBudW0sIHNldG1lbXZhbCkgICooY2FkZHJfdCkoKGJhc2VtZW0pICsgKCBQQ0lfSU9fT0ZGU0VUIHwgcG51bSA8PCA0IHwgcG51bSApKSA9IChzZXRtZW12YWwpCisjZGVmaW5lIE1FTUlOQihiYXNlbWVtLCBwbnVtKSAgKihjYWRkcl90KSgoYmFzZW1lbSkgKyAoUENJX0lPX09GRlNFVCB8IHBudW0gPDwgNCB8IHBudW0gKSkgICAvKiBmb3IgUENJIEkvTyAqLworCisKKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9kcm0vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWEwMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9LY29uZmlnCkBAIC0wLDAgKzEsOTggQEAKKyMKKyMgRHJtIGRldmljZSBjb25maWd1cmF0aW9uCisjCisjIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZQorIyBEaXJlY3QgUmVuZGVyaW5nIEluZnJhc3RydWN0dXJlIChEUkkpIGluIFhGcmVlODYgNC4xLjAgYW5kIGhpZ2hlci4KKyMKK2NvbmZpZyBEUk0KKwl0cmlzdGF0ZSAiRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyIChYRnJlZTg2IDQuMS4wIGFuZCBoaWdoZXIgRFJJIHN1cHBvcnQpIgorCWRlcGVuZHMgb24gQUdQIHx8IEFHUD1uCisJaGVscAorCSAgS2VybmVsLWxldmVsIHN1cHBvcnQgZm9yIHRoZSBEaXJlY3QgUmVuZGVyaW5nIEluZnJhc3RydWN0dXJlIChEUkkpCisJICBpbnRyb2R1Y2VkIGluIFhGcmVlODYgNC4wLiBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IG5lZWQgdG8gc2VsZWN0CisJICB0aGUgbW9kdWxlIHRoYXQncyByaWdodCBmb3IgeW91ciBncmFwaGljcyBjYXJkIGZyb20gdGhlIGxpc3QgYmVsb3cuCisJICBUaGVzZSBtb2R1bGVzIHByb3ZpZGUgc3VwcG9ydCBmb3Igc3luY2hyb25pemF0aW9uLCBzZWN1cml0eSwgYW5kCisJICBETUEgdHJhbnNmZXJzLiBQbGVhc2Ugc2VlIDxodHRwOi8vZHJpLnNvdXJjZWZvcmdlLm5ldC8+IGZvciBtb3JlCisJICBkZXRhaWxzLiAgWW91IHNob3VsZCBhbHNvIHNlbGVjdCBhbmQgY29uZmlndXJlIEFHUAorCSAgKC9kZXYvYWdwZ2FydCkgc3VwcG9ydC4KKworY29uZmlnIERSTV9UREZYCisJdHJpc3RhdGUgIjNkZnggQmFuc2hlZS9Wb29kb28zKyIKKwlkZXBlbmRzIG9uIERSTSAmJiBQQ0kKKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSAzZGZ4IEJhbnNoZWUgb3IgVm9vZG9vMyAob3IgbGF0ZXIpLAorCSAgZ3JhcGhpY3MgY2FyZC4gIElmIE0gaXMgc2VsZWN0ZWQsIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdGRmeC4KKworY29uZmlnIERSTV9HQU1NQQorCXRyaXN0YXRlICIzZGxhYnMgR01YIDIwMDAiCisJZGVwZW5kcyBvbiBEUk0gJiYgQlJPS0VOCisJaGVscAorCSAgVGhpcyBpcyB0aGUgb2xkIGdhbW1hIGRyaXZlciwgcGxlYXNlIHRlbGwgbWUgaWYgaXQgbWlnaHQgYWN0dWFsbHkKKwkgIHdvcmsuCisKK2NvbmZpZyBEUk1fUjEyOAorCXRyaXN0YXRlICJBVEkgUmFnZSAxMjgiCisJZGVwZW5kcyBvbiBEUk0gJiYgUENJCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGFuIEFUSSBSYWdlIDEyOCBncmFwaGljcyBjYXJkLiAgSWYgTQorCSAgaXMgc2VsZWN0ZWQsIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcjEyOC4gIEFHUCBzdXBwb3J0IGZvcgorCSAgdGhpcyBjYXJkIGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCAodW5sZXNzIHlvdSBoYXZlIGEgUENJIHZlcnNpb24pLgorCitjb25maWcgRFJNX1JBREVPTgorCXRyaXN0YXRlICJBVEkgUmFkZW9uIgorCWRlcGVuZHMgb24gRFJNICYmIFBDSQorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhbiBBVEkgUmFkZW9uIGdyYXBoaWNzIGNhcmQuICBUaGVyZQorCSAgYXJlIGJvdGggUENJIGFuZCBBR1AgdmVyc2lvbnMuICBZb3UgZG9uJ3QgbmVlZCB0byBjaG9vc2UgdGhpcyB0bworCSAgcnVuIHRoZSBSYWRlb24gaW4gcGxhaW4gVkdBIG1vZGUuICBUaGVyZSBpcyBhIHByb2R1Y3QgcGFnZSBhdAorCSAgPGh0dHA6Ly93d3cuYXRpLmNvbS9uYS9wYWdlcy9wcm9kdWN0cy9wYy9yYWRlb24zMi9pbmRleC5odG1sPi4KKwkgIElmIE0gaXMgc2VsZWN0ZWQsIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcmFkZW9uLgorCitjb25maWcgRFJNX0k4MTAKKwl0cmlzdGF0ZSAiSW50ZWwgSTgxMCIKKwlkZXBlbmRzIG9uIERSTSAmJiBBR1AgJiYgQUdQX0lOVEVMCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGFuIEludGVsIEk4MTAgZ3JhcGhpY3MgY2FyZC4gIElmIE0gaXMKKwkgIHNlbGVjdGVkLCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGk4MTAuICBBR1Agc3VwcG9ydCBpcyByZXF1aXJlZAorCSAgZm9yIHRoaXMgZHJpdmVyIHRvIHdvcmsuCisKK2Nob2ljZQorCXByb21wdCAiSW50ZWwgODMwTSwgODQ1RywgODUyR00sIDg1NUdNLCA4NjVHIgorCWRlcGVuZHMgb24gRFJNICYmIEFHUCAmJiBBR1BfSU5URUwKKwlvcHRpb25hbAorCitjb25maWcgRFJNX0k4MzAKKwl0cmlzdGF0ZSAiaTgzMCBkcml2ZXIiCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgc3lzdGVtIHRoYXQgaGFzIEludGVsIDgzME0sIDg0NUcsCisJICA4NTJHTSwgODU1R00gb3IgODY1RyBpbnRlZ3JhdGVkIGdyYXBoaWNzLiAgSWYgTSBpcyBzZWxlY3RlZCwgdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaTgzMC4gIEFHUCBzdXBwb3J0IGlzIHJlcXVpcmVkIGZvciB0aGlzIGRyaXZlcgorCSAgdG8gd29yay4gVGhpcyBkcml2ZXIgd2lsbCBldmVudHVhbGx5IGJlIHJlcGxhY2VkIGJ5IHRoZSBpOTE1IG9uZS4KKworY29uZmlnIERSTV9JOTE1CisJdHJpc3RhdGUgImk5MTUgZHJpdmVyIgorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIHN5c3RlbSB0aGF0IGhhcyBJbnRlbCA4MzBNLCA4NDVHLAorCSAgODUyR00sIDg1NUdNIDg2NUcgb3IgOTE1RyBpbnRlZ3JhdGVkIGdyYXBoaWNzLiAgSWYgTSBpcyBzZWxlY3RlZCwgdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaTkxNS4gIEFHUCBzdXBwb3J0IGlzIHJlcXVpcmVkIGZvciB0aGlzIGRyaXZlcgorCSAgdG8gd29yay4gVGhpcyBkcml2ZXIgd2lsbCBldmVudHVhbGx5IHJlcGxhY2UgdGhlIEk4MzAgZHJpdmVyLCB3aGVuCisJICBsYXRlciByZWxlYXNlIG9mIFggc3RhcnQgdG8gdXNlIHRoZSBuZXcgRERYIGFuZCBEUkkuCisJCitlbmRjaG9pY2UKKworY29uZmlnIERSTV9NR0EKKwl0cmlzdGF0ZSAiTWF0cm94IGcyMDAvZzQwMCIKKwlkZXBlbmRzIG9uIERSTSAmJiBBR1AKKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBNYXRyb3ggRzIwMCwgRzQwMCBvciBHNDUwIGdyYXBoaWNzCisJICBjYXJkLiAgSWYgTSBpcyBzZWxlY3RlZCwgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtZ2EuICBBR1AKKwkgIHN1cHBvcnQgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZHJpdmVyIHRvIHdvcmsuCisKK2NvbmZpZyBEUk1fU0lTCisJdHJpc3RhdGUgIlNpUyB2aWRlbyBjYXJkcyIKKwlkZXBlbmRzIG9uIERSTSAmJiBBR1AKKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBTaVMgNjMwIG9yIGNvbXBhdGlibGUgdmlkZW8gCisgICAgICAgICAgY2hpcHNldC4gSWYgTSBpcyBzZWxlY3RlZCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNpcy4gQUdQCisgICAgICAgICAgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3IgdGhpcyBkcml2ZXIgdG8gd29yay4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9kcm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhYjI2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGRybSBkZXZpY2UgZHJpdmVyLiAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlCisjIERpcmVjdCBSZW5kZXJpbmcgSW5mcmFzdHJ1Y3R1cmUgKERSSSkgaW4gWEZyZWU4NiA0LjEuMCBhbmQgaGlnaGVyLgorCitkcm0tb2JqcyAgICA6PQlkcm1fYXV0aC5vIGRybV9idWZzLm8gZHJtX2NvbnRleHQubyBkcm1fZG1hLm8gZHJtX2RyYXdhYmxlLm8gXAorCQlkcm1fZHJ2Lm8gZHJtX2ZvcHMubyBkcm1faW5pdC5vIGRybV9pb2N0bC5vIGRybV9pcnEubyBcCisJCWRybV9sb2NrLm8gZHJtX21lbW9yeS5vIGRybV9wcm9jLm8gZHJtX3N0dWIubyBkcm1fdm0ubyBcCisJCWRybV9hZ3BzdXBwb3J0Lm8gZHJtX3NjYXR0ZXIubyBhdGlfcGNpZ2FydC5vIGRybV9wY2kubyBcCisJCWRybV9zeXNmcy5vCisKK2dhbW1hLW9ianMgIDo9IGdhbW1hX2Rydi5vIGdhbW1hX2RtYS5vCit0ZGZ4LW9ianMgICA6PSB0ZGZ4X2Rydi5vCityMTI4LW9ianMgICA6PSByMTI4X2Rydi5vIHIxMjhfY2NlLm8gcjEyOF9zdGF0ZS5vIHIxMjhfaXJxLm8KK21nYS1vYmpzICAgIDo9IG1nYV9kcnYubyBtZ2FfZG1hLm8gbWdhX3N0YXRlLm8gbWdhX3dhcnAubyBtZ2FfaXJxLm8KK2k4MTAtb2JqcyAgIDo9IGk4MTBfZHJ2Lm8gaTgxMF9kbWEubworaTgzMC1vYmpzICAgOj0gaTgzMF9kcnYubyBpODMwX2RtYS5vIGk4MzBfaXJxLm8KK2k5MTUtb2JqcyAgIDo9IGk5MTVfZHJ2Lm8gaTkxNV9kbWEubyBpOTE1X2lycS5vIGk5MTVfbWVtLm8KK3JhZGVvbi1vYmpzIDo9IHJhZGVvbl9kcnYubyByYWRlb25fY3AubyByYWRlb25fc3RhdGUubyByYWRlb25fbWVtLm8gcmFkZW9uX2lycS5vCitmZmItb2JqcyAgICA6PSBmZmJfZHJ2Lm8gZmZiX2NvbnRleHQubworc2lzLW9ianMgICAgOj0gc2lzX2Rydi5vIHNpc19kcy5vIHNpc19tbS5vCisKK29iai0kKENPTkZJR19EUk0pCSs9IGRybS5vCitvYmotJChDT05GSUdfRFJNX0dBTU1BKSArPSBnYW1tYS5vCitvYmotJChDT05GSUdfRFJNX1RERlgpCSs9IHRkZngubworb2JqLSQoQ09ORklHX0RSTV9SMTI4KQkrPSByMTI4Lm8KK29iai0kKENPTkZJR19EUk1fUkFERU9OKSs9IHJhZGVvbi5vCitvYmotJChDT05GSUdfRFJNX01HQSkJKz0gbWdhLm8KK29iai0kKENPTkZJR19EUk1fSTgxMCkJKz0gaTgxMC5vCitvYmotJChDT05GSUdfRFJNX0k4MzApCSs9IGk4MzAubworb2JqLSQoQ09ORklHX0RSTV9JOTE1KSAgKz0gaTkxNS5vCitvYmotJChDT05GSUdfRFJNX0ZGQikgICArPSBmZmIubworb2JqLSQoQ09ORklHX0RSTV9TSVMpICAgKz0gc2lzLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9SRUFETUUuZHJtIGIvZHJpdmVycy9jaGFyL2RybS9SRUFETUUuZHJtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDFlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL1JFQURNRS5kcm0KQEAgLTAsMCArMSw0NiBAQAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZvciB0aGUgdmVyeSBsYXRlc3Qgb24gRFJJIGRldmVsb3BtZW50LCBwbGVhc2Ugc2VlOiAgICAgICoKKyogICAgIGh0dHA6Ly9kcmkuc291cmNlZm9yZ2UubmV0LyAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1RoZSBEaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXIgKGRybSkgaXMgYSBkZXZpY2UtaW5kZXBlbmRlbnQga2VybmVsLWxldmVsCitkZXZpY2UgZHJpdmVyIHRoYXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIFhGcmVlODYgRGlyZWN0IFJlbmRlcmluZworSW5mcmFzdHJ1Y3R1cmUgKERSSSkuCisKK1RoZSBEUk0gc3VwcG9ydHMgdGhlIERpcmVjdCBSZW5kZXJpbmcgSW5mcmFzdHJ1Y3R1cmUgKERSSSkgaW4gZm91ciBtYWpvcgord2F5czoKKworICAgIDEuIFRoZSBEUk0gcHJvdmlkZXMgc3luY2hyb25pemVkIGFjY2VzcyB0byB0aGUgZ3JhcGhpY3MgaGFyZHdhcmUgdmlhCisgICAgICAgdGhlIHVzZSBvZiBhbiBvcHRpbWl6ZWQgdHdvLXRpZXJlZCBsb2NrLgorCisgICAgMi4gVGhlIERSTSBlbmZvcmNlcyB0aGUgRFJJIHNlY3VyaXR5IHBvbGljeSBmb3IgYWNjZXNzIHRvIHRoZSBncmFwaGljcworICAgICAgIGhhcmR3YXJlIGJ5IG9ubHkgYWxsb3dpbmcgYXV0aGVudGljYXRlZCBYMTEgY2xpZW50cyBhY2Nlc3MgdG8KKyAgICAgICByZXN0cmljdGVkIHJlZ2lvbnMgb2YgbWVtb3J5LgorCisgICAgMy4gVGhlIERSTSBwcm92aWRlcyBhIGdlbmVyaWMgRE1BIGVuZ2luZSwgY29tcGxldGUgd2l0aCBtdWx0aXBsZQorICAgICAgIHF1ZXVlcyBhbmQgdGhlIGFiaWxpdHkgdG8gZGV0ZWN0IHRoZSBuZWVkIGZvciBhbiBPcGVuR0wgY29udGV4dAorICAgICAgIHN3aXRjaC4KKworICAgIDQuIFRoZSBEUk0gaXMgZXh0ZW5zaWJsZSB2aWEgdGhlIHVzZSBvZiBzbWFsbCBkZXZpY2Utc3BlY2lmaWMgbW9kdWxlcworICAgICAgIHRoYXQgcmVseSBleHRlbnNpdmVseSBvbiB0aGUgQVBJIGV4cG9ydGVkIGJ5IHRoZSBEUk0gbW9kdWxlLgorCisKK0RvY3VtZW50YXRpb24gb24gdGhlIERSSSBpcyBhdmFpbGFibGUgZnJvbToKKyAgICBodHRwOi8vcHJlY2lzaW9uaW5zaWdodC5jb20vcGlpbnNpZ2h0cy5odG1sCisKK0ZvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCBrZXJuZWwtbGV2ZWwgc3VwcG9ydCwgc2VlOgorCisgICAgVGhlIERpcmVjdCBSZW5kZXJpbmcgTWFuYWdlciwgS2VybmVsIFN1cHBvcnQgZm9yIHRoZSBEaXJlY3QgUmVuZGVyaW5nCisgICAgSW5mcmFzdHJ1Y3R1cmUKKyAgICBodHRwOi8vcHJlY2lzaW9uaW5zaWdodC5jb20vZHIvZHJtLmh0bWwKKworICAgIEhhcmR3YXJlIExvY2tpbmcgZm9yIHRoZSBEaXJlY3QgUmVuZGVyaW5nIEluZnJhc3RydWN0dXJlCisgICAgaHR0cDovL3ByZWNpc2lvbmluc2lnaHQuY29tL2RyL2xvY2tpbmcuaHRtbAorCisgICAgQSBTZWN1cml0eSBBbmFseXNpcyBvZiB0aGUgRGlyZWN0IFJlbmRlcmluZyBJbmZyYXN0cnVjdHVyZQorICAgIGh0dHA6Ly9wcmVjaXNpb25pbnNpZ2h0LmNvbS9kci9zZWN1cml0eS5odG1sCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGb3IgdGhlIHZlcnkgbGF0ZXN0IG9uIERSSSBkZXZlbG9wbWVudCwgcGxlYXNlIHNlZTogICAgICAqCisqICAgICBodHRwOi8vZHJpLnNvdXJjZWZvcmdlLm5ldC8gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jIGIvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkY2ExODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMKQEAgLTAsMCArMSwyMDggQEAKKy8qKgorICogXGZpbGUgYXRpX3BjaWdhcnQuaCAKKyAqIEFUSSBQQ0kgR0FSVCBzdXBwb3J0CisgKgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IFdlZCBEZWMgMTMgMjE6NTI6MTkgMjAwMCBieSBnYXJldGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorCisjaWYgUEFHRV9TSVpFID09IDY1NTM2CisjIGRlZmluZSBBVElfUENJR0FSVF9UQUJMRV9PUkRFUgkwCisjIGRlZmluZSBBVElfUENJR0FSVF9UQUJMRV9QQUdFUwkoMSA8PCAwKQorI2VsaWYgUEFHRV9TSVpFID09IDE2Mzg0CisjIGRlZmluZSBBVElfUENJR0FSVF9UQUJMRV9PUkRFUgkxCisjIGRlZmluZSBBVElfUENJR0FSVF9UQUJMRV9QQUdFUwkoMSA8PCAxKQorI2VsaWYgUEFHRV9TSVpFID09IDgxOTIKKyMgZGVmaW5lIEFUSV9QQ0lHQVJUX1RBQkxFX09SREVSIAkyCisjIGRlZmluZSBBVElfUENJR0FSVF9UQUJMRV9QQUdFUyAJKDEgPDwgMikKKyNlbGlmIFBBR0VfU0laRSA9PSA0MDk2CisjIGRlZmluZSBBVElfUENJR0FSVF9UQUJMRV9PUkRFUiAJMworIyBkZWZpbmUgQVRJX1BDSUdBUlRfVEFCTEVfUEFHRVMgCSgxIDw8IDMpCisjZWxzZQorIyBlcnJvciAtIFBBR0VfU0laRSBub3QgNjRLLCAxNkssIDhLIG9yIDRLCisjZW5kaWYKKworIyBkZWZpbmUgQVRJX01BWF9QQ0lHQVJUX1BBR0VTCQk4MTkyCS8qKjwgMzIgTUIgYXBlcnR1cmUsIDRLIHBhZ2VzICovCisjIGRlZmluZSBBVElfUENJR0FSVF9QQUdFX1NJWkUJCTQwOTYJLyoqPCBQQ0kgR0FSVCBwYWdlIHNpemUgKi8KKwordW5zaWduZWQgbG9uZyBkcm1fYXRpX2FsbG9jX3BjaWdhcnRfdGFibGUoIHZvaWQgKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgaTsKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlhZGRyZXNzID0gX19nZXRfZnJlZV9wYWdlcyggR0ZQX0tFUk5FTCwgQVRJX1BDSUdBUlRfVEFCTEVfT1JERVIgKTsKKwlpZiAoIGFkZHJlc3MgPT0gMFVMICkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlwYWdlID0gdmlydF90b19wYWdlKCBhZGRyZXNzICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBBVElfUENJR0FSVF9UQUJMRV9QQUdFUyA7IGkrKywgcGFnZSsrICkgeworCQlnZXRfcGFnZShwYWdlKTsKKwkJU2V0UGFnZVJlc2VydmVkKCBwYWdlICk7CisJfQorCisJRFJNX0RFQlVHKCAiJXM6IHJldHVybmluZyAweCUwOGx4XG4iLCBfX0ZVTkNUSU9OX18sIGFkZHJlc3MgKTsKKwlyZXR1cm4gYWRkcmVzczsKK30KKworc3RhdGljIHZvaWQgZHJtX2F0aV9mcmVlX3BjaWdhcnRfdGFibGUoIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyApCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGk7CisJRFJNX0RFQlVHKCAiJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJcGFnZSA9IHZpcnRfdG9fcGFnZSggYWRkcmVzcyApOworCisJZm9yICggaSA9IDAgOyBpIDwgQVRJX1BDSUdBUlRfVEFCTEVfUEFHRVMgOyBpKyssIHBhZ2UrKyApIHsKKwkJX19wdXRfcGFnZShwYWdlKTsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQoIHBhZ2UgKTsKKwl9CisKKwlmcmVlX3BhZ2VzKCBhZGRyZXNzLCBBVElfUENJR0FSVF9UQUJMRV9PUkRFUiApOworfQorCitpbnQgZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgICAgZG1hX2FkZHJfdCBidXNfYWRkcikKK3sKKwlkcm1fc2dfbWVtX3QgKmVudHJ5ID0gZGV2LT5zZzsKKwl1bnNpZ25lZCBsb25nIHBhZ2VzOworCWludCBpOworCisJLyogd2UgbmVlZCB0byBzdXBwb3J0IGxhcmdlIG1lbW9yeSBjb25maWd1cmF0aW9ucyAqLworCWlmICggIWVudHJ5ICkgeworCQlEUk1fRVJST1IoICJubyBzY2F0dGVyL2dhdGhlciBtZW1vcnkhXG4iICk7CisJCXJldHVybiAwOworCX0KKworCWlmICggYnVzX2FkZHIgKSB7CisJCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBidXNfYWRkciwKKwkJCQkgQVRJX1BDSUdBUlRfVEFCTEVfUEFHRVMgKiBQQUdFX1NJWkUsCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCXBhZ2VzID0gKCBlbnRyeS0+cGFnZXMgPD0gQVRJX01BWF9QQ0lHQVJUX1BBR0VTICkKKwkJICAgICAgICA/IGVudHJ5LT5wYWdlcyA6IEFUSV9NQVhfUENJR0FSVF9QQUdFUzsKKworCQlmb3IgKCBpID0gMCA7IGkgPCBwYWdlcyA7IGkrKyApIHsKKwkJCWlmICggIWVudHJ5LT5idXNhZGRyW2ldICkgYnJlYWs7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGRldi0+cGRldiwgZW50cnktPmJ1c2FkZHJbaV0sCisJCQkJCSBQQUdFX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl9CisJfQorCisJaWYgKCBhZGRyICkgeworCQlkcm1fYXRpX2ZyZWVfcGNpZ2FydF90YWJsZSggYWRkciApOworCX0KKworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTChkcm1fYXRpX3BjaWdhcnRfY2xlYW51cCk7CisKK2ludCBkcm1fYXRpX3BjaWdhcnRfaW5pdCggZHJtX2RldmljZV90ICpkZXYsCisJCQkgICB1bnNpZ25lZCBsb25nICphZGRyLAorCQkJICAgZG1hX2FkZHJfdCAqYnVzX2FkZHIpCit7CisJZHJtX3NnX21lbV90ICplbnRyeSA9IGRldi0+c2c7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gMDsKKwl1bnNpZ25lZCBsb25nIHBhZ2VzOworCXUzMiAqcGNpX2dhcnQsIHBhZ2VfYmFzZSwgYnVzX2FkZHJlc3MgPSAwOworCWludCBpLCBqLCByZXQgPSAwOworCisJaWYgKCAhZW50cnkgKSB7CisJCURSTV9FUlJPUiggIm5vIHNjYXR0ZXIvZ2F0aGVyIG1lbW9yeSFcbiIgKTsKKwkJZ290byBkb25lOworCX0KKworCWFkZHJlc3MgPSBkcm1fYXRpX2FsbG9jX3BjaWdhcnRfdGFibGUoKTsKKwlpZiAoICFhZGRyZXNzICkgeworCQlEUk1fRVJST1IoICJjYW5ub3QgYWxsb2NhdGUgUENJIEdBUlQgcGFnZSFcbiIgKTsKKwkJZ290byBkb25lOworCX0KKworCWlmICggIWRldi0+cGRldiApIHsKKwkJRFJNX0VSUk9SKCAiUENJIGRldmljZSB1bmtub3duIVxuIiApOworCQlnb3RvIGRvbmU7CisJfQorCisJYnVzX2FkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsICh2b2lkICopYWRkcmVzcywKKwkJCQkgIEFUSV9QQ0lHQVJUX1RBQkxFX1BBR0VTICogUEFHRV9TSVpFLAorCQkJCSAgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKGJ1c19hZGRyZXNzID09IDApIHsKKwkJRFJNX0VSUk9SKCAidW5hYmxlIHRvIG1hcCBQQ0lHQVJUIHBhZ2VzIVxuIiApOworCQlkcm1fYXRpX2ZyZWVfcGNpZ2FydF90YWJsZSggYWRkcmVzcyApOworCQlhZGRyZXNzID0gMDsKKwkJZ290byBkb25lOworCX0KKworCXBjaV9nYXJ0ID0gKHUzMiAqKWFkZHJlc3M7CisKKwlwYWdlcyA9ICggZW50cnktPnBhZ2VzIDw9IEFUSV9NQVhfUENJR0FSVF9QQUdFUyApCisJCT8gZW50cnktPnBhZ2VzIDogQVRJX01BWF9QQ0lHQVJUX1BBR0VTOworCisJbWVtc2V0KCBwY2lfZ2FydCwgMCwgQVRJX01BWF9QQ0lHQVJUX1BBR0VTICogc2l6ZW9mKHUzMikgKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IHBhZ2VzIDsgaSsrICkgeworCQkvKiB3ZSBuZWVkIHRvIHN1cHBvcnQgbGFyZ2UgbWVtb3J5IGNvbmZpZ3VyYXRpb25zICovCisJCWVudHJ5LT5idXNhZGRyW2ldID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LAorCQkJCQkgICBwYWdlX2FkZHJlc3MoIGVudHJ5LT5wYWdlbGlzdFtpXSApLAorCQkJCQkgICBQQUdFX1NJWkUsCisJCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlpZiAoZW50cnktPmJ1c2FkZHJbaV0gPT0gMCkgeworCQkJRFJNX0VSUk9SKCAidW5hYmxlIHRvIG1hcCBQQ0lHQVJUIHBhZ2VzIVxuIiApOworCQkJZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoIGRldiwgYWRkcmVzcywgYnVzX2FkZHJlc3MgKTsKKwkJCWFkZHJlc3MgPSAwOworCQkJYnVzX2FkZHJlc3MgPSAwOworCQkJZ290byBkb25lOworCQl9CisJCXBhZ2VfYmFzZSA9ICh1MzIpIGVudHJ5LT5idXNhZGRyW2ldOworCisJCWZvciAoaiA9IDA7IGogPCAoUEFHRV9TSVpFIC8gQVRJX1BDSUdBUlRfUEFHRV9TSVpFKTsgaisrKSB7CisJCQkqcGNpX2dhcnQrKyA9IGNwdV90b19sZTMyKCBwYWdlX2Jhc2UgKTsKKwkJCXBhZ2VfYmFzZSArPSBBVElfUENJR0FSVF9QQUdFX1NJWkU7CisJCX0KKwl9CisKKwlyZXQgPSAxOworCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCXdiaW52ZCgpOworI2Vsc2UKKwltYigpOworI2VuZGlmCisKK2RvbmU6CisJKmFkZHIgPSBhZGRyZXNzOworCSpidXNfYWRkciA9IGJ1c19hZGRyZXNzOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9hdGlfcGNpZ2FydF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NzMwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCkBAIC0wLDAgKzEsNjc1IEBACisvKioKKyAqIFxmaWxlIGRybS5oIAorICogSGVhZGVyIGZvciB0aGUgRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyCisgKiAKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKgorICogXHBhciBBY2tub3dsZWRnbWVudHM6CisgKiBEZWMgMTk5OSwgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0d2lkZGxlLm5ldD4sIG1vdmUgdG8gZ2VuZXJpYyBcYyBjbXB4Y2hnLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBfRFJNX0hfCisjZGVmaW5lIF9EUk1fSF8KKworI2lmIGRlZmluZWQoX19saW51eF9fKQorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgkJLyogRm9yIF9JTyogbWFjcm9zICovCisjZGVmaW5lIERSTV9JT0NUTF9OUihuKQkJX0lPQ19OUihuKQorI2RlZmluZSBEUk1fSU9DX1ZPSUQJCV9JT0NfTk9ORQorI2RlZmluZSBEUk1fSU9DX1JFQUQJCV9JT0NfUkVBRAorI2RlZmluZSBEUk1fSU9DX1dSSVRFCQlfSU9DX1dSSVRFCisjZGVmaW5lIERSTV9JT0NfUkVBRFdSSVRFCV9JT0NfUkVBRHxfSU9DX1dSSVRFCisjZGVmaW5lIERSTV9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpIF9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpCisjZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgZGVmaW5lZChJTl9NT0RVTEUpCisvKiBQcmV2ZW50IG5hbWUgY29sbGlzaW9uIHdoZW4gaW5jbHVkaW5nIHN5cy9pb2Njb20uaCAqLworI3VuZGVmIGlvY3RsCisjaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgorI2RlZmluZSBpb2N0bChhLGIsYykJCXhmODZpb2N0bChhLGIsYykKKyNlbHNlCisjaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgorI2VuZGlmIC8qIF9fRnJlZUJTRF9fICYmIHhmODZpb2N0bCAqLworI2RlZmluZSBEUk1fSU9DVExfTlIobikJCSgobikgJiAweGZmKQorI2RlZmluZSBEUk1fSU9DX1ZPSUQJCUlPQ19WT0lECisjZGVmaW5lIERSTV9JT0NfUkVBRAkJSU9DX09VVAorI2RlZmluZSBEUk1fSU9DX1dSSVRFCQlJT0NfSU4KKyNkZWZpbmUgRFJNX0lPQ19SRUFEV1JJVEUJSU9DX0lOT1VUCisjZGVmaW5lIERSTV9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpIF9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpCisjZW5kaWYKKworI2RlZmluZSBYRlJFRTg2X1ZFUlNJT04obWFqb3IsbWlub3IscGF0Y2gsc25hcCkgXAorCQkoKG1ham9yIDw8IDE2KSB8IChtaW5vciA8PCA4KSB8IHBhdGNoKQorCisjaWZuZGVmIENPTkZJR19YRlJFRTg2X1ZFUlNJT04KKyNkZWZpbmUgQ09ORklHX1hGUkVFODZfVkVSU0lPTiBYRlJFRTg2X1ZFUlNJT04oNCwxLDAsMCkKKyNlbmRpZgorCisjaWYgQ09ORklHX1hGUkVFODZfVkVSU0lPTiA8IFhGUkVFODZfVkVSU0lPTig0LDEsMCwwKQorI2RlZmluZSBEUk1fUFJPQ19ERVZJQ0VTICIvcHJvYy9kZXZpY2VzIgorI2RlZmluZSBEUk1fUFJPQ19NSVNDCSAiL3Byb2MvbWlzYyIKKyNkZWZpbmUgRFJNX1BST0NfRFJNCSAiL3Byb2MvZHJtIgorI2RlZmluZSBEUk1fREVWX0RSTQkgIi9kZXYvZHJtIgorI2RlZmluZSBEUk1fREVWX01PREUJIChTX0lSVVNSfFNfSVdVU1J8U19JUkdSUHxTX0lXR1JQKQorI2RlZmluZSBEUk1fREVWX1VJRAkgMAorI2RlZmluZSBEUk1fREVWX0dJRAkgMAorI2VuZGlmCisKKyNpZiBDT05GSUdfWEZSRUU4Nl9WRVJTSU9OID49IFhGUkVFODZfVkVSU0lPTig0LDEsMCwwKQorI2RlZmluZSBEUk1fTUFKT1IgICAgICAgMjI2CisjZGVmaW5lIERSTV9NQVhfTUlOT1IgICAxNQorI2VuZGlmCisjZGVmaW5lIERSTV9OQU1FCSJkcm0iCSAgLyoqPCBOYW1lIGluIGtlcm5lbCwgL2RldiwgYW5kIC9wcm9jICovCisjZGVmaW5lIERSTV9NSU5fT1JERVIJNQkgIC8qKjwgQXQgbGVhc3QgMl41IGJ5dGVzID0gMzIgYnl0ZXMgKi8KKyNkZWZpbmUgRFJNX01BWF9PUkRFUgkyMgkgIC8qKjwgVXAgdG8gMl4yMiBieXRlcyA9IDRNQiAqLworI2RlZmluZSBEUk1fUkFNX1BFUkNFTlQgMTAJICAvKio8IEhvdyBtdWNoIHN5c3RlbSByYW0gY2FuIHdlIGxvY2s/ICovCisKKyNkZWZpbmUgX0RSTV9MT0NLX0hFTEQJMHg4MDAwMDAwMCAvKio8IEhhcmR3YXJlIGxvY2sgaXMgaGVsZCAqLworI2RlZmluZSBfRFJNX0xPQ0tfQ09OVAkweDQwMDAwMDAwIC8qKjwgSGFyZHdhcmUgbG9jayBpcyBjb250ZW5kZWQgKi8KKyNkZWZpbmUgX0RSTV9MT0NLX0lTX0hFTEQobG9jaykJICAgKChsb2NrKSAmIF9EUk1fTE9DS19IRUxEKQorI2RlZmluZSBfRFJNX0xPQ0tfSVNfQ09OVChsb2NrKQkgICAoKGxvY2spICYgX0RSTV9MT0NLX0NPTlQpCisjZGVmaW5lIF9EUk1fTE9DS0lOR19DT05URVhUKGxvY2spICgobG9jaykgJiB+KF9EUk1fTE9DS19IRUxEfF9EUk1fTE9DS19DT05UKSkKKworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZHJtX2hhbmRsZV90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgIGRybV9jb250ZXh0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgZHJtX2RyYXdhYmxlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgZHJtX21hZ2ljX3Q7CisKKworLyoqCisgKiBDbGlwcmVjdC4KKyAqIAorICogXHdhcm5pbmc6IElmIHlvdSBjaGFuZ2UgdGhpcyBzdHJ1Y3R1cmUsIG1ha2Ugc3VyZSB5b3UgY2hhbmdlCisgKiBYRjg2RFJJQ2xpcFJlY3RSZWMgaW4gdGhlIHNlcnZlciBhcyB3ZWxsCisgKgorICogXG5vdGUgS1c6IEFjdHVhbGx5IGl0J3MgaWxsZWdhbCB0byBjaGFuZ2UgZWl0aGVyIGZvcgorICogYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgcmVhc29ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCB7CisJdW5zaWduZWQgc2hvcnQJeDE7CisJdW5zaWduZWQgc2hvcnQJeTE7CisJdW5zaWduZWQgc2hvcnQJeDI7CisJdW5zaWduZWQgc2hvcnQJeTI7Cit9IGRybV9jbGlwX3JlY3RfdDsKKworCisvKioKKyAqIFRleHR1cmUgcmVnaW9uLAorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB7CisJdW5zaWduZWQgY2hhcgluZXh0OworCXVuc2lnbmVkIGNoYXIJcHJldjsKKwl1bnNpZ25lZCBjaGFyCWluX3VzZTsKKwl1bnNpZ25lZCBjaGFyCXBhZGRpbmc7CisJdW5zaWduZWQgaW50CWFnZTsKK30gZHJtX3RleF9yZWdpb25fdDsKKworLyoqCisgKiBIYXJkd2FyZSBsb2NrLgorICoKKyAqIFRoZSBsb2NrIHN0cnVjdHVyZSBpcyBhIHNpbXBsZSBjYWNoZS1saW5lIGFsaWduZWQgaW50ZWdlci4gIFRvIGF2b2lkCisgKiBwcm9jZXNzb3IgYnVzIGNvbnRlbnRpb24gb24gYSBtdWx0aXByb2Nlc3NvciBzeXN0ZW0sIHRoZXJlIHNob3VsZCBub3QgYmUgYW55CisgKiBvdGhlciBkYXRhIHN0b3JlZCBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1faHdfbG9jayB7CisJX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCBsb2NrOwkJLyoqPCBsb2NrIHZhcmlhYmxlICovCisJY2hhcgkJCSAgcGFkZGluZ1s2MF07CS8qKjwgUGFkIHRvIGNhY2hlIGxpbmUgKi8KK30gZHJtX2h3X2xvY2tfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9WRVJTSU9OIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKiAKKyAqIFxzYSBkcm1HZXRWZXJzaW9uKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV92ZXJzaW9uIHsKKwlpbnQgICAgdmVyc2lvbl9tYWpvcjsJICAvKio8IE1ham9yIHZlcnNpb24gKi8KKwlpbnQgICAgdmVyc2lvbl9taW5vcjsJICAvKio8IE1pbm9yIHZlcnNpb24gKi8KKwlpbnQgICAgdmVyc2lvbl9wYXRjaGxldmVsOy8qKjwgUGF0Y2ggbGV2ZWwgKi8KKwlzaXplX3QgbmFtZV9sZW47CSAgLyoqPCBMZW5ndGggb2YgbmFtZSBidWZmZXIgKi8KKwljaGFyICAgX191c2VyICpuYW1lOwkgIC8qKjwgTmFtZSBvZiBkcml2ZXIgKi8KKwlzaXplX3QgZGF0ZV9sZW47CSAgLyoqPCBMZW5ndGggb2YgZGF0ZSBidWZmZXIgKi8KKwljaGFyICAgX191c2VyICpkYXRlOwkgIC8qKjwgVXNlci1zcGFjZSBidWZmZXIgdG8gaG9sZCBkYXRlICovCisJc2l6ZV90IGRlc2NfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIGRlc2MgYnVmZmVyICovCisJY2hhciAgIF9fdXNlciAqZGVzYzsJICAvKio8IFVzZXItc3BhY2UgYnVmZmVyIHRvIGhvbGQgZGVzYyAqLworfSBkcm1fdmVyc2lvbl90OworCisKKy8qKgorICogRFJNX0lPQ1RMX0dFVF9VTklRVUUgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtR2V0QnVzaWQoKSBhbmQgZHJtU2V0QnVzSWQoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3VuaXF1ZSB7CisJc2l6ZV90IHVuaXF1ZV9sZW47CSAgLyoqPCBMZW5ndGggb2YgdW5pcXVlICovCisJY2hhciAgIF9fdXNlciAqdW5pcXVlOwkgIC8qKjwgVW5pcXVlIG5hbWUgZm9yIGRyaXZlciBpbnN0YW50aWF0aW9uICovCit9IGRybV91bmlxdWVfdDsKKworCit0eXBlZGVmIHN0cnVjdCBkcm1fbGlzdCB7CisJaW50CQkgY291bnQ7CSAgLyoqPCBMZW5ndGggb2YgdXNlci1zcGFjZSBzdHJ1Y3R1cmVzICovCisJZHJtX3ZlcnNpb25fdAkgX191c2VyICp2ZXJzaW9uOworfSBkcm1fbGlzdF90OworCisKK3R5cGVkZWYgc3RydWN0IGRybV9ibG9jayB7CisJaW50CQkgdW51c2VkOworfSBkcm1fYmxvY2tfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9DT05UUk9MIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUN0bEluc3RIYW5kbGVyKCkgYW5kIGRybUN0bFVuaW5zdEhhbmRsZXIoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NvbnRyb2wgeworCWVudW0geworCQlEUk1fQUREX0NPTU1BTkQsCisJCURSTV9STV9DT01NQU5ELAorCQlEUk1fSU5TVF9IQU5ETEVSLAorCQlEUk1fVU5JTlNUX0hBTkRMRVIKKwl9CQkgZnVuYzsKKwlpbnQJCSBpcnE7Cit9IGRybV9jb250cm9sX3Q7CisKKworLyoqCisgKiBUeXBlIG9mIG1lbW9yeSB0byBtYXAuCisgKi8KK3R5cGVkZWYgZW51bSBkcm1fbWFwX3R5cGUgeworCV9EUk1fRlJBTUVfQlVGRkVSICAgPSAwLCAgLyoqPCBXQyAobm8gY2FjaGluZyksIG5vIGNvcmUgZHVtcCAqLworCV9EUk1fUkVHSVNURVJTCSAgICA9IDEsICAvKio8IG5vIGNhY2hpbmcsIG5vIGNvcmUgZHVtcCAqLworCV9EUk1fU0hNCSAgICA9IDIsICAvKio8IHNoYXJlZCwgY2FjaGVkICovCisJX0RSTV9BR1AgICAgICAgICAgICA9IDMsICAvKio8IEFHUC9HQVJUICovCisJX0RSTV9TQ0FUVEVSX0dBVEhFUiA9IDQJICAvKio8IFNjYXR0ZXIvZ2F0aGVyIG1lbW9yeSBmb3IgUENJIERNQSAqLworfSBkcm1fbWFwX3R5cGVfdDsKKworCisvKioKKyAqIE1lbW9yeSBtYXBwaW5nIGZsYWdzLgorICovCit0eXBlZGVmIGVudW0gZHJtX21hcF9mbGFncyB7CisJX0RSTV9SRVNUUklDVEVECSAgICAgPSAweDAxLCAvKio8IENhbm5vdCBiZSBtYXBwZWQgdG8gdXNlci12aXJ0dWFsICovCisJX0RSTV9SRUFEX09OTFkJICAgICA9IDB4MDIsCisJX0RSTV9MT0NLRUQJICAgICA9IDB4MDQsIC8qKjwgc2hhcmVkLCBjYWNoZWQsIGxvY2tlZCAqLworCV9EUk1fS0VSTkVMCSAgICAgPSAweDA4LCAvKio8IGtlcm5lbCByZXF1aXJlcyBhY2Nlc3MgKi8KKwlfRFJNX1dSSVRFX0NPTUJJTklORyA9IDB4MTAsIC8qKjwgdXNlIHdyaXRlLWNvbWJpbmluZyBpZiBhdmFpbGFibGUgKi8KKwlfRFJNX0NPTlRBSU5TX0xPQ0sgICA9IDB4MjAsIC8qKjwgU0hNIHBhZ2UgdGhhdCBjb250YWlucyBsb2NrICovCisJX0RSTV9SRU1PVkFCTEUJICAgICA9IDB4NDAgIC8qKjwgUmVtb3ZhYmxlIG1hcHBpbmcgKi8KK30gZHJtX21hcF9mbGFnc190OworCisKK3R5cGVkZWYgc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgeworCXVuc2lnbmVkIGludAljdHhfaWQ7ICAvKio8IENvbnRleHQgcmVxdWVzdGluZyBwcml2YXRlIG1hcHBpbmcgKi8KKwl2b2lkCQkqaGFuZGxlOyAvKio8IEhhbmRsZSBvZiBtYXAgKi8KK30gZHJtX2N0eF9wcml2X21hcF90OworCisKKy8qKgorICogRFJNX0lPQ1RMX0dFVF9NQVAsIERSTV9JT0NUTF9BRERfTUFQIGFuZCBEUk1fSU9DVExfUk1fTUFQIGlvY3RscworICogYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtQWRkTWFwKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9tYXAgeworCXVuc2lnbmVkIGxvbmcJb2Zmc2V0OwkgLyoqPCBSZXF1ZXN0ZWQgcGh5c2ljYWwgYWRkcmVzcyAoMCBmb3IgU0FSRUEpKi8KKwl1bnNpZ25lZCBsb25nCXNpemU7CSAvKio8IFJlcXVlc3RlZCBwaHlzaWNhbCBzaXplIChieXRlcykgKi8KKwlkcm1fbWFwX3R5cGVfdAl0eXBlOwkgLyoqPCBUeXBlIG9mIG1lbW9yeSB0byBtYXAgKi8KKwlkcm1fbWFwX2ZsYWdzX3QgZmxhZ3M7CSAvKio8IEZsYWdzICovCisJdm9pZAkJKmhhbmRsZTsgLyoqPCBVc2VyLXNwYWNlOiAiSGFuZGxlIiB0byBwYXNzIHRvIG1tYXAoKSAqLworCQkJCSAvKio8IEtlcm5lbC1zcGFjZToga2VybmVsLXZpcnR1YWwgYWRkcmVzcyAqLworCWludAkJbXRycjsJIC8qKjwgTVRSUiBzbG90IHVzZWQgKi8KKwkJCQkgLyogICBQcml2YXRlIGRhdGEgKi8KK30gZHJtX21hcF90OworCisKKy8qKgorICogRFJNX0lPQ1RMX0dFVF9DTElFTlQgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaWVudCB7CisJaW50CQlpZHg7CS8qKjwgV2hpY2ggY2xpZW50IGRlc2lyZWQ/ICovCisJaW50CQlhdXRoOwkvKio8IElzIGNsaWVudCBhdXRoZW50aWNhdGVkPyAqLworCXVuc2lnbmVkIGxvbmcJcGlkOwkvKio8IFByb2Nlc3MgSUQgKi8KKwl1bnNpZ25lZCBsb25nCXVpZDsJLyoqPCBVc2VyIElEICovCisJdW5zaWduZWQgbG9uZwltYWdpYzsJLyoqPCBNYWdpYyAqLworCXVuc2lnbmVkIGxvbmcJaW9jczsJLyoqPCBJb2N0bCBjb3VudCAqLworfSBkcm1fY2xpZW50X3Q7CisKKwordHlwZWRlZiBlbnVtIHsKKwlfRFJNX1NUQVRfTE9DSywKKwlfRFJNX1NUQVRfT1BFTlMsCisJX0RSTV9TVEFUX0NMT1NFUywKKwlfRFJNX1NUQVRfSU9DVExTLAorCV9EUk1fU1RBVF9MT0NLUywKKwlfRFJNX1NUQVRfVU5MT0NLUywKKwlfRFJNX1NUQVRfVkFMVUUsCS8qKjwgR2VuZXJpYyB2YWx1ZSAqLworCV9EUk1fU1RBVF9CWVRFLAkJLyoqPCBHZW5lcmljIGJ5dGUgY291bnRlciAoMTAyNGJ5dGVzL0spICovCisJX0RSTV9TVEFUX0NPVU5ULAkvKio8IEdlbmVyaWMgbm9uLWJ5dGUgY291bnRlciAoMTAwMC9rKSAqLworCisJX0RSTV9TVEFUX0lSUSwJCS8qKjwgSVJRICovCisJX0RSTV9TVEFUX1BSSU1BUlksCS8qKjwgUHJpbWFyeSBETUEgYnl0ZXMgKi8KKwlfRFJNX1NUQVRfU0VDT05EQVJZLAkvKio8IFNlY29uZGFyeSBETUEgYnl0ZXMgKi8KKwlfRFJNX1NUQVRfRE1BLAkJLyoqPCBETUEgKi8KKwlfRFJNX1NUQVRfU1BFQ0lBTCwJLyoqPCBTcGVjaWFsIERNQSAoZS5nLiwgcHJpb3JpdHkgb3IgcG9sbGVkKSAqLworCV9EUk1fU1RBVF9NSVNTRUQJLyoqPCBNaXNzZWQgRE1BIG9wcG9ydHVuaXR5ICovCisKKwkJCQkvKiBBZGQgdG8gdGhlICpFTkQqIG9mIHRoZSBsaXN0ICovCit9IGRybV9zdGF0X3R5cGVfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9HRVRfU1RBVFMgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIGNvdW50OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgICB2YWx1ZTsKKwkJZHJtX3N0YXRfdHlwZV90IHR5cGU7CisJfSBkYXRhWzE1XTsKK30gZHJtX3N0YXRzX3Q7CisKKworLyoqCisgKiBIYXJkd2FyZSBsb2NraW5nIGZsYWdzLgorICovCit0eXBlZGVmIGVudW0gZHJtX2xvY2tfZmxhZ3MgeworCV9EUk1fTE9DS19SRUFEWQkgICAgID0gMHgwMSwgLyoqPCBXYWl0IHVudGlsIGhhcmR3YXJlIGlzIHJlYWR5IGZvciBETUEgKi8KKwlfRFJNX0xPQ0tfUVVJRVNDRU5UICA9IDB4MDIsIC8qKjwgV2FpdCB1bnRpbCBoYXJkd2FyZSBxdWllc2NlbnQgKi8KKwlfRFJNX0xPQ0tfRkxVU0gJICAgICA9IDB4MDQsIC8qKjwgRmx1c2ggdGhpcyBjb250ZXh0J3MgRE1BIHF1ZXVlIGZpcnN0ICovCisJX0RSTV9MT0NLX0ZMVVNIX0FMTCAgPSAweDA4LCAvKio8IEZsdXNoIGFsbCBETUEgcXVldWVzIGZpcnN0ICovCisJCQkJLyogVGhlc2UgKkhBTFQqIGZsYWdzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0CisJCQkJICAgLS0gdGhleSB3aWxsIGJlIHVzZWQgdG8gc3VwcG9ydCB0aGUKKwkJCQkgICBmdWxsLXNjcmVlbiBER0EtbGlrZSBtb2RlLiAqLworCV9EUk1fSEFMVF9BTExfUVVFVUVTID0gMHgxMCwgLyoqPCBIYWx0IGFsbCBjdXJyZW50IGFuZCBmdXR1cmUgcXVldWVzICovCisJX0RSTV9IQUxUX0NVUl9RVUVVRVMgPSAweDIwICAvKio8IEhhbHQgYWxsIGN1cnJlbnQgcXVldWVzICovCit9IGRybV9sb2NrX2ZsYWdzX3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfTE9DSywgRFJNX0lPQ1RMX1VOTE9DSyBhbmQgRFJNX0lPQ1RMX0ZJTklTSCBpb2N0bCBhcmd1bWVudCB0eXBlLgorICogCisgKiBcc2EgZHJtR2V0TG9jaygpIGFuZCBkcm1VbmxvY2soKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2xvY2sgeworCWludAkJIGNvbnRleHQ7CisJZHJtX2xvY2tfZmxhZ3NfdCBmbGFnczsKK30gZHJtX2xvY2tfdDsKKworCisvKioKKyAqIERNQSBmbGFncworICoKKyAqIFx3YXJuaW5nIAorICogVGhlc2UgdmFsdWVzIFxlIG11c3QgbWF0Y2ggeGY4NmRybS5oLgorICoKKyAqIFxzYSBkcm1fZG1hLgorICovCit0eXBlZGVmIGVudW0gZHJtX2RtYV9mbGFncyB7CSAgICAgIAorCQkJCSAgICAgIC8qIEZsYWdzIGZvciBETUEgYnVmZmVyIGRpc3BhdGNoICovCisJX0RSTV9ETUFfQkxPQ0sJICAgICAgPSAweDAxLCAvKio8CisJCQkJICAgICAgICogQmxvY2sgdW50aWwgYnVmZmVyIGRpc3BhdGNoZWQuCisJCQkJICAgICAgICogCisJCQkJICAgICAgICogXG5vdGUgVGhlIGJ1ZmZlciBtYXkgbm90IHlldCBoYXZlCisJCQkJICAgICAgICogYmVlbiBwcm9jZXNzZWQgYnkgdGhlIGhhcmR3YXJlIC0tCisJCQkJICAgICAgICogZ2V0dGluZyBhIGhhcmR3YXJlIGxvY2sgd2l0aCB0aGUKKwkJCQkgICAgICAgKiBoYXJkd2FyZSBxdWllc2NlbnQgd2lsbCBlbnN1cmUKKwkJCQkgICAgICAgKiB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4KKwkJCQkgICAgICAgKiBwcm9jZXNzZWQuCisJCQkJICAgICAgICovCisJX0RSTV9ETUFfV0hJTEVfTE9DS0VEID0gMHgwMiwgLyoqPCBEaXNwYXRjaCB3aGlsZSBsb2NrIGhlbGQgKi8KKwlfRFJNX0RNQV9QUklPUklUWSAgICAgPSAweDA0LCAvKio8IEhpZ2ggcHJpb3JpdHkgZGlzcGF0Y2ggKi8KKworCQkJCSAgICAgIC8qIEZsYWdzIGZvciBETUEgYnVmZmVyIHJlcXVlc3QgKi8KKwlfRFJNX0RNQV9XQUlUCSAgICAgID0gMHgxMCwgLyoqPCBXYWl0IGZvciBmcmVlIGJ1ZmZlcnMgKi8KKwlfRFJNX0RNQV9TTUFMTEVSX09LICAgPSAweDIwLCAvKio8IFNtYWxsZXItdGhhbi1yZXF1ZXN0ZWQgYnVmZmVycyBPSyAqLworCV9EUk1fRE1BX0xBUkdFUl9PSyAgICA9IDB4NDAgIC8qKjwgTGFyZ2VyLXRoYW4tcmVxdWVzdGVkIGJ1ZmZlcnMgT0sgKi8KK30gZHJtX2RtYV9mbGFnc190OworCisKKy8qKgorICogRFJNX0lPQ1RMX0FERF9CVUZTIGFuZCBEUk1fSU9DVExfTUFSS19CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUFkZEJ1ZnMoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9kZXNjIHsKKwlpbnQJICAgICAgY291bnQ7CSAvKio8IE51bWJlciBvZiBidWZmZXJzIG9mIHRoaXMgc2l6ZSAqLworCWludAkgICAgICBzaXplOwkgLyoqPCBTaXplIGluIGJ5dGVzICovCisJaW50CSAgICAgIGxvd19tYXJrOwkgLyoqPCBMb3cgd2F0ZXIgbWFyayAqLworCWludAkgICAgICBoaWdoX21hcms7IC8qKjwgSGlnaCB3YXRlciBtYXJrICovCisJZW51bSB7CisJCV9EUk1fUEFHRV9BTElHTiA9IDB4MDEsIC8qKjwgQWxpZ24gb24gcGFnZSBib3VuZGFyaWVzIGZvciBETUEgKi8KKwkJX0RSTV9BR1BfQlVGRkVSID0gMHgwMiwgLyoqPCBCdWZmZXIgaXMgaW4gQUdQIHNwYWNlICovCisJCV9EUk1fU0dfQlVGRkVSICA9IDB4MDQgIC8qKjwgU2NhdHRlci9nYXRoZXIgbWVtb3J5IGJ1ZmZlciAqLworCX0JICAgICAgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBhZ3Bfc3RhcnQ7IC8qKjwgCisJCQkJICAqIFN0YXJ0IGFkZHJlc3Mgb2Ygd2hlcmUgdGhlIEFHUCBidWZmZXJzIGFyZQorCQkJCSAgKiBpbiB0aGUgQUdQIGFwZXJ0dXJlCisJCQkJICAqLworfSBkcm1fYnVmX2Rlc2NfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9JTkZPX0JVRlMgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9pbmZvIHsKKwlpbnQJICAgICAgIGNvdW50OwkvKio8IEVudHJpZXMgaW4gbGlzdCAqLworCWRybV9idWZfZGVzY190IF9fdXNlciAqbGlzdDsKK30gZHJtX2J1Zl9pbmZvX3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfRlJFRV9CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9idWZfZnJlZSB7CisJaW50CSAgICAgICBjb3VudDsKKwlpbnQJICAgICAgIF9fdXNlciAqbGlzdDsKK30gZHJtX2J1Zl9mcmVlX3Q7CisKKworLyoqCisgKiBCdWZmZXIgaW5mb3JtYXRpb24KKyAqCisgKiBcc2EgZHJtX2J1Zl9tYXAuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9idWZfcHViIHsKKwlpbnQJCSAgaWR4OwkgICAgICAgLyoqPCBJbmRleCBpbnRvIHRoZSBtYXN0ZXIgYnVmZmVyIGxpc3QgKi8KKwlpbnQJCSAgdG90YWw7ICAgICAgIC8qKjwgQnVmZmVyIHNpemUgKi8KKwlpbnQJCSAgdXNlZDsJICAgICAgIC8qKjwgQW1vdW50IG9mIGJ1ZmZlciBpbiB1c2UgKGZvciBETUEpICovCisJdm9pZAkgIF9fdXNlciAqYWRkcmVzczsgICAgIC8qKjwgQWRkcmVzcyBvZiBidWZmZXIgKi8KK30gZHJtX2J1Zl9wdWJfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9NQVBfQlVGUyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX21hcCB7CisJaW50CSAgICAgIGNvdW50OwkvKio8IExlbmd0aCBvZiB0aGUgYnVmZmVyIGxpc3QgKi8KKwl2b2lkCSAgICAgIF9fdXNlciAqdmlydHVhbDsJLyoqPCBNbWFwJ2QgYXJlYSBpbiB1c2VyLXZpcnR1YWwgKi8KKwlkcm1fYnVmX3B1Yl90IF9fdXNlciAqbGlzdDsJLyoqPCBCdWZmZXIgaW5mb3JtYXRpb24gKi8KK30gZHJtX2J1Zl9tYXBfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9ETUEgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBJbmRpY2VzIGhlcmUgcmVmZXIgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgbGlzdCBpbiBkcm1fYnVmX2dldC4KKyAqCisgKiBcc2EgZHJtRE1BKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9kbWEgeworCWludAkJY29udGV4dDsJICAvKio8IENvbnRleHQgaGFuZGxlICovCisJaW50CQlzZW5kX2NvdW50OwkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgdG8gc2VuZCAqLworCWludAlfX3VzZXIgKnNlbmRfaW5kaWNlczsJICAvKio8IExpc3Qgb2YgaGFuZGxlcyB0byBidWZmZXJzICovCisJaW50CV9fdXNlciAqc2VuZF9zaXplczsJICAvKio8IExlbmd0aHMgb2YgZGF0YSB0byBzZW5kICovCisJZHJtX2RtYV9mbGFnc190IGZsYWdzOwkJICAvKio8IEZsYWdzICovCisJaW50CQlyZXF1ZXN0X2NvdW50OwkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkICovCisJaW50CQlyZXF1ZXN0X3NpemU7CSAgLyoqPCBEZXNpcmVkIHNpemUgZm9yIGJ1ZmZlcnMgKi8KKwlpbnQJX191c2VyICpyZXF1ZXN0X2luZGljZXM7ICAvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLworCWludAlfX3VzZXIgKnJlcXVlc3Rfc2l6ZXM7CisJaW50CQlncmFudGVkX2NvdW50OwkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgZ3JhbnRlZCAqLworfSBkcm1fZG1hX3Q7CisKKwordHlwZWRlZiBlbnVtIHsKKwlfRFJNX0NPTlRFWFRfUFJFU0VSVkVEID0gMHgwMSwKKwlfRFJNX0NPTlRFWFRfMkRPTkxZICAgID0gMHgwMgorfSBkcm1fY3R4X2ZsYWdzX3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfQUREX0NUWCBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1DcmVhdGVDb250ZXh0KCkgYW5kIGRybURlc3Ryb3lDb250ZXh0KCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9jdHggeworCWRybV9jb250ZXh0X3QJaGFuZGxlOworCWRybV9jdHhfZmxhZ3NfdCBmbGFnczsKK30gZHJtX2N0eF90OworCisKKy8qKgorICogRFJNX0lPQ1RMX1JFU19DVFggaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9yZXMgeworCWludAkJY291bnQ7CisJZHJtX2N0eF90CV9fdXNlciAqY29udGV4dHM7Cit9IGRybV9jdHhfcmVzX3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfQUREX0RSQVcgYW5kIERSTV9JT0NUTF9STV9EUkFXIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9kcmF3IHsKKwlkcm1fZHJhd2FibGVfdAloYW5kbGU7Cit9IGRybV9kcmF3X3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfR0VUX01BR0lDIGFuZCBEUk1fSU9DVExfQVVUSF9NQUdJQyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYXV0aCB7CisJZHJtX21hZ2ljX3QJbWFnaWM7Cit9IGRybV9hdXRoX3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfSVJRX0JVU0lEIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUdldEludGVycnVwdEZyb21CdXNJRCgpLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1faXJxX2J1c2lkIHsKKwlpbnQgaXJxOwkvKio8IElSUSBudW1iZXIgKi8KKwlpbnQgYnVzbnVtOwkvKio8IGJ1cyBudW1iZXIgKi8KKwlpbnQgZGV2bnVtOwkvKio8IGRldmljZSBudW1iZXIgKi8KKwlpbnQgZnVuY251bTsJLyoqPCBmdW5jdGlvbiBudW1iZXIgKi8KK30gZHJtX2lycV9idXNpZF90OworCisKK3R5cGVkZWYgZW51bSB7CisgICAgX0RSTV9WQkxBTktfQUJTT0xVVEUgPSAweDAsCQkvKio8IFdhaXQgZm9yIHNwZWNpZmljIHZibGFuayBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICBfRFJNX1ZCTEFOS19SRUxBVElWRSA9IDB4MSwJCS8qKjwgV2FpdCBmb3IgZ2l2ZW4gbnVtYmVyIG9mIHZibGFua3MgKi8KKyAgICBfRFJNX1ZCTEFOS19TSUdOQUwgICA9IDB4NDAwMDAwMDAJLyoqPCBTZW5kIHNpZ25hbCBpbnN0ZWFkIG9mIGJsb2NraW5nICovCit9IGRybV92Ymxhbmtfc2VxX3R5cGVfdDsKKworCisjZGVmaW5lIF9EUk1fVkJMQU5LX0ZMQUdTX01BU0sgX0RSTV9WQkxBTktfU0lHTkFMCisKKworc3RydWN0IGRybV93YWl0X3ZibGFua19yZXF1ZXN0IHsKKwlkcm1fdmJsYW5rX3NlcV90eXBlX3QgdHlwZTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CisJdW5zaWduZWQgbG9uZyBzaWduYWw7Cit9OworCisKK3N0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVwbHkgeworCWRybV92Ymxhbmtfc2VxX3R5cGVfdCB0eXBlOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKwlsb25nIHR2YWxfc2VjOworCWxvbmcgdHZhbF91c2VjOworfTsKKworCisvKioKKyAqIERSTV9JT0NUTF9XQUlUX1ZCTEFOSyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1XYWl0VkJsYW5rKCkuCisgKi8KK3R5cGVkZWYgdW5pb24gZHJtX3dhaXRfdmJsYW5rIHsKKwlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcGx5IHJlcGx5OworfSBkcm1fd2FpdF92YmxhbmtfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9BR1BfRU5BQkxFIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUFncEVuYWJsZSgpLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX21vZGUgeworCXVuc2lnbmVkIGxvbmcgbW9kZTsJLyoqPCBBR1AgbW9kZSAqLworfSBkcm1fYWdwX21vZGVfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9BR1BfQUxMT0MgYW5kIERSTV9JT0NUTF9BR1BfRlJFRSBpb2N0bHMgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtQWdwQWxsb2MoKSBhbmQgZHJtQWdwRnJlZSgpLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2J1ZmZlciB7CisJdW5zaWduZWQgbG9uZyBzaXplOwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwkvKio8IFVzZWQgZm9yIGJpbmRpbmcgLyB1bmJpbmRpbmcgKi8KKwl1bnNpZ25lZCBsb25nIHR5cGU7ICAgICAvKio8IFR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgcGh5c2ljYWw7IC8qKjwgUGh5c2ljYWwgdXNlZCBieSBpODEwICovCit9IGRybV9hZ3BfYnVmZmVyX3Q7CisKKworLyoqCisgKiBEUk1fSU9DVExfQUdQX0JJTkQgYW5kIERSTV9JT0NUTF9BR1BfVU5CSU5EIGlvY3RscyBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1BZ3BCaW5kKCkgYW5kIGRybUFncFVuYmluZCgpLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgeworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOyAgIC8qKjwgRnJvbSBkcm1fYWdwX2J1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLworfSBkcm1fYWdwX2JpbmRpbmdfdDsKKworCisvKioKKyAqIERSTV9JT0NUTF9BR1BfSU5GTyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1BZ3BWZXJzaW9uTWFqb3IoKSwgZHJtQWdwVmVyc2lvbk1pbm9yKCksIGRybUFncEdldE1vZGUoKSwKKyAqIGRybUFncEJhc2UoKSwgZHJtQWdwU2l6ZSgpLCBkcm1BZ3BNZW1vcnlVc2VkKCksIGRybUFncE1lbW9yeUF2YWlsKCksCisgKiBkcm1BZ3BWZW5kb3JJZCgpIGFuZCBkcm1BZ3BEZXZpY2VJZCgpLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2luZm8geworCWludCAgICAgICAgICAgIGFncF92ZXJzaW9uX21ham9yOworCWludCAgICAgICAgICAgIGFncF92ZXJzaW9uX21pbm9yOworCXVuc2lnbmVkIGxvbmcgIG1vZGU7CisJdW5zaWduZWQgbG9uZyAgYXBlcnR1cmVfYmFzZTsgIC8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nICBhcGVydHVyZV9zaXplOyAgLyogYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nICBtZW1vcnlfYWxsb3dlZDsgLyogYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nICBtZW1vcnlfdXNlZDsKKworCQkJCS8qIFBDSSBpbmZvcm1hdGlvbiAqLworCXVuc2lnbmVkIHNob3J0IGlkX3ZlbmRvcjsKKwl1bnNpZ25lZCBzaG9ydCBpZF9kZXZpY2U7Cit9IGRybV9hZ3BfaW5mb190OworCisKKy8qKgorICogRFJNX0lPQ1RMX1NHX0FMTE9DIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciB7CisJdW5zaWduZWQgbG9uZyBzaXplOwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwkvKio8IFVzZWQgZm9yIG1hcHBpbmcgLyB1bm1hcHBpbmcgKi8KK30gZHJtX3NjYXR0ZXJfZ2F0aGVyX3Q7CisKKy8qKgorICogRFJNX0lPQ1RMX1NFVF9WRVJTSU9OIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9zZXRfdmVyc2lvbiB7CisJaW50IGRybV9kaV9tYWpvcjsKKwlpbnQgZHJtX2RpX21pbm9yOworCWludCBkcm1fZGRfbWFqb3I7CisJaW50IGRybV9kZF9taW5vcjsKK30gZHJtX3NldF92ZXJzaW9uX3Q7CisKKworI2RlZmluZSBEUk1fSU9DVExfQkFTRQkJCSdkJworI2RlZmluZSBEUk1fSU8obnIpCQkJX0lPKERSTV9JT0NUTF9CQVNFLG5yKQorI2RlZmluZSBEUk1fSU9SKG5yLHR5cGUpCQlfSU9SKERSTV9JT0NUTF9CQVNFLG5yLHR5cGUpCisjZGVmaW5lIERSTV9JT1cobnIsdHlwZSkJCV9JT1coRFJNX0lPQ1RMX0JBU0UsbnIsdHlwZSkKKyNkZWZpbmUgRFJNX0lPV1IobnIsdHlwZSkJCV9JT1dSKERSTV9JT0NUTF9CQVNFLG5yLHR5cGUpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZFUlNJT04JCURSTV9JT1dSKDB4MDAsIGRybV92ZXJzaW9uX3QpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfVU5JUVVFCQlEUk1fSU9XUigweDAxLCBkcm1fdW5pcXVlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfTUFHSUMJCURSTV9JT1IoIDB4MDIsIGRybV9hdXRoX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JUlFfQlVTSUQJCURSTV9JT1dSKDB4MDMsIGRybV9pcnFfYnVzaWRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9NQVAgICAgICAgICAgICAgICBEUk1fSU9XUigweDA0LCBkcm1fbWFwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfQ0xJRU5UICAgICAgICAgICAgRFJNX0lPV1IoMHgwNSwgZHJtX2NsaWVudF90KQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1NUQVRTICAgICAgICAgICAgIERSTV9JT1IoIDB4MDYsIGRybV9zdGF0c190KQorI2RlZmluZSBEUk1fSU9DVExfU0VUX1ZFUlNJT04JCURSTV9JT1dSKDB4MDcsIGRybV9zZXRfdmVyc2lvbl90KQorCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfVU5JUVVFCQlEUk1fSU9XKCAweDEwLCBkcm1fdW5pcXVlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BVVRIX01BR0lDCQlEUk1fSU9XKCAweDExLCBkcm1fYXV0aF90KQorI2RlZmluZSBEUk1fSU9DVExfQkxPQ0sJCQlEUk1fSU9XUigweDEyLCBkcm1fYmxvY2tfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1VOQkxPQ0sJCURSTV9JT1dSKDB4MTMsIGRybV9ibG9ja190KQorI2RlZmluZSBEUk1fSU9DVExfQ09OVFJPTAkJRFJNX0lPVyggMHgxNCwgZHJtX2NvbnRyb2xfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9NQVAJCURSTV9JT1dSKDB4MTUsIGRybV9tYXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9CVUZTCQlEUk1fSU9XUigweDE2LCBkcm1fYnVmX2Rlc2NfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01BUktfQlVGUwkJRFJNX0lPVyggMHgxNywgZHJtX2J1Zl9kZXNjX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JTkZPX0JVRlMJCURSTV9JT1dSKDB4MTgsIGRybV9idWZfaW5mb190KQorI2RlZmluZSBEUk1fSU9DVExfTUFQX0JVRlMJCURSTV9JT1dSKDB4MTksIGRybV9idWZfbWFwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9GUkVFX0JVRlMJCURSTV9JT1coIDB4MWEsIGRybV9idWZfZnJlZV90KQorCisjZGVmaW5lIERSTV9JT0NUTF9STV9NQVAJCURSTV9JT1coIDB4MWIsIGRybV9tYXBfdCkKKworI2RlZmluZSBEUk1fSU9DVExfU0VUX1NBUkVBX0NUWAkJRFJNX0lPVyggMHgxYywgZHJtX2N0eF9wcml2X21hcF90KQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1NBUkVBX0NUWCAJRFJNX0lPV1IoMHgxZCwgZHJtX2N0eF9wcml2X21hcF90KQorCisjZGVmaW5lIERSTV9JT0NUTF9BRERfQ1RYCQlEUk1fSU9XUigweDIwLCBkcm1fY3R4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9STV9DVFgJCURSTV9JT1dSKDB4MjEsIGRybV9jdHhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PRF9DVFgJCURSTV9JT1coIDB4MjIsIGRybV9jdHhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9DVFgJCURSTV9JT1dSKDB4MjMsIGRybV9jdHhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NXSVRDSF9DVFgJCURSTV9JT1coIDB4MjQsIGRybV9jdHhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX05FV19DVFgJCURSTV9JT1coIDB4MjUsIGRybV9jdHhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JFU19DVFgJCURSTV9JT1dSKDB4MjYsIGRybV9jdHhfcmVzX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BRERfRFJBVwkJRFJNX0lPV1IoMHgyNywgZHJtX2RyYXdfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JNX0RSQVcJCURSTV9JT1dSKDB4MjgsIGRybV9kcmF3X3QpCisjZGVmaW5lIERSTV9JT0NUTF9ETUEJCQlEUk1fSU9XUigweDI5LCBkcm1fZG1hX3QpCisjZGVmaW5lIERSTV9JT0NUTF9MT0NLCQkJRFJNX0lPVyggMHgyYSwgZHJtX2xvY2tfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1VOTE9DSwkJRFJNX0lPVyggMHgyYiwgZHJtX2xvY2tfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0ZJTklTSAkJRFJNX0lPVyggMHgyYywgZHJtX2xvY2tfdCkKKworI2RlZmluZSBEUk1fSU9DVExfQUdQX0FDUVVJUkUJCURSTV9JTyggIDB4MzApCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfUkVMRUFTRQkJRFJNX0lPKCAgMHgzMSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9FTkFCTEUJCURSTV9JT1coIDB4MzIsIGRybV9hZ3BfbW9kZV90KQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0lORk8JCURSTV9JT1IoIDB4MzMsIGRybV9hZ3BfaW5mb190KQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0FMTE9DCQlEUk1fSU9XUigweDM0LCBkcm1fYWdwX2J1ZmZlcl90KQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0ZSRUUJCURSTV9JT1coIDB4MzUsIGRybV9hZ3BfYnVmZmVyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfQklORAkJRFJNX0lPVyggMHgzNiwgZHJtX2FncF9iaW5kaW5nX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfVU5CSU5ECQlEUk1fSU9XKCAweDM3LCBkcm1fYWdwX2JpbmRpbmdfdCkKKworI2RlZmluZSBEUk1fSU9DVExfU0dfQUxMT0MJCURSTV9JT1coIDB4MzgsIGRybV9zY2F0dGVyX2dhdGhlcl90KQorI2RlZmluZSBEUk1fSU9DVExfU0dfRlJFRQkJRFJNX0lPVyggMHgzOSwgZHJtX3NjYXR0ZXJfZ2F0aGVyX3QpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1dBSVRfVkJMQU5LCQlEUk1fSU9XUigweDNhLCBkcm1fd2FpdF92YmxhbmtfdCkKKworLyoqCisgKiBEZXZpY2Ugc3BlY2lmaWMgaW9jdGxzIHNob3VsZCBvbmx5IGJlIGluIHRoZWlyIHJlc3BlY3RpdmUgaGVhZGVycworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyBmcm9tIDB4NDAgdG8gMHg3OS4KKyAqCisgKiBcc2EgZHJtQ29tbWFuZE5vbmUoKSwgZHJtQ29tbWFuZFJlYWQoKSwgZHJtQ29tbWFuZFdyaXRlKCksIGFuZAorICogZHJtQ29tbWFuZFJlYWRXcml0ZSgpLgorICovCisjZGVmaW5lIERSTV9DT01NQU5EX0JBU0UgICAgICAgICAgICAgICAgMHg0MAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmNGM1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oCkBAIC0wLDAgKzEsMTA3MyBAQAorLyoqCisgKiBcZmlsZSBkcm1QLmggCisgKiBQcml2YXRlIGhlYWRlciBmb3IgRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyCisgKiAKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9EUk1fUF9IXworI2RlZmluZSBfRFJNX1BfSF8KKworLyogSWYgeW91IHdhbnQgdGhlIG1lbW9yeSBhbGxvYyBkZWJ1ZyBmdW5jdGlvbmFsaXR5LCBjaGFuZ2UgZGVmaW5lIGJlbG93ICovCisvKiAjZGVmaW5lIERFQlVHX01FTU9SWSAqLworCisjaWZkZWYgX19LRVJORUxfXworI2lmZGVmIF9fYWxwaGFfXworLyogYWRkIGluY2x1ZGUgb2YgY3VycmVudC5oIHNvIHRoYXQgImN1cnJlbnQiIGlzIGRlZmluZWQKKyAqIGJlZm9yZSBzdGF0aWMgaW5saW5lIGZ1bmNzIGluIHdhaXQuaC4gRG9pbmcgdGhpcyBzbyB3ZQorICogY2FuIGJ1aWxkIHRoZSBEUk0gKHBhcnQgb2YgUEkgRFJJKS4gNC8yMS8yMDAwIFMgKyBCICovCisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNlbmRpZiAvKiBfX2FscGhhX18gKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CS8qIEZvciAodW4pbG9ja19rZXJuZWwgKi8KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPiAvKiBGb3IgcHRlX3dycHJvdGVjdCAqLworI2VuZGlmCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21tYW4uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2lmZGVmIENPTkZJR19NVFJSCisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FHUCkgfHwgZGVmaW5lZChDT05GSUdfQUdQX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlICJkcm0uaCIKKworI2RlZmluZSBfX09TX0hBU19BR1AgKGRlZmluZWQoQ09ORklHX0FHUCkgfHwgKGRlZmluZWQoQ09ORklHX0FHUF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkpCisjZGVmaW5lIF9fT1NfSEFTX01UUlIgKGRlZmluZWQoQ09ORklHX01UUlIpKQorCisjaW5jbHVkZSAiZHJtX29zX2xpbnV4LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBcbmFtZSBEUk0gdGVtcGxhdGUgY3VzdG9taXphdGlvbiBkZWZhdWx0cyAqLworLypAeyovCisKKy8qIGRyaXZlciBjYXBhYmlsaXRpZXMgYW5kIHJlcXVpcmVtZW50cyBtYXNrICovCisjZGVmaW5lIERSSVZFUl9VU0VfQUdQICAgICAweDEKKyNkZWZpbmUgRFJJVkVSX1JFUVVJUkVfQUdQIDB4MgorI2RlZmluZSBEUklWRVJfVVNFX01UUlIgICAgMHg0CisjZGVmaW5lIERSSVZFUl9QQ0lfRE1BICAgICAweDgKKyNkZWZpbmUgRFJJVkVSX1NHICAgICAgICAgIDB4MTAKKyNkZWZpbmUgRFJJVkVSX0hBVkVfRE1BICAgIDB4MjAKKyNkZWZpbmUgRFJJVkVSX0hBVkVfSVJRICAgIDB4NDAKKyNkZWZpbmUgRFJJVkVSX0lSUV9TSEFSRUQgIDB4ODAKKyNkZWZpbmUgRFJJVkVSX0lSUV9WQkwgICAgIDB4MTAwCisjZGVmaW5lIERSSVZFUl9ETUFfUVVFVUUgICAweDIwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgQmVnaW4gdGhlIERSTS4uLiAqLworLypAeyovCisKKyNkZWZpbmUgRFJNX0RFQlVHX0NPREUgMgkgIC8qKjwgSW5jbHVkZSBkZWJ1Z2dpbmcgY29kZSBpZiA+IDEsIHRoZW4KKwkJCQkgICAgIGFsc28gaW5jbHVkZSBsb29waW5nIGRldGVjdGlvbi4gKi8KKworI2RlZmluZSBEUk1fSEFTSF9TSVpFCSAgICAgIDE2IC8qKjwgU2l6ZSBvZiBrZXkgaGFzaCB0YWJsZS4gTXVzdCBiZSBwb3dlciBvZiAyLiAqLworI2RlZmluZSBEUk1fS0VSTkVMX0NPTlRFWFQgICAgMAkgLyoqPCBDaGFuZ2UgZHJtX3Jlc2N0eCBpZiBjaGFuZ2VkICovCisjZGVmaW5lIERSTV9SRVNFUlZFRF9DT05URVhUUyAxCSAvKio8IENoYW5nZSBkcm1fcmVzY3R4IGlmIGNoYW5nZWQgKi8KKyNkZWZpbmUgRFJNX0xPT1BJTkdfTElNSVQgICAgIDUwMDAwMDAKKyNkZWZpbmUgRFJNX0JTWgkJICAgICAgMTAyNCAvKio8IEJ1ZmZlciBzaXplIGZvciAvZGV2L2RybT8gb3V0cHV0ICovCisjZGVmaW5lIERSTV9USU1FX1NMSUNFCSAgICAgIChIWi8yMCkgIC8qKjwgVGltZSBzbGljZSBmb3IgR0xYQ29udGV4dHMgKi8KKyNkZWZpbmUgRFJNX0xPQ0tfU0xJQ0UJICAgICAgMQkvKio8IFRpbWUgc2xpY2UgZm9yIGxvY2ssIGluIGppZmZpZXMgKi8KKworI2RlZmluZSBEUk1fRkxBR19ERUJVRwkgIDB4MDEKKworI2RlZmluZSBEUk1fTUVNX0RNQQkgICAwCisjZGVmaW5lIERSTV9NRU1fU0FSRUEJICAgMQorI2RlZmluZSBEUk1fTUVNX0RSSVZFUgkgICAyCisjZGVmaW5lIERSTV9NRU1fTUFHSUMJICAgMworI2RlZmluZSBEUk1fTUVNX0lPQ1RMUwkgICA0CisjZGVmaW5lIERSTV9NRU1fTUFQUwkgICA1CisjZGVmaW5lIERSTV9NRU1fVk1BUwkgICA2CisjZGVmaW5lIERSTV9NRU1fQlVGUwkgICA3CisjZGVmaW5lIERSTV9NRU1fU0VHUwkgICA4CisjZGVmaW5lIERSTV9NRU1fUEFHRVMJICAgOQorI2RlZmluZSBEUk1fTUVNX0ZJTEVTCSAgMTAKKyNkZWZpbmUgRFJNX01FTV9RVUVVRVMJICAxMQorI2RlZmluZSBEUk1fTUVNX0NNRFMJICAxMgorI2RlZmluZSBEUk1fTUVNX01BUFBJTkdTICAxMworI2RlZmluZSBEUk1fTUVNX0JVRkxJU1RTICAxNAorI2RlZmluZSBEUk1fTUVNX0FHUExJU1RTICAxNQorI2RlZmluZSBEUk1fTUVNX1RPVEFMQUdQICAxNgorI2RlZmluZSBEUk1fTUVNX0JPVU5EQUdQICAxNworI2RlZmluZSBEUk1fTUVNX0NUWEJJVE1BUCAxOAorI2RlZmluZSBEUk1fTUVNX1NUVUIgICAgICAxOQorI2RlZmluZSBEUk1fTUVNX1NHTElTVFMgICAyMAorI2RlZmluZSBEUk1fTUVNX0NUWExJU1QgIDIxCisKKyNkZWZpbmUgRFJNX01BWF9DVFhCSVRNQVAgKFBBR0VfU0laRSAqIDgpCisJCisvKkB9Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBzZWN0aW9uICovCisvKkB7Ki8KKworI2lmbmRlZiBNT0RVTEVfTElDRU5TRQorI2RlZmluZSBNT0RVTEVfTElDRU5TRSh4KSAKKyNlbmRpZgorCisjaWZuZGVmIHByZWVtcHRfZGlzYWJsZQorI2RlZmluZSBwcmVlbXB0X2Rpc2FibGUoKQorI2RlZmluZSBwcmVlbXB0X2VuYWJsZSgpCisjZW5kaWYKKworI2lmbmRlZiBwdGVfb2Zmc2V0X21hcCAKKyNkZWZpbmUgcHRlX29mZnNldF9tYXAgcHRlX29mZnNldAorI2RlZmluZSBwdGVfdW5tYXAocHRlKQorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMTkpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICogdm1hbGxvY190b19wYWdlKHZvaWQgKiB2bWFsbG9jX2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHZtYWxsb2NfYWRkcjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJcGdkX3QgKnBnZCA9IHBnZF9vZmZzZXRfayhhZGRyKTsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGVwLCBwdGU7CisgIAorCWlmICghcGdkX25vbmUoKnBnZCkpIHsKKwkJcG1kID0gcG1kX29mZnNldChwZ2QsIGFkZHIpOworCQlpZiAoIXBtZF9ub25lKCpwbWQpKSB7CisJCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJCXB0ZXAgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHIpOworCQkJcHRlID0gKnB0ZXA7CisJCQlpZiAocHRlX3ByZXNlbnQocHRlKSkKKwkJCQlwYWdlID0gcHRlX3BhZ2UocHRlKTsKKwkJCXB0ZV91bm1hcChwdGVwKTsKKwkJCXByZWVtcHRfZW5hYmxlKCk7CisJCX0KKwl9CisJcmV0dXJuIHBhZ2U7Cit9CisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2RlZmluZSBEUk1fUlBSX0FSRyh2bWEpCisjZWxzZQorI2RlZmluZSBEUk1fUlBSX0FSRyh2bWEpIHZtYSwKKyNlbmRpZgorCisjZGVmaW5lIFZNX09GRlNFVCh2bWEpICgodm1hKS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCkKKworLypAfSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFxuYW1lIE1hY3JvcyB0byBtYWtlIHByaW50ayBlYXNpZXIgKi8KKy8qQHsqLworCisvKioKKyAqIEVycm9yIG91dHB1dC4KKyAqCisgKiBccGFyYW0gZm10IHByaW50ZigpIGxpa2UgZm9ybWF0IHN0cmluZy4KKyAqIFxwYXJhbSBhcmcgYXJndW1lbnRzCisgKi8KKyNkZWZpbmUgRFJNX0VSUk9SKGZtdCwgYXJnLi4uKSBcCisJcHJpbnRrKEtFUk5fRVJSICJbIiBEUk1fTkFNRSAiOiVzXSAqRVJST1IqICIgZm10ICwgX19GVU5DVElPTl9fICwgIyNhcmcpCisKKy8qKgorICogTWVtb3J5IGVycm9yIG91dHB1dC4KKyAqCisgKiBccGFyYW0gYXJlYSBtZW1vcnkgYXJlYSB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCisgKiBccGFyYW0gZm10IHByaW50ZigpIGxpa2UgZm9ybWF0IHN0cmluZy4KKyAqIFxwYXJhbSBhcmcgYXJndW1lbnRzCisgKi8KKyNkZWZpbmUgRFJNX01FTV9FUlJPUihhcmVhLCBmbXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX0VSUiAiWyIgRFJNX05BTUUgIjolczolc10gKkVSUk9SKiAiIGZtdCAsIF9fRlVOQ1RJT05fXywgXAorCSAgICAgICBkcm1fbWVtX3N0YXRzW2FyZWFdLm5hbWUgLCAjI2FyZykKKworI2RlZmluZSBEUk1fSU5GTyhmbXQsIGFyZy4uLikgIHByaW50ayhLRVJOX0lORk8gIlsiIERSTV9OQU1FICJdICIgZm10ICwgIyNhcmcpCisKKy8qKgorICogRGVidWcgb3V0cHV0LgorICogCisgKiBccGFyYW0gZm10IHByaW50ZigpIGxpa2UgZm9ybWF0IHN0cmluZy4KKyAqIFxwYXJhbSBhcmcgYXJndW1lbnRzCisgKi8KKyNpZiBEUk1fREVCVUdfQ09ERQorI2RlZmluZSBEUk1fREVCVUcoZm10LCBhcmcuLi4pCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKCBkcm1fZGVidWcgKQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHCQkJCVwKKwkJCSAgICAgICAiWyIgRFJNX05BTUUgIjolc10gIiBmbXQgLAlcCisJCQkgICAgICAgX19GVU5DVElPTl9fICwgIyNhcmcpOwkJCVwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRFJNX0RFQlVHKGZtdCwgYXJnLi4uKQkJIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIERSTV9QUk9DX0xJTUlUIChQQUdFX1NJWkUtODApCisKKyNkZWZpbmUgRFJNX1BST0NfUFJJTlQoZm10LCBhcmcuLi4pCQkJCQlcCisgICBsZW4gKz0gc3ByaW50ZigmYnVmW2xlbl0sIGZtdCAsICMjYXJnKTsJCQkJXAorICAgaWYgKGxlbiA+IERSTV9QUk9DX0xJTUlUKSB7ICplb2YgPSAxOyByZXR1cm4gbGVuIC0gb2Zmc2V0OyB9CisKKyNkZWZpbmUgRFJNX1BST0NfUFJJTlRfUkVUKHJldCwgZm10LCBhcmcuLi4pCQkJCVwKKyAgIGxlbiArPSBzcHJpbnRmKCZidWZbbGVuXSwgZm10ICwgIyNhcmcpOwkJCQlcCisgICBpZiAobGVuID4gRFJNX1BST0NfTElNSVQpIHsgcmV0OyAqZW9mID0gMTsgcmV0dXJuIGxlbiAtIG9mZnNldDsgfQorCisvKkB9Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgSW50ZXJuYWwgdHlwZXMgYW5kIHN0cnVjdHVyZXMgKi8KKy8qQHsqLworCisjZGVmaW5lIERSTV9BUlJBWV9TSVpFKHgpIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQorI2RlZmluZSBEUk1fTUlOKGEsYikgKChhKTwoYik/KGEpOihiKSkKKyNkZWZpbmUgRFJNX01BWChhLGIpICgoYSk+KGIpPyhhKTooYikpCisKKyNkZWZpbmUgRFJNX0xFRlRDT1VOVCh4KSAoKCh4KS0+cnAgKyAoeCktPmNvdW50IC0gKHgpLT53cCkgJSAoKHgpLT5jb3VudCArIDEpKQorI2RlZmluZSBEUk1fQlVGQ09VTlQoeCkgKCh4KS0+Y291bnQgLSBEUk1fTEVGVENPVU5UKHgpKQorI2RlZmluZSBEUk1fV0FJVENPVU5UKGRldixpZHgpIERSTV9CVUZDT1VOVCgmZGV2LT5xdWV1ZWxpc3RbaWR4XS0+d2FpdGxpc3QpCisKKyNkZWZpbmUgRFJNX0lGX1ZFUlNJT04obWFqLCBtaW4pIChtYWogPDwgMTYgfCBtaW4pCisvKioKKyAqIEdldCB0aGUgcHJpdmF0ZSBTQVJFQSBtYXBwaW5nLgorICoKKyAqIFxwYXJhbSBfZGV2IERSTSBkZXZpY2UuCisgKiBccGFyYW0gX2N0eCBjb250ZXh0IG51bWJlci4KKyAqIFxwYXJhbSBfbWFwIG91dHB1dCBtYXBwaW5nLgorICovCisjZGVmaW5lIERSTV9HRVRfUFJJVl9TQVJFQShfZGV2LCBfY3R4LCBfbWFwKSBkbyB7CVwKKwkoX21hcCkgPSAoX2RldiktPmNvbnRleHRfc2FyZWFzW19jdHhdOwkJXAorfSB3aGlsZSgwKQorCisvKioKKyAqIFRlc3QgdGhhdCB0aGUgaGFyZHdhcmUgbG9jayBpcyBoZWxkIGJ5IHRoZSBjYWxsZXIsIHJldHVybmluZyBvdGhlcndpc2UuCisgKgorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyIG9mIHRoZSBjYWxsZXIuCisgKi8KKyNkZWZpbmUgTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICggIV9EUk1fTE9DS19JU19IRUxEKCBkZXYtPmxvY2suaHdfbG9jay0+bG9jayApIHx8CQlcCisJICAgICBkZXYtPmxvY2suZmlscCAhPSBmaWxwICkgewkJCQlcCisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRob3V0IGxvY2sgaGVsZFxuIiwJCVwKKwkJCSAgIF9fRlVOQ1RJT05fXyApOwkJCQlcCisJCXJldHVybiAtRUlOVkFMOwkJCQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKioKKyAqIENvcHkgYW5kIElPQ1RMIHJldHVybiBzdHJpbmcgdG8gdXNlciBzcGFjZQorICovCisjZGVmaW5lIERSTV9DT1BZKCBuYW1lLCB2YWx1ZSApCQkJCQkJXAorCWxlbiA9IHN0cmxlbiggdmFsdWUgKTsJCQkJCQlcCisJaWYgKCBsZW4gPiBuYW1lIyNfbGVuICkgbGVuID0gbmFtZSMjX2xlbjsJCQlcCisJbmFtZSMjX2xlbiA9IHN0cmxlbiggdmFsdWUgKTsJCQkJCVwKKwlpZiAoIGxlbiAmJiBuYW1lICkgewkJCQkJCVwKKwkJaWYgKCBjb3B5X3RvX3VzZXIoIG5hbWUsIHZhbHVlLCBsZW4gKSApCQkJXAorCQkJcmV0dXJuIC1FRkFVTFQ7CQkJCQlcCisJfQorCQorLyoqCisgKiBJb2N0bCBmdW5jdGlvbiB0eXBlLgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIGFyZ3VtZW50LgorICovCit0eXBlZGVmIGludCBkcm1faW9jdGxfdCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2MgeworCWRybV9pb2N0bF90CSAgICAgKmZ1bmM7CisJaW50CQkgICAgIGF1dGhfbmVlZGVkOworCWludAkJICAgICByb290X29ubHk7Cit9IGRybV9pb2N0bF9kZXNjX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9kZXZzdGF0ZSB7CisJcGlkX3QJCSAgb3duZXI7CS8qKjwgWCBzZXJ2ZXIgcGlkIGhvbGRpbmcgeF9sb2NrICovCit9IGRybV9kZXZzdGF0ZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWFnaWNfZW50cnkgeworCWRybV9tYWdpY190CSAgICAgICBtYWdpYzsKKwlzdHJ1Y3QgZHJtX2ZpbGUJICAgICAgICpwcml2OworCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKm5leHQ7Cit9IGRybV9tYWdpY19lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWFnaWNfaGVhZCB7CisJc3RydWN0IGRybV9tYWdpY19lbnRyeSAqaGVhZDsKKwlzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5ICp0YWlsOworfSBkcm1fbWFnaWNfaGVhZF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fdm1hX2VudHJ5IHsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSAgKm5leHQ7CisJcGlkX3QJCSAgICAgIHBpZDsKK30gZHJtX3ZtYV9lbnRyeV90OworCisvKioKKyAqIERNQSBidWZmZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9idWYgeworCWludAkJICBpZHg7CSAgICAgICAvKio8IEluZGV4IGludG8gbWFzdGVyIGJ1Zmxpc3QgKi8KKwlpbnQJCSAgdG90YWw7ICAgICAgIC8qKjwgQnVmZmVyIHNpemUgKi8KKwlpbnQJCSAgb3JkZXI7ICAgICAgIC8qKjwgbG9nLWJhc2UtMih0b3RhbCkgKi8KKwlpbnQJCSAgdXNlZDsJICAgICAgIC8qKjwgQW1vdW50IG9mIGJ1ZmZlciBpbiB1c2UgKGZvciBETUEpICovCisJdW5zaWduZWQgbG9uZwkgIG9mZnNldDsgICAgICAvKio8IEJ5dGUgb2Zmc2V0ICh1c2VkIGludGVybmFsbHkpICovCisJdm9pZAkJICAqYWRkcmVzczsgICAgLyoqPCBBZGRyZXNzIG9mIGJ1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcJICBidXNfYWRkcmVzczsgLyoqPCBCdXMgYWRkcmVzcyBvZiBidWZmZXIgKi8KKwlzdHJ1Y3QgZHJtX2J1ZgkgICpuZXh0OyAgICAgICAvKio8IEtlcm5lbC1vbmx5OiB1c2VkIGZvciBmcmVlIGxpc3QgKi8KKwlfX3ZvbGF0aWxlX18gaW50ICB3YWl0aW5nOyAgICAgLyoqPCBPbiBrZXJuZWwgRE1BIHF1ZXVlICovCisJX192b2xhdGlsZV9fIGludCAgcGVuZGluZzsgICAgIC8qKjwgT24gaGFyZHdhcmUgRE1BIHF1ZXVlICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgZG1hX3dhaXQ7ICAgIC8qKjwgUHJvY2Vzc2VzIHdhaXRpbmcgKi8KKwlzdHJ1Y3QgZmlsZSAgICAgICAqZmlscDsgICAgICAgLyoqPCBQb2ludGVyIHRvIGhvbGRpbmcgZmlsZSBkZXNjciAqLworCWludAkJICBjb250ZXh0OyAgICAgLyoqPCBLZXJuZWwgcXVldWUgZm9yIHRoaXMgYnVmZmVyICovCisJaW50CQkgIHdoaWxlX2xvY2tlZDsvKio8IERpc3BhdGNoIHRoaXMgYnVmZmVyIHdoaWxlIGxvY2tlZCAqLworCWVudW0geworCQlEUk1fTElTVF9OT05FCSA9IDAsCisJCURSTV9MSVNUX0ZSRUUJID0gMSwKKwkJRFJNX0xJU1RfV0FJVAkgPSAyLAorCQlEUk1fTElTVF9QRU5ECSA9IDMsCisJCURSTV9MSVNUX1BSSU8JID0gNCwKKwkJRFJNX0xJU1RfUkVDTEFJTSA9IDUKKwl9CQkgIGxpc3Q7CSAgICAgICAvKio8IFdoaWNoIGxpc3Qgd2UncmUgb24gKi8KKworCWludAkJICBkZXZfcHJpdl9zaXplOyAvKio8IFNpemUgb2YgYnVmZmVyIHByaXZhdGUgc3RvcmFnZSAqLworCXZvaWQJCSAgKmRldl9wcml2YXRlOyAgLyoqPCBQZXItYnVmZmVyIHByaXZhdGUgc3RvcmFnZSAqLworfSBkcm1fYnVmX3Q7CisKKworLyoqIGJ1ZnMgaXMgb25lIGxvbmdlciB0aGFuIGl0IGhhcyB0byBiZSAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3dhaXRsaXN0IHsKKwlpbnQJCSAgY291bnQ7CS8qKjwgTnVtYmVyIG9mIHBvc3NpYmxlIGJ1ZmZlcnMgKi8KKwlkcm1fYnVmX3QJICAqKmJ1ZnM7CS8qKjwgTGlzdCBvZiBwb2ludGVycyB0byBidWZmZXJzICovCisJZHJtX2J1Zl90CSAgKipycDsJCS8qKjwgUmVhZCBwb2ludGVyICovCisJZHJtX2J1Zl90CSAgKip3cDsJCS8qKjwgV3JpdGUgcG9pbnRlciAqLworCWRybV9idWZfdAkgICoqZW5kOwkvKio8IEVuZCBwb2ludGVyICovCisJc3BpbmxvY2tfdAkgIHJlYWRfbG9jazsKKwlzcGlubG9ja190CSAgd3JpdGVfbG9jazsKK30gZHJtX3dhaXRsaXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9mcmVlbGlzdCB7CisJaW50CQkgIGluaXRpYWxpemVkOyAvKio8IEZyZWVsaXN0IGluIHVzZSAqLworCWF0b21pY190CSAgY291bnQ7ICAgICAgIC8qKjwgTnVtYmVyIG9mIGZyZWUgYnVmZmVycyAqLworCWRybV9idWZfdAkgICpuZXh0OyAgICAgICAvKio8IEVuZCBwb2ludGVyICovCisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0aW5nOyAgICAgLyoqPCBQcm9jZXNzZXMgd2FpdGluZyBvbiBmcmVlIGJ1ZnMgKi8KKwlpbnQJCSAgbG93X21hcms7ICAgIC8qKjwgTG93IHdhdGVyIG1hcmsgKi8KKwlpbnQJCSAgaGlnaF9tYXJrOyAgIC8qKjwgSGlnaCB3YXRlciBtYXJrICovCisJYXRvbWljX3QJICB3Zmg7CSAgICAgICAvKio8IElmIHdhaXRpbmcgZm9yIGhpZ2ggbWFyayAqLworCXNwaW5sb2NrX3QgICAgICAgIGxvY2s7Cit9IGRybV9mcmVlbGlzdF90OworCisvKioKKyAqIEJ1ZmZlciBlbnRyeS4gIFRoZXJlIGlzIG9uZSBvZiB0aGlzIGZvciBlYWNoIGJ1ZmZlciBzaXplIG9yZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2VudHJ5IHsKKwlpbnQJCSAgYnVmX3NpemU7CS8qKjwgc2l6ZSAqLworCWludAkJICBidWZfY291bnQ7CS8qKjwgbnVtYmVyIG9mIGJ1ZmZlcnMgKi8KKwlkcm1fYnVmX3QJICAqYnVmbGlzdDsJLyoqPCBidWZmZXIgbGlzdCAqLworCWludAkJICBzZWdfY291bnQ7CisJaW50CQkgIHBhZ2Vfb3JkZXI7CisJdW5zaWduZWQgbG9uZwkgICpzZWdsaXN0OworCisJZHJtX2ZyZWVsaXN0X3QJICBmcmVlbGlzdDsKK30gZHJtX2J1Zl9lbnRyeV90OworCisvKiogRmlsZSBwcml2YXRlIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9maWxlIHsKKwlpbnQJCSAgYXV0aGVudGljYXRlZDsKKwlpbnQJCSAgbWlub3I7CisJcGlkX3QJCSAgcGlkOworCXVpZF90CQkgIHVpZDsKKwlkcm1fbWFnaWNfdAkgIG1hZ2ljOworCXVuc2lnbmVkIGxvbmcJICBpb2N0bF9jb3VudDsKKwlzdHJ1Y3QgZHJtX2ZpbGUJICAqbmV4dDsKKwlzdHJ1Y3QgZHJtX2ZpbGUJICAqcHJldjsKKwlzdHJ1Y3QgZHJtX2hlYWQgICAqaGVhZDsKKwlpbnQgCQkgIHJlbW92ZV9hdXRoX29uX2Nsb3NlOworCXVuc2lnbmVkIGxvbmcgICAgIGxvY2tfY291bnQ7CisJdm9pZCAgICAgICAgICAgICAgKmRyaXZlcl9wcml2OworfSBkcm1fZmlsZV90OworCisvKiogV2FpdCBxdWV1ZSAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3F1ZXVlIHsKKwlhdG9taWNfdAkgIHVzZV9jb3VudDsJLyoqPCBPdXRzdGFuZGluZyB1c2VzICgrMSkgKi8KKwlhdG9taWNfdAkgIGZpbmFsaXphdGlvbjsJLyoqPCBGaW5hbGl6YXRpb24gaW4gcHJvZ3Jlc3MgKi8KKwlhdG9taWNfdAkgIGJsb2NrX2NvdW50OwkvKio8IENvdW50IG9mIHByb2Nlc3NlcyB3YWl0aW5nICovCisJYXRvbWljX3QJICBibG9ja19yZWFkOwkvKio8IFF1ZXVlIGJsb2NrZWQgZm9yIHJlYWRzICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF9xdWV1ZTsJLyoqPCBQcm9jZXNzZXMgd2FpdGluZyBvbiBibG9ja19yZWFkICovCisJYXRvbWljX3QJICBibG9ja193cml0ZTsJLyoqPCBRdWV1ZSBibG9ja2VkIGZvciB3cml0ZXMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV9xdWV1ZTsJLyoqPCBQcm9jZXNzZXMgd2FpdGluZyBvbiBibG9ja193cml0ZSAqLworI2lmIDEKKwlhdG9taWNfdAkgIHRvdGFsX3F1ZXVlZDsJLyoqPCBUb3RhbCBxdWV1ZWQgc3RhdGlzdGljICovCisJYXRvbWljX3QJICB0b3RhbF9mbHVzaGVkOy8qKjwgVG90YWwgZmx1c2hlcyBzdGF0aXN0aWMgKi8KKwlhdG9taWNfdAkgIHRvdGFsX2xvY2tzOwkvKio8IFRvdGFsIGxvY2tzIHN0YXRpc3RpY3MgKi8KKyNlbmRpZgorCWRybV9jdHhfZmxhZ3NfdAkgIGZsYWdzOwkvKio8IENvbnRleHQgcHJlc2VydmluZyBhbmQgMkQtb25seSAqLworCWRybV93YWl0bGlzdF90CSAgd2FpdGxpc3Q7CS8qKjwgUGVuZGluZyBidWZmZXJzICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgZmx1c2hfcXVldWU7CS8qKjwgUHJvY2Vzc2VzIHdhaXRpbmcgdW50aWwgZmx1c2ggKi8KK30gZHJtX3F1ZXVlX3Q7CisKKy8qKgorICogTG9jayBkYXRhLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fbG9ja19kYXRhIHsKKwlkcm1faHdfbG9ja190CSAgKmh3X2xvY2s7CS8qKjwgSGFyZHdhcmUgbG9jayAqLworCXN0cnVjdCBmaWxlICAgICAgICpmaWxwOwkvKio8IEZpbGUgZGVzY3Igb2YgbG9jayBob2xkZXIgKDA9a2VybmVsKSAqLworCXdhaXRfcXVldWVfaGVhZF90IGxvY2tfcXVldWU7CS8qKjwgUXVldWUgb2YgYmxvY2tlZCBwcm9jZXNzZXMgKi8KKwl1bnNpZ25lZCBsb25nCSAgbG9ja190aW1lOwkvKio8IFRpbWUgb2YgbGFzdCBsb2NrIGluIGppZmZpZXMgKi8KK30gZHJtX2xvY2tfZGF0YV90OworCisvKioKKyAqIERNQSBkYXRhLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fZGV2aWNlX2RtYSB7CisKKwlkcm1fYnVmX2VudHJ5X3QJICBidWZzW0RSTV9NQVhfT1JERVIrMV07CS8qKjwgYnVmZmVycywgZ3JvdXBlZCBieSB0aGVpciBzaXplIG9yZGVyICovCisJaW50CQkgIGJ1Zl9jb3VudDsJLyoqPCB0b3RhbCBudW1iZXIgb2YgYnVmZmVycyAqLworCWRybV9idWZfdAkgICoqYnVmbGlzdDsJLyoqPCBWZWN0b3Igb2YgcG9pbnRlcnMgaW50byBkcm1fZGV2aWNlX2RtYTo6YnVmcyAqLworCWludAkJICBzZWdfY291bnQ7CisJaW50CQkgIHBhZ2VfY291bnQ7CS8qKjwgbnVtYmVyIG9mIHBhZ2VzICovCisJdW5zaWduZWQgbG9uZwkgICpwYWdlbGlzdDsJLyoqPCBwYWdlIGxpc3QgKi8KKwl1bnNpZ25lZCBsb25nCSAgYnl0ZV9jb3VudDsKKwllbnVtIHsKKwkJX0RSTV9ETUFfVVNFX0FHUCA9IDB4MDEsCisJCV9EUk1fRE1BX1VTRV9TRyAgPSAweDAyCisJfSBmbGFnczsKKworfSBkcm1fZGV2aWNlX2RtYV90OworCisvKiogCisgKiBBR1AgbWVtb3J5IGVudHJ5LiAgU3RvcmVkIGFzIGEgZG91Ymx5IGxpbmtlZCBsaXN0LgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX21lbSB7CisJdW5zaWduZWQgbG9uZyAgICAgIGhhbmRsZTsJLyoqPCBoYW5kbGUgKi8KKwlEUk1fQUdQX01FTSAgICAgICAgKm1lbW9yeTsJCisJdW5zaWduZWQgbG9uZyAgICAgIGJvdW5kOwkvKio8IGFkZHJlc3MgKi8KKwlpbnQgICAgICAgICAgICAgICAgcGFnZXM7CisJc3RydWN0IGRybV9hZ3BfbWVtICpwcmV2OwkvKio8IHByZXZpb3VzIGVudHJ5ICovCisJc3RydWN0IGRybV9hZ3BfbWVtICpuZXh0OwkvKio8IG5leHQgZW50cnkgKi8KK30gZHJtX2FncF9tZW1fdDsKKworLyoqCisgKiBBR1AgZGF0YS4KKyAqCisgKiBcc2EgZHJtX2FncF9pbml0KCkgYW5kIGRybV9kZXZpY2U6OmFncC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9oZWFkIHsKKwlEUk1fQUdQX0tFUk4gICAgICAgYWdwX2luZm87CS8qKjwgQUdQIGRldmljZSBpbmZvcm1hdGlvbiAqLworCWRybV9hZ3BfbWVtX3QgICAgICAqbWVtb3J5OwkvKio8IG1lbW9yeSBlbnRyaWVzICovCisJdW5zaWduZWQgbG9uZyAgICAgIG1vZGU7CS8qKjwgQUdQIG1vZGUgKi8KKwlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICAqYnJpZGdlOworCWludCAgICAgICAgICAgICAgICBlbmFibGVkOwkvKio8IHdoZXRoZXIgdGhlIEFHUCBidXMgYXMgYmVlbiBlbmFibGVkICovCisJaW50ICAgICAgICAgICAgICAgIGFjcXVpcmVkOwkvKio8IHdoZXRoZXIgdGhlIEFHUCBkZXZpY2UgaGFzIGJlZW4gYWNxdWlyZWQgKi8KKwl1bnNpZ25lZCBsb25nICAgICAgYmFzZTsKKyAgIAlpbnQgCQkgICBhZ3BfbXRycjsKKwlpbnQJCSAgIGNhbnRfdXNlX2FwZXJ0dXJlOworCXVuc2lnbmVkIGxvbmcJICAgcGFnZV9tYXNrOworfSBkcm1fYWdwX2hlYWRfdDsKKworLyoqCisgKiBTY2F0dGVyLWdhdGhlciBtZW1vcnkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9zZ19tZW0geworCXVuc2lnbmVkIGxvbmcgICBoYW5kbGU7CisJdm9pZCAgICAgICAgICAgICp2aXJ0dWFsOworCWludCAgICAgICAgICAgICBwYWdlczsKKwlzdHJ1Y3QgcGFnZSAgICAgKipwYWdlbGlzdDsKKwlkbWFfYWRkcl90CSpidXNhZGRyOworfSBkcm1fc2dfbWVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9zaWdkYXRhIHsKKwlpbnQgICAgICAgICAgIGNvbnRleHQ7CisJZHJtX2h3X2xvY2tfdCAqbG9jazsKK30gZHJtX3NpZ2RhdGFfdDsKKworLyoqCisgKiBNYXBwaW5ncyBsaXN0CisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9tYXBfbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZAloZWFkOwkvKio8IGxpc3QgaGVhZCAqLworCWRybV9tYXBfdAkJKm1hcDsJLyoqPCBtYXBwaW5nICovCit9IGRybV9tYXBfbGlzdF90OworCit0eXBlZGVmIGRybV9tYXBfdCBkcm1fbG9jYWxfbWFwX3Q7CisKKy8qKgorICogQ29udGV4dCBoYW5kbGUgbGlzdAorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fY3R4X2xpc3QgeworCXN0cnVjdCBsaXN0X2hlYWQJaGVhZDsgICAvKio8IGxpc3QgaGVhZCAqLworCWRybV9jb250ZXh0X3QJCWhhbmRsZTsgLyoqPCBjb250ZXh0IGhhbmRsZSAqLworCWRybV9maWxlX3QJCSp0YWc7ICAgLyoqPCBhc3NvY2lhdGVkIGZkIHByaXZhdGUgZGF0YSAqLworfSBkcm1fY3R4X2xpc3RfdDsKKworCit0eXBlZGVmIHN0cnVjdCBkcm1fdmJsX3NpZyB7CisJc3RydWN0IGxpc3RfaGVhZAloZWFkOworCXVuc2lnbmVkIGludAkJc2VxdWVuY2U7CisJc3RydWN0IHNpZ2luZm8JCWluZm87CisJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOworfSBkcm1fdmJsX3NpZ190OworCisKKy8qKgorICogRFJNIGRyaXZlciBzdHJ1Y3R1cmUuIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudCB0aGUgY29tbW9uIGNvZGUgZm9yCisgKiBhIGZhbWlseSBvZiBjYXJkcy4gVGhlcmUgd2lsbCBvbmUgZHJtX2RldmljZSBmb3IgZWFjaCBjYXJkIHByZXNlbnQKKyAqIGluIHRoaXMgZmFtaWx5CisgKi8KK3N0cnVjdCBkcm1fZGV2aWNlOworCitzdHJ1Y3QgZHJtX2RyaXZlciB7CisJaW50ICgqcHJlaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJdm9pZCAoKnByZXJlbGVhc2UpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBmaWxlICpmaWxwKTsKKwl2b2lkICgqcHJldGFrZWRvd24pKHN0cnVjdCBkcm1fZGV2aWNlICopOworCWludCAoKnBvc3RjbGVhbnVwKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlpbnQgKCpwcmVzZXR1cCkoc3RydWN0IGRybV9kZXZpY2UgKik7CisJaW50ICgqcG9zdHNldHVwKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKyAJaW50ICgqZG1hX2lvY3RsKSggRFJNX0lPQ1RMX0FSR1MgKTsKKwlpbnQgKCpvcGVuX2hlbHBlcikoc3RydWN0IGRybV9kZXZpY2UgKiwgZHJtX2ZpbGVfdCAqKTsKKwl2b2lkICgqZnJlZV9maWxwX3ByaXYpKHN0cnVjdCBkcm1fZGV2aWNlICosIGRybV9maWxlX3QgKik7CisJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBmaWxlICpmaWxwKTsKKwl2b2lkICgqZG1hX3JlYWR5KShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlpbnQgKCpkbWFfcXVpZXNjZW50KShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlpbnQgKCpjb250ZXh0X2N0b3IpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjb250ZXh0KTsKKyAJaW50ICgqY29udGV4dF9kdG9yKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY29udGV4dCk7CisgCWludCAoKmtlcm5lbF9jb250ZXh0X3N3aXRjaCkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG9sZCwgaW50IG5ldyk7CisJdm9pZCAoKmtlcm5lbF9jb250ZXh0X3N3aXRjaF91bmxvY2spKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9sb2NrX3QgKmxvY2spOworCWludCAoKnZibGFua193YWl0KShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKKwkvKiB0aGVzZSBoYXZlIHRvIGJlIGZpbGxlZCBpbiAqLworIAlpbnQgKCpwb3N0aW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJaXJxcmV0dXJuX3QgKCppcnFfaGFuZGxlcikoIERSTV9JUlFfQVJHUyApOworIAl2b2lkICgqaXJxX3ByZWluc3RhbGwpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworIAl2b2lkICgqaXJxX3Bvc3RpbnN0YWxsKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKyAJdm9pZCAoKmlycV91bmluc3RhbGwpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCXZvaWQgKCpyZWNsYWltX2J1ZmZlcnMpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKKwl1bnNpZ25lZCBsb25nICgqZ2V0X21hcF9vZnMpKGRybV9tYXBfdCAqbWFwKTsKKwl1bnNpZ25lZCBsb25nICgqZ2V0X3JlZ19vZnMpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCXZvaWQgKCpzZXRfdmVyc2lvbikoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX3NldF92ZXJzaW9uX3QgKnN2KTsKKyAJaW50ICgqdmVyc2lvbikoZHJtX3ZlcnNpb25fdCAqdmVyc2lvbik7CisJdTMyIGRyaXZlcl9mZWF0dXJlczsKKwlpbnQgZGV2X3ByaXZfc2l6ZTsKKwlkcm1faW9jdGxfZGVzY190ICppb2N0bHM7CisJaW50IG51bV9pb2N0bHM7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzOworCXN0cnVjdCBwY2lfZHJpdmVyIHBjaV9kcml2ZXI7Cit9OworCisvKioKKyAqIERSTSBoZWFkIHN0cnVjdHVyZS4gVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50IGEgdmlkZW8gaGVhZCBvbiBhIGNhcmQKKyAqIHRoYXQgbWF5IGNvbnRhaW4gbXVsdGlwbGUgaGVhZHMuIEVtYmVkIG9uZSBwZXIgaGVhZCBvZiB0aGVzZSBpbiB0aGUKKyAqIHByaXZhdGUgZHJtX2RldmljZSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9oZWFkIHsKKwlpbnQgbWlub3I7CQkJLyoqPCBNaW5vciBkZXZpY2UgbnVtYmVyICovCisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRldl9yb290OyAgLyoqPCBwcm9jIGRpcmVjdG9yeSBlbnRyeSAqLworCWRldl90IGRldmljZTsJCQkvKio8IERldmljZSBudW1iZXIgZm9yIG1rbm9kICovCisJc3RydWN0IGNsYXNzX2RldmljZSAqZGV2X2NsYXNzOworfSBkcm1faGVhZF90OworCisvKioKKyAqIERSTSBkZXZpY2Ugc3RydWN0dXJlLiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnQgYSBjb21wbGV0ZSBjYXJkIHRoYXQKKyAqIG1heSBjb250YWluIG11bHRpcGxlIGhlYWRzLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fZGV2aWNlIHsKKwljaGFyCQkgICp1bmlxdWU7CS8qKjwgVW5pcXVlIGlkZW50aWZpZXI6IGUuZy4sIGJ1c2lkICovCisJaW50CQkgIHVuaXF1ZV9sZW47CS8qKjwgTGVuZ3RoIG9mIHVuaXF1ZSBmaWVsZCAqLworCWNoYXIJCSAgKmRldm5hbWU7CS8qKjwgRm9yIC9wcm9jL2ludGVycnVwdHMgKi8KKwlpbnQJCSAgaWZfdmVyc2lvbjsJLyoqPCBIaWdoZXN0IGludGVyZmFjZSB2ZXJzaW9uIHNldCAqLworCisJaW50CQkgIGJsb2NrZWQ7CS8qKjwgQmxvY2tlZCBkdWUgdG8gVkMgc3dpdGNoPyAqLworCisJLyoqIFxuYW1lIExvY2tzICovCisJLypAeyovCisJc3BpbmxvY2tfdAkgIGNvdW50X2xvY2s7CS8qKjwgRm9yIGludXNlLCBkcm1fZGV2aWNlOjpvcGVuX2NvdW50LCBkcm1fZGV2aWNlOjpidWZfdXNlICovCisJc3RydWN0IHNlbWFwaG9yZSAgc3RydWN0X3NlbTsJLyoqPCBGb3Igb3RoZXJzICovCisJLypAfSovCisKKwkvKiogXG5hbWUgVXNhZ2UgQ291bnRlcnMgKi8KKwkvKkB7Ki8KKwlpbnQJCSAgb3Blbl9jb3VudDsJLyoqPCBPdXRzdGFuZGluZyBmaWxlcyBvcGVuICovCisJYXRvbWljX3QJICBpb2N0bF9jb3VudDsJLyoqPCBPdXRzdGFuZGluZyBJT0NUTHMgcGVuZGluZyAqLworCWF0b21pY190CSAgdm1hX2NvdW50OwkvKio8IE91dHN0YW5kaW5nIHZtYSBhcmVhcyBvcGVuICovCisJaW50CQkgIGJ1Zl91c2U7CS8qKjwgQnVmZmVycyBpbiB1c2UgLS0gY2Fubm90IGFsbG9jICovCisJYXRvbWljX3QJICBidWZfYWxsb2M7CS8qKjwgQnVmZmVyIGFsbG9jYXRpb24gaW4gcHJvZ3Jlc3MgKi8KKwkvKkB9Ki8KKworCS8qKiBcbmFtZSBQZXJmb3JtYW5jZSBjb3VudGVycyAqLworCS8qQHsqLworCXVuc2lnbmVkIGxvbmcgICAgIGNvdW50ZXJzOworCWRybV9zdGF0X3R5cGVfdCAgIHR5cGVzWzE1XTsKKwlhdG9taWNfdCAgICAgICAgICBjb3VudHNbMTVdOworCS8qQH0qLworCisJLyoqIFxuYW1lIEF1dGhlbnRpY2F0aW9uICovCisJLypAeyovCisJZHJtX2ZpbGVfdAkgICpmaWxlX2ZpcnN0OwkvKio8IGZpbGUgbGlzdCBoZWFkICovCisJZHJtX2ZpbGVfdAkgICpmaWxlX2xhc3Q7CS8qKjwgZmlsZSBsaXN0IHRhaWwgKi8KKwlkcm1fbWFnaWNfaGVhZF90ICBtYWdpY2xpc3RbRFJNX0hBU0hfU0laRV07CS8qKjwgbWFnaWMgaGFzaCB0YWJsZSAqLworCS8qQH0qLworCisJLyoqIFxuYW1lIE1lbW9yeSBtYW5hZ2VtZW50ICovCisJLypAeyovCisJZHJtX21hcF9saXN0X3QJICAqbWFwbGlzdDsJLyoqPCBMaW5rZWQgbGlzdCBvZiByZWdpb25zICovCisJaW50CQkgIG1hcF9jb3VudDsJLyoqPCBOdW1iZXIgb2YgbWFwcGFibGUgcmVnaW9ucyAqLworCisJLyoqIFxuYW1lIENvbnRleHQgaGFuZGxlIG1hbmFnZW1lbnQgKi8KKwkvKkB7Ki8KKwlkcm1fY3R4X2xpc3RfdAkgICpjdHhsaXN0OwkvKio8IExpbmtlZCBsaXN0IG9mIGNvbnRleHQgaGFuZGxlcyAqLworCWludAkJICBjdHhfY291bnQ7CS8qKjwgTnVtYmVyIG9mIGNvbnRleHQgaGFuZGxlcyAqLworCXN0cnVjdCBzZW1hcGhvcmUgIGN0eGxpc3Rfc2VtOwkvKio8IEZvciBjdHhsaXN0ICovCisKKwlkcm1fbWFwX3QJICAqKmNvbnRleHRfc2FyZWFzOyAvKio8IHBlci1jb250ZXh0IFNBUkVBJ3MgKi8KKwlpbnQJCSAgbWF4X2NvbnRleHQ7CisKKwlkcm1fdm1hX2VudHJ5X3QJICAqdm1hbGlzdDsJLyoqPCBMaXN0IG9mIHZtYXMgKGZvciBkZWJ1Z2dpbmcpICovCisJZHJtX2xvY2tfZGF0YV90CSAgbG9jazsJCS8qKjwgSW5mb3JtYXRpb24gb24gaGFyZHdhcmUgbG9jayAqLworCS8qQH0qLworCisJLyoqIFxuYW1lIERNQSBxdWV1ZXMgKGNvbnRleHRzKSAqLworCS8qQHsqLworCWludAkJICBxdWV1ZV9jb3VudDsJLyoqPCBOdW1iZXIgb2YgYWN0aXZlIERNQSBxdWV1ZXMgKi8KKwlpbnQJCSAgcXVldWVfcmVzZXJ2ZWQ7IC8qKjwgTnVtYmVyIG9mIHJlc2VydmVkIERNQSBxdWV1ZXMgKi8KKwlpbnQJCSAgcXVldWVfc2xvdHM7CS8qKjwgQWN0dWFsIGxlbmd0aCBvZiBxdWV1ZWxpc3QgKi8KKwlkcm1fcXVldWVfdAkgICoqcXVldWVsaXN0OwkvKio8IFZlY3RvciBvZiBwb2ludGVycyB0byBETUEgcXVldWVzICovCisJZHJtX2RldmljZV9kbWFfdCAgKmRtYTsJCS8qKjwgT3B0aW9uYWwgcG9pbnRlciBmb3IgRE1BIHN1cHBvcnQgKi8KKwkvKkB9Ki8KKworCS8qKiBcbmFtZSBDb250ZXh0IHN1cHBvcnQgKi8KKwkvKkB7Ki8KKwlpbnQJCSAgaXJxOwkJLyoqPCBJbnRlcnJ1cHQgdXNlZCBieSBib2FyZCAqLworCWludAkJICBpcnFfZW5hYmxlZDsJLyoqPCBUcnVlIGlmIGlycSBoYW5kbGVyIGlzIGVuYWJsZWQgKi8KKwlfX3ZvbGF0aWxlX18gbG9uZyBjb250ZXh0X2ZsYWc7CS8qKjwgQ29udGV4dCBzd2FwcGluZyBmbGFnICovCisJX192b2xhdGlsZV9fIGxvbmcgaW50ZXJydXB0X2ZsYWc7IC8qKjwgSW50ZXJydXB0aW9uIGhhbmRsZXIgZmxhZyAqLworCV9fdm9sYXRpbGVfXyBsb25nIGRtYV9mbGFnOwkvKio8IERNQSBkaXNwYXRjaCBmbGFnICovCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qKjwgVGltZXIgZm9yIGRlbGF5aW5nIGN0eCBzd2l0Y2ggKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBjb250ZXh0X3dhaXQ7IC8qKjwgUHJvY2Vzc2VzIHdhaXRpbmcgb24gY3R4IHN3aXRjaCAqLworCWludAkJICBsYXN0X2NoZWNrZWQ7CS8qKjwgTGFzdCBjb250ZXh0IGNoZWNrZWQgZm9yIERNQSAqLworCWludAkJICBsYXN0X2NvbnRleHQ7CS8qKjwgTGFzdCBjdXJyZW50IGNvbnRleHQgKi8KKwl1bnNpZ25lZCBsb25nCSAgbGFzdF9zd2l0Y2g7CS8qKjwgamlmZmllcyBhdCBsYXN0IGNvbnRleHQgc3dpdGNoICovCisJLypAfSovCisJCisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJLyoqIFxuYW1lIFZCTEFOSyBJUlEgc3VwcG9ydCAqLworCS8qQHsqLworCisgICAJd2FpdF9xdWV1ZV9oZWFkX3QgdmJsX3F1ZXVlOwkvKio8IFZCTEFOSyB3YWl0IHF1ZXVlICovCisgICAJYXRvbWljX3QgICAgICAgICAgdmJsX3JlY2VpdmVkOworCXNwaW5sb2NrX3QgICAgICAgIHZibF9sb2NrOworCWRybV92Ymxfc2lnX3QgICAgIHZibF9zaWdzOwkvKio8IHNpZ25hbCBsaXN0IHRvIHNlbmQgb24gVkJMQU5LICovCisJdW5zaWduZWQgaW50ICAgICAgdmJsX3BlbmRpbmc7CisKKwkvKkB9Ki8KKwljeWNsZXNfdAkgIGN0eF9zdGFydDsKKwljeWNsZXNfdAkgIGxja19zdGFydDsKKworCWNoYXIJCSAgYnVmW0RSTV9CU1pdOyAvKio8IE91dHB1dCBidWZmZXIgKi8KKwljaGFyCQkgICpidWZfcnA7CS8qKjwgUmVhZCBwb2ludGVyICovCisJY2hhcgkJICAqYnVmX3dwOwkvKio8IFdyaXRlIHBvaW50ZXIgKi8KKwljaGFyCQkgICpidWZfZW5kOwkvKio8IEVuZCBwb2ludGVyICovCisJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmJ1Zl9hc3luYzsvKio8IFByb2Nlc3NlcyB3YWl0aW5nIGZvciBTSUdJTyAqLworCXdhaXRfcXVldWVfaGVhZF90IGJ1Zl9yZWFkZXJzOwkvKio8IFByb2Nlc3NlcyB3YWl0aW5nIHRvIHJlYWQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBidWZfd3JpdGVyczsJLyoqPCBQcm9jZXNzZXMgd2FpdGluZyB0byBjdHggc3dpdGNoICovCisKKwlkcm1fYWdwX2hlYWRfdCAgICAqYWdwOwkvKio8IEFHUCBkYXRhICovCisKKwlzdHJ1Y3QgcGNpX2RldiAgICAqcGRldjsJLyoqPCBQQ0kgZGV2aWNlIHN0cnVjdHVyZSAqLworCWludCAgICAgICAgICAgICAgIHBjaV9kb21haW47CS8qKjwgUENJIGJ1cyBkb21haW4gbnVtYmVyICovCisJaW50ICAgICAgICAgICAgICAgcGNpX2J1czsJLyoqPCBQQ0kgYnVzIG51bWJlciAqLworCWludCAgICAgICAgICAgICAgIHBjaV9zbG90OwkvKio8IFBDSSBzbG90IG51bWJlciAqLworCWludCAgICAgICAgICAgICAgIHBjaV9mdW5jOwkvKio8IFBDSSBmdW5jdGlvbiBudW1iZXIgKi8KKyNpZmRlZiBfX2FscGhhX18KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMykKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xlciAqaG9zZTsKKyNlbHNlCisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworI2VuZGlmCisjZW5kaWYKKwlkcm1fc2dfbWVtX3QgICAgICAqc2c7ICAvKio8IFNjYXR0ZXIgZ2F0aGVyIG1lbW9yeSAqLworCXVuc2lnbmVkIGxvbmcgICAgICpjdHhfYml0bWFwOwkvKio8IGNvbnRleHQgYml0bWFwICovCisJdm9pZAkJICAqZGV2X3ByaXZhdGU7IC8qKjwgZGV2aWNlIHByaXZhdGUgZGF0YSAqLworCWRybV9zaWdkYXRhX3QgICAgIHNpZ2RhdGE7IC8qKjwgRm9yIGJsb2NrX2FsbF9zaWduYWxzICovCisJc2lnc2V0X3QgICAgICAgICAgc2lnbWFzazsKKworCXN0cnVjdCAgICAgICAgICAgIGRybV9kcml2ZXIgKmRyaXZlcjsKKwlkcm1fbG9jYWxfbWFwX3QgICAqYWdwX2J1ZmZlcl9tYXA7CisJZHJtX2hlYWRfdCBwcmltYXJ5OwkJLyoqPCBwcmltYXJ5IHNjcmVlbiBoZWFkICovCit9IGRybV9kZXZpY2VfdDsKKworc3RhdGljIF9faW5saW5lX18gaW50IGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGZlYXR1cmUpCit7CisJcmV0dXJuICgoZGV2LT5kcml2ZXItPmRyaXZlcl9mZWF0dXJlcyAmIGZlYXR1cmUpID8gMSA6IDApOworfQorCisjaWYgX19PU19IQVNfQUdQCitzdGF0aWMgaW5saW5lIGludCBkcm1fY29yZV9oYXNfQUdQKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisgIHJldHVybiBkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1VTRV9BR1ApOworfQorI2Vsc2UKKyNkZWZpbmUgZHJtX2NvcmVfaGFzX0FHUChkZXYpICgwKQorI2VuZGlmCisKKyNpZiBfX09TX0hBU19NVFJSCitzdGF0aWMgaW5saW5lIGludCBkcm1fY29yZV9oYXNfTVRSUihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworICByZXR1cm4gZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9VU0VfTVRSUik7Cit9CisjZWxzZQorI2RlZmluZSBkcm1fY29yZV9oYXNfTVRSUihkZXYpICgwKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgSW50ZXJuYWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKi8KKy8qQHsqLworCisJCQkJLyogTWlzYy4gc3VwcG9ydCAoZHJtX2luaXQuaCkgKi8KK2V4dGVybiBpbnQJICAgICBkcm1fZmxhZ3M7CitleHRlcm4gdm9pZAkgICAgIGRybV9wYXJzZV9vcHRpb25zKCBjaGFyICpzICk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1fY3B1X3ZhbGlkKCB2b2lkICk7CisKKwkJCQkvKiBEcml2ZXIgc3VwcG9ydCAoZHJtX2Rydi5oKSAqLworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2luaXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcik7CitleHRlcm4gdm9pZCAgICAgICAgICBkcm1fZXhpdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybV92ZXJzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybV90YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpOworCisJCQkJLyogRGV2aWNlIHN1cHBvcnQgKGRybV9mb3BzLmgpICovCitleHRlcm4gaW50ICAgICAgICAgICBkcm1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1fc3R1Yl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKK2V4dGVybiBpbnQJICAgICBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICAgZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludAkgICAgIGRybV9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gaW50CSAgICAgZHJtX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOworCisJCQkJLyogTWFwcGluZyBzdXBwb3J0IChkcm1fdm0uaCkgKi8KK2V4dGVybiB2b2lkCSAgICAgZHJtX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIHZvaWQJICAgICBkcm1fdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIHZvaWQJICAgICBkcm1fdm1fc2htX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKK2V4dGVybiBpbnQJICAgICBkcm1fbW1hcF9kbWEoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIGludAkgICAgIGRybV9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CitleHRlcm4gdW5zaWduZWQgaW50ICBkcm1fcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KTsKK2V4dGVybiBzc2l6ZV90ICAgICAgIGRybV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKTsKKworCQkJCS8qIE1lbW9yeSBtYW5hZ2VtZW50IHN1cHBvcnQgKGRybV9tZW1vcnkuaCkgKi8KKyNpbmNsdWRlICJkcm1fbWVtb3J5LmgiCitleHRlcm4gdm9pZAkgICAgIGRybV9tZW1faW5pdCh2b2lkKTsKK2V4dGVybiBpbnQJICAgICBkcm1fbWVtX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCQkgICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworZXh0ZXJuIHZvaWQJICAgICAqZHJtX2NhbGxvYyhzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLCBpbnQgYXJlYSk7CitleHRlcm4gdm9pZAkgICAgICpkcm1fcmVhbGxvYyh2b2lkICpvbGRwdCwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplLAorCQkJCSAgIGludCBhcmVhKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybV9hbGxvY19wYWdlcyhpbnQgb3JkZXIsIGludCBhcmVhKTsKK2V4dGVybiB2b2lkCSAgICAgZHJtX2ZyZWVfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgb3JkZXIsCisJCQkJICAgICBpbnQgYXJlYSk7CitleHRlcm4gdm9pZAkgICAgICpkcm1faW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZAkgICAgICpkcm1faW9yZW1hcF9ub2NhY2hlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCSAgIGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiB2b2lkCSAgICAgZHJtX2lvcmVtYXBmcmVlKHZvaWQgKnB0LCB1bnNpZ25lZCBsb25nIHNpemUsIGRybV9kZXZpY2VfdCAqZGV2KTsKKworZXh0ZXJuIERSTV9BR1BfTUVNICAgKmRybV9hbGxvY19hZ3Aoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCBpbnQgcGFnZXMsIHUzMiB0eXBlKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybV9mcmVlX2FncChEUk1fQUdQX01FTSAqaGFuZGxlLCBpbnQgcGFnZXMpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2JpbmRfYWdwKERSTV9BR1BfTUVNICpoYW5kbGUsIHVuc2lnbmVkIGludCBzdGFydCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1fdW5iaW5kX2FncChEUk1fQUdQX01FTSAqaGFuZGxlKTsKKworCQkJCS8qIE1pc2MuIElPQ1RMIHN1cHBvcnQgKGRybV9pb2N0bC5oKSAqLworZXh0ZXJuIGludAkgICAgIGRybV9pcnFfYnlfYnVzaWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQJICAgICBkcm1fZ2V0dW5pcXVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50CSAgICAgZHJtX3NldHVuaXF1ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludAkgICAgIGRybV9nZXRtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQJICAgICBkcm1fZ2V0Y2xpZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50CSAgICAgZHJtX2dldHN0YXRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQJICAgICBkcm1fc2V0dmVyc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworCQkJCS8qIENvbnRleHQgSU9DVEwgc3VwcG9ydCAoZHJtX2NvbnRleHQuaCkgKi8KK2V4dGVybiBpbnQJICAgICBkcm1fcmVzY3R4KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CitleHRlcm4gaW50CSAgICAgZHJtX2FkZGN0eCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworZXh0ZXJuIGludAkgICAgIGRybV9tb2RjdHgoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKK2V4dGVybiBpbnQJICAgICBkcm1fZ2V0Y3R4KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CitleHRlcm4gaW50CSAgICAgZHJtX3N3aXRjaGN0eCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworZXh0ZXJuIGludAkgICAgIGRybV9uZXdjdHgoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKK2V4dGVybiBpbnQJICAgICBkcm1fcm1jdHgoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworCitleHRlcm4gaW50CSAgICAgZHJtX2NvbnRleHRfc3dpdGNoKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgb2xkLCBpbnQgbmV3KTsKK2V4dGVybiBpbnQJICAgICBkcm1fY29udGV4dF9zd2l0Y2hfY29tcGxldGUoZHJtX2RldmljZV90ICpkZXYsIGludCBuZXcpOworCitleHRlcm4gaW50CSAgICAgZHJtX2N0eGJpdG1hcF9pbml0KCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQJICAgICBkcm1fY3R4Yml0bWFwX2NsZWFudXAoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCAgICAgICAgICBkcm1fY3R4Yml0bWFwX2ZyZWUoIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgY3R4X2hhbmRsZSApOworCitleHRlcm4gaW50CSAgICAgZHJtX3NldHNhcmVhY3R4KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKK2V4dGVybiBpbnQJICAgICBkcm1fZ2V0c2FyZWFjdHgoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworCisJCQkJLyogRHJhd2FibGUgSU9DVEwgc3VwcG9ydCAoZHJtX2RyYXdhYmxlLmgpICovCitleHRlcm4gaW50CSAgICAgZHJtX2FkZGRyYXcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50CSAgICAgZHJtX3JtZHJhdyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCisKKwkJCQkvKiBBdXRoZW50aWNhdGlvbiBJT0NUTCBzdXBwb3J0IChkcm1fYXV0aC5oKSAqLworZXh0ZXJuIGludAkgICAgIGRybV9hZGRfbWFnaWMoZHJtX2RldmljZV90ICpkZXYsIGRybV9maWxlX3QgKnByaXYsCisJCQkJICAgIGRybV9tYWdpY190IG1hZ2ljKTsKK2V4dGVybiBpbnQJICAgICBkcm1fcmVtb3ZlX21hZ2ljKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbWFnaWNfdCBtYWdpYyk7CitleHRlcm4gaW50CSAgICAgZHJtX2dldG1hZ2ljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQJICAgICBkcm1fYXV0aG1hZ2ljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGxhY2Vob2xkZXIgZm9yIGlvY3RscyBwYXN0ICovCitleHRlcm4gaW50CSAgICAgZHJtX25vb3Aoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKKwkJCQkvKiBMb2NraW5nIElPQ1RMIHN1cHBvcnQgKGRybV9sb2NrLmgpICovCitleHRlcm4gaW50ICAgICAgICAgICBkcm1fbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1fdW5sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50CSAgICAgZHJtX2xvY2tfdGFrZShfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICpsb2NrLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY29udGV4dCk7CitleHRlcm4gaW50CSAgICAgZHJtX2xvY2tfdHJhbnNmZXIoZHJtX2RldmljZV90ICpkZXYsCisJCQkJCV9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKmxvY2ssCisJCQkJCXVuc2lnbmVkIGludCBjb250ZXh0KTsKK2V4dGVybiBpbnQJICAgICBkcm1fbG9ja19mcmVlKGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgICBfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICpsb2NrLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY29udGV4dCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1fbm90aWZpZXIodm9pZCAqcHJpdik7CisKKwkJCQkvKiBCdWZmZXIgbWFuYWdlbWVudCBzdXBwb3J0IChkcm1fYnVmcy5oKSAqLworZXh0ZXJuIGludAkgICAgIGRybV9vcmRlciggdW5zaWduZWQgbG9uZyBzaXplICk7CitleHRlcm4gaW50CSAgICAgZHJtX2FkZG1hcCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworZXh0ZXJuIGludAkgICAgIGRybV9ybW1hcCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CitleHRlcm4gaW50CSAgICAgZHJtX2FkZGJ1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CitleHRlcm4gaW50CSAgICAgZHJtX2luZm9idWZzKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKK2V4dGVybiBpbnQJICAgICBkcm1fbWFya2J1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworZXh0ZXJuIGludAkgICAgIGRybV9mcmVlYnVmcyggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CitleHRlcm4gaW50CSAgICAgZHJtX21hcGJ1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CisKKwkJCQkvKiBETUEgc3VwcG9ydCAoZHJtX2RtYS5oKSAqLworZXh0ZXJuIGludAkgICAgIGRybV9kbWFfc2V0dXAoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQJICAgICBkcm1fZG1hX3Rha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiB2b2lkCSAgICAgZHJtX2ZyZWVfYnVmZmVyKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1Zik7CitleHRlcm4gdm9pZAkgICAgIGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOworCisJCQkJLyogSVJRIHN1cHBvcnQgKGRybV9pcnEuaCkgKi8KK2V4dGVybiBpbnQgICAgICAgICAgIGRybV9jb250cm9sKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2lycV9pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gaXJxcmV0dXJuX3QgICBkcm1faXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApOworZXh0ZXJuIHZvaWQgICAgICAgICAgZHJtX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiB2b2lkICAgICAgICAgIGRybV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQgICAgICAgICAgZHJtX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworCitleHRlcm4gaW50ICAgICAgICAgICBkcm1fd2FpdF92Ymxhbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnZibF9zZXEpOworZXh0ZXJuIHZvaWQgICAgICAgICAgZHJtX3ZibF9zZW5kX3NpZ25hbHMoIGRybV9kZXZpY2VfdCAqZGV2ICk7CisKKwkJCQkvKiBBR1AvR0FSVCBzdXBwb3J0IChkcm1fYWdwc3VwcG9ydC5oKSAqLworZXh0ZXJuIGRybV9hZ3BfaGVhZF90ICpkcm1fYWdwX2luaXQoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludCAgICAgICAgICAgIGRybV9hZ3BfYWNxdWlyZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIHZvaWQgICAgICAgICAgIGRybV9hZ3BfZG9fcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF9lbmFibGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCAgICAgICAgICAgIGRybV9hZ3BfaW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCAgICAgICAgICAgIGRybV9hZ3BfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF9mcmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF91bmJpbmQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCAgICAgICAgICAgIGRybV9hZ3BfYmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIERSTV9BR1BfTUVNICAgICpkcm1fYWdwX2FsbG9jYXRlX21lbW9yeShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsIHNpemVfdCBwYWdlcywgdTMyIHR5cGUpOworZXh0ZXJuIGludCAgICAgICAgICAgIGRybV9hZ3BfZnJlZV9tZW1vcnkoRFJNX0FHUF9NRU0gKmhhbmRsZSk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF9iaW5kX21lbW9yeShEUk1fQUdQX01FTSAqaGFuZGxlLCBvZmZfdCBzdGFydCk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF91bmJpbmRfbWVtb3J5KERSTV9BR1BfTUVNICpoYW5kbGUpOworCisJCQkJLyogU3R1YiBzdXBwb3J0IChkcm1fc3R1Yi5oKSAqLworZXh0ZXJuIGludCBkcm1fZ2V0X2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKKwkJICAgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKTsKK2V4dGVybiBpbnQgZHJtX3B1dF9kZXYoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgZHJtX2dldF9oZWFkKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2hlYWRfdCAqaGVhZCk7CitleHRlcm4gaW50IGRybV9wdXRfaGVhZChkcm1faGVhZF90ICogaGVhZCk7CitleHRlcm4gdW5zaWduZWQgaW50ICAgZHJtX2RlYnVnOworZXh0ZXJuIHVuc2lnbmVkIGludCAgIGRybV9jYXJkc19saW1pdDsKK2V4dGVybiBkcm1faGVhZF90ICoqZHJtX2hlYWRzOworZXh0ZXJuIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MgKmRybV9jbGFzczsKK2V4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRybV9wcm9jX3Jvb3Q7CisKKwkJCQkvKiBQcm9jIHN1cHBvcnQgKGRybV9wcm9jLmgpICovCitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX3Byb2NfaW5pdChkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJICAgICBpbnQgbWlub3IsCisJCQkJCSAgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LAorCQkJCQkgICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKmRldl9yb290KTsKK2V4dGVybiBpbnQgICAgICAgICAgICBkcm1fcHJvY19jbGVhbnVwKGludCBtaW5vciwKKwkJCQkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LAorCQkJCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRldl9yb290KTsKKworCQkJCS8qIFNjYXR0ZXIgR2F0aGVyIFN1cHBvcnQgKGRybV9zY2F0dGVyLmgpICovCitleHRlcm4gdm9pZCAgICAgICAgICAgZHJtX3NnX2NsZWFudXAoZHJtX3NnX21lbV90ICplbnRyeSk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX3NnX2FsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX3NnX2ZyZWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQVRJIFBDSUdBUlQgc3VwcG9ydCAoYXRpX3BjaWdhcnQuaCkgKi8KK2V4dGVybiBpbnQgICAgICAgICAgICBkcm1fYXRpX3BjaWdhcnRfaW5pdChkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgKmFkZHIsCisJCQkJCSAgICBkbWFfYWRkcl90ICpidXNfYWRkcik7CitleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoZHJtX2RldmljZV90ICpkZXYsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJCSAgICAgICBkbWFfYWRkcl90IGJ1c19hZGRyKTsKKworZXh0ZXJuIHZvaWQgKmRybV9wY2lfYWxsb2MoZHJtX2RldmljZV90ICogZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCSAgIHNpemVfdCBhbGlnbiwgZG1hX2FkZHJfdCBtYXhhZGRyLAorCQkJICAgZG1hX2FkZHJfdCAqIGJ1c2FkZHIpOworCitleHRlcm4gdm9pZCBkcm1fcGNpX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCSB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBidXNhZGRyKTsKKworCQkJICAgICAgIC8qIHN5c2ZzIHN1cHBvcnQgKGRybV9zeXNmcy5jKSAqLworc3RydWN0IGRybV9zeXNmc19jbGFzczsKK2V4dGVybiBzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzICpkcm1fc3lzZnNfY3JlYXRlKHN0cnVjdCBtb2R1bGUgKm93bmVyLAorCQkJCQkJY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBkcm1fc3lzZnNfZGVzdHJveShzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzICpjcyk7CitleHRlcm4gc3RydWN0IGNsYXNzX2RldmljZSAqZHJtX3N5c2ZzX2RldmljZV9hZGQoc3RydWN0IGRybV9zeXNmc19jbGFzcyAqY3MsCisJCQkJCQkgZGV2X3QgZGV2LAorCQkJCQkJIHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCQkJCSBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gdm9pZCBkcm1fc3lzZnNfZGV2aWNlX3JlbW92ZShkZXZfdCBkZXYpOworCisKKy8qIElubGluZSByZXBsYWNlbWVudHMgZm9yIERSTV9JT1JFTUFQIG1hY3JvcyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBkcm1fY29yZV9pb3JlbWFwKHN0cnVjdCBkcm1fbWFwICptYXAsIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbWFwLT5oYW5kbGUgPSBkcm1faW9yZW1hcCggbWFwLT5vZmZzZXQsIG1hcC0+c2l6ZSwgZGV2ICk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZHJtX2NvcmVfaW9yZW1hcF9ub2NhY2hlKHN0cnVjdCBkcm1fbWFwICptYXAsIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbWFwLT5oYW5kbGUgPSBkcm1faW9yZW1hcF9ub2NhY2hlKG1hcC0+b2Zmc2V0LCBtYXAtPnNpemUsIGRldik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZHJtX2NvcmVfaW9yZW1hcGZyZWUoc3RydWN0IGRybV9tYXAgKm1hcCwgc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlpZiAoIG1hcC0+aGFuZGxlICYmIG1hcC0+c2l6ZSApCisJCWRybV9pb3JlbWFwZnJlZSggbWFwLT5oYW5kbGUsIG1hcC0+c2l6ZSwgZGV2ICk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBkcm1fbWFwICpkcm1fY29yZV9maW5kbWFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9saXN0OworCWxpc3RfZm9yX2VhY2goIF9saXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkICkgeworCQlkcm1fbWFwX2xpc3RfdCAqX2VudHJ5ID0gbGlzdF9lbnRyeSggX2xpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkICk7CisJCWlmICggX2VudHJ5LT5tYXAgJiYKKwkJICAgICBfZW50cnktPm1hcC0+b2Zmc2V0ID09IG9mZnNldCApIHsKKwkJCXJldHVybiBfZW50cnktPm1hcDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBkcm1fY29yZV9kcm9wbWFwKHN0cnVjdCBkcm1fbWFwICptYXApCit7Cit9CisKKyNpZm5kZWYgREVCVUdfTUVNT1JZCisvKiogV3JhcHBlciBhcm91bmQga21hbGxvYygpICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkICpkcm1fYWxsb2Moc2l6ZV90IHNpemUsIGludCBhcmVhKQoreworCXJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworfQorCisvKiogV3JhcHBlciBhcm91bmQga2ZyZWUoKSAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBkcm1fZnJlZSh2b2lkICpwdCwgc2l6ZV90IHNpemUsIGludCBhcmVhKQoreworCWtmcmVlKHB0KTsKK30KKyNlbHNlCitleHRlcm4gdm9pZCAqZHJtX2FsbG9jKHNpemVfdCBzaXplLCBpbnQgYXJlYSk7CitleHRlcm4gdm9pZCBkcm1fZnJlZSh2b2lkICpwdCwgc2l6ZV90IHNpemUsIGludCBhcmVhKTsKKyNlbmRpZgorCisvKkB9Ki8KKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X21hcF9vZnMoZHJtX21hcF90ICptYXApOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X3JlZ19vZnMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDk0YzBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKioKKyAqIFxmaWxlIGRybV9hZ3BzdXBwb3J0LmggCisgKiBEUk0gc3VwcG9ydCBmb3IgQUdQL0dBUlQgYmFja2VuZAorICogICAgCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2lmIF9fT1NfSEFTX0FHUAorCisvKioKKyAqIEFHUCBpbmZvcm1hdGlvbiBpb2N0bC4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgKG91dHB1dCkgZHJtX2FncF9pbmZvIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYW5kIGFjcXVpcmVkIGFuZCBmaWxscyBpbiB0aGUKKyAqIGRybV9hZ3BfaW5mbyBzdHJ1Y3R1cmUgd2l0aCB0aGUgaW5mb3JtYXRpb24gaW4gZHJtX2FncF9oZWFkOjphZ3BfaW5mby4KKyAqLworaW50IGRybV9hZ3BfaW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSAqcHJpdgkgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAqZGV2CSA9IHByaXYtPmhlYWQtPmRldjsKKwlEUk1fQUdQX0tFUk4gICAgICprZXJuOworCWRybV9hZ3BfaW5mb190ICAgaW5mbzsKKworCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlrZXJuICAgICAgICAgICAgICAgICAgID0gJmRldi0+YWdwLT5hZ3BfaW5mbzsKKwlpbmZvLmFncF92ZXJzaW9uX21ham9yID0ga2Vybi0+dmVyc2lvbi5tYWpvcjsKKwlpbmZvLmFncF92ZXJzaW9uX21pbm9yID0ga2Vybi0+dmVyc2lvbi5taW5vcjsKKwlpbmZvLm1vZGUgICAgICAgICAgICAgID0ga2Vybi0+bW9kZTsKKwlpbmZvLmFwZXJ0dXJlX2Jhc2UgICAgID0ga2Vybi0+YXBlcl9iYXNlOworCWluZm8uYXBlcnR1cmVfc2l6ZSAgICAgPSBrZXJuLT5hcGVyX3NpemUgKiAxMDI0ICogMTAyNDsKKwlpbmZvLm1lbW9yeV9hbGxvd2VkICAgID0ga2Vybi0+bWF4X21lbW9yeSA8PCBQQUdFX1NISUZUOworCWluZm8ubWVtb3J5X3VzZWQgICAgICAgPSBrZXJuLT5jdXJyZW50X21lbW9yeSA8PCBQQUdFX1NISUZUOworCWluZm8uaWRfdmVuZG9yICAgICAgICAgPSBrZXJuLT5kZXZpY2UtPnZlbmRvcjsKKwlpbmZvLmlkX2RldmljZSAgICAgICAgID0ga2Vybi0+ZGV2aWNlLT5kZXZpY2U7CisKKwlpZiAoY29weV90b191c2VyKChkcm1fYWdwX2luZm9fdCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBBY3F1aXJlIHRoZSBBR1AgZGV2aWNlIChpb2N0bCkuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudC4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuIAorICoKKyAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGhhc24ndCBiZWVuIGFjcXVpcmVkIGJlZm9yZSBhbmQgY2FsbHMKKyAqIGFncF9hY3F1aXJlKCkuCisgKi8KK2ludCBkcm1fYWdwX2FjcXVpcmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkgKnByaXYJID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgKmRldgkgPSBwcml2LT5oZWFkLT5kZXY7CisKKwlpZiAoIWRldi0+YWdwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoZGV2LT5hZ3AtPmFjcXVpcmVkKQorCQlyZXR1cm4gLUVCVVNZOworCWlmICghKGRldi0+YWdwLT5icmlkZ2UgPSBhZ3BfYmFja2VuZF9hY3F1aXJlKGRldi0+cGRldikpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlkZXYtPmFncC0+YWNxdWlyZWQgPSAxOworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlbGVhc2UgdGhlIEFHUCBkZXZpY2UgKGlvY3RsKS4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBoYXMgYmVlbiBhY3F1aXJlZCBhbmQgY2FsbHMgYWdwX2JhY2tlbmRfcmVsZWFzZSgpLgorICovCitpbnQgZHJtX2FncF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJICpwcml2CSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICpkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCisJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlhZ3BfYmFja2VuZF9yZWxlYXNlKGRldi0+YWdwLT5icmlkZ2UpOworCWRldi0+YWdwLT5hY3F1aXJlZCA9IDA7CisJcmV0dXJuIDA7CisKK30KKworLyoqCisgKiBSZWxlYXNlIHRoZSBBR1AgZGV2aWNlLgorICoKKyAqIENhbGxzIGFncF9iYWNrZW5kX3JlbGVhc2UoKS4KKyAqLwordm9pZCBkcm1fYWdwX2RvX3JlbGVhc2UoZHJtX2RldmljZV90ICpkZXYpCit7CisgIGFncF9iYWNrZW5kX3JlbGVhc2UoZGV2LT5hZ3AtPmJyaWRnZSk7Cit9CisKKy8qKgorICogRW5hYmxlIHRoZSBBR1AgYnVzLgorICogCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX2FncF9tb2RlIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaGFzIGJlZW4gYWNxdWlyZWQgYnV0IG5vdCBlbmFibGVkLCBhbmQgY2FsbHMKKyAqIGFncF9lbmFibGUoKS4KKyAqLworaW50IGRybV9hZ3BfZW5hYmxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkgKnByaXYJID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgKmRldgkgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2FncF9tb2RlX3QgICBtb2RlOworCisJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbW9kZSwgKGRybV9hZ3BfbW9kZV90IF9fdXNlciAqKWFyZywgc2l6ZW9mKG1vZGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkZXYtPmFncC0+bW9kZSAgICA9IG1vZGUubW9kZTsKKwlhZ3BfZW5hYmxlKGRldi0+YWdwLT5icmlkZ2UsIG1vZGUubW9kZSk7CisJZGV2LT5hZ3AtPmJhc2UgICAgPSBkZXYtPmFncC0+YWdwX2luZm8uYXBlcl9iYXNlOworCWRldi0+YWdwLT5lbmFibGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBBbGxvY2F0ZSBBR1AgbWVtb3J5LgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHBvaW50ZXIgdG8gYSBkcm1fYWdwX2J1ZmZlciBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICogCisgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBpcyBwcmVzZW50IGFuZCBoYXMgYmVlbiBhY3F1aXJlZCwgYWxsb2NhdGVzIHRoZQorICogbWVtb3J5IHZpYSBhbGxvY19hZ3AoKSBhbmQgY3JlYXRlcyBhIGRybV9hZ3BfbWVtIGVudHJ5IGZvciBpdC4KKyAqLworaW50IGRybV9hZ3BfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJICpwcml2CSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICpkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9hZ3BfYnVmZmVyX3QgcmVxdWVzdDsKKwlkcm1fYWdwX21lbV90ICAgICplbnRyeTsKKwlEUk1fQUdQX01FTSAgICAgICptZW1vcnk7CisJdW5zaWduZWQgbG9uZyAgICBwYWdlczsKKwl1MzIgCQkgdHlwZTsKKwlkcm1fYWdwX2J1ZmZlcl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCBhcmdwLCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIShlbnRyeSA9IGRybV9hbGxvYyhzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9BR1BMSVNUUykpKQorCQlyZXR1cm4gLUVOT01FTTsKKworICAgCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKCplbnRyeSkpOworCisJcGFnZXMgPSAocmVxdWVzdC5zaXplICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJdHlwZSA9ICh1MzIpIHJlcXVlc3QudHlwZTsKKworCWlmICghKG1lbW9yeSA9IGRybV9hbGxvY19hZ3AoZGV2LT5hZ3AtPmJyaWRnZSwgcGFnZXMsIHR5cGUpKSkgeworCQlkcm1fZnJlZShlbnRyeSwgc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fQUdQTElTVFMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllbnRyeS0+aGFuZGxlICAgID0gKHVuc2lnbmVkIGxvbmcpbWVtb3J5LT5rZXkgKyAxOworCWVudHJ5LT5tZW1vcnkgICAgPSBtZW1vcnk7CisJZW50cnktPmJvdW5kICAgICA9IDA7CisJZW50cnktPnBhZ2VzICAgICA9IHBhZ2VzOworCWVudHJ5LT5wcmV2ICAgICAgPSBOVUxMOworCWVudHJ5LT5uZXh0ICAgICAgPSBkZXYtPmFncC0+bWVtb3J5OworCWlmIChkZXYtPmFncC0+bWVtb3J5KQorCQlkZXYtPmFncC0+bWVtb3J5LT5wcmV2ID0gZW50cnk7CisJZGV2LT5hZ3AtPm1lbW9yeSA9IGVudHJ5OworCisJcmVxdWVzdC5oYW5kbGUgICA9IGVudHJ5LT5oYW5kbGU7CisJcmVxdWVzdC5waHlzaWNhbCA9IG1lbW9yeS0+cGh5c2ljYWw7CisKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkpKSB7CisJCWRldi0+YWdwLT5tZW1vcnkgICAgICAgPSBlbnRyeS0+bmV4dDsKKwkJZGV2LT5hZ3AtPm1lbW9yeS0+cHJldiA9IE5VTEw7CisJCWRybV9mcmVlX2FncChtZW1vcnksIHBhZ2VzKTsKKwkJZHJtX2ZyZWUoZW50cnksIHNpemVvZigqZW50cnkpLCBEUk1fTUVNX0FHUExJU1RTKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIFNlYXJjaCBmb3IgdGhlIEFHUCBtZW1vcnkgZW50cnkgYXNzb2NpYXRlZCB3aXRoIGEgaGFuZGxlLgorICoKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZSBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gaGFuZGxlIEFHUCBtZW1vcnkgaGFuZGxlLgorICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBkcm1fYWdwX21lbSBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIFxwIGhhbmRsZS4KKyAqIAorICogV2Fsa3MgdGhyb3VnaCBkcm1fYWdwX2hlYWQ6Om1lbW9yeSB1bnRpbCBmaW5kaW5nIGEgbWF0Y2hpbmcgaGFuZGxlLgorICovCitzdGF0aWMgZHJtX2FncF9tZW1fdCAqZHJtX2FncF9sb29rdXBfZW50cnkoZHJtX2RldmljZV90ICpkZXYsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGhhbmRsZSkKK3sKKwlkcm1fYWdwX21lbV90ICplbnRyeTsKKworCWZvciAoZW50cnkgPSBkZXYtPmFncC0+bWVtb3J5OyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkgeworCQlpZiAoZW50cnktPmhhbmRsZSA9PSBoYW5kbGUpCisJCQlyZXR1cm4gZW50cnk7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIFVuYmluZCBBR1AgbWVtb3J5IGZyb20gdGhlIEdBVFQgKGlvY3RsKS4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX2FncF9iaW5kaW5nIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaXMgcHJlc2VudCBhbmQgYWNxdWlyZWQsIGxvb2tzLXVwIHRoZSBBR1AgbWVtb3J5CisgKiBlbnRyeSBhbmQgcGFzc2VzIGl0IHRvIHRoZSB1bmJpbmRfYWdwKCkgZnVuY3Rpb24uCisgKi8KK2ludCBkcm1fYWdwX3VuYmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJICAqcHJpdgkgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgKmRldgkgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2FncF9iaW5kaW5nX3QgcmVxdWVzdDsKKwlkcm1fYWdwX21lbV90ICAgICAqZW50cnk7CisJaW50IHJldDsKKworCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCAoZHJtX2FncF9iaW5kaW5nX3QgX191c2VyICopYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIShlbnRyeSA9IGRybV9hZ3BfbG9va3VwX2VudHJ5KGRldiwgcmVxdWVzdC5oYW5kbGUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFlbnRyeS0+Ym91bmQpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9IGRybV91bmJpbmRfYWdwKGVudHJ5LT5tZW1vcnkpOworCWlmIChyZXQgPT0gMCkKKwkgICAgZW50cnktPmJvdW5kID0gMDsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIEJpbmQgQUdQIG1lbW9yeSBpbnRvIHRoZSBHQVRUIChpb2N0bCkKKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX2FncF9iaW5kaW5nIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaXMgcHJlc2VudCBhbmQgaGFzIGJlZW4gYWNxdWlyZWQgYW5kIHRoYXQgbm8gbWVtb3J5CisgKiBpcyBjdXJyZW50bHkgYm91bmQgaW50byB0aGUgR0FUVC4gTG9va3MtdXAgdGhlIEFHUCBtZW1vcnkgZW50cnkgYW5kIHBhc3NlcworICogaXQgdG8gYmluZF9hZ3AoKSBmdW5jdGlvbi4KKyAqLworaW50IGRybV9hZ3BfYmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9hZ3BfYmluZGluZ190IHJlcXVlc3Q7CisJZHJtX2FncF9tZW1fdCAgICAgKmVudHJ5OworCWludCAgICAgICAgICAgICAgIHJldGNvZGU7CisJaW50ICAgICAgICAgICAgICAgcGFnZTsKKworCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCAoZHJtX2FncF9iaW5kaW5nX3QgX191c2VyICopYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIShlbnRyeSA9IGRybV9hZ3BfbG9va3VwX2VudHJ5KGRldiwgcmVxdWVzdC5oYW5kbGUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVudHJ5LT5ib3VuZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFnZSA9IChyZXF1ZXN0Lm9mZnNldCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCWlmICgocmV0Y29kZSA9IGRybV9iaW5kX2FncChlbnRyeS0+bWVtb3J5LCBwYWdlKSkpCisJCXJldHVybiByZXRjb2RlOworCWVudHJ5LT5ib3VuZCA9IGRldi0+YWdwLT5iYXNlICsgKHBhZ2UgPDwgUEFHRV9TSElGVCk7CisJRFJNX0RFQlVHKCJiYXNlID0gMHglbHggZW50cnktPmJvdW5kID0gMHglbHhcbiIsCisJCSAgZGV2LT5hZ3AtPmJhc2UsIGVudHJ5LT5ib3VuZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRnJlZSBBR1AgbWVtb3J5IChpb2N0bCkuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9hZ3BfYnVmZmVyIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaXMgcHJlc2VudCBhbmQgaGFzIGJlZW4gYWNxdWlyZWQgYW5kIGxvb2tzIHVwIHRoZQorICogQUdQIG1lbW9yeSBlbnRyeS4gSWYgdGhlIG1lbW9yeSBpdCdzIGN1cnJlbnRseSBib3VuZCwgdW5iaW5kIGl0IHZpYQorICogdW5iaW5kX2FncCgpLiBGcmVlcyBpdCB2aWEgZnJlZV9hZ3AoKSBhcyB3ZWxsIGFzIHRoZSBlbnRyeSBpdHNlbGYKKyAqIGFuZCB1bmxpbmtzIGZyb20gdGhlIGRvdWJseSBsaW5rZWQgbGlzdCBpdCdzIGluc2VydGVkIGluLgorICovCitpbnQgZHJtX2FncF9mcmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJICpwcml2CSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICpkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9hZ3BfYnVmZmVyX3QgcmVxdWVzdDsKKwlkcm1fYWdwX21lbV90ICAgICplbnRyeTsKKworCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCAoZHJtX2FncF9idWZmZXJfdCBfX3VzZXIgKilhcmcsIHNpemVvZihyZXF1ZXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICghKGVudHJ5ID0gZHJtX2FncF9sb29rdXBfZW50cnkoZGV2LCByZXF1ZXN0LmhhbmRsZSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZW50cnktPmJvdW5kKQorCQlkcm1fdW5iaW5kX2FncChlbnRyeS0+bWVtb3J5KTsKKworCWlmIChlbnRyeS0+cHJldikKKwkJZW50cnktPnByZXYtPm5leHQgPSBlbnRyeS0+bmV4dDsKKwllbHNlCisJCWRldi0+YWdwLT5tZW1vcnkgPSBlbnRyeS0+bmV4dDsKKworCWlmIChlbnRyeS0+bmV4dCkKKwkJZW50cnktPm5leHQtPnByZXYgPSBlbnRyeS0+cHJldjsKKworCWRybV9mcmVlX2FncChlbnRyeS0+bWVtb3J5LCBlbnRyeS0+cGFnZXMpOworCWRybV9mcmVlKGVudHJ5LCBzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9BR1BMSVNUUyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgQUdQIHJlc291cmNlcy4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgdG8gYSBkcm1fYWdwX2hlYWQgc3RydWN0dXJlLgorICoKKyAqLworZHJtX2FncF9oZWFkX3QgKmRybV9hZ3BfaW5pdChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fYWdwX2hlYWRfdCAqaGVhZCAgICAgICAgID0gTlVMTDsKKworCWlmICghKGhlYWQgPSBkcm1fYWxsb2Moc2l6ZW9mKCpoZWFkKSwgRFJNX01FTV9BR1BMSVNUUykpKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoKHZvaWQgKiloZWFkLCAwLCBzaXplb2YoKmhlYWQpKTsKKwloZWFkLT5icmlkZ2UgPSBhZ3BfZmluZF9icmlkZ2UoZGV2LT5wZGV2KTsKKwlpZiAoIWhlYWQtPmJyaWRnZSkgeworCQlpZiAoIShoZWFkLT5icmlkZ2UgPSBhZ3BfYmFja2VuZF9hY3F1aXJlKGRldi0+cGRldikpKSB7CisJCQlkcm1fZnJlZShoZWFkLCBzaXplb2YoKmhlYWQpLCBEUk1fTUVNX0FHUExJU1RTKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWFncF9jb3B5X2luZm8oaGVhZC0+YnJpZGdlLCAmaGVhZC0+YWdwX2luZm8pOworCQlhZ3BfYmFja2VuZF9yZWxlYXNlKGhlYWQtPmJyaWRnZSk7CisJfSBlbHNlIHsKKwkJYWdwX2NvcHlfaW5mbyhoZWFkLT5icmlkZ2UsICZoZWFkLT5hZ3BfaW5mbyk7CisJfQorCWlmIChoZWFkLT5hZ3BfaW5mby5jaGlwc2V0ID09IE5PVF9TVVBQT1JURUQpIHsKKwkJZHJtX2ZyZWUoaGVhZCwgc2l6ZW9mKCpoZWFkKSwgRFJNX01FTV9BR1BMSVNUUyk7CisJCXJldHVybiBOVUxMOworCX0KKwloZWFkLT5tZW1vcnkgPSBOVUxMOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDAyMDQwOAorCWhlYWQtPmNhbnRfdXNlX2FwZXJ0dXJlID0gMDsKKwloZWFkLT5wYWdlX21hc2sgPSB+KDB4ZmZmKTsKKyNlbHNlCisJaGVhZC0+Y2FudF91c2VfYXBlcnR1cmUgPSBoZWFkLT5hZ3BfaW5mby5jYW50X3VzZV9hcGVydHVyZTsKKwloZWFkLT5wYWdlX21hc2sgPSBoZWFkLT5hZ3BfaW5mby5wYWdlX21hc2s7CisjZW5kaWYKKworCXJldHVybiBoZWFkOworfQorCisvKiogQ2FsbHMgYWdwX2FsbG9jYXRlX21lbW9yeSgpICovCitEUk1fQUdQX01FTSAqZHJtX2FncF9hbGxvY2F0ZV9tZW1vcnkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCBzaXplX3QgcGFnZXMsIHUzMiB0eXBlKQoreworCXJldHVybiBhZ3BfYWxsb2NhdGVfbWVtb3J5KGJyaWRnZSwgcGFnZXMsIHR5cGUpOworfQorCisvKiogQ2FsbHMgYWdwX2ZyZWVfbWVtb3J5KCkgKi8KK2ludCBkcm1fYWdwX2ZyZWVfbWVtb3J5KERSTV9BR1BfTUVNICpoYW5kbGUpCit7CisJaWYgKCFoYW5kbGUpCisJCXJldHVybiAwOworCWFncF9mcmVlX21lbW9yeShoYW5kbGUpOworCXJldHVybiAxOworfQorCisvKiogQ2FsbHMgYWdwX2JpbmRfbWVtb3J5KCkgKi8KK2ludCBkcm1fYWdwX2JpbmRfbWVtb3J5KERSTV9BR1BfTUVNICpoYW5kbGUsIG9mZl90IHN0YXJ0KQoreworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gYWdwX2JpbmRfbWVtb3J5KGhhbmRsZSwgc3RhcnQpOworfQorCisvKiogQ2FsbHMgYWdwX3VuYmluZF9tZW1vcnkoKSAqLworaW50IGRybV9hZ3BfdW5iaW5kX21lbW9yeShEUk1fQUdQX01FTSAqaGFuZGxlKQoreworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gYWdwX3VuYmluZF9tZW1vcnkoaGFuZGxlKTsKK30KKworI2VuZGlmIC8qIF9fT1NfSEFTX0FHUCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYXV0aC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Mjg3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9hdXRoLmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qKgorICogXGZpbGUgZHJtX2F1dGguaCAKKyAqIElPQ1RMcyBmb3IgYXV0aGVudGljYXRpb24KKyAqCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IFR1ZSBGZWIgIDIgMDg6Mzc6NTQgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKworLyoqCisgKiBHZW5lcmF0ZSBhIGhhc2gga2V5IGZyb20gYSBtYWdpYy4KKyAqCisgKiBccGFyYW0gbWFnaWMgbWFnaWMuCisgKiBccmV0dXJuIGhhc2gga2V5LgorICoKKyAqIFRoZSBrZXkgaXMgdGhlIG1vZHVsdXMgb2YgdGhlIGhhc2ggdGFibGUgc2l6ZSwgI0RSTV9IQVNIX1NJWkUsIHdoaWNoIG11c3QgYmUKKyAqIGEgcG93ZXIgb2YgMi4KKyAqLworc3RhdGljIGludCBkcm1faGFzaF9tYWdpYyhkcm1fbWFnaWNfdCBtYWdpYykKK3sKKwlyZXR1cm4gbWFnaWMgJiAoRFJNX0hBU0hfU0laRS0xKTsKK30KKworLyoqCisgKiBGaW5kIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIG1hZ2ljIG51bWJlci4KKyAqCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCisgKiBccGFyYW0gbWFnaWMgbWFnaWMgbnVtYmVyLgorICoKKyAqIFNlYXJjaGVzIGluIGRybV9kZXZpY2U6Om1hZ2ljbGlzdCB3aXRoaW4gYWxsIGZpbGVzIHdpdGggdGhlIHNhbWUgaGFzaCBrZXkKKyAqIHRoZSBvbmUgd2l0aCBtYXRjaGluZyBtYWdpYyBudW1iZXIsIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0KKyAqIGxvY2suCisgKi8KK3N0YXRpYyBkcm1fZmlsZV90ICpkcm1fZmluZF9maWxlKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbWFnaWNfdCBtYWdpYykKK3sKKwlkcm1fZmlsZV90CSAgKnJldHZhbCA9IE5VTEw7CisJZHJtX21hZ2ljX2VudHJ5X3QgKnB0OworCWludAkJICBoYXNoCSAgPSBkcm1faGFzaF9tYWdpYyhtYWdpYyk7CisKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWZvciAocHQgPSBkZXYtPm1hZ2ljbGlzdFtoYXNoXS5oZWFkOyBwdDsgcHQgPSBwdC0+bmV4dCkgeworCQlpZiAocHQtPm1hZ2ljID09IG1hZ2ljKSB7CisJCQlyZXR2YWwgPSBwdC0+cHJpdjsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogQWRkcyBhIG1hZ2ljIG51bWJlci4KKyAqIAorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIHByaXYgZmlsZSBwcml2YXRlIGRhdGEuCisgKiBccGFyYW0gbWFnaWMgbWFnaWMgbnVtYmVyLgorICoKKyAqIENyZWF0ZXMgYSBkcm1fbWFnaWNfZW50cnkgc3RydWN0dXJlIGFuZCBhcHBlbmRzIHRvIHRoZSBsaW5rZWQgbGlzdAorICogYXNzb2NpYXRlZCB0aGUgbWFnaWMgbnVtYmVyIGhhc2gga2V5IGluIGRybV9kZXZpY2U6Om1hZ2ljbGlzdCwgd2hpbGUgaG9sZGluZworICogdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KKyAqLworaW50IGRybV9hZGRfbWFnaWMoZHJtX2RldmljZV90ICpkZXYsIGRybV9maWxlX3QgKnByaXYsIGRybV9tYWdpY190IG1hZ2ljKQoreworCWludAkJICBoYXNoOworCWRybV9tYWdpY19lbnRyeV90ICplbnRyeTsKKworCURSTV9ERUJVRygiJWRcbiIsIG1hZ2ljKTsKKworCWhhc2gJICAgICA9IGRybV9oYXNoX21hZ2ljKG1hZ2ljKTsKKwllbnRyeQkgICAgID0gZHJtX2FsbG9jKHNpemVvZigqZW50cnkpLCBEUk1fTUVNX01BR0lDKTsKKwlpZiAoIWVudHJ5KSByZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZW50cnksIDAsIHNpemVvZigqZW50cnkpKTsKKwllbnRyeS0+bWFnaWMgPSBtYWdpYzsKKwllbnRyeS0+cHJpdiAgPSBwcml2OworCWVudHJ5LT5uZXh0ICA9IE5VTEw7CisKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWlmIChkZXYtPm1hZ2ljbGlzdFtoYXNoXS50YWlsKSB7CisJCWRldi0+bWFnaWNsaXN0W2hhc2hdLnRhaWwtPm5leHQgPSBlbnRyeTsKKwkJZGV2LT5tYWdpY2xpc3RbaGFzaF0udGFpbAk9IGVudHJ5OworCX0gZWxzZSB7CisJCWRldi0+bWFnaWNsaXN0W2hhc2hdLmhlYWQJPSBlbnRyeTsKKwkJZGV2LT5tYWdpY2xpc3RbaGFzaF0udGFpbAk9IGVudHJ5OworCX0KKwl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlbW92ZSBhIG1hZ2ljIG51bWJlci4KKyAqIAorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIG1hZ2ljIG1hZ2ljIG51bWJlci4KKyAqCisgKiBTZWFyY2hlcyBhbmQgdW5saW5rcyB0aGUgZW50cnkgaW4gZHJtX2RldmljZTo6bWFnaWNsaXN0IHdpdGggdGhlIG1hZ2ljCisgKiBudW1iZXIgaGFzaCBrZXksIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KKyAqLworaW50IGRybV9yZW1vdmVfbWFnaWMoZHJtX2RldmljZV90ICpkZXYsIGRybV9tYWdpY190IG1hZ2ljKQoreworCWRybV9tYWdpY19lbnRyeV90ICpwcmV2ID0gTlVMTDsKKwlkcm1fbWFnaWNfZW50cnlfdCAqcHQ7CisJaW50CQkgIGhhc2g7CisKKworCURSTV9ERUJVRygiJWRcbiIsIG1hZ2ljKTsKKwloYXNoID0gZHJtX2hhc2hfbWFnaWMobWFnaWMpOworCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlmb3IgKHB0ID0gZGV2LT5tYWdpY2xpc3RbaGFzaF0uaGVhZDsgcHQ7IHByZXYgPSBwdCwgcHQgPSBwdC0+bmV4dCkgeworCQlpZiAocHQtPm1hZ2ljID09IG1hZ2ljKSB7CisJCQlpZiAoZGV2LT5tYWdpY2xpc3RbaGFzaF0uaGVhZCA9PSBwdCkgeworCQkJCWRldi0+bWFnaWNsaXN0W2hhc2hdLmhlYWQgPSBwdC0+bmV4dDsKKwkJCX0KKwkJCWlmIChkZXYtPm1hZ2ljbGlzdFtoYXNoXS50YWlsID09IHB0KSB7CisJCQkJZGV2LT5tYWdpY2xpc3RbaGFzaF0udGFpbCA9IHByZXY7CisJCQl9CisJCQlpZiAocHJldikgeworCQkJCXByZXYtPm5leHQgPSBwdC0+bmV4dDsKKwkJCX0KKwkJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisKKwlkcm1fZnJlZShwdCwgc2l6ZW9mKCpwdCksIERSTV9NRU1fTUFHSUMpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogR2V0IGEgdW5pcXVlIG1hZ2ljIG51bWJlciAoaW9jdGwpLgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHBvaW50ZXIgdG8gYSByZXN1bHRpbmcgZHJtX2F1dGggc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogSWYgdGhlcmUgaXMgYSBtYWdpYyBudW1iZXIgaW4gZHJtX2ZpbGU6Om1hZ2ljIHRoZW4gdXNlIGl0LCBvdGhlcndpc2UKKyAqIHNlYXJjaGVzIGFuIHVuaXF1ZSBub24temVybyBtYWdpYyBudW1iZXIgYW5kIGFkZCBpdCBhc3NvY2lhdGluZyBpdCB3aXRoIFxwCisgKiBmaWxwLgorICovCitpbnQgZHJtX2dldG1hZ2ljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0YXRpYyBkcm1fbWFnaWNfdCBzZXF1ZW5jZSA9IDA7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKwlkcm1fZmlsZV90CSAgICpwcml2ICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICAqZGV2CSAgICA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fYXV0aF90CSAgIGF1dGg7CisKKwkJCQkvKiBGaW5kIHVuaXF1ZSBtYWdpYyAqLworCWlmIChwcml2LT5tYWdpYykgeworCQlhdXRoLm1hZ2ljID0gcHJpdi0+bWFnaWM7CisJfSBlbHNlIHsKKwkJZG8geworCQkJc3Bpbl9sb2NrKCZsb2NrKTsKKwkJCWlmICghc2VxdWVuY2UpICsrc2VxdWVuY2U7IC8qIHJlc2VydmUgMCAqLworCQkJYXV0aC5tYWdpYyA9IHNlcXVlbmNlKys7CisJCQlzcGluX3VubG9jaygmbG9jayk7CisJCX0gd2hpbGUgKGRybV9maW5kX2ZpbGUoZGV2LCBhdXRoLm1hZ2ljKSk7CisJCXByaXYtPm1hZ2ljID0gYXV0aC5tYWdpYzsKKwkJZHJtX2FkZF9tYWdpYyhkZXYsIHByaXYsIGF1dGgubWFnaWMpOworCX0KKworCURSTV9ERUJVRygiJXVcbiIsIGF1dGgubWFnaWMpOworCWlmIChjb3B5X3RvX3VzZXIoKGRybV9hdXRoX3QgX191c2VyICopYXJnLCAmYXV0aCwgc2l6ZW9mKGF1dGgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQXV0aGVudGljYXRlIHdpdGggYSBtYWdpYy4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX2F1dGggc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIGlmIGF1dGhlbnRpY2F0aW9uIHN1Y2Nlc3NlZCwgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgorICoKKyAqIENoZWNrcyBpZiBccCBmaWxwIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFnaWMgbnVtYmVyIHBhc3NlZCBpbiBcYXJnLgorICovCitpbnQgZHJtX2F1dGhtYWdpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkgICAqcHJpdiAgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAgKmRldgkgICAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2F1dGhfdAkgICBhdXRoOworCWRybV9maWxlX3QJICAgKmZpbGU7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmF1dGgsIChkcm1fYXV0aF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGF1dGgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJRFJNX0RFQlVHKCIldVxuIiwgYXV0aC5tYWdpYyk7CisJaWYgKChmaWxlID0gZHJtX2ZpbmRfZmlsZShkZXYsIGF1dGgubWFnaWMpKSkgeworCQlmaWxlLT5hdXRoZW50aWNhdGVkID0gMTsKKwkJZHJtX3JlbW92ZV9tYWdpYyhkZXYsIGF1dGgubWFnaWMpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExM2JjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwpAQCAtMCwwICsxLDEyNzAgQEAKKy8qKgorICogXGZpbGUgZHJtX2J1ZnMuaCAKKyAqIEdlbmVyaWMgYnVmZmVyIHRlbXBsYXRlCisgKiAKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ3JlYXRlZDogVGh1IE5vdiAyMyAwMzoxMDo1MCAyMDAwIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisKKy8qKgorICogQ29tcHV0ZSBzaXplIG9yZGVyLiAgUmV0dXJucyB0aGUgZXhwb25lbnQgb2YgdGhlIHNtYWxsZXIgcG93ZXIgb2YgdHdvIHdoaWNoCisgKiBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIGdpdmVuIG51bWJlci4KKyAqIAorICogXHBhcmFtIHNpemUgc2l6ZS4KKyAqIFxyZXR1cm4gb3JkZXIuCisgKgorICogXHRvZG8gQ2FuIGJlIG1hZGUgZmFzdGVyLgorICovCitpbnQgZHJtX29yZGVyKCB1bnNpZ25lZCBsb25nIHNpemUgKQoreworCWludCBvcmRlcjsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWZvciAob3JkZXIgPSAwLCB0bXAgPSBzaXplID4+IDE7IHRtcDsgdG1wID4+PSAxLCBvcmRlcisrKQorCQk7CisKKwlpZiAoc2l6ZSAmIChzaXplIC0gMSkpCisJCSsrb3JkZXI7CisKKwlyZXR1cm4gb3JkZXI7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9vcmRlcik7CisKKy8qKgorICogSW9jdGwgdG8gc3BlY2lmeSBhIHJhbmdlIG9mIG1lbW9yeSB0aGF0IGlzIGF2YWlsYWJsZSBmb3IgbWFwcGluZyBieSBhIG5vbi1yb290IHByb2Nlc3MuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9tYXAgc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KKyAqCisgKiBBZGp1c3RzIHRoZSBtZW1vcnkgb2Zmc2V0IHRvIGl0cyBhYnNvbHV0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIG1hcHBpbmcKKyAqIHR5cGUuICBBZGRzIHRoZSBtYXAgdG8gdGhlIG1hcCBsaXN0IGRybV9kZXZpY2U6Om1hcGxpc3QuIEFkZHMgTVRSUidzIHdoZXJlCisgKiBhcHBsaWNhYmxlIGFuZCBpZiBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbC4KKyAqLworaW50IGRybV9hZGRtYXAoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX21hcF90ICptYXA7CisJZHJtX21hcF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fbWFwX2xpc3RfdCAqbGlzdDsKKworCWlmICggIShmaWxwLT5mX21vZGUgJiAzKSApIHJldHVybiAtRUFDQ0VTOyAvKiBSZXF1aXJlIHJlYWQvd3JpdGUgKi8KKworCW1hcCA9IGRybV9hbGxvYyggc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMgKTsKKwlpZiAoICFtYXAgKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICggY29weV9mcm9tX3VzZXIoIG1hcCwgYXJncCwgc2l6ZW9mKCptYXApICkgKSB7CisJCWRybV9mcmVlKCBtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTICk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIE9ubHkgYWxsb3cgc2hhcmVkIG1lbW9yeSB0byBiZSByZW1vdmFibGUgc2luY2Ugd2Ugb25seSBrZWVwIGVub3VnaAorCSAqIGJvb2sga2VlcGluZyBpbmZvcm1hdGlvbiBhYm91dCBzaGFyZWQgbWVtb3J5IHRvIGFsbG93IGZvciByZW1vdmFsCisJICogd2hlbiBwcm9jZXNzZXMgZm9yay4KKwkgKi8KKwlpZiAoIChtYXAtPmZsYWdzICYgX0RSTV9SRU1PVkFCTEUpICYmIG1hcC0+dHlwZSAhPSBfRFJNX1NITSApIHsKKwkJZHJtX2ZyZWUoIG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMgKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCURSTV9ERUJVRyggIm9mZnNldCA9IDB4JTA4bHgsIHNpemUgPSAweCUwOGx4LCB0eXBlID0gJWRcbiIsCisJCSAgIG1hcC0+b2Zmc2V0LCBtYXAtPnNpemUsIG1hcC0+dHlwZSApOworCWlmICggKG1hcC0+b2Zmc2V0ICYgKH5QQUdFX01BU0spKSB8fCAobWFwLT5zaXplICYgKH5QQUdFX01BU0spKSApIHsKKwkJZHJtX2ZyZWUoIG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMgKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1hcC0+bXRyciAgID0gLTE7CisJbWFwLT5oYW5kbGUgPSBOVUxMOworCisJc3dpdGNoICggbWFwLT50eXBlICkgeworCWNhc2UgX0RSTV9SRUdJU1RFUlM6CisJY2FzZSBfRFJNX0ZSQU1FX0JVRkZFUjoKKyNpZiAhZGVmaW5lZChfX3NwYXJjX18pICYmICFkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoX19pYTY0X18pCisJCWlmICggbWFwLT5vZmZzZXQgKyBtYXAtPnNpemUgPCBtYXAtPm9mZnNldCB8fAorCQkgICAgIG1hcC0+b2Zmc2V0IDwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSApIHsKKwkJCWRybV9mcmVlKCBtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTICk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorI2VuZGlmCisjaWZkZWYgX19hbHBoYV9fCisJCW1hcC0+b2Zmc2V0ICs9IGRldi0+aG9zZS0+bWVtX3NwYWNlLT5zdGFydDsKKyNlbmRpZgorCQlpZiAoZHJtX2NvcmVfaGFzX01UUlIoZGV2KSkgeworCQkJaWYgKCBtYXAtPnR5cGUgPT0gX0RSTV9GUkFNRV9CVUZGRVIgfHwKKwkJCSAgICAgKG1hcC0+ZmxhZ3MgJiBfRFJNX1dSSVRFX0NPTUJJTklORykgKSB7CisJCQkJbWFwLT5tdHJyID0gbXRycl9hZGQoIG1hcC0+b2Zmc2V0LCBtYXAtPnNpemUsCisJCQkJCQkgICAgICBNVFJSX1RZUEVfV1JDT01CLCAxICk7CisJCQl9CisJCX0KKwkJaWYgKG1hcC0+dHlwZSA9PSBfRFJNX1JFR0lTVEVSUykKKwkJCW1hcC0+aGFuZGxlID0gZHJtX2lvcmVtYXAoIG1hcC0+b2Zmc2V0LCBtYXAtPnNpemUsCisJCQkJCQkgICAgZGV2ICk7CisJCWJyZWFrOworCisJY2FzZSBfRFJNX1NITToKKwkJbWFwLT5oYW5kbGUgPSB2bWFsbG9jXzMyKG1hcC0+c2l6ZSk7CisJCURSTV9ERUJVRyggIiVsdSAlZCAlcFxuIiwKKwkJCSAgIG1hcC0+c2l6ZSwgZHJtX29yZGVyKCBtYXAtPnNpemUgKSwgbWFwLT5oYW5kbGUgKTsKKwkJaWYgKCAhbWFwLT5oYW5kbGUgKSB7CisJCQlkcm1fZnJlZSggbWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWFwLT5vZmZzZXQgPSAodW5zaWduZWQgbG9uZyltYXAtPmhhbmRsZTsKKwkJaWYgKCBtYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLICkgeworCQkJLyogUHJldmVudCBhIDJuZCBYIFNlcnZlciBmcm9tIGNyZWF0aW5nIGEgMm5kIGxvY2sgKi8KKwkJCWlmIChkZXYtPmxvY2suaHdfbG9jayAhPSBOVUxMKSB7CisJCQkJdmZyZWUoIG1hcC0+aGFuZGxlICk7CisJCQkJZHJtX2ZyZWUoIG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMgKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJZGV2LT5zaWdkYXRhLmxvY2sgPQorCQkJZGV2LT5sb2NrLmh3X2xvY2sgPSBtYXAtPmhhbmRsZTsgLyogUG9pbnRlciB0byBsb2NrICovCisJCX0KKwkJYnJlYWs7CisJY2FzZSBfRFJNX0FHUDoKKwkJaWYgKGRybV9jb3JlX2hhc19BR1AoZGV2KSkgeworI2lmZGVmIF9fYWxwaGFfXworCQkJbWFwLT5vZmZzZXQgKz0gZGV2LT5ob3NlLT5tZW1fc3BhY2UtPnN0YXJ0OworI2VuZGlmCisJCQltYXAtPm9mZnNldCArPSBkZXYtPmFncC0+YmFzZTsKKwkJCW1hcC0+bXRyciAgID0gZGV2LT5hZ3AtPmFncF9tdHJyOyAvKiBmb3IgZ2V0bWFwICovCisJCX0KKwkJYnJlYWs7CisJY2FzZSBfRFJNX1NDQVRURVJfR0FUSEVSOgorCQlpZiAoIWRldi0+c2cpIHsKKwkJCWRybV9mcmVlKG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbWFwLT5vZmZzZXQgKz0gZGV2LT5zZy0+aGFuZGxlOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRybV9mcmVlKCBtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxpc3QgPSBkcm1fYWxsb2Moc2l6ZW9mKCpsaXN0KSwgRFJNX01FTV9NQVBTKTsKKwlpZighbGlzdCkgeworCQlkcm1fZnJlZShtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1lbXNldChsaXN0LCAwLCBzaXplb2YoKmxpc3QpKTsKKwlsaXN0LT5tYXAgPSBtYXA7CisKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWxpc3RfYWRkKCZsaXN0LT5oZWFkLCAmZGV2LT5tYXBsaXN0LT5oZWFkKTsKKyAJdXAoJmRldi0+c3RydWN0X3NlbSk7CisKKwlpZiAoIGNvcHlfdG9fdXNlciggYXJncCwgbWFwLCBzaXplb2YoKm1hcCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCWlmICggbWFwLT50eXBlICE9IF9EUk1fU0hNICkgeworCQlpZiAoIGNvcHlfdG9fdXNlciggJmFyZ3AtPmhhbmRsZSwKKwkJCQkgICAmbWFwLT5vZmZzZXQsCisJCQkJICAgc2l6ZW9mKG1hcC0+b2Zmc2V0KSApICkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIFJlbW92ZSBhIG1hcCBwcml2YXRlIGZyb20gbGlzdCBhbmQgZGVhbGxvY2F0ZSByZXNvdXJjZXMgaWYgdGhlIG1hcHBpbmcKKyAqIGlzbid0IGluIHVzZS4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX21hcF90IHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuCisgKgorICogU2VhcmNoZXMgdGhlIG1hcCBvbiBkcm1fZGV2aWNlOjptYXBsaXN0LCByZW1vdmVzIGl0IGZyb20gdGhlIGxpc3QsIHNlZSBpZgorICogaXRzIGJlaW5nIHVzZWQsIGFuZCBmcmVlIGFueSBhc3NvY2lhdGUgcmVzb3VyY2UgKHN1Y2ggYXMgTVRSUidzKSBpZiBpdCdzIG5vdAorICogYmVpbmcgb24gdXNlLgorICoKKyAqIFxzYSBhZGRtYXAoKS4KKyAqLworaW50IGRybV9ybW1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBOVUxMOworCWRybV92bWFfZW50cnlfdCAqcHQsICpwcmV2OworCWRybV9tYXBfdCAqbWFwOworCWRybV9tYXBfdCByZXF1ZXN0OworCWludCBmb3VuZF9tYXBzID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgKGRybV9tYXBfdCBfX3VzZXIgKilhcmcsCisJCQkgICBzaXplb2YocmVxdWVzdCkpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJbGlzdCA9ICZkZXYtPm1hcGxpc3QtPmhlYWQ7CisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CisJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCisJCWlmKHJfbGlzdC0+bWFwICYmCisJCSAgIHJfbGlzdC0+bWFwLT5oYW5kbGUgPT0gcmVxdWVzdC5oYW5kbGUgJiYKKwkJICAgcl9saXN0LT5tYXAtPmZsYWdzICYgX0RSTV9SRU1PVkFCTEUpIGJyZWFrOworCX0KKworCS8qIExpc3QgaGFzIHdyYXBwZWQgYXJvdW5kIHRvIHRoZSBoZWFkIHBvaW50ZXIsIG9yIGl0cyBlbXB0eSB3ZSBkaWRuJ3QKKwkgKiBmaW5kIGFueXRoaW5nLgorCSAqLworCWlmKGxpc3QgPT0gKCZkZXYtPm1hcGxpc3QtPmhlYWQpKSB7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbWFwID0gcl9saXN0LT5tYXA7CisJbGlzdF9kZWwobGlzdCk7CisJZHJtX2ZyZWUobGlzdCwgc2l6ZW9mKCpsaXN0KSwgRFJNX01FTV9NQVBTKTsKKworCWZvciAocHQgPSBkZXYtPnZtYWxpc3QsIHByZXYgPSBOVUxMOyBwdDsgcHJldiA9IHB0LCBwdCA9IHB0LT5uZXh0KSB7CisJCWlmIChwdC0+dm1hLT52bV9wcml2YXRlX2RhdGEgPT0gbWFwKSBmb3VuZF9tYXBzKys7CisJfQorCisJaWYoIWZvdW5kX21hcHMpIHsKKwkJc3dpdGNoIChtYXAtPnR5cGUpIHsKKwkJY2FzZSBfRFJNX1JFR0lTVEVSUzoKKwkJY2FzZSBfRFJNX0ZSQU1FX0JVRkZFUjoKKwkJICBpZiAoZHJtX2NvcmVfaGFzX01UUlIoZGV2KSkgeworCQkJCWlmIChtYXAtPm10cnIgPj0gMCkgeworCQkJCQlpbnQgcmV0Y29kZTsKKwkJCQkJcmV0Y29kZSA9IG10cnJfZGVsKG1hcC0+bXRyciwKKwkJCQkJCQkgICBtYXAtPm9mZnNldCwKKwkJCQkJCQkgICBtYXAtPnNpemUpOworCQkJCQlEUk1fREVCVUcoIm10cnJfZGVsID0gJWRcbiIsIHJldGNvZGUpOworCQkJCX0KKwkJCX0KKwkJCWRybV9pb3JlbWFwZnJlZShtYXAtPmhhbmRsZSwgbWFwLT5zaXplLCBkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgX0RSTV9TSE06CisJCQl2ZnJlZShtYXAtPmhhbmRsZSk7CisJCQlicmVhazsKKwkJY2FzZSBfRFJNX0FHUDoKKwkJY2FzZSBfRFJNX1NDQVRURVJfR0FUSEVSOgorCQkJYnJlYWs7CisJCX0KKwkJZHJtX2ZyZWUobWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyk7CisJfQorCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCXJldHVybiAwOworfQorCisvKioKKyAqIENsZWFudXAgYWZ0ZXIgYW4gZXJyb3Igb24gb25lIG9mIHRoZSBhZGRidWZzKCkgZnVuY3Rpb25zLgorICoKKyAqIFxwYXJhbSBlbnRyeSBidWZmZXIgZW50cnkgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgorICoKKyAqIEZyZWVzIGFueSBwYWdlcyBhbmQgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGVudHJ5LgorICovCitzdGF0aWMgdm9pZCBkcm1fY2xlYW51cF9idWZfZXJyb3IoZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfZW50cnlfdCAqZW50cnkpCit7CisJaW50IGk7CisKKwlpZiAoZW50cnktPnNlZ19jb3VudCkgeworCQlmb3IgKGkgPSAwOyBpIDwgZW50cnktPnNlZ19jb3VudDsgaSsrKSB7CisJCQlpZiAoZW50cnktPnNlZ2xpc3RbaV0pIHsKKwkJCQlkcm1fZnJlZV9wYWdlcyhlbnRyeS0+c2VnbGlzdFtpXSwKKwkJCQkJICAgICAgICBlbnRyeS0+cGFnZV9vcmRlciwKKwkJCQkJICAgICAgICBEUk1fTUVNX0RNQSk7CisJCQl9CisJCX0KKwkJZHJtX2ZyZWUoZW50cnktPnNlZ2xpc3QsCisJCQkgIGVudHJ5LT5zZWdfY291bnQgKgorCQkJICBzaXplb2YoKmVudHJ5LT5zZWdsaXN0KSwKKwkJCSAgRFJNX01FTV9TRUdTKTsKKworCQllbnRyeS0+c2VnX2NvdW50ID0gMDsKKwl9CisKKyAgIAlpZiAoZW50cnktPmJ1Zl9jb3VudCkgeworCSAgIAlmb3IgKGkgPSAwOyBpIDwgZW50cnktPmJ1Zl9jb3VudDsgaSsrKSB7CisJCQlpZiAoZW50cnktPmJ1Zmxpc3RbaV0uZGV2X3ByaXZhdGUpIHsKKwkJCQlkcm1fZnJlZShlbnRyeS0+YnVmbGlzdFtpXS5kZXZfcHJpdmF0ZSwKKwkJCQkJICBlbnRyeS0+YnVmbGlzdFtpXS5kZXZfcHJpdl9zaXplLAorCQkJCQkgIERSTV9NRU1fQlVGUyk7CisJCQl9CisJCX0KKwkJZHJtX2ZyZWUoZW50cnktPmJ1Zmxpc3QsCisJCQkgIGVudHJ5LT5idWZfY291bnQgKgorCQkJICBzaXplb2YoKmVudHJ5LT5idWZsaXN0KSwKKwkJCSAgRFJNX01FTV9CVUZTKTsKKworCQllbnRyeS0+YnVmX2NvdW50ID0gMDsKKwl9Cit9CisKKyNpZiBfX09TX0hBU19BR1AKKy8qKgorICogQWRkIEFHUCBidWZmZXJzIGZvciBETUEgdHJhbnNmZXJzIChpb2N0bCkuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9idWZfZGVzY190IHJlcXVlc3QuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICogCisgKiBBZnRlciBzb21lIHNhbml0eSBjaGVja3MgY3JlYXRlcyBhIGRybV9idWYgc3RydWN0dXJlIGZvciBlYWNoIGJ1ZmZlciBhbmQKKyAqIHJlYWxsb2NhdGVzIHRoZSBidWZmZXIgbGlzdCBvZiB0aGUgc2FtZSBzaXplIG9yZGVyIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcKKyAqIGJ1ZmZlcnMuCisgKi8KK2ludCBkcm1fYWRkYnVmc19hZ3AoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0OworCWRybV9idWZfZW50cnlfdCAqZW50cnk7CisJZHJtX2J1Zl90ICpidWY7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBhZ3Bfb2Zmc2V0OworCWludCBjb3VudDsKKwlpbnQgb3JkZXI7CisJaW50IHNpemU7CisJaW50IGFsaWdubWVudDsKKwlpbnQgcGFnZV9vcmRlcjsKKwlpbnQgdG90YWw7CisJaW50IGJ5dGVfY291bnQ7CisJaW50IGk7CisJZHJtX2J1Zl90ICoqdGVtcF9idWZsaXN0OworCWRybV9idWZfZGVzY190IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmICggIWRtYSApIHJldHVybiAtRUlOVkFMOworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJnJlcXVlc3QsIGFyZ3AsCisJCQkgICAgIHNpemVvZihyZXF1ZXN0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljb3VudCA9IHJlcXVlc3QuY291bnQ7CisJb3JkZXIgPSBkcm1fb3JkZXIoIHJlcXVlc3Quc2l6ZSApOworCXNpemUgPSAxIDw8IG9yZGVyOworCisJYWxpZ25tZW50ICA9IChyZXF1ZXN0LmZsYWdzICYgX0RSTV9QQUdFX0FMSUdOKQorCQk/IFBBR0VfQUxJR04oc2l6ZSkgOiBzaXplOworCXBhZ2Vfb3JkZXIgPSBvcmRlciAtIFBBR0VfU0hJRlQgPiAwID8gb3JkZXIgLSBQQUdFX1NISUZUIDogMDsKKwl0b3RhbCA9IFBBR0VfU0laRSA8PCBwYWdlX29yZGVyOworCisJYnl0ZV9jb3VudCA9IDA7CisJYWdwX29mZnNldCA9IGRldi0+YWdwLT5iYXNlICsgcmVxdWVzdC5hZ3Bfc3RhcnQ7CisKKwlEUk1fREVCVUcoICJjb3VudDogICAgICAlZFxuIiwgIGNvdW50ICk7CisJRFJNX0RFQlVHKCAib3JkZXI6ICAgICAgJWRcbiIsICBvcmRlciApOworCURSTV9ERUJVRyggInNpemU6ICAgICAgICVkXG4iLCAgc2l6ZSApOworCURSTV9ERUJVRyggImFncF9vZmZzZXQ6ICVsdVxuIiwgYWdwX29mZnNldCApOworCURSTV9ERUJVRyggImFsaWdubWVudDogICVkXG4iLCAgYWxpZ25tZW50ICk7CisJRFJNX0RFQlVHKCAicGFnZV9vcmRlcjogJWRcbiIsICBwYWdlX29yZGVyICk7CisJRFJNX0RFQlVHKCAidG90YWw6ICAgICAgJWRcbiIsICB0b3RhbCApOworCisJaWYgKCBvcmRlciA8IERSTV9NSU5fT1JERVIgfHwgb3JkZXIgPiBEUk1fTUFYX09SREVSICkgcmV0dXJuIC1FSU5WQUw7CisJaWYgKCBkZXYtPnF1ZXVlX2NvdW50ICkgcmV0dXJuIC1FQlVTWTsgLyogTm90IHdoaWxlIGluIHVzZSAqLworCisJc3Bpbl9sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisJaWYgKCBkZXYtPmJ1Zl91c2UgKSB7CisJCXNwaW5fdW5sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWF0b21pY19pbmMoICZkZXYtPmJ1Zl9hbGxvYyApOworCXNwaW5fdW5sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisKKwlkb3duKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJZW50cnkgPSAmZG1hLT5idWZzW29yZGVyXTsKKwlpZiAoIGVudHJ5LT5idWZfY291bnQgKSB7CisJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQlyZXR1cm4gLUVOT01FTTsgLyogTWF5IG9ubHkgY2FsbCBvbmNlIGZvciBlYWNoIG9yZGVyICovCisJfQorCisJaWYgKGNvdW50IDwgMCB8fCBjb3VudCA+IDQwOTYpIHsKKwkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJYXRvbWljX2RlYyggJmRldi0+YnVmX2FsbG9jICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVudHJ5LT5idWZsaXN0ID0gZHJtX2FsbG9jKCBjb3VudCAqIHNpemVvZigqZW50cnktPmJ1Zmxpc3QpLAorCQkJCSAgICBEUk1fTUVNX0JVRlMgKTsKKwlpZiAoICFlbnRyeS0+YnVmbGlzdCApIHsKKwkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJYXRvbWljX2RlYyggJmRldi0+YnVmX2FsbG9jICk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoIGVudHJ5LT5idWZsaXN0LCAwLCBjb3VudCAqIHNpemVvZigqZW50cnktPmJ1Zmxpc3QpICk7CisKKwllbnRyeS0+YnVmX3NpemUgPSBzaXplOworCWVudHJ5LT5wYWdlX29yZGVyID0gcGFnZV9vcmRlcjsKKworCW9mZnNldCA9IDA7CisKKwl3aGlsZSAoIGVudHJ5LT5idWZfY291bnQgPCBjb3VudCApIHsKKwkJYnVmICAgICAgICAgID0gJmVudHJ5LT5idWZsaXN0W2VudHJ5LT5idWZfY291bnRdOworCQlidWYtPmlkeCAgICAgPSBkbWEtPmJ1Zl9jb3VudCArIGVudHJ5LT5idWZfY291bnQ7CisJCWJ1Zi0+dG90YWwgICA9IGFsaWdubWVudDsKKwkJYnVmLT5vcmRlciAgID0gb3JkZXI7CisJCWJ1Zi0+dXNlZCAgICA9IDA7CisKKwkJYnVmLT5vZmZzZXQgID0gKGRtYS0+Ynl0ZV9jb3VudCArIG9mZnNldCk7CisJCWJ1Zi0+YnVzX2FkZHJlc3MgPSBhZ3Bfb2Zmc2V0ICsgb2Zmc2V0OworCQlidWYtPmFkZHJlc3MgPSAodm9pZCAqKShhZ3Bfb2Zmc2V0ICsgb2Zmc2V0KTsKKwkJYnVmLT5uZXh0ICAgID0gTlVMTDsKKwkJYnVmLT53YWl0aW5nID0gMDsKKwkJYnVmLT5wZW5kaW5nID0gMDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCggJmJ1Zi0+ZG1hX3dhaXQgKTsKKwkJYnVmLT5maWxwICAgID0gTlVMTDsKKworCQlidWYtPmRldl9wcml2X3NpemUgPSBkZXYtPmRyaXZlci0+ZGV2X3ByaXZfc2l6ZTsKKwkJYnVmLT5kZXZfcHJpdmF0ZSA9IGRybV9hbGxvYyggYnVmLT5kZXZfcHJpdl9zaXplLAorCQkJCQkgICAgICAgRFJNX01FTV9CVUZTICk7CisJCWlmKCFidWYtPmRldl9wcml2YXRlKSB7CisJCQkvKiBTZXQgY291bnQgY29ycmVjdGx5IHNvIHdlIGZyZWUgdGhlIHByb3BlciBhbW91bnQuICovCisJCQllbnRyeS0+YnVmX2NvdW50ID0gY291bnQ7CisJCQlkcm1fY2xlYW51cF9idWZfZXJyb3IoZGV2LGVudHJ5KTsKKwkJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldCggYnVmLT5kZXZfcHJpdmF0ZSwgMCwgYnVmLT5kZXZfcHJpdl9zaXplICk7CisKKwkJRFJNX0RFQlVHKCAiYnVmZmVyICVkIEAgJXBcbiIsCisJCQkgICBlbnRyeS0+YnVmX2NvdW50LCBidWYtPmFkZHJlc3MgKTsKKworCQlvZmZzZXQgKz0gYWxpZ25tZW50OworCQllbnRyeS0+YnVmX2NvdW50Kys7CisJCWJ5dGVfY291bnQgKz0gUEFHRV9TSVpFIDw8IHBhZ2Vfb3JkZXI7CisJfQorCisJRFJNX0RFQlVHKCAiYnl0ZV9jb3VudDogJWRcbiIsIGJ5dGVfY291bnQgKTsKKworCXRlbXBfYnVmbGlzdCA9IGRybV9yZWFsbG9jKCBkbWEtPmJ1Zmxpc3QsCisJCQkJICAgICBkbWEtPmJ1Zl9jb3VudCAqIHNpemVvZigqZG1hLT5idWZsaXN0KSwKKwkJCQkgICAgIChkbWEtPmJ1Zl9jb3VudCArIGVudHJ5LT5idWZfY291bnQpCisJCQkJICAgICAqIHNpemVvZigqZG1hLT5idWZsaXN0KSwKKwkJCQkgICAgIERSTV9NRU1fQlVGUyApOworCWlmKCF0ZW1wX2J1Zmxpc3QpIHsKKwkJLyogRnJlZSB0aGUgZW50cnkgYmVjYXVzZSBpdCBpc24ndCB2YWxpZCAqLworCQlkcm1fY2xlYW51cF9idWZfZXJyb3IoZGV2LGVudHJ5KTsKKwkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJYXRvbWljX2RlYyggJmRldi0+YnVmX2FsbG9jICk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkbWEtPmJ1Zmxpc3QgPSB0ZW1wX2J1Zmxpc3Q7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBlbnRyeS0+YnVmX2NvdW50IDsgaSsrICkgeworCQlkbWEtPmJ1Zmxpc3RbaSArIGRtYS0+YnVmX2NvdW50XSA9ICZlbnRyeS0+YnVmbGlzdFtpXTsKKwl9CisKKwlkbWEtPmJ1Zl9jb3VudCArPSBlbnRyeS0+YnVmX2NvdW50OworCWRtYS0+Ynl0ZV9jb3VudCArPSBieXRlX2NvdW50OworCisJRFJNX0RFQlVHKCAiZG1hLT5idWZfY291bnQgOiAlZFxuIiwgZG1hLT5idWZfY291bnQgKTsKKwlEUk1fREVCVUcoICJlbnRyeS0+YnVmX2NvdW50IDogJWRcbiIsIGVudHJ5LT5idWZfY291bnQgKTsKKworCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisKKwlyZXF1ZXN0LmNvdW50ID0gZW50cnktPmJ1Zl9jb3VudDsKKwlyZXF1ZXN0LnNpemUgPSBzaXplOworCisJaWYgKCBjb3B5X3RvX3VzZXIoIGFyZ3AsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJZG1hLT5mbGFncyA9IF9EUk1fRE1BX1VTRV9BR1A7CisKKwlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBfX09TX0hBU19BR1AgKi8KKworaW50IGRybV9hZGRidWZzX3BjaSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKyAgIAlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfZGVzY190IHJlcXVlc3Q7CisJaW50IGNvdW50OworCWludCBvcmRlcjsKKwlpbnQgc2l6ZTsKKwlpbnQgdG90YWw7CisJaW50IHBhZ2Vfb3JkZXI7CisJZHJtX2J1Zl9lbnRyeV90ICplbnRyeTsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisJZHJtX2J1Zl90ICpidWY7CisJaW50IGFsaWdubWVudDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlpbnQgaTsKKwlpbnQgYnl0ZV9jb3VudDsKKwlpbnQgcGFnZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nICp0ZW1wX3BhZ2VsaXN0OworCWRybV9idWZfdCAqKnRlbXBfYnVmbGlzdDsKKwlkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfUENJX0RNQSkpIHJldHVybiAtRUlOVkFMOworCWlmICggIWRtYSApIHJldHVybiAtRUlOVkFMOworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJnJlcXVlc3QsIGFyZ3AsIHNpemVvZihyZXF1ZXN0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljb3VudCA9IHJlcXVlc3QuY291bnQ7CisJb3JkZXIgPSBkcm1fb3JkZXIoIHJlcXVlc3Quc2l6ZSApOworCXNpemUgPSAxIDw8IG9yZGVyOworCisJRFJNX0RFQlVHKCAiY291bnQ9JWQsIHNpemU9JWQgKCVkKSwgb3JkZXI9JWQsIHF1ZXVlX2NvdW50PSVkXG4iLAorCQkgICByZXF1ZXN0LmNvdW50LCByZXF1ZXN0LnNpemUsIHNpemUsCisJCSAgIG9yZGVyLCBkZXYtPnF1ZXVlX2NvdW50ICk7CisKKwlpZiAoIG9yZGVyIDwgRFJNX01JTl9PUkRFUiB8fCBvcmRlciA+IERSTV9NQVhfT1JERVIgKSByZXR1cm4gLUVJTlZBTDsKKwlpZiAoIGRldi0+cXVldWVfY291bnQgKSByZXR1cm4gLUVCVVNZOyAvKiBOb3Qgd2hpbGUgaW4gdXNlICovCisKKwlhbGlnbm1lbnQgPSAocmVxdWVzdC5mbGFncyAmIF9EUk1fUEFHRV9BTElHTikKKwkJPyBQQUdFX0FMSUdOKHNpemUpIDogc2l6ZTsKKwlwYWdlX29yZGVyID0gb3JkZXIgLSBQQUdFX1NISUZUID4gMCA/IG9yZGVyIC0gUEFHRV9TSElGVCA6IDA7CisJdG90YWwgPSBQQUdFX1NJWkUgPDwgcGFnZV9vcmRlcjsKKworCXNwaW5fbG9jayggJmRldi0+Y291bnRfbG9jayApOworCWlmICggZGV2LT5idWZfdXNlICkgeworCQlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlhdG9taWNfaW5jKCAmZGV2LT5idWZfYWxsb2MgKTsKKwlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCisJZG93biggJmRldi0+c3RydWN0X3NlbSApOworCWVudHJ5ID0gJmRtYS0+YnVmc1tvcmRlcl07CisJaWYgKCBlbnRyeS0+YnVmX2NvdW50ICkgeworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJcmV0dXJuIC1FTk9NRU07CS8qIE1heSBvbmx5IGNhbGwgb25jZSBmb3IgZWFjaCBvcmRlciAqLworCX0KKworCWlmIChjb3VudCA8IDAgfHwgY291bnQgPiA0MDk2KSB7CisJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllbnRyeS0+YnVmbGlzdCA9IGRybV9hbGxvYyggY291bnQgKiBzaXplb2YoKmVudHJ5LT5idWZsaXN0KSwKKwkJCQkgICAgRFJNX01FTV9CVUZTICk7CisJaWYgKCAhZW50cnktPmJ1Zmxpc3QgKSB7CisJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCBlbnRyeS0+YnVmbGlzdCwgMCwgY291bnQgKiBzaXplb2YoKmVudHJ5LT5idWZsaXN0KSApOworCisJZW50cnktPnNlZ2xpc3QgPSBkcm1fYWxsb2MoIGNvdW50ICogc2l6ZW9mKCplbnRyeS0+c2VnbGlzdCksCisJCQkJICAgIERSTV9NRU1fU0VHUyApOworCWlmICggIWVudHJ5LT5zZWdsaXN0ICkgeworCQlkcm1fZnJlZSggZW50cnktPmJ1Zmxpc3QsCisJCQkgIGNvdW50ICogc2l6ZW9mKCplbnRyeS0+YnVmbGlzdCksCisJCQkgIERSTV9NRU1fQlVGUyApOworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCggZW50cnktPnNlZ2xpc3QsIDAsIGNvdW50ICogc2l6ZW9mKCplbnRyeS0+c2VnbGlzdCkgKTsKKworCS8qIEtlZXAgdGhlIG9yaWdpbmFsIHBhZ2VsaXN0IHVudGlsIHdlIGtub3cgYWxsIHRoZSBhbGxvY2F0aW9ucworCSAqIGhhdmUgc3VjY2VlZGVkCisJICovCisJdGVtcF9wYWdlbGlzdCA9IGRybV9hbGxvYyggKGRtYS0+cGFnZV9jb3VudCArIChjb3VudCA8PCBwYWdlX29yZGVyKSkKKwkJCQkgICAgKiBzaXplb2YoKmRtYS0+cGFnZWxpc3QpLAorCQkJCSAgICBEUk1fTUVNX1BBR0VTICk7CisJaWYgKCF0ZW1wX3BhZ2VsaXN0KSB7CisJCWRybV9mcmVlKCBlbnRyeS0+YnVmbGlzdCwKKwkJCSAgIGNvdW50ICogc2l6ZW9mKCplbnRyeS0+YnVmbGlzdCksCisJCQkgICBEUk1fTUVNX0JVRlMgKTsKKwkJZHJtX2ZyZWUoIGVudHJ5LT5zZWdsaXN0LAorCQkJICAgY291bnQgKiBzaXplb2YoKmVudHJ5LT5zZWdsaXN0KSwKKwkJCSAgIERSTV9NRU1fU0VHUyApOworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbWNweSh0ZW1wX3BhZ2VsaXN0LAorCSAgICAgICBkbWEtPnBhZ2VsaXN0LAorCSAgICAgICBkbWEtPnBhZ2VfY291bnQgKiBzaXplb2YoKmRtYS0+cGFnZWxpc3QpKTsKKwlEUk1fREVCVUcoICJwYWdlbGlzdDogJWQgZW50cmllc1xuIiwKKwkJICAgZG1hLT5wYWdlX2NvdW50ICsgKGNvdW50IDw8IHBhZ2Vfb3JkZXIpICk7CisKKwllbnRyeS0+YnVmX3NpemUJPSBzaXplOworCWVudHJ5LT5wYWdlX29yZGVyID0gcGFnZV9vcmRlcjsKKwlieXRlX2NvdW50ID0gMDsKKwlwYWdlX2NvdW50ID0gMDsKKworCXdoaWxlICggZW50cnktPmJ1Zl9jb3VudCA8IGNvdW50ICkgeworCQlwYWdlID0gZHJtX2FsbG9jX3BhZ2VzKCBwYWdlX29yZGVyLCBEUk1fTUVNX0RNQSApOworCQlpZiAoICFwYWdlICkgeworCQkJLyogU2V0IGNvdW50IGNvcnJlY3RseSBzbyB3ZSBmcmVlIHRoZSBwcm9wZXIgYW1vdW50LiAqLworCQkJZW50cnktPmJ1Zl9jb3VudCA9IGNvdW50OworCQkJZW50cnktPnNlZ19jb3VudCA9IGNvdW50OworCQkJZHJtX2NsZWFudXBfYnVmX2Vycm9yKGRldiwgZW50cnkpOworCQkJZHJtX2ZyZWUoIHRlbXBfcGFnZWxpc3QsCisJCQkJICAgKGRtYS0+cGFnZV9jb3VudCArIChjb3VudCA8PCBwYWdlX29yZGVyKSkKKwkJCQkgICAqIHNpemVvZigqZG1hLT5wYWdlbGlzdCksCisJCQkJICAgRFJNX01FTV9QQUdFUyApOworCQkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJZW50cnktPnNlZ2xpc3RbZW50cnktPnNlZ19jb3VudCsrXSA9IHBhZ2U7CisJCWZvciAoIGkgPSAwIDsgaSA8ICgxIDw8IHBhZ2Vfb3JkZXIpIDsgaSsrICkgeworCQkJRFJNX0RFQlVHKCAicGFnZSAlZCBAIDB4JTA4bHhcbiIsCisJCQkJICAgZG1hLT5wYWdlX2NvdW50ICsgcGFnZV9jb3VudCwKKwkJCQkgICBwYWdlICsgUEFHRV9TSVpFICogaSApOworCQkJdGVtcF9wYWdlbGlzdFtkbWEtPnBhZ2VfY291bnQgKyBwYWdlX2NvdW50KytdCisJCQkJPSBwYWdlICsgUEFHRV9TSVpFICogaTsKKwkJfQorCQlmb3IgKCBvZmZzZXQgPSAwIDsKKwkJICAgICAgb2Zmc2V0ICsgc2l6ZSA8PSB0b3RhbCAmJiBlbnRyeS0+YnVmX2NvdW50IDwgY291bnQgOworCQkgICAgICBvZmZzZXQgKz0gYWxpZ25tZW50LCArK2VudHJ5LT5idWZfY291bnQgKSB7CisJCQlidWYJICAgICA9ICZlbnRyeS0+YnVmbGlzdFtlbnRyeS0+YnVmX2NvdW50XTsKKwkJCWJ1Zi0+aWR4ICAgICA9IGRtYS0+YnVmX2NvdW50ICsgZW50cnktPmJ1Zl9jb3VudDsKKwkJCWJ1Zi0+dG90YWwgICA9IGFsaWdubWVudDsKKwkJCWJ1Zi0+b3JkZXIgICA9IG9yZGVyOworCQkJYnVmLT51c2VkICAgID0gMDsKKwkJCWJ1Zi0+b2Zmc2V0ICA9IChkbWEtPmJ5dGVfY291bnQgKyBieXRlX2NvdW50ICsgb2Zmc2V0KTsKKwkJCWJ1Zi0+YWRkcmVzcyA9ICh2b2lkICopKHBhZ2UgKyBvZmZzZXQpOworCQkJYnVmLT5uZXh0ICAgID0gTlVMTDsKKwkJCWJ1Zi0+d2FpdGluZyA9IDA7CisJCQlidWYtPnBlbmRpbmcgPSAwOworCQkJaW5pdF93YWl0cXVldWVfaGVhZCggJmJ1Zi0+ZG1hX3dhaXQgKTsKKwkJCWJ1Zi0+ZmlscCAgICA9IE5VTEw7CisKKwkJCWJ1Zi0+ZGV2X3ByaXZfc2l6ZSA9IGRldi0+ZHJpdmVyLT5kZXZfcHJpdl9zaXplOworCQkJYnVmLT5kZXZfcHJpdmF0ZSA9IGRybV9hbGxvYyggYnVmLT5kZXZfcHJpdl9zaXplLAorCQkJCQkJICAgICAgIERSTV9NRU1fQlVGUyApOworCQkJaWYoIWJ1Zi0+ZGV2X3ByaXZhdGUpIHsKKwkJCQkvKiBTZXQgY291bnQgY29ycmVjdGx5IHNvIHdlIGZyZWUgdGhlIHByb3BlciBhbW91bnQuICovCisJCQkJZW50cnktPmJ1Zl9jb3VudCA9IGNvdW50OworCQkJCWVudHJ5LT5zZWdfY291bnQgPSBjb3VudDsKKwkJCQlkcm1fY2xlYW51cF9idWZfZXJyb3IoZGV2LGVudHJ5KTsKKwkJCQlkcm1fZnJlZSggdGVtcF9wYWdlbGlzdCwKKwkJCQkJICAgKGRtYS0+cGFnZV9jb3VudCArIChjb3VudCA8PCBwYWdlX29yZGVyKSkKKwkJCQkJICAgKiBzaXplb2YoKmRtYS0+cGFnZWxpc3QpLAorCQkJCQkgICBEUk1fTUVNX1BBR0VTICk7CisJCQkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCW1lbXNldCggYnVmLT5kZXZfcHJpdmF0ZSwgMCwgYnVmLT5kZXZfcHJpdl9zaXplICk7CisKKwkJCURSTV9ERUJVRyggImJ1ZmZlciAlZCBAICVwXG4iLAorCQkJCSAgIGVudHJ5LT5idWZfY291bnQsIGJ1Zi0+YWRkcmVzcyApOworCQl9CisJCWJ5dGVfY291bnQgKz0gUEFHRV9TSVpFIDw8IHBhZ2Vfb3JkZXI7CisJfQorCisJdGVtcF9idWZsaXN0ID0gZHJtX3JlYWxsb2MoIGRtYS0+YnVmbGlzdCwKKwkJCQkgICAgIGRtYS0+YnVmX2NvdW50ICogc2l6ZW9mKCpkbWEtPmJ1Zmxpc3QpLAorCQkJCSAgICAgKGRtYS0+YnVmX2NvdW50ICsgZW50cnktPmJ1Zl9jb3VudCkKKwkJCQkgICAgICogc2l6ZW9mKCpkbWEtPmJ1Zmxpc3QpLAorCQkJCSAgICAgRFJNX01FTV9CVUZTICk7CisJaWYgKCF0ZW1wX2J1Zmxpc3QpIHsKKwkJLyogRnJlZSB0aGUgZW50cnkgYmVjYXVzZSBpdCBpc24ndCB2YWxpZCAqLworCQlkcm1fY2xlYW51cF9idWZfZXJyb3IoZGV2LGVudHJ5KTsKKwkJZHJtX2ZyZWUoIHRlbXBfcGFnZWxpc3QsCisJCQkgICAoZG1hLT5wYWdlX2NvdW50ICsgKGNvdW50IDw8IHBhZ2Vfb3JkZXIpKQorCQkJICAgKiBzaXplb2YoKmRtYS0+cGFnZWxpc3QpLAorCQkJICAgRFJNX01FTV9QQUdFUyApOworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRtYS0+YnVmbGlzdCA9IHRlbXBfYnVmbGlzdDsKKworCWZvciAoIGkgPSAwIDsgaSA8IGVudHJ5LT5idWZfY291bnQgOyBpKysgKSB7CisJCWRtYS0+YnVmbGlzdFtpICsgZG1hLT5idWZfY291bnRdID0gJmVudHJ5LT5idWZsaXN0W2ldOworCX0KKworCS8qIE5vIGFsbG9jYXRpb25zIGZhaWxlZCwgc28gbm93IHdlIGNhbiByZXBsYWNlIHRoZSBvcmdpbmFsIHBhZ2VsaXN0CisJICogd2l0aCB0aGUgbmV3IG9uZS4KKwkgKi8KKwlpZiAoZG1hLT5wYWdlX2NvdW50KSB7CisJCWRybV9mcmVlKGRtYS0+cGFnZWxpc3QsCisJCQkgIGRtYS0+cGFnZV9jb3VudCAqIHNpemVvZigqZG1hLT5wYWdlbGlzdCksCisJCQkgIERSTV9NRU1fUEFHRVMpOworCX0KKwlkbWEtPnBhZ2VsaXN0ID0gdGVtcF9wYWdlbGlzdDsKKworCWRtYS0+YnVmX2NvdW50ICs9IGVudHJ5LT5idWZfY291bnQ7CisJZG1hLT5zZWdfY291bnQgKz0gZW50cnktPnNlZ19jb3VudDsKKwlkbWEtPnBhZ2VfY291bnQgKz0gZW50cnktPnNlZ19jb3VudCA8PCBwYWdlX29yZGVyOworCWRtYS0+Ynl0ZV9jb3VudCArPSBQQUdFX1NJWkUgKiAoZW50cnktPnNlZ19jb3VudCA8PCBwYWdlX29yZGVyKTsKKworCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisKKwlyZXF1ZXN0LmNvdW50ID0gZW50cnktPmJ1Zl9jb3VudDsKKwlyZXF1ZXN0LnNpemUgPSBzaXplOworCisJaWYgKCBjb3B5X3RvX3VzZXIoIGFyZ3AsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJYXRvbWljX2RlYyggJmRldi0+YnVmX2FsbG9jICk7CisJcmV0dXJuIDA7CisKK30KKworaW50IGRybV9hZGRidWZzX3NnKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfZGVzY190IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0OworCWRybV9idWZfZW50cnlfdCAqZW50cnk7CisJZHJtX2J1Zl90ICpidWY7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBhZ3Bfb2Zmc2V0OworCWludCBjb3VudDsKKwlpbnQgb3JkZXI7CisJaW50IHNpemU7CisJaW50IGFsaWdubWVudDsKKwlpbnQgcGFnZV9vcmRlcjsKKwlpbnQgdG90YWw7CisJaW50IGJ5dGVfY291bnQ7CisJaW50IGk7CisJZHJtX2J1Zl90ICoqdGVtcF9idWZsaXN0OworCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1NHKSkgcmV0dXJuIC1FSU5WQUw7CisJCisJaWYgKCAhZG1hICkgcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmcmVxdWVzdCwgYXJncCwgc2l6ZW9mKHJlcXVlc3QpICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNvdW50ID0gcmVxdWVzdC5jb3VudDsKKwlvcmRlciA9IGRybV9vcmRlciggcmVxdWVzdC5zaXplICk7CisJc2l6ZSA9IDEgPDwgb3JkZXI7CisKKwlhbGlnbm1lbnQgID0gKHJlcXVlc3QuZmxhZ3MgJiBfRFJNX1BBR0VfQUxJR04pCisJCQk/IFBBR0VfQUxJR04oc2l6ZSkgOiBzaXplOworCXBhZ2Vfb3JkZXIgPSBvcmRlciAtIFBBR0VfU0hJRlQgPiAwID8gb3JkZXIgLSBQQUdFX1NISUZUIDogMDsKKwl0b3RhbCA9IFBBR0VfU0laRSA8PCBwYWdlX29yZGVyOworCisJYnl0ZV9jb3VudCA9IDA7CisJYWdwX29mZnNldCA9IHJlcXVlc3QuYWdwX3N0YXJ0OworCisJRFJNX0RFQlVHKCAiY291bnQ6ICAgICAgJWRcbiIsICBjb3VudCApOworCURSTV9ERUJVRyggIm9yZGVyOiAgICAgICVkXG4iLCAgb3JkZXIgKTsKKwlEUk1fREVCVUcoICJzaXplOiAgICAgICAlZFxuIiwgIHNpemUgKTsKKwlEUk1fREVCVUcoICJhZ3Bfb2Zmc2V0OiAlbHVcbiIsIGFncF9vZmZzZXQgKTsKKwlEUk1fREVCVUcoICJhbGlnbm1lbnQ6ICAlZFxuIiwgIGFsaWdubWVudCApOworCURSTV9ERUJVRyggInBhZ2Vfb3JkZXI6ICVkXG4iLCAgcGFnZV9vcmRlciApOworCURSTV9ERUJVRyggInRvdGFsOiAgICAgICVkXG4iLCAgdG90YWwgKTsKKworCWlmICggb3JkZXIgPCBEUk1fTUlOX09SREVSIHx8IG9yZGVyID4gRFJNX01BWF9PUkRFUiApIHJldHVybiAtRUlOVkFMOworCWlmICggZGV2LT5xdWV1ZV9jb3VudCApIHJldHVybiAtRUJVU1k7IC8qIE5vdCB3aGlsZSBpbiB1c2UgKi8KKworCXNwaW5fbG9jayggJmRldi0+Y291bnRfbG9jayApOworCWlmICggZGV2LT5idWZfdXNlICkgeworCQlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlhdG9taWNfaW5jKCAmZGV2LT5idWZfYWxsb2MgKTsKKwlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCisJZG93biggJmRldi0+c3RydWN0X3NlbSApOworCWVudHJ5ID0gJmRtYS0+YnVmc1tvcmRlcl07CisJaWYgKCBlbnRyeS0+YnVmX2NvdW50ICkgeworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJcmV0dXJuIC1FTk9NRU07IC8qIE1heSBvbmx5IGNhbGwgb25jZSBmb3IgZWFjaCBvcmRlciAqLworCX0KKworCWlmIChjb3VudCA8IDAgfHwgY291bnQgPiA0MDk2KSB7CisJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllbnRyeS0+YnVmbGlzdCA9IGRybV9hbGxvYyggY291bnQgKiBzaXplb2YoKmVudHJ5LT5idWZsaXN0KSwKKwkJCQkgICAgIERSTV9NRU1fQlVGUyApOworCWlmICggIWVudHJ5LT5idWZsaXN0ICkgeworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCggZW50cnktPmJ1Zmxpc3QsIDAsIGNvdW50ICogc2l6ZW9mKCplbnRyeS0+YnVmbGlzdCkgKTsKKworCWVudHJ5LT5idWZfc2l6ZSA9IHNpemU7CisJZW50cnktPnBhZ2Vfb3JkZXIgPSBwYWdlX29yZGVyOworCisJb2Zmc2V0ID0gMDsKKworCXdoaWxlICggZW50cnktPmJ1Zl9jb3VudCA8IGNvdW50ICkgeworCQlidWYgICAgICAgICAgPSAmZW50cnktPmJ1Zmxpc3RbZW50cnktPmJ1Zl9jb3VudF07CisJCWJ1Zi0+aWR4ICAgICA9IGRtYS0+YnVmX2NvdW50ICsgZW50cnktPmJ1Zl9jb3VudDsKKwkJYnVmLT50b3RhbCAgID0gYWxpZ25tZW50OworCQlidWYtPm9yZGVyICAgPSBvcmRlcjsKKwkJYnVmLT51c2VkICAgID0gMDsKKworCQlidWYtPm9mZnNldCAgPSAoZG1hLT5ieXRlX2NvdW50ICsgb2Zmc2V0KTsKKwkJYnVmLT5idXNfYWRkcmVzcyA9IGFncF9vZmZzZXQgKyBvZmZzZXQ7CisJCWJ1Zi0+YWRkcmVzcyA9ICh2b2lkICopKGFncF9vZmZzZXQgKyBvZmZzZXQgKyBkZXYtPnNnLT5oYW5kbGUpOworCQlidWYtPm5leHQgICAgPSBOVUxMOworCQlidWYtPndhaXRpbmcgPSAwOworCQlidWYtPnBlbmRpbmcgPSAwOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCAmYnVmLT5kbWFfd2FpdCApOworCQlidWYtPmZpbHAgICAgPSBOVUxMOworCisJCWJ1Zi0+ZGV2X3ByaXZfc2l6ZSA9IGRldi0+ZHJpdmVyLT5kZXZfcHJpdl9zaXplOworCQlidWYtPmRldl9wcml2YXRlID0gZHJtX2FsbG9jKCBidWYtPmRldl9wcml2X3NpemUsCisJCQkJCSAgICAgICBEUk1fTUVNX0JVRlMgKTsKKwkJaWYoIWJ1Zi0+ZGV2X3ByaXZhdGUpIHsKKwkJCS8qIFNldCBjb3VudCBjb3JyZWN0bHkgc28gd2UgZnJlZSB0aGUgcHJvcGVyIGFtb3VudC4gKi8KKwkJCWVudHJ5LT5idWZfY291bnQgPSBjb3VudDsKKwkJCWRybV9jbGVhbnVwX2J1Zl9lcnJvcihkZXYsZW50cnkpOworCQkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQltZW1zZXQoIGJ1Zi0+ZGV2X3ByaXZhdGUsIDAsIGJ1Zi0+ZGV2X3ByaXZfc2l6ZSApOworCisJCURSTV9ERUJVRyggImJ1ZmZlciAlZCBAICVwXG4iLAorCQkJICAgZW50cnktPmJ1Zl9jb3VudCwgYnVmLT5hZGRyZXNzICk7CisKKwkJb2Zmc2V0ICs9IGFsaWdubWVudDsKKwkJZW50cnktPmJ1Zl9jb3VudCsrOworCQlieXRlX2NvdW50ICs9IFBBR0VfU0laRSA8PCBwYWdlX29yZGVyOworCX0KKworCURSTV9ERUJVRyggImJ5dGVfY291bnQ6ICVkXG4iLCBieXRlX2NvdW50ICk7CisKKwl0ZW1wX2J1Zmxpc3QgPSBkcm1fcmVhbGxvYyggZG1hLT5idWZsaXN0LAorCQkJCSAgICAgZG1hLT5idWZfY291bnQgKiBzaXplb2YoKmRtYS0+YnVmbGlzdCksCisJCQkJICAgICAoZG1hLT5idWZfY291bnQgKyBlbnRyeS0+YnVmX2NvdW50KQorCQkJCSAgICAgKiBzaXplb2YoKmRtYS0+YnVmbGlzdCksCisJCQkJICAgICBEUk1fTUVNX0JVRlMgKTsKKwlpZighdGVtcF9idWZsaXN0KSB7CisJCS8qIEZyZWUgdGhlIGVudHJ5IGJlY2F1c2UgaXQgaXNuJ3QgdmFsaWQgKi8KKwkJZHJtX2NsZWFudXBfYnVmX2Vycm9yKGRldixlbnRyeSk7CisJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZG1hLT5idWZsaXN0ID0gdGVtcF9idWZsaXN0OworCisJZm9yICggaSA9IDAgOyBpIDwgZW50cnktPmJ1Zl9jb3VudCA7IGkrKyApIHsKKwkJZG1hLT5idWZsaXN0W2kgKyBkbWEtPmJ1Zl9jb3VudF0gPSAmZW50cnktPmJ1Zmxpc3RbaV07CisJfQorCisJZG1hLT5idWZfY291bnQgKz0gZW50cnktPmJ1Zl9jb3VudDsKKwlkbWEtPmJ5dGVfY291bnQgKz0gYnl0ZV9jb3VudDsKKworCURSTV9ERUJVRyggImRtYS0+YnVmX2NvdW50IDogJWRcbiIsIGRtYS0+YnVmX2NvdW50ICk7CisJRFJNX0RFQlVHKCAiZW50cnktPmJ1Zl9jb3VudCA6ICVkXG4iLCBlbnRyeS0+YnVmX2NvdW50ICk7CisKKwl1cCggJmRldi0+c3RydWN0X3NlbSApOworCisJcmVxdWVzdC5jb3VudCA9IGVudHJ5LT5idWZfY291bnQ7CisJcmVxdWVzdC5zaXplID0gc2l6ZTsKKworCWlmICggY29weV90b191c2VyKCBhcmdwLCAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRtYS0+ZmxhZ3MgPSBfRFJNX0RNQV9VU0VfU0c7CisKKwlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBBZGQgYnVmZmVycyBmb3IgRE1BIHRyYW5zZmVycyAoaW9jdGwpLgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHBvaW50ZXIgdG8gYSBkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0LgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBBY2NvcmRpbmcgd2l0aCB0aGUgbWVtb3J5IHR5cGUgc3BlY2lmaWVkIGluIGRybV9idWZfZGVzYzo6ZmxhZ3MgYW5kIHRoZQorICogYnVpbGQgb3B0aW9ucywgaXQgZGlzcGF0Y2hlcyB0aGUgY2FsbCBlaXRoZXIgdG8gYWRkYnVmc19hZ3AoKSwKKyAqIGFkZGJ1ZnNfc2coKSBvciBhZGRidWZzX3BjaSgpIGZvciBBR1AsIHNjYXR0ZXItZ2F0aGVyIG9yIGNvbnNpc3RlbnQKKyAqIFBDSSBtZW1vcnkgcmVzcGVjdGl2ZWx5LgorICovCitpbnQgZHJtX2FkZGJ1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0OworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmcmVxdWVzdCwgKGRybV9idWZfZGVzY190IF9fdXNlciAqKWFyZywKKwkJCSAgICAgc2l6ZW9mKHJlcXVlc3QpICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworI2lmIF9fT1NfSEFTX0FHUAorCWlmICggcmVxdWVzdC5mbGFncyAmIF9EUk1fQUdQX0JVRkZFUiApCisJCXJldHVybiBkcm1fYWRkYnVmc19hZ3AoIGlub2RlLCBmaWxwLCBjbWQsIGFyZyApOworCWVsc2UKKyNlbmRpZgorCWlmICggcmVxdWVzdC5mbGFncyAmIF9EUk1fU0dfQlVGRkVSICkKKwkJcmV0dXJuIGRybV9hZGRidWZzX3NnKCBpbm9kZSwgZmlscCwgY21kLCBhcmcgKTsKKwllbHNlCisJCXJldHVybiBkcm1fYWRkYnVmc19wY2koIGlub2RlLCBmaWxwLCBjbWQsIGFyZyApOworfQorCisKKy8qKgorICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBidWZmZXIgbWFwcGluZ3MuCisgKgorICogVGhpcyB3YXMgb3JpZ2luYWxseSBtZWFuIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIG9yIGJ5IGEgc29waGlzdGljYXRlZAorICogY2xpZW50IGxpYnJhcnkgdG8gZGV0ZXJtaW5lIGhvdyBiZXN0IHRvIHVzZSB0aGUgYXZhaWxhYmxlIGJ1ZmZlcnMgKGUuZy4sCisgKiBsYXJnZSBidWZmZXJzIGNhbiBiZSB1c2VkIGZvciBpbWFnZSB0cmFuc2ZlcikuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9idWZfaW5mbyBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIEluY3JlbWVudHMgZHJtX2RldmljZTo6YnVmX3VzZSB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpjb3VudF9sb2NrCisgKiBsb2NrLCBwcmV2ZW50aW5nIG9mIGFsbG9jYXRpbmcgbW9yZSBidWZmZXJzIGFmdGVyIHRoaXMgY2FsbC4gSW5mb3JtYXRpb24KKyAqIGFib3V0IGVhY2ggcmVxdWVzdGVkIGJ1ZmZlciBpcyB0aGVuIGNvcGllZCBpbnRvIHVzZXIgc3BhY2UuCisgKi8KK2ludCBkcm1faW5mb2J1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX2luZm9fdCByZXF1ZXN0OworCWRybV9idWZfaW5mb190IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgaTsKKwlpbnQgY291bnQ7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICggIWRtYSApIHJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisJaWYgKCBhdG9taWNfcmVhZCggJmRldi0+YnVmX2FsbG9jICkgKSB7CisJCXNwaW5fdW5sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCSsrZGV2LT5idWZfdXNlOwkJLyogQ2FuJ3QgYWxsb2NhdGUgbW9yZSBhZnRlciB0aGlzIGNhbGwgKi8KKwlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJnJlcXVlc3QsIGFyZ3AsIHNpemVvZihyZXF1ZXN0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmb3IgKCBpID0gMCwgY291bnQgPSAwIDsgaSA8IERSTV9NQVhfT1JERVIgKyAxIDsgaSsrICkgeworCQlpZiAoIGRtYS0+YnVmc1tpXS5idWZfY291bnQgKSArK2NvdW50OworCX0KKworCURSTV9ERUJVRyggImNvdW50ID0gJWRcbiIsIGNvdW50ICk7CisKKwlpZiAoIHJlcXVlc3QuY291bnQgPj0gY291bnQgKSB7CisJCWZvciAoIGkgPSAwLCBjb3VudCA9IDAgOyBpIDwgRFJNX01BWF9PUkRFUiArIDEgOyBpKysgKSB7CisJCQlpZiAoIGRtYS0+YnVmc1tpXS5idWZfY291bnQgKSB7CisJCQkJZHJtX2J1Zl9kZXNjX3QgX191c2VyICp0byA9ICZyZXF1ZXN0Lmxpc3RbY291bnRdOworCQkJCWRybV9idWZfZW50cnlfdCAqZnJvbSA9ICZkbWEtPmJ1ZnNbaV07CisJCQkJZHJtX2ZyZWVsaXN0X3QgKmxpc3QgPSAmZG1hLT5idWZzW2ldLmZyZWVsaXN0OworCQkJCWlmICggY29weV90b191c2VyKCAmdG8tPmNvdW50LAorCQkJCQkJICAgJmZyb20tPmJ1Zl9jb3VudCwKKwkJCQkJCSAgIHNpemVvZihmcm9tLT5idWZfY291bnQpICkgfHwKKwkJCQkgICAgIGNvcHlfdG9fdXNlciggJnRvLT5zaXplLAorCQkJCQkJICAgJmZyb20tPmJ1Zl9zaXplLAorCQkJCQkJICAgc2l6ZW9mKGZyb20tPmJ1Zl9zaXplKSApIHx8CisJCQkJICAgICBjb3B5X3RvX3VzZXIoICZ0by0+bG93X21hcmssCisJCQkJCQkgICAmbGlzdC0+bG93X21hcmssCisJCQkJCQkgICBzaXplb2YobGlzdC0+bG93X21hcmspICkgfHwKKwkJCQkgICAgIGNvcHlfdG9fdXNlciggJnRvLT5oaWdoX21hcmssCisJCQkJCQkgICAmbGlzdC0+aGlnaF9tYXJrLAorCQkJCQkJICAgc2l6ZW9mKGxpc3QtPmhpZ2hfbWFyaykgKSApCisJCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkJRFJNX0RFQlVHKCAiJWQgJWQgJWQgJWQgJWRcbiIsCisJCQkJCSAgIGksCisJCQkJCSAgIGRtYS0+YnVmc1tpXS5idWZfY291bnQsCisJCQkJCSAgIGRtYS0+YnVmc1tpXS5idWZfc2l6ZSwKKwkJCQkJICAgZG1hLT5idWZzW2ldLmZyZWVsaXN0Lmxvd19tYXJrLAorCQkJCQkgICBkbWEtPmJ1ZnNbaV0uZnJlZWxpc3QuaGlnaF9tYXJrICk7CisJCQkJKytjb3VudDsKKwkJCX0KKwkJfQorCX0KKwlyZXF1ZXN0LmNvdW50ID0gY291bnQ7CisKKwlpZiAoIGNvcHlfdG9fdXNlciggYXJncCwgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBTcGVjaWZpZXMgYSBsb3cgYW5kIGhpZ2ggd2F0ZXIgbWFyayBmb3IgYnVmZmVyIGFsbG9jYXRpb24KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBhIHBvaW50ZXIgdG8gYSBkcm1fYnVmX2Rlc2Mgc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBWZXJpZmllcyB0aGF0IHRoZSBzaXplIG9yZGVyIGlzIGJvdW5kZWQgYmV0d2VlbiB0aGUgYWRtaXNzaWJsZSBvcmRlcnMgYW5kCisgKiB1cGRhdGVzIHRoZSByZXNwZWN0aXZlIGRybV9kZXZpY2VfZG1hOjpidWZzIGVudHJ5IGxvdyBhbmQgaGlnaCB3YXRlciBtYXJrLgorICoKKyAqIFxub3RlIFRoaXMgaW9jdGwgaXMgZGVwcmVjYXRlZCBhbmQgbW9zdGx5IG5ldmVyIHVzZWQuCisgKi8KK2ludCBkcm1fbWFya2J1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0OworCWludCBvcmRlcjsKKwlkcm1fYnVmX2VudHJ5X3QgKmVudHJ5OworCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoICFkbWEgKSByZXR1cm4gLUVJTlZBTDsKKworCWlmICggY29weV9mcm9tX3VzZXIoICZyZXF1ZXN0LAorCQkJICAgICAoZHJtX2J1Zl9kZXNjX3QgX191c2VyICopYXJnLAorCQkJICAgICBzaXplb2YocmVxdWVzdCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJRFJNX0RFQlVHKCAiJWQsICVkLCAlZFxuIiwKKwkJICAgcmVxdWVzdC5zaXplLCByZXF1ZXN0Lmxvd19tYXJrLCByZXF1ZXN0LmhpZ2hfbWFyayApOworCW9yZGVyID0gZHJtX29yZGVyKCByZXF1ZXN0LnNpemUgKTsKKwlpZiAoIG9yZGVyIDwgRFJNX01JTl9PUkRFUiB8fCBvcmRlciA+IERSTV9NQVhfT1JERVIgKSByZXR1cm4gLUVJTlZBTDsKKwllbnRyeSA9ICZkbWEtPmJ1ZnNbb3JkZXJdOworCisJaWYgKCByZXF1ZXN0Lmxvd19tYXJrIDwgMCB8fCByZXF1ZXN0Lmxvd19tYXJrID4gZW50cnktPmJ1Zl9jb3VudCApCisJCXJldHVybiAtRUlOVkFMOworCWlmICggcmVxdWVzdC5oaWdoX21hcmsgPCAwIHx8IHJlcXVlc3QuaGlnaF9tYXJrID4gZW50cnktPmJ1Zl9jb3VudCApCisJCXJldHVybiAtRUlOVkFMOworCisJZW50cnktPmZyZWVsaXN0Lmxvd19tYXJrICA9IHJlcXVlc3QubG93X21hcms7CisJZW50cnktPmZyZWVsaXN0LmhpZ2hfbWFyayA9IHJlcXVlc3QuaGlnaF9tYXJrOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVW5yZXNlcnZlIHRoZSBidWZmZXJzIGluIGxpc3QsIHByZXZpb3VzbHkgcmVzZXJ2ZWQgdXNpbmcgZHJtRE1BLiAKKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX2J1Zl9mcmVlIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKiAKKyAqIENhbGxzIGZyZWVfYnVmZmVyKCkgZm9yIGVhY2ggdXNlZCBidWZmZXIuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHByaW1hcmlseSB1c2VkIGZvciBkZWJ1Z2dpbmcuCisgKi8KK2ludCBkcm1fZnJlZWJ1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX2ZyZWVfdCByZXF1ZXN0OworCWludCBpOworCWludCBpZHg7CisJZHJtX2J1Zl90ICpidWY7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICggIWRtYSApIHJldHVybiAtRUlOVkFMOworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJnJlcXVlc3QsCisJCQkgICAgIChkcm1fYnVmX2ZyZWVfdCBfX3VzZXIgKilhcmcsCisJCQkgICAgIHNpemVvZihyZXF1ZXN0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlEUk1fREVCVUcoICIlZFxuIiwgcmVxdWVzdC5jb3VudCApOworCWZvciAoIGkgPSAwIDsgaSA8IHJlcXVlc3QuY291bnQgOyBpKysgKSB7CisJCWlmICggY29weV9mcm9tX3VzZXIoICZpZHgsCisJCQkJICAgICAmcmVxdWVzdC5saXN0W2ldLAorCQkJCSAgICAgc2l6ZW9mKGlkeCkgKSApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKCBpZHggPCAwIHx8IGlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJCURSTV9FUlJPUiggIkluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJCSAgIGlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlidWYgPSBkbWEtPmJ1Zmxpc3RbaWR4XTsKKwkJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJCURSTV9FUlJPUiggIlByb2Nlc3MgJWQgZnJlZWluZyBidWZmZXIgbm90IG93bmVkXG4iLAorCQkJCSAgIGN1cnJlbnQtPnBpZCApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZHJtX2ZyZWVfYnVmZmVyKCBkZXYsIGJ1ZiApOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIE1hcHMgYWxsIG9mIHRoZSBETUEgYnVmZmVycyBpbnRvIGNsaWVudC12aXJ0dWFsIHNwYWNlIChpb2N0bCkuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9idWZfbWFwIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogTWFwcyB0aGUgQUdQIG9yIFNHIGJ1ZmZlciByZWdpb24gd2l0aCBkb19tbWFwKCksIGFuZCBjb3BpZXMgaW5mb3JtYXRpb24KKyAqIGFib3V0IGVhY2ggYnVmZmVyIGludG8gdXNlciBzcGFjZS4gVGhlIFBDSSBidWZmZXJzIGFyZSBhbHJlYWR5IG1hcHBlZCBvbiB0aGUKKyAqIGFkZGJ1ZnNfcGNpKCkgY2FsbC4KKyAqLworaW50IGRybV9tYXBidWZzKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX21hcF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgcmV0Y29kZSA9IDA7CisJY29uc3QgaW50IHplcm8gPSAwOworCXVuc2lnbmVkIGxvbmcgdmlydHVhbDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJZHJtX2J1Zl9tYXBfdCByZXF1ZXN0OworCWludCBpOworCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoICFkbWEgKSByZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jayggJmRldi0+Y291bnRfbG9jayApOworCWlmICggYXRvbWljX3JlYWQoICZkZXYtPmJ1Zl9hbGxvYyApICkgeworCQlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlkZXYtPmJ1Zl91c2UrKzsJCS8qIENhbid0IGFsbG9jYXRlIG1vcmUgYWZ0ZXIgdGhpcyBjYWxsICovCisJc3Bpbl91bmxvY2soICZkZXYtPmNvdW50X2xvY2sgKTsKKworCWlmICggY29weV9mcm9tX3VzZXIoICZyZXF1ZXN0LCBhcmdwLCBzaXplb2YocmVxdWVzdCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCByZXF1ZXN0LmNvdW50ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQlpZiAoKGRybV9jb3JlX2hhc19BR1AoZGV2KSAmJiAoZG1hLT5mbGFncyAmIF9EUk1fRE1BX1VTRV9BR1ApKSB8fAorCQkgICAgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfU0cpICYmIChkbWEtPmZsYWdzICYgX0RSTV9ETUFfVVNFX1NHKSkgKSB7CisJCQlkcm1fbWFwX3QgKm1hcCA9IGRldi0+YWdwX2J1ZmZlcl9tYXA7CisKKwkJCWlmICggIW1hcCApIHsKKwkJCQlyZXRjb2RlID0gLUVJTlZBTDsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgwMjA0MDIKKwkJCWRvd24oICZjdXJyZW50LT5tbS0+bW1hcF9zZW0gKTsKKyNlbHNlCisJCQlkb3duX3dyaXRlKCAmY3VycmVudC0+bW0tPm1tYXBfc2VtICk7CisjZW5kaWYKKwkJCXZpcnR1YWwgPSBkb19tbWFwKCBmaWxwLCAwLCBtYXAtPnNpemUsCisJCQkJCSAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCQkJCSAgIE1BUF9TSEFSRUQsCisJCQkJCSAgICh1bnNpZ25lZCBsb25nKW1hcC0+b2Zmc2V0ICk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MDIwNDAyCisJCQl1cCggJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSApOworI2Vsc2UKKwkJCXVwX3dyaXRlKCAmY3VycmVudC0+bW0tPm1tYXBfc2VtICk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgwMjA0MDIKKwkJCWRvd24oICZjdXJyZW50LT5tbS0+bW1hcF9zZW0gKTsKKyNlbHNlCisJCQlkb3duX3dyaXRlKCAmY3VycmVudC0+bW0tPm1tYXBfc2VtICk7CisjZW5kaWYKKwkJCXZpcnR1YWwgPSBkb19tbWFwKCBmaWxwLCAwLCBkbWEtPmJ5dGVfY291bnQsCisJCQkJCSAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCQkJCSAgIE1BUF9TSEFSRUQsIDAgKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgwMjA0MDIKKwkJCXVwKCAmY3VycmVudC0+bW0tPm1tYXBfc2VtICk7CisjZWxzZQorCQkJdXBfd3JpdGUoICZjdXJyZW50LT5tbS0+bW1hcF9zZW0gKTsKKyNlbmRpZgorCQl9CisJCWlmICggdmlydHVhbCA+IC0xMDI0VUwgKSB7CisJCQkvKiBSZWFsIGVycm9yICovCisJCQlyZXRjb2RlID0gKHNpZ25lZCBsb25nKXZpcnR1YWw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJcmVxdWVzdC52aXJ0dWFsID0gKHZvaWQgX191c2VyICopdmlydHVhbDsKKworCQlmb3IgKCBpID0gMCA7IGkgPCBkbWEtPmJ1Zl9jb3VudCA7IGkrKyApIHsKKwkJCWlmICggY29weV90b191c2VyKCAmcmVxdWVzdC5saXN0W2ldLmlkeCwKKwkJCQkJICAgJmRtYS0+YnVmbGlzdFtpXS0+aWR4LAorCQkJCQkgICBzaXplb2YocmVxdWVzdC5saXN0WzBdLmlkeCkgKSApIHsKKwkJCQlyZXRjb2RlID0gLUVGQVVMVDsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlpZiAoIGNvcHlfdG9fdXNlciggJnJlcXVlc3QubGlzdFtpXS50b3RhbCwKKwkJCQkJICAgJmRtYS0+YnVmbGlzdFtpXS0+dG90YWwsCisJCQkJCSAgIHNpemVvZihyZXF1ZXN0Lmxpc3RbMF0udG90YWwpICkgKSB7CisJCQkJcmV0Y29kZSA9IC1FRkFVTFQ7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJaWYgKCBjb3B5X3RvX3VzZXIoICZyZXF1ZXN0Lmxpc3RbaV0udXNlZCwKKwkJCQkJICAgJnplcm8sCisJCQkJCSAgIHNpemVvZih6ZXJvKSApICkgeworCQkJCXJldGNvZGUgPSAtRUZBVUxUOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWFkZHJlc3MgPSB2aXJ0dWFsICsgZG1hLT5idWZsaXN0W2ldLT5vZmZzZXQ7IC8qICoqKiAqLworCQkJaWYgKCBjb3B5X3RvX3VzZXIoICZyZXF1ZXN0Lmxpc3RbaV0uYWRkcmVzcywKKwkJCQkJICAgJmFkZHJlc3MsCisJCQkJCSAgIHNpemVvZihhZGRyZXNzKSApICkgeworCQkJCXJldGNvZGUgPSAtRUZBVUxUOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCX0KKyBkb25lOgorCXJlcXVlc3QuY291bnQgPSBkbWEtPmJ1Zl9jb3VudDsKKwlEUk1fREVCVUcoICIlZCBidWZmZXJzLCByZXRjb2RlID0gJWRcbiIsIHJlcXVlc3QuY291bnQsIHJldGNvZGUgKTsKKworCWlmICggY29weV90b191c2VyKCBhcmdwLCAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiByZXRjb2RlOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1Yzg2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYwpAQCAtMCwwICsxLDU3OCBAQAorLyoqCisgKiBcZmlsZSBkcm1fY29udGV4dC5oIAorICogSU9DVExzIGZvciBnZW5lcmljIGNvbnRleHRzCisgKiAKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ3JlYXRlZDogRnJpIE5vdiAyNCAxODozMTozNyAyMDAwIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIENoYW5nZUxvZzoKKyAqICAyMDAxLTExLTE2CVRvcnN0ZW4gRHV3ZSA8ZHV3ZUBjYWxkZXJhLmRlPgorICoJCWFkZGVkIGNvbnRleHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBob29rcywKKyAqCQluZWVkZWQgYnkgU2lTIGRyaXZlcidzIG1lbW9yeSBtYW5hZ2VtZW50LgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgQ29udGV4dCBiaXRtYXAgc3VwcG9ydCAqLworLypAeyovCisKKy8qKgorICogRnJlZSBhIGhhbmRsZSBmcm9tIHRoZSBjb250ZXh0IGJpdG1hcC4KKyAqCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCisgKiBccGFyYW0gY3R4X2hhbmRsZSBjb250ZXh0IGhhbmRsZS4KKyAqCisgKiBDbGVhcnMgdGhlIGJpdCBzcGVjaWZpZWQgYnkgXHAgY3R4X2hhbmRsZSBpbiBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCB0aGUgZW50cnkKKyAqIGluIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzLCB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3Rfc2VtCisgKiBsb2NrLgorICovCit2b2lkIGRybV9jdHhiaXRtYXBfZnJlZSggZHJtX2RldmljZV90ICpkZXYsIGludCBjdHhfaGFuZGxlICkKK3sKKwlpZiAoIGN0eF9oYW5kbGUgPCAwICkgZ290byBmYWlsZWQ7CisJaWYgKCAhZGV2LT5jdHhfYml0bWFwICkgZ290byBmYWlsZWQ7CisKKwlpZiAoIGN0eF9oYW5kbGUgPCBEUk1fTUFYX0NUWEJJVE1BUCApIHsKKwkJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJY2xlYXJfYml0KCBjdHhfaGFuZGxlLCBkZXYtPmN0eF9iaXRtYXAgKTsKKwkJZGV2LT5jb250ZXh0X3NhcmVhc1tjdHhfaGFuZGxlXSA9IE5VTEw7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlyZXR1cm47CisJfQorZmFpbGVkOgorICAgICAgIAlEUk1fRVJST1IoICJBdHRlbXB0IHRvIGZyZWUgaW52YWxpZCBjb250ZXh0IGhhbmRsZTogJWRcbiIsCisJCSAgIGN0eF9oYW5kbGUgKTsKKyAgICAgICAJcmV0dXJuOworfQorCisvKiogCisgKiBDb250ZXh0IGJpdG1hcCBhbGxvY2F0aW9uLgorICoKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KKyAqIFxyZXR1cm4gKG5vbi1uZWdhdGl2ZSkgY29udGV4dCBoYW5kbGUgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIEZpbmQgdGhlIGZpcnN0IHplcm8gYml0IGluIGRybV9kZXZpY2U6OmN0eF9iaXRtYXAgYW5kIChyZSlhbGxvY2F0ZXMKKyAqIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcgZW50cnkgd2hpbGUgaG9sZGluZyB0aGUKKyAqIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KKyAqLworaW50IGRybV9jdHhiaXRtYXBfbmV4dCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWludCBiaXQ7CisKKwlpZighZGV2LT5jdHhfYml0bWFwKSByZXR1cm4gLTE7CisKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWJpdCA9IGZpbmRfZmlyc3RfemVyb19iaXQoIGRldi0+Y3R4X2JpdG1hcCwgRFJNX01BWF9DVFhCSVRNQVAgKTsKKwlpZiAoIGJpdCA8IERSTV9NQVhfQ1RYQklUTUFQICkgeworCQlzZXRfYml0KCBiaXQsIGRldi0+Y3R4X2JpdG1hcCApOworCSAgIAlEUk1fREVCVUcoICJkcm1fY3R4Yml0bWFwX25leHQgYml0IDogJWRcbiIsIGJpdCApOworCQlpZigoYml0KzEpID4gZGV2LT5tYXhfY29udGV4dCkgeworCQkJZGV2LT5tYXhfY29udGV4dCA9IChiaXQrMSk7CisJCQlpZihkZXYtPmNvbnRleHRfc2FyZWFzKSB7CisJCQkJZHJtX21hcF90ICoqY3R4X3NhcmVhczsKKworCQkJCWN0eF9zYXJlYXMgPSBkcm1fcmVhbGxvYyhkZXYtPmNvbnRleHRfc2FyZWFzLAorCQkJCQkJKGRldi0+bWF4X2NvbnRleHQgLSAxKSAqIAorCQkJCQkJc2l6ZW9mKCpkZXYtPmNvbnRleHRfc2FyZWFzKSwKKwkJCQkJCWRldi0+bWF4X2NvbnRleHQgKiAKKwkJCQkJCXNpemVvZigqZGV2LT5jb250ZXh0X3NhcmVhcyksCisJCQkJCQlEUk1fTUVNX01BUFMpOworCQkJCWlmKCFjdHhfc2FyZWFzKSB7CisJCQkJCWNsZWFyX2JpdChiaXQsIGRldi0+Y3R4X2JpdG1hcCk7CisJCQkJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWRldi0+Y29udGV4dF9zYXJlYXMgPSBjdHhfc2FyZWFzOworCQkJCWRldi0+Y29udGV4dF9zYXJlYXNbYml0XSA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCS8qIG1heF9jb250ZXh0ID09IDEgYXQgdGhpcyBwb2ludCAqLworCQkJCWRldi0+Y29udGV4dF9zYXJlYXMgPSBkcm1fYWxsb2MoCisJCQkJCQlkZXYtPm1heF9jb250ZXh0ICogCisJCQkJCQlzaXplb2YoKmRldi0+Y29udGV4dF9zYXJlYXMpLAorCQkJCQkJRFJNX01FTV9NQVBTKTsKKwkJCQlpZighZGV2LT5jb250ZXh0X3NhcmVhcykgeworCQkJCQljbGVhcl9iaXQoYml0LCBkZXYtPmN0eF9iaXRtYXApOworCQkJCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlkZXYtPmNvbnRleHRfc2FyZWFzW2JpdF0gPSBOVUxMOworCQkJfQorCQl9CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlyZXR1cm4gYml0OworCX0KKwl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICogQ29udGV4dCBiaXRtYXAgaW5pdGlhbGl6YXRpb24uCisgKgorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICoKKyAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZSBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcywgd2hpbGUgaG9sZGluZworICogdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KKyAqLworaW50IGRybV9jdHhiaXRtYXBfaW5pdCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWludCBpOworICAgCWludCB0ZW1wOworCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlkZXYtPmN0eF9iaXRtYXAgPSAodW5zaWduZWQgbG9uZyAqKSBkcm1fYWxsb2MoIFBBR0VfU0laRSwKKwkJCQkJCQlEUk1fTUVNX0NUWEJJVE1BUCApOworCWlmICggZGV2LT5jdHhfYml0bWFwID09IE5VTEwgKSB7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCAodm9pZCAqKWRldi0+Y3R4X2JpdG1hcCwgMCwgUEFHRV9TSVpFICk7CisJZGV2LT5jb250ZXh0X3NhcmVhcyA9IE5VTEw7CisJZGV2LT5tYXhfY29udGV4dCA9IC0xOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCisJZm9yICggaSA9IDAgOyBpIDwgRFJNX1JFU0VSVkVEX0NPTlRFWFRTIDsgaSsrICkgeworCQl0ZW1wID0gZHJtX2N0eGJpdG1hcF9uZXh0KCBkZXYgKTsKKwkgICAJRFJNX0RFQlVHKCAiZHJtX2N0eGJpdG1hcF9pbml0IDogJWRcbiIsIHRlbXAgKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBDb250ZXh0IGJpdG1hcCBjbGVhbnVwLgorICoKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KKyAqCisgKiBGcmVlcyBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcywgd2hpbGUgaG9sZGluZworICogdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KKyAqLwordm9pZCBkcm1fY3R4Yml0bWFwX2NsZWFudXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWlmKCBkZXYtPmNvbnRleHRfc2FyZWFzICkgZHJtX2ZyZWUoIGRldi0+Y29udGV4dF9zYXJlYXMsCisJCQkJCSAgICAgc2l6ZW9mKCpkZXYtPmNvbnRleHRfc2FyZWFzKSAqIAorCQkJCQkgICAgIGRldi0+bWF4X2NvbnRleHQsCisJCQkJCSAgICAgRFJNX01FTV9NQVBTICk7CisJZHJtX2ZyZWUoICh2b2lkICopZGV2LT5jdHhfYml0bWFwLCBQQUdFX1NJWkUsIERSTV9NRU1fQ1RYQklUTUFQICk7CisJdXAoJmRldi0+c3RydWN0X3NlbSk7Cit9CisKKy8qQH0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFxuYW1lIFBlciBDb250ZXh0IFNBUkVBIFN1cHBvcnQgKi8KKy8qQHsqLworCisvKioKKyAqIEdldCBwZXItY29udGV4dCBTQVJFQS4KKyAqIAorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCBwb2ludGluZyB0byBhIGRybV9jdHhfcHJpdl9tYXAgc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBHZXRzIHRoZSBtYXAgZnJvbSBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcyB3aXRoIHRoZSBoYW5kbGUgc3BlY2lmaWVkIGFuZAorICogcmV0dXJucyBpdHMgaGFuZGxlLgorICovCitpbnQgZHJtX2dldHNhcmVhY3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2N0eF9wcml2X21hcF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fY3R4X3ByaXZfbWFwX3QgcmVxdWVzdDsKKwlkcm1fbWFwX3QgKm1hcDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgYXJncCwgc2l6ZW9mKHJlcXVlc3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWlmIChkZXYtPm1heF9jb250ZXh0IDwgMCB8fCByZXF1ZXN0LmN0eF9pZCA+PSAodW5zaWduZWQpIGRldi0+bWF4X2NvbnRleHQpIHsKKwkJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1hcCA9IGRldi0+Y29udGV4dF9zYXJlYXNbcmVxdWVzdC5jdHhfaWRdOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCisJcmVxdWVzdC5oYW5kbGUgPSBtYXAtPmhhbmRsZTsKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBTZXQgcGVyLWNvbnRleHQgU0FSRUEuCisgKiAKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQgcG9pbnRpbmcgdG8gYSBkcm1fY3R4X3ByaXZfbWFwIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogU2VhcmNoZXMgdGhlIG1hcHBpbmcgc3BlY2lmaWVkIGluIFxwIGFyZyBhbmQgdXBkYXRlIHRoZSBlbnRyeSBpbgorICogZHJtX2RldmljZTo6Y29udGV4dF9zYXJlYXMgd2l0aCBpdC4KKyAqLworaW50IGRybV9zZXRzYXJlYWN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9jdHhfcHJpdl9tYXBfdCByZXF1ZXN0OworCWRybV9tYXBfdCAqbWFwID0gTlVMTDsKKwlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LAorCQkJICAgKGRybV9jdHhfcHJpdl9tYXBfdCBfX3VzZXIgKilhcmcsCisJCQkgICBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CisJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCQlpZihyX2xpc3QtPm1hcCAmJgorCQkgICByX2xpc3QtPm1hcC0+aGFuZGxlID09IHJlcXVlc3QuaGFuZGxlKQorCQkJZ290byBmb3VuZDsKKwl9CitiYWQ6CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJcmV0dXJuIC1FSU5WQUw7CisKK2ZvdW5kOgorCW1hcCA9IHJfbGlzdC0+bWFwOworCWlmICghbWFwKSBnb3RvIGJhZDsKKwlpZiAoZGV2LT5tYXhfY29udGV4dCA8IDApCisJCWdvdG8gYmFkOworCWlmIChyZXF1ZXN0LmN0eF9pZCA+PSAodW5zaWduZWQpIGRldi0+bWF4X2NvbnRleHQpCisJCWdvdG8gYmFkOworCWRldi0+Y29udGV4dF9zYXJlYXNbcmVxdWVzdC5jdHhfaWRdID0gbWFwOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCXJldHVybiAwOworfQorCisvKkB9Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBcbmFtZSBUaGUgYWN0dWFsIERSTSBjb250ZXh0IGhhbmRsaW5nIHJvdXRpbmVzICovCisvKkB7Ki8KKworLyoqCisgKiBTd2l0Y2ggY29udGV4dC4KKyAqCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCisgKiBccGFyYW0gb2xkIG9sZCBjb250ZXh0IGhhbmRsZS4KKyAqIFxwYXJhbSBuZXcgbmV3IGNvbnRleHQgaGFuZGxlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBBdHRlbXB0IHRvIHNldCBkcm1fZGV2aWNlOjpjb250ZXh0X2ZsYWcuCisgKi8KK2ludCBkcm1fY29udGV4dF9zd2l0Y2goIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgb2xkLCBpbnQgbmV3ICkKK3sKKyAgICAgICAgaWYgKCB0ZXN0X2FuZF9zZXRfYml0KCAwLCAmZGV2LT5jb250ZXh0X2ZsYWcgKSApIHsKKyAgICAgICAgICAgICAgICBEUk1fRVJST1IoICJSZWVudGVyaW5nIC0tIEZJWE1FXG4iICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorCisKKyAgICAgICAgRFJNX0RFQlVHKCAiQ29udGV4dCBzd2l0Y2ggZnJvbSAlZCB0byAlZFxuIiwgb2xkLCBuZXcgKTsKKworICAgICAgICBpZiAoIG5ldyA9PSBkZXYtPmxhc3RfY29udGV4dCApIHsKKyAgICAgICAgICAgICAgICBjbGVhcl9iaXQoIDAsICZkZXYtPmNvbnRleHRfZmxhZyApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29tcGxldGUgY29udGV4dCBzd2l0Y2guCisgKgorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIG5ldyBuZXcgY29udGV4dCBoYW5kbGUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIFVwZGF0ZXMgZHJtX2RldmljZTo6bGFzdF9jb250ZXh0IGFuZCBkcm1fZGV2aWNlOjpsYXN0X3N3aXRjaC4gVmVyaWZpZXMgdGhlCisgKiBoYXJkd2FyZSBsb2NrIGlzIGhlbGQsIGNsZWFycyB0aGUgZHJtX2RldmljZTo6Y29udGV4dF9mbGFnIGFuZCB3YWtlcyB1cAorICogZHJtX2RldmljZTo6Y29udGV4dF93YWl0LgorICovCitpbnQgZHJtX2NvbnRleHRfc3dpdGNoX2NvbXBsZXRlKCBkcm1fZGV2aWNlX3QgKmRldiwgaW50IG5ldyApCit7CisgICAgICAgIGRldi0+bGFzdF9jb250ZXh0ID0gbmV3OyAgLyogUFJFL1BPU1Q6IFRoaXMgaXMgdGhlIF9vbmx5XyB3cml0ZXIuICovCisgICAgICAgIGRldi0+bGFzdF9zd2l0Y2ggID0gamlmZmllczsKKworICAgICAgICBpZiAoICFfRFJNX0xPQ0tfSVNfSEVMRChkZXYtPmxvY2suaHdfbG9jay0+bG9jaykgKSB7CisgICAgICAgICAgICAgICAgRFJNX0VSUk9SKCAiTG9jayBpc24ndCBoZWxkIGFmdGVyIGNvbnRleHQgc3dpdGNoXG4iICk7CisgICAgICAgIH0KKworCQkJCS8qIElmIGEgY29udGV4dCBzd2l0Y2ggaXMgZXZlciBpbml0aWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUga2VybmVsIGhvbGRzIHRoZSBsb2NrLCByZWxlYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbG9jayBoZXJlLiAqLworICAgICAgICBjbGVhcl9iaXQoIDAsICZkZXYtPmNvbnRleHRfZmxhZyApOworICAgICAgICB3YWtlX3VwKCAmZGV2LT5jb250ZXh0X3dhaXQgKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBSZXNlcnZlIGNvbnRleHRzLgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQgcG9pbnRpbmcgdG8gYSBkcm1fY3R4X3JlcyBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICovCitpbnQgZHJtX3Jlc2N0eCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2N0eF9yZXNfdCByZXM7CisJZHJtX2N0eF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fY3R4X3QgY3R4OworCWludCBpOworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJnJlcywgYXJncCwgc2l6ZW9mKHJlcykgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCByZXMuY291bnQgPj0gRFJNX1JFU0VSVkVEX0NPTlRFWFRTICkgeworCQltZW1zZXQoICZjdHgsIDAsIHNpemVvZihjdHgpICk7CisJCWZvciAoIGkgPSAwIDsgaSA8IERSTV9SRVNFUlZFRF9DT05URVhUUyA7IGkrKyApIHsKKwkJCWN0eC5oYW5kbGUgPSBpOworCQkJaWYgKCBjb3B5X3RvX3VzZXIoICZyZXMuY29udGV4dHNbaV0sCisJCQkJCSAgICZpLCBzaXplb2YoaSkgKSApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJcmVzLmNvdW50ID0gRFJNX1JFU0VSVkVEX0NPTlRFWFRTOworCisJaWYgKCBjb3B5X3RvX3VzZXIoIGFyZ3AsICZyZXMsIHNpemVvZihyZXMpICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBBZGQgY29udGV4dC4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50IHBvaW50aW5nIHRvIGEgZHJtX2N0eCBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIEdldCBhIG5ldyBoYW5kbGUgZm9yIHRoZSBjb250ZXh0IGFuZCBjb3B5IHRvIHVzZXJzcGFjZS4KKyAqLworaW50IGRybV9hZGRjdHgoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2N0eF9saXN0X3QgKiBjdHhfZW50cnk7CisJZHJtX2N0eF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fY3R4X3QgY3R4OworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJmN0eCwgYXJncCwgc2l6ZW9mKGN0eCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJY3R4LmhhbmRsZSA9IGRybV9jdHhiaXRtYXBfbmV4dCggZGV2ICk7CisJaWYgKCBjdHguaGFuZGxlID09IERSTV9LRVJORUxfQ09OVEVYVCApIHsKKwkJCQkvKiBTa2lwIGtlcm5lbCdzIGNvbnRleHQgYW5kIGdldCBhIG5ldyBvbmUuICovCisJCWN0eC5oYW5kbGUgPSBkcm1fY3R4Yml0bWFwX25leHQoIGRldiApOworCX0KKwlEUk1fREVCVUcoICIlZFxuIiwgY3R4LmhhbmRsZSApOworCWlmICggY3R4LmhhbmRsZSA9PSAtMSApIHsKKwkJRFJNX0RFQlVHKCAiTm90IGVub3VnaCBmcmVlIGNvbnRleHRzLlxuIiApOworCQkJCS8qIFNob3VsZCB0aGlzIHJldHVybiAtRUJVU1kgaW5zdGVhZD8gKi8KKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKCBjdHguaGFuZGxlICE9IERSTV9LRVJORUxfQ09OVEVYVCApCisJeworCQlpZiAoZGV2LT5kcml2ZXItPmNvbnRleHRfY3RvcikKKwkJCWRldi0+ZHJpdmVyLT5jb250ZXh0X2N0b3IoZGV2LCBjdHguaGFuZGxlKTsKKwl9CisKKwljdHhfZW50cnkgPSBkcm1fYWxsb2MoIHNpemVvZigqY3R4X2VudHJ5KSwgRFJNX01FTV9DVFhMSVNUICk7CisJaWYgKCAhY3R4X2VudHJ5ICkgeworCQlEUk1fREVCVUcoIm91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCggJmN0eF9lbnRyeS0+aGVhZCApOworCWN0eF9lbnRyeS0+aGFuZGxlID0gY3R4LmhhbmRsZTsKKwljdHhfZW50cnktPnRhZyA9IHByaXY7CisKKwlkb3duKCAmZGV2LT5jdHhsaXN0X3NlbSApOworCWxpc3RfYWRkKCAmY3R4X2VudHJ5LT5oZWFkLCAmZGV2LT5jdHhsaXN0LT5oZWFkICk7CisJKytkZXYtPmN0eF9jb3VudDsKKwl1cCggJmRldi0+Y3R4bGlzdF9zZW0gKTsKKworCWlmICggY29weV90b191c2VyKCBhcmdwLCAmY3R4LCBzaXplb2YoY3R4KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcm1fbW9kY3R4KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwkvKiBUaGlzIGRvZXMgbm90aGluZyAqLworCXJldHVybiAwOworfQorCisvKioKKyAqIEdldCBjb250ZXh0LgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQgcG9pbnRpbmcgdG8gYSBkcm1fY3R4IHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2ludCBkcm1fZ2V0Y3R4KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fY3R4X3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9jdHhfdCBjdHg7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmY3R4LCBhcmdwLCBzaXplb2YoY3R4KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBUaGlzIGlzIDAsIGJlY2F1c2Ugd2UgZG9uJ3QgaGFuZGxlIGFueSBjb250ZXh0IGZsYWdzICovCisJY3R4LmZsYWdzID0gMDsKKworCWlmICggY29weV90b191c2VyKCBhcmdwLCAmY3R4LCBzaXplb2YoY3R4KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU3dpdGNoIGNvbnRleHQuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCBwb2ludGluZyB0byBhIGRybV9jdHggc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBDYWxscyBjb250ZXh0X3N3aXRjaCgpLgorICovCitpbnQgZHJtX3N3aXRjaGN0eCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fY3R4X3QgY3R4OworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCURSTV9ERUJVRyggIiVkXG4iLCBjdHguaGFuZGxlICk7CisJcmV0dXJuIGRybV9jb250ZXh0X3N3aXRjaCggZGV2LCBkZXYtPmxhc3RfY29udGV4dCwgY3R4LmhhbmRsZSApOworfQorCisvKioKKyAqIE5ldyBjb250ZXh0LgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQgcG9pbnRpbmcgdG8gYSBkcm1fY3R4IHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogQ2FsbHMgY29udGV4dF9zd2l0Y2hfY29tcGxldGUoKS4KKyAqLworaW50IGRybV9uZXdjdHgoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2N0eF90IGN0eDsKKworCWlmICggY29weV9mcm9tX3VzZXIoICZjdHgsIChkcm1fY3R4X3QgX191c2VyICopYXJnLCBzaXplb2YoY3R4KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlEUk1fREVCVUcoICIlZFxuIiwgY3R4LmhhbmRsZSApOworCWRybV9jb250ZXh0X3N3aXRjaF9jb21wbGV0ZSggZGV2LCBjdHguaGFuZGxlICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZW1vdmUgY29udGV4dC4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50IHBvaW50aW5nIHRvIGEgZHJtX2N0eCBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIElmIG5vdCB0aGUgc3BlY2lhbCBrZXJuZWwgY29udGV4dCwgY2FsbHMgY3R4Yml0bWFwX2ZyZWUoKSB0byBmcmVlIHRoZSBzcGVjaWZpZWQgY29udGV4dC4KKyAqLworaW50IGRybV9ybWN0eCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9jdHhfdCBjdHg7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmY3R4LCAoZHJtX2N0eF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGN0eCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJRFJNX0RFQlVHKCAiJWRcbiIsIGN0eC5oYW5kbGUgKTsKKwlpZiAoIGN0eC5oYW5kbGUgPT0gRFJNX0tFUk5FTF9DT05URVhUICsgMSApIHsKKwkJcHJpdi0+cmVtb3ZlX2F1dGhfb25fY2xvc2UgPSAxOworCX0KKwlpZiAoIGN0eC5oYW5kbGUgIT0gRFJNX0tFUk5FTF9DT05URVhUICkgeworCQlpZiAoZGV2LT5kcml2ZXItPmNvbnRleHRfZHRvcikKKwkJCWRldi0+ZHJpdmVyLT5jb250ZXh0X2R0b3IoZGV2LCBjdHguaGFuZGxlKTsKKwkJZHJtX2N0eGJpdG1hcF9mcmVlKCBkZXYsIGN0eC5oYW5kbGUgKTsKKwl9CisKKwlkb3duKCAmZGV2LT5jdHhsaXN0X3NlbSApOworCWlmICggIWxpc3RfZW1wdHkoICZkZXYtPmN0eGxpc3QtPmhlYWQgKSApIHsKKwkJZHJtX2N0eF9saXN0X3QgKnBvcywgKm47CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKCBwb3MsIG4sICZkZXYtPmN0eGxpc3QtPmhlYWQsIGhlYWQgKSB7CisJCQlpZiAoIHBvcy0+aGFuZGxlID09IGN0eC5oYW5kbGUgKSB7CisJCQkJbGlzdF9kZWwoICZwb3MtPmhlYWQgKTsKKwkJCQlkcm1fZnJlZSggcG9zLCBzaXplb2YoKnBvcyksIERSTV9NRU1fQ1RYTElTVCApOworCQkJCS0tZGV2LT5jdHhfY291bnQ7CisJCQl9CisJCX0KKwl9CisJdXAoICZkZXYtPmN0eGxpc3Rfc2VtICk7CisKKwlyZXR1cm4gMDsKK30KKworLypAfSovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvcmUuaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzk3YmI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fY29yZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNCBKb24gU21pcmwgPGpvbnNtaXJsQGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZJQSwgUzMgR1JBUEhJQ1MsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjZGVmaW5lIENPUkVfQVVUSE9SCQkiR2FyZXRoIEh1Z2hlcywgTGVpZiBEZWxnYXNzLCBKb3PDqSBGb25zZWNhLCBKb24gU21pcmwiCisKKyNkZWZpbmUgQ09SRV9OQU1FCQkiZHJtIgorI2RlZmluZSBDT1JFX0RFU0MJCSJEUk0gc2hhcmVkIGNvcmUgcm91dGluZXMiCisjZGVmaW5lIENPUkVfREFURQkJIjIwMDQwOTI1IgorCisjZGVmaW5lIERSTV9JRl9NQUpPUgkxCisjZGVmaW5lIERSTV9JRl9NSU5PUgkyCisKKyNkZWZpbmUgQ09SRV9NQUpPUgkxCisjZGVmaW5lIENPUkVfTUlOT1IJMAorI2RlZmluZSBDT1JFX1BBVENITEVWRUwgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTI4YzA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZG1hLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qKgorICogXGZpbGUgZHJtX2RtYS5oIAorICogRE1BIElPQ1RMIGFuZCBmdW5jdGlvbiBzdXBwb3J0CisgKgorICogXGF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqIFxhdXRob3IgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKy8qCisgKiBDcmVhdGVkOiBGcmkgTWFyIDE5IDE0OjMwOjE2IDE5OTkgYnkgZmFpdGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgRE1BIGRhdGEuCisgKiAKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGRybV9kZXZpY2VfZG1hIHN0cnVjdHVyZS4KKyAqLworaW50IGRybV9kbWFfc2V0dXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlpbnQgaTsKKworCWRldi0+ZG1hID0gZHJtX2FsbG9jKCBzaXplb2YoKmRldi0+ZG1hKSwgRFJNX01FTV9EUklWRVIgKTsKKwlpZiAoICFkZXYtPmRtYSApCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KCBkZXYtPmRtYSwgMCwgc2l6ZW9mKCpkZXYtPmRtYSkgKTsKKworCWZvciAoIGkgPSAwIDsgaSA8PSBEUk1fTUFYX09SREVSIDsgaSsrICkKKwkJbWVtc2V0KCZkZXYtPmRtYS0+YnVmc1tpXSwgMCwgc2l6ZW9mKGRldi0+ZG1hLT5idWZzWzBdKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBDbGVhbnVwIHRoZSBETUEgcmVzb3VyY2VzLgorICoKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KKyAqCisgKiBGcmVlIGFsbCBwYWdlcyBhc3NvY2lhdGVkIHdpdGggRE1BIGJ1ZmZlcnMsIHRoZSBidWZmZXJzIGFuZCBwYWdlcyBsaXN0cywgYW5kCisgKiBmaW5hbGx5IHRoZSB0aGUgZHJtX2RldmljZTo6ZG1hIHN0cnVjdHVyZSBpdHNlbGYuCisgKi8KK3ZvaWQgZHJtX2RtYV90YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICAqZG1hID0gZGV2LT5kbWE7CisJaW50CQkgIGksIGo7CisKKwlpZiAoIWRtYSkgcmV0dXJuOworCisJCQkJLyogQ2xlYXIgZG1hIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IERSTV9NQVhfT1JERVI7IGkrKykgeworCQlpZiAoZG1hLT5idWZzW2ldLnNlZ19jb3VudCkgeworCQkJRFJNX0RFQlVHKCJvcmRlciAlZDogYnVmX2NvdW50ID0gJWQsIgorCQkJCSAgIiBzZWdfY291bnQgPSAlZFxuIiwKKwkJCQkgIGksCisJCQkJICBkbWEtPmJ1ZnNbaV0uYnVmX2NvdW50LAorCQkJCSAgZG1hLT5idWZzW2ldLnNlZ19jb3VudCk7CisJCQlmb3IgKGogPSAwOyBqIDwgZG1hLT5idWZzW2ldLnNlZ19jb3VudDsgaisrKSB7CisJCQkJaWYgKGRtYS0+YnVmc1tpXS5zZWdsaXN0W2pdKSB7CisJCQkJCWRybV9mcmVlX3BhZ2VzKGRtYS0+YnVmc1tpXS5zZWdsaXN0W2pdLAorCQkJCQkJCWRtYS0+YnVmc1tpXS5wYWdlX29yZGVyLAorCQkJCQkJCURSTV9NRU1fRE1BKTsKKwkJCQl9CisJCQl9CisJCQlkcm1fZnJlZShkbWEtPmJ1ZnNbaV0uc2VnbGlzdCwKKwkJCQkgIGRtYS0+YnVmc1tpXS5zZWdfY291bnQKKwkJCQkgICogc2l6ZW9mKCpkbWEtPmJ1ZnNbMF0uc2VnbGlzdCksCisJCQkJICBEUk1fTUVNX1NFR1MpOworCQl9CisJICAgCWlmIChkbWEtPmJ1ZnNbaV0uYnVmX2NvdW50KSB7CisJCSAgIAlmb3IgKGogPSAwOyBqIDwgZG1hLT5idWZzW2ldLmJ1Zl9jb3VudDsgaisrKSB7CisJCQkJaWYgKGRtYS0+YnVmc1tpXS5idWZsaXN0W2pdLmRldl9wcml2YXRlKSB7CisJCQkJCWRybV9mcmVlKGRtYS0+YnVmc1tpXS5idWZsaXN0W2pdLmRldl9wcml2YXRlLAorCQkJCQkJICBkbWEtPmJ1ZnNbaV0uYnVmbGlzdFtqXS5kZXZfcHJpdl9zaXplLAorCQkJCQkJICBEUk1fTUVNX0JVRlMpOworCQkJCX0KKwkJCX0KKwkJICAgCWRybV9mcmVlKGRtYS0+YnVmc1tpXS5idWZsaXN0LAorCQkJCSAgZG1hLT5idWZzW2ldLmJ1Zl9jb3VudCAqCisJCQkJICBzaXplb2YoKmRtYS0+YnVmc1swXS5idWZsaXN0KSwKKwkJCQkgIERSTV9NRU1fQlVGUyk7CisJCX0KKwl9CisKKwlpZiAoZG1hLT5idWZsaXN0KSB7CisJCWRybV9mcmVlKGRtYS0+YnVmbGlzdCwKKwkJCSAgZG1hLT5idWZfY291bnQgKiBzaXplb2YoKmRtYS0+YnVmbGlzdCksCisJCQkgIERSTV9NRU1fQlVGUyk7CisJfQorCisJaWYgKGRtYS0+cGFnZWxpc3QpIHsKKwkJZHJtX2ZyZWUoZG1hLT5wYWdlbGlzdCwKKwkJCSAgZG1hLT5wYWdlX2NvdW50ICogc2l6ZW9mKCpkbWEtPnBhZ2VsaXN0KSwKKwkJCSAgRFJNX01FTV9QQUdFUyk7CisJfQorCWRybV9mcmVlKGRldi0+ZG1hLCBzaXplb2YoKmRldi0+ZG1hKSwgRFJNX01FTV9EUklWRVIpOworCWRldi0+ZG1hID0gTlVMTDsKK30KKworCisvKioKKyAqIEZyZWUgYSBidWZmZXIuCisgKgorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIGJ1ZiBidWZmZXIgdG8gZnJlZS4KKyAqIAorICogUmVzZXRzIHRoZSBmaWVsZHMgb2YgXHAgYnVmLgorICovCit2b2lkIGRybV9mcmVlX2J1ZmZlcihkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2J1Zl90ICpidWYpCit7CisJaWYgKCFidWYpIHJldHVybjsKKworCWJ1Zi0+d2FpdGluZyAgPSAwOworCWJ1Zi0+cGVuZGluZyAgPSAwOworCWJ1Zi0+ZmlscCAgICAgPSBOVUxMOworCWJ1Zi0+dXNlZCAgICAgPSAwOworCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfRE1BX1FVRVVFKSAmJiB3YWl0cXVldWVfYWN0aXZlKCZidWYtPmRtYV93YWl0KSkgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmJ1Zi0+ZG1hX3dhaXQpOworCX0KK30KKworLyoqCisgKiBSZWNsYWltIHRoZSBidWZmZXJzLgorICoKKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqCisgKiBGcmVlcyBlYWNoIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggXHAgZmlscCBub3QgYWxyZWFkeSBvbiB0aGUgaGFyZHdhcmUuCisgKi8KK3ZvaWQgZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlpbnQJCSBpOworCisJaWYgKCFkbWEpIHJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgeworCQlpZiAoZG1hLT5idWZsaXN0W2ldLT5maWxwID09IGZpbHApIHsKKwkJCXN3aXRjaCAoZG1hLT5idWZsaXN0W2ldLT5saXN0KSB7CisJCQljYXNlIERSTV9MSVNUX05PTkU6CisJCQkJZHJtX2ZyZWVfYnVmZmVyKGRldiwgZG1hLT5idWZsaXN0W2ldKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRFJNX0xJU1RfV0FJVDoKKwkJCQlkbWEtPmJ1Zmxpc3RbaV0tPmxpc3QgPSBEUk1fTElTVF9SRUNMQUlNOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBCdWZmZXIgYWxyZWFkeSBvbiBoYXJkd2FyZS4gKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0woZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJhd2FibGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RyYXdhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlOGU0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RyYXdhYmxlLmMKQEAgLTAsMCArMSw1NiBAQAorLyoqCisgKiBcZmlsZSBkcm1fZHJhd2FibGUuaCAKKyAqIElPQ1RMcyBmb3IgZHJhd2FibGVzCisgKgorICogXGF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqIFxhdXRob3IgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKy8qCisgKiBDcmVhdGVkOiBUdWUgRmViICAyIDA4OjM3OjU0IDE5OTkgYnkgZmFpdGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisKKy8qKiBOby1vcC4gKi8KK2ludCBkcm1fYWRkZHJhdyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9kcmF3X3QgZHJhdzsKKworCWRyYXcuaGFuZGxlID0gMDsJLyogTk9PUCAqLworCURSTV9ERUJVRygiJWRcbiIsIGRyYXcuaGFuZGxlKTsKKwlpZiAoY29weV90b191c2VyKChkcm1fZHJhd190IF9fdXNlciAqKWFyZywgJmRyYXcsIHNpemVvZihkcmF3KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKiogTm8tb3AuICovCitpbnQgZHJtX3JtZHJhdyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIDA7CQkvKiBOT09QICovCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzdlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYwpAQCAtMCwwICsxLDUzMSBAQAorLyoqCisgKiBcZmlsZSBkcm1fZHJ2LmggCisgKiBHZW5lcmljIGRyaXZlciB0ZW1wbGF0ZQorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqCisgKiBUbyB1c2UgdGhpcyB0ZW1wbGF0ZSwgeW91IG11c3QgYXQgbGVhc3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcgKHNhbXBsZXMKKyAqIGdpdmVuIGZvciB0aGUgTUdBIGRyaXZlcik6CisgKgorICogXGNvZGUKKyAqICNkZWZpbmUgRFJJVkVSX0FVVEhPUgkiVkEgTGludXggU3lzdGVtcywgSW5jLiIKKyAqCisgKiAjZGVmaW5lIERSSVZFUl9OQU1FCQkibWdhIgorICogI2RlZmluZSBEUklWRVJfREVTQwkJIk1hdHJveCBHMjAwL0c0MDAiCisgKiAjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwMDExMjciCisgKgorICogI2RlZmluZSBEUklWRVJfSU9DVExfQ09VTlQJRFJNX0FSUkFZX1NJWkUoIG1nYV9pb2N0bHMgKQorICoKKyAqICNkZWZpbmUgZHJtX3gJCW1nYV8jI3gKKyAqIFxlbmRjb2RlCisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IFRodSBOb3YgMjMgMDM6MTA6NTAgMjAwMCBieSBnYXJldGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2NvcmUuaCIKKworLyoqIElvY3RsIHRhYmxlICovCitkcm1faW9jdGxfZGVzY190CQkgIGRybV9pb2N0bHNbXSA9IHsKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9WRVJTSU9OKV0gICAgICAgPSB7IGRybV92ZXJzaW9uLCAgICAgMCwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9VTklRVUUpXSAgICA9IHsgZHJtX2dldHVuaXF1ZSwgICAwLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX01BR0lDKV0gICAgID0geyBkcm1fZ2V0bWFnaWMsICAgIDAsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9JUlFfQlVTSUQpXSAgICAgPSB7IGRybV9pcnFfYnlfYnVzaWQsIDAsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfTUFQKV0gICAgICAgPSB7IGRybV9nZXRtYXAsICAgICAgMCwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9DTElFTlQpXSAgICA9IHsgZHJtX2dldGNsaWVudCwgICAwLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX1NUQVRTKV0gICAgID0geyBkcm1fZ2V0c3RhdHMsICAgIDAsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TRVRfVkVSU0lPTildICAgPSB7IGRybV9zZXR2ZXJzaW9uLCAgMCwgMSB9LAorCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU0VUX1VOSVFVRSldICAgID0geyBkcm1fc2V0dW5pcXVlLCAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9CTE9DSyldICAgICAgICAgPSB7IGRybV9ub29wLCAgICAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1VOQkxPQ0spXSAgICAgICA9IHsgZHJtX25vb3AsICAgICAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQVVUSF9NQUdJQyldICAgID0geyBkcm1fYXV0aG1hZ2ljLCAgIDEsIDEgfSwKKworCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FERF9NQVApXSAgICAgICA9IHsgZHJtX2FkZG1hcCwgICAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfUk1fTUFQKV0gICAgICAgID0geyBkcm1fcm1tYXAsICAgICAgIDEsIDAgfSwKKworCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NFVF9TQVJFQV9DVFgpXSA9IHsgZHJtX3NldHNhcmVhY3R4LCAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX1NBUkVBX0NUWCldID0geyBkcm1fZ2V0c2FyZWFjdHgsIDEsIDAgfSwKKworCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FERF9DVFgpXSAgICAgICA9IHsgZHJtX2FkZGN0eCwgICAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfUk1fQ1RYKV0gICAgICAgID0geyBkcm1fcm1jdHgsICAgICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9NT0RfQ1RYKV0gICAgICAgPSB7IGRybV9tb2RjdHgsICAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9DVFgpXSAgICAgICA9IHsgZHJtX2dldGN0eCwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU1dJVENIX0NUWCldICAgID0geyBkcm1fc3dpdGNoY3R4LCAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9ORVdfQ1RYKV0gICAgICAgPSB7IGRybV9uZXdjdHgsICAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JFU19DVFgpXSAgICAgICA9IHsgZHJtX3Jlc2N0eCwgICAgICAxLCAwIH0sCisKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BRERfRFJBVyldICAgICAgPSB7IGRybV9hZGRkcmF3LCAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JNX0RSQVcpXSAgICAgICA9IHsgZHJtX3JtZHJhdywgICAgICAxLCAxIH0sCisKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9MT0NLKV0JICAgICAgICA9IHsgZHJtX2xvY2ssICAgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfVU5MT0NLKV0gICAgICAgID0geyBkcm1fdW5sb2NrLCAgICAgIDEsIDAgfSwKKworCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0ZJTklTSCldICAgICAgICA9IHsgZHJtX25vb3AsICAgICAgMSwgMCB9LAorCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUREX0JVRlMpXSAgICAgID0geyBkcm1fYWRkYnVmcywgICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9NQVJLX0JVRlMpXSAgICAgPSB7IGRybV9tYXJrYnVmcywgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0lORk9fQlVGUyldICAgICA9IHsgZHJtX2luZm9idWZzLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTUFQX0JVRlMpXSAgICAgID0geyBkcm1fbWFwYnVmcywgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9GUkVFX0JVRlMpXSAgICAgPSB7IGRybV9mcmVlYnVmcywgICAgMSwgMCB9LAorCS8qIFRoZSBEUk1fSU9DVExfRE1BIGlvY3RsIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHRoZSBkcml2ZXIuICovCisKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9DT05UUk9MKV0gICAgICAgPSB7IGRybV9jb250cm9sLCAgICAgMSwgMSB9LAorCisjaWYgX19PU19IQVNfQUdQCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0FDUVVJUkUpXSAgID0geyBkcm1fYWdwX2FjcXVpcmUsIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfUkVMRUFTRSldICAgPSB7IGRybV9hZ3BfcmVsZWFzZSwgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9FTkFCTEUpXSAgICA9IHsgZHJtX2FncF9lbmFibGUsICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0lORk8pXSAgICAgID0geyBkcm1fYWdwX2luZm8sICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfQUxMT0MpXSAgICAgPSB7IGRybV9hZ3BfYWxsb2MsICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9GUkVFKV0gICAgICA9IHsgZHJtX2FncF9mcmVlLCAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0JJTkQpXSAgICAgID0geyBkcm1fYWdwX2JpbmQsICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfVU5CSU5EKV0gICAgPSB7IGRybV9hZ3BfdW5iaW5kLCAgMSwgMSB9LAorI2VuZGlmCisKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TR19BTExPQyldICAgICAgPSB7IGRybV9zZ19hbGxvYywgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NHX0ZSRUUpXSAgICAgICA9IHsgZHJtX3NnX2ZyZWUsICAgICAxLCAxIH0sCisKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9XQUlUX1ZCTEFOSyldICAgPSB7IGRybV93YWl0X3ZibGFuaywgMCwgMCB9LAorfTsKKworI2RlZmluZSBEUklWRVJfSU9DVExfQ09VTlQJRFJNX0FSUkFZX1NJWkUoIGRybV9pb2N0bHMgKQorCisvKioKKyAqIFRha2UgZG93biB0aGUgRFJNIGRldmljZS4KKyAqCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqIEZyZWVzIGV2ZXJ5IHJlc291cmNlIGluIFxwIGRldi4KKyAqCisgKiBcc2EgZHJtX2RldmljZSBhbmQgc2V0dXAoKS4KKyAqLworaW50IGRybV90YWtlZG93biggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9tYWdpY19lbnRyeV90ICpwdCwgKm5leHQ7CisJZHJtX21hcF90ICptYXA7CisJZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqbGlzdF9uZXh0OworCWRybV92bWFfZW50cnlfdCAqdm1hLCAqdm1hX25leHQ7CisJaW50IGk7CisKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWlmIChkZXYtPmRyaXZlci0+cHJldGFrZWRvd24pCisJICBkZXYtPmRyaXZlci0+cHJldGFrZWRvd24oZGV2KTsKKworCWlmIChkZXYtPnVuaXF1ZSkgeworCQlkcm1fZnJlZShkZXYtPnVuaXF1ZSwgc3RybGVuKGRldi0+dW5pcXVlKSArIDEsIERSTV9NRU1fRFJJVkVSKTsKKwkJZGV2LT51bmlxdWUgPSBOVUxMOworCQlkZXYtPnVuaXF1ZV9sZW4gPSAwOworCX0KKworCWlmICggZGV2LT5pcnFfZW5hYmxlZCApIGRybV9pcnFfdW5pbnN0YWxsKCBkZXYgKTsKKworCWRvd24oICZkZXYtPnN0cnVjdF9zZW0gKTsKKwlkZWxfdGltZXIoICZkZXYtPnRpbWVyICk7CisKKwkJCQkvKiBDbGVhciBwaWQgbGlzdCAqLworCWZvciAoIGkgPSAwIDsgaSA8IERSTV9IQVNIX1NJWkUgOyBpKysgKSB7CisJCWZvciAoIHB0ID0gZGV2LT5tYWdpY2xpc3RbaV0uaGVhZCA7IHB0IDsgcHQgPSBuZXh0ICkgeworCQkJbmV4dCA9IHB0LT5uZXh0OworCQkJZHJtX2ZyZWUoIHB0LCBzaXplb2YoKnB0KSwgRFJNX01FTV9NQUdJQyApOworCQl9CisJCWRldi0+bWFnaWNsaXN0W2ldLmhlYWQgPSBkZXYtPm1hZ2ljbGlzdFtpXS50YWlsID0gTlVMTDsKKwl9CisKKwkJCQkvKiBDbGVhciBBR1AgaW5mb3JtYXRpb24gKi8KKwlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwKSB7CisJCWRybV9hZ3BfbWVtX3QgKmVudHJ5OworCQlkcm1fYWdwX21lbV90ICpuZXh0ZTsKKworCQkJCS8qIFJlbW92ZSBBR1AgcmVzb3VyY2VzLCBidXQgbGVhdmUgZGV2LT5hZ3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50YWN0IHVudGlsIGRydl9jbGVhbnVwIGlzIGNhbGxlZC4gKi8KKwkJZm9yICggZW50cnkgPSBkZXYtPmFncC0+bWVtb3J5IDsgZW50cnkgOyBlbnRyeSA9IG5leHRlICkgeworCQkJbmV4dGUgPSBlbnRyeS0+bmV4dDsKKwkJCWlmICggZW50cnktPmJvdW5kICkgZHJtX3VuYmluZF9hZ3AoIGVudHJ5LT5tZW1vcnkgKTsKKwkJCWRybV9mcmVlX2FncCggZW50cnktPm1lbW9yeSwgZW50cnktPnBhZ2VzICk7CisJCQlkcm1fZnJlZSggZW50cnksIHNpemVvZigqZW50cnkpLCBEUk1fTUVNX0FHUExJU1RTICk7CisJCX0KKwkJZGV2LT5hZ3AtPm1lbW9yeSA9IE5VTEw7CisKKwkJaWYgKCBkZXYtPmFncC0+YWNxdWlyZWQgKSBkcm1fYWdwX2RvX3JlbGVhc2UoZGV2KTsKKworCQlkZXYtPmFncC0+YWNxdWlyZWQgPSAwOworCQlkZXYtPmFncC0+ZW5hYmxlZCAgPSAwOworCX0KKworCQkJCS8qIENsZWFyIHZtYSBsaXN0IChvbmx5IGJ1aWx0IGZvciBkZWJ1Z2dpbmcpICovCisJaWYgKCBkZXYtPnZtYWxpc3QgKSB7CisJCWZvciAoIHZtYSA9IGRldi0+dm1hbGlzdCA7IHZtYSA7IHZtYSA9IHZtYV9uZXh0ICkgeworCQkJdm1hX25leHQgPSB2bWEtPm5leHQ7CisJCQlkcm1fZnJlZSggdm1hLCBzaXplb2YoKnZtYSksIERSTV9NRU1fVk1BUyApOworCQl9CisJCWRldi0+dm1hbGlzdCA9IE5VTEw7CisJfQorCisJaWYoIGRldi0+bWFwbGlzdCApIHsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKCBsaXN0LCBsaXN0X25leHQsICZkZXYtPm1hcGxpc3QtPmhlYWQgKSB7CisJCQlyX2xpc3QgPSAoZHJtX21hcF9saXN0X3QgKilsaXN0OworCisJCQlpZiAoICggbWFwID0gcl9saXN0LT5tYXAgKSApIHsKKwkJCQlzd2l0Y2ggKCBtYXAtPnR5cGUgKSB7CisJCQkJY2FzZSBfRFJNX1JFR0lTVEVSUzoKKwkJCQljYXNlIF9EUk1fRlJBTUVfQlVGRkVSOgorCQkJCQlpZiAoZHJtX2NvcmVfaGFzX01UUlIoZGV2KSkgeworCQkJCQkJaWYgKCBtYXAtPm10cnIgPj0gMCApIHsKKwkJCQkJCQlpbnQgcmV0Y29kZTsKKwkJCQkJCQlyZXRjb2RlID0gbXRycl9kZWwoIG1hcC0+bXRyciwKKwkJCQkJCQkJCSAgICBtYXAtPm9mZnNldCwKKwkJCQkJCQkJCSAgICBtYXAtPnNpemUgKTsKKwkJCQkJCQlEUk1fREVCVUcoICJtdHJyX2RlbD0lZFxuIiwgcmV0Y29kZSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWRybV9pb3JlbWFwZnJlZSggbWFwLT5oYW5kbGUsIG1hcC0+c2l6ZSwgZGV2ICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgX0RSTV9TSE06CisJCQkJCXZmcmVlKG1hcC0+aGFuZGxlKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIF9EUk1fQUdQOgorCQkJCQkvKiBEbyBub3RoaW5nIGhlcmUsIGJlY2F1c2UgdGhpcyBpcyBhbGwKKwkJCQkJICogaGFuZGxlZCBpbiB0aGUgQUdQL0dBUlQgZHJpdmVyLgorCQkJCQkgKi8KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBfRFJNX1NDQVRURVJfR0FUSEVSOgorCQkJCQkvKiBIYW5kbGUgaXQgKi8KKwkJCQkJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfU0cpICYmIGRldi0+c2cpIHsKKwkJCQkJCWRybV9zZ19jbGVhbnVwKGRldi0+c2cpOworCQkJCQkJZGV2LT5zZyA9IE5VTEw7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWRybV9mcmVlKG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMpOworCQkJfQorCQkJbGlzdF9kZWwoIGxpc3QgKTsKKwkJCWRybV9mcmVlKHJfbGlzdCwgc2l6ZW9mKCpyX2xpc3QpLCBEUk1fTUVNX01BUFMpOworIAkJfQorCQlkcm1fZnJlZShkZXYtPm1hcGxpc3QsIHNpemVvZigqZGV2LT5tYXBsaXN0KSwgRFJNX01FTV9NQVBTKTsKKwkJZGV2LT5tYXBsaXN0ID0gTlVMTDsKKyAJfQorCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfRE1BX1FVRVVFKSAmJiBkZXYtPnF1ZXVlbGlzdCApIHsKKwkJZm9yICggaSA9IDAgOyBpIDwgZGV2LT5xdWV1ZV9jb3VudCA7IGkrKyApIHsKKwkJCWlmICggZGV2LT5xdWV1ZWxpc3RbaV0gKSB7CisJCQkJZHJtX2ZyZWUoIGRldi0+cXVldWVsaXN0W2ldLAorCQkJCQkgIHNpemVvZigqZGV2LT5xdWV1ZWxpc3RbMF0pLAorCQkJCQkgIERSTV9NRU1fUVVFVUVTICk7CisJCQkJZGV2LT5xdWV1ZWxpc3RbaV0gPSBOVUxMOworCQkJfQorCQl9CisJCWRybV9mcmVlKCBkZXYtPnF1ZXVlbGlzdCwKKwkJCSAgZGV2LT5xdWV1ZV9zbG90cyAqIHNpemVvZigqZGV2LT5xdWV1ZWxpc3QpLAorCQkJICBEUk1fTUVNX1FVRVVFUyApOworCQlkZXYtPnF1ZXVlbGlzdCA9IE5VTEw7CisJfQorCWRldi0+cXVldWVfY291bnQgPSAwOworCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpKQorCQlkcm1fZG1hX3Rha2Vkb3duKCBkZXYgKTsKKworCWlmICggZGV2LT5sb2NrLmh3X2xvY2sgKSB7CisJCWRldi0+c2lnZGF0YS5sb2NrID0gZGV2LT5sb2NrLmh3X2xvY2sgPSBOVUxMOyAvKiBTSE0gcmVtb3ZlZCAqLworCQlkZXYtPmxvY2suZmlscCA9IE5VTEw7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSggJmRldi0+bG9jay5sb2NrX3F1ZXVlICk7CisJfQorCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uLiBDYWxsZWQgdmlhIGluaXRfbW9kdWxlIGF0IG1vZHVsZSBsb2FkIHRpbWUsIG9yIHZpYQorICogbGludXgvaW5pdC9tYWluLmMgKHRoaXMgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQpLgorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgb2YgZHJtX2RldmljZSBzdHJ1Y3R1cmVzLCBhbmQgYXR0ZW1wdHMgdG8KKyAqIGluaXRpYWxpemUgYWxsIGF2YWlsYWJsZSBkZXZpY2VzLCB1c2luZyBjb25zZWN1dGl2ZSBtaW5vcnMsIHJlZ2lzdGVyaW5nIHRoZQorICogc3R1YnMgYW5kIGluaXRpYWxpemluZyB0aGUgQUdQIGRldmljZS4KKyAqIAorICogRXhwYW5kcyB0aGUgXGMgRFJJVkVSX1BSRUlOSVQgYW5kIFxjIERSSVZFUl9QT1NUX0lOSVQgbWFjcm9zIGJlZm9yZSBhbmQKKyAqIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBmb3IgZHJpdmVyIGN1c3RvbWl6YXRpb24uCisgKi8KK2ludCBkcm1faW5pdCggc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlciApCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCXN0cnVjdCBwY2lfZGV2aWNlX2lkICpwaWQ7CisJaW50IGk7CisKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWRybV9tZW1faW5pdCgpOworCisJZm9yIChpPTA7IGRyaXZlci0+cGNpX2RyaXZlci5pZF90YWJsZVtpXS52ZW5kb3IgIT0gMDsgaSsrKSB7CisJCXBpZCA9IChzdHJ1Y3QgcGNpX2RldmljZV9pZCAqKSZkcml2ZXItPnBjaV9kcml2ZXIuaWRfdGFibGVbaV07CisJCQorCQlwZGV2PU5VTEw7CisJCS8qIHBhc3MgYmFjayBpbiBwZGV2IHRvIGFjY291bnQgZm9yIG11bHRpcGxlIGlkZW50aWNhbCBjYXJkcyAqLwkJCisJCXdoaWxlICgocGRldiA9IHBjaV9nZXRfc3Vic3lzKHBpZC0+dmVuZG9yLCBwaWQtPmRldmljZSwgcGlkLT5zdWJ2ZW5kb3IsIHBpZC0+c3ViZGV2aWNlLCBwZGV2KSkgIT0gTlVMTCkgeworCQkJLyogc3RlYWx0aCBtb2RlIHJlcXVpcmVzIGEgbWFudWFsIHByb2JlICovCisJCQlwY2lfZGV2X2dldChwZGV2KTsKKwkJCWRybV9nZXRfZGV2KHBkZXYsIHBpZCwgZHJpdmVyKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2luaXQpOworCisvKioKKyAqIENhbGxlZCB2aWEgY2xlYW51cF9tb2R1bGUoKSBhdCBtb2R1bGUgdW5sb2FkIHRpbWUuCisgKgorICogQ2xlYW5zIHVwIGFsbCBEUk0gZGV2aWNlLCBjYWxsaW5nIHRha2Vkb3duKCkuCisgKiAKKyAqIFxzYSBkcm1faW5pdCgpLgorICovCitzdGF0aWMgdm9pZCBkcm1fY2xlYW51cCggZHJtX2RldmljZV90ICpkZXYgKQoreworCURSTV9ERUJVRyggIlxuIiApOworCisJaWYgKCFkZXYpIHsKKwkJRFJNX0VSUk9SKCJjbGVhbnVwIGNhbGxlZCBubyBkZXZcbiIpOworCQlyZXR1cm47CisJfQorCisJZHJtX3Rha2Vkb3duKCBkZXYgKTsJCisKKwlkcm1fY3R4Yml0bWFwX2NsZWFudXAoIGRldiApOworCQorCWlmIChkcm1fY29yZV9oYXNfTVRSUihkZXYpICYmIGRybV9jb3JlX2hhc19BR1AoZGV2KSAmJgorCSAgICBkZXYtPmFncCAmJiBkZXYtPmFncC0+YWdwX210cnIgPj0gMCkgeworCQlpbnQgcmV0dmFsOworCQlyZXR2YWwgPSBtdHJyX2RlbCggZGV2LT5hZ3AtPmFncF9tdHJyLAorCQkJCSAgIGRldi0+YWdwLT5hZ3BfaW5mby5hcGVyX2Jhc2UsCisJCQkJICAgZGV2LT5hZ3AtPmFncF9pbmZvLmFwZXJfc2l6ZSoxMDI0KjEwMjQgKTsKKwkJRFJNX0RFQlVHKCAibXRycl9kZWw9JWRcbiIsIHJldHZhbCApOworCX0KKwkKKwlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwICkgeworCQlkcm1fZnJlZSggZGV2LT5hZ3AsIHNpemVvZigqZGV2LT5hZ3ApLCBEUk1fTUVNX0FHUExJU1RTICk7CisJCWRldi0+YWdwID0gTlVMTDsKKwl9CisKKwlpZiAoZGV2LT5kcml2ZXItPnBvc3RjbGVhbnVwKQorCQlkZXYtPmRyaXZlci0+cG9zdGNsZWFudXAoZGV2KTsKKwkKKwlkcm1fcHV0X2hlYWQoJmRldi0+cHJpbWFyeSk7CisJaWYgKCBkcm1fcHV0X2RldihkZXYpICkKKwkJRFJNX0VSUk9SKCAiQ2Fubm90IHVubG9hZCBtb2R1bGVcbiIgKTsKK30KKwordm9pZCBkcm1fZXhpdCAoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcikKK3sKKwlpbnQgaTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IE5VTEw7CisJZHJtX2hlYWRfdCAqaGVhZDsKKwkKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWZvciAoaSA9IDA7IGkgPCBkcm1fY2FyZHNfbGltaXQ7IGkrKykgeworCQloZWFkID0gZHJtX2hlYWRzW2ldOworCQlpZiAoIWhlYWQpCisJCQljb250aW51ZTsKKwkJaWYgKCFoZWFkLT5kZXYpCisJCQljb250aW51ZTsKKwkJaWYgKGhlYWQtPmRldi0+ZHJpdmVyIT1kcml2ZXIpCisJCQljb250aW51ZTsKKwkJZGV2PWhlYWQtPmRldjsKKwl9CisJaWYgKGRldikgeworCQkvKiByZWxlYXNlIHRoZSBwY2kgZHJpdmVyICovCisJCWlmIChkZXYtPnBkZXYpCisJCQlwY2lfZGV2X3B1dChkZXYtPnBkZXYpOworCQlkcm1fY2xlYW51cChkZXYpOworCX0KKwlEUk1fSU5GTyggIk1vZHVsZSB1bmxvYWRlZFxuIiApOworfQorRVhQT1JUX1NZTUJPTChkcm1fZXhpdCk7CisKKy8qKiBGaWxlIG9wZXJhdGlvbnMgc3RydWN0dXJlICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkcm1fc3R1Yl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuICA9IGRybV9zdHViX29wZW4KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRybV9jb3JlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwkKKwlkcm1fY2FyZHNfbGltaXQgPSAoZHJtX2NhcmRzX2xpbWl0IDwgRFJNX01BWF9NSU5PUiArIDEgPyBkcm1fY2FyZHNfbGltaXQgOiBEUk1fTUFYX01JTk9SICsgMSk7CisJZHJtX2hlYWRzID0gZHJtX2NhbGxvYyhkcm1fY2FyZHNfbGltaXQsCisJCQkJc2l6ZW9mKCpkcm1faGVhZHMpLCBEUk1fTUVNX1NUVUIpOworCWlmKCFkcm1faGVhZHMpIAorCQlnb3RvIGVycl9wMTsKKwkKKwlpZiAocmVnaXN0ZXJfY2hyZGV2KERSTV9NQUpPUiwgImRybSIsICZkcm1fc3R1Yl9mb3BzKSkKKwkJZ290byBlcnJfcDE7CisJCisJZHJtX2NsYXNzID0gZHJtX3N5c2ZzX2NyZWF0ZShUSElTX01PRFVMRSwgImRybSIpOworCWlmIChJU19FUlIoZHJtX2NsYXNzKSkgeworCQlwcmludGsgKEtFUk5fRVJSICJEUk06IEVycm9yIGNyZWF0aW5nIGRybSBjbGFzcy5cbiIpOworCQlyZXQgPSBQVFJfRVJSKGRybV9jbGFzcyk7CisJCWdvdG8gZXJyX3AyOworCX0KKworCWRybV9wcm9jX3Jvb3QgPSBjcmVhdGVfcHJvY19lbnRyeSgiZHJpIiwgU19JRkRJUiwgTlVMTCk7CisJaWYgKCFkcm1fcHJvY19yb290KSB7CisJCURSTV9FUlJPUigiQ2Fubm90IGNyZWF0ZSAvcHJvYy9kcmlcbiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBlcnJfcDM7CisJfQorCQkKKwlEUk1fSU5GTyggIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzXG4iLAorCQlDT1JFX05BTUUsIENPUkVfTUFKT1IsIENPUkVfTUlOT1IsIENPUkVfUEFUQ0hMRVZFTCwKKwkJQ09SRV9EQVRFKTsKKwlyZXR1cm4gMDsKK2Vycl9wMzoKKwlkcm1fc3lzZnNfZGVzdHJveShkcm1fY2xhc3MpOworZXJyX3AyOgorCXVucmVnaXN0ZXJfY2hyZGV2KERSTV9NQUpPUiwgImRybSIpOworCWRybV9mcmVlKGRybV9oZWFkcywgc2l6ZW9mKCpkcm1faGVhZHMpICogZHJtX2NhcmRzX2xpbWl0LCBEUk1fTUVNX1NUVUIpOworZXJyX3AxOgkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJtX2NvcmVfZXhpdCAodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiZHJpIiwgTlVMTCk7CisJZHJtX3N5c2ZzX2Rlc3Ryb3koZHJtX2NsYXNzKTsKKworCXVucmVnaXN0ZXJfY2hyZGV2KERSTV9NQUpPUiwgImRybSIpOworCisJZHJtX2ZyZWUoZHJtX2hlYWRzLCBzaXplb2YoKmRybV9oZWFkcykgKgorCQkJCWRybV9jYXJkc19saW1pdCwgRFJNX01FTV9TVFVCKTsKK30KKworCittb2R1bGVfaW5pdCggZHJtX2NvcmVfaW5pdCApOworbW9kdWxlX2V4aXQoIGRybV9jb3JlX2V4aXQgKTsKKworCisvKioKKyAqIEdldCB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fdmVyc2lvbiBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBGaWxscyBpbiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiBccCBhcmcuCisgKi8KK2ludCBkcm1fdmVyc2lvbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX3ZlcnNpb25fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX3ZlcnNpb25fdCB2ZXJzaW9uOworCWludCByZXQ7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmdmVyc2lvbiwgYXJncCwgc2l6ZW9mKHZlcnNpb24pICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIHZlcnNpb24gaXMgYSByZXF1aXJlZCBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHBlcnNvbmFsaXR5IG1vZHVsZSB2ZXJzaW9uICovCisJaWYgKChyZXQgPSBkZXYtPmRyaXZlci0+dmVyc2lvbigmdmVyc2lvbikpKQorCQlyZXR1cm4gcmV0OworCQkKKwlpZiAoIGNvcHlfdG9fdXNlciggYXJncCwgJnZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKworCisvKiogCisgKiBDYWxsZWQgd2hlbmV2ZXIgYSBwcm9jZXNzIHBlcmZvcm1zIGFuIGlvY3RsIG9uIC9kZXYvZHJtLgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBMb29rcyB1cCB0aGUgaW9jdGwgZnVuY3Rpb24gaW4gdGhlIDo6aW9jdGxzIHRhYmxlLCBjaGVja2luZyBmb3Igcm9vdAorICogcHJldmlsZWdlcyBpZiBzbyByZXF1aXJlZCwgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIHJlc3BlY3RpdmUgZnVuY3Rpb24uCisgKi8KK2ludCBkcm1faW9jdGwoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faW9jdGxfZGVzY190ICppb2N0bDsKKwlkcm1faW9jdGxfdCAqZnVuYzsKKwl1bnNpZ25lZCBpbnQgbnIgPSBEUk1fSU9DVExfTlIoY21kKTsKKwlpbnQgcmV0Y29kZSA9IC1FSU5WQUw7CisKKwlhdG9taWNfaW5jKCAmZGV2LT5pb2N0bF9jb3VudCApOworCWF0b21pY19pbmMoICZkZXYtPmNvdW50c1tfRFJNX1NUQVRfSU9DVExTXSApOworCSsrcHJpdi0+aW9jdGxfY291bnQ7CisKKwlEUk1fREVCVUcoICJwaWQ9JWQsIGNtZD0weCUwMngsIG5yPTB4JTAyeCwgZGV2IDB4JWx4LCBhdXRoPSVkXG4iLAorCQkgICBjdXJyZW50LT5waWQsIGNtZCwgbnIsIChsb25nKW9sZF9lbmNvZGVfZGV2KHByaXYtPmhlYWQtPmRldmljZSksIAorCQkgICBwcml2LT5hdXRoZW50aWNhdGVkICk7CisJCisJaWYgKG5yIDwgRFJJVkVSX0lPQ1RMX0NPVU5UKQorCQlpb2N0bCA9ICZkcm1faW9jdGxzW25yXTsKKwllbHNlIGlmICgobnIgPj0gRFJNX0NPTU1BTkRfQkFTRSkgJiYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSArIGRldi0+ZHJpdmVyLT5udW1faW9jdGxzKSkKKwkJaW9jdGwgPSAmZGV2LT5kcml2ZXItPmlvY3Rsc1tuciAtIERSTV9DT01NQU5EX0JBU0VdOworCWVsc2UKKwkJZ290byBlcnJfaTE7CisJCisJZnVuYyA9IGlvY3RsLT5mdW5jOworCS8qIGlzIHRoZXJlIGEgbG9jYWwgb3ZlcnJpZGU/ICovCisJaWYgKChuciA9PSBEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0RNQSkpICYmIGRldi0+ZHJpdmVyLT5kbWFfaW9jdGwpCisJCWZ1bmMgPSBkZXYtPmRyaXZlci0+ZG1hX2lvY3RsOworCQorCWlmICggIWZ1bmMgKSB7CisJCURSTV9ERUJVRyggIm5vIGZ1bmN0aW9uXG4iICk7CisJCXJldGNvZGUgPSAtRUlOVkFMOworCX0gZWxzZSBpZiAoICggaW9jdGwtPnJvb3Rfb25seSAmJiAhY2FwYWJsZSggQ0FQX1NZU19BRE1JTiApICl8fAorCQkgICAgKCBpb2N0bC0+YXV0aF9uZWVkZWQgJiYgIXByaXYtPmF1dGhlbnRpY2F0ZWQgKSApIHsKKwkJcmV0Y29kZSA9IC1FQUNDRVM7CisJfSBlbHNlIHsKKwkJcmV0Y29kZSA9IGZ1bmMoIGlub2RlLCBmaWxwLCBjbWQsIGFyZyApOworCX0KKwkKK2Vycl9pMToKKwlhdG9taWNfZGVjKCAmZGV2LT5pb2N0bF9jb3VudCApOworCWlmIChyZXRjb2RlKSBEUk1fREVCVUcoICJyZXQgPSAleFxuIiwgcmV0Y29kZSk7CisJcmV0dXJuIHJldGNvZGU7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9pb2N0bCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDY3OTQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jCkBAIC0wLDAgKzEsNDUxIEBACisvKioKKyAqIFxmaWxlIGRybV9mb3BzLmggCisgKiBGaWxlIG9wZXJhdGlvbnMgZm9yIERSTQorICogCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBEYXJ5bGwgU3RyYXVzcyA8ZGFyeWxsQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IE1vbiBKYW4gIDQgMDg6NTg6MzEgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisKK3N0YXRpYyBpbnQgZHJtX3NldHVwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJaW50IGk7CisJaW50IHJldDsKKworCWlmIChkZXYtPmRyaXZlci0+cHJlc2V0dXApCisJeworCQlyZXQ9ZGV2LT5kcml2ZXItPnByZXNldHVwKGRldik7CisJCWlmIChyZXQhPTApIAorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlhdG9taWNfc2V0KCAmZGV2LT5pb2N0bF9jb3VudCwgMCApOworCWF0b21pY19zZXQoICZkZXYtPnZtYV9jb3VudCwgMCApOworCWRldi0+YnVmX3VzZSA9IDA7CisJYXRvbWljX3NldCggJmRldi0+YnVmX2FsbG9jLCAwICk7CisKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0RNQSkpCisJeworCQlpID0gZHJtX2RtYV9zZXR1cCggZGV2ICk7CisJCWlmICggaSA8IDAgKQorCQkJcmV0dXJuIGk7CisJfQorCisJZm9yICggaSA9IDAgOyBpIDwgRFJNX0FSUkFZX1NJWkUoZGV2LT5jb3VudHMpIDsgaSsrICkKKwkJYXRvbWljX3NldCggJmRldi0+Y291bnRzW2ldLCAwICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBEUk1fSEFTSF9TSVpFIDsgaSsrICkgeworCQlkZXYtPm1hZ2ljbGlzdFtpXS5oZWFkID0gTlVMTDsKKwkJZGV2LT5tYWdpY2xpc3RbaV0udGFpbCA9IE5VTEw7CisJfQorCisJZGV2LT5tYXBsaXN0ID0gZHJtX2FsbG9jKHNpemVvZigqZGV2LT5tYXBsaXN0KSwKKwkJCQkgIERSTV9NRU1fTUFQUyk7CisJaWYoZGV2LT5tYXBsaXN0ID09IE5VTEwpIHJldHVybiAtRU5PTUVNOworCW1lbXNldChkZXYtPm1hcGxpc3QsIDAsIHNpemVvZigqZGV2LT5tYXBsaXN0KSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+bWFwbGlzdC0+aGVhZCk7CisKKwlkZXYtPmN0eGxpc3QgPSBkcm1fYWxsb2Moc2l6ZW9mKCpkZXYtPmN0eGxpc3QpLAorCQkJCSAgRFJNX01FTV9DVFhMSVNUKTsKKwlpZihkZXYtPmN0eGxpc3QgPT0gTlVMTCkgcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGRldi0+Y3R4bGlzdCwgMCwgc2l6ZW9mKCpkZXYtPmN0eGxpc3QpKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5jdHhsaXN0LT5oZWFkKTsKKworCWRldi0+dm1hbGlzdCA9IE5VTEw7CisJZGV2LT5zaWdkYXRhLmxvY2sgPSBkZXYtPmxvY2suaHdfbG9jayA9IE5VTEw7CisJaW5pdF93YWl0cXVldWVfaGVhZCggJmRldi0+bG9jay5sb2NrX3F1ZXVlICk7CisJZGV2LT5xdWV1ZV9jb3VudCA9IDA7CisJZGV2LT5xdWV1ZV9yZXNlcnZlZCA9IDA7CisJZGV2LT5xdWV1ZV9zbG90cyA9IDA7CisJZGV2LT5xdWV1ZWxpc3QgPSBOVUxMOworCWRldi0+aXJxX2VuYWJsZWQgPSAwOworCWRldi0+Y29udGV4dF9mbGFnID0gMDsKKwlkZXYtPmludGVycnVwdF9mbGFnID0gMDsKKwlkZXYtPmRtYV9mbGFnID0gMDsKKwlkZXYtPmxhc3RfY29udGV4dCA9IDA7CisJZGV2LT5sYXN0X3N3aXRjaCA9IDA7CisJZGV2LT5sYXN0X2NoZWNrZWQgPSAwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoICZkZXYtPmNvbnRleHRfd2FpdCApOworCWRldi0+aWZfdmVyc2lvbiA9IDA7CisKKwlkZXYtPmN0eF9zdGFydCA9IDA7CisJZGV2LT5sY2tfc3RhcnQgPSAwOworCisJZGV2LT5idWZfcnAgPSBkZXYtPmJ1ZjsKKwlkZXYtPmJ1Zl93cCA9IGRldi0+YnVmOworCWRldi0+YnVmX2VuZCA9IGRldi0+YnVmICsgRFJNX0JTWjsKKwlkZXYtPmJ1Zl9hc3luYyA9IE5VTEw7CisJaW5pdF93YWl0cXVldWVfaGVhZCggJmRldi0+YnVmX3JlYWRlcnMgKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCAmZGV2LT5idWZfd3JpdGVycyApOworCisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwkvKgorCSAqIFRoZSBrZXJuZWwncyBjb250ZXh0IGNvdWxkIGJlIGNyZWF0ZWQgaGVyZSwgYnV0IGlzIG5vdyBjcmVhdGVkCisJICogaW4gZHJtX2RtYV9lbnF1ZXVlLglUaGlzIGlzIG1vcmUgcmVzb3VyY2UtZWZmaWNpZW50IGZvcgorCSAqIGhhcmR3YXJlIHRoYXQgZG9lcyBub3QgZG8gRE1BLCBidXQgbWF5IG1lYW4gdGhhdAorCSAqIGRybV9zZWxlY3RfcXVldWUgZmFpbHMgYmV0d2VlbiB0aGUgdGltZSB0aGUgaW50ZXJydXB0IGlzCisJICogaW5pdGlhbGl6ZWQgYW5kIHRoZSB0aW1lIHRoZSBxdWV1ZXMgYXJlIGluaXRpYWxpemVkLgorCSAqLworCWlmIChkZXYtPmRyaXZlci0+cG9zdHNldHVwKQorCQlkZXYtPmRyaXZlci0+cG9zdHNldHVwKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBPcGVuIGZpbGUuCisgKiAKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUKKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogU2VhcmNoZXMgdGhlIERSTSBkZXZpY2Ugd2l0aCB0aGUgc2FtZSBtaW5vciBudW1iZXIsIGNhbGxzIG9wZW5faGVscGVyKCksIGFuZAorICogaW5jcmVtZW50cyB0aGUgZGV2aWNlIG9wZW4gY291bnQuIElmIHRoZSBvcGVuIGNvdW50IHdhcyBwcmV2aW91cyBhdCB6ZXJvLAorICogaS5lLiwgaXQncyB0aGUgZmlyc3QgdGhhdCB0aGUgZGV2aWNlIGlzIG9wZW4sIHRoZW4gY2FsbHMgc2V0dXAoKS4KKyAqLworaW50IGRybV9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCApCit7CisJZHJtX2RldmljZV90ICpkZXYgPSBOVUxMOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJaW50IHJldGNvZGUgPSAwOworCisJaWYgKCEoKG1pbm9yID49IDApICYmIChtaW5vciA8IGRybV9jYXJkc19saW1pdCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkJCisJaWYgKCFkcm1faGVhZHNbbWlub3JdKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghKGRldiA9IGRybV9oZWFkc1ttaW5vcl0tPmRldikpCisJCXJldHVybiAtRU5PREVWOworCQorCXJldGNvZGUgPSBkcm1fb3Blbl9oZWxwZXIoIGlub2RlLCBmaWxwLCBkZXYgKTsKKwlpZiAoICFyZXRjb2RlICkgeworCQlhdG9taWNfaW5jKCAmZGV2LT5jb3VudHNbX0RSTV9TVEFUX09QRU5TXSApOworCQlzcGluX2xvY2soICZkZXYtPmNvdW50X2xvY2sgKTsKKwkJaWYgKCAhZGV2LT5vcGVuX2NvdW50KysgKSB7CisJCQlzcGluX3VubG9jayggJmRldi0+Y291bnRfbG9jayApOworCQkJcmV0dXJuIGRybV9zZXR1cCggZGV2ICk7CisJCX0KKwkJc3Bpbl91bmxvY2soICZkZXYtPmNvdW50X2xvY2sgKTsKKwl9CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX29wZW4pOworCisvKioKKyAqIFJlbGVhc2UgZmlsZS4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIElmIHRoZSBoYXJkd2FyZSBsb2NrIGlzIGhlbGQgdGhlbiBmcmVlIGl0LCBhbmQgdGFrZSBpdCBhZ2FpbiBmb3IgdGhlIGtlcm5lbAorICogY29udGV4dCBzaW5jZSBpdCdzIG5lY2Vzc2FyeSB0byByZWNsYWltIGJ1ZmZlcnMuIFVubGluayB0aGUgZmlsZSBwcml2YXRlCisgKiBkYXRhIGZyb20gaXRzIGxpc3QgYW5kIGZyZWUgaXQuIERlY3JlYXNlcyB0aGUgb3BlbiBjb3VudCBhbmQgaWYgaXQgcmVhY2hlcworICogemVybyBjYWxscyB0YWtlZG93bigpLgorICovCitpbnQgZHJtX3JlbGVhc2UoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwICkKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2OworCWludCByZXRjb2RlID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisJZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCisJRFJNX0RFQlVHKCAib3Blbl9jb3VudCA9ICVkXG4iLCBkZXYtPm9wZW5fY291bnQgKTsKKworCWlmIChkZXYtPmRyaXZlci0+cHJlcmVsZWFzZSkKKwkJZGV2LT5kcml2ZXItPnByZXJlbGVhc2UoZGV2LCBmaWxwKTsKKworCS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJICogQmVnaW4gaW5saW5lIGRybV9yZWxlYXNlCisJICovCisKKwlEUk1fREVCVUcoICJwaWQgPSAlZCwgZGV2aWNlID0gMHglbHgsIG9wZW5fY291bnQgPSAlZFxuIiwKKwkJICAgY3VycmVudC0+cGlkLCAobG9uZylvbGRfZW5jb2RlX2Rldihwcml2LT5oZWFkLT5kZXZpY2UpLCBkZXYtPm9wZW5fY291bnQgKTsKKworCWlmICggcHJpdi0+bG9ja19jb3VudCAmJiBkZXYtPmxvY2suaHdfbG9jayAmJgorCSAgICAgX0RSTV9MT0NLX0lTX0hFTEQoZGV2LT5sb2NrLmh3X2xvY2stPmxvY2spICYmCisJICAgICBkZXYtPmxvY2suZmlscCA9PSBmaWxwICkgeworCQlEUk1fREVCVUcoICJGaWxlICVwIHJlbGVhc2VkLCBmcmVlaW5nIGxvY2sgZm9yIGNvbnRleHQgJWRcbiIsCisJCQlmaWxwLAorCQkJX0RSTV9MT0NLSU5HX0NPTlRFWFQoZGV2LT5sb2NrLmh3X2xvY2stPmxvY2spICk7CisJCQorCQlpZiAoZGV2LT5kcml2ZXItPnJlbGVhc2UpCisJCQlkZXYtPmRyaXZlci0+cmVsZWFzZShkZXYsIGZpbHApOworCisJCWRybV9sb2NrX2ZyZWUoIGRldiwgJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAorCQkJCV9EUk1fTE9DS0lOR19DT05URVhUKGRldi0+bG9jay5od19sb2NrLT5sb2NrKSApOworCisJCQkJLyogRklYTUU6IG1heSByZXF1aXJlIGhlYXZ5LWhhbmRlZCByZXNldCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZSBhdCB0aGlzIHBvaW50LCBwb3NzaWJseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgdmlhIGEgY2FsbGJhY2sgdG8gdGhlIFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLiAqLworCX0KKwllbHNlIGlmICggZGV2LT5kcml2ZXItPnJlbGVhc2UgJiYgcHJpdi0+bG9ja19jb3VudCAmJiBkZXYtPmxvY2suaHdfbG9jayApIHsKKwkJLyogVGhlIGxvY2sgaXMgcmVxdWlyZWQgdG8gcmVjbGFpbSBidWZmZXJzICovCisJCURFQ0xBUkVfV0FJVFFVRVVFKCBlbnRyeSwgY3VycmVudCApOworCisJCWFkZF93YWl0X3F1ZXVlKCAmZGV2LT5sb2NrLmxvY2tfcXVldWUsICZlbnRyeSApOworCQlmb3IgKDs7KSB7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoICFkZXYtPmxvY2suaHdfbG9jayApIHsKKwkJCQkvKiBEZXZpY2UgaGFzIGJlZW4gdW5yZWdpc3RlcmVkICovCisJCQkJcmV0Y29kZSA9IC1FSU5UUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICggZHJtX2xvY2tfdGFrZSggJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAorCQkJCQkgICAgIERSTV9LRVJORUxfQ09OVEVYVCApICkgeworCQkJCWRldi0+bG9jay5maWxwCSAgICA9IGZpbHA7CisJCQkJZGV2LT5sb2NrLmxvY2tfdGltZSA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pY19pbmMoICZkZXYtPmNvdW50c1tfRFJNX1NUQVRfTE9DS1NdICk7CisJCQkJYnJlYWs7CS8qIEdvdCBsb2NrICovCisJCQl9CisJCQkJLyogQ29udGVudGlvbiAqLworCQkJc2NoZWR1bGUoKTsKKwkJCWlmICggc2lnbmFsX3BlbmRpbmcoIGN1cnJlbnQgKSApIHsKKwkJCQlyZXRjb2RlID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoICZkZXYtPmxvY2subG9ja19xdWV1ZSwgJmVudHJ5ICk7CisJCWlmKCAhcmV0Y29kZSApIHsKKwkJCWlmIChkZXYtPmRyaXZlci0+cmVsZWFzZSkKKwkJCQlkZXYtPmRyaXZlci0+cmVsZWFzZShkZXYsIGZpbHApOworCQkJZHJtX2xvY2tfZnJlZSggZGV2LCAmZGV2LT5sb2NrLmh3X2xvY2stPmxvY2ssCisJCQkJCURSTV9LRVJORUxfQ09OVEVYVCApOworCQl9CisJfQorCQorCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKKwl7CisJCWRldi0+ZHJpdmVyLT5yZWNsYWltX2J1ZmZlcnMoZGV2LCBmaWxwKTsKKwl9CisKKwlkcm1fZmFzeW5jKCAtMSwgZmlscCwgMCApOworCisJZG93biggJmRldi0+Y3R4bGlzdF9zZW0gKTsKKwlpZiAoICFsaXN0X2VtcHR5KCAmZGV2LT5jdHhsaXN0LT5oZWFkICkgKSB7CisJCWRybV9jdHhfbGlzdF90ICpwb3MsICpuOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSggcG9zLCBuLCAmZGV2LT5jdHhsaXN0LT5oZWFkLCBoZWFkICkgeworCQkJaWYgKCBwb3MtPnRhZyA9PSBwcml2ICYmCisJCQkgICAgIHBvcy0+aGFuZGxlICE9IERSTV9LRVJORUxfQ09OVEVYVCApIHsKKwkJCQlpZiAoZGV2LT5kcml2ZXItPmNvbnRleHRfZHRvcikKKwkJCQkJZGV2LT5kcml2ZXItPmNvbnRleHRfZHRvcihkZXYsIHBvcy0+aGFuZGxlKTsKKworCQkJCWRybV9jdHhiaXRtYXBfZnJlZSggZGV2LCBwb3MtPmhhbmRsZSApOworCisJCQkJbGlzdF9kZWwoICZwb3MtPmhlYWQgKTsKKwkJCQlkcm1fZnJlZSggcG9zLCBzaXplb2YoKnBvcyksIERSTV9NRU1fQ1RYTElTVCApOworCQkJCS0tZGV2LT5jdHhfY291bnQ7CisJCQl9CisJCX0KKwl9CisJdXAoICZkZXYtPmN0eGxpc3Rfc2VtICk7CisKKwlkb3duKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJaWYgKCBwcml2LT5yZW1vdmVfYXV0aF9vbl9jbG9zZSA9PSAxICkgeworCQlkcm1fZmlsZV90ICp0ZW1wID0gZGV2LT5maWxlX2ZpcnN0OworCQl3aGlsZSAoIHRlbXAgKSB7CisJCQl0ZW1wLT5hdXRoZW50aWNhdGVkID0gMDsKKwkJCXRlbXAgPSB0ZW1wLT5uZXh0OworCQl9CisJfQorCWlmICggcHJpdi0+cHJldiApIHsKKwkJcHJpdi0+cHJldi0+bmV4dCA9IHByaXYtPm5leHQ7CisJfSBlbHNlIHsKKwkJZGV2LT5maWxlX2ZpcnN0CSA9IHByaXYtPm5leHQ7CisJfQorCWlmICggcHJpdi0+bmV4dCApIHsKKwkJcHJpdi0+bmV4dC0+cHJldiA9IHByaXYtPnByZXY7CisJfSBlbHNlIHsKKwkJZGV2LT5maWxlX2xhc3QJID0gcHJpdi0+cHJldjsKKwl9CisJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkKKwlpZiAoZGV2LT5kcml2ZXItPmZyZWVfZmlscF9wcml2KQorCQlkZXYtPmRyaXZlci0+ZnJlZV9maWxwX3ByaXYoZGV2LCBwcml2KTsKKworCWRybV9mcmVlKCBwcml2LCBzaXplb2YoKnByaXYpLCBEUk1fTUVNX0ZJTEVTICk7CisKKwkvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAqIEVuZCBpbmxpbmUgZHJtX3JlbGVhc2UKKwkgKi8KKworCWF0b21pY19pbmMoICZkZXYtPmNvdW50c1tfRFJNX1NUQVRfQ0xPU0VTXSApOworCXNwaW5fbG9jayggJmRldi0+Y291bnRfbG9jayApOworCWlmICggIS0tZGV2LT5vcGVuX2NvdW50ICkgeworCQlpZiAoIGF0b21pY19yZWFkKCAmZGV2LT5pb2N0bF9jb3VudCApIHx8IGRldi0+YmxvY2tlZCApIHsKKwkJCURSTV9FUlJPUiggIkRldmljZSBidXN5OiAlZCAlZFxuIiwKKwkJCQkgICBhdG9taWNfcmVhZCggJmRldi0+aW9jdGxfY291bnQgKSwKKwkJCQkgICBkZXYtPmJsb2NrZWQgKTsKKwkJCXNwaW5fdW5sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCXNwaW5fdW5sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIGRybV90YWtlZG93biggZGV2ICk7CisJfQorCXNwaW5fdW5sb2NrKCAmZGV2LT5jb3VudF9sb2NrICk7CisKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX3JlbGVhc2UpOworCisvKioKKyAqIENhbGxlZCB3aGVuZXZlciBhIHByb2Nlc3Mgb3BlbnMgL2Rldi9kcm0uIAorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gZGV2IGRldmljZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKiAKKyAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgZHJtX2ZpbGUgc3RydWN0dXJlIGZvciB0aGUgZmlsZSBwcml2YXRlIGRhdGEgaW4gXHAKKyAqIGZpbHAgYW5kIGFkZCBpdCBpbnRvIHRoZSBkb3VibGUgbGlua2VkIGxpc3QgaW4gXHAgZGV2LgorICovCitpbnQgZHJtX29wZW5faGVscGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCBkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlpbnQJICAgICBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJZHJtX2ZpbGVfdCAgICpwcml2OworCWludCByZXQ7CisKKwlpZiAoZmlscC0+Zl9mbGFncyAmIE9fRVhDTCkgICByZXR1cm4gLUVCVVNZOyAvKiBObyBleGNsdXNpdmUgb3BlbnMgKi8KKwlpZiAoIWRybV9jcHVfdmFsaWQoKSkgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJRFJNX0RFQlVHKCJwaWQgPSAlZCwgbWlub3IgPSAlZFxuIiwgY3VycmVudC0+cGlkLCBtaW5vcik7CisKKwlwcml2CQkgICAgPSBkcm1fYWxsb2Moc2l6ZW9mKCpwcml2KSwgRFJNX01FTV9GSUxFUyk7CisJaWYoIXByaXYpIHJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCWZpbHAtPnByaXZhdGVfZGF0YSAgPSBwcml2OworCXByaXYtPnVpZAkgICAgPSBjdXJyZW50LT5ldWlkOworCXByaXYtPnBpZAkgICAgPSBjdXJyZW50LT5waWQ7CisJcHJpdi0+bWlub3IJICAgID0gbWlub3I7CisJcHJpdi0+aGVhZCAgICAgICAgICA9IGRybV9oZWFkc1ttaW5vcl07CisJcHJpdi0+aW9jdGxfY291bnQgICA9IDA7CisJcHJpdi0+YXV0aGVudGljYXRlZCA9IGNhcGFibGUoQ0FQX1NZU19BRE1JTik7CisJcHJpdi0+bG9ja19jb3VudCAgICA9IDA7CisKKwlpZiAoZGV2LT5kcml2ZXItPm9wZW5faGVscGVyKSB7CisJCXJldD1kZXYtPmRyaXZlci0+b3Blbl9oZWxwZXIoZGV2LCBwcml2KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dF9mcmVlOworCX0KKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJaWYgKCFkZXYtPmZpbGVfbGFzdCkgeworCQlwcml2LT5uZXh0CT0gTlVMTDsKKwkJcHJpdi0+cHJldgk9IE5VTEw7CisJCWRldi0+ZmlsZV9maXJzdCA9IHByaXY7CisJCWRldi0+ZmlsZV9sYXN0CT0gcHJpdjsKKwl9IGVsc2UgeworCQlwcml2LT5uZXh0CSAgICAgPSBOVUxMOworCQlwcml2LT5wcmV2CSAgICAgPSBkZXYtPmZpbGVfbGFzdDsKKwkJZGV2LT5maWxlX2xhc3QtPm5leHQgPSBwcml2OworCQlkZXYtPmZpbGVfbGFzdAkgICAgID0gcHJpdjsKKwl9CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisKKyNpZmRlZiBfX2FscGhhX18KKwkvKgorCSAqIERlZmF1bHQgdGhlIGhvc2UKKwkgKi8KKwlpZiAoIWRldi0+aG9zZSkgeworCQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwkJcGNpX2RldiA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIE5VTEwpOworCQlpZiAocGNpX2RldikgeworCQkJZGV2LT5ob3NlID0gcGNpX2Rldi0+c3lzZGF0YTsKKwkJCXBjaV9kZXZfcHV0KHBjaV9kZXYpOworCQl9CisJCWlmICghZGV2LT5ob3NlKSB7CisJCQlzdHJ1Y3QgcGNpX2J1cyAqYiA9IHBjaV9idXNfYihwY2lfcm9vdF9idXNlcy5uZXh0KTsKKwkJCWlmIChiKSBkZXYtPmhvc2UgPSBiLT5zeXNkYXRhOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK291dF9mcmVlOgorCWRybV9mcmVlKHByaXYsIHNpemVvZigqcHJpdiksIERSTV9NRU1fRklMRVMpOworCWZpbHAtPnByaXZhdGVfZGF0YT1OVUxMOworCXJldHVybiByZXQ7Cit9CisKKy8qKiBOby1vcC4gKi8KK2ludCBkcm1fZmx1c2goc3RydWN0IGZpbGUgKmZpbHApCit7CisJZHJtX2ZpbGVfdCAgICAqcHJpdiAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAgKmRldiAgICA9IHByaXYtPmhlYWQtPmRldjsKKworCURSTV9ERUJVRygicGlkID0gJWQsIGRldmljZSA9IDB4JWx4LCBvcGVuX2NvdW50ID0gJWRcbiIsCisJCSAgY3VycmVudC0+cGlkLCAobG9uZylvbGRfZW5jb2RlX2Rldihwcml2LT5oZWFkLT5kZXZpY2UpLCBkZXYtPm9wZW5fY291bnQpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fZmx1c2gpOworCisvKiogTm8tb3AuICovCitpbnQgZHJtX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCit7CisJZHJtX2ZpbGVfdCAgICAqcHJpdiAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAgKmRldiAgICA9IHByaXYtPmhlYWQtPmRldjsKKwlpbnQJICAgICAgcmV0Y29kZTsKKworCURSTV9ERUJVRygiZmQgPSAlZCwgZGV2aWNlID0gMHglbHhcbiIsIGZkLCAobG9uZylvbGRfZW5jb2RlX2Rldihwcml2LT5oZWFkLT5kZXZpY2UpKTsKKwlyZXRjb2RlID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sICZkZXYtPmJ1Zl9hc3luYyk7CisJaWYgKHJldGNvZGUgPCAwKSByZXR1cm4gcmV0Y29kZTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2Zhc3luYyk7CisKKy8qKiBOby1vcC4gKi8KK3Vuc2lnbmVkIGludCBkcm1fcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fcG9sbCk7CisKKworLyoqIE5vLW9wLiAqLworc3NpemVfdCBkcm1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2luaXQuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjg4M2I3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW5pdC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qKgorICogXGZpbGUgZHJtX2luaXQuaCAKKyAqIFNldHVwL0NsZWFudXAgZm9yIERSTQorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ3JlYXRlZDogTW9uIEphbiAgNCAwODo1ODozMSAxOTk5IGJ5IGZhaXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgRFJJIHdpbGwgcnVuIG9uIHRoaXMgQ1BVLgorICoKKyAqIFxyZXR1cm4gbm9uLXplcm8gaWYgdGhlIERSSSB3aWxsIHJ1biBvbiB0aGlzIENQVSwgb3IgemVybyBvdGhlcndpc2UuCisgKi8KK2ludCBkcm1fY3B1X3ZhbGlkKHZvaWQpCit7CisjaWYgZGVmaW5lZChfX2kzODZfXykKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMykgcmV0dXJuIDA7IC8qIE5vIGNtcHhjaGcgb24gYSAzODYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiAhZGVmaW5lZChfX3NwYXJjX3Y5X18pCisJcmV0dXJuIDA7IC8qIE5vIGNtcHhjaGcgYmVmb3JlIHY5IHNwYXJjLiAqLworI2VuZGlmCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWFmZGEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYwpAQCAtMCwwICsxLDM3MCBAQAorLyoqCisgKiBcZmlsZSBkcm1faW9jdGwuaCAKKyAqIElPQ1RMIHByb2Nlc3NpbmcgZm9yIERSTQorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ3JlYXRlZDogRnJpIEphbiAgOCAwOTowMToyNiAxOTk5IGJ5IGZhaXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jb3JlLmgiCisKKyNpbmNsdWRlICJsaW51eC9wY2kuaCIKKworLyoqCisgKiBHZXQgdGhlIGJ1cyBpZC4KKyAqIAorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fdW5pcXVlIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogQ29waWVzIHRoZSBidXMgaWQgZnJvbSBkcm1fZGV2aWNlOjp1bmlxdWUgaW50byB1c2VyIHNwYWNlLgorICovCitpbnQgZHJtX2dldHVuaXF1ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkgKnByaXYJID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgKmRldgkgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX3VuaXF1ZV90CSBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX3VuaXF1ZV90CSB1OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1LCBhcmdwLCBzaXplb2YodSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAodS51bmlxdWVfbGVuID49IGRldi0+dW5pcXVlX2xlbikgeworCQlpZiAoY29weV90b191c2VyKHUudW5pcXVlLCBkZXYtPnVuaXF1ZSwgZGV2LT51bmlxdWVfbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwl1LnVuaXF1ZV9sZW4gPSBkZXYtPnVuaXF1ZV9sZW47CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdSwgc2l6ZW9mKHUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2V0IHRoZSBidXMgaWQuCisgKiAKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQsIHBvaW50aW5nIHRvIGEgZHJtX3VuaXF1ZSBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIENvcGllcyB0aGUgYnVzIGlkIGZyb20gdXNlcnNwYWNlIGludG8gZHJtX2RldmljZTo6dW5pcXVlLCBhbmQgdmVyaWZpZXMgdGhhdAorICogaXQgbWF0Y2hlcyB0aGUgZGV2aWNlIHRoaXMgRFJNIGlzIGF0dGFjaGVkIHRvIChFSU5WQUwgb3RoZXJ3aXNlKS4gIERlcHJlY2F0ZWQKKyAqIGluIGludGVyZmFjZSB2ZXJzaW9uIDEuMSBhbmQgd2lsbCByZXR1cm4gRUJVU1kgd2hlbiBzZXR2ZXJzaW9uIGhhcyByZXF1ZXN0ZWQKKyAqIHZlcnNpb24gMS4xIG9yIGdyZWF0ZXIuCisgKi8KK2ludCBkcm1fc2V0dW5pcXVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSAqcHJpdgkgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAqZGV2CSA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fdW5pcXVlX3QJIHU7CisJaW50CQkgZG9tYWluLCBidXMsIHNsb3QsIGZ1bmMsIHJldDsKKworCWlmIChkZXYtPnVuaXF1ZV9sZW4gfHwgZGV2LT51bmlxdWUpIHJldHVybiAtRUJVU1k7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnUsIChkcm1fdW5pcXVlX3QgX191c2VyICopYXJnLCBzaXplb2YodSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghdS51bmlxdWVfbGVuIHx8IHUudW5pcXVlX2xlbiA+IDEwMjQpIHJldHVybiAtRUlOVkFMOworCisJZGV2LT51bmlxdWVfbGVuID0gdS51bmlxdWVfbGVuOworCWRldi0+dW5pcXVlCT0gZHJtX2FsbG9jKHUudW5pcXVlX2xlbiArIDEsIERSTV9NRU1fRFJJVkVSKTsKKwlpZighZGV2LT51bmlxdWUpIHJldHVybiAtRU5PTUVNOworCWlmIChjb3B5X2Zyb21fdXNlcihkZXYtPnVuaXF1ZSwgdS51bmlxdWUsIGRldi0+dW5pcXVlX2xlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2LT51bmlxdWVbZGV2LT51bmlxdWVfbGVuXSA9ICdcMCc7CisKKwlkZXYtPmRldm5hbWUgPSBkcm1fYWxsb2Moc3RybGVuKGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUpICsgc3RybGVuKGRldi0+dW5pcXVlKSArIDIsCisJCQkJICBEUk1fTUVNX0RSSVZFUik7CisJaWYgKCFkZXYtPmRldm5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCisJc3ByaW50ZihkZXYtPmRldm5hbWUsICIlc0AlcyIsIGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUsIGRldi0+dW5pcXVlKTsKKworCS8qIFJldHVybiBlcnJvciBpZiB0aGUgYnVzaWQgc3VibWl0dGVkIGRvZXNuJ3QgbWF0Y2ggdGhlIGRldmljZSdzIGFjdHVhbAorCSAqIGJ1c2lkLgorCSAqLworCXJldCA9IHNzY2FuZihkZXYtPnVuaXF1ZSwgIlBDSTolZDolZDolZCIsICZidXMsICZzbG90LCAmZnVuYyk7CisJaWYgKHJldCAhPSAzKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCWRvbWFpbiA9IGJ1cyA+PiA4OworCWJ1cyAmPSAweGZmOworCQorCWlmICgoZG9tYWluICE9IGRldi0+cGNpX2RvbWFpbikgfHwKKwkgICAgKGJ1cyAhPSBkZXYtPnBjaV9idXMpIHx8CisJICAgIChzbG90ICE9IGRldi0+cGNpX3Nsb3QpIHx8CisJICAgIChmdW5jICE9IGRldi0+cGNpX2Z1bmMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkcm1fc2V0X2J1c2lkKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWlmIChkZXYtPnVuaXF1ZSAhPSBOVUxMKQorCQlyZXR1cm4gRUJVU1k7CisKKwlkZXYtPnVuaXF1ZV9sZW4gPSAyMDsKKwlkZXYtPnVuaXF1ZSA9IGRybV9hbGxvYyhkZXYtPnVuaXF1ZV9sZW4gKyAxLCBEUk1fTUVNX0RSSVZFUik7CisJaWYgKGRldi0+dW5pcXVlID09IE5VTEwpCisJCXJldHVybiBFTk9NRU07CisKKwlzbnByaW50ZihkZXYtPnVuaXF1ZSwgZGV2LT51bmlxdWVfbGVuLCAicGNpOiUwNHg6JTAyeDolMDJ4LiVkIiwKKwkJZGV2LT5wY2lfZG9tYWluLCBkZXYtPnBjaV9idXMsIGRldi0+cGNpX3Nsb3QsIGRldi0+cGNpX2Z1bmMpOworCisJZGV2LT5kZXZuYW1lID0gZHJtX2FsbG9jKHN0cmxlbihkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lKSArIGRldi0+dW5pcXVlX2xlbiArIDIsCisJCQkJRFJNX01FTV9EUklWRVIpOworCWlmIChkZXYtPmRldm5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIEVOT01FTTsKKworCXNwcmludGYoZGV2LT5kZXZuYW1lLCAiJXNAJXMiLCBkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lLCBkZXYtPnVuaXF1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIEdldCBhIG1hcHBpbmcgaW5mb3JtYXRpb24uCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fbWFwIHN0cnVjdHVyZS4KKyAqIAorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBTZWFyY2hlcyBmb3IgdGhlIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIG9mZnNldCBhbmQgY29waWVzIGl0cyBpbmZvcm1hdGlvbgorICogaW50byB1c2Vyc3BhY2UKKyAqLworaW50IGRybV9nZXRtYXAoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgICAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX21hcF90ICAgIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fbWFwX3QgICAgbWFwOworCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJaW50ICAgICAgICAgIGlkeDsKKwlpbnQJICAgICBpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZtYXAsIGFyZ3AsIHNpemVvZihtYXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWR4ID0gbWFwLm9mZnNldDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJaWYgKGlkeCA8IDApIHsKKwkJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWkgPSAwOworCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQlpZihpID09IGlkeCkgeworCQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCQlicmVhazsKKwkJfQorCQlpKys7CisJfQorCWlmKCFyX2xpc3QgfHwgIXJfbGlzdC0+bWFwKSB7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXAub2Zmc2V0ID0gcl9saXN0LT5tYXAtPm9mZnNldDsKKwltYXAuc2l6ZSAgID0gcl9saXN0LT5tYXAtPnNpemU7CisJbWFwLnR5cGUgICA9IHJfbGlzdC0+bWFwLT50eXBlOworCW1hcC5mbGFncyAgPSByX2xpc3QtPm1hcC0+ZmxhZ3M7CisJbWFwLmhhbmRsZSA9IHJfbGlzdC0+bWFwLT5oYW5kbGU7CisJbWFwLm10cnIgICA9IHJfbGlzdC0+bWFwLT5tdHJyOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbWFwLCBzaXplb2YobWFwKSkpIHJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKioKKyAqIEdldCBjbGllbnQgaW5mb3JtYXRpb24uCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fY2xpZW50IHN0cnVjdHVyZS4KKyAqIAorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBTZWFyY2hlcyBmb3IgdGhlIGNsaWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggYW5kIGNvcGllcyBpdHMgaW5mb3JtYXRpb24KKyAqIGludG8gdXNlcnNwYWNlCisgKi8KK2ludCBkcm1fZ2V0Y2xpZW50KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fZmlsZV90ICAgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9jbGllbnRfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2NsaWVudF90IGNsaWVudDsKKwlkcm1fZmlsZV90ICAgKnB0OworCWludCAgICAgICAgICBpZHg7CisJaW50ICAgICAgICAgIGk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNsaWVudCwgYXJncCwgc2l6ZW9mKGNsaWVudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZHggPSBjbGllbnQuaWR4OworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJZm9yIChpID0gMCwgcHQgPSBkZXYtPmZpbGVfZmlyc3Q7IGkgPCBpZHggJiYgcHQ7IGkrKywgcHQgPSBwdC0+bmV4dCkKKwkJOworCisJaWYgKCFwdCkgeworCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNsaWVudC5hdXRoICA9IHB0LT5hdXRoZW50aWNhdGVkOworCWNsaWVudC5waWQgICA9IHB0LT5waWQ7CisJY2xpZW50LnVpZCAgID0gcHQtPnVpZDsKKwljbGllbnQubWFnaWMgPSBwdC0+bWFnaWM7CisJY2xpZW50LmlvY3MgID0gcHQtPmlvY3RsX2NvdW50OworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCisJaWYgKGNvcHlfdG9fdXNlcigoZHJtX2NsaWVudF90IF9fdXNlciAqKWFyZywgJmNsaWVudCwgc2l6ZW9mKGNsaWVudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqIAorICogR2V0IHN0YXRpc3RpY3MgaW5mb3JtYXRpb24uIAorICogCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LCBwb2ludGluZyB0byBhIGRybV9zdGF0cyBzdHJ1Y3R1cmUuCisgKiAKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2ludCBkcm1fZ2V0c3RhdHMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAgICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ICA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fc3RhdHNfdCAgc3RhdHM7CisJaW50ICAgICAgICAgIGk7CisKKwltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKKwkKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+Y291bnRlcnM7IGkrKykgeworCQlpZiAoZGV2LT50eXBlc1tpXSA9PSBfRFJNX1NUQVRfTE9DSykKKwkJCXN0YXRzLmRhdGFbaV0udmFsdWUKKwkJCQk9IChkZXYtPmxvY2suaHdfbG9jaworCQkJCSAgID8gZGV2LT5sb2NrLmh3X2xvY2stPmxvY2sgOiAwKTsKKwkJZWxzZSAKKwkJCXN0YXRzLmRhdGFbaV0udmFsdWUgPSBhdG9taWNfcmVhZCgmZGV2LT5jb3VudHNbaV0pOworCQlzdGF0cy5kYXRhW2ldLnR5cGUgID0gZGV2LT50eXBlc1tpXTsKKwl9CisJCisJc3RhdHMuY291bnQgPSBkZXYtPmNvdW50ZXJzOworCisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisKKwlpZiAoY29weV90b191c2VyKChkcm1fc3RhdHNfdCBfX3VzZXIgKilhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKioKKyAqIFNldHZlcnNpb24gaW9jdGwuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fbG9jayBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBTZXRzIHRoZSByZXF1ZXN0ZWQgaW50ZXJmYWNlIHZlcnNpb24KKyAqLworaW50IGRybV9zZXR2ZXJzaW9uKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3NldF92ZXJzaW9uX3Qgc3Y7CisJZHJtX3NldF92ZXJzaW9uX3QgcmV0djsKKwlpbnQgaWZfdmVyc2lvbjsKKwlkcm1fc2V0X3ZlcnNpb25fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCWRybV92ZXJzaW9uX3QgdmVyc2lvbjsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChzdiwgYXJncCwgc2l6ZW9mKHN2KSk7CisKKwltZW1zZXQoJnZlcnNpb24sIDAsIHNpemVvZih2ZXJzaW9uKSk7CisKKwlkZXYtPmRyaXZlci0+dmVyc2lvbigmdmVyc2lvbik7CisJcmV0di5kcm1fZGlfbWFqb3IgPSBEUk1fSUZfTUFKT1I7CisJcmV0di5kcm1fZGlfbWlub3IgPSBEUk1fSUZfTUlOT1I7CisJcmV0di5kcm1fZGRfbWFqb3IgPSB2ZXJzaW9uLnZlcnNpb25fbWFqb3I7CisJcmV0di5kcm1fZGRfbWlub3IgPSB2ZXJzaW9uLnZlcnNpb25fbWlub3I7CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKGFyZ3AsIHJldHYsIHNpemVvZihzdikpOworCisJaWYgKHN2LmRybV9kaV9tYWpvciAhPSAtMSkgeworCQlpZiAoc3YuZHJtX2RpX21ham9yICE9IERSTV9JRl9NQUpPUiB8fAorCQkgICAgc3YuZHJtX2RpX21pbm9yIDwgMCB8fCBzdi5kcm1fZGlfbWlub3IgPiBEUk1fSUZfTUlOT1IpCisJCQlyZXR1cm4gRUlOVkFMOworCQlpZl92ZXJzaW9uID0gRFJNX0lGX1ZFUlNJT04oc3YuZHJtX2RpX21ham9yLCBzdi5kcm1fZGRfbWlub3IpOworCQlkZXYtPmlmX3ZlcnNpb24gPSBEUk1fTUFYKGlmX3ZlcnNpb24sIGRldi0+aWZfdmVyc2lvbik7CisJCWlmIChzdi5kcm1fZGlfbWlub3IgPj0gMSkgeworCQkJLyoKKwkJCSAqIFZlcnNpb24gMS4xIGluY2x1ZGVzIHR5aW5nIG9mIERSTSB0byBzcGVjaWZpYyBkZXZpY2UKKwkJCSAqLworCQkJZHJtX3NldF9idXNpZChkZXYpOworCQl9CisJfQorCisJaWYgKHN2LmRybV9kZF9tYWpvciAhPSAtMSkgeworCQlpZiAoc3YuZHJtX2RkX21ham9yICE9IHZlcnNpb24udmVyc2lvbl9tYWpvciB8fAorCQkgICAgc3YuZHJtX2RkX21pbm9yIDwgMCB8fCBzdi5kcm1fZGRfbWlub3IgPiB2ZXJzaW9uLnZlcnNpb25fbWlub3IpCisJCQlyZXR1cm4gRUlOVkFMOworCisJCWlmIChkZXYtPmRyaXZlci0+c2V0X3ZlcnNpb24pCisJCQlkZXYtPmRyaXZlci0+c2V0X3ZlcnNpb24oZGV2LCAmc3YpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqIE5vLW9wIGlvY3RsLiAqLworaW50IGRybV9ub29wKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlEUk1fREVCVUcoIlxuIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjM2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYwpAQCAtMCwwICsxLDM3MCBAQAorLyoqCisgKiBcZmlsZSBkcm1faXJxLmggCisgKiBJUlEgc3VwcG9ydAorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ3JlYXRlZDogRnJpIE1hciAxOSAxNDozMDoxNiAxOTk5IGJ5IGZhaXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrIHF1ZXVlIHN1cHBvcnQgKi8KKworLyoqCisgKiBHZXQgaW50ZXJydXB0IGZyb20gYnVzIGlkLgorICogCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LCBwb2ludGluZyB0byBhIGRybV9pcnFfYnVzaWQgc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqIAorICogRmluZHMgdGhlIFBDSSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGJ1cyBpZCBhbmQgZ2V0cyBpdHMgSVJRIG51bWJlci4KKyAqIFRoaXMgSU9DVEwgaXMgZGVwcmVjYXRlZCwgYW5kIHdpbGwgbm93IHJldHVybiBFSU5WQUwgZm9yIGFueSBidXNpZCBub3QgZXF1YWwKKyAqIHRvIHRoYXQgb2YgdGhlIGRldmljZSB0aGF0IHRoaXMgRFJNIGluc3RhbmNlIGF0dGFjaGVkIHRvLgorICovCitpbnQgZHJtX2lycV9ieV9idXNpZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faXJxX2J1c2lkX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9pcnFfYnVzaWRfdCBwOworCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfSVJRKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGFyZ3AsIHNpemVvZihwKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChwLmJ1c251bSA+PiA4KSAhPSBkZXYtPnBjaV9kb21haW4gfHwKKwkgICAgKHAuYnVzbnVtICYgMHhmZikgIT0gZGV2LT5wY2lfYnVzIHx8CisJICAgIHAuZGV2bnVtICE9IGRldi0+cGNpX3Nsb3QgfHwKKwkgICAgcC5mdW5jbnVtICE9IGRldi0+cGNpX2Z1bmMpCisJCXJldHVybiAtRUlOVkFMOworCisJcC5pcnEgPSBkZXYtPmlycTsKKworCURSTV9ERUJVRygiJWQ6JWQ6JWQgPT4gSVJRICVkXG4iLAorCQkgIHAuYnVzbnVtLCBwLmRldm51bSwgcC5mdW5jbnVtLCBwLmlycSk7CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmcCwgc2l6ZW9mKHApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSW5zdGFsbCBJUlEgaGFuZGxlci4KKyAqCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCisgKiBccGFyYW0gaXJxIElSUSBudW1iZXIuCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIElSUSByZWxhdGVkIGRhdGEsIGFuZCBzZXR1cHMgZHJtX2RldmljZTo6dmJsX3F1ZXVlLiBJbnN0YWxscyB0aGUgaGFuZGxlciwgY2FsbGluZyB0aGUgZHJpdmVyCisgKiBcYyBkcm1fZHJpdmVyX2lycV9wcmVpbnN0YWxsKCkgYW5kIFxjIGRybV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCkgZnVuY3Rpb25zCisgKiBiZWZvcmUgYW5kIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24uCisgKi8KK2ludCBkcm1faXJxX2luc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgc2hfZmxhZ3M9MDsKKworCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0lSUSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCBkZXYtPmlycSA9PSAwICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisKKwkvKiBEcml2ZXIgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgKi8KKwlpZiAoICFkZXYtPmRldl9wcml2YXRlICkgeworCQl1cCggJmRldi0+c3RydWN0X3NlbSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIGRldi0+aXJxX2VuYWJsZWQgKSB7CisJCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWRldi0+aXJxX2VuYWJsZWQgPSAxOworCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CisKKwlEUk1fREVCVUcoICIlczogaXJxPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGRldi0+aXJxICk7CisKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9JUlFfVkJMKSkgeworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnZibF9xdWV1ZSk7CisJCQorCQlzcGluX2xvY2tfaW5pdCggJmRldi0+dmJsX2xvY2sgKTsKKwkJCisJCUlOSVRfTElTVF9IRUFEKCAmZGV2LT52Ymxfc2lncy5oZWFkICk7CisJCQorCQlkZXYtPnZibF9wZW5kaW5nID0gMDsKKwl9CisKKwkJCQkvKiBCZWZvcmUgaW5zdGFsbGluZyBoYW5kbGVyICovCisJZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsKGRldik7CisKKwkJCQkvKiBJbnN0YWxsIGhhbmRsZXIgKi8KKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9JUlFfU0hBUkVEKSkKKwkJc2hfZmxhZ3MgPSBTQV9TSElSUTsKKwkKKwlyZXQgPSByZXF1ZXN0X2lycSggZGV2LT5pcnEsIGRldi0+ZHJpdmVyLT5pcnFfaGFuZGxlciwKKwkJCSAgIHNoX2ZsYWdzLCBkZXYtPmRldm5hbWUsIGRldiApOworCWlmICggcmV0IDwgMCApIHsKKwkJZG93biggJmRldi0+c3RydWN0X3NlbSApOworCQlkZXYtPmlycV9lbmFibGVkID0gMDsKKwkJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkJCQkvKiBBZnRlciBpbnN0YWxsaW5nIGhhbmRsZXIgKi8KKwlkZXYtPmRyaXZlci0+aXJxX3Bvc3RpbnN0YWxsKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBVbmluc3RhbGwgdGhlIElSUSBoYW5kbGVyLgorICoKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KKyAqCisgKiBDYWxscyB0aGUgZHJpdmVyJ3MgXGMgZHJtX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCkgZnVuY3Rpb24sIGFuZCBzdG9wcyB0aGUgaXJxLgorICovCitpbnQgZHJtX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlpbnQgaXJxX2VuYWJsZWQ7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9JUlEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oICZkZXYtPnN0cnVjdF9zZW0gKTsKKwlpcnFfZW5hYmxlZCA9IGRldi0+aXJxX2VuYWJsZWQ7CisJZGV2LT5pcnFfZW5hYmxlZCA9IDA7CisJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKKworCWlmICggIWlycV9lbmFibGVkICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlEUk1fREVCVUcoICIlczogaXJxPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGRldi0+aXJxICk7CisKKwlkZXYtPmRyaXZlci0+aXJxX3VuaW5zdGFsbChkZXYpOworCisJZnJlZV9pcnEoIGRldi0+aXJxLCBkZXYgKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1faXJxX3VuaW5zdGFsbCk7CisKKy8qKgorICogSVJRIGNvbnRyb2wgaW9jdGwuCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fY29udHJvbCBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIENhbGxzIGlycV9pbnN0YWxsKCkgb3IgaXJxX3VuaW5zdGFsbCgpIGFjY29yZGluZyB0byBccCBhcmcuCisgKi8KK2ludCBkcm1fY29udHJvbCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2NvbnRyb2xfdCBjdGw7CisJCisJLyogaWYgd2UgaGF2ZW4ndCBpcnEgd2UgZmFsbGJhY2sgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyAtIHRoaXMgdXNlZCB0byBiZSBhIHNlcGFyYXRlIGZ1bmN0aW9uIGluIGRybV9kbWEuaCAqLworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJmN0bCwgKGRybV9jb250cm9sX3QgX191c2VyICopYXJnLCBzaXplb2YoY3RsKSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKCBjdGwuZnVuYyApIHsKKwljYXNlIERSTV9JTlNUX0hBTkRMRVI6CisJCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0lSUSkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGRldi0+aWZfdmVyc2lvbiA8IERSTV9JRl9WRVJTSU9OKDEsIDIpICYmCisJCSAgICBjdGwuaXJxICE9IGRldi0+aXJxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBkcm1faXJxX2luc3RhbGwoIGRldiApOworCWNhc2UgRFJNX1VOSU5TVF9IQU5ETEVSOgorCQlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9JUlEpKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBkcm1faXJxX3VuaW5zdGFsbCggZGV2ICk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKioKKyAqIFdhaXQgZm9yIFZCTEFOSy4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGRhdGEgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fd2FpdF92Ymxhbmsgc3RydWN0dXJlLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBWZXJpZmllcyB0aGUgSVJRIGlzIGluc3RhbGxlZC4gCisgKgorICogSWYgYSBzaWduYWwgaXMgcmVxdWVzdGVkIGNoZWNrcyBpZiB0aGlzIHRhc2sgaGFzIGFscmVhZHkgc2NoZWR1bGVkIHRoZSBzYW1lIHNpZ25hbAorICogZm9yIHRoZSBzYW1lIHZibGFuayBzZXF1ZW5jZSBudW1iZXIgLSBub3RoaW5nIHRvIGJlIGRvbmUgaW4KKyAqIHRoYXQgY2FzZS4gSWYgdGhlIG51bWJlciBvZiB0YXNrcyB3YWl0aW5nIGZvciB0aGUgaW50ZXJydXB0IGV4Y2VlZHMgMTAwIHRoZQorICogZnVuY3Rpb24gZmFpbHMuIE90aGVyd2lzZSBhZGRzIGEgbmV3IGVudHJ5IHRvIGRybV9kZXZpY2U6OnZibF9zaWdzIGZvciB0aGlzCisgKiB0YXNrLgorICoKKyAqIElmIGEgc2lnbmFsIGlzIG5vdCByZXF1ZXN0ZWQsIHRoZW4gY2FsbHMgdmJsYW5rX3dhaXQoKS4KKyAqLworaW50IGRybV93YWl0X3ZibGFuayggRFJNX0lPQ1RMX0FSR1MgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX3dhaXRfdmJsYW5rX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlkcm1fd2FpdF92YmxhbmtfdCB2Ymx3YWl0OworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSVJRX1ZCTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFkZXYtPmlycSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHZibHdhaXQsIGFyZ3AsIHNpemVvZih2Ymx3YWl0KSApOworCisJc3dpdGNoICggdmJsd2FpdC5yZXF1ZXN0LnR5cGUgJiB+X0RSTV9WQkxBTktfRkxBR1NfTUFTSyApIHsKKwljYXNlIF9EUk1fVkJMQU5LX1JFTEFUSVZFOgorCQl2Ymx3YWl0LnJlcXVlc3Quc2VxdWVuY2UgKz0gYXRvbWljX3JlYWQoICZkZXYtPnZibF9yZWNlaXZlZCApOworCQl2Ymx3YWl0LnJlcXVlc3QudHlwZSAmPSB+X0RSTV9WQkxBTktfUkVMQVRJVkU7CisJY2FzZSBfRFJNX1ZCTEFOS19BQlNPTFVURToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmxhZ3MgPSB2Ymx3YWl0LnJlcXVlc3QudHlwZSAmIF9EUk1fVkJMQU5LX0ZMQUdTX01BU0s7CisJCisJaWYgKCBmbGFncyAmIF9EUk1fVkJMQU5LX1NJR05BTCApIHsKKwkJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKwkJZHJtX3ZibF9zaWdfdCAqdmJsX3NpZzsKKwkJCisJCXZibHdhaXQucmVwbHkuc2VxdWVuY2UgPSBhdG9taWNfcmVhZCggJmRldi0+dmJsX3JlY2VpdmVkICk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoICZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyApOworCisJCS8qIENoZWNrIGlmIHRoaXMgdGFzayBoYXMgYWxyZWFkeSBzY2hlZHVsZWQgdGhlIHNhbWUgc2lnbmFsCisJCSAqIGZvciB0aGUgc2FtZSB2Ymxhbmsgc2VxdWVuY2UgbnVtYmVyOyBub3RoaW5nIHRvIGJlIGRvbmUgaW4KKwkJICogdGhhdCBjYXNlCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KCB2Ymxfc2lnLCAmZGV2LT52Ymxfc2lncy5oZWFkLCBoZWFkICkgeworCQkJaWYgKHZibF9zaWctPnNlcXVlbmNlID09IHZibHdhaXQucmVxdWVzdC5zZXF1ZW5jZQorCQkJICAgICYmIHZibF9zaWctPmluZm8uc2lfc2lnbm8gPT0gdmJsd2FpdC5yZXF1ZXN0LnNpZ25hbAorCQkJICAgICYmIHZibF9zaWctPnRhc2sgPT0gY3VycmVudCkKKwkJCXsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MgKTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCX0KKworCQlpZiAoIGRldi0+dmJsX3BlbmRpbmcgPj0gMTAwICkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzICk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJZGV2LT52YmxfcGVuZGluZysrOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyApOworCisJCWlmICggISggdmJsX3NpZyA9IGRybV9hbGxvYyggc2l6ZW9mKCBkcm1fdmJsX3NpZ190ICksIERSTV9NRU1fRFJJVkVSICkgKSApIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJbWVtc2V0KCAodm9pZCAqKXZibF9zaWcsIDAsIHNpemVvZigqdmJsX3NpZykgKTsKKworCQl2Ymxfc2lnLT5zZXF1ZW5jZSA9IHZibHdhaXQucmVxdWVzdC5zZXF1ZW5jZTsKKwkJdmJsX3NpZy0+aW5mby5zaV9zaWdubyA9IHZibHdhaXQucmVxdWVzdC5zaWduYWw7CisJCXZibF9zaWctPnRhc2sgPSBjdXJyZW50OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCAmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MgKTsKKworCQlsaXN0X2FkZF90YWlsKCAoc3RydWN0IGxpc3RfaGVhZCAqKSB2Ymxfc2lnLCAmZGV2LT52Ymxfc2lncy5oZWFkICk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzICk7CisJfSBlbHNlIHsKKwkJaWYgKGRldi0+ZHJpdmVyLT52Ymxhbmtfd2FpdCkKKwkJCXJldCA9IGRldi0+ZHJpdmVyLT52Ymxhbmtfd2FpdCggZGV2LCAmdmJsd2FpdC5yZXF1ZXN0LnNlcXVlbmNlICk7CisKKwkJZG9fZ2V0dGltZW9mZGF5KCAmbm93ICk7CisJCXZibHdhaXQucmVwbHkudHZhbF9zZWMgPSBub3cudHZfc2VjOworCQl2Ymx3YWl0LnJlcGx5LnR2YWxfdXNlYyA9IG5vdy50dl91c2VjOworCX0KKworZG9uZToKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKCBhcmdwLCB2Ymx3YWl0LCBzaXplb2YodmJsd2FpdCkgKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogU2VuZCB0aGUgVkJMQU5LIHNpZ25hbHMuCisgKgorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICoKKyAqIFNlbmRzIGEgc2lnbmFsIGZvciBlYWNoIHRhc2sgaW4gZHJtX2RldmljZTo6dmJsX3NpZ3MgYW5kIGVtcHRpZXMgdGhlIGxpc3QuCisgKgorICogSWYgYSBzaWduYWwgaXMgbm90IHJlcXVlc3RlZCwgdGhlbiBjYWxscyB2Ymxhbmtfd2FpdCgpLgorICovCit2b2lkIGRybV92Ymxfc2VuZF9zaWduYWxzKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKnRtcDsKKwlkcm1fdmJsX3NpZ190ICp2Ymxfc2lnOworCXVuc2lnbmVkIGludCB2Ymxfc2VxID0gYXRvbWljX3JlYWQoICZkZXYtPnZibF9yZWNlaXZlZCApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSggJmRldi0+dmJsX2xvY2ssIGZsYWdzICk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoIGxpc3QsIHRtcCwgJmRldi0+dmJsX3NpZ3MuaGVhZCApIHsKKwkJdmJsX3NpZyA9IGxpc3RfZW50cnkoIGxpc3QsIGRybV92Ymxfc2lnX3QsIGhlYWQgKTsKKwkJaWYgKCAoIHZibF9zZXEgLSB2Ymxfc2lnLT5zZXF1ZW5jZSApIDw9ICgxPDwyMykgKSB7CisJCQl2Ymxfc2lnLT5pbmZvLnNpX2NvZGUgPSB2Ymxfc2VxOworCQkJc2VuZF9zaWdfaW5mbyggdmJsX3NpZy0+aW5mby5zaV9zaWdubywgJnZibF9zaWctPmluZm8sIHZibF9zaWctPnRhc2sgKTsKKworCQkJbGlzdF9kZWwoIGxpc3QgKTsKKworCQkJZHJtX2ZyZWUoIHZibF9zaWcsIHNpemVvZigqdmJsX3NpZyksIERSTV9NRU1fRFJJVkVSICk7CisKKwkJCWRldi0+dmJsX3BlbmRpbmctLTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZkZXYtPnZibF9sb2NrLCBmbGFncyApOworfQorRVhQT1JUX1NZTUJPTChkcm1fdmJsX3NlbmRfc2lnbmFscyk7CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDZmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qKgorICogXGZpbGUgZHJtX2xvY2suaCAKKyAqIElPQ1RMcyBmb3IgbG9ja2luZworICogCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IFR1ZSBGZWIgIDIgMDg6Mzc6NTQgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKworLyoqIAorICogTG9jayBpb2N0bC4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LCBwb2ludGluZyB0byBhIGRybV9sb2NrIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIEFkZCB0aGUgY3VycmVudCB0YXNrIHRvIHRoZSBsb2NrIHdhaXQgcXVldWUsIGFuZCBhdHRlbXB0IHRvIHRha2UgdG8gbG9jay4KKyAqLworaW50IGRybV9sb2NrKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworICAgICAgICBkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworICAgICAgICBkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKyAgICAgICAgREVDTEFSRV9XQUlUUVVFVUUoIGVudHJ5LCBjdXJyZW50ICk7CisgICAgICAgIGRybV9sb2NrX3QgbG9jazsKKyAgICAgICAgaW50IHJldCA9IDA7CisKKwkrK3ByaXYtPmxvY2tfY291bnQ7CisKKyAgICAgICAgaWYgKCBjb3B5X2Zyb21fdXNlciggJmxvY2ssIChkcm1fbG9ja190IF9fdXNlciAqKWFyZywgc2l6ZW9mKGxvY2spICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworICAgICAgICBpZiAoIGxvY2suY29udGV4dCA9PSBEUk1fS0VSTkVMX0NPTlRFWFQgKSB7CisgICAgICAgICAgICAgICAgRFJNX0VSUk9SKCAiUHJvY2VzcyAlZCB1c2luZyBrZXJuZWwgY29udGV4dCAlZFxuIiwKKwkJCSAgIGN1cnJlbnQtPnBpZCwgbG9jay5jb250ZXh0ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBEUk1fREVCVUcoICIlZCAocGlkICVkKSByZXF1ZXN0cyBsb2NrICgweCUwOHgpLCBmbGFncyA9IDB4JTA4eFxuIiwKKwkJICAgbG9jay5jb250ZXh0LCBjdXJyZW50LT5waWQsCisJCSAgIGRldi0+bG9jay5od19sb2NrLT5sb2NrLCBsb2NrLmZsYWdzICk7CisKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9ETUFfUVVFVUUpKQorCQlpZiAoIGxvY2suY29udGV4dCA8IDAgKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZGRfd2FpdF9xdWV1ZSggJmRldi0+bG9jay5sb2NrX3F1ZXVlLCAmZW50cnkgKTsKKwlmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKCAhZGV2LT5sb2NrLmh3X2xvY2sgKSB7CisJCQkvKiBEZXZpY2UgaGFzIGJlZW4gdW5yZWdpc3RlcmVkICovCisJCQlyZXQgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIGRybV9sb2NrX3Rha2UoICZkZXYtPmxvY2suaHdfbG9jay0+bG9jaywKKwkJCQkgICAgIGxvY2suY29udGV4dCApICkgeworCQkJZGV2LT5sb2NrLmZpbHAgICAgICA9IGZpbHA7CisJCQlkZXYtPmxvY2subG9ja190aW1lID0gamlmZmllczsKKwkJCWF0b21pY19pbmMoICZkZXYtPmNvdW50c1tfRFJNX1NUQVRfTE9DS1NdICk7CisJCQlicmVhazsgIC8qIEdvdCBsb2NrICovCisJCX0KKwkJCisJCS8qIENvbnRlbnRpb24gKi8KKwkJc2NoZWR1bGUoKTsKKwkJaWYgKCBzaWduYWxfcGVuZGluZyggY3VycmVudCApICkgeworCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCAmZGV2LT5sb2NrLmxvY2tfcXVldWUsICZlbnRyeSApOworCisJc2lnZW1wdHlzZXQoICZkZXYtPnNpZ21hc2sgKTsKKwlzaWdhZGRzZXQoICZkZXYtPnNpZ21hc2ssIFNJR1NUT1AgKTsKKwlzaWdhZGRzZXQoICZkZXYtPnNpZ21hc2ssIFNJR1RTVFAgKTsKKwlzaWdhZGRzZXQoICZkZXYtPnNpZ21hc2ssIFNJR1RUSU4gKTsKKwlzaWdhZGRzZXQoICZkZXYtPnNpZ21hc2ssIFNJR1RUT1UgKTsKKwlkZXYtPnNpZ2RhdGEuY29udGV4dCA9IGxvY2suY29udGV4dDsKKwlkZXYtPnNpZ2RhdGEubG9jayAgICA9IGRldi0+bG9jay5od19sb2NrOworCWJsb2NrX2FsbF9zaWduYWxzKCBkcm1fbm90aWZpZXIsCisJCQkgICAmZGV2LT5zaWdkYXRhLCAmZGV2LT5zaWdtYXNrICk7CisJCisJaWYgKGRldi0+ZHJpdmVyLT5kbWFfcmVhZHkgJiYgKGxvY2suZmxhZ3MgJiBfRFJNX0xPQ0tfUkVBRFkpKQorCQlkZXYtPmRyaXZlci0+ZG1hX3JlYWR5KGRldik7CisJCisJaWYgKCBkZXYtPmRyaXZlci0+ZG1hX3F1aWVzY2VudCAmJiAobG9jay5mbGFncyAmIF9EUk1fTE9DS19RVUlFU0NFTlQgKSkKKwkJcmV0dXJuIGRldi0+ZHJpdmVyLT5kbWFfcXVpZXNjZW50KGRldik7CisJCisJLyogZGV2LT5kcml2ZXItPmtlcm5lbF9jb250ZXh0X3N3aXRjaCBpc24ndCB1c2VkIGJ5IGFueSBvZiB0aGUgeDg2IAorCSAqICBkcml2ZXJzIGJ1dCBpcyB1c2VkIGJ5IHRoZSBTcGFyYyBkcml2ZXIuCisJICovCisJCisJaWYgKGRldi0+ZHJpdmVyLT5rZXJuZWxfY29udGV4dF9zd2l0Y2ggJiYgCisJICAgIGRldi0+bGFzdF9jb250ZXh0ICE9IGxvY2suY29udGV4dCkgeworCSAgZGV2LT5kcml2ZXItPmtlcm5lbF9jb250ZXh0X3N3aXRjaChkZXYsIGRldi0+bGFzdF9jb250ZXh0LCAKKwkJCQkJICAgIGxvY2suY29udGV4dCk7CisJfQorICAgICAgICBEUk1fREVCVUcoICIlZCAlc1xuIiwgbG9jay5jb250ZXh0LCByZXQgPyAiaW50ZXJydXB0ZWQiIDogImhhcyBsb2NrIiApOworCisgICAgICAgIHJldHVybiByZXQ7Cit9CisKKy8qKiAKKyAqIFVubG9jayBpb2N0bC4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LCBwb2ludGluZyB0byBhIGRybV9sb2NrIHN0cnVjdHVyZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIFRyYW5zZmVyIGFuZCBmcmVlIHRoZSBsb2NrLgorICovCitpbnQgZHJtX3VubG9jayggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fbG9ja190IGxvY2s7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmbG9jaywgKGRybV9sb2NrX3QgX191c2VyICopYXJnLCBzaXplb2YobG9jaykgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCBsb2NrLmNvbnRleHQgPT0gRFJNX0tFUk5FTF9DT05URVhUICkgeworCQlEUk1fRVJST1IoICJQcm9jZXNzICVkIHVzaW5nIGtlcm5lbCBjb250ZXh0ICVkXG4iLAorCQkJICAgY3VycmVudC0+cGlkLCBsb2NrLmNvbnRleHQgKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXRvbWljX2luYyggJmRldi0+Y291bnRzW19EUk1fU1RBVF9VTkxPQ0tTXSApOworCisJLyoga2VybmVsX2NvbnRleHRfc3dpdGNoIGlzbid0IHVzZWQgYnkgYW55IG9mIHRoZSB4ODYgZHJtCisJICogbW9kdWxlcyBidXQgaXMgcmVxdWlyZWQgYnkgdGhlIFNwYXJjIGRyaXZlci4KKwkgKi8KKwlpZiAoZGV2LT5kcml2ZXItPmtlcm5lbF9jb250ZXh0X3N3aXRjaF91bmxvY2spCisJCWRldi0+ZHJpdmVyLT5rZXJuZWxfY29udGV4dF9zd2l0Y2hfdW5sb2NrKGRldiwgJmxvY2spOworCWVsc2UgeworCQlkcm1fbG9ja190cmFuc2ZlciggZGV2LCAmZGV2LT5sb2NrLmh3X2xvY2stPmxvY2ssIAorCQkJCSAgICBEUk1fS0VSTkVMX0NPTlRFWFQgKTsKKwkJCisJCWlmICggZHJtX2xvY2tfZnJlZSggZGV2LCAmZGV2LT5sb2NrLmh3X2xvY2stPmxvY2ssCisJCQkJICAgICBEUk1fS0VSTkVMX0NPTlRFWFQgKSApIHsKKwkJCURSTV9FUlJPUiggIlxuIiApOworCQl9CisJfQorCisJdW5ibG9ja19hbGxfc2lnbmFscygpOworCXJldHVybiAwOworfQorCisvKioKKyAqIFRha2UgdGhlIGhlYXZ5d2VpZ2h0IGxvY2suCisgKgorICogXHBhcmFtIGxvY2sgbG9jayBwb2ludGVyLgorICogXHBhcmFtIGNvbnRleHQgbG9ja2luZyBjb250ZXh0LgorICogXHJldHVybiBvbmUgaWYgdGhlIGxvY2sgaXMgaGVsZCwgb3IgemVybyBvdGhlcndpc2UuCisgKgorICogQXR0ZW1wdCB0byBtYXJrIHRoZSBsb2NrIGFzIGhlbGQgYnkgdGhlIGdpdmVuIGNvbnRleHQsIHZpYSB0aGUgXHAgY21weGNoZyBpbnN0cnVjdGlvbi4KKyAqLworaW50IGRybV9sb2NrX3Rha2UoX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbG9jaywgdW5zaWduZWQgaW50IGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IG9sZCwgbmV3LCBwcmV2OworCisJZG8geworCQlvbGQgPSAqbG9jazsKKwkJaWYgKG9sZCAmIF9EUk1fTE9DS19IRUxEKSBuZXcgPSBvbGQgfCBfRFJNX0xPQ0tfQ09OVDsKKwkJZWxzZQkJCSAgbmV3ID0gY29udGV4dCB8IF9EUk1fTE9DS19IRUxEOworCQlwcmV2ID0gY21weGNoZyhsb2NrLCBvbGQsIG5ldyk7CisJfSB3aGlsZSAocHJldiAhPSBvbGQpOworCWlmIChfRFJNX0xPQ0tJTkdfQ09OVEVYVChvbGQpID09IGNvbnRleHQpIHsKKwkJaWYgKG9sZCAmIF9EUk1fTE9DS19IRUxEKSB7CisJCQlpZiAoY29udGV4dCAhPSBEUk1fS0VSTkVMX0NPTlRFWFQpIHsKKwkJCQlEUk1fRVJST1IoIiVkIGhvbGRzIGhlYXZ5d2VpZ2h0IGxvY2tcbiIsCisJCQkJCSAgY29udGV4dCk7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAobmV3ID09IChjb250ZXh0IHwgX0RSTV9MT0NLX0hFTEQpKSB7CisJCQkJLyogSGF2ZSBsb2NrICovCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBUaGlzIHRha2VzIGEgbG9jayBmb3JjaWJseSBhbmQgaGFuZHMgaXQgdG8gY29udGV4dC4JU2hvdWxkIE9OTFkgYmUgdXNlZAorICogaW5zaWRlICpfdW5sb2NrIHRvIGdpdmUgbG9jayB0byBrZXJuZWwgYmVmb3JlIGNhbGxpbmcgKl9kbWFfc2NoZWR1bGUuIAorICogCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCisgKiBccGFyYW0gbG9jayBsb2NrIHBvaW50ZXIuCisgKiBccGFyYW0gY29udGV4dCBsb2NraW5nIGNvbnRleHQuCisgKiBccmV0dXJuIGFsd2F5cyBvbmUuCisgKgorICogUmVzZXRzIHRoZSBsb2NrIGZpbGUgcG9pbnRlci4KKyAqIE1hcmtzIHRoZSBsb2NrIGFzIGhlbGQgYnkgdGhlIGdpdmVuIGNvbnRleHQsIHZpYSB0aGUgXHAgY21weGNoZyBpbnN0cnVjdGlvbi4KKyAqLworaW50IGRybV9sb2NrX3RyYW5zZmVyKGRybV9kZXZpY2VfdCAqZGV2LAorCQkgICAgICAgX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbG9jaywgdW5zaWduZWQgaW50IGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IG9sZCwgbmV3LCBwcmV2OworCisJZGV2LT5sb2NrLmZpbHAgPSBOVUxMOworCWRvIHsKKwkJb2xkICA9ICpsb2NrOworCQluZXcgID0gY29udGV4dCB8IF9EUk1fTE9DS19IRUxEOworCQlwcmV2ID0gY21weGNoZyhsb2NrLCBvbGQsIG5ldyk7CisJfSB3aGlsZSAocHJldiAhPSBvbGQpOworCXJldHVybiAxOworfQorCisvKioKKyAqIEZyZWUgbG9jay4KKyAqIAorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIGxvY2sgbG9jay4KKyAqIFxwYXJhbSBjb250ZXh0IGNvbnRleHQuCisgKiAKKyAqIFJlc2V0cyB0aGUgbG9jayBmaWxlIHBvaW50ZXIuCisgKiBNYXJrcyB0aGUgbG9jayBhcyBub3QgaGVsZCwgdmlhIHRoZSBccCBjbXB4Y2hnIGluc3RydWN0aW9uLiBXYWtlcyBhbnkgdGFzaworICogd2FpdGluZyBvbiB0aGUgbG9jayBxdWV1ZS4KKyAqLworaW50IGRybV9sb2NrX2ZyZWUoZHJtX2RldmljZV90ICpkZXYsCisJCSAgIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKmxvY2ssIHVuc2lnbmVkIGludCBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBvbGQsIG5ldywgcHJldjsKKworCWRldi0+bG9jay5maWxwID0gTlVMTDsKKwlkbyB7CisJCW9sZCAgPSAqbG9jazsKKwkJbmV3ICA9IDA7CisJCXByZXYgPSBjbXB4Y2hnKGxvY2ssIG9sZCwgbmV3KTsKKwl9IHdoaWxlIChwcmV2ICE9IG9sZCk7CisJaWYgKF9EUk1fTE9DS19JU19IRUxEKG9sZCkgJiYgX0RSTV9MT0NLSU5HX0NPTlRFWFQob2xkKSAhPSBjb250ZXh0KSB7CisJCURSTV9FUlJPUigiJWQgZnJlZWQgaGVhdnl3ZWlnaHQgbG9jayBoZWxkIGJ5ICVkXG4iLAorCQkJICBjb250ZXh0LAorCQkJICBfRFJNX0xPQ0tJTkdfQ09OVEVYVChvbGQpKTsKKwkJcmV0dXJuIDE7CisJfQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5sb2NrLmxvY2tfcXVldWUpOworCXJldHVybiAwOworfQorCisvKioKKyAqIElmIHdlIGdldCBoZXJlLCBpdCBtZWFucyB0aGF0IHRoZSBwcm9jZXNzIGhhcyBjYWxsZWQgRFJNX0lPQ1RMX0xPQ0sKKyAqIHdpdGhvdXQgY2FsbGluZyBEUk1fSU9DVExfVU5MT0NLLgorICoKKyAqIElmIHRoZSBsb2NrIGlzIG5vdCBoZWxkLCB0aGVuIGxldCB0aGUgc2lnbmFsIHByb2NlZWQgYXMgdXN1YWwuICBJZiB0aGUgbG9jaworICogaXMgaGVsZCwgdGhlbiBzZXQgdGhlIGNvbnRlbmRlZCBmbGFnIGFuZCBrZWVwIHRoZSBzaWduYWwgYmxvY2tlZC4KKyAqCisgKiBccGFyYW0gcHJpdiBwb2ludGVyIHRvIGEgZHJtX3NpZ2RhdGEgc3RydWN0dXJlLgorICogXHJldHVybiBvbmUgaWYgdGhlIHNpZ25hbCBzaG91bGQgYmUgZGVsaXZlcmVkIG5vcm1hbGx5LCBvciB6ZXJvIGlmIHRoZQorICogc2lnbmFsIHNob3VsZCBiZSBibG9ja2VkLgorICovCitpbnQgZHJtX25vdGlmaWVyKHZvaWQgKnByaXYpCit7CisJZHJtX3NpZ2RhdGFfdCAqcyA9IChkcm1fc2lnZGF0YV90ICopcHJpdjsKKwl1bnNpZ25lZCBpbnQgIG9sZCwgbmV3LCBwcmV2OworCisKKwkJCQkvKiBBbGxvdyBzaWduYWwgZGVsaXZlcnkgaWYgbG9jayBpc24ndCBoZWxkICovCisJaWYgKCFzLT5sb2NrIHx8ICFfRFJNX0xPQ0tfSVNfSEVMRChzLT5sb2NrLT5sb2NrKQorCSAgICB8fCBfRFJNX0xPQ0tJTkdfQ09OVEVYVChzLT5sb2NrLT5sb2NrKSAhPSBzLT5jb250ZXh0KSByZXR1cm4gMTsKKworCQkJCS8qIE90aGVyd2lzZSwgc2V0IGZsYWcgdG8gZm9yY2UgY2FsbCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1VbmxvY2sgKi8KKwlkbyB7CisJCW9sZCAgPSBzLT5sb2NrLT5sb2NrOworCQluZXcgID0gb2xkIHwgX0RSTV9MT0NLX0NPTlQ7CisJCXByZXYgPSBjbXB4Y2hnKCZzLT5sb2NrLT5sb2NrLCBvbGQsIG5ldyk7CisJfSB3aGlsZSAocHJldiAhPSBvbGQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjUzZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMKQEAgLTAsMCArMSwxODEgQEAKKy8qKiAKKyAqIFxmaWxlIGRybV9tZW1vcnkuaCAKKyAqIE1lbW9yeSBtYW5hZ2VtZW50IHdyYXBwZXJzIGZvciBEUk0KKyAqCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyogCisgKiBDcmVhdGVkOiBUaHUgRmViICA0IDE0OjAwOjM0IDE5OTkgYnkgZmFpdGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorCisjaWZkZWYgREVCVUdfTUVNT1JZCisjaW5jbHVkZSAiZHJtX21lbW9yeV9kZWJ1Zy5oIgorI2Vsc2UKKworLyoqIE5vLW9wLiAqLwordm9pZCBkcm1fbWVtX2luaXQodm9pZCkKK3sKK30KKworLyoqCisgKiBDYWxsZWQgd2hlbiAiL3Byb2MvZHJpLyVkZXYlL21lbSIgaXMgcmVhZC4KKyAqIAorICogXHBhcmFtIGJ1ZiBvdXRwdXQgYnVmZmVyLgorICogXHBhcmFtIHN0YXJ0IHN0YXJ0IG9mIG91dHB1dCBkYXRhLgorICogXHBhcmFtIG9mZnNldCByZXF1ZXN0ZWQgc3RhcnQgb2Zmc2V0LgorICogXHBhcmFtIGxlbiByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLgorICogXHBhcmFtIGVvZiB3aGV0aGVyIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0byByZXR1cm4uCisgKiBccGFyYW0gZGF0YSBwcml2YXRlIGRhdGEuCisgKiBccmV0dXJuIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzLgorICoKKyAqIE5vLW9wLiAKKyAqLworaW50IGRybV9tZW1faW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkgIGludCBsZW4sIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXJldHVybiAwOworfQorCisvKiogV3JhcHBlciBhcm91bmQga21hbGxvYygpICovCit2b2lkICpkcm1fY2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsIGludCBhcmVhKQoreworCXZvaWQgKmFkZHI7CisKKwlhZGRyID0ga21hbGxvYyhzaXplICogbm1lbWIsIEdGUF9LRVJORUwpOworCWlmIChhZGRyICE9IE5VTEwpCisJCW1lbXNldCgodm9pZCAqKWFkZHIsIDAsIHNpemUgKiBubWVtYik7CisKKwlyZXR1cm4gYWRkcjsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2NhbGxvYyk7CisKKy8qKiBXcmFwcGVyIGFyb3VuZCBrbWFsbG9jKCkgYW5kIGtmcmVlKCkgKi8KK3ZvaWQgKmRybV9yZWFsbG9jKHZvaWQgKm9sZHB0LCBzaXplX3Qgb2xkc2l6ZSwgc2l6ZV90IHNpemUsIGludCBhcmVhKQoreworCXZvaWQgKnB0OworCisJaWYgKCEocHQgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSkgcmV0dXJuIE5VTEw7CisJaWYgKG9sZHB0ICYmIG9sZHNpemUpIHsKKwkJbWVtY3B5KHB0LCBvbGRwdCwgb2xkc2l6ZSk7CisJCWtmcmVlKG9sZHB0KTsKKwl9CisJcmV0dXJuIHB0OworfQorCisvKioKKyAqIEFsbG9jYXRlIHBhZ2VzLgorICoKKyAqIFxwYXJhbSBvcmRlciBzaXplIG9yZGVyLgorICogXHBhcmFtIGFyZWEgbWVtb3J5IGFyZWEuIChOb3QgdXNlZC4pCisgKiBccmV0dXJuIHBhZ2UgYWRkcmVzcyBvbiBzdWNjZXNzLCBvciB6ZXJvIG9uIGZhaWx1cmUuCisgKgorICogQWxsb2NhdGUgYW5kIHJlc2VydmUgZnJlZSBwYWdlcy4KKyAqLwordW5zaWduZWQgbG9uZyBkcm1fYWxsb2NfcGFnZXMoaW50IG9yZGVyLCBpbnQgYXJlYSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBieXRlcwkgID0gUEFHRV9TSVpFIDw8IG9yZGVyOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1bnNpZ25lZCBpbnQgIHN6OworCisJYWRkcmVzcyA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXIpOworCWlmICghYWRkcmVzcykgCisJCXJldHVybiAwOworCisJCQkJLyogWmVybyAqLworCW1lbXNldCgodm9pZCAqKWFkZHJlc3MsIDAsIGJ5dGVzKTsKKworCQkJCS8qIFJlc2VydmUgKi8KKwlmb3IgKGFkZHIgPSBhZGRyZXNzLCBzeiA9IGJ5dGVzOworCSAgICAgc3ogPiAwOworCSAgICAgYWRkciArPSBQQUdFX1NJWkUsIHN6IC09IFBBR0VfU0laRSkgeworCQlTZXRQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKGFkZHIpKTsKKwl9CisKKwlyZXR1cm4gYWRkcmVzczsKK30KKworLyoqCisgKiBGcmVlIHBhZ2VzLgorICogCisgKiBccGFyYW0gYWRkcmVzcyBhZGRyZXNzIG9mIHRoZSBwYWdlcyB0byBmcmVlLgorICogXHBhcmFtIG9yZGVyIHNpemUgb3JkZXIuCisgKiBccGFyYW0gYXJlYSBtZW1vcnkgYXJlYS4gKE5vdCB1c2VkLikKKyAqCisgKiBVbnJlc2VydmUgYW5kIGZyZWUgcGFnZXMgYWxsb2NhdGVkIGJ5IGFsbG9jX3BhZ2VzKCkuCisgKi8KK3ZvaWQgZHJtX2ZyZWVfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgb3JkZXIsIGludCBhcmVhKQoreworCXVuc2lnbmVkIGxvbmcgYnl0ZXMgPSBQQUdFX1NJWkUgPDwgb3JkZXI7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGludCAgc3o7CisKKwlpZiAoIWFkZHJlc3MpIAorCQlyZXR1cm47CisKKwkvKiBVbnJlc2VydmUgKi8KKwlmb3IgKGFkZHIgPSBhZGRyZXNzLCBzeiA9IGJ5dGVzOworCSAgICAgc3ogPiAwOworCSAgICAgYWRkciArPSBQQUdFX1NJWkUsIHN6IC09IFBBR0VfU0laRSkgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoYWRkcikpOworCX0KKworCWZyZWVfcGFnZXMoYWRkcmVzcywgb3JkZXIpOworfQorCisKKyNpZiBfX09TX0hBU19BR1AKKy8qKiBXcmFwcGVyIGFyb3VuZCBhZ3BfYWxsb2NhdGVfbWVtb3J5KCkgKi8KK0RSTV9BR1BfTUVNICpkcm1fYWxsb2NfYWdwKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwgaW50IHBhZ2VzLCB1MzIgdHlwZSkKK3sKKwlyZXR1cm4gZHJtX2FncF9hbGxvY2F0ZV9tZW1vcnkoYnJpZGdlLCBwYWdlcywgdHlwZSk7Cit9CisKKy8qKiBXcmFwcGVyIGFyb3VuZCBhZ3BfZnJlZV9tZW1vcnkoKSAqLworaW50IGRybV9mcmVlX2FncChEUk1fQUdQX01FTSAqaGFuZGxlLCBpbnQgcGFnZXMpCit7CisJcmV0dXJuIGRybV9hZ3BfZnJlZV9tZW1vcnkoaGFuZGxlKSA/IDAgOiAtRUlOVkFMOworfQorCisvKiogV3JhcHBlciBhcm91bmQgYWdwX2JpbmRfbWVtb3J5KCkgKi8KK2ludCBkcm1fYmluZF9hZ3AoRFJNX0FHUF9NRU0gKmhhbmRsZSwgdW5zaWduZWQgaW50IHN0YXJ0KQoreworCXJldHVybiBkcm1fYWdwX2JpbmRfbWVtb3J5KGhhbmRsZSwgc3RhcnQpOworfQorCisvKiogV3JhcHBlciBhcm91bmQgYWdwX3VuYmluZF9tZW1vcnkoKSAqLworaW50IGRybV91bmJpbmRfYWdwKERSTV9BR1BfTUVNICpoYW5kbGUpCit7CisJcmV0dXJuIGRybV9hZ3BfdW5iaW5kX21lbW9yeShoYW5kbGUpOworfQorI2VuZGlmIC8qIGFncCAqLworI2VuZGlmIC8qIGRlYnVnX21lbW9yeSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjJiOTQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmgKQEAgLTAsMCArMSwxOTcgQEAKKy8qKiAKKyAqIFxmaWxlIGRybV9tZW1vcnkuaCAKKyAqIE1lbW9yeSBtYW5hZ2VtZW50IHdyYXBwZXJzIGZvciBEUk0KKyAqCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyogCisgKiBDcmVhdGVkOiBUaHUgRmViICA0IDE0OjAwOjM0IDE5OTkgYnkgZmFpdGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgImRybVAuaCIKKworLyoqCisgKiBDdXQgZG93biB2ZXJzaW9uIG9mIGRybV9tZW1vcnlfZGVidWcuaCwgd2hpY2ggdXNlZCB0byBiZSBjYWxsZWQKKyAqIGRybV9tZW1vcnkuaC4gIAorICovCisKKyNpZiBfX09TX0hBU19BR1AKKworI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2lmZGVmIEhBVkVfUEFHRV9BR1AKKyNpbmNsdWRlIDxhc20vYWdwLmg+CisjZWxzZQorIyBpZmRlZiBfX3Bvd2VycGNfXworIyAgZGVmaW5lIFBBR0VfQUdQCV9fcGdwcm90KF9QQUdFX0tFUk5FTCB8IF9QQUdFX05PX0NBQ0hFKQorIyBlbHNlCisjICBkZWZpbmUgUEFHRV9BR1AJUEFHRV9LRVJORUwKKyMgZW5kaWYKKyNlbmRpZgorCisvKgorICogRmluZCB0aGUgZHJtX21hcCB0aGF0IGNvdmVycyB0aGUgcmFuZ2UgW29mZnNldCwgb2Zmc2V0K3NpemUpLgorICovCitzdGF0aWMgaW5saW5lIGRybV9tYXBfdCAqCitkcm1fbG9va3VwX21hcCAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgZHJtX2RldmljZV90ICpkZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlkcm1fbWFwX2xpc3RfdCAqcl9saXN0OworCWRybV9tYXBfdCAqbWFwOworCisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CisJCXJfbGlzdCA9IChkcm1fbWFwX2xpc3RfdCAqKSBsaXN0OworCQltYXAgPSByX2xpc3QtPm1hcDsKKwkJaWYgKCFtYXApCisJCQljb250aW51ZTsKKwkJaWYgKG1hcC0+b2Zmc2V0IDw9IG9mZnNldCAmJiAob2Zmc2V0ICsgc2l6ZSkgPD0gKG1hcC0+b2Zmc2V0ICsgbWFwLT5zaXplKSkKKwkJCXJldHVybiBtYXA7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorYWdwX3JlbWFwICh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1fZGV2aWNlX3QgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nICpwaHlzX2FkZHJfbWFwLCBpLCBudW1fcGFnZXMgPSBQQUdFX0FMSUdOKHNpemUpIC8gUEFHRV9TSVpFOworCXN0cnVjdCBkcm1fYWdwX21lbSAqYWdwbWVtOworCXN0cnVjdCBwYWdlICoqcGFnZV9tYXA7CisJdm9pZCAqYWRkcjsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCisjaWZkZWYgX19hbHBoYV9fCisJb2Zmc2V0IC09IGRldi0+aG9zZS0+bWVtX3NwYWNlLT5zdGFydDsKKyNlbmRpZgorCisJZm9yIChhZ3BtZW0gPSBkZXYtPmFncC0+bWVtb3J5OyBhZ3BtZW07IGFncG1lbSA9IGFncG1lbS0+bmV4dCkKKwkJaWYgKGFncG1lbS0+Ym91bmQgPD0gb2Zmc2V0CisJCSAgICAmJiAoYWdwbWVtLT5ib3VuZCArIChhZ3BtZW0tPnBhZ2VzIDw8IFBBR0VfU0hJRlQpKSA+PSAob2Zmc2V0ICsgc2l6ZSkpCisJCQlicmVhazsKKwlpZiAoIWFncG1lbSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIE9LLCB3ZSdyZSBtYXBwaW5nIEFHUCBzcGFjZSBvbiBhIGNoaXBzZXQvcGxhdGZvcm0gb24gd2hpY2ggbWVtb3J5IGFjY2Vzc2VzIGJ5CisJICogdGhlIENQVSBkbyBub3QgZ2V0IHJlbWFwcGVkIGJ5IHRoZSBHQVJULiAgV2UgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGtlcm5lbCdzCisJICogcGFnZS10YWJsZSBpbnN0ZWFkICh0aGF0J3MgcHJvYmFibHkgZmFzdGVyIGFueWhvdy4uLikuCisJICovCisJLyogbm90ZTogdXNlIHZtYWxsb2MoKSBiZWNhdXNlIG51bV9wYWdlcyBjb3VsZCBiZSBsYXJnZS4uLiAqLworCXBhZ2VfbWFwID0gdm1hbGxvYyhudW1fcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKikpOworCWlmICghcGFnZV9tYXApCisJCXJldHVybiBOVUxMOworCisJcGh5c19hZGRyX21hcCA9IGFncG1lbS0+bWVtb3J5LT5tZW1vcnkgKyAob2Zmc2V0IC0gYWdwbWVtLT5ib3VuZCkgLyBQQUdFX1NJWkU7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgKytpKQorCQlwYWdlX21hcFtpXSA9IHBmbl90b19wYWdlKHBoeXNfYWRkcl9tYXBbaV0gPj4gUEFHRV9TSElGVCk7CisJYWRkciA9IHZtYXAocGFnZV9tYXAsIG51bV9wYWdlcywgVk1fSU9SRU1BUCwgUEFHRV9BR1ApOworCXZmcmVlKHBhZ2VfbWFwKTsKKworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK2RybV9mb2xsb3dfcGFnZSAodm9pZCAqdmFkZHIpCit7CisJcGdkX3QgKnBnZCA9IHBnZF9vZmZzZXRfaygodW5zaWduZWQgbG9uZykgdmFkZHIpOworCXB1ZF90ICpwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgKHVuc2lnbmVkIGxvbmcpIHZhZGRyKTsKKwlwbWRfdCAqcG1kID0gcG1kX29mZnNldChwdWQsICh1bnNpZ25lZCBsb25nKSB2YWRkcik7CisJcHRlX3QgKnB0ZXAgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsICh1bnNpZ25lZCBsb25nKSB2YWRkcik7CisJcmV0dXJuIHB0ZV9wZm4oKnB0ZXApIDw8IFBBR0VfU0hJRlQ7Cit9CisKKyNlbHNlIC8qIF9fT1NfSEFTX0FHUCAqLworCitzdGF0aWMgaW5saW5lIGRybV9tYXBfdCAqZHJtX2xvb2t1cF9tYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgZHJtX2RldmljZV90ICpkZXYpCit7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmFncF9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1fZGV2aWNlX3QgKmRldikKK3sKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkcm1fZm9sbG93X3BhZ2UgKHZvaWQgKnZhZGRyKQoreworICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZHJtX2lvcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgZHJtX2RldmljZV90ICpkZXYpCit7CisJaWYgKGRybV9jb3JlX2hhc19BR1AoZGV2KSAmJiBkZXYtPmFncCAmJiBkZXYtPmFncC0+Y2FudF91c2VfYXBlcnR1cmUpIHsKKwkJZHJtX21hcF90ICptYXAgPSBkcm1fbG9va3VwX21hcChvZmZzZXQsIHNpemUsIGRldik7CisKKwkJaWYgKG1hcCAmJiBtYXAtPnR5cGUgPT0gX0RSTV9BR1ApCisJCQlyZXR1cm4gYWdwX3JlbWFwKG9mZnNldCwgc2l6ZSwgZGV2KTsKKwl9CisJcmV0dXJuIGlvcmVtYXAob2Zmc2V0LCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpkcm1faW9yZW1hcF9ub2NhY2hlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCWRybV9kZXZpY2VfdCAqZGV2KQoreworCWlmIChkcm1fY29yZV9oYXNfQUdQKGRldikgJiYgZGV2LT5hZ3AgJiYgZGV2LT5hZ3AtPmNhbnRfdXNlX2FwZXJ0dXJlKSB7CisJCWRybV9tYXBfdCAqbWFwID0gZHJtX2xvb2t1cF9tYXAob2Zmc2V0LCBzaXplLCBkZXYpOworCisJCWlmIChtYXAgJiYgbWFwLT50eXBlID09IF9EUk1fQUdQKQorCQkJcmV0dXJuIGFncF9yZW1hcChvZmZzZXQsIHNpemUsIGRldik7CisJfQorCXJldHVybiBpb3JlbWFwX25vY2FjaGUob2Zmc2V0LCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRybV9pb3JlbWFwZnJlZSh2b2lkICpwdCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1fZGV2aWNlX3QgKmRldikKK3sKKwkvKgorCSAqIFRoaXMgaXMgYSBiaXQgdWdseS4gIEl0IHdvdWxkIGJlIG11Y2ggY2xlYW5lciBpZiB0aGUgRFJNIEFQSSB3b3VsZCB1c2Ugc2VwYXJhdGUKKwkgKiByb3V0aW5lcyBmb3IgaGFuZGxpbmcgbWFwcGluZ3MgaW4gdGhlIEFHUCBzcGFjZS4gIEhvcGVmdWxseSB0aGlzIGNhbiBiZSBkb25lIGluCisJICogYSBmdXR1cmUgcmV2aXNpb24gb2YgdGhlIGludGVyZmFjZS4uLgorCSAqLworCWlmIChkcm1fY29yZV9oYXNfQUdQKGRldikgJiYgZGV2LT5hZ3AgJiYgZGV2LT5hZ3AtPmNhbnRfdXNlX2FwZXJ0dXJlCisJICAgICYmICgodW5zaWduZWQgbG9uZykgcHQgPj0gVk1BTExPQ19TVEFSVCAmJiAodW5zaWduZWQgbG9uZykgcHQgPCBWTUFMTE9DX0VORCkpCisJeworCQl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwkJZHJtX21hcF90ICptYXA7CisKKwkJb2Zmc2V0ID0gZHJtX2ZvbGxvd19wYWdlKHB0KSB8ICgodW5zaWduZWQgbG9uZykgcHQgJiB+UEFHRV9NQVNLKTsKKwkJbWFwID0gZHJtX2xvb2t1cF9tYXAob2Zmc2V0LCBzaXplLCBkZXYpOworCQlpZiAobWFwICYmIG1hcC0+dHlwZSA9PSBfRFJNX0FHUCkgeworCQkJdnVubWFwKHB0KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWlvdW5tYXAocHQpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeV9kZWJ1Zy5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5X2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM4MmU2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeV9kZWJ1Zy5oCkBAIC0wLDAgKzEsNDU5IEBACisvKioKKyAqIFxmaWxlIGRybV9tZW1vcnkuaCAKKyAqIE1lbW9yeSBtYW5hZ2VtZW50IHdyYXBwZXJzIGZvciBEUk0uCisgKgorICogXGF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqIFxhdXRob3IgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisKK3R5cGVkZWYgc3RydWN0IGRybV9tZW1fc3RhdHMgeworCWNvbnN0IGNoYXIJICAqbmFtZTsKKwlpbnQJCSAgc3VjY2VlZF9jb3VudDsKKwlpbnQJCSAgZnJlZV9jb3VudDsKKwlpbnQJCSAgZmFpbF9jb3VudDsKKwl1bnNpZ25lZCBsb25nCSAgYnl0ZXNfYWxsb2NhdGVkOworCXVuc2lnbmVkIGxvbmcJICBieXRlc19mcmVlZDsKK30gZHJtX21lbV9zdGF0c190OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKERSTShtZW1fbG9jaykpOworc3RhdGljIHVuc2lnbmVkIGxvbmcJICBEUk0ocmFtX2F2YWlsYWJsZSkgPSAwOyAvKiBJbiBwYWdlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcJICBEUk0ocmFtX3VzZWQpICAgICAgPSAwOworc3RhdGljIGRybV9tZW1fc3RhdHNfdAkgIERSTShtZW1fc3RhdHMpW10gICA9IHsKKwlbRFJNX01FTV9ETUFdCSAgICA9IHsgImRtYWJ1ZnMiICB9LAorCVtEUk1fTUVNX1NBUkVBXQkgICAgPSB7ICJzYXJlYXMiICAgfSwKKwlbRFJNX01FTV9EUklWRVJdICAgID0geyAiZHJpdmVyIiAgIH0sCisJW0RSTV9NRU1fTUFHSUNdCSAgICA9IHsgIm1hZ2ljIgkgICB9LAorCVtEUk1fTUVNX0lPQ1RMU10gICAgPSB7ICJpb2N0bHRhYiIgfSwKKwlbRFJNX01FTV9NQVBTXQkgICAgPSB7ICJtYXBsaXN0IiAgfSwKKwlbRFJNX01FTV9WTUFTXQkgICAgPSB7ICJ2bWFsaXN0IiAgfSwKKwlbRFJNX01FTV9CVUZTXQkgICAgPSB7ICJidWZsaXN0IiAgfSwKKwlbRFJNX01FTV9TRUdTXQkgICAgPSB7ICJzZWdsaXN0IiAgfSwKKwlbRFJNX01FTV9QQUdFU10JICAgID0geyAicGFnZWxpc3QiIH0sCisJW0RSTV9NRU1fRklMRVNdCSAgICA9IHsgImZpbGVzIgkgICB9LAorCVtEUk1fTUVNX1FVRVVFU10gICAgPSB7ICJxdWV1ZXMiICAgfSwKKwlbRFJNX01FTV9DTURTXQkgICAgPSB7ICJjb21tYW5kcyIgfSwKKwlbRFJNX01FTV9NQVBQSU5HU10gID0geyAibWFwcGluZ3MiIH0sCisJW0RSTV9NRU1fQlVGTElTVFNdICA9IHsgImJ1Zmxpc3RzIiB9LAorCVtEUk1fTUVNX0FHUExJU1RTXSAgPSB7ICJhZ3BsaXN0IiAgfSwKKwlbRFJNX01FTV9TR0xJU1RTXSAgID0geyAic2dsaXN0IiAgIH0sCisJW0RSTV9NRU1fVE9UQUxBR1BdICA9IHsgInRvdGFsYWdwIiB9LAorCVtEUk1fTUVNX0JPVU5EQUdQXSAgPSB7ICJib3VuZGFncCIgfSwKKwlbRFJNX01FTV9DVFhCSVRNQVBdID0geyAiY3R4Yml0bWFwIn0sCisJW0RSTV9NRU1fQ1RYTElTVF0gICA9IHsgImN0eGxpc3QiICB9LAorCVtEUk1fTUVNX1NUVUJdICAgICAgPSB7ICJzdHViIiAgICAgfSwKKwl7IE5VTEwsIDAsIH0JCS8qIExhc3QgZW50cnkgbXVzdCBiZSBudWxsICovCit9OworCit2b2lkIERSTShtZW1faW5pdCkodm9pZCkKK3sKKwlkcm1fbWVtX3N0YXRzX3QgKm1lbTsKKwlzdHJ1Y3Qgc3lzaW5mbwlzaTsKKworCWZvciAobWVtID0gRFJNKG1lbV9zdGF0cyk7IG1lbS0+bmFtZTsgKyttZW0pIHsKKwkJbWVtLT5zdWNjZWVkX2NvdW50ICAgPSAwOworCQltZW0tPmZyZWVfY291bnQJICAgICA9IDA7CisJCW1lbS0+ZmFpbF9jb3VudAkgICAgID0gMDsKKwkJbWVtLT5ieXRlc19hbGxvY2F0ZWQgPSAwOworCQltZW0tPmJ5dGVzX2ZyZWVkICAgICA9IDA7CisJfQorCisJc2lfbWVtaW5mbygmc2kpOworCURSTShyYW1fYXZhaWxhYmxlKSA9IHNpLnRvdGFscmFtOworCURSTShyYW1fdXNlZCkJICAgPSAwOworfQorCisvKiBkcm1fbWVtX2luZm8gaXMgY2FsbGVkIHdoZW5ldmVyIGEgcHJvY2VzcyByZWFkcyAvZGV2L2RybS9tZW0uICovCisKK3N0YXRpYyBpbnQgRFJNKF9tZW1faW5mbykoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSAgaW50IHJlcXVlc3QsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWRybV9tZW1fc3RhdHNfdCAqcHQ7CisJaW50ICAgICAgICAgICAgIGxlbiA9IDA7CisKKwlpZiAob2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCSplb2YgICA9IDA7CisJKnN0YXJ0ID0gJmJ1ZltvZmZzZXRdOworCisJRFJNX1BST0NfUFJJTlQoIgkJICB0b3RhbCBjb3VudHMJCQkiCisJCSAgICAgICAiIHwgICAgb3V0c3RhbmRpbmcgIFxuIik7CisJRFJNX1BST0NfUFJJTlQoInR5cGUJICAgYWxsb2MgZnJlZWQgZmFpbAlieXRlcwkgICBmcmVlZCIKKwkJICAgICAgICIgfCBhbGxvY3MgICAgICBieXRlc1xuXG4iKTsKKwlEUk1fUFJPQ19QUklOVCgiJS05LjlzICU1ZCAlNWQgJTRkICUxMGx1IGtCICAgICAgICAgfFxuIiwKKwkJICAgICAgICJzeXN0ZW0iLCAwLCAwLCAwLAorCQkgICAgICAgRFJNKHJhbV9hdmFpbGFibGUpIDw8IChQQUdFX1NISUZUIC0gMTApKTsKKwlEUk1fUFJPQ19QUklOVCgiJS05LjlzICU1ZCAlNWQgJTRkICUxMGx1IGtCICAgICAgICAgfFxuIiwKKwkJICAgICAgICJsb2NrZWQiLCAwLCAwLCAwLCBEUk0ocmFtX3VzZWQpID4+IDEwKTsKKwlEUk1fUFJPQ19QUklOVCgiXG4iKTsKKwlmb3IgKHB0ID0gRFJNKG1lbV9zdGF0cyk7IHB0LT5uYW1lOyBwdCsrKSB7CisJCURSTV9QUk9DX1BSSU5UKCIlLTkuOXMgJTVkICU1ZCAlNGQgJTEwbHUgJTEwbHUgfCAlNmQgJTEwbGRcbiIsCisJCQkgICAgICAgcHQtPm5hbWUsCisJCQkgICAgICAgcHQtPnN1Y2NlZWRfY291bnQsCisJCQkgICAgICAgcHQtPmZyZWVfY291bnQsCisJCQkgICAgICAgcHQtPmZhaWxfY291bnQsCisJCQkgICAgICAgcHQtPmJ5dGVzX2FsbG9jYXRlZCwKKwkJCSAgICAgICBwdC0+Ynl0ZXNfZnJlZWQsCisJCQkgICAgICAgcHQtPnN1Y2NlZWRfY291bnQgLSBwdC0+ZnJlZV9jb3VudCwKKwkJCSAgICAgICAobG9uZylwdC0+Ynl0ZXNfYWxsb2NhdGVkCisJCQkgICAgICAgLSAobG9uZylwdC0+Ynl0ZXNfZnJlZWQpOworCX0KKworCWlmIChsZW4gPiByZXF1ZXN0ICsgb2Zmc2V0KSByZXR1cm4gcmVxdWVzdDsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuIC0gb2Zmc2V0OworfQorCitpbnQgRFJNKG1lbV9pbmZvKShjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkgIGludCBsZW4sIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCByZXQ7CisKKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCXJldCA9IERSTShfbWVtX2luZm8pKGJ1Ziwgc3RhcnQsIG9mZnNldCwgbGVuLCBlb2YsIGRhdGEpOworCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkICpEUk0oYWxsb2MpKHNpemVfdCBzaXplLCBpbnQgYXJlYSkKK3sKKwl2b2lkICpwdDsKKworCWlmICghc2l6ZSkgeworCQlEUk1fTUVNX0VSUk9SKGFyZWEsICJBbGxvY2F0aW5nIDAgYnl0ZXNcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShwdCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpKSB7CisJCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCSsrRFJNKG1lbV9zdGF0cylbYXJlYV0uZmFpbF9jb3VudDsKKwkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkrK0RSTShtZW1fc3RhdHMpW2FyZWFdLnN1Y2NlZWRfY291bnQ7CisJRFJNKG1lbV9zdGF0cylbYXJlYV0uYnl0ZXNfYWxsb2NhdGVkICs9IHNpemU7CisJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXJldHVybiBwdDsKK30KKwordm9pZCAqRFJNKGNhbGxvYykoc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpCit7CisJdm9pZCAqYWRkcjsKKworCWFkZHIgPSBEUk0oYWxsb2MpKG5tZW1iICogc2l6ZSwgYXJlYSk7CisJaWYgKGFkZHIgIT0gTlVMTCkKKwkJbWVtc2V0KCh2b2lkICopYWRkciwgMCwgc2l6ZSAqIG5tZW1iKTsKKworCXJldHVybiBhZGRyOworfQorCit2b2lkICpEUk0ocmVhbGxvYykodm9pZCAqb2xkcHQsIHNpemVfdCBvbGRzaXplLCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpCit7CisJdm9pZCAqcHQ7CisKKwlpZiAoIShwdCA9IERSTShhbGxvYykoc2l6ZSwgYXJlYSkpKSByZXR1cm4gTlVMTDsKKwlpZiAob2xkcHQgJiYgb2xkc2l6ZSkgeworCQltZW1jcHkocHQsIG9sZHB0LCBvbGRzaXplKTsKKwkJRFJNKGZyZWUpKG9sZHB0LCBvbGRzaXplLCBhcmVhKTsKKwl9CisJcmV0dXJuIHB0OworfQorCit2b2lkIERSTShmcmVlKSh2b2lkICpwdCwgc2l6ZV90IHNpemUsIGludCBhcmVhKQoreworCWludCBhbGxvY19jb3VudDsKKwlpbnQgZnJlZV9jb3VudDsKKworCWlmICghcHQpIERSTV9NRU1fRVJST1IoYXJlYSwgIkF0dGVtcHQgdG8gZnJlZSBOVUxMIHBvaW50ZXJcbiIpOworCWVsc2UJIGtmcmVlKHB0KTsKKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCURSTShtZW1fc3RhdHMpW2FyZWFdLmJ5dGVzX2ZyZWVkICs9IHNpemU7CisJZnJlZV9jb3VudCAgPSArK0RSTShtZW1fc3RhdHMpW2FyZWFdLmZyZWVfY291bnQ7CisJYWxsb2NfY291bnQgPQlEUk0obWVtX3N0YXRzKVthcmVhXS5zdWNjZWVkX2NvdW50OworCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlpZiAoZnJlZV9jb3VudCA+IGFsbG9jX2NvdW50KSB7CisJCURSTV9NRU1fRVJST1IoYXJlYSwgIkV4Y2VzcyBmcmVlczogJWQgZnJlZXMsICVkIGFsbG9jc1xuIiwKKwkJCSAgICAgIGZyZWVfY291bnQsIGFsbG9jX2NvdW50KTsKKwl9Cit9CisKK3Vuc2lnbmVkIGxvbmcgRFJNKGFsbG9jX3BhZ2VzKShpbnQgb3JkZXIsIGludCBhcmVhKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIGJ5dGVzCSAgPSBQQUdFX1NJWkUgPDwgb3JkZXI7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGludCAgc3o7CisKKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCWlmICgoRFJNKHJhbV91c2VkKSA+PiBQQUdFX1NISUZUKQorCSAgICA+IChEUk1fUkFNX1BFUkNFTlQgKiBEUk0ocmFtX2F2YWlsYWJsZSkpIC8gMTAwKSB7CisJCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkJcmV0dXJuIDA7CisJfQorCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKworCWFkZHJlc3MgPSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwlpZiAoIWFkZHJlc3MpIHsKKwkJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkJKytEUk0obWVtX3N0YXRzKVthcmVhXS5mYWlsX2NvdW50OworCQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCXJldHVybiAwOworCX0KKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCSsrRFJNKG1lbV9zdGF0cylbYXJlYV0uc3VjY2VlZF9jb3VudDsKKwlEUk0obWVtX3N0YXRzKVthcmVhXS5ieXRlc19hbGxvY2F0ZWQgKz0gYnl0ZXM7CisJRFJNKHJhbV91c2VkKQkJICAgICAgICAgICAgICs9IGJ5dGVzOworCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKworCisJCQkJLyogWmVybyBvdXRzaWRlIHRoZSBsb2NrICovCisJbWVtc2V0KCh2b2lkICopYWRkcmVzcywgMCwgYnl0ZXMpOworCisJCQkJLyogUmVzZXJ2ZSAqLworCWZvciAoYWRkciA9IGFkZHJlc3MsIHN6ID0gYnl0ZXM7CisJICAgICBzeiA+IDA7CisJICAgICBhZGRyICs9IFBBR0VfU0laRSwgc3ogLT0gUEFHRV9TSVpFKSB7CisJCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoYWRkcikpOworCX0KKworCXJldHVybiBhZGRyZXNzOworfQorCit2b2lkIERSTShmcmVlX3BhZ2VzKSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCBvcmRlciwgaW50IGFyZWEpCit7CisJdW5zaWduZWQgbG9uZyBieXRlcyA9IFBBR0VfU0laRSA8PCBvcmRlcjsKKwlpbnQJCSAgYWxsb2NfY291bnQ7CisJaW50CQkgIGZyZWVfY291bnQ7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGludCAgc3o7CisKKwlpZiAoIWFkZHJlc3MpIHsKKwkJRFJNX01FTV9FUlJPUihhcmVhLCAiQXR0ZW1wdCB0byBmcmVlIGFkZHJlc3MgMFxuIik7CisJfSBlbHNlIHsKKwkJCQkvKiBVbnJlc2VydmUgKi8KKwkJZm9yIChhZGRyID0gYWRkcmVzcywgc3ogPSBieXRlczsKKwkJICAgICBzeiA+IDA7CisJCSAgICAgYWRkciArPSBQQUdFX1NJWkUsIHN6IC09IFBBR0VfU0laRSkgeworCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKGFkZHIpKTsKKwkJfQorCQlmcmVlX3BhZ2VzKGFkZHJlc3MsIG9yZGVyKTsKKwl9CisKKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCWZyZWVfY291bnQgID0gKytEUk0obWVtX3N0YXRzKVthcmVhXS5mcmVlX2NvdW50OworCWFsbG9jX2NvdW50ID0JRFJNKG1lbV9zdGF0cylbYXJlYV0uc3VjY2VlZF9jb3VudDsKKwlEUk0obWVtX3N0YXRzKVthcmVhXS5ieXRlc19mcmVlZCArPSBieXRlczsKKwlEUk0ocmFtX3VzZWQpCQkJIC09IGJ5dGVzOworCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlpZiAoZnJlZV9jb3VudCA+IGFsbG9jX2NvdW50KSB7CisJCURSTV9NRU1fRVJST1IoYXJlYSwKKwkJCSAgICAgICJFeGNlc3MgZnJlZXM6ICVkIGZyZWVzLCAlZCBhbGxvY3NcbiIsCisJCQkgICAgICBmcmVlX2NvdW50LCBhbGxvY19jb3VudCk7CisJfQorfQorCit2b2lkICpEUk0oaW9yZW1hcCkodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgZHJtX2RldmljZV90ICpkZXYpCit7CisJdm9pZCAqcHQ7CisKKwlpZiAoIXNpemUpIHsKKwkJRFJNX01FTV9FUlJPUihEUk1fTUVNX01BUFBJTkdTLAorCQkJICAgICAgIk1hcHBpbmcgMCBieXRlcyBhdCAweCUwOGx4XG4iLCBvZmZzZXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShwdCA9IGRybV9pb3JlbWFwKG9mZnNldCwgc2l6ZSwgZGV2KSkpIHsKKwkJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkJKytEUk0obWVtX3N0YXRzKVtEUk1fTUVNX01BUFBJTkdTXS5mYWlsX2NvdW50OworCQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCXJldHVybiBOVUxMOworCX0KKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCSsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uc3VjY2VlZF9jb3VudDsKKwlEUk0obWVtX3N0YXRzKVtEUk1fTUVNX01BUFBJTkdTXS5ieXRlc19hbGxvY2F0ZWQgKz0gc2l6ZTsKKwlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJcmV0dXJuIHB0OworfQorCit2b2lkICpEUk0oaW9yZW1hcF9ub2NhY2hlKSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1fZGV2aWNlX3QgKmRldikKK3sKKwl2b2lkICpwdDsKKworCWlmICghc2l6ZSkgeworCQlEUk1fTUVNX0VSUk9SKERSTV9NRU1fTUFQUElOR1MsCisJCQkgICAgICAiTWFwcGluZyAwIGJ5dGVzIGF0IDB4JTA4bHhcbiIsIG9mZnNldCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKHB0ID0gZHJtX2lvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemUsIGRldikpKSB7CisJCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCSsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uZmFpbF9jb3VudDsKKwkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkrK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fTUFQUElOR1NdLnN1Y2NlZWRfY291bnQ7CisJRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uYnl0ZXNfYWxsb2NhdGVkICs9IHNpemU7CisJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXJldHVybiBwdDsKK30KKwordm9pZCBEUk0oaW9yZW1hcGZyZWUpKHZvaWQgKnB0LCB1bnNpZ25lZCBsb25nIHNpemUsIGRybV9kZXZpY2VfdCAqZGV2KQoreworCWludCBhbGxvY19jb3VudDsKKwlpbnQgZnJlZV9jb3VudDsKKworCWlmICghcHQpCisJCURSTV9NRU1fRVJST1IoRFJNX01FTV9NQVBQSU5HUywKKwkJCSAgICAgICJBdHRlbXB0IHRvIGZyZWUgTlVMTCBwb2ludGVyXG4iKTsKKwllbHNlCisJCWRybV9pb3JlbWFwZnJlZShwdCwgc2l6ZSwgZGV2KTsKKworCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7CisJRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uYnl0ZXNfZnJlZWQgKz0gc2l6ZTsKKwlmcmVlX2NvdW50ICA9ICsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uZnJlZV9jb3VudDsKKwlhbGxvY19jb3VudCA9CURSTShtZW1fc3RhdHMpW0RSTV9NRU1fTUFQUElOR1NdLnN1Y2NlZWRfY291bnQ7CisJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCWlmIChmcmVlX2NvdW50ID4gYWxsb2NfY291bnQpIHsKKwkJRFJNX01FTV9FUlJPUihEUk1fTUVNX01BUFBJTkdTLAorCQkJICAgICAgIkV4Y2VzcyBmcmVlczogJWQgZnJlZXMsICVkIGFsbG9jc1xuIiwKKwkJCSAgICAgIGZyZWVfY291bnQsIGFsbG9jX2NvdW50KTsKKwl9Cit9CisKKyNpZiBfX09TX0hBU19BR1AKKworRFJNX0FHUF9NRU0gKkRSTShhbGxvY19hZ3ApKGludCBwYWdlcywgdTMyIHR5cGUpCit7CisJRFJNX0FHUF9NRU0gKmhhbmRsZTsKKworCWlmICghcGFnZXMpIHsKKwkJRFJNX01FTV9FUlJPUihEUk1fTUVNX1RPVEFMQUdQLCAiQWxsb2NhdGluZyAwIHBhZ2VzXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKChoYW5kbGUgPSBEUk0oYWdwX2FsbG9jYXRlX21lbW9yeSkocGFnZXMsIHR5cGUpKSkgeworCQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCQkrK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fVE9UQUxBR1BdLnN1Y2NlZWRfY291bnQ7CisJCURSTShtZW1fc3RhdHMpW0RSTV9NRU1fVE9UQUxBR1BdLmJ5dGVzX2FsbG9jYXRlZAorCQkJKz0gcGFnZXMgPDwgUEFHRV9TSElGVDsKKwkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCQlyZXR1cm4gaGFuZGxlOworCX0KKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCSsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9UT1RBTEFHUF0uZmFpbF9jb3VudDsKKwlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBEUk0oZnJlZV9hZ3ApKERSTV9BR1BfTUVNICpoYW5kbGUsIGludCBwYWdlcykKK3sKKwlpbnQgICAgICAgICAgIGFsbG9jX2NvdW50OworCWludCAgICAgICAgICAgZnJlZV9jb3VudDsKKwlpbnQgICAgICAgICAgIHJldHZhbCA9IC1FSU5WQUw7CisKKwlpZiAoIWhhbmRsZSkgeworCQlEUk1fTUVNX0VSUk9SKERSTV9NRU1fVE9UQUxBR1AsCisJCQkgICAgICAiQXR0ZW1wdCB0byBmcmVlIE5VTEwgQUdQIGhhbmRsZVxuIik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJaWYgKERSTShhZ3BfZnJlZV9tZW1vcnkpKGhhbmRsZSkpIHsKKwkJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkJZnJlZV9jb3VudCAgPSArK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fVE9UQUxBR1BdLmZyZWVfY291bnQ7CisJCWFsbG9jX2NvdW50ID0gICBEUk0obWVtX3N0YXRzKVtEUk1fTUVNX1RPVEFMQUdQXS5zdWNjZWVkX2NvdW50OworCQlEUk0obWVtX3N0YXRzKVtEUk1fTUVNX1RPVEFMQUdQXS5ieXRlc19mcmVlZAorCQkJKz0gcGFnZXMgPDwgUEFHRV9TSElGVDsKKwkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCQlpZiAoZnJlZV9jb3VudCA+IGFsbG9jX2NvdW50KSB7CisJCQlEUk1fTUVNX0VSUk9SKERSTV9NRU1fVE9UQUxBR1AsCisJCQkJICAgICAgIkV4Y2VzcyBmcmVlczogJWQgZnJlZXMsICVkIGFsbG9jc1xuIiwKKwkJCQkgICAgICBmcmVlX2NvdW50LCBhbGxvY19jb3VudCk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBEUk0oYmluZF9hZ3ApKERSTV9BR1BfTUVNICpoYW5kbGUsIHVuc2lnbmVkIGludCBzdGFydCkKK3sKKwlpbnQgcmV0Y29kZSA9IC1FSU5WQUw7CisKKwlpZiAoIWhhbmRsZSkgeworCQlEUk1fTUVNX0VSUk9SKERSTV9NRU1fQk9VTkRBR1AsCisJCQkgICAgICAiQXR0ZW1wdCB0byBiaW5kIE5VTEwgQUdQIGhhbmRsZVxuIik7CisJCXJldHVybiByZXRjb2RlOworCX0KKworCWlmICghKHJldGNvZGUgPSBEUk0oYWdwX2JpbmRfbWVtb3J5KShoYW5kbGUsIHN0YXJ0KSkpIHsKKwkJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkJKytEUk0obWVtX3N0YXRzKVtEUk1fTUVNX0JPVU5EQUdQXS5zdWNjZWVkX2NvdW50OworCQlEUk0obWVtX3N0YXRzKVtEUk1fTUVNX0JPVU5EQUdQXS5ieXRlc19hbGxvY2F0ZWQKKwkJCSs9IGhhbmRsZS0+cGFnZV9jb3VudCA8PCBQQUdFX1NISUZUOworCQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCXJldHVybiByZXRjb2RlOworCX0KKwlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOworCSsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9CT1VOREFHUF0uZmFpbF9jb3VudDsKKwlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJcmV0dXJuIHJldGNvZGU7Cit9CisKK2ludCBEUk0odW5iaW5kX2FncCkoRFJNX0FHUF9NRU0gKmhhbmRsZSkKK3sKKwlpbnQgYWxsb2NfY291bnQ7CisJaW50IGZyZWVfY291bnQ7CisJaW50IHJldGNvZGUgPSAtRUlOVkFMOworCisJaWYgKCFoYW5kbGUpIHsKKwkJRFJNX01FTV9FUlJPUihEUk1fTUVNX0JPVU5EQUdQLAorCQkJICAgICAgIkF0dGVtcHQgdG8gdW5iaW5kIE5VTEwgQUdQIGhhbmRsZVxuIik7CisJCXJldHVybiByZXRjb2RlOworCX0KKworCWlmICgocmV0Y29kZSA9IERSTShhZ3BfdW5iaW5kX21lbW9yeSkoaGFuZGxlKSkpIHJldHVybiByZXRjb2RlOworCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7CisJZnJlZV9jb3VudCAgPSArK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fQk9VTkRBR1BdLmZyZWVfY291bnQ7CisJYWxsb2NfY291bnQgPSBEUk0obWVtX3N0YXRzKVtEUk1fTUVNX0JPVU5EQUdQXS5zdWNjZWVkX2NvdW50OworCURSTShtZW1fc3RhdHMpW0RSTV9NRU1fQk9VTkRBR1BdLmJ5dGVzX2ZyZWVkCisJCSs9IGhhbmRsZS0+cGFnZV9jb3VudCA8PCBQQUdFX1NISUZUOworCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlpZiAoZnJlZV9jb3VudCA+IGFsbG9jX2NvdW50KSB7CisJCURSTV9NRU1fRVJST1IoRFJNX01FTV9CT1VOREFHUCwKKwkJCSAgICAgICJFeGNlc3MgZnJlZXM6ICVkIGZyZWVzLCAlZCBhbGxvY3NcbiIsCisJCQkgICAgICBmcmVlX2NvdW50LCBhbGxvY19jb3VudCk7CisJfQorCXJldHVybiByZXRjb2RlOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9vc19saW51eC5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTRjZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaApAQCAtMCwwICsxLDE0OSBAQAorLyoqCisgKiBcZmlsZSBkcm1fb3NfbGludXguaAorICogT1MgYWJzdHJhY3Rpb24gbWFjcm9zLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkvKiBGb3IgdGFzayBxdWV1ZSBzdXBwb3J0ICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworLyoqIEZpbGUgcG9pbnRlciB0eXBlICovCisjZGVmaW5lIERSTUZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZpbGUgKgorLyoqIElvY3RsIGFyZ3VtZW50cyAqLworI2RlZmluZSBEUk1fSU9DVExfQVJHUwkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGRhdGEKKyNkZWZpbmUgRFJNX0VSUihkKQkJCS0oZCkKKy8qKiBDdXJyZW50IHByb2Nlc3MgSUQgKi8KKyNkZWZpbmUgRFJNX0NVUlJFTlRQSUQJCQljdXJyZW50LT5waWQKKyNkZWZpbmUgRFJNX1VERUxBWShkKQkJCXVkZWxheShkKQorLyoqIFJlYWQgYSBieXRlIGZyb20gYSBNTUlPIHJlZ2lvbiAqLworI2RlZmluZSBEUk1fUkVBRDgobWFwLCBvZmZzZXQpCQlyZWFkYigoKHZvaWQgX19pb21lbSAqKShtYXApLT5oYW5kbGUpICsgKG9mZnNldCkpCisvKiogUmVhZCBhIHdvcmQgZnJvbSBhIE1NSU8gcmVnaW9uICovCisjZGVmaW5lIERSTV9SRUFEMTYobWFwLCBvZmZzZXQpICAgICAgICAgcmVhZHcoKCh2b2lkIF9faW9tZW0gKikobWFwKS0+aGFuZGxlKSArIChvZmZzZXQpKQorLyoqIFJlYWQgYSBkd29yZCBmcm9tIGEgTU1JTyByZWdpb24gKi8KKyNkZWZpbmUgRFJNX1JFQUQzMihtYXAsIG9mZnNldCkJCXJlYWRsKCgodm9pZCBfX2lvbWVtICopKG1hcCktPmhhbmRsZSkgKyAob2Zmc2V0KSkKKy8qKiBXcml0ZSBhIGJ5dGUgaW50byBhIE1NSU8gcmVnaW9uICovCisjZGVmaW5lIERSTV9XUklURTgobWFwLCBvZmZzZXQsIHZhbCkJd3JpdGViKHZhbCwgKCh2b2lkIF9faW9tZW0gKikobWFwKS0+aGFuZGxlKSArIChvZmZzZXQpKQorLyoqIFdyaXRlIGEgd29yZCBpbnRvIGEgTU1JTyByZWdpb24gKi8KKyNkZWZpbmUgRFJNX1dSSVRFMTYobWFwLCBvZmZzZXQsIHZhbCkgICB3cml0ZXcodmFsLCAoKHZvaWQgX19pb21lbSAqKShtYXApLT5oYW5kbGUpICsgKG9mZnNldCkpCisvKiogV3JpdGUgYSBkd29yZCBpbnRvIGEgTU1JTyByZWdpb24gKi8KKyNkZWZpbmUgRFJNX1dSSVRFMzIobWFwLCBvZmZzZXQsIHZhbCkJd3JpdGVsKHZhbCwgKCh2b2lkIF9faW9tZW0gKikobWFwKS0+aGFuZGxlKSArIChvZmZzZXQpKQorLyoqIFJlYWQgbWVtb3J5IGJhcnJpZXIgKi8KKyNkZWZpbmUgRFJNX1JFQURNRU1PUllCQVJSSUVSKCkJCXJtYigpCisvKiogV3JpdGUgbWVtb3J5IGJhcnJpZXIgKi8KKyNkZWZpbmUgRFJNX1dSSVRFTUVNT1JZQkFSUklFUigpCXdtYigpCisvKiogUmVhZC93cml0ZSBtZW1vcnkgYmFycmllciAqLworI2RlZmluZSBEUk1fTUVNT1JZQkFSUklFUigpCQltYigpCisvKiogRFJNIGRldmljZSBsb2NhbCBkZWNsYXJhdGlvbiAqLworI2RlZmluZSBEUk1fREVWSUNFCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7IFwKKwkJCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+aGVhZC0+ZGV2CisKKy8qKiBJUlEgaGFuZGxlciBhcmd1bWVudHMgYW5kIHJldHVybiB0eXBlIGFuZCB2YWx1ZXMgKi8KKyNkZWZpbmUgRFJNX0lSUV9BUkdTCQlpbnQgaXJxLCB2b2lkICphcmcsIHN0cnVjdCBwdF9yZWdzICpyZWdzCisKKy8qKiBBR1AgdHlwZXMgKi8KKyNpZiBfX09TX0hBU19BR1AKKyNkZWZpbmUgRFJNX0FHUF9NRU0JCXN0cnVjdCBhZ3BfbWVtb3J5CisjZGVmaW5lIERSTV9BR1BfS0VSTgkJc3RydWN0IGFncF9rZXJuX2luZm8KKyNlbHNlCisvKiBkZWZpbmUgc29tZSBkdW1teSB0eXBlcyBmb3Igbm9uIEFHUCBzdXBwb3J0aW5nIGtlcm5lbHMgKi8KK3N0cnVjdCBub19hZ3Bfa2VybiB7CisgIHVuc2lnbmVkIGxvbmcgYXBlcl9iYXNlOworICB1bnNpZ25lZCBsb25nIGFwZXJfc2l6ZTsKK307CisjZGVmaW5lIERSTV9BR1BfTUVNICAgICAgICAgICAgIGludAorI2RlZmluZSBEUk1fQUdQX0tFUk4gICAgICAgICAgICBzdHJ1Y3Qgbm9fYWdwX2tlcm4KKyNlbmRpZgorCisjaWYgIShfX09TX0hBU19NVFJSKQorc3RhdGljIF9faW5saW5lX18gaW50IG10cnJfYWRkICh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHR5cGUsIGNoYXIgaW5jcmVtZW50KQoreworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbXRycl9kZWwgKGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXJldHVybiAtRU5PREVWOworfQorI2RlZmluZSBNVFJSX1RZUEVfV1JDT01CICAgICAxCisKKyNlbmRpZgorCisvKiogVGFzayBxdWV1ZSBoYW5kbGVyIGFyZ3VtZW50cyAqLworI2RlZmluZSBEUk1fVEFTS1FVRVVFX0FSR1MJdm9pZCAqYXJnCisKKy8qKiBGb3IgZGF0YSBnb2luZyBpbnRvIHRoZSBrZXJuZWwgdGhyb3VnaCB0aGUgaW9jdGwgYXJndW1lbnQgKi8KKyNkZWZpbmUgRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFyZzEsIGFyZzIsIGFyZzMpCVwKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCZhcmcxLCBhcmcyLCBhcmczKSApCVwKKwkJcmV0dXJuIC1FRkFVTFQKKy8qKiBGb3IgZGF0YSBnb2luZyBmcm9tIHRoZSBrZXJuZWwgdGhyb3VnaCB0aGUgaW9jdGwgYXJndW1lbnQgKi8KKyNkZWZpbmUgRFJNX0NPUFlfVE9fVVNFUl9JT0NUTChhcmcxLCBhcmcyLCBhcmczKQlcCisJaWYgKCBjb3B5X3RvX3VzZXIoYXJnMSwgJmFyZzIsIGFyZzMpICkJCVwKKwkJcmV0dXJuIC1FRkFVTFQKKy8qKiBPdGhlciBjb3B5aW5nIG9mIGRhdGEgdG8ga2VybmVsIHNwYWNlICovCisjZGVmaW5lIERSTV9DT1BZX0ZST01fVVNFUihhcmcxLCBhcmcyLCBhcmczKQkJXAorCWNvcHlfZnJvbV91c2VyKGFyZzEsIGFyZzIsIGFyZzMpCisvKiogT3RoZXIgY29weWluZyBvZiBkYXRhIGZyb20ga2VybmVsIHNwYWNlICovCisjZGVmaW5lIERSTV9DT1BZX1RPX1VTRVIoYXJnMSwgYXJnMiwgYXJnMykJCVwKKwljb3B5X3RvX3VzZXIoYXJnMSwgYXJnMiwgYXJnMykKKy8qIE1hY3JvcyBmb3IgY29weWZyb20gdXNlciwgYnV0IGNoZWNraW5nIHJlYWRhYmlsaXR5IG9ubHkgb25jZSAqLworI2RlZmluZSBEUk1fVkVSSUZZQVJFQV9SRUFEKCB1YWRkciwgc2l6ZSApIAkJXAorCShhY2Nlc3Nfb2soIFZFUklGWV9SRUFELCB1YWRkciwgc2l6ZSApID8gMCA6IC1FRkFVTFQpCisjZGVmaW5lIERSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoYXJnMSwgYXJnMiwgYXJnMykgCVwKKwlfX2NvcHlfZnJvbV91c2VyKGFyZzEsIGFyZzIsIGFyZzMpCisjZGVmaW5lIERSTV9DT1BZX1RPX1VTRVJfVU5DSEVDS0VEKGFyZzEsIGFyZzIsIGFyZzMpCVwKKwlfX2NvcHlfdG9fdXNlcihhcmcxLCBhcmcyLCBhcmczKQorI2RlZmluZSBEUk1fR0VUX1VTRVJfVU5DSEVDS0VEKHZhbCwgdWFkZHIpCQlcCisJX19nZXRfdXNlcih2YWwsIHVhZGRyKQorCisjZGVmaW5lIERSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTihfcHJpdiwgX2ZpbHApIF9wcml2ID0gX2ZpbHAtPnByaXZhdGVfZGF0YQorCisvKiogCisgKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIFNBUkVBLgorICoKKyAqIFNlYXJjaGVzIHRoZSBTQVJFQSBvbiB0aGUgbWFwcGluZyBsaXN0cyBhbmQgcG9pbnRzIGRybV9kZXZpY2U6OnNhcmVhIHRvIGl0LgorICovCisjZGVmaW5lIERSTV9HRVRTQVJFQSgpCQkJCQkJCSBcCitkbyB7IAkJCQkJCQkJCSBcCisJZHJtX21hcF9saXN0X3QgKmVudHJ5OwkJCQkJCSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeSggZW50cnksICZkZXYtPm1hcGxpc3QtPmhlYWQsIGhlYWQgKSB7CSBcCisJCWlmICggZW50cnktPm1hcCAmJgkJCQkJIFwKKwkJICAgICBlbnRyeS0+bWFwLT50eXBlID09IF9EUk1fU0hNICYmCQkJIFwKKwkJICAgICAoZW50cnktPm1hcC0+ZmxhZ3MgJiBfRFJNX0NPTlRBSU5TX0xPQ0spICkgewkgXAorCQkJZGV2X3ByaXYtPnNhcmVhID0gZW50cnktPm1hcDsJCQkgXAorIAkJCWJyZWFrOwkJCQkJCSBcCisgCQl9CQkJCQkJCSBcCisgCX0JCQkJCQkJCSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERSTV9IWiBIWgorCisjZGVmaW5lIERSTV9XQUlUX09OKCByZXQsIHF1ZXVlLCB0aW1lb3V0LCBjb25kaXRpb24gKQkJXAorZG8gewkJCQkJCQkJXAorCURFQ0xBUkVfV0FJVFFVRVVFKGVudHJ5LCBjdXJyZW50KTsJCQlcCisJdW5zaWduZWQgbG9uZyBlbmQgPSBqaWZmaWVzICsgKHRpbWVvdXQpOwkJXAorCWFkZF93YWl0X3F1ZXVlKCYocXVldWUpLCAmZW50cnkpOwkJCVwKKwkJCQkJCQkJXAorCWZvciAoOzspIHsJCQkJCQlcCisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsJXAorCQlpZiAoY29uZGl0aW9uKQkJCQkJXAorCQkJYnJlYWs7CQkJCQlcCisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGVuZCkpIHsJCVwKKwkJCXJldCA9IC1FQlVTWTsJCQkJXAorCQkJYnJlYWs7CQkJCQlcCisJCX0JCQkJCQlcCisJCXNjaGVkdWxlX3RpbWVvdXQoKEhaLzEwMCA+IDEpID8gSFovMTAwIDogMSk7CVwKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CQkJXAorCQkJcmV0ID0gLUVJTlRSOwkJCQlcCisJCQlicmVhazsJCQkJCVwKKwkJfQkJCQkJCVwKKwl9CQkJCQkJCVwKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CQkJXAorCXJlbW92ZV93YWl0X3F1ZXVlKCYocXVldWUpLCAmZW50cnkpOwkJCVwKK30gd2hpbGUgKDApCisKKworI2RlZmluZSBEUk1fV0FLRVVQKCBxdWV1ZSApIHdha2VfdXBfaW50ZXJydXB0aWJsZSggcXVldWUgKQorI2RlZmluZSBEUk1fSU5JVF9XQUlUUVVFVUUoIHF1ZXVlICkgaW5pdF93YWl0cXVldWVfaGVhZCggcXVldWUgKQorIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTJlODc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qIGRybV9wY2kuaCAtLSBQQ0kgRE1BIG1lbW9yeSBtYW5hZ2VtZW50IHdyYXBwZXJzIGZvciBEUk0gLSotIGxpbnV4LWMgLSotICovCisvKioKKyAqIFxmaWxlIGRybV9wY2kuYworICogXGJyaWVmIEZ1bmN0aW9ucyBhbmQgaW9jdGxzIHRvIG1hbmFnZSBQQ0kgbWVtb3J5CisgKgorICogXHdhcm5pbmcgVGhlc2UgaW50ZXJmYWNlcyBhcmVuJ3Qgc3RhYmxlIHlldC4KKyAqCisgKiBcdG9kbyBJbXBsZW1lbnQgdGhlIHJlbWFpbmluZyBpb2N0bCdzIGZvciB0aGUgUENJIHBvb2xzLgorICogXHRvZG8gVGhlIHdyYXBwZXJzIGhlcmUgYXJlIHNvIHRoaW4gdGhhdCB0aGV5IHdvdWxkIGJlIGJldHRlciBvZmYgaW5saW5lZC4uCisgKgorICogXGF1dGhvciBKb3NlIEZvbnNlY2EgPGpyZm9uc2VjYUB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqIFxhdXRob3IgTGVpZiBEZWxnYXNzIDxsZGVsZ2Fzc0ByZXRpbmFsYnVybi5uZXQ+CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAyMDAzIEpvc++/vUZvbnNlY2EuCisgKiBDb3B5cmlnaHQgMjAwMyBMZWlmIERlbGdhc3MuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFxuYW1lIFBDSSBtZW1vcnkgKi8KKy8qQHsqLworCisvKioKKyAqIFxicmllZiBBbGxvY2F0ZSBhIFBDSSBjb25zaXN0ZW50IG1lbW9yeSBibG9jaywgZm9yIERNQS4KKyAqLwordm9pZCAqZHJtX3BjaV9hbGxvYyhkcm1fZGV2aWNlX3QgKiBkZXYsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sCisJCSAgICBkbWFfYWRkcl90IG1heGFkZHIsIGRtYV9hZGRyX3QgKiBidXNhZGRyKQoreworCXZvaWQgKmFkZHJlc3M7CisjaWYgRFJNX0RFQlVHX01FTU9SWQorCWludCBhcmVhID0gRFJNX01FTV9ETUE7CisKKwlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJaWYgKChkcm1fcmFtX3VzZWQgPj4gUEFHRV9TSElGVCkKKwkgICAgPiAoRFJNX1JBTV9QRVJDRU5UICogZHJtX3JhbV9hdmFpbGFibGUpIC8gMTAwKSB7CisJCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CisjZW5kaWYKKworCS8qIHBjaV9hbGxvY19jb25zaXN0ZW50IG9ubHkgZ3VhcmFudGVlcyBhbGlnbm1lbnQgdG8gdGhlIHNtYWxsZXN0CisJICogUEFHRV9TSVpFIG9yZGVyIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcmVxdWVzdGVkIHNpemUuCisJICogUmV0dXJuIE5VTEwgaGVyZSBmb3Igbm93IHRvIG1ha2Ugc3VyZSBub2JvZHkgdHJpZXMgZm9yIGxhcmdlciBhbGlnbm1lbnQKKwkgKi8KKwlpZiAoYWxpZ24gPiBzaXplKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKGRldi0+cGRldiwgbWF4YWRkcikgIT0gMCkgeworCQlEUk1fRVJST1IoIlNldHRpbmcgcGNpIGRtYSBtYXNrIGZhaWxlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWFkZHJlc3MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemUsIGJ1c2FkZHIpOworCisjaWYgRFJNX0RFQlVHX01FTU9SWQorCWlmIChhZGRyZXNzID09IE5VTEwpIHsKKwkJc3Bpbl9sb2NrKCZkcm1fbWVtX2xvY2spOworCQkrK2RybV9tZW1fc3RhdHNbYXJlYV0uZmFpbF9jb3VudDsKKwkJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwkrK2RybV9tZW1fc3RhdHNbYXJlYV0uc3VjY2VlZF9jb3VudDsKKwlkcm1fbWVtX3N0YXRzW2FyZWFdLmJ5dGVzX2FsbG9jYXRlZCArPSBzaXplOworCWRybV9yYW1fdXNlZCArPSBzaXplOworCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOworI2Vsc2UKKwlpZiAoYWRkcmVzcyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKyNlbmRpZgorCisJbWVtc2V0KGFkZHJlc3MsIDAsIHNpemUpOworCisJcmV0dXJuIGFkZHJlc3M7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9wY2lfYWxsb2MpOworCisvKioKKyAqIFxicmllZiBGcmVlIGEgUENJIGNvbnNpc3RlbnQgbWVtb3J5IGJsb2NrLgorICovCit2b2lkCitkcm1fcGNpX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgYnVzYWRkcikKK3sKKyNpZiBEUk1fREVCVUdfTUVNT1JZCisJaW50IGFyZWEgPSBEUk1fTUVNX0RNQTsKKwlpbnQgYWxsb2NfY291bnQ7CisJaW50IGZyZWVfY291bnQ7CisjZW5kaWYKKworCWlmICghdmFkZHIpIHsKKyNpZiBEUk1fREVCVUdfTUVNT1JZCisJCURSTV9NRU1fRVJST1IoYXJlYSwgIkF0dGVtcHQgdG8gZnJlZSBhZGRyZXNzIDBcbiIpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemUsIHZhZGRyLCBidXNhZGRyKTsKKwl9CisKKyNpZiBEUk1fREVCVUdfTUVNT1JZCisJc3Bpbl9sb2NrKCZkcm1fbWVtX2xvY2spOworCWZyZWVfY291bnQgPSArK2RybV9tZW1fc3RhdHNbYXJlYV0uZnJlZV9jb3VudDsKKwlhbGxvY19jb3VudCA9IGRybV9tZW1fc3RhdHNbYXJlYV0uc3VjY2VlZF9jb3VudDsKKwlkcm1fbWVtX3N0YXRzW2FyZWFdLmJ5dGVzX2ZyZWVkICs9IHNpemU7CisJZHJtX3JhbV91c2VkIC09IHNpemU7CisJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CisJaWYgKGZyZWVfY291bnQgPiBhbGxvY19jb3VudCkgeworCQlEUk1fTUVNX0VSUk9SKGFyZWEsCisJCQkgICAgICAiRXhjZXNzIGZyZWVzOiAlZCBmcmVlcywgJWQgYWxsb2NzXG4iLAorCQkJICAgICAgZnJlZV9jb3VudCwgYWxsb2NfY291bnQpOworCX0KKyNlbmRpZgorCit9CitFWFBPUlRfU1lNQk9MKGRybV9wY2lfZnJlZSk7CisKKy8qQH0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2lpZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGEyOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgICBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQgZnJvbSB0aGUgZHJtX3BjaWlkcy50eHQgaW4gdGhlIERSTSBDVlMKKyAgIFBsZWFzZSBjb250YWN0IGRyaS1kZXZlbEBsaXN0cy5zZi5uZXQgdG8gYWRkIG5ldyBjYXJkcyB0byB0aGlzIGxpc3QKKyovCisjZGVmaW5lIHJhZGVvbl9QQ0lfSURTIFwKKwl7MHgxMDAyLCAweDQxMzYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlMxMDB8Q0hJUF9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg0MTM3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTMjAwfENISVBfSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4NDE0NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMzAwfSwgXAorCXsweDEwMDIsIDB4NDE0NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMzAwfSwgXAorCXsweDEwMDIsIDB4NDE0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMzAwfSwgXAorCXsweDEwMDIsIDB4NDE0NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMzAwfSwgXAorCXsweDEwMDIsIDB4NDE1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjM1MH0sIFwKKwl7MHgxMDAyLCAweDQxNTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB9LCBcCisJezB4MTAwMiwgMHg0MTUyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMzUwfSwgXAorCXsweDEwMDIsIDB4NDE1MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjM1MH0sIFwKKwl7MHgxMDAyLCAweDQxNTQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB9LCBcCisJezB4MTAwMiwgMHg0MTU2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMzUwfSwgXAorCXsweDEwMDIsIDB4NDIzNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzI1MHxDSElQX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDQyNDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDQyNDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDQzMzYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlMxMDB8Q0hJUF9JU19JR1B8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDQzMzcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlMyMDB8Q0hJUF9JU19JR1B8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDQ0MzcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlMyNTB8Q0hJUF9JU19JR1B8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDQ5NjQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MH0sIFwKKwl7MHgxMDAyLCAweDQ5NjUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MH0sIFwKKwl7MHgxMDAyLCAweDQ5NjYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MH0sIFwKKwl7MHgxMDAyLCAweDQ5NjcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MH0sIFwKKwl7MHgxMDAyLCAweDRDNTcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyMDB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDRDNTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyMDB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDRDNTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYxMDB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDRDNUEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYxMDB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDRDNjQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MHxDSElQX0lTX01PQklMSVRZfSwgXAorCXsweDEwMDIsIDB4NEM2NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMjUwfENISVBfSVNfTU9CSUxJVFl9LCBcCisJezB4MTAwMiwgMHg0QzY2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyNTB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDRDNjcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MHxDSElQX0lTX01PQklMSVRZfSwgXAorCXsweDEwMDIsIDB4NEU1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjM1MHxDSElQX0lTX01PQklMSVRZfSwgXAorCXsweDEwMDIsIDB4NTE0NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMTAwfENISVBfU0lOR0xFX0NSVEN9LCBcCisJezB4MTAwMiwgMHg1MTQ1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IxMDB8Q0hJUF9TSU5HTEVfQ1JUQ30sIFwKKwl7MHgxMDAyLCAweDUxNDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjEwMHxDSElQX1NJTkdMRV9DUlRDfSwgXAorCXsweDEwMDIsIDB4NTE0NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMTAwfENISVBfU0lOR0xFX0NSVEN9LCBcCisJezB4MTAwMiwgMHg1MTQ4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTQ5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTRBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTRCLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTRDLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTRELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTRFLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTRGLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyMDB9LCBcCisJezB4MTAwMiwgMHg1MTU3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjAwfSwgXAorCXsweDEwMDIsIDB4NTE1OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjIwMH0sIFwKKwl7MHgxMDAyLCAweDUxNTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYxMDB9LCBcCisJezB4MTAwMiwgMHg1MTVBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMTAwfSwgXAorCXsweDEwMDIsIDB4NTE1RSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjEwMH0sIFwKKwl7MHgxMDAyLCAweDUxNjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDUxNjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDUxNkEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDUxNkIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDUxNkMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDU4MzQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlMzMDB8Q0hJUF9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg1ODM1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTMzAwfENISVBfSVNfSUdQfENISVBfSVNfTU9CSUxJVFl9LCBcCisJezB4MTAwMiwgMHg1ODM2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTMzAwfENISVBfSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4NTgzNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzMwMHxDSElQX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDU5NjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyODB9LCBcCisJezB4MTAwMiwgMHg1OTYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfSwgXAorCXsweDEwMDIsIDB4NTk2MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjI4MH0sIFwKKwl7MHgxMDAyLCAweDU5NjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyODB9LCBcCisJezB4MTAwMiwgMHg1OTY0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfSwgXAorCXsweDEwMDIsIDB4NTk2OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjI4MH0sIFwKKwl7MHgxMDAyLCAweDU5NjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYxMDB9LCBcCisJezB4MTAwMiwgMHg1OTZBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfSwgXAorCXsweDEwMDIsIDB4NTk2QiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjI4MH0sIFwKKwl7MHgxMDAyLCAweDVjNjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyODB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDVjNjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyODB9LCBcCisJezB4MTAwMiwgMHg1YzYzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfENISVBfSVNfTU9CSUxJVFl9LCBcCisJezB4MTAwMiwgMHg1YzY0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfSwgXAorCXswLCAwLCAwfQorCisjZGVmaW5lIHIxMjhfUENJX0lEUyBcCisJezB4MTAwMiwgMHg0YzQ1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NGM0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDRkNDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0ZDRjLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA0MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDQzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA0NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDQ2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA0NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDQ5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA0QSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNEIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDRDLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA0RCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNEUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDRGLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDUyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA1MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNTQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDU1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTA1NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUwNTcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MDU4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTI0NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUyNDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MjQ3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTI0YiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDUyNGMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1MzRkLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NTQ0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDU0NEMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg1NDUyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXswLCAwLCAwfQorCisjZGVmaW5lIG1nYV9QQ0lfSURTIFwKKwl7MHgxMDJiLCAweDA1MjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAyYiwgMHgwNTI1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMmIsIDB4MjUyNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKworI2RlZmluZSBtYWNoNjRfUENJX0lEUyBcCisJezB4MTAwMiwgMHg0NzQ5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NDc1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDQ3NTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0NzQyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NDc0NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDRjNDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0YzUwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NGM1MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDRjNDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0YzQ0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NDc0YywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDQ3NGYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0NzUyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NDc1MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDQ3NGQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0NzRlLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NGM1MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDAyLCAweDRjNTMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAwMiwgMHg0YzRkLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMDIsIDB4NGM0ZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKworI2RlZmluZSBzaXNkcnZfUENJX0lEUyBcCisJezB4MTAzOSwgMHgwMzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEwMzksIDB4NTMwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMDM5LCAweDYzMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAzOSwgMHg3MzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXswLCAwLCAwfQorCisjZGVmaW5lIHRkZnhfUENJX0lEUyBcCisJezB4MTIxYSwgMHgwMDAzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEyMWEsIDB4MDAwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMjFhLCAweDAwMDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTIxYSwgMHgwMDA3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDEyMWEsIDB4MDAwOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMjFhLCAweDAwMGIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezAsIDAsIDB9CisKKyNkZWZpbmUgdmlhZHJ2X1BDSV9JRFMgXAorCXsweDExMDYsIDB4MzAyMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMTA2LCAweDMxMjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTEwNiwgMHg3MjA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDExMDYsIDB4NzIwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKworI2RlZmluZSBpODEwX1BDSV9JRFMgXAorCXsweDgwODYsIDB4NzEyMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg4MDg2LCAweDcxMjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4ODA4NiwgMHg3MTI1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDgwODYsIDB4MTEzMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKworI2RlZmluZSBpODMwX1BDSV9JRFMgXAorCXsweDgwODYsIDB4MzU3NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg4MDg2LCAweDI1NjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4ODA4NiwgMHgzNTgyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDgwODYsIDB4MjU3MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKworI2RlZmluZSBnYW1tYV9QQ0lfSURTIFwKKwl7MHgzZDNkLCAweDAwMDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezAsIDAsIDB9CisKKyNkZWZpbmUgc2F2YWdlX1BDSV9JRFMgXAorCXsweDUzMzMsIDB4OGEyMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhhMjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4YzEwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGMxMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhjMTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4YzEzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGMyMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhjMjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4YzIyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGMyNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhjMjYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4YzJhLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGMyYiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhjMmMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4YzJkLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGMyZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhjMmYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4YTI1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGEyNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg1MzMzLCAweDhkMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4ZDAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDUzMzMsIDB4OGQwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKworI2RlZmluZSBmZmJfUENJX0lEUyBcCisJezAsIDAsIDB9CisKKyNkZWZpbmUgaTkxNV9QQ0lfSURTIFwKKwl7MHg4MDg2LCAweDM1NzcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4ODA4NiwgMHgyNTYyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDgwODYsIDB4MzU4MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHg4MDg2LCAweDI1NzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4ODA4NiwgMHgyNTgyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDgwODYsIDB4MjU5MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MCwgMCwgMH0KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMDZlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMKQEAgLTAsMCArMSw1MzkgQEAKKy8qKgorICogXGZpbGUgZHJtX3Byb2MuaCAKKyAqIC9wcm9jIHN1cHBvcnQgZm9yIERSTQorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqCisgKiBccGFyIEFja25vd2xlZGdlbWVudHM6CisgKiAgICBNYXR0aGV3IEogU290dGVrIDxtYXR0aGV3Lmouc290dGVrQGludGVsLmNvbT4gc2VudCBpbiBhIHBhdGNoIHRvIGZpeAorICogICAgdGhlIHByb2JsZW0gd2l0aCB0aGUgcHJvYyBmaWxlcyBub3Qgb3V0cHV0dGluZyBhbGwgdGhlaXIgaW5mb3JtYXRpb24uCisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IE1vbiBKYW4gMTEgMDk6NDg6NDcgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKworc3RhdGljIGludAkgICBkcm1fbmFtZV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkJICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludAkgICBkcm1fdm1faW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJCWludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50CSAgIGRybV9jbGllbnRzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCQkgICAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50CSAgIGRybV9xdWV1ZXNfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJCSAgICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludAkgICBkcm1fYnVmc19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkJICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworI2lmIERSTV9ERUJVR19DT0RFCitzdGF0aWMgaW50CSAgIGRybV92bWFfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJCSBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworI2VuZGlmCisKKy8qKgorICogUHJvYyBmaWxlIGxpc3QuCisgKi8KK3N0cnVjdCBkcm1fcHJvY19saXN0IHsKKwljb25zdCBjaGFyICpuYW1lOwkvKio8IGZpbGUgbmFtZSAqLworCWludAkgICAoKmYpKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CS8qKjwgcHJvYyBjYWxsYmFjayovCit9IGRybV9wcm9jX2xpc3RbXSA9IHsKKwl7ICJuYW1lIiwgICAgZHJtX25hbWVfaW5mbyAgICB9LAorCXsgIm1lbSIsICAgICBkcm1fbWVtX2luZm8gICAgIH0sCisJeyAidm0iLAkgICAgIGRybV92bV9pbmZvICAgICAgfSwKKwl7ICJjbGllbnRzIiwgZHJtX2NsaWVudHNfaW5mbyB9LAorCXsgInF1ZXVlcyIsICBkcm1fcXVldWVzX2luZm8gIH0sCisJeyAiYnVmcyIsICAgIGRybV9idWZzX2luZm8gICAgfSwKKyNpZiBEUk1fREVCVUdfQ09ERQorCXsgInZtYSIsICAgICBkcm1fdm1hX2luZm8gICAgIH0sCisjZW5kaWYKK307CisjZGVmaW5lIERSTV9QUk9DX0VOVFJJRVMgKHNpemVvZihkcm1fcHJvY19saXN0KS9zaXplb2YoZHJtX3Byb2NfbGlzdFswXSkpCisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgRFJJIHByb2MgZmlsZXN5c3RlbSBmb3IgYSBkZXZpY2UuCisgKgorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgorICogXHBhcmFtIG1pbm9yIGRldmljZSBtaW5vciBudW1iZXIuCisgKiBccGFyYW0gcm9vdCBEUkkgcHJvYyBkaXIgZW50cnkuCisgKiBccGFyYW0gZGV2X3Jvb3QgcmVzdWx0aW5nIERSSSBkZXZpY2UgcHJvYyBkaXIgZW50cnkuCisgKiBccmV0dXJuIHJvb3QgZW50cnkgcG9pbnRlciBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuCisgKiAKKyAqIENyZWF0ZSB0aGUgRFJJIHByb2Mgcm9vdCBlbnRyeSAiL3Byb2MvZHJpIiwgdGhlIGRldmljZSBwcm9jIHJvb3QgZW50cnkKKyAqICIvcHJvYy9kcmkvJW1pbm9yJS8iLCBhbmQgZWFjaCBlbnRyeSBpbiBwcm9jX2xpc3QgYXMKKyAqICIvcHJvYy9kcmkvJW1pbm9yJS8lbmFtZSUiLgorICovCitpbnQgZHJtX3Byb2NfaW5pdChkcm1fZGV2aWNlX3QgKmRldiwgaW50IG1pbm9yLAorCQkgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LAorCQkgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqZGV2X3Jvb3QpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisJaW50CQkgICAgICBpLCBqOworCWNoYXIgICAgICAgICAgICAgICAgICBuYW1lWzY0XTsKKworCXNwcmludGYobmFtZSwgIiVkIiwgbWlub3IpOworCSpkZXZfcm9vdCA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIFNfSUZESVIsIHJvb3QpOworCWlmICghKmRldl9yb290KSB7CisJCURSTV9FUlJPUigiQ2Fubm90IGNyZWF0ZSAvcHJvYy9kcmkvJXNcbiIsIG5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IERSTV9QUk9DX0VOVFJJRVM7IGkrKykgeworCQllbnQgPSBjcmVhdGVfcHJvY19lbnRyeShkcm1fcHJvY19saXN0W2ldLm5hbWUsCisJCQkJCVNfSUZSRUd8U19JUlVHTywgKmRldl9yb290KTsKKwkJaWYgKCFlbnQpIHsKKwkJCURSTV9FUlJPUigiQ2Fubm90IGNyZWF0ZSAvcHJvYy9kcmkvJXMvJXNcbiIsCisJCQkJICBuYW1lLCBkcm1fcHJvY19saXN0W2ldLm5hbWUpOworCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJCQlyZW1vdmVfcHJvY19lbnRyeShkcm1fcHJvY19saXN0W2ldLm5hbWUsCisJCQkJCQkgICpkZXZfcm9vdCk7CisJCQlyZW1vdmVfcHJvY19lbnRyeShuYW1lLCByb290KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQllbnQtPnJlYWRfcHJvYyA9IGRybV9wcm9jX2xpc3RbaV0uZjsKKwkJZW50LT5kYXRhICAgICAgPSBkZXY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBDbGVhbnVwIHRoZSBwcm9jIGZpbGVzeXN0ZW0gcmVzb3VyY2VzLgorICoKKyAqIFxwYXJhbSBtaW5vciBkZXZpY2UgbWlub3IgbnVtYmVyLgorICogXHBhcmFtIHJvb3QgRFJJIHByb2MgZGlyIGVudHJ5LgorICogXHBhcmFtIGRldl9yb290IERSSSBkZXZpY2UgcHJvYyBkaXIgZW50cnkuCisgKiBccmV0dXJuIGFsd2F5cyB6ZXJvLgorICoKKyAqIFJlbW92ZSBhbGwgcHJvYyBlbnRyaWVzIGNyZWF0ZWQgYnkgcHJvY19pbml0KCkuCisgKi8KK2ludCBkcm1fcHJvY19jbGVhbnVwKGludCBtaW5vciwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LAorCQkgICAgICBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRldl9yb290KQoreworCWludCAgaTsKKwljaGFyIG5hbWVbNjRdOworCisJaWYgKCFyb290IHx8ICFkZXZfcm9vdCkgcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFJNX1BST0NfRU5UUklFUzsgaSsrKQorCQlyZW1vdmVfcHJvY19lbnRyeShkcm1fcHJvY19saXN0W2ldLm5hbWUsIGRldl9yb290KTsKKwlzcHJpbnRmKG5hbWUsICIlZCIsIG1pbm9yKTsKKwlyZW1vdmVfcHJvY19lbnRyeShuYW1lLCByb290KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIENhbGxlZCB3aGVuICIvcHJvYy9kcmkvLi4uL25hbWUiIGlzIHJlYWQuCisgKiAKKyAqIFxwYXJhbSBidWYgb3V0cHV0IGJ1ZmZlci4KKyAqIFxwYXJhbSBzdGFydCBzdGFydCBvZiBvdXRwdXQgZGF0YS4KKyAqIFxwYXJhbSBvZmZzZXQgcmVxdWVzdGVkIHN0YXJ0IG9mZnNldC4KKyAqIFxwYXJhbSByZXF1ZXN0IHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMuCisgKiBccGFyYW0gZW9mIHdoZXRoZXIgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHRvIHJldHVybi4KKyAqIFxwYXJhbSBkYXRhIHByaXZhdGUgZGF0YS4KKyAqIFxyZXR1cm4gbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMuCisgKiAKKyAqIFByaW50cyB0aGUgZGV2aWNlIG5hbWUgdG9nZXRoZXIgd2l0aCB0aGUgYnVzIGlkIGlmIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGludCBkcm1fbmFtZV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKilkYXRhOworCWludCAgICAgICAgICBsZW4gID0gMDsKKworCWlmIChvZmZzZXQgPiBEUk1fUFJPQ19MSU1JVCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnN0YXJ0ID0gJmJ1ZltvZmZzZXRdOworCSplb2YgICA9IDA7CisKKwlpZiAoZGV2LT51bmlxdWUpIHsKKwkJRFJNX1BST0NfUFJJTlQoIiVzICVzICVzXG4iLAorCQkJICAgICAgIGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUsIHBjaV9uYW1lKGRldi0+cGRldiksIGRldi0+dW5pcXVlKTsKKwl9IGVsc2UgeworCQlEUk1fUFJPQ19QUklOVCgiJXMgJXNcbiIsIGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUsIHBjaV9uYW1lKGRldi0+cGRldikpOworCX0KKworCWlmIChsZW4gPiByZXF1ZXN0ICsgb2Zmc2V0KSByZXR1cm4gcmVxdWVzdDsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuIC0gb2Zmc2V0OworfQorCisvKioKKyAqIENhbGxlZCB3aGVuICIvcHJvYy9kcmkvLi4uL3ZtIiBpcyByZWFkLgorICogCisgKiBccGFyYW0gYnVmIG91dHB1dCBidWZmZXIuCisgKiBccGFyYW0gc3RhcnQgc3RhcnQgb2Ygb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gb2Zmc2V0IHJlcXVlc3RlZCBzdGFydCBvZmZzZXQuCisgKiBccGFyYW0gcmVxdWVzdCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLgorICogXHBhcmFtIGVvZiB3aGV0aGVyIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0byByZXR1cm4uCisgKiBccGFyYW0gZGF0YSBwcml2YXRlIGRhdGEuCisgKiBccmV0dXJuIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzLgorICogCisgKiBQcmludHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIG1hcHBpbmdzIGluIGRybV9kZXZpY2U6Om1hcGxpc3QuCisgKi8KK3N0YXRpYyBpbnQgZHJtX192bV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAorCQkJIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKWRhdGE7CisJaW50ICAgICAgICAgIGxlbiAgPSAwOworCWRybV9tYXBfdCAgICAqbWFwOworCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworCQkJCS8qIEhhcmRjb2RlZCBmcm9tIF9EUk1fRlJBTUVfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRFJNX1JFR0lTVEVSUywgX0RSTV9TSE0sIF9EUk1fQUdQLCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RSTV9TQ0FUVEVSX0dBVEhFUi4gKi8KKwljb25zdCBjaGFyICAgKnR5cGVzW10gPSB7ICJGQiIsICJSRUciLCAiU0hNIiwgIkFHUCIsICJTRyIgfTsKKwljb25zdCBjaGFyICAgKnR5cGU7CisJaW50CSAgICAgaTsKKworCWlmIChvZmZzZXQgPiBEUk1fUFJPQ19MSU1JVCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnN0YXJ0ID0gJmJ1ZltvZmZzZXRdOworCSplb2YgICA9IDA7CisKKwlEUk1fUFJPQ19QUklOVCgic2xvdAkgb2Zmc2V0CSAgICAgIHNpemUgdHlwZSBmbGFncwkgIgorCQkgICAgICAgImFkZHJlc3MgbXRyclxuXG4iKTsKKwlpID0gMDsKKwlpZiAoZGV2LT5tYXBsaXN0ICE9IE5VTEwpIGxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwkJbWFwID0gcl9saXN0LT5tYXA7CisJCWlmKCFtYXApIGNvbnRpbnVlOworCQlpZiAobWFwLT50eXBlIDwgMCB8fCBtYXAtPnR5cGUgPiA0KSB0eXBlID0gIj8/IjsKKwkJZWxzZQkJCQkgICAgdHlwZSA9IHR5cGVzW21hcC0+dHlwZV07CisJCURSTV9QUk9DX1BSSU5UKCIlNGQgMHglMDhseCAweCUwOGx4ICU0LjRzICAweCUwMnggMHglMDhseCAiLAorCQkJICAgICAgIGksCisJCQkgICAgICAgbWFwLT5vZmZzZXQsCisJCQkgICAgICAgbWFwLT5zaXplLAorCQkJICAgICAgIHR5cGUsCisJCQkgICAgICAgbWFwLT5mbGFncywKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyltYXAtPmhhbmRsZSk7CisJCWlmIChtYXAtPm10cnIgPCAwKSB7CisJCQlEUk1fUFJPQ19QUklOVCgibm9uZVxuIik7CisJCX0gZWxzZSB7CisJCQlEUk1fUFJPQ19QUklOVCgiJTRkXG4iLCBtYXAtPm10cnIpOworCQl9CisJCWkrKzsKKwl9CisKKwlpZiAobGVuID4gcmVxdWVzdCArIG9mZnNldCkgcmV0dXJuIHJlcXVlc3Q7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbiAtIG9mZnNldDsKK30KKworLyoqCisgKiBTaW1wbHkgY2FsbHMgX3ZtX2luZm8oKSB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3Rfc2VtIGxvY2suCisgKi8KK3N0YXRpYyBpbnQgZHJtX3ZtX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCisJCQlpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKilkYXRhOworCWludAkgICAgIHJldDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJcmV0ID0gZHJtX192bV9pbmZvKGJ1Ziwgc3RhcnQsIG9mZnNldCwgcmVxdWVzdCwgZW9mLCBkYXRhKTsKKwl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIENhbGxlZCB3aGVuICIvcHJvYy9kcmkvLi4uL3F1ZXVlcyIgaXMgcmVhZC4KKyAqIAorICogXHBhcmFtIGJ1ZiBvdXRwdXQgYnVmZmVyLgorICogXHBhcmFtIHN0YXJ0IHN0YXJ0IG9mIG91dHB1dCBkYXRhLgorICogXHBhcmFtIG9mZnNldCByZXF1ZXN0ZWQgc3RhcnQgb2Zmc2V0LgorICogXHBhcmFtIHJlcXVlc3QgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcy4KKyAqIFxwYXJhbSBlb2Ygd2hldGhlciB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8gcmV0dXJuLgorICogXHBhcmFtIGRhdGEgcHJpdmF0ZSBkYXRhLgorICogXHJldHVybiBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcy4KKyAqLworc3RhdGljIGludCBkcm1fX3F1ZXVlc19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKilkYXRhOworCWludCAgICAgICAgICBsZW4gID0gMDsKKwlpbnQJICAgICBpOworCWRybV9xdWV1ZV90ICAqcTsKKworCWlmIChvZmZzZXQgPiBEUk1fUFJPQ19MSU1JVCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnN0YXJ0ID0gJmJ1ZltvZmZzZXRdOworCSplb2YgICA9IDA7CisKKwlEUk1fUFJPQ19QUklOVCgiICBjdHgvZmxhZ3MgICB1c2UgICBmaW4iCisJCSAgICAgICAiICAgYmxrL3J3L3J3ZiAgd2FpdCAgICBmbHVzaGVkCSAgIHF1ZXVlZCIKKwkJICAgICAgICIgICAgICBsb2Nrc1xuXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5xdWV1ZV9jb3VudDsgaSsrKSB7CisJCXEgPSBkZXYtPnF1ZXVlbGlzdFtpXTsKKwkJYXRvbWljX2luYygmcS0+dXNlX2NvdW50KTsKKwkJRFJNX1BST0NfUFJJTlRfUkVUKGF0b21pY19kZWMoJnEtPnVzZV9jb3VudCksCisJCQkJICAgIiU1ZC8weCUwM3ggJTVkICU1ZCIKKwkJCQkgICAiICU1ZC8lYyVjLyVjJWMlYyAlNVpkXG4iLAorCQkJCSAgIGksCisJCQkJICAgcS0+ZmxhZ3MsCisJCQkJICAgYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCksCisJCQkJICAgYXRvbWljX3JlYWQoJnEtPmZpbmFsaXphdGlvbiksCisJCQkJICAgYXRvbWljX3JlYWQoJnEtPmJsb2NrX2NvdW50KSwKKwkJCQkgICBhdG9taWNfcmVhZCgmcS0+YmxvY2tfcmVhZCkgPyAncicgOiAnLScsCisJCQkJICAgYXRvbWljX3JlYWQoJnEtPmJsb2NrX3dyaXRlKSA/ICd3JyA6ICctJywKKwkJCQkgICB3YWl0cXVldWVfYWN0aXZlKCZxLT5yZWFkX3F1ZXVlKSA/ICdyJzonLScsCisJCQkJICAgd2FpdHF1ZXVlX2FjdGl2ZSgmcS0+d3JpdGVfcXVldWUpID8gJ3cnOictJywKKwkJCQkgICB3YWl0cXVldWVfYWN0aXZlKCZxLT5mbHVzaF9xdWV1ZSkgPyAnZic6Jy0nLAorCQkJCSAgIERSTV9CVUZDT1VOVCgmcS0+d2FpdGxpc3QpKTsKKwkJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKwl9CisKKwlpZiAobGVuID4gcmVxdWVzdCArIG9mZnNldCkgcmV0dXJuIHJlcXVlc3Q7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbiAtIG9mZnNldDsKK30KKworLyoqCisgKiBTaW1wbHkgY2FsbHMgX3F1ZXVlc19pbmZvKCkgd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6c3RydWN0X3NlbSBsb2NrLgorICovCitzdGF0aWMgaW50IGRybV9xdWV1ZXNfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKKwkJCSAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKilkYXRhOworCWludAkgICAgIHJldDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJcmV0ID0gZHJtX19xdWV1ZXNfaW5mbyhidWYsIHN0YXJ0LCBvZmZzZXQsIHJlcXVlc3QsIGVvZiwgZGF0YSk7CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBDYWxsZWQgd2hlbiAiL3Byb2MvZHJpLy4uLi9idWZzIiBpcyByZWFkLgorICogCisgKiBccGFyYW0gYnVmIG91dHB1dCBidWZmZXIuCisgKiBccGFyYW0gc3RhcnQgc3RhcnQgb2Ygb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gb2Zmc2V0IHJlcXVlc3RlZCBzdGFydCBvZmZzZXQuCisgKiBccGFyYW0gcmVxdWVzdCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLgorICogXHBhcmFtIGVvZiB3aGV0aGVyIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0byByZXR1cm4uCisgKiBccGFyYW0gZGF0YSBwcml2YXRlIGRhdGEuCisgKiBccmV0dXJuIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzLgorICovCitzdGF0aWMgaW50IGRybV9fYnVmc19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAorCQkJICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJZHJtX2RldmljZV90CSAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKWRhdGE7CisJaW50ICAgICAgICAgICAgICBsZW4gID0gMDsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlpbnQJCSBpOworCisJaWYgKCFkbWEgfHwgb2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCSpzdGFydCA9ICZidWZbb2Zmc2V0XTsKKwkqZW9mICAgPSAwOworCisJRFJNX1BST0NfUFJJTlQoIiBvICAgICBzaXplIGNvdW50ICBmcmVlCSBzZWdzIHBhZ2VzICAgIGtCXG5cbiIpOworCWZvciAoaSA9IDA7IGkgPD0gRFJNX01BWF9PUkRFUjsgaSsrKSB7CisJCWlmIChkbWEtPmJ1ZnNbaV0uYnVmX2NvdW50KQorCQkJRFJNX1BST0NfUFJJTlQoIiUyZCAlOGQgJTVkICU1ZCAlNWQgJTVkICU1bGRcbiIsCisJCQkJICAgICAgIGksCisJCQkJICAgICAgIGRtYS0+YnVmc1tpXS5idWZfc2l6ZSwKKwkJCQkgICAgICAgZG1hLT5idWZzW2ldLmJ1Zl9jb3VudCwKKwkJCQkgICAgICAgYXRvbWljX3JlYWQoJmRtYS0+YnVmc1tpXQorCQkJCQkJICAgLmZyZWVsaXN0LmNvdW50KSwKKwkJCQkgICAgICAgZG1hLT5idWZzW2ldLnNlZ19jb3VudCwKKwkJCQkgICAgICAgZG1hLT5idWZzW2ldLnNlZ19jb3VudAorCQkJCSAgICAgICAqKDEgPDwgZG1hLT5idWZzW2ldLnBhZ2Vfb3JkZXIpLAorCQkJCSAgICAgICAoZG1hLT5idWZzW2ldLnNlZ19jb3VudAorCQkJCQkqICgxIDw8IGRtYS0+YnVmc1tpXS5wYWdlX29yZGVyKSkKKwkJCQkgICAgICAgKiBQQUdFX1NJWkUgLyAxMDI0KTsKKwl9CisJRFJNX1BST0NfUFJJTlQoIlxuIik7CisJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkJaWYgKGkgJiYgIShpJTMyKSkgRFJNX1BST0NfUFJJTlQoIlxuIik7CisJCURSTV9QUk9DX1BSSU5UKCIgJWQiLCBkbWEtPmJ1Zmxpc3RbaV0tPmxpc3QpOworCX0KKwlEUk1fUFJPQ19QUklOVCgiXG4iKTsKKworCWlmIChsZW4gPiByZXF1ZXN0ICsgb2Zmc2V0KSByZXR1cm4gcmVxdWVzdDsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuIC0gb2Zmc2V0OworfQorCisvKioKKyAqIFNpbXBseSBjYWxscyBfYnVmc19pbmZvKCkgd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6c3RydWN0X3NlbSBsb2NrLgorICovCitzdGF0aWMgaW50IGRybV9idWZzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKWRhdGE7CisJaW50CSAgICAgcmV0OworCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlyZXQgPSBkcm1fX2J1ZnNfaW5mbyhidWYsIHN0YXJ0LCBvZmZzZXQsIHJlcXVlc3QsIGVvZiwgZGF0YSk7CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBDYWxsZWQgd2hlbiAiL3Byb2MvZHJpLy4uLi9jbGllbnRzIiBpcyByZWFkLgorICogCisgKiBccGFyYW0gYnVmIG91dHB1dCBidWZmZXIuCisgKiBccGFyYW0gc3RhcnQgc3RhcnQgb2Ygb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gb2Zmc2V0IHJlcXVlc3RlZCBzdGFydCBvZmZzZXQuCisgKiBccGFyYW0gcmVxdWVzdCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLgorICogXHBhcmFtIGVvZiB3aGV0aGVyIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0byByZXR1cm4uCisgKiBccGFyYW0gZGF0YSBwcml2YXRlIGRhdGEuCisgKiBccmV0dXJuIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzLgorICovCitzdGF0aWMgaW50IGRybV9fY2xpZW50c19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopZGF0YTsKKwlpbnQgICAgICAgICAgbGVuICA9IDA7CisJZHJtX2ZpbGVfdCAgICpwcml2OworCisJaWYgKG9mZnNldCA+IERSTV9QUk9DX0xJTUlUKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwkqc3RhcnQgPSAmYnVmW29mZnNldF07CisJKmVvZiAgID0gMDsKKworCURSTV9QUk9DX1BSSU5UKCJhIGRldglwaWQgICAgdWlkCW1hZ2ljCSAgaW9jdGxzXG5cbiIpOworCWZvciAocHJpdiA9IGRldi0+ZmlsZV9maXJzdDsgcHJpdjsgcHJpdiA9IHByaXYtPm5leHQpIHsKKwkJRFJNX1BST0NfUFJJTlQoIiVjICUzZCAlNWQgJTVkICUxMHUgJTEwbHVcbiIsCisJCQkgICAgICAgcHJpdi0+YXV0aGVudGljYXRlZCA/ICd5JyA6ICduJywKKwkJCSAgICAgICBwcml2LT5taW5vciwKKwkJCSAgICAgICBwcml2LT5waWQsCisJCQkgICAgICAgcHJpdi0+dWlkLAorCQkJICAgICAgIHByaXYtPm1hZ2ljLAorCQkJICAgICAgIHByaXYtPmlvY3RsX2NvdW50KTsKKwl9CisKKwlpZiAobGVuID4gcmVxdWVzdCArIG9mZnNldCkgcmV0dXJuIHJlcXVlc3Q7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbiAtIG9mZnNldDsKK30KKworLyoqCisgKiBTaW1wbHkgY2FsbHMgX2NsaWVudHNfaW5mbygpIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KKyAqLworc3RhdGljIGludCBkcm1fY2xpZW50c19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKilkYXRhOworCWludAkgICAgIHJldDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJcmV0ID0gZHJtX19jbGllbnRzX2luZm8oYnVmLCBzdGFydCwgb2Zmc2V0LCByZXF1ZXN0LCBlb2YsIGRhdGEpOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKyNpZiBEUk1fREVCVUdfQ09ERQorCitzdGF0aWMgaW50IGRybV9fdm1hX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWRybV9kZXZpY2VfdAkgICAgICAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKWRhdGE7CisJaW50ICAgICAgICAgICAgICAgICAgIGxlbiAgPSAwOworCWRybV92bWFfZW50cnlfdAkgICAgICAqcHQ7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisjaWYgZGVmaW5lZChfX2kzODZfXykKKwl1bnNpZ25lZCBpbnQJICAgICAgcGdwcm90OworI2VuZGlmCisKKwlpZiAob2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCSpzdGFydCA9ICZidWZbb2Zmc2V0XTsKKwkqZW9mICAgPSAwOworCisJRFJNX1BST0NfUFJJTlQoInZtYSB1c2UgY291bnQ6ICVkLCBoaWdoX21lbW9yeSA9ICVwLCAweCUwOGx4XG4iLAorCQkgICAgICAgYXRvbWljX3JlYWQoJmRldi0+dm1hX2NvdW50KSwKKwkJICAgICAgIGhpZ2hfbWVtb3J5LCB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkpKTsKKwlmb3IgKHB0ID0gZGV2LT52bWFsaXN0OyBwdDsgcHQgPSBwdC0+bmV4dCkgeworCQlpZiAoISh2bWEgPSBwdC0+dm1hKSkgY29udGludWU7CisJCURSTV9QUk9DX1BSSU5UKCJcbiU1ZCAweCUwOGx4LTB4JTA4bHggJWMlYyVjJWMlYyVjIDB4JTA4bHgiLAorCQkJICAgICAgIHB0LT5waWQsCisJCQkgICAgICAgdm1hLT52bV9zdGFydCwKKwkJCSAgICAgICB2bWEtPnZtX2VuZCwKKwkJCSAgICAgICB2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRAkgICA/ICdyJyA6ICctJywKKwkJCSAgICAgICB2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUJICAgPyAndycgOiAnLScsCisJCQkgICAgICAgdm1hLT52bV9mbGFncyAmIFZNX0VYRUMJICAgPyAneCcgOiAnLScsCisJCQkgICAgICAgdm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFID8gJ3MnIDogJ3AnLAorCQkJICAgICAgIHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQgICA/ICdsJyA6ICctJywKKwkJCSAgICAgICB2bWEtPnZtX2ZsYWdzICYgVk1fSU8JICAgPyAnaScgOiAnLScsCisJCQkgICAgICAgVk1fT0ZGU0VUKHZtYSkpOworCisjaWYgZGVmaW5lZChfX2kzODZfXykKKwkJcGdwcm90ID0gcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJCURSTV9QUk9DX1BSSU5UKCIgJWMlYyVjJWMlYyVjJWMlYyVjIiwKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9QUkVTRU5UICA/ICdwJyA6ICctJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9SVyAgICAgICA/ICd3JyA6ICdyJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9VU0VSICAgICA/ICd1JyA6ICdzJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9QV1QgICAgICA/ICd0JyA6ICdiJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9QQ0QgICAgICA/ICd1JyA6ICdjJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9BQ0NFU1NFRCA/ICdhJyA6ICctJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9ESVJUWSAgICA/ICdkJyA6ICctJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9QU0UgICAgICA/ICdtJyA6ICdrJywKKwkJCSAgICAgICBwZ3Byb3QgJiBfUEFHRV9HTE9CQUwgICA/ICdnJyA6ICdsJyApOworI2VuZGlmCisJCURSTV9QUk9DX1BSSU5UKCJcbiIpOworCX0KKworCWlmIChsZW4gPiByZXF1ZXN0ICsgb2Zmc2V0KSByZXR1cm4gcmVxdWVzdDsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuIC0gb2Zmc2V0OworfQorCitzdGF0aWMgaW50IGRybV92bWFfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKKwkJCSBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKilkYXRhOworCWludAkgICAgIHJldDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJcmV0ID0gZHJtX192bWFfaW5mbyhidWYsIHN0YXJ0LCBvZmZzZXQsIHJlcXVlc3QsIGVvZiwgZGF0YSk7CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NhcmVhLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zYXJlYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNzgyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zYXJlYS5oCkBAIC0wLDAgKzEsNzggQEAKKy8qKgorICogXGZpbGUgZHJtX3NhcmVhLmggCisgKiBcYnJpZWYgU0FSRUEgZGVmaW5pdGlvbnMKKyAqCisgKiBcYXV0aG9yIE1pY2hlbCBE5G56ZXIgPG1pY2hlbEBkYWVuemVyLm5ldD4KKyAqLworCisvKgorICogQ29weXJpZ2h0IDIwMDIgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRFJNX1NBUkVBX0hfCisjZGVmaW5lIF9EUk1fU0FSRUFfSF8KKworI2luY2x1ZGUgImRybS5oIgorCisvKiBTQVJFQSBhcmVhIG5lZWRzIHRvIGJlIGF0IGxlYXN0IGEgcGFnZSAqLworI2lmIGRlZmluZWQoX19hbHBoYV9fKQorI2RlZmluZSBTQVJFQV9NQVggICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2VsaWYgZGVmaW5lZChfX2lhNjRfXykKKyNkZWZpbmUgU0FSRUFfTUFYICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwICAgICAgICAgLyogNjRrQiAqLworI2Vsc2UKKy8qIEludGVsIDgzME0gZHJpdmVyIG5lZWRzIGF0IGxlYXN0IDhrIFNBUkVBICovCisjZGVmaW5lIFNBUkVBX01BWCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZW5kaWYKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIGRyYXdhYmxlcyBpbiB0aGUgU0FSRUEgKi8KKyNkZWZpbmUgU0FSRUFfTUFYX0RSQVdBQkxFUyAJCTI1NgorCisjZGVmaW5lIFNBUkVBX0RSQVdBQkxFX0NMQUlNRURfRU5UUlkgICAgMHg4MDAwMDAwMAorCisvKiogU0FSRUEgZHJhd2FibGUgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9zYXJlYV9kcmF3YWJsZSB7CisgICAgdW5zaWduZWQgaW50CXN0YW1wOworICAgIHVuc2lnbmVkIGludAlmbGFnczsKK30gZHJtX3NhcmVhX2RyYXdhYmxlX3Q7CisKKy8qKiBTQVJFQSBmcmFtZSAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIHsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgIHg7CisgICAgdW5zaWduZWQgaW50ICAgICAgICB5OworICAgIHVuc2lnbmVkIGludCAgICAgICAgd2lkdGg7CisgICAgdW5zaWduZWQgaW50ICAgICAgICBoZWlnaHQ7CisgICAgdW5zaWduZWQgaW50ICAgICAgICBmdWxsc2NyZWVuOworfSBkcm1fc2FyZWFfZnJhbWVfdDsKKworLyoqIFNBUkVBICovCit0eXBlZGVmIHN0cnVjdCBkcm1fc2FyZWEgeworICAgIC8qKiBmaXJzdCB0aGluZyBpcyBhbHdheXMgdGhlIERSTSBsb2NraW5nIHN0cnVjdHVyZSAqLworICAgIGRybV9od19sb2NrX3QJCWxvY2s7CisgICAgLyoqIFx0b2RvIFVzZSByZWFkZXJzL3dyaXRlciBsb2NrIGZvciBkcm1fc2FyZWE6OmRyYXdhYmxlX2xvY2sgKi8KKyAgICBkcm1faHdfbG9ja190CQlkcmF3YWJsZV9sb2NrOworICAgIGRybV9zYXJlYV9kcmF3YWJsZV90CWRyYXdhYmxlVGFibGVbU0FSRUFfTUFYX0RSQVdBQkxFU107CS8qKjwgZHJhd2FibGVzICovCisgICAgZHJtX3NhcmVhX2ZyYW1lX3QJCWZyYW1lOwkvKio8IGZyYW1lICovCisgICAgZHJtX2NvbnRleHRfdAkJZHVtbXlfY29udGV4dDsKK30gZHJtX3NhcmVhX3Q7CisKKyNlbmRpZgkvKiBfRFJNX1NBUkVBX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zY2F0dGVyLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zY2F0dGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmZGRiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NjYXR0ZXIuYwpAQCAtMCwwICsxLDIzMSBAQAorLyoqCisgKiBcZmlsZSBkcm1fc2NhdHRlci5oIAorICogSU9DVExzIHRvIG1hbmFnZSBzY2F0dGVyL2dhdGhlciBtZW1vcnkKKyAqCisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ3JlYXRlZDogTW9uIERlYyAxOCAyMzoyMDo1NCAyMDAwIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorCisjZGVmaW5lIERFQlVHX1NDQVRURVIgMAorCit2b2lkIGRybV9zZ19jbGVhbnVwKCBkcm1fc2dfbWVtX3QgKmVudHJ5ICkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgaTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGVudHJ5LT5wYWdlcyA7IGkrKyApIHsKKwkJcGFnZSA9IGVudHJ5LT5wYWdlbGlzdFtpXTsKKwkJaWYgKCBwYWdlICkKKwkJCUNsZWFyUGFnZVJlc2VydmVkKCBwYWdlICk7CisJfQorCisJdmZyZWUoIGVudHJ5LT52aXJ0dWFsICk7CisKKwlkcm1fZnJlZSggZW50cnktPmJ1c2FkZHIsCisJCSAgIGVudHJ5LT5wYWdlcyAqIHNpemVvZigqZW50cnktPmJ1c2FkZHIpLAorCQkgICBEUk1fTUVNX1BBR0VTICk7CisJZHJtX2ZyZWUoIGVudHJ5LT5wYWdlbGlzdCwKKwkJICAgZW50cnktPnBhZ2VzICogc2l6ZW9mKCplbnRyeS0+cGFnZWxpc3QpLAorCQkgICBEUk1fTUVNX1BBR0VTICk7CisJZHJtX2ZyZWUoIGVudHJ5LAorCQkgICBzaXplb2YoKmVudHJ5KSwKKwkJICAgRFJNX01FTV9TR0xJU1RTICk7Cit9CisKK2ludCBkcm1fc2dfYWxsb2MoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fc2NhdHRlcl9nYXRoZXJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgcmVxdWVzdDsKKwlkcm1fc2dfbWVtX3QgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgcGFnZXMsIGksIGo7CisKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfU0cpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICggZGV2LT5zZyApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJnJlcXVlc3QsIGFyZ3AsIHNpemVvZihyZXF1ZXN0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllbnRyeSA9IGRybV9hbGxvYyggc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fU0dMSVNUUyApOworCWlmICggIWVudHJ5ICkKKwkJcmV0dXJuIC1FTk9NRU07CisKKyAgIAltZW1zZXQoIGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSApOworCisJcGFnZXMgPSAocmVxdWVzdC5zaXplICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJRFJNX0RFQlVHKCAic2cgc2l6ZT0lbGQgcGFnZXM9JWxkXG4iLCByZXF1ZXN0LnNpemUsIHBhZ2VzICk7CisKKwllbnRyeS0+cGFnZXMgPSBwYWdlczsKKwllbnRyeS0+cGFnZWxpc3QgPSBkcm1fYWxsb2MoIHBhZ2VzICogc2l6ZW9mKCplbnRyeS0+cGFnZWxpc3QpLAorCQkJCSAgICAgRFJNX01FTV9QQUdFUyApOworCWlmICggIWVudHJ5LT5wYWdlbGlzdCApIHsKKwkJZHJtX2ZyZWUoIGVudHJ5LCBzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9TR0xJU1RTICk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChlbnRyeS0+cGFnZWxpc3QsIDAsIHBhZ2VzICogc2l6ZW9mKCplbnRyeS0+cGFnZWxpc3QpKTsKKworCWVudHJ5LT5idXNhZGRyID0gZHJtX2FsbG9jKCBwYWdlcyAqIHNpemVvZigqZW50cnktPmJ1c2FkZHIpLAorCQkJCSAgICAgRFJNX01FTV9QQUdFUyApOworCWlmICggIWVudHJ5LT5idXNhZGRyICkgeworCQlkcm1fZnJlZSggZW50cnktPnBhZ2VsaXN0LAorCQkJICAgZW50cnktPnBhZ2VzICogc2l6ZW9mKCplbnRyeS0+cGFnZWxpc3QpLAorCQkJICAgRFJNX01FTV9QQUdFUyApOworCQlkcm1fZnJlZSggZW50cnksCisJCQkgICBzaXplb2YoKmVudHJ5KSwKKwkJCSAgIERSTV9NRU1fU0dMSVNUUyApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCAodm9pZCAqKWVudHJ5LT5idXNhZGRyLCAwLCBwYWdlcyAqIHNpemVvZigqZW50cnktPmJ1c2FkZHIpICk7CisKKwllbnRyeS0+dmlydHVhbCA9IHZtYWxsb2NfMzIoIHBhZ2VzIDw8IFBBR0VfU0hJRlQgKTsKKwlpZiAoICFlbnRyeS0+dmlydHVhbCApIHsKKwkJZHJtX2ZyZWUoIGVudHJ5LT5idXNhZGRyLAorCQkJICAgZW50cnktPnBhZ2VzICogc2l6ZW9mKCplbnRyeS0+YnVzYWRkciksCisJCQkgICBEUk1fTUVNX1BBR0VTICk7CisJCWRybV9mcmVlKCBlbnRyeS0+cGFnZWxpc3QsCisJCQkgICBlbnRyeS0+cGFnZXMgKiBzaXplb2YoKmVudHJ5LT5wYWdlbGlzdCksCisJCQkgICBEUk1fTUVNX1BBR0VTICk7CisJCWRybV9mcmVlKCBlbnRyeSwKKwkJCSAgIHNpemVvZigqZW50cnkpLAorCQkJICAgRFJNX01FTV9TR0xJU1RTICk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFRoaXMgYWxzbyBmb3JjZXMgdGhlIG1hcHBpbmcgb2YgQ09XIHBhZ2VzLCBzbyBvdXIgcGFnZSBsaXN0CisJICogd2lsbCBiZSB2YWxpZC4gIFBsZWFzZSBkb24ndCByZW1vdmUgaXQuLi4KKwkgKi8KKwltZW1zZXQoIGVudHJ5LT52aXJ0dWFsLCAwLCBwYWdlcyA8PCBQQUdFX1NISUZUICk7CisKKwllbnRyeS0+aGFuZGxlID0gKHVuc2lnbmVkIGxvbmcpZW50cnktPnZpcnR1YWw7CisKKwlEUk1fREVCVUcoICJzZyBhbGxvYyBoYW5kbGUgID0gJTA4bHhcbiIsIGVudHJ5LT5oYW5kbGUgKTsKKwlEUk1fREVCVUcoICJzZyBhbGxvYyB2aXJ0dWFsID0gJXBcbiIsIGVudHJ5LT52aXJ0dWFsICk7CisKKwlmb3IgKCBpID0gZW50cnktPmhhbmRsZSwgaiA9IDAgOyBqIDwgcGFnZXMgOyBpICs9IFBBR0VfU0laRSwgaisrICkgeworCQllbnRyeS0+cGFnZWxpc3Rbal0gPSB2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilpKTsKKwkJaWYgKCFlbnRyeS0+cGFnZWxpc3Rbal0pCisJCQlnb3RvIGZhaWxlZDsKKwkJU2V0UGFnZVJlc2VydmVkKGVudHJ5LT5wYWdlbGlzdFtqXSk7CisJfQorCisJcmVxdWVzdC5oYW5kbGUgPSBlbnRyeS0+aGFuZGxlOworCisJaWYgKCBjb3B5X3RvX3VzZXIoIGFyZ3AsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkgKSApIHsKKwkJZHJtX3NnX2NsZWFudXAoIGVudHJ5ICk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWRldi0+c2cgPSBlbnRyeTsKKworI2lmIERFQlVHX1NDQVRURVIKKwkvKiBWZXJpZnkgdGhhdCBlYWNoIHBhZ2UgcG9pbnRzIHRvIGl0cyB2aXJ0dWFsIGFkZHJlc3MsIGFuZCB2aWNlCisJICogdmVyc2EuCisJICovCisJeworCWludCBlcnJvciA9IDA7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBwYWdlcyA7IGkrKyApIHsKKwkJdW5zaWduZWQgbG9uZyAqdG1wOworCisJCXRtcCA9IHBhZ2VfYWRkcmVzcyggZW50cnktPnBhZ2VsaXN0W2ldICk7CisJCWZvciAoIGogPSAwIDsKKwkJICAgICAgaiA8IFBBR0VfU0laRSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSA7CisJCSAgICAgIGorKywgdG1wKysgKSB7CisJCQkqdG1wID0gMHhjYWZlYmFiZTsKKwkJfQorCQl0bXAgPSAodW5zaWduZWQgbG9uZyAqKSgodTggKillbnRyeS0+dmlydHVhbCArCisJCQkJCShQQUdFX1NJWkUgKiBpKSk7CisJCWZvciggaiA9IDAgOworCQkgICAgIGogPCBQQUdFX1NJWkUgLyBzaXplb2YodW5zaWduZWQgbG9uZykgOworCQkgICAgIGorKywgdG1wKysgKSB7CisJCQlpZiAoICp0bXAgIT0gMHhjYWZlYmFiZSAmJiBlcnJvciA9PSAwICkgeworCQkJCWVycm9yID0gMTsKKwkJCQlEUk1fRVJST1IoICJTY2F0dGVyIGFsbG9jYXRpb24gZXJyb3IsICIKKwkJCQkJICAgInBhZ2VsaXN0IGRvZXMgbm90IG1hdGNoICIKKwkJCQkJICAgInZpcnR1YWwgbWFwcGluZ1xuIiApOworCQkJfQorCQl9CisJCXRtcCA9IHBhZ2VfYWRkcmVzcyggZW50cnktPnBhZ2VsaXN0W2ldICk7CisJCWZvcihqID0gMCA7CisJCSAgICBqIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIDsKKwkJICAgIGorKywgdG1wKyspIHsKKwkJCSp0bXAgPSAwOworCQl9CisJfQorCWlmIChlcnJvciA9PSAwKQorCQlEUk1fRVJST1IoICJTY2F0dGVyIGFsbG9jYXRpb24gbWF0Y2hlcyBwYWdlbGlzdFxuIiApOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7CisKKyBmYWlsZWQ6CisJZHJtX3NnX2NsZWFudXAoIGVudHJ5ICk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK2ludCBkcm1fc2dfZnJlZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fc2NhdHRlcl9nYXRoZXJfdCByZXF1ZXN0OworCWRybV9zZ19tZW1fdCAqZW50cnk7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfU0cpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICggY29weV9mcm9tX3VzZXIoICZyZXF1ZXN0LAorCQkJICAgICAoZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgX191c2VyICopYXJnLAorCQkJICAgICBzaXplb2YocmVxdWVzdCkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJZW50cnkgPSBkZXYtPnNnOworCWRldi0+c2cgPSBOVUxMOworCisJaWYgKCAhZW50cnkgfHwgZW50cnktPmhhbmRsZSAhPSByZXF1ZXN0LmhhbmRsZSApCisJCXJldHVybiAtRUlOVkFMOworCisJRFJNX0RFQlVHKCAic2cgZnJlZSB2aXJ0dWFsICA9ICVwXG4iLCBlbnRyeS0+dmlydHVhbCApOworCisJZHJtX3NnX2NsZWFudXAoIGVudHJ5ICk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2NiZGVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCkBAIC0wLDAgKzEsMzE5IEBACisvKioKKyAqIFxmaWxlIGRybV9zdHViLmgKKyAqIFN0dWIgc3VwcG9ydAorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IEZyaSBKYW4gMTkgMTA6NDg6MzUgMjAwMSBieSBmYWl0aEBhY20ub3JnCisgKgorICogQ29weXJpZ2h0IDIwMDEgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jb3JlLmgiCisKK3Vuc2lnbmVkIGludCBkcm1fY2FyZHNfbGltaXQgPSAxNjsJLyogRW5vdWdoIGZvciBvbmUgbWFjaGluZSAqLwordW5zaWduZWQgaW50IGRybV9kZWJ1ZyA9IDA7CQkvKiAxIHRvIGVuYWJsZSBkZWJ1ZyBvdXRwdXQgKi8KK0VYUE9SVF9TWU1CT0woZHJtX2RlYnVnKTsKKworTU9EVUxFX0FVVEhPUiggQ09SRV9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggQ09SRV9ERVNDICk7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOworTU9EVUxFX1BBUk1fREVTQyhjYXJkc19saW1pdCwgIk1heGltdW0gbnVtYmVyIG9mIGdyYXBoaWNzIGNhcmRzIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGRlYnVnIG91dHB1dCIpOworCittb2R1bGVfcGFyYW1fbmFtZWQoY2FyZHNfbGltaXQsIGRybV9jYXJkc19saW1pdCwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZHJtX2RlYnVnLCBpbnQsIDA2NjYpOworCitkcm1faGVhZF90ICoqZHJtX2hlYWRzOworc3RydWN0IGRybV9zeXNmc19jbGFzcyAqZHJtX2NsYXNzOworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcm1fcHJvY19yb290OworCitzdGF0aWMgaW50IGRybV9maWxsX2luX2Rldihkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsIHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpCit7CisJaW50IHJldGNvZGU7CisKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5jb3VudF9sb2NrKTsKKwlpbml0X3RpbWVyKCAmZGV2LT50aW1lciApOworCXNlbWFfaW5pdCggJmRldi0+c3RydWN0X3NlbSwgMSApOworCXNlbWFfaW5pdCggJmRldi0+Y3R4bGlzdF9zZW0sIDEgKTsKKworCWRldi0+cGRldiAgID0gcGRldjsKKworI2lmZGVmIF9fYWxwaGFfXworCWRldi0+aG9zZSAgID0gcGRldi0+c3lzZGF0YTsKKwlkZXYtPnBjaV9kb21haW4gPSBkZXYtPmhvc2UtPmJ1cy0+bnVtYmVyOworI2Vsc2UKKwlkZXYtPnBjaV9kb21haW4gPSAwOworI2VuZGlmCisJZGV2LT5wY2lfYnVzID0gcGRldi0+YnVzLT5udW1iZXI7CisJZGV2LT5wY2lfc2xvdCA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKKwlkZXYtPnBjaV9mdW5jID0gUENJX0ZVTkMocGRldi0+ZGV2Zm4pOworCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJLyogdGhlIERSTSBoYXMgNiBiYXNpYyBjb3VudGVycyAqLworCWRldi0+Y291bnRlcnMgPSA2OworCWRldi0+dHlwZXNbMF0gID0gX0RSTV9TVEFUX0xPQ0s7CisJZGV2LT50eXBlc1sxXSAgPSBfRFJNX1NUQVRfT1BFTlM7CisJZGV2LT50eXBlc1syXSAgPSBfRFJNX1NUQVRfQ0xPU0VTOworCWRldi0+dHlwZXNbM10gID0gX0RSTV9TVEFUX0lPQ1RMUzsKKwlkZXYtPnR5cGVzWzRdICA9IF9EUk1fU1RBVF9MT0NLUzsKKwlkZXYtPnR5cGVzWzVdICA9IF9EUk1fU1RBVF9VTkxPQ0tTOworCisJZGV2LT5kcml2ZXIgPSBkcml2ZXI7CisJCisJaWYgKGRldi0+ZHJpdmVyLT5wcmVpbml0KQorCQlpZiAoKHJldGNvZGUgPSBkZXYtPmRyaXZlci0+cHJlaW5pdChkZXYsIGVudC0+ZHJpdmVyX2RhdGEpKSkKKwkJCWdvdG8gZXJyb3Jfb3V0X3VucmVnOworCisJaWYgKGRybV9jb3JlX2hhc19BR1AoZGV2KSkgeworCQlkZXYtPmFncCA9IGRybV9hZ3BfaW5pdChkZXYpOworCQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9SRVFVSVJFX0FHUCkgJiYgKGRldi0+YWdwID09IE5VTEwpKSB7CisJCQlEUk1fRVJST1IoICJDYW5ub3QgaW5pdGlhbGl6ZSB0aGUgYWdwZ2FydCBtb2R1bGUuXG4iICk7CisJCQlyZXRjb2RlID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3Jfb3V0X3VucmVnOworCQl9CisJCWlmIChkcm1fY29yZV9oYXNfTVRSUihkZXYpKSB7CisJCQlpZiAoZGV2LT5hZ3ApCisJCQkJZGV2LT5hZ3AtPmFncF9tdHJyID0gbXRycl9hZGQoIGRldi0+YWdwLT5hZ3BfaW5mby5hcGVyX2Jhc2UsCisJCQkJCQkJICAgICAgIGRldi0+YWdwLT5hZ3BfaW5mby5hcGVyX3NpemUqMTAyNCoxMDI0LAorCQkJCQkJCSAgICAgICBNVFJSX1RZUEVfV1JDT01CLAorCQkJCQkJCSAgICAgICAxICk7CisJCX0KKwl9CisKKwlyZXRjb2RlID0gZHJtX2N0eGJpdG1hcF9pbml0KCBkZXYgKTsKKwlpZiggcmV0Y29kZSApIHsKKwkJRFJNX0VSUk9SKCAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udGV4dCBiaXRtYXAuXG4iICk7CisJCWdvdG8gZXJyb3Jfb3V0X3VucmVnOworCX0KKworCXJldHVybiAwOworCQorZXJyb3Jfb3V0X3VucmVnOgorCWRybV90YWtlZG93bihkZXYpOworCXJldHVybiByZXRjb2RlOworfQorCisvKioKKyAqIEZpbGUgXGMgb3BlbiBvcGVyYXRpb24uCisgKgorICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqCisgKiBQdXRzIHRoZSBkZXYtPmZvcHMgY29ycmVzcG9uZGluZyB0byB0aGUgZGV2aWNlIG1pbm9yIG51bWJlciBpbnRvCisgKiBccCBmaWxwLCBjYWxsIHRoZSBcYyBvcGVuIG1ldGhvZCwgYW5kIHJlc3RvcmUgdGhlIGZpbGUgb3BlcmF0aW9ucy4KKyAqLworaW50IGRybV9zdHViX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJZHJtX2RldmljZV90ICpkZXYgPSBOVUxMOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJaW50IGVyciA9IC1FTk9ERVY7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb2xkX2ZvcHM7CisJCisJRFJNX0RFQlVHKCJcbiIpOworCisJaWYgKCEoKG1pbm9yID49IDApICYmIChtaW5vciA8IGRybV9jYXJkc19saW1pdCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghZHJtX2hlYWRzW21pbm9yXSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJaWYgKCEoZGV2ID0gZHJtX2hlYWRzW21pbm9yXS0+ZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvbGRfZm9wcyA9IGZpbHAtPmZfb3A7CisJZmlscC0+Zl9vcCA9IGZvcHNfZ2V0KCZkZXYtPmRyaXZlci0+Zm9wcyk7CisJaWYgKGZpbHAtPmZfb3AtPm9wZW4gJiYgKGVyciA9IGZpbHAtPmZfb3AtPm9wZW4oaW5vZGUsIGZpbHApKSkgeworCQlmb3BzX3B1dChmaWxwLT5mX29wKTsKKwkJZmlscC0+Zl9vcCA9IGZvcHNfZ2V0KG9sZF9mb3BzKTsKKwl9CisJZm9wc19wdXQob2xkX2ZvcHMpOworCisJcmV0dXJuIGVycjsKK30KKworCisvKioKKyAqIFJlZ2lzdGVyLgorICoKKyAqIFxwYXJhbSBwZGV2IC0gUENJIGRldmljZSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbSBlbnQgZW50cnkgZnJvbSB0aGUgUENJIElEIHRhYmxlIHdpdGggZGV2aWNlIHR5cGUgZmxhZ3MKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogQXR0ZW1wdCB0byBnZXRzIGludGVyIG1vZHVsZSAiZHJtIiBpbmZvcm1hdGlvbi4gSWYgd2UgYXJlIGZpcnN0CisgKiB0aGVuIHJlZ2lzdGVyIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGFuZCBpbnRlciBtb2R1bGUgaW5mb3JtYXRpb24uCisgKiBUcnkgYW5kIHJlZ2lzdGVyLCBpZiB3ZSBmYWlsIHRvIHJlZ2lzdGVyLCBiYWNrb3V0IHByZXZpb3VzIHdvcmsuCisgKi8KK2ludCBkcm1fZ2V0X2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKKwkgICAgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQoreworCWRybV9kZXZpY2VfdCAqZGV2OworCWludCByZXQ7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlkZXYgPSBkcm1fY2FsbG9jKDEsIHNpemVvZigqZGV2KSwgRFJNX01FTV9TVFVCKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKworCWlmICgocmV0ID0gZHJtX2ZpbGxfaW5fZGV2KGRldiwgcGRldiwgZW50LCBkcml2ZXIpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkRSTTogRmlsbF9pbl9kZXYgZmFpbGVkLlxuIik7CisJCWdvdG8gZXJyX2cxOworCX0KKwlpZiAoKHJldCA9IGRybV9nZXRfaGVhZChkZXYsICZkZXYtPnByaW1hcnkpKSkKKwkJZ290byBlcnJfZzE7CisKKwkvKiBwb3N0aW5pdCBpcyBhIHJlcXVpcmVkIGZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIHNpZ25vbiBiYW5uZXIgKi8KKwkvKiBkcml2ZXJzIGFkZCBzZWNvbmRhcnkgaGVhZHMgaGVyZSBpZiBuZWVkZWQgKi8KKwlpZiAoKHJldCA9IGRldi0+ZHJpdmVyLT5wb3N0aW5pdChkZXYsIGVudC0+ZHJpdmVyX2RhdGEpKSkKKwkJZ290byBlcnJfZzE7CisKKwlyZXR1cm4gMDsKKworZXJyX2cxOgorCWRybV9mcmVlKGRldiwgc2l6ZW9mKCpkZXYpLCBEUk1fTUVNX1NUVUIpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9nZXRfZGV2KTsKKworLyoqCisgKiBHZXQgYSBzZWNvbmRhcnkgbWlub3IgbnVtYmVyLgorICoKKyAqIFxwYXJhbSBkZXYgZGV2aWNlIGRhdGEgc3RydWN0dXJlCisgKiBccGFyYW0gc2VjLW1pbm9yIHN0cnVjdHVyZSB0byBob2xkIHRoZSBhc3NpZ25lZCBtaW5vcgorICogXHJldHVybiBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBTZWFyY2ggYW4gZW1wdHkgZW50cnkgYW5kIGluaXRpYWxpemUgaXQgdG8gdGhlIGdpdmVuIHBhcmFtZXRlcnMsIGFuZAorICogY3JlYXRlIHRoZSBwcm9jIGluaXQgZW50cnkgdmlhIHByb2NfaW5pdCgpLiBUaGlzIHJvdXRpbmVzIGFzc2lnbnMKKyAqIG1pbm9yIG51bWJlcnMgdG8gc2Vjb25kYXJ5IGhlYWRzIG9mIG11bHRpLWhlYWRlZCBjYXJkcworICovCitpbnQgZHJtX2dldF9oZWFkKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1faGVhZF90ICpoZWFkKQoreworCWRybV9oZWFkX3QgKipoZWFkcyA9IGRybV9oZWFkczsKKwlpbnQgcmV0OworCWludCBtaW5vcjsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWZvciAobWlub3IgPSAwOyBtaW5vciA8IGRybV9jYXJkc19saW1pdDsgbWlub3IrKywgaGVhZHMrKykgeworCQlpZiAoISpoZWFkcykgeworCQkJCisJCQkqaGVhZCA9IChkcm1faGVhZF90KSB7CisJCQkJLmRldiA9IGRldiwKKwkJCQkuZGV2aWNlID0gTUtERVYoRFJNX01BSk9SLCBtaW5vciksCisJCQkJLm1pbm9yID0gbWlub3IsCisJCQl9OworCQkJCisJCQlpZiAoKHJldCA9IGRybV9wcm9jX2luaXQoZGV2LCBtaW5vciwgZHJtX3Byb2Nfcm9vdCwgJmhlYWQtPmRldl9yb290KSkpIHsKKwkJCQlwcmludGsgKEtFUk5fRVJSICJEUk06IEZhaWxlZCB0byBpbml0aWFsaXplIC9wcm9jL2RyaS5cbiIpOworCQkJCWdvdG8gZXJyX2cxOworCQkJfQorCisJCQkKKwkJCWhlYWQtPmRldl9jbGFzcyA9IGRybV9zeXNmc19kZXZpY2VfYWRkKGRybV9jbGFzcywKKwkJCQkJCQkgICAgICAgTUtERVYoRFJNX01BSk9SLAorCQkJCQkJCQkgICAgIG1pbm9yKSwKKwkJCQkJCQkgICAgICAgJmRldi0+cGRldi0+ZGV2LAorCQkJCQkJCSAgICAgICAiY2FyZCVkIiwgbWlub3IpOworCQkJaWYgKElTX0VSUihoZWFkLT5kZXZfY2xhc3MpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJEUk06IEVycm9yIHN5c2ZzX2RldmljZV9hZGQuXG4iKTsKKwkJCQlyZXQgPSBQVFJfRVJSKGhlYWQtPmRldl9jbGFzcyk7CisJCQkJZ290byBlcnJfZzI7CisJCQl9CisJCQkqaGVhZHMgPSBoZWFkOworCisJCQlEUk1fREVCVUcoIm5ldyBtaW5vciBhc3NpZ25lZCAlZFxuIiwgbWlub3IpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJRFJNX0VSUk9SKCJvdXQgb2YgbWlub3JzXG4iKTsKKwlyZXR1cm4gLUVOT01FTTsKK2Vycl9nMjoKKwlkcm1fcHJvY19jbGVhbnVwKG1pbm9yLCBkcm1fcHJvY19yb290LCBoZWFkLT5kZXZfcm9vdCk7CitlcnJfZzE6CisJKmhlYWQgPSAoZHJtX2hlYWRfdCkgey5kZXYgPSBOVUxMfTsKKwlyZXR1cm4gcmV0OworfQorCQkKKworLyoqCisgKiBQdXQgYSBkZXZpY2UgbWlub3IgbnVtYmVyLgorICoKKyAqIFxwYXJhbSBkZXYgZGV2aWNlIGRhdGEgc3RydWN0dXJlCisgKiBccmV0dXJuIGFsd2F5cyB6ZXJvCisgKgorICogQ2xlYW5zIHVwIHRoZSBwcm9jIHJlc291cmNlcy4gSWYgaXQgaXMgdGhlIGxhc3QgbWlub3IgdGhlbiByZWxlYXNlIHRoZSBmb3JlaWduCisgKiAiZHJtIiBkYXRhLCBvdGhlcndpc2UgdW5yZWdpc3RlcnMgdGhlICJkcm0iIGRhdGEsIGZyZWVzIHRoZSBkZXYgbGlzdCBhbmQKKyAqIHVucmVnaXN0ZXJzIHRoZSBjaGFyYWN0ZXIgZGV2aWNlLgorICovCitpbnQgZHJtX3B1dF9kZXYoZHJtX2RldmljZV90ICogZGV2KQoreworCURSTV9ERUJVRygicmVsZWFzZSBwcmltYXJ5ICVzXG4iLCBkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lKTsKKworCWlmIChkZXYtPnVuaXF1ZSkgeworCQlkcm1fZnJlZShkZXYtPnVuaXF1ZSwgc3RybGVuKGRldi0+dW5pcXVlKSArIDEsIERSTV9NRU1fRFJJVkVSKTsKKwkJZGV2LT51bmlxdWUgPSBOVUxMOworCQlkZXYtPnVuaXF1ZV9sZW4gPSAwOworCX0KKwlpZiAoZGV2LT5kZXZuYW1lKSB7CisJCWRybV9mcmVlKGRldi0+ZGV2bmFtZSwgc3RybGVuKGRldi0+ZGV2bmFtZSkgKyAxLAorCQkJIERSTV9NRU1fRFJJVkVSKTsKKwkJZGV2LT5kZXZuYW1lID0gTlVMTDsKKwl9CisJZHJtX2ZyZWUoZGV2LCBzaXplb2YoKmRldiksIERSTV9NRU1fU1RVQik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUHV0IGEgc2Vjb25kYXJ5IG1pbm9yIG51bWJlci4KKyAqCisgKiBccGFyYW0gc2VjX21pbm9yIC0gc3RydWN0dXJlIHRvIGJlIHJlbGVhc2VkCisgKiBccmV0dXJuIGFsd2F5cyB6ZXJvCisgKgorICogQ2xlYW5zIHVwIHRoZSBwcm9jIHJlc291cmNlcy4gTm90IGxlZ2FsIGZvciB0aGlzIHRvIGJlIHRoZQorICogbGFzdCBtaW5vciByZWxlYXNlZC4KKyAqCisgKi8KK2ludCBkcm1fcHV0X2hlYWQoZHJtX2hlYWRfdCAqaGVhZCkKK3sKKwlpbnQgbWlub3IgPSBoZWFkLT5taW5vcjsKKwkKKwlEUk1fREVCVUcoInJlbGVhc2Ugc2Vjb25kYXJ5IG1pbm9yICVkXG4iLCBtaW5vcik7CisJCisJZHJtX3Byb2NfY2xlYW51cChtaW5vciwgZHJtX3Byb2Nfcm9vdCwgaGVhZC0+ZGV2X3Jvb3QpOworCWRybV9zeXNmc19kZXZpY2VfcmVtb3ZlKE1LREVWKERSTV9NQUpPUiwgaGVhZC0+bWlub3IpKTsKKwkKKwkqaGVhZCA9IChkcm1faGVhZF90KXsuZGV2ID0gTlVMTH07CisKKwlkcm1faGVhZHNbbWlub3JdID0gTlVMTDsKKwkKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjMTBjNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBkcm1fc3lzZnMuYyAtIE1vZGlmaWNhdGlvbnMgdG8gZHJtX3N5c2ZzX2NsYXNzLmMgdG8gc3VwcG9ydAorICogICAgICAgICAgICAgICBleHRyYSBzeXNmcyBhdHRyaWJ1dGUgZnJvbSBEUk0uIE5vcm1hbCBkcm1fc3lzZnNfY2xhc3MKKyAqICAgICAgICAgICAgICAgZG9lcyBub3QgYWxsb3cgYWRkaW5nIGF0dHJpYnV0ZXMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEpvbiBTbWlybCA8am9uc21pcmxAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IElCTSBDb3JwLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSAiZHJtX2NvcmUuaCIKKworc3RydWN0IGRybV9zeXNmc19jbGFzcyB7CisJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgYXR0cjsKKwlzdHJ1Y3QgY2xhc3MgY2xhc3M7Cit9OworI2RlZmluZSB0b19kcm1fc3lzZnNfY2xhc3MoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MsIGNsYXNzKQorCitzdHJ1Y3Qgc2ltcGxlX2RldiB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCWRldl90IGRldjsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlIGNsYXNzX2RldjsKK307CisjZGVmaW5lIHRvX3NpbXBsZV9kZXYoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBzaW1wbGVfZGV2LCBjbGFzc19kZXYpCisKK3N0YXRpYyBMSVNUX0hFQUQoc2ltcGxlX2Rldl9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2ltcGxlX2Rldl9saXN0X2xvY2spOworCitzdGF0aWMgdm9pZCByZWxlYXNlX3NpbXBsZV9kZXYoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQoreworCXN0cnVjdCBzaW1wbGVfZGV2ICpzX2RldiA9IHRvX3NpbXBsZV9kZXYoY2xhc3NfZGV2KTsKKwlrZnJlZShzX2Rldik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZGV2KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzaW1wbGVfZGV2ICpzX2RldiA9IHRvX3NpbXBsZV9kZXYoY2xhc3NfZGV2KTsKKwlyZXR1cm4gcHJpbnRfZGV2X3QoYnVmLCBzX2Rldi0+ZGV2KTsKK30KKworc3RhdGljIHZvaWQgZHJtX3N5c2ZzX2NsYXNzX3JlbGVhc2Uoc3RydWN0IGNsYXNzICpjbGFzcykKK3sKKwlzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzICpjcyA9IHRvX2RybV9zeXNmc19jbGFzcyhjbGFzcyk7CisJa2ZyZWUoY3MpOworfQorCisvKiBEaXNwbGF5IHRoZSB2ZXJzaW9uIG9mIGRybV9jb3JlLiBUaGlzIGRvZXNuJ3Qgd29yayByaWdodCBpbiBjdXJyZW50IGRlc2lnbiAqLworc3RhdGljIHNzaXplX3QgdmVyc2lvbl9zaG93KHN0cnVjdCBjbGFzcyAqZGV2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXMgJWQuJWQuJWQgJXNcbiIsIENPUkVfTkFNRSwgQ09SRV9NQUpPUiwKKwkJICAgICAgIENPUkVfTUlOT1IsIENPUkVfUEFUQ0hMRVZFTCwgQ09SRV9EQVRFKTsKK30KKworc3RhdGljIENMQVNTX0FUVFIodmVyc2lvbiwgU19JUlVHTywgdmVyc2lvbl9zaG93LCBOVUxMKTsKKworLyoqCisgKiBkcm1fc3lzZnNfY3JlYXRlIC0gY3JlYXRlIGEgc3RydWN0IGRybV9zeXNmc19jbGFzcyBzdHJ1Y3R1cmUKKyAqIEBvd25lcjogcG9pbnRlciB0byB0aGUgbW9kdWxlIHRoYXQgaXMgdG8gIm93biIgdGhpcyBzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzCisgKiBAbmFtZTogcG9pbnRlciB0byBhIHN0cmluZyBmb3IgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcy4KKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGEgc3RydWN0IGRybV9zeXNmc19jbGFzcyBwb2ludGVyIHRoYXQgY2FuIHRoZW4gYmUgdXNlZAorICogaW4gY2FsbHMgdG8gZHJtX3N5c2ZzX2RldmljZV9hZGQoKS4KKyAqCisgKiBOb3RlLCB0aGUgcG9pbnRlciBjcmVhdGVkIGhlcmUgaXMgdG8gYmUgZGVzdHJveWVkIHdoZW4gZmluaXNoZWQgYnkgbWFraW5nIGEKKyAqIGNhbGwgdG8gZHJtX3N5c2ZzX2Rlc3Ryb3koKS4KKyAqLworc3RydWN0IGRybV9zeXNmc19jbGFzcyAqZHJtX3N5c2ZzX2NyZWF0ZShzdHJ1Y3QgbW9kdWxlICpvd25lciwgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzICpjczsKKwlpbnQgcmV0dmFsOworCisJY3MgPSBrbWFsbG9jKHNpemVvZigqY3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNzKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCW1lbXNldChjcywgMHgwMCwgc2l6ZW9mKCpjcykpOworCisJY3MtPmNsYXNzLm5hbWUgPSBuYW1lOworCWNzLT5jbGFzcy5jbGFzc19yZWxlYXNlID0gZHJtX3N5c2ZzX2NsYXNzX3JlbGVhc2U7CisJY3MtPmNsYXNzLnJlbGVhc2UgPSByZWxlYXNlX3NpbXBsZV9kZXY7CisKKwljcy0+YXR0ci5hdHRyLm5hbWUgPSAiZGV2IjsKKwljcy0+YXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOworCWNzLT5hdHRyLmF0dHIub3duZXIgPSBvd25lcjsKKwljcy0+YXR0ci5zaG93ID0gc2hvd19kZXY7CisJY3MtPmF0dHIuc3RvcmUgPSBOVUxMOworCisJcmV0dmFsID0gY2xhc3NfcmVnaXN0ZXIoJmNzLT5jbGFzcyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcjsKKwljbGFzc19jcmVhdGVfZmlsZSgmY3MtPmNsYXNzLCAmY2xhc3NfYXR0cl92ZXJzaW9uKTsKKworCXJldHVybiBjczsKKworICAgICAgZXJyb3I6CisJa2ZyZWUoY3MpOworCXJldHVybiBFUlJfUFRSKHJldHZhbCk7Cit9CisKKy8qKgorICogZHJtX3N5c2ZzX2Rlc3Ryb3kgLSBkZXN0cm95cyBhIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3Mgc3RydWN0dXJlCisgKiBAY3M6IHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MgdGhhdCBpcyB0byBiZSBkZXN0cm95ZWQKKyAqCisgKiBOb3RlLCB0aGUgcG9pbnRlciB0byBiZSBkZXN0cm95ZWQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgY2FsbCB0bworICogZHJtX3N5c2ZzX2NyZWF0ZSgpLgorICovCit2b2lkIGRybV9zeXNmc19kZXN0cm95KHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MgKmNzKQoreworCWlmICgoY3MgPT0gTlVMTCkgfHwgKElTX0VSUihjcykpKQorCQlyZXR1cm47CisKKwljbGFzc191bnJlZ2lzdGVyKCZjcy0+Y2xhc3MpOworfQorCisvKioKKyAqIGRybV9zeXNmc19kZXZpY2VfYWRkIC0gYWRkcyBhIGNsYXNzIGRldmljZSB0byBzeXNmcyBmb3IgYSBjaGFyYWN0ZXIgZHJpdmVyCisgKiBAY3M6IHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MgdGhhdCB0aGlzIGRldmljZSBzaG91bGQgYmUgcmVnaXN0ZXJlZCB0by4KKyAqIEBkZXY6IHRoZSBkZXZfdCBmb3IgdGhlIGRldmljZSB0byBiZSBhZGRlZC4KKyAqIEBkZXZpY2U6IGEgcG9pbnRlciB0byBhIHN0cnVjdCBkZXZpY2UgdGhhdCBpcyBhc3Npb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MgZGV2aWNlLgorICogQGZtdDogc3RyaW5nIGZvciB0aGUgY2xhc3MgZGV2aWNlJ3MgbmFtZQorICoKKyAqIEEgc3RydWN0IGNsYXNzX2RldmljZSB3aWxsIGJlIGNyZWF0ZWQgaW4gc3lzZnMsIHJlZ2lzdGVyZWQgdG8gdGhlIHNwZWNpZmllZAorICogY2xhc3MuICBBICJkZXYiIGZpbGUgd2lsbCBiZSBjcmVhdGVkLCBzaG93aW5nIHRoZSBkZXZfdCBmb3IgdGhlIGRldmljZS4gIFRoZQorICogcG9pbnRlciB0byB0aGUgc3RydWN0IGNsYXNzX2RldmljZSB3aWxsIGJlIHJldHVybmVkIGZyb20gdGhlIGNhbGwuICBBbnkgZnVydGhlcgorICogc3lzZnMgZmlsZXMgdGhhdCBtaWdodCBiZSByZXF1aXJlZCBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGlzIHBvaW50ZXIuCisgKiBOb3RlOiB0aGUgc3RydWN0IGRybV9zeXNmc19jbGFzcyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuCisgKiBjcmVhdGVkIHdpdGggYSBjYWxsIHRvIGRybV9zeXNmc19jcmVhdGUoKS4KKyAqLworc3RydWN0IGNsYXNzX2RldmljZSAqZHJtX3N5c2ZzX2RldmljZV9hZGQoc3RydWN0IGRybV9zeXNmc19jbGFzcyAqY3MsIGRldl90IGRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXN0cnVjdCBzaW1wbGVfZGV2ICpzX2RldiA9IE5VTEw7CisJaW50IHJldHZhbDsKKworCWlmICgoY3MgPT0gTlVMTCkgfHwgKElTX0VSUihjcykpKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc19kZXYgPSBrbWFsbG9jKHNpemVvZigqc19kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNfZGV2KSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCW1lbXNldChzX2RldiwgMHgwMCwgc2l6ZW9mKCpzX2RldikpOworCisJc19kZXYtPmRldiA9IGRldjsKKwlzX2Rldi0+Y2xhc3NfZGV2LmRldiA9IGRldmljZTsKKwlzX2Rldi0+Y2xhc3NfZGV2LmNsYXNzID0gJmNzLT5jbGFzczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKHNfZGV2LT5jbGFzc19kZXYuY2xhc3NfaWQsIEJVU19JRF9TSVpFLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlyZXR2YWwgPSBjbGFzc19kZXZpY2VfcmVnaXN0ZXIoJnNfZGV2LT5jbGFzc19kZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3I7CisKKwljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJnNfZGV2LT5jbGFzc19kZXYsICZjcy0+YXR0cik7CisKKwlzcGluX2xvY2soJnNpbXBsZV9kZXZfbGlzdF9sb2NrKTsKKwlsaXN0X2FkZCgmc19kZXYtPm5vZGUsICZzaW1wbGVfZGV2X2xpc3QpOworCXNwaW5fdW5sb2NrKCZzaW1wbGVfZGV2X2xpc3RfbG9jayk7CisKKwlyZXR1cm4gJnNfZGV2LT5jbGFzc19kZXY7CisKKyAgICAgIGVycm9yOgorCWtmcmVlKHNfZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihyZXR2YWwpOworfQorCisvKioKKyAqIGRybV9zeXNmc19kZXZpY2VfcmVtb3ZlIC0gcmVtb3ZlcyBhIGNsYXNzIGRldmljZSB0aGF0IHdhcyBjcmVhdGVkIHdpdGggZHJtX3N5c2ZzX2RldmljZV9hZGQoKQorICogQGRldjogdGhlIGRldl90IG9mIHRoZSBkZXZpY2UgdGhhdCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkLgorICoKKyAqIFRoaXMgY2FsbCB1bnJlZ2lzdGVycyBhbmQgY2xlYW5zIHVwIGEgY2xhc3MgZGV2aWNlIHRoYXQgd2FzIGNyZWF0ZWQgd2l0aCBhCisgKiBjYWxsIHRvIGRybV9zeXNmc19kZXZpY2VfYWRkKCkKKyAqLwordm9pZCBkcm1fc3lzZnNfZGV2aWNlX3JlbW92ZShkZXZfdCBkZXYpCit7CisJc3RydWN0IHNpbXBsZV9kZXYgKnNfZGV2ID0gTlVMTDsKKwlpbnQgZm91bmQgPSAwOworCisJc3Bpbl9sb2NrKCZzaW1wbGVfZGV2X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzX2RldiwgJnNpbXBsZV9kZXZfbGlzdCwgbm9kZSkgeworCQlpZiAoc19kZXYtPmRldiA9PSBkZXYpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChmb3VuZCkgeworCQlsaXN0X2RlbCgmc19kZXYtPm5vZGUpOworCQlzcGluX3VubG9jaygmc2ltcGxlX2Rldl9saXN0X2xvY2spOworCQljbGFzc19kZXZpY2VfdW5yZWdpc3Rlcigmc19kZXYtPmNsYXNzX2Rldik7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2soJnNpbXBsZV9kZXZfbGlzdF9sb2NrKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzcyZjMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYwpAQCAtMCwwICsxLDY3OCBAQAorLyoqCisgKiBcZmlsZSBkcm1fdm0uaAorICogTWVtb3J5IG1hcHBpbmcgZm9yIERSTQorICogCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworLyoKKyAqIENyZWF0ZWQ6IE1vbiBKYW4gIDQgMDg6NTg6MzEgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpZiBkZWZpbmVkKF9faWE2NF9fKQorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2VuZGlmCisKKworLyoqCisgKiBcYyBub3BhZ2UgbWV0aG9kIGZvciBBR1AgdmlydHVhbCBtZW1vcnkuCisgKgorICogXHBhcmFtIHZtYSB2aXJ0dWFsIG1lbW9yeSBhcmVhLgorICogXHBhcmFtIGFkZHJlc3MgYWNjZXNzIGFkZHJlc3MuCisgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHBhZ2Ugc3RydWN0dXJlLgorICogCisgKiBGaW5kIHRoZSByaWdodCBtYXAgYW5kIGlmIGl0J3MgQUdQIG1lbW9yeSBmaW5kIHRoZSByZWFsIHBoeXNpY2FsIHBhZ2UgdG8KKyAqIG1hcCwgZ2V0IHRoZSBwYWdlLCBpbmNyZW1lbnQgdGhlIHVzZSBjb3VudCBhbmQgcmV0dXJuIGl0LgorICovCisjaWYgX19PU19IQVNfQUdQCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgcGFnZSAqZHJtX2RvX3ZtX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkJCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiAgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fbWFwX3QgKm1hcCAgICA9IE5VTEw7CisJZHJtX21hcF9saXN0X3QgICpyX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworCS8qCisgICAgICAgICAqIEZpbmQgdGhlIHJpZ2h0IG1hcAorICAgICAgICAgKi8KKwlpZiAoIWRybV9jb3JlX2hhc19BR1AoZGV2KSkKKwkJZ290byB2bV9ub3BhZ2VfZXJyb3I7CisKKwlpZighZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5jYW50X3VzZV9hcGVydHVyZSkgZ290byB2bV9ub3BhZ2VfZXJyb3I7CisKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKKwkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCW1hcCA9IHJfbGlzdC0+bWFwOworCQlpZiAoIW1hcCkgY29udGludWU7CisJCWlmIChtYXAtPm9mZnNldCA9PSBWTV9PRkZTRVQodm1hKSkgYnJlYWs7CisJfQorCisJaWYgKG1hcCAmJiBtYXAtPnR5cGUgPT0gX0RSTV9BR1ApIHsKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBhZGRyZXNzIC0gdm1hLT52bV9zdGFydDsKKwkJdW5zaWduZWQgbG9uZyBiYWRkciA9IFZNX09GRlNFVCh2bWEpICsgb2Zmc2V0OworCQlzdHJ1Y3QgZHJtX2FncF9tZW0gKmFncG1lbTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKyNpZmRlZiBfX2FscGhhX18KKwkJLyoKKyAgICAgICAgICAgICAgICAgKiBBZGp1c3QgdG8gYSBidXMtcmVsYXRpdmUgYWRkcmVzcworICAgICAgICAgICAgICAgICAqLworCQliYWRkciAtPSBkZXYtPmhvc2UtPm1lbV9zcGFjZS0+c3RhcnQ7CisjZW5kaWYKKworCQkvKgorICAgICAgICAgICAgICAgICAqIEl0J3MgQUdQIG1lbW9yeSAtIGZpbmQgdGhlIHJlYWwgcGh5c2ljYWwgcGFnZSB0byBtYXAKKyAgICAgICAgICAgICAgICAgKi8KKwkJZm9yKGFncG1lbSA9IGRldi0+YWdwLT5tZW1vcnk7IGFncG1lbTsgYWdwbWVtID0gYWdwbWVtLT5uZXh0KSB7CisJCQlpZiAoYWdwbWVtLT5ib3VuZCA8PSBiYWRkciAmJgorCQkJICAgIGFncG1lbS0+Ym91bmQgKyBhZ3BtZW0tPnBhZ2VzICogUEFHRV9TSVpFID4gYmFkZHIpIAorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFhZ3BtZW0pIGdvdG8gdm1fbm9wYWdlX2Vycm9yOworCisJCS8qCisgICAgICAgICAgICAgICAgICogR2V0IHRoZSBwYWdlLCBpbmMgdGhlIHVzZSBjb3VudCwgYW5kIHJldHVybiBpdAorICAgICAgICAgICAgICAgICAqLworCQlvZmZzZXQgPSAoYmFkZHIgLSBhZ3BtZW0tPmJvdW5kKSA+PiBQQUdFX1NISUZUOworCQlwYWdlID0gdmlydF90b19wYWdlKF9fdmEoYWdwbWVtLT5tZW1vcnktPm1lbW9yeVtvZmZzZXRdKSk7CisJCWdldF9wYWdlKHBhZ2UpOworCisJCURSTV9ERUJVRygiYmFkZHIgPSAweCVseCBwYWdlID0gMHglcCwgb2Zmc2V0ID0gMHglbHgsIGNvdW50PSVkXG4iLAorCQkJICBiYWRkciwgX192YShhZ3BtZW0tPm1lbW9yeS0+bWVtb3J5W29mZnNldF0pLCBvZmZzZXQsCisJCQkgIHBhZ2VfY291bnQocGFnZSkpOworCisJCXJldHVybiBwYWdlOworICAgICAgICB9Cit2bV9ub3BhZ2VfZXJyb3I6CisJcmV0dXJuIE5PUEFHRV9TSUdCVVM7CQkvKiBEaXNhbGxvdyBtcmVtYXAgKi8KK30KKyNlbHNlIC8qIF9fT1NfSEFTX0FHUCAqLworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHBhZ2UgKmRybV9kb192bV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXJldHVybiBOT1BBR0VfU0lHQlVTOworfQorI2VuZGlmIC8qIF9fT1NfSEFTX0FHUCAqLworCisvKioKKyAqIFxjIG5vcGFnZSBtZXRob2QgZm9yIHNoYXJlZCB2aXJ0dWFsIG1lbW9yeS4KKyAqCisgKiBccGFyYW0gdm1hIHZpcnR1YWwgbWVtb3J5IGFyZWEuCisgKiBccGFyYW0gYWRkcmVzcyBhY2Nlc3MgYWRkcmVzcy4KKyAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgcGFnZSBzdHJ1Y3R1cmUuCisgKiAKKyAqIEdldCB0aGUgdGhlIG1hcHBpbmcsIGZpbmQgdGhlIHJlYWwgcGh5c2ljYWwgcGFnZSB0byBtYXAsIGdldCB0aGUgcGFnZSwgYW5kCisgKiByZXR1cm4gaXQuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBwYWdlICpkcm1fZG9fdm1fc2htX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCWRybV9tYXBfdAkgKm1hcAkgPSAoZHJtX21hcF90ICopdm1hLT52bV9wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZwkgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcJIGk7CisJc3RydWN0IHBhZ2UJICpwYWdlOworCisJaWYgKGFkZHJlc3MgPiB2bWEtPnZtX2VuZCkgcmV0dXJuIE5PUEFHRV9TSUdCVVM7IC8qIERpc2FsbG93IG1yZW1hcCAqLworCWlmICghbWFwKSAgICAJCSAgIHJldHVybiBOT1BBR0VfT09NOyAgLyogTm90aGluZyBhbGxvY2F0ZWQgKi8KKworCW9mZnNldAkgPSBhZGRyZXNzIC0gdm1hLT52bV9zdGFydDsKKwlpID0gKHVuc2lnbmVkIGxvbmcpbWFwLT5oYW5kbGUgKyBvZmZzZXQ7CisJcGFnZSA9IHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWkpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIE5PUEFHRV9PT007CisJZ2V0X3BhZ2UocGFnZSk7CisKKwlEUk1fREVCVUcoInNobV9ub3BhZ2UgMHglbHhcbiIsIGFkZHJlc3MpOworCXJldHVybiBwYWdlOworfQorCisKKy8qKgorICogXGMgY2xvc2UgbWV0aG9kIGZvciBzaGFyZWQgdmlydHVhbCBtZW1vcnkuCisgKiAKKyAqIFxwYXJhbSB2bWEgdmlydHVhbCBtZW1vcnkgYXJlYS4KKyAqIAorICogRGVsZXRlcyBtYXAgaW5mb3JtYXRpb24gaWYgd2UgYXJlIHRoZSBsYXN0CisgKiBwZXJzb24gdG8gY2xvc2UgYSBtYXBwaW5nIGFuZCBpdCdzIG5vdCBpbiB0aGUgZ2xvYmFsIG1hcGxpc3QuCisgKi8KK3ZvaWQgZHJtX3ZtX3NobV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlkcm1fZmlsZV90CSpwcml2CT0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX3ZtYV9lbnRyeV90ICpwdCwgKnByZXYsICpuZXh0OworCWRybV9tYXBfdCAqbWFwOworCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlpbnQgZm91bmRfbWFwcyA9IDA7CisKKwlEUk1fREVCVUcoIjB4JTA4bHgsMHglMDhseFxuIiwKKwkJICB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpOworCWF0b21pY19kZWMoJmRldi0+dm1hX2NvdW50KTsKKworCW1hcCA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlmb3IgKHB0ID0gZGV2LT52bWFsaXN0LCBwcmV2ID0gTlVMTDsgcHQ7IHB0ID0gbmV4dCkgeworCQluZXh0ID0gcHQtPm5leHQ7CisJCWlmIChwdC0+dm1hLT52bV9wcml2YXRlX2RhdGEgPT0gbWFwKSBmb3VuZF9tYXBzKys7CisJCWlmIChwdC0+dm1hID09IHZtYSkgeworCQkJaWYgKHByZXYpIHsKKwkJCQlwcmV2LT5uZXh0ID0gcHQtPm5leHQ7CisJCQl9IGVsc2UgeworCQkJCWRldi0+dm1hbGlzdCA9IHB0LT5uZXh0OworCQkJfQorCQkJZHJtX2ZyZWUocHQsIHNpemVvZigqcHQpLCBEUk1fTUVNX1ZNQVMpOworCQl9IGVsc2UgeworCQkJcHJldiA9IHB0OworCQl9CisJfQorCS8qIFdlIHdlcmUgdGhlIG9ubHkgbWFwIHRoYXQgd2FzIGZvdW5kICovCisJaWYoZm91bmRfbWFwcyA9PSAxICYmCisJICAgbWFwLT5mbGFncyAmIF9EUk1fUkVNT1ZBQkxFKSB7CisJCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gdGhlIG1hcGxpc3QsIGlmIHdlIGFyZSBub3QsIHRoZW4KKwkJICogd2UgZGVsZXRlIHRoaXMgbWFwcGluZ3MgaW5mb3JtYXRpb24uCisJCSAqLworCQlmb3VuZF9tYXBzID0gMDsKKwkJbGlzdCA9ICZkZXYtPm1hcGxpc3QtPmhlYWQ7CisJCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCQlpZiAocl9saXN0LT5tYXAgPT0gbWFwKSBmb3VuZF9tYXBzKys7CisJCX0KKworCQlpZighZm91bmRfbWFwcykgeworCQkJc3dpdGNoIChtYXAtPnR5cGUpIHsKKwkJCWNhc2UgX0RSTV9SRUdJU1RFUlM6CisJCQljYXNlIF9EUk1fRlJBTUVfQlVGRkVSOgorCQkJCWlmIChkcm1fY29yZV9oYXNfTVRSUihkZXYpICYmIG1hcC0+bXRyciA+PSAwKSB7CisJCQkJCWludCByZXRjb2RlOworCQkJCQlyZXRjb2RlID0gbXRycl9kZWwobWFwLT5tdHJyLAorCQkJCQkJCSAgIG1hcC0+b2Zmc2V0LAorCQkJCQkJCSAgIG1hcC0+c2l6ZSk7CisJCQkJCURSTV9ERUJVRygibXRycl9kZWwgPSAlZFxuIiwgcmV0Y29kZSk7CisJCQkJfQorCQkJCWRybV9pb3JlbWFwZnJlZShtYXAtPmhhbmRsZSwgbWFwLT5zaXplLCBkZXYpOworCQkJCWJyZWFrOworCQkJY2FzZSBfRFJNX1NITToKKwkJCQl2ZnJlZShtYXAtPmhhbmRsZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIF9EUk1fQUdQOgorCQkJY2FzZSBfRFJNX1NDQVRURVJfR0FUSEVSOgorCQkJCWJyZWFrOworCQkJfQorCQkJZHJtX2ZyZWUobWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyk7CisJCX0KKwl9CisJdXAoJmRldi0+c3RydWN0X3NlbSk7Cit9CisKKy8qKgorICogXGMgbm9wYWdlIG1ldGhvZCBmb3IgRE1BIHZpcnR1YWwgbWVtb3J5LgorICoKKyAqIFxwYXJhbSB2bWEgdmlydHVhbCBtZW1vcnkgYXJlYS4KKyAqIFxwYXJhbSBhZGRyZXNzIGFjY2VzcyBhZGRyZXNzLgorICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBwYWdlIHN0cnVjdHVyZS4KKyAqIAorICogRGV0ZXJtaW5lIHRoZSBwYWdlIG51bWJlciBmcm9tIHRoZSBwYWdlIG9mZnNldCBhbmQgZ2V0IGl0IGZyb20gZHJtX2RldmljZV9kbWE6OnBhZ2VsaXN0LgorICovCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgcGFnZSAqZHJtX2RvX3ZtX2RtYV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlkcm1fZmlsZV90CSAqcHJpdgkgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICpkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYQkgPSBkZXYtPmRtYTsKKwl1bnNpZ25lZCBsb25nCSBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZwkgcGFnZV9ucjsKKwlzdHJ1Y3QgcGFnZQkgKnBhZ2U7CisKKwlpZiAoIWRtYSkJCSAgIHJldHVybiBOT1BBR0VfU0lHQlVTOyAvKiBFcnJvciAqLworCWlmIChhZGRyZXNzID4gdm1hLT52bV9lbmQpIHJldHVybiBOT1BBR0VfU0lHQlVTOyAvKiBEaXNhbGxvdyBtcmVtYXAgKi8KKwlpZiAoIWRtYS0+cGFnZWxpc3QpCSAgIHJldHVybiBOT1BBR0VfT09NIDsgLyogTm90aGluZyBhbGxvY2F0ZWQgKi8KKworCW9mZnNldAkgPSBhZGRyZXNzIC0gdm1hLT52bV9zdGFydDsgLyogdm1fW3BnXW9mZltzZXRdIHNob3VsZCBiZSAwICovCisJcGFnZV9uciAgPSBvZmZzZXQgPj4gUEFHRV9TSElGVDsKKwlwYWdlID0gdmlydF90b19wYWdlKChkbWEtPnBhZ2VsaXN0W3BhZ2VfbnJdICsgCisJCQkgICAgIChvZmZzZXQgJiAoflBBR0VfTUFTSykpKSk7CisKKwlnZXRfcGFnZShwYWdlKTsKKworCURSTV9ERUJVRygiZG1hX25vcGFnZSAweCVseCAocGFnZSAlbHUpXG4iLCBhZGRyZXNzLCBwYWdlX25yKTsKKwlyZXR1cm4gcGFnZTsKK30KKworLyoqCisgKiBcYyBub3BhZ2UgbWV0aG9kIGZvciBzY2F0dGVyLWdhdGhlciB2aXJ0dWFsIG1lbW9yeS4KKyAqCisgKiBccGFyYW0gdm1hIHZpcnR1YWwgbWVtb3J5IGFyZWEuCisgKiBccGFyYW0gYWRkcmVzcyBhY2Nlc3MgYWRkcmVzcy4KKyAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgcGFnZSBzdHJ1Y3R1cmUuCisgKiAKKyAqIERldGVybWluZSB0aGUgbWFwIG9mZnNldCBmcm9tIHRoZSBwYWdlIG9mZnNldCBhbmQgZ2V0IGl0IGZyb20gZHJtX3NnX21lbTo6cGFnZWxpc3QuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBwYWdlICpkcm1fZG9fdm1fc2dfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlkcm1fbWFwX3QgICAgICAgICptYXAgICAgPSAoZHJtX21hcF90ICopdm1hLT52bV9wcml2YXRlX2RhdGE7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9zZ19tZW1fdCAqZW50cnkgPSBkZXYtPnNnOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgbWFwX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHBhZ2Vfb2Zmc2V0OworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKCFlbnRyeSkgICAgICAgICAgICAgICAgcmV0dXJuIE5PUEFHRV9TSUdCVVM7IC8qIEVycm9yICovCisJaWYgKGFkZHJlc3MgPiB2bWEtPnZtX2VuZCkgcmV0dXJuIE5PUEFHRV9TSUdCVVM7IC8qIERpc2FsbG93IG1yZW1hcCAqLworCWlmICghZW50cnktPnBhZ2VsaXN0KSAgICAgIHJldHVybiBOT1BBR0VfT09NIDsgIC8qIE5vdGhpbmcgYWxsb2NhdGVkICovCisKKworCW9mZnNldCA9IGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0OworCW1hcF9vZmZzZXQgPSBtYXAtPm9mZnNldCAtIGRldi0+c2ctPmhhbmRsZTsKKwlwYWdlX29mZnNldCA9IChvZmZzZXQgPj4gUEFHRV9TSElGVCkgKyAobWFwX29mZnNldCA+PiBQQUdFX1NISUZUKTsKKwlwYWdlID0gZW50cnktPnBhZ2VsaXN0W3BhZ2Vfb2Zmc2V0XTsKKwlnZXRfcGFnZShwYWdlKTsKKworCXJldHVybiBwYWdlOworfQorCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMCkKKworc3RhdGljIHN0cnVjdCBwYWdlICpkcm1fdm1fbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICBpbnQgKnR5cGUpIHsKKwlpZiAodHlwZSkgKnR5cGUgPSBWTV9GQVVMVF9NSU5PUjsKKwlyZXR1cm4gZHJtX2RvX3ZtX25vcGFnZSh2bWEsIGFkZHJlc3MpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmRybV92bV9zaG1fbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkJICAgICAgIGludCAqdHlwZSkgeworCWlmICh0eXBlKSAqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworCXJldHVybiBkcm1fZG9fdm1fc2htX25vcGFnZSh2bWEsIGFkZHJlc3MpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmRybV92bV9kbWFfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkJICAgICAgIGludCAqdHlwZSkgeworCWlmICh0eXBlKSAqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworCXJldHVybiBkcm1fZG9fdm1fZG1hX25vcGFnZSh2bWEsIGFkZHJlc3MpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmRybV92bV9zZ19ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJCSAgICAgIGludCAqdHlwZSkgeworCWlmICh0eXBlKSAqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworCXJldHVybiBkcm1fZG9fdm1fc2dfbm9wYWdlKHZtYSwgYWRkcmVzcyk7Cit9CisKKyNlbHNlCS8qIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsMCkgKi8KKworc3RhdGljIHN0cnVjdCBwYWdlICpkcm1fdm1fbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICBpbnQgdW51c2VkKSB7CisJcmV0dXJuIGRybV9kb192bV9ub3BhZ2Uodm1hLCBhZGRyZXNzKTsKK30KKworc3RhdGljIHN0cnVjdCBwYWdlICpkcm1fdm1fc2htX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJCSAgICAgICBpbnQgdW51c2VkKSB7CisJcmV0dXJuIGRybV9kb192bV9zaG1fbm9wYWdlKHZtYSwgYWRkcmVzcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqZHJtX3ZtX2RtYV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICAgICAgaW50IHVudXNlZCkgeworCXJldHVybiBkcm1fZG9fdm1fZG1hX25vcGFnZSh2bWEsIGFkZHJlc3MpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmRybV92bV9zZ19ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJCSAgICAgIGludCB1bnVzZWQpIHsKKwlyZXR1cm4gZHJtX2RvX3ZtX3NnX25vcGFnZSh2bWEsIGFkZHJlc3MpOworfQorCisjZW5kaWYKKworCisvKiogQUdQIHZpcnR1YWwgbWVtb3J5IG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgICBkcm1fdm1fb3BzID0geworCS5ub3BhZ2UgPSBkcm1fdm1fbm9wYWdlLAorCS5vcGVuCT0gZHJtX3ZtX29wZW4sCisJLmNsb3NlCT0gZHJtX3ZtX2Nsb3NlLAorfTsKKworLyoqIFNoYXJlZCB2aXJ0dWFsIG1lbW9yeSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0ICAgZHJtX3ZtX3NobV9vcHMgPSB7CisJLm5vcGFnZSA9IGRybV92bV9zaG1fbm9wYWdlLAorCS5vcGVuCT0gZHJtX3ZtX29wZW4sCisJLmNsb3NlCT0gZHJtX3ZtX3NobV9jbG9zZSwKK307CisKKy8qKiBETUEgdmlydHVhbCBtZW1vcnkgb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCAgIGRybV92bV9kbWFfb3BzID0geworCS5ub3BhZ2UgPSBkcm1fdm1fZG1hX25vcGFnZSwKKwkub3Blbgk9IGRybV92bV9vcGVuLAorCS5jbG9zZQk9IGRybV92bV9jbG9zZSwKK307CisKKy8qKiBTY2F0dGVyLWdhdGhlciB2aXJ0dWFsIG1lbW9yeSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0ICAgZHJtX3ZtX3NnX29wcyA9IHsKKwkubm9wYWdlID0gZHJtX3ZtX3NnX25vcGFnZSwKKwkub3BlbiAgID0gZHJtX3ZtX29wZW4sCisJLmNsb3NlICA9IGRybV92bV9jbG9zZSwKK307CisKKworLyoqCisgKiBcYyBvcGVuIG1ldGhvZCBmb3Igc2hhcmVkIHZpcnR1YWwgbWVtb3J5LgorICogCisgKiBccGFyYW0gdm1hIHZpcnR1YWwgbWVtb3J5IGFyZWEuCisgKiAKKyAqIENyZWF0ZSBhIG5ldyBkcm1fdm1hX2VudHJ5IHN0cnVjdHVyZSBhcyB0aGUgXHAgdm1hIHByaXZhdGUgZGF0YSBlbnRyeSBhbmQKKyAqIGFkZCBpdCB0byBkcm1fZGV2aWNlOjp2bWFsaXN0LgorICovCit2b2lkIGRybV92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWRybV9maWxlX3QJKnByaXYJPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fdm1hX2VudHJ5X3QgKnZtYV9lbnRyeTsKKworCURSTV9ERUJVRygiMHglMDhseCwweCUwOGx4XG4iLAorCQkgIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CisJYXRvbWljX2luYygmZGV2LT52bWFfY291bnQpOworCisJdm1hX2VudHJ5ID0gZHJtX2FsbG9jKHNpemVvZigqdm1hX2VudHJ5KSwgRFJNX01FTV9WTUFTKTsKKwlpZiAodm1hX2VudHJ5KSB7CisJCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJCXZtYV9lbnRyeS0+dm1hCT0gdm1hOworCQl2bWFfZW50cnktPm5leHQgPSBkZXYtPnZtYWxpc3Q7CisJCXZtYV9lbnRyeS0+cGlkCT0gY3VycmVudC0+cGlkOworCQlkZXYtPnZtYWxpc3QJPSB2bWFfZW50cnk7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCX0KK30KKworLyoqCisgKiBcYyBjbG9zZSBtZXRob2QgZm9yIGFsbCB2aXJ0dWFsIG1lbW9yeSB0eXBlcy4KKyAqIAorICogXHBhcmFtIHZtYSB2aXJ0dWFsIG1lbW9yeSBhcmVhLgorICogCisgKiBTZWFyY2ggdGhlIFxwIHZtYSBwcml2YXRlIGRhdGEgZW50cnkgaW4gZHJtX2RldmljZTo6dm1hbGlzdCwgdW5saW5rIGl0LCBhbmQKKyAqIGZyZWUgaXQuCisgKi8KK3ZvaWQgZHJtX3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWRybV9maWxlX3QJKnByaXYJPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fdm1hX2VudHJ5X3QgKnB0LCAqcHJldjsKKworCURSTV9ERUJVRygiMHglMDhseCwweCUwOGx4XG4iLAorCQkgIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CisJYXRvbWljX2RlYygmZGV2LT52bWFfY291bnQpOworCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlmb3IgKHB0ID0gZGV2LT52bWFsaXN0LCBwcmV2ID0gTlVMTDsgcHQ7IHByZXYgPSBwdCwgcHQgPSBwdC0+bmV4dCkgeworCQlpZiAocHQtPnZtYSA9PSB2bWEpIHsKKwkJCWlmIChwcmV2KSB7CisJCQkJcHJldi0+bmV4dCA9IHB0LT5uZXh0OworCQkJfSBlbHNlIHsKKwkJCQlkZXYtPnZtYWxpc3QgPSBwdC0+bmV4dDsKKwkJCX0KKwkJCWRybV9mcmVlKHB0LCBzaXplb2YoKnB0KSwgRFJNX01FTV9WTUFTKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworfQorCisvKioKKyAqIG1tYXAgRE1BIG1lbW9yeS4KKyAqCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gdm1hIHZpcnR1YWwgbWVtb3J5IGFyZWEuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICogCisgKiBTZXRzIHRoZSB2aXJ0dWFsIG1lbW9yeSBhcmVhIG9wZXJhdGlvbnMgc3RydWN0dXJlIHRvIHZtX2RtYV9vcHMsIHRoZSBmaWxlCisgKiBwb2ludGVyLCBhbmQgY2FsbHMgdm1fb3BlbigpLgorICovCitpbnQgZHJtX21tYXBfZG1hKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlkcm1fZmlsZV90CSAqcHJpdgkgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAqZGV2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYTsKKwl1bnNpZ25lZCBsb25nCSBsZW5ndGgJID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCisJbG9ja19rZXJuZWwoKTsKKwlkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCWRtYQkgPSBkZXYtPmRtYTsKKwlEUk1fREVCVUcoInN0YXJ0ID0gMHglbHgsIGVuZCA9IDB4JWx4LCBvZmZzZXQgPSAweCVseFxuIiwKKwkJICB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgVk1fT0ZGU0VUKHZtYSkpOworCisJCQkJLyogTGVuZ3RoIG11c3QgbWF0Y2ggZXhhY3QgcGFnZSBjb3VudCAqLworCWlmICghZG1hIHx8IChsZW5ndGggPj4gUEFHRV9TSElGVCkgIT0gZG1hLT5wYWdlX2NvdW50KSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKworCXZtYS0+dm1fb3BzICAgPSAmZHJtX3ZtX2RtYV9vcHM7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgwMjA0MGUgLyogS0VSTkVMX1ZFUlNJT04oMiw0LDE0KSAqLworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fTE9DS0VEIHwgVk1fU0hNOyAvKiBEb24ndCBzd2FwICovCisjZWxzZQorCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7IC8qIERvbid0IHN3YXAgKi8KKyNlbmRpZgorCisJdm1hLT52bV9maWxlICA9CSBmaWxwOwkvKiBOZWVkZWQgZm9yIGRybV92bV9vcGVuKCkgKi8KKwlkcm1fdm1fb3Blbih2bWEpOworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIGRybV9jb3JlX2dldF9tYXBfb2ZzKGRybV9tYXBfdCAqbWFwKQoreworCXJldHVybiBtYXAtPm9mZnNldDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2NvcmVfZ2V0X21hcF9vZnMpOworCit1bnNpZ25lZCBsb25nIGRybV9jb3JlX2dldF9yZWdfb2ZzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisjaWZkZWYgX19hbHBoYV9fCisJcmV0dXJuIGRldi0+aG9zZS0+ZGVuc2VfbWVtX2Jhc2UgLSBkZXYtPmhvc2UtPm1lbV9zcGFjZS0+c3RhcnQ7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKGRybV9jb3JlX2dldF9yZWdfb2ZzKTsKKworLyoqCisgKiBtbWFwIERNQSBtZW1vcnkuCisgKgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIHZtYSB2aXJ0dWFsIG1lbW9yeSBhcmVhLgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqIAorICogSWYgdGhlIHZpcnR1YWwgbWVtb3J5IGFyZWEgaGFzIG5vIG9mZnNldCBhc3NvY2lhdGVkIHdpdGggaXQgdGhlbiBpdCdzIGEgRE1BCisgKiBhcmVhLCBzbyBjYWxscyBtbWFwX2RtYSgpLiBPdGhlcndpc2Ugc2VhcmNoZXMgdGhlIG1hcCBpbiBkcm1fZGV2aWNlOjptYXBsaXN0LAorICogY2hlY2tzIHRoYXQgdGhlIHJlc3RyaWN0ZWQgZmxhZyBpcyBub3Qgc2V0LCBzZXRzIHRoZSB2aXJ0dWFsIG1lbW9yeSBvcGVyYXRpb25zCisgKiBhY2NvcmRpbmcgdG8gdGhlIG1hcHBpbmcgdHlwZSBhbmQgcmVtYXBzIHRoZSBwYWdlcy4gRmluYWxseSBzZXRzIHRoZSBmaWxlCisgKiBwb2ludGVyIGFuZCBjYWxscyB2bV9vcGVuKCkuCisgKi8KK2ludCBkcm1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fbWFwX3QJKm1hcAk9IE5VTEw7CisJZHJtX21hcF9saXN0X3QgICpyX2xpc3Q7CisJdW5zaWduZWQgbG9uZyAgIG9mZnNldCAgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisKKwlEUk1fREVCVUcoInN0YXJ0ID0gMHglbHgsIGVuZCA9IDB4JWx4LCBvZmZzZXQgPSAweCVseFxuIiwKKwkJICB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgVk1fT0ZGU0VUKHZtYSkpOworCisJaWYgKCAhcHJpdi0+YXV0aGVudGljYXRlZCApIHJldHVybiAtRUFDQ0VTOworCisJLyogV2UgY2hlY2sgZm9yICJkbWEiLiBPbiBBcHBsZSdzIFVuaU5vcnRoLCBpdCdzIHZhbGlkIHRvIGhhdmUKKwkgKiB0aGUgQUdQIG1hcHBlZCBhdCBwaHlzaWNhbCBhZGRyZXNzIDAKKwkgKiAtLUJlbkguCisJICovCisJaWYgKCFWTV9PRkZTRVQodm1hKQorI2lmIF9fT1NfSEFTX0FHUAorCSAgICAmJiAoIWRldi0+YWdwIHx8IGRldi0+YWdwLT5hZ3BfaW5mby5kZXZpY2UtPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0FQUExFKQorI2VuZGlmCisJICAgICkKKwkJcmV0dXJuIGRybV9tbWFwX2RtYShmaWxwLCB2bWEpOworCisJCQkJLyogQSBzZXF1ZW50aWFsIHNlYXJjaCBvZiBhIGxpbmtlZCBsaXN0IGlzCisJCQkJICAgZmluZSBoZXJlIGJlY2F1c2U6IDEpIHRoZXJlIHdpbGwgb25seSBiZQorCQkJCSAgIGFib3V0IDUtMTAgZW50cmllcyBpbiB0aGUgbGlzdCBhbmQsIDIpIGEKKwkJCQkgICBEUkkgY2xpZW50IG9ubHkgaGFzIHRvIGRvIHRoaXMgbWFwcGluZworCQkJCSAgIG9uY2UsIHNvIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBvcHRpbWl6ZWQKKwkJCQkgICBmb3IgcGVyZm9ybWFuY2UsIGV2ZW4gaWYgdGhlIGxpc3Qgd2FzIGEKKwkJCQkgICBiaXQgbG9uZ2VyLiAqLworCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQl1bnNpZ25lZCBsb25nIG9mZjsKKworCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwkJbWFwID0gcl9saXN0LT5tYXA7CisJCWlmICghbWFwKSBjb250aW51ZTsKKwkJb2ZmID0gZGV2LT5kcml2ZXItPmdldF9tYXBfb2ZzKG1hcCk7CisJCWlmIChvZmYgPT0gVk1fT0ZGU0VUKHZtYSkpIGJyZWFrOworCX0KKworCWlmICghbWFwIHx8ICgobWFwLT5mbGFncyZfRFJNX1JFU1RSSUNURUQpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCQkJCS8qIENoZWNrIGZvciB2YWxpZCBzaXplLiAqLworCWlmIChtYXAtPnNpemUgIT0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSByZXR1cm4gLUVJTlZBTDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSAmJiAobWFwLT5mbGFncyAmIF9EUk1fUkVBRF9PTkxZKSkgeworCQl2bWEtPnZtX2ZsYWdzICY9IH4oVk1fV1JJVEUgfCBWTV9NQVlXUklURSk7CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSAmPSB+X1BBR0VfUlc7CisjZWxzZQorCQkJCS8qIFllIGdhZHMgdGhpcyBpcyB1Z2x5LiAgV2l0aCBtb3JlIHRob3VnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UgY291bGQgbW92ZSB0aGlzIHVwIGhpZ2hlciBhbmQgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBwcm90ZWN0aW9uX21hcCcgaW5zdGVhZC4gICovCisJCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QocHRlX3ZhbChwdGVfd3Jwcm90ZWN0KAorCQkJX19wdGUocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkpKSkpOworI2VuZGlmCisJfQorCisJc3dpdGNoIChtYXAtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBfRFJNX0FHUDoKKwkgIGlmIChkcm1fY29yZV9oYXNfQUdQKGRldikgJiYgZGV2LT5hZ3AtPmNhbnRfdXNlX2FwZXJ0dXJlKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBPbiBzb21lIHBsYXRmb3JtcyB3ZSBjYW4ndCB0YWxrIHRvIGJ1cyBkbWEgYWRkcmVzcyBmcm9tIHRoZSBDUFUsIHNvIGZvcgorICAgICAgICAgICAgICAgICAqIG1lbW9yeSBvZiB0eXBlIERSTV9BR1AsIHdlJ2xsIGRlYWwgd2l0aCBzb3J0aW5nIG91dCB0aGUgcmVhbCBwaHlzaWNhbAorICAgICAgICAgICAgICAgICAqIHBhZ2VzIGFuZCBtYXBwaW5ncyBpbiBub3BhZ2UoKQorICAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCisJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX05PX0NBQ0hFOworI2VuZGlmCisgICAgICAgICAgICAgICAgdm1hLT52bV9vcHMgPSAmZHJtX3ZtX29wczsKKyAgICAgICAgICAgICAgICBicmVhazsKKwkgIH0KKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggdG8gX0RSTV9GUkFNRV9CVUZGRVIuLi4gKi8gICAgICAgIAorCWNhc2UgX0RSTV9GUkFNRV9CVUZGRVI6CisJY2FzZSBfRFJNX1JFR0lTVEVSUzoKKwkJaWYgKFZNX09GRlNFVCh2bWEpID49IF9fcGEoaGlnaF9tZW1vcnkpKSB7CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID4gMyAmJiBtYXAtPnR5cGUgIT0gX0RSTV9BR1ApIHsKKwkJCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9QQ0Q7CisJCQkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgJj0gfl9QQUdFX1BXVDsKKwkJCX0KKyNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCisJCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQ7CisjZW5kaWYKKwkJCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87CS8qIG5vdCBpbiBjb3JlIGR1bXAgKi8KKwkJfQorI2lmIGRlZmluZWQoX19pYTY0X18pCisJCWlmIChlZmlfcmFuZ2VfaXNfd2Modm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLQorCQkJCSAgICB2bWEtPnZtX3N0YXJ0KSkKKwkJCXZtYS0+dm1fcGFnZV9wcm90ID0KKwkJCQlwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKKwkJZWxzZQorCQkJdm1hLT52bV9wYWdlX3Byb3QgPQorCQkJCXBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOworI2VuZGlmCisJCW9mZnNldCA9IGRldi0+ZHJpdmVyLT5nZXRfcmVnX29mcyhkZXYpOworI2lmZGVmIF9fc3BhcmNfXworCQlpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKERSTV9SUFJfQVJHKHZtYSkgdm1hLT52bV9zdGFydCwKKwkJCQkJKFZNX09GRlNFVCh2bWEpICsgb2Zmc2V0KSA+PiBQQUdFX1NISUZULAorCQkJCQl2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkJCXZtYS0+dm1fcGFnZV9wcm90KSkKKyNlbHNlCisJCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJCSAgICAgKFZNX09GRlNFVCh2bWEpICsgb2Zmc2V0KSA+PiBQQUdFX1NISUZULAorCQkJCSAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCQkJCSAgICAgdm1hLT52bV9wYWdlX3Byb3QpKQorI2VuZGlmCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCURSTV9ERUJVRygiICAgVHlwZSA9ICVkOyBzdGFydCA9IDB4JWx4LCBlbmQgPSAweCVseCwiCisJCQkgICIgb2Zmc2V0ID0gMHglbHhcbiIsCisJCQkgIG1hcC0+dHlwZSwKKwkJCSAgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIFZNX09GRlNFVCh2bWEpICsgb2Zmc2V0KTsKKwkJdm1hLT52bV9vcHMgPSAmZHJtX3ZtX29wczsKKwkJYnJlYWs7CisJY2FzZSBfRFJNX1NITToKKwkJdm1hLT52bV9vcHMgPSAmZHJtX3ZtX3NobV9vcHM7CisJCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gKHZvaWQgKiltYXA7CisJCQkJLyogRG9uJ3QgbGV0IHRoaXMgYXJlYSBzd2FwLiAgQ2hhbmdlIHdoZW4KKwkJCQkgICBEUk1fS0VSTkVMIGFkdmlzb3J5IGlzIHN1cHBvcnRlZC4gKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgwMjA0MGUgLyogS0VSTkVMX1ZFUlNJT04oMiw0LDE0KSAqLworCQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0xPQ0tFRDsKKyNlbHNlCisJCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBfRFJNX1NDQVRURVJfR0FUSEVSOgorCQl2bWEtPnZtX29wcyA9ICZkcm1fdm1fc2dfb3BzOworCQl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9ICh2b2lkICopbWFwOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDAyMDQwZSAvKiBLRVJORUxfVkVSU0lPTigyLDQsMTQpICovCisJCXZtYS0+dm1fZmxhZ3MgfD0gVk1fTE9DS0VEOworI2Vsc2UKKwkJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICovCisJfQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDAyMDQwZSAvKiBLRVJORUxfVkVSU0lPTigyLDQsMTQpICovCisJdm1hLT52bV9mbGFncyB8PSBWTV9MT0NLRUQgfCBWTV9TSE07IC8qIERvbid0IHN3YXAgKi8KKyNlbHNlCisJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsgLyogRG9uJ3Qgc3dhcCAqLworI2VuZGlmCisKKwl2bWEtPnZtX2ZpbGUgID0JIGZpbHA7CS8qIE5lZWRlZCBmb3IgZHJtX3ZtX29wZW4oKSAqLworCWRybV92bV9vcGVuKHZtYSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tbWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZmZiX2NvbnRleHQuYyBiL2RyaXZlcnMvY2hhci9kcm0vZmZiX2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTE4MTIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9mZmJfY29udGV4dC5jCkBAIC0wLDAgKzEsNTUxIEBACisvKiAkSWQ6IGZmYl9jb250ZXh0LmMsdiAxLjUgMjAwMS8wOC8wOSAxNzo0Nzo1MSBkYXZlbSBFeHAgJAorICogZmZiX2NvbnRleHQuYzogQ3JlYXRvci9DcmVhdG9yM0QgRFJJL0RSTSBjb250ZXh0IHN3aXRjaGluZy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICoKKyAqIEFsbW9zdCBlbnRpcmVseSBzdG9sZW4gZnJvbSB0ZGZ4X2NvbnRleHQuYywgc2VlIHRoZXJlCisgKiBmb3IgYXV0aG9ycy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vdXBhLmg+CisKKyNpbmNsdWRlICJmZmIuaCIKKyNpbmNsdWRlICJkcm1QLmgiCisKKyNpbmNsdWRlICJmZmJfZHJ2LmgiCisKK3N0YXRpYyBpbnQgRFJNKGFsbG9jX3F1ZXVlKShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGlzXzJkX29ubHkpCit7CisJZmZiX2Rldl9wcml2X3QgKmZwcml2ID0gKGZmYl9kZXZfcHJpdl90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRkZCX01BWF9DVFhTOyBpKyspIHsKKwkJaWYgKGZwcml2LT5od19zdGF0ZVtpXSA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQorCWlmIChpID09IEZGQl9NQVhfQ1RYUykKKwkJcmV0dXJuIC0xOworCisJZnByaXYtPmh3X3N0YXRlW2ldID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZmYl9od19jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZwcml2LT5od19zdGF0ZVtpXSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlmcHJpdi0+aHdfc3RhdGVbaV0tPmlzXzJkX29ubHkgPSBpc18yZF9vbmx5OworCisJLyogUGx1cyBvbmUgYmVjYXVzZSAwIGlzIHRoZSBzcGVjaWFsIERSTV9LRVJORUxfQ09OVEVYVC4gKi8KKwlyZXR1cm4gaSArIDE7Cit9CisKK3N0YXRpYyB2b2lkIGZmYl9zYXZlX2NvbnRleHQoZmZiX2Rldl9wcml2X3QgKmZwcml2LCBpbnQgaWR4KQoreworCWZmYl9mYmNQdHIgZmZiID0gZnByaXYtPnJlZ3M7CisJc3RydWN0IGZmYl9od19jb250ZXh0ICpjdHg7CisJaW50IGk7CisKKwljdHggPSBmcHJpdi0+aHdfc3RhdGVbaWR4IC0gMV07CisJaWYgKGlkeCA9PSAwIHx8IGN0eCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoY3R4LT5pc18yZF9vbmx5KSB7CisJCS8qIDJEIGFwcGxpY2F0aW9ucyBvbmx5IGNhcmUgYWJvdXQgY2VydGFpbiBwaWVjZXMKKwkJICogb2Ygc3RhdGUuCisJCSAqLworCQljdHgtPmRyYXdvcCA9IHVwYV9yZWFkbCgmZmZiLT5kcmF3b3ApOworCQljdHgtPnBwYyA9IHVwYV9yZWFkbCgmZmZiLT5wcGMpOworCQljdHgtPndpZCA9IHVwYV9yZWFkbCgmZmZiLT53aWQpOworCQljdHgtPmZnID0gdXBhX3JlYWRsKCZmZmItPmZnKTsKKwkJY3R4LT5iZyA9IHVwYV9yZWFkbCgmZmZiLT5iZyk7CisJCWN0eC0+eGNsaXAgPSB1cGFfcmVhZGwoJmZmYi0+eGNsaXApOworCQljdHgtPmZiYyA9IHVwYV9yZWFkbCgmZmZiLT5mYmMpOworCQljdHgtPnJvcCA9IHVwYV9yZWFkbCgmZmZiLT5yb3ApOworCQljdHgtPmNtcCA9IHVwYV9yZWFkbCgmZmZiLT5jbXApOworCQljdHgtPm1hdGNoYWIgPSB1cGFfcmVhZGwoJmZmYi0+bWF0Y2hhYik7CisJCWN0eC0+bWFnbmFiID0gdXBhX3JlYWRsKCZmZmItPm1hZ25hYik7CisJCWN0eC0+cG1hc2sgPSB1cGFfcmVhZGwoJmZmYi0+cG1hc2spOworCQljdHgtPnhwbWFzayA9IHVwYV9yZWFkbCgmZmZiLT54cG1hc2spOworCQljdHgtPmxwYXQgPSB1cGFfcmVhZGwoJmZmYi0+bHBhdCk7CisJCWN0eC0+Zm9udHh5ID0gdXBhX3JlYWRsKCZmZmItPmZvbnR4eSk7CisJCWN0eC0+Zm9udHcgPSB1cGFfcmVhZGwoJmZmYi0+Zm9udHcpOworCQljdHgtPmZvbnRpbmMgPSB1cGFfcmVhZGwoJmZmYi0+Zm9udGluYyk7CisKKwkJLyogc3RlbmNpbC9zdGVuY2lsY3RsIG9ubHkgZXhpc3RzIG9uIEZGQjIrIGFuZCBsYXRlcgorCQkgKiBkdWUgdG8gdGhlIGludHJvZHVjdGlvbiBvZiAzRFJBTS1JSUkuCisJCSAqLworCQlpZiAoZnByaXYtPmZmYl90eXBlID09IGZmYjJfdmVydGljYWxfcGx1cyB8fAorCQkgICAgZnByaXYtPmZmYl90eXBlID09IGZmYjJfaG9yaXpvbnRhbF9wbHVzKSB7CisJCQljdHgtPnN0ZW5jaWwgPSB1cGFfcmVhZGwoJmZmYi0+c3RlbmNpbCk7CisJCQljdHgtPnN0ZW5jaWxjdGwgPSB1cGFfcmVhZGwoJmZmYi0+c3RlbmNpbGN0bCk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJCWN0eC0+YXJlYV9wYXR0ZXJuW2ldID0gdXBhX3JlYWRsKCZmZmItPnBhdHRlcm5baV0pOworCQljdHgtPnVjc3IgPSB1cGFfcmVhZGwoJmZmYi0+dWNzcik7CisJCXJldHVybjsKKwl9CisKKwkvKiBGZXRjaCBkcmF3b3AuICovCisJY3R4LT5kcmF3b3AgPSB1cGFfcmVhZGwoJmZmYi0+ZHJhd29wKTsKKworCS8qIElmIHdlIHdlcmUgc2F2aW5nIHRoZSB2ZXJ0ZXggcmVnaXN0ZXJzLCB0aGlzIGlzIHdoZXJlCisJICogd2Ugd291bGQgZG8gaXQuICBXZSB3b3VsZCBzYXZlIDMyIDMyLWJpdCB3b3JkcyBzdGFydGluZworCSAqIGF0IGZmYi0+c3V2dHguCisJICovCisKKwkvKiBDYXB0dXJlIHJlbmRlcmluZyBhdHRyaWJ1dGVzLiAqLworCisJY3R4LT5wcGMgPSB1cGFfcmVhZGwoJmZmYi0+cHBjKTsJCS8qIFBpeGVsIFByb2Nlc3NvciBDb250cm9sICovCisJY3R4LT53aWQgPSB1cGFfcmVhZGwoJmZmYi0+d2lkKTsJCS8qIEN1cnJlbnQgV0lEICovCisJY3R4LT5mZyA9IHVwYV9yZWFkbCgmZmZiLT5mZyk7CQkJLyogQ29uc3RhbnQgRkcgY29sb3IgKi8KKwljdHgtPmJnID0gdXBhX3JlYWRsKCZmZmItPmJnKTsJCQkvKiBDb25zdGFudCBCRyBjb2xvciAqLworCWN0eC0+Y29uc3R5ID0gdXBhX3JlYWRsKCZmZmItPmNvbnN0eSk7CQkvKiBDb25zdGFudCBZICovCisJY3R4LT5jb25zdHogPSB1cGFfcmVhZGwoJmZmYi0+Y29uc3R6KTsJCS8qIENvbnN0YW50IFogKi8KKwljdHgtPnhjbGlwID0gdXBhX3JlYWRsKCZmZmItPnhjbGlwKTsJCS8qIFggcGxhbmUgY2xpcCAqLworCWN0eC0+ZGNzcyA9IHVwYV9yZWFkbCgmZmZiLT5kY3NzKTsJCS8qIERlcHRoIEN1ZSBTY2FsZSBTbG9wZSAqLworCWN0eC0+dmNsaXBtaW4gPSB1cGFfcmVhZGwoJmZmYi0+dmNsaXBtaW4pOwkvKiBQcmltYXJ5IFhZIGNsaXAsIG1pbmltdW0gKi8KKwljdHgtPnZjbGlwbWF4ID0gdXBhX3JlYWRsKCZmZmItPnZjbGlwbWF4KTsJLyogUHJpbWFyeSBYWSBjbGlwLCBtYXhpbXVtICovCisJY3R4LT52Y2xpcHptaW4gPSB1cGFfcmVhZGwoJmZmYi0+dmNsaXB6bWluKTsJLyogUHJpbWFyeSBaIGNsaXAsIG1pbmltdW0gKi8KKwljdHgtPnZjbGlwem1heCA9IHVwYV9yZWFkbCgmZmZiLT52Y2xpcHptYXgpOwkvKiBQcmltYXJ5IFogY2xpcCwgbWF4aW11bSAqLworCWN0eC0+ZGNzZiA9IHVwYV9yZWFkbCgmZmZiLT5kY3NmKTsJCS8qIERlcHRoIEN1ZSBTY2FsZSBGcm9udCBCb3VuZCAqLworCWN0eC0+ZGNzYiA9IHVwYV9yZWFkbCgmZmZiLT5kY3NiKTsJCS8qIERlcHRoIEN1ZSBTY2FsZSBCYWNrIEJvdW5kICovCisJY3R4LT5kY3pmID0gdXBhX3JlYWRsKCZmZmItPmRjemYpOwkJLyogRGVwdGggQ3VlIFNjYWxlIFogRnJvbnQgKi8KKwljdHgtPmRjemIgPSB1cGFfcmVhZGwoJmZmYi0+ZGN6Yik7CQkvKiBEZXB0aCBDdWUgU2NhbGUgWiBCYWNrICovCisJY3R4LT5ibGVuZGMgPSB1cGFfcmVhZGwoJmZmYi0+YmxlbmRjKTsJCS8qIEFscGhhIEJsZW5kIENvbnRyb2wgKi8KKwljdHgtPmJsZW5kYzEgPSB1cGFfcmVhZGwoJmZmYi0+YmxlbmRjMSk7CS8qIEFscGhhIEJsZW5kIENvbG9yIDEgKi8KKwljdHgtPmJsZW5kYzIgPSB1cGFfcmVhZGwoJmZmYi0+YmxlbmRjMik7CS8qIEFscGhhIEJsZW5kIENvbG9yIDIgKi8KKwljdHgtPmZiYyA9IHVwYV9yZWFkbCgmZmZiLT5mYmMpOwkJLyogRnJhbWUgQnVmZmVyIENvbnRyb2wgKi8KKwljdHgtPnJvcCA9IHVwYV9yZWFkbCgmZmZiLT5yb3ApOwkJLyogUmFzdGVyIE9wZXJhdGlvbiAqLworCWN0eC0+Y21wID0gdXBhX3JlYWRsKCZmZmItPmNtcCk7CQkvKiBDb21wYXJlIENvbnRyb2xzICovCisJY3R4LT5tYXRjaGFiID0gdXBhX3JlYWRsKCZmZmItPm1hdGNoYWIpOwkvKiBCdWZmZXIgQS9CIE1hdGNoIE9wcyAqLworCWN0eC0+bWF0Y2hjID0gdXBhX3JlYWRsKCZmZmItPm1hdGNoYyk7CQkvKiBCdWZmZXIgQyBNYXRjaCBPcHMgKi8KKwljdHgtPm1hZ25hYiA9IHVwYV9yZWFkbCgmZmZiLT5tYWduYWIpOwkJLyogQnVmZmVyIEEvQiBNYWduaXR1ZGUgT3BzICovCisJY3R4LT5tYWduYyA9IHVwYV9yZWFkbCgmZmZiLT5tYWduYyk7CQkvKiBCdWZmZXIgQyBNYWduaXR1ZGUgT3BzICovCisJY3R4LT5wbWFzayA9IHVwYV9yZWFkbCgmZmZiLT5wbWFzayk7CQkvKiBSR0IgUGxhbmUgTWFzayAqLworCWN0eC0+eHBtYXNrID0gdXBhX3JlYWRsKCZmZmItPnhwbWFzayk7CQkvKiBYIFBsYW5lIE1hc2sgKi8KKwljdHgtPnlwbWFzayA9IHVwYV9yZWFkbCgmZmZiLT55cG1hc2spOwkJLyogWSBQbGFuZSBNYXNrICovCisJY3R4LT56cG1hc2sgPSB1cGFfcmVhZGwoJmZmYi0+enBtYXNrKTsJCS8qIFogUGxhbmUgTWFzayAqLworCisJLyogQXV4aWxpYXJ5IENsaXBzLiAqLworCWN0eC0+YXV4Y2xpcDBtaW4gPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFswXS5taW4pOworCWN0eC0+YXV4Y2xpcDBtYXggPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFswXS5tYXgpOworCWN0eC0+YXV4Y2xpcDFtaW4gPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFsxXS5taW4pOworCWN0eC0+YXV4Y2xpcDFtYXggPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFsxXS5tYXgpOworCWN0eC0+YXV4Y2xpcDJtaW4gPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFsyXS5taW4pOworCWN0eC0+YXV4Y2xpcDJtYXggPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFsyXS5tYXgpOworCWN0eC0+YXV4Y2xpcDNtaW4gPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFszXS5taW4pOworCWN0eC0+YXV4Y2xpcDNtYXggPSB1cGFfcmVhZGwoJmZmYi0+YXV4Y2xpcFszXS5tYXgpOworCisJY3R4LT5scGF0ID0gdXBhX3JlYWRsKCZmZmItPmxwYXQpOwkJLyogTGluZSBQYXR0ZXJuICovCisJY3R4LT5mb250eHkgPSB1cGFfcmVhZGwoJmZmYi0+Zm9udHh5KTsJCS8qIFhZIEZvbnQgQ29vcmRpbmF0ZSAqLworCWN0eC0+Zm9udHcgPSB1cGFfcmVhZGwoJmZmYi0+Zm9udHcpOwkJLyogRm9udCBXaWR0aCAqLworCWN0eC0+Zm9udGluYyA9IHVwYV9yZWFkbCgmZmZiLT5mb250aW5jKTsJLyogRm9udCBYL1kgSW5jcmVtZW50ICovCisKKwkvKiBUaGVzZSByZWdpc3RlcnMvZmVhdHVyZXMgb25seSBleGlzdCBvbiBGRkIyIGFuZCBsYXRlciBjaGlwcy4gKi8KKwlpZiAoZnByaXYtPmZmYl90eXBlID49IGZmYjJfcHJvdG90eXBlKSB7CisJCWN0eC0+ZGNzczEgPSB1cGFfcmVhZGwoJmZmYi0+ZGNzczEpOwkvKiBEZXB0aCBDdWUgU2NhbGUgU2xvcGUgMSAqLworCQljdHgtPmRjc3MyID0gdXBhX3JlYWRsKCZmZmItPmRjc3MyKTsJLyogRGVwdGggQ3VlIFNjYWxlIFNsb3BlIDIgKi8KKwkJY3R4LT5kY3NzMiA9IHVwYV9yZWFkbCgmZmZiLT5kY3NzMyk7CS8qIERlcHRoIEN1ZSBTY2FsZSBTbG9wZSAzICovCisJCWN0eC0+ZGNzMiAgPSB1cGFfcmVhZGwoJmZmYi0+ZGNzMik7CS8qIERlcHRoIEN1ZSBTY2FsZSAyICovCisJCWN0eC0+ZGNzMyAgPSB1cGFfcmVhZGwoJmZmYi0+ZGNzMyk7CS8qIERlcHRoIEN1ZSBTY2FsZSAzICovCisJCWN0eC0+ZGNzNCAgPSB1cGFfcmVhZGwoJmZmYi0+ZGNzNCk7CS8qIERlcHRoIEN1ZSBTY2FsZSA0ICovCisJCWN0eC0+ZGNkMiAgPSB1cGFfcmVhZGwoJmZmYi0+ZGNkMik7CS8qIERlcHRoIEN1ZSBEZXB0aCAyICovCisJCWN0eC0+ZGNkMyAgPSB1cGFfcmVhZGwoJmZmYi0+ZGNkMyk7CS8qIERlcHRoIEN1ZSBEZXB0aCAzICovCisJCWN0eC0+ZGNkNCAgPSB1cGFfcmVhZGwoJmZmYi0+ZGNkNCk7CS8qIERlcHRoIEN1ZSBEZXB0aCA0ICovCisKKwkJLyogQW5kIHN0ZW5jaWwvc3RlbmNpbGN0bCBvbmx5IGV4aXN0cyBvbiBGRkIyKyBhbmQgbGF0ZXIKKwkJICogZHVlIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2YgM0RSQU0tSUlJLgorCQkgKi8KKwkJaWYgKGZwcml2LT5mZmJfdHlwZSA9PSBmZmIyX3ZlcnRpY2FsX3BsdXMgfHwKKwkJICAgIGZwcml2LT5mZmJfdHlwZSA9PSBmZmIyX2hvcml6b250YWxfcGx1cykgeworCQkJY3R4LT5zdGVuY2lsID0gdXBhX3JlYWRsKCZmZmItPnN0ZW5jaWwpOworCQkJY3R4LT5zdGVuY2lsY3RsID0gdXBhX3JlYWRsKCZmZmItPnN0ZW5jaWxjdGwpOworCQl9CisJfQorCisJLyogU2F2ZSB0aGUgMzJ4MzIgYXJlYSBwYXR0ZXJuLiAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQljdHgtPmFyZWFfcGF0dGVybltpXSA9IHVwYV9yZWFkbCgmZmZiLT5wYXR0ZXJuW2ldKTsKKworCS8qIEZpbmFsbHksIHN0YXNoIGF3YXkgdGhlIFVzZXIgQ29uc3RvbC9TdGF0dXMgUmVnaXN0ZXIuICovCisJY3R4LT51Y3NyID0gdXBhX3JlYWRsKCZmZmItPnVjc3IpOworfQorCitzdGF0aWMgdm9pZCBmZmJfcmVzdG9yZV9jb250ZXh0KGZmYl9kZXZfcHJpdl90ICpmcHJpdiwgaW50IG9sZCwgaW50IGlkeCkKK3sKKwlmZmJfZmJjUHRyIGZmYiA9IGZwcml2LT5yZWdzOworCXN0cnVjdCBmZmJfaHdfY29udGV4dCAqY3R4OworCWludCBpOworCisJY3R4ID0gZnByaXYtPmh3X3N0YXRlW2lkeCAtIDFdOworCWlmIChpZHggPT0gMCB8fCBjdHggPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGN0eC0+aXNfMmRfb25seSkgeworCQkvKiAyRCBhcHBsaWNhdGlvbnMgb25seSBjYXJlIGFib3V0IGNlcnRhaW4gcGllY2VzCisJCSAqIG9mIHN0YXRlLgorCQkgKi8KKwkJdXBhX3dyaXRlbChjdHgtPmRyYXdvcCwgJmZmYi0+ZHJhd29wKTsKKworCQkvKiBJZiB3ZSB3ZXJlIHJlc3RvcmluZyB0aGUgdmVydGV4IHJlZ2lzdGVycywgdGhpcyBpcyB3aGVyZQorCQkgKiB3ZSB3b3VsZCBkbyBpdC4gIFdlIHdvdWxkIHJlc3RvcmUgMzIgMzItYml0IHdvcmRzIHN0YXJ0aW5nCisJCSAqIGF0IGZmYi0+c3V2dHguCisJCSAqLworCisJCXVwYV93cml0ZWwoY3R4LT5wcGMsICZmZmItPnBwYyk7CisJCXVwYV93cml0ZWwoY3R4LT53aWQsICZmZmItPndpZCk7CisJCXVwYV93cml0ZWwoY3R4LT5mZywgICZmZmItPmZnKTsKKwkJdXBhX3dyaXRlbChjdHgtPmJnLCAmZmZiLT5iZyk7CisJCXVwYV93cml0ZWwoY3R4LT54Y2xpcCwgJmZmYi0+eGNsaXApOworCQl1cGFfd3JpdGVsKGN0eC0+ZmJjLCAmZmZiLT5mYmMpOworCQl1cGFfd3JpdGVsKGN0eC0+cm9wLCAmZmZiLT5yb3ApOworCQl1cGFfd3JpdGVsKGN0eC0+Y21wLCAmZmZiLT5jbXApOworCQl1cGFfd3JpdGVsKGN0eC0+bWF0Y2hhYiwgJmZmYi0+bWF0Y2hhYik7CisJCXVwYV93cml0ZWwoY3R4LT5tYWduYWIsICZmZmItPm1hZ25hYik7CisJCXVwYV93cml0ZWwoY3R4LT5wbWFzaywgJmZmYi0+cG1hc2spOworCQl1cGFfd3JpdGVsKGN0eC0+eHBtYXNrLCAmZmZiLT54cG1hc2spOworCQl1cGFfd3JpdGVsKGN0eC0+bHBhdCwgJmZmYi0+bHBhdCk7CisJCXVwYV93cml0ZWwoY3R4LT5mb250eHksICZmZmItPmZvbnR4eSk7CisJCXVwYV93cml0ZWwoY3R4LT5mb250dywgJmZmYi0+Zm9udHcpOworCQl1cGFfd3JpdGVsKGN0eC0+Zm9udGluYywgJmZmYi0+Zm9udGluYyk7CisKKwkJLyogc3RlbmNpbC9zdGVuY2lsY3RsIG9ubHkgZXhpc3RzIG9uIEZGQjIrIGFuZCBsYXRlcgorCQkgKiBkdWUgdG8gdGhlIGludHJvZHVjdGlvbiBvZiAzRFJBTS1JSUkuCisJCSAqLworCQlpZiAoZnByaXYtPmZmYl90eXBlID09IGZmYjJfdmVydGljYWxfcGx1cyB8fAorCQkgICAgZnByaXYtPmZmYl90eXBlID09IGZmYjJfaG9yaXpvbnRhbF9wbHVzKSB7CisJCQl1cGFfd3JpdGVsKGN0eC0+c3RlbmNpbCwgJmZmYi0+c3RlbmNpbCk7CisJCQl1cGFfd3JpdGVsKGN0eC0+c3RlbmNpbGN0bCwgJmZmYi0+c3RlbmNpbGN0bCk7CisJCQl1cGFfd3JpdGVsKDB4ODAwMDAwMDAsICZmZmItPmZiYyk7CisJCQl1cGFfd3JpdGVsKChjdHgtPnN0ZW5jaWxjdGwgfCAweDgwMDAwKSwKKwkJCQkgICAmZmZiLT5yYXdzdGVuY2lsY3RsKTsKKwkJCXVwYV93cml0ZWwoY3R4LT5mYmMsICZmZmItPmZiYyk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJCXVwYV93cml0ZWwoY3R4LT5hcmVhX3BhdHRlcm5baV0sICZmZmItPnBhdHRlcm5baV0pOworCQl1cGFfd3JpdGVsKChjdHgtPnVjc3IgJiAweGYwMDAwKSwgJmZmYi0+dWNzcik7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZXN0b3JlIGRyYXdvcC4gKi8KKwl1cGFfd3JpdGVsKGN0eC0+ZHJhd29wLCAmZmZiLT5kcmF3b3ApOworCisJLyogSWYgd2Ugd2VyZSByZXN0b3JpbmcgdGhlIHZlcnRleCByZWdpc3RlcnMsIHRoaXMgaXMgd2hlcmUKKwkgKiB3ZSB3b3VsZCBkbyBpdC4gIFdlIHdvdWxkIHJlc3RvcmUgMzIgMzItYml0IHdvcmRzIHN0YXJ0aW5nCisJICogYXQgZmZiLT5zdXZ0eC4KKwkgKi8KKworCS8qIFJlc3RvcmUgcmVuZGVyaW5nIGF0dHJpYnV0ZXMuICovCisKKwl1cGFfd3JpdGVsKGN0eC0+cHBjLCAmZmZiLT5wcGMpOwkJLyogUGl4ZWwgUHJvY2Vzc29yIENvbnRyb2wgKi8KKwl1cGFfd3JpdGVsKGN0eC0+d2lkLCAmZmZiLT53aWQpOwkJLyogQ3VycmVudCBXSUQgKi8KKwl1cGFfd3JpdGVsKGN0eC0+ZmcsICZmZmItPmZnKTsJCQkvKiBDb25zdGFudCBGRyBjb2xvciAqLworCXVwYV93cml0ZWwoY3R4LT5iZywgJmZmYi0+YmcpOwkJCS8qIENvbnN0YW50IEJHIGNvbG9yICovCisJdXBhX3dyaXRlbChjdHgtPmNvbnN0eSwgJmZmYi0+Y29uc3R5KTsJCS8qIENvbnN0YW50IFkgKi8KKwl1cGFfd3JpdGVsKGN0eC0+Y29uc3R6LCAmZmZiLT5jb25zdHopOwkJLyogQ29uc3RhbnQgWiAqLworCXVwYV93cml0ZWwoY3R4LT54Y2xpcCwgJmZmYi0+eGNsaXApOwkJLyogWCBwbGFuZSBjbGlwICovCisJdXBhX3dyaXRlbChjdHgtPmRjc3MsICZmZmItPmRjc3MpOwkJLyogRGVwdGggQ3VlIFNjYWxlIFNsb3BlICovCisJdXBhX3dyaXRlbChjdHgtPnZjbGlwbWluLCAmZmZiLT52Y2xpcG1pbik7CS8qIFByaW1hcnkgWFkgY2xpcCwgbWluaW11bSAqLworCXVwYV93cml0ZWwoY3R4LT52Y2xpcG1heCwgJmZmYi0+dmNsaXBtYXgpOwkvKiBQcmltYXJ5IFhZIGNsaXAsIG1heGltdW0gKi8KKwl1cGFfd3JpdGVsKGN0eC0+dmNsaXB6bWluLCAmZmZiLT52Y2xpcHptaW4pOwkvKiBQcmltYXJ5IFogY2xpcCwgbWluaW11bSAqLworCXVwYV93cml0ZWwoY3R4LT52Y2xpcHptYXgsICZmZmItPnZjbGlwem1heCk7CS8qIFByaW1hcnkgWiBjbGlwLCBtYXhpbXVtICovCisJdXBhX3dyaXRlbChjdHgtPmRjc2YsICZmZmItPmRjc2YpOwkJLyogRGVwdGggQ3VlIFNjYWxlIEZyb250IEJvdW5kICovCisJdXBhX3dyaXRlbChjdHgtPmRjc2IsICZmZmItPmRjc2IpOwkJLyogRGVwdGggQ3VlIFNjYWxlIEJhY2sgQm91bmQgKi8KKwl1cGFfd3JpdGVsKGN0eC0+ZGN6ZiwgJmZmYi0+ZGN6Zik7CQkvKiBEZXB0aCBDdWUgU2NhbGUgWiBGcm9udCAqLworCXVwYV93cml0ZWwoY3R4LT5kY3piLCAmZmZiLT5kY3piKTsJCS8qIERlcHRoIEN1ZSBTY2FsZSBaIEJhY2sgKi8KKwl1cGFfd3JpdGVsKGN0eC0+YmxlbmRjLCAmZmZiLT5ibGVuZGMpOwkJLyogQWxwaGEgQmxlbmQgQ29udHJvbCAqLworCXVwYV93cml0ZWwoY3R4LT5ibGVuZGMxLCAmZmZiLT5ibGVuZGMxKTsJLyogQWxwaGEgQmxlbmQgQ29sb3IgMSAqLworCXVwYV93cml0ZWwoY3R4LT5ibGVuZGMyLCAmZmZiLT5ibGVuZGMyKTsJLyogQWxwaGEgQmxlbmQgQ29sb3IgMiAqLworCXVwYV93cml0ZWwoY3R4LT5mYmMsICZmZmItPmZiYyk7CQkvKiBGcmFtZSBCdWZmZXIgQ29udHJvbCAqLworCXVwYV93cml0ZWwoY3R4LT5yb3AsICZmZmItPnJvcCk7CQkvKiBSYXN0ZXIgT3BlcmF0aW9uICovCisJdXBhX3dyaXRlbChjdHgtPmNtcCwgJmZmYi0+Y21wKTsJCS8qIENvbXBhcmUgQ29udHJvbHMgKi8KKwl1cGFfd3JpdGVsKGN0eC0+bWF0Y2hhYiwgJmZmYi0+bWF0Y2hhYik7CS8qIEJ1ZmZlciBBL0IgTWF0Y2ggT3BzICovCisJdXBhX3dyaXRlbChjdHgtPm1hdGNoYywgJmZmYi0+bWF0Y2hjKTsJCS8qIEJ1ZmZlciBDIE1hdGNoIE9wcyAqLworCXVwYV93cml0ZWwoY3R4LT5tYWduYWIsICZmZmItPm1hZ25hYik7CQkvKiBCdWZmZXIgQS9CIE1hZ25pdHVkZSBPcHMgKi8KKwl1cGFfd3JpdGVsKGN0eC0+bWFnbmMsICZmZmItPm1hZ25jKTsJCS8qIEJ1ZmZlciBDIE1hZ25pdHVkZSBPcHMgKi8KKwl1cGFfd3JpdGVsKGN0eC0+cG1hc2ssICZmZmItPnBtYXNrKTsJCS8qIFJHQiBQbGFuZSBNYXNrICovCisJdXBhX3dyaXRlbChjdHgtPnhwbWFzaywgJmZmYi0+eHBtYXNrKTsJCS8qIFggUGxhbmUgTWFzayAqLworCXVwYV93cml0ZWwoY3R4LT55cG1hc2ssICZmZmItPnlwbWFzayk7CQkvKiBZIFBsYW5lIE1hc2sgKi8KKwl1cGFfd3JpdGVsKGN0eC0+enBtYXNrLCAmZmZiLT56cG1hc2spOwkJLyogWiBQbGFuZSBNYXNrICovCisKKwkvKiBBdXhpbGlhcnkgQ2xpcHMuICovCisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAwbWluLCAmZmZiLT5hdXhjbGlwWzBdLm1pbik7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAwbWF4LCAmZmZiLT5hdXhjbGlwWzBdLm1heCk7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAxbWluLCAmZmZiLT5hdXhjbGlwWzFdLm1pbik7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAxbWF4LCAmZmZiLT5hdXhjbGlwWzFdLm1heCk7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAybWluLCAmZmZiLT5hdXhjbGlwWzJdLm1pbik7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAybWF4LCAmZmZiLT5hdXhjbGlwWzJdLm1heCk7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAzbWluLCAmZmZiLT5hdXhjbGlwWzNdLm1pbik7CisJdXBhX3dyaXRlbChjdHgtPmF1eGNsaXAzbWF4LCAmZmZiLT5hdXhjbGlwWzNdLm1heCk7CisKKwl1cGFfd3JpdGVsKGN0eC0+bHBhdCwgJmZmYi0+bHBhdCk7CQkvKiBMaW5lIFBhdHRlcm4gKi8KKwl1cGFfd3JpdGVsKGN0eC0+Zm9udHh5LCAmZmZiLT5mb250eHkpOwkJLyogWFkgRm9udCBDb29yZGluYXRlICovCisJdXBhX3dyaXRlbChjdHgtPmZvbnR3LCAmZmZiLT5mb250dyk7CQkvKiBGb250IFdpZHRoICovCisJdXBhX3dyaXRlbChjdHgtPmZvbnRpbmMsICZmZmItPmZvbnRpbmMpOwkvKiBGb250IFgvWSBJbmNyZW1lbnQgKi8KKworCS8qIFRoZXNlIHJlZ2lzdGVycy9mZWF0dXJlcyBvbmx5IGV4aXN0IG9uIEZGQjIgYW5kIGxhdGVyIGNoaXBzLiAqLworCWlmIChmcHJpdi0+ZmZiX3R5cGUgPj0gZmZiMl9wcm90b3R5cGUpIHsKKwkJdXBhX3dyaXRlbChjdHgtPmRjc3MxLCAmZmZiLT5kY3NzMSk7CS8qIERlcHRoIEN1ZSBTY2FsZSBTbG9wZSAxICovCisJCXVwYV93cml0ZWwoY3R4LT5kY3NzMiwgJmZmYi0+ZGNzczIpOwkvKiBEZXB0aCBDdWUgU2NhbGUgU2xvcGUgMiAqLworCQl1cGFfd3JpdGVsKGN0eC0+ZGNzczMsICZmZmItPmRjc3MyKTsJLyogRGVwdGggQ3VlIFNjYWxlIFNsb3BlIDMgKi8KKwkJdXBhX3dyaXRlbChjdHgtPmRjczIsICZmZmItPmRjczIpOwkvKiBEZXB0aCBDdWUgU2NhbGUgMiAqLworCQl1cGFfd3JpdGVsKGN0eC0+ZGNzMywgJmZmYi0+ZGNzMyk7CS8qIERlcHRoIEN1ZSBTY2FsZSAzICovCisJCXVwYV93cml0ZWwoY3R4LT5kY3M0LCAmZmZiLT5kY3M0KTsJLyogRGVwdGggQ3VlIFNjYWxlIDQgKi8KKwkJdXBhX3dyaXRlbChjdHgtPmRjZDIsICZmZmItPmRjZDIpOwkvKiBEZXB0aCBDdWUgRGVwdGggMiAqLworCQl1cGFfd3JpdGVsKGN0eC0+ZGNkMywgJmZmYi0+ZGNkMyk7CS8qIERlcHRoIEN1ZSBEZXB0aCAzICovCisJCXVwYV93cml0ZWwoY3R4LT5kY2Q0LCAmZmZiLT5kY2Q0KTsJLyogRGVwdGggQ3VlIERlcHRoIDQgKi8KKworCQkvKiBBbmQgc3RlbmNpbC9zdGVuY2lsY3RsIG9ubHkgZXhpc3RzIG9uIEZGQjIrIGFuZCBsYXRlcgorCQkgKiBkdWUgdG8gdGhlIGludHJvZHVjdGlvbiBvZiAzRFJBTS1JSUkuCisJCSAqLworCQlpZiAoZnByaXYtPmZmYl90eXBlID09IGZmYjJfdmVydGljYWxfcGx1cyB8fAorCQkgICAgZnByaXYtPmZmYl90eXBlID09IGZmYjJfaG9yaXpvbnRhbF9wbHVzKSB7CisJCQkvKiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBhIGhhcmR3YXJlIGJ1ZyBvbgorCQkJICogdGhlIEZGQjIrIGNoaXBzIHdoaWNoIHByZXZlbnRzIGEgbm9ybWFsIHdyaXRlCisJCQkgKiB0byB0aGUgc3RlbmNpbCBjb250cm9sIHJlZ2lzdGVyIGZyb20gd29ya2luZworCQkJICogYXMgaXQgc2hvdWxkLgorCQkJICoKKwkJCSAqIFRoZSBzdGF0ZSBjb250cm9sbGVkIGJ5IHRoZSBGRkIgc3RlbmNpbGN0bCByZWdpc3RlcgorCQkJICogcmVhbGx5IGdldHMgdHJhbnNmZXJyZWQgdG8gdGhlIHBlci1idWZmZXIgaW5zdGFuY2VzCisJCQkgKiBvZiB0aGUgc3RlbmNpbGN0bCByZWdpc3RlciBpbiB0aGUgM0RSQU0gY2hpcHMuCisJCQkgKgorCQkJICogVGhlIGJ1ZyBpcyB0aGF0IEZGQiBkb2VzIG5vdCB1cGRhdGUgYnVmZmVyIEMgY29ycmVjdGx5LAorCQkJICogc28gd2UgaGF2ZSB0byBkbyBpdCBieSBoYW5kIGZvciB0aGVtLgorCQkJICovCisKKwkJCS8qIFRoaXMgd2lsbCB1cGRhdGUgYnVmZmVycyBBIGFuZCBCLiAqLworCQkJdXBhX3dyaXRlbChjdHgtPnN0ZW5jaWwsICZmZmItPnN0ZW5jaWwpOworCQkJdXBhX3dyaXRlbChjdHgtPnN0ZW5jaWxjdGwsICZmZmItPnN0ZW5jaWxjdGwpOworCisJCQkvKiBGb3JjZSBGRkIgdG8gdXNlIGJ1ZmZlciBDIDNkcmFtIHJlZ3MuICovCisJCQl1cGFfd3JpdGVsKDB4ODAwMDAwMDAsICZmZmItPmZiYyk7CisJCQl1cGFfd3JpdGVsKChjdHgtPnN0ZW5jaWxjdGwgfCAweDgwMDAwKSwKKwkJCQkgICAmZmZiLT5yYXdzdGVuY2lsY3RsKTsKKworCQkJLyogTm93IHJlc3RvcmUgdGhlIGNvcnJlY3QgRkJDIGNvbnRyb2xzLiAqLworCQkJdXBhX3dyaXRlbChjdHgtPmZiYywgJmZmYi0+ZmJjKTsKKwkJfQorCX0KKworCS8qIFJlc3RvcmUgdGhlIDMyeDMyIGFyZWEgcGF0dGVybi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJdXBhX3dyaXRlbChjdHgtPmFyZWFfcGF0dGVybltpXSwgJmZmYi0+cGF0dGVybltpXSk7CisKKwkvKiBGaW5hbGx5LCBzdGFzaCBhd2F5IHRoZSBVc2VyIENvbnN0b2wvU3RhdHVzIFJlZ2lzdGVyLgorCSAqIFRoZSBvbmx5IHN0YXRlIHdlIHJlYWxseSBwcmVzZXJ2ZSBoZXJlIGlzIHRoZSBwaWNraW5nCisJICogY29udHJvbC4KKwkgKi8KKwl1cGFfd3JpdGVsKChjdHgtPnVjc3IgJiAweGYwMDAwKSwgJmZmYi0+dWNzcik7Cit9CisKKyNkZWZpbmUgRkZCX1VDU1JfRkJfQlVTWSAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEZGQl9VQ1NSX1JQX0JVU1kgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBGRkJfVUNTUl9BTExfQlVTWSAgICAgIChGRkJfVUNTUl9SUF9CVVNZfEZGQl9VQ1NSX0ZCX0JVU1kpCisKK3N0YXRpYyB2b2lkIEZGQldhaXQoZmZiX2ZiY1B0ciBmZmIpCit7CisJaW50IGxpbWl0ID0gMTAwMDAwOworCisJZG8geworCQl1MzIgcmVndmFsID0gdXBhX3JlYWRsKCZmZmItPnVjc3IpOworCisJCWlmICgocmVndmFsICYgRkZCX1VDU1JfQUxMX0JVU1kpID09IDApCisJCQlicmVhazsKKwl9IHdoaWxlICgtLWxpbWl0KTsKK30KKworaW50IGZmYl9kcml2ZXJfY29udGV4dF9zd2l0Y2goZHJtX2RldmljZV90ICpkZXYsIGludCBvbGQsIGludCBuZXcpCit7CisJZmZiX2Rldl9wcml2X3QgKmZwcml2ID0gKGZmYl9kZXZfcHJpdl90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKyNpZmRlZiBEUk1fRE1BX0hJU1RPR1JBTQorICAgICAgICBkZXYtPmN0eF9zdGFydCA9IGdldF9jeWNsZXMoKTsKKyNlbmRpZgorICAgICAgICAKKyAgICAgICAgRFJNX0RFQlVHKCJDb250ZXh0IHN3aXRjaCBmcm9tICVkIHRvICVkXG4iLCBvbGQsIG5ldyk7CisKKyAgICAgICAgaWYgKG5ldyA9PSBkZXYtPmxhc3RfY29udGV4dCB8fAorCSAgICBkZXYtPmxhc3RfY29udGV4dCA9PSAwKSB7CisJCWRldi0+bGFzdF9jb250ZXh0ID0gbmV3OworICAgICAgICAgICAgICAgIHJldHVybiAwOworCX0KKyAgICAgICAgCisJRkZCV2FpdChmcHJpdi0+cmVncyk7CisJZmZiX3NhdmVfY29udGV4dChmcHJpdiwgb2xkKTsKKwlmZmJfcmVzdG9yZV9jb250ZXh0KGZwcml2LCBvbGQsIG5ldyk7CisJRkZCV2FpdChmcHJpdi0+cmVncyk7CisgICAgICAgIAorCWRldi0+bGFzdF9jb250ZXh0ID0gbmV3OworCisgICAgICAgIHJldHVybiAwOworfQorCitpbnQgZmZiX2RyaXZlcl9yZXNjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9jdHhfcmVzX3QJcmVzOworCWRybV9jdHhfdAljdHg7CisJaW50CQlpOworCisJRFJNX0RFQlVHKCIlZFxuIiwgRFJNX1JFU0VSVkVEX0NPTlRFWFRTKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcywgKGRybV9jdHhfcmVzX3QgX191c2VyICopYXJnLCBzaXplb2YocmVzKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChyZXMuY291bnQgPj0gRFJNX1JFU0VSVkVEX0NPTlRFWFRTKSB7CisJCW1lbXNldCgmY3R4LCAwLCBzaXplb2YoY3R4KSk7CisJCWZvciAoaSA9IDA7IGkgPCBEUk1fUkVTRVJWRURfQ09OVEVYVFM7IGkrKykgeworCQkJY3R4LmhhbmRsZSA9IGk7CisJCQlpZiAoY29weV90b191c2VyKCZyZXMuY29udGV4dHNbaV0sCisJCQkJCSAmaSwKKwkJCQkJIHNpemVvZihpKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJcmVzLmNvdW50ID0gRFJNX1JFU0VSVkVEX0NPTlRFWFRTOworCWlmIChjb3B5X3RvX3VzZXIoKGRybV9jdHhfcmVzX3QgX191c2VyICopYXJnLCAmcmVzLCBzaXplb2YocmVzKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisKK2ludCBmZmJfZHJpdmVyX2FkZGN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3QJY3R4OworCWludCBpZHg7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWR4ID0gRFJNKGFsbG9jX3F1ZXVlKShkZXYsIChjdHguZmxhZ3MgJiBfRFJNX0NPTlRFWFRfMkRPTkxZKSk7CisJaWYgKGlkeCA8IDApCisJCXJldHVybiAtRU5GSUxFOworCisJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CisJY3R4LmhhbmRsZSA9IGlkeDsKKwlpZiAoY29weV90b191c2VyKChkcm1fY3R4X3QgX191c2VyICopYXJnLCAmY3R4LCBzaXplb2YoY3R4KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitpbnQgZmZiX2RyaXZlcl9tb2RjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5kZXY7CisJZmZiX2Rldl9wcml2X3QJKmZwcml2CT0gKGZmYl9kZXZfcHJpdl90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGZmYl9od19jb250ZXh0ICpod2N0eDsKKwlkcm1fY3R4X3QgY3R4OworCWludCBpZHg7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZHggPSBjdHguaGFuZGxlOworCWlmIChpZHggPD0gMCB8fCBpZHggPj0gRkZCX01BWF9DVFhTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh3Y3R4ID0gZnByaXYtPmh3X3N0YXRlW2lkeCAtIDFdOworCWlmIChod2N0eCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoY3R4LmZsYWdzICYgX0RSTV9DT05URVhUXzJET05MWSkgPT0gMCkKKwkJaHdjdHgtPmlzXzJkX29ubHkgPSAwOworCWVsc2UKKwkJaHdjdHgtPmlzXzJkX29ubHkgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBmZmJfZHJpdmVyX2dldGN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlmZmJfZGV2X3ByaXZfdAkqZnByaXYJPSAoZmZiX2Rldl9wcml2X3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZmZiX2h3X2NvbnRleHQgKmh3Y3R4OworCWRybV9jdHhfdCBjdHg7CisJaW50IGlkeDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoZHJtX2N0eF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGN0eCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlkeCA9IGN0eC5oYW5kbGU7CisJaWYgKGlkeCA8PSAwIHx8IGlkeCA+PSBGRkJfTUFYX0NUWFMpCisJCXJldHVybiAtRUlOVkFMOworCisJaHdjdHggPSBmcHJpdi0+aHdfc3RhdGVbaWR4IC0gMV07CisJaWYgKGh3Y3R4ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGh3Y3R4LT5pc18yZF9vbmx5ICE9IDApCisJCWN0eC5mbGFncyA9IF9EUk1fQ09OVEVYVF8yRE9OTFk7CisJZWxzZQorCQljdHguZmxhZ3MgPSAwOworCisJaWYgKGNvcHlfdG9fdXNlcigoZHJtX2N0eF90IF9fdXNlciAqKWFyZywgJmN0eCwgc2l6ZW9mKGN0eCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitpbnQgZmZiX2RyaXZlcl9zd2l0Y2hjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5kZXY7CisJZHJtX2N0eF90CWN0eDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoZHJtX2N0eF90ICBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CisJcmV0dXJuIGZmYl9kcml2ZXJfY29udGV4dF9zd2l0Y2goZGV2LCBkZXYtPmxhc3RfY29udGV4dCwgY3R4LmhhbmRsZSk7Cit9CisKK2ludCBmZmJfZHJpdmVyX25ld2N0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2N0eF90CWN0eDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoZHJtX2N0eF90ICBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGZmYl9kcml2ZXJfcm1jdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9jdHhfdAljdHg7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlmZmJfZGV2X3ByaXZfdAkqZnByaXYJPSAoZmZiX2Rldl9wcml2X3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaWR4OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChkcm1fY3R4X3QgX191c2VyICopYXJnLCBzaXplb2YoY3R4KSkpCisJCXJldHVybiAtRUZBVUxUOworCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOworCisJaWR4ID0gY3R4LmhhbmRsZSAtIDE7CisJaWYgKGlkeCA8IDAgfHwgaWR4ID49IEZGQl9NQVhfQ1RYUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZnByaXYtPmh3X3N0YXRlW2lkeF0gIT0gTlVMTCkgeworCQlrZnJlZShmcHJpdi0+aHdfc3RhdGVbaWR4XSk7CisJCWZwcml2LT5od19zdGF0ZVtpZHhdID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmZiX3NldF9jb250ZXh0X2lvY3Rscyh2b2lkKQoreworCURSTShpb2N0bHMpW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUREX0NUWCldLmZ1bmMgPSBmZmJfZHJpdmVyX2FkZGN0eDsKKwlEUk0oaW9jdGxzKVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JNX0NUWCldLmZ1bmMgPSBmZmJfZHJpdmVyX3JtY3R4OworCURSTShpb2N0bHMpW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTU9EX0NUWCldLmZ1bmMgPSBmZmJfZHJpdmVyX21vZGN0eDsKKwlEUk0oaW9jdGxzKVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9DVFgpXS5mdW5jID0gZmZiX2RyaXZlcl9nZXRjdHg7CisJRFJNKGlvY3RscylbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TV0lUQ0hfQ1RYKV0uZnVuYyA9IGZmYl9kcml2ZXJfc3dpdGNoY3R4OworCURSTShpb2N0bHMpW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTkVXX0NUWCldLmZ1bmMgPSBmZmJfZHJpdmVyX25ld2N0eDsKKwlEUk0oaW9jdGxzKVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JFU19DVFgpXS5mdW5jID0gZmZiX2RyaXZlcl9yZXNjdHg7CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZmZiX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9mZmJfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2MTRmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZmZiX2Rydi5jCkBAIC0wLDAgKzEsMzY1IEBACisvKiAkSWQ6IGZmYl9kcnYuYyx2IDEuMTYgMjAwMS8xMC8xOCAxNjowMDoyNCBkYXZlbSBFeHAgJAorICogZmZiX2Rydi5jOiBDcmVhdG9yL0NyZWF0b3IzRCBkaXJlY3QgcmVuZGVyaW5nIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJmZmIuaCIKKyNpbmNsdWRlICJkcm1QLmgiCisKKyNpbmNsdWRlICJmZmJfZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3NobXBhcmFtLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3VwYS5oPgorCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJEYXZpZCBTLiBNaWxsZXIiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJmZmIiCisjZGVmaW5lIERSSVZFUl9ERVNDCQkiQ3JlYXRvci9DcmVhdG9yM0QiCisjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwMDA1MTciCisKKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkwCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMAorI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkxCisKK3R5cGVkZWYgc3RydWN0IF9mZmJfcG9zaXRpb25fdCB7CisJaW50IG5vZGU7CisJaW50IHJvb3Q7Cit9IGZmYl9wb3NpdGlvbl90OworCitzdGF0aWMgZmZiX3Bvc2l0aW9uX3QgKmZmYl9wb3NpdGlvbjsKKworc3RhdGljIHZvaWQgZ2V0X2ZmYl90eXBlKGZmYl9kZXZfcHJpdl90ICpmZmJfcHJpdiwgaW50IGluc3RhbmNlKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnN0cmFwX2JpdHM7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlzdHJhcF9iaXRzID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikKKwkJKGZmYl9wcml2LT5jYXJkX3BoeXNfYmFzZSArIDB4MDAyMDAwMDBVTCk7CisKKwkvKiBEb24ndCBhc2ssIHlvdSBoYXZlIHRvIHJlYWQgdGhlIHZhbHVlIHR3aWNlIGZvciB3aGF0ZXZlcgorCSAqIHJlYXNvbiB0byBnZXQgY29ycmVjdCBjb250ZW50cy4KKwkgKi8KKwl2YWwgPSB1cGFfcmVhZGIoc3RyYXBfYml0cyk7CisJdmFsID0gdXBhX3JlYWRiKHN0cmFwX2JpdHMpOworCXN3aXRjaCAodmFsICYgMHg3OCkgeworCWNhc2UgKDB4MCA8PCA1KSB8ICgweDAgPDwgMyk6CisJCWZmYl9wcml2LT5mZmJfdHlwZSA9IGZmYjFfcHJvdG90eXBlOworCQlwcmludGsoImZmYiVkOiBEZXRlY3RlZCBGRkIxIHByZS1GQ1MgcHJvdG90eXBlXG4iLCBpbnN0YW5jZSk7CisJCWJyZWFrOworCWNhc2UgKDB4MCA8PCA1KSB8ICgweDEgPDwgMyk6CisJCWZmYl9wcml2LT5mZmJfdHlwZSA9IGZmYjFfc3RhbmRhcmQ7CisJCXByaW50aygiZmZiJWQ6IERldGVjdGVkIEZGQjFcbiIsIGluc3RhbmNlKTsKKwkJYnJlYWs7CisJY2FzZSAoMHgwIDw8IDUpIHwgKDB4MyA8PCAzKToKKwkJZmZiX3ByaXYtPmZmYl90eXBlID0gZmZiMV9zcGVlZHNvcnQ7CisJCXByaW50aygiZmZiJWQ6IERldGVjdGVkIEZGQjEtU3BlZWRTb3J0XG4iLCBpbnN0YW5jZSk7CisJCWJyZWFrOworCWNhc2UgKDB4MSA8PCA1KSB8ICgweDAgPDwgMyk6CisJCWZmYl9wcml2LT5mZmJfdHlwZSA9IGZmYjJfcHJvdG90eXBlOworCQlwcmludGsoImZmYiVkOiBEZXRlY3RlZCBGRkIyL3ZlcnRpY2FsIHByZS1GQ1MgcHJvdG90eXBlXG4iLCBpbnN0YW5jZSk7CisJCWJyZWFrOworCWNhc2UgKDB4MSA8PCA1KSB8ICgweDEgPDwgMyk6CisJCWZmYl9wcml2LT5mZmJfdHlwZSA9IGZmYjJfdmVydGljYWw7CisJCXByaW50aygiZmZiJWQ6IERldGVjdGVkIEZGQjIvdmVydGljYWxcbiIsIGluc3RhbmNlKTsKKwkJYnJlYWs7CisJY2FzZSAoMHgxIDw8IDUpIHwgKDB4MiA8PCAzKToKKwkJZmZiX3ByaXYtPmZmYl90eXBlID0gZmZiMl92ZXJ0aWNhbF9wbHVzOworCQlwcmludGsoImZmYiVkOiBEZXRlY3RlZCBGRkIyKy92ZXJ0aWNhbFxuIiwgaW5zdGFuY2UpOworCQlicmVhazsKKwljYXNlICgweDIgPDwgNSkgfCAoMHgwIDw8IDMpOgorCQlmZmJfcHJpdi0+ZmZiX3R5cGUgPSBmZmIyX2hvcml6b250YWw7CisJCXByaW50aygiZmZiJWQ6IERldGVjdGVkIEZGQjIvaG9yaXpvbnRhbFxuIiwgaW5zdGFuY2UpOworCQlicmVhazsKKwljYXNlICgweDIgPDwgNSkgfCAoMHgyIDw8IDMpOgorCQlmZmJfcHJpdi0+ZmZiX3R5cGUgPSBmZmIyX2hvcml6b250YWw7CisJCXByaW50aygiZmZiJWQ6IERldGVjdGVkIEZGQjIrL2hvcml6b250YWxcbiIsIGluc3RhbmNlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZmZiX3ByaXYtPmZmYl90eXBlID0gZmZiMl92ZXJ0aWNhbDsKKwkJcHJpbnRrKCJmZmIlZDogVW5rbm93biBib2FyZElEWyUwOHhdLCBhc3N1bWluZyBGRkIyXG4iLCBpbnN0YW5jZSwgdmFsKTsKKwkJYnJlYWs7CisJfTsKK30KKworc3RhdGljIHZvaWQgZmZiX2FwcGx5X3VwYV9wYXJlbnRfcmFuZ2VzKGludCBwYXJlbnQsIAorCQkJCQlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcmVncykKK3sKKwlzdHJ1Y3QgbGludXhfcHJvbTY0X3JhbmdlcyByYW5nZXNbUFJPTVJFR19NQVhdOworCWNoYXIgbmFtZVsxMjhdOworCWludCBsZW4sIGk7CisKKwlwcm9tX2dldHByb3BlcnR5KHBhcmVudCwgIm5hbWUiLCBuYW1lLCBzaXplb2YobmFtZSkpOworCWlmIChzdHJjbXAobmFtZSwgInVwYSIpICE9IDApCisJCXJldHVybjsKKworCWxlbiA9IHByb21fZ2V0cHJvcGVydHkocGFyZW50LCAicmFuZ2VzIiwgKHZvaWQgKikgcmFuZ2VzLCBzaXplb2YocmFuZ2VzKSk7CisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm47CisKKwlsZW4gLz0gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tNjRfcmFuZ2VzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJc3RydWN0IGxpbnV4X3Byb202NF9yYW5nZXMgKnJuZyA9ICZyYW5nZXNbaV07CisJCXU2NCBwaHlzX2FkZHIgPSByZWdzLT5waHlzX2FkZHI7CisKKwkJaWYgKHBoeXNfYWRkciA+PSBybmctPm90X2NoaWxkX2Jhc2UgJiYKKwkJICAgIHBoeXNfYWRkciA8IChybmctPm90X2NoaWxkX2Jhc2UgKyBybmctPm9yX3NpemUpKSB7CisJCQlyZWdzLT5waHlzX2FkZHIgLT0gcm5nLT5vdF9jaGlsZF9iYXNlOworCQkJcmVncy0+cGh5c19hZGRyICs9IHJuZy0+b3RfcGFyZW50X2Jhc2U7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgZmZiX2luaXRfb25lKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgcHJvbV9ub2RlLCBpbnQgcGFyZW50X25vZGUsCisJCQlpbnQgaW5zdGFuY2UpCit7CisJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgcmVnc1syKlBST01SRUdfTUFYXTsKKwlmZmJfZGV2X3ByaXZfdCAqZmZiX3ByaXYgPSAoZmZiX2Rldl9wcml2X3QgKilkZXYtPmRldl9wcml2YXRlOworCWludCBpOworCisJZmZiX3ByaXYtPnByb21fbm9kZSA9IHByb21fbm9kZTsKKwlpZiAocHJvbV9nZXRwcm9wZXJ0eShmZmJfcHJpdi0+cHJvbV9ub2RlLCAicmVnIiwKKwkJCSAgICAgKHZvaWQgKilyZWdzLCBzaXplb2YocmVncykpIDw9IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZmYl9hcHBseV91cGFfcGFyZW50X3JhbmdlcyhwYXJlbnRfbm9kZSwgJnJlZ3NbMF0pOworCWZmYl9wcml2LT5jYXJkX3BoeXNfYmFzZSA9IHJlZ3NbMF0ucGh5c19hZGRyOworCWZmYl9wcml2LT5yZWdzID0gKGZmYl9mYmNQdHIpCisJCShyZWdzWzBdLnBoeXNfYWRkciArIDB4MDA2MDAwMDBVTCk7CisJZ2V0X2ZmYl90eXBlKGZmYl9wcml2LCBpbnN0YW5jZSk7CisJZm9yIChpID0gMDsgaSA8IEZGQl9NQVhfQ1RYUzsgaSsrKQorCQlmZmJfcHJpdi0+aHdfc3RhdGVbaV0gPSBOVUxMOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgZHJtX21hcF90ICpmZmJfZmluZF9tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgb2ZmKQoreworCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXY7CisJZHJtX21hcF9saXN0X3QgICpyX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlkcm1fbWFwX3QJKm1hcDsKKworCWlmICghcHJpdiB8fCAoZGV2ID0gcHJpdi0+ZGV2KSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQl1bnNpZ25lZCBsb25nIHVvZmY7CisKKwkJcl9saXN0ID0gKGRybV9tYXBfbGlzdF90ICopbGlzdDsKKwkJbWFwID0gcl9saXN0LT5tYXA7CisJCWlmICghbWFwKQorCQkJY29udGludWU7CisJCXVvZmYgPSAobWFwLT5vZmZzZXQgJiAweGZmZmZmZmZmKTsKKwkJaWYgKHVvZmYgPT0gb2ZmKQorCQkJcmV0dXJuIG1hcDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordW5zaWduZWQgbG9uZyBmZmJfZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgaGludCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgcGdvZmYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJZHJtX21hcF90ICptYXAgPSBmZmJfZmluZF9tYXAoZmlscCwgcGdvZmYgPDwgUEFHRV9TSElGVCk7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gLUVOT01FTTsKKworCWlmICghbWFwKQorCQlyZXR1cm4gZ2V0X3VubWFwcGVkX2FyZWEoTlVMTCwgaGludCwgbGVuLCBwZ29mZiwgZmxhZ3MpOworCisJaWYgKG1hcC0+dHlwZSA9PSBfRFJNX0ZSQU1FX0JVRkZFUiB8fAorCSAgICBtYXAtPnR5cGUgPT0gX0RSTV9SRUdJU1RFUlMpIHsKKyNpZmRlZiBIQVZFX0FSQ0hfRkJfVU5NQVBQRURfQVJFQQorCQlhZGRyID0gZ2V0X2ZiX3VubWFwcGVkX2FyZWEoZmlscCwgaGludCwgbGVuLCBwZ29mZiwgZmxhZ3MpOworI2Vsc2UKKwkJYWRkciA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIGhpbnQsIGxlbiwgcGdvZmYsIGZsYWdzKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAobWFwLT50eXBlID09IF9EUk1fU0hNICYmIFNITUxCQSA+IFBBR0VfU0laRSkgeworCQl1bnNpZ25lZCBsb25nIHNsYWNrID0gU0hNTEJBIC0gUEFHRV9TSVpFOworCisJCWFkZHIgPSBnZXRfdW5tYXBwZWRfYXJlYShOVUxMLCBoaW50LCBsZW4gKyBzbGFjaywgcGdvZmYsIGZsYWdzKTsKKwkJaWYgKCEoYWRkciAmIH5QQUdFX01BU0spKSB7CisJCQl1bnNpZ25lZCBsb25nIGt2aXJ0ID0gKHVuc2lnbmVkIGxvbmcpIG1hcC0+aGFuZGxlOworCisJCQlpZiAoKGt2aXJ0ICYgKFNITUxCQSAtIDEpKSAhPSAoYWRkciAmIChTSE1MQkEgLSAxKSkpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGtvZmYsIGFvZmY7CisKKwkJCQlrb2ZmID0ga3ZpcnQgJiAoU0hNTEJBIC0gMSk7CisJCQkJYW9mZiA9IGFkZHIgJiAoU0hNTEJBIC0gMSk7CisJCQkJaWYgKGtvZmYgPCBhb2ZmKQorCQkJCQlrb2ZmICs9IFNITUxCQTsKKworCQkJCWFkZHIgKz0gKGtvZmYgLSBhb2ZmKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWFkZHIgPSBnZXRfdW5tYXBwZWRfYXJlYShOVUxMLCBoaW50LCBsZW4sIHBnb2ZmLCBmbGFncyk7CisJfQorCisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyBpbnQgZmZiX3ByZXNldHVwKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWZmYl9kZXZfcHJpdl90CSpmZmJfcHJpdjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaSA9IDA7CisKKwkvKiBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgbm8gZGV2aWNlIHdhcyBmb3VuZC4gKi8KKwlpZiAoZmZiX3Bvc2l0aW9uID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJLyogY29kZSB1c2VkIHRvIHVzZSBudW1kZXZzIG5vIG51bWRldnMgYW55bW9yZSAqLworCWZmYl9wcml2ID0ga21hbGxvYyhzaXplb2YoZmZiX2Rldl9wcml2X3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZmYl9wcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmZiX3ByaXYsIDAsIHNpemVvZigqZmZiX3ByaXYpKTsKKwlkZXYtPmRldl9wcml2YXRlID0gZmZiX3ByaXY7CisKKwlyZXQgPSBmZmJfaW5pdF9vbmUoZGV2LAorCQkJICAgZmZiX3Bvc2l0aW9uW2ldLm5vZGUsCisJCQkgICBmZmJfcG9zaXRpb25baV0ucm9vdCwKKwkJCSAgIGkpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZmYl9kcml2ZXJfcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJZmZiX2Rldl9wcml2X3QgKmZwcml2ID0gKGZmYl9kZXZfcHJpdl90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGNvbnRleHQgPSBfRFJNX0xPQ0tJTkdfQ09OVEVYVChkZXYtPmxvY2suaHdfbG9jay0+bG9jayk7CisJaW50IGlkeDsKKworCWlkeCA9IGNvbnRleHQgLSAxOworCWlmIChmcHJpdiAmJgorCSAgICBjb250ZXh0ICE9IERSTV9LRVJORUxfQ09OVEVYVCAmJgorCSAgICBmcHJpdi0+aHdfc3RhdGVbaWR4XSAhPSBOVUxMKSB7CisJCWtmcmVlKGZwcml2LT5od19zdGF0ZVtpZHhdKTsKKwkJZnByaXYtPmh3X3N0YXRlW2lkeF0gPSBOVUxMOworCX0JCit9CisKK3N0YXRpYyB2b2lkIGZmYl9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpCit7CisJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIGtmcmVlKGRldi0+ZGV2X3ByaXZhdGUpOworfQorCitzdGF0aWMgaW50IGZmYl9kcml2ZXJfcG9zdGNsZWFudXAoZHJtX2RldmljZV90ICpkZXYpCit7CisJaWYgKGZmYl9wb3NpdGlvbiAhPSBOVUxMKSBrZnJlZShmZmJfcG9zaXRpb24pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmZmJfZHJpdmVyX2tlcm5lbF9jb250ZXh0X3N3aXRjaF91bmxvY2soc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2xvY2tfdCAqbG9jaykKK3sKKwlkZXYtPmxvY2suZmlscCA9IDA7CisJeworCQlfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICpwbG9jayA9ICZkZXYtPmxvY2suaHdfbG9jay0+bG9jazsKKwkJdW5zaWduZWQgaW50IG9sZCwgbmV3LCBwcmV2LCBjdHg7CisJCQorCQljdHggPSBsb2NrLT5jb250ZXh0OworCQlkbyB7CisJCQlvbGQgID0gKnBsb2NrOworCQkJbmV3ICA9IGN0eDsKKwkJCXByZXYgPSBjbXB4Y2hnKHBsb2NrLCBvbGQsIG5ldyk7CisJCX0gd2hpbGUgKHByZXYgIT0gb2xkKTsKKwl9CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPmxvY2subG9ja19xdWV1ZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZmYl9kcml2ZXJfZ2V0X21hcF9vZnMoZHJtX21hcF90ICptYXApCit7CisJcmV0dXJuIChtYXAtPm9mZnNldCAmIDB4ZmZmZmZmZmYpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmZmJfZHJpdmVyX2dldF9yZWdfb2ZzKGRybV9kZXZpY2VfdCAqZGV2KQoreworICAgICAgIGZmYl9kZXZfcHJpdl90ICpmZmJfcHJpdiA9IChmZmJfZGV2X3ByaXZfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAgCisgICAgICAgaWYgKGZmYl9wcml2KQorICAgICAgICAgICAgICAgcmV0dXJuIGZmYl9wcml2LT5jYXJkX3BoeXNfYmFzZTsKKyAgICAgICAKKyAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApIAoreworCURSTV9JTkZPKCAiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWRcbiIsCisJCURSSVZFUl9OQU1FLAorCQlEUklWRVJfTUFKT1IsCisJCURSSVZFUl9NSU5PUiwKKwkJRFJJVkVSX1BBVENITEVWRUwsCisJCURSSVZFUl9EQVRFLAorCQlkZXYtPm1pbm9yCisJCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyc2lvbiggZHJtX3ZlcnNpb25fdCAqdmVyc2lvbiApCit7CisJaW50IGxlbjsKKworCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKKwlEUk1fQ09QWSggdmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGRybV9pb2N0bF9kZXNjX3QgaW9jdGxzW10gPSB7CisJCit9OworCitzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0geworCS5kcml2ZXJfZmVhdHVyZXMgPSAwLAorCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKHUzMiksCisJLnJlbGVhc2UgPSBmZmJfZHJpdmVyX3JlbGVhc2UsCisJLnByZXNldHVwID0gZmZiX3ByZXNldHVwLAorCS5wcmV0YWtlZG93biA9IGZmYl9kcml2ZXJfcHJldGFrZWRvd24sCisJLnBvc3RjbGVhbnVwID0gZmZiX2RyaXZlcl9wb3N0Y2xlYW51cCwKKwkua2VybmVsX2NvbnRleHRfc3dpdGNoID0gZmZiX2RyaXZlcl9jb250ZXh0X3N3aXRjaCwKKwkua2VybmVsX2NvbnRleHRfc3dpdGNoX3VubG9jayA9IGZmYl9kcml2ZXJfa2VybmVsX2NvbnRleHRfc3dpdGNoX3VubG9jaywKKwkuZ2V0X21hcF9vZnMgPSBmZmJfZHJpdmVyX2dldF9tYXBfb2ZzLAorCS5nZXRfcmVnX29mcyA9IGZmYl9kcml2ZXJfZ2V0X3JlZ19vZnMsCisJLnBvc3Rpbml0ID0gcG9zdGluaXQsCisJLnZlcnNpb24gPSB2ZXJzaW9uLAorCS5pb2N0bHMgPSBpb2N0bHMsCisJLm51bV9pb2N0bHMgPSBEUk1fQVJSQVlfU0laRShpb2N0bHMpLAorCS5mb3BzID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9wZW4gPSBkcm1fb3BlbiwKKwkJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkJLmlvY3RsID0gZHJtX2lvY3RsLAorCQkubW1hcCA9IGRybV9tbWFwLAorCQkucG9sbCA9IGRybV9wb2xsLAorCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZmZiX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZmYl9leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KGZmYl9pbml0KTsKK21vZHVsZV9leGl0KGZmYl9leGl0KTsKKworTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOworTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZmZiX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9mZmJfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmN2YxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2ZmYl9kcnYuaApAQCAtMCwwICsxLDI4NiBAQAorLyogJElkOiBmZmJfZHJ2LmgsdiAxLjEgMjAwMC8wNi8wMSAwNDoyNDozOSBkYXZlbSBFeHAgJAorICogZmZiX2Rydi5oOiBDcmVhdG9yL0NyZWF0b3IzRCBkaXJlY3QgcmVuZGVyaW5nIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICovCisKKy8qIEF1eGlsbGlhcnkgY2xpcHMuICovCit0eXBlZGVmIHN0cnVjdCAgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBtaW47CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IG1heDsKK30gZmZiX2F1eGNsaXAsICpmZmJfYXV4Y2xpcFB0cjsKKworLyogRkZCIHJlZ2lzdGVyIHNldC4gKi8KK3R5cGVkZWYgc3RydWN0IF9mZmJfZmJjIHsKKwkvKiBOZXh0IHZlcnRleCByZWdpc3RlcnMsIG9uIHRoZSByaWdodCB3ZSBsaXN0IHdoaWNoIGRyYXdvcHMKKwkgKiB1c2Ugc2FpZCByZWdpc3RlciBhbmQgdGhlIGxvZ2ljYWwgbmFtZSB0aGUgcmVnaXN0ZXIgaGFzIGluCisJICogdGhhdCBjb250ZXh0LgorCSAqLwkJCQkJLyogREVTQ1JJUFRJT04JCURSQVdPUChOQU1FKQkqLworLyoweDAwKi91bnNpZ25lZCBpbnQJCXBhZDFbM107CS8qIFJlc2VydmVkCQkJCSovCisvKjB4MGMqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlhbHBoYTsJCS8qIEFMUEhBIFRyYW5zcGFyZW5jeQkJCSovCisvKjB4MTAqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlyZWQ7CQkvKiBSRUQJCQkJCSovCisvKjB4MTQqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlncmVlbjsJCS8qIEdSRUVOCQkJCSovCisvKjB4MTgqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlibHVlOwkJLyogQkxVRQkJCQkJKi8KKy8qMHgxYyovdm9sYXRpbGUgdW5zaWduZWQgaW50CXo7CQkvKiBERVBUSAkJCQkqLworLyoweDIwKi92b2xhdGlsZSB1bnNpZ25lZCBpbnQJeTsJCS8qIFkJCQl0cmlhbmdsZShET1lGKQkqLworCQkJCQkJLyogICAgICAgICAgICAgICAgICAgICAgYWFkb3QoRFlGKQkqLworCQkJCQkJLyogICAgICAgICAgICAgICAgICAgICAgZGRsaW5lKERZRikJKi8KKwkJCQkJCS8qICAgICAgICAgICAgICAgICAgICAgIGFhbGluZShEWUYpCSovCisvKjB4MjQqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAl4OwkJLyogWAkJCXRyaWFuZ2xlKERPWEYpCSovCisJCQkJCQkvKiAgICAgICAgICAgICAgICAgICAgICBhYWRvdChEWEYpCSovCisJCQkJCQkvKiAgICAgICAgICAgICAgICAgICAgICBkZGxpbmUoRFhGKQkqLworCQkJCQkJLyogICAgICAgICAgICAgICAgICAgICAgYWFsaW5lKERYRikJKi8KKy8qMHgyOCovdW5zaWduZWQgaW50CQlwYWQyWzJdOwkvKiBSZXNlcnZlZAkJCQkqLworLyoweDMwKi92b2xhdGlsZSB1bnNpZ25lZCBpbnQJcnlmOwkJLyogWSAoYWxpYXMgdG8gRE9ZRikJZGRsaW5lKFJZRikJKi8KKwkJCQkJCS8qCQkJYWFsaW5lKFJZRikJKi8KKwkJCQkJCS8qCQkJdHJpYW5nbGUoUllGKQkqLworLyoweDM0Ki92b2xhdGlsZSB1bnNpZ25lZCBpbnQJcnhmOwkJLyogWAkJCWRkbGluZShSWEYpCSovCisJCQkJCQkvKgkJCWFhbGluZShSWEYpCSovCisJCQkJCQkvKgkJCXRyaWFuZ2xlKFJYRikJKi8KKy8qMHgzOCovdW5zaWduZWQgaW50CQlwYWQzWzJdOwkvKiBSZXNlcnZlZAkJCQkqLworLyoweDQwKi92b2xhdGlsZSB1bnNpZ25lZCBpbnQJZG15ZjsJCS8qIFkgKGFsaWFzIHRvIERPWUYpCXRyaWFuZ2xlKERNWUYpCSovCisvKjB4NDQqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlkbXhmOwkJLyogWAkJCXRyaWFuZ2xlKERNWEYpCSovCisvKjB4NDgqL3Vuc2lnbmVkIGludAkJcGFkNFsyXTsJLyogUmVzZXJ2ZWQJCQkJKi8KKy8qMHg1MCovdm9sYXRpbGUgdW5zaWduZWQgaW50CWVieWk7CQkvKiBZIChhbGlhcyB0byBSWUkpCXBvbHlnb24oRUJZSSkJKi8KKy8qMHg1NCovdm9sYXRpbGUgdW5zaWduZWQgaW50CWVieGk7CQkvKiBYCQkJcG9seWdvbihFQlhJKQkqLworLyoweDU4Ki91bnNpZ25lZCBpbnQJCXBhZDVbMl07CS8qIFJlc2VydmVkCQkJCSovCisvKjB4NjAqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlieTsJCS8qIFkJCQlicmxpbmUoUllJKQkqLworCQkJCQkJLyoJCQlmYXN0ZmlsbChPUCkJKi8KKwkJCQkJCS8qCQkJcG9seWdvbihZSSkJKi8KKwkJCQkJCS8qCQkJcmVjdGFuZ2xlKFlJKQkqLworCQkJCQkJLyoJCQliY29weShTUkNZKQkqLworCQkJCQkJLyoJCQl2c2Nyb2xsKFNSQ1kpCSovCisvKjB4NjQqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlieDsJCS8qIFgJCQlicmxpbmUoUlhJKQkqLworCQkJCQkJLyoJCQlwb2x5Z29uKFhJKQkqLworCQkJCQkJLyoJCQlyZWN0YW5nbGUoWEkpCSovCisJCQkJCQkvKgkJCWJjb3B5KFNSQ1gpCSovCisJCQkJCQkvKgkJCXZzY3JvbGwoU1JDWCkJKi8KKwkJCQkJCS8qCQkJZmFzdGZpbGwoR08pCSovCisvKjB4NjgqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlkeTsJCS8qIGRlc3RpbmF0aW9uIFkJZmFzdGZpbGwoRFNUWSkJKi8KKwkJCQkJCS8qCQkJYmNvcHkoRFNSWSkJKi8KKwkJCQkJCS8qCQkJdnNjcm9sbChEU1JZKQkqLworLyoweDZjKi92b2xhdGlsZSB1bnNpZ25lZCBpbnQJZHg7CQkvKiBkZXN0aW5hdGlvbiBYCWZhc3RmaWxsKERTVFgpCSovCisJCQkJCQkvKgkJCWJjb3B5KERTVFgpCSovCisJCQkJCQkvKgkJCXZzY3JvbGwoRFNUWCkJKi8KKy8qMHg3MCovdm9sYXRpbGUgdW5zaWduZWQgaW50CWJoOwkJLyogWSAoYWxpYXMgdG8gUllJKQlicmxpbmUoRFlJKQkqLworCQkJCQkJLyoJCQlkb3QoRFlJKQkqLworCQkJCQkJLyoJCQlwb2x5Z29uKEVUWUkpCSovCisJCQkJCQkvKiBIZWlnaHQJCWZhc3RmaWxsKEgpCSovCisJCQkJCQkvKgkJCWJjb3B5KEgpCSovCisJCQkJCQkvKgkJCXZzY3JvbGwoSCkJKi8KKwkJCQkJCS8qIFkgY291bnQJCWZhc3RmaWxsKE5ZKQkqLworLyoweDc0Ki92b2xhdGlsZSB1bnNpZ25lZCBpbnQJYnc7CQkvKiBYCQkJZG90KERYSSkJKi8KKwkJCQkJCS8qCQkJYnJsaW5lKERYSSkJKi8KKwkJCQkJCS8qCQkJcG9seWdvbihFVFhJKQkqLworCQkJCQkJLyoJCQlmYXN0ZmlsbChXKQkqLworCQkJCQkJLyoJCQliY29weShXKQkqLworCQkJCQkJLyoJCQl2c2Nyb2xsKFcpCSovCisJCQkJCQkvKgkJCWZhc3RmaWxsKE5YKQkqLworLyoweDc4Ki91bnNpZ25lZCBpbnQJCXBhZDZbMl07CS8qIFJlc2VydmVkCQkJCSovCisvKjB4ODAqL3Vuc2lnbmVkIGludAkJcGFkN1szMl07CS8qIFJlc2VydmVkCQkJCSovCisJCisJLyogU2V0dXAgVW5pdCdzIHZlcnRleCBzdGF0ZSByZWdpc3RlciAqLworLyoxMDAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJc3V2dHg7CisvKjEwNCovCXVuc2lnbmVkIGludAkJcGFkOFs2M107CS8qIFJlc2VydmVkCQkJCSovCisJCisJLyogRnJhbWUgQnVmZmVyIENvbnRyb2wgUmVnaXN0ZXJzICovCisvKjIwMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlwcGM7CQkvKiBQaXhlbCBQcm9jZXNzb3IgQ29udHJvbAkJKi8KKy8qMjA0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXdpZDsJCS8qIEN1cnJlbnQgV0lECQkJCSovCisvKjIwOCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmZzsJCS8qIEZHIGRhdGEJCQkJKi8KKy8qMjBjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWJnOwkJLyogQkcgZGF0YQkJCQkqLworLyoyMTAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJY29uc3R5OwkJLyogQ29uc3RhbnQgWQkJCQkqLworLyoyMTQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJY29uc3R6OwkJLyogQ29uc3RhbnQgWgkJCQkqLworLyoyMTgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJeGNsaXA7CQkvKiBYIENsaXAJCQkJKi8KKy8qMjFjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjc3M7CQkvKiBEZXB0aCBDdWUgU2NhbGUgU2xvcGUJCSovCisvKjIyMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl2Y2xpcG1pbjsJLyogVmlld2NsaXAgWFkgTWluIEJvdW5kcwkJKi8KKy8qMjI0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXZjbGlwbWF4OwkvKiBWaWV3Y2xpcCBYWSBNYXggQm91bmRzCQkqLworLyoyMjgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJdmNsaXB6bWluOwkvKiBWaWV3Y2xpcCBaIE1pbiBCb3VuZHMJCSovCisvKjIyYyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl2Y2xpcHptYXg7CS8qIFZpZXdjbGlwIFogTWF4IEJvdW5kcwkJKi8KKy8qMjMwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjc2Y7CQkvKiBEZXB0aCBDdWUgU2NhbGUgRnJvbnQgQm91bmQJCSovCisvKjIzNCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY3NiOwkJLyogRGVwdGggQ3VlIFNjYWxlIEJhY2sgQm91bmQJCSovCisvKjIzOCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY3pmOwkJLyogRGVwdGggQ3VlIFogRnJvbnQJCQkqLworLyoyM2MqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGN6YjsJCS8qIERlcHRoIEN1ZSBaIEJhY2sJCQkqLworLyoyNDAqLwl1bnNpZ25lZCBpbnQJCXBhZDk7CQkvKiBSZXNlcnZlZAkJCQkqLworLyoyNDQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJYmxlbmRjOwkJLyogQWxwaGEgQmxlbmQgQ29udHJvbAkJCSovCisvKjI0OCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlibGVuZGMxOwkvKiBBbHBoYSBCbGVuZCBDb2xvciAxCQkJKi8KKy8qMjRjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWJsZW5kYzI7CS8qIEFscGhhIEJsZW5kIENvbG9yIDIJCQkqLworLyoyNTAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZmJyYW1pdGM7CS8qIEZCIFJBTSBJbnRlcmxlYXZlIFRlc3QgQ29udHJvbAkqLworLyoyNTQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZmJjOwkJLyogRnJhbWUgQnVmZmVyIENvbnRyb2wJCQkqLworLyoyNTgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcm9wOwkJLyogUmFzdGVyIE9QZXJhdGlvbgkJCSovCisvKjI1YyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAljbXA7CQkvKiBGcmFtZSBCdWZmZXIgQ29tcGFyZQkJCSovCisvKjI2MCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAltYXRjaGFiOwkvKiBCdWZmZXIgQUIgTWF0Y2ggTWFzawkJCSovCisvKjI2NCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAltYXRjaGM7CQkvKiBCdWZmZXIgQyhZWikgTWF0Y2ggTWFzawkJKi8KKy8qMjY4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CW1hZ25hYjsJCS8qIEJ1ZmZlciBBQiBNYWduaXR1ZGUgTWFzawkJKi8KKy8qMjZjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CW1hZ25jOwkJLyogQnVmZmVyIEMoWVopIE1hZ25pdHVkZSBNYXNrCQkqLworLyoyNzAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZmJjZmcwOwkJLyogRnJhbWUgQnVmZmVyIENvbmZpZyAwCQkqLworLyoyNzQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZmJjZmcxOwkJLyogRnJhbWUgQnVmZmVyIENvbmZpZyAxCQkqLworLyoyNzgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZmJjZmcyOwkJLyogRnJhbWUgQnVmZmVyIENvbmZpZyAyCQkqLworLyoyN2MqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZmJjZmczOwkJLyogRnJhbWUgQnVmZmVyIENvbmZpZyAzCQkqLworLyoyODAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcHBjZmc7CQkvKiBQaXhlbCBQcm9jZXNzb3IgQ29uZmlnCQkqLworLyoyODQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcGljazsJCS8qIFBpY2tpbmcgQ29udHJvbAkJCSovCisvKjI4OCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmaWxsbW9kZTsJLyogRmlsbE1vZGUJCQkJKi8KKy8qMjhjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWZicmFtd2FjOwkvKiBGQiBSQU0gV3JpdGUgQWRkcmVzcyBDb250cm9sCQkqLworLyoyOTAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcG1hc2s7CQkvKiBSR0IgUGxhbmVNYXNrCQkJKi8KKy8qMjk0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXhwbWFzazsJCS8qIFggUGxhbmVNYXNrCQkJCSovCisvKjI5OCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl5cG1hc2s7CQkvKiBZIFBsYW5lTWFzawkJCQkqLworLyoyOWMqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJenBtYXNrOwkJLyogWiBQbGFuZU1hc2sJCQkJKi8KKy8qMmEwKi8JZmZiX2F1eGNsaXAJCWF1eGNsaXBbNF07IAkvKiBBdXhpbGxpYXJ5IFZpZXdwb3J0IENsaXAJCSovCisJCisJLyogTmV3IDNkUkFNIElJSSBzdXBwb3J0IHJlZ3MgKi8KKy8qMmMwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXJhd2JsZW5kMjsKKy8qMmM0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXJhd3ByZWJsZW5kOworLyoyYzgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmF3c3RlbmNpbDsKKy8qMmNjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXJhd3N0ZW5jaWxjdGw7CisvKjJkMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl0aHJlZWRyYW0xOworLyoyZDQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJdGhyZWVkcmFtMjsKKy8qMmQ4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXBhc3NpbjsKKy8qMmRjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXJhd2NscmRlcHRoOworLyoyZTAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmF3cG1hc2s7CisvKjJlNCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyYXdjc3JjOworLyoyZTgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmF3bWF0Y2g7CisvKjJlYyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyYXdtYWduOworLyoyZjAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmF3cm9wYmxlbmQ7CisvKjJmNCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyYXdjbXA7CisvKjJmOCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyYXd3YWM7CisvKjJmYyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmYnJhbWlkOworCQorLyozMDAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZHJhd29wOwkJLyogRHJhdyBPUGVyYXRpb24JCQkqLworLyozMDQqLwl1bnNpZ25lZCBpbnQJCXBhZDEwWzJdOwkvKiBSZXNlcnZlZAkJCQkqLworLyozMGMqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJbHBhdDsJCS8qIExpbmUgUGF0dGVybiBjb250cm9sCQkJKi8KKy8qMzEwKi8JdW5zaWduZWQgaW50CQlwYWQxMTsJCS8qIFJlc2VydmVkCQkJCSovCisvKjMxNCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmb250eHk7CQkvKiBYWSBGb250IGNvb3JkaW5hdGUJCQkqLworLyozMTgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZm9udHc7CQkvKiBGb250IFdpZHRoCQkJCSovCisvKjMxYyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmb250aW5jOwkvKiBGb250IEluY3JlbWVudAkJCSovCisvKjMyMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmb250OwkJLyogRm9udCBiaXRzCQkJCSovCisvKjMyNCovCXVuc2lnbmVkIGludAkJcGFkMTJbM107CS8qIFJlc2VydmVkCQkJCSovCisvKjMzMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlibGVuZDI7CisvKjMzNCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlwcmVibGVuZDsKKy8qMzM4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXN0ZW5jaWw7CisvKjMzYyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlzdGVuY2lsY3RsOworCisvKjM0MCovCXVuc2lnbmVkIGludAkJcGFkMTNbNF07CS8qIFJlc2VydmVkCQkJCSovCisvKjM1MCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY3NzMTsJCS8qIERlcHRoIEN1ZSBTY2FsZSBTbG9wZSAxCQkqLworLyozNTQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGNzczI7CQkvKiBEZXB0aCBDdWUgU2NhbGUgU2xvcGUgMgkJKi8KKy8qMzU4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjc3MzOwkJLyogRGVwdGggQ3VlIFNjYWxlIFNsb3BlIDMJCSovCisvKjM1YyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl3aWRwbWFzazsKKy8qMzYwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjczI7CisvKjM2NCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY3MzOworLyozNjgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGNzNDsKKy8qMzZjKi8JdW5zaWduZWQgaW50CQlwYWQxNDsJCS8qIFJlc2VydmVkCQkJCSovCisvKjM3MCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY2QyOworLyozNzQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGNkMzsKKy8qMzc4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjZDQ7CisvKjM3YyovCXVuc2lnbmVkIGludAkJcGFkMTU7CQkvKiBSZXNlcnZlZAkJCQkqLworLyozODAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcGF0dGVyblszMl07CS8qIGFyZWEgUGF0dGVybgkJCQkqLworLyo0MDAqLwl1bnNpZ25lZCBpbnQJCXBhZDE2WzhdOwkvKiBSZXNlcnZlZAkJCQkqLworLyo0MjAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmVzZXQ7CQkvKiBjaGlwIFJFU0VUCQkJCSovCisvKjQyNCovCXVuc2lnbmVkIGludAkJcGFkMTdbMjQ3XTsJLyogUmVzZXJ2ZWQJCQkJKi8KKy8qODAwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRldmlkOwkJLyogRGV2aWNlIElECQkJCSovCisvKjgwNCovCXVuc2lnbmVkIGludAkJcGFkMThbNjNdOwkvKiBSZXNlcnZlZAkJCQkqLworLyo5MDAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJdWNzcjsJCS8qIFVzZXIgQ29udHJvbCAmIFN0YXR1cyBSZWdpc3RlcgkqLworLyo5MDQqLwl1bnNpZ25lZCBpbnQJCXBhZDE5WzMxXTsJLyogUmVzZXJ2ZWQJCQkJKi8KKy8qOTgwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CW1lcjsJCS8qIE1vZGUgRW5hYmxlIFJlZ2lzdGVyCQkJKi8KKy8qOTg0Ki8JdW5zaWduZWQgaW50CQlwYWQyMFsxNDM5XTsJLyogUmVzZXJ2ZWQJCQkJKi8KK30gZmZiX2ZiYywgKmZmYl9mYmNQdHI7CisKK3N0cnVjdCBmZmJfaHdfY29udGV4dCB7CisJaW50IGlzXzJkX29ubHk7CisKKwl1bnNpZ25lZCBpbnQgcHBjOworCXVuc2lnbmVkIGludCB3aWQ7CisJdW5zaWduZWQgaW50IGZnOworCXVuc2lnbmVkIGludCBiZzsKKwl1bnNpZ25lZCBpbnQgY29uc3R5OworCXVuc2lnbmVkIGludCBjb25zdHo7CisJdW5zaWduZWQgaW50IHhjbGlwOworCXVuc2lnbmVkIGludCBkY3NzOworCXVuc2lnbmVkIGludCB2Y2xpcG1pbjsKKwl1bnNpZ25lZCBpbnQgdmNsaXBtYXg7CisJdW5zaWduZWQgaW50IHZjbGlwem1pbjsKKwl1bnNpZ25lZCBpbnQgdmNsaXB6bWF4OworCXVuc2lnbmVkIGludCBkY3NmOworCXVuc2lnbmVkIGludCBkY3NiOworCXVuc2lnbmVkIGludCBkY3pmOworCXVuc2lnbmVkIGludCBkY3piOworCXVuc2lnbmVkIGludCBibGVuZGM7CisJdW5zaWduZWQgaW50IGJsZW5kYzE7CisJdW5zaWduZWQgaW50IGJsZW5kYzI7CisJdW5zaWduZWQgaW50IGZiYzsKKwl1bnNpZ25lZCBpbnQgcm9wOworCXVuc2lnbmVkIGludCBjbXA7CisJdW5zaWduZWQgaW50IG1hdGNoYWI7CisJdW5zaWduZWQgaW50IG1hdGNoYzsKKwl1bnNpZ25lZCBpbnQgbWFnbmFiOworCXVuc2lnbmVkIGludCBtYWduYzsKKwl1bnNpZ25lZCBpbnQgcG1hc2s7CisJdW5zaWduZWQgaW50IHhwbWFzazsKKwl1bnNpZ25lZCBpbnQgeXBtYXNrOworCXVuc2lnbmVkIGludCB6cG1hc2s7CisJdW5zaWduZWQgaW50IGF1eGNsaXAwbWluOworCXVuc2lnbmVkIGludCBhdXhjbGlwMG1heDsKKwl1bnNpZ25lZCBpbnQgYXV4Y2xpcDFtaW47CisJdW5zaWduZWQgaW50IGF1eGNsaXAxbWF4OworCXVuc2lnbmVkIGludCBhdXhjbGlwMm1pbjsKKwl1bnNpZ25lZCBpbnQgYXV4Y2xpcDJtYXg7CisJdW5zaWduZWQgaW50IGF1eGNsaXAzbWluOworCXVuc2lnbmVkIGludCBhdXhjbGlwM21heDsKKwl1bnNpZ25lZCBpbnQgZHJhd29wOworCXVuc2lnbmVkIGludCBscGF0OworCXVuc2lnbmVkIGludCBmb250eHk7CisJdW5zaWduZWQgaW50IGZvbnR3OworCXVuc2lnbmVkIGludCBmb250aW5jOworCXVuc2lnbmVkIGludCBhcmVhX3BhdHRlcm5bMzJdOworCXVuc2lnbmVkIGludCB1Y3NyOworCXVuc2lnbmVkIGludCBzdGVuY2lsOworCXVuc2lnbmVkIGludCBzdGVuY2lsY3RsOworCXVuc2lnbmVkIGludCBkY3NzMTsKKwl1bnNpZ25lZCBpbnQgZGNzczI7CisJdW5zaWduZWQgaW50IGRjc3MzOworCXVuc2lnbmVkIGludCBkY3MyOworCXVuc2lnbmVkIGludCBkY3MzOworCXVuc2lnbmVkIGludCBkY3M0OworCXVuc2lnbmVkIGludCBkY2QyOworCXVuc2lnbmVkIGludCBkY2QzOworCXVuc2lnbmVkIGludCBkY2Q0OworCXVuc2lnbmVkIGludCBtZXI7Cit9OworCisjZGVmaW5lIEZGQl9NQVhfQ1RYUwkzMgorCitlbnVtIGZmYl9jaGlwX3R5cGUgeworCWZmYjFfcHJvdG90eXBlID0gMCwJLyogRWFybHkgcHJlLUZDUyBGRkIgKi8KKwlmZmIxX3N0YW5kYXJkLAkJLyogRmlyc3QgRkNTIEZGQiwgMTAwTWh6IFVQQSwgNjZNSHogZ2NsayAqLworCWZmYjFfc3BlZWRzb3J0LAkJLyogU2Vjb25kIEZDUyBGRkIsIDEwME1oeiBVUEEsIDc1TUh6IGdjbGsgKi8KKwlmZmIyX3Byb3RvdHlwZSwJCS8qIEVhcmx5IHByZS1GQ1MgdmVydGljYWwgRkZCMiAqLworCWZmYjJfdmVydGljYWwsCQkvKiBGaXJzdCBGQ1MgRkZCMi92ZXJ0aWNhbCwgMTAwTWh6IFVQQSwgMTAwTUhaIGdjbGssCisJCQkJICAgNzUoU2luZ2xlQnVmZmVyKS84MyhEb3VibGVCdWZmZXIpIE1IeiBmY2xrICovCisJZmZiMl92ZXJ0aWNhbF9wbHVzLAkvKiBTZWNvbmQgRkNTIEZGQjIvdmVydGljYWwsIHNhbWUgdGltaW5ncyAqLworCWZmYjJfaG9yaXpvbnRhbCwJLyogRmlyc3QgRkNTIEZGQjIvaG9yaXpvbnRhbCwgc2FtZSB0aW1pbmdzIGFzIEZGQjIvdmVydCAqLworCWZmYjJfaG9yaXpvbnRhbF9wbHVzLAkvKiBTZWNvbmQgRkNTIEZGQjIvaG9yaXpvbnRhbCwgc2FtZSB0aW1pbmdzICovCisJYWZiX20zLAkJCS8qIEZDUyBFbGl0ZTNELCAzIGZsb2F0IGNoaXBzICovCisJYWZiX202CQkJLyogRkNTIEVsaXRlM0QsIDYgZmxvYXQgY2hpcHMgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGZmYl9kZXZfcHJpdiB7CisJLyogTWlzYyBzb2Z0d2FyZSBzdGF0ZS4gKi8KKwlpbnQJCQlwcm9tX25vZGU7CisJZW51bSBmZmJfY2hpcF90eXBlCWZmYl90eXBlOworCXU2NAkJCWNhcmRfcGh5c19iYXNlOworCXN0cnVjdCBtaXNjZGV2aWNlIAltaXNjZGV2OworCisJLyogQ29udHJvbGxlciByZWdpc3RlcnMuICovCisJZmZiX2ZiY1B0cgkJcmVnczsKKworCS8qIENvbnRleHQgdGFibGUuICovCisJc3RydWN0IGZmYl9od19jb250ZXh0CSpod19zdGF0ZVtGRkJfTUFYX0NUWFNdOworfSBmZmJfZGV2X3ByaXZfdDsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZmZiX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGhpbnQsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIHBnb2ZmLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiB2b2lkIGZmYl9zZXRfY29udGV4dF9pb2N0bHModm9pZCk7CitleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBEUk0oaW9jdGxzKVtdOworCitleHRlcm4gaW50IGZmYl9kcml2ZXJfY29udGV4dF9zd2l0Y2goZHJtX2RldmljZV90ICpkZXYsIGludCBvbGQsIGludCBuZXcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9jb250ZXh0LmggYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTFiNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9jb250ZXh0LmgKQEAgLTAsMCArMSw0OTIgQEAKKy8qIGRybV9jb250ZXh0LmggLS0gSU9DVExzIGZvciBnZW5lcmljIGNvbnRleHRzIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogRnJpIE5vdiAyNCAxODozMTozNyAyMDAwIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICogQ2hhbmdlTG9nOgorICogIDIwMDEtMTEtMTYJVG9yc3RlbiBEdXdlIDxkdXdlQGNhbGRlcmEuZGU+CisgKgkJYWRkZWQgY29udGV4dCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGhvb2tzLAorICoJCW5lZWRlZCBieSBTaVMgZHJpdmVyJ3MgbWVtb3J5IG1hbmFnZW1lbnQuCisgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogT2xkLXN0eWxlIGNvbnRleHQgc3VwcG9ydCAtLSBvbmx5IHVzZWQgYnkgZ2FtbWEuICAKKyAqLworCisKKy8qIFRoZSBkcm1fcmVhZCBhbmQgZHJtX3dyaXRlX3N0cmluZyBjb2RlIChlc3BlY2lhbGx5IHRoYXQgd2hpY2ggbWFuYWdlcworICAgdGhlIGNpcmN1bGFyIGJ1ZmZlciksIGlzIGJhc2VkIG9uIEFsZXNzYW5kcm8gUnViaW5pJ3MgTElOVVggREVWSUNFCisgICBEUklWRVJTIChDYW1icmlkZ2U6IE8nUmVpbGx5LCAxOTk4KSwgcGFnZXMgMTExLTExMy4gKi8KKworc3NpemVfdCBnYW1tYV9mb3BzX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpCit7CisJZHJtX2ZpbGVfdCAgICAqcHJpdiAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAgKmRldiAgICA9IHByaXYtPmRldjsKKwlpbnQJICAgICAgbGVmdDsKKwlpbnQJICAgICAgYXZhaWw7CisJaW50CSAgICAgIHNlbmQ7CisJaW50CSAgICAgIGN1cjsKKworCURSTV9ERUJVRygiJXAsICVwXG4iLCBkZXYtPmJ1Zl9ycCwgZGV2LT5idWZfd3ApOworCisJd2hpbGUgKGRldi0+YnVmX3JwID09IGRldi0+YnVmX3dwKSB7CisJCURSTV9ERUJVRygiICBzbGVlcGluZ1xuIik7CisJCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmZGV2LT5idWZfcmVhZGVycyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJRFJNX0RFQlVHKCIgIGludGVycnVwdGVkXG4iKTsKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCX0KKwkJRFJNX0RFQlVHKCIgIGF3YWtlXG4iKTsKKwl9CisKKwlsZWZ0ICA9IChkZXYtPmJ1Zl9ycCArIERSTV9CU1ogLSBkZXYtPmJ1Zl93cCkgJSBEUk1fQlNaOworCWF2YWlsID0gRFJNX0JTWiAtIGxlZnQ7CisJc2VuZCAgPSBEUk1fTUlOKGF2YWlsLCBjb3VudCk7CisKKwl3aGlsZSAoc2VuZCkgeworCQlpZiAoZGV2LT5idWZfd3AgPiBkZXYtPmJ1Zl9ycCkgeworCQkJY3VyID0gRFJNX01JTihzZW5kLCBkZXYtPmJ1Zl93cCAtIGRldi0+YnVmX3JwKTsKKwkJfSBlbHNlIHsKKwkJCWN1ciA9IERSTV9NSU4oc2VuZCwgZGV2LT5idWZfZW5kIC0gZGV2LT5idWZfcnApOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBkZXYtPmJ1Zl9ycCwgY3VyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlkZXYtPmJ1Zl9ycCArPSBjdXI7CisJCWlmIChkZXYtPmJ1Zl9ycCA9PSBkZXYtPmJ1Zl9lbmQpIGRldi0+YnVmX3JwID0gZGV2LT5idWY7CisJCXNlbmQgLT0gY3VyOworCX0KKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5idWZfd3JpdGVycyk7CisJcmV0dXJuIERSTV9NSU4oYXZhaWwsIGNvdW50KTsKK30KKworCisvKiBJbiBhbiBpbmNyZWRpYmx5IGNvbnZvbHV0ZWQgc2V0dXAsIHRoZSBrZXJuZWwgbW9kdWxlIGFjdHVhbGx5IGNhbGxzCisgKiBiYWNrIGludG8gdGhlIFggc2VydmVyIHRvIHBlcmZvcm0gY29udGV4dCBzd2l0Y2hlcyBvbiBiZWhhbGYgb2YgdGhlCisgKiAzZCBjbGllbnRzLgorICovCitpbnQgRFJNKHdyaXRlX3N0cmluZykoZHJtX2RldmljZV90ICpkZXYsIGNvbnN0IGNoYXIgKnMpCit7CisJaW50IGxlZnQgICA9IChkZXYtPmJ1Zl9ycCArIERSTV9CU1ogLSBkZXYtPmJ1Zl93cCkgJSBEUk1fQlNaOworCWludCBzZW5kICAgPSBzdHJsZW4ocyk7CisJaW50IGNvdW50OworCisJRFJNX0RFQlVHKCIlZCBsZWZ0LCAlZCB0byBzZW5kICglcCwgJXApXG4iLAorCQkgIGxlZnQsIHNlbmQsIGRldi0+YnVmX3JwLCBkZXYtPmJ1Zl93cCk7CisKKwlpZiAobGVmdCA9PSAxIHx8IGRldi0+YnVmX3dwICE9IGRldi0+YnVmX3JwKSB7CisJCURSTV9FUlJPUigiQnVmZmVyIG5vdCBlbXB0eSAoJWQgbGVmdCwgd3AgPSAlcCwgcnAgPSAlcClcbiIsCisJCQkgIGxlZnQsCisJCQkgIGRldi0+YnVmX3dwLAorCQkJICBkZXYtPmJ1Zl9ycCk7CisJfQorCisJd2hpbGUgKHNlbmQpIHsKKwkJaWYgKGRldi0+YnVmX3dwID49IGRldi0+YnVmX3JwKSB7CisJCQljb3VudCA9IERSTV9NSU4oc2VuZCwgZGV2LT5idWZfZW5kIC0gZGV2LT5idWZfd3ApOworCQkJaWYgKGNvdW50ID09IGxlZnQpIC0tY291bnQ7IC8qIExlYXZlIGEgaG9sZSAqLworCQl9IGVsc2UgeworCQkJY291bnQgPSBEUk1fTUlOKHNlbmQsIGRldi0+YnVmX3JwIC0gZGV2LT5idWZfd3AgLSAxKTsKKwkJfQorCQlzdHJuY3B5KGRldi0+YnVmX3dwLCBzLCBjb3VudCk7CisJCWRldi0+YnVmX3dwICs9IGNvdW50OworCQlpZiAoZGV2LT5idWZfd3AgPT0gZGV2LT5idWZfZW5kKSBkZXYtPmJ1Zl93cCA9IGRldi0+YnVmOworCQlzZW5kIC09IGNvdW50OworCX0KKworCWlmIChkZXYtPmJ1Zl9hc3luYykga2lsbF9mYXN5bmMoJmRldi0+YnVmX2FzeW5jLCBTSUdJTywgUE9MTF9JTik7CisKKwlEUk1fREVCVUcoIndha2luZ1xuIik7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPmJ1Zl9yZWFkZXJzKTsKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgaW50IGdhbW1hX2ZvcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCWRybV9maWxlX3QgICAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiAgPSBwcml2LT5kZXY7CisKKwlwb2xsX3dhaXQoZmlscCwgJmRldi0+YnVmX3JlYWRlcnMsIHdhaXQpOworCWlmIChkZXYtPmJ1Zl93cCAhPSBkZXYtPmJ1Zl9ycCkgcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0oY29udGV4dF9zd2l0Y2gpKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgb2xkLCBpbnQgbmV3KQoreworCWNoYXIJICAgIGJ1Zls2NF07CisJZHJtX3F1ZXVlX3QgKnE7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZGV2LT5jb250ZXh0X2ZsYWcpKSB7CisJCURSTV9FUlJPUigiUmVlbnRlcmluZyAtLSBGSVhNRVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJRFJNX0RFQlVHKCJDb250ZXh0IHN3aXRjaCBmcm9tICVkIHRvICVkXG4iLCBvbGQsIG5ldyk7CisKKwlpZiAobmV3ID49IGRldi0+cXVldWVfY291bnQpIHsKKwkJY2xlYXJfYml0KDAsICZkZXYtPmNvbnRleHRfZmxhZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChuZXcgPT0gZGV2LT5sYXN0X2NvbnRleHQpIHsKKwkJY2xlYXJfYml0KDAsICZkZXYtPmNvbnRleHRfZmxhZyk7CisJCXJldHVybiAwOworCX0KKworCXEgPSBkZXYtPnF1ZXVlbGlzdFtuZXddOworCWF0b21pY19pbmMoJnEtPnVzZV9jb3VudCk7CisJaWYgKGF0b21pY19yZWFkKCZxLT51c2VfY291bnQpID09IDEpIHsKKwkJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKwkJY2xlYXJfYml0KDAsICZkZXYtPmNvbnRleHRfZmxhZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFRoaXMgY2F1c2VzIHRoZSBYIHNlcnZlciB0byB3YWtlIHVwICYgZG8gYSBidW5jaCBvZiBoYXJkd2FyZQorCSAqIGludGVyYWN0aW9uIHRvIGFjdHVhbGx5IGVmZmVjdCB0aGUgY29udGV4dCBzd2l0Y2guCisJICovCisJc3ByaW50ZihidWYsICJDICVkICVkXG4iLCBvbGQsIG5ldyk7CisJRFJNKHdyaXRlX3N0cmluZykoZGV2LCBidWYpOworCisJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKworCXJldHVybiAwOworfQorCitpbnQgRFJNKGNvbnRleHRfc3dpdGNoX2NvbXBsZXRlKShkcm1fZGV2aWNlX3QgKmRldiwgaW50IG5ldykKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKworCWRldi0+bGFzdF9jb250ZXh0ID0gbmV3OyAgLyogUFJFL1BPU1Q6IFRoaXMgaXMgdGhlIF9vbmx5XyB3cml0ZXIuICovCisJZGV2LT5sYXN0X3N3aXRjaCAgPSBqaWZmaWVzOworCisJaWYgKCFfRFJNX0xPQ0tfSVNfSEVMRChkZXYtPmxvY2suaHdfbG9jay0+bG9jaykpIHsKKwkJRFJNX0VSUk9SKCJMb2NrIGlzbid0IGhlbGQgYWZ0ZXIgY29udGV4dCBzd2l0Y2hcbiIpOworCX0KKworCWlmICghZG1hIHx8ICEoZG1hLT5uZXh0X2J1ZmZlciAmJiBkbWEtPm5leHRfYnVmZmVyLT53aGlsZV9sb2NrZWQpKSB7CisJCWlmIChEUk0obG9ja19mcmVlKShkZXYsICZkZXYtPmxvY2suaHdfbG9jay0+bG9jaywKKwkJCQkgIERSTV9LRVJORUxfQ09OVEVYVCkpIHsKKwkJCURSTV9FUlJPUigiQ2Fubm90IGZyZWUgbG9ja1xuIik7CisJCX0KKwl9CisKKwljbGVhcl9iaXQoMCwgJmRldi0+Y29udGV4dF9mbGFnKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+Y29udGV4dF93YWl0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IERSTShpbml0X3F1ZXVlKShkcm1fZGV2aWNlX3QgKmRldiwgZHJtX3F1ZXVlX3QgKnEsIGRybV9jdHhfdCAqY3R4KQoreworCURSTV9ERUJVRygiXG4iKTsKKworCWlmIChhdG9taWNfcmVhZCgmcS0+dXNlX2NvdW50KSAhPSAxCisJICAgIHx8IGF0b21pY19yZWFkKCZxLT5maW5hbGl6YXRpb24pCisJICAgIHx8IGF0b21pY19yZWFkKCZxLT5ibG9ja19jb3VudCkpIHsKKwkJRFJNX0VSUk9SKCJOZXcgcXVldWUgaXMgYWxyZWFkeSBpbiB1c2U6IHUlZCBmJWQgYiVkXG4iLAorCQkJICBhdG9taWNfcmVhZCgmcS0+dXNlX2NvdW50KSwKKwkJCSAgYXRvbWljX3JlYWQoJnEtPmZpbmFsaXphdGlvbiksCisJCQkgIGF0b21pY19yZWFkKCZxLT5ibG9ja19jb3VudCkpOworCX0KKworCWF0b21pY19zZXQoJnEtPmZpbmFsaXphdGlvbiwgIDApOworCWF0b21pY19zZXQoJnEtPmJsb2NrX2NvdW50LCAgIDApOworCWF0b21pY19zZXQoJnEtPmJsb2NrX3JlYWQsICAgIDApOworCWF0b21pY19zZXQoJnEtPmJsb2NrX3dyaXRlLCAgIDApOworCWF0b21pY19zZXQoJnEtPnRvdGFsX3F1ZXVlZCwgIDApOworCWF0b21pY19zZXQoJnEtPnRvdGFsX2ZsdXNoZWQsIDApOworCWF0b21pY19zZXQoJnEtPnRvdGFsX2xvY2tzLCAgIDApOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcS0+d3JpdGVfcXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnEtPnJlYWRfcXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnEtPmZsdXNoX3F1ZXVlKTsKKworCXEtPmZsYWdzID0gY3R4LT5mbGFnczsKKworCURSTSh3YWl0bGlzdF9jcmVhdGUpKCZxLT53YWl0bGlzdCwgZGV2LT5kbWEtPmJ1Zl9jb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBkcm1fYWxsb2NfcXVldWU6CitQUkU6IDEpIGRldi0+cXVldWVsaXN0WzAuLmRldi0+cXVldWVfY291bnRdIGlzIGFsbG9jYXRlZCBhbmQgd2lsbCBub3QKKwlkaXNhcHBlYXIgKHNvIGFsbCBkZWFsbG9jYXRpb24gbXVzdCBiZSBkb25lIGFmdGVyIElPQ1RMcyBhcmUgb2ZmKQorICAgICAyKSBkZXYtPnF1ZXVlX2NvdW50IDwgZGV2LT5xdWV1ZV9zbG90cworICAgICAzKSBkZXYtPnF1ZXVlbGlzdFtpXS51c2VfY291bnQgPT0gMCBhbmQKKwlkZXYtPnF1ZXVlbGlzdFtpXS5maW5hbGl6YXRpb24gPT0gMCBpZiBpIG5vdCBpbiB1c2UKK1BPU1Q6IDEpIGRldi0+cXVldWVsaXN0W2ldLnVzZV9jb3VudCA9PSAxCisgICAgICAyKSBkZXYtPnF1ZXVlX2NvdW50IDwgZGV2LT5xdWV1ZV9zbG90cyAqLworCitzdGF0aWMgaW50IERSTShhbGxvY19xdWV1ZSkoZHJtX2RldmljZV90ICpkZXYpCit7CisJaW50CSAgICBpOworCWRybV9xdWV1ZV90ICpxdWV1ZTsKKwlpbnQJICAgIG9sZHNsb3RzOworCWludAkgICAgbmV3c2xvdHM7CisJCQkJLyogQ2hlY2sgZm9yIGEgZnJlZSBxdWV1ZSAqLworCWZvciAoaSA9IDA7IGkgPCBkZXYtPnF1ZXVlX2NvdW50OyBpKyspIHsKKwkJYXRvbWljX2luYygmZGV2LT5xdWV1ZWxpc3RbaV0tPnVzZV9jb3VudCk7CisJCWlmIChhdG9taWNfcmVhZCgmZGV2LT5xdWV1ZWxpc3RbaV0tPnVzZV9jb3VudCkgPT0gMQorCQkgICAgJiYgIWF0b21pY19yZWFkKCZkZXYtPnF1ZXVlbGlzdFtpXS0+ZmluYWxpemF0aW9uKSkgeworCQkJRFJNX0RFQlVHKCIlZCAoZnJlZSlcbiIsIGkpOworCQkJcmV0dXJuIGk7CisJCX0KKwkJYXRvbWljX2RlYygmZGV2LT5xdWV1ZWxpc3RbaV0tPnVzZV9jb3VudCk7CisJfQorCQkJCS8qIEFsbG9jYXRlIGEgbmV3IHF1ZXVlICovCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKworCXF1ZXVlID0gRFJNKGFsbG9jKShzaXplb2YoKnF1ZXVlKSwgRFJNX01FTV9RVUVVRVMpOworCW1lbXNldChxdWV1ZSwgMCwgc2l6ZW9mKCpxdWV1ZSkpOworCWF0b21pY19zZXQoJnF1ZXVlLT51c2VfY291bnQsIDEpOworCisJKytkZXYtPnF1ZXVlX2NvdW50OworCWlmIChkZXYtPnF1ZXVlX2NvdW50ID49IGRldi0+cXVldWVfc2xvdHMpIHsKKwkJb2xkc2xvdHMgPSBkZXYtPnF1ZXVlX3Nsb3RzICogc2l6ZW9mKCpkZXYtPnF1ZXVlbGlzdCk7CisJCWlmICghZGV2LT5xdWV1ZV9zbG90cykgZGV2LT5xdWV1ZV9zbG90cyA9IDE7CisJCWRldi0+cXVldWVfc2xvdHMgKj0gMjsKKwkJbmV3c2xvdHMgPSBkZXYtPnF1ZXVlX3Nsb3RzICogc2l6ZW9mKCpkZXYtPnF1ZXVlbGlzdCk7CisKKwkJZGV2LT5xdWV1ZWxpc3QgPSBEUk0ocmVhbGxvYykoZGV2LT5xdWV1ZWxpc3QsCisJCQkJCSAgICAgIG9sZHNsb3RzLAorCQkJCQkgICAgICBuZXdzbG90cywKKwkJCQkJICAgICAgRFJNX01FTV9RVUVVRVMpOworCQlpZiAoIWRldi0+cXVldWVsaXN0KSB7CisJCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJCURSTV9ERUJVRygib3V0IG9mIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlkZXYtPnF1ZXVlbGlzdFtkZXYtPnF1ZXVlX2NvdW50LTFdID0gcXVldWU7CisKKwl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlEUk1fREVCVUcoIiVkIChuZXcpXG4iLCBkZXYtPnF1ZXVlX2NvdW50IC0gMSk7CisJcmV0dXJuIGRldi0+cXVldWVfY291bnQgLSAxOworfQorCitpbnQgRFJNKHJlc2N0eCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9jdHhfcmVzX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9jdHhfcmVzX3QJcmVzOworCWRybV9jdHhfdAljdHg7CisJaW50CQlpOworCisJRFJNX0RFQlVHKCIlZFxuIiwgRFJNX1JFU0VSVkVEX0NPTlRFWFRTKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcywgYXJncCwgc2l6ZW9mKHJlcykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAocmVzLmNvdW50ID49IERSTV9SRVNFUlZFRF9DT05URVhUUykgeworCQltZW1zZXQoJmN0eCwgMCwgc2l6ZW9mKGN0eCkpOworCQlmb3IgKGkgPSAwOyBpIDwgRFJNX1JFU0VSVkVEX0NPTlRFWFRTOyBpKyspIHsKKwkJCWN0eC5oYW5kbGUgPSBpOworCQkJaWYgKGNvcHlfdG9fdXNlcigmcmVzLmNvbnRleHRzW2ldLAorCQkJCQkgJmksCisJCQkJCSBzaXplb2YoaSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCXJlcy5jb3VudCA9IERSTV9SRVNFUlZFRF9DT05URVhUUzsKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZyZXMsIHNpemVvZihyZXMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0oYWRkY3R4KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3QJY3R4OworCWRybV9jdHhfdAlfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgYXJncCwgc2l6ZW9mKGN0eCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKGN0eC5oYW5kbGUgPSBEUk0oYWxsb2NfcXVldWUpKGRldikpID09IERSTV9LRVJORUxfQ09OVEVYVCkgeworCQkJCS8qIEluaXQga2VybmVsJ3MgY29udGV4dCBhbmQgZ2V0IGEgbmV3IG9uZS4gKi8KKwkJRFJNKGluaXRfcXVldWUpKGRldiwgZGV2LT5xdWV1ZWxpc3RbY3R4LmhhbmRsZV0sICZjdHgpOworCQljdHguaGFuZGxlID0gRFJNKGFsbG9jX3F1ZXVlKShkZXYpOworCX0KKwlEUk0oaW5pdF9xdWV1ZSkoZGV2LCBkZXYtPnF1ZXVlbGlzdFtjdHguaGFuZGxlXSwgJmN0eCk7CisJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY3R4LCBzaXplb2YoY3R4KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitpbnQgRFJNKG1vZGN0eCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5kZXY7CisJZHJtX2N0eF90CWN0eDsKKwlkcm1fcXVldWVfdAkqcTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoZHJtX2N0eF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGN0eCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOworCisJaWYgKGN0eC5oYW5kbGUgPCAwIHx8IGN0eC5oYW5kbGUgPj0gZGV2LT5xdWV1ZV9jb3VudCkgcmV0dXJuIC1FSU5WQUw7CisJcSA9IGRldi0+cXVldWVsaXN0W2N0eC5oYW5kbGVdOworCisJYXRvbWljX2luYygmcS0+dXNlX2NvdW50KTsKKwlpZiAoYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCkgPT0gMSkgeworCQkJCS8qIE5vIGxvbmdlciBpbiB1c2UgKi8KKwkJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKERSTV9CVUZDT1VOVCgmcS0+d2FpdGxpc3QpKSB7CisJCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcS0+ZmxhZ3MgPSBjdHguZmxhZ3M7CisKKwlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCXJldHVybiAwOworfQorCitpbnQgRFJNKGdldGN0eCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5kZXY7CisJZHJtX2N0eF90CV9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fY3R4X3QJY3R4OworCWRybV9xdWV1ZV90CSpxOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIGFyZ3AsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlEUk1fREVCVUcoIiVkXG4iLCBjdHguaGFuZGxlKTsKKworCWlmIChjdHguaGFuZGxlID49IGRldi0+cXVldWVfY291bnQpIHJldHVybiAtRUlOVkFMOworCXEgPSBkZXYtPnF1ZXVlbGlzdFtjdHguaGFuZGxlXTsKKworCWF0b21pY19pbmMoJnEtPnVzZV9jb3VudCk7CisJaWYgKGF0b21pY19yZWFkKCZxLT51c2VfY291bnQpID09IDEpIHsKKwkJCQkvKiBObyBsb25nZXIgaW4gdXNlICovCisJCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN0eC5mbGFncyA9IHEtPmZsYWdzOworCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7CisKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZjdHgsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworaW50IERSTShzd2l0Y2hjdHgpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+ZGV2OworCWRybV9jdHhfdAljdHg7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CisJcmV0dXJuIERSTShjb250ZXh0X3N3aXRjaCkoZGV2LCBkZXYtPmxhc3RfY29udGV4dCwgY3R4LmhhbmRsZSk7Cit9CisKK2ludCBEUk0obmV3Y3R4KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3QJY3R4OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChkcm1fY3R4X3QgX191c2VyICopYXJnLCBzaXplb2YoY3R4KSkpCisJCXJldHVybiAtRUZBVUxUOworCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOworCURSTShjb250ZXh0X3N3aXRjaF9jb21wbGV0ZSkoZGV2LCBjdHguaGFuZGxlKTsKKworCXJldHVybiAwOworfQorCitpbnQgRFJNKHJtY3R4KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3QJY3R4OworCWRybV9xdWV1ZV90CSpxOworCWRybV9idWZfdAkqYnVmOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChkcm1fY3R4X3QgX191c2VyICopYXJnLCBzaXplb2YoY3R4KSkpCisJCXJldHVybiAtRUZBVUxUOworCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOworCisJaWYgKGN0eC5oYW5kbGUgPj0gZGV2LT5xdWV1ZV9jb3VudCkgcmV0dXJuIC1FSU5WQUw7CisJcSA9IGRldi0+cXVldWVsaXN0W2N0eC5oYW5kbGVdOworCisJYXRvbWljX2luYygmcS0+dXNlX2NvdW50KTsKKwlpZiAoYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCkgPT0gMSkgeworCQkJCS8qIE5vIGxvbmdlciBpbiB1c2UgKi8KKwkJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXRvbWljX2luYygmcS0+ZmluYWxpemF0aW9uKTsgLyogTWFyayBxdWV1ZSBpbiBmaW5hbGl6YXRpb24gc3RhdGUgKi8KKwlhdG9taWNfc3ViKDIsICZxLT51c2VfY291bnQpOyAvKiBNYXJrIHF1ZXVlIGFzIHVudXNlZCAocGVuZGluZworCQkJCQkgZmluYWxpemF0aW9uKSAqLworCisJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpKSB7CisJCXNjaGVkdWxlKCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJY2xlYXJfYml0KDAsICZkZXYtPmludGVycnVwdF9mbGFnKTsKKwkJCXJldHVybiAtRUlOVFI7CisJCX0KKwl9CisJCQkJLyogUmVtb3ZlIHF1ZXVlZCBidWZmZXJzICovCisJd2hpbGUgKChidWYgPSBEUk0od2FpdGxpc3RfZ2V0KSgmcS0+d2FpdGxpc3QpKSkgeworCQlEUk0oZnJlZV9idWZmZXIpKGRldiwgYnVmKTsKKwl9CisJY2xlYXJfYml0KDAsICZkZXYtPmludGVycnVwdF9mbGFnKTsKKworCQkJCS8qIFdha2V1cCBibG9ja2VkIHByb2Nlc3NlcyAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcS0+cmVhZF9xdWV1ZSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxLT53cml0ZV9xdWV1ZSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxLT5mbHVzaF9xdWV1ZSk7CisKKwkJCQkvKiBGaW5hbGl6YXRpb24gb3Zlci4gIFF1ZXVlIGlzIG1hZGUKKwkJCQkgICBhdmFpbGFibGUgd2hlbiBib3RoIHVzZV9jb3VudCBhbmQKKwkJCQkgICBmaW5hbGl6YXRpb24gYmVjb21lIDAsIHdoaWNoIHdvbid0CisJCQkJICAgaGFwcGVuIHVudGlsIGFsbCB0aGUgd2FpdGluZyBwcm9jZXNzZXMKKwkJCQkgICBzdG9wIHdhaXRpbmcuICovCisJYXRvbWljX2RlYygmcS0+ZmluYWxpemF0aW9uKTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4NmZiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZG1hLmMKQEAgLTAsMCArMSw5NDYgQEAKKy8qIGdhbW1hX2RtYS5jIC0tIERNQSBzdXBwb3J0IGZvciBHTVggMjAwMCAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IEZyaSBNYXIgMTkgMTQ6MzA6MTYgMTk5OSBieSBmYWl0aEBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgImdhbW1hLmgiCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImdhbW1hX2RybS5oIgorI2luY2x1ZGUgImdhbW1hX2Rydi5oIgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrIHF1ZXVlIHN1cHBvcnQgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2FtbWFfZG1hX2Rpc3BhdGNoKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkJCShkcm1fZ2FtbWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwltYigpOworCXdoaWxlICggR0FNTUFfUkVBRChHQU1NQV9JTkZJRk9TUEFDRSkgPCAyKQorCQljcHVfcmVsYXgoKTsKKworCUdBTU1BX1dSSVRFKEdBTU1BX0RNQUFERFJFU1MsIGFkZHJlc3MpOworCisJd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfR0NPTU1BTkRTVEFUVVMpICE9IDQpCisJCWNwdV9yZWxheCgpOworCisJR0FNTUFfV1JJVEUoR0FNTUFfRE1BQ09VTlQsIGxlbmd0aCAvIDQpOworfQorCit2b2lkIGdhbW1hX2RtYV9xdWllc2NlbnRfc2luZ2xlKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfRE1BQ09VTlQpKQorCQljcHVfcmVsYXgoKTsKKworCXdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDIpCisJCWNwdV9yZWxheCgpOworCisJR0FNTUFfV1JJVEUoR0FNTUFfRklMVEVSTU9ERSwgMSA8PCAxMCk7CisJR0FNTUFfV1JJVEUoR0FNTUFfU1lOQywgMCk7CisKKwlkbyB7CisJCXdoaWxlICghR0FNTUFfUkVBRChHQU1NQV9PVVRGSUZPV09SRFMpKQorCQkJY3B1X3JlbGF4KCk7CisJfSB3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9PVVRQVVRGSUZPKSAhPSBHQU1NQV9TWU5DX1RBRyk7Cit9CisKK3ZvaWQgZ2FtbWFfZG1hX3F1aWVzY2VudF9kdWFsKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfRE1BQ09VTlQpKQorCQljcHVfcmVsYXgoKTsKKworCXdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDMpCisJCWNwdV9yZWxheCgpOworCisJR0FNTUFfV1JJVEUoR0FNTUFfQlJPQURDQVNUTUFTSywgMyk7CisJR0FNTUFfV1JJVEUoR0FNTUFfRklMVEVSTU9ERSwgMSA8PCAxMCk7CisJR0FNTUFfV1JJVEUoR0FNTUFfU1lOQywgMCk7CisKKwkvKiBSZWFkIGZyb20gZmlyc3QgTVggKi8KKwlkbyB7CisJCXdoaWxlICghR0FNTUFfUkVBRChHQU1NQV9PVVRGSUZPV09SRFMpKQorCQkJY3B1X3JlbGF4KCk7CisJfSB3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9PVVRQVVRGSUZPKSAhPSBHQU1NQV9TWU5DX1RBRyk7CisKKwkvKiBSZWFkIGZyb20gc2Vjb25kIE1YICovCisJZG8geworCQl3aGlsZSAoIUdBTU1BX1JFQUQoR0FNTUFfT1VURklGT1dPUkRTICsgMHgxMDAwMCkpCisJCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX09VVFBVVEZJRk8gKyAweDEwMDAwKSAhPSBHQU1NQV9TWU5DX1RBRyk7Cit9CisKK3ZvaWQgZ2FtbWFfZG1hX3JlYWR5KGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfRE1BQ09VTlQpKQorCQljcHVfcmVsYXgoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2FtbWFfZG1hX2lzX3JlYWR5KGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJcmV0dXJuICghR0FNTUFfUkVBRChHQU1NQV9ETUFDT1VOVCkpOworfQorCitpcnFyZXR1cm5fdCBnYW1tYV9kcml2ZXJfaXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApCit7CisJZHJtX2RldmljZV90CSAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKWFyZzsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fZ2FtbWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9CisJCQkJKGRybV9nYW1tYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisJLyogRklYTUU6IHNob3VsZCBjaGVjayB3aGV0aGVyIHdlJ3JlIGFjdHVhbGx5IGludGVyZXN0ZWQgaW4gdGhlIGludGVycnVwdD8gKi8KKwlhdG9taWNfaW5jKCZkZXYtPmNvdW50c1s2XSk7IC8qIF9EUk1fU1RBVF9JUlEgKi8KKworCXdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDMpCisJCWNwdV9yZWxheCgpOworCisJR0FNTUFfV1JJVEUoR0FNTUFfR0RFTEFZVElNRVIsIDB4YzM1MC8yKTsgLyogMHgwNVMgKi8KKwlHQU1NQV9XUklURShHQU1NQV9HQ09NTUFORElOVEZMQUdTLCA4KTsKKwlHQU1NQV9XUklURShHQU1NQV9HSU5URkxBR1MsIDB4MjAwMSk7CisJaWYgKGdhbW1hX2RtYV9pc19yZWFkeShkZXYpKSB7CisJCQkJLyogRnJlZSBwcmV2aW91cyBidWZmZXIgKi8KKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRldi0+ZG1hX2ZsYWcpKQorCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQlpZiAoZG1hLT50aGlzX2J1ZmZlcikgeworCQkJZ2FtbWFfZnJlZV9idWZmZXIoZGV2LCBkbWEtPnRoaXNfYnVmZmVyKTsKKwkJCWRtYS0+dGhpc19idWZmZXIgPSBOVUxMOworCQl9CisJCWNsZWFyX2JpdCgwLCAmZGV2LT5kbWFfZmxhZyk7CisKKwkJLyogRGlzcGF0Y2ggbmV3IGJ1ZmZlciAqLworCQlzY2hlZHVsZV93b3JrKCZkZXYtPndvcmspOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIE9ubHkgY2FsbGVkIGJ5IGdhbW1hX2RtYV9zY2hlZHVsZS4gKi8KK3N0YXRpYyBpbnQgZ2FtbWFfZG9fZG1hKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbG9ja2VkKQoreworCXVuc2lnbmVkIGxvbmcJIGFkZHJlc3M7CisJdW5zaWduZWQgbG9uZwkgbGVuZ3RoOworCWRybV9idWZfdAkgKmJ1ZjsKKwlpbnQJCSByZXRjb2RlID0gMDsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkZXYtPmRtYV9mbGFnKSkgcmV0dXJuIC1FQlVTWTsKKworCisJaWYgKCFkbWEtPm5leHRfYnVmZmVyKSB7CisJCURSTV9FUlJPUigiTm8gbmV4dF9idWZmZXJcbiIpOworCQljbGVhcl9iaXQoMCwgJmRldi0+ZG1hX2ZsYWcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlidWYJPSBkbWEtPm5leHRfYnVmZmVyOworCS8qIFdFIE5PVyBBUkUgT04gTE9HSUNBTCBQQUdFUyEhIC0gdXNpbmcgcGFnZSB0YWJsZSBzZXR1cCBpbiBkbWFfaW5pdCAqLworCS8qIFNvIHdlIHBhc3MgdGhlIGJ1ZmZlciBpbmRleCB2YWx1ZSBpbnRvIHRoZSBwaHlzaWNhbCBwYWdlIG9mZnNldCAqLworCWFkZHJlc3MgPSBidWYtPmlkeCA8PCAxMjsKKwlsZW5ndGgJPSBidWYtPnVzZWQ7CisKKwlEUk1fREVCVUcoImNvbnRleHQgJWQsIGJ1ZmZlciAlZCAoJWxkIGJ5dGVzKVxuIiwKKwkJICBidWYtPmNvbnRleHQsIGJ1Zi0+aWR4LCBsZW5ndGgpOworCisJaWYgKGJ1Zi0+bGlzdCA9PSBEUk1fTElTVF9SRUNMQUlNKSB7CisJCWdhbW1hX2NsZWFyX25leHRfYnVmZmVyKGRldik7CisJCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgYnVmKTsKKwkJY2xlYXJfYml0KDAsICZkZXYtPmRtYV9mbGFnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFsZW5ndGgpIHsKKwkJRFJNX0VSUk9SKCIwIGxlbmd0aCBidWZmZXJcbiIpOworCQlnYW1tYV9jbGVhcl9uZXh0X2J1ZmZlcihkZXYpOworCQlnYW1tYV9mcmVlX2J1ZmZlcihkZXYsIGJ1Zik7CisJCWNsZWFyX2JpdCgwLCAmZGV2LT5kbWFfZmxhZyk7CisJCXJldHVybiAwOworCX0KKworCWlmICghZ2FtbWFfZG1hX2lzX3JlYWR5KGRldikpIHsKKwkJY2xlYXJfYml0KDAsICZkZXYtPmRtYV9mbGFnKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoYnVmLT53aGlsZV9sb2NrZWQpIHsKKwkJaWYgKCFfRFJNX0xPQ0tfSVNfSEVMRChkZXYtPmxvY2suaHdfbG9jay0+bG9jaykpIHsKKwkJCURSTV9FUlJPUigiRGlzcGF0Y2hpbmcgYnVmZmVyICVkIGZyb20gcGlkICVkIgorCQkJCSAgIiBcIndoaWxlIGxvY2tlZFwiLCBidXQgbm8gbG9jayBoZWxkXG4iLAorCQkJCSAgYnVmLT5pZHgsIGN1cnJlbnQtPnBpZCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWxvY2tlZCAmJiAhZ2FtbWFfbG9ja190YWtlKCZkZXYtPmxvY2suaHdfbG9jay0+bG9jaywKKwkJCQkJICAgICAgRFJNX0tFUk5FTF9DT05URVhUKSkgeworCQkJY2xlYXJfYml0KDAsICZkZXYtPmRtYV9mbGFnKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwlpZiAoZGV2LT5sYXN0X2NvbnRleHQgIT0gYnVmLT5jb250ZXh0CisJICAgICYmICEoZGV2LT5xdWV1ZWxpc3RbYnVmLT5jb250ZXh0XS0+ZmxhZ3MKKwkJICYgX0RSTV9DT05URVhUX1BSRVNFUlZFRCkpIHsKKwkJCQkvKiBQUkU6IGRldi0+bGFzdF9jb250ZXh0ICE9IGJ1Zi0+Y29udGV4dCAqLworCQlpZiAoRFJNKGNvbnRleHRfc3dpdGNoKShkZXYsIGRldi0+bGFzdF9jb250ZXh0LAorCQkJCQlidWYtPmNvbnRleHQpKSB7CisJCQlEUk0oY2xlYXJfbmV4dF9idWZmZXIpKGRldik7CisJCQlEUk0oZnJlZV9idWZmZXIpKGRldiwgYnVmKTsKKwkJfQorCQlyZXRjb2RlID0gLUVCVVNZOworCQlnb3RvIGNsZWFudXA7CisKKwkJCQkvKiBQT1NUOiB3ZSB3aWxsIHdhaXQgZm9yIHRoZSBjb250ZXh0CisJCQkJICAgc3dpdGNoIGFuZCB3aWxsIGRpc3BhdGNoIG9uIGEgbGF0ZXIgY2FsbAorCQkJCSAgIHdoZW4gZGV2LT5sYXN0X2NvbnRleHQgPT0gYnVmLT5jb250ZXh0LgorCQkJCSAgIE5PVEUgV0UgSE9MRCBUSEUgTE9DSyBUSFJPVUdIT1VUIFRISVMKKwkJCQkgICBUSU1FISAqLworCX0KKworCWdhbW1hX2NsZWFyX25leHRfYnVmZmVyKGRldik7CisJYnVmLT5wZW5kaW5nCSA9IDE7CisJYnVmLT53YWl0aW5nCSA9IDA7CisJYnVmLT5saXN0CSA9IERSTV9MSVNUX1BFTkQ7CisKKwkvKiBXRSBOT1cgQVJFIE9OIExPR0lDQUwgUEFHRVMhISEgLSBvdmVycmlkaW5nIGFkZHJlc3MgKi8KKwlhZGRyZXNzID0gYnVmLT5pZHggPDwgMTI7CisKKwlnYW1tYV9kbWFfZGlzcGF0Y2goZGV2LCBhZGRyZXNzLCBsZW5ndGgpOworCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgZG1hLT50aGlzX2J1ZmZlcik7CisJZG1hLT50aGlzX2J1ZmZlciA9IGJ1ZjsKKworCWF0b21pY19pbmMoJmRldi0+Y291bnRzWzddKTsgLyogX0RSTV9TVEFUX0RNQSAqLworCWF0b21pY19hZGQobGVuZ3RoLCAmZGV2LT5jb3VudHNbOF0pOyAvKiBfRFJNX1NUQVRfUFJJTUFSWSAqLworCisJaWYgKCFidWYtPndoaWxlX2xvY2tlZCAmJiAhZGV2LT5jb250ZXh0X2ZsYWcgJiYgIWxvY2tlZCkgeworCQlpZiAoZ2FtbWFfbG9ja19mcmVlKGRldiwgJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAorCQkJCSAgRFJNX0tFUk5FTF9DT05URVhUKSkgeworCQkJRFJNX0VSUk9SKCJcbiIpOworCQl9CisJfQorY2xlYW51cDoKKworCWNsZWFyX2JpdCgwLCAmZGV2LT5kbWFfZmxhZyk7CisKKworCXJldHVybiByZXRjb2RlOworfQorCitzdGF0aWMgdm9pZCBnYW1tYV9kbWFfdGltZXJfYmgodW5zaWduZWQgbG9uZyBkZXYpCit7CisJZ2FtbWFfZG1hX3NjaGVkdWxlKChkcm1fZGV2aWNlX3QgKilkZXYsIDApOworfQorCit2b2lkIGdhbW1hX2lycV9pbW1lZGlhdGVfYmgodm9pZCAqZGV2KQoreworCWdhbW1hX2RtYV9zY2hlZHVsZShkZXYsIDApOworfQorCitpbnQgZ2FtbWFfZG1hX3NjaGVkdWxlKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbG9ja2VkKQoreworCWludAkJIG5leHQ7CisJZHJtX3F1ZXVlX3QJICpxOworCWRybV9idWZfdAkgKmJ1ZjsKKwlpbnQJCSByZXRjb2RlICAgPSAwOworCWludAkJIHByb2Nlc3NlZCA9IDA7CisJaW50CQkgbWlzc2VkOworCWludAkJIGV4cGlyZQkgICA9IDIwOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYQkgICA9IGRldi0+ZG1hOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpKSB7CisJCQkJLyogTm90IHJlZW50cmFudCAqLworCQlhdG9taWNfaW5jKCZkZXYtPmNvdW50c1sxMF0pOyAvKiBfRFJNX1NUQVRfTUlTU0VEICovCisJCXJldHVybiAtRUJVU1k7CisJfQorCW1pc3NlZCA9IGF0b21pY19yZWFkKCZkZXYtPmNvdW50c1sxMF0pOworCisKK2FnYWluOgorCWlmIChkZXYtPmNvbnRleHRfZmxhZykgeworCQljbGVhcl9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpZiAoZG1hLT5uZXh0X2J1ZmZlcikgeworCQkJCS8qIFVuc2VudCBidWZmZXIgdGhhdCB3YXMgcHJldmlvdXNseQorCQkJCSAgIHNlbGVjdGVkLCBidXQgdGhhdCBjb3VsZG4ndCBiZSBzZW50CisJCQkJICAgYmVjYXVzZSB0aGUgbG9jayBjb3VsZCBub3QgYmUgb2J0YWluZWQKKwkJCQkgICBvciB0aGUgRE1BIGVuZ2luZSB3YXNuJ3QgcmVhZHkuICBUcnkKKwkJCQkgICBhZ2Fpbi4gKi8KKwkJaWYgKCEocmV0Y29kZSA9IGdhbW1hX2RvX2RtYShkZXYsIGxvY2tlZCkpKSArK3Byb2Nlc3NlZDsKKwl9IGVsc2UgeworCQlkbyB7CisJCQluZXh0ID0gZ2FtbWFfc2VsZWN0X3F1ZXVlKGRldiwgZ2FtbWFfZG1hX3RpbWVyX2JoKTsKKwkJCWlmIChuZXh0ID49IDApIHsKKwkJCQlxICAgPSBkZXYtPnF1ZXVlbGlzdFtuZXh0XTsKKwkJCQlidWYgPSBnYW1tYV93YWl0bGlzdF9nZXQoJnEtPndhaXRsaXN0KTsKKwkJCQlkbWEtPm5leHRfYnVmZmVyID0gYnVmOworCQkJCWRtYS0+bmV4dF9xdWV1ZQkgPSBxOworCQkJCWlmIChidWYgJiYgYnVmLT5saXN0ID09IERSTV9MSVNUX1JFQ0xBSU0pIHsKKwkJCQkJZ2FtbWFfY2xlYXJfbmV4dF9idWZmZXIoZGV2KTsKKwkJCQkJZ2FtbWFfZnJlZV9idWZmZXIoZGV2LCBidWYpOworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAobmV4dCA+PSAwICYmICFkbWEtPm5leHRfYnVmZmVyKTsKKwkJaWYgKGRtYS0+bmV4dF9idWZmZXIpIHsKKwkJCWlmICghKHJldGNvZGUgPSBnYW1tYV9kb19kbWEoZGV2LCBsb2NrZWQpKSkgeworCQkJCSsrcHJvY2Vzc2VkOworCQkJfQorCQl9CisJfQorCisJaWYgKC0tZXhwaXJlKSB7CisJCWlmIChtaXNzZWQgIT0gYXRvbWljX3JlYWQoJmRldi0+Y291bnRzWzEwXSkpIHsKKwkJCWlmIChnYW1tYV9kbWFfaXNfcmVhZHkoZGV2KSkgZ290byBhZ2FpbjsKKwkJfQorCQlpZiAocHJvY2Vzc2VkICYmIGdhbW1hX2RtYV9pc19yZWFkeShkZXYpKSB7CisJCQlwcm9jZXNzZWQgPSAwOworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0KKworCWNsZWFyX2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZyk7CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworc3RhdGljIGludCBnYW1tYV9kbWFfcHJpb3JpdHkoc3RydWN0IGZpbGUgKmZpbHAsIAorCQkJICAgICAgZHJtX2RldmljZV90ICpkZXYsIGRybV9kbWFfdCAqZCkKK3sKKwl1bnNpZ25lZCBsb25nCSAgYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nCSAgbGVuZ3RoOworCWludAkJICBtdXN0X2ZyZWUgPSAwOworCWludAkJICByZXRjb2RlICAgPSAwOworCWludAkJICBpOworCWludAkJICBpZHg7CisJZHJtX2J1Zl90CSAgKmJ1ZjsKKwlkcm1fYnVmX3QJICAqbGFzdF9idWYgPSBOVUxMOworCWRybV9kZXZpY2VfZG1hX3QgICpkbWEJICAgID0gZGV2LT5kbWE7CisJaW50CQkgICpzZW5kX2luZGljZXMgPSBOVUxMOworCWludAkJICAqc2VuZF9zaXplcyA9IE5VTEw7CisKKwlERUNMQVJFX1dBSVRRVUVVRShlbnRyeSwgY3VycmVudCk7CisKKwkJCQkvKiBUdXJuIG9mZiBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZykpIHsKKwkJc2NoZWR1bGUoKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSByZXR1cm4gLUVJTlRSOworCX0KKwlpZiAoIShkLT5mbGFncyAmIF9EUk1fRE1BX1dISUxFX0xPQ0tFRCkpIHsKKwkJd2hpbGUgKCFnYW1tYV9sb2NrX3Rha2UoJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAorCQkJCSAgICAgIERSTV9LRVJORUxfQ09OVEVYVCkpIHsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQljbGVhcl9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpOworCQkJCXJldHVybiAtRUlOVFI7CisJCQl9CisJCX0KKwkJKyttdXN0X2ZyZWU7CisJfQorCisJc2VuZF9pbmRpY2VzID0gRFJNKGFsbG9jKShkLT5zZW5kX2NvdW50ICogc2l6ZW9mKCpzZW5kX2luZGljZXMpLAorCQkJCSAgRFJNX01FTV9EUklWRVIpOworCWlmIChzZW5kX2luZGljZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGNvcHlfZnJvbV91c2VyKHNlbmRfaW5kaWNlcywgZC0+c2VuZF9pbmRpY2VzLCAKKwkJCSAgIGQtPnNlbmRfY291bnQgKiBzaXplb2YoKnNlbmRfaW5kaWNlcykpKSB7CisJCXJldGNvZGUgPSAtRUZBVUxUOworICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKwl9CisJCisJc2VuZF9zaXplcyA9IERSTShhbGxvYykoZC0+c2VuZF9jb3VudCAqIHNpemVvZigqc2VuZF9zaXplcyksCisJCQkJRFJNX01FTV9EUklWRVIpOworCWlmIChzZW5kX3NpemVzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChjb3B5X2Zyb21fdXNlcihzZW5kX3NpemVzLCBkLT5zZW5kX3NpemVzLCAKKwkJCSAgIGQtPnNlbmRfY291bnQgKiBzaXplb2YoKnNlbmRfc2l6ZXMpKSkgeworCQlyZXRjb2RlID0gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGQtPnNlbmRfY291bnQ7IGkrKykgeworCQlpZHggPSBzZW5kX2luZGljZXNbaV07CisJCWlmIChpZHggPCAwIHx8IGlkeCA+PSBkbWEtPmJ1Zl9jb3VudCkgeworCQkJRFJNX0VSUk9SKCJJbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCQkgIHNlbmRfaW5kaWNlc1tpXSwgZG1hLT5idWZfY291bnQgLSAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFsgaWR4IF07CisJCWlmIChidWYtPmZpbHAgIT0gZmlscCkgeworCQkJRFJNX0VSUk9SKCJQcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBub3Qgb3duZWRcbiIsCisJCQkJICBjdXJyZW50LT5waWQpOworCQkJcmV0Y29kZSA9IC1FSU5WQUw7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJaWYgKGJ1Zi0+bGlzdCAhPSBEUk1fTElTVF9OT05FKSB7CisJCQlEUk1fRVJST1IoIlByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG9uIGxpc3QgJWRcbiIsCisJCQkJICBjdXJyZW50LT5waWQsIGJ1Zi0+bGlzdCk7CisJCQlyZXRjb2RlID0gLUVJTlZBTDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQkJCS8qIFRoaXMgaXNuJ3QgYSByYWNlIGNvbmRpdGlvbiBvbgorCQkJCSAgIGJ1Zi0+bGlzdCwgc2luY2Ugb3VyIGNvbmNlcm4gaXMgdGhlCisJCQkJICAgYnVmZmVyIHJlY2xhaW0gZHVyaW5nIHRoZSB0aW1lIHRoZQorCQkJCSAgIHByb2Nlc3MgY2xvc2VzIHRoZSAvZGV2L2RybT8gaGFuZGxlLCBzbworCQkJCSAgIGl0IGNhbid0IGFsc28gYmUgZG9pbmcgRE1BLiAqLworCQlidWYtPmxpc3QJICA9IERSTV9MSVNUX1BSSU87CisJCWJ1Zi0+dXNlZAkgID0gc2VuZF9zaXplc1tpXTsKKwkJYnVmLT5jb250ZXh0CSAgPSBkLT5jb250ZXh0OworCQlidWYtPndoaWxlX2xvY2tlZCA9IGQtPmZsYWdzICYgX0RSTV9ETUFfV0hJTEVfTE9DS0VEOworCQlhZGRyZXNzCQkgID0gKHVuc2lnbmVkIGxvbmcpYnVmLT5hZGRyZXNzOworCQlsZW5ndGgJCSAgPSBidWYtPnVzZWQ7CisJCWlmICghbGVuZ3RoKSB7CisJCQlEUk1fRVJST1IoIjAgbGVuZ3RoIGJ1ZmZlclxuIik7CisJCX0KKwkJaWYgKGJ1Zi0+cGVuZGluZykgeworCQkJRFJNX0VSUk9SKCJTZW5kaW5nIHBlbmRpbmcgYnVmZmVyOiIKKwkJCQkgICIgYnVmZmVyICVkLCBvZmZzZXQgJWRcbiIsCisJCQkJICBzZW5kX2luZGljZXNbaV0sIGkpOworCQkJcmV0Y29kZSA9IC1FSU5WQUw7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJaWYgKGJ1Zi0+d2FpdGluZykgeworCQkJRFJNX0VSUk9SKCJTZW5kaW5nIHdhaXRpbmcgYnVmZmVyOiIKKwkJCQkgICIgYnVmZmVyICVkLCBvZmZzZXQgJWRcbiIsCisJCQkJICBzZW5kX2luZGljZXNbaV0sIGkpOworCQkJcmV0Y29kZSA9IC1FSU5WQUw7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJYnVmLT5wZW5kaW5nID0gMTsKKworCQlpZiAoZGV2LT5sYXN0X2NvbnRleHQgIT0gYnVmLT5jb250ZXh0CisJCSAgICAmJiAhKGRldi0+cXVldWVsaXN0W2J1Zi0+Y29udGV4dF0tPmZsYWdzCisJCQkgJiBfRFJNX0NPTlRFWFRfUFJFU0VSVkVEKSkgeworCQkJYWRkX3dhaXRfcXVldWUoJmRldi0+Y29udGV4dF93YWl0LCAmZW50cnkpOworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQkJLyogUFJFOiBkZXYtPmxhc3RfY29udGV4dCAhPSBidWYtPmNvbnRleHQgKi8KKwkJCURSTShjb250ZXh0X3N3aXRjaCkoZGV2LCBkZXYtPmxhc3RfY29udGV4dCwKKwkJCQkJICAgIGJ1Zi0+Y29udGV4dCk7CisJCQkJLyogUE9TVDogd2Ugd2lsbCB3YWl0IGZvciB0aGUgY29udGV4dAorCQkJCSAgIHN3aXRjaCBhbmQgd2lsbCBkaXNwYXRjaCBvbiBhIGxhdGVyIGNhbGwKKwkJCQkgICB3aGVuIGRldi0+bGFzdF9jb250ZXh0ID09IGJ1Zi0+Y29udGV4dC4KKwkJCQkgICBOT1RFIFdFIEhPTEQgVEhFIExPQ0sgVEhST1VHSE9VVCBUSElTCisJCQkJICAgVElNRSEgKi8KKwkJCXNjaGVkdWxlKCk7CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZkZXYtPmNvbnRleHRfd2FpdCwgJmVudHJ5KTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldGNvZGUgPSAtRUlOVFI7CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQkJaWYgKGRldi0+bGFzdF9jb250ZXh0ICE9IGJ1Zi0+Y29udGV4dCkgeworCQkJCURSTV9FUlJPUigiQ29udGV4dCBtaXNtYXRjaDogJWQgJWRcbiIsCisJCQkJCSAgZGV2LT5sYXN0X2NvbnRleHQsCisJCQkJCSAgYnVmLT5jb250ZXh0KTsKKwkJCX0KKwkJfQorCisJCWdhbW1hX2RtYV9kaXNwYXRjaChkZXYsIGFkZHJlc3MsIGxlbmd0aCk7CisJCWF0b21pY19pbmMoJmRldi0+Y291bnRzWzldKTsgLyogX0RSTV9TVEFUX1NQRUNJQUwgKi8KKwkJYXRvbWljX2FkZChsZW5ndGgsICZkZXYtPmNvdW50c1s4XSk7IC8qIF9EUk1fU1RBVF9QUklNQVJZICovCisKKwkJaWYgKGxhc3RfYnVmKSB7CisJCQlnYW1tYV9mcmVlX2J1ZmZlcihkZXYsIGxhc3RfYnVmKTsKKwkJfQorCQlsYXN0X2J1ZiA9IGJ1ZjsKKwl9CisKKworY2xlYW51cDoKKwlpZiAobGFzdF9idWYpIHsKKwkJZ2FtbWFfZG1hX3JlYWR5KGRldik7CisJCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgbGFzdF9idWYpOworCX0KKwlpZiAoc2VuZF9pbmRpY2VzKQorCQlEUk0oZnJlZSkoc2VuZF9pbmRpY2VzLCBkLT5zZW5kX2NvdW50ICogc2l6ZW9mKCpzZW5kX2luZGljZXMpLCAKKwkJCSAgRFJNX01FTV9EUklWRVIpOworCWlmIChzZW5kX3NpemVzKQorCQlEUk0oZnJlZSkoc2VuZF9zaXplcywgZC0+c2VuZF9jb3VudCAqIHNpemVvZigqc2VuZF9zaXplcyksIAorCQkJICBEUk1fTUVNX0RSSVZFUik7CisKKwlpZiAobXVzdF9mcmVlICYmICFkZXYtPmNvbnRleHRfZmxhZykgeworCQlpZiAoZ2FtbWFfbG9ja19mcmVlKGRldiwgJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAorCQkJCSAgRFJNX0tFUk5FTF9DT05URVhUKSkgeworCQkJRFJNX0VSUk9SKCJcbiIpOworCQl9CisJfQorCWNsZWFyX2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZyk7CisJcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyBpbnQgZ2FtbWFfZG1hX3NlbmRfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZG1hX3QgKmQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOworCWRybV9idWZfdAkgICpsYXN0X2J1ZiA9IE5VTEw7CisJaW50CQkgIHJldGNvZGUgICA9IDA7CisJZHJtX2RldmljZV9kbWFfdCAgKmRtYQkgICAgPSBkZXYtPmRtYTsKKwlpbnQgICAgICAgICAgICAgICBzZW5kX2luZGV4OworCisJaWYgKGdldF91c2VyKHNlbmRfaW5kZXgsICZkLT5zZW5kX2luZGljZXNbZC0+c2VuZF9jb3VudC0xXSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGQtPmZsYWdzICYgX0RSTV9ETUFfQkxPQ0spIHsKKwkJbGFzdF9idWYgPSBkbWEtPmJ1Zmxpc3Rbc2VuZF9pbmRleF07CisJCWFkZF93YWl0X3F1ZXVlKCZsYXN0X2J1Zi0+ZG1hX3dhaXQsICZlbnRyeSk7CisJfQorCisJaWYgKChyZXRjb2RlID0gZ2FtbWFfZG1hX2VucXVldWUoZmlscCwgZCkpKSB7CisJCWlmIChkLT5mbGFncyAmIF9EUk1fRE1BX0JMT0NLKQorCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmxhc3RfYnVmLT5kbWFfd2FpdCwgJmVudHJ5KTsKKwkJcmV0dXJuIHJldGNvZGU7CisJfQorCisJZ2FtbWFfZG1hX3NjaGVkdWxlKGRldiwgMCk7CisKKwlpZiAoZC0+ZmxhZ3MgJiBfRFJNX0RNQV9CTE9DSykgeworCQlEUk1fREVCVUcoIiVkIHdhaXRpbmdcbiIsIGN1cnJlbnQtPnBpZCk7CisJCWZvciAoOzspIHsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQkJaWYgKCFsYXN0X2J1Zi0+d2FpdGluZyAmJiAhbGFzdF9idWYtPnBlbmRpbmcpCisJCQkJYnJlYWs7IC8qIGZpbmlzaGVkICovCisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0Y29kZSA9IC1FSU5UUjsgLyogQ2FuJ3QgcmVzdGFydCAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQlEUk1fREVCVUcoIiVkIHJ1bm5pbmdcbiIsIGN1cnJlbnQtPnBpZCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZsYXN0X2J1Zi0+ZG1hX3dhaXQsICZlbnRyeSk7CisJCWlmICghcmV0Y29kZQorCQkgICAgfHwgKGxhc3RfYnVmLT5saXN0PT1EUk1fTElTVF9QRU5EICYmICFsYXN0X2J1Zi0+cGVuZGluZykpIHsKKwkJCWlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmbGFzdF9idWYtPmRtYV93YWl0KSkgeworCQkJCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgbGFzdF9idWYpOworCQkJfQorCQl9CisJCWlmIChyZXRjb2RlKSB7CisJCQlEUk1fRVJST1IoImN0eCVkIHclZCBwJWQgYyVsZCBpJWQgbCVkIHBpZDolZFxuIiwKKwkJCQkgIGQtPmNvbnRleHQsCisJCQkJICBsYXN0X2J1Zi0+d2FpdGluZywKKwkJCQkgIGxhc3RfYnVmLT5wZW5kaW5nLAorCQkJCSAgKGxvbmcpRFJNX1dBSVRDT1VOVChkZXYsIGQtPmNvbnRleHQpLAorCQkJCSAgbGFzdF9idWYtPmlkeCwKKwkJCQkgIGxhc3RfYnVmLT5saXN0LAorCQkJCSAgY3VycmVudC0+cGlkKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0Y29kZTsKK30KKworaW50IGdhbW1hX2RtYShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICAgID0gcHJpdi0+ZGV2OworCWRybV9kZXZpY2VfZG1hX3QgICpkbWEJICAgID0gZGV2LT5kbWE7CisJaW50CQkgIHJldGNvZGUgICA9IDA7CisJZHJtX2RtYV90CSAgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9kbWFfdAkgIGQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmQsIGFyZ3AsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGQuc2VuZF9jb3VudCA8IDAgfHwgZC5zZW5kX2NvdW50ID4gZG1hLT5idWZfY291bnQpIHsKKwkJRFJNX0VSUk9SKCJQcm9jZXNzICVkIHRyeWluZyB0byBzZW5kICVkIGJ1ZmZlcnMgKG9mICVkIG1heClcbiIsCisJCQkgIGN1cnJlbnQtPnBpZCwgZC5zZW5kX2NvdW50LCBkbWEtPmJ1Zl9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkLnJlcXVlc3RfY291bnQgPCAwIHx8IGQucmVxdWVzdF9jb3VudCA+IGRtYS0+YnVmX2NvdW50KSB7CisJCURSTV9FUlJPUigiUHJvY2VzcyAlZCB0cnlpbmcgdG8gZ2V0ICVkIGJ1ZmZlcnMgKG9mICVkIG1heClcbiIsCisJCQkgIGN1cnJlbnQtPnBpZCwgZC5yZXF1ZXN0X2NvdW50LCBkbWEtPmJ1Zl9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkLnNlbmRfY291bnQpIHsKKwkJaWYgKGQuZmxhZ3MgJiBfRFJNX0RNQV9QUklPUklUWSkKKwkJCXJldGNvZGUgPSBnYW1tYV9kbWFfcHJpb3JpdHkoZmlscCwgZGV2LCAmZCk7CisJCWVsc2UKKwkJCXJldGNvZGUgPSBnYW1tYV9kbWFfc2VuZF9idWZmZXJzKGZpbHAsIGRldiwgJmQpOworCX0KKworCWQuZ3JhbnRlZF9jb3VudCA9IDA7CisKKwlpZiAoIXJldGNvZGUgJiYgZC5yZXF1ZXN0X2NvdW50KSB7CisJCXJldGNvZGUgPSBnYW1tYV9kbWFfZ2V0X2J1ZmZlcnMoZmlscCwgJmQpOworCX0KKworCURSTV9ERUJVRygiJWQgcmV0dXJuaW5nLCBncmFudGVkID0gJWRcbiIsCisJCSAgY3VycmVudC0+cGlkLCBkLmdyYW50ZWRfY291bnQpOworCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmQsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHJldGNvZGU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERNQSBpbml0aWFsaXphdGlvbiwgY2xlYW51cAorICovCisKK3N0YXRpYyBpbnQgZ2FtbWFfZG9faW5pdF9kbWEoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZ2FtbWFfaW5pdF90ICppbml0ICkKK3sKKwlkcm1fZ2FtbWFfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKwlkcm1fZGV2aWNlX2RtYV90ICAgICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QJICAgICpidWY7CisJaW50IGk7CisJc3RydWN0IGxpc3RfaGVhZCAgICAqbGlzdDsKKwl1bnNpZ25lZCBsb25nCSAgICAqcGd0OworCisJRFJNX0RFQlVHKCAiJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJZGV2X3ByaXYgPSBEUk0oYWxsb2MpKCBzaXplb2YoZHJtX2dhbW1hX3ByaXZhdGVfdCksCisJCQkJCQkJRFJNX01FTV9EUklWRVIgKTsKKwlpZiAoICFkZXZfcHJpdiApCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisKKwltZW1zZXQoIGRldl9wcml2LCAwLCBzaXplb2YoZHJtX2dhbW1hX3ByaXZhdGVfdCkgKTsKKworCWRldl9wcml2LT5udW1fcmFzdCA9IGluaXQtPm51bV9yYXN0OworCisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CisJCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwkJaWYoIHJfbGlzdC0+bWFwICYmCisJCSAgICByX2xpc3QtPm1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJgorCQkgICAgcl9saXN0LT5tYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLICkgeworCQkJZGV2X3ByaXYtPnNhcmVhID0gcl9saXN0LT5tYXA7CisgCQkJYnJlYWs7CisgCQl9CisgCX0KKwkKKwlkZXZfcHJpdi0+bW1pbzAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pbzApOworCWRldl9wcml2LT5tbWlvMSA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5tbWlvMSk7CisJZGV2X3ByaXYtPm1taW8yID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPm1taW8yKTsKKwlkZXZfcHJpdi0+bW1pbzMgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pbzMpOworCQorCWRldl9wcml2LT5zYXJlYV9wcml2ID0gKGRybV9nYW1tYV9zYXJlYV90ICopCisJCSgodTggKilkZXZfcHJpdi0+c2FyZWEtPmhhbmRsZSArCisJCSBpbml0LT5zYXJlYV9wcml2X29mZnNldCk7CisKKwlpZiAoaW5pdC0+cGNpbW9kZSkgeworCQlidWYgPSBkbWEtPmJ1Zmxpc3RbR0xJTlRfRFJJX0JVRl9DT1VOVF07CisJCXBndCA9IGJ1Zi0+YWRkcmVzczsKKworIAkJZm9yIChpID0gMDsgaSA8IEdMSU5UX0RSSV9CVUZfQ09VTlQ7IGkrKykgeworCQkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQkJKnBndCA9IHZpcnRfdG9fcGh5cygodm9pZCopYnVmLT5hZGRyZXNzKSB8IDB4MDc7CisJCQlwZ3QrKzsKKwkJfQorCisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtHTElOVF9EUklfQlVGX0NPVU5UXTsKKwl9IGVsc2UgeworCQlkZXYtPmFncF9idWZmZXJfbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmJ1ZmZlcnNfb2Zmc2V0KTsKKwkJZHJtX2NvcmVfaW9yZW1hcCggZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2KTsKKworCQlidWYgPSBkbWEtPmJ1Zmxpc3RbR0xJTlRfRFJJX0JVRl9DT1VOVF07CisJCXBndCA9IGJ1Zi0+YWRkcmVzczsKKworIAkJZm9yIChpID0gMDsgaSA8IEdMSU5UX0RSSV9CVUZfQ09VTlQ7IGkrKykgeworCQkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQkJKnBndCA9ICh1bnNpZ25lZCBsb25nKWJ1Zi0+YWRkcmVzcyArIDB4MDc7CisJCQlwZ3QrKzsKKwkJfQorCisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtHTElOVF9EUklfQlVGX0NPVU5UXTsKKworCQl3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9JTkZJRk9TUEFDRSkgPCAxKTsKKwkJR0FNTUFfV1JJVEUoIEdBTU1BX0dETUFDT05UUk9MLCAweGUpOworCX0KKwl3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9JTkZJRk9TUEFDRSkgPCAyKTsKKwlHQU1NQV9XUklURSggR0FNTUFfUEFHRVRBQkxFQUREUiwgdmlydF90b19waHlzKCh2b2lkKilidWYtPmFkZHJlc3MpICk7CisJR0FNTUFfV1JJVEUoIEdBTU1BX1BBR0VUQUJMRUxFTkdUSCwgMiApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYW1tYV9kb19jbGVhbnVwX2RtYSggZHJtX2RldmljZV90ICpkZXYgKQoreworCURSTV9ERUJVRyggIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAorCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKKwkgKiBpcyBmcmVlZCwgaXQncyB0b28gbGF0ZS4KKwkgKi8KKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0lSUSkpCisJCWlmICggZGV2LT5pcnFfZW5hYmxlZCApIAorCQkJRFJNKGlycV91bmluc3RhbGwpKGRldik7CisKKwlpZiAoIGRldi0+ZGV2X3ByaXZhdGUgKSB7CisKKwkJaWYgKCBkZXYtPmFncF9idWZmZXJfbWFwICE9IE5VTEwgKQorCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoIGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldiApOworCisJCURSTShmcmVlKSggZGV2LT5kZXZfcHJpdmF0ZSwgc2l6ZW9mKGRybV9nYW1tYV9wcml2YXRlX3QpLAorCQkJICAgRFJNX01FTV9EUklWRVIgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYW1tYV9kbWFfaW5pdCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5kZXY7CisJZHJtX2dhbW1hX2luaXRfdCBpbml0OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggY29weV9mcm9tX3VzZXIoICZpbml0LCAoZHJtX2dhbW1hX2luaXRfdCBfX3VzZXIgKilhcmcsIHNpemVvZihpbml0KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKCBpbml0LmZ1bmMgKSB7CisJY2FzZSBHQU1NQV9JTklUX0RNQToKKwkJcmV0dXJuIGdhbW1hX2RvX2luaXRfZG1hKCBkZXYsICZpbml0ICk7CisJY2FzZSBHQU1NQV9DTEVBTlVQX0RNQToKKwkJcmV0dXJuIGdhbW1hX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBnYW1tYV9kb19jb3B5X2RtYSggZHJtX2RldmljZV90ICpkZXYsIGRybV9nYW1tYV9jb3B5X3QgKmNvcHkgKQoreworCWRybV9kZXZpY2VfZG1hX3QgICAgKmRtYSA9IGRldi0+ZG1hOworCXVuc2lnbmVkIGludCAgICAgICAgKnNjcmVlbmJ1ZjsKKworCURSTV9ERUJVRyggIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIFdlJ3ZlIERSTV9SRVNUUklDVEVEIHRoaXMgRE1BIGJ1ZmZlciAqLworCisJc2NyZWVuYnVmID0gZG1hLT5idWZsaXN0WyBHTElOVF9EUklfQlVGX0NPVU5UICsgMSBdLT5hZGRyZXNzOworCisjaWYgMAorCSpidWZmZXIrKyA9IDB4MTgwOwkvKiBUYWcgKEZpbHRlck1vZGUpICovCisJKmJ1ZmZlcisrID0gMHgyMDA7CS8qIEFsbG93IEZCQ29sb3IgdGhyb3VnaCAqLworCSpidWZmZXIrKyA9IDB4NTNCOwkvKiBUYWcgKi8KKwkqYnVmZmVyKysgPSBjb3B5LT5QaXRjaDsKKwkqYnVmZmVyKysgPSAweDUzQTsJLyogVGFnICovCisJKmJ1ZmZlcisrID0gY29weS0+U3JjQWRkcmVzczsKKwkqYnVmZmVyKysgPSAweDUzOTsJLyogVGFnICovCisJKmJ1ZmZlcisrID0gY29weS0+V2lkdGhIZWlnaHQ7IC8qIEluaXRpYXRlcyB0cmFuc2ZlciAqLworCSpidWZmZXIrKyA9IDB4NTNDOwkvKiBUYWcgLSBETUFPdXRwdXRBZGRyZXNzICovCisJKmJ1ZmZlcisrID0gdmlydF90b19waHlzKCh2b2lkKilzY3JlZW5idWYpOworCSpidWZmZXIrKyA9IDB4NTNEOwkvKiBUYWcgLSBETUFPdXRwdXRDb3VudCAqLworCSpidWZmZXIrKyA9IGNvcHktPkNvdW50OyAvKiBSZWFkcyBIb3N0T3V0RmlmbyBCTE9DS1MgdW50aWwgLi4qLworCisJLyogRGF0YSBub3cgc2l0dGluZyBpbiBkbWEtPmJ1Zmxpc3RbIEdMSU5UX0RSSV9CVUZfQ09VTlQgKyAxIF0gKi8KKwkvKiBOb3cgcHV0IGl0IGJhY2sgdG8gdGhlIHNjcmVlbiAqLworCisJKmJ1ZmZlcisrID0gMHgxODA7CS8qIFRhZyAoRmlsdGVyTW9kZSkgKi8KKwkqYnVmZmVyKysgPSAweDQwMDsJLyogQWxsb3cgU3luYyB0aHJvdWdoICovCisJKmJ1ZmZlcisrID0gMHg1Mzg7CS8qIFRhZyAtIERNQVJlY3RhbmdsZVJlYWRUYXJnZXQgKi8KKwkqYnVmZmVyKysgPSAweDE1NTsJLyogRkJTb3VyY2VEYXRhIHwgY291bnQgKi8KKwkqYnVmZmVyKysgPSAweDUzNzsJLyogVGFnICovCisJKmJ1ZmZlcisrID0gY29weS0+UGl0Y2g7CisJKmJ1ZmZlcisrID0gMHg1MzY7CS8qIFRhZyAqLworCSpidWZmZXIrKyA9IGNvcHktPkRzdEFkZHJlc3M7CisJKmJ1ZmZlcisrID0gMHg1MzU7CS8qIFRhZyAqLworCSpidWZmZXIrKyA9IGNvcHktPldpZHRoSGVpZ2h0OyAvKiBJbml0aWF0ZXMgdHJhbnNmZXIgKi8KKwkqYnVmZmVyKysgPSAweDUzMDsJLyogVGFnIC0gRE1BQWRkciAqLworCSpidWZmZXIrKyA9IHZpcnRfdG9fcGh5cygodm9pZCopc2NyZWVuYnVmKTsKKwkqYnVmZmVyKysgPSAweDUzMTsKKwkqYnVmZmVyKysgPSBjb3B5LT5Db3VudDsgLyogaW5pdGlhdGVzIERNQSB0cmFuc2ZlciBvZiBjb2xvciBkYXRhICovCisjZW5kaWYKKworCS8qIG5lZWQgdG8gZGlzcGF0Y2ggaXQgbm93ICovCisKKwlyZXR1cm4gMDsKK30KKworaW50IGdhbW1hX2RtYV9jb3B5KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmRldjsKKwlkcm1fZ2FtbWFfY29weV90IGNvcHk7CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKCAmY29weSwgKGRybV9nYW1tYV9jb3B5X3QgX191c2VyICopYXJnLCBzaXplb2YoY29weSkgKSApCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGdhbW1hX2RvX2NvcHlfZG1hKCBkZXYsICZjb3B5ICk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFBlciBDb250ZXh0IFNBUkVBIFN1cHBvcnQKKyAqLworCitpbnQgZ2FtbWFfZ2V0c2FyZWFjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3ByaXZfbWFwX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9jdHhfcHJpdl9tYXBfdCByZXF1ZXN0OworCWRybV9tYXBfdCAqbWFwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCBhcmdwLCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJaWYgKChpbnQpcmVxdWVzdC5jdHhfaWQgPj0gZGV2LT5tYXhfY29udGV4dCkgeworCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWFwID0gZGV2LT5jb250ZXh0X3NhcmVhc1tyZXF1ZXN0LmN0eF9pZF07CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisKKwlyZXF1ZXN0LmhhbmRsZSA9IG1hcC0+aGFuZGxlOworCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitpbnQgZ2FtbWFfc2V0c2FyZWFjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3ByaXZfbWFwX3QgcmVxdWVzdDsKKwlkcm1fbWFwX3QgKm1hcCA9IE5VTEw7CisJZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LAorCQkJICAgKGRybV9jdHhfcHJpdl9tYXBfdCBfX3VzZXIgKilhcmcsCisJCQkgICBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJcl9saXN0ID0gTlVMTDsKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKKwkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCWlmKHJfbGlzdC0+bWFwICYmCisJCSAgIHJfbGlzdC0+bWFwLT5oYW5kbGUgPT0gcmVxdWVzdC5oYW5kbGUpIGJyZWFrOworCX0KKwlpZiAobGlzdCA9PSAmKGRldi0+bWFwbGlzdC0+aGVhZCkpIHsKKwkJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltYXAgPSByX2xpc3QtPm1hcDsKKwl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKworCWlmICghbWFwKSByZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CisJaWYgKChpbnQpcmVxdWVzdC5jdHhfaWQgPj0gZGV2LT5tYXhfY29udGV4dCkgeworCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldi0+Y29udGV4dF9zYXJlYXNbcmVxdWVzdC5jdHhfaWRdID0gbWFwOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCXJldHVybiAwOworfQorCit2b2lkIGdhbW1hX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7CisJZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkJCShkcm1fZ2FtbWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCXdoaWxlKEdBTU1BX1JFQUQoR0FNTUFfSU5GSUZPU1BBQ0UpIDwgMikKKwkJY3B1X3JlbGF4KCk7CisKKwlHQU1NQV9XUklURSggR0FNTUFfR0NPTU1BTkRNT0RFLAkweDAwMDAwMDA0ICk7CisJR0FNTUFfV1JJVEUoIEdBTU1BX0dETUFDT05UUk9MLAkJMHgwMDAwMDAwMCApOworfQorCit2b2lkIGdhbW1hX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwl3aGlsZShHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDMpCisJCWNwdV9yZWxheCgpOworCisJR0FNTUFfV1JJVEUoIEdBTU1BX0dJTlRFTkFCTEUsCQkweDAwMDAyMDAxICk7CisJR0FNTUFfV1JJVEUoIEdBTU1BX0NPTU1BTkRJTlRFTkFCTEUsCTB4MDAwMDAwMDggKTsKKwlHQU1NQV9XUklURSggR0FNTUFfR0RFTEFZVElNRVIsCQkweDAwMDM5MDkwICk7Cit9CisKK3ZvaWQgZ2FtbWFfZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJaWYgKCFkZXZfcHJpdikKKwkJcmV0dXJuOworCisJd2hpbGUoR0FNTUFfUkVBRChHQU1NQV9JTkZJRk9TUEFDRSkgPCAzKQorCQljcHVfcmVsYXgoKTsKKworCUdBTU1BX1dSSVRFKCBHQU1NQV9HREVMQVlUSU1FUiwJCTB4MDAwMDAwMDAgKTsKKwlHQU1NQV9XUklURSggR0FNTUFfQ09NTUFORElOVEVOQUJMRSwJMHgwMDAwMDAwMCApOworCUdBTU1BX1dSSVRFKCBHQU1NQV9HSU5URU5BQkxFLAkJMHgwMDAwMDAwMCApOworfQorCitleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBEUk0oaW9jdGxzKVtdOworCitzdGF0aWMgaW50IGdhbW1hX2RyaXZlcl9wcmVpbml0KGRybV9kZXZpY2VfdCAqZGV2KQoreworCS8qIHJlc2V0IHRoZSBmaW5pc2ggaW9jdGwgKi8KKwlEUk0oaW9jdGxzKVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0ZJTklTSCldLmZ1bmMgPSBEUk0oZmluaXNoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2FtbWFfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWdhbW1hX2RvX2NsZWFudXBfZG1hKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGdhbW1hX2RyaXZlcl9kbWFfcmVhZHkoZHJtX2RldmljZV90ICpkZXYpCit7CisJZ2FtbWFfZG1hX3JlYWR5KGRldik7Cit9CisKK3N0YXRpYyBpbnQgZ2FtbWFfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICpkZXYpCit7CisJZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQkoCisJCWRybV9nYW1tYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCWlmIChkZXZfcHJpdi0+bnVtX3Jhc3QgPT0gMikKKwkJZ2FtbWFfZG1hX3F1aWVzY2VudF9kdWFsKGRldik7CisJZWxzZSBnYW1tYV9kbWFfcXVpZXNjZW50X3NpbmdsZShkZXYpOworCXJldHVybiAwOworfQorCit2b2lkIGdhbW1hX2RyaXZlcl9yZWdpc3Rlcl9mbnMoZHJtX2RldmljZV90ICpkZXYpCit7CisJZGV2LT5kcml2ZXJfZmVhdHVyZXMgPSBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8IERSSVZFUl9QQ0lfRE1BIHwgRFJJVkVSX0hBVkVfRE1BIHwgRFJJVkVSX0hBVkVfSVJROworCURSTShmb3BzKS5yZWFkID0gZ2FtbWFfZm9wc19yZWFkOworCURSTShmb3BzKS5wb2xsID0gZ2FtbWFfZm9wc19wb2xsOworCWRldi0+ZHJpdmVyLnByZWluaXQgPSBnYW1tYV9kcml2ZXJfcHJlaW5pdDsKKwlkZXYtPmRyaXZlci5wcmV0YWtlZG93biA9IGdhbW1hX2RyaXZlcl9wcmV0YWtlZG93bjsKKwlkZXYtPmRyaXZlci5kbWFfcmVhZHkgPSBnYW1tYV9kcml2ZXJfZG1hX3JlYWR5OworCWRldi0+ZHJpdmVyLmRtYV9xdWllc2NlbnQgPSBnYW1tYV9kcml2ZXJfZG1hX3F1aWVzY2VudDsKKwlkZXYtPmRyaXZlci5kbWFfZmx1c2hfYmxvY2tfYW5kX2ZsdXNoID0gZ2FtbWFfZmx1c2hfYmxvY2tfYW5kX2ZsdXNoOworCWRldi0+ZHJpdmVyLmRtYV9mbHVzaF91bmJsb2NrID0gZ2FtbWFfZmx1c2hfdW5ibG9jazsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwODE5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2RybS5oCkBAIC0wLDAgKzEsOTAgQEAKKyNpZm5kZWYgX0dBTU1BX0RSTV9IXworI2RlZmluZSBfR0FNTUFfRFJNX0hfCisKK3R5cGVkZWYgc3RydWN0IF9kcm1fZ2FtbWFfdGV4X3JlZ2lvbiB7CisJdW5zaWduZWQgY2hhciBuZXh0LCBwcmV2OyAvKiBpbmRpY2VzIHRvIGZvcm0gYSBjaXJjdWxhciBMUlUgICovCisJdW5zaWduZWQgY2hhciBpbl91c2U7CS8qIG93bmVkIGJ5IGEgY2xpZW50LCBvciBmcmVlPyAqLworCWludCBhZ2U7CQkvKiB0cmFja2VkIGJ5IGNsaWVudHMgdG8gdXBkYXRlIGxvY2FsIExSVSdzICovCit9IGRybV9nYW1tYV90ZXhfcmVnaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQJR0RlbHRhTW9kZTsKKwl1bnNpZ25lZCBpbnQJR0RlcHRoTW9kZTsKKwl1bnNpZ25lZCBpbnQJR0dlb21ldHJ5TW9kZTsKKwl1bnNpZ25lZCBpbnQJR1RyYW5zZm9ybU1vZGU7Cit9IGRybV9nYW1tYV9jb250ZXh0X3JlZ3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9nYW1tYV9zYXJlYSB7CisgICAJZHJtX2dhbW1hX2NvbnRleHRfcmVnc190IGNvbnRleHRfc3RhdGU7CisKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisKKworCS8qIE1haW50YWluIGFuIExSVSBvZiBjb250aWd1b3VzIHJlZ2lvbnMgb2YgdGV4dHVyZSBzcGFjZS4gIElmCisJICogeW91IHRoaW5rIHlvdSBvd24gYSByZWdpb24gb2YgdGV4dHVyZSBtZW1vcnksIGFuZCBpdCBoYXMgYW4KKwkgKiBhZ2UgZGlmZmVyZW50IHRvIHRoZSBvbmUgeW91IHNldCwgdGhlbiB5b3UgYXJlIG1pc3Rha2VuIGFuZAorCSAqIGl0IGhhcyBiZWVuIHN0b2xlbiBieSBhbm90aGVyIGNsaWVudC4gIElmIGdsb2JhbCB0ZXhBZ2UKKwkgKiBoYXNuJ3QgY2hhbmdlZCwgdGhlcmUgaXMgbm8gbmVlZCB0byB3YWxrIHRoZSBsaXN0LgorCSAqCisJICogVGhlc2UgcmVnaW9ucyBjYW4gYmUgdXNlZCBhcyBhIHByb3h5IGZvciB0aGUgZmluZS1ncmFpbmVkCisJICogdGV4dHVyZSBpbmZvcm1hdGlvbiBvZiBvdGhlciBjbGllbnRzIC0gYnkgbWFpbnRhaW5pbmcgdGhlbQorCSAqIGluIHRoZSBzYW1lIGxydSB3aGljaCBpcyB1c2VkIHRvIGFnZSB0aGVpciBvd24gdGV4dHVyZXMsCisJICogY2xpZW50cyBoYXZlIGFuIGFwcHJveGltYXRlIGxydSBmb3IgdGhlIHdob2xlIG9mIGdsb2JhbAorCSAqIHRleHR1cmUgc3BhY2UsIGFuZCBjYW4gbWFrZSBpbmZvcm1lZCBkZWNpc2lvbnMgYXMgdG8gd2hpY2gKKwkgKiBhcmVhcyB0byBraWNrIG91dC4gIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2hvb3NlIHdoZXRoZXIgdG8KKwkgKiBraWNrIG91dCB5b3VyIG93biB0ZXh0dXJlIG9yIHNvbWVvbmUgZWxzZSdzIC0gc2ltcGx5IGVqZWN0CisJICogdGhlbSBhbGwgaW4gTFJVIG9yZGVyLiAgCisJICovCisgICAKKyNkZWZpbmUgR0FNTUFfTlJfVEVYX1JFR0lPTlMgNjQKKwlkcm1fZ2FtbWFfdGV4X3JlZ2lvbl90IHRleExpc3RbR0FNTUFfTlJfVEVYX1JFR0lPTlMrMV07IAorCQkJCS8qIExhc3QgZWx0IGlzIHNlbnRpbmFsICovCisgICAgICAgIGludCB0ZXhBZ2U7CQkvKiBsYXN0IHRpbWUgdGV4dHVyZSB3YXMgdXBsb2FkZWQgKi8KKyAgICAgICAgaW50IGxhc3RfZW5xdWV1ZTsJLyogbGFzdCB0aW1lIGEgYnVmZmVyIHdhcyBlbnF1ZXVlZCAqLworCWludCBsYXN0X2Rpc3BhdGNoOwkvKiBhZ2Ugb2YgdGhlIG1vc3QgcmVjZW50bHkgZGlzcGF0Y2hlZCBidWZmZXIgKi8KKwlpbnQgbGFzdF9xdWllc2NlbnQ7ICAgICAvKiAgKi8KKwlpbnQgY3R4T3duZXI7CQkvKiBsYXN0IGNvbnRleHQgdG8gdXBsb2FkIHN0YXRlICovCisKKwlpbnQgdmVydGV4X3ByaW07Cit9IGRybV9nYW1tYV9zYXJlYV90OworCisvKiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGVzZSBkZWZpbmVzLCBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZQorICogZGVmaW5lcyBpbiB0aGUgWHNlcnZlciBmaWxlICh4Zjg2ZHJtR2FtbWEuaCkKKyAqLworCisvKiBHYW1tYSBzcGVjaWZpYyBpb2N0bHMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgMHg0MCB0byAweDc5LgorICovCisjZGVmaW5lIERSTV9JT0NUTF9HQU1NQV9JTklUCQlEUk1fSU9XKCAweDQwLCBkcm1fZ2FtbWFfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfR0FNTUFfQ09QWQkJRFJNX0lPVyggMHg0MSwgZHJtX2dhbW1hX2NvcHlfdCkKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2dhbW1hX2NvcHkgeworCXVuc2lnbmVkIGludAlETUFPdXRwdXRBZGRyZXNzOworCXVuc2lnbmVkIGludAlETUFPdXRwdXRDb3VudDsKKwl1bnNpZ25lZCBpbnQJRE1BUmVhZEdMSU5UU291cmNlOworCXVuc2lnbmVkIGludAlETUFSZWN0YW5nbGVXcml0ZUFkZHJlc3M7CisJdW5zaWduZWQgaW50CURNQVJlY3RhbmdsZVdyaXRlTGluZVBpdGNoOworCXVuc2lnbmVkIGludAlETUFSZWN0YW5nbGVXcml0ZTsKKwl1bnNpZ25lZCBpbnQJRE1BUmVjdGFuZ2xlUmVhZEFkZHJlc3M7CisJdW5zaWduZWQgaW50CURNQVJlY3RhbmdsZVJlYWRMaW5lUGl0Y2g7CisJdW5zaWduZWQgaW50CURNQVJlY3RhbmdsZVJlYWQ7CisJdW5zaWduZWQgaW50CURNQVJlY3RhbmdsZVJlYWRUYXJnZXQ7Cit9IGRybV9nYW1tYV9jb3B5X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9nYW1tYV9pbml0IHsKKyAgIAllbnVtIHsKKwkgICAJR0FNTUFfSU5JVF9ETUEgICAgPSAweDAxLAorCSAgICAgICAJR0FNTUFfQ0xFQU5VUF9ETUEgPSAweDAyCisJfSBmdW5jOworCisgICAJaW50IHNhcmVhX3ByaXZfb2Zmc2V0OworCWludCBwY2ltb2RlOworCXVuc2lnbmVkIGludCBtbWlvMDsKKwl1bnNpZ25lZCBpbnQgbW1pbzE7CisJdW5zaWduZWQgaW50IG1taW8yOworCXVuc2lnbmVkIGludCBtbWlvMzsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyc19vZmZzZXQ7CisJaW50IG51bV9yYXN0OworfSBkcm1fZ2FtbWFfaW5pdF90OworCisjZW5kaWYgLyogX0dBTU1BX0RSTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlNjRiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJ2LmMKQEAgLTAsMCArMSw1OSBAQAorLyogZ2FtbWEuYyAtLSAzZGxhYnMgR01YIDIwMDAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIEphbiAgNCAwODo1ODozMSAxOTk5IGJ5IGZhaXRoQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJnYW1tYS5oIgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJnYW1tYV9kcm0uaCIKKyNpbmNsdWRlICJnYW1tYV9kcnYuaCIKKworI2luY2x1ZGUgImRybV9hdXRoLmgiCisjaW5jbHVkZSAiZHJtX2FncHN1cHBvcnQuaCIKKyNpbmNsdWRlICJkcm1fYnVmcy5oIgorI2luY2x1ZGUgImdhbW1hX2NvbnRleHQuaCIJLyogTk9URSEgKi8KKyNpbmNsdWRlICJkcm1fZG1hLmgiCisjaW5jbHVkZSAiZ2FtbWFfb2xkX2RtYS5oIgkvKiBOT1RFICovCisjaW5jbHVkZSAiZHJtX2RyYXdhYmxlLmgiCisjaW5jbHVkZSAiZHJtX2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX2ZvcHMuaCIKKyNpbmNsdWRlICJkcm1faW5pdC5oIgorI2luY2x1ZGUgImRybV9pb2N0bC5oIgorI2luY2x1ZGUgImRybV9pcnEuaCIKKyNpbmNsdWRlICJnYW1tYV9saXN0cy5oIiAgICAgICAgLyogTk9URSAqLworI2luY2x1ZGUgImRybV9sb2NrLmgiCisjaW5jbHVkZSAiZ2FtbWFfbG9jay5oIgkJLyogTk9URSAqLworI2luY2x1ZGUgImRybV9tZW1vcnkuaCIKKyNpbmNsdWRlICJkcm1fcHJvYy5oIgorI2luY2x1ZGUgImRybV92bS5oIgorI2luY2x1ZGUgImRybV9zdHViLmgiCisjaW5jbHVkZSAiZHJtX3NjYXR0ZXIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NmZjYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2Rydi5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKiBnYW1tYV9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgM2RsYWJzIEdNWCAyMDAwIGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IE1vbiBKYW4gIDQgMTA6MDU6MDUgMTk5OSBieSBmYWl0aEBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfR0FNTUFfRFJWX0hfCisjZGVmaW5lIF9HQU1NQV9EUlZfSF8KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2dhbW1hX3ByaXZhdGUgeworCWRybV9nYW1tYV9zYXJlYV90ICpzYXJlYV9wcml2OworCWRybV9tYXBfdCAqc2FyZWE7CisJZHJtX21hcF90ICptbWlvMDsKKwlkcm1fbWFwX3QgKm1taW8xOworCWRybV9tYXBfdCAqbW1pbzI7CisJZHJtX21hcF90ICptbWlvMzsKKwlpbnQgbnVtX3Jhc3Q7Cit9IGRybV9nYW1tYV9wcml2YXRlX3Q7CisKKwkJCQkvKiBnYW1tYV9kbWEuYyAqLworZXh0ZXJuIGludCBnYW1tYV9kbWFfaW5pdCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKK2V4dGVybiBpbnQgZ2FtbWFfZG1hX2NvcHkoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CisKK2V4dGVybiBpbnQgZ2FtbWFfZG9fY2xlYW51cF9kbWEoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCBnYW1tYV9kbWFfcmVhZHkoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgZ2FtbWFfZG1hX3F1aWVzY2VudF9zaW5nbGUoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgZ2FtbWFfZG1hX3F1aWVzY2VudF9kdWFsKGRybV9kZXZpY2VfdCAqZGV2KTsKKworCQkJCS8qIGdhbW1hX2RtYS5jICovCitleHRlcm4gaW50ICBnYW1tYV9kbWFfc2NoZWR1bGUoZHJtX2RldmljZV90ICpkZXYsIGludCBsb2NrZWQpOworZXh0ZXJuIGludCAgZ2FtbWFfZG1hKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50ICBnYW1tYV9maW5kX2RldmljZXModm9pZCk7CitleHRlcm4gaW50ICBnYW1tYV9mb3VuZCh2b2lkKTsKKworLyogR2FtbWEtc3BlY2lmaWMgY29kZSBwdWxsZWQgZnJvbSBkcm1fZm9wcy5oOgorICovCitleHRlcm4gaW50CSAgICAgRFJNKGZpbmlzaCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQJICAgICBEUk0oZmx1c2hfdW5ibG9jaykoZHJtX2RldmljZV90ICpkZXYsIGludCBjb250ZXh0LAorCQkJCQlkcm1fbG9ja19mbGFnc190IGZsYWdzKTsKK2V4dGVybiBpbnQJICAgICBEUk0oZmx1c2hfYmxvY2tfYW5kX2ZsdXNoKShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGNvbnRleHQsCisJCQkJCQlkcm1fbG9ja19mbGFnc190IGZsYWdzKTsKKworLyogR2FtbWEtc3BlY2lmaWMgY29kZSBwdWxsZWQgZnJvbSBkcm1fZG1hLmg6CisgKi8KK2V4dGVybiB2b2lkCSAgICAgRFJNKGNsZWFyX25leHRfYnVmZmVyKShkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50CSAgICAgRFJNKHNlbGVjdF9xdWV1ZSkoZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICAgIHZvaWQgKCp3cmFwcGVyKSh1bnNpZ25lZCBsb25nKSk7CitleHRlcm4gaW50CSAgICAgRFJNKGRtYV9lbnF1ZXVlKShzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RtYV90ICpkbWEpOworZXh0ZXJuIGludAkgICAgIERSTShkbWFfZ2V0X2J1ZmZlcnMpKHN0cnVjdCBmaWxlICpmaWxwLCBkcm1fZG1hX3QgKmRtYSk7CisKKworLyogR2FtbWEtc3BlY2lmaWMgY29kZSBwdWxsZWQgZnJvbSBkcm1fbGlzdHMuaCAobm93IHJlbmFtZWQgZ2FtbWFfbGlzdHMuaCk6CisgKi8KK2V4dGVybiBpbnQJICAgICBEUk0od2FpdGxpc3RfY3JlYXRlKShkcm1fd2FpdGxpc3RfdCAqYmwsIGludCBjb3VudCk7CitleHRlcm4gaW50CSAgICAgRFJNKHdhaXRsaXN0X2Rlc3Ryb3kpKGRybV93YWl0bGlzdF90ICpibCk7CitleHRlcm4gaW50CSAgICAgRFJNKHdhaXRsaXN0X3B1dCkoZHJtX3dhaXRsaXN0X3QgKmJsLCBkcm1fYnVmX3QgKmJ1Zik7CitleHRlcm4gZHJtX2J1Zl90ICAgICAqRFJNKHdhaXRsaXN0X2dldCkoZHJtX3dhaXRsaXN0X3QgKmJsKTsKK2V4dGVybiBpbnQJICAgICBEUk0oZnJlZWxpc3RfY3JlYXRlKShkcm1fZnJlZWxpc3RfdCAqYmwsIGludCBjb3VudCk7CitleHRlcm4gaW50CSAgICAgRFJNKGZyZWVsaXN0X2Rlc3Ryb3kpKGRybV9mcmVlbGlzdF90ICpibCk7CitleHRlcm4gaW50CSAgICAgRFJNKGZyZWVsaXN0X3B1dCkoZHJtX2RldmljZV90ICpkZXYsIGRybV9mcmVlbGlzdF90ICpibCwKKwkJCQkgICAgICAgZHJtX2J1Zl90ICpidWYpOworZXh0ZXJuIGRybV9idWZfdCAgICAgKkRSTShmcmVlbGlzdF9nZXQpKGRybV9mcmVlbGlzdF90ICpibCwgaW50IGJsb2NrKTsKKworLyogZXh0ZXJucyBmb3IgZ2FtbWEgY2hhbmdlcyB0byB0aGUgb3BzICovCitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBEUk0oZm9wcyk7CitleHRlcm4gdW5zaWduZWQgaW50IGdhbW1hX2ZvcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KTsKK2V4dGVybiBzc2l6ZV90IGdhbW1hX2ZvcHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZik7CisKKworI2RlZmluZSBHTElOVF9EUklfQlVGX0NPVU5UIDI1NgorCisjZGVmaW5lIEdBTU1BX09GRihyZWcpCQkJCQkJICAgXAorCSgocmVnIDwgMHgxMDAwKQkJCQkJCSAgIFwKKwkgPyByZWcJCQkJCQkJICAgXAorCSA6ICgocmVnIDwgMHgxMDAwMCkJCQkJCSAgIFwKKwkgICAgPyAocmVnIC0gMHgxMDAwKQkJCQkJICAgXAorCSAgICA6ICgocmVnIDwgMHgxMTAwMCkJCQkJCSAgIFwKKwkgICAgICAgPyAocmVnIC0gMHgxMDAwMCkJCQkJICAgXAorCSAgICAgICA6IChyZWcgLSAweDExMDAwKSkpKQorCisjZGVmaW5lIEdBTU1BX0JBU0UocmVnKQkgKCh1bnNpZ25lZCBsb25nKQkJCQkgICAgIFwKKwkJCSAgKChyZWcgPCAweDEwMDApICAgID8gZGV2X3ByaXYtPm1taW8wLT5oYW5kbGUgOiAgICAgXAorCQkJICAgKChyZWcgPCAweDEwMDAwKSAgPyBkZXZfcHJpdi0+bW1pbzEtPmhhbmRsZSA6ICAgICBcCisJCQkgICAgKChyZWcgPCAweDExMDAwKSA/IGRldl9wcml2LT5tbWlvMi0+aGFuZGxlIDogICAgIFwKKwkJCQkJICAgICAgIGRldl9wcml2LT5tbWlvMy0+aGFuZGxlKSkpKQorI2RlZmluZSBHQU1NQV9BRERSKHJlZykJIChHQU1NQV9CQVNFKHJlZykgKyBHQU1NQV9PRkYocmVnKSkKKyNkZWZpbmUgR0FNTUFfREVSRUYocmVnKSAqKF9fdm9sYXRpbGVfXyBpbnQgKilHQU1NQV9BRERSKHJlZykKKyNkZWZpbmUgR0FNTUFfUkVBRChyZWcpCSBHQU1NQV9ERVJFRihyZWcpCisjZGVmaW5lIEdBTU1BX1dSSVRFKHJlZyx2YWwpIGRvIHsgR0FNTUFfREVSRUYocmVnKSA9IHZhbDsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBHQU1NQV9CUk9BRENBU1RNQVNLICAgIDB4OTM3OAorI2RlZmluZSBHQU1NQV9DT01NQU5ESU5URU5BQkxFIDB4MGM0OAorI2RlZmluZSBHQU1NQV9ETUFBRERSRVNTICAgICAgIDB4MDAyOAorI2RlZmluZSBHQU1NQV9ETUFDT1VOVAkgICAgICAgMHgwMDMwCisjZGVmaW5lIEdBTU1BX0ZJTFRFUk1PREUgICAgICAgMHg4YzAwCisjZGVmaW5lIEdBTU1BX0dDT01NQU5ESU5URkxBR1MgMHgwYzUwCisjZGVmaW5lIEdBTU1BX0dDT01NQU5ETU9ERSAgICAgMHgwYzQwCisjZGVmaW5lCQlHQU1NQV9RVUVVRURfRE1BX01PREUJCTE8PDEKKyNkZWZpbmUgR0FNTUFfR0NPTU1BTkRTVEFUVVMgICAweDBjNjAKKyNkZWZpbmUgR0FNTUFfR0RFTEFZVElNRVIgICAgICAweDBjMzgKKyNkZWZpbmUgR0FNTUFfR0RNQUNPTlRST0wgICAgICAweDAwNjAKKyNkZWZpbmUgCUdBTU1BX1VTRV9BR1AJCQkxPDwxCisjZGVmaW5lIEdBTU1BX0dJTlRFTkFCTEUgICAgICAgMHgwODA4CisjZGVmaW5lIEdBTU1BX0dJTlRGTEFHUwkgICAgICAgMHgwODEwCisjZGVmaW5lIEdBTU1BX0lORklGT1NQQUNFICAgICAgMHgwMDE4CisjZGVmaW5lIEdBTU1BX09VVEZJRk9XT1JEUyAgICAgMHgwMDIwCisjZGVmaW5lIEdBTU1BX09VVFBVVEZJRk8gICAgICAgMHgyMDAwCisjZGVmaW5lIEdBTU1BX1NZTkMJICAgICAgIDB4OGM0MAorI2RlZmluZSBHQU1NQV9TWU5DX1RBRwkgICAgICAgMHgwMTg4CisjZGVmaW5lIEdBTU1BX1BBR0VUQUJMRUFERFIgICAgMHgwQzAwCisjZGVmaW5lIEdBTU1BX1BBR0VUQUJMRUxFTkdUSCAgMHgwQzA4CisKKyNkZWZpbmUgR0FNTUFfUEFTU1RIUk9VR0gJMHgxRkUKKyNkZWZpbmUgR0FNTUFfRE1BQUREUlRBRwkweDUzMAorI2RlZmluZSBHQU1NQV9ETUFDT1VOVFRBRwkweDUzMQorI2RlZmluZSBHQU1NQV9DT01NQU5ESU5UVEFHCTB4NTMyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9saXN0cy5oIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9saXN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTNmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2xpc3RzLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qIGRybV9saXN0cy5oIC0tIEJ1ZmZlciBsaXN0IGhhbmRsaW5nIHJvdXRpbmVzIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIEFwciAxOSAyMDo1NDoyMiAxOTk5IGJ5IGZhaXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKworCitpbnQgRFJNKHdhaXRsaXN0X2NyZWF0ZSkoZHJtX3dhaXRsaXN0X3QgKmJsLCBpbnQgY291bnQpCit7CisJaWYgKGJsLT5jb3VudCkgcmV0dXJuIC1FSU5WQUw7CisKKwlibC0+YnVmcyAgICAgICA9IERSTShhbGxvYykoKGJsLT5jb3VudCArIDIpICogc2l6ZW9mKCpibC0+YnVmcyksCisJCQkJICAgIERSTV9NRU1fQlVGTElTVFMpOworCisJaWYoIWJsLT5idWZzKSByZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoYmwtPmJ1ZnMsIDAsIHNpemVvZigqYmwtPmJ1ZnMpKTsKKwlibC0+Y291bnQgICAgICA9IGNvdW50OworCWJsLT5ycAkgICAgICAgPSBibC0+YnVmczsKKwlibC0+d3AJICAgICAgID0gYmwtPmJ1ZnM7CisJYmwtPmVuZAkgICAgICAgPSAmYmwtPmJ1ZnNbYmwtPmNvdW50KzFdOworCXNwaW5fbG9ja19pbml0KCZibC0+d3JpdGVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmJsLT5yZWFkX2xvY2spOworCXJldHVybiAwOworfQorCitpbnQgRFJNKHdhaXRsaXN0X2Rlc3Ryb3kpKGRybV93YWl0bGlzdF90ICpibCkKK3sKKwlpZiAoYmwtPnJwICE9IGJsLT53cCkgcmV0dXJuIC1FSU5WQUw7CisJaWYgKGJsLT5idWZzKSBEUk0oZnJlZSkoYmwtPmJ1ZnMsCisJCQkJKGJsLT5jb3VudCArIDIpICogc2l6ZW9mKCpibC0+YnVmcyksCisJCQkJRFJNX01FTV9CVUZMSVNUUyk7CisJYmwtPmNvdW50ID0gMDsKKwlibC0+YnVmcyAgPSBOVUxMOworCWJsLT5ycAkgID0gTlVMTDsKKwlibC0+d3AJICA9IE5VTEw7CisJYmwtPmVuZAkgID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworaW50IERSTSh3YWl0bGlzdF9wdXQpKGRybV93YWl0bGlzdF90ICpibCwgZHJtX2J1Zl90ICpidWYpCit7CisJaW50CSAgICAgIGxlZnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxlZnQgPSBEUk1fTEVGVENPVU5UKGJsKTsKKwlpZiAoIWxlZnQpIHsKKwkJRFJNX0VSUk9SKCJPdmVyZmxvdyB3aGlsZSBhZGRpbmcgYnVmZmVyICVkIGZyb20gZmlscCAlcFxuIiwKKwkJCSAgYnVmLT5pZHgsIGJ1Zi0+ZmlscCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlidWYtPmxpc3QJID0gRFJNX0xJU1RfV0FJVDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibC0+d3JpdGVfbG9jaywgZmxhZ3MpOworCSpibC0+d3AgPSBidWY7CisJaWYgKCsrYmwtPndwID49IGJsLT5lbmQpIGJsLT53cCA9IGJsLT5idWZzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsLT53cml0ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworZHJtX2J1Zl90ICpEUk0od2FpdGxpc3RfZ2V0KShkcm1fd2FpdGxpc3RfdCAqYmwpCit7CisJZHJtX2J1Zl90ICAgICAqYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmwtPnJlYWRfbG9jaywgZmxhZ3MpOworCWJ1ZiA9ICpibC0+cnA7CisJaWYgKGJsLT5ycCA9PSBibC0+d3ApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmwtPnJlYWRfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCsrYmwtPnJwID49IGJsLT5lbmQpIGJsLT5ycCA9IGJsLT5idWZzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsLT5yZWFkX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBidWY7Cit9CisKK2ludCBEUk0oZnJlZWxpc3RfY3JlYXRlKShkcm1fZnJlZWxpc3RfdCAqYmwsIGludCBjb3VudCkKK3sKKwlhdG9taWNfc2V0KCZibC0+Y291bnQsIDApOworCWJsLT5uZXh0ICAgICAgPSBOVUxMOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJsLT53YWl0aW5nKTsKKwlibC0+bG93X21hcmsgID0gMDsKKwlibC0+aGlnaF9tYXJrID0gMDsKKwlhdG9taWNfc2V0KCZibC0+d2ZoLCAgIDApOworCXNwaW5fbG9ja19pbml0KCZibC0+bG9jayk7CisJKytibC0+aW5pdGlhbGl6ZWQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0oZnJlZWxpc3RfZGVzdHJveSkoZHJtX2ZyZWVsaXN0X3QgKmJsKQoreworCWF0b21pY19zZXQoJmJsLT5jb3VudCwgMCk7CisJYmwtPm5leHQgPSBOVUxMOworCXJldHVybiAwOworfQorCitpbnQgRFJNKGZyZWVsaXN0X3B1dCkoZHJtX2RldmljZV90ICpkZXYsIGRybV9mcmVlbGlzdF90ICpibCwgZHJtX2J1Zl90ICpidWYpCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hICA9IGRldi0+ZG1hOworCisJaWYgKCFkbWEpIHsKKwkJRFJNX0VSUk9SKCJObyBETUEgc3VwcG9ydFxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChidWYtPndhaXRpbmcgfHwgYnVmLT5wZW5kaW5nIHx8IGJ1Zi0+bGlzdCA9PSBEUk1fTElTVF9GUkVFKSB7CisJCURSTV9FUlJPUigiRnJlZWQgYnVmZmVyICVkOiB3JWQsIHAlZCwgbCVkXG4iLAorCQkJICBidWYtPmlkeCwgYnVmLT53YWl0aW5nLCBidWYtPnBlbmRpbmcsIGJ1Zi0+bGlzdCk7CisJfQorCWlmICghYmwpIHJldHVybiAxOworCWJ1Zi0+bGlzdAk9IERSTV9MSVNUX0ZSRUU7CisKKwlzcGluX2xvY2soJmJsLT5sb2NrKTsKKwlidWYtPm5leHQJPSBibC0+bmV4dDsKKwlibC0+bmV4dAk9IGJ1ZjsKKwlzcGluX3VubG9jaygmYmwtPmxvY2spOworCisJYXRvbWljX2luYygmYmwtPmNvdW50KTsKKwlpZiAoYXRvbWljX3JlYWQoJmJsLT5jb3VudCkgPiBkbWEtPmJ1Zl9jb3VudCkgeworCQlEUk1fRVJST1IoIiVkIG9mICVkIGJ1ZmZlcnMgZnJlZSBhZnRlciBhZGRpdGlvbiBvZiAlZFxuIiwKKwkJCSAgYXRvbWljX3JlYWQoJmJsLT5jb3VudCksIGRtYS0+YnVmX2NvdW50LCBidWYtPmlkeCk7CisJCXJldHVybiAxOworCX0KKwkJCQkvKiBDaGVjayBmb3IgaGlnaCB3YXRlciBtYXJrICovCisJaWYgKGF0b21pY19yZWFkKCZibC0+d2ZoKSAmJiBhdG9taWNfcmVhZCgmYmwtPmNvdW50KT49YmwtPmhpZ2hfbWFyaykgeworCQlhdG9taWNfc2V0KCZibC0+d2ZoLCAwKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZibC0+d2FpdGluZyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgZHJtX2J1Zl90ICpEUk0oZnJlZWxpc3RfdHJ5KShkcm1fZnJlZWxpc3RfdCAqYmwpCit7CisJZHJtX2J1Zl90CSAgKmJ1ZjsKKworCWlmICghYmwpIHJldHVybiBOVUxMOworCisJCQkJLyogR2V0IGJ1ZmZlciAqLworCXNwaW5fbG9jaygmYmwtPmxvY2spOworCWlmICghYmwtPm5leHQpIHsKKwkJc3Bpbl91bmxvY2soJmJsLT5sb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWJ1ZgkgID0gYmwtPm5leHQ7CisJYmwtPm5leHQgID0gYmwtPm5leHQtPm5leHQ7CisJc3Bpbl91bmxvY2soJmJsLT5sb2NrKTsKKworCWF0b21pY19kZWMoJmJsLT5jb3VudCk7CisJYnVmLT5uZXh0ID0gTlVMTDsKKwlidWYtPmxpc3QgPSBEUk1fTElTVF9OT05FOworCWlmIChidWYtPndhaXRpbmcgfHwgYnVmLT5wZW5kaW5nKSB7CisJCURSTV9FUlJPUigiRnJlZSBidWZmZXIgJWQ6IHclZCwgcCVkLCBsJWRcbiIsCisJCQkgIGJ1Zi0+aWR4LCBidWYtPndhaXRpbmcsIGJ1Zi0+cGVuZGluZywgYnVmLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCitkcm1fYnVmX3QgKkRSTShmcmVlbGlzdF9nZXQpKGRybV9mcmVlbGlzdF90ICpibCwgaW50IGJsb2NrKQoreworCWRybV9idWZfdAkgICpidWYJPSBOVUxMOworCURFQ0xBUkVfV0FJVFFVRVVFKGVudHJ5LCBjdXJyZW50KTsKKworCWlmICghYmwgfHwgIWJsLT5pbml0aWFsaXplZCkgcmV0dXJuIE5VTEw7CisKKwkJCQkvKiBDaGVjayBmb3IgbG93IHdhdGVyIG1hcmsgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmJsLT5jb3VudCkgPD0gYmwtPmxvd19tYXJrKSAvKiBCZWNhbWUgbG93ICovCisJCWF0b21pY19zZXQoJmJsLT53ZmgsIDEpOworCWlmIChhdG9taWNfcmVhZCgmYmwtPndmaCkpIHsKKwkJaWYgKGJsb2NrKSB7CisJCQlhZGRfd2FpdF9xdWV1ZSgmYmwtPndhaXRpbmcsICZlbnRyeSk7CisJCQlmb3IgKDs7KSB7CisJCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQkJaWYgKCFhdG9taWNfcmVhZCgmYmwtPndmaCkKKwkJCQkgICAgJiYgKGJ1ZiA9IERSTShmcmVlbGlzdF90cnkpKGJsKSkpIGJyZWFrOworCQkJCXNjaGVkdWxlKCk7CisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSBicmVhazsKKwkJCX0KKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmJsLT53YWl0aW5nLCAmZW50cnkpOworCQl9CisJCXJldHVybiBidWY7CisJfQorCisJcmV0dXJuIERSTShmcmVlbGlzdF90cnkpKGJsKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9sb2NrLmggYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGVjNjdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9sb2NrLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qIGxvY2suYyAtLSBJT0NUTHMgZm9yIGxvY2tpbmcgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBUdWUgRmViICAyIDA4OjM3OjU0IDE5OTkgYnkgZmFpdGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisKKy8qIEdhbW1hLXNwZWNpZmljIGNvZGUgZXh0cmFjdGVkIGZyb20gZHJtX2xvY2suaDoKKyAqLworc3RhdGljIGludCBEUk0oZmx1c2hfcXVldWUpKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgY29udGV4dCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRShlbnRyeSwgY3VycmVudCk7CisJaW50CQkgIHJldAk9IDA7CisJZHJtX3F1ZXVlX3QJICAqcQk9IGRldi0+cXVldWVsaXN0W2NvbnRleHRdOworCisJRFJNX0RFQlVHKCJcbiIpOworCisJYXRvbWljX2luYygmcS0+dXNlX2NvdW50KTsKKwlpZiAoYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCkgPiAxKSB7CisJCWF0b21pY19pbmMoJnEtPmJsb2NrX3dyaXRlKTsKKwkJYWRkX3dhaXRfcXVldWUoJnEtPmZsdXNoX3F1ZXVlLCAmZW50cnkpOworCQlhdG9taWNfaW5jKCZxLT5ibG9ja19jb3VudCk7CisJCWZvciAoOzspIHsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQkJaWYgKCFEUk1fQlVGQ09VTlQoJnEtPndhaXRsaXN0KSkgYnJlYWs7CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0ID0gLUVJTlRSOyAvKiBDYW4ndCByZXN0YXJ0ICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYXRvbWljX2RlYygmcS0+YmxvY2tfY291bnQpOworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnEtPmZsdXNoX3F1ZXVlLCAmZW50cnkpOworCX0KKwlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCisJCQkJLyogTk9URTogYmxvY2tfd3JpdGUgaXMgc3RpbGwgaW5jcmVtZW50ZWQhCisJCQkJICAgVXNlIGRybV9mbHVzaF91bmxvY2tfcXVldWUgdG8gZGVjcmVtZW50LiAqLworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgRFJNKGZsdXNoX3VuYmxvY2tfcXVldWUpKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgY29udGV4dCkKK3sKKwlkcm1fcXVldWVfdAkgICpxCT0gZGV2LT5xdWV1ZWxpc3RbY29udGV4dF07CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlhdG9taWNfaW5jKCZxLT51c2VfY291bnQpOworCWlmIChhdG9taWNfcmVhZCgmcS0+dXNlX2NvdW50KSA+IDEpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZxLT5ibG9ja193cml0ZSkpIHsKKwkJCWF0b21pY19kZWMoJnEtPmJsb2NrX3dyaXRlKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcS0+d3JpdGVfcXVldWUpOworCQl9CisJfQorCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0oZmx1c2hfYmxvY2tfYW5kX2ZsdXNoKShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGNvbnRleHQsCisJCQkgICAgICAgZHJtX2xvY2tfZmxhZ3NfdCBmbGFncykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWlmIChmbGFncyAmIF9EUk1fTE9DS19GTFVTSCkgeworCQlyZXQgPSBEUk0oZmx1c2hfcXVldWUpKGRldiwgRFJNX0tFUk5FTF9DT05URVhUKTsKKwkJaWYgKCFyZXQpIHJldCA9IERSTShmbHVzaF9xdWV1ZSkoZGV2LCBjb250ZXh0KTsKKwl9CisJaWYgKGZsYWdzICYgX0RSTV9MT0NLX0ZMVVNIX0FMTCkgeworCQlmb3IgKGkgPSAwOyAhcmV0ICYmIGkgPCBkZXYtPnF1ZXVlX2NvdW50OyBpKyspIHsKKwkJCXJldCA9IERSTShmbHVzaF9xdWV1ZSkoZGV2LCBpKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgRFJNKGZsdXNoX3VuYmxvY2spKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgY29udGV4dCwgZHJtX2xvY2tfZmxhZ3NfdCBmbGFncykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWlmIChmbGFncyAmIF9EUk1fTE9DS19GTFVTSCkgeworCQlyZXQgPSBEUk0oZmx1c2hfdW5ibG9ja19xdWV1ZSkoZGV2LCBEUk1fS0VSTkVMX0NPTlRFWFQpOworCQlpZiAoIXJldCkgcmV0ID0gRFJNKGZsdXNoX3VuYmxvY2tfcXVldWUpKGRldiwgY29udGV4dCk7CisJfQorCWlmIChmbGFncyAmIF9EUk1fTE9DS19GTFVTSF9BTEwpIHsKKwkJZm9yIChpID0gMDsgIXJldCAmJiBpIDwgZGV2LT5xdWV1ZV9jb3VudDsgaSsrKSB7CisJCQlyZXQgPSBEUk0oZmx1c2hfdW5ibG9ja19xdWV1ZSkoZGV2LCBpKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBEUk0oZmluaXNoKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgKmRldgkgID0gcHJpdi0+ZGV2OworCWludAkJICByZXQJICA9IDA7CisJZHJtX2xvY2tfdAkgIGxvY2s7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmxvY2ssIChkcm1fbG9ja190IF9fdXNlciAqKWFyZywgc2l6ZW9mKGxvY2spKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gRFJNKGZsdXNoX2Jsb2NrX2FuZF9mbHVzaCkoZGV2LCBsb2NrLmNvbnRleHQsIGxvY2suZmxhZ3MpOworCURSTShmbHVzaF91bmJsb2NrKShkZXYsIGxvY2suY29udGV4dCwgbG9jay5mbGFncyk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfb2xkX2RtYS5oIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9vbGRfZG1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkZDQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfb2xkX2RtYS5oCkBAIC0wLDAgKzEsMzEzIEBACisvKiBkcm1fZG1hLmMgLS0gRE1BIElPQ1RMIGFuZCBmdW5jdGlvbiBzdXBwb3J0IC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogRnJpIE1hciAxOSAxNDozMDoxNiAxOTk5IGJ5IGZhaXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworCisvKiBHYW1tYS1zcGVjaWZpYyBjb2RlIHB1bGxlZCBmcm9tIGRybV9kbWEuaDoKKyAqLworCit2b2lkIERSTShjbGVhcl9uZXh0X2J1ZmZlcikoZHJtX2RldmljZV90ICpkZXYpCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisKKwlkbWEtPm5leHRfYnVmZmVyID0gTlVMTDsKKwlpZiAoZG1hLT5uZXh0X3F1ZXVlICYmICFEUk1fQlVGQ09VTlQoJmRtYS0+bmV4dF9xdWV1ZS0+d2FpdGxpc3QpKSB7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZG1hLT5uZXh0X3F1ZXVlLT5mbHVzaF9xdWV1ZSk7CisJfQorCWRtYS0+bmV4dF9xdWV1ZQkgPSBOVUxMOworfQorCitpbnQgRFJNKHNlbGVjdF9xdWV1ZSkoZHJtX2RldmljZV90ICpkZXYsIHZvaWQgKCp3cmFwcGVyKSh1bnNpZ25lZCBsb25nKSkKK3sKKwlpbnQJICAgaTsKKwlpbnQJICAgY2FuZGlkYXRlID0gLTE7CisJaW50CSAgIGoJICAgICA9IGppZmZpZXM7CisKKwlpZiAoIWRldikgeworCQlEUk1fRVJST1IoIk5vIGRldmljZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCFkZXYtPnF1ZXVlbGlzdCB8fCAhZGV2LT5xdWV1ZWxpc3RbRFJNX0tFUk5FTF9DT05URVhUXSkgeworCQkJCS8qIFRoaXMgb25seSBoYXBwZW5zIGJldHdlZW4gdGhlIHRpbWUgdGhlCisJCQkJICAgaW50ZXJydXB0IGlzIGluaXRpYWxpemVkIGFuZCB0aGUgdGltZQorCQkJCSAgIHRoZSBxdWV1ZXMgYXJlIGluaXRpYWxpemVkLiAqLworCQlyZXR1cm4gLTE7CisJfQorCisJCQkJLyogRG9pbmcgIndoaWxlIGxvY2tlZCIgRE1BPyAqLworCWlmIChEUk1fV0FJVENPVU5UKGRldiwgRFJNX0tFUk5FTF9DT05URVhUKSkgeworCQlyZXR1cm4gRFJNX0tFUk5FTF9DT05URVhUOworCX0KKworCQkJCS8qIElmIHRoZXJlIGFyZSBidWZmZXJzIG9uIHRoZSBsYXN0X2NvbnRleHQKKwkJCQkgICBxdWV1ZSwgYW5kIHdlIGhhdmUgbm90IGJlZW4gZXhlY3V0aW5nCisJCQkJICAgdGhpcyBjb250ZXh0IHZlcnkgbG9uZywgY29udGludWUgdG8KKwkJCQkgICBleGVjdXRlIHRoaXMgY29udGV4dC4gKi8KKwlpZiAoZGV2LT5sYXN0X3N3aXRjaCA8PSBqCisJICAgICYmIGRldi0+bGFzdF9zd2l0Y2ggKyBEUk1fVElNRV9TTElDRSA+IGoKKwkgICAgJiYgRFJNX1dBSVRDT1VOVChkZXYsIGRldi0+bGFzdF9jb250ZXh0KSkgeworCQlyZXR1cm4gZGV2LT5sYXN0X2NvbnRleHQ7CisJfQorCisJCQkJLyogT3RoZXJ3aXNlLCBmaW5kIGEgY2FuZGlkYXRlICovCisJZm9yIChpID0gZGV2LT5sYXN0X2NoZWNrZWQgKyAxOyBpIDwgZGV2LT5xdWV1ZV9jb3VudDsgaSsrKSB7CisJCWlmIChEUk1fV0FJVENPVU5UKGRldiwgaSkpIHsKKwkJCWNhbmRpZGF0ZSA9IGRldi0+bGFzdF9jaGVja2VkID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGNhbmRpZGF0ZSA8IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+cXVldWVfY291bnQ7IGkrKykgeworCQkJaWYgKERSTV9XQUlUQ09VTlQoZGV2LCBpKSkgeworCQkJCWNhbmRpZGF0ZSA9IGRldi0+bGFzdF9jaGVja2VkID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICh3cmFwcGVyCisJICAgICYmIGNhbmRpZGF0ZSA+PSAwCisJICAgICYmIGNhbmRpZGF0ZSAhPSBkZXYtPmxhc3RfY29udGV4dAorCSAgICAmJiBkZXYtPmxhc3Rfc3dpdGNoIDw9IGoKKwkgICAgJiYgZGV2LT5sYXN0X3N3aXRjaCArIERSTV9USU1FX1NMSUNFID4gaikgeworCQlpZiAoZGV2LT50aW1lci5leHBpcmVzICE9IGRldi0+bGFzdF9zd2l0Y2ggKyBEUk1fVElNRV9TTElDRSkgeworCQkJZGVsX3RpbWVyKCZkZXYtPnRpbWVyKTsKKwkJCWRldi0+dGltZXIuZnVuY3Rpb24gPSB3cmFwcGVyOworCQkJZGV2LT50aW1lci5kYXRhCSAgICA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwkJCWRldi0+dGltZXIuZXhwaXJlcyAgPSBkZXYtPmxhc3Rfc3dpdGNoK0RSTV9USU1FX1NMSUNFOworCQkJYWRkX3RpbWVyKCZkZXYtPnRpbWVyKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGNhbmRpZGF0ZTsKK30KKworCitpbnQgRFJNKGRtYV9lbnF1ZXVlKShzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RtYV90ICpkKQoreworCWRybV9maWxlX3QgICAgKnByaXYgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgICpkZXYgICAgPSBwcml2LT5kZXY7CisJaW50CQkgIGk7CisJZHJtX3F1ZXVlX3QJICAqcTsKKwlkcm1fYnVmX3QJICAqYnVmOworCWludAkJICBpZHg7CisJaW50CQkgIHdoaWxlX2xvY2tlZCA9IDA7CisJZHJtX2RldmljZV9kbWFfdCAgKmRtYSA9IGRldi0+ZG1hOworCWludAkJICAqaW5kOworCWludAkJICBlcnI7CisJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOworCisJRFJNX0RFQlVHKCIlZFxuIiwgZC0+c2VuZF9jb3VudCk7CisKKwlpZiAoZC0+ZmxhZ3MgJiBfRFJNX0RNQV9XSElMRV9MT0NLRUQpIHsKKwkJaW50IGNvbnRleHQgPSBkZXYtPmxvY2suaHdfbG9jay0+bG9jazsKKworCQlpZiAoIV9EUk1fTE9DS19JU19IRUxEKGNvbnRleHQpKSB7CisJCQlEUk1fRVJST1IoIk5vIGxvY2sgaGVsZCBkdXJpbmcgXCJ3aGlsZSBsb2NrZWRcIiIKKwkJCQkgICIgcmVxdWVzdFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoZC0+Y29udGV4dCAhPSBfRFJNX0xPQ0tJTkdfQ09OVEVYVChjb250ZXh0KQorCQkgICAgJiYgX0RSTV9MT0NLSU5HX0NPTlRFWFQoY29udGV4dCkgIT0gRFJNX0tFUk5FTF9DT05URVhUKSB7CisJCQlEUk1fRVJST1IoIkxvY2sgaGVsZCBieSAlZCB3aGlsZSAlZCBtYWtlcyIKKwkJCQkgICIgXCJ3aGlsZSBsb2NrZWRcIiByZXF1ZXN0XG4iLAorCQkJCSAgX0RSTV9MT0NLSU5HX0NPTlRFWFQoY29udGV4dCksCisJCQkJICBkLT5jb250ZXh0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXEgPSBkZXYtPnF1ZXVlbGlzdFtEUk1fS0VSTkVMX0NPTlRFWFRdOworCQl3aGlsZV9sb2NrZWQgPSAxOworCX0gZWxzZSB7CisJCXEgPSBkZXYtPnF1ZXVlbGlzdFtkLT5jb250ZXh0XTsKKwl9CisKKworCWF0b21pY19pbmMoJnEtPnVzZV9jb3VudCk7CisJaWYgKGF0b21pY19yZWFkKCZxLT5ibG9ja193cml0ZSkpIHsKKwkJYWRkX3dhaXRfcXVldWUoJnEtPndyaXRlX3F1ZXVlLCAmZW50cnkpOworCQlhdG9taWNfaW5jKCZxLT5ibG9ja19jb3VudCk7CisJCWZvciAoOzspIHsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQkJaWYgKCFhdG9taWNfcmVhZCgmcS0+YmxvY2tfd3JpdGUpKSBicmVhazsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZxLT53cml0ZV9xdWV1ZSwgJmVudHJ5KTsKKwkJCQlyZXR1cm4gLUVJTlRSOworCQkJfQorCQl9CisJCWF0b21pY19kZWMoJnEtPmJsb2NrX2NvdW50KTsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZxLT53cml0ZV9xdWV1ZSwgJmVudHJ5KTsKKwl9CisKKwlpbmQgPSBEUk0oYWxsb2MpKGQtPnNlbmRfY291bnQgKiBzaXplb2YoaW50KSwgRFJNX01FTV9EUklWRVIpOworCWlmICghaW5kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihpbmQsIGQtPnNlbmRfaW5kaWNlcywgZC0+c2VuZF9jb3VudCAqIHNpemVvZihpbnQpKSkgeworCQllcnIgPSAtRUZBVUxUOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCX0KKworCWVyciA9IC1FSU5WQUw7CisJZm9yIChpID0gMDsgaSA8IGQtPnNlbmRfY291bnQ7IGkrKykgeworCQlpZHggPSBpbmRbaV07CisJCWlmIChpZHggPCAwIHx8IGlkeCA+PSBkbWEtPmJ1Zl9jb3VudCkgeworCQkJRFJNX0VSUk9SKCJJbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCQkgIGluZFtpXSwgZG1hLT5idWZfY291bnQgLSAxKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFsgaWR4IF07CisJCWlmIChidWYtPmZpbHAgIT0gZmlscCkgeworCQkJRFJNX0VSUk9SKCJQcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBub3Qgb3duZWRcbiIsCisJCQkJICBjdXJyZW50LT5waWQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGJ1Zi0+bGlzdCAhPSBEUk1fTElTVF9OT05FKSB7CisJCQlEUk1fRVJST1IoIlByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyICVkIG9uIGxpc3QgJWRcbiIsCisJCQkJICBjdXJyZW50LT5waWQsIGJ1Zi0+aWR4LCBidWYtPmxpc3QpOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnVmLT51c2VkCSAgPSBpbmRbaV07CisJCWJ1Zi0+d2hpbGVfbG9ja2VkID0gd2hpbGVfbG9ja2VkOworCQlidWYtPmNvbnRleHQJICA9IGQtPmNvbnRleHQ7CisJCWlmICghYnVmLT51c2VkKSB7CisJCQlEUk1fRVJST1IoIlF1ZXVlaW5nIDAgbGVuZ3RoIGJ1ZmZlclxuIik7CisJCX0KKwkJaWYgKGJ1Zi0+cGVuZGluZykgeworCQkJRFJNX0VSUk9SKCJRdWV1ZWluZyBwZW5kaW5nIGJ1ZmZlcjoiCisJCQkJICAiIGJ1ZmZlciAlZCwgb2Zmc2V0ICVkXG4iLAorCQkJCSAgaW5kW2ldLCBpKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChidWYtPndhaXRpbmcpIHsKKwkJCURSTV9FUlJPUigiUXVldWVpbmcgd2FpdGluZyBidWZmZXI6IgorCQkJCSAgIiBidWZmZXIgJWQsIG9mZnNldCAlZFxuIiwKKwkJCQkgIGluZFtpXSwgaSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlidWYtPndhaXRpbmcgPSAxOworCQlpZiAoYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCkgPT0gMQorCQkgICAgfHwgYXRvbWljX3JlYWQoJnEtPmZpbmFsaXphdGlvbikpIHsKKwkJCURSTShmcmVlX2J1ZmZlcikoZGV2LCBidWYpOworCQl9IGVsc2UgeworCQkJRFJNKHdhaXRsaXN0X3B1dCkoJnEtPndhaXRsaXN0LCBidWYpOworCQkJYXRvbWljX2luYygmcS0+dG90YWxfcXVldWVkKTsKKwkJfQorCX0KKwlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCisJcmV0dXJuIDA7CisKK291dDoKKwlEUk0oZnJlZSkoaW5kLCBkLT5zZW5kX2NvdW50ICogc2l6ZW9mKGludCksIERSTV9NRU1fRFJJVkVSKTsKKwlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgRFJNKGRtYV9nZXRfYnVmZmVyc19vZl9vcmRlcikoc3RydWN0IGZpbGUgKmZpbHAsIGRybV9kbWFfdCAqZCwKKwkJCQkJIGludCBvcmRlcikKK3sKKwlkcm1fZmlsZV90ICAgICpwcml2ICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICAqZGV2ICAgID0gcHJpdi0+ZGV2OworCWludAkJICBpOworCWRybV9idWZfdAkgICpidWY7CisJZHJtX2RldmljZV9kbWFfdCAgKmRtYSA9IGRldi0+ZG1hOworCisJZm9yIChpID0gZC0+Z3JhbnRlZF9jb3VudDsgaSA8IGQtPnJlcXVlc3RfY291bnQ7IGkrKykgeworCQlidWYgPSBEUk0oZnJlZWxpc3RfZ2V0KSgmZG1hLT5idWZzW29yZGVyXS5mcmVlbGlzdCwKKwkJCQkJZC0+ZmxhZ3MgJiBfRFJNX0RNQV9XQUlUKTsKKwkJaWYgKCFidWYpIGJyZWFrOworCQlpZiAoYnVmLT5wZW5kaW5nIHx8IGJ1Zi0+d2FpdGluZykgeworCQkJRFJNX0VSUk9SKCJGcmVlIGJ1ZmZlciAlZCBpbiB1c2U6IGZpbHAgJXAgKHclZCwgcCVkKVxuIiwKKwkJCQkgIGJ1Zi0+aWR4LAorCQkJCSAgYnVmLT5maWxwLAorCQkJCSAgYnVmLT53YWl0aW5nLAorCQkJCSAgYnVmLT5wZW5kaW5nKTsKKwkJfQorCQlidWYtPmZpbHAgICAgID0gZmlscDsKKwkJaWYgKGNvcHlfdG9fdXNlcigmZC0+cmVxdWVzdF9pbmRpY2VzW2ldLAorCQkJCSAmYnVmLT5pZHgsCisJCQkJIHNpemVvZihidWYtPmlkeCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigmZC0+cmVxdWVzdF9zaXplc1tpXSwKKwkJCQkgJmJ1Zi0+dG90YWwsCisJCQkJIHNpemVvZihidWYtPnRvdGFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkrK2QtPmdyYW50ZWRfY291bnQ7CisJfQorCXJldHVybiAwOworfQorCisKK2ludCBEUk0oZG1hX2dldF9idWZmZXJzKShzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RtYV90ICpkbWEpCit7CisJaW50CQkgIG9yZGVyOworCWludAkJICByZXRjb2RlID0gMDsKKwlpbnQJCSAgdG1wX29yZGVyOworCisJb3JkZXIgPSBEUk0ob3JkZXIpKGRtYS0+cmVxdWVzdF9zaXplKTsKKworCWRtYS0+Z3JhbnRlZF9jb3VudCA9IDA7CisJcmV0Y29kZQkJICAgPSBEUk0oZG1hX2dldF9idWZmZXJzX29mX29yZGVyKShmaWxwLCBkbWEsIG9yZGVyKTsKKworCWlmIChkbWEtPmdyYW50ZWRfY291bnQgPCBkbWEtPnJlcXVlc3RfY291bnQKKwkgICAgJiYgKGRtYS0+ZmxhZ3MgJiBfRFJNX0RNQV9TTUFMTEVSX09LKSkgeworCQlmb3IgKHRtcF9vcmRlciA9IG9yZGVyIC0gMTsKKwkJICAgICAhcmV0Y29kZQorCQkJICAgICAmJiBkbWEtPmdyYW50ZWRfY291bnQgPCBkbWEtPnJlcXVlc3RfY291bnQKKwkJCSAgICAgJiYgdG1wX29yZGVyID49IERSTV9NSU5fT1JERVI7CisJCSAgICAgLS10bXBfb3JkZXIpIHsKKworCQkJcmV0Y29kZSA9IERSTShkbWFfZ2V0X2J1ZmZlcnNfb2Zfb3JkZXIpKGZpbHAsIGRtYSwKKwkJCQkJCQkJdG1wX29yZGVyKTsKKwkJfQorCX0KKworCWlmIChkbWEtPmdyYW50ZWRfY291bnQgPCBkbWEtPnJlcXVlc3RfY291bnQKKwkgICAgJiYgKGRtYS0+ZmxhZ3MgJiBfRFJNX0RNQV9MQVJHRVJfT0spKSB7CisJCWZvciAodG1wX29yZGVyID0gb3JkZXIgKyAxOworCQkgICAgICFyZXRjb2RlCisJCQkgICAgICYmIGRtYS0+Z3JhbnRlZF9jb3VudCA8IGRtYS0+cmVxdWVzdF9jb3VudAorCQkJICAgICAmJiB0bXBfb3JkZXIgPD0gRFJNX01BWF9PUkRFUjsKKwkJICAgICArK3RtcF9vcmRlcikgeworCisJCQlyZXRjb2RlID0gRFJNKGRtYV9nZXRfYnVmZmVyc19vZl9vcmRlcikoZmlscCwgZG1hLAorCQkJCQkJCQl0bXBfb3JkZXIpOworCQl9CisJfQorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4NTdjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYwpAQCAtMCwwICsxLDEzODUgQEAKKy8qIGk4MTBfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIHRoZSBpODEwIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwMTo1MDowMSAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICoJICAgIEplZmYgSGFydG1hbm4gPGpoYXJ0bWFubkB2YWxpbnV4LmNvbT4KKyAqICAgICAgICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJpODEwX2RybS5oIgorI2luY2x1ZGUgImk4MTBfZHJ2LmgiCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrIHF1ZXVlIHN1cHBvcnQgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2RlZmluZSBJODEwX0JVRl9GUkVFCQkyCisjZGVmaW5lIEk4MTBfQlVGX0NMSUVOVAkJMQorI2RlZmluZSBJODEwX0JVRl9IQVJEV0FSRSAgICAgIAkwCisKKyNkZWZpbmUgSTgxMF9CVUZfVU5NQVBQRUQgMAorI2RlZmluZSBJODEwX0JVRl9NQVBQRUQgICAxCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw0LDIpCisjZGVmaW5lIGRvd25fd3JpdGUgZG93bgorI2RlZmluZSB1cF93cml0ZSB1cAorI2VuZGlmCisKK3N0YXRpYyBkcm1fYnVmX3QgKmk4MTBfZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqZGV2KQoreworICAgCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWludAkJIGk7CisgICAJaW50IAkJIHVzZWQ7CisKKwkvKiBMaW5lYXIgc2VhcmNoIG1pZ2h0IG5vdCBiZSB0aGUgYmVzdCBzb2x1dGlvbiAqLworCisgICAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkgICAJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbIGkgXTsKKwkgICAJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQkvKiBJbiB1c2UgaXMgYWxyZWFkeSBhIHBvaW50ZXIgKi8KKwkgICAJdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgxMF9CVUZfRlJFRSwKKwkJCSAgICAgICBJODEwX0JVRl9DTElFTlQpOworCQlpZiAodXNlZCA9PSBJODEwX0JVRl9GUkVFKSB7CisJCQlyZXR1cm4gYnVmOworCQl9CisJfQorICAgCXJldHVybiBOVUxMOworfQorCisvKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgYnVmZmVyIGlzIG5vdCBzZW50IHRvIHRoZSBoYXJkd2FyZQorICogeWV0LCB0aGUgaGFyZHdhcmUgdXBkYXRlcyBpbiB1c2UgZm9yIHVzIG9uY2UgaXRzIG9uIHRoZSByaW5nIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgaW50IGk4MTBfZnJlZWxpc3RfcHV0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZikKK3sKKyAgIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisgICAJaW50IHVzZWQ7CisKKyAgIAkvKiBJbiB1c2UgaXMgYWxyZWFkeSBhIHBvaW50ZXIgKi8KKyAgIAl1c2VkID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODEwX0JVRl9DTElFTlQsIEk4MTBfQlVGX0ZSRUUpOworCWlmICh1c2VkICE9IEk4MTBfQlVGX0NMSUVOVCkgeworCSAgIAlEUk1fRVJST1IoIkZyZWVpbmcgYnVmZmVyIHRoYXRzIG5vdCBpbiB1c2UgOiAlZFxuIiwgYnVmLT5pZHgpOworCSAgIAlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyAgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTgxMF9idWZmZXJfZm9wcyA9IHsKKwkub3BlbgkgPSBkcm1fb3BlbiwKKwkuZmx1c2gJID0gZHJtX2ZsdXNoLAorCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJLmlvY3RsCSA9IGRybV9pb2N0bCwKKwkubW1hcAkgPSBpODEwX21tYXBfYnVmZmVycywKKwkuZmFzeW5jICA9IGRybV9mYXN5bmMsCit9OworCitpbnQgaTgxMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWRybV9maWxlX3QJICAgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgICAqZGV2OworCWRybV9pODEwX3ByaXZhdGVfdCAgKmRldl9wcml2OworCWRybV9idWZfdCAgICAgICAgICAgKmJ1ZjsKKwlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdjsKKworCWxvY2tfa2VybmVsKCk7CisJZGV2CSA9IHByaXYtPmhlYWQtPmRldjsKKwlkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJYnVmICAgICAgPSBkZXZfcHJpdi0+bW1hcF9idWZmZXI7CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJdm1hLT52bV9mbGFncyB8PSAoVk1fSU8gfCBWTV9ET05UQ09QWSk7CisJdm1hLT52bV9maWxlID0gZmlscDsKKworICAgCWJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID0gSTgxMF9CVUZfTUFQUEVEOworCXVubG9ja19rZXJuZWwoKTsKKworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJICAgICBWTV9PRkZTRVQodm1hKSA+PiBQQUdFX1NISUZULAorCQkJICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgIHZtYS0+dm1fcGFnZV9wcm90KSkgcmV0dXJuIC1FQUdBSU47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9tYXBfYnVmZmVyKGRybV9idWZfdCAqYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAqZGV2CSAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworICAgICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKm9sZF9mb3BzOworCWludCByZXRjb2RlID0gMDsKKworCWlmIChidWZfcHJpdi0+Y3VycmVudGx5X21hcHBlZCA9PSBJODEwX0JVRl9NQVBQRUQpIAorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd25fd3JpdGUoICZjdXJyZW50LT5tbS0+bW1hcF9zZW0gKTsKKwlvbGRfZm9wcyA9IGZpbHAtPmZfb3A7CisJZmlscC0+Zl9vcCA9ICZpODEwX2J1ZmZlcl9mb3BzOworCWRldl9wcml2LT5tbWFwX2J1ZmZlciA9IGJ1ZjsKKwlidWZfcHJpdi0+dmlydHVhbCA9ICh2b2lkICopZG9fbW1hcChmaWxwLCAwLCBidWYtPnRvdGFsLAorCQkJCQkgICAgUFJPVF9SRUFEfFBST1RfV1JJVEUsCisJCQkJCSAgICBNQVBfU0hBUkVELAorCQkJCQkgICAgYnVmLT5idXNfYWRkcmVzcyk7CisJZGV2X3ByaXYtPm1tYXBfYnVmZmVyID0gTlVMTDsKKwlmaWxwLT5mX29wID0gb2xkX2ZvcHM7CisJaWYgKCh1bnNpZ25lZCBsb25nKWJ1Zl9wcml2LT52aXJ0dWFsID4gLTEwMjRVTCkgeworCQkvKiBSZWFsIGVycm9yICovCisJCURSTV9FUlJPUigibW1hcCBlcnJvclxuIik7CisJCXJldGNvZGUgPSAoc2lnbmVkIGludClidWZfcHJpdi0+dmlydHVhbDsKKwkJYnVmX3ByaXYtPnZpcnR1YWwgPSBOVUxMOworCX0KKwl1cF93cml0ZSggJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSApOworCisJcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF91bm1hcF9idWZmZXIoZHJtX2J1Zl90ICpidWYpCit7CisJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCWludCByZXRjb2RlID0gMDsKKworCWlmIChidWZfcHJpdi0+Y3VycmVudGx5X21hcHBlZCAhPSBJODEwX0JVRl9NQVBQRUQpCisJCXJldHVybiAtRUlOVkFMOworCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlyZXRjb2RlID0gZG9fbXVubWFwKGN1cnJlbnQtPm1tLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWJ1Zl9wcml2LT52aXJ0dWFsLAorCQkJICAgIChzaXplX3QpIGJ1Zi0+dG90YWwpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisgICAJYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPSBJODEwX0JVRl9VTk1BUFBFRDsKKyAgIAlidWZfcHJpdi0+dmlydHVhbCA9IE5VTEw7CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworc3RhdGljIGludCBpODEwX2RtYV9nZXRfYnVmZmVyKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1faTgxMF9kbWFfdCAqZCwKKwkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlkcm1fYnVmX3QJICAqYnVmOworCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWludCByZXRjb2RlID0gMDsKKworCWJ1ZiA9IGk4MTBfZnJlZWxpc3RfZ2V0KGRldik7CisJaWYgKCFidWYpIHsKKwkJcmV0Y29kZSA9IC1FTk9NRU07CisJICAgCURSTV9ERUJVRygicmV0Y29kZT0lZFxuIiwgcmV0Y29kZSk7CisJCXJldHVybiByZXRjb2RlOworCX0KKworCXJldGNvZGUgPSBpODEwX21hcF9idWZmZXIoYnVmLCBmaWxwKTsKKwlpZiAocmV0Y29kZSkgeworCQlpODEwX2ZyZWVsaXN0X3B1dChkZXYsIGJ1Zik7CisJICAgCURSTV9FUlJPUigibWFwYnVmIGZhaWxlZCwgcmV0Y29kZSAlZFxuIiwgcmV0Y29kZSk7CisJCXJldHVybiByZXRjb2RlOworCX0KKwlidWYtPmZpbHAgPSBmaWxwOworCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlkLT5ncmFudGVkID0gMTsKKyAgIAlkLT5yZXF1ZXN0X2lkeCA9IGJ1Zi0+aWR4OworICAgCWQtPnJlcXVlc3Rfc2l6ZSA9IGJ1Zi0+dG90YWw7CisgICAJZC0+dmlydHVhbCA9IGJ1Zl9wcml2LT52aXJ0dWFsOworCisJcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKworCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAorCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKKwkgKiBpcyBmcmVlZCwgaXQncyB0b28gbGF0ZS4KKwkgKi8KKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0lSUSkgJiYgZGV2LT5pcnFfZW5hYmxlZCkKKwkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKKworCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CisJCWludCBpOworCSAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkgICAgIAkJKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCisJCWlmIChkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0KSB7CisJCSAgIAlkcm1faW9yZW1hcGZyZWUoKHZvaWQgKikgZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCwKKwkJCQkJIGRldl9wcml2LT5yaW5nLlNpemUsIGRldik7CisJCX0KKwkgICAJaWYgKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSkgeworCQkgICAJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIFBBR0VfU0laRSwKKwkJCQkJICAgIGRldl9wcml2LT5od19zdGF0dXNfcGFnZSwKKwkJCQkJICAgIGRldl9wcml2LT5kbWFfc3RhdHVzX3BhZ2UpOworCQkgICAJLyogTmVlZCB0byByZXdyaXRlIGhhcmR3YXJlIHN0YXR1cyBwYWdlICovCisJCSAgIAlJODEwX1dSSVRFKDB4MDIwODAsIDB4MWZmZmYwMDApOworCQl9CisJICAgCWRybV9mcmVlKGRldi0+ZGV2X3ByaXZhdGUsIHNpemVvZihkcm1faTgxMF9wcml2YXRlX3QpLAorCQkJIERSTV9NRU1fRFJJVkVSKTsKKwkgICAJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CisKKwkJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkJCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0WyBpIF07CisJCQlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJCQlpZiAoIGJ1Zl9wcml2LT5rZXJuZWxfdmlydHVhbCAmJiBidWYtPnRvdGFsICkKKwkJCQlkcm1faW9yZW1hcGZyZWUoYnVmX3ByaXYtPmtlcm5lbF92aXJ0dWFsLCBidWYtPnRvdGFsLCBkZXYpOworCQl9CisJfQorICAgCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MTBfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbikKK3sKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgIAlkcm1faTgxMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CisgICAJaW50IGl0ZXJzID0gMDsKKyAgIAl1bnNpZ25lZCBsb25nIGVuZDsKKwl1bnNpZ25lZCBpbnQgbGFzdF9oZWFkID0gSTgxMF9SRUFEKExQX1JJTkcgKyBSSU5HX0hFQUQpICYgSEVBRF9BRERSOworCisJZW5kID0gamlmZmllcyArIChIWiozKTsKKyAgIAl3aGlsZSAocmluZy0+c3BhY2UgPCBuKSB7CisJICAgCXJpbmctPmhlYWQgPSBJODEwX1JFQUQoTFBfUklORyArIFJJTkdfSEVBRCkgJiBIRUFEX0FERFI7CisJICAgCXJpbmctPnNwYWNlID0gcmluZy0+aGVhZCAtIChyaW5nLT50YWlsKzgpOworCQlpZiAocmluZy0+c3BhY2UgPCAwKSByaW5nLT5zcGFjZSArPSByaW5nLT5TaXplOworCSAgIAorCQlpZiAocmluZy0+aGVhZCAhPSBsYXN0X2hlYWQpIHsKKwkJCWVuZCA9IGppZmZpZXMgKyAoSFoqMyk7CisJCQlsYXN0X2hlYWQgPSByaW5nLT5oZWFkOworCQl9CisJICAKKwkgICAJaXRlcnMrKzsKKwkJaWYgKHRpbWVfYmVmb3JlKGVuZCwgamlmZmllcykpIHsKKwkJICAgCURSTV9FUlJPUigic3BhY2U6ICVkIHdhbnRlZCAlZFxuIiwgcmluZy0+c3BhY2UsIG4pOworCQkgICAJRFJNX0VSUk9SKCJsb2NrdXBcbiIpOworCQkgICAJZ290byBvdXRfd2FpdF9yaW5nOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisKK291dF93YWl0X3Jpbmc6CisgICAJcmV0dXJuIGl0ZXJzOworfQorCitzdGF0aWMgdm9pZCBpODEwX2tlcm5lbF9sb3N0X2NvbnRleHQoZHJtX2RldmljZV90ICpkZXYpCit7CisgICAgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisgICAJZHJtX2k4MTBfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOworCisgICAJcmluZy0+aGVhZCA9IEk4MTBfUkVBRChMUF9SSU5HICsgUklOR19IRUFEKSAmIEhFQURfQUREUjsKKyAgICAgCXJpbmctPnRhaWwgPSBJODEwX1JFQUQoTFBfUklORyArIFJJTkdfVEFJTCk7CisgICAgIAlyaW5nLT5zcGFjZSA9IHJpbmctPmhlYWQgLSAocmluZy0+dGFpbCs4KTsKKyAgICAgCWlmIChyaW5nLT5zcGFjZSA8IDApIHJpbmctPnNwYWNlICs9IHJpbmctPlNpemU7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9mcmVlbGlzdF9pbml0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2KQoreworICAgICAgCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworICAgCWludCBteV9pZHggPSAyNDsKKyAgIAl1MzIgKmh3X3N0YXR1cyA9ICh1MzIgKikoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlICsgbXlfaWR4KTsKKyAgIAlpbnQgaTsKKworCWlmIChkbWEtPmJ1Zl9jb3VudCA+IDEwMTkpIHsKKwkgICAJLyogTm90IGVub3VnaCBzcGFjZSBpbiB0aGUgc3RhdHVzIHBhZ2UgZm9yIHRoZSBmcmVlbGlzdCAqLworCSAgIAlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyAgIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgeworCSAgIAlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFsgaSBdOworCSAgIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwkgICAJYnVmX3ByaXYtPmluX3VzZSA9IGh3X3N0YXR1cysrOworCSAgIAlidWZfcHJpdi0+bXlfdXNlX2lkeCA9IG15X2lkeDsKKwkgICAJbXlfaWR4ICs9IDQ7CisKKwkgICAJKmJ1Zl9wcml2LT5pbl91c2UgPSBJODEwX0JVRl9GUkVFOworCisJCWJ1Zl9wcml2LT5rZXJuZWxfdmlydHVhbCA9IGRybV9pb3JlbWFwKGJ1Zi0+YnVzX2FkZHJlc3MsCisJCQkJCQkJYnVmLT50b3RhbCwgZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9kbWFfaW5pdGlhbGl6ZShkcm1fZGV2aWNlX3QgKmRldiwKKwkJCSAgICAgICBkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJICAgICAgIGRybV9pODEwX2luaXRfdCAqaW5pdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisgICAJbWVtc2V0KGRldl9wcml2LCAwLCBzaXplb2YoZHJtX2k4MTBfcHJpdmF0ZV90KSk7CisKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKKwkJZHJtX21hcF9saXN0X3QgKnJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCQlpZiAocl9saXN0LT5tYXAgJiYKKwkJICAgIHJfbGlzdC0+bWFwLT50eXBlID09IF9EUk1fU0hNICYmCisJCSAgICByX2xpc3QtPm1hcC0+ZmxhZ3MgJiBfRFJNX0NPTlRBSU5TX0xPQ0sgKSB7CisJCQlkZXZfcHJpdi0+c2FyZWFfbWFwID0gcl9saXN0LT5tYXA7CisgCQkJYnJlYWs7CisgCQl9CisgCX0KKwlpZiAoIWRldl9wcml2LT5zYXJlYV9tYXApIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJICAgCWk4MTBfZG1hX2NsZWFudXAoZGV2KTsKKwkgICAJRFJNX0VSUk9SKCJjYW4gbm90IGZpbmQgc2FyZWEhXG4iKTsKKwkgICAJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldl9wcml2LT5tbWlvX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5tbWlvX29mZnNldCk7CisJaWYgKCFkZXZfcHJpdi0+bW1pb19tYXApIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJICAgCWk4MTBfZG1hX2NsZWFudXAoZGV2KTsKKwkgICAJRFJNX0VSUk9SKCJjYW4gbm90IGZpbmQgbW1pbyBtYXAhXG4iKTsKKwkgICAJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldi0+YWdwX2J1ZmZlcl9tYXAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+YnVmZmVyc19vZmZzZXQpOworCWlmICghZGV2LT5hZ3BfYnVmZmVyX21hcCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkgICAJaTgxMF9kbWFfY2xlYW51cChkZXYpOworCSAgIAlEUk1fRVJST1IoImNhbiBub3QgZmluZCBkbWEgYnVmZmVyIG1hcCFcbiIpOworCSAgIAlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdiA9IChkcm1faTgxMF9zYXJlYV90ICopCisJCSgodTggKilkZXZfcHJpdi0+c2FyZWFfbWFwLT5oYW5kbGUgKworCQkgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCisgICAJZGV2X3ByaXYtPnJpbmcuU3RhcnQgPSBpbml0LT5yaW5nX3N0YXJ0OworICAgCWRldl9wcml2LT5yaW5nLkVuZCA9IGluaXQtPnJpbmdfZW5kOworICAgCWRldl9wcml2LT5yaW5nLlNpemUgPSBpbml0LT5yaW5nX3NpemU7CisKKyAgIAlkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0ID0gZHJtX2lvcmVtYXAoZGV2LT5hZ3AtPmJhc2UgKworCQkJCQkJICAgIGluaXQtPnJpbmdfc3RhcnQsCisJCQkJCQkgICAgaW5pdC0+cmluZ19zaXplLCBkZXYpOworCisgICAJaWYgKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgPT0gTlVMTCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKikgZGV2X3ByaXY7CisJICAgCWk4MTBfZG1hX2NsZWFudXAoZGV2KTsKKwkgICAJRFJNX0VSUk9SKCJjYW4gbm90IGlvcmVtYXAgdmlydHVhbCBhZGRyZXNzIGZvciIKKwkJCSAgIiByaW5nIGJ1ZmZlclxuIik7CisJICAgCXJldHVybiAtRU5PTUVNOworCX0KKworICAgCWRldl9wcml2LT5yaW5nLnRhaWxfbWFzayA9IGRldl9wcml2LT5yaW5nLlNpemUgLSAxOworCisJZGV2X3ByaXYtPncgPSBpbml0LT53OworCWRldl9wcml2LT5oID0gaW5pdC0+aDsKKwlkZXZfcHJpdi0+cGl0Y2ggPSBpbml0LT5waXRjaDsKKwlkZXZfcHJpdi0+YmFja19vZmZzZXQgPSBpbml0LT5iYWNrX29mZnNldDsKKwlkZXZfcHJpdi0+ZGVwdGhfb2Zmc2V0ID0gaW5pdC0+ZGVwdGhfb2Zmc2V0OworCWRldl9wcml2LT5mcm9udF9vZmZzZXQgPSBpbml0LT5mcm9udF9vZmZzZXQ7CisKKwlkZXZfcHJpdi0+b3ZlcmxheV9vZmZzZXQgPSBpbml0LT5vdmVybGF5X29mZnNldDsKKwlkZXZfcHJpdi0+b3ZlcmxheV9waHlzaWNhbCA9IGluaXQtPm92ZXJsYXlfcGh5c2ljYWw7CisKKwlkZXZfcHJpdi0+ZnJvbnRfZGkxID0gaW5pdC0+ZnJvbnRfb2Zmc2V0IHwgaW5pdC0+cGl0Y2hfYml0czsKKwlkZXZfcHJpdi0+YmFja19kaTEgPSBpbml0LT5iYWNrX29mZnNldCB8IGluaXQtPnBpdGNoX2JpdHM7CisJZGV2X3ByaXYtPnppMSA9IGluaXQtPmRlcHRoX29mZnNldCB8IGluaXQtPnBpdGNoX2JpdHM7CisKKyAgIAkvKiBQcm9ncmFtIEhhcmR3YXJlIFN0YXR1cyBQYWdlICovCisgICAJZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlID0KKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsCisJCQkJCQkmZGV2X3ByaXYtPmRtYV9zdGF0dXNfcGFnZSk7CisgICAJaWYgKCFkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCWk4MTBfZG1hX2NsZWFudXAoZGV2KTsKKwkJRFJNX0VSUk9SKCJDYW4gbm90IGFsbG9jYXRlIGhhcmR3YXJlIHN0YXR1cyBwYWdlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorICAgCW1lbXNldChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UsIDAsIFBBR0VfU0laRSk7CisgICAJRFJNX0RFQlVHKCJodyBzdGF0dXMgcGFnZSBAICVwXG4iLCBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpOworCisJSTgxMF9XUklURSgweDAyMDgwLCBkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKyAgIAlEUk1fREVCVUcoIkVuYWJsZWQgaGFyZHdhcmUgc3RhdHVzIHBhZ2VcbiIpOworCisgICAJLyogTm93IHdlIG5lZWQgdG8gaW5pdCBvdXIgZnJlZWxpc3QgKi8KKwlpZiAoaTgxMF9mcmVlbGlzdF9pbml0KGRldiwgZGV2X3ByaXYpICE9IDApIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJICAgCWk4MTBfZG1hX2NsZWFudXAoZGV2KTsKKwkgICAJRFJNX0VSUk9SKCJOb3QgZW5vdWdoIHNwYWNlIGluIHRoZSBzdGF0dXMgcGFnZSBmb3IiCisJCQkgICIgdGhlIGZyZWVsaXN0XG4iKTsKKwkgICAJcmV0dXJuIC1FTk9NRU07CisJfQorCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCisgICAJcmV0dXJuIDA7Cit9CisKKy8qIGk4MTAgRFJNIHZlcnNpb24gMS4xIHVzZWQgYSBzbWFsbGVyIGluaXQgc3RydWN0dXJlIHdpdGggZGlmZmVyZW50CisgKiBvcmRlcmluZyBvZiB2YWx1ZXMgdGhhbiBpcyBjdXJyZW50bHkgdXNlZCAoZHJtID49IDEuMikuIFRoZXJlIGlzCisgKiBubyBkZWZpbmVkIHdheSB0byBkZXRlY3QgdGhlIFhGcmVlIHZlcnNpb24gdG8gY29ycmVjdCB0aGlzIHByb2JsZW0sCisgKiBob3dldmVyIGJ5IGNoZWNraW5nIHVzaW5nIHRoaXMgcHJvY2VkdXJlIHdlIGNhbiBkZXRlY3QgdGhlIGNvcnJlY3QKKyAqIHRoaW5nIHRvIGRvLgorICoKKyAqICMxIFJlYWQgdGhlIFNtYWxsZXIgaW5pdCBzdHJ1Y3R1cmUgZnJvbSB1c2VyLXNwYWNlCisgKiAjMiBWZXJpZnkgdGhlIG92ZXJsYXlfcGh5c2ljYWwgaXMgYSB2YWxpZCBwaHlzaWNhbCBhZGRyZXNzLCBvciBOVUxMCisgKiAgICBJZiBpdCBpc24ndCB0aGVuIHdlIGhhdmUgYSB2MS4xIGNsaWVudC4gRml4IHVwIHBhcmFtcy4KKyAqICAgIElmIGl0IGlzLCB0aGVuIHdlIGhhdmUgYSAxLjIgY2xpZW50Li4uIGdldCB0aGUgcmVzdCBvZiB0aGUgZGF0YS4KKyAqLworc3RhdGljIGludCBpODEwX2RtYV9pbml0X2NvbXBhdChkcm1faTgxMF9pbml0X3QgKmluaXQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCisJLyogR2V0IHYxLjEgaW5pdCBkYXRhICovCisJaWYgKGNvcHlfZnJvbV91c2VyKGluaXQsIChkcm1faTgxMF9wcmUxMl9pbml0X3QgX191c2VyICopYXJnLAorCQkJICBzaXplb2YoZHJtX2k4MTBfcHJlMTJfaW5pdF90KSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCghaW5pdC0+b3ZlcmxheV9waHlzaWNhbCkgfHwgKGluaXQtPm92ZXJsYXlfcGh5c2ljYWwgPiA0MDk2KSkgeworCisJCS8qIFRoaXMgaXMgYSB2MS4yIGNsaWVudCwganVzdCBnZXQgdGhlIHYxLjIgaW5pdCBkYXRhICovCisJCURSTV9JTkZPKCJVc2luZyBQT1NUIHYxLjIgaW5pdC5cbiIpOworCQlpZiAoY29weV9mcm9tX3VzZXIoaW5pdCwgKGRybV9pODEwX2luaXRfdCBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKGRybV9pODEwX2luaXRfdCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZSB7CisKKwkJLyogVGhpcyBpcyBhIHYxLjEgY2xpZW50LCBmaXggdGhlIHBhcmFtcyAqLworCQlEUk1fSU5GTygiVXNpbmcgUFJFIHYxLjIgaW5pdC5cbiIpOworCSAJaW5pdC0+cGl0Y2hfYml0cyA9IGluaXQtPmg7CisJIAlpbml0LT5waXRjaCA9IGluaXQtPnc7CisJIAlpbml0LT5oID0gaW5pdC0+b3ZlcmxheV9waHlzaWNhbDsKKwkgCWluaXQtPncgPSBpbml0LT5vdmVybGF5X29mZnNldDsKKwkgCWluaXQtPm92ZXJsYXlfcGh5c2ljYWwgPSAwOworCSAJaW5pdC0+b3ZlcmxheV9vZmZzZXQgPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MTBfZG1hX2luaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKyAgIAlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2OworICAgCWRybV9pODEwX2luaXRfdCBpbml0OworICAgCWludCByZXRjb2RlID0gMDsKKworCS8qIEdldCBvbmx5IHRoZSBpbml0IGZ1bmMgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJmluaXQsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGRybV9pODEwX2luaXRfZnVuY190KSkpIAorCQlyZXR1cm4gLUVGQVVMVDsKKworICAgCXN3aXRjaChpbml0LmZ1bmMpIHsKKwkgCWNhc2UgSTgxMF9JTklUX0RNQToKKwkgCSAgICAgICAJLyogVGhpcyBjYXNlIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBJdAorCQkJICogaGFuZGxlcyBYRnJlZSA0LjEuMCBhbmQgNC4yLjAsIGFuZCBoYXMgdG8KKwkJCSAqIGRvIHNvbWUgcGFyYW1ldGVyIGNoZWNraW5nIGFzIGRlc2NyaWJlZCBiZWxvdy4KKwkJCSAqIEl0IHdpbGwgc29tZWRheSBnbyBhd2F5LgorCQkJICovCisJCQlyZXRjb2RlID0gaTgxMF9kbWFfaW5pdF9jb21wYXQoJmluaXQsIGFyZyk7CisJCQlpZiAocmV0Y29kZSkKKwkJCQlyZXR1cm4gcmV0Y29kZTsKKworCSAgIAkJZGV2X3ByaXYgPSBkcm1fYWxsb2Moc2l6ZW9mKGRybV9pODEwX3ByaXZhdGVfdCksCisJCQkJCSAgICAgRFJNX01FTV9EUklWRVIpOworCSAgIAkJaWYgKGRldl9wcml2ID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJICAgCQlyZXRjb2RlID0gaTgxMF9kbWFfaW5pdGlhbGl6ZShkZXYsIGRldl9wcml2LCAmaW5pdCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCSAJY2FzZSBJODEwX0lOSVRfRE1BXzFfNDoKKwkJCURSTV9JTkZPKCJVc2luZyB2MS40IGluaXQuXG4iKTsKKyAgCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbml0LCAoZHJtX2k4MTBfaW5pdF90IF9fdXNlciAqKWFyZywKKwkJCQkJICBzaXplb2YoZHJtX2k4MTBfaW5pdF90KSkpIHsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkgICAJCWRldl9wcml2ID0gZHJtX2FsbG9jKHNpemVvZihkcm1faTgxMF9wcml2YXRlX3QpLAorCQkJCQkgICAgIERSTV9NRU1fRFJJVkVSKTsKKwkJCWlmIChkZXZfcHJpdiA9PSBOVUxMKSAKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkgICAJCXJldGNvZGUgPSBpODEwX2RtYV9pbml0aWFsaXplKGRldiwgZGV2X3ByaXYsICZpbml0KTsKKwkJCWJyZWFrOworCisJIAljYXNlIEk4MTBfQ0xFQU5VUF9ETUE6CisJCSAgICAgICAgRFJNX0lORk8oIkRNQSBDbGVhbnVwXG4iKTsKKwkgICAJCXJldGNvZGUgPSBpODEwX2RtYV9jbGVhbnVwKGRldik7CisgICAgICAgICAgICAgIAkgICAJYnJlYWs7CisJfQorCisgICAJcmV0dXJuIHJldGNvZGU7Cit9CisKKworCisvKiBNb3N0IGVmZmljaWVudCB3YXkgdG8gdmVyaWZ5IHN0YXRlIGZvciB0aGUgaTgxMCBpcyBhcyBpdCBpcworICogZW1pdHRlZC4gIE5vbi1jb25mb3JtYW50IHN0YXRlIGlzIHNpbGVudGx5IGRyb3BwZWQuCisgKgorICogVXNlICd2b2xhdGlsZScgJiBsb2NhbCB2YXIgdG1wIHRvIGZvcmNlIHRoZSBlbWl0dGVkIHZhbHVlcyB0byBiZQorICogaWRlbnRpY2FsIHRvIHRoZSB2ZXJpZmllZCBvbmVzLgorICovCitzdGF0aWMgdm9pZCBpODEwRW1pdENvbnRleHRWZXJpZmllZCggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmNvZGUgKQoreworICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpLCBqID0gMDsKKwl1bnNpZ25lZCBpbnQgdG1wOworCVJJTkdfTE9DQUxTOworCisJQkVHSU5fTFBfUklORyggSTgxMF9DVFhfU0VUVVBfU0laRSApOworCisJT1VUX1JJTkcoIEdGWF9PUF9DT0xPUl9GQUNUT1IgKTsKKwlPVVRfUklORyggY29kZVtJODEwX0NUWFJFR19DRjFdICk7CisKKwlPVVRfUklORyggR0ZYX09QX1NUSVBQTEUgKTsKKwlPVVRfUklORyggY29kZVtJODEwX0NUWFJFR19TVDFdICk7CisKKwlmb3IgKCBpID0gNCA7IGkgPCBJODEwX0NUWF9TRVRVUF9TSVpFIDsgaSsrICkgeworCQl0bXAgPSBjb2RlW2ldOworCisJCWlmICgodG1wICYgKDc8PDI5KSkgPT0gKDM8PDI5KSAmJgorCQkgICAgKHRtcCAmICgweDFmPDwyNCkpIDwgKDB4MWQ8PDI0KSkKKwkJeworCQkJT1VUX1JJTkcoIHRtcCApOworCQkJaisrOworCQl9CisJCWVsc2UgcHJpbnRrKCJjb25zdGV4dCBzdGF0ZSBkcm9wcGVkISEhXG4iKTsKKwl9CisKKwlpZiAoaiAmIDEpCisJCU9VVF9SSU5HKCAwICk7CisKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK30KKworc3RhdGljIHZvaWQgaTgxMEVtaXRUZXhWZXJpZmllZCggZHJtX2RldmljZV90ICpkZXYsCisJCQkJIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSApCit7CisgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGksIGogPSAwOworCXVuc2lnbmVkIGludCB0bXA7CisJUklOR19MT0NBTFM7CisKKwlCRUdJTl9MUF9SSU5HKCBJODEwX1RFWF9TRVRVUF9TSVpFICk7CisKKwlPVVRfUklORyggR0ZYX09QX01BUF9JTkZPICk7CisJT1VUX1JJTkcoIGNvZGVbSTgxMF9URVhSRUdfTUkxXSApOworCU9VVF9SSU5HKCBjb2RlW0k4MTBfVEVYUkVHX01JMl0gKTsKKwlPVVRfUklORyggY29kZVtJODEwX1RFWFJFR19NSTNdICk7CisKKwlmb3IgKCBpID0gNCA7IGkgPCBJODEwX1RFWF9TRVRVUF9TSVpFIDsgaSsrICkgeworCQl0bXAgPSBjb2RlW2ldOworCisJCWlmICgodG1wICYgKDc8PDI5KSkgPT0gKDM8PDI5KSAmJgorCQkgICAgKHRtcCAmICgweDFmPDwyNCkpIDwgKDB4MWQ8PDI0KSkKKwkJeworCQkJT1VUX1JJTkcoIHRtcCApOworCQkJaisrOworCQl9CisJCWVsc2UgcHJpbnRrKCJ0ZXh0dXJlIHN0YXRlIGRyb3BwZWQhISFcbiIpOworCX0KKworCWlmIChqICYgMSkKKwkJT1VUX1JJTkcoIDAgKTsKKworCUFEVkFOQ0VfTFBfUklORygpOworfQorCisKKy8qIE5lZWQgdG8gZG8gc29tZSBhZGRpdGlvbmFsIGNoZWNraW5nIHdoZW4gc2V0dGluZyB0aGUgZGVzdCBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIGk4MTBFbWl0RGVzdFZlcmlmaWVkKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSApCit7CisgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IHRtcDsKKwlSSU5HX0xPQ0FMUzsKKworCUJFR0lOX0xQX1JJTkcoIEk4MTBfREVTVF9TRVRVUF9TSVpFICsgMiApOworCisJdG1wID0gY29kZVtJODEwX0RFU1RSRUdfREkxXTsKKwlpZiAodG1wID09IGRldl9wcml2LT5mcm9udF9kaTEgfHwgdG1wID09IGRldl9wcml2LT5iYWNrX2RpMSkgeworCQlPVVRfUklORyggQ01EX09QX0RFU1RCVUZGRVJfSU5GTyApOworCQlPVVRfUklORyggdG1wICk7CisJfSBlbHNlCisJICAgRFJNX0RFQlVHKCJiYWQgZGkxICV4IChhbGxvdyAleCBvciAleClcbiIsCisJCSAgICAgdG1wLCBkZXZfcHJpdi0+ZnJvbnRfZGkxLCBkZXZfcHJpdi0+YmFja19kaTEpOworCisJLyogaW52YXJpZW50OgorCSAqLworCU9VVF9SSU5HKCBDTURfT1BfWl9CVUZGRVJfSU5GTyApOworCU9VVF9SSU5HKCBkZXZfcHJpdi0+emkxICk7CisKKwlPVVRfUklORyggR0ZYX09QX0RFU1RCVUZGRVJfVkFSUyApOworCU9VVF9SSU5HKCBjb2RlW0k4MTBfREVTVFJFR19EVjFdICk7CisKKwlPVVRfUklORyggR0ZYX09QX0RSQVdSRUNUX0lORk8gKTsKKwlPVVRfUklORyggY29kZVtJODEwX0RFU1RSRUdfRFIxXSApOworCU9VVF9SSU5HKCBjb2RlW0k4MTBfREVTVFJFR19EUjJdICk7CisJT1VUX1JJTkcoIGNvZGVbSTgxMF9ERVNUUkVHX0RSM10gKTsKKwlPVVRfUklORyggY29kZVtJODEwX0RFU1RSRUdfRFI0XSApOworCU9VVF9SSU5HKCAwICk7CisKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK30KKworCisKK3N0YXRpYyB2b2lkIGk4MTBFbWl0U3RhdGUoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgICAgIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJdW5zaWduZWQgaW50IGRpcnR5ID0gc2FyZWFfcHJpdi0+ZGlydHk7CisJCisJRFJNX0RFQlVHKCIlcyAleFxuIiwgX19GVU5DVElPTl9fLCBkaXJ0eSk7CisKKwlpZiAoZGlydHkgJiBJODEwX1VQTE9BRF9CVUZGRVJTKSB7CisJCWk4MTBFbWl0RGVzdFZlcmlmaWVkKCBkZXYsIHNhcmVhX3ByaXYtPkJ1ZmZlclN0YXRlICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODEwX1VQTE9BRF9CVUZGRVJTOworCX0KKworCWlmIChkaXJ0eSAmIEk4MTBfVVBMT0FEX0NUWCkgeworCQlpODEwRW1pdENvbnRleHRWZXJpZmllZCggZGV2LCBzYXJlYV9wcml2LT5Db250ZXh0U3RhdGUgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MTBfVVBMT0FEX0NUWDsKKwl9CisKKwlpZiAoZGlydHkgJiBJODEwX1VQTE9BRF9URVgwKSB7CisJCWk4MTBFbWl0VGV4VmVyaWZpZWQoIGRldiwgc2FyZWFfcHJpdi0+VGV4U3RhdGVbMF0gKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MTBfVVBMT0FEX1RFWDA7CisJfQorCisJaWYgKGRpcnR5ICYgSTgxMF9VUExPQURfVEVYMSkgeworCQlpODEwRW1pdFRleFZlcmlmaWVkKCBkZXYsIHNhcmVhX3ByaXYtPlRleFN0YXRlWzFdICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODEwX1VQTE9BRF9URVgxOworCX0KK30KKworCisKKy8qIG5lZWQgdG8gdmVyaWZ5CisgKi8KK3N0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX2NsZWFyKCBkcm1fZGV2aWNlX3QgKmRldiwgaW50IGZsYWdzLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNsZWFyX3p2YWwgKQoreworICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgICAgCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJaW50IHBpdGNoID0gZGV2X3ByaXYtPnBpdGNoOworCWludCBjcHAgPSAyOworCWludCBpOworCVJJTkdfTE9DQUxTOworCQorCWlmICggZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAxICkgeworCSAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9IGZsYWdzOworCSAgICAgICAKKwkJZmxhZ3MgJj0gfihJODEwX0ZST05UIHwgSTgxMF9CQUNLKTsKKwkJaWYgKHRtcCAmIEk4MTBfRlJPTlQpIGZsYWdzIHw9IEk4MTBfQkFDSzsKKwkJaWYgKHRtcCAmIEk4MTBfQkFDSykgZmxhZ3MgfD0gSTgxMF9GUk9OVDsKKwl9CisKKyAgCWk4MTBfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisgICAgICAJaWYgKG5ib3ggPiBJODEwX05SX1NBUkVBX0NMSVBSRUNUUykKKyAgICAgCQluYm94ID0gSTgxMF9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlmb3IgKGkgPSAwIDsgaSA8IG5ib3ggOyBpKyssIHBib3grKykgeworCQl1bnNpZ25lZCBpbnQgeCA9IHBib3gtPngxOworCQl1bnNpZ25lZCBpbnQgeSA9IHBib3gtPnkxOworCQl1bnNpZ25lZCBpbnQgd2lkdGggPSAocGJveC0+eDIgLSB4KSAqIGNwcDsKKwkJdW5zaWduZWQgaW50IGhlaWdodCA9IHBib3gtPnkyIC0geTsKKwkJdW5zaWduZWQgaW50IHN0YXJ0ID0geSAqIHBpdGNoICsgeCAqIGNwcDsKKworCQlpZiAocGJveC0+eDEgPiBwYm94LT54MiB8fAorCQkgICAgcGJveC0+eTEgPiBwYm94LT55MiB8fAorCQkgICAgcGJveC0+eDIgPiBkZXZfcHJpdi0+dyB8fAorCQkgICAgcGJveC0+eTIgPiBkZXZfcHJpdi0+aCkKKwkJCWNvbnRpbnVlOworCisJICAgCWlmICggZmxhZ3MgJiBJODEwX0ZST05UICkgeworCQkJQkVHSU5fTFBfUklORyggNiApOworCQkJT1VUX1JJTkcoIEJSMDBfQklUQkxUX0NMSUVOVCB8CisJCQkJICBCUjAwX09QX0NPTE9SX0JMVCB8IDB4MyApOworCQkJT1VUX1JJTkcoIEJSMTNfU09MSURfUEFUVEVSTiB8ICgweEYwIDw8IDE2KSB8IHBpdGNoICk7CisJCQlPVVRfUklORyggKGhlaWdodCA8PCAxNikgfCB3aWR0aCApOworCQkJT1VUX1JJTkcoIHN0YXJ0ICk7CisJCQlPVVRfUklORyggY2xlYXJfY29sb3IgKTsKKwkJCU9VVF9SSU5HKCAwICk7CisJCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwkJfQorCisJCWlmICggZmxhZ3MgJiBJODEwX0JBQ0sgKSB7CisJCQlCRUdJTl9MUF9SSU5HKCA2ICk7CisJCQlPVVRfUklORyggQlIwMF9CSVRCTFRfQ0xJRU5UIHwKKwkJCQkgIEJSMDBfT1BfQ09MT1JfQkxUIHwgMHgzICk7CisJCQlPVVRfUklORyggQlIxM19TT0xJRF9QQVRURVJOIHwgKDB4RjAgPDwgMTYpIHwgcGl0Y2ggKTsKKwkJCU9VVF9SSU5HKCAoaGVpZ2h0IDw8IDE2KSB8IHdpZHRoICk7CisJCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ICsgc3RhcnQgKTsKKwkJCU9VVF9SSU5HKCBjbGVhcl9jb2xvciApOworCQkJT1VUX1JJTkcoIDAgKTsKKwkJCUFEVkFOQ0VfTFBfUklORygpOworCQl9CisKKwkJaWYgKCBmbGFncyAmIEk4MTBfREVQVEggKSB7CisJCQlCRUdJTl9MUF9SSU5HKCA2ICk7CisJCQlPVVRfUklORyggQlIwMF9CSVRCTFRfQ0xJRU5UIHwKKwkJCQkgIEJSMDBfT1BfQ09MT1JfQkxUIHwgMHgzICk7CisJCQlPVVRfUklORyggQlIxM19TT0xJRF9QQVRURVJOIHwgKDB4RjAgPDwgMTYpIHwgcGl0Y2ggKTsKKwkJCU9VVF9SSU5HKCAoaGVpZ2h0IDw8IDE2KSB8IHdpZHRoICk7CisJCQlPVVRfUklORyggZGV2X3ByaXYtPmRlcHRoX29mZnNldCArIHN0YXJ0ICk7CisJCQlPVVRfUklORyggY2xlYXJfenZhbCApOworCQkJT1VUX1JJTkcoIDAgKTsKKwkJCUFEVkFOQ0VfTFBfUklORygpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9zd2FwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CisJaW50IGNwcCA9IDI7CisJaW50IGk7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoInN3YXBidWZmZXJzXG4iKTsKKworICAJaTgxMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKyAgICAgIAlpZiAobmJveCA+IEk4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTKQorICAgICAJCW5ib3ggPSBJODEwX05SX1NBUkVBX0NMSVBSRUNUUzsKKworCWZvciAoaSA9IDAgOyBpIDwgbmJveDsgaSsrLCBwYm94KyspCisJeworCQl1bnNpZ25lZCBpbnQgdyA9IHBib3gtPngyIC0gcGJveC0+eDE7CisJCXVuc2lnbmVkIGludCBoID0gcGJveC0+eTIgLSBwYm94LT55MTsKKwkJdW5zaWduZWQgaW50IGRzdCA9IHBib3gtPngxKmNwcCArIHBib3gtPnkxKnBpdGNoOworCQl1bnNpZ25lZCBpbnQgc3RhcnQgPSBkc3Q7CisKKwkJaWYgKHBib3gtPngxID4gcGJveC0+eDIgfHwKKwkJICAgIHBib3gtPnkxID4gcGJveC0+eTIgfHwKKwkJICAgIHBib3gtPngyID4gZGV2X3ByaXYtPncgfHwKKwkJICAgIHBib3gtPnkyID4gZGV2X3ByaXYtPmgpCisJCQljb250aW51ZTsKKworCQlCRUdJTl9MUF9SSU5HKCA2ICk7CisJCU9VVF9SSU5HKCBCUjAwX0JJVEJMVF9DTElFTlQgfCBCUjAwX09QX1NSQ19DT1BZX0JMVCB8IDB4NCApOworCQlPVVRfUklORyggcGl0Y2ggfCAoMHhDQyA8PCAxNikpOworCQlPVVRfUklORyggKGggPDwgMTYpIHwgKHcgKiBjcHApKTsKKwkJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCkKKwkJICBPVVRfUklORyhkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICsgc3RhcnQpOworCQllbHNlCisJCSAgT1VUX1JJTkcoZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ICsgc3RhcnQpOworCQlPVVRfUklORyggcGl0Y2ggKTsKKwkJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCkKKwkJICBPVVRfUklORyhkZXZfcHJpdi0+YmFja19vZmZzZXQgKyBzdGFydCk7CisJCWVsc2UKKwkJICBPVVRfUklORyhkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICsgc3RhcnQpOworCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfdmVydGV4KGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgICAgZHJtX2J1Zl90ICpidWYsCisJCQkJICAgICBpbnQgZGlzY2FyZCwKKwkJCQkgICAgIGludCB1c2VkKQoreworICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKyAgIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisgICAJZHJtX2NsaXBfcmVjdF90ICpib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKyAgIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpYnVmLT5idXNfYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gYWRkcmVzcyAtIGRldi0+YWdwLT5iYXNlOworCWludCBpID0gMDsKKyAgIAlSSU5HX0xPQ0FMUzsKKworICAgCWk4MTBfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisgICAJaWYgKG5ib3ggPiBJODEwX05SX1NBUkVBX0NMSVBSRUNUUykKKwkJbmJveCA9IEk4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJaWYgKHVzZWQgPiA0KjEwMjQpCisJCXVzZWQgPSAwOworCisJaWYgKHNhcmVhX3ByaXYtPmRpcnR5KQorCSAgIGk4MTBFbWl0U3RhdGUoIGRldiApOworCisJaWYgKGJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID09IEk4MTBfQlVGX01BUFBFRCkgeworCQl1bnNpZ25lZCBpbnQgcHJpbSA9IChzYXJlYV9wcml2LT52ZXJ0ZXhfcHJpbSAmIFBSX01BU0spOworCisJCSoodTMyICopYnVmX3ByaXYtPmtlcm5lbF92aXJ0dWFsID0gKChHRlhfT1BfUFJJTUlUSVZFIHwgcHJpbSB8ICgodXNlZC80KS0yKSkpOworCisJCWlmICh1c2VkICYgNCkgeworCQkJKih1MzIgKikoKHUzMilidWZfcHJpdi0+a2VybmVsX3ZpcnR1YWwgKyB1c2VkKSA9IDA7CisJCQl1c2VkICs9IDQ7CisJCX0KKworCQlpODEwX3VubWFwX2J1ZmZlcihidWYpOworCX0KKworCWlmICh1c2VkKSB7CisJCWRvIHsKKwkJCWlmIChpIDwgbmJveCkgeworCQkJCUJFR0lOX0xQX1JJTkcoNCk7CisJCQkJT1VUX1JJTkcoIEdGWF9PUF9TQ0lTU09SIHwgU0NfVVBEQVRFX1NDSVNTT1IgfAorCQkJCQkgIFNDX0VOQUJMRSApOworCQkJCU9VVF9SSU5HKCBHRlhfT1BfU0NJU1NPUl9JTkZPICk7CisJCQkJT1VUX1JJTkcoIGJveFtpXS54MSB8IChib3hbaV0ueTE8PDE2KSApOworCQkJCU9VVF9SSU5HKCAoYm94W2ldLngyLTEpIHwgKChib3hbaV0ueTItMSk8PDE2KSApOworCQkJCUFEVkFOQ0VfTFBfUklORygpOworCQkJfQorCisJCQlCRUdJTl9MUF9SSU5HKDQpOworCQkJT1VUX1JJTkcoIENNRF9PUF9CQVRDSF9CVUZGRVIgKTsKKwkJCU9VVF9SSU5HKCBzdGFydCB8IEJCMV9QUk9URUNURUQgKTsKKwkJCU9VVF9SSU5HKCBzdGFydCArIHVzZWQgLSA0ICk7CisJCQlPVVRfUklORyggMCApOworCQkJQURWQU5DRV9MUF9SSU5HKCk7CisKKwkJfSB3aGlsZSAoKytpIDwgbmJveCk7CisJfQorCisJaWYgKGRpc2NhcmQpIHsKKwkJZGV2X3ByaXYtPmNvdW50ZXIrKzsKKworCQkodm9pZCkgY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODEwX0JVRl9DTElFTlQsCisJCQkgICAgICAgSTgxMF9CVUZfSEFSRFdBUkUpOworCisJCUJFR0lOX0xQX1JJTkcoOCk7CisJCU9VVF9SSU5HKCBDTURfU1RPUkVfRFdPUkRfSURYICk7CisJCU9VVF9SSU5HKCAyMCApOworCQlPVVRfUklORyggZGV2X3ByaXYtPmNvdW50ZXIgKTsKKwkJT1VUX1JJTkcoIENNRF9TVE9SRV9EV09SRF9JRFggKTsKKwkJT1VUX1JJTkcoIGJ1Zl9wcml2LT5teV91c2VfaWR4ICk7CisJCU9VVF9SSU5HKCBJODEwX0JVRl9GUkVFICk7CisJCU9VVF9SSU5HKCBDTURfUkVQT1JUX0hFQUQgKTsKKwkJT1VUX1JJTkcoIDAgKTsKKwkJQURWQU5DRV9MUF9SSU5HKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9mbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisgICAgICAgIGRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBwaXRjaCA9IGRldl9wcml2LT5waXRjaDsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRyggIiVzOiBwYWdlPSVkIHBmQ3VycmVudFBhZ2U9JWRcbiIsIAorCQlfX0ZVTkNUSU9OX18sIAorCQlkZXZfcHJpdi0+Y3VycmVudF9wYWdlLAorCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlKTsKKwkKKyAgICAgICAgaTgxMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKwlCRUdJTl9MUF9SSU5HKCAyICk7CisgICAJT1VUX1JJTkcoIElOU1RfUEFSU0VSX0NMSUVOVCB8IElOU1RfT1BfRkxVU0ggfCBJTlNUX0ZMVVNIX01BUF9DQUNIRSApOyAKKwlPVVRfUklORyggMCApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJQkVHSU5fTFBfUklORyggSTgxMF9ERVNUX1NFVFVQX1NJWkUgKyAyICk7CisJLyogT24gaTgxNSBhdCBsZWFzdCBBU1lOQyBpcyBidWdneSAqLworCS8qIHBpdGNoPDw1IGlzIGZyb20gMTEuMi44IHAxNTgsCisJICAgaXRzIHRoZSBwaXRjaCAvIDggdGhlbiBsZWZ0IHNoaWZ0ZWQgOCwKKwkgICBzbyAocGl0Y2ggPj4gMykgPDwgOCAqLworCU9VVF9SSU5HKCBDTURfT1BfRlJPTlRCVUZGRVJfSU5GTyB8IChwaXRjaDw8NSkgLyp8IEFTWU5DX0ZMSVAgKi8gKTsKKwlpZiAoIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCApIHsKKwkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX29mZnNldCApOworCQlkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0gMTsKKwl9IGVsc2UgeworCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X29mZnNldCApOworCQlkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0gMDsKKwl9CisJT1VUX1JJTkcoMCk7CisJQURWQU5DRV9MUF9SSU5HKCk7CisKKwlCRUdJTl9MUF9SSU5HKDIpOworCU9VVF9SSU5HKCBDTURfT1BfV0FJVF9GT1JfRVZFTlQgfCBXQUlUX0ZPUl9QTEFORV9BX0ZMSVAgKTsKKwlPVVRfUklORyggMCApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJLyogSW5jcmVtZW50IHRoZSBmcmFtZSBjb3VudGVyLiAgVGhlIGNsaWVudC1zaWRlIDNEIGRyaXZlciBtdXN0CisJICogdGhyb3R0bGUgdGhlIGZyYW1lcmF0ZSBieSB3YWl0aW5nIGZvciB0aGlzIHZhbHVlIGJlZm9yZQorCSAqIHBlcmZvcm1pbmcgdGhlIHN3YXBidWZmZXIgaW9jdGwuCisJICovCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CisKK30KKworc3RhdGljIHZvaWQgaTgxMF9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqZGV2KQoreworICAgICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgCVJJTkdfTE9DQUxTOworCisvKiAgCXByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7ICovCisKKyAgCWk4MTBfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisgICAJQkVHSU5fTFBfUklORyg0KTsKKyAgIAlPVVRfUklORyggSU5TVF9QQVJTRVJfQ0xJRU5UIHwgSU5TVF9PUF9GTFVTSCB8IElOU1RfRkxVU0hfTUFQX0NBQ0hFICk7CisgICAJT1VUX1JJTkcoIENNRF9SRVBPUlRfSEVBRCApOworICAgICAgCU9VVF9SSU5HKCAwICk7CisgICAgICAJT1VUX1JJTkcoIDAgKTsKKyAgIAlBRFZBTkNFX0xQX1JJTkcoKTsKKworCWk4MTBfd2FpdF9yaW5nKCBkZXYsIGRldl9wcml2LT5yaW5nLlNpemUgLSA4ICk7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9mbHVzaF9xdWV1ZShkcm1fZGV2aWNlX3QgKmRldikKK3sKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKyAgIAlpbnQgaSwgcmV0ID0gMDsKKyAgIAlSSU5HX0xPQ0FMUzsKKwkKKy8qICAJcHJpbnRrKCIlc1xuIiwgX19GVU5DVElPTl9fKTsgKi8KKworICAgCWk4MTBfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisgICAJQkVHSU5fTFBfUklORygyKTsKKyAgICAgIAlPVVRfUklORyggQ01EX1JFUE9SVF9IRUFEICk7CisgICAgICAJT1VUX1JJTkcoIDAgKTsKKyAgICAgIAlBRFZBTkNFX0xQX1JJTkcoKTsKKworCWk4MTBfd2FpdF9yaW5nKCBkZXYsIGRldl9wcml2LT5yaW5nLlNpemUgLSA4ICk7CisKKyAgIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgeworCSAgIAlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFsgaSBdOworCSAgIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwkJaW50IHVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MTBfQlVGX0hBUkRXQVJFLAorCQkJCSAgIEk4MTBfQlVGX0ZSRUUpOworCisJCWlmICh1c2VkID09IEk4MTBfQlVGX0hBUkRXQVJFKQorCQkJRFJNX0RFQlVHKCJyZWNsYWltZWQgZnJvbSBIQVJEV0FSRVxuIik7CisJCWlmICh1c2VkID09IEk4MTBfQlVGX0NMSUVOVCkKKwkJCURSTV9ERUJVRygic3RpbGwgb24gY2xpZW50XG4iKTsKKwl9CisKKyAgIAlyZXR1cm4gcmV0OworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgKi8KK3ZvaWQgaTgxMF9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWludAkJIGk7CisKKwlpZiAoIWRtYSkgcmV0dXJuOworICAgICAgCWlmICghZGV2LT5kZXZfcHJpdmF0ZSkgcmV0dXJuOworCWlmICghZG1hLT5idWZsaXN0KSByZXR1cm47CisKKyAgICAgICAgaTgxMF9mbHVzaF9xdWV1ZShkZXYpOworCisJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkgICAJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbIGkgXTsKKwkgICAJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJCWlmIChidWYtPmZpbHAgPT0gZmlscCAmJiBidWZfcHJpdikgeworCQkJaW50IHVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MTBfQlVGX0NMSUVOVCwKKwkJCQkJICAgSTgxMF9CVUZfRlJFRSk7CisKKwkJCWlmICh1c2VkID09IEk4MTBfQlVGX0NMSUVOVCkKKwkJCQlEUk1fREVCVUcoInJlY2xhaW1lZCBmcm9tIGNsaWVudFxuIik7CisJCQlpZiAoYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPT0gSTgxMF9CVUZfTUFQUEVEKQorCQkgICAgIAkJYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPSBJODEwX0JVRl9VTk1BUFBFRDsKKwkJfQorCX0KK30KKworaW50IGk4MTBfZmx1c2hfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAJZHJtX2ZpbGVfdAkgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisgICAJZHJtX2RldmljZV90CSAgKmRldgkgID0gcHJpdi0+aGVhZC0+ZGV2OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKyAgIAlpODEwX2ZsdXNoX3F1ZXVlKGRldik7CisgICAJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpODEwX2RtYV92ZXJ0ZXgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworICAgICAgCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOworICAgCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MTBfc2FyZWFfdCAqKQorICAgICAJCQkJCWRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9pODEwX3ZlcnRleF90IHZlcnRleDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdmVydGV4LCAoZHJtX2k4MTBfdmVydGV4X3QgX191c2VyICopYXJnLCBzaXplb2YodmVydGV4KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlEUk1fREVCVUcoImk4MTAgZG1hIHZlcnRleCwgaWR4ICVkIHVzZWQgJWQgZGlzY2FyZCAlZFxuIiwKKwkJICB2ZXJ0ZXguaWR4LCB2ZXJ0ZXgudXNlZCwgdmVydGV4LmRpc2NhcmQpOworCisJaWYgKHZlcnRleC5pZHggPCAwIHx8IHZlcnRleC5pZHggPiBkbWEtPmJ1Zl9jb3VudCkgCisJCXJldHVybiAtRUlOVkFMOworCisJaTgxMF9kbWFfZGlzcGF0Y2hfdmVydGV4KCBkZXYsCisJCQkJICBkbWEtPmJ1Zmxpc3RbIHZlcnRleC5pZHggXSwKKwkJCQkgIHZlcnRleC5kaXNjYXJkLCB2ZXJ0ZXgudXNlZCApOworCisgICAJYXRvbWljX2FkZCh2ZXJ0ZXgudXNlZCwgJmRldi0+Y291bnRzW19EUk1fU1RBVF9TRUNPTkRBUlldKTsKKwlhdG9taWNfaW5jKCZkZXYtPmNvdW50c1tfRFJNX1NUQVRfRE1BXSk7CisJc2FyZWFfcHJpdi0+bGFzdF9lbnF1ZXVlID0gZGV2X3ByaXYtPmNvdW50ZXItMTsKKyAgIAlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gKGludCkgaHdfc3RhdHVzWzVdOworCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGk4MTBfY2xlYXJfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faTgxMF9jbGVhcl90IGNsZWFyOworCisgICAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbGVhciwgKGRybV9pODEwX2NsZWFyX3QgX191c2VyICopYXJnLCBzaXplb2YoY2xlYXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworIAkvKiBHSDogU29tZW9uZSdzIGRvaW5nIG5hc3R5IHRoaW5ncy4uLiAqLworIAlpZiAoIWRldi0+ZGV2X3ByaXZhdGUpIHsKKyAJCXJldHVybiAtRUlOVkFMOworIAl9CisKKwlpODEwX2RtYV9kaXNwYXRjaF9jbGVhciggZGV2LCBjbGVhci5mbGFncywKKwkJCQkgY2xlYXIuY2xlYXJfY29sb3IsCisJCQkJIGNsZWFyLmNsZWFyX2RlcHRoICk7CisgICAJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9zd2FwX2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKworCURSTV9ERUJVRygiaTgxMF9zd2FwX2J1ZnNcbiIpOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlpODEwX2RtYV9kaXNwYXRjaF9zd2FwKCBkZXYgKTsKKyAgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODEwX2dldGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAJZHJtX2ZpbGVfdAkgICpwcml2CSAgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAqZGV2CSAgICA9IHByaXYtPmhlYWQtPmRldjsKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CisgICAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgxMF9zYXJlYV90ICopCisgICAgIAkJCQkJZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisKKyAgICAgIAlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gKGludCkgaHdfc3RhdHVzWzVdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MTBfZ2V0YnVmKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICAgID0gcHJpdi0+aGVhZC0+ZGV2OworCWludAkJICByZXRjb2RlICAgPSAwOworCWRybV9pODEwX2RtYV90CSAgZDsKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisgICAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CisgICAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgxMF9zYXJlYV90ICopCisgICAgIAkJCQkJZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisKKyAgIAlpZiAoY29weV9mcm9tX3VzZXIoJmQsIChkcm1faTgxMF9kbWFfdCBfX3VzZXIgKilhcmcsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlkLmdyYW50ZWQgPSAwOworCisJcmV0Y29kZSA9IGk4MTBfZG1hX2dldF9idWZmZXIoZGV2LCAmZCwgZmlscCk7CisKKwlEUk1fREVCVUcoImk4MTBfZG1hOiAlZCByZXR1cm5pbmcgJWQsIGdyYW50ZWQgPSAlZFxuIiwKKwkJICBjdXJyZW50LT5waWQsIHJldGNvZGUsIGQuZ3JhbnRlZCk7CisKKwlpZiAoY29weV90b191c2VyKChkcm1fZG1hX3QgX191c2VyICopYXJnLCAmZCwgc2l6ZW9mKGQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisgICAJc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IChpbnQpIGh3X3N0YXR1c1s1XTsKKworCXJldHVybiByZXRjb2RlOworfQorCitzdGF0aWMgaW50IGk4MTBfY29weWJ1ZihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwkvKiBOZXZlciBjb3B5IC0gMi40LnggZG9lc24ndCBuZWVkIGl0ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9kb2NvcHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwkvKiBOZXZlciBjb3B5IC0gMi40LnggZG9lc24ndCBuZWVkIGl0ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX21jKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZiwgaW50IHVzZWQsCisJCXVuc2lnbmVkIGludCBsYXN0X3JlbmRlcikKK3sKKwlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWJ1Zi0+YnVzX2FkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IGFkZHJlc3MgLSBkZXYtPmFncC0+YmFzZTsKKwlpbnQgdTsKKwlSSU5HX0xPQ0FMUzsKKworCWk4MTBfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisJdSA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgxMF9CVUZfQ0xJRU5ULAorCQlJODEwX0JVRl9IQVJEV0FSRSk7CisJaWYgKHUgIT0gSTgxMF9CVUZfQ0xJRU5UKSB7CisJCURSTV9ERUJVRygiTUMgZm91bmQgYnVmZmVyIHRoYXQgaXNuJ3QgbWluZSFcbiIpOworCX0KKworCWlmICh1c2VkID4gNCoxMDI0KQorCQl1c2VkID0gMDsKKworCXNhcmVhX3ByaXYtPmRpcnR5ID0gMHg3ZjsKKworCURSTV9ERUJVRygiZGlzcGF0Y2ggbWMgYWRkciAweCVseCwgdXNlZCAweCV4XG4iLAorCQlhZGRyZXNzLCB1c2VkKTsKKworCWRldl9wcml2LT5jb3VudGVyKys7CisJRFJNX0RFQlVHKCJkaXNwYXRjaCBjb3VudGVyIDogJWxkXG4iLCBkZXZfcHJpdi0+Y291bnRlcik7CisJRFJNX0RFQlVHKCJpODEwX2RtYV9kaXNwYXRjaF9tY1xuIik7CisJRFJNX0RFQlVHKCJzdGFydCA6ICVseFxuIiwgc3RhcnQpOworCURSTV9ERUJVRygidXNlZCA6ICVkXG4iLCB1c2VkKTsKKwlEUk1fREVCVUcoInN0YXJ0ICsgdXNlZCAtIDQgOiAlbGRcbiIsIHN0YXJ0ICsgdXNlZCAtIDQpOworCisJaWYgKGJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID09IEk4MTBfQlVGX01BUFBFRCkgeworCQlpZiAodXNlZCAmIDQpIHsKKwkJCSoodTMyICopKCh1MzIpYnVmX3ByaXYtPnZpcnR1YWwgKyB1c2VkKSA9IDA7CisJCQl1c2VkICs9IDQ7CisJCX0KKworCQlpODEwX3VubWFwX2J1ZmZlcihidWYpOworCX0KKwlCRUdJTl9MUF9SSU5HKDQpOworCU9VVF9SSU5HKCBDTURfT1BfQkFUQ0hfQlVGRkVSICk7CisJT1VUX1JJTkcoIHN0YXJ0IHwgQkIxX1BST1RFQ1RFRCApOworCU9VVF9SSU5HKCBzdGFydCArIHVzZWQgLSA0ICk7CisJT1VUX1JJTkcoIDAgKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCisJQkVHSU5fTFBfUklORyg4KTsKKwlPVVRfUklORyggQ01EX1NUT1JFX0RXT1JEX0lEWCApOworCU9VVF9SSU5HKCBidWZfcHJpdi0+bXlfdXNlX2lkeCApOworCU9VVF9SSU5HKCBJODEwX0JVRl9GUkVFICk7CisJT1VUX1JJTkcoIDAgKTsKKworCU9VVF9SSU5HKCBDTURfU1RPUkVfRFdPUkRfSURYICk7CisJT1VUX1JJTkcoIDE2ICk7CisJT1VUX1JJTkcoIGxhc3RfcmVuZGVyICk7CisJT1VUX1JJTkcoIDAgKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK30KKworc3RhdGljIGludCBpODEwX2RtYV9tYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKKwlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pODEwX3NhcmVhX3QgKikKKwkJZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX2k4MTBfbWNfdCBtYzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbWMsIChkcm1faTgxMF9tY190IF9fdXNlciAqKWFyZywgc2l6ZW9mKG1jKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlpZiAobWMuaWR4ID49IGRtYS0+YnVmX2NvdW50IHx8IG1jLmlkeCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaTgxMF9kbWFfZGlzcGF0Y2hfbWMoZGV2LCBkbWEtPmJ1Zmxpc3RbbWMuaWR4XSwgbWMudXNlZCwKKwkJbWMubGFzdF9yZW5kZXIgKTsKKworCWF0b21pY19hZGQobWMudXNlZCwgJmRldi0+Y291bnRzW19EUk1fU1RBVF9TRUNPTkRBUlldKTsKKwlhdG9taWNfaW5jKCZkZXYtPmNvdW50c1tfRFJNX1NUQVRfRE1BXSk7CisJc2FyZWFfcHJpdi0+bGFzdF9lbnF1ZXVlID0gZGV2X3ByaXYtPmNvdW50ZXItMTsKKwlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gKGludCkgaHdfc3RhdHVzWzVdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9yc3RhdHVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwlyZXR1cm4gKGludCkoKCh1MzIgKikoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKSlbNF0pOworfQorCitzdGF0aWMgaW50IGk4MTBfb3YwX2luZm8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTgxMF9vdmVybGF5X3QgZGF0YTsKKworCWRhdGEub2Zmc2V0ID0gZGV2X3ByaXYtPm92ZXJsYXlfb2Zmc2V0OworCWRhdGEucGh5c2ljYWwgPSBkZXZfcHJpdi0+b3ZlcmxheV9waHlzaWNhbDsKKwlpZiAoY29weV90b191c2VyKChkcm1faTgxMF9vdmVybGF5X3QgX191c2VyICopYXJnLCZkYXRhLHNpemVvZihkYXRhKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MTBfZnN0YXR1cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlyZXR1cm4gSTgxMF9SRUFEKDB4MzAwMDgpOworfQorCitzdGF0aWMgaW50IGk4MTBfb3YwX2ZsaXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisJLy9UZWxsIHRoZSBvdmVybGF5IHRvIHVwZGF0ZQorCUk4MTBfV1JJVEUoMHgzMDAwMCxkZXZfcHJpdi0+b3ZlcmxheV9waHlzaWNhbCB8IDB4ODAwMDAwMDApOworCisJcmV0dXJuIDA7Cit9CisKKworLyogTm90IHN1cmUgd2h5IHRoaXMgaXNuJ3Qgc2V0IGFsbCB0aGUgdGltZToKKyAqLyAKK3N0YXRpYyB2b2lkIGk4MTBfZG9faW5pdF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCQorCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAxOworCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworfQorCitzdGF0aWMgaW50IGk4MTBfZG9fY2xlYW51cF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSAhPSAwKQorCQlpODEwX2RtYV9kaXNwYXRjaF9mbGlwKCBkZXYgKTsKKworCWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODEwX2ZsaXBfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlpZiAoIWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nKSAKKwkJaTgxMF9kb19pbml0X3BhZ2VmbGlwKCBkZXYgKTsKKworCWk4MTBfZG1hX2Rpc3BhdGNoX2ZsaXAoIGRldiApOworICAgCXJldHVybiAwOworfQorCit2b2lkIGk4MTBfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWk4MTBfZG1hX2NsZWFudXAoIGRldiApOworfQorCit2b2lkIGk4MTBfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCkKK3sKKwlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgeworCQlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwkJaWYgKGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nKSB7CisJCQlpODEwX2RvX2NsZWFudXBfcGFnZWZsaXAoZGV2KTsKKwkJfQorCX0KK30KKwordm9pZCBpODEwX2RyaXZlcl9yZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpODEwX3JlY2xhaW1fYnVmZmVycyhkZXYsIGZpbHApOworfQorCitpbnQgaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlpODEwX2RtYV9xdWllc2NlbnQoIGRldiApOworCXJldHVybiAwOworfQorCitkcm1faW9jdGxfZGVzY190IGk4MTBfaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9JTklUKV0gICAgPSB7IGk4MTBfZG1hX2luaXQsICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX1ZFUlRFWCldICA9IHsgaTgxMF9kbWFfdmVydGV4LCAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfQ0xFQVIpXSAgID0geyBpODEwX2NsZWFyX2J1ZnMsICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9GTFVTSCldICAgPSB7IGk4MTBfZmx1c2hfaW9jdGwsIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0dFVEFHRSldICA9IHsgaTgxMF9nZXRhZ2UsICAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfR0VUQlVGKV0gID0geyBpODEwX2dldGJ1ZiwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9TV0FQKV0gICAgPSB7IGk4MTBfc3dhcF9idWZzLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0NPUFkpXSAgICA9IHsgaTgxMF9jb3B5YnVmLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfRE9DT1BZKV0gID0geyBpODEwX2RvY29weSwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9PVjBJTkZPKV0gPSB7IGk4MTBfb3YwX2luZm8sICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0ZTVEFUVVMpXSA9IHsgaTgxMF9mc3RhdHVzLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfT1YwRkxJUCldID0geyBpODEwX292MF9mbGlwLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9NQyldICAgICAgPSB7IGk4MTBfZG1hX21jLCAgICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX1JTVEFUVVMpXSA9IHsgaTgxMF9yc3RhdHVzLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfRkxJUCldICAgID0geyBpODEwX2ZsaXBfYnVmcywgICAxLCAwIH0KK307CisKK2ludCBpODEwX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKGk4MTBfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2FjNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RybS5oCkBAIC0wLDAgKzEsMjg5IEBACisjaWZuZGVmIF9JODEwX0RSTV9IXworI2RlZmluZSBfSTgxMF9EUk1fSF8KKworLyogV0FSTklORzogVGhlc2UgZGVmaW5lcyBtdXN0IGJlIHRoZSBzYW1lIGFzIHdoYXQgdGhlIFhzZXJ2ZXIgdXNlcy4KKyAqIGlmIHlvdSBjaGFuZ2UgdGhlbSwgeW91IG11c3QgY2hhbmdlIHRoZSBkZWZpbmVzIGluIHRoZSBYc2VydmVyLgorICovCisKKyNpZm5kZWYgX0k4MTBfREVGSU5FU18KKyNkZWZpbmUgX0k4MTBfREVGSU5FU18KKworI2RlZmluZSBJODEwX0RNQV9CVUZfT1JERVIJCTEyCisjZGVmaW5lIEk4MTBfRE1BX0JVRl9TWiAJCSgxPDxJODEwX0RNQV9CVUZfT1JERVIpCisjZGVmaW5lIEk4MTBfRE1BX0JVRl9OUiAJCTI1NgorI2RlZmluZSBJODEwX05SX1NBUkVBX0NMSVBSRUNUUyAJOAorCisvKiBFYWNoIHJlZ2lvbiBpcyBhIG1pbmltdW0gb2YgNjRrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgNjQgb2YgdGhlbS4KKyAqLworI2RlZmluZSBJODEwX05SX1RFWF9SRUdJT05TIDY0CisjZGVmaW5lIEk4MTBfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUgMTYKKyNlbmRpZgorCisjZGVmaW5lIEk4MTBfVVBMT0FEX1RFWDBJTUFHRSAgMHgxIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODEwX1VQTE9BRF9URVgxSU1BR0UgIDB4MiAvKiBoYW5kbGVkIGNsaWVudHNpZGUgKi8KKyNkZWZpbmUgSTgxMF9VUExPQURfQ1RYICAgICAgICAweDQKKyNkZWZpbmUgSTgxMF9VUExPQURfQlVGRkVSUyAgICAweDgKKyNkZWZpbmUgSTgxMF9VUExPQURfVEVYMCAgICAgICAweDEwCisjZGVmaW5lIEk4MTBfVVBMT0FEX1RFWDEgICAgICAgMHgyMAorI2RlZmluZSBJODEwX1VQTE9BRF9DTElQUkVDVFMgIDB4NDAKKworCisvKiBJbmRpY2VzIGludG8gYnVmLlNldHVwIHdoZXJlIHZhcmlvdXMgYml0cyBvZiBzdGF0ZSBhcmUgbWlycm9yZWQgcGVyCisgKiBjb250ZXh0IGFuZCBwZXIgYnVmZmVyLiAgVGhlc2UgY2FuIGJlIGZpcmVkIGF0IHRoZSBjYXJkIGFzIGEgdW5pdCwKKyAqIG9yIGluIGEgcGllY2V3aXNlIGZhc2hpb24gYXMgcmVxdWlyZWQuCisgKi8KKworLyogRGVzdGJ1ZmZlciBzdGF0ZSAKKyAqICAgIC0gYmFja2J1ZmZlciBsaW5lYXIgb2Zmc2V0IGFuZCBwaXRjaCAtLSBpbnZhcmllbnQgaW4gdGhlIGN1cnJlbnQgZHJpCisgKiAgICAtIHpidWZmZXIgbGluZWFyIG9mZnNldCBhbmQgcGl0Y2ggLS0gYWxzbyBpbnZhcmllbnQKKyAqICAgIC0gZHJhd2luZyBvcmlnaW4gaW4gYmFjayBhbmQgZGVwdGggYnVmZmVycy4KKyAqCisgKiBLZWVwIHRoZSBkZXB0aC9iYWNrIGJ1ZmZlciBzdGF0ZSBoZXJlIHRvIGFjY29tbW9kYXRlIHByaXZhdGUgYnVmZmVycworICogaW4gdGhlIGZ1dHVyZS4KKyAqLworI2RlZmluZSBJODEwX0RFU1RSRUdfREkwICAwCS8qIENNRF9PUF9ERVNUQlVGRkVSX0lORk8gKDIgZHdvcmRzKSAqLworI2RlZmluZSBJODEwX0RFU1RSRUdfREkxICAxCisjZGVmaW5lIEk4MTBfREVTVFJFR19EVjAgIDIJLyogR0ZYX09QX0RFU1RCVUZGRVJfVkFSUyAoMiBkd29yZHMpICovCisjZGVmaW5lIEk4MTBfREVTVFJFR19EVjEgIDMKKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RSMCAgNAkvKiBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAoNCBkd29yZHMpICovCisjZGVmaW5lIEk4MTBfREVTVFJFR19EUjEgIDUKKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RSMiAgNgorI2RlZmluZSBJODEwX0RFU1RSRUdfRFIzICA3CisjZGVmaW5lIEk4MTBfREVTVFJFR19EUjQgIDgKKyNkZWZpbmUgSTgxMF9ERVNUX1NFVFVQX1NJWkUgMTAKKworLyogQ29udGV4dCBzdGF0ZQorICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX0NGMCAgIDAJLyogR0ZYX09QX0NPTE9SX0ZBQ1RPUiAqLworI2RlZmluZSBJODEwX0NUWFJFR19DRjEgICAxCQorI2RlZmluZSBJODEwX0NUWFJFR19TVDAgICAyICAgICAvKiBHRlhfT1BfU1RJUFBMRSAqLworI2RlZmluZSBJODEwX0NUWFJFR19TVDEgICAzCisjZGVmaW5lIEk4MTBfQ1RYUkVHX1ZGICAgIDQJLyogR0ZYX09QX1ZFUlRFWF9GTVQgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTVQgICAgNQkvKiBHRlhfT1BfTUFQX1RFWEVMUyAqLworI2RlZmluZSBJODEwX0NUWFJFR19NQzAgICA2CS8qIEdGWF9PUF9NQVBfQ09MT1JfU1RBR0VTIC0gc3RhZ2UgMCAqLworI2RlZmluZSBJODEwX0NUWFJFR19NQzEgICA3ICAgICAvKiBHRlhfT1BfTUFQX0NPTE9SX1NUQUdFUyAtIHN0YWdlIDEgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTUMyICAgOAkvKiBHRlhfT1BfTUFQX0NPTE9SX1NUQUdFUyAtIHN0YWdlIDIgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTUEwICAgOQkvKiBHRlhfT1BfTUFQX0FMUEhBX1NUQUdFUyAtIHN0YWdlIDAgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTUExICAgMTAJLyogR0ZYX09QX01BUF9BTFBIQV9TVEFHRVMgLSBzdGFnZSAxICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX01BMiAgIDExCS8qIEdGWF9PUF9NQVBfQUxQSEFfU1RBR0VTIC0gc3RhZ2UgMiAqLworI2RlZmluZSBJODEwX0NUWFJFR19TRE0gICAxMgkvKiBHRlhfT1BfU1JDX0RFU1RfTU9OTyAqLworI2RlZmluZSBJODEwX0NUWFJFR19GT0cgICAxMwkvKiBHRlhfT1BfRk9HX0NPTE9SICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX0IxICAgIDE0CS8qIEdGWF9PUF9CT09MXzEgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfQjIgICAgMTUJLyogR0ZYX09QX0JPT0xfMiAqLworI2RlZmluZSBJODEwX0NUWFJFR19MQ1MgICAxNgkvKiBHRlhfT1BfTElORVdJRFRIX0NVTExfU0hBREVfTU9ERSAqLworI2RlZmluZSBJODEwX0NUWFJFR19QViAgICAxNwkvKiBHRlhfT1BfUFZfUlVMRSAtLSBJbnZhcmllbnQhICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX1pBICAgIDE4CS8qIEdGWF9PUF9aQklBU19BTFBIQUZVTkMgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfQUEgICAgMTkJLyogR0ZYX09QX0FOVElBTElBUyAqLworI2RlZmluZSBJODEwX0NUWF9TRVRVUF9TSVpFIDIwIAorCisvKiBUZXh0dXJlIHN0YXRlIChwZXIgdGV4IHVuaXQpCisgKi8KKyNkZWZpbmUgSTgxMF9URVhSRUdfTUkwICAwCS8qIEdGWF9PUF9NQVBfSU5GTyAoNCBkd29yZHMpICovCisjZGVmaW5lIEk4MTBfVEVYUkVHX01JMSAgMQkKKyNkZWZpbmUgSTgxMF9URVhSRUdfTUkyICAyCQorI2RlZmluZSBJODEwX1RFWFJFR19NSTMgIDMJCisjZGVmaW5lIEk4MTBfVEVYUkVHX01GICAgNAkvKiBHRlhfT1BfTUFQX0ZJTFRFUiAqLworI2RlZmluZSBJODEwX1RFWFJFR19NTEMgIDUJLyogR0ZYX09QX01BUF9MT0RfQ1RMICovCisjZGVmaW5lIEk4MTBfVEVYUkVHX01MTCAgNgkvKiBHRlhfT1BfTUFQX0xPRF9MSU1JVFMgKi8KKyNkZWZpbmUgSTgxMF9URVhSRUdfTUNTICA3CS8qIEdGWF9PUF9NQVBfQ09PUkRfU0VUUyA/Pz8gKi8KKyNkZWZpbmUgSTgxMF9URVhfU0VUVVBfU0laRSA4CisKKy8qIEZsYWdzIGZvciBjbGVhciBpb2N0bAorICovCisjZGVmaW5lIEk4MTBfRlJPTlQgICAweDEKKyNkZWZpbmUgSTgxMF9CQUNLICAgIDB4MgorI2RlZmluZSBJODEwX0RFUFRIICAgMHg0CisKK3R5cGVkZWYgZW51bSBfZHJtX2k4MTBfaW5pdF9mdW5jIHsKKwlJODEwX0lOSVRfRE1BID0gMHgwMSwKKwlJODEwX0NMRUFOVVBfRE1BID0gMHgwMiwKKwlJODEwX0lOSVRfRE1BXzFfNCA9IDB4MDMKKyB9IGRybV9pODEwX2luaXRfZnVuY190OworCisvKiBUaGlzIGlzIHRoZSBpbml0IHN0cnVjdHVyZSBhZnRlciB2MS4yICovCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfaW5pdCB7CisJZHJtX2k4MTBfaW5pdF9mdW5jX3QgZnVuYzsKKyNpZiBDT05GSUdfWEZSRUU4Nl9WRVJTSU9OIDwgWEZSRUU4Nl9WRVJTSU9OKDQsMSwwLDApCisJaW50IHJpbmdfbWFwX2lkeDsKKwlpbnQgYnVmZmVyX21hcF9pZHg7CisjZWxzZQorCXVuc2lnbmVkIGludCBtbWlvX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyc19vZmZzZXQ7CisjZW5kaWYKKwlpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJpbmdfc3RhcnQ7CisJdW5zaWduZWQgaW50IHJpbmdfZW5kOworCXVuc2lnbmVkIGludCByaW5nX3NpemU7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgb3ZlcmxheV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IG92ZXJsYXlfcGh5c2ljYWw7CisJdW5zaWduZWQgaW50IHc7CisJdW5zaWduZWQgaW50IGg7CisJdW5zaWduZWQgaW50IHBpdGNoOworCXVuc2lnbmVkIGludCBwaXRjaF9iaXRzOyAKK30gZHJtX2k4MTBfaW5pdF90OworCisvKiBUaGlzIGlzIHRoZSBpbml0IHN0cnVjdHVyZSBwcmlvciB0byB2MS4yICovCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfcHJlMTJfaW5pdCB7CisJZHJtX2k4MTBfaW5pdF9mdW5jX3QgZnVuYzsKKwl1bnNpZ25lZCBpbnQgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGJ1ZmZlcnNfb2Zmc2V0OworCWludCBzYXJlYV9wcml2X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmluZ19zdGFydDsKKwl1bnNpZ25lZCBpbnQgcmluZ19lbmQ7CisJdW5zaWduZWQgaW50IHJpbmdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0OworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0OworCXVuc2lnbmVkIGludCB3OworCXVuc2lnbmVkIGludCBoOworCXVuc2lnbmVkIGludCBwaXRjaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2hfYml0czsgCit9IGRybV9pODEwX3ByZTEyX2luaXRfdDsKKworLyogV2FybmluZzogSWYgeW91IGNoYW5nZSB0aGUgU0FSRUEgc3RydWN0dXJlIHlvdSBtdXN0IGNoYW5nZSB0aGUgWHNlcnZlcgorICogc3RydWN0dXJlIGFzIHdlbGwgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODEwX3RleF9yZWdpb24geworCXVuc2lnbmVkIGNoYXIgbmV4dCwgcHJldjsgLyogaW5kaWNlcyB0byBmb3JtIGEgY2lyY3VsYXIgTFJVICAqLworCXVuc2lnbmVkIGNoYXIgaW5fdXNlOwkvKiBvd25lZCBieSBhIGNsaWVudCwgb3IgZnJlZT8gKi8KKwlpbnQgYWdlOwkJLyogdHJhY2tlZCBieSBjbGllbnRzIHRvIHVwZGF0ZSBsb2NhbCBMUlUncyAqLworfSBkcm1faTgxMF90ZXhfcmVnaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF9zYXJlYSB7CisgICAJdW5zaWduZWQgaW50IENvbnRleHRTdGF0ZVtJODEwX0NUWF9TRVRVUF9TSVpFXTsKKyAgIAl1bnNpZ25lZCBpbnQgQnVmZmVyU3RhdGVbSTgxMF9ERVNUX1NFVFVQX1NJWkVdOworICAgCXVuc2lnbmVkIGludCBUZXhTdGF0ZVsyXVtJODEwX1RFWF9TRVRVUF9TSVpFXTsKKyAgIAl1bnNpZ25lZCBpbnQgZGlydHk7CisKKwl1bnNpZ25lZCBpbnQgbmJveDsKKwlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbSTgxMF9OUl9TQVJFQV9DTElQUkVDVFNdOworCisJLyogTWFpbnRhaW4gYW4gTFJVIG9mIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiB0ZXh0dXJlIHNwYWNlLiAgSWYKKwkgKiB5b3UgdGhpbmsgeW91IG93biBhIHJlZ2lvbiBvZiB0ZXh0dXJlIG1lbW9yeSwgYW5kIGl0IGhhcyBhbgorCSAqIGFnZSBkaWZmZXJlbnQgdG8gdGhlIG9uZSB5b3Ugc2V0LCB0aGVuIHlvdSBhcmUgbWlzdGFrZW4gYW5kCisJICogaXQgaGFzIGJlZW4gc3RvbGVuIGJ5IGFub3RoZXIgY2xpZW50LiAgSWYgZ2xvYmFsIHRleEFnZQorCSAqIGhhc24ndCBjaGFuZ2VkLCB0aGVyZSBpcyBubyBuZWVkIHRvIHdhbGsgdGhlIGxpc3QuCisJICoKKwkgKiBUaGVzZSByZWdpb25zIGNhbiBiZSB1c2VkIGFzIGEgcHJveHkgZm9yIHRoZSBmaW5lLWdyYWluZWQKKwkgKiB0ZXh0dXJlIGluZm9ybWF0aW9uIG9mIG90aGVyIGNsaWVudHMgLSBieSBtYWludGFpbmluZyB0aGVtCisJICogaW4gdGhlIHNhbWUgbHJ1IHdoaWNoIGlzIHVzZWQgdG8gYWdlIHRoZWlyIG93biB0ZXh0dXJlcywKKwkgKiBjbGllbnRzIGhhdmUgYW4gYXBwcm94aW1hdGUgbHJ1IGZvciB0aGUgd2hvbGUgb2YgZ2xvYmFsCisJICogdGV4dHVyZSBzcGFjZSwgYW5kIGNhbiBtYWtlIGluZm9ybWVkIGRlY2lzaW9ucyBhcyB0byB3aGljaAorCSAqIGFyZWFzIHRvIGtpY2sgb3V0LiAgVGhlcmUgaXMgbm8gbmVlZCB0byBjaG9vc2Ugd2hldGhlciB0bworCSAqIGtpY2sgb3V0IHlvdXIgb3duIHRleHR1cmUgb3Igc29tZW9uZSBlbHNlJ3MgLSBzaW1wbHkgZWplY3QKKwkgKiB0aGVtIGFsbCBpbiBMUlUgb3JkZXIuICAKKwkgKi8KKyAgIAorCWRybV9pODEwX3RleF9yZWdpb25fdCB0ZXhMaXN0W0k4MTBfTlJfVEVYX1JFR0lPTlMrMV07IAorCQkJCS8qIExhc3QgZWx0IGlzIHNlbnRpbmFsICovCisgICAgICAgIGludCB0ZXhBZ2U7CQkvKiBsYXN0IHRpbWUgdGV4dHVyZSB3YXMgdXBsb2FkZWQgKi8KKyAgICAgICAgaW50IGxhc3RfZW5xdWV1ZTsJLyogbGFzdCB0aW1lIGEgYnVmZmVyIHdhcyBlbnF1ZXVlZCAqLworCWludCBsYXN0X2Rpc3BhdGNoOwkvKiBhZ2Ugb2YgdGhlIG1vc3QgcmVjZW50bHkgZGlzcGF0Y2hlZCBidWZmZXIgKi8KKwlpbnQgbGFzdF9xdWllc2NlbnQ7ICAgICAvKiAgKi8KKwlpbnQgY3R4T3duZXI7CQkvKiBsYXN0IGNvbnRleHQgdG8gdXBsb2FkIHN0YXRlICovCisKKwlpbnQgdmVydGV4X3ByaW07CisKKwlpbnQgcGZfZW5hYmxlZDsgICAgICAgICAgICAgICAvKiBpcyBwYWdlZmxpcHBpbmcgYWxsb3dlZD8gKi8KKwlpbnQgcGZfYWN0aXZlOworCWludCBwZl9jdXJyZW50X3BhZ2U7CSAgICAvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkPyAqLworfSBkcm1faTgxMF9zYXJlYV90OworCisvKiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGVzZSBkZWZpbmVzLCBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZQorICogZGVmaW5lcyBpbiB0aGUgWHNlcnZlciBmaWxlICh4Zjg2ZHJtTWdhLmgpCisgKi8KKworLyogaTgxMCBzcGVjaWZpYyBpb2N0bHMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgMHg0MCB0byAweDc5LgorICovCisjZGVmaW5lIERSTV9JODEwX0lOSVQJCTB4MDAKKyNkZWZpbmUgRFJNX0k4MTBfVkVSVEVYCQkweDAxCisjZGVmaW5lIERSTV9JODEwX0NMRUFSCQkweDAyCisjZGVmaW5lIERSTV9JODEwX0ZMVVNICQkweDAzCisjZGVmaW5lIERSTV9JODEwX0dFVEFHRQkJMHgwNAorI2RlZmluZSBEUk1fSTgxMF9HRVRCVUYJCTB4MDUKKyNkZWZpbmUgRFJNX0k4MTBfU1dBUAkJMHgwNgorI2RlZmluZSBEUk1fSTgxMF9DT1BZCQkweDA3CisjZGVmaW5lIERSTV9JODEwX0RPQ09QWQkJMHgwOAorI2RlZmluZSBEUk1fSTgxMF9PVjBJTkZPCTB4MDkKKyNkZWZpbmUgRFJNX0k4MTBfRlNUQVRVUwkweDBhCisjZGVmaW5lIERSTV9JODEwX09WMEZMSVAJMHgwYgorI2RlZmluZSBEUk1fSTgxMF9NQwkJMHgwYworI2RlZmluZSBEUk1fSTgxMF9SU1RBVFVTCTB4MGQKKyNkZWZpbmUgRFJNX0k4MTBfRkxJUAkJMHgwZQorCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0lOSVQJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9JTklULCBkcm1faTgxMF9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX1ZFUlRFWAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX1ZFUlRFWCwgZHJtX2k4MTBfdmVydGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0NMRUFSCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfQ0xFQVIsIGRybV9pODEwX2NsZWFyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0ZMVVNICQlEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfRkxVU0gpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0dFVEFHRQkJRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX0dFVEFHRSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfR0VUQlVGCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfR0VUQlVGLCBkcm1faTgxMF9kbWFfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfU1dBUAkJRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX1NXQVApCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0NPUFkJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9DT1BZLCBkcm1faTgxMF9jb3B5X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0RPQ09QWQkJRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX0RPQ09QWSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfT1YwSU5GTwkJRFJNX0lPUiggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX09WMElORk8sIGRybV9pODEwX292ZXJsYXlfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfRlNUQVRVUwkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX0ZTVEFUVVMpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX09WMEZMSVAJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9PVjBGTElQKQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9NQwkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX01DLCBkcm1faTgxMF9tY190KQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9SU1RBVFVTCQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfUlNUQVRVUykKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfRkxJUCAgICAgICAgICAgICBEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfRkxJUCkKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODEwX2NsZWFyIHsKKwlpbnQgY2xlYXJfY29sb3I7CisJaW50IGNsZWFyX2RlcHRoOworCWludCBmbGFnczsKK30gZHJtX2k4MTBfY2xlYXJfdDsKKworLyogVGhlc2UgbWF5IGJlIHBsYWNlaG9sZGVycyBpZiB3ZSBoYXZlIG1vcmUgY2xpcHJlY3RzIHRoYW4KKyAqIEk4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTLiAgSW4gdGhhdCBjYXNlLCB0aGUgY2xpZW50IHNldHMgZGlzY2FyZCB0bworICogZmFsc2UsIGluZGljYXRpbmcgdGhhdCB0aGUgYnVmZmVyIHdpbGwgYmUgZGlzcGF0Y2hlZCBhZ2FpbiB3aXRoIGEKKyAqIG5ldyBzZXQgb2YgY2xpcHJlY3RzLgorICovCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfdmVydGV4IHsKKyAgIAlpbnQgaWR4OwkJLyogYnVmZmVyIGluZGV4ICovCisJaW50IHVzZWQ7CQkvKiBuciBieXRlcyBpbiB1c2UgKi8KKwlpbnQgZGlzY2FyZDsJCS8qIGNsaWVudCBpcyBmaW5pc2hlZCB3aXRoIHRoZSBidWZmZXI/ICovCit9IGRybV9pODEwX3ZlcnRleF90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfY29weV90IHsKKyAgIAlpbnQgaWR4OwkJLyogYnVmZmVyIGluZGV4ICovCisJaW50IHVzZWQ7CQkvKiBuciBieXRlcyBpbiB1c2UgKi8KKwl2b2lkICphZGRyZXNzOwkJLyogQWRkcmVzcyB0byBjb3B5IGZyb20gKi8KK30gZHJtX2k4MTBfY29weV90OworCisjZGVmaW5lIFBSX1RSSUFOR0xFUyAgICAgICAgICgweDA8PDE4KQorI2RlZmluZSBQUl9UUklTVFJJUF8wICAgICAgICAoMHgxPDwxOCkKKyNkZWZpbmUgUFJfVFJJU1RSSVBfMSAgICAgICAgKDB4Mjw8MTgpCisjZGVmaW5lIFBSX1RSSUZBTiAgICAgICAgICAgICgweDM8PDE4KQorI2RlZmluZSBQUl9QT0xZR09OICAgICAgICAgICAoMHg0PDwxOCkKKyNkZWZpbmUgUFJfTElORVMgICAgICAgICAgICAgKDB4NTw8MTgpCisjZGVmaW5lIFBSX0xJTkVTVFJJUCAgICAgICAgICgweDY8PDE4KQorI2RlZmluZSBQUl9SRUNUUyAgICAgICAgICAgICAoMHg3PDwxOCkKKyNkZWZpbmUgUFJfTUFTSyAgICAgICAgICAgICAgKDB4Nzw8MTgpCisKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MTBfZG1hIHsKKwl2b2lkICp2aXJ0dWFsOworCWludCByZXF1ZXN0X2lkeDsKKwlpbnQgcmVxdWVzdF9zaXplOworCWludCBncmFudGVkOworfSBkcm1faTgxMF9kbWFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODEwX292ZXJsYXlfdCB7CisJdW5zaWduZWQgaW50IG9mZnNldDsgICAgLyogQWRkcmVzcyBvZiB0aGUgT3ZlcmxheSBSZWdzICovCisJdW5zaWduZWQgaW50IHBoeXNpY2FsOworfSBkcm1faTgxMF9vdmVybGF5X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF9tYyB7CisJaW50IGlkeDsgICAgICAgICAgICAgICAgLyogYnVmZmVyIGluZGV4ICovCisJaW50IHVzZWQ7ICAgICAgICAgICAgICAgLyogbnIgYnl0ZXMgaW4gdXNlICovCisJaW50IG51bV9ibG9ja3M7ICAgICAgICAgLyogbnVtYmVyIG9mIEdGWEJsb2NrcyAqLworCWludCAqbGVuZ3RoOyAgICAgICAgICAgIC8qIExpc3Qgb2YgbGVuZ3RocyBmb3IgR0ZYQmxvY2tzIChGVVRVUkUpKi8KKwl1bnNpZ25lZCBpbnQgbGFzdF9yZW5kZXI7IC8qIExhc3QgUmVuZGVyIFJlcXVlc3QgKi8KK30gZHJtX2k4MTBfbWNfdDsKKworCisjZW5kaWYgLyogX0k4MTBfRFJNX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1MWIzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuYwpAQCAtMCwwICsxLDEyNiBAQAorLyogaTgxMF9kcnYuYyAtLSBJODEwIGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IE1vbiBEZWMgMTMgMDE6NTY6MjIgMTk5OSBieSBqaGFydG1hbm5AcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqICAgIEplZmYgSGFydG1hbm4gPGpoYXJ0bWFubkB2YWxpbnV4LmNvbT4KKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk4MTBfZHJtLmgiCisjaW5jbHVkZSAiaTgxMF9kcnYuaCIKKworI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKKworc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCit7CisJLyogaTgxMCBoYXMgNCBtb3JlIGNvdW50ZXJzICovCisJZGV2LT5jb3VudGVycyArPSA0OworCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROworCWRldi0+dHlwZXNbN10gPSBfRFJNX1NUQVRfUFJJTUFSWTsKKwlkZXYtPnR5cGVzWzhdID0gX0RSTV9TVEFUX1NFQ09OREFSWTsKKwlkZXYtPnR5cGVzWzldID0gX0RSTV9TVEFUX0RNQTsKKwkKKwlEUk1fSU5GTyggIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKKwkJRFJJVkVSX05BTUUsCisJCURSSVZFUl9NQUpPUiwKKwkJRFJJVkVSX01JTk9SLAorCQlEUklWRVJfUEFUQ0hMRVZFTCwKKwkJRFJJVkVSX0RBVEUsCisJCWRldi0+cHJpbWFyeS5taW5vciwKKwkJcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKKwkJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJzaW9uKCBkcm1fdmVyc2lvbl90ICp2ZXJzaW9uICkKK3sKKwlpbnQgbGVuOworCisJdmVyc2lvbi0+dmVyc2lvbl9tYWpvciA9IERSSVZFUl9NQUpPUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID0gRFJJVkVSX01JTk9SOworCXZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMOworCURSTV9DT1BZKCB2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kYXRlLCBEUklWRVJfREFURSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CisJaTgxMF9QQ0lfSURTCit9OworCitleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBpODEwX2lvY3Rsc1tdOworZXh0ZXJuIGludCBpODEwX21heF9pb2N0bDsKKworc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKKwkuZHJpdmVyX2ZlYXR1cmVzID0gRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfUkVRVUlSRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfCBEUklWRVJfSEFWRV9ETUEgfCBEUklWRVJfRE1BX1FVRVVFLAorCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9pODEwX2J1Zl9wcml2X3QpLAorCS5wcmV0YWtlZG93biA9IGk4MTBfZHJpdmVyX3ByZXRha2Vkb3duLAorCS5wcmVyZWxlYXNlID0gaTgxMF9kcml2ZXJfcHJlcmVsZWFzZSwKKwkucmVsZWFzZSA9IGk4MTBfZHJpdmVyX3JlbGVhc2UsCisJLmRtYV9xdWllc2NlbnQgPSBpODEwX2RyaXZlcl9kbWFfcXVpZXNjZW50LAorCS5yZWNsYWltX2J1ZmZlcnMgPSBpODEwX3JlY2xhaW1fYnVmZmVycywKKwkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKKwkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKKwkucG9zdGluaXQgPSBwb3N0aW5pdCwKKwkudmVyc2lvbiA9IHZlcnNpb24sCisJLmlvY3RscyA9IGk4MTBfaW9jdGxzLAorCS5mb3BzID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9wZW4gPSBkcm1fb3BlbiwKKwkJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkJLmlvY3RsID0gZHJtX2lvY3RsLAorCQkubW1hcCA9IGRybV9tbWFwLAorCQkucG9sbCA9IGRybV9wb2xsLAorCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKwl9LAorCS5wY2lfZHJpdmVyID0geworCQkubmFtZSAgICAgICAgICA9IERSSVZFUl9OQU1FLAorCQkuaWRfdGFibGUgICAgICA9IHBjaWlkbGlzdCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTgxMF9pbml0KHZvaWQpCit7CisJZHJpdmVyLm51bV9pb2N0bHMgPSBpODEwX21heF9pb2N0bDsKKwlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpODEwX2V4aXQodm9pZCkKK3sKKwlkcm1fZXhpdCgmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaTgxMF9pbml0KTsKK21vZHVsZV9leGl0KGk4MTBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyM2NhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaApAQCAtMCwwICsxLDIzNiBAQAorLyogaTgxMF9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgdGhlIE1hdHJveCBnMjAwL2c0MDAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwMTo1MDowMSAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogCSAgICBKZWZmIEhhcnRtYW5uIDxqaGFydG1hbm5AdmFsaW51eC5jb20+CisgKgorICovCisKKyNpZm5kZWYgX0k4MTBfRFJWX0hfCisjZGVmaW5lIF9JODEwX0RSVl9IXworCisvKiBHZW5lcmFsIGN1c3RvbWl6YXRpb246CisgKi8KKworI2RlZmluZSBEUklWRVJfQVVUSE9SCQkiVkEgTGludXggU3lzdGVtcyBJbmMuIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiaTgxMCIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJCSJJbnRlbCBpODEwIgorI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDMwNjA1IgorCisvKiBJbnRlcmZhY2UgaGlzdG9yeQorICoKKyAqIDEuMSAgIC0gWEZyZWU4NiA0LjEKKyAqIDEuMiAgIC0gWHZNQyBpbnRlcmZhY2VzCisgKiAgICAgICAtIFhGcmVlODYgNC4yCisgKiAxLjIuMSAtIERpc2FibGUgY29weWluZyBjb2RlIChsZWF2ZSBzdHViIGlvY3RscyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpCisgKiAgICAgICAtIFJlbW92ZSByZXF1aXJlbWVudCBmb3IgaW50ZXJydXB0IChsZWF2ZSBzdHVicyBhZ2FpbikKKyAqIDEuMyAgIC0gQWRkIHBhZ2UgZmxpcHBpbmcuCisgKiAxLjQgICAtIGZpeCBEUk0gaW50ZXJmYWNlCisgKi8KKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkxCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJNAorI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkwCisKK3R5cGVkZWYgc3RydWN0IGRybV9pODEwX2J1Zl9wcml2IHsKKyAgIAl1MzIgKmluX3VzZTsKKyAgIAlpbnQgbXlfdXNlX2lkeDsKKwlpbnQgY3VycmVudGx5X21hcHBlZDsKKwl2b2lkICp2aXJ0dWFsOworCXZvaWQgKmtlcm5lbF92aXJ0dWFsOworfSBkcm1faTgxMF9idWZfcHJpdl90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfcmluZ19idWZmZXJ7CisJaW50IHRhaWxfbWFzazsKKwl1bnNpZ25lZCBsb25nIFN0YXJ0OworCXVuc2lnbmVkIGxvbmcgRW5kOworCXVuc2lnbmVkIGxvbmcgU2l6ZTsKKwl1OCAqdmlydHVhbF9zdGFydDsKKwlpbnQgaGVhZDsKKwlpbnQgdGFpbDsKKwlpbnQgc3BhY2U7Cit9IGRybV9pODEwX3JpbmdfYnVmZmVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9pODEwX3ByaXZhdGUgeworCWRybV9tYXBfdCAqc2FyZWFfbWFwOworCWRybV9tYXBfdCAqbW1pb19tYXA7CisKKwlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2OworICAgCWRybV9pODEwX3JpbmdfYnVmZmVyX3QgcmluZzsKKworICAgICAgCXZvaWQgKmh3X3N0YXR1c19wYWdlOworICAgCXVuc2lnbmVkIGxvbmcgY291bnRlcjsKKworCWRtYV9hZGRyX3QgZG1hX3N0YXR1c19wYWdlOworCisJZHJtX2J1Zl90ICptbWFwX2J1ZmZlcjsKKworCisJdTMyIGZyb250X2RpMSwgYmFja19kaTEsIHppMTsKKworCWludCBiYWNrX29mZnNldDsKKwlpbnQgZGVwdGhfb2Zmc2V0OworCWludCBvdmVybGF5X29mZnNldDsKKwlpbnQgb3ZlcmxheV9waHlzaWNhbDsKKwlpbnQgdywgaDsKKwlpbnQgcGl0Y2g7CisgIAlpbnQgYmFja19waXRjaDsKKwlpbnQgZGVwdGhfcGl0Y2g7CisKKwlpbnQgZG9fYm94ZXM7CisJaW50IGRtYV91c2VkOworCisJaW50IGN1cnJlbnRfcGFnZTsKKwlpbnQgcGFnZV9mbGlwcGluZzsKKworCXdhaXRfcXVldWVfaGVhZF90IGlycV9xdWV1ZTsKKyAgIAlhdG9taWNfdCBpcnFfcmVjZWl2ZWQ7CisgICAJYXRvbWljX3QgaXJxX2VtaXR0ZWQ7CisgIAorICAgICAgICBpbnQgZnJvbnRfb2Zmc2V0OworfSBkcm1faTgxMF9wcml2YXRlX3Q7CisKKwkJCQkvKiBpODEwX2RtYS5jICovCitleHRlcm4gdm9pZCBpODEwX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOworZXh0ZXJuIGludCBpODEwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCitleHRlcm4gaW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKTsKKworI2RlZmluZSBJODEwX0JBU0UocmVnKQkJKCh1bnNpZ25lZCBsb25nKSBcCisJCQkJZGV2X3ByaXYtPm1taW9fbWFwLT5oYW5kbGUpCisjZGVmaW5lIEk4MTBfQUREUihyZWcpCQkoSTgxMF9CQVNFKHJlZykgKyByZWcpCisjZGVmaW5lIEk4MTBfREVSRUYocmVnKQkJKihfX3ZvbGF0aWxlX18gaW50ICopSTgxMF9BRERSKHJlZykKKyNkZWZpbmUgSTgxMF9SRUFEKHJlZykJCUk4MTBfREVSRUYocmVnKQorI2RlZmluZSBJODEwX1dSSVRFKHJlZyx2YWwpIAlkbyB7IEk4MTBfREVSRUYocmVnKSA9IHZhbDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgSTgxMF9ERVJFRjE2KHJlZykJKihfX3ZvbGF0aWxlX18gdTE2ICopSTgxMF9BRERSKHJlZykKKyNkZWZpbmUgSTgxMF9SRUFEMTYocmVnKQlJODEwX0RFUkVGMTYocmVnKQorI2RlZmluZSBJODEwX1dSSVRFMTYocmVnLHZhbCkJZG8geyBJODEwX0RFUkVGMTYocmVnKSA9IHZhbDsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBJODEwX1ZFUkJPU0UgMAorI2RlZmluZSBSSU5HX0xPQ0FMUwl1bnNpZ25lZCBpbnQgb3V0cmluZywgcmluZ21hc2s7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIGNoYXIgKnZpcnQ7CisKKyNkZWZpbmUgQkVHSU5fTFBfUklORyhuKSBkbyB7CQkJCQkJXAorCWlmIChJODEwX1ZFUkJPU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIERSTV9ERUJVRygiQkVHSU5fTFBfUklORyglZCkgaW4gJXNcbiIsIG4sIF9fRlVOQ1RJT05fXyk7CVwKKwlpZiAoZGV2X3ByaXYtPnJpbmcuc3BhY2UgPCBuKjQpCQkJCQlcCisJCWk4MTBfd2FpdF9yaW5nKGRldiwgbio0KTsJCQkJXAorCWRldl9wcml2LT5yaW5nLnNwYWNlIC09IG4qNDsJCQkJCVwKKwlvdXRyaW5nID0gZGV2X3ByaXYtPnJpbmcudGFpbDsJCQkJCVwKKwlyaW5nbWFzayA9IGRldl9wcml2LT5yaW5nLnRhaWxfbWFzazsJCQkJXAorCXZpcnQgPSBkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0OwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFEVkFOQ0VfTFBfUklORygpIGRvIHsJCQkJICAgICAgICBcCisJaWYgKEk4MTBfVkVSQk9TRSkgRFJNX0RFQlVHKCJBRFZBTkNFX0xQX1JJTkdcbiIpOyAgICAJXAorCWRldl9wcml2LT5yaW5nLnRhaWwgPSBvdXRyaW5nOwkJICAgICAgICAJXAorCUk4MTBfV1JJVEUoTFBfUklORyArIFJJTkdfVEFJTCwgb3V0cmluZyk7CSAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIE9VVF9SSU5HKG4pIGRvIHsgIAkJCQkgICAgICAgICAgICAgICAgXAorCWlmIChJODEwX1ZFUkJPU0UpIERSTV9ERUJVRygiICAgT1VUX1JJTkcgJXhcbiIsIChpbnQpKG4pKTsJXAorCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKHZpcnQgKyBvdXRyaW5nKSA9IG47CSAgICAgICAgICAgICAgICBcCisJb3V0cmluZyArPSA0OwkJCQkJICAgICAgICAgICAgICAgIFwKKwlvdXRyaW5nICY9IHJpbmdtYXNrOwkJCSAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgR0ZYX09QX1VTRVJfSU5URVJSVVBUIAkJKCgwPDwyOSl8KDI8PDIzKSkKKyNkZWZpbmUgR0ZYX09QX0JSRUFLUE9JTlRfSU5URVJSVVBUCSgoMDw8MjkpfCgxPDwyMykpCisjZGVmaW5lIENNRF9SRVBPUlRfSEVBRAkJCSg3PDwyMykKKyNkZWZpbmUgQ01EX1NUT1JFX0RXT1JEX0lEWAkJKCgweDIxPDwyMykgfCAweDEpCisjZGVmaW5lIENNRF9PUF9CQVRDSF9CVUZGRVIgICgoMHgwPDwyOSl8KDB4MzA8PDIzKXwweDEpCisKKyNkZWZpbmUgSU5TVF9QQVJTRVJfQ0xJRU5UICAgMHgwMDAwMDAwMAorI2RlZmluZSBJTlNUX09QX0ZMVVNIICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIElOU1RfRkxVU0hfTUFQX0NBQ0hFIDB4MDAwMDAwMDEKKworCisjZGVmaW5lIEJCMV9TVEFSVF9BRERSX01BU0sgICAofjB4NykKKyNkZWZpbmUgQkIxX1BST1RFQ1RFRCAgICAgICAgICgxPDwwKQorI2RlZmluZSBCQjFfVU5QUk9URUNURUQgICAgICAgKDA8PDApCisjZGVmaW5lIEJCMl9FTkRfQUREUl9NQVNLICAgICAofjB4NykKKworI2RlZmluZSBJODEwUkVHX0hXU1RBTQkJMHgwMjA5OAorI2RlZmluZSBJODEwUkVHX0lOVF9JREVOVElUWV9SCTB4MDIwYTQKKyNkZWZpbmUgSTgxMFJFR19JTlRfTUFTS19SIAkweDAyMGE4CisjZGVmaW5lIEk4MTBSRUdfSU5UX0VOQUJMRV9SCTB4MDIwYTAKKworI2RlZmluZSBMUF9SSU5HICAgICAJCTB4MjAzMAorI2RlZmluZSBIUF9SSU5HICAgICAJCTB4MjA0MAorI2RlZmluZSBSSU5HX1RBSUwgICAgICAJCTB4MDAKKyNkZWZpbmUgVEFJTF9BRERSCQkweDAwMEZGRkY4CisjZGVmaW5lIFJJTkdfSEVBRCAgICAgIAkJMHgwNAorI2RlZmluZSBIRUFEX1dSQVBfQ09VTlQgICAgIAkweEZGRTAwMDAwCisjZGVmaW5lIEhFQURfV1JBUF9PTkUgICAgICAgCTB4MDAyMDAwMDAKKyNkZWZpbmUgSEVBRF9BRERSICAgICAgICAgICAJMHgwMDFGRkZGQworI2RlZmluZSBSSU5HX1NUQVJUICAgICAJCTB4MDgKKyNkZWZpbmUgU1RBUlRfQUREUiAgICAgICAgICAJMHgwMEZGRkZGOAorI2RlZmluZSBSSU5HX0xFTiAgICAgICAJCTB4MEMKKyNkZWZpbmUgUklOR19OUl9QQUdFUyAgICAgICAJMHgwMDBGRjAwMAorI2RlZmluZSBSSU5HX1JFUE9SVF9NQVNLICAgIAkweDAwMDAwMDA2CisjZGVmaW5lIFJJTkdfUkVQT1JUXzY0SyAgICAgCTB4MDAwMDAwMDIKKyNkZWZpbmUgUklOR19SRVBPUlRfMTI4SyAgICAJMHgwMDAwMDAwNAorI2RlZmluZSBSSU5HX05PX1JFUE9SVCAgICAgIAkweDAwMDAwMDAwCisjZGVmaW5lIFJJTkdfVkFMSURfTUFTSyAgICAgCTB4MDAwMDAwMDEKKyNkZWZpbmUgUklOR19WQUxJRCAgICAgICAgICAJMHgwMDAwMDAwMQorI2RlZmluZSBSSU5HX0lOVkFMSUQgICAgICAgIAkweDAwMDAwMDAwCisKKyNkZWZpbmUgR0ZYX09QX1NDSVNTT1IgICAgICAgICAoKDB4Mzw8MjkpfCgweDFjPDwyNCl8KDB4MTA8PDE5KSkKKyNkZWZpbmUgU0NfVVBEQVRFX1NDSVNTT1IgICAgICAgKDB4MTw8MSkKKyNkZWZpbmUgU0NfRU5BQkxFX01BU0sgICAgICAgICAgKDB4MTw8MCkKKyNkZWZpbmUgU0NfRU5BQkxFICAgICAgICAgICAgICAgKDB4MTw8MCkKKworI2RlZmluZSBHRlhfT1BfU0NJU1NPUl9JTkZPICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4MTw8MTYpfCgweDEpKQorI2RlZmluZSBTQ0lfWU1JTl9NQVNLICAgICAgKDB4ZmZmZjw8MTYpCisjZGVmaW5lIFNDSV9YTUlOX01BU0sgICAgICAoMHhmZmZmPDwwKQorI2RlZmluZSBTQ0lfWU1BWF9NQVNLICAgICAgKDB4ZmZmZjw8MTYpCisjZGVmaW5lIFNDSV9YTUFYX01BU0sgICAgICAoMHhmZmZmPDwwKQorCisjZGVmaW5lIEdGWF9PUF9DT0xPUl9GQUNUT1IgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4MTw8MTYpfDB4MCkKKyNkZWZpbmUgR0ZYX09QX1NUSVBQTEUgICAgICAgICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4Mzw8MTYpKQorI2RlZmluZSBHRlhfT1BfTUFQX0lORk8gICAgICAgICAgKCgweDM8PDI5KXwoMHgxZDw8MjQpfDB4MikKKyNkZWZpbmUgR0ZYX09QX0RFU1RCVUZGRVJfVkFSUyAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4NTw8MTYpfDB4MCkKKyNkZWZpbmUgR0ZYX09QX0RSQVdSRUNUX0lORk8gICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4MDw8MTYpfCgweDMpKQorI2RlZmluZSBHRlhfT1BfUFJJTUlUSVZFICAgICAgICAgKCgweDM8PDI5KXwoMHgxZjw8MjQpKQorCisjZGVmaW5lIENNRF9PUF9aX0JVRkZFUl9JTkZPICAgICAoKDB4MDw8MjkpfCgweDE2PDwyMykpCisjZGVmaW5lIENNRF9PUF9ERVNUQlVGRkVSX0lORk8gICAoKDB4MDw8MjkpfCgweDE1PDwyMykpCisjZGVmaW5lIENNRF9PUF9GUk9OVEJVRkZFUl9JTkZPICAoKDB4MDw8MjkpfCgweDE0PDwyMykpCisjZGVmaW5lIENNRF9PUF9XQUlUX0ZPUl9FVkVOVCAgICAoKDB4MDw8MjkpfCgweDAzPDwyMykpCisKKyNkZWZpbmUgQlIwMF9CSVRCTFRfQ0xJRU5UICAgMHg0MDAwMDAwMAorI2RlZmluZSBCUjAwX09QX0NPTE9SX0JMVCAgICAweDEwMDAwMDAwCisjZGVmaW5lIEJSMDBfT1BfU1JDX0NPUFlfQkxUIDB4MTBDMDAwMDAKKyNkZWZpbmUgQlIxM19TT0xJRF9QQVRURVJOICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIFdBSVRfRk9SX1BMQU5FX0FfU0NBTkxJTkVTICgxPDwxKSAKKyNkZWZpbmUgV0FJVF9GT1JfUExBTkVfQV9GTElQICAgICAgKDE8PDIpIAorI2RlZmluZSBXQUlUX0ZPUl9WQkxBTksgKDE8PDMpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YWRjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKQEAgLTAsMCArMSwxNTg4IEBACisvKiBpODMwX2RtYS5jIC0tIERNQSBzdXBwb3J0IGZvciB0aGUgSTgzMCAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IE1vbiBEZWMgMTMgMDE6NTA6MDEgMTk5OSBieSBqaGFydG1hbm5AcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICoJICAgIEplZmYgSGFydG1hbm4gPGpoYXJ0bWFubkB2YWxpbnV4LmNvbT4KKyAqCSAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKgkgICAgQWJyYWhhbSB2ZCBNZXJ3ZSA8YWJyYWhhbUAyZDNkLmNvLnphPgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk4MzBfZHJtLmgiCisjaW5jbHVkZSAiaTgzMF9kcnYuaCIKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4JLyogRm9yIHRhc2sgcXVldWUgc3VwcG9ydCAqLworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4JLyogRm9yIEZBU1RDQUxMIG9uIHVubG9ja19wYWdlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgSTgzMF9CVUZfRlJFRQkJMgorI2RlZmluZSBJODMwX0JVRl9DTElFTlQJCTEKKyNkZWZpbmUgSTgzMF9CVUZfSEFSRFdBUkUgICAgICAJMAorCisjZGVmaW5lIEk4MzBfQlVGX1VOTUFQUEVEIDAKKyNkZWZpbmUgSTgzMF9CVUZfTUFQUEVEICAgMQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNCwyKQorI2RlZmluZSBkb3duX3dyaXRlIGRvd24KKyNkZWZpbmUgdXBfd3JpdGUgdXAKKyNlbmRpZgorCitzdGF0aWMgZHJtX2J1Zl90ICppODMwX2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKmRldikKK3sKKyAgIAlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlpbnQJCSBpOworICAgCWludCAJCSB1c2VkOworICAgCisJLyogTGluZWFyIHNlYXJjaCBtaWdodCBub3QgYmUgdGhlIGJlc3Qgc29sdXRpb24gKi8KKworICAgCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7CisJICAgCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0WyBpIF07CisJICAgCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwkJLyogSW4gdXNlIGlzIGFscmVhZHkgYSBwb2ludGVyICovCisJICAgCXVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MzBfQlVGX0ZSRUUsIAorCQkJICAgICAgIEk4MzBfQlVGX0NMSUVOVCk7CisJICAgCWlmKHVzZWQgPT0gSTgzMF9CVUZfRlJFRSkgeworCQkJcmV0dXJuIGJ1ZjsKKwkJfQorCX0KKyAgIAlyZXR1cm4gTlVMTDsKK30KKworLyogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdGhlIGJ1ZmZlciBpcyBub3Qgc2VudCB0byB0aGUgaGFyZHdhcmUKKyAqIHlldCwgdGhlIGhhcmR3YXJlIHVwZGF0ZXMgaW4gdXNlIGZvciB1cyBvbmNlIGl0cyBvbiB0aGUgcmluZyBidWZmZXIuCisgKi8KKworc3RhdGljIGludCBpODMwX2ZyZWVsaXN0X3B1dChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2J1Zl90ICpidWYpCit7CisgICAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworICAgCWludCB1c2VkOworICAgCisgICAJLyogSW4gdXNlIGlzIGFscmVhZHkgYSBwb2ludGVyICovCisgICAJdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgzMF9CVUZfQ0xJRU5ULCBJODMwX0JVRl9GUkVFKTsKKyAgIAlpZih1c2VkICE9IEk4MzBfQlVGX0NMSUVOVCkgeworCSAgIAlEUk1fRVJST1IoIkZyZWVpbmcgYnVmZmVyIHRoYXRzIG5vdCBpbiB1c2UgOiAlZFxuIiwgYnVmLT5pZHgpOworCSAgIAlyZXR1cm4gLUVJTlZBTDsKKwl9CisgICAKKyAgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTgzMF9idWZmZXJfZm9wcyA9IHsKKwkub3BlbgkgPSBkcm1fb3BlbiwKKwkuZmx1c2gJID0gZHJtX2ZsdXNoLAorCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJLmlvY3RsCSA9IGRybV9pb2N0bCwKKwkubW1hcAkgPSBpODMwX21tYXBfYnVmZmVycywKKwkuZmFzeW5jICA9IGRybV9mYXN5bmMsCit9OworCitpbnQgaTgzMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWRybV9maWxlX3QJICAgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgICAqZGV2OworCWRybV9pODMwX3ByaXZhdGVfdCAgKmRldl9wcml2OworCWRybV9idWZfdCAgICAgICAgICAgKmJ1ZjsKKwlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdjsKKworCWxvY2tfa2VybmVsKCk7CisJZGV2CSA9IHByaXYtPmhlYWQtPmRldjsKKwlkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJYnVmICAgICAgPSBkZXZfcHJpdi0+bW1hcF9idWZmZXI7CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworICAgCisJdm1hLT52bV9mbGFncyB8PSAoVk1fSU8gfCBWTV9ET05UQ09QWSk7CisJdm1hLT52bV9maWxlID0gZmlscDsKKyAgIAorICAgCWJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID0gSTgzMF9CVUZfTUFQUEVEOworCXVubG9ja19rZXJuZWwoKTsKKworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJICAgICBWTV9PRkZTRVQodm1hKSA+PiBQQUdFX1NISUZULAorCQkJICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgIHZtYS0+dm1fcGFnZV9wcm90KSkgcmV0dXJuIC1FQUdBSU47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9tYXBfYnVmZmVyKGRybV9idWZfdCAqYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAqZGV2CSAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworICAgICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKm9sZF9mb3BzOworCXVuc2lnbmVkIGxvbmcgdmlydHVhbDsKKwlpbnQgcmV0Y29kZSA9IDA7CisKKwlpZihidWZfcHJpdi0+Y3VycmVudGx5X21hcHBlZCA9PSBJODMwX0JVRl9NQVBQRUQpIHJldHVybiAtRUlOVkFMOworCisJZG93bl93cml0ZSggJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSApOworCW9sZF9mb3BzID0gZmlscC0+Zl9vcDsKKwlmaWxwLT5mX29wID0gJmk4MzBfYnVmZmVyX2ZvcHM7CisJZGV2X3ByaXYtPm1tYXBfYnVmZmVyID0gYnVmOworCXZpcnR1YWwgPSBkb19tbWFwKGZpbHAsIDAsIGJ1Zi0+dG90YWwsIFBST1RfUkVBRHxQUk9UX1dSSVRFLAorCQkJICAgIE1BUF9TSEFSRUQsIGJ1Zi0+YnVzX2FkZHJlc3MpOworCWRldl9wcml2LT5tbWFwX2J1ZmZlciA9IE5VTEw7CisJZmlscC0+Zl9vcCA9IG9sZF9mb3BzOworCWlmIChJU19FUlIoKHZvaWQgKil2aXJ0dWFsKSkgewkJLyogdWdoICovCisJCS8qIFJlYWwgZXJyb3IgKi8KKwkJRFJNX0VSUk9SKCJtbWFwIGVycm9yXG4iKTsKKwkJcmV0Y29kZSA9IHZpcnR1YWw7CisJCWJ1Zl9wcml2LT52aXJ0dWFsID0gTlVMTDsKKwl9IGVsc2UgeworCQlidWZfcHJpdi0+dmlydHVhbCA9ICh2b2lkIF9fdXNlciAqKXZpcnR1YWw7CisJfQorCXVwX3dyaXRlKCAmY3VycmVudC0+bW0tPm1tYXBfc2VtICk7CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworc3RhdGljIGludCBpODMwX3VubWFwX2J1ZmZlcihkcm1fYnVmX3QgKmJ1ZikKK3sKKwlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldGNvZGUgPSAwOworCisJaWYoYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgIT0gSTgzMF9CVUZfTUFQUEVEKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJldGNvZGUgPSBkb19tdW5tYXAoY3VycmVudC0+bW0sCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpYnVmX3ByaXYtPnZpcnR1YWwsCisJCQkgICAgKHNpemVfdCkgYnVmLT50b3RhbCk7CisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKyAgIAlidWZfcHJpdi0+Y3VycmVudGx5X21hcHBlZCA9IEk4MzBfQlVGX1VOTUFQUEVEOworICAgCWJ1Zl9wcml2LT52aXJ0dWFsID0gTlVMTDsKKworCXJldHVybiByZXRjb2RlOworfQorCitzdGF0aWMgaW50IGk4MzBfZG1hX2dldF9idWZmZXIoZHJtX2RldmljZV90ICpkZXYsIGRybV9pODMwX2RtYV90ICpkLCAKKwkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlkcm1fYnVmX3QJICAqYnVmOworCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWludCByZXRjb2RlID0gMDsKKworCWJ1ZiA9IGk4MzBfZnJlZWxpc3RfZ2V0KGRldik7CisJaWYgKCFidWYpIHsKKwkJcmV0Y29kZSA9IC1FTk9NRU07CisJICAgCURSTV9ERUJVRygicmV0Y29kZT0lZFxuIiwgcmV0Y29kZSk7CisJCXJldHVybiByZXRjb2RlOworCX0KKyAgIAorCXJldGNvZGUgPSBpODMwX21hcF9idWZmZXIoYnVmLCBmaWxwKTsKKwlpZihyZXRjb2RlKSB7CisJCWk4MzBfZnJlZWxpc3RfcHV0KGRldiwgYnVmKTsKKwkgICAJRFJNX0VSUk9SKCJtYXBidWYgZmFpbGVkLCByZXRjb2RlICVkXG4iLCByZXRjb2RlKTsKKwkJcmV0dXJuIHJldGNvZGU7CisJfQorCWJ1Zi0+ZmlscCA9IGZpbHA7CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwkKKwlkLT5ncmFudGVkID0gMTsKKyAgIAlkLT5yZXF1ZXN0X2lkeCA9IGJ1Zi0+aWR4OworICAgCWQtPnJlcXVlc3Rfc2l6ZSA9IGJ1Zi0+dG90YWw7CisgICAJZC0+dmlydHVhbCA9IGJ1Zl9wcml2LT52aXJ0dWFsOworCisJcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKworCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAorCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKKwkgKiBpcyBmcmVlZCwgaXQncyB0b28gbGF0ZS4KKwkgKi8KKwlpZiAoIGRldi0+aXJxX2VuYWJsZWQgKSBkcm1faXJxX3VuaW5zdGFsbChkZXYpOworCisJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKKwkJaW50IGk7CisJICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAgIAkJKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCSAgIAorCSAgIAlpZiAoZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCkgeworCQkgICAJZHJtX2lvcmVtYXBmcmVlKCh2b2lkICopIGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQsCisJCQkJCSBkZXZfcHJpdi0+cmluZy5TaXplLCBkZXYpOworCQl9CisJICAgCWlmIChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsCisJCQkJCSAgICBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UsCisJCQkJCSAgICBkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKwkJICAgCS8qIE5lZWQgdG8gcmV3cml0ZSBoYXJkd2FyZSBzdGF0dXMgcGFnZSAqLworCQkgICAJSTgzMF9XUklURSgweDAyMDgwLCAweDFmZmZmMDAwKTsKKwkJfQorCisJICAgCWRybV9mcmVlKGRldi0+ZGV2X3ByaXZhdGUsIHNpemVvZihkcm1faTgzMF9wcml2YXRlX3QpLCAKKwkJCSBEUk1fTUVNX0RSSVZFUik7CisJICAgCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCisJCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7CisJCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFsgaSBdOworCQkJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQkJaWYgKCBidWZfcHJpdi0+a2VybmVsX3ZpcnR1YWwgJiYgYnVmLT50b3RhbCApCisJCQkJZHJtX2lvcmVtYXBmcmVlKGJ1Zl9wcml2LT5rZXJuZWxfdmlydHVhbCwgYnVmLT50b3RhbCwgZGV2KTsKKwkJfQorCX0KKyAgIAlyZXR1cm4gMDsKK30KKworaW50IGk4MzBfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKQoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgCWRybV9pODMwX3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKKyAgIAlpbnQgaXRlcnMgPSAwOworICAgCXVuc2lnbmVkIGxvbmcgZW5kOworCXVuc2lnbmVkIGludCBsYXN0X2hlYWQgPSBJODMwX1JFQUQoTFBfUklORyArIFJJTkdfSEVBRCkgJiBIRUFEX0FERFI7CisKKwllbmQgPSBqaWZmaWVzICsgKEhaKjMpOworICAgCXdoaWxlIChyaW5nLT5zcGFjZSA8IG4pIHsJCisJICAgCXJpbmctPmhlYWQgPSBJODMwX1JFQUQoTFBfUklORyArIFJJTkdfSEVBRCkgJiBIRUFEX0FERFI7CisJICAgCXJpbmctPnNwYWNlID0gcmluZy0+aGVhZCAtIChyaW5nLT50YWlsKzgpOworCQlpZiAocmluZy0+c3BhY2UgPCAwKSByaW5nLT5zcGFjZSArPSByaW5nLT5TaXplOworCSAgIAorCQlpZiAocmluZy0+aGVhZCAhPSBsYXN0X2hlYWQpIHsKKwkJCWVuZCA9IGppZmZpZXMgKyAoSFoqMyk7CisJCQlsYXN0X2hlYWQgPSByaW5nLT5oZWFkOworCQl9CisJICAKKwkgICAJaXRlcnMrKzsKKwkJaWYodGltZV9iZWZvcmUoZW5kLCBqaWZmaWVzKSkgeworCQkgICAJRFJNX0VSUk9SKCJzcGFjZTogJWQgd2FudGVkICVkXG4iLCByaW5nLT5zcGFjZSwgbik7CisJCSAgIAlEUk1fRVJST1IoImxvY2t1cFxuIik7CisJCSAgIAlnb3RvIG91dF93YWl0X3Jpbmc7CisJCX0KKwkJdWRlbGF5KDEpOworCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJODMwX0JPWF9XQUlUOworCX0KKworb3V0X3dhaXRfcmluZzogICAKKyAgIAlyZXR1cm4gaXRlcnM7Cit9CisKK3N0YXRpYyB2b2lkIGk4MzBfa2VybmVsX2xvc3RfY29udGV4dChkcm1fZGV2aWNlX3QgKmRldikKK3sKKyAgICAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgIAlkcm1faTgzMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CisgICAgICAKKyAgIAlyaW5nLT5oZWFkID0gSTgzMF9SRUFEKExQX1JJTkcgKyBSSU5HX0hFQUQpICYgSEVBRF9BRERSOworICAgICAJcmluZy0+dGFpbCA9IEk4MzBfUkVBRChMUF9SSU5HICsgUklOR19UQUlMKSAmIFRBSUxfQUREUjsKKyAgICAgCXJpbmctPnNwYWNlID0gcmluZy0+aGVhZCAtIChyaW5nLT50YWlsKzgpOworICAgICAJaWYgKHJpbmctPnNwYWNlIDwgMCkgcmluZy0+c3BhY2UgKz0gcmluZy0+U2l6ZTsKKworCWlmIChyaW5nLT5oZWFkID09IHJpbmctPnRhaWwpCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk4MzBfQk9YX1JJTkdfRU1QVFk7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9mcmVlbGlzdF9pbml0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2KQoreworICAgICAgCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworICAgCWludCBteV9pZHggPSAzNjsKKyAgIAl1MzIgKmh3X3N0YXR1cyA9ICh1MzIgKikoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlICsgbXlfaWR4KTsKKyAgIAlpbnQgaTsKKworICAgCWlmKGRtYS0+YnVmX2NvdW50ID4gMTAxOSkgeworCSAgIAkvKiBOb3QgZW5vdWdoIHNwYWNlIGluIHRoZSBzdGF0dXMgcGFnZSBmb3IgdGhlIGZyZWVsaXN0ICovCisJICAgCXJldHVybiAtRUlOVkFMOworCX0KKworICAgCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7CisJICAgCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0WyBpIF07CisJICAgCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCSAgIAlidWZfcHJpdi0+aW5fdXNlID0gaHdfc3RhdHVzKys7CisJICAgCWJ1Zl9wcml2LT5teV91c2VfaWR4ID0gbXlfaWR4OworCSAgIAlteV9pZHggKz0gNDsKKworCSAgIAkqYnVmX3ByaXYtPmluX3VzZSA9IEk4MzBfQlVGX0ZSRUU7CisKKwkJYnVmX3ByaXYtPmtlcm5lbF92aXJ0dWFsID0gZHJtX2lvcmVtYXAoYnVmLT5idXNfYWRkcmVzcywgCisJCQkJCQkJYnVmLT50b3RhbCwgZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9kbWFfaW5pdGlhbGl6ZShkcm1fZGV2aWNlX3QgKmRldiwgCisJCQkgICAgICAgZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCSAgICAgICBkcm1faTgzMF9pbml0X3QgKmluaXQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworICAgCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9pODMwX3ByaXZhdGVfdCkpOworCisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CisJCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwkJaWYoIHJfbGlzdC0+bWFwICYmCisJCSAgICByX2xpc3QtPm1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJgorCQkgICAgcl9saXN0LT5tYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLICkgeworCQkJZGV2X3ByaXYtPnNhcmVhX21hcCA9IHJfbGlzdC0+bWFwOworIAkJCWJyZWFrOworIAkJfQorIAl9CisKKwlpZighZGV2X3ByaXYtPnNhcmVhX21hcCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJaTgzMF9kbWFfY2xlYW51cChkZXYpOworCQlEUk1fRVJST1IoImNhbiBub3QgZmluZCBzYXJlYSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2X3ByaXYtPm1taW9fbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPm1taW9fb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPm1taW9fbWFwKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlpODMwX2RtYV9jbGVhbnVwKGRldik7CisJCURSTV9FUlJPUigiY2FuIG5vdCBmaW5kIG1taW8gbWFwIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXYtPmFncF9idWZmZXJfbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmJ1ZmZlcnNfb2Zmc2V0KTsKKwlpZighZGV2LT5hZ3BfYnVmZmVyX21hcCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJaTgzMF9kbWFfY2xlYW51cChkZXYpOworCQlEUk1fRVJST1IoImNhbiBub3QgZmluZCBkbWEgYnVmZmVyIG1hcCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdiA9IChkcm1faTgzMF9zYXJlYV90ICopCisJCSgodTggKilkZXZfcHJpdi0+c2FyZWFfbWFwLT5oYW5kbGUgKworCQkgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCisgICAJZGV2X3ByaXYtPnJpbmcuU3RhcnQgPSBpbml0LT5yaW5nX3N0YXJ0OworICAgCWRldl9wcml2LT5yaW5nLkVuZCA9IGluaXQtPnJpbmdfZW5kOworICAgCWRldl9wcml2LT5yaW5nLlNpemUgPSBpbml0LT5yaW5nX3NpemU7CisKKyAgIAlkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0ID0gZHJtX2lvcmVtYXAoZGV2LT5hZ3AtPmJhc2UgKyAKKwkJCQkJCSAgICBpbml0LT5yaW5nX3N0YXJ0LCAKKwkJCQkJCSAgICBpbml0LT5yaW5nX3NpemUsIGRldik7CisKKyAgIAlpZiAoZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCA9PSBOVUxMKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKSBkZXZfcHJpdjsKKwkgICAJaTgzMF9kbWFfY2xlYW51cChkZXYpOworCSAgIAlEUk1fRVJST1IoImNhbiBub3QgaW9yZW1hcCB2aXJ0dWFsIGFkZHJlc3MgZm9yIgorCQkJICAiIHJpbmcgYnVmZmVyXG4iKTsKKwkgICAJcmV0dXJuIC1FTk9NRU07CisJfQorCisgICAJZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrID0gZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDE7CisgICAKKwlkZXZfcHJpdi0+dyA9IGluaXQtPnc7CisJZGV2X3ByaXYtPmggPSBpbml0LT5oOworCWRldl9wcml2LT5waXRjaCA9IGluaXQtPnBpdGNoOworCWRldl9wcml2LT5iYWNrX29mZnNldCA9IGluaXQtPmJhY2tfb2Zmc2V0OworCWRldl9wcml2LT5kZXB0aF9vZmZzZXQgPSBpbml0LT5kZXB0aF9vZmZzZXQ7CisJZGV2X3ByaXYtPmZyb250X29mZnNldCA9IGluaXQtPmZyb250X29mZnNldDsKKworCWRldl9wcml2LT5mcm9udF9kaTEgPSBpbml0LT5mcm9udF9vZmZzZXQgfCBpbml0LT5waXRjaF9iaXRzOworCWRldl9wcml2LT5iYWNrX2RpMSA9IGluaXQtPmJhY2tfb2Zmc2V0IHwgaW5pdC0+cGl0Y2hfYml0czsKKwlkZXZfcHJpdi0+emkxID0gaW5pdC0+ZGVwdGhfb2Zmc2V0IHwgaW5pdC0+cGl0Y2hfYml0czsKKworCURSTV9ERUJVRygiZnJvbnRfZGkxICV4XG4iLCAgICBkZXZfcHJpdi0+ZnJvbnRfZGkxKTsKKwlEUk1fREVCVUcoImJhY2tfb2Zmc2V0ICV4XG4iLCBkZXZfcHJpdi0+YmFja19vZmZzZXQpOworCURSTV9ERUJVRygiYmFja19kaTEgJXhcbiIsICAgIGRldl9wcml2LT5iYWNrX2RpMSk7CisJRFJNX0RFQlVHKCJwaXRjaF9iaXRzICV4XG4iLCAgICBpbml0LT5waXRjaF9iaXRzKTsKKworCWRldl9wcml2LT5jcHAgPSBpbml0LT5jcHA7CisJLyogV2UgYXJlIHVzaW5nIHNlcGFyYXRlIHZhbHVlcyBhcyBwbGFjZWhvbGRlcnMgZm9yIG1lY2hhbmlzbXMgZm9yCisJICogcHJpdmF0ZSBiYWNrYnVmZmVyL2RlcHRoYnVmZmVyIHVzYWdlLgorCSAqLworCisJZGV2X3ByaXYtPmJhY2tfcGl0Y2ggPSBpbml0LT5iYWNrX3BpdGNoOworCWRldl9wcml2LT5kZXB0aF9waXRjaCA9IGluaXQtPmRlcHRoX3BpdGNoOworCWRldl9wcml2LT5kb19ib3hlcyA9IDA7CisJZGV2X3ByaXYtPnVzZV9taV9iYXRjaGJ1ZmZlcl9zdGFydCA9IDA7CisKKyAgIAkvKiBQcm9ncmFtIEhhcmR3YXJlIFN0YXR1cyBQYWdlICovCisgICAJZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlID0KKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsCisJCQkJCQkmZGV2X3ByaXYtPmRtYV9zdGF0dXNfcGFnZSk7CisgICAJaWYgKCFkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCWk4MzBfZG1hX2NsZWFudXAoZGV2KTsKKwkJRFJNX0VSUk9SKCJDYW4gbm90IGFsbG9jYXRlIGhhcmR3YXJlIHN0YXR1cyBwYWdlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorICAgCW1lbXNldChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UsIDAsIFBBR0VfU0laRSk7CisJRFJNX0RFQlVHKCJodyBzdGF0dXMgcGFnZSBAICVwXG4iLCBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpOworICAgCisgICAJSTgzMF9XUklURSgweDAyMDgwLCBkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKwlEUk1fREVCVUcoIkVuYWJsZWQgaGFyZHdhcmUgc3RhdHVzIHBhZ2VcbiIpOworICAgCisgICAJLyogTm93IHdlIG5lZWQgdG8gaW5pdCBvdXIgZnJlZWxpc3QgKi8KKyAgIAlpZihpODMwX2ZyZWVsaXN0X2luaXQoZGV2LCBkZXZfcHJpdikgIT0gMCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkgICAJaTgzMF9kbWFfY2xlYW51cChkZXYpOworCSAgIAlEUk1fRVJST1IoIk5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIHN0YXR1cyBwYWdlIGZvciIKKwkJCSAgIiB0aGUgZnJlZWxpc3RcbiIpOworCSAgIAlyZXR1cm4gLUVOT01FTTsKKwl9CisJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisKKyAgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODMwX2RtYV9pbml0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisgICAJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKyAgIAlkcm1faTgzMF9pbml0X3QgaW5pdDsKKyAgIAlpbnQgcmV0Y29kZSA9IDA7CisJCisgIAlpZiAoY29weV9mcm9tX3VzZXIoJmluaXQsICh2b2lkICogX191c2VyKSBhcmcsIHNpemVvZihpbml0KSkpCisJCXJldHVybiAtRUZBVUxUOworCQorICAgCXN3aXRjaChpbml0LmZ1bmMpIHsKKwkgCWNhc2UgSTgzMF9JTklUX0RNQToKKwkJCWRldl9wcml2ID0gZHJtX2FsbG9jKHNpemVvZihkcm1faTgzMF9wcml2YXRlX3QpLCAKKwkJCQkJICAgICAgRFJNX01FTV9EUklWRVIpOworCSAgIAkJaWYoZGV2X3ByaXYgPT0gTlVMTCkgcmV0dXJuIC1FTk9NRU07CisJICAgCQlyZXRjb2RlID0gaTgzMF9kbWFfaW5pdGlhbGl6ZShkZXYsIGRldl9wcml2LCAmaW5pdCk7CisJICAgCWJyZWFrOworCSAJY2FzZSBJODMwX0NMRUFOVVBfRE1BOgorCSAgIAkJcmV0Y29kZSA9IGk4MzBfZG1hX2NsZWFudXAoZGV2KTsKKwkgICAJYnJlYWs7CisJIAlkZWZhdWx0OgorCSAgIAkJcmV0Y29kZSA9IC1FSU5WQUw7CisJICAgCWJyZWFrOworCX0KKyAgIAorICAgCXJldHVybiByZXRjb2RlOworfQorCisjZGVmaW5lIEdGWF9PUF9TVElQUExFICAgICAgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODM8PDE2KSkKKyNkZWZpbmUgU1QxX0VOQUJMRSAgICAgICAgICAgICAgICgxPDwxNikKKyNkZWZpbmUgU1QxX01BU0sgICAgICAgICAgICAgICAgICgweGZmZmYpCisKKy8qIE1vc3QgZWZmaWNpZW50IHdheSB0byB2ZXJpZnkgc3RhdGUgZm9yIHRoZSBpODMwIGlzIGFzIGl0IGlzCisgKiBlbWl0dGVkLiAgTm9uLWNvbmZvcm1hbnQgc3RhdGUgaXMgc2lsZW50bHkgZHJvcHBlZC4KKyAqLworc3RhdGljIHZvaWQgaTgzMEVtaXRDb250ZXh0VmVyaWZpZWQoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpjb2RlICkKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaSwgaiA9IDA7CisJdW5zaWduZWQgaW50IHRtcDsKKwlSSU5HX0xPQ0FMUzsKKworCUJFR0lOX0xQX1JJTkcoIEk4MzBfQ1RYX1NFVFVQX1NJWkUgKyA0ICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBJODMwX0NUWFJFR19CTEVORENPTFIwIDsgaSsrICkgeworCQl0bXAgPSBjb2RlW2ldOworCQlpZiAoKHRtcCAmICg3PDwyOSkpID09IENNRF8zRCAmJgorCQkgICAgKHRtcCAmICgweDFmPDwyNCkpIDwgKDB4MWQ8PDI0KSkgeworCQkJT1VUX1JJTkcoIHRtcCApOyAKKwkJCWorKzsKKwkJfSBlbHNlIHsKKwkJCURSTV9FUlJPUigiU2tpcHBpbmcgJWRcbiIsIGkpOworCQl9CisJfQorCisJT1VUX1JJTkcoIFNUQVRFM0RfQ09OU1RfQkxFTkRfQ09MT1JfQ01EICk7IAorCU9VVF9SSU5HKCBjb2RlW0k4MzBfQ1RYUkVHX0JMRU5EQ09MUl0gKTsgCisJaiArPSAyOworCisJZm9yICggaSA9IEk4MzBfQ1RYUkVHX1ZGIDsgaSA8IEk4MzBfQ1RYUkVHX01DU0IwIDsgaSsrICkgeworCQl0bXAgPSBjb2RlW2ldOworCQlpZiAoKHRtcCAmICg3PDwyOSkpID09IENNRF8zRCAmJgorCQkgICAgKHRtcCAmICgweDFmPDwyNCkpIDwgKDB4MWQ8PDI0KSkgeworCQkJT1VUX1JJTkcoIHRtcCApOyAKKwkJCWorKzsKKwkJfSBlbHNlIHsKKwkJCURSTV9FUlJPUigiU2tpcHBpbmcgJWRcbiIsIGkpOworCQl9CisJfQorCisJT1VUX1JJTkcoIFNUQVRFM0RfTUFQX0NPT1JEX1NFVEJJTkRfQ01EICk7IAorCU9VVF9SSU5HKCBjb2RlW0k4MzBfQ1RYUkVHX01DU0IxXSApOyAKKwlqICs9IDI7CisKKwlpZiAoaiAmIDEpIAorCQlPVVRfUklORyggMCApOyAKKworCUFEVkFOQ0VfTFBfUklORygpOworfQorCitzdGF0aWMgdm9pZCBpODMwRW1pdFRleFZlcmlmaWVkKCBkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpjb2RlICkgCit7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGksIGogPSAwOworCXVuc2lnbmVkIGludCB0bXA7CisJUklOR19MT0NBTFM7CisKKwlpZiAoY29kZVtJODMwX1RFWFJFR19NSTBdID09IEdGWF9PUF9NQVBfSU5GTyB8fAorCSAgICAoY29kZVtJODMwX1RFWFJFR19NSTBdICYgfigweGYqTE9BRF9URVhUVVJFX01BUDApKSA9PSAKKwkgICAgKFNUQVRFM0RfTE9BRF9TVEFURV9JTU1FRElBVEVfMnw0KSkgeworCisJCUJFR0lOX0xQX1JJTkcoIEk4MzBfVEVYX1NFVFVQX1NJWkUgKTsKKworCQlPVVRfUklORyggY29kZVtJODMwX1RFWFJFR19NSTBdICk7IC8qIFRNMExJICovCisJCU9VVF9SSU5HKCBjb2RlW0k4MzBfVEVYUkVHX01JMV0gKTsgLyogVE0wUzAgKi8KKwkJT1VUX1JJTkcoIGNvZGVbSTgzMF9URVhSRUdfTUkyXSApOyAvKiBUTTBTMSAqLworCQlPVVRfUklORyggY29kZVtJODMwX1RFWFJFR19NSTNdICk7IC8qIFRNMFMyICovCisJCU9VVF9SSU5HKCBjb2RlW0k4MzBfVEVYUkVHX01JNF0gKTsgLyogVE0wUzMgKi8KKwkJT1VUX1JJTkcoIGNvZGVbSTgzMF9URVhSRUdfTUk1XSApOyAvKiBUTTBTNCAqLworCQkKKwkJZm9yICggaSA9IDYgOyBpIDwgSTgzMF9URVhfU0VUVVBfU0laRSA7IGkrKyApIHsKKwkJCXRtcCA9IGNvZGVbaV07CisJCQlPVVRfUklORyggdG1wICk7IAorCQkJaisrOworCQl9IAorCisJCWlmIChqICYgMSkgCisJCQlPVVRfUklORyggMCApOyAKKworCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwl9CisJZWxzZQorCQlwcmludGsoInJlamVjdGVkIHBhY2tldCAleFxuIiwgY29kZVswXSk7Cit9CisKK3N0YXRpYyB2b2lkIGk4MzBFbWl0VGV4QmxlbmRWZXJpZmllZCggZHJtX2RldmljZV90ICpkZXYsIAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAqY29kZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtKQoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpLCBqID0gMDsKKwl1bnNpZ25lZCBpbnQgdG1wOworCVJJTkdfTE9DQUxTOworCisJaWYgKCFudW0pCisJCXJldHVybjsKKworCUJFR0lOX0xQX1JJTkcoIG51bSArIDEgKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IG51bSA7IGkrKyApIHsKKwkJdG1wID0gY29kZVtpXTsKKwkJT1VUX1JJTkcoIHRtcCApOworCQlqKys7CisJfQorCisJaWYgKGogJiAxKSAKKwkJT1VUX1JJTkcoIDAgKTsgCisKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK30KKworc3RhdGljIHZvaWQgaTgzMEVtaXRUZXhQYWxldHRlKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCSAgICAgICAgdW5zaWduZWQgaW50ICpwYWxldHRlLAorCQkJICAgICAgICBpbnQgbnVtYmVyLAorCQkJICAgICAgICBpbnQgaXNfc2hhcmVkICkKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKworCXJldHVybjsKKworCUJFR0lOX0xQX1JJTkcoIDI1OCApOworCisJaWYoaXNfc2hhcmVkID09IDEpIHsKKwkJT1VUX1JJTkcoQ01EX09QX01BUF9QQUxFVFRFX0xPQUQgfAorCQkJIE1BUF9QQUxFVFRFX05VTSgwKSB8CisJCQkgTUFQX1BBTEVUVEVfQk9USCk7CisJfSBlbHNlIHsKKwkJT1VUX1JJTkcoQ01EX09QX01BUF9QQUxFVFRFX0xPQUQgfCBNQVBfUEFMRVRURV9OVU0obnVtYmVyKSk7CisJfQorCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCU9VVF9SSU5HKHBhbGV0dGVbaV0pOworCX0KKwlPVVRfUklORygwKTsKKwkvKiBLVzogIFdIRVJFIElTIFRIRSBBRFZBTkNFX0xQX1JJTkc/ICBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgbm9vcCEgCisJICovCit9CisKKy8qIE5lZWQgdG8gZG8gc29tZSBhZGRpdGlvbmFsIGNoZWNraW5nIHdoZW4gc2V0dGluZyB0aGUgZGVzdCBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIGk4MzBFbWl0RGVzdFZlcmlmaWVkKCBkcm1fZGV2aWNlX3QgKmRldiwgCisJCQkJICB1bnNpZ25lZCBpbnQgKmNvZGUgKSAKK3sJCisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IHRtcDsKKwlSSU5HX0xPQ0FMUzsKKworCUJFR0lOX0xQX1JJTkcoIEk4MzBfREVTVF9TRVRVUF9TSVpFICsgMTAgKTsKKworCisJdG1wID0gY29kZVtJODMwX0RFU1RSRUdfQ0JVRkFERFJdOworCWlmICh0bXAgPT0gZGV2X3ByaXYtPmZyb250X2RpMSB8fCB0bXAgPT0gZGV2X3ByaXYtPmJhY2tfZGkxKSB7CisJCWlmICgoKGludClvdXRyaW5nKSAmIDgpIHsKKwkJCU9VVF9SSU5HKDApOworCQkJT1VUX1JJTkcoMCk7CisJCX0KKworCQlPVVRfUklORyggQ01EX09QX0RFU1RCVUZGRVJfSU5GTyApOworCQlPVVRfUklORyggQlVGXzNEX0lEX0NPTE9SX0JBQ0sgfCAKKwkJCSAgQlVGXzNEX1BJVENIKGRldl9wcml2LT5iYWNrX3BpdGNoICogZGV2X3ByaXYtPmNwcCkgfAorCQkJICBCVUZfM0RfVVNFX0ZFTkNFKTsKKwkJT1VUX1JJTkcoIHRtcCApOworCQlPVVRfUklORyggMCApOworCisJCU9VVF9SSU5HKCBDTURfT1BfREVTVEJVRkZFUl9JTkZPICk7CisJCU9VVF9SSU5HKCBCVUZfM0RfSURfREVQVEggfCBCVUZfM0RfVVNFX0ZFTkNFIHwgCisJCQkgIEJVRl8zRF9QSVRDSChkZXZfcHJpdi0+ZGVwdGhfcGl0Y2ggKiBkZXZfcHJpdi0+Y3BwKSk7CisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+emkxICk7CisJCU9VVF9SSU5HKCAwICk7CisJfSBlbHNlIHsKKwkJRFJNX0VSUk9SKCJiYWQgZGkxICV4IChhbGxvdyAleCBvciAleClcbiIsCisJCQkgIHRtcCwgZGV2X3ByaXYtPmZyb250X2RpMSwgZGV2X3ByaXYtPmJhY2tfZGkxKTsKKwl9CisKKwkvKiBpbnZhcmllbnQ6CisJICovCisKKworCU9VVF9SSU5HKCBHRlhfT1BfREVTVEJVRkZFUl9WQVJTICk7CisJT1VUX1JJTkcoIGNvZGVbSTgzMF9ERVNUUkVHX0RWMV0gKTsKKworCU9VVF9SSU5HKCBHRlhfT1BfRFJBV1JFQ1RfSU5GTyApOworCU9VVF9SSU5HKCBjb2RlW0k4MzBfREVTVFJFR19EUjFdICk7CisJT1VUX1JJTkcoIGNvZGVbSTgzMF9ERVNUUkVHX0RSMl0gKTsKKwlPVVRfUklORyggY29kZVtJODMwX0RFU1RSRUdfRFIzXSApOworCU9VVF9SSU5HKCBjb2RlW0k4MzBfREVTVFJFR19EUjRdICk7CisKKwkvKiBOZWVkIHRvIHZlcmlmeSB0aGlzICovCisJdG1wID0gY29kZVtJODMwX0RFU1RSRUdfU0VOQUJMRV07CisJaWYoKHRtcCAmIH4weDMpID09IEdGWF9PUF9TQ0lTU09SX0VOQUJMRSkgeworCQlPVVRfUklORyggdG1wICk7CisJfSBlbHNlIHsKKwkJRFJNX0VSUk9SKCJiYWQgc2Npc3NvciBlbmFibGVcbiIpOworCQlPVVRfUklORyggMCApOworCX0KKworCU9VVF9SSU5HKCBHRlhfT1BfU0NJU1NPUl9SRUNUICk7CisJT1VUX1JJTkcoIGNvZGVbSTgzMF9ERVNUUkVHX1NSMV0gKTsKKwlPVVRfUklORyggY29kZVtJODMwX0RFU1RSRUdfU1IyXSApOworCU9VVF9SSU5HKCAwICk7CisKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK30KKworc3RhdGljIHZvaWQgaTgzMEVtaXRTdGlwcGxlVmVyaWZpZWQoIGRybV9kZXZpY2VfdCAqZGV2LCAKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqY29kZSApIAoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCVJJTkdfTE9DQUxTOworCisJQkVHSU5fTFBfUklORyggMiApOworCU9VVF9SSU5HKCBHRlhfT1BfU1RJUFBMRSApOworCU9VVF9SSU5HKCBjb2RlWzFdICk7CisJQURWQU5DRV9MUF9SSU5HKCk7CQorfQorCisKK3N0YXRpYyB2b2lkIGk4MzBFbWl0U3RhdGUoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgICAgIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJdW5zaWduZWQgaW50IGRpcnR5ID0gc2FyZWFfcHJpdi0+ZGlydHk7CisKKwlEUk1fREVCVUcoIiVzICV4XG4iLCBfX0ZVTkNUSU9OX18sIGRpcnR5KTsKKworCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX0JVRkZFUlMpIHsKKwkJaTgzMEVtaXREZXN0VmVyaWZpZWQoIGRldiwgc2FyZWFfcHJpdi0+QnVmZmVyU3RhdGUgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX0JVRkZFUlM7CisJfQorCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfQ1RYKSB7CisJCWk4MzBFbWl0Q29udGV4dFZlcmlmaWVkKCBkZXYsIHNhcmVhX3ByaXYtPkNvbnRleHRTdGF0ZSApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfQ1RYOworCX0KKworCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWDApIHsKKwkJaTgzMEVtaXRUZXhWZXJpZmllZCggZGV2LCBzYXJlYV9wcml2LT5UZXhTdGF0ZVswXSApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfVEVYMDsKKwl9CisKKwlpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9URVgxKSB7CisJCWk4MzBFbWl0VGV4VmVyaWZpZWQoIGRldiwgc2FyZWFfcHJpdi0+VGV4U3RhdGVbMV0gKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX1RFWDE7CisJfQorCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYQkxFTkQwKSB7CisJCWk4MzBFbWl0VGV4QmxlbmRWZXJpZmllZCggZGV2LCBzYXJlYV9wcml2LT5UZXhCbGVuZFN0YXRlWzBdLAorCQkJCXNhcmVhX3ByaXYtPlRleEJsZW5kU3RhdGVXb3Jkc1VzZWRbMF0pOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfVEVYQkxFTkQwOworCX0KKworCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWEJMRU5EMSkgeworCQlpODMwRW1pdFRleEJsZW5kVmVyaWZpZWQoIGRldiwgc2FyZWFfcHJpdi0+VGV4QmxlbmRTdGF0ZVsxXSwKKwkJCQlzYXJlYV9wcml2LT5UZXhCbGVuZFN0YXRlV29yZHNVc2VkWzFdKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX1RFWEJMRU5EMTsKKwl9CisKKwlpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9URVhfUEFMRVRURV9TSEFSRUQpIHsKKwkJaTgzMEVtaXRUZXhQYWxldHRlKGRldiwgc2FyZWFfcHJpdi0+UGFsZXR0ZVswXSwgMCwgMSk7CisJfSBlbHNlIHsKKwkJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYX1BBTEVUVEVfTigwKSkgeworCQkJaTgzMEVtaXRUZXhQYWxldHRlKGRldiwgc2FyZWFfcHJpdi0+UGFsZXR0ZVswXSwgMCwgMCk7CisJCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfVEVYX1BBTEVUVEVfTigwKTsKKwkJfQorCQlpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9URVhfUEFMRVRURV9OKDEpKSB7CisJCQlpODMwRW1pdFRleFBhbGV0dGUoZGV2LCBzYXJlYV9wcml2LT5QYWxldHRlWzFdLCAxLCAwKTsKKwkJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVhfUEFMRVRURV9OKDEpOworCQl9CisKKwkJLyogMS4zOgorCQkgKi8KKyNpZiAwCisJCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWF9QQUxFVFRFX04oMikpIHsKKwkJCWk4MzBFbWl0VGV4UGFsZXR0ZShkZXYsIHNhcmVhX3ByaXYtPlBhbGV0dGUyWzBdLCAwLCAwKTsKKwkJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVhfUEFMRVRURV9OKDIpOworCQl9CisJCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWF9QQUxFVFRFX04oMykpIHsKKwkJCWk4MzBFbWl0VGV4UGFsZXR0ZShkZXYsIHNhcmVhX3ByaXYtPlBhbGV0dGUyWzFdLCAxLCAwKTsKKwkJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVhfUEFMRVRURV9OKDIpOworCQl9CisjZW5kaWYKKwl9CisKKwkvKiAxLjM6CisJICovCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfU1RJUFBMRSkgeworCQlpODMwRW1pdFN0aXBwbGVWZXJpZmllZCggZGV2LCAKKwkJCQkJIHNhcmVhX3ByaXYtPlN0aXBwbGVTdGF0ZSk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9TVElQUExFOworCX0KKworCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWDIpIHsKKwkJaTgzMEVtaXRUZXhWZXJpZmllZCggZGV2LCBzYXJlYV9wcml2LT5UZXhTdGF0ZTIgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX1RFWDI7CisJfQorCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYMykgeworCQlpODMwRW1pdFRleFZlcmlmaWVkKCBkZXYsIHNhcmVhX3ByaXYtPlRleFN0YXRlMyApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfVEVYMzsKKwl9CisKKworCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWEJMRU5EMikgeworCQlpODMwRW1pdFRleEJsZW5kVmVyaWZpZWQoIAorCQkJZGV2LCAKKwkJCXNhcmVhX3ByaXYtPlRleEJsZW5kU3RhdGUyLAorCQkJc2FyZWFfcHJpdi0+VGV4QmxlbmRTdGF0ZVdvcmRzVXNlZDIpOworCisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVhCTEVORDI7CisJfQorCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYQkxFTkQzKSB7CisJCWk4MzBFbWl0VGV4QmxlbmRWZXJpZmllZCggCisJCQlkZXYsIAorCQkJc2FyZWFfcHJpdi0+VGV4QmxlbmRTdGF0ZTMsCisJCQlzYXJlYV9wcml2LT5UZXhCbGVuZFN0YXRlV29yZHNVc2VkMyk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVhCTEVORDM7CisJfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIGk4MzBfZmlsbF9ib3goIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCisJCQkgICBpbnQgciwgaW50IGcsIGludCBiICkKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgY29sb3I7CisJdW5zaWduZWQgaW50IEJSMTMsIENNRDsKKwlSSU5HX0xPQ0FMUzsKKworCUJSMTMgPSAoMHhGMCA8PCAxNikgfCAoZGV2X3ByaXYtPnBpdGNoICogZGV2X3ByaXYtPmNwcCkgfCAoMTw8MjQpOworCUNNRCA9IFhZX0NPTE9SX0JMVF9DTUQ7CisJeCArPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Ym94ZXNbMF0ueDE7CisJeSArPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Ym94ZXNbMF0ueTE7CisKKwlpZiAoZGV2X3ByaXYtPmNwcCA9PSA0KSB7CisJCUJSMTMgfD0gKDE8PDI1KTsKKwkJQ01EIHw9IChYWV9DT0xPUl9CTFRfV1JJVEVfQUxQSEEgfCBYWV9DT0xPUl9CTFRfV1JJVEVfUkdCKTsKKwkJY29sb3IgPSAoKCgweGZmKSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCAgOCkgfCBiKTsJCisJfSBlbHNlIHsKKwkJY29sb3IgPSAoKChyICYgMHhmOCkgPDwgOCkgfAorCQkJICgoZyAmIDB4ZmMpIDw8IDMpIHwKKwkJCSAoKGIgJiAweGY4KSA+PiAzKSk7CisJfQorCisJQkVHSU5fTFBfUklORyggNiApOwkgICAgCisJT1VUX1JJTkcoIENNRCApOworCU9VVF9SSU5HKCBCUjEzICk7CisJT1VUX1JJTkcoICh5IDw8IDE2KSB8IHggKTsKKwlPVVRfUklORyggKCh5K2gpIDw8IDE2KSB8ICh4K3cpICk7CisKKyAJaWYgKCBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDEgKSB7IAorCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X29mZnNldCApOworIAl9IGVsc2UgewkgCisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19vZmZzZXQgKTsKKyAJfSAKKworCU9VVF9SSU5HKCBjb2xvciApOworCUFEVkFOQ0VfTFBfUklORygpOworfQorCitzdGF0aWMgdm9pZCBpODMwX2NwX3BlcmZvcm1hbmNlX2JveGVzKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBQdXJwbGUgYm94IGZvciBwYWdlIGZsaXBwaW5nCisJICovCisJaWYgKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyAmIEk4MzBfQk9YX0ZMSVAgKSAKKwkJaTgzMF9maWxsX2JveCggZGV2LCA0LCA0LCA4LCA4LCAyNTUsIDAsIDI1NSApOworCisJLyogUmVkIGJveCBpZiB3ZSBoYXZlIHRvIHdhaXQgZm9yIGlkbGUgYXQgYW55IHBvaW50CisJICovCisJaWYgKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyAmIEk4MzBfQk9YX1dBSVQgKSAKKwkJaTgzMF9maWxsX2JveCggZGV2LCAxNiwgNCwgOCwgOCwgMjU1LCAwLCAwICk7CisKKwkvKiBCbHVlIGJveDogbG9zdCBjb250ZXh0PworCSAqLworCWlmICggZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgJiBJODMwX0JPWF9MT1NUX0NPTlRFWFQgKSAKKwkJaTgzMF9maWxsX2JveCggZGV2LCAyOCwgNCwgOCwgOCwgMCwgMCwgMjU1ICk7CisKKwkvKiBZZWxsb3cgYm94IGZvciB0ZXh0dXJlIHN3YXBzCisJICovCisJaWYgKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyAmIEk4MzBfQk9YX1RFWFRVUkVfTE9BRCApIAorCQlpODMwX2ZpbGxfYm94KCBkZXYsIDQwLCA0LCA4LCA4LCAyNTUsIDI1NSwgMCApOworCisJLyogR3JlZW4gYm94IGlmIGhhcmR3YXJlIG5ldmVyIGlkbGVzIChhcyBmYXIgYXMgd2UgY2FuIHRlbGwpCisJICovCisJaWYgKCAhKGRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzICYgSTgzMF9CT1hfUklOR19FTVBUWSkgKSAKKwkJaTgzMF9maWxsX2JveCggZGV2LCA2NCwgNCwgOCwgOCwgMCwgMjU1LCAwICk7CisKKworCS8qIERyYXcgYmFycyBpbmRpY2F0aW5nIG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZCAKKwkgKiAobm90IGEgZ3JlYXQgbWVhc3VyZSwgZWFzaWx5IGNvbmZ1c2VkKQorCSAqLworCWlmIChkZXZfcHJpdi0+ZG1hX3VzZWQpIHsKKwkJaW50IGJhciA9IGRldl9wcml2LT5kbWFfdXNlZCAvIDEwMjQwOworCQlpZiAoYmFyID4gMTAwKSBiYXIgPSAxMDA7CisJCWlmIChiYXIgPCAxKSBiYXIgPSAxOworCQlpODMwX2ZpbGxfYm94KCBkZXYsIDQsIDE2LCBiYXIsIDQsIDE5NiwgMTI4LCAxMjggKTsKKwkJZGV2X3ByaXYtPmRtYV91c2VkID0gMDsKKwl9CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX2NsZWFyKCBkcm1fZGV2aWNlX3QgKmRldiwgaW50IGZsYWdzLCAKKwkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY2xlYXJfenZhbCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyX2RlcHRobWFzaykKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgICAgIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCWludCBwaXRjaCA9IGRldl9wcml2LT5waXRjaDsKKwlpbnQgY3BwID0gZGV2X3ByaXYtPmNwcDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgQlIxMywgQ01ELCBEX0NNRDsKKwlSSU5HX0xPQ0FMUzsKKworCisJaWYgKCBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDEgKSB7CisJCXVuc2lnbmVkIGludCB0bXAgPSBmbGFnczsKKworCQlmbGFncyAmPSB+KEk4MzBfRlJPTlQgfCBJODMwX0JBQ0spOworCQlpZiAoIHRtcCAmIEk4MzBfRlJPTlQgKSBmbGFncyB8PSBJODMwX0JBQ0s7CisJCWlmICggdG1wICYgSTgzMF9CQUNLICkgIGZsYWdzIHw9IEk4MzBfRlJPTlQ7CisJfQorCisgIAlpODMwX2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworCXN3aXRjaChjcHApIHsKKwljYXNlIDI6IAorCQlCUjEzID0gKDB4RjAgPDwgMTYpIHwgKHBpdGNoICogY3BwKSB8ICgxPDwyNCk7CisJCURfQ01EID0gQ01EID0gWFlfQ09MT1JfQkxUX0NNRDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlCUjEzID0gKDB4RjAgPDwgMTYpIHwgKHBpdGNoICogY3BwKSB8ICgxPDwyNCkgfCAoMTw8MjUpOworCQlDTUQgPSAoWFlfQ09MT1JfQkxUX0NNRCB8IFhZX0NPTE9SX0JMVF9XUklURV9BTFBIQSB8IAorCQkgICAgICAgWFlfQ09MT1JfQkxUX1dSSVRFX1JHQik7CisJCURfQ01EID0gWFlfQ09MT1JfQkxUX0NNRDsKKwkJaWYoY2xlYXJfZGVwdGhtYXNrICYgMHgwMGZmZmZmZikKKwkJCURfQ01EIHw9IFhZX0NPTE9SX0JMVF9XUklURV9SR0I7CisJCWlmKGNsZWFyX2RlcHRobWFzayAmIDB4ZmYwMDAwMDApCisJCQlEX0NNRCB8PSBYWV9DT0xPUl9CTFRfV1JJVEVfQUxQSEE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJSMTMgPSAoMHhGMCA8PCAxNikgfCAocGl0Y2ggKiBjcHApIHwgKDE8PDI0KTsKKwkJRF9DTUQgPSBDTUQgPSBYWV9DT0xPUl9CTFRfQ01EOworCQlicmVhazsKKwl9CisKKyAgICAgIAlpZiAobmJveCA+IEk4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTKQorICAgICAJCW5ib3ggPSBJODMwX05SX1NBUkVBX0NMSVBSRUNUUzsKKworCWZvciAoaSA9IDAgOyBpIDwgbmJveCA7IGkrKywgcGJveCsrKSB7CisJCWlmIChwYm94LT54MSA+IHBib3gtPngyIHx8CisJCSAgICBwYm94LT55MSA+IHBib3gtPnkyIHx8CisJCSAgICBwYm94LT54MiA+IGRldl9wcml2LT53IHx8CisJCSAgICBwYm94LT55MiA+IGRldl9wcml2LT5oKQorCQkJY29udGludWU7CisKKwkgICAJaWYgKCBmbGFncyAmIEk4MzBfRlJPTlQgKSB7CSAgICAKKwkJICAgCURSTV9ERUJVRygiY2xlYXIgZnJvbnRcbiIpOworCQkJQkVHSU5fTFBfUklORyggNiApOwkgICAgCisJCQlPVVRfUklORyggQ01EICk7CisJCQlPVVRfUklORyggQlIxMyApOworCQkJT1VUX1JJTkcoIChwYm94LT55MSA8PCAxNikgfCBwYm94LT54MSApOworCQkJT1VUX1JJTkcoIChwYm94LT55MiA8PCAxNikgfCBwYm94LT54MiApOworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5mcm9udF9vZmZzZXQgKTsKKwkJCU9VVF9SSU5HKCBjbGVhcl9jb2xvciApOworCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCX0KKworCQlpZiAoIGZsYWdzICYgSTgzMF9CQUNLICkgeworCQkJRFJNX0RFQlVHKCJjbGVhciBiYWNrXG4iKTsKKwkJCUJFR0lOX0xQX1JJTkcoIDYgKTsJICAgIAorCQkJT1VUX1JJTkcoIENNRCApOworCQkJT1VUX1JJTkcoIEJSMTMgKTsKKwkJCU9VVF9SSU5HKCAocGJveC0+eTEgPDwgMTYpIHwgcGJveC0+eDEgKTsKKwkJCU9VVF9SSU5HKCAocGJveC0+eTIgPDwgMTYpIHwgcGJveC0+eDIgKTsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19vZmZzZXQgKTsKKwkJCU9VVF9SSU5HKCBjbGVhcl9jb2xvciApOworCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCX0KKworCQlpZiAoIGZsYWdzICYgSTgzMF9ERVBUSCApIHsKKwkJCURSTV9ERUJVRygiY2xlYXIgZGVwdGhcbiIpOworCQkJQkVHSU5fTFBfUklORyggNiApOworCQkJT1VUX1JJTkcoIERfQ01EICk7CisJCQlPVVRfUklORyggQlIxMyApOworCQkJT1VUX1JJTkcoIChwYm94LT55MSA8PCAxNikgfCBwYm94LT54MSApOworCQkJT1VUX1JJTkcoIChwYm94LT55MiA8PCAxNikgfCBwYm94LT54MiApOworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5kZXB0aF9vZmZzZXQgKTsKKwkJCU9VVF9SSU5HKCBjbGVhcl96dmFsICk7CisJCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfc3dhcCggZHJtX2RldmljZV90ICpkZXYgKQoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgICAgCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJaW50IHBpdGNoID0gZGV2X3ByaXYtPnBpdGNoOworCWludCBjcHAgPSBkZXZfcHJpdi0+Y3BwOworCWludCBpOworCXVuc2lnbmVkIGludCBDTUQsIEJSMTM7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoInN3YXBidWZmZXJzXG4iKTsKKworICAJaTgzMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKwlpZiAoZGV2X3ByaXYtPmRvX2JveGVzKQorCQlpODMwX2NwX3BlcmZvcm1hbmNlX2JveGVzKCBkZXYgKTsKKworCXN3aXRjaChjcHApIHsKKwljYXNlIDI6IAorCQlCUjEzID0gKHBpdGNoICogY3BwKSB8ICgweENDIDw8IDE2KSB8ICgxPDwyNCk7CisJCUNNRCA9IFhZX1NSQ19DT1BZX0JMVF9DTUQ7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJQlIxMyA9IChwaXRjaCAqIGNwcCkgfCAoMHhDQyA8PCAxNikgfCAoMTw8MjQpIHwgKDE8PDI1KTsKKwkJQ01EID0gKFhZX1NSQ19DT1BZX0JMVF9DTUQgfCBYWV9TUkNfQ09QWV9CTFRfV1JJVEVfQUxQSEEgfAorCQkgICAgICAgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX1JHQik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJSMTMgPSAocGl0Y2ggKiBjcHApIHwgKDB4Q0MgPDwgMTYpIHwgKDE8PDI0KTsKKwkJQ01EID0gWFlfU1JDX0NPUFlfQkxUX0NNRDsKKwkJYnJlYWs7CisJfQorCisKKyAgICAgIAlpZiAobmJveCA+IEk4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTKQorICAgICAJCW5ib3ggPSBJODMwX05SX1NBUkVBX0NMSVBSRUNUUzsKKworCWZvciAoaSA9IDAgOyBpIDwgbmJveDsgaSsrLCBwYm94KyspIAorCXsKKwkJaWYgKHBib3gtPngxID4gcGJveC0+eDIgfHwKKwkJICAgIHBib3gtPnkxID4gcGJveC0+eTIgfHwKKwkJICAgIHBib3gtPngyID4gZGV2X3ByaXYtPncgfHwKKwkJICAgIHBib3gtPnkyID4gZGV2X3ByaXYtPmgpCisJCQljb250aW51ZTsKKyAKKwkJRFJNX0RFQlVHKCJkaXNwYXRjaCBzd2FwICVkLCVkLSVkLCVkIVxuIiwKKwkJCSAgcGJveC0+eDEsIHBib3gtPnkxLAorCQkJICBwYm94LT54MiwgcGJveC0+eTIpOworCisJCUJFR0lOX0xQX1JJTkcoIDggKTsKKwkJT1VUX1JJTkcoIENNRCApOworCQlPVVRfUklORyggQlIxMyApOworCQlPVVRfUklORyggKHBib3gtPnkxIDw8IDE2KSB8IHBib3gtPngxICk7CisJCU9VVF9SSU5HKCAocGJveC0+eTIgPDwgMTYpIHwgcGJveC0+eDIgKTsKKworCQlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwKSAKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICk7CisJCWVsc2UKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19vZmZzZXQgKTsJCQkKKworCQlPVVRfUklORyggKHBib3gtPnkxIDw8IDE2KSB8IHBib3gtPngxICk7CisJCU9VVF9SSU5HKCBCUjEzICYgMHhmZmZmICk7CisKKwkJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCkgCisJCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ICk7CQkJCisJCWVsc2UKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICk7CisKKwkJQURWQU5DRV9MUF9SSU5HKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9mbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoICIlczogcGFnZT0lZCBwZkN1cnJlbnRQYWdlPSVkXG4iLCAKKwkJICAgX19GVU5DVElPTl9fLCAKKwkJICAgZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSwKKwkJICAgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSk7CisKKyAgCWk4MzBfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisJaWYgKGRldl9wcml2LT5kb19ib3hlcykgeworCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJODMwX0JPWF9GTElQOworCQlpODMwX2NwX3BlcmZvcm1hbmNlX2JveGVzKCBkZXYgKTsKKwl9CisKKworCUJFR0lOX0xQX1JJTkcoIDIgKTsKKyAgICAJT1VUX1JJTkcoIElOU1RfUEFSU0VSX0NMSUVOVCB8IElOU1RfT1BfRkxVU0ggfCBJTlNUX0ZMVVNIX01BUF9DQUNIRSApOyAKKwlPVVRfUklORyggMCApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJQkVHSU5fTFBfUklORyggNiApOworCU9VVF9SSU5HKCBDTURfT1BfRElTUExBWUJVRkZFUl9JTkZPIHwgQVNZTkNfRkxJUCApOwkKKwlPVVRfUklORyggMCApOworCWlmICggZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwICkgeworCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ICk7CisJCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAxOworCX0gZWxzZSB7CisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICk7CisJCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCX0KKwlPVVRfUklORygwKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCisJQkVHSU5fTFBfUklORyggMiApOworCU9VVF9SSU5HKCBNSV9XQUlUX0ZPUl9FVkVOVCB8CisJCSAgTUlfV0FJVF9GT1JfUExBTkVfQV9GTElQICk7CisJT1VUX1JJTkcoIDAgKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKwkKKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworfQorCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoZHJtX2RldmljZV90ICpkZXYsIAorCQkJCSAgICAgZHJtX2J1Zl90ICpidWYsCisJCQkJICAgICBpbnQgZGlzY2FyZCwKKwkJCQkgICAgIGludCB1c2VkKQoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKyAgIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisgICAJZHJtX2NsaXBfcmVjdF90ICpib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKyAgIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpYnVmLT5idXNfYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gYWRkcmVzcyAtIGRldi0+YWdwLT5iYXNlOyAgICAgCisJaW50IGkgPSAwLCB1OworICAgCVJJTkdfTE9DQUxTOworCisgICAJaTgzMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKyAgIAlpZiAobmJveCA+IEk4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTKSAKKwkJbmJveCA9IEk4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJaWYgKGRpc2NhcmQpIHsKKwkJdSA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgzMF9CVUZfQ0xJRU5ULCAKKwkJCSAgICBJODMwX0JVRl9IQVJEV0FSRSk7CisJCWlmKHUgIT0gSTgzMF9CVUZfQ0xJRU5UKSB7CisJCQlEUk1fREVCVUcoInh4eHggMlxuIik7CisJCX0KKwl9CisKKwlpZiAodXNlZCA+IDQqMTAyMykgCisJCXVzZWQgPSAwOworCisJaWYgKHNhcmVhX3ByaXYtPmRpcnR5KQorCSAgIGk4MzBFbWl0U3RhdGUoIGRldiApOworCisgIAlEUk1fREVCVUcoImRpc3BhdGNoIHZlcnRleCBhZGRyIDB4JWx4LCB1c2VkIDB4JXggbmJveCAlZFxuIiwgCisJCSAgYWRkcmVzcywgdXNlZCwgbmJveCk7CisKKyAgIAlkZXZfcHJpdi0+Y291bnRlcisrOworICAgCURSTV9ERUJVRyggICJkaXNwYXRjaCBjb3VudGVyIDogJWxkXG4iLCBkZXZfcHJpdi0+Y291bnRlcik7CisgICAJRFJNX0RFQlVHKCAgImk4MzBfZG1hX2Rpc3BhdGNoXG4iKTsKKyAgIAlEUk1fREVCVUcoICAic3RhcnQgOiAlbHhcbiIsIHN0YXJ0KTsKKwlEUk1fREVCVUcoICAidXNlZCA6ICVkXG4iLCB1c2VkKTsKKyAgIAlEUk1fREVCVUcoICAic3RhcnQgKyB1c2VkIC0gNCA6ICVsZFxuIiwgc3RhcnQgKyB1c2VkIC0gNCk7CisKKwlpZiAoYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPT0gSTgzMF9CVUZfTUFQUEVEKSB7CisJCXUzMiAqdnAgPSBidWZfcHJpdi0+a2VybmVsX3ZpcnR1YWw7CisKKwkJdnBbMF0gPSAoR0ZYX09QX1BSSU1JVElWRSB8CisJCQlzYXJlYV9wcml2LT52ZXJ0ZXhfcHJpbSB8CisJCQkoKHVzZWQvNCktMikpOworCisJCWlmIChkZXZfcHJpdi0+dXNlX21pX2JhdGNoYnVmZmVyX3N0YXJ0KSB7CisJCQl2cFt1c2VkLzRdID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKKwkJCXVzZWQgKz0gNDsgCisJCX0KKwkJCisJCWlmICh1c2VkICYgNCkgeworCQkJdnBbdXNlZC80XSA9IDA7CisJCQl1c2VkICs9IDQ7CisJCX0KKworCQlpODMwX3VubWFwX2J1ZmZlcihidWYpOworCX0KKwkJICAgCisJaWYgKHVzZWQpIHsKKwkJZG8geworCQkJaWYgKGkgPCBuYm94KSB7CisJCQkJQkVHSU5fTFBfUklORyg2KTsKKwkJCQlPVVRfUklORyggR0ZYX09QX0RSQVdSRUNUX0lORk8gKTsKKwkJCQlPVVRfUklORyggc2FyZWFfcHJpdi0+QnVmZmVyU3RhdGVbSTgzMF9ERVNUUkVHX0RSMV0gKTsKKwkJCQlPVVRfUklORyggYm94W2ldLngxIHwgKGJveFtpXS55MTw8MTYpICk7CisJCQkJT1VUX1JJTkcoIGJveFtpXS54MiB8IChib3hbaV0ueTI8PDE2KSApOworCQkJCU9VVF9SSU5HKCBzYXJlYV9wcml2LT5CdWZmZXJTdGF0ZVtJODMwX0RFU1RSRUdfRFI0XSApOworCQkJCU9VVF9SSU5HKCAwICk7CisJCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCQl9CisKKwkJCWlmIChkZXZfcHJpdi0+dXNlX21pX2JhdGNoYnVmZmVyX3N0YXJ0KSB7CisJCQkJQkVHSU5fTFBfUklORygyKTsKKwkJCQlPVVRfUklORyggTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIHwgKDI8PDYpICk7CisJCQkJT1VUX1JJTkcoIHN0YXJ0IHwgTUlfQkFUQ0hfTk9OX1NFQ1VSRSApOworCQkJCUFEVkFOQ0VfTFBfUklORygpOworCQkJfSAKKwkJCWVsc2UgeworCQkJCUJFR0lOX0xQX1JJTkcoNCk7CisJCQkJT1VUX1JJTkcoIE1JX0JBVENIX0JVRkZFUiApOworCQkJCU9VVF9SSU5HKCBzdGFydCB8IE1JX0JBVENIX05PTl9TRUNVUkUgKTsKKwkJCQlPVVRfUklORyggc3RhcnQgKyB1c2VkIC0gNCApOworCQkJCU9VVF9SSU5HKCAwICk7CisJCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCQl9CisKKwkJfSB3aGlsZSAoKytpIDwgbmJveCk7CisJfQorCisJaWYgKGRpc2NhcmQpIHsKKwkJZGV2X3ByaXYtPmNvdW50ZXIrKzsKKworCQkodm9pZCkgY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODMwX0JVRl9DTElFTlQsCisJCQkgICAgICAgSTgzMF9CVUZfSEFSRFdBUkUpOworCisJCUJFR0lOX0xQX1JJTkcoOCk7CisJCU9VVF9SSU5HKCBDTURfU1RPUkVfRFdPUkRfSURYICk7CisJCU9VVF9SSU5HKCAyMCApOworCQlPVVRfUklORyggZGV2X3ByaXYtPmNvdW50ZXIgKTsKKwkJT1VUX1JJTkcoIENNRF9TVE9SRV9EV09SRF9JRFggKTsKKwkJT1VUX1JJTkcoIGJ1Zl9wcml2LT5teV91c2VfaWR4ICk7CisJCU9VVF9SSU5HKCBJODMwX0JVRl9GUkVFICk7CisJCU9VVF9SSU5HKCBDTURfUkVQT1JUX0hFQUQgKTsKKwkJT1VUX1JJTkcoIDAgKTsKKwkJQURWQU5DRV9MUF9SSU5HKCk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGk4MzBfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKmRldikKK3sKKyAgICAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgIAlSSU5HX0xPQ0FMUzsKKworICAJaTgzMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKyAgIAlCRUdJTl9MUF9SSU5HKDQpOworICAgCU9VVF9SSU5HKCBJTlNUX1BBUlNFUl9DTElFTlQgfCBJTlNUX09QX0ZMVVNIIHwgSU5TVF9GTFVTSF9NQVBfQ0FDSEUgKTsKKyAgIAlPVVRfUklORyggQ01EX1JFUE9SVF9IRUFEICk7CisgICAgICAJT1VUX1JJTkcoIDAgKTsKKyAgICAgIAlPVVRfUklORyggMCApOworICAgCUFEVkFOQ0VfTFBfUklORygpOworCisJaTgzMF93YWl0X3JpbmcoIGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDgsIF9fRlVOQ1RJT05fXyApOworfQorCitzdGF0aWMgaW50IGk4MzBfZmx1c2hfcXVldWUoZHJtX2RldmljZV90ICpkZXYpCit7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisgICAJaW50IGksIHJldCA9IDA7CisgICAJUklOR19MT0NBTFM7CisJCisgICAJaTgzMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKyAgIAlCRUdJTl9MUF9SSU5HKDIpOworICAgICAgCU9VVF9SSU5HKCBDTURfUkVQT1JUX0hFQUQgKTsKKyAgICAgIAlPVVRfUklORyggMCApOworICAgICAgCUFEVkFOQ0VfTFBfUklORygpOworCisJaTgzMF93YWl0X3JpbmcoIGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDgsIF9fRlVOQ1RJT05fXyApOworCisgICAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkgICAJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbIGkgXTsKKwkgICAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCSAgIAorCQlpbnQgdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgzMF9CVUZfSEFSRFdBUkUsIAorCQkJCSAgIEk4MzBfQlVGX0ZSRUUpOworCisJCWlmICh1c2VkID09IEk4MzBfQlVGX0hBUkRXQVJFKQorCQkJRFJNX0RFQlVHKCJyZWNsYWltZWQgZnJvbSBIQVJEV0FSRVxuIik7CisJCWlmICh1c2VkID09IEk4MzBfQlVGX0NMSUVOVCkKKwkJCURSTV9ERUJVRygic3RpbGwgb24gY2xpZW50XG4iKTsKKwl9CisKKyAgIAlyZXR1cm4gcmV0OworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgKi8KK3ZvaWQgaTgzMF9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWludAkJIGk7CisKKwlpZiAoIWRtYSkgcmV0dXJuOworICAgICAgCWlmICghZGV2LT5kZXZfcHJpdmF0ZSkgcmV0dXJuOworCWlmICghZG1hLT5idWZsaXN0KSByZXR1cm47CisKKyAgICAgICAgaTgzMF9mbHVzaF9xdWV1ZShkZXYpOworCisJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkgICAJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbIGkgXTsKKwkgICAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCSAgIAorCQlpZiAoYnVmLT5maWxwID09IGZpbHAgJiYgYnVmX3ByaXYpIHsKKwkJCWludCB1c2VkID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODMwX0JVRl9DTElFTlQsIAorCQkJCQkgICBJODMwX0JVRl9GUkVFKTsKKworCQkJaWYgKHVzZWQgPT0gSTgzMF9CVUZfQ0xJRU5UKQorCQkJCURSTV9ERUJVRygicmVjbGFpbWVkIGZyb20gY2xpZW50XG4iKTsKKwkJICAgCWlmKGJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID09IEk4MzBfQlVGX01BUFBFRCkKKwkJICAgICAJCWJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID0gSTgzMF9CVUZfVU5NQVBQRUQ7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9mbHVzaF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgCWRybV9maWxlX3QJICAqcHJpdgkgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworICAgCWRybV9kZXZpY2VfdAkgICpkZXYJICA9IHByaXYtPmhlYWQtPmRldjsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisgICAJaTgzMF9mbHVzaF9xdWV1ZShkZXYpOworICAgCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MzBfZG1hX3ZlcnRleChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworICAgICAgCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOworICAgCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MzBfc2FyZWFfdCAqKSAKKyAgICAgCQkJCQlkZXZfcHJpdi0+c2FyZWFfcHJpdjsgCisJZHJtX2k4MzBfdmVydGV4X3QgdmVydGV4OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZXJ0ZXgsIChkcm1faTgzMF92ZXJ0ZXhfdCBfX3VzZXIgKilhcmcsIHNpemVvZih2ZXJ0ZXgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCURSTV9ERUJVRygiaTgzMCBkbWEgdmVydGV4LCBpZHggJWQgdXNlZCAlZCBkaXNjYXJkICVkXG4iLAorCQkgIHZlcnRleC5pZHgsIHZlcnRleC51c2VkLCB2ZXJ0ZXguZGlzY2FyZCk7CisKKwlpZih2ZXJ0ZXguaWR4IDwgMCB8fCB2ZXJ0ZXguaWR4ID4gZG1hLT5idWZfY291bnQpIHJldHVybiAtRUlOVkFMOworCisJaTgzMF9kbWFfZGlzcGF0Y2hfdmVydGV4KCBkZXYsIAorCQkJCSAgZG1hLT5idWZsaXN0WyB2ZXJ0ZXguaWR4IF0sIAorCQkJCSAgdmVydGV4LmRpc2NhcmQsIHZlcnRleC51c2VkICk7CisKKwlzYXJlYV9wcml2LT5sYXN0X2VucXVldWUgPSBkZXZfcHJpdi0+Y291bnRlci0xOworICAgCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAoaW50KSBod19zdGF0dXNbNV07CisgICAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODMwX2NsZWFyX2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9pODMwX2NsZWFyX3QgY2xlYXI7CisKKyAgIAlpZiAoY29weV9mcm9tX3VzZXIoJmNsZWFyLCAoZHJtX2k4MzBfY2xlYXJfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjbGVhcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKyAgIAorCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisJLyogR0g6IFNvbWVvbmUncyBkb2luZyBuYXN0eSB0aGluZ3MuLi4gKi8KKwlpZiAoIWRldi0+ZGV2X3ByaXZhdGUpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaTgzMF9kbWFfZGlzcGF0Y2hfY2xlYXIoIGRldiwgY2xlYXIuZmxhZ3MsIAorCQkJCSBjbGVhci5jbGVhcl9jb2xvciwgCisJCQkJIGNsZWFyLmNsZWFyX2RlcHRoLAorCQkJICAgICAgICAgY2xlYXIuY2xlYXJfZGVwdGhtYXNrKTsKKyAgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODMwX3N3YXBfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKyAgIAorCURSTV9ERUJVRygiaTgzMF9zd2FwX2J1ZnNcbiIpOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlpODMwX2RtYV9kaXNwYXRjaF9zd2FwKCBkZXYgKTsKKyAgIAlyZXR1cm4gMDsKK30KKworCisKKy8qIE5vdCBzdXJlIHdoeSB0aGlzIGlzbid0IHNldCBhbGwgdGhlIHRpbWU6CisgKi8gCitzdGF0aWMgdm9pZCBpODMwX2RvX2luaXRfcGFnZWZsaXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAxOworCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworfQorCitzdGF0aWMgaW50IGk4MzBfZG9fY2xlYW51cF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSAhPSAwKQorCQlpODMwX2RtYV9kaXNwYXRjaF9mbGlwKCBkZXYgKTsKKworCWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODMwX2ZsaXBfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlpZiAoIWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nKSAKKwkJaTgzMF9kb19pbml0X3BhZ2VmbGlwKCBkZXYgKTsKKworCWk4MzBfZG1hX2Rpc3BhdGNoX2ZsaXAoIGRldiApOworICAgCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MzBfZ2V0YWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAJZHJtX2ZpbGVfdAkgICpwcml2CSAgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAqZGV2CSAgICA9IHByaXYtPmhlYWQtPmRldjsKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CisgICAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgzMF9zYXJlYV90ICopIAorICAgICAJCQkJCWRldl9wcml2LT5zYXJlYV9wcml2OyAKKworICAgICAgCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAoaW50KSBod19zdGF0dXNbNV07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9nZXRidWYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICAgID0gcHJpdi0+aGVhZC0+ZGV2OworCWludAkJICByZXRjb2RlICAgPSAwOworCWRybV9pODMwX2RtYV90CSAgZDsKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisgICAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CisgICAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgzMF9zYXJlYV90ICopIAorICAgICAJCQkJCWRldl9wcml2LT5zYXJlYV9wcml2OyAKKworCURSTV9ERUJVRygiZ2V0YnVmXG4iKTsKKyAgIAlpZiAoY29weV9mcm9tX3VzZXIoJmQsIChkcm1faTgzMF9kbWFfdCBfX3VzZXIgKilhcmcsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworICAgCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisJCisJZC5ncmFudGVkID0gMDsKKworCXJldGNvZGUgPSBpODMwX2RtYV9nZXRfYnVmZmVyKGRldiwgJmQsIGZpbHApOworCisJRFJNX0RFQlVHKCJpODMwX2RtYTogJWQgcmV0dXJuaW5nICVkLCBncmFudGVkID0gJWRcbiIsCisJCSAgY3VycmVudC0+cGlkLCByZXRjb2RlLCBkLmdyYW50ZWQpOworCisJaWYgKGNvcHlfdG9fdXNlcigoZHJtX2RtYV90IF9fdXNlciAqKWFyZywgJmQsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworICAgCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAoaW50KSBod19zdGF0dXNbNV07CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworc3RhdGljIGludCBpODMwX2NvcHlidWYoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJLyogTmV2ZXIgY29weSAtIDIuNC54IGRvZXNuJ3QgbmVlZCBpdCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MzBfZG9jb3B5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGk4MzBfZ2V0cGFyYW0oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCAKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICAgID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pODMwX2dldHBhcmFtX3QgcGFyYW07CisJaW50IHZhbHVlOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJhbSwgKGRybV9pODMwX2dldHBhcmFtX3QgX191c2VyICopYXJnLCBzaXplb2YocGFyYW0pICkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoKCBwYXJhbS5wYXJhbSApIHsKKwljYXNlIEk4MzBfUEFSQU1fSVJRX0FDVElWRToKKwkJdmFsdWUgPSBkZXYtPmlycV9lbmFibGVkOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIGNvcHlfdG9fdXNlciggcGFyYW0udmFsdWUsICZ2YWx1ZSwgc2l6ZW9mKGludCkgKSApIHsKKwkJRFJNX0VSUk9SKCAiY29weV90b191c2VyXG4iICk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGk4MzBfc2V0cGFyYW0oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QJICAqcHJpdgkgICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgKmRldgkgICAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k4MzBfc2V0cGFyYW1fdCBwYXJhbTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmcGFyYW0sIChkcm1faTgzMF9zZXRwYXJhbV90IF9fdXNlciAqKWFyZywgc2l6ZW9mKHBhcmFtKSApKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCggcGFyYW0ucGFyYW0gKSB7CisJY2FzZSBJODMwX1NFVFBBUkFNX1VTRV9NSV9CQVRDSEJVRkZFUl9TVEFSVDoKKwkJZGV2X3ByaXYtPnVzZV9taV9iYXRjaGJ1ZmZlcl9zdGFydCA9IHBhcmFtLnZhbHVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGk4MzBfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWk4MzBfZG1hX2NsZWFudXAoIGRldiApOworfQorCit2b2lkIGk4MzBfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCkKK3sKKwlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgeworCQlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwkJaWYgKGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nKSB7CisJCQlpODMwX2RvX2NsZWFudXBfcGFnZWZsaXAoZGV2KTsKKwkJfQorCX0KK30KKwordm9pZCBpODMwX2RyaXZlcl9yZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpODMwX3JlY2xhaW1fYnVmZmVycyhkZXYsIGZpbHApOworfQorCitpbnQgaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlpODMwX2RtYV9xdWllc2NlbnQoIGRldiApOworCXJldHVybiAwOworfQorCitkcm1faW9jdGxfZGVzY190IGk4MzBfaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9JTklUKV0gICAgID0geyBpODMwX2RtYV9pbml0LCAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9WRVJURVgpXSAgID0geyBpODMwX2RtYV92ZXJ0ZXgsICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9DTEVBUildICAgID0geyBpODMwX2NsZWFyX2J1ZnMsICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9GTFVTSCldICAgID0geyBpODMwX2ZsdXNoX2lvY3RsLCAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9HRVRBR0UpXSAgID0geyBpODMwX2dldGFnZSwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9HRVRCVUYpXSAgID0geyBpODMwX2dldGJ1ZiwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9TV0FQKV0gICAgID0geyBpODMwX3N3YXBfYnVmcywgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9DT1BZKV0gICAgID0geyBpODMwX2NvcHlidWYsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9ET0NPUFkpXSAgID0geyBpODMwX2RvY29weSwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9GTElQKV0gICAgID0geyBpODMwX2ZsaXBfYnVmcywgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9JUlFfRU1JVCldID0geyBpODMwX2lycV9lbWl0LCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9JUlFfV0FJVCldID0geyBpODMwX2lycV93YWl0LCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9HRVRQQVJBTSldID0geyBpODMwX2dldHBhcmFtLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9TRVRQQVJBTSldID0geyBpODMwX3NldHBhcmFtLCAgICAxLCAwIH0gCit9OworCitpbnQgaTgzMF9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShpODMwX2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzODJjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcm0uaApAQCAtMCwwICsxLDM1MCBAQAorI2lmbmRlZiBfSTgzMF9EUk1fSF8KKyNkZWZpbmUgX0k4MzBfRFJNX0hfCisKKy8qIFdBUk5JTkc6IFRoZXNlIGRlZmluZXMgbXVzdCBiZSB0aGUgc2FtZSBhcyB3aGF0IHRoZSBYc2VydmVyIHVzZXMuCisgKiBpZiB5b3UgY2hhbmdlIHRoZW0sIHlvdSBtdXN0IGNoYW5nZSB0aGUgZGVmaW5lcyBpbiB0aGUgWHNlcnZlci4KKyAqCisgKiBLVzogQWN0dWFsbHksIHlvdSBjYW4ndCBldmVyIGNoYW5nZSB0aGVtIGJlY2F1c2UgZG9pbmcgc28gd291bGQKKyAqIGJyZWFrIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICovCisKKyNpZm5kZWYgX0k4MzBfREVGSU5FU18KKyNkZWZpbmUgX0k4MzBfREVGSU5FU18KKworI2RlZmluZSBJODMwX0RNQV9CVUZfT1JERVIJCTEyCisjZGVmaW5lIEk4MzBfRE1BX0JVRl9TWiAJCSgxPDxJODMwX0RNQV9CVUZfT1JERVIpCisjZGVmaW5lIEk4MzBfRE1BX0JVRl9OUiAJCTI1NgorI2RlZmluZSBJODMwX05SX1NBUkVBX0NMSVBSRUNUUyAJOAorCisvKiBFYWNoIHJlZ2lvbiBpcyBhIG1pbmltdW0gb2YgNjRrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgNjQgb2YgdGhlbS4KKyAqLworI2RlZmluZSBJODMwX05SX1RFWF9SRUdJT05TIDY0CisjZGVmaW5lIEk4MzBfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUgMTYKKworLyogS1c6IFRoZXNlIGFyZW4ndCBjb3JyZWN0IGJ1dCBzb21lb25lIHNldCB0aGVtIHRvIHR3byBhbmQgdGhlbgorICogcmVsZWFzZWQgdGhlIG1vZHVsZS4gIE5vdyB3ZSBjYW4ndCBjaGFuZ2UgdGhlbSBhcyBkb2luZyBzbyB3b3VsZAorICogYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgKi8KKyNkZWZpbmUgSTgzMF9URVhUVVJFX0NPVU5UCTIKKyNkZWZpbmUgSTgzMF9URVhCTEVORF9DT1VOVAlJODMwX1RFWFRVUkVfQ09VTlQKKworI2RlZmluZSBJODMwX1RFWEJMRU5EX1NJWkUJMTIJLyogKDQgYXJncyArIG9wKSAqIDIgKyBDT0xPUl9GQUNUT1IgKi8KKworI2RlZmluZSBJODMwX1VQTE9BRF9DVFgJCQkweDEKKyNkZWZpbmUgSTgzMF9VUExPQURfQlVGRkVSUwkJMHgyCisjZGVmaW5lIEk4MzBfVVBMT0FEX0NMSVBSRUNUUwkJMHg0CisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDBfSU1BR0UJCTB4MTAwIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODMwX1VQTE9BRF9URVgwX0NVQkUJCTB4MjAwIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODMwX1VQTE9BRF9URVgxX0lNQUdFCQkweDQwMCAvKiBoYW5kbGVkIGNsaWVudHNpZGUgKi8KKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYMV9DVUJFCQkweDgwMCAvKiBoYW5kbGVkIGNsaWVudHNpZGUgKi8KKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYMl9JTUFHRQkJMHgxMDAwIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODMwX1VQTE9BRF9URVgyX0NVQkUJCTB4MjAwMCAvKiBoYW5kbGVkIGNsaWVudHNpZGUgKi8KKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYM19JTUFHRQkJMHg0MDAwIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODMwX1VQTE9BRF9URVgzX0NVQkUJCTB4ODAwMCAvKiBoYW5kbGVkIGNsaWVudHNpZGUgKi8KKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYX05fSU1BR0UobikJKDB4MTAwIDw8IChuICogMikpCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWF9OX0NVQkUobikJKDB4MjAwIDw8IChuICogMikpCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWElNQUdFX01BU0sJMHhmZjAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDAJCQkweDEwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDEJCQkweDIwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDIJCQkweDQwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDMJCQkweDgwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWF9OKG4pCQkoMHgxMDAwMCA8PCAobikpCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWF9NQVNLCQkweGYwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWEJMRU5EMAkJMHgxMDAwMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYQkxFTkQxCQkweDIwMDAwMAorI2RlZmluZSBJODMwX1VQTE9BRF9URVhCTEVORDIJCTB4NDAwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWEJMRU5EMwkJMHg4MDAwMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYQkxFTkRfTihuKQkoMHgxMDAwMDAgPDwgKG4pKQorI2RlZmluZSBJODMwX1VQTE9BRF9URVhCTEVORF9NQVNLCTB4ZjAwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWF9QQUxFVFRFX04obikgICAgKDB4MTAwMDAwMCA8PCAobikpCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWF9QQUxFVFRFX1NIQVJFRAkweDQwMDAwMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfU1RJUFBMRSAgICAgICAgIAkweDgwMDAwMDAKKworLyogSW5kaWNlcyBpbnRvIGJ1Zi5TZXR1cCB3aGVyZSB2YXJpb3VzIGJpdHMgb2Ygc3RhdGUgYXJlIG1pcnJvcmVkIHBlcgorICogY29udGV4dCBhbmQgcGVyIGJ1ZmZlci4gIFRoZXNlIGNhbiBiZSBmaXJlZCBhdCB0aGUgY2FyZCBhcyBhIHVuaXQsCisgKiBvciBpbiBhIHBpZWNld2lzZSBmYXNoaW9uIGFzIHJlcXVpcmVkLgorICovCisKKy8qIERlc3RidWZmZXIgc3RhdGUgCisgKiAgICAtIGJhY2tidWZmZXIgbGluZWFyIG9mZnNldCBhbmQgcGl0Y2ggLS0gaW52YXJpZW50IGluIHRoZSBjdXJyZW50IGRyaQorICogICAgLSB6YnVmZmVyIGxpbmVhciBvZmZzZXQgYW5kIHBpdGNoIC0tIGFsc28gaW52YXJpZW50CisgKiAgICAtIGRyYXdpbmcgb3JpZ2luIGluIGJhY2sgYW5kIGRlcHRoIGJ1ZmZlcnMuCisgKgorICogS2VlcCB0aGUgZGVwdGgvYmFjayBidWZmZXIgc3RhdGUgaGVyZSB0byBhY2NvbW1vZGF0ZSBwcml2YXRlIGJ1ZmZlcnMKKyAqIGluIHRoZSBmdXR1cmUuCisgKi8KKworI2RlZmluZSBJODMwX0RFU1RSRUdfQ0JVRkFERFIgMAorI2RlZmluZSBJODMwX0RFU1RSRUdfREJVRkFERFIgMQorI2RlZmluZSBJODMwX0RFU1RSRUdfRFYwIDIKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX0RWMSAzCisjZGVmaW5lIEk4MzBfREVTVFJFR19TRU5BQkxFIDQKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX1NSMCA1CisjZGVmaW5lIEk4MzBfREVTVFJFR19TUjEgNgorI2RlZmluZSBJODMwX0RFU1RSRUdfU1IyIDcKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX0RSMCA4CisjZGVmaW5lIEk4MzBfREVTVFJFR19EUjEgOQorI2RlZmluZSBJODMwX0RFU1RSRUdfRFIyIDEwCisjZGVmaW5lIEk4MzBfREVTVFJFR19EUjMgMTEKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX0RSNCAxMgorI2RlZmluZSBJODMwX0RFU1RfU0VUVVBfU0laRSAxMworCisvKiBDb250ZXh0IHN0YXRlCisgKi8KKyNkZWZpbmUgSTgzMF9DVFhSRUdfU1RBVEUxCQkwCisjZGVmaW5lIEk4MzBfQ1RYUkVHX1NUQVRFMgkJMQorI2RlZmluZSBJODMwX0NUWFJFR19TVEFURTMJCTIKKyNkZWZpbmUgSTgzMF9DVFhSRUdfU1RBVEU0CQkzCisjZGVmaW5lIEk4MzBfQ1RYUkVHX1NUQVRFNQkJNAorI2RlZmluZSBJODMwX0NUWFJFR19JQUxQSEFCCQk1CisjZGVmaW5lIEk4MzBfQ1RYUkVHX1NURU5DSUxUU1QJCTYKKyNkZWZpbmUgSTgzMF9DVFhSRUdfRU5BQkxFU18xCQk3CisjZGVmaW5lIEk4MzBfQ1RYUkVHX0VOQUJMRVNfMgkJOAorI2RlZmluZSBJODMwX0NUWFJFR19BQQkJCTkKKyNkZWZpbmUgSTgzMF9DVFhSRUdfRk9HQ09MT1IJCTEwCisjZGVmaW5lIEk4MzBfQ1RYUkVHX0JMRU5EQ09MUjAJCTExCisjZGVmaW5lIEk4MzBfQ1RYUkVHX0JMRU5EQ09MUgkJMTIgLyogRHdvcmQgMSBvZiAyIGR3b3JkIGNvbW1hbmQgKi8KKyNkZWZpbmUgSTgzMF9DVFhSRUdfVkYJCQkxMworI2RlZmluZSBJODMwX0NUWFJFR19WRjIJCQkxNAorI2RlZmluZSBJODMwX0NUWFJFR19NQ1NCMAkJMTUKKyNkZWZpbmUgSTgzMF9DVFhSRUdfTUNTQjEJCTE2CisjZGVmaW5lIEk4MzBfQ1RYX1NFVFVQX1NJWkUJCTE3CisKKy8qIDEuMzogU3RpcHBsZSBzdGF0ZQorICovIAorI2RlZmluZSBJODMwX1NUUFJFR19TVDAgMAorI2RlZmluZSBJODMwX1NUUFJFR19TVDEgMQorI2RlZmluZSBJODMwX1NUUF9TRVRVUF9TSVpFIDIKKworCisvKiBUZXh0dXJlIHN0YXRlIChwZXIgdGV4IHVuaXQpCisgKi8KKworI2RlZmluZSBJODMwX1RFWFJFR19NSTAJMAkvKiBHRlhfT1BfTUFQX0lORk8gKDYgZHdvcmRzKSAqLworI2RlZmluZSBJODMwX1RFWFJFR19NSTEJMQorI2RlZmluZSBJODMwX1RFWFJFR19NSTIJMgorI2RlZmluZSBJODMwX1RFWFJFR19NSTMJMworI2RlZmluZSBJODMwX1RFWFJFR19NSTQJNAorI2RlZmluZSBJODMwX1RFWFJFR19NSTUJNQorI2RlZmluZSBJODMwX1RFWFJFR19NRgk2CS8qIEdGWF9PUF9NQVBfRklMVEVSICovCisjZGVmaW5lIEk4MzBfVEVYUkVHX01MQwk3CS8qIEdGWF9PUF9NQVBfTE9EX0NUTCAqLworI2RlZmluZSBJODMwX1RFWFJFR19NTEwJOAkvKiBHRlhfT1BfTUFQX0xPRF9MSU1JVFMgKi8KKyNkZWZpbmUgSTgzMF9URVhSRUdfTUNTCTkJLyogR0ZYX09QX01BUF9DT09SRF9TRVRTICovCisjZGVmaW5lIEk4MzBfVEVYX1NFVFVQX1NJWkUgMTAKKworI2RlZmluZSBJODMwX1RFWFJFR19UTTBMSSAgICAgIDAgLyogbG9hZCBpbW1lZGlhdGUgMiB0ZXh0dXJlIG1hcCBuICovCisjZGVmaW5lIEk4MzBfVEVYUkVHX1RNMFMwICAgICAgMQorI2RlZmluZSBJODMwX1RFWFJFR19UTTBTMSAgICAgIDIKKyNkZWZpbmUgSTgzMF9URVhSRUdfVE0wUzIgICAgICAzCisjZGVmaW5lIEk4MzBfVEVYUkVHX1RNMFMzICAgICAgNAorI2RlZmluZSBJODMwX1RFWFJFR19UTTBTNCAgICAgIDUKKyNkZWZpbmUgSTgzMF9URVhSRUdfTk9QMCAgICAgICA2ICAgICAgIC8qIG5vb3AgKi8KKyNkZWZpbmUgSTgzMF9URVhSRUdfTk9QMSAgICAgICA3ICAgICAgIC8qIG5vb3AgKi8KKyNkZWZpbmUgSTgzMF9URVhSRUdfTk9QMiAgICAgICA4ICAgICAgIC8qIG5vb3AgKi8KKyNkZWZpbmUgX19JODMwX1RFWFJFR19NQ1MgICAgICA5ICAgICAgIC8qIEdGWF9PUF9NQVBfQ09PUkRfU0VUUyAtLSBzaGFyZWQgKi8KKyNkZWZpbmUgX19JODMwX1RFWF9TRVRVUF9TSVpFICAgMTAKKworI2RlZmluZSBJODMwX0ZST05UICAgMHgxCisjZGVmaW5lIEk4MzBfQkFDSyAgICAweDIKKyNkZWZpbmUgSTgzMF9ERVBUSCAgIDB4NAorCisjZW5kaWYgLyogX0k4MzBfREVGSU5FU18gKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODMwX2luaXQgeworCWVudW0geworCQlJODMwX0lOSVRfRE1BID0gMHgwMSwKKwkJSTgzMF9DTEVBTlVQX0RNQSA9IDB4MDIKKwl9IGZ1bmM7CisJdW5zaWduZWQgaW50IG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGludCBidWZmZXJzX29mZnNldDsKKwlpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJpbmdfc3RhcnQ7CisJdW5zaWduZWQgaW50IHJpbmdfZW5kOworCXVuc2lnbmVkIGludCByaW5nX3NpemU7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgdzsKKwl1bnNpZ25lZCBpbnQgaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2g7CisJdW5zaWduZWQgaW50IHBpdGNoX2JpdHM7CisJdW5zaWduZWQgaW50IGJhY2tfcGl0Y2g7CisJdW5zaWduZWQgaW50IGRlcHRoX3BpdGNoOworCXVuc2lnbmVkIGludCBjcHA7Cit9IGRybV9pODMwX2luaXRfdDsKKworLyogV2FybmluZzogSWYgeW91IGNoYW5nZSB0aGUgU0FSRUEgc3RydWN0dXJlIHlvdSBtdXN0IGNoYW5nZSB0aGUgWHNlcnZlcgorICogc3RydWN0dXJlIGFzIHdlbGwgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODMwX3RleF9yZWdpb24geworCXVuc2lnbmVkIGNoYXIgbmV4dCwgcHJldjsgLyogaW5kaWNlcyB0byBmb3JtIGEgY2lyY3VsYXIgTFJVICAqLworCXVuc2lnbmVkIGNoYXIgaW5fdXNlOwkvKiBvd25lZCBieSBhIGNsaWVudCwgb3IgZnJlZT8gKi8KKwlpbnQgYWdlOwkJLyogdHJhY2tlZCBieSBjbGllbnRzIHRvIHVwZGF0ZSBsb2NhbCBMUlUncyAqLworfSBkcm1faTgzMF90ZXhfcmVnaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgzMF9zYXJlYSB7CisJdW5zaWduZWQgaW50IENvbnRleHRTdGF0ZVtJODMwX0NUWF9TRVRVUF9TSVpFXTsKKyAgIAl1bnNpZ25lZCBpbnQgQnVmZmVyU3RhdGVbSTgzMF9ERVNUX1NFVFVQX1NJWkVdOworCXVuc2lnbmVkIGludCBUZXhTdGF0ZVtJODMwX1RFWFRVUkVfQ09VTlRdW0k4MzBfVEVYX1NFVFVQX1NJWkVdOworCXVuc2lnbmVkIGludCBUZXhCbGVuZFN0YXRlW0k4MzBfVEVYQkxFTkRfQ09VTlRdW0k4MzBfVEVYQkxFTkRfU0laRV07CisJdW5zaWduZWQgaW50IFRleEJsZW5kU3RhdGVXb3Jkc1VzZWRbSTgzMF9URVhCTEVORF9DT1VOVF07CisJdW5zaWduZWQgaW50IFBhbGV0dGVbMl1bMjU2XTsKKyAgIAl1bnNpZ25lZCBpbnQgZGlydHk7CisKKwl1bnNpZ25lZCBpbnQgbmJveDsKKwlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbSTgzMF9OUl9TQVJFQV9DTElQUkVDVFNdOworCisJLyogTWFpbnRhaW4gYW4gTFJVIG9mIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiB0ZXh0dXJlIHNwYWNlLiAgSWYKKwkgKiB5b3UgdGhpbmsgeW91IG93biBhIHJlZ2lvbiBvZiB0ZXh0dXJlIG1lbW9yeSwgYW5kIGl0IGhhcyBhbgorCSAqIGFnZSBkaWZmZXJlbnQgdG8gdGhlIG9uZSB5b3Ugc2V0LCB0aGVuIHlvdSBhcmUgbWlzdGFrZW4gYW5kCisJICogaXQgaGFzIGJlZW4gc3RvbGVuIGJ5IGFub3RoZXIgY2xpZW50LiAgSWYgZ2xvYmFsIHRleEFnZQorCSAqIGhhc24ndCBjaGFuZ2VkLCB0aGVyZSBpcyBubyBuZWVkIHRvIHdhbGsgdGhlIGxpc3QuCisJICoKKwkgKiBUaGVzZSByZWdpb25zIGNhbiBiZSB1c2VkIGFzIGEgcHJveHkgZm9yIHRoZSBmaW5lLWdyYWluZWQKKwkgKiB0ZXh0dXJlIGluZm9ybWF0aW9uIG9mIG90aGVyIGNsaWVudHMgLSBieSBtYWludGFpbmluZyB0aGVtCisJICogaW4gdGhlIHNhbWUgbHJ1IHdoaWNoIGlzIHVzZWQgdG8gYWdlIHRoZWlyIG93biB0ZXh0dXJlcywKKwkgKiBjbGllbnRzIGhhdmUgYW4gYXBwcm94aW1hdGUgbHJ1IGZvciB0aGUgd2hvbGUgb2YgZ2xvYmFsCisJICogdGV4dHVyZSBzcGFjZSwgYW5kIGNhbiBtYWtlIGluZm9ybWVkIGRlY2lzaW9ucyBhcyB0byB3aGljaAorCSAqIGFyZWFzIHRvIGtpY2sgb3V0LiAgVGhlcmUgaXMgbm8gbmVlZCB0byBjaG9vc2Ugd2hldGhlciB0bworCSAqIGtpY2sgb3V0IHlvdXIgb3duIHRleHR1cmUgb3Igc29tZW9uZSBlbHNlJ3MgLSBzaW1wbHkgZWplY3QKKwkgKiB0aGVtIGFsbCBpbiBMUlUgb3JkZXIuICAKKwkgKi8KKworCWRybV9pODMwX3RleF9yZWdpb25fdCB0ZXhMaXN0W0k4MzBfTlJfVEVYX1JFR0lPTlMrMV07IAorCQkJCS8qIExhc3QgZWx0IGlzIHNlbnRpbmFsICovCisgICAgICAgIGludCB0ZXhBZ2U7CQkvKiBsYXN0IHRpbWUgdGV4dHVyZSB3YXMgdXBsb2FkZWQgKi8KKyAgICAgICAgaW50IGxhc3RfZW5xdWV1ZTsJLyogbGFzdCB0aW1lIGEgYnVmZmVyIHdhcyBlbnF1ZXVlZCAqLworCWludCBsYXN0X2Rpc3BhdGNoOwkvKiBhZ2Ugb2YgdGhlIG1vc3QgcmVjZW50bHkgZGlzcGF0Y2hlZCBidWZmZXIgKi8KKwlpbnQgbGFzdF9xdWllc2NlbnQ7ICAgICAvKiAgKi8KKwlpbnQgY3R4T3duZXI7CQkvKiBsYXN0IGNvbnRleHQgdG8gdXBsb2FkIHN0YXRlICovCisKKwlpbnQgdmVydGV4X3ByaW07CisKKyAgICAgICAgaW50IHBmX2VuYWJsZWQ7ICAgICAgICAgICAgICAgLyogaXMgcGFnZWZsaXBwaW5nIGFsbG93ZWQ/ICovCisgICAgICAgIGludCBwZl9hY3RpdmU7ICAgICAgICAgICAgICAgCisgICAgICAgIGludCBwZl9jdXJyZW50X3BhZ2U7CSAgICAvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkPyAqLworCisgICAgICAgIGludCBwZXJmX2JveGVzOyAgICAgICAgICAgICAvKiBwZXJmb3JtYW5jZSBib3hlcyB0byBiZSBkaXNwbGF5ZWQgKi8KKyAgIAorICAgICAgICAvKiBIZXJlJ3MgdGhlIHN0YXRlIGZvciB0ZXh1bml0cyAyLDM6CisJICovCisJdW5zaWduZWQgaW50IFRleFN0YXRlMltJODMwX1RFWF9TRVRVUF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgVGV4QmxlbmRTdGF0ZTJbSTgzMF9URVhCTEVORF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgVGV4QmxlbmRTdGF0ZVdvcmRzVXNlZDI7CisKKwl1bnNpZ25lZCBpbnQgVGV4U3RhdGUzW0k4MzBfVEVYX1NFVFVQX1NJWkVdOworCXVuc2lnbmVkIGludCBUZXhCbGVuZFN0YXRlM1tJODMwX1RFWEJMRU5EX1NJWkVdOworCXVuc2lnbmVkIGludCBUZXhCbGVuZFN0YXRlV29yZHNVc2VkMzsKKworCXVuc2lnbmVkIGludCBTdGlwcGxlU3RhdGVbSTgzMF9TVFBfU0VUVVBfU0laRV07Cit9IGRybV9pODMwX3NhcmVhX3Q7CisKKy8qIEZsYWdzIGZvciBwZXJmX2JveGVzCisgKi8KKyNkZWZpbmUgSTgzMF9CT1hfUklOR19FTVBUWSAgICAweDEgLyogcG9wdWxhdGVkIGJ5IGtlcm5lbCAqLworI2RlZmluZSBJODMwX0JPWF9GTElQICAgICAgICAgIDB4MiAvKiBwb3B1bGF0ZWQgYnkga2VybmVsICovCisjZGVmaW5lIEk4MzBfQk9YX1dBSVQgICAgICAgICAgMHg0IC8qIHBvcHVsYXRlZCBieSBrZXJuZWwgJiBjbGllbnQgKi8KKyNkZWZpbmUgSTgzMF9CT1hfVEVYVFVSRV9MT0FEICAweDggLyogcG9wdWxhdGVkIGJ5IGtlcm5lbCAqLworI2RlZmluZSBJODMwX0JPWF9MT1NUX0NPTlRFWFQgIDB4MTAgLyogcG9wdWxhdGVkIGJ5IGNsaWVudCAqLworCisKKy8qIEk4MzAgc3BlY2lmaWMgaW9jdGxzCisgKiBUaGUgZGV2aWNlIHNwZWNpZmljIGlvY3RsIHJhbmdlIGlzIDB4NDAgdG8gMHg3OS4KKyAqLworI2RlZmluZSBEUk1fSTgzMF9JTklUCTB4MDAKKyNkZWZpbmUgRFJNX0k4MzBfVkVSVEVYCTB4MDEKKyNkZWZpbmUgRFJNX0k4MzBfQ0xFQVIJMHgwMgorI2RlZmluZSBEUk1fSTgzMF9GTFVTSAkweDAzCisjZGVmaW5lIERSTV9JODMwX0dFVEFHRQkweDA0CisjZGVmaW5lIERSTV9JODMwX0dFVEJVRgkweDA1CisjZGVmaW5lIERSTV9JODMwX1NXQVAJMHgwNgorI2RlZmluZSBEUk1fSTgzMF9DT1BZCTB4MDcKKyNkZWZpbmUgRFJNX0k4MzBfRE9DT1BZCTB4MDgKKyNkZWZpbmUgRFJNX0k4MzBfRkxJUAkweDA5CisjZGVmaW5lIERSTV9JODMwX0lSUV9FTUlUCTB4MGEKKyNkZWZpbmUgRFJNX0k4MzBfSVJRX1dBSVQJMHgwYgorI2RlZmluZSBEUk1fSTgzMF9HRVRQQVJBTQkweDBjCisjZGVmaW5lIERSTV9JODMwX1NFVFBBUkFNCTB4MGQKKworI2RlZmluZSBEUk1fSU9DVExfSTgzMF9JTklUCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0lPQ1RMX0k4MzBfSU5JVCwgZHJtX2k4MzBfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9WRVJURVgJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9WRVJURVgsIGRybV9pODMwX3ZlcnRleF90KQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9DTEVBUgkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX0NMRUFSLCBkcm1faTgzMF9jbGVhcl90KQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9GTFVTSAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX0ZMVVNIKQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9HRVRBR0UJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9HRVRBR0UpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX0dFVEJVRgkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX0dFVEJVRiwgZHJtX2k4MzBfZG1hX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX1NXQVAJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9TV0FQKQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9DT1BZCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0lPQ1RMX0k4MzBfQ09QWSwgZHJtX2k4MzBfY29weV90KQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9ET0NPUFkJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9ET0NPUFkpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX0ZMSVAJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9GTElQKQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9JUlFfRU1JVCAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9JUlFfRU1JVCwgZHJtX2k4MzBfaXJxX2VtaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MzBfSVJRX1dBSVQgICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0lPQ1RMX0k4MzBfSVJRX1dBSVQsIGRybV9pODMwX2lycV93YWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX0dFVFBBUkFNICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX0dFVFBBUkFNLCBkcm1faTgzMF9nZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9TRVRQQVJBTSAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9TRVRQQVJBTSwgZHJtX2k4MzBfc2V0cGFyYW1fdCkKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODMwX2NsZWFyIHsKKwlpbnQgY2xlYXJfY29sb3I7CisJaW50IGNsZWFyX2RlcHRoOworCWludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfY29sb3JtYXNrOworCXVuc2lnbmVkIGludCBjbGVhcl9kZXB0aG1hc2s7Cit9IGRybV9pODMwX2NsZWFyX3Q7CisKKworCisvKiBUaGVzZSBtYXkgYmUgcGxhY2Vob2xkZXJzIGlmIHdlIGhhdmUgbW9yZSBjbGlwcmVjdHMgdGhhbgorICogSTgzMF9OUl9TQVJFQV9DTElQUkVDVFMuICBJbiB0aGF0IGNhc2UsIHRoZSBjbGllbnQgc2V0cyBkaXNjYXJkIHRvCisgKiBmYWxzZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgd2lsbCBiZSBkaXNwYXRjaGVkIGFnYWluIHdpdGggYQorICogbmV3IHNldCBvZiBjbGlwcmVjdHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9kcm1faTgzMF92ZXJ0ZXggeworICAgCWludCBpZHg7CQkvKiBidWZmZXIgaW5kZXggKi8KKwlpbnQgdXNlZDsJCS8qIG5yIGJ5dGVzIGluIHVzZSAqLworCWludCBkaXNjYXJkOwkJLyogY2xpZW50IGlzIGZpbmlzaGVkIHdpdGggdGhlIGJ1ZmZlcj8gKi8KK30gZHJtX2k4MzBfdmVydGV4X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgzMF9jb3B5X3QgeworICAgCWludCBpZHg7CQkvKiBidWZmZXIgaW5kZXggKi8KKwlpbnQgdXNlZDsJCS8qIG5yIGJ5dGVzIGluIHVzZSAqLworCXZvaWQgX191c2VyICphZGRyZXNzOwkJLyogQWRkcmVzcyB0byBjb3B5IGZyb20gKi8KK30gZHJtX2k4MzBfY29weV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1faTgzMF9kbWEgeworCXZvaWQgX191c2VyICp2aXJ0dWFsOworCWludCByZXF1ZXN0X2lkeDsKKwlpbnQgcmVxdWVzdF9zaXplOworCWludCBncmFudGVkOworfSBkcm1faTgzMF9kbWFfdDsKKworCisvKiAxLjM6IFVzZXJzcGFjZSBjYW4gcmVxdWVzdCAmIHdhaXQgb24gaXJxJ3M6CisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9pODMwX2lycV9lbWl0IHsKKwlpbnQgX191c2VyICppcnFfc2VxOworfSBkcm1faTgzMF9pcnFfZW1pdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1faTgzMF9pcnFfd2FpdCB7CisJaW50IGlycV9zZXE7Cit9IGRybV9pODMwX2lycV93YWl0X3Q7CisKKworLyogMS4zOiBOZXcgaW9jdGwgdG8gcXVlcnkga2VybmVsIHBhcmFtczoKKyAqLworI2RlZmluZSBJODMwX1BBUkFNX0lSUV9BQ1RJVkUgICAgICAgICAgICAxCisKK3R5cGVkZWYgc3RydWN0IGRybV9pODMwX2dldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJaW50IF9fdXNlciAqdmFsdWU7Cit9IGRybV9pODMwX2dldHBhcmFtX3Q7CisKKworLyogMS4zOiBOZXcgaW9jdGwgdG8gc2V0IGtlcm5lbCBwYXJhbXM6CisgKi8KKyNkZWZpbmUgSTgzMF9TRVRQQVJBTV9VU0VfTUlfQkFUQ0hCVUZGRVJfU1RBUlQgICAgICAgICAgICAxCisKK3R5cGVkZWYgc3RydWN0IGRybV9pODMwX3NldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJaW50IHZhbHVlOworfSBkcm1faTgzMF9zZXRwYXJhbV90OworCisKKyNlbmRpZiAvKiBfSTgzMF9EUk1fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTgwYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5jCkBAIC0wLDAgKzEsMTM3IEBACisvKiBpODMwX2Rydi5jIC0tIEk4MTAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwMTo1NjoyMiAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICogICAgQWJyYWhhbSB2ZCBNZXJ3ZSA8YWJyYWhhbUAyZDNkLmNvLnphPgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaTgzMF9kcm0uaCIKKyNpbmNsdWRlICJpODMwX2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgorCitpbnQgcG9zdGluaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKQoreworCWRldi0+Y291bnRlcnMgKz0gNDsKKwlkZXYtPnR5cGVzWzZdID0gX0RSTV9TVEFUX0lSUTsKKwlkZXYtPnR5cGVzWzddID0gX0RSTV9TVEFUX1BSSU1BUlk7CisJZGV2LT50eXBlc1s4XSA9IF9EUk1fU1RBVF9TRUNPTkRBUlk7CisJZGV2LT50eXBlc1s5XSA9IF9EUk1fU1RBVF9ETUE7CisJCisJRFJNX0lORk8oICJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCisJCURSSVZFUl9OQU1FLAorCQlEUklWRVJfTUFKT1IsCisJCURSSVZFUl9NSU5PUiwKKwkJRFJJVkVSX1BBVENITEVWRUwsCisJCURSSVZFUl9EQVRFLAorCQlkZXYtPnByaW1hcnkubWlub3IsCisJCXBjaV9wcmV0dHlfbmFtZShkZXYtPnBkZXYpCisJCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyc2lvbiggZHJtX3ZlcnNpb25fdCAqdmVyc2lvbiApCit7CisJaW50IGxlbjsKKworCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKKwlEUk1fQ09QWSggdmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0geworCWk4MzBfUENJX0lEUworfTsKKworZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3QgaTgzMF9pb2N0bHNbXTsKK2V4dGVybiBpbnQgaTgzMF9tYXhfaW9jdGw7CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1JFUVVJUkVfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwgRFJJVkVSX0hBVkVfRE1BIHwgRFJJVkVSX0RNQV9RVUVVRSwKKyNpZiBVU0VfSVJRUworCS5kcml2ZXJfZmVhdHVyZXMgfD0gRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX1NIQVJFRF9JUlEsCisjZW5kaWYKKwkuZGV2X3ByaXZfc2l6ZSA9IHNpemVvZihkcm1faTgzMF9idWZfcHJpdl90KSwKKwkucHJldGFrZWRvd24gPSBpODMwX2RyaXZlcl9wcmV0YWtlZG93biwKKwkucHJlcmVsZWFzZSA9IGk4MzBfZHJpdmVyX3ByZXJlbGVhc2UsCisJLnJlbGVhc2UgPSBpODMwX2RyaXZlcl9yZWxlYXNlLAorCS5kbWFfcXVpZXNjZW50ID0gaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudCwKKwkucmVjbGFpbV9idWZmZXJzID0gaTgzMF9yZWNsYWltX2J1ZmZlcnMsCisJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCisJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCisjaWYgVVNFX0lSUVMKKwkuaXJxX3ByZWluc3RhbGwgPSBpODMwX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCwKKwkuaXJxX3Bvc3RpbnN0YWxsID0gaTgzMF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsLAorCS5pcnFfdW5pbnN0YWxsID0gaTgzMF9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKKwkuaXJxX2hhbmRsZXIgPSBpODMwX2RyaXZlcl9pcnFfaGFuZGxlciwKKyNlbmRpZgorCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAorCS52ZXJzaW9uID0gdmVyc2lvbiwKKwkuaW9jdGxzID0gaTgzMF9pb2N0bHMsCisJLmZvcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub3BlbiA9IGRybV9vcGVuLAorCQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCQkuaW9jdGwgPSBkcm1faW9jdGwsCisJCS5tbWFwID0gZHJtX21tYXAsCisJCS5wb2xsID0gZHJtX3BvbGwsCisJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorCX0sCisJLnBjaV9kcml2ZXIgPSB7CisJCS5uYW1lICAgICAgICAgID0gRFJJVkVSX05BTUUsCisJCS5pZF90YWJsZSAgICAgID0gcGNpaWRsaXN0LAorCX0KKworfTsKKworc3RhdGljIGludCBfX2luaXQgaTgzMF9pbml0KHZvaWQpCit7CisJZHJpdmVyLm51bV9pb2N0bHMgPSBpODMwX21heF9pb2N0bDsKKwlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpODMwX2V4aXQodm9pZCkKK3sKKwlkcm1fZXhpdCgmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaTgzMF9pbml0KTsKK21vZHVsZV9leGl0KGk4MzBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiMmQwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaApAQCAtMCwwICsxLDMwMSBAQAorLyogaTgzMF9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgdGhlIEk4MzAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwMTo1MDowMSAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiAJICAgIEplZmYgSGFydG1hbm4gPGpoYXJ0bWFubkB2YWxpbnV4LmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfSTgzMF9EUlZfSF8KKyNkZWZpbmUgX0k4MzBfRFJWX0hfCisKKy8qIEdlbmVyYWwgY3VzdG9taXphdGlvbjoKKyAqLworCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJWQSBMaW51eCBTeXN0ZW1zIEluYy4iCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJpODMwIgorI2RlZmluZSBEUklWRVJfREVTQwkJIkludGVsIDgzME0iCisjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwMjExMDgiCisKKy8qIEludGVyZmFjZSBoaXN0b3J5OgorICoKKyAqIDEuMTogT3JpZ2luYWwuCisgKiAxLjI6ID8KKyAqIDEuMzogTmV3IGlycSBlbWl0L3dhaXQgaW9jdGxzLgorICogICAgICBOZXcgcGFnZWZsaXAgaW9jdGwuCisgKiAgICAgIE5ldyBnZXRwYXJhbSBpb2N0bC4KKyAqICAgICAgU3RhdGUgZm9yIHRleHVuaXRzIDMmNCBpbiBzYXJlYS4KKyAqICAgICAgTmV3IChhbHRlcm5hdGl2ZSkgbGF5b3V0IGZvciB0ZXh0dXJlIHN0YXRlLgorICovCisjZGVmaW5lIERSSVZFUl9NQUpPUgkJMQorI2RlZmluZSBEUklWRVJfTUlOT1IJCTMKKyNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMgorCisvKiBEcml2ZXIgd2lsbCB3b3JrIGVpdGhlciB3YXk6IElSUSdzIHNhdmUgY3B1IHRpbWUgd2hlbiB3YWl0aW5nIGZvcgorICogdGhlIGNhcmQsIGJ1dCBhcmUgc3ViamVjdCB0byBzdWJ0bGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gYmlvcywKKyAqIGhhcmR3YXJlIGFuZCB0aGUgZHJpdmVyLgorICovCisvKiBYWFg6IEFkZCB2Ymxhbmsgc3VwcG9ydD8gKi8KKyNkZWZpbmUgVVNFX0lSUVMgMAorCit0eXBlZGVmIHN0cnVjdCBkcm1faTgzMF9idWZfcHJpdiB7CisgICAJdTMyICppbl91c2U7CisgICAJaW50IG15X3VzZV9pZHg7CisJaW50IGN1cnJlbnRseV9tYXBwZWQ7CisJdm9pZCBfX3VzZXIgKnZpcnR1YWw7CisJdm9pZCAqa2VybmVsX3ZpcnR1YWw7Cit9IGRybV9pODMwX2J1Zl9wcml2X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgzMF9yaW5nX2J1ZmZlcnsKKwlpbnQgdGFpbF9tYXNrOworCXVuc2lnbmVkIGxvbmcgU3RhcnQ7CisJdW5zaWduZWQgbG9uZyBFbmQ7CisJdW5zaWduZWQgbG9uZyBTaXplOworCXU4ICp2aXJ0dWFsX3N0YXJ0OworCWludCBoZWFkOworCWludCB0YWlsOworCWludCBzcGFjZTsKK30gZHJtX2k4MzBfcmluZ19idWZmZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MzBfcHJpdmF0ZSB7CisJZHJtX21hcF90ICpzYXJlYV9tYXA7CisJZHJtX21hcF90ICptbWlvX21hcDsKKworCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXY7CisgICAJZHJtX2k4MzBfcmluZ19idWZmZXJfdCByaW5nOworCisgICAgICAJdm9pZCAqIGh3X3N0YXR1c19wYWdlOworICAgCXVuc2lnbmVkIGxvbmcgY291bnRlcjsKKworCWRtYV9hZGRyX3QgZG1hX3N0YXR1c19wYWdlOworCisJZHJtX2J1Zl90ICptbWFwX2J1ZmZlcjsKKwkKKwl1MzIgZnJvbnRfZGkxLCBiYWNrX2RpMSwgemkxOworCQorCWludCBiYWNrX29mZnNldDsKKwlpbnQgZGVwdGhfb2Zmc2V0OworCWludCBmcm9udF9vZmZzZXQ7CisJaW50IHcsIGg7CisJaW50IHBpdGNoOworCWludCBiYWNrX3BpdGNoOworCWludCBkZXB0aF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgY3BwOworCisJaW50IGRvX2JveGVzOworCWludCBkbWFfdXNlZDsKKworCWludCBjdXJyZW50X3BhZ2U7CisJaW50IHBhZ2VfZmxpcHBpbmc7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCBpcnFfcXVldWU7CisgICAJYXRvbWljX3QgaXJxX3JlY2VpdmVkOworICAgCWF0b21pY190IGlycV9lbWl0dGVkOworCisJaW50IHVzZV9taV9iYXRjaGJ1ZmZlcl9zdGFydDsKKworfSBkcm1faTgzMF9wcml2YXRlX3Q7CisKKy8qIGk4MzBfZG1hLmMgKi8KK2V4dGVybiB2b2lkIGk4MzBfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CisKK2V4dGVybiBpbnQgaTgzMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKworLyogaTgzMF9pcnEuYyAqLworZXh0ZXJuIGludCBpODMwX2lycV9lbWl0KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CitleHRlcm4gaW50IGk4MzBfaXJxX3dhaXQoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworCitleHRlcm4gaXJxcmV0dXJuX3QgaTgzMF9kcml2ZXJfaXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOworZXh0ZXJuIGludCBpODMwX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCk7CisKKyNkZWZpbmUgSTgzMF9CQVNFKHJlZykJCSgodW5zaWduZWQgbG9uZykgXAorCQkJCWRldl9wcml2LT5tbWlvX21hcC0+aGFuZGxlKQorI2RlZmluZSBJODMwX0FERFIocmVnKQkJKEk4MzBfQkFTRShyZWcpICsgcmVnKQorI2RlZmluZSBJODMwX0RFUkVGKHJlZykJCSooX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqKUk4MzBfQUREUihyZWcpCisjZGVmaW5lIEk4MzBfUkVBRChyZWcpCQlyZWFkbCgodm9sYXRpbGUgdTMyICopSTgzMF9BRERSKHJlZykpCisjZGVmaW5lIEk4MzBfV1JJVEUocmVnLHZhbCkgCXdyaXRlbCh2YWwsICh2b2xhdGlsZSB1MzIgKilJODMwX0FERFIocmVnKSkKKyNkZWZpbmUgSTgzMF9ERVJFRjE2KHJlZykJKihfX3ZvbGF0aWxlX18gdTE2ICopSTgzMF9BRERSKHJlZykKKyNkZWZpbmUgSTgzMF9SRUFEMTYocmVnKSAJSTgzMF9ERVJFRjE2KHJlZykKKyNkZWZpbmUgSTgzMF9XUklURTE2KHJlZyx2YWwpCWRvIHsgSTgzMF9ERVJFRjE2KHJlZykgPSB2YWw7IH0gd2hpbGUgKDApCisKKworCisjZGVmaW5lIEk4MzBfVkVSQk9TRSAwCisKKyNkZWZpbmUgUklOR19MT0NBTFMJdW5zaWduZWQgaW50IG91dHJpbmcsIHJpbmdtYXNrLCBvdXRjb3VudDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgY2hhciAqdmlydDsKKworI2RlZmluZSBCRUdJTl9MUF9SSU5HKG4pIGRvIHsJCQkJXAorCWlmIChJODMwX1ZFUkJPU0UpCQkJCVwKKwkJcHJpbnRrKCJCRUdJTl9MUF9SSU5HKCVkKSBpbiAlc1xuIiwJXAorCQkJICBuLCBfX0ZVTkNUSU9OX18pOwkJXAorCWlmIChkZXZfcHJpdi0+cmluZy5zcGFjZSA8IG4qNCkJCQlcCisJCWk4MzBfd2FpdF9yaW5nKGRldiwgbio0LCBfX0ZVTkNUSU9OX18pOwkJXAorCW91dGNvdW50ID0gMDsJCQkJCVwKKwlvdXRyaW5nID0gZGV2X3ByaXYtPnJpbmcudGFpbDsJCQlcCisJcmluZ21hc2sgPSBkZXZfcHJpdi0+cmluZy50YWlsX21hc2s7CQlcCisJdmlydCA9IGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQ7CQlcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgT1VUX1JJTkcobikgZG8gewkJCQkJXAorCWlmIChJODMwX1ZFUkJPU0UpIHByaW50aygiICAgT1VUX1JJTkcgJXhcbiIsIChpbnQpKG4pKTsJXAorCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKHZpcnQgKyBvdXRyaW5nKSA9IG47CQlcCisgICAgICAgIG91dGNvdW50Kys7CQkJCQkJXAorCW91dHJpbmcgKz0gNDsJCQkJCQlcCisJb3V0cmluZyAmPSByaW5nbWFzazsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQURWQU5DRV9MUF9SSU5HKCkgZG8gewkJCQkJCVwKKwlpZiAoSTgzMF9WRVJCT1NFKSBwcmludGsoIkFEVkFOQ0VfTFBfUklORyAleFxuIiwgb3V0cmluZyk7CVwKKwlkZXZfcHJpdi0+cmluZy50YWlsID0gb3V0cmluZzsJCQkJCVwKKwlkZXZfcHJpdi0+cmluZy5zcGFjZSAtPSBvdXRjb3VudCAqIDQ7CQkJCVwKKwlJODMwX1dSSVRFKExQX1JJTkcgKyBSSU5HX1RBSUwsIG91dHJpbmcpOwkJCVwKK30gd2hpbGUoMCkKKworZXh0ZXJuIGludCBpODMwX3dhaXRfcmluZyhkcm1fZGV2aWNlX3QgKmRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcik7CisKKworI2RlZmluZSBHRlhfT1BfVVNFUl9JTlRFUlJVUFQgCQkoKDA8PDI5KXwoMjw8MjMpKQorI2RlZmluZSBHRlhfT1BfQlJFQUtQT0lOVF9JTlRFUlJVUFQJKCgwPDwyOSl8KDE8PDIzKSkKKyNkZWZpbmUgQ01EX1JFUE9SVF9IRUFECQkJKDc8PDIzKQorI2RlZmluZSBDTURfU1RPUkVfRFdPUkRfSURYCQkoKDB4MjE8PDIzKSB8IDB4MSkKKyNkZWZpbmUgQ01EX09QX0JBVENIX0JVRkZFUiAgKCgweDA8PDI5KXwoMHgzMDw8MjMpfDB4MSkKKworI2RlZmluZSBTVEFURTNEX0xPQURfU1RBVEVfSU1NRURJQVRFXzIgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4MDM8PDE2KSkKKyNkZWZpbmUgTE9BRF9URVhUVVJFX01BUDAgICAgICAgICAgICAgICAgICAgKDE8PDExKQorCisjZGVmaW5lIElOU1RfUEFSU0VSX0NMSUVOVCAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSU5TVF9PUF9GTFVTSCAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBJTlNUX0ZMVVNIX01BUF9DQUNIRSAweDAwMDAwMDAxCisKKworI2RlZmluZSBCQjFfU1RBUlRfQUREUl9NQVNLICAgKH4weDcpCisjZGVmaW5lIEJCMV9QUk9URUNURUQgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgQkIxX1VOUFJPVEVDVEVEICAgICAgICgwPDwwKQorI2RlZmluZSBCQjJfRU5EX0FERFJfTUFTSyAgICAgKH4weDcpCisKKyNkZWZpbmUgSTgzMFJFR19IV1NUQU0JCTB4MDIwOTgKKyNkZWZpbmUgSTgzMFJFR19JTlRfSURFTlRJVFlfUgkweDAyMGE0CisjZGVmaW5lIEk4MzBSRUdfSU5UX01BU0tfUiAJMHgwMjBhOAorI2RlZmluZSBJODMwUkVHX0lOVF9FTkFCTEVfUgkweDAyMGEwCisKKyNkZWZpbmUgSTgzMF9JUlFfUkVTRVJWRUQgKCgxPDwxMyl8KDM8PDIpKQorCisKKyNkZWZpbmUgTFBfUklORyAgICAgCQkweDIwMzAKKyNkZWZpbmUgSFBfUklORyAgICAgCQkweDIwNDAKKyNkZWZpbmUgUklOR19UQUlMICAgICAgCQkweDAwCisjZGVmaW5lIFRBSUxfQUREUgkJMHgwMDFGRkZGOAorI2RlZmluZSBSSU5HX0hFQUQgICAgICAJCTB4MDQKKyNkZWZpbmUgSEVBRF9XUkFQX0NPVU5UICAgICAJMHhGRkUwMDAwMAorI2RlZmluZSBIRUFEX1dSQVBfT05FICAgICAgIAkweDAwMjAwMDAwCisjZGVmaW5lIEhFQURfQUREUiAgICAgICAgICAgCTB4MDAxRkZGRkMKKyNkZWZpbmUgUklOR19TVEFSVCAgICAgCQkweDA4CisjZGVmaW5lIFNUQVJUX0FERFIgICAgICAgICAgCTB4MHhGRkZGRjAwMAorI2RlZmluZSBSSU5HX0xFTiAgICAgICAJCTB4MEMKKyNkZWZpbmUgUklOR19OUl9QQUdFUyAgICAgICAJMHgwMDFGRjAwMCAKKyNkZWZpbmUgUklOR19SRVBPUlRfTUFTSyAgICAJMHgwMDAwMDAwNgorI2RlZmluZSBSSU5HX1JFUE9SVF82NEsgICAgIAkweDAwMDAwMDAyCisjZGVmaW5lIFJJTkdfUkVQT1JUXzEyOEsgICAgCTB4MDAwMDAwMDQKKyNkZWZpbmUgUklOR19OT19SRVBPUlQgICAgICAJMHgwMDAwMDAwMAorI2RlZmluZSBSSU5HX1ZBTElEX01BU0sgICAgIAkweDAwMDAwMDAxCisjZGVmaW5lIFJJTkdfVkFMSUQgICAgICAgICAgCTB4MDAwMDAwMDEKKyNkZWZpbmUgUklOR19JTlZBTElEICAgICAgICAJMHgwMDAwMDAwMAorCisjZGVmaW5lIEdGWF9PUF9TQ0lTU09SICAgICAgICAgKCgweDM8PDI5KXwoMHgxYzw8MjQpfCgweDEwPDwxOSkpCisjZGVmaW5lIFNDX1VQREFURV9TQ0lTU09SICAgICAgICgweDE8PDEpCisjZGVmaW5lIFNDX0VOQUJMRV9NQVNLICAgICAgICAgICgweDE8PDApCisjZGVmaW5lIFNDX0VOQUJMRSAgICAgICAgICAgICAgICgweDE8PDApCisKKyNkZWZpbmUgR0ZYX09QX1NDSVNTT1JfSU5GTyAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODE8PDE2KXwoMHgxKSkKKyNkZWZpbmUgU0NJX1lNSU5fTUFTSyAgICAgICgweGZmZmY8PDE2KQorI2RlZmluZSBTQ0lfWE1JTl9NQVNLICAgICAgKDB4ZmZmZjw8MCkKKyNkZWZpbmUgU0NJX1lNQVhfTUFTSyAgICAgICgweGZmZmY8PDE2KQorI2RlZmluZSBTQ0lfWE1BWF9NQVNLICAgICAgKDB4ZmZmZjw8MCkKKworI2RlZmluZSBHRlhfT1BfU0NJU1NPUl9FTkFCTEUJICgoMHgzPDwyOSl8KDB4MWM8PDI0KXwoMHgxMDw8MTkpKQorI2RlZmluZSBHRlhfT1BfU0NJU1NPUl9SRUNUCSAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODE8PDE2KXwxKQorI2RlZmluZSBHRlhfT1BfQ09MT1JfRkFDVE9SICAgICAgKCgweDM8PDI5KXwoMHgxZDw8MjQpfCgweDE8PDE2KXwweDApCisjZGVmaW5lIEdGWF9PUF9TVElQUExFICAgICAgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODM8PDE2KSkKKyNkZWZpbmUgR0ZYX09QX01BUF9JTkZPICAgICAgICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwweDQpCisjZGVmaW5lIEdGWF9PUF9ERVNUQlVGRkVSX1ZBUlMgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODU8PDE2KXwweDApCisjZGVmaW5lIEdGWF9PUF9EUkFXUkVDVF9JTkZPICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODA8PDE2KXwoMHgzKSkKKyNkZWZpbmUgR0ZYX09QX1BSSU1JVElWRSAgICAgICAgICgoMHgzPDwyOSl8KDB4MWY8PDI0KSkKKworI2RlZmluZSBDTURfT1BfREVTVEJVRkZFUl9JTkZPCSAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4OGU8PDE2KXwxKQorCisjZGVmaW5lIENNRF9PUF9ESVNQTEFZQlVGRkVSX0lORk8gKCgweDA8PDI5KXwoMHgxNDw8MjMpfDIpCisjZGVmaW5lIEFTWU5DX0ZMSVAgICAgICAgICAgICAgICAgKDE8PDIyKQorCisjZGVmaW5lIENNRF8zRCAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4Mzw8MjkpCisjZGVmaW5lIFNUQVRFM0RfQ09OU1RfQkxFTkRfQ09MT1JfQ01EICAgKENNRF8zRHwoMHgxZDw8MjQpfCgweDg4PDwxNikpCisjZGVmaW5lIFNUQVRFM0RfTUFQX0NPT1JEX1NFVEJJTkRfQ01EICAgKENNRF8zRHwoMHgxZDw8MjQpfCgweDAyPDwxNikpCisKKyNkZWZpbmUgQlIwMF9CSVRCTFRfQ0xJRU5UICAgMHg0MDAwMDAwMAorI2RlZmluZSBCUjAwX09QX0NPTE9SX0JMVCAgICAweDEwMDAwMDAwCisjZGVmaW5lIEJSMDBfT1BfU1JDX0NPUFlfQkxUIDB4MTBDMDAwMDAKKyNkZWZpbmUgQlIxM19TT0xJRF9QQVRURVJOICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIEJVRl8zRF9JRF9DT0xPUl9CQUNLICAgICgweDM8PDI0KQorI2RlZmluZSBCVUZfM0RfSURfREVQVEggICAgICAgICAoMHg3PDwyNCkKKyNkZWZpbmUgQlVGXzNEX1VTRV9GRU5DRSAgICAgICAgKDE8PDIzKQorI2RlZmluZSBCVUZfM0RfUElUQ0goeCkgICAgICAgICAoKCh4KS80KTw8MikKKworI2RlZmluZSBDTURfT1BfTUFQX1BBTEVUVEVfTE9BRAkoKDM8PDI5KXwoMHgxZDw8MjQpfCgweDgyPDwxNil8MjU1KQorI2RlZmluZSBNQVBfUEFMRVRURV9OVU0oeCkJKCh4PDw4KSAmICgxPDw4KSkKKyNkZWZpbmUgTUFQX1BBTEVUVEVfQk9USAkoMTw8MTEpCisKKyNkZWZpbmUgWFlfQ09MT1JfQkxUX0NNRAkJKCgyPDwyOSl8KDB4NTA8PDIyKXwweDQpCisjZGVmaW5lIFhZX0NPTE9SX0JMVF9XUklURV9BTFBIQQkoMTw8MjEpCisjZGVmaW5lIFhZX0NPTE9SX0JMVF9XUklURV9SR0IJCSgxPDwyMCkKKworI2RlZmluZSBYWV9TUkNfQ09QWV9CTFRfQ01EICAgICAgICAgICAgICgoMjw8MjkpfCgweDUzPDwyMil8NikKKyNkZWZpbmUgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX0FMUEhBICAgICAoMTw8MjEpCisjZGVmaW5lIFhZX1NSQ19DT1BZX0JMVF9XUklURV9SR0IgICAgICAgKDE8PDIwKQorCisjZGVmaW5lIE1JX0JBVENIX0JVRkZFUiAJKCgweDMwPDwyMyl8MSkKKyNkZWZpbmUgTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIAkoMHgzMTw8MjMpCisjZGVmaW5lIE1JX0JBVENIX0JVRkZFUl9FTkQgCSgweEE8PDIzKQorI2RlZmluZSBNSV9CQVRDSF9OT05fU0VDVVJFCSgxKQorCisjZGVmaW5lIE1JX1dBSVRfRk9SX0VWRU5UICAgICAgICgoMHgzPDwyMykpCisjZGVmaW5lIE1JX1dBSVRfRk9SX1BMQU5FX0FfRkxJUCAgICAgICgxPDwyKSAKKyNkZWZpbmUgTUlfV0FJVF9GT1JfUExBTkVfQV9TQ0FOTElORVMgKDE8PDEpIAorCisjZGVmaW5lIE1JX0xPQURfU0NBTl9MSU5FU19JTkNMICAoKDB4MTI8PDIzKSkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDc3MjlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jCkBAIC0wLDAgKzEsMjA0IEBACisvKiBpODMwX2RtYS5jIC0tIERNQSBzdXBwb3J0IGZvciB0aGUgSTgzMCAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaTgzMF9kcm0uaCIKKyNpbmNsdWRlICJpODMwX2Rydi5oIgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkvKiBGb3IgdGFzayBxdWV1ZSBzdXBwb3J0ICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworCitpcnFyZXR1cm5fdCBpODMwX2RyaXZlcl9pcnFfaGFuZGxlciggRFJNX0lSUV9BUkdTICkKK3sKKwlkcm1fZGV2aWNlX3QJICpkZXYgPSAoZHJtX2RldmljZV90ICopYXJnOworICAgICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKyAgIAl1MTYgdGVtcDsKKworICAgICAgCXRlbXAgPSBJODMwX1JFQUQxNihJODMwUkVHX0lOVF9JREVOVElUWV9SKTsKKwlEUk1fREVCVUcoIiV4XG4iLCB0ZW1wKTsKKworICAgCWlmICggISggdGVtcCAmIDIgKSApIAorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlJODMwX1dSSVRFMTYoSTgzMFJFR19JTlRfSURFTlRJVFlfUiwgdGVtcCk7IAorCisJYXRvbWljX2luYygmZGV2X3ByaXYtPmlycV9yZWNlaXZlZCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXZfcHJpdi0+aXJxX3F1ZXVlKTsgCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworaW50IGk4MzBfZW1pdF9pcnEoZHJtX2RldmljZV90ICpkZXYpCit7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJYXRvbWljX2luYygmZGV2X3ByaXYtPmlycV9lbWl0dGVkKTsKKworICAgCUJFR0lOX0xQX1JJTkcoMik7CisgICAgICAJT1VUX1JJTkcoIDAgKTsKKyAgICAgIAlPVVRfUklORyggR0ZYX09QX1VTRVJfSU5URVJSVVBUICk7CisgICAgICAJQURWQU5DRV9MUF9SSU5HKCk7CisKKwlyZXR1cm4gYXRvbWljX3JlYWQoJmRldl9wcml2LT5pcnFfZW1pdHRlZCk7Cit9CisKKworaW50IGk4MzBfd2FpdF9pcnEoZHJtX2RldmljZV90ICpkZXYsIGludCBpcnFfbnIpCit7CisgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9pODMwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZW5kID0gamlmZmllcyArIEhaKjM7CisJaW50IHJldCA9IDA7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisgCWlmIChhdG9taWNfcmVhZCgmZGV2X3ByaXYtPmlycV9yZWNlaXZlZCkgPj0gaXJxX25yKSAgCisgCQlyZXR1cm4gMDsgCisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJODMwX0JPWF9XQUlUOworCisJYWRkX3dhaXRfcXVldWUoJmRldl9wcml2LT5pcnFfcXVldWUsICZlbnRyeSk7CisKKwlmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkgICAJaWYgKGF0b21pY19yZWFkKCZkZXZfcHJpdi0+aXJxX3JlY2VpdmVkKSA+PSBpcnFfbnIpIAorCQkgICBicmVhazsKKwkJaWYoKHNpZ25lZCkoZW5kIC0gamlmZmllcykgPD0gMCkgeworCQkJRFJNX0VSUk9SKCJ0aW1lb3V0IGlpciAleCBpbXIgJXggaWVyICV4IGh3c3RhbSAleFxuIiwKKwkJCQkgIEk4MzBfUkVBRDE2KCBJODMwUkVHX0lOVF9JREVOVElUWV9SICksCisJCQkJICBJODMwX1JFQUQxNiggSTgzMFJFR19JTlRfTUFTS19SICksCisJCQkJICBJODMwX1JFQUQxNiggSTgzMFJFR19JTlRfRU5BQkxFX1IgKSwKKwkJCQkgIEk4MzBfUkVBRDE2KCBJODMwUkVHX0hXU1RBTSApKTsKKworCQkgICAJcmV0ID0gLUVCVVNZOwkvKiBMb2NrdXA/ICBNaXNzZWQgaXJxPyAqLworCQkJYnJlYWs7CisJCX0KKwkgICAgICAJc2NoZWR1bGVfdGltZW91dChIWiozKTsKKwkgICAgICAJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCSAgIAlyZXQgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCX0KKworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZGV2X3ByaXYtPmlycV9xdWV1ZSwgJmVudHJ5KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIE5lZWRzIHRoZSBsb2NrIGFzIGl0IHRvdWNoZXMgdGhlIHJpbmcuCisgKi8KK2ludCBpODMwX2lycV9lbWl0KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QJICAqcHJpdgkgICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgKmRldgkgICAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k4MzBfaXJxX2VtaXRfdCBlbWl0OworCWludCByZXN1bHQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlciggJmVtaXQsIChkcm1faTgzMF9pcnFfZW1pdF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGVtaXQpICkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVzdWx0ID0gaTgzMF9lbWl0X2lycSggZGV2ICk7CisKKwlpZiAoIGNvcHlfdG9fdXNlciggZW1pdC5pcnFfc2VxLCAmcmVzdWx0LCBzaXplb2YoaW50KSApICkgeworCQlEUk1fRVJST1IoICJjb3B5X3RvX3VzZXJcbiIgKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogRG9lc24ndCBuZWVkIHRoZSBoYXJkd2FyZSBsb2NrLgorICovCitpbnQgaTgzMF9pcnFfd2FpdCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICAgID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pODMwX2lycV93YWl0X3QgaXJxd2FpdDsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlciggJmlycXdhaXQsIChkcm1faTgzMF9pcnFfd2FpdF90IF9fdXNlciAqKWFyZywgCisJCQkgICAgc2l6ZW9mKGlycXdhaXQpICkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGk4MzBfd2FpdF9pcnEoIGRldiwgaXJxd2FpdC5pcnFfc2VxICk7Cit9CisKKworLyogZHJtX2RtYS5oIGhvb2tzCisqLwordm9pZCBpODMwX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9CisJCShkcm1faTgzMF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisJSTgzMF9XUklURTE2KCBJODMwUkVHX0hXU1RBTSwgMHhmZmZmICk7CisJSTgzMF9XUklURTE2KCBJODMwUkVHX0lOVF9NQVNLX1IsIDB4MCApOworCUk4MzBfV1JJVEUxNiggSTgzMFJFR19JTlRfRU5BQkxFX1IsIDB4MCApOworCWF0b21pY19zZXQoJmRldl9wcml2LT5pcnFfcmVjZWl2ZWQsIDApOworCWF0b21pY19zZXQoJmRldl9wcml2LT5pcnFfZW1pdHRlZCwgMCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7Cit9CisKK3ZvaWQgaTgzMF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKwlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJKGRybV9pODMwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwlJODMwX1dSSVRFMTYoIEk4MzBSRUdfSU5UX0VOQUJMRV9SLCAweDIgKTsKK30KKwordm9pZCBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKwlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJKGRybV9pODMwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJaWYgKCFkZXZfcHJpdikKKwkJcmV0dXJuOworCisJSTgzMF9XUklURTE2KCBJODMwUkVHX0lOVF9NQVNLX1IsIDB4ZmZmZiApOworCUk4MzBfV1JJVEUxNiggSTgzMFJFR19JTlRfRU5BQkxFX1IsIDB4MCApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMDBhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKQEAgLTAsMCArMSw3MjUgQEAKKy8qIGk5MTVfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIHRoZSBJOTE1IC0qLSBsaW51eC1jIC0qLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKworZHJtX2lvY3RsX2Rlc2NfdCBpOTE1X2lvY3Rsc1tdID0geworCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSU5JVCldID0ge2k5MTVfZG1hX2luaXQsIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfRkxVU0gpXSA9IHtpOTE1X2ZsdXNoX2lvY3RsLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0ZMSVApXSA9IHtpOTE1X2ZsaXBfYnVmcywgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9CQVRDSEJVRkZFUildID0ge2k5MTVfYmF0Y2hidWZmZXIsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSVJRX0VNSVQpXSA9IHtpOTE1X2lycV9lbWl0LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lSUV9XQUlUKV0gPSB7aTkxNV9pcnFfd2FpdCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9HRVRQQVJBTSldID0ge2k5MTVfZ2V0cGFyYW0sIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfU0VUUEFSQU0pXSA9IHtpOTE1X3NldHBhcmFtLCAxLCAxfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0FMTE9DKV0gPSB7aTkxNV9tZW1fYWxsb2MsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfRlJFRSldID0ge2k5MTVfbWVtX2ZyZWUsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSU5JVF9IRUFQKV0gPSB7aTkxNV9tZW1faW5pdF9oZWFwLCAxLCAxfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0NNREJVRkZFUildID0ge2k5MTVfY21kYnVmZmVyLCAxLCAwfQorfTsKKworaW50IGk5MTVfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoaTkxNV9pb2N0bHMpOworCisvKiBSZWFsbHkgd2FudCBhbiBPUy1pbmRlcGVuZGVudCByZXNldHRhYmxlIHRpbWVyLiAgV291bGQgbGlrZSB0byBoYXZlCisgKiB0aGlzIGxvb3AgcnVuIGZvciAoZWcpIDMgc2VjLCBidXQgaGF2ZSB0aGUgdGltZXIgcmVzZXQgZXZlcnkgdGltZQorICogdGhlIGhlYWQgcG9pbnRlciBjaGFuZ2VzLCBzbyB0aGF0IEVCVVNZIG9ubHkgaGFwcGVucyBpZiB0aGUgcmluZworICogYWN0dWFsbHkgc3RhbGxzIGZvciAoZWcpIDMgc2Vjb25kcy4KKyAqLworaW50IGk5MTVfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CisJdTMyIGxhc3RfaGVhZCA9IEk5MTVfUkVBRChMUF9SSU5HICsgUklOR19IRUFEKSAmIEhFQURfQUREUjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCXJpbmctPmhlYWQgPSBJOTE1X1JFQUQoTFBfUklORyArIFJJTkdfSEVBRCkgJiBIRUFEX0FERFI7CisJCXJpbmctPnNwYWNlID0gcmluZy0+aGVhZCAtIChyaW5nLT50YWlsICsgOCk7CisJCWlmIChyaW5nLT5zcGFjZSA8IDApCisJCQlyaW5nLT5zcGFjZSArPSByaW5nLT5TaXplOworCQlpZiAocmluZy0+c3BhY2UgPj0gbikKKwkJCXJldHVybiAwOworCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk5MTVfQk9YX1dBSVQ7CisKKwkJaWYgKHJpbmctPmhlYWQgIT0gbGFzdF9oZWFkKQorCQkJaSA9IDA7CisKKwkJbGFzdF9oZWFkID0gcmluZy0+aGVhZDsKKwl9CisKKwlyZXR1cm4gRFJNX0VSUihFQlVTWSk7Cit9CisKK3ZvaWQgaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CisKKwlyaW5nLT5oZWFkID0gSTkxNV9SRUFEKExQX1JJTkcgKyBSSU5HX0hFQUQpICYgSEVBRF9BRERSOworCXJpbmctPnRhaWwgPSBJOTE1X1JFQUQoTFBfUklORyArIFJJTkdfVEFJTCkgJiBUQUlMX0FERFI7CisJcmluZy0+c3BhY2UgPSByaW5nLT5oZWFkIC0gKHJpbmctPnRhaWwgKyA4KTsKKwlpZiAocmluZy0+c3BhY2UgPCAwKQorCQlyaW5nLT5zcGFjZSArPSByaW5nLT5TaXplOworCisJaWYgKHJpbmctPmhlYWQgPT0gcmluZy0+dGFpbCkKKwkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgfD0gSTkxNV9CT1hfUklOR19FTVBUWTsKK30KKworaW50IGk5MTVfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQoreworCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAorCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKKwkgKiBpcyBmcmVlZCwgaXQncyB0b28gbGF0ZS4KKwkgKi8KKwlpZiAoZGV2LT5pcnEpCisJCWRybV9pcnFfdW5pbnN0YWxsIChkZXYpOworCisJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKKwkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9CisJCSAgICAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwkJaWYgKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQpIHsKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCAmZGV2X3ByaXYtPnJpbmcubWFwLCBkZXYpOworCQl9CisKKwkJaWYgKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSkgeworCQkJZHJtX3BjaV9mcmVlKGRldiwgUEFHRV9TSVpFLCBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UsCisJCQkJICAgICBkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKwkJCS8qIE5lZWQgdG8gcmV3cml0ZSBoYXJkd2FyZSBzdGF0dXMgcGFnZSAqLworCQkJSTkxNV9XUklURSgweDAyMDgwLCAweDFmZmZmMDAwKTsKKwkJfQorCisJCWRybV9mcmVlIChkZXYtPmRldl9wcml2YXRlLCBzaXplb2YoZHJtX2k5MTVfcHJpdmF0ZV90KSwKKwkJCSAgIERSTV9NRU1fRFJJVkVSKTsKKworCQlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpOTE1X2luaXRpYWxpemUoZHJtX2RldmljZV90ICogZGV2LAorCQkJICAgZHJtX2k5MTVfcHJpdmF0ZV90ICogZGV2X3ByaXYsCisJCQkgICBkcm1faTkxNV9pbml0X3QgKiBpbml0KQoreworCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9pOTE1X3ByaXZhdGVfdCkpOworCisJRFJNX0dFVFNBUkVBKCk7CisJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKKwkJRFJNX0VSUk9SKCJjYW4gbm90IGZpbmQgc2FyZWEhXG4iKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlkZXZfcHJpdi0+bW1pb19tYXAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pb19vZmZzZXQpOworCWlmICghZGV2X3ByaXYtPm1taW9fbWFwKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlpOTE1X2RtYV9jbGVhbnVwKGRldik7CisJCURSTV9FUlJPUigiY2FuIG5vdCBmaW5kIG1taW8gbWFwIVxuIik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYgPSAoZHJtX2k5MTVfc2FyZWFfdCAqKQorCSAgICAoKHU4ICopIGRldl9wcml2LT5zYXJlYS0+aGFuZGxlICsgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCisJZGV2X3ByaXYtPnJpbmcuU3RhcnQgPSBpbml0LT5yaW5nX3N0YXJ0OworCWRldl9wcml2LT5yaW5nLkVuZCA9IGluaXQtPnJpbmdfZW5kOworCWRldl9wcml2LT5yaW5nLlNpemUgPSBpbml0LT5yaW5nX3NpemU7CisJZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrID0gZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDE7CisKKwlkZXZfcHJpdi0+cmluZy5tYXAub2Zmc2V0ID0gaW5pdC0+cmluZ19zdGFydDsKKwlkZXZfcHJpdi0+cmluZy5tYXAuc2l6ZSA9IGluaXQtPnJpbmdfc2l6ZTsKKwlkZXZfcHJpdi0+cmluZy5tYXAudHlwZSA9IDA7CisJZGV2X3ByaXYtPnJpbmcubWFwLmZsYWdzID0gMDsKKwlkZXZfcHJpdi0+cmluZy5tYXAubXRyciA9IDA7CisKKwlkcm1fY29yZV9pb3JlbWFwKCAmZGV2X3ByaXYtPnJpbmcubWFwLCBkZXYgKTsKKworCWlmIChkZXZfcHJpdi0+cmluZy5tYXAuaGFuZGxlID09IE5VTEwpIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKKwkJRFJNX0VSUk9SKCJjYW4gbm90IGlvcmVtYXAgdmlydHVhbCBhZGRyZXNzIGZvciIKKwkJCSAgIiByaW5nIGJ1ZmZlclxuIik7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCisJZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCA9IGRldl9wcml2LT5yaW5nLm1hcC5oYW5kbGU7CisKKwlkZXZfcHJpdi0+YmFja19vZmZzZXQgPSBpbml0LT5iYWNrX29mZnNldDsKKwlkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ID0gaW5pdC0+ZnJvbnRfb2Zmc2V0OworCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworCisJLyogV2UgYXJlIHVzaW5nIHNlcGFyYXRlIHZhbHVlcyBhcyBwbGFjZWhvbGRlcnMgZm9yIG1lY2hhbmlzbXMgZm9yCisJICogcHJpdmF0ZSBiYWNrYnVmZmVyL2RlcHRoYnVmZmVyIHVzYWdlLgorCSAqLworCWRldl9wcml2LT51c2VfbWlfYmF0Y2hidWZmZXJfc3RhcnQgPSAwOworCisJLyogQWxsb3cgaGFyZHdhcmUgYmF0Y2hidWZmZXJzIHVubGVzcyB0b2xkIG90aGVyd2lzZS4KKwkgKi8KKwlkZXZfcHJpdi0+YWxsb3dfYmF0Y2hidWZmZXIgPSAxOworCisJLyogUHJvZ3JhbSBIYXJkd2FyZSBTdGF0dXMgUGFnZSAqLworCWRldl9wcml2LT5od19zdGF0dXNfcGFnZSA9IGRybV9wY2lfYWxsb2MoZGV2LCBQQUdFX1NJWkUsIFBBR0VfU0laRSwKKwkJCQkJCSAweGZmZmZmZmZmLCAKKwkJCQkJCSAmZGV2X3ByaXYtPmRtYV9zdGF0dXNfcGFnZSk7CisKKwlpZiAoIWRldl9wcml2LT5od19zdGF0dXNfcGFnZSkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJaTkxNV9kbWFfY2xlYW51cChkZXYpOworCQlEUk1fRVJST1IoIkNhbiBub3QgYWxsb2NhdGUgaGFyZHdhcmUgc3RhdHVzIHBhZ2VcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKwltZW1zZXQoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlLCAwLCBQQUdFX1NJWkUpOworCURSTV9ERUJVRygiaHcgc3RhdHVzIHBhZ2UgQCAlcFxuIiwgZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKTsKKworCUk5MTVfV1JJVEUoMHgwMjA4MCwgZGV2X3ByaXYtPmRtYV9zdGF0dXNfcGFnZSk7CisJRFJNX0RFQlVHKCJFbmFibGVkIGhhcmR3YXJlIHN0YXR1cyBwYWdlXG4iKTsKKworCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTkxNV9yZXN1bWUoZHJtX2RldmljZV90ICogZGV2KQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKKwkJRFJNX0VSUk9SKCJjYW4gbm90IGZpbmQgc2FyZWEhXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIWRldl9wcml2LT5tbWlvX21hcCkgeworCQlEUk1fRVJST1IoImNhbiBub3QgZmluZCBtbWlvIG1hcCFcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmIChkZXZfcHJpdi0+cmluZy5tYXAuaGFuZGxlID09IE5VTEwpIHsKKwkJRFJNX0VSUk9SKCJjYW4gbm90IGlvcmVtYXAgdmlydHVhbCBhZGRyZXNzIGZvciIKKwkJCSAgIiByaW5nIGJ1ZmZlclxuIik7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCisJLyogUHJvZ3JhbSBIYXJkd2FyZSBTdGF0dXMgUGFnZSAqLworCWlmICghZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKSB7CisJCURSTV9FUlJPUigiQ2FuIG5vdCBmaW5kIGhhcmR3YXJlIHN0YXR1cyBwYWdlXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJRFJNX0RFQlVHKCJodyBzdGF0dXMgcGFnZSBAICVwXG4iLCBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpOworCisJSTkxNV9XUklURSgweDAyMDgwLCBkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKwlEUk1fREVCVUcoIkVuYWJsZWQgaGFyZHdhcmUgc3RhdHVzIHBhZ2VcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpOTE1X2RtYV9pbml0KERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKwlkcm1faTkxNV9pbml0X3QgaW5pdDsKKwlpbnQgcmV0Y29kZSA9IDA7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoaW5pdCwgKGRybV9pOTE1X2luaXRfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGluaXQpKTsKKworCXN3aXRjaCAoaW5pdC5mdW5jKSB7CisJY2FzZSBJOTE1X0lOSVRfRE1BOgorCQlkZXZfcHJpdiA9IGRybV9hbGxvYyAoc2l6ZW9mKGRybV9pOTE1X3ByaXZhdGVfdCksCisJCQkJICAgICAgIERSTV9NRU1fRFJJVkVSKTsKKwkJaWYgKGRldl9wcml2ID09IE5VTEwpCisJCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCQlyZXRjb2RlID0gaTkxNV9pbml0aWFsaXplKGRldiwgZGV2X3ByaXYsICZpbml0KTsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X0NMRUFOVVBfRE1BOgorCQlyZXRjb2RlID0gaTkxNV9kbWFfY2xlYW51cChkZXYpOworCQlicmVhazsKKwljYXNlIEk5MTVfUkVTVU1FX0RNQToKKwkJcmV0Y29kZSA9IGk5MTVfcmVzdW1lKGRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldGNvZGUgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworLyogSW1wbGVtZW50IGJhc2ljYWxseSB0aGUgc2FtZSBzZWN1cml0eSByZXN0cmljdGlvbnMgYXMgaGFyZHdhcmUgZG9lcworICogZm9yIE1JX0JBVENIX05PTl9TRUNVUkUuICBUaGVzZSBjYW4gYmUgbWFkZSBzdHJpY3RlciBhdCBhbnkgdGltZS4KKyAqCisgKiBNb3N0IG9mIHRoZSBjYWxjdWxhdGlvbnMgYmVsb3cgaW52b2x2ZSBjYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBhCisgKiBwYXJ0aWN1bGFyIGluc3RydWN0aW9uLiAgSXQncyBpbXBvcnRhbnQgdG8gZ2V0IHRoZSBzaXplIHJpZ2h0IGFzCisgKiB0aGF0IHRlbGxzIHVzIHdoZXJlIHRoZSBuZXh0IGluc3RydWN0aW9uIHRvIGNoZWNrIGlzLiAgQW55IGlsbGVnYWwKKyAqIGluc3RydWN0aW9uIGRldGVjdGVkIHdpbGwgYmUgZ2l2ZW4gYSBzaXplIG9mIHplcm8sIHdoaWNoIGlzIGEKKyAqIHNpZ25hbCB0byBhYm9ydCB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgaW50IGRvX3ZhbGlkYXRlX2NtZChpbnQgY21kKQoreworCXN3aXRjaCAoKChjbWQgPj4gMjkpICYgMHg3KSkgeworCWNhc2UgMHgwOgorCQlzd2l0Y2ggKChjbWQgPj4gMjMpICYgMHgzZikgeworCQljYXNlIDB4MDoKKwkJCXJldHVybiAxOwkvKiBNSV9OT09QICovCisJCWNhc2UgMHg0OgorCQkJcmV0dXJuIDE7CS8qIE1JX0ZMVVNIICovCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsJLyogZGlzYWxsb3cgZXZlcnl0aGluZyBlbHNlICovCisJCX0KKwkJYnJlYWs7CisJY2FzZSAweDE6CisJCXJldHVybiAwOwkvKiByZXNlcnZlZCAqLworCWNhc2UgMHgyOgorCQlyZXR1cm4gKGNtZCAmIDB4ZmYpICsgMjsJLyogMmQgY29tbWFuZHMgKi8KKwljYXNlIDB4MzoKKwkJaWYgKCgoY21kID4+IDI0KSAmIDB4MWYpIDw9IDB4MTgpCisJCQlyZXR1cm4gMTsKKworCQlzd2l0Y2ggKChjbWQgPj4gMjQpICYgMHgxZikgeworCQljYXNlIDB4MWM6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSAweDFkOgorCQkJc3dpdGNoICgoY21kPj4xNikmMHhmZikgeworCQkJY2FzZSAweDM6CisJCQkJcmV0dXJuIChjbWQgJiAweDFmKSArIDI7CisJCQljYXNlIDB4NDoKKwkJCQlyZXR1cm4gKGNtZCAmIDB4ZikgKyAyOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gKGNtZCAmIDB4ZmZmZikgKyAyOworCQkJfQorCQljYXNlIDB4MWU6CisJCQlpZiAoY21kICYgKDEgPDwgMjMpKQorCQkJCXJldHVybiAoY21kICYgMHhmZmZmKSArIDE7CisJCQllbHNlCisJCQkJcmV0dXJuIDE7CisJCWNhc2UgMHgxZjoKKwkJCWlmICgoY21kICYgKDEgPDwgMjMpKSA9PSAwKQkvKiBpbmxpbmUgdmVydGljZXMgKi8KKwkJCQlyZXR1cm4gKGNtZCAmIDB4MWZmZmYpICsgMjsKKwkJCWVsc2UgaWYgKGNtZCAmICgxIDw8IDE3KSkJLyogaW5kaXJlY3QgcmFuZG9tICovCisJCQkJaWYgKChjbWQgJiAweGZmZmYpID09IDApCisJCQkJCXJldHVybiAwOwkvKiB1bmtub3duIGxlbmd0aCwgdG9vIGhhcmQgKi8KKwkJCQllbHNlCisJCQkJCXJldHVybiAoKChjbWQgJiAweGZmZmYpICsgMSkgLyAyKSArIDE7CisJCQllbHNlCisJCQkJcmV0dXJuIDI7CS8qIGluZGlyZWN0IHNlcXVlbnRpYWwgKi8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfY21kKGludCBjbWQpCit7CisJaW50IHJldCA9IGRvX3ZhbGlkYXRlX2NtZChjbWQpOworCisvKiAJcHJpbnRrKCJ2YWxpZGF0ZV9jbWQoICV4ICk6ICVkXG4iLCBjbWQsIHJldCk7ICovCisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGk5MTVfZW1pdF9jbWRzKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IF9fdXNlciAqIGJ1ZmZlciwgaW50IGR3b3JkcykKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKworCWZvciAoaSA9IDA7IGkgPCBkd29yZHM7KSB7CisJCWludCBjbWQsIHN6OworCisJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEKCZjbWQsICZidWZmZXJbaV0sIHNpemVvZihjbWQpKSkKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKy8qIAkJcHJpbnRrKCIlZC8lZCAiLCBpLCBkd29yZHMpOyAqLworCisJCWlmICgoc3ogPSB2YWxpZGF0ZV9jbWQoY21kKSkgPT0gMCB8fCBpICsgc3ogPiBkd29yZHMpCisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJCUJFR0lOX0xQX1JJTkcoc3opOworCQlPVVRfUklORyhjbWQpOworCisJCXdoaWxlICgrK2ksIC0tc3opIHsKKwkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEKCZjbWQsICZidWZmZXJbaV0sCisJCQkJCQkJIHNpemVvZihjbWQpKSkgeworCQkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCQl9CisJCQlPVVRfUklORyhjbWQpOworCQl9CisJCUFEVkFOQ0VfTFBfUklORygpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk5MTVfZW1pdF9ib3goZHJtX2RldmljZV90ICogZGV2LAorCQkJIGRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKiBib3hlcywKKwkJCSBpbnQgaSwgaW50IERSMSwgaW50IERSNCkKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fY2xpcF9yZWN0X3QgYm94OworCVJJTkdfTE9DQUxTOworCisJaWYgKERSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoJmJveCwgJmJveGVzW2ldLCBzaXplb2YoYm94KSkpIHsKKwkJcmV0dXJuIEVGQVVMVDsKKwl9CisKKwlpZiAoYm94LnkyIDw9IGJveC55MSB8fCBib3gueDIgPD0gYm94LngxIHx8IGJveC55MiA8PSAwIHx8IGJveC54MiA8PSAwKSB7CisJCURSTV9FUlJPUigiQmFkIGJveCAlZCwlZC4uJWQsJWRcbiIsCisJCQkgIGJveC54MSwgYm94LnkxLCBib3gueDIsIGJveC55Mik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJQkVHSU5fTFBfUklORyg2KTsKKwlPVVRfUklORyhHRlhfT1BfRFJBV1JFQ1RfSU5GTyk7CisJT1VUX1JJTkcoRFIxKTsKKwlPVVRfUklORygoYm94LngxICYgMHhmZmZmKSB8IChib3gueTEgPDwgMTYpKTsKKwlPVVRfUklORygoKGJveC54MiAtIDEpICYgMHhmZmZmKSB8ICgoYm94LnkyIC0gMSkgPDwgMTYpKTsKKwlPVVRfUklORyhEUjQpOworCU9VVF9SSU5HKDApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9jbWRidWZmZXIoZHJtX2RldmljZV90ICogZGV2LAorCQkJCSAgIGRybV9pOTE1X2NtZGJ1ZmZlcl90ICogY21kKQoreworCWludCBuYm94ID0gY21kLT5udW1fY2xpcHJlY3RzOworCWludCBpID0gMCwgY291bnQsIHJldDsKKworCWlmIChjbWQtPnN6ICYgMHgzKSB7CisJCURSTV9FUlJPUigiYWxpZ25tZW50Iik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKwljb3VudCA9IG5ib3ggPyBuYm94IDogMTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWlmIChpIDwgbmJveCkgeworCQkJcmV0ID0gaTkxNV9lbWl0X2JveChkZXYsIGNtZC0+Y2xpcHJlY3RzLCBpLAorCQkJCQkgICAgY21kLT5EUjEsIGNtZC0+RFI0KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IGk5MTVfZW1pdF9jbWRzKGRldiwgKGludCBfX3VzZXIgKiljbWQtPmJ1ZiwgY21kLT5zeiAvIDQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2JhdGNoYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCQkgICAgIGRybV9pOTE1X2JhdGNoYnVmZmVyX3QgKiBiYXRjaCkKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpib3hlcyA9IGJhdGNoLT5jbGlwcmVjdHM7CisJaW50IG5ib3ggPSBiYXRjaC0+bnVtX2NsaXByZWN0czsKKwlpbnQgaSA9IDAsIGNvdW50OworCVJJTkdfTE9DQUxTOworCisJaWYgKChiYXRjaC0+c3RhcnQgfCBiYXRjaC0+dXNlZCkgJiAweDcpIHsKKwkJRFJNX0VSUk9SKCJhbGlnbm1lbnQiKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworCWNvdW50ID0gbmJveCA/IG5ib3ggOiAxOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKGkgPCBuYm94KSB7CisJCQlpbnQgcmV0ID0gaTkxNV9lbWl0X2JveChkZXYsIGJveGVzLCBpLAorCQkJCQkJYmF0Y2gtPkRSMSwgYmF0Y2gtPkRSNCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAoZGV2X3ByaXYtPnVzZV9taV9iYXRjaGJ1ZmZlcl9zdGFydCkgeworCQkJQkVHSU5fTFBfUklORygyKTsKKwkJCU9VVF9SSU5HKE1JX0JBVENIX0JVRkZFUl9TVEFSVCB8ICgyIDw8IDYpKTsKKwkJCU9VVF9SSU5HKGJhdGNoLT5zdGFydCB8IE1JX0JBVENIX05PTl9TRUNVUkUpOworCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCX0gZWxzZSB7CisJCQlCRUdJTl9MUF9SSU5HKDQpOworCQkJT1VUX1JJTkcoTUlfQkFUQ0hfQlVGRkVSKTsKKwkJCU9VVF9SSU5HKGJhdGNoLT5zdGFydCB8IE1JX0JBVENIX05PTl9TRUNVUkUpOworCQkJT1VUX1JJTkcoYmF0Y2gtPnN0YXJ0ICsgYmF0Y2gtPnVzZWQgLSA0KTsKKwkJCU9VVF9SSU5HKDApOworCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCX0KKwl9CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9lbnF1ZXVlID0gZGV2X3ByaXYtPmNvdW50ZXIrKzsKKworCUJFR0lOX0xQX1JJTkcoNCk7CisJT1VUX1JJTkcoQ01EX1NUT1JFX0RXT1JEX0lEWCk7CisJT1VUX1JJTkcoMjApOworCU9VVF9SSU5HKGRldl9wcml2LT5jb3VudGVyKTsKKwlPVVRfUklORygwKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoIiVzOiBwYWdlPSVkIHBmQ3VycmVudFBhZ2U9JWRcbiIsCisJCSAgX19GVU5DVElPTl9fLAorCQkgIGRldl9wcml2LT5jdXJyZW50X3BhZ2UsCisJCSAgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSk7CisKKwlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworCUJFR0lOX0xQX1JJTkcoMik7CisJT1VUX1JJTkcoSU5TVF9QQVJTRVJfQ0xJRU5UIHwgSU5TVF9PUF9GTFVTSCB8IElOU1RfRkxVU0hfTUFQX0NBQ0hFKTsKKwlPVVRfUklORygwKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCUJFR0lOX0xQX1JJTkcoNik7CisJT1VUX1JJTkcoQ01EX09QX0RJU1BMQVlCVUZGRVJfSU5GTyB8IEFTWU5DX0ZMSVApOworCU9VVF9SSU5HKDApOworCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDApIHsKKwkJT1VUX1JJTkcoZGV2X3ByaXYtPmJhY2tfb2Zmc2V0KTsKKwkJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9IDE7CisJfSBlbHNlIHsKKwkJT1VUX1JJTkcoZGV2X3ByaXYtPmZyb250X29mZnNldCk7CisJCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCX0KKwlPVVRfUklORygwKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCUJFR0lOX0xQX1JJTkcoMik7CisJT1VUX1JJTkcoTUlfV0FJVF9GT1JfRVZFTlQgfCBNSV9XQUlUX0ZPUl9QTEFORV9BX0ZMSVApOworCU9VVF9SSU5HKDApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZW5xdWV1ZSA9IGRldl9wcml2LT5jb3VudGVyKys7CisKKwlCRUdJTl9MUF9SSU5HKDQpOworCU9VVF9SSU5HKENNRF9TVE9SRV9EV09SRF9JRFgpOworCU9VVF9SSU5HKDIwKTsKKwlPVVRfUklORyhkZXZfcHJpdi0+Y291bnRlcik7CisJT1VUX1JJTkcoMCk7CisJQURWQU5DRV9MUF9SSU5HKCk7CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpOTE1X3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKwlyZXR1cm4gaTkxNV93YWl0X3JpbmcoZGV2LCBkZXZfcHJpdi0+cmluZy5TaXplIC0gOCwgX19GVU5DVElPTl9fKTsKK30KKworaW50IGk5MTVfZmx1c2hfaW9jdGwoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisJcmV0dXJuIGk5MTVfcXVpZXNjZW50KGRldik7Cit9CisKK2ludCBpOTE1X2JhdGNoYnVmZmVyKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKKwlkcm1faTkxNV9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pOTE1X3NhcmVhX3QgKikKKwkgICAgZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX2k5MTVfYmF0Y2hidWZmZXJfdCBiYXRjaDsKKwlpbnQgcmV0OworCisJaWYgKCFkZXZfcHJpdi0+YWxsb3dfYmF0Y2hidWZmZXIpIHsKKwkJRFJNX0VSUk9SKCJCYXRjaGJ1ZmZlciBpb2N0bCBkaXNhYmxlZFxuIik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGJhdGNoLCAoZHJtX2k5MTVfYmF0Y2hidWZmZXJfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGJhdGNoKSk7CisKKwlEUk1fREVCVUcoImk5MTUgYmF0Y2hidWZmZXIsIHN0YXJ0ICV4IHVzZWQgJWQgY2xpcHJlY3RzICVkXG4iLAorCQkgIGJhdGNoLnN0YXJ0LCBiYXRjaC51c2VkLCBiYXRjaC5udW1fY2xpcHJlY3RzKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisJaWYgKGJhdGNoLm51bV9jbGlwcmVjdHMgJiYgRFJNX1ZFUklGWUFSRUFfUkVBRChiYXRjaC5jbGlwcmVjdHMsCisJCQkJCQkgICAgICAgYmF0Y2gubnVtX2NsaXByZWN0cyAqCisJCQkJCQkgICAgICAgc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCkpKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJcmV0ID0gaTkxNV9kaXNwYXRjaF9iYXRjaGJ1ZmZlcihkZXYsICZiYXRjaCk7CisKKwlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gKGludClod19zdGF0dXNbNV07CisJcmV0dXJuIHJldDsKK30KKworaW50IGk5MTVfY21kYnVmZmVyKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKKwlkcm1faTkxNV9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pOTE1X3NhcmVhX3QgKikKKwkgICAgZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX2k5MTVfY21kYnVmZmVyX3QgY21kYnVmOworCWludCByZXQ7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoY21kYnVmLCAoZHJtX2k5MTVfY21kYnVmZmVyX3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihjbWRidWYpKTsKKworCURSTV9ERUJVRygiaTkxNSBjbWRidWZmZXIsIGJ1ZiAlcCBzeiAlZCBjbGlwcmVjdHMgJWRcbiIsCisJCSAgY21kYnVmLmJ1ZiwgY21kYnVmLnN6LCBjbWRidWYubnVtX2NsaXByZWN0cyk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCWlmIChjbWRidWYubnVtX2NsaXByZWN0cyAmJgorCSAgICBEUk1fVkVSSUZZQVJFQV9SRUFEKGNtZGJ1Zi5jbGlwcmVjdHMsCisJCQkJY21kYnVmLm51bV9jbGlwcmVjdHMgKgorCQkJCXNpemVvZihkcm1fY2xpcF9yZWN0X3QpKSkgeworCQlEUk1fRVJST1IoIkZhdWx0IGFjY2Vzc2luZyBjbGlwcmVjdHNcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCXJldCA9IGk5MTVfZGlzcGF0Y2hfY21kYnVmZmVyKGRldiwgJmNtZGJ1Zik7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoImk5MTVfZGlzcGF0Y2hfY21kYnVmZmVyIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IChpbnQpaHdfc3RhdHVzWzVdOworCXJldHVybiAwOworfQorCitpbnQgaTkxNV9kb19jbGVhbnVwX3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgIT0gMCkKKwkJaTkxNV9kaXNwYXRjaF9mbGlwKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGk5MTVfZmxpcF9idWZzKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlyZXR1cm4gaTkxNV9kaXNwYXRjaF9mbGlwKGRldik7Cit9CisKK2ludCBpOTE1X2dldHBhcmFtKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfZ2V0cGFyYW1fdCBwYXJhbTsKKwlpbnQgdmFsdWU7CisKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKHBhcmFtLCAoZHJtX2k5MTVfZ2V0cGFyYW1fdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKHBhcmFtKSk7CisKKwlzd2l0Y2ggKHBhcmFtLnBhcmFtKSB7CisJY2FzZSBJOTE1X1BBUkFNX0lSUV9BQ1RJVkU6CisJCXZhbHVlID0gZGV2LT5pcnEgPyAxIDogMDsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X1BBUkFNX0FMTE9XX0JBVENIQlVGRkVSOgorCQl2YWx1ZSA9IGRldl9wcml2LT5hbGxvd19iYXRjaGJ1ZmZlciA/IDEgOiAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIlVua293biBwYXJhbWV0ZXIgJWRcbiIsIHBhcmFtLnBhcmFtKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoRFJNX0NPUFlfVE9fVVNFUihwYXJhbS52YWx1ZSwgJnZhbHVlLCBzaXplb2YoaW50KSkpIHsKKwkJRFJNX0VSUk9SKCJEUk1fQ09QWV9UT19VU0VSIGZhaWxlZFxuIik7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBpOTE1X3NldHBhcmFtKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfc2V0cGFyYW1fdCBwYXJhbTsKKworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwocGFyYW0sIChkcm1faTkxNV9zZXRwYXJhbV90IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2YocGFyYW0pKTsKKworCXN3aXRjaCAocGFyYW0ucGFyYW0pIHsKKwljYXNlIEk5MTVfU0VUUEFSQU1fVVNFX01JX0JBVENIQlVGRkVSX1NUQVJUOgorCQlkZXZfcHJpdi0+dXNlX21pX2JhdGNoYnVmZmVyX3N0YXJ0ID0gcGFyYW0udmFsdWU7CisJCWJyZWFrOworCWNhc2UgSTkxNV9TRVRQQVJBTV9URVhfTFJVX0xPR19HUkFOVUxBUklUWToKKwkJZGV2X3ByaXYtPnRleF9scnVfbG9nX2dyYW51bGFyaXR5ID0gcGFyYW0udmFsdWU7CisJCWJyZWFrOworCWNhc2UgSTkxNV9TRVRQQVJBTV9BTExPV19CQVRDSEJVRkZFUjoKKwkJZGV2X3ByaXYtPmFsbG93X2JhdGNoYnVmZmVyID0gcGFyYW0udmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigidW5rbm93biBwYXJhbWV0ZXIgJWRcbiIsIHBhcmFtLnBhcmFtKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpOTE1X2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlpZiAoIGRldi0+ZGV2X3ByaXZhdGUgKSB7CisJCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCSAgICAgICAgaTkxNV9tZW1fdGFrZWRvd24oICYoZGV2X3ByaXYtPmFncF9oZWFwKSApOworIAl9CisJaTkxNV9kbWFfY2xlYW51cCggZGV2ICk7Cit9CisKK3ZvaWQgaTkxNV9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKQoreworCWlmICggZGV2LT5kZXZfcHJpdmF0ZSApIHsKKwkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAgICAgICAgICAgaTkxNV9tZW1fcmVsZWFzZSggZGV2LCBmaWxwLCBkZXZfcHJpdi0+YWdwX2hlYXAgKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTU1ZWRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCkBAIC0wLDAgKzEsMTY3IEBACisjaWZuZGVmIF9JOTE1X0RSTV9IXworI2RlZmluZSBfSTkxNV9EUk1fSF8KKworLyogUGxlYXNlIG5vdGUgdGhhdCBtb2RpZmljYXRpb25zIHRvIGFsbCBzdHJ1Y3RzIGRlZmluZWQgaGVyZSBhcmUKKyAqIHN1YmplY3QgdG8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgY29uc3RyYWludHMuCisgKi8KKworI2luY2x1ZGUgImRybS5oIgorCisvKiBFYWNoIHJlZ2lvbiBpcyBhIG1pbmltdW0gb2YgMTZrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgMjU1IG9mIHRoZW0uCisgKi8KKyNkZWZpbmUgSTkxNV9OUl9URVhfUkVHSU9OUyAyNTUJLyogdGFibGUgc2l6ZSAyayAtIG1heGltdW0gZHVlIHRvIHVzZQorCQkJCSAqIG9mIGNoYXJzIGZvciBuZXh0L3ByZXYgaW5kaWNlcyAqLworI2RlZmluZSBJOTE1X0xPR19NSU5fVEVYX1JFR0lPTl9TSVpFIDE0CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9pbml0IHsKKwllbnVtIHsKKwkJSTkxNV9JTklUX0RNQSA9IDB4MDEsCisJCUk5MTVfQ0xFQU5VUF9ETUEgPSAweDAyLAorCQlJOTE1X1JFU1VNRV9ETUEgPSAweDAzCisJfSBmdW5jOworCXVuc2lnbmVkIGludCBtbWlvX29mZnNldDsKKwlpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJpbmdfc3RhcnQ7CisJdW5zaWduZWQgaW50IHJpbmdfZW5kOworCXVuc2lnbmVkIGludCByaW5nX3NpemU7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgdzsKKwl1bnNpZ25lZCBpbnQgaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2g7CisJdW5zaWduZWQgaW50IHBpdGNoX2JpdHM7CisJdW5zaWduZWQgaW50IGJhY2tfcGl0Y2g7CisJdW5zaWduZWQgaW50IGRlcHRoX3BpdGNoOworCXVuc2lnbmVkIGludCBjcHA7CisJdW5zaWduZWQgaW50IGNoaXBzZXQ7Cit9IGRybV9pOTE1X2luaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X3NhcmVhIHsKKwlkcm1fdGV4X3JlZ2lvbl90IHRleExpc3RbSTkxNV9OUl9URVhfUkVHSU9OUyArIDFdOworCWludCBsYXN0X3VwbG9hZDsJLyogbGFzdCB0aW1lIHRleHR1cmUgd2FzIHVwbG9hZGVkICovCisJaW50IGxhc3RfZW5xdWV1ZTsJLyogbGFzdCB0aW1lIGEgYnVmZmVyIHdhcyBlbnF1ZXVlZCAqLworCWludCBsYXN0X2Rpc3BhdGNoOwkvKiBhZ2Ugb2YgdGhlIG1vc3QgcmVjZW50bHkgZGlzcGF0Y2hlZCBidWZmZXIgKi8KKwlpbnQgY3R4T3duZXI7CQkvKiBsYXN0IGNvbnRleHQgdG8gdXBsb2FkIHN0YXRlICovCisJaW50IHRleEFnZTsKKwlpbnQgcGZfZW5hYmxlZDsJCS8qIGlzIHBhZ2VmbGlwcGluZyBhbGxvd2VkPyAqLworCWludCBwZl9hY3RpdmU7CisJaW50IHBmX2N1cnJlbnRfcGFnZTsJLyogd2hpY2ggYnVmZmVyIGlzIGJlaW5nIGRpc3BsYXllZD8gKi8KKwlpbnQgcGVyZl9ib3hlczsJCS8qIHBlcmZvcm1hbmNlIGJveGVzIHRvIGJlIGRpc3BsYXllZCAqLworfSBkcm1faTkxNV9zYXJlYV90OworCisvKiBGbGFncyBmb3IgcGVyZl9ib3hlcworICovCisjZGVmaW5lIEk5MTVfQk9YX1JJTkdfRU1QVFkgICAgMHgxCisjZGVmaW5lIEk5MTVfQk9YX0ZMSVAgICAgICAgICAgMHgyCisjZGVmaW5lIEk5MTVfQk9YX1dBSVQgICAgICAgICAgMHg0CisjZGVmaW5lIEk5MTVfQk9YX1RFWFRVUkVfTE9BRCAgMHg4CisjZGVmaW5lIEk5MTVfQk9YX0xPU1RfQ09OVEVYVCAgMHgxMAorCisvKiBJOTE1IHNwZWNpZmljIGlvY3RscworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCisgKi8KKyNkZWZpbmUgRFJNX0k5MTVfSU5JVAkJMHgwMAorI2RlZmluZSBEUk1fSTkxNV9GTFVTSAkJMHgwMQorI2RlZmluZSBEUk1fSTkxNV9GTElQCQkweDAyCisjZGVmaW5lIERSTV9JOTE1X0JBVENIQlVGRkVSCTB4MDMKKyNkZWZpbmUgRFJNX0k5MTVfSVJRX0VNSVQJMHgwNAorI2RlZmluZSBEUk1fSTkxNV9JUlFfV0FJVAkweDA1CisjZGVmaW5lIERSTV9JOTE1X0dFVFBBUkFNCTB4MDYKKyNkZWZpbmUgRFJNX0k5MTVfU0VUUEFSQU0JMHgwNworI2RlZmluZSBEUk1fSTkxNV9BTExPQwkJMHgwOAorI2RlZmluZSBEUk1fSTkxNV9GUkVFCQkweDA5CisjZGVmaW5lIERSTV9JOTE1X0lOSVRfSEVBUAkweDBhCisjZGVmaW5lIERSTV9JOTE1X0NNREJVRkZFUgkweDBiCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSU5JVAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0lOSVQsIGRybV9pOTE1X2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfRkxVU0gJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9GTFVTSCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfRkxJUAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0ZMSVApCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0JBVENIQlVGRkVSCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9CQVRDSEJVRkZFUiwgZHJtX2k5MTVfYmF0Y2hidWZmZXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSVJRX0VNSVQgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSVJRX0VNSVQsIGRybV9pOTE1X2lycV9lbWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0lSUV9XQUlUICAgICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0lSUV9XQUlULCBkcm1faTkxNV9pcnFfd2FpdF90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRVRQQVJBTSwgZHJtX2k5MTVfZ2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfU0VUUEFSQU0gICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfU0VUUEFSQU0sIGRybV9pOTE1X3NldHBhcmFtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0FMTE9DICAgICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0FMTE9DLCBkcm1faTkxNV9tZW1fYWxsb2NfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfRlJFRSAgICAgICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfRlJFRSwgZHJtX2k5MTVfbWVtX2ZyZWVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSU5JVF9IRUFQICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSU5JVF9IRUFQLCBkcm1faTkxNV9tZW1faW5pdF9oZWFwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0NNREJVRkZFUglEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfQ01EQlVGRkVSLCBkcm1faTkxNV9jbWRidWZmZXJfdCkKKworLyogQWxsb3cgZHJpdmVycyB0byBzdWJtaXQgYmF0Y2hidWZmZXJzIGRpcmVjdGx5IHRvIGhhcmR3YXJlLCByZWx5aW5nCisgKiBvbiB0aGUgc2VjdXJpdHkgbWVjaGFuaXNtcyBwcm92aWRlZCBieSBoYXJkd2FyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X2JhdGNoYnVmZmVyIHsKKwlpbnQgc3RhcnQ7CQkvKiBhZ3Agb2Zmc2V0ICovCisJaW50IHVzZWQ7CQkvKiBuciBieXRlcyBpbiB1c2UgKi8KKwlpbnQgRFIxOwkJLyogaHcgZmxhZ3MgZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IERSNDsJCS8qIHdpbmRvdyBvcmlnaW4gZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IG51bV9jbGlwcmVjdHM7CS8qIG11bGl0cGFzcyB3aXRoIG11bHRpcGxlIGNsaXByZWN0cz8gKi8KKwlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLworfSBkcm1faTkxNV9iYXRjaGJ1ZmZlcl90OworCisvKiBBcyBhYm92ZSwgYnV0IHBhc3MgYSBwb2ludGVyIHRvIHVzZXJzcGFjZSBidWZmZXIgd2hpY2ggY2FuIGJlCisgKiB2YWxpZGF0ZWQgYnkgdGhlIGtlcm5lbCBwcmlvciB0byBzZW5kaW5nIHRvIGhhcmR3YXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfY21kYnVmZmVyIHsKKwljaGFyIF9fdXNlciAqYnVmOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjb21tYW5kIGJ1ZmZlciAqLworCWludCBzejsJCQkvKiBuciBieXRlcyBpbiBidWYgKi8KKwlpbnQgRFIxOwkJLyogaHcgZmxhZ3MgZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IERSNDsJCS8qIHdpbmRvdyBvcmlnaW4gZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IG51bV9jbGlwcmVjdHM7CS8qIG11bGl0cGFzcyB3aXRoIG11bHRpcGxlIGNsaXByZWN0cz8gKi8KKwlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLworfSBkcm1faTkxNV9jbWRidWZmZXJfdDsKKworLyogVXNlcnNwYWNlIGNhbiByZXF1ZXN0ICYgd2FpdCBvbiBpcnEnczoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfaXJxX2VtaXQgeworCWludCBfX3VzZXIgKmlycV9zZXE7Cit9IGRybV9pOTE1X2lycV9lbWl0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X2lycV93YWl0IHsKKwlpbnQgaXJxX3NlcTsKK30gZHJtX2k5MTVfaXJxX3dhaXRfdDsKKworLyogSW9jdGwgdG8gcXVlcnkga2VybmVsIHBhcmFtczoKKyAqLworI2RlZmluZSBJOTE1X1BBUkFNX0lSUV9BQ1RJVkUgICAgICAgICAgICAxCisjZGVmaW5lIEk5MTVfUEFSQU1fQUxMT1dfQkFUQ0hCVUZGRVIgICAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfZ2V0cGFyYW0geworCWludCBwYXJhbTsKKwlpbnQgX191c2VyICp2YWx1ZTsKK30gZHJtX2k5MTVfZ2V0cGFyYW1fdDsKKworLyogSW9jdGwgdG8gc2V0IGtlcm5lbCBwYXJhbXM6CisgKi8KKyNkZWZpbmUgSTkxNV9TRVRQQVJBTV9VU0VfTUlfQkFUQ0hCVUZGRVJfU1RBUlQgICAgICAgICAgICAxCisjZGVmaW5lIEk5MTVfU0VUUEFSQU1fVEVYX0xSVV9MT0dfR1JBTlVMQVJJVFkgICAgICAgICAgICAgMgorI2RlZmluZSBJOTE1X1NFVFBBUkFNX0FMTE9XX0JBVENIQlVGRkVSICAgICAgICAgICAgICAgICAgIDMKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfc2V0cGFyYW0geworCWludCBwYXJhbTsKKwlpbnQgdmFsdWU7Cit9IGRybV9pOTE1X3NldHBhcmFtX3Q7CisKKy8qIEEgbWVtb3J5IG1hbmFnZXIgZm9yIHJlZ2lvbnMgb2Ygc2hhcmVkIG1lbW9yeToKKyAqLworI2RlZmluZSBJOTE1X01FTV9SRUdJT05fQUdQIDEKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfbWVtX2FsbG9jIHsKKwlpbnQgcmVnaW9uOworCWludCBhbGlnbm1lbnQ7CisJaW50IHNpemU7CisJaW50IF9fdXNlciAqcmVnaW9uX29mZnNldDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZmIgb3IgYWdwICovCit9IGRybV9pOTE1X21lbV9hbGxvY190OworCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9tZW1fZnJlZSB7CisJaW50IHJlZ2lvbjsKKwlpbnQgcmVnaW9uX29mZnNldDsKK30gZHJtX2k5MTVfbWVtX2ZyZWVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfbWVtX2luaXRfaGVhcCB7CisJaW50IHJlZ2lvbjsKKwlpbnQgc2l6ZTsKKwlpbnQgc3RhcnQ7Cit9IGRybV9pOTE1X21lbV9pbml0X2hlYXBfdDsKKworI2VuZGlmCQkJCS8qIF9JOTE1X0RSTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMmI3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qIGk5MTVfZHJ2LmMgLS0gaTgzMCxpODQ1LGk4NTUsaTg2NSxpOTE1IGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKworI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKKworaW50IHBvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICkKK3sKKwlkZXYtPmNvdW50ZXJzICs9IDQ7CisJZGV2LT50eXBlc1s2XSA9IF9EUk1fU1RBVF9JUlE7CisJZGV2LT50eXBlc1s3XSA9IF9EUk1fU1RBVF9QUklNQVJZOworCWRldi0+dHlwZXNbOF0gPSBfRFJNX1NUQVRfU0VDT05EQVJZOworCWRldi0+dHlwZXNbOV0gPSBfRFJNX1NUQVRfRE1BOworCQorCURSTV9JTkZPKCAiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWQ6ICVzXG4iLAorCQlEUklWRVJfTkFNRSwKKwkJRFJJVkVSX01BSk9SLAorCQlEUklWRVJfTUlOT1IsCisJCURSSVZFUl9QQVRDSExFVkVMLAorCQlEUklWRVJfREFURSwKKwkJZGV2LT5wcmltYXJ5Lm1pbm9yLAorCQlwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQorCQkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcnNpb24oIGRybV92ZXJzaW9uX3QgKnZlcnNpb24gKQoreworCWludCBsZW47CisKKwl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOworCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7CisJRFJNX0NPUFkoIHZlcnNpb24tPm5hbWUsIERSSVZFUl9OQU1FICk7CisJRFJNX0NPUFkoIHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFICk7CisJRFJNX0NPUFkoIHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKKwlpOTE1X1BDSV9JRFMKK307CisKK2V4dGVybiBkcm1faW9jdGxfZGVzY190IGk5MTVfaW9jdGxzW107CitleHRlcm4gaW50IGk5MTVfbWF4X2lvY3RsOworCitzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0geworCS5kcml2ZXJfZmVhdHVyZXMgPSBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9SRVFVSVJFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8CisJCQkJRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0lSUV9TSEFSRUQsCisJLnByZXRha2Vkb3duID0gaTkxNV9kcml2ZXJfcHJldGFrZWRvd24sCisJLnByZXJlbGVhc2UgPSBpOTE1X2RyaXZlcl9wcmVyZWxlYXNlLAorCS5pcnFfcHJlaW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsLAorCS5pcnFfcG9zdGluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwsCisJLmlycV91bmluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsLAorCS5pcnFfaGFuZGxlciA9IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyLAorCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCisJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCisJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCisJLnBvc3Rpbml0ID0gcG9zdGluaXQsCisJLnZlcnNpb24gPSB2ZXJzaW9uLAorCS5pb2N0bHMgPSBpOTE1X2lvY3RscywKKwkuZm9wcyA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vcGVuID0gZHJtX29wZW4sCisJCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJCS5pb2N0bCA9IGRybV9pb2N0bCwKKwkJLm1tYXAgPSBkcm1fbW1hcCwKKwkJLnBvbGwgPSBkcm1fcG9sbCwKKwkJLmZhc3luYyA9IGRybV9mYXN5bmMsCisJfSwKKwkucGNpX2RyaXZlciA9IHsKKwkJLm5hbWUgICAgICAgICAgPSBEUklWRVJfTkFNRSwKKwkJLmlkX3RhYmxlICAgICAgPSBwY2lpZGxpc3QsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgaTkxNV9pbml0KHZvaWQpCit7CisJZHJpdmVyLm51bV9pb2N0bHMgPSBpOTE1X21heF9pb2N0bDsKKwlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpOTE1X2V4aXQodm9pZCkKK3sKKwlkcm1fZXhpdCgmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaTkxNV9pbml0KTsKK21vZHVsZV9leGl0KGk5MTVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjYTkyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaApAQCAtMCwwICsxLDI0MyBAQAorLyogaTkxNV9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgdGhlIEk5MTUgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9JOTE1X0RSVl9IXworI2RlZmluZSBfSTkxNV9EUlZfSF8KKworLyogR2VuZXJhbCBjdXN0b21pemF0aW9uOgorICovCisKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIlR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiaTkxNSIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJCSJJbnRlbCBHcmFwaGljcyIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDA0MDQwNSIKKworLyogSW50ZXJmYWNlIGhpc3Rvcnk6CisgKgorICogMS4xOiBPcmlnaW5hbC4KKyAqLworI2RlZmluZSBEUklWRVJfTUFKT1IJCTEKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQkxCisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTAKKworLyogV2UgdXNlIG91ciBvd24gZG1hIG1lY2hhbmlzbXMsIG5vdCB0aGUgZHJtIHRlbXBsYXRlIGNvZGUuICBIb3dldmVyLAorICogdGhlIHNoYXJlZCBJUlEgY29kZSBpcyB1c2VmdWwgdG8gdXM6CisgKi8KKyNkZWZpbmUgX19IQVZFX1BNCQkxCisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9yaW5nX2J1ZmZlciB7CisJaW50IHRhaWxfbWFzazsKKwl1bnNpZ25lZCBsb25nIFN0YXJ0OworCXVuc2lnbmVkIGxvbmcgRW5kOworCXVuc2lnbmVkIGxvbmcgU2l6ZTsKKwl1OCAqdmlydHVhbF9zdGFydDsKKwlpbnQgaGVhZDsKKwlpbnQgdGFpbDsKKwlpbnQgc3BhY2U7CisJZHJtX2xvY2FsX21hcF90IG1hcDsKK30gZHJtX2k5MTVfcmluZ19idWZmZXJfdDsKKworc3RydWN0IG1lbV9ibG9jayB7CisJc3RydWN0IG1lbV9ibG9jayAqbmV4dDsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwcmV2OworCWludCBzdGFydDsKKwlpbnQgc2l6ZTsKKwlEUk1GSUxFIGZpbHA7CQkvKiAwOiBmcmVlLCAtMTogaGVhcCwgb3RoZXI6IHJlYWwgZmlsZXMgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgeworCWRybV9sb2NhbF9tYXBfdCAqc2FyZWE7CisJZHJtX2xvY2FsX21hcF90ICptbWlvX21hcDsKKworCWRybV9pOTE1X3NhcmVhX3QgKnNhcmVhX3ByaXY7CisJZHJtX2k5MTVfcmluZ19idWZmZXJfdCByaW5nOworCisJdm9pZCAqaHdfc3RhdHVzX3BhZ2U7CisJdW5zaWduZWQgbG9uZyBjb3VudGVyOworCWRtYV9hZGRyX3QgZG1hX3N0YXR1c19wYWdlOworCisJaW50IGJhY2tfb2Zmc2V0OworCWludCBmcm9udF9vZmZzZXQ7CisJaW50IGN1cnJlbnRfcGFnZTsKKwlpbnQgcGFnZV9mbGlwcGluZzsKKwlpbnQgdXNlX21pX2JhdGNoYnVmZmVyX3N0YXJ0OworCisJd2FpdF9xdWV1ZV9oZWFkX3QgaXJxX3F1ZXVlOworCWF0b21pY190IGlycV9yZWNlaXZlZDsKKwlhdG9taWNfdCBpcnFfZW1pdHRlZDsKKworCWludCB0ZXhfbHJ1X2xvZ19ncmFudWxhcml0eTsKKwlpbnQgYWxsb3dfYmF0Y2hidWZmZXI7CisJc3RydWN0IG1lbV9ibG9jayAqYWdwX2hlYXA7Cit9IGRybV9pOTE1X3ByaXZhdGVfdDsKKworCQkJCS8qIGk5MTVfZG1hLmMgKi8KK2V4dGVybiBpbnQgaTkxNV9kbWFfaW5pdChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IGk5MTVfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgaTkxNV9mbHVzaF9pb2N0bChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IGk5MTVfYmF0Y2hidWZmZXIoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCBpOTE1X2ZsaXBfYnVmcyhEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IGk5MTVfZ2V0cGFyYW0oRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCBpOTE1X3NldHBhcmFtKERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgaTkxNV9jbWRidWZmZXIoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIHZvaWQgaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApOworCisvKiBpOTE1X2lycS5jICovCitleHRlcm4gaW50IGk5MTVfaXJxX2VtaXQoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCBpOTE1X2lycV93YWl0KERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgaTkxNV93YWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBpcnFfbnIpOworZXh0ZXJuIGludCBpOTE1X2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldik7CisKK2V4dGVybiBpcnFyZXR1cm5fdCBpOTE1X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOworZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICpkZXYpOworCisvKiBpOTE1X21lbS5jICovCitleHRlcm4gaW50IGk5MTVfbWVtX2FsbG9jKERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgaTkxNV9tZW1fZnJlZShEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IGk5MTVfbWVtX2luaXRfaGVhcChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gdm9pZCBpOTE1X21lbV90YWtlZG93bihzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcCk7CitleHRlcm4gdm9pZCBpOTE1X21lbV9yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCSAgICAgRFJNRklMRSBmaWxwLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwKTsKKworI2RlZmluZSBJOTE1X1JFQUQocmVnKSAgICAgICAgICBEUk1fUkVBRDMyKGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQorI2RlZmluZSBJOTE1X1dSSVRFKHJlZyx2YWwpICAgICBEUk1fV1JJVEUzMihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZywgdmFsKQorI2RlZmluZSBJOTE1X1JFQUQxNihyZWcpIAlEUk1fUkVBRDE2KGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQorI2RlZmluZSBJOTE1X1dSSVRFMTYocmVnLHZhbCkJRFJNX1dSSVRFMTYoZGV2X3ByaXYtPm1taW9fbWFwLCByZWcsIHZhbCkKKworI2RlZmluZSBJOTE1X1ZFUkJPU0UgMAorCisjZGVmaW5lIFJJTkdfTE9DQUxTCXVuc2lnbmVkIGludCBvdXRyaW5nLCByaW5nbWFzaywgb3V0Y291bnQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIGNoYXIgKnZpcnQ7CisKKyNkZWZpbmUgQkVHSU5fTFBfUklORyhuKSBkbyB7CQkJCVwKKwlpZiAoSTkxNV9WRVJCT1NFKQkJCQlcCisJCURSTV9ERUJVRygiQkVHSU5fTFBfUklORyglZCkgaW4gJXNcbiIsCVwKKwkJCSAgbiwgX19GVU5DVElPTl9fKTsJCVwKKwlpZiAoZGV2X3ByaXYtPnJpbmcuc3BhY2UgPCBuKjQpCQkJXAorCQlpOTE1X3dhaXRfcmluZyhkZXYsIG4qNCwgX19GVU5DVElPTl9fKTsJCVwKKwlvdXRjb3VudCA9IDA7CQkJCQlcCisJb3V0cmluZyA9IGRldl9wcml2LT5yaW5nLnRhaWw7CQkJXAorCXJpbmdtYXNrID0gZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrOwkJXAorCXZpcnQgPSBkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0OwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBPVVRfUklORyhuKSBkbyB7CQkJCQlcCisJaWYgKEk5MTVfVkVSQk9TRSkgRFJNX0RFQlVHKCIgICBPVVRfUklORyAleFxuIiwgKGludCkobikpOwlcCisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikodmlydCArIG91dHJpbmcpID0gbjsJCVwKKyAgICAgICAgb3V0Y291bnQrKzsJCQkJCQlcCisJb3V0cmluZyArPSA0OwkJCQkJCVwKKwlvdXRyaW5nICY9IHJpbmdtYXNrOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBRFZBTkNFX0xQX1JJTkcoKSBkbyB7CQkJCQkJXAorCWlmIChJOTE1X1ZFUkJPU0UpIERSTV9ERUJVRygiQURWQU5DRV9MUF9SSU5HICV4XG4iLCBvdXRyaW5nKTsJXAorCWRldl9wcml2LT5yaW5nLnRhaWwgPSBvdXRyaW5nOwkJCQkJXAorCWRldl9wcml2LT5yaW5nLnNwYWNlIC09IG91dGNvdW50ICogNDsJCQkJXAorCUk5MTVfV1JJVEUoTFBfUklORyArIFJJTkdfVEFJTCwgb3V0cmluZyk7CQkJXAorfSB3aGlsZSgwKQorCitleHRlcm4gaW50IGk5MTVfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcik7CisKKyNkZWZpbmUgR0ZYX09QX1VTRVJfSU5URVJSVVBUIAkJKCgwPDwyOSl8KDI8PDIzKSkKKyNkZWZpbmUgR0ZYX09QX0JSRUFLUE9JTlRfSU5URVJSVVBUCSgoMDw8MjkpfCgxPDwyMykpCisjZGVmaW5lIENNRF9SRVBPUlRfSEVBRAkJCSg3PDwyMykKKyNkZWZpbmUgQ01EX1NUT1JFX0RXT1JEX0lEWAkJKCgweDIxPDwyMykgfCAweDEpCisjZGVmaW5lIENNRF9PUF9CQVRDSF9CVUZGRVIgICgoMHgwPDwyOSl8KDB4MzA8PDIzKXwweDEpCisKKyNkZWZpbmUgSU5TVF9QQVJTRVJfQ0xJRU5UICAgMHgwMDAwMDAwMAorI2RlZmluZSBJTlNUX09QX0ZMVVNIICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIElOU1RfRkxVU0hfTUFQX0NBQ0hFIDB4MDAwMDAwMDEKKworI2RlZmluZSBCQjFfU1RBUlRfQUREUl9NQVNLICAgKH4weDcpCisjZGVmaW5lIEJCMV9QUk9URUNURUQgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgQkIxX1VOUFJPVEVDVEVEICAgICAgICgwPDwwKQorI2RlZmluZSBCQjJfRU5EX0FERFJfTUFTSyAgICAgKH4weDcpCisKKyNkZWZpbmUgSTkxNVJFR19IV1NUQU0JCTB4MDIwOTgKKyNkZWZpbmUgSTkxNVJFR19JTlRfSURFTlRJVFlfUgkweDAyMGE0CisjZGVmaW5lIEk5MTVSRUdfSU5UX01BU0tfUiAJMHgwMjBhOAorI2RlZmluZSBJOTE1UkVHX0lOVF9FTkFCTEVfUgkweDAyMGEwCisKKyNkZWZpbmUgU1JYX0lOREVYCQkweDNjNAorI2RlZmluZSBTUlhfREFUQQkJMHgzYzUKKyNkZWZpbmUgU1IwMQkJCTEKKyNkZWZpbmUgU1IwMV9TQ1JFRU5fT0ZGIAkoMTw8NSkKKworI2RlZmluZSBQUENSCQkJMHg2MTIwNAorI2RlZmluZSBQUENSX09OCQkJKDE8PDApCisKKyNkZWZpbmUgQURQQQkJCTB4NjExMDAKKyNkZWZpbmUgQURQQV9EUE1TX01BU0sJCSh+KDM8PDEwKSkKKyNkZWZpbmUgQURQQV9EUE1TX09OCQkoMDw8MTApCisjZGVmaW5lIEFEUEFfRFBNU19TVVNQRU5ECSgxPDwxMCkKKyNkZWZpbmUgQURQQV9EUE1TX1NUQU5EQlkJKDI8PDEwKQorI2RlZmluZSBBRFBBX0RQTVNfT0ZGCQkoMzw8MTApCisKKyNkZWZpbmUgTk9QSUQgICAgICAgICAgICAgICAgICAgMHgyMDk0CisjZGVmaW5lIExQX1JJTkcgICAgIAkJMHgyMDMwCisjZGVmaW5lIEhQX1JJTkcgICAgIAkJMHgyMDQwCisjZGVmaW5lIFJJTkdfVEFJTCAgICAgIAkJMHgwMAorI2RlZmluZSBUQUlMX0FERFIJCTB4MDAxRkZGRjgKKyNkZWZpbmUgUklOR19IRUFEICAgICAgCQkweDA0CisjZGVmaW5lIEhFQURfV1JBUF9DT1VOVCAgICAgCTB4RkZFMDAwMDAKKyNkZWZpbmUgSEVBRF9XUkFQX09ORSAgICAgICAJMHgwMDIwMDAwMAorI2RlZmluZSBIRUFEX0FERFIgICAgICAgICAgIAkweDAwMUZGRkZDCisjZGVmaW5lIFJJTkdfU1RBUlQgICAgIAkJMHgwOAorI2RlZmluZSBTVEFSVF9BRERSICAgICAgICAgIAkweDB4RkZGRkYwMDAKKyNkZWZpbmUgUklOR19MRU4gICAgICAgCQkweDBDCisjZGVmaW5lIFJJTkdfTlJfUEFHRVMgICAgICAgCTB4MDAxRkYwMDAKKyNkZWZpbmUgUklOR19SRVBPUlRfTUFTSyAgICAJMHgwMDAwMDAwNgorI2RlZmluZSBSSU5HX1JFUE9SVF82NEsgICAgIAkweDAwMDAwMDAyCisjZGVmaW5lIFJJTkdfUkVQT1JUXzEyOEsgICAgCTB4MDAwMDAwMDQKKyNkZWZpbmUgUklOR19OT19SRVBPUlQgICAgICAJMHgwMDAwMDAwMAorI2RlZmluZSBSSU5HX1ZBTElEX01BU0sgICAgIAkweDAwMDAwMDAxCisjZGVmaW5lIFJJTkdfVkFMSUQgICAgICAgICAgCTB4MDAwMDAwMDEKKyNkZWZpbmUgUklOR19JTlZBTElEICAgICAgICAJMHgwMDAwMDAwMAorCisjZGVmaW5lIEdGWF9PUF9TQ0lTU09SICAgICAgICAgKCgweDM8PDI5KXwoMHgxYzw8MjQpfCgweDEwPDwxOSkpCisjZGVmaW5lIFNDX1VQREFURV9TQ0lTU09SICAgICAgICgweDE8PDEpCisjZGVmaW5lIFNDX0VOQUJMRV9NQVNLICAgICAgICAgICgweDE8PDApCisjZGVmaW5lIFNDX0VOQUJMRSAgICAgICAgICAgICAgICgweDE8PDApCisKKyNkZWZpbmUgR0ZYX09QX1NDSVNTT1JfSU5GTyAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODE8PDE2KXwoMHgxKSkKKyNkZWZpbmUgU0NJX1lNSU5fTUFTSyAgICAgICgweGZmZmY8PDE2KQorI2RlZmluZSBTQ0lfWE1JTl9NQVNLICAgICAgKDB4ZmZmZjw8MCkKKyNkZWZpbmUgU0NJX1lNQVhfTUFTSyAgICAgICgweGZmZmY8PDE2KQorI2RlZmluZSBTQ0lfWE1BWF9NQVNLICAgICAgKDB4ZmZmZjw8MCkKKworI2RlZmluZSBHRlhfT1BfU0NJU1NPUl9FTkFCTEUJICgoMHgzPDwyOSl8KDB4MWM8PDI0KXwoMHgxMDw8MTkpKQorI2RlZmluZSBHRlhfT1BfU0NJU1NPUl9SRUNUCSAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODE8PDE2KXwxKQorI2RlZmluZSBHRlhfT1BfQ09MT1JfRkFDVE9SICAgICAgKCgweDM8PDI5KXwoMHgxZDw8MjQpfCgweDE8PDE2KXwweDApCisjZGVmaW5lIEdGWF9PUF9TVElQUExFICAgICAgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODM8PDE2KSkKKyNkZWZpbmUgR0ZYX09QX01BUF9JTkZPICAgICAgICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwweDQpCisjZGVmaW5lIEdGWF9PUF9ERVNUQlVGRkVSX1ZBUlMgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODU8PDE2KXwweDApCisjZGVmaW5lIEdGWF9PUF9EUkFXUkVDVF9JTkZPICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODA8PDE2KXwoMHgzKSkKKworI2RlZmluZSBNSV9CQVRDSF9CVUZGRVIgCSgoMHgzMDw8MjMpfDEpCisjZGVmaW5lIE1JX0JBVENIX0JVRkZFUl9TVEFSVCAJKDB4MzE8PDIzKQorI2RlZmluZSBNSV9CQVRDSF9CVUZGRVJfRU5EIAkoMHhBPDwyMykKKyNkZWZpbmUgTUlfQkFUQ0hfTk9OX1NFQ1VSRQkoMSkKKworI2RlZmluZSBNSV9XQUlUX0ZPUl9FVkVOVCAgICAgICAoKDB4Mzw8MjMpKQorI2RlZmluZSBNSV9XQUlUX0ZPUl9QTEFORV9BX0ZMSVAgICAgICAoMTw8MikKKyNkZWZpbmUgTUlfV0FJVF9GT1JfUExBTkVfQV9TQ0FOTElORVMgKDE8PDEpCisKKyNkZWZpbmUgTUlfTE9BRF9TQ0FOX0xJTkVTX0lOQ0wgICgoMHgxMjw8MjMpKQorCisjZGVmaW5lIENNRF9PUF9ESVNQTEFZQlVGRkVSX0lORk8gKCgweDA8PDI5KXwoMHgxNDw8MjMpfDIpCisjZGVmaW5lIEFTWU5DX0ZMSVAgICAgICAgICAgICAgICAgKDE8PDIyKQorCisjZGVmaW5lIENNRF9PUF9ERVNUQlVGRkVSX0lORk8JICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4ZTw8MTYpfDEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjM5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qIGk5MTVfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIHRoZSBJOTE1IC0qLSBsaW51eC1jIC0qLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKworI2RlZmluZSBVU0VSX0lOVF9GTEFHIDB4MgorI2RlZmluZSBNQVhfTk9QSUQgKCh1MzIpfjApCisjZGVmaW5lIFJFQURfQlJFQURDUlVNQihkZXZfcHJpdikgICgoKHUzMiopKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSkpWzVdKQorCitpcnFyZXR1cm5fdCBpOTE1X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCit7CisJZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUxNiB0ZW1wOworCisJdGVtcCA9IEk5MTVfUkVBRDE2KEk5MTVSRUdfSU5UX0lERU5USVRZX1IpOworCXRlbXAgJj0gVVNFUl9JTlRfRkxBRzsKKworCURSTV9ERUJVRygiJXMgZmxhZz0lMDh4XG4iLCBfX0ZVTkNUSU9OX18sIHRlbXApOworCisJaWYgKHRlbXAgPT0gMCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJSTkxNV9XUklURTE2KEk5MTVSRUdfSU5UX0lERU5USVRZX1IsIHRlbXApOworCURSTV9XQUtFVVAoJmRldl9wcml2LT5pcnFfcXVldWUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgaTkxNV9lbWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHJldDsKKwlSSU5HX0xPQ0FMUzsKKworCWk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCXJldCA9IGRldl9wcml2LT5jb3VudGVyOworCisJQkVHSU5fTFBfUklORygyKTsKKwlPVVRfUklORygwKTsKKwlPVVRfUklORyhHRlhfT1BfVVNFUl9JTlRFUlJVUFQpOworCUFEVkFOQ0VfTFBfUklORygpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGk5MTVfd2FpdF9pcnEoZHJtX2RldmljZV90ICogZGV2LCBpbnQgaXJxX25yKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldCA9IDA7CisKKwlEUk1fREVCVUcoIiVzIGlycV9ucj0lZCBicmVhZGNydW1iPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGlycV9uciwKKwkJICBSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpKTsKKworCWlmIChSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpID49IGlycV9ucikKKwkJcmV0dXJuIDA7CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJOTE1X0JPWF9XQUlUOworCisJRFJNX1dBSVRfT04ocmV0LCBkZXZfcHJpdi0+aXJxX3F1ZXVlLCAzICogRFJNX0haLAorCQkgICAgUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSA+PSBpcnFfbnIpOworCisJaWYgKHJldCA9PSBEUk1fRVJSKEVCVVNZKSkgeworCQlEUk1fRVJST1IoIiVzOiBFQlVTWSAtLSByZWM6ICVkIGVtaXR0ZWQ6ICVkXG4iLAorCQkJICBfX0ZVTkNUSU9OX18sCisJCQkgIFJFQURfQlJFQURDUlVNQihkZXZfcHJpdiksIChpbnQpZGV2X3ByaXYtPmNvdW50ZXIpOworCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBOZWVkcyB0aGUgbG9jayBhcyBpdCB0b3VjaGVzIHRoZSByaW5nLgorICovCitpbnQgaTkxNV9pcnFfZW1pdChEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X2lycV9lbWl0X3QgZW1pdDsKKwlpbnQgcmVzdWx0OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGVtaXQsIChkcm1faTkxNV9pcnFfZW1pdF90IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2YoZW1pdCkpOworCisJcmVzdWx0ID0gaTkxNV9lbWl0X2lycShkZXYpOworCisJaWYgKERSTV9DT1BZX1RPX1VTRVIoZW1pdC5pcnFfc2VxLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpIHsKKwkJRFJNX0VSUk9SKCJjb3B5X3RvX3VzZXJcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBEb2Vzbid0IG5lZWQgdGhlIGhhcmR3YXJlIGxvY2suCisgKi8KK2ludCBpOTE1X2lycV93YWl0KERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfaXJxX3dhaXRfdCBpcnF3YWl0OworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChpcnF3YWl0LCAoZHJtX2k5MTVfaXJxX3dhaXRfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGlycXdhaXQpKTsKKworCXJldHVybiBpOTE1X3dhaXRfaXJxKGRldiwgaXJxd2FpdC5pcnFfc2VxKTsKK30KKworLyogZHJtX2RtYS5oIGhvb2tzCisqLwordm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKworCUk5MTVfV1JJVEUxNihJOTE1UkVHX0hXU1RBTSwgMHhmZmZlKTsKKwlJOTE1X1dSSVRFMTYoSTkxNVJFR19JTlRfTUFTS19SLCAweDApOworCUk5MTVfV1JJVEUxNihJOTE1UkVHX0lOVF9FTkFCTEVfUiwgMHgwKTsKK30KKwordm9pZCBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwlJOTE1X1dSSVRFMTYoSTkxNVJFR19JTlRfRU5BQkxFX1IsIFVTRVJfSU5UX0ZMQUcpOworCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7Cit9CisKK3ZvaWQgaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwlpZiAoIWRldl9wcml2KQorCQlyZXR1cm47CisKKwlJOTE1X1dSSVRFMTYoSTkxNVJFR19IV1NUQU0sIDB4ZmZmZik7CisJSTkxNV9XUklURTE2KEk5MTVSRUdfSU5UX01BU0tfUiwgMHhmZmZmKTsKKwlJOTE1X1dSSVRFMTYoSTkxNVJFR19JTlRfRU5BQkxFX1IsIDB4MCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0YTMwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYwpAQCAtMCwwICsxLDM0NiBAQAorLyogaTkxNV9tZW0uYyAtLSBTaW1wbGUgYWdwL2ZiIG1lbW9yeSBtYW5hZ2VyIGZvciBpOTE1IC0qLSBsaW51eC1jIC0qLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKworLyogVGhpcyBtZW1vcnkgbWFuYWdlciBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIGdsb2JhbC9sb2NhbCBscnUKKyAqIG1lY2hhbmlzbXMgdXNlZCBieSB0aGUgY2xpZW50cy4gIFNwZWNpZmljYWxseSwgaXQgb3BlcmF0ZXMgYnkKKyAqIHNldHRpbmcgdGhlICdpbl91c2UnIGZpZWxkcyBvZiB0aGUgZ2xvYmFsIExSVSB0byBpbmRpY2F0ZSB3aGV0aGVyCisgKiB0aGlzIHJlZ2lvbiBpcyBwcml2YXRlbHkgYWxsb2NhdGVkIHRvIGEgY2xpZW50LgorICoKKyAqIFRoaXMgZG9lcyByZXF1aXJlIHRoZSBjbGllbnQgdG8gYWN0dWFsbHkgcmVzcGVjdCB0aGF0IGZpZWxkLgorICoKKyAqIEN1cnJlbnRseSBubyBlZmZvcnQgaXMgbWFkZSB0byBhbGxvY2F0ZSAncHJpdmF0ZScgbWVtb3J5IGluIGFueQorICogY2xldmVyIHdheSAtIHRoZSBMUlUgaW5mb3JtYXRpb24gaXNuJ3QgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2gKKyAqIGJsb2NrIHRvIGFsbG9jYXRlLCBhbmQgdGhlIHJpbmcgaXMgZHJhaW5lZCBwcmlvciB0byBhbGxvY2F0aW9ucyAtLQorICogaW4gb3RoZXIgd29yZHMgYWxsb2NhdGlvbiBpcyBleHBlbnNpdmUuCisgKi8KK3N0YXRpYyB2b2lkIG1hcmtfYmxvY2soZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgbWVtX2Jsb2NrICpwLCBpbnQgaW5fdXNlKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fdGV4X3JlZ2lvbl90ICpsaXN0OworCXVuc2lnbmVkIHNoaWZ0LCBucjsKKwl1bnNpZ25lZCBzdGFydDsKKwl1bnNpZ25lZCBlbmQ7CisJdW5zaWduZWQgaTsKKwlpbnQgYWdlOworCisJc2hpZnQgPSBkZXZfcHJpdi0+dGV4X2xydV9sb2dfZ3JhbnVsYXJpdHk7CisJbnIgPSBJOTE1X05SX1RFWF9SRUdJT05TOworCisJc3RhcnQgPSBwLT5zdGFydCA+PiBzaGlmdDsKKwllbmQgPSAocC0+c3RhcnQgKyBwLT5zaXplIC0gMSkgPj4gc2hpZnQ7CisKKwlhZ2UgPSArK3NhcmVhX3ByaXYtPnRleEFnZTsKKwlsaXN0ID0gc2FyZWFfcHJpdi0+dGV4TGlzdDsKKworCS8qIE1hcmsgdGhlIHJlZ2lvbnMgd2l0aCB0aGUgbmV3IGZsYWcgYW5kIHVwZGF0ZSB0aGVpciBhZ2UuICBNb3ZlCisJICogdGhlbSB0byBoZWFkIG9mIGxpc3QgdG8gcHJlc2VydmUgTFJVIHNlbWFudGljcy4KKwkgKi8KKwlmb3IgKGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykgeworCQlsaXN0W2ldLmluX3VzZSA9IGluX3VzZTsKKwkJbGlzdFtpXS5hZ2UgPSBhZ2U7CisKKwkJLyogcmVtb3ZlX2Zyb21fbGlzdChpKQorCQkgKi8KKwkJbGlzdFsodW5zaWduZWQpbGlzdFtpXS5uZXh0XS5wcmV2ID0gbGlzdFtpXS5wcmV2OworCQlsaXN0Wyh1bnNpZ25lZClsaXN0W2ldLnByZXZdLm5leHQgPSBsaXN0W2ldLm5leHQ7CisKKwkJLyogaW5zZXJ0X2F0X2hlYWQobGlzdCwgaSkKKwkJICovCisJCWxpc3RbaV0ucHJldiA9IG5yOworCQlsaXN0W2ldLm5leHQgPSBsaXN0W25yXS5uZXh0OworCQlsaXN0Wyh1bnNpZ25lZClsaXN0W25yXS5uZXh0XS5wcmV2ID0gaTsKKwkJbGlzdFtucl0ubmV4dCA9IGk7CisJfQorfQorCisvKiBWZXJ5IHNpbXBsZSBhbGxvY2F0b3IgZm9yIGFncCBtZW1vcnksIHdvcmtpbmcgb24gYSBzdGF0aWMgcmFuZ2UKKyAqIGFscmVhZHkgbWFwcGVkIGludG8gZWFjaCBjbGllbnQncyBhZGRyZXNzIHNwYWNlLiAgCisgKi8KKworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKnNwbGl0X2Jsb2NrKHN0cnVjdCBtZW1fYmxvY2sgKnAsIGludCBzdGFydCwgaW50IHNpemUsCisJCQkJICAgICBEUk1GSUxFIGZpbHApCit7CisJLyogTWF5YmUgY3V0IG9mZiB0aGUgc3RhcnQgb2YgYW4gZXhpc3RpbmcgYmxvY2sgKi8KKwlpZiAoc3RhcnQgPiBwLT5zdGFydCkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXdibG9jayA9IGRybV9hbGxvYyhzaXplb2YoKm5ld2Jsb2NrKSwgRFJNX01FTV9CVUZMSVNUUyk7CisJCWlmICghbmV3YmxvY2spCisJCQlnb3RvIG91dDsKKwkJbmV3YmxvY2stPnN0YXJ0ID0gc3RhcnQ7CisJCW5ld2Jsb2NrLT5zaXplID0gcC0+c2l6ZSAtIChzdGFydCAtIHAtPnN0YXJ0KTsKKwkJbmV3YmxvY2stPmZpbHAgPSBOVUxMOworCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7CisJCW5ld2Jsb2NrLT5wcmV2ID0gcDsKKwkJcC0+bmV4dC0+cHJldiA9IG5ld2Jsb2NrOworCQlwLT5uZXh0ID0gbmV3YmxvY2s7CisJCXAtPnNpemUgLT0gbmV3YmxvY2stPnNpemU7CisJCXAgPSBuZXdibG9jazsKKwl9CisKKwkvKiBNYXliZSBjdXQgb2ZmIHRoZSBlbmQgb2YgYW4gZXhpc3RpbmcgYmxvY2sgKi8KKwlpZiAoc2l6ZSA8IHAtPnNpemUpIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqbmV3YmxvY2sgPSBkcm1fYWxsb2Moc2l6ZW9mKCpuZXdibG9jayksIERSTV9NRU1fQlVGTElTVFMpOworCQlpZiAoIW5ld2Jsb2NrKQorCQkJZ290byBvdXQ7CisJCW5ld2Jsb2NrLT5zdGFydCA9IHN0YXJ0ICsgc2l6ZTsKKwkJbmV3YmxvY2stPnNpemUgPSBwLT5zaXplIC0gc2l6ZTsKKwkJbmV3YmxvY2stPmZpbHAgPSBOVUxMOworCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7CisJCW5ld2Jsb2NrLT5wcmV2ID0gcDsKKwkJcC0+bmV4dC0+cHJldiA9IG5ld2Jsb2NrOworCQlwLT5uZXh0ID0gbmV3YmxvY2s7CisJCXAtPnNpemUgPSBzaXplOworCX0KKworICAgICAgb3V0OgorCS8qIE91ciBibG9jayBpcyBpbiB0aGUgbWlkZGxlICovCisJcC0+ZmlscCA9IGZpbHA7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Jsb2NrICphbGxvY19ibG9jayhzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwLCBpbnQgc2l6ZSwKKwkJCQkgICAgIGludCBhbGlnbjIsIERSTUZJTEUgZmlscCkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCWludCBtYXNrID0gKDEgPDwgYWxpZ24yKSAtIDE7CisKKwlmb3IgKHAgPSBoZWFwLT5uZXh0OyBwICE9IGhlYXA7IHAgPSBwLT5uZXh0KSB7CisJCWludCBzdGFydCA9IChwLT5zdGFydCArIG1hc2spICYgfm1hc2s7CisJCWlmIChwLT5maWxwID09IE5VTEwgJiYgc3RhcnQgKyBzaXplIDw9IHAtPnN0YXJ0ICsgcC0+c2l6ZSkKKwkJCXJldHVybiBzcGxpdF9ibG9jayhwLCBzdGFydCwgc2l6ZSwgZmlscCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Jsb2NrICpmaW5kX2Jsb2NrKHN0cnVjdCBtZW1fYmxvY2sgKmhlYXAsIGludCBzdGFydCkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCisJZm9yIChwID0gaGVhcC0+bmV4dDsgcCAhPSBoZWFwOyBwID0gcC0+bmV4dCkKKwkJaWYgKHAtPnN0YXJ0ID09IHN0YXJ0KQorCQkJcmV0dXJuIHA7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9ibG9jayhzdHJ1Y3QgbWVtX2Jsb2NrICpwKQoreworCXAtPmZpbHAgPSBOVUxMOworCisJLyogQXNzdW1lcyBhIHNpbmdsZSBjb250aWd1b3VzIHJhbmdlLiAgTmVlZHMgYSBzcGVjaWFsIGZpbHAgaW4KKwkgKiAnaGVhcCcgdG8gc3RvcCBpdCBiZWluZyBzdWJzdW1lZC4KKwkgKi8KKwlpZiAocC0+bmV4dC0+ZmlscCA9PSBOVUxMKSB7CisJCXN0cnVjdCBtZW1fYmxvY2sgKnEgPSBwLT5uZXh0OworCQlwLT5zaXplICs9IHEtPnNpemU7CisJCXAtPm5leHQgPSBxLT5uZXh0OworCQlwLT5uZXh0LT5wcmV2ID0gcDsKKwkJZHJtX2ZyZWUocSwgc2l6ZW9mKCpxKSwgRFJNX01FTV9CVUZMSVNUUyk7CisJfQorCisJaWYgKHAtPnByZXYtPmZpbHAgPT0gTlVMTCkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpxID0gcC0+cHJldjsKKwkJcS0+c2l6ZSArPSBwLT5zaXplOworCQlxLT5uZXh0ID0gcC0+bmV4dDsKKwkJcS0+bmV4dC0+cHJldiA9IHE7CisJCWRybV9mcmVlKHAsIHNpemVvZigqcSksIERSTV9NRU1fQlVGTElTVFMpOworCX0KK30KKworLyogSW5pdGlhbGl6ZS4gIEhvdyB0byBjaGVjayBmb3IgYW4gdW5pbml0aWFsaXplZCBoZWFwPworICovCitzdGF0aWMgaW50IGluaXRfaGVhcChzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcCwgaW50IHN0YXJ0LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpibG9ja3MgPSBkcm1fYWxsb2Moc2l6ZW9mKCpibG9ja3MpLCBEUk1fTUVNX0JVRkxJU1RTKTsKKworCWlmICghYmxvY2tzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCSpoZWFwID0gZHJtX2FsbG9jKHNpemVvZigqKmhlYXApLCBEUk1fTUVNX0JVRkxJU1RTKTsKKwlpZiAoISpoZWFwKSB7CisJCWRybV9mcmVlKGJsb2Nrcywgc2l6ZW9mKCpibG9ja3MpLCBEUk1fTUVNX0JVRkxJU1RTKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYmxvY2tzLT5zdGFydCA9IHN0YXJ0OworCWJsb2Nrcy0+c2l6ZSA9IHNpemU7CisJYmxvY2tzLT5maWxwID0gTlVMTDsKKwlibG9ja3MtPm5leHQgPSBibG9ja3MtPnByZXYgPSAqaGVhcDsKKworCW1lbXNldCgqaGVhcCwgMCwgc2l6ZW9mKCoqaGVhcCkpOworCSgqaGVhcCktPmZpbHAgPSAoRFJNRklMRSkgLSAxOworCSgqaGVhcCktPm5leHQgPSAoKmhlYXApLT5wcmV2ID0gYmxvY2tzOworCXJldHVybiAwOworfQorCisvKiBGcmVlIGFsbCBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxlYXNpbmcgZmlsZS4KKyAqLwordm9pZCBpOTE1X21lbV9yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwKQoreworCXN0cnVjdCBtZW1fYmxvY2sgKnA7CisKKwlpZiAoIWhlYXAgfHwgIWhlYXAtPm5leHQpCisJCXJldHVybjsKKworCWZvciAocCA9IGhlYXAtPm5leHQ7IHAgIT0gaGVhcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKHAtPmZpbHAgPT0gZmlscCkgeworCQkJcC0+ZmlscCA9IE5VTEw7CisJCQltYXJrX2Jsb2NrKGRldiwgcCwgMCk7CisJCX0KKwl9CisKKwkvKiBBc3N1bWVzIGEgc2luZ2xlIGNvbnRpZ3VvdXMgcmFuZ2UuICBOZWVkcyBhIHNwZWNpYWwgZmlscCBpbgorCSAqICdoZWFwJyB0byBzdG9wIGl0IGJlaW5nIHN1YnN1bWVkLgorCSAqLworCWZvciAocCA9IGhlYXAtPm5leHQ7IHAgIT0gaGVhcDsgcCA9IHAtPm5leHQpIHsKKwkJd2hpbGUgKHAtPmZpbHAgPT0gTlVMTCAmJiBwLT5uZXh0LT5maWxwID09IE5VTEwpIHsKKwkJCXN0cnVjdCBtZW1fYmxvY2sgKnEgPSBwLT5uZXh0OworCQkJcC0+c2l6ZSArPSBxLT5zaXplOworCQkJcC0+bmV4dCA9IHEtPm5leHQ7CisJCQlwLT5uZXh0LT5wcmV2ID0gcDsKKwkJCWRybV9mcmVlKHEsIHNpemVvZigqcSksIERSTV9NRU1fQlVGTElTVFMpOworCQl9CisJfQorfQorCisvKiBTaHV0ZG93bi4KKyAqLwordm9pZCBpOTE1X21lbV90YWtlZG93bihzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcCkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCisJaWYgKCEqaGVhcCkKKwkJcmV0dXJuOworCisJZm9yIChwID0gKCpoZWFwKS0+bmV4dDsgcCAhPSAqaGVhcDspIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHA7CisJCXAgPSBwLT5uZXh0OworCQlkcm1fZnJlZShxLCBzaXplb2YoKnEpLCBEUk1fTUVNX0JVRkxJU1RTKTsKKwl9CisKKwlkcm1fZnJlZSgqaGVhcCwgc2l6ZW9mKCoqaGVhcCksIERSTV9NRU1fQlVGTElTVFMpOworCSpoZWFwID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKipnZXRfaGVhcChkcm1faTkxNV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgaW50IHJlZ2lvbikKK3sKKwlzd2l0Y2ggKHJlZ2lvbikgeworCWNhc2UgSTkxNV9NRU1fUkVHSU9OX0FHUDoKKwkJcmV0dXJuICZkZXZfcHJpdi0+YWdwX2hlYXA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKiBJT0NUTCBIQU5ETEVSUyAqLworCitpbnQgaTkxNV9tZW1fYWxsb2MoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9tZW1fYWxsb2NfdCBhbGxvYzsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpibG9jaywgKipoZWFwOworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChhbGxvYywgKGRybV9pOTE1X21lbV9hbGxvY190IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2YoYWxsb2MpKTsKKworCWhlYXAgPSBnZXRfaGVhcChkZXZfcHJpdiwgYWxsb2MucmVnaW9uKTsKKwlpZiAoIWhlYXAgfHwgISpoZWFwKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJLyogTWFrZSB0aGluZ3MgZWFzaWVyIG9uIG91cnNlbHZlczogYWxsIGFsbG9jYXRpb25zIGF0IGxlYXN0CisJICogNGsgYWxpZ25lZC4KKwkgKi8KKwlpZiAoYWxsb2MuYWxpZ25tZW50IDwgMTIpCisJCWFsbG9jLmFsaWdubWVudCA9IDEyOworCisJYmxvY2sgPSBhbGxvY19ibG9jaygqaGVhcCwgYWxsb2Muc2l6ZSwgYWxsb2MuYWxpZ25tZW50LCBmaWxwKTsKKworCWlmICghYmxvY2spCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwltYXJrX2Jsb2NrKGRldiwgYmxvY2ssIDEpOworCisJaWYgKERSTV9DT1BZX1RPX1VTRVIoYWxsb2MucmVnaW9uX29mZnNldCwgJmJsb2NrLT5zdGFydCwgc2l6ZW9mKGludCkpKSB7CisJCURSTV9FUlJPUigiY29weV90b191c2VyXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGk5MTVfbWVtX2ZyZWUoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9tZW1fZnJlZV90IG1lbWZyZWU7CisJc3RydWN0IG1lbV9ibG9jayAqYmxvY2ssICoqaGVhcDsKKworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwobWVtZnJlZSwgKGRybV9pOTE1X21lbV9mcmVlX3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihtZW1mcmVlKSk7CisKKwloZWFwID0gZ2V0X2hlYXAoZGV2X3ByaXYsIG1lbWZyZWUucmVnaW9uKTsKKwlpZiAoIWhlYXAgfHwgISpoZWFwKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJYmxvY2sgPSBmaW5kX2Jsb2NrKCpoZWFwLCBtZW1mcmVlLnJlZ2lvbl9vZmZzZXQpOworCWlmICghYmxvY2spCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwlpZiAoYmxvY2stPmZpbHAgIT0gZmlscCkKKwkJcmV0dXJuIERSTV9FUlIoRVBFUk0pOworCisJbWFya19ibG9jayhkZXYsIGJsb2NrLCAwKTsKKwlmcmVlX2Jsb2NrKGJsb2NrKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGk5MTVfbWVtX2luaXRfaGVhcChEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X21lbV9pbml0X2hlYXBfdCBpbml0aGVhcDsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcDsKKworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoaW5pdGhlYXAsCisJCQkJIChkcm1faTkxNV9tZW1faW5pdF9oZWFwX3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihpbml0aGVhcCkpOworCisJaGVhcCA9IGdldF9oZWFwKGRldl9wcml2LCBpbml0aGVhcC5yZWdpb24pOworCWlmICghaGVhcCkKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCWlmICgqaGVhcCkgeworCQlEUk1fRVJST1IoImhlYXAgYWxyZWFkeSBpbml0aWFsaXplZD8iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlyZXR1cm4gaW5pdF9oZWFwKGhlYXAsIGluaXRoZWFwLnN0YXJ0LCBpbml0aGVhcC5zaXplKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMyZWFmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCkBAIC0wLDAgKzEsNzU0IEBACisvKiBtZ2FfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIG1nYSBnMjAwL2c0MDAgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gRGVjIDEzIDAxOjUwOjAxIDE5OTkgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICoKKyAqIFJld3JpdHRlbiBieToKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm1nYV9kcm0uaCIKKyNpbmNsdWRlICJtZ2FfZHJ2LmgiCisKKyNkZWZpbmUgTUdBX0RFRkFVTFRfVVNFQ19USU1FT1VUCTEwMDAwCisjZGVmaW5lIE1HQV9GUkVFTElTVF9ERUJVRwkJMAorCitzdGF0aWMgaW50IG1nYV9kb19jbGVhbnVwX2RtYSggZHJtX2RldmljZV90ICpkZXYgKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRW5naW5lIGNvbnRyb2wKKyAqLworCitpbnQgbWdhX2RvX3dhaXRfZm9yX2lkbGUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJdTMyIHN0YXR1cyA9IDA7CisJaW50IGk7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQlzdGF0dXMgPSBNR0FfUkVBRCggTUdBX1NUQVRVUyApICYgTUdBX0VOR0lORV9JRExFX01BU0s7CisJCWlmICggc3RhdHVzID09IE1HQV9FTkRQUkRNQVNUUyApIHsKKwkJCU1HQV9XUklURTgoIE1HQV9DUlRDX0lOREVYLCAwICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisjaWYgTUdBX0RNQV9ERUJVRworCURSTV9FUlJPUiggImZhaWxlZCFcbiIgKTsKKwlEUk1fSU5GTyggIiAgIHN0YXR1cz0weCUwOHhcbiIsIHN0YXR1cyApOworI2VuZGlmCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCitzdGF0aWMgaW50IG1nYV9kb19kbWFfcmVzZXQoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV9wcmltYXJ5X2J1ZmZlcl90ICpwcmltYXJ5ID0gJmRldl9wcml2LT5wcmltOworCisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwkvKiBUaGUgcHJpbWFyeSBETUEgc3RyZWFtIHNob3VsZCBsb29rIGxpa2UgbmV3IHJpZ2h0IGFib3V0IG5vdy4KKwkgKi8KKwlwcmltYXJ5LT50YWlsID0gMDsKKwlwcmltYXJ5LT5zcGFjZSA9IHByaW1hcnktPnNpemU7CisJcHJpbWFyeS0+bGFzdF9mbHVzaCA9IDA7CisKKwlzYXJlYV9wcml2LT5sYXN0X3dyYXAgPSAwOworCisJLyogRklYTUU6IFJlc2V0IGNvdW50ZXJzLCBidWZmZXIgYWdlcyBldGMuLi4KKwkgKi8KKworCS8qIEZJWE1FOiBXaGF0IGVsc2UgZG8gd2UgbmVlZCB0byByZWluaXRpYWxpemU/ICBXQVJQIHN0dWZmPworCSAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByaW1hcnkgRE1BIHN0cmVhbQorICovCisKK3ZvaWQgbWdhX2RvX2RtYV9mbHVzaCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3ByaW1hcnlfYnVmZmVyX3QgKnByaW1hcnkgPSAmZGV2X3ByaXYtPnByaW07CisJdTMyIGhlYWQsIHRhaWw7CisJdTMyIHN0YXR1cyA9IDA7CisJaW50IGk7CisgCURNQV9MT0NBTFM7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKyAgICAgICAgLyogV2UgbmVlZCB0byB3YWl0IHNvIHRoYXQgd2UgY2FuIGRvIGFuIHNhZmUgZmx1c2ggKi8KKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQlzdGF0dXMgPSBNR0FfUkVBRCggTUdBX1NUQVRVUyApICYgTUdBX0VOR0lORV9JRExFX01BU0s7CisJCWlmICggc3RhdHVzID09IE1HQV9FTkRQUkRNQVNUUyApIGJyZWFrOworCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisJaWYgKCBwcmltYXJ5LT50YWlsID09IHByaW1hcnktPmxhc3RfZmx1c2ggKSB7CisJCURSTV9ERUJVRyggIiAgIGJhaWxpbmcgb3V0Li4uXG4iICk7CisJCXJldHVybjsKKwl9CisKKwl0YWlsID0gcHJpbWFyeS0+dGFpbCArIGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQ7CisKKwkvKiBXZSBuZWVkIHRvIHBhZCB0aGUgc3RyZWFtIGJldHdlZW4gZmx1c2hlcywgYXMgdGhlIGNhcmQKKwkgKiBhY3R1YWxseSAocGFydGlhbGx5PykgcmVhZHMgdGhlIGZpcnN0IG9mIHRoZXNlIGNvbW1hbmRzLgorCSAqIFNlZSBwYWdlIDQtMTYgaW4gdGhlIEc0MDAgbWFudWFsLCBtaWRkbGUgb2YgdGhlIHBhZ2Ugb3Igc28uCisJICovCisJQkVHSU5fRE1BKCAxICk7CisKKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsICAweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELCAgMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwgIDB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAgKTsKKworCUFEVkFOQ0VfRE1BKCk7CisKKwlwcmltYXJ5LT5sYXN0X2ZsdXNoID0gcHJpbWFyeS0+dGFpbDsKKworCWhlYWQgPSBNR0FfUkVBRCggTUdBX1BSSU1BRERSRVNTICk7CisKKwlpZiAoIGhlYWQgPD0gdGFpbCApIHsKKwkJcHJpbWFyeS0+c3BhY2UgPSBwcmltYXJ5LT5zaXplIC0gcHJpbWFyeS0+dGFpbDsKKwl9IGVsc2UgeworCQlwcmltYXJ5LT5zcGFjZSA9IGhlYWQgLSB0YWlsOworCX0KKworCURSTV9ERUJVRyggIiAgIGhlYWQgPSAweCUwNmx4XG4iLCBoZWFkIC0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCApOworCURSTV9ERUJVRyggIiAgIHRhaWwgPSAweCUwNmx4XG4iLCB0YWlsIC0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCApOworCURSTV9ERUJVRyggIiAgc3BhY2UgPSAweCUwNnhcbiIsIHByaW1hcnktPnNwYWNlICk7CisKKwltZ2FfZmx1c2hfd3JpdGVfY29tYmluZSgpOworCU1HQV9XUklURSggTUdBX1BSSU1FTkQsIHRhaWwgfCBNR0FfUEFHUFhGRVIgKTsKKworCURSTV9ERUJVRyggImRvbmUuXG4iICk7Cit9CisKK3ZvaWQgbWdhX2RvX2RtYV93cmFwX3N0YXJ0KCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2FfcHJpbWFyeV9idWZmZXJfdCAqcHJpbWFyeSA9ICZkZXZfcHJpdi0+cHJpbTsKKwl1MzIgaGVhZCwgdGFpbDsKKwlETUFfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJQkVHSU5fRE1BX1dSQVAoKTsKKworCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCApOworCisJQURWQU5DRV9ETUEoKTsKKworCXRhaWwgPSBwcmltYXJ5LT50YWlsICsgZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldDsKKworCXByaW1hcnktPnRhaWwgPSAwOworCXByaW1hcnktPmxhc3RfZmx1c2ggPSAwOworCXByaW1hcnktPmxhc3Rfd3JhcCsrOworCisJaGVhZCA9IE1HQV9SRUFEKCBNR0FfUFJJTUFERFJFU1MgKTsKKworCWlmICggaGVhZCA9PSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0ICkgeworCQlwcmltYXJ5LT5zcGFjZSA9IHByaW1hcnktPnNpemU7CisJfSBlbHNlIHsKKwkJcHJpbWFyeS0+c3BhY2UgPSBoZWFkIC0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldDsKKwl9CisKKwlEUk1fREVCVUcoICIgICBoZWFkID0gMHglMDZseFxuIiwKKwkJICBoZWFkIC0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCApOworCURSTV9ERUJVRyggIiAgIHRhaWwgPSAweCUwNnhcbiIsIHByaW1hcnktPnRhaWwgKTsKKwlEUk1fREVCVUcoICIgICB3cmFwID0gJWRcbiIsIHByaW1hcnktPmxhc3Rfd3JhcCApOworCURSTV9ERUJVRyggIiAgc3BhY2UgPSAweCUwNnhcbiIsIHByaW1hcnktPnNwYWNlICk7CisKKwltZ2FfZmx1c2hfd3JpdGVfY29tYmluZSgpOworCU1HQV9XUklURSggTUdBX1BSSU1FTkQsIHRhaWwgfCBNR0FfUEFHUFhGRVIgKTsKKworCXNldF9iaXQoIDAsICZwcmltYXJ5LT53cmFwcGVkICk7CisJRFJNX0RFQlVHKCAiZG9uZS5cbiIgKTsKK30KKwordm9pZCBtZ2FfZG9fZG1hX3dyYXBfZW5kKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2FfcHJpbWFyeV9idWZmZXJfdCAqcHJpbWFyeSA9ICZkZXZfcHJpdi0+cHJpbTsKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwl1MzIgaGVhZCA9IGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQ7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlzYXJlYV9wcml2LT5sYXN0X3dyYXArKzsKKwlEUk1fREVCVUcoICIgICB3cmFwID0gJWRcbiIsIHNhcmVhX3ByaXYtPmxhc3Rfd3JhcCApOworCisJbWdhX2ZsdXNoX3dyaXRlX2NvbWJpbmUoKTsKKwlNR0FfV1JJVEUoIE1HQV9QUklNQUREUkVTUywgaGVhZCB8IE1HQV9ETUFfR0VORVJBTCApOworCisJY2xlYXJfYml0KCAwLCAmcHJpbWFyeS0+d3JhcHBlZCApOworCURSTV9ERUJVRyggImRvbmUuXG4iICk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnJlZWxpc3QgbWFuYWdlbWVudAorICovCisKKyNkZWZpbmUgTUdBX0JVRkZFUl9VU0VECQl+MAorI2RlZmluZSBNR0FfQlVGRkVSX0ZSRUUJCTAKKworI2lmIE1HQV9GUkVFTElTVF9ERUJVRworc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X3ByaW50KCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX2ZyZWVsaXN0X3QgKmVudHJ5OworCisJRFJNX0lORk8oICJcbiIgKTsKKwlEUk1fSU5GTyggImN1cnJlbnQgZGlzcGF0Y2g6IGxhc3Q9MHgleCBkb25lPTB4JXhcbiIsCisJCSAgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2gsCisJCSAgKHVuc2lnbmVkIGludCkoTUdBX1JFQUQoIE1HQV9QUklNQUREUkVTUyApIC0KKwkJCQkgZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCkgKTsKKwlEUk1fSU5GTyggImN1cnJlbnQgZnJlZWxpc3Q6XG4iICk7CisKKwlmb3IgKCBlbnRyeSA9IGRldl9wcml2LT5oZWFkLT5uZXh0IDsgZW50cnkgOyBlbnRyeSA9IGVudHJ5LT5uZXh0ICkgeworCQlEUk1fSU5GTyggIiAgICVwICAgaWR4PSUyZCAgYWdlPTB4JXggMHglMDZseFxuIiwKKwkJCSAgZW50cnksIGVudHJ5LT5idWYtPmlkeCwgZW50cnktPmFnZS5oZWFkLAorCQkJICBlbnRyeS0+YWdlLmhlYWQgLSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0ICk7CisJfQorCURSTV9JTkZPKCAiXG4iICk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBtZ2FfZnJlZWxpc3RfaW5pdCggZHJtX2RldmljZV90ICpkZXYsIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fbWdhX2ZyZWVsaXN0X3QgKmVudHJ5OworCWludCBpOworCURSTV9ERUJVRyggImNvdW50PSVkXG4iLCBkbWEtPmJ1Zl9jb3VudCApOworCisJZGV2X3ByaXYtPmhlYWQgPSBkcm1fYWxsb2MoIHNpemVvZihkcm1fbWdhX2ZyZWVsaXN0X3QpLAorCQkJCSAgICAgRFJNX01FTV9EUklWRVIgKTsKKwlpZiAoIGRldl9wcml2LT5oZWFkID09IE5VTEwgKQorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCisJbWVtc2V0KCBkZXZfcHJpdi0+aGVhZCwgMCwgc2l6ZW9mKGRybV9tZ2FfZnJlZWxpc3RfdCkgKTsKKwlTRVRfQUdFKCAmZGV2X3ByaXYtPmhlYWQtPmFnZSwgTUdBX0JVRkZFUl9VU0VELCAwICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkbWEtPmJ1Zl9jb3VudCA7IGkrKyApIHsKKwkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCSAgICAgICAgYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJCWVudHJ5ID0gZHJtX2FsbG9jKCBzaXplb2YoZHJtX21nYV9mcmVlbGlzdF90KSwKKwkJCQkgICAgRFJNX01FTV9EUklWRVIgKTsKKwkJaWYgKCBlbnRyeSA9PSBOVUxMICkKKwkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwkJbWVtc2V0KCBlbnRyeSwgMCwgc2l6ZW9mKGRybV9tZ2FfZnJlZWxpc3RfdCkgKTsKKworCQllbnRyeS0+bmV4dCA9IGRldl9wcml2LT5oZWFkLT5uZXh0OworCQllbnRyeS0+cHJldiA9IGRldl9wcml2LT5oZWFkOworCQlTRVRfQUdFKCAmZW50cnktPmFnZSwgTUdBX0JVRkZFUl9GUkVFLCAwICk7CisJCWVudHJ5LT5idWYgPSBidWY7CisKKwkJaWYgKCBkZXZfcHJpdi0+aGVhZC0+bmV4dCAhPSBOVUxMICkKKwkJCWRldl9wcml2LT5oZWFkLT5uZXh0LT5wcmV2ID0gZW50cnk7CisJCWlmICggZW50cnktPm5leHQgPT0gTlVMTCApCisJCQlkZXZfcHJpdi0+dGFpbCA9IGVudHJ5OworCisJCWJ1Zl9wcml2LT5saXN0X2VudHJ5ID0gZW50cnk7CisJCWJ1Zl9wcml2LT5kaXNjYXJkID0gMDsKKwkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCisJCWRldl9wcml2LT5oZWFkLT5uZXh0ID0gZW50cnk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1nYV9mcmVlbGlzdF9jbGVhbnVwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX2ZyZWVsaXN0X3QgKmVudHJ5OworCWRybV9tZ2FfZnJlZWxpc3RfdCAqbmV4dDsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWVudHJ5ID0gZGV2X3ByaXYtPmhlYWQ7CisJd2hpbGUgKCBlbnRyeSApIHsKKwkJbmV4dCA9IGVudHJ5LT5uZXh0OworCQlkcm1fZnJlZSggZW50cnksIHNpemVvZihkcm1fbWdhX2ZyZWVsaXN0X3QpLCBEUk1fTUVNX0RSSVZFUiApOworCQllbnRyeSA9IG5leHQ7CisJfQorCisJZGV2X3ByaXYtPmhlYWQgPSBkZXZfcHJpdi0+dGFpbCA9IE5VTEw7Cit9CisKKyNpZiAwCisvKiBGSVhNRTogU3RpbGwgbmVlZGVkPworICovCitzdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfcmVzZXQoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWludCBpOworCisJZm9yICggaSA9IDAgOyBpIDwgZG1hLT5idWZfY291bnQgOyBpKysgKSB7CisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkgICAgICAgIGJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwkJU0VUX0FHRSggJmJ1Zl9wcml2LT5saXN0X2VudHJ5LT5hZ2UsCisJCQkgTUdBX0JVRkZFUl9GUkVFLCAwICk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBkcm1fYnVmX3QgKm1nYV9mcmVlbGlzdF9nZXQoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2FfZnJlZWxpc3RfdCAqbmV4dDsKKwlkcm1fbWdhX2ZyZWVsaXN0X3QgKnByZXY7CisJZHJtX21nYV9mcmVlbGlzdF90ICp0YWlsID0gZGV2X3ByaXYtPnRhaWw7CisJdTMyIGhlYWQsIHdyYXA7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwloZWFkID0gTUdBX1JFQUQoIE1HQV9QUklNQUREUkVTUyApOworCXdyYXAgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF93cmFwOworCisJRFJNX0RFQlVHKCAiICAgdGFpbD0weCUwNmx4ICVkXG4iLAorCQkgICB0YWlsLT5hZ2UuaGVhZCA/CisJCSAgIHRhaWwtPmFnZS5oZWFkIC0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCA6IDAsCisJCSAgIHRhaWwtPmFnZS53cmFwICk7CisJRFJNX0RFQlVHKCAiICAgaGVhZD0weCUwNmx4ICVkXG4iLAorCQkgICBoZWFkIC0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCwgd3JhcCApOworCisJaWYgKCBURVNUX0FHRSggJnRhaWwtPmFnZSwgaGVhZCwgd3JhcCApICkgeworCQlwcmV2ID0gZGV2X3ByaXYtPnRhaWwtPnByZXY7CisJCW5leHQgPSBkZXZfcHJpdi0+dGFpbDsKKwkJcHJldi0+bmV4dCA9IE5VTEw7CisJCW5leHQtPnByZXYgPSBuZXh0LT5uZXh0ID0gTlVMTDsKKwkJZGV2X3ByaXYtPnRhaWwgPSBwcmV2OworCQlTRVRfQUdFKCAmbmV4dC0+YWdlLCBNR0FfQlVGRkVSX1VTRUQsIDAgKTsKKwkJcmV0dXJuIG5leHQtPmJ1ZjsKKwl9CisKKwlEUk1fREVCVUcoICJyZXR1cm5pbmcgTlVMTCFcbiIgKTsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IG1nYV9mcmVlbGlzdF9wdXQoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZiApCit7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX2ZyZWVsaXN0X3QgKmhlYWQsICplbnRyeSwgKnByZXY7CisKKwlEUk1fREVCVUcoICJhZ2U9MHglMDZseCB3cmFwPSVkXG4iLAorCQkgICBidWZfcHJpdi0+bGlzdF9lbnRyeS0+YWdlLmhlYWQgLQorCQkgICBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0LAorCQkgICBidWZfcHJpdi0+bGlzdF9lbnRyeS0+YWdlLndyYXAgKTsKKworCWVudHJ5ID0gYnVmX3ByaXYtPmxpc3RfZW50cnk7CisJaGVhZCA9IGRldl9wcml2LT5oZWFkOworCisJaWYgKCBidWZfcHJpdi0+bGlzdF9lbnRyeS0+YWdlLmhlYWQgPT0gTUdBX0JVRkZFUl9VU0VEICkgeworCQlTRVRfQUdFKCAmZW50cnktPmFnZSwgTUdBX0JVRkZFUl9GUkVFLCAwICk7CisJCXByZXYgPSBkZXZfcHJpdi0+dGFpbDsKKwkJcHJldi0+bmV4dCA9IGVudHJ5OworCQllbnRyeS0+cHJldiA9IHByZXY7CisJCWVudHJ5LT5uZXh0ID0gTlVMTDsKKwl9IGVsc2UgeworCQlwcmV2ID0gaGVhZC0+bmV4dDsKKwkJaGVhZC0+bmV4dCA9IGVudHJ5OworCQlwcmV2LT5wcmV2ID0gZW50cnk7CisJCWVudHJ5LT5wcmV2ID0gaGVhZDsKKwkJZW50cnktPm5leHQgPSBwcmV2OworCX0KKworCXJldHVybiAwOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERNQSBpbml0aWFsaXphdGlvbiwgY2xlYW51cAorICovCisKK3N0YXRpYyBpbnQgbWdhX2RvX2luaXRfZG1hKCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX21nYV9pbml0X3QgKmluaXQgKQoreworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKwlpbnQgcmV0OworCURSTV9ERUJVRyggIlxuIiApOworCisJZGV2X3ByaXYgPSBkcm1fYWxsb2MoIHNpemVvZihkcm1fbWdhX3ByaXZhdGVfdCksIERSTV9NRU1fRFJJVkVSICk7CisJaWYgKCAhZGV2X3ByaXYgKQorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCisJbWVtc2V0KCBkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9tZ2FfcHJpdmF0ZV90KSApOworCisJZGV2X3ByaXYtPmNoaXBzZXQgPSBpbml0LT5jaGlwc2V0OworCisJZGV2X3ByaXYtPnVzZWNfdGltZW91dCA9IE1HQV9ERUZBVUxUX1VTRUNfVElNRU9VVDsKKworCWlmICggaW5pdC0+c2dyYW0gKSB7CisJCWRldl9wcml2LT5jbGVhcl9jbWQgPSBNR0FfRFdHQ1RMX0NMRUFSIHwgTUdBX0FUWVBFX0JMSzsKKwl9IGVsc2UgeworCQlkZXZfcHJpdi0+Y2xlYXJfY21kID0gTUdBX0RXR0NUTF9DTEVBUiB8IE1HQV9BVFlQRV9SU1RSOworCX0KKwlkZXZfcHJpdi0+bWFjY2Vzcwk9IGluaXQtPm1hY2Nlc3M7CisKKwlkZXZfcHJpdi0+ZmJfY3BwCT0gaW5pdC0+ZmJfY3BwOworCWRldl9wcml2LT5mcm9udF9vZmZzZXQJPSBpbml0LT5mcm9udF9vZmZzZXQ7CisJZGV2X3ByaXYtPmZyb250X3BpdGNoCT0gaW5pdC0+ZnJvbnRfcGl0Y2g7CisJZGV2X3ByaXYtPmJhY2tfb2Zmc2V0CT0gaW5pdC0+YmFja19vZmZzZXQ7CisJZGV2X3ByaXYtPmJhY2tfcGl0Y2gJPSBpbml0LT5iYWNrX3BpdGNoOworCisJZGV2X3ByaXYtPmRlcHRoX2NwcAk9IGluaXQtPmRlcHRoX2NwcDsKKwlkZXZfcHJpdi0+ZGVwdGhfb2Zmc2V0CT0gaW5pdC0+ZGVwdGhfb2Zmc2V0OworCWRldl9wcml2LT5kZXB0aF9waXRjaAk9IGluaXQtPmRlcHRoX3BpdGNoOworCisJLyogRklYTUU6IE5lZWQgdG8gc3VwcG9ydCBBR1AgdGV4dHVyZXMuLi4KKwkgKi8KKwlkZXZfcHJpdi0+dGV4dHVyZV9vZmZzZXQgPSBpbml0LT50ZXh0dXJlX29mZnNldFswXTsKKwlkZXZfcHJpdi0+dGV4dHVyZV9zaXplID0gaW5pdC0+dGV4dHVyZV9zaXplWzBdOworCisJRFJNX0dFVFNBUkVBKCk7CisKKwlpZighZGV2X3ByaXYtPnNhcmVhKSB7CisJCURSTV9FUlJPUiggImZhaWxlZCB0byBmaW5kIHNhcmVhIVxuIiApOworCQkvKiBBc3NpZ24gZGV2X3ByaXZhdGUgc28gd2UgY2FuIGRvIGNsZWFudXAuICovCisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQltZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWRldl9wcml2LT5tbWlvID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPm1taW9fb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPm1taW8pIHsKKwkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGZpbmQgbW1pbyByZWdpb24hXG4iICk7CisJCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWRldl9wcml2LT5zdGF0dXMgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+c3RhdHVzX29mZnNldCk7CisJaWYoIWRldl9wcml2LT5zdGF0dXMpIHsKKwkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGZpbmQgc3RhdHVzIHBhZ2UhXG4iICk7CisJCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWRldl9wcml2LT53YXJwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPndhcnBfb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPndhcnApIHsKKwkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGZpbmQgd2FycCBtaWNyb2NvZGUgcmVnaW9uIVxuIiApOworCQkvKiBBc3NpZ24gZGV2X3ByaXZhdGUgc28gd2UgY2FuIGRvIGNsZWFudXAuICovCisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQltZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlkZXZfcHJpdi0+cHJpbWFyeSA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5wcmltYXJ5X29mZnNldCk7CisJaWYoIWRldl9wcml2LT5wcmltYXJ5KSB7CisJCURSTV9FUlJPUiggImZhaWxlZCB0byBmaW5kIHByaW1hcnkgZG1hIHJlZ2lvbiFcbiIgKTsKKwkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5idWZmZXJzX29mZnNldCk7CisJaWYoIWRldi0+YWdwX2J1ZmZlcl9tYXApIHsKKwkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGZpbmQgZG1hIGJ1ZmZlciByZWdpb24hXG4iICk7CisJCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYgPQorCQkoZHJtX21nYV9zYXJlYV90ICopKCh1OCAqKWRldl9wcml2LT5zYXJlYS0+aGFuZGxlICsKKwkJCQkgICAgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCisJZHJtX2NvcmVfaW9yZW1hcCggZGV2X3ByaXYtPndhcnAsIGRldiApOworCWRybV9jb3JlX2lvcmVtYXAoIGRldl9wcml2LT5wcmltYXJ5LCBkZXYgKTsKKwlkcm1fY29yZV9pb3JlbWFwKCBkZXYtPmFncF9idWZmZXJfbWFwLCBkZXYgKTsKKworCWlmKCFkZXZfcHJpdi0+d2FycC0+aGFuZGxlIHx8CisJICAgIWRldl9wcml2LT5wcmltYXJ5LT5oYW5kbGUgfHwKKwkgICAhZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICkgeworCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gaW9yZW1hcCBhZ3AgcmVnaW9ucyFcbiIgKTsKKwkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisKKwlyZXQgPSBtZ2Ffd2FycF9pbnN0YWxsX21pY3JvY29kZSggZGV2X3ByaXYgKTsKKwlpZiAoIHJldCA8IDAgKSB7CisJCURSTV9FUlJPUiggImZhaWxlZCB0byBpbnN0YWxsIFdBUlAgdWNvZGUhXG4iICk7CisJCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbWdhX3dhcnBfaW5pdCggZGV2X3ByaXYgKTsKKwlpZiAoIHJldCA8IDAgKSB7CisJCURSTV9FUlJPUiggImZhaWxlZCB0byBpbml0IFdBUlAgZW5naW5lIVxuIiApOworCQkvKiBBc3NpZ24gZGV2X3ByaXZhdGUgc28gd2UgY2FuIGRvIGNsZWFudXAuICovCisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQltZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9wcml2LT5wcmltLnN0YXR1cyA9ICh1MzIgKilkZXZfcHJpdi0+c3RhdHVzLT5oYW5kbGU7CisKKwltZ2FfZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKKworCS8qIEluaXQgdGhlIHByaW1hcnkgRE1BIHJlZ2lzdGVycy4KKwkgKi8KKwlNR0FfV1JJVEUoIE1HQV9QUklNQUREUkVTUywKKwkJICAgZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCB8IE1HQV9ETUFfR0VORVJBTCApOworI2lmIDAKKwlNR0FfV1JJVEUoIE1HQV9QUklNUFRSLAorCQkgICB2aXJ0X3RvX2J1cygodm9pZCAqKWRldl9wcml2LT5wcmltLnN0YXR1cykgfAorCQkgICBNR0FfUFJJTVBUUkVOMCB8CS8qIFNvZnQgdHJhcCwgU0VDRU5ELCBTRVRVUEVORCAqLworCQkgICBNR0FfUFJJTVBUUkVOMSApOwkvKiBEV0dTWU5DICovCisjZW5kaWYKKworCWRldl9wcml2LT5wcmltLnN0YXJ0ID0gKHU4ICopZGV2X3ByaXYtPnByaW1hcnktPmhhbmRsZTsKKwlkZXZfcHJpdi0+cHJpbS5lbmQgPSAoKHU4ICopZGV2X3ByaXYtPnByaW1hcnktPmhhbmRsZQorCQkJICAgICAgKyBkZXZfcHJpdi0+cHJpbWFyeS0+c2l6ZSk7CisJZGV2X3ByaXYtPnByaW0uc2l6ZSA9IGRldl9wcml2LT5wcmltYXJ5LT5zaXplOworCisJZGV2X3ByaXYtPnByaW0udGFpbCA9IDA7CisJZGV2X3ByaXYtPnByaW0uc3BhY2UgPSBkZXZfcHJpdi0+cHJpbS5zaXplOworCWRldl9wcml2LT5wcmltLndyYXBwZWQgPSAwOworCisJZGV2X3ByaXYtPnByaW0ubGFzdF9mbHVzaCA9IDA7CisJZGV2X3ByaXYtPnByaW0ubGFzdF93cmFwID0gMDsKKworCWRldl9wcml2LT5wcmltLmhpZ2hfbWFyayA9IDI1NiAqIERNQV9CTE9DS19TSVpFOworCisJZGV2X3ByaXYtPnByaW0uc3RhdHVzWzBdID0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldDsKKwlkZXZfcHJpdi0+cHJpbS5zdGF0dXNbMV0gPSAwOworCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3Rfd3JhcCA9IDA7CisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUuaGVhZCA9IDA7CisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUud3JhcCA9IDA7CisKKwlpZiAoIG1nYV9mcmVlbGlzdF9pbml0KCBkZXYsIGRldl9wcml2ICkgPCAwICkgeworCQlEUk1fRVJST1IoICJjb3VsZCBub3QgaW5pdGlhbGl6ZSBmcmVlbGlzdFxuIiApOworCQkvKiBBc3NpZ24gZGV2X3ByaXZhdGUgc28gd2UgY2FuIGRvIGNsZWFudXAuICovCisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQltZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKworCS8qIE1ha2UgZGV2X3ByaXZhdGUgdmlzYWJsZSB0byBvdGhlcnMuICovCisJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWdhX2RvX2NsZWFudXBfZG1hKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwkvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIHRoZSB1bmluc3RhbGwgaW9jdGwKKwkgKiBtYXkgbm90IGhhdmUgYmVlbiBjYWxsZWQgZnJvbSB1c2Vyc3BhY2UgYW5kIGFmdGVyIGRldl9wcml2YXRlCisJICogaXMgZnJlZWQsIGl0J3MgdG9vIGxhdGUuCisJICovCisJaWYgKCBkZXYtPmlycV9lbmFibGVkICkgZHJtX2lycV91bmluc3RhbGwoZGV2KTsKKworCWlmICggZGV2LT5kZXZfcHJpdmF0ZSApIHsKKwkJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCQlpZiAoIGRldl9wcml2LT53YXJwICE9IE5VTEwgKQorCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoIGRldl9wcml2LT53YXJwLCBkZXYgKTsKKwkJaWYgKCBkZXZfcHJpdi0+cHJpbWFyeSAhPSBOVUxMICkKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCBkZXZfcHJpdi0+cHJpbWFyeSwgZGV2ICk7CisJCWlmICggZGV2LT5hZ3BfYnVmZmVyX21hcCAhPSBOVUxMICkKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCBkZXYtPmFncF9idWZmZXJfbWFwLCBkZXYgKTsKKworCQlpZiAoIGRldl9wcml2LT5oZWFkICE9IE5VTEwgKSB7CisJCQltZ2FfZnJlZWxpc3RfY2xlYW51cCggZGV2ICk7CisJCX0KKworCQlkcm1fZnJlZSggZGV2LT5kZXZfcHJpdmF0ZSwgc2l6ZW9mKGRybV9tZ2FfcHJpdmF0ZV90KSwKKwkJCSAgIERSTV9NRU1fRFJJVkVSICk7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWdhX2RtYV9pbml0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fbWdhX2luaXRfdCBpbml0OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggaW5pdCwgKGRybV9tZ2FfaW5pdF90IF9fdXNlciAqKWRhdGEsIHNpemVvZihpbml0KSApOworCisJc3dpdGNoICggaW5pdC5mdW5jICkgeworCWNhc2UgTUdBX0lOSVRfRE1BOgorCQlyZXR1cm4gbWdhX2RvX2luaXRfZG1hKCBkZXYsICZpbml0ICk7CisJY2FzZSBNR0FfQ0xFQU5VUF9ETUE6CisJCXJldHVybiBtZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOworCX0KKworCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJpbWFyeSBETUEgc3RyZWFtIG1hbmFnZW1lbnQKKyAqLworCitpbnQgbWdhX2RtYV9mbHVzaCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbG9ja190IGxvY2s7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBsb2NrLCAoZHJtX2xvY2tfdCBfX3VzZXIgKilkYXRhLCBzaXplb2YobG9jaykgKTsKKworCURSTV9ERUJVRyggIiVzJXMlc1xuIiwKKwkJICAgKGxvY2suZmxhZ3MgJiBfRFJNX0xPQ0tfRkxVU0gpID8JImZsdXNoLCAiIDogIiIsCisJCSAgIChsb2NrLmZsYWdzICYgX0RSTV9MT0NLX0ZMVVNIX0FMTCkgPwkiZmx1c2ggYWxsLCAiIDogIiIsCisJCSAgIChsb2NrLmZsYWdzICYgX0RSTV9MT0NLX1FVSUVTQ0VOVCkgPwkiaWRsZSwgIiA6ICIiICk7CisKKwlXUkFQX1dBSVRfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlpZiAoIGxvY2suZmxhZ3MgJiAoX0RSTV9MT0NLX0ZMVVNIIHwgX0RSTV9MT0NLX0ZMVVNIX0FMTCkgKSB7CisJCW1nYV9kb19kbWFfZmx1c2goIGRldl9wcml2ICk7CisJfQorCisJaWYgKCBsb2NrLmZsYWdzICYgX0RSTV9MT0NLX1FVSUVTQ0VOVCApIHsKKyNpZiBNR0FfRE1BX0RFQlVHCisJCWludCByZXQgPSBtZ2FfZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKKwkJaWYgKCByZXQgPCAwICkKKwkJCURSTV9JTkZPKCAiJXM6IC1FQlVTWVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiByZXQ7CisjZWxzZQorCQlyZXR1cm4gbWdhX2RvX3dhaXRfZm9yX2lkbGUoIGRldl9wcml2ICk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKK2ludCBtZ2FfZG1hX3Jlc2V0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCXJldHVybiBtZ2FfZG9fZG1hX3Jlc2V0KCBkZXZfcHJpdiApOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERNQSBidWZmZXIgbWFuYWdlbWVudAorICovCisKK3N0YXRpYyBpbnQgbWdhX2RtYV9nZXRfYnVmZmVycyggRFJNRklMRSBmaWxwLAorCQkJCWRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZG1hX3QgKmQgKQoreworCWRybV9idWZfdCAqYnVmOworCWludCBpOworCisJZm9yICggaSA9IGQtPmdyYW50ZWRfY291bnQgOyBpIDwgZC0+cmVxdWVzdF9jb3VudCA7IGkrKyApIHsKKwkJYnVmID0gbWdhX2ZyZWVsaXN0X2dldCggZGV2ICk7CisJCWlmICggIWJ1ZiApIHJldHVybiBEUk1fRVJSKEVBR0FJTik7CisKKwkJYnVmLT5maWxwID0gZmlscDsKKworCQlpZiAoIERSTV9DT1BZX1RPX1VTRVIoICZkLT5yZXF1ZXN0X2luZGljZXNbaV0sCisJCQkJICAgJmJ1Zi0+aWR4LCBzaXplb2YoYnVmLT5pZHgpICkgKQorCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJaWYgKCBEUk1fQ09QWV9UT19VU0VSKCAmZC0+cmVxdWVzdF9zaXplc1tpXSwKKwkJCQkgICAmYnVmLT50b3RhbCwgc2l6ZW9mKGJ1Zi0+dG90YWwpICkgKQorCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCQlkLT5ncmFudGVkX2NvdW50Kys7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbWdhX2RtYV9idWZmZXJzKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCWRybV9kbWFfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCWRybV9kbWFfdCBkOworCWludCByZXQgPSAwOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggZCwgYXJncCwgc2l6ZW9mKGQpICk7CisKKwkvKiBQbGVhc2UgZG9uJ3Qgc2VuZCB1cyBidWZmZXJzLgorCSAqLworCWlmICggZC5zZW5kX2NvdW50ICE9IDAgKSB7CisJCURSTV9FUlJPUiggIlByb2Nlc3MgJWQgdHJ5aW5nIHRvIHNlbmQgJWQgYnVmZmVycyB2aWEgZHJtRE1BXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGQuc2VuZF9jb3VudCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCS8qIFdlJ2xsIHNlbmQgeW91IGJ1ZmZlcnMuCisJICovCisJaWYgKCBkLnJlcXVlc3RfY291bnQgPCAwIHx8IGQucmVxdWVzdF9jb3VudCA+IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJQcm9jZXNzICVkIHRyeWluZyB0byBnZXQgJWQgYnVmZmVycyAob2YgJWQgbWF4KVxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBkLnJlcXVlc3RfY291bnQsIGRtYS0+YnVmX2NvdW50ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJV1JBUF9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJZC5ncmFudGVkX2NvdW50ID0gMDsKKworCWlmICggZC5yZXF1ZXN0X2NvdW50ICkgeworCQlyZXQgPSBtZ2FfZG1hX2dldF9idWZmZXJzKCBmaWxwLCBkZXYsICZkICk7CisJfQorCisJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCggYXJncCwgZCwgc2l6ZW9mKGQpICk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG1nYV9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpCit7CisJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKK30KKworaW50IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXJldHVybiBtZ2FfZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxZDQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oCkBAIC0wLDAgKzEsMzQ5IEBACisvKiBtZ2FfZHJtLmggLS0gUHVibGljIGhlYWRlciBmb3IgdGhlIE1hdHJveCBnMjAwL2c0MDAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogVHVlIEphbiAyNSAwMTo1MDowMSAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEplZmYgSGFydG1hbm4gPGpoYXJ0bWFubkB2YWxpbnV4LmNvbT4KKyAqICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqCisgKiBSZXdyaXR0ZW4gYnk6CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworI2lmbmRlZiBfX01HQV9EUk1fSF9fCisjZGVmaW5lIF9fTUdBX0RSTV9IX18KKworLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKKyAqIGRlZmluZXMgaW4gdGhlIFhzZXJ2ZXIgZmlsZSAobWdhX3NhcmVhLmgpCisgKi8KKworI2lmbmRlZiBfX01HQV9TQVJFQV9ERUZJTkVTX18KKyNkZWZpbmUgX19NR0FfU0FSRUFfREVGSU5FU19fCisKKy8qIFdBUlAgcGlwZSBmbGFncworICovCisjZGVmaW5lIE1HQV9GCQkJMHgxCQkvKiBmb2cgKi8KKyNkZWZpbmUgTUdBX0EJCQkweDIJCS8qIGFscGhhICovCisjZGVmaW5lIE1HQV9TCQkJMHg0CQkvKiBzcGVjdWxhciAqLworI2RlZmluZSBNR0FfVDIJCQkweDgJCS8qIG11bHRpdGV4dHVyZSAqLworCisjZGVmaW5lIE1HQV9XQVJQX1RHWgkJMAorI2RlZmluZSBNR0FfV0FSUF9UR1pGCQkoTUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1RHWkEJCShNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVEdaQUYJCShNR0FfRnxNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVEdaUwkJKE1HQV9TKQorI2RlZmluZSBNR0FfV0FSUF9UR1pTRgkJKE1HQV9TfE1HQV9GKQorI2RlZmluZSBNR0FfV0FSUF9UR1pTQQkJKE1HQV9TfE1HQV9BKQorI2RlZmluZSBNR0FfV0FSUF9UR1pTQUYJCShNR0FfU3xNR0FfRnxNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWgkJKE1HQV9UMikKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWkYJCShNR0FfVDJ8TUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pBCQkoTUdBX1QyfE1HQV9BKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaQUYJCShNR0FfVDJ8TUdBX0F8TUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pTCQkoTUdBX1QyfE1HQV9TKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaU0YJCShNR0FfVDJ8TUdBX1N8TUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pTQQkJKE1HQV9UMnxNR0FfU3xNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWlNBRgkoTUdBX1QyfE1HQV9TfE1HQV9GfE1HQV9BKQorCisjZGVmaW5lIE1HQV9NQVhfRzIwMF9QSVBFUwk4CQkvKiBubyBtdWx0aXRleCAqLworI2RlZmluZSBNR0FfTUFYX0c0MDBfUElQRVMJMTYKKyNkZWZpbmUgTUdBX01BWF9XQVJQX1BJUEVTCU1HQV9NQVhfRzQwMF9QSVBFUworI2RlZmluZSBNR0FfV0FSUF9VQ09ERV9TSVpFCTMyNzY4CQkvKiBpbiBieXRlcyAqLworCisjZGVmaW5lIE1HQV9DQVJEX1RZUEVfRzIwMAkxCisjZGVmaW5lIE1HQV9DQVJEX1RZUEVfRzQwMAkyCisKKworI2RlZmluZSBNR0FfRlJPTlQJCTB4MQorI2RlZmluZSBNR0FfQkFDSwkJMHgyCisjZGVmaW5lIE1HQV9ERVBUSAkJMHg0CisKKy8qIFdoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCBmb3IgdGhlIGN1cnJlbnQgdmVydGV4IGRtYSBidWZmZXI/CisgKi8KKyNkZWZpbmUgTUdBX1VQTE9BRF9DT05URVhUCTB4MQorI2RlZmluZSBNR0FfVVBMT0FEX1RFWDAJCTB4MgorI2RlZmluZSBNR0FfVVBMT0FEX1RFWDEJCTB4NAorI2RlZmluZSBNR0FfVVBMT0FEX1BJUEUJCTB4OAorI2RlZmluZSBNR0FfVVBMT0FEX1RFWDBJTUFHRQkweDEwIC8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgTUdBX1VQTE9BRF9URVgxSU1BR0UJMHgyMCAvKiBoYW5kbGVkIGNsaWVudC1zaWRlICovCisjZGVmaW5lIE1HQV9VUExPQURfMkQJCTB4NDAKKyNkZWZpbmUgTUdBX1dBSVRfQUdFCQkweDgwIC8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgTUdBX1VQTE9BRF9DTElQUkVDVFMJMHgxMDAgLyogaGFuZGxlZCBjbGllbnQtc2lkZSAqLworI2lmIDAKKyNkZWZpbmUgTUdBX0RNQV9GTFVTSAkJMHgyMDAgLyogc2V0IHdoZW4gc29tZW9uZSBnZXRzIHRoZSBsb2NrCisJCQkJCSBxdWllc2NlbnQgKi8KKyNlbmRpZgorCisvKiAzMiBidWZmZXJzIG9mIDY0ayBlYWNoLCB0b3RhbCAyIG1lZy4KKyAqLworI2RlZmluZSBNR0FfQlVGRkVSX1NJWkUJCSgxIDw8IDE2KQorI2RlZmluZSBNR0FfTlVNX0JVRkZFUlMJCTEyOAorCisvKiBLZWVwIHRoZXNlIHNtYWxsIGZvciB0ZXN0aW5nLgorICovCisjZGVmaW5lIE1HQV9OUl9TQVJFQV9DTElQUkVDVFMJOAorCisvKiAyIGhlYXBzICgxIGZvciBjYXJkLCAxIGZvciBhZ3ApLCBlYWNoIGRpdmlkZWQgaW50byB1cHRvIDEyOAorICogcmVnaW9ucywgc3ViamVjdCB0byBhIG1pbmltdW0gcmVnaW9uIHNpemUgb2YgKDE8PDE2KSA9PSA2NGsuCisgKgorICogQ2xpZW50cyBtYXkgc3ViZGl2aWRlIHJlZ2lvbnMgaW50ZXJuYWxseSwgYnV0IHdoZW4gc2hhcmluZyBiZXR3ZWVuCisgKiBjbGllbnRzLCB0aGUgcmVnaW9uIHNpemUgaXMgdGhlIG1pbmltdW0gZ3JhbnVsYXJpdHkuCisgKi8KKworI2RlZmluZSBNR0FfQ0FSRF9IRUFQCQkJMAorI2RlZmluZSBNR0FfQUdQX0hFQVAJCQkxCisjZGVmaW5lIE1HQV9OUl9URVhfSEVBUFMJCTIKKyNkZWZpbmUgTUdBX05SX1RFWF9SRUdJT05TCQkxNgorI2RlZmluZSBNR0FfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUJMTYKKworI2RlZmluZSAgRFJNX01HQV9JRExFX1JFVFJZICAgICAgICAgIDIwNDgKKworI2VuZGlmIC8qIF9fTUdBX1NBUkVBX0RFRklORVNfXyAqLworCisKKy8qIFNldHVwIHJlZ2lzdGVycyBmb3IgM0QgY29udGV4dAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGRzdG9yZzsKKwl1bnNpZ25lZCBpbnQgbWFjY2VzczsKKwl1bnNpZ25lZCBpbnQgcGxud3Q7CisJdW5zaWduZWQgaW50IGR3Z2N0bDsKKwl1bnNpZ25lZCBpbnQgYWxwaGFjdHJsOworCXVuc2lnbmVkIGludCBmb2djb2xvcjsKKwl1bnNpZ25lZCBpbnQgd2ZsYWc7CisJdW5zaWduZWQgaW50IHRkdWFsc3RhZ2UwOworCXVuc2lnbmVkIGludCB0ZHVhbHN0YWdlMTsKKwl1bnNpZ25lZCBpbnQgZmNvbDsKKwl1bnNpZ25lZCBpbnQgc3RlbmNpbDsKKwl1bnNpZ25lZCBpbnQgc3RlbmNpbGN0bDsKK30gZHJtX21nYV9jb250ZXh0X3JlZ3NfdDsKKworLyogU2V0dXAgcmVnaXN0ZXJzIGZvciAyRCwgWCBzZXJ2ZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBwaXRjaDsKK30gZHJtX21nYV9zZXJ2ZXJfcmVnc190OworCisvKiBTZXR1cCByZWdpc3RlcnMgZm9yIGVhY2ggdGV4dHVyZSB1bml0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgdGV4Y3RsOworCXVuc2lnbmVkIGludCB0ZXhjdGwyOworCXVuc2lnbmVkIGludCB0ZXhmaWx0ZXI7CisJdW5zaWduZWQgaW50IHRleGJvcmRlcmNvbDsKKwl1bnNpZ25lZCBpbnQgdGV4b3JnOworCXVuc2lnbmVkIGludCB0ZXh3aWR0aDsKKwl1bnNpZ25lZCBpbnQgdGV4aGVpZ2h0OworCXVuc2lnbmVkIGludCB0ZXhvcmcxOworCXVuc2lnbmVkIGludCB0ZXhvcmcyOworCXVuc2lnbmVkIGludCB0ZXhvcmczOworCXVuc2lnbmVkIGludCB0ZXhvcmc0OworfSBkcm1fbWdhX3RleHR1cmVfcmVnc190OworCisvKiBHZW5lcmFsIGFnaW5nIG1lY2hhbmlzbQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGhlYWQ7CQkvKiBQb3NpdGlvbiBvZiBoZWFkIHBvaW50ZXIgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgd3JhcDsJCS8qIFByaW1hcnkgRE1BIHdyYXAgY291bnQgICAgICAgICAgICAqLworfSBkcm1fbWdhX2FnZV90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX21nYV9zYXJlYSB7CisJLyogVGhlIGNoYW5uZWwgZm9yIGNvbW11bmljYXRpb24gb2Ygc3RhdGUgaW5mb3JtYXRpb24gdG8gdGhlIGtlcm5lbAorCSAqIG9uIGZpcmluZyBhIHZlcnRleCBkbWEgYnVmZmVyLgorCSAqLworICAgCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgY29udGV4dF9zdGF0ZTsKKyAgIAlkcm1fbWdhX3NlcnZlcl9yZWdzX3Qgc2VydmVyX3N0YXRlOworICAgCWRybV9tZ2FfdGV4dHVyZV9yZWdzX3QgdGV4X3N0YXRlWzJdOworICAgCXVuc2lnbmVkIGludCB3YXJwX3BpcGU7CisgICAJdW5zaWduZWQgaW50IGRpcnR5OworICAgCXVuc2lnbmVkIGludCB2ZXJ0c2l6ZTsKKworCS8qIFRoZSBjdXJyZW50IGNsaXByZWN0cywgb3IgYSBzdWJzZXQgdGhlcmVvZi4KKwkgKi8KKyAgIAlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbTUdBX05SX1NBUkVBX0NMSVBSRUNUU107CisgICAJdW5zaWduZWQgaW50IG5ib3g7CisKKwkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9zdCByZWNlbnRseSB1c2VkIDNkIGRyYXdhYmxlLiAgVGhlCisJICogY2xpZW50IGZpbGxzIGluIHRoZSByZXFfKiBmaWVsZHMsIHRoZSBzZXJ2ZXIgZmlsbHMgaW4gdGhlCisJICogZXhwb3J0ZWRfIGZpZWxkcyBhbmQgcHV0cyB0aGUgY2xpcHJlY3RzIGludG8gYm94ZXMsIGFib3ZlLgorCSAqCisJICogVGhlIGNsaWVudCBjbGVhcnMgdGhlIGV4cG9ydGVkX2RyYXdhYmxlIGZpZWxkIGJlZm9yZQorCSAqIGNsb2JiZXJpbmcgdGhlIGJveGVzIGRhdGEuCisJICovCisgICAgICAgIHVuc2lnbmVkIGludCByZXFfZHJhd2FibGU7CSAvKiB0aGUgWCBkcmF3YWJsZSBpZCAqLworCXVuc2lnbmVkIGludCByZXFfZHJhd19idWZmZXI7CSAvKiBNR0FfRlJPTlQgb3IgTUdBX0JBQ0sgKi8KKworICAgICAgICB1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfZHJhd2FibGU7CisJdW5zaWduZWQgaW50IGV4cG9ydGVkX2luZGV4OworICAgICAgICB1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfc3RhbXA7CisgICAgICAgIHVuc2lnbmVkIGludCBleHBvcnRlZF9idWZmZXJzOworICAgICAgICB1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfbmZyb250OworICAgICAgICB1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfbmJhY2s7CisJaW50IGV4cG9ydGVkX2JhY2tfeCwgZXhwb3J0ZWRfZnJvbnRfeCwgZXhwb3J0ZWRfdzsKKwlpbnQgZXhwb3J0ZWRfYmFja195LCBleHBvcnRlZF9mcm9udF95LCBleHBvcnRlZF9oOworICAgCWRybV9jbGlwX3JlY3RfdCBleHBvcnRlZF9ib3hlc1tNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKworCS8qIENvdW50ZXJzIGZvciBhZ2luZyB0ZXh0dXJlcyBhbmQgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcuCisJICovCisJdW5zaWduZWQgaW50IHN0YXR1c1s0XTsKKwl1bnNpZ25lZCBpbnQgbGFzdF93cmFwOworCisJZHJtX21nYV9hZ2VfdCBsYXN0X2ZyYW1lOworICAgICAgICB1bnNpZ25lZCBpbnQgbGFzdF9lbnF1ZXVlOwkvKiBsYXN0IHRpbWUgYSBidWZmZXIgd2FzIGVucXVldWVkICovCisJdW5zaWduZWQgaW50IGxhc3RfZGlzcGF0Y2g7CS8qIGFnZSBvZiB0aGUgbW9zdCByZWNlbnRseSBkaXNwYXRjaGVkIGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBsYXN0X3F1aWVzY2VudDsgICAgIC8qICAqLworCisJLyogTFJVIGxpc3RzIGZvciB0ZXh0dXJlIG1lbW9yeSBpbiBhZ3Agc3BhY2UgYW5kIG9uIHRoZSBjYXJkLgorCSAqLworCWRybV90ZXhfcmVnaW9uX3QgdGV4TGlzdFtNR0FfTlJfVEVYX0hFQVBTXVtNR0FfTlJfVEVYX1JFR0lPTlMrMV07CisJdW5zaWduZWQgaW50IHRleEFnZVtNR0FfTlJfVEVYX0hFQVBTXTsKKworCS8qIE1lY2hhbmlzbSB0byB2YWxpZGF0ZSBjYXJkIHN0YXRlLgorCSAqLworICAgCWludCBjdHhPd25lcjsKK30gZHJtX21nYV9zYXJlYV90OworCisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYc2VydmVyIGZpbGUgKHhmODZkcm1NZ2EuaCkKKyAqLworCisvKiBNR0Egc3BlY2lmaWMgaW9jdGxzCisgKiBUaGUgZGV2aWNlIHNwZWNpZmljIGlvY3RsIHJhbmdlIGlzIDB4NDAgdG8gMHg3OS4KKyAqLworI2RlZmluZSBEUk1fTUdBX0lOSVQgICAgIDB4MDAKKyNkZWZpbmUgRFJNX01HQV9GTFVTSCAgICAweDAxCisjZGVmaW5lIERSTV9NR0FfUkVTRVQgICAgMHgwMgorI2RlZmluZSBEUk1fTUdBX1NXQVAgICAgIDB4MDMKKyNkZWZpbmUgRFJNX01HQV9DTEVBUiAgICAweDA0CisjZGVmaW5lIERSTV9NR0FfVkVSVEVYICAgMHgwNQorI2RlZmluZSBEUk1fTUdBX0lORElDRVMgIDB4MDYKKyNkZWZpbmUgRFJNX01HQV9JTE9BRCAgICAweDA3CisjZGVmaW5lIERSTV9NR0FfQkxJVCAgICAgMHgwOAorI2RlZmluZSBEUk1fTUdBX0dFVFBBUkFNIDB4MDkKKworI2RlZmluZSBEUk1fSU9DVExfTUdBX0lOSVQgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0lOSVQsIGRybV9tZ2FfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX0ZMVVNIICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0ZMVVNILCBkcm1fbG9ja190KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX1JFU0VUICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX1JFU0VUKQorI2RlZmluZSBEUk1fSU9DVExfTUdBX1NXQVAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX1NXQVApCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfQ0xFQVIgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfQ0xFQVIsIGRybV9tZ2FfY2xlYXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9WRVJURVggICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9WRVJURVgsIGRybV9tZ2FfdmVydGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfSU5ESUNFUyAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfSU5ESUNFUywgZHJtX21nYV9pbmRpY2VzX3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfSUxPQUQgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfSUxPQUQsIGRybV9tZ2FfaWxvYWRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9CTElUICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9CTElULCBkcm1fbWdhX2JsaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9HRVRQQVJBTSBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9HRVRQQVJBTSwgZHJtX21nYV9nZXRwYXJhbV90KQorCit0eXBlZGVmIHN0cnVjdCBfZHJtX21nYV93YXJwX2luZGV4IHsKKyAgIAlpbnQgaW5zdGFsbGVkOworICAgCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyOworICAgCWludCBzaXplOworfSBkcm1fbWdhX3dhcnBfaW5kZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9pbml0IHsKKyAgIAllbnVtIHsKKwkgICAJTUdBX0lOSVRfRE1BICAgID0gMHgwMSwKKwkgICAgICAgCU1HQV9DTEVBTlVQX0RNQSA9IDB4MDIKKwl9IGZ1bmM7CisKKyAgIAl1bnNpZ25lZCBsb25nIHNhcmVhX3ByaXZfb2Zmc2V0OworCisJaW50IGNoaXBzZXQ7CisgICAJaW50IHNncmFtOworCisJdW5zaWduZWQgaW50IG1hY2Nlc3M7CisKKyAgIAl1bnNpZ25lZCBpbnQgZmJfY3BwOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQsIGZyb250X3BpdGNoOworICAgCXVuc2lnbmVkIGludCBiYWNrX29mZnNldCwgYmFja19waXRjaDsKKworICAgCXVuc2lnbmVkIGludCBkZXB0aF9jcHA7CisgICAJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldCwgZGVwdGhfcGl0Y2g7CisKKyAgIAl1bnNpZ25lZCBpbnQgdGV4dHVyZV9vZmZzZXRbTUdBX05SX1RFWF9IRUFQU107CisgICAJdW5zaWduZWQgaW50IHRleHR1cmVfc2l6ZVtNR0FfTlJfVEVYX0hFQVBTXTsKKworCXVuc2lnbmVkIGxvbmcgZmJfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBzdGF0dXNfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgd2FycF9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBwcmltYXJ5X29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnNfb2Zmc2V0OworfSBkcm1fbWdhX2luaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9mdWxsc2NyZWVuIHsKKwllbnVtIHsKKwkJTUdBX0lOSVRfRlVMTFNDUkVFTiAgICA9IDB4MDEsCisJCU1HQV9DTEVBTlVQX0ZVTExTQ1JFRU4gPSAweDAyCisJfSBmdW5jOworfSBkcm1fbWdhX2Z1bGxzY3JlZW5fdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9jbGVhciB7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBjbGVhcl9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfZGVwdGg7CisJdW5zaWduZWQgaW50IGNvbG9yX21hc2s7CisJdW5zaWduZWQgaW50IGRlcHRoX21hc2s7Cit9IGRybV9tZ2FfY2xlYXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV92ZXJ0ZXggeworICAgCWludCBpZHg7CQkJLyogYnVmZmVyIHRvIHF1ZXVlICovCisJaW50IHVzZWQ7CQkJLyogYnl0ZXMgaW4gdXNlICovCisJaW50IGRpc2NhcmQ7CQkJLyogY2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAgKi8KK30gZHJtX21nYV92ZXJ0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9pbmRpY2VzIHsKKyAgIAlpbnQgaWR4OwkJCS8qIGJ1ZmZlciB0byBxdWV1ZSAqLworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgZW5kOworCWludCBkaXNjYXJkOwkJCS8qIGNsaWVudCBmaW5pc2hlZCB3aXRoIGJ1ZmZlcj8gICovCit9IGRybV9tZ2FfaW5kaWNlc190OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2lsb2FkIHsKKwlpbnQgaWR4OworCXVuc2lnbmVkIGludCBkc3Rvcmc7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKK30gZHJtX21nYV9pbG9hZF90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX21nYV9ibGl0IHsKKwl1bnNpZ25lZCBpbnQgcGxhbmVtYXNrOworCXVuc2lnbmVkIGludCBzcmNvcmc7CisJdW5zaWduZWQgaW50IGRzdG9yZzsKKwlpbnQgc3JjX3BpdGNoLCBkc3RfcGl0Y2g7CisJaW50IGRlbHRhX3N4LCBkZWx0YV9zeTsKKwlpbnQgZGVsdGFfZHgsIGRlbHRhX2R5OworCWludCBoZWlnaHQsIHlkaXI7CQkvKiBmbGlwIGltYWdlIHZlcnRpY2FsbHkgKi8KKwlpbnQgc291cmNlX3BpdGNoLCBkZXN0X3BpdGNoOworfSBkcm1fbWdhX2JsaXRfdDsKKworLyogMy4xOiBBbiBpb2N0bCB0byBnZXQgcGFyYW1ldGVycyB0aGF0IGFyZW4ndCBhdmFpbGFibGUgdG8gdGhlIDNkCisgKiBjbGllbnQgYW55IG90aGVyIHdheS4gIAorICovCisjZGVmaW5lIE1HQV9QQVJBTV9JUlFfTlIgICAgICAgICAgICAxCisKK3R5cGVkZWYgc3RydWN0IGRybV9tZ2FfZ2V0cGFyYW0geworCWludCBwYXJhbTsKKwl2b2lkIF9fdXNlciAqdmFsdWU7Cit9IGRybV9tZ2FfZ2V0cGFyYW1fdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZGFiM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYwpAQCAtMCwwICsxLDEyNyBAQAorLyogbWdhX2Rydi5jIC0tIE1hdHJveCBHMjAwL0c0MDAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwMTo1NjoyMiAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibWdhX2RybS5oIgorI2luY2x1ZGUgIm1nYV9kcnYuaCIKKworICAKKyNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCisKK3N0YXRpYyBpbnQgcG9zdGluaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKQoreworCWRldi0+Y291bnRlcnMgKz0gMzsKKwlkZXYtPnR5cGVzWzZdID0gX0RSTV9TVEFUX0lSUTsKKwlkZXYtPnR5cGVzWzddID0gX0RSTV9TVEFUX1BSSU1BUlk7CisJZGV2LT50eXBlc1s4XSA9IF9EUk1fU1RBVF9TRUNPTkRBUlk7CisKKwlEUk1fSU5GTyggIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKKwkJRFJJVkVSX05BTUUsCisJCURSSVZFUl9NQUpPUiwKKwkJRFJJVkVSX01JTk9SLAorCQlEUklWRVJfUEFUQ0hMRVZFTCwKKwkJRFJJVkVSX0RBVEUsCisJCWRldi0+cHJpbWFyeS5taW5vciwKKwkJcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKKwkJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJzaW9uKCBkcm1fdmVyc2lvbl90ICp2ZXJzaW9uICkKK3sKKwlpbnQgbGVuOworCisJdmVyc2lvbi0+dmVyc2lvbl9tYWpvciA9IERSSVZFUl9NQUpPUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID0gRFJJVkVSX01JTk9SOworCXZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMOworCURSTV9DT1BZKCB2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kYXRlLCBEUklWRVJfREFURSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CisJbWdhX1BDSV9JRFMKK307CisKK2V4dGVybiBkcm1faW9jdGxfZGVzY190IG1nYV9pb2N0bHNbXTsKK2V4dGVybiBpbnQgbWdhX21heF9pb2N0bDsKKworc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKKwkuZHJpdmVyX2ZlYXR1cmVzID0gRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfUkVRVUlSRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfCBEUklWRVJfSEFWRV9ETUEgfCBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfSVJRX1NIQVJFRCB8IERSSVZFUl9JUlFfVkJMLAorCS5wcmV0YWtlZG93biA9IG1nYV9kcml2ZXJfcHJldGFrZWRvd24sCisJLmRtYV9xdWllc2NlbnQgPSBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQsCisJLnZibGFua193YWl0ID0gbWdhX2RyaXZlcl92Ymxhbmtfd2FpdCwKKwkuaXJxX3ByZWluc3RhbGwgPSBtZ2FfZHJpdmVyX2lycV9wcmVpbnN0YWxsLAorCS5pcnFfcG9zdGluc3RhbGwgPSBtZ2FfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCwKKwkuaXJxX3VuaW5zdGFsbCA9IG1nYV9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKKwkuaXJxX2hhbmRsZXIgPSBtZ2FfZHJpdmVyX2lycV9oYW5kbGVyLAorCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCisJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCisJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCisJLnBvc3Rpbml0ID0gcG9zdGluaXQsCisJLnZlcnNpb24gPSB2ZXJzaW9uLAorCS5pb2N0bHMgPSBtZ2FfaW9jdGxzLAorCS5kbWFfaW9jdGwgPSBtZ2FfZG1hX2J1ZmZlcnMsCisJLmZvcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub3BlbiA9IGRybV9vcGVuLAorCQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCQkuaW9jdGwgPSBkcm1faW9jdGwsCisJCS5tbWFwID0gZHJtX21tYXAsCisJCS5wb2xsID0gZHJtX3BvbGwsCisJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorCX0sCisJLnBjaV9kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisJCS5pZF90YWJsZSA9IHBjaWlkbGlzdCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBtZ2FfaW5pdCh2b2lkKQoreworCWRyaXZlci5udW1faW9jdGxzID0gbWdhX21heF9pb2N0bDsKKwlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZ2FfZXhpdCh2b2lkKQoreworCWRybV9leGl0KCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtZ2FfaW5pdCk7Cittb2R1bGVfZXhpdChtZ2FfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODRhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaApAQCAtMCwwICsxLDYzOCBAQAorLyogbWdhX2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciB0aGUgTWF0cm94IEcyMDAvRzQwMCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gRGVjIDEzIDAxOjUwOjAxIDE5OTkgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpZm5kZWYgX19NR0FfRFJWX0hfXworI2RlZmluZSBfX01HQV9EUlZfSF9fCisKKy8qIEdlbmVyYWwgY3VzdG9taXphdGlvbjoKKyAqLworCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJHYXJldGggSHVnaGVzLCBWQSBMaW51eCBTeXN0ZW1zIEluYy4iCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJtZ2EiCisjZGVmaW5lIERSSVZFUl9ERVNDCQkiTWF0cm94IEcyMDAvRzQwMCIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDAyMTAyOSIKKworI2RlZmluZSBEUklWRVJfTUFKT1IJCTMKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQkxCisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTAKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9wcmltYXJ5X2J1ZmZlciB7CisJdTggKnN0YXJ0OworCXU4ICplbmQ7CisJaW50IHNpemU7CisKKwl1MzIgdGFpbDsKKwlpbnQgc3BhY2U7CisJdm9sYXRpbGUgbG9uZyB3cmFwcGVkOworCisJdm9sYXRpbGUgdTMyICpzdGF0dXM7CisKKwl1MzIgbGFzdF9mbHVzaDsKKwl1MzIgbGFzdF93cmFwOworCisJdTMyIGhpZ2hfbWFyazsKK30gZHJtX21nYV9wcmltYXJ5X2J1ZmZlcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2ZyZWVsaXN0IHsKKyAgIAlzdHJ1Y3QgZHJtX21nYV9mcmVlbGlzdCAqbmV4dDsKKyAgIAlzdHJ1Y3QgZHJtX21nYV9mcmVlbGlzdCAqcHJldjsKKwlkcm1fbWdhX2FnZV90IGFnZTsKKyAgIAlkcm1fYnVmX3QgKmJ1ZjsKK30gZHJtX21nYV9mcmVlbGlzdF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAJZHJtX21nYV9mcmVlbGlzdF90ICpsaXN0X2VudHJ5OworCWludCBkaXNjYXJkOworCWludCBkaXNwYXRjaGVkOworfSBkcm1fbWdhX2J1Zl9wcml2X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9tZ2FfcHJpdmF0ZSB7CisJZHJtX21nYV9wcmltYXJ5X2J1ZmZlcl90IHByaW07CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2OworCisgICAJZHJtX21nYV9mcmVlbGlzdF90ICpoZWFkOworICAgCWRybV9tZ2FfZnJlZWxpc3RfdCAqdGFpbDsKKworCXVuc2lnbmVkIGludCB3YXJwX3BpcGU7CisJdW5zaWduZWQgbG9uZyB3YXJwX3BpcGVfcGh5c1tNR0FfTUFYX1dBUlBfUElQRVNdOworCisJaW50IGNoaXBzZXQ7CisJaW50IHVzZWNfdGltZW91dDsKKworCXUzMiBjbGVhcl9jbWQ7CisJdTMyIG1hY2Nlc3M7CisKKwl1bnNpZ25lZCBpbnQgZmJfY3BwOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19waXRjaDsKKworCXVuc2lnbmVkIGludCBkZXB0aF9jcHA7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfcGl0Y2g7CisKKwl1bnNpZ25lZCBpbnQgdGV4dHVyZV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHRleHR1cmVfc2l6ZTsKKworCWRybV9sb2NhbF9tYXBfdCAqc2FyZWE7CisJZHJtX2xvY2FsX21hcF90ICptbWlvOworCWRybV9sb2NhbF9tYXBfdCAqc3RhdHVzOworCWRybV9sb2NhbF9tYXBfdCAqd2FycDsKKwlkcm1fbG9jYWxfbWFwX3QgKnByaW1hcnk7CisJZHJtX2xvY2FsX21hcF90ICpidWZmZXJzOworCWRybV9sb2NhbF9tYXBfdCAqYWdwX3RleHR1cmVzOworfSBkcm1fbWdhX3ByaXZhdGVfdDsKKworCQkJCS8qIG1nYV9kbWEuYyAqLworZXh0ZXJuIGludCBtZ2FfZG1hX2luaXQoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IG1nYV9kbWFfZmx1c2goIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IG1nYV9kbWFfcmVzZXQoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IG1nYV9kbWFfYnVmZmVycyggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiB2b2lkIG1nYV9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICpkZXYpOworCitleHRlcm4gaW50IG1nYV9kb193YWl0X2Zvcl9pZGxlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKTsKKworZXh0ZXJuIHZvaWQgbWdhX2RvX2RtYV9mbHVzaCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICk7CitleHRlcm4gdm9pZCBtZ2FfZG9fZG1hX3dyYXBfc3RhcnQoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApOworZXh0ZXJuIHZvaWQgbWdhX2RvX2RtYV93cmFwX2VuZCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICk7CisKK2V4dGVybiBpbnQgbWdhX2ZyZWVsaXN0X3B1dCggZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfdCAqYnVmICk7CisKKwkJCQkvKiBtZ2Ffd2FycC5jICovCitleHRlcm4gaW50IG1nYV93YXJwX2luc3RhbGxfbWljcm9jb2RlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKTsKK2V4dGVybiBpbnQgbWdhX3dhcnBfaW5pdCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICk7CisKK2V4dGVybiBpbnQgbWdhX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaXJxcmV0dXJuX3QgbWdhX2RyaXZlcl9pcnFfaGFuZGxlciggRFJNX0lSUV9BUkdTICk7CitleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV9wcmVpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CisKKyNkZWZpbmUgbWdhX2ZsdXNoX3dyaXRlX2NvbWJpbmUoKQlEUk1fV1JJVEVNRU1PUllCQVJSSUVSKCkKKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9fYWxwaGFfXykKKyNkZWZpbmUgTUdBX0JBU0UoIHJlZyApCQkoKHVuc2lnbmVkIGxvbmcpKGRldl9wcml2LT5tbWlvLT5oYW5kbGUpKQorI2RlZmluZSBNR0FfQUREUiggcmVnICkJCShNR0FfQkFTRShyZWcpICsgcmVnKQorCisjZGVmaW5lIE1HQV9ERVJFRiggcmVnICkJKih2b2xhdGlsZSB1MzIgKilNR0FfQUREUiggcmVnICkKKyNkZWZpbmUgTUdBX0RFUkVGOCggcmVnICkJKih2b2xhdGlsZSB1OCAqKU1HQV9BRERSKCByZWcgKQorCisjZGVmaW5lIE1HQV9SRUFEKCByZWcgKQkJKF9NR0FfUkVBRCgodTMyICopTUdBX0FERFIocmVnKSkpCisjZGVmaW5lIE1HQV9SRUFEOCggcmVnICkJKF9NR0FfUkVBRCgodTggKilNR0FfQUREUihyZWcpKSkKKyNkZWZpbmUgTUdBX1dSSVRFKCByZWcsIHZhbCApCWRvIHsgRFJNX1dSSVRFTUVNT1JZQkFSUklFUigpOyBNR0FfREVSRUYoIHJlZyApID0gdmFsOyB9IHdoaWxlICgwKQorI2RlZmluZSBNR0FfV1JJVEU4KCByZWcsIHZhbCApICBkbyB7IERSTV9XUklURU1FTU9SWUJBUlJJRVIoKTsgTUdBX0RFUkVGOCggcmVnICkgPSB2YWw7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgdTMyIF9NR0FfUkVBRCh1MzIgKmFkZHIpCit7CisJRFJNX01FTU9SWUJBUlJJRVIoKTsKKwlyZXR1cm4gKih2b2xhdGlsZSB1MzIgKilhZGRyOworfQorI2Vsc2UKKyNkZWZpbmUgTUdBX1JFQUQ4KCByZWcgKQlEUk1fUkVBRDgoZGV2X3ByaXYtPm1taW8sIChyZWcpKQorI2RlZmluZSBNR0FfUkVBRCggcmVnICkJCURSTV9SRUFEMzIoZGV2X3ByaXYtPm1taW8sIChyZWcpKQorI2RlZmluZSBNR0FfV1JJVEU4KCByZWcsIHZhbCApICBEUk1fV1JJVEU4KGRldl9wcml2LT5tbWlvLCAocmVnKSwgKHZhbCkpCisjZGVmaW5lIE1HQV9XUklURSggcmVnLCB2YWwgKQlEUk1fV1JJVEUzMihkZXZfcHJpdi0+bW1pbywgKHJlZyksICh2YWwpKQorI2VuZGlmCisKKyNkZWZpbmUgRFdHUkVHMCAJMHgxYzAwCisjZGVmaW5lIERXR1JFRzBfRU5EIAkweDFkZmYKKyNkZWZpbmUgRFdHUkVHMQkJMHgyYzAwCisjZGVmaW5lIERXR1JFRzFfRU5ECTB4MmRmZgorCisjZGVmaW5lIElTUkVHMChyKQkociA+PSBEV0dSRUcwICYmIHIgPD0gRFdHUkVHMF9FTkQpCisjZGVmaW5lIERNQVJFRzAocikJKHU4KSgociAtIERXR1JFRzApID4+IDIpCisjZGVmaW5lIERNQVJFRzEocikJKHU4KSgoKHIgLSBEV0dSRUcxKSA+PiAyKSB8IDB4ODApCisjZGVmaW5lIERNQVJFRyhyKQkoSVNSRUcwKHIpID8gRE1BUkVHMChyKSA6IERNQVJFRzEocikpCisKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBIZWxwZXIgbWFjcm9zcy4uLgorICovCisKKyNkZWZpbmUgTUdBX0VNSVRfU1RBVEUoIGRldl9wcml2LCBkaXJ0eSApCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKCAoZGlydHkpICYgfk1HQV9VUExPQURfQ0xJUFJFQ1RTICkgewkJCVwKKwkJaWYgKCBkZXZfcHJpdi0+Y2hpcHNldCA9PSBNR0FfQ0FSRF9UWVBFX0c0MDAgKSB7CVwKKwkJCW1nYV9nNDAwX2VtaXRfc3RhdGUoIGRldl9wcml2ICk7CQlcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJbWdhX2cyMDBfZW1pdF9zdGF0ZSggZGV2X3ByaXYgKTsJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUkFQX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIHRlc3RfYml0KCAwLCAmZGV2X3ByaXYtPnByaW0ud3JhcHBlZCApICkgewkJCVwKKwkJaWYgKCBtZ2FfaXNfaWRsZSggZGV2X3ByaXYgKSApIHsJCQlcCisJCQltZ2FfZG9fZG1hX3dyYXBfZW5kKCBkZXZfcHJpdiApOwkJXAorCQl9IGVsc2UgaWYgKCBkZXZfcHJpdi0+cHJpbS5zcGFjZSA8CQkJXAorCQkJICAgIGRldl9wcml2LT5wcmltLmhpZ2hfbWFyayApIHsJCVwKKwkJCWlmICggTUdBX0RNQV9ERUJVRyApCQkJCVwKKwkJCQlEUk1fSU5GTyggIiVzOiB3cmFwLi4uXG4iLCBfX0ZVTkNUSU9OX18gKTsJXAorCQkJcmV0dXJuIERSTV9FUlIoRUJVU1kpOwkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUkFQX1dBSVRfV0lUSF9SRVRVUk4oIGRldl9wcml2ICkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIHRlc3RfYml0KCAwLCAmZGV2X3ByaXYtPnByaW0ud3JhcHBlZCApICkgewkJCVwKKwkJaWYgKCBtZ2FfZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKSA8IDAgKSB7CQlcCisJCQlpZiAoIE1HQV9ETUFfREVCVUcgKQkJCQlcCisJCQkJRFJNX0lORk8oICIlczogd3JhcC4uLlxuIiwgX19GVU5DVElPTl9fICk7CVwKKwkJCXJldHVybiBEUk1fRVJSKEVCVVNZKTsJCQlcCisJCX0JCQkJCQkJXAorCQltZ2FfZG9fZG1hX3dyYXBfZW5kKCBkZXZfcHJpdiApOwkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByaW1hcnkgRE1BIGNvbW1hbmQgc3RyZWFtCisgKi8KKworI2RlZmluZSBNR0FfVkVSQk9TRQkwCisKKyNkZWZpbmUgRE1BX0xPQ0FMUwl1bnNpZ25lZCBpbnQgd3JpdGU7IHZvbGF0aWxlIHU4ICpwcmltOworCisjZGVmaW5lIERNQV9CTE9DS19TSVpFCSg1ICogc2l6ZW9mKHUzMikpCisKKyNkZWZpbmUgQkVHSU5fRE1BKCBuICkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIE1HQV9WRVJCT1NFICkgewkJCQkJCVwKKwkJRFJNX0lORk8oICJCRUdJTl9ETUEoICVkICkgaW4gJXNcbiIsCQkJXAorCQkJICAobiksIF9fRlVOQ1RJT05fXyApOwkJCQlcCisJCURSTV9JTkZPKCAiICAgc3BhY2U9MHgleCByZXE9MHglWnhcbiIsCQkJXAorCQkJICBkZXZfcHJpdi0+cHJpbS5zcGFjZSwgKG4pICogRE1BX0JMT0NLX1NJWkUgKTsJXAorCX0JCQkJCQkJCVwKKwlwcmltID0gZGV2X3ByaXYtPnByaW0uc3RhcnQ7CQkJCQlcCisJd3JpdGUgPSBkZXZfcHJpdi0+cHJpbS50YWlsOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBCRUdJTl9ETUFfV1JBUCgpCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIE1HQV9WRVJCT1NFICkgewkJCQkJCVwKKwkJRFJNX0lORk8oICJCRUdJTl9ETUEoKSBpbiAlc1xuIiwgX19GVU5DVElPTl9fICk7CQlcCisJCURSTV9JTkZPKCAiICAgc3BhY2U9MHgleFxuIiwgZGV2X3ByaXYtPnByaW0uc3BhY2UgKTsJXAorCX0JCQkJCQkJCVwKKwlwcmltID0gZGV2X3ByaXYtPnByaW0uc3RhcnQ7CQkJCQlcCisJd3JpdGUgPSBkZXZfcHJpdi0+cHJpbS50YWlsOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBRFZBTkNFX0RNQSgpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJZGV2X3ByaXYtPnByaW0udGFpbCA9IHdyaXRlOwkJCQkJXAorCWlmICggTUdBX1ZFUkJPU0UgKSB7CQkJCQkJXAorCQlEUk1fSU5GTyggIkFEVkFOQ0VfRE1BKCkgdGFpbD0weCUwNXggc3A9MHgleFxuIiwJXAorCQkJICB3cml0ZSwgZGV2X3ByaXYtPnByaW0uc3BhY2UgKTsJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEZMVVNIX0RNQSgpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKCAwICkgewkJCQkJCQlcCisJCURSTV9JTkZPKCAiJXM6XG4iLCBfX0ZVTkNUSU9OX18gKTsJCQkJXAorCQlEUk1fSU5GTyggIiAgIHRhaWw9MHglMDZ4IGhlYWQ9MHglMDZseFxuIiwJCVwKKwkJCSAgZGV2X3ByaXYtPnByaW0udGFpbCwJCQkJXAorCQkJICBNR0FfUkVBRCggTUdBX1BSSU1BRERSRVNTICkgLQkJCVwKKwkJCSAgZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCApOwkJCVwKKwl9CQkJCQkJCQlcCisJaWYgKCAhdGVzdF9iaXQoIDAsICZkZXZfcHJpdi0+cHJpbS53cmFwcGVkICkgKSB7CQlcCisJCWlmICggZGV2X3ByaXYtPnByaW0uc3BhY2UgPAkJCQlcCisJCSAgICAgZGV2X3ByaXYtPnByaW0uaGlnaF9tYXJrICkgewkJCVwKKwkJCW1nYV9kb19kbWFfd3JhcF9zdGFydCggZGV2X3ByaXYgKTsJCVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQltZ2FfZG9fZG1hX2ZsdXNoKCBkZXZfcHJpdiApOwkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogTmV2ZXIgdXNlIHRoaXMsIGFsd2F5cyB1c2UgRE1BX0JMT0NLKC4uLikgZm9yIHByaW1hcnkgRE1BIG91dHB1dC4KKyAqLworI2RlZmluZSBETUFfV1JJVEUoIG9mZnNldCwgdmFsICkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKCBNR0FfVkVSQk9TRSApIHsJCQkJCQlcCisJCURSTV9JTkZPKCAiICAgRE1BX1dSSVRFKCAweCUwOHggKSBhdCAweCUwNFp4XG4iLAlcCisJCQkgICh1MzIpKHZhbCksIHdyaXRlICsgKG9mZnNldCkgKiBzaXplb2YodTMyKSApOwlcCisJfQkJCQkJCQkJXAorCSoodm9sYXRpbGUgdTMyICopKHByaW0gKyB3cml0ZSArIChvZmZzZXQpICogc2l6ZW9mKHUzMikpID0gdmFsOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERNQV9CTE9DSyggcmVnMCwgdmFsMCwgcmVnMSwgdmFsMSwgcmVnMiwgdmFsMiwgcmVnMywgdmFsMyApCVwKK2RvIHsJCQkJCQkJCQlcCisJRE1BX1dSSVRFKCAwLCAoKERNQVJFRyggcmVnMCApIDw8IDApIHwJCQkJXAorCQkgICAgICAgKERNQVJFRyggcmVnMSApIDw8IDgpIHwJCQkJXAorCQkgICAgICAgKERNQVJFRyggcmVnMiApIDw8IDE2KSB8CQkJCVwKKwkJICAgICAgIChETUFSRUcoIHJlZzMgKSA8PCAyNCkpICk7CQkJXAorCURNQV9XUklURSggMSwgdmFsMCApOwkJCQkJCVwKKwlETUFfV1JJVEUoIDIsIHZhbDEgKTsJCQkJCQlcCisJRE1BX1dSSVRFKCAzLCB2YWwyICk7CQkJCQkJXAorCURNQV9XUklURSggNCwgdmFsMyApOwkJCQkJCVwKKwl3cml0ZSArPSBETUFfQkxPQ0tfU0laRTsJCQkJCVwKK30gd2hpbGUgKDApCisKKworLyogQnVmZmVyIGFnaW5nIHZpYSBwcmltYXJ5IERNQSBzdHJlYW0gaGVhZCBwb2ludGVyLgorICovCisKKyNkZWZpbmUgU0VUX0FHRSggYWdlLCBoLCB3ICkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCShhZ2UpLT5oZWFkID0gaDsJCQkJCQlcCisJKGFnZSktPndyYXAgPSB3OwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVEVTVF9BR0UoIGFnZSwgaCwgdyApCQkoIChhZ2UpLT53cmFwIDwgdyB8fAkJXAorCQkJCQkgICggKGFnZSktPndyYXAgPT0gdyAmJgkJXAorCQkJCQkgICAgKGFnZSktPmhlYWQgPCBoICkgKQorCisjZGVmaW5lIEFHRV9CVUZGRVIoIGJ1Zl9wcml2ICkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWRybV9tZ2FfZnJlZWxpc3RfdCAqZW50cnkgPSAoYnVmX3ByaXYpLT5saXN0X2VudHJ5OwkJXAorCWlmICggKGJ1Zl9wcml2KS0+ZGlzcGF0Y2hlZCApIHsJCQkJCVwKKwkJZW50cnktPmFnZS5oZWFkID0gKGRldl9wcml2LT5wcmltLnRhaWwgKwkJXAorCQkJCSAgIGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQpOwkJXAorCQllbnRyeS0+YWdlLndyYXAgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF93cmFwOwlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQllbnRyeS0+YWdlLmhlYWQgPSAwOwkJCQkJXAorCQllbnRyeS0+YWdlLndyYXAgPSAwOwkJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKworI2RlZmluZSBNR0FfRU5HSU5FX0lETEVfTUFTSwkJKE1HQV9TT0ZUUkFQRU4gfAkJXAorCQkJCQkgTUdBX0RXR0VOR1NUUyB8CQlcCisJCQkJCSBNR0FfRU5EUFJETUFTVFMpCisjZGVmaW5lIE1HQV9ETUFfSURMRV9NQVNLCQkoTUdBX1NPRlRSQVBFTiB8CQlcCisJCQkJCSBNR0FfRU5EUFJETUFTVFMpCisKKyNkZWZpbmUgTUdBX0RNQV9ERUJVRwkJCTAKKworCisKKy8qIEEgcmVkdWNlZCBzZXQgb2YgdGhlIG1nYSByZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgTUdBX0NSVENfSU5ERVgJCQkweDFmZDQKKyNkZWZpbmUgTUdBX0NSVENfREFUQQkJCTB4MWZkNQorCisvKiBDUlRDMTEgKi8KKyNkZWZpbmUgTUdBX1ZJTlRDTFIJCQkoMSA8PCA0KQorI2RlZmluZSBNR0FfVklOVEVOCQkJKDEgPDwgNSkKKworI2RlZmluZSBNR0FfQUxQSEFDVFJMIAkJCTB4MmM3YworI2RlZmluZSBNR0FfQVIwIAkJCTB4MWM2MAorI2RlZmluZSBNR0FfQVIxIAkJCTB4MWM2NAorI2RlZmluZSBNR0FfQVIyIAkJCTB4MWM2OAorI2RlZmluZSBNR0FfQVIzIAkJCTB4MWM2YworI2RlZmluZSBNR0FfQVI0IAkJCTB4MWM3MAorI2RlZmluZSBNR0FfQVI1IAkJCTB4MWM3NAorI2RlZmluZSBNR0FfQVI2IAkJCTB4MWM3OAorCisjZGVmaW5lIE1HQV9DWEJORFJZCQkJMHgxYzgwCisjZGVmaW5lIE1HQV9DWExFRlQgCQkJMHgxY2EwCisjZGVmaW5lIE1HQV9DWFJJR0hUCQkJMHgxY2E0CisKKyNkZWZpbmUgTUdBX0RNQVBBRCAJCQkweDFjNTQKKyNkZWZpbmUgTUdBX0RTVE9SRyAJCQkweDJjYjgKKyNkZWZpbmUgTUdBX0RXR0NUTCAJCQkweDFjMDAKKyMJZGVmaW5lIE1HQV9PUENPRF9NQVNLCQkJKDE1IDw8IDApCisjCWRlZmluZSBNR0FfT1BDT0RfVFJBUAkJCSg0IDw8IDApCisjCWRlZmluZSBNR0FfT1BDT0RfVEVYVFVSRV9UUkFQCQkoNiA8PCAwKQorIwlkZWZpbmUgTUdBX09QQ09EX0JJVEJMVAkJCSg4IDw8IDApCisjCWRlZmluZSBNR0FfT1BDT0RfSUxPQUQJCQkoOSA8PCAwKQorIwlkZWZpbmUgTUdBX0FUWVBFX01BU0sJCQkoNyA8PCA0KQorIwlkZWZpbmUgTUdBX0FUWVBFX1JQTAkJCSgwIDw8IDQpCisjCWRlZmluZSBNR0FfQVRZUEVfUlNUUgkJCSgxIDw8IDQpCisjCWRlZmluZSBNR0FfQVRZUEVfWkkJCQkoMyA8PCA0KQorIwlkZWZpbmUgTUdBX0FUWVBFX0JMSwkJCSg0IDw8IDQpCisjCWRlZmluZSBNR0FfQVRZUEVfSQkJCSg3IDw8IDQpCisjCWRlZmluZSBNR0FfTElORUFSCQkJKDEgPDwgNykKKyMJZGVmaW5lIE1HQV9aTU9ERV9NQVNLCQkJKDcgPDwgOCkKKyMJZGVmaW5lIE1HQV9aTU9ERV9OT1pDTVAJCQkoMCA8PCA4KQorIwlkZWZpbmUgTUdBX1pNT0RFX1pFCQkJKDIgPDwgOCkKKyMJZGVmaW5lIE1HQV9aTU9ERV9aTkUJCQkoMyA8PCA4KQorIwlkZWZpbmUgTUdBX1pNT0RFX1pMVAkJCSg0IDw8IDgpCisjCWRlZmluZSBNR0FfWk1PREVfWkxURQkJCSg1IDw8IDgpCisjCWRlZmluZSBNR0FfWk1PREVfWkdUCQkJKDYgPDwgOCkKKyMJZGVmaW5lIE1HQV9aTU9ERV9aR1RFCQkJKDcgPDwgOCkKKyMJZGVmaW5lIE1HQV9TT0xJRAkJCSgxIDw8IDExKQorIwlkZWZpbmUgTUdBX0FSWkVSTwkJCSgxIDw8IDEyKQorIwlkZWZpbmUgTUdBX1NHTlpFUk8JCQkoMSA8PCAxMykKKyMJZGVmaW5lIE1HQV9TSElGVFpFUk8JCQkoMSA8PCAxNCkKKyMJZGVmaW5lIE1HQV9CT1BfTUFTSwkJCSgxNSA8PCAxNikKKyMJZGVmaW5lIE1HQV9CT1BfWkVSTwkJCSgwIDw8IDE2KQorIwlkZWZpbmUgTUdBX0JPUF9EU1QJCQkoMTAgPDwgMTYpCisjCWRlZmluZSBNR0FfQk9QX1NSQwkJCSgxMiA8PCAxNikKKyMJZGVmaW5lIE1HQV9CT1BfT05FCQkJKDE1IDw8IDE2KQorIwlkZWZpbmUgTUdBX1RSQU5TX1NISUZUCQkJMjAKKyMJZGVmaW5lIE1HQV9UUkFOU19NQVNLCQkJKDE1IDw8IDIwKQorIwlkZWZpbmUgTUdBX0JMVE1PRF9NQVNLCQkJKDE1IDw8IDI1KQorIwlkZWZpbmUgTUdBX0JMVE1PRF9CTU9OT0xFRgkJKDAgPDwgMjUpCisjCWRlZmluZSBNR0FfQkxUTU9EX0JNT05PV0YJCSg0IDw8IDI1KQorIwlkZWZpbmUgTUdBX0JMVE1PRF9QTEFOCQkJKDEgPDwgMjUpCisjCWRlZmluZSBNR0FfQkxUTU9EX0JGQ09MCQkJKDIgPDwgMjUpCisjCWRlZmluZSBNR0FfQkxUTU9EX0JVMzJCR1IJCSgzIDw8IDI1KQorIwlkZWZpbmUgTUdBX0JMVE1PRF9CVTMyUkdCCQkoNyA8PCAyNSkKKyMJZGVmaW5lIE1HQV9CTFRNT0RfQlUyNEJHUgkJKDExIDw8IDI1KQorIwlkZWZpbmUgTUdBX0JMVE1PRF9CVTI0UkdCCQkoMTUgPDwgMjUpCisjCWRlZmluZSBNR0FfUEFUVEVSTgkJCSgxIDw8IDI5KQorIwlkZWZpbmUgTUdBX1RSQU5TQwkJCSgxIDw8IDMwKQorIwlkZWZpbmUgTUdBX0NMSVBESVMJCQkoMSA8PCAzMSkKKyNkZWZpbmUgTUdBX0RXR1NZTkMJCQkweDJjNGMKKworI2RlZmluZSBNR0FfRkNPTCAJCQkweDFjMjQKKyNkZWZpbmUgTUdBX0ZJRk9TVEFUVVMgCQkJMHgxZTEwCisjZGVmaW5lIE1HQV9GT0dDT0wgCQkJMHgxY2Y0CisjZGVmaW5lIE1HQV9GWEJORFJZCQkJMHgxYzg0CisjZGVmaW5lIE1HQV9GWExFRlQgCQkJMHgxY2E4CisjZGVmaW5lIE1HQV9GWFJJR0hUCQkJMHgxY2FjCisKKyNkZWZpbmUgTUdBX0lDTEVBUiAJCQkweDFlMTgKKyMJZGVmaW5lIE1HQV9TT0ZUUkFQSUNMUgkJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfVkxJTkVJQ0xSCQkJKDEgPDwgNSkKKyNkZWZpbmUgTUdBX0lFTiAJCQkweDFlMWMKKyMJZGVmaW5lIE1HQV9TT0ZUUkFQSUVOCQkJKDEgPDwgMCkKKyMJZGVmaW5lIE1HQV9WTElORUlFTgkJCSgxIDw8IDUpCisKKyNkZWZpbmUgTUdBX0xFTiAJCQkweDFjNWMKKworI2RlZmluZSBNR0FfTUFDQ0VTUwkJCTB4MWMwNAorCisjZGVmaW5lIE1HQV9QSVRDSCAJCQkweDFjOGMKKyNkZWZpbmUgTUdBX1BMTldUIAkJCTB4MWMxYworI2RlZmluZSBNR0FfUFJJTUFERFJFU1MgCQkweDFlNTgKKyMJZGVmaW5lIE1HQV9ETUFfR0VORVJBTAkJCSgwIDw8IDApCisjCWRlZmluZSBNR0FfRE1BX0JMSVQJCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX0RNQV9WRUNUT1IJCQkoMiA8PCAwKQorIwlkZWZpbmUgTUdBX0RNQV9WRVJURVgJCQkoMyA8PCAwKQorI2RlZmluZSBNR0FfUFJJTUVORAkJCTB4MWU1YworIwlkZWZpbmUgTUdBX1BSSU1OT1NUQVJUCQkJKDEgPDwgMCkKKyMJZGVmaW5lIE1HQV9QQUdQWEZFUgkJCSgxIDw8IDEpCisjZGVmaW5lIE1HQV9QUklNUFRSCQkJMHgxZTUwCisjCWRlZmluZSBNR0FfUFJJTVBUUkVOMAkJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfUFJJTVBUUkVOMQkJCSgxIDw8IDEpCisKKyNkZWZpbmUgTUdBX1JTVCAJCQkweDFlNDAKKyMJZGVmaW5lIE1HQV9TT0ZUUkVTRVQJCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX1NPRlRFWFRSU1QJCQkoMSA8PCAxKQorCisjZGVmaW5lIE1HQV9TRUNBRERSRVNTIAkJCTB4MmM0MAorI2RlZmluZSBNR0FfU0VDRU5EIAkJCTB4MmM0NAorI2RlZmluZSBNR0FfU0VUVVBBRERSRVNTIAkJMHgyY2QwCisjZGVmaW5lIE1HQV9TRVRVUEVORCAJCQkweDJjZDQKKyNkZWZpbmUgTUdBX1NHTgkJCQkweDFjNTgKKyNkZWZpbmUgTUdBX1NPRlRSQVAJCQkweDJjNDgKKyNkZWZpbmUgTUdBX1NSQ09SRyAJCQkweDJjYjQKKyMJZGVmaW5lIE1HQV9TUk1NQVBfTUFTSwkJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfU1JDTUFQX0ZCCQkJKDAgPDwgMCkKKyMJZGVmaW5lIE1HQV9TUkNNQVBfU1lTTUVNCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX1NSQ0FDQ19NQVNLCQkJKDEgPDwgMSkKKyMJZGVmaW5lIE1HQV9TUkNBQ0NfUENJCQkJKDAgPDwgMSkKKyMJZGVmaW5lIE1HQV9TUkNBQ0NfQUdQCQkJKDEgPDwgMSkKKyNkZWZpbmUgTUdBX1NUQVRVUyAJCQkweDFlMTQKKyMJZGVmaW5lIE1HQV9TT0ZUUkFQRU4JCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX1ZTWU5DUEVOCQkJKDEgPDwgNCkKKyMJZGVmaW5lIE1HQV9WTElORVBFTgkJCSgxIDw8IDUpCisjCWRlZmluZSBNR0FfRFdHRU5HU1RTCQkJKDEgPDwgMTYpCisjCWRlZmluZSBNR0FfRU5EUFJETUFTVFMJCQkoMSA8PCAxNykKKyNkZWZpbmUgTUdBX1NURU5DSUwJCQkweDJjYzgKKyNkZWZpbmUgTUdBX1NURU5DSUxDVEwgCQkJMHgyY2NjCisKKyNkZWZpbmUgTUdBX1REVUFMU1RBR0UwIAkJMHgyY2Y4CisjZGVmaW5lIE1HQV9URFVBTFNUQUdFMSAJCTB4MmNmYworI2RlZmluZSBNR0FfVEVYQk9SREVSQ09MIAkJMHgyYzVjCisjZGVmaW5lIE1HQV9URVhDVEwgCQkJMHgyYzMwCisjZGVmaW5lIE1HQV9URVhDVEwyCQkJMHgyYzNjCisjCWRlZmluZSBNR0FfRFVBTFRFWAkJCSgxIDw8IDcpCisjCWRlZmluZSBNR0FfRzQwMF9UQzJfTUFHSUMJCSgxIDw8IDE1KQorIwlkZWZpbmUgTUdBX01BUDFfRU5BQkxFCQkJKDEgPDwgMzEpCisjZGVmaW5lIE1HQV9URVhGSUxURVIgCQkJMHgyYzU4CisjZGVmaW5lIE1HQV9URVhIRUlHSFQgCQkJMHgyYzJjCisjZGVmaW5lIE1HQV9URVhPUkcgCQkJMHgyYzI0CisjCWRlZmluZSBNR0FfVEVYT1JHTUFQX01BU0sJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfVEVYT1JHTUFQX0ZCCQkJKDAgPDwgMCkKKyMJZGVmaW5lIE1HQV9URVhPUkdNQVBfU1lTTUVNCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX1RFWE9SR0FDQ19NQVNLCQkoMSA8PCAxKQorIwlkZWZpbmUgTUdBX1RFWE9SR0FDQ19QQ0kJCSgwIDw8IDEpCisjCWRlZmluZSBNR0FfVEVYT1JHQUNDX0FHUAkJKDEgPDwgMSkKKyNkZWZpbmUgTUdBX1RFWE9SRzEJCQkweDJjYTQKKyNkZWZpbmUgTUdBX1RFWE9SRzIJCQkweDJjYTgKKyNkZWZpbmUgTUdBX1RFWE9SRzMJCQkweDJjYWMKKyNkZWZpbmUgTUdBX1RFWE9SRzQJCQkweDJjYjAKKyNkZWZpbmUgTUdBX1RFWFRSQU5TIAkJCTB4MmMzNAorI2RlZmluZSBNR0FfVEVYVFJBTlNISUdIIAkJMHgyYzM4CisjZGVmaW5lIE1HQV9URVhXSURUSCAJCQkweDJjMjgKKworI2RlZmluZSBNR0FfV0FDQ0VQVFNFUSAJCQkweDFkZDQKKyNkZWZpbmUgTUdBX1dDT0RFQUREUiAJCQkweDFlNmMKKyNkZWZpbmUgTUdBX1dGTEFHIAkJCTB4MWRjNAorI2RlZmluZSBNR0FfV0ZMQUcxIAkJCTB4MWRlMAorI2RlZmluZSBNR0FfV0ZMQUdOQgkJCTB4MWU2NAorI2RlZmluZSBNR0FfV0ZMQUdOQjEgCQkJMHgxZTA4CisjZGVmaW5lIE1HQV9XR0VUTVNCCQkJMHgxZGM4CisjZGVmaW5lIE1HQV9XSUFERFIgCQkJMHgxZGMwCisjZGVmaW5lIE1HQV9XSUFERFIyCQkJMHgxZGQ4CisjCWRlZmluZSBNR0FfV01PREVfU1VTUEVORAkJKDAgPDwgMCkKKyMJZGVmaW5lIE1HQV9XTU9ERV9SRVNVTUUJCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX1dNT0RFX0pVTVAJCQkoMiA8PCAwKQorIwlkZWZpbmUgTUdBX1dNT0RFX1NUQVJUCQkJKDMgPDwgMCkKKyMJZGVmaW5lIE1HQV9XQUdQX0VOQUJMRQkJCSgxIDw8IDIpCisjZGVmaW5lIE1HQV9XTUlTQyAJCQkweDFlNzAKKyMJZGVmaW5lIE1HQV9XVUNPREVDQUNIRV9FTkFCTEUJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfV01BU1RFUl9FTkFCTEUJCSgxIDw8IDEpCisjCWRlZmluZSBNR0FfV0NBQ0hFRkxVU0hfRU5BQkxFCQkoMSA8PCAzKQorI2RlZmluZSBNR0FfV1ZSVFhTWgkJCTB4MWRjYworCisjZGVmaW5lIE1HQV9ZQk9UIAkJCTB4MWM5YworI2RlZmluZSBNR0FfWURTVCAJCQkweDFjOTAKKyNkZWZpbmUgTUdBX1lEU1RMRU4JCQkweDFjODgKKyNkZWZpbmUgTUdBX1lEU1RPUkcJCQkweDFjOTQKKyNkZWZpbmUgTUdBX1lUT1AgCQkJMHgxYzk4CisKKyNkZWZpbmUgTUdBX1pPUkcgCQkJMHgxYzBjCisKKy8qIFRoaXMgZmluaXNoZXMgdGhlIGN1cnJlbnQgYmF0Y2ggb2YgY29tbWFuZHMKKyAqLworI2RlZmluZSBNR0FfRVhFQyAJCQkweDAxMDAKKworLyogV2FycCByZWdpc3RlcnMKKyAqLworI2RlZmluZSBNR0FfV1IwCQkJCTB4MmQwMAorI2RlZmluZSBNR0FfV1IxCQkJCTB4MmQwNAorI2RlZmluZSBNR0FfV1IyCQkJCTB4MmQwOAorI2RlZmluZSBNR0FfV1IzCQkJCTB4MmQwYworI2RlZmluZSBNR0FfV1I0CQkJCTB4MmQxMAorI2RlZmluZSBNR0FfV1I1CQkJCTB4MmQxNAorI2RlZmluZSBNR0FfV1I2CQkJCTB4MmQxOAorI2RlZmluZSBNR0FfV1I3CQkJCTB4MmQxYworI2RlZmluZSBNR0FfV1I4CQkJCTB4MmQyMAorI2RlZmluZSBNR0FfV1I5CQkJCTB4MmQyNAorI2RlZmluZSBNR0FfV1IxMAkJCTB4MmQyOAorI2RlZmluZSBNR0FfV1IxMQkJCTB4MmQyYworI2RlZmluZSBNR0FfV1IxMgkJCTB4MmQzMAorI2RlZmluZSBNR0FfV1IxMwkJCTB4MmQzNAorI2RlZmluZSBNR0FfV1IxNAkJCTB4MmQzOAorI2RlZmluZSBNR0FfV1IxNQkJCTB4MmQzYworI2RlZmluZSBNR0FfV1IxNgkJCTB4MmQ0MAorI2RlZmluZSBNR0FfV1IxNwkJCTB4MmQ0NAorI2RlZmluZSBNR0FfV1IxOAkJCTB4MmQ0OAorI2RlZmluZSBNR0FfV1IxOQkJCTB4MmQ0YworI2RlZmluZSBNR0FfV1IyMAkJCTB4MmQ1MAorI2RlZmluZSBNR0FfV1IyMQkJCTB4MmQ1NAorI2RlZmluZSBNR0FfV1IyMgkJCTB4MmQ1OAorI2RlZmluZSBNR0FfV1IyMwkJCTB4MmQ1YworI2RlZmluZSBNR0FfV1IyNAkJCTB4MmQ2MAorI2RlZmluZSBNR0FfV1IyNQkJCTB4MmQ2NAorI2RlZmluZSBNR0FfV1IyNgkJCTB4MmQ2OAorI2RlZmluZSBNR0FfV1IyNwkJCTB4MmQ2YworI2RlZmluZSBNR0FfV1IyOAkJCTB4MmQ3MAorI2RlZmluZSBNR0FfV1IyOQkJCTB4MmQ3NAorI2RlZmluZSBNR0FfV1IzMAkJCTB4MmQ3OAorI2RlZmluZSBNR0FfV1IzMQkJCTB4MmQ3YworI2RlZmluZSBNR0FfV1IzMgkJCTB4MmQ4MAorI2RlZmluZSBNR0FfV1IzMwkJCTB4MmQ4NAorI2RlZmluZSBNR0FfV1IzNAkJCTB4MmQ4OAorI2RlZmluZSBNR0FfV1IzNQkJCTB4MmQ4YworI2RlZmluZSBNR0FfV1IzNgkJCTB4MmQ5MAorI2RlZmluZSBNR0FfV1IzNwkJCTB4MmQ5NAorI2RlZmluZSBNR0FfV1IzOAkJCTB4MmQ5OAorI2RlZmluZSBNR0FfV1IzOQkJCTB4MmQ5YworI2RlZmluZSBNR0FfV1I0MAkJCTB4MmRhMAorI2RlZmluZSBNR0FfV1I0MQkJCTB4MmRhNAorI2RlZmluZSBNR0FfV1I0MgkJCTB4MmRhOAorI2RlZmluZSBNR0FfV1I0MwkJCTB4MmRhYworI2RlZmluZSBNR0FfV1I0NAkJCTB4MmRiMAorI2RlZmluZSBNR0FfV1I0NQkJCTB4MmRiNAorI2RlZmluZSBNR0FfV1I0NgkJCTB4MmRiOAorI2RlZmluZSBNR0FfV1I0NwkJCTB4MmRiYworI2RlZmluZSBNR0FfV1I0OAkJCTB4MmRjMAorI2RlZmluZSBNR0FfV1I0OQkJCTB4MmRjNAorI2RlZmluZSBNR0FfV1I1MAkJCTB4MmRjOAorI2RlZmluZSBNR0FfV1I1MQkJCTB4MmRjYworI2RlZmluZSBNR0FfV1I1MgkJCTB4MmRkMAorI2RlZmluZSBNR0FfV1I1MwkJCTB4MmRkNAorI2RlZmluZSBNR0FfV1I1NAkJCTB4MmRkOAorI2RlZmluZSBNR0FfV1I1NQkJCTB4MmRkYworI2RlZmluZSBNR0FfV1I1NgkJCTB4MmRlMAorI2RlZmluZSBNR0FfV1I1NwkJCTB4MmRlNAorI2RlZmluZSBNR0FfV1I1OAkJCTB4MmRlOAorI2RlZmluZSBNR0FfV1I1OQkJCTB4MmRlYworI2RlZmluZSBNR0FfV1I2MAkJCTB4MmRmMAorI2RlZmluZSBNR0FfV1I2MQkJCTB4MmRmNAorI2RlZmluZSBNR0FfV1I2MgkJCTB4MmRmOAorI2RlZmluZSBNR0FfV1I2MwkJCTB4MmRmYworIwlkZWZpbmUgTUdBX0c0MDBfV1JfTUFHSUMJCSgxIDw8IDYpCisjCWRlZmluZSBNR0FfRzQwMF9XUjU2X01BR0lDCQkweDQ2NDgwMDAwCS8qIDEyODAwLjBmICovCisKKworI2RlZmluZSBNR0FfSUxPQURfQUxJR04JCTY0CisjZGVmaW5lIE1HQV9JTE9BRF9NQVNLCQkoTUdBX0lMT0FEX0FMSUdOIC0gMSkKKworI2RlZmluZSBNR0FfRFdHQ1RMX0ZMVVNICShNR0FfT1BDT0RfVEVYVFVSRV9UUkFQIHwJCVwKKwkJCQkgTUdBX0FUWVBFX0kgfAkJCQlcCisJCQkJIE1HQV9aTU9ERV9OT1pDTVAgfAkJCVwKKwkJCQkgTUdBX0FSWkVSTyB8CQkJCVwKKwkJCQkgTUdBX1NHTlpFUk8gfAkJCQlcCisJCQkJIE1HQV9CT1BfU1JDIHwJCQkJXAorCQkJCSAoMTUgPDwgTUdBX1RSQU5TX1NISUZUKSkKKworI2RlZmluZSBNR0FfRFdHQ1RMX0NMRUFSCShNR0FfT1BDT0RfVFJBUCB8CQkJXAorCQkJCSBNR0FfWk1PREVfTk9aQ01QIHwJCQlcCisJCQkJIE1HQV9TT0xJRCB8CQkJCVwKKwkJCQkgTUdBX0FSWkVSTyB8CQkJCVwKKwkJCQkgTUdBX1NHTlpFUk8gfAkJCQlcCisJCQkJIE1HQV9TSElGVFpFUk8gfAkJCVwKKwkJCQkgTUdBX0JPUF9TUkMgfAkJCQlcCisJCQkJICgwIDw8IE1HQV9UUkFOU19TSElGVCkgfAkJXAorCQkJCSBNR0FfQkxUTU9EX0JNT05PTEVGIHwJCQlcCisJCQkJIE1HQV9UUkFOU0MgfAkJCQlcCisJCQkJIE1HQV9DTElQRElTKQorCisjZGVmaW5lIE1HQV9EV0dDVExfQ09QWQkJKE1HQV9PUENPRF9CSVRCTFQgfAkJCVwKKwkJCQkgTUdBX0FUWVBFX1JQTCB8CQkJXAorCQkJCSBNR0FfU0dOWkVSTyB8CQkJCVwKKwkJCQkgTUdBX1NISUZUWkVSTyB8CQkJXAorCQkJCSBNR0FfQk9QX1NSQyB8CQkJCVwKKwkJCQkgKDAgPDwgTUdBX1RSQU5TX1NISUZUKSB8CQlcCisJCQkJIE1HQV9CTFRNT0RfQkZDT0wgfAkJCVwKKwkJCQkgTUdBX0NMSVBESVMpCisKKy8qIFNpbXBsZSBpZGxlIHRlc3QuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBtZ2FfaXNfaWRsZSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1MzIgc3RhdHVzID0gTUdBX1JFQUQoIE1HQV9TVEFUVVMgKSAmIE1HQV9FTkdJTkVfSURMRV9NQVNLOworCXJldHVybiAoIHN0YXR1cyA9PSBNR0FfRU5EUFJETUFTVFMgKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGI2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9pcnEuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogbWdhX2lycS5jIC0tIElSUSBoYW5kbGluZyBmb3IgcmFkZW9uIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAoQykgVGhlIFdlYXRoZXIgQ2hhbm5lbCwgSW5jLiAgMjAwMi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoZSBXZWF0aGVyIENoYW5uZWwgKFRNKSBmdW5kZWQgVHVuZ3N0ZW4gR3JhcGhpY3MgdG8gZGV2ZWxvcCB0aGUKKyAqIGluaXRpYWwgcmVsZWFzZSBvZiB0aGUgUmFkZW9uIDg1MDAgZHJpdmVyIHVuZGVyIHRoZSBYRnJlZTg2IGxpY2Vuc2UuCisgKiBUaGlzIG5vdGljZSBtdXN0IGJlIHByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqICAgIEVyaWMgQW5ob2x0IDxhbmhvbHRARnJlZUJTRC5vcmc+CisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJtZ2FfZHJtLmgiCisjaW5jbHVkZSAibWdhX2Rydi5oIgorCitpcnFyZXR1cm5fdCBtZ2FfZHJpdmVyX2lycV9oYW5kbGVyKCBEUk1fSVJRX0FSR1MgKQoreworCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBhcmc7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9tZ2FfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gTUdBX1JFQUQoIE1HQV9TVEFUVVMgKTsKKwkKKwkvKiBWQkxBTksgaW50ZXJydXB0ICovCisJaWYgKCBzdGF0dXMgJiBNR0FfVkxJTkVQRU4gKSB7CisJCU1HQV9XUklURSggTUdBX0lDTEVBUiwgTUdBX1ZMSU5FSUNMUiApOworCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZCk7CisJCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlKTsKKwkJZHJtX3ZibF9zZW5kX3NpZ25hbHMoIGRldiApOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXJldHVybiBJUlFfTk9ORTsKK30KKworaW50IG1nYV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCit7CisJdW5zaWduZWQgaW50IGN1cl92Ymxhbms7CisJaW50IHJldCA9IDA7CisKKwkvKiBBc3N1bWUgdGhhdCB0aGUgdXNlciBoYXMgbWlzc2VkIHRoZSBjdXJyZW50IHNlcXVlbmNlIG51bWJlcgorCSAqIGJ5IGFib3V0IGEgZGF5IHJhdGhlciB0aGFuIHNoZSB3YW50cyB0byB3YWl0IGZvciB5ZWFycworCSAqIHVzaW5nIHZlcnRpY2FsIGJsYW5rcy4uLiAKKwkgKi8KKwlEUk1fV0FJVF9PTiggcmV0LCBkZXYtPnZibF9xdWV1ZSwgMypEUk1fSFosIAorCQkgICAgICggKCAoIGN1cl92YmxhbmsgPSBhdG9taWNfcmVhZCgmZGV2LT52YmxfcmVjZWl2ZWQgKSApCisJCQkgLSAqc2VxdWVuY2UgKSA8PSAoMTw8MjMpICkgKTsKKworCSpzZXF1ZW5jZSA9IGN1cl92Ymxhbms7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworICAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9tZ2FfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIERpc2FibGUgKmFsbCogaW50ZXJydXB0cyAqLworICAgICAgCU1HQV9XUklURSggTUdBX0lFTiwgMCApOworCS8qIENsZWFyIGJpdHMgaWYgdGhleSdyZSBhbHJlYWR5IGhpZ2ggKi8KKyAgIAlNR0FfV1JJVEUoIE1HQV9JQ0xFQVIsIH4wICk7Cit9CisKK3ZvaWQgbWdhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworICAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9tZ2FfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIFR1cm4gb24gVkJMIGludGVycnVwdCAqLworICAgCU1HQV9XUklURSggTUdBX0lFTiwgTUdBX1ZMSU5FSUVOICk7Cit9CisKK3ZvaWQgbWdhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKyAgCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IAorCSAgIChkcm1fbWdhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJaWYgKCFkZXZfcHJpdikKKwkJcmV0dXJuOworCisJLyogRGlzYWJsZSAqYWxsKiBpbnRlcnJ1cHRzICovCisJTUdBX1dSSVRFKCBNR0FfSUVOLCAwICk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffc3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzdhOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffc3RhdGUuYwpAQCAtMCwwICsxLDExMjMgQEAKKy8qIG1nYV9zdGF0ZS5jIC0tIFN0YXRlIHN1cHBvcnQgZm9yIE1HQSBHMjAwL0c0MDAgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBUaHUgSmFuIDI3IDAyOjUzOjQzIDIwMDAgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICoKKyAqIFJld3JpdHRlbiBieToKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm1nYV9kcm0uaCIKKyNpbmNsdWRlICJtZ2FfZHJ2LmgiCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERNQSBoYXJkd2FyZSBzdGF0ZSBwcm9ncmFtbWluZyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCBtZ2FfZW1pdF9jbGlwX3JlY3QoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQlkcm1fY2xpcF9yZWN0X3QgKmJveCApCit7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CisJdW5zaWduZWQgaW50IHBpdGNoID0gZGV2X3ByaXYtPmZyb250X3BpdGNoOworCURNQV9MT0NBTFM7CisKKwlCRUdJTl9ETUEoIDIgKTsKKworCS8qIEZvcmNlIHJlc2V0IG9mIERXR0NUTCBvbiBHNDAwIChlbGltaW5hdGVzIGNsaXAgZGlzYWJsZSBiaXQpLgorCSAqLworCWlmICggZGV2X3ByaXYtPmNoaXBzZXQgPT0gTUdBX0NBUkRfVFlQRV9HNDAwICkgeworCQlETUFfQkxPQ0soIE1HQV9EV0dDVEwsCQljdHgtPmR3Z2N0bCwKKwkJCSAgIE1HQV9MRU4gKyBNR0FfRVhFQywJMHg4MDAwMDAwMCwKKwkJCSAgIE1HQV9EV0dDVEwsCQljdHgtPmR3Z2N0bCwKKwkJCSAgIE1HQV9MRU4gKyBNR0FfRVhFQywJMHg4MDAwMDAwMCApOworCX0KKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9DWEJORFJZLAkoYm94LT54MiA8PCAxNikgfCBib3gtPngxLAorCQkgICBNR0FfWVRPUCwJYm94LT55MSAqIHBpdGNoLAorCQkgICBNR0FfWUJPVCwJYm94LT55MiAqIHBpdGNoICk7CisKKwlBRFZBTkNFX0RNQSgpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1nYV9nMjAwX2VtaXRfY29udGV4dCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKwlETUFfTE9DQUxTOworCisJQkVHSU5fRE1BKCAzICk7CisKKwlETUFfQkxPQ0soIE1HQV9EU1RPUkcsCQljdHgtPmRzdG9yZywKKwkJICAgTUdBX01BQ0NFU1MsCQljdHgtPm1hY2Nlc3MsCisJCSAgIE1HQV9QTE5XVCwJCWN0eC0+cGxud3QsCisJCSAgIE1HQV9EV0dDVEwsCQljdHgtPmR3Z2N0bCApOworCisJRE1BX0JMT0NLKCBNR0FfQUxQSEFDVFJMLAljdHgtPmFscGhhY3RybCwKKwkJICAgTUdBX0ZPR0NPTCwJCWN0eC0+Zm9nY29sb3IsCisJCSAgIE1HQV9XRkxBRywJCWN0eC0+d2ZsYWcsCisJCSAgIE1HQV9aT1JHLAkJZGV2X3ByaXYtPmRlcHRoX29mZnNldCApOworCisJRE1BX0JMT0NLKCBNR0FfRkNPTCwJCWN0eC0+ZmNvbCwKKwkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCApOworCisJQURWQU5DRV9ETUEoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzQwMF9lbWl0X2NvbnRleHQoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CisJRE1BX0xPQ0FMUzsKKworCUJFR0lOX0RNQSggNCApOworCisJRE1BX0JMT0NLKCBNR0FfRFNUT1JHLAkJY3R4LT5kc3RvcmcsCisJCSAgIE1HQV9NQUNDRVNTLAkJY3R4LT5tYWNjZXNzLAorCQkgICBNR0FfUExOV1QsCQljdHgtPnBsbnd0LAorCQkgICBNR0FfRFdHQ1RMLAkJY3R4LT5kd2djdGwgKTsKKworCURNQV9CTE9DSyggTUdBX0FMUEhBQ1RSTCwJY3R4LT5hbHBoYWN0cmwsCisJCSAgIE1HQV9GT0dDT0wsCQljdHgtPmZvZ2NvbG9yLAorCQkgICBNR0FfV0ZMQUcsCQljdHgtPndmbGFnLAorCQkgICBNR0FfWk9SRywJCWRldl9wcml2LT5kZXB0aF9vZmZzZXQgKTsKKworCURNQV9CTE9DSyggTUdBX1dGTEFHMSwJCWN0eC0+d2ZsYWcsCisJCSAgIE1HQV9URFVBTFNUQUdFMCwJY3R4LT50ZHVhbHN0YWdlMCwKKwkJICAgTUdBX1REVUFMU1RBR0UxLAljdHgtPnRkdWFsc3RhZ2UxLAorCQkgICBNR0FfRkNPTCwJCWN0eC0+ZmNvbCApOworCisJRE1BX0JMT0NLKCBNR0FfU1RFTkNJTCwJCWN0eC0+c3RlbmNpbCwKKwkJICAgTUdBX1NURU5DSUxDVEwsCWN0eC0+c3RlbmNpbGN0bCwKKwkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwICk7CisKKwlBRFZBTkNFX0RNQSgpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1nYV9nMjAwX2VtaXRfdGV4MCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX3RleHR1cmVfcmVnc190ICp0ZXggPSAmc2FyZWFfcHJpdi0+dGV4X3N0YXRlWzBdOworCURNQV9MT0NBTFM7CisKKwlCRUdJTl9ETUEoIDQgKTsKKworCURNQV9CTE9DSyggTUdBX1RFWENUTDIsCQl0ZXgtPnRleGN0bDIsCisJCSAgIE1HQV9URVhDVEwsCQl0ZXgtPnRleGN0bCwKKwkJICAgTUdBX1RFWEZJTFRFUiwJdGV4LT50ZXhmaWx0ZXIsCisJCSAgIE1HQV9URVhCT1JERVJDT0wsCXRleC0+dGV4Ym9yZGVyY29sICk7CisKKwlETUFfQkxPQ0soIE1HQV9URVhPUkcsCQl0ZXgtPnRleG9yZywKKwkJICAgTUdBX1RFWE9SRzEsCQl0ZXgtPnRleG9yZzEsCisJCSAgIE1HQV9URVhPUkcyLAkJdGV4LT50ZXhvcmcyLAorCQkgICBNR0FfVEVYT1JHMywJCXRleC0+dGV4b3JnMyApOworCisJRE1BX0JMT0NLKCBNR0FfVEVYT1JHNCwJCXRleC0+dGV4b3JnNCwKKwkJICAgTUdBX1RFWFdJRFRILAl0ZXgtPnRleHdpZHRoLAorCQkgICBNR0FfVEVYSEVJR0hULAl0ZXgtPnRleGhlaWdodCwKKwkJICAgTUdBX1dSMjQsCQl0ZXgtPnRleHdpZHRoICk7CisKKwlETUFfQkxPQ0soIE1HQV9XUjM0LAkJdGV4LT50ZXhoZWlnaHQsCisJCSAgIE1HQV9URVhUUkFOUywJMHgwMDAwZmZmZiwKKwkJICAgTUdBX1RFWFRSQU5TSElHSCwJMHgwMDAwZmZmZiwKKwkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAgKTsKKworCUFEVkFOQ0VfRE1BKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbWdhX2c0MDBfZW1pdF90ZXgwKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9tZ2FfdGV4dHVyZV9yZWdzX3QgKnRleCA9ICZzYXJlYV9wcml2LT50ZXhfc3RhdGVbMF07CisJRE1BX0xPQ0FMUzsKKworLyogIAlwcmludGsoIm1nYV9nNDAwX2VtaXRfdGV4MCAleCAleCAleFxuIiwgdGV4LT50ZXhvcmcsICovCisvKiAgCSAgICAgICB0ZXgtPnRleGN0bCwgdGV4LT50ZXhjdGwyKTsgKi8KKworCUJFR0lOX0RNQSggNiApOworCisJRE1BX0JMT0NLKCBNR0FfVEVYQ1RMMiwJCXRleC0+dGV4Y3RsMiB8IE1HQV9HNDAwX1RDMl9NQUdJQywKKwkJICAgTUdBX1RFWENUTCwJCXRleC0+dGV4Y3RsLAorCQkgICBNR0FfVEVYRklMVEVSLAl0ZXgtPnRleGZpbHRlciwKKwkJICAgTUdBX1RFWEJPUkRFUkNPTCwJdGV4LT50ZXhib3JkZXJjb2wgKTsKKworCURNQV9CTE9DSyggTUdBX1RFWE9SRywJCXRleC0+dGV4b3JnLAorCQkgICBNR0FfVEVYT1JHMSwJCXRleC0+dGV4b3JnMSwKKwkJICAgTUdBX1RFWE9SRzIsCQl0ZXgtPnRleG9yZzIsCisJCSAgIE1HQV9URVhPUkczLAkJdGV4LT50ZXhvcmczICk7CisKKwlETUFfQkxPQ0soIE1HQV9URVhPUkc0LAkJdGV4LT50ZXhvcmc0LAorCQkgICBNR0FfVEVYV0lEVEgsCXRleC0+dGV4d2lkdGgsCisJCSAgIE1HQV9URVhIRUlHSFQsCXRleC0+dGV4aGVpZ2h0LAorCQkgICBNR0FfV1I0OSwJCTB4MDAwMDAwMDAgKTsKKworCURNQV9CTE9DSyggTUdBX1dSNTcsCQkweDAwMDAwMDAwLAorCQkgICBNR0FfV1I1MywJCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9XUjYxLAkJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1dSNTIsCQlNR0FfRzQwMF9XUl9NQUdJQyApOworCisJRE1BX0JMT0NLKCBNR0FfV1I2MCwJCU1HQV9HNDAwX1dSX01BR0lDLAorCQkgICBNR0FfV1I1NCwJCXRleC0+dGV4d2lkdGggfCBNR0FfRzQwMF9XUl9NQUdJQywKKwkJICAgTUdBX1dSNjIsCQl0ZXgtPnRleGhlaWdodCB8IE1HQV9HNDAwX1dSX01BR0lDLAorCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCApOworCisJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9URVhUUkFOUywJMHgwMDAwZmZmZiwKKwkJICAgTUdBX1RFWFRSQU5TSElHSCwJMHgwMDAwZmZmZiApOworCisJQURWQU5DRV9ETUEoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzQwMF9lbWl0X3RleDEoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV90ZXh0dXJlX3JlZ3NfdCAqdGV4ID0gJnNhcmVhX3ByaXYtPnRleF9zdGF0ZVsxXTsKKwlETUFfTE9DQUxTOworCisvKiAgCXByaW50aygibWdhX2c0MDBfZW1pdF90ZXgxICV4ICV4ICV4XG4iLCB0ZXgtPnRleG9yZywgICovCisvKiAgCSAgICAgICB0ZXgtPnRleGN0bCwgdGV4LT50ZXhjdGwyKTsgKi8KKworCUJFR0lOX0RNQSggNSApOworCisJRE1BX0JMT0NLKCBNR0FfVEVYQ1RMMiwJCSh0ZXgtPnRleGN0bDIgfAorCQkJCQkgTUdBX01BUDFfRU5BQkxFIHwKKwkJCQkJIE1HQV9HNDAwX1RDMl9NQUdJQyksCisJCSAgIE1HQV9URVhDVEwsCQl0ZXgtPnRleGN0bCwKKwkJICAgTUdBX1RFWEZJTFRFUiwJdGV4LT50ZXhmaWx0ZXIsCisJCSAgIE1HQV9URVhCT1JERVJDT0wsCXRleC0+dGV4Ym9yZGVyY29sICk7CisKKwlETUFfQkxPQ0soIE1HQV9URVhPUkcsCQl0ZXgtPnRleG9yZywKKwkJICAgTUdBX1RFWE9SRzEsCQl0ZXgtPnRleG9yZzEsCisJCSAgIE1HQV9URVhPUkcyLAkJdGV4LT50ZXhvcmcyLAorCQkgICBNR0FfVEVYT1JHMywJCXRleC0+dGV4b3JnMyApOworCisJRE1BX0JMT0NLKCBNR0FfVEVYT1JHNCwJCXRleC0+dGV4b3JnNCwKKwkJICAgTUdBX1RFWFdJRFRILAl0ZXgtPnRleHdpZHRoLAorCQkgICBNR0FfVEVYSEVJR0hULAl0ZXgtPnRleGhlaWdodCwKKwkJICAgTUdBX1dSNDksCQkweDAwMDAwMDAwICk7CisKKwlETUFfQkxPQ0soIE1HQV9XUjU3LAkJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1dSNTMsCQkweDAwMDAwMDAwLAorCQkgICBNR0FfV1I2MSwJCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9XUjUyLAkJdGV4LT50ZXh3aWR0aCB8IE1HQV9HNDAwX1dSX01BR0lDICk7CisKKwlETUFfQkxPQ0soIE1HQV9XUjYwLAkJdGV4LT50ZXhoZWlnaHQgfCBNR0FfRzQwMF9XUl9NQUdJQywKKwkJICAgTUdBX1RFWFRSQU5TLAkweDAwMDBmZmZmLAorCQkgICBNR0FfVEVYVFJBTlNISUdILAkweDAwMDBmZmZmLAorCQkgICBNR0FfVEVYQ1RMMiwJCXRleC0+dGV4Y3RsMiB8IE1HQV9HNDAwX1RDMl9NQUdJQyApOworCisJQURWQU5DRV9ETUEoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzIwMF9lbWl0X3BpcGUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJdW5zaWduZWQgaW50IHBpcGUgPSBzYXJlYV9wcml2LT53YXJwX3BpcGU7CisJRE1BX0xPQ0FMUzsKKworCUJFR0lOX0RNQSggMyApOworCisJRE1BX0JMT0NLKCBNR0FfV0lBRERSLAlNR0FfV01PREVfU1VTUEVORCwKKwkJICAgTUdBX1dWUlRYU1osCTB4MDAwMDAwMDcsCisJCSAgIE1HQV9XRkxBRywJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1dSMjQsCTB4MDAwMDAwMDAgKTsKKworCURNQV9CTE9DSyggTUdBX1dSMjUsCTB4MDAwMDAxMDAsCisJCSAgIE1HQV9XUjM0LAkweDAwMDAwMDAwLAorCQkgICBNR0FfV1I0MiwJMHgwMDAwZmZmZiwKKwkJICAgTUdBX1dSNjAsCTB4MDAwMGZmZmYgKTsKKworCS8qIFBhZGRpbmcgcmVxdWlyZWQgdG8gdG8gaGFyZHdhcmUgYnVnLgorCSAqLworCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKKwkJICAgTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKKwkJICAgTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKKwkJICAgTUdBX1dJQUREUiwJKGRldl9wcml2LT53YXJwX3BpcGVfcGh5c1twaXBlXSB8CisJCQkJIE1HQV9XTU9ERV9TVEFSVCB8CisJCQkJIE1HQV9XQUdQX0VOQUJMRSkgKTsKKworCUFEVkFOQ0VfRE1BKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbWdhX2c0MDBfZW1pdF9waXBlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXVuc2lnbmVkIGludCBwaXBlID0gc2FyZWFfcHJpdi0+d2FycF9waXBlOworCURNQV9MT0NBTFM7CisKKy8qICAJcHJpbnRrKCJtZ2FfZzQwMF9lbWl0X3BpcGUgJXhcbiIsIHBpcGUpOyAqLworCisJQkVHSU5fRE1BKCAxMCApOworCisJRE1BX0JMT0NLKCBNR0FfV0lBRERSMiwJTUdBX1dNT0RFX1NVU1BFTkQsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAgKTsKKworCWlmICggcGlwZSAmIE1HQV9UMiApIHsKKwkJRE1BX0JMT0NLKCBNR0FfV1ZSVFhTWiwJCTB4MDAwMDFlMDksCisJCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCwKKwkJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAgKTsKKworCQlETUFfQkxPQ0soIE1HQV9XQUNDRVBUU0VRLAkweDAwMDAwMDAwLAorCQkJICAgTUdBX1dBQ0NFUFRTRVEsCTB4MDAwMDAwMDAsCisJCQkgICBNR0FfV0FDQ0VQVFNFUSwJMHgwMDAwMDAwMCwKKwkJCSAgIE1HQV9XQUNDRVBUU0VRLAkweDFlMDAwMDAwICk7CisJfSBlbHNlIHsKKwkJaWYgKCBkZXZfcHJpdi0+d2FycF9waXBlICYgTUdBX1QyICkgeworCQkJLyogRmx1c2ggdGhlIFdBUlAgcGlwZSAqLworCQkJRE1BX0JMT0NLKCBNR0FfWURTVCwJCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX0ZYTEVGVCwJCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX0ZYUklHSFQsCQkweDAwMDAwMDAxLAorCQkJCSAgIE1HQV9EV0dDVEwsCQlNR0FfRFdHQ1RMX0ZMVVNIICk7CisKKwkJCURNQV9CTE9DSyggTUdBX0xFTiArIE1HQV9FWEVDLAkweDAwMDAwMDAxLAorCQkJCSAgIE1HQV9EV0dTWU5DLAkJMHgwMDAwNzAwMCwKKwkJCQkgICBNR0FfVEVYQ1RMMiwJCU1HQV9HNDAwX1RDMl9NQUdJQywKKwkJCQkgICBNR0FfTEVOICsgTUdBX0VYRUMsCTB4MDAwMDAwMDAgKTsKKworCQkJRE1BX0JMT0NLKCBNR0FfVEVYQ1RMMiwJCShNR0FfRFVBTFRFWCB8CisJCQkJCQkJIE1HQV9HNDAwX1RDMl9NQUdJQyksCisJCQkJICAgTUdBX0xFTiArIE1HQV9FWEVDLAkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9URVhDVEwyLAkJTUdBX0c0MDBfVEMyX01BR0lDLAorCQkJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwICk7CisJCX0KKworCQlETUFfQkxPQ0soIE1HQV9XVlJUWFNaLAkJMHgwMDAwMTgwNywKKwkJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCisJCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCApOworCisJCURNQV9CTE9DSyggTUdBX1dBQ0NFUFRTRVEsCTB4MDAwMDAwMDAsCisJCQkgICBNR0FfV0FDQ0VQVFNFUSwJMHgwMDAwMDAwMCwKKwkJCSAgIE1HQV9XQUNDRVBUU0VRLAkweDAwMDAwMDAwLAorCQkJICAgTUdBX1dBQ0NFUFRTRVEsCTB4MTgwMDAwMDAgKTsKKwl9CisKKwlETUFfQkxPQ0soIE1HQV9XRkxBRywJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1dGTEFHMSwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1dSNTYsCU1HQV9HNDAwX1dSNTZfTUFHSUMsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAgKTsKKworCURNQV9CTE9DSyggTUdBX1dSNDksCTB4MDAwMDAwMDAsCQkvKiB0ZXgwICAgICAgICAgICAgICAqLworCQkgICBNR0FfV1I1NywJMHgwMDAwMDAwMCwJCS8qIHRleDAgICAgICAgICAgICAgICovCisJCSAgIE1HQV9XUjUzLAkweDAwMDAwMDAwLAkJLyogdGV4MSAgICAgICAgICAgICAgKi8KKwkJICAgTUdBX1dSNjEsCTB4MDAwMDAwMDAgKTsJCS8qIHRleDEgICAgICAgICAgICAgICovCisKKwlETUFfQkxPQ0soIE1HQV9XUjU0LAlNR0FfRzQwMF9XUl9NQUdJQywJLyogdGV4MCB3aWR0aCAgICAgICAgKi8KKwkJICAgTUdBX1dSNjIsCU1HQV9HNDAwX1dSX01BR0lDLAkvKiB0ZXgwIGhlaWdodCAgICAgICAqLworCQkgICBNR0FfV1I1MiwJTUdBX0c0MDBfV1JfTUFHSUMsCS8qIHRleDEgd2lkdGggICAgICAgICovCisJCSAgIE1HQV9XUjYwLAlNR0FfRzQwMF9XUl9NQUdJQyApOwkvKiB0ZXgxIGhlaWdodCAgICAgICAqLworCisJLyogUGFkZGluZyByZXF1aXJlZCB0byB0byBoYXJkd2FyZSBidWcgKi8KKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4ZmZmZmZmZmYsCisJCSAgIE1HQV9ETUFQQUQsCTB4ZmZmZmZmZmYsCisJCSAgIE1HQV9ETUFQQUQsCTB4ZmZmZmZmZmYsCisJCSAgIE1HQV9XSUFERFIyLAkoZGV2X3ByaXYtPndhcnBfcGlwZV9waHlzW3BpcGVdIHwKKwkJCQkgTUdBX1dNT0RFX1NUQVJUIHwKKwkJCQkgTUdBX1dBR1BfRU5BQkxFKSApOworCisJQURWQU5DRV9ETUEoKTsKK30KKworc3RhdGljIHZvaWQgbWdhX2cyMDBfZW1pdF9zdGF0ZSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwl1bnNpZ25lZCBpbnQgZGlydHkgPSBzYXJlYV9wcml2LT5kaXJ0eTsKKworCWlmICggc2FyZWFfcHJpdi0+d2FycF9waXBlICE9IGRldl9wcml2LT53YXJwX3BpcGUgKSB7CisJCW1nYV9nMjAwX2VtaXRfcGlwZSggZGV2X3ByaXYgKTsKKwkJZGV2X3ByaXYtPndhcnBfcGlwZSA9IHNhcmVhX3ByaXYtPndhcnBfcGlwZTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgTUdBX1VQTE9BRF9DT05URVhUICkgeworCQltZ2FfZzIwMF9lbWl0X2NvbnRleHQoIGRldl9wcml2ICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5NR0FfVVBMT0FEX0NPTlRFWFQ7CisJfQorCisJaWYgKCBkaXJ0eSAmIE1HQV9VUExPQURfVEVYMCApIHsKKwkJbWdhX2cyMDBfZW1pdF90ZXgwKCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+TUdBX1VQTE9BRF9URVgwOworCX0KK30KKworc3RhdGljIHZvaWQgbWdhX2c0MDBfZW1pdF9zdGF0ZSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwl1bnNpZ25lZCBpbnQgZGlydHkgPSBzYXJlYV9wcml2LT5kaXJ0eTsKKwlpbnQgbXVsdGl0ZXggPSBzYXJlYV9wcml2LT53YXJwX3BpcGUgJiBNR0FfVDI7CisKKwlpZiAoIHNhcmVhX3ByaXYtPndhcnBfcGlwZSAhPSBkZXZfcHJpdi0+d2FycF9waXBlICkgeworCQltZ2FfZzQwMF9lbWl0X3BpcGUoIGRldl9wcml2ICk7CisJCWRldl9wcml2LT53YXJwX3BpcGUgPSBzYXJlYV9wcml2LT53YXJwX3BpcGU7CisJfQorCisJaWYgKCBkaXJ0eSAmIE1HQV9VUExPQURfQ09OVEVYVCApIHsKKwkJbWdhX2c0MDBfZW1pdF9jb250ZXh0KCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+TUdBX1VQTE9BRF9DT05URVhUOworCX0KKworCWlmICggZGlydHkgJiBNR0FfVVBMT0FEX1RFWDAgKSB7CisJCW1nYV9nNDAwX2VtaXRfdGV4MCggZGV2X3ByaXYgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfk1HQV9VUExPQURfVEVYMDsKKwl9CisKKwlpZiAoIChkaXJ0eSAmIE1HQV9VUExPQURfVEVYMSkgJiYgbXVsdGl0ZXggKSB7CisJCW1nYV9nNDAwX2VtaXRfdGV4MSggZGV2X3ByaXYgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfk1HQV9VUExPQURfVEVYMTsKKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0FSRUEgc3RhdGUgdmVyaWZpY2F0aW9uCisgKi8KKworLyogRGlzYWxsb3cgYWxsIHdyaXRlIGRlc3RpbmF0aW9ucyBleGNlcHQgdGhlIGZyb250IGFuZCBiYWNrYnVmZmVyLgorICovCitzdGF0aWMgaW50IG1nYV92ZXJpZnlfY29udGV4dCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKworCWlmICggY3R4LT5kc3RvcmcgIT0gZGV2X3ByaXYtPmZyb250X29mZnNldCAmJgorCSAgICAgY3R4LT5kc3RvcmcgIT0gZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ICkgeworCQlEUk1fRVJST1IoICIqKiogYmFkIERTVE9SRzogJXggKGZyb250ICV4LCBiYWNrICV4KVxuXG4iLAorCQkJICAgY3R4LT5kc3RvcmcsIGRldl9wcml2LT5mcm9udF9vZmZzZXQsCisJCQkgICBkZXZfcHJpdi0+YmFja19vZmZzZXQgKTsKKwkJY3R4LT5kc3RvcmcgPSAwOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBEaXNhbGxvdyB0ZXh0dXJlIHJlYWRzIGZyb20gUENJIHNwYWNlLgorICovCitzdGF0aWMgaW50IG1nYV92ZXJpZnlfdGV4KCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCB1bml0ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX3RleHR1cmVfcmVnc190ICp0ZXggPSAmc2FyZWFfcHJpdi0+dGV4X3N0YXRlW3VuaXRdOworCXVuc2lnbmVkIGludCBvcmc7CisKKwlvcmcgPSB0ZXgtPnRleG9yZyAmIChNR0FfVEVYT1JHTUFQX01BU0sgfCBNR0FfVEVYT1JHQUNDX01BU0spOworCisJaWYgKCBvcmcgPT0gKE1HQV9URVhPUkdNQVBfU1lTTUVNIHwgTUdBX1RFWE9SR0FDQ19QQ0kpICkgeworCQlEUk1fRVJST1IoICIqKiogYmFkIFRFWE9SRzogMHgleCwgdW5pdCAlZFxuIiwKKwkJCSAgIHRleC0+dGV4b3JnLCB1bml0ICk7CisJCXRleC0+dGV4b3JnID0gMDsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2FfdmVyaWZ5X3N0YXRlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXVuc2lnbmVkIGludCBkaXJ0eSA9IHNhcmVhX3ByaXYtPmRpcnR5OworCWludCByZXQgPSAwOworCisJaWYgKCBzYXJlYV9wcml2LT5uYm94ID4gTUdBX05SX1NBUkVBX0NMSVBSRUNUUyApCisJCXNhcmVhX3ByaXYtPm5ib3ggPSBNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJaWYgKCBkaXJ0eSAmIE1HQV9VUExPQURfQ09OVEVYVCApCisJCXJldCB8PSBtZ2FfdmVyaWZ5X2NvbnRleHQoIGRldl9wcml2ICk7CisKKwlpZiAoIGRpcnR5ICYgTUdBX1VQTE9BRF9URVgwICkKKwkJcmV0IHw9IG1nYV92ZXJpZnlfdGV4KCBkZXZfcHJpdiwgMCApOworCisJaWYgKCBkZXZfcHJpdi0+Y2hpcHNldCA9PSBNR0FfQ0FSRF9UWVBFX0c0MDAgKSB7CisJCWlmICggZGlydHkgJiBNR0FfVVBMT0FEX1RFWDEgKQorCQkJcmV0IHw9IG1nYV92ZXJpZnlfdGV4KCBkZXZfcHJpdiwgMSApOworCisJCWlmICggZGlydHkgJiBNR0FfVVBMT0FEX1BJUEUgKQorCQkJcmV0IHw9ICggc2FyZWFfcHJpdi0+d2FycF9waXBlID4gTUdBX01BWF9HNDAwX1BJUEVTICk7CisJfSBlbHNlIHsKKwkJaWYgKCBkaXJ0eSAmIE1HQV9VUExPQURfUElQRSApCisJCQlyZXQgfD0gKCBzYXJlYV9wcml2LT53YXJwX3BpcGUgPiBNR0FfTUFYX0cyMDBfUElQRVMgKTsKKwl9CisKKwlyZXR1cm4gKCByZXQgPT0gMCApOworfQorCitzdGF0aWMgaW50IG1nYV92ZXJpZnlfaWxvYWQoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCSAgICAgdW5zaWduZWQgaW50IGRzdG9yZywgdW5zaWduZWQgaW50IGxlbmd0aCApCit7CisJaWYgKCBkc3RvcmcgPCBkZXZfcHJpdi0+dGV4dHVyZV9vZmZzZXQgfHwKKwkgICAgIGRzdG9yZyArIGxlbmd0aCA+IChkZXZfcHJpdi0+dGV4dHVyZV9vZmZzZXQgKworCQkJCWRldl9wcml2LT50ZXh0dXJlX3NpemUpICkgeworCQlEUk1fRVJST1IoICIqKiogYmFkIGlsb2FkIERTVE9SRzogMHgleFxuIiwgZHN0b3JnICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKCBsZW5ndGggJiBNR0FfSUxPQURfTUFTSyApIHsKKwkJRFJNX0VSUk9SKCAiKioqIGJhZCBpbG9hZCBsZW5ndGg6IDB4JXhcbiIsCisJCQkgICBsZW5ndGggJiBNR0FfSUxPQURfTUFTSyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1nYV92ZXJpZnlfYmxpdCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJICAgIHVuc2lnbmVkIGludCBzcmNvcmcsIHVuc2lnbmVkIGludCBkc3RvcmcgKQoreworCWlmICggKHNyY29yZyAmIDB4MykgPT0gKE1HQV9TUkNBQ0NfUENJIHwgTUdBX1NSQ01BUF9TWVNNRU0pIHx8CisJICAgICAoZHN0b3JnICYgMHgzKSA9PSAoTUdBX1NSQ0FDQ19QQ0kgfCBNR0FfU1JDTUFQX1NZU01FTSkgKSB7CisJCURSTV9FUlJPUiggIioqKiBiYWQgYmxpdDogc3JjPTB4JXggZHN0PTB4JXhcbiIsCisJCQkgICBzcmNvcmcsIGRzdG9yZyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfY2xlYXIoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgICBkcm1fbWdhX2NsZWFyX3QgKmNsZWFyICkKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwlpbnQgaTsKKwlETUFfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJQkVHSU5fRE1BKCAxICk7CisKKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9EV0dTWU5DLAkweDAwMDA3MTAwLAorCQkgICBNR0FfRFdHU1lOQywJMHgwMDAwNzAwMCApOworCisJQURWQU5DRV9ETUEoKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCWRybV9jbGlwX3JlY3RfdCAqYm94ID0gJnBib3hbaV07CisJCXUzMiBoZWlnaHQgPSBib3gtPnkyIC0gYm94LT55MTsKKworCQlEUk1fREVCVUcoICIgICBmcm9tPSVkLCVkIHRvPSVkLCVkXG4iLAorCQkJICAgYm94LT54MSwgYm94LT55MSwgYm94LT54MiwgYm94LT55MiApOworCisJCWlmICggY2xlYXItPmZsYWdzICYgTUdBX0ZST05UICkgeworCQkJQkVHSU5fRE1BKCAyICk7CisKKwkJCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJCQkgICBNR0FfUExOV1QsCWNsZWFyLT5jb2xvcl9tYXNrLAorCQkJCSAgIE1HQV9ZRFNUTEVOLCAoYm94LT55MSA8PCAxNikgfCBoZWlnaHQsCisJCQkJICAgTUdBX0ZYQk5EUlksIChib3gtPngyIDw8IDE2KSB8IGJveC0+eDEgKTsKKworCQkJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9GQ09MLAljbGVhci0+Y2xlYXJfY29sb3IsCisJCQkJICAgTUdBX0RTVE9SRywJZGV2X3ByaXYtPmZyb250X29mZnNldCwKKwkJCQkgICBNR0FfRFdHQ1RMICsgTUdBX0VYRUMsCisJCQkJCQlkZXZfcHJpdi0+Y2xlYXJfY21kICk7CisKKwkJCUFEVkFOQ0VfRE1BKCk7CisJCX0KKworCisJCWlmICggY2xlYXItPmZsYWdzICYgTUdBX0JBQ0sgKSB7CisJCQlCRUdJTl9ETUEoIDIgKTsKKworCQkJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9QTE5XVCwJY2xlYXItPmNvbG9yX21hc2ssCisJCQkJICAgTUdBX1lEU1RMRU4sIChib3gtPnkxIDw8IDE2KSB8IGhlaWdodCwKKwkJCQkgICBNR0FfRlhCTkRSWSwgKGJveC0+eDIgPDwgMTYpIHwgYm94LT54MSApOworCisJCQlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX0ZDT0wsCWNsZWFyLT5jbGVhcl9jb2xvciwKKwkJCQkgICBNR0FfRFNUT1JHLAlkZXZfcHJpdi0+YmFja19vZmZzZXQsCisJCQkJICAgTUdBX0RXR0NUTCArIE1HQV9FWEVDLAorCQkJCQkJZGV2X3ByaXYtPmNsZWFyX2NtZCApOworCisJCQlBRFZBTkNFX0RNQSgpOworCQl9CisKKwkJaWYgKCBjbGVhci0+ZmxhZ3MgJiBNR0FfREVQVEggKSB7CisJCQlCRUdJTl9ETUEoIDIgKTsKKworCQkJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9QTE5XVCwJY2xlYXItPmRlcHRoX21hc2ssCisJCQkJICAgTUdBX1lEU1RMRU4sIChib3gtPnkxIDw8IDE2KSB8IGhlaWdodCwKKwkJCQkgICBNR0FfRlhCTkRSWSwgKGJveC0+eDIgPDwgMTYpIHwgYm94LT54MSApOworCisJCQlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX0ZDT0wsCWNsZWFyLT5jbGVhcl9kZXB0aCwKKwkJCQkgICBNR0FfRFNUT1JHLAlkZXZfcHJpdi0+ZGVwdGhfb2Zmc2V0LAorCQkJCSAgIE1HQV9EV0dDVEwgKyBNR0FfRVhFQywKKwkJCQkJCWRldl9wcml2LT5jbGVhcl9jbWQgKTsKKworCQkJQURWQU5DRV9ETUEoKTsKKwkJfQorCisJfQorCisJQkVHSU5fRE1BKCAxICk7CisKKwkvKiBGb3JjZSByZXNldCBvZiBEV0dDVEwgKi8KKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9QTE5XVCwJY3R4LT5wbG53dCwKKwkJICAgTUdBX0RXR0NUTCwJY3R4LT5kd2djdGwgKTsKKworCUFEVkFOQ0VfRE1BKCk7CisKKwlGTFVTSF9ETUEoKTsKK30KKworc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9zd2FwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKwlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJaW50IGk7CisJRE1BX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCXNhcmVhX3ByaXYtPmxhc3RfZnJhbWUuaGVhZCA9IGRldl9wcml2LT5wcmltLnRhaWw7CisJc2FyZWFfcHJpdi0+bGFzdF9mcmFtZS53cmFwID0gZGV2X3ByaXYtPnByaW0ubGFzdF93cmFwOworCisJQkVHSU5fRE1BKCA0ICsgbmJveCApOworCisJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRFdHU1lOQywJMHgwMDAwNzEwMCwKKwkJICAgTUdBX0RXR1NZTkMsCTB4MDAwMDcwMDAgKTsKKworCURNQV9CTE9DSyggTUdBX0RTVE9SRywJZGV2X3ByaXYtPmZyb250X29mZnNldCwKKwkJICAgTUdBX01BQ0NFU1MsCWRldl9wcml2LT5tYWNjZXNzLAorCQkgICBNR0FfU1JDT1JHLAlkZXZfcHJpdi0+YmFja19vZmZzZXQsCisJCSAgIE1HQV9BUjUsCWRldl9wcml2LT5mcm9udF9waXRjaCApOworCisJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfUExOV1QsCTB4ZmZmZmZmZmYsCisJCSAgIE1HQV9EV0dDVEwsCU1HQV9EV0dDVExfQ09QWSApOworCisJZm9yICggaSA9IDAgOyBpIDwgbmJveCA7IGkrKyApIHsKKwkJZHJtX2NsaXBfcmVjdF90ICpib3ggPSAmcGJveFtpXTsKKwkJdTMyIGhlaWdodCA9IGJveC0+eTIgLSBib3gtPnkxOworCQl1MzIgc3RhcnQgPSBib3gtPnkxICogZGV2X3ByaXYtPmZyb250X3BpdGNoOworCisJCURSTV9ERUJVRyggIiAgIGZyb209JWQsJWQgdG89JWQsJWRcbiIsCisJCQkgICBib3gtPngxLCBib3gtPnkxLCBib3gtPngyLCBib3gtPnkyICk7CisKKwkJRE1BX0JMT0NLKCBNR0FfQVIwLAlzdGFydCArIGJveC0+eDIgLSAxLAorCQkJICAgTUdBX0FSMywJc3RhcnQgKyBib3gtPngxLAorCQkJICAgTUdBX0ZYQk5EUlksCSgoYm94LT54MiAtIDEpIDw8IDE2KSB8IGJveC0+eDEsCisJCQkgICBNR0FfWURTVExFTiArIE1HQV9FWEVDLAorCQkJCQkoYm94LT55MSA8PCAxNikgfCBoZWlnaHQgKTsKKwl9CisKKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9QTE5XVCwJY3R4LT5wbG53dCwKKwkJICAgTUdBX1NSQ09SRywJZGV2X3ByaXYtPmZyb250X29mZnNldCwKKwkJICAgTUdBX0RXR0NUTCwJY3R4LT5kd2djdGwgKTsKKworCUFEVkFOQ0VfRE1BKCk7CisKKwlGTFVTSF9ETUEoKTsKKworCURSTV9ERUJVRyggIiVzLi4uIGRvbmUuXG4iLCBfX0ZVTkNUSU9OX18gKTsKK30KKworc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZiApCit7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwl1MzIgYWRkcmVzcyA9ICh1MzIpIGJ1Zi0+YnVzX2FkZHJlc3M7CisJdTMyIGxlbmd0aCA9ICh1MzIpIGJ1Zi0+dXNlZDsKKwlpbnQgaSA9IDA7CisJRE1BX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJ2ZXJ0ZXg6IGJ1Zj0lZCB1c2VkPSVkXG4iLCBidWYtPmlkeCwgYnVmLT51c2VkICk7CisKKwlpZiAoIGJ1Zi0+dXNlZCApIHsKKwkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAxOworCisJCU1HQV9FTUlUX1NUQVRFKCBkZXZfcHJpdiwgc2FyZWFfcHJpdi0+ZGlydHkgKTsKKworCQlkbyB7CisJCQlpZiAoIGkgPCBzYXJlYV9wcml2LT5uYm94ICkgeworCQkJCW1nYV9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsCisJCQkJCQkgICAgJnNhcmVhX3ByaXYtPmJveGVzW2ldICk7CisJCQl9CisKKwkJCUJFR0lOX0RNQSggMSApOworCisJCQlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9TRUNBRERSRVNTLAkoYWRkcmVzcyB8CisJCQkJCQkJIE1HQV9ETUFfVkVSVEVYKSwKKwkJCQkgICBNR0FfU0VDRU5ELAkJKChhZGRyZXNzICsgbGVuZ3RoKSB8CisJCQkJCQkJIE1HQV9QQUdQWEZFUikgKTsKKworCQkJQURWQU5DRV9ETUEoKTsKKwkJfSB3aGlsZSAoICsraSA8IHNhcmVhX3ByaXYtPm5ib3ggKTsKKwl9CisKKwlpZiAoIGJ1Zl9wcml2LT5kaXNjYXJkICkgeworCQlBR0VfQlVGRkVSKCBidWZfcHJpdiApOworCQlidWYtPnBlbmRpbmcgPSAwOworCQlidWYtPnVzZWQgPSAwOworCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDA7CisKKwkJbWdhX2ZyZWVsaXN0X3B1dCggZGV2LCBidWYgKTsKKwl9CisKKwlGTFVTSF9ETUEoKTsKK30KKworc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9pbmRpY2VzKCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2J1Zl90ICpidWYsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgZW5kICkKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXUzMiBhZGRyZXNzID0gKHUzMikgYnVmLT5idXNfYWRkcmVzczsKKwlpbnQgaSA9IDA7CisJRE1BX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJpbmRpY2VzOiBidWY9JWQgc3RhcnQ9JWQgZW5kPSVkXG4iLCBidWYtPmlkeCwgc3RhcnQsIGVuZCApOworCisJaWYgKCBzdGFydCAhPSBlbmQgKSB7CisJCWJ1Zl9wcml2LT5kaXNwYXRjaGVkID0gMTsKKworCQlNR0FfRU1JVF9TVEFURSggZGV2X3ByaXYsIHNhcmVhX3ByaXYtPmRpcnR5ICk7CisKKwkJZG8geworCQkJaWYgKCBpIDwgc2FyZWFfcHJpdi0+bmJveCApIHsKKwkJCQltZ2FfZW1pdF9jbGlwX3JlY3QoIGRldl9wcml2LAorCQkJCQkJICAgICZzYXJlYV9wcml2LT5ib3hlc1tpXSApOworCQkJfQorCisJCQlCRUdJTl9ETUEoIDEgKTsKKworCQkJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCwKKwkJCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCwKKwkJCQkgICBNR0FfU0VUVVBBRERSRVNTLAlhZGRyZXNzICsgc3RhcnQsCisJCQkJICAgTUdBX1NFVFVQRU5ELAkoKGFkZHJlc3MgKyBlbmQpIHwKKwkJCQkJCQkgTUdBX1BBR1BYRkVSKSApOworCisJCQlBRFZBTkNFX0RNQSgpOworCQl9IHdoaWxlICggKytpIDwgc2FyZWFfcHJpdi0+bmJveCApOworCX0KKworCWlmICggYnVmX3ByaXYtPmRpc2NhcmQgKSB7CisJCUFHRV9CVUZGRVIoIGJ1Zl9wcml2ICk7CisJCWJ1Zi0+cGVuZGluZyA9IDA7CisJCWJ1Zi0+dXNlZCA9IDA7CisJCWJ1Zl9wcml2LT5kaXNwYXRjaGVkID0gMDsKKworCQltZ2FfZnJlZWxpc3RfcHV0KCBkZXYsIGJ1ZiApOworCX0KKworCUZMVVNIX0RNQSgpOworfQorCisvKiBUaGlzIGNvcGllcyBhIDY0IGJ5dGUgYWxpZ25lZCBhZ3AgcmVnaW9uIHRvIHRoZSBmcmFtYnVmZmVyIHdpdGggYQorICogc3RhbmRhcmQgYmxpdCwgdGhlIGlvY3RsIG5lZWRzIHRvIGRvIGNoZWNraW5nLgorICovCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2lsb2FkKCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2J1Zl90ICpidWYsCisJCQkJICAgIHVuc2lnbmVkIGludCBkc3RvcmcsIHVuc2lnbmVkIGludCBsZW5ndGggKQoreworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJmRldl9wcml2LT5zYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCXUzMiBzcmNvcmcgPSBidWYtPmJ1c19hZGRyZXNzIHwgTUdBX1NSQ0FDQ19BR1AgfCBNR0FfU1JDTUFQX1NZU01FTTsKKwl1MzIgeTI7CisJRE1BX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJidWY9JWQgdXNlZD0lZFxuIiwgYnVmLT5pZHgsIGJ1Zi0+dXNlZCApOworCisJeTIgPSBsZW5ndGggLyA2NDsKKworCUJFR0lOX0RNQSggNSApOworCisJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRFdHU1lOQywJMHgwMDAwNzEwMCwKKwkJICAgTUdBX0RXR1NZTkMsCTB4MDAwMDcwMDAgKTsKKworCURNQV9CTE9DSyggTUdBX0RTVE9SRywJZHN0b3JnLAorCQkgICBNR0FfTUFDQ0VTUywJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1NSQ09SRywJc3Jjb3JnLAorCQkgICBNR0FfQVI1LAk2NCApOworCisJRE1BX0JMT0NLKCBNR0FfUElUQ0gsCTY0LAorCQkgICBNR0FfUExOV1QsCTB4ZmZmZmZmZmYsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9EV0dDVEwsCU1HQV9EV0dDVExfQ09QWSApOworCisJRE1BX0JMT0NLKCBNR0FfQVIwLAk2MywKKwkJICAgTUdBX0FSMywJMCwKKwkJICAgTUdBX0ZYQk5EUlksCSg2MyA8PCAxNikgfCAwLAorCQkgICBNR0FfWURTVExFTiArIE1HQV9FWEVDLCB5MiApOworCisJRE1BX0JMT0NLKCBNR0FfUExOV1QsCWN0eC0+cGxud3QsCisJCSAgIE1HQV9TUkNPUkcsCWRldl9wcml2LT5mcm9udF9vZmZzZXQsCisJCSAgIE1HQV9QSVRDSCwJZGV2X3ByaXYtPmZyb250X3BpdGNoLAorCQkgICBNR0FfRFdHU1lOQywJMHgwMDAwNzAwMCApOworCisJQURWQU5DRV9ETUEoKTsKKworCUFHRV9CVUZGRVIoIGJ1Zl9wcml2ICk7CisKKwlidWYtPnBlbmRpbmcgPSAwOworCWJ1Zi0+dXNlZCA9IDA7CisJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCisJbWdhX2ZyZWVsaXN0X3B1dCggZGV2LCBidWYgKTsKKworCUZMVVNIX0RNQSgpOworfQorCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2JsaXQoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgIGRybV9tZ2FfYmxpdF90ICpibGl0ICkKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwl1MzIgc2NhbmRpciA9IDAsIGk7CisJRE1BX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUJFR0lOX0RNQSggNCArIG5ib3ggKTsKKworCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RXR1NZTkMsCTB4MDAwMDcxMDAsCisJCSAgIE1HQV9EV0dTWU5DLAkweDAwMDA3MDAwICk7CisKKwlETUFfQkxPQ0soIE1HQV9EV0dDVEwsCU1HQV9EV0dDVExfQ09QWSwKKwkJICAgTUdBX1BMTldULAlibGl0LT5wbGFuZW1hc2ssCisJCSAgIE1HQV9TUkNPUkcsCWJsaXQtPnNyY29yZywKKwkJICAgTUdBX0RTVE9SRywJYmxpdC0+ZHN0b3JnICk7CisKKwlETUFfQkxPQ0soIE1HQV9TR04sCXNjYW5kaXIsCisJCSAgIE1HQV9NQUNDRVNTLAlkZXZfcHJpdi0+bWFjY2VzcywKKwkJICAgTUdBX0FSNSwJYmxpdC0+eWRpciAqIGJsaXQtPnNyY19waXRjaCwKKwkJICAgTUdBX1BJVENILAlibGl0LT5kc3RfcGl0Y2ggKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCWludCBzcmN4ID0gcGJveFtpXS54MSArIGJsaXQtPmRlbHRhX3N4OworCQlpbnQgc3JjeSA9IHBib3hbaV0ueTEgKyBibGl0LT5kZWx0YV9zeTsKKwkJaW50IGRzdHggPSBwYm94W2ldLngxICsgYmxpdC0+ZGVsdGFfZHg7CisJCWludCBkc3R5ID0gcGJveFtpXS55MSArIGJsaXQtPmRlbHRhX2R5OworCQlpbnQgaCA9IHBib3hbaV0ueTIgLSBwYm94W2ldLnkxOworCQlpbnQgdyA9IHBib3hbaV0ueDIgLSBwYm94W2ldLngxIC0gMTsKKwkJaW50IHN0YXJ0OworCisJCWlmICggYmxpdC0+eWRpciA9PSAtMSApIHsKKwkJCXNyY3kgPSBibGl0LT5oZWlnaHQgLSBzcmN5IC0gMTsKKwkJfQorCisJCXN0YXJ0ID0gc3JjeSAqIGJsaXQtPnNyY19waXRjaCArIHNyY3g7CisKKwkJRE1BX0JMT0NLKCBNR0FfQVIwLAlzdGFydCArIHcsCisJCQkgICBNR0FfQVIzLAlzdGFydCwKKwkJCSAgIE1HQV9GWEJORFJZLAkoKGRzdHggKyB3KSA8PCAxNikgfCAoZHN0eCAmIDB4ZmZmZiksCisJCQkgICBNR0FfWURTVExFTiArIE1HQV9FWEVDLCAoZHN0eSA8PCAxNikgfCBoICk7CisJfQorCisJLyogRG8gc29tZXRoaW5nIHRvIGZsdXNoIEFHUD8KKwkgKi8KKworCS8qIEZvcmNlIHJlc2V0IG9mIERXR0NUTCAqLworCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1BMTldULAljdHgtPnBsbnd0LAorCQkgICBNR0FfUElUQ0gsCWRldl9wcml2LT5mcm9udF9waXRjaCwKKwkJICAgTUdBX0RXR0NUTCwJY3R4LT5kd2djdGwgKTsKKworCUFEVkFOQ0VfRE1BKCk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCitzdGF0aWMgaW50IG1nYV9kbWFfY2xlYXIoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV9jbGVhcl90IGNsZWFyOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggY2xlYXIsIChkcm1fbWdhX2NsZWFyX3QgX191c2VyICopZGF0YSwgc2l6ZW9mKGNsZWFyKSApOworCisJaWYgKCBzYXJlYV9wcml2LT5uYm94ID4gTUdBX05SX1NBUkVBX0NMSVBSRUNUUyApCisJCXNhcmVhX3ByaXYtPm5ib3ggPSBNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJV1JBUF9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJbWdhX2RtYV9kaXNwYXRjaF9jbGVhciggZGV2LCAmY2xlYXIgKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCisJICovCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmRpcnR5IHw9IE1HQV9VUExPQURfQ09OVEVYVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1nYV9kbWFfc3dhcCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoIHNhcmVhX3ByaXYtPm5ib3ggPiBNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTICkKKwkJc2FyZWFfcHJpdi0+bmJveCA9IE1HQV9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlXUkFQX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwltZ2FfZG1hX2Rpc3BhdGNoX3N3YXAoIGRldiApOworCisJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KKwkgKi8KKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+ZGlydHkgfD0gTUdBX1VQTE9BRF9DT05URVhUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWdhX2RtYV92ZXJ0ZXgoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fbWdhX3ZlcnRleF90IHZlcnRleDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHZlcnRleCwKKwkJCSAgICAgKGRybV9tZ2FfdmVydGV4X3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHZlcnRleCkgKTsKKworICAgICAgICBpZih2ZXJ0ZXguaWR4IDwgMCB8fCB2ZXJ0ZXguaWR4ID4gZG1hLT5idWZfY291bnQpIHJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJYnVmID0gZG1hLT5idWZsaXN0W3ZlcnRleC5pZHhdOworCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCWJ1Zi0+dXNlZCA9IHZlcnRleC51c2VkOworCWJ1Zl9wcml2LT5kaXNjYXJkID0gdmVydGV4LmRpc2NhcmQ7CisKKwlpZiAoICFtZ2FfdmVyaWZ5X3N0YXRlKCBkZXZfcHJpdiApICkgeworCQlpZiAoIHZlcnRleC5kaXNjYXJkICkgeworCQkJaWYgKCBidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9PSAxICkKKwkJCQlBR0VfQlVGRkVSKCBidWZfcHJpdiApOworCQkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCQkJbWdhX2ZyZWVsaXN0X3B1dCggZGV2LCBidWYgKTsKKwkJfQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCVdSQVBfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCW1nYV9kbWFfZGlzcGF0Y2hfdmVydGV4KCBkZXYsIGJ1ZiApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWdhX2RtYV9pbmRpY2VzKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdCAqYnVmOworCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJZHJtX21nYV9pbmRpY2VzX3QgaW5kaWNlczsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGluZGljZXMsCisJCQkgICAgIChkcm1fbWdhX2luZGljZXNfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YoaW5kaWNlcykgKTsKKworICAgICAgICBpZihpbmRpY2VzLmlkeCA8IDAgfHwgaW5kaWNlcy5pZHggPiBkbWEtPmJ1Zl9jb3VudCkgcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpbmRpY2VzLmlkeF07CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJYnVmX3ByaXYtPmRpc2NhcmQgPSBpbmRpY2VzLmRpc2NhcmQ7CisKKwlpZiAoICFtZ2FfdmVyaWZ5X3N0YXRlKCBkZXZfcHJpdiApICkgeworCQlpZiAoIGluZGljZXMuZGlzY2FyZCApIHsKKwkJCWlmICggYnVmX3ByaXYtPmRpc3BhdGNoZWQgPT0gMSApCisJCQkJQUdFX0JVRkZFUiggYnVmX3ByaXYgKTsKKwkJCWJ1Zl9wcml2LT5kaXNwYXRjaGVkID0gMDsKKwkJCW1nYV9mcmVlbGlzdF9wdXQoIGRldiwgYnVmICk7CisJCX0KKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlXUkFQX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwltZ2FfZG1hX2Rpc3BhdGNoX2luZGljZXMoIGRldiwgYnVmLCBpbmRpY2VzLnN0YXJ0LCBpbmRpY2VzLmVuZCApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWdhX2RtYV9pbG9hZCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWRybV9tZ2FfaWxvYWRfdCBpbG9hZDsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGlsb2FkLCAoZHJtX21nYV9pbG9hZF90IF9fdXNlciAqKWRhdGEsIHNpemVvZihpbG9hZCkgKTsKKworI2lmIDAKKwlpZiAoIG1nYV9kb193YWl0X2Zvcl9pZGxlKCBkZXZfcHJpdiApIDwgMCApIHsKKwkJaWYgKCBNR0FfRE1BX0RFQlVHICkKKwkJCURSTV9JTkZPKCAiJXM6IC1FQlVTWVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKKwl9CisjZW5kaWYKKyAgICAgICAgaWYoaWxvYWQuaWR4IDwgMCB8fCBpbG9hZC5pZHggPiBkbWEtPmJ1Zl9jb3VudCkgcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpbG9hZC5pZHhdOworCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCWlmICggbWdhX3ZlcmlmeV9pbG9hZCggZGV2X3ByaXYsIGlsb2FkLmRzdG9yZywgaWxvYWQubGVuZ3RoICkgKSB7CisJCW1nYV9mcmVlbGlzdF9wdXQoIGRldiwgYnVmICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJV1JBUF9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJbWdhX2RtYV9kaXNwYXRjaF9pbG9hZCggZGV2LCBidWYsIGlsb2FkLmRzdG9yZywgaWxvYWQubGVuZ3RoICk7CisKKwkvKiBNYWtlIHN1cmUgd2UgcmVzdG9yZSB0aGUgM0Qgc3RhdGUgbmV4dCB0aW1lLgorCSAqLworCWRldl9wcml2LT5zYXJlYV9wcml2LT5kaXJ0eSB8PSBNR0FfVVBMT0FEX0NPTlRFWFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2FfZG1hX2JsaXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV9ibGl0X3QgYmxpdDsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGJsaXQsIChkcm1fbWdhX2JsaXRfdCBfX3VzZXIgKilkYXRhLCBzaXplb2YoYmxpdCkgKTsKKworCWlmICggc2FyZWFfcHJpdi0+bmJveCA+IE1HQV9OUl9TQVJFQV9DTElQUkVDVFMgKQorCQlzYXJlYV9wcml2LT5uYm94ID0gTUdBX05SX1NBUkVBX0NMSVBSRUNUUzsKKworCWlmICggbWdhX3ZlcmlmeV9ibGl0KCBkZXZfcHJpdiwgYmxpdC5zcmNvcmcsIGJsaXQuZHN0b3JnICkgKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJV1JBUF9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJbWdhX2RtYV9kaXNwYXRjaF9ibGl0KCBkZXYsICZibGl0ICk7CisKKwkvKiBNYWtlIHN1cmUgd2UgcmVzdG9yZSB0aGUgM0Qgc3RhdGUgbmV4dCB0aW1lLgorCSAqLworCWRldl9wcml2LT5zYXJlYV9wcml2LT5kaXJ0eSB8PSBNR0FfVVBMT0FEX0NPTlRFWFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2FfZ2V0cGFyYW0oIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9nZXRwYXJhbV90IHBhcmFtOworCWludCB2YWx1ZTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBwYXJhbSwgKGRybV9tZ2FfZ2V0cGFyYW1fdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YocGFyYW0pICk7CisKKwlEUk1fREVCVUcoICJwaWQ9JWRcbiIsIERSTV9DVVJSRU5UUElEICk7CisKKwlzd2l0Y2goIHBhcmFtLnBhcmFtICkgeworCWNhc2UgTUdBX1BBUkFNX0lSUV9OUjoKKwkJdmFsdWUgPSBkZXYtPmlycTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIERSTV9DT1BZX1RPX1VTRVIoIHBhcmFtLnZhbHVlLCAmdmFsdWUsIHNpemVvZihpbnQpICkgKSB7CisJCURSTV9FUlJPUiggImNvcHlfdG9fdXNlclxuIiApOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworZHJtX2lvY3RsX2Rlc2NfdCBtZ2FfaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0lOSVQpXSAgICA9IHsgbWdhX2RtYV9pbml0LCAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0ZMVVNIKV0gICA9IHsgbWdhX2RtYV9mbHVzaCwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX1JFU0VUKV0gICA9IHsgbWdhX2RtYV9yZXNldCwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX1NXQVApXSAgICA9IHsgbWdhX2RtYV9zd2FwLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0NMRUFSKV0gICA9IHsgbWdhX2RtYV9jbGVhciwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX1ZFUlRFWCldICA9IHsgbWdhX2RtYV92ZXJ0ZXgsICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0lORElDRVMpXSA9IHsgbWdhX2RtYV9pbmRpY2VzLCAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0lMT0FEKV0gICA9IHsgbWdhX2RtYV9pbG9hZCwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0JMSVQpXSAgICA9IHsgbWdhX2RtYV9ibGl0LCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0dFVFBBUkFNKV09IHsgbWdhX2dldHBhcmFtLCAgICAxLCAwIH0sCit9OworCitpbnQgbWdhX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKG1nYV9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfdWNvZGUuaCBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX3Vjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwZjgyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX3Vjb2RlLmgKQEAgLTAsMCArMSwxMTY0NSBAQAorLyogbWdhX3Vjb2RlLmggLS0gTWF0cm94IEcyMDAvRzQwMCBXQVJQIGVuZ2luZSBtaWNyb2NvZGUgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBUaHUgSmFuIDExIDIxOjIwOjQzIDIwMDEgYnkgZ2FyZXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgTWF0cm94IEdyYXBoaWNzIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBNQVRST1ggR1JBUEhJQ1MgSU5DLiwgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFCisgKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBLZXJuZWwtYmFzZWQgV0FSUCBlbmdpbmUgbWFuYWdlbWVudDoKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogV0FSUCBwaXBlcyBhcmUgbmFtZWQgYWNjb3JkaW5nIHRvIHRoZSBmdW5jdGlvbnMgdGhleSBwZXJmb3JtLCB3aGVyZToKKyAqCisgKiAgIC0gVCBzdGFuZHMgZm9yIGNvbXB1dGF0aW9uIG9mIHRleHR1cmUgc3RhZ2UgMAorICogICAtIFQyIHN0YW5kcyBmb3IgY29tcHV0YXRpb24gb2YgYm90aCB0ZXh0dXJlIHN0YWdlIDAgYW5kIHRleHR1cmUgc3RhZ2UgMQorICogICAtIEcgc3RhbmRzIGZvciBjb21wdXRhdGlvbiBvZiB0cmlhbmdsZSBpbnRlbnNpdHkgKEdvdXJhdWQgaW50ZXJwb2xhdGlvbikKKyAqICAgLSBaIHN0YW5kcyBmb3IgY29tcHV0YXRpb24gb2YgWiBidWZmZXIgaW50ZXJwb2xhdGlvbgorICogICAtIFMgc3RhbmRzIGZvciBjb21wdXRhdGlvbiBvZiBzcGVjdWxhciBoaWdobGlnaHQKKyAqICAgLSBBIHN0YW5kcyBmb3IgY29tcHV0YXRpb24gb2YgdGhlIGFscGhhIGNoYW5uZWwKKyAqICAgLSBGIHN0YW5kcyBmb3IgY29tcHV0YXRpb24gb2YgdmVydGV4IGZvZyBpbnRlcnBvbGF0aW9uCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nMjAwX3RneltdID0geworCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4OTgsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxRiwgMHhENywgMHgxOCwgMHhCRCwKKzB4M0YsIDB4RDcsIDB4MjIsIDB4QkQsCisKKzB4ODEsIDB4MDQsCisweDg5LCAweDA0LAorMHgwMSwgMHgwNCwKKzB4MDksIDB4MDQsCisKKzB4QzksIDB4NDEsIDB4QzAsIDB4RUMsCisweDExLCAweDA0LAorMHgwMCwgMHhFMCwKKworMHg0MSwgMHhDQywgMHg0MSwgMHhDRCwKKzB4NDksIDB4Q0MsIDB4NDksIDB4Q0QsCisKKzB4RDEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDUxLCAweENDLCAweDUxLCAweENELAorCisweDgwLCAweDA0LAorMHgxMCwgMHgwNCwKKzB4MDgsIDB4MDQsCisweDAwLCAweEUwLAorCisweDAwLCAweENDLCAweEMwLCAweENELAorMHhEMSwgMHg0OSwgMHhDMCwgMHhFQywKKworMHg4QSwgMHgxRiwgMHgyMCwgMHhFOSwKKzB4OEIsIDB4M0YsIDB4MjAsIDB4RTksCisKKzB4NDEsIDB4M0MsIDB4NDEsIDB4QUQsCisweDQ5LCAweDNDLCAweDQ5LCAweEFELAorCisweDEwLCAweENDLCAweDEwLCAweENELAorMHgwOCwgMHhDQywgMHgwOCwgMHhDRCwKKworMHhCOSwgMHg0MSwgMHg0OSwgMHhCQiwKKzB4MUYsIDB4RjAsIDB4NDEsIDB4Q0QsCisKKzB4NTEsIDB4M0MsIDB4NTEsIDB4QUQsCisweDAwLCAweDk4LCAweDgwLCAweEU5LAorCisweDcyLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHgxRiwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MUQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MkUsIDB4NDEsIDB4MkEsIDB4QjgsCisweDM0LCAweDUzLCAweEEwLCAweEU4LAorCisweDE1LCAweDMwLAorMHgxRCwgMHgzMCwKKzB4NTgsIDB4RTMsCisweDAwLCAweEUwLAorCisweEI1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgyNCwgMHg0MywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MTUsIDB4NzIsCisweDA5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4NzIsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4OTcsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDZDLCAweDY0LCAweEM4LCAweEVDLAorMHg5OCwgMHhFMSwKKzB4QjUsIDB4MDUsCisKKzB4QkQsIDB4MDUsCisweDJFLCAweDMwLAorMHgzMiwgMHhDMCwgMHhBMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHhBMCwgMHhFOCwKKzB4NzQsIDB4NjQsIDB4QzgsIDB4RUMsCisKKzB4NDAsIDB4M0MsIDB4NDAsIDB4QUQsCisweDMyLCAweDZBLAorMHgyQSwgMHgzMCwKKworMHgyMCwgMHg3MywKKzB4MzMsIDB4NkEsCisweDAwLCAweEUwLAorMHgyOCwgMHg3MywKKworMHgxQywgMHg3MiwKKzB4ODMsIDB4RTIsCisweDYwLCAweDgwLCAweDE1LCAweEVBLAorCisweEI4LCAweDNELCAweDI4LCAweERGLAorMHgzMCwgMHgzNSwgMHgyMCwgMHhERiwKKworMHg0MCwgMHgzMCwKKzB4MDAsIDB4RTAsCisweENDLCAweEUyLAorMHg2NCwgMHg3MiwKKworMHgyNSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MkQsIDB4NDIsIDB4NEEsIDB4QkYsCisKKzB4MzAsIDB4MkUsIDB4MzAsIDB4REYsCisweDM4LCAweDJFLCAweDM4LCAweERGLAorCisweDE4LCAweDFELCAweDQ1LCAweEU5LAorMHgxRSwgMHgxNSwgMHg0NSwgMHhFOSwKKworMHgyQiwgMHg0OSwgMHg1MSwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDczLAorCisweDM4LCAweDM4LCAweDQwLCAweEFGLAorMHgzMCwgMHgzMCwgMHg0MCwgMHhBRiwKKworMHgyNCwgMHgxRiwgMHgyNCwgMHhERiwKKzB4MUQsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MkMsIDB4MUYsIDB4MkMsIDB4REYsCisweDFBLCAweDMzLCAweDIwLCAweEU5LAorCisweEIwLCAweDEwLAorMHgwOCwgMHhFMywKKzB4NDAsIDB4MTAsCisweEI4LCAweDEwLAorCisweDI2LCAweEYwLCAweDMwLCAweENELAorMHgyRiwgMHhGMCwgMHgzOCwgMHhDRCwKKworMHgyQiwgMHg4MCwgMHgyMCwgMHhFOSwKKzB4MkEsIDB4ODAsIDB4MjAsIDB4RTksCisKKzB4QTYsIDB4MjAsCisweDg4LCAweEUyLAorMHgwMCwgMHhFMCwKKzB4QUYsIDB4MjAsCisKKzB4MjgsIDB4MkEsIDB4MjYsIDB4QUYsCisweDIwLCAweDJBLCAweEMwLCAweEFGLAorCisweDM0LCAweDFGLCAweDM0LCAweERGLAorMHg0NiwgMHgyNCwgMHg0NiwgMHhERiwKKworMHgyOCwgMHgzMCwgMHg4MCwgMHhCRiwKKzB4MjAsIDB4MzgsIDB4ODAsIDB4QkYsCisKKzB4NDcsIDB4MjQsIDB4NDcsIDB4REYsCisweDRFLCAweDJDLCAweDRFLCAweERGLAorCisweDRGLCAweDJDLCAweDRGLCAweERGLAorMHg1NiwgMHgzNCwgMHg1NiwgMHhERiwKKworMHgyOCwgMHgxNSwgMHgyOCwgMHhERiwKKzB4MjAsIDB4MUQsIDB4MjAsIDB4REYsCisKKzB4NTcsIDB4MzQsIDB4NTcsIDB4REYsCisweDAwLCAweEUwLAorMHgxRCwgMHgwNSwKKworMHgwNCwgMHg4MCwgMHgxMCwgMHhFQSwKKzB4ODksIDB4RTIsCisweDJCLCAweDMwLAorCisweDNGLCAweEMxLCAweDFELCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QTAsIDB4NjgsCisweEJGLCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMCwgMHhDMCwgMHgyMCwgMHhBRiwKKzB4MjgsIDB4MDUsCisweDk3LCAweDc0LAorCisweDAwLCAweEUwLAorMHgyQSwgMHgxMCwKKzB4MTYsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDhDLCAweEUyLAorMHg5NSwgMHgwNSwKKworMHgyOCwgMHhDMSwgMHgyOCwgMHhBRCwKKzB4MUYsIDB4QzEsIDB4MTUsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEE4LCAweDY3LAorMHg5RiwgMHg2QiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjgsIDB4QzAsIDB4MjgsIDB4QUQsCisweDFELCAweDI1LAorMHgyMCwgMHgwNSwKKworMHgyOCwgMHgzMiwgMHg4MCwgMHhBRCwKKzB4NDAsIDB4MkEsIDB4NDAsIDB4QkQsCisKKzB4MUMsIDB4ODAsIDB4MjAsIDB4RTksCisweDIwLCAweDMzLCAweDIwLCAweEFELAorCisweDIwLCAweDczLAorMHgwMCwgMHhFMCwKKzB4QjYsIDB4NDksIDB4NTEsIDB4QkIsCisKKzB4MjYsIDB4MkYsIDB4QjAsIDB4RTgsCisweDE5LCAweDIwLCAweDIwLCAweEU5LAorCisweDM1LCAweDIwLCAweDM1LCAweERGLAorMHgzRCwgMHgyMCwgMHgzRCwgMHhERiwKKworMHgxNSwgMHgyMCwgMHgxNSwgMHhERiwKKzB4MUQsIDB4MjAsIDB4MUQsIDB4REYsCisKKzB4MjYsIDB4RDAsIDB4MjYsIDB4Q0QsCisweDI5LCAweDQ5LCAweDJBLCAweEI4LAorCisweDI2LCAweDQwLCAweDgwLCAweEJELAorMHgzQiwgMHg0OCwgMHg1MCwgMHhCRCwKKworMHgzRSwgMHg1NCwgMHg1NywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDgyLCAweEUxLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNiwgMHgzMCwKKzB4MjksIDB4MzAsCisweDQ4LCAweDNDLCAweDQ4LCAweEFELAorCisweDJCLCAweDcyLAorMHhDMiwgMHhFMSwKKzB4MkMsIDB4QzAsIDB4NDQsIDB4QzIsCisKKzB4MDUsIDB4MjQsIDB4MzQsIDB4QkYsCisweDBELCAweDI0LCAweDJDLCAweEJGLAorCisweDJELCAweDQ2LCAweDRFLCAweEJGLAorMHgyNSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgyMCwgMHgxRCwgMHg2RiwgMHg4RiwKKzB4MzIsIDB4M0UsIDB4NUYsIDB4RTksCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgzQiwgMHgzMCwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzMsIDB4MUUsIDB4NUYsIDB4RTksCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjIsCisweDBELCAweDQ0LCAweDRDLCAweEIyLAorCisweDE5LCAweEMwLCAweEIwLCAweEU4LAorMHgzNCwgMHhDMCwgMHg0NCwgMHhDNCwKKworMHgzMywgMHg3MywKKzB4MDAsIDB4RTAsCisweDNFLCAweDYyLCAweDU3LCAweDlGLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4MjAsCisKKzB4ODQsIDB4M0UsIDB4NTgsIDB4RTksCisweDI4LCAweDFELCAweDZGLCAweDhGLAorCisweDA1LCAweDIwLAorMHgwMCwgMHhFMCwKKzB4ODUsIDB4MUUsIDB4NTgsIDB4RTksCisKKzB4OUIsIDB4M0IsIDB4MzMsIDB4REYsCisweDIwLCAweDIwLCAweDQyLCAweEFGLAorCisweDMwLCAweDQyLCAweDU2LCAweDlGLAorMHg4MCwgMHgzRSwgMHg1NywgMHhFOSwKKworMHgzRiwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzAsIDB4ODAsIDB4NUYsIDB4RTksCisKKzB4MjgsIDB4MjgsIDB4MjQsIDB4QUYsCisweDgxLCAweDFFLCAweDU3LCAweEU5LAorCisweDA1LCAweDQ3LCAweDU3LCAweEJGLAorMHgwRCwgMHg0NywgMHg0RiwgMHhCRiwKKworMHg4OCwgMHg4MCwgMHg1OCwgMHhFOSwKKzB4MUIsIDB4MjksIDB4MUIsIDB4REYsCisKKzB4MzAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDNBLCAweDMwLCAweDRGLCAweEU5LAorCisweDFDLCAweDMwLCAweDI2LCAweERGLAorMHgwOSwgMHhFMywKKzB4M0IsIDB4MDUsCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDNCLCAweDNGLCAweDRGLCAweEU5LAorCisweDFFLCAweDhGLCAweDUxLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4QUMsIDB4MjAsCisKKzB4MkQsIDB4NDQsIDB4NEMsIDB4QjQsCisweDJDLCAweDFDLCAweEMwLCAweEFGLAorCisweDI1LCAweDQ0LCAweDU0LCAweEI0LAorMHgwMCwgMHhFMCwKKzB4QzgsIDB4MzAsCisKKzB4MzAsIDB4NDYsIDB4MzAsIDB4QUYsCisweDFCLCAweDFCLCAweDQ4LCAweEFGLAorCisweDAwLCAweEUwLAorMHgyNSwgMHgyMCwKKzB4MzgsIDB4MkMsIDB4NEYsIDB4RTksCisKKzB4ODYsIDB4ODAsIDB4NTcsIDB4RTksCisweDM4LCAweDFELCAweDZGLCAweDhGLAorCisweDI4LCAweDc0LAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjAsCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjAsCisweDJELCAweDIwLAorMHg5QiwgMHgxMCwKKworMHg4MiwgMHgzRSwgMHg1NywgMHhFOSwKKzB4MzIsIDB4RjAsIDB4MUIsIDB4Q0QsCisKKzB4MUUsIDB4QkQsIDB4NTksIDB4OUYsCisweDgzLCAweDFFLCAweDU3LCAweEU5LAorCisweDM4LCAweDQ3LCAweDM4LCAweEFGLAorMHgzNCwgMHgyMCwKKzB4MkEsIDB4MzAsCisKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorMHgzMiwgMHgyMCwKKzB4MDUsIDB4MjAsCisKKzB4ODcsIDB4ODAsIDB4NTcsIDB4RTksCisweDFGLCAweDU0LCAweDU3LCAweDlGLAorCisweDE3LCAweDQyLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4NkEsCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDM3LCAweDFFLCAweDRGLCAweEU5LAorCisweDM3LCAweDMyLCAweDJBLCAweEFGLAorMHgwMCwgMHhFMCwKKzB4MzIsIDB4MDAsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI3LCAweEMwLCAweDQ0LCAweEMwLAorCisweDM2LCAweDFGLCAweDRGLCAweEU5LAorMHgxRiwgMHgxRiwgMHgyNiwgMHhERiwKKworMHgzNywgMHgxQiwgMHgzNywgMHhCRiwKKzB4MTcsIDB4MjYsIDB4MTcsIDB4REYsCisKKzB4M0UsIDB4MTcsIDB4NEYsIDB4RTksCisweDNGLCAweDNGLCAweDRGLCAweEU5LAorCisweDM0LCAweDFGLCAweDM0LCAweEFGLAorMHgyQiwgMHgwNSwKKzB4QTcsIDB4MjAsCisKKzB4MzMsIDB4MkIsIDB4MzcsIDB4REYsCisweDI3LCAweDE3LCAweEMwLCAweEFGLAorCisweDM0LCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMywgMHg4MCwgMHgwQSwgMHhFQSwKKzB4MTcsIDB4QzEsIDB4MkIsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEIzLCAweDY4LAorMHg5NywgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4MzMsIDB4QUYsCisweDNDLCAweDI3LCAweDRGLCAweEU5LAorCisweDU3LCAweDM5LCAweDIwLCAweEU5LAorMHgyOCwgMHgxOSwgMHg2MCwgMHhFQywKKworMHgyQiwgMHgzMiwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4M0IsIDB4MjAsIDB4RTksCisKKzB4QjMsIDB4MDUsCisweDAwLCAweEUwLAorMHgxNiwgMHgyOCwgMHgyMCwgMHhFOSwKKworMHgyMywgMHgzQiwgMHgzMywgMHhBRCwKKzB4MUUsIDB4MkIsIDB4MjAsIDB4RTksCisKKzB4MUMsIDB4ODAsIDB4MjAsIDB4RTksCisweDU3LCAweDM2LCAweDIwLCAweEU5LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4OTAsIDB4RTIsCisweDAwLCAweEUwLAorCisweDg1LCAweEZGLCAweDIwLCAweEVBLAorMHgxOSwgMHhDOCwgMHhDMSwgMHhDRCwKKworMHgxRiwgMHhENywgMHgxOCwgMHhCRCwKKzB4M0YsIDB4RDcsIDB4MjIsIDB4QkQsCisKKzB4OUYsIDB4NDEsIDB4NDksIDB4QkQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI1LCAweDQxLCAweDQ5LCAweEJELAorMHgyRCwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHgwRCwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzUsIDB4NDAsIDB4NDgsIDB4QkQsCisweDNELCAweDQwLCAweDUwLCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNSwgMHgzMCwKKzB4MkQsIDB4MzAsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4QTcsIDB4NUIsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg4NCwgMHhGRiwgMHgwQSwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzksIDB4NDEsIDB4QzgsIDB4RUMsCisweDQyLCAweEUxLAorMHgwMCwgMHhFMCwKKworMHg4MiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEM4LCAweDQwLCAweEMwLCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg3RiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2cyMDBfdGd6YVtdID0geworCisweDAwLCAweDk4LCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDgxLCAweDA0LAorMHg4OSwgMHgwNCwKKzB4MDEsIDB4MDQsCisweDA5LCAweDA0LAorCisweEM5LCAweDQxLCAweEMwLCAweEVDLAorMHgxMSwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4NDEsIDB4Q0MsIDB4NDEsIDB4Q0QsCisweDQ5LCAweENDLCAweDQ5LCAweENELAorCisweEQxLCAweDQxLCAweEMwLCAweEVDLAorMHg1MSwgMHhDQywgMHg1MSwgMHhDRCwKKworMHg4MCwgMHgwNCwKKzB4MTAsIDB4MDQsCisweDA4LCAweDA0LAorMHgwMCwgMHhFMCwKKworMHgwMCwgMHhDQywgMHhDMCwgMHhDRCwKKzB4RDEsIDB4NDksIDB4QzAsIDB4RUMsCisKKzB4OEEsIDB4MUYsIDB4MjAsIDB4RTksCisweDhCLCAweDNGLCAweDIwLCAweEU5LAorCisweDQxLCAweDNDLCAweDQxLCAweEFELAorMHg0OSwgMHgzQywgMHg0OSwgMHhBRCwKKworMHgxMCwgMHhDQywgMHgxMCwgMHhDRCwKKzB4MDgsIDB4Q0MsIDB4MDgsIDB4Q0QsCisKKzB4QjksIDB4NDEsIDB4NDksIDB4QkIsCisweDFGLCAweEYwLCAweDQxLCAweENELAorCisweDUxLCAweDNDLCAweDUxLCAweEFELAorMHgwMCwgMHg5OCwgMHg4MCwgMHhFOSwKKworMHg3RCwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4MUYsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4NDEsIDB4NDksIDB4QkQsCisweDFELCAweDQxLCAweDUxLCAweEJELAorCisweDJFLCAweDQxLCAweDJBLCAweEI4LAorMHgzNCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHgxNSwgMHgzMCwKKzB4MUQsIDB4MzAsCisweDU4LCAweEUzLAorMHgwMCwgMHhFMCwKKworMHhCNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MjQsIDB4NDMsIDB4QTAsIDB4RTgsCisweDJDLCAweDRCLCAweEEwLCAweEU4LAorCisweDE1LCAweDcyLAorMHgwOSwgMHhFMywKKzB4MDAsIDB4RTAsCisweDFELCAweDcyLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweDk3LCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2QywgMHg2NCwgMHhDOCwgMHhFQywKKzB4OTgsIDB4RTEsCisweEI1LCAweDA1LAorCisweEJELCAweDA1LAorMHgyRSwgMHgzMCwKKzB4MzIsIDB4QzAsIDB4QTAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4QTAsIDB4RTgsCisweDc0LCAweDY0LCAweEM4LCAweEVDLAorCisweDQwLCAweDNDLCAweDQwLCAweEFELAorMHgzMiwgMHg2QSwKKzB4MkEsIDB4MzAsCisKKzB4MjAsIDB4NzMsCisweDMzLCAweDZBLAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4NzMsCisKKzB4MUMsIDB4NzIsCisweDgzLCAweEUyLAorMHg2QiwgMHg4MCwgMHgxNSwgMHhFQSwKKworMHhCOCwgMHgzRCwgMHgyOCwgMHhERiwKKzB4MzAsIDB4MzUsIDB4MjAsIDB4REYsCisKKzB4NDAsIDB4MzAsCisweDAwLCAweEUwLAorMHhDQywgMHhFMiwKKzB4NjQsIDB4NzIsCisKKzB4MjUsIDB4NDIsIDB4NTIsIDB4QkYsCisweDJELCAweDQyLCAweDRBLCAweEJGLAorCisweDMwLCAweDJFLCAweDMwLCAweERGLAorMHgzOCwgMHgyRSwgMHgzOCwgMHhERiwKKworMHgxOCwgMHgxRCwgMHg0NSwgMHhFOSwKKzB4MUUsIDB4MTUsIDB4NDUsIDB4RTksCisKKzB4MkIsIDB4NDksIDB4NTEsIDB4QkQsCisweDAwLCAweEUwLAorMHgxRiwgMHg3MywKKworMHgzOCwgMHgzOCwgMHg0MCwgMHhBRiwKKzB4MzAsIDB4MzAsIDB4NDAsIDB4QUYsCisKKzB4MjQsIDB4MUYsIDB4MjQsIDB4REYsCisweDFELCAweDMyLCAweDIwLCAweEU5LAorCisweDJDLCAweDFGLCAweDJDLCAweERGLAorMHgxQSwgMHgzMywgMHgyMCwgMHhFOSwKKworMHhCMCwgMHgxMCwKKzB4MDgsIDB4RTMsCisweDQwLCAweDEwLAorMHhCOCwgMHgxMCwKKworMHgyNiwgMHhGMCwgMHgzMCwgMHhDRCwKKzB4MkYsIDB4RjAsIDB4MzgsIDB4Q0QsCisKKzB4MkIsIDB4ODAsIDB4MjAsIDB4RTksCisweDJBLCAweDgwLCAweDIwLCAweEU5LAorCisweEE2LCAweDIwLAorMHg4OCwgMHhFMiwKKzB4MDAsIDB4RTAsCisweEFGLCAweDIwLAorCisweDI4LCAweDJBLCAweDI2LCAweEFGLAorMHgyMCwgMHgyQSwgMHhDMCwgMHhBRiwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhERiwKKzB4NDYsIDB4MjQsIDB4NDYsIDB4REYsCisKKzB4MjgsIDB4MzAsIDB4ODAsIDB4QkYsCisweDIwLCAweDM4LCAweDgwLCAweEJGLAorCisweDQ3LCAweDI0LCAweDQ3LCAweERGLAorMHg0RSwgMHgyQywgMHg0RSwgMHhERiwKKworMHg0RiwgMHgyQywgMHg0RiwgMHhERiwKKzB4NTYsIDB4MzQsIDB4NTYsIDB4REYsCisKKzB4MjgsIDB4MTUsIDB4MjgsIDB4REYsCisweDIwLCAweDFELCAweDIwLCAweERGLAorCisweDU3LCAweDM0LCAweDU3LCAweERGLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4MDUsCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDg5LCAweEUyLAorMHgyQiwgMHgzMCwKKworMHgzRiwgMHhDMSwgMHgxRCwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEEwLCAweDY4LAorMHhCRiwgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjAsIDB4QzAsIDB4MjAsIDB4QUYsCisweDI4LCAweDA1LAorMHg5NywgMHg3NCwKKworMHgwMCwgMHhFMCwKKzB4MkEsIDB4MTAsCisweDE2LCAweEMwLCAweDIwLCAweEU5LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4QywgMHhFMiwKKzB4OTUsIDB4MDUsCisKKzB4MjgsIDB4QzEsIDB4MjgsIDB4QUQsCisweDFGLCAweEMxLCAweDE1LCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBOCwgMHg2NywKKzB4OUYsIDB4NkIsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI4LCAweEMwLCAweDI4LCAweEFELAorMHgxRCwgMHgyNSwKKzB4MjAsIDB4MDUsCisKKzB4MjgsIDB4MzIsIDB4ODAsIDB4QUQsCisweDQwLCAweDJBLCAweDQwLCAweEJELAorCisweDFDLCAweDgwLCAweDIwLCAweEU5LAorMHgyMCwgMHgzMywgMHgyMCwgMHhBRCwKKworMHgyMCwgMHg3MywKKzB4MDAsIDB4RTAsCisweEI2LCAweDQ5LCAweDUxLCAweEJCLAorCisweDI2LCAweDJGLCAweEIwLCAweEU4LAorMHgxOSwgMHgyMCwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgyMCwgMHgzNSwgMHhERiwKKzB4M0QsIDB4MjAsIDB4M0QsIDB4REYsCisKKzB4MTUsIDB4MjAsIDB4MTUsIDB4REYsCisweDFELCAweDIwLCAweDFELCAweERGLAorCisweDI2LCAweEQwLCAweDI2LCAweENELAorMHgyOSwgMHg0OSwgMHgyQSwgMHhCOCwKKworMHgyNiwgMHg0MCwgMHg4MCwgMHhCRCwKKzB4M0IsIDB4NDgsIDB4NTAsIDB4QkQsCisKKzB4M0UsIDB4NTQsIDB4NTcsIDB4OUYsCisweDAwLCAweEUwLAorMHg4MiwgMHhFMSwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjYsIDB4MzAsCisweDI5LCAweDMwLAorMHg0OCwgMHgzQywgMHg0OCwgMHhBRCwKKworMHgyQiwgMHg3MiwKKzB4QzIsIDB4RTEsCisweDJDLCAweEMwLCAweDQ0LCAweEMyLAorCisweDA1LCAweDI0LCAweDM0LCAweEJGLAorMHgwRCwgMHgyNCwgMHgyQywgMHhCRiwKKworMHgyRCwgMHg0NiwgMHg0RSwgMHhCRiwKKzB4MjUsIDB4NDYsIDB4NTYsIDB4QkYsCisKKzB4MjAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDMyLCAweDNFLCAweDVGLCAweEU5LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4MzAsCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMzLCAweDFFLCAweDVGLCAweEU5LAorCisweDA1LCAweDQ0LCAweDU0LCAweEIyLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMiwKKworMHgxOSwgMHhDMCwgMHhCMCwgMHhFOCwKKzB4MzQsIDB4QzAsIDB4NDQsIDB4QzQsCisKKzB4MzMsIDB4NzMsCisweDAwLCAweEUwLAorMHgzRSwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorCisweDg0LCAweDNFLCAweDU4LCAweEU5LAorMHgyOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgwNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDg1LCAweDFFLCAweDU4LCAweEU5LAorCisweDlCLCAweDNCLCAweDMzLCAweERGLAorMHgyMCwgMHgyMCwgMHg0MiwgMHhBRiwKKworMHgzMCwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4ODAsIDB4M0UsIDB4NTcsIDB4RTksCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMwLCAweDgwLCAweDVGLCAweEU5LAorCisweDI4LCAweDI4LCAweDI0LCAweEFGLAorMHg4MSwgMHgxRSwgMHg1NywgMHhFOSwKKworMHgwNSwgMHg0NywgMHg1NywgMHhCRiwKKzB4MEQsIDB4NDcsIDB4NEYsIDB4QkYsCisKKzB4ODgsIDB4ODAsIDB4NTgsIDB4RTksCisweDFCLCAweDI5LCAweDFCLCAweERGLAorCisweDMwLCAweDFELCAweDZGLCAweDhGLAorMHgzQSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgxQywgMHgzMCwgMHgyNiwgMHhERiwKKzB4MDksIDB4RTMsCisweDNCLCAweDA1LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgzQiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweEFDLCAweDIwLAorCisweDJELCAweDQ0LCAweDRDLCAweEI0LAorMHgyQywgMHgxQywgMHhDMCwgMHhBRiwKKworMHgyNSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MDAsIDB4RTAsCisweEM4LCAweDMwLAorCisweDMwLCAweDQ2LCAweDMwLCAweEFGLAorMHgxQiwgMHgxQiwgMHg0OCwgMHhBRiwKKworMHgwMCwgMHhFMCwKKzB4MjUsIDB4MjAsCisweDM4LCAweDJDLCAweDRGLCAweEU5LAorCisweDg2LCAweDgwLCAweDU3LCAweEU5LAorMHgzOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgyOCwgMHg3NCwKKzB4MDAsIDB4RTAsCisweDBELCAweDQ0LCAweDRDLCAweEIwLAorCisweDA1LCAweDQ0LCAweDU0LCAweEIwLAorMHgyRCwgMHgyMCwKKzB4OUIsIDB4MTAsCisKKzB4ODIsIDB4M0UsIDB4NTcsIDB4RTksCisweDMyLCAweEYwLCAweDFCLCAweENELAorCisweDFFLCAweEJELCAweDU5LCAweDlGLAorMHg4MywgMHgxRSwgMHg1NywgMHhFOSwKKworMHgzOCwgMHg0NywgMHgzOCwgMHhBRiwKKzB4MzQsIDB4MjAsCisweDJBLCAweDMwLAorCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKzB4MzIsIDB4MjAsCisweDA1LCAweDIwLAorCisweDg3LCAweDgwLCAweDU3LCAweEU5LAorMHgxRiwgMHg1NCwgMHg1NywgMHg5RiwKKworMHgxNywgMHg0MiwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDZBLAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzNywgMHgxRSwgMHg0RiwgMHhFOSwKKworMHgzNywgMHgzMiwgMHgyQSwgMHhBRiwKKzB4MDAsIDB4RTAsCisweDMyLCAweDAwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNywgMHhDMCwgMHg0NCwgMHhDMCwKKworMHgzNiwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4MUYsIDB4MjYsIDB4REYsCisKKzB4MzcsIDB4MUIsIDB4MzcsIDB4QkYsCisweDE3LCAweDI2LCAweDE3LCAweERGLAorCisweDNFLCAweDE3LCAweDRGLCAweEU5LAorMHgzRiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhBRiwKKzB4MkIsIDB4MDUsCisweEE3LCAweDIwLAorCisweDMzLCAweDJCLCAweDM3LCAweERGLAorMHgyNywgMHgxNywgMHhDMCwgMHhBRiwKKworMHgzNCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkQsIDB4NDQsIDB4NEMsIDB4QjYsCisweDI1LCAweDQ0LCAweDU0LCAweEI2LAorCisweDAzLCAweDgwLCAweDJBLCAweEVBLAorMHgxNywgMHhDMSwgMHgyQiwgMHhCRCwKKworMHgyRCwgMHgyMCwKKzB4MjUsIDB4MjAsCisweDA3LCAweEMwLCAweDQ0LCAweEM2LAorCisweEIzLCAweDY4LAorMHg5NywgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4MzMsIDB4QUYsCisweDNDLCAweDI3LCAweDRGLCAweEU5LAorCisweDFGLCAweDYyLCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzRiwgMHgzRCwgMHg1RCwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDA3LCAweDIwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyOCwgMHgxOSwgMHg2MCwgMHhFQywKKworMHhCMywgMHgwNSwKKzB4MDAsIDB4RTAsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIzLCAweDNCLCAweDMzLCAweEFELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxRiwgMHgyNiwgMHgxRiwgMHhERiwKKzB4OUQsIDB4MUYsIDB4NEYsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHg5RSwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgwNywgMHgwNywgMHgxRiwgMHhBRiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDlDLCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4NTcsIDB4MzksIDB4MjAsIDB4RTksCisKKzB4MTYsIDB4MjgsIDB4MjAsIDB4RTksCisweDFELCAweDNCLCAweDIwLCAweEU5LAorCisweDFFLCAweDJCLCAweDIwLCAweEU5LAorMHgyQiwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgxQywgMHgyMywgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHg5MCwgMHhFMiwKKzB4MDAsIDB4RTAsCisKKzB4N0EsIDB4RkYsIDB4MjAsIDB4RUEsCisweDE5LCAweEM4LCAweEMxLCAweENELAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg5RiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4NDEsIDB4NDksIDB4QkQsCisweDJELCAweDQxLCAweDUxLCAweEJELAorCisweDBELCAweDgwLCAweDA3LCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI1LCAweDMwLAorMHgyRCwgMHgzMCwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHhBNywgMHg1QiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDc5LCAweEZGLCAweDBBLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOSwgMHg0MSwgMHhDOCwgMHhFQywKKzB4NDIsIDB4RTEsCisweDAwLCAweEUwLAorCisweDc3LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzgsIDB4NDAsIDB4QzAsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDc0LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzIwMF90Z3phZltdID0geworCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg5OCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg4MSwgMHgwNCwKKzB4ODksIDB4MDQsCisweDAxLCAweDA0LAorMHgwOSwgMHgwNCwKKworMHhDOSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MTEsIDB4MDQsCisweDAwLCAweEUwLAorCisweDQxLCAweENDLCAweDQxLCAweENELAorMHg0OSwgMHhDQywgMHg0OSwgMHhDRCwKKworMHhEMSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4NTEsIDB4Q0MsIDB4NTEsIDB4Q0QsCisKKzB4ODAsIDB4MDQsCisweDEwLCAweDA0LAorMHgwOCwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4MDAsIDB4Q0MsIDB4QzAsIDB4Q0QsCisweEQxLCAweDQ5LCAweEMwLCAweEVDLAorCisweDhBLCAweDFGLCAweDIwLCAweEU5LAorMHg4QiwgMHgzRiwgMHgyMCwgMHhFOSwKKworMHg0MSwgMHgzQywgMHg0MSwgMHhBRCwKKzB4NDksIDB4M0MsIDB4NDksIDB4QUQsCisKKzB4MTAsIDB4Q0MsIDB4MTAsIDB4Q0QsCisweDA4LCAweENDLCAweDA4LCAweENELAorCisweEI5LCAweDQxLCAweDQ5LCAweEJCLAorMHgxRiwgMHhGMCwgMHg0MSwgMHhDRCwKKworMHg1MSwgMHgzQywgMHg1MSwgMHhBRCwKKzB4MDAsIDB4OTgsIDB4ODAsIDB4RTksCisKKzB4ODMsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDFGLCAweDIwLCAweEU5LAorCisweDIxLCAweDQ1LCAweDgwLCAweEU4LAorMHgxQSwgMHg0RCwgMHg4MCwgMHhFOCwKKworMHgzMSwgMHg1NSwgMHg4MCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4NDEsIDB4NDksIDB4QkQsCisweDFELCAweDQxLCAweDUxLCAweEJELAorCisweDJFLCAweDQxLCAweDJBLCAweEI4LAorMHgzNCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHgxNSwgMHgzMCwKKzB4MUQsIDB4MzAsCisweDU4LCAweEUzLAorMHgwMCwgMHhFMCwKKworMHhCNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MjQsIDB4NDMsIDB4QTAsIDB4RTgsCisweDJDLCAweDRCLCAweEEwLCAweEU4LAorCisweDE1LCAweDcyLAorMHgwOSwgMHhFMywKKzB4MDAsIDB4RTAsCisweDFELCAweDcyLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweDk3LCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2QywgMHg2NCwgMHhDOCwgMHhFQywKKzB4OTgsIDB4RTEsCisweEI1LCAweDA1LAorCisweEJELCAweDA1LAorMHgyRSwgMHgzMCwKKzB4MzIsIDB4QzAsIDB4QTAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4QTAsIDB4RTgsCisweDc0LCAweDY0LCAweEM4LCAweEVDLAorCisweDQwLCAweDNDLCAweDQwLCAweEFELAorMHgzMiwgMHg2QSwKKzB4MkEsIDB4MzAsCisKKzB4MjAsIDB4NzMsCisweDMzLCAweDZBLAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4NzMsCisKKzB4MUMsIDB4NzIsCisweDgzLCAweEUyLAorMHg2RiwgMHg4MCwgMHgxNSwgMHhFQSwKKworMHhCOCwgMHgzRCwgMHgyOCwgMHhERiwKKzB4MzAsIDB4MzUsIDB4MjAsIDB4REYsCisKKzB4NDAsIDB4MzAsCisweDAwLCAweEUwLAorMHhDQywgMHhFMiwKKzB4NjQsIDB4NzIsCisKKzB4MjUsIDB4NDIsIDB4NTIsIDB4QkYsCisweDJELCAweDQyLCAweDRBLCAweEJGLAorCisweDMwLCAweDJFLCAweDMwLCAweERGLAorMHgzOCwgMHgyRSwgMHgzOCwgMHhERiwKKworMHgxOCwgMHgxRCwgMHg0NSwgMHhFOSwKKzB4MUUsIDB4MTUsIDB4NDUsIDB4RTksCisKKzB4MkIsIDB4NDksIDB4NTEsIDB4QkQsCisweDAwLCAweEUwLAorMHgxRiwgMHg3MywKKworMHgzOCwgMHgzOCwgMHg0MCwgMHhBRiwKKzB4MzAsIDB4MzAsIDB4NDAsIDB4QUYsCisKKzB4MjQsIDB4MUYsIDB4MjQsIDB4REYsCisweDFELCAweDMyLCAweDIwLCAweEU5LAorCisweDJDLCAweDFGLCAweDJDLCAweERGLAorMHgxQSwgMHgzMywgMHgyMCwgMHhFOSwKKworMHhCMCwgMHgxMCwKKzB4MDgsIDB4RTMsCisweDQwLCAweDEwLAorMHhCOCwgMHgxMCwKKworMHgyNiwgMHhGMCwgMHgzMCwgMHhDRCwKKzB4MkYsIDB4RjAsIDB4MzgsIDB4Q0QsCisKKzB4MkIsIDB4ODAsIDB4MjAsIDB4RTksCisweDJBLCAweDgwLCAweDIwLCAweEU5LAorCisweEE2LCAweDIwLAorMHg4OCwgMHhFMiwKKzB4MDAsIDB4RTAsCisweEFGLCAweDIwLAorCisweDI4LCAweDJBLCAweDI2LCAweEFGLAorMHgyMCwgMHgyQSwgMHhDMCwgMHhBRiwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhERiwKKzB4NDYsIDB4MjQsIDB4NDYsIDB4REYsCisKKzB4MjgsIDB4MzAsIDB4ODAsIDB4QkYsCisweDIwLCAweDM4LCAweDgwLCAweEJGLAorCisweDQ3LCAweDI0LCAweDQ3LCAweERGLAorMHg0RSwgMHgyQywgMHg0RSwgMHhERiwKKworMHg0RiwgMHgyQywgMHg0RiwgMHhERiwKKzB4NTYsIDB4MzQsIDB4NTYsIDB4REYsCisKKzB4MjgsIDB4MTUsIDB4MjgsIDB4REYsCisweDIwLCAweDFELCAweDIwLCAweERGLAorCisweDU3LCAweDM0LCAweDU3LCAweERGLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4MDUsCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDg5LCAweEUyLAorMHgyQiwgMHgzMCwKKworMHgzRiwgMHhDMSwgMHgxRCwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEEwLCAweDY4LAorMHhCRiwgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjAsIDB4QzAsIDB4MjAsIDB4QUYsCisweDI4LCAweDA1LAorMHg5NywgMHg3NCwKKworMHgwMCwgMHhFMCwKKzB4MkEsIDB4MTAsCisweDE2LCAweEMwLCAweDIwLCAweEU5LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4QywgMHhFMiwKKzB4OTUsIDB4MDUsCisKKzB4MjgsIDB4QzEsIDB4MjgsIDB4QUQsCisweDFGLCAweEMxLCAweDE1LCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBOCwgMHg2NywKKzB4OUYsIDB4NkIsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI4LCAweEMwLCAweDI4LCAweEFELAorMHgxRCwgMHgyNSwKKzB4MjAsIDB4MDUsCisKKzB4MjgsIDB4MzIsIDB4ODAsIDB4QUQsCisweDQwLCAweDJBLCAweDQwLCAweEJELAorCisweDFDLCAweDgwLCAweDIwLCAweEU5LAorMHgyMCwgMHgzMywgMHgyMCwgMHhBRCwKKworMHgyMCwgMHg3MywKKzB4MDAsIDB4RTAsCisweEI2LCAweDQ5LCAweDUxLCAweEJCLAorCisweDI2LCAweDJGLCAweEIwLCAweEU4LAorMHgxOSwgMHgyMCwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgyMCwgMHgzNSwgMHhERiwKKzB4M0QsIDB4MjAsIDB4M0QsIDB4REYsCisKKzB4MTUsIDB4MjAsIDB4MTUsIDB4REYsCisweDFELCAweDIwLCAweDFELCAweERGLAorCisweDI2LCAweEQwLCAweDI2LCAweENELAorMHgyOSwgMHg0OSwgMHgyQSwgMHhCOCwKKworMHgyNiwgMHg0MCwgMHg4MCwgMHhCRCwKKzB4M0IsIDB4NDgsIDB4NTAsIDB4QkQsCisKKzB4M0UsIDB4NTQsIDB4NTcsIDB4OUYsCisweDAwLCAweEUwLAorMHg4MiwgMHhFMSwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjYsIDB4MzAsCisweDI5LCAweDMwLAorMHg0OCwgMHgzQywgMHg0OCwgMHhBRCwKKworMHgyQiwgMHg3MiwKKzB4QzIsIDB4RTEsCisweDJDLCAweEMwLCAweDQ0LCAweEMyLAorCisweDA1LCAweDI0LCAweDM0LCAweEJGLAorMHgwRCwgMHgyNCwgMHgyQywgMHhCRiwKKworMHgyRCwgMHg0NiwgMHg0RSwgMHhCRiwKKzB4MjUsIDB4NDYsIDB4NTYsIDB4QkYsCisKKzB4MjAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDMyLCAweDNFLCAweDVGLCAweEU5LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4MzAsCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMzLCAweDFFLCAweDVGLCAweEU5LAorCisweDA1LCAweDQ0LCAweDU0LCAweEIyLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMiwKKworMHgxOSwgMHhDMCwgMHhCMCwgMHhFOCwKKzB4MzQsIDB4QzAsIDB4NDQsIDB4QzQsCisKKzB4MzMsIDB4NzMsCisweDAwLCAweEUwLAorMHgzRSwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorCisweDg0LCAweDNFLCAweDU4LCAweEU5LAorMHgyOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgwNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDg1LCAweDFFLCAweDU4LCAweEU5LAorCisweDlCLCAweDNCLCAweDMzLCAweERGLAorMHgyMCwgMHgyMCwgMHg0MiwgMHhBRiwKKworMHgzMCwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4ODAsIDB4M0UsIDB4NTcsIDB4RTksCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMwLCAweDgwLCAweDVGLCAweEU5LAorCisweDI4LCAweDI4LCAweDI0LCAweEFGLAorMHg4MSwgMHgxRSwgMHg1NywgMHhFOSwKKworMHgwNSwgMHg0NywgMHg1NywgMHhCRiwKKzB4MEQsIDB4NDcsIDB4NEYsIDB4QkYsCisKKzB4ODgsIDB4ODAsIDB4NTgsIDB4RTksCisweDFCLCAweDI5LCAweDFCLCAweERGLAorCisweDMwLCAweDFELCAweDZGLCAweDhGLAorMHgzQSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgxQywgMHgzMCwgMHgyNiwgMHhERiwKKzB4MDksIDB4RTMsCisweDNCLCAweDA1LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgzQiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweEFDLCAweDIwLAorCisweDJELCAweDQ0LCAweDRDLCAweEI0LAorMHgyQywgMHgxQywgMHhDMCwgMHhBRiwKKworMHgyNSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MDAsIDB4RTAsCisweEM4LCAweDMwLAorCisweDMwLCAweDQ2LCAweDMwLCAweEFGLAorMHgxQiwgMHgxQiwgMHg0OCwgMHhBRiwKKworMHgwMCwgMHhFMCwKKzB4MjUsIDB4MjAsCisweDM4LCAweDJDLCAweDRGLCAweEU5LAorCisweDg2LCAweDgwLCAweDU3LCAweEU5LAorMHgzOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgyOCwgMHg3NCwKKzB4MDAsIDB4RTAsCisweDBELCAweDQ0LCAweDRDLCAweEIwLAorCisweDA1LCAweDQ0LCAweDU0LCAweEIwLAorMHgyRCwgMHgyMCwKKzB4OUIsIDB4MTAsCisKKzB4ODIsIDB4M0UsIDB4NTcsIDB4RTksCisweDMyLCAweEYwLCAweDFCLCAweENELAorCisweDFFLCAweEJELCAweDU5LCAweDlGLAorMHg4MywgMHgxRSwgMHg1NywgMHhFOSwKKworMHgzOCwgMHg0NywgMHgzOCwgMHhBRiwKKzB4MzQsIDB4MjAsCisweDJBLCAweDMwLAorCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKzB4MzIsIDB4MjAsCisweDA1LCAweDIwLAorCisweDg3LCAweDgwLCAweDU3LCAweEU5LAorMHgxRiwgMHg1NCwgMHg1NywgMHg5RiwKKworMHgxNywgMHg0MiwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDZBLAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzNywgMHgxRSwgMHg0RiwgMHhFOSwKKworMHgzNywgMHgzMiwgMHgyQSwgMHhBRiwKKzB4MDAsIDB4RTAsCisweDMyLCAweDAwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNywgMHhDMCwgMHg0NCwgMHhDMCwKKworMHgzNiwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4MUYsIDB4MjYsIDB4REYsCisKKzB4MzcsIDB4MUIsIDB4MzcsIDB4QkYsCisweDE3LCAweDI2LCAweDE3LCAweERGLAorCisweDNFLCAweDE3LCAweDRGLCAweEU5LAorMHgzRiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhBRiwKKzB4MkIsIDB4MDUsCisweEE3LCAweDIwLAorCisweDMzLCAweDJCLCAweDM3LCAweERGLAorMHgyNywgMHgxNywgMHhDMCwgMHhBRiwKKworMHgzNCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MEQsIDB4MjEsIDB4MUEsIDB4QjYsCisweDA1LCAweDIxLCAweDMxLCAweEI2LAorCisweDJELCAweDQ0LCAweDRDLCAweEI2LAorMHgyNSwgMHg0NCwgMHg1NCwgMHhCNiwKKworMHgwMywgMHg4MCwgMHgyQSwgMHhFQSwKKzB4MTcsIDB4QzEsIDB4MkIsIDB4QkQsCisKKzB4MEQsIDB4MjAsCisweDA1LCAweDIwLAorMHgyRiwgMHhDMCwgMHgyMSwgMHhDNiwKKworMHhCMywgMHg2OCwKKzB4OTcsIDB4MjUsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMzLCAweEMwLCAweDMzLCAweEFGLAorMHgzQywgMHgyNywgMHg0RiwgMHhFOSwKKworMHgwMCwgMHhFMCwKKzB4MjUsIDB4MjAsCisweDA3LCAweEMwLCAweDQ0LCAweEM2LAorCisweDE3LCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4MjAsCisKKzB4MzcsIDB4MEYsIDB4NUMsIDB4OUYsCisweDAwLCAweEUwLAorMHgyRiwgMHgyMCwKKworMHgxRiwgMHg2MiwgMHg1NywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDA3LCAweDIwLAorCisweDNGLCAweDNELCAweDVELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MjgsIDB4MTksIDB4NjAsIDB4RUMsCisKKzB4QjMsIDB4MDUsCisweDAwLCAweEUwLAorMHgxNywgMHgyNiwgMHgxNywgMHhERiwKKworMHgyMywgMHgzQiwgMHgzMywgMHhBRCwKKzB4MzUsIDB4MTcsIDB4NEYsIDB4RTksCisKKzB4MUYsIDB4MjYsIDB4MUYsIDB4REYsCisweDlELCAweDFGLCAweDRGLCAweEU5LAorCisweDlFLCAweDNGLCAweDRGLCAweEU5LAorMHgzOSwgMHgzNywgMHg0RiwgMHhFOSwKKworMHgyRiwgMHgyRiwgMHgxNywgMHhBRiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDcsIDB4MDcsIDB4MUYsIDB4QUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMxLCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg5QywgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDU3LCAweDM5LCAweDIwLCAweEU5LAorCisweDE2LCAweDI4LCAweDIwLCAweEU5LAorMHgxRCwgMHgzQiwgMHgyMCwgMHhFOSwKKworMHgxRSwgMHgyQiwgMHgyMCwgMHhFOSwKKzB4MkIsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MUMsIDB4MjMsIDB4MjAsIDB4RTksCisweDU3LCAweDM2LCAweDIwLCAweEU5LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4OTAsIDB4RTIsCisweDAwLCAweEUwLAorCisweDc0LCAweEZGLCAweDIwLCAweEVBLAorMHgxOSwgMHhDOCwgMHhDMSwgMHhDRCwKKworMHgxRiwgMHhENywgMHgxOCwgMHhCRCwKKzB4M0YsIDB4RDcsIDB4MjIsIDB4QkQsCisKKzB4OUYsIDB4NDEsIDB4NDksIDB4QkQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI1LCAweDQxLCAweDQ5LCAweEJELAorMHgyRCwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHgwRCwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzUsIDB4NDAsIDB4NDgsIDB4QkQsCisweDNELCAweDQwLCAweDUwLCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNSwgMHgzMCwKKzB4MkQsIDB4MzAsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4QTcsIDB4NUIsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg3MywgMHhGRiwgMHgwQSwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzksIDB4NDEsIDB4QzgsIDB4RUMsCisweDQyLCAweEUxLAorMHgwMCwgMHhFMCwKKworMHg3MSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEM4LCAweDQwLCAweEMwLCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2RSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2cyMDBfdGd6ZltdID0geworCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg5OCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg4MSwgMHgwNCwKKzB4ODksIDB4MDQsCisweDAxLCAweDA0LAorMHgwOSwgMHgwNCwKKworMHhDOSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MTEsIDB4MDQsCisweDAwLCAweEUwLAorCisweDQxLCAweENDLCAweDQxLCAweENELAorMHg0OSwgMHhDQywgMHg0OSwgMHhDRCwKKworMHhEMSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4NTEsIDB4Q0MsIDB4NTEsIDB4Q0QsCisKKzB4ODAsIDB4MDQsCisweDEwLCAweDA0LAorMHgwOCwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4MDAsIDB4Q0MsIDB4QzAsIDB4Q0QsCisweEQxLCAweDQ5LCAweEMwLCAweEVDLAorCisweDhBLCAweDFGLCAweDIwLCAweEU5LAorMHg4QiwgMHgzRiwgMHgyMCwgMHhFOSwKKworMHg0MSwgMHgzQywgMHg0MSwgMHhBRCwKKzB4NDksIDB4M0MsIDB4NDksIDB4QUQsCisKKzB4MTAsIDB4Q0MsIDB4MTAsIDB4Q0QsCisweDA4LCAweENDLCAweDA4LCAweENELAorCisweEI5LCAweDQxLCAweDQ5LCAweEJCLAorMHgxRiwgMHhGMCwgMHg0MSwgMHhDRCwKKworMHg1MSwgMHgzQywgMHg1MSwgMHhBRCwKKzB4MDAsIDB4OTgsIDB4ODAsIDB4RTksCisKKzB4N0YsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDFGLCAweDIwLCAweEU5LAorCisweDIxLCAweDQ1LCAweDgwLCAweEU4LAorMHgxQSwgMHg0RCwgMHg4MCwgMHhFOCwKKworMHgzMSwgMHg1NSwgMHg4MCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4NDEsIDB4NDksIDB4QkQsCisweDFELCAweDQxLCAweDUxLCAweEJELAorCisweDJFLCAweDQxLCAweDJBLCAweEI4LAorMHgzNCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHgxNSwgMHgzMCwKKzB4MUQsIDB4MzAsCisweDU4LCAweEUzLAorMHgwMCwgMHhFMCwKKworMHhCNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MjQsIDB4NDMsIDB4QTAsIDB4RTgsCisweDJDLCAweDRCLCAweEEwLCAweEU4LAorCisweDE1LCAweDcyLAorMHgwOSwgMHhFMywKKzB4MDAsIDB4RTAsCisweDFELCAweDcyLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweDk3LCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2QywgMHg2NCwgMHhDOCwgMHhFQywKKzB4OTgsIDB4RTEsCisweEI1LCAweDA1LAorCisweEJELCAweDA1LAorMHgyRSwgMHgzMCwKKzB4MzIsIDB4QzAsIDB4QTAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4QTAsIDB4RTgsCisweDc0LCAweDY0LCAweEM4LCAweEVDLAorCisweDQwLCAweDNDLCAweDQwLCAweEFELAorMHgzMiwgMHg2QSwKKzB4MkEsIDB4MzAsCisKKzB4MjAsIDB4NzMsCisweDMzLCAweDZBLAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4NzMsCisKKzB4MUMsIDB4NzIsCisweDgzLCAweEUyLAorMHg2QiwgMHg4MCwgMHgxNSwgMHhFQSwKKworMHhCOCwgMHgzRCwgMHgyOCwgMHhERiwKKzB4MzAsIDB4MzUsIDB4MjAsIDB4REYsCisKKzB4NDAsIDB4MzAsCisweDAwLCAweEUwLAorMHhDQywgMHhFMiwKKzB4NjQsIDB4NzIsCisKKzB4MjUsIDB4NDIsIDB4NTIsIDB4QkYsCisweDJELCAweDQyLCAweDRBLCAweEJGLAorCisweDMwLCAweDJFLCAweDMwLCAweERGLAorMHgzOCwgMHgyRSwgMHgzOCwgMHhERiwKKworMHgxOCwgMHgxRCwgMHg0NSwgMHhFOSwKKzB4MUUsIDB4MTUsIDB4NDUsIDB4RTksCisKKzB4MkIsIDB4NDksIDB4NTEsIDB4QkQsCisweDAwLCAweEUwLAorMHgxRiwgMHg3MywKKworMHgzOCwgMHgzOCwgMHg0MCwgMHhBRiwKKzB4MzAsIDB4MzAsIDB4NDAsIDB4QUYsCisKKzB4MjQsIDB4MUYsIDB4MjQsIDB4REYsCisweDFELCAweDMyLCAweDIwLCAweEU5LAorCisweDJDLCAweDFGLCAweDJDLCAweERGLAorMHgxQSwgMHgzMywgMHgyMCwgMHhFOSwKKworMHhCMCwgMHgxMCwKKzB4MDgsIDB4RTMsCisweDQwLCAweDEwLAorMHhCOCwgMHgxMCwKKworMHgyNiwgMHhGMCwgMHgzMCwgMHhDRCwKKzB4MkYsIDB4RjAsIDB4MzgsIDB4Q0QsCisKKzB4MkIsIDB4ODAsIDB4MjAsIDB4RTksCisweDJBLCAweDgwLCAweDIwLCAweEU5LAorCisweEE2LCAweDIwLAorMHg4OCwgMHhFMiwKKzB4MDAsIDB4RTAsCisweEFGLCAweDIwLAorCisweDI4LCAweDJBLCAweDI2LCAweEFGLAorMHgyMCwgMHgyQSwgMHhDMCwgMHhBRiwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhERiwKKzB4NDYsIDB4MjQsIDB4NDYsIDB4REYsCisKKzB4MjgsIDB4MzAsIDB4ODAsIDB4QkYsCisweDIwLCAweDM4LCAweDgwLCAweEJGLAorCisweDQ3LCAweDI0LCAweDQ3LCAweERGLAorMHg0RSwgMHgyQywgMHg0RSwgMHhERiwKKworMHg0RiwgMHgyQywgMHg0RiwgMHhERiwKKzB4NTYsIDB4MzQsIDB4NTYsIDB4REYsCisKKzB4MjgsIDB4MTUsIDB4MjgsIDB4REYsCisweDIwLCAweDFELCAweDIwLCAweERGLAorCisweDU3LCAweDM0LCAweDU3LCAweERGLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4MDUsCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDg5LCAweEUyLAorMHgyQiwgMHgzMCwKKworMHgzRiwgMHhDMSwgMHgxRCwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEEwLCAweDY4LAorMHhCRiwgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjAsIDB4QzAsIDB4MjAsIDB4QUYsCisweDI4LCAweDA1LAorMHg5NywgMHg3NCwKKworMHgwMCwgMHhFMCwKKzB4MkEsIDB4MTAsCisweDE2LCAweEMwLCAweDIwLCAweEU5LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4QywgMHhFMiwKKzB4OTUsIDB4MDUsCisKKzB4MjgsIDB4QzEsIDB4MjgsIDB4QUQsCisweDFGLCAweEMxLCAweDE1LCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBOCwgMHg2NywKKzB4OUYsIDB4NkIsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI4LCAweEMwLCAweDI4LCAweEFELAorMHgxRCwgMHgyNSwKKzB4MjAsIDB4MDUsCisKKzB4MjgsIDB4MzIsIDB4ODAsIDB4QUQsCisweDQwLCAweDJBLCAweDQwLCAweEJELAorCisweDFDLCAweDgwLCAweDIwLCAweEU5LAorMHgyMCwgMHgzMywgMHgyMCwgMHhBRCwKKworMHgyMCwgMHg3MywKKzB4MDAsIDB4RTAsCisweEI2LCAweDQ5LCAweDUxLCAweEJCLAorCisweDI2LCAweDJGLCAweEIwLCAweEU4LAorMHgxOSwgMHgyMCwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgyMCwgMHgzNSwgMHhERiwKKzB4M0QsIDB4MjAsIDB4M0QsIDB4REYsCisKKzB4MTUsIDB4MjAsIDB4MTUsIDB4REYsCisweDFELCAweDIwLCAweDFELCAweERGLAorCisweDI2LCAweEQwLCAweDI2LCAweENELAorMHgyOSwgMHg0OSwgMHgyQSwgMHhCOCwKKworMHgyNiwgMHg0MCwgMHg4MCwgMHhCRCwKKzB4M0IsIDB4NDgsIDB4NTAsIDB4QkQsCisKKzB4M0UsIDB4NTQsIDB4NTcsIDB4OUYsCisweDAwLCAweEUwLAorMHg4MiwgMHhFMSwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjYsIDB4MzAsCisweDI5LCAweDMwLAorMHg0OCwgMHgzQywgMHg0OCwgMHhBRCwKKworMHgyQiwgMHg3MiwKKzB4QzIsIDB4RTEsCisweDJDLCAweEMwLCAweDQ0LCAweEMyLAorCisweDA1LCAweDI0LCAweDM0LCAweEJGLAorMHgwRCwgMHgyNCwgMHgyQywgMHhCRiwKKworMHgyRCwgMHg0NiwgMHg0RSwgMHhCRiwKKzB4MjUsIDB4NDYsIDB4NTYsIDB4QkYsCisKKzB4MjAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDMyLCAweDNFLCAweDVGLCAweEU5LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4MzAsCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMzLCAweDFFLCAweDVGLCAweEU5LAorCisweDA1LCAweDQ0LCAweDU0LCAweEIyLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMiwKKworMHgxOSwgMHhDMCwgMHhCMCwgMHhFOCwKKzB4MzQsIDB4QzAsIDB4NDQsIDB4QzQsCisKKzB4MzMsIDB4NzMsCisweDAwLCAweEUwLAorMHgzRSwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorCisweDg0LCAweDNFLCAweDU4LCAweEU5LAorMHgyOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgwNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDg1LCAweDFFLCAweDU4LCAweEU5LAorCisweDlCLCAweDNCLCAweDMzLCAweERGLAorMHgyMCwgMHgyMCwgMHg0MiwgMHhBRiwKKworMHgzMCwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4ODAsIDB4M0UsIDB4NTcsIDB4RTksCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMwLCAweDgwLCAweDVGLCAweEU5LAorCisweDI4LCAweDI4LCAweDI0LCAweEFGLAorMHg4MSwgMHgxRSwgMHg1NywgMHhFOSwKKworMHgwNSwgMHg0NywgMHg1NywgMHhCRiwKKzB4MEQsIDB4NDcsIDB4NEYsIDB4QkYsCisKKzB4ODgsIDB4ODAsIDB4NTgsIDB4RTksCisweDFCLCAweDI5LCAweDFCLCAweERGLAorCisweDMwLCAweDFELCAweDZGLCAweDhGLAorMHgzQSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgxQywgMHgzMCwgMHgyNiwgMHhERiwKKzB4MDksIDB4RTMsCisweDNCLCAweDA1LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgzQiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweEFDLCAweDIwLAorCisweDJELCAweDQ0LCAweDRDLCAweEI0LAorMHgyQywgMHgxQywgMHhDMCwgMHhBRiwKKworMHgyNSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MDAsIDB4RTAsCisweEM4LCAweDMwLAorCisweDMwLCAweDQ2LCAweDMwLCAweEFGLAorMHgxQiwgMHgxQiwgMHg0OCwgMHhBRiwKKworMHgwMCwgMHhFMCwKKzB4MjUsIDB4MjAsCisweDM4LCAweDJDLCAweDRGLCAweEU5LAorCisweDg2LCAweDgwLCAweDU3LCAweEU5LAorMHgzOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgyOCwgMHg3NCwKKzB4MDAsIDB4RTAsCisweDBELCAweDQ0LCAweDRDLCAweEIwLAorCisweDA1LCAweDQ0LCAweDU0LCAweEIwLAorMHgyRCwgMHgyMCwKKzB4OUIsIDB4MTAsCisKKzB4ODIsIDB4M0UsIDB4NTcsIDB4RTksCisweDMyLCAweEYwLCAweDFCLCAweENELAorCisweDFFLCAweEJELCAweDU5LCAweDlGLAorMHg4MywgMHgxRSwgMHg1NywgMHhFOSwKKworMHgzOCwgMHg0NywgMHgzOCwgMHhBRiwKKzB4MzQsIDB4MjAsCisweDJBLCAweDMwLAorCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKzB4MzIsIDB4MjAsCisweDA1LCAweDIwLAorCisweDg3LCAweDgwLCAweDU3LCAweEU5LAorMHgxRiwgMHg1NCwgMHg1NywgMHg5RiwKKworMHgxNywgMHg0MiwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDZBLAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzNywgMHgxRSwgMHg0RiwgMHhFOSwKKworMHgzNywgMHgzMiwgMHgyQSwgMHhBRiwKKzB4MDAsIDB4RTAsCisweDMyLCAweDAwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNywgMHhDMCwgMHg0NCwgMHhDMCwKKworMHgzNiwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4MUYsIDB4MjYsIDB4REYsCisKKzB4MzcsIDB4MUIsIDB4MzcsIDB4QkYsCisweDE3LCAweDI2LCAweDE3LCAweERGLAorCisweDNFLCAweDE3LCAweDRGLCAweEU5LAorMHgzRiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhBRiwKKzB4MkIsIDB4MDUsCisweEE3LCAweDIwLAorCisweDMzLCAweDJCLCAweDM3LCAweERGLAorMHgyNywgMHgxNywgMHhDMCwgMHhBRiwKKworMHgzNCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MEQsIDB4MjEsIDB4MUEsIDB4QjYsCisweDA1LCAweDIxLCAweDMxLCAweEI2LAorCisweDAzLCAweDgwLCAweDJBLCAweEVBLAorMHgxNywgMHhDMSwgMHgyQiwgMHhCRCwKKworMHgwRCwgMHgyMCwKKzB4MDUsIDB4MjAsCisweDJGLCAweEMwLCAweDIxLCAweEM2LAorCisweEIzLCAweDY4LAorMHg5NywgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4MzMsIDB4QUYsCisweDNDLCAweDI3LCAweDRGLCAweEU5LAorCisweDE3LCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzNywgMHgwRiwgMHg1QywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDJGLCAweDIwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyOCwgMHgxOSwgMHg2MCwgMHhFQywKKworMHhCMywgMHgwNSwKKzB4MDAsIDB4RTAsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIzLCAweDNCLCAweDMzLCAweEFELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNywgMHgyNiwgMHgxNywgMHhERiwKKzB4MzUsIDB4MTcsIDB4NEYsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgzOSwgMHgzNywgMHg0RiwgMHhFOSwKKworMHgyRiwgMHgyRiwgMHgxNywgMHhBRiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMxLCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4NTcsIDB4MzksIDB4MjAsIDB4RTksCisKKzB4MTYsIDB4MjgsIDB4MjAsIDB4RTksCisweDFELCAweDNCLCAweDIwLCAweEU5LAorCisweDFFLCAweDJCLCAweDIwLCAweEU5LAorMHgyQiwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgxQywgMHgyMywgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHg5MCwgMHhFMiwKKzB4MDAsIDB4RTAsCisKKzB4NzgsIDB4RkYsIDB4MjAsIDB4RUEsCisweDE5LCAweEM4LCAweEMxLCAweENELAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg5RiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4NDEsIDB4NDksIDB4QkQsCisweDJELCAweDQxLCAweDUxLCAweEJELAorCisweDBELCAweDgwLCAweDA3LCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI1LCAweDMwLAorMHgyRCwgMHgzMCwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHhBNywgMHg1QiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDc3LCAweEZGLCAweDBBLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOSwgMHg0MSwgMHhDOCwgMHhFQywKKzB4NDIsIDB4RTEsCisweDAwLCAweEUwLAorCisweDc1LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzgsIDB4NDAsIDB4QzAsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDcyLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzIwMF90Z3pzW10gPSB7CisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDk4LCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDgxLCAweDA0LAorMHg4OSwgMHgwNCwKKzB4MDEsIDB4MDQsCisweDA5LCAweDA0LAorCisweEM5LCAweDQxLCAweEMwLCAweEVDLAorMHgxMSwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4NDEsIDB4Q0MsIDB4NDEsIDB4Q0QsCisweDQ5LCAweENDLCAweDQ5LCAweENELAorCisweEQxLCAweDQxLCAweEMwLCAweEVDLAorMHg1MSwgMHhDQywgMHg1MSwgMHhDRCwKKworMHg4MCwgMHgwNCwKKzB4MTAsIDB4MDQsCisweDA4LCAweDA0LAorMHgwMCwgMHhFMCwKKworMHgwMCwgMHhDQywgMHhDMCwgMHhDRCwKKzB4RDEsIDB4NDksIDB4QzAsIDB4RUMsCisKKzB4OEEsIDB4MUYsIDB4MjAsIDB4RTksCisweDhCLCAweDNGLCAweDIwLCAweEU5LAorCisweDQxLCAweDNDLCAweDQxLCAweEFELAorMHg0OSwgMHgzQywgMHg0OSwgMHhBRCwKKworMHgxMCwgMHhDQywgMHgxMCwgMHhDRCwKKzB4MDgsIDB4Q0MsIDB4MDgsIDB4Q0QsCisKKzB4QjksIDB4NDEsIDB4NDksIDB4QkIsCisweDFGLCAweEYwLCAweDQxLCAweENELAorCisweDUxLCAweDNDLCAweDUxLCAweEFELAorMHgwMCwgMHg5OCwgMHg4MCwgMHhFOSwKKworMHg4QiwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4MUYsIDB4MjAsIDB4RTksCisKKzB4MjEsIDB4NDUsIDB4ODAsIDB4RTgsCisweDFBLCAweDRELCAweDgwLCAweEU4LAorCisweDMxLCAweDU1LCAweDgwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MUQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MkUsIDB4NDEsIDB4MkEsIDB4QjgsCisweDM0LCAweDUzLCAweEEwLCAweEU4LAorCisweDE1LCAweDMwLAorMHgxRCwgMHgzMCwKKzB4NTgsIDB4RTMsCisweDAwLCAweEUwLAorCisweEI1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgyNCwgMHg0MywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MTUsIDB4NzIsCisweDA5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4NzIsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4OTcsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDZDLCAweDY0LCAweEM4LCAweEVDLAorMHg5OCwgMHhFMSwKKzB4QjUsIDB4MDUsCisKKzB4QkQsIDB4MDUsCisweDJFLCAweDMwLAorMHgzMiwgMHhDMCwgMHhBMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHhBMCwgMHhFOCwKKzB4NzQsIDB4NjQsIDB4QzgsIDB4RUMsCisKKzB4NDAsIDB4M0MsIDB4NDAsIDB4QUQsCisweDMyLCAweDZBLAorMHgyQSwgMHgzMCwKKworMHgyMCwgMHg3MywKKzB4MzMsIDB4NkEsCisweDAwLCAweEUwLAorMHgyOCwgMHg3MywKKworMHgxQywgMHg3MiwKKzB4ODMsIDB4RTIsCisweDc3LCAweDgwLCAweDE1LCAweEVBLAorCisweEI4LCAweDNELCAweDI4LCAweERGLAorMHgzMCwgMHgzNSwgMHgyMCwgMHhERiwKKworMHg0MCwgMHgzMCwKKzB4MDAsIDB4RTAsCisweENDLCAweEUyLAorMHg2NCwgMHg3MiwKKworMHgyNSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MkQsIDB4NDIsIDB4NEEsIDB4QkYsCisKKzB4MzAsIDB4MkUsIDB4MzAsIDB4REYsCisweDM4LCAweDJFLCAweDM4LCAweERGLAorCisweDE4LCAweDFELCAweDQ1LCAweEU5LAorMHgxRSwgMHgxNSwgMHg0NSwgMHhFOSwKKworMHgyQiwgMHg0OSwgMHg1MSwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDczLAorCisweDM4LCAweDM4LCAweDQwLCAweEFGLAorMHgzMCwgMHgzMCwgMHg0MCwgMHhBRiwKKworMHgyNCwgMHgxRiwgMHgyNCwgMHhERiwKKzB4MUQsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MkMsIDB4MUYsIDB4MkMsIDB4REYsCisweDFBLCAweDMzLCAweDIwLCAweEU5LAorCisweEIwLCAweDEwLAorMHgwOCwgMHhFMywKKzB4NDAsIDB4MTAsCisweEI4LCAweDEwLAorCisweDI2LCAweEYwLCAweDMwLCAweENELAorMHgyRiwgMHhGMCwgMHgzOCwgMHhDRCwKKworMHgyQiwgMHg4MCwgMHgyMCwgMHhFOSwKKzB4MkEsIDB4ODAsIDB4MjAsIDB4RTksCisKKzB4QTYsIDB4MjAsCisweDg4LCAweEUyLAorMHgwMCwgMHhFMCwKKzB4QUYsIDB4MjAsCisKKzB4MjgsIDB4MkEsIDB4MjYsIDB4QUYsCisweDIwLCAweDJBLCAweEMwLCAweEFGLAorCisweDM0LCAweDFGLCAweDM0LCAweERGLAorMHg0NiwgMHgyNCwgMHg0NiwgMHhERiwKKworMHgyOCwgMHgzMCwgMHg4MCwgMHhCRiwKKzB4MjAsIDB4MzgsIDB4ODAsIDB4QkYsCisKKzB4NDcsIDB4MjQsIDB4NDcsIDB4REYsCisweDRFLCAweDJDLCAweDRFLCAweERGLAorCisweDRGLCAweDJDLCAweDRGLCAweERGLAorMHg1NiwgMHgzNCwgMHg1NiwgMHhERiwKKworMHgyOCwgMHgxNSwgMHgyOCwgMHhERiwKKzB4MjAsIDB4MUQsIDB4MjAsIDB4REYsCisKKzB4NTcsIDB4MzQsIDB4NTcsIDB4REYsCisweDAwLCAweEUwLAorMHgxRCwgMHgwNSwKKworMHgwNCwgMHg4MCwgMHgxMCwgMHhFQSwKKzB4ODksIDB4RTIsCisweDJCLCAweDMwLAorCisweDNGLCAweEMxLCAweDFELCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QTAsIDB4NjgsCisweEJGLCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMCwgMHhDMCwgMHgyMCwgMHhBRiwKKzB4MjgsIDB4MDUsCisweDk3LCAweDc0LAorCisweDAwLCAweEUwLAorMHgyQSwgMHgxMCwKKzB4MTYsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDhDLCAweEUyLAorMHg5NSwgMHgwNSwKKworMHgyOCwgMHhDMSwgMHgyOCwgMHhBRCwKKzB4MUYsIDB4QzEsIDB4MTUsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEE4LCAweDY3LAorMHg5RiwgMHg2QiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjgsIDB4QzAsIDB4MjgsIDB4QUQsCisweDFELCAweDI1LAorMHgyMCwgMHgwNSwKKworMHgyOCwgMHgzMiwgMHg4MCwgMHhBRCwKKzB4NDAsIDB4MkEsIDB4NDAsIDB4QkQsCisKKzB4MUMsIDB4ODAsIDB4MjAsIDB4RTksCisweDIwLCAweDMzLCAweDIwLCAweEFELAorCisweDIwLCAweDczLAorMHgwMCwgMHhFMCwKKzB4QjYsIDB4NDksIDB4NTEsIDB4QkIsCisKKzB4MjYsIDB4MkYsIDB4QjAsIDB4RTgsCisweDE5LCAweDIwLCAweDIwLCAweEU5LAorCisweDM1LCAweDIwLCAweDM1LCAweERGLAorMHgzRCwgMHgyMCwgMHgzRCwgMHhERiwKKworMHgxNSwgMHgyMCwgMHgxNSwgMHhERiwKKzB4MUQsIDB4MjAsIDB4MUQsIDB4REYsCisKKzB4MjYsIDB4RDAsIDB4MjYsIDB4Q0QsCisweDI5LCAweDQ5LCAweDJBLCAweEI4LAorCisweDI2LCAweDQwLCAweDgwLCAweEJELAorMHgzQiwgMHg0OCwgMHg1MCwgMHhCRCwKKworMHgzRSwgMHg1NCwgMHg1NywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDgyLCAweEUxLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNiwgMHgzMCwKKzB4MjksIDB4MzAsCisweDQ4LCAweDNDLCAweDQ4LCAweEFELAorCisweDJCLCAweDcyLAorMHhDMiwgMHhFMSwKKzB4MkMsIDB4QzAsIDB4NDQsIDB4QzIsCisKKzB4MDUsIDB4MjQsIDB4MzQsIDB4QkYsCisweDBELCAweDI0LCAweDJDLCAweEJGLAorCisweDJELCAweDQ2LCAweDRFLCAweEJGLAorMHgyNSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgyMCwgMHgxRCwgMHg2RiwgMHg4RiwKKzB4MzIsIDB4M0UsIDB4NUYsIDB4RTksCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgzQiwgMHgzMCwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzMsIDB4MUUsIDB4NUYsIDB4RTksCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjIsCisweDBELCAweDQ0LCAweDRDLCAweEIyLAorCisweDE5LCAweEMwLCAweEIwLCAweEU4LAorMHgzNCwgMHhDMCwgMHg0NCwgMHhDNCwKKworMHgzMywgMHg3MywKKzB4MDAsIDB4RTAsCisweDNFLCAweDYyLCAweDU3LCAweDlGLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4MjAsCisKKzB4ODQsIDB4M0UsIDB4NTgsIDB4RTksCisweDI4LCAweDFELCAweDZGLCAweDhGLAorCisweDA1LCAweDIwLAorMHgwMCwgMHhFMCwKKzB4ODUsIDB4MUUsIDB4NTgsIDB4RTksCisKKzB4OUIsIDB4M0IsIDB4MzMsIDB4REYsCisweDIwLCAweDIwLCAweDQyLCAweEFGLAorCisweDMwLCAweDQyLCAweDU2LCAweDlGLAorMHg4MCwgMHgzRSwgMHg1NywgMHhFOSwKKworMHgzRiwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzAsIDB4ODAsIDB4NUYsIDB4RTksCisKKzB4MjgsIDB4MjgsIDB4MjQsIDB4QUYsCisweDgxLCAweDFFLCAweDU3LCAweEU5LAorCisweDA1LCAweDQ3LCAweDU3LCAweEJGLAorMHgwRCwgMHg0NywgMHg0RiwgMHhCRiwKKworMHg4OCwgMHg4MCwgMHg1OCwgMHhFOSwKKzB4MUIsIDB4MjksIDB4MUIsIDB4REYsCisKKzB4MzAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDNBLCAweDMwLCAweDRGLCAweEU5LAorCisweDFDLCAweDMwLCAweDI2LCAweERGLAorMHgwOSwgMHhFMywKKzB4M0IsIDB4MDUsCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDNCLCAweDNGLCAweDRGLCAweEU5LAorCisweDFFLCAweDhGLCAweDUxLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4QUMsIDB4MjAsCisKKzB4MkQsIDB4NDQsIDB4NEMsIDB4QjQsCisweDJDLCAweDFDLCAweEMwLCAweEFGLAorCisweDI1LCAweDQ0LCAweDU0LCAweEI0LAorMHgwMCwgMHhFMCwKKzB4QzgsIDB4MzAsCisKKzB4MzAsIDB4NDYsIDB4MzAsIDB4QUYsCisweDFCLCAweDFCLCAweDQ4LCAweEFGLAorCisweDAwLCAweEUwLAorMHgyNSwgMHgyMCwKKzB4MzgsIDB4MkMsIDB4NEYsIDB4RTksCisKKzB4ODYsIDB4ODAsIDB4NTcsIDB4RTksCisweDM4LCAweDFELCAweDZGLCAweDhGLAorCisweDI4LCAweDc0LAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjAsCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjAsCisweDJELCAweDIwLAorMHg5QiwgMHgxMCwKKworMHg4MiwgMHgzRSwgMHg1NywgMHhFOSwKKzB4MzIsIDB4RjAsIDB4MUIsIDB4Q0QsCisKKzB4MUUsIDB4QkQsIDB4NTksIDB4OUYsCisweDgzLCAweDFFLCAweDU3LCAweEU5LAorCisweDM4LCAweDQ3LCAweDM4LCAweEFGLAorMHgzNCwgMHgyMCwKKzB4MkEsIDB4MzAsCisKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorMHgzMiwgMHgyMCwKKzB4MDUsIDB4MjAsCisKKzB4ODcsIDB4ODAsIDB4NTcsIDB4RTksCisweDFGLCAweDU0LCAweDU3LCAweDlGLAorCisweDE3LCAweDQyLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4NkEsCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDM3LCAweDFFLCAweDRGLCAweEU5LAorCisweDM3LCAweDMyLCAweDJBLCAweEFGLAorMHgwMCwgMHhFMCwKKzB4MzIsIDB4MDAsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI3LCAweEMwLCAweDQ0LCAweEMwLAorCisweDM2LCAweDFGLCAweDRGLCAweEU5LAorMHgxRiwgMHgxRiwgMHgyNiwgMHhERiwKKworMHgzNywgMHgxQiwgMHgzNywgMHhCRiwKKzB4MTcsIDB4MjYsIDB4MTcsIDB4REYsCisKKzB4M0UsIDB4MTcsIDB4NEYsIDB4RTksCisweDNGLCAweDNGLCAweDRGLCAweEU5LAorCisweDM0LCAweDFGLCAweDM0LCAweEFGLAorMHgyQiwgMHgwNSwKKzB4QTcsIDB4MjAsCisKKzB4MzMsIDB4MkIsIDB4MzcsIDB4REYsCisweDI3LCAweDE3LCAweEMwLCAweEFGLAorCisweDM0LCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyRCwgMHgyMSwgMHgxQSwgMHhCMCwKKzB4MjUsIDB4MjEsIDB4MzEsIDB4QjAsCisKKzB4MEQsIDB4MjEsIDB4MUEsIDB4QjIsCisweDA1LCAweDIxLCAweDMxLCAweEIyLAorCisweDAzLCAweDgwLCAweDJBLCAweEVBLAorMHgxNywgMHhDMSwgMHgyQiwgMHhCRCwKKworMHgyRCwgMHgyMCwKKzB4MjUsIDB4MjAsCisweDA1LCAweDIwLAorMHgwRCwgMHgyMCwKKworMHhCMywgMHg2OCwKKzB4OTcsIDB4MjUsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMzLCAweEMwLCAweDMzLCAweEFGLAorMHgyRiwgMHhDMCwgMHgyMSwgMHhDMCwKKworMHgxNiwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4M0MsIDB4MjcsIDB4NEYsIDB4RTksCisKKzB4MUUsIDB4NjIsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI1LCAweDIxLCAweDMxLCAweEI0LAorMHgyRCwgMHgyMSwgMHgxQSwgMHhCNCwKKworMHgzRiwgMHgyRiwgMHg1RCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4MDUsCisweDAwLCAweEUwLAorMHgyOCwgMHgxOSwgMHg2MCwgMHhFQywKKworMHgzNywgMHgwRiwgMHg1QywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDJGLCAweDIwLAorCisweDIzLCAweDNCLCAweDMzLCAweEFELAorMHgxRSwgMHgyNiwgMHgxRSwgMHhERiwKKworMHhBNywgMHgxRSwgMHg0RiwgMHhFOSwKKzB4MTcsIDB4MjYsIDB4MTYsIDB4REYsCisKKzB4MkQsIDB4MjAsCisweDAwLCAweEUwLAorMHhBOCwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgyRiwgMHgyRiwgMHgxRSwgMHhBRiwKKzB4MjUsIDB4MjAsCisweDAwLCAweEUwLAorCisweEE0LCAweDE2LCAweDRGLCAweEU5LAorMHgwRiwgMHhDMCwgMHgyMSwgMHhDMiwKKworMHhBNiwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4NjIsIDB4NTcsIDB4OUYsCisKKzB4M0YsIDB4MkYsIDB4NUQsIDB4OUYsCisweDAwLCAweEUwLAorMHg4RiwgMHgyMCwKKworMHhBNSwgMHgzNywgMHg0RiwgMHhFOSwKKzB4MEYsIDB4MTcsIDB4MEYsIDB4QUYsCisKKzB4MDYsIDB4QzAsIDB4MjEsIDB4QzQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHhBMywgMHg4MCwgMHg0RiwgMHhFOSwKKworMHgwNiwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDI2LCAweDFGLCAweERGLAorCisweEExLCAweDFGLCAweDRGLCAweEU5LAorMHhBMiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDYsIDB4MDYsIDB4MUYsIDB4QUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBMCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDU3LCAweDM5LCAweDIwLCAweEU5LAorCisweDE2LCAweDI4LCAweDIwLCAweEU5LAorMHgxRCwgMHgzQiwgMHgyMCwgMHhFOSwKKworMHgxRSwgMHgyQiwgMHgyMCwgMHhFOSwKKzB4MkIsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MUMsIDB4MjMsIDB4MjAsIDB4RTksCisweDU3LCAweDM2LCAweDIwLCAweEU5LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4OTAsIDB4RTIsCisweDAwLCAweEUwLAorCisweDZDLCAweEZGLCAweDIwLCAweEVBLAorMHgxOSwgMHhDOCwgMHhDMSwgMHhDRCwKKworMHgxRiwgMHhENywgMHgxOCwgMHhCRCwKKzB4M0YsIDB4RDcsIDB4MjIsIDB4QkQsCisKKzB4OUYsIDB4NDEsIDB4NDksIDB4QkQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI1LCAweDQxLCAweDQ5LCAweEJELAorMHgyRCwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHgwRCwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzUsIDB4NDAsIDB4NDgsIDB4QkQsCisweDNELCAweDQwLCAweDUwLCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNSwgMHgzMCwKKzB4MkQsIDB4MzAsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4QTcsIDB4NUIsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2QiwgMHhGRiwgMHgwQSwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzksIDB4NDEsIDB4QzgsIDB4RUMsCisweDQyLCAweEUxLAorMHgwMCwgMHhFMCwKKworMHg2OSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEM4LCAweDQwLCAweEMwLCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2NiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2cyMDBfdGd6c2FbXSA9IHsKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4OTgsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxRiwgMHhENywgMHgxOCwgMHhCRCwKKzB4M0YsIDB4RDcsIDB4MjIsIDB4QkQsCisKKzB4ODEsIDB4MDQsCisweDg5LCAweDA0LAorMHgwMSwgMHgwNCwKKzB4MDksIDB4MDQsCisKKzB4QzksIDB4NDEsIDB4QzAsIDB4RUMsCisweDExLCAweDA0LAorMHgwMCwgMHhFMCwKKworMHg0MSwgMHhDQywgMHg0MSwgMHhDRCwKKzB4NDksIDB4Q0MsIDB4NDksIDB4Q0QsCisKKzB4RDEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDUxLCAweENDLCAweDUxLCAweENELAorCisweDgwLCAweDA0LAorMHgxMCwgMHgwNCwKKzB4MDgsIDB4MDQsCisweDAwLCAweEUwLAorCisweDAwLCAweENDLCAweEMwLCAweENELAorMHhEMSwgMHg0OSwgMHhDMCwgMHhFQywKKworMHg4QSwgMHgxRiwgMHgyMCwgMHhFOSwKKzB4OEIsIDB4M0YsIDB4MjAsIDB4RTksCisKKzB4NDEsIDB4M0MsIDB4NDEsIDB4QUQsCisweDQ5LCAweDNDLCAweDQ5LCAweEFELAorCisweDEwLCAweENDLCAweDEwLCAweENELAorMHgwOCwgMHhDQywgMHgwOCwgMHhDRCwKKworMHhCOSwgMHg0MSwgMHg0OSwgMHhCQiwKKzB4MUYsIDB4RjAsIDB4NDEsIDB4Q0QsCisKKzB4NTEsIDB4M0MsIDB4NTEsIDB4QUQsCisweDAwLCAweDk4LCAweDgwLCAweEU5LAorCisweDhGLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHgxRiwgMHgyMCwgMHhFOSwKKworMHgyMSwgMHg0NSwgMHg4MCwgMHhFOCwKKzB4MUEsIDB4NEQsIDB4ODAsIDB4RTgsCisKKzB4MzEsIDB4NTUsIDB4ODAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweDQxLCAweDQ5LCAweEJELAorMHgxRCwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHgyRSwgMHg0MSwgMHgyQSwgMHhCOCwKKzB4MzQsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4MTUsIDB4MzAsCisweDFELCAweDMwLAorMHg1OCwgMHhFMywKKzB4MDAsIDB4RTAsCisKKzB4QjUsIDB4NDAsIDB4NDgsIDB4QkQsCisweDNELCAweDQwLCAweDUwLCAweEJELAorCisweDI0LCAweDQzLCAweEEwLCAweEU4LAorMHgyQywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHgxNSwgMHg3MiwKKzB4MDksIDB4RTMsCisweDAwLCAweEUwLAorMHgxRCwgMHg3MiwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHg5NywgMHg1NywgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NkMsIDB4NjQsIDB4QzgsIDB4RUMsCisweDk4LCAweEUxLAorMHhCNSwgMHgwNSwKKworMHhCRCwgMHgwNSwKKzB4MkUsIDB4MzAsCisweDMyLCAweEMwLCAweEEwLCAweEU4LAorCisweDMzLCAweEMwLCAweEEwLCAweEU4LAorMHg3NCwgMHg2NCwgMHhDOCwgMHhFQywKKworMHg0MCwgMHgzQywgMHg0MCwgMHhBRCwKKzB4MzIsIDB4NkEsCisweDJBLCAweDMwLAorCisweDIwLCAweDczLAorMHgzMywgMHg2QSwKKzB4MDAsIDB4RTAsCisweDI4LCAweDczLAorCisweDFDLCAweDcyLAorMHg4MywgMHhFMiwKKzB4N0IsIDB4ODAsIDB4MTUsIDB4RUEsCisKKzB4QjgsIDB4M0QsIDB4MjgsIDB4REYsCisweDMwLCAweDM1LCAweDIwLCAweERGLAorCisweDQwLCAweDMwLAorMHgwMCwgMHhFMCwKKzB4Q0MsIDB4RTIsCisweDY0LCAweDcyLAorCisweDI1LCAweDQyLCAweDUyLCAweEJGLAorMHgyRCwgMHg0MiwgMHg0QSwgMHhCRiwKKworMHgzMCwgMHgyRSwgMHgzMCwgMHhERiwKKzB4MzgsIDB4MkUsIDB4MzgsIDB4REYsCisKKzB4MTgsIDB4MUQsIDB4NDUsIDB4RTksCisweDFFLCAweDE1LCAweDQ1LCAweEU5LAorCisweDJCLCAweDQ5LCAweDUxLCAweEJELAorMHgwMCwgMHhFMCwKKzB4MUYsIDB4NzMsCisKKzB4MzgsIDB4MzgsIDB4NDAsIDB4QUYsCisweDMwLCAweDMwLCAweDQwLCAweEFGLAorCisweDI0LCAweDFGLCAweDI0LCAweERGLAorMHgxRCwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgyQywgMHgxRiwgMHgyQywgMHhERiwKKzB4MUEsIDB4MzMsIDB4MjAsIDB4RTksCisKKzB4QjAsIDB4MTAsCisweDA4LCAweEUzLAorMHg0MCwgMHgxMCwKKzB4QjgsIDB4MTAsCisKKzB4MjYsIDB4RjAsIDB4MzAsIDB4Q0QsCisweDJGLCAweEYwLCAweDM4LCAweENELAorCisweDJCLCAweDgwLCAweDIwLCAweEU5LAorMHgyQSwgMHg4MCwgMHgyMCwgMHhFOSwKKworMHhBNiwgMHgyMCwKKzB4ODgsIDB4RTIsCisweDAwLCAweEUwLAorMHhBRiwgMHgyMCwKKworMHgyOCwgMHgyQSwgMHgyNiwgMHhBRiwKKzB4MjAsIDB4MkEsIDB4QzAsIDB4QUYsCisKKzB4MzQsIDB4MUYsIDB4MzQsIDB4REYsCisweDQ2LCAweDI0LCAweDQ2LCAweERGLAorCisweDI4LCAweDMwLCAweDgwLCAweEJGLAorMHgyMCwgMHgzOCwgMHg4MCwgMHhCRiwKKworMHg0NywgMHgyNCwgMHg0NywgMHhERiwKKzB4NEUsIDB4MkMsIDB4NEUsIDB4REYsCisKKzB4NEYsIDB4MkMsIDB4NEYsIDB4REYsCisweDU2LCAweDM0LCAweDU2LCAweERGLAorCisweDI4LCAweDE1LCAweDI4LCAweERGLAorMHgyMCwgMHgxRCwgMHgyMCwgMHhERiwKKworMHg1NywgMHgzNCwgMHg1NywgMHhERiwKKzB4MDAsIDB4RTAsCisweDFELCAweDA1LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4OSwgMHhFMiwKKzB4MkIsIDB4MzAsCisKKzB4M0YsIDB4QzEsIDB4MUQsIDB4QkQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBMCwgMHg2OCwKKzB4QkYsIDB4MjUsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIwLCAweEMwLCAweDIwLCAweEFGLAorMHgyOCwgMHgwNSwKKzB4OTcsIDB4NzQsCisKKzB4MDAsIDB4RTAsCisweDJBLCAweDEwLAorMHgxNiwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgwNCwgMHg4MCwgMHgxMCwgMHhFQSwKKzB4OEMsIDB4RTIsCisweDk1LCAweDA1LAorCisweDI4LCAweEMxLCAweDI4LCAweEFELAorMHgxRiwgMHhDMSwgMHgxNSwgMHhCRCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QTgsIDB4NjcsCisweDlGLCAweDZCLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyOCwgMHhDMCwgMHgyOCwgMHhBRCwKKzB4MUQsIDB4MjUsCisweDIwLCAweDA1LAorCisweDI4LCAweDMyLCAweDgwLCAweEFELAorMHg0MCwgMHgyQSwgMHg0MCwgMHhCRCwKKworMHgxQywgMHg4MCwgMHgyMCwgMHhFOSwKKzB4MjAsIDB4MzMsIDB4MjAsIDB4QUQsCisKKzB4MjAsIDB4NzMsCisweDAwLCAweEUwLAorMHhCNiwgMHg0OSwgMHg1MSwgMHhCQiwKKworMHgyNiwgMHgyRiwgMHhCMCwgMHhFOCwKKzB4MTksIDB4MjAsIDB4MjAsIDB4RTksCisKKzB4MzUsIDB4MjAsIDB4MzUsIDB4REYsCisweDNELCAweDIwLCAweDNELCAweERGLAorCisweDE1LCAweDIwLCAweDE1LCAweERGLAorMHgxRCwgMHgyMCwgMHgxRCwgMHhERiwKKworMHgyNiwgMHhEMCwgMHgyNiwgMHhDRCwKKzB4MjksIDB4NDksIDB4MkEsIDB4QjgsCisKKzB4MjYsIDB4NDAsIDB4ODAsIDB4QkQsCisweDNCLCAweDQ4LCAweDUwLCAweEJELAorCisweDNFLCAweDU0LCAweDU3LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4ODIsIDB4RTEsCisKKzB4MUUsIDB4QUYsIDB4NTksIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI2LCAweDMwLAorMHgyOSwgMHgzMCwKKzB4NDgsIDB4M0MsIDB4NDgsIDB4QUQsCisKKzB4MkIsIDB4NzIsCisweEMyLCAweEUxLAorMHgyQywgMHhDMCwgMHg0NCwgMHhDMiwKKworMHgwNSwgMHgyNCwgMHgzNCwgMHhCRiwKKzB4MEQsIDB4MjQsIDB4MkMsIDB4QkYsCisKKzB4MkQsIDB4NDYsIDB4NEUsIDB4QkYsCisweDI1LCAweDQ2LCAweDU2LCAweEJGLAorCisweDIwLCAweDFELCAweDZGLCAweDhGLAorMHgzMiwgMHgzRSwgMHg1RiwgMHhFOSwKKworMHgzRSwgMHg1MCwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDMwLAorCisweDFFLCAweDhGLCAweDUxLCAweDlGLAorMHgzMywgMHgxRSwgMHg1RiwgMHhFOSwKKworMHgwNSwgMHg0NCwgMHg1NCwgMHhCMiwKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjIsCisKKzB4MTksIDB4QzAsIDB4QjAsIDB4RTgsCisweDM0LCAweEMwLCAweDQ0LCAweEM0LAorCisweDMzLCAweDczLAorMHgwMCwgMHhFMCwKKzB4M0UsIDB4NjIsIDB4NTcsIDB4OUYsCisKKzB4MUUsIDB4QUYsIDB4NTksIDB4OUYsCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKworMHg4NCwgMHgzRSwgMHg1OCwgMHhFOSwKKzB4MjgsIDB4MUQsIDB4NkYsIDB4OEYsCisKKzB4MDUsIDB4MjAsCisweDAwLCAweEUwLAorMHg4NSwgMHgxRSwgMHg1OCwgMHhFOSwKKworMHg5QiwgMHgzQiwgMHgzMywgMHhERiwKKzB4MjAsIDB4MjAsIDB4NDIsIDB4QUYsCisKKzB4MzAsIDB4NDIsIDB4NTYsIDB4OUYsCisweDgwLCAweDNFLCAweDU3LCAweEU5LAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzMCwgMHg4MCwgMHg1RiwgMHhFOSwKKworMHgyOCwgMHgyOCwgMHgyNCwgMHhBRiwKKzB4ODEsIDB4MUUsIDB4NTcsIDB4RTksCisKKzB4MDUsIDB4NDcsIDB4NTcsIDB4QkYsCisweDBELCAweDQ3LCAweDRGLCAweEJGLAorCisweDg4LCAweDgwLCAweDU4LCAweEU5LAorMHgxQiwgMHgyOSwgMHgxQiwgMHhERiwKKworMHgzMCwgMHgxRCwgMHg2RiwgMHg4RiwKKzB4M0EsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MUMsIDB4MzAsIDB4MjYsIDB4REYsCisweDA5LCAweEUzLAorMHgzQiwgMHgwNSwKKworMHgzRSwgMHg1MCwgMHg1NiwgMHg5RiwKKzB4M0IsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDAwLCAweEUwLAorMHhBQywgMHgyMCwKKworMHgyRCwgMHg0NCwgMHg0QywgMHhCNCwKKzB4MkMsIDB4MUMsIDB4QzAsIDB4QUYsCisKKzB4MjUsIDB4NDQsIDB4NTQsIDB4QjQsCisweDAwLCAweEUwLAorMHhDOCwgMHgzMCwKKworMHgzMCwgMHg0NiwgMHgzMCwgMHhBRiwKKzB4MUIsIDB4MUIsIDB4NDgsIDB4QUYsCisKKzB4MDAsIDB4RTAsCisweDI1LCAweDIwLAorMHgzOCwgMHgyQywgMHg0RiwgMHhFOSwKKworMHg4NiwgMHg4MCwgMHg1NywgMHhFOSwKKzB4MzgsIDB4MUQsIDB4NkYsIDB4OEYsCisKKzB4MjgsIDB4NzQsCisweDAwLCAweEUwLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMCwKKworMHgwNSwgMHg0NCwgMHg1NCwgMHhCMCwKKzB4MkQsIDB4MjAsCisweDlCLCAweDEwLAorCisweDgyLCAweDNFLCAweDU3LCAweEU5LAorMHgzMiwgMHhGMCwgMHgxQiwgMHhDRCwKKworMHgxRSwgMHhCRCwgMHg1OSwgMHg5RiwKKzB4ODMsIDB4MUUsIDB4NTcsIDB4RTksCisKKzB4MzgsIDB4NDcsIDB4MzgsIDB4QUYsCisweDM0LCAweDIwLAorMHgyQSwgMHgzMCwKKworMHgwMCwgMHhFMCwKKzB4MEQsIDB4MjAsCisweDMyLCAweDIwLAorMHgwNSwgMHgyMCwKKworMHg4NywgMHg4MCwgMHg1NywgMHhFOSwKKzB4MUYsIDB4NTQsIDB4NTcsIDB4OUYsCisKKzB4MTcsIDB4NDIsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgzQiwgMHg2QSwKKworMHgzRiwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzcsIDB4MUUsIDB4NEYsIDB4RTksCisKKzB4MzcsIDB4MzIsIDB4MkEsIDB4QUYsCisweDAwLCAweEUwLAorMHgzMiwgMHgwMCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MjcsIDB4QzAsIDB4NDQsIDB4QzAsCisKKzB4MzYsIDB4MUYsIDB4NEYsIDB4RTksCisweDFGLCAweDFGLCAweDI2LCAweERGLAorCisweDM3LCAweDFCLCAweDM3LCAweEJGLAorMHgxNywgMHgyNiwgMHgxNywgMHhERiwKKworMHgzRSwgMHgxNywgMHg0RiwgMHhFOSwKKzB4M0YsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MzQsIDB4MUYsIDB4MzQsIDB4QUYsCisweDJCLCAweDA1LAorMHhBNywgMHgyMCwKKworMHgzMywgMHgyQiwgMHgzNywgMHhERiwKKzB4MjcsIDB4MTcsIDB4QzAsIDB4QUYsCisKKzB4MzQsIDB4ODAsIDB4NEYsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDJELCAweDIxLCAweDFBLCAweEIwLAorMHgyNSwgMHgyMSwgMHgzMSwgMHhCMCwKKworMHgwRCwgMHgyMSwgMHgxQSwgMHhCMiwKKzB4MDUsIDB4MjEsIDB4MzEsIDB4QjIsCisKKzB4MDMsIDB4ODAsIDB4MkEsIDB4RUEsCisweDE3LCAweEMxLCAweDJCLCAweEJELAorCisweDJELCAweDIwLAorMHgyNSwgMHgyMCwKKzB4MDUsIDB4MjAsCisweDBELCAweDIwLAorCisweEIzLCAweDY4LAorMHg5NywgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4MzMsIDB4QUYsCisweDJGLCAweEMwLCAweDIxLCAweEMwLAorCisweDE2LCAweDQyLCAweDU2LCAweDlGLAorMHgzQywgMHgyNywgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg2MiwgMHg1NywgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4MjEsIDB4MzEsIDB4QjQsCisweDJELCAweDIxLCAweDFBLCAweEI0LAorCisweDNGLCAweDJGLCAweDVELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMywgMHgwNSwKKzB4MDAsIDB4RTAsCisweDI4LCAweDE5LCAweDYwLCAweEVDLAorCisweDBELCAweDQ0LCAweDRDLCAweEI2LAorMHgwNSwgMHg0NCwgMHg1NCwgMHhCNiwKKworMHgzNywgMHgwRiwgMHg1QywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDJGLCAweDIwLAorCisweDIzLCAweDNCLCAweDMzLCAweEFELAorMHgxRSwgMHgyNiwgMHgxRSwgMHhERiwKKworMHhBNywgMHgxRSwgMHg0RiwgMHhFOSwKKzB4MTcsIDB4MjYsIDB4MTYsIDB4REYsCisKKzB4MkQsIDB4MjAsCisweDAwLCAweEUwLAorMHhBOCwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgyRiwgMHgyRiwgMHgxRSwgMHhBRiwKKzB4MjUsIDB4MjAsCisweDAwLCAweEUwLAorCisweEE0LCAweDE2LCAweDRGLCAweEU5LAorMHgwRiwgMHhDMCwgMHgyMSwgMHhDMiwKKworMHhBNiwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4NjIsIDB4NTcsIDB4OUYsCisKKzB4MEQsIDB4MjAsCisweDA1LCAweDIwLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzRiwgMHgyRiwgMHg1RCwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBGLCAweDIwLAorCisweDE3LCAweDUwLCAweDU2LCAweDlGLAorMHhBNSwgMHgzNywgMHg0RiwgMHhFOSwKKworMHgwNiwgMHhDMCwgMHgyMSwgMHhDNCwKKzB4MEYsIDB4MTcsIDB4MEYsIDB4QUYsCisKKzB4MzcsIDB4MEYsIDB4NUMsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDJGLCAweEMwLCAweDQ0LCAweEM2LAorMHhBMywgMHg4MCwgMHg0RiwgMHhFOSwKKworMHgwNiwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDI2LCAweDFGLCAweERGLAorCisweDE3LCAweDI2LCAweDE3LCAweERGLAorMHg5RCwgMHgxNywgMHg0RiwgMHhFOSwKKworMHhBMSwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4QTIsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MDYsIDB4MDYsIDB4MUYsIDB4QUYsCisweDAwLCAweEUwLAorMHhBRiwgMHgyMCwKKworMHg5RSwgMHgzNywgMHg0RiwgMHhFOSwKKzB4MkYsIDB4MTcsIDB4MkYsIDB4QUYsCisKKzB4QTAsIDB4ODAsIDB4NEYsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHg5QywgMHg4MCwgMHg0RiwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4NTcsIDB4MzksIDB4MjAsIDB4RTksCisKKzB4MTYsIDB4MjgsIDB4MjAsIDB4RTksCisweDFELCAweDNCLCAweDIwLCAweEU5LAorCisweDFFLCAweDJCLCAweDIwLCAweEU5LAorMHgyQiwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgxQywgMHgyMywgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHg5MCwgMHhFMiwKKzB4MDAsIDB4RTAsCisKKzB4NjgsIDB4RkYsIDB4MjAsIDB4RUEsCisweDE5LCAweEM4LCAweEMxLCAweENELAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg5RiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4NDEsIDB4NDksIDB4QkQsCisweDJELCAweDQxLCAweDUxLCAweEJELAorCisweDBELCAweDgwLCAweDA3LCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI1LCAweDMwLAorMHgyRCwgMHgzMCwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHhBNywgMHg1QiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDY3LCAweEZGLCAweDBBLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOSwgMHg0MSwgMHhDOCwgMHhFQywKKzB4NDIsIDB4RTEsCisweDAwLCAweEUwLAorCisweDY1LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzgsIDB4NDAsIDB4QzAsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDYyLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzIwMF90Z3pzYWZbXSA9IHsKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg5OCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg4MSwgMHgwNCwKKzB4ODksIDB4MDQsCisweDAxLCAweDA0LAorMHgwOSwgMHgwNCwKKworMHhDOSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MTEsIDB4MDQsCisweDAwLCAweEUwLAorCisweDQxLCAweENDLCAweDQxLCAweENELAorMHg0OSwgMHhDQywgMHg0OSwgMHhDRCwKKworMHhEMSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4NTEsIDB4Q0MsIDB4NTEsIDB4Q0QsCisKKzB4ODAsIDB4MDQsCisweDEwLCAweDA0LAorMHgwOCwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4MDAsIDB4Q0MsIDB4QzAsIDB4Q0QsCisweEQxLCAweDQ5LCAweEMwLCAweEVDLAorCisweDhBLCAweDFGLCAweDIwLCAweEU5LAorMHg4QiwgMHgzRiwgMHgyMCwgMHhFOSwKKworMHg0MSwgMHgzQywgMHg0MSwgMHhBRCwKKzB4NDksIDB4M0MsIDB4NDksIDB4QUQsCisKKzB4MTAsIDB4Q0MsIDB4MTAsIDB4Q0QsCisweDA4LCAweENDLCAweDA4LCAweENELAorCisweEI5LCAweDQxLCAweDQ5LCAweEJCLAorMHgxRiwgMHhGMCwgMHg0MSwgMHhDRCwKKworMHg1MSwgMHgzQywgMHg1MSwgMHhBRCwKKzB4MDAsIDB4OTgsIDB4ODAsIDB4RTksCisKKzB4OTQsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDFGLCAweDIwLCAweEU5LAorCisweDIxLCAweDQ1LCAweDgwLCAweEU4LAorMHgxQSwgMHg0RCwgMHg4MCwgMHhFOCwKKworMHgzMSwgMHg1NSwgMHg4MCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4NDEsIDB4NDksIDB4QkQsCisweDFELCAweDQxLCAweDUxLCAweEJELAorCisweDJFLCAweDQxLCAweDJBLCAweEI4LAorMHgzNCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHgxNSwgMHgzMCwKKzB4MUQsIDB4MzAsCisweDU4LCAweEUzLAorMHgwMCwgMHhFMCwKKworMHhCNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MjQsIDB4NDMsIDB4QTAsIDB4RTgsCisweDJDLCAweDRCLCAweEEwLCAweEU4LAorCisweDE1LCAweDcyLAorMHgwOSwgMHhFMywKKzB4MDAsIDB4RTAsCisweDFELCAweDcyLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweDk3LCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2QywgMHg2NCwgMHhDOCwgMHhFQywKKzB4OTgsIDB4RTEsCisweEI1LCAweDA1LAorCisweEJELCAweDA1LAorMHgyRSwgMHgzMCwKKzB4MzIsIDB4QzAsIDB4QTAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4QTAsIDB4RTgsCisweDc0LCAweDY0LCAweEM4LCAweEVDLAorCisweDQwLCAweDNDLCAweDQwLCAweEFELAorMHgzMiwgMHg2QSwKKzB4MkEsIDB4MzAsCisKKzB4MjAsIDB4NzMsCisweDMzLCAweDZBLAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4NzMsCisKKzB4MUMsIDB4NzIsCisweDgzLCAweEUyLAorMHg4MCwgMHg4MCwgMHgxNSwgMHhFQSwKKworMHhCOCwgMHgzRCwgMHgyOCwgMHhERiwKKzB4MzAsIDB4MzUsIDB4MjAsIDB4REYsCisKKzB4NDAsIDB4MzAsCisweDAwLCAweEUwLAorMHhDQywgMHhFMiwKKzB4NjQsIDB4NzIsCisKKzB4MjUsIDB4NDIsIDB4NTIsIDB4QkYsCisweDJELCAweDQyLCAweDRBLCAweEJGLAorCisweDMwLCAweDJFLCAweDMwLCAweERGLAorMHgzOCwgMHgyRSwgMHgzOCwgMHhERiwKKworMHgxOCwgMHgxRCwgMHg0NSwgMHhFOSwKKzB4MUUsIDB4MTUsIDB4NDUsIDB4RTksCisKKzB4MkIsIDB4NDksIDB4NTEsIDB4QkQsCisweDAwLCAweEUwLAorMHgxRiwgMHg3MywKKworMHgzOCwgMHgzOCwgMHg0MCwgMHhBRiwKKzB4MzAsIDB4MzAsIDB4NDAsIDB4QUYsCisKKzB4MjQsIDB4MUYsIDB4MjQsIDB4REYsCisweDFELCAweDMyLCAweDIwLCAweEU5LAorCisweDJDLCAweDFGLCAweDJDLCAweERGLAorMHgxQSwgMHgzMywgMHgyMCwgMHhFOSwKKworMHhCMCwgMHgxMCwKKzB4MDgsIDB4RTMsCisweDQwLCAweDEwLAorMHhCOCwgMHgxMCwKKworMHgyNiwgMHhGMCwgMHgzMCwgMHhDRCwKKzB4MkYsIDB4RjAsIDB4MzgsIDB4Q0QsCisKKzB4MkIsIDB4ODAsIDB4MjAsIDB4RTksCisweDJBLCAweDgwLCAweDIwLCAweEU5LAorCisweEE2LCAweDIwLAorMHg4OCwgMHhFMiwKKzB4MDAsIDB4RTAsCisweEFGLCAweDIwLAorCisweDI4LCAweDJBLCAweDI2LCAweEFGLAorMHgyMCwgMHgyQSwgMHhDMCwgMHhBRiwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhERiwKKzB4NDYsIDB4MjQsIDB4NDYsIDB4REYsCisKKzB4MjgsIDB4MzAsIDB4ODAsIDB4QkYsCisweDIwLCAweDM4LCAweDgwLCAweEJGLAorCisweDQ3LCAweDI0LCAweDQ3LCAweERGLAorMHg0RSwgMHgyQywgMHg0RSwgMHhERiwKKworMHg0RiwgMHgyQywgMHg0RiwgMHhERiwKKzB4NTYsIDB4MzQsIDB4NTYsIDB4REYsCisKKzB4MjgsIDB4MTUsIDB4MjgsIDB4REYsCisweDIwLCAweDFELCAweDIwLCAweERGLAorCisweDU3LCAweDM0LCAweDU3LCAweERGLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4MDUsCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDg5LCAweEUyLAorMHgyQiwgMHgzMCwKKworMHgzRiwgMHhDMSwgMHgxRCwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEEwLCAweDY4LAorMHhCRiwgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjAsIDB4QzAsIDB4MjAsIDB4QUYsCisweDI4LCAweDA1LAorMHg5NywgMHg3NCwKKworMHgwMCwgMHhFMCwKKzB4MkEsIDB4MTAsCisweDE2LCAweEMwLCAweDIwLCAweEU5LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4QywgMHhFMiwKKzB4OTUsIDB4MDUsCisKKzB4MjgsIDB4QzEsIDB4MjgsIDB4QUQsCisweDFGLCAweEMxLCAweDE1LCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBOCwgMHg2NywKKzB4OUYsIDB4NkIsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI4LCAweEMwLCAweDI4LCAweEFELAorMHgxRCwgMHgyNSwKKzB4MjAsIDB4MDUsCisKKzB4MjgsIDB4MzIsIDB4ODAsIDB4QUQsCisweDQwLCAweDJBLCAweDQwLCAweEJELAorCisweDFDLCAweDgwLCAweDIwLCAweEU5LAorMHgyMCwgMHgzMywgMHgyMCwgMHhBRCwKKworMHgyMCwgMHg3MywKKzB4MDAsIDB4RTAsCisweEI2LCAweDQ5LCAweDUxLCAweEJCLAorCisweDI2LCAweDJGLCAweEIwLCAweEU4LAorMHgxOSwgMHgyMCwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgyMCwgMHgzNSwgMHhERiwKKzB4M0QsIDB4MjAsIDB4M0QsIDB4REYsCisKKzB4MTUsIDB4MjAsIDB4MTUsIDB4REYsCisweDFELCAweDIwLCAweDFELCAweERGLAorCisweDI2LCAweEQwLCAweDI2LCAweENELAorMHgyOSwgMHg0OSwgMHgyQSwgMHhCOCwKKworMHgyNiwgMHg0MCwgMHg4MCwgMHhCRCwKKzB4M0IsIDB4NDgsIDB4NTAsIDB4QkQsCisKKzB4M0UsIDB4NTQsIDB4NTcsIDB4OUYsCisweDAwLCAweEUwLAorMHg4MiwgMHhFMSwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjYsIDB4MzAsCisweDI5LCAweDMwLAorMHg0OCwgMHgzQywgMHg0OCwgMHhBRCwKKworMHgyQiwgMHg3MiwKKzB4QzIsIDB4RTEsCisweDJDLCAweEMwLCAweDQ0LCAweEMyLAorCisweDA1LCAweDI0LCAweDM0LCAweEJGLAorMHgwRCwgMHgyNCwgMHgyQywgMHhCRiwKKworMHgyRCwgMHg0NiwgMHg0RSwgMHhCRiwKKzB4MjUsIDB4NDYsIDB4NTYsIDB4QkYsCisKKzB4MjAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDMyLCAweDNFLCAweDVGLCAweEU5LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4MzAsCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMzLCAweDFFLCAweDVGLCAweEU5LAorCisweDA1LCAweDQ0LCAweDU0LCAweEIyLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMiwKKworMHgxOSwgMHhDMCwgMHhCMCwgMHhFOCwKKzB4MzQsIDB4QzAsIDB4NDQsIDB4QzQsCisKKzB4MzMsIDB4NzMsCisweDAwLCAweEUwLAorMHgzRSwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorCisweDg0LCAweDNFLCAweDU4LCAweEU5LAorMHgyOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgwNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDg1LCAweDFFLCAweDU4LCAweEU5LAorCisweDlCLCAweDNCLCAweDMzLCAweERGLAorMHgyMCwgMHgyMCwgMHg0MiwgMHhBRiwKKworMHgzMCwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4ODAsIDB4M0UsIDB4NTcsIDB4RTksCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMwLCAweDgwLCAweDVGLCAweEU5LAorCisweDI4LCAweDI4LCAweDI0LCAweEFGLAorMHg4MSwgMHgxRSwgMHg1NywgMHhFOSwKKworMHgwNSwgMHg0NywgMHg1NywgMHhCRiwKKzB4MEQsIDB4NDcsIDB4NEYsIDB4QkYsCisKKzB4ODgsIDB4ODAsIDB4NTgsIDB4RTksCisweDFCLCAweDI5LCAweDFCLCAweERGLAorCisweDMwLCAweDFELCAweDZGLCAweDhGLAorMHgzQSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgxQywgMHgzMCwgMHgyNiwgMHhERiwKKzB4MDksIDB4RTMsCisweDNCLCAweDA1LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgzQiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweEFDLCAweDIwLAorCisweDJELCAweDQ0LCAweDRDLCAweEI0LAorMHgyQywgMHgxQywgMHhDMCwgMHhBRiwKKworMHgyNSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MDAsIDB4RTAsCisweEM4LCAweDMwLAorCisweDMwLCAweDQ2LCAweDMwLCAweEFGLAorMHgxQiwgMHgxQiwgMHg0OCwgMHhBRiwKKworMHgwMCwgMHhFMCwKKzB4MjUsIDB4MjAsCisweDM4LCAweDJDLCAweDRGLCAweEU5LAorCisweDg2LCAweDgwLCAweDU3LCAweEU5LAorMHgzOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgyOCwgMHg3NCwKKzB4MDAsIDB4RTAsCisweDBELCAweDQ0LCAweDRDLCAweEIwLAorCisweDA1LCAweDQ0LCAweDU0LCAweEIwLAorMHgyRCwgMHgyMCwKKzB4OUIsIDB4MTAsCisKKzB4ODIsIDB4M0UsIDB4NTcsIDB4RTksCisweDMyLCAweEYwLCAweDFCLCAweENELAorCisweDFFLCAweEJELCAweDU5LCAweDlGLAorMHg4MywgMHgxRSwgMHg1NywgMHhFOSwKKworMHgzOCwgMHg0NywgMHgzOCwgMHhBRiwKKzB4MzQsIDB4MjAsCisweDJBLCAweDMwLAorCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKzB4MzIsIDB4MjAsCisweDA1LCAweDIwLAorCisweDg3LCAweDgwLCAweDU3LCAweEU5LAorMHgxRiwgMHg1NCwgMHg1NywgMHg5RiwKKworMHgxNywgMHg0MiwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDZBLAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzNywgMHgxRSwgMHg0RiwgMHhFOSwKKworMHgzNywgMHgzMiwgMHgyQSwgMHhBRiwKKzB4MDAsIDB4RTAsCisweDMyLCAweDAwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNywgMHhDMCwgMHg0NCwgMHhDMCwKKworMHgzNiwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4MUYsIDB4MjYsIDB4REYsCisKKzB4MzcsIDB4MUIsIDB4MzcsIDB4QkYsCisweDE3LCAweDI2LCAweDE3LCAweERGLAorCisweDNFLCAweDE3LCAweDRGLCAweEU5LAorMHgzRiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhBRiwKKzB4MkIsIDB4MDUsCisweEE3LCAweDIwLAorCisweDMzLCAweDJCLCAweDM3LCAweERGLAorMHgyNywgMHgxNywgMHhDMCwgMHhBRiwKKworMHgzNCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkQsIDB4MjEsIDB4MUEsIDB4QjAsCisweDI1LCAweDIxLCAweDMxLCAweEIwLAorCisweDBELCAweDIxLCAweDFBLCAweEIyLAorMHgwNSwgMHgyMSwgMHgzMSwgMHhCMiwKKworMHgwMywgMHg4MCwgMHgyQSwgMHhFQSwKKzB4MTcsIDB4QzEsIDB4MkIsIDB4QkQsCisKKzB4MkQsIDB4MjAsCisweDI1LCAweDIwLAorMHgwNSwgMHgyMCwKKzB4MEQsIDB4MjAsCisKKzB4QjMsIDB4NjgsCisweDk3LCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHgzMywgMHhBRiwKKzB4MkYsIDB4QzAsIDB4MjEsIDB4QzAsCisKKzB4MTYsIDB4NDIsIDB4NTYsIDB4OUYsCisweDNDLCAweDI3LCAweDRGLCAweEU5LAorCisweDFFLCAweDYyLCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNSwgMHgyMSwgMHgzMSwgMHhCNCwKKzB4MkQsIDB4MjEsIDB4MUEsIDB4QjQsCisKKzB4M0YsIDB4MkYsIDB4NUQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMzLCAweDA1LAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4MTksIDB4NjAsIDB4RUMsCisKKzB4MEQsIDB4MjEsIDB4MUEsIDB4QjYsCisweDA1LCAweDIxLCAweDMxLCAweEI2LAorCisweDM3LCAweDBGLCAweDVDLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MkYsIDB4MjAsCisKKzB4MjMsIDB4M0IsIDB4MzMsIDB4QUQsCisweDFFLCAweDI2LCAweDFFLCAweERGLAorCisweEE3LCAweDFFLCAweDRGLCAweEU5LAorMHgxNywgMHgyNiwgMHgxNiwgMHhERiwKKworMHgyRCwgMHgyMCwKKzB4MDAsIDB4RTAsCisweEE4LCAweDNGLCAweDRGLCAweEU5LAorCisweDJGLCAweDJGLCAweDFFLCAweEFGLAorMHgyNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisKKzB4QTQsIDB4MTYsIDB4NEYsIDB4RTksCisweDBGLCAweEMwLCAweDIxLCAweEMyLAorCisweEE2LCAweDgwLCAweDRGLCAweEU5LAorMHgxRiwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgwRCwgMHgyMCwKKzB4MDUsIDB4MjAsCisweDJGLCAweEMwLCAweDIxLCAweEM2LAorCisweDJELCAweDQ0LCAweDRDLCAweEI2LAorMHgyNSwgMHg0NCwgMHg1NCwgMHhCNiwKKworMHgzRiwgMHgyRiwgMHg1RCwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBGLCAweDIwLAorCisweDJELCAweDIwLAorMHgyNSwgMHgyMCwKKzB4MDcsIDB4QzAsIDB4NDQsIDB4QzYsCisKKzB4MTcsIDB4NTAsIDB4NTYsIDB4OUYsCisweEE1LCAweDM3LCAweDRGLCAweEU5LAorCisweDA2LCAweEMwLCAweDIxLCAweEM0LAorMHgwRiwgMHgxNywgMHgwRiwgMHhBRiwKKworMHgzNywgMHgwRiwgMHg1QywgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MUUsIDB4NjIsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDNFLCAweDNELCAweDVELCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MDcsIDB4MjAsCisKKzB4MkYsIDB4MjAsCisweDAwLCAweEUwLAorMHhBMywgMHgwRiwgMHg0RiwgMHhFOSwKKworMHgwNiwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDI2LCAweDFGLCAweERGLAorCisweDE3LCAweDI2LCAweDE3LCAweERGLAorMHhBMSwgMHgxRiwgMHg0RiwgMHhFOSwKKworMHgxRSwgMHgyNiwgMHgxRSwgMHhERiwKKzB4OUQsIDB4MUUsIDB4NEYsIDB4RTksCisKKzB4MzUsIDB4MTcsIDB4NEYsIDB4RTksCisweEEyLCAweDNGLCAweDRGLCAweEU5LAorCisweDA2LCAweDA2LCAweDFGLCAweEFGLAorMHgzOSwgMHgzNywgMHg0RiwgMHhFOSwKKworMHgyRiwgMHgyRiwgMHgxNywgMHhBRiwKKzB4MDcsIDB4MDcsIDB4MUUsIDB4QUYsCisKKzB4QTAsIDB4ODAsIDB4NEYsIDB4RTksCisweDlFLCAweDNFLCAweDRGLCAweEU5LAorCisweDMxLCAweDgwLCAweDRGLCAweEU5LAorMHg5QywgMHg4MCwgMHg0RiwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4NTcsIDB4MzksIDB4MjAsIDB4RTksCisKKzB4MTYsIDB4MjgsIDB4MjAsIDB4RTksCisweDFELCAweDNCLCAweDIwLCAweEU5LAorCisweDFFLCAweDJCLCAweDIwLCAweEU5LAorMHgyQiwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgxQywgMHgyMywgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHg5MCwgMHhFMiwKKzB4MDAsIDB4RTAsCisKKzB4NjMsIDB4RkYsIDB4MjAsIDB4RUEsCisweDE5LCAweEM4LCAweEMxLCAweENELAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg5RiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4NDEsIDB4NDksIDB4QkQsCisweDJELCAweDQxLCAweDUxLCAweEJELAorCisweDBELCAweDgwLCAweDA3LCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI1LCAweDMwLAorMHgyRCwgMHgzMCwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHhBNywgMHg1QiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDYyLCAweEZGLCAweDBBLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOSwgMHg0MSwgMHhDOCwgMHhFQywKKzB4NDIsIDB4RTEsCisweDAwLCAweEUwLAorCisweDYwLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzgsIDB4NDAsIDB4QzAsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDVELCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzIwMF90Z3pzZltdID0geworCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg5OCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg4MSwgMHgwNCwKKzB4ODksIDB4MDQsCisweDAxLCAweDA0LAorMHgwOSwgMHgwNCwKKworMHhDOSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MTEsIDB4MDQsCisweDAwLCAweEUwLAorCisweDQxLCAweENDLCAweDQxLCAweENELAorMHg0OSwgMHhDQywgMHg0OSwgMHhDRCwKKworMHhEMSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4NTEsIDB4Q0MsIDB4NTEsIDB4Q0QsCisKKzB4ODAsIDB4MDQsCisweDEwLCAweDA0LAorMHgwOCwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4MDAsIDB4Q0MsIDB4QzAsIDB4Q0QsCisweEQxLCAweDQ5LCAweEMwLCAweEVDLAorCisweDhBLCAweDFGLCAweDIwLCAweEU5LAorMHg4QiwgMHgzRiwgMHgyMCwgMHhFOSwKKworMHg0MSwgMHgzQywgMHg0MSwgMHhBRCwKKzB4NDksIDB4M0MsIDB4NDksIDB4QUQsCisKKzB4MTAsIDB4Q0MsIDB4MTAsIDB4Q0QsCisweDA4LCAweENDLCAweDA4LCAweENELAorCisweEI5LCAweDQxLCAweDQ5LCAweEJCLAorMHgxRiwgMHhGMCwgMHg0MSwgMHhDRCwKKworMHg1MSwgMHgzQywgMHg1MSwgMHhBRCwKKzB4MDAsIDB4OTgsIDB4ODAsIDB4RTksCisKKzB4OEYsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDFGLCAweDIwLCAweEU5LAorCisweDIxLCAweDQ1LCAweDgwLCAweEU4LAorMHgxQSwgMHg0RCwgMHg4MCwgMHhFOCwKKworMHgzMSwgMHg1NSwgMHg4MCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4NDEsIDB4NDksIDB4QkQsCisweDFELCAweDQxLCAweDUxLCAweEJELAorCisweDJFLCAweDQxLCAweDJBLCAweEI4LAorMHgzNCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHgxNSwgMHgzMCwKKzB4MUQsIDB4MzAsCisweDU4LCAweEUzLAorMHgwMCwgMHhFMCwKKworMHhCNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MjQsIDB4NDMsIDB4QTAsIDB4RTgsCisweDJDLCAweDRCLCAweEEwLCAweEU4LAorCisweDE1LCAweDcyLAorMHgwOSwgMHhFMywKKzB4MDAsIDB4RTAsCisweDFELCAweDcyLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweDk3LCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2QywgMHg2NCwgMHhDOCwgMHhFQywKKzB4OTgsIDB4RTEsCisweEI1LCAweDA1LAorCisweEJELCAweDA1LAorMHgyRSwgMHgzMCwKKzB4MzIsIDB4QzAsIDB4QTAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4QTAsIDB4RTgsCisweDc0LCAweDY0LCAweEM4LCAweEVDLAorCisweDQwLCAweDNDLCAweDQwLCAweEFELAorMHgzMiwgMHg2QSwKKzB4MkEsIDB4MzAsCisKKzB4MjAsIDB4NzMsCisweDMzLCAweDZBLAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4NzMsCisKKzB4MUMsIDB4NzIsCisweDgzLCAweEUyLAorMHg3QiwgMHg4MCwgMHgxNSwgMHhFQSwKKworMHhCOCwgMHgzRCwgMHgyOCwgMHhERiwKKzB4MzAsIDB4MzUsIDB4MjAsIDB4REYsCisKKzB4NDAsIDB4MzAsCisweDAwLCAweEUwLAorMHhDQywgMHhFMiwKKzB4NjQsIDB4NzIsCisKKzB4MjUsIDB4NDIsIDB4NTIsIDB4QkYsCisweDJELCAweDQyLCAweDRBLCAweEJGLAorCisweDMwLCAweDJFLCAweDMwLCAweERGLAorMHgzOCwgMHgyRSwgMHgzOCwgMHhERiwKKworMHgxOCwgMHgxRCwgMHg0NSwgMHhFOSwKKzB4MUUsIDB4MTUsIDB4NDUsIDB4RTksCisKKzB4MkIsIDB4NDksIDB4NTEsIDB4QkQsCisweDAwLCAweEUwLAorMHgxRiwgMHg3MywKKworMHgzOCwgMHgzOCwgMHg0MCwgMHhBRiwKKzB4MzAsIDB4MzAsIDB4NDAsIDB4QUYsCisKKzB4MjQsIDB4MUYsIDB4MjQsIDB4REYsCisweDFELCAweDMyLCAweDIwLCAweEU5LAorCisweDJDLCAweDFGLCAweDJDLCAweERGLAorMHgxQSwgMHgzMywgMHgyMCwgMHhFOSwKKworMHhCMCwgMHgxMCwKKzB4MDgsIDB4RTMsCisweDQwLCAweDEwLAorMHhCOCwgMHgxMCwKKworMHgyNiwgMHhGMCwgMHgzMCwgMHhDRCwKKzB4MkYsIDB4RjAsIDB4MzgsIDB4Q0QsCisKKzB4MkIsIDB4ODAsIDB4MjAsIDB4RTksCisweDJBLCAweDgwLCAweDIwLCAweEU5LAorCisweEE2LCAweDIwLAorMHg4OCwgMHhFMiwKKzB4MDAsIDB4RTAsCisweEFGLCAweDIwLAorCisweDI4LCAweDJBLCAweDI2LCAweEFGLAorMHgyMCwgMHgyQSwgMHhDMCwgMHhBRiwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhERiwKKzB4NDYsIDB4MjQsIDB4NDYsIDB4REYsCisKKzB4MjgsIDB4MzAsIDB4ODAsIDB4QkYsCisweDIwLCAweDM4LCAweDgwLCAweEJGLAorCisweDQ3LCAweDI0LCAweDQ3LCAweERGLAorMHg0RSwgMHgyQywgMHg0RSwgMHhERiwKKworMHg0RiwgMHgyQywgMHg0RiwgMHhERiwKKzB4NTYsIDB4MzQsIDB4NTYsIDB4REYsCisKKzB4MjgsIDB4MTUsIDB4MjgsIDB4REYsCisweDIwLCAweDFELCAweDIwLCAweERGLAorCisweDU3LCAweDM0LCAweDU3LCAweERGLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4MDUsCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDg5LCAweEUyLAorMHgyQiwgMHgzMCwKKworMHgzRiwgMHhDMSwgMHgxRCwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEEwLCAweDY4LAorMHhCRiwgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjAsIDB4QzAsIDB4MjAsIDB4QUYsCisweDI4LCAweDA1LAorMHg5NywgMHg3NCwKKworMHgwMCwgMHhFMCwKKzB4MkEsIDB4MTAsCisweDE2LCAweEMwLCAweDIwLCAweEU5LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4QywgMHhFMiwKKzB4OTUsIDB4MDUsCisKKzB4MjgsIDB4QzEsIDB4MjgsIDB4QUQsCisweDFGLCAweEMxLCAweDE1LCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBOCwgMHg2NywKKzB4OUYsIDB4NkIsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI4LCAweEMwLCAweDI4LCAweEFELAorMHgxRCwgMHgyNSwKKzB4MjAsIDB4MDUsCisKKzB4MjgsIDB4MzIsIDB4ODAsIDB4QUQsCisweDQwLCAweDJBLCAweDQwLCAweEJELAorCisweDFDLCAweDgwLCAweDIwLCAweEU5LAorMHgyMCwgMHgzMywgMHgyMCwgMHhBRCwKKworMHgyMCwgMHg3MywKKzB4MDAsIDB4RTAsCisweEI2LCAweDQ5LCAweDUxLCAweEJCLAorCisweDI2LCAweDJGLCAweEIwLCAweEU4LAorMHgxOSwgMHgyMCwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgyMCwgMHgzNSwgMHhERiwKKzB4M0QsIDB4MjAsIDB4M0QsIDB4REYsCisKKzB4MTUsIDB4MjAsIDB4MTUsIDB4REYsCisweDFELCAweDIwLCAweDFELCAweERGLAorCisweDI2LCAweEQwLCAweDI2LCAweENELAorMHgyOSwgMHg0OSwgMHgyQSwgMHhCOCwKKworMHgyNiwgMHg0MCwgMHg4MCwgMHhCRCwKKzB4M0IsIDB4NDgsIDB4NTAsIDB4QkQsCisKKzB4M0UsIDB4NTQsIDB4NTcsIDB4OUYsCisweDAwLCAweEUwLAorMHg4MiwgMHhFMSwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjYsIDB4MzAsCisweDI5LCAweDMwLAorMHg0OCwgMHgzQywgMHg0OCwgMHhBRCwKKworMHgyQiwgMHg3MiwKKzB4QzIsIDB4RTEsCisweDJDLCAweEMwLCAweDQ0LCAweEMyLAorCisweDA1LCAweDI0LCAweDM0LCAweEJGLAorMHgwRCwgMHgyNCwgMHgyQywgMHhCRiwKKworMHgyRCwgMHg0NiwgMHg0RSwgMHhCRiwKKzB4MjUsIDB4NDYsIDB4NTYsIDB4QkYsCisKKzB4MjAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDMyLCAweDNFLCAweDVGLCAweEU5LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4MzAsCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMzLCAweDFFLCAweDVGLCAweEU5LAorCisweDA1LCAweDQ0LCAweDU0LCAweEIyLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMiwKKworMHgxOSwgMHhDMCwgMHhCMCwgMHhFOCwKKzB4MzQsIDB4QzAsIDB4NDQsIDB4QzQsCisKKzB4MzMsIDB4NzMsCisweDAwLCAweEUwLAorMHgzRSwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorCisweDg0LCAweDNFLCAweDU4LCAweEU5LAorMHgyOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgwNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDg1LCAweDFFLCAweDU4LCAweEU5LAorCisweDlCLCAweDNCLCAweDMzLCAweERGLAorMHgyMCwgMHgyMCwgMHg0MiwgMHhBRiwKKworMHgzMCwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4ODAsIDB4M0UsIDB4NTcsIDB4RTksCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMwLCAweDgwLCAweDVGLCAweEU5LAorCisweDI4LCAweDI4LCAweDI0LCAweEFGLAorMHg4MSwgMHgxRSwgMHg1NywgMHhFOSwKKworMHgwNSwgMHg0NywgMHg1NywgMHhCRiwKKzB4MEQsIDB4NDcsIDB4NEYsIDB4QkYsCisKKzB4ODgsIDB4ODAsIDB4NTgsIDB4RTksCisweDFCLCAweDI5LCAweDFCLCAweERGLAorCisweDMwLCAweDFELCAweDZGLCAweDhGLAorMHgzQSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgxQywgMHgzMCwgMHgyNiwgMHhERiwKKzB4MDksIDB4RTMsCisweDNCLCAweDA1LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgzQiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweEFDLCAweDIwLAorCisweDJELCAweDQ0LCAweDRDLCAweEI0LAorMHgyQywgMHgxQywgMHhDMCwgMHhBRiwKKworMHgyNSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MDAsIDB4RTAsCisweEM4LCAweDMwLAorCisweDMwLCAweDQ2LCAweDMwLCAweEFGLAorMHgxQiwgMHgxQiwgMHg0OCwgMHhBRiwKKworMHgwMCwgMHhFMCwKKzB4MjUsIDB4MjAsCisweDM4LCAweDJDLCAweDRGLCAweEU5LAorCisweDg2LCAweDgwLCAweDU3LCAweEU5LAorMHgzOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgyOCwgMHg3NCwKKzB4MDAsIDB4RTAsCisweDBELCAweDQ0LCAweDRDLCAweEIwLAorCisweDA1LCAweDQ0LCAweDU0LCAweEIwLAorMHgyRCwgMHgyMCwKKzB4OUIsIDB4MTAsCisKKzB4ODIsIDB4M0UsIDB4NTcsIDB4RTksCisweDMyLCAweEYwLCAweDFCLCAweENELAorCisweDFFLCAweEJELCAweDU5LCAweDlGLAorMHg4MywgMHgxRSwgMHg1NywgMHhFOSwKKworMHgzOCwgMHg0NywgMHgzOCwgMHhBRiwKKzB4MzQsIDB4MjAsCisweDJBLCAweDMwLAorCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKzB4MzIsIDB4MjAsCisweDA1LCAweDIwLAorCisweDg3LCAweDgwLCAweDU3LCAweEU5LAorMHgxRiwgMHg1NCwgMHg1NywgMHg5RiwKKworMHgxNywgMHg0MiwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDZBLAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzNywgMHgxRSwgMHg0RiwgMHhFOSwKKworMHgzNywgMHgzMiwgMHgyQSwgMHhBRiwKKzB4MDAsIDB4RTAsCisweDMyLCAweDAwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNywgMHhDMCwgMHg0NCwgMHhDMCwKKworMHgzNiwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4MUYsIDB4MjYsIDB4REYsCisKKzB4MzcsIDB4MUIsIDB4MzcsIDB4QkYsCisweDE3LCAweDI2LCAweDE3LCAweERGLAorCisweDNFLCAweDE3LCAweDRGLCAweEU5LAorMHgzRiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhBRiwKKzB4MkIsIDB4MDUsCisweEE3LCAweDIwLAorCisweDMzLCAweDJCLCAweDM3LCAweERGLAorMHgyNywgMHgxNywgMHhDMCwgMHhBRiwKKworMHgzNCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkQsIDB4MjEsIDB4MUEsIDB4QjAsCisweDI1LCAweDIxLCAweDMxLCAweEIwLAorCisweDBELCAweDIxLCAweDFBLCAweEIyLAorMHgwNSwgMHgyMSwgMHgzMSwgMHhCMiwKKworMHgwMywgMHg4MCwgMHgyQSwgMHhFQSwKKzB4MTcsIDB4QzEsIDB4MkIsIDB4QkQsCisKKzB4MkQsIDB4MjAsCisweDI1LCAweDIwLAorMHgwNSwgMHgyMCwKKzB4MEQsIDB4MjAsCisKKzB4QjMsIDB4NjgsCisweDk3LCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHgzMywgMHhBRiwKKzB4MkYsIDB4QzAsIDB4MjEsIDB4QzAsCisKKzB4MTYsIDB4NDIsIDB4NTYsIDB4OUYsCisweDNDLCAweDI3LCAweDRGLCAweEU5LAorCisweDFFLCAweDYyLCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNSwgMHgyMSwgMHgzMSwgMHhCNCwKKzB4MkQsIDB4MjEsIDB4MUEsIDB4QjQsCisKKzB4M0YsIDB4MkYsIDB4NUQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMzLCAweDA1LAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4MTksIDB4NjAsIDB4RUMsCisKKzB4MEQsIDB4MjEsIDB4MUEsIDB4QjYsCisweDA1LCAweDIxLCAweDMxLCAweEI2LAorCisweDM3LCAweDBGLCAweDVDLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MkYsIDB4MjAsCisKKzB4MjMsIDB4M0IsIDB4MzMsIDB4QUQsCisweDFFLCAweDI2LCAweDFFLCAweERGLAorCisweEE3LCAweDFFLCAweDRGLCAweEU5LAorMHgxNywgMHgyNiwgMHgxNiwgMHhERiwKKworMHgyRCwgMHgyMCwKKzB4MDAsIDB4RTAsCisweEE4LCAweDNGLCAweDRGLCAweEU5LAorCisweDJGLCAweDJGLCAweDFFLCAweEFGLAorMHgyNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisKKzB4QTQsIDB4MTYsIDB4NEYsIDB4RTksCisweDBGLCAweEMwLCAweDIxLCAweEMyLAorCisweEE2LCAweDgwLCAweDRGLCAweEU5LAorMHgxRiwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgwRCwgMHgyMCwKKzB4MDUsIDB4MjAsCisweDJGLCAweEMwLCAweDIxLCAweEM2LAorCisweDNGLCAweDJGLCAweDVELCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MEYsIDB4MjAsCisKKzB4MTcsIDB4NTAsIDB4NTYsIDB4OUYsCisweEE1LCAweDM3LCAweDRGLCAweEU5LAorCisweDA2LCAweEMwLCAweDIxLCAweEM0LAorMHgwRiwgMHgxNywgMHgwRiwgMHhBRiwKKworMHgzNywgMHgwRiwgMHg1QywgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkYsIDB4MjAsCisweDAwLCAweEUwLAorMHhBMywgMHg4MCwgMHg0RiwgMHhFOSwKKworMHgwNiwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDI2LCAweDFGLCAweERGLAorCisweDE3LCAweDI2LCAweDE3LCAweERGLAorMHgzNSwgMHgxNywgMHg0RiwgMHhFOSwKKworMHhBMSwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4QTIsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MDYsIDB4MDYsIDB4MUYsIDB4QUYsCisweDM5LCAweDM3LCAweDRGLCAweEU5LAorCisweDJGLCAweDJGLCAweDE3LCAweEFGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBMCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzEsIDB4ODAsIDB4NEYsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHg1NywgMHgzOSwgMHgyMCwgMHhFOSwKKworMHgxNiwgMHgyOCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4M0IsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MkIsIDB4MjAsIDB4RTksCisweDJCLCAweDMyLCAweDIwLCAweEU5LAorCisweDFDLCAweDIzLCAweDIwLCAweEU5LAorMHg1NywgMHgzNiwgMHgyMCwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDkwLCAweEUyLAorMHgwMCwgMHhFMCwKKworMHg2OCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MTksIDB4QzgsIDB4QzEsIDB4Q0QsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDlGLCAweDQxLCAweDQ5LCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MkQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MEQsIDB4ODAsIDB4MDcsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDM1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MjUsIDB4MzAsCisweDJELCAweDMwLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweEE3LCAweDVCLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjcsIDB4RkYsIDB4MEEsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEM5LCAweDQxLCAweEM4LCAweEVDLAorMHg0MiwgMHhFMSwKKzB4MDAsIDB4RTAsCisKKzB4NjUsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOCwgMHg0MCwgMHhDMCwgMHhFQywKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjIsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3QyZ3pbXSA9IHsKKworMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwQSwgMHg0MCwgMHg1MCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NjAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NTEsIDB4QkYsCisweDNBLCAweDQxLCAweDYxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhEMywgMHg2QiwKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjMsIDB4OUYsCisweDAwLCAweEUwLAorMHg1MSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NjEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDUxLCAweDQxLCAweEUwLCAweEVDLAorMHgzOSwgMHg2NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDYzLCAweEEwLCAweEU4LAorCisweDYxLCAweDQxLCAweEUwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4NzgsIDB4ODAsIDB4MTUsIDB4RUEsCisweDEwLCAweDA0LAorMHgyMCwgMHgwNCwKKworMHg2MSwgMHg1MSwgMHhFMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MEYsIDB4NTIsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NjIsIDB4QkYsCisweDFFLCAweDUxLCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgwRSwgMHg2MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg1MCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NjAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NTEsIDB4QkQsCisweDNBLCAweDQxLCAweDYxLCAweEJELAorCisweEJGLCAweDJGLCAweDBFLCAweEJELAorMHg5NywgMHhFMiwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4MzUsIDB4NDgsIDB4QjEsIDB4RTgsCisweDNELCAweDU5LCAweEIxLCAweEU4LAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjYsIDB4MzEsIDB4NjYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorMHg2NywgMHgzOSwgMHg2NywgMHhCRiwKKworMHg2OSwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4MzUsIDB4MDAsCisweDNELCAweDAwLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHg4RCwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg3NSwgMHhGOCwgMHhFQywKKzB4MzUsIDB4MjAsCisweDNELCAweDIwLAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgwRSwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDQ4LCAweDM1LCAweDQ4LCAweEJGLAorMHg1OCwgMHgzNSwgMHg1OCwgMHhCRiwKKworMHg2OCwgMHgzNSwgMHg2OCwgMHhCRiwKKzB4NDksIDB4M0QsIDB4NDksIDB4QkYsCisKKzB4NTksIDB4M0QsIDB4NTksIDB4QkYsCisweDY5LCAweDNELCAweDY5LCAweEJGLAorCisweDYzLCAweDYzLCAweDJELCAweERGLAorMHg0RCwgMHg3RCwgMHhGOCwgMHhFQywKKworMHg1OSwgMHhFMywKKzB4MDAsIDB4RTAsCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisKKzB4M0YsIDB4NTMsIDB4QTAsIDB4RTgsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg2MywgMHhBMCwgMHhFOCwKKworMHg1MCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NTAsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MEYsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU5LCAweDc4LCAweEY4LCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NTYsIDB4M0YsIDB4NTYsIDB4REYsCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDY2LCAweDNELCAweDY2LCAweERGLAorCisweDFELCAweDMyLCAweDQxLCAweEU5LAorMHg2NywgMHgzRCwgMHg2NywgMHhERiwKKworMHg0NywgMHgzNywgMHg0NywgMHhERiwKKzB4NTcsIDB4M0YsIDB4NTcsIDB4REYsCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU5LCAweDNGLCAweDU5LCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg2OSwgMHgzRCwgMHg2OSwgMHhERiwKKworMHg0OCwgMHgzNywgMHg0OCwgMHhERiwKKzB4NTgsIDB4M0YsIDB4NTgsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHg2OCwgMHgzRCwgMHg2OCwgMHhERiwKKzB4NDksIDB4MzcsIDB4NDksIDB4REYsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNCwgMHg4MCwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NTQsIDB4QjAsCisweDAyLCAweDQ0LCAweDY0LCAweEIwLAorCisweDJBLCAweDQ0LCAweDU0LCAweEIyLAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCMiwKKworMHgyNSwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDNELCAweENGLCAweDc0LCAweEMyLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjQsCisweDFBLCAweDQ0LCAweDY0LCAweEI0LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzOCwgMHgzRCwgMHgyMCwgMHhFOSwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDU2LCAweEJGLAorMHgxQSwgMHg0NiwgMHg2NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ3LCAweDU3LCAweEJGLAorMHgwMiwgMHg0NywgMHg2NywgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDUzLCAweEJGLAorMHgxQSwgMHg0MywgMHg2MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ4LCAweDU4LCAweEJGLAorMHgwMiwgMHg0OCwgMHg2OCwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDJBLCAweDQ5LCAweDU5LCAweEJGLAorMHgxQSwgMHg0OSwgMHg2OSwgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHhCRiwgMHhFQSwKKworMHg4MCwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODEsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4ODIsIDB4MzEsIDB4NTcsIDB4RTksCisweDg2LCAweDc4LCAweDU3LCAweEU5LAorCisweDgzLCAweDM5LCAweDU3LCAweEU5LAorMHg4NywgMHg3OSwgMHg1NywgMHhFOSwKKworMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKzB4OEEsIDB4MzQsIDB4MjAsIDB4RTksCisKKzB4OEIsIDB4M0MsIDB4MjAsIDB4RTksCisweDM3LCAweDUwLCAweDYwLCAweEJELAorCisweDU3LCAweDBELCAweDIwLCAweEU5LAorMHgzNSwgMHg1MSwgMHg2MSwgMHhCRCwKKworMHgyQiwgMHg1MCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgwRSwgMHg3NywKKworMHgyNCwgMHg1MSwgMHgyMCwgMHhFOSwKKzB4OUYsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MEUsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDBCLCAweDQ2LCAweEEwLCAweEU4LAorMHgxQiwgMHg1NiwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2NiwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTcsIDB4QTAsIDB4RTgsCisweDJDLCAweDY3LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg1NywgMHg4MCwgMHg1NywgMHhDRiwKKworMHg2NiwgMHgzMywgMHg2NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDY3LCAweDNCLCAweDY3LCAweENGLAorCisweDBCLCAweDQ4LCAweEEwLCAweEU4LAorMHgxQiwgMHg1OCwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2OCwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDksIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTksIDB4QTAsIDB4RTgsCisweDJDLCAweDY5LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNCwgMHhENywgMHgzNCwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0MsIDB4RDcsIDB4M0MsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNCwgMHg4MCwgMHgzNCwgMHhCRCwKKzB4M0MsIDB4ODAsIDB4M0MsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ4LCAweDgwLCAweDQ4LCAweENGLAorMHg1OSwgMHg4MCwgMHg1OSwgMHhDRiwKKworMHg2OCwgMHgzMywgMHg2OCwgMHhDRiwKKzB4NDksIDB4M0IsIDB4NDksIDB4Q0YsCisKKzB4QkUsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU4LCAweDMzLCAweDU4LCAweENGLAorMHg2OSwgMHgzQiwgMHg2OSwgMHhDRiwKKworMHg3RCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdDJnemFbXSA9IHsKKworMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwQSwgMHg0MCwgMHg1MCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NjAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NTEsIDB4QkYsCisweDNBLCAweDQxLCAweDYxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhEMywgMHg2QiwKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjMsIDB4OUYsCisweDAwLCAweEUwLAorMHg1MSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NjEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDUxLCAweDQxLCAweEUwLCAweEVDLAorMHgzOSwgMHg2NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDYzLCAweEEwLCAweEU4LAorCisweDYxLCAweDQxLCAweEUwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4N0MsIDB4ODAsIDB4MTUsIDB4RUEsCisweDEwLCAweDA0LAorMHgyMCwgMHgwNCwKKworMHg2MSwgMHg1MSwgMHhFMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MEYsIDB4NTIsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NjIsIDB4QkYsCisweDFFLCAweDUxLCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgwRSwgMHg2MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg1MCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NjAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NTEsIDB4QkQsCisweDNBLCAweDQxLCAweDYxLCAweEJELAorCisweEJGLCAweDJGLCAweDBFLCAweEJELAorMHg5NywgMHhFMiwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4MzUsIDB4NDgsIDB4QjEsIDB4RTgsCisweDNELCAweDU5LCAweEIxLCAweEU4LAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjYsIDB4MzEsIDB4NjYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorMHg2NywgMHgzOSwgMHg2NywgMHhCRiwKKworMHg2RCwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4MzUsIDB4MDAsCisweDNELCAweDAwLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHg4RCwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg3NSwgMHhGOCwgMHhFQywKKzB4MzUsIDB4MjAsCisweDNELCAweDIwLAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgwRSwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDQ4LCAweDM1LCAweDQ4LCAweEJGLAorMHg1OCwgMHgzNSwgMHg1OCwgMHhCRiwKKworMHg2OCwgMHgzNSwgMHg2OCwgMHhCRiwKKzB4NDksIDB4M0QsIDB4NDksIDB4QkYsCisKKzB4NTksIDB4M0QsIDB4NTksIDB4QkYsCisweDY5LCAweDNELCAweDY5LCAweEJGLAorCisweDYzLCAweDYzLCAweDJELCAweERGLAorMHg0RCwgMHg3RCwgMHhGOCwgMHhFQywKKworMHg1OSwgMHhFMywKKzB4MDAsIDB4RTAsCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisKKzB4M0YsIDB4NTMsIDB4QTAsIDB4RTgsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg2MywgMHhBMCwgMHhFOCwKKworMHg1MCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NTAsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MEYsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU5LCAweDc4LCAweEY4LCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NTYsIDB4M0YsIDB4NTYsIDB4REYsCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDY2LCAweDNELCAweDY2LCAweERGLAorCisweDFELCAweDMyLCAweDQxLCAweEU5LAorMHg2NywgMHgzRCwgMHg2NywgMHhERiwKKworMHg0NywgMHgzNywgMHg0NywgMHhERiwKKzB4NTcsIDB4M0YsIDB4NTcsIDB4REYsCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU5LCAweDNGLCAweDU5LCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg2OSwgMHgzRCwgMHg2OSwgMHhERiwKKworMHg0OCwgMHgzNywgMHg0OCwgMHhERiwKKzB4NTgsIDB4M0YsIDB4NTgsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHg2OCwgMHgzRCwgMHg2OCwgMHhERiwKKzB4NDksIDB4MzcsIDB4NDksIDB4REYsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNCwgMHg4MCwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NTQsIDB4QjAsCisweDAyLCAweDQ0LCAweDY0LCAweEIwLAorCisweDJBLCAweDQ0LCAweDU0LCAweEIyLAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCMiwKKworMHgyOSwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDBGLCAweENGLCAweDc0LCAweEM2LAorMHgzRCwgMHhDRiwgMHg3NCwgMHhDMiwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDlDLCAweDBGLCAweDIwLCAweEU5LAorCisweDBBLCAweDQ0LCAweDU0LCAweEI0LAorMHgwMiwgMHg0NCwgMHg2NCwgMHhCNCwKKworMHgyQSwgMHg0NCwgMHg1NCwgMHhCNiwKKzB4MUEsIDB4NDQsIDB4NjQsIDB4QjYsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM4LCAweDNELCAweDIwLCAweEU5LAorCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDBBLCAweDQ3LCAweDU3LCAweEJGLAorMHgwMiwgMHg0NywgMHg2NywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ2LCAweDU2LCAweEJGLAorMHgxQSwgMHg0NiwgMHg2NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNiwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NTMsIDB4QkYsCisweDFBLCAweDQzLCAweDYzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg5RCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4OUUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDgsIDB4NTgsIDB4QkYsCisweDAyLCAweDQ4LCAweDY4LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MkEsIDB4NDksIDB4NTksIDB4QkYsCisweDFBLCAweDQ5LCAweDY5LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweEJGLCAweEVBLAorCisweDgwLCAweDMwLCAweDU3LCAweEU5LAorMHg4MSwgMHgzOCwgMHg1NywgMHhFOSwKKworMHg4MiwgMHgzMSwgMHg1NywgMHhFOSwKKzB4ODYsIDB4NzgsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzksIDB4NTcsIDB4RTksCisweDg3LCAweDc5LCAweDU3LCAweEU5LAorCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorMHg4QSwgMHgzNCwgMHgyMCwgMHhFOSwKKworMHg4QiwgMHgzQywgMHgyMCwgMHhFOSwKKzB4MzcsIDB4NTAsIDB4NjAsIDB4QkQsCisKKzB4NTcsIDB4MEQsIDB4MjAsIDB4RTksCisweDM1LCAweDUxLCAweDYxLCAweEJELAorCisweDJCLCAweDUwLCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDBFLCAweDc3LAorCisweDI0LCAweDUxLCAweDIwLCAweEU5LAorMHg5QiwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgwRSwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MEIsIDB4NDYsIDB4QTAsIDB4RTgsCisweDFCLCAweDU2LCAweEEwLCAweEU4LAorCisweDJCLCAweDY2LCAweEEwLCAweEU4LAorMHgwQywgMHg0NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1NywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjcsIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDU3LCAweDgwLCAweDU3LCAweENGLAorCisweDY2LCAweDMzLCAweDY2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NjcsIDB4M0IsIDB4NjcsIDB4Q0YsCisKKzB4MEIsIDB4NDgsIDB4QTAsIDB4RTgsCisweDFCLCAweDU4LCAweEEwLCAweEU4LAorCisweDJCLCAweDY4LCAweEEwLCAweEU4LAorMHgwQywgMHg0OSwgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1OSwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjksIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM0LCAweEQ3LCAweDM0LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzQywgMHhENywgMHgzQywgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM0LCAweDgwLCAweDM0LCAweEJELAorMHgzQywgMHg4MCwgMHgzQywgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDgsIDB4ODAsIDB4NDgsIDB4Q0YsCisweDU5LCAweDgwLCAweDU5LCAweENGLAorCisweDY4LCAweDMzLCAweDY4LCAweENGLAorMHg0OSwgMHgzQiwgMHg0OSwgMHhDRiwKKworMHhCQSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTgsIDB4MzMsIDB4NTgsIDB4Q0YsCisweDY5LCAweDNCLCAweDY5LCAweENGLAorCisweDc5LCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Mmd6YWZbXSA9IHsKKworMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwQSwgMHg0MCwgMHg1MCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NjAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NTEsIDB4QkYsCisweDNBLCAweDQxLCAweDYxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhEMywgMHg2QiwKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjMsIDB4OUYsCisweDAwLCAweEUwLAorMHg1MSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NjEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDUxLCAweDQxLCAweEUwLCAweEVDLAorMHgzOSwgMHg2NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDYzLCAweEEwLCAweEU4LAorCisweDYxLCAweDQxLCAweEUwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4ODEsIDB4ODAsIDB4MTUsIDB4RUEsCisweDEwLCAweDA0LAorMHgyMCwgMHgwNCwKKworMHg2MSwgMHg1MSwgMHhFMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MEYsIDB4NTIsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NjIsIDB4QkYsCisweDFFLCAweDUxLCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgwRSwgMHg2MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg1MCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NjAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NTEsIDB4QkQsCisweDNBLCAweDQxLCAweDYxLCAweEJELAorCisweEJGLCAweDJGLCAweDBFLCAweEJELAorMHg5NywgMHhFMiwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4MzUsIDB4NDgsIDB4QjEsIDB4RTgsCisweDNELCAweDU5LCAweEIxLCAweEU4LAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjYsIDB4MzEsIDB4NjYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorMHg2NywgMHgzOSwgMHg2NywgMHhCRiwKKworMHg3MiwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4MzUsIDB4MDAsCisweDNELCAweDAwLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHg4RCwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg3NSwgMHhGOCwgMHhFQywKKzB4MzUsIDB4MjAsCisweDNELCAweDIwLAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgwRSwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDQ4LCAweDM1LCAweDQ4LCAweEJGLAorMHg1OCwgMHgzNSwgMHg1OCwgMHhCRiwKKworMHg2OCwgMHgzNSwgMHg2OCwgMHhCRiwKKzB4NDksIDB4M0QsIDB4NDksIDB4QkYsCisKKzB4NTksIDB4M0QsIDB4NTksIDB4QkYsCisweDY5LCAweDNELCAweDY5LCAweEJGLAorCisweDYzLCAweDYzLCAweDJELCAweERGLAorMHg0RCwgMHg3RCwgMHhGOCwgMHhFQywKKworMHg1OSwgMHhFMywKKzB4MDAsIDB4RTAsCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisKKzB4M0YsIDB4NTMsIDB4QTAsIDB4RTgsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg2MywgMHhBMCwgMHhFOCwKKworMHg1MCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NTAsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MEYsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU5LCAweDc4LCAweEY4LCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NTYsIDB4M0YsIDB4NTYsIDB4REYsCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDY2LCAweDNELCAweDY2LCAweERGLAorCisweDFELCAweDMyLCAweDQxLCAweEU5LAorMHg2NywgMHgzRCwgMHg2NywgMHhERiwKKworMHg0NywgMHgzNywgMHg0NywgMHhERiwKKzB4NTcsIDB4M0YsIDB4NTcsIDB4REYsCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU5LCAweDNGLCAweDU5LCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg2OSwgMHgzRCwgMHg2OSwgMHhERiwKKworMHg0OCwgMHgzNywgMHg0OCwgMHhERiwKKzB4NTgsIDB4M0YsIDB4NTgsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHg2OCwgMHgzRCwgMHg2OCwgMHhERiwKKzB4NDksIDB4MzcsIDB4NDksIDB4REYsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDBBLCAweDQ0LCAweDU0LCAweEIwLAorMHgwMiwgMHg0NCwgMHg2NCwgMHhCMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzQsIDB4MzcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEIyLAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCMiwKKworMHgyRSwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzIsCisweDBGLCAweENGLCAweDc0LCAweEM2LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDlDLCAweDBGLCAweDIwLCAweEU5LAorCisweDBBLCAweDQ0LCAweDU0LCAweEI0LAorMHgwMiwgMHg0NCwgMHg2NCwgMHhCNCwKKworMHgyQSwgMHg0NCwgMHg1NCwgMHhCNiwKKzB4MUEsIDB4NDQsIDB4NjQsIDB4QjYsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM4LCAweDNELCAweDIwLCAweEU5LAorCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDNELCAweENGLCAweDc1LCAweEM2LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ1LCAweDU1LCAweEI2LAorMHgwMiwgMHg0NSwgMHg2NSwgMHhCNiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDNELCAweDIwLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NTYsIDB4QkYsCisweDFBLCAweDQ2LCAweDY2LCAweEJGLAorCisweDBBLCAweDQ3LCAweDU3LCAweEJGLAorMHgwMiwgMHg0NywgMHg2NywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM4LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg5RCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4OUUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NTMsIDB4QkYsCisweDFBLCAweDQzLCAweDYzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzksIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDgsIDB4NTgsIDB4QkYsCisweDAyLCAweDQ4LCAweDY4LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MkEsIDB4NDksIDB4NTksIDB4QkYsCisweDFBLCAweDQ5LCAweDY5LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweEJGLCAweEVBLAorCisweDgwLCAweDMwLCAweDU3LCAweEU5LAorMHg4MSwgMHgzOCwgMHg1NywgMHhFOSwKKworMHg4MiwgMHgzMSwgMHg1NywgMHhFOSwKKzB4ODYsIDB4NzgsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzksIDB4NTcsIDB4RTksCisweDg3LCAweDc5LCAweDU3LCAweEU5LAorCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorMHg4QSwgMHgzNCwgMHgyMCwgMHhFOSwKKworMHg4QiwgMHgzQywgMHgyMCwgMHhFOSwKKzB4MzcsIDB4NTAsIDB4NjAsIDB4QkQsCisKKzB4NTcsIDB4MEQsIDB4MjAsIDB4RTksCisweDM1LCAweDUxLCAweDYxLCAweEJELAorCisweDJCLCAweDUwLCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDBFLCAweDc3LAorCisweDI0LCAweDUxLCAweDIwLCAweEU5LAorMHg5NiwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgwRSwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MEIsIDB4NDYsIDB4QTAsIDB4RTgsCisweDFCLCAweDU2LCAweEEwLCAweEU4LAorCisweDJCLCAweDY2LCAweEEwLCAweEU4LAorMHgwQywgMHg0NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1NywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjcsIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDU3LCAweDgwLCAweDU3LCAweENGLAorCisweDY2LCAweDMzLCAweDY2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NjcsIDB4M0IsIDB4NjcsIDB4Q0YsCisKKzB4MEIsIDB4NDgsIDB4QTAsIDB4RTgsCisweDFCLCAweDU4LCAweEEwLCAweEU4LAorCisweDJCLCAweDY4LCAweEEwLCAweEU4LAorMHgwQywgMHg0OSwgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1OSwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjksIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM0LCAweEQ3LCAweDM0LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzQywgMHhENywgMHgzQywgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM0LCAweDgwLCAweDM0LCAweEJELAorMHgzQywgMHg4MCwgMHgzQywgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDgsIDB4ODAsIDB4NDgsIDB4Q0YsCisweDU5LCAweDgwLCAweDU5LCAweENGLAorCisweDY4LCAweDMzLCAweDY4LCAweENGLAorMHg0OSwgMHgzQiwgMHg0OSwgMHhDRiwKKworMHhCNSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTgsIDB4MzMsIDB4NTgsIDB4Q0YsCisweDY5LCAweDNCLCAweDY5LCAweENGLAorCisweDc0LCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Mmd6ZltdID0geworCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDBBLCAweDQwLCAweDUwLCAweEJGLAorMHgyQSwgMHg0MCwgMHg2MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg1MSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweEQzLCAweDZCLAorMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyMywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDUxLCAweDA0LAorCisweDkwLCAweEUyLAorMHg2MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDM5LCAweDY3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NjEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg3RCwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MTAsIDB4MDQsCisweDIwLCAweDA0LAorCisweDYxLCAweDUxLCAweEUwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDUyLCAweEJGLAorMHgwRiwgMHg1MiwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg2MiwgMHhCRiwKKzB4MUUsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDBFLCAweDYxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDUwLCAweEJELAorMHgyMiwgMHg0MCwgMHg2MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg1MSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MEUsIDB4QkQsCisweDk3LCAweEUyLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHgzNSwgMHg0OCwgMHhCMSwgMHhFOCwKKzB4M0QsIDB4NTksIDB4QjEsIDB4RTgsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2NiwgMHgzMSwgMHg2NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisweDY3LCAweDM5LCAweDY3LCAweEJGLAorCisweDZFLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgwMCwKKzB4M0QsIDB4MDAsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweDhELCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDc1LCAweEY4LCAweEVDLAorMHgzNSwgMHgyMCwKKzB4M0QsIDB4MjAsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDUzLCAweDUzLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDBFLCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NDgsIDB4MzUsIDB4NDgsIDB4QkYsCisweDU4LCAweDM1LCAweDU4LCAweEJGLAorCisweDY4LCAweDM1LCAweDY4LCAweEJGLAorMHg0OSwgMHgzRCwgMHg0OSwgMHhCRiwKKworMHg1OSwgMHgzRCwgMHg1OSwgMHhCRiwKKzB4NjksIDB4M0QsIDB4NjksIDB4QkYsCisKKzB4NjMsIDB4NjMsIDB4MkQsIDB4REYsCisweDRELCAweDdELCAweEY4LCAweEVDLAorCisweDU5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKworMHgzRiwgMHg1MywgMHhBMCwgMHhFOCwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDYzLCAweEEwLCAweEU4LAorCisweDUwLCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg1MCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgwRiwgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTksIDB4NzgsIDB4RjgsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg1NiwgMHgzRiwgMHg1NiwgMHhERiwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4NjYsIDB4M0QsIDB4NjYsIDB4REYsCisKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisweDY3LCAweDNELCAweDY3LCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRiwgMHg1NywgMHhERiwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTksIDB4M0YsIDB4NTksIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDY5LCAweDNELCAweDY5LCAweERGLAorCisweDQ4LCAweDM3LCAweDQ4LCAweERGLAorMHg1OCwgMHgzRiwgMHg1OCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDY4LCAweDNELCAweDY4LCAweERGLAorMHg0OSwgMHgzNywgMHg0OSwgMHhERiwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM0LCAweDgwLCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MEYsIDB4Q0YsIDB4NzUsIDB4QzYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDBBLCAweDQ0LCAweDU0LCAweEIwLAorMHgwMiwgMHg0NCwgMHg2NCwgMHhCMCwKKworMHgyQSwgMHg0NCwgMHg1NCwgMHhCMiwKKzB4MUEsIDB4NDQsIDB4NjQsIDB4QjIsCisKKzB4MjgsIDB4ODAsIDB4M0EsIDB4RUEsCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMiwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDMxLCAweDBGLCAweDIwLCAweEU5LAorCisweDBBLCAweDQ0LCAweDU0LCAweEI0LAorMHgwMiwgMHg0NCwgMHg2NCwgMHhCNCwKKworMHgyQSwgMHg0NSwgMHg1NSwgMHhCNiwKKzB4MUEsIDB4NDUsIDB4NjUsIDB4QjYsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM4LCAweDNELCAweDIwLCAweEU5LAorCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDBBLCAweDQ3LCAweDU3LCAweEJGLAorMHgwMiwgMHg0NywgMHg2NywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ2LCAweDU2LCAweEJGLAorMHgxQSwgMHg0NiwgMHg2NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNiwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NTMsIDB4QkYsCisweDFBLCAweDQzLCAweDYzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzksIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDgsIDB4NTgsIDB4QkYsCisweDAyLCAweDQ4LCAweDY4LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MkEsIDB4NDksIDB4NTksIDB4QkYsCisweDFBLCAweDQ5LCAweDY5LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweEJGLCAweEVBLAorCisweDgwLCAweDMwLCAweDU3LCAweEU5LAorMHg4MSwgMHgzOCwgMHg1NywgMHhFOSwKKworMHg4MiwgMHgzMSwgMHg1NywgMHhFOSwKKzB4ODYsIDB4NzgsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzksIDB4NTcsIDB4RTksCisweDg3LCAweDc5LCAweDU3LCAweEU5LAorCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorMHg4QSwgMHgzNCwgMHgyMCwgMHhFOSwKKworMHg4QiwgMHgzQywgMHgyMCwgMHhFOSwKKzB4MzcsIDB4NTAsIDB4NjAsIDB4QkQsCisKKzB4NTcsIDB4MEQsIDB4MjAsIDB4RTksCisweDM1LCAweDUxLCAweDYxLCAweEJELAorCisweDJCLCAweDUwLCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDBFLCAweDc3LAorCisweDI0LCAweDUxLCAweDIwLCAweEU5LAorMHg5QSwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgwRSwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MEIsIDB4NDYsIDB4QTAsIDB4RTgsCisweDFCLCAweDU2LCAweEEwLCAweEU4LAorCisweDJCLCAweDY2LCAweEEwLCAweEU4LAorMHgwQywgMHg0NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1NywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjcsIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDU3LCAweDgwLCAweDU3LCAweENGLAorCisweDY2LCAweDMzLCAweDY2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NjcsIDB4M0IsIDB4NjcsIDB4Q0YsCisKKzB4MEIsIDB4NDgsIDB4QTAsIDB4RTgsCisweDFCLCAweDU4LCAweEEwLCAweEU4LAorCisweDJCLCAweDY4LCAweEEwLCAweEU4LAorMHgwQywgMHg0OSwgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1OSwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjksIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM0LCAweEQ3LCAweDM0LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzQywgMHhENywgMHgzQywgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM0LCAweDgwLCAweDM0LCAweEJELAorMHgzQywgMHg4MCwgMHgzQywgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDgsIDB4ODAsIDB4NDgsIDB4Q0YsCisweDU5LCAweDgwLCAweDU5LCAweENGLAorCisweDY4LCAweDMzLCAweDY4LCAweENGLAorMHg0OSwgMHgzQiwgMHg0OSwgMHhDRiwKKworMHhCQiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTgsIDB4MzMsIDB4NTgsIDB4Q0YsCisweDY5LCAweDNCLCAweDY5LCAweENGLAorCisweDc4LCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Mmd6c1tdID0geworCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDBBLCAweDQwLCAweDUwLCAweEJGLAorMHgyQSwgMHg0MCwgMHg2MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg1MSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweEQzLCAweDZCLAorMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyMywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDUxLCAweDA0LAorCisweDkwLCAweEUyLAorMHg2MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDM5LCAweDY3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NjEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg4NSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MTAsIDB4MDQsCisweDIwLCAweDA0LAorCisweDYxLCAweDUxLCAweEUwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDUyLCAweEJGLAorMHgwRiwgMHg1MiwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg2MiwgMHhCRiwKKzB4MUUsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDBFLCAweDYxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDUwLCAweEJELAorMHgyMiwgMHg0MCwgMHg2MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg1MSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MEUsIDB4QkQsCisweDk3LCAweEUyLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHgzNSwgMHg0OCwgMHhCMSwgMHhFOCwKKzB4M0QsIDB4NTksIDB4QjEsIDB4RTgsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2NiwgMHgzMSwgMHg2NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisweDY3LCAweDM5LCAweDY3LCAweEJGLAorCisweDc2LCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgwMCwKKzB4M0QsIDB4MDAsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweDhELCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDc1LCAweEY4LCAweEVDLAorMHgzNSwgMHgyMCwKKzB4M0QsIDB4MjAsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDUzLCAweDUzLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDBFLCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NDgsIDB4MzUsIDB4NDgsIDB4QkYsCisweDU4LCAweDM1LCAweDU4LCAweEJGLAorCisweDY4LCAweDM1LCAweDY4LCAweEJGLAorMHg0OSwgMHgzRCwgMHg0OSwgMHhCRiwKKworMHg1OSwgMHgzRCwgMHg1OSwgMHhCRiwKKzB4NjksIDB4M0QsIDB4NjksIDB4QkYsCisKKzB4NjMsIDB4NjMsIDB4MkQsIDB4REYsCisweDRELCAweDdELCAweEY4LCAweEVDLAorCisweDU5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKworMHgzRiwgMHg1MywgMHhBMCwgMHhFOCwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDYzLCAweEEwLCAweEU4LAorCisweDUwLCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg1MCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgwRiwgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTksIDB4NzgsIDB4RjgsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg1NiwgMHgzRiwgMHg1NiwgMHhERiwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4NjYsIDB4M0QsIDB4NjYsIDB4REYsCisKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisweDY3LCAweDNELCAweDY3LCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRiwgMHg1NywgMHhERiwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTksIDB4M0YsIDB4NTksIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDY5LCAweDNELCAweDY5LCAweERGLAorCisweDQ4LCAweDM3LCAweDQ4LCAweERGLAorMHg1OCwgMHgzRiwgMHg1OCwgMHhERiwKKworMHg2OCwgMHgzRCwgMHg2OCwgMHhERiwKKzB4NDksIDB4MzcsIDB4NDksIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDEyLCAweDEyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHgwRiwgMHhDRiwgMHg3NCwgMHhDMiwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MEEsIDB4NDQsIDB4NTQsIDB4QjAsCisweDAyLCAweDQ0LCAweDY0LCAweEIwLAorCisweDNELCAweENGLCAweDc0LCAweEMwLAorMHgzNCwgMHgzNywgMHgyMCwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzgsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEIyLAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCMiwKKworMHgzMSwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDBGLCAweENGLCAweDc1LCAweEMwLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzRCwgMHhDRiwgMHg3NSwgMHhDMiwKKzB4MzcsIDB4Q0YsIDB4NzUsIDB4QzQsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweEE2LCAweDBGLCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBMywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MUEsIDB4NDQsIDB4NjQsIDB4QjQsCisKKzB4MEEsIDB4NDUsIDB4NTUsIDB4QjAsCisweDAyLCAweDQ1LCAweDY1LCAweEIwLAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTAsIDB4MzcsIDB4MjAsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg1NSwgMHhCMiwKKzB4MUEsIDB4NDUsIDB4NjUsIDB4QjIsCisKKzB4MEEsIDB4NDUsIDB4NTUsIDB4QjQsCisweDAyLCAweDQ1LCAweDY1LCAweEI0LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgyQSwgMHg0NiwgMHg1NiwgMHhCRiwKKzB4MUEsIDB4NDYsIDB4NjYsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM2LCAweDMxLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzNywgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4QTcsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweEE4LCAweDM4LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ3LCAweDU3LCAweEJGLAorMHgwMiwgMHg0NywgMHg2NywgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE1LCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDUzLCAweEJGLAorMHgxQSwgMHg0MywgMHg2MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4QTEsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweEEyLCAweDM4LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ4LCAweDU4LCAweEJGLAorMHgwMiwgMHg0OCwgMHg2OCwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDJBLCAweDQ5LCAweDU5LCAweEJGLAorMHgxQSwgMHg0OSwgMHg2OSwgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHhCRiwgMHhFQSwKKworMHg4MCwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODEsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4ODIsIDB4MzEsIDB4NTcsIDB4RTksCisweDg2LCAweDc4LCAweDU3LCAweEU5LAorCisweDgzLCAweDM5LCAweDU3LCAweEU5LAorMHg4NywgMHg3OSwgMHg1NywgMHhFOSwKKworMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKzB4OEEsIDB4MzQsIDB4MjAsIDB4RTksCisKKzB4OEIsIDB4M0MsIDB4MjAsIDB4RTksCisweDM3LCAweDUwLCAweDYwLCAweEJELAorCisweDU3LCAweDBELCAweDIwLCAweEU5LAorMHgzNSwgMHg1MSwgMHg2MSwgMHhCRCwKKworMHgyQiwgMHg1MCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgwRSwgMHg3NywKKworMHgyNCwgMHg1MSwgMHgyMCwgMHhFOSwKKzB4OTIsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MEUsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDBCLCAweDQ2LCAweEEwLCAweEU4LAorMHgxQiwgMHg1NiwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2NiwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTcsIDB4QTAsIDB4RTgsCisweDJDLCAweDY3LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg1NywgMHg4MCwgMHg1NywgMHhDRiwKKworMHg2NiwgMHgzMywgMHg2NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDY3LCAweDNCLCAweDY3LCAweENGLAorCisweDBCLCAweDQ4LCAweEEwLCAweEU4LAorMHgxQiwgMHg1OCwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2OCwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDksIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTksIDB4QTAsIDB4RTgsCisweDJDLCAweDY5LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNCwgMHhENywgMHgzNCwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0MsIDB4RDcsIDB4M0MsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNCwgMHg4MCwgMHgzNCwgMHhCRCwKKzB4M0MsIDB4ODAsIDB4M0MsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ4LCAweDgwLCAweDQ4LCAweENGLAorMHg1OSwgMHg4MCwgMHg1OSwgMHhDRiwKKworMHg2OCwgMHgzMywgMHg2OCwgMHhDRiwKKzB4NDksIDB4M0IsIDB4NDksIDB4Q0YsCisKKzB4QjIsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU4LCAweDMzLCAweDU4LCAweENGLAorMHg2OSwgMHgzQiwgMHg2OSwgMHhDRiwKKworMHg3MCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdDJnenNhW10gPSB7CisKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MEEsIDB4NDAsIDB4NTAsIDB4QkYsCisweDJBLCAweDQwLCAweDYwLCAweEJGLAorCisweDMyLCAweDQxLCAweDUxLCAweEJGLAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRiwKKworMHhDMywgMHg2QiwKKzB4RDMsIDB4NkIsCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHg5NiwgMHhFMiwKKzB4NDEsIDB4MDQsCisKKzB4N0IsIDB4NDMsIDB4QTAsIDB4RTgsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweEFELCAweEVFLCAweDIzLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4NTEsIDB4MDQsCisKKzB4OTAsIDB4RTIsCisweDYxLCAweDA0LAorMHgzMSwgMHg0NiwgMHhCMSwgMHhFOCwKKworMHg1MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzksIDB4NjcsIDB4QjEsIDB4RTgsCisKKzB4MDAsIDB4MDQsCisweDQ2LCAweEUyLAorMHg3MywgMHg2MywgMHhBMCwgMHhFOCwKKworMHg2MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzEsIDB4MDAsCisweDM5LCAweDAwLAorCisweDhBLCAweDgwLCAweDE1LCAweEVBLAorMHgxMCwgMHgwNCwKKzB4MjAsIDB4MDQsCisKKzB4NjEsIDB4NTEsIDB4RTAsIDB4RUMsCisweDJGLCAweDQxLCAweDYwLCAweEVBLAorCisweDMxLCAweDIwLAorMHgzOSwgMHgyMCwKKzB4MUYsIDB4NDIsIDB4QTAsIDB4RTgsCisKKzB4MkEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDBGLCAweDUyLCAweEEwLCAweEU4LAorCisweDFBLCAweDQyLCAweDYyLCAweEJGLAorMHgxRSwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4MEUsIDB4NjEsIDB4NjAsIDB4RUEsCisKKzB4MzIsIDB4NDAsIDB4NTAsIDB4QkQsCisweDIyLCAweDQwLCAweDYwLCAweEJELAorCisweDEyLCAweDQxLCAweDUxLCAweEJELAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRCwKKworMHhCRiwgMHgyRiwgMHgwRSwgMHhCRCwKKzB4OTcsIDB4RTIsCisweDdCLCAweDcyLAorCisweDMyLCAweDIwLAorMHgyMiwgMHgyMCwKKzB4MTIsIDB4MjAsCisweDNBLCAweDIwLAorCisweDM1LCAweDQ4LCAweEIxLCAweEU4LAorMHgzRCwgMHg1OSwgMHhCMSwgMHhFOCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NTYsIDB4MzEsIDB4NTYsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDY2LCAweDMxLCAweDY2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg1NywgMHgzOSwgMHg1NywgMHhCRiwKKzB4NjcsIDB4MzksIDB4NjcsIDB4QkYsCisKKzB4N0IsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDM1LCAweDAwLAorMHgzRCwgMHgwMCwKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4OEQsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NzUsIDB4RjgsIDB4RUMsCisweDM1LCAweDIwLAorMHgzRCwgMHgyMCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MEUsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg0OCwgMHgzNSwgMHg0OCwgMHhCRiwKKzB4NTgsIDB4MzUsIDB4NTgsIDB4QkYsCisKKzB4NjgsIDB4MzUsIDB4NjgsIDB4QkYsCisweDQ5LCAweDNELCAweDQ5LCAweEJGLAorCisweDU5LCAweDNELCAweDU5LCAweEJGLAorMHg2OSwgMHgzRCwgMHg2OSwgMHhCRiwKKworMHg2MywgMHg2MywgMHgyRCwgMHhERiwKKzB4NEQsIDB4N0QsIDB4RjgsIDB4RUMsCisKKzB4NTksIDB4RTMsCisweDAwLCAweEUwLAorMHhCOCwgMHgzOCwgMHgzMywgMHhCRiwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorCisweDNGLCAweDUzLCAweEEwLCAweEU4LAorMHgwNSwgMHg4MCwgMHgzRCwgMHhFQSwKKworMHgzNywgMHg0MywgMHhBMCwgMHhFOCwKKzB4M0QsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NTAsIDB4NzAsIDB4RjgsIDB4RUMsCisweDJCLCAweDUwLCAweDNDLCAweEU5LAorCisweDFGLCAweDBGLCAweEJDLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1OSwgMHg3OCwgMHhGOCwgMHhFQywKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDU2LCAweDNGLCAweDU2LCAweERGLAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHg2NiwgMHgzRCwgMHg2NiwgMHhERiwKKworMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKzB4NjcsIDB4M0QsIDB4NjcsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNGLCAweDU3LCAweERGLAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1OSwgMHgzRiwgMHg1OSwgMHhERiwKKworMHgxNiwgMHgzMCwgMHgyMCwgMHhFOSwKKzB4NjksIDB4M0QsIDB4NjksIDB4REYsCisKKzB4NDgsIDB4MzcsIDB4NDgsIDB4REYsCisweDU4LCAweDNGLCAweDU4LCAweERGLAorCisweDY4LCAweDNELCAweDY4LCAweERGLAorMHg0OSwgMHgzNywgMHg0OSwgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDBGLCAweENGLCAweDc0LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg1NCwgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NjQsIDB4QjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzOCwgMHgwRiwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjIsCisweDFBLCAweDQ0LCAweDY0LCAweEIyLAorCisweDM2LCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MEYsIDB4Q0YsIDB4NzUsIDB4QzAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDNELCAweENGLCAweDc1LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NSwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTYsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEzLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEI0LAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCNCwKKworMHgwQSwgMHg0NSwgMHg1NSwgMHhCMCwKKzB4MDIsIDB4NDUsIDB4NjUsIDB4QjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBMCwgMHgzNywgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg1NSwgMHhCMiwKKzB4MUEsIDB4NDUsIDB4NjUsIDB4QjIsCisKKzB4MEEsIDB4NDUsIDB4NTUsIDB4QjQsCisweDAyLCAweDQ1LCAweDY1LCAweEI0LAorCisweDBGLCAweENGLCAweDc0LCAweEM2LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTcsIDB4MzAsIDB4NEYsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUMsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE4LCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEI2LAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCNiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NTYsIDB4QkYsCisweDFBLCAweDQ2LCAweDY2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDcsIDB4NTcsIDB4QkYsCisweDAyLCAweDQ3LCAweDY3LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBMSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTIsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NTMsIDB4QkYsCisweDFBLCAweDQzLCAweDYzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg5RCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4OUUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDgsIDB4NTgsIDB4QkYsCisweDAyLCAweDQ4LCAweDY4LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MkEsIDB4NDksIDB4NTksIDB4QkYsCisweDFBLCAweDQ5LCAweDY5LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweEJGLCAweEVBLAorCisweDgwLCAweDMwLCAweDU3LCAweEU5LAorMHg4MSwgMHgzOCwgMHg1NywgMHhFOSwKKworMHg4MiwgMHgzMSwgMHg1NywgMHhFOSwKKzB4ODYsIDB4NzgsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzksIDB4NTcsIDB4RTksCisweDg3LCAweDc5LCAweDU3LCAweEU5LAorCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorMHg4QSwgMHgzNCwgMHgyMCwgMHhFOSwKKworMHg4QiwgMHgzQywgMHgyMCwgMHhFOSwKKzB4MzcsIDB4NTAsIDB4NjAsIDB4QkQsCisKKzB4NTcsIDB4MEQsIDB4MjAsIDB4RTksCisweDM1LCAweDUxLCAweDYxLCAweEJELAorCisweDJCLCAweDUwLCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDBFLCAweDc3LAorCisweDI0LCAweDUxLCAweDIwLCAweEU5LAorMHg4RCwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgwRSwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MEIsIDB4NDYsIDB4QTAsIDB4RTgsCisweDFCLCAweDU2LCAweEEwLCAweEU4LAorCisweDJCLCAweDY2LCAweEEwLCAweEU4LAorMHgwQywgMHg0NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1NywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjcsIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDU3LCAweDgwLCAweDU3LCAweENGLAorCisweDY2LCAweDMzLCAweDY2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NjcsIDB4M0IsIDB4NjcsIDB4Q0YsCisKKzB4MEIsIDB4NDgsIDB4QTAsIDB4RTgsCisweDFCLCAweDU4LCAweEEwLCAweEU4LAorCisweDJCLCAweDY4LCAweEEwLCAweEU4LAorMHgwQywgMHg0OSwgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1OSwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjksIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM0LCAweEQ3LCAweDM0LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzQywgMHhENywgMHgzQywgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM0LCAweDgwLCAweDM0LCAweEJELAorMHgzQywgMHg4MCwgMHgzQywgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDgsIDB4ODAsIDB4NDgsIDB4Q0YsCisweDU5LCAweDgwLCAweDU5LCAweENGLAorCisweDY4LCAweDMzLCAweDY4LCAweENGLAorMHg0OSwgMHgzQiwgMHg0OSwgMHhDRiwKKworMHhBRCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTgsIDB4MzMsIDB4NTgsIDB4Q0YsCisweDY5LCAweDNCLCAweDY5LCAweENGLAorCisweDZCLCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Mmd6c2FmW10gPSB7CisKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MEEsIDB4NDAsIDB4NTAsIDB4QkYsCisweDJBLCAweDQwLCAweDYwLCAweEJGLAorCisweDMyLCAweDQxLCAweDUxLCAweEJGLAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRiwKKworMHhDMywgMHg2QiwKKzB4RDMsIDB4NkIsCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHg5NiwgMHhFMiwKKzB4NDEsIDB4MDQsCisKKzB4N0IsIDB4NDMsIDB4QTAsIDB4RTgsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweEFELCAweEVFLCAweDIzLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4NTEsIDB4MDQsCisKKzB4OTAsIDB4RTIsCisweDYxLCAweDA0LAorMHgzMSwgMHg0NiwgMHhCMSwgMHhFOCwKKworMHg1MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzksIDB4NjcsIDB4QjEsIDB4RTgsCisKKzB4MDAsIDB4MDQsCisweDQ2LCAweEUyLAorMHg3MywgMHg2MywgMHhBMCwgMHhFOCwKKworMHg2MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzEsIDB4MDAsCisweDM5LCAweDAwLAorCisweDhFLCAweDgwLCAweDE1LCAweEVBLAorMHgxMCwgMHgwNCwKKzB4MjAsIDB4MDQsCisKKzB4NjEsIDB4NTEsIDB4RTAsIDB4RUMsCisweDJGLCAweDQxLCAweDYwLCAweEVBLAorCisweDMxLCAweDIwLAorMHgzOSwgMHgyMCwKKzB4MUYsIDB4NDIsIDB4QTAsIDB4RTgsCisKKzB4MkEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDBGLCAweDUyLCAweEEwLCAweEU4LAorCisweDFBLCAweDQyLCAweDYyLCAweEJGLAorMHgxRSwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4MEUsIDB4NjEsIDB4NjAsIDB4RUEsCisKKzB4MzIsIDB4NDAsIDB4NTAsIDB4QkQsCisweDIyLCAweDQwLCAweDYwLCAweEJELAorCisweDEyLCAweDQxLCAweDUxLCAweEJELAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRCwKKworMHhCRiwgMHgyRiwgMHgwRSwgMHhCRCwKKzB4OTcsIDB4RTIsCisweDdCLCAweDcyLAorCisweDMyLCAweDIwLAorMHgyMiwgMHgyMCwKKzB4MTIsIDB4MjAsCisweDNBLCAweDIwLAorCisweDM1LCAweDQ4LCAweEIxLCAweEU4LAorMHgzRCwgMHg1OSwgMHhCMSwgMHhFOCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NTYsIDB4MzEsIDB4NTYsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDY2LCAweDMxLCAweDY2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg1NywgMHgzOSwgMHg1NywgMHhCRiwKKzB4NjcsIDB4MzksIDB4NjcsIDB4QkYsCisKKzB4N0YsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDM1LCAweDAwLAorMHgzRCwgMHgwMCwKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4OEQsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NzUsIDB4RjgsIDB4RUMsCisweDM1LCAweDIwLAorMHgzRCwgMHgyMCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MEUsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg0OCwgMHgzNSwgMHg0OCwgMHhCRiwKKzB4NTgsIDB4MzUsIDB4NTgsIDB4QkYsCisKKzB4NjgsIDB4MzUsIDB4NjgsIDB4QkYsCisweDQ5LCAweDNELCAweDQ5LCAweEJGLAorCisweDU5LCAweDNELCAweDU5LCAweEJGLAorMHg2OSwgMHgzRCwgMHg2OSwgMHhCRiwKKworMHg2MywgMHg2MywgMHgyRCwgMHhERiwKKzB4NEQsIDB4N0QsIDB4RjgsIDB4RUMsCisKKzB4NTksIDB4RTMsCisweDAwLCAweEUwLAorMHhCOCwgMHgzOCwgMHgzMywgMHhCRiwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorCisweDNGLCAweDUzLCAweEEwLCAweEU4LAorMHgwNSwgMHg4MCwgMHgzRCwgMHhFQSwKKworMHgzNywgMHg0MywgMHhBMCwgMHhFOCwKKzB4M0QsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NTAsIDB4NzAsIDB4RjgsIDB4RUMsCisweDJCLCAweDUwLCAweDNDLCAweEU5LAorCisweDFGLCAweDBGLCAweEJDLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1OSwgMHg3OCwgMHhGOCwgMHhFQywKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDU2LCAweDNGLCAweDU2LCAweERGLAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHg2NiwgMHgzRCwgMHg2NiwgMHhERiwKKworMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKzB4NjcsIDB4M0QsIDB4NjcsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNGLCAweDU3LCAweERGLAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1OSwgMHgzRiwgMHg1OSwgMHhERiwKKworMHgxNiwgMHgzMCwgMHgyMCwgMHhFOSwKKzB4NjksIDB4M0QsIDB4NjksIDB4REYsCisKKzB4NDgsIDB4MzcsIDB4NDgsIDB4REYsCisweDU4LCAweDNGLCAweDU4LCAweERGLAorCisweDY4LCAweDNELCAweDY4LCAweERGLAorMHg0OSwgMHgzNywgMHg0OSwgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDBGLCAweENGLCAweDc0LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg1NCwgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NjQsIDB4QjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzOCwgMHgwRiwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjIsCisweDFBLCAweDQ0LCAweDY0LCAweEIyLAorCisweDNBLCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MEYsIDB4Q0YsIDB4NzUsIDB4QzAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDNELCAweENGLCAweDc1LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NSwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTYsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEzLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEI0LAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCNCwKKworMHgwQSwgMHg0NSwgMHg1NSwgMHhCMCwKKzB4MDIsIDB4NDUsIDB4NjUsIDB4QjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBMCwgMHgzNywgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg1NSwgMHhCMiwKKzB4MUEsIDB4NDUsIDB4NjUsIDB4QjIsCisKKzB4MEEsIDB4NDUsIDB4NTUsIDB4QjQsCisweDAyLCAweDQ1LCAweDY1LCAweEI0LAorCisweDBGLCAweENGLCAweDc0LCAweEM2LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTcsIDB4MzAsIDB4NEYsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUMsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE4LCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEI2LAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCNiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ1LCAweDU1LCAweEI2LAorMHgwMiwgMHg0NSwgMHg2NSwgMHhCNiwKKworMHgzRCwgMHhDRiwgMHg3NSwgMHhDNiwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDU2LCAweEJGLAorMHgxQSwgMHg0NiwgMHg2NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE1LCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDNELCAweDIwLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MEEsIDB4NDcsIDB4NTcsIDB4QkYsCisweDAyLCAweDQ3LCAweDY3LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHhBMSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4QTIsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDlELCAweDMxLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg5RSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0MywgMHg1MywgMHhCRiwKKzB4MUEsIDB4NDMsIDB4NjMsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM1LCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzOSwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgwQSwgMHg0OCwgMHg1OCwgMHhCRiwKKzB4MDIsIDB4NDgsIDB4NjgsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgyQSwgMHg0OSwgMHg1OSwgMHhCRiwKKzB4MUEsIDB4NDksIDB4NjksIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QSwgMHgzNiwgMHgyMCwgMHhFOSwKKworMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKzB4OEIsIDB4M0UsIDB4QkYsIDB4RUEsCisKKzB4ODAsIDB4MzAsIDB4NTcsIDB4RTksCisweDgxLCAweDM4LCAweDU3LCAweEU5LAorCisweDgyLCAweDMxLCAweDU3LCAweEU5LAorMHg4NiwgMHg3OCwgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOSwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzksIDB4NTcsIDB4RTksCisKKzB4MzAsIDB4MUYsIDB4NUYsIDB4RTksCisweDhBLCAweDM0LCAweDIwLCAweEU5LAorCisweDhCLCAweDNDLCAweDIwLCAweEU5LAorMHgzNywgMHg1MCwgMHg2MCwgMHhCRCwKKworMHg1NywgMHgwRCwgMHgyMCwgMHhFOSwKKzB4MzUsIDB4NTEsIDB4NjEsIDB4QkQsCisKKzB4MkIsIDB4NTAsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MEUsIDB4NzcsCisKKzB4MjQsIDB4NTEsIDB4MjAsIDB4RTksCisweDg5LCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDBFLCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgwQiwgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MUIsIDB4NTYsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NjYsIDB4QTAsIDB4RTgsCisweDBDLCAweDQ3LCAweEEwLCAweEU4LAorCisweDFDLCAweDU3LCAweEEwLCAweEU4LAorMHgyQywgMHg2NywgMHhBMCwgMHhFOCwKKworMHgwQiwgMHgwMCwKKzB4MUIsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQywgMHgwMCwKKzB4MUMsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHg2NSwKKzB4MUIsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQywgMHg2NSwKKzB4MUMsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHgxQiwgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDBDLCAweDFDLCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgwQiwgMHgyQiwgMHhERSwgMHhFOCwKKzB4MUIsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDBCLCAweEJELAorMHgzQiwgMHhENywgMHgxQiwgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NTcsIDB4ODAsIDB4NTcsIDB4Q0YsCisKKzB4NjYsIDB4MzMsIDB4NjYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweDU2LCAweDMzLCAweDU2LCAweENGLAorMHg2NywgMHgzQiwgMHg2NywgMHhDRiwKKworMHgwQiwgMHg0OCwgMHhBMCwgMHhFOCwKKzB4MUIsIDB4NTgsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NjgsIDB4QTAsIDB4RTgsCisweDBDLCAweDQ5LCAweEEwLCAweEU4LAorCisweDFDLCAweDU5LCAweEEwLCAweEU4LAorMHgyQywgMHg2OSwgMHhBMCwgMHhFOCwKKworMHgwQiwgMHgwMCwKKzB4MUIsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQywgMHgwMCwKKzB4MUMsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHg2NSwKKzB4MUIsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQywgMHg2NSwKKzB4MUMsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHgxQiwgMHg2MCwgMHhFQywKKzB4MzQsIDB4RDcsIDB4MzQsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDBDLCAweDFDLCAweDYwLCAweEVDLAorCisweDNDLCAweEQ3LCAweDNDLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgwQiwgMHgyQiwgMHhERSwgMHhFOCwKKzB4MUIsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzQsIDB4ODAsIDB4MzQsIDB4QkQsCisweDNDLCAweDgwLCAweDNDLCAweEJELAorCisweDMzLCAweEQ3LCAweDBCLCAweEJELAorMHgzQiwgMHhENywgMHgxQiwgMHhCRCwKKworMHg0OCwgMHg4MCwgMHg0OCwgMHhDRiwKKzB4NTksIDB4ODAsIDB4NTksIDB4Q0YsCisKKzB4NjgsIDB4MzMsIDB4NjgsIDB4Q0YsCisweDQ5LCAweDNCLCAweDQ5LCAweENGLAorCisweEE5LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1OCwgMHgzMywgMHg1OCwgMHhDRiwKKzB4NjksIDB4M0IsIDB4NjksIDB4Q0YsCisKKzB4NjcsIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3QyZ3pzZltdID0geworCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDBBLCAweDQwLCAweDUwLCAweEJGLAorMHgyQSwgMHg0MCwgMHg2MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg1MSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweEQzLCAweDZCLAorMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyMywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDUxLCAweDA0LAorCisweDkwLCAweEUyLAorMHg2MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDM5LCAweDY3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NjEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg4QSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MTAsIDB4MDQsCisweDIwLCAweDA0LAorCisweDYxLCAweDUxLCAweEUwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDUyLCAweEJGLAorMHgwRiwgMHg1MiwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg2MiwgMHhCRiwKKzB4MUUsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDBFLCAweDYxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDUwLCAweEJELAorMHgyMiwgMHg0MCwgMHg2MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg1MSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MEUsIDB4QkQsCisweDk3LCAweEUyLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHgzNSwgMHg0OCwgMHhCMSwgMHhFOCwKKzB4M0QsIDB4NTksIDB4QjEsIDB4RTgsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2NiwgMHgzMSwgMHg2NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisweDY3LCAweDM5LCAweDY3LCAweEJGLAorCisweDdCLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgwMCwKKzB4M0QsIDB4MDAsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweDhELCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDc1LCAweEY4LCAweEVDLAorMHgzNSwgMHgyMCwKKzB4M0QsIDB4MjAsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDUzLCAweDUzLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDBFLCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NDgsIDB4MzUsIDB4NDgsIDB4QkYsCisweDU4LCAweDM1LCAweDU4LCAweEJGLAorCisweDY4LCAweDM1LCAweDY4LCAweEJGLAorMHg0OSwgMHgzRCwgMHg0OSwgMHhCRiwKKworMHg1OSwgMHgzRCwgMHg1OSwgMHhCRiwKKzB4NjksIDB4M0QsIDB4NjksIDB4QkYsCisKKzB4NjMsIDB4NjMsIDB4MkQsIDB4REYsCisweDRELCAweDdELCAweEY4LCAweEVDLAorCisweDU5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKworMHgzRiwgMHg1MywgMHhBMCwgMHhFOCwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDYzLCAweEEwLCAweEU4LAorCisweDUwLCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg1MCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgwRiwgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTksIDB4NzgsIDB4RjgsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg1NiwgMHgzRiwgMHg1NiwgMHhERiwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4NjYsIDB4M0QsIDB4NjYsIDB4REYsCisKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisweDY3LCAweDNELCAweDY3LCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRiwgMHg1NywgMHhERiwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTksIDB4M0YsIDB4NTksIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDY5LCAweDNELCAweDY5LCAweERGLAorCisweDQ4LCAweDM3LCAweDQ4LCAweERGLAorMHg1OCwgMHgzRiwgMHg1OCwgMHhERiwKKworMHg2OCwgMHgzRCwgMHg2OCwgMHhERiwKKzB4NDksIDB4MzcsIDB4NDksIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDEyLCAweDEyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHgwRiwgMHhDRiwgMHg3NCwgMHhDMiwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MEEsIDB4NDQsIDB4NTQsIDB4QjAsCisweDAyLCAweDQ0LCAweDY0LCAweEIwLAorCisweDNELCAweENGLCAweDc0LCAweEMwLAorMHgzNCwgMHgzNywgMHgyMCwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzgsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEIyLAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCMiwKKworMHgzNiwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDBGLCAweENGLCAweDc1LCAweEMwLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzRCwgMHhDRiwgMHg3NSwgMHhDMiwKKzB4MzcsIDB4Q0YsIDB4NzUsIDB4QzQsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweEE2LCAweDBGLCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBMywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MUEsIDB4NDQsIDB4NjQsIDB4QjQsCisKKzB4MEEsIDB4NDUsIDB4NTUsIDB4QjAsCisweDAyLCAweDQ1LCAweDY1LCAweEIwLAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTAsIDB4MzcsIDB4MjAsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4M0IsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDUsIDB4NTUsIDB4QjIsCisweDFBLCAweDQ1LCAweDY1LCAweEIyLAorCisweDBBLCAweDQ1LCAweDU1LCAweEI0LAorMHgwMiwgMHg0NSwgMHg2NSwgMHhCNCwKKworMHgwRiwgMHhDRiwgMHg3NSwgMHhDNiwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweEE3LCAweDMwLCAweDRGLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDMxLCAweDBGLCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBOCwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg1NSwgMHhCNiwKKzB4MUEsIDB4NDUsIDB4NjUsIDB4QjYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM2LCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzNywgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDU2LCAweEJGLAorMHgxQSwgMHg0NiwgMHg2NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE1LCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ3LCAweDU3LCAweEJGLAorMHgwMiwgMHg0NywgMHg2NywgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTEsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEyLCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDUzLCAweEJGLAorMHgxQSwgMHg0MywgMHg2MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzUsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM5LCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ4LCAweDU4LCAweEJGLAorMHgwMiwgMHg0OCwgMHg2OCwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDJBLCAweDQ5LCAweDU5LCAweEJGLAorMHgxQSwgMHg0OSwgMHg2OSwgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHhCRiwgMHhFQSwKKworMHg4MCwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODEsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4ODIsIDB4MzEsIDB4NTcsIDB4RTksCisweDg2LCAweDc4LCAweDU3LCAweEU5LAorCisweDgzLCAweDM5LCAweDU3LCAweEU5LAorMHg4NywgMHg3OSwgMHg1NywgMHhFOSwKKworMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKzB4OEEsIDB4MzQsIDB4MjAsIDB4RTksCisKKzB4OEIsIDB4M0MsIDB4MjAsIDB4RTksCisweDM3LCAweDUwLCAweDYwLCAweEJELAorCisweDU3LCAweDBELCAweDIwLCAweEU5LAorMHgzNSwgMHg1MSwgMHg2MSwgMHhCRCwKKworMHgyQiwgMHg1MCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgwRSwgMHg3NywKKworMHgyNCwgMHg1MSwgMHgyMCwgMHhFOSwKKzB4OEQsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MEUsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDBCLCAweDQ2LCAweEEwLCAweEU4LAorMHgxQiwgMHg1NiwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2NiwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTcsIDB4QTAsIDB4RTgsCisweDJDLCAweDY3LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg1NywgMHg4MCwgMHg1NywgMHhDRiwKKworMHg2NiwgMHgzMywgMHg2NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDY3LCAweDNCLCAweDY3LCAweENGLAorCisweDBCLCAweDQ4LCAweEEwLCAweEU4LAorMHgxQiwgMHg1OCwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2OCwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDksIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTksIDB4QTAsIDB4RTgsCisweDJDLCAweDY5LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNCwgMHhENywgMHgzNCwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0MsIDB4RDcsIDB4M0MsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNCwgMHg4MCwgMHgzNCwgMHhCRCwKKzB4M0MsIDB4ODAsIDB4M0MsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ4LCAweDgwLCAweDQ4LCAweENGLAorMHg1OSwgMHg4MCwgMHg1OSwgMHhDRiwKKworMHg2OCwgMHgzMywgMHg2OCwgMHhDRiwKKzB4NDksIDB4M0IsIDB4NDksIDB4Q0YsCisKKzB4QUQsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU4LCAweDMzLCAweDU4LCAweENGLAorMHg2OSwgMHgzQiwgMHg2OSwgMHhDRiwKKworMHg2QiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdGd6W10gPSB7CisKKzB4MDAsIDB4ODgsIDB4OTgsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjIsIDB4NDAsIDB4NDgsIDB4QkYsCisweDJBLCAweDQwLCAweDUwLCAweEJGLAorCisweDMyLCAweDQxLCAweDQ5LCAweEJGLAorMHgzQSwgMHg0MSwgMHg1MSwgMHhCRiwKKworMHhDMywgMHg2QiwKKzB4Q0IsIDB4NkIsCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHg5NiwgMHhFMiwKKzB4NDEsIDB4MDQsCisKKzB4N0IsIDB4NDMsIDB4QTAsIDB4RTgsCisweDczLCAweDRCLCAweEEwLCAweEU4LAorCisweEFELCAweEVFLCAweDI5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4NDksIDB4MDQsCisKKzB4OTAsIDB4RTIsCisweDUxLCAweDA0LAorMHgzMSwgMHg0NiwgMHhCMSwgMHhFOCwKKworMHg0OSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MzksIDB4NTcsIDB4QjEsIDB4RTgsCisKKzB4MDAsIDB4MDQsCisweDQ2LCAweEUyLAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHg1MSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MzEsIDB4MDAsCisweDM5LCAweDAwLAorCisweDU4LCAweDgwLCAweDE1LCAweEVBLAorMHgwOCwgMHgwNCwKKzB4MTAsIDB4MDQsCisKKzB4NTEsIDB4NDksIDB4QzAsIDB4RUMsCisweDJGLCAweDQxLCAweDYwLCAweEVBLAorCisweDMxLCAweDIwLAorMHgzOSwgMHgyMCwKKzB4MUYsIDB4NDIsIDB4QTAsIDB4RTgsCisKKzB4MkEsIDB4NDIsIDB4NEEsIDB4QkYsCisweDI3LCAweDRBLCAweEEwLCAweEU4LAorCisweDFBLCAweDQyLCAweDUyLCAweEJGLAorMHgxRSwgMHg0OSwgMHg2MCwgMHhFQSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4MjYsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4MzIsIDB4NDAsIDB4NDgsIDB4QkQsCisweDIyLCAweDQwLCAweDUwLCAweEJELAorCisweDEyLCAweDQxLCAweDQ5LCAweEJELAorMHgzQSwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHhCRiwgMHgyRiwgMHgyNiwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDdCLCAweDcyLAorCisweDMyLCAweDIwLAorMHgyMiwgMHgyMCwKKzB4MTIsIDB4MjAsCisweDNBLCAweDIwLAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg0RSwgMHgzMSwgMHg0RSwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTYsIDB4MzEsIDB4NTYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDRGLCAweDM5LCAweDRGLCAweEJGLAorMHg1NywgMHgzOSwgMHg1NywgMHhCRiwKKworMHg0QSwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4NDIsIDB4NzMsIDB4RjgsIDB4RUMsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweEE1LCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg0QiwgMHg0QiwgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgyNiwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDUzLCAweDUzLCAweDJELCAweERGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhCOCwgMHgzOCwgMHgzMywgMHhCRiwKKzB4MDAsIDB4RTAsCisweDU5LCAweEUzLAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4M0YsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgwNSwgMHg4MCwgMHgzRCwgMHhFQSwKKworMHgzNywgMHg0MywgMHhBMCwgMHhFOCwKKzB4M0QsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NDgsIDB4NzAsIDB4RjgsIDB4RUMsCisweDJCLCAweDQ4LCAweDNDLCAweEU5LAorCisweDFGLCAweDI3LCAweEJDLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU2LCAweDNELCAweDU2LCAweERGLAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg0RSwgMHgzRiwgMHg0RSwgMHhERiwKKworMHgxNiwgMHgzMCwgMHgyMCwgMHhFOSwKKzB4NEYsIDB4M0YsIDB4NEYsIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDEyLCAweDEyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHg0NywgMHgzNywgMHg0NywgMHhERiwKKzB4NTcsIDB4M0QsIDB4NTcsIDB4REYsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNCwgMHg4MCwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NEMsIDB4QjAsCisweDAyLCAweDQ0LCAweDU0LCAweEIwLAorCisweDJBLCAweDQ0LCAweDRDLCAweEIyLAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCMiwKKworMHgxRCwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDNELCAweENGLCAweDc0LCAweEMyLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjQsCisweDFBLCAweDQ0LCAweDU0LCAweEI0LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzOCwgMHgzRCwgMHgyMCwgMHhFOSwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDRFLCAweEJGLAorMHgxQSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ3LCAweDRGLCAweEJGLAorMHgwMiwgMHg0NywgMHg1NywgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDRCLCAweEJGLAorMHgxQSwgMHg0MywgMHg1MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MzcsIDB4NDgsIDB4NTAsIDB4QkQsCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHgyMCwgMHhFOSwKKworMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisweDM1LCAweDQ5LCAweDUxLCAweEJELAorCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKworMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKzB4NTcsIDB4MjUsIDB4MjAsIDB4RTksCisKKzB4MkIsIDB4NDgsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MjYsIDB4NzcsCisKKzB4MjQsIDB4NDksIDB4MjAsIDB4RTksCisweEFGLCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDI2LCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgxQywgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MjMsIDB4NEUsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NTYsIDB4QTAsIDB4RTgsCisweDFELCAweDQ3LCAweEEwLCAweEU4LAorCisweDI0LCAweDRGLCAweEEwLCAweEU4LAorMHgyQywgMHg1NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHgwMCwKKzB4MjMsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHgwMCwKKzB4MjQsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxQywgMHg2NSwKKzB4MjMsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHg2NSwKKzB4MjQsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxQywgMHgyMywgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDFELCAweDI0LCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgxQywgMHgyQiwgMHhERSwgMHhFOCwKKzB4MjMsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDFDLCAweEJELAorMHgzQiwgMHhENywgMHgyMywgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NEYsIDB4ODAsIDB4NEYsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweEQ2LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg0RSwgMHgzMywgMHg0RSwgMHhDRiwKKzB4NTcsIDB4M0IsIDB4NTcsIDB4Q0YsCisKKzB4OUQsIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3RnemFbXSA9IHsKKworMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMiwgMHg0MCwgMHg0OCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NTAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NDksIDB4QkYsCisweDNBLCAweDQxLCAweDUxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhDQiwgMHg2QiwKKzB4MDAsIDB4ODgsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjksIDB4OUYsCisweDAwLCAweEUwLAorMHg0OSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NTEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDQ5LCAweDQxLCAweEMwLCAweEVDLAorMHgzOSwgMHg1NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweDUxLCAweDQxLCAweEMwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4NUMsIDB4ODAsIDB4MTUsIDB4RUEsCisweDA4LCAweDA0LAorMHgxMCwgMHgwNCwKKworMHg1MSwgMHg0OSwgMHhDMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg0QSwgMHhCRiwKKzB4MjcsIDB4NEEsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDFFLCAweDQ5LCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgyNiwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NDksIDB4QkQsCisweDNBLCAweDQxLCAweDUxLCAweEJELAorCisweEJGLCAweDJGLCAweDI2LCAweEJELAorMHgwMCwgMHhFMCwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDRFLCAweDMxLCAweDRFLCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NEYsIDB4MzksIDB4NEYsIDB4QkYsCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorCisweDRFLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHg0MiwgMHg3MywgMHhGOCwgMHhFQywKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4QTUsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDRCLCAweDRCLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDI2LCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorMHgwMCwgMHhFMCwKKzB4NTksIDB4RTMsCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHgzRiwgMHg0QiwgMHhBMCwgMHhFOCwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHg0OCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NDgsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MjcsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTYsIDB4M0QsIDB4NTYsIDB4REYsCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDRFLCAweDNGLCAweDRFLCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg0RiwgMHgzRiwgMHg0RiwgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRCwgMHg1NywgMHhERiwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM0LCAweDgwLCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyNywgMHhDRiwgMHg3NCwgMHhDNiwKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzIsCisKKzB4MEEsIDB4NDQsIDB4NEMsIDB4QjAsCisweDAyLCAweDQ0LCAweDU0LCAweEIwLAorCisweDJBLCAweDQ0LCAweDRDLCAweEIyLAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCMiwKKworMHgyMCwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUMsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NEMsIDB4QjQsCisweDAyLCAweDQ0LCAweDU0LCAweEI0LAorCisweDJBLCAweDQ0LCAweDRDLCAweEI2LAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCNiwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzgsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MEEsIDB4NDcsIDB4NEYsIDB4QkYsCisweDAyLCAweDQ3LCAweDU3LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDYsIDB4NEUsIDB4QkYsCisweDFBLCAweDQ2LCAweDU2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0IsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM2LCAweDMwLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzNywgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0MywgMHg0QiwgMHhCRiwKKzB4MUEsIDB4NDMsIDB4NTMsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDlELCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHg5RSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDM3LCAweDQ4LCAweDUwLCAweEJELAorMHg4QSwgMHgzNiwgMHgyMCwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEIsIDB4M0UsIDB4MjAsIDB4RTksCisKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorMHgzNSwgMHg0OSwgMHg1MSwgMHhCRCwKKworMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKzB4MzAsIDB4MUYsIDB4NUYsIDB4RTksCisKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisweDU3LCAweDI1LCAweDIwLCAweEU5LAorCisweDJCLCAweDQ4LCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDI2LCAweDc3LAorCisweDI0LCAweDQ5LCAweDIwLCAweEU5LAorMHhBQiwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgyNiwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MUMsIDB4NDYsIDB4QTAsIDB4RTgsCisweDIzLCAweDRFLCAweEEwLCAweEU4LAorCisweDJCLCAweDU2LCAweEEwLCAweEU4LAorMHgxRCwgMHg0NywgMHhBMCwgMHhFOCwKKworMHgyNCwgMHg0RiwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NTcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4MDAsCisweDIzLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4MDAsCisweDI0LCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4NjUsCisweDIzLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4NjUsCisweDI0LCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4MjMsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgxRCwgMHgyNCwgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MUMsIDB4MkIsIDB4REUsIDB4RTgsCisweDIzLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgxQywgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MjMsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDRGLCAweDgwLCAweDRGLCAweENGLAorCisweDU2LCAweDMzLCAweDU2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHhEMywgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NEUsIDB4MzMsIDB4NEUsIDB4Q0YsCisweDU3LCAweDNCLCAweDU3LCAweENGLAorCisweDk5LCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Z3phZltdID0geworCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIyLCAweDQwLCAweDQ4LCAweEJGLAorMHgyQSwgMHg0MCwgMHg1MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg0OSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweENCLCAweDZCLAorMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyOSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDQ5LCAweDA0LAorCisweDkwLCAweEUyLAorMHg1MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NDksIDB4NDEsIDB4QzAsIDB4RUMsCisweDM5LCAweDU3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg2MSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MDgsIDB4MDQsCisweDEwLCAweDA0LAorCisweDUxLCAweDQ5LCAweEMwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDRBLCAweEJGLAorMHgyNywgMHg0QSwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MUUsIDB4NDksIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDI2LCAweDUxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDQ4LCAweEJELAorMHgyMiwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MjYsIDB4QkQsCisweDAwLCAweEUwLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NEUsIDB4MzEsIDB4NEUsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg0RiwgMHgzOSwgMHg0RiwgMHhCRiwKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisKKzB4NTMsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDQyLCAweDczLCAweEY4LCAweEVDLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHhBNSwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NEIsIDB4NEIsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MjYsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisweDAwLCAweEUwLAorMHg1OSwgMHhFMywKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDNGLCAweDRCLCAweEEwLCAweEU4LAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDUzLCAweEEwLCAweEU4LAorCisweDQ4LCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg0OCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgyNywgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisweDFELCAweDMyLCAweDQxLCAweEU5LAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1NiwgMHgzRCwgMHg1NiwgMHhERiwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NEUsIDB4M0YsIDB4NEUsIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDRGLCAweDNGLCAweDRGLCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgyMiwgMHgyMiwgMHgyRCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4M0EsIDB4M0EsIDB4MkQsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNELCAweDU3LCAweERGLAorCisweDNELCAweENGLCAweDc0LCAweEMwLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjAsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg0QywgMHhCMiwKKzB4MUEsIDB4NDQsIDB4NTQsIDB4QjIsCisKKzB4MjYsIDB4ODAsIDB4M0EsIDB4RUEsCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDNELCAweENGLCAweDc0LCAweEMyLAorMHgyNywgMHhDRiwgMHg3NCwgMHhDNiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg5QywgMHgyNywgMHgyMCwgMHhFOSwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCNCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjQsCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjYsCisweDFBLCAweDQ0LCAweDU0LCAweEI2LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzOCwgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzRCwgMHhDRiwgMHg3NSwgMHhDNiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNFLCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzRiwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgwQSwgMHg0NSwgMHg0RCwgMHhCNiwKKzB4MDIsIDB4NDUsIDB4NTUsIDB4QjYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHgzRCwgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDJBLCAweDQ2LCAweDRFLCAweEJGLAorMHgxQSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgwQSwgMHg0NywgMHg0RiwgMHhCRiwKKzB4MDIsIDB4NDcsIDB4NTcsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM2LCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzNywgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDlFLCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDRCLCAweEJGLAorMHgxQSwgMHg0MywgMHg1MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzUsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM5LCAweDM4LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MzcsIDB4NDgsIDB4NTAsIDB4QkQsCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHgyMCwgMHhFOSwKKworMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisweDM1LCAweDQ5LCAweDUxLCAweEJELAorCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKworMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKzB4NTcsIDB4MjUsIDB4MjAsIDB4RTksCisKKzB4MkIsIDB4NDgsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MjYsIDB4NzcsCisKKzB4MjQsIDB4NDksIDB4MjAsIDB4RTksCisweEE2LCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDI2LCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgxQywgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MjMsIDB4NEUsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NTYsIDB4QTAsIDB4RTgsCisweDFELCAweDQ3LCAweEEwLCAweEU4LAorCisweDI0LCAweDRGLCAweEEwLCAweEU4LAorMHgyQywgMHg1NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHgwMCwKKzB4MjMsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHgwMCwKKzB4MjQsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxQywgMHg2NSwKKzB4MjMsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHg2NSwKKzB4MjQsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxQywgMHgyMywgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDFELCAweDI0LCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgxQywgMHgyQiwgMHhERSwgMHhFOCwKKzB4MjMsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDFDLCAweEJELAorMHgzQiwgMHhENywgMHgyMywgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NEYsIDB4ODAsIDB4NEYsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweENELCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg0RSwgMHgzMywgMHg0RSwgMHhDRiwKKzB4NTcsIDB4M0IsIDB4NTcsIDB4Q0YsCisKKzB4OTQsIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3RnemZbXSA9IHsKKworMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMiwgMHg0MCwgMHg0OCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NTAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NDksIDB4QkYsCisweDNBLCAweDQxLCAweDUxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhDQiwgMHg2QiwKKzB4MDAsIDB4ODgsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjksIDB4OUYsCisweDAwLCAweEUwLAorMHg0OSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NTEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDQ5LCAweDQxLCAweEMwLCAweEVDLAorMHgzOSwgMHg1NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweDUxLCAweDQxLCAweEMwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4NUQsIDB4ODAsIDB4MTUsIDB4RUEsCisweDA4LCAweDA0LAorMHgxMCwgMHgwNCwKKworMHg1MSwgMHg0OSwgMHhDMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg0QSwgMHhCRiwKKzB4MjcsIDB4NEEsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDFFLCAweDQ5LCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgyNiwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NDksIDB4QkQsCisweDNBLCAweDQxLCAweDUxLCAweEJELAorCisweEJGLCAweDJGLCAweDI2LCAweEJELAorMHgwMCwgMHhFMCwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDRFLCAweDMxLCAweDRFLCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NEYsIDB4MzksIDB4NEYsIDB4QkYsCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorCisweDRGLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHg0MiwgMHg3MywgMHhGOCwgMHhFQywKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4QTUsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDRCLCAweDRCLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDI2LCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorMHgwMCwgMHhFMCwKKzB4NTksIDB4RTMsCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHgzRiwgMHg0QiwgMHhBMCwgMHhFOCwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHg0OCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NDgsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MjcsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTYsIDB4M0QsIDB4NTYsIDB4REYsCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDRFLCAweDNGLCAweDRFLCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg0RiwgMHgzRiwgMHg0RiwgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRCwgMHg1NywgMHhERiwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM0LCAweDgwLCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjcsIDB4Q0YsIDB4NzUsIDB4QzYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDBBLCAweDQ0LCAweDRDLCAweEIwLAorMHgwMiwgMHg0NCwgMHg1NCwgMHhCMCwKKworMHgyQSwgMHg0NCwgMHg0QywgMHhCMiwKKzB4MUEsIDB4NDQsIDB4NTQsIDB4QjIsCisKKzB4MjAsIDB4ODAsIDB4M0EsIDB4RUEsCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMiwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDMxLCAweDI3LCAweDIwLCAweEU5LAorCisweDBBLCAweDQ0LCAweDRDLCAweEI0LAorMHgwMiwgMHg0NCwgMHg1NCwgMHhCNCwKKworMHgyQSwgMHg0NSwgMHg0RCwgMHhCNiwKKzB4MUEsIDB4NDUsIDB4NTUsIDB4QjYsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM4LCAweDNELCAweDIwLCAweEU5LAorCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDBBLCAweDQ3LCAweDRGLCAweEJGLAorMHgwMiwgMHg0NywgMHg1NywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ2LCAweDRFLCAweEJGLAorMHgxQSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNiwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NEIsIDB4QkYsCisweDFBLCAweDQzLCAweDUzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzksIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgzNywgMHg0OCwgMHg1MCwgMHhCRCwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweDIwLCAweEU5LAorCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKzB4MzUsIDB4NDksIDB4NTEsIDB4QkQsCisKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorMHg1NywgMHgyNSwgMHgyMCwgMHhFOSwKKworMHgyQiwgMHg0OCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgyNiwgMHg3NywKKworMHgyNCwgMHg0OSwgMHgyMCwgMHhFOSwKKzB4QUEsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MjYsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDFDLCAweDQ2LCAweEEwLCAweEU4LAorMHgyMywgMHg0RSwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg1NiwgMHhBMCwgMHhFOCwKKzB4MUQsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MjQsIDB4NEYsIDB4QTAsIDB4RTgsCisweDJDLCAweDU3LCAweEEwLCAweEU4LAorCisweDFDLCAweDAwLAorMHgyMywgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFELCAweDAwLAorMHgyNCwgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFDLCAweDY1LAorMHgyMywgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFELCAweDY1LAorMHgyNCwgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFDLCAweDIzLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MUQsIDB4MjQsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDFDLCAweDJCLCAweERFLCAweEU4LAorMHgyMywgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MUMsIDB4QkQsCisweDNCLCAweEQ3LCAweDIzLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg0RiwgMHg4MCwgMHg0RiwgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4RDMsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDRFLCAweDMzLCAweDRFLCAweENGLAorMHg1NywgMHgzQiwgMHg1NywgMHhDRiwKKworMHg5OCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdGd6c1tdID0geworCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIyLCAweDQwLCAweDQ4LCAweEJGLAorMHgyQSwgMHg0MCwgMHg1MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg0OSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweENCLCAweDZCLAorMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyOSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDQ5LCAweDA0LAorCisweDkwLCAweEUyLAorMHg1MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NDksIDB4NDEsIDB4QzAsIDB4RUMsCisweDM5LCAweDU3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg2NSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MDgsIDB4MDQsCisweDEwLCAweDA0LAorCisweDUxLCAweDQ5LCAweEMwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDRBLCAweEJGLAorMHgyNywgMHg0QSwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MUUsIDB4NDksIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDI2LCAweDUxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDQ4LCAweEJELAorMHgyMiwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MjYsIDB4QkQsCisweDAwLCAweEUwLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NEUsIDB4MzEsIDB4NEUsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg0RiwgMHgzOSwgMHg0RiwgMHhCRiwKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisKKzB4NTcsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDQyLCAweDczLCAweEY4LCAweEVDLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHhBNSwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NEIsIDB4NEIsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MjYsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisweDAwLCAweEUwLAorMHg1OSwgMHhFMywKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDNGLCAweDRCLCAweEEwLCAweEU4LAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDUzLCAweEEwLCAweEU4LAorCisweDQ4LCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg0OCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgyNywgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisweDFELCAweDMyLCAweDQxLCAweEU5LAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1NiwgMHgzRCwgMHg1NiwgMHhERiwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NEUsIDB4M0YsIDB4NEUsIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDRGLCAweDNGLCAweDRGLCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRCwgMHg1NywgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDI3LCAweENGLCAweDc0LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzOCwgMHgyNywgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjIsCisweDFBLCAweDQ0LCAweDU0LCAweEIyLAorCisweDI5LCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MjcsIDB4Q0YsIDB4NzUsIDB4QzAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDNELCAweENGLCAweDc1LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NSwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTYsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEzLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDRDLCAweEI0LAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCNCwKKworMHgwQSwgMHg0NSwgMHg0RCwgMHhCMCwKKzB4MDIsIDB4NDUsIDB4NTUsIDB4QjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBMCwgMHgzNywgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDJBLCAweDQ1LCAweDRELCAweEIyLAorMHgxQSwgMHg0NSwgMHg1NSwgMHhCMiwKKworMHgwQSwgMHg0NSwgMHg0RCwgMHhCNCwKKzB4MDIsIDB4NDUsIDB4NTUsIDB4QjQsCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDRFLCAweEJGLAorMHgxQSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHhBNywgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4QTgsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDcsIDB4NEYsIDB4QkYsCisweDAyLCAweDQ3LCAweDU3LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NEIsIDB4QkYsCisweDFBLCAweDQzLCAweDUzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHhBMSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4QTIsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgzNywgMHg0OCwgMHg1MCwgMHhCRCwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweDIwLCAweEU5LAorCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKzB4MzUsIDB4NDksIDB4NTEsIDB4QkQsCisKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorMHg1NywgMHgyNSwgMHgyMCwgMHhFOSwKKworMHgyQiwgMHg0OCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgyNiwgMHg3NywKKworMHgyNCwgMHg0OSwgMHgyMCwgMHhFOSwKKzB4QTIsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MjYsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDFDLCAweDQ2LCAweEEwLCAweEU4LAorMHgyMywgMHg0RSwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg1NiwgMHhBMCwgMHhFOCwKKzB4MUQsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MjQsIDB4NEYsIDB4QTAsIDB4RTgsCisweDJDLCAweDU3LCAweEEwLCAweEU4LAorCisweDFDLCAweDAwLAorMHgyMywgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFELCAweDAwLAorMHgyNCwgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFDLCAweDY1LAorMHgyMywgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFELCAweDY1LAorMHgyNCwgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFDLCAweDIzLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MUQsIDB4MjQsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDFDLCAweDJCLCAweERFLCAweEU4LAorMHgyMywgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MUMsIDB4QkQsCisweDNCLCAweEQ3LCAweDIzLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg0RiwgMHg4MCwgMHg0RiwgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4Q0EsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDRFLCAweDMzLCAweDRFLCAweENGLAorMHg1NywgMHgzQiwgMHg1NywgMHhDRiwKKworMHg5MCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdGd6c2FbXSA9IHsKKworMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMiwgMHg0MCwgMHg0OCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NTAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NDksIDB4QkYsCisweDNBLCAweDQxLCAweDUxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhDQiwgMHg2QiwKKzB4MDAsIDB4ODgsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjksIDB4OUYsCisweDAwLCAweEUwLAorMHg0OSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NTEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDQ5LCAweDQxLCAweEMwLCAweEVDLAorMHgzOSwgMHg1NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweDUxLCAweDQxLCAweEMwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4NkEsIDB4ODAsIDB4MTUsIDB4RUEsCisweDA4LCAweDA0LAorMHgxMCwgMHgwNCwKKworMHg1MSwgMHg0OSwgMHhDMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg0QSwgMHhCRiwKKzB4MjcsIDB4NEEsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDFFLCAweDQ5LCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgyNiwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NDksIDB4QkQsCisweDNBLCAweDQxLCAweDUxLCAweEJELAorCisweEJGLCAweDJGLCAweDI2LCAweEJELAorMHgwMCwgMHhFMCwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDRFLCAweDMxLCAweDRFLCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NEYsIDB4MzksIDB4NEYsIDB4QkYsCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorCisweDVDLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHg0MiwgMHg3MywgMHhGOCwgMHhFQywKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4QTUsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDRCLCAweDRCLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDI2LCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorMHgwMCwgMHhFMCwKKzB4NTksIDB4RTMsCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHgzRiwgMHg0QiwgMHhBMCwgMHhFOCwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHg0OCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NDgsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MjcsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTYsIDB4M0QsIDB4NTYsIDB4REYsCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDRFLCAweDNGLCAweDRFLCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg0RiwgMHgzRiwgMHg0RiwgMHhERiwKKworMHg0NywgMHgzNywgMHg0NywgMHhERiwKKzB4NTcsIDB4M0QsIDB4NTcsIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDEyLCAweDEyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHgyNywgMHhDRiwgMHg3NCwgMHhDMiwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MEEsIDB4NDQsIDB4NEMsIDB4QjAsCisweDAyLCAweDQ0LCAweDU0LCAweEIwLAorCisweDNELCAweENGLCAweDc0LCAweEMwLAorMHgzNCwgMHgzNywgMHgyMCwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzgsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDRDLCAweEIyLAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCMiwKKworMHgyRSwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDI3LCAweENGLCAweDc1LCAweEMwLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzRCwgMHhDRiwgMHg3NSwgMHhDMiwKKzB4MzcsIDB4Q0YsIDB4NzUsIDB4QzQsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweEE2LCAweDI3LCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBMywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg0QywgMHhCNCwKKzB4MUEsIDB4NDQsIDB4NTQsIDB4QjQsCisKKzB4MEEsIDB4NDUsIDB4NEQsIDB4QjAsCisweDAyLCAweDQ1LCAweDU1LCAweEIwLAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTAsIDB4MzcsIDB4MjAsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4M0IsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDUsIDB4NEQsIDB4QjIsCisweDFBLCAweDQ1LCAweDU1LCAweEIyLAorCisweDBBLCAweDQ1LCAweDRELCAweEI0LAorMHgwMiwgMHg0NSwgMHg1NSwgMHhCNCwKKworMHgyNywgMHhDRiwgMHg3NCwgMHhDNiwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweEE3LCAweDMwLCAweDRGLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDlDLCAweDI3LCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBOCwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg0QywgMHhCNiwKKzB4MUEsIDB4NDQsIDB4NTQsIDB4QjYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM2LCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzNywgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDRFLCAweEJGLAorMHgxQSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE1LCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ3LCAweDRGLCAweEJGLAorMHgwMiwgMHg0NywgMHg1NywgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTEsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEyLCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDRCLCAweEJGLAorMHgxQSwgMHg0MywgMHg1MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4OUQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDlFLCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MzcsIDB4NDgsIDB4NTAsIDB4QkQsCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHgyMCwgMHhFOSwKKworMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisweDM1LCAweDQ5LCAweDUxLCAweEJELAorCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKworMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKzB4NTcsIDB4MjUsIDB4MjAsIDB4RTksCisKKzB4MkIsIDB4NDgsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MjYsIDB4NzcsCisKKzB4MjQsIDB4NDksIDB4MjAsIDB4RTksCisweDlELCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDI2LCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgxQywgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MjMsIDB4NEUsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NTYsIDB4QTAsIDB4RTgsCisweDFELCAweDQ3LCAweEEwLCAweEU4LAorCisweDI0LCAweDRGLCAweEEwLCAweEU4LAorMHgyQywgMHg1NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHgwMCwKKzB4MjMsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHgwMCwKKzB4MjQsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxQywgMHg2NSwKKzB4MjMsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHg2NSwKKzB4MjQsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxQywgMHgyMywgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDFELCAweDI0LCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgxQywgMHgyQiwgMHhERSwgMHhFOCwKKzB4MjMsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDFDLCAweEJELAorMHgzQiwgMHhENywgMHgyMywgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NEYsIDB4ODAsIDB4NEYsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweEM1LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg0RSwgMHgzMywgMHg0RSwgMHhDRiwKKzB4NTcsIDB4M0IsIDB4NTcsIDB4Q0YsCisKKzB4OEIsIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3RnenNhZltdID0geworCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIyLCAweDQwLCAweDQ4LCAweEJGLAorMHgyQSwgMHg0MCwgMHg1MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg0OSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweENCLCAweDZCLAorMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyOSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDQ5LCAweDA0LAorCisweDkwLCAweEUyLAorMHg1MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NDksIDB4NDEsIDB4QzAsIDB4RUMsCisweDM5LCAweDU3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg2RSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MDgsIDB4MDQsCisweDEwLCAweDA0LAorCisweDUxLCAweDQ5LCAweEMwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDRBLCAweEJGLAorMHgyNywgMHg0QSwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MUUsIDB4NDksIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDI2LCAweDUxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDQ4LCAweEJELAorMHgyMiwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MjYsIDB4QkQsCisweDAwLCAweEUwLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NEUsIDB4MzEsIDB4NEUsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg0RiwgMHgzOSwgMHg0RiwgMHhCRiwKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisKKzB4NjAsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDQyLCAweDczLCAweEY4LCAweEVDLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHhBNSwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NEIsIDB4NEIsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MjYsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisweDAwLCAweEUwLAorMHg1OSwgMHhFMywKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDNGLCAweDRCLCAweEEwLCAweEU4LAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDUzLCAweEEwLCAweEU4LAorCisweDQ4LCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg0OCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgyNywgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisweDFELCAweDMyLCAweDQxLCAweEU5LAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1NiwgMHgzRCwgMHg1NiwgMHhERiwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NEUsIDB4M0YsIDB4NEUsIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDRGLCAweDNGLCAweDRGLCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRCwgMHg1NywgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDI3LCAweENGLCAweDc0LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzOCwgMHgyNywgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjIsCisweDFBLCAweDQ0LCAweDU0LCAweEIyLAorCisweDMyLCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MjcsIDB4Q0YsIDB4NzUsIDB4QzAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDNELCAweENGLCAweDc1LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NSwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTYsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEzLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDRDLCAweEI0LAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCNCwKKworMHgwQSwgMHg0NSwgMHg0RCwgMHhCMCwKKzB4MDIsIDB4NDUsIDB4NTUsIDB4QjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBMCwgMHgzNywgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg0RCwgMHhCMiwKKzB4MUEsIDB4NDUsIDB4NTUsIDB4QjIsCisKKzB4MEEsIDB4NDUsIDB4NEQsIDB4QjQsCisweDAyLCAweDQ1LCAweDU1LCAweEI0LAorCisweDI3LCAweENGLCAweDc0LCAweEM2LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTcsIDB4MzAsIDB4NEYsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUMsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE4LCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ0LCAweDRDLCAweEI2LAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCNiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ1LCAweDRELCAweEI2LAorMHgwMiwgMHg0NSwgMHg1NSwgMHhCNiwKKworMHgzRCwgMHhDRiwgMHg3NSwgMHhDNiwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDJBLCAweDQ2LCAweDRFLCAweEJGLAorMHgxQSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE1LCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDNELCAweDIwLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MEEsIDB4NDcsIDB4NEYsIDB4QkYsCisweDAyLCAweDQ3LCAweDU3LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHhBMSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4QTIsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDlELCAweDMxLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg5RSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0MywgMHg0QiwgMHhCRiwKKzB4MUEsIDB4NDMsIDB4NTMsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM1LCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzOSwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDM3LCAweDQ4LCAweDUwLCAweEJELAorMHg4QSwgMHgzNiwgMHgyMCwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEIsIDB4M0UsIDB4MjAsIDB4RTksCisKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorMHgzNSwgMHg0OSwgMHg1MSwgMHhCRCwKKworMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKzB4MzAsIDB4MUYsIDB4NUYsIDB4RTksCisKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisweDU3LCAweDI1LCAweDIwLCAweEU5LAorCisweDJCLCAweDQ4LCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDI2LCAweDc3LAorCisweDI0LCAweDQ5LCAweDIwLCAweEU5LAorMHg5OSwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgyNiwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MUMsIDB4NDYsIDB4QTAsIDB4RTgsCisweDIzLCAweDRFLCAweEEwLCAweEU4LAorCisweDJCLCAweDU2LCAweEEwLCAweEU4LAorMHgxRCwgMHg0NywgMHhBMCwgMHhFOCwKKworMHgyNCwgMHg0RiwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NTcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4MDAsCisweDIzLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4MDAsCisweDI0LCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4NjUsCisweDIzLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4NjUsCisweDI0LCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4MjMsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgxRCwgMHgyNCwgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MUMsIDB4MkIsIDB4REUsIDB4RTgsCisweDIzLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgxQywgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MjMsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDRGLCAweDgwLCAweDRGLCAweENGLAorCisweDU2LCAweDMzLCAweDU2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHhDMSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NEUsIDB4MzMsIDB4NEUsIDB4Q0YsCisweDU3LCAweDNCLCAweDU3LCAweENGLAorCisweDg3LCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Z3pzZltdID0geworCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIyLCAweDQwLCAweDQ4LCAweEJGLAorMHgyQSwgMHg0MCwgMHg1MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg0OSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweENCLCAweDZCLAorMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyOSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDQ5LCAweDA0LAorCisweDkwLCAweEUyLAorMHg1MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NDksIDB4NDEsIDB4QzAsIDB4RUMsCisweDM5LCAweDU3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg2QSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MDgsIDB4MDQsCisweDEwLCAweDA0LAorCisweDUxLCAweDQ5LCAweEMwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDRBLCAweEJGLAorMHgyNywgMHg0QSwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MUUsIDB4NDksIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDI2LCAweDUxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDQ4LCAweEJELAorMHgyMiwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MjYsIDB4QkQsCisweDAwLCAweEUwLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NEUsIDB4MzEsIDB4NEUsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg0RiwgMHgzOSwgMHg0RiwgMHhCRiwKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisKKzB4NUMsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDQyLCAweDczLCAweEY4LCAweEVDLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHhBNSwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NEIsIDB4NEIsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MjYsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisweDAwLCAweEUwLAorMHg1OSwgMHhFMywKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDNGLCAweDRCLCAweEEwLCAweEU4LAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDUzLCAweEEwLCAweEU4LAorCisweDQ4LCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg0OCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgyNywgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisweDFELCAweDMyLCAweDQxLCAweEU5LAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1NiwgMHgzRCwgMHg1NiwgMHhERiwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NEUsIDB4M0YsIDB4NEUsIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDRGLCAweDNGLCAweDRGLCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRCwgMHg1NywgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDI3LCAweENGLCAweDc0LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzOCwgMHgyNywgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjIsCisweDFBLCAweDQ0LCAweDU0LCAweEIyLAorCisweDJFLCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MjcsIDB4Q0YsIDB4NzUsIDB4QzAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDNELCAweENGLCAweDc1LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NSwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTYsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEzLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDRDLCAweEI0LAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCNCwKKworMHgwQSwgMHg0NSwgMHg0RCwgMHhCMCwKKzB4MDIsIDB4NDUsIDB4NTUsIDB4QjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBMCwgMHgzNywgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg0RCwgMHhCMiwKKzB4MUEsIDB4NDUsIDB4NTUsIDB4QjIsCisKKzB4MEEsIDB4NDUsIDB4NEQsIDB4QjQsCisweDAyLCAweDQ1LCAweDU1LCAweEI0LAorCisweDI3LCAweENGLCAweDc1LCAweEM2LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTcsIDB4MzAsIDB4NEYsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzEsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE4LCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ1LCAweDRELCAweEI2LAorMHgxQSwgMHg0NSwgMHg1NSwgMHhCNiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NEUsIDB4QkYsCisweDFBLCAweDQ2LCAweDU2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDcsIDB4NEYsIDB4QkYsCisweDAyLCAweDQ3LCAweDU3LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBMSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTIsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NEIsIDB4QkYsCisweDFBLCAweDQzLCAweDUzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzksIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgzNywgMHg0OCwgMHg1MCwgMHhCRCwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweDIwLCAweEU5LAorCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKzB4MzUsIDB4NDksIDB4NTEsIDB4QkQsCisKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorMHg1NywgMHgyNSwgMHgyMCwgMHhFOSwKKworMHgyQiwgMHg0OCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgyNiwgMHg3NywKKworMHgyNCwgMHg0OSwgMHgyMCwgMHhFOSwKKzB4OUQsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MjYsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDFDLCAweDQ2LCAweEEwLCAweEU4LAorMHgyMywgMHg0RSwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg1NiwgMHhBMCwgMHhFOCwKKzB4MUQsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MjQsIDB4NEYsIDB4QTAsIDB4RTgsCisweDJDLCAweDU3LCAweEEwLCAweEU4LAorCisweDFDLCAweDAwLAorMHgyMywgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFELCAweDAwLAorMHgyNCwgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFDLCAweDY1LAorMHgyMywgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFELCAweDY1LAorMHgyNCwgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFDLCAweDIzLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MUQsIDB4MjQsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDFDLCAweDJCLCAweERFLCAweEU4LAorMHgyMywgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MUMsIDB4QkQsCisweDNCLCAweEQ3LCAweDIzLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg0RiwgMHg4MCwgMHg0RiwgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4QzUsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDRFLCAweDMzLCAweDRFLCAweENGLAorMHg1NywgMHgzQiwgMHg1NywgMHhDRiwKKworMHg4QiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2Ffd2FycC5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffd2FycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2EwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV93YXJwLmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qIG1nYV93YXJwLmMgLS0gTWF0cm94IEcyMDAvRzQwMCBXQVJQIGVuZ2luZSBtYW5hZ2VtZW50IC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogVGh1IEphbiAxMSAyMToyOTozMiAyMDAxIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm1nYV9kcm0uaCIKKyNpbmNsdWRlICJtZ2FfZHJ2LmgiCisjaW5jbHVkZSAibWdhX3Vjb2RlLmgiCisKKworI2RlZmluZSBNR0FfV0FSUF9DT0RFX0FMSUdOCQkyNTYJCS8qIGluIGJ5dGVzICovCisKKyNkZWZpbmUgV0FSUF9VQ09ERV9TSVpFKCB3aGljaCApCQkJCQlcCisJKChzaXplb2Yod2hpY2gpIC8gTUdBX1dBUlBfQ09ERV9BTElHTiArIDEpICogTUdBX1dBUlBfQ09ERV9BTElHTikKKworI2RlZmluZSBXQVJQX1VDT0RFX0lOU1RBTEwoIHdoaWNoLCB3aGVyZSApCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJRFJNX0RFQlVHKCAiIHBjYmFzZSA9IDB4JTA4bHggIHZjYmFzZSA9ICVwXG4iLCBwY2Jhc2UsIHZjYmFzZSApO1wKKwlkZXZfcHJpdi0+d2FycF9waXBlX3BoeXNbd2hlcmVdID0gcGNiYXNlOwkJCVwKKwltZW1jcHkoIHZjYmFzZSwgd2hpY2gsIHNpemVvZih3aGljaCkgKTsJCQkJXAorCXBjYmFzZSArPSBXQVJQX1VDT0RFX1NJWkUoIHdoaWNoICk7CQkJCVwKKwl2Y2Jhc2UgKz0gV0FSUF9VQ09ERV9TSVpFKCB3aGljaCApOwkJCQlcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWdhX3dhcnBfZzQwMF9taWNyb2NvZGVfc2l6ZSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCXNpemUgPSAoIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3RneiApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3RnemEgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Z3phZiApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3RnemYgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Z3pzICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdGd6c2EgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Z3pzYWYgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Z3pzZiApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3QyZ3ogKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Mmd6YSApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3QyZ3phZiApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3QyZ3pmICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdDJnenMgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Mmd6c2EgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Mmd6c2FmICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdDJnenNmICkgKTsKKworCXNpemUgPSBQQUdFX0FMSUdOKCBzaXplICk7CisKKwlEUk1fREVCVUcoICJHNDAwIHVjb2RlIHNpemUgPSAlZCBieXRlc1xuIiwgc2l6ZSApOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1nYV93YXJwX2cyMDBfbWljcm9jb2RlX3NpemUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlzaXplID0gKCBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzIwMF90Z3ogKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzIwMF90Z3phICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2cyMDBfdGd6YWYgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzIwMF90Z3pmICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2cyMDBfdGd6cyApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nMjAwX3RnenNhICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2cyMDBfdGd6c2FmICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2cyMDBfdGd6c2YgKSApOworCisJc2l6ZSA9IFBBR0VfQUxJR04oIHNpemUgKTsKKworCURSTV9ERUJVRyggIkcyMDAgdWNvZGUgc2l6ZSA9ICVkIGJ5dGVzXG4iLCBzaXplICk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgbWdhX3dhcnBfaW5zdGFsbF9nNDAwX21pY3JvY29kZSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1bnNpZ25lZCBjaGFyICp2Y2Jhc2UgPSBkZXZfcHJpdi0+d2FycC0+aGFuZGxlOworCXVuc2lnbmVkIGxvbmcgcGNiYXNlID0gZGV2X3ByaXYtPndhcnAtPm9mZnNldDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCXNpemUgPSBtZ2Ffd2FycF9nNDAwX21pY3JvY29kZV9zaXplKCBkZXZfcHJpdiApOworCWlmICggc2l6ZSA+IGRldl9wcml2LT53YXJwLT5zaXplICkgeworCQlEUk1fRVJST1IoICJtaWNyb2NvZGUgdG9vIGxhcmdlISAoJXUgPiAlbHUpXG4iLAorCQkJICAgc2l6ZSwgZGV2X3ByaXYtPndhcnAtPnNpemUgKTsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisKKwltZW1zZXQoIGRldl9wcml2LT53YXJwX3BpcGVfcGh5cywgMCwKKwkJc2l6ZW9mKGRldl9wcml2LT53YXJwX3BpcGVfcGh5cykgKTsKKworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3RneiwJTUdBX1dBUlBfVEdaICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdGd6ZiwJTUdBX1dBUlBfVEdaRiApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3RnemEsCU1HQV9XQVJQX1RHWkEgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Z3phZiwJTUdBX1dBUlBfVEdaQUYgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Z3pzLAlNR0FfV0FSUF9UR1pTICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdGd6c2YsCU1HQV9XQVJQX1RHWlNGICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdGd6c2EsCU1HQV9XQVJQX1RHWlNBICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdGd6c2FmLAlNR0FfV0FSUF9UR1pTQUYgKTsKKworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3QyZ3osCU1HQV9XQVJQX1QyR1ogKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Mmd6ZiwJTUdBX1dBUlBfVDJHWkYgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Mmd6YSwJTUdBX1dBUlBfVDJHWkEgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Mmd6YWYsCU1HQV9XQVJQX1QyR1pBRiApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3QyZ3pzLAlNR0FfV0FSUF9UMkdaUyApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3QyZ3pzZiwJTUdBX1dBUlBfVDJHWlNGICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdDJnenNhLAlNR0FfV0FSUF9UMkdaU0EgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Mmd6c2FmLAlNR0FfV0FSUF9UMkdaU0FGICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2Ffd2FycF9pbnN0YWxsX2cyMDBfbWljcm9jb2RlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXVuc2lnbmVkIGNoYXIgKnZjYmFzZSA9IGRldl9wcml2LT53YXJwLT5oYW5kbGU7CisJdW5zaWduZWQgbG9uZyBwY2Jhc2UgPSBkZXZfcHJpdi0+d2FycC0+b2Zmc2V0OworCXVuc2lnbmVkIGludCBzaXplOworCisJc2l6ZSA9IG1nYV93YXJwX2cyMDBfbWljcm9jb2RlX3NpemUoIGRldl9wcml2ICk7CisJaWYgKCBzaXplID4gZGV2X3ByaXYtPndhcnAtPnNpemUgKSB7CisJCURSTV9FUlJPUiggIm1pY3JvY29kZSB0b28gbGFyZ2UhICgldSA+ICVsdSlcbiIsCisJCQkgICBzaXplLCBkZXZfcHJpdi0+d2FycC0+c2l6ZSApOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKworCW1lbXNldCggZGV2X3ByaXYtPndhcnBfcGlwZV9waHlzLCAwLAorCQlzaXplb2YoZGV2X3ByaXYtPndhcnBfcGlwZV9waHlzKSApOworCisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2cyMDBfdGd6LAlNR0FfV0FSUF9UR1ogKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzIwMF90Z3pmLAlNR0FfV0FSUF9UR1pGICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2cyMDBfdGd6YSwJTUdBX1dBUlBfVEdaQSApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nMjAwX3RnemFmLAlNR0FfV0FSUF9UR1pBRiApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nMjAwX3RnenMsCU1HQV9XQVJQX1RHWlMgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzIwMF90Z3pzZiwJTUdBX1dBUlBfVEdaU0YgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzIwMF90Z3pzYSwJTUdBX1dBUlBfVEdaU0EgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzIwMF90Z3pzYWYsCU1HQV9XQVJQX1RHWlNBRiApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtZ2Ffd2FycF9pbnN0YWxsX21pY3JvY29kZSgJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlzd2l0Y2ggKCBkZXZfcHJpdi0+Y2hpcHNldCApIHsKKwljYXNlIE1HQV9DQVJEX1RZUEVfRzQwMDoKKwkJcmV0dXJuIG1nYV93YXJwX2luc3RhbGxfZzQwMF9taWNyb2NvZGUoIGRldl9wcml2ICk7CisJY2FzZSBNR0FfQ0FSRF9UWVBFX0cyMDA6CisJCXJldHVybiBtZ2Ffd2FycF9pbnN0YWxsX2cyMDBfbWljcm9jb2RlKCBkZXZfcHJpdiApOworCWRlZmF1bHQ6CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorfQorCisjZGVmaW5lIFdNSVNDX0VYUEVDVEVECQkoTUdBX1dVQ09ERUNBQ0hFX0VOQUJMRSB8IE1HQV9XTUFTVEVSX0VOQUJMRSkKKworaW50IG1nYV93YXJwX2luaXQoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJdTMyIHdtaXNjOworCisJLyogRklYTUU6IEdldCByaWQgb2YgdGhlc2UgZGFtbmVkIG1hZ2ljIG51bWJlcnMuLi4KKwkgKi8KKwlzd2l0Y2ggKCBkZXZfcHJpdi0+Y2hpcHNldCApIHsKKwljYXNlIE1HQV9DQVJEX1RZUEVfRzQwMDoKKwkJTUdBX1dSSVRFKCBNR0FfV0lBRERSMiwgTUdBX1dNT0RFX1NVU1BFTkQgKTsKKwkJTUdBX1dSSVRFKCBNR0FfV0dFVE1TQiwgMHgwMDAwMEUwMCApOworCQlNR0FfV1JJVEUoIE1HQV9XVlJUWFNaLCAweDAwMDAxODA3ICk7CisJCU1HQV9XUklURSggTUdBX1dBQ0NFUFRTRVEsIDB4MTgwMDAwMDAgKTsKKwkJYnJlYWs7CisJY2FzZSBNR0FfQ0FSRF9UWVBFX0cyMDA6CisJCU1HQV9XUklURSggTUdBX1dJQUREUiwgTUdBX1dNT0RFX1NVU1BFTkQgKTsKKwkJTUdBX1dSSVRFKCBNR0FfV0dFVE1TQiwgMHgxNjA2ICk7CisJCU1HQV9XUklURSggTUdBX1dWUlRYU1osIDcgKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlNR0FfV1JJVEUoIE1HQV9XTUlTQywgKE1HQV9XVUNPREVDQUNIRV9FTkFCTEUgfAorCQkJICAgICAgIE1HQV9XTUFTVEVSX0VOQUJMRSB8CisJCQkgICAgICAgTUdBX1dDQUNIRUZMVVNIX0VOQUJMRSkgKTsKKwl3bWlzYyA9IE1HQV9SRUFEKCBNR0FfV01JU0MgKTsKKwlpZiAoIHdtaXNjICE9IFdNSVNDX0VYUEVDVEVEICkgeworCQlEUk1fRVJST1IoICJXQVJQIGVuZ2luZSBjb25maWcgZmFpbGVkISAweCV4ICE9IDB4JXhcbiIsCisJCQkgICB3bWlzYywgV01JU0NfRVhQRUNURUQgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9jY2UuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9jY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGVkOGQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jCkBAIC0wLDAgKzEsOTQzIEBACisvKiByMTI4X2NjZS5jIC0tIEFUSSBSYWdlIDEyOCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBXZWQgQXByICA1IDE5OjI0OjE5IDIwMDAgYnkga2V2aW5AcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicjEyOF9kcm0uaCIKKyNpbmNsdWRlICJyMTI4X2Rydi5oIgorCisjZGVmaW5lIFIxMjhfRklGT19ERUJVRwkJMAorCisvKiBDQ0UgbWljcm9jb2RlIChmcm9tIEFUSSkgKi8KK3N0YXRpYyB1MzIgcjEyOF9jY2VfbWljcm9jb2RlW10gPSB7CisJMCwgMjc2ODM4NDAwLCAwLCAyNjg0NDk3OTIsIDIsIDE0MiwgMiwgMTQ1LCAwLCAxMDc2NzY1NzMxLCAwLAorCTE2MTcwMzk5NTEsIDAsIDc3NDU5Mjg3NywgMCwgMTk4NzU0MDI4NiwgMCwgMjMwNzQ5MDk0NlUsIDAsCisJNTk5NTU4OTI1LCAwLCA1ODk1MDUzMTUsIDAsIDU5NjQ4NzA5MiwgMCwgNTg5NTA1MzE1LCAxLAorCTExNTQ0NTc2LCAxLCAyMDY4NDgsIDEsIDMxMTI5NiwgMSwgMTk4NjU2LCAyLCA5MTIyNzM0MjIsIDExLAorCTI2MjE0NCwgMCwgMCwgMSwgMzM1NTk4MzcsIDEsIDc0MzgsIDEsIDE0ODA5LCAxLCA2NjE1LCAxMiwgMjgsCisJMSwgNjYxNCwgMTIsIDI4LCAyLCAyMywgMTEsIDE4ODc0MzY4LCAwLCAxNjc5MDkyMiwgMSwgNDA5NjAwLCA5LAorCTMwLCAxLCAxNDc4NTQ3NzIsIDE2LCA0MjA0ODMwNzIsIDMsIDgxOTIsIDAsIDEwMjQwLCAxLCAxOTg2NTYsCisJMSwgMTU2MzAsIDEsIDUxMjAwLCAxMCwgMzQ4NTgsIDksIDQyLCAxLCAzMzU1OTgyMywgMiwgMTAyNzYsIDEsCisJMTU3MTcsIDEsIDE1NzE4LCAyLCA0MywgMSwgMTU5MzY5NDgsIDEsIDU3MDQ4MDgzMSwgMSwgMTQ3MTUwNzEsCisJMTIsIDMyMjEyMzgzMSwgMSwgMzM5NTMxMjUsIDEyLCA1NSwgMSwgMzM1NTk5MDgsIDEsIDE1NzE4LCAyLAorCTQ2LCA0LCAyMDk5MjU4LCAxLCA1MjYzMzYsIDEsIDQ0MjYyMywgNCwgNDE5NDM2NSwgMSwgNTA5OTUyLCAxLAorCTQ1OTAwNywgMywgMCwgMTIsIDkyLCAyLCA0NiwgMTIsIDE3NiwgMSwgMTU3MzQsIDEsIDIwNjg0OCwgMSwKKwkxODQzMiwgMSwgMTMzMTIwLCAxLCAxMDA2NzA3MzQsIDEsIDE0OTUwNCwgMSwgMTY1ODg4LCAxLAorCTE1OTc1OTI4LCAxLCAxMDQ4NTc2LCA2LCAzMTQ1ODA2LCAxLCAxNTcxNSwgMTYsIDIxNTA2NDUyMzJVLCAyLAorCTI2ODQ0OTg1OSwgMiwgMTAzMDcsIDEyLCAxNzYsIDEsIDE1NzM0LCAxLCAxNTczNSwgMSwgMTU2MzAsIDEsCisJMTU2MzEsIDEsIDUyNTMxMjAsIDYsIDMxNDU4MTAsIDE2LCAyMTUwNjQ1MjMyVSwgMSwgMTU4NjQsIDIsIDgyLAorCTEsIDM0MzMxMCwgMSwgMTA2NDIwNywgMiwgMzE0NTgxMywgMSwgMTU3MjgsIDEsIDc4MTcsIDEsIDE1NzI5LAorCTMsIDE1NzMwLCAxMiwgOTIsIDIsIDk4LCAxLCAxNjE2OCwgMSwgMTYxNjcsIDEsIDE2MDAyLCAxLCAxNjAwOCwKKwkxLCAxNTk3NCwgMSwgMTU5NzUsIDEsIDE1OTkwLCAxLCAxNTk3NiwgMSwgMTU5NzcsIDEsIDE1OTgwLCAwLAorCTE1OTgxLCAxLCAxMDI0MCwgMSwgNTI1MzEyMCwgMSwgMTU3MjAsIDEsIDE5ODY1NiwgNiwgMTEwLCAxLAorCTE4MDIyNCwgMSwgMTAzODI0NzM4LCAyLCAxMTIsIDIsIDMxNDU4MzksIDAsIDUzNjg4NTQ0MCwgMSwKKwkxMTQ4ODAsIDE0LCAxMjUsIDEyLCAyMDY5NzUsIDEsIDMzNTU5OTk1LCAxMiwgMTk4Nzg0LCAwLAorCTMzNTcwMjM2LCAxLCAxNTgwMywgMCwgMTU4MDQsIDMsIDI5NDkxMiwgMSwgMjk0OTEyLCAzLCA0NDIzNzAsCisJMSwgMTE1NDQ1NzYsIDAsIDgxMTYxMjE2MCwgMSwgMTI1OTMxNTIsIDEsIDExNTM2Mzg0LCAxLAorCTE0MDI0NzA0LCA3LCAzMTAzODI3MjYsIDAsIDEwMjQwLCAxLCAxNDc5NiwgMSwgMTQ3OTcsIDEsIDE0NzkzLAorCTEsIDE0Nzk0LCAwLCAxNDc5NSwgMSwgMjY4Njc5MTY4LCAxLCA5NDM3MTg0LCAxLCAyNjg0NDk3OTIsIDEsCisJMTk4NjU2LCAxLCA5NDUyODI3LCAxLCAxMDc1ODU0NjAyLCAxLCAxMDc1ODU0NjAzLCAxLCA1NTcwNTYsIDEsCisJMTE0ODgwLCAxNCwgMTU5LCAxMiwgMTk4Nzg0LCAxLCAxMTA5NDA5MjEzLCAxMiwgMTk4NzgzLCAxLAorCTExMDczMTIwNTksIDEyLCAxOTg3ODQsIDEsIDExMDk0MDkyMTIsIDIsIDE2MiwgMSwgMTA3NTg1NDc4MSwgMSwKKwkxMDczNzU3NjI3LCAxLCAxMDc1ODU0NzgwLCAxLCA1NDA2NzIsIDEsIDEwNDg1NzYwLCA2LCAzMTQ1ODk0LAorCTE2LCAyNzQ3NDEyNDgsIDksIDE2OCwgMywgNDE5NDMwNCwgMywgNDIwOTk0OSwgMCwgMCwgMCwgMjU2LCAxNCwKKwkxNzQsIDEsIDExNDg1NywgMSwgMzM1NjAwMDcsIDEyLCAxNzYsIDAsIDEwMjQwLCAxLCAxMTQ4NTgsIDEsCisJMzM1NjAwMTgsIDEsIDExNDg1NywgMywgMzM1NjAwMDcsIDEsIDE2MDA4LCAxLCAxMTQ4NzQsIDEsCisJMzM1NjAzNjAsIDEsIDExNDg3NSwgMSwgMzM1NjAxNTQsIDAsIDE1OTYzLCAwLCAyNTYsIDAsIDQwOTYsIDEsCisJNDA5NjExLCA5LCAxODgsIDAsIDEwMjQwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCitzdGF0aWMgaW50IFIxMjhfUkVBRF9QTEwoZHJtX2RldmljZV90ICpkZXYsIGludCBhZGRyKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJUjEyOF9XUklURTgoUjEyOF9DTE9DS19DTlRMX0lOREVYLCBhZGRyICYgMHgxZik7CisJcmV0dXJuIFIxMjhfUkVBRChSMTI4X0NMT0NLX0NOVExfREFUQSk7Cit9CisKKyNpZiBSMTI4X0ZJRk9fREVCVUcKK3N0YXRpYyB2b2lkIHIxMjhfc3RhdHVzKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlwcmludGsoICJHVUlfU1RBVCAgICAgICAgICAgPSAweCUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpUjEyOF9SRUFEKCBSMTI4X0dVSV9TVEFUICkgKTsKKwlwcmludGsoICJQTTRfU1RBVCAgICAgICAgICAgPSAweCUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpUjEyOF9SRUFEKCBSMTI4X1BNNF9TVEFUICkgKTsKKwlwcmludGsoICJQTTRfQlVGRkVSX0RMX1dQVFIgPSAweCUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpUjEyOF9SRUFEKCBSMTI4X1BNNF9CVUZGRVJfRExfV1BUUiApICk7CisJcHJpbnRrKCAiUE00X0JVRkZFUl9ETF9SUFRSID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVIxMjhfUkVBRCggUjEyOF9QTTRfQlVGRkVSX0RMX1JQVFIgKSApOworCXByaW50ayggIlBNNF9NSUNST19DTlRMICAgICA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludClSMTI4X1JFQUQoIFIxMjhfUE00X01JQ1JPX0NOVEwgKSApOworCXByaW50ayggIlBNNF9CVUZGRVJfQ05UTCAgICA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludClSMTI4X1JFQUQoIFIxMjhfUE00X0JVRkZFUl9DTlRMICkgKTsKK30KKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVuZ2luZSwgRklGTyBjb250cm9sCisgKi8KKworc3RhdGljIGludCByMTI4X2RvX3BpeGNhY2hlX2ZsdXNoKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1MzIgdG1wOworCWludCBpOworCisJdG1wID0gUjEyOF9SRUFEKCBSMTI4X1BDX05HVUlfQ1RMU1RBVCApIHwgUjEyOF9QQ19GTFVTSF9BTEw7CisJUjEyOF9XUklURSggUjEyOF9QQ19OR1VJX0NUTFNUQVQsIHRtcCApOworCisJZm9yICggaSA9IDAgOyBpIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IGkrKyApIHsKKwkJaWYgKCAhKFIxMjhfUkVBRCggUjEyOF9QQ19OR1VJX0NUTFNUQVQgKSAmIFIxMjhfUENfQlVTWSkgKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisjaWYgUjEyOF9GSUZPX0RFQlVHCisJRFJNX0VSUk9SKCAiZmFpbGVkIVxuIiApOworI2VuZGlmCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCitzdGF0aWMgaW50IHIxMjhfZG9fd2FpdF9mb3JfZmlmbyggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IGVudHJpZXMgKQoreworCWludCBpOworCisJZm9yICggaSA9IDAgOyBpIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IGkrKyApIHsKKwkJaW50IHNsb3RzID0gUjEyOF9SRUFEKCBSMTI4X0dVSV9TVEFUICkgJiBSMTI4X0dVSV9GSUZPQ05UX01BU0s7CisJCWlmICggc2xvdHMgPj0gZW50cmllcyApIHJldHVybiAwOworCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisjaWYgUjEyOF9GSUZPX0RFQlVHCisJRFJNX0VSUk9SKCAiZmFpbGVkIVxuIiApOworI2VuZGlmCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCitzdGF0aWMgaW50IHIxMjhfZG9fd2FpdF9mb3JfaWRsZSggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJaW50IGksIHJldDsKKworCXJldCA9IHIxMjhfZG9fd2FpdF9mb3JfZmlmbyggZGV2X3ByaXYsIDY0ICk7CisJaWYgKCByZXQgKSByZXR1cm4gcmV0OworCisJZm9yICggaSA9IDAgOyBpIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IGkrKyApIHsKKwkJaWYgKCAhKFIxMjhfUkVBRCggUjEyOF9HVUlfU1RBVCApICYgUjEyOF9HVUlfQUNUSVZFKSApIHsKKwkJCXIxMjhfZG9fcGl4Y2FjaGVfZmx1c2goIGRldl9wcml2ICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisjaWYgUjEyOF9GSUZPX0RFQlVHCisJRFJNX0VSUk9SKCAiZmFpbGVkIVxuIiApOworI2VuZGlmCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENDRSBjb250cm9sLCBpbml0aWFsaXphdGlvbgorICovCisKKy8qIExvYWQgdGhlIG1pY3JvY29kZSBmb3IgdGhlIENDRSAqLworc3RhdGljIHZvaWQgcjEyOF9jY2VfbG9hZF9taWNyb2NvZGUoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWludCBpOworCisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlyMTI4X2RvX3dhaXRfZm9yX2lkbGUoIGRldl9wcml2ICk7CisKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9NSUNST0NPREVfQUREUiwgMCApOworCWZvciAoIGkgPSAwIDsgaSA8IDI1NiA7IGkrKyApIHsKKwkJUjEyOF9XUklURSggUjEyOF9QTTRfTUlDUk9DT0RFX0RBVEFILAorCQkJICAgIHIxMjhfY2NlX21pY3JvY29kZVtpICogMl0gKTsKKwkJUjEyOF9XUklURSggUjEyOF9QTTRfTUlDUk9DT0RFX0RBVEFMLAorCQkJICAgIHIxMjhfY2NlX21pY3JvY29kZVtpICogMiArIDFdICk7CisJfQorfQorCisvKiBGbHVzaCBhbnkgcGVuZGluZyBjb21tYW5kcyB0byB0aGUgQ0NFLiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGp1c3QKKyAqIHByaW9yIHRvIGEgd2FpdCBmb3IgaWRsZSwgYXMgaXQgaW5mb3JtcyB0aGUgZW5naW5lIHRoYXQgdGhlIGNvbW1hbmQKKyAqIHN0cmVhbSBpcyBlbmRpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHIxMjhfZG9fY2NlX2ZsdXNoKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1MzIgdG1wOworCisJdG1wID0gUjEyOF9SRUFEKCBSMTI4X1BNNF9CVUZGRVJfRExfV1BUUiApIHwgUjEyOF9QTTRfQlVGRkVSX0RMX0RPTkU7CisJUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX0RMX1dQVFIsIHRtcCApOworfQorCisvKiBXYWl0IGZvciB0aGUgQ0NFIHRvIGdvIGlkbGUuCisgKi8KK2ludCByMTI4X2RvX2NjZV9pZGxlKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlpbnQgaTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgOyBpKysgKSB7CisJCWlmICggR0VUX1JJTkdfSEVBRCggZGV2X3ByaXYgKSA9PSBkZXZfcHJpdi0+cmluZy50YWlsICkgeworCQkJaW50IHBtNHN0YXQgPSBSMTI4X1JFQUQoIFIxMjhfUE00X1NUQVQgKTsKKwkJCWlmICggKCAocG00c3RhdCAmIFIxMjhfUE00X0ZJRk9DTlRfTUFTSykgPj0KKwkJCSAgICAgICBkZXZfcHJpdi0+Y2NlX2ZpZm9fc2l6ZSApICYmCisJCQkgICAgICEocG00c3RhdCAmIChSMTI4X1BNNF9CVVNZIHwKKwkJCQkJICBSMTI4X1BNNF9HVUlfQUNUSVZFKSkgKSB7CisJCQkJcmV0dXJuIHIxMjhfZG9fcGl4Y2FjaGVfZmx1c2goIGRldl9wcml2ICk7CisJCQl9CisJCX0KKwkJRFJNX1VERUxBWSggMSApOworCX0KKworI2lmIFIxMjhfRklGT19ERUJVRworCURSTV9FUlJPUiggImZhaWxlZCFcbiIgKTsKKwlyMTI4X3N0YXR1cyggZGV2X3ByaXYgKTsKKyNlbmRpZgorCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKK30KKworLyogU3RhcnQgdGhlIENvbmN1cnJlbnQgQ29tbWFuZCBFbmdpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHIxMjhfZG9fY2NlX3N0YXJ0KCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlyMTI4X2RvX3dhaXRfZm9yX2lkbGUoIGRldl9wcml2ICk7CisKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9CVUZGRVJfQ05UTCwKKwkJICAgIGRldl9wcml2LT5jY2VfbW9kZSB8IGRldl9wcml2LT5yaW5nLnNpemVfbDJxdworCQkgICAgfCBSMTI4X1BNNF9CVUZGRVJfQ05UTF9OT1VQREFURSApOworCVIxMjhfUkVBRCggUjEyOF9QTTRfQlVGRkVSX0FERFIgKTsgLyogYXMgcGVyIHRoZSBzYW1wbGUgY29kZSAqLworCVIxMjhfV1JJVEUoIFIxMjhfUE00X01JQ1JPX0NOVEwsIFIxMjhfUE00X01JQ1JPX0ZSRUVSVU4gKTsKKworCWRldl9wcml2LT5jY2VfcnVubmluZyA9IDE7Cit9CisKKy8qIFJlc2V0IHRoZSBDb25jdXJyZW50IENvbW1hbmQgRW5naW5lLiAgVGhpcyB3aWxsIG5vdCBmbHVzaCBhbnkgcGVuZGluZworICogY29tbWFuZHMsIHNvIHlvdSBtdXN0IHdhaXQgZm9yIHRoZSBDQ0UgY29tbWFuZCBzdHJlYW0gdG8gY29tcGxldGUKKyAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgcjEyOF9kb19jY2VfcmVzZXQoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCVIxMjhfV1JJVEUoIFIxMjhfUE00X0JVRkZFUl9ETF9XUFRSLCAwICk7CisJUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX0RMX1JQVFIsIDAgKTsKKwlkZXZfcHJpdi0+cmluZy50YWlsID0gMDsKK30KKworLyogU3RvcCB0aGUgQ29uY3VycmVudCBDb21tYW5kIEVuZ2luZS4gIFRoaXMgd2lsbCBub3QgZmx1c2ggYW55IHBlbmRpbmcKKyAqIGNvbW1hbmRzLCBzbyB5b3UgbXVzdCBmbHVzaCB0aGUgY29tbWFuZCBzdHJlYW0gYW5kIHdhaXQgZm9yIHRoZSBDQ0UKKyAqIHRvIGdvIGlkbGUgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICovCitzdGF0aWMgdm9pZCByMTI4X2RvX2NjZV9zdG9wKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9NSUNST19DTlRMLCAwICk7CisJUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX0NOVEwsCisJCSAgICBSMTI4X1BNNF9OT05QTTQgfCBSMTI4X1BNNF9CVUZGRVJfQ05UTF9OT1VQREFURSApOworCisJZGV2X3ByaXYtPmNjZV9ydW5uaW5nID0gMDsKK30KKworLyogUmVzZXQgdGhlIGVuZ2luZS4gIFRoaXMgd2lsbCBzdG9wIHRoZSBDQ0UgaWYgaXQgaXMgcnVubmluZy4KKyAqLworc3RhdGljIGludCByMTI4X2RvX2VuZ2luZV9yZXNldCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBjbG9ja19jbnRsX2luZGV4LCBtY2xrX2NudGwsIGdlbl9yZXNldF9jbnRsOworCisJcjEyOF9kb19waXhjYWNoZV9mbHVzaCggZGV2X3ByaXYgKTsKKworCWNsb2NrX2NudGxfaW5kZXggPSBSMTI4X1JFQUQoIFIxMjhfQ0xPQ0tfQ05UTF9JTkRFWCApOworCW1jbGtfY250bCA9IFIxMjhfUkVBRF9QTEwoIGRldiwgUjEyOF9NQ0xLX0NOVEwgKTsKKworCVIxMjhfV1JJVEVfUExMKCBSMTI4X01DTEtfQ05UTCwKKwkJCW1jbGtfY250bCB8IFIxMjhfRk9SQ0VfR0NQIHwgUjEyOF9GT1JDRV9QSVBFM0RfQ1AgKTsKKworCWdlbl9yZXNldF9jbnRsID0gUjEyOF9SRUFEKCBSMTI4X0dFTl9SRVNFVF9DTlRMICk7CisKKwkvKiBUYWtlbiBmcm9tIHRoZSBzYW1wbGUgY29kZSAtIGRvIG5vdCBjaGFuZ2UgKi8KKwlSMTI4X1dSSVRFKCBSMTI4X0dFTl9SRVNFVF9DTlRMLAorCQkgICAgZ2VuX3Jlc2V0X2NudGwgfCBSMTI4X1NPRlRfUkVTRVRfR1VJICk7CisJUjEyOF9SRUFEKCBSMTI4X0dFTl9SRVNFVF9DTlRMICk7CisJUjEyOF9XUklURSggUjEyOF9HRU5fUkVTRVRfQ05UTCwKKwkJICAgIGdlbl9yZXNldF9jbnRsICYgflIxMjhfU09GVF9SRVNFVF9HVUkgKTsKKwlSMTI4X1JFQUQoIFIxMjhfR0VOX1JFU0VUX0NOVEwgKTsKKworCVIxMjhfV1JJVEVfUExMKCBSMTI4X01DTEtfQ05UTCwgbWNsa19jbnRsICk7CisJUjEyOF9XUklURSggUjEyOF9DTE9DS19DTlRMX0lOREVYLCBjbG9ja19jbnRsX2luZGV4ICk7CisJUjEyOF9XUklURSggUjEyOF9HRU5fUkVTRVRfQ05UTCwgZ2VuX3Jlc2V0X2NudGwgKTsKKworCS8qIFJlc2V0IHRoZSBDQ0UgcmluZyAqLworCXIxMjhfZG9fY2NlX3Jlc2V0KCBkZXZfcHJpdiApOworCisJLyogVGhlIENDRSBpcyBubyBsb25nZXIgcnVubmluZyBhZnRlciBhbiBlbmdpbmUgcmVzZXQgKi8KKwlkZXZfcHJpdi0+Y2NlX3J1bm5pbmcgPSAwOworCisJLyogUmVzZXQgYW55IHBlbmRpbmcgdmVydGV4LCBpbmRpcmVjdCBidWZmZXJzICovCisJcjEyOF9mcmVlbGlzdF9yZXNldCggZGV2ICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcjEyOF9jY2VfaW5pdF9yaW5nX2J1ZmZlciggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICAgIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXUzMiByaW5nX3N0YXJ0OworCXUzMiB0bXA7CisKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCS8qIFRoZSBtYW51YWwgKHAuIDIpIHNheXMgdGhpcyBhZGRyZXNzIGlzIGluICJWTSBzcGFjZSIuICBUaGlzCisJICogbWVhbnMgaXQncyBhbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgQUdQIHNwYWNlLgorCSAqLworI2lmIF9fT1NfSEFTX0FHUAorCWlmICggIWRldl9wcml2LT5pc19wY2kgKQorCQlyaW5nX3N0YXJ0ID0gZGV2X3ByaXYtPmNjZV9yaW5nLT5vZmZzZXQgLSBkZXYtPmFncC0+YmFzZTsKKwllbHNlCisjZW5kaWYKKwkJcmluZ19zdGFydCA9IGRldl9wcml2LT5jY2VfcmluZy0+b2Zmc2V0IC0gZGV2LT5zZy0+aGFuZGxlOworCisJUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX09GRlNFVCwgcmluZ19zdGFydCB8IFIxMjhfQUdQX09GRlNFVCApOworCisJUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX0RMX1dQVFIsIDAgKTsKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9CVUZGRVJfRExfUlBUUiwgMCApOworCisJLyogU2V0IHdhdGVybWFyayBjb250cm9sICovCisJUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX1dNX0NOVEwsCisJCSAgICAoKFIxMjhfV0FURVJNQVJLX0wvNCkgPDwgUjEyOF9XTUFfU0hJRlQpCisJCSAgICB8ICgoUjEyOF9XQVRFUk1BUktfTS80KSA8PCBSMTI4X1dNQl9TSElGVCkKKwkJICAgIHwgKChSMTI4X1dBVEVSTUFSS19OLzQpIDw8IFIxMjhfV01DX1NISUZUKQorCQkgICAgfCAoKFIxMjhfV0FURVJNQVJLX0svNjQpIDw8IFIxMjhfV0JfV01fU0hJRlQpICk7CisKKwkvKiBGb3JjZSByZWFkLiAgV2h5PyAgQmVjYXVzZSBpdCdzIGluIHRoZSBleGFtcGxlcy4uLiAqLworCVIxMjhfUkVBRCggUjEyOF9QTTRfQlVGRkVSX0FERFIgKTsKKworCS8qIFR1cm4gb24gYnVzIG1hc3RlcmluZyAqLworCXRtcCA9IFIxMjhfUkVBRCggUjEyOF9CVVNfQ05UTCApICYgflIxMjhfQlVTX01BU1RFUl9ESVM7CisJUjEyOF9XUklURSggUjEyOF9CVVNfQ05UTCwgdG1wICk7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9kb19pbml0X2NjZSggZHJtX2RldmljZV90ICpkZXYsIGRybV9yMTI4X2luaXRfdCAqaW5pdCApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKworCURSTV9ERUJVRyggIlxuIiApOworCisJZGV2X3ByaXYgPSBkcm1fYWxsb2MoIHNpemVvZihkcm1fcjEyOF9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUiApOworCWlmICggZGV2X3ByaXYgPT0gTlVMTCApCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwltZW1zZXQoIGRldl9wcml2LCAwLCBzaXplb2YoZHJtX3IxMjhfcHJpdmF0ZV90KSApOworCisJZGV2X3ByaXYtPmlzX3BjaSA9IGluaXQtPmlzX3BjaTsKKworCWlmICggZGV2X3ByaXYtPmlzX3BjaSAmJiAhZGV2LT5zZyApIHsKKwkJRFJNX0VSUk9SKCAiUENJIEdBUlQgbWVtb3J5IG5vdCBhbGxvY2F0ZWQhXG4iICk7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlkZXZfcHJpdi0+dXNlY190aW1lb3V0ID0gaW5pdC0+dXNlY190aW1lb3V0OworCWlmICggZGV2X3ByaXYtPnVzZWNfdGltZW91dCA8IDEgfHwKKwkgICAgIGRldl9wcml2LT51c2VjX3RpbWVvdXQgPiBSMTI4X01BWF9VU0VDX1RJTUVPVVQgKSB7CisJCURSTV9ERUJVRyggIlRJTUVPVVQgcHJvYmxlbSFcbiIgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWRldl9wcml2LT5jY2VfbW9kZSA9IGluaXQtPmNjZV9tb2RlOworCisJLyogR0g6IFNpbXBsZSBpZGxlIGNoZWNrLgorCSAqLworCWF0b21pY19zZXQoICZkZXZfcHJpdi0+aWRsZV9jb3VudCwgMCApOworCisJLyogV2UgZG9uJ3Qgc3VwcG9ydCBhbnl0aGluZyBvdGhlciB0aGFuIGJ1cy1tYXN0ZXJpbmcgcmluZyBtb2RlLAorCSAqIGJ1dCB0aGUgcmluZyBjYW4gYmUgaW4gZWl0aGVyIEFHUCBvciBQQ0kgc3BhY2UgZm9yIHRoZSByaW5nCisJICogcmVhZCBwb2ludGVyLgorCSAqLworCWlmICggKCBpbml0LT5jY2VfbW9kZSAhPSBSMTI4X1BNNF8xOTJCTSApICYmCisJICAgICAoIGluaXQtPmNjZV9tb2RlICE9IFIxMjhfUE00XzEyOEJNXzY0SU5EQk0gKSAmJgorCSAgICAgKCBpbml0LT5jY2VfbW9kZSAhPSBSMTI4X1BNNF82NEJNXzEyOElOREJNICkgJiYKKwkgICAgICggaW5pdC0+Y2NlX21vZGUgIT0gUjEyOF9QTTRfNjRCTV82NFZDQk1fNjRJTkRCTSApICkgeworCQlEUk1fREVCVUcoICJCYWQgY2NlX21vZGUhXG4iICk7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlzd2l0Y2ggKCBpbml0LT5jY2VfbW9kZSApIHsKKwljYXNlIFIxMjhfUE00X05PTlBNNDoKKwkJZGV2X3ByaXYtPmNjZV9maWZvX3NpemUgPSAwOworCQlicmVhazsKKwljYXNlIFIxMjhfUE00XzE5MlBJTzoKKwljYXNlIFIxMjhfUE00XzE5MkJNOgorCQlkZXZfcHJpdi0+Y2NlX2ZpZm9fc2l6ZSA9IDE5MjsKKwkJYnJlYWs7CisJY2FzZSBSMTI4X1BNNF8xMjhQSU9fNjRJTkRCTToKKwljYXNlIFIxMjhfUE00XzEyOEJNXzY0SU5EQk06CisJCWRldl9wcml2LT5jY2VfZmlmb19zaXplID0gMTI4OworCQlicmVhazsKKwljYXNlIFIxMjhfUE00XzY0UElPXzEyOElOREJNOgorCWNhc2UgUjEyOF9QTTRfNjRCTV8xMjhJTkRCTToKKwljYXNlIFIxMjhfUE00XzY0UElPXzY0VkNCTV82NElOREJNOgorCWNhc2UgUjEyOF9QTTRfNjRCTV82NFZDQk1fNjRJTkRCTToKKwljYXNlIFIxMjhfUE00XzY0UElPXzY0VkNQSU9fNjRJTkRQSU86CisJCWRldl9wcml2LT5jY2VfZmlmb19zaXplID0gNjQ7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoIGluaXQtPmZiX2JwcCApIHsKKwljYXNlIDE2OgorCQlkZXZfcHJpdi0+Y29sb3JfZm10ID0gUjEyOF9EQVRBVFlQRV9SR0I1NjU7CisJCWJyZWFrOworCWNhc2UgMzI6CisJZGVmYXVsdDoKKwkJZGV2X3ByaXYtPmNvbG9yX2ZtdCA9IFIxMjhfREFUQVRZUEVfQVJHQjg4ODg7CisJCWJyZWFrOworCX0KKwlkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0CT0gaW5pdC0+ZnJvbnRfb2Zmc2V0OworCWRldl9wcml2LT5mcm9udF9waXRjaAk9IGluaXQtPmZyb250X3BpdGNoOworCWRldl9wcml2LT5iYWNrX29mZnNldAk9IGluaXQtPmJhY2tfb2Zmc2V0OworCWRldl9wcml2LT5iYWNrX3BpdGNoCT0gaW5pdC0+YmFja19waXRjaDsKKworCXN3aXRjaCAoIGluaXQtPmRlcHRoX2JwcCApIHsKKwljYXNlIDE2OgorCQlkZXZfcHJpdi0+ZGVwdGhfZm10ID0gUjEyOF9EQVRBVFlQRV9SR0I1NjU7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJY2FzZSAzMjoKKwlkZWZhdWx0OgorCQlkZXZfcHJpdi0+ZGVwdGhfZm10ID0gUjEyOF9EQVRBVFlQRV9BUkdCODg4ODsKKwkJYnJlYWs7CisJfQorCWRldl9wcml2LT5kZXB0aF9vZmZzZXQJPSBpbml0LT5kZXB0aF9vZmZzZXQ7CisJZGV2X3ByaXYtPmRlcHRoX3BpdGNoCT0gaW5pdC0+ZGVwdGhfcGl0Y2g7CisJZGV2X3ByaXYtPnNwYW5fb2Zmc2V0CT0gaW5pdC0+c3Bhbl9vZmZzZXQ7CisKKwlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0X2MgPSAoKChkZXZfcHJpdi0+ZnJvbnRfcGl0Y2gvOCkgPDwgMjEpIHwKKwkJCQkJICAoZGV2X3ByaXYtPmZyb250X29mZnNldCA+PiA1KSk7CisJZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0X2MgPSAoKChkZXZfcHJpdi0+YmFja19waXRjaC84KSA8PCAyMSkgfAorCQkJCQkgKGRldl9wcml2LT5iYWNrX29mZnNldCA+PiA1KSk7CisJZGV2X3ByaXYtPmRlcHRoX3BpdGNoX29mZnNldF9jID0gKCgoZGV2X3ByaXYtPmRlcHRoX3BpdGNoLzgpIDw8IDIxKSB8CisJCQkJCSAgKGRldl9wcml2LT5kZXB0aF9vZmZzZXQgPj4gNSkgfAorCQkJCQkgIFIxMjhfRFNUX1RJTEUpOworCWRldl9wcml2LT5zcGFuX3BpdGNoX29mZnNldF9jID0gKCgoZGV2X3ByaXYtPmRlcHRoX3BpdGNoLzgpIDw8IDIxKSB8CisJCQkJCSAoZGV2X3ByaXYtPnNwYW5fb2Zmc2V0ID4+IDUpKTsKKworCURSTV9HRVRTQVJFQSgpOworCQorCWlmKCFkZXZfcHJpdi0+c2FyZWEpIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBzYXJlYSFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcjEyOF9kb19jbGVhbnVwX2NjZSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZGV2X3ByaXYtPm1taW8gPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pb19vZmZzZXQpOworCWlmKCFkZXZfcHJpdi0+bW1pbykgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIG1taW8gcmVnaW9uIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2X3ByaXYtPmNjZV9yaW5nID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPnJpbmdfb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPmNjZV9yaW5nKSB7CisJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgY2NlIHJpbmcgcmVnaW9uIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2X3ByaXYtPnJpbmdfcnB0ciA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5yaW5nX3JwdHJfb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPnJpbmdfcnB0cikgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIHJpbmcgcmVhZCBwb2ludGVyIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5idWZmZXJzX29mZnNldCk7CisJaWYoIWRldi0+YWdwX2J1ZmZlcl9tYXApIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBkbWEgYnVmZmVyIHJlZ2lvbiFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcjEyOF9kb19jbGVhbnVwX2NjZSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApIHsKKwkJZGV2X3ByaXYtPmFncF90ZXh0dXJlcyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5hZ3BfdGV4dHVyZXNfb2Zmc2V0KTsKKwkJaWYoIWRldl9wcml2LT5hZ3BfdGV4dHVyZXMpIHsKKwkJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgYWdwIHRleHR1cmUgcmVnaW9uIVxuIik7CisJCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJCXIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2ID0KKwkJKGRybV9yMTI4X3NhcmVhX3QgKikoKHU4ICopZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGUgKworCQkJCSAgICAgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCisjaWYgX19PU19IQVNfQUdQCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApIHsKKwkJZHJtX2NvcmVfaW9yZW1hcCggZGV2X3ByaXYtPmNjZV9yaW5nLCBkZXYgKTsKKwkJZHJtX2NvcmVfaW9yZW1hcCggZGV2X3ByaXYtPnJpbmdfcnB0ciwgZGV2ICk7CisJCWRybV9jb3JlX2lvcmVtYXAoIGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldiApOworCQlpZighZGV2X3ByaXYtPmNjZV9yaW5nLT5oYW5kbGUgfHwKKwkJICAgIWRldl9wcml2LT5yaW5nX3JwdHItPmhhbmRsZSB8fAorCQkgICAhZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlKSB7CisJCQlEUk1fRVJST1IoIkNvdWxkIG5vdCBpb3JlbWFwIGFncCByZWdpb25zIVxuIik7CisJCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJCXIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwkJfQorCX0gZWxzZQorI2VuZGlmCisJeworCQlkZXZfcHJpdi0+Y2NlX3JpbmctPmhhbmRsZSA9CisJCQkodm9pZCAqKWRldl9wcml2LT5jY2VfcmluZy0+b2Zmc2V0OworCQlkZXZfcHJpdi0+cmluZ19ycHRyLT5oYW5kbGUgPQorCQkJKHZvaWQgKilkZXZfcHJpdi0+cmluZ19ycHRyLT5vZmZzZXQ7CisJCWRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSA9ICh2b2lkICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+b2Zmc2V0OworCX0KKworI2lmIF9fT1NfSEFTX0FHUAorCWlmICggIWRldl9wcml2LT5pc19wY2kgKQorCQlkZXZfcHJpdi0+Y2NlX2J1ZmZlcnNfb2Zmc2V0ID0gZGV2LT5hZ3AtPmJhc2U7CisJZWxzZQorI2VuZGlmCisJCWRldl9wcml2LT5jY2VfYnVmZmVyc19vZmZzZXQgPSBkZXYtPnNnLT5oYW5kbGU7CisKKwlkZXZfcHJpdi0+cmluZy5zdGFydCA9ICh1MzIgKilkZXZfcHJpdi0+Y2NlX3JpbmctPmhhbmRsZTsKKwlkZXZfcHJpdi0+cmluZy5lbmQgPSAoKHUzMiAqKWRldl9wcml2LT5jY2VfcmluZy0+aGFuZGxlCisJCQkgICAgICArIGluaXQtPnJpbmdfc2l6ZSAvIHNpemVvZih1MzIpKTsKKwlkZXZfcHJpdi0+cmluZy5zaXplID0gaW5pdC0+cmluZ19zaXplOworCWRldl9wcml2LT5yaW5nLnNpemVfbDJxdyA9IGRybV9vcmRlciggaW5pdC0+cmluZ19zaXplIC8gOCApOworCisJZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrID0KKwkJKGRldl9wcml2LT5yaW5nLnNpemUgLyBzaXplb2YodTMyKSkgLSAxOworCisJZGV2X3ByaXYtPnJpbmcuaGlnaF9tYXJrID0gMTI4OworCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUgPSAwOworCVIxMjhfV1JJVEUoIFIxMjhfTEFTVF9GUkFNRV9SRUcsIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lICk7CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IDA7CisJUjEyOF9XUklURSggUjEyOF9MQVNUX0RJU1BBVENIX1JFRywKKwkJICAgIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoICk7CisKKyNpZiBfX09TX0hBU19BR1AKKwlpZiAoIGRldl9wcml2LT5pc19wY2kgKSB7CisjZW5kaWYKKwkJaWYgKCFkcm1fYXRpX3BjaWdhcnRfaW5pdCggZGV2LCAmZGV2X3ByaXYtPnBoeXNfcGNpX2dhcnQsCisgICAgIAkJCQkJICAgICZkZXZfcHJpdi0+YnVzX3BjaV9nYXJ0KSApIHsKKwkJCURSTV9FUlJPUiggImZhaWxlZCB0byBpbml0IFBDSSBHQVJUIVxuIiApOworCQkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCX0KKwkJUjEyOF9XUklURSggUjEyOF9QQ0lfR0FSVF9QQUdFLCBkZXZfcHJpdi0+YnVzX3BjaV9nYXJ0ICk7CisjaWYgX19PU19IQVNfQUdQCisJfQorI2VuZGlmCisKKwlyMTI4X2NjZV9pbml0X3JpbmdfYnVmZmVyKCBkZXYsIGRldl9wcml2ICk7CisJcjEyOF9jY2VfbG9hZF9taWNyb2NvZGUoIGRldl9wcml2ICk7CisKKwlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKworCXIxMjhfZG9fZW5naW5lX3Jlc2V0KCBkZXYgKTsKKworCXJldHVybiAwOworfQorCitpbnQgcjEyOF9kb19jbGVhbnVwX2NjZSggZHJtX2RldmljZV90ICpkZXYgKQoreworCisJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCisJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQorCSAqIGlzIGZyZWVkLCBpdCdzIHRvbyBsYXRlLgorCSAqLworCWlmICggZGV2LT5pcnFfZW5hYmxlZCApIGRybV9pcnFfdW5pbnN0YWxsKGRldik7CisKKwlpZiAoIGRldi0+ZGV2X3ByaXZhdGUgKSB7CisJCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisjaWYgX19PU19IQVNfQUdQCisJCWlmICggIWRldl9wcml2LT5pc19wY2kgKSB7CisJCQlpZiAoIGRldl9wcml2LT5jY2VfcmluZyAhPSBOVUxMICkKKwkJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSggZGV2X3ByaXYtPmNjZV9yaW5nLCBkZXYgKTsKKwkJCWlmICggZGV2X3ByaXYtPnJpbmdfcnB0ciAhPSBOVUxMICkKKwkJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSggZGV2X3ByaXYtPnJpbmdfcnB0ciwgZGV2ICk7CisJCQlpZiAoIGRldi0+YWdwX2J1ZmZlcl9tYXAgIT0gTlVMTCApCisJCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoIGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldiApOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQlpZiAoIWRybV9hdGlfcGNpZ2FydF9jbGVhbnVwKCBkZXYsCisJCQkJCQlkZXZfcHJpdi0+cGh5c19wY2lfZ2FydCwKKwkJCQkJCWRldl9wcml2LT5idXNfcGNpX2dhcnQgKSkKKwkJCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gY2xlYW51cCBQQ0kgR0FSVCFcbiIgKTsKKwkJfQorCisJCWRybV9mcmVlKCBkZXYtPmRldl9wcml2YXRlLCBzaXplb2YoZHJtX3IxMjhfcHJpdmF0ZV90KSwKKwkJCSAgIERSTV9NRU1fRFJJVkVSICk7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcjEyOF9jY2VfaW5pdCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfaW5pdF90IGluaXQ7CisKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGluaXQsIChkcm1fcjEyOF9pbml0X3QgX191c2VyICopZGF0YSwgc2l6ZW9mKGluaXQpICk7CisKKwlzd2l0Y2ggKCBpbml0LmZ1bmMgKSB7CisJY2FzZSBSMTI4X0lOSVRfQ0NFOgorCQlyZXR1cm4gcjEyOF9kb19pbml0X2NjZSggZGV2LCAmaW5pdCApOworCWNhc2UgUjEyOF9DTEVBTlVQX0NDRToKKwkJcmV0dXJuIHIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCX0KKworCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cit9CisKK2ludCByMTI4X2NjZV9zdGFydCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCBkZXZfcHJpdi0+Y2NlX3J1bm5pbmcgfHwgZGV2X3ByaXYtPmNjZV9tb2RlID09IFIxMjhfUE00X05PTlBNNCApIHsKKwkJRFJNX0RFQlVHKCAiJXMgd2hpbGUgQ0NFIHJ1bm5pbmdcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gMDsKKwl9CisKKwlyMTI4X2RvX2NjZV9zdGFydCggZGV2X3ByaXYgKTsKKworCXJldHVybiAwOworfQorCisvKiBTdG9wIHRoZSBDQ0UuICBUaGUgZW5naW5lIG11c3QgaGF2ZSBiZWVuIGlkbGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMKKyAqIHJvdXRpbmUuCisgKi8KK2ludCByMTI4X2NjZV9zdG9wKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9jY2Vfc3RvcF90IHN0b3A7CisJaW50IHJldDsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoc3RvcCwgKGRybV9yMTI4X2NjZV9zdG9wX3QgX191c2VyICopZGF0YSwgc2l6ZW9mKHN0b3ApICk7CisKKwkvKiBGbHVzaCBhbnkgcGVuZGluZyBDQ0UgY29tbWFuZHMuICBUaGlzIGVuc3VyZXMgYW55IG91dHN0YW5kaW5nCisJICogY29tbWFuZHMgYXJlIGV4ZWN0dXRlZCBieSB0aGUgZW5naW5lIGJlZm9yZSB3ZSB0dXJuIGl0IG9mZi4KKwkgKi8KKwlpZiAoIHN0b3AuZmx1c2ggKSB7CisJCXIxMjhfZG9fY2NlX2ZsdXNoKCBkZXZfcHJpdiApOworCX0KKworCS8qIElmIHdlIGZhaWwgdG8gbWFrZSB0aGUgZW5naW5lIGdvIGlkbGUsIHdlIHJldHVybiBhbiBlcnJvcgorCSAqIGNvZGUgc28gdGhhdCB0aGUgRFJNIGlvY3RsIHdyYXBwZXIgY2FuIHRyeSBhZ2Fpbi4KKwkgKi8KKwlpZiAoIHN0b3AuaWRsZSApIHsKKwkJcmV0ID0gcjEyOF9kb19jY2VfaWRsZSggZGV2X3ByaXYgKTsKKwkJaWYgKCByZXQgKSByZXR1cm4gcmV0OworCX0KKworCS8qIEZpbmFsbHksIHdlIGNhbiB0dXJuIG9mZiB0aGUgQ0NFLiAgSWYgdGhlIGVuZ2luZSBpc24ndCBpZGxlLAorCSAqIHdlIHdpbGwgZ2V0IHNvbWUgZHJvcHBlZCB0cmlhbmdsZXMgYXMgdGhleSB3b24ndCBiZSBmdWxseQorCSAqIHJlbmRlcmVkIGJlZm9yZSB0aGUgQ0NFIGlzIHNodXQgZG93bi4KKwkgKi8KKwlyMTI4X2RvX2NjZV9zdG9wKCBkZXZfcHJpdiApOworCisJLyogUmVzZXQgdGhlIGVuZ2luZSAqLworCXIxMjhfZG9fZW5naW5lX3Jlc2V0KCBkZXYgKTsKKworCXJldHVybiAwOworfQorCisvKiBKdXN0IHJlc2V0IHRoZSBDQ0UgcmluZy4gIENhbGxlZCBhcyBwYXJ0IG9mIGFuIFggU2VydmVyIGVuZ2luZSByZXNldC4KKyAqLworaW50IHIxMjhfY2NlX3Jlc2V0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0RFQlVHKCAiJXMgY2FsbGVkIGJlZm9yZSBpbml0IGRvbmVcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXIxMjhfZG9fY2NlX3Jlc2V0KCBkZXZfcHJpdiApOworCisJLyogVGhlIENDRSBpcyBubyBsb25nZXIgcnVubmluZyBhZnRlciBhbiBlbmdpbmUgcmVzZXQgKi8KKwlkZXZfcHJpdi0+Y2NlX3J1bm5pbmcgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCByMTI4X2NjZV9pZGxlKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoIGRldl9wcml2LT5jY2VfcnVubmluZyApIHsKKwkJcjEyOF9kb19jY2VfZmx1c2goIGRldl9wcml2ICk7CisJfQorCisJcmV0dXJuIHIxMjhfZG9fY2NlX2lkbGUoIGRldl9wcml2ICk7Cit9CisKK2ludCByMTI4X2VuZ2luZV9yZXNldCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJcmV0dXJuIHIxMjhfZG9fZW5naW5lX3Jlc2V0KCBkZXYgKTsKK30KKworaW50IHIxMjhfZnVsbHNjcmVlbiggRFJNX0lPQ1RMX0FSR1MgKQoreworCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnJlZWxpc3QgbWFuYWdlbWVudAorICovCisjZGVmaW5lIFIxMjhfQlVGRkVSX1VTRUQJMHhmZmZmZmZmZgorI2RlZmluZSBSMTI4X0JVRkZFUl9GUkVFCTAKKworI2lmIDAKK3N0YXRpYyBpbnQgcjEyOF9mcmVlbGlzdF9pbml0KCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJZHJtX3IxMjhfZnJlZWxpc3RfdCAqZW50cnk7CisJaW50IGk7CisKKwlkZXZfcHJpdi0+aGVhZCA9IGRybV9hbGxvYyggc2l6ZW9mKGRybV9yMTI4X2ZyZWVsaXN0X3QpLAorCQkJCSAgICAgRFJNX01FTV9EUklWRVIgKTsKKwlpZiAoIGRldl9wcml2LT5oZWFkID09IE5VTEwgKQorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCisJbWVtc2V0KCBkZXZfcHJpdi0+aGVhZCwgMCwgc2l6ZW9mKGRybV9yMTI4X2ZyZWVsaXN0X3QpICk7CisJZGV2X3ByaXYtPmhlYWQtPmFnZSA9IFIxMjhfQlVGRkVSX1VTRUQ7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkbWEtPmJ1Zl9jb3VudCA7IGkrKyApIHsKKwkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwkJZW50cnkgPSBkcm1fYWxsb2MoIHNpemVvZihkcm1fcjEyOF9mcmVlbGlzdF90KSwKKwkJCQkgICAgRFJNX01FTV9EUklWRVIgKTsKKwkJaWYgKCAhZW50cnkgKSByZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCisJCWVudHJ5LT5hZ2UgPSBSMTI4X0JVRkZFUl9GUkVFOworCQllbnRyeS0+YnVmID0gYnVmOworCQllbnRyeS0+cHJldiA9IGRldl9wcml2LT5oZWFkOworCQllbnRyeS0+bmV4dCA9IGRldl9wcml2LT5oZWFkLT5uZXh0OworCQlpZiAoICFlbnRyeS0+bmV4dCApCisJCQlkZXZfcHJpdi0+dGFpbCA9IGVudHJ5OworCisJCWJ1Zl9wcml2LT5kaXNjYXJkID0gMDsKKwkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCQlidWZfcHJpdi0+bGlzdF9lbnRyeSA9IGVudHJ5OworCisJCWRldl9wcml2LT5oZWFkLT5uZXh0ID0gZW50cnk7CisKKwkJaWYgKCBkZXZfcHJpdi0+aGVhZC0+bmV4dCApCisJCQlkZXZfcHJpdi0+aGVhZC0+bmV4dC0+cHJldiA9IGVudHJ5OworCX0KKworCXJldHVybiAwOworCit9CisjZW5kaWYKKworc3RhdGljIGRybV9idWZfdCAqcjEyOF9mcmVlbGlzdF9nZXQoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlpbnQgaSwgdDsKKworCS8qIEZJWE1FOiBPcHRpbWl6ZSAtLSB1c2UgZnJlZWxpc3QgY29kZSAqLworCisJZm9yICggaSA9IDAgOyBpIDwgZG1hLT5idWZfY291bnQgOyBpKysgKSB7CisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQlpZiAoIGJ1Zi0+ZmlscCA9PSAwICkKKwkJCXJldHVybiBidWY7CisJfQorCisJZm9yICggdCA9IDAgOyB0IDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IHQrKyApIHsKKwkJdTMyIGRvbmVfYWdlID0gUjEyOF9SRUFEKCBSMTI4X0xBU1RfRElTUEFUQ0hfUkVHICk7CisKKwkJZm9yICggaSA9IDAgOyBpIDwgZG1hLT5idWZfY291bnQgOyBpKysgKSB7CisJCQlidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCQlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJCQlpZiAoIGJ1Zi0+cGVuZGluZyAmJiBidWZfcHJpdi0+YWdlIDw9IGRvbmVfYWdlICkgeworCQkJCS8qIFRoZSBidWZmZXIgaGFzIGJlZW4gcHJvY2Vzc2VkLCBzbyBpdAorCQkJCSAqIGNhbiBub3cgYmUgdXNlZC4KKwkJCQkgKi8KKwkJCQlidWYtPnBlbmRpbmcgPSAwOworCQkJCXJldHVybiBidWY7CisJCQl9CisJCX0KKwkJRFJNX1VERUxBWSggMSApOworCX0KKworCURSTV9ERUJVRyggInJldHVybmluZyBOVUxMIVxuIiApOworCXJldHVybiBOVUxMOworfQorCit2b2lkIHIxMjhfZnJlZWxpc3RfcmVzZXQoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlpbnQgaTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGRtYS0+YnVmX2NvdW50IDsgaSsrICkgeworCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQlidWZfcHJpdi0+YWdlID0gMDsKKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ0NFIGNvbW1hbmQgc3VibWlzc2lvbgorICovCisKK2ludCByMTI4X3dhaXRfcmluZyggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IG4gKQoreworCWRybV9yMTI4X3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmc7CisJaW50IGk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQlyMTI4X3VwZGF0ZV9yaW5nX3NuYXBzaG90KCBkZXZfcHJpdiApOworCQlpZiAoIHJpbmctPnNwYWNlID49IG4gKQorCQkJcmV0dXJuIDA7CisJCURSTV9VREVMQVkoIDEgKTsKKwl9CisKKwkvKiBGSVhNRTogVGhpcyBpcyBiZWluZyBpZ25vcmVkLi4uICovCisJRFJNX0VSUk9SKCAiZmFpbGVkIVxuIiApOworCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKK30KKworc3RhdGljIGludCByMTI4X2NjZV9nZXRfYnVmZmVycyggRFJNRklMRSBmaWxwLCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2RtYV90ICpkICkKK3sKKwlpbnQgaTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKworCWZvciAoIGkgPSBkLT5ncmFudGVkX2NvdW50IDsgaSA8IGQtPnJlcXVlc3RfY291bnQgOyBpKysgKSB7CisJCWJ1ZiA9IHIxMjhfZnJlZWxpc3RfZ2V0KCBkZXYgKTsKKwkJaWYgKCAhYnVmICkgcmV0dXJuIERSTV9FUlIoRUFHQUlOKTsKKworCQlidWYtPmZpbHAgPSBmaWxwOworCisJCWlmICggRFJNX0NPUFlfVE9fVVNFUiggJmQtPnJlcXVlc3RfaW5kaWNlc1tpXSwgJmJ1Zi0+aWR4LAorCQkJCSAgIHNpemVvZihidWYtPmlkeCkgKSApCisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQlpZiAoIERSTV9DT1BZX1RPX1VTRVIoICZkLT5yZXF1ZXN0X3NpemVzW2ldLCAmYnVmLT50b3RhbCwKKwkJCQkgICBzaXplb2YoYnVmLT50b3RhbCkgKSApCisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJCWQtPmdyYW50ZWRfY291bnQrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByMTI4X2NjZV9idWZmZXJzKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlpbnQgcmV0ID0gMDsKKwlkcm1fZG1hX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlkcm1fZG1hX3QgZDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGQsIGFyZ3AsIHNpemVvZihkKSApOworCisJLyogUGxlYXNlIGRvbid0IHNlbmQgdXMgYnVmZmVycy4KKwkgKi8KKwlpZiAoIGQuc2VuZF9jb3VudCAhPSAwICkgeworCQlEUk1fRVJST1IoICJQcm9jZXNzICVkIHRyeWluZyB0byBzZW5kICVkIGJ1ZmZlcnMgdmlhIGRybURNQVxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBkLnNlbmRfY291bnQgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwkvKiBXZSdsbCBzZW5kIHlvdSBidWZmZXJzLgorCSAqLworCWlmICggZC5yZXF1ZXN0X2NvdW50IDwgMCB8fCBkLnJlcXVlc3RfY291bnQgPiBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJRFJNX0VSUk9SKCAiUHJvY2VzcyAlZCB0cnlpbmcgdG8gZ2V0ICVkIGJ1ZmZlcnMgKG9mICVkIG1heClcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgZC5yZXF1ZXN0X2NvdW50LCBkbWEtPmJ1Zl9jb3VudCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWQuZ3JhbnRlZF9jb3VudCA9IDA7CisKKwlpZiAoIGQucmVxdWVzdF9jb3VudCApIHsKKwkJcmV0ID0gcjEyOF9jY2VfZ2V0X2J1ZmZlcnMoIGZpbHAsIGRldiwgJmQgKTsKKwl9CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKGFyZ3AsIGQsIHNpemVvZihkKSApOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2JhMTdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oCkBAIC0wLDAgKzEsMzQ1IEBACisvKiByMTI4X2RybS5oIC0tIFB1YmxpYyBoZWFkZXIgZm9yIHRoZSByMTI4IGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IFdlZCBBcHIgIDUgMTk6MjQ6MTkgMjAwMCBieSBrZXZpbkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKiAgICBLZXZpbiBFLiBNYXJ0aW4gPG1hcnRpbkB2YWxpbnV4LmNvbT4KKyAqLworCisjaWZuZGVmIF9fUjEyOF9EUk1fSF9fCisjZGVmaW5lIF9fUjEyOF9EUk1fSF9fCisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYIHNlcnZlciBmaWxlIChyMTI4X3NhcmVhLmgpCisgKi8KKyNpZm5kZWYgX19SMTI4X1NBUkVBX0RFRklORVNfXworI2RlZmluZSBfX1IxMjhfU0FSRUFfREVGSU5FU19fCisKKy8qIFdoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCBmb3IgdGhlIGN1cnJlbnQgdmVydGV4IGJ1ZmZlcj8KKyAqLworI2RlZmluZSBSMTI4X1VQTE9BRF9DT05URVhUCQkweDAwMQorI2RlZmluZSBSMTI4X1VQTE9BRF9TRVRVUAkJMHgwMDIKKyNkZWZpbmUgUjEyOF9VUExPQURfVEVYMAkJMHgwMDQKKyNkZWZpbmUgUjEyOF9VUExPQURfVEVYMQkJMHgwMDgKKyNkZWZpbmUgUjEyOF9VUExPQURfVEVYMElNQUdFUwkJMHgwMTAKKyNkZWZpbmUgUjEyOF9VUExPQURfVEVYMUlNQUdFUwkJMHgwMjAKKyNkZWZpbmUgUjEyOF9VUExPQURfQ09SRQkJMHgwNDAKKyNkZWZpbmUgUjEyOF9VUExPQURfTUFTS1MJCTB4MDgwCisjZGVmaW5lIFIxMjhfVVBMT0FEX1dJTkRPVwkJMHgxMDAKKyNkZWZpbmUgUjEyOF9VUExPQURfQ0xJUFJFQ1RTCQkweDIwMAkvKiBoYW5kbGVkIGNsaWVudC1zaWRlICovCisjZGVmaW5lIFIxMjhfUkVRVUlSRV9RVUlFU0NFTkNFCQkweDQwMAorI2RlZmluZSBSMTI4X1VQTE9BRF9BTEwJCQkweDdmZgorCisjZGVmaW5lIFIxMjhfRlJPTlQJCQkweDEKKyNkZWZpbmUgUjEyOF9CQUNLCQkJMHgyCisjZGVmaW5lIFIxMjhfREVQVEgJCQkweDQKKworLyogUHJpbWl0aXZlIHR5cGVzCisgKi8KKyNkZWZpbmUgUjEyOF9QT0lOVFMJCQkweDEKKyNkZWZpbmUgUjEyOF9MSU5FUwkJCTB4MgorI2RlZmluZSBSMTI4X0xJTkVfU1RSSVAJCQkweDMKKyNkZWZpbmUgUjEyOF9UUklBTkdMRVMJCQkweDQKKyNkZWZpbmUgUjEyOF9UUklBTkdMRV9GQU4JCTB4NQorI2RlZmluZSBSMTI4X1RSSUFOR0xFX1NUUklQCQkweDYKKworLyogVmVydGV4L2luZGlyZWN0IGJ1ZmZlciBzaXplCisgKi8KKyNkZWZpbmUgUjEyOF9CVUZGRVJfU0laRQkJMTYzODQKKworLyogQnl0ZSBvZmZzZXRzIGZvciBpbmRpcmVjdCBidWZmZXIgZGF0YQorICovCisjZGVmaW5lIFIxMjhfSU5ERVhfUFJJTV9PRkZTRVQJCTIwCisjZGVmaW5lIFIxMjhfSE9TVERBVEFfQkxJVF9PRkZTRVQJMzIKKworLyogS2VlcCB0aGVzZSBzbWFsbCBmb3IgdGVzdGluZy4KKyAqLworI2RlZmluZSBSMTI4X05SX1NBUkVBX0NMSVBSRUNUUwkJMTIKKworLyogVGhlcmUgYXJlIDIgaGVhcHMgKGxvY2FsL0FHUCkuICBFYWNoIHJlZ2lvbiB3aXRoaW4gYSBoZWFwIGlzIGEKKyAqICBtaW5pbXVtIG9mIDY0aywgYW5kIHRoZXJlIGFyZSBhdCBtb3N0IDY0IG9mIHRoZW0gcGVyIGhlYXAuCisgKi8KKyNkZWZpbmUgUjEyOF9MT0NBTF9URVhfSEVBUAkJMAorI2RlZmluZSBSMTI4X0FHUF9URVhfSEVBUAkJMQorI2RlZmluZSBSMTI4X05SX1RFWF9IRUFQUwkJMgorI2RlZmluZSBSMTI4X05SX1RFWF9SRUdJT05TCQk2NAorI2RlZmluZSBSMTI4X0xPR19URVhfR1JBTlVMQVJJVFkJMTYKKworI2RlZmluZSBSMTI4X05SX0NPTlRFWFRfUkVHUwkJMTIKKworI2RlZmluZSBSMTI4X01BWF9URVhUVVJFX0xFVkVMUwkJMTEKKyNkZWZpbmUgUjEyOF9NQVhfVEVYVFVSRV9VTklUUwkJMgorCisjZW5kaWYgLyogX19SMTI4X1NBUkVBX0RFRklORVNfXyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJLyogQ29udGV4dCBzdGF0ZSAtIGNhbiBiZSB3cml0dGVuIGluIG9uZSBsYXJnZSBjaHVuayAqLworCXVuc2lnbmVkIGludCBkc3RfcGl0Y2hfb2Zmc2V0X2M7CisJdW5zaWduZWQgaW50IGRwX2d1aV9tYXN0ZXJfY250bF9jOworCXVuc2lnbmVkIGludCBzY190b3BfbGVmdF9jOworCXVuc2lnbmVkIGludCBzY19ib3R0b21fcmlnaHRfYzsKKwl1bnNpZ25lZCBpbnQgel9vZmZzZXRfYzsKKwl1bnNpZ25lZCBpbnQgel9waXRjaF9jOworCXVuc2lnbmVkIGludCB6X3N0ZW5fY250bF9jOworCXVuc2lnbmVkIGludCB0ZXhfY250bF9jOworCXVuc2lnbmVkIGludCBtaXNjXzNkX3N0YXRlX2NudGxfcmVnOworCXVuc2lnbmVkIGludCB0ZXh0dXJlX2Nscl9jbXBfY2xyX2M7CisJdW5zaWduZWQgaW50IHRleHR1cmVfY2xyX2NtcF9tc2tfYzsKKwl1bnNpZ25lZCBpbnQgZm9nX2NvbG9yX2M7CisKKwkvKiBUZXh0dXJlIHN0YXRlICovCisJdW5zaWduZWQgaW50IHRleF9zaXplX3BpdGNoX2M7CisJdW5zaWduZWQgaW50IGNvbnN0YW50X2NvbG9yX2M7CisKKwkvKiBTZXR1cCBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBwbTRfdmNfZnB1X3NldHVwOworCXVuc2lnbmVkIGludCBzZXR1cF9jbnRsOworCisJLyogTWFzayBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBkcF93cml0ZV9tYXNrOworCXVuc2lnbmVkIGludCBzdGVuX3JlZl9tYXNrX2M7CisJdW5zaWduZWQgaW50IHBsYW5lXzNkX21hc2tfYzsKKworCS8qIFdpbmRvdyBzdGF0ZSAqLworCXVuc2lnbmVkIGludCB3aW5kb3dfeHlfb2Zmc2V0OworCisJLyogQ29yZSBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBzY2FsZV8zZF9jbnRsOworfSBkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdDsKKworLyogU2V0dXAgcmVnaXN0ZXJzIGZvciBlYWNoIHRleHR1cmUgdW5pdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHRleF9jbnRsOworCXVuc2lnbmVkIGludCB0ZXhfY29tYmluZV9jbnRsOworCXVuc2lnbmVkIGludCB0ZXhfc2l6ZV9waXRjaDsKKwl1bnNpZ25lZCBpbnQgdGV4X29mZnNldFtSMTI4X01BWF9URVhUVVJFX0xFVkVMU107CisJdW5zaWduZWQgaW50IHRleF9ib3JkZXJfY29sb3I7Cit9IGRybV9yMTI4X3RleHR1cmVfcmVnc190OworCisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X3NhcmVhIHsKKwkvKiBUaGUgY2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiBvZiBzdGF0ZSBpbmZvcm1hdGlvbiB0byB0aGUga2VybmVsCisJICogb24gZmlyaW5nIGEgdmVydGV4IGJ1ZmZlci4KKwkgKi8KKwlkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdCBjb250ZXh0X3N0YXRlOworCWRybV9yMTI4X3RleHR1cmVfcmVnc190IHRleF9zdGF0ZVtSMTI4X01BWF9URVhUVVJFX1VOSVRTXTsKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisJdW5zaWduZWQgaW50IHZlcnRzaXplOworCXVuc2lnbmVkIGludCB2Y19mb3JtYXQ7CisKKwkvKiBUaGUgY3VycmVudCBjbGlwcmVjdHMsIG9yIGEgc3Vic2V0IHRoZXJlb2YuCisJICovCisJZHJtX2NsaXBfcmVjdF90IGJveGVzW1IxMjhfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwl1bnNpZ25lZCBpbnQgbmJveDsKKworCS8qIENvdW50ZXJzIGZvciBjbGllbnQtc2lkZSB0aHJvdHRsaW5nIG9mIHJlbmRlcmluZyBjbGllbnRzLgorCSAqLworCXVuc2lnbmVkIGludCBsYXN0X2ZyYW1lOworCXVuc2lnbmVkIGludCBsYXN0X2Rpc3BhdGNoOworCisJZHJtX3RleF9yZWdpb25fdCB0ZXhfbGlzdFtSMTI4X05SX1RFWF9IRUFQU11bUjEyOF9OUl9URVhfUkVHSU9OUysxXTsKKwl1bnNpZ25lZCBpbnQgdGV4X2FnZVtSMTI4X05SX1RFWF9IRUFQU107CisJaW50IGN0eF9vd25lcjsKKwlpbnQgcGZBbGxvd1BhZ2VGbGlwOyAgICAgICAgLyogbnVtYmVyIG9mIDNkIHdpbmRvd3MgKDAsMSwyIG9yIG1vcmUpICovCisJaW50IHBmQ3VycmVudFBhZ2U7CSAgICAvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkPyAqLworfSBkcm1fcjEyOF9zYXJlYV90OworCisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYc2VydmVyIGZpbGUgKHhmODZkcm1SMTI4LmgpCisgKi8KKworLyogUmFnZSAxMjggc3BlY2lmaWMgaW9jdGxzCisgKiBUaGUgZGV2aWNlIHNwZWNpZmljIGlvY3RsIHJhbmdlIGlzIDB4NDAgdG8gMHg3OS4KKyAqLworI2RlZmluZSBEUk1fUjEyOF9JTklUICAgICAgIDB4MDAKKyNkZWZpbmUgRFJNX1IxMjhfQ0NFX1NUQVJUICAweDAxCisjZGVmaW5lIERSTV9SMTI4X0NDRV9TVE9QICAgMHgwMgorI2RlZmluZSBEUk1fUjEyOF9DQ0VfUkVTRVQgIDB4MDMKKyNkZWZpbmUgRFJNX1IxMjhfQ0NFX0lETEUgICAweDA0CisvKiAweDA1IG5vdCB1c2VkICovCisjZGVmaW5lIERSTV9SMTI4X1JFU0VUICAgICAgMHgwNgorI2RlZmluZSBEUk1fUjEyOF9TV0FQICAgICAgIDB4MDcKKyNkZWZpbmUgRFJNX1IxMjhfQ0xFQVIgICAgICAweDA4CisjZGVmaW5lIERSTV9SMTI4X1ZFUlRFWCAgICAgMHgwOQorI2RlZmluZSBEUk1fUjEyOF9JTkRJQ0VTICAgIDB4MGEKKyNkZWZpbmUgRFJNX1IxMjhfQkxJVCAgICAgICAweDBiCisjZGVmaW5lIERSTV9SMTI4X0RFUFRIICAgICAgMHgwYworI2RlZmluZSBEUk1fUjEyOF9TVElQUExFICAgIDB4MGQKKy8qIDB4MGUgbm90IHVzZWQgKi8KKyNkZWZpbmUgRFJNX1IxMjhfSU5ESVJFQ1QgICAweDBmCisjZGVmaW5lIERSTV9SMTI4X0ZVTExTQ1JFRU4gMHgxMAorI2RlZmluZSBEUk1fUjEyOF9DTEVBUjIgICAgIDB4MTEKKyNkZWZpbmUgRFJNX1IxMjhfR0VUUEFSQU0gICAweDEyCisjZGVmaW5lIERSTV9SMTI4X0ZMSVAgICAgICAgMHgxMworCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0lOSVQgICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0lOSVQsIGRybV9yMTI4X2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQ0NFX1NUQVJUICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQ0NFX1NUQVJUKQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9DQ0VfU1RPUCAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9DQ0VfU1RPUCwgZHJtX3IxMjhfY2NlX3N0b3BfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQ0NFX1JFU0VUICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQ0NFX1JFU0VUKQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9DQ0VfSURMRSAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9DQ0VfSURMRSkKKy8qIDB4MDUgbm90IHVzZWQgKi8KKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfUkVTRVQgICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfUkVTRVQpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X1NXQVAgICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X1NXQVApCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0NMRUFSICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0NMRUFSLCBkcm1fcjEyOF9jbGVhcl90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9WRVJURVggICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9WRVJURVgsIGRybV9yMTI4X3ZlcnRleF90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9JTkRJQ0VTICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9JTkRJQ0VTLCBkcm1fcjEyOF9pbmRpY2VzX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0JMSVQgICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0JMSVQsIGRybV9yMTI4X2JsaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfREVQVEggICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfREVQVEgsIGRybV9yMTI4X2RlcHRoX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X1NUSVBQTEUgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X1NUSVBQTEUsIGRybV9yMTI4X3N0aXBwbGVfdCkKKy8qIDB4MGUgbm90IHVzZWQgKi8KKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfSU5ESVJFQ1QgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfSU5ESVJFQ1QsIGRybV9yMTI4X2luZGlyZWN0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0ZVTExTQ1JFRU4gRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0ZVTExTQ1JFRU4sIGRybV9yMTI4X2Z1bGxzY3JlZW5fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQ0xFQVIyICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQ0xFQVIyLCBkcm1fcjEyOF9jbGVhcjJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfR0VUUEFSQU0gICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfR0VUUEFSQU0sIGRybV9yMTI4X2dldHBhcmFtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0ZMSVAgICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0ZMSVApCisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2luaXQgeworCWVudW0geworCQlSMTI4X0lOSVRfQ0NFICAgID0gMHgwMSwKKwkJUjEyOF9DTEVBTlVQX0NDRSA9IDB4MDIKKwl9IGZ1bmM7CisjaWYgQ09ORklHX1hGUkVFODZfVkVSU0lPTiA8IFhGUkVFODZfVkVSU0lPTig0LDEsMCwwKQorCWludCBzYXJlYV9wcml2X29mZnNldDsKKyNlbHNlCisJdW5zaWduZWQgbG9uZyBzYXJlYV9wcml2X29mZnNldDsKKyNlbmRpZgorCWludCBpc19wY2k7CisJaW50IGNjZV9tb2RlOworCWludCBjY2Vfc2VjdXJlOworCWludCByaW5nX3NpemU7CisJaW50IHVzZWNfdGltZW91dDsKKworCXVuc2lnbmVkIGludCBmYl9icHA7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldCwgZnJvbnRfcGl0Y2g7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0LCBiYWNrX3BpdGNoOworCXVuc2lnbmVkIGludCBkZXB0aF9icHA7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldCwgZGVwdGhfcGl0Y2g7CisJdW5zaWduZWQgaW50IHNwYW5fb2Zmc2V0OworCisjaWYgQ09ORklHX1hGUkVFODZfVkVSU0lPTiA8IFhGUkVFODZfVkVSU0lPTig0LDEsMCwwKQorCXVuc2lnbmVkIGludCBmYl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGludCByaW5nX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmluZ19ycHRyX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyc19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGFncF90ZXh0dXJlc19vZmZzZXQ7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgZmJfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyByaW5nX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJpbmdfcnB0cl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGFncF90ZXh0dXJlc19vZmZzZXQ7CisjZW5kaWYKK30gZHJtX3IxMjhfaW5pdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9jY2Vfc3RvcCB7CisJaW50IGZsdXNoOworCWludCBpZGxlOworfSBkcm1fcjEyOF9jY2Vfc3RvcF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9jbGVhciB7CisJdW5zaWduZWQgaW50IGZsYWdzOworI2lmIENPTkZJR19YRlJFRTg2X1ZFUlNJT04gPCBYRlJFRTg2X1ZFUlNJT04oNCwxLDAsMCkKKwlpbnQgeCwgeSwgdywgaDsKKyNlbmRpZgorCXVuc2lnbmVkIGludCBjbGVhcl9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfZGVwdGg7CisjaWYgQ09ORklHX1hGUkVFODZfVkVSU0lPTiA+PSBYRlJFRTg2X1ZFUlNJT04oNCwxLDAsMCkKKwl1bnNpZ25lZCBpbnQgY29sb3JfbWFzazsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfbWFzazsKKyNlbmRpZgorfSBkcm1fcjEyOF9jbGVhcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF92ZXJ0ZXggeworCWludCBwcmltOworCWludCBpZHg7CQkJLyogSW5kZXggb2YgdmVydGV4IGJ1ZmZlciAqLworCWludCBjb3VudDsJCQkvKiBOdW1iZXIgb2YgdmVydGljZXMgaW4gYnVmZmVyICovCisJaW50IGRpc2NhcmQ7CQkJLyogQ2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAqLworfSBkcm1fcjEyOF92ZXJ0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfaW5kaWNlcyB7CisJaW50IHByaW07CisJaW50IGlkeDsKKwlpbnQgc3RhcnQ7CisJaW50IGVuZDsKKwlpbnQgZGlzY2FyZDsJCQkvKiBDbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICovCit9IGRybV9yMTI4X2luZGljZXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfYmxpdCB7CisJaW50IGlkeDsKKwlpbnQgcGl0Y2g7CisJaW50IG9mZnNldDsKKwlpbnQgZm9ybWF0OworCXVuc2lnbmVkIHNob3J0IHgsIHk7CisJdW5zaWduZWQgc2hvcnQgd2lkdGgsIGhlaWdodDsKK30gZHJtX3IxMjhfYmxpdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9kZXB0aCB7CisJZW51bSB7CisJCVIxMjhfV1JJVEVfU1BBTgkJPSAweDAxLAorCQlSMTI4X1dSSVRFX1BJWEVMUwk9IDB4MDIsCisJCVIxMjhfUkVBRF9TUEFOCQk9IDB4MDMsCisJCVIxMjhfUkVBRF9QSVhFTFMJPSAweDA0CisJfSBmdW5jOworCWludCBuOworCWludCBfX3VzZXIgKng7CisJaW50IF9fdXNlciAqeTsKKwl1bnNpZ25lZCBpbnQgX191c2VyICpidWZmZXI7CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKm1hc2s7Cit9IGRybV9yMTI4X2RlcHRoX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X3N0aXBwbGUgeworCXVuc2lnbmVkIGludCBfX3VzZXIgKm1hc2s7Cit9IGRybV9yMTI4X3N0aXBwbGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfaW5kaXJlY3QgeworCWludCBpZHg7CisJaW50IHN0YXJ0OworCWludCBlbmQ7CisJaW50IGRpc2NhcmQ7Cit9IGRybV9yMTI4X2luZGlyZWN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2Z1bGxzY3JlZW4geworCWVudW0geworCQlSMTI4X0lOSVRfRlVMTFNDUkVFTiAgICA9IDB4MDEsCisJCVIxMjhfQ0xFQU5VUF9GVUxMU0NSRUVOID0gMHgwMgorCX0gZnVuYzsKK30gZHJtX3IxMjhfZnVsbHNjcmVlbl90OworCisvKiAyLjM6IEFuIGlvY3RsIHRvIGdldCBwYXJhbWV0ZXJzIHRoYXQgYXJlbid0IGF2YWlsYWJsZSB0byB0aGUgM2QKKyAqIGNsaWVudCBhbnkgb3RoZXIgd2F5LiAgCisgKi8KKyNkZWZpbmUgUjEyOF9QQVJBTV9JUlFfTlIgICAgICAgICAgICAxCisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2dldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJdm9pZCBfX3VzZXIgKnZhbHVlOworfSBkcm1fcjEyOF9nZXRwYXJhbV90OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQ2MzgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5jCkBAIC0wLDAgKzEsMTIyIEBACisvKiByMTI4X2Rydi5jIC0tIEFUSSBSYWdlIDEyOCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gRGVjIDEzIDA5OjQ3OjI3IDE5OTkgYnkgZmFpdGhAcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgInIxMjhfZHJtLmgiCisjaW5jbHVkZSAicjEyOF9kcnYuaCIKKworI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKKworc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCit7CisJRFJNX0lORk8oICJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCisJCURSSVZFUl9OQU1FLAorCQlEUklWRVJfTUFKT1IsCisJCURSSVZFUl9NSU5PUiwKKwkJRFJJVkVSX1BBVENITEVWRUwsCisJCURSSVZFUl9EQVRFLAorCQlkZXYtPnByaW1hcnkubWlub3IsCisJCXBjaV9wcmV0dHlfbmFtZShkZXYtPnBkZXYpCisJCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyc2lvbiggZHJtX3ZlcnNpb25fdCAqdmVyc2lvbiApCit7CisJaW50IGxlbjsKKworCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKKwlEUk1fQ09QWSggdmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0geworCXIxMjhfUENJX0lEUworfTsKKworZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3QgcjEyOF9pb2N0bHNbXTsKK2V4dGVybiBpbnQgcjEyOF9tYXhfaW9jdGw7CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwgRFJJVkVSX1BDSV9ETUEgfCBEUklWRVJfU0cgfCBEUklWRVJfSEFWRV9ETUEgfCBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfSVJRX1NIQVJFRCB8IERSSVZFUl9JUlFfVkJMLAorCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9yMTI4X2J1Zl9wcml2X3QpLAorCS5wcmVyZWxlYXNlID0gcjEyOF9kcml2ZXJfcHJlcmVsZWFzZSwKKwkucHJldGFrZWRvd24gPSByMTI4X2RyaXZlcl9wcmV0YWtlZG93biwKKwkudmJsYW5rX3dhaXQgPSByMTI4X2RyaXZlcl92Ymxhbmtfd2FpdCwKKwkuaXJxX3ByZWluc3RhbGwgPSByMTI4X2RyaXZlcl9pcnFfcHJlaW5zdGFsbCwKKwkuaXJxX3Bvc3RpbnN0YWxsID0gcjEyOF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsLAorCS5pcnFfdW5pbnN0YWxsID0gcjEyOF9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKKwkuaXJxX2hhbmRsZXIgPSByMTI4X2RyaXZlcl9pcnFfaGFuZGxlciwKKwkucmVjbGFpbV9idWZmZXJzID0gZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzLAorCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAorCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAorCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAorCS52ZXJzaW9uID0gdmVyc2lvbiwKKwkuaW9jdGxzID0gcjEyOF9pb2N0bHMsCisJLmRtYV9pb2N0bCA9IHIxMjhfY2NlX2J1ZmZlcnMsCisJLmZvcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub3BlbiA9IGRybV9vcGVuLAorCQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCQkuaW9jdGwgPSBkcm1faW9jdGwsCisJCS5tbWFwID0gZHJtX21tYXAsCisJCS5wb2xsID0gZHJtX3BvbGwsCisJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorCX0sCisJLnBjaV9kcml2ZXIgPSB7CisJCS5uYW1lICAgICAgICAgID0gRFJJVkVSX05BTUUsCisJCS5pZF90YWJsZSAgICAgID0gcGNpaWRsaXN0LAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHIxMjhfaW5pdCh2b2lkKQoreworCWRyaXZlci5udW1faW9jdGxzID0gcjEyOF9tYXhfaW9jdGw7CisJcmV0dXJuIGRybV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcjEyOF9leGl0KHZvaWQpCit7CisJZHJtX2V4aXQoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHIxMjhfaW5pdCk7Cittb2R1bGVfZXhpdChyMTI4X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7CitNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMWFhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmgKQEAgLTAsMCArMSw1MjEgQEAKKy8qIHIxMjhfZHJ2LmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIHIxMjggZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwOTo1MToxMSAxOTk5IGJ5IGZhaXRoQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgS2V2aW4gRS4gTWFydGluIDxtYXJ0aW5AdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKiAgICBNaWNoZWwgRO+/vXplciA8ZGFlbnplcm1Ac3R1ZGVudC5ldGh6LmNoPgorICovCisKKyNpZm5kZWYgX19SMTI4X0RSVl9IX18KKyNkZWZpbmUgX19SMTI4X0RSVl9IX18KKworLyogR2VuZXJhbCBjdXN0b21pemF0aW9uOgorICovCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJHYXJldGggSHVnaGVzLCBWQSBMaW51eCBTeXN0ZW1zIEluYy4iCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJyMTI4IgorI2RlZmluZSBEUklWRVJfREVTQwkJIkFUSSBSYWdlIDEyOCIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDAzMDcyNSIKKworLyogSW50ZXJmYWNlIGhpc3Rvcnk6CisgKgorICogPz8gIC0gPz8KKyAqIDIuNCAtIEFkZCBzdXBwb3J0IGZvciB5Y2JjciB0ZXh0dXJlcyAobm8gbmV3IGlvY3RscykKKyAqIDIuNSAtIEFkZCBGTElQIGlvY3RsLCBkaXNhYmxlIEZVTExTQ1JFRU4uCisgKi8KKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkyCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJNQorI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkwCisKKworI2RlZmluZSBHRVRfUklOR19IRUFEKGRldl9wcml2KQkJUjEyOF9SRUFEKCBSMTI4X1BNNF9CVUZGRVJfRExfUlBUUiApCisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2ZyZWVsaXN0IHsKKyAgIAl1bnNpZ25lZCBpbnQgYWdlOworICAgCWRybV9idWZfdCAqYnVmOworICAgCXN0cnVjdCBkcm1fcjEyOF9mcmVlbGlzdCAqbmV4dDsKKyAgIAlzdHJ1Y3QgZHJtX3IxMjhfZnJlZWxpc3QgKnByZXY7Cit9IGRybV9yMTI4X2ZyZWVsaXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X3JpbmdfYnVmZmVyIHsKKwl1MzIgKnN0YXJ0OworCXUzMiAqZW5kOworCWludCBzaXplOworCWludCBzaXplX2wycXc7CisKKwl1MzIgdGFpbDsKKwl1MzIgdGFpbF9tYXNrOworCWludCBzcGFjZTsKKworCWludCBoaWdoX21hcms7Cit9IGRybV9yMTI4X3JpbmdfYnVmZmVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X3ByaXZhdGUgeworCWRybV9yMTI4X3JpbmdfYnVmZmVyX3QgcmluZzsKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2OworCisJaW50IGNjZV9tb2RlOworCWludCBjY2VfZmlmb19zaXplOworCWludCBjY2VfcnVubmluZzsKKworICAgCWRybV9yMTI4X2ZyZWVsaXN0X3QgKmhlYWQ7CisgICAJZHJtX3IxMjhfZnJlZWxpc3RfdCAqdGFpbDsKKworCWludCB1c2VjX3RpbWVvdXQ7CisJaW50IGlzX3BjaTsKKwl1bnNpZ25lZCBsb25nIHBoeXNfcGNpX2dhcnQ7CisJZG1hX2FkZHJfdCBidXNfcGNpX2dhcnQ7CisJdW5zaWduZWQgbG9uZyBjY2VfYnVmZmVyc19vZmZzZXQ7CisKKwlhdG9taWNfdCBpZGxlX2NvdW50OworCisJaW50IHBhZ2VfZmxpcHBpbmc7CisJaW50IGN1cnJlbnRfcGFnZTsKKwl1MzIgY3J0Y19vZmZzZXQ7CisJdTMyIGNydGNfb2Zmc2V0X2NudGw7CisKKwl1MzIgY29sb3JfZm10OworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19waXRjaDsKKworCXUzMiBkZXB0aF9mbXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfcGl0Y2g7CisJdW5zaWduZWQgaW50IHNwYW5fb2Zmc2V0OworCisJdTMyIGZyb250X3BpdGNoX29mZnNldF9jOworCXUzMiBiYWNrX3BpdGNoX29mZnNldF9jOworCXUzMiBkZXB0aF9waXRjaF9vZmZzZXRfYzsKKwl1MzIgc3Bhbl9waXRjaF9vZmZzZXRfYzsKKworCWRybV9sb2NhbF9tYXBfdCAqc2FyZWE7CisJZHJtX2xvY2FsX21hcF90ICptbWlvOworCWRybV9sb2NhbF9tYXBfdCAqY2NlX3Jpbmc7CisJZHJtX2xvY2FsX21hcF90ICpyaW5nX3JwdHI7CisJZHJtX2xvY2FsX21hcF90ICphZ3BfdGV4dHVyZXM7Cit9IGRybV9yMTI4X3ByaXZhdGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfYnVmX3ByaXYgeworCXUzMiBhZ2U7CisJaW50IHByaW07CisJaW50IGRpc2NhcmQ7CisJaW50IGRpc3BhdGNoZWQ7CisgICAJZHJtX3IxMjhfZnJlZWxpc3RfdCAqbGlzdF9lbnRyeTsKK30gZHJtX3IxMjhfYnVmX3ByaXZfdDsKKworCQkJCS8qIHIxMjhfY2NlLmMgKi8KK2V4dGVybiBpbnQgcjEyOF9jY2VfaW5pdCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcjEyOF9jY2Vfc3RhcnQoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHIxMjhfY2NlX3N0b3AoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHIxMjhfY2NlX3Jlc2V0KCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByMTI4X2NjZV9pZGxlKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByMTI4X2VuZ2luZV9yZXNldCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcjEyOF9mdWxsc2NyZWVuKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByMTI4X2NjZV9idWZmZXJzKCBEUk1fSU9DVExfQVJHUyApOworCitleHRlcm4gdm9pZCByMTI4X2ZyZWVsaXN0X3Jlc2V0KCBkcm1fZGV2aWNlX3QgKmRldiApOworCitleHRlcm4gaW50IHIxMjhfd2FpdF9yaW5nKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgbiApOworCitleHRlcm4gaW50IHIxMjhfZG9fY2NlX2lkbGUoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKTsKK2V4dGVybiBpbnQgcjEyOF9kb19jbGVhbnVwX2NjZSggZHJtX2RldmljZV90ICpkZXYgKTsKKworZXh0ZXJuIGludCByMTI4X2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CisKK2V4dGVybiBpcnFyZXR1cm5fdCByMTI4X2RyaXZlcl9pcnFfaGFuZGxlciggRFJNX0lSUV9BUkdTICk7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApOworCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucywgcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyBhbmQgZHJtQWRkTWFwIGNvbnN0YW50cworICogZm9yIFJhZ2UgMTI4IGtlcm5lbCBkcml2ZXIuCisgKi8KKworI2RlZmluZSBSMTI4X0FVWF9TQ19DTlRMCQkweDE2NjAKKyMJZGVmaW5lIFIxMjhfQVVYMV9TQ19FTgkJCSgxIDw8IDApCisjCWRlZmluZSBSMTI4X0FVWDFfU0NfTU9ERV9PUgkJKDAgPDwgMSkKKyMJZGVmaW5lIFIxMjhfQVVYMV9TQ19NT0RFX05BTkQJCSgxIDw8IDEpCisjCWRlZmluZSBSMTI4X0FVWDJfU0NfRU4JCQkoMSA8PCAyKQorIwlkZWZpbmUgUjEyOF9BVVgyX1NDX01PREVfT1IJCSgwIDw8IDMpCisjCWRlZmluZSBSMTI4X0FVWDJfU0NfTU9ERV9OQU5ECQkoMSA8PCAzKQorIwlkZWZpbmUgUjEyOF9BVVgzX1NDX0VOCQkJKDEgPDwgNCkKKyMJZGVmaW5lIFIxMjhfQVVYM19TQ19NT0RFX09SCQkoMCA8PCA1KQorIwlkZWZpbmUgUjEyOF9BVVgzX1NDX01PREVfTkFORAkJKDEgPDwgNSkKKyNkZWZpbmUgUjEyOF9BVVgxX1NDX0xFRlQJCTB4MTY2NAorI2RlZmluZSBSMTI4X0FVWDFfU0NfUklHSFQJCTB4MTY2OAorI2RlZmluZSBSMTI4X0FVWDFfU0NfVE9QCQkweDE2NmMKKyNkZWZpbmUgUjEyOF9BVVgxX1NDX0JPVFRPTQkJMHgxNjcwCisjZGVmaW5lIFIxMjhfQVVYMl9TQ19MRUZUCQkweDE2NzQKKyNkZWZpbmUgUjEyOF9BVVgyX1NDX1JJR0hUCQkweDE2NzgKKyNkZWZpbmUgUjEyOF9BVVgyX1NDX1RPUAkJMHgxNjdjCisjZGVmaW5lIFIxMjhfQVVYMl9TQ19CT1RUT00JCTB4MTY4MAorI2RlZmluZSBSMTI4X0FVWDNfU0NfTEVGVAkJMHgxNjg0CisjZGVmaW5lIFIxMjhfQVVYM19TQ19SSUdIVAkJMHgxNjg4CisjZGVmaW5lIFIxMjhfQVVYM19TQ19UT1AJCTB4MTY4YworI2RlZmluZSBSMTI4X0FVWDNfU0NfQk9UVE9NCQkweDE2OTAKKworI2RlZmluZSBSMTI4X0JSVVNIX0RBVEEwCQkweDE0ODAKKyNkZWZpbmUgUjEyOF9CVVNfQ05UTAkJCTB4MDAzMAorIwlkZWZpbmUgUjEyOF9CVVNfTUFTVEVSX0RJUwkJKDEgPDwgNikKKworI2RlZmluZSBSMTI4X0NMT0NLX0NOVExfSU5ERVgJCTB4MDAwOAorI2RlZmluZSBSMTI4X0NMT0NLX0NOVExfREFUQQkJMHgwMDBjCisjCWRlZmluZSBSMTI4X1BMTF9XUl9FTgkJCSgxIDw8IDcpCisjZGVmaW5lIFIxMjhfQ09OU1RBTlRfQ09MT1JfQwkJMHgxZDM0CisjZGVmaW5lIFIxMjhfQ1JUQ19PRkZTRVQJCTB4MDIyNAorI2RlZmluZSBSMTI4X0NSVENfT0ZGU0VUX0NOVEwJCTB4MDIyOAorIwlkZWZpbmUgUjEyOF9DUlRDX09GRlNFVF9GTElQX0NOVEwJKDEgPDwgMTYpCisKKyNkZWZpbmUgUjEyOF9EUF9HVUlfTUFTVEVSX0NOVEwJCTB4MTQ2YworIyAgICAgICBkZWZpbmUgUjEyOF9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMCSgxICAgIDw8ICAwKQorIyAgICAgICBkZWZpbmUgUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMCSgxICAgIDw8ICAxKQorIwlkZWZpbmUgUjEyOF9HTUNfQlJVU0hfU09MSURfQ09MT1IJKDEzICAgPDwgIDQpCisjCWRlZmluZSBSMTI4X0dNQ19CUlVTSF9OT05FCQkoMTUgICA8PCAgNCkKKyMJZGVmaW5lIFIxMjhfR01DX0RTVF8xNkJQUAkJKDQgICAgPDwgIDgpCisjCWRlZmluZSBSMTI4X0dNQ19EU1RfMjRCUFAJCSg1ICAgIDw8ICA4KQorIwlkZWZpbmUgUjEyOF9HTUNfRFNUXzMyQlBQCQkoNiAgICA8PCAgOCkKKyMgICAgICAgZGVmaW5lIFIxMjhfR01DX0RTVF9EQVRBVFlQRV9TSElGVAk4CisjCWRlZmluZSBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IJKDMgICAgPDwgMTIpCisjCWRlZmluZSBSMTI4X0RQX1NSQ19TT1VSQ0VfTUVNT1JZCSgyICAgIDw8IDI0KQorIwlkZWZpbmUgUjEyOF9EUF9TUkNfU09VUkNFX0hPU1RfREFUQQkoMyAgICA8PCAyNCkKKyMJZGVmaW5lIFIxMjhfR01DX0NMUl9DTVBfQ05UTF9ESVMJKDEgICAgPDwgMjgpCisjCWRlZmluZSBSMTI4X0dNQ19BVVhfQ0xJUF9ESVMJCSgxICAgIDw8IDI5KQorIwlkZWZpbmUgUjEyOF9HTUNfV1JfTVNLX0RJUwkJKDEgICAgPDwgMzApCisjCWRlZmluZSBSMTI4X1JPUDNfUwkJCTB4MDBjYzAwMDAKKyMJZGVmaW5lIFIxMjhfUk9QM19QCQkJMHgwMGYwMDAwMAorI2RlZmluZSBSMTI4X0RQX1dSSVRFX01BU0sJCTB4MTZjYworI2RlZmluZSBSMTI4X0RTVF9QSVRDSF9PRkZTRVRfQwkJMHgxYzgwCisjCWRlZmluZSBSMTI4X0RTVF9USUxFCQkJKDEgPDwgMzEpCisKKyNkZWZpbmUgUjEyOF9HRU5fSU5UX0NOVEwJCTB4MDA0MAorIwlkZWZpbmUgUjEyOF9DUlRDX1ZCTEFOS19JTlRfRU4JCSgxIDw8ICAwKQorI2RlZmluZSBSMTI4X0dFTl9JTlRfU1RBVFVTCQkweDAwNDQKKyMJZGVmaW5lIFIxMjhfQ1JUQ19WQkxBTktfSU5UCQkoMSA8PCAgMCkKKyMJZGVmaW5lIFIxMjhfQ1JUQ19WQkxBTktfSU5UX0FLCQkoMSA8PCAgMCkKKyNkZWZpbmUgUjEyOF9HRU5fUkVTRVRfQ05UTAkJMHgwMGYwCisjCWRlZmluZSBSMTI4X1NPRlRfUkVTRVRfR1VJCQkoMSA8PCAgMCkKKworI2RlZmluZSBSMTI4X0dVSV9TQ1JBVENIX1JFRzAJCTB4MTVlMAorI2RlZmluZSBSMTI4X0dVSV9TQ1JBVENIX1JFRzEJCTB4MTVlNAorI2RlZmluZSBSMTI4X0dVSV9TQ1JBVENIX1JFRzIJCTB4MTVlOAorI2RlZmluZSBSMTI4X0dVSV9TQ1JBVENIX1JFRzMJCTB4MTVlYworI2RlZmluZSBSMTI4X0dVSV9TQ1JBVENIX1JFRzQJCTB4MTVmMAorI2RlZmluZSBSMTI4X0dVSV9TQ1JBVENIX1JFRzUJCTB4MTVmNAorCisjZGVmaW5lIFIxMjhfR1VJX1NUQVQJCQkweDE3NDAKKyMJZGVmaW5lIFIxMjhfR1VJX0ZJRk9DTlRfTUFTSwkJMHgwZmZmCisjCWRlZmluZSBSMTI4X0dVSV9BQ1RJVkUJCQkoMSA8PCAzMSkKKworI2RlZmluZSBSMTI4X01DTEtfQ05UTAkJCTB4MDAwZgorIwlkZWZpbmUgUjEyOF9GT1JDRV9HQ1AJCQkoMSA8PCAxNikKKyMJZGVmaW5lIFIxMjhfRk9SQ0VfUElQRTNEX0NQCQkoMSA8PCAxNykKKyMJZGVmaW5lIFIxMjhfRk9SQ0VfUkNQCQkJKDEgPDwgMTgpCisKKyNkZWZpbmUgUjEyOF9QQ19HVUlfQ1RMU1RBVAkJMHgxNzQ4CisjZGVmaW5lIFIxMjhfUENfTkdVSV9DVExTVEFUCQkweDAxODQKKyMJZGVmaW5lIFIxMjhfUENfRkxVU0hfR1VJCQkoMyA8PCAwKQorIwlkZWZpbmUgUjEyOF9QQ19SSV9HVUkJCQkoMSA8PCAyKQorIwlkZWZpbmUgUjEyOF9QQ19GTFVTSF9BTEwJCTB4MDBmZgorIwlkZWZpbmUgUjEyOF9QQ19CVVNZCQkJKDEgPDwgMzEpCisKKyNkZWZpbmUgUjEyOF9QQ0lfR0FSVF9QQUdFCQkweDAxN2MKKyNkZWZpbmUgUjEyOF9QUklNX1RFWF9DTlRMX0MJCTB4MWNiMAorCisjZGVmaW5lIFIxMjhfU0NBTEVfM0RfQ05UTAkJMHgxYTAwCisjZGVmaW5lIFIxMjhfU0VDX1RFWF9DTlRMX0MJCTB4MWQwMAorI2RlZmluZSBSMTI4X1NFQ19URVhUVVJFX0JPUkRFUl9DT0xPUl9DCTB4MWQzYworI2RlZmluZSBSMTI4X1NFVFVQX0NOVEwJCQkweDFiYzQKKyNkZWZpbmUgUjEyOF9TVEVOX1JFRl9NQVNLX0MJCTB4MWQ0MAorCisjZGVmaW5lIFIxMjhfVEVYX0NOVExfQwkJCTB4MWM5YworIwlkZWZpbmUgUjEyOF9URVhfQ0FDSEVfRkxVU0gJCSgxIDw8IDIzKQorCisjZGVmaW5lIFIxMjhfV0FJVF9VTlRJTAkJCTB4MTcyMAorIwlkZWZpbmUgUjEyOF9FVkVOVF9DUlRDX09GRlNFVAkJKDEgPDwgMCkKKyNkZWZpbmUgUjEyOF9XSU5ET1dfWFlfT0ZGU0VUCQkweDFiY2MKKworCisvKiBDQ0UgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgUjEyOF9QTTRfQlVGRkVSX09GRlNFVAkJMHgwNzAwCisjZGVmaW5lIFIxMjhfUE00X0JVRkZFUl9DTlRMCQkweDA3MDQKKyMJZGVmaW5lIFIxMjhfUE00X01BU0sJCQkoMTUgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF9OT05QTTQJCQkoMCAgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF8xOTJQSU8JCQkoMSAgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF8xOTJCTQkJCSgyICA8PCAyOCkKKyMJZGVmaW5lIFIxMjhfUE00XzEyOFBJT182NElOREJNCQkoMyAgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF8xMjhCTV82NElOREJNCQkoNCAgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF82NFBJT18xMjhJTkRCTQkJKDUgIDw8IDI4KQorIwlkZWZpbmUgUjEyOF9QTTRfNjRCTV8xMjhJTkRCTQkJKDYgIDw8IDI4KQorIwlkZWZpbmUgUjEyOF9QTTRfNjRQSU9fNjRWQ0JNXzY0SU5EQk0JKDcgIDw8IDI4KQorIwlkZWZpbmUgUjEyOF9QTTRfNjRCTV82NFZDQk1fNjRJTkRCTQkoOCAgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF82NFBJT182NFZDUElPXzY0SU5EUElPCSgxNSA8PCAyOCkKKyMJZGVmaW5lIFIxMjhfUE00X0JVRkZFUl9DTlRMX05PVVBEQVRFCSgxICA8PCAyNykKKworI2RlZmluZSBSMTI4X1BNNF9CVUZGRVJfV01fQ05UTAkJMHgwNzA4CisjCWRlZmluZSBSMTI4X1dNQV9TSElGVAkJCTAKKyMJZGVmaW5lIFIxMjhfV01CX1NISUZUCQkJOAorIwlkZWZpbmUgUjEyOF9XTUNfU0hJRlQJCQkxNgorIwlkZWZpbmUgUjEyOF9XQl9XTV9TSElGVAkJCTI0CisKKyNkZWZpbmUgUjEyOF9QTTRfQlVGRkVSX0RMX1JQVFJfQUREUgkweDA3MGMKKyNkZWZpbmUgUjEyOF9QTTRfQlVGRkVSX0RMX1JQVFIJCTB4MDcxMAorI2RlZmluZSBSMTI4X1BNNF9CVUZGRVJfRExfV1BUUgkJMHgwNzE0CisjCWRlZmluZSBSMTI4X1BNNF9CVUZGRVJfRExfRE9ORQkJKDEgPDwgMzEpCisKKyNkZWZpbmUgUjEyOF9QTTRfVkNfRlBVX1NFVFVQCQkweDA3MWMKKworI2RlZmluZSBSMTI4X1BNNF9JV19JTkRPRkYJCTB4MDczOAorI2RlZmluZSBSMTI4X1BNNF9JV19JTkRTSVpFCQkweDA3M2MKKworI2RlZmluZSBSMTI4X1BNNF9TVEFUCQkJMHgwN2I4CisjCWRlZmluZSBSMTI4X1BNNF9GSUZPQ05UX01BU0sJCTB4MGZmZgorIwlkZWZpbmUgUjEyOF9QTTRfQlVTWQkJCSgxIDw8IDE2KQorIwlkZWZpbmUgUjEyOF9QTTRfR1VJX0FDVElWRQkJKDEgPDwgMzEpCisKKyNkZWZpbmUgUjEyOF9QTTRfTUlDUk9DT0RFX0FERFIJCTB4MDdkNAorI2RlZmluZSBSMTI4X1BNNF9NSUNST0NPREVfUkFERFIJMHgwN2Q4CisjZGVmaW5lIFIxMjhfUE00X01JQ1JPQ09ERV9EQVRBSAkweDA3ZGMKKyNkZWZpbmUgUjEyOF9QTTRfTUlDUk9DT0RFX0RBVEFMCTB4MDdlMAorCisjZGVmaW5lIFIxMjhfUE00X0JVRkZFUl9BRERSCQkweDA3ZjAKKyNkZWZpbmUgUjEyOF9QTTRfTUlDUk9fQ05UTAkJMHgwN2ZjCisjCWRlZmluZSBSMTI4X1BNNF9NSUNST19GUkVFUlVOCQkoMSA8PCAzMCkKKworI2RlZmluZSBSMTI4X1BNNF9GSUZPX0RBVEFfRVZFTgkJMHgxMDAwCisjZGVmaW5lIFIxMjhfUE00X0ZJRk9fREFUQV9PREQJCTB4MTAwNAorCisKKy8qIENDRSBjb21tYW5kIHBhY2tldHMKKyAqLworI2RlZmluZSBSMTI4X0NDRV9QQUNLRVQwCQkweDAwMDAwMDAwCisjZGVmaW5lIFIxMjhfQ0NFX1BBQ0tFVDEJCTB4NDAwMDAwMDAKKyNkZWZpbmUgUjEyOF9DQ0VfUEFDS0VUMgkJMHg4MDAwMDAwMAorI2RlZmluZSBSMTI4X0NDRV9QQUNLRVQzCQkweEMwMDAwMDAwCisjCWRlZmluZSBSMTI4X0NOVExfSE9TVERBVEFfQkxUCQkweDAwMDA5NDAwCisjCWRlZmluZSBSMTI4X0NOVExfUEFJTlRfTVVMVEkJCTB4MDAwMDlBMDAKKyMJZGVmaW5lIFIxMjhfQ05UTF9CSVRCTFRfTVVMVEkJCTB4MDAwMDlCMDAKKyMJZGVmaW5lIFIxMjhfM0RfUk5EUl9HRU5fSU5EWF9QUklNCTB4MDAwMDIzMDAKKworI2RlZmluZSBSMTI4X0NDRV9QQUNLRVRfTUFTSwkJMHhDMDAwMDAwMAorI2RlZmluZSBSMTI4X0NDRV9QQUNLRVRfQ09VTlRfTUFTSwkweDNmZmYwMDAwCisjZGVmaW5lIFIxMjhfQ0NFX1BBQ0tFVDBfUkVHX01BU0sJMHgwMDAwMDdmZgorI2RlZmluZSBSMTI4X0NDRV9QQUNLRVQxX1JFRzBfTUFTSwkweDAwMDAwN2ZmCisjZGVmaW5lIFIxMjhfQ0NFX1BBQ0tFVDFfUkVHMV9NQVNLCTB4MDAzZmY4MDAKKworI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9OT05FCQkweDAwMDAwMDAwCisjZGVmaW5lIFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9UWVBFX1BPSU5UCTB4MDAwMDAwMDEKKyNkZWZpbmUgUjEyOF9DQ0VfVkNfQ05UTF9QUklNX1RZUEVfTElORQkJMHgwMDAwMDAwMgorI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9QT0xZX0xJTkUJMHgwMDAwMDAwMworI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9UUklfTElTVAkweDAwMDAwMDA0CisjZGVmaW5lIFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9UWVBFX1RSSV9GQU4JMHgwMDAwMDAwNQorI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9UUklfU1RSSVAJMHgwMDAwMDAwNgorI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9UUklfVFlQRTIJMHgwMDAwMDAwNworI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fV0FMS19JTkQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgUjEyOF9DQ0VfVkNfQ05UTF9QUklNX1dBTEtfTElTVAkJMHgwMDAwMDAyMAorI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fV0FMS19SSU5HCQkweDAwMDAwMDMwCisjZGVmaW5lIFIxMjhfQ0NFX1ZDX0NOVExfTlVNX1NISUZUCQkxNgorCisjZGVmaW5lIFIxMjhfREFUQVRZUEVfVlEJCTAKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9DSTQJCTEKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9DSTgJCTIKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9BUkdCMTU1NQkJMworI2RlZmluZSBSMTI4X0RBVEFUWVBFX1JHQjU2NQkJNAorI2RlZmluZSBSMTI4X0RBVEFUWVBFX1JHQjg4OAkJNQorI2RlZmluZSBSMTI4X0RBVEFUWVBFX0FSR0I4ODg4CQk2CisjZGVmaW5lIFIxMjhfREFUQVRZUEVfUkdCMzMyCQk3CisjZGVmaW5lIFIxMjhfREFUQVRZUEVfWTgJCTgKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9SR0I4CQk5CisjZGVmaW5lIFIxMjhfREFUQVRZUEVfQ0kxNgkJMTAKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9ZVllVNDIyCQkxMQorI2RlZmluZSBSMTI4X0RBVEFUWVBFX1ZZVVk0MjIJCTEyCisjZGVmaW5lIFIxMjhfREFUQVRZUEVfQVlVVjQ0NAkJMTQKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9BUkdCNDQ0NAkJMTUKKworLyogQ29uc3RhbnRzICovCisjZGVmaW5lIFIxMjhfQUdQX09GRlNFVAkJCTB4MDIwMDAwMDAKKworI2RlZmluZSBSMTI4X1dBVEVSTUFSS19MCQkxNgorI2RlZmluZSBSMTI4X1dBVEVSTUFSS19NCQk4CisjZGVmaW5lIFIxMjhfV0FURVJNQVJLX04JCTgKKyNkZWZpbmUgUjEyOF9XQVRFUk1BUktfSwkJMTI4CisKKyNkZWZpbmUgUjEyOF9NQVhfVVNFQ19USU1FT1VUCQkxMDAwMDAJLyogMTAwIG1zICovCisKKyNkZWZpbmUgUjEyOF9MQVNUX0ZSQU1FX1JFRwkJUjEyOF9HVUlfU0NSQVRDSF9SRUcwCisjZGVmaW5lIFIxMjhfTEFTVF9ESVNQQVRDSF9SRUcJCVIxMjhfR1VJX1NDUkFUQ0hfUkVHMQorI2RlZmluZSBSMTI4X01BWF9WQl9BR0UJCQkweDdmZmZmZmZmCisjZGVmaW5lIFIxMjhfTUFYX1ZCX1ZFUlRTCQkoMHhmZmZmKQorCisjZGVmaW5lIFIxMjhfUklOR19ISUdIX01BUksJCTEyOAorCisjZGVmaW5lIFIxMjhfUEVSRk9STUFOQ0VfQk9YRVMJCTAKKworI2RlZmluZSBSMTI4X1JFQUQocmVnKQkJRFJNX1JFQUQzMiggIGRldl9wcml2LT5tbWlvLCAocmVnKSApCisjZGVmaW5lIFIxMjhfV1JJVEUocmVnLHZhbCkJRFJNX1dSSVRFMzIoIGRldl9wcml2LT5tbWlvLCAocmVnKSwgKHZhbCkgKQorI2RlZmluZSBSMTI4X1JFQUQ4KHJlZykJCURSTV9SRUFEOCggICBkZXZfcHJpdi0+bW1pbywgKHJlZykgKQorI2RlZmluZSBSMTI4X1dSSVRFOChyZWcsdmFsKQlEUk1fV1JJVEU4KCAgZGV2X3ByaXYtPm1taW8sIChyZWcpLCAodmFsKSApCisKKyNkZWZpbmUgUjEyOF9XUklURV9QTEwoYWRkcix2YWwpCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCVIxMjhfV1JJVEU4KFIxMjhfQ0xPQ0tfQ05UTF9JTkRFWCwJCQkJXAorCQkgICAgKChhZGRyKSAmIDB4MWYpIHwgUjEyOF9QTExfV1JfRU4pOwkJCVwKKwlSMTI4X1dSSVRFKFIxMjhfQ0xPQ0tfQ05UTF9EQVRBLCAodmFsKSk7CQkJXAorfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIENDRV9QQUNLRVQwKCByZWcsIG4gKQkJKFIxMjhfQ0NFX1BBQ0tFVDAgfAkJXAorCQkJCQkgKChuKSA8PCAxNikgfCAoKHJlZykgPj4gMikpCisjZGVmaW5lIENDRV9QQUNLRVQxKCByZWcwLCByZWcxICkJKFIxMjhfQ0NFX1BBQ0tFVDEgfAkJXAorCQkJCQkgKCgocmVnMSkgPj4gMikgPDwgMTEpIHwgKChyZWcwKSA+PiAyKSkKKyNkZWZpbmUgQ0NFX1BBQ0tFVDIoKQkJCShSMTI4X0NDRV9QQUNLRVQyKQorI2RlZmluZSBDQ0VfUEFDS0VUMyggcGt0LCBuICkJCShSMTI4X0NDRV9QQUNLRVQzIHwJCVwKKwkJCQkJIChwa3QpIHwgKChuKSA8PCAxNikpCisKKworc3RhdGljIF9faW5saW5lX18gdm9pZAorcjEyOF91cGRhdGVfcmluZ19zbmFwc2hvdCggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX3IxMjhfcmluZ19idWZmZXJfdCAqcmluZyA9ICZkZXZfcHJpdi0+cmluZzsKKwlyaW5nLT5zcGFjZSA9IChHRVRfUklOR19IRUFEKCBkZXZfcHJpdiApIC0gcmluZy0+dGFpbCkgKiBzaXplb2YodTMyKTsKKwlpZiAoIHJpbmctPnNwYWNlIDw9IDAgKQorCQlyaW5nLT5zcGFjZSArPSByaW5nLT5zaXplOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBNaXNjIGhlbHBlciBtYWNyb3MKKyAqLworCisjZGVmaW5lIFJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWRybV9yMTI4X3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmc7IGludCBpOwkJXAorCWlmICggcmluZy0+c3BhY2UgPCByaW5nLT5oaWdoX21hcmsgKSB7CQkJCVwKKwkJZm9yICggaSA9IDAgOyBpIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IGkrKyApIHsJXAorCQkJcjEyOF91cGRhdGVfcmluZ19zbmFwc2hvdCggZGV2X3ByaXYgKTsJCVwKKwkJCWlmICggcmluZy0+c3BhY2UgPj0gcmluZy0+aGlnaF9tYXJrICkJCVwKKwkJCQlnb3RvIF9fcmluZ19zcGFjZV9kb25lOwkJCVwKKwkJCURSTV9VREVMQVkoMSk7CQkJCVwKKwkJfQkJCQkJCQlcCisJCURSTV9FUlJPUiggInJpbmcgc3BhY2UgY2hlY2sgZmFpbGVkIVxuIiApOwkJXAorCQlyZXR1cm4gRFJNX0VSUihFQlVTWSk7CQkJCVwKKwl9CQkJCQkJCQlcCisgX19yaW5nX3NwYWNlX2RvbmU6CQkJCQkJCVwKKwk7CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwkJXAorCWlmICggc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA+PSBSMTI4X01BWF9WQl9BR0UgKSB7CQlcCisJCWludCBfX3JldCA9IHIxMjhfZG9fY2NlX2lkbGUoIGRldl9wcml2ICk7CQlcCisJCWlmICggX19yZXQgKSByZXR1cm4gX19yZXQ7CQkJCVwKKwkJc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IDA7CQkJCVwKKwkJcjEyOF9mcmVlbGlzdF9yZXNldCggZGV2ICk7CQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFIxMjhfV0FJVF9VTlRJTF9QQUdFX0ZMSVBQRUQoKSBkbyB7CQkJCVwKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfV0FJVF9VTlRJTCwgMCApICk7CQkJXAorCU9VVF9SSU5HKCBSMTI4X0VWRU5UX0NSVENfT0ZGU0VUICk7CQkJCVwKK30gd2hpbGUgKDApCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmluZyBjb250cm9sCisgKi8KKworI2RlZmluZSBSMTI4X1ZFUkJPU0UJMAorCisjZGVmaW5lIFJJTkdfTE9DQUxTCQkJCQkJCVwKKwlpbnQgd3JpdGUsIF9ucjsgdW5zaWduZWQgaW50IHRhaWxfbWFzazsgdm9sYXRpbGUgdTMyICpyaW5nOworCisjZGVmaW5lIEJFR0lOX1JJTkcoIG4gKSBkbyB7CQkJCQkJXAorCWlmICggUjEyOF9WRVJCT1NFICkgewkJCQkJCVwKKwkJRFJNX0lORk8oICJCRUdJTl9SSU5HKCAlZCApIGluICVzXG4iLAkJCVwKKwkJCSAgIChuKSwgX19GVU5DVElPTl9fICk7CQkJCVwKKwl9CQkJCQkJCQlcCisJaWYgKCBkZXZfcHJpdi0+cmluZy5zcGFjZSA8PSAobikgKiBzaXplb2YodTMyKSApIHsJCVwKKwkJQ09NTUlUX1JJTkcoKTsJCQkJCQlcCisJCXIxMjhfd2FpdF9yaW5nKCBkZXZfcHJpdiwgKG4pICogc2l6ZW9mKHUzMikgKTsJCVwKKwl9CQkJCQkJCQlcCisJX25yID0gbjsgZGV2X3ByaXYtPnJpbmcuc3BhY2UgLT0gKG4pICogc2l6ZW9mKHUzMik7CQlcCisJcmluZyA9IGRldl9wcml2LT5yaW5nLnN0YXJ0OwkJCQkJXAorCXdyaXRlID0gZGV2X3ByaXYtPnJpbmcudGFpbDsJCQkJCVwKKwl0YWlsX21hc2sgPSBkZXZfcHJpdi0+cmluZy50YWlsX21hc2s7CQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFlvdSBjYW4gc2V0IHRoaXMgdG8gemVybyBpZiB5b3Ugd2FudC4gIElmIHRoZSBjYXJkIGxvY2tzIHVwLCB5b3UnbGwKKyAqIG5lZWQgdG8ga2VlcCB0aGlzIHNldC4gIEl0IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiBlYXJseSByZXZzIG9mIHRoZQorICogUmFnZSAxMjggY2hpcHNldCwgd2hlcmUgdGhlIENDRSB3b3VsZCByZWFkIDMyIGR3b3JkcyBwYXN0IHRoZSBlbmQgb2YKKyAqIHRoZSByaW5nIGJ1ZmZlciBiZWZvcmUgd3JhcHBpbmcgYXJvdW5kLgorICovCisjZGVmaW5lIFIxMjhfQlJPS0VOX0NDRQkxCisKKyNkZWZpbmUgQURWQU5DRV9SSU5HKCkgZG8gewkJCQkJCVwKKwlpZiAoIFIxMjhfVkVSQk9TRSApIHsJCQkJCQlcCisJCURSTV9JTkZPKCAiQURWQU5DRV9SSU5HKCkgd3I9MHglMDZ4IHRhaWw9MHglMDZ4XG4iLAlcCisJCQkgIHdyaXRlLCBkZXZfcHJpdi0+cmluZy50YWlsICk7CQkJXAorCX0JCQkJCQkJCVwKKwlpZiAoIFIxMjhfQlJPS0VOX0NDRSAmJiB3cml0ZSA8IDMyICkgewkJCQlcCisJCW1lbWNweSggZGV2X3ByaXYtPnJpbmcuZW5kLAkJCQlcCisJCQlkZXZfcHJpdi0+cmluZy5zdGFydCwJCQkJXAorCQkJd3JpdGUgKiBzaXplb2YodTMyKSApOwkJCQlcCisJfQkJCQkJCQkJXAorCWlmICgoKGRldl9wcml2LT5yaW5nLnRhaWwgKyBfbnIpICYgdGFpbF9tYXNrKSAhPSB3cml0ZSkgewlcCisJCURSTV9FUlJPUiggCQkJCQkJXAorCQkJIkFEVkFOQ0VfUklORygpOiBtaXNtYXRjaDogbnI6ICV4IHdyaXRlOiAleCBsaW5lOiAlZFxuIiwJXAorCQkJKChkZXZfcHJpdi0+cmluZy50YWlsICsgX25yKSAmIHRhaWxfbWFzayksCVwKKwkJCXdyaXRlLCBfX0xJTkVfXyk7CQkJCVwKKwl9IGVsc2UJCQkJCQkJCVwKKwkJZGV2X3ByaXYtPnJpbmcudGFpbCA9IHdyaXRlOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTU1JVF9SSU5HKCkgZG8gewkJCQkJCVwKKwlpZiAoIFIxMjhfVkVSQk9TRSApIHsJCQkJCQlcCisJCURSTV9JTkZPKCAiQ09NTUlUX1JJTkcoKSB0YWlsPTB4JTA2eFxuIiwJCVwKKwkJCWRldl9wcml2LT5yaW5nLnRhaWwgKTsJCQkJXAorCX0JCQkJCQkJCVwKKwlEUk1fTUVNT1JZQkFSUklFUigpOwkJCQkJCVwKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9CVUZGRVJfRExfV1BUUiwgZGV2X3ByaXYtPnJpbmcudGFpbCApOwlcCisJUjEyOF9SRUFEKCBSMTI4X1BNNF9CVUZGRVJfRExfV1BUUiApOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE9VVF9SSU5HKCB4ICkgZG8gewkJCQkJCVwKKwlpZiAoIFIxMjhfVkVSQk9TRSApIHsJCQkJCQlcCisJCURSTV9JTkZPKCAiICAgT1VUX1JJTkcoIDB4JTA4eCApIGF0IDB4JXhcbiIsCQlcCisJCQkgICAodW5zaWduZWQgaW50KSh4KSwgd3JpdGUgKTsJCQlcCisJfQkJCQkJCQkJXAorCXJpbmdbd3JpdGUrK10gPSBjcHVfdG9fbGUzMiggeCApOwkJCQlcCisJd3JpdGUgJj0gdGFpbF9tYXNrOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBfX1IxMjhfRFJWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0M2EzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaXJxLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qIHIxMjhfaXJxLmMgLS0gSVJRIGhhbmRsaW5nIGZvciByYWRlb24gLSotIGxpbnV4LWMgLSotCisgKgorICogQ29weXJpZ2h0IChDKSBUaGUgV2VhdGhlciBDaGFubmVsLCBJbmMuICAyMDAyLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhlIFdlYXRoZXIgQ2hhbm5lbCAoVE0pIGZ1bmRlZCBUdW5nc3RlbiBHcmFwaGljcyB0byBkZXZlbG9wIHRoZQorICogaW5pdGlhbCByZWxlYXNlIG9mIHRoZSBSYWRlb24gODUwMCBkcml2ZXIgdW5kZXIgdGhlIFhGcmVlODYgbGljZW5zZS4KKyAqIFRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICogICAgRXJpYyBBbmhvbHQgPGFuaG9sdEBGcmVlQlNELm9yZz4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgInIxMjhfZHJtLmgiCisjaW5jbHVkZSAicjEyOF9kcnYuaCIKKworaXJxcmV0dXJuX3QgcjEyOF9kcml2ZXJfaXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApCit7CisJZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9yMTI4X3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IFIxMjhfUkVBRCggUjEyOF9HRU5fSU5UX1NUQVRVUyApOworCQorCS8qIFZCTEFOSyBpbnRlcnJ1cHQgKi8KKwlpZiAoIHN0YXR1cyAmIFIxMjhfQ1JUQ19WQkxBTktfSU5UICkgeworCQlSMTI4X1dSSVRFKCBSMTI4X0dFTl9JTlRfU1RBVFVTLCBSMTI4X0NSVENfVkJMQU5LX0lOVF9BSyApOworCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZCk7CisJCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlKTsKKwkJZHJtX3ZibF9zZW5kX3NpZ25hbHMoIGRldiApOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXJldHVybiBJUlFfTk9ORTsKK30KKworaW50IHIxMjhfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoreworCXVuc2lnbmVkIGludCBjdXJfdmJsYW5rOworCWludCByZXQgPSAwOworCisJLyogQXNzdW1lIHRoYXQgdGhlIHVzZXIgaGFzIG1pc3NlZCB0aGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIKKwkgKiBieSBhYm91dCBhIGRheSByYXRoZXIgdGhhbiBzaGUgd2FudHMgdG8gd2FpdCBmb3IgeWVhcnMKKwkgKiB1c2luZyB2ZXJ0aWNhbCBibGFua3MuLi4gCisJICovCisJRFJNX1dBSVRfT04oIHJldCwgZGV2LT52YmxfcXVldWUsIDMqRFJNX0haLCAKKwkJICAgICAoICggKCBjdXJfdmJsYW5rID0gYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkICkgKQorCQkJIC0gKnNlcXVlbmNlICkgPD0gKDE8PDIzKSApICk7CisKKwkqc2VxdWVuY2UgPSBjdXJfdmJsYW5rOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCByMTI4X2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7CisgIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9yMTI4X3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBEaXNhYmxlICphbGwqIGludGVycnVwdHMgKi8KKyAgICAgIAlSMTI4X1dSSVRFKCBSMTI4X0dFTl9JTlRfQ05UTCwgMCApOworCS8qIENsZWFyIHZibGFuayBiaXQgaWYgaXQncyBhbHJlYWR5IGhpZ2ggKi8KKyAgIAlSMTI4X1dSSVRFKCBSMTI4X0dFTl9JTlRfU1RBVFVTLCBSMTI4X0NSVENfVkJMQU5LX0lOVF9BSyApOworfQorCit2b2lkIHIxMjhfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7CisgIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9yMTI4X3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBUdXJuIG9uIFZCTCBpbnRlcnJ1cHQgKi8KKyAgIAlSMTI4X1dSSVRFKCBSMTI4X0dFTl9JTlRfQ05UTCwgUjEyOF9DUlRDX1ZCTEFOS19JTlRfRU4gKTsKK30KKwordm9pZCByMTI4X2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKyAgCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAoZHJtX3IxMjhfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlpZiAoIWRldl9wcml2KQorCQlyZXR1cm47CisKKwkvKiBEaXNhYmxlICphbGwqIGludGVycnVwdHMgKi8KKwlSMTI4X1dSSVRFKCBSMTI4X0dFTl9JTlRfQ05UTCwgMCApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGIzY2JkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMKQEAgLTAsMCArMSwxNzMyIEBACisvKiByMTI4X3N0YXRlLmMgLS0gU3RhdGUgc3VwcG9ydCBmb3IgcjEyOCAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IFRodSBKYW4gMjcgMDI6NTM6NDMgMjAwMCBieSBnYXJldGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicjEyOF9kcm0uaCIKKyNpbmNsdWRlICJyMTI4X2Rydi5oIgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENDRSBoYXJkd2FyZSBzdGF0ZSBwcm9ncmFtbWluZyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCByMTI4X2VtaXRfY2xpcF9yZWN0cyggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkgIGRybV9jbGlwX3JlY3RfdCAqYm94ZXMsIGludCBjb3VudCApCit7CisJdTMyIGF1eF9zY19jbnRsID0gMHgwMDAwMDAwMDsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJQkVHSU5fUklORyggKGNvdW50IDwgMz8gY291bnQ6IDMpICogNSArIDIgKTsKKworCWlmICggY291bnQgPj0gMSApIHsKKwkJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0FVWDFfU0NfTEVGVCwgMyApICk7CisJCU9VVF9SSU5HKCBib3hlc1swXS54MSApOworCQlPVVRfUklORyggYm94ZXNbMF0ueDIgLSAxICk7CisJCU9VVF9SSU5HKCBib3hlc1swXS55MSApOworCQlPVVRfUklORyggYm94ZXNbMF0ueTIgLSAxICk7CisKKwkJYXV4X3NjX2NudGwgfD0gKFIxMjhfQVVYMV9TQ19FTiB8IFIxMjhfQVVYMV9TQ19NT0RFX09SKTsKKwl9CisJaWYgKCBjb3VudCA+PSAyICkgeworCQlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfQVVYMl9TQ19MRUZULCAzICkgKTsKKwkJT1VUX1JJTkcoIGJveGVzWzFdLngxICk7CisJCU9VVF9SSU5HKCBib3hlc1sxXS54MiAtIDEgKTsKKwkJT1VUX1JJTkcoIGJveGVzWzFdLnkxICk7CisJCU9VVF9SSU5HKCBib3hlc1sxXS55MiAtIDEgKTsKKworCQlhdXhfc2NfY250bCB8PSAoUjEyOF9BVVgyX1NDX0VOIHwgUjEyOF9BVVgyX1NDX01PREVfT1IpOworCX0KKwlpZiAoIGNvdW50ID49IDMgKSB7CisJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9BVVgzX1NDX0xFRlQsIDMgKSApOworCQlPVVRfUklORyggYm94ZXNbMl0ueDEgKTsKKwkJT1VUX1JJTkcoIGJveGVzWzJdLngyIC0gMSApOworCQlPVVRfUklORyggYm94ZXNbMl0ueTEgKTsKKwkJT1VUX1JJTkcoIGJveGVzWzJdLnkyIC0gMSApOworCisJCWF1eF9zY19jbnRsIHw9IChSMTI4X0FVWDNfU0NfRU4gfCBSMTI4X0FVWDNfU0NfTU9ERV9PUik7CisJfQorCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0FVWF9TQ19DTlRMLCAwICkgKTsKKwlPVVRfUklORyggYXV4X3NjX2NudGwgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF9jb3JlKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX3IxMjhfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIiAgICAlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlCRUdJTl9SSU5HKCAyICk7CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfU0NBTEVfM0RfQ05UTCwgMCApICk7CisJT1VUX1JJTkcoIGN0eC0+c2NhbGVfM2RfY250bCApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X2NvbnRleHQoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiICAgICVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUJFR0lOX1JJTkcoIDEzICk7CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfRFNUX1BJVENIX09GRlNFVF9DLCAxMSApICk7CisJT1VUX1JJTkcoIGN0eC0+ZHN0X3BpdGNoX29mZnNldF9jICk7CisJT1VUX1JJTkcoIGN0eC0+ZHBfZ3VpX21hc3Rlcl9jbnRsX2MgKTsKKwlPVVRfUklORyggY3R4LT5zY190b3BfbGVmdF9jICk7CisJT1VUX1JJTkcoIGN0eC0+c2NfYm90dG9tX3JpZ2h0X2MgKTsKKwlPVVRfUklORyggY3R4LT56X29mZnNldF9jICk7CisJT1VUX1JJTkcoIGN0eC0+el9waXRjaF9jICk7CisJT1VUX1JJTkcoIGN0eC0+el9zdGVuX2NudGxfYyApOworCU9VVF9SSU5HKCBjdHgtPnRleF9jbnRsX2MgKTsKKwlPVVRfUklORyggY3R4LT5taXNjXzNkX3N0YXRlX2NudGxfcmVnICk7CisJT1VUX1JJTkcoIGN0eC0+dGV4dHVyZV9jbHJfY21wX2Nscl9jICk7CisJT1VUX1JJTkcoIGN0eC0+dGV4dHVyZV9jbHJfY21wX21za19jICk7CisJT1VUX1JJTkcoIGN0eC0+Zm9nX2NvbG9yX2MgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF9zZXR1cCggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9yMTI4X2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJQkVHSU5fUklORyggMyApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQxKCBSMTI4X1NFVFVQX0NOVEwsIFIxMjhfUE00X1ZDX0ZQVV9TRVRVUCApICk7CisJT1VUX1JJTkcoIGN0eC0+c2V0dXBfY250bCApOworCU9VVF9SSU5HKCBjdHgtPnBtNF92Y19mcHVfc2V0dXAgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF9tYXNrcyggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9yMTI4X2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJQkVHSU5fUklORyggNSApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0RQX1dSSVRFX01BU0ssIDAgKSApOworCU9VVF9SSU5HKCBjdHgtPmRwX3dyaXRlX21hc2sgKTsKKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9TVEVOX1JFRl9NQVNLX0MsIDEgKSApOworCU9VVF9SSU5HKCBjdHgtPnN0ZW5fcmVmX21hc2tfYyApOworCU9VVF9SSU5HKCBjdHgtPnBsYW5lXzNkX21hc2tfYyApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X3dpbmRvdyggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9yMTI4X2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJQkVHSU5fUklORyggMiApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X1dJTkRPV19YWV9PRkZTRVQsIDAgKSApOworCU9VVF9SSU5HKCBjdHgtPndpbmRvd194eV9vZmZzZXQgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF90ZXgwKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX3IxMjhfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCWRybV9yMTI4X3RleHR1cmVfcmVnc190ICp0ZXggPSAmc2FyZWFfcHJpdi0+dGV4X3N0YXRlWzBdOworCWludCBpOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIiAgICAlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlCRUdJTl9SSU5HKCA3ICsgUjEyOF9NQVhfVEVYVFVSRV9MRVZFTFMgKTsKKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9QUklNX1RFWF9DTlRMX0MsCisJCQkgICAgICAgMiArIFIxMjhfTUFYX1RFWFRVUkVfTEVWRUxTICkgKTsKKwlPVVRfUklORyggdGV4LT50ZXhfY250bCApOworCU9VVF9SSU5HKCB0ZXgtPnRleF9jb21iaW5lX2NudGwgKTsKKwlPVVRfUklORyggY3R4LT50ZXhfc2l6ZV9waXRjaF9jICk7CisJZm9yICggaSA9IDAgOyBpIDwgUjEyOF9NQVhfVEVYVFVSRV9MRVZFTFMgOyBpKysgKSB7CisJCU9VVF9SSU5HKCB0ZXgtPnRleF9vZmZzZXRbaV0gKTsKKwl9CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfQ09OU1RBTlRfQ09MT1JfQywgMSApICk7CisJT1VUX1JJTkcoIGN0eC0+Y29uc3RhbnRfY29sb3JfYyApOworCU9VVF9SSU5HKCB0ZXgtPnRleF9ib3JkZXJfY29sb3IgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF90ZXgxKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX3IxMjhfdGV4dHVyZV9yZWdzX3QgKnRleCA9ICZzYXJlYV9wcml2LT50ZXhfc3RhdGVbMV07CisJaW50IGk7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiICAgICVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUJFR0lOX1JJTkcoIDUgKyBSMTI4X01BWF9URVhUVVJFX0xFVkVMUyApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X1NFQ19URVhfQ05UTF9DLAorCQkJICAgICAgIDEgKyBSMTI4X01BWF9URVhUVVJFX0xFVkVMUyApICk7CisJT1VUX1JJTkcoIHRleC0+dGV4X2NudGwgKTsKKwlPVVRfUklORyggdGV4LT50ZXhfY29tYmluZV9jbnRsICk7CisJZm9yICggaSA9IDAgOyBpIDwgUjEyOF9NQVhfVEVYVFVSRV9MRVZFTFMgOyBpKysgKSB7CisJCU9VVF9SSU5HKCB0ZXgtPnRleF9vZmZzZXRbaV0gKTsKKwl9CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfU0VDX1RFWFRVUkVfQk9SREVSX0NPTE9SX0MsIDAgKSApOworCU9VVF9SSU5HKCB0ZXgtPnRleF9ib3JkZXJfY29sb3IgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF9zdGF0ZSggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXVuc2lnbmVkIGludCBkaXJ0eSA9IHNhcmVhX3ByaXYtPmRpcnR5OworCisJRFJNX0RFQlVHKCAiJXM6IGRpcnR5PTB4JTA4eFxuIiwgX19GVU5DVElPTl9fLCBkaXJ0eSApOworCisJaWYgKCBkaXJ0eSAmIFIxMjhfVVBMT0FEX0NPUkUgKSB7CisJCXIxMjhfZW1pdF9jb3JlKCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9VUExPQURfQ09SRTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUjEyOF9VUExPQURfQ09OVEVYVCApIHsKKwkJcjEyOF9lbWl0X2NvbnRleHQoIGRldl9wcml2ICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5SMTI4X1VQTE9BRF9DT05URVhUOworCX0KKworCWlmICggZGlydHkgJiBSMTI4X1VQTE9BRF9TRVRVUCApIHsKKwkJcjEyOF9lbWl0X3NldHVwKCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9VUExPQURfU0VUVVA7CisJfQorCisJaWYgKCBkaXJ0eSAmIFIxMjhfVVBMT0FEX01BU0tTICkgeworCQlyMTI4X2VtaXRfbWFza3MoIGRldl9wcml2ICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5SMTI4X1VQTE9BRF9NQVNLUzsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUjEyOF9VUExPQURfV0lORE9XICkgeworCQlyMTI4X2VtaXRfd2luZG93KCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9VUExPQURfV0lORE9XOworCX0KKworCWlmICggZGlydHkgJiBSMTI4X1VQTE9BRF9URVgwICkgeworCQlyMTI4X2VtaXRfdGV4MCggZGV2X3ByaXYgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gflIxMjhfVVBMT0FEX1RFWDA7CisJfQorCisJaWYgKCBkaXJ0eSAmIFIxMjhfVVBMT0FEX1RFWDEgKSB7CisJCXIxMjhfZW1pdF90ZXgxKCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9VUExPQURfVEVYMTsKKwl9CisKKwkvKiBUdXJuIG9mZiB0aGUgdGV4dHVyZSBjYWNoZSBmbHVzaGluZyAqLworCXNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGUudGV4X2NudGxfYyAmPSB+UjEyOF9URVhfQ0FDSEVfRkxVU0g7CisKKwlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9SRVFVSVJFX1FVSUVTQ0VOQ0U7Cit9CisKKworI2lmIFIxMjhfUEVSRk9STUFOQ0VfQk9YRVMKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgcjEyOF9jbGVhcl9ib3goIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCisJCQkgICAgaW50IHIsIGludCBnLCBpbnQgYiApCit7CisJdTMyIHBpdGNoLCBvZmZzZXQ7CisJdTMyIGZiX2JwcCwgY29sb3I7CisJUklOR19MT0NBTFM7CisKKwlzd2l0Y2ggKCBkZXZfcHJpdi0+ZmJfYnBwICkgeworCWNhc2UgMTY6CisJCWZiX2JwcCA9IFIxMjhfR01DX0RTVF8xNkJQUDsKKwkJY29sb3IgPSAoKChyICYgMHhmOCkgPDwgOCkgfAorCQkJICgoZyAmIDB4ZmMpIDw8IDMpIHwKKwkJCSAoKGIgJiAweGY4KSA+PiAzKSk7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCWZiX2JwcCA9IFIxMjhfR01DX0RTVF8yNEJQUDsKKwkJY29sb3IgPSAoKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiKTsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJZmJfYnBwID0gUjEyOF9HTUNfRFNUXzMyQlBQOworCQljb2xvciA9ICgoKDB4ZmYpIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8ICA4KSB8IGIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJb2Zmc2V0ID0gZGV2X3ByaXYtPmJhY2tfb2Zmc2V0OworCXBpdGNoID0gZGV2X3ByaXYtPmJhY2tfcGl0Y2ggPj4gMzsKKworCUJFR0lOX1JJTkcoIDYgKTsKKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMyggUjEyOF9DTlRMX1BBSU5UX01VTFRJLCA0ICkgKTsKKwlPVVRfUklORyggUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJICBSMTI4X0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCSAgZmJfYnBwIHwKKwkJICBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkgIFIxMjhfUk9QM19QIHwKKwkJICBSMTI4X0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJICBSMTI4X0dNQ19BVVhfQ0xJUF9ESVMgKTsKKworCU9VVF9SSU5HKCAocGl0Y2ggPDwgMjEpIHwgKG9mZnNldCA+PiA1KSApOworCU9VVF9SSU5HKCBjb2xvciApOworCisJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX3BlcmZvcm1hbmNlX2JveGVzKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlpZiAoIGF0b21pY19yZWFkKCAmZGV2X3ByaXYtPmlkbGVfY291bnQgKSA9PSAwICkgeworCQlyMTI4X2NsZWFyX2JveCggZGV2X3ByaXYsIDY0LCA0LCA4LCA4LCAwLCAyNTUsIDAgKTsKKwl9IGVsc2UgeworCQlhdG9taWNfc2V0KCAmZGV2X3ByaXYtPmlkbGVfY291bnQsIDAgKTsKKwl9Cit9CisKKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENDRSBjb21tYW5kIGRpc3BhdGNoIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIHIxMjhfcHJpbnRfZGlydHkoIGNvbnN0IGNoYXIgKm1zZywgdW5zaWduZWQgaW50IGZsYWdzICkKK3sKKwlEUk1fSU5GTyggIiVzOiAoMHgleCkgJXMlcyVzJXMlcyVzJXMlcyVzXG4iLAorCQkgIG1zZywKKwkJICBmbGFncywKKwkJICAoZmxhZ3MgJiBSMTI4X1VQTE9BRF9DT1JFKSAgICAgICAgPyAiY29yZSwgIiA6ICIiLAorCQkgIChmbGFncyAmIFIxMjhfVVBMT0FEX0NPTlRFWFQpICAgICA/ICJjb250ZXh0LCAiIDogIiIsCisJCSAgKGZsYWdzICYgUjEyOF9VUExPQURfU0VUVVApICAgICAgID8gInNldHVwLCAiIDogIiIsCisJCSAgKGZsYWdzICYgUjEyOF9VUExPQURfVEVYMCkgICAgICAgID8gInRleDAsICIgOiAiIiwKKwkJICAoZmxhZ3MgJiBSMTI4X1VQTE9BRF9URVgxKSAgICAgICAgPyAidGV4MSwgIiA6ICIiLAorCQkgIChmbGFncyAmIFIxMjhfVVBMT0FEX01BU0tTKSAgICAgICA/ICJtYXNrcywgIiA6ICIiLAorCQkgIChmbGFncyAmIFIxMjhfVVBMT0FEX1dJTkRPVykgICAgICA/ICJ3aW5kb3csICIgOiAiIiwKKwkJICAoZmxhZ3MgJiBSMTI4X1VQTE9BRF9DTElQUkVDVFMpICAgPyAiY2xpcHJlY3RzLCAiIDogIiIsCisJCSAgKGZsYWdzICYgUjEyOF9SRVFVSVJFX1FVSUVTQ0VOQ0UpID8gInF1aWVzY2VuY2UsICIgOiAiIiApOworfQorCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9jbGVhciggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICBkcm1fcjEyOF9jbGVhcl90ICpjbGVhciApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjbGVhci0+ZmxhZ3M7CisJaW50IGk7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJaWYgKCBkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyAmJiBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDEgKSB7CisJCXVuc2lnbmVkIGludCB0bXAgPSBmbGFnczsKKworCQlmbGFncyAmPSB+KFIxMjhfRlJPTlQgfCBSMTI4X0JBQ0spOworCQlpZiAoIHRtcCAmIFIxMjhfRlJPTlQgKSBmbGFncyB8PSBSMTI4X0JBQ0s7CisJCWlmICggdG1wICYgUjEyOF9CQUNLICkgIGZsYWdzIHw9IFIxMjhfRlJPTlQ7CisJfQorCisJZm9yICggaSA9IDAgOyBpIDwgbmJveCA7IGkrKyApIHsKKwkJaW50IHggPSBwYm94W2ldLngxOworCQlpbnQgeSA9IHBib3hbaV0ueTE7CisJCWludCB3ID0gcGJveFtpXS54MiAtIHg7CisJCWludCBoID0gcGJveFtpXS55MiAtIHk7CisKKwkJRFJNX0RFQlVHKCAiZGlzcGF0Y2ggY2xlYXIgJWQsJWQtJWQsJWQgZmxhZ3MgMHgleFxuIiwKKwkJCSAgIHBib3hbaV0ueDEsIHBib3hbaV0ueTEsIHBib3hbaV0ueDIsCisJCQkgICBwYm94W2ldLnkyLCBmbGFncyApOworCisJCWlmICggZmxhZ3MgJiAoUjEyOF9GUk9OVCB8IFIxMjhfQkFDSykgKSB7CisJCQlCRUdJTl9SSU5HKCAyICk7CisKKwkJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9EUF9XUklURV9NQVNLLCAwICkgKTsKKwkJCU9VVF9SSU5HKCBjbGVhci0+Y29sb3JfbWFzayApOworCisJCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCisJCWlmICggZmxhZ3MgJiBSMTI4X0ZST05UICkgeworCQkJQkVHSU5fUklORyggNiApOworCisJCQlPVVRfUklORyggQ0NFX1BBQ0tFVDMoIFIxMjhfQ05UTF9QQUlOVF9NVUxUSSwgNCApICk7CisJCQlPVVRfUklORyggUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCQkgIFIxMjhfR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKKwkJCQkgIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKKwkJCQkgIFIxMjhfR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCQkJICBSMTI4X1JPUDNfUCB8CisJCQkJICBSMTI4X0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCQkgIFIxMjhfR01DX0FVWF9DTElQX0RJUyApOworCisJCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldF9jICk7CisJCQlPVVRfUklORyggY2xlYXItPmNsZWFyX2NvbG9yICk7CisKKwkJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCQlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCisJCWlmICggZmxhZ3MgJiBSMTI4X0JBQ0sgKSB7CisJCQlCRUdJTl9SSU5HKCA2ICk7CisKKwkJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMyggUjEyOF9DTlRMX1BBSU5UX01VTFRJLCA0ICkgKTsKKwkJCU9VVF9SSU5HKCBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCSAgUjEyOF9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAorCQkJCSAgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgOCkgfAorCQkJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkgIFIxMjhfUk9QM19QIHwKKwkJCQkgIFIxMjhfR01DX0NMUl9DTVBfQ05UTF9ESVMgfAorCQkJCSAgUjEyOF9HTUNfQVVYX0NMSVBfRElTICk7CisKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXRfYyApOworCQkJT1VUX1JJTkcoIGNsZWFyLT5jbGVhcl9jb2xvciApOworCisJCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCQkJT1VUX1JJTkcoICh3IDw8IDE2KSB8IGggKTsKKworCQkJQURWQU5DRV9SSU5HKCk7CisJCX0KKworCQlpZiAoIGZsYWdzICYgUjEyOF9ERVBUSCApIHsKKwkJCUJFR0lOX1JJTkcoIDYgKTsKKworCQkJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4X0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJT1VUX1JJTkcoIFIxMjhfR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJICBSMTI4X0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCQkJICAoZGV2X3ByaXYtPmRlcHRoX2ZtdCA8PCA4KSB8CisJCQkJICBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJCSAgUjEyOF9ST1AzX1AgfAorCQkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkJICBSMTI4X0dNQ19BVVhfQ0xJUF9ESVMgfAorCQkJCSAgUjEyOF9HTUNfV1JfTVNLX0RJUyApOworCisJCQlPVVRfUklORyggZGV2X3ByaXYtPmRlcHRoX3BpdGNoX29mZnNldF9jICk7CisJCQlPVVRfUklORyggY2xlYXItPmNsZWFyX2RlcHRoICk7CisKKwkJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCQlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfc3dhcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJaW50IGk7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisjaWYgUjEyOF9QRVJGT1JNQU5DRV9CT1hFUworCS8qIERvIHNvbWUgdHJpdmlhbCBwZXJmb3JtYW5jZSBtb25pdG9yaW5nLi4uCisJICovCisJcjEyOF9jY2VfcGVyZm9ybWFuY2VfYm94ZXMoIGRldl9wcml2ICk7CisjZW5kaWYKKworCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCWludCB4ID0gcGJveFtpXS54MTsKKwkJaW50IHkgPSBwYm94W2ldLnkxOworCQlpbnQgdyA9IHBib3hbaV0ueDIgLSB4OworCQlpbnQgaCA9IHBib3hbaV0ueTIgLSB5OworCisJCUJFR0lOX1JJTkcoIDcgKTsKKworCQlPVVRfUklORyggQ0NFX1BBQ0tFVDMoIFIxMjhfQ05UTF9CSVRCTFRfTVVMVEksIDUgKSApOworCQlPVVRfUklORyggUjEyOF9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCSAgUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCSAgUjEyOF9HTUNfQlJVU0hfTk9ORSB8CisJCQkgIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKKwkJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCSAgUjEyOF9ST1AzX1MgfAorCQkJICBSMTI4X0RQX1NSQ19TT1VSQ0VfTUVNT1JZIHwKKwkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkgIFIxMjhfR01DX0FVWF9DTElQX0RJUyB8CisJCQkgIFIxMjhfR01DX1dSX01TS19ESVMgKTsKKworCQkvKiBNYWtlIHRoaXMgd29yayBldmVuIGlmIGZyb250ICYgYmFjayBhcmUgZmxpcHBlZDoKKwkJICovCisJCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDApIHsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXRfYyApOworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXRfYyApOworCQl9IAorCQllbHNlIHsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0X2MgKTsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXRfYyApOworCQl9CisKKwkJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwkJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwkJT1VUX1JJTkcoICh3IDw8IDE2KSB8IGggKTsKKworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwkvKiBJbmNyZW1lbnQgdGhlIGZyYW1lIGNvdW50ZXIuICBUaGUgY2xpZW50LXNpZGUgM0QgZHJpdmVyIG11c3QKKwkgKiB0aHJvdHRsZSB0aGUgZnJhbWVyYXRlIGJ5IHdhaXRpbmcgZm9yIHRoaXMgdmFsdWUgYmVmb3JlCisJICogcGVyZm9ybWluZyB0aGUgc3dhcGJ1ZmZlciBpb2N0bC4KKwkgKi8KKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSsrOworCisJQkVHSU5fUklORyggMiApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0xBU1RfRlJBTUVfUkVHLCAwICkgKTsKKwlPVVRfUklORyggZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9mbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCIlczogcGFnZT0lZCBwZkN1cnJlbnRQYWdlPSVkXG4iLCAKKwkJX19GVU5DVElPTl9fLAorCQlkZXZfcHJpdi0+Y3VycmVudF9wYWdlLAorCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSk7CisKKyNpZiBSMTI4X1BFUkZPUk1BTkNFX0JPWEVTCisJLyogRG8gc29tZSB0cml2aWFsIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuLi4KKwkgKi8KKwlyMTI4X2NjZV9wZXJmb3JtYW5jZV9ib3hlcyggZGV2X3ByaXYgKTsKKyNlbmRpZgorCisJQkVHSU5fUklORyggNCApOworCisJUjEyOF9XQUlUX1VOVElMX1BBR0VfRkxJUFBFRCgpOworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9DUlRDX09GRlNFVCwgMCApICk7CisKKwlpZiAoIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCApIHsKKwkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX29mZnNldCApOworCX0gZWxzZSB7CisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICk7CisJfQorCisJQURWQU5DRV9SSU5HKCk7CisKKwkvKiBJbmNyZW1lbnQgdGhlIGZyYW1lIGNvdW50ZXIuICBUaGUgY2xpZW50LXNpZGUgM0QgZHJpdmVyIG11c3QKKwkgKiB0aHJvdHRsZSB0aGUgZnJhbWVyYXRlIGJ5IHdhaXRpbmcgZm9yIHRoaXMgdmFsdWUgYmVmb3JlCisJICogcGVyZm9ybWluZyB0aGUgc3dhcGJ1ZmZlciBpb2N0bC4KKwkgKi8KKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSsrOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9CisJCQkJCSAgICAgIDEgLSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworCisJQkVHSU5fUklORyggMiApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0xBU1RfRlJBTUVfUkVHLCAwICkgKTsKKwlPVVRfUklORyggZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF92ZXJ0ZXgoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgICAgIGRybV9idWZfdCAqYnVmICkKK3sKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWludCBmb3JtYXQgPSBzYXJlYV9wcml2LT52Y19mb3JtYXQ7CisJaW50IG9mZnNldCA9IGJ1Zi0+YnVzX2FkZHJlc3M7CisJaW50IHNpemUgPSBidWYtPnVzZWQ7CisJaW50IHByaW0gPSBidWZfcHJpdi0+cHJpbTsKKwlpbnQgaSA9IDA7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiYnVmPSVkIG5ib3g9JWRcbiIsIGJ1Zi0+aWR4LCBzYXJlYV9wcml2LT5uYm94ICk7CisKKwlpZiAoIDAgKQorCQlyMTI4X3ByaW50X2RpcnR5KCAiZGlzcGF0Y2hfdmVydGV4Iiwgc2FyZWFfcHJpdi0+ZGlydHkgKTsKKworCWlmICggYnVmLT51c2VkICkgeworCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDE7CisKKwkJaWYgKCBzYXJlYV9wcml2LT5kaXJ0eSAmIH5SMTI4X1VQTE9BRF9DTElQUkVDVFMgKSB7CisJCQlyMTI4X2VtaXRfc3RhdGUoIGRldl9wcml2ICk7CisJCX0KKworCQlkbyB7CisJCQkvKiBFbWl0IHRoZSBuZXh0IHNldCBvZiB1cCB0byB0aHJlZSBjbGlwcmVjdHMgKi8KKwkJCWlmICggaSA8IHNhcmVhX3ByaXYtPm5ib3ggKSB7CisJCQkJcjEyOF9lbWl0X2NsaXBfcmVjdHMoIGRldl9wcml2LAorCQkJCQkJICAgICAgJnNhcmVhX3ByaXYtPmJveGVzW2ldLAorCQkJCQkJICAgICAgc2FyZWFfcHJpdi0+bmJveCAtIGkgKTsKKwkJCX0KKworCQkJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciByZW5kZXJpbmcgY29tbWFuZHMgKi8KKwkJCUJFR0lOX1JJTkcoIDUgKTsKKworCQkJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4XzNEX1JORFJfR0VOX0lORFhfUFJJTSwgMyApICk7CisJCQlPVVRfUklORyggb2Zmc2V0ICk7CisJCQlPVVRfUklORyggc2l6ZSApOworCQkJT1VUX1JJTkcoIGZvcm1hdCApOworCQkJT1VUX1JJTkcoIHByaW0gfCBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fV0FMS19MSVNUIHwKKwkJCQkgIChzaXplIDw8IFIxMjhfQ0NFX1ZDX0NOVExfTlVNX1NISUZUKSApOworCisJCQlBRFZBTkNFX1JJTkcoKTsKKworCQkJaSArPSAzOworCQl9IHdoaWxlICggaSA8IHNhcmVhX3ByaXYtPm5ib3ggKTsKKwl9CisKKwlpZiAoIGJ1Zl9wcml2LT5kaXNjYXJkICkgeworCQlidWZfcHJpdi0+YWdlID0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2g7CisKKwkJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciBhZ2UgKi8KKwkJQkVHSU5fUklORyggMiApOworCisJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9MQVNUX0RJU1BBVENIX1JFRywgMCApICk7CisJCU9VVF9SSU5HKCBidWZfcHJpdi0+YWdlICk7CisKKwkJQURWQU5DRV9SSU5HKCk7CisKKwkJYnVmLT5wZW5kaW5nID0gMTsKKwkJYnVmLT51c2VkID0gMDsKKwkJLyogRklYTUU6IENoZWNrIGRpc3BhdGNoZWQgZmllbGQgKi8KKwkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoKys7CisKKwlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9VUExPQURfQ0xJUFJFQ1RTOworCXNhcmVhX3ByaXYtPm5ib3ggPSAwOworfQorCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9pbmRpcmVjdCggZHJtX2RldmljZV90ICpkZXYsCisJCQkJCWRybV9idWZfdCAqYnVmLAorCQkJCQlpbnQgc3RhcnQsIGludCBlbmQgKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJpbmRpcmVjdDogYnVmPSVkIHM9MHgleCBlPTB4JXhcbiIsCisJCSAgIGJ1Zi0+aWR4LCBzdGFydCwgZW5kICk7CisKKwlpZiAoIHN0YXJ0ICE9IGVuZCApIHsKKwkJaW50IG9mZnNldCA9IGJ1Zi0+YnVzX2FkZHJlc3MgKyBzdGFydDsKKwkJaW50IGR3b3JkcyA9IChlbmQgLSBzdGFydCArIDMpIC8gc2l6ZW9mKHUzMik7CisKKwkJLyogSW5kaXJlY3QgYnVmZmVyIGRhdGEgbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZgorCQkgKiBkd29yZHMsIHNvIGlmIHdlJ3ZlIGJlZW4gZ2l2ZW4gYW4gb2RkIG51bWJlciB3ZSBtdXN0CisJCSAqIHBhZCB0aGUgZGF0YSB3aXRoIGEgVHlwZS0yIENDRSBwYWNrZXQuCisJCSAqLworCQlpZiAoIGR3b3JkcyAmIDEgKSB7CisJCQl1MzIgKmRhdGEgPSAodTMyICopCisJCQkJKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlCisJCQkJICsgYnVmLT5vZmZzZXQgKyBzdGFydCk7CisJCQlkYXRhW2R3b3JkcysrXSA9IGNwdV90b19sZTMyKCBSMTI4X0NDRV9QQUNLRVQyICk7CisJCX0KKworCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDE7CisKKwkJLyogRmlyZSBvZmYgdGhlIGluZGlyZWN0IGJ1ZmZlciAqLworCQlCRUdJTl9SSU5HKCAzICk7CisKKwkJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X1BNNF9JV19JTkRPRkYsIDEgKSApOworCQlPVVRfUklORyggb2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBkd29yZHMgKTsKKworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGJ1Zl9wcml2LT5kaXNjYXJkICkgeworCQlidWZfcHJpdi0+YWdlID0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2g7CisKKwkJLyogRW1pdCB0aGUgaW5kaXJlY3QgYnVmZmVyIGFnZSAqLworCQlCRUdJTl9SSU5HKCAyICk7CisKKwkJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0xBU1RfRElTUEFUQ0hfUkVHLCAwICkgKTsKKwkJT1VUX1JJTkcoIGJ1Zl9wcml2LT5hZ2UgKTsKKworCQlBRFZBTkNFX1JJTkcoKTsKKworCQlidWYtPnBlbmRpbmcgPSAxOworCQlidWYtPnVzZWQgPSAwOworCQkvKiBGSVhNRTogQ2hlY2sgZGlzcGF0Y2hlZCBmaWVsZCAqLworCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDA7CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2grKzsKK30KKworc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfaW5kaWNlcyggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICAgIGRybV9idWZfdCAqYnVmLAorCQkJCSAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsCisJCQkJICAgICAgIGludCBjb3VudCApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgZm9ybWF0ID0gc2FyZWFfcHJpdi0+dmNfZm9ybWF0OworCWludCBvZmZzZXQgPSBkZXYtPmFncF9idWZmZXJfbWFwLT5vZmZzZXQgLSBkZXZfcHJpdi0+Y2NlX2J1ZmZlcnNfb2Zmc2V0OworCWludCBwcmltID0gYnVmX3ByaXYtPnByaW07CisJdTMyICpkYXRhOworCWludCBkd29yZHM7CisJaW50IGkgPSAwOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggImluZGljZXM6IHM9JWQgZT0lZCBjPSVkXG4iLCBzdGFydCwgZW5kLCBjb3VudCApOworCisJaWYgKCAwICkKKwkJcjEyOF9wcmludF9kaXJ0eSggImRpc3BhdGNoX2luZGljZXMiLCBzYXJlYV9wcml2LT5kaXJ0eSApOworCisJaWYgKCBzdGFydCAhPSBlbmQgKSB7CisJCWJ1Zl9wcml2LT5kaXNwYXRjaGVkID0gMTsKKworCQlpZiAoIHNhcmVhX3ByaXYtPmRpcnR5ICYgflIxMjhfVVBMT0FEX0NMSVBSRUNUUyApIHsKKwkJCXIxMjhfZW1pdF9zdGF0ZSggZGV2X3ByaXYgKTsKKwkJfQorCisJCWR3b3JkcyA9IChlbmQgLSBzdGFydCArIDMpIC8gc2l6ZW9mKHUzMik7CisKKwkJZGF0YSA9ICh1MzIgKikoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUKKwkJCSAgICAgICArIGJ1Zi0+b2Zmc2V0ICsgc3RhcnQpOworCisJCWRhdGFbMF0gPSBjcHVfdG9fbGUzMiggQ0NFX1BBQ0tFVDMoIFIxMjhfM0RfUk5EUl9HRU5fSU5EWF9QUklNLAorCQkJCQkJICAgIGR3b3Jkcy0yICkgKTsKKworCQlkYXRhWzFdID0gY3B1X3RvX2xlMzIoIG9mZnNldCApOworCQlkYXRhWzJdID0gY3B1X3RvX2xlMzIoIFIxMjhfTUFYX1ZCX1ZFUlRTICk7CisJCWRhdGFbM10gPSBjcHVfdG9fbGUzMiggZm9ybWF0ICk7CisJCWRhdGFbNF0gPSBjcHVfdG9fbGUzMiggKHByaW0gfCBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fV0FMS19JTkQgfAorCQkJCQkoY291bnQgPDwgMTYpKSApOworCisJCWlmICggY291bnQgJiAweDEgKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJCQlkYXRhW2R3b3Jkcy0xXSAmPSAweDAwMDBmZmZmOworI2Vsc2UKKwkJCWRhdGFbZHdvcmRzLTFdICY9IDB4ZmZmZjAwMDA7CisjZW5kaWYKKwkJfQorCisJCWRvIHsKKwkJCS8qIEVtaXQgdGhlIG5leHQgc2V0IG9mIHVwIHRvIHRocmVlIGNsaXByZWN0cyAqLworCQkJaWYgKCBpIDwgc2FyZWFfcHJpdi0+bmJveCApIHsKKwkJCQlyMTI4X2VtaXRfY2xpcF9yZWN0cyggZGV2X3ByaXYsCisJCQkJCQkgICAgICAmc2FyZWFfcHJpdi0+Ym94ZXNbaV0sCisJCQkJCQkgICAgICBzYXJlYV9wcml2LT5uYm94IC0gaSApOworCQkJfQorCisJCQlyMTI4X2NjZV9kaXNwYXRjaF9pbmRpcmVjdCggZGV2LCBidWYsIHN0YXJ0LCBlbmQgKTsKKworCQkJaSArPSAzOworCQl9IHdoaWxlICggaSA8IHNhcmVhX3ByaXYtPm5ib3ggKTsKKwl9CisKKwlpZiAoIGJ1Zl9wcml2LT5kaXNjYXJkICkgeworCQlidWZfcHJpdi0+YWdlID0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2g7CisKKwkJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciBhZ2UgKi8KKwkJQkVHSU5fUklORyggMiApOworCisJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9MQVNUX0RJU1BBVENIX1JFRywgMCApICk7CisJCU9VVF9SSU5HKCBidWZfcHJpdi0+YWdlICk7CisKKwkJQURWQU5DRV9SSU5HKCk7CisKKwkJYnVmLT5wZW5kaW5nID0gMTsKKwkJLyogRklYTUU6IENoZWNrIGRpc3BhdGNoZWQgZmllbGQgKi8KKwkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoKys7CisKKwlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9VUExPQURfQ0xJUFJFQ1RTOworCXNhcmVhX3ByaXYtPm5ib3ggPSAwOworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX2JsaXQoIERSTUZJTEUgZmlscCwKKwkJCQkgICBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICBkcm1fcjEyOF9ibGl0X3QgKmJsaXQgKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdCAqYnVmOworCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCXUzMiAqZGF0YTsKKwlpbnQgZHdvcmRfc2hpZnQsIGR3b3JkczsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCS8qIFRoZSBjb21waWxlciB3b24ndCBvcHRpbWl6ZSBhd2F5IGEgZGl2aXNpb24gYnkgYSB2YXJpYWJsZSwKKwkgKiBldmVuIGlmIHRoZSBvbmx5IGxlZ2FsIHZhbHVlcyBhcmUgcG93ZXJzIG9mIHR3by4gIFRodXMsIHdlJ2xsCisJICogdXNlIGEgc2hpZnQgaW5zdGVhZC4KKwkgKi8KKwlzd2l0Y2ggKCBibGl0LT5mb3JtYXQgKSB7CisJY2FzZSBSMTI4X0RBVEFUWVBFX0FSR0I4ODg4OgorCQlkd29yZF9zaGlmdCA9IDA7CisJCWJyZWFrOworCWNhc2UgUjEyOF9EQVRBVFlQRV9BUkdCMTU1NToKKwljYXNlIFIxMjhfREFUQVRZUEVfUkdCNTY1OgorCWNhc2UgUjEyOF9EQVRBVFlQRV9BUkdCNDQ0NDoKKwljYXNlIFIxMjhfREFUQVRZUEVfWVZZVTQyMjoKKwljYXNlIFIxMjhfREFUQVRZUEVfVllVWTQyMjoKKwkJZHdvcmRfc2hpZnQgPSAxOworCQlicmVhazsKKwljYXNlIFIxMjhfREFUQVRZUEVfQ0k4OgorCWNhc2UgUjEyOF9EQVRBVFlQRV9SR0I4OgorCQlkd29yZF9zaGlmdCA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUiggImludmFsaWQgYmxpdCBmb3JtYXQgJWRcbiIsIGJsaXQtPmZvcm1hdCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCS8qIEZsdXNoIHRoZSBwaXhlbCBjYWNoZSwgYW5kIG1hcmsgdGhlIGNvbnRlbnRzIGFzIFJlYWQgSW52YWxpZC4KKwkgKiBUaGlzIGVuc3VyZXMgbm8gcGl4ZWwgZGF0YSBnZXRzIG1peGVkIHVwIHdpdGggdGhlIHRleHR1cmUKKwkgKiBkYXRhIGZyb20gdGhlIGhvc3QgZGF0YSBibGl0LCBvdGhlcndpc2UgcGFydCBvZiB0aGUgdGV4dHVyZQorCSAqIGltYWdlIG1heSBiZSBjb3JydXB0ZWQuCisJICovCisJQkVHSU5fUklORyggMiApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X1BDX0dVSV9DVExTVEFULCAwICkgKTsKKwlPVVRfUklORyggUjEyOF9QQ19SSV9HVUkgfCBSMTI4X1BDX0ZMVVNIX0dVSSApOworCisJQURWQU5DRV9SSU5HKCk7CisKKwkvKiBEaXNwYXRjaCB0aGUgaW5kaXJlY3QgYnVmZmVyLgorCSAqLworCWJ1ZiA9IGRtYS0+YnVmbGlzdFtibGl0LT5pZHhdOworCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCWlmICggYnVmLT5maWxwICE9IGZpbHAgKSB7CisJCURSTV9FUlJPUiggInByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG93bmVkIGJ5ICVwXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGJ1Zi0+cGVuZGluZyApIHsKKwkJRFJNX0VSUk9SKCAic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgYmxpdC0+aWR4ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJYnVmX3ByaXYtPmRpc2NhcmQgPSAxOworCisJZHdvcmRzID0gKGJsaXQtPndpZHRoICogYmxpdC0+aGVpZ2h0KSA+PiBkd29yZF9zaGlmdDsKKworCWRhdGEgPSAodTMyICopKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICsgYnVmLT5vZmZzZXQpOworCisJZGF0YVswXSA9IGNwdV90b19sZTMyKCBDQ0VfUEFDS0VUMyggUjEyOF9DTlRMX0hPU1REQVRBX0JMVCwgZHdvcmRzICsgNiApICk7CisJZGF0YVsxXSA9IGNwdV90b19sZTMyKCAoUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCQlSMTI4X0dNQ19CUlVTSF9OT05FIHwKKwkJCQkoYmxpdC0+Zm9ybWF0IDw8IDgpIHwKKwkJCQlSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJCVIxMjhfUk9QM19TIHwKKwkJCQlSMTI4X0RQX1NSQ19TT1VSQ0VfSE9TVF9EQVRBIHwKKwkJCQlSMTI4X0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCQlSMTI4X0dNQ19BVVhfQ0xJUF9ESVMgfAorCQkJCVIxMjhfR01DX1dSX01TS19ESVMpICk7CisKKwlkYXRhWzJdID0gY3B1X3RvX2xlMzIoIChibGl0LT5waXRjaCA8PCAyMSkgfCAoYmxpdC0+b2Zmc2V0ID4+IDUpICk7CisJZGF0YVszXSA9IGNwdV90b19sZTMyKCAweGZmZmZmZmZmICk7CisJZGF0YVs0XSA9IGNwdV90b19sZTMyKCAweGZmZmZmZmZmICk7CisJZGF0YVs1XSA9IGNwdV90b19sZTMyKCAoYmxpdC0+eSA8PCAxNikgfCBibGl0LT54ICk7CisJZGF0YVs2XSA9IGNwdV90b19sZTMyKCAoYmxpdC0+aGVpZ2h0IDw8IDE2KSB8IGJsaXQtPndpZHRoICk7CisJZGF0YVs3XSA9IGNwdV90b19sZTMyKCBkd29yZHMgKTsKKworCWJ1Zi0+dXNlZCA9IChkd29yZHMgKyA4KSAqIHNpemVvZih1MzIpOworCisJcjEyOF9jY2VfZGlzcGF0Y2hfaW5kaXJlY3QoIGRldiwgYnVmLCAwLCBidWYtPnVzZWQgKTsKKworCS8qIEZsdXNoIHRoZSBwaXhlbCBjYWNoZSBhZnRlciB0aGUgYmxpdCBjb21wbGV0ZXMuICBUaGlzIGVuc3VyZXMKKwkgKiB0aGUgdGV4dHVyZSBkYXRhIGlzIHdyaXR0ZW4gb3V0IHRvIG1lbW9yeSBiZWZvcmUgcmVuZGVyaW5nCisJICogY29udGludWVzLgorCSAqLworCUJFR0lOX1JJTkcoIDIgKTsKKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9QQ19HVUlfQ1RMU1RBVCwgMCApICk7CisJT1VUX1JJTkcoIFIxMjhfUENfRkxVU0hfR1VJICk7CisKKwlBRFZBTkNFX1JJTkcoKTsKKworCXJldHVybiAwOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRpbGVkIGRlcHRoIGJ1ZmZlciBtYW5hZ2VtZW50CisgKgorICogRklYTUU6IFRoZXNlIHNob3VsZCBhbGwgc2V0IHRoZSBkZXN0aW5hdGlvbiB3cml0ZSBtYXNrIGZvciB3aGVuIHdlCisgKiBoYXZlIGhhcmR3YXJlIHN0ZW5jaWwgc3VwcG9ydC4KKyAqLworCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3dyaXRlX3NwYW4oIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCQkgZHJtX3IxMjhfZGVwdGhfdCAqZGVwdGggKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBjb3VudCwgeCwgeTsKKwl1MzIgKmJ1ZmZlcjsKKwl1OCAqbWFzazsKKwlpbnQgaSwgYnVmZmVyX3NpemUsIG1hc2tfc2l6ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWNvdW50ID0gZGVwdGgtPm47CisJaWYgKGNvdW50ID4gNDA5NiB8fCBjb3VudCA8PSAwKQorCQlyZXR1cm4gRFJNX0VSUihFTVNHU0laRSk7CisKKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJngsIGRlcHRoLT54LCBzaXplb2YoeCkgKSApIHsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoICZ5LCBkZXB0aC0+eSwgc2l6ZW9mKHkpICkgKSB7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJYnVmZmVyX3NpemUgPSBkZXB0aC0+biAqIHNpemVvZih1MzIpOworCWJ1ZmZlciA9IGRybV9hbGxvYyggYnVmZmVyX3NpemUsIERSTV9NRU1fQlVGUyApOworCWlmICggYnVmZmVyID09IE5VTEwgKQorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCBidWZmZXIsIGRlcHRoLT5idWZmZXIsIGJ1ZmZlcl9zaXplICkgKSB7CisJCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMpOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCW1hc2tfc2l6ZSA9IGRlcHRoLT5uICogc2l6ZW9mKHU4KTsKKwlpZiAoIGRlcHRoLT5tYXNrICkgeworCQltYXNrID0gZHJtX2FsbG9jKCBtYXNrX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlpZiAoIG1hc2sgPT0gTlVMTCApIHsKKwkJCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCX0KKwkJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoIG1hc2ssIGRlcHRoLT5tYXNrLCBtYXNrX3NpemUgKSApIHsKKwkJCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJCWRybV9mcmVlKCBtYXNrLCBtYXNrX3NpemUsIERSTV9NRU1fQlVGUyApOworCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJfQorCisJCWZvciAoIGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrLCB4KysgKSB7CisJCQlpZiAoIG1hc2tbaV0gKSB7CisJCQkJQkVHSU5fUklORyggNiApOworCisJCQkJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4X0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJCU9VVF9SSU5HKCBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCQkgIFIxMjhfR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKKwkJCQkJICAoZGV2X3ByaXYtPmRlcHRoX2ZtdCA8PCA4KSB8CisJCQkJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkJICBSMTI4X1JPUDNfUCB8CisJCQkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkJCSAgUjEyOF9HTUNfV1JfTVNLX0RJUyApOworCisJCQkJT1VUX1JJTkcoIGRldl9wcml2LT5kZXB0aF9waXRjaF9vZmZzZXRfYyApOworCQkJCU9VVF9SSU5HKCBidWZmZXJbaV0gKTsKKworCQkJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCQkJT1VUX1JJTkcoICgxIDw8IDE2KSB8IDEgKTsKKworCQkJCUFEVkFOQ0VfUklORygpOworCQkJfQorCQl9CisKKwkJZHJtX2ZyZWUoIG1hc2ssIG1hc2tfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJfSBlbHNlIHsKKwkJZm9yICggaSA9IDAgOyBpIDwgY291bnQgOyBpKyssIHgrKyApIHsKKwkJCUJFR0lOX1JJTkcoIDYgKTsKKworCQkJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4X0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJT1VUX1JJTkcoIFIxMjhfR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJICBSMTI4X0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCQkJICAoZGV2X3ByaXYtPmRlcHRoX2ZtdCA8PCA4KSB8CisJCQkJICBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJCSAgUjEyOF9ST1AzX1AgfAorCQkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkJICBSMTI4X0dNQ19XUl9NU0tfRElTICk7CisKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZGVwdGhfcGl0Y2hfb2Zmc2V0X2MgKTsKKwkJCU9VVF9SSU5HKCBidWZmZXJbaV0gKTsKKworCQkJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwkJCU9VVF9SSU5HKCAoMSA8PCAxNikgfCAxICk7CisKKwkJCUFEVkFOQ0VfUklORygpOworCQl9CisJfQorCisJZHJtX2ZyZWUoIGJ1ZmZlciwgYnVmZmVyX3NpemUsIERSTV9NRU1fQlVGUyApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfd3JpdGVfcGl4ZWxzKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJICAgZHJtX3IxMjhfZGVwdGhfdCAqZGVwdGggKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBjb3VudCwgKngsICp5OworCXUzMiAqYnVmZmVyOworCXU4ICptYXNrOworCWludCBpLCB4YnVmX3NpemUsIHlidWZfc2l6ZSwgYnVmZmVyX3NpemUsIG1hc2tfc2l6ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWNvdW50ID0gZGVwdGgtPm47CisJaWYgKGNvdW50ID4gNDA5NiB8fCBjb3VudCA8PSAwKQorCQlyZXR1cm4gRFJNX0VSUihFTVNHU0laRSk7CisKKwl4YnVmX3NpemUgPSBjb3VudCAqIHNpemVvZigqeCk7CisJeWJ1Zl9zaXplID0gY291bnQgKiBzaXplb2YoKnkpOworCXggPSBkcm1fYWxsb2MoIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJaWYgKCB4ID09IE5VTEwgKSB7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCXkgPSBkcm1fYWxsb2MoIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJaWYgKCB5ID09IE5VTEwgKSB7CisJCWRybV9mcmVlKCB4LCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggeCwgZGVwdGgtPngsIHhidWZfc2l6ZSApICkgeworCQlkcm1fZnJlZSggeCwgeGJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJZHJtX2ZyZWUoIHksIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCB5LCBkZXB0aC0+eSwgeGJ1Zl9zaXplICkgKSB7CisJCWRybV9mcmVlKCB4LCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlkcm1fZnJlZSggeSwgeWJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlidWZmZXJfc2l6ZSA9IGRlcHRoLT5uICogc2l6ZW9mKHUzMik7CisJYnVmZmVyID0gZHJtX2FsbG9jKCBidWZmZXJfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJaWYgKCBidWZmZXIgPT0gTlVMTCApIHsKKwkJZHJtX2ZyZWUoIHgsIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCWRybV9mcmVlKCB5LCB5YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggYnVmZmVyLCBkZXB0aC0+YnVmZmVyLCBidWZmZXJfc2l6ZSApICkgeworCQlkcm1fZnJlZSggeCwgeGJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJZHJtX2ZyZWUoIHksIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlpZiAoIGRlcHRoLT5tYXNrICkgeworCQltYXNrX3NpemUgPSBkZXB0aC0+biAqIHNpemVvZih1OCk7CisJCW1hc2sgPSBkcm1fYWxsb2MoIG1hc2tfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCWlmICggbWFzayA9PSBOVUxMICkgeworCQkJZHJtX2ZyZWUoIHgsIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCQlkcm1fZnJlZSggeSwgeWJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCX0KKwkJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoIG1hc2ssIGRlcHRoLT5tYXNrLCBtYXNrX3NpemUgKSApIHsKKwkJCWRybV9mcmVlKCB4LCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyAgKTsKKwkJCWRybV9mcmVlKCB5LCB5YnVmX3NpemUsIERSTV9NRU1fQlVGUyAgKTsKKwkJCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMgICk7CisJCQlkcm1fZnJlZSggbWFzaywgbWFza19zaXplLCBEUk1fTUVNX0JVRlMgICk7CisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQl9CisKKwkJZm9yICggaSA9IDAgOyBpIDwgY291bnQgOyBpKysgKSB7CisJCQlpZiAoIG1hc2tbaV0gKSB7CisJCQkJQkVHSU5fUklORyggNiApOworCisJCQkJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4X0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJCU9VVF9SSU5HKCBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCQkgIFIxMjhfR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKKwkJCQkJICAoZGV2X3ByaXYtPmRlcHRoX2ZtdCA8PCA4KSB8CisJCQkJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkJICBSMTI4X1JPUDNfUCB8CisJCQkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkJCSAgUjEyOF9HTUNfV1JfTVNLX0RJUyApOworCisJCQkJT1VUX1JJTkcoIGRldl9wcml2LT5kZXB0aF9waXRjaF9vZmZzZXRfYyApOworCQkJCU9VVF9SSU5HKCBidWZmZXJbaV0gKTsKKworCQkJCU9VVF9SSU5HKCAoeFtpXSA8PCAxNikgfCB5W2ldICk7CisJCQkJT1VUX1JJTkcoICgxIDw8IDE2KSB8IDEgKTsKKworCQkJCUFEVkFOQ0VfUklORygpOworCQkJfQorCQl9CisKKwkJZHJtX2ZyZWUoIG1hc2ssIG1hc2tfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJfSBlbHNlIHsKKwkJZm9yICggaSA9IDAgOyBpIDwgY291bnQgOyBpKysgKSB7CisJCQlCRUdJTl9SSU5HKCA2ICk7CisKKwkJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMyggUjEyOF9DTlRMX1BBSU5UX01VTFRJLCA0ICkgKTsKKwkJCU9VVF9SSU5HKCBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCSAgUjEyOF9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAorCQkJCSAgKGRldl9wcml2LT5kZXB0aF9mbXQgPDwgOCkgfAorCQkJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkgIFIxMjhfUk9QM19QIHwKKwkJCQkgIFIxMjhfR01DX0NMUl9DTVBfQ05UTF9ESVMgfAorCQkJCSAgUjEyOF9HTUNfV1JfTVNLX0RJUyApOworCisJCQlPVVRfUklORyggZGV2X3ByaXYtPmRlcHRoX3BpdGNoX29mZnNldF9jICk7CisJCQlPVVRfUklORyggYnVmZmVyW2ldICk7CisKKwkJCU9VVF9SSU5HKCAoeFtpXSA8PCAxNikgfCB5W2ldICk7CisJCQlPVVRfUklORyggKDEgPDwgMTYpIHwgMSApOworCisJCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCX0KKworCWRybV9mcmVlKCB4LCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCWRybV9mcmVlKCB5LCB5YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCWRybV9mcmVlKCBidWZmZXIsIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3JlYWRfc3BhbiggZHJtX2RldmljZV90ICpkZXYsCisJCQkJCWRybV9yMTI4X2RlcHRoX3QgKmRlcHRoICkKK3sKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgY291bnQsIHgsIHk7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwljb3VudCA9IGRlcHRoLT5uOworCWlmIChjb3VudCA+IDQwOTYgfHwgY291bnQgPD0gMCkKKwkJcmV0dXJuIERSTV9FUlIoRU1TR1NJWkUpOworCisJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoICZ4LCBkZXB0aC0+eCwgc2l6ZW9mKHgpICkgKSB7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCAmeSwgZGVwdGgtPnksIHNpemVvZih5KSApICkgeworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCUJFR0lOX1JJTkcoIDcgKTsKKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMyggUjEyOF9DTlRMX0JJVEJMVF9NVUxUSSwgNSApICk7CisJT1VUX1JJTkcoIFIxMjhfR01DX1NSQ19QSVRDSF9PRkZTRVRfQ05UTCB8CisJCSAgUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJICBSMTI4X0dNQ19CUlVTSF9OT05FIHwKKwkJICAoZGV2X3ByaXYtPmRlcHRoX2ZtdCA8PCA4KSB8CisJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJICBSMTI4X1JPUDNfUyB8CisJCSAgUjEyOF9EUF9TUkNfU09VUkNFX01FTU9SWSB8CisJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCSAgUjEyOF9HTUNfV1JfTVNLX0RJUyApOworCisJT1VUX1JJTkcoIGRldl9wcml2LT5kZXB0aF9waXRjaF9vZmZzZXRfYyApOworCU9VVF9SSU5HKCBkZXZfcHJpdi0+c3Bhbl9waXRjaF9vZmZzZXRfYyApOworCisJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwlPVVRfUklORyggKDAgPDwgMTYpIHwgMCApOworCU9VVF9SSU5HKCAoY291bnQgPDwgMTYpIHwgMSApOworCisJQURWQU5DRV9SSU5HKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF9yZWFkX3BpeGVscyggZHJtX2RldmljZV90ICpkZXYsCisJCQkJCSAgZHJtX3IxMjhfZGVwdGhfdCAqZGVwdGggKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBjb3VudCwgKngsICp5OworCWludCBpLCB4YnVmX3NpemUsIHlidWZfc2l6ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwljb3VudCA9IGRlcHRoLT5uOworCWlmIChjb3VudCA+IDQwOTYgfHwgY291bnQgPD0gMCkKKwkJcmV0dXJuIERSTV9FUlIoRU1TR1NJWkUpOworCisJaWYgKCBjb3VudCA+IGRldl9wcml2LT5kZXB0aF9waXRjaCApIHsKKwkJY291bnQgPSBkZXZfcHJpdi0+ZGVwdGhfcGl0Y2g7CisJfQorCisJeGJ1Zl9zaXplID0gY291bnQgKiBzaXplb2YoKngpOworCXlidWZfc2l6ZSA9IGNvdW50ICogc2l6ZW9mKCp5KTsKKwl4ID0gZHJtX2FsbG9jKCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCWlmICggeCA9PSBOVUxMICkgeworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKwl5ID0gZHJtX2FsbG9jKCB5YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCWlmICggeSA9PSBOVUxMICkgeworCQlkcm1fZnJlZSggeCwgeGJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoIHgsIGRlcHRoLT54LCB4YnVmX3NpemUgKSApIHsKKwkJZHJtX2ZyZWUoIHgsIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCWRybV9mcmVlKCB5LCB5YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggeSwgZGVwdGgtPnksIHlidWZfc2l6ZSApICkgeworCQlkcm1fZnJlZSggeCwgeGJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJZHJtX2ZyZWUoIHksIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJZm9yICggaSA9IDAgOyBpIDwgY291bnQgOyBpKysgKSB7CisJCUJFR0lOX1JJTkcoIDcgKTsKKworCQlPVVRfUklORyggQ0NFX1BBQ0tFVDMoIFIxMjhfQ05UTF9CSVRCTFRfTVVMVEksIDUgKSApOworCQlPVVRfUklORyggUjEyOF9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCSAgUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCSAgUjEyOF9HTUNfQlJVU0hfTk9ORSB8CisJCQkgIChkZXZfcHJpdi0+ZGVwdGhfZm10IDw8IDgpIHwKKwkJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCSAgUjEyOF9ST1AzX1MgfAorCQkJICBSMTI4X0RQX1NSQ19TT1VSQ0VfTUVNT1JZIHwKKwkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkgIFIxMjhfR01DX1dSX01TS19ESVMgKTsKKworCQlPVVRfUklORyggZGV2X3ByaXYtPmRlcHRoX3BpdGNoX29mZnNldF9jICk7CisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+c3Bhbl9waXRjaF9vZmZzZXRfYyApOworCisJCU9VVF9SSU5HKCAoeFtpXSA8PCAxNikgfCB5W2ldICk7CisJCU9VVF9SSU5HKCAoaSA8PCAxNikgfCAwICk7CisJCU9VVF9SSU5HKCAoMSA8PCAxNikgfCAxICk7CisKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJZHJtX2ZyZWUoIHgsIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJZHJtX2ZyZWUoIHksIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQb2x5Z29uIHN0aXBwbGUKKyAqLworCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9zdGlwcGxlKCBkcm1fZGV2aWNlX3QgKmRldiwgdTMyICpzdGlwcGxlICkKK3sKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlCRUdJTl9SSU5HKCAzMyApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0JSVVNIX0RBVEEwLCAzMSApICk7CisJZm9yICggaSA9IDAgOyBpIDwgMzIgOyBpKysgKSB7CisJCU9VVF9SSU5HKCBzdGlwcGxlW2ldICk7CisJfQorCisJQURWQU5DRV9SSU5HKCk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSU9DVEwgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCByMTI4X2NjZV9jbGVhciggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9yMTI4X2NsZWFyX3QgY2xlYXI7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBjbGVhciwgKGRybV9yMTI4X2NsZWFyX3QgX191c2VyICopIGRhdGEsCisJCQkgICAgIHNpemVvZihjbGVhcikgKTsKKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWlmICggc2FyZWFfcHJpdi0+bmJveCA+IFIxMjhfTlJfU0FSRUFfQ0xJUFJFQ1RTICkKKwkJc2FyZWFfcHJpdi0+bmJveCA9IFIxMjhfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJcjEyOF9jY2VfZGlzcGF0Y2hfY2xlYXIoIGRldiwgJmNsZWFyICk7CisJQ09NTUlUX1JJTkcoKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCisJICovCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmRpcnR5IHw9IFIxMjhfVVBMT0FEX0NPTlRFWFQgfCBSMTI4X1VQTE9BRF9NQVNLUzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIxMjhfZG9faW5pdF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCURSTV9ERUJVRyggIlxuIiApOworCisJZGV2X3ByaXYtPmNydGNfb2Zmc2V0ID0gICAgICBSMTI4X1JFQUQoIFIxMjhfQ1JUQ19PRkZTRVQgKTsKKwlkZXZfcHJpdi0+Y3J0Y19vZmZzZXRfY250bCA9IFIxMjhfUkVBRCggUjEyOF9DUlRDX09GRlNFVF9DTlRMICk7CisKKwlSMTI4X1dSSVRFKCBSMTI4X0NSVENfT0ZGU0VULCBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICk7CisJUjEyOF9XUklURSggUjEyOF9DUlRDX09GRlNFVF9DTlRMLAorCQkgICAgZGV2X3ByaXYtPmNydGNfb2Zmc2V0X2NudGwgfCBSMTI4X0NSVENfT0ZGU0VUX0ZMSVBfQ05UTCApOworCisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAxOworCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKKworCXJldHVybiAwOworfQorCitpbnQgcjEyOF9kb19jbGVhbnVwX3BhZ2VmbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlSMTI4X1dSSVRFKCBSMTI4X0NSVENfT0ZGU0VULCAgICAgIGRldl9wcml2LT5jcnRjX29mZnNldCApOworCVIxMjhfV1JJVEUoIFIxMjhfQ1JUQ19PRkZTRVRfQ05UTCwgZGV2X3ByaXYtPmNydGNfb2Zmc2V0X2NudGwgKTsKKworCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlICE9IDApIHsKKwkJcjEyOF9jY2VfZGlzcGF0Y2hfZmxpcCggZGV2ICk7CisJCUNPTU1JVF9SSU5HKCk7CisJfQorCisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAwOworCXJldHVybiAwOworfQorCisvKiBTd2FwcGluZyBhbmQgZmxpcHBpbmcgYXJlIGRpZmZlcmVudCBvcGVyYXRpb25zLCBuZWVkIGRpZmZlcmVudCBpb2N0bHMuCisgKiBUaGV5IGNhbiAmIHNob3VsZCBiZSBpbnRlcm1peGVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgM2Qgd2luZG93cy4gIAorICovCisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZmxpcCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWlmICghZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcpIAorCQlyMTI4X2RvX2luaXRfcGFnZWZsaXAoIGRldiApOworCisJcjEyOF9jY2VfZGlzcGF0Y2hfZmxpcCggZGV2ICk7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX3N3YXAoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJaWYgKCBzYXJlYV9wcml2LT5uYm94ID4gUjEyOF9OUl9TQVJFQV9DTElQUkVDVFMgKQorCQlzYXJlYV9wcml2LT5uYm94ID0gUjEyOF9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlyMTI4X2NjZV9kaXNwYXRjaF9zd2FwKCBkZXYgKTsKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+ZGlydHkgfD0gKFIxMjhfVVBMT0FEX0NPTlRFWFQgfAorCQkJCQlSMTI4X1VQTE9BRF9NQVNLUyk7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX3ZlcnRleCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJZHJtX3IxMjhfdmVydGV4X3QgdmVydGV4OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCB2ZXJ0ZXgsIChkcm1fcjEyOF92ZXJ0ZXhfdCBfX3VzZXIgKikgZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHZlcnRleCkgKTsKKworCURSTV9ERUJVRyggInBpZD0lZCBpbmRleD0lZCBjb3VudD0lZCBkaXNjYXJkPSVkXG4iLAorCQkgICBEUk1fQ1VSUkVOVFBJRCwKKwkJICAgdmVydGV4LmlkeCwgdmVydGV4LmNvdW50LCB2ZXJ0ZXguZGlzY2FyZCApOworCisJaWYgKCB2ZXJ0ZXguaWR4IDwgMCB8fCB2ZXJ0ZXguaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkgICB2ZXJ0ZXguaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCB2ZXJ0ZXgucHJpbSA8IDAgfHwKKwkgICAgIHZlcnRleC5wcmltID4gUjEyOF9DQ0VfVkNfQ05UTF9QUklNX1RZUEVfVFJJX1RZUEUyICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgcHJpbSAlZFxuIiwgdmVydGV4LnByaW0gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlidWYgPSBkbWEtPmJ1Zmxpc3RbdmVydGV4LmlkeF07CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJRFJNX0VSUk9SKCAicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggYnVmLT5wZW5kaW5nICkgeworCQlEUk1fRVJST1IoICJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCB2ZXJ0ZXguaWR4ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJYnVmLT51c2VkID0gdmVydGV4LmNvdW50OworCWJ1Zl9wcml2LT5wcmltID0gdmVydGV4LnByaW07CisJYnVmX3ByaXYtPmRpc2NhcmQgPSB2ZXJ0ZXguZGlzY2FyZDsKKworCXIxMjhfY2NlX2Rpc3BhdGNoX3ZlcnRleCggZGV2LCBidWYgKTsKKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfaW5kaWNlcyggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJZHJtX3IxMjhfaW5kaWNlc190IGVsdHM7CisJaW50IGNvdW50OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBlbHRzLCAoZHJtX3IxMjhfaW5kaWNlc190IF9fdXNlciAqKSBkYXRhLAorCQkJICAgICBzaXplb2YoZWx0cykgKTsKKworCURSTV9ERUJVRyggInBpZD0lZCBidWY9JWQgcz0lZCBlPSVkIGQ9JWRcbiIsIERSTV9DVVJSRU5UUElELAorCQkgICBlbHRzLmlkeCwgZWx0cy5zdGFydCwgZWx0cy5lbmQsIGVsdHMuZGlzY2FyZCApOworCisJaWYgKCBlbHRzLmlkeCA8IDAgfHwgZWx0cy5pZHggPj0gZG1hLT5idWZfY291bnQgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCSAgIGVsdHMuaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCBlbHRzLnByaW0gPCAwIHx8CisJICAgICBlbHRzLnByaW0gPiBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9UUklfVFlQRTIgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBwcmltICVkXG4iLCBlbHRzLnByaW0gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlidWYgPSBkbWEtPmJ1Zmxpc3RbZWx0cy5pZHhdOworCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCWlmICggYnVmLT5maWxwICE9IGZpbHAgKSB7CisJCURSTV9FUlJPUiggInByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG93bmVkIGJ5ICVwXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGJ1Zi0+cGVuZGluZyApIHsKKwkJRFJNX0VSUk9SKCAic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgZWx0cy5pZHggKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwljb3VudCA9IChlbHRzLmVuZCAtIGVsdHMuc3RhcnQpIC8gc2l6ZW9mKHUxNik7CisJZWx0cy5zdGFydCAtPSBSMTI4X0lOREVYX1BSSU1fT0ZGU0VUOworCisJaWYgKCBlbHRzLnN0YXJ0ICYgMHg3ICkgeworCQlEUk1fRVJST1IoICJtaXNhbGlnbmVkIGJ1ZmZlciAweCV4XG4iLCBlbHRzLnN0YXJ0ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggZWx0cy5zdGFydCA8IGJ1Zi0+dXNlZCApIHsKKwkJRFJNX0VSUk9SKCAibm8gaGVhZGVyIDB4JXggLSAweCV4XG4iLCBlbHRzLnN0YXJ0LCBidWYtPnVzZWQgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlidWYtPnVzZWQgPSBlbHRzLmVuZDsKKwlidWZfcHJpdi0+cHJpbSA9IGVsdHMucHJpbTsKKwlidWZfcHJpdi0+ZGlzY2FyZCA9IGVsdHMuZGlzY2FyZDsKKworCXIxMjhfY2NlX2Rpc3BhdGNoX2luZGljZXMoIGRldiwgYnVmLCBlbHRzLnN0YXJ0LCBlbHRzLmVuZCwgY291bnQgKTsKKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfYmxpdCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfYmxpdF90IGJsaXQ7CisJaW50IHJldDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGJsaXQsIChkcm1fcjEyOF9ibGl0X3QgX191c2VyICopIGRhdGEsCisJCQkgICAgIHNpemVvZihibGl0KSApOworCisJRFJNX0RFQlVHKCAicGlkPSVkIGluZGV4PSVkXG4iLCBEUk1fQ1VSUkVOVFBJRCwgYmxpdC5pZHggKTsKKworCWlmICggYmxpdC5pZHggPCAwIHx8IGJsaXQuaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkgICBibGl0LmlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJcmV0ID0gcjEyOF9jY2VfZGlzcGF0Y2hfYmxpdCggZmlscCwgZGV2LCAmYmxpdCApOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX2RlcHRoKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9kZXB0aF90IGRlcHRoOworCWludCByZXQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBkZXB0aCwgKGRybV9yMTI4X2RlcHRoX3QgX191c2VyICopIGRhdGEsCisJCQkgICAgIHNpemVvZihkZXB0aCkgKTsKKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCXJldCA9IERSTV9FUlIoRUlOVkFMKTsKKwlzd2l0Y2ggKCBkZXB0aC5mdW5jICkgeworCWNhc2UgUjEyOF9XUklURV9TUEFOOgorCQlyZXQgPSByMTI4X2NjZV9kaXNwYXRjaF93cml0ZV9zcGFuKCBkZXYsICZkZXB0aCApOworCWNhc2UgUjEyOF9XUklURV9QSVhFTFM6CisJCXJldCA9IHIxMjhfY2NlX2Rpc3BhdGNoX3dyaXRlX3BpeGVscyggZGV2LCAmZGVwdGggKTsKKwljYXNlIFIxMjhfUkVBRF9TUEFOOgorCQlyZXQgPSByMTI4X2NjZV9kaXNwYXRjaF9yZWFkX3NwYW4oIGRldiwgJmRlcHRoICk7CisJY2FzZSBSMTI4X1JFQURfUElYRUxTOgorCQlyZXQgPSByMTI4X2NjZV9kaXNwYXRjaF9yZWFkX3BpeGVscyggZGV2LCAmZGVwdGggKTsKKwl9CisKKwlDT01NSVRfUklORygpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2Vfc3RpcHBsZSggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfc3RpcHBsZV90IHN0aXBwbGU7CisJdTMyIG1hc2tbMzJdOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggc3RpcHBsZSwgKGRybV9yMTI4X3N0aXBwbGVfdCBfX3VzZXIgKikgZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHN0aXBwbGUpICk7CisKKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJm1hc2ssIHN0aXBwbGUubWFzaywKKwkJCSAgICAgMzIgKiBzaXplb2YodTMyKSApICkKKwkJcmV0dXJuIERSTV9FUlIoIEVGQVVMVCApOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJcjEyOF9jY2VfZGlzcGF0Y2hfc3RpcHBsZSggZGV2LCBtYXNrICk7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX2luZGlyZWN0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fcjEyOF9pbmRpcmVjdF90IGluZGlyZWN0OworI2lmIDAKKwlSSU5HX0xPQ0FMUzsKKyNlbmRpZgorCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBpbmRpcmVjdCwgKGRybV9yMTI4X2luZGlyZWN0X3QgX191c2VyICopIGRhdGEsCisJCQkgICAgIHNpemVvZihpbmRpcmVjdCkgKTsKKworCURSTV9ERUJVRyggImluZGlyZWN0OiBpZHg9JWQgcz0lZCBlPSVkIGQ9JWRcbiIsCisJCSAgIGluZGlyZWN0LmlkeCwgaW5kaXJlY3Quc3RhcnQsCisJCSAgIGluZGlyZWN0LmVuZCwgaW5kaXJlY3QuZGlzY2FyZCApOworCisJaWYgKCBpbmRpcmVjdC5pZHggPCAwIHx8IGluZGlyZWN0LmlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJRFJNX0VSUk9SKCAiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJICAgaW5kaXJlY3QuaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlidWYgPSBkbWEtPmJ1Zmxpc3RbaW5kaXJlY3QuaWR4XTsKKwlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoIGJ1Zi0+ZmlscCAhPSBmaWxwICkgeworCQlEUk1fRVJST1IoICJwcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBvd25lZCBieSAlcFxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBidWYtPmZpbHAgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCBidWYtPnBlbmRpbmcgKSB7CisJCURSTV9FUlJPUiggInNlbmRpbmcgcGVuZGluZyBidWZmZXIgJWRcbiIsIGluZGlyZWN0LmlkeCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmICggaW5kaXJlY3Quc3RhcnQgPCBidWYtPnVzZWQgKSB7CisJCURSTV9FUlJPUiggInJldXNpbmcgaW5kaXJlY3Q6IHN0YXJ0PTB4JXggYWN0dWFsPTB4JXhcbiIsCisJCQkgICBpbmRpcmVjdC5zdGFydCwgYnVmLT51c2VkICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJYnVmLT51c2VkID0gaW5kaXJlY3QuZW5kOworCWJ1Zl9wcml2LT5kaXNjYXJkID0gaW5kaXJlY3QuZGlzY2FyZDsKKworI2lmIDAKKwkvKiBXYWl0IGZvciB0aGUgM0Qgc3RyZWFtIHRvIGlkbGUgYmVmb3JlIHRoZSBpbmRpcmVjdCBidWZmZXIKKwkgKiBjb250YWluaW5nIDJEIGFjY2VsZXJhdGlvbiBjb21tYW5kcyBpcyBwcm9jZXNzZWQuCisJICovCisJQkVHSU5fUklORyggMiApOworCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKKwlBRFZBTkNFX1JJTkcoKTsKKyNlbmRpZgorCisJLyogRGlzcGF0Y2ggdGhlIGluZGlyZWN0IGJ1ZmZlciBmdWxsIG9mIGNvbW1hbmRzIGZyb20gdGhlCisJICogWCBzZXJ2ZXIuICBUaGlzIGlzIGluc2VjdXJlIGFuZCBpcyB0aHVzIG9ubHkgYXZhaWxhYmxlIHRvCisJICogcHJpdmlsZWdlZCBjbGllbnRzLgorCSAqLworCXIxMjhfY2NlX2Rpc3BhdGNoX2luZGlyZWN0KCBkZXYsIGJ1ZiwgaW5kaXJlY3Quc3RhcnQsIGluZGlyZWN0LmVuZCApOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByMTI4X2dldHBhcmFtKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9nZXRwYXJhbV90IHBhcmFtOworCWludCB2YWx1ZTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBwYXJhbSwgKGRybV9yMTI4X2dldHBhcmFtX3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHBhcmFtKSApOworCisJRFJNX0RFQlVHKCAicGlkPSVkXG4iLCBEUk1fQ1VSUkVOVFBJRCApOworCisJc3dpdGNoKCBwYXJhbS5wYXJhbSApIHsKKwljYXNlIFIxMjhfUEFSQU1fSVJRX05SOgorCQl2YWx1ZSA9IGRldi0+aXJxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmICggRFJNX0NPUFlfVE9fVVNFUiggcGFyYW0udmFsdWUsICZ2YWx1ZSwgc2l6ZW9mKGludCkgKSApIHsKKwkJRFJNX0VSUk9SKCAiY29weV90b191c2VyXG4iICk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCQorCXJldHVybiAwOworfQorCit2b2lkIHIxMjhfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCkKK3sKKwlpZiAoIGRldi0+ZGV2X3ByaXZhdGUgKSB7CisJCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCQlpZiAoIGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICkgeworCQkJcjEyOF9kb19jbGVhbnVwX3BhZ2VmbGlwKCBkZXYgKTsKKwkJfQorCX0JCQkKK30KKwordm9pZCByMTI4X2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKK30KKworZHJtX2lvY3RsX2Rlc2NfdCByMTI4X2lvY3Rsc1tdID0geworCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfSU5JVCldICAgICAgID0geyByMTI4X2NjZV9pbml0LCAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0NFX1NUQVJUKV0gID0geyByMTI4X2NjZV9zdGFydCwgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0NFX1NUT1ApXSAgID0geyByMTI4X2NjZV9zdG9wLCAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0NFX1JFU0VUKV0gID0geyByMTI4X2NjZV9yZXNldCwgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0NFX0lETEUpXSAgID0geyByMTI4X2NjZV9pZGxlLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfUkVTRVQpXSAgICAgID0geyByMTI4X2VuZ2luZV9yZXNldCwgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfRlVMTFNDUkVFTildID0geyByMTI4X2Z1bGxzY3JlZW4sICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfU1dBUCldICAgICAgID0geyByMTI4X2NjZV9zd2FwLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfRkxJUCldICAgICAgID0geyByMTI4X2NjZV9mbGlwLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0xFQVIpXSAgICAgID0geyByMTI4X2NjZV9jbGVhciwgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfVkVSVEVYKV0gICAgID0geyByMTI4X2NjZV92ZXJ0ZXgsICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfSU5ESUNFUyldICAgID0geyByMTI4X2NjZV9pbmRpY2VzLCAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQkxJVCldICAgICAgID0geyByMTI4X2NjZV9ibGl0LCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfREVQVEgpXSAgICAgID0geyByMTI4X2NjZV9kZXB0aCwgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfU1RJUFBMRSldICAgID0geyByMTI4X2NjZV9zdGlwcGxlLCAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfSU5ESVJFQ1QpXSAgID0geyByMTI4X2NjZV9pbmRpcmVjdCwgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfR0VUUEFSQU0pXSAgID0geyByMTI4X2dldHBhcmFtLCAxLCAwIH0sCit9OworCitpbnQgcjEyOF9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShyMTI4X2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGJjZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYwpAQCAtMCwwICsxLDIwNjEgQEAKKy8qIHJhZGVvbl9jcC5jIC0tIENQIHN1cHBvcnQgZm9yIFJhZGVvbiAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBGcmVtb250LCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKKworI2RlZmluZSBSQURFT05fRklGT19ERUJVRwkwCisKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2NsZWFudXBfY3AoIGRybV9kZXZpY2VfdCAqZGV2ICk7CisKKy8qIENQIG1pY3JvY29kZSAoZnJvbSBBVEkpICovCitzdGF0aWMgdTMyIFIyMDBfY3BfbWljcm9jb2RlW11bMl0gPSB7CisJeyAweDIxMDA3MDAwLCAwMDAwMDAwMDAwIH0sICAgICAgICAKKwl7IDB4MjAwMDcwMDAsIDAwMDAwMDAwMDAgfSwgCisJeyAweDAwMDAwMGFiLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMGFmLCAweDAwMDAwMDA0IH0sCisJeyAweDY2NTQ0YTQ5LCAwMDAwMDAwMDAwIH0sCisJeyAweDQ5NDk0MTc0LCAwMDAwMDAwMDAwIH0sCisJeyAweDU0NTE3ZDgzLCAwMDAwMDAwMDAwIH0sCisJeyAweDQ5OGQ4YjY0LCAwMDAwMDAwMDAwIH0sCisJeyAweDQ5NDk0OTQ5LCAwMDAwMDAwMDAwIH0sCisJeyAweDQ5ZGE0OTNjLCAwMDAwMDAwMDAwIH0sCisJeyAweDQ5OTg5ODk4LCAwMDAwMDAwMDAwIH0sCisJeyAweGQzNDk0OWQ1LCAwMDAwMDAwMDAwIH0sCisJeyAweDlkYzkwZTExLCAwMDAwMDAwMDAwIH0sCisJeyAweGNlOWI5YjliLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMGYwMDAwLCAweDAwMDAwMDE2IH0sCisJeyAweDM1MmUyMzJjLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMDEzLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGYwMDAwLCAweDAwMDAwMDE2IH0sCisJeyAweDM1MmUyNzJjLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMGYwMDAxLCAweDAwMDAwMDE2IH0sCisJeyAweDMyMzkzNjJmLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA3N2VmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDIwLCAweDAwMDAwMDFhIH0sCisJeyAweDAwMDA0MDAwLCAweDAwMDAwMDFlIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDIwLCAweDAwMDAwMDFhIH0sCisJeyAweDAwMDA0MDAwLCAweDAwMDAwMDFlIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDIwLCAweDAwMDAwMDFhIH0sCisJeyAweDAwMDA0MDAwLCAweDAwMDAwMDFlIH0sCisJeyAweDAwMDAwMDE2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDM4MDJhLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDA2N2UwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDE2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3N2UwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAzN2UxLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDA2N2UxLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDA3N2UwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3N2UxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3N2UxLCAweDAwMDAwMDA2IH0sCisJeyAweGZmZmZmZmZmLCAwMDAwMDAwMDAwIH0sCisJeyAweDEwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDM4MDJhLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDA2N2UwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDA3Njc1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc3LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc4LCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDM4MDJiLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNjc2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc3LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc4LCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDAwMDJlLCAweDAwMDAwMDE4IH0sCisJeyAweDAwMDAwMDJlLCAweDAwMDAwMDE4IH0sCisJeyAwMDAwMDAwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDAwMDJmLCAweDAwMDAwMDE4IH0sCisJeyAweDAwMDAwMDJmLCAweDAwMDAwMDE4IH0sCisJeyAwMDAwMDAwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAxNjA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDk4MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDY0YzA2MDNkLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDgwMDAwLCAweDAwMDAwMDE2IH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDA0MDAyNTFkLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTgwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY3NTgxLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNTgwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY3NTgxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDQ2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA1MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTBlLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDE5MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDExMDU1LCAweDAwMDAwMDE0IH0sCisJeyAweDAwMDAwMDU1LCAweDAwMDAwMDEyIH0sCisJeyAweDA0MDAyNTBmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA1MDRhLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3NTY1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTY2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDUxLCAweDAwMDAwMDA0IH0sCisJeyAweDAxZTY1NWI0LCAweDAwMDAwMDAyIH0sCisJeyAweDQ0MDFiMGRjLCAweDAwMDAwMDAyIH0sCisJeyAweDAxYzExMGRjLCAweDAwMDAwMDAyIH0sCisJeyAweDI2NjY3MDVkLCAweDAwMDAwMDE4IH0sCisJeyAweDA0MGMyNTY1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDVkLCAweDAwMDAwMDE4IH0sCisJeyAweDA0MDAyNTY0LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTY2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDU0LCAweDAwMDAwMDA0IH0sCisJeyAweDAwNDAxMDYwLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMTAxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGQ4MGZmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwODAwMDYzLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMGY5MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGUwMGZmLCAweDAwMDAwMDAyIH0sCisJeyAwMDAwMDAwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDAwMDgwLCAweDAwMDAwMDE4IH0sCisJeyAweDAwMDAwMDU0LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3NTc2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA5MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDQxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDBjMDAzNTBlLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDQ5MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDUxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAxZTc4NWY4LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMjAwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjAwMDczLCAweDAwMDAwMDBjIH0sCisJeyAweDAwMDA3NTYzLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjA3NWYwLCAweDAwMDAwMDIxIH0sCisJeyAweDIwMDA3MDY4LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA1MDY4LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3NTc2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTc3LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTBlLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTBmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwYTA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjAwMDc2LCAweDAwMDAwMDBjIH0sCisJeyAweDAwNjA3NWYwLCAweDAwMDAwMDIxIH0sCisJeyAweDAwMDA3NWY4LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDc2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGE3NTBlLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMjA3NTBmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjAwMDc5LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3NTcwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTcxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTcyLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwYTA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTY4LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDg0LCAweDAwMDAwMDBjIH0sCisJeyAweDAwMDU4MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDBjNjA3NTYyLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDg2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwNjAwMDg1LCAweDAwMDAwMDA0IH0sCisJeyAweDQwMDA3MGRkLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDM4MGRkLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDkzLCAweDAwMDAwMDFjIH0sCisJeyAweDAwMDY1MDk1LCAweDAwMDAwMDE4IH0sCisJeyAweDA0MDAyNWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDk2LCAweDAwMDAwMDE4IH0sCisJeyAweDA0MDA3NWJjLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA3NWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NWJjLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDkwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDkwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGQ4MDAyLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3ODIxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3ODAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA3ODIxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3ODAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAxNjY1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGEwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY3MWNjLCAweDAwMDAwMDAyIH0sCisJeyAweDAyODZmMWNkLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMGEzLCAweDAwMDAwMDEwIH0sCisJeyAweDIxMDA3MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMGFhLCAweDAwMDAwMDFjIH0sCisJeyAweDAwMDY1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGEwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGIwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDM4MDY3MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGEwMGE2LCAweDAwMDAwMDA0IH0sCisJeyAweDIwMDA3MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAxMjAwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDIwMDc3MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAxMjAwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDIwMDA3MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAxMjA3NTFiLCAweDAwMDAwMDAyIH0sCisJeyAweDgwNDA3NTBhLCAweDAwMDAwMDAyIH0sCisJeyAweDgwNDA3NTBiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMTEwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDM4MGRkLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMGJkLCAweDAwMDAwMDFjIH0sCisJeyAweDAwMDYxMDk2LCAweDAwMDAwMDE4IH0sCisJeyAweDg0NDA3NWJkLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDk1LCAweDAwMDAwMDE4IH0sCisJeyAweDg0MDA3NWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDk2LCAweDAwMDAwMDE4IH0sCisJeyAweDg0NDA3NWJjLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMGMwLCAweDAwMDAwMDA0IH0sCisJeyAweDgwNDA3NWJkLCAweDAwMDAwMDAyIH0sCisJeyAweDgwMDA3NWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDgwNDA3NWJjLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMTA4MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAxNDAwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjAwMGM0LCAweDAwMDAwMDBjIH0sCisJeyAweDIwYzA3MDAwLCAweDAwMDAwMDIwIH0sCisJeyAweDAwMDAwMGM2LCAweDAwMDAwMDEyIH0sCisJeyAweDAwODAwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwODA3NTFkLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDAyNWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA0MGMwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3NzVjLCAweDAwMDAwMDAyIH0sCisJeyAweDAwYTA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDA0NjAyNzVkLCAweDAwMDAwMDIwIH0sCisJeyAweDAwMDA0MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA3OTk5LCAweDAwMDAwMDAyIH0sCisJeyAweDAwYTA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDA0NjAyOTliLCAweDAwMDAwMDIwIH0sCisJeyAweDAwMDA0MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAxZTAwODMwLCAweDAwMDAwMDAyIH0sCisJeyAweDIxMDA3MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDM4MDQyLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNWUwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NWUxLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMDAxLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDM4MGQ5LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDA3Mzk0LCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCit9OworCisKK3N0YXRpYyB1MzIgcmFkZW9uX2NwX21pY3JvY29kZVtdWzJdID0geworCXsgMHgyMTAwNzAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgyMDAwNzAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDBiNCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDBiOCwgMHgwMDAwMDAwNCB9LAorCXsgMHg2ZjViNGQ0YywgMDAwMDAwMDAwMCB9LAorCXsgMHg0YzRjNDI3ZiwgMDAwMDAwMDAwMCB9LAorCXsgMHg1YjU2OGE5MiwgMDAwMDAwMDAwMCB9LAorCXsgMHg0Y2EwOWM2ZCwgMDAwMDAwMDAwMCB9LAorCXsgMHhhZDRjNGM0YywgMDAwMDAwMDAwMCB9LAorCXsgMHg0Y2UxYWYzZCwgMDAwMDAwMDAwMCB9LAorCXsgMHhkOGFmYWZhZiwgMDAwMDAwMDAwMCB9LAorCXsgMHhkNjRjNGNkYywgMDAwMDAwMDAwMCB9LAorCXsgMHg0Y2QxMGQxMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDBmMDAwMCwgMHgwMDAwMDAxNiB9LAorCXsgMHgzNjJmMjQyZCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDAxMiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBmMDAwMCwgMHgwMDAwMDAxNiB9LAorCXsgMHgzNjJmMjgyZCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAzODBlNywgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMmM5NywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDBmMDAwMSwgMHgwMDAwMDAxNiB9LAorCXsgMHgzMzNhMzczMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwNzdlZiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDAyMSwgMHgwMDAwMDAxYSB9LAorCXsgMHgwMDAwNDAwMCwgMHgwMDAwMDAxZSB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDAyMSwgMHgwMDAwMDAxYSB9LAorCXsgMHgwMDAwNDAwMCwgMHgwMDAwMDAxZSB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDAyMSwgMHgwMDAwMDAxYSB9LAorCXsgMHgwMDAwNDAwMCwgMHgwMDAwMDAxZSB9LAorCXsgMHgwMDAwMDAxNywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODAyYiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwNjdlMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDAxNywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwNzdlMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2NTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMzdlMSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwNjdlMSwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAwNzdlMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzdlMSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzdlMSwgMHgwMDAwMDAwNiB9LAorCXsgMHhmZmZmZmZmZiwgMDAwMDAwMDAwMCB9LAorCXsgMHgxMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAzODAyYiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwNjdlMCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAwNzY3NSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzY3NiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzY3NywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzY3OCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAzODAyYywgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjY3NiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzY3NywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzY3OCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAwMDAyZiwgMHgwMDAwMDAxOCB9LAorCXsgMHgwMDAwMDAyZiwgMHgwMDAwMDAxOCB9LAorCXsgMDAwMDAwMDAwMCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAwMDAzMCwgMHgwMDAwMDAxOCB9LAorCXsgMHgwMDAwMDAzMCwgMHgwMDAwMDAxOCB9LAorCXsgMDAwMDAwMDAwMCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMTYwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2NTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA5ODAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHg2NGMwNjAzZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA4MDAwMCwgMHgwMDAwMDAxNiB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwNDAwMjUxZCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU4MCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2NzU4MSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjU4MCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2NzU4MSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA0OSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwNTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzUwZSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAxOTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAxMTA1NSwgMHgwMDAwMDAxNCB9LAorCXsgMHgwMDAwMDA1NSwgMHgwMDAwMDAxMiB9LAorCXsgMHgwNDAwMjUwZiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNTA0ZiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU2NSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU2NiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA1OCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMWU2NTViNCwgMHgwMDAwMDAwMiB9LAorCXsgMHg0NDAxYjBlNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMWMxMTBlNCwgMHgwMDAwMDAwMiB9LAorCXsgMHgyNjY2NzA2NiwgMHgwMDAwMDAxOCB9LAorCXsgMHgwNDBjMjU2NSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA2NiwgMHgwMDAwMDAxOCB9LAorCXsgMHgwNDAwMjU2NCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU2NiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA1ZCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDQwMTA2OSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDEwMTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDBkODBmZiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDgwMDA2YywgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDBmOTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDBlMDBmZiwgMHgwMDAwMDAwMiB9LAorCXsgMDAwMDAwMDAwMCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAwMDA4ZiwgMHgwMDAwMDAxOCB9LAorCXsgMHgwMDAwMDA1YiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU3NiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2NTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwOTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA0MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwYzAwMzUwZSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA0OTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA1MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMWU3ODVmOCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDIwMDAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDYwMDA3ZSwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDAwNzU2MywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDYwNzVmMCwgMHgwMDAwMDAyMSB9LAorCXsgMHgyMDAwNzA3MywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwNTA3MywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU3NiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU3NywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzUwZSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzUwZiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMGEwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDYwMDA4MywgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDYwNzVmMCwgMHgwMDAwMDAyMSB9LAorCXsgMHgwMDAwNzVmOCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA4MywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBhNzUwZSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDIwNzUwZiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDYwMDA4NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwNzU3MCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU3MSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU3MiwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMGEwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzU2OCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA5NSwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDA1ODAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwYzYwNzU2MiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDA5NywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDYwMDA5NiwgMHgwMDAwMDAwNCB9LAorCXsgMHg0MDAwNzBlNSwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAzODBlNiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVjNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAzODBlNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDBhOCwgMHgwMDAwMDAxYyB9LAorCXsgMHgwMDA2NTBhYSwgMHgwMDAwMDAxOCB9LAorCXsgMHgwNDAwMjViYiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTBhYiwgMHgwMDAwMDAxOCB9LAorCXsgMHgwNDAwNzViYywgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwNzViYiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzViYywgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDA5MDAwMCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDA5MDAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDBkODAwMiwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDAwNzgzMiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAzODBlNywgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMmM5NywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzgyMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzgyMSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzgwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMTIwMDAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgyMDA3NzAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMTIwMDAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgyMDAwNzAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMTIwNzUxYiwgMHgwMDAwMDAwMiB9LAorCXsgMHg4MDQwNzUwYSwgMHgwMDAwMDAwMiB9LAorCXsgMHg4MDQwNzUwYiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDExMDAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAzODBlNSwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDBjNiwgMHgwMDAwMDAxYyB9LAorCXsgMHgwMDA2MTBhYiwgMHgwMDAwMDAxOCB9LAorCXsgMHg4NDQwNzViZCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTBhYSwgMHgwMDAwMDAxOCB9LAorCXsgMHg4NDAwNzViYiwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDA2MTBhYiwgMHgwMDAwMDAxOCB9LAorCXsgMHg4NDQwNzViYywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwMDBjOSwgMHgwMDAwMDAwNCB9LAorCXsgMHg4MDQwNzViZCwgMHgwMDAwMDAwMiB9LAorCXsgMHg4MDAwNzViYiwgMHgwMDAwMDAwMiB9LAorCXsgMHg4MDQwNzViYywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDEwODAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMTQwMDAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDYwMDBjZCwgMHgwMDAwMDAwYyB9LAorCXsgMHgyMGMwNzAwMCwgMHgwMDAwMDAyMCB9LAorCXsgMHgwMDAwMDBjZiwgMHgwMDAwMDAxMiB9LAorCXsgMHgwMDgwMDAwMCwgMHgwMDAwMDAwNiB9LAorCXsgMHgwMDgwNzUxZCwgMHgwMDAwMDAwNiB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwNzc1YywgMHgwMDAwMDAwMiB9LAorCXsgMHgwMGEwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDY2MTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDYwMjc1ZCwgMHgwMDAwMDAyMCB9LAorCXsgMHgwMDAwNDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMWUwMDgzMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgyMTAwNzAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHg2NDY0NjE0ZCwgMDAwMDAwMDAwMCB9LAorCXsgMHg2OTY4NzQyMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDA3MywgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwNTAwMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAzODBkMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjVlMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNzVlMSwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDAwMSwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAzODBlMCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwNDAwMjM5NCwgMHgwMDAwMDAwMiB9LAorCXsgMHgwMDAwNTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDAwOCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDAwNCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorfTsKKworc3RhdGljIHUzMiBSMzAwX2NwX21pY3JvY29kZVtdWzJdID0geworCXsgMHg0MjAwZTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHg0MDAwZTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDBhZiwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwMDBiMywgMHgwMDAwMDAwOCB9LAorCXsgMHg2YzVhNTA0ZiwgMDAwMDAwMDAwMCB9LAorCXsgMHg0ZjRmNDk3YSwgMDAwMDAwMDAwMCB9LAorCXsgMHg1YTU3ODI4OCwgMDAwMDAwMDAwMCB9LAorCXsgMHg0ZjkxOTA2YSwgMDAwMDAwMDAwMCB9LAorCXsgMHg0ZjRmNGY0ZiwgMDAwMDAwMDAwMCB9LAorCXsgMHg0ZmUyNGY0NCwgMDAwMDAwMDAwMCB9LAorCXsgMHg0ZjljOWM5YywgMDAwMDAwMDAwMCB9LAorCXsgMHhkYzRmNGZkZSwgMDAwMDAwMDAwMCB9LAorCXsgMHhhMWNkNGY0ZiwgMDAwMDAwMDAwMCB9LAorCXsgMHhkMjlkOWQ5ZCwgMDAwMDAwMDAwMCB9LAorCXsgMHg0ZjBmOWZkNywgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDBjYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxMiwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZThiNCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxNCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZThiNiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxNiwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTg1NCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxOCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTg1NSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxYSwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTg1NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxYywgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTg1NywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAxZSwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTgyNCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyMCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTgyNSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyMiwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZTgzMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyNCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjBjMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyNiwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjBjMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyOCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjA0MSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyYSwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjE4NCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyYywgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjE4NSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAyZSwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjE4NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAzMCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjE4NywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAzMiwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjE4MCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAzNCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjM5MywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAzNiwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjM4YSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBkMDAzOCwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDAwZjM4ZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTgyMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTQwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA0MywgMHgwMDAwMDAxOCB9LAorCXsgMHgwMGNjZTgwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDFiMDAwMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwODAwNDgwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDFiMDAwMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwODAwNDgwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDFiMDAwMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwODAwNDgwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDAzYSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwYTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMmMwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDEzMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHhjOTgwYzA0NSwgMHgwMDAwMDAwOCB9LAorCXsgMHgyMDAwNDUxZCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU4MCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjZTU4MSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwODAwNDU4MCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjZTU4MSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA0YywgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwYTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDBjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTUwZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAzMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAyMjA1NiwgMHgwMDAwMDAyOCB9LAorCXsgMHgwMDAwMDA1NiwgMHgwMDAwMDAyNCB9LAorCXsgMHgwODAwNDUwZiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwYTA1MCwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwZTU2NSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU2NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA1NywgMHgwMDAwMDAwOCB9LAorCXsgMHgwM2NjYTViNCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwNTQzMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAyMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHg0Y2NjZTA2MywgMHgwMDAwMDAzMCB9LAorCXsgMHgwODI3NDU2NSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA2MywgMHgwMDAwMDAzMCB9LAorCXsgMHgwODAwNDU2NCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU2NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA1YSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDgwMjA2NiwgMHgwMDAwMDAxMCB9LAorCXsgMHgwMDIwMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDFiMDBmZiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTAwMDA2OSwgMHgwMDAwMDAxMCB9LAorCXsgMHgwMDFmMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDFjMDBmZiwgMHgwMDAwMDAwNCB9LAorCXsgMDAwMDAwMDAwMCwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDAwMDA4NSwgMHgwMDAwMDAzMCB9LAorCXsgMHgwMDAwMDA1YSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwZTU3NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAxMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDA4MjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgxODAwNjUwZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDA5MjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBhMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBmMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDQwMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA3OSwgMHgwMDAwMDAxOCB9LAorCXsgMHgwMDAwZTU2MywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMGMwZTVmOSwgMHgwMDAwMDBjMiB9LAorCXsgMHgwMDAwMDA2ZSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwYTA2ZSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwZTU3NiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU3NywgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTUwZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTUwZiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTQwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA3YywgMHgwMDAwMDAxOCB9LAorCXsgMHgwMGMwZTVmOSwgMHgwMDAwMDBjMiB9LAorCXsgMHgwMDAwMDA3YywgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDE0ZTUwZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDQwZTUwZiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMGMwMDA3ZiwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwZTU3MCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU3MSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU3MiwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDAwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTQwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTU2OCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA4OSwgMHgwMDAwMDAxOCB9LAorCXsgMHgwMDBiMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgxOGMwZTU2MiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA4YiwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMGMwMDA4YSwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDA3MDBlNCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDA5NywgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDBjYTA5OSwgMHgwMDAwMDAzMCB9LAorCXsgMHgwODAwNDViYiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjMjA5YSwgMHgwMDAwMDAzMCB9LAorCXsgMHgwODAwZTViYywgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwZTViYiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTViYywgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDEyMDAwMCwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDEyMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDFiMDAwMiwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDAwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTgyMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTgwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwZTgyMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTgyZSwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMmNjYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDE0MDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjZTFjYywgMHgwMDAwMDAwNCB9LAorCXsgMHgwNTBkZTFjZCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDBhNywgMHgwMDAwMDAyMCB9LAorCXsgMHg0MjAwZTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDBhZSwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDBjYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDE0MDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDBjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDE2MDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHg3MDBjZTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDE0MDBhYSwgMHgwMDAwMDAwOCB9LAorCXsgMHg0MDAwZTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMjQwMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHg0MDBlZTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMjQwMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHg0MDAwZTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDBjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMjQwZTUxYiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDgwZTUwYSwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDgwZTUwYiwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDIyMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDA3MDBlNCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwMDBjMSwgMHgwMDAwMDAzOCB9LAorCXsgMHgwMDBjMjA5YSwgMHgwMDAwMDAzMCB9LAorCXsgMHgwODgwZTViZCwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDBjMjA5OSwgMHgwMDAwMDAzMCB9LAorCXsgMHgwODAwZTViYiwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDBjMjA5YSwgMHgwMDAwMDAzMCB9LAorCXsgMHgwODgwZTViYywgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDAwMDBjNCwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDgwZTViZCwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDAwZTViYiwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDgwZTViYywgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDIxMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMjgwMDAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMGMwMDBjOCwgMHgwMDAwMDAxOCB9LAorCXsgMHg0MTgwZTAwMCwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDAwMDBjYSwgMHgwMDAwMDAyNCB9LAorCXsgMHgwMTAwMDAwMCwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMTAwZTUxZCwgMHgwMDAwMDAwYyB9LAorCXsgMHgwMDAwNDViYiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwODBjNCwgMHgwMDAwMDAwOCB9LAorCXsgMHgwMDAwZjNjZSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTQwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMGNjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwOGMwNTNjZiwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDAwODAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwZjNkMiwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTQwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMGNjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwOGMwNTNkMywgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDAwODAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwZjM5ZCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMTQwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMGNjMjAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwOGMwNTM5ZSwgMHgwMDAwMDA0MCB9LAorCXsgMHgwMDAwODAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwM2MwMDgzMCwgMHgwMDAwMDAwNCB9LAorCXsgMHg0MjAwZTAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwYTAwMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgyMDAwNDVlMCwgMHgwMDAwMDAwNCB9LAorCXsgMHgwMDAwZTVlMSwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDAwMDAwMSwgMDAwMDAwMDAwMCB9LAorCXsgMHgwMDA3MDBlMSwgMHgwMDAwMDAwNCB9LAorCXsgMHgwODAwZTM5NCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorCXsgMDAwMDAwMDAwMCwgMDAwMDAwMDAwMCB9LAorfTsKKworc3RhdGljIGludCBSQURFT05fUkVBRF9QTEwoZHJtX2RldmljZV90ICpkZXYsIGludCBhZGRyKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlSQURFT05fV1JJVEU4KFJBREVPTl9DTE9DS19DTlRMX0lOREVYLCBhZGRyICYgMHgxZik7CisJcmV0dXJuIFJBREVPTl9SRUFEKFJBREVPTl9DTE9DS19DTlRMX0RBVEEpOworfQorCisjaWYgUkFERU9OX0ZJRk9fREVCVUcKK3N0YXRpYyB2b2lkIHJhZGVvbl9zdGF0dXMoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJcHJpbnRrKCAiJXM6XG4iLCBfX0ZVTkNUSU9OX18gKTsKKwlwcmludGsoICJSQkJNX1NUQVRVUyA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludClSQURFT05fUkVBRCggUkFERU9OX1JCQk1fU1RBVFVTICkgKTsKKwlwcmludGsoICJDUF9SQl9SVFBSID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVJBREVPTl9SRUFEKCBSQURFT05fQ1BfUkJfUlBUUiApICk7CisJcHJpbnRrKCAiQ1BfUkJfV1RQUiA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludClSQURFT05fUkVBRCggUkFERU9OX0NQX1JCX1dQVFIgKSApOworCXByaW50ayggIkFJQ19DTlRMID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVJBREVPTl9SRUFEKCBSQURFT05fQUlDX0NOVEwgKSApOworCXByaW50ayggIkFJQ19TVEFUID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVJBREVPTl9SRUFEKCBSQURFT05fQUlDX1NUQVQgKSApOworCXByaW50ayggIkFJQ19QVF9CQVNFID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVJBREVPTl9SRUFEKCBSQURFT05fQUlDX1BUX0JBU0UgKSApOworCXByaW50ayggIlRMQl9BRERSID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVJBREVPTl9SRUFEKCBSQURFT05fQUlDX1RMQl9BRERSICkgKTsKKwlwcmludGsoICJUTEJfREFUQSA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludClSQURFT05fUkVBRCggUkFERU9OX0FJQ19UTEJfREFUQSApICk7Cit9CisjZW5kaWYKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFbmdpbmUsIEZJRk8gY29udHJvbAorICovCisKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX3BpeGNhY2hlX2ZsdXNoKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXUzMiB0bXA7CisJaW50IGk7CisKKwlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9XQUlUX0lETEU7CisKKwl0bXAgID0gUkFERU9OX1JFQUQoIFJBREVPTl9SQjJEX0RTVENBQ0hFX0NUTFNUQVQgKTsKKwl0bXAgfD0gUkFERU9OX1JCMkRfRENfRkxVU0hfQUxMOworCVJBREVPTl9XUklURSggUkFERU9OX1JCMkRfRFNUQ0FDSEVfQ1RMU1RBVCwgdG1wICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQlpZiAoICEoUkFERU9OX1JFQUQoIFJBREVPTl9SQjJEX0RTVENBQ0hFX0NUTFNUQVQgKQorCQkgICAgICAgJiBSQURFT05fUkIyRF9EQ19CVVNZKSApIHsKKwkJCXJldHVybiAwOworCQl9CisJCURSTV9VREVMQVkoIDEgKTsKKwl9CisKKyNpZiBSQURFT05fRklGT19ERUJVRworCURSTV9FUlJPUiggImZhaWxlZCFcbiIgKTsKKwlyYWRlb25fc3RhdHVzKCBkZXZfcHJpdiApOworI2VuZGlmCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9kb193YWl0X2Zvcl9maWZvKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJICAgIGludCBlbnRyaWVzICkKK3sKKwlpbnQgaTsKKworCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1dBSVRfSURMRTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgOyBpKysgKSB7CisJCWludCBzbG90cyA9ICggUkFERU9OX1JFQUQoIFJBREVPTl9SQkJNX1NUQVRVUyApCisJCQkgICAgICAmIFJBREVPTl9SQkJNX0ZJRk9DTlRfTUFTSyApOworCQlpZiAoIHNsb3RzID49IGVudHJpZXMgKSByZXR1cm4gMDsKKwkJRFJNX1VERUxBWSggMSApOworCX0KKworI2lmIFJBREVPTl9GSUZPX0RFQlVHCisJRFJNX0VSUk9SKCAiZmFpbGVkIVxuIiApOworCXJhZGVvbl9zdGF0dXMoIGRldl9wcml2ICk7CisjZW5kaWYKKwlyZXR1cm4gRFJNX0VSUihFQlVTWSk7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX3dhaXRfZm9yX2lkbGUoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJaW50IGksIHJldDsKKworCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1dBSVRfSURMRTsKKworCXJldCA9IHJhZGVvbl9kb193YWl0X2Zvcl9maWZvKCBkZXZfcHJpdiwgNjQgKTsKKwlpZiAoIHJldCApIHJldHVybiByZXQ7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQlpZiAoICEoUkFERU9OX1JFQUQoIFJBREVPTl9SQkJNX1NUQVRVUyApCisJCSAgICAgICAmIFJBREVPTl9SQkJNX0FDVElWRSkgKSB7CisJCQlyYWRlb25fZG9fcGl4Y2FjaGVfZmx1c2goIGRldl9wcml2ICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisjaWYgUkFERU9OX0ZJRk9fREVCVUcKKwlEUk1fRVJST1IoICJmYWlsZWQhXG4iICk7CisJcmFkZW9uX3N0YXR1cyggZGV2X3ByaXYgKTsKKyNlbmRpZgorCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDUCBjb250cm9sLCBpbml0aWFsaXphdGlvbgorICovCisKKy8qIExvYWQgdGhlIG1pY3JvY29kZSBmb3IgdGhlIENQICovCitzdGF0aWMgdm9pZCByYWRlb25fY3BfbG9hZF9taWNyb2NvZGUoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJaW50IGk7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlyYWRlb25fZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKKworCVJBREVPTl9XUklURSggUkFERU9OX0NQX01FX1JBTV9BRERSLCAwICk7CisKKwlpZiAoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uPT1VQ09ERV9SMjAwKSB7CisJCURSTV9JTkZPKCJMb2FkaW5nIFIyMDAgTWljcm9jb2RlXG4iKTsKKwkJZm9yICggaSA9IDAgOyBpIDwgMjU2IDsgaSsrICkgCisJCXsKKwkJCVJBREVPTl9XUklURSggUkFERU9OX0NQX01FX1JBTV9EQVRBSCwKKwkJCQkgICAgICBSMjAwX2NwX21pY3JvY29kZVtpXVsxXSApOworCQkJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfTUVfUkFNX0RBVEFMLAorCQkJCSAgICAgIFIyMDBfY3BfbWljcm9jb2RlW2ldWzBdICk7CisJCX0KKwl9IGVsc2UgaWYgKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbj09VUNPREVfUjMwMCkgeworCQlEUk1fSU5GTygiTG9hZGluZyBSMzAwIE1pY3JvY29kZVxuIik7CisJCWZvciAoIGkgPSAwIDsgaSA8IDI1NiA7IGkrKyApIAorCQl7CisJCQlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9NRV9SQU1fREFUQUgsCisJCQkJICAgICAgUjMwMF9jcF9taWNyb2NvZGVbaV1bMV0gKTsKKwkJCVJBREVPTl9XUklURSggUkFERU9OX0NQX01FX1JBTV9EQVRBTCwKKwkJCQkgICAgICBSMzAwX2NwX21pY3JvY29kZVtpXVswXSApOworCQl9CisJfSBlbHNlIHsKKwkJZm9yICggaSA9IDAgOyBpIDwgMjU2IDsgaSsrICkgeworCQkJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfTUVfUkFNX0RBVEFILAorCQkJCSAgICAgIHJhZGVvbl9jcF9taWNyb2NvZGVbaV1bMV0gKTsKKwkJCVJBREVPTl9XUklURSggUkFERU9OX0NQX01FX1JBTV9EQVRBTCwKKwkJCQkgICAgICByYWRlb25fY3BfbWljcm9jb2RlW2ldWzBdICk7CisJCX0KKwl9Cit9CisKKy8qIEZsdXNoIGFueSBwZW5kaW5nIGNvbW1hbmRzIHRvIHRoZSBDUC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBqdXN0CisgKiBwcmlvciB0byBhIHdhaXQgZm9yIGlkbGUsIGFzIGl0IGluZm9ybXMgdGhlIGVuZ2luZSB0aGF0IHRoZSBjb21tYW5kCisgKiBzdHJlYW0gaXMgZW5kaW5nLgorICovCitzdGF0aWMgdm9pZCByYWRlb25fZG9fY3BfZmx1c2goIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJRFJNX0RFQlVHKCAiXG4iICk7CisjaWYgMAorCXUzMiB0bXA7CisKKwl0bXAgPSBSQURFT05fUkVBRCggUkFERU9OX0NQX1JCX1dQVFIgKSB8ICgxIDw8IDMxKTsKKwlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9SQl9XUFRSLCB0bXAgKTsKKyNlbmRpZgorfQorCisvKiBXYWl0IGZvciB0aGUgQ1AgdG8gZ28gaWRsZS4KKyAqLworaW50IHJhZGVvbl9kb19jcF9pZGxlKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJQkVHSU5fUklORyggNiApOworCisJUkFERU9OX1BVUkdFX0NBQ0hFKCk7CisJUkFERU9OX1BVUkdFX1pDQUNIRSgpOworCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKKworCUFEVkFOQ0VfUklORygpOworCUNPTU1JVF9SSU5HKCk7CisKKwlyZXR1cm4gcmFkZW9uX2RvX3dhaXRfZm9yX2lkbGUoIGRldl9wcml2ICk7Cit9CisKKy8qIFN0YXJ0IHRoZSBDb21tYW5kIFByb2Nlc3Nvci4KKyAqLworc3RhdGljIHZvaWQgcmFkZW9uX2RvX2NwX3N0YXJ0KCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJcmFkZW9uX2RvX3dhaXRfZm9yX2lkbGUoIGRldl9wcml2ICk7CisKKwlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9DU1FfQ05UTCwgZGV2X3ByaXYtPmNwX21vZGUgKTsKKworCWRldl9wcml2LT5jcF9ydW5uaW5nID0gMTsKKworCUJFR0lOX1JJTkcoIDYgKTsKKworCVJBREVPTl9QVVJHRV9DQUNIRSgpOworCVJBREVPTl9QVVJHRV9aQ0FDSEUoKTsKKwlSQURFT05fV0FJVF9VTlRJTF9JRExFKCk7CisKKwlBRFZBTkNFX1JJTkcoKTsKKwlDT01NSVRfUklORygpOworfQorCisvKiBSZXNldCB0aGUgQ29tbWFuZCBQcm9jZXNzb3IuICBUaGlzIHdpbGwgbm90IGZsdXNoIGFueSBwZW5kaW5nCisgKiBjb21tYW5kcywgc28geW91IG11c3Qgd2FpdCBmb3IgdGhlIENQIGNvbW1hbmQgc3RyZWFtIHRvIGNvbXBsZXRlCisgKiBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHJhZGVvbl9kb19jcF9yZXNldCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1MzIgY3VyX3JlYWRfcHRyOworCURSTV9ERUJVRyggIlxuIiApOworCisJY3VyX3JlYWRfcHRyID0gUkFERU9OX1JFQUQoIFJBREVPTl9DUF9SQl9SUFRSICk7CisJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfUkJfV1BUUiwgY3VyX3JlYWRfcHRyICk7CisJU0VUX1JJTkdfSEVBRCggZGV2X3ByaXYsIGN1cl9yZWFkX3B0ciApOworCWRldl9wcml2LT5yaW5nLnRhaWwgPSBjdXJfcmVhZF9wdHI7Cit9CisKKy8qIFN0b3AgdGhlIENvbW1hbmQgUHJvY2Vzc29yLiAgVGhpcyB3aWxsIG5vdCBmbHVzaCBhbnkgcGVuZGluZworICogY29tbWFuZHMsIHNvIHlvdSBtdXN0IGZsdXNoIHRoZSBjb21tYW5kIHN0cmVhbSBhbmQgd2FpdCBmb3IgdGhlIENQCisgKiB0byBnbyBpZGxlIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgcmFkZW9uX2RvX2NwX3N0b3AoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9DU1FfQ05UTCwgUkFERU9OX0NTUV9QUklESVNfSU5ERElTICk7CisKKwlkZXZfcHJpdi0+Y3BfcnVubmluZyA9IDA7Cit9CisKKy8qIFJlc2V0IHRoZSBlbmdpbmUuICBUaGlzIHdpbGwgc3RvcCB0aGUgQ1AgaWYgaXQgaXMgcnVubmluZy4KKyAqLworc3RhdGljIGludCByYWRlb25fZG9fZW5naW5lX3Jlc2V0KCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgY2xvY2tfY250bF9pbmRleCwgbWNsa19jbnRsLCByYmJtX3NvZnRfcmVzZXQ7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlyYWRlb25fZG9fcGl4Y2FjaGVfZmx1c2goIGRldl9wcml2ICk7CisKKwljbG9ja19jbnRsX2luZGV4ID0gUkFERU9OX1JFQUQoIFJBREVPTl9DTE9DS19DTlRMX0lOREVYICk7CisJbWNsa19jbnRsID0gUkFERU9OX1JFQURfUExMKCBkZXYsIFJBREVPTl9NQ0xLX0NOVEwgKTsKKworCVJBREVPTl9XUklURV9QTEwoIFJBREVPTl9NQ0xLX0NOVEwsICggbWNsa19jbnRsIHwKKwkJCQkJICAgICAgUkFERU9OX0ZPUkNFT05fTUNMS0EgfAorCQkJCQkgICAgICBSQURFT05fRk9SQ0VPTl9NQ0xLQiB8CisgCQkJCQkgICAgICBSQURFT05fRk9SQ0VPTl9ZQ0xLQSB8CisJCQkJCSAgICAgIFJBREVPTl9GT1JDRU9OX1lDTEtCIHwKKwkJCQkJICAgICAgUkFERU9OX0ZPUkNFT05fTUMgfAorCQkJCQkgICAgICBSQURFT05fRk9SQ0VPTl9BSUMgKSApOworCisJcmJibV9zb2Z0X3Jlc2V0ID0gUkFERU9OX1JFQUQoIFJBREVPTl9SQkJNX1NPRlRfUkVTRVQgKTsKKworCVJBREVPTl9XUklURSggUkFERU9OX1JCQk1fU09GVF9SRVNFVCwgKCByYmJtX3NvZnRfcmVzZXQgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfQ1AgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfSEkgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfU0UgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfUkUgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfUFAgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfRTIgfAorCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfUkIgKSApOworCVJBREVPTl9SRUFEKCBSQURFT05fUkJCTV9TT0ZUX1JFU0VUICk7CisJUkFERU9OX1dSSVRFKCBSQURFT05fUkJCTV9TT0ZUX1JFU0VULCAoIHJiYm1fc29mdF9yZXNldCAmCisJCQkJCQl+KCBSQURFT05fU09GVF9SRVNFVF9DUCB8CisJCQkJCQkgICBSQURFT05fU09GVF9SRVNFVF9ISSB8CisJCQkJCQkgICBSQURFT05fU09GVF9SRVNFVF9TRSB8CisJCQkJCQkgICBSQURFT05fU09GVF9SRVNFVF9SRSB8CisJCQkJCQkgICBSQURFT05fU09GVF9SRVNFVF9QUCB8CisJCQkJCQkgICBSQURFT05fU09GVF9SRVNFVF9FMiB8CisJCQkJCQkgICBSQURFT05fU09GVF9SRVNFVF9SQiApICkgKTsKKwlSQURFT05fUkVBRCggUkFERU9OX1JCQk1fU09GVF9SRVNFVCApOworCisKKwlSQURFT05fV1JJVEVfUExMKCBSQURFT05fTUNMS19DTlRMLCBtY2xrX2NudGwgKTsKKwlSQURFT05fV1JJVEUoIFJBREVPTl9DTE9DS19DTlRMX0lOREVYLCBjbG9ja19jbnRsX2luZGV4ICk7CisJUkFERU9OX1dSSVRFKCBSQURFT05fUkJCTV9TT0ZUX1JFU0VULCAgcmJibV9zb2Z0X3Jlc2V0ICk7CisKKwkvKiBSZXNldCB0aGUgQ1AgcmluZyAqLworCXJhZGVvbl9kb19jcF9yZXNldCggZGV2X3ByaXYgKTsKKworCS8qIFRoZSBDUCBpcyBubyBsb25nZXIgcnVubmluZyBhZnRlciBhbiBlbmdpbmUgcmVzZXQgKi8KKwlkZXZfcHJpdi0+Y3BfcnVubmluZyA9IDA7CisKKwkvKiBSZXNldCBhbnkgcGVuZGluZyB2ZXJ0ZXgsIGluZGlyZWN0IGJ1ZmZlcnMgKi8KKwlyYWRlb25fZnJlZWxpc3RfcmVzZXQoIGRldiApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9pbml0X3JpbmdfYnVmZmVyKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICAgICAgIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJdTMyIHJpbmdfc3RhcnQsIGN1cl9yZWFkX3B0cjsKKwl1MzIgdG1wOworCisJLyogSW5pdGlhbGl6ZSB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgKi8KKwlSQURFT05fV1JJVEUoIFJBREVPTl9NQ19GQl9MT0NBVElPTiwKKwkJICAgICAgKCAoIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0IC0gMSApICYgMHhmZmZmMDAwMCApCisJCSAgICB8ICggZGV2X3ByaXYtPmZiX2xvY2F0aW9uID4+IDE2ICkgKTsKKworI2lmIF9fT1NfSEFTX0FHUAorCWlmICggIWRldl9wcml2LT5pc19wY2kgKSB7CisJCVJBREVPTl9XUklURSggUkFERU9OX01DX0FHUF9MT0NBVElPTiwKKwkJCSAgICAgICgoKGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0IC0gMSArCisJCQkJIGRldl9wcml2LT5nYXJ0X3NpemUpICYgMHhmZmZmMDAwMCkgfAorCQkJICAgICAgIChkZXZfcHJpdi0+Z2FydF92bV9zdGFydCA+PiAxNikpICk7CisKKwkJcmluZ19zdGFydCA9IChkZXZfcHJpdi0+Y3BfcmluZy0+b2Zmc2V0CisJCQkgICAgICAtIGRldi0+YWdwLT5iYXNlCisJCQkgICAgICArIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0KTsKKyAgICAgICB9IGVsc2UKKyNlbmRpZgorCQlyaW5nX3N0YXJ0ID0gKGRldl9wcml2LT5jcF9yaW5nLT5vZmZzZXQKKwkJCSAgICAgIC0gZGV2LT5zZy0+aGFuZGxlCisJCQkgICAgICArIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0KTsKKworCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX0JBU0UsIHJpbmdfc3RhcnQgKTsKKworCS8qIFNldCB0aGUgd3JpdGUgcG9pbnRlciBkZWxheSAqLworCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX1dQVFJfREVMQVksIDAgKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHJpbmcgYnVmZmVyJ3MgcmVhZCBhbmQgd3JpdGUgcG9pbnRlcnMgKi8KKwljdXJfcmVhZF9wdHIgPSBSQURFT05fUkVBRCggUkFERU9OX0NQX1JCX1JQVFIgKTsKKwlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9SQl9XUFRSLCBjdXJfcmVhZF9wdHIgKTsKKwlTRVRfUklOR19IRUFEKCBkZXZfcHJpdiwgY3VyX3JlYWRfcHRyICk7CisJZGV2X3ByaXYtPnJpbmcudGFpbCA9IGN1cl9yZWFkX3B0cjsKKworI2lmIF9fT1NfSEFTX0FHUAorCWlmICggIWRldl9wcml2LT5pc19wY2kgKSB7CisJCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX1JQVFJfQUREUiwKKwkJCSAgICAgIGRldl9wcml2LT5yaW5nX3JwdHItPm9mZnNldAorCQkJICAgICAgLSBkZXYtPmFncC0+YmFzZQorCQkJICAgICAgKyBkZXZfcHJpdi0+Z2FydF92bV9zdGFydCk7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCWRybV9zZ19tZW1fdCAqZW50cnkgPSBkZXYtPnNnOworCQl1bnNpZ25lZCBsb25nIHRtcF9vZnMsIHBhZ2Vfb2ZzOworCisJCXRtcF9vZnMgPSBkZXZfcHJpdi0+cmluZ19ycHRyLT5vZmZzZXQgLSBkZXYtPnNnLT5oYW5kbGU7CisJCXBhZ2Vfb2ZzID0gdG1wX29mcyA+PiBQQUdFX1NISUZUOworCisJCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX1JQVFJfQUREUiwKKwkJCSAgICAgZW50cnktPmJ1c2FkZHJbcGFnZV9vZnNdKTsKKwkJRFJNX0RFQlVHKCAicmluZyBycHRyOiBvZmZzZXQ9MHglMDhseCBoYW5kbGU9MHglMDhseFxuIiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKSBlbnRyeS0+YnVzYWRkcltwYWdlX29mc10sCisJCQkgICBlbnRyeS0+aGFuZGxlICsgdG1wX29mcyApOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIHNjcmF0Y2ggcmVnaXN0ZXIgcG9pbnRlci4gIFRoaXMgd2lsbCBjYXVzZQorCSAqIHRoZSBzY3JhdGNoIHJlZ2lzdGVyIHZhbHVlcyB0byBiZSB3cml0dGVuIG91dCB0byBtZW1vcnkKKwkgKiB3aGVuZXZlciB0aGV5IGFyZSB1cGRhdGVkLgorCSAqCisJICogV2Ugc2ltcGx5IHB1dCB0aGlzIGJlaGluZCB0aGUgcmluZyByZWFkIHBvaW50ZXIsIHRoaXMgd29ya3MKKwkgKiB3aXRoIFBDSSBHQVJUIGFzIHdlbGwgYXMgKHdoYXRldmVyIGtpbmQgb2YpIEFHUCBHQVJUCisJICovCisJUkFERU9OX1dSSVRFKCBSQURFT05fU0NSQVRDSF9BRERSLCBSQURFT05fUkVBRCggUkFERU9OX0NQX1JCX1JQVFJfQUREUiApCisJCQkJCSArIFJBREVPTl9TQ1JBVENIX1JFR19PRkZTRVQgKTsKKworCWRldl9wcml2LT5zY3JhdGNoID0gKChfX3ZvbGF0aWxlX18gdTMyICopCisJCQkgICAgIGRldl9wcml2LT5yaW5nX3JwdHItPmhhbmRsZSArCisJCQkgICAgIChSQURFT05fU0NSQVRDSF9SRUdfT0ZGU0VUIC8gc2l6ZW9mKHUzMikpKTsKKworCVJBREVPTl9XUklURSggUkFERU9OX1NDUkFUQ0hfVU1TSywgMHg3ICk7CisKKwkvKiBXcml0ZWJhY2sgZG9lc24ndCBzZWVtIHRvIHdvcmsgZXZlcnl3aGVyZSwgdGVzdCBpdCBmaXJzdCAqLworCURSTV9XUklURTMyKCBkZXZfcHJpdi0+cmluZ19ycHRyLCBSQURFT05fU0NSQVRDSE9GRigxKSwgMCApOworCVJBREVPTl9XUklURSggUkFERU9OX1NDUkFUQ0hfUkVHMSwgMHhkZWFkYmVlZiApOworCisJZm9yICggdG1wID0gMCA7IHRtcCA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgOyB0bXArKyApIHsKKwkJaWYgKCBEUk1fUkVBRDMyKCBkZXZfcHJpdi0+cmluZ19ycHRyLCBSQURFT05fU0NSQVRDSE9GRigxKSApID09IDB4ZGVhZGJlZWYgKQorCQkJYnJlYWs7CisJCURSTV9VREVMQVkoIDEgKTsKKwl9CisKKwlpZiAoIHRtcCA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgKSB7CisJCWRldl9wcml2LT53cml0ZWJhY2tfd29ya3MgPSAxOworCQlEUk1fREVCVUcoICJ3cml0ZWJhY2sgdGVzdCBzdWNjZWVkZWQsIHRtcD0lZFxuIiwgdG1wICk7CisJfSBlbHNlIHsKKwkJZGV2X3ByaXYtPndyaXRlYmFja193b3JrcyA9IDA7CisJCURSTV9ERUJVRyggIndyaXRlYmFjayB0ZXN0IGZhaWxlZFxuIiApOworCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lID0gZGV2X3ByaXYtPnNjcmF0Y2hbMF0gPSAwOworCVJBREVPTl9XUklURSggUkFERU9OX0xBU1RfRlJBTUVfUkVHLAorCQkgICAgICBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSApOworCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSBkZXZfcHJpdi0+c2NyYXRjaFsxXSA9IDA7CisJUkFERU9OX1dSSVRFKCBSQURFT05fTEFTVF9ESVNQQVRDSF9SRUcsCisJCSAgICAgIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoICk7CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9jbGVhciA9IGRldl9wcml2LT5zY3JhdGNoWzJdID0gMDsKKwlSQURFT05fV1JJVEUoIFJBREVPTl9MQVNUX0NMRUFSX1JFRywKKwkJICAgICAgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfY2xlYXIgKTsKKworCS8qIFNldCByaW5nIGJ1ZmZlciBzaXplICovCisjaWZkZWYgX19CSUdfRU5ESUFOCisJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfUkJfQ05UTCwgZGV2X3ByaXYtPnJpbmcuc2l6ZV9sMnF3IHwgUkFERU9OX0JVRl9TV0FQXzMyQklUICk7CisjZWxzZQorCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX0NOVEwsIGRldl9wcml2LT5yaW5nLnNpemVfbDJxdyApOworI2VuZGlmCisKKwlyYWRlb25fZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKKworCS8qIFR1cm4gb24gYnVzIG1hc3RlcmluZyAqLworCXRtcCA9IFJBREVPTl9SRUFEKCBSQURFT05fQlVTX0NOVEwgKSAmIH5SQURFT05fQlVTX01BU1RFUl9ESVM7CisJUkFERU9OX1dSSVRFKCBSQURFT05fQlVTX0NOVEwsIHRtcCApOworCisJLyogU3luYyBldmVyeXRoaW5nIHVwICovCisJUkFERU9OX1dSSVRFKCBSQURFT05fSVNZTkNfQ05UTCwKKwkJICAgICAgKFJBREVPTl9JU1lOQ19BTlkyRF9JRExFM0QgfAorCQkgICAgICAgUkFERU9OX0lTWU5DX0FOWTNEX0lETEUyRCB8CisJCSAgICAgICBSQURFT05fSVNZTkNfV0FJVF9JRExFR1VJIHwKKwkJICAgICAgIFJBREVPTl9JU1lOQ19DUFNDUkFUQ0hfSURMRUdVSSkgKTsKK30KKworLyogRW5hYmxlIG9yIGRpc2FibGUgUENJIEdBUlQgb24gdGhlIGNoaXAgKi8KK3N0YXRpYyB2b2lkIHJhZGVvbl9zZXRfcGNpZ2FydCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgb24gKQoreworCXUzMiB0bXAJPSBSQURFT05fUkVBRCggUkFERU9OX0FJQ19DTlRMICk7CisKKwlpZiAoIG9uICkgeworCQlSQURFT05fV1JJVEUoIFJBREVPTl9BSUNfQ05UTCwgdG1wIHwgUkFERU9OX1BDSUdBUlRfVFJBTlNMQVRFX0VOICk7CisKKwkJLyogc2V0IFBDSSBHQVJUIHBhZ2UtdGFibGUgYmFzZSBhZGRyZXNzCisJCSAqLworCQlSQURFT05fV1JJVEUoIFJBREVPTl9BSUNfUFRfQkFTRSwgZGV2X3ByaXYtPmJ1c19wY2lfZ2FydCApOworCisJCS8qIHNldCBhZGRyZXNzIHJhbmdlIGZvciBQQ0kgYWRkcmVzcyB0cmFuc2xhdGUKKwkJICovCisJCVJBREVPTl9XUklURSggUkFERU9OX0FJQ19MT19BRERSLCBkZXZfcHJpdi0+Z2FydF92bV9zdGFydCApOworCQlSQURFT05fV1JJVEUoIFJBREVPTl9BSUNfSElfQUREUiwgZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQKKwkJCQkJCSAgKyBkZXZfcHJpdi0+Z2FydF9zaXplIC0gMSk7CisKKwkJLyogVHVybiBvZmYgQUdQIGFwZXJ0dXJlIC0tIGlzIHRoaXMgcmVxdWlyZWQgZm9yIFBDSSBHQVJUPworCQkgKi8KKwkJUkFERU9OX1dSSVRFKCBSQURFT05fTUNfQUdQX0xPQ0FUSU9OLCAweGZmZmZmZmMwICk7IC8qID8/ICovCisJCVJBREVPTl9XUklURSggUkFERU9OX0FHUF9DT01NQU5ELCAwICk7IC8qIGNsZWFyIEFHUF9DT01NQU5EICovCisJfSBlbHNlIHsKKwkJUkFERU9OX1dSSVRFKCBSQURFT05fQUlDX0NOVEwsIHRtcCAmIH5SQURFT05fUENJR0FSVF9UUkFOU0xBVEVfRU4gKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2luaXRfY3AoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fcmFkZW9uX2luaXRfdCAqaW5pdCApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTs7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlkZXZfcHJpdi0+aXNfcGNpID0gaW5pdC0+aXNfcGNpOworCisJaWYgKCBkZXZfcHJpdi0+aXNfcGNpICYmICFkZXYtPnNnICkgeworCQlEUk1fRVJST1IoICJQQ0kgR0FSVCBtZW1vcnkgbm90IGFsbG9jYXRlZCFcbiIgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZGV2X3ByaXYtPnVzZWNfdGltZW91dCA9IGluaXQtPnVzZWNfdGltZW91dDsKKwlpZiAoIGRldl9wcml2LT51c2VjX3RpbWVvdXQgPCAxIHx8CisJICAgICBkZXZfcHJpdi0+dXNlY190aW1lb3V0ID4gUkFERU9OX01BWF9VU0VDX1RJTUVPVVQgKSB7CisJCURSTV9ERUJVRyggIlRJTUVPVVQgcHJvYmxlbSFcbiIgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJc3dpdGNoKGluaXQtPmZ1bmMpIHsKKwljYXNlIFJBREVPTl9JTklUX1IyMDBfQ1A6CisJCWRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbj1VQ09ERV9SMjAwOworCQlicmVhazsKKwljYXNlIFJBREVPTl9JTklUX1IzMDBfQ1A6CisJCWRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbj1VQ09ERV9SMzAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb249VUNPREVfUjEwMDsKKwl9CisJCisJZGV2X3ByaXYtPmRvX2JveGVzID0gMDsKKwlkZXZfcHJpdi0+Y3BfbW9kZSA9IGluaXQtPmNwX21vZGU7CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0IGFueXRoaW5nIG90aGVyIHRoYW4gYnVzLW1hc3RlcmluZyByaW5nIG1vZGUsCisJICogYnV0IHRoZSByaW5nIGNhbiBiZSBpbiBlaXRoZXIgQUdQIG9yIFBDSSBzcGFjZSBmb3IgdGhlIHJpbmcKKwkgKiByZWFkIHBvaW50ZXIuCisJICovCisJaWYgKCAoIGluaXQtPmNwX21vZGUgIT0gUkFERU9OX0NTUV9QUklCTV9JTkRESVMgKSAmJgorCSAgICAgKCBpbml0LT5jcF9tb2RlICE9IFJBREVPTl9DU1FfUFJJQk1fSU5EQk0gKSApIHsKKwkJRFJNX0RFQlVHKCAiQkFEIGNwX21vZGUgKCV4KSFcbiIsIGluaXQtPmNwX21vZGUgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJc3dpdGNoICggaW5pdC0+ZmJfYnBwICkgeworCWNhc2UgMTY6CisJCWRldl9wcml2LT5jb2xvcl9mbXQgPSBSQURFT05fQ09MT1JfRk9STUFUX1JHQjU2NTsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwlkZWZhdWx0OgorCQlkZXZfcHJpdi0+Y29sb3JfZm10ID0gUkFERU9OX0NPTE9SX0ZPUk1BVF9BUkdCODg4ODsKKwkJYnJlYWs7CisJfQorCWRldl9wcml2LT5mcm9udF9vZmZzZXQJPSBpbml0LT5mcm9udF9vZmZzZXQ7CisJZGV2X3ByaXYtPmZyb250X3BpdGNoCT0gaW5pdC0+ZnJvbnRfcGl0Y2g7CisJZGV2X3ByaXYtPmJhY2tfb2Zmc2V0CT0gaW5pdC0+YmFja19vZmZzZXQ7CisJZGV2X3ByaXYtPmJhY2tfcGl0Y2gJPSBpbml0LT5iYWNrX3BpdGNoOworCisJc3dpdGNoICggaW5pdC0+ZGVwdGhfYnBwICkgeworCWNhc2UgMTY6CisJCWRldl9wcml2LT5kZXB0aF9mbXQgPSBSQURFT05fREVQVEhfRk9STUFUXzE2QklUX0lOVF9aOworCQlicmVhazsKKwljYXNlIDMyOgorCWRlZmF1bHQ6CisJCWRldl9wcml2LT5kZXB0aF9mbXQgPSBSQURFT05fREVQVEhfRk9STUFUXzI0QklUX0lOVF9aOworCQlicmVhazsKKwl9CisJZGV2X3ByaXYtPmRlcHRoX29mZnNldAk9IGluaXQtPmRlcHRoX29mZnNldDsKKwlkZXZfcHJpdi0+ZGVwdGhfcGl0Y2gJPSBpbml0LT5kZXB0aF9waXRjaDsKKworCS8qIEhhcmR3YXJlIHN0YXRlIGZvciBkZXB0aCBjbGVhcnMuICBSZW1vdmUgdGhpcyBpZi93aGVuIHdlIG5vCisJICogbG9uZ2VyIGNsZWFyIHRoZSBkZXB0aCBidWZmZXIgd2l0aCBhIDNEIHJlY3RhbmdsZS4gIEhhcmQtY29kZQorCSAqIGFsbCB2YWx1ZXMgdG8gcHJldmVudCB1bndhbnRlZCAzRCBzdGF0ZSBmcm9tIHNsaXBwaW5nIHRocm91Z2gKKwkgKiBhbmQgc2NyZXdpbmcgd2l0aCB0aGUgY2xlYXIgb3BlcmF0aW9uLgorCSAqLworCWRldl9wcml2LT5kZXB0aF9jbGVhci5yYjNkX2NudGwgPSAoUkFERU9OX1BMQU5FX01BU0tfRU5BQkxFIHwKKwkJCQkJICAgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgMTApIHwKKwkJCQkJICAgKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbiA9PSBVQ09ERV9SMTAwID8gUkFERU9OX1pCTE9DSzE2IDogMCkpOworCisJZGV2X3ByaXYtPmRlcHRoX2NsZWFyLnJiM2RfenN0ZW5jaWxjbnRsID0gCisJCShkZXZfcHJpdi0+ZGVwdGhfZm10IHwKKwkJIFJBREVPTl9aX1RFU1RfQUxXQVlTIHwKKwkJIFJBREVPTl9TVEVOQ0lMX1RFU1RfQUxXQVlTIHwKKwkJIFJBREVPTl9TVEVOQ0lMX1NfRkFJTF9SRVBMQUNFIHwKKwkJIFJBREVPTl9TVEVOQ0lMX1pQQVNTX1JFUExBQ0UgfAorCQkgUkFERU9OX1NURU5DSUxfWkZBSUxfUkVQTEFDRSB8CisJCSBSQURFT05fWl9XUklURV9FTkFCTEUpOworCisJZGV2X3ByaXYtPmRlcHRoX2NsZWFyLnNlX2NudGwgPSAoUkFERU9OX0ZGQUNFX0NVTExfQ1cgfAorCQkJCQkgUkFERU9OX0JGQUNFX1NPTElEIHwKKwkJCQkJIFJBREVPTl9GRkFDRV9TT0xJRCB8CisJCQkJCSBSQURFT05fRkxBVF9TSEFERV9WVFhfTEFTVCB8CisJCQkJCSBSQURFT05fRElGRlVTRV9TSEFERV9GTEFUIHwKKwkJCQkJIFJBREVPTl9BTFBIQV9TSEFERV9GTEFUIHwKKwkJCQkJIFJBREVPTl9TUEVDVUxBUl9TSEFERV9GTEFUIHwKKwkJCQkJIFJBREVPTl9GT0dfU0hBREVfRkxBVCB8CisJCQkJCSBSQURFT05fVlRYX1BJWF9DRU5URVJfT0dMIHwKKwkJCQkJIFJBREVPTl9ST1VORF9NT0RFX1RSVU5DIHwKKwkJCQkJIFJBREVPTl9ST1VORF9QUkVDXzhUSF9QSVgpOworCisJRFJNX0dFVFNBUkVBKCk7CisKKwlkZXZfcHJpdi0+ZmJfb2Zmc2V0ID0gaW5pdC0+ZmJfb2Zmc2V0OworCWRldl9wcml2LT5tbWlvX29mZnNldCA9IGluaXQtPm1taW9fb2Zmc2V0OworCWRldl9wcml2LT5yaW5nX29mZnNldCA9IGluaXQtPnJpbmdfb2Zmc2V0OworCWRldl9wcml2LT5yaW5nX3JwdHJfb2Zmc2V0ID0gaW5pdC0+cmluZ19ycHRyX29mZnNldDsKKwlkZXZfcHJpdi0+YnVmZmVyc19vZmZzZXQgPSBpbml0LT5idWZmZXJzX29mZnNldDsKKwlkZXZfcHJpdi0+Z2FydF90ZXh0dXJlc19vZmZzZXQgPSBpbml0LT5nYXJ0X3RleHR1cmVzX29mZnNldDsKKwkKKwlpZighZGV2X3ByaXYtPnNhcmVhKSB7CisJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgc2FyZWEhXG4iKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZGV2X3ByaXYtPm1taW8gPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pb19vZmZzZXQpOworCWlmKCFkZXZfcHJpdi0+bW1pbykgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIG1taW8gcmVnaW9uIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyYWRlb25fZG9fY2xlYW51cF9jcChkZXYpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlkZXZfcHJpdi0+Y3BfcmluZyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5yaW5nX29mZnNldCk7CisJaWYoIWRldl9wcml2LT5jcF9yaW5nKSB7CisJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgY3AgcmluZyByZWdpb24hXG4iKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWRldl9wcml2LT5yaW5nX3JwdHIgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+cmluZ19ycHRyX29mZnNldCk7CisJaWYoIWRldl9wcml2LT5yaW5nX3JwdHIpIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCByaW5nIHJlYWQgcG9pbnRlciFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5idWZmZXJzX29mZnNldCk7CisJaWYoIWRldi0+YWdwX2J1ZmZlcl9tYXApIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBkbWEgYnVmZmVyIHJlZ2lvbiFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIGluaXQtPmdhcnRfdGV4dHVyZXNfb2Zmc2V0ICkgeworCQlkZXZfcHJpdi0+Z2FydF90ZXh0dXJlcyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5nYXJ0X3RleHR1cmVzX29mZnNldCk7CisJCWlmICggIWRldl9wcml2LT5nYXJ0X3RleHR1cmVzICkgeworCQkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBHQVJUIHRleHR1cmUgcmVnaW9uIVxuIik7CisJCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYgPQorCQkoZHJtX3JhZGVvbl9zYXJlYV90ICopKCh1OCAqKWRldl9wcml2LT5zYXJlYS0+aGFuZGxlICsKKwkJCQkgICAgICAgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCisjaWYgX19PU19IQVNfQUdQCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApIHsKKwkJZHJtX2NvcmVfaW9yZW1hcCggZGV2X3ByaXYtPmNwX3JpbmcsIGRldiApOworCQlkcm1fY29yZV9pb3JlbWFwKCBkZXZfcHJpdi0+cmluZ19ycHRyLCBkZXYgKTsKKwkJZHJtX2NvcmVfaW9yZW1hcCggZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2ICk7CisJCWlmKCFkZXZfcHJpdi0+Y3BfcmluZy0+aGFuZGxlIHx8CisJCSAgICFkZXZfcHJpdi0+cmluZ19ycHRyLT5oYW5kbGUgfHwKKwkJICAgIWRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSkgeworCQkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBpb3JlbWFwIGFncCByZWdpb25zIVxuIik7CisJCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCWRldl9wcml2LT5jcF9yaW5nLT5oYW5kbGUgPQorCQkJKHZvaWQgKilkZXZfcHJpdi0+Y3BfcmluZy0+b2Zmc2V0OworCQlkZXZfcHJpdi0+cmluZ19ycHRyLT5oYW5kbGUgPQorCQkJKHZvaWQgKilkZXZfcHJpdi0+cmluZ19ycHRyLT5vZmZzZXQ7CisJCWRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSA9ICh2b2lkICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+b2Zmc2V0OworCisJCURSTV9ERUJVRyggImRldl9wcml2LT5jcF9yaW5nLT5oYW5kbGUgJXBcbiIsCisJCQkgICBkZXZfcHJpdi0+Y3BfcmluZy0+aGFuZGxlICk7CisJCURSTV9ERUJVRyggImRldl9wcml2LT5yaW5nX3JwdHItPmhhbmRsZSAlcFxuIiwKKwkJCSAgIGRldl9wcml2LT5yaW5nX3JwdHItPmhhbmRsZSApOworCQlEUk1fREVCVUcoICJkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgJXBcbiIsCisJCQkgICBkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgKTsKKwl9CisKKwlkZXZfcHJpdi0+ZmJfbG9jYXRpb24gPSAoIFJBREVPTl9SRUFEKCBSQURFT05fTUNfRkJfTE9DQVRJT04gKQorCQkJCSYgMHhmZmZmICkgPDwgMTY7CisKKwlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ID0gKCgoZGV2X3ByaXYtPmZyb250X3BpdGNoLzY0KSA8PCAyMikgfAorCQkJCQkoICggZGV2X3ByaXYtPmZyb250X29mZnNldAorCQkJCQkgICsgZGV2X3ByaXYtPmZiX2xvY2F0aW9uICkgPj4gMTAgKSApOworCisJZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ID0gKCgoZGV2X3ByaXYtPmJhY2tfcGl0Y2gvNjQpIDw8IDIyKSB8CisJCQkJICAgICAgICggKCBkZXZfcHJpdi0+YmFja19vZmZzZXQKKwkJCQkJICsgZGV2X3ByaXYtPmZiX2xvY2F0aW9uICkgPj4gMTAgKSApOworCisJZGV2X3ByaXYtPmRlcHRoX3BpdGNoX29mZnNldCA9ICgoKGRldl9wcml2LT5kZXB0aF9waXRjaC82NCkgPDwgMjIpIHwKKwkJCQkJKCAoIGRldl9wcml2LT5kZXB0aF9vZmZzZXQKKwkJCQkJICArIGRldl9wcml2LT5mYl9sb2NhdGlvbiApID4+IDEwICkgKTsKKworCisJZGV2X3ByaXYtPmdhcnRfc2l6ZSA9IGluaXQtPmdhcnRfc2l6ZTsKKwlkZXZfcHJpdi0+Z2FydF92bV9zdGFydCA9IGRldl9wcml2LT5mYl9sb2NhdGlvbgorCQkJCSsgUkFERU9OX1JFQUQoIFJBREVPTl9DT05GSUdfQVBFUl9TSVpFICk7CisKKyNpZiBfX09TX0hBU19BR1AKKwlpZiAoICFkZXZfcHJpdi0+aXNfcGNpICkKKwkJZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgPSAoZGV2LT5hZ3BfYnVmZmVyX21hcC0+b2Zmc2V0CisJCQkJCQktIGRldi0+YWdwLT5iYXNlCisJCQkJCQkrIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0KTsKKwllbHNlCisjZW5kaWYKKwkJZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgPSAoZGV2LT5hZ3BfYnVmZmVyX21hcC0+b2Zmc2V0CisJCQkJCQktIGRldi0+c2ctPmhhbmRsZQorCQkJCQkJKyBkZXZfcHJpdi0+Z2FydF92bV9zdGFydCk7CisKKwlEUk1fREVCVUcoICJkZXZfcHJpdi0+Z2FydF9zaXplICVkXG4iLAorCQkgICBkZXZfcHJpdi0+Z2FydF9zaXplICk7CisJRFJNX0RFQlVHKCAiZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgMHgleFxuIiwKKwkJICAgZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgKTsKKwlEUk1fREVCVUcoICJkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldCAweCVseFxuIiwKKwkJICAgZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgKTsKKworCWRldl9wcml2LT5yaW5nLnN0YXJ0ID0gKHUzMiAqKWRldl9wcml2LT5jcF9yaW5nLT5oYW5kbGU7CisJZGV2X3ByaXYtPnJpbmcuZW5kID0gKCh1MzIgKilkZXZfcHJpdi0+Y3BfcmluZy0+aGFuZGxlCisJCQkgICAgICArIGluaXQtPnJpbmdfc2l6ZSAvIHNpemVvZih1MzIpKTsKKwlkZXZfcHJpdi0+cmluZy5zaXplID0gaW5pdC0+cmluZ19zaXplOworCWRldl9wcml2LT5yaW5nLnNpemVfbDJxdyA9IGRybV9vcmRlciggaW5pdC0+cmluZ19zaXplIC8gOCApOworCisJZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrID0KKwkJKGRldl9wcml2LT5yaW5nLnNpemUgLyBzaXplb2YodTMyKSkgLSAxOworCisJZGV2X3ByaXYtPnJpbmcuaGlnaF9tYXJrID0gUkFERU9OX1JJTkdfSElHSF9NQVJLOworCisjaWYgX19PU19IQVNfQUdQCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApIHsKKwkJLyogVHVybiBvZmYgUENJIEdBUlQgKi8KKwkJcmFkZW9uX3NldF9wY2lnYXJ0KCBkZXZfcHJpdiwgMCApOworCX0gZWxzZQorI2VuZGlmCisJeworCQlpZiAoIWRybV9hdGlfcGNpZ2FydF9pbml0KCBkZXYsICZkZXZfcHJpdi0+cGh5c19wY2lfZ2FydCwKKwkJCQkJICAgICZkZXZfcHJpdi0+YnVzX3BjaV9nYXJ0KSkgeworCQkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGluaXQgUENJIEdBUlQhXG4iICk7CisJCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCQl9CisKKwkJLyogVHVybiBvbiBQQ0kgR0FSVCAqLworCQlyYWRlb25fc2V0X3BjaWdhcnQoIGRldl9wcml2LCAxICk7CisJfQorCisJcmFkZW9uX2NwX2xvYWRfbWljcm9jb2RlKCBkZXZfcHJpdiApOworCXJhZGVvbl9jcF9pbml0X3JpbmdfYnVmZmVyKCBkZXYsIGRldl9wcml2ICk7CisKKwlkZXZfcHJpdi0+bGFzdF9idWYgPSAwOworCisJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisKKwlyYWRlb25fZG9fZW5naW5lX3Jlc2V0KCBkZXYgKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9kb19jbGVhbnVwX2NwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAorCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKKwkgKiBpcyBmcmVlZCwgaXQncyB0b28gbGF0ZS4KKwkgKi8KKwlpZiAoIGRldi0+aXJxX2VuYWJsZWQgKSBkcm1faXJxX3VuaW5zdGFsbChkZXYpOworCisjaWYgX19PU19IQVNfQUdQCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApIHsKKwkJaWYgKCBkZXZfcHJpdi0+Y3BfcmluZyAhPSBOVUxMICkKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCBkZXZfcHJpdi0+Y3BfcmluZywgZGV2ICk7CisJCWlmICggZGV2X3ByaXYtPnJpbmdfcnB0ciAhPSBOVUxMICkKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCBkZXZfcHJpdi0+cmluZ19ycHRyLCBkZXYgKTsKKwkJaWYgKCBkZXYtPmFncF9idWZmZXJfbWFwICE9IE5VTEwgKQorCQl7CisJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSggZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2ICk7CisJCQlkZXYtPmFncF9idWZmZXJfbWFwID0gTlVMTDsKKwkJfQorCX0gZWxzZQorI2VuZGlmCisJeworCQlpZiAoIWRybV9hdGlfcGNpZ2FydF9jbGVhbnVwKCBkZXYsCisJCQkJCSAgICAgIGRldl9wcml2LT5waHlzX3BjaV9nYXJ0LAorCQkJCQkgICAgICBkZXZfcHJpdi0+YnVzX3BjaV9nYXJ0ICkpCisJCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gY2xlYW51cCBQQ0kgR0FSVCFcbiIgKTsKKwl9CisJCisJLyogb25seSBjbGVhciB0byB0aGUgc3RhcnQgb2YgZmxhZ3MgKi8KKwltZW1zZXQoZGV2X3ByaXYsIDAsIG9mZnNldG9mKGRybV9yYWRlb25fcHJpdmF0ZV90LCBmbGFncykpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgY29kZSB3aWxsIHJlaW5pdCB0aGUgUmFkZW9uIENQIGhhcmR3YXJlIGFmdGVyIGEgcmVzdW1lIGZyb20gZGlzYy4gIAorICogQUZBSUssIGl0IHdvdWxkIGJlIHZlcnkgZGlmZmljdWx0IHRvIHBpY2tsZSB0aGUgc3RhdGUgYXQgc3VzcGVuZCB0aW1lLCBzbyAKKyAqIGhlcmUgd2UgbWFrZSBzdXJlIHRoYXQgYWxsIFJhZGVvbiBoYXJkd2FyZSBpbml0aWFsaXNhdGlvbiBpcyByZS1kb25lIHdpdGhvdXQKKyAqIGFmZmVjdGluZyBydW5uaW5nIGFwcGxpY2F0aW9ucy4KKyAqCisgKiBDaGFybCBQLiBCb3RoYSA8aHR0cDovL2NwYm90aGEubmV0PgorICovCitzdGF0aWMgaW50IHJhZGVvbl9kb19yZXN1bWVfY3AoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIkNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwlEUk1fREVCVUcoIlN0YXJ0aW5nIHJhZGVvbl9kb19yZXN1bWVfY3AoKVxuIik7CisKKyNpZiBfX09TX0hBU19BR1AKKwlpZiAoICFkZXZfcHJpdi0+aXNfcGNpICkgeworCQkvKiBUdXJuIG9mZiBQQ0kgR0FSVCAqLworCQlyYWRlb25fc2V0X3BjaWdhcnQoIGRldl9wcml2LCAwICk7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCS8qIFR1cm4gb24gUENJIEdBUlQgKi8KKwkJcmFkZW9uX3NldF9wY2lnYXJ0KCBkZXZfcHJpdiwgMSApOworCX0KKworCXJhZGVvbl9jcF9sb2FkX21pY3JvY29kZSggZGV2X3ByaXYgKTsKKwlyYWRlb25fY3BfaW5pdF9yaW5nX2J1ZmZlciggZGV2LCBkZXZfcHJpdiApOworCisJcmFkZW9uX2RvX2VuZ2luZV9yZXNldCggZGV2ICk7CisKKwlEUk1fREVCVUcoInJhZGVvbl9kb19yZXN1bWVfY3AoKSBjb21wbGV0ZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgcmFkZW9uX2NwX2luaXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25faW5pdF90IGluaXQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBpbml0LCAoZHJtX3JhZGVvbl9pbml0X3QgX191c2VyICopZGF0YSwgc2l6ZW9mKGluaXQpICk7CisKKwlzd2l0Y2ggKCBpbml0LmZ1bmMgKSB7CisJY2FzZSBSQURFT05fSU5JVF9DUDoKKwljYXNlIFJBREVPTl9JTklUX1IyMDBfQ1A6CisJY2FzZSBSQURFT05fSU5JVF9SMzAwX0NQOgorCQlyZXR1cm4gcmFkZW9uX2RvX2luaXRfY3AoIGRldiwgJmluaXQgKTsKKwljYXNlIFJBREVPTl9DTEVBTlVQX0NQOgorCQlyZXR1cm4gcmFkZW9uX2RvX2NsZWFudXBfY3AoIGRldiApOworCX0KKworCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cit9CisKK2ludCByYWRlb25fY3Bfc3RhcnQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCBkZXZfcHJpdi0+Y3BfcnVubmluZyApIHsKKwkJRFJNX0RFQlVHKCAiJXMgd2hpbGUgQ1AgcnVubmluZ1xuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIGRldl9wcml2LT5jcF9tb2RlID09IFJBREVPTl9DU1FfUFJJRElTX0lORERJUyApIHsKKwkJRFJNX0RFQlVHKCAiJXMgY2FsbGVkIHdpdGggYm9ndXMgQ1AgbW9kZSAoJWQpXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkZXZfcHJpdi0+Y3BfbW9kZSApOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYWRlb25fZG9fY3Bfc3RhcnQoIGRldl9wcml2ICk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU3RvcCB0aGUgQ1AuICBUaGUgZW5naW5lIG11c3QgaGF2ZSBiZWVuIGlkbGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMKKyAqIHJvdXRpbmUuCisgKi8KK2ludCByYWRlb25fY3Bfc3RvcCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX2NwX3N0b3BfdCBzdG9wOworCWludCByZXQ7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBzdG9wLCAoZHJtX3JhZGVvbl9jcF9zdG9wX3QgX191c2VyICopZGF0YSwgc2l6ZW9mKHN0b3ApICk7CisKKwlpZiAoIWRldl9wcml2LT5jcF9ydW5uaW5nKQorCQlyZXR1cm4gMDsKKworCS8qIEZsdXNoIGFueSBwZW5kaW5nIENQIGNvbW1hbmRzLiAgVGhpcyBlbnN1cmVzIGFueSBvdXRzdGFuZGluZworCSAqIGNvbW1hbmRzIGFyZSBleGVjdHV0ZWQgYnkgdGhlIGVuZ2luZSBiZWZvcmUgd2UgdHVybiBpdCBvZmYuCisJICovCisJaWYgKCBzdG9wLmZsdXNoICkgeworCQlyYWRlb25fZG9fY3BfZmx1c2goIGRldl9wcml2ICk7CisJfQorCisJLyogSWYgd2UgZmFpbCB0byBtYWtlIHRoZSBlbmdpbmUgZ28gaWRsZSwgd2UgcmV0dXJuIGFuIGVycm9yCisJICogY29kZSBzbyB0aGF0IHRoZSBEUk0gaW9jdGwgd3JhcHBlciBjYW4gdHJ5IGFnYWluLgorCSAqLworCWlmICggc3RvcC5pZGxlICkgeworCQlyZXQgPSByYWRlb25fZG9fY3BfaWRsZSggZGV2X3ByaXYgKTsKKwkJaWYgKCByZXQgKSByZXR1cm4gcmV0OworCX0KKworCS8qIEZpbmFsbHksIHdlIGNhbiB0dXJuIG9mZiB0aGUgQ1AuICBJZiB0aGUgZW5naW5lIGlzbid0IGlkbGUsCisJICogd2Ugd2lsbCBnZXQgc29tZSBkcm9wcGVkIHRyaWFuZ2xlcyBhcyB0aGV5IHdvbid0IGJlIGZ1bGx5CisJICogcmVuZGVyZWQgYmVmb3JlIHRoZSBDUCBpcyBzaHV0IGRvd24uCisJICovCisJcmFkZW9uX2RvX2NwX3N0b3AoIGRldl9wcml2ICk7CisKKwkvKiBSZXNldCB0aGUgZW5naW5lICovCisJcmFkZW9uX2RvX2VuZ2luZV9yZXNldCggZGV2ICk7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIHJhZGVvbl9kb19yZWxlYXNlKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaSwgcmV0OworCisJaWYgKGRldl9wcml2KSB7CisJCWlmIChkZXZfcHJpdi0+Y3BfcnVubmluZykgeworCQkJLyogU3RvcCB0aGUgY3AgKi8KKwkJCXdoaWxlICgocmV0ID0gcmFkZW9uX2RvX2NwX2lkbGUoIGRldl9wcml2ICkpICE9IDApIHsKKwkJCQlEUk1fREVCVUcoInJhZGVvbl9kb19jcF9pZGxlICVkXG4iLCByZXQpOworI2lmZGVmIF9fbGludXhfXworCQkJCXNjaGVkdWxlKCk7CisjZWxzZQorCQkJCXRzbGVlcCgmcmV0LCBQWkVSTywgInJkbnJlbCIsIDEpOworI2VuZGlmCisJCQl9CisJCQlyYWRlb25fZG9fY3Bfc3RvcCggZGV2X3ByaXYgKTsKKwkJCXJhZGVvbl9kb19lbmdpbmVfcmVzZXQoIGRldiApOworCQl9CisKKwkJLyogRGlzYWJsZSAqYWxsKiBpbnRlcnJ1cHRzICovCisJCWlmIChkZXZfcHJpdi0+bW1pbykJLyogcmVtb3ZlIHRoaXMgYWZ0ZXIgcGVybWFuZW50IGFkZG1hcHMgKi8KKwkJCVJBREVPTl9XUklURSggUkFERU9OX0dFTl9JTlRfQ05UTCwgMCApOworCisJCWlmIChkZXZfcHJpdi0+bW1pbykgey8qIHJlbW92ZSBhbGwgc3VyZmFjZXMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspIHsKKwkJCQlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX0lORk8gKyAxNippLCAwKTsKKwkJCQlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX0xPV0VSX0JPVU5EICsgMTYqaSwgMCk7CisJCQkJUkFERU9OX1dSSVRFKFJBREVPTl9TVVJGQUNFMF9VUFBFUl9CT1VORCArIDE2KmksIDApOworCQkJfQorCQl9CisKKwkJLyogRnJlZSBtZW1vcnkgaGVhcCBzdHJ1Y3R1cmVzICovCisJCXJhZGVvbl9tZW1fdGFrZWRvd24oICYoZGV2X3ByaXYtPmdhcnRfaGVhcCkgKTsKKwkJcmFkZW9uX21lbV90YWtlZG93biggJihkZXZfcHJpdi0+ZmJfaGVhcCkgKTsKKworCQkvKiBkZWFsbG9jYXRlIGtlcm5lbCByZXNvdXJjZXMgKi8KKwkJcmFkZW9uX2RvX2NsZWFudXBfY3AoIGRldiApOworCX0KK30KKworLyogSnVzdCByZXNldCB0aGUgQ1AgcmluZy4gIENhbGxlZCBhcyBwYXJ0IG9mIGFuIFggU2VydmVyIGVuZ2luZSByZXNldC4KKyAqLworaW50IHJhZGVvbl9jcF9yZXNldCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0RFQlVHKCAiJXMgY2FsbGVkIGJlZm9yZSBpbml0IGRvbmVcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJhZGVvbl9kb19jcF9yZXNldCggZGV2X3ByaXYgKTsKKworCS8qIFRoZSBDUCBpcyBubyBsb25nZXIgcnVubmluZyBhZnRlciBhbiBlbmdpbmUgcmVzZXQgKi8KKwlkZXZfcHJpdi0+Y3BfcnVubmluZyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJhZGVvbl9jcF9pZGxlKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCURSTV9ERUJVRyggIlxuIiApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCXJldHVybiByYWRlb25fZG9fY3BfaWRsZSggZGV2X3ByaXYgKTsKK30KKworLyogQWRkZWQgYnkgQ2hhcmwgUC4gQm90aGEgdG8gY2FsbCByYWRlb25fZG9fcmVzdW1lX2NwKCkuCisgKi8KK2ludCByYWRlb25fY3BfcmVzdW1lKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKworCXJldHVybiByYWRlb25fZG9fcmVzdW1lX2NwKGRldik7Cit9CisKKworaW50IHJhZGVvbl9lbmdpbmVfcmVzZXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCURSTV9ERUJVRyggIlxuIiApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCXJldHVybiByYWRlb25fZG9fZW5naW5lX3Jlc2V0KCBkZXYgKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGdWxsc2NyZWVuIG1vZGUKKyAqLworCisvKiBLVzogRGVwcmVjYXRlZCB0byBzYXkgdGhlIGxlYXN0OgorICovCitpbnQgcmFkZW9uX2Z1bGxzY3JlZW4oIERSTV9JT0NUTF9BUkdTICkKK3sKKwlyZXR1cm4gMDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGcmVlbGlzdCBtYW5hZ2VtZW50CisgKi8KKworLyogT3JpZ2luYWwgY29tbWVudDogRklYTUU6IFJPVEFURV9CVUZTIGlzIGEgaGFjayB0byBjeWNsZSB0aHJvdWdoCisgKiAgIGJ1ZnMgdW50aWwgZnJlZWxpc3QgY29kZSBpcyB1c2VkLiAgTm90ZSB0aGlzIGhpZGVzIGEgcHJvYmxlbSB3aXRoCisgKiAgIHRoZSBzY3JhdGNoIHJlZ2lzdGVyICogKHVzZWQgdG8ga2VlcCB0cmFjayBvZiBsYXN0IGJ1ZmZlcgorICogICBjb21wbGV0ZWQpIGJlaW5nIHdyaXR0ZW4gdG8gYmVmb3JlICogdGhlIGxhc3QgYnVmZmVyIGhhcyBhY3R1YWxseQorICogICBjb21wbGV0ZWQgcmVuZGVyaW5nLiAgCisgKgorICogS1c6ICBJdCdzIGFsc28gYSBnb29kIHdheSB0byBmaW5kIGZyZWUgYnVmZmVycyBxdWlja2x5LgorICoKKyAqIEtXOiBJZGVhbGx5IHRoaXMgbG9vcCB3b3VsZG4ndCBleGlzdCwgYW5kIGZyZWVsaXN0X2dldCB3b3VsZG4ndAorICogc2xlZXAuICBIb3dldmVyLCBidWdzIGluIG9sZGVyIHZlcnNpb25zIG9mIHJhZGVvbl9hY2NlbC5jIG1lYW4gdGhhdAorICogd2UgZXNzZW50aWFsbHkgaGF2ZSB0byBkbyB0aGlzLCBlbHNlIG9sZCBjbGllbnRzIHdpbGwgYnJlYWsuCisgKiAKKyAqIEhvd2V2ZXIsIGl0IGRvZXMgbGVhdmUgb3BlbiBhIHBvdGVudGlhbCBkZWFkbG9jayB3aGVyZSBhbGwgdGhlCisgKiBidWZmZXJzIGFyZSBoZWxkIGJ5IG90aGVyIGNsaWVudHMsIHdoaWNoIGNhbid0IHJlbGVhc2UgdGhlbSBiZWNhdXNlCisgKiB0aGV5IGNhbid0IGdldCB0aGUgbG9jay4gIAorICovCisKK2RybV9idWZfdCAqcmFkZW9uX2ZyZWVsaXN0X2dldCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlpbnQgaSwgdDsKKwlpbnQgc3RhcnQ7CisKKwlpZiAoICsrZGV2X3ByaXYtPmxhc3RfYnVmID49IGRtYS0+YnVmX2NvdW50ICkKKwkJZGV2X3ByaXYtPmxhc3RfYnVmID0gMDsKKworCXN0YXJ0ID0gZGV2X3ByaXYtPmxhc3RfYnVmOworCisJZm9yICggdCA9IDAgOyB0IDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IHQrKyApIHsKKwkJdTMyIGRvbmVfYWdlID0gR0VUX1NDUkFUQ0goIDEgKTsKKwkJRFJNX0RFQlVHKCJkb25lX2FnZSA9ICVkXG4iLGRvbmVfYWdlKTsKKwkJZm9yICggaSA9IHN0YXJ0IDsgaSA8IGRtYS0+YnVmX2NvdW50IDsgaSsrICkgeworCQkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQkJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQkJaWYgKCBidWYtPmZpbHAgPT0gMCB8fCAoYnVmLT5wZW5kaW5nICYmIAorCQkJCQkgICAgICAgYnVmX3ByaXYtPmFnZSA8PSBkb25lX2FnZSkgKSB7CisJCQkJZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzKys7CisJCQkJYnVmLT5wZW5kaW5nID0gMDsKKwkJCQlyZXR1cm4gYnVmOworCQkJfQorCQkJc3RhcnQgPSAwOworCQl9CisKKwkJaWYgKHQpIHsKKwkJCURSTV9VREVMQVkoIDEgKTsKKwkJCWRldl9wcml2LT5zdGF0cy5mcmVlbGlzdF9sb29wcysrOworCQl9CisJfQorCisJRFJNX0RFQlVHKCAicmV0dXJuaW5nIE5VTEwhXG4iICk7CisJcmV0dXJuIE5VTEw7Cit9CisjaWYgMAorZHJtX2J1Zl90ICpyYWRlb25fZnJlZWxpc3RfZ2V0KCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWRybV9idWZfdCAqYnVmOworCWludCBpLCB0OworCWludCBzdGFydDsKKwl1MzIgZG9uZV9hZ2UgPSBEUk1fUkVBRDMyKGRldl9wcml2LT5yaW5nX3JwdHIsIFJBREVPTl9TQ1JBVENIT0ZGKDEpKTsKKworCWlmICggKytkZXZfcHJpdi0+bGFzdF9idWYgPj0gZG1hLT5idWZfY291bnQgKQorCQlkZXZfcHJpdi0+bGFzdF9idWYgPSAwOworCisJc3RhcnQgPSBkZXZfcHJpdi0+bGFzdF9idWY7CisJZGV2X3ByaXYtPnN0YXRzLmZyZWVsaXN0X2xvb3BzKys7CisJCisJZm9yICggdCA9IDAgOyB0IDwgMiA7IHQrKyApIHsKKwkJZm9yICggaSA9IHN0YXJ0IDsgaSA8IGRtYS0+YnVmX2NvdW50IDsgaSsrICkgeworCQkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQkJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQkJaWYgKCBidWYtPmZpbHAgPT0gMCB8fCAoYnVmLT5wZW5kaW5nICYmIAorCQkJCQkgICAgICAgYnVmX3ByaXYtPmFnZSA8PSBkb25lX2FnZSkgKSB7CisJCQkJZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzKys7CisJCQkJYnVmLT5wZW5kaW5nID0gMDsKKwkJCQlyZXR1cm4gYnVmOworCQkJfQorCQl9CisJCXN0YXJ0ID0gMDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCit2b2lkIHJhZGVvbl9mcmVlbGlzdF9yZXNldCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CisKKwlkZXZfcHJpdi0+bGFzdF9idWYgPSAwOworCWZvciAoIGkgPSAwIDsgaSA8IGRtYS0+YnVmX2NvdW50IDsgaSsrICkgeworCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJZHJtX3JhZGVvbl9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJCWJ1Zl9wcml2LT5hZ2UgPSAwOworCX0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDUCBjb21tYW5kIHN1Ym1pc3Npb24KKyAqLworCitpbnQgcmFkZW9uX3dhaXRfcmluZyggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgbiApCit7CisJZHJtX3JhZGVvbl9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJmRldl9wcml2LT5yaW5nOworCWludCBpOworCXUzMiBsYXN0X2hlYWQgPSBHRVRfUklOR19IRUFEKCBkZXZfcHJpdiApOworCisJZm9yICggaSA9IDAgOyBpIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IGkrKyApIHsKKwkJdTMyIGhlYWQgPSBHRVRfUklOR19IRUFEKCBkZXZfcHJpdiApOworCisJCXJpbmctPnNwYWNlID0gKGhlYWQgLSByaW5nLT50YWlsKSAqIHNpemVvZih1MzIpOworCQlpZiAoIHJpbmctPnNwYWNlIDw9IDAgKQorCQkJcmluZy0+c3BhY2UgKz0gcmluZy0+c2l6ZTsKKwkJaWYgKCByaW5nLT5zcGFjZSA+IG4gKQorCQkJcmV0dXJuIDA7CisJCQorCQlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9XQUlUX0lETEU7CisKKwkJaWYgKGhlYWQgIT0gbGFzdF9oZWFkKQorCQkJaSA9IDA7CisJCWxhc3RfaGVhZCA9IGhlYWQ7CisKKwkJRFJNX1VERUxBWSggMSApOworCX0KKworCS8qIEZJWE1FOiBUaGlzIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkIGluIHRoZSBCRUdJTl9SSU5HIG1hY3JvISAqLworI2lmIFJBREVPTl9GSUZPX0RFQlVHCisJcmFkZW9uX3N0YXR1cyggZGV2X3ByaXYgKTsKKwlEUk1fRVJST1IoICJmYWlsZWQhXG4iICk7CisjZW5kaWYKKwlyZXR1cm4gRFJNX0VSUihFQlVTWSk7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2dldF9idWZmZXJzKCBEUk1GSUxFIGZpbHAsIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZG1hX3QgKmQgKQoreworCWludCBpOworCWRybV9idWZfdCAqYnVmOworCisJZm9yICggaSA9IGQtPmdyYW50ZWRfY291bnQgOyBpIDwgZC0+cmVxdWVzdF9jb3VudCA7IGkrKyApIHsKKwkJYnVmID0gcmFkZW9uX2ZyZWVsaXN0X2dldCggZGV2ICk7CisJCWlmICggIWJ1ZiApIHJldHVybiBEUk1fRVJSKEVCVVNZKTsgLyogTk9URTogYnJva2VuIGNsaWVudCAqLworCisJCWJ1Zi0+ZmlscCA9IGZpbHA7CisKKwkJaWYgKCBEUk1fQ09QWV9UT19VU0VSKCAmZC0+cmVxdWVzdF9pbmRpY2VzW2ldLCAmYnVmLT5pZHgsCisJCQkJICAgc2l6ZW9mKGJ1Zi0+aWR4KSApICkKKwkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCWlmICggRFJNX0NPUFlfVE9fVVNFUiggJmQtPnJlcXVlc3Rfc2l6ZXNbaV0sICZidWYtPnRvdGFsLAorCQkJCSAgIHNpemVvZihidWYtPnRvdGFsKSApICkKKwkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwkJZC0+Z3JhbnRlZF9jb3VudCsrOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJhZGVvbl9jcF9idWZmZXJzKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlpbnQgcmV0ID0gMDsKKwlkcm1fZG1hX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlkcm1fZG1hX3QgZDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGQsIGFyZ3AsIHNpemVvZihkKSApOworCisJLyogUGxlYXNlIGRvbid0IHNlbmQgdXMgYnVmZmVycy4KKwkgKi8KKwlpZiAoIGQuc2VuZF9jb3VudCAhPSAwICkgeworCQlEUk1fRVJST1IoICJQcm9jZXNzICVkIHRyeWluZyB0byBzZW5kICVkIGJ1ZmZlcnMgdmlhIGRybURNQVxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBkLnNlbmRfY291bnQgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwkvKiBXZSdsbCBzZW5kIHlvdSBidWZmZXJzLgorCSAqLworCWlmICggZC5yZXF1ZXN0X2NvdW50IDwgMCB8fCBkLnJlcXVlc3RfY291bnQgPiBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJRFJNX0VSUk9SKCAiUHJvY2VzcyAlZCB0cnlpbmcgdG8gZ2V0ICVkIGJ1ZmZlcnMgKG9mICVkIG1heClcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgZC5yZXF1ZXN0X2NvdW50LCBkbWEtPmJ1Zl9jb3VudCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWQuZ3JhbnRlZF9jb3VudCA9IDA7CisKKwlpZiAoIGQucmVxdWVzdF9jb3VudCApIHsKKwkJcmV0ID0gcmFkZW9uX2NwX2dldF9idWZmZXJzKCBmaWxwLCBkZXYsICZkICk7CisJfQorCisJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCggYXJncCwgZCwgc2l6ZW9mKGQpICk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcmFkZW9uX2RyaXZlcl9wcmVpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2OworCWludCByZXQgPSAwOworCisJZGV2X3ByaXYgPSBkcm1fYWxsb2Moc2l6ZW9mKGRybV9yYWRlb25fcHJpdmF0ZV90KSwgRFJNX01FTV9EUklWRVIpOworCWlmIChkZXZfcHJpdiA9PSBOVUxMKQorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCisJbWVtc2V0KGRldl9wcml2LCAwLCBzaXplb2YoZHJtX3JhZGVvbl9wcml2YXRlX3QpKTsKKwlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwlkZXZfcHJpdi0+ZmxhZ3MgPSBmbGFnczsKKworCXN3aXRjaCAoZmxhZ3MgJiBDSElQX0ZBTUlMWV9NQVNLKSB7CisJY2FzZSBDSElQX1IxMDA6CisJY2FzZSBDSElQX1JWMjAwOgorCWNhc2UgQ0hJUF9SMjAwOgorCWNhc2UgQ0hJUF9SMzAwOgorCQlkZXZfcHJpdi0+ZmxhZ3MgfD0gQ0hJUF9IQVNfSElFUlo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJLyogYWxsIG90aGVyIGNoaXBzIGhhdmUgbm8gaGllcmFyY2hpY2FsIHogYnVmZmVyICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgcmFkZW9uX2RyaXZlcl9wb3N0Y2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlkcm1fZnJlZShkZXZfcHJpdiwgc2l6ZW9mKCpkZXZfcHJpdiksIERSTV9NRU1fRFJJVkVSKTsKKworCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWU2MmQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKQEAgLTAsMCArMSw2NTkgQEAKKy8qIHJhZGVvbl9kcm0uaCAtLSBQdWJsaWMgaGVhZGVyIGZvciB0aGUgcmFkZW9uIGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBGcmVtb250LCBDYWxpZm9ybmlhLgorICogQ29weXJpZ2h0IDIwMDIgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICovCisKKyNpZm5kZWYgX19SQURFT05fRFJNX0hfXworI2RlZmluZSBfX1JBREVPTl9EUk1fSF9fCisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYIHNlcnZlciBmaWxlIChyYWRlb25fc2FyZWEuaCkKKyAqLworI2lmbmRlZiBfX1JBREVPTl9TQVJFQV9ERUZJTkVTX18KKyNkZWZpbmUgX19SQURFT05fU0FSRUFfREVGSU5FU19fCisKKy8qIE9sZCBzdHlsZSBzdGF0ZSBmbGFncywgcmVxdWlyZWQgZm9yIHNhcmVhIGludGVyZmFjZSAoMS4xIGFuZCAxLjIKKyAqIGNsZWFycykgYW5kIDEuMiBkcm1fdmVydGV4MiBpb2N0bC4KKyAqLworI2RlZmluZSBSQURFT05fVVBMT0FEX0NPTlRFWFQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9WRVJURk1UCQkweDAwMDAwMDAyCisjZGVmaW5lIFJBREVPTl9VUExPQURfTElORQkJMHgwMDAwMDAwNAorI2RlZmluZSBSQURFT05fVVBMT0FEX0JVTVBNQVAJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9NQVNLUwkJMHgwMDAwMDAxMAorI2RlZmluZSBSQURFT05fVVBMT0FEX1ZJRVdQT1JUCQkweDAwMDAwMDIwCisjZGVmaW5lIFJBREVPTl9VUExPQURfU0VUVVAJCTB4MDAwMDAwNDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9UQ0wJCTB4MDAwMDAwODAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9NSVNDCQkweDAwMDAwMTAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMAkJMHgwMDAwMDIwMAorI2RlZmluZSBSQURFT05fVVBMT0FEX1RFWDEJCTB4MDAwMDA0MDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9URVgyCQkweDAwMDAwODAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMElNQUdFUwkweDAwMDAxMDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMUlNQUdFUwkweDAwMDAyMDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMklNQUdFUwkweDAwMDA0MDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfQ0xJUFJFQ1RTCQkweDAwMDA4MDAwIC8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgUkFERU9OX1JFUVVJUkVfUVVJRVNDRU5DRQkweDAwMDEwMDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfWkJJQVMJCTB4MDAwMjAwMDAgLyogdmVyc2lvbiAxLjIgYW5kIG5ld2VyICovCisjZGVmaW5lIFJBREVPTl9VUExPQURfQUxMCQkweDAwM2VmZmZmCisjZGVmaW5lIFJBREVPTl9VUExPQURfQ09OVEVYVF9BTEwgICAgICAgMHgwMDNlMDFmZgorCisKKy8qIE5ldyBzdHlsZSBwZXItcGFja2V0IGlkZW50aWZpZXJzIGZvciB1c2UgaW4gY21kX2J1ZmZlciBpb2N0bCB3aXRoCisgKiB0aGUgUkFERU9OX0VNSVRfUEFDS0VUIGNvbW1hbmQuICBDb21tZW50cyByZWxhdGUgbmV3IHBhY2tldHMgdG8gb2xkCisgKiBzdGF0ZSBiaXRzIGFuZCB0aGUgcGFja2V0IHNpemU6CisgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGNvbnRleHQvNyAqLworI2RlZmluZSBSQURFT05fRU1JVF9QUF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyogY29udGV4dC8zICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1JCM0RfQ09MT1JQSVRDSCAgICAgICAgICAgICAgICAgMiAvKiBjb250ZXh0LzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUkVfTElORV9QQVRURVJOICAgICAgICAgICAgICAgICAzIC8qIGxpbmUvMiAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9MSU5FX1dJRFRIICAgICAgICAgICAgICAgICAgIDQgLyogbGluZS8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0xVTV9NQVRSSVggICAgICAgICAgICAgICAgICAgNSAvKiBidW1wbWFwLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfUk9UX01BVFJJWF8wICAgICAgICAgICAgICAgICA2IC8qIGJ1bXBtYXAvMiAqLworI2RlZmluZSBSQURFT05fRU1JVF9SQjNEX1NURU5DSUxSRUZNQVNLICAgICAgICAgICAgIDcgLyogbWFza3MvMyAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9WUE9SVF9YU0NBTEUgICAgICAgICAgICAgICAgIDggLyogdmlld3BvcnQvNiAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgIDkgLyogc2V0dXAvMiAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9DTlRMX1NUQVRVUyAgICAgICAgICAgICAgICAgIDEwIC8qIHNldHVwLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUkVfTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAxMSAvKiBtaXNjLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMCAgICAgICAgICAgICAgICAgICAxMiAvKiB0ZXgwLzYgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzAgICAgICAgICAgICAgICAxMyAvKiB0ZXgwLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMSAgICAgICAgICAgICAgICAgICAxNCAvKiB0ZXgxLzYgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzEgICAgICAgICAgICAgICAxNSAvKiB0ZXgxLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMiAgICAgICAgICAgICAgICAgICAxNiAvKiB0ZXgyLzYgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzIgICAgICAgICAgICAgICAxNyAvKiB0ZXgyLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfU0VfWkJJQVNfRkFDVE9SICAgICAgICAgICAgICAgICAxOCAvKiB6Ymlhcy8yICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1NFX1RDTF9PVVRQVVRfVlRYX0ZNVCAgICAgICAgICAgMTkgLyogdGNsLzExICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1NFX1RDTF9NQVRFUklBTF9FTU1JU1NJVkVfUkVEICAgMjAgLyogbWF0ZXJpYWwvMTcgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzAgICAgICAgICAgICAgICAgICAgICAyMSAvKiB0ZXgwLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzEgICAgICAgICAgICAgICAgICAgICAyMiAvKiB0ZXgxLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzIgICAgICAgICAgICAgICAgICAgICAyMyAvKiB0ZXgyLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzMgICAgICAgICAgICAgICAgICAgICAyNCAvKiB0ZXgzLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzQgICAgICAgICAgICAgICAgICAgICAyNSAvKiB0ZXg0LzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzUgICAgICAgICAgICAgICAgICAgICAyNiAvKiB0ZXg1LzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzYgICAgICAgICAgICAgICAgICAgICAyNyAvKiAvNCAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNyAgICAgICAgICAgICAgICAgICAgIDI4IC8qIC80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9UQ0xfTElHSFRfTU9ERUxfQ1RMXzAgICAgICAgICAgICAgMjkgLyogdGNsLzcgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1RGQUNUT1JfMCAgICAgICAgICAgICAgICAgICAgICAgICAzMCAvKiB0Zi83ICovCisjZGVmaW5lIFIyMDBfRU1JVF9WVFhfRk1UXzAgICAgICAgICAgICAgICAgICAgICAgICAgMzEgLyogdnR4LzUgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1ZBUF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAvKiB2YXAvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfTUFUUklYX1NFTEVDVF8wICAgICAgICAgICAgICAgICAgIDMzIC8qIG1zbC81ICovCisjZGVmaW5lIFIyMDBfRU1JVF9URVhfUFJPQ19DVExfMiAgICAgICAgICAgICAgICAgICAgMzQgLyogdGNnLzUgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1RDTF9VQ1BfVkVSVF9CTEVORF9DVEwgICAgICAgICAgICAzNSAvKiB0Y2wvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMCAgICAgICAgICAgICAgICAgICAgIDM2IC8qIHRleDAvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMSAgICAgICAgICAgICAgICAgICAgIDM3IC8qIHRleDEvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMiAgICAgICAgICAgICAgICAgICAgIDM4IC8qIHRleDIvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMyAgICAgICAgICAgICAgICAgICAgIDM5IC8qIHRleDMvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfNCAgICAgICAgICAgICAgICAgICAgIDQwIC8qIHRleDQvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfNSAgICAgICAgICAgICAgICAgICAgIDQxIC8qIHRleDUvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMCAgICAgICAgICAgICAgICAgICAgIDQyIC8qIHRleDAvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMSAgICAgICAgICAgICAgICAgICAgIDQzIC8qIHRleDEvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMiAgICAgICAgICAgICAgICAgICAgIDQ0IC8qIHRleDIvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMyAgICAgICAgICAgICAgICAgICAgIDQ1IC8qIHRleDMvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfNCAgICAgICAgICAgICAgICAgICAgIDQ2IC8qIHRleDQvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfNSAgICAgICAgICAgICAgICAgICAgIDQ3IC8qIHRleDUvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfVlRFX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4IC8qIHZ0ZS8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9PVVRQVVRfVlRYX0NPTVBfU0VMICAgICAgICAgICAgICAgNDkgLyogdnR4LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RBTV9ERUJVRzMgICAgICAgICAgICAgICAgICAgICA1MCAvKiB0YW0vMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfQ05UTF9YICAgICAgICAgICAgICAgICAgICAgICAgIDUxIC8qIGNzdC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9SQjNEX0RFUFRIWFlfT0ZGU0VUICAgICAgICAgICAgICAgNTIgLyogY3N0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1JFX0FVWF9TQ0lTU09SX0NOVEwgICAgICAgICAgICAgICA1MyAvKiBjc3QvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUkVfU0NJU1NPUl9UTF8wICAgICAgICAgICAgICAgICAgIDU0IC8qIGNzdC8yICovCisjZGVmaW5lIFIyMDBfRU1JVF9SRV9TQ0lTU09SX1RMXzEgICAgICAgICAgICAgICAgICAgNTUgLyogY3N0LzIgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1JFX1NDSVNTT1JfVExfMiAgICAgICAgICAgICAgICAgICA1NiAvKiBjc3QvMiAqLworI2RlZmluZSBSMjAwX0VNSVRfU0VfVkFQX0NOVExfU1RBVFVTICAgICAgICAgICAgICAgIDU3IC8qIGNzdC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9TRV9WVFhfU1RBVEVfQ05UTCAgICAgICAgICAgICAgICAgNTggLyogY3N0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1JFX1BPSU5UU0laRSAgICAgICAgICAgICAgICAgICAgICA1OSAvKiBjc3QvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfVENMX0lOUFVUX1ZUWF9WRUNUT1JfQUREUl8wICAgICAgIDYwIC8qIGNzdC80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18wICAgICAgICAgICAgICAgICAgNjEKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMCAgICAgICAgICAgICAgICA2MgorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMSAgICAgICAgICAgICAgICAgIDYzCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzEgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzIgICAgICAgICAgICAgICAgICA2NQorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18yICAgICAgICAgICAgICAgIDY2CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18zICAgICAgICAgICAgICAgICAgNjcKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMyAgICAgICAgICAgICAgICA2OAorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfNCAgICAgICAgICAgICAgICAgIDY5CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzQgICAgICAgICAgICAgICAgNzAKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzUgICAgICAgICAgICAgICAgICA3MQorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU181ICAgICAgICAgICAgICAgIDcyCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1RFWF9TSVpFXzAgICAgICAgICAgICAgICAgICAgNzMKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVEVYX1NJWkVfMSAgICAgICAgICAgICAgICAgICA3NAorI2RlZmluZSBSQURFT05fRU1JVF9QUF9URVhfU0laRV8yICAgICAgICAgICAgICAgICAgIDc1CisjZGVmaW5lIFIyMDBfRU1JVF9SQjNEX0JMRU5EQ09MT1IgICAgICAgICAgICAgICAgICAgNzYKKyNkZWZpbmUgUjIwMF9FTUlUX1RDTF9QT0lOVF9TUFJJVEVfQ05UTCAgICAgICAgICAgICA3NworI2RlZmluZSBSQURFT05fRU1JVF9QUF9DVUJJQ19GQUNFU18wICAgICAgICAgICAgICAgIDc4CisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDAgICAgICAgICAgICAgNzkKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMSAgICAgICAgICAgICAgICA4MAorI2RlZmluZSBSQURFT05fRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1QxICAgICAgICAgICAgIDgxCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0NVQklDX0ZBQ0VTXzIgICAgICAgICAgICAgICAgODIKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU19UMiAgICAgICAgICAgICA4MworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFJJX1BFUkZfQ05UTCAgICAgICAgICAgICAgICAgIDg0CisjZGVmaW5lIFJBREVPTl9NQVhfU1RBVEVfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgODUKKworLyogQ29tbWFuZHMgdW5kZXJzdG9vZCBieSBjbWRfYnVmZmVyIGlvY3RsLiAgTW9yZSBjYW4gYmUgYWRkZWQgYnV0CisgKiBvYnZpb3VzbHkgdGhlc2UgY2FuJ3QgYmUgcmVtb3ZlZCBvciBjaGFuZ2VkOgorICovCisjZGVmaW5lIFJBREVPTl9DTURfUEFDS0VUICAgICAgMSAvKiBlbWl0IG9uZSBvZiB0aGUgcmVnaXN0ZXIgcGFja2V0cyBhYm92ZSAqLworI2RlZmluZSBSQURFT05fQ01EX1NDQUxBUlMgICAgIDIgLyogZW1pdCBzY2FsYXIgZGF0YSAqLworI2RlZmluZSBSQURFT05fQ01EX1ZFQ1RPUlMgICAgIDMgLyogZW1pdCB2ZWN0b3IgZGF0YSAqLworI2RlZmluZSBSQURFT05fQ01EX0RNQV9ESVNDQVJEIDQgLyogZGlzY2FyZCBjdXJyZW50IGRtYSBidWYgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9QQUNLRVQzICAgICA1IC8qIGVtaXQgaHcgcGFja2V0ICovCisjZGVmaW5lIFJBREVPTl9DTURfUEFDS0VUM19DTElQIDYgLyogZW1pdCBodyBwYWNrZXQgd3JhcHBlZCBpbiBjbGlwcmVjdHMgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9TQ0FMQVJTMiAgICAgNyAvKiByMjAwIHN0b3BnYXAgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9XQUlUICAgICAgICAgOCAvKiBlbWl0IGh3IHdhaXQgY29tbWFuZHMgLS0gbm90ZToKKwkJCQkgICAqICBkb2Vzbid0IG1ha2UgdGhlIGNwdSB3YWl0LCBqdXN0CisJCQkJICAgKiAgdGhlIGdyYXBoaWNzIGhhcmR3YXJlICovCisKKwordHlwZWRlZiB1bmlvbiB7CisJaW50IGk7CisJc3RydWN0IHsgCisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIHBhZDAsIHBhZDEsIHBhZDI7CisJfSBoZWFkZXI7CisJc3RydWN0IHsgCisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIHBhY2tldF9pZCwgcGFkMCwgcGFkMTsKKwl9IHBhY2tldDsKKwlzdHJ1Y3QgeyAKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgb2Zmc2V0LCBzdHJpZGUsIGNvdW50OyAKKwl9IHNjYWxhcnM7CisJc3RydWN0IHsgCisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIG9mZnNldCwgc3RyaWRlLCBjb3VudDsgCisJfSB2ZWN0b3JzOworCXN0cnVjdCB7IAorCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBidWZfaWR4LCBwYWQwLCBwYWQxOyAKKwl9IGRtYTsKKwlzdHJ1Y3QgeyAKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgZmxhZ3MsIHBhZDAsIHBhZDE7IAorCX0gd2FpdDsKK30gZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3Q7CisKKyNkZWZpbmUgUkFERU9OX1dBSVRfMkQgIDB4MQorI2RlZmluZSBSQURFT05fV0FJVF8zRCAgMHgyCisKKworI2RlZmluZSBSQURFT05fRlJPTlQJCQkweDEKKyNkZWZpbmUgUkFERU9OX0JBQ0sJCQkweDIKKyNkZWZpbmUgUkFERU9OX0RFUFRICQkJMHg0CisjZGVmaW5lIFJBREVPTl9TVEVOQ0lMCQkJMHg4CisjZGVmaW5lIFJBREVPTl9DTEVBUl9GQVNUWgkJMHg4MDAwMDAwMAorI2RlZmluZSBSQURFT05fVVNFX0hJRVJaCQkweDQwMDAwMDAwCisjZGVmaW5lIFJBREVPTl9VU0VfQ09NUF9aQlVGCQkweDIwMDAwMDAwCisKKy8qIFByaW1pdGl2ZSB0eXBlcworICovCisjZGVmaW5lIFJBREVPTl9QT0lOVFMJCQkweDEKKyNkZWZpbmUgUkFERU9OX0xJTkVTCQkJMHgyCisjZGVmaW5lIFJBREVPTl9MSU5FX1NUUklQCQkweDMKKyNkZWZpbmUgUkFERU9OX1RSSUFOR0xFUwkJMHg0CisjZGVmaW5lIFJBREVPTl9UUklBTkdMRV9GQU4JCTB4NQorI2RlZmluZSBSQURFT05fVFJJQU5HTEVfU1RSSVAJCTB4NgorCisvKiBWZXJ0ZXgvaW5kaXJlY3QgYnVmZmVyIHNpemUKKyAqLworI2RlZmluZSBSQURFT05fQlVGRkVSX1NJWkUJCTY1NTM2CisKKy8qIEJ5dGUgb2Zmc2V0cyBmb3IgaW5kaXJlY3QgYnVmZmVyIGRhdGEKKyAqLworI2RlZmluZSBSQURFT05fSU5ERVhfUFJJTV9PRkZTRVQJMjAKKworI2RlZmluZSBSQURFT05fU0NSQVRDSF9SRUdfT0ZGU0VUCTMyCisKKyNkZWZpbmUgUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUUwkxMgorCisvKiBUaGVyZSBhcmUgMiBoZWFwcyAobG9jYWwvR0FSVCkuICBFYWNoIHJlZ2lvbiB3aXRoaW4gYSBoZWFwIGlzIGEKKyAqIG1pbmltdW0gb2YgNjRrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgNjQgb2YgdGhlbSBwZXIgaGVhcC4KKyAqLworI2RlZmluZSBSQURFT05fTE9DQUxfVEVYX0hFQVAJCTAKKyNkZWZpbmUgUkFERU9OX0dBUlRfVEVYX0hFQVAJCTEKKyNkZWZpbmUgUkFERU9OX05SX1RFWF9IRUFQUwkJMgorI2RlZmluZSBSQURFT05fTlJfVEVYX1JFR0lPTlMJCTY0CisjZGVmaW5lIFJBREVPTl9MT0dfVEVYX0dSQU5VTEFSSVRZCTE2CisKKyNkZWZpbmUgUkFERU9OX01BWF9URVhUVVJFX0xFVkVMUwkxMgorI2RlZmluZSBSQURFT05fTUFYX1RFWFRVUkVfVU5JVFMJMworCisjZGVmaW5lIFJBREVPTl9NQVhfU1VSRkFDRVMJCTgKKworLyogQmxpdHMgaGF2ZSBzdHJpY3Qgb2Zmc2V0IHJ1bGVzLiAgQWxsIGJsaXQgb2Zmc2V0IG11c3QgYmUgYWxpZ25lZCBvbgorICogYSAxSy1ieXRlIGJvdW5kYXJ5LgorICovCisjZGVmaW5lIFJBREVPTl9PRkZTRVRfU0hJRlQgICAgICAgICAgICAgMTAKKyNkZWZpbmUgUkFERU9OX09GRlNFVF9BTElHTiAgICAgICAgICAgICAoMSA8PCBSQURFT05fT0ZGU0VUX1NISUZUKQorI2RlZmluZSBSQURFT05fT0ZGU0VUX01BU0sgICAgICAgICAgICAgIChSQURFT05fT0ZGU0VUX0FMSUdOIC0gMSkKKworI2VuZGlmIC8qIF9fUkFERU9OX1NBUkVBX0RFRklORVNfXyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHJlZDsKKwl1bnNpZ25lZCBpbnQgZ3JlZW47CisJdW5zaWduZWQgaW50IGJsdWU7CisJdW5zaWduZWQgaW50IGFscGhhOworfSByYWRlb25fY29sb3JfcmVnc190OworCit0eXBlZGVmIHN0cnVjdCB7CisJLyogQ29udGV4dCBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBwcF9taXNjOwkJCQkvKiAweDFjMTQgKi8KKwl1bnNpZ25lZCBpbnQgcHBfZm9nX2NvbG9yOworCXVuc2lnbmVkIGludCByZV9zb2xpZF9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgcmIzZF9ibGVuZGNudGw7CisJdW5zaWduZWQgaW50IHJiM2RfZGVwdGhvZmZzZXQ7CisJdW5zaWduZWQgaW50IHJiM2RfZGVwdGhwaXRjaDsKKwl1bnNpZ25lZCBpbnQgcmIzZF96c3RlbmNpbGNudGw7CisKKwl1bnNpZ25lZCBpbnQgcHBfY250bDsJCQkJLyogMHgxYzM4ICovCisJdW5zaWduZWQgaW50IHJiM2RfY250bDsKKwl1bnNpZ25lZCBpbnQgcmIzZF9jb2xvcm9mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmVfd2lkdGhfaGVpZ2h0OworCXVuc2lnbmVkIGludCByYjNkX2NvbG9ycGl0Y2g7CisJdW5zaWduZWQgaW50IHNlX2NudGw7CisKKwkvKiBWZXJ0ZXggZm9ybWF0IHN0YXRlICovCisJdW5zaWduZWQgaW50IHNlX2Nvb3JkX2ZtdDsJCQkvKiAweDFjNTAgKi8KKworCS8qIExpbmUgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgcmVfbGluZV9wYXR0ZXJuOwkJCS8qIDB4MWNkMCAqLworCXVuc2lnbmVkIGludCByZV9saW5lX3N0YXRlOworCisJdW5zaWduZWQgaW50IHNlX2xpbmVfd2lkdGg7CQkJLyogMHgxZGI4ICovCisKKwkvKiBCdW1wbWFwIHN0YXRlICovCisJdW5zaWduZWQgaW50IHBwX2x1bV9tYXRyaXg7CQkJLyogMHgxZDAwICovCisKKwl1bnNpZ25lZCBpbnQgcHBfcm90X21hdHJpeF8wOwkJCS8qIDB4MWQ1OCAqLworCXVuc2lnbmVkIGludCBwcF9yb3RfbWF0cml4XzE7CisKKwkvKiBNYXNrIHN0YXRlICovCisJdW5zaWduZWQgaW50IHJiM2Rfc3RlbmNpbHJlZm1hc2s7CQkvKiAweDFkN2MgKi8KKwl1bnNpZ25lZCBpbnQgcmIzZF9yb3BjbnRsOworCXVuc2lnbmVkIGludCByYjNkX3BsYW5lbWFzazsKKworCS8qIFZpZXdwb3J0IHN0YXRlICovCisJdW5zaWduZWQgaW50IHNlX3Zwb3J0X3hzY2FsZTsJCQkvKiAweDFkOTggKi8KKwl1bnNpZ25lZCBpbnQgc2VfdnBvcnRfeG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgc2VfdnBvcnRfeXNjYWxlOworCXVuc2lnbmVkIGludCBzZV92cG9ydF95b2Zmc2V0OworCXVuc2lnbmVkIGludCBzZV92cG9ydF96c2NhbGU7CisJdW5zaWduZWQgaW50IHNlX3Zwb3J0X3pvZmZzZXQ7CisKKwkvKiBTZXR1cCBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBzZV9jbnRsX3N0YXR1czsJCQkvKiAweDIxNDAgKi8KKworCS8qIE1pc2Mgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgcmVfdG9wX2xlZnQ7CQkJLyogMHgyNmMwICovCisJdW5zaWduZWQgaW50IHJlX21pc2M7Cit9IGRybV9yYWRlb25fY29udGV4dF9yZWdzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBaYmlhcyBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBzZV96Ymlhc19mYWN0b3I7CQkJLyogMHgxZGFjICovCisJdW5zaWduZWQgaW50IHNlX3piaWFzX2NvbnN0YW50OworfSBkcm1fcmFkZW9uX2NvbnRleHQyX3JlZ3NfdDsKKworCisvKiBTZXR1cCByZWdpc3RlcnMgZm9yIGVhY2ggdGV4dHVyZSB1bml0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgcHBfdHhmaWx0ZXI7CisJdW5zaWduZWQgaW50IHBwX3R4Zm9ybWF0OworCXVuc2lnbmVkIGludCBwcF90eG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgcHBfdHhjYmxlbmQ7CisJdW5zaWduZWQgaW50IHBwX3R4YWJsZW5kOworCXVuc2lnbmVkIGludCBwcF90ZmFjdG9yOworCXVuc2lnbmVkIGludCBwcF9ib3JkZXJfY29sb3I7Cit9IGRybV9yYWRlb25fdGV4dHVyZV9yZWdzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CisJdW5zaWduZWQgaW50IGZpbmlzaDsKKwl1bnNpZ25lZCBpbnQgcHJpbTo4OworCXVuc2lnbmVkIGludCBzdGF0ZWlkeDo4OworCXVuc2lnbmVkIGludCBudW12ZXJ0czoxNjsgLyogb3ZlcmxvYWRlZCBhcyBvZmZzZXQvNjQgZm9yIGVsdCBwcmltcyAqLworICAgICAgICB1bnNpZ25lZCBpbnQgdmNfZm9ybWF0OyAgIC8qIHZlcnRleCBmb3JtYXQgKi8KK30gZHJtX3JhZGVvbl9wcmltX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCWRybV9yYWRlb25fY29udGV4dF9yZWdzX3QgY29udGV4dDsKKwlkcm1fcmFkZW9uX3RleHR1cmVfcmVnc190IHRleFtSQURFT05fTUFYX1RFWFRVUkVfVU5JVFNdOworCWRybV9yYWRlb25fY29udGV4dDJfcmVnc190IGNvbnRleHQyOworCXVuc2lnbmVkIGludCBkaXJ0eTsKK30gZHJtX3JhZGVvbl9zdGF0ZV90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBUaGUgY2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiBvZiBzdGF0ZSBpbmZvcm1hdGlvbiB0byB0aGUKKwkgKiBrZXJuZWwgb24gZmlyaW5nIGEgdmVydGV4IGJ1ZmZlciB3aXRoIGVpdGhlciBvZiB0aGUKKwkgKiBvYnNvbGV0ZWQgdmVydGV4L2luZGV4IGlvY3Rscy4KKwkgKi8KKwlkcm1fcmFkZW9uX2NvbnRleHRfcmVnc190IGNvbnRleHRfc3RhdGU7CisJZHJtX3JhZGVvbl90ZXh0dXJlX3JlZ3NfdCB0ZXhfc3RhdGVbUkFERU9OX01BWF9URVhUVVJFX1VOSVRTXTsKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisJdW5zaWduZWQgaW50IHZlcnRzaXplOworCXVuc2lnbmVkIGludCB2Y19mb3JtYXQ7CisKKwkvKiBUaGUgY3VycmVudCBjbGlwcmVjdHMsIG9yIGEgc3Vic2V0IHRoZXJlb2YuCisJICovCisJZHJtX2NsaXBfcmVjdF90IGJveGVzW1JBREVPTl9OUl9TQVJFQV9DTElQUkVDVFNdOworCXVuc2lnbmVkIGludCBuYm94OworCisJLyogQ291bnRlcnMgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcgb2YgcmVuZGVyaW5nIGNsaWVudHMuCisJICovCisJdW5zaWduZWQgaW50IGxhc3RfZnJhbWU7CisJdW5zaWduZWQgaW50IGxhc3RfZGlzcGF0Y2g7CisJdW5zaWduZWQgaW50IGxhc3RfY2xlYXI7CisKKwlkcm1fdGV4X3JlZ2lvbl90IHRleF9saXN0W1JBREVPTl9OUl9URVhfSEVBUFNdW1JBREVPTl9OUl9URVhfUkVHSU9OUysxXTsKKwl1bnNpZ25lZCBpbnQgdGV4X2FnZVtSQURFT05fTlJfVEVYX0hFQVBTXTsKKwlpbnQgY3R4X293bmVyOworICAgICAgICBpbnQgcGZTdGF0ZTsgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIDNkIHdpbmRvd3MgKDAsMSwyb3Jtb3JlKSAqLworICAgICAgICBpbnQgcGZDdXJyZW50UGFnZTsJICAgIC8qIHdoaWNoIGJ1ZmZlciBpcyBiZWluZyBkaXNwbGF5ZWQ/ICovCisJaW50IGNydGMyX2Jhc2U7CQkgICAgLyogQ1JUQzIgZnJhbWUgb2Zmc2V0ICovCisJaW50IHRpbGluZ19lbmFibGVkOwkvKiBzZXQgYnkgZHJtLCByZWFkIGJ5IDJkICsgM2QgY2xpZW50cyAqLworfSBkcm1fcmFkZW9uX3NhcmVhX3Q7CisKKworLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKKyAqIGRlZmluZXMgaW4gdGhlIFhzZXJ2ZXIgZmlsZSAoeGY4NmRybVJhZGVvbi5oKQorICoKKyAqIEtXOiBhY3R1YWxseSBpdCdzIGlsbGVnYWwgdG8gY2hhbmdlIGFueSBvZiB0aGlzIChiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkuCisgKi8KKworLyogUmFkZW9uIHNwZWNpZmljIGlvY3RscworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCisgKi8KKyNkZWZpbmUgRFJNX1JBREVPTl9DUF9JTklUICAgIDB4MDAgCisjZGVmaW5lIERSTV9SQURFT05fQ1BfU1RBUlQgICAweDAxIAorI2RlZmluZSBEUk1fUkFERU9OX0NQX1NUT1AgICAgMHgwMgorI2RlZmluZSBEUk1fUkFERU9OX0NQX1JFU0VUICAgMHgwMworI2RlZmluZSBEUk1fUkFERU9OX0NQX0lETEUgICAgMHgwNAorI2RlZmluZSBEUk1fUkFERU9OX1JFU0VUICAgICAgMHgwNSAKKyNkZWZpbmUgRFJNX1JBREVPTl9GVUxMU0NSRUVOIDB4MDYKKyNkZWZpbmUgRFJNX1JBREVPTl9TV0FQICAgICAgIDB4MDcgCisjZGVmaW5lIERSTV9SQURFT05fQ0xFQVIgICAgICAweDA4IAorI2RlZmluZSBEUk1fUkFERU9OX1ZFUlRFWCAgICAgMHgwOQorI2RlZmluZSBEUk1fUkFERU9OX0lORElDRVMgICAgMHgwQQorI2RlZmluZSBEUk1fUkFERU9OX05PVF9VU0VECisjZGVmaW5lIERSTV9SQURFT05fU1RJUFBMRSAgICAweDBDCisjZGVmaW5lIERSTV9SQURFT05fSU5ESVJFQ1QgICAweDBECisjZGVmaW5lIERSTV9SQURFT05fVEVYVFVSRSAgICAweDBFCisjZGVmaW5lIERSTV9SQURFT05fVkVSVEVYMiAgICAweDBGCisjZGVmaW5lIERSTV9SQURFT05fQ01EQlVGICAgICAweDEwCisjZGVmaW5lIERSTV9SQURFT05fR0VUUEFSQU0gICAweDExCisjZGVmaW5lIERSTV9SQURFT05fRkxJUCAgICAgICAweDEyCisjZGVmaW5lIERSTV9SQURFT05fQUxMT0MgICAgICAweDEzCisjZGVmaW5lIERSTV9SQURFT05fRlJFRSAgICAgICAweDE0CisjZGVmaW5lIERSTV9SQURFT05fSU5JVF9IRUFQICAweDE1CisjZGVmaW5lIERSTV9SQURFT05fSVJRX0VNSVQgICAweDE2CisjZGVmaW5lIERSTV9SQURFT05fSVJRX1dBSVQgICAweDE3CisjZGVmaW5lIERSTV9SQURFT05fQ1BfUkVTVU1FICAweDE4CisjZGVmaW5lIERSTV9SQURFT05fU0VUUEFSQU0gICAweDE5CisjZGVmaW5lIERSTV9SQURFT05fU1VSRl9BTExPQyAweDFhCisjZGVmaW5lIERSTV9SQURFT05fU1VSRl9GUkVFICAweDFiCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DUF9JTklUICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NQX0lOSVQsIGRybV9yYWRlb25faW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NQX1NUQVJUICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ1BfU1RBUlQpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ1BfU1RPUCAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUF9TVE9QLCBkcm1fcmFkZW9uX2NwX3N0b3BfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DUF9SRVNFVCAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NQX1JFU0VUKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NQX0lETEUgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ1BfSURMRSkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9SRVNFVCAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1JFU0VUKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0ZVTExTQ1JFRU4gRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fRlVMTFNDUkVFTiwgZHJtX3JhZGVvbl9mdWxsc2NyZWVuX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fU1dBUCAgICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9TV0FQKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NMRUFSICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ0xFQVIsIGRybV9yYWRlb25fY2xlYXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9WRVJURVggICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1ZFUlRFWCwgZHJtX3JhZGVvbl92ZXJ0ZXhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9JTkRJQ0VTICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0lORElDRVMsIGRybV9yYWRlb25faW5kaWNlc190KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1NUSVBQTEUgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fU1RJUFBMRSwgZHJtX3JhZGVvbl9zdGlwcGxlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fSU5ESVJFQ1QgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9JTkRJUkVDVCwgZHJtX3JhZGVvbl9pbmRpcmVjdF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1RFWFRVUkUgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fVEVYVFVSRSwgZHJtX3JhZGVvbl90ZXh0dXJlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fVkVSVEVYMiAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9WRVJURVgyLCBkcm1fcmFkZW9uX3ZlcnRleDJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DTURCVUYgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NNREJVRiwgZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fR0VUUEFSQU0gICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9HRVRQQVJBTSwgZHJtX3JhZGVvbl9nZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0ZMSVAgICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fRkxJUCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9BTExPQyAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0FMTE9DLCBkcm1fcmFkZW9uX21lbV9hbGxvY190KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0ZSRUUgICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fRlJFRSwgZHJtX3JhZGVvbl9tZW1fZnJlZV90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0lOSVRfSEVBUCAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fSU5JVF9IRUFQLCBkcm1fcmFkZW9uX21lbV9pbml0X2hlYXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9JUlFfRU1JVCAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0lSUV9FTUlULCBkcm1fcmFkZW9uX2lycV9lbWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fSVJRX1dBSVQgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9JUlFfV0FJVCwgZHJtX3JhZGVvbl9pcnFfd2FpdF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NQX1JFU1VNRSAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ1BfUkVTVU1FKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1NFVFBBUkFNICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fU0VUUEFSQU0sIGRybV9yYWRlb25fc2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9TVVJGX0FMTE9DIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1NVUkZfQUxMT0MsIGRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1NVUkZfRlJFRSAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fU1VSRl9GUkVFLCBkcm1fcmFkZW9uX3N1cmZhY2VfZnJlZV90KQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2luaXQgeworCWVudW0geworCQlSQURFT05fSU5JVF9DUCAgICA9IDB4MDEsCisJCVJBREVPTl9DTEVBTlVQX0NQID0gMHgwMiwKKwkJUkFERU9OX0lOSVRfUjIwMF9DUCA9IDB4MDMsCisJCVJBREVPTl9JTklUX1IzMDBfQ1AgPSAweDA0CisJfSBmdW5jOworCXVuc2lnbmVkIGxvbmcgc2FyZWFfcHJpdl9vZmZzZXQ7CisJaW50IGlzX3BjaTsKKwlpbnQgY3BfbW9kZTsKKwlpbnQgZ2FydF9zaXplOworCWludCByaW5nX3NpemU7CisJaW50IHVzZWNfdGltZW91dDsKKworCXVuc2lnbmVkIGludCBmYl9icHA7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldCwgZnJvbnRfcGl0Y2g7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0LCBiYWNrX3BpdGNoOworCXVuc2lnbmVkIGludCBkZXB0aF9icHA7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldCwgZGVwdGhfcGl0Y2g7CisKKwl1bnNpZ25lZCBsb25nIGZiX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgcmluZ19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyByaW5nX3JwdHJfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYnVmZmVyc19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBnYXJ0X3RleHR1cmVzX29mZnNldDsKK30gZHJtX3JhZGVvbl9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fY3Bfc3RvcCB7CisJaW50IGZsdXNoOworCWludCBpZGxlOworfSBkcm1fcmFkZW9uX2NwX3N0b3BfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9mdWxsc2NyZWVuIHsKKwllbnVtIHsKKwkJUkFERU9OX0lOSVRfRlVMTFNDUkVFTiAgICA9IDB4MDEsCisJCVJBREVPTl9DTEVBTlVQX0ZVTExTQ1JFRU4gPSAweDAyCisJfSBmdW5jOworfSBkcm1fcmFkZW9uX2Z1bGxzY3JlZW5fdDsKKworI2RlZmluZSBDTEVBUl9YMQkwCisjZGVmaW5lIENMRUFSX1kxCTEKKyNkZWZpbmUgQ0xFQVJfWDIJMgorI2RlZmluZSBDTEVBUl9ZMgkzCisjZGVmaW5lIENMRUFSX0RFUFRICTQKKwordHlwZWRlZiB1bmlvbiBkcm1fcmFkZW9uX2NsZWFyX3JlY3QgeworCWZsb2F0IGZbNV07CisJdW5zaWduZWQgaW50IHVpWzVdOworfSBkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9jbGVhciB7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBjbGVhcl9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfZGVwdGg7CisJdW5zaWduZWQgaW50IGNvbG9yX21hc2s7CisJdW5zaWduZWQgaW50IGRlcHRoX21hc2s7ICAgLyogbWlzbmFtZWQgZmllbGQ6ICBzaG91bGQgYmUgc3RlbmNpbCAqLworCWRybV9yYWRlb25fY2xlYXJfcmVjdF90IF9fdXNlciAqZGVwdGhfYm94ZXM7Cit9IGRybV9yYWRlb25fY2xlYXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl92ZXJ0ZXggeworCWludCBwcmltOworCWludCBpZHg7CQkJLyogSW5kZXggb2YgdmVydGV4IGJ1ZmZlciAqLworCWludCBjb3VudDsJCQkvKiBOdW1iZXIgb2YgdmVydGljZXMgaW4gYnVmZmVyICovCisJaW50IGRpc2NhcmQ7CQkJLyogQ2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAqLworfSBkcm1fcmFkZW9uX3ZlcnRleF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2luZGljZXMgeworCWludCBwcmltOworCWludCBpZHg7CisJaW50IHN0YXJ0OworCWludCBlbmQ7CisJaW50IGRpc2NhcmQ7CQkJLyogQ2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAqLworfSBkcm1fcmFkZW9uX2luZGljZXNfdDsKKworLyogdjEuMiAtIG9ic29sZXRlcyBkcm1fcmFkZW9uX3ZlcnRleCBhbmQgZHJtX3JhZGVvbl9pbmRpY2VzCisgKiAgICAgIC0gYWxsb3dzIG11bHRpcGxlIHByaW1pdGl2ZXMgYW5kIHN0YXRlIGNoYW5nZXMgaW4gYSBzaW5nbGUgaW9jdGwKKyAqICAgICAgLSBzdXBwb3J0cyBkcml2ZXIgY2hhbmdlIHRvIGVtaXQgbmF0aXZlIHByaW1pdGl2ZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl92ZXJ0ZXgyIHsKKwlpbnQgaWR4OwkJCS8qIEluZGV4IG9mIHZlcnRleCBidWZmZXIgKi8KKwlpbnQgZGlzY2FyZDsJCQkvKiBDbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICovCisJaW50IG5yX3N0YXRlczsKKwlkcm1fcmFkZW9uX3N0YXRlX3QgX191c2VyICpzdGF0ZTsKKwlpbnQgbnJfcHJpbXM7CisJZHJtX3JhZGVvbl9wcmltX3QgX191c2VyICpwcmltOworfSBkcm1fcmFkZW9uX3ZlcnRleDJfdDsKKworLyogdjEuMyAtIG9ic29sZXRlcyBkcm1fcmFkZW9uX3ZlcnRleDIKKyAqICAgICAgLSBhbGxvd3MgYXJiaXRhcmlseSBsYXJnZSBjbGlwcmVjdCBsaXN0IAorICogICAgICAtIGFsbG93cyB1cGRhdGluZyBvZiB0Y2wgcGFja2V0LCB2ZWN0b3IgYW5kIHNjYWxhciBzdGF0ZQorICogICAgICAtIGFsbG93cyBtZW1vcnktZWZmaWNpZW50IGRlc2NyaXB0aW9uIG9mIHN0YXRlIHVwZGF0ZXMKKyAqICAgICAgLSBhbGxvd3Mgc3RhdGUgdG8gYmUgZW1pdHRlZCB3aXRob3V0IGEgcHJpbWl0aXZlIAorICogICAgICAgICAgIChmb3IgY2xlYXJzLCBjdHggc3dpdGNoZXMpCisgKiAgICAgIC0gYWxsb3dzIG1vcmUgdGhhbiBvbmUgZG1hIGJ1ZmZlciB0byBiZSByZWZlcmVuY2VkIHBlciBpb2N0bAorICogICAgICAtIHN1cHBvcnRzIHRjbCBkcml2ZXIKKyAqICAgICAgLSBtYXkgYmUgZXh0ZW5kZWQgaW4gZnV0dXJlIHZlcnNpb25zIHdpdGggbmV3IGNtZCB0eXBlcywgcGFja2V0cworICovCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2NtZF9idWZmZXIgeworCWludCBidWZzejsKKwljaGFyIF9fdXNlciAqYnVmOworCWludCBuYm94OworCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmJveGVzOworfSBkcm1fcmFkZW9uX2NtZF9idWZmZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl90ZXhfaW1hZ2UgeworCXVuc2lnbmVkIGludCB4LCB5OwkJLyogQmxpdCBjb29yZGluYXRlcyAqLworCXVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OworCWNvbnN0IHZvaWQgX191c2VyICpkYXRhOworfSBkcm1fcmFkZW9uX3RleF9pbWFnZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3RleHR1cmUgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJaW50IHBpdGNoOworCWludCBmb3JtYXQ7CisJaW50IHdpZHRoOwkJCS8qIFRleHR1cmUgaW1hZ2UgY29vcmRpbmF0ZXMgKi8KKwlpbnQgaGVpZ2h0OworCWRybV9yYWRlb25fdGV4X2ltYWdlX3QgX191c2VyICppbWFnZTsKK30gZHJtX3JhZGVvbl90ZXh0dXJlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fc3RpcHBsZSB7CisJdW5zaWduZWQgaW50IF9fdXNlciAqbWFzazsKK30gZHJtX3JhZGVvbl9zdGlwcGxlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25faW5kaXJlY3QgeworCWludCBpZHg7CisJaW50IHN0YXJ0OworCWludCBlbmQ7CisJaW50IGRpc2NhcmQ7Cit9IGRybV9yYWRlb25faW5kaXJlY3RfdDsKKworCisvKiAxLjM6IEFuIGlvY3RsIHRvIGdldCBwYXJhbWV0ZXJzIHRoYXQgYXJlbid0IGF2YWlsYWJsZSB0byB0aGUgM2QKKyAqIGNsaWVudCBhbnkgb3RoZXIgd2F5LiAgCisgKi8KKyNkZWZpbmUgUkFERU9OX1BBUkFNX0dBUlRfQlVGRkVSX09GRlNFVCAgICAxIC8qIGNhcmQgb2Zmc2V0IG9mIDFzdCBHQVJUIGJ1ZmZlciAqLworI2RlZmluZSBSQURFT05fUEFSQU1fTEFTVF9GUkFNRSAgICAgICAgICAgIDIKKyNkZWZpbmUgUkFERU9OX1BBUkFNX0xBU1RfRElTUEFUQ0ggICAgICAgICAzCisjZGVmaW5lIFJBREVPTl9QQVJBTV9MQVNUX0NMRUFSICAgICAgICAgICAgNAorLyogQWRkZWQgd2l0aCBEUk0gdmVyc2lvbiAxLjYuICovCisjZGVmaW5lIFJBREVPTl9QQVJBTV9JUlFfTlIgICAgICAgICAgICAgICAgNQorI2RlZmluZSBSQURFT05fUEFSQU1fR0FSVF9CQVNFICAgICAgICAgICAgIDYgLyogY2FyZCBvZmZzZXQgb2YgR0FSVCBiYXNlICovCisvKiBBZGRlZCB3aXRoIERSTSB2ZXJzaW9uIDEuOC4gKi8KKyNkZWZpbmUgUkFERU9OX1BBUkFNX1JFR0lTVEVSX0hBTkRMRSAgICAgICA3IC8qIGZvciBkcm1NYXAoKSAqLworI2RlZmluZSBSQURFT05fUEFSQU1fU1RBVFVTX0hBTkRMRSAgICAgICAgIDgKKyNkZWZpbmUgUkFERU9OX1BBUkFNX1NBUkVBX0hBTkRMRSAgICAgICAgICA5CisjZGVmaW5lIFJBREVPTl9QQVJBTV9HQVJUX1RFWF9IQU5ETEUgICAgICAgMTAKKyNkZWZpbmUgUkFERU9OX1BBUkFNX1NDUkFUQ0hfT0ZGU0VUICAgICAgICAxMQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2dldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJdm9pZCBfX3VzZXIgKnZhbHVlOworfSBkcm1fcmFkZW9uX2dldHBhcmFtX3Q7CisKKy8qIDEuNjogU2V0IHVwIGEgbWVtb3J5IG1hbmFnZXIgZm9yIHJlZ2lvbnMgb2Ygc2hhcmVkIG1lbW9yeToKKyAqLworI2RlZmluZSBSQURFT05fTUVNX1JFR0lPTl9HQVJUIDEKKyNkZWZpbmUgUkFERU9OX01FTV9SRUdJT05fRkIgICAyCisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fbWVtX2FsbG9jIHsKKwlpbnQgcmVnaW9uOworCWludCBhbGlnbm1lbnQ7CisJaW50IHNpemU7CisJaW50IF9fdXNlciAqcmVnaW9uX29mZnNldDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZmIgb3IgR0FSVCAqLworfSBkcm1fcmFkZW9uX21lbV9hbGxvY190OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX21lbV9mcmVlIHsKKwlpbnQgcmVnaW9uOworCWludCByZWdpb25fb2Zmc2V0OworfSBkcm1fcmFkZW9uX21lbV9mcmVlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fbWVtX2luaXRfaGVhcCB7CisJaW50IHJlZ2lvbjsKKwlpbnQgc2l6ZTsKKwlpbnQgc3RhcnQ7CQorfSBkcm1fcmFkZW9uX21lbV9pbml0X2hlYXBfdDsKKworCisvKiAxLjY6IFVzZXJzcGFjZSBjYW4gcmVxdWVzdCAmIHdhaXQgb24gaXJxJ3M6CisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25faXJxX2VtaXQgeworCWludCBfX3VzZXIgKmlycV9zZXE7Cit9IGRybV9yYWRlb25faXJxX2VtaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9pcnFfd2FpdCB7CisJaW50IGlycV9zZXE7Cit9IGRybV9yYWRlb25faXJxX3dhaXRfdDsKKworCisvKiAxLjEwOiBDbGllbnRzIHRlbGwgdGhlIERSTSB3aGVyZSB0aGV5IHRoaW5rIHRoZSBmcmFtZWJ1ZmZlciBpcyBsb2NhdGVkIGluCisgKiB0aGUgY2FyZCdzIGFkZHJlc3Mgc3BhY2UsIHZpYSBhIG5ldyBnZW5lcmljIGlvY3RsIHRvIHNldCBwYXJhbWV0ZXJzCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9zZXRwYXJhbSB7CisJdW5zaWduZWQgaW50IHBhcmFtOworCWludDY0X3QgICAgICB2YWx1ZTsKK30gZHJtX3JhZGVvbl9zZXRwYXJhbV90OworCisjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9GQl9MT0NBVElPTiAgICAxCS8qIGRldGVybWluZWQgZnJhbWVidWZmZXIgbG9jYXRpb24gKi8KKyNkZWZpbmUgUkFERU9OX1NFVFBBUkFNX1NXSVRDSF9USUxJTkcgIDIJLyogZW5hYmxlL2Rpc2FibGUgY29sb3IgdGlsaW5nICovCisKKy8qIDEuMTQ6IENsaWVudHMgY2FuIGFsbG9jYXRlL2ZyZWUgYSBzdXJmYWNlCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fc3VyZmFjZV9hbGxvYyB7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IGZsYWdzOworfSBkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9zdXJmYWNlX2ZyZWUgeworCXVuc2lnbmVkIGludCBhZGRyZXNzOworfSBkcm1fcmFkZW9uX3N1cmZhY2VfZnJlZV90OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5ODNkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jCkBAIC0wLDAgKzEsMTI3IEBACisvKioKKyAqIFxmaWxlIHJhZGVvbl9kcnYuYworICogQVRJIFJhZGVvbiBkcml2ZXIKKyAqCisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKKworI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKKworc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCit7CisJRFJNX0lORk8oICJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCisJCURSSVZFUl9OQU1FLAorCQlEUklWRVJfTUFKT1IsCisJCURSSVZFUl9NSU5PUiwKKwkJRFJJVkVSX1BBVENITEVWRUwsCisJCURSSVZFUl9EQVRFLAorCQlkZXYtPnByaW1hcnkubWlub3IsCisJCXBjaV9wcmV0dHlfbmFtZShkZXYtPnBkZXYpCisJCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyc2lvbiggZHJtX3ZlcnNpb25fdCAqdmVyc2lvbiApCit7CisJaW50IGxlbjsKKworCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKKwlEUk1fQ09QWSggdmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0geworCXJhZGVvbl9QQ0lfSURTCit9OworCitleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCByYWRlb25faW9jdGxzW107CitleHRlcm4gaW50IHJhZGVvbl9tYXhfaW9jdGw7CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwgRFJJVkVSX1BDSV9ETUEgfCBEUklWRVJfU0cgfCBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfSEFWRV9ETUEgfCBEUklWRVJfSVJRX1NIQVJFRCB8IERSSVZFUl9JUlFfVkJMLAorCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9yYWRlb25fYnVmX3ByaXZfdCksCisJLnByZWluaXQgPSByYWRlb25fZHJpdmVyX3ByZWluaXQsCisJLnBvc3RjbGVhbnVwID0gcmFkZW9uX2RyaXZlcl9wb3N0Y2xlYW51cCwKKwkucHJlcmVsZWFzZSA9IHJhZGVvbl9kcml2ZXJfcHJlcmVsZWFzZSwKKwkucHJldGFrZWRvd24gPSByYWRlb25fZHJpdmVyX3ByZXRha2Vkb3duLAorCS5vcGVuX2hlbHBlciA9IHJhZGVvbl9kcml2ZXJfb3Blbl9oZWxwZXIsCisJLnZibGFua193YWl0ID0gcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdCwKKwkuaXJxX3ByZWluc3RhbGwgPSByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsLAorCS5pcnFfcG9zdGluc3RhbGwgPSByYWRlb25fZHJpdmVyX2lycV9wb3N0aW5zdGFsbCwKKwkuaXJxX3VuaW5zdGFsbCA9IHJhZGVvbl9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKKwkuaXJxX2hhbmRsZXIgPSByYWRlb25fZHJpdmVyX2lycV9oYW5kbGVyLAorCS5mcmVlX2ZpbHBfcHJpdiA9IHJhZGVvbl9kcml2ZXJfZnJlZV9maWxwX3ByaXYsCisJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKKwkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKKwkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKKwkucG9zdGluaXQgPSBwb3N0aW5pdCwKKwkudmVyc2lvbiA9IHZlcnNpb24sCisJLmlvY3RscyA9IHJhZGVvbl9pb2N0bHMsCisJLmRtYV9pb2N0bCA9IHJhZGVvbl9jcF9idWZmZXJzLAorCS5mb3BzID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9wZW4gPSBkcm1fb3BlbiwKKwkJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkJLmlvY3RsID0gZHJtX2lvY3RsLAorCQkubW1hcCA9IGRybV9tbWFwLAorCQkucG9sbCA9IGRybV9wb2xsLAorCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKwl9LAorCS5wY2lfZHJpdmVyID0geworCQkubmFtZSAgICAgICAgICA9IERSSVZFUl9OQU1FLAorCQkuaWRfdGFibGUgICAgICA9IHBjaWlkbGlzdCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCByYWRlb25faW5pdCh2b2lkKQoreworCWRyaXZlci5udW1faW9jdGxzID0gcmFkZW9uX21heF9pb2N0bDsKKwlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCByYWRlb25fZXhpdCh2b2lkKQoreworCWRybV9leGl0KCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChyYWRlb25faW5pdCk7Cittb2R1bGVfZXhpdChyYWRlb25fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MzcwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaApAQCAtMCwwICsxLDEwNDQgQEAKKy8qIHJhZGVvbl9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgcmFkZW9uIGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBGcmVtb250LCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpZm5kZWYgX19SQURFT05fRFJWX0hfXworI2RlZmluZSBfX1JBREVPTl9EUlZfSF9fCisKKy8qIEdlbmVyYWwgY3VzdG9taXphdGlvbjoKKyAqLworCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJHYXJldGggSHVnaGVzLCBLZWl0aCBXaGl0d2VsbCwgb3RoZXJzLiIKKworI2RlZmluZSBEUklWRVJfTkFNRQkJInJhZGVvbiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJCSJBVEkgUmFkZW9uIgorI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDUwMzExIgorCisvKiBJbnRlcmZhY2UgaGlzdG9yeToKKyAqCisgKiAxLjEgLSA/PworICogMS4yIC0gQWRkIHZlcnRleDIgaW9jdGwgKGtlaXRoKQorICogICAgIC0gQWRkIHN0ZW5jaWwgY2FwYWJpbGl0eSB0byBjbGVhciBpb2N0bCAoZ2FyZXRoLCBrZWl0aCkKKyAqICAgICAtIEluY3JlYXNlIE1BWF9URVhUVVJFX0xFVkVMUyAoYnJpYW4pCisgKiAxLjMgLSBBZGQgY21kYnVmIGlvY3RsIChrZWl0aCkKKyAqICAgICAtIEFkZCBzdXBwb3J0IGZvciBuZXcgcmFkZW9uIHBhY2tldHMgKGtlaXRoKQorICogICAgIC0gQWRkIGdldHBhcmFtIGlvY3RsIChrZWl0aCkKKyAqICAgICAtIEFkZCBmbGlwLWJ1ZmZlcnMgaW9jdGwsIGRlcHJlY2F0ZSBmdWxsc2NyZWVuIGZvbyAoa2VpdGgpLgorICogMS40IC0gQWRkIHNjcmF0Y2ggcmVnaXN0ZXJzIHRvIGdldF9wYXJhbSBpb2N0bC4KKyAqIDEuNSAtIEFkZCByMjAwIHBhY2tldHMgdG8gY21kYnVmIGlvY3RsCisgKiAgICAgLSBBZGQgcjIwMCBmdW5jdGlvbiB0byBpbml0IGlvY3RsCisgKiAgICAgLSBBZGQgJ3NjYWxhcjInIGluc3RydWN0aW9uIHRvIGNtZGJ1ZgorICogMS42IC0gQWRkIHN0YXRpYyBHQVJUIG1lbW9yeSBtYW5hZ2VyCisgKiAgICAgICBBZGQgaXJxIGhhbmRsZXIgKHdvbid0IGJlIHR1cm5lZCBvbiB1bmxlc3MgWCBzZXJ2ZXIga25vd3MgdG8pCisgKiAgICAgICBBZGQgaXJxIGlvY3RscyBhbmQgaXJxX2FjdGl2ZSBnZXRwYXJhbS4KKyAqICAgICAgIEFkZCB3YWl0IGNvbW1hbmQgZm9yIGNtZGJ1ZiBpb2N0bAorICogICAgICAgQWRkIEdBUlQgb2Zmc2V0IHF1ZXJ5IGZvciBnZXRwYXJhbQorICogMS43IC0gQWRkIHN1cHBvcnQgZm9yIGN1YmUgbWFwIHJlZ2lzdGVyczogUjIwMF9QUF9DVUJJQ19GQUNFU19bMC4uNV0KKyAqICAgICAgIGFuZCBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV9bMC4uNV0uCisgKiAgICAgICBBZGRlZCBwYWNrZXRzIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU19bMC4uNV0gYW5kCisgKiAgICAgICBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU19bMC4uNV0uICAoYnJpYW4pCisgKiAxLjggLSBSZW1vdmUgbmVlZCB0byBjYWxsIGNsZWFudXAgaW9jdGxzIG9uIGxhc3QgY2xpZW50IGV4aXQgKGtlaXRoKQorICogICAgICAgQWRkICdHRVQnIHF1ZXJpZXMgZm9yIHN0YXJ0aW5nIGFkZGl0aW9uYWwgY2xpZW50cyBvbiBkaWZmZXJlbnQgVlQncy4KKyAqIDEuOSAtIEFkZCBEUk1fSU9DVExfUkFERU9OX0NQX1JFU1VNRSBpb2N0bC4KKyAqICAgICAgIEFkZCB0ZXh0dXJlIHJlY3RhbmdsZSBzdXBwb3J0IGZvciByMTAwLgorICogMS4xMC0gQWRkIFNFVFBBUkFNIGlvY3RsOyBmaXJzdCBwYXJhbWV0ZXIgdG8gc2V0IGlzIEZCX0xPQ0FUSU9OLCB3aGljaAorICogICAgICAgY2xpZW50cyB1c2UgdG8gdGVsbCB0aGUgRFJNIHdoZXJlIHRoZXkgdGhpbmsgdGhlIGZyYW1lYnVmZmVyIGlzIAorICogICAgICAgbG9jYXRlZCBpbiB0aGUgY2FyZCdzIGFkZHJlc3Mgc3BhY2UKKyAqIDEuMTEtIEFkZCBwYWNrZXQgUjIwMF9FTUlUX1JCM0RfQkxFTkRDT0xPUiB0byBzdXBwb3J0IEdMX0VYVF9ibGVuZF9jb2xvcgorICogICAgICAgYW5kIEdMX0VYVF9ibGVuZF9bZnVuY3xlcXVhdGlvbl1fc2VwYXJhdGUgb24gcjIwMAorICogMS4xMi0gQWRkIFIzMDAgQ1AgbWljcm9jb2RlIHN1cHBvcnQgLSB0aGlzIGp1c3QgbG9hZHMgdGhlIENQIG9uIHIzMDAKKyAqICAgICAgIChObyAzRCBzdXBwb3J0IHlldCAtIGp1c3QgbWljcm9jb2RlIGxvYWRpbmcpCisgKiAxLjEzLSBBZGQgcGFja2V0IFIyMDBfRU1JVF9UQ0xfUE9JTlRfU1BSSVRFX0NOVEwgZm9yIEFSQl9wb2ludF9wYXJhbWV0ZXJzCisgKiAgICAgLSBBZGQgaHlwZXJ6IHN1cHBvcnQsIGFkZCBoeXBlcnogZmxhZ3MgdG8gY2xlYXIgaW9jdGwuCisgKiAxLjE0LSBBZGQgc3VwcG9ydCBmb3IgY29sb3IgdGlsaW5nCisgKiAgICAgLSBBZGQgUjEwMC9SMjAwIHN1cmZhY2UgYWxsb2NhdGlvbi9mcmVlIHN1cHBvcnQKKyAqIDEuMTUtIEFkZCBzdXBwb3J0IGZvciB0ZXh0dXJlIG1pY3JvIHRpbGluZworICogICAgIC0gQWRkIHN1cHBvcnQgZm9yIHIxMDAgY3ViZSBtYXBzCisgKiAxLjE2LSBBZGQgUjIwMF9FTUlUX1BQX1RSSV9QRVJGX0NOVEwgcGFja2V0IHRvIHN1cHBvcnQgYnJpbGluZWFyCisgKiAgICAgICB0ZXh0dXJlIGZpbHRlcmluZyBvbiByMjAwCisgKi8KKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkxCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMTYKKyNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMAorCisjZGVmaW5lIEdFVF9SSU5HX0hFQUQoZGV2X3ByaXYpCQlEUk1fUkVBRDMyKCAgKGRldl9wcml2KS0+cmluZ19ycHRyLCAwICkKKyNkZWZpbmUgU0VUX1JJTkdfSEVBRChkZXZfcHJpdix2YWwpCURSTV9XUklURTMyKCAoZGV2X3ByaXYpLT5yaW5nX3JwdHIsIDAsICh2YWwpICkKKworLyoKKyAqIFJhZGVvbiBjaGlwIGZhbWlsaWVzCisgKi8KK2VudW0gcmFkZW9uX2ZhbWlseSB7CisJQ0hJUF9SMTAwLAorCUNISVBfUlMxMDAsCisJQ0hJUF9SVjEwMCwKKwlDSElQX1IyMDAsCisJQ0hJUF9SVjIwMCwKKwlDSElQX1JTMjAwLAorCUNISVBfUjI1MCwKKwlDSElQX1JTMjUwLAorCUNISVBfUlYyNTAsCisJQ0hJUF9SVjI4MCwKKwlDSElQX1IzMDAsCisJQ0hJUF9SUzMwMCwKKwlDSElQX1JWMzUwLAorCUNISVBfTEFTVCwKK307CisKK2VudW0gcmFkZW9uX2NwX21pY3JvY29kZV92ZXJzaW9uIHsKKwlVQ09ERV9SMTAwLAorCVVDT0RFX1IyMDAsCisJVUNPREVfUjMwMCwKK307CisKKy8qCisgKiBDaGlwIGZsYWdzCisgKi8KK2VudW0gcmFkZW9uX2NoaXBfZmxhZ3MgeworCUNISVBfRkFNSUxZX01BU0sgPSAweDAwMDBmZmZmVUwsCisJQ0hJUF9GTEFHU19NQVNLID0gMHhmZmZmMDAwMFVMLAorCUNISVBfSVNfTU9CSUxJVFkgPSAweDAwMDEwMDAwVUwsCisJQ0hJUF9JU19JR1AgPSAweDAwMDIwMDAwVUwsCisJQ0hJUF9TSU5HTEVfQ1JUQyA9IDB4MDAwNDAwMDBVTCwKKwlDSElQX0lTX0FHUCA9IDB4MDAwODAwMDBVTCwKKwlDSElQX0hBU19ISUVSWiA9IDB4MDAxMDAwMDBVTCwgCit9OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2ZyZWVsaXN0IHsKKyAgIAl1bnNpZ25lZCBpbnQgYWdlOworICAgCWRybV9idWZfdCAqYnVmOworICAgCXN0cnVjdCBkcm1fcmFkZW9uX2ZyZWVsaXN0ICpuZXh0OworICAgCXN0cnVjdCBkcm1fcmFkZW9uX2ZyZWVsaXN0ICpwcmV2OworfSBkcm1fcmFkZW9uX2ZyZWVsaXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fcmluZ19idWZmZXIgeworCXUzMiAqc3RhcnQ7CisJdTMyICplbmQ7CisJaW50IHNpemU7CisJaW50IHNpemVfbDJxdzsKKworCXUzMiB0YWlsOworCXUzMiB0YWlsX21hc2s7CisJaW50IHNwYWNlOworCisJaW50IGhpZ2hfbWFyazsKK30gZHJtX3JhZGVvbl9yaW5nX2J1ZmZlcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2RlcHRoX2NsZWFyX3QgeworCXUzMiByYjNkX2NudGw7CisJdTMyIHJiM2RfenN0ZW5jaWxjbnRsOworCXUzMiBzZV9jbnRsOworfSBkcm1fcmFkZW9uX2RlcHRoX2NsZWFyX3Q7CisKK3N0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyB7CisJaW50NjRfdCByYWRlb25fZmJfZGVsdGE7Cit9OworCitzdHJ1Y3QgbWVtX2Jsb2NrIHsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXh0OworCXN0cnVjdCBtZW1fYmxvY2sgKnByZXY7CisJaW50IHN0YXJ0OworCWludCBzaXplOworCURSTUZJTEUgZmlscDsJCS8qIDA6IGZyZWUsIC0xOiBoZWFwLCBvdGhlcjogcmVhbCBmaWxlcyAqLworfTsKKworc3RydWN0IHJhZGVvbl9zdXJmYWNlIHsKKwlpbnQgcmVmY291bnQ7CisJdTMyIGxvd2VyOworCXUzMiB1cHBlcjsKKwl1MzIgZmxhZ3M7Cit9OworCitzdHJ1Y3QgcmFkZW9uX3ZpcnRfc3VyZmFjZSB7CisJaW50IHN1cmZhY2VfaW5kZXg7CisJdTMyIGxvd2VyOworCXUzMiB1cHBlcjsKKwl1MzIgZmxhZ3M7CisJRFJNRklMRSBmaWxwOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9wcml2YXRlIHsKKwlkcm1fcmFkZW9uX3JpbmdfYnVmZmVyX3QgcmluZzsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXY7CisKKwl1MzIgZmJfbG9jYXRpb247CisKKwlpbnQgZ2FydF9zaXplOworCXUzMiBnYXJ0X3ZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgZ2FydF9idWZmZXJzX29mZnNldDsKKworCWludCBjcF9tb2RlOworCWludCBjcF9ydW5uaW5nOworCisgICAJZHJtX3JhZGVvbl9mcmVlbGlzdF90ICpoZWFkOworICAgCWRybV9yYWRlb25fZnJlZWxpc3RfdCAqdGFpbDsKKwlpbnQgbGFzdF9idWY7CisJdm9sYXRpbGUgdTMyICpzY3JhdGNoOworCWludCB3cml0ZWJhY2tfd29ya3M7CisKKwlpbnQgdXNlY190aW1lb3V0OworCisJaW50IG1pY3JvY29kZV92ZXJzaW9uOworCisJaW50IGlzX3BjaTsKKwl1bnNpZ25lZCBsb25nIHBoeXNfcGNpX2dhcnQ7CisJZG1hX2FkZHJfdCBidXNfcGNpX2dhcnQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgYm94ZXM7CisJCWludCBmcmVlbGlzdF90aW1lb3V0czsKKwkJaW50IGZyZWVsaXN0X2xvb3BzOworCQlpbnQgcmVxdWVzdGVkX2J1ZnM7CisJCWludCBsYXN0X2ZyYW1lX3JlYWRzOworCQlpbnQgbGFzdF9jbGVhcl9yZWFkczsKKwkJaW50IGNsZWFyczsKKwkJaW50IHRleHR1cmVfdXBsb2FkczsKKwl9IHN0YXRzOworCisJaW50IGRvX2JveGVzOworCWludCBwYWdlX2ZsaXBwaW5nOworCWludCBjdXJyZW50X3BhZ2U7CisKKwl1MzIgY29sb3JfZm10OworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19waXRjaDsKKworCXUzMiBkZXB0aF9mbXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfcGl0Y2g7CisKKwl1MzIgZnJvbnRfcGl0Y2hfb2Zmc2V0OworCXUzMiBiYWNrX3BpdGNoX29mZnNldDsKKwl1MzIgZGVwdGhfcGl0Y2hfb2Zmc2V0OworCisJZHJtX3JhZGVvbl9kZXB0aF9jbGVhcl90IGRlcHRoX2NsZWFyOworCQorCXVuc2lnbmVkIGxvbmcgZmJfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyByaW5nX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJpbmdfcnB0cl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGdhcnRfdGV4dHVyZXNfb2Zmc2V0OworCisJZHJtX2xvY2FsX21hcF90ICpzYXJlYTsKKwlkcm1fbG9jYWxfbWFwX3QgKm1taW87CisJZHJtX2xvY2FsX21hcF90ICpjcF9yaW5nOworCWRybV9sb2NhbF9tYXBfdCAqcmluZ19ycHRyOworCWRybV9sb2NhbF9tYXBfdCAqZ2FydF90ZXh0dXJlczsKKworCXN0cnVjdCBtZW1fYmxvY2sgKmdhcnRfaGVhcDsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpmYl9oZWFwOworCisJLyogU1cgaW50ZXJydXB0ICovCisgICAJd2FpdF9xdWV1ZV9oZWFkX3Qgc3dpX3F1ZXVlOworICAgCWF0b21pY190IHN3aV9lbWl0dGVkOworCisJc3RydWN0IHJhZGVvbl9zdXJmYWNlIHN1cmZhY2VzW1JBREVPTl9NQVhfU1VSRkFDRVNdOworCXN0cnVjdCByYWRlb25fdmlydF9zdXJmYWNlIHZpcnRfc3VyZmFjZXNbMipSQURFT05fTUFYX1NVUkZBQ0VTXTsKKworCS8qIHN0YXJ0aW5nIGZyb20gaGVyZSBvbiwgZGF0YSBpcyBwcmVzZXJ2ZWQgYWNjcm9zcyBhbiBvcGVuICovCisJdWludDMyX3QgZmxhZ3M7CQkvKiBzZWUgcmFkZW9uX2NoaXBfZmxhZ3MgKi8KK30gZHJtX3JhZGVvbl9wcml2YXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fYnVmX3ByaXYgeworCXUzMiBhZ2U7Cit9IGRybV9yYWRlb25fYnVmX3ByaXZfdDsKKworCQkJCS8qIHJhZGVvbl9jcC5jICovCitleHRlcm4gaW50IHJhZGVvbl9jcF9pbml0KCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fY3Bfc3RhcnQoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHJhZGVvbl9jcF9zdG9wKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fY3BfcmVzZXQoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHJhZGVvbl9jcF9pZGxlKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fY3BfcmVzdW1lKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fZW5naW5lX3Jlc2V0KCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fZnVsbHNjcmVlbiggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcmFkZW9uX2NwX2J1ZmZlcnMoIERSTV9JT0NUTF9BUkdTICk7CisKK2V4dGVybiB2b2lkIHJhZGVvbl9mcmVlbGlzdF9yZXNldCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiBkcm1fYnVmX3QgKnJhZGVvbl9mcmVlbGlzdF9nZXQoIGRybV9kZXZpY2VfdCAqZGV2ICk7CisKK2V4dGVybiBpbnQgcmFkZW9uX3dhaXRfcmluZyggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgbiApOworCitleHRlcm4gaW50IHJhZGVvbl9kb19jcF9pZGxlKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgKTsKKworZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX3ByZWluaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfcG9zdGNsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKK2V4dGVybiBpbnQgcmFkZW9uX21lbV9hbGxvYyggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcmFkZW9uX21lbV9mcmVlKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fbWVtX2luaXRfaGVhcCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9tZW1fdGFrZWRvd24oIHN0cnVjdCBtZW1fYmxvY2sgKipoZWFwICk7CitleHRlcm4gdm9pZCByYWRlb25fbWVtX3JlbGVhc2UoIERSTUZJTEUgZmlscCwgc3RydWN0IG1lbV9ibG9jayAqaGVhcCApOworCisJCQkJLyogcmFkZW9uX2lycS5jICovCitleHRlcm4gaW50IHJhZGVvbl9pcnFfZW1pdCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcmFkZW9uX2lycV93YWl0KCBEUk1fSU9DVExfQVJHUyApOworCitleHRlcm4gdm9pZCByYWRlb25fZG9fcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworZXh0ZXJuIGlycXJldHVybl90IHJhZGVvbl9kcml2ZXJfaXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfb3Blbl9oZWxwZXIoZHJtX2RldmljZV90ICpkZXYsIGRybV9maWxlX3QgKmZpbHBfcHJpdik7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2ZyZWVfZmlscF9wcml2KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZmlsZV90ICpmaWxwX3ByaXYpOworCitleHRlcm4gaW50IHJhZGVvbl9wcmVpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICk7CitleHRlcm4gaW50IHJhZGVvbl9wb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApOworZXh0ZXJuIGludCByYWRlb25fcG9zdGNsZWFudXAoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYgKTsKKworLyogRmxhZ3MgZm9yIHN0YXRzLmJveGVzCisgKi8KKyNkZWZpbmUgUkFERU9OX0JPWF9ETUFfSURMRSAgICAgIDB4MQorI2RlZmluZSBSQURFT05fQk9YX1JJTkdfRlVMTCAgICAgMHgyCisjZGVmaW5lIFJBREVPTl9CT1hfRkxJUCAgICAgICAgICAweDQKKyNkZWZpbmUgUkFERU9OX0JPWF9XQUlUX0lETEUgICAgIDB4OAorI2RlZmluZSBSQURFT05fQk9YX1RFWFRVUkVfTE9BRCAgMHgxMAorCisKKworLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMsIHJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgYW5kIGRybUFkZE1hcCBjb25zdGFudHMKKyAqIGZvciBSYWRlb24ga2VybmVsIGRyaXZlci4KKyAqLworCisjZGVmaW5lIFJBREVPTl9BR1BfQ09NTUFORAkJMHgwZjYwCisjZGVmaW5lIFJBREVPTl9BVVhfU0NJU1NPUl9DTlRMCQkweDI2ZjAKKyMJZGVmaW5lIFJBREVPTl9FWENMVVNJVkVfU0NJU1NPUl8wCSgxIDw8IDI0KQorIwlkZWZpbmUgUkFERU9OX0VYQ0xVU0lWRV9TQ0lTU09SXzEJKDEgPDwgMjUpCisjCWRlZmluZSBSQURFT05fRVhDTFVTSVZFX1NDSVNTT1JfMgkoMSA8PCAyNikKKyMJZGVmaW5lIFJBREVPTl9TQ0lTU09SXzBfRU5BQkxFCQkoMSA8PCAyOCkKKyMJZGVmaW5lIFJBREVPTl9TQ0lTU09SXzFfRU5BQkxFCQkoMSA8PCAyOSkKKyMJZGVmaW5lIFJBREVPTl9TQ0lTU09SXzJfRU5BQkxFCQkoMSA8PCAzMCkKKworI2RlZmluZSBSQURFT05fQlVTX0NOVEwJCQkweDAwMzAKKyMJZGVmaW5lIFJBREVPTl9CVVNfTUFTVEVSX0RJUwkJKDEgPDwgNikKKworI2RlZmluZSBSQURFT05fQ0xPQ0tfQ05UTF9EQVRBCQkweDAwMGMKKyMJZGVmaW5lIFJBREVPTl9QTExfV1JfRU4JCQkoMSA8PCA3KQorI2RlZmluZSBSQURFT05fQ0xPQ0tfQ05UTF9JTkRFWAkJMHgwMDA4CisjZGVmaW5lIFJBREVPTl9DT05GSUdfQVBFUl9TSVpFCQkweDAxMDgKKyNkZWZpbmUgUkFERU9OX0NSVENfT0ZGU0VUCQkweDAyMjQKKyNkZWZpbmUgUkFERU9OX0NSVENfT0ZGU0VUX0NOVEwJCTB4MDIyOAorIwlkZWZpbmUgUkFERU9OX0NSVENfVElMRV9FTgkJKDEgPDwgMTUpCisjCWRlZmluZSBSQURFT05fQ1JUQ19PRkZTRVRfRkxJUF9DTlRMCSgxIDw8IDE2KQorI2RlZmluZSBSQURFT05fQ1JUQzJfT0ZGU0VUCQkweDAzMjQKKyNkZWZpbmUgUkFERU9OX0NSVEMyX09GRlNFVF9DTlRMCTB4MDMyOAorCisjZGVmaW5lIFJBREVPTl9SQjNEX0NPTE9ST0ZGU0VUCQkweDFjNDAKKyNkZWZpbmUgUkFERU9OX1JCM0RfQ09MT1JQSVRDSAkJMHgxYzQ4CisKKyNkZWZpbmUgUkFERU9OX0RQX0dVSV9NQVNURVJfQ05UTAkweDE0NmMKKyMJZGVmaW5lIFJBREVPTl9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTAkoMSA8PCAxKQorIwlkZWZpbmUgUkFERU9OX0dNQ19CUlVTSF9TT0xJRF9DT0xPUgkoMTMgPDwgNCkKKyMJZGVmaW5lIFJBREVPTl9HTUNfQlJVU0hfTk9ORQkJKDE1IDw8IDQpCisjCWRlZmluZSBSQURFT05fR01DX0RTVF8xNkJQUAkJKDQgPDwgOCkKKyMJZGVmaW5lIFJBREVPTl9HTUNfRFNUXzI0QlBQCQkoNSA8PCA4KQorIwlkZWZpbmUgUkFERU9OX0dNQ19EU1RfMzJCUFAJCSg2IDw8IDgpCisjCWRlZmluZSBSQURFT05fR01DX0RTVF9EQVRBVFlQRV9TSElGVAk4CisjCWRlZmluZSBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUgkoMyA8PCAxMikKKyMJZGVmaW5lIFJBREVPTl9EUF9TUkNfU09VUkNFX01FTU9SWQkoMiA8PCAyNCkKKyMJZGVmaW5lIFJBREVPTl9EUF9TUkNfU09VUkNFX0hPU1RfREFUQQkoMyA8PCAyNCkKKyMJZGVmaW5lIFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUwkoMSA8PCAyOCkKKyMJZGVmaW5lIFJBREVPTl9HTUNfV1JfTVNLX0RJUwkJKDEgPDwgMzApCisjCWRlZmluZSBSQURFT05fUk9QM19TCQkJMHgwMGNjMDAwMAorIwlkZWZpbmUgUkFERU9OX1JPUDNfUAkJCTB4MDBmMDAwMDAKKyNkZWZpbmUgUkFERU9OX0RQX1dSSVRFX01BU0sJCTB4MTZjYworI2RlZmluZSBSQURFT05fRFNUX1BJVENIX09GRlNFVAkJMHgxNDJjCisjZGVmaW5lIFJBREVPTl9EU1RfUElUQ0hfT0ZGU0VUX0MJMHgxYzgwCisjCWRlZmluZSBSQURFT05fRFNUX1RJTEVfTElORUFSCQkoMCA8PCAzMCkKKyMJZGVmaW5lIFJBREVPTl9EU1RfVElMRV9NQUNSTwkJKDEgPDwgMzApCisjCWRlZmluZSBSQURFT05fRFNUX1RJTEVfTUlDUk8JCSgyIDw8IDMwKQorIwlkZWZpbmUgUkFERU9OX0RTVF9USUxFX0JPVEgJCSgzIDw8IDMwKQorCisjZGVmaW5lIFJBREVPTl9TQ1JBVENIX1JFRzAJCTB4MTVlMAorI2RlZmluZSBSQURFT05fU0NSQVRDSF9SRUcxCQkweDE1ZTQKKyNkZWZpbmUgUkFERU9OX1NDUkFUQ0hfUkVHMgkJMHgxNWU4CisjZGVmaW5lIFJBREVPTl9TQ1JBVENIX1JFRzMJCTB4MTVlYworI2RlZmluZSBSQURFT05fU0NSQVRDSF9SRUc0CQkweDE1ZjAKKyNkZWZpbmUgUkFERU9OX1NDUkFUQ0hfUkVHNQkJMHgxNWY0CisjZGVmaW5lIFJBREVPTl9TQ1JBVENIX1VNU0sJCTB4MDc3MAorI2RlZmluZSBSQURFT05fU0NSQVRDSF9BRERSCQkweDA3NzQKKworI2RlZmluZSBSQURFT05fU0NSQVRDSE9GRiggeCApCQkoUkFERU9OX1NDUkFUQ0hfUkVHX09GRlNFVCArIDQqKHgpKQorCisjZGVmaW5lIEdFVF9TQ1JBVENIKCB4ICkJKGRldl9wcml2LT53cml0ZWJhY2tfd29ya3MJCQlcCisJCQkJPyBEUk1fUkVBRDMyKCBkZXZfcHJpdi0+cmluZ19ycHRyLCBSQURFT05fU0NSQVRDSE9GRih4KSApIFwKKwkJCQk6IFJBREVPTl9SRUFEKCBSQURFT05fU0NSQVRDSF9SRUcwICsgNCooeCkgKSApCisKKworI2RlZmluZSBSQURFT05fR0VOX0lOVF9DTlRMCQkweDAwNDAKKyMJZGVmaW5lIFJBREVPTl9DUlRDX1ZCTEFOS19NQVNLCQkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX0dVSV9JRExFX0lOVF9FTkFCTEUJKDEgPDwgMTkpCisjCWRlZmluZSBSQURFT05fU1dfSU5UX0VOQUJMRQkJKDEgPDwgMjUpCisKKyNkZWZpbmUgUkFERU9OX0dFTl9JTlRfU1RBVFVTCQkweDAwNDQKKyMJZGVmaW5lIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUCQkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX0NSVENfVkJMQU5LX1NUQVRfQUNLICAgCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fR1VJX0lETEVfSU5UX1RFU1RfQUNLICAgICAoMSA8PCAxOSkKKyMJZGVmaW5lIFJBREVPTl9TV19JTlRfVEVTVAkJKDEgPDwgMjUpCisjCWRlZmluZSBSQURFT05fU1dfSU5UX1RFU1RfQUNLICAgCSgxIDw8IDI1KQorIwlkZWZpbmUgUkFERU9OX1NXX0lOVF9GSVJFCQkoMSA8PCAyNikKKworI2RlZmluZSBSQURFT05fSE9TVF9QQVRIX0NOVEwJCTB4MDEzMAorIwlkZWZpbmUgUkFERU9OX0hEUF9TT0ZUX1JFU0VUCQkoMSA8PCAyNikKKyMJZGVmaW5lIFJBREVPTl9IRFBfV0NfVElNRU9VVF9NQVNLCSg3IDw8IDI4KQorIwlkZWZpbmUgUkFERU9OX0hEUF9XQ19USU1FT1VUXzI4QkNMSwkoNyA8PCAyOCkKKworI2RlZmluZSBSQURFT05fSVNZTkNfQ05UTAkJMHgxNzI0CisjCWRlZmluZSBSQURFT05fSVNZTkNfQU5ZMkRfSURMRTNECSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fSVNZTkNfQU5ZM0RfSURMRTJECSgxIDw8IDEpCisjCWRlZmluZSBSQURFT05fSVNZTkNfVFJJRzJEX0lETEUzRAkoMSA8PCAyKQorIwlkZWZpbmUgUkFERU9OX0lTWU5DX1RSSUczRF9JRExFMkQJKDEgPDwgMykKKyMJZGVmaW5lIFJBREVPTl9JU1lOQ19XQUlUX0lETEVHVUkJKDEgPDwgNCkKKyMJZGVmaW5lIFJBREVPTl9JU1lOQ19DUFNDUkFUQ0hfSURMRUdVSQkoMSA8PCA1KQorCisjZGVmaW5lIFJBREVPTl9SQkJNX0dVSUNOVEwJCTB4MTcyYworIwlkZWZpbmUgUkFERU9OX0hPU1RfREFUQV9TV0FQX05PTkUJKDAgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9IT1NUX0RBVEFfU1dBUF8xNkJJVAkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX0hPU1RfREFUQV9TV0FQXzMyQklUCSgyIDw8IDApCisjCWRlZmluZSBSQURFT05fSE9TVF9EQVRBX1NXQVBfSERXCSgzIDw8IDApCisKKyNkZWZpbmUgUkFERU9OX01DX0FHUF9MT0NBVElPTgkJMHgwMTRjCisjZGVmaW5lIFJBREVPTl9NQ19GQl9MT0NBVElPTgkJMHgwMTQ4CisjZGVmaW5lIFJBREVPTl9NQ0xLX0NOVEwJCTB4MDAxMgorIwlkZWZpbmUgUkFERU9OX0ZPUkNFT05fTUNMS0EJCSgxIDw8IDE2KQorIwlkZWZpbmUgUkFERU9OX0ZPUkNFT05fTUNMS0IJCSgxIDw8IDE3KQorIwlkZWZpbmUgUkFERU9OX0ZPUkNFT05fWUNMS0EJCSgxIDw8IDE4KQorIwlkZWZpbmUgUkFERU9OX0ZPUkNFT05fWUNMS0IJCSgxIDw8IDE5KQorIwlkZWZpbmUgUkFERU9OX0ZPUkNFT05fTUMJCSgxIDw8IDIwKQorIwlkZWZpbmUgUkFERU9OX0ZPUkNFT05fQUlDCQkoMSA8PCAyMSkKKworI2RlZmluZSBSQURFT05fUFBfQk9SREVSX0NPTE9SXzAJMHgxZDQwCisjZGVmaW5lIFJBREVPTl9QUF9CT1JERVJfQ09MT1JfMQkweDFkNDQKKyNkZWZpbmUgUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8yCTB4MWQ0OAorI2RlZmluZSBSQURFT05fUFBfQ05UTAkJCTB4MWMzOAorIwlkZWZpbmUgUkFERU9OX1NDSVNTT1JfRU5BQkxFCQkoMSA8PCAgMSkKKyNkZWZpbmUgUkFERU9OX1BQX0xVTV9NQVRSSVgJCTB4MWQwMAorI2RlZmluZSBSQURFT05fUFBfTUlTQwkJCTB4MWMxNAorI2RlZmluZSBSQURFT05fUFBfUk9UX01BVFJJWF8wCQkweDFkNTgKKyNkZWZpbmUgUkFERU9OX1BQX1RYRklMVEVSXzAJCTB4MWM1NAorI2RlZmluZSBSQURFT05fUFBfVFhPRkZTRVRfMAkJMHgxYzVjCisjZGVmaW5lIFJBREVPTl9QUF9UWEZJTFRFUl8xCQkweDFjNmMKKyNkZWZpbmUgUkFERU9OX1BQX1RYRklMVEVSXzIJCTB4MWM4NAorCisjZGVmaW5lIFJBREVPTl9SQjJEX0RTVENBQ0hFX0NUTFNUQVQJMHgzNDJjCisjCWRlZmluZSBSQURFT05fUkIyRF9EQ19GTFVTSAkJKDMgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9SQjJEX0RDX0ZSRUUJCSgzIDw8IDIpCisjCWRlZmluZSBSQURFT05fUkIyRF9EQ19GTFVTSF9BTEwJCTB4ZgorIwlkZWZpbmUgUkFERU9OX1JCMkRfRENfQlVTWQkJKDEgPDwgMzEpCisjZGVmaW5lIFJBREVPTl9SQjNEX0NOVEwJCTB4MWMzYworIwlkZWZpbmUgUkFERU9OX0FMUEhBX0JMRU5EX0VOQUJMRQkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX1BMQU5FX01BU0tfRU5BQkxFCQkoMSA8PCAxKQorIwlkZWZpbmUgUkFERU9OX0RJVEhFUl9FTkFCTEUJCSgxIDw8IDIpCisjCWRlZmluZSBSQURFT05fUk9VTkRfRU5BQkxFCQkoMSA8PCAzKQorIwlkZWZpbmUgUkFERU9OX1NDQUxFX0RJVEhFUl9FTkFCTEUJKDEgPDwgNCkKKyMJZGVmaW5lIFJBREVPTl9ESVRIRVJfSU5JVAkJKDEgPDwgNSkKKyMJZGVmaW5lIFJBREVPTl9ST1BfRU5BQkxFCQkoMSA8PCA2KQorIwlkZWZpbmUgUkFERU9OX1NURU5DSUxfRU5BQkxFCQkoMSA8PCA3KQorIwlkZWZpbmUgUkFERU9OX1pfRU5BQkxFCQkJKDEgPDwgOCkKKyMJZGVmaW5lIFJBREVPTl9aQkxPQ0sxNgkJCSgxIDw8IDE1KQorI2RlZmluZSBSQURFT05fUkIzRF9ERVBUSE9GRlNFVAkJMHgxYzI0CisjZGVmaW5lIFJBREVPTl9SQjNEX0RFUFRIQ0xFQVJWQUxVRQkweDMyMzAKKyNkZWZpbmUgUkFERU9OX1JCM0RfREVQVEhQSVRDSAkJMHgxYzI4CisjZGVmaW5lIFJBREVPTl9SQjNEX1BMQU5FTUFTSwkJMHgxZDg0CisjZGVmaW5lIFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLCTB4MWQ3YworI2RlZmluZSBSQURFT05fUkIzRF9aQ0FDSEVfTU9ERQkJMHgzMjUwCisjZGVmaW5lIFJBREVPTl9SQjNEX1pDQUNIRV9DVExTVEFUCTB4MzI1NAorIwlkZWZpbmUgUkFERU9OX1JCM0RfWkNfRkxVU0gJCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fUkIzRF9aQ19GUkVFCQkoMSA8PCAyKQorIwlkZWZpbmUgUkFERU9OX1JCM0RfWkNfRkxVU0hfQUxMCQkweDUKKyMJZGVmaW5lIFJBREVPTl9SQjNEX1pDX0JVU1kJCSgxIDw8IDMxKQorI2RlZmluZSBSQURFT05fUkIzRF9aU1RFTkNJTENOVEwJMHgxYzJjCisjCWRlZmluZSBSQURFT05fWl9URVNUX01BU0sJCSg3IDw8IDQpCisjCWRlZmluZSBSQURFT05fWl9URVNUX0FMV0FZUwkJKDcgPDwgNCkKKyMJZGVmaW5lIFJBREVPTl9aX0hJRVJBUkNIWV9FTkFCTEUJKDEgPDwgOCkKKyMJZGVmaW5lIFJBREVPTl9TVEVOQ0lMX1RFU1RfQUxXQVlTCSg3IDw8IDEyKQorIwlkZWZpbmUgUkFERU9OX1NURU5DSUxfU19GQUlMX1JFUExBQ0UJKDIgPDwgMTYpCisjCWRlZmluZSBSQURFT05fU1RFTkNJTF9aUEFTU19SRVBMQUNFCSgyIDw8IDIwKQorIwlkZWZpbmUgUkFERU9OX1NURU5DSUxfWkZBSUxfUkVQTEFDRQkoMiA8PCAyNCkKKyMJZGVmaW5lIFJBREVPTl9aX0NPTVBSRVNTSU9OX0VOQUJMRQkoMSA8PCAyOCkKKyMJZGVmaW5lIFJBREVPTl9GT1JDRV9aX0RJUlRZCQkoMSA8PCAyOSkKKyMJZGVmaW5lIFJBREVPTl9aX1dSSVRFX0VOQUJMRQkJKDEgPDwgMzApCisjCWRlZmluZSBSQURFT05fWl9ERUNPTVBSRVNTSU9OX0VOQUJMRQkoMSA8PCAzMSkKKyNkZWZpbmUgUkFERU9OX1JCQk1fU09GVF9SRVNFVAkJMHgwMGYwCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9DUAkJKDEgPDwgIDApCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9ISQkJKDEgPDwgIDEpCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9TRQkJKDEgPDwgIDIpCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9SRQkJKDEgPDwgIDMpCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9QUAkJKDEgPDwgIDQpCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9FMgkJKDEgPDwgIDUpCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9SQgkJKDEgPDwgIDYpCisjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9IRFAJCSgxIDw8ICA3KQorI2RlZmluZSBSQURFT05fUkJCTV9TVEFUVVMJCTB4MGU0MAorIwlkZWZpbmUgUkFERU9OX1JCQk1fRklGT0NOVF9NQVNLCQkweDAwN2YKKyMJZGVmaW5lIFJBREVPTl9SQkJNX0FDVElWRQkJKDEgPDwgMzEpCisjZGVmaW5lIFJBREVPTl9SRV9MSU5FX1BBVFRFUk4JCTB4MWNkMAorI2RlZmluZSBSQURFT05fUkVfTUlTQwkJCTB4MjZjNAorI2RlZmluZSBSQURFT05fUkVfVE9QX0xFRlQJCTB4MjZjMAorI2RlZmluZSBSQURFT05fUkVfV0lEVEhfSEVJR0hUCQkweDFjNDQKKyNkZWZpbmUgUkFERU9OX1JFX1NUSVBQTEVfQUREUgkJMHgxY2M4CisjZGVmaW5lIFJBREVPTl9SRV9TVElQUExFX0RBVEEJCTB4MWNjYworCisjZGVmaW5lIFJBREVPTl9TQ0lTU09SX1RMXzAJCTB4MWNkOAorI2RlZmluZSBSQURFT05fU0NJU1NPUl9CUl8wCQkweDFjZGMKKyNkZWZpbmUgUkFERU9OX1NDSVNTT1JfVExfMQkJMHgxY2UwCisjZGVmaW5lIFJBREVPTl9TQ0lTU09SX0JSXzEJCTB4MWNlNAorI2RlZmluZSBSQURFT05fU0NJU1NPUl9UTF8yCQkweDFjZTgKKyNkZWZpbmUgUkFERU9OX1NDSVNTT1JfQlJfMgkJMHgxY2VjCisjZGVmaW5lIFJBREVPTl9TRV9DT09SRF9GTVQJCTB4MWM1MAorI2RlZmluZSBSQURFT05fU0VfQ05UTAkJCTB4MWM0YworIwlkZWZpbmUgUkFERU9OX0ZGQUNFX0NVTExfQ1cJCSgwIDw8IDApCisjCWRlZmluZSBSQURFT05fQkZBQ0VfU09MSUQJCSgzIDw8IDEpCisjCWRlZmluZSBSQURFT05fRkZBQ0VfU09MSUQJCSgzIDw8IDMpCisjCWRlZmluZSBSQURFT05fRkxBVF9TSEFERV9WVFhfTEFTVAkoMyA8PCA2KQorIwlkZWZpbmUgUkFERU9OX0RJRkZVU0VfU0hBREVfRkxBVAkoMSA8PCA4KQorIwlkZWZpbmUgUkFERU9OX0RJRkZVU0VfU0hBREVfR09VUkFVRAkoMiA8PCA4KQorIwlkZWZpbmUgUkFERU9OX0FMUEhBX1NIQURFX0ZMQVQJCSgxIDw8IDEwKQorIwlkZWZpbmUgUkFERU9OX0FMUEhBX1NIQURFX0dPVVJBVUQJKDIgPDwgMTApCisjCWRlZmluZSBSQURFT05fU1BFQ1VMQVJfU0hBREVfRkxBVAkoMSA8PCAxMikKKyMJZGVmaW5lIFJBREVPTl9TUEVDVUxBUl9TSEFERV9HT1VSQVVECSgyIDw8IDEyKQorIwlkZWZpbmUgUkFERU9OX0ZPR19TSEFERV9GTEFUCQkoMSA8PCAxNCkKKyMJZGVmaW5lIFJBREVPTl9GT0dfU0hBREVfR09VUkFVRAkJKDIgPDwgMTQpCisjCWRlZmluZSBSQURFT05fVlBPUlRfWFlfWEZPUk1fRU5BQkxFCSgxIDw8IDI0KQorIwlkZWZpbmUgUkFERU9OX1ZQT1JUX1pfWEZPUk1fRU5BQkxFCSgxIDw8IDI1KQorIwlkZWZpbmUgUkFERU9OX1ZUWF9QSVhfQ0VOVEVSX09HTAkoMSA8PCAyNykKKyMJZGVmaW5lIFJBREVPTl9ST1VORF9NT0RFX1RSVU5DCQkoMCA8PCAyOCkKKyMJZGVmaW5lIFJBREVPTl9ST1VORF9QUkVDXzhUSF9QSVgJKDEgPDwgMzApCisjZGVmaW5lIFJBREVPTl9TRV9DTlRMX1NUQVRVUwkJMHgyMTQwCisjZGVmaW5lIFJBREVPTl9TRV9MSU5FX1dJRFRICQkweDFkYjgKKyNkZWZpbmUgUkFERU9OX1NFX1ZQT1JUX1hTQ0FMRQkJMHgxZDk4CisjZGVmaW5lIFJBREVPTl9TRV9aQklBU19GQUNUT1IJCTB4MWRiMAorI2RlZmluZSBSQURFT05fU0VfVENMX01BVEVSSUFMX0VNTUlTU0lWRV9SRUQgMHgyMjEwCisjZGVmaW5lIFJBREVPTl9TRV9UQ0xfT1VUUFVUX1ZUWF9GTVQgICAgICAgICAweDIyNTQKKyNkZWZpbmUgUkFERU9OX1NFX1RDTF9WRUNUT1JfSU5EWF9SRUcgICAgICAgIDB4MjIwMAorIyAgICAgICBkZWZpbmUgUkFERU9OX1ZFQ19JTkRYX09DVFdPUkRfU1RSSURFX1NISUZUICAxNgorIyAgICAgICBkZWZpbmUgUkFERU9OX1ZFQ19JTkRYX0RXT1JEX0NPVU5UX1NISUZUICAgICAyOAorI2RlZmluZSBSQURFT05fU0VfVENMX1ZFQ1RPUl9EQVRBX1JFRyAgICAgICAweDIyMDQKKyNkZWZpbmUgUkFERU9OX1NFX1RDTF9TQ0FMQVJfSU5EWF9SRUcgICAgICAgMHgyMjA4CisjICAgICAgIGRlZmluZSBSQURFT05fU0NBTF9JTkRYX0RXT1JEX1NUUklERV9TSElGVCAgMTYKKyNkZWZpbmUgUkFERU9OX1NFX1RDTF9TQ0FMQVJfREFUQV9SRUcgICAgICAgMHgyMjBDCisjZGVmaW5lIFJBREVPTl9TVVJGQUNFX0FDQ0VTU19GTEFHUwkweDBiZjgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0VfQUNDRVNTX0NMUgkweDBiZmMKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0VfQ05UTAkJMHgwYjAwCisjCWRlZmluZSBSQURFT05fU1VSRl9UUkFOU0xBVElPTl9ESVMJKDEgPDwgOCkKKyMJZGVmaW5lIFJBREVPTl9OT05TVVJGX0FQMF9TV1BfTUFTSwkoMyA8PCAyMCkKKyMJZGVmaW5lIFJBREVPTl9OT05TVVJGX0FQMF9TV1BfTElUVExFCSgwIDw8IDIwKQorIwlkZWZpbmUgUkFERU9OX05PTlNVUkZfQVAwX1NXUF9CSUcxNgkoMSA8PCAyMCkKKyMJZGVmaW5lIFJBREVPTl9OT05TVVJGX0FQMF9TV1BfQklHMzIJKDIgPDwgMjApCisjCWRlZmluZSBSQURFT05fTk9OU1VSRl9BUDFfU1dQX01BU0sJKDMgPDwgMjIpCisjCWRlZmluZSBSQURFT05fTk9OU1VSRl9BUDFfU1dQX0xJVFRMRQkoMCA8PCAyMikKKyMJZGVmaW5lIFJBREVPTl9OT05TVVJGX0FQMV9TV1BfQklHMTYJKDEgPDwgMjIpCisjCWRlZmluZSBSQURFT05fTk9OU1VSRl9BUDFfU1dQX0JJRzMyCSgyIDw8IDIyKQorI2RlZmluZSBSQURFT05fU1VSRkFDRTBfSU5GTwkJMHgwYjBjCisjCWRlZmluZSBSQURFT05fU1VSRl9QSVRDSFNFTF9NQVNLCSgweDFmZiA8PCAwKQorIwlkZWZpbmUgUkFERU9OX1NVUkZfVElMRV9NT0RFX01BU0sJKDMgPDwgMTYpCisjCWRlZmluZSBSQURFT05fU1VSRl9USUxFX01PREVfTUFDUk8JKDAgPDwgMTYpCisjCWRlZmluZSBSQURFT05fU1VSRl9USUxFX01PREVfTUlDUk8JKDEgPDwgMTYpCisjCWRlZmluZSBSQURFT05fU1VSRl9USUxFX01PREVfMzJCSVRfWgkoMiA8PCAxNikKKyMJZGVmaW5lIFJBREVPTl9TVVJGX1RJTEVfTU9ERV8xNkJJVF9aCSgzIDw8IDE2KQorI2RlZmluZSBSQURFT05fU1VSRkFDRTBfTE9XRVJfQk9VTkQJMHgwYjA0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFMF9VUFBFUl9CT1VORAkweDBiMDgKKyMJZGVmaW5lIFJBREVPTl9TVVJGX0FERFJFU1NfRklYRURfTUFTSwkoMHgzZmYgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0UxX0lORk8JCTB4MGIxYworI2RlZmluZSBSQURFT05fU1VSRkFDRTFfTE9XRVJfQk9VTkQJMHgwYjE0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFMV9VUFBFUl9CT1VORAkweDBiMTgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0UyX0lORk8JCTB4MGIyYworI2RlZmluZSBSQURFT05fU1VSRkFDRTJfTE9XRVJfQk9VTkQJMHgwYjI0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFMl9VUFBFUl9CT1VORAkweDBiMjgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0UzX0lORk8JCTB4MGIzYworI2RlZmluZSBSQURFT05fU1VSRkFDRTNfTE9XRVJfQk9VTkQJMHgwYjM0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFM19VUFBFUl9CT1VORAkweDBiMzgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0U0X0lORk8JCTB4MGI0YworI2RlZmluZSBSQURFT05fU1VSRkFDRTRfTE9XRVJfQk9VTkQJMHgwYjQ0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFNF9VUFBFUl9CT1VORAkweDBiNDgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0U1X0lORk8JCTB4MGI1YworI2RlZmluZSBSQURFT05fU1VSRkFDRTVfTE9XRVJfQk9VTkQJMHgwYjU0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFNV9VUFBFUl9CT1VORAkweDBiNTgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0U2X0lORk8JCTB4MGI2YworI2RlZmluZSBSQURFT05fU1VSRkFDRTZfTE9XRVJfQk9VTkQJMHgwYjY0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFNl9VUFBFUl9CT1VORAkweDBiNjgKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0U3X0lORk8JCTB4MGI3YworI2RlZmluZSBSQURFT05fU1VSRkFDRTdfTE9XRVJfQk9VTkQJMHgwYjc0CisjZGVmaW5lIFJBREVPTl9TVVJGQUNFN19VUFBFUl9CT1VORAkweDBiNzgKKyNkZWZpbmUgUkFERU9OX1NXX1NFTUFQSE9SRQkJMHgwMTNjCisKKyNkZWZpbmUgUkFERU9OX1dBSVRfVU5USUwJCTB4MTcyMAorIwlkZWZpbmUgUkFERU9OX1dBSVRfQ1JUQ19QRkxJUAkJKDEgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9XQUlUXzJEX0lETEVDTEVBTgkJKDEgPDwgMTYpCisjCWRlZmluZSBSQURFT05fV0FJVF8zRF9JRExFQ0xFQU4JCSgxIDw8IDE3KQorIwlkZWZpbmUgUkFERU9OX1dBSVRfSE9TVF9JRExFQ0xFQU4JKDEgPDwgMTgpCisKKyNkZWZpbmUgUkFERU9OX1JCM0RfWk1BU0tPRkZTRVQJCTB4MzIzNAorI2RlZmluZSBSQURFT05fUkIzRF9aU1RFTkNJTENOVEwJMHgxYzJjCisjCWRlZmluZSBSQURFT05fREVQVEhfRk9STUFUXzE2QklUX0lOVF9aCSgwIDw8IDApCisjCWRlZmluZSBSQURFT05fREVQVEhfRk9STUFUXzI0QklUX0lOVF9aCSgyIDw8IDApCisKKworLyogQ1AgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJBREVPTl9DUF9NRV9SQU1fQUREUgkJMHgwN2Q0CisjZGVmaW5lIFJBREVPTl9DUF9NRV9SQU1fUkFERFIJCTB4MDdkOAorI2RlZmluZSBSQURFT05fQ1BfTUVfUkFNX0RBVEFICQkweDA3ZGMKKyNkZWZpbmUgUkFERU9OX0NQX01FX1JBTV9EQVRBTAkJMHgwN2UwCisKKyNkZWZpbmUgUkFERU9OX0NQX1JCX0JBU0UJCTB4MDcwMAorI2RlZmluZSBSQURFT05fQ1BfUkJfQ05UTAkJMHgwNzA0CisjCWRlZmluZSBSQURFT05fQlVGX1NXQVBfMzJCSVQJCSgyIDw8IDE2KQorI2RlZmluZSBSQURFT05fQ1BfUkJfUlBUUl9BRERSCQkweDA3MGMKKyNkZWZpbmUgUkFERU9OX0NQX1JCX1JQVFIJCTB4MDcxMAorI2RlZmluZSBSQURFT05fQ1BfUkJfV1BUUgkJMHgwNzE0CisKKyNkZWZpbmUgUkFERU9OX0NQX1JCX1dQVFJfREVMQVkJCTB4MDcxOAorIwlkZWZpbmUgUkFERU9OX1BSRV9XUklURV9USU1FUl9TSElGVAkwCisjCWRlZmluZSBSQURFT05fUFJFX1dSSVRFX0xJTUlUX1NISUZUCTIzCisKKyNkZWZpbmUgUkFERU9OX0NQX0lCX0JBU0UJCTB4MDczOAorCisjZGVmaW5lIFJBREVPTl9DUF9DU1FfQ05UTAkJMHgwNzQwCisjCWRlZmluZSBSQURFT05fQ1NRX0NOVF9QUklNQVJZX01BU0sJKDB4ZmYgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9DU1FfUFJJRElTX0lORERJUwkJKDAgPDwgMjgpCisjCWRlZmluZSBSQURFT05fQ1NRX1BSSVBJT19JTkRESVMJCSgxIDw8IDI4KQorIwlkZWZpbmUgUkFERU9OX0NTUV9QUklCTV9JTkRESVMJCSgyIDw8IDI4KQorIwlkZWZpbmUgUkFERU9OX0NTUV9QUklQSU9fSU5EQk0JCSgzIDw8IDI4KQorIwlkZWZpbmUgUkFERU9OX0NTUV9QUklCTV9JTkRCTQkJKDQgPDwgMjgpCisjCWRlZmluZSBSQURFT05fQ1NRX1BSSVBJT19JTkRQSU8JCSgxNSA8PCAyOCkKKworI2RlZmluZSBSQURFT05fQUlDX0NOVEwJCQkweDAxZDAKKyMJZGVmaW5lIFJBREVPTl9QQ0lHQVJUX1RSQU5TTEFURV9FTgkoMSA8PCAwKQorI2RlZmluZSBSQURFT05fQUlDX1NUQVQJCQkweDAxZDQKKyNkZWZpbmUgUkFERU9OX0FJQ19QVF9CQVNFCQkweDAxZDgKKyNkZWZpbmUgUkFERU9OX0FJQ19MT19BRERSCQkweDAxZGMKKyNkZWZpbmUgUkFERU9OX0FJQ19ISV9BRERSCQkweDAxZTAKKyNkZWZpbmUgUkFERU9OX0FJQ19UTEJfQUREUgkJMHgwMWU0CisjZGVmaW5lIFJBREVPTl9BSUNfVExCX0RBVEEJCTB4MDFlOAorCisvKiBDUCBjb21tYW5kIHBhY2tldHMgKi8KKyNkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVDAJCTB4MDAwMDAwMDAKKyMJZGVmaW5lIFJBREVPTl9PTkVfUkVHX1dSCQkoMSA8PCAxNSkKKyNkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVDEJCTB4NDAwMDAwMDAKKyNkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVDIJCTB4ODAwMDAwMDAKKyNkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVDMJCTB4QzAwMDAwMDAKKyMJZGVmaW5lIFJBREVPTl8zRF9STkRSX0dFTl9JTkRYX1BSSU0JMHgwMDAwMjMwMAorIwlkZWZpbmUgUkFERU9OX1dBSVRfRk9SX0lETEUJCTB4MDAwMDI2MDAKKyMJZGVmaW5lIFJBREVPTl8zRF9EUkFXX1ZCVUYJCTB4MDAwMDI4MDAKKyMJZGVmaW5lIFJBREVPTl8zRF9EUkFXX0lNTUQJCTB4MDAwMDI5MDAKKyMJZGVmaW5lIFJBREVPTl8zRF9EUkFXX0lORFgJCTB4MDAwMDJBMDAKKyMJZGVmaW5lIFJBREVPTl8zRF9MT0FEX1ZCUE5UUgkJMHgwMDAwMkYwMAorIwlkZWZpbmUgUkFERU9OX01QRUdfSURDVF9NQUNST0JMT0NLCTB4MDAwMDMwMDAKKyMJZGVmaW5lIFJBREVPTl9NUEVHX0lEQ1RfTUFDUk9CTE9DS19SRVYJMHgwMDAwMzEwMAorIwlkZWZpbmUgUkFERU9OXzNEX0NMRUFSX1pNQVNLCQkweDAwMDAzMjAwCisjCWRlZmluZSBSQURFT05fM0RfQ0xFQVJfSElaCQkweDAwMDAzNzAwCisjCWRlZmluZSBSQURFT05fQ05UTF9IT1NUREFUQV9CTFQJCTB4MDAwMDk0MDAKKyMJZGVmaW5lIFJBREVPTl9DTlRMX1BBSU5UX01VTFRJCQkweDAwMDA5QTAwCisjCWRlZmluZSBSQURFT05fQ05UTF9CSVRCTFRfTVVMVEkJCTB4MDAwMDlCMDAKKyMJZGVmaW5lIFJBREVPTl9DTlRMX1NFVF9TQ0lTU09SUwkJMHhDMDAwMUUwMAorCisjZGVmaW5lIFJBREVPTl9DUF9QQUNLRVRfTUFTSwkJMHhDMDAwMDAwMAorI2RlZmluZSBSQURFT05fQ1BfUEFDS0VUX0NPVU5UX01BU0sJMHgzZmZmMDAwMAorI2RlZmluZSBSQURFT05fQ1BfUEFDS0VUMF9SRUdfTUFTSwkweDAwMDAwN2ZmCisjZGVmaW5lIFJBREVPTl9DUF9QQUNLRVQxX1JFRzBfTUFTSwkweDAwMDAwN2ZmCisjZGVmaW5lIFJBREVPTl9DUF9QQUNLRVQxX1JFRzFfTUFTSwkweDAwM2ZmODAwCisKKyNkZWZpbmUgUkFERU9OX1ZUWF9aX1BSRVNFTlQJCQkoMSA8PCAzMSkKKyNkZWZpbmUgUkFERU9OX1ZUWF9QS0NPTE9SX1BSRVNFTlQJCSgxIDw8IDMpCisKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9OT05FCQkJKDAgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9QT0lOVAkJCSgxIDw8IDApCisjZGVmaW5lIFJBREVPTl9QUklNX1RZUEVfTElORQkJCSgyIDw8IDApCisjZGVmaW5lIFJBREVPTl9QUklNX1RZUEVfTElORV9TVFJJUAkJKDMgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9UUklfTElTVAkJKDQgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9UUklfRkFOCQkoNSA8PCAwKQorI2RlZmluZSBSQURFT05fUFJJTV9UWVBFX1RSSV9TVFJJUAkJKDYgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9UUklfVFlQRTIJCSg3IDw8IDApCisjZGVmaW5lIFJBREVPTl9QUklNX1RZUEVfUkVDVF9MSVNUCQkoOCA8PCAwKQorI2RlZmluZSBSQURFT05fUFJJTV9UWVBFXzNWUlRfUE9JTlRfTElTVAkoOSA8PCAwKQorI2RlZmluZSBSQURFT05fUFJJTV9UWVBFXzNWUlRfTElORV9MSVNUCQkoMTAgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9NQVNLICAgICAgICAgICAgICAgICAgIDB4ZgorI2RlZmluZSBSQURFT05fUFJJTV9XQUxLX0lORAkJCSgxIDw8IDQpCisjZGVmaW5lIFJBREVPTl9QUklNX1dBTEtfTElTVAkJCSgyIDw8IDQpCisjZGVmaW5lIFJBREVPTl9QUklNX1dBTEtfUklORwkJCSgzIDw8IDQpCisjZGVmaW5lIFJBREVPTl9DT0xPUl9PUkRFUl9CR1JBCQkJKDAgPDwgNikKKyNkZWZpbmUgUkFERU9OX0NPTE9SX09SREVSX1JHQkEJCQkoMSA8PCA2KQorI2RlZmluZSBSQURFT05fTUFPU19FTkFCTEUJCQkoMSA8PCA3KQorI2RlZmluZSBSQURFT05fVlRYX0ZNVF9SMTI4X01PREUJCSgwIDw8IDgpCisjZGVmaW5lIFJBREVPTl9WVFhfRk1UX1JBREVPTl9NT0RFCQkoMSA8PCA4KQorI2RlZmluZSBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUCQkxNgorCisjZGVmaW5lIFJBREVPTl9DT0xPUl9GT1JNQVRfQ0k4CQkyCisjZGVmaW5lIFJBREVPTl9DT0xPUl9GT1JNQVRfQVJHQjE1NTUJMworI2RlZmluZSBSQURFT05fQ09MT1JfRk9STUFUX1JHQjU2NQk0CisjZGVmaW5lIFJBREVPTl9DT0xPUl9GT1JNQVRfQVJHQjg4ODgJNgorI2RlZmluZSBSQURFT05fQ09MT1JfRk9STUFUX1JHQjMzMgk3CisjZGVmaW5lIFJBREVPTl9DT0xPUl9GT1JNQVRfUkdCOAk5CisjZGVmaW5lIFJBREVPTl9DT0xPUl9GT1JNQVRfQVJHQjQ0NDQJMTUKKworI2RlZmluZSBSQURFT05fVFhGT1JNQVRfSTgJCTAKKyNkZWZpbmUgUkFERU9OX1RYRk9STUFUX0FJODgJCTEKKyNkZWZpbmUgUkFERU9OX1RYRk9STUFUX1JHQjMzMgkJMgorI2RlZmluZSBSQURFT05fVFhGT1JNQVRfQVJHQjE1NTUJMworI2RlZmluZSBSQURFT05fVFhGT1JNQVRfUkdCNTY1CQk0CisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9BUkdCNDQ0NAk1CisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9BUkdCODg4OAk2CisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9SR0JBODg4OAk3CisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9ZOAkJOAorI2RlZmluZSBSQURFT05fVFhGT1JNQVRfVllVWTQyMiAgICAgICAgIDEwCisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9ZVllVNDIyICAgICAgICAgMTEKKyNkZWZpbmUgUkFERU9OX1RYRk9STUFUX0RYVDEgICAgICAgICAgICAxMgorI2RlZmluZSBSQURFT05fVFhGT1JNQVRfRFhUMjMgICAgICAgICAgIDE0CisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9EWFQ0NSAgICAgICAgICAgMTUKKworI2RlZmluZSBSMjAwX1BQX1RYQ0JMRU5EXzAgICAgICAgICAgICAgICAgMHgyZjAwCisjZGVmaW5lIFIyMDBfUFBfVFhDQkxFTkRfMSAgICAgICAgICAgICAgICAweDJmMTAKKyNkZWZpbmUgUjIwMF9QUF9UWENCTEVORF8yICAgICAgICAgICAgICAgIDB4MmYyMAorI2RlZmluZSBSMjAwX1BQX1RYQ0JMRU5EXzMgICAgICAgICAgICAgICAgMHgyZjMwCisjZGVmaW5lIFIyMDBfUFBfVFhDQkxFTkRfNCAgICAgICAgICAgICAgICAweDJmNDAKKyNkZWZpbmUgUjIwMF9QUF9UWENCTEVORF81ICAgICAgICAgICAgICAgIDB4MmY1MAorI2RlZmluZSBSMjAwX1BQX1RYQ0JMRU5EXzYgICAgICAgICAgICAgICAgMHgyZjYwCisjZGVmaW5lIFIyMDBfUFBfVFhDQkxFTkRfNyAgICAgICAgICAgICAgICAweDJmNzAKKyNkZWZpbmUgUjIwMF9TRV9UQ0xfTElHSFRfTU9ERUxfQ1RMXzAgICAgIDB4MjI2OCAKKyNkZWZpbmUgUjIwMF9QUF9URkFDVE9SXzAgICAgICAgICAgICAgICAgIDB4MmVlMAorI2RlZmluZSBSMjAwX1NFX1ZUWF9GTVRfMCAgICAgICAgICAgICAgICAgMHgyMDg4CisjZGVmaW5lIFIyMDBfU0VfVkFQX0NOVEwgICAgICAgICAgICAgICAgICAweDIwODAKKyNkZWZpbmUgUjIwMF9TRV9UQ0xfTUFUUklYX1NFTF8wICAgICAgICAgIDB4MjIzMAorI2RlZmluZSBSMjAwX1NFX1RDTF9URVhfUFJPQ19DVExfMiAgICAgICAgMHgyMmE4IAorI2RlZmluZSBSMjAwX1NFX1RDTF9VQ1BfVkVSVF9CTEVORF9DVEwgICAgMHgyMmMwIAorI2RlZmluZSBSMjAwX1BQX1RYRklMVEVSXzUgICAgICAgICAgICAgICAgMHgyY2EwIAorI2RlZmluZSBSMjAwX1BQX1RYRklMVEVSXzQgICAgICAgICAgICAgICAgMHgyYzgwIAorI2RlZmluZSBSMjAwX1BQX1RYRklMVEVSXzMgICAgICAgICAgICAgICAgMHgyYzYwIAorI2RlZmluZSBSMjAwX1BQX1RYRklMVEVSXzIgICAgICAgICAgICAgICAgMHgyYzQwIAorI2RlZmluZSBSMjAwX1BQX1RYRklMVEVSXzEgICAgICAgICAgICAgICAgMHgyYzIwIAorI2RlZmluZSBSMjAwX1BQX1RYRklMVEVSXzAgICAgICAgICAgICAgICAgMHgyYzAwIAorI2RlZmluZSBSMjAwX1BQX1RYT0ZGU0VUXzUgICAgICAgICAgICAgICAgMHgyZDc4CisjZGVmaW5lIFIyMDBfUFBfVFhPRkZTRVRfNCAgICAgICAgICAgICAgICAweDJkNjAKKyNkZWZpbmUgUjIwMF9QUF9UWE9GRlNFVF8zICAgICAgICAgICAgICAgIDB4MmQ0OAorI2RlZmluZSBSMjAwX1BQX1RYT0ZGU0VUXzIgICAgICAgICAgICAgICAgMHgyZDMwCisjZGVmaW5lIFIyMDBfUFBfVFhPRkZTRVRfMSAgICAgICAgICAgICAgICAweDJkMTgKKyNkZWZpbmUgUjIwMF9QUF9UWE9GRlNFVF8wICAgICAgICAgICAgICAgIDB4MmQwMAorCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfRkFDRVNfMCAgICAgICAgICAgICAweDJjMTgKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19GQUNFU18xICAgICAgICAgICAgIDB4MmMzOAorI2RlZmluZSBSMjAwX1BQX0NVQklDX0ZBQ0VTXzIgICAgICAgICAgICAgMHgyYzU4CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfRkFDRVNfMyAgICAgICAgICAgICAweDJjNzgKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19GQUNFU180ICAgICAgICAgICAgIDB4MmM5OAorI2RlZmluZSBSMjAwX1BQX0NVQklDX0ZBQ0VTXzUgICAgICAgICAgICAgMHgyY2I4CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzAgICAgICAgICAweDJkMDQKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjJfMCAgICAgICAgIDB4MmQwOAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GM18wICAgICAgICAgMHgyZDBjCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0Y0XzAgICAgICAgICAweDJkMTAKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjVfMCAgICAgICAgIDB4MmQxNAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8xICAgICAgICAgMHgyZDFjCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YyXzEgICAgICAgICAweDJkMjAKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjNfMSAgICAgICAgIDB4MmQyNAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GNF8xICAgICAgICAgMHgyZDI4CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0Y1XzEgICAgICAgICAweDJkMmMKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMiAgICAgICAgIDB4MmQzNAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GMl8yICAgICAgICAgMHgyZDM4CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YzXzIgICAgICAgICAweDJkM2MKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjRfMiAgICAgICAgIDB4MmQ0MAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GNV8yICAgICAgICAgMHgyZDQ0CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzMgICAgICAgICAweDJkNGMKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjJfMyAgICAgICAgIDB4MmQ1MAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GM18zICAgICAgICAgMHgyZDU0CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0Y0XzMgICAgICAgICAweDJkNTgKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjVfMyAgICAgICAgIDB4MmQ1YworI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV80ICAgICAgICAgMHgyZDY0CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YyXzQgICAgICAgICAweDJkNjgKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjNfNCAgICAgICAgIDB4MmQ2YworI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GNF80ICAgICAgICAgMHgyZDcwCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0Y1XzQgICAgICAgICAweDJkNzQKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNSAgICAgICAgIDB4MmQ3YworI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GMl81ICAgICAgICAgMHgyZDgwCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YzXzUgICAgICAgICAweDJkODQKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjRfNSAgICAgICAgIDB4MmQ4OAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GNV81ICAgICAgICAgMHgyZDhjCisKKyNkZWZpbmUgUjIwMF9SRV9BVVhfU0NJU1NPUl9DTlRMICAgICAgICAgIDB4MjZmMAorI2RlZmluZSBSMjAwX1NFX1ZURV9DTlRMICAgICAgICAgICAgICAgICAgMHgyMGIwCisjZGVmaW5lIFIyMDBfU0VfVENMX09VVFBVVF9WVFhfQ09NUF9TRUwgICAweDIyNTAKKyNkZWZpbmUgUjIwMF9QUF9UQU1fREVCVUczICAgICAgICAgICAgICAgIDB4MmQ5YworI2RlZmluZSBSMjAwX1BQX0NOVExfWCAgICAgICAgICAgICAgICAgICAgMHgyY2M0CisjZGVmaW5lIFIyMDBfU0VfVkFQX0NOVExfU1RBVFVTICAgICAgICAgICAweDIxNDAKKyNkZWZpbmUgUjIwMF9SRV9TQ0lTU09SX1RMXzAgICAgICAgICAgICAgIDB4MWNkOAorI2RlZmluZSBSMjAwX1JFX1NDSVNTT1JfVExfMSAgICAgICAgICAgICAgMHgxY2UwCisjZGVmaW5lIFIyMDBfUkVfU0NJU1NPUl9UTF8yICAgICAgICAgICAgICAweDFjZTgKKyNkZWZpbmUgUjIwMF9SQjNEX0RFUFRIWFlfT0ZGU0VUICAgICAgICAgIDB4MWQ2MCAKKyNkZWZpbmUgUjIwMF9SRV9BVVhfU0NJU1NPUl9DTlRMICAgICAgICAgIDB4MjZmMAorI2RlZmluZSBSMjAwX1NFX1ZUWF9TVEFURV9DTlRMICAgICAgICAgICAgMHgyMTgwCisjZGVmaW5lIFIyMDBfUkVfUE9JTlRTSVpFICAgICAgICAgICAgICAgICAweDI2NDgKKyNkZWZpbmUgUjIwMF9TRV9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzAgMHgyMjU0CisKKyNkZWZpbmUgUkFERU9OX1BQX1RFWF9TSVpFXzAgICAgICAgICAgICAgICAgMHgxZDA0ICAvKiBOUE9UICovCisjZGVmaW5lIFJBREVPTl9QUF9URVhfU0laRV8xICAgICAgICAgICAgICAgIDB4MWQwYworI2RlZmluZSBSQURFT05fUFBfVEVYX1NJWkVfMiAgICAgICAgICAgICAgICAweDFkMTQKKworI2RlZmluZSBSQURFT05fUFBfQ1VCSUNfRkFDRVNfMCAgICAgICAgICAgICAweDFkMjQKKyNkZWZpbmUgUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzEgICAgICAgICAgICAgMHgxZDI4CisjZGVmaW5lIFJBREVPTl9QUF9DVUJJQ19GQUNFU18yICAgICAgICAgICAgIDB4MWQyYworI2RlZmluZSBSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QwXzAgICAgICAgICAweDFkZDAJLyogYml0cyBbMzE6NV0gKi8KKyNkZWZpbmUgUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMV8wICAgICAgICAgMHgxZTAwCisjZGVmaW5lIFJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDJfMCAgICAgICAgIDB4MWUxNAorCisjZGVmaW5lIFNFX1ZBUF9DTlRMX19UQ0xfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VfVkFQX0NOVExfX0ZPUkNFX1dfVE9fT05FX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBTRV9WQVBfQ05UTF9fVkZfTUFYX1ZUWF9OVU1fX1NISUZUICAgICAgICAgICAgICAgICAweDAwMDAwMDEyCisjZGVmaW5lIFNFX1ZURV9DTlRMX19WVFhfWFlfRk1UX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgU0VfVlRFX0NOVExfX1ZUWF9aX0ZNVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBTRV9WVFhfRk1UXzBfX1ZUWF9aMF9QUkVTRU5UX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNFX1ZUWF9GTVRfMF9fVlRYX1cwX1BSRVNFTlRfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU0VfVlRYX0ZNVF8wX19WVFhfQ09MT1JfMF9GTVRfX1NISUZUICAgICAgICAgICAgICAgMHgwMDAwMDAwYgorI2RlZmluZSBSMjAwXzNEX0RSQVdfSU1NRF8yICAgICAgMHhDMDAwMzUwMAorI2RlZmluZSBSMjAwX1NFX1ZUWF9GTVRfMSAgICAgICAgICAgICAgICAgMHgyMDhjCisjZGVmaW5lIFIyMDBfUkVfQ05UTCAgICAgICAgICAgICAgICAgICAgICAweDFjNTAgCisKKyNkZWZpbmUgUjIwMF9SQjNEX0JMRU5EQ09MT1IgICAgICAgICAgICAgIDB4MzIxOAorCisjZGVmaW5lIFIyMDBfU0VfVENMX1BPSU5UX1NQUklURV9DTlRMICAgICAweDIyYzQKKworI2RlZmluZSBSMjAwX1BQX1RSSV9QRVJGIDB4MmNmOAorCisvKiBDb25zdGFudHMgKi8KKyNkZWZpbmUgUkFERU9OX01BWF9VU0VDX1RJTUVPVVQJCTEwMDAwMAkvKiAxMDAgbXMgKi8KKworI2RlZmluZSBSQURFT05fTEFTVF9GUkFNRV9SRUcJCVJBREVPTl9TQ1JBVENIX1JFRzAKKyNkZWZpbmUgUkFERU9OX0xBU1RfRElTUEFUQ0hfUkVHCVJBREVPTl9TQ1JBVENIX1JFRzEKKyNkZWZpbmUgUkFERU9OX0xBU1RfQ0xFQVJfUkVHCQlSQURFT05fU0NSQVRDSF9SRUcyCisjZGVmaW5lIFJBREVPTl9MQVNUX1NXSV9SRUcJCVJBREVPTl9TQ1JBVENIX1JFRzMKKyNkZWZpbmUgUkFERU9OX0xBU1RfRElTUEFUQ0gJCTEKKworI2RlZmluZSBSQURFT05fTUFYX1ZCX0FHRQkJMHg3ZmZmZmZmZgorI2RlZmluZSBSQURFT05fTUFYX1ZCX1ZFUlRTCQkoMHhmZmZmKQorCisjZGVmaW5lIFJBREVPTl9SSU5HX0hJR0hfTUFSSwkJMTI4CisKKyNkZWZpbmUgUkFERU9OX1JFQUQocmVnKQlEUk1fUkVBRDMyKCAgZGV2X3ByaXYtPm1taW8sIChyZWcpICkKKyNkZWZpbmUgUkFERU9OX1dSSVRFKHJlZyx2YWwpCURSTV9XUklURTMyKCBkZXZfcHJpdi0+bW1pbywgKHJlZyksICh2YWwpICkKKyNkZWZpbmUgUkFERU9OX1JFQUQ4KHJlZykJRFJNX1JFQUQ4KCAgZGV2X3ByaXYtPm1taW8sIChyZWcpICkKKyNkZWZpbmUgUkFERU9OX1dSSVRFOChyZWcsdmFsKQlEUk1fV1JJVEU4KCBkZXZfcHJpdi0+bW1pbywgKHJlZyksICh2YWwpICkKKworI2RlZmluZSBSQURFT05fV1JJVEVfUExMKCBhZGRyLCB2YWwgKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlSQURFT05fV1JJVEU4KCBSQURFT05fQ0xPQ0tfQ05UTF9JTkRFWCwJCQkJXAorCQkgICAgICAgKChhZGRyKSAmIDB4MWYpIHwgUkFERU9OX1BMTF9XUl9FTiApOwkJXAorCVJBREVPTl9XUklURSggUkFERU9OX0NMT0NLX0NOVExfREFUQSwgKHZhbCkgKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENQX1BBQ0tFVDAoIHJlZywgbiApCQkJCQkJXAorCShSQURFT05fQ1BfUEFDS0VUMCB8ICgobikgPDwgMTYpIHwgKChyZWcpID4+IDIpKQorI2RlZmluZSBDUF9QQUNLRVQwX1RBQkxFKCByZWcsIG4gKQkJCQkJXAorCShSQURFT05fQ1BfUEFDS0VUMCB8IFJBREVPTl9PTkVfUkVHX1dSIHwgKChuKSA8PCAxNikgfCAoKHJlZykgPj4gMikpCisjZGVmaW5lIENQX1BBQ0tFVDEoIHJlZzAsIHJlZzEgKQkJCQkJXAorCShSQURFT05fQ1BfUEFDS0VUMSB8ICgoKHJlZzEpID4+IDIpIDw8IDE1KSB8ICgocmVnMCkgPj4gMikpCisjZGVmaW5lIENQX1BBQ0tFVDIoKQkJCQkJCQlcCisJKFJBREVPTl9DUF9QQUNLRVQyKQorI2RlZmluZSBDUF9QQUNLRVQzKCBwa3QsIG4gKQkJCQkJCVwKKwkoUkFERU9OX0NQX1BBQ0tFVDMgfCAocGt0KSB8ICgobikgPDwgMTYpKQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVuZ2luZSBjb250cm9sIGhlbHBlciBtYWNyb3MKKyAqLworCisjZGVmaW5lIFJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKSBkbyB7CQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1dBSVRfVU5USUwsIDAgKSApOwkJCVwKKwlPVVRfUklORyggKFJBREVPTl9XQUlUXzJEX0lETEVDTEVBTiB8CQkJCVwKKwkJICAgUkFERU9OX1dBSVRfSE9TVF9JRExFQ0xFQU4pICk7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCkgZG8gewkJCQlcCisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9XQUlUX1VOVElMLCAwICkgKTsJCQlcCisJT1VUX1JJTkcoIChSQURFT05fV0FJVF8zRF9JRExFQ0xFQU4gfAkJCQlcCisJCSAgIFJBREVPTl9XQUlUX0hPU1RfSURMRUNMRUFOKSApOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkFERU9OX1dBSVRfVU5USUxfSURMRSgpIGRvIHsJCQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1dBSVRfVU5USUwsIDAgKSApOwkJCVwKKwlPVVRfUklORyggKFJBREVPTl9XQUlUXzJEX0lETEVDTEVBTiB8CQkJCVwKKwkJICAgUkFERU9OX1dBSVRfM0RfSURMRUNMRUFOIHwJCQkJXAorCQkgICBSQURFT05fV0FJVF9IT1NUX0lETEVDTEVBTikgKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFJBREVPTl9XQUlUX1VOVElMX1BBR0VfRkxJUFBFRCgpIGRvIHsJCQkJXAorCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fV0FJVF9VTlRJTCwgMCApICk7CQkJXAorCU9VVF9SSU5HKCBSQURFT05fV0FJVF9DUlRDX1BGTElQICk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkFERU9OX0ZMVVNIX0NBQ0hFKCkgZG8gewkJCQkJXAorCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkIyRF9EU1RDQUNIRV9DVExTVEFULCAwICkgKTsJXAorCU9VVF9SSU5HKCBSQURFT05fUkIyRF9EQ19GTFVTSCApOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFJBREVPTl9QVVJHRV9DQUNIRSgpIGRvIHsJCQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JCMkRfRFNUQ0FDSEVfQ1RMU1RBVCwgMCApICk7CVwKKwlPVVRfUklORyggUkFERU9OX1JCMkRfRENfRkxVU0hfQUxMICk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkFERU9OX0ZMVVNIX1pDQUNIRSgpIGRvIHsJCQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JCM0RfWkNBQ0hFX0NUTFNUQVQsIDAgKSApOwlcCisJT1VUX1JJTkcoIFJBREVPTl9SQjNEX1pDX0ZMVVNIICk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkFERU9OX1BVUkdFX1pDQUNIRSgpIGRvIHsJCQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JCM0RfWkNBQ0hFX0NUTFNUQVQsIDAgKSApOwlcCisJT1VUX1JJTkcoIFJBREVPTl9SQjNEX1pDX0ZMVVNIX0FMTCApOwkJCQlcCit9IHdoaWxlICgwKQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE1pc2MgaGVscGVyIG1hY3JvcworICovCisKKy8qIFBlcmZib3ggZnVuY3Rpb25hbGl0eSBvbmx5LiAgCisgKi8KKyNkZWZpbmUgUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKCEoZGV2X3ByaXYtPnN0YXRzLmJveGVzICYgUkFERU9OX0JPWF9ETUFfSURMRSkpIHsJCVwKKwkJdTMyIGhlYWQgPSBHRVRfUklOR19IRUFEKCBkZXZfcHJpdiApOwkJCVwKKwkJaWYgKGhlYWQgPT0gZGV2X3ByaXYtPnJpbmcudGFpbCkJCQlcCisJCQlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9ETUFfSURMRTsJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsJCVwKKwlpZiAoIHNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPj0gUkFERU9OX01BWF9WQl9BR0UgKSB7CQlcCisJCWludCBfX3JldCA9IHJhZGVvbl9kb19jcF9pZGxlKCBkZXZfcHJpdiApOwkJXAorCQlpZiAoIF9fcmV0ICkgcmV0dXJuIF9fcmV0OwkJCQlcCisJCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAwOwkJCQlcCisJCXJhZGVvbl9mcmVlbGlzdF9yZXNldCggZGV2ICk7CQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFJBREVPTl9ESVNQQVRDSF9BR0UoIGFnZSApIGRvIHsJCQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX0xBU1RfRElTUEFUQ0hfUkVHLCAwICkgKTsJCVwKKwlPVVRfUklORyggYWdlICk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSQURFT05fRlJBTUVfQUdFKCBhZ2UgKSBkbyB7CQkJCQlcCisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9MQVNUX0ZSQU1FX1JFRywgMCApICk7CQlcCisJT1VUX1JJTkcoIGFnZSApOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkFERU9OX0NMRUFSX0FHRSggYWdlICkgZG8gewkJCQkJXAorCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fTEFTVF9DTEVBUl9SRUcsIDAgKSApOwkJXAorCU9VVF9SSU5HKCBhZ2UgKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJpbmcgY29udHJvbAorICovCisKKyNkZWZpbmUgUkFERU9OX1ZFUkJPU0UJMAorCisjZGVmaW5lIFJJTkdfTE9DQUxTCWludCB3cml0ZSwgX25yOyB1bnNpZ25lZCBpbnQgbWFzazsgdTMyICpyaW5nOworCisjZGVmaW5lIEJFR0lOX1JJTkcoIG4gKSBkbyB7CQkJCQkJXAorCWlmICggUkFERU9OX1ZFUkJPU0UgKSB7CQkJCQkJXAorCQlEUk1fSU5GTyggIkJFR0lOX1JJTkcoICVkICkgaW4gJXNcbiIsCQkJXAorCQkJICAgbiwgX19GVU5DVElPTl9fICk7CQkJCVwKKwl9CQkJCQkJCQlcCisJaWYgKCBkZXZfcHJpdi0+cmluZy5zcGFjZSA8PSAobikgKiBzaXplb2YodTMyKSApIHsJCVwKKyAgICAgICAgICAgICAgICBDT01NSVRfUklORygpOwkJCQkJCVwKKwkJcmFkZW9uX3dhaXRfcmluZyggZGV2X3ByaXYsIChuKSAqIHNpemVvZih1MzIpICk7CVwKKwl9CQkJCQkJCQlcCisJX25yID0gbjsgZGV2X3ByaXYtPnJpbmcuc3BhY2UgLT0gKG4pICogc2l6ZW9mKHUzMik7CQlcCisJcmluZyA9IGRldl9wcml2LT5yaW5nLnN0YXJ0OwkJCQkJXAorCXdyaXRlID0gZGV2X3ByaXYtPnJpbmcudGFpbDsJCQkJCVwKKwltYXNrID0gZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFEVkFOQ0VfUklORygpIGRvIHsJCQkJCQlcCisJaWYgKCBSQURFT05fVkVSQk9TRSApIHsJCQkJCQlcCisJCURSTV9JTkZPKCAiQURWQU5DRV9SSU5HKCkgd3I9MHglMDZ4IHRhaWw9MHglMDZ4XG4iLAlcCisJCQkgIHdyaXRlLCBkZXZfcHJpdi0+cmluZy50YWlsICk7CQkJXAorCX0JCQkJCQkJCVwKKwlpZiAoKChkZXZfcHJpdi0+cmluZy50YWlsICsgX25yKSAmIG1hc2spICE9IHdyaXRlKSB7CQlcCisJCURSTV9FUlJPUiggCQkJCQkJXAorCQkJIkFEVkFOQ0VfUklORygpOiBtaXNtYXRjaDogbnI6ICV4IHdyaXRlOiAleCBsaW5lOiAlZFxuIiwJXAorCQkJKChkZXZfcHJpdi0+cmluZy50YWlsICsgX25yKSAmIG1hc2spLAkJXAorCQkJd3JpdGUsIF9fTElORV9fKTsJCQkJCQlcCisJfSBlbHNlCQkJCQkJCQlcCisJCWRldl9wcml2LT5yaW5nLnRhaWwgPSB3cml0ZTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT01NSVRfUklORygpIGRvIHsJCQkJCQlcCisJLyogRmx1c2ggd3JpdGVzIHRvIHJpbmcgKi8JCQkJCVwKKwlEUk1fTUVNT1JZQkFSUklFUigpOwkJCQkJCVwKKwlHRVRfUklOR19IRUFEKCBkZXZfcHJpdiApOwkJCQkJXAorCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX1dQVFIsIGRldl9wcml2LT5yaW5nLnRhaWwgKTsJCVwKKwkvKiByZWFkIGZyb20gUENJIGJ1cyB0byBlbnN1cmUgY29ycmVjdCBwb3N0aW5nICovCQlcCisJUkFERU9OX1JFQUQoIFJBREVPTl9DUF9SQl9SUFRSICk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgT1VUX1JJTkcoIHggKSBkbyB7CQkJCQkJXAorCWlmICggUkFERU9OX1ZFUkJPU0UgKSB7CQkJCQkJXAorCQlEUk1fSU5GTyggIiAgIE9VVF9SSU5HKCAweCUwOHggKSBhdCAweCV4XG4iLAkJXAorCQkJICAgKHVuc2lnbmVkIGludCkoeCksIHdyaXRlICk7CQkJXAorCX0JCQkJCQkJCVwKKwlyaW5nW3dyaXRlKytdID0gKHgpOwkJCQkJCVwKKwl3cml0ZSAmPSBtYXNrOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE9VVF9SSU5HX1JFRyggcmVnLCB2YWwgKSBkbyB7CQkJCQlcCisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIHJlZywgMCApICk7CQkJCVwKKwlPVVRfUklORyggdmFsICk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIE9VVF9SSU5HX1RBQkxFKCB0YWIsIHN6ICkgZG8gewkJCQkJXAorCWludCBfc2l6ZSA9IChzeik7CQkJCQlcCisJaW50ICpfdGFiID0gKGludCAqKSh0YWIpOwkJCQlcCisJCQkJCQkJCVwKKwlpZiAod3JpdGUgKyBfc2l6ZSA+IG1hc2spIHsJCQkJXAorCQlpbnQgX2kgPSAobWFzaysxKSAtIHdyaXRlOwkJCVwKKwkJX3NpemUgLT0gX2k7CQkJCQlcCisJCXdoaWxlIChfaSA+IDAgKSB7CQkJCVwKKwkJCSooaW50ICopKHJpbmcgKyB3cml0ZSkgPSAqX3RhYisrOwlcCisJCQl3cml0ZSsrOwkJCQlcCisJCQlfaS0tOwkJCQkJXAorCQl9CQkJCQkJXAorCQl3cml0ZSA9IDA7CQkJCQlcCisJCV90YWIgKz0gX2k7CQkJCQlcCisJfQkJCQkJCQlcCisJCQkJCQkJCVwKKwl3aGlsZSAoX3NpemUgPiAwKSB7CQkJCQlcCisJCSoocmluZyArIHdyaXRlKSA9ICpfdGFiKys7CQkJXAorCQl3cml0ZSsrOwkJCQkJXAorCQlfc2l6ZS0tOwkJCQkJXAorCX0JCQkJCQkJXAorCXdyaXRlICY9IG1hc2s7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworCisjZW5kaWYgLyogX19SQURFT05fRFJWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjE4YmVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faXJxLmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qIHJhZGVvbl9pcnEuYyAtLSBJUlEgaGFuZGxpbmcgZm9yIHJhZGVvbiAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIFRoZSBXZWF0aGVyIENoYW5uZWwsIEluYy4gIDIwMDIuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGUgV2VhdGhlciBDaGFubmVsIChUTSkgZnVuZGVkIFR1bmdzdGVuIEdyYXBoaWNzIHRvIGRldmVsb3AgdGhlCisgKiBpbml0aWFsIHJlbGVhc2Ugb2YgdGhlIFJhZGVvbiA4NTAwIGRyaXZlciB1bmRlciB0aGUgWEZyZWU4NiBsaWNlbnNlLgorICogVGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKiAgICBNaWNoZWwgRO+/vXplciA8bWljaGVsQGRhZW56ZXIubmV0PgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKKworLyogSW50ZXJydXB0cyAtIFVzZWQgZm9yIGRldmljZSBzeW5jaHJvbml6YXRpb24gYW5kIGZsdXNoaW5nIGluIHRoZQorICogZm9sbG93aW5nIGNpcmN1bXN0YW5jZXM6CisgKgorICogLSBFeGNsdXNpdmUgRkIgYWNjZXNzIHdpdGggaHcgaWRsZToKKyAqICAgIC0gV2FpdCBmb3IgR1VJIElkbGUgKD8pIGludGVycnVwdCwgdGhlbiBkbyBub3JtYWwgZmx1c2guCisgKgorICogLSBGcmFtZSB0aHJvdHRsaW5nLCBOVl9mZW5jZToKKyAqICAgIC0gRHJvcCBtYXJrZXIgaXJxJ3MgaW50byBjb21tYW5kIHN0cmVhbSBhaGVhZCBvZiB0aW1lLgorICogICAgLSBXYWl0IG9uIGlycSdzIHdpdGggbG9jayAqbm90IGhlbGQqCisgKiAgICAtIENoZWNrIGVhY2ggZm9yIHRlcm1pbmF0aW9uIGNvbmRpdGlvbgorICoKKyAqIC0gSW50ZXJuYWxseSBpbiBjcF9nZXRidWZmZXIsIGV0YzoKKyAqICAgIC0gYXMgYWJvdmUsIGJ1dCB3YWl0IHdpdGggbG9jayBoZWxkPz8/CisgKgorICogTk9URTogVGhlc2UgZnVuY3Rpb25zIGFyZSBtaXNsZWFkaW5nbHkgbmFtZWQgLS0gdGhlIGlycSdzIGFyZW4ndAorICogdGllZCB0byBkbWEgYXQgYWxsLCB0aGlzIGlzIGp1c3QgYSBoYW5nb3ZlciBmcm9tIGRyaSBwcmVoaXN0b3J5LgorICovCisKK2lycXJldHVybl90IHJhZGVvbl9kcml2ZXJfaXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApCit7CisJZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworICAgCXUzMiBzdGF0OworCisJLyogT25seSBjb25zaWRlciB0aGUgYml0cyB3ZSdyZSBpbnRlcmVzdGVkIGluIC0gb3RoZXJzIGNvdWxkIGJlIHVzZWQKKwkgKiBvdXRzaWRlIHRoZSBEUk0KKwkgKi8KKwlzdGF0ID0gUkFERU9OX1JFQUQoUkFERU9OX0dFTl9JTlRfU1RBVFVTKQorCSAgICAgJiAoUkFERU9OX1NXX0lOVF9URVNUIHwgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpOworCWlmICghc3RhdCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyogU1cgaW50ZXJydXB0ICovCisJaWYgKHN0YXQgJiBSQURFT05fU1dfSU5UX1RFU1QpIHsKKwkJRFJNX1dBS0VVUCggJmRldl9wcml2LT5zd2lfcXVldWUgKTsKKwl9CisKKwkvKiBWQkxBTksgaW50ZXJydXB0ICovCisJaWYgKHN0YXQgJiBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCkgeworCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZCk7CisJCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlKTsKKwkJZHJtX3ZibF9zZW5kX3NpZ25hbHMoIGRldiApOworCX0KKworCS8qIEFja25vd2xlZGdlIGludGVycnVwdHMgd2UgaGFuZGxlICovCisJUkFERU9OX1dSSVRFKFJBREVPTl9HRU5fSU5UX1NUQVRVUywgc3RhdCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdikKK3sKKwl1MzIgdG1wID0gUkFERU9OX1JFQUQoIFJBREVPTl9HRU5fSU5UX1NUQVRVUyApCisJCSYgKFJBREVPTl9TV19JTlRfVEVTVF9BQ0sgfCBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCk7CisJaWYgKHRtcCkKKwkJUkFERU9OX1dSSVRFKCBSQURFT05fR0VOX0lOVF9TVEFUVVMsIHRtcCApOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X2lycShkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGludCByZXQ7CisJUklOR19MT0NBTFM7CisKKwlhdG9taWNfaW5jKCZkZXZfcHJpdi0+c3dpX2VtaXR0ZWQpOworCXJldCA9IGF0b21pY19yZWFkKCZkZXZfcHJpdi0+c3dpX2VtaXR0ZWQpOworCisJQkVHSU5fUklORyggNCApOworCU9VVF9SSU5HX1JFRyggUkFERU9OX0xBU1RfU1dJX1JFRywgcmV0ICk7CisJT1VUX1JJTkdfUkVHKCBSQURFT05fR0VOX0lOVF9TVEFUVVMsIFJBREVPTl9TV19JTlRfRklSRSApOworCUFEVkFOQ0VfUklORygpOyAKKyAJQ09NTUlUX1JJTkcoKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByYWRlb25fd2FpdF9pcnEoZHJtX2RldmljZV90ICpkZXYsIGludCBzd2lfbnIpCit7CisgIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCWludCByZXQgPSAwOworCisgCWlmIChSQURFT05fUkVBRCggUkFERU9OX0xBU1RfU1dJX1JFRyApID49IHN3aV9ucikgIAorIAkJcmV0dXJuIDA7IAorCisJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfV0FJVF9JRExFOworCisJLyogVGhpcyBpcyBhIGhhY2sgdG8gd29yayBhcm91bmQgbXlzdGVyaW91cyBmcmVlemVzIG9uIGNlcnRhaW4KKwkgKiBzeXN0ZW1zOgorCSAqLyAKKwlyYWRlb25fYWNrbm93bGVkZ2VfaXJxcyggZGV2X3ByaXYgKTsKKworCURSTV9XQUlUX09OKCByZXQsIGRldl9wcml2LT5zd2lfcXVldWUsIDMgKiBEUk1fSFosIAorCQkgICAgIFJBREVPTl9SRUFEKCBSQURFT05fTEFTVF9TV0lfUkVHICkgPj0gc3dpX25yICk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK3sKKyAgCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IAorCSAgIChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IGN1cl92Ymxhbms7CisJaW50IHJldCA9IDA7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKCBkZXZfcHJpdiApOworCisJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfV0FJVF9JRExFOworCisJLyogQXNzdW1lIHRoYXQgdGhlIHVzZXIgaGFzIG1pc3NlZCB0aGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIKKwkgKiBieSBhYm91dCBhIGRheSByYXRoZXIgdGhhbiBzaGUgd2FudHMgdG8gd2FpdCBmb3IgeWVhcnMKKwkgKiB1c2luZyB2ZXJ0aWNhbCBibGFua3MuLi4gCisJICovCisJRFJNX1dBSVRfT04oIHJldCwgZGV2LT52YmxfcXVldWUsIDMqRFJNX0haLCAKKwkJICAgICAoICggKCBjdXJfdmJsYW5rID0gYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkICkgKQorCQkJIC0gKnNlcXVlbmNlICkgPD0gKDE8PDIzKSApICk7CisKKwkqc2VxdWVuY2UgPSBjdXJfdmJsYW5rOworCisJcmV0dXJuIHJldDsKK30KKworCisvKiBOZWVkcyB0aGUgbG9jayBhcyBpdCB0b3VjaGVzIHRoZSByaW5nLgorICovCitpbnQgcmFkZW9uX2lycV9lbWl0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25faXJxX2VtaXRfdCBlbWl0OworCWludCByZXN1bHQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGVtaXQsIChkcm1fcmFkZW9uX2lycV9lbWl0X3QgX191c2VyICopZGF0YSwKKwkJCQkgIHNpemVvZihlbWl0KSApOworCisJcmVzdWx0ID0gcmFkZW9uX2VtaXRfaXJxKCBkZXYgKTsKKworCWlmICggRFJNX0NPUFlfVE9fVVNFUiggZW1pdC5pcnFfc2VxLCAmcmVzdWx0LCBzaXplb2YoaW50KSApICkgeworCQlEUk1fRVJST1IoICJjb3B5X3RvX3VzZXJcbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBEb2Vzbid0IG5lZWQgdGhlIGhhcmR3YXJlIGxvY2suCisgKi8KK2ludCByYWRlb25faXJxX3dhaXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9pcnFfd2FpdF90IGlycXdhaXQ7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggaXJxd2FpdCwgKGRybV9yYWRlb25faXJxX3dhaXRfdCBfX3VzZXIqKWRhdGEsCisJCQkJICBzaXplb2YoaXJxd2FpdCkgKTsKKworCXJldHVybiByYWRlb25fd2FpdF9pcnEoIGRldiwgaXJxd2FpdC5pcnFfc2VxICk7Cit9CisKKworLyogZHJtX2RtYS5oIGhvb2tzCisqLwordm9pZCByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkoZHJtX3JhZGVvbl9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisgCS8qIERpc2FibGUgKmFsbCogaW50ZXJydXB0cyAqLworICAgICAgCVJBREVPTl9XUklURSggUkFERU9OX0dFTl9JTlRfQ05UTCwgMCApOworCisJLyogQ2xlYXIgYml0cyBpZiB0aGV5J3JlIGFscmVhZHkgaGlnaCAqLworCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKCBkZXZfcHJpdiApOworfQorCit2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkoZHJtX3JhZGVvbl9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisgICAJYXRvbWljX3NldCgmZGV2X3ByaXYtPnN3aV9lbWl0dGVkLCAwKTsKKwlEUk1fSU5JVF9XQUlUUVVFVUUoICZkZXZfcHJpdi0+c3dpX3F1ZXVlICk7CisKKwkvKiBUdXJuIG9uIFNXIGFuZCBWQkwgaW50cyAqLworICAgCVJBREVPTl9XUklURSggUkFERU9OX0dFTl9JTlRfQ05UTCwKKwkJICAgICAgUkFERU9OX0NSVENfVkJMQU5LX01BU0sgfAkKKwkJICAgICAgUkFERU9OX1NXX0lOVF9FTkFCTEUgKTsKK30KKwordm9pZCByYWRlb25fZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CisJCShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJaWYgKCFkZXZfcHJpdikKKwkJcmV0dXJuOworCisJLyogRGlzYWJsZSAqYWxsKiBpbnRlcnJ1cHRzICovCisJUkFERU9OX1dSSVRFKCBSQURFT05fR0VOX0lOVF9DTlRMLCAwICk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9tZW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNGY4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9tZW0uYwpAQCAtMCwwICsxLDMyMiBAQAorLyogcmFkZW9uX21lbS5jIC0tIFNpbXBsZSBHQVJUL2ZiIG1lbW9yeSBtYW5hZ2VyIGZvciByYWRlb24gLSotIGxpbnV4LWMgLSotCisgKgorICogQ29weXJpZ2h0IChDKSBUaGUgV2VhdGhlciBDaGFubmVsLCBJbmMuICAyMDAyLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhlIFdlYXRoZXIgQ2hhbm5lbCAoVE0pIGZ1bmRlZCBUdW5nc3RlbiBHcmFwaGljcyB0byBkZXZlbG9wIHRoZQorICogaW5pdGlhbCByZWxlYXNlIG9mIHRoZSBSYWRlb24gODUwMCBkcml2ZXIgdW5kZXIgdGhlIFhGcmVlODYgbGljZW5zZS4KKyAqIFRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKKworLyogVmVyeSBzaW1wbGUgYWxsb2NhdG9yIGZvciBHQVJUIG1lbW9yeSwgd29ya2luZyBvbiBhIHN0YXRpYyByYW5nZQorICogYWxyZWFkeSBtYXBwZWQgaW50byBlYWNoIGNsaWVudCdzIGFkZHJlc3Mgc3BhY2UuICAKKyAqLworCitzdGF0aWMgc3RydWN0IG1lbV9ibG9jayAqc3BsaXRfYmxvY2soc3RydWN0IG1lbV9ibG9jayAqcCwgaW50IHN0YXJ0LCBpbnQgc2l6ZSwKKwkJCQkgICAgIERSTUZJTEUgZmlscCApCit7CisJLyogTWF5YmUgY3V0IG9mZiB0aGUgc3RhcnQgb2YgYW4gZXhpc3RpbmcgYmxvY2sgKi8KKwlpZiAoc3RhcnQgPiBwLT5zdGFydCkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXdibG9jayA9IGRybV9hbGxvYyhzaXplb2YoKm5ld2Jsb2NrKSwgRFJNX01FTV9CVUZTICk7CisJCWlmICghbmV3YmxvY2spIAorCQkJZ290byBvdXQ7CisJCW5ld2Jsb2NrLT5zdGFydCA9IHN0YXJ0OworCQluZXdibG9jay0+c2l6ZSA9IHAtPnNpemUgLSAoc3RhcnQgLSBwLT5zdGFydCk7CisJCW5ld2Jsb2NrLT5maWxwID0gTlVMTDsKKwkJbmV3YmxvY2stPm5leHQgPSBwLT5uZXh0OworCQluZXdibG9jay0+cHJldiA9IHA7CisJCXAtPm5leHQtPnByZXYgPSBuZXdibG9jazsKKwkJcC0+bmV4dCA9IG5ld2Jsb2NrOworCQlwLT5zaXplIC09IG5ld2Jsb2NrLT5zaXplOworCQlwID0gbmV3YmxvY2s7CisJfQorICAgCisJLyogTWF5YmUgY3V0IG9mZiB0aGUgZW5kIG9mIGFuIGV4aXN0aW5nIGJsb2NrICovCisJaWYgKHNpemUgPCBwLT5zaXplKSB7CisJCXN0cnVjdCBtZW1fYmxvY2sgKm5ld2Jsb2NrID0gZHJtX2FsbG9jKHNpemVvZigqbmV3YmxvY2spLCBEUk1fTUVNX0JVRlMgKTsKKwkJaWYgKCFuZXdibG9jaykKKwkJCWdvdG8gb3V0OworCQluZXdibG9jay0+c3RhcnQgPSBzdGFydCArIHNpemU7CisJCW5ld2Jsb2NrLT5zaXplID0gcC0+c2l6ZSAtIHNpemU7CisJCW5ld2Jsb2NrLT5maWxwID0gTlVMTDsKKwkJbmV3YmxvY2stPm5leHQgPSBwLT5uZXh0OworCQluZXdibG9jay0+cHJldiA9IHA7CisJCXAtPm5leHQtPnByZXYgPSBuZXdibG9jazsKKwkJcC0+bmV4dCA9IG5ld2Jsb2NrOworCQlwLT5zaXplID0gc2l6ZTsKKwl9CisKKyBvdXQ6CisJLyogT3VyIGJsb2NrIGlzIGluIHRoZSBtaWRkbGUgKi8KKwlwLT5maWxwID0gZmlscDsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKmFsbG9jX2Jsb2NrKCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwLCBpbnQgc2l6ZSwgCisJCQkJICAgICAgaW50IGFsaWduMiwgRFJNRklMRSBmaWxwICkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCWludCBtYXNrID0gKDEgPDwgYWxpZ24yKS0xOworCisJbGlzdF9mb3JfZWFjaChwLCBoZWFwKSB7CisJCWludCBzdGFydCA9IChwLT5zdGFydCArIG1hc2spICYgfm1hc2s7CisJCWlmIChwLT5maWxwID09IDAgJiYgc3RhcnQgKyBzaXplIDw9IHAtPnN0YXJ0ICsgcC0+c2l6ZSkKKwkJCXJldHVybiBzcGxpdF9ibG9jayggcCwgc3RhcnQsIHNpemUsIGZpbHAgKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKmZpbmRfYmxvY2soIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXAsIGludCBzdGFydCApCit7CisJc3RydWN0IG1lbV9ibG9jayAqcDsKKworCWxpc3RfZm9yX2VhY2gocCwgaGVhcCkKKwkJaWYgKHAtPnN0YXJ0ID09IHN0YXJ0KQorCQkJcmV0dXJuIHA7CisKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCBmcmVlX2Jsb2NrKCBzdHJ1Y3QgbWVtX2Jsb2NrICpwICkKK3sKKwlwLT5maWxwID0gTlVMTDsKKworCS8qIEFzc3VtZXMgYSBzaW5nbGUgY29udGlndW91cyByYW5nZS4gIE5lZWRzIGEgc3BlY2lhbCBmaWxwIGluCisJICogJ2hlYXAnIHRvIHN0b3AgaXQgYmVpbmcgc3Vic3VtZWQuCisJICovCisJaWYgKHAtPm5leHQtPmZpbHAgPT0gMCkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpxID0gcC0+bmV4dDsKKwkJcC0+c2l6ZSArPSBxLT5zaXplOworCQlwLT5uZXh0ID0gcS0+bmV4dDsKKwkJcC0+bmV4dC0+cHJldiA9IHA7CisJCWRybV9mcmVlKHEsIHNpemVvZigqcSksIERSTV9NRU1fQlVGUyApOworCX0KKworCWlmIChwLT5wcmV2LT5maWxwID09IDApIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHAtPnByZXY7CisJCXEtPnNpemUgKz0gcC0+c2l6ZTsKKwkJcS0+bmV4dCA9IHAtPm5leHQ7CisJCXEtPm5leHQtPnByZXYgPSBxOworCQlkcm1fZnJlZShwLCBzaXplb2YoKnEpLCBEUk1fTUVNX0JVRlMgKTsKKwl9Cit9CisKKy8qIEluaXRpYWxpemUuICBIb3cgdG8gY2hlY2sgZm9yIGFuIHVuaW5pdGlhbGl6ZWQgaGVhcD8KKyAqLworc3RhdGljIGludCBpbml0X2hlYXAoc3RydWN0IG1lbV9ibG9jayAqKmhlYXAsIGludCBzdGFydCwgaW50IHNpemUpCit7CisJc3RydWN0IG1lbV9ibG9jayAqYmxvY2tzID0gZHJtX2FsbG9jKHNpemVvZigqYmxvY2tzKSwgRFJNX01FTV9CVUZTICk7CisKKwlpZiAoIWJsb2NrcykgCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCisJKmhlYXAgPSBkcm1fYWxsb2Moc2l6ZW9mKCoqaGVhcCksIERSTV9NRU1fQlVGUyApOworCWlmICghKmhlYXApIHsKKwkJZHJtX2ZyZWUoIGJsb2Nrcywgc2l6ZW9mKCpibG9ja3MpLCBEUk1fTUVNX0JVRlMgKTsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisKKwlibG9ja3MtPnN0YXJ0ID0gc3RhcnQ7CisJYmxvY2tzLT5zaXplID0gc2l6ZTsKKwlibG9ja3MtPmZpbHAgPSBOVUxMOworCWJsb2Nrcy0+bmV4dCA9IGJsb2Nrcy0+cHJldiA9ICpoZWFwOworCisJbWVtc2V0KCAqaGVhcCwgMCwgc2l6ZW9mKCoqaGVhcCkgKTsKKwkoKmhlYXApLT5maWxwID0gKERSTUZJTEUpIC0xOworCSgqaGVhcCktPm5leHQgPSAoKmhlYXApLT5wcmV2ID0gYmxvY2tzOworCXJldHVybiAwOworfQorCisKKy8qIEZyZWUgYWxsIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbGVhc2luZyBmaWxlLgorICovCit2b2lkIHJhZGVvbl9tZW1fcmVsZWFzZSggRFJNRklMRSBmaWxwLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwICkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCisJaWYgKCFoZWFwIHx8ICFoZWFwLT5uZXh0KQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoKHAsIGhlYXApIHsKKwkJaWYgKHAtPmZpbHAgPT0gZmlscCkgCisJCQlwLT5maWxwID0gTlVMTDsKKwl9CisKKwkvKiBBc3N1bWVzIGEgc2luZ2xlIGNvbnRpZ3VvdXMgcmFuZ2UuICBOZWVkcyBhIHNwZWNpYWwgZmlscCBpbgorCSAqICdoZWFwJyB0byBzdG9wIGl0IGJlaW5nIHN1YnN1bWVkLgorCSAqLworCWxpc3RfZm9yX2VhY2gocCwgaGVhcCkgeworCQl3aGlsZSAocC0+ZmlscCA9PSAwICYmIHAtPm5leHQtPmZpbHAgPT0gMCkgeworCQkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHAtPm5leHQ7CisJCQlwLT5zaXplICs9IHEtPnNpemU7CisJCQlwLT5uZXh0ID0gcS0+bmV4dDsKKwkJCXAtPm5leHQtPnByZXYgPSBwOworCQkJZHJtX2ZyZWUocSwgc2l6ZW9mKCpxKSxEUk1fTUVNX0RSSVZFUik7CisJCX0KKwl9Cit9CisKKy8qIFNodXRkb3duLgorICovCit2b2lkIHJhZGVvbl9tZW1fdGFrZWRvd24oIHN0cnVjdCBtZW1fYmxvY2sgKipoZWFwICkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCQorCWlmICghKmhlYXApCisJCXJldHVybjsKKworCWZvciAocCA9ICgqaGVhcCktPm5leHQgOyBwICE9ICpoZWFwIDsgKSB7CisJCXN0cnVjdCBtZW1fYmxvY2sgKnEgPSBwOworCQlwID0gcC0+bmV4dDsKKwkJZHJtX2ZyZWUocSwgc2l6ZW9mKCpxKSxEUk1fTUVNX0RSSVZFUik7CisJfQorCisJZHJtX2ZyZWUoICpoZWFwLCBzaXplb2YoKipoZWFwKSxEUk1fTUVNX0RSSVZFUiApOworCSpoZWFwID0gTlVMTDsKK30KKworCisKKy8qIElPQ1RMIEhBTkRMRVJTICovCisKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Jsb2NrICoqZ2V0X2hlYXAoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkgICBpbnQgcmVnaW9uICkKK3sKKwlzd2l0Y2goIHJlZ2lvbiApIHsKKwljYXNlIFJBREVPTl9NRU1fUkVHSU9OX0dBUlQ6CisgCQlyZXR1cm4gJmRldl9wcml2LT5nYXJ0X2hlYXA7IAorCWNhc2UgUkFERU9OX01FTV9SRUdJT05fRkI6CisJCXJldHVybiAmZGV2X3ByaXYtPmZiX2hlYXA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitpbnQgcmFkZW9uX21lbV9hbGxvYyggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX21lbV9hbGxvY190IGFsbG9jOworCXN0cnVjdCBtZW1fYmxvY2sgKmJsb2NrLCAqKmhlYXA7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggYWxsb2MsIChkcm1fcmFkZW9uX21lbV9hbGxvY190IF9fdXNlciAqKWRhdGEsCisJCQkJICBzaXplb2YoYWxsb2MpICk7CisKKwloZWFwID0gZ2V0X2hlYXAoIGRldl9wcml2LCBhbGxvYy5yZWdpb24gKTsKKwlpZiAoIWhlYXAgfHwgISpoZWFwKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQorCS8qIE1ha2UgdGhpbmdzIGVhc2llciBvbiBvdXJzZWx2ZXM6IGFsbCBhbGxvY2F0aW9ucyBhdCBsZWFzdAorCSAqIDRrIGFsaWduZWQuCisJICovCisJaWYgKGFsbG9jLmFsaWdubWVudCA8IDEyKQorCQlhbGxvYy5hbGlnbm1lbnQgPSAxMjsKKworCWJsb2NrID0gYWxsb2NfYmxvY2soICpoZWFwLCBhbGxvYy5zaXplLCBhbGxvYy5hbGlnbm1lbnQsCisJCQkgICAgIGZpbHAgKTsKKworCWlmICghYmxvY2spIAorCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCisJaWYgKCBEUk1fQ09QWV9UT19VU0VSKCBhbGxvYy5yZWdpb25fb2Zmc2V0LCAmYmxvY2stPnN0YXJ0LCAKKwkJCSAgICAgICBzaXplb2YoaW50KSApICkgeworCQlEUk1fRVJST1IoICJjb3B5X3RvX3VzZXJcbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKworCitpbnQgcmFkZW9uX21lbV9mcmVlKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fbWVtX2ZyZWVfdCBtZW1mcmVlOworCXN0cnVjdCBtZW1fYmxvY2sgKmJsb2NrLCAqKmhlYXA7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggbWVtZnJlZSwgKGRybV9yYWRlb25fbWVtX2ZyZWVfdCBfX3VzZXIgKilkYXRhLAorCQkJCSAgc2l6ZW9mKG1lbWZyZWUpICk7CisKKwloZWFwID0gZ2V0X2hlYXAoIGRldl9wcml2LCBtZW1mcmVlLnJlZ2lvbiApOworCWlmICghaGVhcCB8fCAhKmhlYXApCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCisJYmxvY2sgPSBmaW5kX2Jsb2NrKCAqaGVhcCwgbWVtZnJlZS5yZWdpb25fb2Zmc2V0ICk7CisJaWYgKCFibG9jaykKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCWlmIChibG9jay0+ZmlscCAhPSBmaWxwKQorCQlyZXR1cm4gRFJNX0VSUihFUEVSTSk7CisKKwlmcmVlX2Jsb2NrKCBibG9jayApOwkKKwlyZXR1cm4gMDsKK30KKworaW50IHJhZGVvbl9tZW1faW5pdF9oZWFwKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fbWVtX2luaXRfaGVhcF90IGluaXRoZWFwOworCXN0cnVjdCBtZW1fYmxvY2sgKipoZWFwOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGluaXRoZWFwLCAoZHJtX3JhZGVvbl9tZW1faW5pdF9oZWFwX3QgX191c2VyICopZGF0YSwKKwkJCQkgIHNpemVvZihpbml0aGVhcCkgKTsKKworCWhlYXAgPSBnZXRfaGVhcCggZGV2X3ByaXYsIGluaXRoZWFwLnJlZ2lvbiApOworCWlmICghaGVhcCkgCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCisJaWYgKCpoZWFwKSB7CisJCURSTV9FUlJPUigiaGVhcCBhbHJlYWR5IGluaXRpYWxpemVkPyIpOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKwkJCisJcmV0dXJuIGluaXRfaGVhcCggaGVhcCwgaW5pdGhlYXAuc3RhcnQsIGluaXRoZWFwLnNpemUgKTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjc5ZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYwpAQCAtMCwwICsxLDMxMDIgQEAKKy8qIHJhZGVvbl9zdGF0ZS5jIC0tIFN0YXRlIHN1cHBvcnQgZm9yIFJhZGVvbiAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBGcmVtb250LCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiZHJtX3NhcmVhLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgY2xpZW50IHN0YXRlIGNoZWNraW5nIGFuZCBmaXh1cAorICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCQkJICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCQkJCQkgICAgIHUzMiAqb2Zmc2V0ICkgeworCXUzMiBvZmYgPSAqb2Zmc2V0OworCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CisKKwlpZiAoIG9mZiA+PSBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gJiYKKwkgICAgIG9mZiA8ICggZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgKyBkZXZfcHJpdi0+Z2FydF9zaXplICkgKQorCQlyZXR1cm4gMDsKKworCXJhZGVvbl9wcml2ID0gZmlscF9wcml2LT5kcml2ZXJfcHJpdjsKKwlvZmYgKz0gcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YTsKKworCURSTV9ERUJVRyggIm9mZnNldCBmaXhlZCB1cCB0byAweCV4XG4iLCBvZmYgKTsKKworCWlmICggb2ZmIDwgZGV2X3ByaXYtPmZiX2xvY2F0aW9uIHx8CisJICAgICBvZmYgPj0gKCBkZXZfcHJpdi0+Z2FydF92bV9zdGFydCArIGRldl9wcml2LT5nYXJ0X3NpemUgKSApCisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKworCSpvZmZzZXQgPSBvZmY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0cyggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCQkJICAgICAgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkJCQkJICAgICAgaW50IGlkLAorCQkJCQkJICAgICAgdTMyIF9fdXNlciAqZGF0YSApIHsKKwlzd2l0Y2ggKCBpZCApIHsKKworCWNhc2UgUkFERU9OX0VNSVRfUFBfTUlTQzoKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmZGF0YVsoIFJBREVPTl9SQjNEX0RFUFRIT0ZGU0VUCisJCQkJCQkJICAgIC0gUkFERU9OX1BQX01JU0MgKSAvIDRdICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIGRlcHRoIGJ1ZmZlciBvZmZzZXRcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkFERU9OX0VNSVRfUFBfQ05UTDoKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmZGF0YVsoIFJBREVPTl9SQjNEX0NPTE9ST0ZGU0VUCisJCQkJCQkJICAgIC0gUkFERU9OX1BQX0NOVEwgKSAvIDRdICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIGNvbG91ciBidWZmZXIgb2Zmc2V0XG4iICk7CisJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF8wOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzE6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMjoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF8zOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzQ6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfNToKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmZGF0YVswXSApICkgeworCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBSMjAwIHRleHR1cmUgb2Zmc2V0XG4iICk7CisJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzA6CisJY2FzZSBSQURFT05fRU1JVF9QUF9UWEZJTFRFUl8xOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMjoKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmZGF0YVsoIFJBREVPTl9QUF9UWE9GRlNFVF8wCisJCQkJCQkJICAgIC0gUkFERU9OX1BQX1RYRklMVEVSXzAgKSAvIDRdICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIFIxMDAgdGV4dHVyZSBvZmZzZXRcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMDoKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzE6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18yOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMzoKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzQ6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU181OiB7CisJCWludCBpOworCQlmb3IgKCBpID0gMDsgaSA8IDU7IGkrKyApIHsKKwkJCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkJICAgICZkYXRhW2ldICkgKSB7CisJCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBSMjAwIGN1YmljIHRleHR1cmUgb2Zmc2V0XG4iICk7CisJCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgUkFERU9OX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU19UMDoKKwljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDE6CisJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1QyOnsKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQkJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwKKwkJCQkJCQkJICBmaWxwX3ByaXYsCisJCQkJCQkJCSAgJmRhdGFbaV0pKSB7CisJCQkJCURSTV9FUlJPUgorCQkJCQkgICAgKCJJbnZhbGlkIFIxMDAgY3ViaWMgdGV4dHVyZSBvZmZzZXRcbiIpOworCQkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgUkFERU9OX0VNSVRfUkIzRF9DT0xPUlBJVENIOgorCWNhc2UgUkFERU9OX0VNSVRfUkVfTElORV9QQVRURVJOOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfTElORV9XSURUSDoKKwljYXNlIFJBREVPTl9FTUlUX1BQX0xVTV9NQVRSSVg6CisJY2FzZSBSQURFT05fRU1JVF9QUF9ST1RfTUFUUklYXzA6CisJY2FzZSBSQURFT05fRU1JVF9SQjNEX1NURU5DSUxSRUZNQVNLOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfVlBPUlRfWFNDQUxFOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfQ05UTDoKKwljYXNlIFJBREVPTl9FTUlUX1NFX0NOVExfU1RBVFVTOgorCWNhc2UgUkFERU9OX0VNSVRfUkVfTUlTQzoKKwljYXNlIFJBREVPTl9FTUlUX1BQX0JPUkRFUl9DT0xPUl8wOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzE6CisJY2FzZSBSQURFT05fRU1JVF9QUF9CT1JERVJfQ09MT1JfMjoKKwljYXNlIFJBREVPTl9FTUlUX1NFX1pCSUFTX0ZBQ1RPUjoKKwljYXNlIFJBREVPTl9FTUlUX1NFX1RDTF9PVVRQVVRfVlRYX0ZNVDoKKwljYXNlIFJBREVPTl9FTUlUX1NFX1RDTF9NQVRFUklBTF9FTU1JU1NJVkVfUkVEOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzA6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfMToKKwljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF8yOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzM6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNDoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF81OgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzY6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNzoKKwljYXNlIFIyMDBfRU1JVF9UQ0xfTElHSFRfTU9ERUxfQ1RMXzA6CisJY2FzZSBSMjAwX0VNSVRfVEZBQ1RPUl8wOgorCWNhc2UgUjIwMF9FTUlUX1ZUWF9GTVRfMDoKKwljYXNlIFIyMDBfRU1JVF9WQVBfQ1RMOgorCWNhc2UgUjIwMF9FTUlUX01BVFJJWF9TRUxFQ1RfMDoKKwljYXNlIFIyMDBfRU1JVF9URVhfUFJPQ19DVExfMjoKKwljYXNlIFIyMDBfRU1JVF9UQ0xfVUNQX1ZFUlRfQkxFTkRfQ1RMOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzA6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMToKKwljYXNlIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl8yOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzM6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfNDoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl81OgorCWNhc2UgUjIwMF9FTUlUX1ZURV9DTlRMOgorCWNhc2UgUjIwMF9FTUlUX09VVFBVVF9WVFhfQ09NUF9TRUw6CisJY2FzZSBSMjAwX0VNSVRfUFBfVEFNX0RFQlVHMzoKKwljYXNlIFIyMDBfRU1JVF9QUF9DTlRMX1g6CisJY2FzZSBSMjAwX0VNSVRfUkIzRF9ERVBUSFhZX09GRlNFVDoKKwljYXNlIFIyMDBfRU1JVF9SRV9BVVhfU0NJU1NPUl9DTlRMOgorCWNhc2UgUjIwMF9FTUlUX1JFX1NDSVNTT1JfVExfMDoKKwljYXNlIFIyMDBfRU1JVF9SRV9TQ0lTU09SX1RMXzE6CisJY2FzZSBSMjAwX0VNSVRfUkVfU0NJU1NPUl9UTF8yOgorCWNhc2UgUjIwMF9FTUlUX1NFX1ZBUF9DTlRMX1NUQVRVUzoKKwljYXNlIFIyMDBfRU1JVF9TRV9WVFhfU1RBVEVfQ05UTDoKKwljYXNlIFIyMDBfRU1JVF9SRV9QT0lOVFNJWkU6CisJY2FzZSBSMjAwX0VNSVRfVENMX0lOUFVUX1ZUWF9WRUNUT1JfQUREUl8wOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzA6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMToKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18yOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzM6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfNDoKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU181OgorCWNhc2UgUkFERU9OX0VNSVRfUFBfVEVYX1NJWkVfMDoKKwljYXNlIFJBREVPTl9FTUlUX1BQX1RFWF9TSVpFXzE6CisJY2FzZSBSQURFT05fRU1JVF9QUF9URVhfU0laRV8yOgorCWNhc2UgUjIwMF9FTUlUX1JCM0RfQkxFTkRDT0xPUjoKKwljYXNlIFIyMDBfRU1JVF9UQ0xfUE9JTlRfU1BSSVRFX0NOVEw6CisJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19GQUNFU18wOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMToKKwljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX0ZBQ0VTXzI6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFJJX1BFUkZfQ05UTDoKKwkJLyogVGhlc2UgcGFja2V0cyBkb24ndCBjb250YWluIG1lbW9yeSBvZmZzZXRzICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCAiVW5rbm93biBzdGF0ZSBwYWNrZXQgSUQgJWRcbiIsIGlkICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0MyggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCQkJICAgICAgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkJCQkJICAgICAgZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKmNtZGJ1ZiwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGludCAqY21kc3ogKSB7CisJdTMyICpjbWQgPSAodTMyICopIGNtZGJ1Zi0+YnVmOworCisJKmNtZHN6ID0gMiArICggKCBjbWRbMF0gJiBSQURFT05fQ1BfUEFDS0VUX0NPVU5UX01BU0sgKSA+PiAxNiApOworCisJaWYgKCAoIGNtZFswXSAmIDB4YzAwMDAwMDAgKSAhPSBSQURFT05fQ1BfUEFDS0VUMyApIHsKKwkJRFJNX0VSUk9SKCAiTm90IGEgdHlwZSAzIHBhY2tldFxuIiApOworCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJfQorCisJaWYgKCA0ICogKmNtZHN6ID4gY21kYnVmLT5idWZzeiApIHsKKwkJRFJNX0VSUk9SKCAiUGFja2V0IHNpemUgbGFyZ2VyIHRoYW4gc2l6ZSBvZiBkYXRhIHByb3ZpZGVkXG4iICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwkvKiBDaGVjayBjbGllbnQgc3RhdGUgYW5kIGZpeCBpdCB1cCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoIGNtZFswXSAmIDB4ODAwMCApIHsgLyogTVNCIG9mIG9wY29kZTogbmV4dCBEV09SRCBHVUlfQ05UTCAqLworCQl1MzIgb2Zmc2V0OworCisJCWlmICggY21kWzFdICYgKCBSQURFT05fR01DX1NSQ19QSVRDSF9PRkZTRVRfQ05UTAorCQkJICAgICAgfCBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCApICkgeworCQkJb2Zmc2V0ID0gY21kWzJdIDw8IDEwOworCQkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwgJm9mZnNldCApICkgeworCQkJCURSTV9FUlJPUiggIkludmFsaWQgZmlyc3QgcGFja2V0IG9mZnNldFxuIiApOworCQkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJCX0KKwkJCWNtZFsyXSA9ICggY21kWzJdICYgMHhmZmMwMDAwMCApIHwgb2Zmc2V0ID4+IDEwOworCQl9CisKKwkJaWYgKCAoIGNtZFsxXSAmIFJBREVPTl9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMICkgJiYKKwkJICAgICAoIGNtZFsxXSAmIFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMICkgKSB7CisJCQlvZmZzZXQgPSBjbWRbM10gPDwgMTA7CisJCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LCAmb2Zmc2V0ICkgKSB7CisJCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBzZWNvbmQgcGFja2V0IG9mZnNldFxuIiApOworCQkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJCX0KKwkJCWNtZFszXSA9ICggY21kWzNdICYgMHhmZmMwMDAwMCApIHwgb2Zmc2V0ID4+IDEwOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ1AgaGFyZHdhcmUgc3RhdGUgcHJvZ3JhbW1pbmcgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZCByYWRlb25fZW1pdF9jbGlwX3JlY3QoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkJICBkcm1fY2xpcF9yZWN0X3QgKmJveCApCit7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoICIgICBib3g6ICB4MT0lZCB5MT0lZCAgeDI9JWQgeTI9JWRcbiIsCisJCSAgIGJveC0+eDEsIGJveC0+eTEsIGJveC0+eDIsIGJveC0+eTIgKTsKKworCUJFR0lOX1JJTkcoIDQgKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JFX1RPUF9MRUZULCAwICkgKTsKKwlPVVRfUklORyggKGJveC0+eTEgPDwgMTYpIHwgYm94LT54MSApOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkVfV0lEVEhfSEVJR0hULCAwICkgKTsKKwlPVVRfUklORyggKChib3gtPnkyIC0gMSkgPDwgMTYpIHwgKGJveC0+eDIgLSAxKSApOworCUFEVkFOQ0VfUklORygpOworfQorCisvKiBFbWl0IDEuMSBzdGF0ZQorICovCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3N0YXRlKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCQkgICAgICBkcm1fcmFkZW9uX2NvbnRleHRfcmVnc190ICpjdHgsCisJCQkgICAgICBkcm1fcmFkZW9uX3RleHR1cmVfcmVnc190ICp0ZXgsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZGlydHkgKQoreworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggImRpcnR5PTB4JTA4eFxuIiwgZGlydHkgKTsKKworCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX0NPTlRFWFQgKSB7CisJCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkgICAgJmN0eC0+cmIzZF9kZXB0aG9mZnNldCApICkgeworCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBkZXB0aCBidWZmZXIgb2Zmc2V0XG4iICk7CisJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCX0KKworCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZjdHgtPnJiM2RfY29sb3JvZmZzZXQgKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgZGVwdGggYnVmZmVyIG9mZnNldFxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisKKwkJQkVHSU5fUklORyggMTQgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9NSVNDLCA2ICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cHBfbWlzYyApOworCQlPVVRfUklORyggY3R4LT5wcF9mb2dfY29sb3IgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmVfc29saWRfY29sb3IgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF9ibGVuZGNudGwgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF9kZXB0aG9mZnNldCApOworCQlPVVRfUklORyggY3R4LT5yYjNkX2RlcHRocGl0Y2ggKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF96c3RlbmNpbGNudGwgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9DTlRMLCAyICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cHBfY250bCApOworCQlPVVRfUklORyggY3R4LT5yYjNkX2NudGwgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF9jb2xvcm9mZnNldCApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JCM0RfQ09MT1JQSVRDSCwgMCApICk7CisJCU9VVF9SSU5HKCBjdHgtPnJiM2RfY29sb3JwaXRjaCApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9WRVJURk1UICkgeworCQlCRUdJTl9SSU5HKCAyICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfQ09PUkRfRk1ULCAwICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+c2VfY29vcmRfZm10ICk7CisJCUFEVkFOQ0VfUklORygpOworCX0KKworCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX0xJTkUgKSB7CisJCUJFR0lOX1JJTkcoIDUgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SRV9MSU5FX1BBVFRFUk4sIDEgKSApOworCQlPVVRfUklORyggY3R4LT5yZV9saW5lX3BhdHRlcm4gKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmVfbGluZV9zdGF0ZSApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX0xJTkVfV0lEVEgsIDAgKSApOworCQlPVVRfUklORyggY3R4LT5zZV9saW5lX3dpZHRoICk7CisJCUFEVkFOQ0VfUklORygpOworCX0KKworCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX0JVTVBNQVAgKSB7CisJCUJFR0lOX1JJTkcoIDUgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9MVU1fTUFUUklYLCAwICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cHBfbHVtX21hdHJpeCApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX1JPVF9NQVRSSVhfMCwgMSApICk7CisJCU9VVF9SSU5HKCBjdHgtPnBwX3JvdF9tYXRyaXhfMCApOworCQlPVVRfUklORyggY3R4LT5wcF9yb3RfbWF0cml4XzEgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfTUFTS1MgKSB7CisJCUJFR0lOX1JJTkcoIDQgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLCAyICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF9zdGVuY2lscmVmbWFzayApOworCQlPVVRfUklORyggY3R4LT5yYjNkX3JvcGNudGwgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF9wbGFuZW1hc2sgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfVklFV1BPUlQgKSB7CisJCUJFR0lOX1JJTkcoIDcgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TRV9WUE9SVF9YU0NBTEUsIDUgKSApOworCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF94c2NhbGUgKTsKKwkJT1VUX1JJTkcoIGN0eC0+c2VfdnBvcnRfeG9mZnNldCApOworCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF95c2NhbGUgKTsKKwkJT1VUX1JJTkcoIGN0eC0+c2VfdnBvcnRfeW9mZnNldCApOworCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF96c2NhbGUgKTsKKwkJT1VUX1JJTkcoIGN0eC0+c2VfdnBvcnRfem9mZnNldCApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9TRVRVUCApIHsKKwkJQkVHSU5fUklORyggNCApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX0NOVEwsIDAgKSApOworCQlPVVRfUklORyggY3R4LT5zZV9jbnRsICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfQ05UTF9TVEFUVVMsIDAgKSApOworCQlPVVRfUklORyggY3R4LT5zZV9jbnRsX3N0YXR1cyApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9NSVNDICkgeworCQlCRUdJTl9SSU5HKCAyICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkVfTUlTQywgMCApICk7CisJCU9VVF9SSU5HKCBjdHgtPnJlX21pc2MgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfVEVYMCApIHsKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmdGV4WzBdLnBwX3R4b2Zmc2V0ICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIHRleHR1cmUgb2Zmc2V0IGZvciB1bml0IDBcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCisJCUJFR0lOX1JJTkcoIDkgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9UWEZJTFRFUl8wLCA1ICkgKTsKKwkJT1VUX1JJTkcoIHRleFswXS5wcF90eGZpbHRlciApOworCQlPVVRfUklORyggdGV4WzBdLnBwX3R4Zm9ybWF0ICk7CisJCU9VVF9SSU5HKCB0ZXhbMF0ucHBfdHhvZmZzZXQgKTsKKwkJT1VUX1JJTkcoIHRleFswXS5wcF90eGNibGVuZCApOworCQlPVVRfUklORyggdGV4WzBdLnBwX3R4YWJsZW5kICk7CisJCU9VVF9SSU5HKCB0ZXhbMF0ucHBfdGZhY3RvciApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8wLCAwICkgKTsKKwkJT1VUX1JJTkcoIHRleFswXS5wcF9ib3JkZXJfY29sb3IgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfVEVYMSApIHsKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmdGV4WzFdLnBwX3R4b2Zmc2V0ICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIHRleHR1cmUgb2Zmc2V0IGZvciB1bml0IDFcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCisJCUJFR0lOX1JJTkcoIDkgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9UWEZJTFRFUl8xLCA1ICkgKTsKKwkJT1VUX1JJTkcoIHRleFsxXS5wcF90eGZpbHRlciApOworCQlPVVRfUklORyggdGV4WzFdLnBwX3R4Zm9ybWF0ICk7CisJCU9VVF9SSU5HKCB0ZXhbMV0ucHBfdHhvZmZzZXQgKTsKKwkJT1VUX1JJTkcoIHRleFsxXS5wcF90eGNibGVuZCApOworCQlPVVRfUklORyggdGV4WzFdLnBwX3R4YWJsZW5kICk7CisJCU9VVF9SSU5HKCB0ZXhbMV0ucHBfdGZhY3RvciApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8xLCAwICkgKTsKKwkJT1VUX1JJTkcoIHRleFsxXS5wcF9ib3JkZXJfY29sb3IgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfVEVYMiApIHsKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmdGV4WzJdLnBwX3R4b2Zmc2V0ICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIHRleHR1cmUgb2Zmc2V0IGZvciB1bml0IDJcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCisJCUJFR0lOX1JJTkcoIDkgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9UWEZJTFRFUl8yLCA1ICkgKTsKKwkJT1VUX1JJTkcoIHRleFsyXS5wcF90eGZpbHRlciApOworCQlPVVRfUklORyggdGV4WzJdLnBwX3R4Zm9ybWF0ICk7CisJCU9VVF9SSU5HKCB0ZXhbMl0ucHBfdHhvZmZzZXQgKTsKKwkJT1VUX1JJTkcoIHRleFsyXS5wcF90eGNibGVuZCApOworCQlPVVRfUklORyggdGV4WzJdLnBwX3R4YWJsZW5kICk7CisJCU9VVF9SSU5HKCB0ZXhbMl0ucHBfdGZhY3RvciApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8yLCAwICkgKTsKKwkJT1VUX1JJTkcoIHRleFsyXS5wcF9ib3JkZXJfY29sb3IgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEVtaXQgMS4yIHN0YXRlCisgKi8KK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfc3RhdGUyKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgICAgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkJICAgICAgIGRybV9yYWRlb25fc3RhdGVfdCAqc3RhdGUgKQoreworCVJJTkdfTE9DQUxTOworCisJaWYgKHN0YXRlLT5kaXJ0eSAmIFJBREVPTl9VUExPQURfWkJJQVMpIHsKKwkJQkVHSU5fUklORyggMyApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX1pCSUFTX0ZBQ1RPUiwgMSApICk7CisJCU9VVF9SSU5HKCBzdGF0ZS0+Y29udGV4dDIuc2VfemJpYXNfZmFjdG9yICk7IAorCQlPVVRfUklORyggc3RhdGUtPmNvbnRleHQyLnNlX3piaWFzX2NvbnN0YW50ICk7IAorCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlyZXR1cm4gcmFkZW9uX2VtaXRfc3RhdGUoIGRldl9wcml2LCBmaWxwX3ByaXYsICZzdGF0ZS0+Y29udGV4dCwKKwkJCSAgIHN0YXRlLT50ZXgsIHN0YXRlLT5kaXJ0eSApOworfQorCisvKiBOZXcgKDEuMykgc3RhdGUgbWVjaGFuaXNtLiAgMyBjb21tYW5kcyAocGFja2V0LCBzY2FsYXIsIHZlY3RvcikgaW4KKyAqIDEuMyBjbWRidWZmZXJzIGFsbG93IGFsbCBwcmV2aW91cyBzdGF0ZSB0byBiZSB1cGRhdGVkIGFzIHdlbGwgYXMKKyAqIHRoZSB0Y2wgc2NhbGFyIGFuZCB2ZWN0b3IgYXJlYXMuICAKKyAqLworc3RhdGljIHN0cnVjdCB7IAorCWludCBzdGFydDsgCisJaW50IGxlbjsgCisJY29uc3QgY2hhciAqbmFtZTsKK30gcGFja2V0W1JBREVPTl9NQVhfU1RBVEVfUEFDS0VUU10gPSB7CisJeyBSQURFT05fUFBfTUlTQyw3LCJSQURFT05fUFBfTUlTQyIgfSwKKwl7IFJBREVPTl9QUF9DTlRMLDMsIlJBREVPTl9QUF9DTlRMIiB9LAorCXsgUkFERU9OX1JCM0RfQ09MT1JQSVRDSCwxLCJSQURFT05fUkIzRF9DT0xPUlBJVENIIiB9LAorCXsgUkFERU9OX1JFX0xJTkVfUEFUVEVSTiwyLCJSQURFT05fUkVfTElORV9QQVRURVJOIiB9LAorCXsgUkFERU9OX1NFX0xJTkVfV0lEVEgsMSwiUkFERU9OX1NFX0xJTkVfV0lEVEgiIH0sCisJeyBSQURFT05fUFBfTFVNX01BVFJJWCwxLCJSQURFT05fUFBfTFVNX01BVFJJWCIgfSwKKwl7IFJBREVPTl9QUF9ST1RfTUFUUklYXzAsMiwiUkFERU9OX1BQX1JPVF9NQVRSSVhfMCIgfSwKKwl7IFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLDMsIlJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLIiB9LAorCXsgUkFERU9OX1NFX1ZQT1JUX1hTQ0FMRSw2LCJSQURFT05fU0VfVlBPUlRfWFNDQUxFIiB9LAorCXsgUkFERU9OX1NFX0NOVEwsMiwiUkFERU9OX1NFX0NOVEwiIH0sCisJeyBSQURFT05fU0VfQ05UTF9TVEFUVVMsMSwiUkFERU9OX1NFX0NOVExfU1RBVFVTIiB9LAorCXsgUkFERU9OX1JFX01JU0MsMSwiUkFERU9OX1JFX01JU0MiIH0sCisJeyBSQURFT05fUFBfVFhGSUxURVJfMCw2LCJSQURFT05fUFBfVFhGSUxURVJfMCIgfSwKKwl7IFJBREVPTl9QUF9CT1JERVJfQ09MT1JfMCwxLCJSQURFT05fUFBfQk9SREVSX0NPTE9SXzAiIH0sCisJeyBSQURFT05fUFBfVFhGSUxURVJfMSw2LCJSQURFT05fUFBfVFhGSUxURVJfMSIgfSwKKwl7IFJBREVPTl9QUF9CT1JERVJfQ09MT1JfMSwxLCJSQURFT05fUFBfQk9SREVSX0NPTE9SXzEiIH0sCisJeyBSQURFT05fUFBfVFhGSUxURVJfMiw2LCJSQURFT05fUFBfVFhGSUxURVJfMiIgfSwKKwl7IFJBREVPTl9QUF9CT1JERVJfQ09MT1JfMiwxLCJSQURFT05fUFBfQk9SREVSX0NPTE9SXzIiIH0sCisJeyBSQURFT05fU0VfWkJJQVNfRkFDVE9SLDIsIlJBREVPTl9TRV9aQklBU19GQUNUT1IiIH0sCisJeyBSQURFT05fU0VfVENMX09VVFBVVF9WVFhfRk1ULDExLCJSQURFT05fU0VfVENMX09VVFBVVF9WVFhfRk1UIiB9LAorCXsgUkFERU9OX1NFX1RDTF9NQVRFUklBTF9FTU1JU1NJVkVfUkVELDE3LCJSQURFT05fU0VfVENMX01BVEVSSUFMX0VNTUlTU0lWRV9SRUQiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzAsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzAiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzEsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzEiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzIsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzIiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzMsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzMiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzQsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzQiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzUsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzUiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzYsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzYiIH0sCisJeyBSMjAwX1BQX1RYQ0JMRU5EXzcsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzciIH0sCisJeyBSMjAwX1NFX1RDTF9MSUdIVF9NT0RFTF9DVExfMCwgNiwgIlIyMDBfU0VfVENMX0xJR0hUX01PREVMX0NUTF8wIiB9LAorCXsgUjIwMF9QUF9URkFDVE9SXzAsIDYsICJSMjAwX1BQX1RGQUNUT1JfMCIgfSwKKwl7IFIyMDBfU0VfVlRYX0ZNVF8wLCA0LCAiUjIwMF9TRV9WVFhfRk1UXzAiIH0sCisJeyBSMjAwX1NFX1ZBUF9DTlRMLCAxLCAiUjIwMF9TRV9WQVBfQ05UTCIgfSwKKwl7IFIyMDBfU0VfVENMX01BVFJJWF9TRUxfMCwgNSwgIlIyMDBfU0VfVENMX01BVFJJWF9TRUxfMCIgfSwKKwl7IFIyMDBfU0VfVENMX1RFWF9QUk9DX0NUTF8yLCA1LCAiUjIwMF9TRV9UQ0xfVEVYX1BST0NfQ1RMXzIiIH0sCisJeyBSMjAwX1NFX1RDTF9VQ1BfVkVSVF9CTEVORF9DVEwsIDEsICJSMjAwX1NFX1RDTF9VQ1BfVkVSVF9CTEVORF9DVEwiIH0sCisJeyBSMjAwX1BQX1RYRklMVEVSXzAsIDYsICJSMjAwX1BQX1RYRklMVEVSXzAiIH0sCisJeyBSMjAwX1BQX1RYRklMVEVSXzEsIDYsICJSMjAwX1BQX1RYRklMVEVSXzEiIH0sCisJeyBSMjAwX1BQX1RYRklMVEVSXzIsIDYsICJSMjAwX1BQX1RYRklMVEVSXzIiIH0sCisJeyBSMjAwX1BQX1RYRklMVEVSXzMsIDYsICJSMjAwX1BQX1RYRklMVEVSXzMiIH0sCisJeyBSMjAwX1BQX1RYRklMVEVSXzQsIDYsICJSMjAwX1BQX1RYRklMVEVSXzQiIH0sCisJeyBSMjAwX1BQX1RYRklMVEVSXzUsIDYsICJSMjAwX1BQX1RYRklMVEVSXzUiIH0sCisJeyBSMjAwX1BQX1RYT0ZGU0VUXzAsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzAiIH0sCisJeyBSMjAwX1BQX1RYT0ZGU0VUXzEsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzEiIH0sCisJeyBSMjAwX1BQX1RYT0ZGU0VUXzIsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzIiIH0sCisJeyBSMjAwX1BQX1RYT0ZGU0VUXzMsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzMiIH0sCisJeyBSMjAwX1BQX1RYT0ZGU0VUXzQsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzQiIH0sCisJeyBSMjAwX1BQX1RYT0ZGU0VUXzUsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzUiIH0sCisJeyBSMjAwX1NFX1ZURV9DTlRMLCAxLCAiUjIwMF9TRV9WVEVfQ05UTCIgfSwKKwl7IFIyMDBfU0VfVENMX09VVFBVVF9WVFhfQ09NUF9TRUwsIDEsICJSMjAwX1NFX1RDTF9PVVRQVVRfVlRYX0NPTVBfU0VMIiB9LAorCXsgUjIwMF9QUF9UQU1fREVCVUczLCAxLCAiUjIwMF9QUF9UQU1fREVCVUczIiB9LAorCXsgUjIwMF9QUF9DTlRMX1gsIDEsICJSMjAwX1BQX0NOVExfWCIgfSwgCisJeyBSMjAwX1JCM0RfREVQVEhYWV9PRkZTRVQsIDEsICJSMjAwX1JCM0RfREVQVEhYWV9PRkZTRVQiIH0sIAorCXsgUjIwMF9SRV9BVVhfU0NJU1NPUl9DTlRMLCAxLCAiUjIwMF9SRV9BVVhfU0NJU1NPUl9DTlRMIiB9LCAKKwl7IFIyMDBfUkVfU0NJU1NPUl9UTF8wLCAyLCAiUjIwMF9SRV9TQ0lTU09SX1RMXzAiIH0sIAorCXsgUjIwMF9SRV9TQ0lTU09SX1RMXzEsIDIsICJSMjAwX1JFX1NDSVNTT1JfVExfMSIgfSwgCisJeyBSMjAwX1JFX1NDSVNTT1JfVExfMiwgMiwgIlIyMDBfUkVfU0NJU1NPUl9UTF8yIiB9LCAKKwl7IFIyMDBfU0VfVkFQX0NOVExfU1RBVFVTLCAxLCAiUjIwMF9TRV9WQVBfQ05UTF9TVEFUVVMiIH0sIAorCXsgUjIwMF9TRV9WVFhfU1RBVEVfQ05UTCwgMSwgIlIyMDBfU0VfVlRYX1NUQVRFX0NOVEwiIH0sIAorCXsgUjIwMF9SRV9QT0lOVFNJWkUsIDEsICJSMjAwX1JFX1BPSU5UU0laRSIgfSwgCisJeyBSMjAwX1NFX1RDTF9JTlBVVF9WVFhfVkVDVE9SX0FERFJfMCwgNCwgIlIyMDBfU0VfVENMX0lOUFVUX1ZUWF9WRUNUT1JfQUREUl8wIiB9LAorCXsgUjIwMF9QUF9DVUJJQ19GQUNFU18wLCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU18wIiB9LCAvKiA2MSAqLworCXsgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMCwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzAiIH0sIC8qIDYyICovCisJeyBSMjAwX1BQX0NVQklDX0ZBQ0VTXzEsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzEiIH0sCisJeyBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8xLCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMSIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfRkFDRVNfMiwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfMiIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzIsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8yIiB9LAorCXsgUjIwMF9QUF9DVUJJQ19GQUNFU18zLCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU18zIiB9LAorCXsgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMywgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzMiIH0sCisJeyBSMjAwX1BQX0NVQklDX0ZBQ0VTXzQsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzQiIH0sCisJeyBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV80LCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNCIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfRkFDRVNfNSwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfNSIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzUsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV81IiB9LAorCXsgUkFERU9OX1BQX1RFWF9TSVpFXzAsIDIsICJSQURFT05fUFBfVEVYX1NJWkVfMCIgfSwKKwl7IFJBREVPTl9QUF9URVhfU0laRV8xLCAyLCAiUkFERU9OX1BQX1RFWF9TSVpFXzEiIH0sCisJeyBSQURFT05fUFBfVEVYX1NJWkVfMiwgMiwgIlJBREVPTl9QUF9URVhfU0laRV8yIiB9LAorCXsgUjIwMF9SQjNEX0JMRU5EQ09MT1IsIDMsICJSMjAwX1JCM0RfQkxFTkRDT0xPUiIgfSwKKwl7IFIyMDBfU0VfVENMX1BPSU5UX1NQUklURV9DTlRMLCAxLCAiUjIwMF9TRV9UQ0xfUE9JTlRfU1BSSVRFX0NOVEwiIH0sCisJeyBSQURFT05fUFBfQ1VCSUNfRkFDRVNfMCwgMSwgIlJBREVPTl9QUF9DVUJJQ19GQUNFU18wIn0sCisJeyBSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QwXzAsIDUsICJSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QwXzAifSwKKwl7IFJBREVPTl9QUF9DVUJJQ19GQUNFU18xLCAxLCAiUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzEifSwKKwl7IFJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDFfMCwgNSwgIlJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDFfMCJ9LAorCXsgUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzIsIDEsICJSQURFT05fUFBfQ1VCSUNfRkFDRVNfMiJ9LAorCXsgUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMl8wLCA1LCAiUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMl8wIn0sCisJeyBSMjAwX1BQX1RSSV9QRVJGLCAyLCAiUjIwMF9QUF9UUklfUEVSRiJ9LAorfTsKKworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgcmFkZW9uX2NsZWFyX2JveCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJICAgICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCisJCQkgICAgICBpbnQgciwgaW50IGcsIGludCBiICkKK3sKKwl1MzIgY29sb3I7CisJUklOR19MT0NBTFM7CisKKwl4ICs9IGRldl9wcml2LT5zYXJlYV9wcml2LT5ib3hlc1swXS54MTsKKwl5ICs9IGRldl9wcml2LT5zYXJlYV9wcml2LT5ib3hlc1swXS55MTsKKworCXN3aXRjaCAoIGRldl9wcml2LT5jb2xvcl9mbXQgKSB7CisJY2FzZSBSQURFT05fQ09MT1JfRk9STUFUX1JHQjU2NToKKwkJY29sb3IgPSAoKChyICYgMHhmOCkgPDwgOCkgfAorCQkJICgoZyAmIDB4ZmMpIDw8IDMpIHwKKwkJCSAoKGIgJiAweGY4KSA+PiAzKSk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX0NPTE9SX0ZPUk1BVF9BUkdCODg4ODoKKwlkZWZhdWx0OgorCQljb2xvciA9ICgoKDB4ZmYpIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8ICA4KSB8IGIpOworCQlicmVhazsKKwl9CisKKwlCRUdJTl9SSU5HKCA0ICk7CisJUkFERU9OX1dBSVRfVU5USUxfM0RfSURMRSgpOwkJCisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9EUF9XUklURV9NQVNLLCAwICkgKTsKKwlPVVRfUklORyggMHhmZmZmZmZmZiApOworCUFEVkFOQ0VfUklORygpOworCisJQkVHSU5fUklORyggNiApOworCisJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl9DTlRMX1BBSU5UX01VTFRJLCA0ICkgKTsKKwlPVVRfUklORyggUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkgIFJBREVPTl9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAorCQkgIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKKwkJICBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCSAgUkFERU9OX1JPUDNfUCB8CisJCSAgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTICk7CisKKyAJaWYgKCBkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyAmJiBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDEgKSB7IAorCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCApOworIAl9IGVsc2UgewkgCisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQgKTsKKyAJfSAKKworCU9VVF9SSU5HKCBjb2xvciApOworCisJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9wZXJmb3JtYW5jZV9ib3hlcyggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwkvKiBDb2xsYXBzZSB2YXJpb3VzIHRoaW5ncyBpbnRvIGEgd2FpdCBmbGFnIC0tIHRyeWluZyB0bworCSAqIGd1ZXNzIGlmIHVzZXJzcGFzZSBzbGVwdCAtLSBiZXR0ZXIganVzdCB0byBoYXZlIHRoZW0gdGVsbCB1cy4KKwkgKi8KKwlpZiAoZGV2X3ByaXYtPnN0YXRzLmxhc3RfZnJhbWVfcmVhZHMgPiAxIHx8CisJICAgIGRldl9wcml2LT5zdGF0cy5sYXN0X2NsZWFyX3JlYWRzID4gZGV2X3ByaXYtPnN0YXRzLmNsZWFycykgeworCQlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9XQUlUX0lETEU7CisJfQorCisJaWYgKGRldl9wcml2LT5zdGF0cy5mcmVlbGlzdF9sb29wcykgeworCQlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9XQUlUX0lETEU7CisJfQorCisJLyogUHVycGxlIGJveCBmb3IgcGFnZSBmbGlwcGluZworCSAqLworCWlmICggZGV2X3ByaXYtPnN0YXRzLmJveGVzICYgUkFERU9OX0JPWF9GTElQICkgCisJCXJhZGVvbl9jbGVhcl9ib3goIGRldl9wcml2LCA0LCA0LCA4LCA4LCAyNTUsIDAsIDI1NSApOworCisJLyogUmVkIGJveCBpZiB3ZSBoYXZlIHRvIHdhaXQgZm9yIGlkbGUgYXQgYW55IHBvaW50CisJICovCisJaWYgKCBkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX1dBSVRfSURMRSApIAorCQlyYWRlb25fY2xlYXJfYm94KCBkZXZfcHJpdiwgMTYsIDQsIDgsIDgsIDI1NSwgMCwgMCApOworCisJLyogQmx1ZSBib3g6IGxvc3QgY29udGV4dD8KKwkgKi8KKworCS8qIFllbGxvdyBib3ggZm9yIHRleHR1cmUgc3dhcHMKKwkgKi8KKwlpZiAoIGRldl9wcml2LT5zdGF0cy5ib3hlcyAmIFJBREVPTl9CT1hfVEVYVFVSRV9MT0FEICkgCisJCXJhZGVvbl9jbGVhcl9ib3goIGRldl9wcml2LCA0MCwgNCwgOCwgOCwgMjU1LCAyNTUsIDAgKTsKKworCS8qIEdyZWVuIGJveCBpZiBoYXJkd2FyZSBuZXZlciBpZGxlcyAoYXMgZmFyIGFzIHdlIGNhbiB0ZWxsKQorCSAqLworCWlmICggIShkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX0RNQV9JRExFKSApIAorCQlyYWRlb25fY2xlYXJfYm94KCBkZXZfcHJpdiwgNjQsIDQsIDgsIDgsIDAsIDI1NSwgMCApOworCisKKwkvKiBEcmF3IGJhcnMgaW5kaWNhdGluZyBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQgCisJICogKG5vdCBhIGdyZWF0IG1lYXN1cmUsIGVhc2lseSBjb25mdXNlZCkKKwkgKi8KKwlpZiAoZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzKSB7CisJCWlmIChkZXZfcHJpdi0+c3RhdHMucmVxdWVzdGVkX2J1ZnMgPiAxMDApCisJCQlkZXZfcHJpdi0+c3RhdHMucmVxdWVzdGVkX2J1ZnMgPSAxMDA7CisKKwkJcmFkZW9uX2NsZWFyX2JveCggZGV2X3ByaXYsIDQsIDE2LCAgCisJCQkJICBkZXZfcHJpdi0+c3RhdHMucmVxdWVzdGVkX2J1ZnMsIDQsCisJCQkJICAxOTYsIDEyOCwgMTI4ICk7CisJfQorCisJbWVtc2V0KCAmZGV2X3ByaXYtPnN0YXRzLCAwLCBzaXplb2YoZGV2X3ByaXYtPnN0YXRzKSApOworCit9CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDUCBjb21tYW5kIGRpc3BhdGNoIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9jbGVhciggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICAgZHJtX3JhZGVvbl9jbGVhcl90ICpjbGVhciwKKwkJCQkgICAgICBkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdCAqZGVwdGhfYm94ZXMgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX3JhZGVvbl9kZXB0aF9jbGVhcl90ICpkZXB0aF9jbGVhciA9ICZkZXZfcHJpdi0+ZGVwdGhfY2xlYXI7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXVuc2lnbmVkIGludCBmbGFncyA9IGNsZWFyLT5mbGFnczsKKwl1MzIgcmIzZF9jbnRsID0gMCwgcmIzZF9zdGVuY2lscmVmbWFzaz0gMDsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJmbGFncyA9IDB4JXhcbiIsIGZsYWdzICk7CisKKwlkZXZfcHJpdi0+c3RhdHMuY2xlYXJzKys7CisKKwlpZiAoIGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICYmIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSApIHsKKwkJdW5zaWduZWQgaW50IHRtcCA9IGZsYWdzOworCisJCWZsYWdzICY9IH4oUkFERU9OX0ZST05UIHwgUkFERU9OX0JBQ0spOworCQlpZiAoIHRtcCAmIFJBREVPTl9GUk9OVCApIGZsYWdzIHw9IFJBREVPTl9CQUNLOworCQlpZiAoIHRtcCAmIFJBREVPTl9CQUNLICkgIGZsYWdzIHw9IFJBREVPTl9GUk9OVDsKKwl9CisKKwlpZiAoIGZsYWdzICYgKFJBREVPTl9GUk9OVCB8IFJBREVPTl9CQUNLKSApIHsKKworCQlCRUdJTl9SSU5HKCA0ICk7CisKKwkJLyogRW5zdXJlIHRoZSAzRCBzdHJlYW0gaXMgaWRsZSBiZWZvcmUgZG9pbmcgYQorCQkgKiAyRCBmaWxsIHRvIGNsZWFyIHRoZSBmcm9udCBvciBiYWNrIGJ1ZmZlci4KKwkJICovCisJCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKKwkJCisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fRFBfV1JJVEVfTUFTSywgMCApICk7CisJCU9VVF9SSU5HKCBjbGVhci0+Y29sb3JfbWFzayApOworCisJCUFEVkFOQ0VfUklORygpOworCisJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCisJCSAqLworCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKKworCQlmb3IgKCBpID0gMCA7IGkgPCBuYm94IDsgaSsrICkgeworCQkJaW50IHggPSBwYm94W2ldLngxOworCQkJaW50IHkgPSBwYm94W2ldLnkxOworCQkJaW50IHcgPSBwYm94W2ldLngyIC0geDsKKwkJCWludCBoID0gcGJveFtpXS55MiAtIHk7CisKKwkJCURSTV9ERUJVRyggImRpc3BhdGNoIGNsZWFyICVkLCVkLSVkLCVkIGZsYWdzIDB4JXhcbiIsCisJCQkJICAgeCwgeSwgdywgaCwgZmxhZ3MgKTsKKworCQkJaWYgKCBmbGFncyAmIFJBREVPTl9GUk9OVCApIHsKKwkJCQlCRUdJTl9SSU5HKCA2ICk7CisJCQkJCisJCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl9DTlRMX1BBSU5UX01VTFRJLCA0ICkgKTsKKwkJCQlPVVRfUklORyggUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCQkgIFJBREVPTl9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAorCQkJCQkgIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKKwkJCQkJICBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCQkJCSAgUkFERU9OX1JPUDNfUCB8CisJCQkJCSAgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTICk7CisKKwkJCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCApOworCQkJCU9VVF9SSU5HKCBjbGVhci0+Y2xlYXJfY29sb3IgKTsKKwkJCQkKKwkJCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCQkJCU9VVF9SSU5HKCAodyA8PCAxNikgfCBoICk7CisJCQkJCisJCQkJQURWQU5DRV9SSU5HKCk7CisJCQl9CisJCQkKKwkJCWlmICggZmxhZ3MgJiBSQURFT05fQkFDSyApIHsKKwkJCQlCRUdJTl9SSU5HKCA2ICk7CisJCQkJCisJCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl9DTlRMX1BBSU5UX01VTFRJLCA0ICkgKTsKKwkJCQlPVVRfUklORyggUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCQkgIFJBREVPTl9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAorCQkJCQkgIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKKwkJCQkJICBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCQkJCSAgUkFERU9OX1JPUDNfUCB8CisJCQkJCSAgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTICk7CisJCQkJCisJCQkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCApOworCQkJCU9VVF9SSU5HKCBjbGVhci0+Y2xlYXJfY29sb3IgKTsKKworCQkJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCQkJT1VUX1JJTkcoICh3IDw8IDE2KSB8IGggKTsKKworCQkJCUFEVkFOQ0VfUklORygpOworCQkJfQorCQl9CisJfQorCQorCS8qIGh5cGVyIHogY2xlYXIgKi8KKwkvKiBubyBkb2NzIGF2YWlsYWJsZSwgYmFzZWQgb24gcmV2ZXJzZSBlbmdlbmVlcmluZyBieSBTdGVwaGFuZSBNYXJjaGVzaW4gKi8KKwlpZiAoKGZsYWdzICYgKFJBREVPTl9ERVBUSCB8IFJBREVPTl9TVEVOQ0lMKSkgJiYgKGZsYWdzICYgUkFERU9OX0NMRUFSX0ZBU1RaKSkgeworCisJCWludCBpOworCQlpbnQgZGVwdGhwaXhwZXJsaW5lID0gZGV2X3ByaXYtPmRlcHRoX2ZtdD09UkFERU9OX0RFUFRIX0ZPUk1BVF8xNkJJVF9JTlRfWj8gCisJCQkoZGV2X3ByaXYtPmRlcHRoX3BpdGNoIC8gMik6IChkZXZfcHJpdi0+ZGVwdGhfcGl0Y2ggLyA0KTsKKwkJCisJCXUzMiBjbGVhcm1hc2s7CisKKwkJdTMyIHRlbXBSQjNEX0RFUFRIQ0xFQVJWQUxVRSA9IGNsZWFyLT5jbGVhcl9kZXB0aCB8CisJCQkoKGNsZWFyLT5kZXB0aF9tYXNrICYgMHhmZikgPDwgMjQpOworCQorCQkKKwkJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KKwkJICogd2UgaGF2ZW4ndCB0b3VjaGVkIGFueSAibm9ybWFsIiBzdGF0ZSAtIHN0aWxsIG5lZWQgdGhpcz8KKwkJICovCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOworCisJCWlmICgoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9IQVNfSElFUlopICYmIChmbGFncyAmIFJBREVPTl9VU0VfSElFUlopKSB7CisJCS8qIEZJWE1FIDogcmV2ZXJzZSBlbmdpbmVlciB0aGF0IGZvciBSeDAwIGNhcmRzICovCisJCS8qIEZJWE1FIDogdGhlIG1hc2sgc3VwcG9zZWRseSBjb250YWlucyBsb3ctcmVzIHogdmFsdWVzLiBTbyBjYW4ndCBzZXQKKwkJICAganVzdCB0byB0aGUgbWF4ICgweGZmPyBvciBhY3R1YWxseSAweDNmZmY/KSwgbmVlZCB0byB0YWtlIHogY2xlYXIKKwkJICAgdmFsdWUgaW50byBhY2NvdW50PyAqLworCQkvKiBwYXR0ZXJuIHNlZW1zIHRvIHdvcmsgZm9yIHIxMDAsIHRob3VnaCBnZXQgc2xpZ2h0CisJCSAgIHJlbmRlcmluZyBlcnJvcnMgd2l0aCBnbHhnZWFycy4gSWYgaGllcnogaXMgbm90IGVuYWJsZWQgZm9yIHIxMDAsCisJCSAgIG9ubHkgNCBiaXRzIHdoaWNoIGluZGljYXRlIGNsZWFyICgxNSwxNiwzMSwzMiwgYWxsIHplcm8pIG1hdHRlciwgdGhlCisJCSAgIG90aGVyIG9uZXMgYXJlIGlnbm9yZWQsIGFuZCB0aGUgc2FtZSBjbGVhciBtYXNrIGNhbiBiZSB1c2VkLiBUaGF0J3MKKwkJICAgdmVyeSBkaWZmZXJlbnQgYmVoYXZpb3VyIHRoYW4gUjIwMCB3aGljaCBuZWVkcyBkaWZmZXJlbnQgY2xlYXIgbWFzaworCQkgICBhbmQgZGlmZmVyZW50IG51bWJlciBvZiB0aWxlcyB0byBjbGVhciBpZiBoaWVyeiBpcyBlbmFibGVkIG9yIG5vdCAhPyEKKwkJKi8KKwkJCWNsZWFybWFzayA9ICgweGZmPDwyMil8KDB4ZmY8PDYpfCAweDAwM2YwMDNmOworCQl9CisJCWVsc2UgeworCQkvKiBjbGVhciBtYXNrIDogY2hvb3NlcyB0aGUgY2xlYXJpbmcgcGF0dGVybi4KKwkJICAgcnYyNTA6IGNvdWxkIGJlIHVzZWQgdG8gY2xlYXIgb25seSBwYXJ0cyBvZiBtYWNyb3RpbGVzCisJCSAgIChidXQgdGhhdCB3b3VsZCBnZXQgcmVhbGx5IGNvbXBsaWNhdGVkLi4uKT8KKwkJICAgYml0IDAgYW5kIDEgKGVpdGhlciBvciBib3RoIG9mIHRoZW0gPyE/ISkgYXJlIHVzZWQgdG8KKwkJICAgbm90IGNsZWFyIHRpbGUgKG9yIG1heWJlIG9uZSBvZiB0aGUgYml0cyBpbmRpY2F0ZXMgaWYgdGhlIHRpbGUgaXMKKwkJICAgY29tcHJlc3NlZCBvciBub3QpLCBiaXQgMiBhbmQgMyB0byBub3QgY2xlYXIgdGlsZSAxLC4uLiwuCisJCSAgIFBhdHRlcm4gaXMgYXMgZm9sbG93czoKKwkJICAgICAgICB8IDAsMSB8IDQsNSB8IDgsOSB8MTIsMTN8MTYsMTd8MjAsMjF8MjQsMjV8MjgsMjl8CisJCSAgIGJpdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgICAgICAgIHwgMiwzIHwgNiw3IHwxMCwxMXwxNCwxNXwxOCwxOXwyMiwyM3wyNiwyN3wzMCwzMXwKKwkJICAgcnYxMDA6IGNsZWFybWFzayBjb3ZlcnMgMng4IDR4MSB0aWxlcywgYnV0IG9uZSBjbGVhciBzdGlsbAorCQkgICBjb3ZlcnMgMjU2IHBpeGVscyA/IT8KKwkJKi8KKwkJCWNsZWFybWFzayA9IDB4MDsKKwkJfQorCisJCUJFR0lOX1JJTkcoIDggKTsKKwkJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX0RFUFRIQ0xFQVJWQUxVRSwKKwkJCXRlbXBSQjNEX0RFUFRIQ0xFQVJWQUxVRSk7CisJCS8qIHdoYXQgb2Zmc2V0IGlzIHRoaXMgZXhhY3RseSA/ICovCisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfWk1BU0tPRkZTRVQsIDAgKTsKKwkJLyogbmVlZCBjdGxzdGF0LCBvdGhlcndpc2UgZ2V0IHNvbWUgc3RyYW5nZSBibGFjayBmbGlja2VyaW5nICovCisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfWkNBQ0hFX0NUTFNUQVQsIFJBREVPTl9SQjNEX1pDX0ZMVVNIX0FMTCApOworCQlBRFZBTkNFX1JJTkcoKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7CisJCQlpbnQgdGlsZW9mZnNldCwgbnJ0aWxlc3gsIG5ydGlsZXN5LCBqOworCQkJLyogaXQgbG9va3MgbGlrZSByMjAwIG5lZWRzIHJ2LXN0eWxlIGNsZWFycywgYXQgbGVhc3QgaWYgaGllcnogaXMgbm90IGVuYWJsZWQ/ICovCisJCQlpZiAoKGRldl9wcml2LT5mbGFncyZDSElQX0hBU19ISUVSWikgJiYgIShkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb249PVVDT0RFX1IyMDApKSB7CisJCQkJLyogRklYTUUgOiBmaWd1cmUgdGhpcyBvdXQgZm9yIHIyMDAgKHdoZW4gaGllcnogaXMgZW5hYmxlZCkuIE9yCisJCQkJICAgbWF5YmUgcjIwMCBhY3R1YWxseSBkb2Vzbid0IG5lZWQgdG8gcHV0IHRoZSBsb3ctcmVzIHogdmFsdWUgaW50bworCQkJCSAgIHRoZSB0aWxlIGNhY2hlIGxpa2UgcjEwMCwgYnV0IGp1c3QgbmVlZHMgdG8gY2xlYXIgdGhlIGhpLWxldmVsIHotYnVmZmVyPworCQkJCSAgIFdvcmtzIGZvciBSMTAwLCBib3RoIHdpdGggaGllcnogYW5kIHdpdGhvdXQuCisJCQkJICAgUjEwMCBzZWVtcyB0byBvcGVyYXRlIG9uIDJ4MSA4eDggdGlsZXMsIGJ1dC4uLgorCQkJCSAgIG9kZDogb2Zmc2V0L25ydGlsZXMgbmVlZCB0byBiZSA2NCBwaXggKDQgYmxvY2spIGFsaWduZWQ/IFBvdGVudGlhbGx5CisJCQkJICAgcHJvYmxlbWF0aWMgd2l0aCByZXNvbHV0aW9ucyB3aGljaCBhcmUgbm90IDY0IHBpeCBhbGlnbmVkPyAqLworCQkJCXRpbGVvZmZzZXQgPSAoKHBib3hbaV0ueTEgPj4gMykgKiBkZXB0aHBpeHBlcmxpbmUgKyBwYm94W2ldLngxKSA+PiA2OworCQkJCW5ydGlsZXN4ID0gKChwYm94W2ldLngyICYgfjYzKSAtIChwYm94W2ldLngxICYgfjYzKSkgPj4gNDsKKwkJCQlucnRpbGVzeSA9IChwYm94W2ldLnkyID4+IDMpIC0gKHBib3hbaV0ueTEgPj4gMyk7CisJCQkJZm9yIChqID0gMDsgaiA8PSBucnRpbGVzeTsgaisrKSB7CisJCQkJCUJFR0lOX1JJTkcoIDQgKTsKKwkJCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9DTEVBUl9aTUFTSywgMiApICk7CisJCQkJCS8qIGZpcnN0IHRpbGUgKi8KKwkJCQkJT1VUX1JJTkcoIHRpbGVvZmZzZXQgKiA4ICk7CisJCQkJCS8qIHRoZSBudW1iZXIgb2YgdGlsZXMgdG8gY2xlYXIgKi8KKwkJCQkJT1VUX1JJTkcoIG5ydGlsZXN4ICsgNCApOworCQkJCQkvKiBjbGVhciBtYXNrIDogY2hvb3NlcyB0aGUgY2xlYXJpbmcgcGF0dGVybi4gKi8KKwkJCQkJT1VUX1JJTkcoIGNsZWFybWFzayApOworCQkJCQlBRFZBTkNFX1JJTkcoKTsKKwkJCQkJdGlsZW9mZnNldCArPSBkZXB0aHBpeHBlcmxpbmUgPj4gNjsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb249PVVDT0RFX1IyMDApIHsKKwkJCQkvKiB3b3JrcyBmb3IgcnYyNTAuICovCisJCQkJLyogZmluZCBmaXJzdCBtYWNybyB0aWxlICg4eDIgNHg0IHotcGl4ZWxzIG9uIHJ2MjUwKSAqLworCQkJCXRpbGVvZmZzZXQgPSAoKHBib3hbaV0ueTEgPj4gMykgKiBkZXB0aHBpeHBlcmxpbmUgKyBwYm94W2ldLngxKSA+PiA1OworCQkJCW5ydGlsZXN4ID0gKHBib3hbaV0ueDIgPj4gNSkgLSAocGJveFtpXS54MSA+PiA1KTsKKwkJCQlucnRpbGVzeSA9IChwYm94W2ldLnkyID4+IDMpIC0gKHBib3hbaV0ueTEgPj4gMyk7CisJCQkJZm9yIChqID0gMDsgaiA8PSBucnRpbGVzeTsgaisrKSB7CisJCQkJCUJFR0lOX1JJTkcoIDQgKTsKKwkJCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9DTEVBUl9aTUFTSywgMiApICk7CisJCQkJCS8qIGZpcnN0IHRpbGUgKi8KKwkJCQkJLyoganVkZ2luZyBieSB0aGUgZmlyc3QgdGlsZSBvZmZzZXQgbmVlZGVkLCBjb3VsZCBwb3NzaWJseQorCQkJCQkgICBkaXJlY3RseSBhZGRyZXNzL2NsZWFyIDR4NCB0aWxlcyBpbnN0ZWFkIG9mIDh4MiAqIDR4NAorCQkJCQkgICBtYWNybyB0aWxlcywgdGhvdWdoIHdvdWxkIHN0aWxsIG5lZWQgY2xlYXIgbWFzayBmb3IKKwkJCQkJICAgcmlnaHQvYm90dG9tIGlmIHRydWVseSA0eDQgZ3JhbnVsYXJpdHkgaXMgZGVzaXJlZCA/ICovCisJCQkJCU9VVF9SSU5HKCB0aWxlb2Zmc2V0ICogMTYgKTsKKwkJCQkJLyogdGhlIG51bWJlciBvZiB0aWxlcyB0byBjbGVhciAqLworCQkJCQlPVVRfUklORyggbnJ0aWxlc3ggKyAxICk7CisJCQkJCS8qIGNsZWFyIG1hc2sgOiBjaG9vc2VzIHRoZSBjbGVhcmluZyBwYXR0ZXJuLiAqLworCQkJCQlPVVRfUklORyggY2xlYXJtYXNrICk7CisJCQkJCUFEVkFOQ0VfUklORygpOworCQkJCQl0aWxlb2Zmc2V0ICs9IGRlcHRocGl4cGVybGluZSA+PiA1OworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeyAvKiBydiAxMDAgKi8KKwkJCQkvKiBydjEwMCBtaWdodCBub3QgbmVlZCA2NCBwaXggYWxpZ25tZW50LCB3aG8ga25vd3MgKi8KKwkJCQkvKiBvZmZzZXRzIGFyZSwgaG1tLCB3ZWlyZCAqLworCQkJCXRpbGVvZmZzZXQgPSAoKHBib3hbaV0ueTEgPj4gNCkgKiBkZXB0aHBpeHBlcmxpbmUgKyBwYm94W2ldLngxKSA+PiA2OworCQkJCW5ydGlsZXN4ID0gKChwYm94W2ldLngyICYgfjYzKSAtIChwYm94W2ldLngxICYgfjYzKSkgPj4gNDsKKwkJCQlucnRpbGVzeSA9IChwYm94W2ldLnkyID4+IDQpIC0gKHBib3hbaV0ueTEgPj4gNCk7CisJCQkJZm9yIChqID0gMDsgaiA8PSBucnRpbGVzeTsgaisrKSB7CisJCQkJCUJFR0lOX1JJTkcoIDQgKTsKKwkJCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9DTEVBUl9aTUFTSywgMiApICk7CisJCQkJCU9VVF9SSU5HKCB0aWxlb2Zmc2V0ICogMTI4ICk7CisJCQkJCS8qIHRoZSBudW1iZXIgb2YgdGlsZXMgdG8gY2xlYXIgKi8KKwkJCQkJT1VUX1JJTkcoIG5ydGlsZXN4ICsgNCApOworCQkJCQkvKiBjbGVhciBtYXNrIDogY2hvb3NlcyB0aGUgY2xlYXJpbmcgcGF0dGVybi4gKi8KKwkJCQkJT1VUX1JJTkcoIGNsZWFybWFzayApOworCQkJCQlBRFZBTkNFX1JJTkcoKTsKKwkJCQkJdGlsZW9mZnNldCArPSBkZXB0aHBpeHBlcmxpbmUgPj4gNjsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBUT0RPIGRvbid0IGFsd2F5cyBjbGVhciBhbGwgaGktbGV2ZWwgeiB0aWxlcyAqLworCQlpZiAoKGRldl9wcml2LT5mbGFncyAmIENISVBfSEFTX0hJRVJaKSAmJiAoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uPT1VQ09ERV9SMjAwKQorCQkJJiYgKGZsYWdzICYgUkFERU9OX1VTRV9ISUVSWikpCisJCS8qIHIxMDAgYW5kIGNhcmRzIHdpdGhvdXQgaGllcmFyY2hpY2FsIHotYnVmZmVyIGhhdmUgbm8gaGlnaC1sZXZlbCB6LWJ1ZmZlciAqLworCQkvKiBGSVhNRSA6IHRoZSBtYXNrIHN1cHBvc2VkbHkgY29udGFpbnMgbG93LXJlcyB6IHZhbHVlcy4gU28gY2FuJ3Qgc2V0CisJCSAgIGp1c3QgdG8gdGhlIG1heCAoMHhmZj8gb3IgYWN0dWFsbHkgMHgzZmZmPyksIG5lZWQgdG8gdGFrZSB6IGNsZWFyCisJCSAgIHZhbHVlIGludG8gYWNjb3VudD8gKi8KKwkJeworCQkJQkVHSU5fUklORyggNCApOworCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9DTEVBUl9ISVosIDIgKSApOworCQkJT1VUX1JJTkcoIDB4MCApOyAvKiBGaXJzdCB0aWxlICovCisJCQlPVVRfUklORyggMHgzY2MwICk7CisJCQlPVVRfUklORyggKDB4ZmY8PDIyKXwoMHhmZjw8Nil8IDB4MDAzZjAwM2YpOworCQkJQURWQU5DRV9SSU5HKCk7CisJCX0KKwl9CisKKwkvKiBXZSBoYXZlIHRvIGNsZWFyIHRoZSBkZXB0aCBhbmQvb3Igc3RlbmNpbCBidWZmZXJzIGJ5CisJICogcmVuZGVyaW5nIGEgcXVhZCBpbnRvIGp1c3QgdGhvc2UgYnVmZmVycy4gIFRodXMsIHdlIGhhdmUgdG8KKwkgKiBtYWtlIHN1cmUgdGhlIDNEIGVuZ2luZSBpcyBjb25maWd1cmVkIGNvcnJlY3RseS4KKwkgKi8KKwlpZiAoKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbiA9PSBVQ09ERV9SMjAwKSAmJgorCSAgICAoZmxhZ3MgJiAoUkFERU9OX0RFUFRIIHwgUkFERU9OX1NURU5DSUwpKSkgeworCisJCWludCB0ZW1wUFBfQ05UTDsKKwkJaW50IHRlbXBSRV9DTlRMOworCQlpbnQgdGVtcFJCM0RfQ05UTDsKKwkJaW50IHRlbXBSQjNEX1pTVEVOQ0lMQ05UTDsKKwkJaW50IHRlbXBSQjNEX1NURU5DSUxSRUZNQVNLOworCQlpbnQgdGVtcFJCM0RfUExBTkVNQVNLOworCQlpbnQgdGVtcFNFX0NOVEw7CisJCWludCB0ZW1wU0VfVlRFX0NOVEw7CisJCWludCB0ZW1wU0VfVlRYX0ZNVF8wOworCQlpbnQgdGVtcFNFX1ZUWF9GTVRfMTsKKwkJaW50IHRlbXBTRV9WQVBfQ05UTDsKKwkJaW50IHRlbXBSRV9BVVhfU0NJU1NPUl9DTlRMOworCisJCXRlbXBQUF9DTlRMID0gMDsKKwkJdGVtcFJFX0NOVEwgPSAwOworCisJCXRlbXBSQjNEX0NOVEwgPSBkZXB0aF9jbGVhci0+cmIzZF9jbnRsOworCisJCXRlbXBSQjNEX1pTVEVOQ0lMQ05UTCA9IGRlcHRoX2NsZWFyLT5yYjNkX3pzdGVuY2lsY250bDsKKwkJdGVtcFJCM0RfU1RFTkNJTFJFRk1BU0sgPSAweDA7CisKKwkJdGVtcFNFX0NOVEwgPSBkZXB0aF9jbGVhci0+c2VfY250bDsKKworCisKKwkJLyogRGlzYWJsZSBUQ0wgKi8KKworCQl0ZW1wU0VfVkFQX0NOVEwgPSAoLyogU0VfVkFQX0NOVExfX0ZPUkNFX1dfVE9fT05FX01BU0sgfCAgKi8KKwkJCQkgICAoMHg5IDw8IFNFX1ZBUF9DTlRMX19WRl9NQVhfVlRYX05VTV9fU0hJRlQpKTsKKworCQl0ZW1wUkIzRF9QTEFORU1BU0sgPSAweDA7CisKKwkJdGVtcFJFX0FVWF9TQ0lTU09SX0NOVEwgPSAweDA7CisKKwkJdGVtcFNFX1ZURV9DTlRMID0KKwkJCVNFX1ZURV9DTlRMX19WVFhfWFlfRk1UX01BU0sgfAorCQkJU0VfVlRFX0NOVExfX1ZUWF9aX0ZNVF9NQVNLOworCisJCS8qIFZlcnRleCBmb3JtYXQgKFgsIFksIFosIFcpKi8KKwkJdGVtcFNFX1ZUWF9GTVRfMCA9CisJCQlTRV9WVFhfRk1UXzBfX1ZUWF9aMF9QUkVTRU5UX01BU0sgfAorCQkJU0VfVlRYX0ZNVF8wX19WVFhfVzBfUFJFU0VOVF9NQVNLOworCQl0ZW1wU0VfVlRYX0ZNVF8xID0gMHgwOworCisKKwkJLyogCisJCSAqIERlcHRoIGJ1ZmZlciBzcGVjaWZpYyBlbmFibGVzIAorCQkgKi8KKwkJaWYgKGZsYWdzICYgUkFERU9OX0RFUFRIKSB7CisJCQkvKiBFbmFibGUgZGVwdGggYnVmZmVyICovCisJCQl0ZW1wUkIzRF9DTlRMIHw9IFJBREVPTl9aX0VOQUJMRTsKKwkJfSBlbHNlIHsKKwkJCS8qIERpc2FibGUgZGVwdGggYnVmZmVyICovCisJCQl0ZW1wUkIzRF9DTlRMICY9IH5SQURFT05fWl9FTkFCTEU7CisJCX0KKworCQkvKiAKKwkJICogU3RlbmNpbCBidWZmZXIgc3BlY2lmaWMgZW5hYmxlcworCQkgKi8KKwkJaWYgKCBmbGFncyAmIFJBREVPTl9TVEVOQ0lMICkgeworCQkJdGVtcFJCM0RfQ05UTCB8PSAgUkFERU9OX1NURU5DSUxfRU5BQkxFOworCQkJdGVtcFJCM0RfU1RFTkNJTFJFRk1BU0sgPSBjbGVhci0+ZGVwdGhfbWFzazsgCisJCX0gZWxzZSB7CisJCQl0ZW1wUkIzRF9DTlRMICY9IH5SQURFT05fU1RFTkNJTF9FTkFCTEU7CisJCQl0ZW1wUkIzRF9TVEVOQ0lMUkVGTUFTSyA9IDB4MDAwMDAwMDA7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0NPTVBfWkJVRikgeworCQkJdGVtcFJCM0RfWlNURU5DSUxDTlRMIHw9IFJBREVPTl9aX0NPTVBSRVNTSU9OX0VOQUJMRSB8CisJCQkJUkFERU9OX1pfREVDT01QUkVTU0lPTl9FTkFCTEU7CisJCX0KKwkJaWYgKGZsYWdzICYgUkFERU9OX1VTRV9ISUVSWikgeworCQkJdGVtcFJCM0RfWlNURU5DSUxDTlRMIHw9IFJBREVPTl9aX0hJRVJBUkNIWV9FTkFCTEU7CisJCX0KKworCQlCRUdJTl9SSU5HKCAyNiApOworCQlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CisKKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fUFBfQ05UTCwgdGVtcFBQX0NOVEwgKTsKKwkJT1VUX1JJTkdfUkVHKCBSMjAwX1JFX0NOVEwsIHRlbXBSRV9DTlRMICk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfQ05UTCwgdGVtcFJCM0RfQ05UTCApOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1pTVEVOQ0lMQ05UTCwKKwkJCSAgICAgIHRlbXBSQjNEX1pTVEVOQ0lMQ05UTCApOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLCAKKwkJCSAgICAgIHRlbXBSQjNEX1NURU5DSUxSRUZNQVNLICk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfUExBTkVNQVNLLCB0ZW1wUkIzRF9QTEFORU1BU0sgKTsKKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fU0VfQ05UTCwgdGVtcFNFX0NOVEwgKTsKKwkJT1VUX1JJTkdfUkVHKCBSMjAwX1NFX1ZURV9DTlRMLCB0ZW1wU0VfVlRFX0NOVEwgKTsKKwkJT1VUX1JJTkdfUkVHKCBSMjAwX1NFX1ZUWF9GTVRfMCwgdGVtcFNFX1ZUWF9GTVRfMCApOworCQlPVVRfUklOR19SRUcoIFIyMDBfU0VfVlRYX0ZNVF8xLCB0ZW1wU0VfVlRYX0ZNVF8xICk7CisJCU9VVF9SSU5HX1JFRyggUjIwMF9TRV9WQVBfQ05UTCwgdGVtcFNFX1ZBUF9DTlRMICk7CisJCU9VVF9SSU5HX1JFRyggUjIwMF9SRV9BVVhfU0NJU1NPUl9DTlRMLCAKKwkJCSAgICAgIHRlbXBSRV9BVVhfU0NJU1NPUl9DTlRMICk7CisJCUFEVkFOQ0VfUklORygpOworCisJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCisJCSAqLworCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKKworCQlmb3IgKCBpID0gMCA7IGkgPCBuYm94IDsgaSsrICkgeworCQkJCisJCQkvKiBGdW5ueSB0aGF0IHRoaXMgc2hvdWxkIGJlIHJlcXVpcmVkIC0tIAorCQkJICogIHNldHMgdG9wLWxlZnQ/CisJCQkgKi8KKwkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsCisJCQkJCSAgICAgICAmc2FyZWFfcHJpdi0+Ym94ZXNbaV0gKTsKKworCQkJQkVHSU5fUklORyggMTQgKTsKKwkJCU9VVF9SSU5HKCBDUF9QQUNLRVQzKCBSMjAwXzNEX0RSQVdfSU1NRF8yLCAxMiApICk7CisJCQlPVVRfUklORyggKFJBREVPTl9QUklNX1RZUEVfUkVDVF9MSVNUIHwKKwkJCQkgICBSQURFT05fUFJJTV9XQUxLX1JJTkcgfAorCQkJCSAgICgzIDw8IFJBREVPTl9OVU1fVkVSVElDRVNfU0hJRlQpKSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gxXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kxXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSApOworCQkJT1VUX1JJTkcoIDB4M2Y4MDAwMDAgKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMV0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMl0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0gKTsKKwkJCU9VVF9SSU5HKCAweDNmODAwMDAwICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDJdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTJdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdICk7CisJCQlPVVRfUklORyggMHgzZjgwMDAwMCApOworCQkJQURWQU5DRV9SSU5HKCk7CisJCX0KKwl9IAorCWVsc2UgaWYgKCAoZmxhZ3MgJiAoUkFERU9OX0RFUFRIIHwgUkFERU9OX1NURU5DSUwpKSApIHsKKworCQlpbnQgdGVtcFJCM0RfWlNURU5DSUxDTlRMID0gZGVwdGhfY2xlYXItPnJiM2RfenN0ZW5jaWxjbnRsOworCisJCXJiM2RfY250bCA9IGRlcHRoX2NsZWFyLT5yYjNkX2NudGw7CisKKwkJaWYgKCBmbGFncyAmIFJBREVPTl9ERVBUSCApIHsKKwkJCXJiM2RfY250bCB8PSAgUkFERU9OX1pfRU5BQkxFOworCQl9IGVsc2UgeworCQkJcmIzZF9jbnRsICY9IH5SQURFT05fWl9FTkFCTEU7CisJCX0KKworCQlpZiAoIGZsYWdzICYgUkFERU9OX1NURU5DSUwgKSB7CisJCQlyYjNkX2NudGwgfD0gIFJBREVPTl9TVEVOQ0lMX0VOQUJMRTsKKwkJCXJiM2Rfc3RlbmNpbHJlZm1hc2sgPSBjbGVhci0+ZGVwdGhfbWFzazsgLyogbWlzbmFtZWQgZmllbGQgKi8KKwkJfSBlbHNlIHsKKwkJCXJiM2RfY250bCAmPSB+UkFERU9OX1NURU5DSUxfRU5BQkxFOworCQkJcmIzZF9zdGVuY2lscmVmbWFzayA9IDB4MDAwMDAwMDA7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0NPTVBfWkJVRikgeworCQkJdGVtcFJCM0RfWlNURU5DSUxDTlRMIHw9IFJBREVPTl9aX0NPTVBSRVNTSU9OX0VOQUJMRSB8CisJCQkJUkFERU9OX1pfREVDT01QUkVTU0lPTl9FTkFCTEU7CisJCX0KKwkJaWYgKGZsYWdzICYgUkFERU9OX1VTRV9ISUVSWikgeworCQkJdGVtcFJCM0RfWlNURU5DSUxDTlRMIHw9IFJBREVPTl9aX0hJRVJBUkNIWV9FTkFCTEU7CisJCX0KKworCQlCRUdJTl9SSU5HKCAxMyApOworCQlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CisKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9DTlRMLCAxICkgKTsKKwkJT1VUX1JJTkcoIDB4MDAwMDAwMDAgKTsKKwkJT1VUX1JJTkcoIHJiM2RfY250bCApOworCQkKKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9aU1RFTkNJTENOVEwsIHRlbXBSQjNEX1pTVEVOQ0lMQ05UTCApOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLAorCQkJICAgICAgcmIzZF9zdGVuY2lscmVmbWFzayApOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1BMQU5FTUFTSywKKwkJCSAgICAgIDB4MDAwMDAwMDAgKTsKKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fU0VfQ05UTCwKKwkJCSAgICAgIGRlcHRoX2NsZWFyLT5zZV9jbnRsICk7CisJCUFEVkFOQ0VfUklORygpOworCisJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCisJCSAqLworCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKKworCQlmb3IgKCBpID0gMCA7IGkgPCBuYm94IDsgaSsrICkgeworCQkJCisJCQkvKiBGdW5ueSB0aGF0IHRoaXMgc2hvdWxkIGJlIHJlcXVpcmVkIC0tIAorCQkJICogIHNldHMgdG9wLWxlZnQ/CisJCQkgKi8KKwkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsCisJCQkJCSAgICAgICAmc2FyZWFfcHJpdi0+Ym94ZXNbaV0gKTsKKworCQkJQkVHSU5fUklORyggMTUgKTsKKworCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9EUkFXX0lNTUQsIDEzICkgKTsKKwkJCU9VVF9SSU5HKCBSQURFT05fVlRYX1pfUFJFU0VOVCB8CisJCQkJICBSQURFT05fVlRYX1BLQ09MT1JfUFJFU0VOVCk7CisJCQlPVVRfUklORyggKFJBREVPTl9QUklNX1RZUEVfUkVDVF9MSVNUIHwKKwkJCQkgICBSQURFT05fUFJJTV9XQUxLX1JJTkcgfAorCQkJCSAgIFJBREVPTl9NQU9TX0VOQUJMRSB8CisJCQkJICAgUkFERU9OX1ZUWF9GTVRfUkFERU9OX01PREUgfAorCQkJCSAgICgzIDw8IFJBREVPTl9OVU1fVkVSVElDRVNfU0hJRlQpKSApOworCisKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMV0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMV0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0gKTsKKwkJCU9VVF9SSU5HKCAweDAgKTsKKworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gxXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kyXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSApOworCQkJT1VUX1JJTkcoIDB4MCApOworCisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDJdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTJdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdICk7CisJCQlPVVRfUklORyggMHgwICk7CisKKwkJCUFEVkFOQ0VfUklORygpOworCQl9CisJfQorCisJLyogSW5jcmVtZW50IHRoZSBjbGVhciBjb3VudGVyLiAgVGhlIGNsaWVudC1zaWRlIDNEIGRyaXZlciBtdXN0CisJICogd2FpdCBvbiB0aGlzIHZhbHVlIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBjbGVhciBpb2N0bC4gIFdlCisJICogbmVlZCB0aGlzIGJlY2F1c2UgdGhlIGNhcmQncyBzbyBkYW1uZWQgZmFzdC4uLgorCSAqLworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2NsZWFyKys7CisKKwlCRUdJTl9SSU5HKCA0ICk7CisKKwlSQURFT05fQ0xFQVJfQUdFKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9jbGVhciApOworCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfc3dhcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCWludCBpOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJLyogRG8gc29tZSB0cml2aWFsIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuLi4KKwkgKi8KKwlpZiAoZGV2X3ByaXYtPmRvX2JveGVzKQorCQlyYWRlb25fY3BfcGVyZm9ybWFuY2VfYm94ZXMoIGRldl9wcml2ICk7CisKKworCS8qIFdhaXQgZm9yIHRoZSAzRCBzdHJlYW0gdG8gaWRsZSBiZWZvcmUgZGlzcGF0Y2hpbmcgdGhlIGJpdGJsdC4KKwkgKiBUaGlzIHdpbGwgcHJldmVudCBkYXRhIGNvcnJ1cHRpb24gYmV0d2VlbiB0aGUgdHdvIHN0cmVhbXMuCisJICovCisJQkVHSU5fUklORyggMiApOworCisJUkFERU9OX1dBSVRfVU5USUxfM0RfSURMRSgpOworCisJQURWQU5DRV9SSU5HKCk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBuYm94IDsgaSsrICkgeworCQlpbnQgeCA9IHBib3hbaV0ueDE7CisJCWludCB5ID0gcGJveFtpXS55MTsKKwkJaW50IHcgPSBwYm94W2ldLngyIC0geDsKKwkJaW50IGggPSBwYm94W2ldLnkyIC0geTsKKworCQlEUk1fREVCVUcoICJkaXNwYXRjaCBzd2FwICVkLCVkLSVkLCVkXG4iLAorCQkJICAgeCwgeSwgdywgaCApOworCisJCUJFR0lOX1JJTkcoIDcgKTsKKworCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OX0NOVExfQklUQkxUX01VTFRJLCA1ICkgKTsKKwkJT1VUX1JJTkcoIFJBREVPTl9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCSAgUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJICBSQURFT05fR01DX0JSVVNIX05PTkUgfAorCQkJICAoZGV2X3ByaXYtPmNvbG9yX2ZtdCA8PCA4KSB8CisJCQkgIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCSAgUkFERU9OX1JPUDNfUyB8CisJCQkgIFJBREVPTl9EUF9TUkNfU09VUkNFX01FTU9SWSB8CisJCQkgIFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkgIFJBREVPTl9HTUNfV1JfTVNLX0RJUyApOworCQkKKwkJLyogTWFrZSB0aGlzIHdvcmsgZXZlbiBpZiBmcm9udCAmIGJhY2sgYXJlIGZsaXBwZWQ6CisJCSAqLworCQlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwKSB7CisJCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ICk7CisJCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCApOworCQl9IAorCQllbHNlIHsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICk7CisJCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ICk7CisJCX0KKworCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCQlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJCUFEVkFOQ0VfUklORygpOworCX0KKworCS8qIEluY3JlbWVudCB0aGUgZnJhbWUgY291bnRlci4gIFRoZSBjbGllbnQtc2lkZSAzRCBkcml2ZXIgbXVzdAorCSAqIHRocm90dGxlIHRoZSBmcmFtZXJhdGUgYnkgd2FpdGluZyBmb3IgdGhpcyB2YWx1ZSBiZWZvcmUKKwkgKiBwZXJmb3JtaW5nIHRoZSBzd2FwYnVmZmVyIGlvY3RsLgorCSAqLworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lKys7CisKKwlCRUdJTl9SSU5HKCA0ICk7CisKKwlSQURFT05fRlJBTUVfQUdFKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSApOworCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3NhcmVhX3QgKnNhcmVhID0gKGRybV9zYXJlYV90ICopZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGU7CisJaW50IG9mZnNldCA9IChkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDEpCisJCSAgID8gZGV2X3ByaXYtPmZyb250X29mZnNldCA6IGRldl9wcml2LT5iYWNrX29mZnNldDsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIlczogcGFnZT0lZCBwZkN1cnJlbnRQYWdlPSVkXG4iLCAKKwkJX19GVU5DVElPTl9fLCAKKwkJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSwKKwkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UpOworCisJLyogRG8gc29tZSB0cml2aWFsIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuLi4KKwkgKi8KKwlpZiAoZGV2X3ByaXYtPmRvX2JveGVzKSB7CisJCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX0ZMSVA7CisJCXJhZGVvbl9jcF9wZXJmb3JtYW5jZV9ib3hlcyggZGV2X3ByaXYgKTsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIGZyYW1lIG9mZnNldHMgZm9yIGJvdGggQ1JUQ3MKKwkgKi8KKwlCRUdJTl9SSU5HKCA2ICk7CisKKwlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CisJT1VUX1JJTkdfUkVHKCBSQURFT05fQ1JUQ19PRkZTRVQsICggKCBzYXJlYS0+ZnJhbWUueSAqIGRldl9wcml2LT5mcm9udF9waXRjaAorCQkJCQkgICAgICArIHNhcmVhLT5mcmFtZS54IAorCQkJCQkgICAgICAqICggZGV2X3ByaXYtPmNvbG9yX2ZtdCAtIDIgKSApICYgfjcgKQorCQkJCQkgICsgb2Zmc2V0ICk7CisJT1VUX1JJTkdfUkVHKCBSQURFT05fQ1JUQzJfT0ZGU0VULCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3J0YzJfYmFzZQorCQkJCQkgICArIG9mZnNldCApOworCisJQURWQU5DRV9SSU5HKCk7CisKKwkvKiBJbmNyZW1lbnQgdGhlIGZyYW1lIGNvdW50ZXIuICBUaGUgY2xpZW50LXNpZGUgM0QgZHJpdmVyIG11c3QKKwkgKiB0aHJvdHRsZSB0aGUgZnJhbWVyYXRlIGJ5IHdhaXRpbmcgZm9yIHRoaXMgdmFsdWUgYmVmb3JlCisJICogcGVyZm9ybWluZyB0aGUgc3dhcGJ1ZmZlciBpb2N0bC4KKwkgKi8KKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSsrOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9CisJCQkJCSAgICAgIDEgLSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworCisJQkVHSU5fUklORyggMiApOworCisJUkFERU9OX0ZSQU1FX0FHRSggZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUgKTsKKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgaW50IGJhZF9wcmltX3ZlcnRleF9uciggaW50IHByaW1pdGl2ZSwgaW50IG5yICkKK3sKKwlzd2l0Y2ggKHByaW1pdGl2ZSAmIFJBREVPTl9QUklNX1RZUEVfTUFTSykgeworCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9OT05FOgorCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9QT0lOVDoKKwkJcmV0dXJuIG5yIDwgMTsKKwljYXNlIFJBREVPTl9QUklNX1RZUEVfTElORToKKwkJcmV0dXJuIChuciAmIDEpIHx8IG5yID09IDA7CisJY2FzZSBSQURFT05fUFJJTV9UWVBFX0xJTkVfU1RSSVA6CisJCXJldHVybiBuciA8IDI7CisJY2FzZSBSQURFT05fUFJJTV9UWVBFX1RSSV9MSVNUOgorCWNhc2UgUkFERU9OX1BSSU1fVFlQRV8zVlJUX1BPSU5UX0xJU1Q6CisJY2FzZSBSQURFT05fUFJJTV9UWVBFXzNWUlRfTElORV9MSVNUOgorCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9SRUNUX0xJU1Q6CisJCXJldHVybiBuciAlIDMgfHwgbnIgPT0gMDsKKwljYXNlIFJBREVPTl9QUklNX1RZUEVfVFJJX0ZBTjoKKwljYXNlIFJBREVPTl9QUklNX1RZUEVfVFJJX1NUUklQOgorCQlyZXR1cm4gbnIgPCAzOworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0JCit9CisKKworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBmaW5pc2g7CisJdW5zaWduZWQgaW50IHByaW07CisJdW5zaWduZWQgaW50IG51bXZlcnRzOworCXVuc2lnbmVkIGludCBvZmZzZXQ7ICAgCisgICAgICAgIHVuc2lnbmVkIGludCB2Y19mb3JtYXQ7Cit9IGRybV9yYWRlb25fdGNsX3ByaW1fdDsKKworc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleCggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICAgIGRybV9idWZfdCAqYnVmLAorCQkJCSAgICAgICBkcm1fcmFkZW9uX3RjbF9wcmltX3QgKnByaW0gKQorCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgb2Zmc2V0ID0gZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgKyBidWYtPm9mZnNldCArIHByaW0tPnN0YXJ0OworCWludCBudW12ZXJ0cyA9IChpbnQpcHJpbS0+bnVtdmVydHM7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCWludCBpID0gMDsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRygiaHdwcmltIDB4JXggdmZtdCAweCV4ICVkLi4lZCAlZCB2ZXJ0c1xuIiwKKwkJICBwcmltLT5wcmltLAorCQkgIHByaW0tPnZjX2Zvcm1hdCwKKwkJICBwcmltLT5zdGFydCwKKwkJICBwcmltLT5maW5pc2gsCisJCSAgcHJpbS0+bnVtdmVydHMpOworCisJaWYgKGJhZF9wcmltX3ZlcnRleF9uciggcHJpbS0+cHJpbSwgcHJpbS0+bnVtdmVydHMgKSkgeworCQlEUk1fRVJST1IoICJiYWQgcHJpbSAleCBudW12ZXJ0cyAlZFxuIiwgCisJCQkgICBwcmltLT5wcmltLCBwcmltLT5udW12ZXJ0cyApOworCQlyZXR1cm47CisJfQorCisJZG8geworCQkvKiBFbWl0IHRoZSBuZXh0IGNsaXByZWN0ICovCisJCWlmICggaSA8IG5ib3ggKSB7CisJCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoIGRldl9wcml2LCAKKwkJCQkJICAgICAgICZzYXJlYV9wcml2LT5ib3hlc1tpXSApOworCQl9CisKKwkJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciByZW5kZXJpbmcgY29tbWFuZHMgKi8KKwkJQkVHSU5fUklORyggNSApOworCisJCU9VVF9SSU5HKCBDUF9QQUNLRVQzKCBSQURFT05fM0RfUk5EUl9HRU5fSU5EWF9QUklNLCAzICkgKTsKKwkJT1VUX1JJTkcoIG9mZnNldCApOworCQlPVVRfUklORyggbnVtdmVydHMgKTsKKwkJT1VUX1JJTkcoIHByaW0tPnZjX2Zvcm1hdCApOworCQlPVVRfUklORyggcHJpbS0+cHJpbSB8IFJBREVPTl9QUklNX1dBTEtfTElTVCB8CisJCQkgIFJBREVPTl9DT0xPUl9PUkRFUl9SR0JBIHwKKwkJCSAgUkFERU9OX1ZUWF9GTVRfUkFERU9OX01PREUgfAorCQkJICAobnVtdmVydHMgPDwgUkFERU9OX05VTV9WRVJUSUNFU19TSElGVCkgKTsKKworCQlBRFZBTkNFX1JJTkcoKTsKKworCQlpKys7CisJfSB3aGlsZSAoIGkgPCBuYm94ICk7Cit9CisKKworCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlSSU5HX0xPQ0FMUzsKKworCWJ1Zl9wcml2LT5hZ2UgPSArK2Rldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoOworCisJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciBhZ2UgKi8KKwlCRUdJTl9SSU5HKCAyICk7CisJUkFERU9OX0RJU1BBVENIX0FHRSggYnVmX3ByaXYtPmFnZSApOworCUFEVkFOQ0VfUklORygpOworCisJYnVmLT5wZW5kaW5nID0gMTsKKwlidWYtPnVzZWQgPSAwOworfQorCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfaW5kaXJlY3QoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCQkgZHJtX2J1Zl90ICpidWYsCisJCQkJCSBpbnQgc3RhcnQsIGludCBlbmQgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiaW5kaXJlY3Q6IGJ1Zj0lZCBzPTB4JXggZT0weCV4XG4iLAorCQkgICBidWYtPmlkeCwgc3RhcnQsIGVuZCApOworCisJaWYgKCBzdGFydCAhPSBlbmQgKSB7CisJCWludCBvZmZzZXQgPSAoZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQKKwkJCSAgICAgICsgYnVmLT5vZmZzZXQgKyBzdGFydCk7CisJCWludCBkd29yZHMgPSAoZW5kIC0gc3RhcnQgKyAzKSAvIHNpemVvZih1MzIpOworCisJCS8qIEluZGlyZWN0IGJ1ZmZlciBkYXRhIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YKKwkJICogZHdvcmRzLCBzbyBpZiB3ZSd2ZSBiZWVuIGdpdmVuIGFuIG9kZCBudW1iZXIgd2UgbXVzdAorCQkgKiBwYWQgdGhlIGRhdGEgd2l0aCBhIFR5cGUtMiBDUCBwYWNrZXQuCisJCSAqLworCQlpZiAoIGR3b3JkcyAmIDEgKSB7CisJCQl1MzIgKmRhdGEgPSAodTMyICopCisJCQkJKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlCisJCQkJICsgYnVmLT5vZmZzZXQgKyBzdGFydCk7CisJCQlkYXRhW2R3b3JkcysrXSA9IFJBREVPTl9DUF9QQUNLRVQyOworCQl9CisKKwkJLyogRmlyZSBvZmYgdGhlIGluZGlyZWN0IGJ1ZmZlciAqLworCQlCRUdJTl9SSU5HKCAzICk7CisKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9DUF9JQl9CQVNFLCAxICkgKTsKKwkJT1VUX1JJTkcoIG9mZnNldCApOworCQlPVVRfUklORyggZHdvcmRzICk7CisKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpY2VzKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJZHJtX2J1Zl90ICplbHRfYnVmLAorCQkJCQlkcm1fcmFkZW9uX3RjbF9wcmltX3QgKnByaW0gKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJaW50IG9mZnNldCA9IGRldl9wcml2LT5nYXJ0X2J1ZmZlcnNfb2Zmc2V0ICsgcHJpbS0+b2Zmc2V0OworCXUzMiAqZGF0YTsKKwlpbnQgZHdvcmRzOworCWludCBpID0gMDsKKwlpbnQgc3RhcnQgPSBwcmltLT5zdGFydCArIFJBREVPTl9JTkRFWF9QUklNX09GRlNFVDsKKwlpbnQgY291bnQgPSAocHJpbS0+ZmluaXNoIC0gc3RhcnQpIC8gc2l6ZW9mKHUxNik7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCisJRFJNX0RFQlVHKCJod3ByaW0gMHgleCB2Zm10IDB4JXggJWQuLiVkIG9mZnNldDogJXggbnIgJWRcbiIsCisJCSAgcHJpbS0+cHJpbSwKKwkJICBwcmltLT52Y19mb3JtYXQsCisJCSAgcHJpbS0+c3RhcnQsCisJCSAgcHJpbS0+ZmluaXNoLAorCQkgIHByaW0tPm9mZnNldCwKKwkJICBwcmltLT5udW12ZXJ0cyk7CisKKwlpZiAoYmFkX3ByaW1fdmVydGV4X25yKCBwcmltLT5wcmltLCBjb3VudCApKSB7CisJCURSTV9FUlJPUiggImJhZCBwcmltICV4IGNvdW50ICVkXG4iLCAKKwkJCSAgIHByaW0tPnByaW0sIGNvdW50ICk7CisJCXJldHVybjsKKwl9CisKKworCWlmICggc3RhcnQgPj0gcHJpbS0+ZmluaXNoIHx8CisJICAgICAocHJpbS0+c3RhcnQgJiAweDcpICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgcHJpbSAlZFxuIiwgcHJpbS0+cHJpbSApOworCQlyZXR1cm47CisJfQorCisJZHdvcmRzID0gKHByaW0tPmZpbmlzaCAtIHByaW0tPnN0YXJ0ICsgMykgLyBzaXplb2YodTMyKTsKKworCWRhdGEgPSAodTMyICopKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICsKKwkJICAgICAgIGVsdF9idWYtPm9mZnNldCArIHByaW0tPnN0YXJ0KTsKKworCWRhdGFbMF0gPSBDUF9QQUNLRVQzKCBSQURFT05fM0RfUk5EUl9HRU5fSU5EWF9QUklNLCBkd29yZHMtMiApOworCWRhdGFbMV0gPSBvZmZzZXQ7CisJZGF0YVsyXSA9IHByaW0tPm51bXZlcnRzOworCWRhdGFbM10gPSBwcmltLT52Y19mb3JtYXQ7CisJZGF0YVs0XSA9IChwcmltLT5wcmltIHwKKwkJICAgUkFERU9OX1BSSU1fV0FMS19JTkQgfAorCQkgICBSQURFT05fQ09MT1JfT1JERVJfUkdCQSB8CisJCSAgIFJBREVPTl9WVFhfRk1UX1JBREVPTl9NT0RFIHwKKwkJICAgKGNvdW50IDw8IFJBREVPTl9OVU1fVkVSVElDRVNfU0hJRlQpICk7CisKKwlkbyB7CisJCWlmICggaSA8IG5ib3ggKSAKKwkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsIAorCQkJCQkgICAgICAgJnNhcmVhX3ByaXYtPmJveGVzW2ldICk7CisKKwkJcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGlyZWN0KCBkZXYsIGVsdF9idWYsCisJCQkJCSAgICAgcHJpbS0+c3RhcnQsCisJCQkJCSAgICAgcHJpbS0+ZmluaXNoICk7CisKKwkJaSsrOworCX0gd2hpbGUgKCBpIDwgbmJveCApOworCit9CisKKyNkZWZpbmUgUkFERU9OX01BWF9URVhUVVJFX1NJWkUgKFJBREVPTl9CVUZGRVJfU0laRSAtIDggKiBzaXplb2YodTMyKSkKKworc3RhdGljIGludCByYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZSggRFJNRklMRSBmaWxwLAorCQkJCSAgICAgICBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICAgICAgZHJtX3JhZGVvbl90ZXh0dXJlX3QgKnRleCwKKwkJCQkgICAgICAgZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCAqaW1hZ2UgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2ZpbGVfdCAqZmlscF9wcml2OworCWRybV9idWZfdCAqYnVmOworCXUzMiBmb3JtYXQ7CisJdTMyICpidWZmZXI7CisJY29uc3QgdTggX191c2VyICpkYXRhOworCWludCBzaXplLCBkd29yZHMsIHRleF93aWR0aCwgYmxpdF93aWR0aDsKKwl1MzIgaGVpZ2h0OworCWludCBpOworCXUzMiB0ZXhwaXRjaCwgbWljcm90aWxlOworCVJJTkdfTE9DQUxTOworCisJRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKCBmaWxwX3ByaXYsIGZpbHAgKTsKKworCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsICZ0ZXgtPm9mZnNldCApICkgeworCQlEUk1fRVJST1IoICJJbnZhbGlkIGRlc3RpbmF0aW9uIG9mZnNldFxuIiApOworCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJfQorCisJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfVEVYVFVSRV9MT0FEOworCisJLyogRmx1c2ggdGhlIHBpeGVsIGNhY2hlLiAgVGhpcyBlbnN1cmVzIG5vIHBpeGVsIGRhdGEgZ2V0cyBtaXhlZAorCSAqIHVwIHdpdGggdGhlIHRleHR1cmUgZGF0YSBmcm9tIHRoZSBob3N0IGRhdGEgYmxpdCwgb3RoZXJ3aXNlCisJICogcGFydCBvZiB0aGUgdGV4dHVyZSBpbWFnZSBtYXkgYmUgY29ycnVwdGVkLgorCSAqLworCUJFR0lOX1JJTkcoIDQgKTsKKwlSQURFT05fRkxVU0hfQ0FDSEUoKTsKKwlSQURFT05fV0FJVF9VTlRJTF9JRExFKCk7CisJQURWQU5DRV9SSU5HKCk7CisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkvKiBUaGUgTWVzYSB0ZXh0dXJlIGZ1bmN0aW9ucyBwcm92aWRlIHRoZSBkYXRhIGluIGxpdHRsZSBlbmRpYW4gYXMgdGhlCisJICogY2hpcCB3YW50cyBpdCwgYnV0IHdlIG5lZWQgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGZhY3QgdGhhdCB0aGUgQ1AKKwkgKiByaW5nIGdldHMgYnl0ZS1zd2FwcGVkCisJICovCisJQkVHSU5fUklORyggMiApOworCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCQk1fR1VJQ05UTCwgUkFERU9OX0hPU1RfREFUQV9TV0FQXzMyQklUICk7CisJQURWQU5DRV9SSU5HKCk7CisjZW5kaWYKKworCisJLyogVGhlIGNvbXBpbGVyIHdvbid0IG9wdGltaXplIGF3YXkgYSBkaXZpc2lvbiBieSBhIHZhcmlhYmxlLAorCSAqIGV2ZW4gaWYgdGhlIG9ubHkgbGVnYWwgdmFsdWVzIGFyZSBwb3dlcnMgb2YgdHdvLiAgVGh1cywgd2UnbGwKKwkgKiB1c2UgYSBzaGlmdCBpbnN0ZWFkLgorCSAqLworCXN3aXRjaCAoIHRleC0+Zm9ybWF0ICkgeworCWNhc2UgUkFERU9OX1RYRk9STUFUX0FSR0I4ODg4OgorCWNhc2UgUkFERU9OX1RYRk9STUFUX1JHQkE4ODg4OgorCQlmb3JtYXQgPSBSQURFT05fQ09MT1JfRk9STUFUX0FSR0I4ODg4OworCQl0ZXhfd2lkdGggPSB0ZXgtPndpZHRoICogNDsKKwkJYmxpdF93aWR0aCA9IGltYWdlLT53aWR0aCAqIDQ7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1RYRk9STUFUX0FJODg6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfQVJHQjE1NTU6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfUkdCNTY1OgorCWNhc2UgUkFERU9OX1RYRk9STUFUX0FSR0I0NDQ0OgorCWNhc2UgUkFERU9OX1RYRk9STUFUX1ZZVVk0MjI6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfWVZZVTQyMjoKKwkJZm9ybWF0ID0gUkFERU9OX0NPTE9SX0ZPUk1BVF9SR0I1NjU7CisJCXRleF93aWR0aCA9IHRleC0+d2lkdGggKiAyOworCQlibGl0X3dpZHRoID0gaW1hZ2UtPndpZHRoICogMjsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fVFhGT1JNQVRfSTg6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfUkdCMzMyOgorCQlmb3JtYXQgPSBSQURFT05fQ09MT1JfRk9STUFUX0NJODsKKwkJdGV4X3dpZHRoID0gdGV4LT53aWR0aCAqIDE7CisJCWJsaXRfd2lkdGggPSBpbWFnZS0+d2lkdGggKiAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoICJpbnZhbGlkIHRleHR1cmUgZm9ybWF0ICVkXG4iLCB0ZXgtPmZvcm1hdCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwl0ZXhwaXRjaCA9IHRleC0+cGl0Y2g7CisJaWYgKCh0ZXhwaXRjaCA8PCAyMikgJiBSQURFT05fRFNUX1RJTEVfTUlDUk8pIHsKKwkJbWljcm90aWxlID0gMTsKKwkJaWYgKHRleF93aWR0aCA8IDY0KSB7CisJCQl0ZXhwaXRjaCAmPSB+KFJBREVPTl9EU1RfVElMRV9NSUNSTyA+PiAyMik7CisJCQkvKiB3ZSBnb3QgdGlsZWQgY29vcmRpbmF0ZXMsIHVudGlsZSB0aGVtICovCisJCQlpbWFnZS0+eCAqPSAyOworCQl9CisJfQorCWVsc2UgbWljcm90aWxlID0gMDsKKworCURSTV9ERUJVRygidGV4PSVkeCVkIGJsaXQ9JWRcbiIsIHRleF93aWR0aCwgdGV4LT5oZWlnaHQsIGJsaXRfd2lkdGggKTsKKworCWRvIHsKKwkJRFJNX0RFQlVHKCAidGV4OiBvZnM9MHgleCBwPSVkIGY9JWQgeD0laGQgeT0laGQgdz0laGQgaD0laGRcbiIsCisJCQkgICB0ZXgtPm9mZnNldCA+PiAxMCwgdGV4LT5waXRjaCwgdGV4LT5mb3JtYXQsCisJCQkgICBpbWFnZS0+eCwgaW1hZ2UtPnksIGltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCApOworCisJCS8qIE1ha2UgYSBjb3B5IG9mIHNvbWUgcGFyYW1ldGVycyBpbiBjYXNlIHdlIGhhdmUgdG8KKwkJICogdXBkYXRlIHRoZW0gZm9yIGEgbXVsdGktcGFzcyB0ZXh0dXJlIGJsaXQuCisJCSAqLworCQloZWlnaHQgPSBpbWFnZS0+aGVpZ2h0OworCQlkYXRhID0gKGNvbnN0IHU4IF9fdXNlciAqKWltYWdlLT5kYXRhOworCQkKKwkJc2l6ZSA9IGhlaWdodCAqIGJsaXRfd2lkdGg7CisKKwkJaWYgKCBzaXplID4gUkFERU9OX01BWF9URVhUVVJFX1NJWkUgKSB7CisJCQloZWlnaHQgPSBSQURFT05fTUFYX1RFWFRVUkVfU0laRSAvIGJsaXRfd2lkdGg7CisJCQlzaXplID0gaGVpZ2h0ICogYmxpdF93aWR0aDsKKwkJfSBlbHNlIGlmICggc2l6ZSA8IDQgJiYgc2l6ZSA+IDAgKSB7CisJCQlzaXplID0gNDsKKwkJfSBlbHNlIGlmICggc2l6ZSA9PSAwICkgeworCQkJcmV0dXJuIDA7CisJCX0KKworCQlidWYgPSByYWRlb25fZnJlZWxpc3RfZ2V0KCBkZXYgKTsKKwkJaWYgKCAwICYmICFidWYgKSB7CisJCQlyYWRlb25fZG9fY3BfaWRsZSggZGV2X3ByaXYgKTsKKwkJCWJ1ZiA9IHJhZGVvbl9mcmVlbGlzdF9nZXQoIGRldiApOworCQl9CisJCWlmICggIWJ1ZiApIHsKKwkJCURSTV9ERUJVRygicmFkZW9uX2NwX2Rpc3BhdGNoX3RleHR1cmU6IEVBR0FJTlxuIik7CisJCQlpZiAoRFJNX0NPUFlfVE9fVVNFUiggdGV4LT5pbWFnZSwgaW1hZ2UsIHNpemVvZigqaW1hZ2UpICkpCisJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCXJldHVybiBEUk1fRVJSKEVBR0FJTik7CisJCX0KKworCisJCS8qIERpc3BhdGNoIHRoZSBpbmRpcmVjdCBidWZmZXIuCisJCSAqLworCQlidWZmZXIgPSAodTMyKikoKGNoYXIqKWRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSArIGJ1Zi0+b2Zmc2V0KTsKKwkJZHdvcmRzID0gc2l6ZSAvIDQ7CisJCWJ1ZmZlclswXSA9IENQX1BBQ0tFVDMoIFJBREVPTl9DTlRMX0hPU1REQVRBX0JMVCwgZHdvcmRzICsgNiApOworCQlidWZmZXJbMV0gPSAoUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJICAgICBSQURFT05fR01DX0JSVVNIX05PTkUgfAorCQkJICAgICAoZm9ybWF0IDw8IDgpIHwKKwkJCSAgICAgUkFERU9OX0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJICAgICBSQURFT05fUk9QM19TIHwKKwkJCSAgICAgUkFERU9OX0RQX1NSQ19TT1VSQ0VfSE9TVF9EQVRBIHwKKwkJCSAgICAgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCSAgICAgUkFERU9OX0dNQ19XUl9NU0tfRElTKTsKKwkJCisJCWJ1ZmZlclsyXSA9ICh0ZXhwaXRjaCA8PCAyMikgfCAodGV4LT5vZmZzZXQgPj4gMTApOworCQlidWZmZXJbM10gPSAweGZmZmZmZmZmOworCQlidWZmZXJbNF0gPSAweGZmZmZmZmZmOworCQlidWZmZXJbNV0gPSAoaW1hZ2UtPnkgPDwgMTYpIHwgaW1hZ2UtPng7CisJCWJ1ZmZlcls2XSA9IChoZWlnaHQgPDwgMTYpIHwgaW1hZ2UtPndpZHRoOworCQlidWZmZXJbN10gPSBkd29yZHM7CisJCWJ1ZmZlciArPSA4OworCisJCQorCisJCWlmIChtaWNyb3RpbGUpIHsKKwkJCS8qIHRleHR1cmUgbWljcm8gdGlsaW5nIGluIHVzZSwgbWluaW11bSB0ZXh0dXJlIHdpZHRoIGlzIHRodXMgMTYgYnl0ZXMuCisJCQkgICBob3dldmVyLCB3ZSBjYW5ub3QgdXNlIGJsaXR0ZXIgZGlyZWN0bHkgZm9yIHRleHR1cmUgd2lkdGggPCA2NCBieXRlcywKKwkJCSAgIHNpbmNlIG1pbmltdW0gdGV4IHBpdGNoIGlzIDY0IGJ5dGVzIGFuZCB3ZSBuZWVkIHRoaXMgdG8gbWF0Y2gKKwkJCSAgIHRoZSB0ZXh0dXJlIHdpZHRoLCBvdGhlcndpc2UgdGhlIGJsaXR0ZXIgd2lsbCB0aWxlIGl0IHdyb25nLgorCQkJICAgVGh1cywgdGlsaW5nIG1hbnVhbGx5IGluIHRoaXMgY2FzZS4gQWRkaXRpb25hbGx5LCBuZWVkIHRvIHNwZWNpYWwKKwkJCSAgIGNhc2UgdGV4IGhlaWdodCA9IDEsIHNpbmNlIG91ciBhY3R1YWwgaW1hZ2Ugd2lsbCBoYXZlIGhlaWdodCAyCisJCQkgICBhbmQgd2UgbmVlZCB0byBlbnN1cmUgd2UgZG9uJ3QgcmVhZCBiZXlvbmQgdGhlIHRleHR1cmUgc2l6ZQorCQkJICAgZnJvbSB1c2VyIHNwYWNlLiAqLworCQkJaWYgKHRleC0+aGVpZ2h0ID09IDEpIHsKKwkJCQlpZiAodGV4X3dpZHRoID49IDY0IHx8IHRleF93aWR0aCA8PSAxNikgeworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwKKwkJCQkJCQkgICAgICAgdGV4X3dpZHRoICogc2l6ZW9mKHUzMikpKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHRleF93aWR0aCA9PSAzMikgeworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwgMTYpKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJCX0KKwkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIgKyA4LCBkYXRhICsgMTYsIDE2KSkgeworCQkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKKwkJCQkJCQkgIHRleF93aWR0aCk7CisJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmICh0ZXhfd2lkdGggPj0gNjQgfHwgdGV4X3dpZHRoID09IDE2KSB7CisJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRhdGEsCisJCQkJCQkgICAgICAgZHdvcmRzICogc2l6ZW9mKHUzMikpKSB7CisJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIGRhdGEsICVkIGR3b3Jkc1xuIiwKKwkJCQkJCSAgZHdvcmRzKTsKKwkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHRleF93aWR0aCA8IDE2KSB7CisJCQkJZm9yIChpID0gMDsgaSA8IHRleC0+aGVpZ2h0OyBpKyspIHsKKwkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRhdGEsIHRleF93aWR0aCkpIHsKKwkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCisJCQkJCQkJICB0ZXhfd2lkdGgpOworCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQkJfQorCQkJCQlidWZmZXIgKz0gNDsKKwkJCQkJZGF0YSArPSB0ZXhfd2lkdGg7CisJCQkJfQorCQkJfSBlbHNlIGlmICh0ZXhfd2lkdGggPT0gMzIpIHsKKwkJCQkvKiBUT0RPOiBtYWtlIHN1cmUgdGhpcyB3b3JrcyB3aGVuIG5vdCBmaXR0aW5nIGluIG9uZSBidWZmZXIKKwkJCQkgICAoaS5lLiAzMmJ5dGVzIHggMjA0OC4uLikgKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgdGV4LT5oZWlnaHQ7IGkgKz0gMikgeworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwgMTYpKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJCX0KKwkJCQkJZGF0YSArPSAxNjsKKwkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIgKyA4LCBkYXRhLCAxNikpIHsKKwkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCisJCQkJCQkJICB0ZXhfd2lkdGgpOworCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQkJfQorCQkJCQlkYXRhICs9IDE2OworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciArIDQsIGRhdGEsIDE2KSkgeworCQkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKKwkJCQkJCQkgIHRleF93aWR0aCk7CisJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCQl9CisJCQkJCWRhdGEgKz0gMTY7CisJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyICsgMTIsIGRhdGEsIDE2KSkgeworCQkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKKwkJCQkJCQkgIHRleF93aWR0aCk7CisJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCQl9CisJCQkJCWRhdGEgKz0gMTY7CisJCQkJCWJ1ZmZlciArPSAxNjsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlpZiAodGV4X3dpZHRoID49IDMyKSB7CisJCQkJLyogVGV4dHVyZSBpbWFnZSB3aWR0aCBpcyBsYXJnZXIgdGhhbiB0aGUgbWluaW11bSwgc28gd2UKKwkJCQkgKiBjYW4gdXBsb2FkIGl0IGRpcmVjdGx5LgorCQkJCSAqLworCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkYXRhLAorCQkJCQkJICAgICAgIGR3b3JkcyAqIHNpemVvZih1MzIpKSkgeworCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBkYXRhLCAlZCBkd29yZHNcbiIsCisJCQkJCQkgIGR3b3Jkcyk7CisJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBUZXh0dXJlIGltYWdlIHdpZHRoIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSwgc28gd2UKKwkJCQkgKiBuZWVkIHRvIHBhZCBvdXQgZWFjaCBpbWFnZSBzY2FubGluZSB0byB0aGUgbWluaW11bQorCQkJCSAqIHdpZHRoLgorCQkJCSAqLworCQkJCWZvciAoaSA9IDAgOyBpIDwgdGV4LT5oZWlnaHQgOyBpKyspIHsKKwkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRhdGEsIHRleF93aWR0aCApKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLCB0ZXhfd2lkdGgpOworCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQkJfQorCQkJCQlidWZmZXIgKz0gODsKKwkJCQkJZGF0YSArPSB0ZXhfd2lkdGg7CisJCQkJfQorCQkJfQorCQl9CisKKwkJYnVmLT5maWxwID0gZmlscDsKKwkJYnVmLT51c2VkID0gKGR3b3JkcyArIDgpICogc2l6ZW9mKHUzMik7CisJCXJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdCggZGV2LCBidWYsIDAsIGJ1Zi0+dXNlZCApOworCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisKKwkJLyogVXBkYXRlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBuZXh0IHRpbWUgKi8KKwkJaW1hZ2UtPnkgKz0gaGVpZ2h0OworCQlpbWFnZS0+aGVpZ2h0IC09IGhlaWdodDsKKwkJaW1hZ2UtPmRhdGEgPSAoY29uc3QgdTggX191c2VyICopaW1hZ2UtPmRhdGEgKyBzaXplOworCX0gd2hpbGUgKGltYWdlLT5oZWlnaHQgPiAwKTsKKworCS8qIEZsdXNoIHRoZSBwaXhlbCBjYWNoZSBhZnRlciB0aGUgYmxpdCBjb21wbGV0ZXMuICBUaGlzIGVuc3VyZXMKKwkgKiB0aGUgdGV4dHVyZSBkYXRhIGlzIHdyaXR0ZW4gb3V0IHRvIG1lbW9yeSBiZWZvcmUgcmVuZGVyaW5nCisJICogY29udGludWVzLgorCSAqLworCUJFR0lOX1JJTkcoIDQgKTsKKwlSQURFT05fRkxVU0hfQ0FDSEUoKTsKKwlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CisJQURWQU5DRV9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3N0aXBwbGUoIGRybV9kZXZpY2VfdCAqZGV2LCB1MzIgKnN0aXBwbGUgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlCRUdJTl9SSU5HKCAzNSApOworCisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SRV9TVElQUExFX0FERFIsIDAgKSApOworCU9VVF9SSU5HKCAweDAwMDAwMDAwICk7CisKKwlPVVRfUklORyggQ1BfUEFDS0VUMF9UQUJMRSggUkFERU9OX1JFX1NUSVBQTEVfREFUQSwgMzEgKSApOworCWZvciAoIGkgPSAwIDsgaSA8IDMyIDsgaSsrICkgeworCQlPVVRfUklORyggc3RpcHBsZVtpXSApOworCX0KKworCUFEVkFOQ0VfUklORygpOworfQorCitzdGF0aWMgdm9pZCByYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKGludCBzdXJmX2luZGV4LCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYpCit7CisJaWYgKCFkZXZfcHJpdi0+bW1pbykKKwkJcmV0dXJuOworCisJcmFkZW9uX2RvX2NwX2lkbGUoZGV2X3ByaXYpOworCisJUkFERU9OX1dSSVRFKFJBREVPTl9TVVJGQUNFMF9JTkZPICsgMTYqc3VyZl9pbmRleCwKKwkJZGV2X3ByaXYtPnN1cmZhY2VzW3N1cmZfaW5kZXhdLmZsYWdzKTsKKwlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX0xPV0VSX0JPVU5EICsgMTYqc3VyZl9pbmRleCwKKwkJZGV2X3ByaXYtPnN1cmZhY2VzW3N1cmZfaW5kZXhdLmxvd2VyKTsKKwlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX1VQUEVSX0JPVU5EICsgMTYqc3VyZl9pbmRleCwKKwkJZGV2X3ByaXYtPnN1cmZhY2VzW3N1cmZfaW5kZXhdLnVwcGVyKTsKK30KKworCisvKiBBbGxvY2F0ZXMgYSB2aXJ0dWFsIHN1cmZhY2UKKyAqIGRvZXNuJ3QgYWx3YXlzIGFsbG9jYXRlIGEgcmVhbCBzdXJmYWNlLCB3aWxsIHN0cmV0Y2ggYW4gZXhpc3RpbmcgCisgKiBzdXJmYWNlIHdoZW4gcG9zc2libGUuCisgKgorICogTm90ZSB0aGF0IHJlZmNvdW50IGNhbiBiZSBhdCBtb3N0IDIsIHNpbmNlIGR1cmluZyBhIGZyZWUgcmVmY291bnQ9MworICogbWlnaHQgbWVhbiB3ZSBoYXZlIHRvIGFsbG9jYXRlIGEgbmV3IHN1cmZhY2Ugd2hpY2ggbWlnaHQgbm90IGFsd2F5cworICogYmUgYXZhaWxhYmxlLgorICogRm9yIGV4YW1wbGUgOiB3ZSBhbGxvY2F0ZSB0aHJlZSBjb250aWdvdXMgc3VyZmFjZXMgQUJDLiBJZiBCIGlzIAorICogZnJlZWQsIHdlIHN1ZGRlbmx5IG5lZWQgdHdvIHN1cmZhY2VzIHRvIHN0b3JlIEEgYW5kIEMsIHdoaWNoIG1pZ2h0CisgKiBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGludCBhbGxvY19zdXJmYWNlKGRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190KiBuZXcsIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwgRFJNRklMRSBmaWxwKQoreworCXN0cnVjdCByYWRlb25fdmlydF9zdXJmYWNlICpzOworCWludCBpOworCWludCB2aXJ0X3N1cmZhY2VfaW5kZXg7CisJdWludDMyX3QgbmV3X3VwcGVyLCBuZXdfbG93ZXI7CisKKwluZXdfbG93ZXIgPSBuZXctPmFkZHJlc3M7CisJbmV3X3VwcGVyID0gbmV3X2xvd2VyICsgbmV3LT5zaXplIC0gMTsKKworCS8qIHNhbml0eSBjaGVjayAqLworCWlmICgobmV3X2xvd2VyID49IG5ld191cHBlcikgfHwgKG5ldy0+ZmxhZ3MgPT0gMCkgfHwgKG5ldy0+c2l6ZSA9PSAwKSB8fAorCQkoKG5ld191cHBlciAmIFJBREVPTl9TVVJGX0FERFJFU1NfRklYRURfTUFTSykgIT0gUkFERU9OX1NVUkZfQUREUkVTU19GSVhFRF9NQVNLKSB8fAorCQkoKG5ld19sb3dlciAmIFJBREVPTl9TVVJGX0FERFJFU1NfRklYRURfTUFTSykgIT0gMCkpCisJCXJldHVybiAtMTsKKworCS8qIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBvdmVybGFwIHdpdGggZXhpc3Rpbmcgc3VyZmFjZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKSB7CisJCWlmICgoZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ICE9IDApICYmCisJCSgoIChuZXdfbG93ZXIgPj0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyKSAmJgorCQkJKG5ld19sb3dlciA8IGRldl9wcml2LT5zdXJmYWNlc1tpXS51cHBlcikgKSB8fAorCQkgKCAobmV3X2xvd2VyIDwgZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyKSAmJgorCQkJKG5ld191cHBlciA+IGRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlcikgKSkgKXsKKwkJcmV0dXJuIC0xO30KKwl9CisKKwkvKiBmaW5kIGEgdmlydHVhbCBzdXJmYWNlICovCisJZm9yIChpID0gMDsgaSA8IDIqUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKQorCQlpZiAoZGV2X3ByaXYtPnZpcnRfc3VyZmFjZXNbaV0uZmlscCA9PSAwKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gMipSQURFT05fTUFYX1NVUkZBQ0VTKSB7CisJCXJldHVybiAtMTt9CisJdmlydF9zdXJmYWNlX2luZGV4ID0gaTsKKworCS8qIHRyeSB0byByZXVzZSBhbiBleGlzdGluZyBzdXJmYWNlICovCisJZm9yIChpID0gMDsgaSA8IFJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykgeworCQkvKiBleHRlbmQgYmVmb3JlICovCisJCWlmICgoZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ID09IDEpICYmCisJCSAgKG5ldy0+ZmxhZ3MgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmZsYWdzKSAmJgorCQkgIChuZXdfdXBwZXIgKyAxID09IGRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlcikpIHsKKwkJCXMgPSAmKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW3ZpcnRfc3VyZmFjZV9pbmRleF0pOworCQkJcy0+c3VyZmFjZV9pbmRleCA9IGk7CisJCQlzLT5sb3dlciA9IG5ld19sb3dlcjsKKwkJCXMtPnVwcGVyID0gbmV3X3VwcGVyOworCQkJcy0+ZmxhZ3MgPSBuZXctPmZsYWdzOworCQkJcy0+ZmlscCA9IGZpbHA7CisJCQlkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQrKzsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlciA9IHMtPmxvd2VyOworCQkJcmFkZW9uX2FwcGx5X3N1cmZhY2VfcmVncyhzLT5zdXJmYWNlX2luZGV4LCBkZXZfcHJpdik7CisJCQlyZXR1cm4gdmlydF9zdXJmYWNlX2luZGV4OworCQl9CisKKwkJLyogZXh0ZW5kIGFmdGVyICovCisJCWlmICgoZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ID09IDEpICYmCisJCSAgKG5ldy0+ZmxhZ3MgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmZsYWdzKSAmJgorCQkgIChuZXdfbG93ZXIgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnVwcGVyICsgMSkpIHsKKwkJCXMgPSAmKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW3ZpcnRfc3VyZmFjZV9pbmRleF0pOworCQkJcy0+c3VyZmFjZV9pbmRleCA9IGk7CisJCQlzLT5sb3dlciA9IG5ld19sb3dlcjsKKwkJCXMtPnVwcGVyID0gbmV3X3VwcGVyOworCQkJcy0+ZmxhZ3MgPSBuZXctPmZsYWdzOworCQkJcy0+ZmlscCA9IGZpbHA7CisJCQlkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQrKzsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS51cHBlciA9IHMtPnVwcGVyOworCQkJcmFkZW9uX2FwcGx5X3N1cmZhY2VfcmVncyhzLT5zdXJmYWNlX2luZGV4LCBkZXZfcHJpdik7CisJCQlyZXR1cm4gdmlydF9zdXJmYWNlX2luZGV4OworCQl9CisJfQorCisJLyogb2theSwgd2UgbmVlZCBhIG5ldyBvbmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKSB7CisJCWlmIChkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQgPT0gMCkgeworCQkJcyA9ICYoZGV2X3ByaXYtPnZpcnRfc3VyZmFjZXNbdmlydF9zdXJmYWNlX2luZGV4XSk7CisJCQlzLT5zdXJmYWNlX2luZGV4ID0gaTsKKwkJCXMtPmxvd2VyID0gbmV3X2xvd2VyOworCQkJcy0+dXBwZXIgPSBuZXdfdXBwZXI7CisJCQlzLT5mbGFncyA9IG5ldy0+ZmxhZ3M7CisJCQlzLT5maWxwID0gZmlscDsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS5yZWZjb3VudCA9IDE7CisJCQlkZXZfcHJpdi0+c3VyZmFjZXNbaV0ubG93ZXIgPSBzLT5sb3dlcjsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS51cHBlciA9IHMtPnVwcGVyOworCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmZsYWdzID0gcy0+ZmxhZ3M7CisJCQlyYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKHMtPnN1cmZhY2VfaW5kZXgsIGRldl9wcml2KTsKKwkJCXJldHVybiB2aXJ0X3N1cmZhY2VfaW5kZXg7CisJCX0KKwl9CisKKwkvKiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyAqLworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBmcmVlX3N1cmZhY2UoRFJNRklMRSBmaWxwLCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBsb3dlcikKK3sKKwlzdHJ1Y3QgcmFkZW9uX3ZpcnRfc3VyZmFjZSAqczsKKwlpbnQgaTsKKwkvKiBmaW5kIHRoZSB2aXJ0dWFsIHN1cmZhY2UgKi8KKwlmb3IoaSA9IDA7IGkgPCAyKlJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykgeworCQlzID0gJihkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1tpXSk7CisJCWlmIChzLT5maWxwKSB7CisJCQlpZiAoKGxvd2VyID09IHMtPmxvd2VyKSAmJiAoZmlscCA9PSBzLT5maWxwKSkgeworCQkJCWlmIChkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0ubG93ZXIgPT0gcy0+bG93ZXIpCisJCQkJCWRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS5sb3dlciA9IHMtPnVwcGVyOworCisJCQkJaWYgKGRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS51cHBlciA9PSBzLT51cHBlcikKKwkJCQkJZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLnVwcGVyID0gcy0+bG93ZXI7CisKKwkJCQlkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0ucmVmY291bnQtLTsKKwkJCQlpZiAoZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLnJlZmNvdW50ID09IDApCisJCQkJCWRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS5mbGFncyA9IDA7CisJCQkJcy0+ZmlscCA9IE5VTEw7CisJCQkJcmFkZW9uX2FwcGx5X3N1cmZhY2VfcmVncyhzLT5zdXJmYWNlX2luZGV4LCBkZXZfcHJpdik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9zdXJmYWNlc19yZWxlYXNlKERSTUZJTEUgZmlscCwgZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2KQoreworCWludCBpOworCWZvciggaSA9IDA7IGkgPCAyKlJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykKKwl7CisJCWlmIChkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1tpXS5maWxwID09IGZpbHApCisJCQlmcmVlX3N1cmZhY2UoZmlscCwgZGV2X3ByaXYsIGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW2ldLmxvd2VyKTsKKwl9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIElPQ1RMIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW50IHJhZGVvbl9zdXJmYWNlX2FsbG9jKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdCBhbGxvYzsKKworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChhbGxvYywgKGRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190IF9fdXNlciAqKWRhdGEsCisJCQkJICBzaXplb2YoYWxsb2MpKTsKKworCWlmIChhbGxvY19zdXJmYWNlKCZhbGxvYywgZGV2X3ByaXYsIGZpbHApID09IC0xKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX3N1cmZhY2VfZnJlZShEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9zdXJmYWNlX2ZyZWVfdCBtZW1mcmVlOworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKG1lbWZyZWUsIChkcm1fcmFkZW9uX21lbV9mcmVlX3QgX191c2VyICopZGF0YSwKKwkJCQkgIHNpemVvZihtZW1mcmVlKSApOworCisJaWYgKGZyZWVfc3VyZmFjZShmaWxwLCBkZXZfcHJpdiwgbWVtZnJlZS5hZGRyZXNzKSkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF9jbGVhciggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fcmFkZW9uX2NsZWFyX3QgY2xlYXI7CisJZHJtX3JhZGVvbl9jbGVhcl9yZWN0X3QgZGVwdGhfYm94ZXNbUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUU107CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBjbGVhciwgKGRybV9yYWRlb25fY2xlYXJfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YoY2xlYXIpICk7CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlpZiAoIHNhcmVhX3ByaXYtPm5ib3ggPiBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTICkKKwkJc2FyZWFfcHJpdi0+bmJveCA9IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJmRlcHRoX2JveGVzLCBjbGVhci5kZXB0aF9ib3hlcywKKwkJCSAgICAgc2FyZWFfcHJpdi0+bmJveCAqIHNpemVvZihkZXB0aF9ib3hlc1swXSkgKSApCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwlyYWRlb25fY3BfZGlzcGF0Y2hfY2xlYXIoIGRldiwgJmNsZWFyLCBkZXB0aF9ib3hlcyApOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBOb3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBzZXQgYWxsIHRoZSB0aW1lOgorICovIAorc3RhdGljIGludCByYWRlb25fZG9faW5pdF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUJFR0lOX1JJTkcoIDYgKTsKKwlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9DUlRDX09GRlNFVF9DTlRMLCAwICkgKTsKKwlPVVRfUklORyggUkFERU9OX1JFQUQoIFJBREVPTl9DUlRDX09GRlNFVF9DTlRMICkgfCBSQURFT05fQ1JUQ19PRkZTRVRfRkxJUF9DTlRMICk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9DUlRDMl9PRkZTRVRfQ05UTCwgMCApICk7CisJT1VUX1JJTkcoIFJBREVPTl9SRUFEKCBSQURFT05fQ1JUQzJfT0ZGU0VUX0NOVEwgKSB8IFJBREVPTl9DUlRDX09GRlNFVF9GTElQX0NOVEwgKTsKKwlBRFZBTkNFX1JJTkcoKTsKKworCWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nID0gMTsKKwlkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0gMDsKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdoZW5ldmVyIGEgY2xpZW50IGRpZXMsIGZyb20gZHJtX3JlbGVhc2UuCisgKiBOT1RFOiAgTG9jayBpc24ndCBuZWNlc3NhcmlseSBoZWxkIHdoZW4gdGhpcyBpcyBjYWxsZWQhCisgKi8KK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2NsZWFudXBfcGFnZWZsaXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCURSTV9ERUJVRyggIlxuIiApOworCisJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgIT0gMCkKKwkJcmFkZW9uX2NwX2Rpc3BhdGNoX2ZsaXAoIGRldiApOworCisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAwOworCXJldHVybiAwOworfQorCisvKiBTd2FwcGluZyBhbmQgZmxpcHBpbmcgYXJlIGRpZmZlcmVudCBvcGVyYXRpb25zLCBuZWVkIGRpZmZlcmVudCBpb2N0bHMuCisgKiBUaGV5IGNhbiAmIHNob3VsZCBiZSBpbnRlcm1peGVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgM2Qgd2luZG93cy4gIAorICovCitzdGF0aWMgaW50IHJhZGVvbl9jcF9mbGlwKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCURSTV9ERUJVRyggIlxuIiApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWlmICghZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcpIAorCQlyYWRlb25fZG9faW5pdF9wYWdlZmxpcCggZGV2ICk7CisJCQorCXJhZGVvbl9jcF9kaXNwYXRjaF9mbGlwKCBkZXYgKTsKKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX3N3YXAoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJaWYgKCBzYXJlYV9wcml2LT5uYm94ID4gUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUUyApCisJCXNhcmVhX3ByaXYtPm5ib3ggPSBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJcmFkZW9uX2NwX2Rpc3BhdGNoX3N3YXAoIGRldiApOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3BfdmVydGV4KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fcmFkZW9uX3ZlcnRleF90IHZlcnRleDsKKwlkcm1fcmFkZW9uX3RjbF9wcmltX3QgcHJpbTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oIGZpbHBfcHJpdiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCB2ZXJ0ZXgsIChkcm1fcmFkZW9uX3ZlcnRleF90IF9fdXNlciAqKWRhdGEsCisJCQkgICAgIHNpemVvZih2ZXJ0ZXgpICk7CisKKwlEUk1fREVCVUcoICJwaWQ9JWQgaW5kZXg9JWQgY291bnQ9JWQgZGlzY2FyZD0lZFxuIiwKKwkJICAgRFJNX0NVUlJFTlRQSUQsCisJCSAgIHZlcnRleC5pZHgsIHZlcnRleC5jb3VudCwgdmVydGV4LmRpc2NhcmQgKTsKKworCWlmICggdmVydGV4LmlkeCA8IDAgfHwgdmVydGV4LmlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJRFJNX0VSUk9SKCAiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJICAgdmVydGV4LmlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggdmVydGV4LnByaW0gPCAwIHx8CisJICAgICB2ZXJ0ZXgucHJpbSA+IFJBREVPTl9QUklNX1RZUEVfM1ZSVF9MSU5FX0xJU1QgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBwcmltICVkXG4iLCB2ZXJ0ZXgucHJpbSApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKwlWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWJ1ZiA9IGRtYS0+YnVmbGlzdFt2ZXJ0ZXguaWR4XTsKKworCWlmICggYnVmLT5maWxwICE9IGZpbHAgKSB7CisJCURSTV9FUlJPUiggInByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG93bmVkIGJ5ICVwXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGJ1Zi0+cGVuZGluZyApIHsKKwkJRFJNX0VSUk9SKCAic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgdmVydGV4LmlkeCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCS8qIEJ1aWxkIHVwIGEgcHJpbV90IHJlY29yZDoKKwkgKi8KKwlpZiAodmVydGV4LmNvdW50KSB7CisJCWJ1Zi0+dXNlZCA9IHZlcnRleC5jb3VudDsgLyogbm90IHVzZWQ/ICovCisKKwkJaWYgKCBzYXJlYV9wcml2LT5kaXJ0eSAmIH5SQURFT05fVVBMT0FEX0NMSVBSRUNUUyApIHsKKwkJCWlmICggcmFkZW9uX2VtaXRfc3RhdGUoIGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZSwKKwkJCQkJCXNhcmVhX3ByaXYtPnRleF9zdGF0ZSwKKwkJCQkJCXNhcmVhX3ByaXYtPmRpcnR5ICkgKSB7CisJCQkJRFJNX0VSUk9SKCAicmFkZW9uX2VtaXRfc3RhdGUgZmFpbGVkXG4iICk7CisJCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQkJfQorCisJCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+KFJBREVPTl9VUExPQURfVEVYMElNQUdFUyB8CisJCQkJCSAgICAgICBSQURFT05fVVBMT0FEX1RFWDFJTUFHRVMgfAorCQkJCQkgICAgICAgUkFERU9OX1VQTE9BRF9URVgySU1BR0VTIHwKKwkJCQkJICAgICAgIFJBREVPTl9SRVFVSVJFX1FVSUVTQ0VOQ0UpOworCQl9CisKKwkJcHJpbS5zdGFydCA9IDA7CisJCXByaW0uZmluaXNoID0gdmVydGV4LmNvdW50OyAvKiB1bnVzZWQgKi8KKwkJcHJpbS5wcmltID0gdmVydGV4LnByaW07CisJCXByaW0ubnVtdmVydHMgPSB2ZXJ0ZXguY291bnQ7CisJCXByaW0udmNfZm9ybWF0ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnZjX2Zvcm1hdDsKKwkJCisJCXJhZGVvbl9jcF9kaXNwYXRjaF92ZXJ0ZXgoIGRldiwgYnVmLCAmcHJpbSApOworCX0KKworCWlmICh2ZXJ0ZXguZGlzY2FyZCkgeworCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisJfQorCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3BfaW5kaWNlcyggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3JhZGVvbl9pbmRpY2VzX3QgZWx0czsKKwlkcm1fcmFkZW9uX3RjbF9wcmltX3QgcHJpbTsKKwlpbnQgY291bnQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oIGZpbHBfcHJpdiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBlbHRzLCAoZHJtX3JhZGVvbl9pbmRpY2VzX3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKGVsdHMpICk7CisKKwlEUk1fREVCVUcoICJwaWQ9JWQgaW5kZXg9JWQgc3RhcnQ9JWQgZW5kPSVkIGRpc2NhcmQ9JWRcbiIsCisJCSAgIERSTV9DVVJSRU5UUElELAorCQkgICBlbHRzLmlkeCwgZWx0cy5zdGFydCwgZWx0cy5lbmQsIGVsdHMuZGlzY2FyZCApOworCisJaWYgKCBlbHRzLmlkeCA8IDAgfHwgZWx0cy5pZHggPj0gZG1hLT5idWZfY291bnQgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCSAgIGVsdHMuaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCBlbHRzLnByaW0gPCAwIHx8CisJICAgICBlbHRzLnByaW0gPiBSQURFT05fUFJJTV9UWVBFXzNWUlRfTElORV9MSVNUICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgcHJpbSAlZFxuIiwgZWx0cy5wcmltICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJYnVmID0gZG1hLT5idWZsaXN0W2VsdHMuaWR4XTsKKworCWlmICggYnVmLT5maWxwICE9IGZpbHAgKSB7CisJCURSTV9FUlJPUiggInByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG93bmVkIGJ5ICVwXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGJ1Zi0+cGVuZGluZyApIHsKKwkJRFJNX0VSUk9SKCAic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgZWx0cy5pZHggKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwljb3VudCA9IChlbHRzLmVuZCAtIGVsdHMuc3RhcnQpIC8gc2l6ZW9mKHUxNik7CisJZWx0cy5zdGFydCAtPSBSQURFT05fSU5ERVhfUFJJTV9PRkZTRVQ7CisKKwlpZiAoIGVsdHMuc3RhcnQgJiAweDcgKSB7CisJCURSTV9FUlJPUiggIm1pc2FsaWduZWQgYnVmZmVyIDB4JXhcbiIsIGVsdHMuc3RhcnQgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCBlbHRzLnN0YXJ0IDwgYnVmLT51c2VkICkgeworCQlEUk1fRVJST1IoICJubyBoZWFkZXIgMHgleCAtIDB4JXhcbiIsIGVsdHMuc3RhcnQsIGJ1Zi0+dXNlZCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWJ1Zi0+dXNlZCA9IGVsdHMuZW5kOworCisJaWYgKCBzYXJlYV9wcml2LT5kaXJ0eSAmIH5SQURFT05fVVBMT0FEX0NMSVBSRUNUUyApIHsKKwkJaWYgKCByYWRlb25fZW1pdF9zdGF0ZSggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGUsCisJCQkJCXNhcmVhX3ByaXYtPnRleF9zdGF0ZSwKKwkJCQkJc2FyZWFfcHJpdi0+ZGlydHkgKSApIHsKKwkJCURSTV9FUlJPUiggInJhZGVvbl9lbWl0X3N0YXRlIGZhaWxlZFxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfihSQURFT05fVVBMT0FEX1RFWDBJTUFHRVMgfAorCQkJCSAgICAgICBSQURFT05fVVBMT0FEX1RFWDFJTUFHRVMgfAorCQkJCSAgICAgICBSQURFT05fVVBMT0FEX1RFWDJJTUFHRVMgfAorCQkJCSAgICAgICBSQURFT05fUkVRVUlSRV9RVUlFU0NFTkNFKTsKKwl9CisKKworCS8qIEJ1aWxkIHVwIGEgcHJpbV90IHJlY29yZDoKKwkgKi8KKwlwcmltLnN0YXJ0ID0gZWx0cy5zdGFydDsKKwlwcmltLmZpbmlzaCA9IGVsdHMuZW5kOyAKKwlwcmltLnByaW0gPSBlbHRzLnByaW07CisJcHJpbS5vZmZzZXQgPSAwOwkvKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBkbWEgYnVmZmVycyAqLworCXByaW0ubnVtdmVydHMgPSBSQURFT05fTUFYX1ZCX1ZFUlRTOyAvKiBkdWggKi8KKwlwcmltLnZjX2Zvcm1hdCA9IGRldl9wcml2LT5zYXJlYV9wcml2LT52Y19mb3JtYXQ7CisJCisJcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoIGRldiwgYnVmLCAmcHJpbSApOworCWlmIChlbHRzLmRpc2NhcmQpIHsKKwkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKCBkZXYsIGJ1ZiApOworCX0KKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX3RleHR1cmUoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl90ZXh0dXJlX3QgdGV4OworCWRybV9yYWRlb25fdGV4X2ltYWdlX3QgaW1hZ2U7CisJaW50IHJldDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHRleCwgKGRybV9yYWRlb25fdGV4dHVyZV90IF9fdXNlciAqKWRhdGEsIHNpemVvZih0ZXgpICk7CisKKwlpZiAoIHRleC5pbWFnZSA9PSBOVUxMICkgeworCQlEUk1fRVJST1IoICJudWxsIHRleHR1cmUgaW1hZ2UhXG4iICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoICZpbWFnZSwKKwkJCSAgICAgKGRybV9yYWRlb25fdGV4X2ltYWdlX3QgX191c2VyICopdGV4LmltYWdlLAorCQkJICAgICBzaXplb2YoaW1hZ2UpICkgKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJcmV0ID0gcmFkZW9uX2NwX2Rpc3BhdGNoX3RleHR1cmUoIGZpbHAsIGRldiwgJnRleCwgJmltYWdlICk7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX3N0aXBwbGUoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9zdGlwcGxlX3Qgc3RpcHBsZTsKKwl1MzIgbWFza1szMl07CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBzdGlwcGxlLCAoZHJtX3JhZGVvbl9zdGlwcGxlX3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHN0aXBwbGUpICk7CisKKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJm1hc2ssIHN0aXBwbGUubWFzaywgMzIgKiBzaXplb2YodTMyKSApICkKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCXJhZGVvbl9jcF9kaXNwYXRjaF9zdGlwcGxlKCBkZXYsIG1hc2sgKTsKKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2luZGlyZWN0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdCAqYnVmOworCWRybV9yYWRlb25faW5kaXJlY3RfdCBpbmRpcmVjdDsKKwlSSU5HX0xPQ0FMUzsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggaW5kaXJlY3QsIChkcm1fcmFkZW9uX2luZGlyZWN0X3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKGluZGlyZWN0KSApOworCisJRFJNX0RFQlVHKCAiaW5kaXJlY3Q6IGlkeD0lZCBzPSVkIGU9JWQgZD0lZFxuIiwKKwkJICAgaW5kaXJlY3QuaWR4LCBpbmRpcmVjdC5zdGFydCwKKwkJICAgaW5kaXJlY3QuZW5kLCBpbmRpcmVjdC5kaXNjYXJkICk7CisKKwlpZiAoIGluZGlyZWN0LmlkeCA8IDAgfHwgaW5kaXJlY3QuaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkgICBpbmRpcmVjdC5pZHgsIGRtYS0+YnVmX2NvdW50IC0gMSApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpbmRpcmVjdC5pZHhdOworCisJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJRFJNX0VSUk9SKCAicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggYnVmLT5wZW5kaW5nICkgeworCQlEUk1fRVJST1IoICJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCBpbmRpcmVjdC5pZHggKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIGluZGlyZWN0LnN0YXJ0IDwgYnVmLT51c2VkICkgeworCQlEUk1fRVJST1IoICJyZXVzaW5nIGluZGlyZWN0OiBzdGFydD0weCV4IGFjdHVhbD0weCV4XG4iLAorCQkJICAgaW5kaXJlY3Quc3RhcnQsIGJ1Zi0+dXNlZCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKwlWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWJ1Zi0+dXNlZCA9IGluZGlyZWN0LmVuZDsKKworCS8qIFdhaXQgZm9yIHRoZSAzRCBzdHJlYW0gdG8gaWRsZSBiZWZvcmUgdGhlIGluZGlyZWN0IGJ1ZmZlcgorCSAqIGNvbnRhaW5pbmcgMkQgYWNjZWxlcmF0aW9uIGNvbW1hbmRzIGlzIHByb2Nlc3NlZC4KKwkgKi8KKwlCRUdJTl9SSU5HKCAyICk7CisKKwlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CisKKwlBRFZBTkNFX1JJTkcoKTsKKworCS8qIERpc3BhdGNoIHRoZSBpbmRpcmVjdCBidWZmZXIgZnVsbCBvZiBjb21tYW5kcyBmcm9tIHRoZQorCSAqIFggc2VydmVyLiAgVGhpcyBpcyBpbnNlY3VyZSBhbmQgaXMgdGh1cyBvbmx5IGF2YWlsYWJsZSB0bworCSAqIHByaXZpbGVnZWQgY2xpZW50cy4KKwkgKi8KKwlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaXJlY3QoIGRldiwgYnVmLCBpbmRpcmVjdC5zdGFydCwgaW5kaXJlY3QuZW5kICk7CisJaWYgKGluZGlyZWN0LmRpc2NhcmQpIHsKKwkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKCBkZXYsIGJ1ZiApOworCX0KKworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3BfdmVydGV4MiggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3JhZGVvbl92ZXJ0ZXgyX3QgdmVydGV4OworCWludCBpOworCXVuc2lnbmVkIGNoYXIgbGFzdHN0YXRlOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKCBmaWxwX3ByaXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggdmVydGV4LCAoZHJtX3JhZGVvbl92ZXJ0ZXgyX3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHZlcnRleCkgKTsKKworCURSTV9ERUJVRyggInBpZD0lZCBpbmRleD0lZCBkaXNjYXJkPSVkXG4iLAorCQkgICBEUk1fQ1VSUkVOVFBJRCwKKwkJICAgdmVydGV4LmlkeCwgdmVydGV4LmRpc2NhcmQgKTsKKworCWlmICggdmVydGV4LmlkeCA8IDAgfHwgdmVydGV4LmlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJRFJNX0VSUk9SKCAiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJICAgdmVydGV4LmlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJYnVmID0gZG1hLT5idWZsaXN0W3ZlcnRleC5pZHhdOworCisJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJRFJNX0VSUk9SKCAicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKCBidWYtPnBlbmRpbmcgKSB7CisJCURSTV9FUlJPUiggInNlbmRpbmcgcGVuZGluZyBidWZmZXIgJWRcbiIsIHZlcnRleC5pZHggKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJCisJaWYgKHNhcmVhX3ByaXYtPm5ib3ggPiBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJZm9yIChsYXN0c3RhdGUgPSAweGZmLCBpID0gMCA7IGkgPCB2ZXJ0ZXgubnJfcHJpbXMgOyBpKyspIHsKKwkJZHJtX3JhZGVvbl9wcmltX3QgcHJpbTsKKwkJZHJtX3JhZGVvbl90Y2xfcHJpbV90IHRjbHByaW07CisJCQorCQlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJnByaW0sICZ2ZXJ0ZXgucHJpbVtpXSwgc2l6ZW9mKHByaW0pICkgKQorCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCisJCWlmICggcHJpbS5zdGF0ZWlkeCAhPSBsYXN0c3RhdGUgKSB7CisJCQlkcm1fcmFkZW9uX3N0YXRlX3Qgc3RhdGU7CQkJICAgICAgIAorCQkJCQorCQkJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoICZzdGF0ZSwgCisJCQkJCSAgICAgJnZlcnRleC5zdGF0ZVtwcmltLnN0YXRlaWR4XSwgCisJCQkJCSAgICAgc2l6ZW9mKHN0YXRlKSApICkKKwkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJCQlpZiAoIHJhZGVvbl9lbWl0X3N0YXRlMiggZGV2X3ByaXYsIGZpbHBfcHJpdiwgJnN0YXRlICkgKSB7CisJCQkJRFJNX0VSUk9SKCAicmFkZW9uX2VtaXRfc3RhdGUyIGZhaWxlZFxuIiApOworCQkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJCX0KKworCQkJbGFzdHN0YXRlID0gcHJpbS5zdGF0ZWlkeDsKKwkJfQorCisJCXRjbHByaW0uc3RhcnQgPSBwcmltLnN0YXJ0OworCQl0Y2xwcmltLmZpbmlzaCA9IHByaW0uZmluaXNoOworCQl0Y2xwcmltLnByaW0gPSBwcmltLnByaW07CisJCXRjbHByaW0udmNfZm9ybWF0ID0gcHJpbS52Y19mb3JtYXQ7CisKKwkJaWYgKCBwcmltLnByaW0gJiBSQURFT05fUFJJTV9XQUxLX0lORCApIHsKKwkJCXRjbHByaW0ub2Zmc2V0ID0gcHJpbS5udW12ZXJ0cyAqIDY0OworCQkJdGNscHJpbS5udW12ZXJ0cyA9IFJBREVPTl9NQVhfVkJfVkVSVFM7IC8qIGR1aCAqLworCisJCQlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyggZGV2LCBidWYsICZ0Y2xwcmltICk7CisJCX0gZWxzZSB7CisJCQl0Y2xwcmltLm51bXZlcnRzID0gcHJpbS5udW12ZXJ0czsKKwkJCXRjbHByaW0ub2Zmc2V0ID0gMDsgLyogbm90IHVzZWQgKi8KKworCQkJcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleCggZGV2LCBidWYsICZ0Y2xwcmltICk7CisJCX0KKwkJCisJCWlmIChzYXJlYV9wcml2LT5uYm94ID09IDEpCisJCQlzYXJlYV9wcml2LT5uYm94ID0gMDsKKwl9CisKKwlpZiAoIHZlcnRleC5kaXNjYXJkICkgeworCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisJfQorCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldHMoIAorCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwlkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyLAorCWRybV9yYWRlb25fY21kX2J1ZmZlcl90ICpjbWRidWYgKQoreworCWludCBpZCA9IChpbnQpaGVhZGVyLnBhY2tldC5wYWNrZXRfaWQ7CisJaW50IHN6LCByZWc7CisJaW50ICpkYXRhID0gKGludCAqKWNtZGJ1Zi0+YnVmOworCVJJTkdfTE9DQUxTOworICAgCisJaWYgKGlkID49IFJBREVPTl9NQVhfU1RBVEVfUEFDS0VUUykKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCXN6ID0gcGFja2V0W2lkXS5sZW47CisJcmVnID0gcGFja2V0W2lkXS5zdGFydDsKKworCWlmIChzeiAqIHNpemVvZihpbnQpID4gY21kYnVmLT5idWZzeikgeworCQlEUk1fRVJST1IoICJQYWNrZXQgc2l6ZSBwcm92aWRlZCBsYXJnZXIgdGhhbiBkYXRhIHByb3ZpZGVkXG4iICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldHMoIGRldl9wcml2LCBmaWxwX3ByaXYsIGlkLCBkYXRhICkgKSB7CisJCURSTV9FUlJPUiggIlBhY2tldCB2ZXJpZmljYXRpb24gZmFpbGVkXG4iICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwlCRUdJTl9SSU5HKHN6KzEpOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCByZWcsIChzei0xKSApICk7CisJT1VUX1JJTkdfVEFCTEUoIGRhdGEsIHN6ICk7CisJQURWQU5DRV9SSU5HKCk7CisKKwljbWRidWYtPmJ1ZiArPSBzeiAqIHNpemVvZihpbnQpOworCWNtZGJ1Zi0+YnVmc3ogLT0gc3ogKiBzaXplb2YoaW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3NjYWxhcnMoIAorCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCisJZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKmNtZGJ1ZiApCit7CisJaW50IHN6ID0gaGVhZGVyLnNjYWxhcnMuY291bnQ7CisJaW50IHN0YXJ0ID0gaGVhZGVyLnNjYWxhcnMub2Zmc2V0OworCWludCBzdHJpZGUgPSBoZWFkZXIuc2NhbGFycy5zdHJpZGU7CisJUklOR19MT0NBTFM7CisKKwlCRUdJTl9SSU5HKCAzK3N6ICk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TRV9UQ0xfU0NBTEFSX0lORFhfUkVHLCAwICkgKTsKKwlPVVRfUklORyggc3RhcnQgfCAoc3RyaWRlIDw8IFJBREVPTl9TQ0FMX0lORFhfRFdPUkRfU1RSSURFX1NISUZUKSk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDBfVEFCTEUoIFJBREVPTl9TRV9UQ0xfU0NBTEFSX0RBVEFfUkVHLCBzei0xICkgKTsKKwlPVVRfUklOR19UQUJMRSggY21kYnVmLT5idWYsIHN6ICk7CisJQURWQU5DRV9SSU5HKCk7CisJY21kYnVmLT5idWYgKz0gc3ogKiBzaXplb2YoaW50KTsKKwljbWRidWYtPmJ1ZnN6IC09IHN6ICogc2l6ZW9mKGludCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEdvZCB0aGlzIGlzIHVnbHkKKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3NjYWxhcnMyKCAKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyLAorCWRybV9yYWRlb25fY21kX2J1ZmZlcl90ICpjbWRidWYgKQoreworCWludCBzeiA9IGhlYWRlci5zY2FsYXJzLmNvdW50OworCWludCBzdGFydCA9ICgodW5zaWduZWQgaW50KWhlYWRlci5zY2FsYXJzLm9mZnNldCkgKyAweDEwMDsKKwlpbnQgc3RyaWRlID0gaGVhZGVyLnNjYWxhcnMuc3RyaWRlOworCVJJTkdfTE9DQUxTOworCisJQkVHSU5fUklORyggMytzeiApOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfVENMX1NDQUxBUl9JTkRYX1JFRywgMCApICk7CisJT1VUX1JJTkcoIHN0YXJ0IHwgKHN0cmlkZSA8PCBSQURFT05fU0NBTF9JTkRYX0RXT1JEX1NUUklERV9TSElGVCkpOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwX1RBQkxFKCBSQURFT05fU0VfVENMX1NDQUxBUl9EQVRBX1JFRywgc3otMSApICk7CisJT1VUX1JJTkdfVEFCTEUoIGNtZGJ1Zi0+YnVmLCBzeiApOworCUFEVkFOQ0VfUklORygpOworCWNtZGJ1Zi0+YnVmICs9IHN6ICogc2l6ZW9mKGludCk7CisJY21kYnVmLT5idWZzeiAtPSBzeiAqIHNpemVvZihpbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2VtaXRfdmVjdG9ycyggCisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCWRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKKwlkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCAqY21kYnVmICkKK3sKKwlpbnQgc3ogPSBoZWFkZXIudmVjdG9ycy5jb3VudDsKKwlpbnQgc3RhcnQgPSBoZWFkZXIudmVjdG9ycy5vZmZzZXQ7CisJaW50IHN0cmlkZSA9IGhlYWRlci52ZWN0b3JzLnN0cmlkZTsKKwlSSU5HX0xPQ0FMUzsKKworCUJFR0lOX1JJTkcoIDMrc3ogKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX1RDTF9WRUNUT1JfSU5EWF9SRUcsIDAgKSApOworCU9VVF9SSU5HKCBzdGFydCB8IChzdHJpZGUgPDwgUkFERU9OX1ZFQ19JTkRYX09DVFdPUkRfU1RSSURFX1NISUZUKSk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDBfVEFCTEUoIFJBREVPTl9TRV9UQ0xfVkVDVE9SX0RBVEFfUkVHLCAoc3otMSkgKSApOworCU9VVF9SSU5HX1RBQkxFKCBjbWRidWYtPmJ1Ziwgc3ogKTsKKwlBRFZBTkNFX1JJTkcoKTsKKworCWNtZGJ1Zi0+YnVmICs9IHN6ICogc2l6ZW9mKGludCk7CisJY21kYnVmLT5idWZzeiAtPSBzeiAqIHNpemVvZihpbnQpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0MyggZHJtX2RldmljZV90ICpkZXYsCisJCQkJZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkJCWRybV9yYWRlb25fY21kX2J1ZmZlcl90ICpjbWRidWYgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IGNtZHN6OworCWludCByZXQ7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlpZiAoICggcmV0ID0gcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXQzKCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICBjbWRidWYsICZjbWRzeiApICkgKSB7CisJCURSTV9FUlJPUiggIlBhY2tldCB2ZXJpZmljYXRpb24gZmFpbGVkXG4iICk7CisJCXJldHVybiByZXQ7CisJfQorCisJQkVHSU5fUklORyggY21kc3ogKTsKKwlPVVRfUklOR19UQUJMRSggY21kYnVmLT5idWYsIGNtZHN6ICk7CisJQURWQU5DRV9SSU5HKCk7CisKKwljbWRidWYtPmJ1ZiArPSBjbWRzeiAqIDQ7CisJY21kYnVmLT5idWZzeiAtPSBjbWRzeiAqIDQ7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXQzX2NsaXByZWN0KCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKKwkJCQkJIGRybV9yYWRlb25fY21kX2J1ZmZlcl90ICpjbWRidWYsCisJCQkJCSBpbnQgb3JpZ19uYm94ICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9jbGlwX3JlY3RfdCBib3g7CisJdW5zaWduZWQgaW50IGNtZHN6OworCWludCByZXQ7CisJZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqYm94ZXMgPSBjbWRidWYtPmJveGVzOworCWludCBpID0gMDsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWlmICggKCByZXQgPSByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldDMoIGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkgICAgIGNtZGJ1ZiwgJmNtZHN6ICkgKSApIHsKKwkJRFJNX0VSUk9SKCAiUGFja2V0IHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIgKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIW9yaWdfbmJveCkKKwkJZ290byBvdXQ7CisKKwlkbyB7CisJCWlmICggaSA8IGNtZGJ1Zi0+bmJveCApIHsKKwkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoICZib3gsICZib3hlc1tpXSwgc2l6ZW9mKGJveCkgKSkKKwkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJLyogRklYTUUgVGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCB0aW1lcyByb3VuZAorCQkJICogdGhpcyBsb29wLCBzZW5kIGEgV0FJVF9VTlRJTF8zRF9JRExFIGJlZm9yZQorCQkJICogY2FsbGluZyBlbWl0X2NsaXBfcmVjdCgpLiBUaGlzIGZpeGVzIGEKKwkJCSAqIGxvY2t1cCBvbiBmYXN0IG1hY2hpbmVzIHdoZW4gc2VuZGluZworCQkJICogc2V2ZXJhbCBjbGlwcmVjdHMgd2l0aCBhIGNtZGJ1ZiwgYXMgd2hlbgorCQkJICogd2F2aW5nIGEgMkQgd2luZG93IG92ZXIgYSAzRAorCQkJICogd2luZG93LiBTb21ldGhpbmcgaW4gdGhlIGNvbW1hbmRzIGZyb20gdXNlcgorCQkJICogc3BhY2Ugc2VlbXMgdG8gaGFuZyB0aGUgY2FyZCB3aGVuIHRoZXkncmUKKwkJCSAqIHNlbnQgc2V2ZXJhbCB0aW1lcyBpbiBhIHJvdy4gVGhhdCB3b3VsZCBiZQorCQkJICogdGhlIGNvcnJlY3QgcGxhY2UgdG8gZml4IGl0IGJ1dCB0aGlzIHdvcmtzCisJCQkgKiBhcm91bmQgaXQgdW50aWwgSSBjYW4gZmlndXJlIHRoYXQgb3V0IC0gVGltCisJCQkgKiBTbWl0aCAqLworCQkJaWYgKCBpICkgeworCQkJCUJFR0lOX1JJTkcoIDIgKTsKKwkJCQlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CisJCQkJQURWQU5DRV9SSU5HKCk7CisJCQl9CisJCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoIGRldl9wcml2LCAmYm94ICk7CisJCX0KKwkJCisJCUJFR0lOX1JJTkcoIGNtZHN6ICk7CisJCU9VVF9SSU5HX1RBQkxFKCBjbWRidWYtPmJ1ZiwgY21kc3ogKTsKKwkJQURWQU5DRV9SSU5HKCk7CisKKwl9IHdoaWxlICggKytpIDwgY21kYnVmLT5uYm94ICk7CisgCWlmIChjbWRidWYtPm5ib3ggPT0gMSkKKwkJY21kYnVmLT5uYm94ID0gMDsKKworIG91dDoKKwljbWRidWYtPmJ1ZiArPSBjbWRzeiAqIDQ7CisJY21kYnVmLT5idWZzeiAtPSBjbWRzeiAqIDQ7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByYWRlb25fZW1pdF93YWl0KCBkcm1fZGV2aWNlX3QgKmRldiwgaW50IGZsYWdzICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCVJJTkdfTE9DQUxTOworCisJRFJNX0RFQlVHKCIlczogJXhcbiIsIF9fRlVOQ1RJT05fXywgZmxhZ3MpOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIFJBREVPTl9XQUlUXzJEOgorCQlCRUdJTl9SSU5HKCAyICk7CisJCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsgCisJCUFEVkFOQ0VfUklORygpOworCQlicmVhazsKKwljYXNlIFJBREVPTl9XQUlUXzNEOgorCQlCRUdJTl9SSU5HKCAyICk7CisJCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsgCisJCUFEVkFOQ0VfUklORygpOworCQlicmVhazsKKwljYXNlIFJBREVPTl9XQUlUXzJEfFJBREVPTl9XQUlUXzNEOgorCQlCRUdJTl9SSU5HKCAyICk7CisJCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsgCisJCUFEVkFOQ0VfUklORygpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF9jbWRidWYoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2ZpbGVfdCAqZmlscF9wcml2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdCAqYnVmID0gTlVMTDsKKwlpbnQgaWR4OworCWRybV9yYWRlb25fY21kX2J1ZmZlcl90IGNtZGJ1ZjsKKwlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXI7CisJaW50IG9yaWdfbmJveCwgb3JpZ19idWZzejsKKwljaGFyICprYnVmPU5VTEw7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oIGZpbHBfcHJpdiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBjbWRidWYsIChkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YoY21kYnVmKSApOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJaWYgKGNtZGJ1Zi5idWZzeiA+IDY0KjEwMjQgfHwgY21kYnVmLmJ1ZnN6PDApIHsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhbiBpbi1rZXJuZWwgYXJlYSBhbmQgY29weSBpbiB0aGUgY21kYnVmLiAgRG8gdGhpcyB0byBhdm9pZAorCSAqIHJhY2VzIGJldHdlZW4gY2hlY2tpbmcgdmFsdWVzIGFuZCB1c2luZyB0aG9zZSB2YWx1ZXMgaW4gb3RoZXIgY29kZSwKKwkgKiBhbmQgc2ltcGx5IHRvIGF2b2lkIGEgbG90IG9mIGZ1bmN0aW9uIGNhbGxzIHRvIGNvcHkgaW4gZGF0YS4KKwkgKi8KKwlvcmlnX2J1ZnN6ID0gY21kYnVmLmJ1ZnN6OworCWlmIChvcmlnX2J1ZnN6ICE9IDApIHsKKwkJa2J1ZiA9IGRybV9hbGxvYyhjbWRidWYuYnVmc3osIERSTV9NRU1fRFJJVkVSKTsKKwkJaWYgKGtidWYgPT0gTlVMTCkKKwkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoa2J1ZiwgY21kYnVmLmJ1ZiwgY21kYnVmLmJ1ZnN6KSkgeworCQkJZHJtX2ZyZWUoa2J1Ziwgb3JpZ19idWZzeiwgRFJNX01FTV9EUklWRVIpOworCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJfQorCQljbWRidWYuYnVmID0ga2J1ZjsKKwl9CisKKwlvcmlnX25ib3ggPSBjbWRidWYubmJveDsKKworCXdoaWxlICggY21kYnVmLmJ1ZnN6ID49IHNpemVvZihoZWFkZXIpICkgeworCisJCWhlYWRlci5pID0gKihpbnQgKiljbWRidWYuYnVmOworCQljbWRidWYuYnVmICs9IHNpemVvZihoZWFkZXIpOworCQljbWRidWYuYnVmc3ogLT0gc2l6ZW9mKGhlYWRlcik7CisKKwkJc3dpdGNoIChoZWFkZXIuaGVhZGVyLmNtZF90eXBlKSB7CisJCWNhc2UgUkFERU9OX0NNRF9QQUNLRVQ6IAorCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1BBQ0tFVFxuIik7CisJCQlpZiAocmFkZW9uX2VtaXRfcGFja2V0cyggZGV2X3ByaXYsIGZpbHBfcHJpdiwgaGVhZGVyLCAmY21kYnVmICkpIHsKKwkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3BhY2tldHMgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFERU9OX0NNRF9TQ0FMQVJTOgorCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1NDQUxBUlNcbiIpOworCQkJaWYgKHJhZGVvbl9lbWl0X3NjYWxhcnMoIGRldl9wcml2LCBoZWFkZXIsICZjbWRidWYgKSkgeworCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfc2NhbGFycyBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQURFT05fQ01EX1ZFQ1RPUlM6CisJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfVkVDVE9SU1xuIik7CisJCQlpZiAocmFkZW9uX2VtaXRfdmVjdG9ycyggZGV2X3ByaXYsIGhlYWRlciwgJmNtZGJ1ZiApKSB7CisJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF92ZWN0b3JzIGZhaWxlZFxuIik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBREVPTl9DTURfRE1BX0RJU0NBUkQ6CisJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfRE1BX0RJU0NBUkRcbiIpOworCQkJaWR4ID0gaGVhZGVyLmRtYS5idWZfaWR4OworCQkJaWYgKCBpZHggPCAwIHx8IGlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkJCSAgIGlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJCQkJZ290byBlcnI7CisJCQl9CisKKwkJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpZHhdOworCQkJaWYgKCBidWYtPmZpbHAgIT0gZmlscCB8fCBidWYtPnBlbmRpbmcgKSB7CisJCQkJRFJNX0VSUk9SKCAiYmFkIGJ1ZmZlciAlcCAlcCAlZFxuIiwKKwkJCQkJICAgYnVmLT5maWxwLCBmaWxwLCBidWYtPnBlbmRpbmcpOworCQkJCWdvdG8gZXJyOworCQkJfQorCisJCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisJCQlicmVhazsKKworCQljYXNlIFJBREVPTl9DTURfUEFDS0VUMzoKKwkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9QQUNLRVQzXG4iKTsKKwkJCWlmIChyYWRlb25fZW1pdF9wYWNrZXQzKCBkZXYsIGZpbHBfcHJpdiwgJmNtZGJ1ZiApKSB7CisJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9wYWNrZXQzIGZhaWxlZFxuIik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBREVPTl9DTURfUEFDS0VUM19DTElQOgorCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1BBQ0tFVDNfQ0xJUFxuIik7CisJCQlpZiAocmFkZW9uX2VtaXRfcGFja2V0M19jbGlwcmVjdCggZGV2LCBmaWxwX3ByaXYsICZjbWRidWYsIG9yaWdfbmJveCApKSB7CisJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9wYWNrZXQzX2NsaXAgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFERU9OX0NNRF9TQ0FMQVJTMjoKKwkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9TQ0FMQVJTMlxuIik7CisJCQlpZiAocmFkZW9uX2VtaXRfc2NhbGFyczIoIGRldl9wcml2LCBoZWFkZXIsICZjbWRidWYgKSkgeworCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfc2NhbGFyczIgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFERU9OX0NNRF9XQUlUOgorCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1dBSVRcbiIpOworCQkJaWYgKHJhZGVvbl9lbWl0X3dhaXQoIGRldiwgaGVhZGVyLndhaXQuZmxhZ3MgKSkgeworCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfd2FpdCBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUk1fRVJST1IoImJhZCBjbWRfdHlwZSAlZCBhdCAlcFxuIiwgCisJCQkJICBoZWFkZXIuaGVhZGVyLmNtZF90eXBlLAorCQkJCSAgY21kYnVmLmJ1ZiAtIHNpemVvZihoZWFkZXIpKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJaWYgKG9yaWdfYnVmc3ogIT0gMCkKKwkJZHJtX2ZyZWUoa2J1Ziwgb3JpZ19idWZzeiwgRFJNX01FTV9EUklWRVIpOworCisJRFJNX0RFQlVHKCJET05FXG4iKTsKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworCitlcnI6CisJaWYgKG9yaWdfYnVmc3ogIT0gMCkKKwkJZHJtX2ZyZWUoa2J1Ziwgb3JpZ19idWZzeiwgRFJNX01FTV9EUklWRVIpOworCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cit9CisKKworCitzdGF0aWMgaW50IHJhZGVvbl9jcF9nZXRwYXJhbSggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX2dldHBhcmFtX3QgcGFyYW07CisJaW50IHZhbHVlOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHBhcmFtLCAoZHJtX3JhZGVvbl9nZXRwYXJhbV90IF9fdXNlciAqKWRhdGEsCisJCQkgICAgIHNpemVvZihwYXJhbSkgKTsKKworCURSTV9ERUJVRyggInBpZD0lZFxuIiwgRFJNX0NVUlJFTlRQSUQgKTsKKworCXN3aXRjaCggcGFyYW0ucGFyYW0gKSB7CisJY2FzZSBSQURFT05fUEFSQU1fR0FSVF9CVUZGRVJfT0ZGU0VUOgorCQl2YWx1ZSA9IGRldl9wcml2LT5nYXJ0X2J1ZmZlcnNfb2Zmc2V0OworCQlicmVhazsKKwljYXNlIFJBREVPTl9QQVJBTV9MQVNUX0ZSQU1FOgorCQlkZXZfcHJpdi0+c3RhdHMubGFzdF9mcmFtZV9yZWFkcysrOworCQl2YWx1ZSA9IEdFVF9TQ1JBVENIKCAwICk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1BBUkFNX0xBU1RfRElTUEFUQ0g6CisJCXZhbHVlID0gR0VUX1NDUkFUQ0goIDEgKTsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fUEFSQU1fTEFTVF9DTEVBUjoKKwkJZGV2X3ByaXYtPnN0YXRzLmxhc3RfY2xlYXJfcmVhZHMrKzsKKwkJdmFsdWUgPSBHRVRfU0NSQVRDSCggMiApOworCQlicmVhazsKKwljYXNlIFJBREVPTl9QQVJBTV9JUlFfTlI6CisJCXZhbHVlID0gZGV2LT5pcnE7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1BBUkFNX0dBUlRfQkFTRToKKwkJdmFsdWUgPSBkZXZfcHJpdi0+Z2FydF92bV9zdGFydDsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fUEFSQU1fUkVHSVNURVJfSEFORExFOgorCQl2YWx1ZSA9IGRldl9wcml2LT5tbWlvX29mZnNldDsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fUEFSQU1fU1RBVFVTX0hBTkRMRToKKwkJdmFsdWUgPSBkZXZfcHJpdi0+cmluZ19ycHRyX29mZnNldDsKKwkJYnJlYWs7CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCS8qCisJICogVGhpcyBpb2N0bCgpIGRvZXNuJ3Qgd29yayBvbiA2NC1iaXQgcGxhdGZvcm1zIGJlY2F1c2UgaHdfbG9jayBpcyBhCisJICogcG9pbnRlciB3aGljaCBjYW4ndCBmaXQgaW50byBhbiBpbnQtc2l6ZWQgdmFyaWFibGUuICBBY2NvcmRpbmcgdG8KKwkgKiBNaWNoZWwgRORuemVyLCB0aGUgaW9jdGwoKSBpcyBvbmx5IHVzZWQgb24gZW1iZWRkZWQgcGxhdGZvcm1zLCBzbworCSAqIG5vdCBzdXBwb3J0aW5nIGl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0uICBJZiB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5CisJICogaXMgbmVlZGVkIG9uIDY0LWJpdCBwbGF0Zm9ybXMsIGEgbmV3IGlvY3RsKCkgd291bGQgaGF2ZSB0byBiZSBhZGRlZCwKKwkgKiBzbyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgdGhlIGVtYmVkZGVkIHBsYXRmb3JtcyBjYW4gYmUKKwkgKiBtYWludGFpbmVkLiAgLS1kYXZpZG0gNC1GZWItMjAwNC4KKwkgKi8KKwljYXNlIFJBREVPTl9QQVJBTV9TQVJFQV9IQU5ETEU6CisJCS8qIFRoZSBsb2NrIGlzIHRoZSBmaXJzdCBkd29yZCBpbiB0aGUgc2FyZWEuICovCisJCXZhbHVlID0gKGxvbmcpZGV2LT5sb2NrLmh3X2xvY2s7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBSQURFT05fUEFSQU1fR0FSVF9URVhfSEFORExFOgorCQl2YWx1ZSA9IGRldl9wcml2LT5nYXJ0X3RleHR1cmVzX29mZnNldDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIERSTV9DT1BZX1RPX1VTRVIoIHBhcmFtLnZhbHVlLCAmdmFsdWUsIHNpemVvZihpbnQpICkgKSB7CisJCURSTV9FUlJPUiggImNvcHlfdG9fdXNlclxuIiApOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3Bfc2V0cGFyYW0oIERSTV9JT0NUTF9BUkdTICkgeworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJZHJtX3JhZGVvbl9zZXRwYXJhbV90IHNwOworCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJfQorCisJRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKCBmaWxwX3ByaXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggc3AsICggZHJtX3JhZGVvbl9zZXRwYXJhbV90IF9fdXNlciAqIClkYXRhLAorCQkJCSAgc2l6ZW9mKCBzcCApICk7CisKKwlzd2l0Y2goIHNwLnBhcmFtICkgeworCWNhc2UgUkFERU9OX1NFVFBBUkFNX0ZCX0xPQ0FUSU9OOgorCQlyYWRlb25fcHJpdiA9IGZpbHBfcHJpdi0+ZHJpdmVyX3ByaXY7CisJCXJhZGVvbl9wcml2LT5yYWRlb25fZmJfZGVsdGEgPSBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gLSBzcC52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fU0VUUEFSQU1fU1dJVENIX1RJTElORzoKKwkJaWYgKHNwLnZhbHVlID09IDApIHsKKwkJCURSTV9ERUJVRyggImNvbG9yIHRpbGluZyBkaXNhYmxlZFxuIiApOworCQkJZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCAmPSB+UkFERU9OX0RTVF9USUxFX01BQ1JPOworCQkJZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ICY9IH5SQURFT05fRFNUX1RJTEVfTUFDUk87CisJCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+dGlsaW5nX2VuYWJsZWQgPSAwOworCQl9CisJCWVsc2UgaWYgKHNwLnZhbHVlID09IDEpIHsKKwkJCURSTV9ERUJVRyggImNvbG9yIHRpbGluZyBlbmFibGVkXG4iICk7CisJCQlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0IHw9IFJBREVPTl9EU1RfVElMRV9NQUNSTzsKKwkJCWRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCB8PSBSQURFT05fRFNUX1RJTEVfTUFDUk87CisJCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+dGlsaW5nX2VuYWJsZWQgPSAxOworCQl9CisJCWJyZWFrOwkKKwlkZWZhdWx0OgorCQlEUk1fREVCVUcoICJJbnZhbGlkIHBhcmFtZXRlciAlZFxuIiwgc3AucGFyYW0gKTsKKwkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCX0KKworCXJldHVybiAwOworfQorCisvKiBXaGVuIGEgY2xpZW50IGRpZXM6CisgKiAgICAtIENoZWNrIGZvciBhbmQgY2xlYW4gdXAgZmxpcHBlZCBwYWdlIHN0YXRlCisgKiAgICAtIEZyZWUgYW55IGFsbG9jZWQgR0FSVCBtZW1vcnkuCisgKgorICogRFJNIGluZnJhc3RydWN0dXJlIHRha2VzIGNhcmUgb2YgcmVjbGFpbWluZyBkbWEgYnVmZmVycy4KKyAqLwordm9pZCByYWRlb25fZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCkKK3sKKwlpZiAoIGRldi0+ZGV2X3ByaXZhdGUgKSB7CQkJCQorCQlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOyAKKwkJaWYgKCBkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyApIHsJCQorCQkJcmFkZW9uX2RvX2NsZWFudXBfcGFnZWZsaXAoIGRldiApOwkKKwkJfQkJCQkJCQorCQlyYWRlb25fbWVtX3JlbGVhc2UoIGZpbHAsIGRldl9wcml2LT5nYXJ0X2hlYXAgKTsgCisJCXJhZGVvbl9tZW1fcmVsZWFzZSggZmlscCwgZGV2X3ByaXYtPmZiX2hlYXAgKTsJCisJCXJhZGVvbl9zdXJmYWNlc19yZWxlYXNlKGZpbHAsIGRldl9wcml2KTsKKwl9CQkJCQorfQorCit2b2lkIHJhZGVvbl9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpCit7CisJcmFkZW9uX2RvX3JlbGVhc2UoZGV2KTsKK30KKworaW50IHJhZGVvbl9kcml2ZXJfb3Blbl9oZWxwZXIoZHJtX2RldmljZV90ICpkZXYsIGRybV9maWxlX3QgKmZpbHBfcHJpdikKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CisJCisJcmFkZW9uX3ByaXYgPSAoc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICopZHJtX2FsbG9jKHNpemVvZigqcmFkZW9uX3ByaXYpLCBEUk1fTUVNX0ZJTEVTKTsKKwkKKwlpZiAoIXJhZGVvbl9wcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpbHBfcHJpdi0+ZHJpdmVyX3ByaXYgPSByYWRlb25fcHJpdjsKKwlpZiAoIGRldl9wcml2ICkKKwkJcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YSA9IGRldl9wcml2LT5mYl9sb2NhdGlvbjsKKwllbHNlCisJCXJhZGVvbl9wcml2LT5yYWRlb25fZmJfZGVsdGEgPSAwOworCXJldHVybiAwOworfQorCisKK3ZvaWQgcmFkZW9uX2RyaXZlcl9mcmVlX2ZpbHBfcHJpdihkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2ZpbGVfdCAqZmlscF9wcml2KQoreworCSBzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKnJhZGVvbl9wcml2ID0gZmlscF9wcml2LT5kcml2ZXJfcHJpdjsKKwkgCisJIGRybV9mcmVlKHJhZGVvbl9wcml2LCBzaXplb2YoKnJhZGVvbl9wcml2KSwgRFJNX01FTV9GSUxFUyk7Cit9CisKK2RybV9pb2N0bF9kZXNjX3QgcmFkZW9uX2lvY3Rsc1tdID0geworCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9JTklUKV0gICAgPSB7IHJhZGVvbl9jcF9pbml0LCAgICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfU1RBUlQpXSAgID0geyByYWRlb25fY3Bfc3RhcnQsICAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1NUT1ApXSAgICA9IHsgcmFkZW9uX2NwX3N0b3AsICAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9SRVNFVCldICAgPSB7IHJhZGVvbl9jcF9yZXNldCwgICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfSURMRSldICAgID0geyByYWRlb25fY3BfaWRsZSwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1JFU1VNRSldICA9IHsgcmFkZW9uX2NwX3Jlc3VtZSwgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9SRVNFVCldICAgICAgPSB7IHJhZGVvbl9lbmdpbmVfcmVzZXQsIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fRlVMTFNDUkVFTildID0geyByYWRlb25fZnVsbHNjcmVlbiwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NXQVApXSAgICAgICA9IHsgcmFkZW9uX2NwX3N3YXAsICAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DTEVBUildICAgICAgPSB7IHJhZGVvbl9jcF9jbGVhciwgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fVkVSVEVYKV0gICAgID0geyByYWRlb25fY3BfdmVydGV4LCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lORElDRVMpXSAgICA9IHsgcmFkZW9uX2NwX2luZGljZXMsICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9URVhUVVJFKV0gICAgPSB7IHJhZGVvbl9jcF90ZXh0dXJlLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1RJUFBMRSldICAgID0geyByYWRlb25fY3Bfc3RpcHBsZSwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lORElSRUNUKV0gICA9IHsgcmFkZW9uX2NwX2luZGlyZWN0LCAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9WRVJURVgyKV0gICAgPSB7IHJhZGVvbl9jcF92ZXJ0ZXgyLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ01EQlVGKV0gICAgID0geyByYWRlb25fY3BfY21kYnVmLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0dFVFBBUkFNKV0gICA9IHsgcmFkZW9uX2NwX2dldHBhcmFtLCAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9GTElQKV0gICAgICAgPSB7IHJhZGVvbl9jcF9mbGlwLCAgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQUxMT0MpXSAgICAgID0geyByYWRlb25fbWVtX2FsbG9jLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZSRUUpXSAgICAgICA9IHsgcmFkZW9uX21lbV9mcmVlLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JTklUX0hFQVApXSAgPSB7IHJhZGVvbl9tZW1faW5pdF9oZWFwLDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSVJRX0VNSVQpXSAgID0geyByYWRlb25faXJxX2VtaXQsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lSUV9XQUlUKV0gICA9IHsgcmFkZW9uX2lycV93YWl0LCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TRVRQQVJBTSldICAgPSB7IHJhZGVvbl9jcF9zZXRwYXJhbSwgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1VSRl9BTExPQyldID0geyByYWRlb25fc3VyZmFjZV9hbGxvYywxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NVUkZfRlJFRSldICA9IHsgcmFkZW9uX3N1cmZhY2VfZnJlZSwgMSwgMCB9Cit9OworCitpbnQgcmFkZW9uX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKHJhZGVvbl9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTljM2E0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJtLmgKQEAgLTAsMCArMSw0MiBAQAorCisjaWZuZGVmIF9fU0lTX0RSTV9IX18KKyNkZWZpbmUgX19TSVNfRFJNX0hfXworCisvKiBTaVMgc3BlY2lmaWMgaW9jdGxzICovCisjZGVmaW5lIE5PVF9VU0VEXzBfMworI2RlZmluZSBEUk1fU0lTX0ZCX0FMTE9DCTB4MDQKKyNkZWZpbmUgRFJNX1NJU19GQl9GUkVFCSAgICAgICAgMHgwNQorI2RlZmluZSBOT1RfVVNFRF82XzEyCisjZGVmaW5lIERSTV9TSVNfQUdQX0lOSVQJMHgxMworI2RlZmluZSBEUk1fU0lTX0FHUF9BTExPQwkweDE0CisjZGVmaW5lIERSTV9TSVNfQUdQX0ZSRUUJMHgxNQorI2RlZmluZSBEUk1fU0lTX0ZCX0lOSVQJICAgICAgICAweDE2CisKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19GQl9BTExPQwkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfRkJfQUxMT0MsIGRybV9zaXNfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkJfRlJFRQkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfRkJfRlJFRSwgZHJtX3Npc19tZW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19BR1BfSU5JVAkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfQUdQX0lOSVQsIGRybV9zaXNfYWdwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfQUdQX0FMTE9DCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1NJU19BR1BfQUxMT0MsIGRybV9zaXNfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfQUdQX0ZSRUUJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0lTX0FHUF9GUkVFLCBkcm1fc2lzX21lbV90KQorI2RlZmluZSBEUk1fSU9DVExfU0lTX0ZCX0lOSVQJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0lTX0ZCX0lOSVQsIGRybV9zaXNfZmJfdCkKKy8qCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkxJUAkJRFJNX0lPVyggMHg0OCwgZHJtX3Npc19mbGlwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkxJUF9JTklUCQlEUk1fSU8oICAweDQ5KQorI2RlZmluZSBEUk1fSU9DVExfU0lTX0ZMSVBfRklOQUwJRFJNX0lPKCAgMHg1MCkKKyovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgY29udGV4dDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGxvbmcgZnJlZTsKK30gZHJtX3Npc19tZW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBvZmZzZXQsIHNpemU7Cit9IGRybV9zaXNfYWdwX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzaXplOworfSBkcm1fc2lzX2ZiX3Q7CisKKyNlbmRpZiAvKiBfX1NJU19EUk1fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDE3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYwpAQCAtMCwwICsxLDExMCBAQAorLyogc2lzLmMgLS0gc2lzIGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgInNpc19kcm0uaCIKKyNpbmNsdWRlICJzaXNfZHJ2LmgiCisKKyNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCisgIAorc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCit7CisJRFJNX0lORk8oICJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCisJCURSSVZFUl9OQU1FLAorCQlEUklWRVJfTUFKT1IsCisJCURSSVZFUl9NSU5PUiwKKwkJRFJJVkVSX1BBVENITEVWRUwsCisJCURSSVZFUl9EQVRFLAorCQlkZXYtPnByaW1hcnkubWlub3IsCisJCXBjaV9wcmV0dHlfbmFtZShkZXYtPnBkZXYpCisJCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyc2lvbiggZHJtX3ZlcnNpb25fdCAqdmVyc2lvbiApCit7CisJaW50IGxlbjsKKworCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKKwlEUk1fQ09QWSggdmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0geworCXNpc2Rydl9QQ0lfSURTCit9OworCitleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBzaXNfaW9jdGxzW107CitleHRlcm4gaW50IHNpc19tYXhfaW9jdGw7CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1VTRV9NVFJSLAorCS5jb250ZXh0X2N0b3IgPSBzaXNfaW5pdF9jb250ZXh0LAorCS5jb250ZXh0X2R0b3IgPSBzaXNfZmluYWxfY29udGV4dCwKKwkucmVjbGFpbV9idWZmZXJzID0gZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzLAorCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAorCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAorCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAorCS52ZXJzaW9uID0gdmVyc2lvbiwKKwkuaW9jdGxzID0gc2lzX2lvY3RscywKKwkuZm9wcyA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vcGVuID0gZHJtX29wZW4sCisJCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJCS5pb2N0bCA9IGRybV9pb2N0bCwKKwkJLm1tYXAgPSBkcm1fbW1hcCwKKwkJLnBvbGwgPSBkcm1fcG9sbCwKKwkJLmZhc3luYyA9IGRybV9mYXN5bmMsCisJfSwKKwkucGNpX2RyaXZlciA9IHsKKwkJLm5hbWUgICAgICAgICAgPSBEUklWRVJfTkFNRSwKKwkJLmlkX3RhYmxlICAgICAgPSBwY2lpZGxpc3QsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgc2lzX2luaXQodm9pZCkKK3sKKwlkcml2ZXIubnVtX2lvY3RscyA9IHNpc19tYXhfaW9jdGw7CisJcmV0dXJuIGRybV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2lzX2V4aXQodm9pZCkKK3sKKwlkcm1fZXhpdCgmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2lzX2luaXQpOworbW9kdWxlX2V4aXQoc2lzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7CitNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmUzNmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmgKQEAgLTAsMCArMSw1MiBAQAorLyogc2lzX2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciBzaXMgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqLworCisjaWZuZGVmIF9TSVNfRFJWX0hfCisjZGVmaW5lIF9TSVNfRFJWX0hfCisKKy8qIEdlbmVyYWwgY3VzdG9taXphdGlvbjoKKyAqLworCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJTSVMiCisjZGVmaW5lIERSSVZFUl9OQU1FCQkic2lzIgorI2RlZmluZSBEUklWRVJfREVTQwkJIlNJUyAzMDAvNjMwLzU0MCIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDAzMDgyNiIKKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkxCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMQorI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkwCisKKyNpbmNsdWRlICJzaXNfZHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3Npc19wcml2YXRlIHsKKwltZW1IZWFwX3QgKkFHUEhlYXA7CisJbWVtSGVhcF90ICpGQkhlYXA7Cit9IGRybV9zaXNfcHJpdmF0ZV90OworCitleHRlcm4gaW50IHNpc19pbml0X2NvbnRleHQoZHJtX2RldmljZV90ICpkZXYsIGludCBjb250ZXh0KTsKK2V4dGVybiBpbnQgc2lzX2ZpbmFsX2NvbnRleHQoZHJtX2RldmljZV90ICpkZXYsIGludCBjb250ZXh0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcy5jIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzdlZDhjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHMuYwpAQCAtMCwwICsxLDMwMSBAQAorLyogc2lzX2RzLmMgLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIERpcmVjdCBSZW5kZXJpbmcgTWFuYWdlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IE1vbiBKYW4gIDQgMTA6MDU6MDUgMTk5OSBieSBzY2xpbkBzaXMuY29tLnR3CisgKgorICogQ29weXJpZ2h0IDIwMDAgU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgQ29ycCwgSW5jLiwgSHNpbkNodSwgVGFpd2FuLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICogQXV0aG9yczoKKyAqICAgIFN1bmctQ2hpbmcgTGluIDxzY2xpbkBzaXMuY29tLnR3PgorICogCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJzaXNfZHMuaCIKKworLyogU2V0IERhdGEgU3RydWN0dXJlLCBub3QgY2hlY2sgcmVwZWF0ZWQgdmFsdWUKKyAqIHRlbXBvcmFyaWx5IHVzZWQKKyAqLworCitzZXRfdCAqc2V0SW5pdCh2b2lkKQoreworCWludCBpOworCXNldF90ICpzZXQ7CisKKwlzZXQgPSAoc2V0X3QgKilkcm1fYWxsb2Moc2l6ZW9mKHNldF90KSwgRFJNX01FTV9EUklWRVIpOworCWlmIChzZXQgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgU0VUX1NJWkU7IGkrKykgeworCQkJc2V0LT5saXN0W2ldLmZyZWVfbmV4dCA9IGkgKyAxOyAgICAKKwkJCXNldC0+bGlzdFtpXS5hbGxvY19uZXh0ID0gLTE7CisJCX0KKwkJc2V0LT5saXN0W1NFVF9TSVpFLTFdLmZyZWVfbmV4dCA9IC0xOworCQlzZXQtPmZyZWUgPSAwOworCQlzZXQtPmFsbG9jID0gLTE7CisJCXNldC0+dHJhY2UgPSAtMTsKKwl9CisJcmV0dXJuIHNldDsKK30KKworaW50IHNldEFkZChzZXRfdCAqc2V0LCBJVEVNX1RZUEUgaXRlbSkKK3sKKwlpbnQgZnJlZSA9IHNldC0+ZnJlZTsKKyAgCisJaWYgKGZyZWUgIT0gLTEpIHsKKwkJc2V0LT5saXN0W2ZyZWVdLnZhbCA9IGl0ZW07CisJCXNldC0+ZnJlZSA9IHNldC0+bGlzdFtmcmVlXS5mcmVlX25leHQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCisJc2V0LT5saXN0W2ZyZWVdLmFsbG9jX25leHQgPSBzZXQtPmFsbG9jOworCXNldC0+YWxsb2MgPSBmcmVlOyAgCisJc2V0LT5saXN0W2ZyZWVdLmZyZWVfbmV4dCA9IC0xOyAgICAKKworCXJldHVybiAxOworfQorCitpbnQgc2V0RGVsKHNldF90ICpzZXQsIElURU1fVFlQRSBpdGVtKQoreworCWludCBhbGxvYyA9IHNldC0+YWxsb2M7CisJaW50IHByZXYgPSAtMTsgIAorCisJd2hpbGUgKGFsbG9jICE9IC0xKSB7CisJCWlmIChzZXQtPmxpc3RbYWxsb2NdLnZhbCA9PSBpdGVtKSB7CisJCQlpZiAocHJldiAhPSAtMSkKKwkJCQlzZXQtPmxpc3RbcHJldl0uYWxsb2NfbmV4dCA9CisJCQkJICAgIHNldC0+bGlzdFthbGxvY10uYWxsb2NfbmV4dDsKKwkJCWVsc2UKKwkJCQlzZXQtPmFsbG9jID0gc2V0LT5saXN0W2FsbG9jXS5hbGxvY19uZXh0OworCQkJYnJlYWs7CisJCX0KKwkJcHJldiA9IGFsbG9jOworCQlhbGxvYyA9IHNldC0+bGlzdFthbGxvY10uYWxsb2NfbmV4dDsKKwl9CisKKwlpZiAoYWxsb2MgPT0gLTEpCisJCXJldHVybiAwOworCisJc2V0LT5saXN0W2FsbG9jXS5mcmVlX25leHQgPSBzZXQtPmZyZWU7CisJc2V0LT5mcmVlID0gYWxsb2M7CisJc2V0LT5saXN0W2FsbG9jXS5hbGxvY19uZXh0ID0gLTE7CisKKwlyZXR1cm4gMTsKK30KKworLyogc2V0Rmlyc3QgLT4gc2V0QWRkIC0+IHNldE5leHQgaXMgd3JvbmcgKi8KKworaW50IHNldEZpcnN0KHNldF90ICpzZXQsIElURU1fVFlQRSAqaXRlbSkKK3sKKwlpZiAoc2V0LT5hbGxvYyA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwkqaXRlbSA9IHNldC0+bGlzdFtzZXQtPmFsbG9jXS52YWw7CisJc2V0LT50cmFjZSA9IHNldC0+bGlzdFtzZXQtPmFsbG9jXS5hbGxvY19uZXh0OworCisJcmV0dXJuIDE7Cit9CisKK2ludCBzZXROZXh0KHNldF90ICpzZXQsIElURU1fVFlQRSAqaXRlbSkKK3sKKwlpZiAoc2V0LT50cmFjZSA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwkqaXRlbSA9IHNldC0+bGlzdFtzZXQtPnRyYWNlXS52YWw7CisJc2V0LT50cmFjZSA9IHNldC0+bGlzdFtzZXQtPnRyYWNlXS5hbGxvY19uZXh0OworCisJcmV0dXJuIDE7Cit9CisKK2ludCBzZXREZXN0cm95KHNldF90ICpzZXQpCit7CisJZHJtX2ZyZWUoc2V0LCBzaXplb2Yoc2V0X3QpLCBEUk1fTUVNX0RSSVZFUik7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEdMWCBIYXJkd2FyZSBEZXZpY2UgRHJpdmVyIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgV2l0dGF3YXQgWWFtd29uZworICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogV0lUVEFXQVQgWUFNV09ORywgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgCisgKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2RlZmluZSBJU0ZSRUUoYnB0cikgKChicHRyKS0+ZnJlZSkKKworbWVtSGVhcF90ICptbUluaXQoaW50IG9mcywKKwkJICBpbnQgc2l6ZSkKK3sKKwlQTWVtQmxvY2sgYmxvY2tzOworCisJaWYgKHNpemUgPD0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlibG9ja3MgPSAoVE1lbUJsb2NrICopZHJtX2NhbGxvYygxLCBzaXplb2YoVE1lbUJsb2NrKSwgRFJNX01FTV9EUklWRVIpOworCWlmIChibG9ja3MgIT0gTlVMTCkgeworCQlibG9ja3MtPm9mcyA9IG9mczsKKwkJYmxvY2tzLT5zaXplID0gc2l6ZTsKKwkJYmxvY2tzLT5mcmVlID0gMTsKKwkJcmV0dXJuIChtZW1IZWFwX3QgKilibG9ja3M7CisJfSBlbHNlCisJCXJldHVybiBOVUxMOworfQorCisvKiBDaGVja3MgaWYgYSBwb2ludGVyICdiJyBpcyBwYXJ0IG9mIHRoZSBoZWFwICdoZWFwJyAqLworaW50IG1tQmxvY2tJbkhlYXAobWVtSGVhcF90ICpoZWFwLCBQTWVtQmxvY2sgYikKK3sKKwlUTWVtQmxvY2sgKnA7CisKKwlpZiAoaGVhcCA9PSBOVUxMIHx8IGIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlwID0gaGVhcDsKKwl3aGlsZSAocCAhPSBOVUxMICYmIHAgIT0gYikgeworCQlwID0gcC0+bmV4dDsKKwl9CisJaWYgKHAgPT0gYikKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIFRNZW1CbG9jayogU2xpY2VCbG9jayhUTWVtQmxvY2sgKnAsIAorCQkJICAgICBpbnQgc3RhcnRvZnMsIGludCBzaXplLCAKKwkJCSAgICAgaW50IHJlc2VydmVkLCBpbnQgYWxpZ25tZW50KQoreworCVRNZW1CbG9jayAqbmV3YmxvY2s7CisKKwkvKiBicmVhayBsZWZ0ICovCisJaWYgKHN0YXJ0b2ZzID4gcC0+b2ZzKSB7CisJCW5ld2Jsb2NrID0gKFRNZW1CbG9jayopIGRybV9jYWxsb2MoMSwgc2l6ZW9mKFRNZW1CbG9jayksCisJCSAgICBEUk1fTUVNX0RSSVZFUik7CisJCW5ld2Jsb2NrLT5vZnMgPSBzdGFydG9mczsKKwkJbmV3YmxvY2stPnNpemUgPSBwLT5zaXplIC0gKHN0YXJ0b2ZzIC0gcC0+b2ZzKTsKKwkJbmV3YmxvY2stPmZyZWUgPSAxOworCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7CisJCXAtPnNpemUgLT0gbmV3YmxvY2stPnNpemU7CisJCXAtPm5leHQgPSBuZXdibG9jazsKKwkJcCA9IG5ld2Jsb2NrOworCX0KKworCS8qIGJyZWFrIHJpZ2h0ICovCisJaWYgKHNpemUgPCBwLT5zaXplKSB7CisJCW5ld2Jsb2NrID0gKFRNZW1CbG9jayopIGRybV9jYWxsb2MoMSwgc2l6ZW9mKFRNZW1CbG9jayksCisJCSAgICBEUk1fTUVNX0RSSVZFUik7CisJCW5ld2Jsb2NrLT5vZnMgPSBzdGFydG9mcyArIHNpemU7CisJCW5ld2Jsb2NrLT5zaXplID0gcC0+c2l6ZSAtIHNpemU7CisJCW5ld2Jsb2NrLT5mcmVlID0gMTsKKwkJbmV3YmxvY2stPm5leHQgPSBwLT5uZXh0OworCQlwLT5zaXplID0gc2l6ZTsKKwkJcC0+bmV4dCA9IG5ld2Jsb2NrOworCX0KKworCS8qIHAgPSBtaWRkbGUgYmxvY2sgKi8KKwlwLT5hbGlnbiA9IGFsaWdubWVudDsKKwlwLT5mcmVlID0gMDsKKwlwLT5yZXNlcnZlZCA9IHJlc2VydmVkOworCXJldHVybiBwOworfQorCitQTWVtQmxvY2sgbW1BbGxvY01lbSggbWVtSGVhcF90ICpoZWFwLCBpbnQgc2l6ZSwgaW50IGFsaWduMiwgaW50IHN0YXJ0U2VhcmNoKQoreworCWludCBtYXNrLHN0YXJ0b2ZzLCBlbmRvZnM7CisJVE1lbUJsb2NrICpwOworCQorCWlmIChoZWFwID09IE5VTEwgfHwgYWxpZ24yIDwgMCB8fCBzaXplIDw9IDApCisJCXJldHVybiBOVUxMOworCisJbWFzayA9ICgxIDw8IGFsaWduMiktMTsKKwlzdGFydG9mcyA9IDA7CisJcCA9IChUTWVtQmxvY2sgKiloZWFwOworCXdoaWxlIChwICE9IE5VTEwpIHsKKwkJaWYgKElTRlJFRShwKSkgeworCQkJc3RhcnRvZnMgPSAocC0+b2ZzICsgbWFzaykgJiB+bWFzazsKKwkJCWlmICggc3RhcnRvZnMgPCBzdGFydFNlYXJjaCApIHsKKwkJCQlzdGFydG9mcyA9IHN0YXJ0U2VhcmNoOworCQkJfQorCQkJZW5kb2ZzID0gc3RhcnRvZnMrc2l6ZTsKKwkJCWlmIChlbmRvZnMgPD0gKHAtPm9mcytwLT5zaXplKSkKKwkJCQlicmVhazsKKwkJfQorCQlwID0gcC0+bmV4dDsKKwl9CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcCA9IFNsaWNlQmxvY2socCxzdGFydG9mcyxzaXplLDAsbWFzaysxKTsKKwlwLT5oZWFwID0gaGVhcDsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IEpvaW4yQmxvY2tzKFRNZW1CbG9jayAqcCkKK3sKKwlpZiAocC0+ZnJlZSAmJiBwLT5uZXh0ICYmIHAtPm5leHQtPmZyZWUpIHsKKwkJVE1lbUJsb2NrICpxID0gcC0+bmV4dDsKKwkJcC0+c2l6ZSArPSBxLT5zaXplOworCQlwLT5uZXh0ID0gcS0+bmV4dDsKKwkJZHJtX2ZyZWUocSwgc2l6ZW9mKFRNZW1CbG9jayksIERSTV9NRU1fRFJJVkVSKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbW1GcmVlTWVtKFBNZW1CbG9jayBiKQoreworCVRNZW1CbG9jayAqcCwgKnByZXY7CisKKwlpZiAoYiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoYi0+aGVhcCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwID0gYi0+aGVhcDsKKwlwcmV2ID0gTlVMTDsKKwl3aGlsZSAocCAhPSBOVUxMICYmIHAgIT0gYikgeworCQlwcmV2ID0gcDsKKwkJcCA9IHAtPm5leHQ7CisJfQorCWlmIChwID09IE5VTEwgfHwgcC0+ZnJlZSB8fCBwLT5yZXNlcnZlZCkKKwkJcmV0dXJuIC0xOworCisJcC0+ZnJlZSA9IDE7CisJSm9pbjJCbG9ja3MocCk7CisJaWYgKHByZXYpCisJSm9pbjJCbG9ja3MocHJldik7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX2RzLmggYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MWVlNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcy5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKiBzaXNfZHMuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIEphbiAgNCAxMDowNTowNSAxOTk5IGJ5IHNjbGluQHNpcy5jb20udHcKKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtcyBDb3JwLCBJbmMuLCBIc2luQ2h1LCBUYWl3YW4uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKiBBdXRob3JzOgorICogICAgU3VuZy1DaGluZyBMaW4gPHNjbGluQHNpcy5jb20udHc+CisgKiAKKyAqLworCisjaWZuZGVmIF9fU0lTX0RTX0hfXworI2RlZmluZSBfX1NJU19EU19IX18KKworLyogU2V0IERhdGEgU3RydWN0dXJlICovCisKKyNkZWZpbmUgU0VUX1NJWkUgNTAwMAorCit0eXBlZGVmIHVuc2lnbmVkIGludCBJVEVNX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlJVEVNX1RZUEUgdmFsOworCWludCBhbGxvY19uZXh0LCBmcmVlX25leHQ7Cit9IGxpc3RfaXRlbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGFsbG9jOworCWludCBmcmVlOworCWludCB0cmFjZTsKKwlsaXN0X2l0ZW1fdCBsaXN0W1NFVF9TSVpFXTsKK30gc2V0X3Q7CisKK3NldF90ICpzZXRJbml0KHZvaWQpOworaW50IHNldEFkZChzZXRfdCAqc2V0LCBJVEVNX1RZUEUgaXRlbSk7CitpbnQgc2V0RGVsKHNldF90ICpzZXQsIElURU1fVFlQRSBpdGVtKTsKK2ludCBzZXRGaXJzdChzZXRfdCAqc2V0LCBJVEVNX1RZUEUgKml0ZW0pOworaW50IHNldE5leHQoc2V0X3QgKnNldCwgSVRFTV9UWVBFICppdGVtKTsKK2ludCBzZXREZXN0cm95KHNldF90ICpzZXQpOworCisvKgorICogR0xYIEhhcmR3YXJlIERldmljZSBEcml2ZXIgY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoQykgMTk5OSBXaXR0YXdhdCBZYW13b25nCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBXSVRUQVdBVCBZQU1XT05HLCBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAKKyAqIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCitzdHJ1Y3QgbWVtX2Jsb2NrX3QgeworCXN0cnVjdCBtZW1fYmxvY2tfdCAqbmV4dDsKKwlzdHJ1Y3QgbWVtX2Jsb2NrX3QgKmhlYXA7CisJaW50IG9mcyxzaXplOworCWludCBhbGlnbjsKKwl1bnNpZ25lZCBpbnQgZnJlZToxOworCXVuc2lnbmVkIGludCByZXNlcnZlZDoxOworfTsKK3R5cGVkZWYgc3RydWN0IG1lbV9ibG9ja190IFRNZW1CbG9jazsKK3R5cGVkZWYgc3RydWN0IG1lbV9ibG9ja190ICpQTWVtQmxvY2s7CisKKy8qIGEgaGVhcCBpcyBqdXN0IHRoZSBmaXJzdCBibG9jayBpbiBhIGNoYWluICovCit0eXBlZGVmIHN0cnVjdCBtZW1fYmxvY2tfdCBtZW1IZWFwX3Q7CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBtbUJsb2NrU2l6ZShQTWVtQmxvY2sgYikKK3sKKwlyZXR1cm4gYi0+c2l6ZTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IG1tT2Zmc2V0KFBNZW1CbG9jayBiKQoreworCXJldHVybiBiLT5vZnM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbW1NYXJrUmVzZXJ2ZWQoUE1lbUJsb2NrIGIpCit7CisJYi0+cmVzZXJ2ZWQgPSAxOworfQorCisvKiAKKyAqIGlucHV0OiB0b3RhbCBzaXplIGluIGJ5dGVzCisgKiByZXR1cm46IGEgaGVhcCBwb2ludGVyIGlmIE9LLCBOVUxMIGlmIGVycm9yCisgKi8KK21lbUhlYXBfdCAqbW1Jbml0KCBpbnQgb2ZzLCBpbnQgc2l6ZSApOworCisvKgorICogQWxsb2NhdGUgJ3NpemUnIGJ5dGVzIHdpdGggMl5hbGlnbjIgYnl0ZXMgYWxpZ25tZW50LAorICogcmVzdHJpY3QgdGhlIHNlYXJjaCB0byBmcmVlIG1lbW9yeSBhZnRlciAnc3RhcnRTZWFyY2gnCisgKiBkZXB0aCBhbmQgYmFjayBidWZmZXJzIHNob3VsZCBiZSBpbiBkaWZmZXJlbnQgNG1iIGJhbmtzCisgKiB0byBnZXQgYmV0dGVyIHBhZ2UgaGl0cyBpZiBwb3NzaWJsZQorICogaW5wdXQ6CXNpemUgPSBzaXplIG9mIGJsb2NrCisgKiAgICAgICAJYWxpZ24yID0gMl5hbGlnbjIgYnl0ZXMgYWxpZ25tZW50CisgKgkJc3RhcnRTZWFyY2ggPSBsaW5lYXIgb2Zmc2V0IGZyb20gc3RhcnQgb2YgaGVhcCB0byBiZWdpbiBzZWFyY2gKKyAqIHJldHVybjogcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGJsb2NrLCAwIGlmIGVycm9yCisgKi8KK1BNZW1CbG9jayBtbUFsbG9jTWVtKCBtZW1IZWFwX3QgKmhlYXAsIGludCBzaXplLCBpbnQgYWxpZ24yLCBpbnQgc3RhcnRTZWFyY2ggKTsKKworLyoKKyAqIFJldHVybnMgMSBpZiB0aGUgYmxvY2sgJ2InIGlzIHBhcnQgb2YgdGhlIGhlYXAgJ2hlYXAnCisgKi8KK2ludCBtbUJsb2NrSW5IZWFwKCBQTWVtQmxvY2sgaGVhcCwgUE1lbUJsb2NrIGIgKTsKKworLyoKKyAqIEZyZWUgYmxvY2sgc3RhcnRzIGF0IG9mZnNldAorICogaW5wdXQ6IHBvaW50ZXIgdG8gYSBibG9jaworICogcmV0dXJuOiAwIGlmIE9LLCAtMSBpZiBlcnJvcgorICovCitpbnQgbW1GcmVlTWVtKCBQTWVtQmxvY2sgYiApOworCisvKiBGb3IgZGVidWdpbmcgcHVycG9zZS4gKi8KK3ZvaWQgbW1EdW1wTWVtSW5mbyggbWVtSGVhcF90ICptbUluaXQgKTsKKworI2VuZGlmIC8qIF9fU0lTX0RTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxMGM1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX21tLmMKQEAgLTAsMCArMSw0MTcgQEAKKy8qIHNpc19tbS5jIC0tIFByaXZhdGUgaGVhZGVyIGZvciBEaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gSmFuICA0IDEwOjA1OjA1IDE5OTkgYnkgc2NsaW5Ac2lzLmNvbS50dworICoKKyAqIENvcHlyaWdodCAyMDAwIFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIENvcnAsIEluYy4sIEhzaW5DaHUsIFRhaXdhbi4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqIEF1dGhvcnM6CisgKiAgICBTdW5nLUNoaW5nIExpbiA8c2NsaW5Ac2lzLmNvbS50dz4KKyAqIAorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAic2lzX2RybS5oIgorI2luY2x1ZGUgInNpc19kcnYuaCIKKyNpbmNsdWRlICJzaXNfZHMuaCIKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfU0lTKQorI2luY2x1ZGUgPHZpZGVvL3Npc2ZiLmg+CisjZW5kaWYKKworI2RlZmluZSBNQVhfQ09OVEVYVCAxMDAKKyNkZWZpbmUgVklERU9fVFlQRSAwIAorI2RlZmluZSBBR1BfVFlQRSAxCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdXNlZDsKKwlpbnQgY29udGV4dDsKKwlzZXRfdCAqc2V0c1syXTsgLyogMCBmb3IgdmlkZW8sIDEgZm9yIEFHUCAqLworfSBzaXNfY29udGV4dF90OworCitzdGF0aWMgc2lzX2NvbnRleHRfdCBnbG9iYWxfcHByaXZbTUFYX0NPTlRFWFRdOworCisKK3N0YXRpYyBpbnQgYWRkX2FsbG9jX3NldChpbnQgY29udGV4dCwgaW50IHR5cGUsIHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IGksIHJldHZhbCA9IDA7CisJCisJZm9yIChpID0gMDsgaSA8IE1BWF9DT05URVhUOyBpKyspIHsKKwkJaWYgKGdsb2JhbF9wcHJpdltpXS51c2VkICYmIGdsb2JhbF9wcHJpdltpXS5jb250ZXh0ID09IGNvbnRleHQpCisJCXsKKwkJCXJldHZhbCA9IHNldEFkZChnbG9iYWxfcHByaXZbaV0uc2V0c1t0eXBlXSwgdmFsKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZGVsX2FsbG9jX3NldChpbnQgY29udGV4dCwgaW50IHR5cGUsIHVuc2lnbmVkIGludCB2YWwpCit7ICAKKwlpbnQgaSwgcmV0dmFsID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09OVEVYVDsgaSsrKSB7CisJCWlmIChnbG9iYWxfcHByaXZbaV0udXNlZCAmJiBnbG9iYWxfcHByaXZbaV0uY29udGV4dCA9PSBjb250ZXh0KQorCQl7CisJCQlyZXR2YWwgPSBzZXREZWwoZ2xvYmFsX3Bwcml2W2ldLnNldHNbdHlwZV0sIHZhbCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBmYiBtYW5hZ2VtZW50IHZpYSBmYiBkZXZpY2UgKi8gCisjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoQ09ORklHX0ZCX1NJUykKKworc3RhdGljIGludCBzaXNfZmJfaW5pdCggRFJNX0lPQ1RMX0FSR1MgKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpc19mYl9hbGxvYyggRFJNX0lPQ1RMX0FSR1MgKQoreworCWRybV9zaXNfbWVtX3QgZmI7CisJc3RydWN0IHNpc19tZW1yZXEgcmVxOworCWRybV9zaXNfbWVtX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlpbnQgcmV0dmFsID0gMDsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChmYiwgYXJncCwgc2l6ZW9mKGZiKSk7CisKKwlyZXEuc2l6ZSA9IGZiLnNpemU7CisJc2lzX21hbGxvYygmcmVxKTsKKwlpZiAocmVxLm9mZnNldCkgeworCQkvKiBUT0RPICovCisJCWZiLm9mZnNldCA9IHJlcS5vZmZzZXQ7CisJCWZiLmZyZWUgPSByZXEub2Zmc2V0OworCQlpZiAoIWFkZF9hbGxvY19zZXQoZmIuY29udGV4dCwgVklERU9fVFlQRSwgZmIuZnJlZSkpIHsKKwkJCURSTV9ERUJVRygiYWRkaW5nIHRvIGFsbG9jYXRpb24gc2V0IGZhaWxzXG4iKTsKKwkJCXNpc19mcmVlKHJlcS5vZmZzZXQpOworCQkJcmV0dmFsID0gRFJNX0VSUihFSU5WQUwpOworCQl9CisJfSBlbHNlIHsgIAorCQlmYi5vZmZzZXQgPSAwOworCQlmYi5zaXplID0gMDsKKwkJZmIuZnJlZSA9IDA7CisJfQorCisJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTChhcmdwLCBmYiwgc2l6ZW9mKGZiKSk7CisKKwlEUk1fREVCVUcoImFsbG9jIGZiLCBzaXplID0gJWQsIG9mZnNldCA9ICVkXG4iLCBmYi5zaXplLCByZXEub2Zmc2V0KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2lzX2ZiX2ZyZWUoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlkcm1fc2lzX21lbV90IGZiOworCWludCByZXR2YWwgPSAwOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGZiLCAoZHJtX3Npc19tZW1fdCBfX3VzZXIgKilkYXRhLCBzaXplb2YoZmIpKTsKKworCWlmICghZmIuZnJlZSkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCWlmICghZGVsX2FsbG9jX3NldChmYi5jb250ZXh0LCBWSURFT19UWVBFLCBmYi5mcmVlKSkKKwkJcmV0dmFsID0gRFJNX0VSUihFSU5WQUwpOworCXNpc19mcmVlKCh1MzIpZmIuZnJlZSk7CisKKwlEUk1fREVCVUcoImZyZWUgZmIsIG9mZnNldCA9ICVsdVxuIiwgZmIuZnJlZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZWxzZQorCisvKiBDYWxsZWQgYnkgdGhlIFggU2VydmVyIHRvIGluaXRpYWxpemUgdGhlIEZCIGhlYXAuICBBbGxvY2F0aW9ucyB3aWxsIGZhaWwKKyAqIHVubGVzcyB0aGlzIGlzIGNhbGxlZC4gIE9mZnNldCBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoZWFwIGZyb20gdGhlCisgKiBmcmFtZWJ1ZmZlciBvZmZzZXQgKE1heFhGQk1lbSBpbiBYRnJlZTg2KS4KKyAqCisgKiBNZW1vcnkgbGF5b3V0IGFjY29yZGluZyB0byBUaG9tYXMgV2luaXNjaG9mZXI6CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tfEREREREREREREREREREREREREREREREREREREREfEhISEh8Q0NDQ0NDQ0NDQ0N8CisgKgorICogICAgWCBkcml2ZXIvc2lzZmIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFctICAgQ29tbWFuZC0KKyAqICBmcmFtZWJ1ZmZlciBtZW1vcnkgICAgICAgICAgIERSSSBoZWFwICAgICAgICAgICBDdXJzb3IgICBxdWV1ZQorICovCitzdGF0aWMgaW50IHNpc19mYl9pbml0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9zaXNfZmJfdCBmYjsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChmYiwgKGRybV9zaXNfZmJfdCBfX3VzZXIgKilkYXRhLCBzaXplb2YoZmIpKTsKKworCWlmIChkZXZfcHJpdiA9PSBOVUxMKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSBkcm1fY2FsbG9jKDEsIHNpemVvZihkcm1fc2lzX3ByaXZhdGVfdCksCisJCSAgICBEUk1fTUVNX0RSSVZFUik7CisJCWRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwkJaWYgKGRldl9wcml2ID09IE5VTEwpCisJCQlyZXR1cm4gRU5PTUVNOworCX0KKworCWlmIChkZXZfcHJpdi0+RkJIZWFwICE9IE5VTEwpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlkZXZfcHJpdi0+RkJIZWFwID0gbW1Jbml0KGZiLm9mZnNldCwgZmIuc2l6ZSk7CisKKwlEUk1fREVCVUcoIm9mZnNldCA9ICV1LCBzaXplID0gJXUiLCBmYi5vZmZzZXQsIGZiLnNpemUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2lzX2ZiX2FsbG9jKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9zaXNfbWVtX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlkcm1fc2lzX21lbV90IGZiOworCVBNZW1CbG9jayBibG9jazsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChkZXZfcHJpdiA9PSBOVUxMIHx8IGRldl9wcml2LT5GQkhlYXAgPT0gTlVMTCkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKyAgCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGZiLCBhcmdwLCBzaXplb2YoZmIpKTsKKyAgCisJYmxvY2sgPSBtbUFsbG9jTWVtKGRldl9wcml2LT5GQkhlYXAsIGZiLnNpemUsIDAsIDApOworCWlmIChibG9jaykgeworCQkvKiBUT0RPICovCisJCWZiLm9mZnNldCA9IGJsb2NrLT5vZnM7CisJCWZiLmZyZWUgPSAodW5zaWduZWQgbG9uZylibG9jazsKKwkJaWYgKCFhZGRfYWxsb2Nfc2V0KGZiLmNvbnRleHQsIFZJREVPX1RZUEUsIGZiLmZyZWUpKSB7CisJCQlEUk1fREVCVUcoImFkZGluZyB0byBhbGxvY2F0aW9uIHNldCBmYWlsc1xuIik7CisJCQltbUZyZWVNZW0oKFBNZW1CbG9jaylmYi5mcmVlKTsKKwkJCXJldHZhbCA9IERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCX0gZWxzZSB7CisJCWZiLm9mZnNldCA9IDA7CisJCWZiLnNpemUgPSAwOworCQlmYi5mcmVlID0gMDsKKwl9CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKGFyZ3AsIGZiLCBzaXplb2YoZmIpKTsKKworCURSTV9ERUJVRygiYWxsb2MgZmIsIHNpemUgPSAlZCwgb2Zmc2V0ID0gJWRcbiIsIGZiLnNpemUsIGZiLm9mZnNldCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHNpc19mYl9mcmVlKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9zaXNfbWVtX3QgZmI7CisKKwlpZiAoZGV2X3ByaXYgPT0gTlVMTCB8fCBkZXZfcHJpdi0+RkJIZWFwID09IE5VTEwpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZmIsIChkcm1fc2lzX21lbV90IF9fdXNlciAqKWRhdGEsIHNpemVvZihmYikpOworCisJaWYgKCFtbUJsb2NrSW5IZWFwKGRldl9wcml2LT5GQkhlYXAsIChQTWVtQmxvY2spZmIuZnJlZSkpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlpZiAoIWRlbF9hbGxvY19zZXQoZmIuY29udGV4dCwgVklERU9fVFlQRSwgZmIuZnJlZSkpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJbW1GcmVlTWVtKChQTWVtQmxvY2spZmIuZnJlZSk7CisKKwlEUk1fREVCVUcoImZyZWUgZmIsIGZyZWUgPSAweCVseFxuIiwgZmIuZnJlZSk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8qIGFncCBtZW1vcnkgbWFuYWdlbWVudCAqLyAKKworc3RhdGljIGludCBzaXNfaW9jdGxfYWdwX2luaXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3Npc19hZ3BfdCBhZ3A7CisKKwlpZiAoZGV2X3ByaXYgPT0gTlVMTCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gZHJtX2NhbGxvYygxLCBzaXplb2YoZHJtX3Npc19wcml2YXRlX3QpLAorCQkgICAgRFJNX01FTV9EUklWRVIpOworCQlkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJCWlmIChkZXZfcHJpdiA9PSBOVUxMKQorCQkJcmV0dXJuIEVOT01FTTsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPkFHUEhlYXAgIT0gTlVMTCkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChhZ3AsIChkcm1fc2lzX2FncF90IF9fdXNlciAqKWRhdGEsIHNpemVvZihhZ3ApKTsKKworCWRldl9wcml2LT5BR1BIZWFwID0gbW1Jbml0KGFncC5vZmZzZXQsIGFncC5zaXplKTsKKworCURSTV9ERUJVRygib2Zmc2V0ID0gJXUsIHNpemUgPSAldSIsIGFncC5vZmZzZXQsIGFncC5zaXplKTsKKyAgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2lzX2lvY3RsX2FncF9hbGxvYyggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fc2lzX21lbV90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CisJZHJtX3Npc19tZW1fdCBhZ3A7CisJUE1lbUJsb2NrIGJsb2NrOworCWludCByZXR2YWwgPSAwOworICAgCisJaWYgKGRldl9wcml2ID09IE5VTEwgfHwgZGV2X3ByaXYtPkFHUEhlYXAgPT0gTlVMTCkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKyAgCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFncCwgYXJncCwgc2l6ZW9mKGFncCkpOworICAKKwlibG9jayA9IG1tQWxsb2NNZW0oZGV2X3ByaXYtPkFHUEhlYXAsIGFncC5zaXplLCAwLCAwKTsKKwlpZiAoYmxvY2spIHsKKwkJLyogVE9ETyAqLworCQlhZ3Aub2Zmc2V0ID0gYmxvY2stPm9mczsKKwkJYWdwLmZyZWUgPSAodW5zaWduZWQgbG9uZylibG9jazsKKwkJaWYgKCFhZGRfYWxsb2Nfc2V0KGFncC5jb250ZXh0LCBBR1BfVFlQRSwgYWdwLmZyZWUpKSB7CisJCQlEUk1fREVCVUcoImFkZGluZyB0byBhbGxvY2F0aW9uIHNldCBmYWlsc1xuIik7CisJCQltbUZyZWVNZW0oKFBNZW1CbG9jaylhZ3AuZnJlZSk7CisJCQlyZXR2YWwgPSAtMTsKKwkJfQorCX0gZWxzZSB7ICAKKwkJYWdwLm9mZnNldCA9IDA7CisJCWFncC5zaXplID0gMDsKKwkJYWdwLmZyZWUgPSAwOworCX0KKworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoYXJncCwgYWdwLCBzaXplb2YoYWdwKSk7CisKKwlEUk1fREVCVUcoImFsbG9jIGFncCwgc2l6ZSA9ICVkLCBvZmZzZXQgPSAlZFxuIiwgYWdwLnNpemUsIGFncC5vZmZzZXQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBzaXNfaW9jdGxfYWdwX2ZyZWUoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3Npc19tZW1fdCBhZ3A7CisKKwlpZiAoZGV2X3ByaXYgPT0gTlVMTCB8fCBkZXZfcHJpdi0+QUdQSGVhcCA9PSBOVUxMKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFncCwgKGRybV9zaXNfbWVtX3QgX191c2VyICopZGF0YSwgc2l6ZW9mKGFncCkpOworCisJaWYgKCFtbUJsb2NrSW5IZWFwKGRldl9wcml2LT5BR1BIZWFwLCAoUE1lbUJsb2NrKWFncC5mcmVlKSkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCW1tRnJlZU1lbSgoUE1lbUJsb2NrKWFncC5mcmVlKTsKKwlpZiAoIWRlbF9hbGxvY19zZXQoYWdwLmNvbnRleHQsIEFHUF9UWVBFLCBhZ3AuZnJlZSkpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlEUk1fREVCVUcoImZyZWUgYWdwLCBmcmVlID0gMHglbHhcbiIsIGFncC5mcmVlKTsKKworCXJldHVybiAwOworfQorCitpbnQgc2lzX2luaXRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY29udGV4dCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09OVEVYVCA7IGkrKykgeworCQlpZiAoZ2xvYmFsX3Bwcml2W2ldLnVzZWQgJiYKKwkJICAgIChnbG9iYWxfcHByaXZbaV0uY29udGV4dCA9PSBjb250ZXh0KSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID49IE1BWF9DT05URVhUKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09OVEVYVCA7IGkrKykgeworCQkJaWYgKCFnbG9iYWxfcHByaXZbaV0udXNlZCkgeworCQkJCWdsb2JhbF9wcHJpdltpXS5jb250ZXh0ID0gY29udGV4dDsKKwkJCQlnbG9iYWxfcHByaXZbaV0udXNlZCA9IDE7CisJCQkJZ2xvYmFsX3Bwcml2W2ldLnNldHNbMF0gPSBzZXRJbml0KCk7CisJCQkJZ2xvYmFsX3Bwcml2W2ldLnNldHNbMV0gPSBzZXRJbml0KCk7CisJCQkJRFJNX0RFQlVHKCJpbml0IGFsbG9jYXRpb24gc2V0LCBzb2NrZXQ9JWQsICIKKwkJCQkgICAgImNvbnRleHQgPSAlZFxuIiwgaSwgY29udGV4dCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKChpID49IE1BWF9DT05URVhUKSB8fCAoZ2xvYmFsX3Bwcml2W2ldLnNldHNbMF0gPT0gTlVMTCkgfHwKKwkJICAgIChnbG9iYWxfcHByaXZbaV0uc2V0c1sxXSA9PSBOVUxMKSkKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJCisJcmV0dXJuIDE7Cit9CisKK2ludCBzaXNfZmluYWxfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY29udGV4dCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPE1BWF9DT05URVhUOyBpKyspIHsKKwkJaWYgKGdsb2JhbF9wcHJpdltpXS51c2VkICYmCisJCSAgICAoZ2xvYmFsX3Bwcml2W2ldLmNvbnRleHQgPT0gY29udGV4dCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA8IE1BWF9DT05URVhUKSB7CisJCXNldF90ICpzZXQ7CisJCXVuc2lnbmVkIGludCBpdGVtOworCQlpbnQgcmV0dmFsOworCisJCURSTV9ERUJVRygiZmluZCBzb2NrZXQgJWQsIGNvbnRleHQgPSAlZFxuIiwgaSwgY29udGV4dCk7CisKKwkJLyogVmlkZW8gTWVtb3J5ICovCisJCXNldCA9IGdsb2JhbF9wcHJpdltpXS5zZXRzWzBdOworCQlyZXR2YWwgPSBzZXRGaXJzdChzZXQsICZpdGVtKTsKKwkJd2hpbGUgKHJldHZhbCkgeworCQkJRFJNX0RFQlVHKCJmcmVlIHZpZGVvIG1lbW9yeSAweCV4XG4iLCBpdGVtKTsKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfU0lTKQorCQkJc2lzX2ZyZWUoaXRlbSk7CisjZWxzZQorCQkJbW1GcmVlTWVtKChQTWVtQmxvY2spaXRlbSk7CisjZW5kaWYKKwkJCXJldHZhbCA9IHNldE5leHQoc2V0LCAmaXRlbSk7CisJCX0KKwkJc2V0RGVzdHJveShzZXQpOworCisJCS8qIEFHUCBNZW1vcnkgKi8KKwkJc2V0ID0gZ2xvYmFsX3Bwcml2W2ldLnNldHNbMV07CisJCXJldHZhbCA9IHNldEZpcnN0KHNldCwgJml0ZW0pOworCQl3aGlsZSAocmV0dmFsKSB7CisJCQlEUk1fREVCVUcoImZyZWUgYWdwIG1lbW9yeSAweCV4XG4iLCBpdGVtKTsKKwkJCW1tRnJlZU1lbSgoUE1lbUJsb2NrKWl0ZW0pOworCQkJcmV0dmFsID0gc2V0TmV4dChzZXQsICZpdGVtKTsKKwkJfQorCQlzZXREZXN0cm95KHNldCk7CisKKwkJZ2xvYmFsX3Bwcml2W2ldLnVzZWQgPSAwOwkgIAorICAgICAgICB9CisJCisJcmV0dXJuIDE7Cit9CisKK2RybV9pb2N0bF9kZXNjX3Qgc2lzX2lvY3Rsc1tdID0geworCVtEUk1fSU9DVExfTlIoRFJNX1NJU19GQl9BTExPQyldICA9IHsgc2lzX2ZiX2FsbG9jLCAgICAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19GQl9GUkVFKV0gICA9IHsgc2lzX2ZiX2ZyZWUsICAgICAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfSU5JVCldICA9IHsgc2lzX2lvY3RsX2FncF9pbml0LCAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfQUxMT0MpXSA9IHsgc2lzX2lvY3RsX2FncF9hbGxvYywgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfRlJFRSldICA9IHsgc2lzX2lvY3RsX2FncF9mcmVlLCAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19GQl9JTklUKV0gICA9IHsgc2lzX2ZiX2luaXQsICAgICAgICAgMSwgMSB9Cit9OworCitpbnQgc2lzX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKHNpc19pb2N0bHMpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3RkZnhfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3RkZnhfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3OTQzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuYwpAQCAtMCwwICsxLDEwNyBAQAorLyogdGRmeF9kcnYuYyAtLSB0ZGZ4IGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IFRodSBPY3QgIDcgMTA6Mzg6MzIgMTk5OSBieSBmYWl0aEBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqICAgIERhcnlsbCBTdHJhdXNzIDxkYXJ5bGxAdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJ0ZGZ4X2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgorCitzdGF0aWMgaW50IHBvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICkKK3sKKwlEUk1fSU5GTyggIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKKwkJRFJJVkVSX05BTUUsCisJCURSSVZFUl9NQUpPUiwKKwkJRFJJVkVSX01JTk9SLAorCQlEUklWRVJfUEFUQ0hMRVZFTCwKKwkJRFJJVkVSX0RBVEUsCisJCWRldi0+cHJpbWFyeS5taW5vciwKKwkJcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKKwkJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJzaW9uKCBkcm1fdmVyc2lvbl90ICp2ZXJzaW9uICkKK3sKKwlpbnQgbGVuOworCisJdmVyc2lvbi0+dmVyc2lvbl9tYWpvciA9IERSSVZFUl9NQUpPUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID0gRFJJVkVSX01JTk9SOworCXZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMOworCURSTV9DT1BZKCB2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kYXRlLCBEUklWRVJfREFURSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CisJdGRmeF9QQ0lfSURTCit9OworCitzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0geworCS5kcml2ZXJfZmVhdHVyZXMgPSBEUklWRVJfVVNFX01UUlIsCisJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKKwkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKKwkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKKwkucG9zdGluaXQgPSBwb3N0aW5pdCwKKwkudmVyc2lvbiA9IHZlcnNpb24sCisJLmZvcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub3BlbiA9IGRybV9vcGVuLAorCQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCQkuaW9jdGwgPSBkcm1faW9jdGwsCisJCS5tbWFwID0gZHJtX21tYXAsCisJCS5wb2xsID0gZHJtX3BvbGwsCisJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorCX0sCisJLnBjaV9kcml2ZXIgPSB7CisJCS5uYW1lICAgICAgICAgID0gRFJJVkVSX05BTUUsCisJCS5pZF90YWJsZSAgICAgID0gcGNpaWRsaXN0LAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRkZnhfaW5pdCh2b2lkKQoreworCXJldHVybiBkcm1faW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRkZnhfZXhpdCh2b2lkKQoreworCWRybV9leGl0KCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0ZGZ4X2luaXQpOworbW9kdWxlX2V4aXQodGRmeF9leGl0KTsKKworTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOworTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTgyYTNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS90ZGZ4X2Rydi5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIHRkZnguaCAtLSAzZGZ4IERSTSB0ZW1wbGF0ZSBjdXN0b21pemF0aW9uIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogV2VkIEZlYiAxNCAxMjozMjozMiAyMDAxIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaWZuZGVmIF9fVERGWF9IX18KKyNkZWZpbmUgX19UREZYX0hfXworCisvKiBUaGlzIHJlbWFpbnMgY29uc3RhbnQgZm9yIGFsbCBEUk0gdGVtcGxhdGUgZmlsZXMuCisgKi8KKyNkZWZpbmUgRFJNKHgpIHRkZnhfIyN4CisKKy8qIEdlbmVyYWwgY3VzdG9taXphdGlvbjoKKyAqLworCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJWQSBMaW51eCBTeXN0ZW1zIEluYy4iCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJ0ZGZ4IgorI2RlZmluZSBEUklWRVJfREVTQwkJIjNkZnggQmFuc2hlZS9Wb29kb28zKyIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDAxMDIxNiIKKworI2RlZmluZSBEUklWRVJfTUFKT1IJCTEKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQkwCisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHMxMjg2LmMgYi9kcml2ZXJzL2NoYXIvZHMxMjg2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1NWNhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kczEyODYuYwpAQCAtMCwwICsxLDU3OCBAQAorLyoKKyAqIERTMTI4NiBSZWFsIFRpbWUgQ2xvY2sgaW50ZXJmYWNlIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCBSYWxmIEJhZWNobGUKKyAqCisgKiBCYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgUGF1bCBHb3J0bWFrZXIuCisgKgorICogVGhpcyBkcml2ZXIgYWxsb3dzIHVzZSBvZiB0aGUgcmVhbCB0aW1lIGNsb2NrIChidWlsdCBpbnRvIG5lYXJseSBhbGwKKyAqIGNvbXB1dGVycykgZnJvbSB1c2VyIHNwYWNlLiBJdCBleHBvcnRzIHRoZSAvZGV2L3J0YyBpbnRlcmZhY2Ugc3VwcG9ydGluZworICogdmFyaW91cyBpb2N0bCgpIGFuZCBhbHNvIHRoZSAvcHJvYy9ydGMgcHNldWRvLWZpbGUgZm9yIHN0YXR1cworICogaW5mb3JtYXRpb24uCisgKgorICogVGhlIGlvY3RscyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGludGVycnVwdCBiZWhhdmlvdXIgYW5kIGdlbmVyYXRpb24gcmF0ZQorICogZnJvbSB0aGUgUlRDIHZpYSBJUlEgOC4gVGhlbiB0aGUgL2Rldi9ydGMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIG1ha2UKKyAqIHVzZSBvZiB0aGVzZSB0aW1lciBpbnRlcnJ1cHRzLCBiZSB0aGV5IGludGVydmFsIG9yIGFsYXJtIGJhc2VkLgorICoKKyAqIFRoZSAvZGV2L3J0YyBpbnRlcmZhY2Ugd2lsbCBibG9jayBvbiByZWFkcyB1bnRpbCBhbiBpbnRlcnJ1cHQgaGFzIGJlZW4KKyAqIHJlY2VpdmVkLiBJZiBhIFJUQyBpbnRlcnJ1cHQgaGFzIGFscmVhZHkgaGFwcGVuZWQsIGl0IHdpbGwgb3V0cHV0IGFuCisgKiB1bnNpZ25lZCBsb25nIGFuZCB0aGVuIGJsb2NrLiBUaGUgb3V0cHV0IHZhbHVlIGNvbnRhaW5zIHRoZSBpbnRlcnJ1cHQKKyAqIHN0YXR1cyBpbiB0aGUgbG93IGJ5dGUgYW5kIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cyBzaW5jZSB0aGUgbGFzdCByZWFkCisgKiBpbiB0aGUgcmVtYWluaW5nIGhpZ2ggYnl0ZXMuIFRoZSAvZGV2L3J0YyBpbnRlcmZhY2UgY2FuIGFsc28gYmUgdXNlZCB3aXRoCisgKiB0aGUgc2VsZWN0KDIpIGNhbGwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2RzMTI4Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIERTMTI4Nl9WRVJTSU9OCQkiMS4wIgorCisvKgorICoJV2Ugc3BvbmdlIGEgbWlub3Igb2ZmIG9mIHRoZSBtaXNjIG1ham9yLiBObyBuZWVkIHNsdXJwaW5nCisgKgl1cCBhbm90aGVyIHZhbHVhYmxlIG1ham9yIGRldiBudW1iZXIgZm9yIHRoaXMuIElmIHlvdSBhZGQKKyAqCWFuIGlvY3RsLCBtYWtlIHN1cmUgeW91IGRvbid0IGNvbmZsaWN0IHdpdGggU1BBUkMncyBSVEMKKyAqCWlvY3Rscy4KKyAqLworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZHMxMjg2X3dhaXQpOworCitzdGF0aWMgc3NpemVfdCBkczEyODZfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworCitzdGF0aWMgaW50IGRzMTI4Nl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBkczEyODZfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCk7CisKK3N0YXRpYyB2b2lkIGRzMTI4Nl9nZXRfYWxtX3RpbWUgKHN0cnVjdCBydGNfdGltZSAqYWxtX3RtKTsKK3N0YXRpYyB2b2lkIGRzMTI4Nl9nZXRfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSk7CitzdGF0aWMgaW50IGRzMTI4Nl9zZXRfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBkczEyODZfaXNfdXBkYXRpbmcodm9pZCk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZHMxMjg2X2xvY2spOworCitzdGF0aWMgaW50IGRzMTI4Nl9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CisKKy8qCisgKglCaXRzIGluIHJ0Y19zdGF0dXMuICg3IGJpdHMgb2Ygcm9vbSBmb3IgZnV0dXJlIGV4cGFuc2lvbikKKyAqLworCisjZGVmaW5lIFJUQ19JU19PUEVOCQkweDAxCS8qIG1lYW5zIC9kZXYvcnRjIGlzIGluIHVzZQkqLworI2RlZmluZSBSVENfVElNRVJfT04JCTB4MDIJLyogbWlzc2VkIGlycSB0aW1lciBhY3RpdmUJKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZHMxMjg2X3N0YXR1czsJLyogYml0bWFwcGVkIHN0YXR1cyBieXRlLgkqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBkYXlzX2luX21vW10gPSB7CisJMCwgMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMQorfTsKKworLyoKKyAqCU5vdyBhbGwgdGhlIHZhcmlvdXMgZmlsZSBvcGVyYXRpb25zIHRoYXQgd2UgZXhwb3J0LgorICovCisKK3N0YXRpYyBzc2l6ZV90IGRzMTI4Nl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBkczEyODZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgd3RpbWU7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0FJRV9PRkY6CS8qIE1hc2sgYWxhcm0gaW50LiBlbmFiLiBiaXQJKi8KKwl7CisJCXVuc2lnbmVkIGludCBmbGFnczsKKwkJdW5zaWduZWQgY2hhciB2YWw7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKwkJdmFsID0gcnRjX3JlYWQoUlRDX0NNRCk7CisJCXZhbCB8PSAgUlRDX1RETTsKKwkJcnRjX3dyaXRlKHZhbCwgUlRDX0NNRCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX0FJRV9PTjoJLyogQWxsb3cgYWxhcm0gaW50ZXJydXB0cy4JKi8KKwl7CisJCXVuc2lnbmVkIGludCBmbGFnczsKKwkJdW5zaWduZWQgY2hhciB2YWw7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKwkJdmFsID0gcnRjX3JlYWQoUlRDX0NNRCk7CisJCXZhbCAmPSAgflJUQ19URE07CisJCXJ0Y193cml0ZSh2YWwsIFJUQ19DTUQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkczEyODZfbG9jaywgZmxhZ3MpOworCisJCXJldHVybiAwOworCX0KKwljYXNlIFJUQ19XSUVfT0ZGOgkvKiBNYXNrIHdhdGNoZG9nIGludC4gZW5hYi4gYml0CSovCisJeworCQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJCXVuc2lnbmVkIGNoYXIgdmFsOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisJCXZhbCA9IHJ0Y19yZWFkKFJUQ19DTUQpOworCQl2YWwgfD0gUlRDX1dBTTsKKwkJcnRjX3dyaXRlKHZhbCwgUlRDX0NNRCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX1dJRV9PTjoJLyogQWxsb3cgd2F0Y2hkb2cgaW50ZXJydXB0cy4JKi8KKwl7CisJCXVuc2lnbmVkIGludCBmbGFnczsKKwkJdW5zaWduZWQgY2hhciB2YWw7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKwkJdmFsID0gcnRjX3JlYWQoUlRDX0NNRCk7CisJCXZhbCAmPSB+UlRDX1dBTTsKKwkJcnRjX3dyaXRlKHZhbCwgUlRDX0NNRCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX0FMTV9SRUFEOgkvKiBSZWFkIHRoZSBwcmVzZW50IGFsYXJtIHRpbWUgKi8KKwl7CisJCS8qCisJCSAqIFRoaXMgcmV0dXJucyBhIHN0cnVjdCBydGNfdGltZS4gUmVhZGluZyA+PSAweGMwCisJCSAqIG1lYW5zICJkb24ndCBjYXJlIiBvciAibWF0Y2ggYWxsIi4gT25seSB0aGUgdG1faG91ciwKKwkJICogdG1fbWluLCBhbmQgdG1fc2VjIHZhbHVlcyBhcmUgZmlsbGVkIGluLgorCQkgKi8KKworCQltZW1zZXQoJnd0aW1lLCAwLCBzaXplb2Yod3RpbWUpKTsKKwkJZHMxMjg2X2dldF9hbG1fdGltZSgmd3RpbWUpOworCQlicmVhazsKKwl9CisJY2FzZSBSVENfQUxNX1NFVDoJLyogU3RvcmUgYSB0aW1lIGludG8gdGhlIGFsYXJtICovCisJeworCQkvKgorCQkgKiBUaGlzIGV4cGVjdHMgYSBzdHJ1Y3QgcnRjX3RpbWUuIFdyaXRpbmcgMHhmZiBtZWFucworCQkgKiAiZG9uJ3QgY2FyZSIgb3IgIm1hdGNoIGFsbCIuIE9ubHkgdGhlIHRtX2hvdXIsCisJCSAqIHRtX21pbiBhbmQgdG1fc2VjIGFyZSB1c2VkLgorCQkgKi8KKwkJdW5zaWduZWQgY2hhciBocnMsIG1pbiwgc2VjOworCQlzdHJ1Y3QgcnRjX3RpbWUgYWxtX3RtOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhbG1fdG0sIChzdHJ1Y3QgcnRjX3RpbWUqKWFyZywKKwkJCQkgICBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlocnMgPSBhbG1fdG0udG1faG91cjsKKwkJbWluID0gYWxtX3RtLnRtX21pbjsKKworCQlpZiAoaHJzID49IDI0KQorCQkJaHJzID0gMHhmZjsKKworCQlpZiAobWluID49IDYwKQorCQkJbWluID0gMHhmZjsKKworCQlCSU5fVE9fQkNEKHNlYyk7CisJCUJJTl9UT19CQ0QobWluKTsKKwkJQklOX1RPX0JDRChocnMpOworCisJCXNwaW5fbG9jaygmZHMxMjg2X2xvY2spOworCQlydGNfd3JpdGUoaHJzLCBSVENfSE9VUlNfQUxBUk0pOworCQlydGNfd3JpdGUobWluLCBSVENfTUlOVVRFU19BTEFSTSk7CisJCXNwaW5fdW5sb2NrKCZkczEyODZfbG9jayk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX1JEX1RJTUU6CS8qIFJlYWQgdGhlIHRpbWUvZGF0ZSBmcm9tIFJUQwkqLworCXsKKwkJbWVtc2V0KCZ3dGltZSwgMCwgc2l6ZW9mKHd0aW1lKSk7CisJCWRzMTI4Nl9nZXRfdGltZSgmd3RpbWUpOworCQlicmVhazsKKwl9CisJY2FzZSBSVENfU0VUX1RJTUU6CS8qIFNldCB0aGUgUlRDICovCisJeworCQlzdHJ1Y3QgcnRjX3RpbWUgcnRjX3RtOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZydGNfdG0sIChzdHJ1Y3QgcnRjX3RpbWUqKWFyZywKKwkJCQkgICBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gZHMxMjg2X3NldF90aW1lKCZydGNfdG0pOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnd0aW1lLCBzaXplb2Ygd3RpbWUpID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qCisgKglXZSBlbmZvcmNlIG9ubHkgb25lIHVzZXIgYXQgYSB0aW1lIGhlcmUgd2l0aCB0aGUgb3Blbi9jbG9zZS4KKyAqCUFsc28gY2xlYXIgdGhlIHByZXZpb3VzIGludGVycnVwdCBkYXRhIG9uIGFuIG9wZW4sIGFuZCBjbGVhbgorICoJdXAgdGhpbmdzIG9uIGEgY2xvc2UuCisgKi8KKworc3RhdGljIGludCBkczEyODZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzcGluX2xvY2tfaXJxKCZkczEyODZfbG9jayk7CisKKwlpZiAoZHMxMjg2X3N0YXR1cyAmIFJUQ19JU19PUEVOKQorCQlnb3RvIG91dF9idXN5OworCisJZHMxMjg2X3N0YXR1cyB8PSBSVENfSVNfT1BFTjsKKworCXNwaW5fdW5sb2NrX2lycSgmZHMxMjg2X2xvY2spOworCXJldHVybiAwOworCitvdXRfYnVzeToKKwlzcGluX2xvY2tfaXJxKCZkczEyODZfbG9jayk7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBkczEyODZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlkczEyODZfc3RhdHVzICY9IH5SVENfSVNfT1BFTjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRzMTI4Nl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXBvbGxfd2FpdChmaWxlLCAmZHMxMjg2X3dhaXQsIHdhaXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglUaGUgdmFyaW91cyBmaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydC4KKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkczEyODZfZm9wcyA9IHsKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBkczEyODZfcmVhZCwKKwkucG9sbAkJPSBkczEyODZfcG9sbCwKKwkuaW9jdGwJCT0gZHMxMjg2X2lvY3RsLAorCS5vcGVuCQk9IGRzMTI4Nl9vcGVuLAorCS5yZWxlYXNlCT0gZHMxMjg2X3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZHMxMjg2X2Rldj0KK3sKKwkubWlub3IJPSBSVENfTUlOT1IsCisJLm5hbWUJPSAicnRjIiwKKwkuZm9wcwk9ICZkczEyODZfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzMTI4Nl9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCXByaW50ayhLRVJOX0lORk8gIkRTMTI4NiBSZWFsIFRpbWUgQ2xvY2sgRHJpdmVyIHYlc1xuIiwgRFMxMjg2X1ZFUlNJT04pOworCisJZXJyID0gbWlzY19yZWdpc3RlcigmZHMxMjg2X2Rldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlpZiAoIWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImRyaXZlci9ydGMiLCAwLCAwLCBkczEyODZfcmVhZF9wcm9jLCBOVUxMKSkgeworCQllcnIgPSAtRU5PTUVNOworCisJCWdvdG8gb3V0X2RlcmVnaXN0ZXI7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9kZXJlZ2lzdGVyOgorCW1pc2NfZGVyZWdpc3RlcigmZHMxMjg2X2Rldik7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHMxMjg2X2V4aXQodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyL3J0YyIsIE5VTEwpOworCW1pc2NfZGVyZWdpc3RlcigmZHMxMjg2X2Rldik7Cit9CisKK3N0YXRpYyBjaGFyICpkYXlzW10gPSB7CisJIioqKiIsICJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiCit9OworCisvKgorICoJSW5mbyBleHBvcnRlZCB2aWEgIi9wcm9jL3J0YyIuCisgKi8KK3N0YXRpYyBpbnQgZHMxMjg2X3Byb2Nfb3V0cHV0KGNoYXIgKmJ1ZikKK3sKKwljaGFyICpwLCAqczsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJdW5zaWduZWQgY2hhciBodW5kcmVkdGgsIG1vbnRoLCBjbWQsIGFtb2RlOworCisJcCA9IGJ1ZjsKKworCWRzMTI4Nl9nZXRfdGltZSgmdG0pOworCWh1bmRyZWR0aCA9IHJ0Y19yZWFkKFJUQ19IVU5EUkVEVEhfU0VDT05EKTsKKwlCQ0RfVE9fQklOKGh1bmRyZWR0aCk7CisKKwlwICs9IHNwcmludGYocCwKKwkgICAgICAgICAgICAgInJ0Y190aW1lXHQ6ICUwMmQ6JTAyZDolMDJkLiUwMmRcbiIKKwkgICAgICAgICAgICAgInJ0Y19kYXRlXHQ6ICUwNGQtJTAyZC0lMDJkXG4iLAorCQkgICAgIHRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjLCBodW5kcmVkdGgsCisJCSAgICAgdG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiArIDEsIHRtLnRtX21kYXkpOworCisJLyoKKwkgKiBXZSBpbXBsaWNpdGx5IGFzc3VtZSAyNGhyIG1vZGUgaGVyZS4gQWxhcm0gdmFsdWVzID49IDB4YzAgd2lsbAorCSAqIG1hdGNoIGFueSB2YWx1ZSBmb3IgdGhhdCBwYXJ0aWN1bGFyIGZpZWxkLiBWYWx1ZXMgdGhhdCBhcmUKKwkgKiBncmVhdGVyIHRoYW4gYSB2YWxpZCB0aW1lLCBidXQgbGVzcyB0aGFuIDB4YzAgc2hvdWxkbid0IGFwcGVhci4KKwkgKi8KKwlkczEyODZfZ2V0X2FsbV90aW1lKCZ0bSk7CisJcCArPSBzcHJpbnRmKHAsICJhbGFybVx0XHQ6ICVzICIsIGRheXNbdG0udG1fd2RheV0pOworCWlmICh0bS50bV9ob3VyIDw9IDI0KQorCQlwICs9IHNwcmludGYocCwgIiUwMmQ6IiwgdG0udG1faG91cik7CisJZWxzZQorCQlwICs9IHNwcmludGYocCwgIioqOiIpOworCisJaWYgKHRtLnRtX21pbiA8PSA1OSkKKwkJcCArPSBzcHJpbnRmKHAsICIlMDJkXG4iLCB0bS50bV9taW4pOworCWVsc2UKKwkJcCArPSBzcHJpbnRmKHAsICIqKlxuIik7CisKKwltb250aCA9IHJ0Y19yZWFkKFJUQ19NT05USCk7CisJcCArPSBzcHJpbnRmKHAsCisJICAgICAgICAgICAgICJvc2NpbGxhdG9yXHQ6ICVzXG4iCisJICAgICAgICAgICAgICJzcXVhcmVfd2F2ZVx0OiAlc1xuIiwKKwkgICAgICAgICAgICAgKG1vbnRoICYgUlRDX0VPU0MpID8gImRpc2FibGVkIiA6ICJlbmFibGVkIiwKKwkgICAgICAgICAgICAgKG1vbnRoICYgUlRDX0VTUVcpID8gImRpc2FibGVkIiA6ICJlbmFibGVkIik7CisKKwlhbW9kZSA9ICgocnRjX3JlYWQoUlRDX01JTlVURVNfQUxBUk0pICYgMHg4MCkgPj4gNSkgfAorCSAgICAgICAgKChydGNfcmVhZChSVENfSE9VUlNfQUxBUk0pICYgMHg4MCkgPj4gNikgfAorCSAgICAgICAgKChydGNfcmVhZChSVENfREFZX0FMQVJNKSAmIDB4ODApID4+IDcpOworCWlmIChhbW9kZSA9PSA3KSAgICAgIHMgPSAiZWFjaCBtaW51dGUiOworCWVsc2UgaWYgKGFtb2RlID09IDMpIHMgPSAibWludXRlcyBtYXRjaCI7CisJZWxzZSBpZiAoYW1vZGUgPT0gMSkgcyA9ICJob3VycyBhbmQgbWludXRlcyBtYXRjaCI7CisJZWxzZSBpZiAoYW1vZGUgPT0gMCkgcyA9ICJkYXlzLCBob3VycyBhbmQgbWludXRlcyBtYXRjaCI7CisJZWxzZSAgICAgICAgICAgICAgICAgcyA9ICJpbnZhbGlkIjsKKwlwICs9IHNwcmludGYocCwgImFsYXJtX21vZGVcdDogJXNcbiIsIHMpOworCisJY21kID0gcnRjX3JlYWQoUlRDX0NNRCk7CisJcCArPSBzcHJpbnRmKHAsCisJICAgICAgICAgICAgICJhbGFybV9lbmFibGVcdDogJXNcbiIKKwkgICAgICAgICAgICAgIndkb2dfYWxhcm1cdDogJXNcbiIKKwkgICAgICAgICAgICAgImFsYXJtX21hc2tcdDogJXNcbiIKKwkgICAgICAgICAgICAgIndkb2dfYWxhcm1fbWFza1x0OiAlc1xuIgorCSAgICAgICAgICAgICAiaW50ZXJydXB0X21vZGVcdDogJXNcbiIKKwkgICAgICAgICAgICAgIklOVEJfbW9kZVx0OiAlc19hY3RpdmVcbiIKKwkgICAgICAgICAgICAgImludGVycnVwdF9waW5zXHQ6ICVzXG4iLAorCQkgICAgIChjbWQgJiBSVENfVERGKSA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgICAoY21kICYgUlRDX1dBRikgPyAieWVzIiA6ICJubyIsCisJCSAgICAgKGNtZCAmIFJUQ19URE0pID8gImRpc2FibGVkIiA6ICJlbmFibGVkIiwKKwkJICAgICAoY21kICYgUlRDX1dBTSkgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiLAorCQkgICAgIChjbWQgJiBSVENfUFVfTFZMKSA/ICJwdWxzZSIgOiAibGV2ZWwiLAorCQkgICAgIChjbWQgJiBSVENfSUJIX0xPKSA/ICJsb3ciIDogImhpZ2giLAorCSAgICAgICAgICAgICAoY21kICYgUlRDX0lQU1cpID8gInVuc3dhcHBlZCIgOiAic3dhcHBlZCIpOworCisJcmV0dXJuICBwIC0gYnVmOworfQorCitzdGF0aWMgaW50IGRzMTI4Nl9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gZHMxMjg2X3Byb2Nfb3V0cHV0IChwYWdlKTsKKwlpZiAobGVuIDw9IG9mZitjb3VudCkgKmVvZiA9IDE7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKwlsZW4gLT0gb2ZmOworCWlmIChsZW4+Y291bnQpCisJCWxlbiA9IGNvdW50OworCWlmIChsZW48MCkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgYSBjbG9jayB1cGRhdGUgaXMgaW4gcHJvZ3Jlc3MKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGRzMTI4Nl9pc191cGRhdGluZyh2b2lkKQoreworCXJldHVybiBydGNfcmVhZChSVENfQ01EKSAmIFJUQ19URTsKK30KKworCitzdGF0aWMgdm9pZCBkczEyODZfZ2V0X3RpbWUoc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCit7CisJdW5zaWduZWQgY2hhciBzYXZlX2NvbnRyb2w7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdWlwX3dhdGNoZG9nID0gamlmZmllczsKKworCS8qCisJICogcmVhZCBSVEMgb25jZSBhbnkgdXBkYXRlIGluIHByb2dyZXNzIGlzIGRvbmUuIFRoZSB1cGRhdGUKKwkgKiBjYW4gdGFrZSBqdXN0IG92ZXIgMm1zLiBXZSB3YWl0IDEwIHRvIDIwbXMuIFRoZXJlIGlzIG5vIG5lZWQgdG8KKwkgKiB0byBwb2xsLXdhaXQgKHVwIHRvIDFzIC0gZWVjY2NoKSBmb3IgdGhlIGZhbGxpbmcgZWRnZSBvZiBSVENfVUlQLgorCSAqIElmIHlvdSBuZWVkIHRvIGtub3cgKmV4YWN0bHkqIHdoZW4gYSBzZWNvbmQgaGFzIHN0YXJ0ZWQsIGVuYWJsZQorCSAqIHBlcmlvZGljIHVwZGF0ZSBjb21wbGV0ZSBpbnRlcnJ1cHRzLCAodmlhIGlvY3RsKSBhbmQgdGhlbgorCSAqIGltbWVkaWF0ZWx5IHJlYWQgL2Rldi9ydGMgd2hpY2ggd2lsbCBibG9jayB1bnRpbCB5b3UgZ2V0IHRoZSBJUlEuCisJICogT25jZSB0aGUgcmVhZCBjbGVhcnMsIHJlYWQgdGhlIFJUQyB0aW1lIChhZ2FpbiB2aWEgaW9jdGwpLiBFYXN5LgorCSAqLworCisJaWYgKGRzMTI4Nl9pc191cGRhdGluZygpICE9IDApCisJCXdoaWxlIChqaWZmaWVzIC0gdWlwX3dhdGNoZG9nIDwgMipIWi8xMDApCisJCQliYXJyaWVyKCk7CisKKwkvKgorCSAqIE9ubHkgdGhlIHZhbHVlcyB0aGF0IHdlIHJlYWQgZnJvbSB0aGUgUlRDIGFyZSBzZXQuIFdlIGxlYXZlCisJICogdG1fd2RheSwgdG1feWRheSBhbmQgdG1faXNkc3QgdW50b3VjaGVkLiBFdmVuIHRob3VnaCB0aGUKKwkgKiBSVEMgaGFzIFJUQ19EQVlfT0ZfV0VFSywgd2UgaWdub3JlIGl0LCBhcyBpdCBpcyBvbmx5IHVwZGF0ZWQKKwkgKiBieSB0aGUgUlRDIHdoZW4gaW5pdGlhbGx5IHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkczEyODZfbG9jaywgZmxhZ3MpOworCXNhdmVfY29udHJvbCA9IHJ0Y19yZWFkKFJUQ19DTUQpOworCXJ0Y193cml0ZSgoc2F2ZV9jb250cm9sfFJUQ19URSksIFJUQ19DTUQpOworCisJcnRjX3RtLT50bV9zZWMgPSBydGNfcmVhZChSVENfU0VDT05EUyk7CisJcnRjX3RtLT50bV9taW4gPSBydGNfcmVhZChSVENfTUlOVVRFUyk7CisJcnRjX3RtLT50bV9ob3VyID0gcnRjX3JlYWQoUlRDX0hPVVJTKSAmIDB4M2Y7CisJcnRjX3RtLT50bV9tZGF5ID0gcnRjX3JlYWQoUlRDX0RBVEUpOworCXJ0Y190bS0+dG1fbW9uID0gcnRjX3JlYWQoUlRDX01PTlRIKSAmIDB4MWY7CisJcnRjX3RtLT50bV95ZWFyID0gcnRjX3JlYWQoUlRDX1lFQVIpOworCisJcnRjX3dyaXRlKHNhdmVfY29udHJvbCwgUlRDX0NNRCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9zZWMpOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9taW4pOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9ob3VyKTsKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbWRheSk7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX21vbik7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX3llYXIpOworCisJLyoKKwkgKiBBY2NvdW50IGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGhvdyB0aGUgUlRDIHVzZXMgdGhlIHZhbHVlcworCSAqIGFuZCBob3cgdGhleSBhcmUgZGVmaW5lZCBpbiBhIHN0cnVjdCBydGNfdGltZTsKKwkgKi8KKwlpZiAocnRjX3RtLT50bV95ZWFyIDwgNDUpCisJCXJ0Y190bS0+dG1feWVhciArPSAzMDsKKwlpZiAoKHJ0Y190bS0+dG1feWVhciArPSA0MCkgPCA3MCkKKwkJcnRjX3RtLT50bV95ZWFyICs9IDEwMDsKKworCXJ0Y190bS0+dG1fbW9uLS07Cit9CisKK3N0YXRpYyBpbnQgZHMxMjg2X3NldF90aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQoreworCXVuc2lnbmVkIGNoYXIgbW9uLCBkYXksIGhycywgbWluLCBzZWMsIGxlYXBfeXI7CisJdW5zaWduZWQgY2hhciBzYXZlX2NvbnRyb2w7CisJdW5zaWduZWQgaW50IHlycywgZmxhZ3M7CisKKworCXlycyA9IHJ0Y190bS0+dG1feWVhciArIDE5MDA7CisJbW9uID0gcnRjX3RtLT50bV9tb24gKyAxOyAgIC8qIHRtX21vbiBzdGFydHMgYXQgemVybyAqLworCWRheSA9IHJ0Y190bS0+dG1fbWRheTsKKwlocnMgPSBydGNfdG0tPnRtX2hvdXI7CisJbWluID0gcnRjX3RtLT50bV9taW47CisJc2VjID0gcnRjX3RtLT50bV9zZWM7CisKKwlpZiAoeXJzIDwgMTk3MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZWFwX3lyID0gKCghKHlycyAlIDQpICYmICh5cnMgJSAxMDApKSB8fCAhKHlycyAlIDQwMCkpOworCisJaWYgKChtb24gPiAxMikgfHwgKGRheSA9PSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGF5ID4gKGRheXNfaW5fbW9bbW9uXSArICgobW9uID09IDIpICYmIGxlYXBfeXIpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGhycyA+PSAyNCkgfHwgKG1pbiA+PSA2MCkgfHwgKHNlYyA+PSA2MCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCh5cnMgLT0gMTk0MCkgPiAyNTUpICAgIC8qIFRoZXkgYXJlIHVuc2lnbmVkICovCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHlycyA+PSAxMDApCisJCXlycyAtPSAxMDA7CisKKwlCSU5fVE9fQkNEKHNlYyk7CisJQklOX1RPX0JDRChtaW4pOworCUJJTl9UT19CQ0QoaHJzKTsKKwlCSU5fVE9fQkNEKGRheSk7CisJQklOX1RPX0JDRChtb24pOworCUJJTl9UT19CQ0QoeXJzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkczEyODZfbG9jaywgZmxhZ3MpOworCXNhdmVfY29udHJvbCA9IHJ0Y19yZWFkKFJUQ19DTUQpOworCXJ0Y193cml0ZSgoc2F2ZV9jb250cm9sfFJUQ19URSksIFJUQ19DTUQpOworCisJcnRjX3dyaXRlKHlycywgUlRDX1lFQVIpOworCXJ0Y193cml0ZShtb24sIFJUQ19NT05USCk7CisJcnRjX3dyaXRlKGRheSwgUlRDX0RBVEUpOworCXJ0Y193cml0ZShocnMsIFJUQ19IT1VSUyk7CisJcnRjX3dyaXRlKG1pbiwgUlRDX01JTlVURVMpOworCXJ0Y193cml0ZShzZWMsIFJUQ19TRUNPTkRTKTsKKwlydGNfd3JpdGUoMCwgUlRDX0hVTkRSRURUSF9TRUNPTkQpOworCisJcnRjX3dyaXRlKHNhdmVfY29udHJvbCwgUlRDX0NNRCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkczEyODZfZ2V0X2FsbV90aW1lKHN0cnVjdCBydGNfdGltZSAqYWxtX3RtKQoreworCXVuc2lnbmVkIGNoYXIgY21kOworCXVuc2lnbmVkIGludCBmbGFnczsKKworCS8qCisJICogT25seSB0aGUgdmFsdWVzIHRoYXQgd2UgcmVhZCBmcm9tIHRoZSBSVEMgYXJlIHNldC4gVGhhdAorCSAqIG1lYW5zIG9ubHkgdG1fd2RheSwgdG1faG91ciwgdG1fbWluLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkczEyODZfbG9jaywgZmxhZ3MpOworCWFsbV90bS0+dG1fbWluID0gcnRjX3JlYWQoUlRDX01JTlVURVNfQUxBUk0pICYgMHg3ZjsKKwlhbG1fdG0tPnRtX2hvdXIgPSBydGNfcmVhZChSVENfSE9VUlNfQUxBUk0pICAmIDB4MWY7CisJYWxtX3RtLT50bV93ZGF5ID0gcnRjX3JlYWQoUlRDX0RBWV9BTEFSTSkgICAgJiAweDA3OworCWNtZCA9IHJ0Y19yZWFkKFJUQ19DTUQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisKKwlCQ0RfVE9fQklOKGFsbV90bS0+dG1fbWluKTsKKwlCQ0RfVE9fQklOKGFsbV90bS0+dG1faG91cik7CisJYWxtX3RtLT50bV9zZWMgPSAwOworfQorCittb2R1bGVfaW5pdChkczEyODZfaW5pdCk7Cittb2R1bGVfZXhpdChkczEyODZfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlJhbGYgQmFlY2hsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoUlRDX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kczEzMDIuYyBiL2RyaXZlcnMvY2hhci9kczEzMDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzVlODYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RzMTMwMi5jCkBAIC0wLDAgKzEsMzU0IEBACisvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyohCisqISBGSUxFIE5BTUUgIDogZHMxMzAyLmMKKyohCisqISBERVNDUklQVElPTjogSW1wbGVtZW50cyBhbiBpbnRlcmZhY2UgZm9yIHRoZSBEUzEzMDIgUlRDCisqIQorKiEgRnVuY3Rpb25zIGV4cG9ydGVkOiBkczEzMDJfcmVhZHJlZywgZHMxMzAyX3dyaXRlcmVnLCBkczEzMDJfaW5pdCwgZ2V0X3J0Y19zdGF0dXMKKyohCisqISAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyohCisqISAoQykgQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIsIExVTkQsIFNXRURFTgorKiEKKyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3J0Yy5oPgorI2lmIGRlZmluZWQoQ09ORklHX00zMlIpCisjaW5jbHVkZSA8YXNtL20zMnIuaD4KKyNlbmRpZgorCisjZGVmaW5lIFJUQ19NQUpPUl9OUiAxMjEgLyogbG9jYWwgbWFqb3IsIGNoYW5nZSBsYXRlciAqLworCitzdGF0aWMgY29uc3QgY2hhciBkczEzMDJfbmFtZVtdID0gImRzMTMwMiI7CisKKy8qIFNlbmQgOCBiaXRzLiAqLworc3RhdGljIHZvaWQKK291dF9ieXRlX3J0Yyh1bnNpZ25lZCBpbnQgcmVnX2FkZHIsIHVuc2lnbmVkIGNoYXIgeCkKK3sKKwkvL1JTVCBICisJb3V0dygweDAwMDEsKHVuc2lnbmVkIGxvbmcpUExEX1JUQ1JTVE9EVCk7CisJLy93cml0ZSBkYXRhCisJb3V0dygoKHg8PDgpfChyZWdfYWRkciYweGZmKSksKHVuc2lnbmVkIGxvbmcpUExEX1JUQ1dSREFUQSk7CisJLy9XRQorCW91dHcoMHgwMDAyLCh1bnNpZ25lZCBsb25nKVBMRF9SVENDUik7CisJLy93YWl0CisJd2hpbGUoaW53KCh1bnNpZ25lZCBsb25nKVBMRF9SVENDUikpOworCisJLy9SU1QgTAorCW91dHcoMHgwMDAwLCh1bnNpZ25lZCBsb25nKVBMRF9SVENSU1RPRFQpOworCit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitpbl9ieXRlX3J0Yyh1bnNpZ25lZCBpbnQgcmVnX2FkZHIpCit7CisJdW5zaWduZWQgY2hhciByZXR2YWw7CisKKwkvL1JTVCBICisJb3V0dygweDAwMDEsKHVuc2lnbmVkIGxvbmcpUExEX1JUQ1JTVE9EVCk7CisJLy93cml0ZSBkYXRhCisJb3V0dygocmVnX2FkZHImMHhmZiksKHVuc2lnbmVkIGxvbmcpUExEX1JUQ1JEREFUQSk7CisJLy9SRQorCW91dHcoMHgwMDAxLCh1bnNpZ25lZCBsb25nKVBMRF9SVENDUik7CisJLy93YWl0CisJd2hpbGUoaW53KCh1bnNpZ25lZCBsb25nKVBMRF9SVENDUikpOworCisJLy9yZWFkIGRhdGEKKwlyZXR2YWw9KGludygodW5zaWduZWQgbG9uZylQTERfUlRDUkREQVRBKSAmIDB4ZmYwMCk+Pjg7CisKKwkvL1JTVCBMCisJb3V0dygweDAwMDAsKHVuc2lnbmVkIGxvbmcpUExEX1JUQ1JTVE9EVCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBFbmFibGUgd3JpdGluZy4gKi8KKworc3RhdGljIHZvaWQKK2RzMTMwMl93ZW5hYmxlKHZvaWQpCit7CisJb3V0X2J5dGVfcnRjKDB4OGUsMHgwMCk7Cit9CisKKy8qIERpc2FibGUgd3JpdGluZy4gKi8KKworc3RhdGljIHZvaWQKK2RzMTMwMl93ZGlzYWJsZSh2b2lkKQoreworCW91dF9ieXRlX3J0YygweDhlLDB4ODApOworfQorCisKKworLyogUmVhZCBhIGJ5dGUgZnJvbSB0aGUgc2VsZWN0ZWQgcmVnaXN0ZXIgaW4gdGhlIERTMTMwMi4gKi8KKwordW5zaWduZWQgY2hhcgorZHMxMzAyX3JlYWRyZWcoaW50IHJlZykKK3sKKwl1bnNpZ25lZCBjaGFyIHg7CisKKwl4PWluX2J5dGVfcnRjKCgweDgxIHwgKHJlZyA8PCAxKSkpOyAvKiByZWFkIHJlZ2lzdGVyICovCisKKwlyZXR1cm4geDsKK30KKworLyogV3JpdGUgYSBieXRlIHRvIHRoZSBzZWxlY3RlZCByZWdpc3Rlci4gKi8KKwordm9pZAorZHMxMzAyX3dyaXRlcmVnKGludCByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKQoreworCWRzMTMwMl93ZW5hYmxlKCk7CisJb3V0X2J5dGVfcnRjKCgweDgwIHwgKHJlZyA8PCAxKSksdmFsKTsKKwlkczEzMDJfd2Rpc2FibGUoKTsKK30KKwordm9pZAorZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCXJ0Y190bS0+dG1fc2VjID0gQ01PU19SRUFEKFJUQ19TRUNPTkRTKTsKKwlydGNfdG0tPnRtX21pbiA9IENNT1NfUkVBRChSVENfTUlOVVRFUyk7CisJcnRjX3RtLT50bV9ob3VyID0gQ01PU19SRUFEKFJUQ19IT1VSUyk7CisJcnRjX3RtLT50bV9tZGF5ID0gQ01PU19SRUFEKFJUQ19EQVlfT0ZfTU9OVEgpOworCXJ0Y190bS0+dG1fbW9uID0gQ01PU19SRUFEKFJUQ19NT05USCk7CisJcnRjX3RtLT50bV95ZWFyID0gQ01PU19SRUFEKFJUQ19ZRUFSKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9zZWMpOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9taW4pOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9ob3VyKTsKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbWRheSk7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX21vbik7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX3llYXIpOworCisJLyoKKwkgKiBBY2NvdW50IGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGhvdyB0aGUgUlRDIHVzZXMgdGhlIHZhbHVlcworCSAqIGFuZCBob3cgdGhleSBhcmUgZGVmaW5lZCBpbiBhIHN0cnVjdCBydGNfdGltZTsKKwkgKi8KKworCWlmIChydGNfdG0tPnRtX3llYXIgPD0gNjkpCisJCXJ0Y190bS0+dG1feWVhciArPSAxMDA7CisKKwlydGNfdG0tPnRtX21vbi0tOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBkYXlzX2luX21vW10gPQorICAgIHswLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfTsKKworLyogaW9jdGwgdGhhdCBzdXBwb3J0cyBSVENfUkRfVElNRSBhbmQgUlRDX1NFVF9USU1FIChyZWFkIGFuZCBzZXQgdGltZS9kYXRlKS4gKi8KKworc3RhdGljIGludAorcnRjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBSVENfUkRfVElNRToJLyogcmVhZCB0aGUgdGltZS9kYXRlIGZyb20gUlRDCSovCisJCXsKKwkJCXN0cnVjdCBydGNfdGltZSBydGNfdG07CisKKwkJCW1lbXNldCgmcnRjX3RtLCAwLCBzaXplb2YgKHN0cnVjdCBydGNfdGltZSkpOworCQkJZ2V0X3J0Y190aW1lKCZydGNfdG0pOworCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IHJ0Y190aW1lKilhcmcsICZydGNfdG0sIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJY2FzZSBSVENfU0VUX1RJTUU6CS8qIHNldCB0aGUgUlRDICovCisJCXsKKwkJCXN0cnVjdCBydGNfdGltZSBydGNfdG07CisJCQl1bnNpZ25lZCBjaGFyIG1vbiwgZGF5LCBocnMsIG1pbiwgc2VjLCBsZWFwX3lyOworCQkJdW5zaWduZWQgaW50IHlyczsKKworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQkJcmV0dXJuIC1FUEVSTTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZydGNfdG0sIChzdHJ1Y3QgcnRjX3RpbWUqKWFyZywgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQl5cnMgPSBydGNfdG0udG1feWVhciArIDE5MDA7CisJCQltb24gPSBydGNfdG0udG1fbW9uICsgMTsgICAvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KKwkJCWRheSA9IHJ0Y190bS50bV9tZGF5OworCQkJaHJzID0gcnRjX3RtLnRtX2hvdXI7CisJCQltaW4gPSBydGNfdG0udG1fbWluOworCQkJc2VjID0gcnRjX3RtLnRtX3NlYzsKKworCisJCQlpZiAoKHlycyA8IDE5NzApIHx8ICh5cnMgPiAyMDY5KSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJbGVhcF95ciA9ICgoISh5cnMgJSA0KSAmJiAoeXJzICUgMTAwKSkgfHwgISh5cnMgJSA0MDApKTsKKworCQkJaWYgKChtb24gPiAxMikgfHwgKGRheSA9PSAwKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKGRheSA+IChkYXlzX2luX21vW21vbl0gKyAoKG1vbiA9PSAyKSAmJiBsZWFwX3lyKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmICgoaHJzID49IDI0KSB8fCAobWluID49IDYwKSB8fCAoc2VjID49IDYwKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKHlycyA+PSAyMDAwKQorCQkJCXlycyAtPSAyMDAwOwkvKiBSVEMgKDAsIDEsIC4uLiA2OSkgKi8KKwkJCWVsc2UKKwkJCQl5cnMgLT0gMTkwMDsJLyogUlRDICg3MCwgNzEsIC4uLiA5OSkgKi8KKworCQkJQklOX1RPX0JDRChzZWMpOworCQkJQklOX1RPX0JDRChtaW4pOworCQkJQklOX1RPX0JDRChocnMpOworCQkJQklOX1RPX0JDRChkYXkpOworCQkJQklOX1RPX0JDRChtb24pOworCQkJQklOX1RPX0JDRCh5cnMpOworCisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQkJQ01PU19XUklURSh5cnMsIFJUQ19ZRUFSKTsKKwkJCUNNT1NfV1JJVEUobW9uLCBSVENfTU9OVEgpOworCQkJQ01PU19XUklURShkYXksIFJUQ19EQVlfT0ZfTU9OVEgpOworCQkJQ01PU19XUklURShocnMsIFJUQ19IT1VSUyk7CisJCQlDTU9TX1dSSVRFKG1pbiwgUlRDX01JTlVURVMpOworCQkJQ01PU19XUklURShzZWMsIFJUQ19TRUNPTkRTKTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCQkJLyogTm90aWNlIHRoYXQgYXQgdGhpcyBwb2ludCwgdGhlIFJUQyBpcyB1cGRhdGVkIGJ1dAorCQkJICogdGhlIGtlcm5lbCBpcyBzdGlsbCBydW5uaW5nIHdpdGggdGhlIG9sZCB0aW1lLgorCQkJICogWW91IG5lZWQgdG8gc2V0IHRoYXQgc2VwYXJhdGVseSB3aXRoIHNldHRpbWVvZmRheQorCQkJICogb3IgYWRqdGltZXguCisJCQkgKi8KKwkJCXJldHVybiAwOworCQl9CisKKwkJY2FzZSBSVENfU0VUX0NIQVJHRTogLyogc2V0IHRoZSBSVEMgVFJJQ0tMRSBDSEFSR0UgcmVnaXN0ZXIgKi8KKwkJeworCQkJaW50IHRjc192YWw7CisKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJCXJldHVybiAtRVBFUk07CisKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZ0Y3NfdmFsLCAoaW50KilhcmcsIHNpemVvZihpbnQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJdGNzX3ZhbCA9IFJUQ19UQ1JfUEFUVEVSTiB8ICh0Y3NfdmFsICYgMHgwRik7CisJCQlkczEzMDJfd3JpdGVyZWcoUlRDX1RSSUNLTEVDSEFSR0VSLCB0Y3NfdmFsKTsKKwkJCXJldHVybiAwOworCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK2ludAorZ2V0X3J0Y19zdGF0dXMoY2hhciAqYnVmKQoreworCWNoYXIgKnA7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCisJcCA9IGJ1ZjsKKworCWdldF9ydGNfdGltZSgmdG0pOworCisJLyoKKwkgKiBUaGVyZSBpcyBubyB3YXkgdG8gdGVsbCBpZiB0aGUgbHVzZXIgaGFzIHRoZSBSVEMgc2V0IGZvciBsb2NhbAorCSAqIHRpbWUgb3IgZm9yIFVuaXZlcnNhbCBTdGFuZGFyZCBUaW1lIChHTVQpLiBQcm9iYWJseSBsb2NhbCB0aG91Z2guCisJICovCisKKwlwICs9IHNwcmludGYocCwKKwkJInJ0Y190aW1lXHQ6ICUwMmQ6JTAyZDolMDJkXG4iCisJCSJydGNfZGF0ZVx0OiAlMDRkLSUwMmQtJTAyZFxuIiwKKwkJdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMsCisJCXRtLnRtX3llYXIgKyAxOTAwLCB0bS50bV9tb24gKyAxLCB0bS50bV9tZGF5KTsKKworCXJldHVybiAgcCAtIGJ1ZjsKK30KKworCisvKiBUaGUgdmFyaW91cyBmaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydC4gKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAkJPSBydGNfaW9jdGwsCit9OworCisvKiBQcm9iZSBmb3IgdGhlIGNoaXAgYnkgd3JpdGluZyBzb21ldGhpbmcgdG8gaXRzIFJBTSBhbmQgdHJ5IHJlYWRpbmcgaXQgYmFjay4gKi8KKworI2RlZmluZSBNQUdJQ19QQVRURVJOIDB4NDIKKworc3RhdGljIGludCBfX2luaXQKK2RzMTMwMl9wcm9iZSh2b2lkKQoreworCWludCByZXR2YWwsIHJlcywgYmF1cjsKKworCWJhdXI9KGJvb3RfY3B1X2RhdGEuYnVzX2Nsb2NrLygyKjEwMDAqMTAwMCkpOworCisJcHJpbnRrKCIlczogU2V0IFBMRF9SVENCQVVSID0gJWRcbiIsIGRzMTMwMl9uYW1lLGJhdXIpOworCisJb3V0dygweDAwMDAsKHVuc2lnbmVkIGxvbmcpUExEX1JUQ0NSKTsKKwlvdXR3KDB4MDAwMCwodW5zaWduZWQgbG9uZylQTERfUlRDUlNUT0RUKTsKKwlvdXR3KGJhdXIsKHVuc2lnbmVkIGxvbmcpUExEX1JUQ0JBVVIpOworCisJLyogVHJ5IHRvIHRhbGsgdG8gdGltZWtlZXBlci4gKi8KKworCWRzMTMwMl93ZW5hYmxlKCk7CisJLyogd3JpdGUgUkFNIGJ5dGUgMCAqLworCS8qIHdyaXRlIHNvbWV0aGluZyBtYWdpYyAqLworCW91dF9ieXRlX3J0YygweGMwLE1BR0lDX1BBVFRFUk4pOworCisJLyogcmVhZCBSQU0gYnl0ZSAwICovCisJaWYoKHJlcyA9IGluX2J5dGVfcnRjKDB4YzEpKSA9PSBNQUdJQ19QQVRURVJOKSB7CisJCWNoYXIgYnVmWzEwMF07CisJCWRzMTMwMl93ZGlzYWJsZSgpOworCQlwcmludGsoIiVzOiBSVEMgZm91bmQuXG4iLCBkczEzMDJfbmFtZSk7CisJCWdldF9ydGNfc3RhdHVzKGJ1Zik7CisJCXByaW50ayhidWYpOworCQlyZXR2YWwgPSAxOworCX0gZWxzZSB7CisJCXByaW50aygiJXM6IFJUQyBub3QgZm91bmQuXG4iLCBkczEzMDJfbmFtZSk7CisJCXJldHZhbCA9IDA7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKiBKdXN0IHByb2JlIGZvciB0aGUgUlRDIGFuZCByZWdpc3RlciB0aGUgZGV2aWNlIHRvIGhhbmRsZSB0aGUgaW9jdGwgbmVlZGVkLiAqLworCitpbnQgX19pbml0CitkczEzMDJfaW5pdCh2b2lkKQoreworCWlmICghZHMxMzAyX3Byb2JlKCkpIHsKKwkJcmV0dXJuIC0xOworICAJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkczEzMDJfcmVnaXN0ZXIodm9pZCkKK3sKKwlkczEzMDJfaW5pdCgpOworCWlmIChyZWdpc3Rlcl9jaHJkZXYoUlRDX01BSk9SX05SLCBkczEzMDJfbmFtZSwgJnJ0Y19mb3BzKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5hYmxlIHRvIGdldCBtYWpvciAlZCBmb3IgcnRjXG4iLAorCQkgICAgICAgZHMxMzAyX25hbWUsIFJUQ19NQUpPUl9OUik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KGRzMTMwMl9yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHMxNjIwLmMgYi9kcml2ZXJzL2NoYXIvZHMxNjIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlZjZhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kczE2MjAuYwpAQCAtMCwwICsxLDQxNiBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvY2hhci9kczE2MjAuYzogRGFsbGFzIFNlbWljb25kdWN0b3JzIERTMTYyMAorICogICB0aGVybW9tZXRlciBkcml2ZXIgKGFzIHVzZWQgaW4gdGhlIFJlYmVsLmNvbSBOZXRXaW5kZXIpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3RoZXJtLmg+CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyogZGVmaW5lIGZvciAvcHJvYyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgVEhFUk1fVVNFX1BST0MKKyNlbmRpZgorCisvKiBEZWZpbml0aW9ucyBmb3IgRFMxNjIwIGNoaXAgKi8KKyNkZWZpbmUgVEhFUk1fU1RBUlRfQ09OVkVSVAkweGVlCisjZGVmaW5lIFRIRVJNX1JFU0VUCQkweGFmCisjZGVmaW5lIFRIRVJNX1JFQURfQ09ORklHCTB4YWMKKyNkZWZpbmUgVEhFUk1fUkVBRF9URU1QCQkweGFhCisjZGVmaW5lIFRIRVJNX1JFQURfVEwJCTB4YTIKKyNkZWZpbmUgVEhFUk1fUkVBRF9USAkJMHhhMQorI2RlZmluZSBUSEVSTV9XUklURV9DT05GSUcJMHgwYworI2RlZmluZSBUSEVSTV9XUklURV9UTAkJMHgwMgorI2RlZmluZSBUSEVSTV9XUklURV9USAkJMHgwMQorCisjZGVmaW5lIENGR19DUFUJCQkyCisjZGVmaW5lIENGR18xU0hPVAkJMQorCitzdGF0aWMgY29uc3QgY2hhciAqZmFuX3N0YXRlW10gPSB7ICJvZmYiLCAib24iLCAib24gKGhhcmR3aXJlZCkiIH07CisKKy8qCisgKiBTdGFydCBvZiBOZXRXaW5kZXIgc3BlY2lmaWNzCisgKiAgTm90ZSEgIFdlIGhhdmUgdG8gaG9sZCB0aGUgZ3BpbyBsb2NrIHdpdGggSVJRcyBkaXNhYmxlZCBvdmVyIHRoZQorICogIHdob2xlIG9mIG91ciB0cmFuc2FjdGlvbiB0byB0aGUgRGFsbGFzIGNoaXAsIHNpbmNlIHRoZXJlIGlzIGEKKyAqICBjaGFuY2UgdGhhdCB0aGUgV2F2ZUFydGlzdCBkcml2ZXIgY291bGQgdG91Y2ggdGhlc2UgYml0cyB0bworICogIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzcGVha2VyLgorICovCitleHRlcm4gc3BpbmxvY2tfdCBncGlvX2xvY2s7CitleHRlcm4gdW5zaWduZWQgaW50IHN5c3RlbV9yZXY7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXR3aW5kZXJfZHMxNjIwX3NldF9jbGsoaW50IGNsaykKK3sKKwlncGlvX21vZGlmeV9vcChHUElPX0RTQ0xLLCBjbGsgPyBHUElPX0RTQ0xLIDogMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXR3aW5kZXJfZHMxNjIwX3NldF9kYXRhKGludCBkYXQpCit7CisJZ3Bpb19tb2RpZnlfb3AoR1BJT19EQVRBLCBkYXQgPyBHUElPX0RBVEEgOiAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmV0d2luZGVyX2RzMTYyMF9nZXRfZGF0YSh2b2lkKQoreworCXJldHVybiBncGlvX3JlYWQoKSAmIEdQSU9fREFUQTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHdpbmRlcl9kczE2MjBfc2V0X2RhdGFfZGlyKGludCBkaXIpCit7CisJZ3Bpb19tb2RpZnlfaW8oR1BJT19EQVRBLCBkaXIgPyBHUElPX0RBVEEgOiAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHdpbmRlcl9kczE2MjBfcmVzZXQodm9pZCkKK3sKKwljcGxkX21vZGlmeShDUExEX0RTX0VOQUJMRSwgMCk7CisJY3BsZF9tb2RpZnkoQ1BMRF9EU19FTkFCTEUsIENQTERfRFNfRU5BQkxFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHdpbmRlcl9sb2NrKHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssICpmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXR3aW5kZXJfdW5sb2NrKHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgKmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHdpbmRlcl9zZXRfZmFuKGludCBpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJZ3Bpb19tb2RpZnlfb3AoR1BJT19GQU4sIGkgPyBHUElPX0ZBTiA6IDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZXR3aW5kZXJfZ2V0X2Zhbih2b2lkKQoreworCWlmICgoc3lzdGVtX3JldiAmIDB4ZjAwMCkgPT0gMHg0MDAwKQorCQlyZXR1cm4gRkFOX0FMV0FZU19PTjsKKworCXJldHVybiAoZ3Bpb19yZWFkKCkgJiBHUElPX0ZBTikgPyBGQU5fT04gOiBGQU5fT0ZGOworfQorCisvKgorICogRW5kIG9mIE5ldFdpbmRlciBzcGVjaWZpY3MKKyAqLworCitzdGF0aWMgdm9pZCBkczE2MjBfc2VuZF9iaXRzKGludCBuciwgaW50IHZhbHVlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJbmV0d2luZGVyX2RzMTYyMF9zZXRfZGF0YSh2YWx1ZSAmIDEpOworCQluZXR3aW5kZXJfZHMxNjIwX3NldF9jbGsoMCk7CisJCXVkZWxheSgxKTsKKwkJbmV0d2luZGVyX2RzMTYyMF9zZXRfY2xrKDEpOworCQl1ZGVsYXkoMSk7CisKKwkJdmFsdWUgPj49IDE7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRzMTYyMF9yZWN2X2JpdHMoaW50IG5yKQoreworCXVuc2lnbmVkIGludCB2YWx1ZSA9IDAsIG1hc2sgPSAxOworCWludCBpOworCisJbmV0d2luZGVyX2RzMTYyMF9zZXRfZGF0YSgwKTsKKworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCW5ldHdpbmRlcl9kczE2MjBfc2V0X2NsaygwKTsKKwkJdWRlbGF5KDEpOworCisJCWlmIChuZXR3aW5kZXJfZHMxNjIwX2dldF9kYXRhKCkpCisJCQl2YWx1ZSB8PSBtYXNrOworCisJCW1hc2sgPDw9IDE7CisKKwkJbmV0d2luZGVyX2RzMTYyMF9zZXRfY2xrKDEpOworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBkczE2MjBfb3V0KGludCBjbWQsIGludCBiaXRzLCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5ldHdpbmRlcl9sb2NrKCZmbGFncyk7CisJbmV0d2luZGVyX2RzMTYyMF9zZXRfY2xrKDEpOworCW5ldHdpbmRlcl9kczE2MjBfc2V0X2RhdGFfZGlyKDApOworCW5ldHdpbmRlcl9kczE2MjBfcmVzZXQoKTsKKworCXVkZWxheSgxKTsKKworCWRzMTYyMF9zZW5kX2JpdHMoOCwgY21kKTsKKwlpZiAoYml0cykKKwkJZHMxNjIwX3NlbmRfYml0cyhiaXRzLCB2YWx1ZSk7CisKKwl1ZGVsYXkoMSk7CisKKwluZXR3aW5kZXJfZHMxNjIwX3Jlc2V0KCk7CisJbmV0d2luZGVyX3VubG9jaygmZmxhZ3MpOworCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KDIpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRzMTYyMF9pbihpbnQgY21kLCBpbnQgYml0cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCW5ldHdpbmRlcl9sb2NrKCZmbGFncyk7CisJbmV0d2luZGVyX2RzMTYyMF9zZXRfY2xrKDEpOworCW5ldHdpbmRlcl9kczE2MjBfc2V0X2RhdGFfZGlyKDApOworCW5ldHdpbmRlcl9kczE2MjBfcmVzZXQoKTsKKworCXVkZWxheSgxKTsKKworCWRzMTYyMF9zZW5kX2JpdHMoOCwgY21kKTsKKworCW5ldHdpbmRlcl9kczE2MjBfc2V0X2RhdGFfZGlyKDEpOworCXZhbHVlID0gZHMxNjIwX3JlY3ZfYml0cyhiaXRzKTsKKworCW5ldHdpbmRlcl9kczE2MjBfcmVzZXQoKTsKKwluZXR3aW5kZXJfdW5sb2NrKCZmbGFncyk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgY3Z0XzlfdG9faW50KHVuc2lnbmVkIGludCB2YWwpCit7CisJaWYgKHZhbCAmIDB4MTAwKQorCQl2YWwgfD0gMHhmZmZmZmUwMDsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGRzMTYyMF93cml0ZV9zdGF0ZShzdHJ1Y3QgdGhlcm0gKnRoZXJtKQoreworCWRzMTYyMF9vdXQoVEhFUk1fV1JJVEVfQ09ORklHLCA4LCBDRkdfQ1BVKTsKKwlkczE2MjBfb3V0KFRIRVJNX1dSSVRFX1RMLCA5LCB0aGVybS0+bG8pOworCWRzMTYyMF9vdXQoVEhFUk1fV1JJVEVfVEgsIDksIHRoZXJtLT5oaSk7CisJZHMxNjIwX291dChUSEVSTV9TVEFSVF9DT05WRVJULCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZHMxNjIwX3JlYWRfc3RhdGUoc3RydWN0IHRoZXJtICp0aGVybSkKK3sKKwl0aGVybS0+bG8gPSBjdnRfOV90b19pbnQoZHMxNjIwX2luKFRIRVJNX1JFQURfVEwsIDkpKTsKKwl0aGVybS0+aGkgPSBjdnRfOV90b19pbnQoZHMxNjIwX2luKFRIRVJNX1JFQURfVEgsIDkpKTsKK30KKworc3RhdGljIHNzaXplX3QKK2RzMTYyMF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHRyKQoreworCXNpZ25lZCBpbnQgY3VyX3RlbXA7CisJc2lnbmVkIGNoYXIgY3VyX3RlbXBfZGVnRjsKKworCWN1cl90ZW1wID0gY3Z0XzlfdG9faW50KGRzMTYyMF9pbihUSEVSTV9SRUFEX1RFTVAsIDkpKSA+PiAxOworCisJLyogY29udmVydCB0byBGYWhyZW5oZWl0LCBhcyBwZXIgd2R0LmMgKi8KKwljdXJfdGVtcF9kZWdGID0gKGN1cl90ZW1wICogOSkgLyA1ICsgMzI7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgJmN1cl90ZW1wX2RlZ0YsIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitkczE2MjBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB0aGVybSB0aGVybTsKKwl1bmlvbiB7CisJCXN0cnVjdCB0aGVybSBfX3VzZXIgKnRoZXJtOworCQlpbnQgX191c2VyICppOworCX0gdWFyZzsKKwlpbnQgaTsKKworCXVhcmcuaSA9IChpbnQgX191c2VyICopYXJnOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgQ01EX1NFVF9USEVSTU9TVEFURToKKwljYXNlIENNRF9TRVRfVEhFUk1PU1RBVEUyOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChjbWQgPT0gQ01EX1NFVF9USEVSTU9TVEFURSkgeworCQkJaWYgKGdldF91c2VyKHRoZXJtLmhpLCB1YXJnLmkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdGhlcm0ubG8gPSB0aGVybS5oaSAtIDM7CisJCX0gZWxzZSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnRoZXJtLCB1YXJnLnRoZXJtLCBzaXplb2YodGhlcm0pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXRoZXJtLmxvIDw8PSAxOworCQl0aGVybS5oaSA8PD0gMTsKKworCQlkczE2MjBfd3JpdGVfc3RhdGUoJnRoZXJtKTsKKwkJYnJlYWs7CisKKwljYXNlIENNRF9HRVRfVEhFUk1PU1RBVEU6CisJY2FzZSBDTURfR0VUX1RIRVJNT1NUQVRFMjoKKwkJZHMxNjIwX3JlYWRfc3RhdGUoJnRoZXJtKTsKKworCQl0aGVybS5sbyA+Pj0gMTsKKwkJdGhlcm0uaGkgPj49IDE7CisKKwkJaWYgKGNtZCA9PSBDTURfR0VUX1RIRVJNT1NUQVRFKSB7CisJCQlpZiAocHV0X3VzZXIodGhlcm0uaGksIHVhcmcuaSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlpZiAoY29weV90b191c2VyKHVhcmcudGhlcm0sICZ0aGVybSwgc2l6ZW9mKHRoZXJtKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENNRF9HRVRfVEVNUEVSQVRVUkU6CisJY2FzZSBDTURfR0VUX1RFTVBFUkFUVVJFMjoKKwkJaSA9IGN2dF85X3RvX2ludChkczE2MjBfaW4oVEhFUk1fUkVBRF9URU1QLCA5KSk7CisKKwkJaWYgKGNtZCA9PSBDTURfR0VUX1RFTVBFUkFUVVJFKQorCQkJaSA+Pj0gMTsKKworCQlyZXR1cm4gcHV0X3VzZXIoaSwgdWFyZy5pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBDTURfR0VUX1NUQVRVUzoKKwkJaSA9IGRzMTYyMF9pbihUSEVSTV9SRUFEX0NPTkZJRywgOCkgJiAweGUzOworCisJCXJldHVybiBwdXRfdXNlcihpLCB1YXJnLmkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIENNRF9HRVRfRkFOOgorCQlpID0gbmV0d2luZGVyX2dldF9mYW4oKTsKKworCQlyZXR1cm4gcHV0X3VzZXIoaSwgdWFyZy5pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBDTURfU0VUX0ZBTjoKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoZ2V0X3VzZXIoaSwgdWFyZy5pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCW5ldHdpbmRlcl9zZXRfZmFuKGkpOworCQlicmVhazsKKwkJCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFRIRVJNX1VTRV9QUk9DCitzdGF0aWMgaW50Citwcm9jX3RoZXJtX2RzMTYyMF9yZWFkKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCSAgICAgICBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqdW51c2VkKQoreworCXN0cnVjdCB0aGVybSB0aDsKKwlpbnQgdGVtcDsKKworCWRzMTYyMF9yZWFkX3N0YXRlKCZ0aCk7CisJdGVtcCA9ICBjdnRfOV90b19pbnQoZHMxNjIwX2luKFRIRVJNX1JFQURfVEVNUCwgOSkpOworCisJbGVuID0gc3ByaW50ZihidWYsICJUaGVybW9zdGF0OiBISSAlaS4laSwgTE9XICVpLiVpOyAiCisJCSAgICAgICJ0ZW1wZXJhdHVyZTogJWkuJWkgQywgZmFuICVzXG4iLAorCQkgICAgICB0aC5oaSA+PiAxLCB0aC5oaSAmIDEgPyA1IDogMCwKKwkJICAgICAgdGgubG8gPj4gMSwgdGgubG8gJiAxID8gNSA6IDAsCisJCSAgICAgIHRlbXAgID4+IDEsIHRlbXAgICYgMSA/IDUgOiAwLAorCQkgICAgICBmYW5fc3RhdGVbbmV0d2luZGVyX2dldF9mYW4oKV0pOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY190aGVybV9kczE2MjA7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHMxNjIwX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IG5vbnNlZWthYmxlX29wZW4sCisJLnJlYWQJCT0gZHMxNjIwX3JlYWQsCisJLmlvY3RsCQk9IGRzMTYyMF9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBkczE2MjBfbWlzY2RldiA9IHsKKwlURU1QX01JTk9SLAorCSJ0ZW1wIiwKKwkmZHMxNjIwX2ZvcHMKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzMTYyMF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdGhlcm0gdGgsIHRoX3N0YXJ0OworCisJaWYgKCFtYWNoaW5lX2lzX25ldHdpbmRlcigpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRzMTYyMF9vdXQoVEhFUk1fUkVTRVQsIDAsIDApOworCWRzMTYyMF9vdXQoVEhFUk1fV1JJVEVfQ09ORklHLCA4LCBDRkdfQ1BVKTsKKwlkczE2MjBfb3V0KFRIRVJNX1NUQVJUX0NPTlZFUlQsIDAsIDApOworCisJLyoKKwkgKiBUcmlnZ2VyIHRoZSBmYW4gdG8gc3RhcnQgYnkgc2V0dGluZworCSAqIHRlbXBlcmF0dXJlIGhpZ2ggcG9pbnQgbG93LiAgVGhpcyBraWNrcworCSAqIHRoZSBmYW4gaW50byBhY3Rpb24uCisJICovCisJZHMxNjIwX3JlYWRfc3RhdGUoJnRoKTsKKwl0aF9zdGFydC5sbyA9IDA7CisJdGhfc3RhcnQuaGkgPSAxOworCWRzMTYyMF93cml0ZV9zdGF0ZSgmdGhfc3RhcnQpOworCisJbXNsZWVwKDIwMDApOworCisJZHMxNjIwX3dyaXRlX3N0YXRlKCZ0aCk7CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZkczE2MjBfbWlzY2Rldik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKyNpZmRlZiBUSEVSTV9VU0VfUFJPQworCXByb2NfdGhlcm1fZHMxNjIwID0gY3JlYXRlX3Byb2NfZW50cnkoInRoZXJtIiwgMCwgTlVMTCk7CisJaWYgKHByb2NfdGhlcm1fZHMxNjIwKQorCQlwcm9jX3RoZXJtX2RzMTYyMC0+cmVhZF9wcm9jID0gcHJvY190aGVybV9kczE2MjBfcmVhZDsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAidGhlcm06IHVuYWJsZSB0byByZWdpc3RlciAvcHJvYy90aGVybVxuIik7CisjZW5kaWYKKworCWRzMTYyMF9yZWFkX3N0YXRlKCZ0aCk7CisJcmV0ID0gY3Z0XzlfdG9faW50KGRzMTYyMF9pbihUSEVSTV9SRUFEX1RFTVAsIDkpKTsKKworCXByaW50ayhLRVJOX0lORk8gIlRoZXJtb3N0YXQ6IGhpZ2ggJWkuJWksIGxvdyAlaS4laSwgIgorCSAgICAgICAiY3VycmVudCAlaS4laSBDLCBmYW4gJXMuXG4iLAorCSAgICAgICB0aC5oaSA+PiAxLCB0aC5oaSAmIDEgPyA1IDogMCwKKwkgICAgICAgdGgubG8gPj4gMSwgdGgubG8gJiAxID8gNSA6IDAsCisJICAgICAgIHJldCAgID4+IDEsIHJldCAgICYgMSA/IDUgOiAwLAorCSAgICAgICBmYW5fc3RhdGVbbmV0d2luZGVyX2dldF9mYW4oKV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkczE2MjBfZXhpdCh2b2lkKQoreworI2lmZGVmIFRIRVJNX1VTRV9QUk9DCisJcmVtb3ZlX3Byb2NfZW50cnkoInRoZXJtIiwgTlVMTCk7CisjZW5kaWYKKwltaXNjX2RlcmVnaXN0ZXIoJmRzMTYyMF9taXNjZGV2KTsKK30KKworbW9kdWxlX2luaXQoZHMxNjIwX2luaXQpOworbW9kdWxlX2V4aXQoZHMxNjIwX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHNwNTZrLmMgYi9kcml2ZXJzL2NoYXIvZHNwNTZrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdkNjY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kc3A1NmsuYwpAQCAtMCwwICsxLDU0NyBAQAorLyoKKyAqIFRoZSBEU1A1NjAwMSBEZXZpY2UgRHJpdmVyLCBzYXZpb3VyIG9mIHRoZSBGcmVlIFdvcmxkKHRtKQorICoKKyAqIEF1dGhvcnM6IEZyZWRyaWsgTm9yaW5nICAgPG5vcmluZ0Bub2NyZXcub3JnPgorICogICAgICAgICAgbGFycyBicmlua2hvZmYgICA8bGFyc0Bub2NyZXcub3JnPgorICogICAgICAgICAgVG9tYXMgQmVybmR0c3NvbiA8dG9tYXNAbm9jcmV3Lm9yZz4KKyAqCisgKiBGaXJzdCB2ZXJzaW9uIE1heSAxOTk2CisgKgorICogSGlzdG9yeToKKyAqICA5Ny0wMS0yOSAgIFRvbWFzIEJlcm5kdHNzb24sCisgKiAgICAgICAgICAgICAgIEludGVncmF0ZWQgd2l0aCBMaW51eCAyLjEuMjEga2VybmVsIHNvdXJjZXMuCisgKiAgOTctMDItMTUgICBUb21hcyBCZXJuZHRzc29uLAorICogICAgICAgICAgICAgICBGaXhlZCBmb3Iga2VybmVsIDIuMS4yNgorICoKKyAqIEJVR1M6CisgKiAgSG1tLi4uIHRoZXJlIG11c3QgYmUgc29tZXRoaW5nIGhlcmUgOikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5NyBGcmVkcmlrIE5vcmluZywgbGFycyBicmlua2hvZmYgJiBUb21hcyBCZXJuZHRzc29uCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CS8qIGZvciBrbWFsbG9jKCkgYW5kIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBmb3Igc3RydWN0IHdhaXRfcXVldWUgZXRjICovCisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogZ3Vlc3Mgd2hhdCAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogRm9yIHB1dF91c2VyIGFuZCBnZXRfdXNlciAqLworCisjaW5jbHVkZSA8YXNtL2RzcDU2ay5oPgorCisvKiBtaW5vciBkZXZpY2VzICovCisjZGVmaW5lIERTUDU2S19ERVZfNTYwMDEgICAgICAgIDAgICAgLyogVGhlIG9ubHkgZGV2aWNlIHNvIGZhciAqLworCisjZGVmaW5lIFRJTUVPVVQgICAgMTAgICAvKiBIb3N0IHBvcnQgdGltZW91dCBpbiBudW1iZXIgb2YgdHJpZXMgKi8KKyNkZWZpbmUgTUFYSU8gICAgMjA0OCAgIC8qIE1heGltdW0gbnVtYmVyIG9mIHdvcmRzIGJlZm9yZSBzbGVlcCAqLworI2RlZmluZSBEU1A1NktfTUFYX0JJTkFSWV9MRU5HVEggKDMqNjQqMTAyNCkKKworI2RlZmluZSBEU1A1NktfVFhfSU5UX09OCWRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgfD0gIERTUDU2S19JQ1JfVFJFUQorI2RlZmluZSBEU1A1NktfUlhfSU5UX09OCWRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgfD0gIERTUDU2S19JQ1JfUlJFUQorI2RlZmluZSBEU1A1NktfVFhfSU5UX09GRglkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaWNyICY9IH5EU1A1NktfSUNSX1RSRVEKKyNkZWZpbmUgRFNQNTZLX1JYX0lOVF9PRkYJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciAmPSB+RFNQNTZLX0lDUl9SUkVRCisKKyNkZWZpbmUgRFNQNTZLX1RSQU5TTUlUCQkoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmlzciAmIERTUDU2S19JU1JfVFhERSkKKyNkZWZpbmUgRFNQNTZLX1JFQ0VJVkUJCShkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaXNyICYgRFNQNTZLX0lTUl9SWERGKQorCisjZGVmaW5lIGhhbmRzaGFrZShjb3VudCwgbWF4aW8sIHRpbWVvdXQsIEVOQUJMRSwgZikgXAoreyBcCisJbG9uZyBpLCB0LCBtOyBcCisJd2hpbGUgKGNvdW50ID4gMCkgeyBcCisJCW0gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBjb3VudCwgbWF4aW8pOyBcCisJCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspIHsgXAorCQkJZm9yICh0ID0gMDsgdCA8IHRpbWVvdXQgJiYgIUVOQUJMRTsgdCsrKSBcCisJCQkJbXNsZWVwKDIwKTsgXAorCQkJaWYoIUVOQUJMRSkgXAorCQkJCXJldHVybiAtRUlPOyBcCisJCQlmOyBcCisJCX0gXAorCQljb3VudCAtPSBtOyBcCisJCWlmIChtID09IG1heGlvKSBtc2xlZXAoMjApOyBcCisJfSBcCit9CisKKyNkZWZpbmUgdHhfd2FpdChuKSBcCit7IFwKKwlpbnQgdDsgXAorCWZvcih0ID0gMDsgdCA8IG4gJiYgIURTUDU2S19UUkFOU01JVDsgdCsrKSBcCisJCW1zbGVlcCgxMCk7IFwKKwlpZighRFNQNTZLX1RSQU5TTUlUKSB7IFwKKwkJcmV0dXJuIC1FSU87IFwKKwl9IFwKK30KKworI2RlZmluZSByeF93YWl0KG4pIFwKK3sgXAorCWludCB0OyBcCisJZm9yKHQgPSAwOyB0IDwgbiAmJiAhRFNQNTZLX1JFQ0VJVkU7IHQrKykgXAorCQltc2xlZXAoMTApOyBcCisJaWYoIURTUDU2S19SRUNFSVZFKSB7IFwKKwkJcmV0dXJuIC1FSU87IFwKKwl9IFwKK30KKworLyogRFNQNTYwMDEgYm9vdHN0cmFwIGNvZGUgKi8KK3N0YXRpYyBjaGFyIGJvb3RzdHJhcFtdID0geworCTB4MGMsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHg2MCwgMHhmNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0ZiwgMHg2MSwgMHhmNCwKKwkweDAwLCAweDAwLCAweDdlLCAweGE5LCAweDA2LCAweDJlLCAweDgwLCAweDAwLCAweDAwLCAweDQ3LAorCTB4MDcsIDB4ZDgsIDB4ODQsIDB4MDcsIDB4NTksIDB4ODQsIDB4MDgsIDB4ZjQsIDB4YTgsIDB4MDAsCisJMHgwMCwgMHgwNCwgMHgwOCwgMHhmNCwgMHhiZiwgMHgwMCwgMHgwYywgMHgwMCwgMHgwMCwgMHhmZSwKKwkweGI4LCAweDBhLCAweGYwLCAweDgwLCAweDAwLCAweDdlLCAweGE5LCAweDA4LCAweGY0LCAweGEwLAorCTB4MDAsIDB4MDAsIDB4MDEsIDB4MDgsIDB4ZjQsIDB4YmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsCisJMHhhOSwgMHg4MCwgMHgwMCwgMHg3ZSwgMHhhZCwgMHgwOCwgMHg0ZSwgMHgyYiwgMHg0NCwgMHhmNCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDQ0LCAweGY0LCAweDQ1LCAweDAwLCAweDAwLCAweDAxLAorCTB4MGUsIDB4YTAsIDB4MDAsIDB4MGEsIDB4YTksIDB4ODAsIDB4MDAsIDB4N2UsIDB4YjUsIDB4MDgsCisJMHg1MCwgMHgyYiwgMHgwYSwgMHhhOSwgMHg4MCwgMHgwMCwgMHg3ZSwgMHhiOCwgMHgwOCwgMHg0NiwKKwkweDJiLCAweDQ0LCAweGY0LCAweDQ1LCAweDAwLCAweDAwLCAweDAyLCAweDBhLCAweGYwLCAweGFhLAorCTB4MDAsIDB4N2UsIDB4YzksIDB4MjAsIDB4MDAsIDB4NDUsIDB4MGEsIDB4ZjAsIDB4YWEsIDB4MDAsCisJMHg3ZSwgMHhkMCwgMHgwNiwgMHhjNiwgMHgwMCwgMHgwMCwgMHg3ZSwgMHhjNiwgMHgwYSwgMHhhOSwKKwkweDgwLCAweDAwLCAweDdlLCAweGM0LCAweDA4LCAweDU4LCAweDZiLCAweDBhLCAweGYwLCAweDgwLAorCTB4MDAsIDB4N2UsIDB4YWQsIDB4MDYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4N2UsIDB4Y2QsIDB4MGEsCisJMHhhOSwgMHg4MCwgMHgwMCwgMHg3ZSwgMHhjYiwgMHgwOCwgMHg1OCwgMHhhYiwgMHgwYSwgMHhmMCwKKwkweDgwLCAweDAwLCAweDdlLCAweGFkLCAweDA2LCAweGM2LCAweDAwLCAweDAwLCAweDdlLCAweGQ0LAorCTB4MGEsIDB4YTksIDB4ODAsIDB4MDAsIDB4N2UsIDB4ZDIsIDB4MDgsIDB4NTgsIDB4ZWIsIDB4MGEsCisJMHhmMCwgMHg4MCwgMHgwMCwgMHg3ZSwgMHhhZH07CitzdGF0aWMgaW50IHNpemVvZl9ib290c3RyYXAgPSAzNzU7CisKKworc3RhdGljIHN0cnVjdCBkc3A1NmtfZGV2aWNlIHsKKwlsb25nIGluX3VzZTsKKwlsb25nIG1heGlvLCB0aW1lb3V0OworCWludCB0eF93c2l6ZSwgcnhfd3NpemU7Cit9IGRzcDU2azsKKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKmRzcDU2a19jbGFzczsKKworc3RhdGljIGludCBkc3A1NmtfcmVzZXQodm9pZCkKK3sKKwl1X2NoYXIgc3RhdHVzOworCQorCS8qIFBvd2VyIGRvd24gdGhlIERTUCAqLworCXNvdW5kX3ltLnJkX2RhdGFfcmVnX3NlbCA9IDE0OworCXN0YXR1cyA9IHNvdW5kX3ltLnJkX2RhdGFfcmVnX3NlbCAmIDB4ZWY7CisJc291bmRfeW0ud2RfZGF0YSA9IHN0YXR1czsKKwlzb3VuZF95bS53ZF9kYXRhID0gc3RhdHVzIHwgMHgxMDsKKyAgCisJdWRlbGF5KDEwKTsKKyAgCisJLyogUG93ZXIgdXAgdGhlIERTUCAqLworCXNvdW5kX3ltLnJkX2RhdGFfcmVnX3NlbCA9IDE0OworCXNvdW5kX3ltLndkX2RhdGEgPSBzb3VuZF95bS5yZF9kYXRhX3JlZ19zZWwgJiAweGVmOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNwNTZrX3VwbG9hZCh1X2NoYXIgKmJpbiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwl1X2NoYXIgKnA7CisJCisJZHNwNTZrX3Jlc2V0KCk7CisgIAorCXAgPSBib290c3RyYXA7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZl9ib290c3RyYXAvMzsgaSsrKSB7CisJCS8qIHR4X3dhaXQoMTApOyAqLworCQlkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzFdID0gKnArKzsKKwkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlsyXSA9ICpwKys7CisJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbM10gPSAqcCsrOworCX0KKwlmb3IgKDsgaSA8IDUxMjsgaSsrKSB7CisJCS8qIHR4X3dhaXQoMTApOyAqLworCQlkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzFdID0gMDsKKwkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlsyXSA9IDA7CisJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbM10gPSAwOworCX0KKyAgCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXR4X3dhaXQoMTApOworCQlnZXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzFdLCBiaW4rKyk7CisJCWdldF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbMl0sIGJpbisrKTsKKwkJZ2V0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlszXSwgYmluKyspOworCX0KKworCXR4X3dhaXQoMTApOworCWRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmwgPSAzOyAgICAvKiBNYWdpYyBleGVjdXRlICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZHNwNTZrX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKSAmIDB4MGY7CisKKwlzd2l0Y2goZGV2KQorCXsKKwljYXNlIERTUDU2S19ERVZfNTYwMDE6CisJeworCisJCWxvbmcgbjsKKworCQkvKiBEb24ndCBkbyBhbnl0aGluZyBpZiBub3RoaW5nIGlzIHRvIGJlIGRvbmUgKi8KKwkJaWYgKCFjb3VudCkgcmV0dXJuIDA7CisKKwkJbiA9IDA7CisJCXN3aXRjaCAoZHNwNTZrLnJ4X3dzaXplKSB7CisJCWNhc2UgMTogIC8qIDggYml0ICovCisJCXsKKwkJCWhhbmRzaGFrZShjb3VudCwgZHNwNTZrLm1heGlvLCBkc3A1NmsudGltZW91dCwgRFNQNTZLX1JFQ0VJVkUsCisJCQkJICBwdXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzNdLCBidWYrbisrKSk7CisJCQlyZXR1cm4gbjsKKwkJfQorCQljYXNlIDI6ICAvKiAxNiBiaXQgKi8KKwkJeworCQkJc2hvcnQgKmRhdGE7CisKKwkJCWNvdW50IC89IDI7CisJCQlkYXRhID0gKHNob3J0KikgYnVmOworCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfUkVDRUlWRSwKKwkJCQkgIHB1dF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLndbMV0sIGRhdGErbisrKSk7CisJCQlyZXR1cm4gMipuOworCQl9CisJCWNhc2UgMzogIC8qIDI0IGJpdCAqLworCQl7CisJCQljb3VudCAvPSAzOworCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfUkVDRUlWRSwKKwkJCQkgIHB1dF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbMV0sIGJ1ZituKyspOworCQkJCSAgcHV0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlsyXSwgYnVmK24rKyk7CisJCQkJICBwdXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzNdLCBidWYrbisrKSk7CisJCQlyZXR1cm4gMypuOworCQl9CisJCWNhc2UgNDogIC8qIDMyIGJpdCAqLworCQl7CisJCQlsb25nICpkYXRhOworCisJCQljb3VudCAvPSA0OworCQkJZGF0YSA9IChsb25nKikgYnVmOworCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfUkVDRUlWRSwKKwkJCQkgIHB1dF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmwsIGRhdGErbisrKSk7CisJCQlyZXR1cm4gNCpuOworCQl9CisJCX0KKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJEU1A1NmsgZHJpdmVyOiBVbmtub3duIG1pbm9yIGRldmljZTogJWRcbiIsIGRldik7CisJCXJldHVybiAtRU5YSU87CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBkc3A1Nmtfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJICAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IGRldiA9IGltaW5vcihpbm9kZSkgJiAweDBmOworCisJc3dpdGNoKGRldikKKwl7CisJY2FzZSBEU1A1NktfREVWXzU2MDAxOgorCXsKKwkJbG9uZyBuOworCisJCS8qIERvbid0IGRvIGFueXRoaW5nIGlmIG5vdGhpbmcgaXMgdG8gYmUgZG9uZSAqLworCQlpZiAoIWNvdW50KSByZXR1cm4gMDsKKworCQluID0gMDsKKwkJc3dpdGNoIChkc3A1NmsudHhfd3NpemUpIHsKKwkJY2FzZSAxOiAgLyogOCBiaXQgKi8KKwkJeworCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfVFJBTlNNSVQsCisJCQkJICBnZXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzNdLCBidWYrbisrKSk7CisJCQlyZXR1cm4gbjsKKwkJfQorCQljYXNlIDI6ICAvKiAxNiBiaXQgKi8KKwkJeworCQkJY29uc3Qgc2hvcnQgKmRhdGE7CisKKwkJCWNvdW50IC89IDI7CisJCQlkYXRhID0gKGNvbnN0IHNob3J0ICopYnVmOworCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfVFJBTlNNSVQsCisJCQkJICBnZXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS53WzFdLCBkYXRhK24rKykpOworCQkJcmV0dXJuIDIqbjsKKwkJfQorCQljYXNlIDM6ICAvKiAyNCBiaXQgKi8KKwkJeworCQkJY291bnQgLz0gMzsKKwkJCWhhbmRzaGFrZShjb3VudCwgZHNwNTZrLm1heGlvLCBkc3A1NmsudGltZW91dCwgRFNQNTZLX1RSQU5TTUlULAorCQkJCSAgZ2V0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlsxXSwgYnVmK24rKyk7CisJCQkJICBnZXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzJdLCBidWYrbisrKTsKKwkJCQkgIGdldF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbM10sIGJ1ZituKyspKTsKKwkJCXJldHVybiAzKm47CisJCX0KKwkJY2FzZSA0OiAgLyogMzIgYml0ICovCisJCXsKKwkJCWNvbnN0IGxvbmcgKmRhdGE7CisKKwkJCWNvdW50IC89IDQ7CisJCQlkYXRhID0gKGNvbnN0IGxvbmcgKilidWY7CisJCQloYW5kc2hha2UoY291bnQsIGRzcDU2ay5tYXhpbywgZHNwNTZrLnRpbWVvdXQsIERTUDU2S19UUkFOU01JVCwKKwkJCQkgIGdldF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmwsIGRhdGErbisrKSk7CisJCQlyZXR1cm4gNCpuOworCQl9CisJCX0KKworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJEU1A1NmsgZHJpdmVyOiBVbmtub3duIG1pbm9yIGRldmljZTogJWRcbiIsIGRldik7CisJCXJldHVybiAtRU5YSU87CisJfQorfQorCitzdGF0aWMgaW50IGRzcDU2a19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBkZXYgPSBpbWlub3IoaW5vZGUpICYgMHgwZjsKKworCXN3aXRjaChkZXYpCisJeworCWNhc2UgRFNQNTZLX0RFVl81NjAwMToKKworCQlzd2l0Y2goY21kKSB7CisJCWNhc2UgRFNQNTZLX1VQTE9BRDoKKwkJeworCQkJY2hhciAqYmluOworCQkJaW50IHIsIGxlbjsKKwkJCXN0cnVjdCBkc3A1NmtfdXBsb2FkICpiaW5hcnkgPSAoc3RydWN0IGRzcDU2a191cGxvYWQgKikgYXJnOworICAgIAorCQkJaWYoZ2V0X3VzZXIobGVuLCAmYmluYXJ5LT5sZW4pIDwgMCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmKGdldF91c2VyKGJpbiwgJmJpbmFyeS0+YmluKSA8IDApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCQkJaWYgKGxlbiA9PSAwKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7ICAgICAgLyogbm90aGluZyB0byB1cGxvYWQ/IT8gKi8KKwkJCX0KKwkJCWlmIChsZW4gPiBEU1A1NktfTUFYX0JJTkFSWV9MRU5HVEgpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKyAgICAKKwkJCXIgPSBkc3A1NmtfdXBsb2FkKGJpbiwgbGVuKTsKKwkJCWlmIChyIDwgMCkgeworCQkJCXJldHVybiByOworCQkJfQorICAgIAorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBEU1A1NktfU0VUX1RYX1dTSVpFOgorCQkJaWYgKGFyZyA+IDQgfHwgYXJnIDwgMSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWRzcDU2ay50eF93c2l6ZSA9IChpbnQpIGFyZzsKKwkJCWJyZWFrOworCQljYXNlIERTUDU2S19TRVRfUlhfV1NJWkU6CisJCQlpZiAoYXJnID4gNCB8fCBhcmcgPCAxKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJZHNwNTZrLnJ4X3dzaXplID0gKGludCkgYXJnOworCQkJYnJlYWs7CisJCWNhc2UgRFNQNTZLX0hPU1RfRkxBR1M6CisJCXsKKwkJCWludCBkaXIsIG91dCwgc3RhdHVzOworCQkJc3RydWN0IGRzcDU2a19ob3N0X2ZsYWdzICpoZiA9IChzdHJ1Y3QgZHNwNTZrX2hvc3RfZmxhZ3MqKSBhcmc7CisgICAgCisJCQlpZihnZXRfdXNlcihkaXIsICZoZi0+ZGlyKSA8IDApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZihnZXRfdXNlcihvdXQsICZoZi0+b3V0KSA8IDApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmICgoZGlyICYgMHgxKSAmJiAob3V0ICYgMHgxKSkKKwkJCQlkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaWNyIHw9IERTUDU2S19JQ1JfSEYwOworCQkJZWxzZSBpZiAoZGlyICYgMHgxKQorCQkJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgJj0gfkRTUDU2S19JQ1JfSEYwOworCQkJaWYgKChkaXIgJiAweDIpICYmIChvdXQgJiAweDIpKQorCQkJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgfD0gRFNQNTZLX0lDUl9IRjE7CisJCQllbHNlIGlmIChkaXIgJiAweDIpCisJCQkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciAmPSB+RFNQNTZLX0lDUl9IRjE7CisKKwkJCXN0YXR1cyA9IDA7CisJCQlpZiAoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciAmIERTUDU2S19JQ1JfSEYwKSBzdGF0dXMgfD0gMHgxOworCQkJaWYgKGRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgJiBEU1A1NktfSUNSX0hGMSkgc3RhdHVzIHw9IDB4MjsKKwkJCWlmIChkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaXNyICYgRFNQNTZLX0lTUl9IRjIpIHN0YXR1cyB8PSAweDQ7CisJCQlpZiAoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmlzciAmIERTUDU2S19JU1JfSEYzKSBzdGF0dXMgfD0gMHg4OworCisJCQlyZXR1cm4gcHV0X3VzZXIoc3RhdHVzLCAmaGYtPnN0YXR1cyk7CisJCX0KKwkJY2FzZSBEU1A1NktfSE9TVF9DTUQ6CisJCQlpZiAoYXJnID4gMzEgfHwgYXJnIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5jdnIgPSAodV9jaGFyKSgoYXJnICYgRFNQNTZLX0NWUl9IVl9NQVNLKSB8CisJCQkJCQkJICAgICBEU1A1NktfQ1ZSX0hDKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIkRTUDU2ayBkcml2ZXI6IFVua25vd24gbWlub3IgZGV2aWNlOiAlZFxuIiwgZGV2KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9Cit9CisKKy8qIEFzIG9mIDIuMS4yNiB0aGlzIHNob3VsZCBiZSBkc3A1NmtfcG9sbCwKKyAqIGJ1dCBob3cgZG8gSSB0aGVuIGNoZWNrIGRldmljZSBtaW5vciBudW1iZXI/CisgKiBEbyBJIG5lZWQgdGhpcyBmdW5jdGlvbiBhdCBhbGw/Pz8KKyAqLworI2lmIDAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHNwNTZrX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJaW50IGRldiA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkgJiAweDBmOworCisJc3dpdGNoKGRldikKKwl7CisJY2FzZSBEU1A1NktfREVWXzU2MDAxOgorCQkvKiBwb2xsX3dhaXQoZmlsZSwgPz8/LCB3YWl0KTsgKi8KKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk0gfCBQT0xMT1VUOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJEU1A1NmsgZHJpdmVyOiBVbmtub3duIG1pbm9yIGRldmljZTogJWRcbiIsIGRldik7CisJCXJldHVybiAwOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGRzcDU2a19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBkZXYgPSBpbWlub3IoaW5vZGUpICYgMHgwZjsKKworCXN3aXRjaChkZXYpCisJeworCWNhc2UgRFNQNTZLX0RFVl81NjAwMToKKworCQlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZHNwNTZrLmluX3VzZSkpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWRzcDU2ay50aW1lb3V0ID0gVElNRU9VVDsKKwkJZHNwNTZrLm1heGlvID0gTUFYSU87CisJCWRzcDU2ay5yeF93c2l6ZSA9IGRzcDU2ay50eF93c2l6ZSA9IDQ7IAorCisJCURTUDU2S19UWF9JTlRfT0ZGOworCQlEU1A1NktfUlhfSU5UX09GRjsKKworCQkvKiBaZXJvIGhvc3QgZmxhZ3MgKi8KKwkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciAmPSB+RFNQNTZLX0lDUl9IRjA7CisJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgJj0gfkRTUDU2S19JQ1JfSEYxOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNwNTZrX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGRldiA9IGltaW5vcihpbm9kZSkgJiAweDBmOworCisJc3dpdGNoKGRldikKKwl7CisJY2FzZSBEU1A1NktfREVWXzU2MDAxOgorCQljbGVhcl9iaXQoMCwgJmRzcDU2ay5pbl91c2UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIkRTUDU2ayBkcml2ZXI6IFVua25vd24gbWlub3IgZGV2aWNlOiAlZFxuIiwgZGV2KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHNwNTZrX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IGRzcDU2a19yZWFkLAorCS53cml0ZQkJPSBkc3A1Nmtfd3JpdGUsCisJLmlvY3RsCQk9IGRzcDU2a19pb2N0bCwKKwkub3BlbgkJPSBkc3A1Nmtfb3BlbiwKKwkucmVsZWFzZQk9IGRzcDU2a19yZWxlYXNlLAorfTsKKworCisvKioqKioqIEluaXQgYW5kIG1vZHVsZSBmdW5jdGlvbnMgKioqKioqLworCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICJEU1A1NmsgZHJpdmVyIGluc3RhbGxlZFxuIjsKKworc3RhdGljIGludCBfX2luaXQgZHNwNTZrX2luaXRfZHJpdmVyKHZvaWQpCit7CisJaW50IGVyciA9IDA7CisKKwlpZighTUFDSF9JU19BVEFSSSB8fCAhQVRBUklIV19QUkVTRU5UKERTUDU2SykpIHsKKwkJcHJpbnRrKCJEU1A1NmsgZHJpdmVyOiBIYXJkd2FyZSBub3QgcHJlc2VudFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmKHJlZ2lzdGVyX2NocmRldihEU1A1NktfTUFKT1IsICJkc3A1NmsiLCAmZHNwNTZrX2ZvcHMpKSB7CisJCXByaW50aygiRFNQNTZrIGRyaXZlcjogVW5hYmxlIHRvIHJlZ2lzdGVyIGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkc3A1NmtfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAiZHNwNTZrIik7CisJaWYgKElTX0VSUihkc3A1NmtfY2xhc3MpKSB7CisJCWVyciA9IFBUUl9FUlIoZHNwNTZrX2NsYXNzKTsKKwkJZ290byBvdXRfY2hyZGV2OworCX0KKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZChkc3A1NmtfY2xhc3MsIE1LREVWKERTUDU2S19NQUpPUiwgMCksIE5VTEwsICJkc3A1NmsiKTsKKworCWVyciA9IGRldmZzX21rX2NkZXYoTUtERVYoRFNQNTZLX01BSk9SLCAwKSwKKwkJICAgICAgU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLCAiZHNwNTZrIik7CisJaWYoZXJyKQorCQlnb3RvIG91dF9jbGFzczsKKworCXByaW50ayhiYW5uZXIpOworCWdvdG8gb3V0OworCitvdXRfY2xhc3M6CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoRFNQNTZLX01BSk9SLCAwKSk7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koZHNwNTZrX2NsYXNzKTsKK291dF9jaHJkZXY6CisJdW5yZWdpc3Rlcl9jaHJkZXYoRFNQNTZLX01BSk9SLCAiZHNwNTZrIik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KK21vZHVsZV9pbml0KGRzcDU2a19pbml0X2RyaXZlcik7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkc3A1NmtfY2xlYW51cF9kcml2ZXIodm9pZCkKK3sKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihEU1A1NktfTUFKT1IsIDApKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShkc3A1NmtfY2xhc3MpOworCXVucmVnaXN0ZXJfY2hyZGV2KERTUDU2S19NQUpPUiwgImRzcDU2ayIpOworCWRldmZzX3JlbW92ZSgiZHNwNTZrIik7Cit9Cittb2R1bGVfZXhpdChkc3A1NmtfY2xlYW51cF9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHRsay5jIGIvZHJpdmVycy9jaGFyL2R0bGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDNlNGMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2R0bGsuYwpAQCAtMCwwICsxLDY1OSBAQAorLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIGxpbnV4LWMgLSotCisgKiBkdGxrLmMgLSBEb3VibGVUYWxrIFBDIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBPcmlnaW5hbCBhdXRob3I6IENocmlzIFBhbGxvdHRhIDxjaHJpc0BhbGxtZWRpYS5jb20+CisgKiBDdXJyZW50IG1haW50YWluZXI6IEppbSBWYW4gWmFuZHQgPGpydkB2YW56YW5kdC5tdi5jb20+CisgKiAKKyAqIDIwMDAtMDMtMTggSmltIFZhbiBaYW5kdDogRml4IHBvbGxpbmcuCisgKiAgRWxpbWluYXRlIGR0bGtfdGltZXJfYWN0aXZlIGZsYWcgYW5kIHNlcGFyYXRlIGR0bGtfc3RvcF90aW1lcgorICogIGZ1bmN0aW9uLiAgRG9uJ3QgcmVzdGFydCB0aW1lciBpbiBkdGxrX3RpbWVyX3RpY2suICBSZXN0YXJ0IHRpbWVyCisgKiAgaW4gZHRsa19wb2xsIGFmdGVyIGV2ZXJ5IHBvbGwuICBkdGxrX3BvbGwgcmV0dXJucyBtYXNrIChkdWgpLgorICogIEVsaW1pbmF0ZSB1bnVzZWQgZnVuY3Rpb24gZHRsa193cml0ZV9ieXRlLiAgTWlzYy4gY29kZSBjbGVhbnVwcy4KKyAqLworCisvKiBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIERvdWJsZVRhbGsgUEMsIGEgc3BlZWNoIHN5bnRoZXNpemVyCisgICBtYW51ZmFjdHVyZWQgYnkgUkMgU3lzdGVtcyAoaHR0cDovL3d3dy5yY3N5cy5jb20vKS4gIEl0IHdhcyB3cml0dGVuCisgICBiYXNlZCBvbiBkb2N1bWVudGF0aW9uIGluIHRoZWlyIFVzZXIncyBNYW51YWwgZmlsZSBhbmQgRGV2ZWxvcGVyJ3MKKyAgIFRvb2xzIGRpc2suCisKKyAgIFRoZSBEb3VibGVUYWxrIFBDIGNvbnRhaW5zIGZvdXIgdm9pY2Ugc3ludGhlc2l6ZXJzOiB0ZXh0LXRvLXNwZWVjaAorICAgKFRUUyksIGxpbmVhciBwcmVkaWN0aXZlIGNvZGluZyAoTFBDKSwgUENNL0FEUENNLCBhbmQgQ1ZTRC4gIEl0CisgICBhbHNvIGhhcyBhIHRvbmUgZ2VuZXJhdG9yLiAgT3V0cHV0IGRhdGEgZm9yIExQQyBhcmUgd3JpdHRlbiB0byB0aGUKKyAgIExQQyBwb3J0LCBhbmQgb3V0cHV0IGRhdGEgZm9yIHRoZSBvdGhlciBtb2RlcyBhcmUgd3JpdHRlbiB0byB0aGUKKyAgIFRUUyBwb3J0LgorCisgICBUd28ga2luZHMgb2YgZGF0YSBjYW4gYmUgcmVhZCBmcm9tIHRoZSBEb3VibGVUYWxrOiBzdGF0dXMKKyAgIGluZm9ybWF0aW9uIChpbiByZXNwb25zZSB0byB0aGUgIlwwMDE/IiBpbnRlcnJvZ2F0aW9uIGNvbW1hbmQpIGlzCisgICByZWFkIGZyb20gdGhlIFRUUyBwb3J0LCBhbmQgaW5kZXggbWFya2VycyAod2hpY2ggbWFyayB0aGUgcHJvZ3Jlc3MKKyAgIG9mIHRoZSBzcGVlY2gpIGFyZSByZWFkIGZyb20gdGhlIExQQyBwb3J0LiAgTm90IGFsbCBtb2RlbHMgb2YgdGhlCisgICBEb3VibGVUYWxrIFBDIGltcGxlbWVudCBpbmRleCBtYXJrZXJzLiAgQm90aCB0aGUgVFRTIGFuZCBMUEMgcG9ydHMKKyAgIGNhbiBhbHNvIGRpc3BsYXkgc3RhdHVzIGZsYWdzLgorCisgICBUaGUgRG91YmxlVGFsayBQQyBnZW5lcmF0ZXMgbm8gaW50ZXJydXB0cy4KKworICAgVGhlc2UgY2hhcmFjdGVyaXN0aWNzIGFyZSBtYXBwZWQgaW50byB0aGUgVW5peCBzdHJlYW0gSS9PIG1vZGVsIGFzCisgICBmb2xsb3dzOgorCisgICAid3JpdGUiIHNlbmRzIGJ5dGVzIHRvIHRoZSBUVFMgcG9ydC4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZgorICAgdGhlIHVzZXIgcHJvZ3JhbSB0byBzd2l0Y2ggbW9kZXMgYW1vbmcgVFRTLCBQQ00vQURQQ00sIGFuZCBDVlNELgorICAgVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gZm9yIHVzZSB3aXRoIHRoZSB0ZXh0LXRvLXNwZWVjaAorICAgc3ludGhlc2l6ZXIuICBJZiBMUEMgb3V0cHV0IGlzIG5lZWRlZCBzb21lIGRheSwgb3RoZXIgbWlub3IgZGV2aWNlCisgICBudW1iZXJzIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCBhbW9uZyBvdXRwdXQgbW9kZXMuCisKKyAgICJyZWFkIiBnZXRzIGluZGV4IG1hcmtlcnMgZnJvbSB0aGUgTFBDIHBvcnQuICBJZiB0aGUgZGV2aWNlIGRvZXMKKyAgIG5vdCBpbXBsZW1lbnQgaW5kZXggbWFya2VycywgdGhlIHJlYWQgd2lsbCBmYWlsIHdpdGggZXJyb3IgRUlOVkFMLgorCisgICBTdGF0dXMgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIHVzaW5nIHRoZSBEVExLX0lOVEVSUk9HQVRFIGlvY3RsLgorCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIEtFUk5FTAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgkJLyogZm9yIHZlcmlmeV9hcmVhICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogZm9yIC1FQlVTWSAqLworI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiBmb3IgcmVxdWVzdF9yZWdpb24gKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBmb3IgbG9vcHNfcGVyX2ppZmZ5ICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiBmb3IgaW5iX3AsIG91dGJfcCwgaW5iLCBvdXRiLCBldGMuICovCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogZm9yIGdldF91c2VyLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgkJLyogZm9yIHdhaXRfcXVldWUgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkvKiBmb3IgX19pbml0LCBtb2R1bGVfe2luaXQsZXhpdH0gKi8KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CQkvKiBmb3IgUE9MTElOLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvZHRsay5oPgkJLyogbG9jYWwgaGVhZGVyIGZpbGUgZm9yIERvdWJsZVRhbGsgdmFsdWVzICovCisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2lmZGVmIFRSQUNJTkcKKyNkZWZpbmUgVFJBQ0VfVEVYVChzdHIpIHByaW50ayhzdHIpOworI2RlZmluZSBUUkFDRV9SRVQgcHJpbnRrKCIpIikKKyNlbHNlCQkJCS8qICFUUkFDSU5HICovCisjZGVmaW5lIFRSQUNFX1RFWFQoc3RyKSAoKHZvaWQpIDApCisjZGVmaW5lIFRSQUNFX1JFVCAoKHZvaWQpIDApCisjZW5kaWYJCQkJLyogVFJBQ0lORyAqLworCisKK3N0YXRpYyBpbnQgZHRsa19tYWpvcjsKK3N0YXRpYyBpbnQgZHRsa19wb3J0X2xwYzsKK3N0YXRpYyBpbnQgZHRsa19wb3J0X3R0czsKK3N0YXRpYyBpbnQgZHRsa19idXN5Oworc3RhdGljIGludCBkdGxrX2hhc19pbmRleGluZzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHRsa19wb3J0bGlzdFtdID0KK3sweDI1ZSwgMHgyOWUsIDB4MmRlLCAweDMxZSwgMHgzNWUsIDB4MzllLCAwfTsKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBkdGxrX3Byb2Nlc3NfbGlzdDsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkdGxrX3RpbWVyOworCisvKiBwcm90b3R5cGVzIGZvciBmaWxlX29wZXJhdGlvbnMgc3RydWN0ICovCitzdGF0aWMgc3NpemVfdCBkdGxrX3JlYWQoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwKKwkJCSBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKiBwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IGR0bGtfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwKKwkJCSAgc2l6ZV90IG5ieXRlcywgbG9mZl90ICogcHBvcyk7CitzdGF0aWMgdW5zaWduZWQgaW50IGR0bGtfcG9sbChzdHJ1Y3QgZmlsZSAqLCBwb2xsX3RhYmxlICopOworc3RhdGljIGludCBkdGxrX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCBkdGxrX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCBkdGxrX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGR0bGtfZm9wcyA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IGR0bGtfcmVhZCwKKwkud3JpdGUJCT0gZHRsa193cml0ZSwKKwkucG9sbAkJPSBkdGxrX3BvbGwsCisJLmlvY3RsCQk9IGR0bGtfaW9jdGwsCisJLm9wZW4JCT0gZHRsa19vcGVuLAorCS5yZWxlYXNlCT0gZHRsa19yZWxlYXNlLAorfTsKKworLyogbG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGludCBkdGxrX2Rldl9wcm9iZSh2b2lkKTsKK3N0YXRpYyBzdHJ1Y3QgZHRsa19zZXR0aW5ncyAqZHRsa19pbnRlcnJvZ2F0ZSh2b2lkKTsKK3N0YXRpYyBpbnQgZHRsa19yZWFkYWJsZSh2b2lkKTsKK3N0YXRpYyBjaGFyIGR0bGtfcmVhZF9scGModm9pZCk7CitzdGF0aWMgY2hhciBkdGxrX3JlYWRfdHRzKHZvaWQpOworc3RhdGljIGludCBkdGxrX3dyaXRlYWJsZSh2b2lkKTsKK3N0YXRpYyBjaGFyIGR0bGtfd3JpdGVfYnl0ZXMoY29uc3QgY2hhciAqYnVmLCBpbnQgbik7CitzdGF0aWMgY2hhciBkdGxrX3dyaXRlX3R0cyhjaGFyKTsKKy8qCisgICBzdGF0aWMgdm9pZCBkdGxrX2hhbmRsZV9lcnJvcihjaGFyLCBjaGFyLCB1bnNpZ25lZCBpbnQpOworICovCitzdGF0aWMgdm9pZCBkdGxrX3RpbWVyX3RpY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKKworc3RhdGljIHNzaXplX3QgZHRsa19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWNoYXIgY2g7CisJaW50IGkgPSAwLCByZXRyaWVzOworCisJVFJBQ0VfVEVYVCgiKGR0bGtfcmVhZCIpOworCS8qICBwcmludGsoIkRvdWJsZVRhbGsgUEMgLSBkdGxrX3JlYWQoKVxuIik7ICovCisKKwlpZiAobWlub3IgIT0gRFRMS19NSU5PUiB8fCAhZHRsa19oYXNfaW5kZXhpbmcpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IGxvb3BzX3Blcl9qaWZmeTsgcmV0cmllcysrKSB7CisJCXdoaWxlIChpIDwgY291bnQgJiYgZHRsa19yZWFkYWJsZSgpKSB7CisJCQljaCA9IGR0bGtfcmVhZF9scGMoKTsKKwkJCS8qICAgICAgICBwcmludGsoImR0bGtfcmVhZCgpIHJlYWRzIDB4JTAyeFxuIiwgY2gpOyAqLworCQkJaWYgKHB1dF91c2VyKGNoLCBidWYrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpKys7CisJCX0KKwkJaWYgKGkpCisJCQlyZXR1cm4gaTsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJYnJlYWs7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7CisJfQorCWlmIChyZXRyaWVzID09IGxvb3BzX3Blcl9qaWZmeSkKKwkJcHJpbnRrKEtFUk5fRVJSICJkdGxrX3JlYWQgdGltZXMgb3V0XG4iKTsKKwlUUkFDRV9SRVQ7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGR0bGtfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlpbnQgaSA9IDAsIHJldHJpZXMgPSAwLCBjaDsKKworCVRSQUNFX1RFWFQoIihkdGxrX3dyaXRlIik7CisjaWZkZWYgVFJBQ0lORworCXByaW50aygiIFwiIik7CisJeworCQlpbnQgaSwgY2g7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpZiAoZ2V0X3VzZXIoY2gsIGJ1ZiArIGkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKCcgJyA8PSBjaCAmJiBjaCA8PSAnficpCisJCQkJcHJpbnRrKCIlYyIsIGNoKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIlxcJTAzbyIsIGNoKTsKKwkJfQorCQlwcmludGsoIlwiIik7CisJfQorI2VuZGlmCisKKwlpZiAoaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSAhPSBEVExLX01JTk9SKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdoaWxlICgxKSB7CisJCXdoaWxlIChpIDwgY291bnQgJiYgIWdldF91c2VyKGNoLCBidWYpICYmCisJCSAgICAgICAoY2ggPT0gRFRMS19DTEVBUiB8fCBkdGxrX3dyaXRlYWJsZSgpKSkgeworCQkJZHRsa193cml0ZV90dHMoY2gpOworCQkJYnVmKys7CisJCQlpKys7CisJCQlpZiAoaSAlIDUgPT0gMCkKKwkJCQkvKiBXZSB5aWVsZCBvdXIgdGltZSB1bnRpbCBzY2hlZHVsZWQKKwkJCQkgICBhZ2Fpbi4gIFRoaXMgcmVkdWNlcyB0aGUgdHJhbnNmZXIKKwkJCQkgICByYXRlIHRvIDUwMCBieXRlcy9zZWMsIGJ1dCB0aGF0J3MKKwkJCQkgICBzdGlsbCBlbm91Z2ggdG8ga2VlcCB1cCB3aXRoIHRoZQorCQkJCSAgIHNwZWVjaCBzeW50aGVzaXplci4gKi8KKwkJCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxKTsKKwkJCWVsc2UgeworCQkJCS8qIHRoZSBSRFkgYml0IGdvZXMgemVybyAyLTMgdXNlYworCQkJCSAgIGFmdGVyIHdyaXRpbmcsIGFuZCBnb2VzIDEgYWdhaW4KKwkJCQkgICAxODAtMTkwIHVzZWMgbGF0ZXIuICBIZXJlLCB3ZSB3YWl0CisJCQkJICAgdXAgdG8gMjUwIHVzZWMgZm9yIHRoZSBSRFkgYml0IHRvCisJCQkJICAgZ28gbm9uemVyby4gKi8KKwkJCQlmb3IgKHJldHJpZXMgPSAwOworCQkJCSAgICAgcmV0cmllcyA8IGxvb3BzX3Blcl9qaWZmeSAvICg0MDAwL0haKTsKKwkJCQkgICAgIHJldHJpZXMrKykKKwkJCQkJaWYgKGluYl9wKGR0bGtfcG9ydF90dHMpICYKKwkJCQkJICAgIFRUU19XUklUQUJMRSkKKwkJCQkJCWJyZWFrOworCQkJfQorCQkJcmV0cmllcyA9IDA7CisJCX0KKwkJaWYgKGkgPT0gY291bnQpCisJCQlyZXR1cm4gaTsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJYnJlYWs7CisKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMSk7CisKKwkJaWYgKCsrcmV0cmllcyA+IDEwICogSFopIHsgLyogd2FpdCBubyBtb3JlIHRoYW4gMTAgc2VjCisJCQkJCSAgICAgIGZyb20gbGFzdCB3cml0ZSAqLworCQkJcHJpbnRrKCJkdGxrOiB3cml0ZSB0aW1lb3V0LiAgIgorCQkJICAgICAgICJpbmJfcChkdGxrX3BvcnRfdHRzKSA9IDB4JTAyeFxuIiwKKwkJCSAgICAgICBpbmJfcChkdGxrX3BvcnRfdHRzKSk7CisJCQlUUkFDRV9SRVQ7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCVRSQUNFX1JFVDsKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkdGxrX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCWludCBtYXNrID0gMDsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CisKKwlUUkFDRV9URVhUKCIgZHRsa19wb2xsIik7CisJLyoKKwkgICBzdGF0aWMgbG9uZyBpbnQgajsKKwkgICBwcmludGsoIi4iKTsKKwkgICBwcmludGsoIjwlbGQ+IiwgamlmZmllcy1qKTsKKwkgICBqPWppZmZpZXM7CisJICovCisJcG9sbF93YWl0KGZpbGUsICZkdGxrX3Byb2Nlc3NfbGlzdCwgd2FpdCk7CisKKwlpZiAoZHRsa19oYXNfaW5kZXhpbmcgJiYgZHRsa19yZWFkYWJsZSgpKSB7CisJICAgICAgICBkZWxfdGltZXIoJmR0bGtfdGltZXIpOworCQltYXNrID0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJaWYgKGR0bGtfd3JpdGVhYmxlKCkpIHsKKwkgICAgICAgIGRlbF90aW1lcigmZHRsa190aW1lcik7CisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfQorCS8qIHRoZXJlIGFyZSBubyBleGNlcHRpb24gY29uZGl0aW9ucyAqLworCisJLyogVGhlcmUgd29uJ3QgYmUgYW55IGludGVycnVwdHMsIHNvIHdlIHNldCBhIHRpbWVyIGluc3RlYWQuICovCisJZXhwaXJlcyA9IGppZmZpZXMgKyAzKkhaIC8gMTAwOworCW1vZF90aW1lcigmZHRsa190aW1lciwgZXhwaXJlcyk7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIHZvaWQgZHRsa190aW1lcl90aWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlUUkFDRV9URVhUKCIgZHRsa190aW1lcl90aWNrIik7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkdGxrX3Byb2Nlc3NfbGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgZHRsa19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY2hhciBfX3VzZXIgKmFyZ3AgPSAoY2hhciBfX3VzZXIgKilhcmc7CisJc3RydWN0IGR0bGtfc2V0dGluZ3MgKnNwOworCWNoYXIgcG9ydHZhbDsKKwlUUkFDRV9URVhUKCIgZHRsa19pb2N0bCIpOworCisJc3dpdGNoIChjbWQpIHsKKworCWNhc2UgRFRMS19JTlRFUlJPR0FURToKKwkJc3AgPSBkdGxrX2ludGVycm9nYXRlKCk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgc3AsIHNpemVvZihzdHJ1Y3QgZHRsa19zZXR0aW5ncykpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOworCisJY2FzZSBEVExLX1NUQVRVUzoKKwkJcG9ydHZhbCA9IGluYl9wKGR0bGtfcG9ydF90dHMpOworCQlyZXR1cm4gcHV0X3VzZXIocG9ydHZhbCwgYXJncCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHRsa19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCVRSQUNFX1RFWFQoIihkdGxrX29wZW4iKTsKKworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCXN3aXRjaCAoaW1pbm9yKGlub2RlKSkgeworCWNhc2UgRFRMS19NSU5PUjoKKwkJaWYgKGR0bGtfYnVzeSkKKwkJCXJldHVybiAtRUJVU1k7CisJCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5YSU87CisJfQorfQorCitzdGF0aWMgaW50IGR0bGtfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlUUkFDRV9URVhUKCIoZHRsa19yZWxlYXNlIik7CisKKwlzd2l0Y2ggKGltaW5vcihpbm9kZSkpIHsKKwljYXNlIERUTEtfTUlOT1I6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCVRSQUNFX1JFVDsKKwkKKwlkZWxfdGltZXIoJmR0bGtfdGltZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGR0bGtfaW5pdCh2b2lkKQoreworCWR0bGtfcG9ydF9scGMgPSAwOworCWR0bGtfcG9ydF90dHMgPSAwOworCWR0bGtfYnVzeSA9IDA7CisJZHRsa19tYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCAiZHRsayIsICZkdGxrX2ZvcHMpOworCWlmIChkdGxrX21ham9yID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJEb3VibGVUYWxrIFBDIC0gY2Fubm90IHJlZ2lzdGVyIGRldmljZVxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoZHRsa19kZXZfcHJvYmUoKSA9PSAwKQorCQlwcmludGsoIiwgTUFKT1IgJWRcbiIsIGR0bGtfbWFqb3IpOworCisJZGV2ZnNfbWtfY2RldihNS0RFVihkdGxrX21ham9yLCBEVExLX01JTk9SKSwKKwkJICAgICAgIFNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiwgImR0bGsiKTsKKworCWluaXRfdGltZXIoJmR0bGtfdGltZXIpOworCWR0bGtfdGltZXIuZnVuY3Rpb24gPSBkdGxrX3RpbWVyX3RpY2s7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZHRsa19wcm9jZXNzX2xpc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkdGxrX2NsZWFudXAgKHZvaWQpCit7CisJZHRsa193cml0ZV9ieXRlcygiZ29vZGJ5ZSIsIDgpOworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDUwMCk7CQkvKiBuYXAgMC41MCBzZWMgYnV0CisJCQkJCQkgICBjb3VsZCBiZSBhd2FrZW5lZAorCQkJCQkJICAgZWFybGllciBieQorCQkJCQkJICAgc2lnbmFscy4uLiAqLworCisJZHRsa193cml0ZV90dHMoRFRMS19DTEVBUik7CisJdW5yZWdpc3Rlcl9jaHJkZXYoZHRsa19tYWpvciwgImR0bGsiKTsKKwlkZXZmc19yZW1vdmUoImR0bGsiKTsKKwlyZWxlYXNlX3JlZ2lvbihkdGxrX3BvcnRfbHBjLCBEVExLX0lPX0VYVEVOVCk7Cit9CisKK21vZHVsZV9pbml0KGR0bGtfaW5pdCk7Cittb2R1bGVfZXhpdChkdGxrX2NsZWFudXApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBkdGxrX3JlYWRhYmxlKHZvaWQpCit7CisjaWZkZWYgVFJBQ0lORworCXByaW50aygiIGR0bGtfcmVhZGFibGU9JXVAJXUiLCBpbmJfcChkdGxrX3BvcnRfbHBjKSAhPSAweDdmLCBqaWZmaWVzKTsKKyNlbmRpZgorCXJldHVybiBpbmJfcChkdGxrX3BvcnRfbHBjKSAhPSAweDdmOworfQorCitzdGF0aWMgaW50IGR0bGtfd3JpdGVhYmxlKHZvaWQpCit7CisJLyogVFJBQ0VfVEVYVCgiIGR0bGtfd3JpdGVhYmxlIik7ICovCisjaWZkZWYgVFJBQ0lOR01PUkUKKwlwcmludGsoIiBkdGxrX3dyaXRlYWJsZT0ldSIsIChpbmJfcChkdGxrX3BvcnRfdHRzKSAmIFRUU19XUklUQUJMRSkhPTApOworI2VuZGlmCisJcmV0dXJuIGluYl9wKGR0bGtfcG9ydF90dHMpICYgVFRTX1dSSVRBQkxFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkdGxrX2Rldl9wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGludCB0ZXN0dmFsID0gMDsKKwlpbnQgaSA9IDA7CisJc3RydWN0IGR0bGtfc2V0dGluZ3MgKnNwOworCisJaWYgKGR0bGtfcG9ydF9scGMgfCBkdGxrX3BvcnRfdHRzKQorCQlyZXR1cm4gLUVCVVNZOworCisJZm9yIChpID0gMDsgZHRsa19wb3J0bGlzdFtpXTsgaSsrKSB7CisjaWYgMAorCQlwcmludGsoIkRvdWJsZVRhbGsgUEMgLSBQb3J0ICUwM3ggPSAlMDR4XG4iLAorCQkgICAgICAgZHRsa19wb3J0bGlzdFtpXSwgKHRlc3R2YWwgPSBpbndfcChkdGxrX3BvcnRsaXN0W2ldKSkpOworI2VuZGlmCisKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkdGxrX3BvcnRsaXN0W2ldLCBEVExLX0lPX0VYVEVOVCwgCisJCQkgICAgICAgImR0bGsiKSkKKwkJCWNvbnRpbnVlOworCQl0ZXN0dmFsID0gaW53X3AoZHRsa19wb3J0bGlzdFtpXSk7CisJCWlmICgodGVzdHZhbCAmPSAweGZiZmYpID09IDB4MTA3ZikgeworCQkJZHRsa19wb3J0X2xwYyA9IGR0bGtfcG9ydGxpc3RbaV07CisJCQlkdGxrX3BvcnRfdHRzID0gZHRsa19wb3J0X2xwYyArIDE7CisKKwkJCXNwID0gZHRsa19pbnRlcnJvZ2F0ZSgpOworCQkJcHJpbnRrKCJEb3VibGVUYWxrIFBDIGF0ICUwM3gtJTAzeCwgIgorCQkJICAgICAgICJST00gdmVyc2lvbiAlcywgc2VyaWFsIG51bWJlciAldSIsCisJCQkgICAgICAgZHRsa19wb3J0bGlzdFtpXSwgZHRsa19wb3J0bGlzdFtpXSArCisJCQkgICAgICAgRFRMS19JT19FWFRFTlQgLSAxLAorCQkJICAgICAgIHNwLT5yb21fdmVyc2lvbiwgc3AtPnNlcmlhbF9udW1iZXIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXQgTFBDIHBvcnQgaW50byBrbm93biBzdGF0ZSwgc28KKwkJCSAgIGR0bGtfcmVhZGFibGUoKSBnaXZlcyB2YWxpZCByZXN1bHQgKi8KKwkJCW91dGJfcCgweGZmLCBkdGxrX3BvcnRfbHBjKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOSVQgc3RyaW5nIGFuZCBpbmRleCBtYXJrZXIgKi8KKwkJCWR0bGtfd3JpdGVfYnl0ZXMoIlwwMzZcMUBcMFwwMDEySVxyIiwgOCk7CisJCQkvKiBwb3N0aW5nIGFuIGluZGV4IHRha2VzIDE4IG1zZWMuICBIZXJlLCB3ZQorCQkJICAgd2FpdCB1cCB0byAxMDAgbXNlYyB0byBzZWUgd2hldGhlciBpdAorCQkJICAgYXBwZWFycy4gKi8KKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7CisJCQlkdGxrX2hhc19pbmRleGluZyA9IGR0bGtfcmVhZGFibGUoKTsKKyNpZmRlZiBUUkFDSU5HCisJCQlwcmludGsoIiwgaW5kZXhpbmcgJWRcbiIsIGR0bGtfaGFzX2luZGV4aW5nKTsKKyNlbmRpZgorI2lmZGVmIElOU0NPUEUKKwkJCXsKKy8qIFRoaXMgbWFjcm8gcmVjb3JkcyB0ZW4gc2FtcGxlcyByZWFkIGZyb20gdGhlIExQQyBwb3J0LCBmb3IgbGF0ZXIgZGlzcGxheSAqLworI2RlZmluZSBMT09LCQkJCQlcCitmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykJCQlcCisgIHsJCQkJCQlcCisgICAgYnVmZmVyW2IrK10gPSBpbmJfcChkdGxrX3BvcnRfbHBjKTsJCVwKKyAgICBfX2RlbGF5KGxvb3BzX3Blcl9qaWZmeS8oMTAwMDAwMC9IWikpOyAgICAgICAgICAgICBcCisgIH0KKwkJCQljaGFyIGJ1ZmZlclsxMDAwXTsKKwkJCQlpbnQgYiA9IDAsIGksIGo7CisKKwkJCQlMT09LCisJCQkJb3V0Yl9wKDB4ZmYsIGR0bGtfcG9ydF9scGMpOworCQkJCWJ1ZmZlcltiKytdID0gMDsKKwkJCQlMT09LCisJCQkJZHRsa193cml0ZV9ieXRlcygiXDAwMTJJXHIiLCA0KTsKKwkJCQlidWZmZXJbYisrXSA9IDA7CisJCQkJX19kZWxheSg1MCAqIGxvb3BzX3Blcl9qaWZmeSAvICgxMDAwL0haKSk7CisJCQkJb3V0Yl9wKDB4ZmYsIGR0bGtfcG9ydF9scGMpOworCQkJCWJ1ZmZlcltiKytdID0gMDsKKwkJCQlMT09LCisKKwkJCQlwcmludGsoIlxuIik7CisJCQkJZm9yIChqID0gMDsgaiA8IGI7IGorKykKKwkJCQkJcHJpbnRrKCIgJTAyeCIsIGJ1ZmZlcltqXSk7CisJCQkJcHJpbnRrKCJcbiIpOworCQkJfQorI2VuZGlmCQkJCS8qIElOU0NPUEUgKi8KKworI2lmZGVmIE9VVFNDT1BFCisJCQl7CisvKiBUaGlzIG1hY3JvIHJlY29yZHMgdGVuIHNhbXBsZXMgcmVhZCBmcm9tIHRoZSBUVFMgcG9ydCwgZm9yIGxhdGVyIGRpc3BsYXkgKi8KKyNkZWZpbmUgTE9PSwkJCQkJXAorZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCQkJXAorICB7CQkJCQkJXAorICAgIGJ1ZmZlcltiKytdID0gaW5iX3AoZHRsa19wb3J0X3R0cyk7CQlcCisgICAgX19kZWxheShsb29wc19wZXJfamlmZnkvKDEwMDAwMDAvSFopKTsgIC8qIDEgdXMgKi8gXAorICB9CisJCQkJY2hhciBidWZmZXJbMTAwMF07CisJCQkJaW50IGIgPSAwLCBpLCBqOworCisJCQkJbWRlbGF5KDEwKTsJLyogMTAgbXMgKi8KKwkJCQlMT09LCisJCQkJb3V0Yl9wKDB4MDMsIGR0bGtfcG9ydF90dHMpOworCQkJCWJ1ZmZlcltiKytdID0gMDsKKwkJCQlMT09LCisJCQkJTE9PSworCisJCQkJcHJpbnRrKCJcbiIpOworCQkJCWZvciAoaiA9IDA7IGogPCBiOyBqKyspCisJCQkJCXByaW50aygiICUwMngiLCBidWZmZXJbal0pOworCQkJCXByaW50aygiXG4iKTsKKwkJCX0KKyNlbmRpZgkJCQkvKiBPVVRTQ09QRSAqLworCisJCQlkdGxrX3dyaXRlX2J5dGVzKCJEb3VibGUgVGFsayBmb3VuZCIsIDE4KTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmVsZWFzZV9yZWdpb24oZHRsa19wb3J0bGlzdFtpXSwgRFRMS19JT19FWFRFTlQpOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIlxuRG91YmxlVGFsayBQQyAtIG5vdCBmb3VuZFxuIik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qCisgICBzdGF0aWMgdm9pZCBkdGxrX2hhbmRsZV9lcnJvcihjaGFyIG9wLCBjaGFyIHJjLCB1bnNpZ25lZCBpbnQgbWlub3IpCisgICB7CisgICBwcmludGsoS0VSTl9JTkZPIlxuRG91YmxlVGFsayBQQyAtIE1JTk9SOiAlZCwgT1BDT0RFOiAlZCwgRVJST1I6ICVkXG4iLCAKKyAgIG1pbm9yLCBvcCwgcmMpOworICAgcmV0dXJuOworICAgfQorICovCisKKy8qIGludGVycm9nYXRlIHRoZSBEb3VibGVUYWxrIFBDIGFuZCByZXR1cm4gaXRzIHNldHRpbmdzICovCitzdGF0aWMgc3RydWN0IGR0bGtfc2V0dGluZ3MgKmR0bGtfaW50ZXJyb2dhdGUodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyICp0OworCXN0YXRpYyBjaGFyIGJ1ZltzaXplb2Yoc3RydWN0IGR0bGtfc2V0dGluZ3MpICsgMV07CisJaW50IHRvdGFsLCBpOworCXN0YXRpYyBzdHJ1Y3QgZHRsa19zZXR0aW5ncyBzdGF0dXM7CisJVFJBQ0VfVEVYVCgiKGR0bGtfaW50ZXJyb2dhdGUiKTsKKwlkdGxrX3dyaXRlX2J5dGVzKCJcMDMwXDAwMT8iLCAzKTsKKwlmb3IgKHRvdGFsID0gMCwgaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisJCWJ1Zlt0b3RhbF0gPSBkdGxrX3JlYWRfdHRzKCk7CisJCWlmICh0b3RhbCA+IDIgJiYgYnVmW3RvdGFsXSA9PSAweDdmKQorCQkJYnJlYWs7CisJCWlmICh0b3RhbCA8IHNpemVvZihzdHJ1Y3QgZHRsa19zZXR0aW5ncykpCisJCQl0b3RhbCsrOworCX0KKwkvKgorCSAgIGlmIChpPT01MCkgcHJpbnRrKCJpbnRlcnJvZ2F0ZSgpIHJlYWQgb3ZlcnJ1blxuIik7CisJICAgZm9yIChpPTA7IGk8c2l6ZW9mKGJ1Zik7IGkrKykKKwkgICBwcmludGsoIiAlMDJ4IiwgYnVmW2ldKTsKKwkgICBwcmludGsoIlxuIik7CisJICovCisJdCA9IGJ1ZjsKKwlzdGF0dXMuc2VyaWFsX251bWJlciA9IHRbMF0gKyB0WzFdICogMjU2OyAvKiBzZXJpYWwgbnVtYmVyIGlzCisJCQkJCQkgICAgIGxpdHRsZSBlbmRpYW4gKi8KKwl0ICs9IDI7CisKKwlpID0gMDsKKwl3aGlsZSAoKnQgIT0gJ1xyJykgeworCQlzdGF0dXMucm9tX3ZlcnNpb25baV0gPSAqdDsKKwkJaWYgKGkgPCBzaXplb2Yoc3RhdHVzLnJvbV92ZXJzaW9uKSAtIDEpCisJCQlpKys7CisJCXQrKzsKKwl9CisJc3RhdHVzLnJvbV92ZXJzaW9uW2ldID0gMDsKKwl0Kys7CisKKwlzdGF0dXMubW9kZSA9ICp0Kys7CisJc3RhdHVzLnB1bmNfbGV2ZWwgPSAqdCsrOworCXN0YXR1cy5mb3JtYW50X2ZyZXEgPSAqdCsrOworCXN0YXR1cy5waXRjaCA9ICp0Kys7CisJc3RhdHVzLnNwZWVkID0gKnQrKzsKKwlzdGF0dXMudm9sdW1lID0gKnQrKzsKKwlzdGF0dXMudG9uZSA9ICp0Kys7CisJc3RhdHVzLmV4cHJlc3Npb24gPSAqdCsrOworCXN0YXR1cy5leHRfZGljdF9sb2FkZWQgPSAqdCsrOworCXN0YXR1cy5leHRfZGljdF9zdGF0dXMgPSAqdCsrOworCXN0YXR1cy5mcmVlX3JhbSA9ICp0Kys7CisJc3RhdHVzLmFydGljdWxhdGlvbiA9ICp0Kys7CisJc3RhdHVzLnJldmVyYiA9ICp0Kys7CisJc3RhdHVzLmVvYiA9ICp0Kys7CisJc3RhdHVzLmhhc19pbmRleGluZyA9IGR0bGtfaGFzX2luZGV4aW5nOworCVRSQUNFX1JFVDsKKwlyZXR1cm4gJnN0YXR1czsKK30KKworc3RhdGljIGNoYXIgZHRsa19yZWFkX3R0cyh2b2lkKQoreworCWludCBwb3J0dmFsLCByZXRyaWVzID0gMDsKKwljaGFyIGNoOworCVRSQUNFX1RFWFQoIihkdGxrX3JlYWRfdHRzIik7CisKKwkvKiB2ZXJpZnkgRFQgaXMgcmVhZHksIHJlYWQgY2hhciwgd2FpdCBmb3IgQUNLICovCisJZG8geworCQlwb3J0dmFsID0gaW5iX3AoZHRsa19wb3J0X3R0cyk7CisJfSB3aGlsZSAoKHBvcnR2YWwgJiBUVFNfUkVBREFCTEUpID09IDAgJiYKKwkJIHJldHJpZXMrKyA8IERUTEtfTUFYX1JFVFJJRVMpOworCWlmIChyZXRyaWVzID09IERUTEtfTUFYX1JFVFJJRVMpCisJCXByaW50ayhLRVJOX0VSUiAiZHRsa19yZWFkX3R0cygpIHRpbWVvdXRcbiIpOworCisJY2ggPSBpbmJfcChkdGxrX3BvcnRfdHRzKTsJLyogaW5wdXQgZnJvbSBUVFMgcG9ydCAqLworCWNoICY9IDB4N2Y7CisJb3V0Yl9wKGNoLCBkdGxrX3BvcnRfdHRzKTsKKworCXJldHJpZXMgPSAwOworCWRvIHsKKwkJcG9ydHZhbCA9IGluYl9wKGR0bGtfcG9ydF90dHMpOworCX0gd2hpbGUgKChwb3J0dmFsICYgVFRTX1JFQURBQkxFKSAhPSAwICYmCisJCSByZXRyaWVzKysgPCBEVExLX01BWF9SRVRSSUVTKTsKKwlpZiAocmV0cmllcyA9PSBEVExLX01BWF9SRVRSSUVTKQorCQlwcmludGsoS0VSTl9FUlIgImR0bGtfcmVhZF90dHMoKSB0aW1lb3V0XG4iKTsKKworCVRSQUNFX1JFVDsKKwlyZXR1cm4gY2g7Cit9CisKK3N0YXRpYyBjaGFyIGR0bGtfcmVhZF9scGModm9pZCkKK3sKKwlpbnQgcmV0cmllcyA9IDA7CisJY2hhciBjaDsKKwlUUkFDRV9URVhUKCIoZHRsa19yZWFkX2xwYyIpOworCisJLyogbm8gbmVlZCB0byB0ZXN0IC0tIHRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiB0aGUgcG9ydCBpcyByZWFkYWJsZSAqLworCisJY2ggPSBpbmJfcChkdGxrX3BvcnRfbHBjKTsJLyogaW5wdXQgZnJvbSBMUEMgcG9ydCAqLworCisJb3V0Yl9wKDB4ZmYsIGR0bGtfcG9ydF9scGMpOworCisJLyogYWNrbm93bGVkZ2luZyBhIHJlYWQgdGFrZXMgMy00CisJICAgdXNlYy4gIEhlcmUsIHdlIHdhaXQgdXAgdG8gMjAgdXNlYworCSAgIGZvciB0aGUgYWNrbm93bGVkZ2VtZW50ICovCisJcmV0cmllcyA9IChsb29wc19wZXJfamlmZnkgKiAyMCkgLyAoMTAwMDAwMC9IWik7CisJd2hpbGUgKGluYl9wKGR0bGtfcG9ydF9scGMpICE9IDB4N2YgJiYgLS1yZXRyaWVzID4gMCk7CisJaWYgKHJldHJpZXMgPT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkdGxrX3JlYWRfbHBjKCkgdGltZW91dFxuIik7CisKKwlUUkFDRV9SRVQ7CisJcmV0dXJuIGNoOworfQorCisvKiB3cml0ZSBuIGJ5dGVzIHRvIHR0cyBwb3J0ICovCitzdGF0aWMgY2hhciBkdGxrX3dyaXRlX2J5dGVzKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG4pCit7CisJY2hhciB2YWwgPSAwOworCS8qICBwcmludGsoImR0bGtfd3JpdGVfYnl0ZXMoXCIlLSpzXCIsICVkKVxuIiwgbiwgYnVmLCBuKTsgKi8KKwlUUkFDRV9URVhUKCIoZHRsa193cml0ZV9ieXRlcyIpOworCXdoaWxlIChuLS0gPiAwKQorCQl2YWwgPSBkdGxrX3dyaXRlX3R0cygqYnVmKyspOworCVRSQUNFX1JFVDsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgY2hhciBkdGxrX3dyaXRlX3R0cyhjaGFyIGNoKQoreworCWludCByZXRyaWVzID0gMDsKKyNpZmRlZiBUUkFDSU5HTU9SRQorCXByaW50aygiICBkdGxrX3dyaXRlX3R0cygiKTsKKwlpZiAoJyAnIDw9IGNoICYmIGNoIDw9ICd+JykKKwkJcHJpbnRrKCInJWMnIiwgY2gpOworCWVsc2UKKwkJcHJpbnRrKCIweCUwMngiLCBjaCk7CisjZW5kaWYKKwlpZiAoY2ggIT0gRFRMS19DTEVBUikJLyogbm8gZmxvdyBjb250cm9sIGZvciBDTEVBUiBjb21tYW5kICovCisJCXdoaWxlICgoaW5iX3AoZHRsa19wb3J0X3R0cykgJiBUVFNfV1JJVEFCTEUpID09IDAgJiYKKwkJICAgICAgIHJldHJpZXMrKyA8IERUTEtfTUFYX1JFVFJJRVMpCS8qIERUIHJlYWR5PyAqLworCQkJOworCWlmIChyZXRyaWVzID09IERUTEtfTUFYX1JFVFJJRVMpCisJCXByaW50ayhLRVJOX0VSUiAiZHRsa193cml0ZV90dHMoKSB0aW1lb3V0XG4iKTsKKworCW91dGJfcChjaCwgZHRsa19wb3J0X3R0cyk7CS8qIG91dHB1dCB0byBUVFMgcG9ydCAqLworCS8qIHRoZSBSRFkgYml0IGdvZXMgemVybyAyLTMgdXNlYyBhZnRlciB3cml0aW5nLCBhbmQgZ29lcworCSAgIDEgYWdhaW4gMTgwLTE5MCB1c2VjIGxhdGVyLiAgSGVyZSwgd2Ugd2FpdCB1cCB0byAxMAorCSAgIHVzZWMgZm9yIHRoZSBSRFkgYml0IHRvIGdvIHplcm8uICovCisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IGxvb3BzX3Blcl9qaWZmeSAvICgxMDAwMDAvSFopOyByZXRyaWVzKyspCisJCWlmICgoaW5iX3AoZHRsa19wb3J0X3R0cykgJiBUVFNfV1JJVEFCTEUpID09IDApCisJCQlicmVhazsKKworI2lmZGVmIFRSQUNJTkdNT1JFCisJcHJpbnRrKCIpXG4iKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZWMzMTA0X2tleWIuYyBiL2RyaXZlcnMvY2hhci9lYzMxMDRfa2V5Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZWQ2NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZWMzMTA0X2tleWIuYwpAQCAtMCwwICsxLDQ1OSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvY2hhci9lYzMxMDRfa2V5Yi5jCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMCBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAdHV4Lm9yZz4KKyAqCisgKiBiYXNlZCBvbiBsaW51eC9kcml2ZXJzL2NoYXIvcGNfa2V5Yi5jLCB3aGljaCBoYWQgdGhlIGZvbGxvd2luZyBjb21tZW50czoKKyAqCisgKiBTZXBhcmF0aW9uIG9mIHRoZSBQQyBsb3ctbGV2ZWwgcGFydCBieSBHZWVydCBVeXR0ZXJob2V2ZW4sIE1heSAxOTk3CisgKiBTZWUga2V5Ym9hcmQuYyBmb3IgdGhlIHdob2xlIGhpc3RvcnkuCisgKgorICogTWFqb3IgY2xlYW51cCBieSBNYXJ0aW4gTWFyZXMsIE1heSAxOTk3CisgKgorICogQ29tYmluZWQgdGhlIGtleWJvYXJkIGFuZCBQUy8yIG1vdXNlIGhhbmRsaW5nIGludG8gb25lIGZpbGUsCisgKiBiZWNhdXNlIHRoZXkgc2hhcmUgdGhlIHNhbWUgaGFyZHdhcmUuCisgKiBKb2hhbiBNeXJlZW4gPGplbUBpa2kuZmk+IDE5OTgtMTAtMDguCisgKgorICogQ29kZSBmaXhlcyB0byBoYW5kbGUgbW91c2UgQUNLcyBwcm9wZXJseS4KKyAqIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PiAxOTk5LTAxLTI5LgorICovCisvKiBFQzMxMDQgbm90ZToKKyAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiB3aXRob3V0IGFueSBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBFQzMxMDQgY2hpcC4gIFdoaWxlCisgKiBJIGhvcGUgSSBnb3QgbW9zdCBvZiB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSByaWdodCwgdGhlIHJlZ2lzdGVyIG5hbWVzIEkgdXNlCisgKiBhcmUgbW9zdCBsaWtlbHkgY29tcGxldGVseSBkaWZmZXJlbnQgZnJvbSB0aG9zZSBpbiB0aGUgY2hpcCBkb2N1bWVudGF0aW9uLgorICoKKyAqIElmIHlvdSBoYXZlIGFueSBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBFQzMxMDQsIHBsZWFzZSB0ZWxsIG1lCisgKiAocHJ1bXBmQHR1eC5vcmcpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rYmRfbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2tiZF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9rZXlib2FyZC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vZWMzMTA0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogU29tZSBjb25maWd1cmF0aW9uIHN3aXRjaGVzIGFyZSBwcmVzZW50IGluIHRoZSBpbmNsdWRlIGZpbGUuLi4gKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjX2tleWIuaD4KKworI2RlZmluZSBNU1JfQ1RTIDB4MTAKKyNkZWZpbmUgTUNSX1JUUyAweDAyCisjZGVmaW5lIExTUl9EUiAweDAxCisjZGVmaW5lIExTUl9CT1RIX0VNUFRZIDB4NjAKKworc3RhdGljIHN0cnVjdCBlNV9zdHJ1Y3QgeworCXU4IHBhY2tldFs4XTsKKwlpbnQgcG9zOworCWludCBsZW5ndGg7CisKKwl1OCBjYWNoZWRfbWNyOworCXU4IGxhc3RfbXNyOworfSBlYzMxMDRfa2V5YjsKKwkKKy8qIFNpbXBsZSB0cmFuc2xhdGlvbiB0YWJsZSBmb3IgdGhlIFN5c1JxIGtleXMgKi8KKworCisjaWZkZWYgQ09ORklHX01BR0lDX1NZU1JRCit1bnNpZ25lZCBjaGFyIGVjMzEwNF9rYmRfc3lzcnFfeGxhdGVbMTI4XSA9CisJIlwwMDBcMDMzMTIzNDU2Nzg5MC09XDE3N1x0IgkJCS8qIDB4MDAgLSAweDBmICovCisJInF3ZXJ0eXVpb3BbXVxyXDAwMGFzIgkJCQkvKiAweDEwIC0gMHgxZiAqLworCSJkZmdoamtsOydgXDAwMFxcenhjdiIJCQkJLyogMHgyMCAtIDB4MmYgKi8KKwkiYm5tLC4vXDAwMCpcMDAwIFwwMDBcMjAxXDIwMlwyMDNcMjA0XDIwNSIJLyogMHgzMCAtIDB4M2YgKi8KKwkiXDIwNlwyMDdcMjEwXDIxMVwyMTJcMDAwXDAwMDc4OS00NTYrMSIJCS8qIDB4NDAgLSAweDRmICovCisJIjIzMFwxNzdcMDAwXDAwMFwyMTNcMjE0XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIgLyogMHg1MCAtIDB4NWYgKi8KKwkiXHJcMDAwLyI7CQkJCQkvKiAweDYwIC0gMHg2ZiAqLworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGtiZF93cml0ZV9jb21tYW5kX3coaW50IGRhdGEpOworc3RhdGljIHZvaWQga2JkX3dyaXRlX291dHB1dF93KGludCBkYXRhKTsKKyNpZmRlZiBDT05GSUdfUFNNT1VTRQorc3RhdGljIHZvaWQgYXV4X3dyaXRlX2FjayhpbnQgdmFsKTsKK3N0YXRpYyB2b2lkIF9fYXV4X3dyaXRlX2FjayhpbnQgdmFsKTsKKyNlbmRpZgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGtiZF9jb250cm9sbGVyX2xvY2spOworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGFuZGxlX2tiZF9ldmVudCh2b2lkKTsKKworLyogdXNlZCBvbmx5IGJ5IHNlbmRfZGF0YSAtIHNldCBieSBrZXlib2FyZF9pbnRlcnJ1cHQgKi8KK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHJlcGx5X2V4cGVjdGVkOworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgYWNrbm93bGVkZ2U7CitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciByZXNlbmQ7CisKKworaW50IGVjMzEwNF9rYmRfc2V0a2V5Y29kZSh1bnNpZ25lZCBpbnQgc2NhbmNvZGUsIHVuc2lnbmVkIGludCBrZXljb2RlKQoreworCXJldHVybiAwOworfQorCitpbnQgZWMzMTA0X2tiZF9nZXRrZXljb2RlKHVuc2lnbmVkIGludCBzY2FuY29kZSkKK3sKKwlyZXR1cm4gMDsKK30KKworCisvKiB5ZXMsIGl0IHByb2JhYmx5IHdvdWxkIGJlIGZhc3RlciB0byB1c2UgYW4gYXJyYXkuICBJIGRvbid0IGNhcmUuICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBlYzMxMDRfc2NhbjJrZXkodW5zaWduZWQgY2hhciBzY2FuY29kZSkKK3sKKwlzd2l0Y2ggKHNjYW5jb2RlKSB7CisJY2FzZSAgMTogLyogJ2AnICovCisJCXJldHVybiA0MTsKKwkJCisJY2FzZSAgMiAuLi4gMjc6CisJCXJldHVybiBzY2FuY29kZTsKKwkJCisJY2FzZSAyODogLyogJ1xcJyAqLworCQlyZXR1cm4gNDM7CisKKwljYXNlIDI5IC4uLiAzOToKKwkJcmV0dXJuIHNjYW5jb2RlICsgMTsKKworCWNhc2UgNDA6IC8qICdccicgKi8KKwkJcmV0dXJuIDI4OworCisJY2FzZSA0MSAuLi4gNTA6CisJCXJldHVybiBzY2FuY29kZSArIDM7CisKKwljYXNlIDUxOiAvKiAnICcgKi8KKwkJcmV0dXJuIDU3OworCQkKKwljYXNlIDUyOiAvKiBlc2NhcGUgKi8KKwkJcmV0dXJuIDE7CisKKwljYXNlIDU0OiAvKiBpbnNlcnQvZGVsZXRlIChsYWJlbGxlZCBkZWxldGUpICovCisJCS8qIHRoaXMgc2hvdWxkIGFyZ3VhYmx5IGJlIDExMCwgYnV0IEknZCBsaWtlIHRvIGhhdmUgY3RybC1hbHQtZGVsCisJCSAqIHdvcmtpbmcgd2l0aCBhIHN0YW5kYXJkIGtleW1hcCAqLworCQlyZXR1cm4gMTExOworCisJY2FzZSA1NTogLyogbGVmdCAqLworCQlyZXR1cm4gMTA1OworCWNhc2UgNTY6IC8qIGhvbWUgKi8KKwkJcmV0dXJuIDEwMjsKKwljYXNlIDU3OiAvKiBlbmQgKi8KKwkJcmV0dXJuIDEwNzsKKwljYXNlIDU4OiAvKiB1cCAqLworCQlyZXR1cm4gMTAzOworCWNhc2UgNTk6IC8qIGRvd24gKi8KKwkJcmV0dXJuIDEwODsKKwljYXNlIDYwOiAvKiBwZ3VwICovCisJCXJldHVybiAxMDQ7CisJY2FzZSA2MTogLyogcGdkb3duICovCisJCXJldHVybiAxMDk7CisJY2FzZSA2MjogLyogcmlnaHQgKi8KKwkJcmV0dXJuIDEwNjsKKworCWNhc2UgNzkgLi4uIDg4OiAvKiBmMSAtIGYxMCAqLworCQlyZXR1cm4gc2NhbmNvZGUgLSAyMDsKKworCWNhc2UgODkgLi4uIDkwOiAvKiBmMTEgLSBmMTIgKi8KKwkJcmV0dXJuIHNjYW5jb2RlIC0gMjsKKworCWNhc2UgOTE6IC8qIGxlZnQgc2hpZnQgKi8KKwkJcmV0dXJuIDQyOworCisJY2FzZSA5MjogLyogcmlnaHQgc2hpZnQgKi8KKwkJcmV0dXJuIDU0OworCisJY2FzZSA5MzogLyogbGVmdCBhbHQgKi8KKwkJcmV0dXJuIDU2OworCWNhc2UgOTQ6IC8qIHJpZ2h0IGFsdCAqLworCQlyZXR1cm4gMTAwOworCWNhc2UgOTU6IC8qIGxlZnQgY3RybCAqLworCQlyZXR1cm4gMjk7CisJY2FzZSA5NjogLyogcmlnaHQgY3RybCAqLworCQlyZXR1cm4gOTc7CisKKwljYXNlIDk3OiAvKiBjYXBzIGxvY2sgKi8KKwkJcmV0dXJuIDU4OworCWNhc2UgMTAyOiAvKiBsZWZ0IHdpbmRvd3MgKi8KKwkJcmV0dXJuIDEyNTsKKwljYXNlIDEwMzogLyogcmlnaHQgd2luZG93cyAqLworCQlyZXR1cm4gMTI2OworCisJY2FzZSAxMDY6IC8qIEZuICovCisJCS8qIHRoaXMgaXMgd3JvbmcuICovCisJCXJldHVybiA4NDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKwkJCitpbnQgZWMzMTA0X2tiZF90cmFuc2xhdGUodW5zaWduZWQgY2hhciBzY2FuY29kZSwgdW5zaWduZWQgY2hhciAqa2V5Y29kZSwKKwkJICAgIGNoYXIgcmF3X21vZGUpCit7CisJc2NhbmNvZGUgJj0gMHg3ZjsKKworCSprZXljb2RlID0gZWMzMTA0X3NjYW4ya2V5KHNjYW5jb2RlKTsKKworIAlyZXR1cm4gMTsKK30KKworY2hhciBlYzMxMDRfa2JkX3VuZXhwZWN0ZWRfdXAodW5zaWduZWQgY2hhciBrZXljb2RlKQoreworCXJldHVybiAwMjAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX2tleWJvYXJkX2V2ZW50KHVuc2lnbmVkIGNoYXIgc2NhbmNvZGUpCit7CisjaWZkZWYgQ09ORklHX1ZUCisJaGFuZGxlX3NjYW5jb2RlKHNjYW5jb2RlLCAhKHNjYW5jb2RlICYgMHg4MCkpOworI2VuZGlmCQkJCQorCXRhc2tsZXRfc2NoZWR1bGUoJmtleWJvYXJkX3Rhc2tsZXQpOworfQkKKwordm9pZCBlYzMxMDRfa2JkX2xlZHModW5zaWduZWQgY2hhciBsZWRzKQoreworfQorCitzdGF0aWMgdTggZTVfY2hlY2tzdW0odTggKnBhY2tldCwgaW50IGNvdW50KQoreworCWludCBpOworCXU4IHN1bSA9IDA7CisKKwlmb3IgKGk9MDsgaTxjb3VudDsgaSsrKQorCQlzdW0gXj0gcGFja2V0W2ldOworCQkKKwlpZiAoc3VtICYgMHg4MCkKKwkJc3VtIF49IDB4YzA7CisKKwlyZXR1cm4gc3VtOworfQorCitzdGF0aWMgdm9pZCBlNV93YWl0X2Zvcl9jdHMoc3RydWN0IGU1X3N0cnVjdCAqaykKK3sKKwl1OCBtc3I7CisJCQorCWRvIHsKKwkJbXNyID0gY3RybF9pbmIoRUMzMTA0X1NFUjRfTVNSKTsKKwl9IHdoaWxlICghKG1zciAmIE1TUl9DVFMpKTsKK30KKworCitzdGF0aWMgdm9pZCBlNV9zZW5kX2J5dGUodTggYnl0ZSwgc3RydWN0IGU1X3N0cnVjdCAqaykKK3sKKwl1OCBzdGF0dXM7CisJCQorCWRvIHsKKwkJc3RhdHVzID0gY3RybF9pbmIoRUMzMTA0X1NFUjRfTFNSKTsKKwl9IHdoaWxlICgoc3RhdHVzICYgTFNSX0JPVEhfRU1QVFkpICE9IExTUl9CT1RIX0VNUFRZKTsKKwkKKwlwcmludGsoIjwlMDJ4PiIsIGJ5dGUpOworCisJY3RybF9vdXRiKGJ5dGUsIEVDMzEwNF9TRVI0X0RBVEEpOworCisJZG8geworCQlzdGF0dXMgPSBjdHJsX2luYihFQzMxMDRfU0VSNF9MU1IpOworCX0gd2hpbGUgKChzdGF0dXMgJiBMU1JfQk9USF9FTVBUWSkgIT0gTFNSX0JPVEhfRU1QVFkpOworCQorfQorCitzdGF0aWMgaW50IGU1X3NlbmRfcGFja2V0KHU4ICpwYWNrZXQsIGludCBjb3VudCwgc3RydWN0IGU1X3N0cnVjdCAqaykKK3sKKwlpbnQgaTsKKworCWRpc2FibGVfaXJxKEVDMzEwNF9JUlFfU0VSNCk7CisJCisJaWYgKGstPmNhY2hlZF9tY3IgJiBNQ1JfUlRTKSB7CisJCXByaW50aygiZTVfc2VuZF9wYWNrZXQ6IHRvbyBzbG93XG4iKTsKKwkJZW5hYmxlX2lycShFQzMxMDRfSVJRX1NFUjQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlrLT5jYWNoZWRfbWNyIHw9IE1DUl9SVFM7CisJY3RybF9vdXRiKGstPmNhY2hlZF9tY3IsIEVDMzEwNF9TRVI0X01DUik7CisKKwllNV93YWl0X2Zvcl9jdHMoayk7CisKKwlwcmludGsoInA6ICIpOworCisJZm9yKGk9MDsgaTxjb3VudDsgaSsrKQorCQllNV9zZW5kX2J5dGUocGFja2V0W2ldLCBrKTsKKworCWU1X3NlbmRfYnl0ZShlNV9jaGVja3N1bShwYWNrZXQsIGNvdW50KSwgayk7CisKKwlwcmludGsoIlxuIik7CisKKwl1ZGVsYXkoMTUwMCk7CisKKwlrLT5jYWNoZWRfbWNyICY9IH5NQ1JfUlRTOworCWN0cmxfb3V0YihrLT5jYWNoZWRfbWNyLCBFQzMxMDRfU0VSNF9NQ1IpOworCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQorCQorCisJZW5hYmxlX2lycShFQzMxMDRfSVJRX1NFUjQpOworCisJCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEU1IHBhY2tldHMgd2Uga25vdyBhYm91dDoKKyAqIEU1LT5ob3N0IDB4ODAgMHgwNSA8Y2hlY2tzdW0+IC0gcmVzZW5kIHBhY2tldAorICogaG9zdC0+RTUgMHg4MyAweDQzIDxjb250cmFzdD4gLSBzZXQgTENEIGNvbnRyYXN0CisgKiBob3N0LT5FNSAweDg1IDB4NDEgMHgwMiA8YnJpZ2h0bmVzcz4gMHgwMiAtIHNldCBMQ0QgYmFja2xpZ2h0CisgKiBFNS0+aG9zdCAweDg3IDxwczIgcGFja2V0PiAweDAwIDxjaGVja3N1bT4gLSBleHRlcm5hbCBQUzIgCisgKiBFNS0+aG9zdCAweDg4IDxzY2FuY29kZT4gPGNoZWNrc3VtPiAtIGtleSBwcmVzcworICovCisKK3N0YXRpYyB2b2lkIGU1X3JlY2VpdmUoc3RydWN0IGU1X3N0cnVjdCAqaykKK3sKKwlrLT5wYWNrZXRbay0+cG9zKytdID0gY3RybF9pbmIoRUMzMTA0X1NFUjRfREFUQSk7CisKKwlpZiAoay0+cG9zID09IDEpIHsKKwkJc3dpdGNoKGstPnBhY2tldFswXSkgeworCQljYXNlIDB4ODA6CisJCQlrLT5sZW5ndGggPSAzOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSAweDg3OiAvKiBQUzIgZXh0ICovCisJCQlrLT5sZW5ndGggPSA2OworCQkJYnJlYWs7CisKKwkJY2FzZSAweDg4OiAvKiBrZXlib2FyZCAqLworCQkJay0+bGVuZ3RoID0gMzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlrLT5sZW5ndGggPSAxOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidW5rbm93biBFNSBwYWNrZXQgJTAyeFxuIiwKKwkJCSAgICAgICBrLT5wYWNrZXRbMF0pOworCQl9CisJfQorCisJaWYgKGstPnBvcyA9PSBrLT5sZW5ndGgpIHsKKwkJaW50IGk7CisKKwkJaWYgKGU1X2NoZWNrc3VtKGstPnBhY2tldCwgay0+bGVuZ3RoKSAhPSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRTU6IHdyb25nIGNoZWNrc3VtXG4iKTsKKworI2lmIDAKKwkJcHJpbnRrKCJFNSBwYWNrZXQgWyIpOworCQlmb3IoaT0wOyBpPGstPmxlbmd0aDsgaSsrKSB7CisJCQlwcmludGsoIiUwMnggIiwgay0+cGFja2V0W2ldKTsKKwkJfQorCisJCXByaW50aygiKCUwMngpXVxuIiwgZTVfY2hlY2tzdW0oay0+cGFja2V0LCBrLT5sZW5ndGgtMSkpOworI2VuZGlmCisKKwkJc3dpdGNoKGstPnBhY2tldFswXSkgeworCQljYXNlIDB4ODA6CisJCWNhc2UgMHg4ODoKKwkJCWhhbmRsZV9rZXlib2FyZF9ldmVudChrLT5wYWNrZXRbMV0pOworCQkJYnJlYWs7CisJCX0KKworCQlrLT5wb3MgPSBrLT5sZW5ndGggPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgZWMzMTA0X2tleWJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBlNV9zdHJ1Y3QgKmsgPSAmZWMzMTA0X2tleWI7CisJdTggbXNyLCBsc3I7CisKKwltc3IgPSBjdHJsX2luYihFQzMxMDRfU0VSNF9NU1IpOworCQorCWlmICgobXNyICYgTVNSX0NUUykgJiYgIShrLT5sYXN0X21zciAmIE1TUl9DVFMpKSB7CisJCWlmIChrLT5jYWNoZWRfbWNyICYgTUNSX1JUUykKKwkJCXByaW50aygiY29uZnVzZWQ6IFJUUyBhbHJlYWR5IGhpZ2hcbiIpOworCQkvKiBDVFMgd2VudCBoaWdoLiAgU2VuZCBSVFMuICovCisJCWstPmNhY2hlZF9tY3IgfD0gTUNSX1JUUzsKKwkJCisJCWN0cmxfb3V0YihrLT5jYWNoZWRfbWNyLCBFQzMxMDRfU0VSNF9NQ1IpOworCX0gZWxzZSBpZiAoKCEobXNyICYgTVNSX0NUUykpICYmIChrLT5sYXN0X21zciAmIE1TUl9DVFMpKSB7CisJCS8qIENUUyB3ZW50IGxvdy4gKi8KKwkJaWYgKCEoay0+Y2FjaGVkX21jciAmIE1DUl9SVFMpKQorCQkJcHJpbnRrKCJjb25mdXNlZDogUlRTIGFscmVhZHkgbG93XG4iKTsKKworCQlrLT5jYWNoZWRfbWNyICY9IH5NQ1JfUlRTOworCisJCWN0cmxfb3V0YihrLT5jYWNoZWRfbWNyLCBFQzMxMDRfU0VSNF9NQ1IpOworCX0KKworCWstPmxhc3RfbXNyID0gbXNyOworCisJbHNyID0gY3RybF9pbmIoRUMzMTA0X1NFUjRfTFNSKTsKKworCWlmIChsc3IgJiBMU1JfRFIpCisJCWU1X3JlY2VpdmUoayk7Cit9CisKK3N0YXRpYyB2b2lkIGVjMzEwNF9rZXliX2NsZWFyX3N0YXRlKHZvaWQpCit7CisJc3RydWN0IGU1X3N0cnVjdCAqayA9ICZlYzMxMDRfa2V5YjsKKwl1OCBtc3IsIGxzcjsKKwkKKwkvKiB3ZSB3YW50IENUUyB0byBiZSBsb3cgKi8KKwlrLT5sYXN0X21zciA9IDA7CisKKwlmb3IgKDs7KSB7CisJCW1zbGVlcCgxMDApOworCisJCW1zciA9IGN0cmxfaW5iKEVDMzEwNF9TRVI0X01TUik7CisJCisJCWxzciA9IGN0cmxfaW5iKEVDMzEwNF9TRVI0X0xTUik7CisJCQorCQlpZiAobHNyICYgTFNSX0RSKSB7CisJCQllNV9yZWNlaXZlKGspOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKG1zciAmIE1TUl9DVFMpICYmICEoay0+bGFzdF9tc3IgJiBNU1JfQ1RTKSkgeworCQkJaWYgKGstPmNhY2hlZF9tY3IgJiBNQ1JfUlRTKQorCQkJCXByaW50aygiY29uZnVzZWQ6IFJUUyBhbHJlYWR5IGhpZ2hcbiIpOworCQkJLyogQ1RTIHdlbnQgaGlnaC4gIFNlbmQgUlRTLiAqLworCQkJay0+Y2FjaGVkX21jciB8PSBNQ1JfUlRTOworCQkKKwkJCWN0cmxfb3V0YihrLT5jYWNoZWRfbWNyLCBFQzMxMDRfU0VSNF9NQ1IpOworCQl9IGVsc2UgaWYgKCghKG1zciAmIE1TUl9DVFMpKSAmJiAoay0+bGFzdF9tc3IgJiBNU1JfQ1RTKSkgeworCQkJLyogQ1RTIHdlbnQgbG93LiAqLworCQkJaWYgKCEoay0+Y2FjaGVkX21jciAmIE1DUl9SVFMpKQorCQkJCXByaW50aygiY29uZnVzZWQ6IFJUUyBhbHJlYWR5IGxvd1xuIik7CisJCQkKKwkJCWstPmNhY2hlZF9tY3IgJj0gfk1DUl9SVFM7CisJCQkKKwkJCWN0cmxfb3V0YihrLT5jYWNoZWRfbWNyLCBFQzMxMDRfU0VSNF9NQ1IpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCisJCWstPmxhc3RfbXNyID0gbXNyOworCisJCWNvbnRpbnVlOworCX0KK30KKwordm9pZCBfX2luaXQgZWMzMTA0X2tiZF9pbml0X2h3KHZvaWQpCit7CisJZWMzMTA0X2tleWIubGFzdF9tc3IgPSBjdHJsX2luYihFQzMxMDRfU0VSNF9NU1IpOworCWVjMzEwNF9rZXliLmNhY2hlZF9tY3IgPSBjdHJsX2luYihFQzMxMDRfU0VSNF9NQ1IpOworCisJZWMzMTA0X2tleWJfY2xlYXJfc3RhdGUoKTsKKworCS8qIE9rLCBmaW5hbGx5IGFsbG9jYXRlIHRoZSBJUlEsIGFuZCBvZmYgd2UgZ28uLiAqLworCXJlcXVlc3RfaXJxKEVDMzEwNF9JUlFfU0VSNCwgZWMzMTA0X2tleWJfaW50ZXJydXB0LCAwLCAia2V5Ym9hcmQiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lZmlydGMuYyBiL2RyaXZlcnMvY2hhci9lZmlydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDkwZTdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2VmaXJ0Yy5jCkBAIC0wLDAgKzEsNDE3IEBACisvKgorICogRUZJIFRpbWUgU2VydmljZXMgRHJpdmVyIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBIZXdsZXR0LVBhY2thcmQgQ28KKyAqIENvcHlyaWdodCAoQykgMTk5OSBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisgKgorICogQmFzZWQgb24gc2tlbGV0b24gZnJvbSB0aGUgZHJpdmVycy9jaGFyL3J0Yy5jIGRyaXZlciBieSBQLiBHb3J0bWFrZXIKKyAqCisgKiBUaGlzIGNvZGUgcHJvdmlkZXMgYW4gYXJjaGl0ZWN0ZWQgJiBwb3J0YWJsZSBpbnRlcmZhY2UgdG8gdGhlIHJlYWwgdGltZQorICogY2xvY2sgYnkgdXNpbmcgRUZJIGluc3RlYWQgb2YgZGlyZWN0IGJpdCBmaWRkbGluZy4gVGhlIGZ1bmN0aW9uYWxpdGllcyBhcmUgCisgKiBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgcnRjLmMgZHJpdmVyLiBUaGUgb25seSB3YXkgdG8gdGFsayB0byB0aGUgZGV2aWNlIAorICogaXMgYnkgdXNpbmcgaW9jdGwoKS4gVGhlcmUgaXMgYSAvcHJvYyBpbnRlcmZhY2Ugd2hpY2ggcHJvdmlkZXMgdGhlIHJhdyAKKyAqIGluZm9ybWF0aW9uLgorICoKKyAqIFBsZWFzZSBub3RlIHRoYXQgd2UgaGF2ZSBrZXB0IHRoZSBBUEkgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlCisgKiBsZWdhY3kgUlRDLiBUaGUgc3RhbmRhcmQgL3NiaW4vaHdjbG9jayBwcm9ncmFtIHNob3VsZCB3b3JrIG5vcm1hbGx5IAorICogd2hlbiB1c2VkIHRvIGdldC9zZXQgdGhlIHRpbWUuCisgKgorICogTk9URVM6CisgKgktIExvY2tpbmcgaXMgcmVxdWlyZWQgZm9yIHNhZmUgZXhlY3V0aW9uIG9mIEVGSSBjYWxscyB3aXRoIHJlZ2FyZHMKKyAqCSAgdG8gaW50ZXJycnVwdHMgYW5kIFNNUC4KKyAqCisgKiBUT0RPIChEZWNlbWJlciAxOTk5KToKKyAqIAktIHByb3ZpZGUgdGhlIEFQSSB0byBzZXQvZ2V0IHRoZSBXYWtlVXAgQWxhcm0gKGRpZmZlcmVudCBmcm9tIHRoZQorICoJICBydGMuYyBhbGFybSkuCisgKgktIFNNUCB0ZXN0aW5nCisgKiAJLSBBZGQgbW9kdWxlIHN1cHBvcnQKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBFRklfUlRDX1ZFUlNJT04JCSIwLjQiCisKKyNkZWZpbmUgRUZJX0lTRFNUIChFRklfVElNRV9BREpVU1RfREFZTElHSFR8RUZJX1RJTUVfSU5fREFZTElHSFQpCisvKgorICogRUZJIEVwb2NoIGlzIDEvMS8xOTk4CisgKi8KKyNkZWZpbmUgRUZJX1JUQ19FUE9DSAkJMTk5OAorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGVmaV9ydGNfbG9jayk7CisKK3N0YXRpYyBpbnQgZWZpX3J0Y19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKKyNkZWZpbmUgaXNfbGVhcCh5ZWFyKSBcCisgICAgICAgICAgKCh5ZWFyKSAlIDQgPT0gMCAmJiAoKHllYXIpICUgMTAwICE9IDAgfHwgKHllYXIpICUgNDAwID09IDApKQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaW50IF9fbW9uX3lkYXlbMl1bMTNdID0KK3sKKwkvKiBOb3JtYWwgeWVhcnMuICAqLworCXsgMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQsIDM2NSB9LAorCS8qIExlYXAgeWVhcnMuICAqLyAgCisJeyAwLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNSwgMzY2IH0KK307CisKKy8qCisgKiByZXR1cm5zIGRheSBvZiB0aGUgeWVhciBbMC0zNjVdCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citjb21wdXRlX3lkYXkoZWZpX3RpbWVfdCAqZWZ0KQoreworCS8qIGVmaV90aW1lX3QubW9udGggaXMgaW4gdGhlIFsxLTEyXSBzbywgd2UgbmVlZCAtMSAqLworCXJldHVybiAgX19tb25feWRheVtpc19sZWFwKGVmdC0+eWVhcildW2VmdC0+bW9udGgtMV0rIGVmdC0+ZGF5IC0xOworfQorLyoKKyAqIHJldHVybnMgZGF5IG9mIHRoZSB3ZWVrIFswLTZdIDA9U3VuZGF5CisgKgorICogRG9uJ3QgdHJ5IHRvIHByb3ZpZGUgYSB5ZWFyIHRoYXQncyBiZWZvcmUgMTk5OCwgcGxlYXNlICEKKyAqLworc3RhdGljIGludAorY29tcHV0ZV93ZGF5KGVmaV90aW1lX3QgKmVmdCkKK3sKKwlpbnQgeTsKKwlpbnQgbmRheXMgPSAwOworCisJaWYgKCBlZnQtPnllYXIgPCAxOTk4ICkgeworCQlwcmludGsoS0VSTl9FUlIgImVmaXJ0YzogRUZJIHllYXIgPCAxOTk4LCBpbnZhbGlkIGRhdGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yKHk9RUZJX1JUQ19FUE9DSDsgeSA8IGVmdC0+eWVhcjsgeSsrICkgeworCQluZGF5cyArPSAzNjUgKyAoaXNfbGVhcCh5KSA/IDEgOiAwKTsKKwl9CisJbmRheXMgKz0gY29tcHV0ZV95ZGF5KGVmdCk7CisKKwkvKgorCSAqIDQ9MS8xLzE5OTggd2FzIGEgVGh1cnNkYXkKKwkgKi8KKwlyZXR1cm4gKG5kYXlzICsgNCkgJSA3OworfQorCitzdGF0aWMgdm9pZAorY29udmVydF90b19lZmlfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnd0aW1lLCBlZmlfdGltZV90ICplZnQpCit7CisKKwllZnQtPnllYXIJPSB3dGltZS0+dG1feWVhciArIDE5MDA7CisJZWZ0LT5tb250aAk9IHd0aW1lLT50bV9tb24gKyAxOyAKKwllZnQtPmRheQk9IHd0aW1lLT50bV9tZGF5OworCWVmdC0+aG91cgk9IHd0aW1lLT50bV9ob3VyOworCWVmdC0+bWludXRlCT0gd3RpbWUtPnRtX21pbjsKKwllZnQtPnNlY29uZCAJPSB3dGltZS0+dG1fc2VjOworCWVmdC0+bmFub3NlY29uZCA9IDA7IAorCWVmdC0+ZGF5bGlnaHQJPSB3dGltZS0+dG1faXNkc3QgPyBFRklfSVNEU1Q6IDA7CisJZWZ0LT50aW1lem9uZQk9IEVGSV9VTlNQRUNJRklFRF9USU1FWk9ORTsKK30KKworc3RhdGljIHZvaWQKK2NvbnZlcnRfZnJvbV9lZmlfdGltZShlZmlfdGltZV90ICplZnQsIHN0cnVjdCBydGNfdGltZSAqd3RpbWUpCit7CisJbWVtc2V0KHd0aW1lLCAwLCBzaXplb2YoKnd0aW1lKSk7CisJd3RpbWUtPnRtX3NlYyAgPSBlZnQtPnNlY29uZDsKKwl3dGltZS0+dG1fbWluICA9IGVmdC0+bWludXRlOworCXd0aW1lLT50bV9ob3VyID0gZWZ0LT5ob3VyOworCXd0aW1lLT50bV9tZGF5ID0gZWZ0LT5kYXk7CisJd3RpbWUtPnRtX21vbiAgPSBlZnQtPm1vbnRoIC0gMTsKKwl3dGltZS0+dG1feWVhciA9IGVmdC0+eWVhciAtIDE5MDA7CisKKwkvKiBkYXkgb2YgdGhlIHdlZWsgWzAtNl0sIFN1bmRheT0wICovCisJd3RpbWUtPnRtX3dkYXkgPSBjb21wdXRlX3dkYXkoZWZ0KTsKKworCS8qIGRheSBpbiB0aGUgeWVhciBbMS0zNjVdKi8KKwl3dGltZS0+dG1feWRheSA9IGNvbXB1dGVfeWRheShlZnQpOworCisKKwlzd2l0Y2ggKGVmdC0+ZGF5bGlnaHQgJiBFRklfSVNEU1QpIHsKKwkJY2FzZSBFRklfSVNEU1Q6CisJCQl3dGltZS0+dG1faXNkc3QgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX1RJTUVfQURKVVNUX0RBWUxJR0hUOgorCQkJd3RpbWUtPnRtX2lzZHN0ID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJd3RpbWUtPnRtX2lzZHN0ID0gLTE7CisJfQorfQorCitzdGF0aWMgaW50CitlZmlfcnRjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCisJZWZpX3N0YXR1c190CXN0YXR1czsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWVmaV90aW1lX3QJZWZ0OworCWVmaV90aW1lX2NhcF90CWNhcDsKKwlzdHJ1Y3QgcnRjX3RpbWUJd3RpbWU7CisJc3RydWN0IHJ0Y193a2Fscm0gX191c2VyICpld3A7CisJdW5zaWduZWQgY2hhcgllbmFibGVkLCBwZW5kaW5nOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBSVENfVUlFX09OOgorCQljYXNlIFJUQ19VSUVfT0ZGOgorCQljYXNlIFJUQ19QSUVfT046CisJCWNhc2UgUlRDX1BJRV9PRkY6CisJCWNhc2UgUlRDX0FJRV9PTjoKKwkJY2FzZSBSVENfQUlFX09GRjoKKwkJY2FzZSBSVENfQUxNX1NFVDoKKwkJY2FzZSBSVENfQUxNX1JFQUQ6CisJCWNhc2UgUlRDX0lSUVBfUkVBRDoKKwkJY2FzZSBSVENfSVJRUF9TRVQ6CisJCWNhc2UgUlRDX0VQT0NIX1JFQUQ6CisJCWNhc2UgUlRDX0VQT0NIX1NFVDoKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNhc2UgUlRDX1JEX1RJTUU6CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZlZmlfcnRjX2xvY2ssIGZsYWdzKTsKKworCQkJc3RhdHVzID0gZWZpLmdldF90aW1lKCZlZnQsICZjYXApOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZmlfcnRjX2xvY2ssZmxhZ3MpOworCisJCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCQkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJCXByaW50ayhLRVJOX0VSUiAiZWZpdGltZTogY2FuJ3QgcmVhZCB0aW1lXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJY29udmVydF9mcm9tX2VmaV90aW1lKCZlZnQsICZ3dGltZSk7CisKKyAJCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnd0aW1lLAorCQkJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgcnRjX3RpbWUpKSA/IC0gRUZBVUxUIDogMDsKKworCQljYXNlIFJUQ19TRVRfVElNRToKKworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpIHJldHVybiAtRUFDQ0VTOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnd0aW1lLCAoc3RydWN0IHJ0Y190aW1lIF9fdXNlciAqKWFyZywKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpICkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJY29udmVydF90b19lZmlfdGltZSgmd3RpbWUsICZlZnQpOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZWZpX3J0Y19sb2NrLCBmbGFncyk7CisKKwkJCXN0YXR1cyA9IGVmaS5zZXRfdGltZSgmZWZ0KTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWZpX3J0Y19sb2NrLGZsYWdzKTsKKworCQkJcmV0dXJuIHN0YXR1cyA9PSBFRklfU1VDQ0VTUyA/IDAgOiAtRUlOVkFMOworCisJCWNhc2UgUlRDX1dLQUxNX1NFVDoKKworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpIHJldHVybiAtRUFDQ0VTOworCisJCQlld3AgPSAoc3RydWN0IHJ0Y193a2Fscm0gX191c2VyICopYXJnOworCisJCQlpZiAoICBnZXRfdXNlcihlbmFibGVkLCAmZXdwLT5lbmFibGVkKQorCQkJICAgfHwgY29weV9mcm9tX3VzZXIoJnd0aW1lLCAmZXdwLT50aW1lLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkgKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQljb252ZXJ0X3RvX2VmaV90aW1lKCZ3dGltZSwgJmVmdCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZlZmlfcnRjX2xvY2ssIGZsYWdzKTsKKwkJCS8qCisJCQkgKiBYWFggRml4bWU6CisJCQkgKiBBcyBvZiBFRkkgMC45MiB3aXRoIHRoZSBmaXJtd2FyZSBJIGhhdmUgb24gbXkKKwkJCSAqIG1hY2hpbmUgdGhpcyBjYWxsIGRvZXMgbm90IHNlZW0gdG8gd29yayBxdWl0ZQorCQkJICogcmlnaHQKKwkJCSAqLworCQkJc3RhdHVzID0gZWZpLnNldF93YWtldXBfdGltZSgoZWZpX2Jvb2xfdCllbmFibGVkLCAmZWZ0KTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWZpX3J0Y19sb2NrLGZsYWdzKTsKKworCQkJcmV0dXJuIHN0YXR1cyA9PSBFRklfU1VDQ0VTUyA/IDAgOiAtRUlOVkFMOworCisJCWNhc2UgUlRDX1dLQUxNX1JEOgorCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZWZpX3J0Y19sb2NrLCBmbGFncyk7CisKKwkJCXN0YXR1cyA9IGVmaS5nZXRfd2FrZXVwX3RpbWUoKGVmaV9ib29sX3QgKikmZW5hYmxlZCwgKGVmaV9ib29sX3QgKikmcGVuZGluZywgJmVmdCk7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVmaV9ydGNfbG9jayxmbGFncyk7CisKKwkJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisJCQlld3AgPSAoc3RydWN0IHJ0Y193a2Fscm0gX191c2VyICopYXJnOworCisJCQlpZiAoICBwdXRfdXNlcihlbmFibGVkLCAmZXdwLT5lbmFibGVkKQorCQkJICAgfHwgcHV0X3VzZXIocGVuZGluZywgJmV3cC0+cGVuZGluZykpIHJldHVybiAtRUZBVUxUOworCisJCQljb252ZXJ0X2Zyb21fZWZpX3RpbWUoJmVmdCwgJnd0aW1lKTsKKworCQkJcmV0dXJuIGNvcHlfdG9fdXNlcigmZXdwLT50aW1lLCAmd3RpbWUsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkgPyAtRUZBVUxUIDogMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKglXZSBlbmZvcmNlIG9ubHkgb25lIHVzZXIgYXQgYSB0aW1lIGhlcmUgd2l0aCB0aGUgb3Blbi9jbG9zZS4KKyAqCUFsc28gY2xlYXIgdGhlIHByZXZpb3VzIGludGVycnVwdCBkYXRhIG9uIGFuIG9wZW4sIGFuZCBjbGVhbgorICoJdXAgdGhpbmdzIG9uIGEgY2xvc2UuCisgKi8KKworc3RhdGljIGludAorZWZpX3J0Y19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qCisJICogbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUKKwkgKiBXZSBkbyBhY2NlcHQgbXVsdGlwbGUgb3BlbiBmaWxlcyBhdCB0aGUgc2FtZSB0aW1lIGFzIHdlCisJICogc3luY2hyb25pemUgb24gdGhlIHBlciBjYWxsIG9wZXJhdGlvbi4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZWZpX3J0Y19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVRoZSB2YXJpb3VzIGZpbGUgb3BlcmF0aW9ucyB3ZSBzdXBwb3J0LgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVmaV9ydGNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCQk9IGVmaV9ydGNfaW9jdGwsCisJLm9wZW4JCT0gZWZpX3J0Y19vcGVuLAorCS5yZWxlYXNlCT0gZWZpX3J0Y19jbG9zZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBlZmlfcnRjX2Rldj0KK3sKKwlFRklfUlRDX01JTk9SLAorCSJlZmlydGMiLAorCSZlZmlfcnRjX2ZvcHMKK307CisKKy8qCisgKglXZSBleHBvcnQgUkFXIEVGSSBpbmZvcm1hdGlvbiB0byAvcHJvYy9kcml2ZXIvZWZpcnRjCisgKi8KK3N0YXRpYyBpbnQKK2VmaV9ydGNfZ2V0X3N0YXR1cyhjaGFyICpidWYpCit7CisJZWZpX3RpbWVfdCAJZWZ0LCBhbG07CisJZWZpX3RpbWVfY2FwX3QJY2FwOworCWNoYXIJCSpwID0gYnVmOworCWVmaV9ib29sX3QJZW5hYmxlZCwgcGVuZGluZzsJCisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCW1lbXNldCgmZWZ0LCAwLCBzaXplb2YoZWZ0KSk7CisJbWVtc2V0KCZhbG0sIDAsIHNpemVvZihhbG0pKTsKKwltZW1zZXQoJmNhcCwgMCwgc2l6ZW9mKGNhcCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVmaV9ydGNfbG9jaywgZmxhZ3MpOworCisJZWZpLmdldF90aW1lKCZlZnQsICZjYXApOworCWVmaS5nZXRfd2FrZXVwX3RpbWUoJmVuYWJsZWQsICZwZW5kaW5nLCAmYWxtKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVmaV9ydGNfbG9jayxmbGFncyk7CisKKwlwICs9IHNwcmludGYocCwKKwkJICAgICAiVGltZSAgICAgICAgICAgOiAldToldToldS4lMDl1XG4iCisJCSAgICAgIkRhdGUgICAgICAgICAgIDogJXUtJXUtJXVcbiIKKwkJICAgICAiRGF5bGlnaHQgICAgICAgOiAldVxuIiwKKwkJICAgICBlZnQuaG91ciwgZWZ0Lm1pbnV0ZSwgZWZ0LnNlY29uZCwgZWZ0Lm5hbm9zZWNvbmQsIAorCQkgICAgIGVmdC55ZWFyLCBlZnQubW9udGgsIGVmdC5kYXksCisJCSAgICAgZWZ0LmRheWxpZ2h0KTsKKworCWlmIChlZnQudGltZXpvbmUgPT0gRUZJX1VOU1BFQ0lGSUVEX1RJTUVaT05FKQorCQlwICs9IHNwcmludGYocCwgIlRpbWV6b25lICAgICAgIDogdW5zcGVjaWZpZWRcbiIpOworCWVsc2UKKwkJLyogWFhYIGZpeG1lOiBjb252ZXJ0IHRvIHN0cmluZz8gKi8KKwkJcCArPSBzcHJpbnRmKHAsICJUaW1lem9uZSAgICAgICA6ICV1XG4iLCBlZnQudGltZXpvbmUpOworCQkKKworCXAgKz0gc3ByaW50ZihwLAorCQkgICAgICJBbGFybSBUaW1lICAgICA6ICV1OiV1OiV1LiUwOXVcbiIKKwkJICAgICAiQWxhcm0gRGF0ZSAgICAgOiAldS0ldS0ldVxuIgorCQkgICAgICJBbGFybSBEYXlsaWdodCA6ICV1XG4iCisJCSAgICAgIkVuYWJsZWQgICAgICAgIDogJXNcbiIKKwkJICAgICAiUGVuZGluZyAgICAgICAgOiAlc1xuIiwKKwkJICAgICBhbG0uaG91ciwgYWxtLm1pbnV0ZSwgYWxtLnNlY29uZCwgYWxtLm5hbm9zZWNvbmQsIAorCQkgICAgIGFsbS55ZWFyLCBhbG0ubW9udGgsIGFsbS5kYXksIAorCQkgICAgIGFsbS5kYXlsaWdodCwKKwkJICAgICBlbmFibGVkID09IDEgPyAieWVzIiA6ICJubyIsCisJCSAgICAgcGVuZGluZyA9PSAxID8gInllcyIgOiAibm8iKTsKKworCWlmIChlZnQudGltZXpvbmUgPT0gRUZJX1VOU1BFQ0lGSUVEX1RJTUVaT05FKQorCQlwICs9IHNwcmludGYocCwgIlRpbWV6b25lICAgICAgIDogdW5zcGVjaWZpZWRcbiIpOworCWVsc2UKKwkJLyogWFhYIGZpeG1lOiBjb252ZXJ0IHRvIHN0cmluZz8gKi8KKwkJcCArPSBzcHJpbnRmKHAsICJUaW1lem9uZSAgICAgICA6ICV1XG4iLCBhbG0udGltZXpvbmUpOworCisJLyoKKwkgKiBub3cgcHJpbnRzIHRoZSBjYXBhYmlsaXRpZXMKKwkgKi8KKwlwICs9IHNwcmludGYocCwKKwkJICAgICAiUmVzb2x1dGlvbiAgICAgOiAldVxuIgorCQkgICAgICJBY2N1cmFjeSAgICAgICA6ICV1XG4iCisJCSAgICAgIlNldHN0b1plcm8gICAgIDogJXVcbiIsCisJCSAgICAgIGNhcC5yZXNvbHV0aW9uLCBjYXAuYWNjdXJhY3ksIGNhcC5zZXRzX3RvX3plcm8pOworCisJcmV0dXJuICBwIC0gYnVmOworfQorCitzdGF0aWMgaW50CitlZmlfcnRjX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisgICAgICAgIGludCBsZW4gPSBlZmlfcnRjX2dldF9zdGF0dXMocGFnZSk7CisgICAgICAgIGlmIChsZW4gPD0gb2ZmK2NvdW50KSAqZW9mID0gMTsKKyAgICAgICAgKnN0YXJ0ID0gcGFnZSArIG9mZjsKKyAgICAgICAgbGVuIC09IG9mZjsKKyAgICAgICAgaWYgKGxlbj5jb3VudCkgbGVuID0gY291bnQ7CisgICAgICAgIGlmIChsZW48MCkgbGVuID0gMDsKKyAgICAgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBfX2luaXQgCitlZmlfcnRjX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRUZJIFRpbWUgU2VydmljZXMgRHJpdmVyIHYlc1xuIiwgRUZJX1JUQ19WRVJTSU9OKTsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmVmaV9ydGNfZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZWZpcnRjOiBjYW4ndCBtaXNjX3JlZ2lzdGVyIG9uIG1pbm9yPSVkXG4iLAorCQkJCUVGSV9SVENfTUlOT1IpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRpciA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKCJkcml2ZXIvZWZpcnRjIiwgMCwgTlVMTCwKKwkJCSAgICAgICAgICAgICAgZWZpX3J0Y19yZWFkX3Byb2MsIE5VTEwpOworCWlmIChkaXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImVmaXJ0YzogY2FuJ3QgY3JlYXRlIC9wcm9jL2RyaXZlci9lZmlydGMuXG4iKTsKKwkJbWlzY19kZXJlZ2lzdGVyKCZlZmlfcnRjX2Rldik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZWZpX3J0Y19leGl0KHZvaWQpCit7CisJLyogbm90IHlldCB1c2VkICovCit9CisKK21vZHVsZV9pbml0KGVmaV9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChlZmlfcnRjX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZXBjYS5jIGIvZHJpdmVycy9jaGFyL2VwY2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI1ZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2VwY2EuYwpAQCAtMCwwICsxLDM3ODkgQEAKKy8qCisKKyAKKwlDb3B5cmlnaHQgKEMpIDE5OTYgIERpZ2kgSW50ZXJuYXRpb25hbC4KKyAKKwlGb3IgdGVjaG5pY2FsIHN1cHBvcnQgcGxlYXNlIGVtYWlsIGRpZ2lMaW51eEBkZ2lpLmNvbSBvcgorCWNhbGwgRGlnaSB0ZWNoIHN1cHBvcnQgYXQgKDYxMikgOTEyLTM0NTYKKworCU11Y2ggb2YgdGhpcyBkZXNpZ24gYW5kIGNvZGUgY2FtZSBmcm9tIGVwY2EuYyB3aGljaCB3YXMgCisJY29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IFRyb3kgRGUgSm9uZ2gsIGFuZCBzdWJzcXVlbnRseSAKKwltb2RpZmllZCBieSBEYXZpZCBOdWdlbnQsIENocmlzdG9waCBMYW1ldGVyLCBNaWtlIE1jTGFnYW4uIAorIAorIAlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIAlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIAl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIAkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIAlidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIAlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogU2VlIFJFQURNRS5lcGNhIGZvciBjaGFuZ2UgaGlzdG9yeSAtLURBVCovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaWZkZWYgQ09ORklHX1BDSQorI2RlZmluZSBFTkFCTEVfUENJCisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisjZGVmaW5lIHB1dFVzZXIoYXJnMSwgYXJnMikgcHV0X3VzZXIoYXJnMSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnMikKKyNkZWZpbmUgZ2V0VXNlcihhcmcxLCBhcmcyKSBnZXRfdXNlcihhcmcxLCAodW5zaWduZWQgX191c2VyICopYXJnMikKKworI2lmZGVmIEVOQUJMRV9QQ0kKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJkaWdpUENJLmgiCisjZW5kaWYgLyogRU5BQkxFX1BDSSAqLworCisjaW5jbHVkZSAiZGlnaTEuaCIKKyNpbmNsdWRlICJkaWdpRmVwMS5oIgorI2luY2x1ZGUgImVwY2EuaCIKKyNpbmNsdWRlICJlcGNhY29uZmlnLmgiCisKKyNpZiBCSVRTX1BFUl9MT05HICE9IDMyCisjICBlcnJvciBGSVhNRTogdGhpcyBkcml2ZXIgb25seSB3b3JrcyBvbiAzMi1iaXQgcGxhdGZvcm1zCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFZFUlNJT04gICAgICAgICAgICAiMS4zLjAuMS1MSyIKKworLyogVGhpcyBtYWpvciBuZWVkcyB0byBiZSBzdWJtaXR0ZWQgdG8gTGludXggdG8gam9pbiB0aGUgbWFqb3JzIGxpc3QgKi8KKworI2RlZmluZSBESUdJSU5GT01BSk9SICAgICAgIDM1ICAvKiBGb3IgRGlnaSBzcGVjaWZpYyBpb2N0bCAqLyAKKworCisjZGVmaW5lIE1BWENBUkRTIDcKKyNkZWZpbmUgZXBjYWFzc2VydCh4LCBtc2cpICBpZiAoISh4KSkgZXBjYV9lcnJvcihfX0xJTkVfXywgbXNnKQorCisjZGVmaW5lIFBGWCAiZXBjYTogIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBnbG9iYWwgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY2hhciBtZXNnWzEwMF07CitzdGF0aWMgaW50IG5iZGV2cywgbnVtX2NhcmRzLCBsaWxvY29uZmlnOworc3RhdGljIGludCBkaWdpX3BvbGxlcl9pbmhpYml0ZWQgPSAxIDsKKworc3RhdGljIGludCBzZXR1cF9lcnJvcl9jb2RlOworc3RhdGljIGludCBpbnZhbGlkX2xpbG9fY29uZmlnOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU1BWEJPQVJEUyBpcyB0eXBpY2FsbHkgMTIsIGJ1dCBJU0EgYW5kIEVJU0EgY2FyZHMgYXJlIHJlc3RyaWN0ZWQgdG8gCisJNyBiZWxvdy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzdHJ1Y3QgYm9hcmRfaW5mbyBib2FyZHNbTUFYQk9BUkRTXTsKKworCisvKiAtLS0tLS0tLS0tLS0tIEJlZ2luIHN0cnVjdHVyZXMgdXNlZCBmb3IgZHJpdmVyIHJlZ2lzdGVyYXRpb24gLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnBjX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcGNfaW5mbzsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIERpZ2kgc3BlY2lmaWMgc3RydWN0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlkaWdpX2NoYW5uZWxzIHJlcHJlc2VudHMgYW4gYXJyYXkgb2Ygc3RydWN0dXJlcyB0aGF0IGtlZXAgdHJhY2sgb2YKKwllYWNoIGNoYW5uZWwgb2YgdGhlIERpZ2kgcHJvZHVjdC4gIEluZm9ybWF0aW9uIHN1Y2ggYXMgdHJhbnNtaXQgYW5kCisJcmVjZWl2ZSBwb2ludGVycywgdGVybWlvIGRhdGEsIGFuZCBzaWduYWwgZGVmaW5pdGlvbnMgKERUUiwgQ1RTLCBldGMgLi4uKQorCWFyZSBzdG9yZWQgaGVyZS4gIFRoaXMgc3RydWN0dXJlIGlzIE5PVCB1c2VkIHRvIG92ZXJsYXkgdGhlIGNhcmRzIAorCXBoeXNpY2FsIGNoYW5uZWwgc3RydWN0dXJlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgCitzdGF0aWMgc3RydWN0IGNoYW5uZWwgZGlnaV9jaGFubmVsc1tNQVhfQUxMT0NdOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXJkX3B0ciBpcyBhbiBhcnJheSB1c2VkIHRvIGhvbGQgdGhlIGFkZHJlc3Mgb2YgdGhlCisJZmlyc3QgY2hhbm5lbCBzdHJ1Y3R1cmUgb2YgZWFjaCBjYXJkLiAgVGhpcyBhcnJheSB3aWxsIGhvbGQKKwl0aGUgYWRkcmVzc2VzIG9mIHZhcmlvdXMgY2hhbm5lbHMgbG9jYXRlZCBpbiBkaWdpX2NoYW5uZWxzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzdHJ1Y3QgY2hhbm5lbCAqY2FyZF9wdHJbTUFYQ0FSRFNdOworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZXBjYV90aW1lcjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJQmVnaW4gZ2VuZXJpYyBtZW1vcnkgZnVuY3Rpb25zLiAgVGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgYWxpYXMKKwkocG9pbnQgYXQpIG1vcmUgc3BlY2lmaWMgZnVuY3Rpb25zIGRlcGVuZGVudCBvbiB0aGUgYm9hcmQgYmVpbmcKKwljb25maWd1cmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgaW5saW5lIHZvaWQgbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBnbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHJ4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB0eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0Z3dpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0bWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CisKKy8qIC0tLS0gQmVnaW4gbW9yZSAnc3BlY2lmaWMnIG1lbW9yeSBmdW5jdGlvbnMgZm9yIGN4X2xpa2UgcHJvZHVjdHMgLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CisKKy8qIC0tLS0tLSBCZWdpbiBtb3JlICdzcGVjaWZpYycgbWVtb3J5IGZ1bmN0aW9ucyBmb3IgdGhlIHBjeGUgLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIGlubGluZSB2b2lkIHBjeGVfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworCisvKiAtLS0tIEJlZ2luIG1vcmUgJ3NwZWNpZmljJyBtZW1vcnkgZnVuY3Rpb25zIGZvciB0aGUgcGM2NHhlIGFuZCBwY3hpIC0tLS0gKi8KKy8qIE5vdGUgOiBwYzY0eGUgYW5kIHBjeGkgc2hhcmUgdGhlIHNhbWUgd2luZG93aW5nIHJvdXRpbmVzICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CisKKy8qIC0gQmVnaW4gJ3NwZWNpZmljJyBkbyBub3RoaW5nIG1lbW9yeSBmdW5jdGlvbnMgbmVlZGVkIGZvciBzb21lIGNhcmRzIC0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9hc3NlcnRnd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9hc3NlcnRtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBkZWNsYXJlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjaGFubmVsICp2ZXJpZnlDaGFubmVsKHJlZ2lzdGVyIHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIGlubGluZSB2b2lkIHBjX3NjaGVkX2V2ZW50KHN0cnVjdCBjaGFubmVsICosIGludCk7CitzdGF0aWMgdm9pZCBlcGNhX2Vycm9yKGludCwgY2hhciAqKTsKK3N0YXRpYyB2b2lkIHBjX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIHZvaWQgc2h1dGRvd24oc3RydWN0IGNoYW5uZWwgKik7CitzdGF0aWMgdm9pZCBwY19oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBwY19wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqLCB1bnNpZ25lZCBjaGFyKTsKK3N0YXRpYyBpbnQgcGNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgcGNfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgcGNfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgcGNfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNoYW5uZWwgKik7CitzdGF0aWMgaW50IHBjX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgdm9pZCBwb3N0X2ZlcF9pbml0KHVuc2lnbmVkIGludCBjcmQpOworc3RhdGljIHZvaWQgZXBjYXBvbGwodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBkb2V2ZW50KGludCk7CitzdGF0aWMgdm9pZCBmZXBjbWQoc3RydWN0IGNoYW5uZWwgKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpOworc3RhdGljIHVuc2lnbmVkIHRlcm1pb3MyZGlnaV9oKHN0cnVjdCBjaGFubmVsICpjaCwgdW5zaWduZWQpOworc3RhdGljIHVuc2lnbmVkIHRlcm1pb3MyZGlnaV9pKHN0cnVjdCBjaGFubmVsICpjaCwgdW5zaWduZWQpOworc3RhdGljIHVuc2lnbmVkIHRlcm1pb3MyZGlnaV9jKHN0cnVjdCBjaGFubmVsICpjaCwgdW5zaWduZWQpOworc3RhdGljIHZvaWQgZXBjYXBhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBjaGFubmVsICopOworc3RhdGljIHZvaWQgcmVjZWl2ZV9kYXRhKHN0cnVjdCBjaGFubmVsICopOworc3RhdGljIGludCBwY19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGludCBpbmZvX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBwY19zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgdGVybWlvcyAqKTsKK3N0YXRpYyB2b2lkIGRvX3NvZnRpbnQodm9pZCAqKTsKK3N0YXRpYyB2b2lkIHBjX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBwY19zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIHBjX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KTsKK3N0YXRpYyB2b2lkIHBjX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBkaWdpX3NlbmRfYnJlYWsoc3RydWN0IGNoYW5uZWwgKmNoLCBpbnQgbXNlYyk7CitzdGF0aWMgdm9pZCBzZXR1cF9lbXB0eV9ldmVudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgY2hhbm5lbCAqY2gpOwordm9pZCBlcGNhX3NldHVwKGNoYXIgKiwgaW50ICopOwordm9pZCBjb25zb2xlX3ByaW50KGNvbnN0IGNoYXIgKik7CisKK3N0YXRpYyBpbnQgZ2V0X3Rlcm1pbyhzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgdGVybWlvIF9fdXNlciAqKTsKK3N0YXRpYyBpbnQgcGNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQpOworaW50IHBjX2luaXQodm9pZCk7CisKKyNpZmRlZiBFTkFCTEVfUENJCitzdGF0aWMgaW50IGluaXRfUENJKHZvaWQpOworI2VuZGlmIC8qIEVOQUJMRV9QQ0kgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlUYWJsZSBvZiBmdW5jdGlvbnMgZm9yIGVhY2ggYm9hcmQgdG8gaGFuZGxlIG1lbW9yeS4gIE1hbnRhaW5pbmcgCisJcGFyYWxsZWxpc20gaXMgYSAqdmVyeSogZ29vZCBpZGVhIGhlcmUuICBUaGUgaWRlYSBpcyBmb3IgdGhlIAorCXJ1bnRpbWUgY29kZSB0byBibGluZGx5IGNhbGwgdGhlc2UgZnVuY3Rpb25zLCBub3Qga25vd2luZy9jYXJpbmcgICAgCisJYWJvdXQgdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUuICBUaGlzIHN0dWZmIHNob3VsZCBjb250YWluIG5vCisJY29uZGl0aW9uYWxzOyBpZiBtb3JlIGZ1bmN0aW9uYWxpdHkgaXMgbmVlZGVkIGEgZGlmZmVyZW50IGVudHJ5CisJc2hvdWxkIGJlIGVzdGFibGlzaGVkLiAgVGhlc2UgY2FsbHMgYXJlIHRoZSBpbnRlcmZhY2UgY2FsbHMgYW5kIAorCWFyZSB0aGUgb25seSBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgYWNjZXNzZWQuICBBbnlvbmUgY2F1Z2h0CisJbWFraW5nIGRpcmVjdCBjYWxscyBkZXNlcnZlcyB3aGF0IHRoZXkgZ2V0LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIG1lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworCShiLT5tZW13aW5vbikoYiwgd2luKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKK3sKKwkoYi0+bWVtd2lub2ZmKShiLCB3aW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCShjaC0+Ym9hcmQtPmdsb2JhbHdpbm9uKShjaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwkoY2gtPmJvYXJkLT5yeHdpbm9uKShjaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwkoY2gtPmJvYXJkLT50eHdpbm9uKShjaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQoreworCShjaC0+Ym9hcmQtPm1lbW9mZikoY2gpOworfQorc3RhdGljIGlubGluZSB2b2lkIGFzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJKGNoLT5ib2FyZC0+YXNzZXJ0Z3dpbm9uKShjaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhc3NlcnRtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQoreworCShjaC0+Ym9hcmQtPmFzc2VydG1lbW9mZikoY2gpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQQ1hFTSB3aW5kb3dpbmcgaXMgdGhlIHNhbWUgYXMgdGhhdCB1c2VkIGluIHRoZSBQQ1hSIAorCWFuZCBDWCBzZXJpZXMgY2FyZHMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworICAgICAgICBvdXRiX3AoRkVQV0lOfHdpbiwgKGludCliLT5wb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCit7CisJb3V0Yl9wKDAsIChpbnQpYi0+cG9ydCArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCW91dGJfcCggRkVQV0lOLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJb3V0Yl9wKGNoLT5yeHdpbiwgKGludCljaC0+Ym9hcmQtPnBvcnQgKyAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCW91dGJfcChjaC0+dHh3aW4sIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQoreworCW91dGJfcCgwLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY3hlIG1lbW9yeSB3aW5kb3cgc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworICAgICAgICAgICAgICAgb3V0Yl9wKEZFUFdJTiB8IHdpbiwgKGludCliLT5wb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKK3sKKwlvdXRiX3AoaW5iKChpbnQpYi0+cG9ydCkgJiB+RkVQTUVNLAorCSAgICAgICAgICAgKGludCliLT5wb3J0ICsgMSk7CisJb3V0Yl9wKDAsIChpbnQpYi0+cG9ydCArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJb3V0Yl9wKCBGRVBXSU4sIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCQlvdXRiX3AoY2gtPnJ4d2luLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwkJb3V0Yl9wKGNoLT50eHdpbiwgKGludCljaC0+Ym9hcmQtPnBvcnQgKyAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGVfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwlvdXRiX3AoMCwgKGludCljaC0+Ym9hcmQtPnBvcnQpOworCW91dGJfcCgwLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOworfQorCisvKiAtLS0tLS0tLS0tLS0tIEJlZ2luIHBjNjR4ZSBhbmQgcGN4aSBtZW1vcnkgd2luZG93IHN0dWZmIC0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworICAgICAgICAgICAgICAgb3V0Yl9wKGluYigoaW50KWItPnBvcnQpIHwgRkVQTUVNLCAoaW50KWItPnBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCit7CisJb3V0Yl9wKGluYigoaW50KWItPnBvcnQpICYgfkZFUE1FTSwgKGludCliLT5wb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCW91dGJfcChGRVBNRU0sIChpbnQpY2gtPmJvYXJkLT5wb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJCW91dGJfcChGRVBNRU0sIChpbnQpY2gtPmJvYXJkLT5wb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJCW91dGJfcChGRVBNRU0sIChpbnQpY2gtPmJvYXJkLT5wb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwlvdXRiX3AoMCwgKGludCljaC0+Ym9hcmQtPnBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9hc3NlcnRnd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCWVwY2Fhc3NlcnQoaW5iKChpbnQpY2gtPmJvYXJkLT5wb3J0KSAmIEZFUE1FTSwgIkdsb2JhbCBtZW1vcnkgb2ZmIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX2Fzc2VydG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJZXBjYWFzc2VydCghKGluYigoaW50KWNoLT5ib2FyZC0+cG9ydCkgJiBGRVBNRU0pLCAiTWVtb3J5IG9uIik7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5vdCBhbGwgb2YgdGhlIGNhcmRzIG5lZWQgc3BlY2lmaWMgbWVtb3J5IHdpbmRvd2luZyByb3V0aW5lcy4gIFNvbWUKKwljYXJkcyAoU3VjaCBhcyBQQ0kpIG5lZWRzIG5vIHdpbmRvd2luZyByb3V0aW5lcyBhdCBhbGwuICBXZSBwcm92aWRlCisJdGhlc2UgZG8gbm90aGluZyByb3V0aW5lcyBzbyB0aGF0IHRoZSBzYW1lIGNvZGUgYmFzZSBjYW4gYmUgdXNlZC4KKwlUaGUgZHJpdmVyIHdpbGwgQUxXQVlTIGNhbGwgYSB3aW5kb3dpbmcgcm91dGluZSBpZiBpdCB0aGlua3MgaXQgbmVlZHMKKwl0bzsgcmVnYXJkbGVzcyBvZiB0aGUgY2FyZC4gIEhvd2V2ZXIsIGRlcGVuZGVudCBvbiB0aGUgY2FyZCB0aGUgcm91dGluZQorCW1heSBvciBtYXkgbm90IGRvIGFueXRoaW5nLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9hc3NlcnRnd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfYXNzZXJ0bWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gdmVyaWZ5Q2hhbm5lbCBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgY2hhbm5lbCAqdmVyaWZ5Q2hhbm5lbChyZWdpc3RlciBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAvKiBCZWdpbiB2ZXJpZnlDaGFubmVsICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGlzIHJvdXRpbmUgYmFzaWNhbGx5IHByb3ZpZGVzIGEgc2FuaXR5IGNoZWNrLiAgSXQgaW5zdXJlcyB0aGF0CisJCXRoZSBjaGFubmVsIHJldHVybmVkIGlzIHdpdGhpbiB0aGUgcHJvcGVyIHJhbmdlIG9mIGFkZHJlc3NlcyBhcworCQl3ZWxsIGFzIHByb3Blcmx5IGluaXRpYWxpemVkLiAgSWYgc29tZSBib2d1cyBpbmZvIGdldHMgcGFzc2VkIGluCisJCXRocm91Z2ggdHR5LT5kcml2ZXJfZGF0YSB0aGlzIHNob3VsZCBjYXRjaCBpdC4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICh0dHkpIAorCXsgLyogQmVnaW4gaWYgdHR5ICovCisKKwkJcmVnaXN0ZXIgc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopdHR5LT5kcml2ZXJfZGF0YTsKKworCQlpZiAoKGNoID49ICZkaWdpX2NoYW5uZWxzWzBdKSAmJiAoY2ggPCAmZGlnaV9jaGFubmVsc1tuYmRldnNdKSkgCisJCXsKKwkJCWlmIChjaC0+bWFnaWMgPT0gRVBDQV9NQUdJQykKKwkJCQlyZXR1cm4gY2g7CisJCX0KKworCX0gLyogRW5kIGlmIHR0eSAqLworCisJLyogRWxzZSByZXR1cm4gYSBOVUxMIGZvciBpbnZhbGlkICovCisJcmV0dXJuIE5VTEw7CisKK30gLyogRW5kIHZlcmlmeUNoYW5uZWwgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX3NjaGVkX2V2ZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjX3NjaGVkX2V2ZW50KHN0cnVjdCBjaGFubmVsICpjaCwgaW50IGV2ZW50KQoreyAvKiBCZWdpbiBwY19zY2hlZF9ldmVudCAqLworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVdlIGNhbGwgdGhpcyB0byBzY2hlZHVsZSBpbnRlcnJ1cHQgcHJvY2Vzc2luZyBvbiBzb21lIGV2ZW50LiAgVGhlIAorCQlrZXJuZWwgc2VlcyBvdXIgcmVxdWVzdCBhbmQgY2FsbHMgdGhlIHJlbGF0ZWQgcm91dGluZSBpbiBPVVIgZHJpdmVyLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJY2gtPmV2ZW50IHw9IDEgPDwgZXZlbnQ7CisJc2NoZWR1bGVfd29yaygmY2gtPnRxdWV1ZSk7CisKKworfSAvKiBFbmQgcGNfc2NoZWRfZXZlbnQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGVwY2FfZXJyb3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBlcGNhX2Vycm9yKGludCBsaW5lLCBjaGFyICptc2cpCit7IC8qIEJlZ2luIGVwY2FfZXJyb3IgKi8KKworCXByaW50ayhLRVJOX0VSUiAiZXBjYV9lcnJvciAoRGlnaSk6IGxpbmUgPSAlZCAlc1xuIixsaW5lLG1zZyk7CisJcmV0dXJuOworCit9IC8qIEVuZCBlcGNhX2Vycm9yICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19jbG9zZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCBwY19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreyAvKiBCZWdpbiBwY19jbG9zZSAqLworCisJc3RydWN0IGNoYW5uZWwgKmNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKKwkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKKwl7IC8qIEJlZ2luIGlmIGNoICE9IE5VTEwgKi8KKworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJY2xpKCk7CisKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIAorCQl7CisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgY2hhbm5lbCBpcyBvcGVuIG1vcmUgdGhhbiBvbmNlICovCisJCWlmIChjaC0+Y291bnQtLSA+IDEpIAorCQl7IC8qIEJlZ2luIGNoYW5uZWwgaXMgb3BlbiBtb3JlIHRoYW4gb25jZSAqLworCisJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJUmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuICBTb21lb25lIG1pZ2h0IHN0aWxsIGJlIHVzaW5nCisJCQkJdGhlIGNoYW5uZWwuCisJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJcmV0dXJuOworCQl9IC8qIEVuZCBjaGFubmVsIGlzIG9wZW4gbW9yZSB0aGFuIG9uY2UgKi8KKworCQkvKiBQb3J0IG9wZW4gb25seSBvbmNlIGdvIGFoZWFkIHdpdGggc2h1dGRvd24gJiByZXNldCAqLworCisJCWlmIChjaC0+Y291bnQgPCAwKSAKKwkJeworCQkJY2gtPmNvdW50ID0gMDsKKwkJfQorCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJTGV0IHRoZSByZXN0IG9mIHRoZSBkcml2ZXIga25vdyB0aGUgY2hhbm5lbCBpcyBiZWluZyBjbG9zZWQuCisJCQlUaGlzIGJlY29tZXMgaW1wb3J0YW50IGlmIGFuIG9wZW4gaXMgYXR0ZW1wdGVkIGJlZm9yZSBjbG9zZSAKKwkJCWlzIGZpbmlzaGVkLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19DTE9TSU5HOworCQorCQl0dHktPmNsb3NpbmcgPSAxOworCisJCWlmIChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSAKKwkJeworCQkJLyogU2V0dXAgYW4gZXZlbnQgdG8gaW5kaWNhdGUgd2hlbiB0aGUgdHJhbnNtaXQgYnVmZmVyIGVtcHRpZXMgKi8KKwkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSwgY2gpOwkJCisJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMzAwMCk7IC8qIDMwIHNlY29uZHMgdGltZW91dCAqLworCQl9CisJCisJCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCisJCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCQlzaHV0ZG93bihjaCk7CisJCXR0eS0+Y2xvc2luZyA9IDA7CisJCWNoLT5ldmVudCA9IDA7CisJCWNoLT50dHkgPSBOVUxMOworCisJCWlmIChjaC0+YmxvY2tlZF9vcGVuKSAKKwkJeyAvKiBCZWdpbiBpZiBibG9ja2VkX29wZW4gKi8KKworCQkJaWYgKGNoLT5jbG9zZV9kZWxheSkgCisJCQl7CisJCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaC0+Y2xvc2VfZGVsYXkpKTsKKwkJCX0KKworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKKworCQl9IC8qIEVuZCBpZiBibG9ja2VkX29wZW4gKi8KKworCQljaC0+YXN5bmNmbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkUgfCBBU1lOQ19JTklUSUFMSVpFRCB8IAorCQkgICAgICAgICAgICAgICAgICAgICAgQVNZTkNfQ0xPU0lORyk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNsb3NlX3dhaXQpOworCisKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwl9IC8qIEVuZCBpZiBjaCAhPSBOVUxMICovCisKK30gLyogRW5kIHBjX2Nsb3NlICovIAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gc2h1dGRvd24gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgc2h1dGRvd24oc3RydWN0IGNoYW5uZWwgKmNoKQoreyAvKiBCZWdpbiBzaHV0ZG93biAqLworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKworCWlmICghKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSAKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJZ2xvYmFsd2lub24oY2gpOworCisJYmMgPSBjaC0+YnJkY2hhbjsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlJbiBvcmRlciBmb3IgYW4gZXZlbnQgdG8gYmUgZ2VuZXJhdGVkIG9uIHRoZSByZWNlaXB0IG9mIGRhdGEgdGhlCisJCWlkYXRhIGZsYWcgbXVzdCBiZSBzZXQuIFNpbmNlIHdlIGFyZSBzaHV0dGluZyBkb3duLCB0aGlzIGlzIG5vdCAKKwkJbmVjZXNzYXJ5IGNsZWFyIHRoaXMgZmxhZy4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCisKKwlpZiAoYmMpCisJCWJjLT5pZGF0YSA9IDA7CisKKwl0dHkgPSBjaC0+dHR5OworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgIElmIHdlJ3JlIGEgbW9kZW0gY29udHJvbCBkZXZpY2UgYW5kIEhVUENMIGlzIG9uLCBkcm9wIFJUUyAmIERUUi4KKyAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpIAorCXsKKwkJY2gtPm9tb2RlbSAmPSB+KGNoLT5tX3J0cyB8IGNoLT5tX2R0cik7CisJCWZlcGNtZChjaCwgU0VUTU9ERU0sIDAsIGNoLT5tX2R0ciB8IGNoLT5tX3J0cywgMTAsIDEpOworCX0KKworCW1lbW9mZihjaCk7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJVGhlIGNoYW5uZWwgaGFzIG9mZmljaWFseSBiZWVuIGNsb3NlZC4gIFRoZSBuZXh0IHRpbWUgaXQgaXMgb3BlbmVkCisJCWl0IHdpbGwgaGF2ZSB0byByZWluaXRpYWxpemVkLiAgU2V0IGEgZmxhZyB0byBpbmRpY2F0ZSB0aGlzLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIFByZXZlbnQgZnV0dXJlIERpZ2kgcHJvZ3JhbW1lZCBpbnRlcnJ1cHRzIGZyb20gY29taW5nIGFjdGl2ZSAqLworCisJY2gtPmFzeW5jZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCit9IC8qIEVuZCBzaHV0ZG93biAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfaGFuZ3VwICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHBjX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAvKiBCZWdpbiBwY19oYW5ndXAgKi8KKworCXN0cnVjdCBjaGFubmVsICpjaDsKKwkKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKKwkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKKwl7IC8qIEJlZ2luIGlmIGNoICE9IE5VTEwgKi8KKworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKwkJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCQlzaHV0ZG93bihjaCk7CisKKwkJY2gtPnR0eSAgID0gTlVMTDsKKwkJY2gtPmV2ZW50ID0gMDsKKwkJY2gtPmNvdW50ID0gMDsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCWNoLT5hc3luY2ZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRSB8IEFTWU5DX0lOSVRJQUxJWkVEKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKKworCX0gLyogRW5kIGlmIGNoICE9IE5VTEwgKi8KKworfSAvKiBFbmQgcGNfaGFuZ3VwICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY193cml0ZSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHBjX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBieXRlc0F2YWlsYWJsZSkKK3sgLyogQmVnaW4gcGNfd3JpdGUgKi8KKworCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBoZWFkLCB0YWlsOworCXJlZ2lzdGVyIGludCBkYXRhTGVuOworCXJlZ2lzdGVyIGludCBzaXplOworCXJlZ2lzdGVyIGludCBhbW91bnRDb3BpZWQ7CisKKworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZW1haW47CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXBjX3dyaXRlIGlzIHByaW1hcmlseSBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlIGtlcm5lbCByb3V0aW5lCisJCXR0eV93cml0ZSAoVGhvdWdoIGl0IGNhbiBhbHNvIGJlIGNhbGxlZCBieSBwdXRfY2hhcikgZm91bmQgaW4KKwkJdHR5X2lvLmMuICBwY193cml0ZSBpcyBwYXNzZWQgYSBsaW5lIGRpc2NpcGxpbmUgYnVmZmVyIHdoZXJlIAorCQl0aGUgZGF0YSB0byBiZSB3cml0dGVuIG91dCBpcyBzdG9yZWQuICBUaGUgbGluZSBkaXNjaXBsaW5lIAorCQlpbXBsZW1lbnRhdGlvbiBpdHNlbGYgaXMgZG9uZSBhdCB0aGUga2VybmVsIGxldmVsIGFuZCBpcyBub3QgCisJCWJyb3VnaHQgaW50byB0aGUgZHJpdmVyLiAgCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CisJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBNYWtlIGEgcG9pbnRlciB0byB0aGUgY2hhbm5lbCBkYXRhIHN0cnVjdHVyZSBmb3VuZCBvbiB0aGUgYm9hcmQuICovCisKKwliYyAgID0gY2gtPmJyZGNoYW47CisJc2l6ZSA9IGNoLT50eGJ1ZnNpemU7CisKKwlhbW91bnRDb3BpZWQgPSAwOworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisJZ2xvYmFsd2lub24oY2gpOworCisJaGVhZCA9IGJjLT50aW4gJiAoc2l6ZSAtIDEpOworCXRhaWwgPSBiYy0+dG91dDsKKworCWlmICh0YWlsICE9IGJjLT50b3V0KQorCQl0YWlsID0gYmMtPnRvdXQ7CisJdGFpbCAmPSAoc2l6ZSAtIDEpOworCisJLyoJSWYgaGVhZCA+PSB0YWlsLCBoZWFkIGhhcyBub3Qgd3JhcHBlZCBhcm91bmQuICovIAorCWlmIChoZWFkID49IHRhaWwpIAorCXsgLyogQmVnaW4gaGVhZCBoYXMgbm90IHdyYXBwZWQgKi8KKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCXJlbWFpbiAobXVjaCBsaWtlIGRhdGFMZW4gYWJvdmUpIHJlcHJlc2VudHMgdGhlIHRvdGFsIGFtb3VudCBvZgorCQkJc3BhY2UgYXZhaWxhYmxlIG9uIHRoZSBjYXJkIGZvciBkYXRhLiAgSGVyZSBkYXRhTGVuIHJlcHJlc2VudHMKKwkJCXRoZSBzcGFjZSBleGlzdGluZyBiZXR3ZWVuIHRoZSBoZWFkIHBvaW50ZXIgYW5kIHRoZSBlbmQgb2YgCisJCQlidWZmZXIuICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGEgbWVtY3B5IGNhbm5vdCBiZSB0b2xkIHRvCisJCQlhdXRvbWF0aWNhbGx5IHdyYXAgYXJvdW5kIHdoZW4gaXQgaGl0cyB0aGUgYnVmZmVyIGVuZC4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovIAorCisJCWRhdGFMZW4gPSBzaXplIC0gaGVhZDsKKwkJcmVtYWluID0gc2l6ZSAtIChoZWFkIC0gdGFpbCkgLSAxOworCisJfSAvKiBFbmQgaGVhZCBoYXMgbm90IHdyYXBwZWQgKi8KKwllbHNlIAorCXsgLyogQmVnaW4gaGVhZCBoYXMgd3JhcHBlZCBhcm91bmQgKi8KKworCQlyZW1haW4gPSB0YWlsIC0gaGVhZCAtIDE7CisJCWRhdGFMZW4gPSByZW1haW47CisKKwl9IC8qIEVuZCBoZWFkIGhhcyB3cmFwcGVkIGFyb3VuZCAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJQ2hlY2sgdGhlIHNwYWNlIG9uIHRoZSBjYXJkLiAgSWYgd2UgaGF2ZSBtb3JlIGRhdGEgdGhhbiAKKwkJCXNwYWNlOyByZWR1Y2UgdGhlIGFtb3VudCBvZiBkYXRhIHRvIGZpdCB0aGUgc3BhY2UuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJYnl0ZXNBdmFpbGFibGUgPSBtaW4ocmVtYWluLCBieXRlc0F2YWlsYWJsZSk7CisKKwl0eHdpbm9uKGNoKTsKKwl3aGlsZSAoYnl0ZXNBdmFpbGFibGUgPiAwKSAKKwl7IC8qIEJlZ2luIHdoaWxlIHRoZXJlIGlzIGRhdGEgdG8gY29weSBvbnRvIGNhcmQgKi8KKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSWYgaGVhZCBpcyBub3Qgd3JhcHBlZCwgdGhlIGJlbG93IHdpbGwgbWFrZSBzdXJlIHRoZSBmaXJzdCAKKwkJCWRhdGEgY29weSBmaWxscyB0byB0aGUgZW5kIG9mIGNhcmQgYnVmZmVyLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJZGF0YUxlbiA9IG1pbihieXRlc0F2YWlsYWJsZSwgZGF0YUxlbik7CisJCW1lbWNweShjaC0+dHhwdHIgKyBoZWFkLCBidWYsIGRhdGFMZW4pOworCQlidWYgKz0gZGF0YUxlbjsKKwkJaGVhZCArPSBkYXRhTGVuOworCQlhbW91bnRDb3BpZWQgKz0gZGF0YUxlbjsKKwkJYnl0ZXNBdmFpbGFibGUgLT0gZGF0YUxlbjsKKworCQlpZiAoaGVhZCA+PSBzaXplKSAKKwkJeworCQkJaGVhZCA9IDA7CisJCQlkYXRhTGVuID0gdGFpbDsKKwkJfQorCisJfSAvKiBFbmQgd2hpbGUgdGhlcmUgaXMgZGF0YSB0byBjb3B5IG9udG8gY2FyZCAqLworCisJY2gtPnN0YXR1c2ZsYWdzIHw9IFRYQlVTWTsKKwlnbG9iYWx3aW5vbihjaCk7CisJYmMtPnRpbiA9IGhlYWQ7CisKKwlpZiAoKGNoLT5zdGF0dXNmbGFncyAmIExPV1dBSVQpID09IDApIAorCXsKKwkJY2gtPnN0YXR1c2ZsYWdzIHw9IExPV1dBSVQ7CisJCWJjLT5pbG93ID0gMTsKKwl9CisJbWVtb2ZmKGNoKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybihhbW91bnRDb3BpZWQpOworCit9IC8qIEVuZCBwY193cml0ZSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfcHV0X2NoYXIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcGNfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjKQoreyAvKiBCZWdpbiBwY19wdXRfY2hhciAqLworCisgICAKKwlwY193cml0ZSh0dHksICZjLCAxKTsKKwlyZXR1cm47CisKK30gLyogRW5kIHBjX3B1dF9jaGFyICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY193cml0ZV9yb29tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgcGNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAvKiBCZWdpbiBwY193cml0ZV9yb29tICovCisKKwlpbnQgcmVtYWluOworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBoZWFkLCB0YWlsOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKworCXJlbWFpbiA9IDA7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKKwkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKKwl7CisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKwkJZ2xvYmFsd2lub24oY2gpOworCisJCWJjICAgPSBjaC0+YnJkY2hhbjsKKwkJaGVhZCA9IGJjLT50aW4gJiAoY2gtPnR4YnVmc2l6ZSAtIDEpOworCQl0YWlsID0gYmMtPnRvdXQ7CisKKwkJaWYgKHRhaWwgIT0gYmMtPnRvdXQpCisJCQl0YWlsID0gYmMtPnRvdXQ7CisJCS8qIFdyYXAgdGFpbCBpZiBuZWNlc3NhcnkgKi8KKwkJdGFpbCAmPSAoY2gtPnR4YnVmc2l6ZSAtIDEpOworCisJCWlmICgocmVtYWluID0gdGFpbCAtIGhlYWQgLSAxKSA8IDAgKQorCQkJcmVtYWluICs9IGNoLT50eGJ1ZnNpemU7CisKKwkJaWYgKHJlbWFpbiAmJiAoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgPT0gMCkgCisJCXsKKwkJCWNoLT5zdGF0dXNmbGFncyB8PSBMT1dXQUlUOworCQkJYmMtPmlsb3cgPSAxOworCQl9CisJCW1lbW9mZihjaCk7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCX0KKworCS8qIFJldHVybiBob3cgbXVjaCByb29tIGlzIGxlZnQgb24gY2FyZCAqLworCXJldHVybiByZW1haW47CisKK30gLyogRW5kIHBjX3dyaXRlX3Jvb20gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX2NoYXJzX2luX2J1ZmZlciAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHBjX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAvKiBCZWdpbiBwY19jaGFyc19pbl9idWZmZXIgKi8KKworCWludCBjaGFyczsKKwl1bnNpZ25lZCBpbnQgY3RhaWwsIGhlYWQsIHRhaWw7CisJaW50IHJlbWFpbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAorCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpID09IE5VTEwpCisJCXJldHVybigwKTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWdsb2JhbHdpbm9uKGNoKTsKKworCWJjID0gY2gtPmJyZGNoYW47CisJdGFpbCA9IGJjLT50b3V0OworCWhlYWQgPSBiYy0+dGluOworCWN0YWlsID0gY2gtPm1haWxib3gtPmNvdXQ7CisKKwlpZiAodGFpbCA9PSBoZWFkICYmIGNoLT5tYWlsYm94LT5jaW4gPT0gY3RhaWwgJiYgYmMtPnRidXN5ID09IDApCisJCWNoYXJzID0gMDsKKwllbHNlIAorCXsgLyogQmVnaW4gaWYgc29tZSBzcGFjZSBvbiB0aGUgY2FyZCBoYXMgYmVlbiB1c2VkICovCisKKwkJaGVhZCA9IGJjLT50aW4gJiAoY2gtPnR4YnVmc2l6ZSAtIDEpOworCQl0YWlsICY9IChjaC0+dHhidWZzaXplIC0gMSk7CisKKwkJLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlUaGUgbG9naWMgaGVyZSBpcyBiYXNpY2FsbHkgb3Bwb3NpdGUgb2YgdGhlIGFib3ZlIHBjX3dyaXRlX3Jvb20KKwkJCWhlcmUgd2UgYXJlIGZpbmRpbmcgdGhlIGFtb3VudCBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIGZpbGxlZC4KKwkJCU5vdCB0aGUgYW1vdW50IG9mIGJ5dGVzIGVtcHR5LgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJaWYgKChyZW1haW4gPSB0YWlsIC0gaGVhZCAtIDEpIDwgMCApCisJCQlyZW1haW4gKz0gY2gtPnR4YnVmc2l6ZTsKKworCQljaGFycyA9IChpbnQpKGNoLT50eGJ1ZnNpemUgLSByZW1haW4pOworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorCQkJTWFrZSBpdCBwb3NzaWJsZSB0byB3YWtldXAgYW55dGhpbmcgd2FpdGluZyBmb3Igb3V0cHV0CisJCQlpbiB0dHlfaW9jdGwuYywgZXRjLgorCisJCQlJZiBub3QgYWxyZWFkeSBzZXQuICBTZXR1cCBhbiBldmVudCB0byBpbmRpY2F0ZSB3aGVuIHRoZQorCQkJdHJhbnNtaXQgYnVmZmVyIGVtcHRpZXMgCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJaWYgKCEoY2gtPnN0YXR1c2ZsYWdzICYgRU1QVFlXQUlUKSkKKwkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSxjaCk7CisKKwl9IC8qIEVuZCBpZiBzb21lIHNwYWNlIG9uIHRoZSBjYXJkIGhhcyBiZWVuIHVzZWQgKi8KKworCW1lbW9mZihjaCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwkvKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVzaWRpbmcgb24gY2FyZC4gKi8KKwlyZXR1cm4oY2hhcnMpOworCit9IC8qIEVuZCBwY19jaGFyc19pbl9idWZmZXIgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX2ZsdXNoX2J1ZmZlciAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwY19mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sgLyogQmVnaW4gcGNfZmx1c2hfYnVmZmVyICovCisKKwl1bnNpZ25lZCBpbnQgdGFpbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAorCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpID09IE5VTEwpCisJCXJldHVybjsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisJZ2xvYmFsd2lub24oY2gpOworCisJYmMgICA9IGNoLT5icmRjaGFuOworCXRhaWwgPSBiYy0+dG91dDsKKworCS8qIEhhdmUgRkVQIG1vdmUgdG91dCBwb2ludGVyOyBlZmZlY3RpdmVseSBmbHVzaGluZyB0cmFuc21pdCBidWZmZXIgKi8KKworCWZlcGNtZChjaCwgU1RPVVQsICh1bnNpZ25lZCkgdGFpbCwgMCwgMCwgMCk7CisKKwltZW1vZmYoY2gpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCXR0eV93YWtldXAodHR5KTsKKworfSAvKiBFbmQgcGNfZmx1c2hfYnVmZmVyICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19mbHVzaF9jaGFycyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwY19mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAvKiBCZWdpbiBwY19mbHVzaF9jaGFycyAqLworCisJc3RydWN0IGNoYW5uZWwgKiBjaDsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAorCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAorCXsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJY2xpKCk7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSWYgbm90IGFscmVhZHkgc2V0IGFuZCB0aGUgdHJhbnNtaXR0ZXIgaXMgYnVzeSBzZXR1cCBhbiBldmVudAorCQkJdG8gaW5kaWNhdGUgd2hlbiB0aGUgdHJhbnNtaXQgZW1wdGllcy4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWlmICgoY2gtPnN0YXR1c2ZsYWdzICYgVFhCVVNZKSAmJiAhKGNoLT5zdGF0dXNmbGFncyAmIEVNUFRZV0FJVCkpCisJCQlzZXR1cF9lbXB0eV9ldmVudCh0dHksY2gpOworCisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCX0KKworfSAvKiBFbmQgcGNfZmx1c2hfY2hhcnMgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGJsb2NrX3RpbF9yZWFkeSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7IC8qIEJlZ2luIGJsb2NrX3RpbF9yZWFkeSAqLworCisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCxjdXJyZW50KTsKKwlpbnQJcmV0dmFsLCBkb19jbG9jYWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQorCXsKKwkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCWVsc2UKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsJCisJCXJldHVybihyZXR2YWwpOworCX0KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCQlJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCisJCXVudGlsIGl0J3MgZG9uZSwgYW5kIHRoZW4gdHJ5IGFnYWluLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfQ0xPU0lORykgCisJeworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZjaC0+Y2xvc2Vfd2FpdCk7CisKKwkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCXJldHVybiAtRUFHQUlOOworCQllbHNlCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKworCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgCisJeworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKwkgIAkgSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250CisJICAJIGFuZCB0aGVuIGV4aXQuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKworCQlyZXR1cm4gMDsKKwl9CisKKworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCisJCWRvX2Nsb2NhbCA9IDE7CisJCisgICAvKiBCbG9jayB3YWl0aW5nIGZvciB0aGUgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZSBmcmVlICovCisJCisJcmV0dmFsID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmY2gtPm9wZW5fd2FpdCwgJndhaXQpOworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisKKwkvKiBXZSBkZWMgY291bnQgc28gdGhhdCBwY19jbG9zZSB3aWxsIGtub3cgd2hlbiB0byBmcmVlIHRoaW5ncyAqLworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJY2gtPmNvdW50LS07CisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCWNoLT5ibG9ja2VkX29wZW4rKzsKKworCXdoaWxlKDEpIAorCXsgLyogQmVnaW4gZm9yZXZlciB3aGlsZSAgKi8KKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CisJCSAgICAhKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSAKKwkJeworCQkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZWxzZQorCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsJCisJCQlicmVhazsKKwkJfQorCisJCWlmICghKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYgCisJCQkgIChkb19jbG9jYWwgfHwgKGNoLT5pbW9kZW0gJiBjaC0+ZGNkKSkpCisJCQlicmVhazsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIAorCQl7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJQWxsb3cgc29tZW9uZSBlbHNlIHRvIGJlIHNjaGVkdWxlZC4gIFdlIHdpbGwgb2NjYXNpb25hbGx5IGdvCisJCQl0aHJvdWdoIHRoaXMgbG9vcCB1bnRpbCBvbmUgb2YgdGhlIGFib3ZlIGNvbmRpdGlvbnMgY2hhbmdlLgorCQkJVGhlIGJlbG93IHNjaGVkdWxlIGNhbGwgd2lsbCBhbGxvdyBvdGhlciBwcm9jZXNzZXMgdG8gZW50ZXIgYW5kCisJCQlwcmV2ZW50IHRoaXMgbG9vcCBmcm9tIGhvZ2dpbmcgdGhlIGNwdS4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJCXNjaGVkdWxlKCk7CisKKwl9IC8qIEVuZCBmb3JldmVyIHdoaWxlICAqLworCisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmNoLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwljbGkoKTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCisJCWNoLT5jb3VudCsrOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJY2gtPmJsb2NrZWRfb3Blbi0tOworCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWNoLT5hc3luY2ZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisKKwlyZXR1cm4gMDsKKworfSAvKiBFbmQgYmxvY2tfdGlsX3JlYWR5ICovCQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfb3BlbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHBjX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreyAvKiBCZWdpbiBwY19vcGVuICovCisKKwlzdHJ1Y3QgY2hhbm5lbCAqY2g7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbGluZSwgcmV0dmFsLCBib2FyZG51bTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGhlYWQ7CisKKwlsaW5lID0gdHR5LT5pbmRleDsKKwlpZiAobGluZSA8IDAgfHwgbGluZSA+PSBuYmRldnMpIAorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbiA6IGxpbmUgb3V0IG9mIHJhbmdlIGluIHBjX29wZW5cbiIpOworCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKKwkJcmV0dXJuKC1FTk9ERVYpOworCX0KKworCisJY2ggPSAmZGlnaV9jaGFubmVsc1tsaW5lXTsKKwlib2FyZG51bSA9IGNoLT5ib2FyZG51bTsKKworCS8qIENoZWNrIHN0YXR1cyBvZiBib2FyZCBjb25maWd1cmVkIGluIHN5c3RlbS4gICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlJIGNoZWNrIHRvIHNlZSBpZiB0aGUgZXBjYV9zZXR1cCByb3V0aW5lIGRldGVjdGVkIGFuIHVzZXIgZXJyb3IuICAKKwkJSXQgbWlnaHQgYmUgYmV0dGVyIHRvIHB1dCB0aGlzIGluIHBjX2luaXQsIGJ1dCBmb3IgdGhlIG1vbWVudCBpdAorCQlnb2VzIGhlcmUuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKGludmFsaWRfbGlsb19jb25maWcpCisJeworCQlpZiAoc2V0dXBfZXJyb3JfY29kZSAmIElOVkFMSURfQk9BUkRfVFlQRSkKKwkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIHBjX29wZW46IEludmFsaWQgYm9hcmQgdHlwZSBzcGVjaWZpZWQgaW4gTElMTyBjb21tYW5kXG4iKTsKKworCQlpZiAoc2V0dXBfZXJyb3JfY29kZSAmIElOVkFMSURfTlVNX1BPUlRTKQorCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbjogSW52YWxpZCBudW1iZXIgb2YgcG9ydHMgc3BlY2lmaWVkIGluIExJTE8gY29tbWFuZFxuIik7CisKKwkJaWYgKHNldHVwX2Vycm9yX2NvZGUgJiBJTlZBTElEX01FTV9CQVNFKQorCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbjogSW52YWxpZCBib2FyZCBtZW1vcnkgYWRkcmVzcyBzcGVjaWZpZWQgaW4gTElMTyBjb21tYW5kXG4iKTsKKworCQlpZiAoc2V0dXBfZXJyb3JfY29kZSAmIElOVkFMSURfUE9SVF9CQVNFKQorCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbjogSW52YWxpZCBib2FyZCBwb3J0IGFkZHJlc3Mgc3BlY2lmaWVkIGluIExJTE8gY29tbWFuZFxuIik7CisKKwkJaWYgKHNldHVwX2Vycm9yX2NvZGUgJiBJTlZBTElEX0JPQVJEX1NUQVRVUykKKwkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIHBjX29wZW46IEludmFsaWQgYm9hcmQgc3RhdHVzIHNwZWNpZmllZCBpbiBMSUxPIGNvbW1hbmRcbiIpOworCisJCWlmIChzZXR1cF9lcnJvcl9jb2RlICYgSU5WQUxJRF9BTFRQSU4pCisJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBwY19vcGVuOiBJbnZhbGlkIGJvYXJkIGFsdHBpbiBzcGVjaWZpZWQgaW4gTElMTyBjb21tYW5kXG4iKTsKKworCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsgICAvKiBNYXJrIHRoaXMgZGV2aWNlIGFzICdkb3duJyAqLworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisJaWYgKChib2FyZG51bSA+PSBudW1fY2FyZHMpIHx8IChib2FyZHNbYm9hcmRudW1dLnN0YXR1cyA9PSBESVNBQkxFRCkpIAorCXsKKwkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7ICAgLyogTWFyayB0aGlzIGRldmljZSBhcyAnZG93bicgKi8KKwkJcmV0dXJuKC1FTk9ERVYpOworCX0KKwkKKwlpZiAoKCBiYyA9IGNoLT5icmRjaGFuKSA9PSAwKSAKKwl7CisJCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCUV2ZXJ5IHRpbWUgYSBjaGFubmVsIGlzIG9wZW5lZCwgaW5jcmVtZW50IGEgY291bnRlci4gIFRoaXMgaXMgCisJCW5lY2Vzc2FyeSBiZWNhdXNlIHdlIGRvIG5vdCB3aXNoIHRvIGZsdXNoIGFuZCBzaHV0ZG93biB0aGUgY2hhbm5lbAorCQl1bnRpbCB0aGUgbGFzdCBhcHAgaG9sZGluZyB0aGUgY2hhbm5lbCBvcGVuLCBjbG9zZXMgaXQuCSAJCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwljaC0+Y291bnQrKzsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJU2V0IGEga2VybmVsIHN0cnVjdHVyZXMgcG9pbnRlciB0byBvdXIgbG9jYWwgY2hhbm5lbCAKKwkJc3RydWN0dXJlLiAgVGhpcyB3YXkgd2UgY2FuIGdldCB0byBpdCB3aGVuIHBhc3NlZCBvbmx5CisJCWEgdHR5IHN0cnVjdC4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCXR0eS0+ZHJpdmVyX2RhdGEgPSBjaDsKKwkKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCUlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIGNoYW5uZWwgaGFzIGJlZW4gb3BlbmVkLCBpbml0aWFsaXplCisJCXRoZSB0dHktPnRlcm1pb3Mgc3RydWN0IG90aGVyd2lzZSBsZXQgcGNfY2xvc2UgaGFuZGxlIGl0LgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworCWdsb2JhbHdpbm9uKGNoKTsKKwljaC0+c3RhdHVzZmxhZ3MgPSAwOworCisJLyogU2F2ZSBib2FyZHMgY3VycmVudCBtb2RlbSBzdGF0dXMgKi8KKwljaC0+aW1vZGVtID0gYmMtPm1zdGF0OworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgIFNldCByZWNlaXZlIGhlYWQgYW5kIHRhaWwgcHRycyB0byBlYWNoIG90aGVyLiAgVGhpcyBpbmRpY2F0ZXMKKwkgICBubyBkYXRhIGF2YWlsYWJsZSB0byByZWFkLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJaGVhZCA9IGJjLT5yaW47CisJYmMtPnJvdXQgPSBoZWFkOworCisJLyogU2V0IHRoZSBjaGFubmVscyBhc3NvY2lhdGVkIHR0eSBzdHJ1Y3R1cmUgKi8KKwljaC0+dHR5ID0gdHR5OworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJVGhlIGJlbG93IHJvdXRpbmUgZ2VuZXJhbGx5IHNldHMgdXAgcGFyaXR5LCBiYXVkLCBmbG93IGNvbnRyb2wgCisJCWlzc3VlcywgZXRjLi4uLiBJdCBlZmZlY3QgYm90aCBjb250cm9sIGZsYWdzIGFuZCBpbnB1dCBmbGFncy4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWVwY2FwYXJhbSh0dHksY2gpOworCisJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CisJbWVtb2ZmKGNoKTsKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dmFsID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgY2gpOworCWlmIChyZXR2YWwpCisJeworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJU2V0IHRoaXMgYWdhaW4gaW4gY2FzZSBhIGhhbmd1cCBzZXQgaXQgdG8gemVybyB3aGlsZSB0aGlzIAorCQlvcGVuKCkgd2FzIHdhaXRpbmcgZm9yIHRoZSBsaW5lLi4uCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJY2gtPnR0eSA9IHR0eTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWdsb2JhbHdpbm9uKGNoKTsKKworCS8qIEVuYWJsZSBEaWdpIERhdGEgZXZlbnRzICovCisJYmMtPmlkYXRhID0gMTsKKworCW1lbW9mZihjaCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlyZXR1cm4gMDsKKworfSAvKiBFbmQgcGNfb3BlbiAqLworCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBlcGNhX21vZHVsZV9pbml0KHZvaWQpCit7IC8qIEJlZ2luIGluaXRfbW9kdWxlICovCisKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKwlwY19pbml0KCk7CisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybigwKTsKK30KKworbW9kdWxlX2luaXQoZXBjYV9tb2R1bGVfaW5pdCk7CisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9QQ0kKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlcGNhX2RyaXZlcjsKKyNlbmRpZgorCisjaWZkZWYgTU9EVUxFCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBjbGVhbnVwX21vZHVsZSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgZXBjYV9tb2R1bGVfZXhpdCh2b2lkKQoreworCisJaW50ICAgICAgICAgICAgICAgY291bnQsIGNyZDsKKwlzdHJ1Y3QgYm9hcmRfaW5mbyAqYmQ7CisJc3RydWN0IGNoYW5uZWwgICAgKmNoOworCXVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOworCisJZGVsX3RpbWVyX3N5bmMoJmVwY2FfdGltZXIpOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKwlpZiAoKHR0eV91bnJlZ2lzdGVyX2RyaXZlcihwY19kcml2ZXIpKSB8fCAgCisJICAgICh0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocGNfaW5mbykpKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiPEVycm9yPiAtIERJR0kgOiBjbGVhbnVwX21vZHVsZSBmYWlsZWQgdG8gdW4tcmVnaXN0ZXIgdHR5IGRyaXZlclxuIik7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXB1dF90dHlfZHJpdmVyKHBjX2RyaXZlcik7CisJcHV0X3R0eV9kcml2ZXIocGNfaW5mbyk7CisKKwlmb3IgKGNyZCA9IDA7IGNyZCA8IG51bV9jYXJkczsgY3JkKyspIAorCXsgLyogQmVnaW4gZm9yIGVhY2ggY2FyZCAqLworCisJCWJkID0gJmJvYXJkc1tjcmRdOworCisJCWlmICghYmQpCisJCXsgLyogQmVnaW4gc2FuaXR5IGNoZWNrICovCisJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBEaWdpIDogY2xlYW51cF9tb2R1bGUgZmFpbGVkXG4iKTsKKwkJCXJldHVybjsKKwkJfSAvKiBFbmQgc2FuaXR5IGNoZWNrICovCisKKwkJY2ggPSBjYXJkX3B0cltjcmRdOyAKKworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBiZC0+bnVtcG9ydHM7IGNvdW50KyssIGNoKyspIAorCQl7IC8qIEJlZ2luIGZvciBlYWNoIHBvcnQgKi8KKworCQkJaWYgKGNoKSAKKwkJCXsKKwkJCQlpZiAoY2gtPnR0eSkKKwkJCQkJdHR5X2hhbmd1cChjaC0+dHR5KTsKKwkJCQlrZnJlZShjaC0+dG1wX2J1Zik7CisJCQl9CisKKwkJfSAvKiBFbmQgZm9yIGVhY2ggcG9ydCAqLworCX0gLyogRW5kIGZvciBlYWNoIGNhcmQgKi8KKworI2lmZGVmIEVOQUJMRV9QQ0kKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZlcGNhX2RyaXZlcik7CisjZW5kaWYKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCit9Cittb2R1bGVfZXhpdChlcGNhX21vZHVsZV9leGl0KTsKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBwY19vcHMgPSB7CisJLm9wZW4gPSBwY19vcGVuLAorCS5jbG9zZSA9IHBjX2Nsb3NlLAorCS53cml0ZSA9IHBjX3dyaXRlLAorCS53cml0ZV9yb29tID0gcGNfd3JpdGVfcm9vbSwKKwkuZmx1c2hfYnVmZmVyID0gcGNfZmx1c2hfYnVmZmVyLAorCS5jaGFyc19pbl9idWZmZXIgPSBwY19jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2NoYXJzID0gcGNfZmx1c2hfY2hhcnMsCisJLnB1dF9jaGFyID0gcGNfcHV0X2NoYXIsCisJLmlvY3RsID0gcGNfaW9jdGwsCisJLnNldF90ZXJtaW9zID0gcGNfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSBwY19zdG9wLAorCS5zdGFydCA9IHBjX3N0YXJ0LAorCS50aHJvdHRsZSA9IHBjX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gcGNfdW50aHJvdHRsZSwKKwkuaGFuZ3VwID0gcGNfaGFuZ3VwLAorfTsKKworc3RhdGljIGludCBpbmZvX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIGluZm9fb3BzID0geworCS5vcGVuID0gaW5mb19vcGVuLAorCS5pb2N0bCA9IGluZm9faW9jdGwsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfaW5pdCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgX19pbml0IHBjX2luaXQodm9pZCkKK3sgLyogQmVnaW4gcGNfaW5pdCAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlwY19pbml0IGlzIGNhbGxlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBkdXJpbmcgYm9vdCB1cCBwcmlvciB0bworCQlhbnkgb3BlbiBjYWxscyBiZWluZyBtYWRlLiAgSW4gdGhlIG9sZGVyIHZlcnNpb25zIG9mIExpbnV4IChQcmlvcgorCQl0byAyLjAuMCkgYW4gZW50cnkgaXMgbWFkZSBpbnRvIHR0eV9pby5jLiAgQSBwb2ludGVyIHRvIHRoZSBsYXN0CisJCW1lbW9yeSBsb2NhdGlvbiAoZnJvbSBrZXJuZWwgc3BhY2UpIHVzZWQgKGttZW1fc3RhcnQpIGlzIHBhc3NlZAorCQl0byBwY19pbml0LiAgSXQgaXMgcGNfaW5pdHMgcmVzcG9uc2liaWxpdHkgdG8gbW9kaWZ5IHRoaXMgdmFsdWUgCisJCWZvciBhbnkgbWVtb3J5IHRoYXQgdGhlIERpZ2kgZHJpdmVyIG1pZ2h0IG5lZWQgYW5kIHRoZW4gcmV0dXJuCisJCXRoaXMgdmFsdWUgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBGb3IgZXhhbXBsZSBpZiB0aGUgZHJpdmVyCisJCXdpc2hlcyB0byBhbGxvY2F0ZSAxSyBvZiBrZXJuZWwgbWVtb3J5LCBwY19pbml0IHdvdWxkIHJldHVybiAKKwkJKGttZW1fc3RhcnQgKyAxMDI0KS4gIFRoaXMgbWVtb3J5IChCZXR3ZWVuIGttZW1fc3RhcnQgYW5kIGttZW1fc3RhcnQKKwkJKyAxMDI0KSB3b3VsZCB0aGVuIGJlIGF2YWlsYWJsZSBmb3IgdXNlIGV4Y2x1c2l2ZWx5IGJ5IHRoZSBkcml2ZXIuICAKKwkJSW4gdGhpcyBjYXNlIG91ciBkcml2ZXIgZG9lcyBub3QgYWxsb2NhdGUgYW55IG9mIHRoaXMga2VybmVsIAorCQltZW1vcnkuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCXVsb25nIGZsYWdzOworCWludCBjcmQ7CisJc3RydWN0IGJvYXJkX2luZm8gKmJkOworCXVuc2lnbmVkIGNoYXIgYm9hcmRfaWQgPSAwOworCisjaWZkZWYgRU5BQkxFX1BDSQorCWludCBwY2lfYm9hcmRzX2ZvdW5kLCBwY2lfY291bnQ7CisKKwlwY2lfY291bnQgPSAwOworI2VuZGlmIC8qIEVOQUJMRV9QQ0kgKi8KKworCXBjX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYX0FMTE9DKTsKKwlpZiAoIXBjX2RyaXZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwY19pbmZvID0gYWxsb2NfdHR5X2RyaXZlcihNQVhfQUxMT0MpOworCWlmICghcGNfaW5mbykgeworCQlwdXRfdHR5X2RyaXZlcihwY19kcml2ZXIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlJZiBlcGNhX3NldHVwIGhhcyBub3QgYmVlbiByYW4gYnkgTElMTyBzZXQgbnVtX2NhcmRzIHRvIGRlZmF1bHRzOyBjb3B5CisJCWJvYXJkIHN0cnVjdHVyZSBkZWZpbmVkIGJ5IGRpZ2lDb25maWcgaW50byBkcml2ZXJzIGJvYXJkIHN0cnVjdHVyZS4KKwkJTm90ZSA6IElmIExJTE8gaGFzIHJhbiBlcGNhX3NldHVwIHRoZW4gZXBjYV9zZXR1cCB3aWxsIGhhbmRsZSBkZWZpbmluZworCQludW1fY2FyZHMgYXMgd2VsbCBhcyBjb3B5aW5nIHRoZSBkYXRhIGludG8gdGhlIGJvYXJkIHN0cnVjdHVyZS4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWlmICghbGlsb2NvbmZpZykKKwl7IC8qIEJlZ2luIGRyaXZlciBoYXMgYmVlbiBjb25maWd1cmVkIHZpYS4gZXBjYWNvbmZpZyAqLworCisJCW5iZGV2cyA9IE5CREVWUzsKKwkJbnVtX2NhcmRzID0gTlVNQ0FSRFM7CisJCW1lbWNweSgodm9pZCAqKSZib2FyZHMsICh2b2lkICopJnN0YXRpY19ib2FyZHMsCisJCSAgICAgICAoc2l6ZW9mKHN0cnVjdCBib2FyZF9pbmZvKSAqIE5VTUNBUkRTKSk7CisJfSAvKiBFbmQgZHJpdmVyIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdmlhLiBlcGNhY29uZmlnICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlOb3RlIDogSWYgbGlsbyB3YXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGRyaXZlciBhbmQgdGhlIAorCQlpZ25vcmUgZXBjYWNvbmZpZyBvcHRpb24gd2FzIGNob29zZW4gKGRpZ2llcGNhPTIpIHRoZW4gCisJCW5iZGV2cyBhbmQgbnVtX2NhcmRzIHdpbGwgZXF1YWwgMCBhdCB0aGlzIHBvaW50LiAgVGhpcyBpcworCQlva2F5OyBQQ0kgY2FyZHMgd2lsbCBzdGlsbCBiZSBwaWNrZWQgdXAgaWYgZGV0ZWN0ZWQuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJU2V0IHVwIGludGVycnVwdCwgd2Ugd2lsbCB3b3JyeSBhYm91dCBtZW1vcnkgYWxsb2NhdGlvbiBpbgorCQlwb3N0X2ZlcF9pbml0LiAKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisJcHJpbnRrKEtFUk5fSU5GTyAiRElHSSBlcGNhIGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZC5cbiIsVkVSU0lPTik7CisKKyNpZmRlZiBFTkFCTEVfUENJCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJTk9URSA6IFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIG51bWJlciBvZiBwb3J0cyBmb3VuZCBpbiAKKwkJICAgICAgIHRoZSBib2FyZHMgYXJyYXkgaXMgY29ycmVjdC4gIFRoaXMgY291bGQgYmUgd3JvbmcgaWYKKwkJICAgICAgIHRoZSBjYXJkIGluIHF1ZXN0aW9uIGlzIFBDSSAoQW5kIHRoZXJlZm9yZSBoYXMgbm8gcG9ydHMgCisJCSAgICAgICBlbnRyeSBpbiB0aGUgYm9hcmRzIHN0cnVjdHVyZS4pICBUaGUgcmVzdCBvZiB0aGUgCisJCSAgICAgICBpbmZvcm1hdGlvbiB3aWxsIGJlIHZhbGlkIGZvciBQQ0kgYmVjYXVzZSB0aGUgYmVnaW5uaW5nCisJCSAgICAgICBvZiBwY19pbml0IHNjYW5zIGZvciBQQ0kgYW5kIGRldGVybWluZXMgaS9vIGFuZCBiYXNlCisJCSAgICAgICBtZW1vcnkgYWRkcmVzc2VzLiAgSSBhbSBub3Qgc3VyZSBpZiBpdCBpcyBwb3NzaWJsZSB0byAKKwkJICAgICAgIHJlYWQgdGhlIG51bWJlciBvZiBwb3J0cyBzdXBwb3J0ZWQgYnkgdGhlIGNhcmQgcHJpb3IgdG8KKwkJICAgICAgIGl0IGJlaW5nIGJvb3RlZCAoU2luY2UgdGhhdCBpcyB0aGUgc3RhdGUgaXQgaXMgaW4gd2hlbiAKKwkJICAgICAgIHBjX2luaXQgaXMgcnVuKS4gIEJlY2F1c2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHF1ZXJ5IHRoZQorCQkgICAgICAgbnVtYmVyIG9mIHN1cHBvcnRlZCBwb3J0cyB1bnRpbCBhZnRlciB0aGUgY2FyZCBoYXMgYm9vdGVkOworCQkgICAgICAgd2UgYXJlIHJlcXVpcmVkIHRvIGNhbGN1bGF0ZSB0aGUgY2FyZF9wdHJzIGFzIHRoZSBjYXJkIGlzCSAKKwkJICAgICAgIGlzIGluaXRpYWxpemVkIChJbnNpZGUgcG9zdF9mZXBfaW5pdCkuICBUaGUgbmVnYXRpdmUgdGhpbmcKKwkJICAgICAgIGFib3V0IHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBkaWdpRGxvYWQncyBjYWxsIHRvIEdFVF9JTkZPCisJCSAgICAgICB3aWxsIGhhdmUgYSBiYWQgcG9ydCB2YWx1ZS4gIChTaW5jZSB0aGlzIGlzIGNhbGxlZCBwcmlvcgorCQkgICAgICAgdG8gcG9zdF9mZXBfaW5pdC4pCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgCisJcGNpX2JvYXJkc19mb3VuZCA9IDA7CisJaWYobnVtX2NhcmRzIDwgTUFYQk9BUkRTKQorCQlwY2lfYm9hcmRzX2ZvdW5kICs9IGluaXRfUENJKCk7CisJbnVtX2NhcmRzICs9IHBjaV9ib2FyZHNfZm91bmQ7CisKKyNlbmRpZiAvKiBFTkFCTEVfUENJICovCisKKwlwY19kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJcGNfZHJpdmVyLT5uYW1lID0gInR0eUQiOyAKKwlwY19kcml2ZXItPmRldmZzX25hbWUgPSAidHRzL0QiOworCXBjX2RyaXZlci0+bWFqb3IgPSBESUdJX01BSk9SOyAKKwlwY19kcml2ZXItPm1pbm9yX3N0YXJ0ID0gMDsKKwlwY19kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXBjX2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlwY19kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlwY19kcml2ZXItPmluaXRfdGVybWlvcy5jX2lmbGFnID0gMDsKKwlwY19kcml2ZXItPmluaXRfdGVybWlvcy5jX29mbGFnID0gMDsKKwlwY19kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IENMT0NBTCB8IEhVUENMOworCXBjX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfbGZsYWcgPSAwOworCXBjX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhwY19kcml2ZXIsICZwY19vcHMpOworCisJcGNfaW5mby0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlwY19pbmZvLT5uYW1lID0gImRpZ2lfY3RsIjsKKwlwY19pbmZvLT5tYWpvciA9IERJR0lJTkZPTUFKT1I7CisJcGNfaW5mby0+bWlub3Jfc3RhcnQgPSAwOworCXBjX2luZm8tPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXBjX2luZm8tPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9JTkZPOworCXBjX2luZm8tPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlwY19pbmZvLT5pbml0X3Rlcm1pb3MuY19pZmxhZyA9IDA7CisJcGNfaW5mby0+aW5pdF90ZXJtaW9zLmNfb2ZsYWcgPSAwOworCXBjX2luZm8tPmluaXRfdGVybWlvcy5jX2xmbGFnID0gMDsKKwlwY19pbmZvLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTDsKKwlwY19pbmZvLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKHBjX2luZm8sICZpbmZvX29wcyk7CisKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisJZm9yIChjcmQgPSAwOyBjcmQgPCBudW1fY2FyZHM7IGNyZCsrKSAKKwl7IC8qIEJlZ2luIGZvciBlYWNoIGNhcmQgKi8KKworCQkvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlUaGlzIGlzIHdoZXJlIHRoZSBhcHByb3ByaWF0ZSBtZW1vcnkgaGFuZGxlcnMgZm9yIHRoZSBoYXJkd2FyZSBpcworCQkJc2V0LiAgRXZlcnl0aGluZyBhdCBydW50aW1lIGJsaW5kbHkganVtcHMgdGhyb3VnaCB0aGVzZSB2ZWN0b3JzLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJLyogZGVmaW5lZCBpbiBlcGNhY29uZmlnLmggKi8KKwkJYmQgPSAmYm9hcmRzW2NyZF07CisKKwkJc3dpdGNoIChiZC0+dHlwZSkKKwkJeyAvKiBCZWdpbiBzd2l0Y2ggb24gYmQtPnR5cGUge2JvYXJkIHR5cGV9ICovCisJCQljYXNlIFBDWEVNOgorCQkJY2FzZSBFSVNBWEVNOgorCQkJCWJkLT5tZW13aW5vbiAgICAgPSBwY3hlbV9tZW13aW5vbiA7CisJCQkJYmQtPm1lbXdpbm9mZiAgICA9IHBjeGVtX21lbXdpbm9mZiA7CisJCQkJYmQtPmdsb2JhbHdpbm9uICA9IHBjeGVtX2dsb2JhbHdpbm9uIDsKKwkJCQliZC0+dHh3aW5vbiAgICAgID0gcGN4ZW1fdHh3aW5vbiA7CisJCQkJYmQtPnJ4d2lub24gICAgICA9IHBjeGVtX3J4d2lub24gOworCQkJCWJkLT5tZW1vZmYgICAgICAgPSBwY3hlbV9tZW1vZmYgOworCQkJCWJkLT5hc3NlcnRnd2lub24gPSBkdW1teV9hc3NlcnRnd2lub247CisJCQkJYmQtPmFzc2VydG1lbW9mZiA9IGR1bW15X2Fzc2VydG1lbW9mZjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQ0lYRU06CisJCQljYXNlIFBDSVhSSjoKKwkJCWNhc2UgUENJWFI6CisJCQkJYmQtPm1lbXdpbm9uICAgICA9IGR1bW15X21lbXdpbm9uOworCQkJCWJkLT5tZW13aW5vZmYgICAgPSBkdW1teV9tZW13aW5vZmY7CisJCQkJYmQtPmdsb2JhbHdpbm9uICA9IGR1bW15X2dsb2JhbHdpbm9uOworCQkJCWJkLT50eHdpbm9uICAgICAgPSBkdW1teV90eHdpbm9uOworCQkJCWJkLT5yeHdpbm9uICAgICAgPSBkdW1teV9yeHdpbm9uOworCQkJCWJkLT5tZW1vZmYgICAgICAgPSBkdW1teV9tZW1vZmY7CisJCQkJYmQtPmFzc2VydGd3aW5vbiA9IGR1bW15X2Fzc2VydGd3aW5vbjsKKwkJCQliZC0+YXNzZXJ0bWVtb2ZmID0gZHVtbXlfYXNzZXJ0bWVtb2ZmOworCQkJCWJyZWFrOworCisJCQljYXNlIFBDWEU6CisJCQljYXNlIFBDWEVWRToKKworCQkJCWJkLT5tZW13aW5vbiAgICAgPSBwY3hlX21lbXdpbm9uOworCQkJCWJkLT5tZW13aW5vZmYgICAgPSBwY3hlX21lbXdpbm9mZjsKKwkJCQliZC0+Z2xvYmFsd2lub24gID0gcGN4ZV9nbG9iYWx3aW5vbjsKKwkJCQliZC0+dHh3aW5vbiAgICAgID0gcGN4ZV90eHdpbm9uOworCQkJCWJkLT5yeHdpbm9uICAgICAgPSBwY3hlX3J4d2lub247CisJCQkJYmQtPm1lbW9mZiAgICAgICA9IHBjeGVfbWVtb2ZmOworCQkJCWJkLT5hc3NlcnRnd2lub24gPSBkdW1teV9hc3NlcnRnd2lub247CisJCQkJYmQtPmFzc2VydG1lbW9mZiA9IGR1bW15X2Fzc2VydG1lbW9mZjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQ1hJOgorCQkJY2FzZSBQQzY0WEU6CisKKwkJCQliZC0+bWVtd2lub24gICAgID0gcGN4aV9tZW13aW5vbjsKKwkJCQliZC0+bWVtd2lub2ZmICAgID0gcGN4aV9tZW13aW5vZmY7CisJCQkJYmQtPmdsb2JhbHdpbm9uICA9IHBjeGlfZ2xvYmFsd2lub247CisJCQkJYmQtPnR4d2lub24gICAgICA9IHBjeGlfdHh3aW5vbjsKKwkJCQliZC0+cnh3aW5vbiAgICAgID0gcGN4aV9yeHdpbm9uOworCQkJCWJkLT5tZW1vZmYgICAgICAgPSBwY3hpX21lbW9mZjsKKwkJCQliZC0+YXNzZXJ0Z3dpbm9uID0gcGN4aV9hc3NlcnRnd2lub247CisJCQkJYmQtPmFzc2VydG1lbW9mZiA9IHBjeGlfYXNzZXJ0bWVtb2ZmOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCisJCX0gLyogRW5kIHN3aXRjaCBvbiBiZC0+dHlwZSAqLworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJU29tZSBjYXJkcyBuZWVkIGEgbWVtb3J5IHNlZ21lbnQgdG8gYmUgZGVmaW5lZCBmb3IgdXNlIGluIAorCQkJdHJhbnNtaXQgYW5kIHJlY2VpdmUgd2luZG93aW5nIG9wZXJhdGlvbnMuICBUaGVzZSBib2FyZHMKKwkJCWFyZSBsaXN0ZWQgaW4gdGhlIGJlbG93IHN3aXRjaC4gIEluIHRoZSBjYXNlIG9mIHRoZSBYSSB0aGUKKwkJCWFtb3VudCBvZiBtZW1vcnkgb24gdGhlIGJvYXJkIGlzIHZhcmlhYmxlIHNvIHRoZSBtZW1vcnlfc2VnCisJCQlpcyBhbHNvIHZhcmlhYmxlLiAgVGhpcyBjb2RlIGRldGVybWluZXMgd2hhdCB0aGV5IHNlZ21lbnQgCisJCQlzaG91bGQgYmUuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJc3dpdGNoIChiZC0+dHlwZSkKKwkJeyAvKiBCZWdpbiBzd2l0Y2ggb24gYmQtPnR5cGUge2JvYXJkIHR5cGV9ICovCisKKwkJCWNhc2UgUENYRToKKwkJCWNhc2UgUENYRVZFOgorCQkJY2FzZSBQQzY0WEU6CisJCQkJYmQtPm1lbW9yeV9zZWcgPSAweGYwMDA7CisJCQlicmVhazsKKworCQkJY2FzZSBQQ1hJOgorCQkJCWJvYXJkX2lkID0gaW5iKChpbnQpYmQtPnBvcnQpOworCQkJCWlmICgoYm9hcmRfaWQgJiAweDEpID09IDB4MSkgCisJCQkJeyAvKiBCZWdpbiBpdCdzIGFuIFhJIGNhcmQgKi8gCisKKwkJCQkJLyogSXMgaXQgYSA2NEsgYm9hcmQgKi8KKwkJCQkJaWYgKChib2FyZF9pZCAmIDB4MzApID09IDApIAorCQkJCQkJYmQtPm1lbW9yeV9zZWcgPSAweGYwMDA7CisKKwkJCQkJLyogSXMgaXQgYSAxMjhLIGJvYXJkICovCisJCQkJCWlmICgoYm9hcmRfaWQgJiAweDMwKSA9PSAweDEwKSAKKwkJCQkJCWJkLT5tZW1vcnlfc2VnID0gMHhlMDAwOworCisJCQkJCS8qIElzIGlzIGEgMjU2SyBib2FyZCAqLwkKKwkJCQkJaWYgKChib2FyZF9pZCAmIDB4MzApID09IDB4MjApIAorCQkJCQkJYmQtPm1lbW9yeV9zZWcgPSAweGMwMDA7CisKKwkJCQkJLyogSXMgaXQgYSA1MTJLIGJvYXJkICovCisJCQkJCWlmICgoYm9hcmRfaWQgJiAweDMwKSA9PSAweDMwKSAKKwkJCQkJCWJkLT5tZW1vcnlfc2VnID0gMHg4MDAwOworCisJCQkJfSAvKiBFbmQgaXQgaXMgYW4gWEkgY2FyZCAqLworCQkJCWVsc2UKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIEJvYXJkIGF0IDB4JXggZG9lc24ndCBhcHBlYXIgdG8gYmUgYW4gWElcbiIsKGludCliZC0+cG9ydCk7CisJCQkJfQorCQkJYnJlYWs7CisKKwkJfSAvKiBFbmQgc3dpdGNoIG9uIGJkLT50eXBlICovCisKKwl9IC8qIEVuZCBmb3IgZWFjaCBjYXJkICovCisKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihwY19kcml2ZXIpKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgRGlnaSBQQy8gZHJpdmVyIik7CisKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihwY19pbmZvKSkKKwkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIERpZ2kgUEMvIGluZm8gIik7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgU3RhcnQgdXAgdGhlIHBvbGxlciB0byBjaGVjayBmb3IgZXZlbnRzIG9uIGFsbCBlbmFibGVkIGJvYXJkcworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWluaXRfdGltZXIoJmVwY2FfdGltZXIpOworCWVwY2FfdGltZXIuZnVuY3Rpb24gPSBlcGNhcG9sbDsKKwltb2RfdGltZXIoJmVwY2FfdGltZXIsIGppZmZpZXMgKyBIWi8yNSk7CisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybiAwOworCit9IC8qIEVuZCBwY19pbml0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwb3N0X2ZlcF9pbml0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHBvc3RfZmVwX2luaXQodW5zaWduZWQgaW50IGNyZCkKK3sgLyogQmVnaW4gcG9zdF9mZXBfaW5pdCAqLworCisJaW50IGk7CisJdW5jaGFyICptZW1hZGRyOworCXZvbGF0aWxlIHN0cnVjdCBnbG9iYWxfZGF0YSAqZ2Q7CisJc3RydWN0IGJvYXJkX2luZm8gKmJkOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwlzdHJ1Y3QgY2hhbm5lbCAqY2g7IAorCWludCBzaHJpbmttZW0gPSAwLCBsb3d3YXRlciA7IAorIAorCS8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVRoaXMgY2FsbCBpcyBtYWRlIGJ5IHRoZSB1c2VyIHZpYS4gdGhlIGlvY3RsIGNhbGwgRElHSV9JTklULgorCQlJdCBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB1cCBhbGwgdGhlIGNhcmQgc3BlY2lmaWMgc3R1ZmYuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWJkID0gJmJvYXJkc1tjcmRdOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJSWYgdGhpcyBpcyBhIFBDSSBib2FyZCwgZ2V0IHRoZSBwb3J0IGluZm8uICBSZW1lbWJlciBQQ0kgY2FyZHMKKwkJZG8gbm90IGhhdmUgZW50cmllcyBpbnRvIHRoZSBlcGNhY29uZmlnLmggZmlsZSwgc28gd2UgY2FuJ3QgZ2V0IAorCQl0aGUgbnVtYmVyIG9mIHBvcnRzIGZyb20gaXQuICBVbmZvcnR1bmV0bHksIHRoaXMgbWVhbnMgdGhhdCBhbnlvbmUKKwkJZG9pbmcgYSBESUdJX0dFVElORk8gYmVmb3JlIHRoZSBib2FyZCBoYXMgYm9vdGVkIHdpbGwgZ2V0IGFuIGludmFsaWQKKwkJbnVtYmVyIG9mIHBvcnRzIHJldHVybmVkIChJdCBzaG91bGQgcmV0dXJuIDApLiAgQ2FsbHMgdG8gRElHSV9HRVRJTkZPCisJCWFmdGVyIERJR0lfSU5JVCBoYXMgYmVlbiBjYWxsZWQgd2lsbCByZXR1cm4gdGhlIHByb3BlciB2YWx1ZXMuIAorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmIChiZC0+dHlwZSA+PSBQQ0lYRU0pIC8qIElmIHRoZSBib2FyZCBpbiBxdWVzdGlvbiBpcyBQQ0kgKi8KKwl7IC8qIEJlZ2luIGdldCBQQ0kgbnVtYmVyIG9mIHBvcnRzICovCisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCUJlbG93IHdlIHVzZSBYRU1QT1JUUyBhcyBhIG1lbW9yeSBvZmZzZXQgcmVnYXJkbGVzcyBvZiB3aGljaCBQQ0kKKwkJCWNhcmQgaXQgaXMuICBUaGlzIGlzIGJlY2F1c2UgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgUENJIGNhcmRzIGhhdmUKKwkJCXRoZSBzYW1lIG1lbW9yeSBvZmZzZXQgZm9yIHRoZSBjaGFubmVsIGRhdGEuICBUaGlzIHdpbGwgaGF2ZSB0byBiZQorCQkJY2hhbmdlZCBpZiB3ZSBldmVyIGRldmVsb3AgYSBQQ0kvWEUgY2FyZC4gIE5PVEUgOiBUaGUgRkVQIG1hbnVhbAorCQkJc3RhdGVzIHRoYXQgdGhlIHBvcnQgb2Zmc2V0IGlzIDB4QzIyIGFzIG9wcG9zZWQgdG8gMHhDMDIuICBUaGlzIGlzCisJCQlvbmx5IHRydWUgZm9yIFBDL1hFLCBhbmQgUEMvWEkgY2FyZHM7IG5vdCBmb3IgdGhlIFhFTSwgb3IgQ1ggc2VyaWVzLgorCQkJT24gdGhlIFBDSSBjYXJkcyB0aGUgbnVtYmVyIG9mIHBvcnRzIGlzIGRldGVybWluZWQgYnkgcmVhZGluZyBhIAorCQkJSUQgUFJPTSBsb2NhdGVkIGluIHRoZSBib3ggYXR0YWNoZWQgdG8gdGhlIGNhcmQuICBUaGUgY2FyZCBjYW4gdGhlbgorCQkJZGV0ZXJtaW5lIHRoZSBpbmRleCB0aGUgaWQgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcG9ydHMgYXZhaWxhYmxlLgorCQkJKEZZSSAtIFRoZSBpZCBzaG91bGQgYmUgbG9jYXRlZCBhdCAweDFhYyAoQW5kIG1heSB1c2UgdXAgdG8gNCBieXRlcworCQkJaWYgdGhlIGJveCBpbiBxdWVzdGlvbiBpcyBhIFhFTSBvciBDWCkpLiAgCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLyAKKworCQliZC0+bnVtcG9ydHMgPSAodW5zaWduZWQgc2hvcnQpKih1bnNpZ25lZCBjaGFyICopYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJkLT5yZV9tYXBfbWVtYmFzZSArIFhFTVBPUlRTKSk7CisKKwkJCisJCWVwY2Fhc3NlcnQoYmQtPm51bXBvcnRzIDw9IDY0LCJQQ0kgcmV0dXJuZWQgYSBpbnZhbGlkIG51bWJlciBvZiBwb3J0cyIpOworCQluYmRldnMgKz0gKGJkLT5udW1wb3J0cyk7CisKKwl9IC8qIEVuZCBnZXQgUENJIG51bWJlciBvZiBwb3J0cyAqLworCisJaWYgKGNyZCAhPSAwKQorCQljYXJkX3B0cltjcmRdID0gY2FyZF9wdHJbY3JkLTFdICsgYm9hcmRzW2NyZC0xXS5udW1wb3J0czsKKwllbHNlCisJCWNhcmRfcHRyW2NyZF0gPSAmZGlnaV9jaGFubmVsc1tjcmRdOyAvKiA8LSBGb3IgY2FyZCAwIG9ubHkgKi8KKworCWNoID0gY2FyZF9wdHJbY3JkXTsKKworCisJZXBjYWFzc2VydChjaCA8PSAmZGlnaV9jaGFubmVsc1tuYmRldnMgLSAxXSwgImNoIG91dCBvZiByYW5nZSIpOworCisJbWVtYWRkciA9ICh1bmNoYXIgKiliZC0+cmVfbWFwX21lbWJhc2U7CisKKwkvKiAKKwkgICBUaGUgYmVsb3cgY29tbWFuZCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBuZXdlciBrZXJuZWxzICgyLjEueCBhbmQKKwkgICB1cCkgZG8gbm90IGhhdmUgYSAxOjEgdmlydHVhbCB0byBwaHlzaWNhbCBtYXBwaW5nLiAgVGhlIGJlbG93CisJICAgY2FsbCBhZGp1c3QgZm9yIHRoYXQuCisJKi8KKworCW1lbWFkZHIgPSAodW5zaWduZWQgY2hhciAqKWJ1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKW1lbWFkZHIpOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJVGhlIGJlbG93IGFzc2lnbm1lbnQgd2lsbCBzZXQgYmMgdG8gcG9pbnQgYXQgdGhlIEJFR0lOSU5HIG9mCisJCXRoZSBjYXJkcyBjaGFubmVsIHN0cnVjdHVyZXMuICBGb3IgMSBjYXJkIHRoZXJlIHdpbGwgYmUgYmV0d2VlbgorCQk4IGFuZCA2NCBvZiB0aGVzZSBzdHJ1Y3R1cmVzLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwliYyA9ICh2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqKSgodWxvbmcpbWVtYWRkciArIENIQU5TVFJVQ1QpOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGUgYmVsb3cgYXNzaWdubWVudCB3aWxsIHNldCBnZCB0byBwb2ludCBhdCB0aGUgQkVHSU5JTkcgb2YKKwkJZ2xvYmFsIG1lbW9yeSBhZGRyZXNzIDB4YzAwLiAgVGhlIGZpcnN0IGRhdGEgaW4gdGhhdCBnbG9iYWwKKwkJbWVtb3J5IGFjdHVhbGx5IHN0YXJ0cyBhdCBhZGRyZXNzIDB4YzFhLiAgVGhlIGNvbW1hbmQgaW4gCisJCXBvaW50ZXIgYmVnaW5zIGF0IDB4ZDEwLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWdkID0gKHZvbGF0aWxlIHN0cnVjdCBnbG9iYWxfZGF0YSAqKSgodWxvbmcpbWVtYWRkciArIEdMT0JBTCk7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlYRVBPUlRTIChhZGRyZXNzIDB4YzIyKSBwb2ludHMgYXQgdGhlIG51bWJlciBvZiBjaGFubmVscyB0aGUKKwkJY2FyZCBzdXBwb3J0cy4gKEZvciA2NFhFLCBYSSwgWEVNLCBhbmQgWFIgdXNlIDB4YzAyKQorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKChiZC0+dHlwZSA9PSBQQ1hFVkUpIHwgKGJkLT50eXBlID09IFBDWEUpKSAmJgorCSAgICAoKih1c2hvcnQgKikoKHVsb25nKW1lbWFkZHIgKyBYRVBPUlRTKSA8IDMpKQorCQlzaHJpbmttZW0gPSAxOworCWlmIChiZC0+dHlwZSA8IFBDSVhFTSkKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbigoaW50KWJkLT5wb3J0LCA0LCBib2FyZF9kZXNjW2JkLT50eXBlXSkpCisJCQlyZXR1cm47CQkKKworCW1lbXdpbm9uKGJkLCAwKTsKKworCS8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlSZW1lbWJlciBjaCBpcyB0aGUgbWFpbiBkcml2ZXJzIGNoYW5uZWxzIHN0cnVjdHVyZSwgd2hpbGUgYmMgaXMgCisJICAgdGhlIGNhcmRzIGNoYW5uZWwgc3RydWN0dXJlLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogRm9yIGV2ZXJ5IHBvcnQgb24gdGhlIGNhcmQgZG8gLi4uLi4gKi8KKworCWZvciAoaSA9IDA7IGkgPCBiZC0+bnVtcG9ydHM7IGkrKywgY2grKywgYmMrKykgCisJeyAvKiBCZWdpbiBmb3IgZWFjaCBwb3J0ICovCisKKwkJY2gtPmJyZGNoYW4gICAgICAgID0gYmM7CisJCWNoLT5tYWlsYm94ICAgICAgICA9IGdkOyAKKwkJSU5JVF9XT1JLKCZjaC0+dHF1ZXVlLCBkb19zb2Z0aW50LCBjaCk7CisJCWNoLT5ib2FyZCAgICAgICAgICA9ICZib2FyZHNbY3JkXTsKKworCQlzd2l0Y2ggKGJkLT50eXBlKQorCQl7IC8qIEJlZ2luIHN3aXRjaCBiZC0+dHlwZSAqLworCisJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJU2luY2Ugc29tZSBvZiB0aGUgYm9hcmRzIHVzZSBkaWZmZXJlbnQgYml0bWFwcyBmb3IgdGhlaXIKKwkJCQljb250cm9sIHNpZ25hbHMgd2UgY2Fubm90IGhhcmQgY29kZSB0aGVzZSB2YWx1ZXMgYW5kIHJldGFpbgorCQkJCXBvcnRhYmlsaXR5LiAgV2UgdmlydHVhbGl6ZSB0aGlzIGRhdGEgaGVyZS4KKwkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkJCWNhc2UgRUlTQVhFTToKKwkJCWNhc2UgUENYRU06CisJCQljYXNlIFBDSVhFTToKKwkJCWNhc2UgUENJWFJKOgorCQkJY2FzZSBQQ0lYUjoKKwkJCQljaC0+bV9ydHMgPSAweDAyIDsKKwkJCQljaC0+bV9kY2QgPSAweDgwIDsgCisJCQkJY2gtPm1fZHNyID0gMHgyMCA7CisJCQkJY2gtPm1fY3RzID0gMHgxMCA7CisJCQkJY2gtPm1fcmkgID0gMHg0MCA7CisJCQkJY2gtPm1fZHRyID0gMHgwMSA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUENYRToKKwkJCWNhc2UgUENYRVZFOgorCQkJY2FzZSBQQ1hJOgorCQkJY2FzZSBQQzY0WEU6CisJCQkJY2gtPm1fcnRzID0gMHgwMiA7CisJCQkJY2gtPm1fZGNkID0gMHgwOCA7IAorCQkJCWNoLT5tX2RzciA9IDB4MTAgOworCQkJCWNoLT5tX2N0cyA9IDB4MjAgOworCQkJCWNoLT5tX3JpICA9IDB4NDAgOworCQkJCWNoLT5tX2R0ciA9IDB4ODAgOworCQkJCWJyZWFrOworCQorCQl9IC8qIEVuZCBzd2l0Y2ggYmQtPnR5cGUgKi8KKworCQlpZiAoYm9hcmRzW2NyZF0uYWx0cGluKSAKKwkJeworCQkJY2gtPmRzciA9IGNoLT5tX2RjZDsKKwkJCWNoLT5kY2QgPSBjaC0+bV9kc3I7CisJCQljaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzIHw9IERJR0lfQUxUUElOOworCQl9CisJCWVsc2UgCisJCXsgCisJCQljaC0+ZGNkID0gY2gtPm1fZGNkOworCQkJY2gtPmRzciA9IGNoLT5tX2RzcjsKKwkJfQorCQorCQljaC0+Ym9hcmRudW0gICA9IGNyZDsKKwkJY2gtPmNoYW5uZWxudW0gPSBpOworCQljaC0+bWFnaWMgICAgICA9IEVQQ0FfTUFHSUM7CisJCWNoLT50dHkgICAgICAgID0gTlVMTDsKKworCQlpZiAoc2hyaW5rbWVtKSAKKwkJeworCQkJZmVwY21kKGNoLCBTRVRCVUZGRVIsIDMyLCAwLCAwLCAwKTsKKwkJCXNocmlua21lbSA9IDA7CisJCX0KKworCQlzd2l0Y2ggKGJkLT50eXBlKQorCQl7IC8qIEJlZ2luIHN3aXRjaCBiZC0+dHlwZSAqLworCisJCQljYXNlIFBDSVhFTToKKwkJCWNhc2UgUENJWFJKOgorCQkJY2FzZSBQQ0lYUjoKKwkJCQkvKiBDb3ZlciBhbGwgdGhlIDJNRUcgY2FyZHMgKi8KKwkJCQljaC0+dHhwdHIgPSBtZW1hZGRyICsgKCgoYmMtPnRzZWcpIDw8IDQpICYgMHgxZmZmZmYpOworCQkJCWNoLT5yeHB0ciA9IG1lbWFkZHIgKyAoKChiYy0+cnNlZykgPDwgNCkgJiAweDFmZmZmZik7CisJCQkJY2gtPnR4d2luID0gRkVQV0lOIHwgKChiYy0+dHNlZykgPj4gMTEpOworCQkJCWNoLT5yeHdpbiA9IEZFUFdJTiB8ICgoYmMtPnJzZWcpID4+IDExKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQ1hFTToKKwkJCWNhc2UgRUlTQVhFTToKKwkJCQkvKiBDb3ZlciBhbGwgdGhlIDMySyB3aW5kb3dlZCBjYXJkcyAqLworCQkJCS8qIE1hc2sgZXF1YWwgdG8gd2luZG93IHNpemUgLSAxICovCisJCQkJY2gtPnR4cHRyID0gbWVtYWRkciArICgoKGJjLT50c2VnKSA8PCA0KSAmIDB4N2ZmZik7CisJCQkJY2gtPnJ4cHRyID0gbWVtYWRkciArICgoKGJjLT5yc2VnKSA8PCA0KSAmIDB4N2ZmZik7CisJCQkJY2gtPnR4d2luID0gRkVQV0lOIHwgKChiYy0+dHNlZykgPj4gMTEpOworCQkJCWNoLT5yeHdpbiA9IEZFUFdJTiB8ICgoYmMtPnJzZWcpID4+IDExKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQ1hFVkU6CisJCQljYXNlIFBDWEU6CisJCQkJY2gtPnR4cHRyID0gbWVtYWRkciArICgoKGJjLT50c2VnIC0gYmQtPm1lbW9yeV9zZWcpIDw8IDQpICYgMHgxZmZmKTsKKwkJCQljaC0+dHh3aW4gPSBGRVBXSU4gfCAoKGJjLT50c2VnIC0gYmQtPm1lbW9yeV9zZWcpID4+IDkpOworCQkJCWNoLT5yeHB0ciA9IG1lbWFkZHIgKyAoKChiYy0+cnNlZyAtIGJkLT5tZW1vcnlfc2VnKSA8PCA0KSAmIDB4MWZmZik7CisJCQkJY2gtPnJ4d2luID0gRkVQV0lOIHwgKChiYy0+cnNlZyAtIGJkLT5tZW1vcnlfc2VnKSA+PjkgKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQ1hJOgorCQkJY2FzZSBQQzY0WEU6CisJCQkJY2gtPnR4cHRyID0gbWVtYWRkciArICgoYmMtPnRzZWcgLSBiZC0+bWVtb3J5X3NlZykgPDwgNCk7CisJCQkJY2gtPnJ4cHRyID0gbWVtYWRkciArICgoYmMtPnJzZWcgLSBiZC0+bWVtb3J5X3NlZykgPDwgNCk7CisJCQkJY2gtPnR4d2luID0gY2gtPnJ4d2luID0gMDsKKwkJCQlicmVhazsKKworCQl9IC8qIEVuZCBzd2l0Y2ggYmQtPnR5cGUgKi8KKworCQljaC0+dHhidWZoZWFkID0gMDsKKwkJY2gtPnR4YnVmc2l6ZSA9IGJjLT50bWF4ICsgMTsKKwkKKwkJY2gtPnJ4YnVmaGVhZCA9IDA7CisJCWNoLT5yeGJ1ZnNpemUgPSBiYy0+cm1heCArIDE7CisJCisJCWxvd3dhdGVyID0gY2gtPnR4YnVmc2l6ZSA+PSAyMDAwID8gMTAyNCA6IChjaC0+dHhidWZzaXplIC8gMik7CisKKwkJLyogU2V0IHRyYW5zbWl0dGVyIGxvdyB3YXRlciBtYXJrICovCisJCWZlcGNtZChjaCwgU1RYTFdBVEVSLCBsb3d3YXRlciwgMCwgMTAsIDApOworCisJCS8qIFNldCByZWNlaXZlciBsb3cgd2F0ZXIgbWFyayAqLworCisJCWZlcGNtZChjaCwgU1JYTFdBVEVSLCAoY2gtPnJ4YnVmc2l6ZSAvIDQpLCAwLCAxMCwgMCk7CisKKwkJLyogU2V0IHJlY2VpdmVyIGhpZ2ggd2F0ZXIgbWFyayAqLworCisJCWZlcGNtZChjaCwgU1JYSFdBVEVSLCAoMyAqIGNoLT5yeGJ1ZnNpemUgLyA0KSwgMCwgMTAsIDApOworCisJCWJjLT5lZGVsYXkgPSAxMDA7CisJCWJjLT5pZGF0YSA9IDE7CisJCisJCWNoLT5zdGFydGMgID0gYmMtPnN0YXJ0YzsKKwkJY2gtPnN0b3BjICAgPSBiYy0+c3RvcGM7CisJCWNoLT5zdGFydGNhID0gYmMtPnN0YXJ0Y2E7CisJCWNoLT5zdG9wY2EgID0gYmMtPnN0b3BjYTsKKwkKKwkJY2gtPmZlcGNmbGFnID0gMDsKKwkJY2gtPmZlcGlmbGFnID0gMDsKKwkJY2gtPmZlcG9mbGFnID0gMDsKKwkJY2gtPmZlcHN0YXJ0YyA9IDA7CisJCWNoLT5mZXBzdG9wYyA9IDA7CisJCWNoLT5mZXBzdGFydGNhID0gMDsKKwkJY2gtPmZlcHN0b3BjYSA9IDA7CisJCisJCWNoLT5jbG9zZV9kZWxheSA9IDUwOworCQljaC0+Y291bnQgPSAwOworCQljaC0+YmxvY2tlZF9vcGVuID0gMDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPm9wZW5fd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoLT5jbG9zZV93YWl0KTsKKwkJY2gtPnRtcF9idWYgPSBrbWFsbG9jKGNoLT50eGJ1ZnNpemUsR0ZQX0tFUk5FTCk7CisJCWlmICghKGNoLT50bXBfYnVmKSkKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJQT1NUIEZFUCBJTklUIDoga21hbGxvYyBmYWlsZWQgZm9yIHBvcnQgMHgleFxuIixpKTsKKwkJCXJlbGVhc2VfcmVnaW9uKChpbnQpYmQtPnBvcnQsIDQpOworCQkJd2hpbGUoaS0tID4gMCkKKwkJCQlrZnJlZSgoY2gtLSktPnRtcF9idWYpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UgCisJCQltZW1zZXQoKHZvaWQgKiljaC0+dG1wX2J1ZiwwLGNoLT50eGJ1ZnNpemUpOworCX0gLyogRW5kIGZvciBlYWNoIHBvcnQgKi8KKworCXByaW50ayhLRVJOX0lORk8gCisJICAgICAgICAiRGlnaSBQQy9YeCBEcml2ZXIgViVzOiAgJXMgSS9PID0gMHglbHggTWVtID0gMHglbHggUG9ydHMgPSAlZFxuIiwgCisJICAgICAgICBWRVJTSU9OLCBib2FyZF9kZXNjW2JkLT50eXBlXSwgKGxvbmcpYmQtPnBvcnQsIChsb25nKWJkLT5tZW1iYXNlLCBiZC0+bnVtcG9ydHMpOworCXNwcmludGYobWVzZywgCisJICAgICAgICAiRGlnaSBQQy9YeCBEcml2ZXIgViVzOiAgJXMgSS9PID0gMHglbHggTWVtID0gMHglbHggUG9ydHMgPSAlZFxuIiwgCisJICAgICAgICBWRVJTSU9OLCBib2FyZF9kZXNjW2JkLT50eXBlXSwgKGxvbmcpYmQtPnBvcnQsIChsb25nKWJkLT5tZW1iYXNlLCBiZC0+bnVtcG9ydHMpOworCWNvbnNvbGVfcHJpbnQobWVzZyk7CisKKwltZW13aW5vZmYoYmQsIDApOworCit9IC8qIEVuZCBwb3N0X2ZlcF9pbml0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBlcGNhcG9sbCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGVwY2Fwb2xsKHVuc2lnbmVkIGxvbmcgaWdub3JlZCkKK3sgLyogQmVnaW4gZXBjYXBvbGwgKi8KKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNyZDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgaGVhZCwgdGFpbDsKKwlzdHJ1Y3QgY2hhbm5lbCAqY2g7CisJc3RydWN0IGJvYXJkX2luZm8gKmJkOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHVwb24gZXZlcnkgdGltZXIgaW50ZXJydXB0LiAgRXZlbiB0aG91Z2gKKwkJdGhlIERpZ2kgc2VyaWVzIGNhcmRzIGFyZSBjYXBhYmxlIG9mIGdlbmVyYXRpbmcgaW50ZXJydXB0cyB0aGlzIAorCQltZXRob2Qgb2Ygbm9uLWxvb3BpbmcgcG9sbGluZyBpcyBtb3JlIGVmZmljaWVudC4gIFRoaXMgcm91dGluZQorCQljaGVja3MgZm9yIGNhcmQgZ2VuZXJhdGVkIGV2ZW50cyAoU3VjaCBhcyByZWNlaXZlIGRhdGEsIGFyZSB0cmFuc21pdAorCQlidWZmZXIgZW1wdHkpIGFuZCBhY3RzIG9uIHRob3NlIGV2ZW50cy4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCQorCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisJZm9yIChjcmQgPSAwOyBjcmQgPCBudW1fY2FyZHM7IGNyZCsrKSAKKwl7IC8qIEJlZ2luIGZvciBlYWNoIGNhcmQgKi8KKworCQliZCA9ICZib2FyZHNbY3JkXTsKKwkJY2ggPSBjYXJkX3B0cltjcmRdOworCisJCWlmICgoYmQtPnN0YXR1cyA9PSBESVNBQkxFRCkgfHwgZGlnaV9wb2xsZXJfaW5oaWJpdGVkKQorCQkJY29udGludWU7IC8qIEJlZ2luIGxvb3AgbmV4dCBpbnRlcmF0aW9uICovCisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCWFzc2VydG1lbW9mZiBpcyBub3QgbmVlZGVkIGhlcmU7IGluZGVlZCBpdCBpcyBhbiBlbXB0eSBzdWJyb3V0aW5lLgorCQkJSXQgaXMgYmVpbmcga2VwdCBiZWNhdXNlIGZ1dHVyZSBib2FyZHMgbWF5IG5lZWQgdGhpcyBhcyB3ZWxsIGFzCisJCQlzb21lIGxlZ2FjeSBib2FyZHMuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQlhc3NlcnRtZW1vZmYoY2gpOworCisJCWdsb2JhbHdpbm9uKGNoKTsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCUluIHRoaXMgY2FzZSBoZWFkIGFuZCB0YWlsIGFjdHVhbGx5IHJlZmVyIHRvIHRoZSBldmVudCBxdWV1ZSBub3QKKwkJCXRoZSB0cmFuc21pdCBvciByZWNlaXZlIHF1ZXVlLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJaGVhZCA9IGNoLT5tYWlsYm94LT5laW47CisJCXRhaWwgPSBjaC0+bWFpbGJveC0+ZW91dDsKKwkJCisJCS8qIElmIGhlYWQgaXNuJ3QgZXF1YWwgdG8gdGFpbCB3ZSBoYXZlIGFuIGV2ZW50ICovCisKKwkJaWYgKGhlYWQgIT0gdGFpbCkKKwkJCWRvZXZlbnQoY3JkKTsKKworCQltZW1vZmYoY2gpOworCisJfSAvKiBFbmQgZm9yIGVhY2ggY2FyZCAqLworCisJbW9kX3RpbWVyKCZlcGNhX3RpbWVyLCBqaWZmaWVzICsgKEhaIC8gMjUpKTsKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfSAvKiBFbmQgZXBjYXBvbGwgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGRvZXZlbnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBkb2V2ZW50KGludCBjcmQpCit7IC8qIEJlZ2luIGRvZXZlbnQgKi8KKworCXZvbGF0aWxlIHVuY2hhciAqZXZlbnRidWY7CisJc3RydWN0IGNoYW5uZWwgKmNoLCAqY2hhbjA7CisJc3RhdGljIHN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2luZm8gKmJkOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwlyZWdpc3RlciB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgdGFpbCwgaGVhZDsKKwlyZWdpc3RlciBpbnQgZXZlbnQsIGNoYW5uZWw7CisJcmVnaXN0ZXIgaW50IG1zdGF0LCBsc3RhdDsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJVGhpcyBzdWJyb3V0aW5lIGlzIGNhbGxlZCBieSBlcGNhcG9sbCB3aGVuIGFuIGV2ZW50IGlzIGRldGVjdGVkIAorCQlpbiB0aGUgZXZlbnQgcXVldWUuICBUaGlzIHJvdXRpbmUgcmVzcG9uZHMgdG8gdGhvc2UgZXZlbnRzLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJYmQgPSAmYm9hcmRzW2NyZF07CisKKwljaGFuMCA9IGNhcmRfcHRyW2NyZF07CisJZXBjYWFzc2VydChjaGFuMCA8PSAmZGlnaV9jaGFubmVsc1tuYmRldnMgLSAxXSwgImNoIG91dCBvZiByYW5nZSIpOworCisJYXNzZXJ0Z3dpbm9uKGNoYW4wKTsKKworCXdoaWxlICgodGFpbCA9IGNoYW4wLT5tYWlsYm94LT5lb3V0KSAhPSAoaGVhZCA9IGNoYW4wLT5tYWlsYm94LT5laW4pKSAKKwl7IC8qIEJlZ2luIHdoaWxlIHNvbWV0aGluZyBpbiBldmVudCBxdWV1ZSAqLworCisJCWFzc2VydGd3aW5vbihjaGFuMCk7CisKKwkJZXZlbnRidWYgPSAodm9sYXRpbGUgdW5jaGFyICopYnVzX3RvX3ZpcnQoKHVsb25nKShiZC0+cmVfbWFwX21lbWJhc2UgKyB0YWlsICsgSVNUQVJUKSk7CisKKwkJLyogR2V0IHRoZSBjaGFubmVsIHRoZSBldmVudCBvY2N1cnJlZCBvbiAqLworCQljaGFubmVsID0gZXZlbnRidWZbMF07CisKKwkJLyogR2V0IHRoZSBhY3R1YWwgZXZlbnQgY29kZSB0aGF0IG9jY3VycmVkICovCisJCWV2ZW50ID0gZXZlbnRidWZbMV07CisKKwkJLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCVRoZSB0d28gYXNzaWdubWVudHMgYmVsb3cgZ2V0IHRoZSBjdXJyZW50IG1vZGVtIHN0YXR1cyAobXN0YXQpCisJCQlhbmQgdGhlIHByZXZpb3VzIG1vZGVtIHN0YXR1cyAobHN0YXQpLiAgVGhlc2UgYXJlIHVzZWZ1bCBiZWN1YXNlCisJCQlhbiBldmVudCBjb3VsZCBzaWduYWwgYSBjaGFuZ2UgaW4gbW9kZW0gc2lnbmFscyBpdHNlbGYuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQltc3RhdCA9IGV2ZW50YnVmWzJdOworCQlsc3RhdCA9IGV2ZW50YnVmWzNdOworCisJCWNoID0gY2hhbjAgKyBjaGFubmVsOworCisJCWlmICgodW5zaWduZWQpY2hhbm5lbCA+PSBiZC0+bnVtcG9ydHMgfHwgIWNoKSAKKwkJeyAKKwkJCWlmIChjaGFubmVsID49IGJkLT5udW1wb3J0cykKKwkJCQljaCA9IGNoYW4wOworCQkJYmMgPSBjaC0+YnJkY2hhbjsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCWlmICgoYmMgPSBjaC0+YnJkY2hhbikgPT0gTlVMTCkKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoZXZlbnQgJiBEQVRBX0lORCkgCisJCXsgLyogQmVnaW4gREFUQV9JTkQgKi8KKworCQkJcmVjZWl2ZV9kYXRhKGNoKTsKKwkJCWFzc2VydGd3aW5vbihjaCk7CisKKwkJfSAvKiBFbmQgREFUQV9JTkQgKi8KKwkJLyogZWxzZSAqLy8qIEZpeCBmb3IgRENEIHRyYW5zaXRpb24gbWlzc2VkIGJ1ZyAqLworCQlpZiAoZXZlbnQgJiBNT0RFTUNIR19JTkQpIAorCQl7IC8qIEJlZ2luIE1PREVNQ0hHX0lORCAqLworCisJCQkvKiBBIG1vZGVtIHNpZ25hbCBjaGFuZ2UgaGFzIGJlZW4gaW5kaWNhdGVkICovCisKKwkJCWNoLT5pbW9kZW0gPSBtc3RhdDsKKworCQkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpIAorCQkJeworCQkJCWlmIChtc3RhdCAmIGNoLT5kY2QpICAvKiBXZSBhcmUgbm93IHJlY2VpdmluZyBkY2QgKi8KKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKKwkJCQllbHNlCisJCQkJCXBjX3NjaGVkX2V2ZW50KGNoLCBFUENBX0VWRU5UX0hBTkdVUCk7IC8qIE5vIGRjZDsgaGFuZ3VwICovCisJCQl9CisKKwkJfSAvKiBFbmQgTU9ERU1DSEdfSU5EICovCisKKwkJdHR5ID0gY2gtPnR0eTsKKwkJaWYgKHR0eSkgCisJCXsgLyogQmVnaW4gaWYgdmFsaWQgdHR5ICovCisKKwkJCWlmIChldmVudCAmIEJSRUFLX0lORCkgCisJCQl7IC8qIEJlZ2luIGlmIEJSRUFLX0lORCAqLworCisJCQkJLyogQSBicmVhayBoYXMgYmVlbiBpbmRpY2F0ZWQgKi8KKworCQkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfQlJFQUs7CisKKwkJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKKworCQkJCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7IAorCisJCQl9IC8qIEVuZCBpZiBCUkVBS19JTkQgKi8KKwkJCWVsc2UKKwkJCWlmIChldmVudCAmIExPV1RYX0lORCkgCisJCQl7IC8qIEJlZ2luIExPV1RYX0lORCAqLworCisJCQkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIExPV1dBSVQpIAorCQkJCXsgLyogQmVnaW4gaWYgTE9XV0FJVCAqLworCisJCQkJCWNoLT5zdGF0dXNmbGFncyAmPSB+TE9XV0FJVDsKKwkJCQkJdHR5X3dha2V1cCh0dHkpOworCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisKKwkJCQl9IC8qIEVuZCBpZiBMT1dXQUlUICovCisKKwkJCX0gLyogRW5kIExPV1RYX0lORCAqLworCQkJZWxzZQorCQkJaWYgKGV2ZW50ICYgRU1QVFlUWF9JTkQpIAorCQkJeyAvKiBCZWdpbiBFTVBUWVRYX0lORCAqLworCisJCQkJLyogVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgYnkgc2V0dXBfZW1wdHlfZXZlbnQgKi8KKworCQkJCWNoLT5zdGF0dXNmbGFncyAmPSB+VFhCVVNZOworCQkJCWlmIChjaC0+c3RhdHVzZmxhZ3MgJiBFTVBUWVdBSVQpIAorCQkJCXsgLyogQmVnaW4gaWYgRU1QVFlXQUlUICovCisKKwkJCQkJY2gtPnN0YXR1c2ZsYWdzICY9IH5FTVBUWVdBSVQ7CisJCQkJCXR0eV93YWtldXAodHR5KTsKKworCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisKKwkJCQl9IC8qIEVuZCBpZiBFTVBUWVdBSVQgKi8KKworCQkJfSAvKiBFbmQgRU1QVFlUWF9JTkQgKi8KKworCQl9IC8qIEVuZCBpZiB2YWxpZCB0dHkgKi8KKworCisJbmV4dDoKKwkJZ2xvYmFsd2lub24oY2gpOworCisJCWlmICghYmMpCisJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBiYyA9PSBOVUxMIGluIGRvZXZlbnQhXG4iKTsKKwkJZWxzZSAKKwkJCWJjLT5pZGF0YSA9IDE7CisKKwkJY2hhbjAtPm1haWxib3gtPmVvdXQgPSAodGFpbCArIDQpICYgKElNQVggLSBJU1RBUlQgLSA0KTsKKwkJZ2xvYmFsd2lub24oY2hhbjApOworCisJfSAvKiBFbmQgd2hpbGUgc29tZXRoaW5nIGluIGV2ZW50IHF1ZXVlICovCisKK30gLyogRW5kIGRvZXZlbnQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGZlcGNtZCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGZlcGNtZChzdHJ1Y3QgY2hhbm5lbCAqY2gsIGludCBjbWQsIGludCB3b3JkX29yX2J5dGUsCisgICAgICAgICAgICAgICAgICAgaW50IGJ5dGUyLCBpbnQgbmNtZHMsIGludCBieXRlY21kKQoreyAvKiBCZWdpbiBmZXBjbWQgKi8KKworCXVuY2hhciAqbWVtYWRkcjsKKwl1bnNpZ25lZCBpbnQgaGVhZCwgY21kVGFpbCwgY21kU3RhcnQsIGNtZE1heDsKKwlsb25nIGNvdW50OworCWludCBuOworCisJLyogVGhpcyBpcyB0aGUgcm91dGluZSBpbiB3aGljaCBjb21tYW5kcyBtYXkgYmUgcGFzc2VkIHRvIHRoZSBjYXJkLiAqLworCisJaWYgKGNoLT5ib2FyZC0+c3RhdHVzID09IERJU0FCTEVEKQorCXsKKwkJcmV0dXJuOworCX0KKworCWFzc2VydGd3aW5vbihjaCk7CisKKwkvKiBSZW1lbWJlciBoZWFkIChBcyB3ZWxsIGFzIG1heCkgaXMganVzdCBhbiBvZmZzZXQgbm90IGEgYmFzZSBhZGRyICovCisJaGVhZCA9IGNoLT5tYWlsYm94LT5jaW47CisKKwkvKiBjbWRTdGFydCBpcyBhIGJhc2UgYWRkcmVzcyAqLworCWNtZFN0YXJ0ID0gY2gtPm1haWxib3gtPmNzdGFydDsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlXZSBkbyB0aGUgYWRkaXRpb24gYmVsb3cgYmVjYXVzZSB3ZSBkbyBub3Qgd2FudCBhIG1heCBwb2ludGVyIAorCQlyZWxhdGl2ZSB0byBjbWRTdGFydC4gIFdlIHdhbnQgYSBtYXggcG9pbnRlciB0aGF0IHBvaW50cyBhdCB0aGUgCisJCXBoeXNpY2FsIGVuZCBvZiB0aGUgY29tbWFuZCBxdWV1ZS4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJY21kTWF4ID0gKGNtZFN0YXJ0ICsgNCArIChjaC0+bWFpbGJveC0+Y21heCkpOworCisJbWVtYWRkciA9IGNoLT5ib2FyZC0+cmVfbWFwX21lbWJhc2U7CisKKwkvKiAKKwkgICBUaGUgYmVsb3cgY29tbWFuZCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBuZXdlciBrZXJuZWxzICgyLjEueCBhbmQKKwkgICB1cCkgZG8gbm90IGhhdmUgYSAxOjEgdmlydHVhbCB0byBwaHlzaWNhbCBtYXBwaW5nLiAgVGhlIGJlbG93CisJICAgY2FsbCBhZGp1c3QgZm9yIHRoYXQuCisJKi8KKworCW1lbWFkZHIgPSAodW5zaWduZWQgY2hhciAqKWJ1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKW1lbWFkZHIpOworCisJaWYgKGhlYWQgPj0gKGNtZE1heCAtIGNtZFN0YXJ0KSB8fCAoaGVhZCAmIDAzKSkgCisJeworCQlwcmludGsoS0VSTl9FUlIgImxpbmUgJWQ6IE91dCBvZiByYW5nZSwgY21kID0gJXgsIGhlYWQgPSAleFxuIiwgX19MSU5FX18sIAorICAgICAgICAgICAgICBjbWQsIGhlYWQpOworCQlwcmludGsoS0VSTl9FUlIgImxpbmUgJWQ6IE91dCBvZiByYW5nZSwgY21kTWF4ID0gJXgsIGNtZFN0YXJ0ID0gJXhcbiIsIF9fTElORV9fLCAKKyAgICAgICAgICAgICAgY21kTWF4LCBjbWRTdGFydCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYnl0ZWNtZCkgCisJeworCQkqKHZvbGF0aWxlIHVuY2hhciAqKShtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMCkgPSAodW5jaGFyKWNtZDsKKworCQkqKHZvbGF0aWxlIHVuY2hhciAqKShtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMSkgPSAodW5jaGFyKWNoLT5jaGFubmVsbnVtOworCQkvKiBCZWxvdyB3b3JkX29yX2J5dGUgaXMgYml0cyB0byBzZXQgKi8KKwkJKih2b2xhdGlsZSB1bmNoYXIgKikobWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDIpID0gKHVuY2hhcil3b3JkX29yX2J5dGU7CisJCS8qIEJlbG93IGJ5dGUyIGlzIGJpdHMgdG8gcmVzZXQgKi8KKwkJKih2b2xhdGlsZSB1bmNoYXIgKikobWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDMpID0gKHVuY2hhcilieXRlMjsKKworCX0gCisJZWxzZSAKKwl7CisJCSoodm9sYXRpbGUgdW5jaGFyICopKG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAwKSA9ICh1bmNoYXIpY21kOworCQkqKHZvbGF0aWxlIHVuY2hhciAqKShtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMSkgPSAodW5jaGFyKWNoLT5jaGFubmVsbnVtOworCQkqKHZvbGF0aWxlIHVzaG9ydCopKG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAyKSA9ICh1c2hvcnQpd29yZF9vcl9ieXRlOworCX0KKworCWhlYWQgPSAoaGVhZCArIDQpICYgKGNtZE1heCAtIGNtZFN0YXJ0IC0gNCk7CisJY2gtPm1haWxib3gtPmNpbiA9IGhlYWQ7CisKKwljb3VudCA9IEZFUFRJTUVPVVQ7CisKKwlmb3IgKDs7KSAKKwl7IC8qIEJlZ2luIGZvcmV2ZXIgbG9vcCAqLworCisJCWNvdW50LS07CisJCWlmIChjb3VudCA9PSAwKSAKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gRmVwIG5vdCByZXNwb25kaW5nIGluIGZlcGNtZCgpXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWhlYWQgPSBjaC0+bWFpbGJveC0+Y2luOworCQljbWRUYWlsID0gY2gtPm1haWxib3gtPmNvdXQ7CisKKwkJbiA9IChoZWFkIC0gY21kVGFpbCkgJiAoY21kTWF4IC0gY21kU3RhcnQgLSA0KTsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlCYXNpY2FsbHkgdGhpcyB3aWxsIGJyZWFrIHdoZW4gdGhlIEZFUCBhY2tub3dsZWRnZXMgdGhlIAorCQkJY29tbWFuZCBieSBpbmNyZW1lbnRpbmcgY21kVGFpbCAoTWFraW5nIGl0IGVxdWFsIHRvIGhlYWQpLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJaWYgKG4gPD0gbmNtZHMgKiAoc2l6ZW9mKHNob3J0KSAqIDQpKQorCQkJYnJlYWs7IC8qIFdlbGwgbmVhcmx5IGZvcmV2ZXIgOi0pICovCisKKwl9IC8qIEVuZCBmb3JldmVyIGxvb3AgKi8KKworfSAvKiBFbmQgZmVwY21kICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCURpZ2kgcHJvZHVjdHMgdXNlIGZpZWxkcyBpbiB0aGVpciBjaGFubmVscyBzdHJ1Y3R1cmVzIHRoYXQgYXJlIHZlcnkKKwlzaW1pbGFyIHRvIHRoZSBjX2NmbGFnIGFuZCBjX2lmbGFnIGZpZWxkcyB0eXBpY2FsbHkgZm91bmQgaW4gVU5JWAorCXRlcm1pb3Mgc3RydWN0dXJlcy4gIFRoZSBiZWxvdyB0aHJlZSByb3V0aW5lcyBhbGxvdyBtYXBwaW5ncyAKKwliZXR3ZWVuIHRoZXNlIGhhcmR3YXJlICJmbGFncyIgYW5kIHRoZWlyIHJlc3BlY3RpdmUgTGludXggZmxhZ3MuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gdGVybWlvczJkaWdpX2ggLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIHRlcm1pb3MyZGlnaV9oKHN0cnVjdCBjaGFubmVsICpjaCwgdW5zaWduZWQgY2ZsYWcpCit7IC8qIEJlZ2luIHRlcm1pb3MyZGlnaV9oICovCisKKwl1bnNpZ25lZCByZXMgPSAwOworCisJaWYgKGNmbGFnICYgQ1JUU0NUUykgCisJeworCQljaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzIHw9IChSVFNQQUNFIHwgQ1RTUEFDRSk7CisJCXJlcyB8PSAoKGNoLT5tX2N0cykgfCAoY2gtPm1fcnRzKSk7CisJfQorCisJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBSVFNQQUNFKQorCQlyZXMgfD0gY2gtPm1fcnRzOworCisJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBEVFJQQUNFKQorCQlyZXMgfD0gY2gtPm1fZHRyOworCisJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBDVFNQQUNFKQorCQlyZXMgfD0gY2gtPm1fY3RzOworCisJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBEU1JQQUNFKQorCQlyZXMgfD0gY2gtPmRzcjsKKworCWlmIChjaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzICYgRENEUEFDRSkKKwkJcmVzIHw9IGNoLT5kY2Q7CisKKwlpZiAocmVzICYgKGNoLT5tX3J0cykpCisJCWNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgfD0gUlRTUEFDRTsKKworCWlmIChyZXMgJiAoY2gtPm1fY3RzKSkKKwkJY2gtPmRpZ2lleHQuZGlnaV9mbGFncyB8PSBDVFNQQUNFOworCisJcmV0dXJuIHJlczsKKworfSAvKiBFbmQgdGVybWlvczJkaWdpX2ggKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHRlcm1pb3MyZGlnaV9pIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdW5zaWduZWQgdGVybWlvczJkaWdpX2koc3RydWN0IGNoYW5uZWwgKmNoLCB1bnNpZ25lZCBpZmxhZykKK3sgLyogQmVnaW4gdGVybWlvczJkaWdpX2kgKi8KKworCXVuc2lnbmVkIHJlcyA9IGlmbGFnICYgKElHTkJSSyB8IEJSS0lOVCB8IElHTlBBUiB8IFBBUk1SSyB8IAorCSAgICAgICAgICAgICAgICAgICAgICAgIElOUENLIHwgSVNUUklQfElYT058SVhBTll8SVhPRkYpOworCQorCWlmIChjaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzICYgRElHSV9BSVhPTikKKwkJcmVzIHw9IElBSVhPTjsKKwlyZXR1cm4gcmVzOworCit9IC8qIEVuZCB0ZXJtaW9zMmRpZ2lfaSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gdGVybWlvczJkaWdpX2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIHRlcm1pb3MyZGlnaV9jKHN0cnVjdCBjaGFubmVsICpjaCwgdW5zaWduZWQgY2ZsYWcpCit7IC8qIEJlZ2luIHRlcm1pb3MyZGlnaV9jICovCisKKwl1bnNpZ25lZCByZXMgPSAwOworCisjaWZkZWYgU1BFRURfSEFDSworCS8qIENMOiBIQUNLIHRvIGZvcmNlIDExNTIwMCBhdCAzODQwMCBhbmQgNTc2MDAgYXQgMTkyMDAgQmF1ZCAqLworCWlmICgoY2ZsYWcgJiBDQkFVRCk9PSBCMzg0MDApIGNmbGFnPWNmbGFnIC0gQjM4NDAwICsgQjExNTIwMDsKKwlpZiAoKGNmbGFnICYgQ0JBVUQpPT0gQjE5MjAwKSBjZmxhZz1jZmxhZyAtIEIxOTIwMCArIEI1NzYwMDsKKyNlbmRpZiAvKiBTUEVFRF9IQUNLICovCisKKwlpZiAoY2ZsYWcgJiBDQkFVREVYKQorCXsgLyogQmVnaW4gZGV0ZWN0ZWQgQ0JBVURFWCAqLworCisJCWNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgfD0gRElHSV9GQVNUOworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJICAgSFVQQ0wgYml0IGlzIHVzZWQgYnkgRkVQIHRvIGluZGljYXRlIGZhc3QgYmF1ZAorCQkgICB0YWJsZSBpcyB0byBiZSB1c2VkLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCXJlcyB8PSBGRVBfSFVQQ0w7CisKKwl9IC8qIEVuZCBkZXRlY3RlZCBDQkFVREVYICovCisJZWxzZSBjaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzICY9IH5ESUdJX0ZBU1Q7IAorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlDQkFVRCBoYXMgYml0IHBvc2l0aW9uIDB4MTAwMCBzZXQgdGhlc2UgZGF5cyB0byBpbmRpY2F0ZSBMaW51eAorCQliYXVkIHJhdGUgcmVtYXAuICBEaWdpIGhhcmR3YXJlIGNhbid0IGhhbmRsZSB0aGUgYml0IGFzc2lnbm1lbnQuCisJCShXZSB1c2UgYSBkaWZmZXJlbnQgYml0IGFzc2lnbm1lbnQgZm9yIGhpZ2ggc3BlZWQuKS4gIENsZWFyIHRoaXMKKwkJYml0IG91dC4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJcmVzIHw9IGNmbGFnICYgKChDQkFVRCBeIENCQVVERVgpIHwgUEFST0REIHwgUEFSRU5CIHwgQ1NUT1BCIHwgQ1NJWkUpOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGlzIGdldHMgYSBsaXR0bGUgY29uZnVzaW5nLiAgVGhlIERpZ2kgY2FyZHMgaGF2ZSB0aGVpciBvd24KKwkJcmVwcmVzZW50YXRpb24gb2YgY19jZmxhZ3MgY29udHJvbGluZyBiYXVkIHJhdGUuICBGb3IgdGhlIG1vc3QKKwkJcGFydCB0aGlzIGlzIGlkZW50aWNhbCB0byB0aGUgTGludXggaW1wbGVtZW50YXRpb24uICBIb3dldmVyOworCQlEaWdpIHN1cHBvcnRzIG9uZSByYXRlICg3NjgwMCkgdGhhdCBMaW51eCBkb2Vzbid0LiAgVGhpcyBtZWFucyAKKwkJdGhhdCB0aGUgY19jZmxhZyBlbnRyeSB0aGF0IHdvdWxkIG5vcm1hbGx5IG1lYW4gNzY4MDAgZm9yIERpZ2kKKwkJYWN0dWFsbHkgbWVhbnMgMTE1MjAwIHVuZGVyIExpbnV4LiAgV2l0aG91dCB0aGUgYmVsb3cgbWFwcGluZywKKwkJYSBzdHR5IDExNTIwMCB3b3VsZCBvbmx5IGRyaXZlIHRoZSBib2FyZCBhdCA3NjgwMC4gIFNpbmNlIAorCQl0aGUgcmF0ZSAyMzA0MDAgaXMgYWxzbyBmb3VuZCBhZnRlciA3NjgwMCwgdGhlIHNhbWUgcHJvYmxlbSBhZmZsaWN0cwkKKwkJdXMgd2hlbiB3ZSBjaG9vc2UgYSByYXRlIG9mIDIzMDQwMC4gIFdpdGhvdXQgdGhlIGJlbG93IG1vZGlmaWNpYXRpb24KKwkJc3R0eSAyMzA0MDAgd291bGQgYWN0dWFsbHkgZ2l2ZSB1cyAxMTUyMDAuCisKKwkJVGhlcmUgYXJlIHR3byBhZGRpdGlvbmFsIGRpZmZlcmVuY2VzLiAgVGhlIExpbnV4IHZhbHVlIGZvciBDTE9DQUwKKwkJKDB4ODAwOyAwMDA0MDAwKSBoYXMgbm8gbWVhbmluZyB0byB0aGUgRGlnaSBoYXJkd2FyZS4gIEFsc28gaW4gCisJCWxhdGVyIHJlbGVhc2VzIG9mIExpbnV4OyB0aGUgQ0JBVUQgZGVmaW5lIGhhcyBDQkFVREVYICgweDEwMDA7CisJCTAwMTAwMDApIG9yZWQgaW50byBpdCAoQ0JBVUQgPSAweDEwMGYgYXMgb3Bwb3NlZCB0byAweGYpLiBDQkFVREVYCisJCXNob3VsZCBiZSBjaGVja2VkIGZvciBhIHNjcmVlbmVkIG91dCBwcmlvciB0byB0ZXJtaW9zMmRpZ2lfYyAKKwkJcmV0dXJuaW5nLiAgU2luY2UgQ0xPQ0FMIGlzbid0IHVzZWQgYnkgdGhlIGJvYXJkIHRoaXMgY2FuIGJlCisJCWlnbm9yZWQgYXMgbG9uZyBhcyB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdXNlZCBvbmx5IGJ5IERpZ2kgaGFyZHdhcmUuIAorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoY2ZsYWcgJiBDQkFVREVYKQorCXsKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJVGhlIGJlbG93IGNvZGUgaXMgdHJ5aW5nIHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYmF1ZCByYXRlcworCQkJMTE1MjAwIGFuZCAyMzA0MDAgYXJlIHJlbWFwcGVkLiAgV2UgdXNlIGV4Y2x1c2l2ZSBvciBiZWNhdXNlCisJCQl0aGUgdmFyaW91cyBiYXVkIHJhdGVzIHNoYXJlIGNvbW1vbiBiaXQgcG9zaXRpb25zIGFuZCB0aGVyZWZvcmUKKwkJCWNhbid0IGJlIHRlc3RlZCBmb3IgZWFzaWx5LgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCQkJCisJCWlmICgoISgoY2ZsYWcgJiAweDcpIF4gKEIxMTUyMDAgJiB+Q0JBVURFWCkpKSB8fCAKKwkJICAgICghKChjZmxhZyAmIDB4NykgXiAoQjIzMDQwMCAmIH5DQkFVREVYKSkpKQorCQl7CisJCQlyZXMgKz0gMTsKKwkJfQorCX0KKworCXJldHVybiByZXM7CisKK30gLyogRW5kIHRlcm1pb3MyZGlnaV9jICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBlcGNhcGFyYW0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGVwY2FwYXJhbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7IC8qIEJlZ2luIGVwY2FwYXJhbSAqLworCisJdW5zaWduZWQgaW50IGNtZEhlYWQ7CisJc3RydWN0IHRlcm1pb3MgKnRzOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwl1bnNpZ25lZCBtdmFsLCBoZmxvdywgY2ZsYWcsIGlmbGFnOworCisJYmMgPSBjaC0+YnJkY2hhbjsKKwllcGNhYXNzZXJ0KGJjICE9MCwgImJjIG91dCBvZiByYW5nZSIpOworCisJYXNzZXJ0Z3dpbm9uKGNoKTsKKworCXRzID0gdHR5LT50ZXJtaW9zOworCisJaWYgKCh0cy0+Y19jZmxhZyAmIENCQVVEKSA9PSAwKSAKKwl7IC8qIEJlZ2luIENCQVVEIGRldGVjdGVkICovCisKKwkJY21kSGVhZCA9IGJjLT5yaW47CisJCWJjLT5yb3V0ID0gY21kSGVhZDsKKwkJY21kSGVhZCA9IGJjLT50aW47CisKKwkJLyogQ2hhbmdpbmcgYmF1ZCBpbiBtaWQtc3RyZWFtIHRyYW5zbWlzc2lvbiBjYW4gYmUgd29uZGVyZnVsICovCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJRmx1c2ggY3VycmVudCB0cmFuc21pdCBidWZmZXIgYnkgc2V0dGluZyBjbWRUYWlsIHBvaW50ZXIgKHRvdXQpCisJCQl0byBjbWRIZWFkIHBvaW50ZXIgKHRpbikuICBIb3BlZnVsbHkgdGhlIHRyYW5zbWl0IGJ1ZmZlciBpcyBlbXB0eS4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQlmZXBjbWQoY2gsIFNUT1VULCAodW5zaWduZWQpIGNtZEhlYWQsIDAsIDAsIDApOworCQltdmFsID0gMDsKKworCX0gLyogRW5kIENCQVVEIGRldGVjdGVkICovCisJZWxzZSAKKwl7IC8qIEJlZ2luIENCQVVEIG5vdCBkZXRlY3RlZCAqLworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCWNfY2ZsYWdzIGhhdmUgY2hhbmdlZCBidXQgdGhhdCBjaGFuZ2UgaGFkIG5vdGhpbmcgdG8gZG8gd2l0aCBCQVVELgorCQkJUHJvcGFnYXRlIHRoZSBjaGFuZ2UgdG8gdGhlIGNhcmQuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCisKKwkJY2ZsYWcgPSB0ZXJtaW9zMmRpZ2lfYyhjaCwgdHMtPmNfY2ZsYWcpOworCisJCWlmIChjZmxhZyAhPSBjaC0+ZmVwY2ZsYWcpIAorCQl7CisJCQljaC0+ZmVwY2ZsYWcgPSBjZmxhZzsKKwkJCS8qIFNldCBiYXVkIHJhdGUsIGNoYXIgc2l6ZSwgc3RvcCBiaXRzLCBwYXJpdHkgKi8KKwkJCWZlcGNtZChjaCwgU0VUQ1RSTEZMQUdTLCAodW5zaWduZWQpIGNmbGFnLCAwLCAwLCAwKTsKKwkJfQorCisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSWYgdGhlIHVzZXIgaGFzIG5vdCBmb3JjZWQgQ0xPQ0FMIGFuZCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBhIAorCQkJQ0FMTE9VVCBkZXZpY2UgKFdoaWNoIGlzIGFsd2F5cyBDTE9DQUwpIHdlIHNldCBmbGFncyBzdWNoIHRoYXQKKwkJCXRoZSBkcml2ZXIgd2lsbCB3YWl0IG9uIGNhcnJpZXIgZGV0ZWN0LgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJaWYgKHRzLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQl7IC8qIEJlZ2luIGl0IGlzIGEgY3VkIGRldmljZSBvciBhIHR0eUQgZGV2aWNlIHdpdGggQ0xPQ0FMIG9uICovCisJCQljaC0+YXN5bmNmbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJCX0gLyogRW5kIGl0IGlzIGEgY3VkIGRldmljZSBvciBhIHR0eUQgZGV2aWNlIHdpdGggQ0xPQ0FMIG9uICovCisJCWVsc2UKKwkJeyAvKiBCZWdpbiBpdCBpcyBhIHR0eUQgZGV2aWNlICovCisJCQljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKwkJfSAvKiBFbmQgaXQgaXMgYSB0dHlEIGRldmljZSAqLworCisJCW12YWwgPSBjaC0+bV9kdHIgfCBjaC0+bV9ydHM7CisKKwl9IC8qIEVuZCBDQkFVRCBub3QgZGV0ZWN0ZWQgKi8KKworCWlmbGFnID0gdGVybWlvczJkaWdpX2koY2gsIHRzLT5jX2lmbGFnKTsKKworCS8qIENoZWNrIGlucHV0IG1vZGUgZmxhZ3MgKi8KKworCWlmIChpZmxhZyAhPSBjaC0+ZmVwaWZsYWcpIAorCXsKKwkJY2gtPmZlcGlmbGFnID0gaWZsYWc7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlDb21tYW5kIHNldHMgY2hhbm5lbHMgaWZsYWcgc3RydWN0dXJlIG9uIHRoZSBib2FyZC4gU3VjaCB0aGluZ3MgCisJCQlhcyBpbnB1dCBzb2Z0IGZsb3cgY29udHJvbCwgaGFuZGxpbmcgb2YgcGFyaXR5IGVycm9ycywgYW5kCisJCQlicmVhayBoYW5kbGluZyBhcmUgYWxsIHNldCBoZXJlLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJLyogYnJlYWsgaGFuZGxpbmcsIHBhcml0eSBoYW5kbGluZywgaW5wdXQgc3RyaXBwaW5nLCBmbG93IGNvbnRyb2wgY2hhcnMgKi8KKwkJZmVwY21kKGNoLCBTRVRJRkxBR1MsICh1bnNpZ25lZCBpbnQpIGNoLT5mZXBpZmxhZywgMCwgMCwgMCk7CisJfQorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVNldCB0aGUgYm9hcmQgbWludCB2YWx1ZSBmb3IgdGhpcyBjaGFubmVsLiAgVGhpcyB3aWxsIGNhdXNlIGhhcmR3YXJlCisJCWV2ZW50cyB0byBiZSBnZW5lcmF0ZWQgZWFjaCB0aW1lIHRoZSBEQ0Qgc2lnbmFsIChEZXNjcmliZWQgaW4gbWludCkgCisJCWNoYW5nZXMuCQorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwliYy0+bWludCA9IGNoLT5kY2Q7CisKKwlpZiAoKHRzLT5jX2NmbGFnICYgQ0xPQ0FMKSB8fCAoY2gtPmRpZ2lleHQuZGlnaV9mbGFncyAmIERJR0lfRk9SQ0VEQ0QpKQorCQlpZiAoY2gtPmRpZ2lleHQuZGlnaV9mbGFncyAmIERJR0lfRk9SQ0VEQ0QpCisJCQliYy0+bWludCA9IDA7CisKKwljaC0+aW1vZGVtID0gYmMtPm1zdGF0OworCisJaGZsb3cgPSB0ZXJtaW9zMmRpZ2lfaChjaCwgdHMtPmNfY2ZsYWcpOworCisJaWYgKGhmbG93ICE9IGNoLT5oZmxvdykgCisJeworCQljaC0+aGZsb3cgPSBoZmxvdzsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSGFyZCBmbG93IGNvbnRyb2wgaGFzIGJlZW4gc2VsZWN0ZWQgYnV0IHRoZSBib2FyZCBpcyBub3QKKwkJCXVzaW5nIGl0LiAgQWN0aXZhdGUgaGFyZCBmbG93IGNvbnRyb2wgbm93LgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWZlcGNtZChjaCwgU0VUSEZMT1csIGhmbG93LCAweGZmLCAwLCAxKTsKKwl9CisJCisKKwltdmFsIF49IGNoLT5tb2RlbWZha2UgJiAobXZhbCBeIGNoLT5tb2RlbSk7CisKKwlpZiAoY2gtPm9tb2RlbSBeIG12YWwpIAorCXsKKwkJY2gtPm9tb2RlbSA9IG12YWw7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCVRoZSBiZWxvdyBjb21tYW5kIHNldHMgdGhlIERUUiBhbmQgUlRTIG1zdGF0IHN0cnVjdHVyZS4gIElmCisJCQloYXJkIGZsb3cgY29udHJvbCBpcyBOT1QgYWN0aXZlIHRoZXNlIGNoYW5nZXMgd2lsbCBkcml2ZSB0aGUKKwkJCW91dHB1dCBvZiB0aGUgYWN0dWFsIERUUiBhbmQgUlRTIGxpbmVzLiAgSWYgaGFyZCBmbG93IGNvbnRyb2wgCisJCQlpcyBhY3RpdmUsIHRoZSBjaGFuZ2VzIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIG1zdGF0IHN0cnVjdHVyZSBhbmQKKwkJCW9ubHkgYXNzZXJ0ZWQgd2hlbiBoYXJkIGZsb3cgY29udHJvbCBpcyB0dXJuZWQgb2ZmLiAKKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQkvKiBGaXJzdCByZXNldCBEVFIgJiBSVFM7IHRoZW4gc2V0IHRoZW0gKi8KKwkJZmVwY21kKGNoLCBTRVRNT0RFTSwgMCwgKChjaC0+bV9kdHIpfChjaC0+bV9ydHMpKSwgMCwgMSk7CisJCWZlcGNtZChjaCwgU0VUTU9ERU0sIG12YWwsIDAsIDAsIDEpOworCisJfQorCisJaWYgKGNoLT5zdGFydGMgIT0gY2gtPmZlcHN0YXJ0YyB8fCBjaC0+c3RvcGMgIT0gY2gtPmZlcHN0b3BjKSAKKwl7CisJCWNoLT5mZXBzdGFydGMgPSBjaC0+c3RhcnRjOworCQljaC0+ZmVwc3RvcGMgPSBjaC0+c3RvcGM7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlUaGUgWE9OIC8gWE9GRiBjaGFyYWN0ZXJzIGhhdmUgY2hhbmdlZDsgcHJvcGFnYXRlIHRoZXNlCisJCQljaGFuZ2VzIHRvIHRoZSBjYXJkLgkKKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJZmVwY21kKGNoLCBTT05PRkZDLCBjaC0+ZmVwc3RhcnRjLCBjaC0+ZmVwc3RvcGMsIDAsIDEpOworCX0KKworCWlmIChjaC0+c3RhcnRjYSAhPSBjaC0+ZmVwc3RhcnRjYSB8fCBjaC0+c3RvcGNhICE9IGNoLT5mZXBzdG9wY2EpIAorCXsKKwkJY2gtPmZlcHN0YXJ0Y2EgPSBjaC0+c3RhcnRjYTsKKwkJY2gtPmZlcHN0b3BjYSA9IGNoLT5zdG9wY2E7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlTaW1pbGFyIHRvIHRoZSBhYm92ZSwgdGhpcyB0aW1lIHRoZSBhdXhpbGFybHkgWE9OIC8gWE9GRiAKKwkJCWNoYXJhY3RlcnMgaGF2ZSBjaGFuZ2VkOyBwcm9wYWdhdGUgdGhlc2UgY2hhbmdlcyB0byB0aGUgY2FyZC4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJZmVwY21kKGNoLCBTQVVYT05PRkZDLCBjaC0+ZmVwc3RhcnRjYSwgY2gtPmZlcHN0b3BjYSwgMCwgMSk7CisJfQorCit9IC8qIEVuZCBlcGNhcGFyYW0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHJlY2VpdmVfZGF0YSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcmVjZWl2ZV9kYXRhKHN0cnVjdCBjaGFubmVsICpjaCkKK3sgLyogQmVnaW4gcmVjZWl2ZV9kYXRhICovCisKKwl1bmNoYXIgKnJwdHI7CisJc3RydWN0IHRlcm1pb3MgKnRzID0gTlVMTDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwlyZWdpc3RlciBpbnQgZGF0YVRvUmVhZCwgd3JhcGdhcCwgYnl0ZXNBdmFpbGFibGU7CisJcmVnaXN0ZXIgdW5zaWduZWQgaW50IHRhaWwsIGhlYWQ7CisJdW5zaWduZWQgaW50IHdyYXBtYXNrOworCWludCByYzsKKworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgZG9pbnQgd2hlbiBhIHJlY2VpdmUgZGF0YSBldmVudCAKKwkJaGFzIHRha2VuIHBsYWNlLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWdsb2JhbHdpbm9uKGNoKTsKKworCWlmIChjaC0+c3RhdHVzZmxhZ3MgJiBSWFNUT1BQRUQpCisJCXJldHVybjsKKworCXR0eSA9IGNoLT50dHk7CisJaWYgKHR0eSkKKwkJdHMgPSB0dHktPnRlcm1pb3M7CisKKwliYyA9IGNoLT5icmRjaGFuOworCisJaWYgKCFiYykgCisJeworCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBiYyBpcyBOVUxMIGluIHJlY2VpdmVfZGF0YSFcbiIpOworCQlyZXR1cm47CisJfQorCisJd3JhcG1hc2sgPSBjaC0+cnhidWZzaXplIC0gMTsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKwkJR2V0IHRoZSBoZWFkIGFuZCB0YWlsIHBvaW50ZXJzIHRvIHRoZSByZWNlaXZlciBxdWV1ZS4gIFdyYXAgdGhlIAorCQloZWFkIHBvaW50ZXIgaWYgaXQgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaGVhZCA9IGJjLT5yaW47CisJaGVhZCAmPSB3cmFwbWFzazsKKwl0YWlsID0gYmMtPnJvdXQgJiB3cmFwbWFzazsKKworCWJ5dGVzQXZhaWxhYmxlID0gKGhlYWQgLSB0YWlsKSAmIHdyYXBtYXNrOworCisJaWYgKGJ5dGVzQXZhaWxhYmxlID09IDApCisJCXJldHVybjsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgIElmIENSRUFEIGJpdCBpcyBvZmYgb3IgZGV2aWNlIG5vdCBvcGVuLCBzZXQgVFggdGFpbCB0byBoZWFkCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoIXR0eSB8fCAhdHMgfHwgISh0cy0+Y19jZmxhZyAmIENSRUFEKSkgCisJeworCQliYy0+cm91dCA9IGhlYWQ7CisJCXJldHVybjsKKwl9CisKKwlpZiAodHR5LT5mbGlwLmNvdW50ID09IFRUWV9GTElQQlVGX1NJWkUpIAorCQlyZXR1cm47CisKKwlpZiAoYmMtPm9ydW4pIAorCXsKKwkJYmMtPm9ydW4gPSAwOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvdmVycnVuISBEaWdpQm9hcmQgZGV2aWNlICVzXG4iLHR0eS0+bmFtZSk7CisJfQorCisJcnh3aW5vbihjaCk7CisJcnB0ciA9IHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHI7CisJcmMgPSB0dHktPmZsaXAuY291bnQ7CisKKwl3aGlsZSAoYnl0ZXNBdmFpbGFibGUgPiAwKSAKKwl7IC8qIEJlZ2luIHdoaWxlIHRoZXJlIGlzIGRhdGEgb24gdGhlIGNhcmQgKi8KKworCQl3cmFwZ2FwID0gKGhlYWQgPj0gdGFpbCkgPyBoZWFkIC0gdGFpbCA6IGNoLT5yeGJ1ZnNpemUgLSB0YWlsOworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJRXZlbiBpZiBoZWFkIGhhcyB3cmFwcGVkIGFyb3VuZCBvbmx5IHJlcG9ydCB0aGUgYW1vdW50IG9mCisJCQlkYXRhIHRvIGJlIGVxdWFsIHRvIHRoZSBzaXplIC0gdGFpbC4gIFJlbWVtYmVyIG1lbWNweSBjYW4ndAorCQkJYXV0b21hdGljbHkgd3JhcCBhcm91bmQgdGhlIHJlY2VpdmUgYnVmZmVyLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWRhdGFUb1JlYWQgPSAod3JhcGdhcCA8IGJ5dGVzQXZhaWxhYmxlKSA/IHdyYXBnYXAgOiBieXRlc0F2YWlsYWJsZTsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgICBNYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlIGJ1ZmZlcgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWlmICgocmMgKyBkYXRhVG9SZWFkKSA+IFRUWV9GTElQQlVGX1NJWkUpCisJCQlkYXRhVG9SZWFkID0gVFRZX0ZMSVBCVUZfU0laRSAtIHJjOworCisJCWlmIChkYXRhVG9SZWFkID09IDApCisJCQlicmVhazsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCU1vdmUgZGF0YSByZWFkIGZyb20gb3VyIGNhcmQgaW50byB0aGUgbGluZSBkaXNjaXBsaW5lcyBidWZmZXIKKwkJCWZvciB0cmFuc2xhdGlvbiBpZiBuZWNlc3NhcnkuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWlmICgobWVtY3B5KHJwdHIsIGNoLT5yeHB0ciArIHRhaWwsIGRhdGFUb1JlYWQpKSAhPSBycHRyKQorCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcmVjZWl2ZV9kYXRhIDogbWVtY3B5IGZhaWxlZFxuIik7CisJCQkKKwkJcmMgICArPSBkYXRhVG9SZWFkOworCQlycHRyICs9IGRhdGFUb1JlYWQ7CisJCXRhaWwgPSAodGFpbCArIGRhdGFUb1JlYWQpICYgd3JhcG1hc2s7CisJCWJ5dGVzQXZhaWxhYmxlIC09IGRhdGFUb1JlYWQ7CisKKwl9IC8qIEVuZCB3aGlsZSB0aGVyZSBpcyBkYXRhIG9uIHRoZSBjYXJkICovCisKKworCXR0eS0+ZmxpcC5jb3VudCA9IHJjOworCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBycHRyOworCWdsb2JhbHdpbm9uKGNoKTsKKwliYy0+cm91dCA9IHRhaWw7CisKKwkvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGdsb2JhbCBkYXRhICovCisJdHR5X3NjaGVkdWxlX2ZsaXAoY2gtPnR0eSk7IAorCXJldHVybjsKKworfSAvKiBFbmQgcmVjZWl2ZV9kYXRhICovCisKK3N0YXRpYyBpbnQgaW5mb19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzd2l0Y2ggKGNtZCkgCisJeyAvKiBCZWdpbiBzd2l0Y2ggY21kICovCisKKwkJY2FzZSBESUdJX0dFVElORk86CisJCXsgLyogQmVnaW4gY2FzZSBESUdJX0dFVElORk8gKi8KKworCQkJc3RydWN0IGRpZ2lfaW5mbyBkaSA7CisJCQlpbnQgYnJkOworCisJCQlnZXRVc2VyKGJyZCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpOworCisJCQlpZiAoKGJyZCA8IDApIHx8IChicmQgPj0gbnVtX2NhcmRzKSB8fCAobnVtX2NhcmRzID09IDApKQorCQkJCXJldHVybiAoLUVOT0RFVik7CisKKwkJCW1lbXNldCgmZGksIDAsIHNpemVvZihkaSkpOworCisJCQlkaS5ib2FyZCA9IGJyZCA7IAorCQkJZGkuc3RhdHVzID0gYm9hcmRzW2JyZF0uc3RhdHVzOworCQkJZGkudHlwZSA9IGJvYXJkc1ticmRdLnR5cGUgOworCQkJZGkubnVtcG9ydHMgPSBib2FyZHNbYnJkXS5udW1wb3J0cyA7CisJCQlkaS5wb3J0ID0gYm9hcmRzW2JyZF0ucG9ydCA7CisJCQlkaS5tZW1iYXNlID0gYm9hcmRzW2JyZF0ubWVtYmFzZSA7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmZGksIHNpemVvZiAoZGkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCX0gLyogRW5kIGNhc2UgRElHSV9HRVRJTkZPICovCisKKwkJY2FzZSBESUdJX1BPTExFUjoKKwkJeyAvKiBCZWdpbiBjYXNlIERJR0lfUE9MTEVSICovCisKKwkJCWludCBicmQgPSBhcmcgJiAweGZmMDAwMDAwID4+IDE2IDsgCisJCQl1bnNpZ25lZCBjaGFyIHN0YXRlID0gYXJnICYgMHhmZiA7IAorCisJCQlpZiAoKGJyZCA8IDApIHx8IChicmQgPj0gbnVtX2NhcmRzKSkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBESUdJIFBPTExFUiA6IGJyZCBub3QgdmFsaWQhXG4iKTsKKwkJCQlyZXR1cm4gKC1FTk9ERVYpOworCQkJfQorCisJCQlkaWdpX3BvbGxlcl9pbmhpYml0ZWQgPSBzdGF0ZSA7CisJCQlicmVhayA7IAorCisJCX0gLyogRW5kIGNhc2UgRElHSV9QT0xMRVIgKi8KKworCQljYXNlIERJR0lfSU5JVDoKKwkJeyAvKiBCZWdpbiBjYXNlIERJR0lfSU5JVCAqLworCisJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlUaGlzIGNhbGwgaXMgbWFkZSBieSB0aGUgYXBwcyB0byBjb21wbGV0ZSB0aGUgaW5pdGlsaXphdGlvbgorCQkJCW9mIHRoZSBib2FyZChzKS4gIFRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZworCQkJCXRoZSBjYXJkIHRvIGl0cyBpbml0aWFsIHN0YXRlIGFuZCBzZXR0aW5nIHRoZSBkcml2ZXJzIGNvbnRyb2wKKwkJCQlmaWVsZHMgdG8gdGhlIHN1dGlhbmxlIHNldHRpbmdzIGZvciB0aGUgY2FyZCBpbiBxdWVzdGlvbi4KKwkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkJCisJCQlpbnQgY3JkIDsgCisJCQlmb3IgKGNyZCA9IDA7IGNyZCA8IG51bV9jYXJkczsgY3JkKyspIAorCQkJCXBvc3RfZmVwX2luaXQgKGNyZCk7CisKKwkJCWJyZWFrIDsgCisKKwkJfSAvKiBFbmQgY2FzZSBESUdJX0lOSVQgKi8KKworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJfSAvKiBFbmQgc3dpdGNoIGNtZCAqLworCXJldHVybiAoMCkgOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX2lvY3RsICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHBjX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwl1bnNpZ25lZCBpbnQgbXN0YXQsIG1mbGFnID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNoKQorCQliYyA9IGNoLT5icmRjaGFuOworCWVsc2UKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGNoIGlzIE5VTEwgaW4gcGNfdGlvY21nZXQhXG4iKTsKKwkJcmV0dXJuKC1FSU5WQUwpOworCX0KKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWdsb2JhbHdpbm9uKGNoKTsKKwltc3RhdCA9IGJjLT5tc3RhdDsKKwltZW1vZmYoY2gpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJaWYgKG1zdGF0ICYgY2gtPm1fZHRyKQorCQltZmxhZyB8PSBUSU9DTV9EVFI7CisKKwlpZiAobXN0YXQgJiBjaC0+bV9ydHMpCisJCW1mbGFnIHw9IFRJT0NNX1JUUzsKKworCWlmIChtc3RhdCAmIGNoLT5tX2N0cykKKwkJbWZsYWcgfD0gVElPQ01fQ1RTOworCisJaWYgKG1zdGF0ICYgY2gtPmRzcikKKwkJbWZsYWcgfD0gVElPQ01fRFNSOworCisJaWYgKG1zdGF0ICYgY2gtPm1fcmkpCisJCW1mbGFnIHw9IFRJT0NNX1JJOworCisJaWYgKG1zdGF0ICYgY2gtPmRjZCkKKwkJbWZsYWcgfD0gVElPQ01fQ0Q7CisKKwlyZXR1cm4gbWZsYWc7Cit9CisKK3N0YXRpYyBpbnQgcGNfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghY2gpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gY2ggaXMgTlVMTCBpbiBwY190aW9jbXNldCFcbiIpOworCQlyZXR1cm4oLUVJTlZBTCk7CisJfQorCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJLyoKKwkgKiBJIHRoaW5rIHRoaXMgbW9kZW1mYWtlIHN0dWZmIGlzIGJyb2tlbi4gIEl0IGRvZXNuJ3QKKwkgKiBjb3JyZWN0bHkgcmVmbGVjdCB0aGUgYmVoYXZpb3VyIGRlc2lyZWQgYnkgdGhlIFRJT0NNKgorCSAqIGlvY3Rscy4gIFRoZXJlZm9yZSB0aGlzIGlzIHByb2JhYmx5IGJyb2tlbi4KKwkgKi8KKwlpZiAoc2V0ICYgVElPQ01fUlRTKSB7CisJCWNoLT5tb2RlbWZha2UgfD0gY2gtPm1fcnRzOworCQljaC0+bW9kZW0gfD0gY2gtPm1fcnRzOworCX0KKwlpZiAoc2V0ICYgVElPQ01fRFRSKSB7CisJCWNoLT5tb2RlbWZha2UgfD0gY2gtPm1fZHRyOworCQljaC0+bW9kZW0gfD0gY2gtPm1fZHRyOworCX0KKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpIHsKKwkJY2gtPm1vZGVtZmFrZSB8PSBjaC0+bV9ydHM7CisJCWNoLT5tb2RlbSAmPSB+Y2gtPm1fcnRzOworCX0KKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpIHsKKwkJY2gtPm1vZGVtZmFrZSB8PSBjaC0+bV9kdHI7CisJCWNoLT5tb2RlbSAmPSB+Y2gtPm1fZHRyOworCX0KKworCWdsb2JhbHdpbm9uKGNoKTsKKworCS8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGUgYmVsb3cgcm91dGluZSBnZW5lcmFsbHkgc2V0cyB1cCBwYXJpdHksIGJhdWQsIGZsb3cgY29udHJvbAorCQlpc3N1ZXMsIGV0Yy4uLi4gSXQgZWZmZWN0IGJvdGggY29udHJvbCBmbGFncyBhbmQgaW5wdXQgZmxhZ3MuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwllcGNhcGFyYW0odHR5LGNoKTsKKwltZW1vZmYoY2gpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreyAvKiBCZWdpbiBwY19pb2N0bCAqLworCisJZGlnaWZsb3dfdCBkZmxvdzsKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1mbGFnLCBtc3RhdDsKKwl1bnNpZ25lZCBjaGFyIHN0YXJ0Yywgc3RvcGM7CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCQorCWlmIChjaCkKKwkJYmMgPSBjaC0+YnJkY2hhbjsKKwllbHNlIAorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gY2ggaXMgTlVMTCBpbiBwY19pb2N0bCFcbiIpOworCQlyZXR1cm4oLUVJTlZBTCk7CisJfQorCisJc2F2ZV9mbGFncyhmbGFncyk7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCUZvciBQT1NJWCBjb21wbGlhbmNlIHdlIG5lZWQgdG8gYWRkIG1vcmUgaW9jdGxzLiAgU2VlIHR0eV9pb2N0bC5jCisJCWluIC91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvY2hhciBmb3IgYSBnb29kIGV4YW1wbGUuICBJbiBwYXJ0aWN1bGFyIAorCQl0aGluayBhYm91dCBhZGRpbmcgVENTRVRBRiwgVENTRVRBVywgVENTRVRBLCBUQ1NFVFNGLCBUQ1NFVFNXLCBUQ1NFVFMuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJc3dpdGNoIChjbWQpIAorCXsgLyogQmVnaW4gc3dpdGNoIGNtZCAqLworCisJCWNhc2UgVENHRVRTOgorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAKKwkJCQkJIHR0eS0+dGVybWlvcywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4oMCk7CisKKwkJY2FzZSBUQ0dFVEE6CisJCQlyZXR1cm4gZ2V0X3Rlcm1pbyh0dHksIGFyZ3ApOworCisJCWNhc2UgVENTQlJLOgkvKiBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsgKi8KKworCQkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQkJaWYgKHJldHZhbCkKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQkvKiBTZXR1cCBhbiBldmVudCB0byBpbmRpY2F0ZSB3aGVuIHRoZSB0cmFuc21pdCBidWZmZXIgZW1wdGllcyAqLworCisJCQlzZXR1cF9lbXB0eV9ldmVudCh0dHksY2gpOwkJCisJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCQlpZiAoIWFyZykKKwkJCQlkaWdpX3NlbmRfYnJlYWsoY2gsIEhaLzQpOyAgICAvKiAxLzQgc2Vjb25kICovCisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDU0JSS1A6CS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KKworCQkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQkJaWYgKHJldHZhbCkKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQkvKiBTZXR1cCBhbiBldmVudCB0byBpbmRpY2F0ZSB3aGVuIHRoZSB0cmFuc21pdCBidWZmZXIgZW1wdGllcyAqLworCisJCQlzZXR1cF9lbXB0eV9ldmVudCh0dHksY2gpOwkJCisJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCQlkaWdpX3NlbmRfYnJlYWsoY2gsIGFyZyA/IGFyZyooSFovMTApIDogSFovNCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRJT0NHU09GVENBUjoKKwkJCWlmIChwdXRfdXNlcihDX0NMT0NBTCh0dHkpPzE6MCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgVElPQ1NTT0ZUQ0FSOgorCQl7CisJCQl1bnNpZ25lZCBpbnQgdmFsdWU7CisKKwkJCWlmIChnZXRfdXNlcih2YWx1ZSwgKHVuc2lnbmVkIF9fdXNlciAqKWFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0KKwkJCQkoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpIHwKKwkJCQkgKHZhbHVlID8gQ0xPQ0FMIDogMCkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFRJT0NNT0RHOgorCQkJbWZsYWcgPSBwY190aW9jbWdldCh0dHksIGZpbGUpOworCQkJaWYgKHB1dF91c2VyKG1mbGFnLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgVElPQ01PRFM6CisJCQlpZiAoZ2V0X3VzZXIobXN0YXQsICh1bnNpZ25lZCBfX3VzZXIgKilhcmdwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiBwY190aW9jbXNldCh0dHksIGZpbGUsIG1zdGF0LCB+bXN0YXQpOworCisJCWNhc2UgVElPQ1NEVFI6CisJCQljaC0+b21vZGVtIHw9IGNoLT5tX2R0cjsKKwkJCWNsaSgpOworCQkJZ2xvYmFsd2lub24oY2gpOworCQkJZmVwY21kKGNoLCBTRVRNT0RFTSwgY2gtPm1fZHRyLCAwLCAxMCwgMSk7CisJCQltZW1vZmYoY2gpOworCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIFRJT0NDRFRSOgorCQkJY2gtPm9tb2RlbSAmPSB+Y2gtPm1fZHRyOworCQkJY2xpKCk7CisJCQlnbG9iYWx3aW5vbihjaCk7CisJCQlmZXBjbWQoY2gsIFNFVE1PREVNLCAwLCBjaC0+bV9kdHIsIDEwLCAxKTsKKwkJCW1lbW9mZihjaCk7CisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElHSV9HRVRBOgorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2gtPmRpZ2lleHQsIHNpemVvZihkaWdpX3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgRElHSV9TRVRBVzoKKwkJY2FzZSBESUdJX1NFVEFGOgorCQkJaWYgKChjbWQpID09IChESUdJX1NFVEFXKSkgCisJCQl7CisJCQkJLyogU2V0dXAgYW4gZXZlbnQgdG8gaW5kaWNhdGUgd2hlbiB0aGUgdHJhbnNtaXQgYnVmZmVyIGVtcHRpZXMgKi8KKworCQkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSxjaCk7CQkKKwkJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCQl9CisJCQllbHNlIAorCQkJeworCQkJCS8qIGxkaXNjIGxvY2sgYWxyZWFkeSBoZWxkIGluIGlvY3RsICovCisJCQkJaWYgKHR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyKQorCQkJCQl0dHktPmxkaXNjLmZsdXNoX2J1ZmZlcih0dHkpOworCQkJfQorCisJCQkvKiBGYWxsIFRocnUgKi8KKworCQljYXNlIERJR0lfU0VUQToKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmY2gtPmRpZ2lleHQsIGFyZ3AsIHNpemVvZihkaWdpX3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQorCQkJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBESUdJX0FMVFBJTikgCisJCQl7CisJCQkJY2gtPmRjZCA9IGNoLT5tX2RzcjsKKwkJCQljaC0+ZHNyID0gY2gtPm1fZGNkOworCQkJfSAKKwkJCWVsc2UgCisJCQl7CisJCQkJY2gtPmRjZCA9IGNoLT5tX2RjZDsKKwkJCQljaC0+ZHNyID0gY2gtPm1fZHNyOworCQkJfQorCQkKKwkJCWNsaSgpOworCQkJZ2xvYmFsd2lub24oY2gpOworCisJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCVRoZSBiZWxvdyByb3V0aW5lIGdlbmVyYWxseSBzZXRzIHVwIHBhcml0eSwgYmF1ZCwgZmxvdyBjb250cm9sIAorCQkJCWlzc3VlcywgZXRjLi4uLiBJdCBlZmZlY3QgYm90aCBjb250cm9sIGZsYWdzIGFuZCBpbnB1dCBmbGFncy4KKwkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQkJZXBjYXBhcmFtKHR0eSxjaCk7CisJCQltZW1vZmYoY2gpOworCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIERJR0lfR0VURkxPVzoKKwkJY2FzZSBESUdJX0dFVEFGTE9XOgorCQkJY2xpKCk7CQorCQkJZ2xvYmFsd2lub24oY2gpOworCQkJaWYgKChjbWQpID09IChESUdJX0dFVEZMT1cpKSAKKwkJCXsKKwkJCQlkZmxvdy5zdGFydGMgPSBiYy0+c3RhcnRjOworCQkJCWRmbG93LnN0b3BjID0gYmMtPnN0b3BjOworCQkJfQorCQkJZWxzZSAKKwkJCXsKKwkJCQlkZmxvdy5zdGFydGMgPSBiYy0+c3RhcnRjYTsKKwkJCQlkZmxvdy5zdG9wYyA9IGJjLT5zdG9wY2E7CisJCQl9CisJCQltZW1vZmYoY2gpOworCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmRmbG93LCBzaXplb2YoZGZsb3cpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgRElHSV9TRVRBRkxPVzoKKwkJY2FzZSBESUdJX1NFVEZMT1c6CisJCQlpZiAoKGNtZCkgPT0gKERJR0lfU0VURkxPVykpIAorCQkJeworCQkJCXN0YXJ0YyA9IGNoLT5zdGFydGM7CisJCQkJc3RvcGMgPSBjaC0+c3RvcGM7CisJCQl9IAorCQkJZWxzZSAKKwkJCXsKKwkJCQlzdGFydGMgPSBjaC0+c3RhcnRjYTsKKwkJCQlzdG9wYyA9IGNoLT5zdG9wY2E7CisJCQl9CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmZGZsb3csIGFyZ3AsIHNpemVvZihkZmxvdykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAoZGZsb3cuc3RhcnRjICE9IHN0YXJ0YyB8fCBkZmxvdy5zdG9wYyAhPSBzdG9wYykgCisJCQl7IC8qIEJlZ2luICBpZiBzZXRmbG93IHRvZ2dsZWQgKi8KKwkJCQljbGkoKTsKKwkJCQlnbG9iYWx3aW5vbihjaCk7CisKKwkJCQlpZiAoKGNtZCkgPT0gKERJR0lfU0VURkxPVykpIAorCQkJCXsKKwkJCQkJY2gtPmZlcHN0YXJ0YyA9IGNoLT5zdGFydGMgPSBkZmxvdy5zdGFydGM7CisJCQkJCWNoLT5mZXBzdG9wYyA9IGNoLT5zdG9wYyA9IGRmbG93LnN0b3BjOworCQkJCQlmZXBjbWQoY2gsIFNPTk9GRkMsIGNoLT5mZXBzdGFydGMsIGNoLT5mZXBzdG9wYywgMCwgMSk7CisJCQkJfSAKKwkJCQllbHNlIAorCQkJCXsKKwkJCQkJY2gtPmZlcHN0YXJ0Y2EgPSBjaC0+c3RhcnRjYSA9IGRmbG93LnN0YXJ0YzsKKwkJCQkJY2gtPmZlcHN0b3BjYSAgPSBjaC0+c3RvcGNhID0gZGZsb3cuc3RvcGM7CisJCQkJCWZlcGNtZChjaCwgU0FVWE9OT0ZGQywgY2gtPmZlcHN0YXJ0Y2EsIGNoLT5mZXBzdG9wY2EsIDAsIDEpOworCQkJCX0KKworCQkJCWlmCShjaC0+c3RhdHVzZmxhZ3MgJiBUWFNUT1BQRUQpCisJCQkJCXBjX3N0YXJ0KHR0eSk7CisKKwkJCQltZW1vZmYoY2gpOworCQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJCQl9IC8qIEVuZCBpZiBzZXRmbG93IHRvZ2dsZWQgKi8KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJfSAvKiBFbmQgc3dpdGNoIGNtZCAqLworCisJcmV0dXJuIDA7CisKK30gLyogRW5kIHBjX2lvY3RsICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19zZXRfdGVybWlvcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcGNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreyAvKiBCZWdpbiBwY19zZXRfdGVybWlvcyAqLworCisJc3RydWN0IGNoYW5uZWwgKmNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKKwkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKKwl7IC8qIEJlZ2luIGlmIGNoYW5uZWwgdmFsaWQgKi8KKworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJY2xpKCk7CisJCWdsb2JhbHdpbm9uKGNoKTsKKwkJZXBjYXBhcmFtKHR0eSwgY2gpOworCQltZW1vZmYoY2gpOworCisJCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgorCQkJICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgPT0gMCkpCisJCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCisJCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAmJgorCQkJICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKKworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCX0gLyogRW5kIGlmIGNoYW5uZWwgdmFsaWQgKi8KKworfSAvKiBFbmQgcGNfc2V0X3Rlcm1pb3MgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGRvX3NvZnRpbnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGRvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCit7IC8qIEJlZ2luIGRvX3NvZnRpbnQgKi8KKworCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSBwcml2YXRlXzsKKwkKKworCS8qIENhbGxlZCBpbiByZXNwb25zZSB0byBhIG1vZGVtIGNoYW5nZSBldmVudCAqLworCisJaWYgKGNoICYmIGNoLT5tYWdpYyA9PSBFUENBX01BR0lDKSAKKwl7IC8qIEJlZ2luIEVQQ0FfTUFHSUMgKi8KKworCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gY2gtPnR0eTsKKworCQlpZiAodHR5ICYmIHR0eS0+ZHJpdmVyX2RhdGEpIAorCQl7IAorCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChFUENBX0VWRU5UX0hBTkdVUCwgJmNoLT5ldmVudCkpIAorCQkJeyAvKiBCZWdpbiBpZiBjbGVhcl9iaXQgKi8KKworCQkJCXR0eV9oYW5ndXAodHR5KTsJLyogRklYTUU6IG1vZHVsZSByZW1vdmFsIHJhY2UgaGVyZSAtIEFLUE0gKi8KKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5vcGVuX3dhaXQpOworCQkJCWNoLT5hc3luY2ZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOworCisJCQl9IC8qIEVuZCBpZiBjbGVhcl9iaXQgKi8KKwkJfQorCisJfSAvKiBFbmQgRVBDQV9NQUdJQyAqLworfSAvKiBFbmQgZG9fc29mdGludCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlwY19zdG9wIGFuZCBwY19zdGFydCBwcm92aWRlIHNvZnR3YXJlIGZsb3cgY29udHJvbCB0byB0aGUgCisJcm91dGluZSBhbmQgdGhlIHBjX2lvY3RsIHJvdXRpbmUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19zdG9wICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwY19zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7IC8qIEJlZ2luIHBjX3N0b3AgKi8KKworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CisJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgCisJeyAvKiBCZWdpbiBpZiB2YWxpZCBjaGFubmVsICovCisKKwkJc2F2ZV9mbGFncyhmbGFncyk7IAorCQljbGkoKTsKKworCQlpZiAoKGNoLT5zdGF0dXNmbGFncyAmIFRYU1RPUFBFRCkgPT0gMCkgCisJCXsgLyogQmVnaW4gaWYgdHJhbnNtaXQgc3RvcCByZXF1ZXN0ZWQgKi8KKworCQkJZ2xvYmFsd2lub24oY2gpOworCisJCQkvKiBTVE9QIHRyYW5zbWl0dGluZyBub3cgISEgKi8KKworCQkJZmVwY21kKGNoLCBQQVVTRVRYLCAwLCAwLCAwLCAwKTsKKworCQkJY2gtPnN0YXR1c2ZsYWdzIHw9IFRYU1RPUFBFRDsKKwkJCW1lbW9mZihjaCk7CisKKwkJfSAvKiBFbmQgaWYgdHJhbnNtaXQgc3RvcCByZXF1ZXN0ZWQgKi8KKworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCX0gLyogRW5kIGlmIHZhbGlkIGNoYW5uZWwgKi8KKworfSAvKiBFbmQgcGNfc3RvcCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfc3RhcnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHBjX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7IC8qIEJlZ2luIHBjX3N0YXJ0ICovCisKKwlzdHJ1Y3QgY2hhbm5lbCAqY2g7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKKwkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKKwl7IC8qIEJlZ2luIGlmIGNoYW5uZWwgdmFsaWQgKi8KKworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKworCQkvKiBKdXN0IGluIGNhc2Ugb3V0cHV0IHdhcyByZXN1bWVkIGJlY2F1c2Ugb2YgYSBjaGFuZ2UgaW4gRGlnaS1mbG93ICovCisJCWlmIChjaC0+c3RhdHVzZmxhZ3MgJiBUWFNUT1BQRUQpIAorCQl7IC8qIEJlZ2luIHRyYW5zbWl0IHJlc3VtZSByZXF1ZXN0ZWQgKi8KKworCQkJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCisJCQlnbG9iYWx3aW5vbihjaCk7CisJCQliYyA9IGNoLT5icmRjaGFuOworCQkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIExPV1dBSVQpCisJCQkJYmMtPmlsb3cgPSAxOworCisJCQkvKiBPa2F5LCB5b3UgY2FuIHN0YXJ0IHRyYW5zbWl0dGluZyBhZ2Fpbi4uLiAqLworCisJCQlmZXBjbWQoY2gsIFJFU1VNRVRYLCAwLCAwLCAwLCAwKTsKKworCQkJY2gtPnN0YXR1c2ZsYWdzICY9IH5UWFNUT1BQRUQ7CisJCQltZW1vZmYoY2gpOworCisJCX0gLyogRW5kIHRyYW5zbWl0IHJlc3VtZSByZXF1ZXN0ZWQgKi8KKworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCX0gLyogRW5kIGlmIGNoYW5uZWwgdmFsaWQgKi8KKworfSAvKiBFbmQgcGNfc3RhcnQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVGhlIGJlbG93IHJvdXRpbmVzIHBjX3Rocm90dGxlIGFuZCBwY191bnRocm90dGxlIGFyZSB1c2VkIAorCXRvIHNsb3cgKEFuZCByZXN1bWUpIHRoZSByZWNlaXB0IG9mIGRhdGEgaW50byB0aGUga2VybmVscworCXJlY2VpdmUgYnVmZmVycy4gIFRoZSBleGFjdCBvY2N1cnJlbmNlIG9mIHRoaXMgZGVwZW5kcyBvbiB0aGUKKwlzaXplIG9mIHRoZSBrZXJuZWxzIHJlY2VpdmUgYnVmZmVyIGFuZCB3aGF0IHRoZSAnd2F0ZXJtYXJrcycKKwlhcmUgc2V0IHRvIGZvciB0aGF0IGJ1ZmZlci4gIFNlZSB0aGUgbl90dHlzLmMgZmlsZSBmb3IgbW9yZQorCWRldGFpbHMuIAorX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHRocm90dGxlICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwY190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sgLyogQmVnaW4gcGNfdGhyb3R0bGUgKi8KKworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CisJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgCisJeyAvKiBCZWdpbiBpZiBjaGFubmVsIHZhbGlkICovCisKKworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJY2xpKCk7CisKKwkJaWYgKChjaC0+c3RhdHVzZmxhZ3MgJiBSWFNUT1BQRUQpID09IDApCisJCXsKKwkJCWdsb2JhbHdpbm9uKGNoKTsKKwkJCWZlcGNtZChjaCwgUEFVU0VSWCwgMCwgMCwgMCwgMCk7CisKKwkJCWNoLT5zdGF0dXNmbGFncyB8PSBSWFNUT1BQRUQ7CisJCQltZW1vZmYoY2gpOworCQl9CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJfSAvKiBFbmQgaWYgY2hhbm5lbCB2YWxpZCAqLworCit9IC8qIEVuZCBwY190aHJvdHRsZSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gdW50aHJvdHRsZSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcGNfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAvKiBCZWdpbiBwY191bnRocm90dGxlICovCisKKwlzdHJ1Y3QgY2hhbm5lbCAqY2g7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAorCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAorCXsgLyogQmVnaW4gaWYgY2hhbm5lbCB2YWxpZCAqLworCisKKwkJLyogSnVzdCBpbiBjYXNlIG91dHB1dCB3YXMgcmVzdW1lZCBiZWNhdXNlIG9mIGEgY2hhbmdlIGluIERpZ2ktZmxvdyAqLworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJY2xpKCk7CisKKwkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIFJYU1RPUFBFRCkgCisJCXsKKworCQkJZ2xvYmFsd2lub24oY2gpOworCQkJYmMgPSBjaC0+YnJkY2hhbjsKKwkJCWZlcGNtZChjaCwgUkVTVU1FUlgsIDAsIDAsIDAsIDApOworCisJCQljaC0+c3RhdHVzZmxhZ3MgJj0gflJYU1RPUFBFRDsKKwkJCW1lbW9mZihjaCk7CisJCX0KKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwl9IC8qIEVuZCBpZiBjaGFubmVsIHZhbGlkICovCisKK30gLyogRW5kIHBjX3VudGhyb3R0bGUgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGRpZ2lfc2VuZF9icmVhayAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBkaWdpX3NlbmRfYnJlYWsoc3RydWN0IGNoYW5uZWwgKmNoLCBpbnQgbXNlYykKK3sgLyogQmVnaW4gZGlnaV9zZW5kX2JyZWFrICovCisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJZ2xvYmFsd2lub24oY2gpOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisJICAgTWF5YmUgSSBzaG91bGQgc2VuZCBhbiBpbmZpbml0ZSBicmVhayBoZXJlLCBzY2hlZHVsZSgpIGZvcgorCSAgIG1zZWMgYW1vdW50IG9mIHRpbWUsIGFuZCB0aGVuIHN0b3AgdGhlIGJyZWFrLiAgVGhpcyB3YXksCisJICAgdGhlIHVzZXIgY2FuJ3Qgc2NyZXcgdXAgdGhlIEZFUCBieSBjYXVzaW5nIGRpZ2lfc2VuZF9icmVhaygpCisJICAgdG8gYmUgY2FsbGVkIChpLmUuIHZpYSBhbiBpb2N0bCgpKSBtb3JlIHRoYW4gb25jZSBpbiBtc2VjIGFtb3VudCAKKwkgICBvZiB0aW1lLiAgVHJ5IHRoaXMgZm9yIG5vdy4uLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJZmVwY21kKGNoLCBTRU5EQlJFQUssIG1zZWMsIDAsIDEwLCAwKTsKKwltZW1vZmYoY2gpOworCisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKK30gLyogRW5kIGRpZ2lfc2VuZF9icmVhayAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gc2V0dXBfZW1wdHlfZXZlbnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHNldHVwX2VtcHR5X2V2ZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBjaGFubmVsICpjaCkKK3sgLyogQmVnaW4gc2V0dXBfZW1wdHlfZXZlbnQgKi8KKworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYyA9IGNoLT5icmRjaGFuOworCXVuc2lnbmVkIGxvbmcgaW50IGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJZ2xvYmFsd2lub24oY2gpOworCWNoLT5zdGF0dXNmbGFncyB8PSBFTVBUWVdBSVQ7CisJCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVdoZW4gc2V0IHRoZSBpZW1wdHkgZmxhZyByZXF1ZXN0IGEgZXZlbnQgdG8gYmUgZ2VuZXJhdGVkIHdoZW4gdGhlIAorCQl0cmFuc21pdCBidWZmZXIgaXMgZW1wdHkgKElmIHRoZXJlIGlzIG5vIEJSRUFLIGluIHByb2dyZXNzKS4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWJjLT5pZW1wdHkgPSAxOworCW1lbW9mZihjaCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKK30gLyogRW5kIHNldHVwX2VtcHR5X2V2ZW50ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBnZXRfdGVybWlvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZ2V0X3Rlcm1pbyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IHRlcm1pbyBfX3VzZXIgKiB0ZXJtaW8pCit7IC8qIEJlZ2luIGdldF90ZXJtaW8gKi8KKwlyZXR1cm4ga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW8odGVybWlvLCB0dHktPnRlcm1pb3MpOworfSAvKiBFbmQgZ2V0X3Rlcm1pbyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBlcGNhX3NldHVwICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCBlcGNhX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreyAvKiBCZWdpbiBlcGNhX3NldHVwICovCisKKwlzdHJ1Y3QgYm9hcmRfaW5mbyBib2FyZDsKKwlpbnQgICAgICAgICAgICAgICBpbmRleCwgbG9vcCwgbGFzdDsKKwljaGFyICAgICAgICAgICAgICAqdGVtcCwgKnQyOworCXVuc2lnbmVkICAgICAgICAgIGxlbjsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJSWYgdGhpcyByb3V0aW5lIGxvb2tzIGEgbGl0dGxlIHN0cmFuZ2UgaXQgaXMgYmVjYXVzZSBpdCBpcyBvbmx5IGNhbGxlZAorCQlpZiBhIExJTE8gYXBwZW5kIGNvbW1hbmQgaXMgZ2l2ZW4gdG8gYm9vdCB0aGUga2VybmVsIHdpdGggcGFyYW1ldGVycy4gIAorCQlJbiB0aGlzIHdheSwgd2UgY2FuIHByb3ZpZGUgdGhlIHVzZXIgYSBtZXRob2Qgb2YgY2hhbmdpbmcgaGlzIGJvYXJkCisJCWNvbmZpZ3VyYXRpb24gd2l0aG91dCByZWJ1aWxkaW5nIHRoZSBrZXJuZWwuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlpZiAoIWxpbG9jb25maWcpIAorCQlsaWxvY29uZmlnID0gMTsgCisKKwltZW1zZXQoJmJvYXJkLCAwLCBzaXplb2YoYm9hcmQpKTsKKworCS8qIEFzc3VtZSB0aGUgZGF0YSBpcyBpbnQgZmlyc3QsIGxhdGVyIHdlIGNhbiBjaGFuZ2UgaXQgKi8KKwkvKiBJIHRoaW5rIHRoYXQgYXJyYXkgcG9zaXRpb24gMCBvZiBpbnRzIGhvbGRzIHRoZSBudW1iZXIgb2YgYXJncyAqLworCWZvciAobGFzdCA9IDAsIGluZGV4ID0gMTsgaW5kZXggPD0gaW50c1swXTsgaW5kZXgrKykKKwkJc3dpdGNoKGluZGV4KQorCQl7IC8qIEJlZ2luIHBhcnNlIHN3aXRjaCAqLworCisJCQljYXNlIDE6CisJCQkJYm9hcmQuc3RhdHVzID0gaW50c1tpbmRleF07CisJCQkJCisJCQkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCVdlIGNoZWNrIGZvciAyIChBcyBvcHBvc2VkIHRvIDE7IGJlY2F1c2UgMiBpcyBhIGZsYWcKKwkJCQkJaW5zdHJ1Y3RpbmcgdGhlIGRyaXZlciB0byBpZ25vcmUgZXBjYWNvbmZpZy4pICBGb3IgdGhpcworCQkJCQlyZWFzb24gd2UgY2hlY2sgZm9yIDIuCisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovIAorCQkJCWlmIChib2FyZC5zdGF0dXMgPT0gMikKKwkJCQl7IC8qIEJlZ2luIGlnbm9yZSBlcGNhY29uZmlnIGFzIHdlbGwgYXMgbGlsbyBjbWQgbGluZSAqLworCQkJCQluYmRldnMgPSAwOworCQkJCQludW1fY2FyZHMgPSAwOworCQkJCQlyZXR1cm47CisJCQkJfSAvKiBFbmQgaWdub3JlIGVwY2Fjb25maWcgYXMgd2VsbCBhcyBsaWxvIGNtZCBsaW5lICovCisJCisJCQkJaWYgKGJvYXJkLnN0YXR1cyA+IDIpCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGJvYXJkIHN0YXR1cyAweCV4XG4iLCBib2FyZC5zdGF0dXMpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX0JPQVJEX1NUQVRVUzsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlsYXN0ID0gaW5kZXg7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoKKwkJCQlib2FyZC50eXBlID0gaW50c1tpbmRleF07CisJCQkJaWYgKGJvYXJkLnR5cGUgPj0gUENJWEVNKSAKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgYm9hcmQgdHlwZSAweCV4XG4iLCBib2FyZC50eXBlKTsKKwkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CisJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9CT0FSRF9UWVBFOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOgorCQkJCWJvYXJkLmFsdHBpbiA9IGludHNbaW5kZXhdOworCQkJCWlmIChib2FyZC5hbHRwaW4gPiAxKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBib2FyZCBhbHRwaW4gMHgleFxuIiwgYm9hcmQuYWx0cGluKTsKKwkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CisJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9BTFRQSU47CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJbGFzdCA9IGluZGV4OworCQkJCWJyZWFrOworCisJCQljYXNlIDQ6CisJCQkJYm9hcmQubnVtcG9ydHMgPSBpbnRzW2luZGV4XTsKKwkJCQlpZiAoKGJvYXJkLm51bXBvcnRzIDwgMikgfHwgKGJvYXJkLm51bXBvcnRzID4gMjU2KSkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgYm9hcmQgbnVtcG9ydHMgMHgleFxuIiwgYm9hcmQubnVtcG9ydHMpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX05VTV9QT1JUUzsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQluYmRldnMgKz0gYm9hcmQubnVtcG9ydHM7CisJCQkJbGFzdCA9IGluZGV4OworCQkJCWJyZWFrOworCisJCQljYXNlIDU6CisJCQkJYm9hcmQucG9ydCA9ICh1bnNpZ25lZCBjaGFyICopaW50c1tpbmRleF07CisJCQkJaWYgKGludHNbaW5kZXhdIDw9IDApCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGlvIHBvcnQgMHgleFxuIiwgKHVuc2lnbmVkIGludClib2FyZC5wb3J0KTsKKwkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CisJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9QT1JUX0JBU0U7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJbGFzdCA9IGluZGV4OworCQkJCWJyZWFrOworCisJCQljYXNlIDY6CisJCQkJYm9hcmQubWVtYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopaW50c1tpbmRleF07CisJCQkJaWYgKGludHNbaW5kZXhdIDw9IDApCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIG1lbW9yeSBiYXNlIDB4JXhcbiIsKHVuc2lnbmVkIGludClib2FyZC5tZW1iYXNlKTsKKwkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CisJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9NRU1fQkFTRTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlsYXN0ID0gaW5kZXg7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogVG9vIG1hbnkgaW50ZWdlciBwYXJtc1xuIik7CisJCQkJcmV0dXJuOworCisJCX0gLyogRW5kIHBhcnNlIHN3aXRjaCAqLworCisJd2hpbGUgKHN0ciAmJiAqc3RyKSAKKwl7IC8qIEJlZ2luIHdoaWxlIHRoZXJlIGlzIGEgc3RyaW5nIGFyZyAqLworCisJCS8qIGZpbmQgdGhlIG5leHQgY29tbWEgb3IgdGVybWluYXRvciAqLworCQl0ZW1wID0gc3RyOworCisJCS8qIFdoaWxlIHN0cmluZyBpcyBub3QgbnVsbCwgYW5kIGEgY29tbWEgaGFzbid0IGJlZW4gZm91bmQgKi8KKwkJd2hpbGUgKCp0ZW1wICYmICgqdGVtcCAhPSAnLCcpKQorCQkJdGVtcCsrOworCisJCWlmICghKnRlbXApCisJCQl0ZW1wID0gTlVMTDsKKwkJZWxzZQorCQkJKnRlbXArKyA9IDA7CisKKwkJLyogU2V0IGluZGV4IHRvIHRoZSBudW1iZXIgb2YgYXJncyArIDEgKi8KKwkJaW5kZXggPSBsYXN0ICsgMTsKKworCQlzd2l0Y2goaW5kZXgpCisJCXsKKwkJCWNhc2UgMToKKwkJCQlsZW4gPSBzdHJsZW4oc3RyKTsKKwkJCQlpZiAoc3RybmNtcCgiRGlzYWJsZSIsIHN0ciwgbGVuKSA9PSAwKSAKKwkJCQkJYm9hcmQuc3RhdHVzID0gMDsKKwkJCQllbHNlCisJCQkJaWYgKHN0cm5jbXAoIkVuYWJsZSIsIHN0ciwgbGVuKSA9PSAwKQorCQkJCQlib2FyZC5zdGF0dXMgPSAxOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgc3RhdHVzICVzXG4iLCBzdHIpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX0JPQVJEX1NUQVRVUzsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlsYXN0ID0gaW5kZXg7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoKKworCQkJCWZvcihsb29wID0gMDsgbG9vcCA8IEVQQ0FfTlVNX1RZUEVTOyBsb29wKyspCisJCQkJCWlmIChzdHJjbXAoYm9hcmRfZGVzY1tsb29wXSwgc3RyKSA9PSAwKQorCQkJCQkJYnJlYWs7CisKKworCQkJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQlJZiB0aGUgaW5kZXggaW5jcmVtZW50ZWQgYWJvdmUgcmVmZXJzIHRvIGEgbGVnaXRhbWF0ZSBib2FyZCAKKwkJCQkJdHlwZSBzZXQgaXQgaGVyZS4gCisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQkJCWlmIChpbmRleCA8IEVQQ0FfTlVNX1RZUEVTKSAKKwkJCQkJYm9hcmQudHlwZSA9IGxvb3A7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBib2FyZCB0eXBlOiAlc1xuIiwgc3RyKTsKKwkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CisJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9CT0FSRF9UWVBFOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOgorCQkJCWxlbiA9IHN0cmxlbihzdHIpOworCQkJCWlmIChzdHJuY21wKCJEaXNhYmxlIiwgc3RyLCBsZW4pID09IDApIAorCQkJCQlib2FyZC5hbHRwaW4gPSAwOworCQkJCWVsc2UKKwkJCQlpZiAoc3RybmNtcCgiRW5hYmxlIiwgc3RyLCBsZW4pID09IDApCisJCQkJCWJvYXJkLmFsdHBpbiA9IDE7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBhbHRwaW4gJXNcbiIsIHN0cik7CisJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOworCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfQUxUUElOOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJY2FzZSA0OgorCQkJCXQyID0gc3RyOworCQkJCXdoaWxlIChpc2RpZ2l0KCp0MikpCisJCQkJCXQyKys7CisKKwkJCQlpZiAoKnQyKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBwb3J0IGNvdW50ICVzXG4iLCBzdHIpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX05VTV9QT1JUUzsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQlUaGVyZSBpcyBub3QgYSBtYW4gcGFnZSBmb3Igc2ltcGxlX3N0cnRvdWwgYnV0IHRoZSBjb2RlIGNhbiBiZSAKKwkJCQkJZm91bmQgaW4gdnNwcmludGYuYy4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgc3RyaW5nIHRvIAorCQkJCQl0cmFuc2xhdGUgKFRvIGFuIHVuc2lnbmVkIGxvbmcgb2J2aW91c2x5KSwgIHRoZSBzZWNvbmQgYXJndW1lbnQKKwkJCQkJY2FuIGJlIHRoZSBhZGRyZXNzIG9mIGFueSBjaGFyYWN0ZXIgdmFyaWFibGUgb3IgYSBOVUxMLiAgSWYgYQorCQkJCQl2YXJpYWJsZSBpcyBnaXZlbiwgdGhlIGVuZCBwb2ludGVyIG9mIHRoZSBzdHJpbmcgd2lsbCBiZSBzdG9yZWQgCisJCQkJCWluIHRoYXQgdmFyaWFibGU7IGlmIGEgTlVMTCBpcyBnaXZlbiB0aGUgZW5kIHBvaW50ZXIgd2lsbCAKKwkJCQkJbm90IGJlIHJldHVybmVkLiAgVGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIGJhc2UgdG8gdXNlLiAgSWYgCisJCQkJCWEgMCBpcyBpbmRpY2F0ZWQsIHRoZSByb3V0aW5lIHdpbGwgYXR0ZW1wdCB0byBkZXRlcm1pbmUgdGhlIAorCQkJCQlwcm9wZXIgYmFzZSBieSBsb29raW5nIGF0IHRoZSB2YWx1ZXMgcHJlZml4IChBICcwJyBmb3Igb2N0YWwsCisJCQkJCWEgJ3gnIGZvciBoZXgsIGV0YyAuLi4gIElmIGEgdmFsdWUgaXMgZ2l2ZW4gaXQgd2lsbCB1c2UgdGhhdCAKKwkJCQkJdmFsdWUgYXMgdGhlIGJhc2UuIAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCisJCQkJYm9hcmQubnVtcG9ydHMgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDApOworCQkJCW5iZGV2cyArPSBib2FyZC5udW1wb3J0czsKKwkJCQlsYXN0ID0gaW5kZXg7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNToKKwkJCQl0MiA9IHN0cjsKKwkJCQl3aGlsZSAoaXN4ZGlnaXQoKnQyKSkKKwkJCQkJdDIrKzsKKworCQkJCWlmICgqdDIpCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGkvbyBhZGRyZXNzICVzXG4iLCBzdHIpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX1BPUlRfQkFTRTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCWJvYXJkLnBvcnQgPSAodW5zaWduZWQgY2hhciAqKXNpbXBsZV9zdHJ0b3VsKHN0ciwgTlVMTCwgMTYpOworCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJY2FzZSA2OgorCQkJCXQyID0gc3RyOworCQkJCXdoaWxlIChpc3hkaWdpdCgqdDIpKQorCQkJCQl0MisrOworCisJCQkJaWYgKCp0MikKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgbWVtb3J5IGJhc2UgJXNcbiIsc3RyKTsKKwkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CisJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9NRU1fQkFTRTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCWJvYXJkLm1lbWJhc2UgPSAodW5zaWduZWQgY2hhciAqKXNpbXBsZV9zdHJ0b3VsKHN0ciwgTlVMTCwgMTYpOworCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgIlBDL1h4OiBUb28gbWFueSBzdHJpbmcgcGFybXNcbiIpOworCQkJCXJldHVybjsKKwkJfQorCQlzdHIgPSB0ZW1wOworCisJfSAvKiBFbmQgd2hpbGUgdGhlcmUgaXMgYSBzdHJpbmcgYXJnICovCisKKworCWlmIChsYXN0IDwgNikgIAorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJQQy9YeDogSW5zdWZmaWNpZW50IHBhcm1zIHNwZWNpZmllZFxuIik7CisJCXJldHVybjsKKwl9CisgCisJLyogSSBzaG91bGQgUkVBTExZIHZhbGlkYXRlIHRoZSBzdHVmZiBoZXJlICovCisKKwkvKiBDb3BpZXMgb3VyIGxvY2FsIGNvcHkgb2YgYm9hcmQgaW50byBib2FyZHMgKi8KKwltZW1jcHkoKHZvaWQgKikmYm9hcmRzW251bV9jYXJkc10sKHZvaWQgKikmYm9hcmQsIHNpemVvZihib2FyZCkpOworCisKKwkvKiBEb2VzIHRoaXMgZ2V0IGNhbGxlZCBvbmNlIHBlciBsaWxvIGFyZyBhcmUgd2hhdCA/ICovCisKKwlwcmludGsoS0VSTl9JTkZPICJQQy9YeDogQWRkZWQgYm9hcmQgJWksICVzICVpIHBvcnRzIGF0IDB4JTQuNFggYmFzZSAweCU2LjZYXG4iLCAKKwkJbnVtX2NhcmRzLCBib2FyZF9kZXNjW2JvYXJkLnR5cGVdLCAKKwkJYm9hcmQubnVtcG9ydHMsIChpbnQpYm9hcmQucG9ydCwgKHVuc2lnbmVkIGludCkgYm9hcmQubWVtYmFzZSk7CisKKwludW1fY2FyZHMrKzsKKworfSAvKiBFbmQgZXBjYV9zZXR1cCAqLworCisKKworI2lmZGVmIEVOQUJMRV9QQ0kKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBpbml0X1BDSSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0gZXBpY19ib2FyZF90eXBlcyB7CisJYnJkX3hyID0gMCwKKwlicmRfeGVtLAorCWJyZF9jeCwKKwlicmRfeHJqLAorfTsKKworCisvKiBpbmRleGVkIGRpcmVjdGx5IGJ5IGVwaWNfYm9hcmRfdHlwZXMgZW51bSAqLworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBib2FyZF90eXBlOworCXVuc2lnbmVkIGJhcl9pZHg7CQkvKiBQQ0kgYmFzZSBhZGRyZXNzIHJlZ2lvbiAqLworfSBlcGNhX2luZm9fdGJsW10gPSB7CisJeyBQQ0lYUiwgMCwgfSwKKwl7IFBDSVhFTSwgMCwgfSwKKwl7IFBDSUNYLCAwLCB9LAorCXsgUENJWFJKLCAyLCB9LAorfTsKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlcGNhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IGJvYXJkX251bSA9IC0xOworCWludCBib2FyZF9pZHgsIGluZm9faWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiAtRUlPOworCisJYm9hcmRfbnVtKys7CisJYm9hcmRfaWR4ID0gYm9hcmRfbnVtICsgbnVtX2NhcmRzOworCWlmIChib2FyZF9pZHggPj0gTUFYQk9BUkRTKQorCQlnb3RvIGVycl9vdXQ7CisJCisJYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgZXBjYV9pbmZvX3RibFtpbmZvX2lkeF0uYmFyX2lkeCk7CisJaWYgKCFhZGRyKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJQQ0kgcmVnaW9uICMlZCBub3QgYXZhaWxhYmxlIChzaXplIDApXG4iLAorCQkJZXBjYV9pbmZvX3RibFtpbmZvX2lkeF0uYmFyX2lkeCk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlib2FyZHNbYm9hcmRfaWR4XS5zdGF0dXMgPSBFTkFCTEVEOworCWJvYXJkc1tib2FyZF9pZHhdLnR5cGUgPSBlcGNhX2luZm9fdGJsW2luZm9faWR4XS5ib2FyZF90eXBlOworCWJvYXJkc1tib2FyZF9pZHhdLm51bXBvcnRzID0gMHgwOworCWJvYXJkc1tib2FyZF9pZHhdLnBvcnQgPQorCQkodW5zaWduZWQgY2hhciAqKSgoY2hhciAqKSBhZGRyICsgUENJX0lPX09GRlNFVCk7CisJYm9hcmRzW2JvYXJkX2lkeF0ubWVtYmFzZSA9CisJCSh1bnNpZ25lZCBjaGFyICopKChjaGFyICopIGFkZHIpOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24gKGFkZHIgKyBQQ0lfSU9fT0ZGU0VULCAweDIwMDAwMCwgImVwY2EiKSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAicmVzb3VyY2UgMHgleCBAIDB4JWx4IHVuYXZhaWxhYmxlXG4iLAorCQkJMHgyMDAwMDAsIGFkZHIgKyBQQ0lfSU9fT0ZGU0VUKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWJvYXJkc1tib2FyZF9pZHhdLnJlX21hcF9wb3J0ID0gaW9yZW1hcChhZGRyICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDApOworCWlmICghYm9hcmRzW2JvYXJkX2lkeF0ucmVfbWFwX3BvcnQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCBtYXAgMHgleCBAIDB4JWx4XG4iLAorCQkJMHgyMDAwMDAsIGFkZHIgKyBQQ0lfSU9fT0ZGU0VUKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcGNpaW87CisJfQorCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24gKGFkZHIsIDB4MjAwMDAwLCAiZXBjYSIpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJyZXNvdXJjZSAweCV4IEAgMHglbHggdW5hdmFpbGFibGVcbiIsCisJCQkweDIwMDAwMCwgYWRkcik7CisJCWdvdG8gZXJyX291dF9mcmVlX2lvdW5tYXA7CisJfQorCisJYm9hcmRzW2JvYXJkX2lkeF0ucmVfbWFwX21lbWJhc2UgPSBpb3JlbWFwKGFkZHIsIDB4MjAwMDAwKTsKKwlpZiAoIWJvYXJkc1tib2FyZF9pZHhdLnJlX21hcF9tZW1iYXNlKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgbWFwIDB4JXggQCAweCVseFxuIiwKKwkJCTB4MjAwMDAwLCBhZGRyICsgUENJX0lPX09GRlNFVCk7CisJCWdvdG8gZXJyX291dF9mcmVlX21lbXJlZ2lvbjsKKwl9CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlJIGRvbid0IGtub3cgd2hhdCB0aGUgYmVsb3cgZG9lcywgYnV0IHRoZSBoYXJkd2FyZSBndXlzIHNheQorCQlpdHMgcmVxdWlyZWQgb24gZXZlcnl0aGluZyBleGNlcHQgUExYIChJbiB0aGlzIGNhc2UgWFJKKS4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJaWYgKGluZm9faWR4ICE9IGJyZF94cmopIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDAsIDApOyAgCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQ2LCAwKTsKKwl9CisJCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9tZW1yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uIChhZGRyLCAweDIwMDAwMCk7CitlcnJfb3V0X2ZyZWVfaW91bm1hcDoKKwlpb3VubWFwIChib2FyZHNbYm9hcmRfaWR4XS5yZV9tYXBfcG9ydCk7CitlcnJfb3V0X2ZyZWVfcGNpaW86CisJcmVsZWFzZV9tZW1fcmVnaW9uIChhZGRyICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDApOworZXJyX291dDoKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZXBjYV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0RJR0ksIFBDSV9ERVZJQ0VfWFIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGJyZF94ciB9LAorCXsgUENJX1ZFTkRPUl9ESUdJLCBQQ0lfREVWSUNFX1hFTSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgYnJkX3hlbSB9LAorCXsgUENJX1ZFTkRPUl9ESUdJLCBQQ0lfREVWSUNFX0NYLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBicmRfY3ggfSwKKwl7IFBDSV9WRU5ET1JfRElHSSwgUENJX0RFVklDRV9YUkosIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGJyZF94cmogfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBlcGNhX3BjaV90YmwpOworCitpbnQgX19pbml0IGluaXRfUENJICh2b2lkKQoreyAvKiBCZWdpbiBpbml0X1BDSSAqLworCW1lbXNldCAoJmVwY2FfZHJpdmVyLCAwLCBzaXplb2YgKGVwY2FfZHJpdmVyKSk7CisJZXBjYV9kcml2ZXIubmFtZSA9ICJlcGNhIjsKKwllcGNhX2RyaXZlci5pZF90YWJsZSA9IGVwY2FfcGNpX3RibDsKKwllcGNhX2RyaXZlci5wcm9iZSA9IGVwY2FfaW5pdF9vbmU7CisKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZXBjYV9kcml2ZXIpOworfSAvKiBFbmQgaW5pdF9QQ0kgKi8KKworI2VuZGlmIC8qIEVOQUJMRV9QQ0kgKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VwY2EuaCBiL2RyaXZlcnMvY2hhci9lcGNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyMDVlZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9lcGNhLmgKQEAgLTAsMCArMSwxNjUgQEAKKyNkZWZpbmUgWEVNUE9SVFMgICAgMHhDMDIKKyNkZWZpbmUgWEVQT1JUUyAgICAgMHhDMjIKKworI2RlZmluZSBNQVhfQUxMT0MgICAweDEwMAorCisjZGVmaW5lIE1BWEJPQVJEUyAgIDEyCisjZGVmaW5lIEZFUENPREVTRUcgIDB4MDIwMEwKKyNkZWZpbmUgRkVQQ09ERSAgICAgMHgyMDAwTAorI2RlZmluZSBCSU9TQ09ERSAgICAweGY4MDBMCisKKyNkZWZpbmUgTUlTQ0dMT0JBTCAgMHgwQzAwTAorI2RlZmluZSBOUE9SVCAgICAgICAweDBDMjJMCisjZGVmaW5lIE1CT1ggICAgICAgIDB4MEM0MEwKKyNkZWZpbmUgUE9SVEJBU0UgICAgMHgwQzkwTAorCisvKiBCZWdpbiBjb2RlIGRlZmluZXMgdXNlZCBmb3IgZXBjYV9zZXR1cCAqLworCisjZGVmaW5lIElOVkFMSURfQk9BUkRfVFlQRSAgIDB4MQorI2RlZmluZSBJTlZBTElEX05VTV9QT1JUUyAgICAweDIKKyNkZWZpbmUgSU5WQUxJRF9NRU1fQkFTRSAgICAgMHg0CisjZGVmaW5lIElOVkFMSURfUE9SVF9CQVNFICAgIDB4OAorI2RlZmluZSBJTlZBTElEX0JPQVJEX1NUQVRVUyAweDEwCisjZGVmaW5lIElOVkFMSURfQUxUUElOICAgICAgIDB4MjAKKworLyogRW5kIGNvZGUgZGVmaW5lcyB1c2VkIGZvciBlcGNhX3NldHVwICovCisKKworI2RlZmluZSBGRVBDTFIgICAgICAweDAwCisjZGVmaW5lIEZFUE1FTSAgICAgIDB4MDIKKyNkZWZpbmUgRkVQUlNUICAgICAgMHgwNAorI2RlZmluZSBGRVBJTlQgICAgICAweDA4CisjZGVmaW5lCUZFUE1BU0sgICAgIDB4MGUKKyNkZWZpbmUJRkVQV0lOICAgICAgMHg4MAorCisjZGVmaW5lIFBDWEUgICAgMAorI2RlZmluZSBQQ1hFVkUgIDEKKyNkZWZpbmUgUENYRU0gICAyICAgCisjZGVmaW5lIEVJU0FYRU0gMworI2RlZmluZSBQQzY0WEUgIDQKKyNkZWZpbmUgUENYSSAgICA1CisjZGVmaW5lIFBDSVhFTSAgNworI2RlZmluZSBQQ0lDWCAgIDgKKyNkZWZpbmUgUENJWFIgICA5CisjZGVmaW5lIFBDSVhSSiAgMTAKKyNkZWZpbmUgRVBDQV9OVU1fVFlQRVMgNgorCisKK3N0YXRpYyBjaGFyICpib2FyZF9kZXNjW10gPSAKK3sKKwkiUEMvWGUiLAorCSJQQy9YZXZlIiwKKwkiUEMvWGVtIiwKKwkiRUlTQS9YZW0iLAorCSJQQy82NFhlIiwKKwkiUEMvWGkiLAorCSJ1bmtub3duIiwKKwkiUENJL1hlbSIsCisJIlBDSS9DWCIsCisJIlBDSS9YciIsCisJIlBDSS9YcmoiLAorfTsKKworI2RlZmluZSBTVEFSVEMgICAgICAwMjEKKyNkZWZpbmUgU1RPUEMgICAgICAgMDIzCisjZGVmaW5lIElBSVhPTiAgICAgIDB4MjAwMAorCisKKyNkZWZpbmUgVFhTVE9QUEVEICAweDEKKyNkZWZpbmUgTE9XV0FJVCAgICAweDIKKyNkZWZpbmUgRU1QVFlXQUlUICAweDQKKyNkZWZpbmUgUlhTVE9QUEVEICAweDgKKyNkZWZpbmUgVFhCVVNZICAgICAweDEwCisKKyNkZWZpbmUgRElTQUJMRUQgICAwCisjZGVmaW5lIEVOQUJMRUQgICAgMQorI2RlZmluZSBPRkYgICAgICAgIDAKKyNkZWZpbmUgT04gICAgICAgICAxCisKKyNkZWZpbmUgRkVQVElNRU9VVCAyMDAwMDAgIAorI2RlZmluZSBTRVJJQUxfVFlQRV9OT1JNQUwgIDEKKyNkZWZpbmUgU0VSSUFMX1RZUEVfSU5GTyAgICAzCisjZGVmaW5lIEVQQ0FfRVZFTlRfSEFOR1VQICAgMQorI2RlZmluZSBFUENBX01BR0lDICAgICAgICAgIDB4NWM2ZGYxMDRMCisKK3N0cnVjdCBjaGFubmVsIAoreworCWxvbmcgICBtYWdpYzsKKwl1bmNoYXIgYm9hcmRudW07CisJdW5jaGFyIGNoYW5uZWxudW07CisJdW5jaGFyIG9tb2RlbTsgICAgICAgICAvKiBGRVAgb3V0cHV0IG1vZGVtIHN0YXR1cyAgICAgKi8KKwl1bmNoYXIgaW1vZGVtOyAgICAgICAgIC8qIEZFUCBpbnB1dCBtb2RlbSBzdGF0dXMgICAgICAqLworCXVuY2hhciBtb2RlbWZha2U7ICAgICAgLyogTW9kZW0gdmFsdWVzIHRvIGJlIGZvcmNlZCAgICovCisJdW5jaGFyIG1vZGVtOyAgICAgICAgICAvKiBGb3JjZSB2YWx1ZXMgICAgICAgICAgICAgICAgKi8KKwl1bmNoYXIgaGZsb3c7CisJdW5jaGFyIGRzcjsKKwl1bmNoYXIgZGNkOworCXVuY2hhciBtX3J0cyA7IAkJLyogVGhlIGJpdHMgdXNlZCBpbiB3aGF0ZXZlciBGRVAgKi8KKwl1bmNoYXIgbV9kY2QgOwkJLyogaXMgaW5kaWdpbm91cyB0byB0aGlzIGJvYXJkIHRvICovCisJdW5jaGFyIG1fZHNyIDsJCS8qIHJlcHJlc2VudCBlYWNoIG9mIHRoZSBwaHlzaWNhbCAqLworCXVuY2hhciBtX2N0cyA7CQkvKiBoYW5kc2hha2UgbGluZXMgKi8KKwl1bmNoYXIgbV9yaSA7CisJdW5jaGFyIG1fZHRyIDsKKwl1bmNoYXIgc3RvcGM7CisJdW5jaGFyIHN0YXJ0YzsKKwl1bmNoYXIgc3RvcGNhOworCXVuY2hhciBzdGFydGNhOworCXVuY2hhciBmZXBzdG9wYzsKKwl1bmNoYXIgZmVwc3RhcnRjOworCXVuY2hhciBmZXBzdG9wY2E7CisJdW5jaGFyIGZlcHN0YXJ0Y2E7CisJdW5jaGFyIHR4d2luOworCXVuY2hhciByeHdpbjsKKwl1c2hvcnQgZmVwaWZsYWc7CisJdXNob3J0IGZlcGNmbGFnOworCXVzaG9ydCBmZXBvZmxhZzsKKwl1c2hvcnQgdHhidWZoZWFkOworCXVzaG9ydCB0eGJ1ZnNpemU7CisJdXNob3J0IHJ4YnVmaGVhZDsKKwl1c2hvcnQgcnhidWZzaXplOworCWludCAgICBjbG9zZV9kZWxheTsKKwlpbnQgICAgY291bnQ7CisJaW50ICAgIGJsb2NrZWRfb3BlbjsKKwl1bG9uZyAgZXZlbnQ7CisJaW50ICAgIGFzeW5jZmxhZ3M7CisJdWludCAgIGRldjsKKwl1bG9uZyAgc3RhdHVzZmxhZ3M7CisJdWxvbmcgIGNfaWZsYWc7CisJdWxvbmcgIGNfY2ZsYWc7CisJdWxvbmcgIGNfbGZsYWc7CisJdWxvbmcgIGNfb2ZsYWc7CisJdW5jaGFyICp0eHB0cjsKKwl1bmNoYXIgKnJ4cHRyOworCXVuY2hhciAqdG1wX2J1ZjsKKwlzdHJ1Y3QgYm9hcmRfaW5mbyAgICAgICAgICAgKmJvYXJkOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICAqYnJkY2hhbjsKKwlzdHJ1Y3QgZGlnaV9zdHJ1Y3QgICAgICAgICAgZGlnaWV4dDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAgICAgICAgICAgKnR0eTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICAgICAgb3Blbl93YWl0OworCXdhaXRfcXVldWVfaGVhZF90ICAgICAgICAgICBjbG9zZV93YWl0OworCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgICAgICAgIHRxdWV1ZTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZ2xvYmFsX2RhdGEgKm1haWxib3g7Cit9OworCitzdHJ1Y3QgYm9hcmRfaW5mbwkKK3sKKwl1bmNoYXIgc3RhdHVzOworCXVuY2hhciB0eXBlOworCXVuY2hhciBhbHRwaW47CisJdXNob3J0IG51bXBvcnRzOworCXVuY2hhciAqcG9ydDsKKwl1bmNoYXIgKm1lbWJhc2U7CisJdW5jaGFyIF9faW9tZW0gKnJlX21hcF9wb3J0OworCXVuY2hhciAqcmVfbWFwX21lbWJhc2U7CisJdWxvbmcgIG1lbW9yeV9zZWc7CisJdm9pZCAoICogbWVtd2lub24gKQkoc3RydWN0IGJvYXJkX2luZm8gKiwgdW5zaWduZWQgaW50KSA7CisJdm9pZCAoICogbWVtd2lub2ZmICkgCShzdHJ1Y3QgYm9hcmRfaW5mbyAqLCB1bnNpZ25lZCBpbnQpIDsKKwl2b2lkICggKiBnbG9iYWx3aW5vbiApCShzdHJ1Y3QgY2hhbm5lbCAqKSA7CisJdm9pZCAoICogdHh3aW5vbiApIAkoc3RydWN0IGNoYW5uZWwgKikgOworCXZvaWQgKCAqIHJ4d2lub24gKQkoc3RydWN0IGNoYW5uZWwgKikgOworCXZvaWQgKCAqIG1lbW9mZiApCShzdHJ1Y3QgY2hhbm5lbCAqKSA7CisJdm9pZCAoICogYXNzZXJ0Z3dpbm9uICkJKHN0cnVjdCBjaGFubmVsICopIDsKKwl2b2lkICggKiBhc3NlcnRtZW1vZmYgKQkoc3RydWN0IGNoYW5uZWwgKikgOworCXVuY2hhciBwb2xsZXJfaW5oaWJpdGVkIDsKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lcGNhY29uZmlnLmggYi9kcml2ZXJzL2NoYXIvZXBjYWNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZGVjMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZXBjYWNvbmZpZy5oCkBAIC0wLDAgKzEsNyBAQAorI2RlZmluZSBOVU1DQVJEUyAwCisjZGVmaW5lIE5CREVWUyAwCisKK3N0cnVjdCBib2FyZF9pbmZvIHN0YXRpY19ib2FyZHNbTlVNQ0FSRFNdPXsKK307CisKKy8qIERPIE5PVCBIQU5EIEVESVQgVEhJUyBGSUxFISAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VzcC5jIGIvZHJpdmVycy9jaGFyL2VzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTNkMmZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2VzcC5jCkBAIC0wLDAgKzEsMjYzMCBAQAorLyoKKyAqICBlc3AuYyAtIGRyaXZlciBmb3IgSGF5ZXMgRVNQIHNlcmlhbCBjYXJkcworICoKKyAqICAtLS0gTm90aWNlcyBmcm9tIHNlcmlhbC5jLCB1cG9uIHdoaWNoIHRoaXMgZHJpdmVyIGlzIGJhc2VkIC0tLQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEV4dGVuc2l2ZWx5IHJld3JpdHRlbiBieSBUaGVvZG9yZSBUcydvLCA4LzE2LzkyIC0tIDkvMTQvOTIuICBOb3cKKyAqICBtdWNoIG1vcmUgZXh0ZW5zaWJsZSB0byBzdXBwb3J0IG90aGVyIHNlcmlhbCBjYXJkcyBiYXNlZCBvbiB0aGUKKyAqICAxNjQ1MC8xNjU1MEEgVUFSVCdzLiAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIEFTVCBGb3VyUG9ydCBhbmQgdGhlCisgKiAgQWNjZW50IEFzeW5jIGJvYXJkLiAgCisgKgorICogIHNldF9zZXJpYWxfaW5mbyBmaXhlZCB0byBzZXQgdGhlIGZsYWdzLCBjdXN0b20gZGl2aXNvciwgYW5kIHVhcnQKKyAqIAl0eXBlIGZpZWxkcy4gIEZpeCBzdWdnZXN0ZWQgYnkgTWljaGFlbCBLLiBKb2huc29uIDEyLzEyLzkyLgorICoKKyAqICAxMS85NTogVElPQ01JV0FJVCwgVElPQ0dJQ09VTlQgYnkgQW5nZWxvIEhhcml0c2lzIDxhaEBkb2MuaWMuYWMudWs+CisgKgorICogIDAzLzk2OiBNb2R1bGFyaXNlZCBieSBBbmdlbG8gSGFyaXRzaXMgPGFoQGRvYy5pYy5hYy51az4KKyAqCisgKiAgcnNfc2V0X3Rlcm1pb3MgZml4ZWQgdG8gbG9vayBhbHNvIGZvciBjaGFuZ2VzIG9mIHRoZSBpbnB1dAorICogICAgICBmbGFncyBJTlBDSywgQlJLSU5ULCBQQVJNUkssIElHTlBBUiBhbmQgSUdOQlJLLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlcm5kIEFuaO+/vXBsIDA1LzE3Lzk2LgorICoKKyAqIC0tLSBFbmQgb2Ygbm90aWNlcyBmcm9tIHNlcmlhbC5jIC0tLQorICoKKyAqIFN1cHBvcnQgZm9yIHRoZSBFU1Agc2VyaWFsIGNhcmQgYnkgQW5kcmV3IEouIFJvYmluc29uCisgKiAgICAgPGFyb2JpbnNvQG55eC5uZXQ+IChDYXJkIGRldGVjdGlvbiByb3V0aW5lIHRha2VuIGZyb20gYSBwYXRjaAorICogICAgIGJ5IERlbm5pcyBKLiBCb3lsYW4pLiAgUGF0Y2hlcyB0byBhbGxvdyB1c2Ugd2l0aCAyLjEueCBjb250cmlidXRlZAorICogICAgIGJ5IENocmlzIEZheWxvci4KKyAqCisgKiBNb3N0IHJlY2VudCBjaGFuZ2VzOiAoQW5kcmV3IEouIFJvYmluc29uKQorICogICBTdXBwb3J0IGZvciBQSU8gbW9kZS4gIFRoaXMgYWxsb3dzIHRoZSBkcml2ZXIgdG8gd29yayBwcm9wZXJseSB3aXRoCisgKiAgICAgbXVsdGlwb3J0IGNhcmRzLgorICoKKyAqIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiAtCisgKiBzZXZlcmFsIGNsZWFudXBzLCB1c2UgbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQsIGV0YworICoKKyAqIFRoaXMgbW9kdWxlIGV4cG9ydHMgdGhlIGZvbGxvd2luZyByczIzMiBpbyBmdW5jdGlvbnM6CisgKgorICoJaW50IGVzcHNlcmlhbF9pbml0KHZvaWQpOworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxQLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2hheWVzZXNwLmg+CisKKyNkZWZpbmUgTlJfUE9SVFMgNjQJLyogbWF4aW11bSBudW1iZXIgb2YgcG9ydHMgKi8KKyNkZWZpbmUgTlJfUFJJTUFSWSA4CS8qIG1heGltdW0gbnVtYmVyIG9mIHByaW1hcnkgcG9ydHMgKi8KKyNkZWZpbmUgUkVHSU9OX1NJWkUgOCAgIC8qIHNpemUgb2YgaW8gcmVnaW9uIHRvIHJlcXVlc3QgKi8KKworLyogVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgY2FuIGJlIHNldCBieSBnaXZpbmcgbW9kdWxlIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgaXJxW05SX1BSSU1BUlldOwkvKiBJUlEgZm9yIGVhY2ggYmFzZSBwb3J0ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGRpdmlzb3JbTlJfUFJJTUFSWV07IC8qIGN1c3RvbSBkaXZpc29yIGZvciBlYWNoIHBvcnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZG1hID0gRVNQX0RNQV9DSEFOTkVMOyAvKiBETUEgY2hhbm5lbCAqLworc3RhdGljIHVuc2lnbmVkIGludCByeF90cmlnZ2VyID0gRVNQX1JYX1RSSUdHRVI7CitzdGF0aWMgdW5zaWduZWQgaW50IHR4X3RyaWdnZXIgPSBFU1BfVFhfVFJJR0dFUjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmxvd19vZmYgPSBFU1BfRkxPV19PRkY7CitzdGF0aWMgdW5zaWduZWQgaW50IGZsb3dfb24gPSBFU1BfRkxPV19PTjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnhfdGltZW91dCA9IEVTUF9SWF9UTU9VVDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGlvX3RocmVzaG9sZCA9IEVTUF9QSU9fVEhSRVNIT0xEOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZGl2aXNvciwgdWludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oZG1hLCB1aW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF90cmlnZ2VyLCB1aW50LCAwKTsKK21vZHVsZV9wYXJhbSh0eF90cmlnZ2VyLCB1aW50LCAwKTsKK21vZHVsZV9wYXJhbShmbG93X29mZiwgdWludCwgMCk7Cittb2R1bGVfcGFyYW0oZmxvd19vbiwgdWludCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfdGltZW91dCwgdWludCwgMCk7Cittb2R1bGVfcGFyYW0ocGlvX3RocmVzaG9sZCwgdWludCwgMCk7CisKKy8qIEVORCAqLworCitzdGF0aWMgY2hhciAqZG1hX2J1ZmZlcjsKK3N0YXRpYyBpbnQgZG1hX2J5dGVzOworc3RhdGljIHN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqZnJlZV9waW9fYnVmOworCisjZGVmaW5lIERNQV9CVUZGRVJfU1ogMTAyNAorCisjZGVmaW5lIFdBS0VVUF9DSEFSUyAxMDI0CisKK3N0YXRpYyBjaGFyIHNlcmlhbF9uYW1lW10gX19pbml0ZGF0YSA9ICJFU1Agc2VyaWFsIGRyaXZlciI7CitzdGF0aWMgY2hhciBzZXJpYWxfdmVyc2lvbltdIF9faW5pdGRhdGEgPSAiMi4yIjsKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICplc3BfZHJpdmVyOworCisvKiBzZXJpYWwgc3VidHlwZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTRVJJQUxfVFlQRV9OT1JNQUwJMQorCisvKgorICogU2VyaWFsIGRyaXZlciBjb25maWd1cmF0aW9uIHNlY3Rpb24uICBIZXJlIGFyZSB0aGUgdmFyaW91cyBvcHRpb25zOgorICoKKyAqIFNFUklBTF9QQVJBTk9JQV9DSEVDSworICogCQlDaGVjayB0aGUgbWFnaWMgbnVtYmVyIGZvciB0aGUgZXNwX3N0cnVjdHVyZSB3aGVyZQorICogCQlldmVyIHBvc3NpYmxlLgorICovCisKKyN1bmRlZiBTRVJJQUxfUEFSQU5PSUFfQ0hFQ0sKKyNkZWZpbmUgU0VSSUFMX0RPX1JFU1RBUlQKKworI3VuZGVmIFNFUklBTF9ERUJVR19JTlRSCisjdW5kZWYgU0VSSUFMX0RFQlVHX09QRU4KKyN1bmRlZiBTRVJJQUxfREVCVUdfRkxPVworCisjaWYgZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoU0VSSUFMX0RFQlVHX01DT1VOVCkKKyNkZWZpbmUgREJHX0NOVChzKSBwcmludGsoIiglcyk6IFsleF0gcmVmYz0lZCwgc2VyYz0lZCwgdHR5Yz0lZCAtPiAlc1xuIiwgXAorIHR0eS0+bmFtZSwgKGluZm8tPmZsYWdzKSwgc2VyaWFsX2RyaXZlci5yZWZjb3VudCxpbmZvLT5jb3VudCx0dHktPmNvdW50LHMpCisjZWxzZQorI2RlZmluZSBEQkdfQ05UKHMpCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBlc3Bfc3RydWN0ICpwb3J0czsKKworc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIHJzX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBpbnQpOworCisvKgorICogVGhlIEVTUCBjYXJkIGhhcyBhIGNsb2NrIHJhdGUgb2YgMTQuNzQ1NiBNSHogKHRoYXQgaXMsIDIqKkVTUENfU0NBTEUKKyAqIHRpbWVzIHRoZSBub3JtYWwgMS44NDMyIE1oeiBjbG9jayBvZiBtb3N0IHNlcmlhbCBib2FyZHMpLgorICovCisjZGVmaW5lIEJBU0VfQkFVRCAoKDE4NDMyMDAgLyAxNikgKiAoMSA8PCBFU1BDX1NDQUxFKSkKKworLyogU3RhbmRhcmQgQ09NIGZsYWdzIChleGNlcHQgZm9yIENPTTQsIGJlY2F1c2Ugb2YgdGhlIDg1MTQgcHJvYmxlbSkgKi8KKyNkZWZpbmUgU1REX0NPTV9GTEFHUyAoQVNZTkNfQk9PVF9BVVRPQ09ORiB8IEFTWU5DX1NLSVBfVEVTVCkKKworLyoKKyAqIHRtcF9idWYgaXMgdXNlZCBhcyBhIHRlbXBvcmFyeSBidWZmZXIgYnkgc2VyaWFsX3dyaXRlLiAgV2UgbmVlZCB0bworICogbG9jayBpdCBpbiBjYXNlIHRoZSBtZW1jcHlfZnJvbWZzIGJsb2NrcyB3aGlsZSBzd2FwcGluZyBpbiBhIHBhZ2UsCisgKiBhbmQgc29tZSBvdGhlciBwcm9ncmFtIHRyaWVzIHRvIGRvIGEgc2VyaWFsIHdyaXRlIGF0IHRoZSBzYW1lIHRpbWUuCisgKiBTaW5jZSB0aGUgbG9jayB3aWxsIG9ubHkgY29tZSB1bmRlciBjb250ZW50aW9uIHdoZW4gdGhlIHN5c3RlbSBpcworICogc3dhcHBpbmcgYW5kIGF2YWlsYWJsZSBtZW1vcnkgaXMgbG93LCBpdCBtYWtlcyBzZW5zZSB0byBzaGFyZSBvbmUKKyAqIGJ1ZmZlciBhY3Jvc3MgYWxsIHRoZSBzZXJpYWwgcG9ydHMsIHNpbmNlIGl0IHNpZ25pZmljYW50bHkgc2F2ZXMKKyAqIG1lbW9yeSBpZiBsYXJnZSBudW1iZXJzIG9mIHNlcmlhbCBwb3J0cyBhcmUgb3Blbi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnRtcF9idWY7CitzdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKKwkJCQkJY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcm91dGluZSkKK3sKKyNpZmRlZiBTRVJJQUxfUEFSQU5PSUFfQ0hFQ0sKKwlzdGF0aWMgY29uc3QgY2hhciBiYWRtYWdpY1tdID0gS0VSTl9XQVJOSU5HCisJCSJXYXJuaW5nOiBiYWQgbWFnaWMgbnVtYmVyIGZvciBzZXJpYWwgc3RydWN0ICglcykgaW4gJXNcbiI7CisJc3RhdGljIGNvbnN0IGNoYXIgYmFkaW5mb1tdID0gS0VSTl9XQVJOSU5HCisJCSJXYXJuaW5nOiBudWxsIGVzcF9zdHJ1Y3QgZm9yICglcykgaW4gJXNcbiI7CisKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGluZm8tPm1hZ2ljICE9IEVTUF9NQUdJQykgeworCQlwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2VyaWFsX2luKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBpbmIoaW5mby0+cG9ydCArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXJpYWxfb3V0KHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLCBpbnQgb2Zmc2V0LAorCQkJICAgICAgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlvdXRiKHZhbHVlLCBpbmZvLT5wb3J0K29mZnNldCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJzX3N0b3AoKSBhbmQgcnNfc3RhcnQoKQorICoKKyAqIFRoaXMgcm91dGluZXMgYXJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyBvciByZXNldHRpbmcgdHR5LT5zdG9wcGVkLgorICogVGhleSBlbmFibGUgb3IgZGlzYWJsZSB0cmFuc21pdHRlciBpbnRlcnJ1cHRzLCBhcyBuZWNlc3NhcnkuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgcnNfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19zdG9wIikpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaWYgKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpIHsKKwkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnNfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3N0YXJ0IikpCisJCXJldHVybjsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT54bWl0X2NudCAmJiBpbmZvLT54bWl0X2J1ZiAmJiAhKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7CisJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBIZXJlIHN0YXJ0cyB0aGUgaW50ZXJydXB0IGhhbmRsaW5nIHJvdXRpbmVzLiAgQWxsIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHN1YnJvdXRpbmVzIGFyZSBkZWNsYXJlZCBhcyBpbmxpbmUgYW5kIGFyZSBmb2xkZWQgaW50bworICogcnNfaW50ZXJydXB0KCkuICBUaGV5IHdlcmUgc2VwYXJhdGVkIG91dCBmb3IgcmVhZGFiaWxpdHkncyBzYWtlLgorICoKKyAqIE5vdGU6IHJzX2ludGVycnVwdCgpIGlzIGEgImZhc3QiIGludGVycnVwdCwgd2hpY2ggbWVhbnMgdGhhdCBpdAorICogcnVucyB3aXRoIGludGVycnVwdHMgdHVybmVkIG9mZi4gIFBlb3BsZSB3aG8gbWF5IHdhbnQgdG8gbW9kaWZ5CisgKiByc19pbnRlcnJ1cHQoKSBzaG91bGQgdHJ5IHRvIGtlZXAgdGhlIGludGVycnVwdCBoYW5kbGVyIGFzIGZhc3QgYXMKKyAqIHBvc3NpYmxlLiAgQWZ0ZXIgeW91IGFyZSBkb25lIG1ha2luZyBtb2RpZmljYXRpb25zLCBpdCBpcyBub3QgYSBiYWQKKyAqIGlkZWEgdG8gZG86CisgKiAKKyAqIGdjYyAtUyAtREtFUk5FTCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciBzZXJpYWwuYworICoKKyAqIGFuZCBsb29rIGF0IHRoZSByZXN1bHRpbmcgYXNzZW1ibGUgY29kZSBpbiBzZXJpYWwucy4KKyAqCisgKiAJCQkJLSBUZWQgVHMnbyAodHl0c29AbWl0LmVkdSksIDctTWFyLTkzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdG8gc2NoZWR1bGUKKyAqIHByb2Nlc3NpbmcgaW4gdGhlIHNvZnR3YXJlIGludGVycnVwdCBwb3J0aW9uIG9mIHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByc19zY2hlZF9ldmVudChzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKKwkJCQkgIGludCBldmVudCkKK3sKKwlpbmZvLT5ldmVudCB8PSAxIDw8IGV2ZW50OworCXNjaGVkdWxlX3dvcmsoJmluZm8tPnRxdWV1ZSk7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socGlvX2xvY2spOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqZ2V0X3Bpb19idWZmZXIodm9pZCkKK3sKKwlzdHJ1Y3QgZXNwX3Bpb19idWZmZXIgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBpb19sb2NrLCBmbGFncyk7CisJaWYgKGZyZWVfcGlvX2J1ZikgeworCQlidWYgPSBmcmVlX3Bpb19idWY7CisJCWZyZWVfcGlvX2J1ZiA9IGJ1Zi0+bmV4dDsKKwl9IGVsc2UgeworCQlidWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXNwX3Bpb19idWZmZXIpLCBHRlBfQVRPTUlDKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGlvX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVsZWFzZV9waW9fYnVmZmVyKHN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBpb19sb2NrLCBmbGFncyk7CisJYnVmLT5uZXh0ID0gZnJlZV9waW9fYnVmOworCWZyZWVfcGlvX2J1ZiA9IGJ1ZjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaW9fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVjZWl2ZV9jaGFyc19waW8oc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sIGludCBudW1fYnl0ZXMpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKwlpbnQgaTsKKwlzdHJ1Y3QgZXNwX3Bpb19idWZmZXIgKnBpb19idWY7CisJc3RydWN0IGVzcF9waW9fYnVmZmVyICplcnJfYnVmOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzX21hc2s7CisKKwlwaW9fYnVmID0gZ2V0X3Bpb19idWZmZXIoKTsKKworCWlmICghcGlvX2J1ZikKKwkJcmV0dXJuOworCisJZXJyX2J1ZiA9IGdldF9waW9fYnVmZmVyKCk7CisKKwlpZiAoIWVycl9idWYpIHsKKwkJcmVsZWFzZV9waW9fYnVmZmVyKHBpb19idWYpOworCQlyZXR1cm47CisJfQorCisJc3RhdHVzX21hc2sgPSAoaW5mby0+cmVhZF9zdGF0dXNfbWFzayA+PiAyKSAmIDB4MDc7CisJCQorCWZvciAoaSA9IDA7IGkgPCBudW1fYnl0ZXMgLSAxOyBpICs9IDIpIHsKKwkJKigodW5zaWduZWQgc2hvcnQgKikocGlvX2J1Zi0+ZGF0YSArIGkpKSA9CisJCQlpbncoaW5mby0+cG9ydCArIFVBUlRfRVNJX1JYKTsKKwkJZXJyX2J1Zi0+ZGF0YVtpXSA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9SV1MpOworCQllcnJfYnVmLT5kYXRhW2kgKyAxXSA9IChlcnJfYnVmLT5kYXRhW2ldID4+IDMpICYgc3RhdHVzX21hc2s7CisJCWVycl9idWYtPmRhdGFbaV0gJj0gc3RhdHVzX21hc2s7CisJfQorCisJaWYgKG51bV9ieXRlcyAmIDB4MDAwMSkgeworCQlwaW9fYnVmLT5kYXRhW251bV9ieXRlcyAtIDFdID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1JYKTsKKwkJZXJyX2J1Zi0+ZGF0YVtudW1fYnl0ZXMgLSAxXSA9CisJCQkoc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1JXUykgPj4gMykgJiBzdGF0dXNfbWFzazsKKwl9CisKKwkvKiBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBzdGlsbCBvayBzaW5jZSBpbnRlcnJ1cHRzIHdlcmUgZW5hYmxlZCAqLworCXR0eSA9IGluZm8tPnR0eTsKKworCWlmICghdHR5KSB7CisJCXJlbGVhc2VfcGlvX2J1ZmZlcihwaW9fYnVmKTsKKwkJcmVsZWFzZV9waW9fYnVmZmVyKGVycl9idWYpOworCQlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9SWF9USU1FT1VUOworCQlyZXR1cm47CisJfQorCisJc3RhdHVzX21hc2sgPSAoaW5mby0+aWdub3JlX3N0YXR1c19tYXNrID4+IDIpICYgMHgwNzsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fYnl0ZXM7IGkrKykgeworCQlpZiAoIShlcnJfYnVmLT5kYXRhW2ldICYgc3RhdHVzX21hc2spKSB7CisJCQkqKHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKykgPSBwaW9fYnVmLT5kYXRhW2ldOworCisJCQlpZiAoZXJyX2J1Zi0+ZGF0YVtpXSAmIDB4MDQpIHsKKwkJCQkqKHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKykgPSBUVFlfQlJFQUs7CisKKwkJCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQkJCWRvX1NBSyh0dHkpOworCQkJfQorCQkJZWxzZSBpZiAoZXJyX2J1Zi0+ZGF0YVtpXSAmIDB4MDIpCisJCQkJKih0dHktPmZsaXAuZmxhZ19idWZfcHRyKyspID0gVFRZX0ZSQU1FOworCQkJZWxzZSBpZiAoZXJyX2J1Zi0+ZGF0YVtpXSAmIDB4MDEpCisJCQkJKih0dHktPmZsaXAuZmxhZ19idWZfcHRyKyspID0gVFRZX1BBUklUWTsKKwkJCWVsc2UKKwkJCQkqKHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKykgPSAwOworCQkKKwkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQl9CisJfQorCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisKKwlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9SWF9USU1FT1VUOworCXJlbGVhc2VfcGlvX2J1ZmZlcihwaW9fYnVmKTsKKwlyZWxlYXNlX3Bpb19idWZmZXIoZXJyX2J1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWNlaXZlX2NoYXJzX2RtYShzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywgaW50IG51bV9ieXRlcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWluZm8tPnN0YXRfZmxhZ3MgJj0gfkVTUF9TVEFUX1JYX1RJTUVPVVQ7CisJZG1hX2J5dGVzID0gbnVtX2J5dGVzOworCWluZm8tPnN0YXRfZmxhZ3MgfD0gRVNQX1NUQVRfRE1BX1JYOworCQorCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisgICAgICAgIGRpc2FibGVfZG1hKGRtYSk7CisgICAgICAgIGNsZWFyX2RtYV9mZihkbWEpOworICAgICAgICBzZXRfZG1hX21vZGUoZG1hLCBETUFfTU9ERV9SRUFEKTsKKyAgICAgICAgc2V0X2RtYV9hZGRyKGRtYSwgaXNhX3ZpcnRfdG9fYnVzKGRtYV9idWZmZXIpKTsKKyAgICAgICAgc2V0X2RtYV9jb3VudChkbWEsIGRtYV9ieXRlcyk7CisgICAgICAgIGVuYWJsZV9kbWEoZG1hKTsKKyAgICAgICAgcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisgICAgICAgIAorICAgICAgICBzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TVEFSVF9ETUFfUlgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVjZWl2ZV9jaGFyc19kbWFfZG9uZShzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKKwkJCQkJICAgIGludCBzdGF0dXMpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKwlpbnQgbnVtX2J5dGVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJCisJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShkbWEpOworCWNsZWFyX2RtYV9mZihkbWEpOworCisJaW5mby0+c3RhdF9mbGFncyAmPSB+RVNQX1NUQVRfRE1BX1JYOworCW51bV9ieXRlcyA9IGRtYV9ieXRlcyAtIGdldF9kbWFfcmVzaWR1ZShkbWEpOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQorCWluZm8tPmljb3VudC5yeCArPSBudW1fYnl0ZXM7CisKKwltZW1jcHkodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgZG1hX2J1ZmZlciwgbnVtX2J5dGVzKTsKKwl0dHktPmZsaXAuY2hhcl9idWZfcHRyICs9IG51bV9ieXRlczsKKwl0dHktPmZsaXAuY291bnQgKz0gbnVtX2J5dGVzOworCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBudW1fYnl0ZXMpOworCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gbnVtX2J5dGVzOworCisJaWYgKG51bV9ieXRlcyA+IDApIHsKKwkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ci0tOworCisJCXN0YXR1cyAmPSAoMHgxYyAmIGluZm8tPnJlYWRfc3RhdHVzX21hc2spOworCisJCWlmIChzdGF0dXMgJiBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2spIHsKKwkJCXR0eS0+ZmxpcC5jb3VudC0tOworCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ci0tOworCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ci0tOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIDB4MTApIHsKKwkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0JSRUFLOworCQkJKGluZm8tPmljb3VudC5icmspKys7CisJCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQkJZG9fU0FLKHR0eSk7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgMHgwOCkgeworCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJCQkoaW5mby0+aWNvdW50LmZyYW1lKSsrOworCQl9CisJCWVsc2UgaWYgKHN0YXR1cyAmIDB4MDQpIHsKKwkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX1BBUklUWTsKKwkJCShpbmZvLT5pY291bnQucGFyaXR5KSsrOworCQl9CisKKwkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOworCQkKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisJfQorCisJaWYgKGRtYV9ieXRlcyAhPSBudW1fYnl0ZXMpIHsKKwkJbnVtX2J5dGVzID0gZG1hX2J5dGVzIC0gbnVtX2J5dGVzOworCQlkbWFfYnl0ZXMgPSAwOworCQlyZWNlaXZlX2NoYXJzX2RtYShpbmZvLCBudW1fYnl0ZXMpOworCX0gZWxzZQorCQlkbWFfYnl0ZXMgPSAwOworfQorCisvKiBDYWxsZXIgbXVzdCBob2xkIGluZm8tPmxvY2sgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHRyYW5zbWl0X2NoYXJzX3BpbyhzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKKwkJCQkJaW50IHNwYWNlX2F2YWlsKQoreworCWludCBpOworCXN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqcGlvX2J1ZjsKKworCXBpb19idWYgPSBnZXRfcGlvX2J1ZmZlcigpOworCisJaWYgKCFwaW9fYnVmKQorCQlyZXR1cm47CisKKwl3aGlsZSAoc3BhY2VfYXZhaWwgJiYgaW5mby0+eG1pdF9jbnQpIHsKKwkJaWYgKGluZm8tPnhtaXRfdGFpbCArIHNwYWNlX2F2YWlsIDw9IEVTUF9YTUlUX1NJWkUpIHsKKwkJCW1lbWNweShwaW9fYnVmLT5kYXRhLAorCQkJICAgICAgICYoaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsXSksCisJCQkgICAgICAgc3BhY2VfYXZhaWwpOworCQl9IGVsc2UgeworCQkJaSA9IEVTUF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X3RhaWw7CisJCQltZW1jcHkocGlvX2J1Zi0+ZGF0YSwKKwkJCSAgICAgICAmKGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF0pLCBpKTsKKwkJCW1lbWNweSgmKHBpb19idWYtPmRhdGFbaV0pLCBpbmZvLT54bWl0X2J1ZiwKKwkJCSAgICAgICBzcGFjZV9hdmFpbCAtIGkpOworCQl9CisKKwkJaW5mby0+eG1pdF9jbnQgLT0gc3BhY2VfYXZhaWw7CisJCWluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyBzcGFjZV9hdmFpbCkgJgorCQkJKEVTUF9YTUlUX1NJWkUgLSAxKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgc3BhY2VfYXZhaWwgLSAxOyBpICs9IDIpIHsKKwkJCW91dHcoKigodW5zaWduZWQgc2hvcnQgKikocGlvX2J1Zi0+ZGF0YSArIGkpKSwKKwkJCSAgICAgaW5mby0+cG9ydCArIFVBUlRfRVNJX1RYKTsKKwkJfQorCisJCWlmIChzcGFjZV9hdmFpbCAmIDB4MDAwMSkKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfVFgsCisJCQkJICAgcGlvX2J1Zi0+ZGF0YVtzcGFjZV9hdmFpbCAtIDFdKTsKKworCQlpZiAoaW5mby0+eG1pdF9jbnQpIHsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1RYX0FWQUlMKTsKKwkJCXNwYWNlX2F2YWlsID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKSA8PCA4OworCQkJc3BhY2VfYXZhaWwgfD0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKKworCQkJaWYgKHNwYWNlX2F2YWlsID4gaW5mby0+eG1pdF9jbnQpCisJCQkJc3BhY2VfYXZhaWwgPSBpbmZvLT54bWl0X2NudDsKKwkJfQorCX0KKworCWlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgeworCQlyc19zY2hlZF9ldmVudChpbmZvLCBFU1BfRVZFTlRfV1JJVEVfV0FLRVVQKTsKKworI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCisJCXByaW50aygiVEhSRS4uLiIpOworI2VuZGlmCisKKwkJaWYgKGluZm8tPnhtaXRfY250IDw9IDApIHsKKwkJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwKKwkJCQkgICBFU0lfU0VUX1NSVl9NQVNLKTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKKwkJfQorCX0KKworCXJlbGVhc2VfcGlvX2J1ZmZlcihwaW9fYnVmKTsKK30KKworLyogQ2FsbGVyIG11c3QgaG9sZCBpbmZvLT5sb2NrICovCitzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNtaXRfY2hhcnNfZG1hKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLCBpbnQgbnVtX2J5dGVzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJZG1hX2J5dGVzID0gbnVtX2J5dGVzOworCisJaWYgKGluZm8tPnhtaXRfdGFpbCArIGRtYV9ieXRlcyA8PSBFU1BfWE1JVF9TSVpFKSB7CisJCW1lbWNweShkbWFfYnVmZmVyLCAmKGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF0pLAorCQkgICAgICAgZG1hX2J5dGVzKTsKKwl9IGVsc2UgeworCQlpbnQgaSA9IEVTUF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X3RhaWw7CisJCW1lbWNweShkbWFfYnVmZmVyLCAmKGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF0pLAorCQkJaSk7CisJCW1lbWNweSgmKGRtYV9idWZmZXJbaV0pLCBpbmZvLT54bWl0X2J1ZiwgZG1hX2J5dGVzIC0gaSk7CisJfQorCisJaW5mby0+eG1pdF9jbnQgLT0gZG1hX2J5dGVzOworCWluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyBkbWFfYnl0ZXMpICYgKEVTUF9YTUlUX1NJWkUgLSAxKTsKKworCWlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgeworCQlyc19zY2hlZF9ldmVudChpbmZvLCBFU1BfRVZFTlRfV1JJVEVfV0FLRVVQKTsKKworI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCisJCXByaW50aygiVEhSRS4uLiIpOworI2VuZGlmCisKKwkJaWYgKGluZm8tPnhtaXRfY250IDw9IDApIHsKKwkJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7CisJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7CisJCX0KKwl9CisKKwlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX0RNQV9UWDsKKwkKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworICAgICAgICBkaXNhYmxlX2RtYShkbWEpOworICAgICAgICBjbGVhcl9kbWFfZmYoZG1hKTsKKyAgICAgICAgc2V0X2RtYV9tb2RlKGRtYSwgRE1BX01PREVfV1JJVEUpOworICAgICAgICBzZXRfZG1hX2FkZHIoZG1hLCBpc2FfdmlydF90b19idXMoZG1hX2J1ZmZlcikpOworICAgICAgICBzZXRfZG1hX2NvdW50KGRtYSwgZG1hX2J5dGVzKTsKKyAgICAgICAgZW5hYmxlX2RtYShkbWEpOworICAgICAgICByZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKyAgICAgICAgCisgICAgICAgIHNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NUQVJUX0RNQV9UWCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc21pdF9jaGFyc19kbWFfZG9uZShzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbykKK3sKKwlpbnQgbnVtX2J5dGVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGRtYSk7CisJY2xlYXJfZG1hX2ZmKGRtYSk7CisKKwludW1fYnl0ZXMgPSBkbWFfYnl0ZXMgLSBnZXRfZG1hX3Jlc2lkdWUoZG1hKTsKKwlpbmZvLT5pY291bnQudHggKz0gZG1hX2J5dGVzOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCisJaWYgKGRtYV9ieXRlcyAhPSBudW1fYnl0ZXMpIHsKKwkJZG1hX2J5dGVzIC09IG51bV9ieXRlczsKKwkJbWVtbW92ZShkbWFfYnVmZmVyLCBkbWFfYnVmZmVyICsgbnVtX2J5dGVzLCBkbWFfYnl0ZXMpOworCQkKKwkJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKyAgICAgICAgCWRpc2FibGVfZG1hKGRtYSk7CisgICAgICAgIAljbGVhcl9kbWFfZmYoZG1hKTsKKyAgICAgICAgCXNldF9kbWFfbW9kZShkbWEsIERNQV9NT0RFX1dSSVRFKTsKKyAgICAgICAgCXNldF9kbWFfYWRkcihkbWEsIGlzYV92aXJ0X3RvX2J1cyhkbWFfYnVmZmVyKSk7CisgICAgICAgIAlzZXRfZG1hX2NvdW50KGRtYSwgZG1hX2J5dGVzKTsKKyAgICAgICAgCWVuYWJsZV9kbWEoZG1hKTsKKyAgICAgICAgCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworICAgICAgICAJCisgICAgICAgIAlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TVEFSVF9ETUFfVFgpOworCX0gZWxzZSB7CisJCWRtYV9ieXRlcyA9IDA7CisJCWluZm8tPnN0YXRfZmxhZ3MgJj0gfkVTUF9TVEFUX0RNQV9UWDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19tb2RlbV9zdGF0dXMoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8pCit7CisJaW50CXN0YXR1czsKKwkKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfVUFSVF9TVEFUKTsKKwlzdGF0dXMgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpOworCisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0FOWV9ERUxUQSkgeworCQkvKiB1cGRhdGUgaW5wdXQgbGluZSBjb3VudGVycyAqLworCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfVEVSSSkKKwkJCWluZm8tPmljb3VudC5ybmcrKzsKKwkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REU1IpCisJCQlpbmZvLT5pY291bnQuZHNyKys7CisJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKQorCQkJaW5mby0+aWNvdW50LmRjZCsrOworCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENUUykKKwkJCWluZm8tPmljb3VudC5jdHMrKzsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJfQorCisJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAmJiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkpIHsKKyNpZiAoZGVmaW5lZChTRVJJQUxfREVCVUdfT1BFTikgfHwgZGVmaW5lZChTRVJJQUxfREVCVUdfSU5UUikpCisJCXByaW50aygidHR5cyVkIENEIG5vdyAlcy4uLiIsIGluZm8tPmxpbmUsCisJCSAgICAgICAoc3RhdHVzICYgVUFSVF9NU1JfRENEKSA/ICJvbiIgOiAib2ZmIik7CisjZW5kaWYJCQorCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENEKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCQllbHNlIHsKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCQkJcHJpbnRrKCJzY2hlZHVsaW5nIGhhbmd1cC4uLiIpOworI2VuZGlmCisJCQlzY2hlZHVsZV93b3JrKCZpbmZvLT50cXVldWVfaGFuZ3VwKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIHNlcmlhbCBkcml2ZXIncyBpbnRlcnJ1cHQgcm91dGluZQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgcnNfaW50ZXJydXB0X3NpbmdsZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbzsKKwl1bnNpZ25lZCBlcnJfc3RhdHVzOworCXVuc2lnbmVkIGludCBzY3JhdGNoOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKKwlwcmludGsoInJzX2ludGVycnVwdF9zaW5nbGUoJWQpLi4uIiwgaXJxKTsKKyNlbmRpZgorCWluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKilkZXZfaWQ7CisJZXJyX3N0YXR1cyA9IDA7CisJc2NyYXRjaCA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TSUQpOworCisJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKKwkKKwlpZiAoIWluZm8tPnR0eSkgeworCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoc2NyYXRjaCAmIDB4MDQpIHsgLyogZXJyb3IgKi8KKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX0VSUl9TVEFUKTsKKwkJZXJyX3N0YXR1cyA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSk7CisJCXNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMik7CisKKwkJaWYgKGVycl9zdGF0dXMgJiAweDAxKQorCQkJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9SWF9USU1FT1VUOworCisJCWlmIChlcnJfc3RhdHVzICYgMHgyMCkgLyogVUFSVCBzdGF0dXMgKi8KKwkJCWNoZWNrX21vZGVtX3N0YXR1cyhpbmZvKTsKKworCQlpZiAoZXJyX3N0YXR1cyAmIDB4ODApIC8qIFN0YXJ0IGJyZWFrICovCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmJyZWFrX3dhaXQpOworCX0KKwkJCisJaWYgKChzY3JhdGNoICYgMHg4OCkgfHwgLyogRE1BIGNvbXBsZXRlZCBvciB0aW1lZCBvdXQgKi8KKwkgICAgKGVycl9zdGF0dXMgJiAweDFjKSAvKiByZWNlaXZlIGVycm9yICovKSB7CisJCWlmIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfRE1BX1JYKQorCQkJcmVjZWl2ZV9jaGFyc19kbWFfZG9uZShpbmZvLCBlcnJfc3RhdHVzKTsKKwkJZWxzZSBpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX0RNQV9UWCkKKwkJCXRyYW5zbWl0X2NoYXJzX2RtYV9kb25lKGluZm8pOworCX0KKworCWlmICghKGluZm8tPnN0YXRfZmxhZ3MgJiAoRVNQX1NUQVRfRE1BX1JYIHwgRVNQX1NUQVRfRE1BX1RYKSkgJiYKKwkgICAgKChzY3JhdGNoICYgMHgwMSkgfHwgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9SWF9USU1FT1VUKSkgJiYKKwkgICAgKGluZm8tPklFUiAmIFVBUlRfSUVSX1JESSkpIHsKKwkJaW50IG51bV9ieXRlczsKKworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9OT19DT01NQU5EKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1JYX0FWQUlMKTsKKwkJbnVtX2J5dGVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKSA8PCA4OworCQludW1fYnl0ZXMgfD0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKKworCQlpZiAobnVtX2J5dGVzID4gKFRUWV9GTElQQlVGX1NJWkUgLSBpbmZvLT50dHktPmZsaXAuY291bnQpKQorCQkgIG51bV9ieXRlcyA9IFRUWV9GTElQQlVGX1NJWkUgLSBpbmZvLT50dHktPmZsaXAuY291bnQ7CisKKwkJaWYgKG51bV9ieXRlcykgeworCQkJaWYgKGRtYV9ieXRlcyB8fAorCQkJICAgIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfVVNFX1BJTykgfHwKKwkJCSAgICAobnVtX2J5dGVzIDw9IGluZm8tPmNvbmZpZy5waW9fdGhyZXNob2xkKSkKKwkJCQlyZWNlaXZlX2NoYXJzX3BpbyhpbmZvLCBudW1fYnl0ZXMpOworCQkJZWxzZQorCQkJCXJlY2VpdmVfY2hhcnNfZG1hKGluZm8sIG51bV9ieXRlcyk7CisJCX0KKwl9CisJCisJaWYgKCEoaW5mby0+c3RhdF9mbGFncyAmIChFU1BfU1RBVF9ETUFfUlggfCBFU1BfU1RBVF9ETUFfVFgpKSAmJgorCSAgICAoc2NyYXRjaCAmIDB4MDIpICYmIChpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSkgeworCQlpZiAoKGluZm8tPnhtaXRfY250IDw9IDApIHx8IGluZm8tPnR0eS0+c3RvcHBlZCkgeworCQkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKKwkJfSBlbHNlIHsKKwkJCWludCBudW1fYnl0ZXM7CisKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1RYX0FWQUlMKTsKKwkJCW51bV9ieXRlcyA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSkgPDwgODsKKwkJCW51bV9ieXRlcyB8PSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpOworCisJCQlpZiAobnVtX2J5dGVzID4gaW5mby0+eG1pdF9jbnQpCisJCQkJbnVtX2J5dGVzID0gaW5mby0+eG1pdF9jbnQ7CisKKwkJCWlmIChudW1fYnl0ZXMpIHsKKwkJCQlpZiAoZG1hX2J5dGVzIHx8CisJCQkJICAgIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfVVNFX1BJTykgfHwKKwkJCQkgICAgKG51bV9ieXRlcyA8PSBpbmZvLT5jb25maWcucGlvX3RocmVzaG9sZCkpCisJCQkJCXRyYW5zbWl0X2NoYXJzX3BpbyhpbmZvLCBudW1fYnl0ZXMpOworCQkJCWVsc2UKKwkJCQkJdHJhbnNtaXRfY2hhcnNfZG1hKGluZm8sIG51bV9ieXRlcyk7CisJCQl9CisJCX0KKwl9CisKKwlpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgorCXByaW50aygiZW5kLlxuIik7CisjZW5kaWYKKwlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSGVyZSBlbmRzIHRoZSBzZXJpYWwgaW50ZXJydXB0IHJvdXRpbmVzLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyB2b2lkIGRvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QJKmluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKikgcHJpdmF0ZV87CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwkKKwl0dHkgPSBpbmZvLT50dHk7CisJaWYgKCF0dHkpCisJCXJldHVybjsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRVNQX0VWRU5UX1dSSVRFX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkgeworCQl0dHlfd2FrZXVwKHR0eSk7CisJfQorfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHRoZSBzY2hlZHVsZXIgdHF1ZXVlIHdoZW4gdGhlIGludGVycnVwdAorICogcm91dGluZSBoYXMgc2lnbmFsbGVkIHRoYXQgYSBoYW5ndXAgaGFzIG9jY3VycmVkLiAgVGhlIHBhdGggb2YKKyAqIGhhbmd1cCBwcm9jZXNzaW5nIGlzOgorICoKKyAqIAlzZXJpYWwgaW50ZXJydXB0IHJvdXRpbmUgLT4gKHNjaGVkdWxlciB0cXVldWUpIC0+CisgKiAJZG9fc2VyaWFsX2hhbmd1cCgpIC0+IHR0eS0+aGFuZ3VwKCkgLT4gZXNwX2hhbmd1cCgpCisgKiAKKyAqLworc3RhdGljIHZvaWQgZG9fc2VyaWFsX2hhbmd1cCh2b2lkICpwcml2YXRlXykKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdAkqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKSBwcml2YXRlXzsKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OworCQorCXR0eSA9IGluZm8tPnR0eTsKKwlpZiAodHR5KQorCQl0dHlfaGFuZ3VwKHR0eSk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvdyBsZXZlbCB1dGlsaXR5IHN1YnJvdXRpbmVzIGZvciB0aGUgc2VyaWFsIGRyaXZlcjogIHJvdXRpbmVzIHRvCisgKiBmaWd1cmUgb3V0IHRoZSBhcHByb3ByaWF0ZSB0aW1lb3V0IGZvciBhbiBpbnRlcnJ1cHQgY2hhaW4sIHJvdXRpbmVzCisgKiB0byBpbml0aWFsaXplIGFuZCBzdGFydHVwIGEgc2VyaWFsIHBvcnQsIGFuZCByb3V0aW5lcyB0byBzaHV0ZG93biBhCisgKiBzZXJpYWwgcG9ydC4gIFVzZWZ1bCBzdHVmZiBsaWtlIHRoYXQuCisgKgorICogQ2FsbGVyIHNob3VsZCBob2xkIGxvY2sKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfYmFzaWNfaW5pdChzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm8pCit7CisJLyogcHV0IEVTUEMgaW4gZW5oYW5jZWQgbW9kZSAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9NT0RFKTsKKwkKKwlpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSkKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAxKTsKKwllbHNlCisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgzMSk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgZm9yIG5vdyAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKKworCS8qIHNldCBpbnRlcnJ1cHQgYW5kIERNQSBjaGFubmVsICovCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0lSUSk7CisKKwlpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSkKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAxKTsKKwllbHNlCisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgKGRtYSA8PCA0KSB8IDB4MDEpOworCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0VOSF9JUlEpOworCisJaWYgKGluZm8tPmxpbmUgJSA4KQkvKiBzZWNvbmRhcnkgcG9ydCAqLworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MGQpOwkvKiBzaGFyZWQgKi8KKwllbHNlIGlmIChpbmZvLT5pcnEgPT0gOSkKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAyKTsKKwllbHNlCisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+aXJxKTsKKworCS8qIHNldCBlcnJvciBzdGF0dXMgbWFzayAoY2hlY2sgdGhpcykgKi8KKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfRVJSX01BU0spOworCisJaWYgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9ORVZFUl9ETUEpCisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHhhMSk7CisJZWxzZQorCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4YmQpOworCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKKworCS8qIHNldCBETUEgdGltZW91dCAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9ETUFfVE1PVVQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHhmZik7CisKKwkvKiBzZXQgRklGTyB0cmlnZ2VyIGxldmVscyAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9UUklHR0VSKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5yeF90cmlnZ2VyID4+IDgpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLnJ4X3RyaWdnZXIpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLnR4X3RyaWdnZXIgPj4gOCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcudHhfdHJpZ2dlcik7CisKKwkvKiBTZXQgY2xvY2sgc2NhbGluZyBhbmQgd2FpdCBzdGF0ZXMgKi8KKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfUFJFU0NBTEFSKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDQgfCBFU1BDX1NDQUxFKTsKKworCS8qIHNldCByZWludGVycnVwdCBwYWNpbmcgKi8KKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfUkVJTlRSKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4ZmYpOworfQorCitzdGF0aWMgaW50IHN0YXJ0dXAoc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50CXJldHZhbD0wOworICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2NoYXJzOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWluZm8tPnhtaXRfYnVmKSB7CisJCWluZm8tPnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWlmICghaW5mby0+eG1pdF9idWYpCisJCQlnb3RvIG91dDsKKwl9CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygic3RhcnRpbmcgdXAgdHR5cyVkIChpcnEgJWQpLi4uIiwgaW5mby0+bGluZSwgaW5mby0+aXJxKTsKKyNlbmRpZgorCisJLyogRmx1c2ggdGhlIFJYIGJ1ZmZlci4gIFVzaW5nIHRoZSBFU0kgZmx1c2ggY29tbWFuZCBtYXkgY2F1c2UgKi8KKwkvKiB3aWxkIGludGVycnVwdHMsIHNvIHJlYWQgYWxsIHRoZSBkYXRhIGluc3RlYWQuICovCisKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9OT19DT01NQU5EKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfUlhfQVZBSUwpOworCW51bV9jaGFycyA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSkgPDwgODsKKwludW1fY2hhcnMgfD0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKKworCXdoaWxlIChudW1fY2hhcnMgPiAxKSB7CisJCWludyhpbmZvLT5wb3J0ICsgVUFSVF9FU0lfUlgpOworCQludW1fY2hhcnMgLT0gMjsKKwl9CisKKwlpZiAobnVtX2NoYXJzKQorCQlzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfUlgpOworCisJLyogc2V0IHJlY2VpdmUgY2hhcmFjdGVyIHRpbWVvdXQgKi8KKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfUlhfVElNRU9VVCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcucnhfdGltZW91dCk7CisKKwkvKiBjbGVhciBhbGwgZmxhZ3MgZXhjZXB0IHRoZSAibmV2ZXIgRE1BIiBmbGFnICovCisJaW5mby0+c3RhdF9mbGFncyAmPSBFU1BfU1RBVF9ORVZFUl9ETUE7CisKKwlpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSkKKwkJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9VU0VfUElPOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgSVJRCisJICovCisKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShpbmZvLT5pcnEsIHJzX2ludGVycnVwdF9zaW5nbGUsIFNBX1NISVJRLAorCQkJICAgICAiZXNwIHNlcmlhbCIsIGluZm8pOworCisJaWYgKHJldHZhbCkgeworCQlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQkJaWYgKGluZm8tPnR0eSkKKwkJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwKKwkJCQkJJmluZm8tPnR0eS0+ZmxhZ3MpOworCQkJcmV0dmFsID0gMDsKKwkJfQorCQlnb3RvIG91dF91bmxvY2tlZDsKKwl9CisKKwlpZiAoIShpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfVVNFX1BJTykgJiYgIWRtYV9idWZmZXIpIHsKKwkJZG1hX2J1ZmZlciA9IChjaGFyICopX19nZXRfZG1hX3BhZ2VzKAorCQkJR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKERNQV9CVUZGRVJfU1opKTsKKworCQkvKiB1c2UgUElPIG1vZGUgaWYgRE1BIGJ1Zi9jaGFuIGNhbm5vdCBiZSBhbGxvY2F0ZWQgKi8KKwkJaWYgKCFkbWFfYnVmZmVyKQorCQkJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9VU0VfUElPOworCQllbHNlIGlmIChyZXF1ZXN0X2RtYShkbWEsICJlc3Agc2VyaWFsIikpIHsKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpZG1hX2J1ZmZlciwKKwkJCQkgICBnZXRfb3JkZXIoRE1BX0JVRkZFUl9TWikpOworCQkJZG1hX2J1ZmZlciA9IE5VTEw7CisJCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX1VTRV9QSU87CisJCX0KKwkJCQorCX0KKworCWluZm8tPk1DUiA9IFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyB8IFVBUlRfTUNSX09VVDI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+TUNSKTsKKwkKKwkvKgorCSAqIEZpbmFsbHksIGVuYWJsZSBpbnRlcnJ1cHRzCisJICovCisJLyogaW5mby0+SUVSID0gVUFSVF9JRVJfTVNJIHwgVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESTsgKi8KKwlpbmZvLT5JRVIgPSBVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJIHwgVUFSVF9JRVJfRE1BX1RNT1VUIHwKKwkJCVVBUlRfSUVSX0RNQV9UQzsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKKwkKKwlpZiAoaW5mby0+dHR5KQorCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogU2V0IHVwIHRoZSB0dHktPmFsdF9zcGVlZCBrbHVkZ2UKKwkgKi8KKwlpZiAoaW5mby0+dHR5KSB7CisJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA1NzYwMDsKKwkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSAxMTUyMDA7CisJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKKwkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMjMwNDAwOworCQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA0NjA4MDA7CisJfQorCQorCS8qCisJICogc2V0IHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQKKwkgKi8KKwljaGFuZ2Vfc3BlZWQoaW5mbyk7CisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CisJcmV0dXJuIDA7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CitvdXRfdW5sb2NrZWQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSB3aWxsIHNodXRkb3duIGEgc2VyaWFsIHBvcnQ7IGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBhbmQKKyAqIERUUiBpcyBkcm9wcGVkIGlmIHRoZSBoYW5ndXAgb24gY2xvc2UgdGVybWlvIGZsYWcgaXMgb24uCisgKi8KK3N0YXRpYyB2b2lkIHNodXRkb3duKHN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzLCBmOworCisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCXJldHVybjsKKworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisJcHJpbnRrKCJTaHV0dGluZyBkb3duIHNlcmlhbCBwb3J0ICVkIChpcnEgJWQpLi4uLiIsIGluZm8tPmxpbmUsCisJICAgICAgIGluZm8tPmlycSk7CisjZW5kaWYKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCS8qCisJICogY2xlYXIgZGVsdGFfbXNyX3dhaXQgcXVldWUgdG8gYXZvaWQgbWVtIGxlYWtzOiB3ZSBtYXkgZnJlZSB0aGUgaXJxCisJICogaGVyZSBzbyB0aGUgcXVldWUgbWlnaHQgbmV2ZXIgYmUgd2FrZW4gdXAKKwkgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmJyZWFrX3dhaXQpOworCisJLyogc3RvcCBhIERNQSB0cmFuc2ZlciBvbiB0aGUgcG9ydCBiZWluZyBjbG9zZWQgKi8KKwkvKiBETUEgbG9jayBpcyBoaWdoZXIgcHJpb3JpdHkgYWx3YXlzICovCisJaWYgKGluZm8tPnN0YXRfZmxhZ3MgJiAoRVNQX1NUQVRfRE1BX1JYIHwgRVNQX1NUQVRfRE1BX1RYKSkgeworCQlmPWNsYWltX2RtYV9sb2NrKCk7CisJCWRpc2FibGVfZG1hKGRtYSk7CisJCWNsZWFyX2RtYV9mZihkbWEpOworCQlyZWxlYXNlX2RtYV9sb2NrKGYpOworCQkKKwkJZG1hX2J5dGVzID0gMDsKKwl9CisJCisJLyoKKwkgKiBGcmVlIHRoZSBJUlEKKwkgKi8KKwlmcmVlX2lycShpbmZvLT5pcnEsIGluZm8pOworCisJaWYgKGRtYV9idWZmZXIpIHsKKwkJc3RydWN0IGVzcF9zdHJ1Y3QgKmN1cnJlbnRfcG9ydCA9IHBvcnRzOworCisJCXdoaWxlIChjdXJyZW50X3BvcnQpIHsKKwkJCWlmICgoY3VycmVudF9wb3J0ICE9IGluZm8pICYmCisJCQkgICAgKGN1cnJlbnRfcG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCQkJYnJlYWs7CisKKwkJCWN1cnJlbnRfcG9ydCA9IGN1cnJlbnRfcG9ydC0+bmV4dF9wb3J0OworCQl9CisKKwkJaWYgKCFjdXJyZW50X3BvcnQpIHsKKwkJCWZyZWVfZG1hKGRtYSk7CisJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWRtYV9idWZmZXIsCisJCQkJICAgZ2V0X29yZGVyKERNQV9CVUZGRVJfU1opKTsKKwkJCWRtYV9idWZmZXIgPSBOVUxMOworCQl9CQkKKwl9CisKKwlpZiAoaW5mby0+eG1pdF9idWYpIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT54bWl0X2J1Zik7CisJCWluZm8tPnhtaXRfYnVmID0gTlVMTDsKKwl9CisKKwlpbmZvLT5JRVIgPSAwOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKKworCWlmICghaW5mby0+dHR5IHx8IChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkpCisJCWluZm8tPk1DUiAmPSB+KFVBUlRfTUNSX0RUUnxVQVJUX01DUl9SVFMpOworCisJaW5mby0+TUNSICY9IH5VQVJUX01DUl9PVVQyOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+TUNSKTsKKworCWlmIChpbmZvLT50dHkpCisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJCisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gc2V0IHRoZSBVQVJUIGRpdmlzb3IgcmVnaXN0ZXJzIHRvIG1hdGNoCisgKiB0aGUgc3BlY2lmaWVkIGJhdWQgcmF0ZSBmb3IgYSBzZXJpYWwgcG9ydC4KKyAqLworc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKQoreworCXVuc2lnbmVkIHNob3J0IHBvcnQ7CisJaW50CXF1b3QgPSAwOworCXVuc2lnbmVkIGNmbGFnLGN2YWw7CisJaW50CWJhdWQsIGJpdHM7CisJdW5zaWduZWQgY2hhciBmbG93MSA9IDAsIGZsb3cyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKKwkJcmV0dXJuOworCWNmbGFnID0gaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCXBvcnQgPSBpbmZvLT5wb3J0OworCQorCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJICAgICAgY2FzZSBDUzU6IGN2YWwgPSAweDAwOyBiaXRzID0gNzsgYnJlYWs7CisJICAgICAgY2FzZSBDUzY6IGN2YWwgPSAweDAxOyBiaXRzID0gODsgYnJlYWs7CisJICAgICAgY2FzZSBDUzc6IGN2YWwgPSAweDAyOyBiaXRzID0gOTsgYnJlYWs7CisJICAgICAgY2FzZSBDUzg6IGN2YWwgPSAweDAzOyBiaXRzID0gMTA7IGJyZWFrOworCSAgICAgIGRlZmF1bHQ6ICBjdmFsID0gMHgwMDsgYml0cyA9IDc7IGJyZWFrOworCX0KKwlpZiAoY2ZsYWcgJiBDU1RPUEIpIHsKKwkJY3ZhbCB8PSAweDA0OworCQliaXRzKys7CisJfQorCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQljdmFsIHw9IFVBUlRfTENSX1BBUklUWTsKKwkJYml0cysrOworCX0KKwlpZiAoIShjZmxhZyAmIFBBUk9ERCkpCisJCWN2YWwgfD0gVUFSVF9MQ1JfRVBBUjsKKyNpZmRlZiBDTVNQQVIKKwlpZiAoY2ZsYWcgJiBDTVNQQVIpCisJCWN2YWwgfD0gVUFSVF9MQ1JfU1BBUjsKKyNlbmRpZgorCisJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKGluZm8tPnR0eSk7CisJaWYgKGJhdWQgPT0gMzg0MDAgJiYKKwkgICAgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkpCisJCXF1b3QgPSBpbmZvLT5jdXN0b21fZGl2aXNvcjsKKwllbHNlIHsKKwkJaWYgKGJhdWQgPT0gMTM0KQorCQkJLyogU3BlY2lhbCBjYXNlIHNpbmNlIDEzNCBpcyByZWFsbHkgMTM0LjUgKi8KKwkJCXF1b3QgPSAoMipCQVNFX0JBVUQgLyAyNjkpOworCQllbHNlIGlmIChiYXVkKQorCQkJcXVvdCA9IEJBU0VfQkFVRCAvIGJhdWQ7CisJfQorCS8qIElmIHRoZSBxdW90aWVudCBpcyBldmVyIHplcm8sIGRlZmF1bHQgdG8gOTYwMCBicHMgKi8KKwlpZiAoIXF1b3QpCisJCXF1b3QgPSBCQVNFX0JBVUQgLyA5NjAwOworCQorCWluZm8tPnRpbWVvdXQgPSAoKDEwMjQgKiBIWiAqIGJpdHMgKiBxdW90KSAvIEJBU0VfQkFVRCkgKyAoSFogLyA1MCk7CisKKwkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgYW5kIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzICovCisJLyogaW5mby0+SUVSICY9IH5VQVJUX0lFUl9NU0k7ICovCisJaWYgKGNmbGFnICYgQ1JUU0NUUykgeworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKKwkJLyogaW5mby0+SUVSIHw9IFVBUlRfSUVSX01TSTsgKi8KKwkJZmxvdzEgPSAweDA0OworCQlmbG93MiA9IDB4MTA7CisJfSBlbHNlCisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKwlpZiAoY2ZsYWcgJiBDTE9DQUwpCisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwllbHNlIHsKKwkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisJCS8qIGluZm8tPklFUiB8PSBVQVJUX0lFUl9NU0k7ICovCisJfQorCisJLyoKKwkgKiBTZXQgdXAgcGFyaXR5IGNoZWNrIGZsYWcKKwkgKi8KKyNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQorCisJaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfVEhSRSB8IFVBUlRfTFNSX0RSOworCWlmIChJX0lOUENLKGluZm8tPnR0eSkpCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfRkUgfCBVQVJUX0xTUl9QRTsKKwlpZiAoSV9CUktJTlQoaW5mby0+dHR5KSB8fCBJX1BBUk1SSyhpbmZvLT50dHkpKQorCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCQorCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayA9IDA7CisjaWYgMAorCS8qIFRoaXMgc2hvdWxkIGJlIHNhZmUsIGJ1dCBmb3Igc29tZSBicm9rZW4gYml0cyBvZiBoYXJkd2FyZS4uLiAqLworCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKSB7CisJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9QRSB8IFVBUlRfTFNSX0ZFOworCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7CisJfQorI2VuZGlmCisJaWYgKElfSUdOQlJLKGluZm8tPnR0eSkpIHsKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCQkvKgorCQkgKiBJZiB3ZSdyZSBpZ25vcmUgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLCBpZ25vcmUgCisJCSAqIG92ZXJydW5zIHRvby4gIChGb3IgcmVhbCByYXcgc3VwcG9ydCkuCisJCSAqLworCQlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkgeworCQkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX09FIHwgXAorCQkJCVVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7CisJCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX09FIHwgXAorCQkJCVVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7CisJCX0KKwl9CisKKwlpZiAoSV9JWE9GRihpbmZvLT50dHkpKQorCQlmbG93MSB8PSAweDgxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkvKiBzZXQgYmF1ZCAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9CQVVEKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIHF1b3QgPj4gOCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBxdW90ICYgMHhmZik7CisKKwkvKiBzZXQgZGF0YSBiaXRzLCBwYXJpdHksIGV0Yy4gKi8KKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9XUklURV9VQVJUKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIFVBUlRfTENSKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGN2YWwpOworCisJLyogRW5hYmxlIGZsb3cgY29udHJvbCAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9GTE9XX0NOVEwpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgZmxvdzEpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgZmxvdzIpOworCisJLyogc2V0IGZsb3cgY29udHJvbCBjaGFyYWN0ZXJzIChYT04vWE9GRiBvbmx5KSAqLworCWlmIChJX0lYT0ZGKGluZm8tPnR0eSkpIHsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0ZMT1dfQ0hBUlMpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIFNUQVJUX0NIQVIoaW5mby0+dHR5KSk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgU1RPUF9DSEFSKGluZm8tPnR0eSkpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MTApOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MjEpOworCQlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKKwkJCWNhc2UgQ1M1OgorCQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgxZik7CisJCQkJYnJlYWs7CisJCQljYXNlIENTNjoKKwkJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4M2YpOworCQkJCWJyZWFrOworCQkJY2FzZSBDUzc6CisJCQljYXNlIENTODoKKwkJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4N2YpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4ZmYpOworCQkJCWJyZWFrOworCQl9CisJfQorCisJLyogU2V0IGhpZ2gvbG93IHdhdGVyICovCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0ZMT1dfTFZMKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5mbG93X29mZiA+PiA4KTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5mbG93X29mZik7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcuZmxvd19vbiA+PiA4KTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5mbG93X29uKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnNfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfcHV0X2NoYXIiKSkKKwkJcmV0dXJuOworCisJaWYgKCF0dHkgfHwgIWluZm8tPnhtaXRfYnVmKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT54bWl0X2NudCA8IEVTUF9YTUlUX1NJWkUgLSAxKSB7CisJCWluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfaGVhZCsrXSA9IGNoOworCQlpbmZvLT54bWl0X2hlYWQgJj0gRVNQX1hNSVRfU0laRS0xOworCQlpbmZvLT54bWl0X2NudCsrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJzX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19mbHVzaF9jaGFycyIpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJaWYgKGluZm8tPnhtaXRfY250IDw9IDAgfHwgdHR5LT5zdG9wcGVkIHx8ICFpbmZvLT54bWl0X2J1ZikKKwkJZ290byBvdXQ7CisKKwlpZiAoIShpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSkgeworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOworCX0KK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcnNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlpbnQJYywgdCwgcmV0ID0gMDsKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfd3JpdGUiKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXR0eSB8fCAhaW5mby0+eG1pdF9idWYgfHwgIXRtcF9idWYpCisJCXJldHVybiAwOworCSAgICAKKwl3aGlsZSAoMSkgeworCQkvKiBUaGFua3MgdG8gUi4gV29sZmYgZm9yIHN1Z2dlc3RpbmcgaG93IHRvIGRvIHRoaXMgd2l0aCAqLworCQkvKiBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KKworCQljID0gY291bnQ7CisJCXQgPSBFU1BfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxOworCQkKKwkJaWYgKHQgPCBjKQorCQkJYyA9IHQ7CisKKwkJdCA9IEVTUF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2hlYWQ7CisJCQorCQlpZiAodCA8IGMpCisJCQljID0gdDsKKworCQlpZiAoYyA8PSAwKQorCQkJYnJlYWs7CisKKwkJbWVtY3B5KGluZm8tPnhtaXRfYnVmICsgaW5mby0+eG1pdF9oZWFkLCBidWYsIGMpOworCisJCWluZm8tPnhtaXRfaGVhZCA9IChpbmZvLT54bWl0X2hlYWQgKyBjKSAmIChFU1BfWE1JVF9TSVpFLTEpOworCQlpbmZvLT54bWl0X2NudCArPSBjOworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKwkJcmV0ICs9IGM7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCWlmIChpbmZvLT54bWl0X2NudCAmJiAhdHR5LT5zdG9wcGVkICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKKwkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByc193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCWludAlyZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3dyaXRlX3Jvb20iKSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJcmV0ID0gRVNQX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByc19jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCQkJCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19jaGFyc19pbl9idWZmZXIiKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGluZm8tPnhtaXRfY250OworfQorCitzdGF0aWMgdm9pZCByc19mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2ZsdXNoX2J1ZmZlciIpKQorCQlyZXR1cm47CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCXR0eV93YWtldXAodHR5KTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnNfdGhyb3R0bGUoKQorICogCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSB1cHBlci1sYXllciB0dHkgbGF5ZXIgdG8gc2lnbmFsIHRoYXQKKyAqIGluY29taW5nIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHRocm90dGxlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCByc190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBTRVJJQUxfREVCVUdfVEhST1RUTEUKKwljaGFyCWJ1Zls2NF07CisJCisJcHJpbnRrKCJ0aHJvdHRsZSAlczogJWQuLi4uXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZiksCisJICAgICAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSkpOworI2VuZGlmCisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3Rocm90dGxlIikpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9SREk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1JYX1RJTUVPVVQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByc191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIFNFUklBTF9ERUJVR19USFJPVFRMRQorCWNoYXIJYnVmWzY0XTsKKwkKKwlwcmludGsoInVudGhyb3R0bGUgJXM6ICVkLi4uLlxuIiwgdHR5X25hbWUodHR5LCBidWYpLAorCSAgICAgICB0dHktPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0dHkpKTsKKyNlbmRpZgorCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc191bnRocm90dGxlIikpCisJCXJldHVybjsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWluZm8tPklFUiB8PSBVQVJUX0lFUl9SREk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1JYX1RJTUVPVVQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLnJ4X3RpbWVvdXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnNfaW9jdGwoKSBhbmQgZnJpZW5kcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGludCBnZXRfc2VyaWFsX2luZm8oc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvLAorCQkJICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKyAgCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAudHlwZSA9IFBPUlRfMTY1NTBBOworCXRtcC5saW5lID0gaW5mby0+bGluZTsKKwl0bXAucG9ydCA9IGluZm8tPnBvcnQ7CisJdG1wLmlycSA9IGluZm8tPmlycTsKKwl0bXAuZmxhZ3MgPSBpbmZvLT5mbGFnczsKKwl0bXAueG1pdF9maWZvX3NpemUgPSAxMDI0OworCXRtcC5iYXVkX2Jhc2UgPSBCQVNFX0JBVUQ7CisJdG1wLmNsb3NlX2RlbGF5ID0gaW5mby0+Y2xvc2VfZGVsYXk7CisJdG1wLmNsb3Npbmdfd2FpdCA9IGluZm8tPmNsb3Npbmdfd2FpdDsKKwl0bXAuY3VzdG9tX2Rpdmlzb3IgPSBpbmZvLT5jdXN0b21fZGl2aXNvcjsKKwl0bXAuaHViNiA9IDA7CisJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCZ0bXAsc2l6ZW9mKCpyZXRpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9lc3BfY29uZmlnKHN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbywKKwkJCSAgc3RydWN0IGhheWVzX2VzcF9jb25maWcgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBoYXllc19lc3BfY29uZmlnIHRtcDsKKyAgCisJaWYgKCFyZXRpbmZvKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisJdG1wLnJ4X3RpbWVvdXQgPSBpbmZvLT5jb25maWcucnhfdGltZW91dDsKKwl0bXAucnhfdHJpZ2dlciA9IGluZm8tPmNvbmZpZy5yeF90cmlnZ2VyOworCXRtcC50eF90cmlnZ2VyID0gaW5mby0+Y29uZmlnLnR4X3RyaWdnZXI7CisJdG1wLmZsb3dfb2ZmID0gaW5mby0+Y29uZmlnLmZsb3dfb2ZmOworCXRtcC5mbG93X29uID0gaW5mby0+Y29uZmlnLmZsb3dfb247CisJdG1wLnBpb190aHJlc2hvbGQgPSBpbmZvLT5jb25maWcucGlvX3RocmVzaG9sZDsKKwl0bXAuZG1hX2NoYW5uZWwgPSAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSA/IDAgOiBkbWEpOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IHNldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm8sCisJCQkgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKm5ld19pbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CisJc3RydWN0IGVzcF9zdHJ1Y3Qgb2xkX2luZm87CisJdW5zaWduZWQgaW50IGNoYW5nZV9pcnE7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKmN1cnJlbnRfYXN5bmM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsbmV3X2luZm8sc2l6ZW9mKG5ld19zZXJpYWwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJb2xkX2luZm8gPSAqaW5mbzsKKworCWlmICgobmV3X3NlcmlhbC50eXBlICE9IFBPUlRfMTY1NTBBKSB8fAorCSAgICAobmV3X3NlcmlhbC5odWI2KSB8fAorCSAgICAoaW5mby0+cG9ydCAhPSBuZXdfc2VyaWFsLnBvcnQpIHx8CisJICAgIChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBCQVNFX0JBVUQpIHx8CisJICAgIChuZXdfc2VyaWFsLmlycSA+IDE1KSB8fAorCSAgICAobmV3X3NlcmlhbC5pcnEgPCAyKSB8fAorCSAgICAobmV3X3NlcmlhbC5pcnEgPT0gNikgfHwKKwkgICAgKG5ld19zZXJpYWwuaXJxID09IDgpIHx8CisJICAgIChuZXdfc2VyaWFsLmlycSA9PSAxMykpCisJCXJldHVybiAtRUlOVkFMOworCisJY2hhbmdlX2lycSA9IG5ld19zZXJpYWwuaXJxICE9IGluZm8tPmlycTsKKworCWlmIChjaGFuZ2VfaXJxICYmIChpbmZvLT5saW5lICUgOCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCWlmIChjaGFuZ2VfaXJxIHx8IAorCQkgICAgKG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgIT0gaW5mby0+Y2xvc2VfZGVsYXkpIHx8CisJCSAgICAoKG5ld19zZXJpYWwuZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spICE9CisJCSAgICAgKGluZm8tPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKKwkJCSAgICAgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX1VTUl9NQVNLKSk7CisJCWluZm8tPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKKwl9IGVsc2UgeworCQlpZiAobmV3X3NlcmlhbC5pcnEgPT0gMikKKwkJCW5ld19zZXJpYWwuaXJxID0gOTsKKworCQlpZiAoY2hhbmdlX2lycSkgeworCQkJY3VycmVudF9hc3luYyA9IHBvcnRzOworCisJCQl3aGlsZSAoY3VycmVudF9hc3luYykgeworCQkJCWlmICgoY3VycmVudF9hc3luYy0+bGluZSA+PSBpbmZvLT5saW5lKSAmJgorCQkJCSAgICAoY3VycmVudF9hc3luYy0+bGluZSA8IChpbmZvLT5saW5lICsgOCkpKSB7CisJCQkJCWlmIChjdXJyZW50X2FzeW5jID09IGluZm8pIHsKKwkJCQkJCWlmIChjdXJyZW50X2FzeW5jLT5jb3VudCA+IDEpCisJCQkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQkJfSBlbHNlIGlmIChjdXJyZW50X2FzeW5jLT5jb3VudCkKKwkJCQkJCXJldHVybiAtRUJVU1k7CisJCQkJfQorCisJCQkJY3VycmVudF9hc3luYyA9IGN1cnJlbnRfYXN5bmMtPm5leHRfcG9ydDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIE9LLCBwYXN0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3IgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZS4KKwkJICogQXQgdGhpcyBwb2ludCwgd2Ugc3RhcnQgbWFraW5nIGNoYW5nZXMuLi4uLgorCQkgKi8KKworCQlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwKKwkJCSAgICAgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CisJCWluZm8tPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKKwkJaW5mby0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICogSFovMTAwOworCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCAqIEhaLzEwMDsKKworCQlpZiAoY2hhbmdlX2lycSkgeworCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8gc2h1dGRvd24gdGhlIHNlcmlhbCBwb3J0IGF0IHRoZSBvbGQKKwkJCSAqIHBvcnQvaXJxIGNvbWJpbmF0aW9uLgorCQkJICovCisJCQlzaHV0ZG93bihpbmZvKTsKKworCQkJY3VycmVudF9hc3luYyA9IHBvcnRzOworCisJCQl3aGlsZSAoY3VycmVudF9hc3luYykgeworCQkJCWlmICgoY3VycmVudF9hc3luYy0+bGluZSA+PSBpbmZvLT5saW5lKSAmJgorCQkJCSAgICAoY3VycmVudF9hc3luYy0+bGluZSA8IChpbmZvLT5saW5lICsgOCkpKQorCQkJCQljdXJyZW50X2FzeW5jLT5pcnEgPSBuZXdfc2VyaWFsLmlycTsKKworCQkJCWN1cnJlbnRfYXN5bmMgPSBjdXJyZW50X2FzeW5jLT5uZXh0X3BvcnQ7CisJCQl9CisKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9FTkhfSVJRKTsKKwkJCWlmIChpbmZvLT5pcnEgPT0gOSkKKwkJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDIpOworCQkJZWxzZQorCQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+aXJxKTsKKwkJfQorCX0KKworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCWlmICgoKG9sZF9pbmZvLmZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9CisJCSAgICAgKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spKSB8fAorCQkgICAgKG9sZF9pbmZvLmN1c3RvbV9kaXZpc29yICE9IGluZm8tPmN1c3RvbV9kaXZpc29yKSkgeworCQkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA1NzYwMDsKKwkJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKKwkJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDExNTIwMDsKKwkJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKKwkJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDIzMDQwMDsKKwkJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1dBUlApCisJCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA0NjA4MDA7CisJCQljaGFuZ2Vfc3BlZWQoaW5mbyk7CisJCX0KKwl9IGVsc2UKKwkJcmV0dmFsID0gc3RhcnR1cChpbmZvKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2VzcF9jb25maWcoc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvLAorCQkJICBzdHJ1Y3QgaGF5ZXNfZXNwX2NvbmZpZyBfX3VzZXIgKiBuZXdfaW5mbykKK3sKKwlzdHJ1Y3QgaGF5ZXNfZXNwX2NvbmZpZyBuZXdfY29uZmlnOworCXVuc2lnbmVkIGludCBjaGFuZ2VfZG1hOworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBlc3Bfc3RydWN0ICpjdXJyZW50X2FzeW5jOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBQZXJoYXBzIGEgbm9uLXN5c2FkbWluIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZG8gc29tZSBvZiB0aGVzZSAqLworCS8qIG9wZXJhdGlvbnMuICBJIGhhdmVuJ3QgZGVjaWRlZCB5ZXQuICovCisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19jb25maWcsIG5ld19pbmZvLCBzaXplb2YobmV3X2NvbmZpZykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgobmV3X2NvbmZpZy5mbG93X29uID49IG5ld19jb25maWcuZmxvd19vZmYpIHx8CisJICAgIChuZXdfY29uZmlnLnJ4X3RyaWdnZXIgPCAxKSB8fAorCSAgICAobmV3X2NvbmZpZy50eF90cmlnZ2VyIDwgMSkgfHwKKwkgICAgKG5ld19jb25maWcuZmxvd19vZmYgPCAxKSB8fAorCSAgICAobmV3X2NvbmZpZy5mbG93X29uIDwgMSkgfHwKKwkgICAgKG5ld19jb25maWcucnhfdHJpZ2dlciA+IDEwMjMpIHx8CisJICAgIChuZXdfY29uZmlnLnR4X3RyaWdnZXIgPiAxMDIzKSB8fAorCSAgICAobmV3X2NvbmZpZy5mbG93X29mZiA+IDEwMjMpIHx8CisJICAgIChuZXdfY29uZmlnLmZsb3dfb24gPiAxMDIzKSB8fAorCSAgICAobmV3X2NvbmZpZy5waW9fdGhyZXNob2xkIDwgMCkgfHwKKwkgICAgKG5ld19jb25maWcucGlvX3RocmVzaG9sZCA+IDEwMjQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgobmV3X2NvbmZpZy5kbWFfY2hhbm5lbCAhPSAxKSAmJiAobmV3X2NvbmZpZy5kbWFfY2hhbm5lbCAhPSAzKSkKKwkJbmV3X2NvbmZpZy5kbWFfY2hhbm5lbCA9IDA7CisKKwlpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSkKKwkJY2hhbmdlX2RtYSA9IG5ld19jb25maWcuZG1hX2NoYW5uZWw7CisJZWxzZQorCQljaGFuZ2VfZG1hID0gKG5ld19jb25maWcuZG1hX2NoYW5uZWwgIT0gZG1hKTsKKworCWlmIChjaGFuZ2VfZG1hKSB7CisJCWlmIChuZXdfY29uZmlnLmRtYV9jaGFubmVsKSB7CisJCQkvKiBQSU8gbW9kZSB0byBETUEgbW9kZSB0cmFuc2l0aW9uIE9SICovCisJCQkvKiBjaGFuZ2UgY3VycmVudCBETUEgY2hhbm5lbCAqLworCQkJCisJCQljdXJyZW50X2FzeW5jID0gcG9ydHM7CisKKwkJCXdoaWxlIChjdXJyZW50X2FzeW5jKSB7CisJCQkJaWYgKGN1cnJlbnRfYXN5bmMgPT0gaW5mbykgeworCQkJCQlpZiAoY3VycmVudF9hc3luYy0+Y291bnQgPiAxKQorCQkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQl9IGVsc2UgaWYgKGN1cnJlbnRfYXN5bmMtPmNvdW50KQorCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJCQkKKwkJCQljdXJyZW50X2FzeW5jID0KKwkJCQkJY3VycmVudF9hc3luYy0+bmV4dF9wb3J0OworCQkJfQorCisJCQlzaHV0ZG93bihpbmZvKTsKKwkJCWRtYSA9IG5ld19jb25maWcuZG1hX2NoYW5uZWw7CisJCQlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9ORVZFUl9ETUE7CisJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbCBwb3J0cyBtdXN0IHVzZSB0aGUgc2FtZSBETUEgY2hhbm5lbCAqLworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQkJY3VycmVudF9hc3luYyA9IHBvcnRzOworCisJCQl3aGlsZSAoY3VycmVudF9hc3luYykgeworCQkJCWVzcF9iYXNpY19pbml0KGN1cnJlbnRfYXN5bmMpOworCQkJCWN1cnJlbnRfYXN5bmMgPSBjdXJyZW50X2FzeW5jLT5uZXh0X3BvcnQ7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQkvKiBETUEgbW9kZSB0byBQSU8gbW9kZSBvbmx5ICovCisJCQkKKwkJCWlmIChpbmZvLT5jb3VudCA+IDEpCisJCQkJcmV0dXJuIC1FQlVTWTsKKworCQkJc2h1dGRvd24oaW5mbyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQkJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9ORVZFUl9ETUE7CisJCQllc3BfYmFzaWNfaW5pdChpbmZvKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJfQorCX0KKworCWluZm8tPmNvbmZpZy5waW9fdGhyZXNob2xkID0gbmV3X2NvbmZpZy5waW9fdGhyZXNob2xkOworCisJaWYgKChuZXdfY29uZmlnLmZsb3dfb2ZmICE9IGluZm8tPmNvbmZpZy5mbG93X29mZikgfHwKKwkgICAgKG5ld19jb25maWcuZmxvd19vbiAhPSBpbmZvLT5jb25maWcuZmxvd19vbikpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlpbmZvLT5jb25maWcuZmxvd19vZmYgPSBuZXdfY29uZmlnLmZsb3dfb2ZmOworCQlpbmZvLT5jb25maWcuZmxvd19vbiA9IG5ld19jb25maWcuZmxvd19vbjsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfRkxPV19MVkwpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIG5ld19jb25maWcuZmxvd19vZmYgPj4gOCk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgbmV3X2NvbmZpZy5mbG93X29mZik7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgbmV3X2NvbmZpZy5mbG93X29uID4+IDgpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIG5ld19jb25maWcuZmxvd19vbik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoKG5ld19jb25maWcucnhfdHJpZ2dlciAhPSBpbmZvLT5jb25maWcucnhfdHJpZ2dlcikgfHwKKwkgICAgKG5ld19jb25maWcudHhfdHJpZ2dlciAhPSBpbmZvLT5jb25maWcudHhfdHJpZ2dlcikpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlpbmZvLT5jb25maWcucnhfdHJpZ2dlciA9IG5ld19jb25maWcucnhfdHJpZ2dlcjsKKwkJaW5mby0+Y29uZmlnLnR4X3RyaWdnZXIgPSBuZXdfY29uZmlnLnR4X3RyaWdnZXI7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9UUklHR0VSKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLAorCQkJICAgbmV3X2NvbmZpZy5yeF90cmlnZ2VyID4+IDgpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIG5ld19jb25maWcucnhfdHJpZ2dlcik7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwKKwkJCSAgIG5ld19jb25maWcudHhfdHJpZ2dlciA+PiA4KTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBuZXdfY29uZmlnLnR4X3RyaWdnZXIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKG5ld19jb25maWcucnhfdGltZW91dCAhPSBpbmZvLT5jb25maWcucnhfdGltZW91dCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWluZm8tPmNvbmZpZy5yeF90aW1lb3V0ID0gbmV3X2NvbmZpZy5yeF90aW1lb3V0OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJCWlmIChpbmZvLT5JRVIgJiBVQVJUX0lFUl9SREkpIHsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwKKwkJCQkgICBFU0lfU0VUX1JYX1RJTUVPVVQpOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLAorCQkJCSAgIG5ld19jb25maWcucnhfdGltZW91dCk7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogZ2V0X2xzcl9pbmZvIC0gZ2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyIGluZm8KKyAqCisgKiBQdXJwb3NlOiBMZXQgdXNlciBjYWxsIGlvY3RsKCkgdG8gZ2V0IGluZm8gd2hlbiB0aGUgVUFSVCBwaHlzaWNhbGx5CisgKiAJICAgIGlzIGVtcHRpZWQuICBPbiBidXMgdHlwZXMgbGlrZSBSUzQ4NSwgdGhlIHRyYW5zbWl0dGVyIG11c3QKKyAqIAkgICAgcmVsZWFzZSB0aGUgYnVzIGFmdGVyIHRyYW5zbWl0dGluZy4gVGhpcyBtdXN0IGJlIGRvbmUgd2hlbgorICogCSAgICB0aGUgdHJhbnNtaXQgc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHksIG5vdCBiZSBkb25lIHdoZW4gdGhlCisgKiAJICAgIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgaXMgZW1wdHkuICBUaGlzIGZ1bmN0aW9uYWxpdHkKKyAqIAkgICAgYWxsb3dzIGFuIFJTNDg1IGRyaXZlciB0byBiZSB3cml0dGVuIGluIHVzZXIgc3BhY2UuIAorICovCitzdGF0aWMgaW50IGdldF9sc3JfaW5mbyhzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm8sIHVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1VBUlRfU1RBVCk7CisJc3RhdHVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJcmVzdWx0ID0gKChzdGF0dXMgJiBVQVJUX0xTUl9URU1UKSA/IFRJT0NTRVJfVEVNVCA6IDApOworCXJldHVybiBwdXRfdXNlcihyZXN1bHQsdmFsdWUpOworfQorCisKK3N0YXRpYyBpbnQgZXNwX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgY2hhciBjb250cm9sLCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCBfX0ZVTkNUSU9OX18pKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCXJldHVybiAtRUlPOworCisJY29udHJvbCA9IGluZm8tPk1DUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1VBUlRfU1RBVCk7CisJc3RhdHVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gICAgKChjb250cm9sICYgVUFSVF9NQ1JfUlRTKSA/IFRJT0NNX1JUUyA6IDApCisJCXwgKChjb250cm9sICYgVUFSVF9NQ1JfRFRSKSA/IFRJT0NNX0RUUiA6IDApCisJCXwgKChzdGF0dXMgICYgVUFSVF9NU1JfRENEKSA/IFRJT0NNX0NBUiA6IDApCisJCXwgKChzdGF0dXMgICYgVUFSVF9NU1JfUkkpID8gVElPQ01fUk5HIDogMCkKKwkJfCAoKHN0YXR1cyAgJiBVQVJUX01TUl9EU1IpID8gVElPQ01fRFNSIDogMCkKKwkJfCAoKHN0YXR1cyAgJiBVQVJUX01TUl9DVFMpID8gVElPQ01fQ1RTIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgZXNwX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCBfX0ZVTkNUSU9OX18pKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCXJldHVybiAtRUlPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9SVFM7CisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0RUUjsKKworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9SVFM7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX0RUUjsKKworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+TUNSKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJzX2JyZWFrKCkgLS0tIHJvdXRpbmUgd2hpY2ggdHVybnMgdGhlIGJyZWFrIGhhbmRsaW5nIG9uIG9yIG9mZgorICovCitzdGF0aWMgdm9pZCBlc3BfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImVzcF9icmVhayIpKQorCQlyZXR1cm47CisKKwlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfSVNTVUVfQlJFQUspOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwkJLyogRklYTUUgLSBuZXcgc3R5bGUgd2FpdCBuZWVkZWQgaGVyZSAqLworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5icmVha193YWl0KTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9JU1NVRV9CUkVBSyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcnNfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNwcmV2LCBjbm93OwkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLworCXN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IF9fdXNlciAqcF9jdXNlcjsJLyogdXNlciBzcGFjZSAqLworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2lvY3RsIikpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCisJICAgIChjbWQgIT0gVElPQ1NFUkNPTkZJRykgJiYgKGNtZCAhPSBUSU9DU0VSR1dJTEQpICAmJgorCSAgICAoY21kICE9IFRJT0NTRVJTV0lMRCkgJiYgKGNtZCAhPSBUSU9DU0VSR1NUUlVDVCkgJiYKKwkgICAgKGNtZCAhPSBUSU9DTUlXQUlUKSAmJiAoY21kICE9IFRJT0NHSUNPVU5UKSAmJgorCSAgICAoY21kICE9IFRJT0NHSEFZRVNFU1ApICYmIChjbWQgIT0gVElPQ1NIQVlFU0VTUCkpIHsKKwkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQkgICAgcmV0dXJuIC1FSU87CisJfQorCQorCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgVElPQ0dTRVJJQUw6CisJCQlyZXR1cm4gZ2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOworCQljYXNlIFRJT0NTU0VSSUFMOgorCQkJcmV0dXJuIHNldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKKwkJY2FzZSBUSU9DU0VSQ09ORklHOgorCQkJLyogZG8gbm90IHJlY29uZmlndXJlIGFmdGVyIGluaXRpYWwgY29uZmlndXJhdGlvbiAqLworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUSU9DU0VSR1dJTEQ6CisJCQlyZXR1cm4gcHV0X3VzZXIoMEwsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApOworCisJCWNhc2UgVElPQ1NFUkdFVExTUjogLyogR2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCisJCQkgICAgcmV0dXJuIGdldF9sc3JfaW5mbyhpbmZvLCBhcmdwKTsKKworCQljYXNlIFRJT0NTRVJTV0lMRDoKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJcmV0dXJuIDA7CisKKwkJLyoKKwkJICogV2FpdCBmb3IgYW55IG9mIHRoZSA0IG1vZGVtIGlucHV0cyAoRENELFJJLERTUixDVFMpIHRvIGNoYW5nZQorCQkgKiAtIG1hc2sgcGFzc2VkIGluIGFyZyBmb3IgbGluZXMgb2YgaW50ZXJlc3QKKyAJCSAqICAgKHVzZSB8J2VkIFRJT0NNX1JORy9EU1IvQ0QvQ1RTIGZvciBtYXNraW5nKQorCQkgKiBDYWxsZXIgc2hvdWxkIHVzZSBUSU9DR0lDT1VOVCB0byBzZWUgd2hpY2ggb25lIGl0IHdhcworCQkgKi8KKwkJIGNhc2UgVElPQ01JV0FJVDoKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCQljcHJldiA9IGluZm8tPmljb3VudDsJLyogbm90ZSB0aGUgY291bnRlcnMgb24gZW50cnkgKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJCXdoaWxlICgxKSB7CisJCQkJLyogRklYTUU6IGNvbnZlcnQgdG8gbmV3IHN0eWxlIHdha2V1cCAqLworCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKwkJCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCQkJY25vdyA9IGluZm8tPmljb3VudDsJLyogYXRvbWljIGNvcHkgKi8KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCQkJaWYgKGNub3cucm5nID09IGNwcmV2LnJuZyAmJgorCQkJCSAgICBjbm93LmRzciA9PSBjcHJldi5kc3IgJiYgCisJCQkJICAgIGNub3cuZGNkID09IGNwcmV2LmRjZCAmJgorCQkJCSAgICBjbm93LmN0cyA9PSBjcHJldi5jdHMpCisJCQkJCXJldHVybiAtRUlPOyAvKiBubyBjaGFuZ2UgPT4gZXJyb3IgKi8KKwkJCQlpZiAoKChhcmcgJiBUSU9DTV9STkcpICYmCisJCQkJICAgICAoY25vdy5ybmcgIT0gY3ByZXYucm5nKSkgfHwKKwkJCQkgICAgICgoYXJnICYgVElPQ01fRFNSKSAmJgorCQkJCSAgICAgIChjbm93LmRzciAhPSBjcHJldi5kc3IpKSB8fAorCQkJCSAgICAgKChhcmcgJiBUSU9DTV9DRCkgJiYKKwkJCQkgICAgICAoY25vdy5kY2QgIT0gY3ByZXYuZGNkKSkgfHwKKwkJCQkgICAgICgoYXJnICYgVElPQ01fQ1RTKSAmJgorCQkJCSAgICAgIChjbm93LmN0cyAhPSBjcHJldi5jdHMpKSApIHsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWNwcmV2ID0gY25vdzsKKwkJCX0KKwkJCS8qIE5PVFJFQUNIRUQgKi8KKworCQkvKiAKKwkJICogR2V0IGNvdW50ZXIgb2YgaW5wdXQgc2VyaWFsIGxpbmUgaW50ZXJydXB0cyAoRENELFJJLERTUixDVFMpCisJCSAqIFJldHVybjogd3JpdGUgY291bnRlcnMgdG8gdGhlIHVzZXIgcGFzc2VkIGNvdW50ZXIgc3RydWN0CisJCSAqIE5COiBib3RoIDEtPjAgYW5kIDAtPjEgdHJhbnNpdGlvbnMgYXJlIGNvdW50ZWQgZXhjZXB0IGZvcgorCQkgKiAgICAgUkkgd2hlcmUgb25seSAwLT4xIGlzIGNvdW50ZWQuCisJCSAqLworCQljYXNlIFRJT0NHSUNPVU5UOgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCQlwX2N1c2VyID0gYXJncDsKKwkJCWlmIChwdXRfdXNlcihjbm93LmN0cywgJnBfY3VzZXItPmN0cykgfHwKKwkJCSAgICBwdXRfdXNlcihjbm93LmRzciwgJnBfY3VzZXItPmRzcikgfHwKKwkJCSAgICBwdXRfdXNlcihjbm93LnJuZywgJnBfY3VzZXItPnJuZykgfHwKKwkJCSAgICBwdXRfdXNlcihjbm93LmRjZCwgJnBfY3VzZXItPmRjZCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldHVybiAwOworCWNhc2UgVElPQ0dIQVlFU0VTUDoKKwkJcmV0dXJuIGdldF9lc3BfY29uZmlnKGluZm8sIGFyZ3ApOworCWNhc2UgVElPQ1NIQVlFU0VTUDoKKwkJcmV0dXJuIHNldF9lc3BfY29uZmlnKGluZm8sIGFyZ3ApOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJzX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICggICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQorCSAgICAmJiAoICAgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAKKwkJPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKKwkJcmV0dXJuOworCisJY2hhbmdlX3NwZWVkKGluZm8pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCS8qIEhhbmRsZSB0cmFuc2l0aW9uIHRvIEIwIHN0YXR1cyAqLworCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYKKwkJISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpIHsKKwkJaW5mby0+TUNSICY9IH4oVUFSVF9NQ1JfRFRSfFVBUlRfTUNSX1JUUyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIFVBUlRfTUNSKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5NQ1IpOworCX0KKworCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGF3YXkgZnJvbSBCMCBzdGF0dXMgKi8KKwlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJgorCQkodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKSB7CisJCWluZm8tPk1DUiB8PSAoVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfV1JJVEVfVUFSVCk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPk1DUik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJLyogSGFuZGxlIHR1cm5pbmcgb2YgQ1JUU0NUUyAqLworCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgorCSAgICAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCXJzX3N0YXJ0KHR0eSk7CisJfQorfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByc19jbG9zZSgpCisgKiAKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUgc2VyaWFsIHBvcnQgZ2V0cyBjbG9zZWQuICBGaXJzdCwgd2UKKyAqIHdhaXQgZm9yIHRoZSBsYXN0IHJlbWFpbmluZyBkYXRhIHRvIGJlIHNlbnQuICBUaGVuLCB3ZSB1bmxpbmsgaXRzCisgKiBhc3luYyBzdHJ1Y3R1cmUgZnJvbSB0aGUgaW50ZXJydXB0IGNoYWluIGlmIG5lY2Vzc2FyeSwgYW5kIHdlIGZyZWUKKyAqIHRoYXQgSVJRIGlmIG5vdGhpbmcgaXMgbGVmdCBpbiB0aGUgY2hhaW4uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgcnNfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaW5mbyB8fCBzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfY2xvc2UiKSkKKwkJcmV0dXJuOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJREJHX0NOVCgiYmVmb3JlIERFQy1odW5nIik7CisJCWdvdG8gb3V0OworCX0KKwkKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygicnNfY2xvc2UgdHR5cyVkLCBjb3VudCA9ICVkXG4iLCBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7CisjZW5kaWYKKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKGluZm8tPmNvdW50ICE9IDEpKSB7CisJCS8qCisJCSAqIFVoLCBvaC4gIHR0eS0+Y291bnQgaXMgMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdHR5CisJCSAqIHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkLiAgSW5mby0+Y291bnQgc2hvdWxkIGFsd2F5cworCQkgKiBiZSBvbmUgaW4gdGhlc2UgY29uZGl0aW9ucy4gIElmIGl0J3MgZ3JlYXRlciB0aGFuCisJCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQorCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KKwkJICovCisJCXByaW50aygicnNfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCisJCSAgICAgICAiaW5mby0+Y291bnQgaXMgJWRcbiIsIGluZm8tPmNvdW50KTsKKwkJaW5mby0+Y291bnQgPSAxOworCX0KKwlpZiAoLS1pbmZvLT5jb3VudCA8IDApIHsKKwkJcHJpbnRrKCJyc19jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50IGZvciB0dHlzJWQ6ICVkXG4iLAorCQkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworCQlpbmZvLT5jb3VudCA9IDA7CisJfQorCWlmIChpbmZvLT5jb3VudCkgeworCQlEQkdfQ05UKCJiZWZvcmUgREVDLTIiKTsKKwkJZ290byBvdXQ7CisJfQorCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBOb3cgd2Ugd2FpdCBmb3IgdGhlIHRyYW5zbWl0IGJ1ZmZlciB0byBjbGVhcjsgYW5kIHdlIG5vdGlmeSAKKwkgKiB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIG9ubHkgcHJvY2VzcyBYT04vWE9GRiBjaGFyYWN0ZXJzLgorCSAqLworCXR0eS0+Y2xvc2luZyA9IDE7CisJaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPmNsb3Npbmdfd2FpdCk7CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiAgVG8gZG8gdGhpcywgd2UKKwkgKiBkaXNhYmxlIHRoZSByZWNlaXZlIGxpbmUgc3RhdHVzIGludGVycnVwdHMsIGFuZCB0ZWxsIHRoZQorCSAqIGludGVycnVwdCBkcml2ZXIgdG8gc3RvcCBjaGVja2luZyB0aGUgZGF0YSByZWFkeSBiaXQgaW4gdGhlCisJICogbGluZSBzdGF0dXMgcmVnaXN0ZXIuCisJICovCisJLyogaW5mby0+SUVSICY9IH5VQVJUX0lFUl9STFNJOyAqLworCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfUkRJOworCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgJj0gflVBUlRfTFNSX0RSOworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOworCisJCS8qIGRpc2FibGUgcmVjZWl2ZSB0aW1lb3V0ICovCisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9SWF9USU1FT1VUKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwkJLyoKKwkJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIKKwkJICogaGFzIGNvbXBsZXRlbHkgZHJhaW5lZDsgdGhpcyBpcyBlc3BlY2lhbGx5CisJCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCisJCSAqLworCQlyc193YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT50aW1lb3V0KTsKKwl9CisJc2h1dGRvd24oaW5mbyk7CisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKwl0dHktPmNsb3NpbmcgPSAwOworCWluZm8tPmV2ZW50ID0gMDsKKwlpbmZvLT50dHkgPSBOVUxMOworCisJaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgeworCQlpZiAoaW5mby0+Y2xvc2VfZGVsYXkpIHsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoaW5mby0+Y2xvc2VfZGVsYXkpKTsKKwkJfQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJfQorCWluZm8tPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRXxBU1lOQ19DTE9TSU5HKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmNsb3NlX3dhaXQpOworCXJldHVybjsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnNfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIG9yaWdfamlmZmllcywgY2hhcl90aW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3dhaXRfdW50aWxfc2VudCIpKQorCQlyZXR1cm47CisKKwlvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworCWNoYXJfdGltZSA9ICgoaW5mby0+dGltZW91dCAtIEhaIC8gNTApIC8gMTAyNCkgLyA1OworCisJaWYgKCFjaGFyX3RpbWUpCisJCWNoYXJfdGltZSA9IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0dFVF9UWF9BVkFJTCk7CisKKwl3aGlsZSAoKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSkgIT0gMHgwMykgfHwKKwkJKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMikgIT0gMHhmZikpIHsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hhcl90aW1lKSk7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisKKwkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCWJyZWFrOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfVFhfQVZBSUwpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKK30KKworLyoKKyAqIGVzcF9oYW5ndXAoKSAtLS0gY2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgorICovCitzdGF0aWMgdm9pZCBlc3BfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwkKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImVzcF9oYW5ndXAiKSkKKwkJcmV0dXJuOworCQorCXJzX2ZsdXNoX2J1ZmZlcih0dHkpOworCXNodXRkb3duKGluZm8pOworCWluZm8tPmV2ZW50ID0gMDsKKwlpbmZvLT5jb3VudCA9IDA7CisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJaW5mby0+dHR5ID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGVzcF9vcGVuKCkgYW5kIGZyaWVuZHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJCQkgICBzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQJCXJldHZhbDsKKwlpbnQJCWRvX2Nsb2NhbCA9IDA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCS8qCisJICogSWYgdGhlIGRldmljZSBpcyBpbiB0aGUgbWlkZGxlIG9mIGJlaW5nIGNsb3NlZCwgdGhlbiBibG9jaworCSAqIHVudGlsIGl0J3MgZG9uZSwgYW5kIHRoZW4gdHJ5IGFnYWluLgorCSAqLworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CisJICAgIChpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpKSB7CisJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpCisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKKyNpZmRlZiBTRVJJQUxfRE9fUkVTVEFSVAorCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWVsc2UKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisjZWxzZQorCQlyZXR1cm4gLUVBR0FJTjsKKyNlbmRpZgorCX0KKworCS8qCisJICogSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCBvciB0aGUgcG9ydCBpcyBub3QgZW5hYmxlZCwKKwkgKiB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250IGFuZCB0aGVuIGV4aXQuCisJICovCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwKKwkgICAgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgeworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQlkb19jbG9jYWwgPSAxOworCisJLyoKKwkgKiBCbG9jayB3YWl0aW5nIGZvciB0aGUgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZQorCSAqIGZyZWUgKGkuZS4sIG5vdCBpbiB1c2UgYnkgdGhlIGNhbGxvdXQpLiAgV2hpbGUgd2UgYXJlIGluCisJICogdGhpcyBsb29wLCBpbmZvLT5jb3VudCBpcyBkcm9wcGVkIGJ5IG9uZSwgc28gdGhhdAorCSAqIHJzX2Nsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIFdlIHJlc3RvcmUgaXQgdXBvbgorCSAqIGV4aXQsIGVpdGhlciBub3JtYWwgb3IgYWJub3JtYWwuCisJICovCisJcmV0dmFsID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoImJsb2NrX3RpbF9yZWFkeSBiZWZvcmUgYmxvY2s6IHR0eXMlZCwgY291bnQgPSAlZFxuIiwKKwkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpIAorCQlpbmZvLT5jb3VudC0tOworCWluZm8tPmJsb2NrZWRfb3BlbisrOworCXdoaWxlICgxKSB7CisJCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKSB7CisJCQl1bnNpZ25lZCBpbnQgc2NyYXRjaDsKKworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfUkVBRF9VQVJUKTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCQkJc2NyYXRjaCA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSk7CisJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9XUklURV9VQVJUKTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLAorCQkJCXNjcmF0Y2ggfCBVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMpOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CisJCSAgICAhKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisjaWZkZWYgU0VSSUFMX0RPX1JFU1RBUlQKKwkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CQorI2Vsc2UKKwkJCXJldHZhbCA9IC1FQUdBSU47CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1VBUlRfU1RBVCk7CisJCWlmIChzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpICYgVUFSVF9NU1JfRENEKQorCQkJZG9fY2xvY2FsID0gMTsKKworCQlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmCisJCSAgICAoZG9fY2xvY2FsKSkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwkJcHJpbnRrKCJibG9ja190aWxfcmVhZHkgYmxvY2tpbmc6IHR0eXMlZCwgY291bnQgPSAlZFxuIiwKKwkJICAgICAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCXNjaGVkdWxlKCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJaW5mby0+Y291bnQrKzsKKwlpbmZvLT5ibG9ja2VkX29wZW4tLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoImJsb2NrX3RpbF9yZWFkeSBhZnRlciBibG9ja2luZzogdHR5cyVkLCBjb3VudCA9ICVkXG4iLAorCSAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7CisjZW5kaWYKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcmV0dXJuIDA7Cit9CQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBhIHNlcmlhbCBwb3J0IGlzIG9wZW5lZC4gIEl0CisgKiBlbmFibGVzIGludGVycnVwdHMgZm9yIGEgc2VyaWFsIHBvcnQsIGxpbmtpbmcgaW4gaXRzIGFzeW5jIHN0cnVjdHVyZSBpbnRvCisgKiB0aGUgSVJRIGNoYWluLiAgIEl0IGFsc28gcGVyZm9ybXMgdGhlIHNlcmlhbC1zcGVjaWZpYworICogaW5pdGlhbGl6YXRpb24gZm9yIHRoZSB0dHkgc3RydWN0dXJlLgorICovCitzdGF0aWMgaW50IGVzcF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdAkqaW5mbzsKKwlpbnQgCQkJcmV0dmFsLCBsaW5lOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJbGluZSA9IHR0eS0+aW5kZXg7CisJaWYgKChsaW5lIDwgMCkgfHwgKGxpbmUgPj0gTlJfUE9SVFMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGZpbmQgdGhlIHBvcnQgaW4gdGhlIGNoYWluICovCisKKwlpbmZvID0gcG9ydHM7CisKKwl3aGlsZSAoaW5mbyAmJiAoaW5mby0+bGluZSAhPSBsaW5lKSkKKwkJaW5mbyA9IGluZm8tPm5leHRfcG9ydDsKKworCWlmICghaW5mbykgeworCQlzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiZXNwX29wZW4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoImVzcF9vcGVuICVzLCBjb3VudCA9ICVkXG4iLCB0dHktPm5hbWUsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaW5mby0+Y291bnQrKzsKKwl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKKwlpbmZvLT50dHkgPSB0dHk7CisKKwlpZiAoIXRtcF9idWYpIHsKKwkJdG1wX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCF0bXBfYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCQorCS8qCisJICogU3RhcnQgdXAgc2VyaWFsIHBvcnQKKwkgKi8KKwlyZXR2YWwgPSBzdGFydHVwKGluZm8pOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBpbmZvKTsKKwlpZiAocmV0dmFsKSB7CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwkJcHJpbnRrKCJlc3Bfb3BlbiByZXR1cm5pbmcgYWZ0ZXIgYmxvY2tfdGlsX3JlYWR5IHdpdGggJWRcbiIsCisJCSAgICAgICByZXR2YWwpOworI2VuZGlmCisJCXJldHVybiByZXR2YWw7CisJfQorCisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoImVzcF9vcGVuICVzIHN1Y2Nlc3NmdWwuLi4iLCB0dHktPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGVzcHNlcmlhbF9pbml0KCkgYW5kIGZyaWVuZHMKKyAqCisgKiBlc3BzZXJpYWxfaW5pdCgpIGlzIGNhbGxlZCBhdCBib290LXRpbWUgdG8gaW5pdGlhbGl6ZSB0aGUgc2VyaWFsIGRyaXZlci4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgcHJpbnRzIG91dCB0aGUgYXBwcm9wcmlhdGUgc2VyaWFsIGRyaXZlciB2ZXJzaW9uCisgKiBudW1iZXIsIGFuZCBpZGVudGlmaWVzIHdoaWNoIG9wdGlvbnMgd2VyZSBjb25maWd1cmVkIGludG8gdGhpcworICogZHJpdmVyLgorICovCisgCitzdGF0aWMgaW5saW5lIHZvaWQgc2hvd19zZXJpYWxfdmVyc2lvbih2b2lkKQoreworIAlwcmludGsoS0VSTl9JTkZPICIlcyB2ZXJzaW9uICVzIChETUEgJXUpXG4iLAorCQlzZXJpYWxfbmFtZSwgc2VyaWFsX3ZlcnNpb24sIGRtYSk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IGVzcHNlcmlhbF9pbml0KCkgdG8gaW5pdGlhbGl6ZSBhIHNwZWNpZmljIHNlcmlhbAorICogcG9ydC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2NvbmZpZyhzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm8pCit7CisJaW50IHBvcnRfZGV0ZWN0ZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGluZm8tPnBvcnQsIFJFR0lPTl9TSVpFLCAiZXNwIHNlcmlhbCIpKQorCQlyZXR1cm4gLUVJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBDaGVjayBmb3IgRVNQIGNhcmQKKwkgKi8KKworCWlmIChzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfQkFTRSkgPT0gMHhmMykgeworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIDB4MDApOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIDB4MDEpOworCisJCWlmICgoc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKSAmIDB4NzApID09IDB4MjApIHsKKwkJCXBvcnRfZGV0ZWN0ZWQgPSAxOworCisJCQlpZiAoIShpbmZvLT5pcnEpKSB7CisJCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCAweDAyKTsKKworCQkJCWlmIChzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDEpICYgMHgwMSkKKwkJCQkJaW5mby0+aXJxID0gMzsKKwkJCQllbHNlCisJCQkJCWluZm8tPmlycSA9IDQ7CisJCQl9CisKKworCQkJLyogcHV0IGNhcmQgaW4gZW5oYW5jZWQgbW9kZSAqLworCQkJLyogdGhpcyBwcmV2ZW50cyBhY2Nlc3MgdGhyb3VnaCAqLworCQkJLyogdGhlICJvbGQiIElPIHBvcnRzICovCisJCQllc3BfYmFzaWNfaW5pdChpbmZvKTsKKworCQkJLyogY2xlYXIgb3V0IE1DUiAqLworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfV1JJVEVfVUFSVCk7CisJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIFVBUlRfTUNSKTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMCk7CisJCX0KKwl9CisJaWYgKCFwb3J0X2RldGVjdGVkKQorCQlyZWxlYXNlX3JlZ2lvbihpbmZvLT5wb3J0LCBSRUdJT05fU0laRSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIChwb3J0X2RldGVjdGVkKTsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBlc3Bfb3BzID0geworCS5vcGVuID0gZXNwX29wZW4sCisJLmNsb3NlID0gcnNfY2xvc2UsCisJLndyaXRlID0gcnNfd3JpdGUsCisJLnB1dF9jaGFyID0gcnNfcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gcnNfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSByc193cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSByc19jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciA9IHJzX2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSByc19pb2N0bCwKKwkudGhyb3R0bGUgPSByc190aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IHJzX3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zID0gcnNfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSByc19zdG9wLAorCS5zdGFydCA9IHJzX3N0YXJ0LAorCS5oYW5ndXAgPSBlc3BfaGFuZ3VwLAorCS5icmVha19jdGwgPSBlc3BfYnJlYWssCisJLndhaXRfdW50aWxfc2VudCA9IHJzX3dhaXRfdW50aWxfc2VudCwKKwkudGlvY21nZXQgPSBlc3BfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gZXNwX3Rpb2Ntc2V0LAorfTsKKworLyoKKyAqIFRoZSBzZXJpYWwgZHJpdmVyIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBjb2RlIQorICovCitzdGF0aWMgaW50IF9faW5pdCBlc3BzZXJpYWxfaW5pdCh2b2lkKQoreworCWludCBpLCBvZmZzZXQ7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvOworCXN0cnVjdCBlc3Bfc3RydWN0ICpsYXN0X3ByaW1hcnkgPSBOVUxMOworCWludCBlc3BbXSA9IHsweDEwMCwweDE0MCwweDE4MCwweDIwMCwweDI0MCwweDI4MCwweDMwMCwweDM4MH07CisKKwllc3BfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihOUl9QT1JUUyk7CisJaWYgKCFlc3BfZHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgTlJfUFJJTUFSWTsgaSsrKSB7CisJCWlmIChpcnFbaV0gIT0gMCkgeworCQkJaWYgKChpcnFbaV0gPCAyKSB8fCAoaXJxW2ldID4gMTUpIHx8IChpcnFbaV0gPT0gNikgfHwKKwkJCSAgICAoaXJxW2ldID09IDgpIHx8IChpcnFbaV0gPT0gMTMpKQorCQkJCWlycVtpXSA9IDA7CisJCQllbHNlIGlmIChpcnFbaV0gPT0gMikKKwkJCQlpcnFbaV0gPSA5OworCQl9CisJfQorCisJaWYgKChkbWEgIT0gMSkgJiYgKGRtYSAhPSAzKSkKKwkJZG1hID0gMDsKKworCWlmICgocnhfdHJpZ2dlciA8IDEpIHx8IChyeF90cmlnZ2VyID4gMTAyMykpCisJCXJ4X3RyaWdnZXIgPSA3Njg7CisKKwlpZiAoKHR4X3RyaWdnZXIgPCAxKSB8fCAodHhfdHJpZ2dlciA+IDEwMjMpKQorCQl0eF90cmlnZ2VyID0gNzY4OworCisJaWYgKChmbG93X29mZiA8IDEpIHx8IChmbG93X29mZiA+IDEwMjMpKQorCQlmbG93X29mZiA9IDEwMTY7CisJCisJaWYgKChmbG93X29uIDwgMSkgfHwgKGZsb3dfb24gPiAxMDIzKSkKKwkJZmxvd19vbiA9IDk0NDsKKworCWlmICgocnhfdGltZW91dCA8IDApIHx8IChyeF90aW1lb3V0ID4gMjU1KSkKKwkJcnhfdGltZW91dCA9IDEyODsKKwkKKwlpZiAoZmxvd19vbiA+PSBmbG93X29mZikKKwkJZmxvd19vbiA9IGZsb3dfb2ZmIC0gMTsKKworCXNob3dfc2VyaWFsX3ZlcnNpb24oKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCisJCisJZXNwX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwllc3BfZHJpdmVyLT5uYW1lID0gInR0eVAiOworCWVzcF9kcml2ZXItPmRldmZzX25hbWUgPSAidHRzL1AiOworCWVzcF9kcml2ZXItPm1ham9yID0gRVNQX0lOX01BSk9SOworCWVzcF9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gMDsKKwllc3BfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwllc3BfZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCWVzcF9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwllc3BfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9CisJCUI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwllc3BfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKGVzcF9kcml2ZXIsICZlc3Bfb3BzKTsKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihlc3BfZHJpdmVyKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgcmVnaXN0ZXIgZXNwIHNlcmlhbCBkcml2ZXIiKTsKKwkJcHV0X3R0eV9kcml2ZXIoZXNwX2RyaXZlcik7CisJCXJldHVybiAxOworCX0KKworCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXNwX3N0cnVjdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFpbmZvKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGVzcCBzZXJpYWwgZGV2aWNlIGluZm9ybWF0aW9uXG4iKTsKKwkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGVzcF9kcml2ZXIpOworCQlwdXRfdHR5X2RyaXZlcihlc3BfZHJpdmVyKTsKKwkJcmV0dXJuIDE7CisJfQorCisJbWVtc2V0KCh2b2lkICopaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBlc3Bfc3RydWN0KSk7CisJLyogcnhfdHJpZ2dlciwgdHhfdHJpZ2dlciBhcmUgbmVlZGVkIGJ5IGF1dG9jb25maWcgKi8KKwlpbmZvLT5jb25maWcucnhfdHJpZ2dlciA9IHJ4X3RyaWdnZXI7CisJaW5mby0+Y29uZmlnLnR4X3RyaWdnZXIgPSB0eF90cmlnZ2VyOworCisJaSA9IDA7CisJb2Zmc2V0ID0gMDsKKworCWRvIHsKKwkJaW5mby0+cG9ydCA9IGVzcFtpXSArIG9mZnNldDsKKwkJaW5mby0+aXJxID0gaXJxW2ldOworCQlpbmZvLT5saW5lID0gKGkgKiA4KSArIChvZmZzZXQgLyA4KTsKKworCQlpZiAoIWF1dG9jb25maWcoaW5mbykpIHsKKwkJCWkrKzsKKwkJCW9mZnNldCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWluZm8tPmN1c3RvbV9kaXZpc29yID0gKGRpdmlzb3JbaV0gPj4gKG9mZnNldCAvIDIpKSAmIDB4ZjsKKwkJaW5mby0+ZmxhZ3MgPSBTVERfQ09NX0ZMQUdTOworCQlpZiAoaW5mby0+Y3VzdG9tX2Rpdmlzb3IpCisJCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19TUERfQ1VTVDsKKwkJaW5mby0+bWFnaWMgPSBFU1BfTUFHSUM7CisJCWluZm8tPmNsb3NlX2RlbGF5ID0gNSpIWi8xMDsKKwkJaW5mby0+Y2xvc2luZ193YWl0ID0gMzAqSFo7CisJCUlOSVRfV09SSygmaW5mby0+dHF1ZXVlLCBkb19zb2Z0aW50LCBpbmZvKTsKKwkJSU5JVF9XT1JLKCZpbmZvLT50cXVldWVfaGFuZ3VwLCBkb19zZXJpYWxfaGFuZ3VwLCBpbmZvKTsKKwkJaW5mby0+Y29uZmlnLnJ4X3RpbWVvdXQgPSByeF90aW1lb3V0OworCQlpbmZvLT5jb25maWcuZmxvd19vbiA9IGZsb3dfb247CisJCWluZm8tPmNvbmZpZy5mbG93X29mZiA9IGZsb3dfb2ZmOworCQlpbmZvLT5jb25maWcucGlvX3RocmVzaG9sZCA9IHBpb190aHJlc2hvbGQ7CisJCWluZm8tPm5leHRfcG9ydCA9IHBvcnRzOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5jbG9zZV93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5icmVha193YWl0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJmluZm8tPmxvY2spOworCQlwb3J0cyA9IGluZm87CisJCXByaW50ayhLRVJOX0lORk8gInR0eVAlZCBhdCAweCUwNHggKGlycSA9ICVkKSBpcyBhbiBFU1AgIiwKKwkJCWluZm8tPmxpbmUsIGluZm8tPnBvcnQsIGluZm8tPmlycSk7CisKKwkJaWYgKGluZm8tPmxpbmUgJSA4KSB7CisJCQlwcmludGsoInNlY29uZGFyeSBwb3J0XG4iKTsKKwkJCS8qIDggcG9ydCBjYXJkcyBjYW4ndCBkbyBETUEgKi8KKwkJCWluZm8tPnN0YXRfZmxhZ3MgfD0gRVNQX1NUQVRfTkVWRVJfRE1BOworCisJCQlpZiAobGFzdF9wcmltYXJ5KQorCQkJCWxhc3RfcHJpbWFyeS0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9ORVZFUl9ETUE7CisJCX0gZWxzZSB7CisJCQlwcmludGsoInByaW1hcnkgcG9ydFxuIik7CisJCQlsYXN0X3ByaW1hcnkgPSBpbmZvOworCQkJaXJxW2ldID0gaW5mby0+aXJxOworCQl9CisKKwkJaWYgKCFkbWEpCisJCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX05FVkVSX0RNQTsKKworCQlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVzcF9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpbmZvKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgZXNwIHNlcmlhbCBkZXZpY2UgaW5mb3JtYXRpb25cbiIpOyAKKworCQkJLyogYWxsb3cgdXNlIG9mIHRoZSBhbHJlYWR5IGRldGVjdGVkIHBvcnRzICovCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCW1lbXNldCgodm9pZCAqKWluZm8sIDAsIHNpemVvZihzdHJ1Y3QgZXNwX3N0cnVjdCkpOworCQkvKiByeF90cmlnZ2VyLCB0eF90cmlnZ2VyIGFyZSBuZWVkZWQgYnkgYXV0b2NvbmZpZyAqLworCQlpbmZvLT5jb25maWcucnhfdHJpZ2dlciA9IHJ4X3RyaWdnZXI7CisJCWluZm8tPmNvbmZpZy50eF90cmlnZ2VyID0gdHhfdHJpZ2dlcjsKKworCQlpZiAob2Zmc2V0ID09IDU2KSB7CisJCQlpKys7CisJCQlvZmZzZXQgPSAwOworCQl9IGVsc2UgeworCQkJb2Zmc2V0ICs9IDg7CisJCX0KKwl9IHdoaWxlIChpIDwgTlJfUFJJTUFSWSk7CisKKwkvKiBmcmVlIHRoZSBsYXN0IHBvcnQgbWVtb3J5IGFsbG9jYXRpb24gKi8KKwlrZnJlZShpbmZvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXNwc2VyaWFsX2V4aXQodm9pZCkgCit7CisJaW50IGUxOworCXN0cnVjdCBlc3Bfc3RydWN0ICp0ZW1wX2FzeW5jOworCXN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqcGlvX2J1ZjsKKworCS8qIHByaW50aygiVW5sb2FkaW5nICVzOiB2ZXJzaW9uICVzXG4iLCBzZXJpYWxfbmFtZSwgc2VyaWFsX3ZlcnNpb24pOyAqLworCWlmICgoZTEgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoZXNwX2RyaXZlcikpKQorCQlwcmludGsoIlNFUklBTDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgc2VyaWFsIGRyaXZlciAoJWQpXG4iLAorCQkgICAgICAgZTEpOworCXB1dF90dHlfZHJpdmVyKGVzcF9kcml2ZXIpOworCisJd2hpbGUgKHBvcnRzKSB7CisJCWlmIChwb3J0cy0+cG9ydCkgeworCQkJcmVsZWFzZV9yZWdpb24ocG9ydHMtPnBvcnQsIFJFR0lPTl9TSVpFKTsKKwkJfQorCQl0ZW1wX2FzeW5jID0gcG9ydHMtPm5leHRfcG9ydDsKKwkJa2ZyZWUocG9ydHMpOworCQlwb3J0cyA9IHRlbXBfYXN5bmM7CisJfQorCisJaWYgKGRtYV9idWZmZXIpCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpZG1hX2J1ZmZlciwKKwkJCWdldF9vcmRlcihETUFfQlVGRkVSX1NaKSk7CisKKwlpZiAodG1wX2J1ZikKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXRtcF9idWYpOworCisJd2hpbGUgKGZyZWVfcGlvX2J1ZikgeworCQlwaW9fYnVmID0gZnJlZV9waW9fYnVmLT5uZXh0OworCQlrZnJlZShmcmVlX3Bpb19idWYpOworCQlmcmVlX3Bpb19idWYgPSBwaW9fYnVmOworCX0KK30KKworbW9kdWxlX2luaXQoZXNwc2VyaWFsX2luaXQpOworbW9kdWxlX2V4aXQoZXNwc2VyaWFsX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvZnRhcGUvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDNlY2I1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL0tjb25maWcKQEAgLTAsMCArMSwzNDAgQEAKKyMKKyMgRnRhcGUgY29uZmlndXJhdGlvbgorIworY29uZmlnIFpGVEFQRQorCXRyaXN0YXRlICJaZnRhcGUsIHRoZSBWRlMgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gRlRBUEUKKwktLS1oZWxwLS0tCisJICBOb3JtYWxseSwgeW91IHdhbnQgdG8gc2F5IFkgb3IgTS4gRE9OJ1Qgc2F5IE4gaGVyZSBvciB5b3UKKwkgIFdPTidUIEJFIEFCTEUgVE8gVVNFIFlPVVIgRkxPUFBZIFRBUEUgRFJJVkUuCisKKwkgIFRoZSBmdGFwZSBtb2R1bGUgaXRzZWxmIG5vIGxvbmdlciBjb250YWlucyB0aGUgcm91dGluZXMgbmVjZXNzYXJ5CisJICB0byBpbnRlcmZhY2Ugd2l0aCB0aGUga2VybmVsIFZGUyBsYXllciAoaS5lLiB0byBhY3R1YWxseSB3cml0ZSBkYXRhCisJICB0byBhbmQgcmVhZCBkYXRhIGZyb20gdGhlIHRhcGUgZHJpdmUpLiAgSW5zdGVhZCB0aGUgZmlsZSBzeXN0ZW0KKwkgIGludGVyZmFjZSAoaS5lLiB0aGUgaGFyZHdhcmUgaW5kZXBlbmRlbnQgcGFydCBvZiB0aGUgZHJpdmVyKSBoYXMKKwkgIGJlZW4gbW92ZWQgdG8gYSBzZXBhcmF0ZSBtb2R1bGUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHpmdGFwZS4KKworCSAgUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHlvdSBzYXkgWSBvciBNIGhlcmUsIGFuIGFkZGl0aW9uYWwgcnVudGltZQorCSAgbG9hZGFibGUgbW9kdWxlIGNhbGxlZCBgemZ0LWNvbXByZXNzb3InIHdoaWNoIGNvbnRhaW5zIGNvZGUgdG8KKwkgIHN1cHBvcnQgdXNlciB0cmFuc3BhcmVudCBvbi10aGUtZmx5IGNvbXByZXNzaW9uIGJhc2VkIG9uIFJvc3MKKwkgIFdpbGxpYW0ncyBsenJ3MyBhbGdvcml0aG0gd2lsbCBiZSBwcm9kdWNlZC4gIElmIHlvdSBoYXZlIGVuYWJsZWQgdGhlCisJICBrZXJuZWwgbW9kdWxlIGxvYWRlciAoaS5lLiBoYXZlIHNhaWQgWSB0byAiS2VybmVsIG1vZHVsZSBsb2FkZXIKKwkgIHN1cHBvcnQiLCBhYm92ZSkgdGhlbiBgemZ0LWNvbXByZXNzb3InIHdpbGwgYmUgbG9hZGVkCisJICBhdXRvbWF0aWNhbGx5IGJ5IHpmdGFwZSB3aGVuIG5lZWRlZC4KKworCSAgRGVzcGl0ZSBpdHMgbmFtZSwgemZ0YXBlIGRvZXMgTk9UIHVzZSBjb21wcmVzc2lvbiBieSBkZWZhdWx0LiAgVGhlCisJICBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vZnRhcGUudHh0PiBjb250YWlucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mCisJICB0aGUgbW9zdCBpbXBvcnRhbnQgY2hhbmdlcyBpbiB0aGUgZmlsZSBzeXN0ZW0gaW50ZXJmYWNlIGNvbXBhcmVkIHRvCisJICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBmdGFwZS4gIFRoZSBmdGFwZSBob21lIHBhZ2UKKwkgIDxodHRwOi8vd3d3Lmluc3RtYXRoLnJ3dGgtYWFjaGVuLmRlL35oZWluZS9mdGFwZS8+IGNvbnRhaW5zCisJICBmdXJ0aGVyIGluZm9ybWF0aW9uLgorCisJICBJTVBPUlRBTlQgTk9URTogemZ0YXBlIGNhbiByZWFkIGFyY2hpdmVzIGNyZWF0ZWQgYnkgcHJldmlvdXMKKwkgIHZlcnNpb25zIG9mIGZ0YXBlIGFuZCBwcm92aWRlIGZpbGUgbWFyayBzdXBwb3J0IChpLmUuIGZhc3Qgc2tpcHBpbmcKKwkgIGJldHdlZW4gdGFwZSBhcmNoaXZlcykgYnV0IHByZXZpb3VzIHZlcnNpb24gb2YgZnRhcGUgd2lsbCBsYWNrIGZpbGUKKwkgIG1hcmsgc3VwcG9ydCB3aGVuIHJlYWRpbmcgYXJjaGl2ZXMgcHJvZHVjZWQgYnkgemZ0YXBlLgorCitjb25maWcgWkZUX0RGTFRfQkxLX1NaCisJaW50ICJEZWZhdWx0IGJsb2NrIHNpemUiCisJZGVwZW5kcyBvbiBaRlRBUEUKKwlkZWZhdWx0ICIxMDI0MCIKKwktLS1oZWxwLS0tCisJICBJZiB1bnN1cmUgbGVhdmUgdGhpcyBhdCBpdHMgZGVmYXVsdCB2YWx1ZSwgaS5lLiAxMDI0MC4gTm90ZSB0aGF0CisJICB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IGJsb2NrIHNpemUgaGVyZS4gVGhlIGJsb2NrIHNpemUgY2FuIGJlCisJICBjaGFuZ2VkIGF0IHJ1biB0aW1lIHVzaW5nIHRoZSBNVFNFVEJMSyB0YXBlIG9wZXJhdGlvbiB3aXRoIHRoZQorCSAgTVRJT0NUT1AgaW9jdGwgKGkuZS4gd2l0aCAibXQgLWYgL2Rldi9xZnQwIHNldGJsayAjQkxLU1oiIGZyb20gdGhlCisJICBzaGVsbCBjb21tYW5kIGxpbmUpLgorCisJICBUaGUgcHJvYmFibHkgbW9zdCBzdHJpa2luZyBkaWZmZXJlbmNlIGJldHdlZW4gemZ0YXBlIGFuZCBwcmV2aW91cworCSAgdmVyc2lvbnMgb2YgZnRhcGUgaXMgdGhlIGZhY3QgdGhhdCBhbGwgZGF0YSBtdXN0IGJlIHdyaXR0ZW4gb3IgcmVhZAorCSAgaW4gbXVsdGlwbGVzIG9mIGEgZml4ZWQgYmxvY2sgc2l6ZS4gVGhlIGJsb2NrIHNpemUgZGVmYXVsdHMgdG8KKwkgIDEwMjQwIHdoaWNoIGlzIHdoYXQgR05VIHRhciB1c2VzLiBUaGUgdmFsdWVzIGZvciB0aGUgYmxvY2sgc2l6ZQorCSAgc2hvdWxkIGJlIGVpdGhlciAxIG9yIG11bHRpcGxlcyBvZiAxMDI0IHVwIHRvIGEgbWF4aW11bSB2YWx1ZSBvZgorCSAgNjM0ODggKGkuZS4gNjIgSykuIElmIHlvdSBzcGVjaWZ5IGAxJyB0aGVuIHpmdGFwZSdzIGJ1aWx0aW4KKwkgIGNvbXByZXNzaW9uIHdpbGwgYmUgZGlzYWJsZWQuCisKKwkgIFJlYXNvbmFibGUgdmFsdWVzIGFyZSBgMTAyNDAnIChHTlUgdGFyJ3MgZGVmYXVsdCBibG9jayBzaXplKSwKKwkgIGA1MTIwJyAoYWZpbydzIGRlZmF1bHQgYmxvY2sgc2l6ZSksIGAzMjc2OCcgKGRlZmF1bHQgYmxvY2sgc2l6ZSBzb21lCisJICBiYWNrdXAgcHJvZ3JhbXMgYXNzdW1lIGZvciBTQ1NJIHRhcGUgZHJpdmVzKSBvciBgMScgKG5vIHJlc3RyaWN0aW9uCisJICBvbiBibG9jayBzaXplLCBidXQgZGlzYWJsZXMgYnVpbHRpbiBjb21wcmVzc2lvbikuCisKK2NvbW1lbnQgIlRoZSBjb21wcmVzc29yIHdpbGwgYmUgYnVpbHQgYXMgYSBtb2R1bGUgb25seSEiCisJZGVwZW5kcyBvbiBGVEFQRSAmJiBaRlRBUEUKKworY29uZmlnIFpGVF9DT01QUkVTU09SCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIEZUQVBFIT1uICYmIFpGVEFQRSE9bgorCWRlZmF1bHQgbQorCitjb25maWcgRlRfTlJfQlVGRkVSUworCWludCAiTnVtYmVyIG9mIGZ0YXBlIGJ1ZmZlcnMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBGVEFQRSAmJiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0ICIzIgorCWhlbHAKKwkgIFBsZWFzZSBsZWF2ZSB0aGlzIGF0IGAzJyB1bmxlc3MgeW91IFJFQUxMWSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKwkgIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoaXMgdmFsdWUuIFZhbHVlcyBiZWxvdyAzIG1ha2UgdGhlCisJICBwcm9wZXIgdXNlIG9mIGZ0YXBlIGltcG9zc2libGUsIHZhbHVlcyBncmVhdGVyIHRoYW4gMyBhcmUgYSB3YXN0ZSBvZgorCSAgbWVtb3J5LiBZb3UgY2FuIGNoYW5nZSB0aGUgYW1vdW50IG9mIERNQSBtZW1vcnkgdXNlZCBieSBmdGFwZSBhdAorCSAgcnVudGltZSB3aXRoICJtdCAtZiAvZGV2L3FmdDAgc2V0ZHJ2YnVmZmVyICNOVU1CVUZGRVJTIi4gRWFjaCBidWZmZXIKKwkgIHdhc3RlcyAzMiBLQiBvZiBtZW1vcnkuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZW1vcnkgY2Fubm90IGJlCisJICBzd2FwcGVkIG91dC4KKworY29uZmlnIEZUX1BST0NfRlMKKwlib29sICJFbmFibGUgcHJvY2ZzIHN0YXR1cyByZXBvcnQgKCsya2IpIgorCWRlcGVuZHMgb24gRlRBUEUgJiYgUFJPQ19GUworCS0tLWhlbHAtLS0KKwkgIE9wdGlvbmFsLiBTYXlpbmcgWSB3aWxsIHJlc3VsdCBpbiBjcmVhdGlvbiBvZiBhIGRpcmVjdG9yeQorCSAgYC9wcm9jL2Z0YXBlJyB1bmRlciB0aGUgL3Byb2MgZmlsZSBzeXN0ZW0uIFRoZSBmaWxlcyBjYW4gYmUgdmlld2VkCisJICB3aXRoIHlvdXIgZmF2b3JpdGUgcGFnZXIgKGkuZS4gdXNlICJtb3JlIC9wcm9jL2Z0YXBlL2hpc3RvcnkiIG9yCisJICAibGVzcyAvcHJvYy9mdGFwZS9oaXN0b3J5IiBvciBzaW1wbHkgImNhdCAvcHJvYy9mdGFwZS9oaXN0b3J5IikuIFRoZQorCSAgZmlsZSB3aWxsIGNvbnRhaW4gc29tZSBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc2VydGVkCisJICBjYXJ0cmlkZ2UsIHRoZSBrZXJuZWwgZHJpdmVyLCB5b3VyIHRhcGUgZHJpdmUsIHRoZSBmbG9wcHkgZGlzaworCSAgY29udHJvbGxlciBhbmQgdGhlIGVycm9yIGhpc3RvcnkgZm9yIHRoZSBtb3N0IHJlY2VudCB1c2Ugb2YgdGhlCisJICBrZXJuZWwgZHJpdmVyLiBTYXlpbmcgWSB3aWxsIGVubGFyZ2UgdGhlIHNpemUgb2YgdGhlIGZ0YXBlIGRyaXZlcgorCSAgYnkgYXBwcm94aW1hdGVseSAyIEtCLgorCisJICBXQVJOSU5HOiBXaGVuIGNvbXBpbGluZyBmdGFwZSBhcyBhIG1vZHVsZSAoaS5lLiBzYXlpbmcgTSB0byAiRmxvcHB5CisJICB0YXBlIGRyaXZlIikgaXQgaXMgZGFuZ2Vyb3VzIHRvIHVzZSBmdGFwZSdzIC9wcm9jIGZpbGUgc3lzdGVtCisJICBpbnRlcmZhY2UuIEFjY2Vzc2luZyBgL3Byb2MvZnRhcGUnIHdoaWxlIHRoZSBtb2R1bGUgaXMgdW5sb2FkZWQgd2lsbAorCSAgcmVzdWx0IGluIGEga2VybmVsIE9vcHMuIFRoaXMgY2Fubm90IGJlIGZpeGVkIGZyb20gaW5zaWRlIGZ0YXBlLgorCitjaG9pY2UKKwlwcm9tcHQgIkRlYnVnZ2luZyBvdXRwdXQiCisJZGVwZW5kcyBvbiBGVEFQRQorCWRlZmF1bHQgRlRfTk9STUFMX0RFQlVHCisKK2NvbmZpZyBGVF9OT1JNQUxfREVCVUcKKwlib29sICJOb3JtYWwiCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gY29udHJvbHMgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0IHRoZSBmdGFwZSBkcml2ZXIKKwkgIGlzIEFCTEUgdG8gcHJvZHVjZTsgaXQgZG9lcyBub3QgaW5jcmVhc2Ugb3IgZGltaW5pc2ggdGhlIGRlYnVnZ2luZworCSAgbGV2ZWwgaXRzZWxmLiBJZiB1bnN1cmUsIGxlYXZlIHRoaXMgYXQgaXRzIGRlZmF1bHQgc2V0dGluZywKKwkgIGkuZS4gY2hvb3NlICJOb3JtYWwiLgorCisJICBGdGFwZSBjYW4gcHJpbnQgbG90cyBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBjb25zb2xlCisJICByZXNwLiBrZXJuZWwgbG9nIGZpbGVzLiBSZWR1Y2luZyB0aGUgYW1vdW50IG9mIHBvc3NpYmxlIGRlYnVnZ2luZworCSAgb3V0cHV0IHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGtlcm5lbCBtb2R1bGUgYnkgc29tZSBLQiwgc28gaXQgbWlnaHQKKwkgIGJlIGEgZ29vZCBpZGVhIHRvIHVzZSAiTm9uZSIgZm9yIGVtZXJnZW5jeSBib290IGZsb3BwaWVzLgorCisJICBJZiB5b3Ugd2FudCB0byBzYXZlIG1lbW9yeSB0aGVuIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3kgaXMKKwkgIHJlY29tbWVuZGVkOiBsZWF2ZSB0aGlzIG9wdGlvbiBhdCBpdHMgZGVmYXVsdCBzZXR0aW5nICJOb3JtYWwiIHVudGlsCisJICB5b3Uga25vdyB0aGF0IHRoZSBkcml2ZXIgd29ya3MgYXMgZXhwZWN0ZWQsIGFmdGVyd2FyZHMgcmVjb25maWd1cmUKKwkgIHRoZSBrZXJuZWwsIHRoaXMgdGltZSBzcGVjaWZ5aW5nICJSZWR1Y2VkIiBvciAiTm9uZSIgYW5kIHJlY29tcGlsZQorCSAgYW5kIGluc3RhbGwgdGhlIGtlcm5lbCBhcyB1c3VhbC4gTm90ZSB0aGF0IGNob29zaW5nICJFeGNlc3NpdmUiCisJICBkZWJ1Z2dpbmcgb3V0cHV0IGRvZXMgbm90IGluY3JlYXNlIHRoZSBhbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dAorCSAgcHJpbnRlZCB0byB0aGUgY29uc29sZSBidXQgb25seSBtYWtlcyBpdCBwb3NzaWJsZSB0byBwcm9kdWNlCisJICAiRXhjZXNzaXZlIiBkZWJ1Z2dpbmcgb3V0cHV0LgorCisJICBQbGVhc2UgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2Z0YXBlLnR4dD4gZm9yIGEgc2hvcnQgZGVzY3JpcHRpb24KKwkgIGhvdyB0byBjb250cm9sIHRoZSBhbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dC4KKworY29uZmlnIEZUX0ZVTExfREVCVUcKKwlib29sICJFeGNlc3NpdmUiCisJaGVscAorCSAgRXh0cmVtZWx5IHZlcmJvc2Ugb3V0cHV0IGZvciBkcml2ZXIgZGVidWdnaW5nIHB1cnBvc2VzLgorCitjb25maWcgRlRfTk9fVFJBQ0UKKwlib29sICJSZWR1Y2VkIgorCWhlbHAKKwkgIFJlZHVjZWQgdGFwZSBkcml2ZXIgZGVidWdnaW5nIG91dHB1dC4KKworY29uZmlnIEZUX05PX1RSQUNFX0FUX0FMTAorCWJvb2wgIk5vbmUiCisJaGVscAorCSAgU3VwcHJlc3MgYWxsIGRlYnVnZ2luZyBvdXRwdXQgZnJvbSB0aGUgdGFwZSBkcml2ZS4KKworZW5kY2hvaWNlCisKK2NvbW1lbnQgIkhhcmR3YXJlIGNvbmZpZ3VyYXRpb24iCisJZGVwZW5kcyBvbiBGVEFQRQorCitjaG9pY2UKKwlwcm9tcHQgIkZsb3BweSB0YXBlIGNvbnRyb2xsZXJzIgorCWRlcGVuZHMgb24gRlRBUEUKKwlkZWZhdWx0IEZUX1NURF9GREMKKworY29uZmlnIEZUX1NURF9GREMKKwlib29sICJTdGFuZGFyZCIKKwktLS1oZWxwLS0tCisJICBPbmx5IGNoYW5nZSB0aGlzIHNldHRpbmcgaWYgeW91IGhhdmUgYSBzcGVjaWFsIGNvbnRyb2xsZXIuIElmIHlvdQorCSAgZGlkbid0IHBsdWcgYW55IGFkZC1vbiBjYXJkIGludG8geW91ciBjb21wdXRlciBzeXN0ZW0gYnV0IGp1c3QKKwkgIHBsdWdnZWQgdGhlIGZsb3BweSB0YXBlIGNhYmxlIGludG8gdGhlIGFscmVhZHkgZXhpc3RpbmcgZmxvcHB5IGRyaXZlCisJICBjb250cm9sbGVyIHRoZW4geW91IGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHNldHRpbmcsCisJICBpLmUuIGNob29zZSAiU3RhbmRhcmQiLgorCisJICBDaG9vc2UgIk1BQ0gtMiIgaWYgeW91IGhhdmUgYSBNb3VudGFpbiBNYWNoLTIgY29udHJvbGxlci4KKwkgIENob29zZSAiRkMtMTAvRkMtMjAiIGlmIHlvdSBoYXZlIGEgQ29sb3JhZG8gRkMtMTAgb3IgRkMtMjAKKwkgIGNvbnRyb2xsZXIuCisJICBDaG9vc2UgIkFsdC84MjA3OCIgaWYgeW91IGhhdmUgYW5vdGhlciBjb250cm9sbGVyIHRoYXQgaXMgbG9jYXRlZCBhdAorCSAgYW4gSU8gYmFzZSBhZGRyZXNzIGRpZmZlcmVudCBmcm9tIHRoZSBzdGFuZGFyZCBmbG9wcHkgZHJpdmUKKwkgIGNvbnRyb2xsZXIncyBiYXNlIGFkZHJlc3Mgb2YgYDB4M2YwJywgb3IgdXNlcyBhbiBJUlEgKGludGVycnVwdCkKKwkgIGNoYW5uZWwgZGlmZmVyZW50IGZyb20gYDYnLCBvciBhIERNQSBjaGFubmVsIGRpZmZlcmVudCBmcm9tCisJICBgMicuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBhbnkgY29udHJvbGxlciBjYXJkIHRoYXQgaXMgYmFzZWQgb24KKwkgIEludGVsJ3MgODIwNzggRkRDIHN1Y2ggYXMgU2VhZ2F0ZSdzLCBFeGFieXRlJ3MgYW5kIElvbWVnYSdzICJoaWdoCisJICBzcGVlZCIgY29udHJvbGxlcnMuCisKKwkgIElmIHlvdSBjaG9vc2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gIlN0YW5kYXJkIiB0aGVuIHBsZWFzZSBtYWtlCisJICBzdXJlIHRoYXQgdGhlIHNldHRpbmdzIGZvciB0aGUgSU8gYmFzZSBhZGRyZXNzIGFuZCB0aGUgSVJRIGFuZCBETUEKKwkgIGNoYW5uZWwgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbWVudXMgYmVsb3cgYXJlIGNvcnJlY3QuIFVzZSB0aGUgbWFudWFsCisJICBvZiB5b3VyIHRhcGUgZHJpdmUgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHNldHRpbmdzIQorCisJICBJZiB5b3UgYXJlIGFscmVhZHkgc3VjY2Vzc2Z1bGx5IHVzaW5nIHlvdXIgdGFwZSBkcml2ZSB3aXRoIGFub3RoZXIKKwkgIG9wZXJhdGluZyBzeXN0ZW0gdGhlbiB5b3UgZGVmaW5pdGVseSBzaG91bGQgdXNlIHRoZSBzYW1lIHNldHRpbmdzCisJICBmb3IgdGhlIElPIGJhc2UsIHRoZSBJUlEgYW5kIERNQSBjaGFubmVsIHRoYXQgaGF2ZSBwcm92ZW4gdG8gd29yaworCSAgd2l0aCB0aGF0IG90aGVyIE9TLgorCisJICBOb3RlIHRoYXQgdGhpcyBtZW51IGxldHMgeW91IHNwZWNpZnkgb25seSB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvcgorCSAgdGhlIGhhcmR3YXJlIHNldHVwLiBUaGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBjYW4gYmUgY2hhbmdlZCBhdAorCSAgYm9vdCB0aW1lICh3aGVuIGZ0YXBlIGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCwgaS5lLiBpZiB5b3UKKwkgIGhhdmUgc2FpZCBZIHRvICJGbG9wcHkgdGFwZSBkcml2ZSIpIG9yIG1vZHVsZSBsb2FkIHRpbWUgKGkuZS4gaWYgeW91CisJICBoYXZlIHNhaWQgTSB0byAiRmxvcHB5IHRhcGUgZHJpdmUiKS4KKworCSAgUGxlYXNlIHJlYWQgYWxzbyB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2Z0YXBlLnR4dD4gd2hpY2gKKwkgIGNvbnRhaW5zIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IGF0CisJICBib290IG9yIGxvYWQgdGltZS4gSWYgeW91IHdhbnQgdG8gdXNlIHlvdXIgZmxvcHB5IHRhcGUgZHJpdmUgb24gYQorCSAgUENJLWJ1cyBiYXNlZCBzeXN0ZW0sIHBsZWFzZSByZWFkIHRoZSBmaWxlCisJICA8ZmlsZTpkcml2ZXJzL2NoYXIvZnRhcGUvUkVBRE1FLlBDST4uCisKK2NvbmZpZyBGVF9NQUNIMgorCWJvb2wgIk1BQ0gtMiIKKworY29uZmlnIEZUX1BST0JFX0ZDMTAKKwlib29sICJGQy0xMC9GQy0yMCIKKworY29uZmlnIEZUX0FMVF9GREMKKwlib29sICJBbHQvODIwNzgiCisKK2VuZGNob2ljZQorCitjb21tZW50ICJDb25zdWx0IHRoZSBtYW51YWxzIG9mIHlvdXIgdGFwZSBkcml2ZSBmb3IgdGhlIGNvcnJlY3Qgc2V0dGluZ3MhIgorCWRlcGVuZHMgb24gRlRBUEUgJiYgIUZUX1NURF9GREMKKworY29uZmlnIEZUX0ZEQ19CQVNFCisJaGV4ICJJTyBiYXNlIG9mIHRoZSBmbG9wcHkgZGlzayBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gRlRBUEUgJiYgIUZUX1NURF9GREMKKwlkZWZhdWx0ICIwIgorCS0tLWhlbHAtLS0KKwkgIFlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgYSB2YWx1ZSBpZiB0aGUgZm9sbG93aW5nIGRlZmF1bHQKKwkgIHNldHRpbmdzIGZvciB0aGUgYmFzZSBJTyBhZGRyZXNzIGFyZSBjb3JyZWN0OgorCSAgPDw8IE1BQ0gtMiAgICAgOiAweDFFMCA+Pj4KKwkgIDw8PCBGQy0xMC9GQy0yMDogMHgxODAgPj4+CisJICA8PDwgU2Vjb25kYXJ5ICA6IDB4MzcwID4+PgorCSAgU2Vjb25kYXJ5IHJlZmVycyB0byBhIHNlY29uZGFyeSBGREMgY29udHJvbGxlciBsaWtlIHRoZSAiaGlnaCBzcGVlZCIKKwkgIGNvbnRyb2xsZXJzIGRlbGl2ZXJlZCBieSBTZWFnYXRlIG9yIEV4YWJ5dGUgb3IgSW9tZWdhJ3MgRGl0dG8gRGFzaC4KKwkgIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgc2V0dGluZyBmb3IgdGhlIElPIGJhc2UgYWRkcmVzcworCSAgc3BlY2lmaWVkIGhlcmUgaXMgY29ycmVjdC4gVVNFIFRIRSBNQU5VQUwgT0YgWU9VUiBUQVBFIERSSVZFIE9SCisJICBDT05UUk9MTEVSIENBUkQgVE8gREVURVJNSU5FIFRIRSBDT1JSRUNUIFNFVFRJTkcuIElmIHlvdSBhcmUgYWxyZWFkeQorCSAgc3VjY2Vzc2Z1bGx5IHVzaW5nIHRoZSB0YXBlIGRyaXZlIHdpdGggYW5vdGhlciBvcGVyYXRpbmcgc3lzdGVtIHRoZW4KKwkgIHlvdSBkZWZpbml0ZWx5IHNob3VsZCB1c2UgdGhlIHNhbWUgc2V0dGluZ3MgZm9yIHRoZSBJTyBiYXNlIHRoYXQgaGFzCisJICBwcm92ZW4gdG8gd29yayB3aXRoIHRoYXQgb3RoZXIgT1MuCisKKwkgIE5vdGUgdGhhdCB0aGlzIG1lbnUgbGV0cyB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yCisJICB0aGUgSU8gYmFzZS4gVGhlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGNoYW5nZWQgYXQgYm9vdCB0aW1lCisJICAod2hlbiBmdGFwZSBpcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwsIGkuZS4gaWYgeW91IHNwZWNpZmllZCBZIHRvCisJICAiRmxvcHB5IHRhcGUgZHJpdmUiKSBvciBtb2R1bGUgbG9hZCB0aW1lIChpLmUuIGlmIHlvdSBoYXZlIHNhaWQgTSB0bworCSAgIkZsb3BweSB0YXBlIGRyaXZlIikuCisKKwkgIFBsZWFzZSByZWFkIGFsc28gdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9mdGFwZS50eHQ+IHdoaWNoCisJICBjb250YWlucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCBhdAorCSAgYm9vdCBvciBsb2FkIHRpbWUuCisKK2NvbmZpZyBGVF9GRENfSVJRCisJaW50ICJJUlEgY2hhbm5lbCBvZiB0aGUgZmxvcHB5IGRpc2sgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEZUQVBFICYmICFGVF9TVERfRkRDCisJZGVmYXVsdCAiMCIKKwktLS1oZWxwLS0tCisJICBZb3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGEgdmFsdWUgaWYgdGhlIGZvbGxvd2luZyBkZWZhdWx0CisJICBzZXR0aW5ncyBmb3IgdGhlIGludGVycnVwdCBjaGFubmVsIGFyZSBjb3JyZWN0OgorCSAgPDw8IE1BQ0gtMiAgICAgOiA2ID4+PgorCSAgPDw8IEZDLTEwL0ZDLTIwOiA5ID4+PgorCSAgPDw8IFNlY29uZGFyeSAgOiA2ID4+PgorCSAgU2Vjb25kYXJ5IHJlZmVycyB0byBzZWNvbmRhcnkgYSBGREMgY29udHJvbGxlciBsaWtlIHRoZSAiaGlnaCBzcGVlZCIKKwkgIGNvbnRyb2xsZXJzIGRlbGl2ZXJlZCBieSBTZWFnYXRlIG9yIEV4YWJ5dGUgb3IgSW9tZWdhJ3MgRGl0dG8gRGFzaC4KKwkgIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgc2V0dGluZyBmb3IgdGhlIElPIGJhc2UgYWRkcmVzcworCSAgc3BlY2lmaWVkIGhlcmUgaXMgY29ycmVjdC4gVVNFIFRIRSBNQU5VQUwgT0YgWU9VUiBUQVBFIERSSVZFIE9SCisJICBDT05UUk9MTEVSIENBUkQgVE8gREVURVJNSU5FIFRIRSBDT1JSRUNUIFNFVFRJTkcuIElmIHlvdSBhcmUgYWxyZWFkeQorCSAgc3VjY2Vzc2Z1bGx5IHVzaW5nIHRoZSB0YXBlIGRyaXZlIHdpdGggYW5vdGhlciBvcGVyYXRpbmcgc3lzdGVtIHRoZW4KKwkgIHlvdSBkZWZpbml0ZWx5IHNob3VsZCB1c2UgdGhlIHNhbWUgc2V0dGluZ3MgZm9yIHRoZSBJTyBiYXNlIHRoYXQgaGFzCisJICBwcm92ZW4gdG8gd29yayB3aXRoIHRoYXQgb3RoZXIgT1MuCisKKwkgIE5vdGUgdGhhdCB0aGlzIG1lbnUgbGV0cyB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yCisJICB0aGUgSVJRIGNoYW5uZWwuIFRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGNhbiBiZSBjaGFuZ2VkIGF0IGJvb3QKKwkgIHRpbWUgKHdoZW4gZnRhcGUgaXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLCBpLmUuIGlmIHlvdSBzYWlkIFkgdG8KKwkgICJGbG9wcHkgdGFwZSBkcml2ZSIpIG9yIG1vZHVsZSBsb2FkIHRpbWUgKGkuZS4gaWYgeW91IHNhaWQgTSB0bworCSAgIkZsb3BweSB0YXBlIGRyaXZlIikuCisKKwkgIFBsZWFzZSByZWFkIGFsc28gdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9mdGFwZS50eHQ+IHdoaWNoCisJICBjb250YWlucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCBhdAorCSAgYm9vdCBvciBsb2FkIHRpbWUuCisKK2NvbmZpZyBGVF9GRENfRE1BCisJaW50ICJETUEgY2hhbm5lbCBvZiB0aGUgZmxvcHB5IGRpc2sgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEZUQVBFICYmICFGVF9TVERfRkRDCisJZGVmYXVsdCAiMCIKKwktLS1oZWxwLS0tCisJICBZb3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGEgdmFsdWUgaWYgdGhlIGZvbGxvd2luZyBkZWZhdWx0CisJICBzZXR0aW5ncyBmb3IgdGhlIERNQSBjaGFubmVsIGFyZSBjb3JyZWN0OgorCSAgPDw8IE1BQ0gtMiAgICAgOiAyID4+PgorCSAgPDw8IEZDLTEwL0ZDLTIwOiAzID4+PgorCSAgPDw8IFNlY29uZGFyeSAgOiAyID4+PgorCSAgU2Vjb25kYXJ5IHJlZmVycyB0byBhIHNlY29uZGFyeSBGREMgY29udHJvbGxlciBsaWtlIHRoZSAiaGlnaCBzcGVlZCIKKwkgIGNvbnRyb2xsZXJzIGRlbGl2ZXJlZCBieSBTZWFnYXRlIG9yIEV4YWJ5dGUgb3IgSW9tZWdhJ3MgRGl0dG8gRGFzaC4KKwkgIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgc2V0dGluZyBmb3IgdGhlIElPIGJhc2UgYWRkcmVzcworCSAgc3BlY2lmaWVkIGhlcmUgaXMgY29ycmVjdC4gVVNFIFRIRSBNQU5VQUwgT0YgWU9VUiBUQVBFIERSSVZFIE9SCisJICBDT05UUk9MTEVSIENBUkQgVE8gREVURVJNSU5FIFRIRSBDT1JSRUNUIFNFVFRJTkcuIElmIHlvdSBhcmUgYWxyZWFkeQorCSAgc3VjY2Vzc2Z1bGx5IHVzaW5nIHRoZSB0YXBlIGRyaXZlIHdpdGggYW5vdGhlciBvcGVyYXRpbmcgc3lzdGVtIHRoZW4KKwkgIHlvdSBkZWZpbml0ZWx5IHNob3VsZCB1c2UgdGhlIHNhbWUgc2V0dGluZ3MgZm9yIHRoZSBJTyBiYXNlIHRoYXQgaGFzCisJICBwcm92ZW4gdG8gd29yayB3aXRoIHRoYXQgb3RoZXIgT1MuCisKKwkgIE5vdGUgdGhhdCB0aGlzIG1lbnUgbGV0cyB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yCisJICB0aGUgRE1BIGNoYW5uZWwuIFRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGNhbiBiZSBjaGFuZ2VkIGF0IGJvb3QKKwkgIHRpbWUgKHdoZW4gZnRhcGUgaXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLCBpLmUuIGlmIHlvdSBzYWlkIFkgdG8KKwkgICJGbG9wcHkgdGFwZSBkcml2ZSIpIG9yIG1vZHVsZSBsb2FkIHRpbWUgKGkuZS4gaWYgeW91IHNhaWQgTSB0bworCSAgIkZsb3BweSB0YXBlIGRyaXZlIikuCisKKwkgIFBsZWFzZSByZWFkIGFsc28gdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9mdGFwZS50eHQ+IHdoaWNoCisJICBjb250YWlucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCBhdAorCSAgYm9vdCBvciBsb2FkIHRpbWUuCisKK2NvbmZpZyBGVF9GRENfVEhSCisJaW50ICJEZWZhdWx0IEZJRk8gdGhyZXNob2xkIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRlRBUEUgJiYgRVhQRVJJTUVOVEFMCisJZGVmYXVsdCAiOCIKKwloZWxwCisJICBTZXQgdGhlIEZJRk8gdGhyZXNob2xkIG9mIHRoZSBGREMuIElmIHRoaXMgaXMgaGlnaGVyIHRoZSBETUEKKwkgIGNvbnRyb2xsZXIgbWF5IHNlcnZlIHRoZSBGREMgYWZ0ZXIgYSBoaWdoZXIgbGF0ZW5jeSB0aW1lLiBJZiB0aGlzIGlzCisJICBsb3dlciwgZmV3ZXIgRE1BIHRyYW5zZmVycyBvY2N1ciBsZWFkaW5nIHRvIGxlc3MgYnVzIGNvbnRlbnRpb24uCisJICBZb3UgbWF5IHRyeSB0byB0dW5lIHRoaXMgaWYgZnRhcGUgYW5ub3lzIHlvdSB3aXRoICJyZWR1Y2VkIGRhdGEKKwkgIHJhdGUgYmVjYXVzZSBvZiBleGNlc3NpdmUgb3ZlcnJ1biBlcnJvcnMiIG1lc3NhZ2VzLiBIb3dldmVyLCB0aGlzCisJICBkb2Vzbid0IHNlZW0gdG8gaGF2ZSB0b28gbXVjaCBlZmZlY3QuCisKKwkgIElmIHVuc3VyZSwgZG9uJ3QgdG91Y2ggdGhlIGluaXRpYWwgdmFsdWUsIGkuZS4gbGVhdmUgaXQgYXQgIjgiLgorCitjb25maWcgRlRfRkRDX01BWF9SQVRFCisJaW50ICJNYXhpbWFsIGRhdGEgcmF0ZSB0byB1c2UgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBGVEFQRSAmJiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0ICIyMDAwIgorCS0tLWhlbHAtLS0KKwkgIFdpdGggc29tZSBtb3RoZXJib2FyZC9GREMgY29tYmluYXRpb25zIGZ0YXBlIHdpbGwgbm90IGJlIGFibGUgdG8KKwkgIHJ1biB5b3VyIEZEQy90YXBlIGRyaXZlIGNvbWJpbmF0aW9uIGF0IHRoZSBoaWdoZXN0IGF2YWlsYWJsZQorCSAgc3BlZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UgeW91J2xsIGVuY291bnRlciAicmVkdWNlZCBkYXRhIHJhdGUKKwkgIGJlY2F1c2Ugb2YgZXhjZXNzaXZlIG92ZXJydW4gZXJyb3JzIiBtZXNzYWdlcyBhbmQgbG90cyBvZiByZXRyaWVzCisJICBiZWZvcmUgZnRhcGUgZmluYWxseSBkZWNpZGVzIHRvIHJlZHVjZSB0aGUgZGF0YSByYXRlLgorCisJICBJbiB0aGlzIGNhc2UgaXQgbWlnaHQgYmUgZGVzaXJhYmxlIHRvIHRlbGwgZnRhcGUgYmVmb3JlaGFuZCB0aGF0CisJICBpdCBuZWVkIG5vdCB0cnkgdG8gcnVuIHRoZSB0YXBlIGRyaXZlIGF0IHRoZSBoaWdoZXN0IGF2YWlsYWJsZQorCSAgc3BlZWQuIElmIHVuc3VyZSwgbGVhdmUgdGhpcyBkaXNhYmxlZCwgaS5lLiBsZWF2ZSBpdCBhdCAyMDAwCisJICBiaXRzL3NlYy4KKworY29uZmlnIEZUX0FMUEhBX0NMT0NLCisJaW50ICJDUFUgY2xvY2sgZnJlcXVlbmN5IG9mIHlvdXIgREVDIEFscGhhIiBpZiBBTFBIQQorCWRlcGVuZHMgb24gRlRBUEUKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIE9uIHNvbWUgREVDIEFscGhhIG1hY2hpbmVzIHRoZSBDUFUgY2xvY2sgZnJlcXVlbmN5IGNhbm5vdCBiZQorCSAgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LCBzbyB5b3UgbmVlZCB0byBzcGVjaWZ5IGl0IGhlcmUgT05MWSBpZgorCSAgcnVubmluZyBhIERFQyBBbHBoYSwgb3RoZXJ3aXNlIHRoaXMgc2V0dGluZyBoYXMgbm8gZWZmZWN0LgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvZnRhcGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2N2QyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9NYWtlZmlsZQpAQCAtMCwwICsxLDI4IEBACisjCisjICAgICAgIENvcHlyaWdodCAoQykgMTk5NyBDbGF1cyBIZWluZS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorIworIyAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvTWFrZWZpbGUsdiAkCisjICRSZXZpc2lvbjogMS40ICQKKyMgJERhdGU6IDE5OTcvMTAvMDUgMTk6MTc6NTYgJAorIworIyAgICAgIE1ha2VmaWxlIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yCisjICAgICAgTGludXguCisjCisKK29iai0kKENPTkZJR19GVEFQRSkJCSs9IGxvd2xldmVsLworb2JqLSQoQ09ORklHX1pGVEFQRSkJCSs9IHpmdGFwZS8KK29iai0kKENPTkZJR19aRlRfQ09NUFJFU1NPUikJKz0gY29tcHJlc3Nvci8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9SRUFETUUuUENJIGIvZHJpdmVycy9jaGFyL2Z0YXBlL1JFQURNRS5QQ0kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkZTE1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9SRUFETUUuUENJCkBAIC0wLDAgKzEsODEgQEAKK1NvbWUgbm90ZXMgZm9yIGZ0YXBlIHVzZXJzIHdpdGggUENJIG1vdGhlcmJvYXJkczoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHByb2JsZW06CistLS0tLS0tLS0tLS0KKworVGhlcmUgaGF2ZSBiZWVuIHNvbWUgcHJvYmxlbSByZXBvcnRzIGZyb20gcGVvcGxlIHVzaW5nIFBDSS1idXMgYmFzZWQKK3N5c3RlbXMgZ2V0dGluZyBvdmVycnVuIGVycm9ycy4KK0kgd2Fzbid0IGFibGUgdG8gcmVwcm9kdWNlIHRoZXNlIHVudGlsIEkgcmFuIGZ0YXBlIG9uIGEgSW50ZWwgUGxhdG8KKyhQcmVtaWVyZSBQQ0kgSUkpIG1vdGhlcmJvYXJkIHdpdGggYmlvcyB2ZXJzaW9uIDEuMDAuMDhBWDEuCitJdCB0dXJuZWQgb3V0IHRoYXQgaWYgR0FUIChHdWFyYW50ZWVkIEFjY2VzcyBUaW1pbmcpIGlzIGVuYWJsZWQgKD8pCitmdGFwZSBnZXRzIGEgbG90IG9mIG92ZXJydW4gZXJyb3JzLgorVGhlIHByb2JsZW0gZGlzYXBwZWFycyB3aGVuIGRpc2FibGluZyBHQVQgaW4gdGhlIGJpb3MuCitOb3RlIHRoYXQgSW50ZWwgcmVtb3ZlZCB0aGlzIHNldHRpbmcgKHBlcm1hbmVudGx5IGRpc2FibGVkKSBmcm9tIHRoZQorMS4wMC4xMEFYMSBiaW9zICEKKworSXQgbG9va3MgbGlrZSB0aGF0IGlmIEdBVCBpcyBlbmFibGVkIHRoZXJlIGFyZSBvZnRlbiBsYXJnZSBwZXJpb2RzCisoZ3JlYXRlciB0aGFuIDEyMCB1cyAhPz8pIG9uIHRoZSBJU0EgYnVzIHRoYXQgdGhlIERNQSBjb250cm9sbGVyIGNhbm5vdAorc2VydmljZSB0aGUgZmxvcHB5IGRpc2sgY29udHJvbGxlci4KK0kgY2Fubm90IGltYWdpbmUgdGhpcyBiZWluZyBhY2NlcHRhYmxlIGluIGEgZGVjZW50IFBDSSBpbXBsZW1lbnRhdGlvbi4KK01heWJlIHRoaXMgaXMgYSBgZmVhdHVyZScgb2YgdGhlIGNoaXBzZXQuIEkgY2FuIG9ubHkgc3BlY3VsYXRlIHdoeQorSW50ZWwgY2hvb3NlIHRvIHJlbW92ZSB0aGUgb3B0aW9uIGZyb20gdGhlIGxhdGVzdCBCaW9zLi4uCisKK1RoZSBsZXNzb24gb2YgdGhpcyBhbGwgaXMgdGhhdCB0aGVyZSBtYXkgYmUgb3RoZXIgbW90aGVyYm9hcmQKK2ltcGxlbWVudGF0aW9ucyBoYXZpbmcgdGhlIHNhbWUgb2Ygc2ltaWxhciBwcm9ibGVtcy4KK0lmIHlvdSBleHBlcmllbmNlIGEgbG90IG9mIG92ZXJydW4gZXJyb3JzIGR1cmluZyBhIGJhY2t1cCB0byB0YXBlLAorc2VlIGlmIHRoZXJlIGlzIHNvbWUgc2V0dGluZyBpbiB0aGUgQmlvcyB0aGF0IG1heSBpbmZsdWVuY2UgdGhlCitidXMgdGltaW5nLgorCitJIGp1ZGdlIHRoaXMgYSBoYXJkd2FyZSBwcm9ibGVtIGFuZCBub3QgYSBsaW1pdGF0aW9uIG9mIGZ0YXBlIDstKQorTXkgRE9TIGJhY2t1cCBzb2Z0d2FyZSBzZWVtcyB0byBiZSBzdWZmZXJpbmcgZnJvbSB0aGUgc2FtZSBwcm9ibGVtcworYW5kIGV2ZW4gcmVmdXNlcyB0byBydW4gYXQgMSBNYnBzICEKK0Z0YXBlIHdpbGwgcmVkdWNlIHRoZSBkYXRhLXJhdGUgZnJvbSAxIE1icHMgdG8gNTAwIEticHMgaWYgdGhlIG51bWJlcgorb2Ygb3ZlcnJ1biBlcnJvcnMgb24gYSB0cmFjayBleGNlZWRzIGEgdGhyZXNob2xkLgorCisKK1Bvc3NpYmxlIHNvbHV0aW9uczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworU29tZSBvZiB0aGUgcHJvYmxlbXMgd2VyZSBzb2x2ZWQgYnkgdXBncmFkaW5nIHRoZSAoZmxhc2gpIGJpb3MuCitPdGhlciBzdWdnZXN0IHRoYXQgaXQgaGFzIHRvIGRvIHdpdGggdGhlIEZEQyBiZWluZyBvbiB0aGUgUENJCitidXMsIGJ1dCB0aGF0IGlzIG5vdCB0aGUgY2FzZSB3aXRoIHRoZSBJbnRlbCBQcmVtaWVyZSBJSSBib2FyZHMuCitbSWYgdXBncmFkaW5nIHRoZSBiaW9zIGRvZXNuJ3Qgc29sdmUgdGhlIHByb2JsZW0geW91IGNvdWxkIHRyeQorYSBmbG9wcHkgZGlzayBjb250cm9sbGVyIG9uIHRoZSBpc2EtYnVzXS4KKworSGVyZSBpcyBhIGxpc3Qgb2Ygc3lzdGVtcyBhbmQgcmVjb21tZW5kZWQgQklPUyBzZXR0aW5nczoKKworCisgICAgICAgIEludGVsIFByZW1pZXJlIFBDSSAoUmV2ZW5nZSk6CisKK0Jpb3MgdmVyc2lvbiAxLjAwLjA5LkFGMiBpcyByZXBvcnRlZCB0byB3b3JrLgorCisKKworICAgICAgICBJbnRlbCBQcmVtaWVyZSBQQ0kgSUkgKFBsYXRvKToKKworQmlvcyB2ZXJzaW9uIDEuMDAuMTAuQVgxIGFuZCB2ZXJzaW9uIDExIGJldGEgYXJlIG9rLgorSWYgdXNpbmcgdmVyc2lvbiAxLjAwLjA4LkFYMSwgR0FUIG11c3QgYmUgZGlzYWJsZWQgIQorCisKKworICAgICAgICBBU1VTIFBDSS9JLVNQM0c6CisKK1ByZWZlcnJlZCBzZXR0aW5nczogICAgIElTQS1HQVQtbW9kZSA6IGRpc2FibGVkCisgICAgICAgICAgICAgICAgICAgICAgICBETUEtbGluZWJ1ZmZlci1tb2RlIDogc3RhbmRhcmQKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQS1tYXN0ZXJidWZmZXItbW9kZSA6IHN0YW5kYXJkCisKKworICAgICAgICBERUxMIERpbWVuc2lvbiBYUFMgUDkwCisKK0Jpb3MgdmVyc2lvbiBBMiBpcyByZXBvcnRlZCB0byBiZSBicm9rZW4sIHdoaWxlIGJpb3MgdmVyc2lvbiBBNSB3b3Jrcy4KK1lvdSBjYW4gZ2V0IGEgZmxhc2ggYmlvcyB1cGdyYWRlIGZyb20gaHR0cDovL3d3dy5kZWxsLmNvbQorCisKK1RvIHNlZSBpZiB5b3UncmUgaGF2aW5nIHRoZSBHQVQgcHJvYmxlbSwgdHJ5IG1ha2luZyBhIGJhY2t1cAordW5kZXIgRE9TLiBJZiBpdCdzIHZlcnkgc2xvdyBhbmQgb2Z0ZW4gcmVwb3NpdGlvbnMgeW91J3JlCitwcm9iYWJseSBoYXZpbmcgdGhpcyBwcm9ibGVtLgorCisgICAgICAgICAgICAgICAgICAgICAgICAtLS8vLS0KKyBMb2NhbFdvcmRzOiAgZnRhcGUgUENJIGJpb3MgR0FUIElTQSBETUEgY2hpcHNldCBNYnBzIEticHMgRkRDIGlzYSBBRiBvayBBU1VTCisgTG9jYWxXb3JkczogIFNQIGxpbmVidWZmZXIgbWFzdGVyYnVmZmVyIFhQUyBodHRwIHd3dyBjb20KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9SRUxFQVNFLU5PVEVTIGIvZHJpdmVycy9jaGFyL2Z0YXBlL1JFTEVBU0UtTk9URVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3OTlkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9SRUxFQVNFLU5PVEVTCkBAIC0wLDAgKzEsOTY2IEBACitIZXksIEVtYWNzLCB3ZSdyZSAtKi1UZXh0LSotIG1vZGUhCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDRkIDI1LzExLzk3ID09PT09CistIFRoZSBjb3JyZWN0IHByZS1wcm9jZXNzb3Igc3RhdGVtZW50IGZvciAiZWxzZSBpZiIgaXMgIiNlbGlmIiBub3QKKyAgImVsc2lmIi4KKy0gTmVlZCB0byBjYWxsIHpmdF9yZXNldF9wb3NpdGlvbigpIHdoZW4gb3ZlcndyaXRpbmcgY2FydHJpZGdlcworICBwcmV2aW91c2x5IHdyaXR0ZW4gd2l0aCBmdGFwZS0yLngsIHNmdGFwZSwgb3IgYW5jaWVudAorICAocHJlLWZ0YXBlLTMueCkgdmVyc2lvbnMgb2YgemZ0YXBlLgorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjA0YyAxNi8xMS85NyA9PT09PQorLSBmZGNfcHJvYmUoKSB3YXMgY2FsbGluZyBEVU1QUkVHUyB3aXRoIGEgcmVzdWx0IGxlbmd0aCBvZiAiMSIgd2hpY2gKKyAgd2FzIGp1c3QgZmluZS4gVW5kbyBwcmV2aW91cyBjaGFuZ2UuCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDRiIDE0LzExLzk3ID09PT09CisKKy0gcGF0Y2hlcy8yLngueC9mbG9wcHkuYy5kaWZmIHdhcyBzb21ld2hhdCBicm9rZW4sIHJlbGVhc2luZyBpL28KKyAgcmVnaW9ucyBpdCBuZXZlciBoYWQgYWxsb2NhdGVkLgorLSBmZGNfcHJvYmUoKSB3YXMgY2FsbGluZyBEVU1QUkVHUyB3aXRoIGEgcmVzdWx0IGxlbmd0aCBvZiAiMSIgaW5zdGVhZAorICBvZiAiMTAiCistIFdyaXRpbmcgZGVsZXRlZCBkYXRhIG1hcmtzIGlmIHRoZSBmaXJzdCBzZWdlbnRzIG9uIHRyYWNrIHplcm8gYXJlCisgIHNob3VsZCB3b3JrIG5vdy4KKy0gZnRmb3JtYXQgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGhhbmRsZSB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgdGFwZQorICBkcml2ZSBzZXRzIHRoZSByZWFkIG9ubHkgc3RhdHVzIGJpdCAoUUlDLTQwLzgwIGNhcnRyaWRnZXMgd2l0aAorICBRSUMtMzAxMC8zMDIwIHRhcGUgZHJpdmVzKSBiZWNhdXNlIHRoZSBoZWFkZXIgc2VnbWVudCBpcyBkYW1hZ2VkLgorLSB0aGUgTVRJT0NGVENNRCBpb2N0bCBtYXkgbm93IGJlIGlzc3VlZCBieSB0aGUgc3VwZXJ1c2VyIE9OTFkuCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDRhIDEyLzExLzk3ID09PT09CistIEZpeCBhbiAiaW5maW5pdGUgbG9vcCBjYW4ndCBiZSBraWxsZWQgYnkgc2lnbmFsIiBidWcgaW4KKyAgZnRhcGVfZ2V0X2RyaXZlX3N0YXR1cygpLiBPbmx5IHJlbGV2YW50IHdoZW4gdHJ5aW5nIHRvIGFjY2VzcworICBidWdneS9taXNjb25maWd1cmVkIGhhcmR3YXJlCistIFRyeSB0byBjb21wZW5zYXRlIGEgYnVnIGluIHRoZSBIUCBDb2xvcmFkbyBUMzAwMCdzIGZpcm13YXJlOiBpdAorICBkb2Vzbid0IHNldCB0aGUgd3JpdGUgcHJvdGVjdCBiaXQgZm9yIFFJQzgwL1FJQzQwIGNhcnRyaWRnZXMuCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDQgMDYvMTEvOTcgPT09PT0KKy0gSWYgcG9zaXRpb25pbmcgd2l0aCBmYXN0IHNlZWtpbmcgZmFpbHMgZmFsbCBiYWNrIHRvIGEgc2xvdyBzZWVrCisgIGJlZm9yZSBnaXZpbmcgdXAuCistIChuZWFybHkpIG5vIHJldHJpZXMgb24gIm5vIGRhdGEgZXJyb3JzIiB3aGVuIHZlcmlmeWluZyBhZnRlcgorICBmb3JtYXR0aW5nLiBJbXByb3ZlZCB0dW5pbmcgb2YgdGhlIGJhZCBzZWN0b3IgbWFwIGFmdGVyIGZvcm1hdHRpbmcuCistIHRoZSBkaXJlY3RvcnkgbGF5b3V0IGhhcyBjaGFuZ2VkIGFnYWluIHRvIGFsbG93IGZvciBlYXNpZXIga2VybmVsCisgIGludGVncmF0aW9uCistIE1vZHVsZSBwYXJhbWV0ZXIgImZ0YXBlX3RyYWNpbmciIG5vdyBpcyBjYWxsZWQgImZ0X3RyYWNpbmciIGJlY2F1c2UKKyAgdGhlICJmdGFwZV90cmFjaW5nIiB2YXJpYWJsZSBoYXMgdGhlIHZlcnNpb24gY2hlY2tzdW0gYXR0YWNoZWQgdG8gaXQuCistIGAvcHJvYy9mdGFwZScgaW50ZXJmYWNlIGZvciAyLjAuKiBrZXJuZWxzLiBgL3Byb2MvZnRhcGUnIG5vIGxvbmdlcgorICBpcyBhIGRpcmVjdG9yeSBidXQgYSBmaWxlIHRoYXQgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBmb3JtZXJseQorICBwcm92aWRlZCBpbiBzZXBhcmF0ZSBmaWxlcyB1bmRlciB0aGUgYC9wcm9jL2Z0YXBlLycgZGlyZWN0b3J5LgorLSBNb3N0IG9mIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgaGF2ZSBiZWVuIHByZWZpeGVkIGJ5ICJDT05GSUdfRlRfIgorICBpbiBwcmVwYXJhdGlvbiBvZiB0aGUga2VybmVsIGluY2x1c2lvbi4gVGhlIE1ha2VmaWxlcyB1bmRlcgorICAiLi9mdGFwZS8iIHNob3VsZCBiZSBkaXJlY3RseSB1c2FibGUgYnkgdGhlIGtlcm5lbC4KKy0gVGhlIE1PRFZFUlNJT05TIHN0dWZmIGlzIG5vdyBhdXRvLWRldGVjdGVkLgorLSBCcm9rZSBiYWNrc2xhc2hlZCBtdWx0aSBsaW5lIG9wdGlvbnMgaW4gTUNPTkZJRyBpbnRvIHNlcGFyYXRlIGxpbmVzCisgIHVzaW5nIEdOVS1tYWtlJ3MgIis9IiBmZWF0dXJlLgorLSBUaGUgaHRtbCBhbmQgZHZpIHZlcnNpb24gb2YgdGhlIG1hbnVhbCBpcyBub3cgaW5zdGFsbGVkIHVuZGVyCisgICcvdXNyL2RvYy9mdGFwZWAgd2l0aCAnbWFrZSBpbnN0YWxsYAorLSBOZXcgU01QIGRlZmluZSBpbiBNQ09ORklHLiBmdGFwZSB3b3JrcyB3aXRoIFNNUCBpZiB0aGlzIGlzIGRlZmluZWQuCistIGF0dGVtcHQgdG8gY29wZSB3aXRoICJleGNlc3NpdmUgb3ZlcnJ1biBlcnJvcnMiIGJ5IGdyYWR1YWxseQorICBpbmNyZWFzaW5nIEZEQyBGSUZPIHRocmVzaG9sZC4gQnV0IHRoaXMgZG9lc24ndCBzZWVtIHRvIGhhdmUgdG9vCisgIG11Y2ggYW4gZWZmZWN0LgorLSBOZXcgbG9hZCB0aW1lIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICJmdF9mZGNfcmF0ZV9saW1pdCIuIElmIHlvdQorICBlbmNvdW50ZXIgdG9vIG1hbnkgb3ZlcnJ1biBlcnJvcnMgd2l0aCBhIDJNYiBjb250cm9sbGVyIHRoZW4geW91CisgIG1pZ2h0IHdhbnQgdG8gc2V0IHRoaXMgdG8gMTAwMC4KKy0gb3ZlcnJ1biBlcnJvcnMgb24gdGhlIGxhc3Qgc2VjdG9yIGluIGEgc2VnbWVudCBzb21ldGltZXMgcmVzdWx0IGluCisgIGEgemVybyBETUEgcmVzaWR1ZS4gRHVubm8gd2h5LCBidXQgY29tcGVuc2F0ZSBmb3IgaXQuCistIHRoZXJlIHdlcmUgc3RpbGwgZmRjX3JlYWQoKSB0aW1lb3V0IGVycm9ycy4gSSB0aGluayBJIGhhdmUgZml4ZWQgaXQKKyAgbm93LCBwbGVhc2UgRklYTUUuCistIFNvbWV0aW1lcyBmdGFwZV93cml0ZSgpIGZhaWxlZCB0byByZS1zdGFydCB0aGUgdGFwZSBkcml2ZSB3aGVuIGEKKyAgc2VnbWVudCB3aXRob3V0IGEgZ29vZCBzZWN0b3Igd2FzIHJlYWNoZWQgKCJ3YWl0IGZvciBlbXB0eSBzZWdtZW50CisgIGZhaWxlZCIpLiBUaGlzIGlzIGZpeGVkLiBFc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgPiBRSUMtMzAxMC4KKy0gc2Z0YXBlIChha2EgZnRhcGUtMi54KSBoYXMgdmFuaXNoZWQuIEkgZGlkbid0IHdvcmsgb24gaXQgZm9yCisgIGFnZXMuIEl0IGlzIHByb2JhYmx5IHN0aWxsIHBvc3NpYmxlIHRvIHVzZSB0aGUgb2xkIGNvZGUgd2l0aAorICBmdGFwZS0zLjA0LCBpZiBvbmUgcmVhbGx5IG5lZWRzIGl0IChCVVQgUkVDT01QSUxFIElUKQorLSB6ZnRhcGUgbm8gbG9uZ2VyIGFsdGVycyB0aGUgY29udGVudHMgb2YgYWxyZWFkeSBleGlzdGluZyB2b2x1bWUKKyAgdGFibGUgZW50cmllcywgd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8gZmlsbCBpbiBtaXNzaW5nIGZpZWxkcywKKyAgbGlrZSB0aW1lIHN0YW1wcyB1c2luZyBzb21lIHVzZXIgc3BhY2UgcHJvZ3JhbS4KKy0gLi9jb250cmliL3Z0YmxjLyBjb250YWlucyBzdWNoIGEgcHJvZ3JhbS4KKy0gbmV3IHBlcmwgc2NyaXB0IC4vY29udHJpYi9zY3JpcHRzL2xpc3R0YXBlIHRoYXQgbGlzdCB0aGUgY29udGVudHMgb2YgYQorICBmbG9wcHkgdGFwZSBjYXJ0cmlkZ2UgcGFyc2luZyB0aGUgb3V0cHV0IG9mICJtdCB2b2xpbmZvIiArICJtdCBmc2YiCistIHRoZSBNVFdFT0YgaW1wbGVtZW50YXRpb24gaGFzIGNoYW5nZWQgYSBsaXR0bGUgYml0IChhZnRlciBJIGhhZCBhCisgIGxvb2sgYXQgYW1hbmRhKS4gQ2FsbGluZyBNVFdFT0Ygd2hpbGUgdGhlIHRhcGUgaXMgc3RpbGwgaGVsZCBvcGVuCisgIGFmdGVyIHdyaXRpbmcgc29tZXRoaW5nIHRvIHRoZSB0YXBlIG5vdyB3aWxsIHRlcm1pbmF0ZSB0aGUgY3VycmVudAorICB2b2x1bWUsIGFuZCBzdGFydCBhIG5ldyBvbmUgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCistIHRoZSB2b2x1bWUgdGFibGUgbWFpbnRhaW5lZCBieSB6ZnRhcGUgbm93IGlzIGEgZG91Ymx5IGxpbmtlZCBsaXN0CisgIHRoYXQgZ3Jvd3MgZHluYW1pY2FsbHkgYXMgbmVlZGVkLgorCisgIGZvcm1hdHRpbmcgZmxvcHB5IHRhcGUgY2FydHJpZGdlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKiB0aGVyZSBpcyBhIG5ldyB1c2VyIHNwYWNlIGZvcm1hdHRpbmcgcHJvZ3JhbSB0aGF0IGRvZXMgbW9zdCBvZiB0aGUKKyAgICBkaXJ0eSB3b3JrIGluIHVzZXIgc3BhY2UgKGF1dG8tZGV0ZWN0LCBjb21wdXRpbmcgdGhlIHNlY3RvcgorICAgIGNvb3JkaW5hdGVzLCBhZGp1c3RpbmcgdGltZSBzdGFtcHMgYW5kIHN0YXRpc3RpY3MpLiBJdCBoYXMgYQorICAgIHNpbXBsZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLgorICAqIGZ0YXBlLWZvcm1hdC5vIGhhcyB2YW5pc2hlZCwgaXQgaGFzIGJlZW4gZm9sZGVkIGludG8gdGhlIGxvdyBsZXZlbAorICAgIGZ0YXBlLm8gbW9kdWxlLCBhbmQgdGhlIGlvY3RsIGludGVyZmFjZSBpbnRvIHpmdGFwZS5vLiBNb3N0IG9mIHRoZQorICAgIGNvbXBsaWNhdGVkIHN0dWZmIGhhcyBiZWVuIG1vdmVkIHRvIHVzZXIgc3BhY2UsIHNvIHRoZXJlIHdhcyBubworICAgIG5lZWQgZm9yIGEgc2VwYXJhdGUgbW9kdWxlIGFueW1vcmUuCisgICogdGhlcmUgaXMgYSBuZXcgaW9jdGwgTVRJT0NGVENNRCB0aGF0IHNlbmRzIGEgYmFyZSBRSUMtMTE3IGNvbW1hbmQKKyAgICB0byB0aGUgdGFwZSBkcml2ZS4KKyAgKiB0aGVyZSBpcyBhIG5ldyBtbWFwKCkgZmVhdHVyZSB0byBtYXAgdGhlIGRtYSBidWZmZXJzIGludG8gdXNlcgorICAgIHNwYWNlIHRvIGJlIHVzZWQgYnkgdGhlIHVzZXIgbGV2ZWwgZm9ybWF0dGluZyBwcm9ncmFtLgorICAqIEZvcm1hdHRpbmcgb2YgeWV0IHVuZm9ybWF0dGVkIG9yIHRvdGFsbHkgZGVnYXVzc2VkIGNhcnRyaWRnZXMKKyAgICBzaG91bGQgYmUgcG9zc2libGUgbm93LiBGSVhNRS4KKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMy4wM2IsIDxmb3Jnb3QgdGhlIGV4YWN0IGRhdGU+ID09PT0KKworZnRhcGUtMy4wM2Igd2FzIHJlbGVhc2VkIGFzIGEgYmV0YSByZWxlYXNlIG9ubHkuIEl0cyBtYWluIG5ldyBmZWF0dXJlCit3YXMgc3VwcG9ydCBvZiB0aGUgRElUVE8tMkdCIGRyaXZlLiBUaGlzIHdhcyBtYWRlIHBvc3NpYmxlIGJ5IHJldmVyc2UKK2VuZ2luZWVyaW5nIGRvbmUgYnkgPGZpbGwgaW4gaGlzIG5hbWU+IGFmdGVyIElvbWVnYSBmYWlsZWQgdG8gc3VwcG9ydAorZnRhcGUuIEFsdGhvdWdoIHRoZXkgaGFkIHByb21pc2VkIHRvIGRvIHNvICh0aGlzIG1ha2VzIG1lIGZlZWwgYSBiaXQKK3NhZCBhbmQgdW5jb21mb3J0YWJsZSBhYm91dCBJb21lZ2EpLgorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjAzYSwgMjIvMDUvOTcgPT09PQorCistIEZpbmFsbHkgZml4ZWQgYXV0by11bi1sb2FkaW5nIG9mIG1vZHVsZXMgZm9yIGtlcm5lbHMgPiAyLjEuMTgKKy0gQWRkIGFuICJ1bmluc3RhbGwiIHRhcmdldCB0byB0aGUgTWFrZWZpbGUKKy0gcmVtb3ZlZCB0aGUga2R0aW1lIGhhY2sKKy0gdGV4aTJ3d3cgZGlkbid0IHByb3Blcmx5IHNldCB0aGUgYmFjay1yZWZlcmVuY2UgZnJvbSBhIGZvb3Rub3RlIGJhY2sKKyAgdG8gdGhlIHJlZ3VsYXIgdGV4dC4KKworICB6ZnRhcGUgc3BlY2lmaWMKKyAgLS0tLS0tLS0tLS0tLS0tCisgICogaGlkZSB0aGUgb2xkIGNvbXByZXNzaW9uIG1hcCB2b2x1bWUuIFRhcGVyIGRvZXNuJ3QgYWNjZXB0IHRoZQorICAgIHByZXNlbmNlIG9mIG5vbi1UYXBlciB2b2x1bWVzIGFuZCBUYXBlci13cml0dGVuIHZvbHVtZSBvbiB0aGUgc2FtZQorICAgIHRhcGUuCisgICogRU9EIChFbmQgT2YgRGF0YSkgaGFuZGxpbmcgd2FzIHN0aWxsIGJyb2tlbjogdGhlIGV4cGVjdGVkIGJlaGF2aW9yCisgICAgaXMgdG8gcmV0dXJuIGEgemVybyBieXRlIGNvdW50IGF0IHRoZSBmaXJzdCBhdHRlbXB0IHRvIHJlYWQgcGFzdAorICAgIEVPRCwgcmV0dXJuIGEgemVybyBieXRlIGNvdW50IGF0IHRoZSBzZWNvbmQgYXR0ZW1wdCB0byByZWFkIHBhc3QKKyAgICBFT0QgYW5kIFRIRU4gcmV0dXJuIC1FSU8uCisgIAorICBmdGFwZS1mb3JtYXQgc3BlY2lmaWMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICogRGV0ZWN0aW9uIG9mIFFJQy00MCBjYXJ0cmlkZ2VzIGluIHNlbGVjdF90YXBlX2Zvcm1hdCgpIHdhcyBicm9rZW4KKyAgICBhbmQgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIGZvcm1hdCBRSUMtMzAxMC8zMDIwIGNhcnRyaWRnZXMuCisgICogVGhlcmUgYXJlIHN0cmFuZ2UgIlRSLTEgRXh0cmEiIGNhcnRyaWRnZXMgb3V0IHRoZXJlIHdoaWNoIHdlcmVuJ3QKKyAgICBkZXRlY3RlZCBwcm9wZXJseSBiZWNhdXNlIHRoZSBkb24ndCBzdHJpY3RseSBjb25mb3JtIHRvIHRoZQorICAgIFFJQy04MCwgUmV2LiBOLCBzcGVjLgorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjAzLCAzMC8wNC85NyA9PT09PQorCistIFJlbW92ZWQga2VybmVsIGludGVncmF0aW9uIGNvZGUgZnJvbSB0aGUgcGFja2FnZS4gSSBwbGFuIHRvIHByb3ZpZGUKKyAgYSBwYWNrYWdlIHRoYXQgY2FuIGJlIGludGVncmF0ZWQgaW50byB0aGUgc3RvY2sga2VybmVsIHNlcGFyYXRlbHkKKyAgKGhvcGVmdWxseSBzb29uKS4KKyAgQXMgYSByZXN1bHQsIGEgc2ltcGxlIGBtYWtlJyBjb21tYW5kIG5vdyB3aWxsIGJ1aWxkIGV2ZXJ5dGhpbmcuCistIEFMTCBjb21waWxlIHRpbWUgY29uZmlndXJhdGlvbiBvcHRpb25zIGhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgZmlsZQorICBgTUNPTkZJRycuCistIFF1aXRlIGEgZmV3IGBsb3cgbGV2ZWwnIGNoYW5nZXMgdG8gYWxsb3cgZm9ybWF0dGluZyBvZiBjYXJ0cmlkZ2VzLgorLSBmb3JtYXR0aW5nIGlzIGltcGxlbWVudGVkIGFzIGEgc2VwYXJhdGUgbW9kdWxlIGBmdGFwZS1mb3JtYXQubycuIFRoZQorICBtb2RpZmllZCBgbXQnIHByb2dyYW0gY29udGFpbnMgc2FtcGxlIGNvZGUgdGhhdCBzaG93cyBob3cgdG8gdXNlIGl0LgorLSBUaGUgVkZTIGludGVyZmFjZSBoYXMgYmVlbiBtb3ZlZCBmcm9tIHRoZSBgZnRhcGUubycgbW9kdWxlIHRvIHRoZQorICBoaWdoIGxldmVsIG1vZHVsZXMgYHpmdGFwZS5vJyByZXNwLiBgc2Z0YXBlLm8nLiBgZnRhcGUubycgY29udGFpbnMKKyAgdGhlIGhhcmR3YXJlIHN1cHBvcnQgb25seS4KKy0gQSBiaXQgb2YgL3Byb2Mgc3VwcG9ydCBmb3Iga2VybmVscyA+IDIuMS4yOAorLSBNb3ZlZCBkb2N1bWVudGF0aW9uIHRvIERvYyBzdWJkaXIuIElOU1RBTEwgbm93IGNvbnRhaW5zIHNvbWUgcmVhbAorICBpbnN0YWxsYXRpb24gbm90ZXMuCistIGBpbnN0YWxsJyB0YXJnZXQgaW4gTWFrZWZpbGUuCisKK3pmdGFwZSBzcGVjaWZpYzoKKy0tLS0tLS0tLS0tLS0tLS0KKworLSB6ZnRhcGUgd29ya3MgZm9yIGxhcmdlIGNhcnRyaWRnZXMgbm93ICggPiAyXjMxIGJ5dGVzKQorLSBNVElPQ1ZPTElORk8gYW5kIE1USU9DR0VUU0laRSBub3cgcmV0dXJuIHRoZSBzaXplIGluIEtJTE9CWVRFUywKKyAgTk8gTE9OR0VSIGluIGJ5dGVzLgorCistIHBlcm1pc3Npb25zIGZvciB3cml0ZSBhY2Nlc3MgdG8gYSBjYXJ0cmlkZ2UgaGF2ZSBjaGFuZ2VkOgorICAqIHpmdGFwZSBub3cgYWxzbyB0YWtlcyB0aGUgZmlsZSBhY2Nlc3MgbW9kZSBpbnRvIGFjY291bnQKKyAgKiB6ZnRhcGUgbm8gbG9uZ2VyIGFsbG93cyB3cml0aW5nIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJlY29yZGVkCisgICAgbWVkaWEuIFRoZSB0YXBlIGhhcyB0byBiZSBwb3NpdGlvbmVkIGF0IEJPVCBvciBFT0QgZm9yIHdyaXRlCisgICAgYWNjZXNzLgorCistIE1UQlNGIGhhcyBjaGFuZ2VkLiBJdCB1c2VkIHRvIHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgIHByZXZpb3VzIGZpbGUgd2hlbiBjYWxsZWQgd2l0aCBjb3VudCAxLiBUaGlzIHdhcyBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgZXhwZWN0ZWQgYmVoYXZpb3IgZm9yIG90aGVyIFVuKnggdGFwZSBkcml2ZXJzIChpLmUuIFNDU0kpLiBNVEJTRgorICB3aXRoIGNvdW50IDEgc2hvdWxkIG1lcmVseSBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50CisgIHZvbHVtZS4gRml4ZWQuIEFzIGEgcmVzdWx0LCBgdGFyIC0tdmVyaWZ5JyBub3cgcHJvZHVjZXMgdGhlIGRlc2lyZWQKKyAgcmVzdWx0OiBpdCB2ZXJpZmllcyB0aGUgbGFzdCB3cml0dGVuIHZvbHVtZSwgbm90IHRoZSBwcmUtbGFzdAorICB3cml0dGVuIHZvbHVtZS4KKworLSBUaGUgY29tcHJlc3Npb24gbWFwIGhhcyB2YW5pc2hlZCAtLT4gbm8gbmVlZCBmb3IgYG10IGVyYXNlJyBhbnkKKyAgbW9yZS4gRmFzdCBzZWVraW5nIGluIGEgY29tcHJlc3NlZCB2b2x1bWUgaXMgc3RpbGwgYmUgcG9zc2libGUsIGJ1dAorICB0YWtlcyBzbGlnaHRseSBsb25nZXIuIEFzIGEgc2lkZSBlZmZlY3QsIHlvdSBtYXkgZXhwZXJpZW5jZSBhbgorICBhZGRpdGlvbmFsIHZvbHVtZSBzaG93aW5nIHVwIGluIGZyb250IG9mIGFsbCBvdGhlcnMgZm9yIG9sZAorICBjYXJ0cmlkZ2VzLiBUaGlzIGlzIHRoZSB0YXBlIHZvbHVtZSB0aGF0IGhvbGRzIHRoZSBjb21wcmVzc2lvbiBtYXAuCisKKy0gVGhlIGNvbXByZXNzaW9uIHN1cHBvcnQgZm9yIHpmdGFwZSBoYXMgYmVlbiBtb3ZlZCB0byBhIHNlcGFyYXRlCisgIG1vZHVsZSBgemZ0LWNvbXByZXNzb3InLiBET04nVCBmb3JnZXQgdG8gbG9hZCBpdCBiZWZvcmUgdHJ5aW5nIHRvCisgIHJlYWQgYmFjayBjb21wcmVzc2VkIHZvbHVtZXMuIFRoZSBzdG9jayBgemZ0YXBlLm8nIG1vZHVsZSBwcm9iZXMgZm9yCisgIHRoZSBtb2R1bGUgYHpmdC1jb21wcmVzc29yJyB1c2luZyB0aGUga2VybmVsZCBtZXNzYWdlIGNoYW5uZWw7IHlvdQorICBoYXZlIHRvIGluc3RhbGwgYHpmdC1jb21wcmVzc29yLm8nIGluIGEgcGxhY2Ugd2hlcmUgbW9kcHJvYmUgY2FuCisgIGZpbmQgaXQgaWYgeW91IHdhbnQgdG8gdXNlIHRoaXMuCisKKy0gTmV3IGV4cGVyaW1lbnRhbCBmZWF0dXJlIHRoYXQgdHJpZXMgdG8gZ2V0IHRoZSBicm9rZW4gZG93biBHTVQgdGltZQorICBmcm9tIHVzZXIgc3BhY2UgdmlhIGEga2VybmVsIGRhZW1vbiBtZXNzYWdlIGNoYW5uZWwuIFlvdSBuZWVkIHRvCisgIGNvbXBpbGUgYW5kIHN0YXJ0IHRoZSBga2R0aW1lJyBkYWVtb24gY29udGFpbmVkIGluIHRoZSBjb250cmliCisgIGRpcmVjdG9yeSB0byB1c2UgaXQuIE5lZWRlZCAoPykgZm9yIHRpbWUgc3RhbXBzIGluIHRoZSBoZWFkZXIKKyAgc2VnbWVudHMgYW5kIHRoZSB2b2x1bWUgdGFibGUuCisKKy0gdmFyaWFibGUgYmxvY2sgc2l6ZSBtb2RlIHZpYSBNVFNFVEJMSyAwCisKKy0ga2VlcCBtb2R1bGVzIGxvY2tlZCBpbiBtZW1vcnkgYWZ0ZXIgdGhlIGJsb2NrIHNpemUgaGFzIGJlZW4gY2hhbmdlZAorCitzZnRhcGUgc3BlY2lmaWM6CistLS0tLS0tLS0tLS0tLS0tCisKKy0gZW5kIG9mIHRhcGUgaGFuZGxpbmcgc2hvdWxkIGJlIGZpeGVkLCBpLmUuIG11bHRpIHZvbHVtZSBhcmNoaXZlcworICB3cml0dGVuIHdpdGggYGFmaW8nIGNhbiBiZSByZWFkIGJhY2sgbm93LgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDJhLCAwOS8wMS85NyA9PT09PQorCitObyBiaWcgbmV3czoKKy0gY2FsbCB6ZnRfaW5pdCgpIHJlc3AuIHNmdF9pbml0KCkgd2hlbiBjb21waWxpbmcgdGhlIGVudGlyZSBzdHVmZgorICBpbnRvIHRoZSBrZXJuZWwgaW1hZ2UuCistIGZpeCBidWcgaW4gZnRhcGUtc2V0dXAuYyB3aGVuIE5PX1RSQUNFX0FUX0FMTCB3YXMgZGVmaW5lZC4KKy0gZml4IGJ1ZyBpbiBzZnRhcGUtZW9mLmMvemZ0YXBlLWVvZi5jIGZvciBvbGQga2VybmVscyAoMS4yLiopCistIGFkZCBzdXBwb3J0IGZvciBuZXcgbW9kdWxlIGludGVyZmFjZSBmb3IgcmVjZW50IGtlcm5lbHMKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMy4wMiwgMTYvMTIvOTYgPT09PT0KKy0gRml4ZWQgdGhlIGBGREMgdW5sb2NrIGNvbW1hbmQgZmFpbGVkJyBidWcgaW4gZmRjLWlvLmMuIFdoZW4gdGhlIEZJRk8KKyAgd2FzIGFscmVhZHkgbG9ja2VkIHdoZW4gZnRhcGUgd2FzIGxvYWRlZCwgZnRhcGUgZmFpbGVkIHRvIHVubG9jayBpdC4KKy0gRml4ZWQgY29tcGlsYXRpb24gb2YgYGNvbnRyaWIvZ251bXQnLiBJdCBub3cgZmluZHMgYG10aW8uaCcgZXZlbiBpZgorICBmdGFwZSBpcyBOT1QgaW5jbHVkZWQgaW50byB0aGUga2VybmVsIHNvdXJjZSB0cmVlLgorLSBmYy0xMC5jOiBpbmNsdWRlIDxhc20vaW8uaD4gZm9yIGluYigpIGFuZCBvdXRiKCkuCistIGZ0YXBlL3NmdGFwZS96ZnRhcGU6IGFsbCBnbG9iYWwgdmFyaWFibGUgbm93IGhhdmUgZWl0aGVyIGEgYGZ0YXBlXycsCisgIGEgYGZ0XycsIGBzZnRfJywgYHpmdF8nIG9yIGBxaWNfJyBwcmVmaXggdG8gcHJldmVudCBuYW1lIGNsYXNoZXMKKyAgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsIHdoZW4gaW5jbHVkaW5nIGZ0YXBlIGludG8gdGhlIGtlcm5lbAorICBzb3VyY2UgdHJlZS4KKy0gS2VybmVsZCBzdXBwb3J0IGhhcyBjaGFuZ2VkLiBgZnRhcGUnIG5vdyBzZWFyY2hlcyBmb3IgYSBtb2R1bGUKKyAgYGZ0YXBlLWZyb250ZW5kJyB3aGVuIG5vbmUgb2YgdGhlIGZyb250ZW5kIChgc2Z0YXBlJyBvciBgemZ0YXBlJykgaXMKKyAgbG9hZGVkLiBQbGVhc2UgcmVmZXIgdG8gdGhlIGBJbnN0YWxsYXRpb24vTG9hZGluZyBmdGFwZScgc2VjdGlvbiBvZgorICB0aGUgVGVYaW5mbyBtYW51YWwuCistIEFkZCBsb2FkIHJlc3AuIGJvb3QtdGltZSBjb25maWd1cmF0aW9uIG9mIGZ0YXBlLiBUaGVyZSBhcmUgbm93CisgIHZhcmlhYmxlcyBmdF9mZGNfYmFzZSwgZnRfZmRjX2RtYSBhbmQgZnRfZmRjX2lycSBjb3JyZXNwb25kaW5nIHRvCisgIHRoZSBmb3JtZXIgRkRDX0JBU0UgZXRjLiBjb21waWxlIHRpbWUgZGVmaW5pdGlvbnMuIE9uZSBjYW4gYWxzbyB1c2UKKyAgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyB0byBjb25maWd1cmUgdGhlIGRyaXZlciBpZiBpdCBpcworICBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuIEFsc28sIHRoZSBGQy0xMC9GQy0yMCBzdXBwb3J0IGlzIGxvYWQtdGltZQorICBjb25maWd1cmFibGUgbm93IGFzIHdlbGwgYXMgdGhlIE1BQ0gtSUkgaGFjayAoZnRfcHJvYmVfZmMxMCwKKyAgcmVzcC4gZnRfbWFjaDIpLiBQbGVhc2UgcmVmZXIgdG8gdGhlIHNlY3Rpb24gYEluc3RhbGxhdGlvbi9Db25maWd1cmUKKyAgZnRhcGUnIG9mIHRoZSBUZVhpbmZvIG1hbnVhbC4KKy0gSSByZW1vdmVkIHRoZSBNT0RWRVJTSU9OUyBvcHRpb24gZnJvbSBgTWFrZWZpbGUubW9kdWxlJy4gTGV0IG1lIGFsb25lCisgIHdpdGggZnRhcGUgYW5kIE1PRFZFUlNJT05TIHVubGVzcyB5b3UgaW5jbHVkZSB0aGUgZnRhcGUgc291cmNlcyBpbnRvCisgIHRoZSBrZXJuZWwgc291cmNlIHRyZWUuCistIG5ldyB2ZW5kb3JzIGluIGB2ZW5kb3JzLmgnOgorICAqIEhQIENvbG9yYWRvIFQzMDAwIAorICAqIENvbUJ5dGUgRG91YmxlUGxheSAoaW5jbHVkaW5nIGEgYnVnIGZpeCBmb3IgdGhlaXIgYnJva2VuCisgICAgZm9ybWF0dGluZyBzb2Z0d2FyZSwgdGhhbmtzIHRvIHdocmF2ZW5AbmphY2tuLmNvbSkKKyAgKiBJb21lZ2EgRElUVE8gMkdJRy4gTk9URTogdGhpcyBkcml2ZSBjYW5ub3Qgd29yayB3aXRoIGZ0YXBlIGJlY2F1c2UKKyAgICB0aGUgbG9naWNhbCBkYXRhIGxheW91dCBvZiB0aGUgY2FydHJpZGdlcyB1c2VkIGJ5IHRoaXMgZHJpdmUgZG9lcworICAgIE5PVCBjb25mb3JtIHRvIHRoZSBRSUMgc3RhbmRhcmRzLCBpdCBpcyBhIHNwZWNpYWwgSW9tZWdhIHNwZWNpZmljCisgICAgZm9ybWF0LiBJJ3ZlIHNlbnQgbWFpbCB0byBJb21lZ2EgYnV0IGRpZG4ndCByZWNlaXZlIGFuIGFuc3dlcgorICAgIHlldC4gSWYgeW91IHdhbnQgdGhpcyBkcml2ZSB0byBiZSBzdXBwb3J0ZWQgYnkgZnRhcGUsIGFzayBJb21lZ2EKKyAgICB0byBnaXZlIG1lIGluZm9ybWF0aW9uIGFib3V0IGl0LgorLSB6ZnRhcGU6CisgICogcmUtaW50cm9kdWNlZCB0aGUgTVRJT0NfWkZUQVBFX0dFVEJMS1NaIGlvY3RsIGZvciBjb21wYXRpYmlsaXR5CisgICAgd2l0aCB6ZnRhcGUgMS4wNmEgYW5kIGVhcmxpZXIuIFBsZWFzZSBkb24ndCB1c2UgaXQgd2hlbiB3cml0aW5nCisgICAgbmV3IHNvZnR3YXJlLCB1c2UgdGhlIE1USU9DVk9MSU5GTyBpb2N0bCBpbnN0ZWFkLgorICAqIE1ham9yIG92ZXJoYXVsIG9mIHRoZSBjb2RlIHRoYXQgdXBkYXRlcyB0aGUgaGVhZGVyIHNlZ21lbnRzLiBOZXZlcgorICAgIGNoYW5nZSB0aGUgdGFwZSBsYWJlbCB1bmxlc3MgZXJhc2luZyB0aGUgdGFwZS4gVGh1cyB3ZSBhbG1vc3QKKyAgICBuZXZlciBuZWVkIHRvIHdyaXRlIHRoZSBoZWFkZXIgc2VnbWVudHMsIHVubGVzcyB3ZSB3b3VsZCBtb2RpZnkKKyAgICB0aGUgYmFkIHNlY3RvciBtYXAgd2hpY2ggaXNuJ3QgZG9uZSB5ZXQuIFVwZGF0aW5nIG9mIHZvbHVtZSB0YWJsZQorICAgIGFuZCBjb21wcmVzc2lvbiBtYXAgbW9yZSBzZWN1cmUgbm93IGFsdGhvdWdoIGl0IHRha2VzIGEgYml0CisgICAgbG9uZ2VyLgorICAqIEZpeGVkIGJ1ZyB3aGVuIGFib3J0aW5nIGEgd3JpdGUgb3BlcmF0aW9uIHdpdGggYSBzaWduYWw6IHpmdGFwZQorICAgIG5vdyBmaW5pc2hlcyB0aGUgY3VycmVudCB2b2x1bWUgKGkuZS4gd3JpdGVzIGFuIGVvZiBtYXJrZXIpIGF0IHRoZQorICAgIGN1cnJlbnQgcG9zaXRpb24uIEl0IGRpZG4ndCBiZWZvcmUgd2hpY2ggbGVkIHRvIHNvbWVob3cgKnN0cmFuZ2UqCisgICAgYmVoYXZpb3IgaW4gdGhpcyBjYXNlcy4KKyAgKiBLZWVwIG1vZHVsZSBsb2NrZWQgaW4gbWVtb3J5IHdoZW4gdXNpbmcgaXQgd2l0aCAgdGhlIG5vbi1yZXdpbmRpbmcKKyAgICBkZXZpY2VzIGFuZCB0aGUgdGFwZSBpcyBub3QgbG9naWNhbCBhdCBCT1QuIE5lZWRlZCBmb3Iga2VybmVsZAorICAgIHN1cHBvcnQuCistIHNmdGFwZToKKyAgKiBLZWVwIG1vZHVsZSBsb2NrZWQgaW4gbWVtb3J5IHdoZW4gdXNpbmcgaXQgd2l0aCAgdGhlIG5vbi1yZXdpbmRpbmcKKyAgICBkZXZpY2VzIGFuZCB0aGUgdGFwZSBpcyBub3QgbG9naWNhbCBhdCBCT1QuIE5lZWRlZCBmb3Iga2VybmVsZAorICAgIHN1cHBvcnQuCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDEsIDE0LzExLzk2ID09PT09CisKKy0gRml4ZWQgc2lsbHkgYnVncyBpbiBmdGFwZS0zLjAwOgorICAqIE1BS0VERVYuZnRhcGU6IG1ham9yIGRldmljZSBudW1iZXIgbXVzdCBiZSAyNywgbm90IDIzIAorICAqIHNmdGFwZS9zZnRhcGUtcmVhZC5jOiBzZnRhcGVfcmVhZF9oZWFkZXJfc2VnbWVudHMoKSBjYWxsZWQgCisgICAgaXRzZWxmIHJlY3Vyc2l2ZWx5IGluc3RlYWQgb2YgY2FsbGluZyBmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KCkKKyAgKiB6ZnRhcGUvcWljLXZ0YmwuaDogY29udmVyc2lvbiBvZiBmdGFwZSdzIGZpbGUgbWFya3MgdG8gemZ0YXBlJ3MKKyAgICBpbnRlcm5hbCB2b2x1bWUgdGFibGUgd2FzIGJyb2tlbi4KKyAgKiBwYXRjaGVzLzIueC54L2xpbnV4LTIuMC4yMS5kaWY6IG15IFJDUyAocmVzcC4gQ1ZTKSBzeXN0ZW0gcmVwbGFjZWQKKyAgICB0aGUgYCRSZXZpc29uOicgZXRjLiBtYWNyb3MgaW4gdGhlIGBmdGFwZS5oJyBjb25jZXJuaW5nIHBhcnQgb2YgdGhlCisgICAgcGF0Y2ggOi0oIEZpeGVkLgorICAqIGluZm8vZnRhcGUuaW5mbzogRml4ZWQgbWlzc3BlbGxpbmdzIChgY3AnIDwtPiBgY3AgLXInIGV0Yy4pCisgICogd2hlbiBmdGFwZS9zZnRhcGUgb3IgZnRhcGUvemZ0YXBlIHdhcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwgdGhlCisgICAgdmFyaWFibGUgZnRhcGVfc3RhdHVzIHdhcyBkZWNsYXJlZCB0d2ljZS4gRml4ZWQuCisgICogcmVtb3ZlZCByZWZlcmVuY2UgdG8gdW5kZWNsYXJlZCB2YXJpYWJsZSBrZXJuZWxfdmVyc2lvbiB3aGVuIG5vdAorICAgIGNvbXBpbGluZyBhcyBtb2R1bGUKKyAgKiBmaXhlZCBhIGJ1ZyBpbnRyb2R1Y2VkIGJ5IHRoZSB1c2Ugb2YgYml0LWZpZWxkcyBmb3Igc29tZSBmbGFncworICAgIChpLmUuIHdyaXRlX3Byb3RlY3RlZCwgbm9fY2FydHJpZGdlLCBmb3JtYXR0ZWQpCisgICogZmxhZyBgaGVhZGVyX3JlYWQnIGlzIG5vdyByZXNldCBjb3JyZWN0bHkgdG8gemVybyB3aGVuIHRhcGUgaXMKKyAgICByZW1vdmVkLgorLSBmaXhlZCBhIGJ1ZyBpbiBzZnRhcGUvc2Z0YXBlLWVvZi5jIHRoYXQgd2FzIGFscmVhZHkgaW4gdGhlIG9yaWdpbmFsCisgIGZ0YXBlIGNvZGUuIE1URlNGL0JTRiB3YXMgbm90IGhhbmRsZWQgY29ycmVjdGx5IHdoZW4gcG9zaXRpb25lZAorICByaWdodCBiZWZvcmUgdGhlIGZpbGUgbWFyayAodGhpbmsgb2YgdGFyKQorLSBDaGFuZ2VkIFRSQUNFIG1hY3JvcyAoZm9sbG93aW5nIGEgc3VnZ2VzdGlvbiBvZiBNYXJjaW4gRGFsZWNraSkgdG8gdXNlCisgIHRoZSBwcmVkZWZpbmVkIF9fRlVOQ1RJT05fXyBtYWNybyBvZiBHQ0MuIFNwYXJlcyBhYm91dCA0ayBvZiBjb2RlLgorLSBhZGRlZCBuZXcgdmVuZG9yIGlkIGZvciBJb21lZ2EgRElUVE8gMkdJRworLSBmaXhlZCBhIGJ1ZyBhbHJlYWR5IHByZXNlbnQgaW4gemZ0YXBlLTEuMDYgd2hlbiBhYm9ydGluZyBhIHdyaXRlCisgIHdpdGggYSBzaWduYWw6IHdlIG5vdyBmaW5pc2ggdGhlIGN1cnJlbnQgdm9sdW1lIGF0IHRoYXQKKyAgcG9zaXRpb24uIEhlYWRlciBzZWdtZW50cyByZW1haW4gTk9UIHVwIHRvIGRhdGUgdW50aWwgYW4gZXhwbGljaXQgY2FsbAorICB0byBNVFJFVyBvciBNVE9GRkwgaXMgZG9uZS4gIAorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjAwLCAxNC8xMC85NiA9PT09PQorCistIE1lcmdlZCBmdGFwZSB3aXRoIHpmdGFwZS4gVGhlcmUgYXJlIHRocmVlIG1vZHVsZXMgbm93OgorICBmdGFwZSBmb3IgdGhlIGhhcmR3YXJlIHN1cHBvcnQsIHNmdGFwZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICBvcmlnaW5hbCBmdGFwZSBlb2YgbWFyayBzdHVmZiBhbmQgemZ0YXBlIHRoYXQgaW1wbGVtZW50cyB6ZnRhcGUncyB3YXkKKyAgb2YgaGFuZGxpbmcgdGhpbmdzIChjb21wcmVzc2lvbiwgdm9sdW1lIHRhYmxlLCB0YXBlIGJsb2NrcyBvZgorICBjb25zdGFudCBsZW5ndGgpCistIERvY3VtZW50YXRpb24gaW4gVGVYaW5mbyBmb3JtYXQgaW4gdGhlIGBpbmZvJyBzdWJkaXJlY3RvcnkuCistIE5ldyBpb2N0bHMgZm9yIHpmdGFwZS4gU2VlIHpmdGFwZS96ZnRhcGUuaAorLSBEdW1teSBmb3JtYXR0aW5nIGlvY3RsIGZvciBmdGFwZS4gU2VlIGZ0YXBlLmgKKy0gS2VybmVsIHBhdGNoIGZpbGVzIGZvciB0aGUgMi4qLiogc2VyaWVzIHRvIGluY2x1ZGUgZnRhcGUtMy4wMCBpbiB0aGUKKyAga2VybmVsIHNvdXJjZSB0cmVlLiBUaGVzZSBpbmNsdWRlcyBhIGtlcm5lbCBjb21wYXRpYmxlIENvbmZpZy5pbgorICBzY3JpcHQgYW5kIGZhaXJseSBsYXJnZSBvbmxpbmUgaW5mb3JtYXRpb24gZm9yIHRoZSBrZXJuZWwgY29uZmlndXJlCisgIHNjcmlwdC4KKy0gU3VwcG9ydCBmb3IgY29tcGlsaW5nIHdpdGggTGludXgtMS4yLjEzLiAKKy0gTW9kaWZpZWQgR05VIG10IGZyb20gdGhlaXIgY3BpbyBwYWNrYWdlIHRoYXQgY2FuIGhhbmRsZSB0aGUgbmV3CisgIGlvY3Rscy4KKy0gZnRhcGUvc2Z0YXBlL3pmdGFwZSBpcyBrZXJuZWxkIHNhdmUgbm93IQorCitOb3RlcyBvbiBzZnRhcGU6CistIHNmdGFwZSBpbXBsZW1lbnRzIHRoZSBlb2YgaGFuZGxpbmcgY29kZSBvZiB0aGUgb3JpZ2luYWwgZnRhcGUuIElmCisgIHlvdSBsaWtlIHRvIHN0aWNrIHdpdGggdGhlIG9yaWdpbmFsIGZ0YXBlIHN0dWZmLCB5b3UgaGF2ZSB0byB1c2UKKyAgdGhpcyBtb2R1bGUsIG5vdCB6ZnRhcGUuCistIHNmdGFwZSBpcyBrZXJuZWxkIHNhdmUsIHVubGlrZSB0aGUgb3JpZ2luYWwgZnRhcGUuCistIHdlIGtlZXAgdGhlIGVudGlyZSBoZWFkZXIgc2VnbWVudCBub3cgaW4gbWVtb3J5LCBzbyBubyBuZWVkIHRvIHJlYWQKKyAgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBoZWFkZXIgc2VnbWVudHMuIEFkZGl0aW9uYWwgbWVtb3J5CisgIGNvbnN1bXB0aW9uOiAyNTYgYnl0ZXMuIAorCitOb3RlcyBmb3IgemZ0YXBlOgorLSB6ZnRhcGUgaGFzIHN1cHBvcnQgZm9yIHRhcGVzIHdpdGggZm9ybWF0IGNvZGUgNiBub3csIHdoaWNoIHVzZSBhCisgIHNsaWdodGx5IGRpZmZlcmVudCB2b2x1bWUgdGFibGUgZm9ybWF0IGNvbXBhcmVkIHdpdGggb3RoZXIgZmxvcHB5CisgIHRhcGVzLgorLSBuZXcgaW9jdGxzIGZvciB6ZnRhcGUuIEhhdmUgYSBsb29rIGF0IHpmdGFwZS96ZnRhcGUuaAorLSBUaGUgaW50ZXJuYWwgdm9sdW1lIHRhYmxlIHJlcHJlc2VudGF0aW9uIGhhcyBjaGFuZ2VkIGZvciB6ZnRhcGUuIE9sZAorICBjYXJ0cmlkZ2VzIGFyZSBjb252ZXJ0ZWQgYXV0b21hdGljYWxseS4KKy0gemZ0YXBlIG5vIGxvbmdlciB1c2VzIGNvbXByZXNzaW9uIG1hcCBzZWdtZW50cywgd2hpY2ggaGF2ZSB2YW5pc2hlZAorICBmcm9tIHRoZSBRSUMgc3BlY3MsIGJ1dCBjcmVhdGVzIHZvbHVtZSB0YWJsZSBlbnRyeSB0aGF0IHJlc2VydmVzCisgIGVub3VnaCBzcGFjZSBmb3IgdGhlIGNvbXByZXNzaW9uIG1hcC4gCistIHpmdGFwZSBpcyBrZXJuZWxkIHNhdmUgbm93LgorLSB3ZSBrZWVwIHRoZSBlbnRpcmUgaGVhZGVyIHNlZ21lbnQgbm93IGluIG1lbW9yeSwgc28gbm8gbmVlZCB0byByZWFkCisgIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgaGVhZGVyIHNlZ21lbnRzLiBBZGRpdGlvbmFsIG1lbW9yeQorICBjb25zdW1wdGlvbjogMjU2IGJ5dGVzLiAKKworTm90ZXMgZm9yIGNvbnRyaWIvZ251bXQ6CistIG1vZGlmaWVkIG10IGZyb20gdGhlIEdOVSBjcGlvIHBhY2thZ2UgdGhhdCBzdXBwb3J0cyBhbGwgdGhlIG5ldworICBpb2N0bHMgb2YgemZ0YXBlLgorTm90ZXMgZm9yIGNvbnRyaWIvc3dhcG91dDoKKy0gVGhpcyBjb250YWlucyB0aGUgc3dhcG91dC5jIHByb2dyYW0gdGhhdCB3YXMgd3JpdHRlbiBieSBLYWkKKyAgSGFycmVraWxkZS1QZWRlcnNvbi4gSSBzaW1wbHkgYWRkZWQgYSBNYWtlZmlsZS4KKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4xMCwgMTQvMTAvOTYgPT09PT0KKworVGhlIGZ0YXBlIG1haW50YWluZXIgaGFzIGNoYW5nZWQuIAorS2FpIEhhcnJla2lsZGUtUGV0ZXJzZW4gPGtocEBkb2xwaGluaWNzLm5vPgoraGFzIHJlc2lnbmVkIGZyb20gbWFpbnRhaW5pbmcgZnRhcGUsIGFuZCBJLAorQ2xhdXMtSnVzdHVzIEhlaW5lIDxjbGF1c0Btb21vLm1hdGgucnd0aC1hYWNoZW4uZGU+LAoraGF2ZSB0YWtlbiBvdmVyLgorCistIEFkZGVkIHN1cHBvcnQgZm9yIHRhcGVzIHdpdGggYGZvcm1hdCBjb2RlIDYnLCBpLmUuIFFJQy0zMDIwIHRhcGVzCisgIHdpdGggbW9yZSB0aGFuIDJeMTYgc2VnbWVudHMuCistIG1lcmdlZCBjaGFuZ2VzIG1hZGUgYnkgQmFzIExhYXJob3ZlbiB3aXRoIGZ0YXBlLTIuMDkuIFJlZmVyCisgIHRvIGhpcyByZWxlYXNlIG5vdGVzIGJlbG93LiBJJ3ZlIGluY2x1ZGVkIHRoZW0gaW50byB0aGlzCisgIGZpbGUgdW5jaGFuZ2VkIGZvciB5b3VyIHJlZmVyZW5jZS4KKy0gZGlzYWJsZWQgY2FsbCBzdGFjayBiYWNrIHRyYWNlIGZvciBub3cuIFRoaXMgbmV3IGZlYXR1cmUKKyAgaW50cm9kdWNlZCBieSB0aGUgaW50ZXJpbSByZWxlYXNlIDIuMC54IHN0aWxsIHNlZW1zIHRvCisgIGJlIGJ1Z2d5LgorLSBUcmllZCB0byBtaW5pbWl6ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBmdGFwZSB2ZXJzaW9uCisgIHRvIGJlIGluY2x1ZGVkIGludG8gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZSBhbmQgdGhlIHN0YW5kYWxvbmUKKyAgbW9kdWxlIHZlcnNpb24uCistIFJlaW50cm9kdWNlZCBzdXBwb3J0IGZvciBMaW51eC0xLjIuMTMuIFBsZWFzZSByZWZlciB0byB0aGUKKyAgSW5zdGFsbC1ndWlkZS4gCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDksIDE2LzA2Lzk2ID09PT09CisKK1RoZXJlIGFyZW4ndCBhbnkgcmVhbGx5IGJpZyBuZXdzIGluIHRoaXMgcmVsZWFzZSwgbW9zdGx5IGp1c3QgdGhhdCBJCisodGhlIG1haW50YWluZXIpIGhhdmUgY2hhbmdlZCBteSBlbWFpbCBhZGRyZXNzIChkdWUgdG8gYSBuZXcgam9iKS4gIE15CituZXcgYWRkcmVzcyBpcyA8a2hwQGRvbHBoaW5pY3Mubm8+CisKKy0gVGhlIENMS180OE1IWiBhbmQgRkRDXzgyMDc4U0wgb3B0aW9ucyBoYXMgZ29uZSAoYWxsIDJNYnBzIGNhcmRzIHNlZW0KKyAgdG8gdXNlIGEgNDhNSHogb3NjaWxsYXRvciBhbnl3YXkgYW5kIEkgaGF2ZW4ndCBoZWFyZCBvZiBhbiAnU0wKKyAgY2hpcCBvdXQgdGhlcmUpLgorLSBUaGUgUzgyMDc4QiBoYXMgYmVlbiBgZG93bmdyYWRlZCcgdG8gaTgyMDc3QUEgY29tcGFiaWxpdHkuCistIFRFU1RJTkcgb3B0aW9uIHJldml2ZWQuICBSaWdodCBub3csIGl0J2xsIGVuYWJsZSB0aGUgKHNlcmlvdXNseSBicm9rZW4pCisgIDJNYnBzIGNvZGUuICBJZiB5b3UgZW5hYmxlIGl0LCB5b3UnbGwgZXhwZXJpZW5jZSBhIHRhcGUgZHJpdmUgdGhhdCdzCisgICpyZWFsbHkqIG91dCB0byBsdW5jaCEKKy0gU29tZSAoYm9sZCkgY2hhbmdlcyBpbiB0aGUgaW5pdCBjb2RlLiAgUGxlYXNlIG5vdGlmeSBtZSBpZiB0aGV5CisgIGJyZWFrIHRoaW5ncyBmb3IgeW91LgorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjA4LCAxNC8wMy85NiA9PT09PQorCitJZiB5b3UgY29ycmVjdCBhIHByb2JsZW0gd2l0aCBmdGFwZSwgcGxlYXNlIHNlbmQgeW91ciBwYXRjaCB0bwora2hwQGRvbHBoaW5pY3Mubm8gdG9vLgorCistIFVwZGF0ZWQgdG8gcmVmbGVjdCB0aGF0IE5SX01FTV9MSVNUUyBpcyBnb25lIGluIDEuMy43NAorLSBUZWFjIDcwMCBhZGRlZCB0byBsaXN0IG9mIGtub3duIGRyaXZlcy4KKy0gVGhlIHJlZ2lzdGVyZWQgZGV2aWNlIG5hbWUgaXMgbm93ICJmdCIgcmF0aGVyIHRoYW4gImZ0YXBlIi4KKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wN2EsIDE0LzAzLzk2ID09PT09CisKK0J1Z2ZpeGVzIGJ5IE1hcmNpbiBEYWxlY2tpIDxkYWxlY2tpQG5hbXUwMy5nd2RnLmRlPjoKKy0gSW4gdGhlIGxhc3QgcmVsZWFzZSBpdCBqdXN0IGNvbXBpbGVkIGFnYWluc3QgMS4zLjcwOworICBub3cgdGhlIHBhcmFtcyB0byByZXF1ZXN0X2lycSgpIGFuZCBmcmVlX2lycSBhcmUoKSBhcmUgZml4ZWQsIHNvIGl0IGFsc28gCisgIHdvcmtzIGluIDEuMy43MyA6LSkKKy0gU3VwcG9ydCBmb3IgbW9kdWxlcyBpcyBub3cgY29ycmVjdCBmb3IgbmV3ZXIga2VybmVscy4KKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wNywgMDQvMDMvOTYgPT09PT0KKworCistIGZ0YXBlIHVwZGF0ZWQgdG8gY29tcGlsZSBhZ2FpbnN0IDEuMy43MC4KKy0gSW9tZWdhIDcwMCBhbmQgV2FuZ3RlayAzMjAwIHJlY29nbmlzZWQuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wNmIsIDEzLzAyLzk2ID09PT09CisKK0Fub3RoZXIgc2ltcGxlIGJ1Z2ZpeCB2ZXJzaW9uLgorCistIEp1bWJvIDcwMCByZWNvZ25pc2VkLgorLSBUeXBvIGluIHZlbmRvcnMuaCBmaXhlZC4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjA2YSwgMTAvMDIvOTYgPT09PT0KKworVGhpcyByZWxlYXNlIGlzIGEgc2ltcGxlIGJ1Z2ZpeCB2ZXJzaW9uLgorCistIExpbnV4L1NNUDogZnRhcGUgKnNob3VsZCogd29yay4KKy0gRkMtMTAvMjA6IE9ubHkgYWNjZXB0cyBJUlFzIDMtNywgb3IgOS4gIElmIElSUSA5LCBwcm9wZXJseSB0ZWxsIHRoZSBjYXJkCisgIHRvIHVzZSBJUlEgMi4gIFRoYW5rcyB0byBHcmVnIENyaWRlciAoZ2NyaWRlckBpY2xuZXQub3JnKSBmb3IgZmluZGluZyBhbmQKKyAgbG9jYXRpbmcgdGhpcyBidWcgYW5kIHRlc3RpbmcgdGhlIHBhdGNoLgorLSBJbnNpZ2h0IGRyaXZlIHJlY29nbmlzZWQgY29ycmVjdGx5IGFnYWluLgorLSBNb3Rvci1vbiB3YWtldXAgdmVyc2lvbiBvZiB0aGUgSW9tZWdhIDI1MCBkcml2ZSBhZGRlZAorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDYsIDI4LzAxLzk2ID09PT09CisKK1NwZWNpYWwgdGhhbmtzIGdvIHRvIE5lYWwgRnJpZWRtYW4gYW5kIFN0ZXZlbiBTb3Jib20gZm9yIHRoZWlyCitoZWxwIGluIHByb2R1Y2luZyBhbmQgdGVzdGluZyB0aGlzIHJlbGVhc2UuCisKK0kgaGF2ZSBjb250aW51ZWQgdG8gY2xlYW4gdXAgdGhlIGNvZGUsIHdpdGggYW4gZXllIHRvd2FyZHMgaW5jbHVzaW9uCitvZiBmdGFwZSBpbiBMaW51cycgb2ZmaWNpYWwga2VybmVsIChJbiBmYWN0LCBhcyBJIHR5cGUgdGhpcywgSSBhbQorcnVubmluZyBvbiBhIGtlcm5lbCB3aXRoIGZ0YXBlIHN1cHBvcnQgc3RhdGljYWxseSBsaW5rZWQpLiAgSSBoYXZlCit0ZXN0LWNvbXBpbGVkIGZ0YXBlIGFnYWluc3QgbXkgMS4yLjEzIHRyZWUgd2l0aG91dCBwcm9ibGVtcy4KK0hvcGVmdWxseSwgZXZlcnl0aGluZyBzaG91bGQgYmUgT0sgZm9yIHRoZSB2MS4yLnggcGVvcGxlLgorCitXQVJOSU5HISBBbGFuIENveCBoYXMgbWFpbGVkIG1lIHRoYXQgZnRhcGUgZG9lcyAqTk9UKiB3b3JrIHdpdGgKK0xpbnV4L1NNUC4gIElmIHlvdSB0cnkgdG8gcnVuIGZ0YXBlIHVuZGVyIExpbnV4L1NNUCwgaXQgd2lsbCBjYXVzZSBhCitrZXJuZWwgZGVhZGxvY2sgKHdoaWNoIGlzIHdvcnNlIHRoYW4gYSBwYW5pYykuCisKKy0gUUlDLTMwMjAvVFItMzogMU1icHMgc3VwcG9ydCB3b3Jrcy4gIE5lYWwgaXMgY2FwYWJsZSBvZiByZWFkaW5nIGFuZAorICB3cml0aW5nIGRhdGEgdG8gYSB0YXBlLiAgZnRhcGUgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdHlwZSBvZgorICB0YXBlIChlLmcuIFRSLTMgdnMgUUlDLTgwKSBhbmQgbW92ZSB0aGUgZmRjIGluIGFuZCBvdXQgb2YKKyAgInBlcnBlbmRpY3VsYXIgbW9kZSIgYXMgbmVjZXNzYXJ5LgorLSAyTWJwcyBzdXBwb3J0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIHNpbmNlIGl0IGlzIG5vdCBmdWxseQorICBkZWJ1Z2dlZC4gIElmIHlvdSBhcmUgYWR2ZW50dXJvdXMsIHJlbW92ZSAtREZEQ184MjA3OFNMIGluIHRoZQorICBNYWtlZmlsZSBhbmQgc2VlIHdoYXQgaGFwcGVucyA6LSkKKy0gZmRjIGRldGVjdGlvbjogc2lsbHkgYnVncyByZW1vdmVkIChPbmx5IDJNYnBzIGZkY3Mgd2VyZSBhZmZlY3RlZCkKKyAgYW5kIGFkZGVkIGRldGVjdGlvbiBvZiB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcnMgUEM4NzQ0IGZkYyBjaGlwCisgICh1c2VkIGluIHRoZSBQQzg3M3h4ICJzdXBlci1JTyIgY2hpcHMpLgorLSBSZW1vdmVkIHdhcm5pbmcgYWJvdXQgaW5jb21wYXRpYmxlIHR5cGVzIHdoZW4gY29tcGlsaW5nIHdpdGggTGludXgKKyAgMS4yLnguCistIFJFQURNRS5QQ0kgdXBkYXRlZCB3aXRoIGluZm8gYWJvdXQgdGhlIERFTEwgRGltZW5zaW9uIFhQUyBQOTAuCistIENvbm5vciBUU1QzMjAwUiBhZGRlZCB0byBkZXRlY3RlZCBkcml2ZXMuCistIGBzd2Fwb3V0JyB1dGlsaXR5IGFkZGVkIHRvIGRpc3RyaWJ1dGlvbi4gIEl0IHdpbGwgZGlydHkgNU1lZyBvZgorICBtZW1vcnksIHRyeWluZyB0byBzd2FwIG91dCBvdGhlciBwcm9ncmFtcy4gIEp1c3Qgc2F5IGBtYWtlIHN3YXBvdXQnCisgIHRvIGJ1aWxkIGl0LiAgZnRhcGUgd2lsbCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkgUmVhbCBTb29uIE5vdyAoaWU6CisgIHdoZW4gSSBoYXZlIGZvdW5kIG91dCB3aGljaCBrZXJuZWwgbWVtb3J5IGFsbG9jIGZ1bmN0aW9uIHRvIGNhbGwpLgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDUsIDA4LzAxLzk2ID09PT09CisKKy0gRm9yIHYxLjIueCBLZXJuZWxzLCB5b3UgbXVzdCBhcHBseSB0aGUgcGF0Y2ggbGludXgtMS4yL2tzeW1zLnBhdGNoIHRvCisgIHRoZSBrZXJuZWwgYW5kIHJlYnVpbGQgaXQgKGl0IGFkZHMgdGhlIF9fZ2V0X2RtYV9wYWdlcyBzeW1ib2wgdG8KKyAga3N5bXMuYykuCistIEluY2x1ZGVkIG5ldyBhc20taTM4Ni9pby5oIGZpbGUgZnJvbSB2MS4zLngga2VybmVsIHNlcmllcywgdG8gZW5hYmxlCisgIGdjYyB2LjIuNy5bMTJdIHRvIGNvbXBpbGUgdjEuMi54IGtlcm5lbHMgKGxpbnV4LTEuMi9pby5oKS4KKy0gTW9kdWxlIHZlcnNpb25zOiBJZiB5b3Ugd2lzaCB0byBjb21waWxlIGZ0YXBlIGFzIGEgdmVyc2lvbmVkIG1vZHVsZSwKKyAgeW91IG11c3QgZmlyc3QgY29tcGlsZSB5b3VyIGtlcm5lbCB3aXRoIENPTkZJR19NT0RWRVJTSU9OUz15LgorICBPdGhlcndpc2UsIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgPGxpbnV4L21vZHZlcnNpb25zLmg+IGRvZXMgbm90CisgIGV4aXN0IChpZiB0aGF0IGhhcHBlbnMsIGEgYHRvdWNoIG1vZHZlcnNpb25zLmgnIHdpbGwgaGVscCB5b3Ugb3V0KS4KKy0gQ0xLXzQ4TUhaOiBuZXcgZGVmaW5lIGluIHRoZSBNYWtlZmlsZSAoZGVmYXVsdDogbm9uLXplcm8pLiAgSWYgeW91IGhhdmUKKyAgYSB0YXBlIGNvbnRyb2xsZXIgY2FyZCB0aGF0IHVzZXMgdGhlIGk4MjA3OCgtMSkgY2hpcCwgYnV0IGNhbm5vdCBnZXQKKyAgaXQgdG8gd29yayB3aXRoIGZ0YXBlLCB0cnkgc2V0IGl0IHRvIDAgKGFuZCBwbGVhc2UgcmVwb3J0IHRoaXMpLgorLSBRSUMtMzAxMC8zMDIwOiBDb21wbGV0ZSBzdXBwb3J0IGlzIHN0aWxsIG1pc3NpbmcsIGJ1dCB3aWxsIGhvcGVmdWxseQorICBjb21lIHNvb24uICBTdGV2ZW4gU29yYm9tIGhhcyBraW5kbHkgcHJvdmlkZWQgbWUgd2l0aCBoaW50cyBhYm91dAorICB0aGlzLiAgV3JpdGluZyBvZiBRSUMtMzAyMCB0YXBlcyBkZWZpbml0ZWx5IGRvZXMgTk9UIHdvcmsgKGRvIG5vdCB0cnkKKyAgaXQhIC0gdGhlIGRyaXZlIHdpbGwgbm90IGJlIGluICJwZXJwZW5kaWN1bGFyIG1vZGUiIGFuZCB0aGlzIHdpbGwgcnVpbgorICB0aGUgZm9ybWF0dGluZyBpbmZvIG9uIHRoZSB0YXBlKS4KKy0gZnRhcGVfbnVtX2J1ZmZlcnMgaXMgb3V0IG9mIGZhc2hpb246IHVzZSBOUl9CVUZGRVJTIGluc3RlYWQgKGFuZAorICByZWNvbXBpbGUgaWYgeW91IHdhbnQgdG8gY2hhbmdlIGl0IDotKS4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjA0LCAwMS8wMS85NiA9PT09PQorCitUaGlzIHZlcnNpb24gYnkgS2FpIEhhcnJla2lsZGUtUGV0ZXJzZW4gPGtocEBkb2xwaGluaWNzLm5vPgorCistIEFMRVJUISBTdXBwb3J0IGZvciBLZXJuZWxzIGVhcmxpZXIgdGhlbiB2MS4xLjg1IGlzIGFib3V0IHRvIGdvIGF3YXkuCisgIEkgaW50ZW5kIHRvIGNsZWFuIHVwIHNvbWUgb2YgdGhlIGNvZGUgKGdldHRpbmcgcmlkIG9mIGFuIGFubm95aW5nbHkKKyAgbGFyZ2UgbnVtYmVycyBvZiAjaWZkZWYgbW9zdGx5KSwgd2hpY2ggbWVhbnMgdGhhdCBzdXBwb3J0IGZvcgorICBwcmUtMS4xLjg1IGtlcm5lbHMgbXVzdCBnbyBhcyB3ZWxsLgorLSBOUl9GVEFQRV9CVUZGRVJTIGlzIGdvbmU7IFlvdSBjYW4gaW5zdGVhZCBzZWxlY3QgdGhlIG51bWJlciBvZiBkbWEKKyAgYnVmZmVycyBieSBzYXlpbmcgYGluc21vZCBmdGFwZS5vIGZ0YXBlX251bV9idWZmZXI9PG4+JyBpbnN0ZWFkLgorLSBDb25maWd1cmUgc2NyaXB0IGdvbmUuICBmdGFwZSB3aWxsIG5vdyBhdXRvbWFnaWNhbGx5IGRldGVybWluZSB5b3VyCisgIGtlcm5lbCB2ZXJzaW9uIGJ5IC91c3IvaW5jbHVkZS9saW51eC92ZXJzaW9uLmggaW5zdGVhZC4KKy0gQ09ORklHX01PRFZFUlNJT05TIG5vdyB3b3JrLiAgQWxsIGNvbWJpbmF0aW9ucyBvZiB2ZXJzaW9uZWQgLworICB1bnZlcnNpb25lZCBrZXJuZWwgYW5kIGZ0YXBlIG1vZHVsZSB3b3JrcyAoYXQgbGVhc3Qgd2l0aCBteSAxLjMuNTIKKyAga2VybmVsKS4KKy0gSWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCBpbnNlcnRpbmcgZnRhcGUgaW50byBhbiBvbGQgKDEuMi54KQorICBrZXJuZWwgKGUuZy4gaW5zbW9kIHNheXMgIjEuMi44IGRvZXMgbm90IG1hdGNoIDEuMi44KSwgcmVjb21waWxlCisgIHlvdXIgbW9kdWxlcyB1dGlsaXRpZXMgd2l0aCB5b3VyIG5ldyBjb21waWxlci4KKy0gUmV2ZWFsIFRCMTQwMCBkcml2ZSBhZGRlZCB0byB2ZW5kb3JzLmgKKy0gU3VwcG9ydCBmb3IgdGhlIGk4MjA3OC0xICgyTWJwcykgY2hpcCBpcyBjb21pbmcgYWxvbmcuICBUaGUKKyAgYmlnZ2VzdCBwcm9ibGVtIGlzIHRoYXQgSSBkb24ndCBoYXZlIHN1Y2ggYSBjYXJkLCB3aGljaCBtYWtlcworICB0ZXN0aW5nIC8gZGVidWdnaW5nIHNvbWV3aGF0IHByb2JsZW1hdGljLiAgVGhlIHNlY29uZCBiaWdnZXN0CisgIHByb2JsZW0gaXMgdGhhdCBJIGRvIG5vdCBoYXZlIHRoZSBRSUMtMzAxMC8zMDIwIHN0YW5kYXJkcyBlaXRoZXIuCisgIFN0YXR1cyByaWdodCBub3cgaXMgdGhhdCB0aGUgY2hpcCBpcyBkZXRlY3RlZCwgYW5kIGl0IHNob3VsZCBiZQorICBwb3NzaWJsZSB0byBwdXQgaXQgaW50byAyTWJwcyBtb2RlLiAgSG93ZXZlciwgSSBkbyBub3Qga25vdyB3aGF0CisgICJleHRyYXMiIGFyZSBuZWVkZWQgdG8gY29tcGxldGUgdGhlIHN1cHBvcnQuICBBbHRob3VnaCBwdXR0aW5nIHRoZQorICBpODIwNzggaW50byAxTWJwcyBtb2RlIG91Z2h0IHRvIHdvcmsgb3V0IG9mIHRoZSBib3gsIGl0IGRvZXNuJ3QKKyAgKHJpZ2h0IG5vdywgZnRhcGUgY29tcGxhaW5zIGFib3V0IGlkIGFtIGVycm9ycykuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wNGJldGE1LCAyOS8xMi85NSA9PT09PQorCitCYXMgb2ZmbGluZSBsaW51eC10YXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGb3IgcmVhc29ucyBvbmx5IGtub3duIHRvIHRoZSBtYWpvcmRvbW8gbWFpbCBsaXN0IHByb2Nlc3NvciwgQmFzIHdhcwora2lja2VkIG9mZiB0aGUgbGludXgtdGFwZSBsaXN0IHNvbWV0aW1lIGR1cmluZyB0aGUgc3VtbWVyLiAgQmVpbmcKK292ZXJ3b3JrZWQgYXQgaGlzIGZvci1wYXkgam9iLCBoZSBkaWRuJ3Qgbm90aWNlIGl0IG11Y2guICBJbnN0ZWFkIEkKKyhLYWksIGtocEBkb2xwaGluaWNzLm5vKSBoYXMgd29ya2VkIG9uIGZ0YXBlIHRvIHByb2R1Y2UgdGhlIDIuMDQoYmV0YSkKK3ZlcnNpb24uCisKK3pmdGFwZQorLS0tLS0tCitOb3RlIHRoYXQgdGhlcmUgZXhpc3RzIGEgbXVjaCBpbXByb3ZlZCB2ZXJzaW9uIG9mIGZ0YXBlLCB3cml0dGVuIGJ5CitDbGF1cy1KdXN0dXMgSGVpbmUgPGNsYXVzQHdpbGxpLm1hdGgucnd0aC1hYWNoZW4uZGU+IHdoaWNoIGlzIG5hbWVkCit6ZnRhcGUsIHdoaWNoIGNvbmZvcm1zIHRvIHRoZSBRSUMtODAgc3BlY3Mgb24gaG93IHRvIG1hcmsgYmFja3VwcywgYW5kCitpcyBjYXBhYmxlIG9mIGRvaW5nIGF1dG9tYXRpYyBjb21wcmVzc2lvbi4gIEhvd2V2ZXIsIHpmdGFwZSBtYWtlcworc3Vic3RhbnRpYWwgY2hhbmdlcyB0byBmdGFwZSwgYW5kIEkgKEthaSkgaGF2ZSB0aGVyZWZvcmUgZGVjbGluZWQgdG8KK2ludGVncmF0ZSB6ZnRhcGUgaW50byBmdGFwZS4gIEhvcGVmdWxseSwgdGhpcyB3aWxsIGhhcHBlbiBzb29uLgorCitDT05GSUdfUUlDMTE3IHJlbW92ZWQgZnJvbSB0aGUga2VybmVsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgYmlnZ2VzdCBjaGFuZ2Ugb2YgYWxsIGlzIHRoYXQgZnRhcGUgbm93IHdpbGwgYWxsb2NhdGUgaXRzIGRtYQorYnVmZmVycyB3aGVuIGl0IGlzIGluc2VydGVkLiAgVGhlIG1lYW5zIHRoYXQgdGhlIENPTkZJR19RSUMxMTcgb3B0aW9uCitoYXMgZGlzYXBwZWFyZWQgZnJvbSB0aGUgTGludXgga2VybmVsIGFzIG9mIHYxLjMuMzQuICBJZiB5b3UgaGF2ZSBhbgorZWFybGllciBrZXJuZWwsIHNpbXBseSBhbnN3ZXIgJ25vJyB0byB0aGUgcXVlc3Rpb24gd2lsbCBkbyB0aGUgdHJpY2sKKyhpZiB5b3UgZ2V0IGNvbXBsYWlucyBhYm91dCBfX2dldF9mcmVlX3BhZ2VzKCkgbWlzc2luZywgY29udGFjdCB0aGUKK2xpbnV4LXRhcGUgbWFpbGluZyBsaXN0KS4KKworTm90ZSB0aGF0IGZ0YXBlLTIuMDRiZXRhIHdpbGwgd29yayBlcXVhbGx5IHdlbGwgb24ga2VybmVscyB3aXRoIGFuZAord2l0aG91dCBgZnRhcGUgc3VwcG9ydCcuICBUaGUgb25seSBjYXRjaCBpcywgdGhhdCB5b3Ugd2lsbCB3YXN0ZQorYXJvdW5kIDk2LTEyOEtiIG9mIHByZWNpb3VzIERNQSdhYmxlIG1lbW9yeSBvbiBhIGJveCB0aGF0IGhhcyBmdGFwZQorc3VwcG9ydCBjb21waWxlZCBpbi4KKworTm93IGZvciB0aGUgcmVhbCBjaGFuZ2VzOgorCistIEZDLTIwIGNhbiBub3cgdXNlIERNQSBjaGFubmVscyAxLCAyLCBhbmQgMy4gVGhhbmtzIHRvIERhbmllbAorICBDb2hlbiwgY2F0bWFuQHdwaS5lZHUuCistIGZ0YXBlIG5vIGxvbmdlciByZXF1aXJlcyBhIChnaWdhbnRpYykgOTZLYiBidWZmZXIgdG8gYmUgc3RhdGljYWxseQorICBhbGxvY2F0ZWQgYnkgdGhlIGtlcm5lbC4KKy0gQWRkZWQgbmV3IElvbWVnYSBkcml2ZSAoODg4MikgdG8gdmVuZG9ycy5oCistIC1mbm8tc3RyZW5ndGgtcmVkdWNlIGFkZGVkIHRvIE1ha2VmaWxlLCBzaW5jZSBHQ0MgaXMgYnJva2VuLgorLSBpODIwNzgtMSAoMk1icHMpIEZEQyBzdXBwb3J0IHN0YXJ0ZWQuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wM2IsIDI3LzA1Lzk1ID09PT09CisKKy0gUHJldmVudGVkIHZlcmlmeV9hcmVhIHRvIHJldHVybiBlcnJvciBpZiBjYWxsZWQgd2l0aCB6ZXJvIGxlbmd0aC4KKy0gRml4ZWQgYSBidWcgaW4gZmx1c2hfYnVmZmVycyB0aGF0IGNhdXNlZCB0b28gbXVjaCBwYWRkaW5nIHRvIGJlCisgIHdyaXR0ZW4gd2hlbiBhIGZpbmFsIHNlZ21lbnQgaGFkIGJhZCBzZWN0b3JzLgorLSBJbmNyZWFzZWQgbWF4aW11bSBmYXN0LXNlZWsgb3ZlcnNob290IHZhbHVlIGZyb20gNSB0byAxMCBzZWdtZW50cy4KKy0gQnJlYWtpbmcgbG9vcCBhZnRlciA1IHJldHJpZXMgd2hlbiBwb3NpdGlvbmluZyBmYWlscy4KKy0gRml4ZWQgd3JvbmcgY2FsY3VsYXRpb24gb2YgdGFwZSBsZW5ndGggZm9yIFFJQy0zMDEwIGFuZCBRSUMtMzAyMAorICB0YXBlcyAoZGVuc2l0aWVzIHdlcmUgc3dhcHBlZCkuCistIEZpeGVkIHdyb25nIGNhbGN1bGF0aW9uIG9mIG92ZXJzaG9vdCBvbiBzZWVrX2ZvcndhcmQ6IFdyb25nIHNpZ24KKyAgb2YgZXJyb3IuCistIFN1cHByZXNzIChmYWxzZSkgZXJyb3IgbWVzc2FnZSBkdWUgdG8gbmV3IHRhcGUgbG9hZGVkLgorLSBBZGRlZCB0d28gbmV3IENNUyBkcml2ZXMgKDExYzMgYW5kIDExYzUpIHRvIHZlbmRvcnMuaC4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAzYSwgMDkvMDUvOTUgPT09PT0KKworLSBGaXhlZCBkaXNwbGF5IG9mIG9sZCBlcnJvciAoZXZlbiBpZiBhbHJlYWR5IGNsZWFyZWQpIGluIGZ0YXBlX29wZW4uCistIEltcHJvdmVkIHRhcGUgbGVuZ3RoIGRldGVjdGlvbiwgaW9jdGxzIHdvdWxkIGZhaWwgZm9yIDQyNSBmdCB0YXBlcy4KKyAgVW50aWwgdGhlIHRhcGUgbGVuZ3RoIGlzIGNhbGN1bGF0ZWQgd2l0aCBkYXRhIGZyb20gdGhlIGhlYWRlcgorICBzZWdtZW50LCB3ZSdsbCB1c2Ugd29yc3QtY2FzZSB2YWx1ZXMuCistIENsZWFyIGVvZl9tYXJrIGFmdGVyIHJld2luZGluZyBpb2N0bHMuCistIEZpeGVkIHdyb25nIHZlcnNpb24gbWVzc2FnZSAoMi4wMyBoYWQgMi4wMmcgaWQpLgorLSBGaXhlZCBidWcgdGhhdCBjYXVzZWQgdGhlIGZkYyB0byBiZSByZXNldCB2ZXJ5IGZyZXF1ZW50bHkuCisgIFRoaXMgc2hvdWxkbid0IGFmZmVjdCBub3JtYWwgb3BlcmF0aW9uIGJ1dCB0aGUgdGltaW5nIG9mIHRoZQorICByZXBvcnQgcm91dGluZXMgaGFzIGNoYW5nZWQgYWdhaW4gYW5kIHRoYXQgbWF5IGNhdXNlIHByb2JsZW1zLgorICBXZSdsbCBqdXN0IGhhdmUgdG8gZmluZCBvdXQuLi4uCistIEltcGxlbWVudGVkIGNvcnJlY3Qgd3JpdGUgcHJlY29tcGVuc2F0aW9uIHNldHRpbmcgZm9yIFFJQy0zMDEwLzMwMjAuCistIENsZWFuZWQgdXAgZmRjX2ludGVycnVwdF93YWl0IHJvdXRpbmUuIEhvcGUgaXQgc3RpbGwgd29ya3MgOi0pCistIEZpbmFsbHkgcmVtb3ZlZCAoYWxyZWFkeSBkaXNhYmxlZCkgc3BlY2lhbCBlb2YgbWFyayBoYW5kbGluZyBmb3IKKyAgZ251IHRhci4KKy0gQ2hhbmdlZCBvcmRlciBvZiBnZXRfZG1hX3Jlc2lkdWUgYW5kIGRpc2FibGVfZG1hIGluIGZkYy1pc3IuYworICBiZWNhdXNlIHRoZSBjdXJyZW50IG9yZGVyIHdvdWxkIGZhaWwgb24gYXQgbGVhc3Qgb25lIHN5c3RlbS4KKyAgV2UncmUgYmFjayB0byB0aGUgb3JpZ2luYWwgb3JkZXIgYWdhaW4sIGhvcGUgKGFuZCBleHBlY3QpIHRoaXMKKyAgZG9lc24ndCBicmVhayBhbnkgb3RoZXIgc3lzdGVtLgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDMsIDA3LzA1Lzk1ID09PT09CisKKyhDaGFuZ2VzIHJlZmVyIHRvIHRoZSBmaXJzdCBmdGFwZS0yLjAyIHJlbGVhc2UpCisKK1N1cHBvcnQgZm9yIHdpZGUgYW5kIGV4dGVuZGVkIGxlbmd0aCB0YXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgQ29ubmVyIFRTTSA0MjAgYW5kIDg1MCBkcml2ZXMgYXJlIHJlcG9ydGVkIHRvIGJlIHdvcmtpbmcuCitJIGhhdmVuJ3QgcmVjZWl2ZWQgYW55IHJlcG9ydHMgYWJvdXQgb3RoZXIgYnJhbmRzOyB0aGUgVFNNIDQyMAorYW5kIDg1MCBzZWVtIHRvIGJlIHRoZSBtb3N0IHdpZGVseSB1c2VkIHdpZGUgZHJpdmVzLgorRXh0ZW5kZWQgbGVuZ3RoIHRhcGVzICg0MjUgZnQpIHdpdGggbm9ybWFsIFFJQy04MCBkcml2ZXMKK2FyZSBvcGVyYXRpbmcgdG9vIChBdCBsZWFzdCBJJ3ZlIGhhZCBubyByZXBvcnRzIHN0YXRpbmcgb3RoZXJ3aXNlKS4KK19Ob3RfIHlldCBjb21wbGV0ZWx5IHN1cHBvcnRlZCAoYWx0aG91Z2ggdGhleSBtYXkgd29yaykgYXJlCitRSUMtMzAyMCBkcml2ZXMgYW5kIDIgTWJwcyBmbG9wcHkgZGlzayBjb250cm9sbGVycyB3b24ndCB3b3JrIGF0Cit0aGUgaGlnaGVzdCBzcGVlZC4KK0lmIHNvbWVvbmUgaXMga2luZCBlbm91Z2ggdG8gc2VuZCBtZSBvbmUgb2YgdGhlc2UsIEknbGwgaW5jbHVkZQorc3VwcG9ydCBmb3IgaXQgdG9vIDstKQorCitFYXNpZXIgY29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1Byb2JsZW1zIGR1ZSB0byB3cm9uZyBzZXR0aW5ncyBpbiB0aGUgTWFrZWZpbGUgYXJlIHByZXZlbnRlZAorYnkgdXNpbmcgYSBjb25maWd1cmF0aW9uIHNjcmlwdCB0aGF0IHNldHMgdGhlIG5lY2Vzc2FyeSAoa2VybmVsCit2ZXJzaW9uIGRlcGVuZGVudCkgY29tcGlsZSB0aW1lIG9wdGlvbnMuCitUaGlzIGtlcm5lbCB2ZXJzaW9uIGlzIG5vdyBkZXRlcm1pbmVkIGZyb20gdGhlIHNvdXJjZXMgZm91bmQKK2F0IC91c3Ivc3JjL2xpbnV4LCBvciBpZiBub3QgZm91bmQsIHRoZSBvbGQgd2F5IHVzaW5nCisvcHJvYy92ZXJzaW9uLgorVmVyc2lvbmVkIG1vZHVsZXMgd2lsbCBiZSB1c2VkIGF1dG9tYXRpY2FsbHkgd2hlbiBzdXBwb3J0ZWQKK2J5LSBhbmQgY29uZmlndXJlZCBpbi0gdGhlIGtlcm5lbC4KK05vdGUgdGhhdCB0aGUgY3VycmVudCBtb2R1bGVzIGNvZGUgKDEuMS44NykgaXMgc3RpbGwgYnJva2VuCithbmQgX25lZWRzXyB0aGUgZml4IGluY2x1ZGVkIGluIHRoZSBpbnNtb2QgZGlyZWN0b3J5LgorUGxlYXNlIGRvbid0IHNlbmQgbWUgYW55IG1vcmUgT29wcyByZXBvcnRzIGNhdXNlZCBieSBpbnNtb2QgOi0oCisKK1JlZHVjZWQgbW9kdWxlIHNpemUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBzdGFuZGFyZCBtb2R1bGUgc2l6ZSBpcyBtdWNoIHJlZHVjZWQgYW5kIHNvbWUgY29tcGlsZSB0aW1lCitvcHRpb25zIGNhbiBldmVuIHJlZHVjZSBpdCBmdXJ0aGVyLiAoSSBkb24ndCByZWNvbW1lbmQgdGhpcworZm9yIG5vcm1hbCB1c2UgYnV0IGl0IGNhbiBiZSBoYW5keSBmb3IgcmVzY3VlIGRpc2tldHRlcykKKworT3B0aW9uOiAgICAgICAgICAgQXBwcm94LiBtb2R1bGUgc2l6ZToKKworPHN0YW5kYXJkPiAgICAgICAgICAgICAxNTAgS2IKK05PX1RSQUNFICAgICAgICAgICAgICAgMTI1IEtiCitOT19UUkFDRV9BVF9BTEwgICAgICAgICA2NyBLYgorCisKK011Y2ggaW1wcm92ZWQgZHJpdmVyIGludGVycnVwdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNb3N0IHBvc3NpYmxlIGxvb3BzIGhhdmUgYmVlbiBicm9rZW4gYW5kIHNpZ25hbCBkZXRlY3Rpb24KK2hhcyBiZWVuIGltcHJvdmVkLgorSW4gbW9zdCBjYXNlcyB0aGUgZHJpdmVyIGNhbiBiZSBhYm9ydGVkIGJ5IF5DIChTSUdJTlQpIGFuZAorU0lHS0lMTCAoa2lsbCAtOSkgd2lsbCBnZW5lcmF0ZSBiZSBhIHN1cmUga2lsbC4KKyhOb3RlIHRoYXQgYWJvcnRpbmcgYSB0YXBlIG9wZXJhdGlvbiBtYXkgZGFtYWdlIHRoZSBsYXN0CitkYXRhIHdyaXR0ZW4gdG8gdGFwZSkKKworSW1wcm92ZWQgZXJyb3IgcmVjb3ZlcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGdGFwZSBub3cgcmV0dXJucyBhbiBlcnJvciAoRU5PREFUQSkgdG8gdGhlIGFwcGxpY2F0aW9uIGlmCithIHNlZ21lbnQgcHJvdmVzIHRvIGJlIHVucmVjb3ZlcmFibGUgYW5kIHRoZW4gc2tpcHMgdGhlCitiYWQgc2VnbWVudC4KK1RoaXMgY2F1c2VzIG1vc3QgYXBwbGljYXRpb25zIHRvIGNvbnRpbnVlIHRvIHdvcmsgKHRhcgorYW5kIGFmaW8pIGxvb3Npbmcgb25seSBhIHNtYWxsIGFtb3VudCAodXAgdG8gMjkgS2IpIG9mIGRhdGEuCitSZXRyaWVkIHJlYWQgb3BlcmF0aW9ucyB3aWxsIG5vdyBiZSBkb25lIHNsaWdodGx5IG9mZi10cmFjawordG8gaW1wcm92ZSB0aGUgY2hhbmNlIG9mIHN1Y2Nlc3MuIFNlcmlvdXMgaGVhZCBvZmYtdHJhY2sKK2Vycm9ycyB3aWxsIGJlIGRldGVjdGVkLgorCitGQy0xMCBhbmQgRkMtMjAgY29udHJvbGxlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRnRhcGUgbm93IHN1cHBvcnRzIGJvdGggdGhlIG9sZCBDTVMgRkMtMTAgYW5kIHRoZSBuZXdlciBGQy0yMAorY29udHJvbGxlcnMuCitCZWNhdXNlIHRoZSBvcGVyYXRpb24gb2YgdGhlc2UgY2FyZHMgaXMgc3RpbGwgdW5kb2N1bWVudGVkLAordGh1cyBmYXIgdGhleSB3aWxsIG9ubHkgd29yayB3aXRoIHRoZSBkZWZhdWx0IHNldHRpbmdzIChTZWUKK01ha2VmaWxlKS4gQW55IGZlZWQtYmFjayBvbiBob3cgdG8gdXNlIHRoZW0gd2l0aCBvdGhlciBzZXR0aW5ncword2lsbCBiZSB3ZWxjb21lICEKK0NvbXBpbGF0aW9uIHdpbGwgZmFpbCBpZiBvbmUgY2hhbmdlcyB0aGUgc2V0dGluZ3MgdG8gaWxsZWdhbAordmFsdWVzLgorCitLZXJuZWxzIGFuZCBjb21waWxlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRnRhcGUgaXMgY3VycmVudGx5IGJlaW5nIGRldmVsb3BlZCB1c2luZyB0aGUgMi41LjggY29tcGlsZXIuCitUaGUgb2xkZXIgMi40LjUgcHJvYmFibHkgd29ya3MgdG9vIChTZXQgb3B0aW9uIGluIE1ha2VmaWxlISkuCitJIGhhdmUgbm8gZXhwZXJpZW5jZSB3aXRoIGFueSBsYXRlciBjb21waWxlcnMgbm9yIEVsZiBzdXBwb3J0LgorQW55IGluZm9ybWF0aW9uIG9uIHRoaXMgaXMgd2VsY29tZS4KK1RoZSBsYXRlc3Qga2VybmVsIEkgaGF2ZSB0ZXN0ZWQgZnRhcGUgd2l0aCBpcyAxLjIuNi4KKworQ29tcHJlc3Npb24KKy0tLS0tLS0tLS0tCitBbiBpbXByZXNzaXZlIGNvbGxlY3Rpb24gb2YgY2hhbmdlcyBmb3IgZnRhcGUgaW5jbHVkaW5nCitvbi10aGUtZmx5IGNvbXByZXNzaW9uIGlzIHN0aWxsIGx5aW5nIG9uIG15IGRlc2suCitJZiAyLjAzIHByb3ZlcyB0byBiZSByZWxpYWJsZSBJIG1pZ2h0IHN0YXJ0IGludGVncmF0aW5nIHRoZXNlCitidXQgYXMgdXN1YWwsIEknbSBzaG9ydCBpbiB0aW1lIDotKAorCitGb3JtYXR0aW5nCistLS0tLS0tLS0tCitUaGVyZSBpcyBzdGlsbCBubyB3YXkgdG8gZm9ybWF0IHRhcGVzIHVuZGVyIExpbnV4LiBBcyBmYXIgYXMKK0kga25vdyBhbGwgYXR0ZW1wdHMgdG8gd3JpdGUgc3VjaCBhIHByb2dyYW0gaGF2ZSBkaWVkIG5vdy4KK1NpbmNlIGZvcm1hdHRlZCB0YXBlcyBhcmUgcmF0aGVyIGNvbW1vbiBub3csIEkgdGhpbmsgYWxsIHdlCituZWVkIGlzIGEgdXRpbGl0eSB0aGF0IHdyaXRlcyBhIHdvcnN0IGNhc2UgcGF0dGVybiBhbmQgdmVyaWZpZXMKK3RoYXQgd2l0aCB0aGUgZHJpdmUgcHV0IGluIHZlcmlmeSBtb2RlLCByZWR1Y2luZyBtYXJnaW5zLgorQW55IHRha2VycyA/CisKK0Z1cnRoZXJtb3JlCistLS0tLS0tLS0tLQorQ2xlYW5lZCB1cCBtZXNzYWdlcy4KK1ByZXBhcmVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgdGFwZSBkcml2ZXMgb24gb25lIGZkYy4KK1RoYW5rcyB0byBhbGwgdGhlIHBlb3BsZSB3aG8gc2VudCBidWcgcmVwb3J0cyBhbmQgaGVscGVkIG1lCitpbXByb3ZlIHRoZSBkcml2ZXIuIFdpdGhvdXQgdHJ5aW5nIHRvIGJlIGNvbXBsZXRlIEknbGwgbWVudGlvbgorR2FyeSBBbmRlcnNvbiAod2l0aG91dCBoaXMgYWNjdXJhdGUgcmVwb3J0cyBhbmQgdW5yZWxpYWJsZQoraGFyZHdhcmUgdGhlcmUgd291bGRuJ3QgYmUgYSAyLjAzKSwgU3RlZmFuIEtuZWlmZWwgKEZDLTIwKSwKK1JvYmVydCBCcm91Z2h0b24gKEZDLTIwLCB5b3Ugd2VyZSBhbG1vc3QgdGhlcmUgOy0pLCBCam9ybgorRWt3YWxsIChmb3IgdGhlIHZlcnNpb25lZCBtb2R1bGVzIGFuZCBidWdneSBpbnNtb2QgOy0pLCBQZXRlcgorRm94LCBDaHJpc3RvcGhlciBPbGl2ZXIsIFJhbHBoIFdoaXR0YWtlciBhbmQgbm90IHRoZSBsZWFzdAorTGludXMgVG9ydmFsZHMgKGZvciBMaW51eCBhbmQga2VlcGluZyBtZSBidXN5IGJlY2F1c2Ugb2YKK2NoYW5nZXMgdG8gdGhlIGtlcm5lbCA7LSkKK1RoYW5rcyB0byBhbnlvbmUgSSBmb3Jnb3QsIGZvciB0aGUgYnVnIHJlcG9ydHMsIHRoZSBmdGFwZQorYmFzaGluZyBhbmQgdGhlIG1lbnRhbCBzdXBwb3J0Li4uCisKKworVGhhdCdzIGl0IGZvciBub3cuIEhhdmUgRnVuLAorCitCYXMuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmcsIDA2LzA1Lzk1ID09PT09CisKKy0gQWRkZWQgZXh0cmEgdGVzdCB0byBicmVhayByZWFkLWlkIGxvb3Agd2l0aCBzaWduYWwuCistIENoYW5nZWQgcmV3aW5kIGNvZGUgdG8gaGFuZGxlIG5lZ2F0aXZlIG92ZXJzaG9vdCBmb3IgZHJpdmVzCisgIHRoYXQgdGFrZSB2ZXJ5IGxvbmcgdG8gc3RhcnQgb3Igc3RvcC4KKy0gTGV0IHVzZSBvZiBnZXQvc2V0IGkvby1yZWdpb25zIGRlcGVuZCBvbiBrZXJuZWwgdmVyc2lvbi4KKy0gQ2hhbmdlZCBjb2RlIHRvIHVzZSBhIG1vcmUgZ2VuZXJhbCB0ZXN0IGZvciBjb25kaXRpb25hbAorICBjb21waWxhdGlvbnMgZGVwZW5kaW5nIG9uIGtlcm5lbCB2ZXJzaW9uLgorLSBJbXByb3ZlZCBtaWNyby1zdGVwIGZ1bmN0aW9uYWxpdHkgdG8gZ28gb2ZmLXRyYWNrIG9ubHkKKyAgd2hpbGUgcmVhZGluZyAoaWQgJiBkYXRhKS4KKy0gQWRkZWQgZmFpbHVyZSBvbiB0YXBlLW5vdC1yZWZlcmVuY2VkIGJpdCBpbiBmdGFwZV9jb21tYW5kLgorLSBBZGRlZCBGT1JFVkVSIG9wdGlvbiB0byByZWFkLXdhaXQgcm91dGluZS4KKy0gQ2hhbmdlZCByZWFkLWlkIHRvIHVzZSBzaG9ydGVyIHRpbWVvdXQgY2F1c2luZyBzbWFsbGVyCisgIHJld2luZHMgb24gdGltZW91dC4KKy0gTWFkZSBrZXJuZWwtaW50ZXJmYWNlIGZ1bmN0aW9ucyBzdGF0aWMuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmYsIDAzLzA1Lzk1ID09PT09CisKKy0gQWRkZWQgc3VwcG9ydCBmb3IgZHVhbCB0YXBlIGRyaXZlcyBvbiBteSBzeXN0ZW0sIGV4dGVuZGVkIENvbmZpZ3VyZQorICBzY3JpcHQgdG8gZGV0ZWN0IGhvc3QgJ2RvZG8nLgorLSBMb2cgbWVkaWEgZGVmZWN0IGluIGhpc3RvcnkgaWYgZWNjIGZhaWxlZCBhbmQgbm8gZGF0YSB3YXMgcmV0dXJuZWQuCistIEZpeGVkIENvbmZpZ3VyZSBzY3JpcHQgdGhhdCB3YXMgZmFpbGluZyBmb3Iga2VybmVsIHZlcnNpb25zIHdpdGgKKyAgZG91YmxlIGRpZ2l0IHZlcnNpb24gb3IgcmV2aXNpb24gbnVtYmVycy4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAyZSwgMDEvMDUvOTUgPT09PT0KKworLSBGaXhlZCByZXBvc2l0aW9uIGxvb3AgYXQgbG9naWNhbCBlb3QgKGZhaWxpbmcgcmVhZF9pZCkuCistIEZpeGVkIDM0IHNlZ21lbnQgb2Zmc2V0IHdoZW4gcmV3aW5kaW5nLgorLSBBZGRlZCBmYXN0IHNlZWsgY2FwYWJpbGl0eSBmb3IgbW9yZSB0aGFuIDI1NSBzZWdtZW50cy4KKy0gRml4ZWQgd3JvbmcgYnVzeSByZXN1bHQgZnJvbSBmdGFwZV9jb21tYW5kIGNhdXNpbmcgcmV2ZXJzZQorICBzZWVrIHRvIGZhaWwuCistIEFkZGVkIGJyZWFrb3V0IGZyb20gaW5maW5pdGUgcmV3aW5kIGxvb3AgKGlmIHNvbWV0aGluZyBmYWlscykuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmQsIDMwLzA0Lzk1ID09PT09CisKKy0gSW1wcm92ZWQgYWJvcnRpb24gb24gc2lnbmFsczogSW50ZXJydXB0IHdpbGwgbWFrZSBhIGdyYWNlZnVsCisgIGV4aXQsIEtpbGwgd2lsbCBiZSBsZXNzIG5pY2UgYW5kIHNob3VsZCBiZSB1c2VkIGlmIGV2ZXJ5dGhpbmcKKyAgZWxzZSBmYWlscy4KKy0gSW5jbHVkZWQgY2hlY2sgZm9yIHRhcGUtaGVhZCBvZmYgdHJhY2suCistIEltcGxlbWVudGVkIGV4aXQgZnJvbSB0YXBlLXN0YXJ0IGxvb3AuCistIEFkZGVkIGtlcm5lbCBpby1wb3J0IHJlZ2lzdHJhdGlvbi4KKy0gSW1wbGVtZW50ZWQgc2tpcCBvZiBmYWlsaW5nIHNlZ21lbnQgKEVOT0RBVEEpIG9uIGVjYyBmYWlsdXJlLgorICBUaGlzIGFsbG93cyBhZmlvIGFuZCB0YXIgdG8gY29udGludWUgd2hlbiB0aGUgdGFwZSBpcyBkYW1hZ2VkLgorLSBNYWRlIGRpc3RpbmN0aW9uIGJldHdlZW4gZHJpdmUgbmFtZXMgd2l0aCBkaWZmZXJlbnQgY29kZXMuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmMsIDIyLzA0Lzk1ID09PT09CisKKy0gRml4ZWQgdG9vIHRpZ2h0IGNvbW1hbmQgcXVldWVpbmcgYWZ0ZXIgdGFwZSBzdG9wL3BhdXNlIGNvbW1hbmQKKyAgaXNzdWVkIGZyb20gd2l0aGluIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKFNob3dlZCBhcyB0aW1lb3V0CisgIG9uIEFja25vd2xlZGdlIGVycm9ycyBkdXJpbmcgcmV0cmllcyBvbiBzb21lIHN5c3RlbXMpCistIFRyaWVkIHRvIGZpeCB0aW1lb3V0cyB3aGVuIHVzaW5nIDQyNSBmdCB0YXBlIGJlY2F1c2UgdGhlIGV4dGVuZGVkCisgIGxlbmd0aCBkb2Vzbid0IHNlZW0gdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlIGhhcmR3YXJlLgorICBXZSBub3cgdXNlIHRoZSBmb3JtYXQgY29kZSBmcm9tIHRoZSBoZWFkZXIgc2VnbWVudCBzbyBhZGp1c3QgdGhlCisgIHRpbWluZyBhZnRlciByZWFkaW5nIHRoZSBoZWFkZXIgc2VnbWVudC4KKy0gRml4ZWQgc29tZSBtZXNzYWdlcyBzdGF0aW5nICd1bmV4cGVjdGVkIHNvbWV0aGluZy4uLicgYmVpbmcgbm90CisgIHVuZXhwZWN0ZWQgYW55bW9yZS4KKy0gU3RhcnRlZCBwcmVwYXJhdGlvbnMgZm9yIG1lcmdlIG9mIGR5bmFtaWMgYnVmZmVyIGFsbG9jYXRpb24gYW5kCisgIGNvbXByZXNzaW9uIGNvZGUuCistIENoYW5nZWQgc29tZSBkZWJ1ZyBtZXNzYWdlcyB0byBpbmNsdWRlIHJlbGV2YW50IHNlZ21lbnQgaW5mb3JtYXRpb24KKyAgYXQgbGV2ZWwgNC4KKy0gSW5jbHVkZWQgZWFybHkgYmFpbC1vdXQgd2hlbiBkcml2ZSBvZmZsaW5lLCBwcmV2ZW50aW5nIGEgbG90IG9mCisgIGZhbHNlIG1lc3NhZ2VzLgorLSBNb3ZlZCBmdGFwZV9wYXJhbWV0ZXJfeHh4KCkgb2Zmc2V0cyBpbnRvIGZ1bmN0aW9uIGluc3RlYWQgb2YgaW4gY2FsbHMuCistIFJlbW92ZWQgJ3dlaXJkLCBkcml2ZSBidXN5IGJ1dCBubyBkYXRhJyBlcnJvciB3aGVuIGNhdXNlZCBieQorICBhbiBlcnJvciBkdXJpbmcgYSByZWFkLWlkLgorLSBJbXByb3ZlZCAndGltZW91dCBvbiBhY2tub3dsZWRnZScgZGlhZ25vc3RpY3MuCistIE1vdmVkIE1PRFVMRSBvcHRpb24gaW50byBDb25maWd1cmUuCistIFJlZHVjZWQgY29kZSBzaXplIHdoZW4gbm8gdHJhY2luZyBhdCBhbGwgd2FzIHNldCAoQ2xhdXMgSGVpbmUpLgorLSBObyBsb25nZXIgbG9nIGVycm9yIGNvZGUgMCAobm8gZXJyb3IpIGFzIGFuIGVycm9yLgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDJiLCAwOS8wNC85NSA9PT09PQorCistIFJlbGF4ZWQgdGltaW5nIGZvciBzdGF0dXMgb3BlcmF0aW9uIGFuZCBkaXNwbGF5aW5nCisgIGFibm9ybWFsIHJlc3VsdHMuIEhvcGVmdWxseSB0aGlzIHNob3dzIHdoYXQncyBnb2luZworICB3cm9uZyB3aXRoIHRoZSBDb25uZXIgVFNNODUwUiBkcml2ZXMuCistIENyZWF0ZWQgc2NyaXB0IGZvciBjb25maWd1cmF0aW9uLCB1c2luZyB2ZXJzaW9uIG51bWJlcgorICBvZiBrZXJuZWwgc291cmNlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIC9wcm9jL3ZlcnNpb24uCistIEZpeGVkIGNvbmRpdGlvbmFscyBpbiBrZXJuZWwtaW50ZXJmYWNlLmMuCistIFJlbW92ZWQgdW5hdm9pZGFibGUgVFJBQ0Ugb3V0cHV0LgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDJhLCAwMS8wNC85NSA9PT09PQorCistIEltcGxlbWVudGVkIGBuZXctc3R5bGUnICh2ZXJzaW9uZWQpIG1vZHVsZXMgc3VwcG9ydCBmb3IgbmV3CisgIGtlcm5lbHMuCistIFJlZHVjZWQgc2l6ZSBvZiBtb2R1bGUgYnkgbW92aW5nIHN0YXRpYyBkYXRhIHRvIGJzcy4KKy0gTm93IHVzaW5nIHZlcnNpb24gbnVtYmVyIG9mIGtlcm5lbCBzb3VyY2UgaW5zdGVhZCBvZiBydW5uaW5nCisgIGtlcm5lbCBmb3Iga2VybmVsIHZlcnNpb25zID49IDEuMS44MgorLSBBZGRlZCBmZWVkYmFjayBvbiBkcml2ZSBzcGVlZHMgdG8gdmVuZG9yIGluZm9ybWF0aW9uLgorLSBJbmNsdWRlZCBmaXhlZCBpbnNtb2Qgc291cmNlcyB0byBkaXN0cmlidXRpb24gKExldCdzIGhvcGUKKyAgdGhlIG1vZHVsZXMgZGlzdHJpYnV0aW9uIGdldCBmaXhlZCBzb29uIDotLykuCisKK05vdGUgdGhhdCBJIGhhdmVuJ3QgeWV0IGltcGxlbWVudGVkIGFueSBvZiB0aGUgY29kZSBleHRlbnNpb24gSQorcmVjZWl2ZWQuIEkgaG9wZSB0byBmaW5kIHNvbWUgdGltZSB0byBkbyB0aGlzIHNvb24uCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMiwgMTUvMDEvOTUgPT09PT0KKworCistIEZpeGVkIGZhaWxpbmcgcmVwb3NpdGlvbmluZyB3aGVuIG92ZXJzaG9vdCB3YXMgaW5jcmVtZW50ZWQuCistIEZpeGVkIHJhdGUgc2VsZWN0aW9uOiBCZWNhdXNlIG9mIGEgZGVmaWNpZW5jeSBpbiB0aGUgUUlDLTExNworICBzcGVjaWZpY2F0aW9uIG9uZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIG5vdCBpbXBsZW1lbnRlZAorICBhbmQgYSBmYWlsaW5nIGNvbW1hbmQuIFRoZXJlZm9yIHdlIG5vdyB0cnkgdG8gZmluZCBvdXQgaWYgdGhlCisgIGRyaXZlIGRvZXMgc3VwcG9ydCB0aGlzIGNvbW1hbmQgYmVmb3JlIHVzYWdlLgorLSBGaXhlZCBlcnJvciByZXRyeSB1c2luZyB3cm9uZyBvZmZzZXQgaW4gZmRjLWlzci4KKy0gSW1wcm92ZWQgcmV0cnkgY29kZSB0byByZXRyeSBvbmx5IG9uY2Ugb24gYSBzaW5nbGUgbm8tZGF0YQorICBlcnJvciBpbiBhIHNlZ21lbnQuCistIFZhbGlkYXRlIHNlY3RvciBudW1iZXIgZXh0cmFjdGVkIGZyb20gZW9mIG1hcmsgYmVjYXVzZSBhbgorICBpbnZhbGlkIGZpbGUgbWFyayAoZHVlIHRvID8/PykgY291bGQgY2F1c2Uga2VybmVsIHBhbmljLgorLSBTcGxpdCBmdGFwZS1pby5jIGludG8gZnRhcGUtaW8uYyBhbmQgZnRhcGUtY3RsLmMgZmlsZXMuCistIENvcnJlY3RlZCB0b28gaGlnaCBtZWRpYSBlcnJvciBjb3VudCBhZnRlciB3cml0aW5nIHRvCisgIGEgYmFkIHRhcGUuCistIEFkZGVkICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPiBhZ2FpbiBiZWNhdXNlIG9sZCBrZXJuZWwgdmVyc2lvbnMKKyAgbmVlZCBpdC4KKy0gRml4ZWQgZmRjIG5vdCBiZWluZyBkaXNhYmxlZCB3aGVuIG9wZW4gZmFpbGVkIGJlY2F1c2Ugbm8gdGFwZQorICBkcml2ZSB3YXMgZm91bmQuCistIEZpeGVkIHByb2JsZW0gd2l0aCBzb2Z0IGVycm9yIGluIHNlY3RvciAzMiAoc2hpZnQgb3BlcmF0b3Igd2l0aAorICBzaGlmdGNvdW50IDMyIGlzIG5vdCBkZWZpbmVkKS4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAxLCAwOC8wMS85NSA9PT09PQorCisKKy0gUmVtb3ZlZCBURVNUSU5HIHNldHRpbmcgZnJvbSBkaXN0cmlidXRlZCBNYWtlZmlsZS4KKy0gRml4ZWQgYG10IGFzZicgZmFpbHVyZTogUmV3aW5kIHdhcyBkZWZlcnJlZCB0byBjbG9zZSB3aGljaAorICBvdmVycnVsZWQgdGhlIGZzZiBpb2N0bC4KKy0gUHJldmVudGVkIG5vbi1pbnRlcnJ1cHRpYmxlIGNvbW1hbmRzIGJlaW5nIGludGVycnVwdGVkLgorLSBBZGRlZCBtaXNzaW5nIHRpbWVvdXQucGF1c2Ugc2V0dGluZy4KKy0gTWF4aW11bSB0YXBlIHNwZWVkIHJlYWQgZnJvbSBkcml2ZSB0eXBlIGluZm9ybWF0aW9uIHRhYmxlLgorICBJZiB0aGUgaW5mb3JtYXRpb24gaXMgbm90IGluIHRoZSB0YWJsZSAoMCkgdGhlIGRyaXZlIHdpbGwKKyAgZGV0ZXJtaW5lIHRoZSBzcGVlZCBpdHNlbGYgYW5kIHB1dCBhIG1lc3NhZ2UgaW4gdGhlIGxvZ2ZpbGUuCisgIFRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIHRoZW4gYmUgYWRkZWQgdG8gdGhlIHRhYmxlIGluIHRoZQorICB2ZW5kb3JzLmggZmlsZSAoYW5kIHJlcG9ydGVkIHRvIG1lKS4KKy0gQWRkZWQgY2FsbCB0byBmdGFwZV9pbml0X2RyaXZlIGFmdGVyIHNvZnQgcmVzZXQgZm9yIHRob3NlCisgIChhbnRpcXVlKSBkcml2ZXMgdGhhdCBkb24ndCBkbyBhbiBpbXBsaWNpdCBzZWVrX2xvYWRfcG9pbnQKKyAgYWZ0ZXIgYSByZXNldCBvciBwb3dlciB1cC4KKy0gRG9uJ3QgdHJ5IHRvIHNldCBkYXRhIHJhdGUgaWYgcmVzZXQgZmFpbGVkLgorLSBQcmV2ZW50IHVwZGF0ZSBvZiBzZWVrIHZhcmlhYmxlcyB3aGVuIHN0YXJ0aW5nIGZyb20gdGhlCisgIGJlZ2lubmluZyBvciB0aGUgZW5kIG9mIHRoZSB0YXBlLgorLSBGaXhlZCB3cm9uZyBhZGp1c3RtZW50IG9mIG92ZXJzaG9vdCBpbiBzZWVrX2ZvcndhcmQoKS4KKy0gQWRkZWQgc3luYyB0byBNYWtlZmlsZSAoYWdhaW4pLgorLSBBZGRlZCBjb2RlIHRvIGRpYWdub3NlIHRpbWVyIHByb2JsZW1zIChjYWxpYnIuYykuCistIFJlcGxhY2VkIHRpbWUgZGlmZmVyZW5jZXMgYnkgdGltZWRpZmYgY2FsbHMuCistIFJlbW92ZWQgcmVmZXJlbmNlIHRvIGRvX2Zsb3BweSBmcm9tIG9iamVjdCBmb3IgcmVjZW50IGtlcm5lbHMuCistIEZpeGVkIHdyb25nIGRpc3BsYXkgb2YgJ2ZhaWxpbmcgZG1hIGNvbnRyb2xsZXInIG1lc3NhZ2UuCistIFJlbW92ZWQgdmFyaW91cyBubyBsb25nZXIgdXNlZCAjaW5jbHVkZSBzdGF0ZW1lbnRzLgorLSBBZGRlZCBtYXguIHRhcGUgc3BlZWQgdmFsdWUgdG8gdmVuZG9yLXN0cnVjdC4KKy0gQ2hhbmdlZCBmdGFwZS1jb21tYW5kIHRvIGNoZWNrIHByZS1jb25kaXRpb25zIGFuZCB3YWl0CisgIGlmIG5lZWRlZC4KKy0gRnVydGhlciB1cGRhdGVkIHFpYzExNy5oIHRvIHJldiBHLgorLSBDb21iaW5lZCBjb21tYW5kIG5hbWUgdGFibGUgYW5kIHJlc3RyaWN0aW9ucyB0YWJsZSB0byBvbmUuCisgIEV4dGVuZGVkIHRoaXMgdGFibGUgd2l0aCBzb21lIG5ldyBmaWVsZHMuCistIEluY3JlYXNlZCB0aW1lb3V0IG9uIEFjayB0aW1lciB2YWx1ZSBhbmQgaW5jbHVkZWQgY29kZSB0bworICByZXBvcnQgb3V0IG9mIHNwZWMgYmVoYXZpb3VyLgorLSBJbmNyZWFzZWQgcmV3aW5kIHRpbWVvdXQgbWFyZ2luIHRvIGNhbGN1bGF0ZWQgKyAyMCUuCistIEltcHJvdmVkIGRhdGEgcmF0ZSBzZWxlY3Rpb24gc28gaXQgd29uJ3QgZmFpbCBvbiBzb21lCisgIG9sZGVyIChwcmUgc3RhbmRhcmQpIGRyaXZlcy4KKy0gQ2hhbmdlZCBpbml0aWFsaXNhdGlvbiBjb2RlIHNvIGRyaXZlIHdpbGwgYmUgcmV3b3VuZCBpZiB0aGUKKyAgZHJpdmVyIGlzIHJlbG9hZGVkIGFuZCB0aGUgdGFwZSBpcyBub3QgYXQgYm90LgorLSBNb3ZlZCBzb21lIG9mIHRoZSBmbHVzaCBvcGVyYXRpb25zIGZyb20gY2xvc2UgdG8gdGhlIGlvY3Rscy4KKy0gQWRkZWQgZXhpdCBjb2RlIHZhbHVlIHRvIGZhaWxpbmcgdmVyaWZ5IGFyZWEgbWVzc2FnZS4KKy0gTG9vcCB1bnRpbCB0YXBlIGhhbHRlZCBpbiBzbWFydC1zdG9wLgorLSBGYXN0IHNlZWsgaGFuZGxlZCBzcGVjaWFsbHkgaWYgbG9jYXRlZCBhdCBib3Qgb3IgZW90LgorLSBCZWluZyBtb3JlIGNvbnNlcnZhdGl2ZSBvbiBvdmVyc2hvb3QgdmFsdWUuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMCwgMzEvMTIvOTQgPT09PT0KKworICBUaGUgSW5zdGFsbC1ndWlkZSBpcyBjb21wbGV0ZWx5IHJld3JpdHRlbiBhbmQgbm93IGFsc28gaW5jbHVkZXMKK3NvbWUgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSB0aGUgZHJpdmVyLiBJZiB5b3UncmUgZWl0aGVyIG5ldwordG8gZnRhcGUgb3IgbmV3IHRvIFVuaXggdGFwZSBkZXZpY2VzIG1ha2Ugc3VyZSB0byByZWFkIGl0ICEKKworICBJZiB5b3Ugb3duIGEgcGNpIHN5c3RlbSBhbmQgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aXRoIHRoZQorZnRhcGUgZHJpdmVyIG1ha2Ugc3VyZSB0byByZWFkIHRoZSBSRUFETUUuUENJIGZpbGUuIEl0IGNvbnRhaW5zCitzb21lIGhpbnRzIG9uIGhvdyB0byBmaXggeW91ciBoYXJkd2FyZS4KKworICBGb3IgYW55Ym9keSB3aG8gaGFzbid0IG5vdGljZWQ6IFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKK2RyaXZlciBoYXMgYmVlbiBpbmNyZW1lbnRlZCAoVGhlIGxhdGVzdCByZWxlYXNlZCB2ZXJzaW9uIGhhcworYmVlbiB2ZXJzaW9uIDEuMTRkKS4KKyAgVGhpcyBoYXMgYmVlbiBkb25lIGZvciB0d28gbWFqb3IgcmVhc29uczoKKworICBvICBBIG5ldyAoYmV0dGVyKSBlcnJvciByZWNvdmVyeSBzY2hlbWUgaXMgaW1wbGVtZW50ZWQuCisgIG8gIFN1cHBvcnQgZm9yIG5ldyBkcml2ZSB0eXBlcyBoYXMgYmVlbiBhZGRlZC4KKworICBBbGwgdGhlc2UgaW1wcm92ZW1lbnRzL2NoYW5nZXMgd2lsbCBwcm9iYWJseSBpbmNsdWRlIGEgY291cGxlCitvZiBuZXcgKGFuZCBvbGQ/KSBidWdzLiBJZiB5b3UgZW5jb3VudGVyIGFueSBwcm9ibGVtcyB0aGF0IHlvdSB0aGluaworSSdtIG5vdCB5ZXQgYXdhcmUgb2YsIGZlZWwgZnJlZSB0byBzZW5kIGEgcmVwb3J0IHRvIDxiYXNAdmltZWMubmw+LgorICBJIHJlY29tbWVuZCBrZWVwaW5nIGEgdmVyc2lvbiBvZiBmdGFwZS0xLjE0ZCBhdmFpbGFibGUsIGp1c3QKK2luIGNhc2UgOy0pCisKKyAgVGhpcyB2ZXJzaW9uIHNob3VsZCB3b3JrIHdpdGggYWxsIGtlcm5lbCB2ZXJzaW9ucyBmcm9tIDEuMC45IHVwCit0byAxLjEuNzIgKGFuZCBwcm9iYWJseSBlYXJsaWVyIGFuZCBsYXRlciB2ZXJzaW9ucyB0b28pLgorCisKK01ham9yIG5ldyBmZWF0dXJlczoKKworLSBCZXR0ZXIgaGFuZGxpbmcgb2YgdGFwZXMgd2l0aCBkZWZlY3RzOiBXaGVuIGEgc2VjdG9yIHJlcGVhdGVkbHkKKyAgKFNPRlRfUkVUUklFUyBpbiBmdGFwZS5oKSBjYW5ub3QgYmUgd3JpdHRlbiB0byBvciByZWFkIGZyb20gaXQgaXMKKyAgbWFya2VkIGFzIGFuIGhhcmQgZXJyb3IgYW5kIGdldHMgc2tpcHBlZC4KKyAgVGhlIGVycm9yIGNvcnJlY3Rpb24gY29kZSBjYW4gaGFuZGxlIHVwIHRvIHRocmVlIG9mIHRoZXNlIGhhcmQKKyAgZXJyb3JzIHByb3ZpZGVkIHRoZXJlIGFyZSBubyBvdGhlciBlcnJvcnMgaW4gdGhhdCBzZWdtZW50ICgzMiBLYikuCisgIAorLSBBbGxvd3Mgd3JpdGluZyB0byB0YXBlcyB3aXRoIGRlZmVjdHMgKGFsdGhvdWdoIHRoZSByaXNrIG9mIGxvb3NpbmcKKyAgZGF0YSBpbmNyZWFzZXMgISkKKyAgTG9vayBmb3IgdGhlIG1lZGlhLWRlZmVjdHMgZW50cnkgcHJpbnRlZCB3aXRoIHRoZSBzdGF0aXN0aWNzIHdoZW4KKyAgdGhlIHRhcGUgaXMgY2xvc2VkLiBBIG5vbi16ZXJvIHZhbHVlIGhlcmUgc2hvd3MgYSBiYWQgdGFwZS4KKyAgW3RoZSBhY3R1YWwgY291bnQgaXMgd3JvbmcgKHRvbyBoaWdoKSwgdGhpcyBpcyBhIGtub3duIGJ1Z10uCisKKy0gVXNlIG9mIGJhY2t1cCBoZWFkZXIgc2VnbWVudCBpZiBmaXJzdCBvbmUgaXMgZmFpbGluZy4KKworLSBTdXBwb3J0IGZvciBleHRlbmRlZCBsZW5ndGggdGFwZXMgd2l0aCBRSUMtODA6IGJvdGggNDI1IGFuZCAxMTAwIGZ0LgorICAwLjI1IGluY2ggdGFwZXMgYXJlIG5vdyByZWNvZ25pemVkIGFuZCBoYW5kbGVkLgorCistIFN1cHBvcnQgZm9yIG5ldyBRSUMtODAgZHJpdmVzIHdpdGggOCBtbSBgd2lkZScgdGFwZXMgKGUuZy4gQ29ubmVyCisgIFRTTSA0MjApLgorCistIFN1cHBvcnQgZm9yIG5ldyBRSUMtMzAxMCBhbmQgUUlDLTMwMjAgZHJpdmVzIChleHBlcmltZW50YWwpIHdpdGgKKyAgYm90aCAwLjI1IGluY2ggYW5kIDggbW0gdGFwZXMuCisKK1NvbWUgbWlub3IgZmVhdHVyZXMgd2VyZSBhZGRlZCwgYSBjb3VwbGUgb2Ygc21hbGwgYnVncyB3ZXJlIGZpeGVkIGFuZAorcHJvYmFibHkgc29tZSBuZXcgb25lcyBpbnRyb2R1Y2VkIDstKS4KKworW2xzZWVrKCkgZGlkbid0IG1ha2UgaXQgaW50byB0aGlzIHZlcnNpb25dCisKK0hhdmUgZnVuLAorCitCYXMuCistLS0tCisgTG9jYWxXb3JkczogIGZ0YXBlIE1DT05GSUcgbXQgVkZTIHpmdGFwZSByZXNwIHNmdGFwZSBwcm9jIHN1YmRpciBNVElPQ1ZPTElORk8KKyBMb2NhbFdvcmRzOiAgTVRJT0NHRVRTSVpFIEJPVCBFT0QgTVRCU0YgemZ0IGtlcm5lbGQgbW9kcHJvYmUga2R0aW1lIGNvbnRyaWIgVFIKKyBMb2NhbFdvcmRzOiAgTVRTRVRCTEsgYWZpbyB1bmluc3RhbGwgdGV4aSB3d3cgRUlPIFFJQyBpbml0IHNmdCBlb2YgYWthIGRtYSBHQgorIExvY2FsV29yZHM6ICBTSUdLSUxMIE1USU9DRlRDTUQgbW1hcCBJb21lZ2EgRkRDIGZkYyBpbyBnbnVtdCBtdGlvIGZjIGFzbSBpbmIKKyBMb2NhbFdvcmRzOiAgb3V0YiBmdCBxaWMgZnJvbnRlbmQgVGVYaW5mbyBpcnEgbWFjaCBNT0RWRVJTSU9OUyBDT05GSUcgaHRtbCBkdmkKKyBMb2NhbFdvcmRzOiAgdXNyIGRvYyBTTVAgTWIgRHVubm8gRklYTUUgdnRibGMgcGVybCBsaXN0dGFwZSB2b2xpbmZvIGZzZiBNVFdFT0YKKyBMb2NhbFdvcmRzOiAgYW1hbmRhIGRlZ2F1c3NlZCBDb21CeXRlIERvdWJsZVBsYXkgd2hyYXZlbiBuamFja24gY29tIE1USU9DIHZ0YmwKKyBMb2NhbFdvcmRzOiAgR0VUQkxLU1ogTUFLRURFViB6ZnRhcGUncyBsaW51eCBkaWYgQ1ZTIFJldmlzb24gY3AgTVRSRVcgTVRPRkZMCisgTG9jYWxXb3JkczogIE1URlNGIEJTRiBNYXJjaW4gRGFsZWNraSBHQ0MgQ29uZmlnIGNwaW8gc3dhcG91dCBLYWkgSGFycmVraWxkZQorIExvY2FsV29yZHM6ICBQZWRlcnNvbiBraHAgZG9scGhpbmljcyBKdXN0dXMgY2xhdXMgbW9tbyByd3RoIGFhY2hlbiBMYWFyaG92ZW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiZDZjNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL01ha2VmaWxlCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorIworIyAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvY29tcHJlc3Nvci9NYWtlZmlsZSx2ICQKKyMgJFJldmlzaW9uOiAxLjEgJAorIyAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxMjoyOCAkCisjCisjICAgICAgTWFrZWZpbGUgZm9yIHRoZSBvcHRpb25hbCBjb21wcmVzc29yIGZvciB0aCB6ZnRhcGUgVkZTCisjICAgICAgaW50ZXJmYWNlIHRvIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciBmb3IKKyMgICAgICBMaW51eC4KKyMKKworb2JqLSQoQ09ORklHX1pGVF9DT01QUkVTU09SKSArPSB6ZnQtY29tcHJlc3Nvci5vCisKK3pmdC1jb21wcmVzc29yLW9ianMgOj0gemZ0YXBlLWNvbXByZXNzLm8gbHpydzMubworCitDRkxBR1NfbHpydzMubwk6PSAtTzYgLWZ1bnJvbGwtYWxsLWxvb3BzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci9senJ3My5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDMyYTBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuYwpAQCAtMCwwICsxLDc0MyBAQAorLyoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9jb21wcmVzc29yL2x6cnczLmMsdiAkCisgKiAkUmV2aXNpb246IDEuMSAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxMjoyOSAkCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgUm9zcyBXaWxsaWFtcyBsenJ3MyBhbGdvcml0aG0uIEFkYXB0aW9uIGZvciB6ZnRhcGUuCisgKgorICovCisKKyNpbmNsdWRlICIuLi9jb21wcmVzc29yL2x6cnczLmgiICAgICAgIC8qIERlZmluZXMgc2luZ2xlIGV4cG9ydGVkIGZ1bmN0aW9uICJjb21wcmVzcyIuICAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExaUlczLkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXV0aG9yICA6IFJvc3MgV2lsbGlhbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERhdGUgICAgOiAzMC1KdW4tMTk5MS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZWxlYXNlIDogMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmaWxlIGNvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBMWlJXMyBkYXRhIGNvbXByZXNzaW9uICAgICAgICAgKi8KKy8qIGFsZ29yaXRobSBpbiBDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIGFsZ29yaXRobSBpcyBhIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gdGhhdCBydW5zIGZhc3QgICAgKi8KKy8qIGFuZCBnaXZlcyByZWFzb25hYmxlIGNvbXByZXNzaW9uLiBUaGUgYWxnb3JpdGhtIGlzIGEgbWVtYmVyIG9mIHRoZSBMZW1wZWwgICovCisvKiBaaXYgZmFtaWx5IG9mIGFsZ29yaXRobXMgYW5kIGJhc2VzIGl0cyBjb21wcmVzc2lvbiBvbiB0aGUgcHJlc2VuY2UgaW4gdGhlICAqLworLyogZGF0YSBvZiByZXBlYXRlZCBzdWJzdHJpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGFsZ29yaXRobSBpcyB1bnBhdGVudGVkIGFuZCB0aGUgY29kZSBpcyBwdWJsaWMgZG9tYWluLiBBcyB0aGUgICAgICAgICAqLworLyogYWxnb3JpdGhtIGlzIGJhc2VkIG9uIHRoZSBMWjc3IGNsYXNzIG9mIGFsZ29yaXRobXMsIGl0IGlzIHVubGlrZWx5IHRvIGJlICAgKi8KKy8qIHRoZSBzdWJqZWN0IG9mIGEgcGF0ZW50IGNoYWxsZW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5saWtlIHRoZSBMWlJXMSBhbmQgTFpSVzEtQSBhbGdvcml0aG1zLCB0aGUgTFpSVzMgYWxnb3JpdGhtIGlzICAgICAgICAgICAgKi8KKy8qIGRldGVybWluaXN0aWMgYW5kIGlzIGd1YXJhbnRlZWQgdG8geWllbGQgdGhlIHNhbWUgY29tcHJlc3NlZCAgICAgICAgICAgICAgICovCisvKiByZXByZXNlbnRhdGlvbiBmb3IgYSBnaXZlbiBmaWxlIGVhY2ggdGltZSBpdCBpcyBydW4uICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBMWlJXMyBhbGdvcml0aG0gd2FzIG9yaWdpbmFsbHkgZGVzaWduZWQgYW5kIGltcGxlbWVudGVkICAgICAgICAgICAgICAgICovCisvKiBieSBSb3NzIFdpbGxpYW1zIG9uIDMxLURlYy0xOTkwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhlcmUgYXJlIHRoZSByZXN1bHRzIG9mIGFwcGx5aW5nIHRoaXMgY29kZSwgY29tcGlsZWQgdW5kZXIgVEhJTksgQyA0LjAgICAgICovCisvKiBhbmQgcnVubmluZyBvbiBhIE1hYy1TRSAoOE1IeiA2ODAwMCksIHRvIHRoZSBzdGFuZGFyZCBjYWxnYXJ5IGNvcnB1cy4gICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICovCisvKiAgICB8IERBVEEgQ09NUFJFU1NJT04gVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAqLworLyogICAgfCA9PT09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgKi8KKy8qICAgIHwgVGltZSBvZiBydW4gICAgIDogU3VuIDMwLUp1bi0xOTkxIDA5OjMxUE0gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICovCisvKiAgICB8IFRpbWluZyBhY2N1cmFjeSA6IE9uZSBwYXJ0IGluIDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAqLworLyogICAgfCBDb250ZXh0IGxlbmd0aCAgOiAyNjIxNDQgYnl0ZXMgKD0gMjU2LjAwMDBLKSAgICAgICAgICAgICAgICAgICB8ICAgICAgKi8KKy8qICAgIHwgVGVzdCBzdWl0ZSAgICAgIDogQ2FsZ2FyeSBDb3JwdXMgU3VpdGUgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICovCisvKiAgICB8IEZpbGVzIGluIHN1aXRlICA6IDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAqLworLyogICAgfCBBbGdvcml0aG0gICAgICAgOiBMWlJXMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgKi8KKy8qICAgIHwgTm90ZTogQWxsIGF2ZXJhZ2VzIGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIHVuLXJvdW5kZWQgdmFsdWVzLiAgfCAgICAgICovCisvKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAqLworLyogICAgfCBGaWxlIE5hbWUgICBMZW5ndGggIEN4QiAgQ29tTGVuICAlUmVtbiAgQml0cyAgQ29tIEsvcyAgRGVjIEsvcyB8ICAgICAgKi8KKy8qICAgIHwgLS0tLS0tLS0tLSAgLS0tLS0tICAtLS0gIC0tLS0tLSAgLS0tLS0gIC0tLS0gIC0tLS0tLS0gIC0tLS0tLS0gfCAgICAgICovCisvKiAgICB8IHJwdXM6QmliLkQgIDExMTI2MSAgICAxICAgNTUwMzMgICA0OS41ICAzLjk2ICAgIDE5LjQ2ICAgIDMyLjI3IHwgICAgICAqLworLyogICAgfCB1czpCb29rMS5EICA3Njg3NzEgICAgMyAgNDY3OTYyICAgNjAuOSAgNC44NyAgICAxNy4wMyAgICAzMS4wNyB8ICAgICAgKi8KKy8qICAgIHwgdXM6Qm9vazIuRCAgNjEwODU2ICAgIDMgIDMxNzEwMiAgIDUxLjkgIDQuMTUgICAgMTkuMzkgICAgMzQuMTUgfCAgICAgICovCisvKiAgICB8IHJwdXM6R2VvLkQgIDEwMjQwMCAgICAxICAgODI0MjQgICA4MC41ICA2LjQ0ICAgIDExLjY1ICAgIDE4LjE4IHwgICAgICAqLworLyogICAgfCBwdXM6TmV3cy5EICAzNzcxMDkgICAgMiAgMjA1NjcwICAgNTQuNSAgNC4zNiAgICAxNy4xNCAgICAyNy40NyB8ICAgICAgKi8KKy8qICAgIHwgcHVzOk9iajEuRCAgIDIxNTA0ICAgIDEgICAxMzAyNyAgIDYwLjYgIDQuODUgICAgMTMuNDAgICAgMTguOTUgfCAgICAgICovCisvKiAgICB8IHB1czpPYmoyLkQgIDI0NjgxNCAgICAxICAxMTYyODYgICA0Ny4xICAzLjc3ICAgIDE5LjMxICAgIDMwLjEwIHwgICAgICAqLworLyogICAgfCBzOlBhcGVyMS5EICAgNTMxNjEgICAgMSAgIDI3NTIyICAgNTEuOCAgNC4xNCAgICAxOC42MCAgICAzMS4xNSB8ICAgICAgKi8KKy8qICAgIHwgczpQYXBlcjIuRCAgIDgyMTk5ICAgIDEgICA0NTE2MCAgIDU0LjkgIDQuNDAgICAgMTguNDUgICAgMzIuODQgfCAgICAgICovCisvKiAgICB8IHJwdXM6UGljLkQgIDUxMzIxNiAgICAyICAxMjIzODggICAyMy44ICAxLjkxICAgIDM1LjI5ICAgIDUxLjA1IHwgICAgICAqLworLyogICAgfCB1czpQcm9nYy5EICAgMzk2MTEgICAgMSAgIDE5NjY5ICAgNDkuNyAgMy45NyAgICAxOC44NyAgICAzMC42NCB8ICAgICAgKi8KKy8qICAgIHwgdXM6UHJvZ2wuRCAgIDcxNjQ2ICAgIDEgICAyODI0NyAgIDM5LjQgIDMuMTUgICAgMjQuMzQgICAgNDAuNjYgfCAgICAgICovCisvKiAgICB8IHVzOlByb2dwLkQgICA0OTM3OSAgICAxICAgMTkzNzcgICAzOS4yICAzLjE0ICAgIDIzLjkxICAgIDM5LjIzIHwgICAgICAqLworLyogICAgfCB1czpUcmFucy5EICAgOTM2OTUgICAgMSAgIDMzNDgxICAgMzUuNyAgMi44NiAgICAyNS40OCAgICA0MC4zNyB8ICAgICAgKi8KKy8qICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICovCisvKiAgICB8IEF2ZXJhZ2UgICAgIDIyNDQwMSAgICAxICAxMTA5NTMgICA1MC4wICA0LjAwICAgIDIwLjE3ICAgIDMyLjcyIHwgICAgICAqLworLyogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyByZXR1cm5lZCBieSB0aGUgImNvbXByZXNzIiBmdW5jdGlvbiBiZWxvdyB3aGVuICAqLworLyogdGhlIHVzZXIgYXNrcyB0aGUgZnVuY3Rpb24gdG8gcmV0dXJuIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgKi8KKy8qIFRoZSBtb3N0IGltcG9ydGFudCBmaWVsZCBpbiB0aGUgcmVjb3JkIGlzIHRoZSB3b3JraW5nIG1lbW9yeSBmaWVsZCB3aGljaCAgICovCisvKiB0ZWxscyB0aGUgY2FsbGluZyBwcm9ncmFtIGhvdyBtdWNoIHdvcmtpbmcgbWVtb3J5IHNob3VsZCBiZSBwYXNzZWQgdG8gICAgICAqLworLyogImNvbXByZXNzIiB3aGVuIGl0IGlzIGNhbGxlZCB0byBwZXJmb3JtIGEgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbi4gICAgKi8KKy8qIExaUlczIHVzZXMgdGhlIHNhbWUgYW1vdW50IG9mIG1lbW9yeSBkdXJpbmcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uICovCisvKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIHN0cnVjdHVyZSBzZWUgImNvbXByZXNzLmgiLiAgICAgICAgICAgICAgICAgICAqLworICAKKyNkZWZpbmUgVShYKSAgICAgICAgICAgICgoVUxPTkcpIFgpCisjZGVmaW5lIFNJWkVfUF9CWVRFICAgICAoVShzaXplb2YoVUJZVEUgKikpKQorI2RlZmluZSBTSVpFX1dPUkQgICAgICAgKFUoc2l6ZW9mKFVXT1JEICApKSkKKyNkZWZpbmUgQUxJR05NRU5UX0ZVREdFIChVKDE2KSkKKyNkZWZpbmUgTUVNX1JFUSAoIFUoNDA5NikqKFNJWkVfUF9CWVRFKSArIEFMSUdOTUVOVF9GVURHRSApCisKK3N0YXRpYyBzdHJ1Y3QgY29tcHJlc3NfaWRlbnRpdHkgaWRlbnRpdHkgPQoreworIFUoMHgwMzJEREVBOCksICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxnb3JpdGhtIGlkZW50aWZpY2F0aW9uIG51bWJlci4gKi8KKyBNRU1fUkVRLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdvcmtpbmcgbWVtb3J5IChieXRlcykgcmVxdWlyZWQuICovCisgIkxaUlczIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lIG9mIGFsZ29yaXRobS4gICAgICAgICAgICAgICAqLworICIxLjAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVyc2lvbiBudW1iZXIgb2YgYWxnb3JpdGhtLiAgICAgKi8KKyAiMzEtRGVjLTE5OTAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGUgb2YgYWxnb3JpdGhtLiAgICAgICAgICAgICAgICovCisgIlB1YmxpYyBEb21haW4iLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5cmlnaHQgbm90aWNlLiAgICAgICAgICAgICAgICAqLworICJSb3NzIE4uIFdpbGxpYW1zIiwgICAgICAgICAgICAgICAgICAgICAgLyogQXV0aG9yIG9mIGFsZ29yaXRobS4gICAgICAgICAgICAgKi8KKyAiUmVuYWlzc2FuY2UgU29mdHdhcmUiLCAgICAgICAgICAgICAgICAgIC8qIEFmZmlsaWF0aW9uIG9mIGF1dGhvci4gICAgICAgICAgICovCisgIlB1YmxpYyBEb21haW4iICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3Igb2YgYWxnb3JpdGhtLiAgICAgICAgICAgICAqLworfTsKKyAKK0xPQ0FMIHZvaWQgY29tcHJlc3NfY29tcHJlc3MgIChVQllURSAqLFVCWVRFICosVUxPTkcsVUJZVEUgKiwgTE9ORyAqKTsKK0xPQ0FMIHZvaWQgY29tcHJlc3NfZGVjb21wcmVzcyhVQllURSAqLFVCWVRFICosTE9ORywgVUJZVEUgKiwgVUxPTkcgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9ubHkgZnVuY3Rpb24gZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUuICAgICAgICAgICAgICAgICovCisvKiBEZXBlbmRpbmcgb24gaXRzIGZpcnN0IHBhcmFtZXRlciwgdGhlIGZ1bmN0aW9uIGNhbiBiZSByZXF1ZXN0ZWQgdG8gICAgICAgICAqLworLyogY29tcHJlc3MgYSBibG9jayBvZiBtZW1vcnksIGRlY29tcHJlc3MgYSBibG9jayBvZiBtZW1vcnksIG9yIHRvIGlkZW50aWZ5ICAgKi8KKy8qIGl0c2VsZi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlICJjb21wcmVzcy5oIi4gICAgICovCisKK0VYUE9SVCB2b2lkIGx6cnczX2NvbXByZXNzKAorCVVXT1JEICAgICBhY3Rpb24sICAgICAgLyogQWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4JCSovCisJVUJZVEUgICAqd3JrX21lbSwJLyogQWRkcmVzcyBvZiB3b3JraW5nIG1lbW9yeSB3ZSBjYW4gdXNlLiovCisJVUJZVEUgICAqc3JjX2FkciwJLyogQWRkcmVzcyBvZiBpbnB1dCBkYXRhLgkJKi8KKwlMT05HICAgICBzcmNfbGVuLAkvKiBMZW5ndGggIG9mIGlucHV0IGRhdGEuCQkqLworCVVCWVRFICAgKmRzdF9hZHIsCS8qIEFkZHJlc3MgdG8gcHV0IG91dHB1dCBkYXRhLgkJKi8KKwl2b2lkICAqcF9kc3RfbGVuCS8qIEFkZHJlc3Mgb2YgbG9uZ3dvcmQgZm9yIGxlbmd0aCBvZiBvdXRwdXQgZGF0YS4qLworKQoreworIHN3aXRjaCAoYWN0aW9uKQorICAgeworICAgIGNhc2UgQ09NUFJFU1NfQUNUSU9OX0lERU5USVRZOgorICAgICAgICooKHN0cnVjdCBjb21wcmVzc19pZGVudGl0eSAqKilwX2RzdF9sZW4pPSAmaWRlbnRpdHk7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBDT01QUkVTU19BQ1RJT05fQ09NUFJFU1M6CisgICAgICAgY29tcHJlc3NfY29tcHJlc3Mod3JrX21lbSxzcmNfYWRyLHNyY19sZW4sZHN0X2FkciwoTE9ORyAqKXBfZHN0X2xlbik7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBDT01QUkVTU19BQ1RJT05fREVDT01QUkVTUzoKKyAgICAgICBjb21wcmVzc19kZWNvbXByZXNzKHdya19tZW0sc3JjX2FkcixzcmNfbGVuLGRzdF9hZHIsKExPTkcgKilwX2RzdF9sZW4pOworICAgICAgIGJyZWFrOworICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJSSUVGIERFU0NSSVBUSU9OIE9GIFRIRSBMWlJXMyBBTEdPUklUSE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIExaUlczIGFsZ29yaXRobSBpcyBpZGVudGljYWwgdG8gdGhlIExaUlcxLUEgYWxnb3JpdGhtIGV4Y2VwdCB0aGF0ICAgICAgKi8KKy8qIGluc3RlYWQgb2YgdHJhbnNtaXR0aW5nIGhpc3Rvcnkgb2Zmc2V0cywgaXQgdHJhbnNtaXRzIGhhc2ggdGFibGUgaW5kZXhlcy4gICovCisvKiBJbiBvcmRlciB0byBkZWNvZGUgdGhlIGluZGV4ZXMsIHRoZSBkZWNvbXByZXNzb3IgbXVzdCBtYWludGFpbiBhbiAgICAgICAgICAqLworLyogaWRlbnRpY2FsIGhhc2ggdGFibGUuIENvcHkgaXRlbXMgYXJlIHN0cmFpZ2h0Zm9yd2FyZDp3aGVuIHRoZSBkZWNvbXByZXNzb3IgKi8KKy8qIHJlY2VpdmVzIGEgY29weSBpdGVtLCBpdCBzaW1wbHkgbG9va3MgdXAgdGhlIGhhc2ggdGFibGUgdG8gdHJhbnNsYXRlIHRoZSAgICovCisvKiBpbmRleCBpbnRvIGEgcG9pbnRlciBpbnRvIHRoZSBkYXRhIGFscmVhZHkgZGVjb21wcmVzc2VkLiBUbyB1cGRhdGUgdGhlICAgICAqLworLyogaGFzaCB0YWJsZSwgaXQgcmVwbGFjZXMgdGhlIHNhbWUgdGFibGUgZW50cnkgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0ICAgKi8KKy8qIG9mIHRoZSBuZXdseSBkZWNvZGVkIHBocmFzZS4gVGhlIHRyaWNreSBwYXJ0IGlzIHdpdGggbGl0ZXJhbCBpdGVtcywgZm9yIGF0ICovCisvKiB0aGUgdGltZSB0aGF0IHRoZSBkZWNvbXByZXNzb3IgcmVjZWl2ZXMgYSBsaXRlcmFsIGl0ZW0gdGhlIGRlY29tcHJlc3NvciAgICAqLworLyogZG9lcyBub3QgaGF2ZSB0aGUgdGhyZWUgYnl0ZXMgaW4gdGhlIFppdiAodGhhdCB0aGUgY29tcHJlc3NvciBoYXMpIHRvICAgICAgKi8KKy8qIHBlcmZvcm0gdGhlIHRocmVlLWJ5dGUgaGFzaC4gVG8gc29sdmUgdGhpcyBwcm9ibGVtLCBpbiBMWlJXMywgYm90aCB0aGUgICAgICovCisvKiBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgYXJlIHdpcmVkIHVwIHNvIHRoYXQgdGhleSAiYnVmZmVyIiB0aGVzZSAgICAgICAqLworLyogbGl0ZXJhbHMgYW5kIHVwZGF0ZSB0aGVpciBoYXNoIHRhYmxlcyBvbmx5IHdoZW4gdGhyZWUgYnl0ZXMgYXJlIGF2YWlsYWJsZS4gKi8KKy8qIFRoaXMgbWFrZXMgdGhlIG1heGltdW0gYnVmZmVyaW5nIDIgYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmVwbGFjZW1lbnQgb2Ygb2Zmc2V0cyBieSBoYXNoIHRhYmxlIGluZGV4ZXMgeWllbGRzIGEgZmV3IHBlcmNlbnQgZXh0cmEgICAgKi8KKy8qIGNvbXByZXNzaW9uIGF0IHRoZSBjb3N0IG9mIHNvbWUgc3BlZWQuIExaUlczIGlzIHNsb3dlciB0aGFuIExaUlcxLCBMWlJXMS1BICovCisvKiBhbmQgTFpSVzIsIGJ1dCB5aWVsZHMgYmV0dGVyIGNvbXByZXNzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEV4dHJhIGNvbXByZXNzaW9uIGNvdWxkIGJlIG9idGFpbmVkIGJ5IHVzaW5nIGEgaGFzaCB0YWJsZSBvZiBkZXB0aCB0d28uICAgICovCisvKiBIb3dldmVyLCBpbmNyZWFzaW5nIHRoZSBkZXB0aCBhYm92ZSBvbmUgaW5jdXJzIGEgc2lnbmlmaWNhbnQgZGVjcmVhc2UgaW4gICAqLworLyogY29tcHJlc3Npb24gc3BlZWQgd2hpY2ggd2FzIG5vdCBjb25zaWRlcmVkIHdvcnRod2hpbGUuIEFub3RoZXIgcmVhc29uIGZvciAgKi8KKy8qIGtlZXBpbmcgdGhlIGRlcHRoIGRvd24gdG8gb25lIHdhcyB0byBhbGxvdyBlYXN5IGNvbXBhcmlzb24gd2l0aCB0aGUgICAgICAgICovCisvKiBMWlJXMS1BIGFuZCBMWlJXMiBhbGdvcml0aG1zIHNvIGFzIHRvIGRlbW9uc3RyYXRlIHRoZSBleGFjdCBlZmZlY3Qgb2YgdGhlICAqLworLyogdXNlIG9mIGRpcmVjdCBoYXNoIGluZGV4ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX3w0MDk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX198ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSpffDwtLS0rICAgLy0tLS0rLS0tXCAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfF9fX3wgICAgKy0tLXxIYXNoICAgIHwgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHxfX198ICAgICAgICB8RnVuY3Rpb258ICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8X19ffCAgICAgICAgXC0tLS0tLS0tLyAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfF9fX3wwICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICstLS0rICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBIYXNoICAgICAgICArLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgVGFibGUgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgKi8KKy8qICAgICAgfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwgICAgICAgICAgICAgICovCisvKiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAqLworLyogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwxLi4uLi4uMTh8ICAgICAgfCAgICAgICAgICAgICAgKi8KKy8qICAgICAgfDwtLS0tLS0tIExlbXBlbD1IaXN0b3J5IC0tLS0tLS0tLS0tLT58PC0tWml2LS0+fCAgICAgIHwgICAgICAgICAgICAgICovCisvKiAgICAgIHwgICAgICg9Ynl0ZXMgYWxyZWFkeSBwcm9jZXNzZWQpICAgICAgfDwtU3RpbGwgdG8gZ28tLT58ICAgICAgICAgICAgICAqLworLyogICAgICB8PC0tLS0tLS0tLS0tLS0tLS0tLS0tIElOUFVUIEJMT0NLIC0tLS0tLS0tLS0tLS0tLS0tLS0+fCAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgZGlhZ3JhbSBhYm92ZSBmb3IgTFpSVzMgbG9va3MgYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgZGlhZ3JhbSBmb3IgICAgICAqLworLyogTFpSVzEuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgaW4gTFpSVzMsIHRoZSBjb21wcmVzc29yIHRyYW5zbWl0cyBoYXNoICAgICAgKi8KKy8qIHRhYmxlIGluZGljZXMgaW5zdGVhZCBvZiBMZW1wZWwgb2Zmc2V0cy4gRm9yIHRoaXMgdG8gd29yaywgdGhlICAgICAgICAgICAgICovCisvKiBkZWNvbXByZXNzb3IgbXVzdCBtYWludGFpbiBhIGhhc2ggdGFibGUgYXMgd2VsbCBhcyB0aGUgY29tcHJlc3NvciBhbmQgYm90aCAqLworLyogY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgImJ1ZmZlciIgbGl0ZXJhbHMsIGFzIHRoZSBkZWNvbXByZXNzb3IgICAgKi8KKy8qIGNhbm5vdCBoYXNoIHBocmFzZXMgY29tbWVuY2luZyB3aXRoIGEgbGl0ZXJhbCB1bnRpbCBhbm90aGVyIHR3byBieXRlcyBoYXZlICovCisvKiBhcnJpdmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMWlJXMyBBbGdvcml0aG0gRXhlY3V0aW9uIFN1bW1hcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIEhhc2ggdGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZSBaaXYgdG8geWllbGQgYSBoYXNoIHRhYmxlIGluZGV4IGguICAgKi8KKy8qICAyLiBMb29rIHVwIHRoZSBoYXNoIHRhYmxlIHlpZWxkaW5nIGhpc3RvcnkgcG9pbnRlciBwLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMy4gTWF0Y2ggd2hlcmUgcCBwb2ludHMgd2l0aCB0aGUgWml2LiBJZiB0aGVyZSBpcyBhIG1hdGNoIG9mIHRocmVlIG9yICAgICAqLworLyogICAgIG1vcmUgYnl0ZXMsIGNvZGUgdGhvc2UgYnl0ZXMgKGluIHRoZSBaaXYpIGFzIGEgY29weSBpdGVtLCBvdGhlcndpc2UgICAgKi8KKy8qICAgICBjb2RlIHRoZSBuZXh0IGJ5dGUgaW4gdGhlIFppdiBhcyBhIGxpdGVyYWwgaXRlbS4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgNC4gVXBkYXRlIHRoZSBoYXNoIHRhYmxlIGFzIHBvc3NpYmxlIHN1YmplY3QgdG8gdGhlIGNvbnN0cmFpbnQgdGhhdCBvbmx5ICAqLworLyogICAgIHBocmFzZXMgY29tbWVuY2luZyB0aHJlZSBieXRlcyBiYWNrIGZyb20gdGhlIFppdiBjYW4gYmUgaGFzaGVkIGFuZCAgICAgKi8KKy8qICAgICBlbnRlcmVkIGludG8gdGhlIGhhc2ggdGFibGUuIChUaGlzIGVuYWJsZXMgdGhlIGRlY29tcHJlc3NvciB0byBrZWVwICAgICovCisvKiAgICAgcGFjZSkuIFNlZSB0aGUgZGVzY3JpcHRpb24gYW5kIGNvZGUgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICBERUZJTklUSU9OIE9GIENPTVBSRVNTRUQgRklMRSBGT1JNQVQgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgICAgICAgICAgICAgICAgICovCisvKiAgKiBBIGNvbXByZXNzZWQgZmlsZSBjb25zaXN0cyBvZiBhIENPUFkgRkxBRyBmb2xsb3dlZCBieSBhIFJFTUFJTkRFUi4gICAgICAqLworLyogICogVGhlIGNvcHkgZmxhZyBDRiB1c2VzIHVwIGZvdXIgYnl0ZXMgd2l0aCB0aGUgZmlyc3QgYnl0ZSBiZWluZyB0aGUgICAgICAgKi8KKy8qICAgIGxlYXN0IHNpZ25pZmljYW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKiBJZiBDRj0xLCB0aGVuIHRoZSBjb21wcmVzc2VkIGZpbGUgcmVwcmVzZW50cyB0aGUgcmVtYWluZGVyIG9mIHRoZSBmaWxlICAqLworLyogICAgZXhhY3RseS4gT3RoZXJ3aXNlIENGPTAgYW5kIHRoZSByZW1haW5kZXIgb2YgdGhlIGZpbGUgY29uc2lzdHMgb2YgemVybyAgKi8KKy8qICAgIG9yIG1vcmUgR1JPVVBTLCBlYWNoIG9mIHdoaWNoIHJlcHJlc2VudHMgb25lIG9yIG1vcmUgYnl0ZXMuICAgICAgICAgICAgICovCisvKiAgKiBFYWNoIGdyb3VwIGNvbnNpc3RzIG9mIHR3byBieXRlcyBvZiBDT05UUk9MIGluZm9ybWF0aW9uIGZvbGxvd2VkIGJ5ICAgICAqLworLyogICAgc2l4dGVlbiBJVEVNcyBleGNlcHQgZm9yIHRoZSBsYXN0IGdyb3VwIHdoaWNoIGNhbiBjb250YWluIGZyb20gb25lICAgICAgKi8KKy8qICAgIHRvIHNpeHRlZW4gaXRlbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKiBBbiBpdGVtIGNhbiBiZSBlaXRoZXIgYSBMSVRFUkFMIGl0ZW0gb3IgYSBDT1BZIGl0ZW0uICAgICAgICAgICAgICAgICAgICAqLworLyogICogRWFjaCBpdGVtIGNvcnJlc3BvbmRzIHRvIGEgYml0IGluIHRoZSBjb250cm9sIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIFRoZSBmaXJzdCBjb250cm9sIGJ5dGUgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IDggaXRlbXMgaW4gdGhlIGdyb3VwICAgICovCisvKiAgICB3aXRoIGJpdCAwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGdyb3VwIGFuZCBiaXQgNyB0byAgICAqLworLyogICAgdGhlIGVpZ2h0aCBpdGVtIGluIHRoZSBncm91cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIFRoZSBzZWNvbmQgY29udHJvbCBieXRlIGNvcnJlc3BvbmRzIHRvIHRoZSBzZWNvbmQgOCBpdGVtcyBpbiB0aGUgZ3JvdXAgICovCisvKiAgICB3aXRoIGJpdCAwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5pbnRoIGl0ZW0gaW4gdGhlIGdyb3VwIGFuZCBiaXQgNyB0byAgICAqLworLyogICAgdGhlIHNpeHRlZW50aCBpdGVtIGluIHRoZSBncm91cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIEEgemVybyBiaXQgaW4gYSBjb250cm9sIHdvcmQgbWVhbnMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBpdGVtIGlzIGEgICAgICovCisvKiAgICBsaXRlcmFsIGl0ZW0uIEEgb25lIGJpdCBjb3JyZXNwb25kcyB0byBhIGNvcHkgaXRlbS4gICAgICAgICAgICAgICAgICAgICAqLworLyogICogQSBsaXRlcmFsIGl0ZW0gY29uc2lzdHMgb2YgYSBzaW5nbGUgYnl0ZSB3aGljaCByZXByZXNlbnRzIGl0c2VsZi4gICAgICAgKi8KKy8qICAqIEEgY29weSBpdGVtIGNvbnNpc3RzIG9mIHR3byBieXRlcyB0aGF0IHJlcHJlc2VudCBmcm9tIDMgdG8gMTggYnl0ZXMuICAgICovCisvKiAgKiBUaGUgZmlyc3QgIGJ5dGUgaW4gYSBjb3B5IGl0ZW0gd2lsbCBiZSBkZW5vdGVkIEMxLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICogVGhlIHNlY29uZCBieXRlIGluIGEgY29weSBpdGVtIHdpbGwgYmUgZGVub3RlZCBDMi4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIEJpdHMgd2lsbCBiZSBzZWxlY3RlZCB1c2luZyBzcXVhcmUgYnJhY2tldHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGb3IgZXhhbXBsZTogQzFbMC4uM10gaXMgdGhlIGxvdyBuaWJibGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgYnl0ZS4gICAgICAqLworLyogICAgb2YgY29weSBpdGVtIEMxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIFRoZSBMRU5HVEggb2YgYSBjb3B5IGl0ZW0gaXMgZGVmaW5lZCB0byBiZSBDMVswLi4zXSszIHdoaWNoIGlzIGEgbnVtYmVyICovCisvKiAgICBpbiB0aGUgcmFuZ2UgWzMsMThdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICogVGhlIElOREVYIG9mIGEgY29weSBpdGVtIGlzIGRlZmluZWQgdG8gYmUgQzFbNC4uN10qMjU2K0MyWzAuLjhdIHdoaWNoICAgKi8KKy8qICAgIGlzIGEgbnVtYmVyIGluIHRoZSByYW5nZSBbMCw0MDk1XS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKiBBIGNvcHkgaXRlbSByZXByZXNlbnRzIHRoZSBzZXF1ZW5jZSBvZiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgdGV4dFtQT1MtT0ZGU0VULi5QT1MtT0ZGU0VUK0xFTkdUSC0xXSB3aGVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIHRleHQgICBpcyB0aGUgZW50aXJlIHRleHQgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJpbmcuICAgICAgICAgICAgICovCisvKiAgICAgICAgICBQT1MgICAgaXMgdGhlIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSAgICAqLworLyogICAgICAgICAgICAgICAgICAgc3RyaW5nIHJlcHJlc2VudGVkIGJ5IGFsbCB0aGUgaXRlbXMgcHJlY2VlZGluZyB0aGUgaXRlbSAgKi8KKy8qICAgICAgICAgICAgICAgICAgIGJlaW5nIGRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBPRkZTRVQgaXMgb2J0YWluZWQgZnJvbSBJTkRFWCBieSBsb29raW5nIHVwIHRoZSBoYXNoIHRhYmxlLiAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBmb2xsb3dpbmcgI2RlZmluZSBkZWZpbmVzIHRoZSBsZW5ndGggb2YgdGhlIGNvcHkgZmxhZyB0aGF0IGFwcGVhcnMgYXQgICovCisvKiB0aGUgc3RhcnQgb2YgdGhlIGNvbXByZXNzZWQgZmlsZS4gVGhlIHZhbHVlIG9mIGZvdXIgYnl0ZXMgd2FzIGNob3NlbiAgICAgICAqLworLyogYmVjYXVzZSB0aGUgZmFzdF9jb3B5IHJvdXRpbmUgb24gbXkgTWFjaW50b3NoIHJ1bnMgZmFzdGVyIGlmIHRoZSBzb3VyY2UgICAgKi8KKy8qIGFuZCBkZXN0aW5hdGlvbiBibG9ja3MgYXJlIHJlbGF0aXZlbHkgbG9uZ3dvcmQgYWxpZ25lZC4gICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgYWN0dWFsIGZsYWcgZGF0YSBhcHBlYXJzIGluIHRoZSBmaXJzdCBieXRlLiBUaGUgcmVzdCBhcmUgemVyb2VkIHNvIGFzICAqLworLyogdG8gbm9ybWFsaXplIHRoZSBjb21wcmVzc2VkIHJlcHJlc2VudGF0aW9uIChpLmUuIG5vdCBub24tZGV0ZXJtaW5pc3RpYykuICAgKi8KKyNkZWZpbmUgRkxBR19CWVRFUyA0CisKKy8qIFRoZSBmb2xsb3dpbmcgI2RlZmluZXMgZGVmaW5lIHRoZSBtZWFuaW5nIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIGNvcHkgICAgICAgICovCisvKiBmbGFnIGF0IHRoZSBzdGFydCBvZiB0aGUgY29tcHJlc3NlZCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGTEFHX0NPTVBSRVNTIDAgICAgIC8qIFNpZ25hbHMgdGhhdCBvdXRwdXQgd2FzIHJlc3VsdCBvZiBjb21wcmVzc2lvbi4gKi8KKyNkZWZpbmUgRkxBR19DT1BZICAgICAxICAgICAvKiBTaWduYWxzIHRoYXQgb3V0cHV0IHdhcyBzaW1wbHkgY29waWVkIG92ZXIuICAgICovCisKKy8qIFRoZSA2ODAwMCBtaWNyb3Byb2Nlc3NvciAob24gd2hpY2ggdGhpcyBhbGdvcml0aG0gd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkICovCisvKiBpcyBmdXNzeSBhYm91dCBub24tYWxpZ25lZCBhcnJheXMgb2Ygd29yZHMuIFRvIGF2b2lkIHRoZXNlIHByb2JsZW1zIHRoZSAgICAqLworLyogZm9sbG93aW5nIG1hY3JvIGNhbiBiZSB1c2VkIHRvICJ3YXN0ZSIgZnJvbSAwIHRvIDMgYnl0ZXMgc28gYXMgdG8gYWxpZ24gICAgKi8KKy8qIHRoZSBhcmd1bWVudCBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVMT05HX0FMSUdOX1VQKFgpICgoKChVTE9ORylYKStzaXplb2YoVUxPTkcpLTEpJn4oc2l6ZW9mKFVMT05HKS0xKSkKKworCisvKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50IGRlZmluZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGFuIHVuY29tcHJlc3NlZCBpdGVtLiAqLworLyogVGhpcyBkZWZpbml0aW9uIG11c3Qgbm90IGJlIGNoYW5nZWQ7IGl0cyB2YWx1ZSBpcyBoYXJkd2lyZWQgaW50byB0aGUgY29kZS4gKi8KKy8qIFRoZSBsb25nZXN0IG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSBzcGFubmVkIGJ5IGEgc2luZ2xlIGl0ZW0gaXMgMTggICAgICovCisvKiBmb3IgdGhlIGxvbmdlc3QgY29weSBpdGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQVhfUkFXX0lURU0gKDE4KQorCisvKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50IGRlZmluZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGFuIHVuY29tcHJlc3NlZCBncm91cC4qLworLyogVGhpcyBkZWZpbml0aW9uIG11c3Qgbm90IGJlIGNoYW5nZWQ7IGl0cyB2YWx1ZSBpcyBoYXJkd2lyZWQgaW50byB0aGUgY29kZS4gKi8KKy8qIEEgZ3JvdXAgY29udGFpbnMgYXQgbW9zdCAxNiBpdGVtcyB3aGljaCBleHBsYWlucyB0aGlzIGRlZmluaXRpb24uICAgICAgICAgICovCisjZGVmaW5lIE1BWF9SQVdfR1JPVVAgKDE2Kk1BWF9SQVdfSVRFTSkKKworLyogVGhlIGZvbGxvd2luZyBjb25zdGFudCBkZWZpbmVzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbXByZXNzZWQgZ3JvdXAuICAgKi8KKy8qIFRoaXMgZGVmaW5pdGlvbiBtdXN0IG5vdCBiZSBjaGFuZ2VkOyBpdHMgdmFsdWUgaXMgaGFyZHdpcmVkIGludG8gdGhlIGNvZGUuICovCisvKiBBIGNvbXByZXNzZWQgZ3JvdXAgY29uc2lzdHMgb2YgdHdvIGNvbnRyb2wgYnl0ZXMgZm9sbG93ZWQgYnkgdXAgdG8gMTYgICAgICAqLworLyogY29tcHJlc3NlZCBpdGVtcyBlYWNoIG9mIHdoaWNoIGNhbiBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgdHdvIGJ5dGVzLiAgICAgKi8KKyNkZWZpbmUgTUFYX0NNUF9HUk9VUCAoMisxNioyKQorCisvKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50IGRlZmluZXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlLiAgICAqLworLyogVGhpcyBkZWZpbml0aW9uIG11c3Qgbm90IGJlIGNoYW5nZWQ7IGl0cyB2YWx1ZSBpcyBoYXJkd2lyZWQgaW50byB0aGUgY29kZS4gKi8KKyNkZWZpbmUgSEFTSF9UQUJMRV9MRU5HVEggKDQwOTYpCisKKy8qIExaUlczLCB1bmxpa2UgTFpSVzEoLUEpLCBtdXN0IGluaXRpYWxpemUgaXRzIGhhc2ggdGFibGUgc28gYXMgdG8gZW5hYmxlICAgICovCisvKiB0aGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIHRvIHN0YXkgaW4gc3RlcCBtYWludGFpbmluZyBpZGVudGljYWwgaGFzaCAqLworLyogdGFibGVzLiBJbiBhbiBlYXJseSB2ZXJzaW9uIG9mIHRoZSBhbGdvcml0aG0sIHRoZSB0YWJsZXMgd2VyZSBzaW1wbHkgICAgICAgKi8KKy8qIGluaXRpYWxpemVkIHRvIHplcm8gYW5kIGEgY2hlY2sgZm9yIHplcm8gd2FzIGluY2x1ZGVkIGp1c3QgYmVmb3JlIHRoZSAgICAgICovCisvKiBtYXRjaGluZyBjb2RlLiBIb3dldmVyLCB0aGlzIHRlc3QgY29zdHMgdGltZS4gQSBiZXR0ZXIgc29sdXRpb24gaXMgdG8gICAgICAqLworLyogaW5pdGlhbGl6ZSBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUgdG8gcG9pbnQgdG8gYSBjb25zdGFudCAgICAgICAgKi8KKy8qIHN0cmluZy4gVGhlIGRlY29tcHJlc3NvciBkb2VzIHRoZSBzYW1lLiBUaGlzIHNvbHV0aW9uIHJlcXVpcmVzIG5vIGV4dHJhICAgICovCisvKiB0ZXN0LiBUaGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBkbyBub3QgbWF0dGVyIHNvIGxvbmcgYXMgdGhlIHN0cmluZyBpcyAgICAqLworLyogdGhlIHNhbWUgZm9yIHRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgYW5kIGNvbnRhaW5zIGF0IGxlYXN0ICAgICAgICAgKi8KKy8qIE1BWF9SQVdfSVRFTSBieXRlcy4gSSBjaG9zZSBjb25zZWN1dGl2ZSBkZWNpbWFsIGRpZ2l0cyBiZWNhdXNlIHRoZXkgZG8gbm90ICovCisvKiBoYXZlIHdoaXRlIHNwYWNlIHByb2JsZW1zIChlLmcuIHRoZXJlIGlzIG5vIGNoYW5jZSB0aGF0IHRoZSBjb21waWxlciB3aWxsICAqLworLyogcmVwbGFjZSBtb3JlIHRoYW4gb25lIHNwYWNlIGJ5IGEgVEFCKSBhbmQgYmVjYXVzZSB0aGV5IG1ha2UgdGhlIGxlbmd0aCBvZiAgKi8KKy8qIHRoZSBzdHJpbmcgb2J2aW91cyBieSBpbnNwZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNUQVJUX1NUUklOR18xOCAoKFVCWVRFICopICIxMjM0NTY3ODkwMTIzNDU2NzgiKQorCisvKiBJbiB0aGlzIGFsZ29yaXRobSwgaGFzaCB2YWx1ZXMgaGF2ZSB0byBiZSBjYWxjdWxhdGVkIGF0IG1vcmUgdGhhbiBvbmUgICAgICAqLworLyogcG9pbnQuIFRoZSBmb2xsb3dpbmcgbWFjcm8gbmVhdGVucyB0aGUgY29kZSB1cCBmb3IgdGhpcy4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFTSChQVFIpIFwKKyAgICgoKDQwNTQzKigoKCooUFRSKSk8PDgpXigoKigoUFRSKSsxKSk8PDQpXigqKChQVFIpKzIpKSkpPj40KSAmIDB4RkZGKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbnB1dCAgOiBIYW5kIG92ZXIgdGhlIHJlcXVpcmVkIGFtb3VudCBvZiB3b3JraW5nIG1lbW9yeSBpbiBwX3dya19tZW0uICAgICAqLworLyogSW5wdXQgIDogU3BlY2lmeSBpbnB1dCBibG9jayB1c2luZyBwX3NyY19maXJzdCBhbmQgc3JjX2xlbi4gICAgICAgICAgICAgICAgKi8KKy8qIElucHV0ICA6IFBvaW50IHBfZHN0X2ZpcnN0IHRvIHRoZSBzdGFydCBvZiB0aGUgb3V0cHV0IHpvbmUgKE9aKS4gICAgICAgICAgICovCisvKiBJbnB1dCAgOiBQb2ludCBwX2RzdF9sZW4gdG8gYSBVTE9ORyB0byByZWNlaXZlIHRoZSBvdXRwdXQgbGVuZ3RoLiAgICAgICAgICAqLworLyogSW5wdXQgIDogSW5wdXQgYmxvY2sgYW5kIG91dHB1dCB6b25lIG11c3Qgbm90IG92ZXJsYXAuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE91dHB1dCA6IExlbmd0aCBvZiBvdXRwdXQgYmxvY2sgd3JpdHRlbiB0byAqcF9kc3RfbGVuLiAgICAgICAgICAgICAgICAgICAgICovCisvKiBPdXRwdXQgOiBPdXRwdXQgYmxvY2sgaW4gTWVtW3BfZHN0X2ZpcnN0Li5wX2RzdF9maXJzdCsqcF9kc3RfbGVuLTFdLiBNYXkgICAqLworLyogT3V0cHV0IDogd3JpdGUgaW4gT1o9TWVtW3BfZHN0X2ZpcnN0Li5wX2RzdF9maXJzdCtzcmNfbGVuK01BWF9DTVBfR1JPVVAtMV0uKi8KKy8qIE91dHB1dCA6IFVwb24gY29tcGxldGlvbiBndWFyYW50ZWVkICpwX2RzdF9sZW48PXNyY19sZW4rRkxBR19CWVRFUy4gICAgICAgICovCitMT0NBTCB2b2lkIGNvbXByZXNzX2NvbXByZXNzKFVCWVRFICpwX3dya19tZW0sCisJCQkgICAgIFVCWVRFICpwX3NyY19maXJzdCwgVUxPTkcgIHNyY19sZW4sCisJCQkgICAgIFVCWVRFICpwX2RzdF9maXJzdCwgTE9ORyAgKnBfZHN0X2xlbikKK3sKKyAvKiBwX3NyYyBhbmQgcF9kc3Qgc3RlcCB0aHJvdWdoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJsb2Nrcy4gICAgICAgICAgICovCisgcmVnaXN0ZXIgVUJZVEUgKnBfc3JjID0gcF9zcmNfZmlyc3Q7CisgcmVnaXN0ZXIgVUJZVEUgKnBfZHN0ID0gcF9kc3RfZmlyc3Q7CisgCisgLyogVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG5ldmVyIG1vZGlmaWVkIGFuZCBhcmUgdXNlZCBpbiB0aGUgICAgICAgICAgICAqLworIC8qIGNhbGN1bGF0aW9ucyB0aGF0IGRldGVybWluZSB3aGVuIHRoZSBtYWluIGxvb3AgdGVybWluYXRlcy4gICAgICAgICAgICAgICAgKi8KKyBVQllURSAqcF9zcmNfcG9zdCAgPSBwX3NyY19maXJzdCtzcmNfbGVuOworIFVCWVRFICpwX2RzdF9wb3N0ICA9IHBfZHN0X2ZpcnN0K3NyY19sZW47CisgVUJZVEUgKnBfc3JjX21heDEgID0gcF9zcmNfZmlyc3Qrc3JjX2xlbi1NQVhfUkFXX0lURU07CisgVUJZVEUgKnBfc3JjX21heDE2ID0gcF9zcmNfZmlyc3Qrc3JjX2xlbi1NQVhfUkFXX0lURU0qMTY7CisgCisgLyogVGhlIHZhcmlhYmxlcyAncF9jb250cm9sJyBhbmQgJ2NvbnRyb2wnIGFyZSB1c2VkIHRvIGJ1ZmZlciBjb250cm9sIGJpdHMuICAqLworIC8qIEJlZm9yZSBlYWNoIGdyb3VwIGlzIHByb2Nlc3NlZCwgdGhlIG5leHQgdHdvIGJ5dGVzIG9mIHRoZSBvdXRwdXQgYmxvY2sgICAgKi8KKyAvKiBhcmUgc2V0IGFzaWRlIGZvciB0aGUgY29udHJvbCB3b3JkIGZvciB0aGUgZ3JvdXAgYWJvdXQgdG8gYmUgcHJvY2Vzc2VkLiAgICovCisgLyogJ3BfY29udHJvbCcgaXMgc2V0IHRvIHBvaW50IHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoYXQgd29yZC4gTWVhbndoaWxlLCAgICAqLworIC8qICdjb250cm9sJyBidWZmZXJzIHRoZSBjb250cm9sIGJpdHMgYmVpbmcgZ2VuZXJhdGVkIGR1cmluZyB0aGUgcHJvY2Vzc2luZyAgKi8KKyAvKiBvZiB0aGUgZ3JvdXAuIEluc3RlYWQgb2YgaGF2aW5nIGEgY291bnRlciB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGl0ZW1zICovCisgLyogaGF2ZSBiZWVuIHByb2Nlc3NlZCAoPXRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgY29udHJvbCB3b3JkKSwgYXQgdGhlICAgICAqLworIC8qIHN0YXJ0IG9mIGVhY2ggZ3JvdXAsIHRoZSB0b3Agd29yZCBvZiAnY29udHJvbCcgaXMgZmlsbGVkIHdpdGggMSBiaXRzLiAgICAgKi8KKyAvKiBBcyAnY29udHJvbCcgaXMgc2hpZnRlZCBmb3IgZWFjaCBpdGVtLCB0aGUgMSBiaXRzIGluIHRoZSB0b3Agd29yZCBhcmUgICAgICovCisgLyogYWJzb3JiZWQgb3IgZGVzdHJveWVkLiBXaGVuIHRoZXkgYWxsIHJ1biBvdXQgKGkuZS4gd2hlbiB0aGUgdG9wIHdvcmQgaXMgICAqLworIC8qIGFsbCB6ZXJvIGJpdHMsIHdlIGtub3cgdGhhdCB3ZSBhcmUgYXQgdGhlIGVuZCBvZiBhIGdyb3VwLiAgICAgICAgICAgICAgICAgKi8KKyMgZGVmaW5lIFRPUFdPUkQgMHhGRkZGMDAwMAorIFVCWVRFICpwX2NvbnRyb2w7CisgcmVnaXN0ZXIgVUxPTkcgY29udHJvbD1UT1BXT1JEOworIAorIC8qIFRIZSB2YXJpYWJsZSAnaGFzaCcgYWx3YXlzIHBvaW50cyB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgaGFzaCB0YWJsZS4gKi8KKyBVQllURSAqKmhhc2g9IChVQllURSAqKikgIFVMT05HX0FMSUdOX1VQKHBfd3JrX21lbSk7CisgCisgLyogVGhlIGZvbGxvd2luZyB0d28gdmFyaWFibGVzIHJlcHJlc2VudCB0aGUgbGl0ZXJhbCBidWZmZXIuIHBfaDEgcG9pbnRzIHRvICAqLworIC8qIHRoZSBoYXNoIHRhYmxlIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHlvdW5nZXN0IGxpdGVyYWwuIHBfaDIgcG9pbnRzICAgKi8KKyAvKiB0byB0aGUgaGFzaCB0YWJsZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWNvbmQgeW91bmdlc3QgbGl0ZXJhbC4gICAgICovCisgLyogTm90ZTogcF9oMT0wPT5wX2gyPTAgYmVjYXVzZSB6ZXJvIHZhbHVlcyBkZW5vdGUgYWJzZW5jZSBvZiBhIHBlbmRpbmcgICAgICAqLworIC8qIGxpdGVyYWwuIFRoZSB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkIHRvIHplcm8gbWVhbmluZyBhbiBlbXB0eSAiYnVmZmVyIi4gKi8KKyBVQllURSAqKnBfaDE9TlVMTDsKKyBVQllURSAqKnBfaDI9TlVMTDsKKyAgCisgLyogVG8gc3RhcnQsIHdlIHdyaXRlIHRoZSBmbGFnIGJ5dGVzLiBCZWluZyBvcHRpbWlzdGljLCB3ZSBzZXQgdGhlIGZsYWcgdG8gICAqLworIC8qIEZMQUdfQ09NUFJFU1MuIFRoZSByZW1haW5pbmcgZmxhZyBieXRlcyBhcmUgemVyb2VkIHNvIGFzIHRvIGtlZXAgdGhlICAgICAgKi8KKyAvKiBhbGdvcml0aG0gZGV0ZXJtaW5pc3RpYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgKnBfZHN0Kys9RkxBR19DT01QUkVTUzsKKyB7VVdPUkQgaTsgZm9yIChpPTI7aTw9RkxBR19CWVRFUztpKyspICpwX2RzdCsrPTA7fQorCisgLyogUmVzZXJ2ZSB0aGUgZmlyc3Qgd29yZCBvZiBvdXRwdXQgYXMgdGhlIGNvbnRyb2wgd29yZCBmb3IgdGhlIGZpcnN0IGdyb3VwLiAqLworIC8qIE5vdGU6IFRoaXMgaXMgdW5kb25lIGF0IHRoZSBlbmQgaWYgdGhlIGlucHV0IGJsb2NrIGlzIGVtcHR5LiAgICAgICAgICAgICAgKi8KKyBwX2NvbnRyb2w9cF9kc3Q7IHBfZHN0Kz0yOworIAorIC8qIEluaXRpYWxpemUgYWxsIGVsZW1lbnRzIG9mIHRoZSBoYXNoIHRhYmxlIHRvIHBvaW50IHRvIGEgY29uc3RhbnQgc3RyaW5nLiAgKi8KKyAvKiBVc2Ugb2YgYW4gdW5yb2xsZWQgbG9vcCBzcGVlZHMgdGhpcyB1cCBjb25zaWRlcmFibHkuICAgICAgICAgICAgICAgICAgICAgICovCisge1VXT1JEIGk7IFVCWVRFICoqcF9oPWhhc2g7CisjICBkZWZpbmUgWkggKnBfaCsrPVNUQVJUX1NUUklOR18xOAorICBmb3IgKGk9MDtpPDI1NjtpKyspICAgICAvKiAyNTY9SEFTSF9UQUJMRV9MRU5HVEgvMTYuICovCisgICAge1pIO1pIO1pIO1pIOworICAgICBaSDtaSDtaSDtaSDsKKyAgICAgWkg7Wkg7Wkg7Wkg7CisgICAgIFpIO1pIO1pIO1pIO30KKyB9CisKKyAvKiBUaGUgbWFpbiBsb29wIHByb2Nlc3NlcyBlaXRoZXIgMSBvciAxNiBpdGVtcyBwZXIgaXRlcmF0aW9uLiBBcyBpdHMgICAgICAgICovCisgLyogdGVybWluYXRpb24gbG9naWMgaXMgY29tcGxpY2F0ZWQsIEkgaGF2ZSBvcHRlZCBmb3IgYW4gaW5maW5pdGUgbG9vcCAgICAgICAqLworIC8qIHN0cnVjdHVyZSBjb250YWluaW5nICdicmVhaycgYW5kICdnb3RvJyBzdGF0ZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyB3aGlsZSAoVFJVRSkKKyAgIHsvKiBCZWdpbiBtYWluIHByb2Nlc3NpbmcgbG9vcC4gKi8KKyAgIAorICAgIC8qIE5vdGU6IEFsbCB0aGUgdmFyaWFibGVzIGhlcmUgZXhjZXB0IHVucm9sbCBzaG91bGQgYmUgZGVmaW5lZCB3aXRoaW4gICAgKi8KKyAgICAvKiAgICAgICB0aGUgaW5uZXIgbG9vcC4gVW5mb3J0dW5hdGVseSB0aGUgbG9vcCBoYXNuJ3QgZ290IGEgYmxvY2suICAgICAgICovCisgICAgIHJlZ2lzdGVyIFVCWVRFICpwOyAgICAgICAgIC8qIFNjYW5zIHRocm91Z2ggdGFyZyBwaHJhc2UgZHVyaW5nIG1hdGNoaW5nLiAqLworICAgICByZWdpc3RlciBVQllURSAqcF96aXY9IE5VTEwgOyAgICAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgb2YgY3VycmVudCBaaXYuICAgICAgICovCisgICAgIHJlZ2lzdGVyIFVXT1JEIHVucm9sbDsgICAgIC8qIExvb3AgY291bnRlciBmb3IgdW5yb2xsZWQgaW5uZXIgbG9vcC4gICAgICAqLworICAgICByZWdpc3RlciBVV09SRCBpbmRleDsgICAgICAvKiBJbmRleCBvZiBjdXJyZW50IGhhc2ggdGFibGUgZW50cnkuICAgICAgICAgKi8KKyAgICAgcmVnaXN0ZXIgVUJZVEUgKipwX2gwID0gTlVMTCA7ICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgaGFzaCB0YWJsZSBlbnRyeS4gICAgICAgKi8KKyAgICAgCisgICAgLyogVGVzdCBmb3Igb3ZlcnJ1biBhbmQganVtcCB0byBvdmVycnVuIGNvZGUgaWYgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgICAqLworICAgIGlmIChwX2RzdD5wX2RzdF9wb3N0KQorICAgICAgIGdvdG8gb3ZlcnJ1bjsKKyAgICAgICAKKyAgICAvKiBUaGUgZm9sbG93aW5nIGNhc2NhZGUgb2YgaWYgc3RhdGVtZW50cyBlZmZpY2llbnRseSBjYXRjaGVzIGFuZCBkZWFscyAgICovCisgICAgLyogd2l0aCB2YXJ5aW5nIGRlZ3JlZXMgb2YgY2xvc2VuZXNzIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0IGJsb2NrLiAgICAgICAqLworICAgIC8qIFdoZW4gd2UgZ2V0IHZlcnkgY2xvc2UgdG8gdGhlIGVuZCwgd2Ugc3RvcCB1cGRhdGluZyB0aGUgdGFibGUgYW5kICAgICAgKi8KKyAgICAvKiBjb2RlIHRoZSByZW1haW5pbmcgYnl0ZXMgYXMgbGl0ZXJhbHMuIFRoaXMgbWFrZXMgdGhlIGNvZGUgc2ltcGxlci4gICAgICovCisgICAgdW5yb2xsPTE2OworICAgIGlmIChwX3NyYz5wX3NyY19tYXgxNikKKyAgICAgIHsKKyAgICAgICB1bnJvbGw9MTsKKyAgICAgICBpZiAocF9zcmM+cF9zcmNfbWF4MSkKKyAgICAgICAgIHsKKyAgICAgICAgICBpZiAocF9zcmM9PXBfc3JjX3Bvc3QpCisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIGdvdG8gbGl0ZXJhbDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICAgIAorICAgIC8qIFRoaXMgaW5uZXIgdW5yb2xsZWQgbG9vcCBwcm9jZXNzZXMgJ3Vucm9sbCcgKHdob3NlIHZhbHVlIGlzIGVpdGhlciAxICAgKi8KKyAgICAvKiBvciAxNikgaXRlbXMuIEkgaGF2ZSBjaG9zZW4gdG8gaW1wbGVtZW50IHRoaXMgbG9vcCB3aXRoIGxhYmVscyBhbmQgICAgICovCisgICAgLyogZ290b3MgdG8gaGVpZ2h0ZW4gdGhlIGVhc2Ugd2l0aCB3aGljaCB0aGUgbG9vcCBtYXkgYmUgaW1wbGVtZW50ZWQgd2l0aCAqLworICAgIC8qIGEgc2luZ2xlIGRlY3JlbWVudCBhbmQgYnJhbmNoIGluc3RydWN0aW9uIGluIGFzc2VtYmx5IGxhbmd1YWdlIGFuZCAgICAgKi8KKyAgICAvKiBhbHNvIGJlY2F1c2UgdGhlIGxhYmVscyBhY3QgYXMgaGlnaGx5IHJlYWRhYmxlIHBsYWNlIG1hcmtlcnMuICAgICAgICAgICovCisgICAgLyogKEFsc28gYmVjYXVzZSB3ZSBqdW1wIGludG8gdGhlIGxvb3AgZm9yIGVuZGdhbWUgbGl0ZXJhbHMgKHNlZSBhYm92ZSkpLiAqLworICAgIAorICAgIGJlZ2luX3Vucm9sbGVkX2xvb3A6CisgICAgCisgICAgICAgLyogVG8gcHJvY2VzcyB0aGUgbmV4dCBwaHJhc2UsIHdlIGhhc2ggdGhlIG5leHQgdGhyZWUgYnl0ZXMgYW5kIHVzZSAgICAqLworICAgICAgIC8qIHRoZSByZXN1bHRhbnQgaGFzaCB0YWJsZSBpbmRleCB0byBsb29rIHVwIHRoZSBoYXNoIHRhYmxlLiBBIHBvaW50ZXIgKi8KKyAgICAgICAvKiB0byB0aGUgZW50cnkgaXMgc3RvcmVkIGluIHBfaDAgc28gYXMgdG8gYXZvaWQgYW4gYXJyYXkgbG9va3VwLiBUaGUgICovCisgICAgICAgLyogaGFzaCB0YWJsZSBlbnRyeSAqcF9oMCBpcyBsb29rZWQgdXAgeWllbGRpbmcgYSBwb2ludGVyIHAgdG8gYSAgICAgICAqLworICAgICAgIC8qIHBvdGVudGlhbCBtYXRjaCBvZiB0aGUgWml2IGluIHRoZSBoaXN0b3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICBpbmRleD1IQVNIKHBfc3JjKTsKKyAgICAgICBwX2gwPSZoYXNoW2luZGV4XTsKKyAgICAgICBwPSpwX2gwOworICAgICAgIAorICAgICAgIC8qIEhhdmluZyBsb29rZWQgdXAgdGhlIGNhbmRpZGF0ZSBwb3NpdGlvbiwgd2UgYXJlIGluIGEgcG9zaXRpb24gdG8gICAgKi8KKyAgICAgICAvKiBhdHRlbXB0IGEgbWF0Y2guIFRoZSBtYXRjaCBsb29wIGhhcyBiZWVuIHVucm9sbGVkIHVzaW5nIHRoZSBQUyAgICAgICovCisgICAgICAgLyogbWFjcm8gc28gdGhhdCBmYWlsdXJlIHdpdGhpbiB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgYXV0b21hdGljYWxseSAgICAqLworICAgICAgIC8qIHJlc3VsdHMgaW4gdGhlIGxpdGVyYWwgYnJhbmNoIGJlaW5nIHRha2VuLiBUaGUgY29kaW5nIGlzIHNpbXBsZS4gICAgKi8KKyAgICAgICAvKiBwX3ppdiBzYXZlcyBwX3NyYyBzbyB3ZSBjYW4gbGV0IHBfc3JjIHdhbmRlci4gICAgICAgICAgICAgICAgICAgICAgICovCisjICAgICAgIGRlZmluZSBQUyAqcCsrIT0qcF9zcmMrKworICAgICAgIHBfeml2PXBfc3JjOworICAgICAgIGlmIChQUyB8fCBQUyB8fCBQUykKKyAgICAgICAgIHsKKyAgICAgICAgICAvKiBMaXRlcmFsLiAqLworICAgICAgICAgIAorICAgICAgICAgIC8qIENvZGUgdGhlIGxpdGVyYWwgYnl0ZSBhcyBpdHNlbGYgYW5kIGEgemVybyBjb250cm9sIGJpdC4gICAgICAgICAgKi8KKyAgICAgICAgICBwX3NyYz1wX3ppdjsgbGl0ZXJhbDogKnBfZHN0Kys9KnBfc3JjKys7IGNvbnRyb2wmPTB4RkZGRUZGRkY7CisgICAgICAgICAgCisgICAgICAgICAgLyogV2UgaGF2ZSBqdXN0IGNvZGVkIGEgbGl0ZXJhbC4gSWYgd2UgaGFkIHR3byBwZW5kaW5nIG9uZXMsIHRoYXQgICAqLworICAgICAgICAgIC8qIG1ha2VzIHRocmVlIGFuZCB3ZSBjYW4gdXBkYXRlIHRoZSBoYXNoIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocF9oMiE9MCkKKyAgICAgICAgICAgICB7KnBfaDI9cF96aXYtMjt9CisgICAgICAgICAgICAgCisgICAgICAgICAgLyogSW4gYW55IGNhc2UsIHJvdGF0ZSB0aGUgaGFzaCB0YWJsZSBwb2ludGVycyBmb3IgbmV4dCB0aW1lLiAqLworICAgICAgICAgIHBfaDI9cF9oMTsgcF9oMT1wX2gwOworICAgICAgICAgIAorICAgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAvKiBDb3B5ICovCisgICAgICAgICAgCisgICAgICAgICAgLyogTWF0Y2ggdXAgdG8gMTUgcmVtYWluaW5nIGJ5dGVzIHVzaW5nIGFuIHVucm9sbGVkIGxvb3AgYW5kIGNvZGUuICovCisjaWYgMAorICAgICAgICAgIFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8CisgICAgICAgICAgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgcF9zcmMrKzsKKyNlbHNlICAgICAKKyAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAhKCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fAorICAgICAgICAgICAgICAgICAgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgKSAKKyAgICAgICAgICAgICApIHBfc3JjKys7CisjZW5kaWYKKyAgICAgICAgICAqcF9kc3QrKz0oKGluZGV4JjB4RjAwKT4+NCl8KC0tcF9zcmMtcF96aXYtMyk7CisgICAgICAgICAgKnBfZHN0Kys9aW5kZXgmMHhGRjsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBBcyB3ZSBoYXZlIGp1c3QgY29kZWQgdGhyZWUgYnl0ZXMsIHdlIGFyZSBub3cgaW4gYSBwb3NpdGlvbiB0byAgICovCisgICAgICAgICAgLyogdXBkYXRlIHRoZSBoYXNoIHRhYmxlIHdpdGggdGhlIGxpdGVyYWwgYnl0ZXMgdGhhdCB3ZXJlIHBlbmRpbmcgICAqLworICAgICAgICAgIC8qIHVwb24gdGhlIGFycml2YWwgb2YgZXh0cmEgY29udGV4dCBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocF9oMSE9MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAocF9oMikKKyAgICAgICAgICAgICAgIHsqcF9oMj1wX3ppdi0yOyBwX2gyPU5VTEw7fQorICAgICAgICAgICAgICpwX2gxPXBfeml2LTE7IHBfaDE9TlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgIC8qIEluIGFueSBjYXNlLCB3ZSBjYW4gdXBkYXRlIHRoZSBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZSBjdXJyZW50ICAgKi8KKyAgICAgICAgICAvKiBwb3NpdGlvbiBhcyB3ZSBqdXN0IGNvZGVkIGF0IGxlYXN0IHRocmVlIGJ5dGVzIGluIGEgY29weSBpdGVtcy4gICovCisgICAgICAgICAgKnBfaDA9cF96aXY7CisgICAgICAgICAgCisgICAgICAgICB9CisgICAgICAgY29udHJvbD4+PTE7CisgICAgICAgICAgICAgICAgCisgICAgICAgLyogVGhpcyBsb29wIGlzIGFsbCBzZXQgdXAgZm9yIGEgZGVjcmVtZW50IGFuZCBqdW1wIGluc3RydWN0aW9uISAqLworI2lmbmRlZiBsaW51eAorYCAgICBlbmRfdW5yb2xsZWRfbG9vcDogaWYgKC0tdW5yb2xsKSBnb3RvIGJlZ2luX3Vucm9sbGVkX2xvb3A7CisjZWxzZQorICAgIC8qIGVuZF91bnJvbGxlZF9sb29wOiAqLyBpZiAoLS11bnJvbGwpIGdvdG8gYmVnaW5fdW5yb2xsZWRfbG9vcDsKKyNlbmRpZgorCisgICAgLyogQXQgdGhpcyBwb2ludCBpdCB3aWxsIG5lYXJseSBhbHdheXMgYmUgdGhlIGVuZCBvZiBhIGdyb3VwIGluIHdoaWNoICAgICAqLworICAgIC8qIGNhc2UsIHdlIGhhdmUgdG8gZG8gc29tZSBjb250cm9sLXdvcmQgcHJvY2Vzc2luZy4gSG93ZXZlciwgbmVhciB0aGUgICAgKi8KKyAgICAvKiBlbmQgb2YgdGhlIGlucHV0IGJsb2NrLCB0aGUgaW5uZXIgdW5yb2xsZWQgbG9vcCBpcyBvbmx5IGV4ZWN1dGVkIG9uY2UuICovCisgICAgLyogVGhpcyBuZWNlc3NpdGF0ZXMgdGhlICdpZicgdGVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICgoY29udHJvbCZUT1BXT1JEKT09MCkKKyAgICAgIHsKKyAgICAgICAvKiBXcml0ZSB0aGUgY29udHJvbCB3b3JkIHRvIHRoZSBwbGFjZSB3ZSBzYXZlZCBmb3IgaXQgaW4gdGhlIG91dHB1dC4gKi8KKyAgICAgICAqcF9jb250cm9sKys9ICBjb250cm9sICAgICAmMHhGRjsKKyAgICAgICAqcF9jb250cm9sICA9IChjb250cm9sPj44KSAmMHhGRjsKKworICAgICAgIC8qIFJlc2VydmUgdGhlIG5leHQgd29yZCBpbiB0aGUgb3V0cHV0IGJsb2NrIGZvciB0aGUgY29udHJvbCB3b3JkICovCisgICAgICAgLyogZm9yIHRoZSBncm91cCBhYm91dCB0byBiZSBwcm9jZXNzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICBwX2NvbnRyb2w9cF9kc3Q7IHBfZHN0Kz0yOworICAgICAgIAorICAgICAgIC8qIFJlc2V0IHRoZSBjb250cm9sIGJpdHMgYnVmZmVyLiAqLworICAgICAgIGNvbnRyb2w9VE9QV09SRDsKKyAgICAgIH0KKyAgICAgICAgICAKKyAgIH0gLyogRW5kIG1haW4gcHJvY2Vzc2luZyBsb29wLiAqLworICAgCisgLyogQWZ0ZXIgdGhlIG1haW4gcHJvY2Vzc2luZyBsb29wIGhhcyBleGVjdXRlZCwgYWxsIHRoZSBpbnB1dCBieXRlcyBoYXZlICAgICAqLworIC8qIGJlZW4gcHJvY2Vzc2VkLiBIb3dldmVyLCB0aGUgY29udHJvbCB3b3JkIGhhcyBzdGlsbCB0byBiZSB3cml0dGVuIHRvIHRoZSAgKi8KKyAvKiB3b3JkIHJlc2VydmVkIGZvciBpdCBpbiB0aGUgb3V0cHV0IGF0IHRoZSBzdGFydCBvZiB0aGUgbW9zdCByZWNlbnQgZ3JvdXAuICovCisgLyogQmVmb3JlIHdyaXRpbmcsIHRoZSBjb250cm9sIHdvcmQgaGFzIHRvIGJlIHNoaWZ0ZWQgc28gdGhhdCBhbGwgdGhlIGJpdHMgICAqLworIC8qIGFyZSBpbiB0aGUgcmlnaHQgcGxhY2UuIFRoZSAiZW1wdHkiIGJpdCBwb3NpdGlvbnMgYXJlIGZpbGxlZCB3aXRoIDFzICAgICAgKi8KKyAvKiB3aGljaCBwYXJ0aWFsbHkgZmlsbCB0aGUgdG9wIHdvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgd2hpbGUoY29udHJvbCZUT1BXT1JEKSBjb250cm9sPj49MTsKKyAqcF9jb250cm9sKys9IGNvbnRyb2wgICAgICYweEZGOworICpwX2NvbnRyb2wrKz0oY29udHJvbD4+OCkgJjB4RkY7CisgCisgLyogSWYgdGhlIGxhc3QgZ3JvdXAgY29udGFpbmVkIG5vIGl0ZW1zLCBkZWxldGUgdGhlIGNvbnRyb2wgd29yZCB0b28uICAgICAgICAqLworIGlmIChwX2NvbnRyb2w9PXBfZHN0KSBwX2RzdC09MjsKKyAKKyAvKiBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgYmxvY2sgdG8gdGhlIGRzdF9sZW4gcGFyYW1ldGVyIGFuZCByZXR1cm4uICovCisgKnBfZHN0X2xlbj1wX2RzdC1wX2RzdF9maXJzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyByZXR1cm47CisgCisgLyogSnVtcCBoZXJlIGFzIHNvb24gYXMgYW4gb3ZlcnJ1biBpcyBkZXRlY3RlZC4gQW4gb3ZlcnJ1biBpcyBkZWZpbmVkIHRvICAgICAqLworIC8qIGhhdmUgb2NjdXJyZWQgaWYgcF9kc3Q+cF9kc3RfZmlyc3Qrc3JjX2xlbi4gVGhhdCBpcywgdGhlIG1vbWVudCB0aGUgICAgICAgKi8KKyAvKiBsZW5ndGggb2YgdGhlIG91dHB1dCB3cml0dGVuIHNvIGZhciBleGNlZWRzIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGJsb2NrLiovCisgLyogVGhlIGFsZ29yaXRobSBjaGVja3MgZm9yIG92ZXJydW5zIGF0IGxlYXN0IGF0IHRoZSBlbmQgb2YgZWFjaCBncm91cCAgICAgICAqLworIC8qIHdoaWNoIG1lYW5zIHRoYXQgdGhlIG1heGltdW0gb3ZlcnJ1biBpcyBNQVhfQ01QX0dST1VQIGJ5dGVzLiAgICAgICAgICAgICAgKi8KKyAvKiBPbmNlIGFuIG92ZXJydW4gb2NjdXJzLCB0aGUgb25seSB0aGluZyB0byBkbyBpcyB0byBzZXQgdGhlIGNvcHkgZmxhZyBhbmQgICovCisgLyogY29weSB0aGUgaW5wdXQgb3Zlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIG92ZXJydW46CisjaWYgMAorICpwX2RzdF9maXJzdD1GTEFHX0NPUFk7CisgZmFzdF9jb3B5KHBfc3JjX2ZpcnN0LHBfZHN0X2ZpcnN0K0ZMQUdfQllURVMsc3JjX2xlbik7CisgKnBfZHN0X2xlbj1zcmNfbGVuK0ZMQUdfQllURVM7CisjZWxzZQorIGZhc3RfY29weShwX3NyY19maXJzdCxwX2RzdF9maXJzdCxzcmNfbGVuKTsKKyAqcF9kc3RfbGVuPSAtc3JjX2xlbjsgLyogcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIHRvIGluZGljYXRlIHVuY29tcHJlc3NlZCBkYXRhICovCisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5wdXQgIDogSGFuZCBvdmVyIHRoZSByZXF1aXJlZCBhbW91bnQgb2Ygd29ya2luZyBtZW1vcnkgaW4gcF93cmtfbWVtLiAgICAgKi8KKy8qIElucHV0ICA6IFNwZWNpZnkgaW5wdXQgYmxvY2sgdXNpbmcgcF9zcmNfZmlyc3QgYW5kIHNyY19sZW4uICAgICAgICAgICAgICAgICovCisvKiBJbnB1dCAgOiBQb2ludCBwX2RzdF9maXJzdCB0byB0aGUgc3RhcnQgb2YgdGhlIG91dHB1dCB6b25lLiAgICAgICAgICAgICAgICAqLworLyogSW5wdXQgIDogUG9pbnQgcF9kc3RfbGVuIHRvIGEgVUxPTkcgdG8gcmVjZWl2ZSB0aGUgb3V0cHV0IGxlbmd0aC4gICAgICAgICAgKi8KKy8qIElucHV0ICA6IElucHV0IGJsb2NrIGFuZCBvdXRwdXQgem9uZSBtdXN0IG5vdCBvdmVybGFwLiBVc2VyIGtub3dzICAgICAgICAgICovCisvKiBJbnB1dCAgOiB1cHBlcmJvdW5kIG9uIG91dHB1dCBibG9jayBsZW5ndGggZnJvbSBlYXJsaWVyIGNvbXByZXNzaW9uLiAgICAgICAqLworLyogSW5wdXQgIDogSW4gYW55IGNhc2UsIG1heGltdW0gZXhwYW5zaW9uIHBvc3NpYmxlIGlzIG5pbmUgdGltZXMuICAgICAgICAgICAgKi8KKy8qIE91dHB1dCA6IExlbmd0aCBvZiBvdXRwdXQgYmxvY2sgd3JpdHRlbiB0byAqcF9kc3RfbGVuLiAgICAgICAgICAgICAgICAgICAgICovCisvKiBPdXRwdXQgOiBPdXRwdXQgYmxvY2sgaW4gTWVtW3BfZHN0X2ZpcnN0Li5wX2RzdF9maXJzdCsqcF9kc3RfbGVuLTFdLiAgICAgICAqLworLyogT3V0cHV0IDogV3JpdGVzIG9ubHkgIGluIE1lbVtwX2RzdF9maXJzdC4ucF9kc3RfZmlyc3QrKnBfZHN0X2xlbi0xXS4gICAgICAgKi8KK0xPQ0FMIHZvaWQgY29tcHJlc3NfZGVjb21wcmVzcyggVUJZVEUgKnBfd3JrX21lbSwKKwkJCQlVQllURSAqcF9zcmNfZmlyc3QsIExPTkcgICBzcmNfbGVuLAorCQkJCVVCWVRFICpwX2RzdF9maXJzdCwgVUxPTkcgKnBfZHN0X2xlbikKK3sKKyAvKiBCeXRlIHBvaW50ZXJzIHBfc3JjIGFuZCBwX2RzdCBzY2FuIHRocm91Z2ggdGhlIGlucHV0IGFuZCBvdXRwdXQgYmxvY2tzLiAgICovCisgcmVnaXN0ZXIgVUJZVEUgKnBfc3JjID0gcF9zcmNfZmlyc3QrRkxBR19CWVRFUzsKKyByZWdpc3RlciBVQllURSAqcF9kc3QgPSBwX2RzdF9maXJzdDsKKyAvKiB3ZSBuZWVkIHRvIGF2b2lkIGEgU0VHViB3aGVuIHRyeWluZyB0byB1bmNvbXByZXNzIGNvcnJ1cHQgZGF0YSAqLworIHJlZ2lzdGVyIFVCWVRFICpwX2RzdF9wb3N0ID0gcF9kc3RfZmlyc3QgKyAqcF9kc3RfbGVuOworCisgLyogVGhlIGZvbGxvd2luZyB0d28gdmFyaWFibGVzIGFyZSBuZXZlciBtb2RpZmllZCBhbmQgYXJlIHVzZWQgdG8gY29udHJvbCAgICAqLworIC8qIHRoZSBtYWluIGxvb3AuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyBVQllURSAqcF9zcmNfcG9zdCAgPSBwX3NyY19maXJzdCtzcmNfbGVuOworIFVCWVRFICpwX3NyY19tYXgxNiA9IHBfc3JjX2ZpcnN0K3NyY19sZW4tKE1BWF9DTVBfR1JPVVAtMik7CisgCisgLyogVGhlIGhhc2ggdGFibGUgaXMgdGhlIG9ubHkgcmVzaWRlbnQgb2YgdGhlIHdvcmtpbmcgbWVtb3J5LiBUaGUgaGFzaCB0YWJsZSAqLworIC8qIGNvbnRhaW5zIEhBU0hfVEFCTEVfTEVOR1RIPTQwOTYgcG9pbnRlcnMgdG8gcG9zaXRpb25zIGluIHRoZSBoaXN0b3J5LiBUbyAgKi8KKyAvKiBrZWVwIE1hY2ludG9zaGVzIGhhcHB5LCBpdCBpcyBsb25nd29yZCBhbGlnbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgVUJZVEUgKipoYXNoID0gKFVCWVRFICoqKSBVTE9OR19BTElHTl9VUChwX3dya19tZW0pOworCisgLyogVGhlIHZhcmlhYmxlICdjb250cm9sJyBpcyB1c2VkIHRvIGJ1ZmZlciB0aGUgY29udHJvbCBiaXRzIHdoaWNoIGFwcGVhciBpbiAqLworIC8qIGdyb3VwcyBvZiAxNiBiaXRzIChjb250cm9sIHdvcmRzKSBhdCB0aGUgc3RhcnQgb2YgZWFjaCBjb21wcmVzc2VkIGdyb3VwLiAgKi8KKyAvKiBXaGVuIGVhY2ggZ3JvdXAgaXMgcmVhZCwgYml0IDE2IG9mIHRoZSByZWdpc3RlciBpcyBzZXQgdG8gb25lLiBXaGVuZXZlciAgICovCisgLyogYSBuZXcgYml0IGlzIG5lZWRlZCwgdGhlIHJlZ2lzdGVyIGlzIHNoaWZ0ZWQgcmlnaHQuIFdoZW4gdGhlIHZhbHVlIG9mIHRoZSAqLworIC8qIHJlZ2lzdGVyIGJlY29tZXMgMSwgd2Uga25vdyB0aGF0IHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIGEgZ3JvdXAuICAgICAgKi8KKyAvKiBJbml0aWFsaXppbmcgdGhlIHJlZ2lzdGVyIHRvIDEgdGh1cyBpbnN0cnVjdHMgdGhlIGNvZGUgdG8gZm9sbG93IHRoYXQgaXQgICovCisgLyogc2hvdWxkIHJlYWQgYSBuZXcgY29udHJvbCB3b3JkIGltbWVkaWF0ZWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIHJlZ2lzdGVyIFVMT05HIGNvbnRyb2w9MTsKKyAKKyAvKiBUaGUgdmFsdWUgb2YgJ2xpdGVyYWxzJyBpcyBhbHdheXMgaW4gdGhlIHJhbmdlIDAuLjMuIEl0IGlzIHRoZSBudW1iZXIgb2YgICovCisgLyogY29uc2VjdXRpdmUgbGl0ZXJhbCBpdGVtcyBqdXN0IHNlZW4uIFdlIGhhdmUgdG8gcmVjb3JkIHRoaXMgbnVtYmVyIHNvIGFzICAqLworIC8qIHRvIGtub3cgd2hlbiB0byB1cGRhdGUgdGhlIGhhc2ggdGFibGUuIFdoZW4gbGl0ZXJhbHMgZ2V0cyB0byAzLCB0aGVyZSAgICAgKi8KKyAvKiBoYXZlIGJlZW4gdGhyZWUgY29uc2VjdXRpdmUgbGl0ZXJhbHMgYW5kIHdlIGNhbiB1cGRhdGUgYXQgdGhlIHBvc2l0aW9uIG9mICovCisgLyogdGhlIG9sZGVzdCBvZiB0aGUgdGhyZWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIHJlZ2lzdGVyIFVXT1JEIGxpdGVyYWxzPTA7CisgCisgLyogQ2hlY2sgdGhlIGxlYWRpbmcgY29weSBmbGFnIHRvIHNlZSBpZiB0aGUgY29tcHJlc3NvciBjaG9zZSB0byB1c2UgYSBjb3B5ICAqLworIC8qIG9wZXJhdGlvbiBpbnN0ZWFkIG9mIGEgY29tcHJlc3Npb24gb3BlcmF0aW9uLiBJZiBhIGNvcHkgb3BlcmF0aW9uIHdhcyAgICAgKi8KKyAvKiB1c2VkLCB0aGVuIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGNvcHkgdGhlIGRhdGEgb3Zlciwgc2V0IHRoZSBvdXRwdXQgbGVuZ3RoICovCisgLyogYW5kIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIDAKKyBpZiAoKnBfc3JjX2ZpcnN0PT1GTEFHX0NPUFkpCisgICB7CisgICAgZmFzdF9jb3B5KHBfc3JjX2ZpcnN0K0ZMQUdfQllURVMscF9kc3RfZmlyc3Qsc3JjX2xlbi1GTEFHX0JZVEVTKTsKKyAgICAqcF9kc3RfbGVuPXNyY19sZW4tRkxBR19CWVRFUzsKKyAgICByZXR1cm47CisgICB9CisjZWxzZQorICBpZiAoIHNyY19sZW4gPCAwICkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBmYXN0X2NvcHkocF9zcmNfZmlyc3QscF9kc3RfZmlyc3QsLXNyY19sZW4gKTsKKyAgICpwX2RzdF9sZW4gPSAoVUxPTkcpLXNyY19sZW47CisgICByZXR1cm47CisgIH0KKyNlbmRpZgorICAgCisgLyogSW5pdGlhbGl6ZSBhbGwgZWxlbWVudHMgb2YgdGhlIGhhc2ggdGFibGUgdG8gcG9pbnQgdG8gYSBjb25zdGFudCBzdHJpbmcuICAqLworIC8qIFVzZSBvZiBhbiB1bnJvbGxlZCBsb29wIHNwZWVkcyB0aGlzIHVwIGNvbnNpZGVyYWJseS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyB7VVdPUkQgaTsgVUJZVEUgKipwX2g9aGFzaDsKKyMgIGRlZmluZSBaSiAqcF9oKys9U1RBUlRfU1RSSU5HXzE4CisgIGZvciAoaT0wO2k8MjU2O2krKykgICAgIC8qIDI1Nj1IQVNIX1RBQkxFX0xFTkdUSC8xNi4gKi8KKyAgICB7Wko7Wko7Wko7Wko7CisgICAgIFpKO1pKO1pKO1pKOworICAgICBaSjtaSjtaSjtaSjsKKyAgICAgWko7Wko7Wko7Wko7fQorIH0KKworIC8qIFRoZSBvdXRlciBsb29wIHByb2Nlc3NlcyBlaXRoZXIgMSBvciAxNiBpdGVtcyBwZXIgaXRlcmF0aW9uIGRlcGVuZGluZyBvbiAgKi8KKyAvKiBob3cgY2xvc2UgcF9zcmMgaXMgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICAgICovCisgd2hpbGUgKHBfc3JjIT1wX3NyY19wb3N0KQorICAgey8qIFN0YXJ0IG9mIG91dGVyIGxvb3AgKi8KKyAgIAorICAgIHJlZ2lzdGVyIFVXT1JEIHVucm9sbDsgICAvKiBDb3VudHMgdW5yb2xsZWQgbG9vcCBleGVjdXRpb25zLiAgICAgICAgICAgICAgKi8KKyAgICAKKyAgICAvKiBXaGVuICdjb250cm9sJyBoYXMgdGhlIHZhbHVlIDEsIGl0IG1lYW5zIHRoYXQgdGhlIDE2IGJ1ZmZlcmVkIGNvbnRyb2wgICovCisgICAgLyogYml0cyB0aGF0IHdlcmUgcmVhZCBpbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZ3JvdXAgaGF2ZSBhbGwgYmVlbiAqLworICAgIC8qIHNoaWZ0ZWQgb3V0IGFuZCB0aGF0IGFsbCB0aGF0IGlzIGxlZnQgaXMgdGhlIDEgYml0IHRoYXQgd2FzIGluamVjdGVkICAgKi8KKyAgICAvKiBpbnRvIGJpdCAxNiBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZ3JvdXAuIFdoZW4gd2UgcmVhY2ggdGhlIGVuZCAgICovCisgICAgLyogb2YgYSBncm91cCwgd2UgaGF2ZSB0byBsb2FkIGEgbmV3IGNvbnRyb2wgd29yZCBhbmQgaW5qZWN0IGEgbmV3IDEgYml0LiAqLworICAgIGlmIChjb250cm9sPT0xKQorICAgICAgeworICAgICAgIGNvbnRyb2w9MHgxMDAwMHwqcF9zcmMrKzsKKyAgICAgICBjb250cm9sfD0oKnBfc3JjKyspPDw4OworICAgICAgfQorCisgICAgLyogSWYgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBhcmUgd2l0aGluIDE2IGdyb3VwcyBmcm9tIHRoZSBlbmQgb2YgdGhlICAgICAqLworICAgIC8qIGlucHV0LCBleGVjdXRlIHRoZSB1bnJvbGxlZCBsb29wIG9ubHkgb25jZSwgZWxzZSBwcm9jZXNzIGEgd2hvbGUgZ3JvdXAgKi8KKyAgICAvKiBvZiAxNiBpdGVtcyBieSBsb29waW5nIDE2IHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5yb2xsPSBwX3NyYzw9cF9zcmNfbWF4MTYgPyAxNiA6IDE7CisKKyAgICAvKiBUaGlzIGlubmVyIGxvb3AgcHJvY2Vzc2VzIG9uZSBwaHJhc2UgKGl0ZW0pIHBlciBpdGVyYXRpb24uICovCisgICAgd2hpbGUgKHVucm9sbC0tKQorICAgICAgeyAvKiBCZWdpbiB1bnJvbGxlZCBpbm5lciBsb29wLiAqLworICAgICAgCisgICAgICAgLyogUHJvY2VzcyBhIGxpdGVyYWwgb3IgY29weSBpdGVtIGRlcGVuZGluZyBvbiB0aGUgbmV4dCBjb250cm9sIGJpdC4gKi8KKyAgICAgICBpZiAoY29udHJvbCYxKQorICAgICAgICAgeworICAgICAgICAgIC8qIENvcHkgaXRlbS4gKi8KKyAgICAgICAgICAKKyAgICAgICAgICByZWdpc3RlciBVQllURSAqcDsgICAgICAgICAgIC8qIFBvaW50cyB0byBwbGFjZSBmcm9tIHdoaWNoIHRvIGNvcHkuICovCisgICAgICAgICAgcmVnaXN0ZXIgVVdPUkQgbGVubXQ7ICAgICAgICAvKiBMZW5ndGggb2YgY29weSBpdGVtIG1pbnVzIHRocmVlLiAgICAqLworICAgICAgICAgIHJlZ2lzdGVyIFVCWVRFICoqcF9odGU7ICAgICAgLyogUG9pbnRlciB0byBjdXJyZW50IGhhc2ggdGFibGUgZW50cnkuKi8KKyAgICAgICAgICByZWdpc3RlciBVQllURSAqcF96aXY9cF9kc3Q7IC8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgY3VycmVudCBaaXYuICAgICovCisgICAgICAgICAgCisgICAgICAgICAgLyogUmVhZCBhbmQgZGlzbWFudGxlIHRoZSBjb3B5IHdvcmQuIFdvcmsgb3V0IGZyb20gd2hlcmUgdG8gY29weS4gICAqLworICAgICAgICAgIGxlbm10PSpwX3NyYysrOworICAgICAgICAgIHBfaHRlPSZoYXNoWygobGVubXQmMHhGMCk8PDQpfCpwX3NyYysrXTsKKyAgICAgICAgICBwPSpwX2h0ZTsKKyAgICAgICAgICBsZW5tdCY9MHhGOworICAgICAgICAgIAorICAgICAgICAgIC8qIE5vdyBwZXJmb3JtIHRoZSBjb3B5IHVzaW5nIGEgaGFsZiB1bnJvbGxlZCBsb29wLiAqLworICAgICAgICAgICpwX2RzdCsrPSpwKys7CisgICAgICAgICAgKnBfZHN0Kys9KnArKzsKKyAgICAgICAgICAqcF9kc3QrKz0qcCsrOworICAgICAgICAgIHdoaWxlIChsZW5tdC0tKQorICAgICAgICAgICAgICpwX2RzdCsrPSpwKys7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgIC8qIEJlY2F1c2Ugd2UgaGF2ZSBqdXN0IHJlY2VpdmVkIDMgb3IgbW9yZSBieXRlcyBpbiBhIGNvcHkgaXRlbSAgICAgKi8KKyAgICAgICAgICAvKiAod2hvc2UgYnl0ZXMgd2UgaGF2ZSBqdXN0IGluc3RhbGxlZCBpbiB0aGUgb3V0cHV0KSwgd2UgYXJlIG5vdyAgICovCisgICAgICAgICAgLyogaW4gYSBwb3NpdGlvbiB0byBmbHVzaCBhbGwgdGhlIHBlbmRpbmcgbGl0ZXJhbCBoYXNoaW5ncyB0aGF0IGhhZCAqLworICAgICAgICAgIC8qIGJlZW4gcG9zdHBvbmVkIGZvciBsYWNrIG9mIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAobGl0ZXJhbHM+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICByZWdpc3RlciBVQllURSAqcj1wX3ppdi1saXRlcmFsczsKKyAgICAgICAgICAgICBoYXNoW0hBU0gocildPXI7CisgICAgICAgICAgICAgaWYgKGxpdGVyYWxzPT0yKQorICAgICAgICAgICAgICAgIHtyKys7IGhhc2hbSEFTSChyKV09cjt9CisgICAgICAgICAgICAgbGl0ZXJhbHM9MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgIC8qIEluIGFueSBjYXNlLCB3ZSBjYW4gaW1tZWRpYXRlbHkgdXBkYXRlIHRoZSBoYXNoIHRhYmxlIHdpdGggdGhlICAgKi8KKyAgICAgICAgICAvKiBjdXJyZW50IHBvc2l0aW9uLiBXZSBkb24ndCBuZWVkIHRvIGRvIGEgSEFTSCguLi4pIHRvIHdvcmsgb3V0ICAgICovCisgICAgICAgICAgLyogd2hlcmUgdG8gcHV0IHRoZSBwb2ludGVyLCBhcyB0aGUgY29tcHJlc3NvciBqdXN0IHRvbGQgdXMhISEgICAgICAqLworICAgICAgICAgICpwX2h0ZT1wX3ppdjsKKyAgICAgICAgICAKKyAgICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgLyogTGl0ZXJhbCBpdGVtLiAqLworICAgICAgICAgIAorICAgICAgICAgIC8qIENvcHkgb3ZlciB0aGUgbGl0ZXJhbCBieXRlLiAqLworICAgICAgICAgICpwX2RzdCsrPSpwX3NyYysrOworICAgICAgICAgIAorICAgICAgICAgIC8qIElmIHdlIG5vdyBoYXZlIHRocmVlIGxpdGVyYWxzIHdhaXRpbmcgdG8gYmUgaGFzaGVkIGludG8gdGhlIGhhc2ggKi8KKyAgICAgICAgICAvKiB0YWJsZSwgd2UgY2FuIGRvIG9uZSBvZiB0aGVtIG5vdyAoYmVjYXVzZSB0aGVyZSBhcmUgdGhyZWUpLiAgICAgICovCisgICAgICAgICAgaWYgKCsrbGl0ZXJhbHMgPT0gMykKKyAgICAgICAgICAgICB7cmVnaXN0ZXIgVUJZVEUgKnA9cF9kc3QtMzsgaGFzaFtIQVNIKHApXT1wOyBsaXRlcmFscz0yO30KKyAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAvKiBTaGlmdCB0aGUgY29udHJvbCBidWZmZXIgc28gdGhlIG5leHQgY29udHJvbCBiaXQgaXMgaW4gYml0IDAuICovCisgICAgICAgY29udHJvbD4+PTE7CisjaWYgMQorICAgICAgIGlmIChwX2RzdCA+IHBfZHN0X3Bvc3QpIAorICAgICAgIHsKKwkgICAgICAgLyogU2hpdDogd2UgdHJpZWQgdG8gZGVjb21wcmVzcyBjb3JydXB0IGRhdGEgKi8KKwkgICAgICAgKnBfZHN0X2xlbiA9IDA7CisJICAgICAgIHJldHVybjsKKyAgICAgICB9CisjZW5kaWYKKyAgICAgIH0gLyogRW5kIHVucm9sbGVkIGlubmVyIGxvb3AuICovCisgICAgICAgICAgICAgICAKKyAgIH0gLyogRW5kIG9mIG91dGVyIGxvb3AgKi8KKyAgIAorIC8qIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIGRlY29tcHJlc3NlZCBkYXRhIGJlZm9yZSByZXR1cm5pbmcuICovCisgICpwX2RzdF9sZW49cF9kc3QtcF9kc3RfZmlyc3Q7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmQgb2YgTFpSVzMuQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL2x6cnczLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci9senJ3My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzM2ZlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci9senJ3My5oCkBAIC0wLDAgKzEsMjUzIEBACisjaWZuZGVmIF9MWlJXM19ICisjZGVmaW5lIF9MWlJXM19ICisvKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4xICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjEyOjMwICQKKyAqCisgKiAgaW5jbHVkZSBmaWxlcyBmb3IgbHpydzMuIE9ubHkgc2xpZ2h0eSBtb2RpZmllZCBmcm9tIHRoZSBvcmlnaW5hbAorICogIHZlcnNpb24uIEFzc2VtYmxlcyB0aGUgdGhyZWUgaW5jbHVkZSBmaWxlcyBjb21wcmVzcy5oLCBwb3J0LmggYW5kCisgKiAgZmFzdGNvcHkuaCBmcm9tIHRoZSBvcmlnaW5hbCBsenJ3MyBwYWNrYWdlLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBSRVNTLkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXV0aG9yIDogUm9zcyBXaWxsaWFtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERhdGUgICA6IERlY2VtYmVyIDE5ODkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gYSBzZXQgb2YgZnVuY3Rpb25zIGNhbGxlZCAgICAgICAgKi8KKy8qICdjb21wcmVzcycsIGVhY2ggbWVtYmVyIG9mIHdoaWNoIGltcGxlbWVudHMgYSBwYXJ0aWN1bGFyIGRhdGEgY29tcHJlc3Npb24gICovCisvKiBhbGdvcml0aG0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vcm1hbGx5IGluIEMgcHJvZ3JhbW1pbmcsIGZvciBlYWNoIC5IIGZpbGUsIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyAuQyAgICovCisvKiBmaWxlIHRoYXQgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25zIHByb21pc2VkIGluIHRoZSAuSCBmaWxlLiAgICAgICAgICAgICAgICAqLworLyogSGVyZSwgdGhlcmUgYXJlIG1hbnkgLkMgZmlsZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIGhlYWRlciBmaWxlLiAgICAgICAgICAgKi8KKy8qIEVhY2ggY29tZm9ybWluZyBpbXBsZW1lbnRhdGlvbiBmaWxlIGNvbnRhaW5zIGEgc2luZ2xlIGZ1bmN0aW9uICAgICAgICAgICAgICovCisvKiBjYWxsZWQgJ2NvbXByZXNzJyB0aGF0IGltcGxlbWVudHMgYSBzaW5nbGUgZGF0YSBjb21wcmVzc2lvbiAgICAgICAgICAgICAgICAqLworLyogYWxnb3JpdGhtIHRoYXQgY29uZm9ybXMgd2l0aCB0aGUgaW50ZXJmYWNlIHNwZWNpZmllZCBpbiB0aGlzIGhlYWRlciBmaWxlLiAgKi8KKy8qIE9ubHkgb25lIGFsZ29yaXRobSBjYW4gYmUgbGlua2VkIGluIGF0IGEgdGltZSBpbiB0aGlzIG9yZ2FuaXphdGlvbi4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgREVGSU5JVElPTiBPRiBGVU5DVElPTiBDT01QUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBTdW1tYXJ5IG9mIEZ1bmN0aW9uIENvbXByZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBhY3Rpb24gdGhhdCAnY29tcHJlc3MnIHRha2VzIGRlcGVuZHMgb24gaXRzIGZpcnN0IGFyZ3VtZW50IGNhbGxlZCAgICAgICovCisvKiAnYWN0aW9uJy4gIFRoZSBmdW5jdGlvbiBwcm92aWRlcyB0aHJlZSBhY3Rpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIC0gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhbGdvcml0aG0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAtIENvbXByZXNzICAgYSBibG9jayBvZiBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgLSBEZWNvbXByZXNzIGEgYmxvY2sgb2YgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFNlZSB0aGUgZm9ybWFsIEMgZGVmaW5pdGlvbiBsYXRlciBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVycy4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ29uc3RhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBDT01QUkVTU19PVkVSUlVOOiBUaGUgY29uc3RhbnQgQ09NUFJFU1NfT1ZFUlJVTiBkZWZpbmVzIGJ5IGhvdyBtYW55IGJ5dGVzICAqLworLyogYW4gYWxnb3JpdGhtIGlzIGFsbG93ZWQgdG8gZXhwYW5kIGEgYmxvY2sgZHVyaW5nIGEgY29tcHJlc3Npb24gb3BlcmF0aW9uLiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBbHRob3VnaCBjb21wcmVzc2lvbiBhbGdvcml0aG1zIHVzdWFsbHkgY29tcHJlc3MgZGF0YSwgdGhlcmUgd2lsbCBhbHdheXMgICAqLworLyogYmUgZGF0YSB0aGF0IGEgZ2l2ZW4gY29tcHJlc3NvciB3aWxsIGV4cGFuZCAodGhpcyBjYW4gYmUgcHJvdmVuKS4gICAgICAgICAgKi8KKy8qIEZvcnR1bmF0ZWx5LCB0aGUgZGVncmVlIG9mIGV4cGFuc2lvbiBjYW4gYmUgbGltaXRlZCB0byBhIHNpbmdsZSBiaXQsIGJ5ICAgICovCisvKiBjb3B5aW5nIG92ZXIgdGhlIGlucHV0IGRhdGEgaWYgdGhlIGRhdGEgZ2V0cyBiaWdnZXIgZHVyaW5nIGNvbXByZXNzaW9uLiAgICAqLworLyogVG8gYWxsb3cgZm9yIHRoaXMgcG9zc2liaWxpdHksIHRoZSBmaXJzdCBiaXQgb2YgYSBjb21wcmVzc2VkICAgICAgICAgICAgICAgKi8KKy8qIHJlcHJlc2VudGF0aW9uIGNhbiBiZSB1c2VkIGFzIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlICAgICAgICAgICAgICAgICovCisvKiBpbnB1dCBkYXRhIHdhcyBjb3BpZWQgb3Zlciwgb3IgdHJ1bHkgY29tcHJlc3NlZC4gSW4gcHJhY3RpY2UsIHRoZSBmaXJzdCAgICAqLworLyogYnl0ZSB3b3VsZCBiZSB1c2VkIHRvIHN0b3JlIHRoaXMgYml0IHNvIGFzIHRvIG1haW50YWluIGJ5dGUgYWxpZ25tZW50LiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbmZvcnR1bmF0ZWx5LCBpbiBnZW5lcmFsLCB0aGUgb25seSB3YXkgdG8gdGVsbCBpZiBhbiBhbGdvcml0aG0gd2lsbCAgICAgICAqLworLyogZXhwYW5kIGEgcGFydGljdWxhciBibG9jayBvZiBkYXRhIGlzIHRvIHJ1biB0aGUgYWxnb3JpdGhtIG9uIHRoZSBkYXRhLiAgICAgKi8KKy8qIElmIHRoZSBhbGdvcml0aG0gZG9lcyBub3QgY29udGludW91c2x5IG1vbml0b3IgaG93IG1hbnkgb3V0cHV0IGJ5dGVzIGl0ICAgICovCisvKiBoYXMgd3JpdHRlbiwgaXQgbWlnaHQgd3JpdGUgYW4gb3V0cHV0IGJsb2NrIGZhciBsYXJnZXIgdGhhbiB0aGUgaW5wdXQgICAgICAqLworLyogYmxvY2sgYmVmb3JlIHJlYWxpemluZyB0aGF0IGl0IGhhcyBkb25lIHNvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9uIHRoZSBvdGhlciBoYW5kLCBjb250aW51b3VzIGNoZWNrcyBvbiBvdXRwdXQgbGVuZ3RoIGFyZSBpbmVmZmljaWVudC4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVG8gY2F0ZXIgZm9yIGFsbCB0aGVzZSBwcm9ibGVtcywgdGhpcyBpbnRlcmZhY2UgZGVmaW5pdGlvbjogICAgICAgICAgICAgICAgKi8KKy8qID4gQWxsb3dzIGEgY29tcHJlc3Npb24gYWxnb3JpdGhtIHRvIHJldHVybiBhbiBvdXRwdXQgYmxvY2sgdGhhdCBpcyB1cCB0byAgICovCisvKiAgIENPTVBSRVNTX09WRVJSVU4gYnl0ZXMgbG9uZ2VyIHRoYW4gdGhlIGlucHV0IGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBBbGxvd3MgYSBjb21wcmVzc2lvbiBhbGdvcml0aG0gdG8gd3JpdGUgdXAgdG8gQ09NUFJFU1NfT1ZFUlJVTiBieXRlcyAgICAgKi8KKy8qICAgbW9yZSB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGJsb2NrIHRvIHRoZSBtZW1vcnkgb2YgdGhlIG91dHB1dCAgICAgICovCisvKiAgIGJsb2NrIHJlZ2FyZGxlc3Mgb2YgdGhlIGxlbmd0aCBvZiB0aGUgb3V0cHV0IGJsb2NrIGV2ZW50dWFsbHkgcmV0dXJuZWQuICAqLworLyogICBUaGlzIGFsbG93cyBhbiBhbGdvcml0aG0gdG8gb3ZlcnJ1biB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgKi8KKy8qICAgb3V0cHV0IGJsb2NrIGJ5IHVwIHRvIENPTVBSRVNTX09WRVJSVU4gYnl0ZXMgYmV0d2VlbiBleHBhbnNpb24gY2hlY2tzLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIHByb2JsZW0gZG9lcyBub3QgYXJpc2UgZm9yIGRlY29tcHJlc3Npb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJZGVudGl0eSBBY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gYWN0aW9uIG11c3QgYmUgQ09NUFJFU1NfQUNUSU9OX0lERU5USVRZLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IHBfZHN0X2xlbiBtdXN0IHBvaW50IHRvIGEgbG9uZ3dvcmQgdG8gcmVjZWl2ZSBhIGxvbmd3b3JkIGFkZHJlc3MuICAgICAgICAqLworLyogPiBUaGUgdmFsdWUgb2YgdGhlIG90aGVyIHBhcmFtZXRlcnMgZG9lcyBub3QgbWF0dGVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gQWZ0ZXIgZXhlY3V0aW9uLCB0aGUgbG9uZ3dvcmQgdGhhdCBwX2RzdF9sZW4gcG9pbnRzIHRvIHdpbGwgYmUgYSBwb2ludGVyICovCisvKiAgIHRvIGEgc3RydWN0dXJlIG9mIHR5cGUgY29tcHJlc3NfaWRlbnRpdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaHVzLCBmb3IgZXhhbXBsZSwgYWZ0ZXIgdGhlIGNhbGwsICgqcF9kc3RfbGVuKS0+bWVtb3J5IHdpbGwgcmV0dXJuIHRoZSAgKi8KKy8qICAgbnVtYmVyIG9mIGJ5dGVzIG9mIHdvcmtpbmcgbWVtb3J5IHRoYXQgdGhlIGFsZ29yaXRobSByZXF1aXJlcyB0byBydW4uICAgICovCisvKiA+IFRoZSB2YWx1ZXMgb2YgdGhlIGlkZW50aXR5IHN0cnVjdHVyZSByZXR1cm5lZCBhcmUgZml4ZWQgY29uc3RhbnQgICAgICAgICAqLworLyogICBhdHRyaWJ1dGVzIG9mIHRoZSBhbGdvcml0aG0gYW5kIG11c3Qgbm90IHZhcnkgZnJvbSBjYWxsIHRvIGNhbGwuICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBDb21tb24gUmVxdWlyZW1lbnRzIGZvciBDb21wcmVzc2lvbiBhbmQgRGVjb21wcmVzc2lvbiBBY3Rpb25zICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgKi8KKy8qID4gd3JrX21lbSBtdXN0IHBvaW50IHRvIGFuIHVudXNlZCBibG9jayBvZiBtZW1vcnkgb2YgYSBsZW5ndGggc3BlY2lmaWVkIGluICovCisvKiAgIHRoZSBhbGdvcml0aG0ncyBpZGVudGl0eSBibG9jay4gVGhlIGlkZW50aXR5IGJsb2NrIGNhbiBiZSBvYnRhaW5lZCBieSAgICAqLworLyogICBtYWtpbmcgYSBzZXBhcmF0ZSBjYWxsIHRvIGNvbXByZXNzLCBzcGVjaWZ5aW5nIHRoZSBpZGVudGl0eSBhY3Rpb24uICAgICAgKi8KKy8qID4gVGhlIElOUFVUIEJMT0NLIGlzIGRlZmluZWQgdG8gYmUgTWVtb3J5W3NyY19hZGRyLHNyY19hZGRyK3NyY19sZW4tMV0uICAgICovCisvKiA+IGRzdF9sZW4gd2lsbCBiZSB1c2VkIHRvIGRlbm90ZSAqcF9kc3RfbGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBkc3RfbGVuIGlzIG5vdCByZWFkIGJ5IGNvbXByZXNzLCBvbmx5IHdyaXR0ZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gVGhlIHZhbHVlIG9mIGRzdF9sZW4gaXMgZGVmaW5lZCBvbmx5IHVwb24gdGVybWluYXRpb24uICAgICAgICAgICAgICAgICAgICovCisvKiA+IFRoZSBPVVRQVVQgQkxPQ0sgaXMgZGVmaW5lZCB0byBiZSBNZW1vcnlbZHN0X2FkZHIsZHN0X2FkZHIrZHN0X2xlbi0xXS4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENvbXByZXNzaW9uIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBhY3Rpb24gbXVzdCBiZSBDT01QUkVTU19BQ1RJT05fQ09NUFJFU1MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gc3JjX2xlbiBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCxDT01QUkVTU19NQVhfT1JHXS4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IFRoZSBPVVRQVVQgWk9ORSBpcyBkZWZpbmVkIHRvIGJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBNZW1vcnlbZHN0X2FkZHIsZHN0X2FkZHIrc3JjX2xlbi0xK0NPTVBSRVNTX09WRVJSVU5dLiAgICAgICAgICAgICAgICAgKi8KKy8qID4gVGhlIGZ1bmN0aW9uIGNhbiBtb2RpZnkgYW55IHBhcnQgb2YgdGhlIG91dHB1dCB6b25lIHJlZ2FyZGxlc3Mgb2YgdGhlICAgICovCisvKiAgIGZpbmFsIGxlbmd0aCBvZiB0aGUgb3V0cHV0IGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBUaGUgaW5wdXQgYmxvY2sgYW5kIHRoZSBvdXRwdXQgem9uZSBtdXN0IG5vdCBvdmVybGFwLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gZHN0X2xlbiB3aWxsIGJlIGluIHRoZSByYW5nZSBbMCxzcmNfbGVuK0NPTVBSRVNTX09WRVJSVU5dLiAgICAgICAgICAgICAgICovCisvKiA+IGRzdF9sZW4gd2lsbCBiZSBpbiB0aGUgcmFuZ2UgWzAsQ09NUFJFU1NfTUFYX0NPTV0gKGZyb20gcHJldiBmYWN0KS4gICAgICAqLworLyogPiBUaGUgb3V0cHV0IGJsb2NrIHdpbGwgY29uc2lzdCBvZiBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dCBibG9jay4gICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZWNvbXByZXNzaW9uIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gYWN0aW9uIG11c3QgYmUgQ09NUFJFU1NfQUNUSU9OX0RFQ09NUFJFU1MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IFRoZSBpbnB1dCBibG9jayBtdXN0IGJlIHRoZSByZXN1bHQgb2YgYW4gZWFybGllciBjb21wcmVzc2lvbiBvcGVyYXRpb24uICAqLworLyogPiBJZiB0aGUgcHJldmlvdXMgZmFjdCBpcyB0cnVlLCB0aGUgZm9sbG93aW5nIGZhY3RzIG11c3QgYWxzbyBiZSB0cnVlOiAgICAgKi8KKy8qICAgPiBzcmNfbGVuIHdpbGwgYmUgaW4gdGhlIHJhbmdlIFswLENPTVBSRVNTX01BWF9DT01dLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgID4gZHN0X2xlbiB3aWxsIGJlIGluIHRoZSByYW5nZSBbMCxDT01QUkVTU19NQVhfT1JHXS4gICAgICAgICAgICAgICAgICAgICAqLworLyogPiBUaGUgaW5wdXQgYW5kIG91dHB1dCBibG9ja3MgbXVzdCBub3Qgb3ZlcmxhcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gT25seSB0aGUgb3V0cHV0IGJsb2NrIGlzIG1vZGlmaWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IFVwb24gdGVybWluYXRpb24sIHRoZSBvdXRwdXQgYmxvY2sgd2lsbCBjb25zaXN0IG9mIHRoZSBieXRlcyBjb250YWluZWQgICAqLworLyogICBpbiB0aGUgaW5wdXQgYmxvY2sgcGFzc2VkIHRvIHRoZSBlYXJsaWVyIGNvbXByZXNzaW9uIG9wZXJhdGlvbi4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9SVC5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIG1vZHVsZSBjb250YWlucyBtYWNybyBkZWZpbml0aW9ucyBhbmQgdHlwZXMgdGhhdCBhcmUgbGlrZWx5IHRvICAgICAgICAqLworLyogY2hhbmdlIGJldHdlZW4gY29tcHV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIERPTkVfUE9SVCAgICAgICAvKiBPbmx5IGRvIHRoaXMgaWYgbm90IHByZXZpb3VzbHkgZG9uZS4gICAgICAgICAgICAgICAqLworCisgICAjaWZkZWYgVEhJTktfQworICAgICAgI2RlZmluZSBVQllURSB1bnNpZ25lZCBjaGFyICAgICAgLyogVW5zaWduZWQgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICNkZWZpbmUgVVdPUkQgdW5zaWduZWQgaW50ICAgICAgIC8qIFVuc2lnbmVkIHdvcmQgKDIgYnl0ZXMpICAgICAgICAgICAgICovCisgICAgICAjZGVmaW5lIFVMT05HIHVuc2lnbmVkIGxvbmcgICAgICAvKiBVbnNpZ25lZCB3b3JkICg0IGJ5dGVzKSAgICAgICAgICAgICAqLworICAgICAgI2RlZmluZSBCT09MICB1bnNpZ25lZCBjaGFyICAgICAgLyogQm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICNkZWZpbmUgRk9QRU5fQklOQVJZX1JFQUQgICJyYiIgIC8qIE1vZGUgc3RyaW5nIGZvciBiaW5hcnkgcmVhZGluZy4gICAgICovCisgICAgICAjZGVmaW5lIEZPUEVOX0JJTkFSWV9XUklURSAid2IiICAvKiBNb2RlIHN0cmluZyBmb3IgYmluYXJ5IHdyaXRpbmcuICAgICAqLworICAgICAgI2RlZmluZSBGT1BFTl9URVhUX0FQUEVORCAgImEiICAgLyogTW9kZSBzdHJpbmcgZm9yIHRleHQgYXBwZW5kaW5nLiAgICAgKi8KKyAgICAgICNkZWZpbmUgUkVBTCBkb3VibGUgICAgICAgICAgICAgIC8qIFVTZWQgZm9yIGZsb2F0aW5nIHBvaW50IHN0dWZmLiAgICAgICovCisgICAjZW5kaWYKKyAgICNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKGxpbnV4KQorICAgICAgI2RlZmluZSBVQllURSBfX3U4ICAgICAgICAgICAgICAgLyogVW5zaWduZWQgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICNkZWZpbmUgVVdPUkQgX191MTYgICAgICAgICAgICAgIC8qIFVuc2lnbmVkIHdvcmQgKDIgYnl0ZXMpICAgICAgICAgICAgICovCisgICAgICAjZGVmaW5lIFVMT05HIF9fdTMyICAgICAgICAgICAgICAvKiBVbnNpZ25lZCB3b3JkICg0IGJ5dGVzKSAgICAgICAgICAgICAqLworICAgICAgI2RlZmluZSBMT05HICBfX3MzMiAgICAgICAgICAgICAgLyogU2lnbmVkICAgd29yZCAoNCBieXRlcykgICAgICAgICAgICAgKi8KKyAgICAgICNkZWZpbmUgQk9PTCAgaXMgbm90IHVzZWQgaGVyZSAgIC8qIEJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAjZGVmaW5lIEZPUEVOX0JJTkFSWV9SRUFEICBub3QgdXNlZCAgLyogTW9kZSBzdHJpbmcgZm9yIGJpbmFyeSByZWFkaW5nLiAqLworICAgICAgI2RlZmluZSBGT1BFTl9CSU5BUllfV1JJVEUgbm90IHVzZWQgIC8qIE1vZGUgc3RyaW5nIGZvciBiaW5hcnkgd3JpdGluZy4gKi8KKyAgICAgICNkZWZpbmUgRk9QRU5fVEVYVF9BUFBFTkQgIG5vdCB1c2VkICAvKiBNb2RlIHN0cmluZyBmb3IgdGV4dCBhcHBlbmRpbmcuICovCisgICAgICAjZGVmaW5lIFJFQUwgbm90IHVzZWQgICAgICAgICAgICAgICAgLyogVVNlZCBmb3IgZmxvYXRpbmcgcG9pbnQgc3R1ZmYuICAqLworICAgICAgI2lmbmRlZiBUUlVFCisgICAgICAjZGVmaW5lIFRSVUUgMQorICAgICAgI2VuZGlmCisgICAjZW5kaWYKKworICAgI2RlZmluZSBET05FX1BPUlQgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgZG8gYWxsIHRoaXMgYWdhaW4uICAgICAgICAgICAgKi8KKyAgICNkZWZpbmUgTUFMTE9DX0ZBSUwgTlVMTCAgICAgICAgICAgIC8qIEZhaWx1cmUgc3RhdHVzIGZyb20gbWFsbG9jKCkgICAgICAgICovCisgICAjZGVmaW5lIExPQ0FMIHN0YXRpYyAgICAgICAgICAgICAgICAvKiBGb3Igbm9uLWV4cG9ydGVkIHJvdXRpbmVzLiAgICAgICAgICAqLworICAgI2RlZmluZSBFWFBPUlQgICAgICAgICAgICAgICAgICAgICAgLyogU2lnbmFscyBleHBvcnRlZCBmdW5jdGlvbi4gICAgICAgICAgKi8KKyAgICNkZWZpbmUgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZWZ1bCBmb3IgYWxpZ25pbmcgaWZzLiAgICAgICAgICAgICovCisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmQgb2YgUE9SVC5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ09NUFJFU1NfQUNUSU9OX0lERU5USVRZICAgMAorI2RlZmluZSBDT01QUkVTU19BQ1RJT05fQ09NUFJFU1MgICAxCisjZGVmaW5lIENPTVBSRVNTX0FDVElPTl9ERUNPTVBSRVNTIDIKKworI2RlZmluZSBDT01QUkVTU19PVkVSUlVOIDEwMjQKKyNkZWZpbmUgQ09NUFJFU1NfTUFYX0NPTSAweDcwMDAwMDAwCisjZGVmaW5lIENPTVBSRVNTX01BWF9PUkcgKENPTVBSRVNTX01BWF9DT00tQ09NUFJFU1NfT1ZFUlJVTikKKworI2RlZmluZSBDT01QUkVTU19NQVhfU1RSTEVOIDI1NQorCisvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWxnb3JpdGhtLiAgICAgICAgICovCisvKiA+IFRoZSB0b3AgYml0IG9mIGlkIG11c3QgYmUgemVyby4gVGhlIHJlbWFpbmluZyBiaXRzIG11c3QgYmUgY2hvc2VuIGJ5ICAgICovCisvKiAgIHRoZSBhdXRob3Igb2YgdGhlIGFsZ29yaXRobSBieSB0b3NzaW5nIGEgY29pbiAzMSB0aW1lcy4gICAgICAgICAgICAgICAgICovCisvKiA+IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVlc3RlZCBieSB0aGUgYWxnb3JpdGhtIGlzIHNwZWNpZmllZCBpbiBieXRlcyAgICovCisvKiAgIGFuZCBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwweDcwMDAwMDAwXS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IEFsbCBzdHJpbmdzIHMgbXVzdCBiZSBzdWNoIHRoYXQgc3RybGVuKHMpPD1DT01QUkVTU19NQVhfU1RSTEVOLiAgICAgICAgICovCitzdHJ1Y3QgY29tcHJlc3NfaWRlbnRpdHkKKyAgeworICAgVUxPTkcgaWQ7ICAgICAgICAgICAvKiBJZGVudGlmeWluZyBudW1iZXIgb2YgYWxnb3JpdGhtLiAgICAgICAgICAgICovCisgICBVTE9ORyBtZW1vcnk7ICAgICAgIC8qIE51bWJlciBvZiBieXRlcyBvZiB3b3JraW5nIG1lbW9yeSByZXF1aXJlZC4gKi8KKworICAgY2hhciAgKm5hbWU7ICAgICAgICAvKiBOYW1lIG9mIGFsZ29yaXRobS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICBjaGFyICAqdmVyc2lvbjsgICAgIC8qIFZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgIGNoYXIgICpkYXRlOyAgICAgICAgLyogRGF0ZSBvZiByZWxlYXNlIG9mIHRoaXMgdmVyc2lvbi4gICAgICAgICAgICAqLworICAgY2hhciAgKmNvcHlyaWdodDsgICAvKiBDb3B5cmlnaHQgbWVzc2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgIGNoYXIgICphdXRob3I7ICAgICAgLyogQXV0aG9yIG9mIGFsZ29yaXRobS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAgY2hhciAgKmFmZmlsaWF0aW9uOyAvKiBBZmZpbGlhdGlvbiBvZiBhdXRob3IuICAgICAgICAgICAgICAgICAgICAgICovCisgICBjaGFyICAqdmVuZG9yOyAgICAgIC8qIFdoZXJlIHRoZSBhbGdvcml0aG0gY2FuIGJlIG9idGFpbmVkLiAgICAgICAgKi8KKyAgfTsKKwordm9pZCAgbHpydzNfY29tcHJlc3MoICAgICAgICAvKiBTaW5nbGUgZnVuY3Rpb24gaW50ZXJmYWNlIHRvIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gKi8KK1VXT1JEICAgICBhY3Rpb24sICAgICAgLyogQWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitVQllURSAgICp3cmtfbWVtLCAgICAgIC8qIFdvcmtpbmcgbWVtb3J5IHRlbXBvcmFyaWx5IGdpdmVuIHRvIHJvdXRpbmUgdG8gdXNlLiAqLworVUJZVEUgICAqc3JjX2FkciwgICAgICAvKiBBZGRyZXNzIG9mIGlucHV0ICBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0xPTkcgICAgIHNyY19sZW4sICAgICAgLyogTGVuZ3RoICBvZiBpbnB1dCAgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitVQllURSAgICpkc3RfYWRyLCAgICAgIC8qIEFkZHJlc3Mgb2Ygb3V0cHV0IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwordm9pZCAgKnBfZHN0X2xlbiAgICAgICAvKiBQb2ludGVyIHRvIGEgbG9uZ3dvcmQgd2hlcmUgcm91dGluZSB3aWxsIHdyaXRlOiAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogICAgSWYgYWN0aW9uPS4uSURFTlRJVFkgICA9PiBBZHIgb2YgaWQgc3RydWN0dXJlLiAgICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIElmIGFjdGlvbj0uLkNPTVBSRVNTICAgPT4gTGVuZ3RoIG9mIG91dHB1dCBkYXRhLiAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBJZiBhY3Rpb249Li5ERUNPTVBSRVNTID0+IExlbmd0aCBvZiBvdXRwdXQgZGF0YS4gKi8KKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kIG9mIENPTVBSRVNTLkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFzdF9jb3B5LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgZnVuY3Rpb24gY29waWVzIGEgYmxvY2sgb2YgbWVtb3J5IHZlcnkgcXVpY2tseS4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgZXhhY3Qgc3BlZWQgZGVwZW5kcyBvbiB0aGUgcmVsYXRpdmUgYWxpZ25tZW50IG9mIHRoZSBibG9ja3Mgb2YgbWVtb3J5LiAqLworLyogUFJFICA6IDA8PXNyY19sZW48PSgyXjMyKS0xIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBSRSAgOiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJsb2NrcyBtdXN0IG5vdCBvdmVybGFwLiAgICAgICAgICAgICAgICAgICAgICovCisvKiBQT1NUIDogTUVNW2RzdF9hZHIsZHN0X2FkcitzcmNfbGVuLTFdPU1FTVtzcmNfYWRyLHNyY19hZHIrc3JjX2xlbi0xXS4gICAgICAqLworLyogUE9TVCA6IE1FTVtkc3RfYWRyLGRzdF9hZHIrc3JjX2xlbi0xXSBpcyB0aGUgb25seSBtZW1vcnkgY2hhbmdlZC4gICAgICAgICAgKi8KKworI2RlZmluZSBmYXN0X2NvcHkoc3JjLGRzdCxsZW4pIG1lbWNweShkc3Qsc3JjLGxlbikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBvZiBmYXN0X2NvcHkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL3pmdGFwZS1jb21wcmVzcy5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwYTIyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL3pmdGFwZS1jb21wcmVzcy5jCkBAIC0wLDAgKzEsMTIwMyBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorIFVTQS4KKyAKKyAqCisgKiAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgYSAiZ2VuZXJpYyIgaW50ZXJmYWNlIGJldHdlZW4gdGhlICoKKyAqICAgICB6ZnRhcGUtZHJpdmVyIGFuZCBhIGNvbXByZXNzaW9uLWFsZ29yaXRobS4gVGhlICoKKyAqICAgICBjb21wcmVzc2lvbi1hbGdvcml0aG0gY3VycmVudGx5IHVzZWQgaXMgYSBMWjc3LiBJIHVzZSB0aGUgKgorICogICAgIGltcGxlbWVudGF0aW9uIGx6cnczIGJ5IFJvc3MgTi4gV2lsbGlhbXMgKFJlbmFpc3NhbmNlICoKKyAqICAgICBTb2Z0d2FyZSkuIFRoZSBjb21wcmVzc2lvbiBwcm9ncmFtIGl0c2VsZiBpcyBpbiB0aGUgZmlsZQorICogICAgIGx6cnczLmMgKiBhbmQgbHpydzMuaC4gIFRvIGFkb3B0IGFub3RoZXIgY29tcHJlc3Npb24gYWxnb3JpdGhtCisgKiAgICAgdGhlIGZ1bmN0aW9ucyAqIHpmdF9jb21wcmVzcygpIGFuZCB6ZnRfdW5jb21wcmVzcygpIG11c3QgYmUKKyAqICAgICBjaGFuZ2VkICogYXBwcm9wcmlhdGVseS4gU2VlIGJlbG93LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9jb21wcmVzc29yL3pmdGFwZS1jb21wcmVzcy5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgorI2luY2x1ZGUgIi4uL2NvbXByZXNzb3IvbHpydzMuaCIKKworLyoKKyAqICAgZ2xvYmFsIHZhcmlhYmxlcworICovCisKKy8qIEkgaGFuZGxlIHRoZSBhbGxvY2F0aW9uIG9mIHRoaXMgYnVmZmVyIGFzIGEgc3BlY2lhbCBjYXNlLCBiZWNhdXNlCisgKiBpdCdzIHNpemUgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgdGFwZSBsZW5ndGggaW5zZXJ0ZWQuCisgKi8KKworLyogbG9jYWwgdmFyaWFibGVzIAorICovCitzdGF0aWMgdm9pZCAqemZ0Y193cmtfbWVtID0gTlVMTDsKK3N0YXRpYyBfX3U4ICp6ZnRjX2J1ZiAgICAgPSBOVUxMOworc3RhdGljIHZvaWQgKnpmdGNfc2NyYXRjaF9idWYgID0gTlVMTDsKKworLyogY29tcHJlc3Npb24gc3RhdGlzdGljcyAKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB6ZnRjX3dyX3VuY29tcHJlc3NlZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHpmdGNfd3JfY29tcHJlc3NlZCAgID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgemZ0Y19yZF91bmNvbXByZXNzZWQgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCB6ZnRjX3JkX2NvbXByZXNzZWQgICA9IDA7CisKKy8qIGZvcndhcmQgKi8KK3N0YXRpYyBpbnQgIHpmdGNfd3JpdGUoaW50ICp3cml0ZV9jbnQsCisJCSAgICAgICBfX3U4ICpkc3RfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAorCQkgICAgICAgY29uc3QgX191OCBfX3VzZXIgKnNyY19idWYsIGNvbnN0IGludCByZXFfbGVuLAorCQkgICAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpOworc3RhdGljIGludCAgemZ0Y19yZWFkKGludCAqcmVhZF9jbnQsCisJCSAgICAgIF9fdTggIF9fdXNlciAqZHN0X2J1ZiwgY29uc3QgaW50IHRvX2RvLAorCQkgICAgICBjb25zdCBfX3U4ICpzcmNfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAorCQkgICAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSk7CitzdGF0aWMgaW50ICB6ZnRjX3NlZWsodW5zaWduZWQgaW50IG5ld19ibG9ja19wb3MsIAorCQkgICAgICB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSwKKwkJICAgICAgX191OCAqYnVmZmVyKTsKK3N0YXRpYyB2b2lkIHpmdGNfbG9jayAgICh2b2lkKTsKK3N0YXRpYyB2b2lkIHpmdGNfcmVzZXQgICh2b2lkKTsKK3N0YXRpYyB2b2lkIHpmdGNfY2xlYW51cCh2b2lkKTsKK3N0YXRpYyB2b2lkIHpmdGNfc3RhdHMgICAgICAodm9pZCk7CisKKy8qIGNvbXByZXNzZWQgc2VnbWVudC4gVGhpcyBjb25mb3JtcyB0byBRSUMtODAtTUMsIFJldmlzaW9uIEsuCisgKiAKKyAqIFJldi4gSyBhcHBsaWVzIHRvIHRhcGVzIHdpdGggYGZpeGVkIGxlbmd0aCBmb3JtYXQnIHdoaWNoIGlzCisgKiBpbmRpY2F0ZWQgYnkgZm9ybWF0IGNvZGUgMiwzIGFuZCA1LiBTZWUgYmVsb3cgZm9yIGZvcm1hdCBjb2RlIDQgYW5kIDYKKyAqCisgKiAyIGJ5dGVzOiBvZmZzZXQgb2YgY29tcHJlc3Npb24gc2VnbWVudCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgIDI5ayA+IG9mZnNldCA+PSAyOWstMTg6IGRhdGEgZnJvbSBwcmV2aW91cyBzZWdtZW50IGVucyBpbiB0aGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50IGFuZCBubyBjb21wcmVzc2VkIGJsb2NrIHN0YXJ0cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBzZWdtZW50CisgKiAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9PSAwOiBkYXRhIGZyb20gcHJldmlvdXMgc2VnbWVudCBvY2N1cGllcyBlbnRpcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgYW5kIGNvbnRpbnVlcyBpbiBuZXh0IHNlZ21lbnQKKyAqIG4gYnl0ZXM6IHJlbWFpbmRlciBmcm9tIHByZXZpb3VzIHNlZ21lbnQKKyAqIAorICogUmV2LiBLOiAgCisgKiA0IGJ5dGVzOiA0IGJ5dGVzOiBmaWxlcyBzZXQgYnl0ZSBvZmZzZXQKKyAqIFBvc3QgUmV2LiBLIGFuZCBRSUMtMzAyMC8zMDIwOgorICogOCBieXRlczogOCBieXRlczogZmlsZXMgc2V0IGJ5dGUgb2Zmc2V0CisgKiAyIGJ5dGVzOiBieXRlIGNvdW50IE4gKGFtb3VudCBvZiBkYXRhIGZvbGxvd2luZykKKyAqICAgICAgICAgIGJpdCAxNSBpcyBzZXQgaWYgZGF0YSBpcyBjb21wcmVzc2VkLCBiaXQgMTUgaXMgbm90CisgKiAgICAgICAgICBzZXQgaWYgZGF0YSBpcyB1bmNvbXByZXNzZWQKKyAqIE4gYnl0ZXM6IGRhdGEgKGFzIG11Y2ggYXMgc3BlY2lmaWVkIGluIHRoZSBieXRlIGNvdW50KQorICogMiBieXRlczogYnl0ZSBjb3VudCBOXzEgb2YgbmV4dCBjbHVzdGVyCisgKiBOXzEgYnl0ZXM6IGRhdGEgb2YgbmV4dCBjbHVzZXQKKyAqIDIgYnl0ZXM6IGJ5dGUgY291bnQgTl8yIG9mIG5leHQgY2x1c3RlcgorICogTl8yIGJ5dGVzOiAuLi4gIAorICoKKyAqIE5vdGUgdGhhdCB0aGUgYE4nIGJ5dGUgY291bnQgYWNjb3VudHMgb25seSBmb3IgdGhlIGJ5dGVzIHRoYXQgaW4gdGhlCisgKiBjdXJyZW50IHNlZ21lbnQgaWYgdGhlIGNsdXN0ZXIgc3BhbnMgdG8gdGhlIG5leHQgc2VnbWVudC4KKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworCWludCBjbXByX3BvczsgICAgICAgICAgICAgLyogYWN0dWFsIHBvc2l0aW9uIGluIGNvbXByZXNzaW9uIGJ1ZmZlciAqLworCWludCBjbXByX3N6OyAgICAgICAgICAgICAgLyogd2hhdCBpcyBsZWZ0IGluIHRoZSBjb21wcmVzc2lvbiBidWZmZXIKKwkJCQkgICAqIHdoZW4gY29weWluZyB0aGUgY29tcHJlc3NlZCBkYXRhIHRvIHRoZQorCQkJCSAgICogZGVibG9jayBidWZmZXIKKwkJCQkgICAqLworCXVuc2lnbmVkIGludCBmaXJzdF9ibG9jazsgLyogbG9jYXRpb24gb2YgaGVhZGVyIGluZm9ybWF0aW9uIGluCisJCQkJICAgKiB0aGlzIHNlZ21lbnQKKwkJCQkgICAqLworCXVuc2lnbmVkIGludCBjb3VudDsgICAgICAgLyogYW1vdW50IG9mIGRhdGEgb2YgY3VycmVudCBibG9jaworCQkJCSAgICogY29udGFpbmVkIGluIGN1cnJlbnQgc2VnbWVudCAKKwkJCQkgICAqLworCXVuc2lnbmVkIGludCBvZmZzZXQ7ICAgICAgLyogb2Zmc2V0IGluIGN1cnJlbnQgc2VnbWVudCAqLworCXVuc2lnbmVkIGludCBzcGFuczoxOyAgICAgLyogbWlnaHQgY29udGludWUgaW4gbmV4dCBzZWdtZW50ICovCisJdW5zaWduZWQgaW50IHVuY21wcjsgICAgICAvKiAweDgwMDAgaWYgdGhpcyBibG9jayBjb250YWlucworCQkJCSAgICogdW5jb21wcmVzc2VkIGRhdGEgCisJCQkJICAgKi8KKwlfX3M2NCBmb2ZmczsgICAgICAgICAgICAgIC8qIGZpbGUgc2V0IGJ5dGUgb2Zmc2V0LCBzYW1lIGFzIGluIAorCQkJCSAgICogY29tcHJlc3Npb24gbWFwIHNlZ21lbnQKKwkJCQkgICAqLworfSBjbXByX2luZm87CisKK3N0YXRpYyBjbXByX2luZm8gY3NlZzsgLyogc3RhdGljIGRhdGEuIE11c3QgYmUga2VwdCB1cHRvZGF0ZSBhbmQgc2hhcmVkIGJ5IAorCQkJKiByZWFkLCB3cml0ZSBhbmQgc2VlayBmdW5jdGlvbnMKKwkJCSovCisKKyNkZWZpbmUgRFVNUF9DTVBSX0lORk8obGV2ZWwsIG1zZywgaW5mbykJCQkJXAorCVRSQUNFKGxldmVsLCBtc2cgIlxuIgkJCQkJCVwKKwkgICAgICBLRVJOX0lORk8gImNtcHJfcG9zICAgOiAlZFxuIgkJCQlcCisJICAgICAgS0VSTl9JTkZPICJjbXByX3N6ICAgIDogJWRcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiZmlyc3RfYmxvY2s6ICVkXG4iCQkJCVwKKwkgICAgICBLRVJOX0lORk8gImNvdW50ICAgICAgOiAlZFxuIgkJCQlcCisJICAgICAgS0VSTl9JTkZPICJvZmZzZXQgICAgIDogJWRcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAic3BhbnMgICAgICA6ICVkXG4iCQkJCVwKKwkgICAgICBLRVJOX0lORk8gInVuY21wciAgICAgOiAweCUwNHhcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiZm9mZnMgICAgICA6ICIgTExfWCwJCQkJXAorCSAgICAgIChpbmZvKS0+Y21wcl9wb3MsIChpbmZvKS0+Y21wcl9zeiwgKGluZm8pLT5maXJzdF9ibG9jaywJXAorCSAgICAgIChpbmZvKS0+Y291bnQsIChpbmZvKS0+b2Zmc2V0LCAoaW5mbyktPnNwYW5zID09IDEsCVwKKwkgICAgICAoaW5mbyktPnVuY21wciwgTEwoKGluZm8pLT5mb2ZmcykpCisKKy8qICAgZGlzcGF0Y2ggY29tcHJlc3Npb24gc2VnbWVudCBpbmZvLCByZXR1cm4gZXJyb3IgY29kZQorICogIAorICogICBhZnRlcndhcmRzLCBjc2VnLT5vZmZzZXQgcG9pbnRzIHRvIHN0YXJ0IG9mIGRhdGEgb2YgdGhlIE5FWFQKKyAqICAgY29tcHJlc3NlZCBibG9jaywgYW5kIGNzZWctPmNvdW50IGNvbnRhaW5zIHRoZSBhbW91bnQgb2YgZGF0YQorICogICBsZWZ0IGluIHRoZSBhY3R1YWwgY29tcHJlc3NlZCBibG9jay4gY3NlZy0+c3BhbnMgaXMgc2V0IHRvIDEgaWYKKyAqICAgdGhlIGJsb2NrIGlzIGNvbnRpbnVlZCBpbiB0aGUgZm9sbG93aW5nIHNlZ21lbnQuIE90aGVyd2lzZSBpdCBpcworICogICBzZXQgdG8gMC4gCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2NzZWcgKGNtcHJfaW5mbyAqY2luZm8sIGNvbnN0IF9fdTggKmJ1ZmYsIAorCQkgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzZWdfc3osCisJCSAgICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworIAljaW5mby0+Zmlyc3RfYmxvY2sgPSBHRVQyKGJ1ZmYsIDApOworCWlmIChjaW5mby0+Zmlyc3RfYmxvY2sgPT0gMCkgeyAvKiBkYXRhIHNwYW5zIHRvIG5leHQgc2VnbWVudCAqLworCQljaW5mby0+Y291bnQgID0gc2VnX3N6IC0gc2l6ZW9mKF9fdTE2KTsKKwkJY2luZm8tPm9mZnNldCA9IHNlZ19zejsKKwkJY2luZm8tPnNwYW5zID0gMTsKKwl9IGVsc2UgeyAvKiBjbHVzdGVyIGRlZmluZXRlbHkgZW5kcyBpbiB0aGlzIHNlZ21lbnQgKi8KKwkJaWYgKGNpbmZvLT5maXJzdF9ibG9jayA+IHNlZ19zeikgeworCQkJLyogZGF0YSBjb3JydXB0ZWQgKi8KKwkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAiY29ycnVwdGVkIGRhdGE6XG4iCisJCQkJICAgIEtFUk5fSU5GTyAic2VnbWVudCBzaXplOiAlZFxuIgorCQkJCSAgICBLRVJOX0lORk8gImZpcnN0IGJsb2NrIDogJWQiLAorCQkJCSAgICBzZWdfc3osIGNpbmZvLT5maXJzdF9ibG9jayk7CisJCX0KKwkgICAgICAgIGNpbmZvLT5jb3VudCAgPSBjaW5mby0+Zmlyc3RfYmxvY2sgLSBzaXplb2YoX191MTYpOworCQljaW5mby0+b2Zmc2V0ID0gY2luZm8tPmZpcnN0X2Jsb2NrOworCQljaW5mby0+c3BhbnMgPSAwOworCX0KKwkvKiBub3cgZ2V0IHRoZSBvZmZzZXQgdGhlIGZpcnN0IGJsb2NrIHNob3VsZCBoYXZlIGluIHRoZQorCSAqIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbS4KKwkgKgorCSAqIEZvciB0aGlzIG1hZ2ljIGAxOCcgcmVmZXIgdG8gQ1JGLTMgc3RhbmRhcmQgb3IgUUlDLTgwTUMsCisJICogUmV2LiBLLiAgCisJICovCisJaWYgKChzZWdfc3ogLSBjaW5mby0+b2Zmc2V0KSA+IDE4KSB7CisJCWlmICh2b2x1bWUtPnFpYzExMykgeyAvKiA+IHJldmlzaW9uIEsgKi8KKwkJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiTmV3IFFJQy0xMTMgY29tcGxpYW5jZSIpOworCQkJY2luZm8tPmZvZmZzID0gR0VUOChidWZmLCBjaW5mby0+b2Zmc2V0KTsKKwkJCWNpbmZvLT5vZmZzZXQgKz0gc2l6ZW9mKF9fczY0KTsgCisJCX0gZWxzZSB7CisJCQlUUkFDRSgvKiBmdF90X2RhdGFfZmxvdyAqLyBmdF90X25vaXNlLCAicHJlIFFJQy0xMTMgdmVyc2lvbiIpOworCQkJY2luZm8tPmZvZmZzICAgPSAoX19zNjQpR0VUNChidWZmLCBjaW5mby0+b2Zmc2V0KTsKKwkJCWNpbmZvLT5vZmZzZXQgKz0gc2l6ZW9mKF9fdTMyKTsgCisJCX0KKwl9CisJaWYgKGNpbmZvLT5mb2ZmcyA+IHZvbHVtZS0+c2l6ZSkgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgIkluY29uc2lzdGVuY3k6XG4iCisJCQkgICAgS0VSTl9JTkZPICJvZmZzZXQgaW4gY3VycmVudCB2b2x1bWU6ICVkXG4iCisJCQkgICAgS0VSTl9JTkZPICJzaXplIG9mIGN1cnJlbnQgdm9sdW1lICA6ICVkIiwKKwkJCSAgICAoaW50KShjaW5mby0+Zm9mZnM+PjEwKSwgKGludCkodm9sdW1lLT5zaXplPj4xMCkpOworCX0KKwlpZiAoY2luZm8tPmNtcHJfcG9zICsgY2luZm8tPmNvdW50ID4gdm9sdW1lLT5ibGtfc3opIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJJbmNvbnNpc3RlbmN5OlxuIgorCQkJICAgIEtFUk5fSU5GTyAiYmxvY2sgc2l6ZSA6ICVkXG4iCisJCQkgICAgS0VSTl9JTkZPICJkYXRhIHJlY29yZDogJWQiLAorCQkJICAgIHZvbHVtZS0+YmxrX3N6LCBjaW5mby0+Y21wcl9wb3MgKyBjaW5mby0+Y291bnQpOworCX0KKwlEVU1QX0NNUFJfSU5GTyhmdF90X25vaXNlIC8qIGZ0X3RfYW55ICovLCAiIiwgY2luZm8pOworCVRSQUNFX0VYSVQgMDsKK30KKworLyogIFRoaXMgb25lIGlzIGNhbGxlZCwgd2hlbiBhIG5ldyBjbHVzdGVyIHN0YXJ0cyBpbiBzYW1lIHNlZ21lbnQuCisgKiAgCisgKiAgTm90ZTogaWYgdGhpcyBpcyB0aGUgZmlyc3QgY2x1c3RlciBpbiB0aGUgY3VycmVudCBzZWdtZW50LCB3ZSBtdXN0CisgKiAgbm90IGNoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgdGhhbiAxOCBieXRlcyBhdmFpbGFibGUgYmVjYXVzZQorICogIHRoaXMgaGF2ZSBhbHJlYWR5IGJlZW4gZG9uZSBpbiBnZXRfY3NlZygpIGFuZCB0aGVyZSBtYXkgYmUgbGVzcworICogIHRoYW4gMTggYnl0ZXMgYXZhaWxhYmxlIGR1ZSB0byBoZWFkZXIgaW5mb3JtYXRpb24uCisgKiAKKyAqLworc3RhdGljIHZvaWQgZ2V0X25leHRfY2x1c3RlcihjbXByX2luZm8gKmNsdXN0ZXIsIGNvbnN0IF9fdTggKmJ1ZmYsIAorCQkJICAgICBjb25zdCBpbnQgc2VnX3N6LCBjb25zdCBpbnQgZmluaXNoKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKHNlZ19zeiAtIGNsdXN0ZXItPm9mZnNldCA+IDE4IHx8IGNsdXN0ZXItPmZvZmZzICE9IDApIHsKKwkJY2x1c3Rlci0+Y291bnQgICA9IEdFVDIoYnVmZiwgY2x1c3Rlci0+b2Zmc2V0KTsKKwkJY2x1c3Rlci0+dW5jbXByICA9IGNsdXN0ZXItPmNvdW50ICYgMHg4MDAwOworCQljbHVzdGVyLT5jb3VudCAgLT0gY2x1c3Rlci0+dW5jbXByOworCQljbHVzdGVyLT5vZmZzZXQgKz0gc2l6ZW9mKF9fdTE2KTsKKwkJY2x1c3Rlci0+Zm9mZnMgICA9IDA7CisJCWlmICgoY2x1c3Rlci0+b2Zmc2V0ICsgY2x1c3Rlci0+Y291bnQpIDwgc2VnX3N6KSB7CisJCQljbHVzdGVyLT5zcGFucyA9IDA7CisJCX0gZWxzZSBpZiAoY2x1c3Rlci0+b2Zmc2V0ICsgY2x1c3Rlci0+Y291bnQgPT0gc2VnX3N6KSB7CisJCQljbHVzdGVyLT5zcGFucyA9ICFmaW5pc2g7CisJCX0gZWxzZSB7CisJCQkvKiBlaXRoZXIgYW4gZXJyb3Igb3IgYSB2b2x1bWUgd3JpdHRlbiBieSBhbiAKKwkJCSAqIG9sZCB2ZXJzaW9uLiBJZiB0aGlzIGlzIGEgZGF0YSBlcnJvciwgdGhlbiB3ZSdsbAorCQkJICogY2F0Y2ggaXQgbGF0ZXIuCisJCQkgKi8KKwkJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiRWl0aGVyIGVycm9yIG9yIG9sZCB2b2x1bWUiKTsKKwkJCWNsdXN0ZXItPnNwYW5zID0gMTsKKwkJCWNsdXN0ZXItPmNvdW50ID0gc2VnX3N6IC0gY2x1c3Rlci0+b2Zmc2V0OworCQl9CisJfSBlbHNlIHsKKwkJY2x1c3Rlci0+Y291bnQgPSAwOworCQljbHVzdGVyLT5zcGFucyA9IDA7CisJCWNsdXN0ZXItPmZvZmZzID0gMDsKKwl9CisJRFVNUF9DTVBSX0lORk8oZnRfdF9ub2lzZSAvKiBmdF90X2FueSAqLyAsICIiLCBjbHVzdGVyKTsKKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgdm9pZCB6ZnRjX2xvY2sodm9pZCkKK3sKK30KKworLyogIHRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIGZvciB6ZnRhcGVfcmVzZXRfcG9zaXRpb24gaW4gemZ0YXBlLWlvLmMgCisgKi8KK3N0YXRpYyB2b2lkIHpmdGNfcmVzZXQodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCW1lbXNldCgodm9pZCAqKSZjc2VnLCAnXDAnLCBzaXplb2YoY3NlZykpOworCXpmdGNfc3RhdHMoKTsKKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgaW50IGNtcHJfbWVtX2luaXRpYWxpemVkID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWxsb2NfYmxrc3ogPSAwOworCitzdGF0aWMgaW50IHpmdF9hbGxvY2F0ZV9jbXByX21lbSh1bnNpZ25lZCBpbnQgYmxrc3opCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoY21wcl9tZW1faW5pdGlhbGl6ZWQgJiYgYmxrc3ogPT0gYWxsb2NfYmxrc3opIHsKKwkJVFJBQ0VfRVhJVCAwOworCX0KKwlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19vbmNlKCZ6ZnRjX3dya19tZW0sIENNUFJfV1JLX01FTV9TSVpFKSwKKwkJICAgIHpmdGNfY2xlYW51cCgpKTsKKwlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19hbHdheXMoJnpmdGNfYnVmLCBibGtzeiArIENNUFJfT1ZFUlJVTiksCisJCSAgICB6ZnRjX2NsZWFudXAoKSk7CisJYWxsb2NfYmxrc3ogPSBibGtzejsKKwlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19hbHdheXMoJnpmdGNfc2NyYXRjaF9idWYsIGJsa3N6K0NNUFJfT1ZFUlJVTiksCisJCSAgICB6ZnRjX2NsZWFudXAoKSk7CisJY21wcl9tZW1faW5pdGlhbGl6ZWQgPSAxOworCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIHZvaWQgemZ0Y19jbGVhbnVwKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwl6ZnRfdmZyZWUoJnpmdGNfd3JrX21lbSwgQ01QUl9XUktfTUVNX1NJWkUpOworCXpmdF92ZnJlZSgmemZ0Y19idWYsIGFsbG9jX2Jsa3N6ICsgQ01QUl9PVkVSUlVOKTsKKwl6ZnRfdmZyZWUoJnpmdGNfc2NyYXRjaF9idWYsIGFsbG9jX2Jsa3N6ICsgQ01QUl9PVkVSUlVOKTsKKwljbXByX21lbV9pbml0aWFsaXplZCA9IGFsbG9jX2Jsa3N6ID0gMDsKKwlUUkFDRV9FWElUOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyAiZnRhcGVfY29tcHJlc3MoKSIgYW5kICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgImZ0YXBlX3VuY29tcHJlc3MoKSIgYXJlIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGFjdHVhbCBjb21wcmVzc2lvbiAgICAgICAgICoKKyAqICBhbGdvcml0aG0gKGkuZS4gdGhleSBhcmUgY2FsbGluZyB0aGUgImNvbXByZXNzKCkiIGZ1bmN0aW9uIGZyb20gICAgICAgICAgKgorICogIHRoZSBsenJ3MyBwYWNrYWdlIGZvciBub3cpLiBUaGVzZSByb3V0aW5lcyBjb3VsZCBxdWl0ZSBlYXNpbHkgYmUgICAgICAgICAqCisgKiAgY2hhbmdlZCB0byBhZG9wdCBhbm90aGVyIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbnN0ZWFkIG9mIGx6cnczLCAgICAgICAgICoKKyAqICB3aGljaCBjdXJyZW50bHkgaXMgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNhbGxlZCBieSB6ZnRfY29tcHJlc3Nfd3JpdGUoKSB0byBwZXJmb3JtIHRoZSBjb21wcmVzc2lvbi4gTXVzdAorICogcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEuCisgKgorICogTk9URTogVGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBzaG91bGQgbm90IGV4Y2VlZCB0aGUgc2l6ZSBvZgorICogICAgICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhLiBNb3N0IGNvbXByZXNzaW9uIGFsZ29yaXRobXMgaGF2ZSBtZWFucworICogICAgICAgdG8gc3RvcmUgZGF0YSB1bmNoYW5nZWQgaWYgdGhlICJjb21wcmVzc2VkIiBkYXRhIGFtb3VudCB3b3VsZAorICogICAgICAgZXhjZWVkIHRoZSBvcmlnaW5hbCBvbmUuIE1vc3RseSB0aGlzIGlzIGRvbmUgYnkgc3RvcmluZyBzb21lCisgKiAgICAgICBmbGFnLWJ5dGVzIGluIGZyb250IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgdG8gaW5kaWNhdGUgaWYgaXQKKyAqICAgICAgIGlzIGNvbXByZXNzZWQgb3Igbm90LiBUaHVzIHRoZSB3b3JzdCBjb21wcmVzc2lvbiByZXN1bHQKKyAqICAgICAgIGxlbmd0aCBpcyB0aGUgb3JpZ2luYWwgbGVuZ3RoIHBsdXMgdGhvc2UgZmxhZy1ieXRlcy4KKyAqCisgKiAgICAgICBXZSBkb24ndCB3YW50IHRoYXQsIGFzIHRoZSBRSUMtODAgc3RhbmRhcmQgcHJvdmlkZXMgYSBtZWFucworICogICAgICAgb2YgbWFya2luZyB1bmNvbXByZXNzZWQgYmxvY2tzIGJ5IHNpbXBseSBzZXR0aW5nIGJpdCAxNSBvZgorICogICAgICAgdGhlIGNvbXByZXNzZWQgYmxvY2sncyBsZW5ndGguIFRodXMgYSBjb21wZXNzZWQgYmxvY2sgY2FuCisgKiAgICAgICBoYXZlIGF0IG1vc3QgYSBsZW5ndGggb2YgMl4xNS0xIGJ5dGVzLiBUaGUgUUlDLTgwIHN0YW5kYXJkCisgKiAgICAgICByZXN0cmljdHMgdGhlIGJsb2NrLWxlbmd0aCBldmVuIGZ1cnRoZXIsIGFsbG93aW5nIG9ubHkgMjlrIC0KKyAqICAgICAgIDYgYnl0ZXMuCisgKgorICogICAgICAgQ3VycmVudGx5LCB0aGUgbWF4aW11bSBibG9ja3NpemUgdXNlZCBieSB6ZnRhcGUgaXMgMjhrLgorICoKKyAqICAgICAgIEluIHNob3J0OiBkb24ndCBleGNlZWQgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQtcGFja2FnZSwgc2V0CisgKiAgICAgICBiaXQgMTUgb2YgdGhlIGNvbXByZXNzZWQgc2l6ZSB0byAxIGlmIHlvdSBoYXZlIGNvcGllZCBkYXRhCisgKiAgICAgICBpbnN0ZWFkIG9mIGNvbXByZXNzaW5nIGl0LgorICovCitzdGF0aWMgaW50IHpmdF9jb21wcmVzcyhfX3U4ICppbl9idWZmZXIsIHVuc2lnbmVkIGludCBpbl9zeiwgX191OCAqb3V0X2J1ZmZlcikKK3sgCisJX19zMzIgY29tcHJlc3NlZF9zejsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKworCWx6cnczX2NvbXByZXNzKENPTVBSRVNTX0FDVElPTl9DT01QUkVTUywgemZ0Y193cmtfbWVtLAorCQkgICAgICAgaW5fYnVmZmVyLCBpbl9zeiwgb3V0X2J1ZmZlciwgJmNvbXByZXNzZWRfc3opOworCWlmIChUUkFDRV9MRVZFTCA+PSBmdF90X2luZm8pIHsKKwkJLyogIHRoZSBjb21waWxlciB3aWxsIG9wdGltaXplIHRoaXMgYXdheSB3aGVuCisJCSAqICBjb21waWxlZCB3aXRoIE5PX1RSQUNFX0FUX0FMTCBvcHRpb24KKwkJICovCisJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiYmVmb3JlIGNvbXByZXNzaW9uOiAlZCBieXRlc1xuIgorCQkgICAgICBLRVJOX0lORk8gImFmdGVyIGNvbXByZXNpc29uIDogJWQgYnl0ZXMiLCAKKwkJICAgICAgaW5fc3osIAorCQkgICAgICAoaW50KShjb21wcmVzc2VkX3N6IDwgMCAKKwkJICAgICAgPyAtY29tcHJlc3NlZF9zeiA6IGNvbXByZXNzZWRfc3opKTsKKwkJLyogIGZvciBzdGF0aXN0aWNhbCBwdXJwb3NlcworCQkgKi8KKwkJemZ0Y193cl9jb21wcmVzc2VkICAgKz0gKGNvbXByZXNzZWRfc3ogPCAwIAorCQkJCQkgICA/IC1jb21wcmVzc2VkX3N6IDogY29tcHJlc3NlZF9zeik7CisJCXpmdGNfd3JfdW5jb21wcmVzc2VkICs9IGluX3N6OworCX0KKwlUUkFDRV9FWElUIChpbnQpY29tcHJlc3NlZF9zejsKK30KKworLyogY2FsbGVkIGJ5IHpmdF9jb21wcmVzc19yZWFkKCkgdG8gZGVjb21wcmVzcyB0aGUgZGF0YS4gTXVzdAorICogcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBkZWNvbXByZXNzZWQgZGF0YSBmb3Igc2FuaXR5IGNoZWNrcworICogKGNvbXBhcmVkIHdpdGggemZ0X2Jsa19zeikKKyAqCisgKiBOT1RFOiBSZWFkIHRoZSBub3RlIGZvciB6ZnRfY29tcHJlc3MoKSBhYm92ZSEgIElmIGJpdCAxNSBvZiB0aGUKKyAqICAgICAgIHBhcmFtZXRlciBpbl9zeiBpcyBzZXQsIHRoZW4gdGhlIGRhdGEgaW4gaW5fYnVmZmVyIGlzbid0CisgKiAgICAgICBjb21wcmVzc2VkLCB3aGljaCBtdXN0IGJlIGhhbmRsZWQgYnkgdGhlIHVuLWNvbXByZXNzaW9uCisgKiAgICAgICBhbGdvcml0aG0uIChJIGNoYW5nZWQgbHpydzMgdG8gaGFuZGxlIHRoaXMuKQorICoKKyAqICBUaGUgcGFyYW1ldGVyIG1heF9vdXRfc3ogaXMgbmVlZGVkIHRvIHByZXZlbnQgYnVmZmVyIG92ZXJydW5zIHdoZW4gCisgKiAgdW5jb21wcmVzc2luZyBjb3JydXB0IGRhdGEuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgemZ0X3VuY29tcHJlc3MoX191OCAqaW5fYnVmZmVyLCAKKwkJCQkgICBpbnQgaW5fc3osIAorCQkJCSAgIF9fdTggKm91dF9idWZmZXIsCisJCQkJICAgdW5zaWduZWQgaW50IG1heF9vdXRfc3opCit7IAorCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWx6cnczX2NvbXByZXNzKENPTVBSRVNTX0FDVElPTl9ERUNPTVBSRVNTLCB6ZnRjX3dya19tZW0sCisJCSAgICAgICBpbl9idWZmZXIsIChfX3MzMilpbl9zeiwKKwkJICAgICAgIG91dF9idWZmZXIsIChfX3UzMiAqKSZtYXhfb3V0X3N6KTsKKwkKKwlpZiAoVFJBQ0VfTEVWRUwgPj0gZnRfdF9pbmZvKSB7CisJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiYmVmb3JlIGRlY29tcHJlc3Npb246ICVkIGJ5dGVzXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiYWZ0ZXIgZGVjb21wcmVzc2lvbiA6ICVkIGJ5dGVzIiwgCisJCSAgICAgIGluX3N6IDwgMCA/IC1pbl9zeiA6IGluX3N6LChpbnQpbWF4X291dF9zeik7CisJCS8qICBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXMKKwkJICovCisJCXpmdGNfcmRfY29tcHJlc3NlZCAgICs9IGluX3N6IDwgMCA/IC1pbl9zeiA6IGluX3N6OworCQl6ZnRjX3JkX3VuY29tcHJlc3NlZCArPSBtYXhfb3V0X3N6OworCX0KKwlUUkFDRV9FWElUICh1bnNpZ25lZCBpbnQpbWF4X291dF9zejsKK30KKworLyogcHJpbnQgc29tZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBlZmZpY2llbmN5IG9mIHRoZSBjb21wcmVzc2lvbiB0bworICogdGhlIGtlcm5lbCBsb2cgCisgKi8KK3N0YXRpYyB2b2lkIHpmdGNfc3RhdHModm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChUUkFDRV9MRVZFTCA8IGZ0X3RfaW5mbykgeworCQlUUkFDRV9FWElUOworCX0KKwlpZiAoemZ0Y193cl91bmNvbXByZXNzZWQgIT0gMCkgeworCQlpZiAoemZ0Y193cl9jb21wcmVzc2VkID4gKDE8PDE0KSkgeworCQkJVFJBQ0UoZnRfdF9pbmZvLCAiY29tcHJlc3Npb24gc3RhdGlzdGljcyAod3JpdGluZyk6XG4iCisJCQkgICAgICBLRVJOX0lORk8gIiBjb21wci4vdW5jbXByLiAgIDogJTNkICUlIiwKKwkJCSAgICAgICgoKHpmdGNfd3JfY29tcHJlc3NlZD4+MTApICogMTAwKQorCQkJICAgICAgIC8gKHpmdGNfd3JfdW5jb21wcmVzc2VkPj4xMCkpKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3RfaW5mbywgImNvbXByZXNzaW9uIHN0YXRpc3RpY3MgKHdyaXRpbmcpOlxuIgorCQkJICAgICAgS0VSTl9JTkZPICIgY29tcHIuL3VuY21wci4gICA6ICUzZCAlJSIsCisJCQkgICAgICAoKHpmdGNfd3JfY29tcHJlc3NlZCAqIDEwMCkKKwkJCSAgICAgICAvIHpmdGNfd3JfdW5jb21wcmVzc2VkKSk7CisJCX0KKwl9CisJaWYgKHpmdGNfcmRfdW5jb21wcmVzc2VkICE9IDApIHsKKwkJaWYgKHpmdGNfcmRfY29tcHJlc3NlZCA+ICgxPDwxNCkpIHsKKwkJCVRSQUNFKGZ0X3RfaW5mbywgImNvbXByZXNzaW9uIHN0YXRpc3RpY3MgKHJlYWRpbmcpOlxuIgorCQkJICAgICAgS0VSTl9JTkZPICIgY29tcHIuL3VuY21wci4gICA6ICUzZCAlJSIsCisJCQkgICAgICAoKCh6ZnRjX3JkX2NvbXByZXNzZWQ+PjEwKSAqIDEwMCkKKwkJCSAgICAgICAvICh6ZnRjX3JkX3VuY29tcHJlc3NlZD4+MTApKSk7CisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X2luZm8sICJjb21wcmVzc2lvbiBzdGF0aXN0aWNzIChyZWFkaW5nKTpcbiIKKwkJCSAgICAgIEtFUk5fSU5GTyAiIGNvbXByLi91bmNtcHIuICAgOiAlM2QgJSUiLAorCQkJICAgICAgKCh6ZnRjX3JkX2NvbXByZXNzZWQgKiAxMDApCisJCQkgICAgICAgLyB6ZnRjX3JkX3VuY29tcHJlc3NlZCkpOworCQl9CisJfQorCS8qIG9ubHkgcHJpbnQgaXQgb25jZTogKi8KKwl6ZnRjX3dyX3VuY29tcHJlc3NlZCA9IAorCQl6ZnRjX3dyX2NvbXByZXNzZWQgID0KKwkJemZ0Y19yZF91bmNvbXByZXNzZWQgPQorCQl6ZnRjX3JkX2NvbXByZXNzZWQgICA9IDA7CisJVFJBQ0VfRVhJVDsKK30KKworLyogc3RhcnQgbmV3IGNvbXByZXNzZWQgYmxvY2sgCisgKi8KK3N0YXRpYyBpbnQgc3RhcnRfbmV3X2NzZWcoY21wcl9pbmZvICpjbHVzdGVyLCAKKwkJCSAgY2hhciAqZHN0X2J1ZiwgCisJCQkgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zLAorCQkJICBjb25zdCB1bnNpZ25lZCBpbnQgYmxrX3N6LAorCQkJICBjb25zdCBjaGFyICpzcmNfYnVmLAorCQkJICBjb25zdCBpbnQgdGhpc19zZWdzX3N6LAorCQkJICBjb25zdCBpbnQgcWljMTEzKQoreworCWludCBzaXplX2xlZnQ7CisJaW50IGNwX2NudDsKKwlpbnQgYnVmX3BvczsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXNpemVfbGVmdCA9IHRoaXNfc2Vnc19zeiAtIHNpemVvZihfX3UxNikgLSBjbHVzdGVyLT5jbXByX3N6OworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCJcbiIgCisJICAgICAgS0VSTl9JTkZPICJzZWdtZW50IHNpemUgICA6ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICJjb21wcmVzc2VkX3N6OiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAic2l6ZV9sZWZ0ICAgICAgOiAlZCIsCisJICAgICAgdGhpc19zZWdzX3N6LCBjbHVzdGVyLT5jbXByX3N6LCBzaXplX2xlZnQpOworCWlmIChzaXplX2xlZnQgPiAxOCkgeyAvKiBzdGFydCBhIG5ldyBjbHVzZXRlciAqLworCQljcF9jbnQgPSBjbHVzdGVyLT5jbXByX3N6OworCQljbHVzdGVyLT5jbXByX3N6ID0gMDsKKwkJYnVmX3BvcyA9IGNwX2NudCArIHNpemVvZihfX3UxNik7CisJCVBVVDIoZHN0X2J1ZiwgMCwgYnVmX3Bvcyk7CisKKwkJaWYgKHFpYzExMykgeworCQkJX19zNjQgZm9mZnMgPSBwb3MtPnZvbHVtZV9wb3M7CisJCQlpZiAoY3BfY250KSBmb2ZmcyArPSAoX19zNjQpYmxrX3N6OworCisJCQlUUkFDRShmdF90X2RhdGFfZmxvdywgIm5ldyBzdHlsZSBRSUMtMTEzIGhlYWRlciIpOworCQkJUFVUOChkc3RfYnVmLCBidWZfcG9zLCBmb2Zmcyk7CisJCQlidWZfcG9zICs9IHNpemVvZihfX3M2NCk7CisJCX0gZWxzZSB7CisJCQlfX3UzMiBmb2ZmcyA9IChfX3UzMilwb3MtPnZvbHVtZV9wb3M7CisJCQlpZiAoY3BfY250KSBmb2ZmcyArPSAoX191MzIpYmxrX3N6OworCQkJCisJCQlUUkFDRShmdF90X2RhdGFfZmxvdywgIm9sZCBzdHlsZSBRSUMtODBNQyBoZWFkZXIiKTsKKwkJCVBVVDQoZHN0X2J1ZiwgYnVmX3BvcywgZm9mZnMpOworCQkJYnVmX3BvcyArPSBzaXplb2YoX191MzIpOworCQl9CisJfSBlbHNlIGlmIChzaXplX2xlZnQgPj0gMCkgeworCQljcF9jbnQgPSBjbHVzdGVyLT5jbXByX3N6OworCQljbHVzdGVyLT5jbXByX3N6ID0gMDsKKwkJYnVmX3BvcyA9IGNwX2NudCArIHNpemVvZihfX3UxNik7CisJCVBVVDIoZHN0X2J1ZiwgMCwgYnVmX3Bvcyk7ICAKKwkJLyogemVybyB1bnVzZWQgcGFydCBvZiBzZWdtZW50LiAqLworCQltZW1zZXQoZHN0X2J1ZiArIGJ1Zl9wb3MsICdcMCcsIHNpemVfbGVmdCk7CisJCWJ1Zl9wb3MgPSB0aGlzX3NlZ3Nfc3o7CisJfSBlbHNlIHsgLyogbmVlZCBlbnRpcmUgc2VnbWVudCBhbmQgbW9yZSBzcGFjZSAqLworCQlQVVQyKGRzdF9idWYsIDAsIDApOyAKKwkJY3BfY250ID0gdGhpc19zZWdzX3N6IC0gc2l6ZW9mKF9fdTE2KTsKKwkJY2x1c3Rlci0+Y21wcl9zeiAgLT0gY3BfY250OworCQlidWZfcG9zID0gdGhpc19zZWdzX3N6OworCX0KKwltZW1jcHkoZHN0X2J1ZiArIHNpemVvZihfX3UxNiksIHNyY19idWYgKyBjbHVzdGVyLT5jbXByX3BvcywgY3BfY250KTsKKwljbHVzdGVyLT5jbXByX3BvcyArPSBjcF9jbnQ7CisJVFJBQ0VfRVhJVCBidWZfcG9zOworfQorCisvKiByZXR1cm4tdmFsdWU6IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtb3ZlZCBmcm9tIHRoZSB1c2VyLWJ1ZmZlcgorICogICAgICAgICAgICAgICBgc3JjX2J1Zicgb3IgZXJyb3IgY29kZQorICoKKyAqICBpbnQgKndyaXRlX2NudCAgICAgICAgICAgOiBob3cgbXVjaCBhY3R1YWxseSBoYXMgYmVlbiBtb3ZlZCB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmLiBOZWVkIG5vdCBiZSBpbml0aWFsaXplZCB3aGVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcmV0dXJucyB3aXRoIGFuIGVycm9yIGNvZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmVnYXRpdiByZXR1cm4gdmFsdWUpIAorICogIF9fdTggKmRzdF9idWYgICAgICAgICAgICA6IGtlcm5lbCBzcGFjZSBidWZmZXIgd2hlcmUgdGhlIGhhcyB0byBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZCB0by4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVycworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvZXMgdG8gYSBzcGVjaWZpYyBzZWdtZW50LgorICogIGNvbnN0IGludCBzZWdfc3ogICAgICAgICA6IHRoZSBzaXplIG9mIHRoZSBzZWdtZW50IGRzdF9idWYgd2lsbCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZCB0by4KKyAqICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcyAgOiBzdHJ1Y3QgY29udGFpbmluZyB0aGUgY29vcmRpbmF0ZXMgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCB2b2x1bWUgKGJ5dGUgcG9zaXRpb24sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCBpZCBvZiBjdXJyZW50IHNlZ21lbnQgZXRjKQorICogIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWU6IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHZvbHVtZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIGV0Yy4KKyAqICBjb25zdCBfX3U4ICpzcmNfYnVmICAgICAgOiB1c2VyIHNwYWNlIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgdGhlIHVzZXIgd2FudHMgdG8gYmUgd3JpdHRlbiB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcGUuCisgKiAgY29uc3QgaW50IHJlcV9sZW4gICAgICAgIDogdGhlIGFtb3VudCBvZiBkYXRhIHRoZSB1c2VyIHdhbnRzIHRvIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiB0byB0YXBlLgorICovCitzdGF0aWMgaW50IHpmdGNfd3JpdGUoaW50ICp3cml0ZV9jbnQsCisJCSAgICAgIF9fdTggKmRzdF9idWYsIGNvbnN0IGludCBzZWdfc3osCisJCSAgICAgIGNvbnN0IF9fdTggX191c2VyICpzcmNfYnVmLCBjb25zdCBpbnQgcmVxX2xlbiwKKwkJICAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCit7CisJaW50IHJlcV9sZW5fbGVmdCA9IHJlcV9sZW47CisJaW50IHJlc3VsdDsKKwlpbnQgbGVuX2xlZnQ7CisJaW50IGJ1Zl9wb3Nfd3JpdGUgPSBwb3MtPnNlZ19ieXRlX3BvczsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwkvKiBOb3RlOiB3ZSBkbyBub3QgdW5sb2NrIHRoZSBtb2R1bGUgYmVjYXVzZQorCSAqIHRoZXJlIGFyZSBzb21lIHZhbHVlcyBjYWNoZWQgaW4gdGhhdCBgY3NlZycgdmFyaWFibGUuICBXZQorCSAqIGRvbid0IGRvbid0IHdhbnQgdG8gdXNlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBiZWluZworCSAqIHVubG9hZGVkIGJ5IGtlcm5lbGQgZXZlbiB3aGVuIHRoZSB0YXBlIGlzIGZ1bGwgb3Igd2hlbiB3ZQorCSAqIGNhbm5vdCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5LgorCSAqLworCWlmIChwb3MtPnRhcGVfcG9zID4gKHZvbHVtZS0+c2l6ZS12b2x1bWUtPmJsa19zei1aRlRfQ01QUl9PVkVSSEVBRCkpIHsKKwkJVFJBQ0VfRVhJVCAtRU5PU1BDOworCX0gICAgCisJaWYgKHpmdF9hbGxvY2F0ZV9jbXByX21lbSh2b2x1bWUtPmJsa19zeikgPCAwKSB7CisJCS8qIHNob3VsZCB3ZSB1bmxvY2sgdGhlIG1vZHVsZT8gQnV0IGl0IHNob3VsZG4ndCAKKwkJICogYmUgbG9ja2VkIGFueXdheSAuLi4KKwkJICovCisJCVRSQUNFX0VYSVQgLUVOT01FTTsKKwl9CisJaWYgKGJ1Zl9wb3Nfd3JpdGUgPT0gMCkgeyAvKiBmaWxsIGEgbmV3IHNlZ21lbnQgKi8KKwkJKndyaXRlX2NudCA9IGJ1Zl9wb3Nfd3JpdGUgPSBzdGFydF9uZXdfY3NlZygmY3NlZywKKwkJCQkJCQkgICAgZHN0X2J1ZiwKKwkJCQkJCQkgICAgcG9zLAorCQkJCQkJCSAgICB2b2x1bWUtPmJsa19zeiwKKwkJCQkJCQkgICAgemZ0Y19idWYsIAorCQkJCQkJCSAgICBzZWdfc3osCisJCQkJCQkJICAgIHZvbHVtZS0+cWljMTEzKTsKKwkJaWYgKGNzZWcuY21wcl9zeiA9PSAwICYmIGNzZWcuY21wcl9wb3MgIT0gMCkgeworCQkJcmVxX2xlbl9sZWZ0IC09IHJlc3VsdCA9IHZvbHVtZS0+YmxrX3N6OworCQkJY3NlZy5jbXByX3BvcyAgPSAwOworCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCSp3cml0ZV9jbnQgPSByZXN1bHQgPSAwOworCX0KKwkKKwlsZW5fbGVmdCA9IHNlZ19zeiAtIGJ1Zl9wb3Nfd3JpdGU7CisJd2hpbGUgKChyZXFfbGVuX2xlZnQgPiAwKSAmJiAobGVuX2xlZnQgPiAxOCkpIHsKKwkJLyogbm93IHdlIGhhdmUgc29tZSBzaXplIGxlZnQgZm9yIGEgbmV3IGNvbXByZXNzZWQKKwkJICogYmxvY2suICBXZSBrbm93LCB0aGF0IHRoZSBjb21wcmVzc2lvbiBidWZmZXIgaXMKKwkJICogZW1wdHkgKGVsc2UgdGhlcmUgd291bGRuJ3QgYmUgYW55IHNwYWNlIGxlZnQpLiAgCisJCSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoemZ0Y19zY3JhdGNoX2J1Ziwgc3JjX2J1ZiArIHJlc3VsdCwgCisJCQkJICAgdm9sdW1lLT5ibGtfc3opICE9IDApIHsKKwkJCVRSQUNFX0VYSVQgLUVGQVVMVDsKKwkJfQorCQlyZXFfbGVuX2xlZnQgLT0gdm9sdW1lLT5ibGtfc3o7CisJCWNzZWcuY21wcl9zeiA9IHpmdF9jb21wcmVzcyh6ZnRjX3NjcmF0Y2hfYnVmLCB2b2x1bWUtPmJsa19zeiwgCisJCQkJCSAgICB6ZnRjX2J1Zik7CisJCWlmIChjc2VnLmNtcHJfc3ogPCAwKSB7CisJCQljc2VnLnVuY21wciA9IDB4ODAwMDsKKwkJCWNzZWcuY21wcl9zeiA9IC1jc2VnLmNtcHJfc3o7CisJCX0gZWxzZSB7CisJCQljc2VnLnVuY21wciA9IDA7CisJCX0KKwkJLyogaW5jcmVtZW50ICJyZXN1bHQiIGlmZiB3ZSBjb3BpZWQgdGhlIGVudGlyZQorCQkgKiBjb21wcmVzc2VkIGJsb2NrIHRvIHRoZSB6ZnRfZGVibG9ja19idWYgCisJCSAqLworCQlsZW5fbGVmdCAtPSBzaXplb2YoX191MTYpOworCQlpZiAobGVuX2xlZnQgPj0gY3NlZy5jbXByX3N6KSB7CisJCQlsZW5fbGVmdCAtPSBjc2VnLmNvdW50ID0gY3NlZy5jbXByX3N6OworCQkJY3NlZy5jbXByX3BvcyA9IGNzZWcuY21wcl9zeiA9IDA7CisJCQlyZXN1bHQgKz0gdm9sdW1lLT5ibGtfc3o7CisJCX0gZWxzZSB7CisJCQljc2VnLmNtcHJfc3ogICAgICAgLT0gCisJCQkJY3NlZy5jbXByX3BvcyA9CisJCQkJY3NlZy5jb3VudCAgICA9IGxlbl9sZWZ0OworCQkJbGVuX2xlZnQgPSAwOworCQl9CisJCVBVVDIoZHN0X2J1ZiwgYnVmX3Bvc193cml0ZSwgY3NlZy51bmNtcHIgfCBjc2VnLmNvdW50KTsKKwkJYnVmX3Bvc193cml0ZSArPSBzaXplb2YoX191MTYpOworCQltZW1jcHkoZHN0X2J1ZiArIGJ1Zl9wb3Nfd3JpdGUsIHpmdGNfYnVmLCBjc2VnLmNvdW50KTsKKwkJYnVmX3Bvc193cml0ZSArPSBjc2VnLmNvdW50OworCQkqd3JpdGVfY250ICAgICs9IGNzZWcuY291bnQgKyBzaXplb2YoX191MTYpOworCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJfQorCS8qIGVyYXNlIHRoZSByZW1haW5kZXIgb2YgdGhlIHNlZ21lbnQgaWYgbGVzcyB0aGFuIDE4IGJ5dGVzCisJICogbGVmdCAoMTggYnl0ZXMgaXMgZHVlIHRvIHRoZSBRSUMtODAgc3RhbmRhcmQpIAorCSAqLworCWlmIChsZW5fbGVmdCA8PSAxOCkgeworCQltZW1zZXQoZHN0X2J1ZiArIGJ1Zl9wb3Nfd3JpdGUsICdcMCcsIGxlbl9sZWZ0KTsKKwkJKCp3cml0ZV9jbnQpICs9IGxlbl9sZWZ0OworCX0KKwlUUkFDRShmdF90X2RhdGFfZmxvdywgInJldHVybmluZyAlZCIsIHJlc3VsdCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9ICAgCisKKy8qIG91dDoKKyAqCisgKiBpbnQgKnJlYWRfY250OiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIHJlbW92ZWQgZnJvbSB0aGUgemZ0X2RlYmxvY2tfYnVmCisgKiAgICAgICAgICAgICAgICAocmVzdWx0KQorICogaW50ICp0b19kbyAgIDogdGhlIHJlbWFpbmluZyBzaXplIG9mIHRoZSByZWFkLXJlcXVlc3QuCisgKgorICogaW46CisgKgorICogY2hhciAqYnVmZiAgICAgICAgICA6IGJ1ZmYgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHVzZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHRoYXQgaGFzbid0IGJlZW4gZmlsbGVkIHdpdGggZGF0YSB5ZXQuCisKKyAqIGludCBidWZfcG9zX3JlYWQgICAgOiBjb3B5IG9mIGZyb20gX2Z0YXBlX3JlYWQoKQorICogaW50IGJ1Zl9sZW5fcmVhZCAgICA6IGNvcHkgb2YgYnVmX2xlbl9yZCBmcm9tIF9mdGFwZV9yZWFkKCkKKyAqIGNoYXIgKnpmdF9kZWJsb2NrX2J1ZjogemZ0X2RlYmxvY2tfYnVmCisgKiB1bnNpZ25lZCBzaG9ydCBibGtfc3o6IHRoZSBibG9jayBzaXplIHZhbGlkIGZvciB0aGlzIHZvbHVtZSwgbWF5IGRpZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB6ZnRfYmxrX3N6LgorICogaW50IGZpbmlzaDogaWYgIT0gMCBtZWFucyB0aGF0IHRoaXMgaXMgdGhlIGxhc3Qgc2VnbWVudCBiZWxvbmdpbmcKKyAqICB0byB0aGlzIHZvbHVtZQorICogcmV0dXJucyB0aGUgYW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgY29waWVkIHRvIHRoZSB1c2VyLWJ1ZmZlcgorICoKKyAqIHRvX2RvIE1VU1QgTk9UIFNIUklOSyBleGNlcHQgdG8gaW5kaWNhdGUgYW4gRU9GLiBJbiB0aGlzIGNhc2UgKnRvX2RvIGhhcyB0bworICogYmUgc2V0IHRvIDAgCisgKi8KK3N0YXRpYyBpbnQgemZ0Y19yZWFkIChpbnQgKnJlYWRfY250LCAKKwkJICAgICAgX191OCAgX191c2VyICpkc3RfYnVmLCBjb25zdCBpbnQgdG9fZG8sIAorCQkgICAgICBjb25zdCBfX3U4ICpzcmNfYnVmLCBjb25zdCBpbnQgc2VnX3N6LCAKKwkJICAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCit7ICAgICAgICAgIAorCWludCB1bmNvbXByZXNzZWRfc3o7ICAgICAgICAgCisJaW50IHJlc3VsdCA9IDA7CisJaW50IHJlbWFpbmluZyA9IHRvX2RvOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0VfQ0FUQ0goemZ0X2FsbG9jYXRlX2NtcHJfbWVtKHZvbHVtZS0+YmxrX3N6KSwpOworCWlmIChwb3MtPnNlZ19ieXRlX3BvcyA9PSAwKSB7CisJCS8qIG5ldyBzZWdtZW50IGp1c3QgcmVhZAorCQkgKi8KKwkJVFJBQ0VfQ0FUQ0goZ2V0X2NzZWcoJmNzZWcsIHNyY19idWYsIHNlZ19zeiwgdm9sdW1lKSwKKwkJCSAgICAqcmVhZF9jbnQgPSAwKTsKKwkJbWVtY3B5KHpmdGNfYnVmICsgY3NlZy5jbXByX3Bvcywgc3JjX2J1ZiArIHNpemVvZihfX3UxNiksIAorCQkgICAgICAgY3NlZy5jb3VudCk7CisJCWNzZWcuY21wcl9wb3MgKz0gY3NlZy5jb3VudDsKKwkJKnJlYWRfY250ICAgICAgPSBjc2VnLm9mZnNldDsKKwkJRFVNUF9DTVBSX0lORk8oZnRfdF9ub2lzZSAvKiBmdF90X2FueSAqLywgIiIsICZjc2VnKTsKKwl9IGVsc2UgeworCQkqcmVhZF9jbnQgPSAwOworCX0KKwkvKiBsb29wIGFuZCB1bmNvbXByZXNzIHVudGlsIHVzZXIgYnVmZmVyIGZ1bGwgb3IKKwkgKiBkZWJsb2NrLWJ1ZmZlciBlbXB0eSAKKwkgKi8KKwlUUkFDRShmdF90X2RhdGFfZmxvdywgImNvbXByZXNzZWRfc3o6ICVkLCBjb21wb3MgOiAlZCwgKnJlYWRfY250OiAlZCIsCisJICAgICAgY3NlZy5jbXByX3N6LCBjc2VnLmNtcHJfcG9zLCAqcmVhZF9jbnQpOworCXdoaWxlICgoY3NlZy5zcGFucyA9PSAwKSAmJiAocmVtYWluaW5nID4gMCkpIHsKKwkJaWYgKGNzZWcuY21wcl9wb3MgICE9IDApIHsgLyogY21wciBidWYgaXMgbm90IGVtcHR5ICovCisJCQl1bmNvbXByZXNzZWRfc3ogPSAKKwkJCQl6ZnRfdW5jb21wcmVzcyh6ZnRjX2J1ZiwKKwkJCQkJICAgICAgIGNzZWcudW5jbXByID09IDB4ODAwMCA/CisJCQkJCSAgICAgICAtY3NlZy5jbXByX3BvcyA6IGNzZWcuY21wcl9wb3MsCisJCQkJCSAgICAgICB6ZnRjX3NjcmF0Y2hfYnVmLAorCQkJCQkgICAgICAgdm9sdW1lLT5ibGtfc3opOworCQkJaWYgKHVuY29tcHJlc3NlZF9zeiAhPSB2b2x1bWUtPmJsa19zeikgeworCQkJCSpyZWFkX2NudCA9IDA7CisJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF93YXJuLAorCQkJCSAgICAgICJVbmNvbXByZXNzZWQgYmxrICglZCkgIT0gYmxrIHNpemUgKCVkKSIsCisJCQkJICAgICAgdW5jb21wcmVzc2VkX3N6LCB2b2x1bWUtPmJsa19zeik7CisJCQl9ICAgICAgIAorCQkJaWYgKGNvcHlfdG9fdXNlcihkc3RfYnVmICsgcmVzdWx0LCAKKwkJCQkJIHpmdGNfc2NyYXRjaF9idWYsIAorCQkJCQkgdW5jb21wcmVzc2VkX3N6KSAhPSAwICkgeworCQkJCVRSQUNFX0VYSVQgLUVGQVVMVDsKKwkJCX0KKwkJCXJlbWFpbmluZyAgICAgIC09IHVuY29tcHJlc3NlZF9zejsKKwkJCXJlc3VsdCAgICAgKz0gdW5jb21wcmVzc2VkX3N6OworCQkJY3NlZy5jbXByX3BvcyAgPSAwOworCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlpZiAocmVtYWluaW5nID4gMCkgeworCQkJZ2V0X25leHRfY2x1c3RlcigmY3NlZywgc3JjX2J1Ziwgc2VnX3N6LCAKKwkJCQkJIHZvbHVtZS0+ZW5kX3NlZyA9PSBwb3MtPnNlZ19wb3MpOworCQkJaWYgKGNzZWcuY291bnQgIT0gMCkgeworCQkJCW1lbWNweSh6ZnRjX2J1Ziwgc3JjX2J1ZiArIGNzZWcub2Zmc2V0LAorCQkJCSAgICAgICBjc2VnLmNvdW50KTsKKwkJCQljc2VnLmNtcHJfcG9zID0gY3NlZy5jb3VudDsKKwkJCQljc2VnLm9mZnNldCAgKz0gY3NlZy5jb3VudDsKKwkJCQkqcmVhZF9jbnQgKz0gY3NlZy5jb3VudCArIHNpemVvZihfX3UxNik7CisJCQl9IGVsc2UgeworCQkJCXJlbWFpbmluZyA9IDA7CisJCQl9CisJCX0KKwkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJcbiIgCisJCSAgICAgIEtFUk5fSU5GTyAiY29tcHJlc3NlZF9zejogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJjb21wb3MgICAgICAgOiAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gIipyZWFkX2NudCAgICA6ICVkIiwKKwkJICAgICAgY3NlZy5jbXByX3N6LCBjc2VnLmNtcHJfcG9zLCAqcmVhZF9jbnQpOworCX0KKwlpZiAoc2VnX3N6IC0gY3NlZy5vZmZzZXQgPD0gMTgpIHsKKwkJKnJlYWRfY250ICs9IHNlZ19zeiAtIGNzZWcub2Zmc2V0OworCQlUUkFDRShmdF90X2RhdGFfZmxvdywgImV4cGFuZGluZyByZWFkIGNudCB0bzogJWQiLCAqcmVhZF9jbnQpOworCX0KKwlUUkFDRShmdF90X2RhdGFfZmxvdywgIlxuIgorCSAgICAgIEtFUk5fSU5GTyAic2VnbWVudCBzaXplICAgOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAicmVhZCBjb3VudCAgICAgOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAiYnVmX3Bvc19yZWFkICAgOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAicmVtYWluaW5nICAgICAgOiAlZCIsCisJCXNlZ19zeiwgKnJlYWRfY250LCBwb3MtPnNlZ19ieXRlX3BvcywgCisJCXNlZ19zeiAtICpyZWFkX2NudCAtIHBvcy0+c2VnX2J5dGVfcG9zKTsKKwlUUkFDRShmdF90X2RhdGFfZmxvdywgInJldHVybmluZzogJWQiLCByZXN1bHQpOworCVRSQUNFX0VYSVQgcmVzdWx0OworfSAgICAgICAgICAgICAgICAKKworLyogc2Vla3MgdG8gdGhlIG5ldyBkYXRhLXBvc2l0aW9uLiBSZWFkcyBzb21ldGltZXMgYSBzZWdtZW50LgorICogIAorICogc3RhcnRfc2VnIGFuZCBlbmRfc2VnIGdpdmUgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGN1cnJlbnQgdm9sdW1lCisgKiBibGtfc3ogaXMgdGhlIGJsa19zeiBvZiB0aGUgY3VycmVudCB2b2x1bWUgYXMgc3RvcmVkIGluIHRoZQorICogdm9sdW1lIGxhYmVsCisgKgorICogV2UgZG9uJ3QgYWxsb3cgYmxvY2tzaXplcyBsZXNzIHRoYW4gMTAyNCBieXRlcywgdGhlcmVmb3JlIHdlIGRvbid0IG5lZWQKKyAqIGEgNjQgYml0IGFyZ3VtZW50IGZvciBuZXdfYmxvY2tfcG9zLgorICovCisKK3N0YXRpYyBpbnQgc2Vla19pbl9zZWdtZW50KGNvbnN0IHVuc2lnbmVkIGludCB0b19kbywgY21wcl9pbmZvICAqY19pbmZvLAorCQkJICAgY29uc3QgY2hhciAqc3JjX2J1ZiwgY29uc3QgaW50IHNlZ19zeiwgCisJCQkgICBjb25zdCBpbnQgc2VnX3BvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSk7CitzdGF0aWMgaW50IHNsb3dfc2Vla19mb3J3YXJkX3VudGlsX2Vycm9yKGNvbnN0IHVuc2lnbmVkIGludCBkaXN0YW5jZSwKKwkJCQkJIGNtcHJfaW5mbyAqY19pbmZvLCB6ZnRfcG9zaXRpb24gKnBvcywgCisJCQkJCSBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lLCBfX3U4ICpidWYpOworc3RhdGljIGludCBzZWFyY2hfdmFsaWRfc2VnbWVudCh1bnNpZ25lZCBpbnQgc2VnbWVudCwKKwkJCQljb25zdCB1bnNpZ25lZCBpbnQgZW5kX3NlZywKKwkJCQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X2ZvZmZzLAorCQkJCXpmdF9wb3NpdGlvbiAqcG9zLCBjbXByX2luZm8gKmNfaW5mbywKKwkJCQljb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lLCBfX3U4ICpidWYpOworc3RhdGljIGludCBzbG93X3NlZWtfZm9yd2FyZCh1bnNpZ25lZCBpbnQgZGVzdCwgY21wcl9pbmZvICpjX2luZm8sCisJCQkgICAgIHpmdF9wb3NpdGlvbiAqcG9zLCBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lLAorCQkJICAgICBfX3U4ICpidWYpOworc3RhdGljIGludCBjb21wdXRlX3NlZ19wb3ModW5zaWduZWQgaW50IGRlc3QsIHpmdF9wb3NpdGlvbiAqcG9zLAorCQkJICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSk7CisKKyNkZWZpbmUgWkZUX1NMT1dfU0VFS19USFJFU0hPTEQgIDEwIC8qIHNlZ21lbnRzICovCisjZGVmaW5lIFpGVF9GQVNUX1NFRUtfTUFYX1RSSUFMUyAxMCAvKiB0aW1lcyAqLworI2RlZmluZSBaRlRfRkFTVF9TRUVLX0JBQ0tVUCAgICAgMTAgLyogc2VnbWVudHMgKi8KKworc3RhdGljIGludCB6ZnRjX3NlZWsodW5zaWduZWQgaW50IG5ld19ibG9ja19wb3MsCisJCSAgICAgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsIF9fdTggKmJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgZGVzdDsKKwlpbnQgbGltaXQ7CisJaW50IGRpc3RhbmNlOworCWludCByZXN1bHQgPSAwOworCWludCBzZWdfZGlzdDsKKwlpbnQgbmV3X3NlZzsKKwlpbnQgb2xkX3NlZyA9IDA7CisJaW50IGZhc3Rfc2Vla190cmlhbHMgPSAwOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKG5ld19ibG9ja19wb3MgPT0gMCkgeworCQlwb3MtPnNlZ19wb3MgICAgICA9IHZvbHVtZS0+c3RhcnRfc2VnOworCQlwb3MtPnNlZ19ieXRlX3BvcyA9IDA7CisJCXBvcy0+dm9sdW1lX3BvcyAgID0gMDsKKwkJemZ0Y19yZXNldCgpOworCQlUUkFDRV9FWElUIDA7CisJfQorCWRlc3QgPSBuZXdfYmxvY2tfcG9zICogKHZvbHVtZS0+YmxrX3N6ID4+IDEwKTsKKwlkaXN0YW5jZSA9IGRlc3QgLSAocG9zLT52b2x1bWVfcG9zID4+IDEwKTsKKwl3aGlsZSAoZGlzdGFuY2UgIT0gMCkgeworCQlzZWdfZGlzdCA9IGNvbXB1dGVfc2VnX3BvcyhkZXN0LCBwb3MsIHZvbHVtZSk7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJcbiIKKwkJICAgICAgS0VSTl9JTkZPICJzZWdfZGlzdDogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJkaXN0YW5jZTogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJkZXN0ICAgIDogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJ2cG9zICAgIDogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJzZWdfcG9zIDogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJ0cmlhbHMgIDogJWQiLAorCQkgICAgICBzZWdfZGlzdCwgZGlzdGFuY2UsIGRlc3QsCisJCSAgICAgICh1bnNpZ25lZCBpbnQpKHBvcy0+dm9sdW1lX3Bvcz4+MTApLCBwb3MtPnNlZ19wb3MsCisJCSAgICAgIGZhc3Rfc2Vla190cmlhbHMpOworCQlpZiAoZGlzdGFuY2UgPiAwKSB7CisJCQlpZiAoc2VnX2Rpc3QgPCAwKSB7CisJCQkJVFJBQ0UoZnRfdF9idWcsICJCVUc6IGRpc3RhbmNlICVkID4gMCwgIgorCQkJCSAgICAgICJzZWdtZW50IGRpZmZlcmVuY2UgJWQgPCAwIiwKKwkJCQkgICAgICBkaXN0YW5jZSwgc2VnX2Rpc3QpOworCQkJCXJlc3VsdCA9IC1FSU87CisJCQkJYnJlYWs7CisJCQl9CisJCQluZXdfc2VnID0gcG9zLT5zZWdfcG9zICsgc2VnX2Rpc3Q7CisJCQlpZiAobmV3X3NlZyA+IHZvbHVtZS0+ZW5kX3NlZykgeworCQkJCW5ld19zZWcgPSB2b2x1bWUtPmVuZF9zZWc7CisJCQl9CisJCQlpZiAob2xkX3NlZyA9PSBuZXdfc2VnIHx8IC8qIGxvb3AgKi8KKwkJCSAgICBzZWdfZGlzdCA8PSBaRlRfU0xPV19TRUVLX1RIUkVTSE9MRCB8fAorCQkJICAgIGZhc3Rfc2Vla190cmlhbHMgPj0gWkZUX0ZBU1RfU0VFS19NQVhfVFJJQUxTKSB7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgInN0YXJ0aW5nIHNsb3cgc2VlazpcbiIKKwkJCQkgICBLRVJOX0lORk8gImZhc3Qgc2VlayBmYWlsZWQgdG9vIG9mdGVuOiAlc1xuIgorCQkJCSAgIEtFUk5fSU5GTyAibmVhciB0YXJnZXQgcG9zaXRpb24gICAgICA6ICVzXG4iCisJCQkJICAgS0VSTl9JTkZPICJsb29waW5nIGJldHdlZW4gdHdvIHNlZ3MgIDogJXMiLAorCQkJCSAgICAgIChmYXN0X3NlZWtfdHJpYWxzID49IAorCQkJCSAgICAgICBaRlRfRkFTVF9TRUVLX01BWF9UUklBTFMpCisJCQkJICAgICAgPyAieWVzIiA6ICJubyIsCisJCQkJICAgICAgKHNlZ19kaXN0IDw9IFpGVF9TTE9XX1NFRUtfVEhSRVNIT0xEKSAKKwkJCQkgICAgICA/ICJ5ZXMiIDogIm5vIiwKKwkJCQkgICAgICAob2xkX3NlZyA9PSBuZXdfc2VnKQorCQkJCSAgICAgID8gInllcyIgOiAibm8iKTsKKwkJCQlyZXN1bHQgPSBzbG93X3NlZWtfZm9yd2FyZChkZXN0LCAmY3NlZywgCisJCQkJCQkJICAgcG9zLCB2b2x1bWUsIGJ1Zik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvbGRfc2VnID0gbmV3X3NlZzsKKwkJCWxpbWl0ID0gdm9sdW1lLT5lbmRfc2VnOworCQkJZmFzdF9zZWVrX3RyaWFscyArKzsKKwkJCWZvciAoOzspIHsKKwkJCQlyZXN1bHQgPSBzZWFyY2hfdmFsaWRfc2VnbWVudChuZXdfc2VnLCBsaW1pdCwKKwkJCQkJCQkgICAgICB2b2x1bWUtPnNpemUsCisJCQkJCQkJICAgICAgcG9zLCAmY3NlZywKKwkJCQkJCQkgICAgICB2b2x1bWUsIGJ1Zik7CisJCQkJaWYgKHJlc3VsdCA9PSAwIHx8IHJlc3VsdCA9PSAtRUlOVFIpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChuZXdfc2VnID09IHZvbHVtZS0+c3RhcnRfc2VnKSB7CisJCQkJCXJlc3VsdCA9IC1FSU87IC8qIHNldCBlcnJyb3IgCisJCQkJCQkJKiBjb25kaXRpb24KKwkJCQkJCQkqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbGltaXQgICAgPSBuZXdfc2VnOworCQkJCW5ld19zZWcgLT0gWkZUX0ZBU1RfU0VFS19CQUNLVVA7CisJCQkJaWYgKG5ld19zZWcgPCB2b2x1bWUtPnN0YXJ0X3NlZykgeworCQkJCQluZXdfc2VnID0gdm9sdW1lLT5zdGFydF9zZWc7CisJCQkJfQorCQkJfQorCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQlUUkFDRShmdF90X3dhcm4sCisJCQkJICAgICAgIkNvdWxkbid0IGZpbmQgYSByZWFkYWJsZSBzZWdtZW50Iik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSAvKiBpZiAoZGlzdGFuY2UgPCAwKSAqLyB7CisJCQlpZiAoc2VnX2Rpc3QgPiAwKSB7CisJCQkJVFJBQ0UoZnRfdF9idWcsICJCVUc6IGRpc3RhbmNlICVkIDwgMCwgIgorCQkJCSAgICAgICJzZWdtZW50IGRpZmZlcmVuY2UgJWQgPjAiLAorCQkJCSAgICAgIGRpc3RhbmNlLCBzZWdfZGlzdCk7CisJCQkJcmVzdWx0ID0gLUVJTzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5ld19zZWcgPSBwb3MtPnNlZ19wb3MgKyBzZWdfZGlzdDsKKwkJCWlmIChmYXN0X3NlZWtfdHJpYWxzID4gMCAmJiBzZWdfZGlzdCA9PSAwKSB7CisJCQkJLyogdGhpcyBhdm9pZHMgc3RpY2tpbmcgdG8gdGhlIHNhbWUKKwkJCQkgKiBzZWdtZW50IGFsbCB0aGUgdGltZS4gT24gdGhlIG90aGVyIGhhbmQ6CisJCQkJICogaWYgd2UgZ290IGhlcmUgZm9yIHRoZSBmaXJzdCB0aW1lLCBhbmQgdGhlCisJCQkJICogZGVibG9ja19idWZmZXIgc3RpbGwgY29udGFpbnMgYSB2YWxpZAorCQkJCSAqIHNlZ21lbnQsIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byBza2lwIHRvIAorCQkJCSAqIHRoZSBwcmV2aW91cyBzZWdtZW50IGlmIHRoZSBkZXNpcmVkIHBvc2l0aW9uCisJCQkJICogaXMgaW5zaWRlIHRoaXMgc2VnbWVudC4KKwkJCQkgKi8KKwkJCQluZXdfc2VnIC0tOworCQkJfQorCQkJaWYgKG5ld19zZWcgPCB2b2x1bWUtPnN0YXJ0X3NlZykgeworCQkJCW5ld19zZWcgPSB2b2x1bWUtPnN0YXJ0X3NlZzsKKwkJCX0KKwkJCWxpbWl0ICAgPSBwb3MtPnNlZ19wb3M7CisJCQlmYXN0X3NlZWtfdHJpYWxzICsrOworCQkJZm9yICg7OykgeworCQkJCXJlc3VsdCA9IHNlYXJjaF92YWxpZF9zZWdtZW50KG5ld19zZWcsIGxpbWl0LAorCQkJCQkJCSAgICAgIHBvcy0+dm9sdW1lX3BvcywKKwkJCQkJCQkgICAgICBwb3MsICZjc2VnLAorCQkJCQkJCSAgICAgIHZvbHVtZSwgYnVmKTsKKwkJCQlpZiAocmVzdWx0ID09IDAgfHwgcmVzdWx0ID09IC1FSU5UUikgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKG5ld19zZWcgPT0gdm9sdW1lLT5zdGFydF9zZWcpIHsKKwkJCQkJcmVzdWx0ID0gLUVJTzsgLyogc2V0IGVycnJvciAKKwkJCQkJCQkqIGNvbmRpdGlvbgorCQkJCQkJCSovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlsaW1pdCAgICA9IG5ld19zZWc7CisJCQkJbmV3X3NlZyAtPSBaRlRfRkFTVF9TRUVLX0JBQ0tVUDsKKwkJCQlpZiAobmV3X3NlZyA8IHZvbHVtZS0+c3RhcnRfc2VnKSB7CisJCQkJCW5ld19zZWcgPSB2b2x1bWUtPnN0YXJ0X3NlZzsKKwkJCQl9CisJCQl9CisJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCVRSQUNFKGZ0X3Rfd2FybiwKKwkJCQkgICAgICAiQ291bGRuJ3QgZmluZCBhIHJlYWRhYmxlIHNlZ21lbnQiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlkaXN0YW5jZSA9IGRlc3QgLSAocG9zLT52b2x1bWVfcG9zID4+IDEwKTsKKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKworLyogIGFkdmFuY2UgaW5zaWRlIHRoZSBnaXZlbiBzZWdtZW50IGF0IG1vc3QgdG9fZG8gYnl0ZXMuCisgKiAgb2Yga2lsb2J5dGVzIG1vdmVkCisgKi8KKworc3RhdGljIGludCBzZWVrX2luX3NlZ21lbnQoY29uc3QgdW5zaWduZWQgaW50IHRvX2RvLAorCQkJICAgY21wcl9pbmZvICAqY19pbmZvLAorCQkJICAgY29uc3QgY2hhciAqc3JjX2J1ZiwgCisJCQkgICBjb25zdCBpbnQgc2VnX3N6LCAKKwkJCSAgIGNvbnN0IGludCBzZWdfcG9zLAorCQkJICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgYmxrX3N6ID0gdm9sdW1lLT5ibGtfc3ogPj4gMTA7CisJaW50IHJlbWFpbmluZyA9IHRvX2RvOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKGNfaW5mby0+b2Zmc2V0ID09IDApIHsKKwkJLyogbmV3IHNlZ21lbnQganVzdCByZWFkCisJCSAqLworCQlUUkFDRV9DQVRDSChnZXRfY3NlZyhjX2luZm8sIHNyY19idWYsIHNlZ19zeiwgdm9sdW1lKSwpOworCQljX2luZm8tPmNtcHJfcG9zICs9IGNfaW5mby0+Y291bnQ7CisJCURVTVBfQ01QUl9JTkZPKGZ0X3Rfbm9pc2UsICIiLCBjX2luZm8pOworCX0KKwkvKiBsb29wIGFuZCB1bmNvbXByZXNzIHVudGlsIHVzZXIgYnVmZmVyIGZ1bGwgb3IKKwkgKiBkZWJsb2NrLWJ1ZmZlciBlbXB0eSAKKwkgKi8KKwlUUkFDRShmdF90X25vaXNlLCAiY29tcHJlc3NlZF9zejogJWQsIGNvbXBvcyA6ICVkIiwKKwkgICAgICBjX2luZm8tPmNtcHJfc3osIGNfaW5mby0+Y21wcl9wb3MpOworCXdoaWxlIChjX2luZm8tPnNwYW5zID09IDAgJiYgcmVtYWluaW5nID4gMCkgeworCQlpZiAoY19pbmZvLT5jbXByX3BvcyAgIT0gMCkgeyAvKiBjbXByIGJ1ZiBpcyBub3QgZW1wdHkgKi8KKwkJCXJlc3VsdCAgICAgICArPSBibGtfc3o7CisJCQlyZW1haW5pbmcgICAgLT0gYmxrX3N6OworCQkJY19pbmZvLT5jbXByX3BvcyA9IDA7CisJCX0KKwkJaWYgKHJlbWFpbmluZyA+IDApIHsKKwkJCWdldF9uZXh0X2NsdXN0ZXIoY19pbmZvLCBzcmNfYnVmLCBzZWdfc3osIAorCQkJCQkgdm9sdW1lLT5lbmRfc2VnID09IHNlZ19wb3MpOworCQkJaWYgKGNfaW5mby0+Y291bnQgIT0gMCkgeworCQkJCWNfaW5mby0+Y21wcl9wb3MgPSBjX2luZm8tPmNvdW50OworCQkJCWNfaW5mby0+b2Zmc2V0ICArPSBjX2luZm8tPmNvdW50OworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiAgQWxsb3cgZXNjYXBlIGZyb20gdGhpcyBsb29wIG9uIHNpZ25hbCEKKwkJICovCisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJRFVNUF9DTVBSX0lORk8oZnRfdF9ub2lzZSwgIiIsIGNfaW5mbyk7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0b19kbzogJWQiLCByZW1haW5pbmcpOworCX0KKwlpZiAoc2VnX3N6IC0gY19pbmZvLT5vZmZzZXQgPD0gMTgpIHsKKwkJY19pbmZvLT5vZmZzZXQgPSBzZWdfc3o7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJcbiIKKwkgICAgICBLRVJOX0lORk8gInNlZ21lbnQgc2l6ZSAgIDogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gImJ1Zl9wb3NfcmVhZCAgIDogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gInJlbWFpbmluZyAgICAgIDogJWQiLAorCSAgICAgIHNlZ19zeiwgY19pbmZvLT5vZmZzZXQsCisJICAgICAgc2VnX3N6IC0gY19pbmZvLT5vZmZzZXQpOworCVRSQUNFX0VYSVQgcmVzdWx0OworfSAgICAgICAgICAgICAgICAKKworc3RhdGljIGludCBzbG93X3NlZWtfZm9yd2FyZF91bnRpbF9lcnJvcihjb25zdCB1bnNpZ25lZCBpbnQgZGlzdGFuY2UsCisJCQkJCSBjbXByX2luZm8gKmNfaW5mbywKKwkJCQkJIHpmdF9wb3NpdGlvbiAqcG9zLCAKKwkJCQkJIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsCisJCQkJCSBfX3U4ICpidWYpCit7CisJdW5zaWduZWQgaW50IHJlbWFpbmluZyA9IGRpc3RhbmNlOworCWludCBzZWdfc3o7CisJaW50IHNlZ19wb3M7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlzZWdfcG9zID0gcG9zLT5zZWdfcG9zOworCWRvIHsKKwkJVFJBQ0VfQ0FUQ0goc2VnX3N6ID0gemZ0X2ZldGNoX3NlZ21lbnQoc2VnX3BvcywgYnVmLCAKKwkJCQkJCSAgICAgICBGVF9SRF9BSEVBRCksKTsKKwkJLyogbm93IHdlIGhhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBhY3R1YWwgc2VnbWVudCBpbgorCQkgKiB0aGUgZGVibG9jayBidWZmZXIKKwkJICovCisJCVRSQUNFX0NBVENIKHJlc3VsdCA9IHNlZWtfaW5fc2VnbWVudChyZW1haW5pbmcsIGNfaW5mbywgYnVmLAorCQkJCQkJICAgICBzZWdfc3osIHNlZ19wb3Msdm9sdW1lKSwpOworCQlyZW1haW5pbmcgICAgICAgIC09IHJlc3VsdDsKKwkJcG9zLT52b2x1bWVfcG9zICArPSByZXN1bHQ8PDEwOworCQlwb3MtPnNlZ19wb3MgICAgICA9IHNlZ19wb3M7CisJCXBvcy0+c2VnX2J5dGVfcG9zID0gY19pbmZvLT5vZmZzZXQ7CisJCXNlZ19wb3MgKys7CisJCWlmIChzZWdfcG9zIDw9IHZvbHVtZS0+ZW5kX3NlZyAmJiBjX2luZm8tPm9mZnNldCA9PSBzZWdfc3opIHsKKwkJCXBvcy0+c2VnX3BvcyArKzsKKwkJCXBvcy0+c2VnX2J5dGVfcG9zID0gMDsKKwkJCWNfaW5mby0+b2Zmc2V0ID0gMDsKKwkJfQorCQkvKiAgQWxsb3cgZXNjYXBlIGZyb20gdGhpcyBsb29wIG9uIHNpZ25hbCEKKwkJICovCisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIlxuIgorCQkgICAgICBLRVJOX0lORk8gInJlbWFpbmluZzogICVkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAic2VnX3BvczogICAgJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJlbmRfc2VnOiAgICAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gInJlc3VsdDogICAgICVkIiwKKwkJICAgICAgcmVtYWluaW5nLCBzZWdfcG9zLCB2b2x1bWUtPmVuZF9zZWcsIHJlc3VsdCk7ICAKKwl9IHdoaWxlIChyZW1haW5pbmcgPiAwICYmIHNlZ19wb3MgPD0gdm9sdW1lLT5lbmRfc2VnKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qIHJldHVybiBzZWdtZW50IGlkIG9mIG5leHQgc2VnbWVudCBjb250YWluaW5nIHZhbGlkIGRhdGEsIC1FSU8gb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgc2VhcmNoX3ZhbGlkX3NlZ21lbnQodW5zaWduZWQgaW50IHNlZ21lbnQsCisJCQkJY29uc3QgdW5zaWduZWQgaW50IGVuZF9zZWcsCisJCQkJY29uc3QgdW5zaWduZWQgaW50IG1heF9mb2ZmcywKKwkJCQl6ZnRfcG9zaXRpb24gKnBvcywKKwkJCQljbXByX2luZm8gKmNfaW5mbywKKwkJCQljb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lLAorCQkJCV9fdTggKmJ1ZikKK3sKKwljbXByX2luZm8gdG1wX2luZm87CisJaW50IHNlZ19zejsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwltZW1zZXQoJnRtcF9pbmZvLCAwLCBzaXplb2YoY21wcl9pbmZvKSk7CisJd2hpbGUgKHNlZ21lbnQgPD0gZW5kX3NlZykgeworCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCSAgICAgICJTZWFyY2hpbmcgcmVhZGFibGUgc2VnbWVudCBiZXR3ZWVuICVkIGFuZCAlZCIsCisJCSAgICAgIHNlZ21lbnQsIGVuZF9zZWcpOworCQlzZWdfc3ogPSB6ZnRfZmV0Y2hfc2VnbWVudChzZWdtZW50LCBidWYsIEZUX1JEX0FIRUFEKTsKKwkJaWYgKChzZWdfc3ogPiAwKSAmJgorCQkgICAgKGdldF9jc2VnICgmdG1wX2luZm8sIGJ1Ziwgc2VnX3N6LCB2b2x1bWUpID49IDApICYmCisJCSAgICAodG1wX2luZm8uZm9mZnMgIT0gMCB8fCBzZWdtZW50ID09IHZvbHVtZS0+c3RhcnRfc2VnKSkgeworCQkJaWYgKCh0bXBfaW5mby5mb2Zmcz4+MTApID4gbWF4X2ZvZmZzKSB7CisJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9ub2lzZSwgIlxuIgorCQkJCQkgICAgS0VSTl9JTkZPICJjc2VnLmZvZmY6ICVkXG4iCisJCQkJCSAgICBLRVJOX0lORk8gImRlc3QgICAgIDogJWQiLAorCQkJCQkgICAgKGludCkodG1wX2luZm8uZm9mZnMgPj4gMTApLAorCQkJCQkgICAgbWF4X2ZvZmZzKTsKKwkJCX0KKwkJCURVTVBfQ01QUl9JTkZPKGZ0X3Rfbm9pc2UsICIiLCAmdG1wX2luZm8pOworCQkJKmNfaW5mbyAgICAgICAgICAgPSB0bXBfaW5mbzsKKwkJCXBvcy0+c2VnX3BvcyAgICAgID0gc2VnbWVudDsKKwkJCXBvcy0+dm9sdW1lX3BvcyAgID0gY19pbmZvLT5mb2ZmczsKKwkJCXBvcy0+c2VnX2J5dGVfcG9zID0gY19pbmZvLT5vZmZzZXQ7CisJCQlUUkFDRShmdF90X25vaXNlLCAiZm91bmQgc2VnbWVudCBhdCAlZCIsIHNlZ21lbnQpOworCQkJVFJBQ0VfRVhJVCAwOworCQl9CisJCXNlZ21lbnQrKzsKKwl9CisJVFJBQ0VfRVhJVCAtRUlPOworfQorCitzdGF0aWMgaW50IHNsb3dfc2Vla19mb3J3YXJkKHVuc2lnbmVkIGludCBkZXN0LAorCQkJICAgICBjbXByX2luZm8gKmNfaW5mbywKKwkJCSAgICAgemZ0X3Bvc2l0aW9uICpwb3MsCisJCQkgICAgIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsCisJCQkgICAgIF9fdTggKmJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgZGlzdGFuY2U7CisJaW50IHJlc3VsdCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCQorCWRpc3RhbmNlID0gZGVzdCAtIChwb3MtPnZvbHVtZV9wb3MgPj4gMTApOworCXdoaWxlICgoZGlzdGFuY2UgPiAwKSAmJgorCSAgICAgICAocmVzdWx0ID0gc2xvd19zZWVrX2ZvcndhcmRfdW50aWxfZXJyb3IoZGlzdGFuY2UsCisJCQkJCQkgICAgICAgY19pbmZvLAorCQkJCQkJICAgICAgIHBvcywKKwkJCQkJCSAgICAgICB2b2x1bWUsCisJCQkJCQkgICAgICAgYnVmKSkgPCAwKSB7CisJCWlmIChyZXN1bHQgPT0gLUVJTlRSKSB7CisJCQlicmVhazsKKwkJfQorCQlUUkFDRShmdF90X25vaXNlLCAic2VnX3BvczogJWQiLCBwb3MtPnNlZ19wb3MpOworCQkvKiB0aGUgZmFpbGluZyBzZWdtZW50IGlzIGVpdGhlciBwb3MtPnNlZ19wb3Mgb3IKKwkJICogcG9zLT5zZWdfcG9zICsgMS4gVGhlcmUgaXMgbm8gbmVlZCB0byBmdXJ0aGVyIHRyeQorCQkgKiB0aGF0IHNlZ21lbnQsIGJlY2F1c2UgZnRhcGVfcmVhZF9zZWdtZW50KCkgYWxyZWFkeQorCQkgKiBoYXMgdHJpZWQgdmVyeSBtdWNoIHRvIHJlYWQgaXQuIFNvIHdlIHN0YXJ0IHdpdGgKKwkJICogZm9sbG93aW5nIHNlZ21lbnQsIHdoaWNoIGlzIHBvcy0+c2VnX3BvcyArIDEKKwkJICovCisJCWlmKHNlYXJjaF92YWxpZF9zZWdtZW50KHBvcy0+c2VnX3BvcysxLCB2b2x1bWUtPmVuZF9zZWcsIGRlc3QsCisJCQkJCXBvcywgY19pbmZvLAorCQkJCQl2b2x1bWUsIGJ1ZikgPCAwKSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAic2VhcmNoX3ZhbGlkX3NlZ21lbnQoKSBmYWlsZWQiKTsKKwkJCXJlc3VsdCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlkaXN0YW5jZSA9IGRlc3QgLSAocG9zLT52b2x1bWVfcG9zID4+IDEwKTsKKwkJcmVzdWx0ID0gMDsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInNlZ21lbnQ6ICVkIiwgcG9zLT5zZWdfcG9zKTsKKwkJLyogZm91bmQgdmFsaWQgc2VnbWVudCwgcmV0cnkgdGhlIHNlZWsgKi8KKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgY29tcHV0ZV9zZWdfcG9zKGNvbnN0IHVuc2lnbmVkIGludCBkZXN0LAorCQkJICAgemZ0X3Bvc2l0aW9uICpwb3MsCisJCQkgICBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKQoreworCWludCBzZWdtZW50OworCWludCBkaXN0YW5jZSA9IGRlc3QgLSAocG9zLT52b2x1bWVfcG9zID4+IDEwKTsKKwl1bnNpZ25lZCBpbnQgcmF3X3NpemU7CisJdW5zaWduZWQgaW50IHZpcnRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZmFjdG9yOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKGRpc3RhbmNlID49IDApIHsKKwkJcmF3X3NpemUgID0gdm9sdW1lLT5lbmRfc2VnIC0gcG9zLT5zZWdfcG9zICsgMTsKKwkJdmlydF9zaXplID0gKCh1bnNpZ25lZCBpbnQpKHZvbHVtZS0+c2l6ZT4+MTApIAorCQkJICAgICAtICh1bnNpZ25lZCBpbnQpKHBvcy0+dm9sdW1lX3Bvcz4+MTApCisJCQkgICAgICsgRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIEZUX0VDQ19TRUNUT1JTIC0gMSk7CisJCXZpcnRfc2l6ZSAvPSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UIC0gRlRfRUNDX1NFQ1RPUlM7CisJCWlmICh2aXJ0X3NpemUgPT0gMCB8fCByYXdfc2l6ZSA9PSAwKSB7CisJCQlUUkFDRV9FWElUIDA7CisJCX0KKwkJaWYgKHJhd19zaXplID49ICgxPDwyNSkpIHsKKwkJCWZhY3RvciA9IHJhd19zaXplLyh2aXJ0X3NpemU+PjcpOworCQl9IGVsc2UgeworCQkJZmFjdG9yID0gKHJhd19zaXplPDw3KS92aXJ0X3NpemU7CisJCX0KKwkJc2VnbWVudCA9IGRpc3RhbmNlLyhGVF9TRUNUT1JTX1BFUl9TRUdNRU5ULUZUX0VDQ19TRUNUT1JTKTsKKwkJc2VnbWVudCA9IChzZWdtZW50ICogZmFjdG9yKT4+NzsKKwl9IGVsc2UgeworCQlyYXdfc2l6ZSAgPSBwb3MtPnNlZ19wb3MgLSB2b2x1bWUtPnN0YXJ0X3NlZyArIDE7CisJCXZpcnRfc2l6ZSA9ICgodW5zaWduZWQgaW50KShwb3MtPnZvbHVtZV9wb3M+PjEwKQorCQkJICAgICArIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSBGVF9FQ0NfU0VDVE9SUyAtIDEpOworCQl2aXJ0X3NpemUgLz0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIEZUX0VDQ19TRUNUT1JTOworCQlpZiAodmlydF9zaXplID09IDAgfHwgcmF3X3NpemUgPT0gMCkgeworCQkJVFJBQ0VfRVhJVCAwOworCQl9CisJCWlmIChyYXdfc2l6ZSA+PSAoMTw8MjUpKSB7CisJCQlmYWN0b3IgPSByYXdfc2l6ZS8odmlydF9zaXplPj43KTsKKwkJfSBlbHNlIHsKKwkJCWZhY3RvciA9IChyYXdfc2l6ZTw8NykvdmlydF9zaXplOworCQl9CisJCXNlZ21lbnQgPSBkaXN0YW5jZS8oRlRfU0VDVE9SU19QRVJfU0VHTUVOVC1GVF9FQ0NfU0VDVE9SUyk7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJmYWN0b3I6ICVkLyVkIiwgZmFjdG9yLCAxPDw3KTsKKwlUUkFDRV9FWElUIHNlZ21lbnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgemZ0X2NtcHJfb3BzIGNtcHJfb3BzID0geworCXpmdGNfd3JpdGUsCisJemZ0Y19yZWFkLAorCXpmdGNfc2VlaywKKwl6ZnRjX2xvY2ssCisJemZ0Y19yZXNldCwKKwl6ZnRjX2NsZWFudXAKK307CisKK2ludCB6ZnRfY29tcHJlc3Nvcl9pbml0KHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisjaWZkZWYgTU9EVUxFCisJcHJpbnRrKEtFUk5fSU5GTyAiemZ0YXBlIGNvbXByZXNzb3IgdjEuMDBhIDk3MDUxNCBmb3IgIiBGVEFQRV9WRVJTSU9OICJcbiIpOworICAgICAgICBpZiAoVFJBQ0VfTEVWRUwgPj0gZnRfdF9pbmZvKSB7CisJCXByaW50aygKK0tFUk5fSU5GTyAiKGMpIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lIChjbGF1c0Btb21vLm1hdGgucnd0aC1hYWNoZW4uZGUpXG4iCitLRVJOX0lORk8gIkNvbXByZXNzb3IgZm9yIHpmdGFwZSAobHpydzMgYWxnb3JpdGhtKVxuIik7CisgICAgICAgIH0KKyNlbHNlIC8qICFNT0RVTEUgKi8KKwkvKiBwcmludCBhIHNob3J0IG5vLW5vbnNlbnNlIGJvb3QgbWVzc2FnZSAqLworCXByaW50aygiemZ0YXBlIGNvbXByZXNzb3IgdjEuMDBhIDk3MDUxNFxuIik7CisJcHJpbnRrKCJGb3IgdXNlIHdpdGggIiBGVEFQRV9WRVJTSU9OICJcbiIpOworI2VuZGlmIC8qIE1PRFVMRSAqLworCVRSQUNFKGZ0X3RfaW5mbywgInpmdF9jb21wcmVzc29yX2luaXQgQCAweCVwIiwgemZ0X2NvbXByZXNzb3JfaW5pdCk7CisJVFJBQ0UoZnRfdF9pbmZvLCAiaW5zdGFsbGluZyBjb21wcmVzc29yIGZvciB6ZnRhcGUgLi4uIik7CisJVFJBQ0VfQ0FUQ0goemZ0X2NtcHJfcmVnaXN0ZXIoJmNtcHJfb3BzKSwpOworCVRSQUNFX0VYSVQgMDsKK30KKworI2lmZGVmIE1PRFVMRQorCitNT0RVTEVfQVVUSE9SKAorCSIoYykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUgKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKAorIkNvbXByZXNzaW9uIHJvdXRpbmVzIGZvciB6ZnRhcGUuIFVzZXMgdGhlIGx6cnczIGFsZ29yaXRobSBieSBSb3NzIFdpbGxpYW1zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIENhbGxlZCBieSBtb2R1bGVzIHBhY2thZ2Ugd2hlbiBpbnN0YWxsaW5nIHRoZSBkcml2ZXIKKyAqLworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHpmdF9jb21wcmVzc29yX2luaXQoKTsKK30KKworI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci96ZnRhcGUtY29tcHJlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjAwNzQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmgKQEAgLTAsMCArMSw4MyBAQAorI2lmbmRlZiBfWkZUQVBFX0NPTVBSRVNTX0gKKyNkZWZpbmUgX1pGVEFQRV9DT01QUkVTU19ICisvKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMSAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxMjozMiAkCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1hY3JvcyBhbmQgZGVmaW5pdGlvbnMgZm9yIHpmdGFwZSdzCisgKiBidWlsdGluIGNvbXByZXNzaW9uIGNvZGUuCisgKgorICovCisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXZ0YmwuaCIKKyNpbmNsdWRlICIuLi9jb21wcmVzc29yL2x6cnczLmgiCisKKy8qIENNUFJfV1JLX01FTV9TSVpFIGdpdmVzIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2lvbiB3cmtfbWVtICovCisvKiBJIGdvdCB0aGVzZSBvdXQgb2YgbHpydzMuYyAqLworI2RlZmluZSBVKFgpICAgICAgICAgICAgKChfX3UzMikgWCkKKyNkZWZpbmUgU0laRV9QX0JZVEUgICAgIChVKHNpemVvZihfX3U4ICopKSkKKyNkZWZpbmUgQUxJR05NRU5UX0ZVREdFIChVKDE2KSkKKworI2RlZmluZSBDTVBSX1dSS19NRU1fU0laRSAoVSg0MDk2KSooU0laRV9QX0JZVEUpICsgQUxJR05NRU5UX0ZVREdFKQorCisvKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhlIHNpemUgb2YgdGhlICJjb21wcmVzc2VkIiBkYXRhIGNhbgorICogZXhjZWVkIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4gQXMgaXQgaXMgcXVpdGUgdXNlbGVzcyB0byBjb21wcmVzcworICogZGF0YSB0d2ljZSBpdCBpcyBzb21ldGltZXMgdGhlIGNhc2UgdGhhdCBpdCBpcyBtb3JlIGVmZmljaWVudCB0bworICogY29weSBhIGJsb2NrIG9mIGRhdGEgYnV0IHRvIGZlZWQgaXQgdG8gdGhlICJjb21wcmVzc2lvbiIKKyAqIGFsZ29yaXRobS4gSW4gdGhpcyBjYXNlIHRoZXJlIGFyZSBzb21lIGZsYWcgYnl0ZXMgb3IgdGhlIGxpa2UKKyAqIHByb2NlZGluZyB0aGUgImNvbXByZXNzZWQiIGRhdGEuICBUSEFUIE1VU1QgTk9UIEJFIFRIRSBDQVNFIGZvciB0aGUKKyAqIGFsZ29yaXRobSB3ZSB1c2UgZm9yIHRoaXMgZHJpdmVyLiBJbnN0ZWFkLCB0aGUgaGlnaCBiaXQgMTUgb2YKKyAqIGNvbXByZXNzZWRfc2l6ZToKKyAqCisgKiBjb21wcmVzc2VkX3NpemUgPSBmdGFwZV9jb21wcmVzcygpCisgKgorICogbXVzdCBiZSBzZXQgaW4gc3VjaCBhIGNhc2UuCisgKgorICogTmV2ZXJ0aGVsZXNzLCBpdCBtaWdodCBhbHNvIGJlIGFzIGZvciBsenJ3MyB0aGF0IHRoZXJlIGlzIGFuCisgKiAiaW50ZXJtZWRpYXRlIiBvdmVycnVuIHRoYXQgZXhjZWVkcyB0aGUgYW1vdW50IG9mIHRoZSBjb21wcmVzc2VkCisgKiBkYXRhIHRoYXQgaXMgYWN0dWFsbHkgcHJvZHVjZWQuIER1cmluZyB0aGUgYWxnb3JpdGhtIHdlIG5lZWQgaW4gdGhlCisgKiB3b3JzdCBjYXNlIE1BWF9DTVBfR1JPVVAgYnl0ZXMgbW9yZSB0aGFuIHRoZSBpbnB1dC1zaXplLgorICovCisjZGVmaW5lIE1BWF9DTVBfR1JPVVAgKDIrMTYqMikgLyogZnJvbSBsenJ3My5jICovCisKKyNkZWZpbmUgQ01QUl9PVkVSUlVOICAgICAgTUFYX0NNUF9HUk9VUCAvKiBkdXJpbmcgY29tcHJlc3Npb24gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgICAgIENNUFJfQlVGRkVSX1NJWkUgKE1BWF9CTE9DS19TSVpFICsgQ01QUl9PVkVSUlVOKQorCisvKiB0aGUgY29tcHJlc3Npb24gbWFwIHN0b3JlcyB0aGUgYnl0ZSBvZmZzZXQgY29tcHJlc3NlZCBibG9ja3Mgd2l0aGluCisgKiB0aGUgY3VycmVudCB2b2x1bWUgZm9yIGNhdHJpZGdlcyB3aXRoIGZvcm1hdCBjb2RlIDIsMyBhbmQgNQorICogKGFuZCBvbGQgdmVyc2lvbnMgb2YgemZ0YXBlKSBhbmQgdGhlIG9mZnNldCBtZWFzdXJlZCBpbiBraWxvYnl0ZXMgZm9yCisgKiBmb3JtYXQgY29kZSA0IGFuZCA2LiBUaGlzIGdpdmVzIHVzIGEgcG9zc2libGUgbWF4LiBzaXplIG9mIGEgCisgKiBjb21wcmVzc2VkIHZvbHVtZSBvZiAxMDI0KjRHSUcgd2hpY2ggc2hvdWxkIGJlIGVub3VnaC4KKyAqLwordHlwZWRlZiBfX3UzMiBDbXByTWFwOworCisvKiBnbG9iYWxzIAorICovCisKKy8qIGV4cG9ydGVkIGZ1bmN0aW9ucworICovCisKKyNlbmRpZiAvKiBfWkZUQVBFX0NPTVBSRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWJhYjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXUtSnVzdHVzIEhlaW5lLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisjCisjICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9NYWtlZmlsZSx2ICQKKyMgJFJldmlzaW9uOiAxLjQgJAorIyAkRGF0ZTogMTk5Ny8xMC8wNyAwOToyNjowMiAkCisjCisjICAgICAgTWFrZWZpbGUgZm9yIHRoZSBsb3dsZXZlbCBwYXJ0IFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUKKyMgICAgICBkcml2ZXIgZm9yIExpbnV4LgorIworCitvYmotJChDT05GSUdfRlRBUEUpICs9IGZ0YXBlLm8KKworZnRhcGUtb2JqcyA6PSBmdGFwZS1pbml0Lm8gZmRjLWlvLm8gZmRjLWlzci5vIFwKKwkgICAgICBmdGFwZS1ic20ubyBmdGFwZS1jdGwubyBmdGFwZS1yZWFkLm8gZnRhcGUtcncubyBcCisJICAgICAgZnRhcGUtd3JpdGUubyBmdGFwZS1pby5vIGZ0YXBlLWNhbGlici5vIGZ0YXBlLWVjYy5vIGZjLTEwLm8gXAorCSAgICAgIGZ0YXBlLWJ1ZmZlci5vIGZ0YXBlLWZvcm1hdC5vIGZ0YXBlX3N5bXMubworCitpZmVxICgkKENPTkZJR19GVEFQRSkseSkKK2Z0YXBlLW9ianMgKz0gZnRhcGUtc2V0dXAubworZW5kaWYKKworaWZuZGVmIENPTkZJR19GVF9OT19UUkFDRV9BVF9BTEwKK2Z0YXBlLW9ianMgKz0gZnRhcGUtdHJhY2luZy5vCitlbmRpZgorCitpZmVxICgkKENPTkZJR19GVF9QUk9DX0ZTKSx5KQorZnRhcGUtb2JqcyArPSBmdGFwZS1wcm9jLm8KK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmMtMTAuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mYy0xMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzFjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmMtMTAuYwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqCisKKyAgIENvcHlyaWdodCAoQykgMTk5MywxOTk0IEpvbiBUb21icy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVGhlIGVudGlyZSBndXRzIG9mIHRoaXMgcHJvZ3JhbSB3YXMgd3JpdHRlbiBieSBkb3NlbXUsIG1vZGlmaWVkIHRvCisgICByZWNvcmQgcmVhZHMgYW5kIHdyaXRlcyB0byB0aGUgcG9ydHMgaW4gdGhlIDB4MTgwLTB4MTg4IGFkZHJlc3Mgc3BhY2UsCisgICB3aGlsZSBydW5uaW5nIHRoZSBDTVMgcHJvZ3JhbSBUQVBFLkVYRSBWMi4wLjUgc3VwcGxpZWQgd2l0aCB0aGUgZHJpdmUuCisKKyAgIE1vZGlmaWVkIHRvIHVzZSBhbiBhcnJheSBvZiBhZGRyZXNzZXMgYW5kIGdlbmVyYWxseSBjbGVhbmVkIHVwIChtYWRlCisgICBtdWNoIHNob3J0ZXIpIDQgSnVuZSA5NCwgZG9zZW11IGlzbid0IHRoYXQgZ29vZCBhdCB3cml0aW5nIHNob3J0IGNvZGUgaXQKKyAgIHdvdWxkIHNlZW0gOi0pLiBNYWRlIGluZGVwZW5kZW50IG9mIDB4MTgwLCBidXQgSSBkb3VidCBpdCB3aWxsIHdvcmsKKyAgIGF0IGFueSBvdGhlciBhZGRyZXNzLgorCisgICBNb2RpZmllZCBmb3IgZGlzdHJpYnV0aW9uIHdpdGggZnRhcGUgc291cmNlLiAyMSBKdW5lIDk0LCBTSkwuCisKKyAgIE1vZGlmaWNhdGlvbnMgb24gMjAgT2N0b2JlciA5NSwgYnkgRGFuaWVsIENvaGVuIChjYXRtYW5Ad3BpLmVkdSk6CisgICBNb2RpZmllZCB0byBzdXBwb3J0IGRpZmZlcmVudCBETUEsIElSUSwgYW5kIElPIFBvcnRzLiAgQm9ybGFuZCdzCisgICBUdXJibyBEZWJ1Z2dlciBpbiB2aXJ0dWFsIDgwODYgbW9kZSAoVEQzODYuRVhFIHdpdGggaGFyZHdhcmUgYnJlYWtwb2ludHMKKyAgIHByb3ZpZGVkIGJ5IHRoZSBUREgzODYuU1lTIERldmljZSBEcml2ZXIpIHdhcyB1c2VkIG9uIHRoZSBDTVMgcHJvZ3JhbQorICAgVEFQRSBWNC4wLjUuICBJIHNldCBicmVha3BvaW50cyBvbiBJL08gdG8gcG9ydHMgMHgxODAtMHgxODcuICBOb3RlIHRoYXQKKyAgIENNUydzIHByb2dyYW0gd2lsbCBub3Qgc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZSB0aGUgdGFwZSBkcml2ZSBpZiB5b3Ugc2V0CisgICBicmVha3BvaW50cyBvbiBJTyBSZWFkcywgYnV0IHlvdSBjYW4gc2V0IHRoZW0gb24gSU8gV3JpdGVzIHdpdGhvdXQgcHJvYmxlbXMuCisgICBLbm93biBwcm9ibGVtczoKKyAgIC0gWW91IGNhbiBub3QgdXNlIERNQSBDaGFubmVscyA1IG9yIDcuCisKKyAgIE1vZGlmaWNhdGlvbiBvbiAyOSBKYW51YXJ5IDk2LCBieSBEYW5pZWwgQ29oZW4gKGNhdG1hbkB3cGkuZWR1KToKKyAgIE1vZGlmaWVkIHRvIG9ubHkgYWNjZXB0IElSUXMgMyAtIDcsIG9yIDkuICBTaW5jZSB3ZSBjYW4gb25seSBzZW5kIGEgMyBiaXQKKyAgIG51bWJlciByZXByZXNlbnRpbmcgdGhlIElSUSB0byB0aGUgY2FyZCwgc3BlY2lhbCBoYW5kbGluZyBpcyByZXF1aXJlZCB3aGVuCisgICBJUlEgOSBpcyBzZWxlY3RlZC4gIElSUSAyIGFuZCA5IGFyZSB0aGUgc2FtZSwgYW5kIHdlIHNob3VsZCByZXF1ZXN0IElSUSA5CisgICBmcm9tIHRoZSBrZXJuZWwgd2hpbGUgdGVsbGluZyB0aGUgY2FyZCB0byB1c2UgSVJRIDIuICBUaGFua3MgdG8gR3JlZworICAgQ3JpZGVyIChnY3JpZGVyQGljbG5ldC5vcmcpIGZvciBmaW5kaW5nIGFuZCBsb2NhdGluZyB0aGlzIGJ1ZywgYXMgd2VsbCBhcworICAgdGVzdGluZyB0aGUgcGF0Y2guCisKKyAgIE1vZGlmaWNhdGlvbiBvbiAxMSBEZWNlbWJlciA5NiwgYnkgQ2xhdXMgSGVpbmUgKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSk6CisgICBNb2RpZmllZCBhIGxpdHRsZSB0byB1c2UgdmFyaWFobGUgZnRfZmRjX2Jhc2UsIGZ0X2ZkY19pcnEsIGZ0X2ZkY19kbWEgCisgICBpbnN0ZWFkIG9mIHByZXByb2Nlc3NvciBzeW1ib2xzLiBUaHVzIHdlIGNhbiBjb21waWxlIHRoaXMgaW50byB0aGUgbW9kdWxlCisgICBvciBrZXJuZWwgYW5kIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBvcHRpb25zIGFzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZmMtMTAuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjA0ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciB0aGUgQ01TIEZDLTEwL0ZDLTIwIGNhcmQuCisgKi8KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pby5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZjLTEwLmgiCisKK3N0YXRpYyBfX3UxNiBpbmJzX21hZ2ljW10gPSB7CisJMHgzLCAweDMsIDB4MCwgMHg0LCAweDcsIDB4MiwgMHg1LCAweDMsIDB4MSwgMHg0LAorCTB4MywgMHg1LCAweDIsIDB4MCwgMHgzLCAweDcsIDB4NCwgMHgyLAorCTB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3Cit9OworCitzdGF0aWMgX191MTYgZmMxMF9wb3J0c1tdID0geworCTB4MTgwLCAweDIxMCwgMHgyQTAsIDB4MzAwLCAweDMzMCwgMHgzNDAsIDB4MzcwCit9OworCitpbnQgZmMxMF9lbmFibGUodm9pZCkKK3sKKwlpbnQgaTsKKwlfX3U4IGNhcmRDb25maWcgPSAweDAwOworCV9fdTggeDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworLyogIFRoaXMgY29kZSB3aWxsIG9ubHkgd29yayBpZiB0aGUgRkMtMTAgKG9yIEZDLTIwKSBpcyBzZXQgdG8KKyAqICB1c2UgRE1BIGNoYW5uZWxzIDEsIDIsIG9yIDMuICBETUEgY2hhbm5lbHMgNSBhbmQgNyBzZWVtIHRvIGJlIAorICogIGluaXRpYWxpemVkIGJ5IHRoZSBzYW1lIGNvbW1hbmQgYXMgY2hhbm5lbHMgMSBhbmQgMywgcmVzcGVjdGl2ZWx5LgorICovCisJaWYgKGZ0X2ZkY19kbWEgPiAzKSB7CisJCVRSQUNFX0FCT1JUKDAsIGZ0X3RfZXJyLAorIkVycm9yOiBUaGUgRkMtMTAvMjAgbXVzdCBiZSBzZXQgdG8gdXNlIERNQSBjaGFubmVscyAxLCAyLCBvciAzISIpOworCX0KKy8qICBPbmx5IGFsbG93IHRoZSBGQy0xMC8yMCB0byB1c2UgSVJRIDMtNywgb3IgOS4gIE5vdGUgdGhhdCBDTVMncyBwcm9ncmFtCisgKiAgb25seSBhY2NlcHRzIElSUSdzIDItNywgYnV0IGluIGxpbnV4LCBJUlEgMiBpcyB0aGUgc2FtZSBhcyBJUlEgOS4KKyAqLworCWlmIChmdF9mZGNfaXJxIDwgMyB8fCBmdF9mZGNfaXJxID09IDggfHwgZnRfZmRjX2lycSA+IDkpIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9lcnIsIAorIkVycm9yOiBUaGUgRkMtMTAvMjAgbXVzdCBiZSBzZXQgdG8gdXNlIElSUSBsZXZlbHMgMyAtIDcsIG9yIDkhXG4iCitLRVJOX0lORk8gIk5vdGU6IElSUSA5IGlzIHRoZSBzYW1lIGFzIElSUSAyIik7CisJfQorCS8qICBDbGVhciBzdGF0ZSBtYWNoaW5lID8/PworCSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9JVEVNUyhpbmJzX21hZ2ljKTsgaSsrKSB7CisJCWluYihmdF9mZGNfYmFzZSArIGluYnNfbWFnaWNbaV0pOworCX0KKwlvdXRiKDB4MCwgZnRfZmRjX2Jhc2UpOworCisJeCA9IGluYihmdF9mZGNfYmFzZSk7CisJaWYgKHggPT0gMHgxMyB8fCB4ID09IDB4OTMpIHsKKwkJZm9yIChpID0gMTsgaSA8IDg7IGkrKykgeworCQkJaWYgKGluYihmdF9mZGNfYmFzZSArIGkpICE9IHgpIHsKKwkJCQlUUkFDRV9FWElUIDA7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlUUkFDRV9FWElUIDA7CisJfQorCisJb3V0YigweDgsIGZ0X2ZkY19iYXNlKTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKGluYihmdF9mZGNfYmFzZSArIGkpICE9IDB4MCkgeworCQkJVFJBQ0VfRVhJVCAwOworCQl9CisJfQorCW91dGIoMHgxMCwgZnRfZmRjX2Jhc2UpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoaW5iKGZ0X2ZkY19iYXNlICsgaSkgIT0gMHhmZikgeworCQkJVFJBQ0VfRVhJVCAwOworCQl9CisJfQorCisJLyogIE9rYXksIHdlIGZvdW5kIGEgRkMtMTAgY2FyZCAhID8/PworCSAqLworCW91dGIoMHgwLCBmZGMuY2NyKTsKKworCS8qICBDbGVhciBzdGF0ZSBtYWNoaW5lIGFnYWluID8/PworCSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9JVEVNUyhpbmJzX21hZ2ljKTsgaSsrKSB7CisJCWluYihmdF9mZGNfYmFzZSArIGluYnNfbWFnaWNbaV0pOworCX0KKwkvKiBTZW5kIGlvIHBvcnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfSVRFTVMoZmMxMF9wb3J0cyk7IGkrKykKKwkJaWYgKGZ0X2ZkY19iYXNlID09IGZjMTBfcG9ydHNbaV0pCisJCQljYXJkQ29uZmlnID0gaSArIDE7CisJaWYgKGNhcmRDb25maWcgPT0gMCkgeworCQlUUkFDRV9FWElUIDA7CS8qIEludmFsaWQgSS9PIFBvcnQgKi8KKwl9CisJLyogYW5kIElSUSAtIElmIHVzaW5nIElSUSA5LCB0ZWxsIHRoZSBGQyBjYXJkIGl0IGlzIGFjdHVhbGx5IElSUSAyICovCisJaWYgKGZ0X2ZkY19pcnEgIT0gOSkKKwkJY2FyZENvbmZpZyB8PSBmdF9mZGNfaXJxIDw8IDM7CisJZWxzZQorCQljYXJkQ29uZmlnIHw9IDIgPDwgMzsKKworCS8qIGFuZCBmaW5hbGx5IERNQSBDaGFubmVsICovCisJY2FyZENvbmZpZyB8PSBmdF9mZGNfZG1hIDw8IDY7CisJb3V0YihjYXJkQ29uZmlnLCBmdF9mZGNfYmFzZSk7CS8qIERNQSBbMiBiaXRzXS9JUlEgWzMgYml0c10vQkFTRSBbMyBiaXRzXSAqLworCisJLyogIEVuYWJsZSBGQy0xMCA/Pz8KKwkgKi8KKwlvdXRiKDAsIGZkYy5jY3IpOworCW91dGIoMCwgZmRjLmRvcjIpOworCW91dGIoRkRDX0RNQV9NT0RFIC8qIDggKi8sIGZkYy5kb3IpOworCW91dGIoRkRDX0RNQV9NT0RFIC8qIDggKi8sIGZkYy5kb3IpOworCW91dGIoMSwgZmRjLmRvcjIpOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKgorCSAqIGNIOiB3aHkgdGhlIGhlbGwgc2hvdWxkIHRoaXMgYmUgbmVjZXNzYXJ5PyBUaGlzIGlzIGRvbmUgCisJICogICAgIGJ5IGZkY19yZXNldCgpISEhCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiAgSW5pdGlhbGl6ZSBmZGMsIHNlbGVjdCBkcml2ZSBCOgorCSAqLworCW91dGIoRkRDX0RNQV9NT0RFLCBmZGMuZG9yKTsJLyogYXNzZXJ0IHJlc2V0LCBkbWEgJiBpcnEgZW5hYmxlZCAqLworCS8qICAgICAgIDB4MDggICAgKi8KKwlvdXRiKEZEQ19ETUFfTU9ERXxGRENfUkVTRVRfTk9ULCBmZGMuZG9yKTsJLyogcmVsZWFzZSByZXNldCAqLworCS8qICAgICAgIDB4MDggICAgfCAgIDB4MDQgICA9IDB4MGMgKi8KKwlvdXRiKEZEQ19ETUFfTU9ERXxGRENfUkVTRVRfTk9UfEZEQ19NT1RPUl8xfEZUQVBFX1NFTF9CLCBmZGMuZG9yKTsKKwkvKiAgICAgICAweDA4ICAgIHwgICAweDA0ICAgICAgfCAgMHgyMCAgICAgfCAgMHgwMSAgPSAweDJkICovICAgIAorCS8qIHNlbGVjdCBkcml2ZSAxICovIC8qIHdoeSBub3QgZHJpdmUgMCA/Pz8/ICovCisJVFJBQ0VfRVhJVCAoeCA9PSAweDkzKSA/IDIgOiAxOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZjLTEwLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmMtMTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTdiODhiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZjLTEwLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfRkNfMTBfSAorI2RlZmluZSBfRkNfMTBfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgQmFzIExhYXJob3Zlbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZmMtMTAuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4xICQKKyAqICREYXRlOiAxOTk3LzA5LzE5IDA5OjA1OjIyICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgdGhlIEZDLTEwIGNvZGUKKyAqICAgICAgb2YgdGhlIFFJQy00MC84MCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICovCisKKy8qCisgKiAgICAgIGZjLTEwLmMgZGVmaW5lZCBnbG9iYWwgdmFycy4KKyAqLworCisvKgorICogICAgICBmYy0xMC5jIGRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9ucy4KKyAqLworZXh0ZXJuIGludCBmYzEwX2VuYWJsZSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlvLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwNGEyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uYwpAQCAtMCwwICsxLDEzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uYyx2ICQKKyAqICRSZXZpc2lvbjogMS43LjQuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMS8xNiAxNDo0ODoxNyAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGxvdy1sZXZlbCBmbG9wcHkgZGlzayBpbnRlcmZhY2UgY29kZQorICogICAgICBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyICJmdGFwZSIgZm9yCisgKiAgICAgIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4gLyogZm9yIENPTkZJR19GVF8qICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlzci5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mYy0xMC5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCitzdGF0aWMgaW50IGZ0YXBlX21vdG9yOwordm9sYXRpbGUgaW50IGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPSAtMTsKK3ZvbGF0aWxlIGZkY19tb2RlX2VudW0gZmRjX21vZGUgPSBmZGNfaWRsZTsKK2ZkY19jb25maWdfaW5mbyBmZGM7CitERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChmdGFwZV93YWl0X2ludHIpOworCit1bnNpZ25lZCBpbnQgZnRfZmRjX2Jhc2UgICAgICAgPSBDT05GSUdfRlRfRkRDX0JBU0U7Cit1bnNpZ25lZCBpbnQgZnRfZmRjX2lycSAgICAgICAgPSBDT05GSUdfRlRfRkRDX0lSUTsKK3Vuc2lnbmVkIGludCBmdF9mZGNfZG1hICAgICAgICA9IENPTkZJR19GVF9GRENfRE1BOwordW5zaWduZWQgaW50IGZ0X2ZkY190aHJlc2hvbGQgID0gQ09ORklHX0ZUX0ZEQ19USFI7ICAvKiBieXRlcyAqLwordW5zaWduZWQgaW50IGZ0X2ZkY19yYXRlX2xpbWl0ID0gQ09ORklHX0ZUX0ZEQ19NQVhfUkFURTsgLyogYml0cy9zZWMgKi8KK2ludCBmdF9wcm9iZV9mYzEwICAgICAgICA9IENPTkZJR19GVF9QUk9CRV9GQzEwOworaW50IGZ0X21hY2gyICAgICAgICAgICAgID0gQ09ORklHX0ZUX01BQ0gyOworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyBzcGlubG9ja190IGZkY19pb19sb2NrOyAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmRjX2NhbGlicl9jb3VudDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmRjX2NhbGlicl90aW1lOworc3RhdGljIGludCBmZGNfc3RhdHVzOwordm9sYXRpbGUgX191OCBmZGNfaGVhZDsJCS8qIEZEQyBoZWFkIGZyb20gc2VjdG9yIGlkICovCit2b2xhdGlsZSBfX3U4IGZkY19jeWw7CQkvKiBGREMgdHJhY2sgZnJvbSBzZWN0b3IgaWQgKi8KK3ZvbGF0aWxlIF9fdTggZmRjX3NlY3Q7CQkvKiBGREMgc2VjdG9yIGZyb20gc2VjdG9yIGlkICovCitzdGF0aWMgaW50IGZkY19kYXRhX3JhdGUgPSA1MDA7CS8qIGRhdGEgcmF0ZSAoS2JwcykgKi8KK3N0YXRpYyBpbnQgZmRjX3JhdGVfY29kZTsJLyogZGF0YSByYXRlIGNvZGUgKDAgPT0gNTAwIEticHMpICovCitzdGF0aWMgaW50IGZkY19zZWVrX3JhdGUgPSAyOwkvKiBzdGVwIHJhdGUgKG1zZWMpICovCitzdGF0aWMgdm9pZCAoKmRvX2Z0YXBlKSAodm9pZCk7CitzdGF0aWMgaW50IGZkY19maWZvX3N0YXRlOwkvKiBvcmlnaW5hbCBmaWZvIHNldHRpbmcgLSBmaWZvIGVuYWJsZWQgKi8KK3N0YXRpYyBpbnQgZmRjX2ZpZm9fdGhyOwkvKiBvcmlnaW5hbCBmaWZvIHNldHRpbmcgLSB0aHJlc2hvbGQgKi8KK3N0YXRpYyBpbnQgZmRjX2xvY2tfc3RhdGU7CS8qIG9yaWdpbmFsIGxvY2sgc2V0dGluZyAtIGxvY2tlZCAqLworc3RhdGljIGludCBmZGNfZmlmb19sb2NrZWQ7CS8qIGhhcyBmaWZvICYmIGxvY2sgc2V0ID8gKi8KK3N0YXRpYyBfX3U4IGZkY19wcmVjb21wOwkvKiBkZWZhdWx0IHByZWNvbXAuIHZhbHVlIChuc2VjKSAqLworc3RhdGljIF9fdTggZmRjX3ByZWNfY29kZTsJLyogZmRjIHByZWNvbXAuIHNlbGVjdCBjb2RlICovCisKK3N0YXRpYyBjaGFyIGZ0YXBlX2lkW10gPSAiZnRhcGUiOyAgLyogdXNlZCBieSByZXF1ZXN0IGlycSBhbmQgZnJlZSBpcnEgKi8KKworc3RhdGljIGludCBmZGNfc2V0X3NlZWtfcmF0ZShpbnQgc2Vla19yYXRlKTsKKwordm9pZCBmZGNfY2F0Y2hfc3RyYXlfaW50ZXJydXB0cyhpbnQgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCWlmIChjb3VudCA9PSAwKSB7CisJCWZ0X2V4cGVjdGVkX3N0cmF5X2ludGVycnVwdHMgPSAwOworCX0gZWxzZSB7CisJCWZ0X2V4cGVjdGVkX3N0cmF5X2ludGVycnVwdHMgKz0gY291bnQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZkY19pb19sb2NrLCBmbGFncyk7Cit9CisKKy8qICBXYWl0IGR1cmluZyBhIHRpbWVvdXQgcGVyaW9kIGZvciBhIGdpdmVuIEZEQyBzdGF0dXMuCisgKiAgSWYgdXNlY3MgPT0gMCB0aGVuIGp1c3QgdGVzdCBzdGF0dXMsIGVsc2Ugd2FpdCBhdCBsZWFzdCBmb3IgdXNlY3MuCisgKiAgUmV0dXJucyAtRVRJTUUgb24gdGltZW91dC4gRnVuY3Rpb24gbXVzdCBiZSBjYWxpYnJhdGVkIGZpcnN0ICEKKyAqLworc3RhdGljIGludCBmZGNfd2FpdCh1bnNpZ25lZCBpbnQgdXNlY3MsIF9fdTggbWFzaywgX191OCBzdGF0ZSkKK3sKKwlpbnQgY291bnRfMSA9IChmZGNfY2FsaWJyX2NvdW50ICogdXNlY3MgKworICAgICAgICAgICAgICAgICAgICAgICBmZGNfY2FsaWJyX2NvdW50IC0gMSkgLyBmZGNfY2FsaWJyX3RpbWU7CisKKwlkbyB7CisJCWZkY19zdGF0dXMgPSBpbmJfcChmZGMubXNyKTsKKwkJaWYgKChmZGNfc3RhdHVzICYgbWFzaykgPT0gc3RhdGUpIHsKKwkJCXJldHVybiAwOworCQl9CisJfSB3aGlsZSAoY291bnRfMS0tID49IDApOworCXJldHVybiAtRVRJTUU7Cit9CisKK2ludCBmZGNfcmVhZHlfd2FpdCh1bnNpZ25lZCBpbnQgdXNlY3MpCit7CisJcmV0dXJuIGZkY193YWl0KHVzZWNzLCBGRENfREFUQV9SRUFEWSB8IEZEQ19CVVNZLCBGRENfREFUQV9SRUFEWSk7Cit9CisKKy8qIFdoeSBjYW4ndCB3ZSBqdXN0IHVzZSB1ZGVsYXkoKT8KKyAqLworc3RhdGljIHZvaWQgZmRjX3VzZWNfd2FpdCh1bnNpZ25lZCBpbnQgdXNlY3MpCit7CisJZmRjX3dhaXQodXNlY3MsIDAsIDEpOwkvKiB3aWxsIGFsd2F5cyB0aW1lb3V0ICEgKi8KK30KKworc3RhdGljIGludCBmZGNfcmVhZHlfb3V0X3dhaXQodW5zaWduZWQgaW50IHVzZWNzKQoreworCWZkY191c2VjX3dhaXQoRlRfUlFNX0RFTEFZKTsJLyogd2FpdCBmb3IgdmFsaWQgUlFNIHN0YXR1cyAqLworCXJldHVybiBmZGNfd2FpdCh1c2VjcywgRkRDX0RBVEFfT1VUX1JFQURZLCBGRENfREFUQV9PVVRfUkVBRFkpOworfQorCit2b2lkIGZkY193YWl0X2NhbGlicmF0ZSh2b2lkKQoreworCWZ0YXBlX2NhbGlicmF0ZSgiZmRjX3dhaXQiLAorCQkJZmRjX3VzZWNfd2FpdCwgJmZkY19jYWxpYnJfY291bnQsICZmZGNfY2FsaWJyX3RpbWUpOyAKK30KKworLyogIFdhaXQgZm9yIGEgKHNob3J0KSB3aGlsZSBmb3IgdGhlIEZEQyB0byBiZWNvbWUgcmVhZHkKKyAqICBhbmQgdHJhbnNmZXIgdGhlIG5leHQgY29tbWFuZCBieXRlLgorICogIFJldHVybiAtRVRJTUUgb24gdGltZW91dCBvbiBnZXR0aW5nIHJlYWR5IChkZXBlbmRzIG9uIGhhcmR3YXJlISkuCisgKi8KK3N0YXRpYyBpbnQgZmRjX3dyaXRlKGNvbnN0IF9fdTggZGF0YSkKK3sKKwlmZGNfdXNlY193YWl0KEZUX1JRTV9ERUxBWSk7CS8qIHdhaXQgZm9yIHZhbGlkIFJRTSBzdGF0dXMgKi8KKwlpZiAoZmRjX3dhaXQoMTUwLCBGRENfREFUQV9SRUFEWV9NQVNLLCBGRENfREFUQV9JTl9SRUFEWSkgPCAwKSB7CisJCXJldHVybiAtRVRJTUU7CisJfSBlbHNlIHsKKwkJb3V0YihkYXRhLCBmZGMuZmlmbyk7CisJCXJldHVybiAwOworCX0KK30KKworLyogIFdhaXQgZm9yIGEgKHNob3J0KSB3aGlsZSBmb3IgdGhlIEZEQyB0byBiZWNvbWUgcmVhZHkKKyAqICBhbmQgdHJhbnNmZXIgdGhlIG5leHQgcmVzdWx0IGJ5dGUuCisgKiAgUmV0dXJuIC1FVElNRSBpZiB0aW1lb3V0IG9uIGdldHRpbmcgcmVhZHkgKGRlcGVuZHMgb24gaGFyZHdhcmUhKS4KKyAqLworc3RhdGljIGludCBmZGNfcmVhZChfX3U4ICogZGF0YSkKK3sKKwlmZGNfdXNlY193YWl0KEZUX1JRTV9ERUxBWSk7CS8qIHdhaXQgZm9yIHZhbGlkIFJRTSBzdGF0dXMgKi8KKwlpZiAoZmRjX3dhaXQoMTUwLCBGRENfREFUQV9SRUFEWV9NQVNLLCBGRENfREFUQV9PVVRfUkVBRFkpIDwgMCkgeworCQlyZXR1cm4gLUVUSU1FOworCX0gZWxzZSB7CisJCSpkYXRhID0gaW5iKGZkYy5maWZvKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiAgT3V0cHV0IGEgY21kX2xlbiBsb25nIGNvbW1hbmQgc3RyaW5nIHRvIHRoZSBGREMuCisgKiAgVGhlIEZEQyBzaG91bGQgYmUgcmVhZHkgdG8gcmVjZWl2ZSBhIG5ldyBjb21tYW5kIG9yCisgKiAgYW4gZXJyb3IgKEVCVVNZIG9yIEVUSU1FKSB3aWxsIG9jY3VyLgorICovCitpbnQgZmRjX2NvbW1hbmQoY29uc3QgX191OCAqIGNtZF9kYXRhLCBpbnQgY21kX2xlbikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCA9IGNtZF9sZW47CisJaW50IHJldHJ5ID0gMDsKKyNpZmRlZiBURVNUSU5HCisJc3RhdGljIHVuc2lnbmVkIGludCBsYXN0X3RpbWU7CisJdW5zaWduZWQgaW50IHRpbWU7CisjZW5kaWYKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJZmRjX3VzZWNfd2FpdChGVF9SUU1fREVMQVkpOwkvKiB3YWl0IGZvciB2YWxpZCBSUU0gc3RhdHVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZkY19pb19sb2NrLCBmbGFncyk7CisJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwkJLyogWWVzLCBJIGtub3csIHRvbyBtdWNoIGNvbW1lbnRzIGluc2lkZSB0aGlzIGZ1bmN0aW9uCisJCSAqIC4uLgorCQkgKiAKKwkJICogWWV0IGFub3RoZXIgYnVnIGluIHRoZSBvcmlnaW5hbCBkcml2ZXIuIEFsbCB0aGF0CisJCSAqIGhhdm9jIGlzIGNhdXNlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBpc3IoKSBzZW5kcworCQkgKiBpdHNlbGYgYSBjb21tYW5kIHRvIHRoZSBmbG9wcHkgdGFwZSBkcml2ZXIgKHBhdXNlLAorCQkgKiBtaWNybyBzdGVwIHBhdXNlKS4gIE5vdywgdGhlIHByb2JsZW0gaXMgdGhhdAorCQkgKiBjb21tYW5kcyBhcmUgdHJhbnNtaXR0ZWQgdmlhIHRoZSBmZGNfc2VlaworCQkgKiBjb21tYW5kLiBCdXQ6IHRoZSBmZGMgcGVyZm9ybXMgc2Vla3MgaW4gdGhlCisJCSAqIGJhY2tncm91bmQgaS5lLiBpdCBkb2Vzbid0IHNpZ25hbCBidXN5IHdoaWxlCisJCSAqIHNlbmRpbmcgdGhlIHN0ZXAgcHVsc2VzIHRvIHRoZSBkcml2ZS4gVGhlcmVmb3JlIHRoZQorCQkgKiBub24taW50ZXJydXB0IGxldmVsIGRyaXZlciBoYXMgbm8gY2hhbmNlIHRvIHRlbGwKKwkJICogd2hldGhlciB0aGUgaXNyKCkganVzdCBoYXMgaXNzdWVkIGEgc2Vlay4gVGhlcmVmb3JlCisJCSAqIHdlIEhBVkUgVE8gaGF2ZSBhIGxvb2sgYXQgdGhlIGZ0X2hpZGVfaW50ZXJydXB0CisJCSAqIGZsYWc6IGl0IHNpZ25hbHMgdGhlIG5vbi1pbnRlcnJ1cHQgbGV2ZWwgcGFydCBvZgorCQkgKiB0aGUgZHJpdmVyIHRoYXQgaXQgaGFzIHRvIHdhaXQgZm9yIHRoZSBmZGMgdW50aWwgaXQKKwkJICogaGFzIGNvbXBsZXRldCBzZWVraW5nLgorCQkgKgorCQkgKiBUSElTIFdBUyBQUkVTVU1BQkxZIFRIRSBSRUFTT04gRk9SIEFMTCBUSEFUCisJCSAqICJmZGNfcmVhZCB0aW1lb3V0IiBlcnJvcnMsIEkgSE9QRSA6LSkKKwkJICovCisJCWlmIChmdF9oaWRlX2ludGVycnVwdCkgeworCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlUUkFDRShmdF90X2luZm8sCisJCQkgICAgICAiV2FpdGluZyBmb3IgdGhlIGlzcigpIGNvbXBsZXRpbmcgZmRjX3NlZWsoKSIpOworCQkJaWYgKGZkY19pbnRlcnJ1cHRfd2FpdCgyICogRlRfU0VDT05EKSA8IDApIHsKKwkJCQlUUkFDRShmdF90X3dhcm4sCisJCSAgICAgICJXYXJuaW5nOiB0aW1lb3V0IHdhaXRpbmcgZm9yIGlzcigpIHNlZWsgdG8gY29tcGxldGUiKTsKKwkJCX0KKwkJCWlmIChmdF9oaWRlX2ludGVycnVwdCB8fCAhZnRfc2Vla19jb21wbGV0ZWQpIHsKKwkJCQkvKiBUaGVyZSBjYW5ub3QgYmUgYW5vdGhlcgorCQkJCSAqIGludGVycnVwdC4gVGhlIGlzcigpIG9ubHkgc3RvcHMKKwkJCQkgKiB0aGUgdGFwZSBhbmQgdGhlIG5leHQgaW50ZXJydXB0CisJCQkJICogd29uJ3QgY29tZSB1bnRpbCB3ZSBoYXZlIHNlbmQgb3VyCisJCQkJICogY29tbWFuZCB0byB0aGUgZHJpdmUuCisJCQkJICovCisJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9idWcsCisJCQkJCSAgICAiQlVHPyBpc3IoKSBpcyBzdGlsbCBzZWVraW5nP1xuIgorCQkJCQkgICAgS0VSTl9JTkZPICJoaWRlOiAlZFxuIgorCQkJCQkgICAgS0VSTl9JTkZPICJzZWVrOiAlZCIsCisJCQkJCSAgICBmdF9oaWRlX2ludGVycnVwdCwKKwkJCQkJICAgIGZ0X3NlZWtfY29tcGxldGVkKTsKKworCQkJfQorCQkJZmRjX3VzZWNfd2FpdChGVF9SUU1fREVMQVkpOwkvKiB3YWl0IGZvciB2YWxpZCBSUU0gc3RhdHVzICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKKwkJfQorCWZkY19zdGF0dXMgPSBpbmIoZmRjLm1zcik7CisJaWYgKChmZGNfc3RhdHVzICYgRkRDX0RBVEFfUkVBRFlfTUFTSykgIT0gRkRDX0RBVEFfSU5fUkVBRFkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKKwkJVFJBQ0VfQUJPUlQoLUVCVVNZLCBmdF90X2VyciwgImZkYyBub3QgcmVhZHkiKTsKKwl9IAorCWZkY19tb2RlID0gKmNtZF9kYXRhOwkvKiB1c2VkIGJ5IGlzciAqLworI2lmZGVmIFRFU1RJTkcKKwlpZiAoZmRjX21vZGUgPT0gRkRDX1NFRUspIHsKKwkJdGltZSA9IGZ0YXBlX3RpbWVkaWZmKGxhc3RfdGltZSwgZnRhcGVfdGltZXN0YW1wKCkpOworCQlpZiAodGltZSA8IDYwMDApIHsKKwlUUkFDRShmdF90X2J1ZywiV2FybmluZzogc2hvcnQgdGltZW91dCBiZXR3ZWVuIHNlZWsgY29tbWFuZHM6ICVkIiwKKwkgICAgICB0aW1lKTsKKwkJfQorCX0KKyNlbmRpZgorCWlmICghaW5faW50ZXJydXB0KCkpIHsKKwkJLyogc2hvdWxkbid0IGJlIGNsZWFyZWQgaWYgY2FsbGVkIGZyb20gaXNyCisJCSAqLworCQlmdF9pbnRlcnJ1cHRfc2VlbiA9IDA7CisJfQorCXdoaWxlIChjb3VudCkgeworCQlyZXN1bHQgPSBmZGNfd3JpdGUoKmNtZF9kYXRhKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCVRSQUNFKGZ0X3RfZmRjX2RtYSwKKwkJCSAgICAgICJmZGNfbW9kZSA9ICUwMngsIHN0YXR1cyA9ICUwMnggYXQgaW5kZXggJWQiLAorCQkJICAgICAgKGludCkgZmRjX21vZGUsIChpbnQpIGZkY19zdGF0dXMsCisJCQkgICAgICBjbWRfbGVuIC0gY291bnQpOworCQkJaWYgKCsrcmV0cnkgPD0gMykgeworCQkJCVRSQUNFKGZ0X3Rfd2FybiwgImZkY193cml0ZSB0aW1lb3V0LCByZXRyeSIpOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2VyciwgImZkY193cml0ZSB0aW1lb3V0LCBmYXRhbCIpOworCQkJCS8qIHJlY292ZXIgPz8/ICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQktLWNvdW50OworCQkJKytjbWRfZGF0YTsKKwkJfQorICAgICAgICB9CisjaWZkZWYgVEVTVElORworCWlmIChmZGNfbW9kZSA9PSBGRENfU0VFSykgeworCQlsYXN0X3RpbWUgPSBmdGFwZV90aW1lc3RhbXAoKTsKKwl9CisjZW5kaWYKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKiAgSW5wdXQgYSByZXNfbGVuIGxvbmcgcmVzdWx0IHN0cmluZyBmcm9tIHRoZSBGREMuCisgKiAgVGhlIEZEQyBzaG91bGQgYmUgcmVhZHkgdG8gc2VuZCB0aGUgcmVzdWx0IG9yIGFuIGVycm9yCisgKiAgKEVCVVNZIG9yIEVUSU1FKSB3aWxsIG9jY3VyLgorICovCitpbnQgZmRjX3Jlc3VsdChfX3U4ICogcmVzX2RhdGEsIGludCByZXNfbGVuKQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50ID0gcmVzX2xlbjsKKwlpbnQgcmV0cnkgPSAwOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKKwlmZGNfc3RhdHVzID0gaW5iKGZkYy5tc3IpOworCWlmICgoZmRjX3N0YXR1cyAmIEZEQ19EQVRBX1JFQURZX01BU0spICE9IEZEQ19EQVRBX09VVF9SRUFEWSkgeworCQlUUkFDRShmdF90X2VyciwgImZkYyBub3QgcmVhZHkiKTsKKwkJcmVzdWx0ID0gLUVCVVNZOworCX0gZWxzZSB3aGlsZSAoY291bnQpIHsKKwkJaWYgKCEoZmRjX3N0YXR1cyAmIEZEQ19CVVNZKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKKwkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAicHJlbWF0dXJlIGVuZCBvZiByZXN1bHQgcGhhc2UiKTsKKwkJfQorCQlyZXN1bHQgPSBmZGNfcmVhZChyZXNfZGF0YSk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlUUkFDRShmdF90X2ZkY19kbWEsCisJCQkgICAgICAiZmRjX21vZGUgPSAlMDJ4LCBzdGF0dXMgPSAlMDJ4IGF0IGluZGV4ICVkIiwKKwkJCSAgICAgIChpbnQpIGZkY19tb2RlLAorCQkJICAgICAgKGludCkgZmRjX3N0YXR1cywKKwkJCSAgICAgIHJlc19sZW4gLSBjb3VudCk7CisJCQlpZiAoKytyZXRyeSA8PSAzKSB7CisJCQkJVFJBQ0UoZnRfdF93YXJuLCAiZmRjX3JlYWQgdGltZW91dCwgcmV0cnkiKTsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJmZGNfcmVhZCB0aW1lb3V0LCBmYXRhbCIpOworCQkJCS8qIHJlY292ZXIgPz8/ICovCisJCQkJYnJlYWs7CisJCQkJKytyZXRyeTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS0tY291bnQ7CisJCQkrK3Jlc19kYXRhOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZkY19pb19sb2NrLCBmbGFncyk7CisJZmRjX3VzZWNfd2FpdChGVF9SUU1fREVMQVkpOwkvKiBhbGxvdyBGREMgdG8gbmVnYXRlIEJTWSAqLworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKiAgICAgIEhhbmRsZSBjb21tYW5kIGFuZCByZXN1bHQgcGhhc2VzIGZvcgorICogICAgICBjb21tYW5kcyB3aXRob3V0IGRhdGEgcGhhc2UuCisgKi8KK3N0YXRpYyBpbnQgZmRjX2lzc3VlX2NvbW1hbmQoY29uc3QgX191OCAqIG91dF9kYXRhLCBpbnQgb3V0X2NvdW50LAorCQkgICAgICBfX3U4ICogaW5fZGF0YSwgaW50IGluX2NvdW50KQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlpZiAob3V0X2NvdW50ID4gMCkgeworCQlUUkFDRV9DQVRDSChmZGNfY29tbWFuZChvdXRfZGF0YSwgb3V0X2NvdW50KSwpOworCX0KKwkvKiB3aWxsIHRha2UgMjQgLSAzMCB1c2VjIGZvciBmZGNfc2Vuc2VfZHJpdmVfc3RhdHVzIGFuZAorCSAqIGZkY19zZW5zZV9pbnRlcnJ1cHRfc3RhdHVzIGNvbW1hbmRzLgorCSAqICAgIDM1IGZhaWxzIHNvbWV0aW1lcyAoNS85LzkzIFNKTCkKKwkgKiBPbiBhIGxvYWRlZCBzeXN0ZW0gaXQgaW5jaWRlbnRhbGx5IHRha2VzIGxvbmdlciB0aGFuCisJICogdGhpcyBmb3IgdGhlIGZkYyB0byBnZXQgcmVhZHkgISA/Pz8/Pz8gV0hZID8/Pz8/PworCSAqIFNvIHVudGlsIHdlIGtub3cgd2hhdCdzIGdvaW5nIG9uIHVzZSBhIHZlcnkgbG9uZyB0aW1lb3V0LgorCSAqLworCVRSQUNFX0NBVENIKGZkY19yZWFkeV9vdXRfd2FpdCg1MDAgLyogdXNlYyAqLyksKTsKKwlpZiAoaW5fY291bnQgPiAwKSB7CisJCVRSQUNFX0NBVENIKGZkY19yZXN1bHQoaW5fZGF0YSwgaW5fY291bnQpLAorCQkJICAgIFRSQUNFKGZ0X3RfZXJyLCAicmVzdWx0IHBoYXNlIGFib3J0ZWQiKSk7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworLyogICAgICBXYWl0IGZvciBGREMgaW50ZXJydXB0IHdpdGggdGltZW91dCAoaW4gbWlsbGlzZWNvbmRzKS4KKyAqICAgICAgU2lnbmFscyBhcmUgYmxvY2tlZCBzbyB0aGUgd2FpdCB3aWxsIG5vdCBiZSBhYm9ydGVkLgorICogICAgICBOb3RlOiBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCAhICgyMy8wNS85MyBTSkwpCisgKi8KK2ludCBmZGNfaW50ZXJydXB0X3dhaXQodW5zaWduZWQgaW50IHRpbWUpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCxjdXJyZW50KTsKKwlzaWdzZXRfdCBvbGRfc2lnbWFzazsJCisJc3RhdGljIGludCByZXNldHRpbmc7CisJbG9uZyB0aW1lb3V0OworCisJVFJBQ0VfRlVOKGZ0X3RfZmRjX2RtYSk7CisKKyAJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmZ0YXBlX3dhaXRfaW50cikpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJlcnJvcjogbmVzdGVkIGNhbGwiKTsKKwl9CisJLyogdGltZW91dCB0aW1lIHdpbGwgYmUgdXAgdG8gVVNQVCBtaWNyb3NlY29uZHMgdG9vIGxvbmcgISAqLworCXRpbWVvdXQgPSAoMTAwMCAqIHRpbWUgKyBGVF9VU1BUIC0gMSkgLyBGVF9VU1BUOworCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJb2xkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOworCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJYWRkX3dhaXRfcXVldWUoJmZ0YXBlX3dhaXRfaW50ciwgJndhaXQpOworCXdoaWxlICghZnRfaW50ZXJydXB0X3NlZW4gJiYgdGltZW91dCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKyAgICAgICAgfQorCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+YmxvY2tlZCA9IG9sZF9zaWdtYXNrOworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZnRhcGVfd2FpdF9pbnRyLCAmd2FpdCk7CisJLyogIHRoZSBmb2xsb3dpbmcgSVMgbmVjZXNzYXJ5LiBUcnVlOiBhcyB3ZWxsCisJICogIHdha2VfdXBfaW50ZXJydXB0aWJsZSgpIGFzIHRoZSBzY2hlZHVsZSgpIHNldCBUQVNLX1JVTk5JTkcKKwkgKiAgd2hlbiB0aGV5IHdha2V1cCBhIHRhc2ssIEJVVDogaXQgbWF5IHZlcnkgd2VsbCBiZSB0aGF0CisJICogIGZ0X2ludGVycnVwdF9zZWVuIGlzIGFscmVhZHkgc2V0IHRvIDEgd2hlbiB3ZSBlbnRlciBoZXJlCisJICogIGluIHdoaWNoIGNhc2Ugc2NoZWR1bGUoKSBnZXRzIG5ldmVyIGNhbGxlZCwgYW5kCisJICogIFRBU0tfUlVOTklORyBuZXZlciBzZXQuIFRoaXMgaGFzIHRoZSBmdW5ueSBlZmZlY3QgdGhhdCB3ZQorCSAqICBleGVjdXRlIGFsbCB0aGUgY29kZSB1bnRpbCB3ZSBsZWF2ZSBrZXJuZWwgc3BhY2UsIGJ1dCB0aGVuCisJICogIHRoZSB0YXNrIGlzIHN0b3BwZWQgKGEgdGFzayBDQU5OT1QgYmUgcHJlZW1wdGVkIHdoaWxlIGluCisJICogIGtlcm5lbCBtb2RlLiBTZW5kaW5nIGEgcGFpciBvZiBTSUdTVE9QL1NJR0NPTlQgdG8gdGhlCisJICogIHRhc2tzIHdha2VzIGl0IHVwIGFnYWluLiBGdW5ueSEgOi0pCisJICovCisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7IAorCWlmIChmdF9pbnRlcnJ1cHRfc2VlbikgeyAvKiB3b2tlbiB1cCBieSBpbnRlcnJ1cHQgKi8KKwkJZnRfaW50ZXJydXB0X3NlZW4gPSAwOworCQlUUkFDRV9FWElUIDA7CisJfQorCS8qICBPcmlnaW5hbCBjb21tZW50OgorCSAqICBJbiBmaXJzdCBpbnN0YW5jZSwgbmV4dCBzdGF0ZW1lbnQgc2VlbXMgdW5uZWNlc3Nhcnkgc2luY2UKKwkgKiAgaXQgd2lsbCBiZSBjbGVhcmVkIGluIGZkY19jb21tYW5kLiBIb3dldmVyLCBhIHNtYWxsIHBhcnQgb2YKKwkgKiAgdGhlIHNvZnR3YXJlIHNlZW1zIHRvIHJlbHkgb24gdGhpcyBiZWluZyBjbGVhcmVkIGhlcmUKKwkgKiAgKGZ0YXBlX2Nsb3NlIG1pZ2h0IGZhaWwpIHNvIHN0aWNrIHRvIGl0IHVudGlsIHRoaW5ncyBnZXQgZml4ZWQgIQorCSAqLworCS8qICBNeSBkZWVwbHkgc291Z2h0IG9mIGtub3dsZWRnZToKKwkgKiAgQmVob2xkIE5PISBJdCBpcyBvYnZpb3VzLiBmZGNfcmVzZXQoKSBkb2Vzbid0IGNhbGwgZmRjX2NvbW1hbmQoKQorCSAqICBidXQgbmV2ZXJ0aGVsZXNzIHVzZXMgZmRjX2ludGVycnVwdF93YWl0KCkuIE9GIENPVVJTRSB0aGlzIG5lZWRzIHRvCisJICogIGJlIHJlc2V0IGhlcmUuCisJICovCisJZnRfaW50ZXJydXB0X3NlZW4gPSAwOwkvKiBjbGVhciBmb3IgbmV4dCBjYWxsICovCisJaWYgKCFyZXNldHRpbmcpIHsKKwkJcmVzZXR0aW5nID0gMTsJLyogYnJlYWsgaW5maW5pdGUgcmVjdXJzaW9uIGlmIHJlc2V0IGZhaWxzICovCisJCVRSQUNFKGZ0X3RfYW55LCAiY2xlYW51cCByZXNldCIpOworCQlmZGNfcmVzZXQoKTsKKwkJcmVzZXR0aW5nID0gMDsKKwl9CisJVFJBQ0VfRVhJVCAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpID8gLUVJTlRSIDogLUVUSU1FOworfQorCisvKiAgICAgIFN0YXJ0L3N0b3AgZHJpdmUgbW90b3IuIEVuYWJsZSBETUEgbW9kZS4KKyAqLwordm9pZCBmZGNfbW90b3IoaW50IG1vdG9yKQoreworCWludCB1bml0ID0gZnRfZHJpdmVfc2VsOworCWludCBkYXRhID0gdW5pdCB8IEZEQ19SRVNFVF9OT1QgfCBGRENfRE1BX01PREU7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWZ0YXBlX21vdG9yID0gbW90b3I7CisJaWYgKGZ0YXBlX21vdG9yKSB7CisJCWRhdGEgfD0gRkRDX01PVE9SXzAgPDwgdW5pdDsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInR1cm5pbmcgbW90b3IgJWQgb24iLCB1bml0KTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X25vaXNlLCAidHVybmluZyBtb3RvciAlZCBvZmYiLCB1bml0KTsKKwl9CisJaWYgKGZ0X21hY2gyKSB7CisJCW91dGJfcChkYXRhLCBmZGMuZG9yMik7CisJfSBlbHNlIHsKKwkJb3V0Yl9wKGRhdGEsIGZkYy5kb3IpOworCX0KKwlmdGFwZV9zbGVlcCgxMCAqIEZUX01JTExJU0VDT05EKTsKKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgdm9pZCBmZGNfdXBkYXRlX2Rzcih2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRShmdF90X2Zsb3csICJyYXRlID0gJWQgS2JwcywgcHJlY29tcCA9ICVkIG5zIiwKKwkgICAgICBmZGNfZGF0YV9yYXRlLCBmZGNfcHJlY29tcCk7CisJaWYgKGZkYy50eXBlID49IGk4MjA3NykgeworCQlvdXRiX3AoKGZkY19yYXRlX2NvZGUgJiAweDAzKSB8IGZkY19wcmVjX2NvZGUsIGZkYy5kc3IpOworCX0gZWxzZSB7CisJCW91dGJfcChmZGNfcmF0ZV9jb2RlICYgMHgwMywgZmRjLmNjcik7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3ZvaWQgZmRjX3NldF93cml0ZV9wcmVjb21wKGludCBwcmVjb21wKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRShmdF90X25vaXNlLCAiTmV3IHByZWNvbXA6ICVkIG5zZWMiLCBwcmVjb21wKTsKKwlmZGNfcHJlY29tcCA9IHByZWNvbXA7CisJLyogIHdyaXRlIHByZWNvbXBlbnNhdGlvbiBjYW4gYmUgc2V0IGluIG11bHRpcGxlcyBvZiA0MS42NyBuc2VjLgorCSAqICByb3VuZCB0aGUgcGFyYW1ldGVyIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIGFuZCBjb252ZXJ0IGl0CisJICogIGludG8gYSBmZGMgc2V0dGluZy4gTm90ZSB0aGF0IDAgbWVhbnMgZGVmYXVsdCB0byB0aGUgZmRjLAorCSAqICA3IGlzIHVzZWQgaW5zdGVhZCBvZiB0aGF0LgorCSAqLworCWZkY19wcmVjX2NvZGUgPSAoKGZkY19wcmVjb21wICsgMjEpIC8gNDIpIDw8IDI7CisJaWYgKGZkY19wcmVjX2NvZGUgPT0gMCB8fCBmZGNfcHJlY19jb2RlID4gKDYgPDwgMikpIHsKKwkJZmRjX3ByZWNfY29kZSA9IDcgPDwgMjsKKwl9CisJZmRjX3VwZGF0ZV9kc3IoKTsKKwlUUkFDRV9FWElUOworfQorCisvKiAgUmVwcm9ncmFtIHRoZSA4MjA3OCByZWdpc3RlcnMgdG8gdXNlIERhdGEgUmF0ZSBUYWJsZSAxIG9uIGFsbCBkcml2ZXMuCisgKi8KK3N0YXRpYyB2b2lkIGZkY19zZXRfZHJpdmVfc3BlY3Modm9pZCkKK3sKKwlfX3U4IGNtZFtdID0geyBGRENfRFJJVkVfU1BFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMH07CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJVFJBQ0UoZnRfdF9mbG93LCAiU2V0dGluZyBvZiBkcml2ZSBzcGVjcyBjYWxsZWQiKTsKKwlpZiAoZmRjLnR5cGUgPj0gaTgyMDc4XzEpIHsKKwkJY21kWzFdID0gKDAgPDwgNSkgfCAoMiA8PCAyKTsKKwkJY21kWzJdID0gKDEgPDwgNSkgfCAoMiA8PCAyKTsKKwkJY21kWzNdID0gKDIgPDwgNSkgfCAoMiA8PCAyKTsKKwkJY21kWzRdID0gKDMgPDwgNSkgfCAoMiA8PCAyKTsKKwkJcmVzdWx0ID0gZmRjX2NvbW1hbmQoY21kLCBOUl9JVEVNUyhjbWQpKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiU2V0dGluZyBvZiBkcml2ZSBzcGVjcyBmYWlsZWQiKTsKKwkJfQorCX0KKwlUUkFDRV9FWElUOworfQorCisvKiBTZWxlY3QgY2xvY2sgZm9yIGZkYywgbXVzdCBjb3JyZXNwb25kIHdpdGggdGFwZSBkcml2ZSBzZXR0aW5nICEKKyAqIFRoaXMgYWxzbyBpbmZsdWVuY2VzIHRoZSBmZGMgdGltaW5nIHNvIHdlIG11c3QgYWRqdXN0IHNvbWUgdmFsdWVzLgorICovCitpbnQgZmRjX3NldF9kYXRhX3JhdGUoaW50IHJhdGUpCit7CisJaW50IGJhZF9yYXRlID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogU2VsZWN0IGNsb2NrIGZvciBmZGMsIG11c3QgY29ycmVzcG9uZCB3aXRoIHRhcGUgZHJpdmUgc2V0dGluZyAhCisJICogVGhpcyBhbHNvIGluZmx1ZW5jZXMgdGhlIGZkYyB0aW1pbmcgc28gd2UgbXVzdCBhZGp1c3Qgc29tZSB2YWx1ZXMuCisJICovCisJVFJBQ0UoZnRfdF9mZGNfZG1hLCAibmV3IHJhdGUgPSAlZCIsIHJhdGUpOworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgMjUwOgorCQlmZGNfcmF0ZV9jb2RlID0gZmRjX2RhdGFfcmF0ZV8yNTA7CisJCWJyZWFrOworCWNhc2UgNTAwOgorCQlmZGNfcmF0ZV9jb2RlID0gZmRjX2RhdGFfcmF0ZV81MDA7CisJCWJyZWFrOworCWNhc2UgMTAwMDoKKwkJaWYgKGZkYy50eXBlIDwgaTgyMDc3KSB7CisJCQliYWRfcmF0ZSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCWZkY19yYXRlX2NvZGUgPSBmZGNfZGF0YV9yYXRlXzEwMDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyMDAwOgorCQlpZiAoZmRjLnR5cGUgPCBpODIwNzhfMSkgeworCQkJYmFkX3JhdGUgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQlmZGNfcmF0ZV9jb2RlID0gZmRjX2RhdGFfcmF0ZV8yMDAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJhZF9yYXRlID0gMTsKKyAgICAgICAgfQorCWlmIChiYWRfcmF0ZSkgeworCQlUUkFDRV9BQk9SVCgtRUlPLAorCQkJICAgIGZ0X3RfZmRjX2RtYSwgIiVkIGlzIG5vdCBhIHZhbGlkIGRhdGEgcmF0ZSIsIHJhdGUpOworCX0KKwlmZGNfZGF0YV9yYXRlID0gcmF0ZTsKKwlmZGNfdXBkYXRlX2RzcigpOworCWZkY19zZXRfc2Vla19yYXRlKGZkY19zZWVrX3JhdGUpOyAgLyogY2xvY2sgY2hhbmdlZCEgKi8KKwlmdGFwZV91ZGVsYXkoMTAwMCk7CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAga2VlcCB0aGUgdW5pdCBzZWxlY3QgaWYga2VlcF9zZWxlY3QgaXMgIT0gMCwKKyAqLworc3RhdGljIHZvaWQgZmRjX2Rvcl9yZXNldChpbnQga2VlcF9zZWxlY3QpCit7CisJX191OCBmZGNfY3RsID0gZnRfZHJpdmVfc2VsOworCisJaWYgKGtlZXBfc2VsZWN0ICE9IDApIHsKKwkJZmRjX2N0bCB8PSBGRENfRE1BX01PREU7CisJCWlmIChmdGFwZV9tb3RvcikgeworCQkJZmRjX2N0bCB8PSBGRENfTU9UT1JfMCA8PCBmdF9kcml2ZV9zZWw7CisJCX0KKwl9CisJZnRhcGVfdWRlbGF5KDEwKTsgLyogPz8/IGJ1dCBzZWVtcyB0byBiZSBuZWNlc3NhcnkgKi8KKwlpZiAoZnRfbWFjaDIpIHsKKwkJb3V0Yl9wKGZkY19jdGwgJiAweDBmLCBmZGMuZG9yKTsKKwkJb3V0Yl9wKGZkY19jdGwsIGZkYy5kb3IyKTsKKwl9IGVsc2UgeworCQlvdXRiX3AoZmRjX2N0bCwgZmRjLmRvcik7CisJfQorCWZkY191c2VjX3dhaXQoMTApOyAvKiBkZWxheSA+PSAxNCBmZGMgY2xvY2tzICovCisJaWYgKGtlZXBfc2VsZWN0ID09IDApIHsKKwkJZmRjX2N0bCA9IDA7CisJfQorCWZkY19jdGwgfD0gRkRDX1JFU0VUX05PVDsKKwlpZiAoZnRfbWFjaDIpIHsKKwkJb3V0Yl9wKGZkY19jdGwgJiAweDBmLCBmZGMuZG9yKTsKKwkJb3V0Yl9wKGZkY19jdGwsIGZkYy5kb3IyKTsKKwl9IGVsc2UgeworCQlvdXRiX3AoZmRjX2N0bCwgZmRjLmRvcik7CisJfQorfQorCisvKiAgICAgIFJlc2V0IHRoZSBmbG9wcHkgZGlzayBjb250cm9sbGVyLiBMZWF2ZSB0aGUgZnRhcGVfdW5pdCBzZWxlY3RlZC4KKyAqLwordm9pZCBmZGNfcmVzZXQodm9pZCkKK3sKKwlpbnQgc3QwOworCWludCBpOworCWludCBkdW1teTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKKworCWZkY19kb3JfcmVzZXQoMSk7IC8qIGtlZXAgdW5pdCBzZWxlY3RlZCAqLworCisJZmRjX21vZGUgPSBmZGNfaWRsZTsKKworCS8qICBtYXliZSB0aGUgY2xpKCkvc3RpKCkgcGFpciBpcyBub3QgbmVjZXNzYXJ5LCBCVVQ6CisJICogIHRoZSBmb2xsb3dpbmcgbGluZSBNVVNUIGJlIGhlcmUuIE90aGVyd2lzZSBmZGNfaW50ZXJydXB0X3dhaXQoKQorCSAqICB3b24ndCB3YWl0LiBOb3RlIHRoYXQgZmRjX3Jlc2V0KCkgaXMgY2FsbGVkIGZyb20gCisJICogIGZ0YXBlX2R1bWJfc3RvcCgpIHdoZW4gdGhlIGZkYyBpcyBidXN5IHRyYW5zZmVycmluZyBkYXRhLiBJbiB0aGlzCisJICogIGNhc2UgZmRjX2lzcigpIE1PU1QgUFJPQkFCTFkgc2V0cyBmdF9pbnRlcnJ1cHRfc2VlbiwgYW5kIHRyaWVzCisJICogIHRvIGdldCB0aGUgcmVzdWx0IGJ5dGVzIGZyb20gdGhlIGZkYyBldGMuIENMQVNILgorCSAqLworCWZ0X2ludGVycnVwdF9zZWVuID0gMDsKKwkKKwkvKiAgUHJvZ3JhbSBkYXRhIHJhdGUKKwkgKi8KKwlmZGNfdXBkYXRlX2RzcigpOyAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgZGF0YSByYXRlIGFuZCBwcmVjb21wICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCisgICAgICAgIC8qCisgICAgICAgICAqCVdhaXQgZm9yIGZpcnN0IHBvbGxpbmcgY3ljbGUgdG8gY29tcGxldGUKKwkgKi8KKwlpZiAoZmRjX2ludGVycnVwdF93YWl0KDEgKiBGVF9TRUNPTkQpIDwgMCkgeworCQlUUkFDRShmdF90X2VyciwgIm5vIGRyaXZlIHBvbGxpbmcgaW50ZXJydXB0ISIpOworCX0gZWxzZSB7CS8qIGNsZWFyIGFsbCBkaXNrLWNoYW5nZWQgc3RhdHVzZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQkJaWYoZmRjX3NlbnNlX2ludGVycnVwdF9zdGF0dXMoJnN0MCwgJmR1bW15KSAhPSAwKSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJzZW5zZSBmYWlsZWQgZm9yICVkIiwgaSk7CisJCQl9CisJCQlpZiAoaSA9PSBmdF9kcml2ZV9zZWwpIHsKKwkJCQlmdGFwZV9jdXJyZW50X2N5bGluZGVyID0gZHVtbXk7CisJCQl9CisJCX0KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImRyaXZlIHBvbGxpbmcgY29tcGxldGVkIik7CisJfQorCS8qCisgICAgICAgICAqCVNQRUNJRlkgQ09NTUFORAorCSAqLworCWZkY19zZXRfc2Vla19yYXRlKGZkY19zZWVrX3JhdGUpOworCS8qCisJICoJRFJJVkUgU1BFQ0lGSUNBVElPTiBDT01NQU5EIChpZiBmZGMgdHlwZSBrbm93bikKKwkgKi8KKwlpZiAoZmRjLnR5cGUgPj0gaTgyMDc4XzEpIHsKKwkJZmRjX3NldF9kcml2ZV9zcGVjcygpOworCX0KKwlUUkFDRV9FWElUOworfQorCisjaWYgIWRlZmluZWQoQ0xLXzQ4TUhaKQorIyBkZWZpbmUgQ0xLXzQ4TUhaIDEKKyNlbmRpZgorCisvKiAgV2hlbiB3ZSdyZSBkb25lLCBwdXQgdGhlIGZkYyBpbnRvIHJlc2V0IG1vZGUgc28gdGhhdCB0aGUgcmVndWxhcgorICogIGZsb3BweSBkaXNrIGRyaXZlciB3aWxsIGZpZ3VyZSBvdXQgdGhhdCBzb21ldGhpbmcgaXMgd3JvbmcgYW5kCisgKiAgaW5pdGlhbGl6ZSB0aGUgY29udHJvbGxlciB0aGUgd2F5IGl0IHdhbnRzLgorICovCit2b2lkIGZkY19kaXNhYmxlKHZvaWQpCit7CisJX191OCBjbWQxW10gPSB7RkRDX0NPTkZJR1VSRSwgMHgwMCwgMHgwMCwgMHgwMH07CisJX191OCBjbWQyW10gPSB7RkRDX0xPQ0t9OworCV9fdTggY21kM1tdID0ge0ZEQ19VTkxPQ0t9OworCV9fdTggc3RhdFsxXTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICghZmRjX2ZpZm9fbG9ja2VkKSB7CisJCWZkY19yZXNldCgpOworCQlUUkFDRV9FWElUOworCX0KKwlpZiAoZmRjX2lzc3VlX2NvbW1hbmQoY21kMywgMSwgc3RhdCwgMSkgPCAwIHx8IHN0YXRbMF0gIT0gMHgwMCkgeworCQlmZGNfZG9yX3Jlc2V0KDApOworCQlUUkFDRV9BQk9SVCgvKiovLCBmdF90X2J1ZywgCisJCSJjb3VsZG4ndCB1bmxvY2sgZmlmbywgY29uZmlndXJhdGlvbiByZW1haW5zIGNoYW5nZWQiKTsKKwl9CisJZmRjX2ZpZm9fbG9ja2VkID0gMDsKKwlpZiAoQ0xLXzQ4TUhaICYmIGZkYy50eXBlID49IGk4MjA3OCkgeworCQljbWQxWzBdIHw9IEZEQ19DTEs0OF9CSVQ7CisJfQorCWNtZDFbMl0gPSAoKGZkY19maWZvX3N0YXRlKSA/IDAgOiAweDIwKSArIChmZGNfZmlmb190aHIgLSAxKTsKKwlpZiAoZmRjX2NvbW1hbmQoY21kMSwgTlJfSVRFTVMoY21kMSkpIDwgMCkgeworCQlmZGNfZG9yX3Jlc2V0KDApOworCQlUUkFDRV9BQk9SVCgvKiovLCBmdF90X2J1ZywKKwkJImNvdWxkbid0IHJlY29uZmlndXJlIGZpZm8gdG8gb2xkIHN0YXRlIik7CisJfQorCWlmIChmZGNfbG9ja19zdGF0ZSAmJgorCSAgICBmZGNfaXNzdWVfY29tbWFuZChjbWQyLCAxLCBzdGF0LCAxKSA8IDApIHsKKwkJZmRjX2Rvcl9yZXNldCgwKTsKKwkJVFJBQ0VfQUJPUlQoLyoqLywgZnRfdF9idWcsICJjb3VsZG4ndCBsb2NrIG9sZCBzdGF0ZSBhZ2FpbiIpOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAiZmlmbyByZXN0b3JlZDogJXNhYmxlZCwgdGhyLiAlZCwgJXNsb2NrZWQiLAorCSAgICAgIGZkY19maWZvX3N0YXRlID8gImVuIiA6ICJkaXMiLAorCSAgICAgIGZkY19maWZvX3RociwgKGZkY19sb2NrX3N0YXRlKSA/ICIiIDogIm5vdCAiKTsKKwlmZGNfZG9yX3Jlc2V0KDApOworCVRSQUNFX0VYSVQ7Cit9CisKKy8qICAgICAgU3BlY2lmeSBGREMgc2Vlay1yYXRlIChtaWxsaXNlY29uZHMpCisgKi8KK3N0YXRpYyBpbnQgZmRjX3NldF9zZWVrX3JhdGUoaW50IHNlZWtfcmF0ZSkKK3sKKwkvKiBzZXQgc3RlcCByYXRlLCBkbWEgbW9kZSwgYW5kIG1pbmltYWwgaGVhZCBsb2FkIGFuZCB1bmxvYWQgdGltZXMKKwkgKi8KKwlfX3U4IGluWzNdID0geyBGRENfU1BFQ0lGWSwgMSwgKDEgPDwgMSl9OworIAorCWZkY19zZWVrX3JhdGUgPSBzZWVrX3JhdGU7CisJaW5bMV0gfD0gKDE2IC0gKGZkY19kYXRhX3JhdGUgKiBmZGNfc2Vla19yYXRlKSAvIDUwMCkgPDwgNDsKKworCXJldHVybiBmZGNfY29tbWFuZChpbiwgMyk7Cit9CisKKy8qICAgICAgU2Vuc2UgZHJpdmUgc3RhdHVzOiBnZXQgdW5pdCdzIGRyaXZlIHN0YXR1cyAoU1QzKQorICovCitpbnQgZmRjX3NlbnNlX2RyaXZlX3N0YXR1cyhpbnQgKnN0MykKK3sKKwlfX3U4IG91dFsyXTsKKwlfX3U4IGluWzFdOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlvdXRbMF0gPSBGRENfU0VOU0VEOworCW91dFsxXSA9IGZ0X2RyaXZlX3NlbDsKKwlUUkFDRV9DQVRDSChmZGNfaXNzdWVfY29tbWFuZChvdXQsIDIsIGluLCAxKSwpOworCSpzdDMgPSBpblswXTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICAgICAgU2Vuc2UgSW50ZXJydXB0IFN0YXR1cyBjb21tYW5kOgorICogICAgICBzaG91bGQgYmUgaXNzdWVkIGF0IHRoZSBlbmQgb2YgZWFjaCBzZWVrLgorICogICAgICBnZXQgU1QwIGFuZCBjdXJyZW50IGN5bGluZGVyLgorICovCitpbnQgZmRjX3NlbnNlX2ludGVycnVwdF9zdGF0dXMoaW50ICpzdDAsIGludCAqY3VycmVudF9jeWxpbmRlcikKK3sKKwlfX3U4IG91dFsxXTsKKwlfX3U4IGluWzJdOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlvdXRbMF0gPSBGRENfU0VOU0VJOworCVRSQUNFX0NBVENIKGZkY19pc3N1ZV9jb21tYW5kKG91dCwgMSwgaW4sIDIpLCk7CisJKnN0MCA9IGluWzBdOworCSpjdXJyZW50X2N5bGluZGVyID0gaW5bMV07CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgICAgIHN0ZXAgdG8gdHJhY2sKKyAqLworaW50IGZkY19zZWVrKGludCB0cmFjaykKK3sKKwlfX3U4IG91dFszXTsKKwlpbnQgc3QwLCBwY247CisjaWZkZWYgVEVTVElORworCXVuc2lnbmVkIGludCB0aW1lOworI2VuZGlmCisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCW91dFswXSA9IEZEQ19TRUVLOworCW91dFsxXSA9IGZ0X2RyaXZlX3NlbDsKKwlvdXRbMl0gPSB0cmFjazsKKyNpZmRlZiBURVNUSU5HCisJdGltZSA9IGZ0YXBlX3RpbWVzdGFtcCgpOworI2VuZGlmCisJLyogIFdlIHJlYWxseSBuZWVkIHRoaXMgY29tbWFuZCB0byB3b3JrICEKKwkgKi8KKwlmdF9zZWVrX2NvbXBsZXRlZCA9IDA7CisJVFJBQ0VfQ0FUQ0goZmRjX2NvbW1hbmQob3V0LCAzKSwKKwkJICAgIGZkY19yZXNldCgpOworCQkgICAgVFJBQ0UoZnRfdF9ub2lzZSwgImRlc3RpbmF0aW9uIHdhczogJWQsIHJlc2V0dGluZyBGREMuLi4iLAorCQkJICB0cmFjaykpOworCS8qICAgIEhhbmRsZSBpbnRlcnJ1cHRzIHVudGlsIGZ0X3NlZWtfY29tcGxldGVkIG9yIHRpbWVvdXQuCisJICovCisJZm9yICg7OykgeworCQlUUkFDRV9DQVRDSChmZGNfaW50ZXJydXB0X3dhaXQoMiAqIEZUX1NFQ09ORCksKTsKKwkJaWYgKGZ0X3NlZWtfY29tcGxldGVkKSB7CisJCQlUUkFDRV9DQVRDSChmZGNfc2Vuc2VfaW50ZXJydXB0X3N0YXR1cygmc3QwLCAmcGNuKSwpOworCQkJaWYgKChzdDAgJiBTVDBfU0VFS19FTkQpID09IDApIHsKKwkJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKKwkJCQkgICAgICAibm8gc2Vlay1lbmQgYWZ0ZXIgc2VlayBjb21wbGV0aW9uICE/PyIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisjaWZkZWYgVEVTVElORworCXRpbWUgPSBmdGFwZV90aW1lZGlmZih0aW1lLCBmdGFwZV90aW1lc3RhbXAoKSkgLyBhYnModHJhY2sgLSBmdGFwZV9jdXJyZW50X2N5bGluZGVyKTsKKwlpZiAoKHRpbWUgPCA5MDAgfHwgdGltZSA+IDMxMDApICYmIGFicyh0cmFjayAtIGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIpID4gNSkgeworCQlUUkFDRShmdF90X3dhcm4sICJXcm9uZyBGREMgU1RFUCBpbnRlcnZhbDogJWQgdXNlY3MgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwgdHJhY2sgLSBmdGFwZV9jdXJyZW50X2N5bGluZGVyKTsKKwl9CisjZW5kaWYKKwkvKiAgICBWZXJpZnkgd2hldGhlciB3ZSBpc3N1ZWQgdGhlIHJpZ2h0IHRhcGUgY29tbWFuZC4KKwkgKi8KKwkvKiBWZXJpZnkgdGhhdCB3ZSBzZWVrIHRvIHRoZSBwcm9wZXIgdHJhY2suICovCisJaWYgKHBjbiAhPSB0cmFjaykgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgImJhZCBzZWVrLi4iKTsKKwl9CisJZnRhcGVfY3VycmVudF9jeWxpbmRlciA9IHRyYWNrOworCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGludCBwZXJwZW5kX21vZGU7IC8qIHNldCBpZiBmZGMgaXMgaW4gcGVycGVuZGljdWxhciBtb2RlICovCisKK3N0YXRpYyBpbnQgcGVycGVuZF9vZmYodm9pZCkKK3sKKyAJX191OCBwZXJwZW5kW10gPSB7RkRDX1BFUlBFTkQsIDB4MDB9OworCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCisJaWYgKHBlcnBlbmRfbW9kZSkgeworCQkvKiBUdXJuIG9mZiBwZXJwZW5kaWN1bGFyIG1vZGUgKi8KKwkJcGVycGVuZFsxXSA9IDB4ODA7CisJCVRSQUNFX0NBVENIKGZkY19jb21tYW5kKHBlcnBlbmQsIDIpLAorCQkJICAgIFRSQUNFKGZ0X3RfZXJyLCJQZXJwZW5kaWN1bGFyIG1vZGUgZXhpdCBmYWlsZWQhIikpOworCQlwZXJwZW5kX21vZGUgPSAwOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3BlcnBlbmQoaW50IHNlZ21lbnRfaWQpCit7CisgCV9fdTggcGVycGVuZFtdID0ge0ZEQ19QRVJQRU5ELCAweDAwfTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogV2hlbiB3cml0aW5nIFFJQy0zMDIwIHRhcGVzLCB0dXJuIG9uIHBlcnBlbmRpY3VsYXIgbW9kZQorCSAqIGlmIHRhcGUgaXMgbW92aW5nIGluIGZvcndhcmQgZGlyZWN0aW9uIChldmVuIHRyYWNrcykuCisJICovCisJaWYgKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDMzAyMCAmJgorCSAgICAoKHNlZ21lbnRfaWQgLyBmdF9zZWdtZW50c19wZXJfdHJhY2spICYgMSkgPT0gMCkgeworLyogIEZJWE1FOiBzb21lIGk4MjA3NyBzZWVtIHRvIHN1cHBvcnQgcGVycGVuZGljdWxhciBtb2RlIGFzCisgKiAgd2VsbC4gCisgKi8KKyNpZiAwCisJCWlmIChmZGMudHlwZSA8IGk4MjA3N0FBKSB7fQorI2Vsc2UKKwkJaWYgKGZkYy50eXBlIDwgaTgyMDc3ICYmIGZ0X2RhdGFfcmF0ZSA8IDEwMDApIHsKKyNlbmRpZgorCQkJLyogIGZkYyBkb2VzIG5vdCBzdXBwb3J0IHBlcnBlbmRpY3VsYXIgbW9kZTogY29tcGxhaW4gCisJCQkgKi8KKwkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJCSAgICAiWW91ciBGREMgZG9lcyBub3Qgc3VwcG9ydCBRSUMtMzAyMC4iKTsKKwkJfQorCQlwZXJwZW5kWzFdID0gMHgwMyAvKiAweDgzICsgKDB4NCA8PCBmdF9kcml2ZV9zZWwpICovIDsKKwkJVFJBQ0VfQ0FUQ0goZmRjX2NvbW1hbmQocGVycGVuZCwgMiksCisJCQkgICBUUkFDRShmdF90X2VyciwiUGVycGVuZGljdWxhciBtb2RlIGVudHJ5IGZhaWxlZCEiKSk7CisJCVRSQUNFKGZ0X3RfZmxvdywgIlBlcnBlbmRpY3VsYXIgbW9kZSBzZXQiKTsKKwkJcGVycGVuZF9tb2RlID0gMTsKKwkJVFJBQ0VfRVhJVCAwOworCX0KKwlUUkFDRV9FWElUIHBlcnBlbmRfb2ZmKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZGNfc2V0dXBfZG1hKGNoYXIgbW9kZSwKKwkJCQkgdm9sYXRpbGUgdm9pZCAqYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQoreworCS8qIFByb2dyYW0gdGhlIERNQSBjb250cm9sbGVyLgorCSAqLworCWRpc2FibGVfZG1hKGZkYy5kbWEpOworCWNsZWFyX2RtYV9mZihmZGMuZG1hKTsKKwlzZXRfZG1hX21vZGUoZmRjLmRtYSwgbW9kZSk7CisJc2V0X2RtYV9hZGRyKGZkYy5kbWEsIHZpcnRfdG9fYnVzKCh2b2lkKilhZGRyKSk7CisJc2V0X2RtYV9jb3VudChmZGMuZG1hLCBjb3VudCk7CisJZW5hYmxlX2RtYShmZGMuZG1hKTsKK30KKworLyogIFNldHVwIGZkYyBhbmQgZG1hIGZvciBmb3JtYXR0aW5nIHRoZSBuZXh0IHNlZ21lbnQKKyAqLworaW50IGZkY19zZXR1cF9mb3JtYXR0aW5nKGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX191OCBvdXRbNl0gPSB7CisJCUZEQ19GT1JNQVQsIDB4MDAsIDMsIDQgKiBGVF9TRUNUT1JTX1BFUl9TRUdNRU5ULCAweDAwLCAweDZiCisJfTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCQorCVRSQUNFX0NBVENIKGhhbmRsZV9wZXJwZW5kKGJ1ZmYtPnNlZ21lbnRfaWQpLCk7CisJLyogUHJvZ3JhbSB0aGUgRE1BIGNvbnRyb2xsZXIuCisJICovCisgICAgICAgIFRSQUNFKGZ0X3RfZmRjX2RtYSwKKwkgICAgICAicGh5cy4gYWRkci4gPSAlbHgiLCB2aXJ0X3RvX2J1cygodm9pZCopIGJ1ZmYtPnB0cikpOworCXNwaW5fbG9ja19pcnFzYXZlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCWZkY19zZXR1cF9kbWEoRE1BX01PREVfV1JJVEUsIGJ1ZmYtPnB0ciwgRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAqIDQpOworCS8qIElzc3VlIEZEQyBjb21tYW5kIHRvIHN0YXJ0IHJlYWRpbmcvd3JpdGluZy4KKwkgKi8KKwlvdXRbMV0gPSBmdF9kcml2ZV9zZWw7CisJb3V0WzRdID0gYnVmZi0+Z2FwMzsKKwlUUkFDRV9DQVRDSChmZGNfc2V0dXBfZXJyb3IgPSBmZGNfY29tbWFuZChvdXQsIHNpemVvZihvdXQpKSwKKwkJICAgIHJlc3RvcmVfZmxhZ3MoZmxhZ3MpOyBmZGNfbW9kZSA9IGZkY19pZGxlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCVRSQUNFX0VYSVQgMDsKK30KKworCisvKiAgICAgIFNldHVwIEZsb3BweSBEaXNrIENvbnRyb2xsZXIgYW5kIERNQSB0byByZWFkIG9yIHdyaXRlIHRoZSBuZXh0IGNsdXN0ZXIKKyAqICAgICAgb2YgZ29vZCBzZWN0b3JzIGZyb20gb3IgdG8gdGhlIGN1cnJlbnQgc2VnbWVudC4KKyAqLworaW50IGZkY19zZXR1cF9yZWFkX3dyaXRlKGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmLCBfX3U4IG9wZXJhdGlvbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCV9fdTggb3V0WzldOworCWludCBkbWFfbW9kZTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJc3dpdGNoKG9wZXJhdGlvbikgeworCWNhc2UgRkRDX1ZFUklGWToKKwkJaWYgKGZkYy50eXBlIDwgaTgyMDc3KSB7CisJCQlvcGVyYXRpb24gPSBGRENfUkVBRDsKKwkJfQorCWNhc2UgRkRDX1JFQUQ6CisJY2FzZSBGRENfUkVBRF9ERUxFVEVEOgorCQlkbWFfbW9kZSA9IERNQV9NT0RFX1JFQUQ7CisJCVRSQUNFKGZ0X3RfZmRjX2RtYSwgInhmZXIgJWQgc2VjdG9ycyB0byAweCVwIiwKKwkJICAgICAgYnVmZi0+c2VjdG9yX2NvdW50LCBidWZmLT5wdHIpOworCQlUUkFDRV9DQVRDSChwZXJwZW5kX29mZigpLCk7CisJCWJyZWFrOworCWNhc2UgRkRDX1dSSVRFX0RFTEVURUQ6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJkZWxldGluZyBzZWdtZW50ICVkIiwgYnVmZi0+c2VnbWVudF9pZCk7CisJY2FzZSBGRENfV1JJVEU6CisJCWRtYV9tb2RlID0gRE1BX01PREVfV1JJVEU7CisJCS8qIFdoZW4gd3JpdGluZyBRSUMtMzAyMCB0YXBlcywgdHVybiBvbiBwZXJwZW5kaWN1bGFyIG1vZGUKKwkJICogaWYgdGFwZSBpcyBtb3ZpbmcgaW4gZm9yd2FyZCBkaXJlY3Rpb24gKGV2ZW4gdHJhY2tzKS4KKwkJICovCisJCVRSQUNFX0NBVENIKGhhbmRsZV9wZXJwZW5kKGJ1ZmYtPnNlZ21lbnRfaWQpLCk7CisJCVRSQUNFKGZ0X3RfZmRjX2RtYSwgInhmZXIgJWQgc2VjdG9ycyBmcm9tIDB4JXAiLAorCQkgICAgICBidWZmLT5zZWN0b3JfY291bnQsIGJ1ZmYtPnB0cik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFX0FCT1JUKC1FSU8sCisJCQkgICAgZnRfdF9idWcsICJidWc6IGludmFsaWQgb3BlcmF0aW9uIHBhcmFtZXRlciIpOworCX0KKwlUUkFDRShmdF90X2ZkY19kbWEsICJwaHlzLiBhZGRyLiA9ICVseCIsdmlydF90b19idXMoKHZvaWQqKWJ1ZmYtPnB0cikpOworCXNwaW5fbG9ja19pcnFzYXZlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCWlmIChvcGVyYXRpb24gIT0gRkRDX1ZFUklGWSkgeworCQlmZGNfc2V0dXBfZG1hKGRtYV9tb2RlLCBidWZmLT5wdHIsCisJCQkgICAgICBGVF9TRUNUT1JfU0laRSAqIGJ1ZmYtPnNlY3Rvcl9jb3VudCk7CisJfQorCS8qIElzc3VlIEZEQyBjb21tYW5kIHRvIHN0YXJ0IHJlYWRpbmcvd3JpdGluZy4KKwkgKi8KKwlvdXRbMF0gPSBvcGVyYXRpb247CisJb3V0WzFdID0gZnRfZHJpdmVfc2VsOworCW91dFsyXSA9IGJ1ZmYtPmN5bDsKKwlvdXRbM10gPSBidWZmLT5oZWFkOworCW91dFs0XSA9IGJ1ZmYtPnNlY3QgKyBidWZmLT5zZWN0b3Jfb2Zmc2V0OworCW91dFs1XSA9IDM7CQkvKiBTZWN0b3Igc2l6ZSBvZiAxSy4gKi8KKwlvdXRbNl0gPSBvdXRbNF0gKyBidWZmLT5zZWN0b3JfY291bnQgLSAxOwkvKiBsYXN0IHNlY3RvciAqLworCW91dFs3XSA9IDEwOTsJCS8qIEdhcCBsZW5ndGguICovCisJb3V0WzhdID0gMHhmZjsJCS8qIE5vIGxpbWl0IHRvIHRyYW5zZmVyIHNpemUuICovCisJVFJBQ0UoZnRfdF9mZGNfZG1hLCAiQzogMHglMDJ4LCBIOiAweCUwMngsIFI6IDB4JTAyeCwgY250OiAweCUwMngiLAorCQlvdXRbMl0sIG91dFszXSwgb3V0WzRdLCBvdXRbNl0gLSBvdXRbNF0gKyAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCVRSQUNFX0NBVENIKGZkY19zZXR1cF9lcnJvciA9IGZkY19jb21tYW5kKG91dCwgOSksZmRjX21vZGUgPSBmZGNfaWRsZSk7CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgZmRjX2ZpZm9fdGhyZXNob2xkKF9fdTggdGhyZXNob2xkLAorCQkgICAgICAgaW50ICpmaWZvX3N0YXRlLCBpbnQgKmxvY2tfc3RhdGUsIGludCAqZmlmb190aHIpCit7CisJY29uc3QgX191OCBjbWQwW10gPSB7RkRDX0RVTVBSRUdTfTsKKwlfX3U4IGNtZDFbXSA9IHtGRENfQ09ORklHVVJFLCAwLCAoMHgwZiAmICh0aHJlc2hvbGQgLSAxKSksIDB9OworCWNvbnN0IF9fdTggY21kMltdID0ge0ZEQ19MT0NLfTsKKwljb25zdCBfX3U4IGNtZDNbXSA9IHtGRENfVU5MT0NLfTsKKwlfX3U4IHJlZ1sxMF07CisJX191OCBzdGF0OworCWludCBpOworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmIChDTEtfNDhNSFogJiYgZmRjLnR5cGUgPj0gaTgyMDc4KSB7CisJCWNtZDFbMF0gfD0gRkRDX0NMSzQ4X0JJVDsKKwl9CisJLyogIER1bXAgZmRjIGludGVybmFsIHJlZ2lzdGVycyBmb3IgZXhhbWluYXRpb24KKwkgKi8KKwlUUkFDRV9DQVRDSChmZGNfY29tbWFuZChjbWQwLCBOUl9JVEVNUyhjbWQwKSksCisJCSAgICBUUkFDRShmdF90X3dhcm4sICJkdW1wcmVnIGNtZCBmYWlsZWQsIGZpZm8gdW5jaGFuZ2VkIikpOworCS8qICBOb3cgcmVhZCBmZGMgaW50ZXJuYWwgcmVnaXN0ZXJzIGZyb20gZmlmbworCSAqLworCWZvciAoaSA9IDA7IGkgPCAoaW50KU5SX0lURU1TKHJlZyk7ICsraSkgeworCQlmZGNfcmVhZCgmcmVnW2ldKTsKKwkJVFJBQ0UoZnRfdF9mZGNfZG1hLCAiUmVnaXN0ZXIgJWQgPSAweCUwMngiLCBpLCByZWdbaV0pOworCX0KKwlpZiAoZmlmb19zdGF0ZSAmJiBsb2NrX3N0YXRlICYmIGZpZm9fdGhyKSB7CisJCSpmaWZvX3N0YXRlID0gKHJlZ1s4XSAmIDB4MjApID09IDA7CisJCSpsb2NrX3N0YXRlID0gcmVnWzddICYgMHg4MDsKKwkJKmZpZm9fdGhyID0gMSArIChyZWdbOF0gJiAweDBmKTsKKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwKKwkgICAgICAib3JpZ2luYWwgZmlmbyBzdGF0ZTogJXNhYmxlZCwgdGhyZXNob2xkICVkLCAlc2xvY2tlZCIsCisJICAgICAgKChyZWdbOF0gJiAweDIwKSA9PSAwKSA/ICJlbiIgOiAiZGlzIiwKKwkgICAgICAxICsgKHJlZ1s4XSAmIDB4MGYpLCAocmVnWzddICYgMHg4MCkgPyAiIiA6ICJub3QgIik7CisJLyogIElmIGZkYyBpcyBhbHJlYWR5IGxvY2tlZCwgdW5sb2NrIGl0IGZpcnN0ICEgKi8KKwlpZiAocmVnWzddICYgMHg4MCkgeworCQlmZGNfcmVhZHlfd2FpdCgxMDApOworCQlUUkFDRV9DQVRDSChmZGNfaXNzdWVfY29tbWFuZChjbWQzLCBOUl9JVEVNUyhjbWQzKSwgJnN0YXQsIDEpLAorCQkJICAgIFRSQUNFKGZ0X3RfYnVnLCAiRkRDIHVubG9jayBjb21tYW5kIGZhaWxlZCwgIgorCQkJCSAgImNvbmZpZ3VyYXRpb24gdW5jaGFuZ2VkIikpOworCX0KKwlmZGNfZmlmb19sb2NrZWQgPSAwOworCS8qICBFbmFibGUgZmlmbyBhbmQgc2V0IHRocmVzaG9sZCBhdCB4eCBieXRlcyB0byBhbGxvdyBhCisJICogIHJlYXNvbmFibHkgbGFyZ2UgbGF0ZW5jeSBhbmQgcmVkdWNlIG51bWJlciBvZiBkbWEgYnVyc3RzLgorCSAqLworCWZkY19yZWFkeV93YWl0KDEwMCk7CisJaWYgKChyZXN1bHQgPSBmZGNfY29tbWFuZChjbWQxLCBOUl9JVEVNUyhjbWQxKSkpIDwgMCkgeworCQlUUkFDRShmdF90X2J1ZywgImNvbmZpZ3VyZSBjbWQgZmFpbGVkLCBmaWZvIHVuY2hhbmdlZCIpOworCX0KKwkvKiAgTm93IGxvY2sgY29uZmlndXJhdGlvbiBzbyByZXNldCB3aWxsIG5vdCBjaGFuZ2UgaXQKKwkgKi8KKyAgICAgICAgaWYoZmRjX2lzc3VlX2NvbW1hbmQoY21kMiwgTlJfSVRFTVMoY21kMiksICZzdGF0LCAxKSA8IDAgfHwKKwkgICBzdGF0ICE9IDB4MTApIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9idWcsCisJCQkgICAgIkZEQyBsb2NrIGNvbW1hbmQgZmFpbGVkLCBzdGF0ID0gMHglMDJ4Iiwgc3RhdCk7CisJfQorCWZkY19maWZvX2xvY2tlZCA9IDE7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZmRjX2ZpZm9fZW5hYmxlKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmIChmZGNfZmlmb19sb2NrZWQpIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF93YXJuLCAiRmlmbyBub3QgZW5hYmxlZCBiZWNhdXNlIGxvY2tlZCIpOworCX0KKwlUUkFDRV9DQVRDSChmZGNfZmlmb190aHJlc2hvbGQoZnRfZmRjX3RocmVzaG9sZCAvKiBieXRlcyAqLywKKwkJCQkgICAgICAgJmZkY19maWZvX3N0YXRlLAorCQkJCSAgICAgICAmZmRjX2xvY2tfc3RhdGUsCisJCQkJICAgICAgICZmZGNfZmlmb190aHIpLCk7CisJVFJBQ0VfQ0FUQ0goZmRjX2ZpZm9fdGhyZXNob2xkKGZ0X2ZkY190aHJlc2hvbGQgLyogYnl0ZXMgKi8sCisJCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpLCk7CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgIERldGVybWluZSBmZCBjb250cm9sbGVyIHR5cGUgCisgKi8KK3N0YXRpYyBfX3U4IGZkY19zYXZlX3N0YXRlWzJdOworCitzdGF0aWMgaW50IGZkY19wcm9iZSh2b2lkKQoreworCV9fdTggY21kWzFdOworCV9fdTggc3RhdFsxNl07IC8qIG11c3QgYmUgYWJsZSB0byBob2xkIGR1bXByZWdzICYgc2F2ZSByZXN1bHRzICovCisJaW50IGk7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qICBUcnkgdG8gZmluZCBvdXQgd2hhdCBraW5kIG9mIGZkIGNvbnRyb2xsZXIgd2UgaGF2ZSB0byBkZWFsIHdpdGgKKwkgKiAgU2NoZW1lIGJvcnJvd2VkIGZyb20gZmxvcHB5IGRyaXZlcjoKKwkgKiAgZmlyc3QgdHJ5IGlmIEZEQ19EVU1QUkVHUyBjb21tYW5kIHdvcmtzCisJICogICh0aGlzIGluZGljYXRlcyB0aGF0IHdlIGhhdmUgYSA4MjA3MiBvciBiZXR0ZXIpCisJICogIHRoZW4gdHJ5IHRoZSBGRENfVkVSU0lPTiBjb21tYW5kICg4MjA3MiBkb2Vzbid0IHN1cHBvcnQgdGhpcykKKwkgKiAgdGhlbiB0cnkgdGhlIEZEQ19VTkxPQ0sgY29tbWFuZCAoc29tZSBvbGRlciA4MjA3NydzIGRvbid0IHN1cHBvcnQgdGhpcykKKwkgKiAgdGhlbiB0cnkgdGhlIEZEQ19QQVJUSUQgY29tbWFuZCAoODIwNzgncyBzdXBwb3J0IHRoaXMpCisJICovCisJY21kWzBdID0gRkRDX0RVTVBSRUdTOworCWlmIChmZGNfaXNzdWVfY29tbWFuZChjbWQsIDEsIHN0YXQsIDEpICE9IDApIHsKKwkJVFJBQ0VfQUJPUlQobm9fZmRjLCBmdF90X2J1ZywgIk5vIEZEQyBmb3VuZCIpOworCX0KKwlpZiAoc3RhdFswXSA9PSAweDgwKSB7CisJCS8qIGludmFsaWQgY29tbWFuZDogbXVzdCBiZSBwcmUgODIwNzIgKi8KKwkJVFJBQ0VfQUJPUlQoaTgyNzIsCisJCQkgICAgZnRfdF93YXJuLCAiVHlwZSA4MjcyQS83NjVBIGNvbXBhdGlibGUgRkRDIGZvdW5kIik7CisJfQorCWZkY19yZXN1bHQoJnN0YXRbMV0sIDkpOworCWZkY19zYXZlX3N0YXRlWzBdID0gc3RhdFs3XTsKKwlmZGNfc2F2ZV9zdGF0ZVsxXSA9IHN0YXRbOF07CisJY21kWzBdID0gRkRDX1ZFUlNJT047CisJaWYgKGZkY19pc3N1ZV9jb21tYW5kKGNtZCwgMSwgc3RhdCwgMSkgPCAwIHx8IHN0YXRbMF0gPT0gMHg4MCkgeworCQlUUkFDRV9BQk9SVChpODI3MiwgZnRfdF93YXJuLCAiVHlwZSA4MjA3MiBGREMgZm91bmQiKTsKKwl9CisJaWYgKCpzdGF0ICE9IDB4OTApIHsKKwkJVFJBQ0VfQUJPUlQoaTgyNzIsIGZ0X3Rfd2FybiwgIlVua25vd24gRkRDIGZvdW5kIik7CisJfQorCWNtZFswXSA9IEZEQ19VTkxPQ0s7CisJaWYoZmRjX2lzc3VlX2NvbW1hbmQoY21kLCAxLCBzdGF0LCAxKSA8IDAgfHwgc3RhdFswXSAhPSAweDAwKSB7CisJCVRSQUNFX0FCT1JUKGk4MjcyLCBmdF90X3dhcm4sCisJCQkgICAgIlR5cGUgcHJlLTE5OTEgODIwNzcgRkRDIGZvdW5kLCAiCisJCQkgICAgInRyZWF0aW5nIGl0IGxpa2UgYSA4MjA3MiIpOworCX0KKwlpZiAoZmRjX3NhdmVfc3RhdGVbMF0gJiAweDgwKSB7IC8qIHdhcyBsb2NrZWQgKi8KKwkJY21kWzBdID0gRkRDX0xPQ0s7IC8qIHJlc3RvcmUgbG9jayAqLworCQkodm9pZClmZGNfaXNzdWVfY29tbWFuZChjbWQsIDEsIHN0YXQsIDEpOworCQlUUkFDRShmdF90X3dhcm4sICJGREMgaXMgYWxyZWFkeSBsb2NrZWQiKTsKKwl9CisJLyogVGVzdCBmb3IgYSBpODIwNzggRkRDICovCisJY21kWzBdID0gRkRDX1BBUlRJRDsKKwlpZiAoZmRjX2lzc3VlX2NvbW1hbmQoY21kLCAxLCBzdGF0LCAxKSA8IDAgfHwgc3RhdFswXSA9PSAweDgwKSB7CisJCS8qIGludmFsaWQgY29tbWFuZDogbm90IGEgaTgyMDc4eHggdHlwZSBGREMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQkJb3V0Yl9wKGksIGZkYy50ZHIpOworCQkJaWYgKChpbmJfcChmZGMudGRyKSAmIDB4MDMpICE9IGkpIHsKKwkJCQlUUkFDRV9BQk9SVChpODIwNzcsCisJCQkJCSAgICBmdF90X3dhcm4sICJUeXBlIDgyMDc3IEZEQyBmb3VuZCIpOworCQkJfQorCQl9CisJCVRSQUNFX0FCT1JUKGk4MjA3N0FBLCBmdF90X3dhcm4sICJUeXBlIDgyMDc3QUEgRkRDIGZvdW5kIik7CisJfQorCS8qIEZEQ19QQVJUSUQgY21kIHN1Y2NlZWRlZCAqLworCXN3aXRjaCAoc3RhdFswXSA+PiA1KSB7CisJY2FzZSAweDA6CisJCS8qIGk4MjA3OFNMIG9yIGk4MjA3OC0xLiAgVGhlIFNMIHBhcnQgY2Fubm90IHJ1biBhdAorCQkgKiAyTWJwcyAodGhlIFNMIGFuZCAtMSBkaWVzIGFyZSBpZGVudGljYWw7IHRoZXkgYXJlCisJCSAqIHNwZWVkIGdyYWRlZCBhZnRlciBwcm9kdWN0aW9uLCBhY2NvcmRpbmcgdG8gSW50ZWwpLgorCQkgKiBTb21lIFNMJ3MgY2FuIGJlIGRldGVjdGVkIGJ5IGRvaW5nIGEgU0FWRSBjbWQgYW5kCisJCSAqIGxvb2sgYXQgYml0IDcgb2YgdGhlIGZpcnN0IGJ5dGUgKHRoZSBTRUwzViMgYml0KS4KKwkJICogSWYgaXQgaXMgMCwgdGhlIHBhcnQgcnVucyBvZmYgM1ZvbHRzLCBhbmQgaGVuY2UgaXQKKwkJICogaXMgYSBTTC4KKwkJICovCisJCWNtZFswXSA9IEZEQ19TQVZFOworCQlpZihmZGNfaXNzdWVfY29tbWFuZChjbWQsIDEsIHN0YXQsIDE2KSA8IDApIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiRkRDX1NBVkUgZmFpbGVkLiBEdW5ubyB3aHkiKTsKKwkJCS8qIGd1ZXNzIHdlIGJldHRlciBjbGFpbSB0aGUgZmRjIHRvIGJlIGEgaTgyMDc4ICovCisJCQlUUkFDRV9BQk9SVChpODIwNzgsCisJCQkJICAgIGZ0X3Rfd2FybiwKKwkJCQkgICAgIlR5cGUgaTgyMDc4IEZEQyAoaSBzdXBwb3NlKSBmb3VuZCIpOworCQl9CisJCWlmICgoc3RhdFswXSAmIEZEQ19TRUwzVl9CSVQpKSB7CisJCQkvKiBmZGMgcnVubmluZyBvZmYgNVZvbHRzOyBQcmF5IHRoYXQgaXQncyBhIGk4MjA3OC0xCisJCQkgKi8KKwkJCVRSQUNFX0FCT1JUKGk4MjA3OF8xLCBmdF90X3dhcm4sCisJCQkJICAiVHlwZSBpODIwNzgtMSBvciA1Vm9sdCBpODIwNzhTTCBGREMgZm91bmQiKTsKKwkJfQorCQlUUkFDRV9BQk9SVChpODIwNzgsIGZ0X3Rfd2FybiwKKwkJCSAgICAiVHlwZSAzVm9sdCBpODIwNzhTTCBGREMgKDFNYnBzKSBmb3VuZCIpOworCWNhc2UgMHgxOgorCWNhc2UgMHgyOiAvKiBTODIwNzhCICAqLworCQkvKiBUaGUgJzc4QiAgaXNuJ3QgJzc4IGNvbXBhdGlibGUuICBEZXRlY3QgaXQgYXMgYSAnNzdBQSAqLworCQlUUkFDRV9BQk9SVChpODIwNzdBQSwgZnRfdF93YXJuLCAiVHlwZSBpODIwNzdBQSBGREMgZm91bmQiKTsKKwljYXNlIDB4MzogLyogTlNDIFBDODc0NCBjb3JlOyB1c2VkIGluIHNldmVyYWwgc3VwZXItSU8gY2hpcHMgKi8KKwkJVFJBQ0VfQUJPUlQoaTgyMDc3QUEsCisJCQkgICAgZnRfdF93YXJuLCAiVHlwZSA4MjA3N0FBIGNvbXBhdGlibGUgRkRDIGZvdW5kIik7CisJZGVmYXVsdDoKKwkJVFJBQ0UoZnRfdF93YXJuLCAiQSBwcmV2aW91c2x5IHVuZGV0ZWN0ZWQgRkRDIGZvdW5kIik7CisJCVRSQUNFX0FCT1JUKGk4MjA3N0FBLCBmdF90X3dhcm4sCisJCQkgICJUcmVhdGluZyBpdCBhcyBhIDgyMDc3QUEuIFBsZWFzZSByZXBvcnQgcGFydGlkPSAlZCIsCisJCQkgICAgc3RhdFswXSk7CisJfSAvKiBzd2l0Y2goc3RhdFsgMF0gPj4gNSkgKi8KKwlUUkFDRV9FWElUIG5vX2ZkYzsKK30KKworc3RhdGljIGludCBmZGNfcmVxdWVzdF9yZWdpb25zKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoZnRfbWFjaDIgfHwgZnRfcHJvYmVfZmMxMCkgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGZkYy5zcmEsIDgsICJmZGMgKGZ0KSIpKSB7CisjaWZuZGVmIEJST0tFTl9GTE9QUFlfRFJJVkVSCisJCQlUUkFDRV9FWElUIC1FQlVTWTsKKyNlbHNlCisJCQlUUkFDRShmdF90X3dhcm4sCisiYWRkcmVzcyAweCUwM3ggb2NjdXBpZWQgKGJ5IGZsb3BweSBkcml2ZXI/KSwgdXNpbmcgaXQgYW55d2F5IiwgZmRjLnNyYSk7CisjZW5kaWYKKwkJfQorCX0gZWxzZSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oZmRjLnNyYSwgNiwgImZkYyAoZnQpIikpIHsKKyNpZm5kZWYgQlJPS0VOX0ZMT1BQWV9EUklWRVIKKwkJCVRSQUNFX0VYSVQgLUVCVVNZOworI2Vsc2UKKwkJCVRSQUNFKGZ0X3Rfd2FybiwKKyJhZGRyZXNzIDB4JTAzeCBvY2N1cGllZCAoYnkgZmxvcHB5IGRyaXZlcj8pLCB1c2luZyBpdCBhbnl3YXkiLCBmZGMuc3JhKTsKKyNlbmRpZgorCQl9CisJCWlmICghcmVxdWVzdF9yZWdpb24oZmRjLnNyYSArIDcsIDEsICJmZGMgKGZ0KSIpKSB7CisjaWZuZGVmIEJST0tFTl9GTE9QUFlfRFJJVkVSCisJCQlyZWxlYXNlX3JlZ2lvbihmZGMuc3JhLCA2KTsKKwkJCVRSQUNFX0VYSVQgLUVCVVNZOworI2Vsc2UKKwkJCVRSQUNFKGZ0X3Rfd2FybiwKKyJhZGRyZXNzIDB4JTAzeCBvY2N1cGllZCAoYnkgZmxvcHB5IGRyaXZlcj8pLCB1c2luZyBpdCBhbnl3YXkiLCBmZGMuc3JhICsgNyk7CisjZW5kaWYKKwkJfQorCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK3ZvaWQgZmRjX3JlbGVhc2VfcmVnaW9ucyh2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKGZkYy5zcmEgIT0gMCkgeworCQlpZiAoZmRjLmRvcjIgIT0gMCkgeworCQkJcmVsZWFzZV9yZWdpb24oZmRjLnNyYSwgOCk7CisJCX0gZWxzZSB7CisJCQlyZWxlYXNlX3JlZ2lvbihmZGMuc3JhLCA2KTsKKwkJCXJlbGVhc2VfcmVnaW9uKGZkYy5kaXIsIDEpOworCQl9CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyBpbnQgZmRjX2NvbmZpZ19yZWdzKHVuc2lnbmVkIGludCBmZGNfYmFzZSwgCisJCQkgICB1bnNpZ25lZCBpbnQgZmRjX2lycSwgCisJCQkgICB1bnNpZ25lZCBpbnQgZmRjX2RtYSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWZkYy5pcnEgPSBmZGNfaXJxOworCWZkYy5kbWEgPSBmZGNfZG1hOworCWZkYy5zcmEgPSBmZGNfYmFzZTsKKwlmZGMuc3JiID0gZmRjX2Jhc2UgKyAxOworCWZkYy5kb3IgPSBmZGNfYmFzZSArIDI7CisJZmRjLnRkciA9IGZkY19iYXNlICsgMzsKKwlmZGMubXNyID0gZmRjLmRzciA9IGZkY19iYXNlICsgNDsKKwlmZGMuZmlmbyA9IGZkY19iYXNlICsgNTsKKwlmZGMuZGlyID0gZmRjLmNjciA9IGZkY19iYXNlICsgNzsKKwlmZGMuZG9yMiA9IChmdF9tYWNoMiB8fCBmdF9wcm9iZV9mYzEwKSA/IGZkY19iYXNlICsgNiA6IDA7CisJVFJBQ0VfQ0FUQ0goZmRjX3JlcXVlc3RfcmVnaW9ucygpLCBmZGMuc3JhID0gMCk7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IGZkY19jb25maWcodm9pZCkKK3sKKwlzdGF0aWMgaW50IGFscmVhZHlfZG9uZTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGFscmVhZHlfZG9uZSkgeworCQlUUkFDRV9DQVRDSChmZGNfcmVxdWVzdF9yZWdpb25zKCksKTsKKwkJKihmZGMuaG9vaykgPSBmZGNfaXNyOwkvKiBob29rIG91ciBoYW5kbGVyIGluICovCisJCVRSQUNFX0VYSVQgMDsKKwl9CisJaWYgKGZ0X3Byb2JlX2ZjMTApIHsKKwkJaW50IGZjX3R5cGU7CisJCQorCQlUUkFDRV9DQVRDSChmZGNfY29uZmlnX3JlZ3MoZnRfZmRjX2Jhc2UsCisJCQkJCSAgICBmdF9mZGNfaXJxLCBmdF9mZGNfZG1hKSwpOworCQlmY190eXBlID0gZmMxMF9lbmFibGUoKTsKKwkJaWYgKGZjX3R5cGUgIT0gMCkgeworCQkJVFJBQ0UoZnRfdF93YXJuLCAiRkMtJWMwIGNvbnRyb2xsZXIgZm91bmQiLCAnMCcgKyBmY190eXBlKTsKKwkJCWZkYy50eXBlID0gZmMxMDsKKwkJCWZkYy5ob29rID0gJmRvX2Z0YXBlOworCQkJKihmZGMuaG9vaykgPSBmZGNfaXNyOwkvKiBob29rIG91ciBoYW5kbGVyIGluICovCisJCQlhbHJlYWR5X2RvbmUgPSAxOworCQkJVFJBQ0VfRVhJVCAwOworCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF93YXJuLCAiRkMtMTAvMjAgY29udHJvbGxlciBub3QgZm91bmQiKTsKKwkJCWZkY19yZWxlYXNlX3JlZ2lvbnMoKTsKKwkJCWZkYy50eXBlID0gbm9fZmRjOworCQkJZnRfcHJvYmVfZmMxMCA9IDA7CisJCQlmdF9mZGNfYmFzZSAgID0gMHgzZjA7CisJCQlmdF9mZGNfaXJxICAgID0gNjsKKwkJCWZ0X2ZkY19kbWEgICAgPSAyOworCQl9CisJfQorCVRSQUNFKGZ0X3Rfd2FybiwgImZkYyBiYXNlOiAweCV4LCBpcnE6ICVkLCBkbWE6ICVkIiwgCisJICAgICAgZnRfZmRjX2Jhc2UsIGZ0X2ZkY19pcnEsIGZ0X2ZkY19kbWEpOworCVRSQUNFX0NBVENIKGZkY19jb25maWdfcmVncyhmdF9mZGNfYmFzZSwgZnRfZmRjX2lycSwgZnRfZmRjX2RtYSksKTsKKwlmZGMuaG9vayA9ICZkb19mdGFwZTsKKwkqKGZkYy5ob29rKSA9IGZkY19pc3I7CS8qIGhvb2sgb3VyIGhhbmRsZXIgaW4gKi8KKwlhbHJlYWR5X2RvbmUgPSAxOworCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGZ0YXBlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXZvaWQgKCpoYW5kbGVyKSAodm9pZCkgPSAqZmRjLmhvb2s7CisJaW50IGhhbmRsZWQgPSAwOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwkqZmRjLmhvb2sgPSBOVUxMOworCWlmIChoYW5kbGVyKSB7CisJCWhhbmRsZWQgPSAxOworCQloYW5kbGVyKCk7CisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9idWcsICJVbmV4cGVjdGVkIGZ0YXBlIGludGVycnVwdCIpOworCX0KKwlUUkFDRV9FWElUIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyBpbnQgZmRjX2dyYWJfaXJxX2FuZF9kbWEodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGZkYy5ob29rID09ICZkb19mdGFwZSkgeworCQkvKiAgR2V0IGZhc3QgaW50ZXJydXB0IGhhbmRsZXIuCisJCSAqLworCQlpZiAocmVxdWVzdF9pcnEoZmRjLmlycSwgZnRhcGVfaW50ZXJydXB0LAorCQkJCVNBX0lOVEVSUlVQVCwgImZ0IiwgZnRhcGVfaWQpKSB7CisJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywKKwkJCQkgICAgIlVuYWJsZSB0byBncmFiIElSUSVkIGZvciBmdGFwZSBkcml2ZXIiLAorCQkJCSAgICBmZGMuaXJxKTsKKwkJfQorCQlpZiAocmVxdWVzdF9kbWEoZmRjLmRtYSwgZnRhcGVfaWQpKSB7CisJCQlmcmVlX2lycShmZGMuaXJxLCBmdGFwZV9pZCk7CisJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywKKwkJCSAgICAgICJVbmFibGUgdG8gZ3JhYiBETUElZCBmb3IgZnRhcGUgZHJpdmVyIiwKKwkJCSAgICAgIGZkYy5kbWEpOworCQl9CisJfQorCWlmIChmdF9mZGNfYmFzZSAhPSAweDNmMCAmJiAoZnRfZmRjX2RtYSA9PSAyIHx8IGZ0X2ZkY19pcnEgPT0gNikpIHsKKwkJLyogVXNpbmcgc2FtZSBkbWEgY2hhbm5lbCBvciBpcnEgYXMgc3RhbmRhcmQgZmRjLCBuZWVkCisJCSAqIHRvIGRpc2FibGUgdGhlIGRtYS1nYXRlIG9uIHRoZSBzdGQgZmRjLiBUaGlzCisJCSAqIGNvdWxkbid0IGJlIGRvbmUgaW4gdGhlIGZsb3BweSBkcml2ZXIgYXMgc29tZQorCQkgKiBsYXB0b3BzIGFyZSB1c2luZyB0aGUgZG1hLWdhdGUgdG8gZW50ZXIgYSBsb3cgcG93ZXIKKwkJICogb3IgZXZlbiBzdXNwZW5kZWQgc3RhdGUgOi0oCisJCSAqLworCQlvdXRiX3AoRkRDX1JFU0VUX05PVCwgMHgzZjIpOworCQlUUkFDRShmdF90X25vaXNlLCAiRE1BLWdhdGUgb24gc3RhbmRhcmQgZmRjIGRpc2FibGVkIik7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworaW50IGZkY19yZWxlYXNlX2lycV9hbmRfZG1hKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmIChmZGMuaG9vayA9PSAmZG9fZnRhcGUpIHsKKwkJZGlzYWJsZV9kbWEoZmRjLmRtYSk7CS8qIGp1c3QgaW4gY2FzZS4uLiAqLworCQlmcmVlX2RtYShmZGMuZG1hKTsKKwkJZnJlZV9pcnEoZmRjLmlycSwgZnRhcGVfaWQpOworCX0KKwlpZiAoZnRfZmRjX2Jhc2UgIT0gMHgzZjAgJiYgKGZ0X2ZkY19kbWEgPT0gMiB8fCBmdF9mZGNfaXJxID09IDYpKSB7CisJCS8qIFVzaW5nIHNhbWUgZG1hIGNoYW5uZWwgYXMgc3RhbmRhcmQgZmRjLCBuZWVkIHRvCisJCSAqIGRpc2FibGUgdGhlIGRtYS1nYXRlIG9uIHRoZSBzdGQgZmRjLiBUaGlzIGNvdWxkbid0CisJCSAqIGJlIGRvbmUgaW4gdGhlIGZsb3BweSBkcml2ZXIgYXMgc29tZSBsYXB0b3BzIGFyZQorCQkgKiB1c2luZyB0aGUgZG1hLWdhdGUgdG8gZW50ZXIgYSBsb3cgcG93ZXIgb3IgZXZlbgorCQkgKiBzdXNwZW5kZWQgc3RhdGUgOi0oCisJCSAqLworCQlvdXRiX3AoRkRDX1JFU0VUX05PVCB8IEZEQ19ETUFfTU9ERSwgMHgzZjIpOworCQlUUkFDRShmdF90X25vaXNlLCAiRE1BLWdhdGUgb24gc3RhbmRhcmQgZmRjIGVuYWJsZWQgYWdhaW4iKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgZmRjX2luaXQodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogZmluZCBhIEZEQyB0byB1c2UgKi8KKwlUUkFDRV9DQVRDSChmZGNfY29uZmlnKCksKTsKKwlUUkFDRV9DQVRDSChmZGNfZ3JhYl9pcnFfYW5kX2RtYSgpLCBmZGNfcmVsZWFzZV9yZWdpb25zKCkpOworCWZ0YXBlX21vdG9yID0gMDsKKwlmZGNfY2F0Y2hfc3RyYXlfaW50ZXJydXB0cygwKTsJLyogY2xlYXIgbnVtYmVyIG9mIGF3YWludGVkCisJCQkJCSAqIHN0cmF5IGludGVycnVwdGUgCisJCQkJCSAqLworCWZkY19jYXRjaF9zdHJheV9pbnRlcnJ1cHRzKDEpOwkvKiBvbmUgYWx3YXlzIGNvbWVzICg/KSAqLworCVRSQUNFKGZ0X3RfZmxvdywgInJlc2V0dGluZyBmZGMiKTsKKwlmZGNfc2V0X3NlZWtfcmF0ZSgyKTsJCS8qIHVzZSBub21pbmFsIFFJQyBzdGVwIHJhdGUgKi8KKwlmZGNfcmVzZXQoKTsJCQkvKiBpbml0IGZkYyAmIGNsZWFyIHRyYWNrIGNvdW50ZXJzICovCisJaWYgKGZkYy50eXBlID09IG5vX2ZkYykgewkvKiBubyBGQy0xMCBvciBGQy0yMCBmb3VuZCAqLworCQlmZGMudHlwZSA9IGZkY19wcm9iZSgpOworCQlmZGNfcmVzZXQoKTsJCS8qIHVwZGF0ZSB3aXRoIG5ldyBrbm93bGVkZ2UgKi8KKwl9CisJaWYgKGZkYy50eXBlID09IG5vX2ZkYykgeworCQlmZGNfcmVsZWFzZV9pcnFfYW5kX2RtYSgpOworCQlmZGNfcmVsZWFzZV9yZWdpb25zKCk7CisJCVRSQUNFX0VYSVQgLUVOWElPOworCX0KKwlpZiAoZmRjLnR5cGUgPj0gaTgyMDc3KSB7CisJCWlmIChmZGNfZmlmb19lbmFibGUoKSA8IDApIHsKKwkJCVRSQUNFKGZ0X3Rfd2FybiwgImNvdWxkbid0IGVuYWJsZSBmZGMgZmlmbyAhIik7CisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X2Zsb3csICJmZGMgZmlmbyBlbmFibGVkIGFuZCBsb2NrZWQiKTsKKwkJfQorCX0KKwlUUkFDRV9FWElUIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlvLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjM2M3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uaApAQCAtMCwwICsxLDI1MiBAQAorI2lmbmRlZiBfRkRDX0lPX0gKKyNkZWZpbmUgX0ZEQ19JT19ICisKKy8qCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uaCx2ICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjA2ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgbG93IGxldmVsCisgKiAgICAgIGZ1bmN0aW9ucyB0aGF0IGNvbW11bmljYXRlIHdpdGggdGhlIGZsb3BweSBkaXNrIGNvbnRyb2xsZXIsCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IKKyAqICAgICAgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZkcmVnLmg+CisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKKworI2RlZmluZSBGRENfU0tfQklUICAgICAgKDB4MjApCisjZGVmaW5lIEZEQ19NVF9CSVQgICAgICAoMHg4MCkKKworI2RlZmluZSBGRENfUkVBRCAgICAgICAgKEZEX1JFQUQgJiB+KEZEQ19TS19CSVQgfCBGRENfTVRfQklUKSkKKyNkZWZpbmUgRkRDX1dSSVRFICAgICAgIChGRF9XUklURSAmIH5GRENfTVRfQklUKQorI2RlZmluZSBGRENfUkVBRF9ERUxFVEVEICAoMHg0YykKKyNkZWZpbmUgRkRDX1dSSVRFX0RFTEVURUQgKDB4NDkpCisjZGVmaW5lIEZEQ19WRVJJRlkgICAgICAgICgweDU2KQorI2RlZmluZSBGRENfUkVBRElEICAgICAgKDB4NGEpCisjZGVmaW5lIEZEQ19TRU5TRUQgICAgICAoMHgwNCkKKyNkZWZpbmUgRkRDX1NFTlNFSSAgICAgIChGRF9TRU5TRUkpCisjZGVmaW5lIEZEQ19GT1JNQVQgICAgICAoRkRfRk9STUFUKQorI2RlZmluZSBGRENfUkVDQUwgICAgICAgKEZEX1JFQ0FMSUJSQVRFKQorI2RlZmluZSBGRENfU0VFSyAgICAgICAgKEZEX1NFRUspCisjZGVmaW5lIEZEQ19TUEVDSUZZICAgICAoRkRfU1BFQ0lGWSkKKyNkZWZpbmUgRkRDX1JFQ0FMSUJSICAgIChGRF9SRUNBTElCUkFURSkKKyNkZWZpbmUgRkRDX1ZFUlNJT04gICAgIChGRF9WRVJTSU9OKQorI2RlZmluZSBGRENfUEVSUEVORCAgICAgKEZEX1BFUlBFTkRJQ1VMQVIpCisjZGVmaW5lIEZEQ19EVU1QUkVHUyAgICAoRkRfRFVNUFJFR1MpCisjZGVmaW5lIEZEQ19MT0NLICAgICAgICAoRkRfTE9DSykKKyNkZWZpbmUgRkRDX1VOTE9DSyAgICAgIChGRF9VTkxPQ0spCisjZGVmaW5lIEZEQ19DT05GSUdVUkUgICAoRkRfQ09ORklHVVJFKQorI2RlZmluZSBGRENfRFJJVkVfU1BFQyAgKDB4OGUpCS8qIGk4MjA3OCBoYXMgdGhpcyAoYW55IG90aGVycz8pICovCisjZGVmaW5lIEZEQ19QQVJUSUQgICAgICAoMHgxOCkJLyogaTgyMDc4IGhhcyB0aGlzICovCisjZGVmaW5lIEZEQ19TQVZFICAgICAgICAoMHgyZSkJLyogaTgyMDc4IGhhcyB0aGlzIChhbnkgb3RoZXJzPykgKi8KKyNkZWZpbmUgRkRDX1JFU1RPUkUgICAgICgweDRlKQkvKiBpODIwNzggaGFzIHRoaXMgKGFueSBvdGhlcnM/KSAqLworCisjZGVmaW5lIEZEQ19TVEFUVVNfTUFTSyAoU1RBVFVTX0JVU1kgfCBTVEFUVVNfRE1BIHwgU1RBVFVTX0RJUiB8IFNUQVRVU19SRUFEWSkKKyNkZWZpbmUgRkRDX0RBVEFfUkVBRFkgIChTVEFUVVNfUkVBRFkpCisjZGVmaW5lIEZEQ19EQVRBX09VVFBVVCAoU1RBVFVTX0RJUikKKyNkZWZpbmUgRkRDX0RBVEFfUkVBRFlfTUFTSyAoU1RBVFVTX1JFQURZIHwgU1RBVFVTX0RJUikKKyNkZWZpbmUgRkRDX0RBVEFfT1VUX1JFQURZICAoU1RBVFVTX1JFQURZIHwgU1RBVFVTX0RJUikKKyNkZWZpbmUgRkRDX0RBVEFfSU5fUkVBRFkgICAoU1RBVFVTX1JFQURZKQorI2RlZmluZSBGRENfQlVTWSAgICAgICAgKFNUQVRVU19CVVNZKQorI2RlZmluZSBGRENfQ0xLNDhfQklUICAgKDB4ODApCisjZGVmaW5lIEZEQ19TRUwzVl9CSVQgICAoMHg0MCkKKworI2RlZmluZSBTVDBfSU5UX01BU0sgICAgKFNUMF9JTlRSKQorI2RlZmluZSBGRENfSU5UX05PUk1BTCAgKFNUMF9JTlRSICYgMHgwMCkKKyNkZWZpbmUgRkRDX0lOVF9BQk5PUk1BTCAoU1QwX0lOVFIgJiAweDQwKQorI2RlZmluZSBGRENfSU5UX0lOVkFMSUQgKFNUMF9JTlRSICYgMHg4MCkKKyNkZWZpbmUgRkRDX0lOVF9SRUFEWUNIIChTVDBfSU5UUiAmIDB4QzApCisjZGVmaW5lIFNUMF9TRUVLX0VORCAgICAoU1QwX1NFKQorI2RlZmluZSBTVDNfVFJBQ0tfMCAgICAgKFNUM19UWikKKworI2RlZmluZSBGRENfUkVTRVRfTk9UICAgKDB4MDQpCisjZGVmaW5lIEZEQ19ETUFfTU9ERSAgICAoMHgwOCkKKyNkZWZpbmUgRkRDX01PVE9SXzAgICAgICgweDEwKQorI2RlZmluZSBGRENfTU9UT1JfMSAgICAgKDB4MjApCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICgqKmhvb2spICh2b2lkKTsJLyogb3VyIHdlZGdlIGludG8gdGhlIGlzciAqLworCWVudW0geworCQlub19mZGMsIGk4MjcyLCBpODIwNzcsIGk4MjA3N0FBLCBmYzEwLAorCQlpODIwNzgsIGk4MjA3OF8xCisJfSB0eXBlOwkJCS8qIEZEQyB0eXBlICovCisJdW5zaWduZWQgaW50IGlycTsgLyogRkRDIGlycSBuciAqLworCXVuc2lnbmVkIGludCBkbWE7IC8qIEZEQyBkbWEgY2hhbm5lbCBuciAqLworCV9fdTE2IHNyYTsJICAvKiBTdGF0dXMgcmVnaXN0ZXIgQSAoUFMvMiBvbmx5KSAqLworCV9fdTE2IHNyYjsJICAvKiBTdGF0dXMgcmVnaXN0ZXIgQiAoUFMvMiBvbmx5KSAqLworCV9fdTE2IGRvcjsJICAvKiBEaWdpdGFsIG91dHB1dCByZWdpc3RlciAqLworCV9fdTE2IHRkcjsJICAvKiBUYXBlIERyaXZlIFJlZ2lzdGVyICg4MjA3N1NMLTEgJgorCQkJICAgICA4MjA3OCBvbmx5KSAqLworCV9fdTE2IG1zcjsJICAvKiBNYWluIFN0YXR1cyBSZWdpc3RlciAqLworCV9fdTE2IGRzcjsJICAvKiBEYXRhcmF0ZSBTZWxlY3QgUmVnaXN0ZXIgKDgyMDd4IG9ubHkpICovCisJX191MTYgZmlmbzsJICAvKiBEYXRhIHJlZ2lzdGVyIC8gRmlmbyBvbiA4MjA3eCAqLworCV9fdTE2IGRpcjsJICAvKiBEaWdpdGFsIElucHV0IFJlZ2lzdGVyICovCisJX191MTYgY2NyOwkgIC8qIENvbmZpZ3VyYXRpb24gQ29udHJvbCBSZWdpc3RlciAqLworCV9fdTE2IGRvcjI7CSAgLyogQWx0ZXJuYXRlIGRvciBvbiBNQUNILTIgY29udHJvbGxlciwKKwkJCSAgICAgYWxzbyB1c2VkIHdpdGggRkMtMTAsIG1lYW5pbmcgdW5rbm93biAqLworfSBmZGNfY29uZmlnX2luZm87CisKK3R5cGVkZWYgZW51bSB7CisJZmRjX2RhdGFfcmF0ZV8yNTAgID0gMiwKKwlmZGNfZGF0YV9yYXRlXzMwMCAgPSAxLAkvKiBhbnkgZmRjIGluIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworCWZkY19kYXRhX3JhdGVfNTAwICA9IDAsCisJZmRjX2RhdGFfcmF0ZV8xMDAwID0gMywKKwlmZGNfZGF0YV9yYXRlXzIwMDAgPSAxLAkvKiBpODIwNzgtMTogd2hlbiB1c2luZyBEYXRhIFJhdGUgVGFibGUgIzIgKi8KK30gZmRjX2RhdGFfcmF0ZV90eXBlOworCit0eXBlZGVmIGVudW0geworCWZkY19pZGxlICAgICAgICAgID0gMCwKKwlmZGNfcmVhZGluZ19kYXRhICA9IEZEQ19SRUFELAorCWZkY19zZWVraW5nICAgICAgID0gRkRDX1NFRUssCisJZmRjX3dyaXRpbmdfZGF0YSAgPSBGRENfV1JJVEUsCisJZmRjX2RlbGV0aW5nICAgICAgPSBGRENfV1JJVEVfREVMRVRFRCwKKwlmZGNfcmVhZGluZ19pZCAgICA9IEZEQ19SRUFESUQsCisJZmRjX3JlY2FsaWJyYXRpbmcgPSBGRENfUkVDQUwsCisJZmRjX2Zvcm1hdHRpbmcgICAgPSBGRENfRk9STUFULAorCWZkY192ZXJpZnlpbmcgICAgID0gRkRDX1ZFUklGWQorfSBmZGNfbW9kZV9lbnVtOworCit0eXBlZGVmIGVudW0geworCXdhaXRpbmcgPSAwLAorCXJlYWRpbmcsCisJd3JpdGluZywKKwlmb3JtYXR0aW5nLAorCXZlcmlmeWluZywKKwlkZWxldGluZywKKwlkb25lLAorCWVycm9yLAorCW1tYXBwZWQsCit9IGJ1ZmZlcl9zdGF0ZV9lbnVtOworCit0eXBlZGVmIHN0cnVjdCB7CisJX191OCAqYWRkcmVzczsKKwl2b2xhdGlsZSBidWZmZXJfc3RhdGVfZW51bSBzdGF0dXM7CisJdm9sYXRpbGUgX191OCAqcHRyOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBieXRlczsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc2VnbWVudF9pZDsKKworCS8qIGJpdG1hcCBmb3IgcmVtYWluZGVyIG9mIHNlZ21lbnQgbm90IHlldCBoYW5kbGVkLgorCSAqIG9uZSBiaXQgc2V0IGZvciBlYWNoIGJhZCBzZWN0b3IgdGhhdCBtdXN0IGJlIHNraXBwZWQuCisJICovCisJdm9sYXRpbGUgU2VjdG9yTWFwIGJhZF9zZWN0b3JfbWFwOworCisJLyogYml0bWFwIHdpdGggYmFkIGRhdGEgYmxvY2tzIGluIGRhdGEgYnVmZmVyLgorCSAqIHRoZSBlcnJvcnMgaW4gdGhpcyBtYXAgbWF5IGJlIHJldHJpZWQuCisJICovCisJdm9sYXRpbGUgU2VjdG9yTWFwIHNvZnRfZXJyb3JfbWFwOworCisJLyogYml0bWFwIHdpdGggYmFkIGRhdGEgYmxvY2tzIGluIGRhdGEgYnVmZmVyCisJICogdGhlIGVycm9ycyBpbiB0aGlzIG1hcCBtYXkgbm90IGJlIHJldHJpZWQuCisJICovCisJdm9sYXRpbGUgU2VjdG9yTWFwIGhhcmRfZXJyb3JfbWFwOworCisJLyogcmV0cnkgY291bnRlciBmb3Igc29mdCBlcnJvcnMuCisJICovCisJdm9sYXRpbGUgaW50IHJldHJ5OworCisJLyogc2VjdG9ycyB0byBza2lwIG9uIHJldHJ5ID8/PworCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBza2lwOworCisJLyogbnIgb2YgZGF0YSBibG9ja3MgaW4gZGF0YSBidWZmZXIKKwkgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgZGF0YV9vZmZzZXQ7CisKKwkvKiBvZmZzZXQgaW4gc2VnbWVudCBmb3IgZmlyc3Qgc2VjdG9yIHRvIGJlIGhhbmRsZWQuCisJICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNlY3Rvcl9vZmZzZXQ7CisKKwkvKiBzaXplIG9mIGNsdXN0ZXIgb2YgZ29vZCBzZWN0b3JzIHRvIGJlIGhhbmRsZWQuCisJICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNlY3Rvcl9jb3VudDsKKworCS8qIHNpemUgb2YgcmVtYWluaW5nIHBhcnQgb2Ygc2VnbWVudCB0byBiZSBoYW5kbGVkLgorCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCByZW1haW5pbmc7CisKKwkvKiBwb2ludHMgdG8gbmV4dCBzZWdtZW50IChjb250aWd1b3VzKSB0byBiZSBoYW5kbGVkLAorCSAqIG9yIGlzIHplcm8gaWYgbm8gcmVhZC1haGVhZCBpcyBhbGxvd2VkLgorCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBuZXh0X3NlZ21lbnQ7CisKKwkvKiBmbGFnIGJlaW5nIHNldCBpZiBkZWxldGVkIGRhdGEgd2FzIHJlYWQuCisJICovCisJdm9sYXRpbGUgaW50IGRlbGV0ZWQ7CisKKwkvKiBmbG9wcHkgY29vcmRpbmF0ZXMgb2YgZmlyc3Qgc2VjdG9yIGluIHNlZ21lbnQgKi8KKwl2b2xhdGlsZSBfX3U4IGhlYWQ7CisJdm9sYXRpbGUgX191OCBjeWw7CisJdm9sYXRpbGUgX191OCBzZWN0OworCisJLyogZ2FwIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgKi8KKwlfX3U4IGdhcDM7CisJLyogZmxhZyBzZXQgd2hlbiBidWZmZXIgaXMgbW1hcGVkICovCisJaW50IG1tYXBwZWQ7Cit9IGJ1ZmZlcl9zdHJ1Y3Q7CisKKy8qCisgKiAgICAgIGZkYy1pby5jIGRlZmluZWQgcHVibGljIHZhcmlhYmxlcworICovCitleHRlcm4gdm9sYXRpbGUgZmRjX21vZGVfZW51bSBmZGNfbW9kZTsKK2V4dGVybiBpbnQgZmRjX3NldHVwX2Vycm9yOwkvKiBvdXRkYXRlZCA/Pz8gKi8KK2V4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCBmdGFwZV93YWl0X2ludHI7CitleHRlcm4gdm9sYXRpbGUgaW50IGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXI7IC8qIHRyYWNrIG5yIEZEQyB0aGlua3Mgd2UncmUgb24gKi8KK2V4dGVybiB2b2xhdGlsZSBfX3U4IGZkY19oZWFkOwkvKiBGREMgaGVhZCAqLworZXh0ZXJuIHZvbGF0aWxlIF9fdTggZmRjX2N5bDsJLyogRkRDIHRyYWNrICovCitleHRlcm4gdm9sYXRpbGUgX191OCBmZGNfc2VjdDsJLyogRkRDIHNlY3RvciAqLworZXh0ZXJuIGZkY19jb25maWdfaW5mbyBmZGM7CS8qIEZEQyBoYXJkd2FyZSBjb25maWd1cmF0aW9uICovCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgZnRfZmRjX2Jhc2U7CitleHRlcm4gdW5zaWduZWQgaW50IGZ0X2ZkY19pcnE7CitleHRlcm4gdW5zaWduZWQgaW50IGZ0X2ZkY19kbWE7CitleHRlcm4gdW5zaWduZWQgaW50IGZ0X2ZkY190aHJlc2hvbGQ7CitleHRlcm4gdW5zaWduZWQgaW50IGZ0X2ZkY19yYXRlX2xpbWl0OworZXh0ZXJuIGludCBmdF9wcm9iZV9mYzEwOworZXh0ZXJuIGludCBmdF9tYWNoMjsKKy8qCisgKiAgICAgIGZkYy1pby5jIGRlZmluZWQgcHVibGljIGZ1bmN0aW9ucworICovCitleHRlcm4gdm9pZCBmZGNfY2F0Y2hfc3RyYXlfaW50ZXJydXB0cyhpbnQgY291bnQpOworZXh0ZXJuIGludCBmZGNfcmVhZHlfd2FpdCh1bnNpZ25lZCBpbnQgdGltZW91dCk7CitleHRlcm4gaW50IGZkY19jb21tYW5kKGNvbnN0IF9fdTggKiBjbWRfZGF0YSwgaW50IGNtZF9sZW4pOworZXh0ZXJuIGludCBmZGNfcmVzdWx0KF9fdTggKiByZXNfZGF0YSwgaW50IHJlc19sZW4pOworZXh0ZXJuIGludCBmZGNfaW50ZXJydXB0X3dhaXQodW5zaWduZWQgaW50IHRpbWUpOworZXh0ZXJuIGludCBmZGNfc2VlayhpbnQgdHJhY2spOworZXh0ZXJuIGludCBmZGNfc2Vuc2VfZHJpdmVfc3RhdHVzKGludCAqc3QzKTsKK2V4dGVybiB2b2lkIGZkY19tb3RvcihpbnQgbW90b3IpOworZXh0ZXJuIHZvaWQgZmRjX3Jlc2V0KHZvaWQpOworZXh0ZXJuIHZvaWQgZmRjX2Rpc2FibGUodm9pZCk7CitleHRlcm4gaW50IGZkY19maWZvX3RocmVzaG9sZChfX3U4IHRocmVzaG9sZCwKKwkJCSAgICAgIGludCAqZmlmb19zdGF0ZSwgaW50ICpsb2NrX3N0YXRlLCBpbnQgKmZpZm9fdGhyKTsKK2V4dGVybiB2b2lkIGZkY193YWl0X2NhbGlicmF0ZSh2b2lkKTsKK2V4dGVybiBpbnQgZmRjX3NlbnNlX2ludGVycnVwdF9zdGF0dXMoaW50ICpzdDAsIGludCAqY3VycmVudF9jeWxpbmRlcik7CitleHRlcm4gdm9pZCBmZGNfc2F2ZV9kcml2ZV9zcGVjcyh2b2lkKTsKK2V4dGVybiB2b2lkIGZkY19yZXN0b3JlX2RyaXZlX3NwZWNzKHZvaWQpOworZXh0ZXJuIGludCBmZGNfc2V0X2RhdGFfcmF0ZShpbnQgcmF0ZSk7CitleHRlcm4gdm9pZCBmZGNfc2V0X3dyaXRlX3ByZWNvbXAoaW50IHByZWNvbXApOworZXh0ZXJuIGludCBmZGNfcmVsZWFzZV9pcnFfYW5kX2RtYSh2b2lkKTsKK2V4dGVybiB2b2lkIGZkY19yZWxlYXNlX3JlZ2lvbnModm9pZCk7CitleHRlcm4gaW50IGZkY19pbml0KHZvaWQpOworZXh0ZXJuIGludCBmZGNfc2V0dXBfcmVhZF93cml0ZShidWZmZXJfc3RydWN0ICogYnVmZiwgX191OCBvcGVyYXRpb24pOworZXh0ZXJuIGludCBmZGNfc2V0dXBfZm9ybWF0dGluZyhidWZmZXJfc3RydWN0ICogYnVmZik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaXNyLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlzci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMmJjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlzci5jCkBAIC0wLDAgKzEsMTE3MCBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mZGMtaXNyLmMsdiAkCisgKiAkUmV2aXNpb246IDEuOSAkCisgKiAkRGF0ZTogMTk5Ny8xMC8xNyAyMzowMTo1MyAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgYW5kCisgKiAgICAgIGFzc29jaWF0ZWQgY29kZSBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyCisgKiAgICAgICJmdGFwZSIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNkZWZpbmUgdm9sYXRpbGUJCS8qICovCisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaXNyLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pby5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWNhbGlici5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCit2b2xhdGlsZSBpbnQgZnRfZXhwZWN0ZWRfc3RyYXlfaW50ZXJydXB0czsKK3ZvbGF0aWxlIGludCBmdF9pbnRlcnJ1cHRfc2VlbjsKK3ZvbGF0aWxlIGludCBmdF9zZWVrX2NvbXBsZXRlZDsKK3ZvbGF0aWxlIGludCBmdF9oaWRlX2ludGVycnVwdDsKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlub19lcnJvciA9IDAsIGlkX2FtX2Vycm9yID0gMHgwMSwgaWRfY3JjX2Vycm9yID0gMHgwMiwKKwlkYXRhX2FtX2Vycm9yID0gMHgwNCwgZGF0YV9jcmNfZXJyb3IgPSAweDA4LAorCW5vX2RhdGFfZXJyb3IgPSAweDEwLCBvdmVycnVuX2Vycm9yID0gMHgyMCwKK30gZXJyb3JfY2F1c2U7CitzdGF0aWMgaW50IHN0b3BfcmVhZF9haGVhZDsKKworCitzdGF0aWMgdm9pZCBwcmludF9lcnJvcl9jYXVzZShpbnQgY2F1c2UpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCXN3aXRjaCAoY2F1c2UpIHsKKwljYXNlIG5vX2RhdGFfZXJyb3I6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJubyBkYXRhIGVycm9yIik7CisJCWJyZWFrOworCWNhc2UgaWRfYW1fZXJyb3I6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJpZCBhbSBlcnJvciIpOworCQlicmVhazsKKwljYXNlIGlkX2NyY19lcnJvcjoKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImlkIGNyYyBlcnJvciIpOworCQlicmVhazsKKwljYXNlIGRhdGFfYW1fZXJyb3I6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJkYXRhIGFtIGVycm9yIik7CisJCWJyZWFrOworCWNhc2UgZGF0YV9jcmNfZXJyb3I6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJkYXRhIGNyYyBlcnJvciIpOworCQlicmVhazsKKwljYXNlIG92ZXJydW5fZXJyb3I6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJvdmVycnVuIGVycm9yIik7CisJCWJyZWFrOworCWRlZmF1bHQ6OworCX0KKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgY2hhciAqZmRjX21vZGVfdHh0KGZkY19tb2RlX2VudW0gbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIGZkY19pZGxlOgorCQlyZXR1cm4gImZkY19pZGxlIjsKKwljYXNlIGZkY19yZWFkaW5nX2RhdGE6CisJCXJldHVybiAiZmRjX3JlYWRpbmdfZGF0YSI7CisJY2FzZSBmZGNfc2Vla2luZzoKKwkJcmV0dXJuICJmZGNfc2Vla2luZyI7CisJY2FzZSBmZGNfd3JpdGluZ19kYXRhOgorCQlyZXR1cm4gImZkY193cml0aW5nX2RhdGEiOworCWNhc2UgZmRjX3JlYWRpbmdfaWQ6CisJCXJldHVybiAiZmRjX3JlYWRpbmdfaWQiOworCWNhc2UgZmRjX3JlY2FsaWJyYXRpbmc6CisJCXJldHVybiAiZmRjX3JlY2FsaWJyYXRpbmciOworCWNhc2UgZmRjX2Zvcm1hdHRpbmc6CisJCXJldHVybiAiZmRjX2Zvcm1hdHRpbmciOworCWNhc2UgZmRjX3ZlcmlmeWluZzoKKwkJcmV0dXJuICJmZGNfdmVyaWZ5aW5nIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVua25vd24iOworCX0KK30KKworc3RhdGljIGlubGluZSBlcnJvcl9jYXVzZSBkZWNvZGVfaXJxX2NhdXNlKGZkY19tb2RlX2VudW0gbW9kZSwgX191OCBzdFtdKQoreworCWVycm9yX2NhdXNlIGNhdXNlID0gbm9fZXJyb3I7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qICBWYWxpZCBzdFtdLCBkZWNvZGUgY2F1c2Ugb2YgaW50ZXJydXB0LgorCSAqLworCXN3aXRjaCAoc3RbMF0gJiBTVDBfSU5UX01BU0spIHsKKwljYXNlIEZEQ19JTlRfTk9STUFMOgorCQlUUkFDRShmdF90X2ZkY19kbWEsIm5vcm1hbCBjb21wbGV0aW9uOiAlcyIsZmRjX21vZGVfdHh0KG1vZGUpKTsKKwkJYnJlYWs7CisJY2FzZSBGRENfSU5UX0FCTk9STUFMOgorCQlUUkFDRShmdF90X2Zsb3csICJhYm5vcm1hbCBjb21wbGV0aW9uICVzIiwgZmRjX21vZGVfdHh0KG1vZGUpKTsKKwkJVFJBQ0UoZnRfdF9mZGNfZG1hLCAiU1QwOiAweCUwMngsIFNUMTogMHglMDJ4LCBTVDI6IDB4JTAyeCIsCisJCSAgICAgIHN0WzBdLCBzdFsxXSwgc3RbMl0pOworCQlUUkFDRShmdF90X2ZkY19kbWEsCisJCSAgICAgICJDOiAweCUwMngsIEg6IDB4JTAyeCwgUjogMHglMDJ4LCBOOiAweCUwMngiLAorCQkgICAgICBzdFszXSwgc3RbNF0sIHN0WzVdLCBzdFs2XSk7CisJCWlmIChzdFsxXSAmIDB4MDEpIHsKKwkJCWlmIChzdFsyXSAmIDB4MDEpIHsKKwkJCQljYXVzZSA9IGRhdGFfYW1fZXJyb3I7CisJCQl9IGVsc2UgeworCQkJCWNhdXNlID0gaWRfYW1fZXJyb3I7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RbMV0gJiAweDIwKSB7CisJCQlpZiAoc3RbMl0gJiAweDIwKSB7CisJCQkJY2F1c2UgPSBkYXRhX2NyY19lcnJvcjsKKwkJCX0gZWxzZSB7CisJCQkJY2F1c2UgPSBpZF9jcmNfZXJyb3I7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RbMV0gJiAweDA0KSB7CisJCQljYXVzZSA9IG5vX2RhdGFfZXJyb3I7CisJCX0gZWxzZSBpZiAoc3RbMV0gJiAweDEwKSB7CisJCQljYXVzZSA9IG92ZXJydW5fZXJyb3I7CisJCX0KKwkJcHJpbnRfZXJyb3JfY2F1c2UoY2F1c2UpOworCQlicmVhazsKKwljYXNlIEZEQ19JTlRfSU5WQUxJRDoKKwkJVFJBQ0UoZnRfdF9mbG93LCAiaW52YWxpZCBjb21wbGV0aW9uICVzIiwgZmRjX21vZGVfdHh0KG1vZGUpKTsKKwkJYnJlYWs7CisJY2FzZSBGRENfSU5UX1JFQURZQ0g6CisJCWlmIChzdFswXSAmIFNUMF9TRUVLX0VORCkgeworCQkJVFJBQ0UoZnRfdF9mbG93LCAiZHJpdmUgcG9sbCBjb21wbGV0ZWQiKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgInJlYWR5IGNoYW5nZSAlcyIsZmRjX21vZGVfdHh0KG1vZGUpKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJVFJBQ0VfRVhJVCBjYXVzZTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2hpc3RvcnkoZXJyb3JfY2F1c2UgY2F1c2UpCit7CisJc3dpdGNoIChjYXVzZSkgeworCWNhc2UgaWRfYW1fZXJyb3I6CisJCWZ0X2hpc3RvcnkuaWRfYW1fZXJyb3JzKys7CisJCWJyZWFrOworCWNhc2UgaWRfY3JjX2Vycm9yOgorCQlmdF9oaXN0b3J5LmlkX2NyY19lcnJvcnMrKzsKKwkJYnJlYWs7CisJY2FzZSBkYXRhX2FtX2Vycm9yOgorCQlmdF9oaXN0b3J5LmRhdGFfYW1fZXJyb3JzKys7CisJCWJyZWFrOworCWNhc2UgZGF0YV9jcmNfZXJyb3I6CisJCWZ0X2hpc3RvcnkuZGF0YV9jcmNfZXJyb3JzKys7CisJCWJyZWFrOworCWNhc2Ugb3ZlcnJ1bl9lcnJvcjoKKwkJZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9ycysrOworCQlicmVhazsKKwljYXNlIG5vX2RhdGFfZXJyb3I6CisJCWZ0X2hpc3Rvcnkubm9fZGF0YV9lcnJvcnMrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDo7CisJfQorfQorCitzdGF0aWMgdm9pZCBza2lwX2JhZF9zZWN0b3IoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qICBNYXJrIHNlY3RvciBhcyBzb2Z0IGVycm9yIGFuZCBza2lwIGl0CisJICovCisJaWYgKGJ1ZmYtPnJlbWFpbmluZyA+IDApIHsKKwkJKytidWZmLT5zZWN0b3Jfb2Zmc2V0OworCQkrK2J1ZmYtPmRhdGFfb2Zmc2V0OworCQktLWJ1ZmYtPnJlbWFpbmluZzsKKwkJYnVmZi0+cHRyICs9IEZUX1NFQ1RPUl9TSVpFOworCQlidWZmLT5iYWRfc2VjdG9yX21hcCA+Pj0gMTsKKwl9IGVsc2UgeworCQkvKiAgSGV5LCB3aGF0IGlzIHRoaXM/Pz8/Pz8/Pz8/Pz8/IEMgY29kZTogaWYgd2Ugc2hpZnQgCisJCSAqICBtb3JlIHRoYW4gMzEgYml0cywgd2UgZ2V0IG5vIHNoaWZ0LiBUaGF0J3MgYmFkISEhISEhCisJCSAqLworCQkrK2J1ZmYtPnNlY3Rvcl9vZmZzZXQ7CS8qIGhhY2sgZm9yIGVycm9yIG1hcHMgKi8KKwkJVFJBQ0UoZnRfdF93YXJuLCAic2tpcHBpbmcgbGFzdCBzZWN0b3IgaW4gc2VnbWVudCIpOworCX0KKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfZXJyb3JfbWFwcyhidWZmZXJfc3RydWN0ICogYnVmZiwgdW5zaWduZWQgaW50IGVycm9yX29mZnNldCkKK3sKKwlpbnQgaGFyZCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmIChidWZmLT5yZXRyeSA8IEZUX1NPRlRfUkVUUklFUykgeworCQlidWZmLT5zb2Z0X2Vycm9yX21hcCB8PSAoMSA8PCBlcnJvcl9vZmZzZXQpOworCX0gZWxzZSB7CisJCWJ1ZmYtPmhhcmRfZXJyb3JfbWFwIHw9ICgxIDw8IGVycm9yX29mZnNldCk7CisJCWJ1ZmYtPnNvZnRfZXJyb3JfbWFwICY9IH5idWZmLT5oYXJkX2Vycm9yX21hcDsKKwkJYnVmZi0+cmV0cnkgPSAtMTsgIC8qIHdpbGwgYmUgc2V0IHRvIDAgaW4gc2V0dXBfc2VnbWVudCAqLworCQloYXJkID0gMTsKKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwgInNlY3RvciAlZCA6ICVzIGVycm9yXG4iCisJICAgICAgS0VSTl9JTkZPICJoYXJkIG1hcDogMHglMDhseFxuIgorCSAgICAgIEtFUk5fSU5GTyAic29mdCBtYXA6IDB4JTA4bHgiLAorCSAgICAgIEZUX1NFQ1RPUihlcnJvcl9vZmZzZXQpLCBoYXJkID8gImhhcmQiIDogInNvZnQiLAorCSAgICAgIChsb25nKSBidWZmLT5oYXJkX2Vycm9yX21hcCwgKGxvbmcpIGJ1ZmYtPnNvZnRfZXJyb3JfbWFwKTsKKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgdm9pZCBwcmludF9wcm9ncmVzcyhidWZmZXJfc3RydWN0ICpidWZmLCBlcnJvcl9jYXVzZSBjYXVzZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJc3dpdGNoIChjYXVzZSkgeworCWNhc2Ugbm9fZXJyb3I6IAorCQlUUkFDRShmdF90X2Zsb3csIiVkIFNlY3RvcihzKSB0cmFuc2ZlcnJlZCIsIGJ1ZmYtPnNlY3Rvcl9jb3VudCk7CisJCWJyZWFrOworCWNhc2Ugbm9fZGF0YV9lcnJvcjoKKwkJVFJBQ0UoZnRfdF9mbG93LCAiU2VjdG9yICVkIG5vdCBmb3VuZCIsCisJCSAgICAgIEZUX1NFQ1RPUihidWZmLT5zZWN0b3Jfb2Zmc2V0KSk7CisJCWJyZWFrOworCWNhc2Ugb3ZlcnJ1bl9lcnJvcjoKKwkJLyogIGdvdCBhbiBvdmVycnVuIGVycm9yIG9uIHRoZSBmaXJzdCBieXRlLCBtdXN0IGJlIGEKKwkJICogIGhhcmR3YXJlIHByb2JsZW0KKwkJICovCisJCVRSQUNFKGZ0X3RfYnVnLAorCQkgICAgICAiVW5leHBlY3RlZCBlcnJvcjogZmFpbGluZyBETUEgb3IgRkRDIGNvbnRyb2xsZXIgPyIpOworCQlicmVhazsKKwljYXNlIGRhdGFfY3JjX2Vycm9yOgorCQlUUkFDRShmdF90X2Zsb3csICJFcnJvciBpbiBzZWN0b3IgJWQiLAorCQkgICAgICBGVF9TRUNUT1IoYnVmZi0+c2VjdG9yX29mZnNldCAtIDEpKTsKKwkJYnJlYWs7CisJY2FzZSBpZF9jcmNfZXJyb3I6CisJY2FzZSBpZF9hbV9lcnJvcjoKKwljYXNlIGRhdGFfYW1fZXJyb3I6CisJCVRSQUNFKGZ0X3RfZmxvdywgIkVycm9yIGluIHNlY3RvciAlZCIsCisJCSAgICAgIEZUX1NFQ1RPUihidWZmLT5zZWN0b3Jfb2Zmc2V0KSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFKGZ0X3RfZmxvdywgIlVuZXhwZWN0ZWQgZXJyb3IgYXQgc2VjdG9yICVkIiwKKwkJICAgICAgRlRfU0VDVE9SKGJ1ZmYtPnNlY3Rvcl9vZmZzZXQpKTsKKwkJYnJlYWs7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qCisgKiAgRXJyb3IgY2F1c2U6ICAgQW1vdW50IHhmZXJyZWQ6ICBBY3Rpb246CisgKgorICogIGlkX2FtX2Vycm9yICAgICAgICAgMCAgICAgICAgICAgbWFyayBiYWQgYW5kIHNraXAKKyAqICBpZF9jcmNfZXJyb3IgICAgICAgIDAgICAgICAgICAgIG1hcmsgYmFkIGFuZCBza2lwCisgKiAgZGF0YV9hbV9lcnJvciAgICAgICAwICAgICAgICAgICBtYXJrIGJhZCBhbmQgc2tpcAorICogIGRhdGFfY3JjX2Vycm9yICAgICUgMTAyNCAgICAgICAgbWFyayBiYWQgYW5kIHNraXAKKyAqICBub19kYXRhX2Vycm9yICAgICAgIDAgICAgICAgICAgIHJldHJ5IG9uIHdyaXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrIGJhZCBhbmQgc2tpcCBvbiByZWFkCisgKiAgb3ZlcnJ1bl9lcnJvciAgWyAwLi5hbGwtMSBdICAgICBtYXJrIGJhZCBhbmQgc2tpcAorICogIG5vX2Vycm9yICAgICAgICAgICBhbGwgICAgICAgICAgY29udGludWUKKyAqLworCisvKiAgdGhlIGFyZyBgc2VjdG9yJyBpcyByZXR1cm5lZCBieSB0aGUgZmRjIGFuZCB0ZWxscyB1cyBhdCB3aGljaCBzZWN0b3Igd2UKKyAqICBhcmUgcG9zaXRpb25lZCBhdCAocmVsYXRpdmUgdG8gc3RhcnRpbmcgc2VjdG9yIG9mIHNlZ21lbnQpCisgKi8KK3N0YXRpYyB2b2lkIGRldGVybWluZV92ZXJpZnlfcHJvZ3Jlc3MoYnVmZmVyX3N0cnVjdCAqYnVmZiwKKwkJCQkgICAgICBlcnJvcl9jYXVzZSBjYXVzZSwKKwkJCQkgICAgICBfX3U4IHNlY3RvcikKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGNhdXNlID09IG5vX2Vycm9yICYmIHNlY3RvciA9PSAxKSB7CisJCWJ1ZmYtPnNlY3Rvcl9vZmZzZXQgPSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UOworCQlidWZmLT5yZW1haW5pbmcgICAgID0gMDsKKwkJaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfZmxvdykgeworCQkJcHJpbnRfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UpOworCQl9CisJfSBlbHNlIHsKKwkJYnVmZi0+c2VjdG9yX29mZnNldCA9IHNlY3RvciAtIGJ1ZmYtPnNlY3Q7CisJCWJ1ZmYtPnJlbWFpbmluZyA9IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSBidWZmLT5zZWN0b3Jfb2Zmc2V0OworCQlUUkFDRShmdF90X25vaXNlLCAiJXNzZWN0b3Igb2Zmc2V0OiAweCUwNHgiLCAKKwkJICAgICAgKGNhdXNlID09IG5vX2Vycm9yKSA/ICJ1bmV4cGVjdGVkICIgOiAiIiwKKwkJICAgICAgYnVmZi0+c2VjdG9yX29mZnNldCk7CisJCXN3aXRjaCAoY2F1c2UpIHsKKwkJY2FzZSBvdmVycnVuX2Vycm9yOgorCQkJYnJlYWs7CisjaWYgMAorCQljYXNlIG5vX2RhdGFfZXJyb3I6CisJCQlidWZmLT5yZXRyeSA9IEZUX1NPRlRfUkVUUklFUzsKKwkJCWlmIChidWZmLT5oYXJkX2Vycm9yX21hcCAgICAmJgorCQkJICAgIGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgPiAxICYmCisJCQkgICAgKGJ1ZmYtPmhhcmRfZXJyb3JfbWFwICYgCisJCQkgICAgICgxIDw8IChidWZmLT5zZWN0b3Jfb2Zmc2V0LTIpKSkpIHsKKwkJCQlidWZmLT5yZXRyeSAtLTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlidWZmLT5yZXRyeSA9IEZUX1NPRlRfUkVUUklFUzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChUUkFDRV9MRVZFTCA+PSBmdF90X2Zsb3cpIHsKKwkJCXByaW50X3Byb2dyZXNzKGJ1ZmYsIGNhdXNlKTsKKwkJfQorCQkvKiAgU2VjdG9yX29mZnNldCBwb2ludHMgdG8gdGhlIHByb2JsZW0gYXJlYSBOb3cgYWRqdXN0CisJCSAqICBzZWN0b3Jfb2Zmc2V0IHNvIGl0IGFsd2F5cyBwb2ludHMgb25lIHBhc3QgaGUgZmFpbGluZworCQkgKiAgc2VjdG9yLiBJLmUuIHNraXAgdGhlIGJhZCBzZWN0b3IuCisJCSAqLworCQkrK2J1ZmYtPnNlY3Rvcl9vZmZzZXQ7CisJCS0tYnVmZi0+cmVtYWluaW5nOworCQl1cGRhdGVfZXJyb3JfbWFwcyhidWZmLCBidWZmLT5zZWN0b3Jfb2Zmc2V0IC0gMSk7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIGRldGVybWluZV9wcm9ncmVzcyhidWZmZXJfc3RydWN0ICpidWZmLAorCQkJICAgICAgIGVycm9yX2NhdXNlIGNhdXNlLAorCQkJICAgICAgIF9fdTggc2VjdG9yKQoreworCXVuc2lnbmVkIGludCBkbWFfcmVzaWR1ZTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIFVzaW5nIGxlc3MgcHJlZmVycmVkIG9yZGVyIG9mIGRpc2FibGVfZG1hIGFuZAorCSAqICBnZXRfZG1hX3Jlc2lkdWUgYmVjYXVzZSB0aGlzIHNlZW1zIHRvIGZhaWwgb24gYXQgbGVhc3Qgb25lCisJICogIHN5c3RlbSBpZiByZXZlcnNlZCEKKwkgKi8KKwlkbWFfcmVzaWR1ZSA9IGdldF9kbWFfcmVzaWR1ZShmZGMuZG1hKTsKKwlkaXNhYmxlX2RtYShmZGMuZG1hKTsKKwlpZiAoY2F1c2UgIT0gbm9fZXJyb3IgfHwgZG1hX3Jlc2lkdWUgIT0gMCkgeworCQlUUkFDRShmdF90X25vaXNlLCAiJXNETUEgcmVzaWR1ZTogMHglMDR4IiwgCisJCSAgICAgIChjYXVzZSA9PSBub19lcnJvcikgPyAidW5leHBlY3RlZCAiIDogIiIsCisJCSAgICAgIGRtYV9yZXNpZHVlKTsKKwkJLyogYWRqdXN0IHRvIGFjdHVhbCB2YWx1ZTogKi8KKwkJaWYgKGRtYV9yZXNpZHVlID09IDApIHsKKwkJCS8qIHRoaXMgaGFwcGVucyBzb21ldGltZXMgd2l0aCBvdmVycnVuIGVycm9ycy4KKwkJCSAqIEkgZG9uJ3Qga25vdyB3aGV0aGVyIHdlIGNvdWxkIGlnbm9yZSB0aGUKKwkJCSAqIG92ZXJydW4gZXJyb3IuIFBsYXkgc2F2ZS4KKwkJCSAqLworCQkJYnVmZi0+c2VjdG9yX2NvdW50IC0tOworCQl9IGVsc2UgeworCQkJYnVmZi0+c2VjdG9yX2NvdW50IC09ICgoZG1hX3Jlc2lkdWUgKyAKKwkJCQkJCShGVF9TRUNUT1JfU0laRSAtIDEpKSAvCisJCQkJCSAgICAgICBGVF9TRUNUT1JfU0laRSk7CisJCX0KKwl9CisJLyogIFVwZGF0ZSB2YXIncyBpbmZsdWVuY2VkIGJ5IHRoZSBETUEgb3BlcmF0aW9uLgorCSAqLworCWlmIChidWZmLT5zZWN0b3JfY291bnQgPiAwKSB7CisJCWJ1ZmYtPnNlY3Rvcl9vZmZzZXQgICArPSBidWZmLT5zZWN0b3JfY291bnQ7CisJCWJ1ZmYtPmRhdGFfb2Zmc2V0ICAgICArPSBidWZmLT5zZWN0b3JfY291bnQ7CisJCWJ1ZmYtPnB0ciAgICAgICAgICAgICArPSAoYnVmZi0+c2VjdG9yX2NvdW50ICoKKwkJCQkJICBGVF9TRUNUT1JfU0laRSk7CisJCWJ1ZmYtPnJlbWFpbmluZyAgICAgICAtPSBidWZmLT5zZWN0b3JfY291bnQ7CisJCWJ1ZmYtPmJhZF9zZWN0b3JfbWFwID4+PSBidWZmLT5zZWN0b3JfY291bnQ7CisJfQorCWlmIChUUkFDRV9MRVZFTCA+PSBmdF90X2Zsb3cpIHsKKwkJcHJpbnRfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UpOworCX0KKwlpZiAoY2F1c2UgIT0gbm9fZXJyb3IpIHsKKwkJaWYgKGJ1ZmYtPnJlbWFpbmluZyA9PSAwKSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJmb28/XG4iCisJCQkgICAgICBLRVJOX0lORk8gImNvdW50IDogJWRcbiIKKwkJCSAgICAgIEtFUk5fSU5GTyAib2Zmc2V0OiAlZFxuIgorCQkJICAgICAgS0VSTl9JTkZPICJzb2Z0ICA6ICUwOHhcbiIKKwkJCSAgICAgIEtFUk5fSU5GTyAiaGFyZCAgOiAlMDh4IiwKKwkJCSAgICAgIGJ1ZmYtPnNlY3Rvcl9jb3VudCwKKwkJCSAgICAgIGJ1ZmYtPnNlY3Rvcl9vZmZzZXQsCisJCQkgICAgICBidWZmLT5zb2Z0X2Vycm9yX21hcCwKKwkJCSAgICAgIGJ1ZmYtPmhhcmRfZXJyb3JfbWFwKTsKKwkJfQorCQkvKiAgU2VjdG9yX29mZnNldCBwb2ludHMgdG8gdGhlIHByb2JsZW0gYXJlYSwgZXhjZXB0IGlmIHdlIGdvdAorCQkgKiAgYSBkYXRhX2NyY19lcnJvci4gSW4gdGhhdCBjYXNlIGl0IHBvaW50cyBvbmUgcGFzdCB0aGUKKwkJICogIGZhaWxpbmcgc2VjdG9yLgorCQkgKgorCQkgKiAgTm93IGFkanVzdCBzZWN0b3Jfb2Zmc2V0IHNvIGl0IGFsd2F5cyBwb2ludHMgb25lIHBhc3QgaGUKKwkJICogIGZhaWxpbmcgc2VjdG9yLiBJLmUuIHNraXAgdGhlIGJhZCBzZWN0b3IuICAKKwkJICovCisJCWlmIChjYXVzZSAhPSBkYXRhX2NyY19lcnJvcikgeworCQkJc2tpcF9iYWRfc2VjdG9yKGJ1ZmYpOworCQl9CisJCXVwZGF0ZV9lcnJvcl9tYXBzKGJ1ZmYsIGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgLSAxKTsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworc3RhdGljIGludCBjYWxjX3N0ZXBzKGludCBjbWQpCit7CisJaWYgKGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPiBjbWQpIHsKKwkJcmV0dXJuIGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgLSBjbWQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgKyBjbWQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBwYXVzZV90YXBlKGludCByZXRyeSwgaW50IG1vZGUpCit7CisJaW50IHJlc3VsdDsKKwlfX3U4IG91dFszXSA9IHtGRENfU0VFSywgZnRfZHJpdmVfc2VsLCAwfTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIFdlJ2xsIHVzZSBhIHJhdyBzZWVrIGNvbW1hbmQgdG8gZ2V0IHRoZSB0YXBlIHRvIHJld2luZCBhbmQKKwkgKiAgc3RvcCBmb3IgYSByZXRyeS4KKwkgKi8KKwkrK2Z0X2hpc3RvcnkucmV3aW5kczsKKwlpZiAocWljMTE3X2NtZHNbZnRhcGVfY3VycmVudF9jb21tYW5kXS5ub25faW50cikgeworCQlUUkFDRShmdF90X3dhcm4sICJtb3Rpb24gY29tbWFuZCBtYXkgYmUgaXNzdWVkIHRvbyBzb29uIik7CisJfQorCWlmIChyZXRyeSAmJiAobW9kZSA9PSBmZGNfcmVhZGluZ19kYXRhIHx8CisJCSAgICAgIG1vZGUgPT0gZmRjX3JlYWRpbmdfaWQgICB8fAorCQkgICAgICBtb2RlID09IGZkY192ZXJpZnlpbmcpKSB7CisJCWZ0YXBlX2N1cnJlbnRfY29tbWFuZCA9IFFJQ19NSUNST19TVEVQX1BBVVNFOworCQlmdGFwZV9taWdodF9iZV9vZmZfdHJhY2sgPSAxOworCX0gZWxzZSB7CisJCWZ0YXBlX2N1cnJlbnRfY29tbWFuZCA9IFFJQ19QQVVTRTsKKwl9CisJb3V0WzJdID0gY2FsY19zdGVwcyhmdGFwZV9jdXJyZW50X2NvbW1hbmQpOworCXJlc3VsdCA9IGZkY19jb21tYW5kKG91dCwgMyk7IC8qIGlzc3VlIFFJQ18xMTcgY29tbWFuZCAqLworCWZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPSBvdXRbIDJdOworCWlmIChyZXN1bHQgPCAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJxaWMtcGF1c2UgZmFpbGVkLCBzdGF0dXMgPSAlZCIsIHJlc3VsdCk7CisJfSBlbHNlIHsKKwkJZnRfbG9jYXRpb24ua25vd24gID0gMDsKKwkJZnRfcnVubmVyX3N0YXR1cyAgID0gaWRsZTsKKwkJZnRfaGlkZV9pbnRlcnJ1cHQgICAgID0gMTsKKwkJZnRhcGVfdGFwZV9ydW5uaW5nID0gMDsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworc3RhdGljIHZvaWQgY29udGludWVfeGZlcihidWZmZXJfc3RydWN0ICpidWZmLAorCQkJICBmZGNfbW9kZV9lbnVtIG1vZGUsIAorCQkJICB1bnNpZ25lZCBpbnQgc2tpcCkKK3sKKwlpbnQgd3JpdGUgPSAwOworIAlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKG1vZGUgPT0gZmRjX3dyaXRpbmdfZGF0YSB8fCBtb2RlID09IGZkY19kZWxldGluZykgeworCQl3cml0ZSA9IDE7CisJfQorCS8qICBUaGlzIHBhcnQgY2FuIGJlIHJlbW92ZWQgaWYgaXQgbmV2ZXIgaGFwcGVucworCSAqLworCWlmIChza2lwID4gMCAmJgorCSAgICAoZnRfcnVubmVyX3N0YXR1cyAhPSBydW5uaW5nIHx8CisJICAgICAod3JpdGUgJiYgKGJ1ZmYtPnN0YXR1cyAhPSB3cml0aW5nKSkgfHwKKwkgICAgICghd3JpdGUgJiYgKGJ1ZmYtPnN0YXR1cyAhPSByZWFkaW5nICYmIAorCQkJIGJ1ZmYtPnN0YXR1cyAhPSB2ZXJpZnlpbmcpKSkpIHsKKwkJVFJBQ0UoZnRfdF9lcnIsICJ1bmV4cGVjdGVkIHJ1bm5lci9idWZmZXIgc3RhdGUgJWQvJWQiLAorCQkgICAgICBmdF9ydW5uZXJfc3RhdHVzLCBidWZmLT5zdGF0dXMpOworCQlidWZmLT5zdGF0dXMgPSBlcnJvcjsKKwkJLyogZmluaXNoIHRoaXMgYnVmZmVyOiAqLworCQkodm9pZClmdGFwZV9uZXh0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKKwkJZnRfcnVubmVyX3N0YXR1cyA9IGFib3J0aW5nOworCQlmZGNfbW9kZSAgICAgICAgID0gZmRjX2lkbGU7CisJfSBlbHNlIGlmIChidWZmLT5yZW1haW5pbmcgPiAwICYmIGZ0YXBlX2NhbGNfbmV4dF9jbHVzdGVyKGJ1ZmYpID4gMCkgeworCQkvKiAgc3RpbGwgc2VjdG9ycyBsZWZ0IGluIGN1cnJlbnQgc2VnbWVudCwgY29udGludWUKKwkJICogIHdpdGggdGhpcyBzZWdtZW50CisJCSAqLworCQlpZiAoZmRjX3NldHVwX3JlYWRfd3JpdGUoYnVmZiwgbW9kZSkgPCAwKSB7CisJCQkvKiBmYWlsZWQsIGFib3J0IG9wZXJhdGlvbgorCQkJICovCisJCQlidWZmLT5ieXRlcyA9IGJ1ZmYtPnB0ciAtIGJ1ZmYtPmFkZHJlc3M7CisJCQlidWZmLT5zdGF0dXMgPSBlcnJvcjsKKwkJCS8qIGZpbmlzaCB0aGlzIGJ1ZmZlcjogKi8KKwkJCSh2b2lkKWZ0YXBlX25leHRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGFib3J0aW5nOworCQkJZmRjX21vZGUgICAgICAgICA9IGZkY19pZGxlOworCQl9CisJfSBlbHNlIHsKKwkJLyogY3VycmVudCBzZWdtZW50IGNvbXBsZXRlZAorCQkgKi8KKwkJdW5zaWduZWQgaW50IGxhc3Rfc2VnbWVudCA9IGJ1ZmYtPnNlZ21lbnRfaWQ7CisJCWludCBlb3QgPSAoKGxhc3Rfc2VnbWVudCArIDEpICUgZnRfc2VnbWVudHNfcGVyX3RyYWNrKSA9PSAwOworCQl1bnNpZ25lZCBpbnQgbmV4dCA9IGJ1ZmYtPm5leHRfc2VnbWVudDsJLyogMCBtZWFucyBzdG9wICEgKi8KKworCQlidWZmLT5ieXRlcyA9IGJ1ZmYtPnB0ciAtIGJ1ZmYtPmFkZHJlc3M7CisJCWJ1ZmYtPnN0YXR1cyA9IGRvbmU7CisJCWJ1ZmYgPSBmdGFwZV9uZXh0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKKwkJaWYgKGVvdCkgeworCQkJLyogIGZpbmlzaGVkIGxhc3Qgc2VnbWVudCBvbiBjdXJyZW50IHRyYWNrLAorCQkJICogIGNhbid0IGNvbnRpbnVlCisJCQkgKi8KKwkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBsb2dpY2FsX2VvdDsKKwkJCWZkY19tb2RlICAgICAgICAgPSBmZGNfaWRsZTsKKwkJCVRSQUNFX0VYSVQ7CisJCX0KKwkJaWYgKG5leHQgPD0gMCkgeworCQkJLyogIGRvbid0IGNvbnRpbnVlIHdpdGggbmV4dCBzZWdtZW50CisJCQkgKi8KKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJubyAlcyBhbGxvd2VkLCBzdG9wcGluZyB0YXBlIiwKKwkJCSAgICAgICh3cml0ZSkgPyAid3JpdGUgbmV4dCIgOiAicmVhZCBhaGVhZCIpOworCQkJcGF1c2VfdGFwZSgwLCBtb2RlKTsKKwkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBpZGxlOyAgLyogIG5vdCBxdWl0ZSB0cnVlIHVudGlsCisJCQkJCQkgICAqICBuZXh0IGlycSAKKwkJCQkJCSAgICovCisJCQlUUkFDRV9FWElUOworCQl9CisJCS8qICBjb250aW51ZSB3aXRoIG5leHQgc2VnbWVudAorCQkgKi8KKwkJaWYgKGJ1ZmYtPnN0YXR1cyAhPSB3YWl0aW5nKSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAiYWxsIGlucHV0IGJ1ZmZlcnMgJXMsIHBhdXNpbmcgdGFwZSIsCisJCQkgICAgICAod3JpdGUpID8gImVtcHR5IiA6ICJmdWxsIik7CisJCQlwYXVzZV90YXBlKDAsIG1vZGUpOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGlkbGU7ICAvKiAgbm90IHF1aXRlIHRydWUgdW50aWwKKwkJCQkJCSAgICogIG5leHQgaXJxIAorCQkJCQkJICAgKi8KKwkJCVRSQUNFX0VYSVQ7CisJCX0KKwkJaWYgKHdyaXRlICYmIG5leHQgIT0gYnVmZi0+c2VnbWVudF9pZCkgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgCisJCQkgICAgICAic2VnbWVudHMgb3V0IG9mIG9yZGVyLCBhYm9ydGluZyB3cml0ZSIpOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGRvX2Fib3J0OworCQkJZmRjX21vZGUgICAgICAgICA9IGZkY19pZGxlOworCQkJVFJBQ0VfRVhJVDsKKwkJfQorCQlmdGFwZV9zZXR1cF9uZXdfc2VnbWVudChidWZmLCBuZXh0LCAwKTsKKwkJaWYgKHN0b3BfcmVhZF9haGVhZCkgeworCQkJYnVmZi0+bmV4dF9zZWdtZW50ID0gMDsKKwkJCXN0b3BfcmVhZF9haGVhZCA9IDA7CisJCX0KKwkJaWYgKGZ0YXBlX2NhbGNfbmV4dF9jbHVzdGVyKGJ1ZmYpID09IDAgfHwKKwkJICAgIGZkY19zZXR1cF9yZWFkX3dyaXRlKGJ1ZmYsIG1vZGUpICE9IDApIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiY291bGRuJ3Qgc3RhcnQgJXMtYWhlYWQiLAorCQkJICAgICAgd3JpdGUgPyAid3JpdGUiIDogInJlYWQiKTsKKwkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBkb19hYm9ydDsKKwkJCWZkY19tb2RlICAgICAgICAgPSBmZGNfaWRsZTsKKwkJfSBlbHNlIHsKKwkJCS8qIGtlZXAgb24gZ29pbmcgKi8KKwkJCXN3aXRjaCAoZnRfZHJpdmVyX3N0YXRlKSB7CisJCQljYXNlICAgcmVhZGluZzogYnVmZi0+c3RhdHVzID0gcmVhZGluZzsgICBicmVhazsKKwkJCWNhc2UgdmVyaWZ5aW5nOiBidWZmLT5zdGF0dXMgPSB2ZXJpZnlpbmc7IGJyZWFrOworCQkJY2FzZSAgIHdyaXRpbmc6IGJ1ZmYtPnN0YXR1cyA9IHdyaXRpbmc7ICAgYnJlYWs7CisJCQljYXNlICBkZWxldGluZzogYnVmZi0+c3RhdHVzID0gZGVsZXRpbmc7ICBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJVFJBQ0UoZnRfdF9lcnIsIAorCQkgICAgICAiQlVHOiBmdF9kcml2ZXJfc3RhdGUgJWQgc2hvdWxkIGJlIG9uZSBvdXQgb2YgIgorCQkgICAgICAie3JlYWRpbmcsIHdyaXRpbmcsIHZlcmlmeWluZywgZGVsZXRpbmd9IiwKKwkJCQkgICAgICBmdF9kcml2ZXJfc3RhdGUpOworCQkJCWJ1ZmYtPnN0YXR1cyA9IHdyaXRlID8gd3JpdGluZyA6IHJlYWRpbmc7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJVFJBQ0VfRVhJVDsKK30KKworc3RhdGljIHZvaWQgcmV0cnlfc2VjdG9yKGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmYsIAorCQkJIGludCBtb2RlLAorCQkJIHVuc2lnbmVkIGludCBza2lwKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRShmdF90X25vaXNlLCAiJXMgZXJyb3IsIHdpbGwgcmV0cnkiLAorCSAgICAgIChtb2RlID09IGZkY193cml0aW5nX2RhdGEgfHwgbW9kZSA9PSBmZGNfZGVsZXRpbmcpID8gIndyaXRlIiA6ICJyZWFkIik7CisJcGF1c2VfdGFwZSgxLCBtb2RlKTsKKwlmdF9ydW5uZXJfc3RhdHVzID0gYWJvcnRpbmc7CisJYnVmZi0+c3RhdHVzICAgICA9IGVycm9yOworCWJ1ZmYtPnNraXAgICAgICAgPSBza2lwOworCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmluZF9yZXN1bWVfcG9pbnQoYnVmZmVyX3N0cnVjdCAqYnVmZikKK3sKKwlpbnQgaSA9IDA7CisJU2VjdG9yTWFwIG1hc2s7CisJU2VjdG9yTWFwIG1hcDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIFRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgY2FsbGVkIGFmdGVyIGFsbCB2YXJpYWJsZXMgaGF2ZSBiZWVuCisJICogIHVwZGF0ZWQgdG8gcG9pbnQgcGFzdCB0aGUgZmFpbGluZyBzZWN0b3IuCisJICogIElmIHRoZXJlIGFyZSBhbnkgc29mdCBlcnJvcnMgYmVmb3JlIHRoZSBmYWlsaW5nIHNlY3RvciwKKwkgKiAgZmluZCB0aGUgZmlyc3Qgc29mdCBlcnJvciBhbmQgcmV0dXJuIHRoZSBzZWN0b3Igb2Zmc2V0LgorCSAqICBPdGhlcndpc2UgZmluZCB0aGUgbGFzdCBoYXJkIGVycm9yLgorCSAqICBOb3RlOiB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIGF0IGxlYXN0IG9uZSBoYXJkIG9yIHNvZnQgZXJyb3IgIQorCSAqLworCWlmIChidWZmLT5zZWN0b3Jfb2Zmc2V0IDwgMSB8fCBidWZmLT5zZWN0b3Jfb2Zmc2V0ID4gMzIpIHsKKwkJVFJBQ0UoZnRfdF9idWcsICJCVUc6IHNlY3Rvcl9vZmZzZXQgPSAlZCIsCisJCSAgICAgIGJ1ZmYtPnNlY3Rvcl9vZmZzZXQpOworCQlUUkFDRV9FWElUIDA7CisJfQorCWlmIChidWZmLT5zZWN0b3Jfb2Zmc2V0ID49IDMyKSB7IC8qIEMtbGltaXRhdGlvbiBvbiBzaGlmdCAhICovCisJCW1hc2sgPSAweGZmZmZmZmZmOworCX0gZWxzZSB7CisJCW1hc2sgPSAoMSA8PCBidWZmLT5zZWN0b3Jfb2Zmc2V0KSAtIDE7CisJfQorCW1hcCA9IGJ1ZmYtPnNvZnRfZXJyb3JfbWFwICYgbWFzazsKKwlpZiAobWFwKSB7CisJCXdoaWxlICgobWFwICYgKDEgPDwgaSkpID09IDApIHsKKwkJCSsraTsKKwkJfQorCQlUUkFDRShmdF90X25vaXNlLCAiYXQgc2VjdG9yICVkIiwgRlRfU0VDVE9SKGkpKTsKKwl9IGVsc2UgeworCQltYXAgPSBidWZmLT5oYXJkX2Vycm9yX21hcCAmIG1hc2s7CisJCWkgPSBidWZmLT5zZWN0b3Jfb2Zmc2V0IC0gMTsKKwkJaWYgKG1hcCkgeworCQkJd2hpbGUgKChtYXAgJiAoMSA8PCBpKSkgPT0gMCkgeworCQkJCS0taTsKKwkJCX0KKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJhZnRlciBzZWN0b3IgJWQiLCBGVF9TRUNUT1IoaSkpOworCQkJKytpOyAvKiBmaXJzdCBzZWN0b3IgYWZ0ZXIgbGFzdCBoYXJkIGVycm9yICovCisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X2J1ZywgIkJVRzogbm8gc29mdCBvciBoYXJkIGVycm9ycyIpOworCQl9CisJfQorCVRSQUNFX0VYSVQgaTsKK30KKworLyogIGNoZWNrIHBvc3NpYmxlIGRtYSByZXNpZHVlIHdoZW4gZm9ybWF0dGluZywgdXBkYXRlIHBvc2l0aW9uIHJlY29yZCBpbgorICogIGJ1ZmZlciBzdHJ1Y3QuIFRoaXMgaXMsIG9mIGNvdXJzZSwgbW9kZWxsZWQgYWZ0ZXIgZGV0ZXJtaW5lX3Byb2dyZXNzKCksIGJ1dAorICogIHdlIGRvbid0IG5lZWQgdG8gc2V0IHVwIGZvciByZXRyaWVzIGJlY2F1c2UgdGhlIGZvcm1hdCBwcm9jZXNzIGNhbm5vdCBiZQorICogIGludGVycnVwdGVkIChleGNlcHQgYXQgdGhlIGVuZCBvZiB0aGUgdGFwZSB0cmFjaykuCisgKi8KK3N0YXRpYyBpbnQgZGV0ZXJtaW5lX2ZtdF9wcm9ncmVzcyhidWZmZXJfc3RydWN0ICpidWZmLCBlcnJvcl9jYXVzZSBjYXVzZSkKK3sKKwl1bnNpZ25lZCBpbnQgZG1hX3Jlc2lkdWU7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qICBVc2luZyBsZXNzIHByZWZlcnJlZCBvcmRlciBvZiBkaXNhYmxlX2RtYSBhbmQKKwkgKiAgZ2V0X2RtYV9yZXNpZHVlIGJlY2F1c2UgdGhpcyBzZWVtcyB0byBmYWlsIG9uIGF0IGxlYXN0IG9uZQorCSAqICBzeXN0ZW0gaWYgcmV2ZXJzZWQhCisJICovCisJZG1hX3Jlc2lkdWUgPSBnZXRfZG1hX3Jlc2lkdWUoZmRjLmRtYSk7CisJZGlzYWJsZV9kbWEoZmRjLmRtYSk7CisJaWYgKGNhdXNlICE9IG5vX2Vycm9yIHx8IGRtYV9yZXNpZHVlICE9IDApIHsKKwkJVFJBQ0UoZnRfdF9pbmZvLCAiRE1BIHJlc2lkdWUgPSAweCUwNHgiLCBkbWFfcmVzaWR1ZSk7CisJCWZkY19tb2RlID0gZmRjX2lkbGU7CisJCXN3aXRjaChjYXVzZSkgeworCQljYXNlIG5vX2Vycm9yOgorCQkJZnRfcnVubmVyX3N0YXR1cyA9IGFib3J0aW5nOworCQkJYnVmZi0+c3RhdHVzID0gaWRsZTsKKwkJCWJyZWFrOworCQljYXNlIG92ZXJydW5fZXJyb3I6CisJCQkvKiAgZ290IGFuIG92ZXJydW4gZXJyb3Igb24gdGhlIGZpcnN0IGJ5dGUsIG11c3QgYmUgYQorCQkJICogIGhhcmR3YXJlIHByb2JsZW0gCisJCQkgKi8KKwkJCVRSQUNFKGZ0X3RfYnVnLCAKKwkJCSAgICAgICJVbmV4cGVjdGVkIGVycm9yOiBmYWlsaW5nIERNQSBjb250cm9sbGVyID8iKTsKKwkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBkb19hYm9ydDsKKwkJCWJ1ZmYtPnN0YXR1cyA9IGVycm9yOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlUUkFDRShmdF90X25vaXNlLCAiVW5leHBlY3RlZCBlcnJvciBhdCBzZWdtZW50ICVkIiwKKwkJCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQpOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGRvX2Fib3J0OworCQkJYnVmZi0+c3RhdHVzID0gZXJyb3I7CisJCQlicmVhazsKKwkJfQorCQlUUkFDRV9FWElUIC1FSU87IC8qIGNhbiBvbmx5IHJldHJ5IGVudGlyZSB0cmFjayBpbiBmb3JtYXQgbW9kZQorCQkJCSAgKi8KKwl9CisJLyogIFVwZGF0ZSB2YXIncyBpbmZsdWVuY2VkIGJ5IHRoZSBETUEgb3BlcmF0aW9uLgorCSAqLworCWJ1ZmYtPnB0ciAgICAgICAgICAgICArPSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UICogNDsKKwlidWZmLT5ieXRlcyAgICAgICAgICAgLT0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAqIDQ7CisJYnVmZi0+cmVtYWluaW5nICAgICAgIC09IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQ7CisJYnVmZi0+c2VnbWVudF9pZCArKzsgLyogZG9uZSB3aXRoIHNlZ21lbnQgKi8KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qCisgKiAgQ29udGludWUgZm9ybWF0dGluZywgc3dpdGNoIGJ1ZmZlcnMgaWYgdGhlcmUgaXMgbm8gZGF0YSBsZWZ0IGluCisgKiAgY3VycmVudCBidWZmZXIuIFRoaXMgaXMsIG9mIGNvdXJzZSwgbW9kZWxsZWQgYWZ0ZXIKKyAqICBjb250aW51ZV94ZmVyKCksIGJ1dCB3ZSBkb24ndCBuZWVkIHRvIHNldCB1cCBmb3IgcmV0cmllcyBiZWNhdXNlCisgKiAgdGhlIGZvcm1hdCBwcm9jZXNzIGNhbm5vdCBiZSBpbnRlcnJ1cHRlZCAoZXhjZXB0IGF0IHRoZSBlbmQgb2YgdGhlCisgKiAgdGFwZSB0cmFjaykuCisgKi8KK3N0YXRpYyB2b2lkIGNvbnRpbnVlX2Zvcm1hdHRpbmcoYnVmZmVyX3N0cnVjdCAqYnVmZikKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGJ1ZmYtPnJlbWFpbmluZyA8PSAwKSB7IC8qICBubyBzcGFjZSBsZWZ0IGluIGRtYSBidWZmZXIgKi8KKwkJdW5zaWduZWQgaW50IG5leHQgPSBidWZmLT5uZXh0X3NlZ21lbnQ7IAorCisJCWlmIChuZXh0ID09IDApIHsgLyogZW5kIG9mIHRhcGUgdHJhY2sgKi8KKwkJCWJ1ZmYtPnN0YXR1cyAgICAgPSBkb25lOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGxvZ2ljYWxfZW90OworCQkJZmRjX21vZGUgICAgICAgICA9IGZkY19pZGxlOworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIkRvbmUgZm9ybWF0dGluZyB0cmFjayAlZCIsCisJCQkgICAgICBmdF9sb2NhdGlvbi50cmFjayk7CisJCQlUUkFDRV9FWElUOworCQl9CisJCS8qCisJCSAqICBzd2l0Y2ggdG8gbmV4dCBidWZmZXIhCisJCSAqLworCQlidWZmLT5zdGF0dXMgICA9IGRvbmU7CisJCWJ1ZmYgPSBmdGFwZV9uZXh0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKKworCQlpZiAoYnVmZi0+c3RhdHVzICE9IHdhaXRpbmcgIHx8IG5leHQgIT0gYnVmZi0+c2VnbWVudF9pZCkgeworCQkJZ290byBmb3JtYXRfc2V0dXBfZXJyb3I7CisJCX0KKwl9CisJaWYgKGZkY19zZXR1cF9mb3JtYXR0aW5nKGJ1ZmYpIDwgMCkgeworCQlnb3RvIGZvcm1hdF9zZXR1cF9lcnJvcjsKKwl9CisJYnVmZi0+c3RhdHVzID0gZm9ybWF0dGluZzsKKwlUUkFDRShmdF90X2ZkY19kbWEsICJGb3JtYXR0aW5nIHNlZ21lbnQgJWQgb24gdHJhY2sgJWQiLAorCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQsIGZ0X2xvY2F0aW9uLnRyYWNrKTsKKwlUUkFDRV9FWElUOworIGZvcm1hdF9zZXR1cF9lcnJvcjoKKwlmdF9ydW5uZXJfc3RhdHVzID0gZG9fYWJvcnQ7CisJZmRjX21vZGUgICAgICAgICA9IGZkY19pZGxlOworCWJ1ZmYtPnN0YXR1cyAgICAgPSBlcnJvcjsKKwlUUkFDRShmdF90X2VyciwgIkVycm9yIHNldHRpbmcgdXAgZm9yIHNlZ21lbnQgJWQgb24gdHJhY2sgJWQiLAorCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQsIGZ0X2xvY2F0aW9uLnRyYWNrKTsKKwlUUkFDRV9FWElUOworCit9CisKKy8qICB0aGlzIGhhbmRsZXMgd3JpdGluZywgcmVhZCBpZCwgcmVhZGluZyBhbmQgZm9ybWF0dGluZworICovCitzdGF0aWMgdm9pZCBoYW5kbGVfZmRjX2J1c3koYnVmZmVyX3N0cnVjdCAqYnVmZikKK3sKKwlzdGF0aWMgaW50IG5vX2RhdGFfZXJyb3JfY291bnQ7CisJaW50IHJldHJ5ID0gMDsKKwllcnJvcl9jYXVzZSBjYXVzZTsKKwlfX3U4IGluWzddOworCWludCBza2lwOworCWZkY19tb2RlX2VudW0gZm1vZGUgPSBmZGNfbW9kZTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGZkY19yZXN1bHQoaW4sIDcpIDwgMCkgeyAvKiBiZXR0ZXIgZ2V0IGl0IGZhc3QgISAqLworCQlUUkFDRShmdF90X2VyciwgCisJCSAgICAgICJQcm9iYWJseSBmYXRhbCBlcnJvciBkdXJpbmcgRkRDIFJlc3VsdCBQaGFzZVxuIgorCQkgICAgICBLRVJOX0lORk8KKwkJICAgICAgImRyaXZlIG1heSBoYW5nIHVudGlsIChwb3dlciBvbikgcmVzZXQgOi0oIik7CisJCS8qICB3aGF0IHRvIGRvIG5leHQgPz8/PworCQkgKi8KKwkJVFJBQ0VfRVhJVDsKKwl9CisJY2F1c2UgPSBkZWNvZGVfaXJxX2NhdXNlKGZkY19tb2RlLCBpbik7CisjaWZkZWYgVEVTVElORworCXsgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IChpbnQpZnRfbnJfYnVmZmVyczsgKytpKQorCQlUUkFDRShmdF90X2FueSwgImJ1ZmZlclslZF0gc3RhdHVzOiAlZCwgc2VnbWVudF9pZDogJWQiLAorCQkgICAgICBpLCBmdF9idWZmZXJbaV0tPnN0YXR1cywgZnRfYnVmZmVyW2ldLT5zZWdtZW50X2lkKTsKKwl9CisjZW5kaWYKKwlpZiAoZm1vZGUgPT0gZmRjX3JlYWRpbmdfZGF0YSAmJiBmdF9kcml2ZXJfc3RhdGUgPT0gdmVyaWZ5aW5nKSB7CisJCWZtb2RlID0gZmRjX3ZlcmlmeWluZzsKKwl9CisJc3dpdGNoIChmbW9kZSkgeworCWNhc2UgZmRjX3ZlcmlmeWluZzoKKwkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gYWJvcnRpbmcgfHwKKwkJICAgIGZ0X3J1bm5lcl9zdGF0dXMgPT0gZG9fYWJvcnQpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsImFib3J0aW5nICVzIixmZGNfbW9kZV90eHQoZmRjX21vZGUpKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChidWZmLT5yZXRyeSA+IDApIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgInRoaXMgaXMgcmV0cnkgbnIgJWQiLCBidWZmLT5yZXRyeSk7CisJCX0KKwkJc3dpdGNoIChjYXVzZSkgeworCQljYXNlIG5vX2Vycm9yOgorCQkJbm9fZGF0YV9lcnJvcl9jb3VudCA9IDA7CisJCQlkZXRlcm1pbmVfdmVyaWZ5X3Byb2dyZXNzKGJ1ZmYsIGNhdXNlLCBpbls1XSk7CisJCQlpZiAoaW5bMl0gJiAweDQwKSB7CisJCQkJLyogIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gd2hlbiB2ZXJpZnlpbmcKKwkJCQkgKi8KKwkJCQlUUkFDRShmdF90X3dhcm4sCisJCQkJICAgICAgImRlbGV0ZWQgZGF0YSBpbiBzZWdtZW50ICVkLyVkIiwKKwkJCQkgICAgICBidWZmLT5zZWdtZW50X2lkLAorCQkJCSAgICAgIEZUX1NFQ1RPUihidWZmLT5zZWN0b3Jfb2Zmc2V0IC0gMSkpOworCQkJCWJ1ZmYtPnJlbWFpbmluZyA9IDA7IC8qIGFib3J0IHRyYW5zZmVyICovCisJCQkJYnVmZi0+aGFyZF9lcnJvcl9tYXAgPSBFTVBUWV9TRUdNRU5UOworCQkJCXNraXAgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlza2lwID0gMDsKKwkJCX0KKwkJCWNvbnRpbnVlX3hmZXIoYnVmZiwgZmRjX21vZGUsIHNraXApOworCQkJYnJlYWs7CisJCWNhc2Ugbm9fZGF0YV9lcnJvcjoKKwkJCW5vX2RhdGFfZXJyb3JfY291bnQgKys7CisJCWNhc2Ugb3ZlcnJ1bl9lcnJvcjoKKwkJCXJldHJ5ICsrOworCQljYXNlIGlkX2FtX2Vycm9yOgorCQljYXNlIGlkX2NyY19lcnJvcjoKKwkJY2FzZSBkYXRhX2FtX2Vycm9yOgorCQljYXNlIGRhdGFfY3JjX2Vycm9yOgorCQkJZGV0ZXJtaW5lX3ZlcmlmeV9wcm9ncmVzcyhidWZmLCBjYXVzZSwgaW5bNV0pOyAKKwkJCWlmIChjYXVzZSA9PSBub19kYXRhX2Vycm9yKSB7CisJCQkJaWYgKG5vX2RhdGFfZXJyb3JfY291bnQgPj0gMikgeworCQkJCQlUUkFDRShmdF90X3dhcm4sCisJCQkJCSAgICAgICJyZXRyeWluZyBiZWNhdXNlIG9mIHN1Y2Nlc3NpdmUgIgorCQkJCQkgICAgICAibm8gZGF0YSBlcnJvcnMiKTsKKwkJCQkJbm9fZGF0YV9lcnJvcl9jb3VudCA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0cnkgLS07CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlub19kYXRhX2Vycm9yX2NvdW50ID0gMDsKKwkJCX0KKwkJCWlmIChyZXRyeSkgeworCQkJCXNraXAgPSBmaW5kX3Jlc3VtZV9wb2ludChidWZmKTsKKwkJCX0gZWxzZSB7CisJCQkJc2tpcCA9IGJ1ZmYtPnNlY3Rvcl9vZmZzZXQ7CisJCQl9CisJCQlpZiAocmV0cnkgJiYgc2tpcCA8IDMyKSB7CisJCQkJcmV0cnlfc2VjdG9yKGJ1ZmYsIGZkY19tb2RlLCBza2lwKTsKKwkJCX0gZWxzZSB7CisJCQkJY29udGludWVfeGZlcihidWZmLCBmZGNfbW9kZSwgc2tpcCk7CisJCQl9CisJCQl1cGRhdGVfaGlzdG9yeShjYXVzZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qICBEb24ndCBrbm93IHdoeSB0aGlzIGNvdWxkIGhhcHBlbiAKKwkJCSAqICBidXQgZmluZCBvdXQuCisJCQkgKi8KKwkJCWRldGVybWluZV92ZXJpZnlfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UsIGluWzVdKTsKKwkJCXJldHJ5X3NlY3RvcihidWZmLCBmZGNfbW9kZSwgMCk7CisJCQlUUkFDRShmdF90X2VyciwgIkVycm9yOiB1bmV4cGVjdGVkIGVycm9yIik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIGZkY19yZWFkaW5nX2RhdGE6CisjaWZkZWYgVEVTVElORworCQkvKiBJJ20gc29ycnksIGJ1dDogTk9CT0RZIGV2ZXIgdXNlZCB0aGlzIHRyYWNlCisJCSAqIG1lc3NhZ2VzIGZvciBhZ2VzLiBJIGd1ZXNzIHRoYXQgQmFzIHdhcyB0aGUgbGFzdCBwZXJzb24KKwkJICogdGhhdCBldmVyIHJlYWxseSB1c2VkIHRoaXMgKHRoYW5rIHlvdSwgYmV0d2VlbiB0aGUgbGluZXMpCisJCSAqLworCQlpZiAoY2F1c2UgPT0gbm9fZXJyb3IpIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywicmVhZGluZyBzZWdtZW50ICVkIixidWZmLT5zZWdtZW50X2lkKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlcnJvciByZWFkaW5nIHNlZ21lbnQgJWQiLAorCQkJICAgICAgYnVmZi0+c2VnbWVudF9pZCk7CisJCQlUUkFDRShmdF90X25vaXNlLCAiXG4iCisJCQkgICAgICBLRVJOX0lORk8KKwkJCSAgICAgIklSUTpDOiAweCUwMngsIEg6IDB4JTAyeCwgUjogMHglMDJ4LCBOOiAweCUwMnhcbiIKKwkJCSAgICAgIEtFUk5fSU5GTworCQkJICAgICAgIkJVRjpDOiAweCUwMngsIEg6IDB4JTAyeCwgUjogMHglMDJ4IiwKKwkJCSAgICAgIGluWzNdLCBpbls0XSwgaW5bNV0sIGluWzZdLAorCQkJICAgICAgYnVmZi0+Y3lsLCBidWZmLT5oZWFkLCBidWZmLT5zZWN0KTsKKwkJfQorI2VuZGlmCisJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGFib3J0aW5nIHx8CisJCSAgICBmdF9ydW5uZXJfc3RhdHVzID09IGRvX2Fib3J0KSB7CisJCQlUUkFDRShmdF90X25vaXNlLCJhYm9ydGluZyAlcyIsZmRjX21vZGVfdHh0KGZkY19tb2RlKSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYnVmZi0+YmFkX3NlY3Rvcl9tYXAgPT0gRkFLRV9TRUdNRU5UKSB7CisJCQkvKiBUaGlzIGNvbmRpdGlvbiBvY2N1cnMgd2hlbiByZWFkaW5nIGEgYGZha2UnCisJCQkgKiBzZWN0b3IgdGhhdCdzIG5vdCBhY2Nlc3NpYmxlLiBEb2Vzbid0CisJCQkgKiByZWFsbHkgbWF0dGVyIGFzIHdlIHdvdWxkIGhhdmUgaWdub3JlZCBpdAorCQkJICogYW55d2F5ICEKKwkJCSAqCisJCQkgKiBDaGFuY2UgaXMgdGhhdCB3ZSdyZSBwYXN0IHRoZSBuZXh0IHNlZ21lbnQKKwkJCSAqIG5vdywgc28gdGhlIG5leHQgb3BlcmF0aW9uIG1heSBmYWlsIGFuZAorCQkJICogcmVzdWx0IGluIGEgcmV0cnkuICAKKwkJCSAqLworCQkJYnVmZi0+cmVtYWluaW5nID0gMDsJLyogc2tpcCBmYWlsaW5nIHNlY3RvciAqLworCQkJLyogYnVmZi0+cHRyICAgICAgID0gYnVmZi0+YWRkcmVzczsgKi8KKwkJCS8qIGZha2Ugc3VjY2VzczogKi8KKwkJCWNvbnRpbnVlX3hmZXIoYnVmZiwgZmRjX21vZGUsIDEpOworCQkJLyogIHRyYWNlIGNhbGxzIGFyZSBleHBlbnNpdmU6IHBsYWNlIHRoZW0gQUZURVIKKwkJCSAqICB0aGUgcmVhbCBzdHVmZiBoYXMgYmVlbiBkb25lLgorCQkJICogIAorCQkJICovCisJCQlUUkFDRShmdF90X25vaXNlLCAic2tpcHBpbmcgZW1wdHkgc2VnbWVudCAlZCAocmVhZCksIHNpemU/ICVkIiwKKwkJCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQsIGJ1ZmYtPnB0ciAtIGJ1ZmYtPmFkZHJlc3MpOworCQkJVFJBQ0VfRVhJVDsKKwkJfQorCQlpZiAoYnVmZi0+cmV0cnkgPiAwKSB7CisJCQlUUkFDRShmdF90X2Zsb3csICJ0aGlzIGlzIHJldHJ5IG5yICVkIiwgYnVmZi0+cmV0cnkpOworCQl9CisJCXN3aXRjaCAoY2F1c2UpIHsKKwkJY2FzZSBub19lcnJvcjoKKwkJCWRldGVybWluZV9wcm9ncmVzcyhidWZmLCBjYXVzZSwgaW5bNV0pOworCQkJaWYgKGluWzJdICYgMHg0MCkgeworCQkJCS8qICBIYW5kbGUgZGVsZXRlZCBkYXRhIGluIGhlYWRlciBzZWdtZW50cy4KKwkJCQkgKiAgU2tpcCBzZWdtZW50IGFuZCBmb3JjZSByZWFkLWFoZWFkLgorCQkJCSAqLworCQkJCVRSQUNFKGZ0X3Rfd2FybiwKKwkJCQkgICAgICAiZGVsZXRlZCBkYXRhIGluIHNlZ21lbnQgJWQvJWQiLAorCQkJCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQsCisJCQkJICAgICAgRlRfU0VDVE9SKGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgLSAxKSk7CisJCQkJYnVmZi0+ZGVsZXRlZCA9IDE7CisJCQkJYnVmZi0+cmVtYWluaW5nID0gMDsvKmFib3J0IHRyYW5zZmVyICovCisJCQkJYnVmZi0+c29mdF9lcnJvcl9tYXAgfD0KKwkJCQkJCSgtMUwgPDwgYnVmZi0+c2VjdG9yX29mZnNldCk7CisJCQkJaWYgKGJ1ZmYtPnNlZ21lbnRfaWQgPT0gMCkgeworCQkJCQkvKiBzdG9wIG9uIG5leHQgc2VnbWVudCAqLworCQkJCQlzdG9wX3JlYWRfYWhlYWQgPSAxOworCQkJCX0KKwkJCQkvKiBmb3JjZSByZWFkLWFoZWFkOiAqLworCQkJCWJ1ZmYtPm5leHRfc2VnbWVudCA9IAorCQkJCQlidWZmLT5zZWdtZW50X2lkICsgMTsKKwkJCQlza2lwID0gKEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSAKKwkJCQkJYnVmZi0+c2VjdG9yX29mZnNldCk7CisJCQl9IGVsc2UgeworCQkJCXNraXAgPSAwOworCQkJfQorCQkJY29udGludWVfeGZlcihidWZmLCBmZGNfbW9kZSwgc2tpcCk7CisJCQlicmVhazsKKwkJY2FzZSBub19kYXRhX2Vycm9yOgorCQkJLyogVGFwZSBzdGFydGVkIHRvbyBmYXIgYWhlYWQgb2Ygb3IgYmVoaW5kIHRoZQorCQkJICogcmlnaHQgc2VjdG9yLiAgVGhpcyBtYXkgYWxzbyBoYXBwZW4gaW4gdGhlCisJCQkgKiBtaWRkbGUgb2YgYSBzZWdtZW50ICEKKwkJCSAqCisJCQkgKiBIYW5kbGUgbm8tZGF0YSBhcyBzb2Z0IGVycm9yLiBJZiBuZXh0CisJCQkgKiBzZWN0b3IgZmFpbHMgdG9vLCBhIHJldHJ5ICh3aXRoIG5lZWRlZAorCQkJICogcmVwb3NpdGlvbikgd2lsbCBmb2xsb3cuCisJCQkgKi8KKwkJCXJldHJ5ICsrOworCQljYXNlIGlkX2FtX2Vycm9yOgorCQljYXNlIGlkX2NyY19lcnJvcjoKKwkJY2FzZSBkYXRhX2FtX2Vycm9yOgorCQljYXNlIGRhdGFfY3JjX2Vycm9yOgorCQljYXNlIG92ZXJydW5fZXJyb3I6CisJCQlyZXRyeSArPSAoYnVmZi0+c29mdF9lcnJvcl9tYXAgIT0gMCB8fAorCQkJCSAgYnVmZi0+aGFyZF9lcnJvcl9tYXAgIT0gMCk7CisJCQlkZXRlcm1pbmVfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UsIGluWzVdKTsgCisjaWYgMSB8fCBkZWZpbmVkKFRFU1RJTkcpCisJCQlpZiAoY2F1c2UgPT0gb3ZlcnJ1bl9lcnJvcikgcmV0cnkgKys7CisjZW5kaWYKKwkJCWlmIChyZXRyeSkgeworCQkJCXNraXAgPSBmaW5kX3Jlc3VtZV9wb2ludChidWZmKTsKKwkJCX0gZWxzZSB7CisJCQkJc2tpcCA9IGJ1ZmYtPnNlY3Rvcl9vZmZzZXQ7CisJCQl9CisJCQkvKiAgVHJ5IHRvIHJlc3VtZSB3aXRoIG5leHQgc2VjdG9yIG9uIHNpbmdsZQorCQkJICogIGVycm9ycyAobGV0IGVjYyBjb3JyZWN0IGl0KSwgYnV0IHJldHJ5IG9uCisJCQkgKiAgbm9fZGF0YSAod2UnbGwgYmUgcGFzdCB0aGUgdGFyZ2V0IHdoZW4gd2UKKwkJCSAqICBnZXQgaGVyZSBzbyB3ZSBjYW5ub3QgcmV0cnkpIG9yIG9uCisJCQkgKiAgbXVsdGlwbGUgZXJyb3JzIChyZWR1Y2UgY2hhbmNlIG9uIGVjYworCQkJICogIGZhaWx1cmUpLgorCQkJICovCisJCQkvKiAgY0g6IDIzLzAyLzk3OiBpZiB0aGUgbGFzdCBzZWN0b3IgaW4gdGhlIAorCQkJICogIHNlZ21lbnQgd2FzIGEgaGFyZCBlcnJvciwgdGhlbiB0aGVyZSBpcyAKKwkJCSAqICBubyBzZW5zZSBpbiBhIHJldHJ5LiBUaGlzIG9jY2FzaW9uIHNlbGRvbQorCQkJICogIG9jY3VycyBidXQgLi4uIEA6s7K4YEAlJqckCisJCQkgKi8KKwkJCWlmIChyZXRyeSAmJiBza2lwIDwgMzIpIHsKKwkJCQlyZXRyeV9zZWN0b3IoYnVmZiwgZmRjX21vZGUsIHNraXApOworCQkJfSBlbHNlIHsKKwkJCQljb250aW51ZV94ZmVyKGJ1ZmYsIGZkY19tb2RlLCBza2lwKTsKKwkJCX0KKwkJCXVwZGF0ZV9oaXN0b3J5KGNhdXNlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogIERvbid0IGtub3cgd2h5IHRoaXMgY291bGQgaGFwcGVuIAorCQkJICogIGJ1dCBmaW5kIG91dC4KKwkJCSAqLworCQkJZGV0ZXJtaW5lX3Byb2dyZXNzKGJ1ZmYsIGNhdXNlLCBpbls1XSk7CisJCQlyZXRyeV9zZWN0b3IoYnVmZiwgZmRjX21vZGUsIDApOworCQkJVFJBQ0UoZnRfdF9lcnIsICJFcnJvcjogdW5leHBlY3RlZCBlcnJvciIpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBmZGNfcmVhZGluZ19pZDoKKwkJaWYgKGNhdXNlID09IG5vX2Vycm9yKSB7CisJCQlmZGNfY3lsID0gaW5bM107CisJCQlmZGNfaGVhZCA9IGluWzRdOworCQkJZmRjX3NlY3QgPSBpbls1XTsKKwkJCVRSQUNFKGZ0X3RfZmRjX2RtYSwKKwkJCSAgICAgICJpZCByZWFkOiBDOiAweCUwMngsIEg6IDB4JTAyeCwgUjogMHglMDJ4IiwKKwkJCSAgICAgIGZkY19jeWwsIGZkY19oZWFkLCBmZGNfc2VjdCk7CisJCX0gZWxzZSB7CS8qIG5vIHZhbGlkIGluZm9ybWF0aW9uLCB1c2UgaW52YWxpZCBzZWN0b3IgKi8KKwkJCWZkY19jeWwgPSBmZGNfaGVhZCA9IGZkY19zZWN0ID0gMDsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgIkRpZG4ndCBmaW5kIHZhbGlkIHNlY3RvciBJZCIpOworCQl9CisJCWZkY19tb2RlID0gZmRjX2lkbGU7CisJCWJyZWFrOworCWNhc2UgZmRjX2RlbGV0aW5nOgorCWNhc2UgZmRjX3dyaXRpbmdfZGF0YToKKyNpZmRlZiBURVNUSU5HCisJCWlmIChjYXVzZSA9PSBub19lcnJvcikgeworCQkJVFJBQ0UoZnRfdF9mbG93LCAid3JpdGluZyBzZWdtZW50ICVkIiwgYnVmZi0+c2VnbWVudF9pZCk7CisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAiZXJyb3Igd3JpdGluZyBzZWdtZW50ICVkIiwKKwkJCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQpOworCQl9CisjZW5kaWYKKwkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gYWJvcnRpbmcgfHwKKwkJICAgIGZ0X3J1bm5lcl9zdGF0dXMgPT0gZG9fYWJvcnQpIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgImFib3J0aW5nICVzIixmZGNfbW9kZV90eHQoZmRjX21vZGUpKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChidWZmLT5yZXRyeSA+IDApIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgInRoaXMgaXMgcmV0cnkgbnIgJWQiLCBidWZmLT5yZXRyeSk7CisJCX0KKwkJaWYgKGJ1ZmYtPmJhZF9zZWN0b3JfbWFwID09IEZBS0VfU0VHTUVOVCkgeworCQkJLyogVGhpcyBjb25kaXRpb24gb2NjdXJzIHdoZW4gdHJ5aW5nIHRvIHdyaXRlIHRvIGEKKwkJCSAqIGBmYWtlJyBzZWN0b3IgdGhhdCdzIG5vdCBhY2Nlc3NpYmxlLiBEb2Vzbid0IHJlYWxseQorCQkJICogbWF0dGVyIGFzIGl0IGlzbid0IHVzZWQgYW55d2F5ICEgTWlnaHQgYmUgbG9jYXRlZAorCQkJICogYXQgd3Jvbmcgc2VnbWVudCwgdGhlbiB3ZSdsbCBmYWlsIG9uIHRoZSBuZXh0CisJCQkgKiBzZWdtZW50LgorCQkJICovCisJCQlUUkFDRShmdF90X25vaXNlLCAic2tpcHBpbmcgZW1wdHkgc2VnbWVudCAod3JpdGUpIik7CisJCQlidWZmLT5yZW1haW5pbmcgPSAwOwkvKiBza2lwIGZhaWxpbmcgc2VjdG9yICovCisJCQkvKiBmYWtlIHN1Y2Nlc3M6ICovCisJCQljb250aW51ZV94ZmVyKGJ1ZmYsIGZkY19tb2RlLCAxKTsKKwkJCWJyZWFrOworCQl9CisJCXN3aXRjaCAoY2F1c2UpIHsKKwkJY2FzZSBub19lcnJvcjoKKwkJCWRldGVybWluZV9wcm9ncmVzcyhidWZmLCBjYXVzZSwgaW5bNV0pOworCQkJY29udGludWVfeGZlcihidWZmLCBmZGNfbW9kZSwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBub19kYXRhX2Vycm9yOgorCQljYXNlIGlkX2FtX2Vycm9yOgorCQljYXNlIGlkX2NyY19lcnJvcjoKKwkJY2FzZSBkYXRhX2FtX2Vycm9yOgorCQljYXNlIG92ZXJydW5fZXJyb3I6CisJCQl1cGRhdGVfaGlzdG9yeShjYXVzZSk7CisJCQlkZXRlcm1pbmVfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UsIGluWzVdKTsKKwkJCXNraXAgPSBmaW5kX3Jlc3VtZV9wb2ludChidWZmKTsKKwkJCXJldHJ5X3NlY3RvcihidWZmLCBmZGNfbW9kZSwgc2tpcCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChpblsxXSAmIDB4MDIpIHsKKwkJCQlUUkFDRShmdF90X2VyciwgIm1lZGlhIG5vdCB3cml0YWJsZSIpOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2J1ZywgInVuZm9yZXNlZW4gd3JpdGUgZXJyb3IiKTsKKwkJCX0KKwkJCWZkY19tb2RlID0gZmRjX2lkbGU7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsgLyogZmRjX2RlbGV0aW5nIHx8IGZkY193cml0aW5nX2RhdGEgKi8KKwljYXNlIGZkY19mb3JtYXR0aW5nOgorCQkvKiAgVGhlIGludGVycnVwdCBjb21lcyBhZnRlciBmb3JtYXR0aW5nIGEgc2VnbWVudC4gV2UgdGhlbgorCQkgKiAgaGF2ZSB0byBzZXQgdXAgUVVJQ0tMWSBmb3IgdGhlIG5leHQgc2VnbWVudC4gQnV0CisJCSAqICBhZnRlcndhcmRzLCB0aGVyZSBpcyBwbGVudHkgb2YgdGltZS4KKwkJICovCisJCXN3aXRjaCAoY2F1c2UpIHsKKwkJY2FzZSBub19lcnJvcjoKKwkJCS8qICB3b3VsZCBsaWtlIHRvIGtlZXAgbW9zdCBvZiB0aGUgZm9ybWF0dGluZyBzdHVmZgorCQkJICogIG91dHNpZGUgdGhlIGlzciBjb2RlLCBidXQgdGltaW5nIGlzIHRvbyBjcml0aWNhbAorCQkJICovCisJCQlpZiAoZGV0ZXJtaW5lX2ZtdF9wcm9ncmVzcyhidWZmLCBjYXVzZSkgPj0gMCkgeworCQkJCWNvbnRpbnVlX2Zvcm1hdHRpbmcoYnVmZik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBub19kYXRhX2Vycm9yOgorCQljYXNlIGlkX2FtX2Vycm9yOgorCQljYXNlIGlkX2NyY19lcnJvcjoKKwkJY2FzZSBkYXRhX2FtX2Vycm9yOgorCQljYXNlIG92ZXJydW5fZXJyb3I6CisJCWRlZmF1bHQ6CisJCQlkZXRlcm1pbmVfZm10X3Byb2dyZXNzKGJ1ZmYsIGNhdXNlKTsKKwkJCXVwZGF0ZV9oaXN0b3J5KGNhdXNlKTsKKwkJCWlmIChpblsxXSAmIDB4MDIpIHsKKwkJCQlUUkFDRShmdF90X2VyciwgIm1lZGlhIG5vdCB3cml0YWJsZSIpOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2J1ZywgInVuZm9yZXNlZW4gd3JpdGUgZXJyb3IiKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9IC8qIGNhdXNlICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFKGZ0X3Rfd2FybiwgIldhcm5pbmc6IHVuZXhwZWN0ZWQgaXJxIGR1cmluZzogJXMiLAorCQkgICAgICBmZGNfbW9kZV90eHQoZmRjX21vZGUpKTsKKwkJZmRjX21vZGUgPSBmZGNfaWRsZTsKKwkJYnJlYWs7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qICAgICAgRkRDIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKi8KK3ZvaWQgZmRjX2lzcih2b2lkKQoreworCXN0YXRpYyBpbnQgaXNyX2FjdGl2ZTsKKyNpZmRlZiBURVNUSU5HCisJdW5zaWduZWQgaW50IHQwID0gZnRhcGVfdGltZXN0YW1wKCk7CisjZW5kaWYKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisgCWlmIChpc3JfYWN0aXZlKyspIHsKKwkJLS1pc3JfYWN0aXZlOworCQlUUkFDRShmdF90X2J1ZywgIkJVRzogbmVzdGVkIGludGVycnVwdCwgbm90IGdvb2QgISIpOworCQkqZmRjLmhvb2sgPSBmZGNfaXNyOyAvKiAgaG9vayBvdXIgaGFuZGxlciBpbnRvIHRoZSBmZGMKKwkJCQkgICAgICAqICBjb2RlIGFnYWluIAorCQkJCSAgICAgICovCisJCVRSQUNFX0VYSVQ7CisJfQorCXN0aSgpOworCWlmIChpbmJfcChmZGMubXNyKSAmIEZEQ19CVVNZKSB7CS8qICBFbnRlcmluZyBSZXN1bHQgUGhhc2UgKi8KKwkJZnRfaGlkZV9pbnRlcnJ1cHQgPSAwOworCQloYW5kbGVfZmRjX2J1c3koZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKSk7CisJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGRvX2Fib3J0KSB7CisJCQkvKiAgICAgIGNlYXNlIG9wZXJhdGlvbiwgcmVtZW1iZXIgdGFwZSBwb3NpdGlvbgorCQkJICovCisJCQlUUkFDRShmdF90X2Zsb3csICJydW5uZXIgYWJvcnRpbmciKTsKKwkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBhYm9ydGluZzsKKwkJCSsrZnRfZXhwZWN0ZWRfc3RyYXlfaW50ZXJydXB0czsKKwkJfQorCX0gZWxzZSB7IC8qICFGRENfQlVTWSAqLworCQkvKiAgY2xlYXIgaW50ZXJydXB0LCBjYXVzZSBzaG91bGQgYmUgZ290dGVuIGJ5IGlzc3VpbmcKKwkJICogIGEgU2Vuc2UgSW50ZXJydXB0IFN0YXR1cyBjb21tYW5kLgorCQkgKi8KKwkJaWYgKGZkY19tb2RlID09IGZkY19yZWNhbGlicmF0aW5nIHx8IGZkY19tb2RlID09IGZkY19zZWVraW5nKSB7CisJCQlpZiAoZnRfaGlkZV9pbnRlcnJ1cHQpIHsKKwkJCQlpbnQgc3QwOworCQkJCWludCBwY247CisKKwkJCQlpZiAoZmRjX3NlbnNlX2ludGVycnVwdF9zdGF0dXMoJnN0MCwgJnBjbikgPCAwKQorCQkJCQlUUkFDRShmdF90X2VyciwKKwkJCQkJICAgICAgInNlbnNlIGludGVycnVwdCBzdGF0dXMgZmFpbGVkIik7CisJCQkJZnRhcGVfY3VycmVudF9jeWxpbmRlciA9IHBjbjsKKwkJCQlUUkFDRShmdF90X2Zsb3csICJoYW5kbGVkIGhpZGRlbiBpbnRlcnJ1cHQiKTsKKwkJCX0KKwkJCWZ0X3NlZWtfY29tcGxldGVkID0gMTsKKwkJCWZkY19tb2RlID0gZmRjX2lkbGU7CisJCX0gZWxzZSBpZiAoIXdhaXRxdWV1ZV9hY3RpdmUoJmZ0YXBlX3dhaXRfaW50cikpIHsKKwkJCWlmIChmdF9leHBlY3RlZF9zdHJheV9pbnRlcnJ1cHRzID09IDApIHsKKwkJCQlUUkFDRShmdF90X3dhcm4sICJ1bmV4cGVjdGVkIHN0cmF5IGludGVycnVwdCIpOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2Zsb3csICJleHBlY3RlZCBzdHJheSBpbnRlcnJ1cHQiKTsKKwkJCQktLWZ0X2V4cGVjdGVkX3N0cmF5X2ludGVycnVwdHM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoZmRjX21vZGUgPT0gZmRjX3JlYWRpbmdfZGF0YSB8fAorCQkJICAgIGZkY19tb2RlID09IGZkY192ZXJpZnlpbmcgICAgfHwKKwkJCSAgICBmZGNfbW9kZSA9PSBmZGNfd3JpdGluZ19kYXRhIHx8CisJCQkgICAgZmRjX21vZGUgPT0gZmRjX2RlbGV0aW5nICAgICB8fAorCQkJICAgIGZkY19tb2RlID09IGZkY19mb3JtYXR0aW5nICAgfHwKKwkJCSAgICBmZGNfbW9kZSA9PSBmZGNfcmVhZGluZ19pZCkgeworCQkJCWlmIChpbmJfcChmZGMubXNyKSAmIEZEQ19CVVNZKSB7CisJCQkJCVRSQUNFKGZ0X3RfYnVnLAorCQkJCQkiKioqKiogRkRDIGZhaWx1cmUsIGJ1c3kgdG9vIGxhdGUiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlUUkFDRShmdF90X2J1ZywKKwkJCQkJICAgICAgIioqKioqIEZEQyBmYWlsdXJlLCBubyBidXN5Iik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2ZkY19kbWEsICJhd2FpdGVkIHN0cmF5IGludGVycnVwdCIpOworCQkJfQorCQl9CisJCWZ0X2hpZGVfaW50ZXJydXB0ID0gMDsKKwl9CisJLyogICAgSGFuZGxlIHNsZWVwIGNvZGUuCisJICovCisJaWYgKCFmdF9oaWRlX2ludGVycnVwdCkgeworCQlmdF9pbnRlcnJ1cHRfc2VlbiArKzsKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmZ0YXBlX3dhaXRfaW50cikpIHsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZnRhcGVfd2FpdF9pbnRyKTsKKwkJfQorCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3RfZmxvdywgImhpZGluZyBpbnRlcnJ1cHQgd2hpbGUgJXMiLCAKKwkJICAgICAgd2FpdHF1ZXVlX2FjdGl2ZSgmZnRhcGVfd2FpdF9pbnRyKSA/ICJ3YWl0aW5nIjoiYWN0aXZlIik7CisJfQorI2lmZGVmIFRFU1RJTkcKKwl0MCA9IGZ0YXBlX3RpbWVkaWZmKHQwLCBmdGFwZV90aW1lc3RhbXAoKSk7CisJaWYgKHQwID49IDEwMDApIHsKKwkJLyogb25seSB0ZWxsIHVzIGFib3V0IGxvbmcgY2FsbHMgKi8KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImlzcigpIGR1cmF0aW9uOiAlNWQgdXNlYyIsIHQwKTsKKwl9CisjZW5kaWYKKwkqZmRjLmhvb2sgPSBmZGNfaXNyOwkvKiBob29rIG91ciBoYW5kbGVyIGludG8gdGhlIGZkYyBjb2RlIGFnYWluICovCisJLS1pc3JfYWN0aXZlOworCVRSQUNFX0VYSVQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlzci5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZkYy1pc3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjVhYTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZkYy1pc3IuaApAQCAtMCwwICsxLDU1IEBACisjaWZuZGVmIF9GRENfSVNSX0gKKyNkZWZpbmUgX0ZEQ19JU1JfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZmRjLWlzci5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MDcgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBnbG9iYWwgdmFyaWFibGVzIG5lY2Vzc2FyeSB0bworICogICAgICBzeW5jaHJvbml6ZSB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAoaXNyKSB3aXRoIHRoZQorICogICAgICByZW1haW5kZXIgb2YgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyCisgKiAgICAgICJmdGFwZSIgZm9yIExpbnV4LgorICovCisKKy8qCisgKiAgICAgIGZkYy1pc3IuYyBkZWZpbmVkIHB1YmxpYyB2YXJpYWJsZXMKKyAqLworZXh0ZXJuIHZvbGF0aWxlIGludCBmdF9leHBlY3RlZF9zdHJheV9pbnRlcnJ1cHRzOyAvKiBtYXNrcyBzdHJheSBpbnRlcnJ1cHRzICovCitleHRlcm4gdm9sYXRpbGUgaW50IGZ0X3NlZWtfY29tcGxldGVkOwkgICAgICAgICAgLyogZmxhZyBzZXQgYnkgaXNyICovCitleHRlcm4gdm9sYXRpbGUgaW50IGZ0X2ludGVycnVwdF9zZWVuOwkgICAgICAgICAgLyogZmxhZyBzZXQgYnkgaXNyICovCitleHRlcm4gdm9sYXRpbGUgaW50IGZ0X2hpZGVfaW50ZXJydXB0OyAgICAgICAgICAgIC8qIGZsYWcgc2V0IGJ5IGlzciAqLworCisvKgorICogICAgICBmZGMtaW8uYyBkZWZpbmVkIHB1YmxpYyBmdW5jdGlvbnMKKyAqLworZXh0ZXJuIHZvaWQgZmRjX2lzcih2b2lkKTsKKworLyoKKyAqICAgICAgQSBrZXJuZWwgaG9vayB0aGF0IHN0ZWFscyBvbmUgaW50ZXJydXB0IGZyb20gdGhlIGZsb3BweQorICogICAgICBkcml2ZXIgKFNob3VsZCBiZSBmaXhlZCB3aGVuIHRoZSBuZXcgZmRjIGRyaXZlciBnZXRzIHJlYWR5KQorICogICAgICBTZWUgdGhlIGxpbnV4IGtlcm5lbCBzb3VyY2UgZmlsZXM6CisgKiAgICAgICAgICBkcml2ZXJzL2Jsb2NrL2Zsb3BweS5jICYgZHJpdmVycy9ibG9jay9ibGsuaAorICogICAgICBmb3IgdGhlIGRldGFpbHMuCisgKi8KK2V4dGVybiB2b2lkICgqZG9fZmxvcHB5KSAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJzbS5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTMwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnNtLmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ic20uYyx2ICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE1OjE1ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYmFkLXNlY3RvciBtYXAgaGFuZGxpbmcgY29kZSBmb3IKKyAqICAgICAgdGhlIFFJQy0xMTcgZmxvcHB5IHRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqICAgICAgUUlDLTQwLCBRSUMtODAsIFFJQy0zMDEwIGFuZCBRSUMtMzAyMCBtYXBzIGFyZSBpbXBsZW1lbnRlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworc3RhdGljIF9fdTggKmJhZF9zZWN0b3JfbWFwOworc3RhdGljIFNlY3RvckNvdW50ICpic21faGFzaF9wdHI7IAorCit0eXBlZGVmIGVudW0geworCWZvcndhcmQsIGJhY2t3YXJkCit9IG1vZGVfdHlwZTsKKworI2lmIDAKK3N0YXRpYyB2b2lkIGZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KGludCBzZWdtZW50X2lkLCBTZWN0b3JNYXAgbmV3X21hcCk7CisjZW5kaWYKKworI2lmIDAKKy8qICBmaXhfdGFwZSBjb252ZXJ0cyBhIG5vcm1hbCBRSUMtODAgdGFwZSBpbnRvIGEgJ3dpZGUnIHRhcGUuCisgKiAgRm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSAhCisgKi8KK3ZvaWQgZml4X3RhcGUoX191OCAqIGJ1ZmZlciwgZnRfZm9ybWF0X3R5cGUgbmV3X2NvZGUpCit7CisJc3RhdGljIF9fdTggbGlzdFtCQURfU0VDVE9SX01BUF9TSVpFXTsKKwlTZWN0b3JNYXAgKnNyY19wdHIgPSAoU2VjdG9yTWFwICopIGxpc3Q7CisJX191OCAqZHN0X3B0ciA9IGJhZF9zZWN0b3JfbWFwOworCVNlY3Rvck1hcCBtYXA7CisJdW5zaWduZWQgaW50IHNlY3RvciA9IDE7CisJaW50IGk7CisKKwlpZiAoZm9ybWF0X2NvZGUgIT0gZm10X3ZhciAmJiBmb3JtYXRfY29kZSAhPSBmbXRfYmlnKSB7CisJCW1lbWNweShsaXN0LCBiYWRfc2VjdG9yX21hcCwgc2l6ZW9mKGxpc3QpKTsKKwkJbWVtc2V0KGJhZF9zZWN0b3JfbWFwLCAwLCBzaXplb2YoYmFkX3NlY3Rvcl9tYXApKTsKKwkJd2hpbGUgKChfX3U4ICopIHNyY19wdHIgLSBsaXN0IDwgc2l6ZW9mKGxpc3QpKSB7CisJCQltYXAgPSAqc3JjX3B0cisrOworCQkJaWYgKG1hcCA9PSBFTVBUWV9TRUdNRU5UKSB7CisJCQkJKihTZWN0b3JNYXAgKikgZHN0X3B0ciA9IDB4ODAwMDAwICsgc2VjdG9yOworCQkJCWRzdF9wdHIgKz0gMzsKKwkJCQlzZWN0b3IgKz0gU0VDVE9SU19QRVJfU0VHTUVOVDsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpID0gMDsgaSA8IFNFQ1RPUlNfUEVSX1NFR01FTlQ7ICsraSkgeworCQkJCQlpZiAobWFwICYgMSkgeworCQkJCQkJKihTZXdjdG9yTWFwICopIGRzdF9wdHIgPSBzZWN0b3I7CisJCQkJCQlkc3RfcHRyICs9IDM7CisJCQkJCX0KKwkJCQkJbWFwID4+PSAxOworCQkJCQkrK3NlY3RvcjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJYmFkX3NlY3Rvcl9tYXBfY2hhbmdlZCA9IDE7CisJKihidWZmZXIgKyA0KSA9IG5ld19jb2RlOwkvKiBwdXQgbmV3IGZvcm1hdCBjb2RlICovCisJaWYgKGZvcm1hdF9jb2RlICE9IGZtdF92YXIgJiYgbmV3X2NvZGUgPT0gZm10X2JpZykgeworCQlQVVQ0KGJ1ZmZlciwgRlRfNl9IU0VHXzEsICAgKF9fdTMyKUdFVDIoYnVmZmVyLCA2KSk7CisJCVBVVDQoYnVmZmVyLCBGVF82X0hTRUdfMiwgICAoX191MzIpR0VUMihidWZmZXIsIDgpKTsKKwkJUFVUNChidWZmZXIsIEZUXzZfRlJTVF9TRUcsIChfX3UzMilHRVQyKGJ1ZmZlciwgMTApKTsKKwkJUFVUNChidWZmZXIsIEZUXzZfTEFTVF9TRUcsIChfX3UzMilHRVQyKGJ1ZmZlciwgMTIpKTsKKwkJbWVtc2V0KGJ1ZmZlcis2LCAnXDAnLCA4KTsKKwl9CisJZm9ybWF0X2NvZGUgPSBuZXdfY29kZTsKK30KKworI2VuZGlmCisKKy8qICAgZ2l2ZW4gYnVmZmVyIHRoYXQgY29udGFpbnMgYSBoZWFkZXIgc2VnbWVudCwgZmluZCB0aGUgZW5kIG9mCisgKiAgIG9mIHRoZSBic20gbGlzdAorICovCitfX3U4ICogZnRhcGVfZmluZF9lbmRfb2ZfYnNtX2xpc3QoX191OCAqIGFkZHJlc3MpCit7CisJX191OCAqcHRyICAgPSBhZGRyZXNzICsgRlRfSEVBREVSX0VORDsgLyogc3RhcnQgb2YgYnNtIGxpc3QgKi8KKwlfX3U4ICpsaW1pdCA9IGFkZHJlc3MgKyBGVF9TRUdNRU5UX1NJWkU7CisJd2hpbGUgKHB0ciArIDIgPCBsaW1pdCkgeworCQlpZiAocHRyWzBdIHx8IHB0clsxXSB8fCBwdHJbMl0pIHsKKwkJCXB0ciArPSAzOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHB0cjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9zZWN0b3IoU2VjdG9yQ291bnQgKnB0ciwgdW5zaWduZWQgaW50IHNlY3RvcikKK3sKKwlwdHItPmJ5dGVzWzBdID0gc2VjdG9yICYgMHhmZjsKKwlzZWN0b3IgPj49IDg7CisJcHRyLT5ieXRlc1sxXSA9IHNlY3RvciAmIDB4ZmY7CisJc2VjdG9yID4+PSA4OworCXB0ci0+Ynl0ZXNbMl0gPSBzZWN0b3IgJiAweGZmOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfc2VjdG9yKFNlY3RvckNvdW50ICpwdHIpCit7CisjaWYgMQorCXVuc2lnbmVkIGludCBzZWN0b3I7CisKKwlzZWN0b3IgID0gcHRyLT5ieXRlc1swXTsKKwlzZWN0b3IgKz0gcHRyLT5ieXRlc1sxXSA8PCAgODsKKwlzZWN0b3IgKz0gcHRyLT5ieXRlc1syXSA8PCAxNjsKKworCXJldHVybiBzZWN0b3I7CisjZWxzZQorCS8qICBHRVQ0IGdldHMgdGhlIG5leHQgZm91ciBieXRlcyBpbiBJbnRlbCBsaXR0bGUgZW5kaWFuIG9yZGVyCisJICogIGFuZCBjb252ZXJ0cyB0aGVtIHRvIGhvc3QgYnl0ZSBvcmRlciBhbmQgaGFuZGxlcyB1bmFsaWduZWQKKwkgKiAgYWNjZXNzLgorCSAqLworCXJldHVybiAoR0VUNChwdHIsIDApICYgMHgwMGZmZmZmZik7IC8qIGJhY2sgdG8gaG9zdCBieXRlIG9yZGVyICovCisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgYnNtX2RlYnVnX2Zha2Uodm9pZCkKK3sKKwkvKiBmb3IgdGVzdGluZyBvZiBiYWQgc2VjdG9yIGhhbmRsaW5nIGF0IGVuZCBvZiB0YXBlCisJICovCisjaWYgMAorCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KHNlZ21lbnRzX3Blcl90cmFjayAqIHRyYWNrc19wZXJfdGFwZSAtIDMsCisJCQkJICAgMHgwMDAwMDNlMDsKKwlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeShzZWdtZW50c19wZXJfdHJhY2sgKiB0cmFja3NfcGVyX3RhcGUgLSAyLAorCQkJCSAgIDB4ZmYzZmZmZmY7CisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoc2VnbWVudHNfcGVyX3RyYWNrICogdHJhY2tzX3Blcl90YXBlIC0gMSwKKwkJCQkgICAweGZmZmZlMDAwOworI2VuZGlmCisJLyogIEVuYWJsZSB0byB0ZXN0IGJhZCBzZWN0b3IgaGFuZGxpbmcKKwkgKi8KKyNpZiAwCisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoMzAsIDB4ZmZmZmZmZmUpCisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoMzIsIDB4N2ZmZmZmZmYpOworCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KDM0LCAweGZmZmVmZmZmKTsKKwlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeSgzNiwgMHg1NTU1NTU1NSk7CisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoMzgsIDB4ZmZmZmZmZmYpOworCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KDUwLCAweGZmZmYwMDAwKTsKKwlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeSg1MSwgMHhmZmZmZmZmZik7CisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoNTIsIDB4ZmZmZmZmZmYpOworCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KDUzLCAweDAwMDBmZmZmKTsKKyNlbmRpZgorCS8qICBFbmFibGUgd2hlbiB0ZXN0aW5nIG11bHRpcGxlIHZvbHVtZSB0YXIgZHVtcHMuCisJICovCisjaWYgMAorCXsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OworCQkgICAgIGkgPD0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgLSA3OyArK2kpIHsKKwkJCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KGksIEVNUFRZX1NFR01FTlQpOworCQl9CisJfQorI2VuZGlmCisJLyogIEVuYWJsZSB3aGVuIHRlc3RpbmcgYml0IHBvc2l0aW9ucyBpbiAqX2Vycm9yX21hcAorCSAqLworI2lmIDAKKwl7CisJCWludCBpOworCQkKKwkJZm9yIChpID0gZmlyc3RfZGF0YV9zZWdtZW50OyBpIDw9IGxhc3RfZGF0YV9zZWdtZW50OyArK2kpIHsKKwkJCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KGksCisJCQkJCSAgIGZ0YXBlX2dldF9iYWRfc2VjdG9yX2VudHJ5KGkpIAorCQkJCQkgICB8IDB4MDBmZjAwZmYpOworCQl9CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHByaW50X2JhZF9zZWN0b3JfbWFwKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGdvb2Rfc2VjdG9yczsKKwl1bnNpZ25lZCBpbnQgdG90YWxfYmFkID0gMDsKKwlpbnQgaTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnIHx8IAorCSAgICBmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyIHx8IAorCSAgICBmdF9mb3JtYXRfY29kZSA9PSBmbXRfMTEwMGZ0KSB7CisJCVNlY3RvckNvdW50ICpwdHIgPSAoU2VjdG9yQ291bnQgKiliYWRfc2VjdG9yX21hcDsKKwkJdW5zaWduZWQgaW50IHNlY3RvcjsKKwkJX191MTYgKnB0cjE2OworCisJCXdoaWxlKChzZWN0b3IgPSBnZXRfc2VjdG9yKHB0cisrKSkgIT0gMCkgeworCQkJaWYgKChmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnIHx8IAorCQkJICAgICBmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyKSAmJgorCQkJICAgIHNlY3RvciAmIDB4ODAwMDAwKSB7CisJCQkJdG90YWxfYmFkICs9IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSAzOworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJiYWQgc2VnbWVudCBhdCBzZWN0b3I6ICU2ZCIsCisJCQkJICAgICAgc2VjdG9yICYgMHg3ZmZmZmYpOworCQkJfSBlbHNlIHsKKwkJCQkrK3RvdGFsX2JhZDsKKwkJCQlUUkFDRShmdF90X25vaXNlLCAiYmFkIHNlY3RvcjogJTZkIiwgc2VjdG9yKTsKKwkJCX0KKwkJfQorCQkvKiAgRGlzcGxheSBvbGQgZnRhcGUncyBlbmQtb2YtZmlsZSBtYXJrcworCQkgKi8KKwkJcHRyMTYgPSAoX191MTYqKXB0cjsKKwkJd2hpbGUgKChzZWN0b3IgPSBnZXRfdW5hbGlnbmVkKHB0cjE2KyspKSAhPSAwKSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAiT2xkIGZ0YXBlIGVvZiBtYXJrOiAlNGQvJTJkIiwKKwkJCSAgICAgIHNlY3RvciwgZ2V0X3VuYWxpZ25lZChwdHIxNisrKSk7CisJCX0KKwl9IGVsc2UgeyAvKiBmaXhlZCBzaXplIGZvcm1hdCAqLworCQlmb3IgKGkgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7CisJCSAgICAgaSA8IChpbnQpKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSk7ICsraSkgeworCQkJU2VjdG9yTWFwIG1hcCA9ICgoU2VjdG9yTWFwICopIGJhZF9zZWN0b3JfbWFwKVtpXTsKKworCQkJaWYgKG1hcCkgeworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCQkJICAgICAgImJzbSBmb3Igc2VnbWVudCAlNGQ6IDB4JTA4eCIsIGksICh1bnNpZ25lZCBpbnQpbWFwKTsKKwkJCQl0b3RhbF9iYWQgKz0gKChtYXAgPT0gRU1QVFlfU0VHTUVOVCkKKwkJCQkJICAgICAgID8gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIDMKKwkJCQkJICAgICAgIDogY291bnRfb25lcyhtYXApKTsKKwkJCX0KKwkJfQorCX0KKwlnb29kX3NlY3RvcnMgPQorCQkoKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSAtIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCkKKwkJICogKEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSAzKSkgLSB0b3RhbF9iYWQ7CisJVFJBQ0UoZnRfdF9pbmZvLCAiJWQgS2IgdXNhYmxlIG9uIHRoaXMgdGFwZSIsIGdvb2Rfc2VjdG9ycyk7CisJaWYgKHRvdGFsX2JhZCA9PSAwKSB7CisJCVRSQUNFKGZ0X3RfaW5mbywKKwkJICAgICAgIldBUk5JTkc6IHRoaXMgdGFwZSBoYXMgbm8gYmFkIGJsb2NrcyByZWdpc3RlcmVkICEiKTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X2luZm8sICIlZCBiYWQgc2VjdG9ycyIsIHRvdGFsX2JhZCk7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKwordm9pZCBmdGFwZV9leHRyYWN0X2JhZF9zZWN0b3JfbWFwKF9fdTggKiBidWZmZXIpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qICBGaWxsIHRoZSBiYWQgc2VjdG9yIG1hcCB3aXRoIHRoZSBjb250ZW50cyBvZiBidWZmZXIuCisJICovCisJaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgeworCQkvKiBRSUMtMzAxMC8zMDIwIGFuZCB3aWRlIFFJQy04MCB0YXBlcyBubyBsb25nZXIgaGF2ZSBhIGZhaWxlZAorCQkgKiBzZWN0b3IgbG9nIGJ1dCB1c2UgdGhpcyBhcmVhIHRvIGV4dGVuZCB0aGUgYmFkIHNlY3RvciBtYXAuCisJCSAqLworCQliYWRfc2VjdG9yX21hcCA9ICZidWZmZXJbRlRfSEVBREVSX0VORF07CisJfSBlbHNlIHsKKwkJLyogbm9uLXdpZGUgUUlDLTgwIHRhcGVzIGhhdmUgYSBmYWlsZWQgc2VjdG9yIGxvZyBhcmVhIHRoYXQKKwkJICogbXVzdG4ndCBiZSBpbmNsdWRlZCBpbiB0aGUgYmFkIHNlY3RvciBtYXAuCisJCSAqLworCQliYWRfc2VjdG9yX21hcCA9ICZidWZmZXJbRlRfRlNMICsgRlRfRlNMX1NJWkVdOworCX0KKwlpZiAoZnRfZm9ybWF0X2NvZGUgPT0gZm10XzExMDBmdCB8fCAKKwkgICAgZnRfZm9ybWF0X2NvZGUgPT0gZm10X3ZhciAgICB8fAorCSAgICBmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSB7CisJCWJzbV9oYXNoX3B0ciA9IChTZWN0b3JDb3VudCAqKWJhZF9zZWN0b3JfbWFwOworCX0gZWxzZSB7CisJCWJzbV9oYXNoX3B0ciA9IE5VTEw7CisJfQorCWJzbV9kZWJ1Z19mYWtlKCk7CisJaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfaW5mbykgeworCQlwcmludF9iYWRfc2VjdG9yX21hcCgpOworCX0KKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgaW5saW5lIFNlY3Rvck1hcCBjdnQybWFwKHVuc2lnbmVkIGludCBzZWN0b3IpCit7CisJcmV0dXJuIDEgPDwgKCgoc2VjdG9yICYgMHg3ZmZmZmYpIC0gMSkgJSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3Z0MnNlZ21lbnQodW5zaWduZWQgaW50IHNlY3RvcikKK3sKKwlyZXR1cm4gKChzZWN0b3IgJiAweDdmZmZmZikgLSAxKSAvIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQ7Cit9CisKK3N0YXRpYyBpbnQgZm9yd2FyZF9zZWVrX2VudHJ5KGludCBzZWdtZW50X2lkLCAKKwkJCSAgICAgIFNlY3RvckNvdW50ICoqcHRyLCAKKwkJCSAgICAgIFNlY3Rvck1hcCAqbWFwKQoreworCXVuc2lnbmVkIGludCBzZWN0b3I7CisJaW50IHNlZ21lbnQ7CisKKwlkbyB7CisJCXNlY3RvciA9IGdldF9zZWN0b3IoKCpwdHIpKyspOworCQlzZWdtZW50ID0gY3Z0MnNlZ21lbnQoc2VjdG9yKTsKKwl9IHdoaWxlIChzZWN0b3IgIT0gMCAmJiBzZWdtZW50IDwgc2VnbWVudF9pZCk7CisJKCpwdHIpIC0tOyAvKiBwb2ludCB0byBmaXJzdCBzZWN0b3IgPj0gc2VnbWVudF9pZCAqLworCS8qICBHZXQgYWxsIHNlY3RvcnMgaW4gc2VnbWVudF9pZAorCSAqLworCWlmIChzZWN0b3IgPT0gMCB8fCBzZWdtZW50ICE9IHNlZ21lbnRfaWQpIHsKKwkJKm1hcCA9IDA7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoKHNlY3RvciAmIDB4ODAwMDAwKSAmJgorCQkgICAoZnRfZm9ybWF0X2NvZGUgPT0gZm10X3ZhciB8fCBmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSkgeworCQkqbWFwID0gRU1QVFlfU0VHTUVOVDsKKwkJcmV0dXJuIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQ7CisJfSBlbHNlIHsKKwkJaW50IGNvdW50ID0gMTsKKwkJU2VjdG9yQ291bnQgKnRtcF9wdHIgPSAoKnB0cikgKyAxOworCQkKKwkJKm1hcCA9IGN2dDJtYXAoc2VjdG9yKTsKKwkJd2hpbGUgKChzZWN0b3IgPSBnZXRfc2VjdG9yKHRtcF9wdHIrKykpICE9IDAgJiYKKwkJICAgICAgIChzZWdtZW50ID0gY3Z0MnNlZ21lbnQoc2VjdG9yKSkgPT0gc2VnbWVudF9pZCkgeworCQkJKm1hcCB8PSBjdnQybWFwKHNlY3Rvcik7CisJCQkrK2NvdW50OworCQl9CisJCXJldHVybiBjb3VudDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYmFja3dhcmRzX3NlZWtfZW50cnkoaW50IHNlZ21lbnRfaWQsCisJCQkJU2VjdG9yQ291bnQgKipwdHIsCisJCQkJU2VjdG9yTWFwICptYXApCit7CisJdW5zaWduZWQgaW50IHNlY3RvcjsKKwlpbnQgc2VnbWVudDsgLyogbWF4IHVuc2lnbmVkIGludCAqLworCisJaWYgKCpwdHIgPD0gKFNlY3RvckNvdW50ICopYmFkX3NlY3Rvcl9tYXApIHsKKwkJKm1hcCA9IDA7CisJCXJldHVybiAwOworCX0KKwlkbyB7CisJCXNlY3RvciAgPSBnZXRfc2VjdG9yKC0tKCpwdHIpKTsKKwkJc2VnbWVudCA9IGN2dDJzZWdtZW50KHNlY3Rvcik7CisJfSB3aGlsZSAoKnB0ciA+IChTZWN0b3JDb3VudCAqKWJhZF9zZWN0b3JfbWFwICYmIHNlZ21lbnQgPiBzZWdtZW50X2lkKTsKKwlpZiAoc2VnbWVudCA+IHNlZ21lbnRfaWQpIHsgLyogIGF0IHN0YXJ0IG9mIGxpc3QsIG5vIGVudHJ5IGZvdW5kICovCisJCSptYXAgPSAwOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHNlZ21lbnQgPCBzZWdtZW50X2lkKSB7CisJCS8qICBiZWZvcmUgc21hbGxlciBlbnRyeSwgYWRqdXN0IGZvciBvdmVyc2hvb3QgKi8KKwkJKCpwdHIpICsrOworCQkqbWFwID0gMDsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICgoc2VjdG9yICYgMHg4MDAwMDApICYmCisJCSAgIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnIHx8IGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIpKSB7CisJCSptYXAgPSBFTVBUWV9TRUdNRU5UOworCQlyZXR1cm4gRlRfU0VDVE9SU19QRVJfU0VHTUVOVDsKKwl9IGVsc2UgeyAvKiAgZ2V0IGFsbCBzZWN0b3JzIGluIHNlZ21lbnRfaWQgKi8KKwkJaW50IGNvdW50ID0gMTsKKworCQkqbWFwID0gY3Z0Mm1hcChzZWN0b3IpOworCQl3aGlsZSgqcHRyID4gKFNlY3RvckNvdW50ICopYmFkX3NlY3Rvcl9tYXApIHsKKwkJCXNlY3RvciA9IGdldF9zZWN0b3IoLS0oKnB0cikpOworCQkJc2VnbWVudCA9IGN2dDJzZWdtZW50KHNlY3Rvcik7CisJCQlpZiAoc2VnbWVudCAhPSBzZWdtZW50X2lkKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQkqbWFwIHw9IGN2dDJtYXAoc2VjdG9yKTsKKwkJCSsrY291bnQ7CisJCX0KKwkJaWYgKHNlZ21lbnQgPCBzZWdtZW50X2lkKSB7CisJCQkoKnB0cikgKys7CisJCX0KKwkJcmV0dXJuIGNvdW50OworCX0KK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIGZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KGludCBzZWdtZW50X2lkLCBTZWN0b3JNYXAgbmV3X21hcCkKK3sKKwlTZWN0b3JDb3VudCAqcHRyID0gKFNlY3RvckNvdW50ICopYmFkX3NlY3Rvcl9tYXA7CisJaW50IGNvdW50OworCWludCBuZXdfY291bnQ7CisJU2VjdG9yTWFwIG1hcDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF8xMTAwZnQgfHwgCisJICAgIGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgCisJICAgIGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpIHsKKwkJY291bnQgPSBmb3J3YXJkX3NlZWtfZW50cnkoc2VnbWVudF9pZCwgJnB0ciwgJm1hcCk7CisJCW5ld19jb3VudCA9IGNvdW50X29uZXMobmV3X21hcCk7CisJCS8qIElmIGZvcm1hdCBjb2RlID09IDQgcHV0IGVtcHR5IHNlZ21lbnQgaW5zdGVhZCBvZiAzMgorCQkgKiBiYWQgc2VjdG9ycy4KKwkJICovCisJCWlmIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyIHx8IGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpIHsKKwkJCWlmIChuZXdfY291bnQgPT0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgeworCQkJCW5ld19jb3VudCA9IDE7CisJCQl9CisJCQlpZiAoY291bnQgPT0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgeworCQkJCWNvdW50ID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoY291bnQgIT0gbmV3X2NvdW50KSB7CisJCQkvKiBpbnNlcnQgKG9yIGRlbGV0ZSBpZiA8IDApIG5ld19jb3VudCAtIGNvdW50CisJCQkgKiBlbnRyaWVzLiAgTW92ZSB0cmFpbGluZyBwYXJ0IG9mIGxpc3QKKwkJCSAqIGluY2x1ZGluZyB0ZXJtaW5hdGluZyAwLgorCQkJICovCisJCQlTZWN0b3JDb3VudCAqaGlfcHRyID0gcHRyOworCisJCQlkbyB7CisJCQl9IHdoaWxlIChnZXRfc2VjdG9yKGhpX3B0cisrKSAhPSAwKTsKKwkJCS8qICBOb3RlOiBwdHIgaXMgb2YgdHlwZSBieXRlICosIGFuZCBlYWNoIGJhZCBzZWN0b3IKKwkJCSAqICBjb25zdW1lcyAzIGJ5dGVzLgorCQkJICovCisJCQltZW1tb3ZlKHB0ciArIG5ld19jb3VudCwgcHRyICsgY291bnQsCisJCQkJKHNpemVfdCkoaGlfcHRyIC0gKHB0ciArIGNvdW50KSkqc2l6ZW9mKFNlY3RvckNvdW50KSk7CisJCX0KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInB1dHRpbmcgbWFwIDB4JTA4eCBhdCAlcCwgc2VnbWVudCAlZCIsCisJCSAgICAgICh1bnNpZ25lZCBpbnQpbmV3X21hcCwgcHRyLCBzZWdtZW50X2lkKTsKKwkJaWYgKG5ld19jb3VudCA9PSAxICYmIG5ld19tYXAgPT0gRU1QVFlfU0VHTUVOVCkgeworCQkJcHV0X3NlY3RvcihwdHIrKywgKDB4ODAwMDAxICsgCisJCQkJCSAgc2VnbWVudF9pZCAqIAorCQkJCQkgIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpKTsKKwkJfSBlbHNlIHsKKwkJCWludCBpID0gMDsKKworCQkJd2hpbGUgKG5ld19tYXApIHsKKwkJCQlpZiAobmV3X21hcCAmIDEpIHsKKwkJCQkJcHV0X3NlY3RvcihwdHIrKywgCisJCQkJCQkgICAxICsgc2VnbWVudF9pZCAqIAorCQkJCQkJICAgRlRfU0VDVE9SU19QRVJfU0VHTUVOVCArIGkpOworCQkJCX0KKwkJCQkrK2k7CisJCQkJbmV3X21hcCA+Pj0gMTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCSgoU2VjdG9yTWFwICopIGJhZF9zZWN0b3JfbWFwKVtzZWdtZW50X2lkXSA9IG5ld19tYXA7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisjZW5kaWYgIC8qICAwICAqLworCitTZWN0b3JNYXAgZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoaW50IHNlZ21lbnRfaWQpCit7CisJaWYgKGZ0X3VzZWRfaGVhZGVyX3NlZ21lbnQgPT0gLTEpIHsKKwkJLyogIFdoZW4gcmVhZGluZyBoZWFkZXIgc2VnbWVudCB3ZSdsbCBuZWVkIGEgYmxhbmsgbWFwLgorCQkgKi8KKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChic21faGFzaF9wdHIgIT0gTlVMTCkgeworCQkvKiAgSW52YXJpYW50czoKKwkJICogICAgbWFwIC0gbWFzayB2YWx1ZSByZXR1cm5lZCBvbiBsYXN0IGNhbGwuCisJCSAqICAgIGJzbV9oYXNoX3B0ciAtIHBvaW50cyB0byBmaXJzdCBzZWN0b3IgZ3JlYXRlciBvciBlcXVhbCB0bworCQkgKiAgICAgICAgICBmaXJzdCBzZWN0b3IgaW4gbGFzdF9yZWZlcmVuY2VkIHNlZ21lbnQuCisJCSAqICAgIGxhc3RfcmVmZXJlbmNlZCAtIHNlZ21lbnQgaWQgdXNlZCBpbiB0aGUgbGFzdCBjYWxsLAorCQkgKiAgICAgICAgICAgICAgICAgICAgICBzZWN0b3IgYW5kIG1hcCBiZWxvbmcgdG8gdGhpcyBpZC4KKwkJICogIFRoaXMgY29kZSBpcyBkZXNpZ25lZCBmb3Igc2VxdWVudGlhbCBhY2Nlc3MgYW5kIHJldHJpZXMuCisJCSAqICBGb3IgdHJ1ZSByYW5kb20gYWNjZXNzIGl0IG1heSBoYXZlIHRvIGJlIHJlZGVzaWduZWQuCisJCSAqLworCQlzdGF0aWMgaW50IGxhc3RfcmVmZXJlbmNlID0gLTE7CisJCXN0YXRpYyBTZWN0b3JNYXAgbWFwOworCisJCWlmIChzZWdtZW50X2lkID4gbGFzdF9yZWZlcmVuY2UpIHsKKwkJCS8qICBTa2lwIGFsbCBzZWN0b3JzIGJlZm9yZSBzZWdtZW50X2lkCisJCQkgKi8KKwkJCWZvcndhcmRfc2Vla19lbnRyeShzZWdtZW50X2lkLCAmYnNtX2hhc2hfcHRyLCAmbWFwKTsKKwkJfSBlbHNlIGlmIChzZWdtZW50X2lkIDwgbGFzdF9yZWZlcmVuY2UpIHsKKwkJCS8qIFNraXAgYmFja3dhcmRzIHVudGlsIGJlZ2luIG9mIGJ1ZmZlciBvcgorCQkJICogZmlyc3Qgc2VjdG9yIGluIHNlZ21lbnRfaWQgCisJCQkgKi8KKwkJCWJhY2t3YXJkc19zZWVrX2VudHJ5KHNlZ21lbnRfaWQsICZic21faGFzaF9wdHIsICZtYXApOworCQl9CQkvKiBzZWdtZW50X2lkID09IGxhc3RfcmVmZXJlbmNlIDoga2VlcCBtYXAgKi8KKwkJbGFzdF9yZWZlcmVuY2UgPSBzZWdtZW50X2lkOworCQlyZXR1cm4gbWFwOworCX0gZWxzZSB7CisJCXJldHVybiAoKFNlY3Rvck1hcCAqKSBiYWRfc2VjdG9yX21hcClbc2VnbWVudF9pZF07CisJfQorfQorCisvKiAgVGhpcyBpcyBzaW1wbHkgaGVyZSB0byBwcmV2ZW50IHVzIGZyb20gb3ZlcndyaXRpbmcgb3RoZXIga2VybmVsCisgKiAgZGF0YS4gV3JpdGVzIHdpbGwgcmVzdWx0IGluIE5VTEwgUG9pbnRlciBkZXJlZmVyZW5jZS4KKyAqLwordm9pZCBmdGFwZV9pbml0X2JzbSh2b2lkKQoreworCWJhZF9zZWN0b3JfbWFwID0gTlVMTDsKKwlic21faGFzaF9wdHIgICA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnNtLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0NTQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ic20uaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIF9GVEFQRV9CU01fSAorI2RlZmluZSBfRlRBUEVfQlNNX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJzbS5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MDcgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciB0aGUgYmFkIHNlY3RvciBtYXAgaGFuZGxpbmcKKyAqICAgICAgcm91dGluZXMgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSA8bGludXgvZnRhcGUtaGVhZGVyLXNlZ21lbnQuaD4KKworI2RlZmluZSBFTVBUWV9TRUdNRU5UICAgICAgICAgICAoMHhmZmZmZmZmZikKKyNkZWZpbmUgRkFLRV9TRUdNRU5UICAgICAgICAgICAgKDB4ZmZmZmZmZmUpCisKKy8qICBtYXhpbXVtIChmb3JtYXQgY29kZSA0KSBiYWQgc2VjdG9yIG1hcCBzaXplIChieXRlcykuCisgKi8KKyNkZWZpbmUgQkFEX1NFQ1RPUl9NQVBfU0laRSAgICAgKDI5ICogU0VDVE9SX1NJWkUgLSAyNTYpCisKKy8qICBmb3JtYXQgY29kZSA0IGJhZCBzZWN0b3IgZW50cnksIGZ0YXBlIHVzZXMgdGhpcworICogIGludGVybmFsbHkgZm9yIGFsbCBmb3JtYXQgY29kZXMKKyAqLwordHlwZWRlZiBfX3UzMiBTZWN0b3JNYXA7CisvKiAgdmFyaWFibGUgYW5kIDExMDAgZnQgYmFkIHNlY3RvciBtYXAgZW50cnkuIFRoZXNlIHRocmVlIGJ5dGVzIHJlcHJlc2VudAorICogIGEgc2luZ2xlIHNlY3RvciBhZGRyZXNzIG1lYXN1cmVkIGZyb20gQk9ULiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgTmV3U2VjdG9yTWFwIHsgICAgICAgICAgCisJX191OCBieXRlc1szXTsKK30gU2VjdG9yQ291bnQ7CisKKworLyoKKyAqICAgICAgZnRhcGUtYnNtLmMgZGVmaW5lZCBnbG9iYWwgdmFycy4KKyAqLworCisvKgorICogICAgICBmdGFwZS1ic20uYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCisgKi8KK2V4dGVybiB2b2lkIHVwZGF0ZV9iYWRfc2VjdG9yX21hcChfX3U4ICogYnVmZmVyKTsKK2V4dGVybiB2b2lkIGZ0YXBlX2V4dHJhY3RfYmFkX3NlY3Rvcl9tYXAoX191OCAqIGJ1ZmZlcik7CitleHRlcm4gU2VjdG9yTWFwIGZ0YXBlX2dldF9iYWRfc2VjdG9yX2VudHJ5KGludCBzZWdtZW50X2lkKTsKK2V4dGVybiBfX3U4ICpmdGFwZV9maW5kX2VuZF9vZl9ic21fbGlzdChfX3U4ICogYWRkcmVzcyk7CitleHRlcm4gdm9pZCBmdGFwZV9pbml0X2JzbSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhZjIwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1idWZmZXIuYwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1idWZmZXIuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAxOTk3LzEwLzE2IDIzOjMzOjExICQKKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBhbGxvY2F0b3IvZGVhbGxvY3RvciBmb3IgZnRhcGUncyBkeW5hbWljIGRtYQorICogIGJ1ZmZlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorCisvKiAgRE1BJ2FibGUgbWVtb3J5IGFsbG9jYXRpb24gc3R1ZmYuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkICpkbWFhbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlhZGRyID0gX19nZXRfZG1hX3BhZ2VzKEdGUF9LRVJORUwsIGdldF9vcmRlcihzaXplKSk7CisJaWYgKGFkZHIpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGFkZHIpOyBwYWdlIDwgdmlydF90b19wYWdlKGFkZHIrc2l6ZSk7IHBhZ2UrKykKKwkJCVNldFBhZ2VSZXNlcnZlZChwYWdlKTsKKwl9CisJcmV0dXJuICh2b2lkICopYWRkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYWZyZWUodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpCit7CisJaWYgKHNpemUgPiAwKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZSgodW5zaWduZWQgbG9uZylhZGRyKTsKKwkJICAgICBwYWdlIDwgdmlydF90b19wYWdlKCh1bnNpZ25lZCBsb25nKWFkZHIrc2l6ZSk7IHBhZ2UrKykKKwkJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOworCX0KK30KKworc3RhdGljIGludCBhZGRfb25lX2J1ZmZlcih2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmIChmdF9ucl9idWZmZXJzID49IEZUX01BWF9OUl9CVUZGRVJTKSB7CisJCVRSQUNFX0VYSVQgLUVOT01FTTsKKwl9CisJZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdID0ga21hbGxvYyhzaXplb2YoYnVmZmVyX3N0cnVjdCksIEdGUF9LRVJORUwpOworCWlmIChmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10gPT0gTlVMTCkgeworCQlUUkFDRV9FWElUIC1FTk9NRU07CisJfQorCW1lbXNldChmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10sIDAsIHNpemVvZihidWZmZXJfc3RydWN0KSk7CisJZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdLT5hZGRyZXNzID0gZG1hYWxsb2MoRlRfQlVGRl9TSVpFKTsKKwlpZiAoZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdLT5hZGRyZXNzID09IE5VTEwpIHsKKwkJa2ZyZWUoZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdKTsKKwkJZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdID0gTlVMTDsKKwkJVFJBQ0VfRVhJVCAtRU5PTUVNOworCX0KKwlmdF9ucl9idWZmZXJzICsrOworCVRSQUNFKGZ0X3RfaW5mbywgImJ1ZmZlciBuciAjJWQgQCAlcCwgZG1hIGFyZWEgQCAlcCIsCisJICAgICAgZnRfbnJfYnVmZmVycywKKwkgICAgICBmdF9idWZmZXJbZnRfbnJfYnVmZmVycy0xXSwKKwkgICAgICBmdF9idWZmZXJbZnRfbnJfYnVmZmVycy0xXS0+YWRkcmVzcyk7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgdm9pZCBkZWxfb25lX2J1ZmZlcih2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCWlmIChmdF9ucl9idWZmZXJzID4gMCkgeworCQlUUkFDRShmdF90X2luZm8sICJyZWxlYXNpbmcgYnVmZmVyIG5yICMlZCBAICVwLCBkbWEgYXJlYSBAICVwIiwKKwkJICAgICAgZnRfbnJfYnVmZmVycywKKwkJICAgICAgZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnMtMV0sCisJCSAgICAgIGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzLTFdLT5hZGRyZXNzKTsKKwkJZnRfbnJfYnVmZmVycyAtLTsKKwkJZG1hZnJlZShmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10tPmFkZHJlc3MsIEZUX0JVRkZfU0laRSk7CisJCWtmcmVlKGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzXSk7CisJCWZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzXSA9IE5VTEw7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK2ludCBmdGFwZV9zZXRfbnJfYnVmZmVycyhpbnQgY250KQoreworCWludCBkZWx0YSA9IGNudCAtIGZ0X25yX2J1ZmZlcnM7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoZGVsdGEgPiAwKSB7CisJCXdoaWxlIChkZWx0YS0tKSB7CisJCQlpZiAoYWRkX29uZV9idWZmZXIoKSA8IDApIHsKKwkJCQlUUkFDRV9FWElUIC1FTk9NRU07CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGRlbHRhIDwgMCkgeworCQl3aGlsZSAoZGVsdGErKykgeworCQkJZGVsX29uZV9idWZmZXIoKTsKKwkJfQorCX0KKwlmdGFwZV96YXBfcmVhZF9idWZmZXJzKCk7CisJVFJBQ0VfRVhJVCAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYzk5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfRlRBUEVfQlVGRkVSX0gKKyNkZWZpbmUgX0ZUQVBFX0JVRkZFUl9ICisKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MDggJAorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGFsbG9jYXRvci9kZWFsbG9jdG9yIGZvciBmdGFwZSdzIGR5bmFtaWMgZG1hCisgKiAgYnVmZmVyLgorICovCisKK2V4dGVybiBpbnQgIGZ0YXBlX3NldF9ucl9idWZmZXJzKGludCBjbnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZiMjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWNhbGlici5jCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjA4ICQKKyAqCisgKiAgICAgIEdQIGNhbGlicmF0aW9uIHJvdXRpbmUgZm9yIHByb2Nlc3NvciBzcGVlZCBkZXBlbmRlbnQKKyAqICAgICAgZnVuY3Rpb25zLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaWYgZGVmaW5lZChfX2FscGhhX18pCisjIGluY2x1ZGUgPGFzbS9od3JwYi5oPgorI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorIyBpbmNsdWRlIDxhc20vbXNyLmg+CisjIGluY2x1ZGUgPGFzbS90aW1leC5oPgorI2VsaWYgZGVmaW5lZChfX2kzODZfXykKKyMgaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWNhbGlici5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pby5oIgorCisjdW5kZWYgREVCVUcKKworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCisjIGVycm9yIEZ0YXBlIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBhcmNoaXRlY3R1cmUhCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwc19wZXJfY3ljbGUgPSAwOworI2VuZGlmCisKK3N0YXRpYyBzcGlubG9ja190IGNhbGlicl9sb2NrOworCisvKgorICogTm90ZTogT24gSW50ZWwgUENzLCB0aGUgY2xvY2sgdGlja3MgYXQgMTAwIEh6IChIWj09MTAwKSB3aGljaCBpcworICogdG9vIHNsb3cgZm9yIGNlcnRhaW4gdGltZW91dHMgKGFuZCB0aGF0IGNsb2NrIGRvZXNuJ3QgZXZlbiB0aWNrCisgKiB3aGVuIGludGVycnVwdHMgYXJlIGRpc2FibGVkKS4gIEZvciB0aGF0IHJlYXNvbiwgdGhlIDgyNTQgdGltZXIgaXMKKyAqIHVzZWQgZGlyZWN0bHkgdG8gaW1wbGVtZW50IGZpbmUtZ3JhaW5lZCB0aW1lb3V0cy4gIEhvd2V2ZXIsIG9uCisgKiBBbHBoYSBQQ3MsIHRoZSA4MjU0IGlzICpub3QqIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBjbG9jayB0aWNrCisgKiAod2hpY2ggaXMgMTAyNCBIeiwgbm9ybWFsbHkpIGFuZCB0aGUgODI1NCB0aW1lciBydW5zIGF0IHNvbWUKKyAqICJyYW5kb20iIGZyZXF1ZW5jeSAoaXQgc2VlbXMgdG8gcnVuIGF0IDE4SHosIGJ1dCBpdCdzIG5vdCBzYWZlIHRvCisgKiByZWx5IG9uIHRoaXMgdmFsdWUpLiAgSW5zdGVhZCwgd2UgdXNlIHRoZSBBbHBoYSdzICJycGNjIgorICogaW5zdHJ1Y3Rpb24gdG8gcmVhZCBjeWNsZSBjb3VudHMuICBBcyB0aGlzIGlzIGEgMzIgYml0IGNvdW50ZXIsCisgKiBpdCB3aWxsIG92ZXJmbG93IG9ubHkgb25jZSBwZXIgMzAgc2Vjb25kcyAob24gYSAyMDBNSHogbWFjaGluZSksCisgKiB3aGljaCBpcyBwbGVudHkuCisgKi8KKwordW5zaWduZWQgaW50IGZ0YXBlX3RpbWVzdGFtcCh2b2lkKQoreworI2lmIGRlZmluZWQoX19hbHBoYV9fKQorCXVuc2lnbmVkIGxvbmcgcjsKKworCWFzbSB2b2xhdGlsZSAoInJwY2MgJTAiIDogIj1yIiAocikpOworCXJldHVybiByOworI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorCXVuc2lnbmVkIGxvbmcgcjsKKwlyZHRzY2wocik7CisJcmV0dXJuIHI7CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorCisvKgorICogTm90ZSB0aGF0IHRoZXJlIGlzIHNvbWUgdGltZSBiZXR3ZWVuIGNvdW50ZXIgdW5kZXJmbG93aW5nIGFuZCBqaWZmaWVzCisgKiBpbmNyZWFzaW5nLCBzbyB0aGUgY29kZSBiZWxvdyB3b24ndCBhbHdheXMgZ2l2ZSBjb3JyZWN0IG91dHB1dC4KKyAqIC1Wb2p0ZWNoCisgKi8KKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX191MTYgbG87CisJX191MTYgaGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FsaWJyX2xvY2ssIGZsYWdzKTsKKwlvdXRiX3AoMHgwMCwgMHg0Myk7CS8qIGxhdGNoIHRoZSBjb3VudCBBU0FQICovCisJbG8gPSBpbmJfcCgweDQwKTsJLyogcmVhZCB0aGUgbGF0Y2hlZCBjb3VudCAqLworCWxvIHw9IGluYigweDQwKSA8PCA4OworCWhpID0gamlmZmllczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYWxpYnJfbG9jaywgZmxhZ3MpOworCXJldHVybiAoKGhpICsgMSkgKiAodW5zaWduZWQgaW50KSBMQVRDSCkgLSBsbzsgIC8qIGRvd25jb3VudGVyICEgKi8KKyNlbmRpZgorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNob3J0X2Z0YXBlX3RpbWVzdGFtcCh2b2lkKQoreworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisJcmV0dXJuIGZ0YXBlX3RpbWVzdGFtcCgpOworI2VsaWYgZGVmaW5lZChfX2kzODZfXykKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbGlicl9sb2NrLCBmbGFncyk7CisgCW91dGJfcCgweDAwLCAweDQzKTsJLyogbGF0Y2ggdGhlIGNvdW50IEFTQVAgKi8KKwljb3VudCA9IGluYl9wKDB4NDApOwkvKiByZWFkIHRoZSBsYXRjaGVkIGNvdW50ICovCisJY291bnQgfD0gaW5iKDB4NDApIDw8IDg7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FsaWJyX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gKExBVENIIC0gY291bnQpOwkvKiBub3JtYWw6IGRvd25jb3VudGVyICovCisjZW5kaWYKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkaWZmKHVuc2lnbmVkIGludCB0MCwgdW5zaWduZWQgaW50IHQxKQoreworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisJcmV0dXJuICh0MSAtIHQwKTsKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCisJLyoKKwkgKiBUaGlzIGlzIHRyaWNreTogdG8gd29yayBmb3IgYm90aCBzaG9ydCBhbmQgZnVsbCBmdGFwZV90aW1lc3RhbXBzCisJICogd2UnbGwgaGF2ZSB0byBkaXNjcmltaW5hdGUgYmV0d2VlbiB0aGVzZS4KKwkgKiBJZiBpdCBfbG9va3NfIGxpa2Ugc2hvcnQgc3RhbXBzIHdpdGggd3JhcHBpbmcgYXJvdW5kIHdlJ2xsCisJICogYXN1bWUgaXQgYXJlLiBUaGlzIHdpbGwgZ2VuZXJhdGUgYSBzbWFsbCBlcnJvciBpZiBpdCByZWFsbHkKKwkgKiB3YXMgYSAodmVyeSBsYXJnZSkgZGVsdGEgZnJvbSBmdWxsIGZ0YXBlX3RpbWVzdGFtcHMuCisJICovCisJcmV0dXJuICh0MSA8PSB0MCAmJiB0MCA8PSBMQVRDSCkgPyB0MSArIExBVENIIC0gdDAgOiB0MSAtIHQwOworI2VuZGlmCit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXNlY3ModW5zaWduZWQgaW50IGNvdW50KQoreworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisJcmV0dXJuIChwc19wZXJfY3ljbGUgKiBjb3VudCkgLyAxMDAwMDAwVUw7CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorCXJldHVybiAoMTAwMDAgKiBjb3VudCkgLyAoKENMT0NLX1RJQ0tfUkFURSArIDUwKSAvIDEwMCk7CisjZW5kaWYKK30KKwordW5zaWduZWQgaW50IGZ0YXBlX3RpbWVkaWZmKHVuc2lnbmVkIGludCB0MCwgdW5zaWduZWQgaW50IHQxKQoreworCS8qCisJICogIENhbGN1bGF0ZSBkaWZmZXJlbmNlIGluIHVzZWMgZm9yIGZ0YXBlX3RpbWVzdGFtcCByZXN1bHRzIHQwICYgdDEuCisJICogIE5vdGUgdGhhdCBvbiB0aGUgaTM4NiBwbGF0Zm9ybSB3aXRoIHNob3J0IHRpbWUtc3RhbXBzLCB0aGUKKwkgKiAgbWF4aW11bSBhbGxvd2VkIHRpbWVzcGFuIGlzIDEvSFogb3Igd2UnbGwgbG9zZSB0aWNrcyEKKwkgKi8KKwlyZXR1cm4gdXNlY3MoZGlmZih0MCwgdDEpKTsKK30KKworLyogICAgICBUbyBnZXQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgSS9PIHBlcmZvcm1hbmNlLAorICogICAgICBtZWFzdXJlIHRoZSBkdXJhdGlvbiBvZiB0aGUgaW5iKCkgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHRpbWVfaW5iKHZvaWQpCit7CisJaW50IGk7CisJaW50IHQwLCB0MTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGF0dXM7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYWxpYnJfbG9jaywgZmxhZ3MpOworCXQwID0gc2hvcnRfZnRhcGVfdGltZXN0YW1wKCk7CisJZm9yIChpID0gMDsgaSA8IDEwMDA7ICsraSkgeworCQlzdGF0dXMgPSBpbmIoZmRjLm1zcik7CisJfQorCXQxID0gc2hvcnRfZnRhcGVfdGltZXN0YW1wKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FsaWJyX2xvY2ssIGZsYWdzKTsKKwlUUkFDRShmdF90X2luZm8sICJpbmIoKSBkdXJhdGlvbjogJWQgbnNlYyIsIGZ0YXBlX3RpbWVkaWZmKHQwLCB0MSkpOworCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfY2xvY2sodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorCXBzX3Blcl9jeWNsZSA9IDEwMDAwMDAwMDBVTCAvIGNwdV9raHo7CisjZWxpZiBkZWZpbmVkKF9fYWxwaGFfXykKKwlleHRlcm4gc3RydWN0IGh3cnBiX3N0cnVjdCAqaHdycGI7CisJcHNfcGVyX2N5Y2xlID0gKDEwMDAqMTAwMCoxMDAwKjEwMDBVTCkgLyBod3JwYi0+Y3ljbGVfZnJlcTsKKyNlbmRpZgorCVRSQUNFX0VYSVQ7Cit9CisKKy8qCisgKiAgICAgIElucHV0OiAgZnVuY3Rpb24gdGFraW5nIGludCBjb3VudCBhcyBwYXJhbWV0ZXIuCisgKiAgICAgICAgICAgICAgcG9pbnRlcnMgdG8gY2FsY3VsYXRlZCBjYWxpYnJhdGlvbiB2YXJpYWJsZXMuCisgKi8KK3ZvaWQgZnRhcGVfY2FsaWJyYXRlKGNoYXIgKm5hbWUsCisJCSAgICB2b2lkICgqZnVuKSAodW5zaWduZWQgaW50KSwgCisJCSAgICB1bnNpZ25lZCBpbnQgKmNhbGlicl9jb3VudCwgCisJCSAgICB1bnNpZ25lZCBpbnQgKmNhbGlicl90aW1lKQoreworCXN0YXRpYyBpbnQgZmlyc3RfdGltZSA9IDE7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHRjID0gMDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IHRpbWU7CisjaWYgZGVmaW5lZChfX2kzODZfXykKKwl1bnNpZ25lZCBpbnQgb2xkX3RjID0gMDsKKwl1bnNpZ25lZCBpbnQgb2xkX2NvdW50ID0gMTsKKwl1bnNpZ25lZCBpbnQgb2xkX3RpbWUgPSAxOworI2VuZGlmCisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoZmlyc3RfdGltZSkgeyAgICAgICAgICAgICAvKiBnZXQgaWRlYSBvZiBJL08gcGVyZm9ybWFuY2UgKi8KKwkJaW5pdF9jbG9jaygpOworCQl0aW1lX2luYigpOworCQlmaXJzdF90aW1lID0gMDsKKwl9CisJLyogICAgdmFsdWUgb2YgdGltZW91dCBtdXN0IGJlIHNldCBzbyB0aGF0IG9uIHZlcnkgc2xvdyBzeXN0ZW1zCisJICogICAgaXQgd2lsbCBnaXZlIGEgdGltZSBsZXNzIHRoYW4gb25lIGppZmZ5LCBhbmQgb24KKwkgKiAgICB2ZXJ5IGZhc3Qgc3lzdGVtcyBpdCdsbCBnaXZlIHJlYXNvbmFibGUgcHJlY2lzaW9uLgorCSAqLworCisJY291bnQgPSA0MDsKKwlmb3IgKGkgPSAwOyBpIDwgMTU7ICsraSkgeworCQl1bnNpZ25lZCBpbnQgdDA7CisJCXVuc2lnbmVkIGludCB0MTsKKwkJdW5zaWduZWQgaW50IG9uY2U7CisJCXVuc2lnbmVkIGludCBtdWx0aXBsZTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkqY2FsaWJyX2NvdW50ID0KKwkJKmNhbGlicl90aW1lID0gY291bnQ7CS8qIHNldCBUQyB0byAxICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYWxpYnJfbG9jaywgZmxhZ3MpOworCQlmdW4oMCk7CQkvKiBkdW1teSwgZ2V0IGNvZGUgaW50byBjYWNoZSAqLworCQl0MCA9IHNob3J0X2Z0YXBlX3RpbWVzdGFtcCgpOworCQlmdW4oMCk7CQkvKiBvdmVyaGVhZCArIG9uZSB0ZXN0ICovCisJCXQxID0gc2hvcnRfZnRhcGVfdGltZXN0YW1wKCk7CisJCW9uY2UgPSBkaWZmKHQwLCB0MSk7CisJCXQwID0gc2hvcnRfZnRhcGVfdGltZXN0YW1wKCk7CisJCWZ1bihjb3VudCk7CQkvKiBvdmVyaGVhZCArIGNvdW50IHRlc3RzICovCisJCXQxID0gc2hvcnRfZnRhcGVfdGltZXN0YW1wKCk7CisJCW11bHRpcGxlID0gZGlmZih0MCwgdDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYWxpYnJfbG9jaywgZmxhZ3MpOworCQl0aW1lID0gZnRhcGVfdGltZWRpZmYoMCwgbXVsdGlwbGUgLSBvbmNlKTsKKwkJdGMgPSAoMTAwMCAqIHRpbWUpIC8gKGNvdW50IC0gMSk7CisJCVRSQUNFKGZ0X3RfYW55LCAib25jZTolM2QgdXMsJTZkIHRpbWVzOiU2ZCB1cywgVEM6JTVkIG5zIiwKKwkJCXVzZWNzKG9uY2UpLCBjb3VudCAtIDEsIHVzZWNzKG11bHRpcGxlKSwgdGMpOworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisJCS8qCisJCSAqIEluY3JlYXNlIHRoZSBjYWxpYnJhdGlvbiBjb3VudCBleHBvbmVudGlhbGx5IHVudGlsIHRoZQorCQkgKiBjYWxpYnJhdGlvbiB0aW1lIGV4Y2VlZHMgMTAwIG1zLgorCQkgKi8KKwkJaWYgKHRpbWUgPj0gMTAwKjEwMDApIHsKKwkJCWJyZWFrOworCQl9CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorCQkvKgorCQkgKiBpbmNyZWFzZSB0aGUgY291bnQgdW50aWwgdGhlIHJlc3VsdGluZyB0aW1lIG5lYXJzIDIvSFosCisJCSAqIHRoZW4gdGhlIHRjIHdpbGwgZHJvcCBzaGFycGx5IGJlY2F1c2Ugd2UgbG9zZSBMQVRDSCBjb3VudHMuCisJCSAqLworCQlpZiAodGMgPD0gb2xkX3RjIC8gMikgeworCQkJdGltZSA9IG9sZF90aW1lOworCQkJY291bnQgPSBvbGRfY291bnQ7CisJCQlicmVhazsKKwkJfQorCQlvbGRfdGMgPSB0YzsKKwkJb2xkX2NvdW50ID0gY291bnQ7CisJCW9sZF90aW1lID0gdGltZTsKKyNlbmRpZgorCQljb3VudCAqPSAyOworCX0KKwkqY2FsaWJyX2NvdW50ID0gY291bnQgLSAxOworCSpjYWxpYnJfdGltZSAgPSB0aW1lOworCVRSQUNFKGZ0X3RfaW5mbywgIlRDIGZvciBgJXMoKScgPSAlZCBuc2VjIChhdCAlZCBjb3VudHMpIiwKKwkgICAgIG5hbWUsICgxMDAwICogKmNhbGlicl90aW1lKSAvICpjYWxpYnJfY291bnQsICpjYWxpYnJfY291bnQpOworCVRSQUNFX0VYSVQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3ZTc1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIF9GVEFQRV9DQUxJQlJfSAorI2RlZmluZSBfRlRBUEVfQ0FMSUJSX0gKKworLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3Zlbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMSAkCisgKiAkRGF0ZTogMTk5Ny8wOS8xOSAwOTowNToyNiAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgYSBncCBjYWxpYnJhdGlvbiByb3V0aW5lIGZvcgorICogICAgICBoYXJkd2FyZSBkZXBlbmRlbnQgdGltZW91dCBmdW5jdGlvbnMuCisgKi8KKworZXh0ZXJuIHZvaWQgZnRhcGVfY2FsaWJyYXRlKGNoYXIgKm5hbWUsCisJCQkgICAgdm9pZCAoKmZ1bikgKHVuc2lnbmVkIGludCksCisJCQkgICAgdW5zaWduZWQgaW50ICpjYWxpYnJfY291bnQsCisJCQkgICAgdW5zaWduZWQgaW50ICpjYWxpYnJfdGltZSk7CitleHRlcm4gdW5zaWduZWQgaW50IGZ0YXBlX3RpbWVzdGFtcCh2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZnRhcGVfdGltZWRpZmYodW5zaWduZWQgaW50IHQwLCB1bnNpZ25lZCBpbnQgdDEpOworCisjZW5kaWYgLyogX0ZUQVBFX0NBTElCUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY3RsLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlMDQzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jdGwuYwpAQCAtMCwwICsxLDg5NyBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAgICAgICAgICAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jdGwuYyx2ICQKKyAqICRSZXZpc2lvbjogMS40ICQKKyAqICREYXRlOiAxOTk3LzExLzExIDE0OjM3OjQ0ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbm9uLXJlYWQvd3JpdGUgZnRhcGUgZnVuY3Rpb25zIGZvciB0aGUKKyAqICAgICAgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIGVhc2UgcG9ydGluZyBiZXR3ZWVuIHByZS0yLjQueCBhbmQgbGF0ZXIga2VybmVscyAqLworI2RlZmluZSB2bWFfZ2V0X3Bnb2ZmKHYpICAgICAgKCh2KS0+dm1fcGdvZmYpCisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCitmdGFwZV9pbmZvIGZ0YXBlX3N0YXR1cyA9IHsKKy8qICB2ZW5kb3IgaW5mb3JtYXRpb24gKi8KKwl7IDAsIH0sICAgICAvKiBkcml2ZSB0eXBlICovCisvKiAgZGF0YSByYXRlcyAqLworCTUwMCwgICAgICAgIC8qIHVzZWQgZGF0YSByYXRlICovCisJNTAwLCAgICAgICAgLyogZHJpdmUgbWF4IHJhdGUgKi8KKwk1MDAsICAgICAgICAvKiBmZGMgbWF4IHJhdGUgICAqLworLyogIGRyaXZlIHNlbGVjdGlvbiwgZWl0aGVyIEZUQVBFX1NFTF9BL0IvQy9EICovCisJLTEsICAgICAvKiBkcml2ZSBzZWxlY3Rpb24gKi8KKy8qICBmbGFncyBzZXQgYWZ0ZXIgZGVjb2RlIHRoZSBkcml2ZSBhbmQgdGFwZSBzdGF0dXMgICAqLworCTAsICAgICAgICAgIC8qIGZvcm1hdHRlZCAqLworCTEsICAgICAgICAgIC8qIG5vIHRhcGUgKi8KKwkxLCAgICAgICAgICAvKiB3cml0ZSBwcm90ZWN0ZWQgKi8KKwkxLCAgICAgICAgICAvKiBuZXcgdGFwZSAqLworLyogIHZhbHVlcyBvZiBsYXN0IHF1ZXJpZWQgZHJpdmUvdGFwZSBzdGF0dXMgYW5kIGVycm9yICovCisJe3swLH19LCAgICAgLyogbGFzdCBlcnJvciBjb2RlICovCisJe3swLH19LCAgICAgLyogZHJpdmUgc3RhdHVzLCBjb25maWd1cmF0aW9uLCB0YXBlIHN0YXR1cyAqLworLyogIGNhcnRyaWRnZSBnZW9tZXRyeSAqLworICAgICAgICAyMCwgICAgICAgICAvKiB0cmFja3NfcGVyX3RhcGUgKi8KKyAgICAgICAgMTAyLCAgICAgICAgLyogc2VnbWVudHNfcGVyX3RyYWNrICovCisvKiAgbG9jYXRpb24gb2YgaGVhZGVyIHNlZ21lbnRzLCBldGMuICovCisJLTEsICAgICAvKiB1c2VkX2hlYWRlcl9zZWdtZW50ICovCisJLTEsICAgICAvKiBoZWFkZXJfc2VnbWVudF8xICovCisJLTEsICAgICAvKiBoZWFkZXJfc2VnbWVudF8yICovCisJLTEsICAgICAvKiBmaXJzdF9kYXRhX3NlZ21lbnQgKi8KKyAgICAgICAgLTEsICAgICAvKiBsYXN0X2RhdGFfc2VnbWVudCAqLworLyogIHRoZSBmb3JtYXQgY29kZSBhcyBzdG9yZWQgaW4gdGhlIGhlYWRlciBzZWdtZW50ICAqLworCWZtdF9ub3JtYWwsIC8qIGZvcm1hdCBjb2RlICovCisvKiAgdGhlIGRlZmF1bHQgZm9yIHRoZSBxaWMgc3RkOiB1bmtub3duICovCisJLTEsCisvKiAgaXMgdGFwZSBydW5uaW5nPyAqLworCWlkbGUsICAgICAgIC8qIHJ1bm5lcl9zdGF0ZSAqLworLyogIGlzIHRhcGUgcmVhZGluZy93cml0aW5nL3ZlcmlmeWluZy9mb3JtYXR0aW5nL2RlbGV0aW5nICovCisJaWRsZSwgICAgICAgLyogZHJpdmVyIHN0YXRlICovCisvKiAgZmxhZ3MgZmF0YWwgaGFyZHdhcmUgZXJyb3IgKi8KKwkxLCAgICAgICAgICAvKiBmYWlsdXJlICovCisvKiAgaGlzdG9yeSByZWNvcmQgKi8KKwl7IDAsIH0gICAgICAvKiBoaXN0b3J5IHJlY29yZCAqLworfTsKKwkKK2ludCBmdGFwZV9zZWdtZW50c19wZXJfaGVhZCAgICAgPSAxMDIwOworaW50IGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciA9IDQ7CitpbnQgZnRhcGVfaW5pdF9kcml2ZV9uZWVkZWQgPSAxOyAvKiBuZWVkIHRvIGJlIGdsb2JhbCBmb3IgZnRhcGVfcmVzZXRfZHJpdmUoKQorCQkJCSAgKiBpbiBmdGFwZS1pby5jCisJCQkJICAqLworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyBjb25zdCB2ZW5kb3Jfc3RydWN0IHZlbmRvcnNbXSA9IFFJQzExN19WRU5ET1JTOworc3RhdGljIGNvbnN0IHdha2V1cF9tZXRob2QgbWV0aG9kc1tdID0gV0FLRVVQX01FVEhPRFM7CisKK2NvbnN0IGZ0YXBlX2luZm8gKmZ0YXBlX2dldF9zdGF0dXModm9pZCkKK3sKKyNpZiBkZWZpbmVkKFNUQVRVU19QQVJBTk9ZQSkKKwlzdGF0aWMgZnRhcGVfaW5mbyBnZXRfc3RhdHVzOworCisJZ2V0X3N0YXR1cyA9IGZ0YXBlX3N0YXR1czsKKwlyZXR1cm4gJmdldF9zdGF0dXM7CisjZWxzZQorCXJldHVybiAmZnRhcGVfc3RhdHVzOyAvKiAgbWF5YmUgcmV0dXJuIG9ubHkgYSBjb3B5IG9mIGl0IHRvIGFzc3VyZSAKKwkJCSAgICAgICAqICByZWFkIG9ubHkgYWNjZXNzCisJCQkgICAgICAgKi8KKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGZ0YXBlX25vdF9vcGVyYXRpb25hbChpbnQgc3RhdHVzKQoreworCS8qIHJldHVybiB0cnVlIGlmIHN0YXR1cyBpbmRpY2F0ZXMgdGFwZSBjYW4gbm90IGJlIHVzZWQuCisJICovCisJcmV0dXJuICgoc3RhdHVzIF4gUUlDX1NUQVRVU19DQVJUUklER0VfUFJFU0VOVCkgJgorCQkoUUlDX1NUQVRVU19FUlJPUiB8CisJCSBRSUNfU1RBVFVTX0NBUlRSSURHRV9QUkVTRU5UIHwKKwkJIFFJQ19TVEFUVVNfTkVXX0NBUlRSSURHRSkpOworfQorCitpbnQgZnRhcGVfc2Vla190b19lb3Qodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRV9DQVRDSChmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQucGF1c2UsICZzdGF0dXMpLCk7CisJd2hpbGUgKChzdGF0dXMgJiBRSUNfU1RBVFVTX0FUX0VPVCkgPT0gMCkgeworCQlpZiAoZnRhcGVfbm90X29wZXJhdGlvbmFsKHN0YXR1cykpIHsKKwkJCVRSQUNFX0VYSVQgLUVJTzsKKwkJfQorCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kX3dhaXQoUUlDX1BIWVNJQ0FMX0ZPUldBUkQsCisJCQkJCSAgICAgICBmdGFwZV90aW1lb3V0LnJld2luZCwmc3RhdHVzKSwpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK2ludCBmdGFwZV9zZWVrX3RvX2JvdCh2b2lkKQoreworCWludCBzdGF0dXM7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5wYXVzZSwgJnN0YXR1cyksKTsKKwl3aGlsZSAoKHN0YXR1cyAmIFFJQ19TVEFUVVNfQVRfQk9UKSA9PSAwKSB7CisJCWlmIChmdGFwZV9ub3Rfb3BlcmF0aW9uYWwoc3RhdHVzKSkgeworCQkJVFJBQ0VfRVhJVCAtRUlPOworCQl9CisJCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmRfd2FpdChRSUNfUEhZU0lDQUxfUkVWRVJTRSwKKwkJCQkJICAgICAgIGZ0YXBlX3RpbWVvdXQucmV3aW5kLCZzdGF0dXMpLCk7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGludCBmdGFwZV9uZXdfY2FydHJpZGdlKHZvaWQpCit7CisJZnRfbG9jYXRpb24udHJhY2sgPSAtMTsgLyogZm9yY2Ugc2VlayBvbiBmaXJzdCBhY2Nlc3MgKi8KKwlmdGFwZV96YXBfcmVhZF9idWZmZXJzKCk7CisJZnRhcGVfemFwX3dyaXRlX2J1ZmZlcnMoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGZ0YXBlX2Fib3J0X29wZXJhdGlvbih2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCWludCBzdGF0dXM7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBydW5uaW5nKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJhYm9ydGluZyBydW5uZXIsIHdhaXRpbmciKTsKKwkJCisJCWZ0X3J1bm5lcl9zdGF0dXMgPSBkb19hYm9ydDsKKwkJLyogc2V0IHRpbWVvdXQgc28gdGhhdCB0aGUgdGFwZSB3aWxsIHJ1biB0byBsb2dpY2FsIEVPVAorCQkgKiBpZiB3ZSBtaXNzZWQgdGhlIGxhc3Qgc2VjdG9yIGFuZCB0aGVyZSBhcmUgbm8gcXVldWUgcHVsc2VzLgorCQkgKi8KKwkJcmVzdWx0ID0gZnRhcGVfZHVtYl9zdG9wKCk7CisJfQorCWlmIChmdF9ydW5uZXJfc3RhdHVzICE9IGlkbGUpIHsKKwkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gZG9fYWJvcnQpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJmb3JjaW5nIHJ1bm5lciBhYm9ydCIpOworCQl9CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJzdG9wcGluZyB0YXBlIik7CisJCXJlc3VsdCA9IGZ0YXBlX3N0b3BfdGFwZSgmc3RhdHVzKTsKKwkJZnRfbG9jYXRpb24ua25vd24gPSAwOworCQlmdF9ydW5uZXJfc3RhdHVzICA9IGlkbGU7CisJfQorCWZ0YXBlX3Jlc2V0X2J1ZmZlcigpOworCWZ0YXBlX3phcF9yZWFkX2J1ZmZlcnMoKTsKKwlmdGFwZV9zZXRfc3RhdGUoaWRsZSk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbG9va3VwX3ZlbmRvcl9pZCh1bnNpZ25lZCBpbnQgdmVuZG9yX2lkKQoreworCWludCBpID0gMDsKKworCXdoaWxlICh2ZW5kb3JzW2ldLnZlbmRvcl9pZCAhPSB2ZW5kb3JfaWQpIHsKKwkJaWYgKCsraSA+PSBOUl9JVEVNUyh2ZW5kb3JzKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBmdGFwZV9kZXRhY2hfZHJpdmUodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJVFJBQ0UoZnRfdF9mbG93LCAiZGlzYWJsaW5nIHRhcGUgZHJpdmUgYW5kIGZkYyIpOworCWZ0YXBlX3B1dF9kcml2ZV90b19zbGVlcChmdF9kcml2ZV90eXBlLndha2VfdXApOworCWZkY19jYXRjaF9zdHJheV9pbnRlcnJ1cHRzKDEpOwkvKiBvbmUgYWx3YXlzIGNvbWVzICovCisJZmRjX2Rpc2FibGUoKTsKKwlmZGNfcmVsZWFzZV9pcnFfYW5kX2RtYSgpOworCWZkY19yZWxlYXNlX3JlZ2lvbnMoKTsKKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9oaXN0b3J5KHZvaWQpCit7CisJZnRfaGlzdG9yeS51c2VkID0gMDsKKwlmdF9oaXN0b3J5LmlkX2FtX2Vycm9ycyA9CisJCWZ0X2hpc3RvcnkuaWRfY3JjX2Vycm9ycyA9CisJCWZ0X2hpc3RvcnkuZGF0YV9hbV9lcnJvcnMgPQorCQlmdF9oaXN0b3J5LmRhdGFfY3JjX2Vycm9ycyA9CisJCWZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnMgPQorCQlmdF9oaXN0b3J5Lm5vX2RhdGFfZXJyb3JzID0KKwkJZnRfaGlzdG9yeS5yZXRyaWVzID0KKwkJZnRfaGlzdG9yeS5jcmNfZXJyb3JzID0KKwkJZnRfaGlzdG9yeS5jcmNfZmFpbHVyZXMgPQorCQlmdF9oaXN0b3J5LmVjY19mYWlsdXJlcyA9CisJCWZ0X2hpc3RvcnkuY29ycmVjdGVkID0KKwkJZnRfaGlzdG9yeS5kZWZlY3RzID0KKwkJZnRfaGlzdG9yeS5yZXdpbmRzID0gMDsKK30KKworc3RhdGljIGludCBmdGFwZV9hY3RpdmF0ZV9kcml2ZSh2ZW5kb3Jfc3RydWN0ICogZHJpdmVfdHlwZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCS8qIElmIHdlIGFscmVhZHkga25vdyB0aGUgZHJpdmUgdHlwZSwgd2FrZSBpdCB1cC4KKwkgKiBFbHNlIHRyeSB0byBmaW5kIG91dCB3aGF0IGtpbmQgb2YgZHJpdmUgaXMgYXR0YWNoZWQuCisJICovCisJaWYgKGRyaXZlX3R5cGUtPndha2VfdXAgIT0gdW5rbm93bl93YWtlX3VwKSB7CisJCVRSQUNFKGZ0X3RfZmxvdywgImVuYWJsaW5nIHRhcGUgZHJpdmUgYW5kIGZkYyIpOworCQlyZXN1bHQgPSBmdGFwZV93YWtldXBfZHJpdmUoZHJpdmVfdHlwZS0+d2FrZV91cCk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlUUkFDRShmdF90X2VyciwgImtub3duIHdha2V1cCBtZXRob2QgZmFpbGVkIik7CisJCX0KKwl9IGVsc2UgeworCQl3YWtlX3VwX3R5cGVzIG1ldGhvZDsKKwkJY29uc3QgZnRfdHJhY2VfdCBvbGRfdHJhY2luZyA9IFRSQUNFX0xFVkVMOworCQlpZiAoVFJBQ0VfTEVWRUwgPCBmdF90X2Zsb3cpIHsKKwkJCVNFVF9UUkFDRV9MRVZFTChmdF90X2J1Zyk7CisJCX0KKworCQkvKiAgVHJ5IHRvIGF3YWtlbiB0aGUgZHJpdmUgdXNpbmcgYWxsIGtub3duIG1ldGhvZHMuCisJCSAqICBMb3dlciB0cmFjaW5nIGZvciBhIHdoaWxlLgorCQkgKi8KKwkJZm9yIChtZXRob2Q9bm9fd2FrZV91cDsgbWV0aG9kIDwgTlJfSVRFTVMobWV0aG9kcyk7ICsrbWV0aG9kKSB7CisJCQlkcml2ZV90eXBlLT53YWtlX3VwID0gbWV0aG9kOworI2lmZGVmIENPTkZJR19GVF9UV09fRFJJVkVTCisJCQkvKiAgVGVzdCBzZXR1cCBmb3IgZHVhbCBkcml2ZSBjb25maWd1cmF0aW9uLgorCQkJICogIC9kZXYvcmZ0MiB1c2VzIG1vdW50YWluIHdha2V1cAorCQkJICogIC9kZXYvcmZ0MyB1c2VzIGNvbG9yYWRvIHdha2V1cAorCQkJICogIE90aGVyIHN5c3RlbXMgd2lsbCB1c2UgdGhlIG5vcm1hbCBzY2hlbWUuCisJCQkgKi8KKwkJCWlmICgoZnRfZHJpdmVfc2VsIDwgMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKwkJCSAgICAoZnRfZHJpdmVfc2VsID09IDIgJiYgbWV0aG9kID09IEZUX1dBS0VfVVBfMSkgfHwKKwkJCSAgICAoZnRfZHJpdmVfc2VsID09IDMgJiYgbWV0aG9kID09IEZUX1dBS0VfVVBfMikpIHsKKwkJCQlyZXN1bHQ9ZnRhcGVfd2FrZXVwX2RyaXZlKGRyaXZlX3R5cGUtPndha2VfdXApOworCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHQgPSAtRUlPOworCQkJfQorI2Vsc2UKKwkJCXJlc3VsdCA9IGZ0YXBlX3dha2V1cF9kcml2ZShkcml2ZV90eXBlLT53YWtlX3VwKTsKKyNlbmRpZgorCQkJaWYgKHJlc3VsdCA+PSAwKSB7CisJCQkJVFJBQ0UoZnRfdF93YXJuLCAiZHJpdmUgd2FrZXVwIG1ldGhvZDogJXMiLAorCQkJCSAgICAgIG1ldGhvZHNbZHJpdmVfdHlwZS0+d2FrZV91cF0ubmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJU0VUX1RSQUNFX0xFVkVMKG9sZF90cmFjaW5nKTsKKworCQlpZiAobWV0aG9kID49IE5SX0lURU1TKG1ldGhvZHMpKSB7CisJCQkvKiBubyByZXNwb25zZSBhdCBhbGwsIGNhbm5vdCBvcGVuIHRoaXMgZHJpdmUgKi8KKwkJCWRyaXZlX3R5cGUtPndha2VfdXAgPSB1bmtub3duX3dha2VfdXA7CisJCQlUUkFDRShmdF90X2VyciwgIm5vIHRhcGUgZHJpdmUgZm91bmQgISIpOworCQkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJfQorCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBmdGFwZV9nZXRfZHJpdmVfc3RhdHVzKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlpbnQgc3RhdHVzOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJZnRfbm9fdGFwZSA9IGZ0X3dyaXRlX3Byb3RlY3RlZCA9IDA7CisJLyogICAgVGFwZSBkcml2ZSBpcyBhY3RpdmF0ZWQgbm93LgorCSAqICAgIEZpcnN0IGNsZWFyIGVycm9yIHN0YXR1cyBpZiBwcmVzZW50LgorCSAqLworCWRvIHsKKwkJcmVzdWx0ID0gZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnJlc2V0LCAmc3RhdHVzKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWlmIChyZXN1bHQgPT0gLUVUSU1FKSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJmdGFwZV9yZWFkeV93YWl0IHRpbWVvdXQiKTsKKwkJCX0gZWxzZSBpZiAocmVzdWx0ID09IC1FSU5UUikgeworCQkJCVRSQUNFKGZ0X3RfZXJyLCAiZnRhcGVfcmVhZHlfd2FpdCBhYm9ydGVkIik7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3RfZXJyLCAiZnRhcGVfcmVhZHlfd2FpdCBmYWlsZWQiKTsKKwkJCX0KKwkJCVRSQUNFX0VYSVQgLUVJTzsKKwkJfQorCQkvKiAgQ2xlYXIgZXJyb3IgY29uZGl0aW9uIChkcml2ZSBpcyByZWFkeSAhKQorCQkgKi8KKwkJaWYgKHN0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpIHsKKwkJCXVuc2lnbmVkIGludCBlcnJvcjsKKwkJCXFpYzExN19jbWRfdCBjb21tYW5kOworCisJCQlUUkFDRShmdF90X2VyciwgImVycm9yIHN0YXR1cyBzZXQiKTsKKwkJCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyb3IsICZjb21tYW5kLCAxKTsKKwkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsCisJCQkJICAgICAgInJlcG9ydF9lcnJvcl9jb2RlIGZhaWxlZDogJWQiLCByZXN1bHQpOworCQkJCS8qIGhvcGUgaXQncyB3b3JraW5nIG5leHQgdGltZSAqLworCQkJCWZ0YXBlX3Jlc2V0X2RyaXZlKCk7CisJCQkJVFJBQ0VfRVhJVCAtRUlPOworCQkJfSBlbHNlIGlmIChlcnJvciAhPSAwKSB7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImVycm9yIGNvZGUgICA6ICVkIiwgZXJyb3IpOworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlcnJvciBjb21tYW5kOiAlZCIsIGNvbW1hbmQpOworCQkJfQorCQl9CisJCWlmIChzdGF0dXMgJiBRSUNfU1RBVFVTX05FV19DQVJUUklER0UpIHsKKwkJCXVuc2lnbmVkIGludCBlcnJvcjsKKwkJCXFpYzExN19jbWRfdCBjb21tYW5kOworCQkJY29uc3QgZnRfdHJhY2VfdCBvbGRfdHJhY2luZyA9IFRSQUNFX0xFVkVMOworCQkJU0VUX1RSQUNFX0xFVkVMKGZ0X3RfYnVnKTsKKworCQkJLyogIFVuZG9jdW1lbnRlZCBmZWF0dXJlOiBNdXN0IGNsZWFyIChub3QgcHJlc2VudCEpCisJCQkgKiAgZXJyb3IgaGVyZSBvciB3ZSdsbCBmYWlsIGxhdGVyLgorCQkJICovCisJCQlmdGFwZV9yZXBvcnRfZXJyb3IoJmVycm9yLCAmY29tbWFuZCwgMSk7CisKKwkJCVNFVF9UUkFDRV9MRVZFTChvbGRfdHJhY2luZyk7CisJCQlUUkFDRShmdF90X2luZm8sICJzdGF0dXM6IG5ldyBjYXJ0cmlkZ2UiKTsKKwkJCWZ0X25ld190YXBlID0gMTsKKwkJfSBlbHNlIHsKKwkJCWZ0X25ld190YXBlID0gMDsKKwkJfQorCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJfSB3aGlsZSAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUik7CisJCisJZnRfbm9fdGFwZSA9ICEoc3RhdHVzICYgUUlDX1NUQVRVU19DQVJUUklER0VfUFJFU0VOVCk7CisJZnRfd3JpdGVfcHJvdGVjdGVkID0gKHN0YXR1cyAmIFFJQ19TVEFUVVNfV1JJVEVfUFJPVEVDVCkgIT0gMDsKKwlpZiAoZnRfbm9fdGFwZSkgeworCQlUUkFDRShmdF90X3dhcm4sICJubyBjYXJ0cmlkZ2UgcHJlc2VudCIpOworCX0gZWxzZSB7CisJCWlmIChmdF93cml0ZV9wcm90ZWN0ZWQpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJXcml0ZSBwcm90ZWN0ZWQgY2FydHJpZGdlIik7CisJCX0KKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgdm9pZCBmdGFwZV9sb2dfdmVuZG9yX2lkKHZvaWQpCit7CisJaW50IHZlbmRvcl9pbmRleDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWZ0YXBlX3JlcG9ydF92ZW5kb3JfaWQoJmZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkKTsKKwl2ZW5kb3JfaW5kZXggPSBsb29rdXBfdmVuZG9yX2lkKGZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkKTsKKwlpZiAoZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQgPT0gVU5LTk9XTl9WRU5ET1IgJiYKKwkgICAgZnRfZHJpdmVfdHlwZS53YWtlX3VwID09IHdha2VfdXBfY29sb3JhZG8pIHsKKwkJdmVuZG9yX2luZGV4ID0gMDsKKwkJLyogaGFjayB0byBnZXQgcmlkIG9mIGFsbCB0aGlzIG1haWwgKi8KKwkJZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQgPSAwOworCX0KKwlpZiAodmVuZG9yX2luZGV4IDwgMCkgeworCQkvKiBVbmtub3duIHZlbmRvciBpZCwgZmlyc3QgdGltZSBvcGVuaW5nIGRldmljZS4gIFRoZQorCQkgKiBkcml2ZV90eXBlIHJlbWFpbnMgc2V0IHRvIHR5cGUgZm91bmQgYXQgd2FrZXVwCisJCSAqIHRpbWUsIHRoaXMgd2lsbCBwcm9iYWJseSBrZWVwIHRoZSBkcml2ZXIgb3BlcmF0aW5nCisJCSAqIGZvciB0aGlzIG5ldyB2ZW5kb3IuICAKKwkJICovCisJCVRSQUNFKGZ0X3Rfd2FybiwgIlxuIgorCQkgICAgICBLRVJOX0lORk8gIj09PT09PT09PT09PSB1bmtub3duIHZlbmRvciBpZCA9PT09PT09PT09PVxuIgorCQkgICAgICBLRVJOX0lORk8gIkEgbmV3LCB5ZXQgdW5zdXBwb3J0ZWQgdGFwZSBkcml2ZSBpcyBmb3VuZFxuIgorCQkgICAgICBLRVJOX0lORk8gIlBsZWFzZSByZXBvcnQgdGhlIGZvbGxvd2luZyB2YWx1ZXM6XG4iCisJCSAgICAgIEtFUk5fSU5GTyAiICAgVmVuZG9yIGlkICAgICA6IDB4JTA0eFxuIgorCQkgICAgICBLRVJOX0lORk8gIiAgIFdha2V1cCBtZXRob2QgOiAlc1xuIgorCQkgICAgICBLRVJOX0lORk8gIkFuZCBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgdGFwZSBkcml2ZVxuIgorCQkgICAgICBLRVJOX0lORk8gInRvICJUSEVfRlRBUEVfTUFJTlRBSU5FUiJcbiIKKwkJICAgICAgS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iLAorCQkgICAgICBmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCwKKwkJICAgICAgbWV0aG9kc1tmdF9kcml2ZV90eXBlLndha2VfdXBdLm5hbWUpOworCQlmdF9kcml2ZV90eXBlLnNwZWVkID0gMDsJCS8qIHVua25vd24gKi8KKwl9IGVsc2UgeworCQlmdF9kcml2ZV90eXBlLm5hbWUgID0gdmVuZG9yc1t2ZW5kb3JfaW5kZXhdLm5hbWU7CisJCWZ0X2RyaXZlX3R5cGUuc3BlZWQgPSB2ZW5kb3JzW3ZlbmRvcl9pbmRleF0uc3BlZWQ7CisJCVRSQUNFKGZ0X3RfaW5mbywgInRhcGUgZHJpdmUgdHlwZTogJXMiLCBmdF9kcml2ZV90eXBlLm5hbWUpOworCQkvKiBzY2FuIGFsbCBtZXRob2RzIGZvciB0aGlzIHZlbmRvcl9pZCBpbiB0YWJsZSAqLworCQl3aGlsZShmdF9kcml2ZV90eXBlLndha2VfdXAgIT0gdmVuZG9yc1t2ZW5kb3JfaW5kZXhdLndha2VfdXApIHsKKwkJCWlmICh2ZW5kb3JfaW5kZXggPCBOUl9JVEVNUyh2ZW5kb3JzKSAtIDEgJiYKKwkJCSAgICB2ZW5kb3JzW3ZlbmRvcl9pbmRleCArIDFdLnZlbmRvcl9pZCAKKwkJCSAgICA9PSAKKwkJCSAgICBmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCkgeworCQkJCSsrdmVuZG9yX2luZGV4OworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZnRfZHJpdmVfdHlwZS53YWtlX3VwICE9IHZlbmRvcnNbdmVuZG9yX2luZGV4XS53YWtlX3VwKSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJcbiIKKwkJICAgICBLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgorCQkgICAgIEtFUk5fSU5GTyAid2FrZXVwIHR5cGUgbWlzbWF0Y2g6XG4iCisJCSAgICAgS0VSTl9JTkZPICJmb3VuZDogJXMsIGV4cGVjdGVkOiAlc1xuIgorCQkgICAgIEtFUk5fSU5GTyAicGxlYXNlIHJlcG9ydCB0aGlzIHRvICJUSEVfRlRBUEVfTUFJTlRBSU5FUiJcbiIKKwkJICAgICBLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIsCisJCQkgICAgICBtZXRob2RzW2Z0X2RyaXZlX3R5cGUud2FrZV91cF0ubmFtZSwKKwkJCSAgICAgIG1ldGhvZHNbdmVuZG9yc1t2ZW5kb3JfaW5kZXhdLndha2VfdXBdLm5hbWUpOworCQl9CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3ZvaWQgZnRhcGVfY2FsY190aW1lb3V0cyh1bnNpZ25lZCBpbnQgcWljX3N0ZCwKKwkJCSB1bnNpZ25lZCBpbnQgZGF0YV9yYXRlLAorCQkJIHVuc2lnbmVkIGludCB0YXBlX2xlbikKK3sKKwlpbnQgc3BlZWQ7CQkvKiBkZWNpLWlwcyAhICovCisJaW50IGZmX3NwZWVkOworCWludCBsZW5ndGg7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwZSB0cmFuc3BvcnQgc3BlZWQKKwkgKiAgZGF0YSByYXRlOiAgICAgICAgUUlDLTQwICAgUUlDLTgwICAgUUlDLTMwMTAgUUlDLTMwMjAKKwkgKgorCSAqICAgIDI1MCBLYnBzICAgICAgICAyNSBpcHMgICAgIG4vYSAgICAgIG4vYSAgICAgIG4vYQorCSAqICAgIDUwMCBLYnBzICAgICAgICA1MCBpcHMgICAzNCBpcHMgICAyMi42IGlwcyAgIG4vYQorCSAqICAgICAgMSBNYnBzICAgICAgICAgIG4vYSAgICA2OCBpcHMgICA0NS4yIGlwcyAyMi42IGlwcworCSAqICAgICAgMiBNYnBzICAgICAgICAgIG4vYSAgICAgIG4vYSAgICAgIG4vYSAgICA0NS4yIGlwcworCSAqCisJICogIGZhc3QgdGFwZSB0cmFuc3BvcnQgc3BlZWQgaXMgYXQgbGVhc3QgNjggaXBzLgorCSAqLworCXN3aXRjaCAocWljX3N0ZCkgeworCWNhc2UgUUlDX1RBUEVfUUlDNDA6CisJCXNwZWVkID0gKGRhdGFfcmF0ZSA9PSAyNTApID8gMjUwIDogNTAwOworCQlicmVhazsKKwljYXNlIFFJQ19UQVBFX1FJQzgwOgorCQlzcGVlZCA9IChkYXRhX3JhdGUgPT0gNTAwKSA/IDM0MCA6IDY4MDsKKwkJYnJlYWs7CisJY2FzZSBRSUNfVEFQRV9RSUMzMDEwOgorCQlzcGVlZCA9IChkYXRhX3JhdGUgPT0gNTAwKSA/IDIyNiA6IDQ1MjsKKwkJYnJlYWs7CisJY2FzZSBRSUNfVEFQRV9RSUMzMDIwOgorCQlzcGVlZCA9IChkYXRhX3JhdGUgPT0gMTAwMCkgPyAyMjYgOiA0NTI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFKGZ0X3RfYnVnLCAiVW5rbm93biBxaWNfc3RkIChidWcpID8iKTsKKwkJc3BlZWQgPSA1MDA7CisJCWJyZWFrOworCX0KKwlpZiAoZnRfZHJpdmVfdHlwZS5zcGVlZCA9PSAwKSB7CisJCXVuc2lnbmVkIGxvbmcgdDA7CisJCXN0YXRpYyBpbnQgZHQgPSAwOyAgICAgLyoga2VlcCBnY2MgZnJvbSBjb21wbGFpbmluZyAqLworCQlzdGF0aWMgaW50IGZpcnN0X3RpbWUgPSAxOworCisJCS8qICBNZWFzdXJlIHRoZSB0aW1lIGl0IHRha2VzIHRvIHdpbmQgdG8gRU9UIGFuZCBiYWNrIHRvIEJPVC4KKwkJICogIElmIHRoZSB0YXBlIGxlbmd0aCBpcyBrbm93biwgY2FsY3VsYXRlIHRoZSByZXdpbmQgc3BlZWQuCisJCSAqICBFbHNlIGtlZXAgdGhlIHRpbWUgdmFsdWUgZm9yIGNhbGN1bGF0aW9uIG9mIHRoZSByZXdpbmQKKwkJICogIHNwZWVkIGxhdGVyIG9uLCB3aGVuIHRoZSBsZW5ndGggX2lzXyBrbm93bi4KKwkJICogIEFzayBmb3IgYSByZXBvcnQgb25seSB3aGVuIGxlbmd0aCBhbmQgc3BlZWQgYXJlIGJvdGgga25vd24uCisJCSAqLworCQlpZiAoZmlyc3RfdGltZSkgeworCQkJZnRhcGVfc2Vla190b19ib3QoKTsKKwkJCXQwID0gamlmZmllczsKKwkJCWZ0YXBlX3NlZWtfdG9fZW90KCk7CisJCQlmdGFwZV9zZWVrX3RvX2JvdCgpOworCQkJZHQgPSAoaW50KSAoKChqaWZmaWVzIC0gdDApICogRlRfVVNQVCkgLyAxMDAwKTsKKwkJCWlmIChkdCA8IDEpIHsKKwkJCQlkdCA9IDE7CS8qIHByZXZlbnQgZGl2IGJ5IHplcm8gb24gZmFpbHVyZXMgKi8KKwkJCX0KKwkJCWZpcnN0X3RpbWUgPSAwOworCQkJVFJBQ0UoZnRfdF9pbmZvLAorCQkJICAgICAgInRyeWluZyB0byBkZXRlcm1pbmUgc2VlayB0aW1lb3V0LCBnb3QgJWQgbXNlYyIsCisJCQkgICAgICBkdCk7CisJCX0KKwkJaWYgKHRhcGVfbGVuICE9IDApIHsKKwkJCWZ0X2RyaXZlX3R5cGUuc3BlZWQgPSAKKwkJCQkoMiAqIDEyICogdGFwZV9sZW4gKiAxMDAwKSAvIGR0OworCQkJVFJBQ0UoZnRfdF93YXJuLCAiXG4iCisJCSAgICAgS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKKwkJICAgICBLRVJOX0lORk8gImRyaXZlIHR5cGU6ICVzXG4iCisJCSAgICAgS0VSTl9JTkZPICJkZWx0YSB0aW1lID0gJWQgbXMsIGxlbmd0aCA9ICVkIGZ0XG4iCisJCSAgICAgS0VSTl9JTkZPICJoYXMgYSBtYXhpbXVtIHRhcGUgc3BlZWQgb2YgJWQgaXBzXG4iCisJCSAgICAgS0VSTl9JTkZPICJwbGVhc2UgcmVwb3J0IHRoaXMgdG8gIlRIRV9GVEFQRV9NQUlOVEFJTkVSIlxuIgorCQkgICAgIEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IiwKKwkJCSAgICAgIGZ0X2RyaXZlX3R5cGUubmFtZSwgZHQsIHRhcGVfbGVuLCAKKwkJCSAgICAgIGZ0X2RyaXZlX3R5cGUuc3BlZWQpOworCQl9CisJfQorCS8qICBIYW5kbGUgdW5rbm93biBsZW5ndGggdGFwZXMgYXMgdmVyeSBsb25nIG9uZXMuIFdlJ2xsCisJICogIGRldGVybWluZSB0aGUgYWN0dWFsIGxlbmd0aCBmcm9tIGEgaGVhZGVyIHNlZ21lbnQgbGF0ZXIuCisJICogIFRoaXMgaXMgbm9ybWFsIGZvciBhbGwgbW9kZXJuIChXaWRlLFRSMS8yLzMpIGZvcm1hdHMuCisJICovCisJaWYgKHRhcGVfbGVuIDw9IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJICAgICAgIlVua25vd24gdGFwZSBsZW5ndGgsIHVzaW5nIG1heGltYWwgdGltZW91dHMiKTsKKwkJbGVuZ3RoID0gUUlDX1RPUF9UQVBFX0xFTjsJLyogdXNlIHdvcnN0IGNhc2UgdmFsdWVzICovCisJfSBlbHNlIHsKKwkJbGVuZ3RoID0gdGFwZV9sZW47CQkvKiB1c2UgYWN0dWFsIHZhbHVlcyAqLworCX0KKwlpZiAoZnRfZHJpdmVfdHlwZS5zcGVlZCA9PSAwKSB7CisJCWZmX3NwZWVkID0gc3BlZWQ7IAorCX0gZWxzZSB7CisJCWZmX3NwZWVkID0gZnRfZHJpdmVfdHlwZS5zcGVlZDsKKwl9CisJLyogIHRpbWUgdG8gZ28gZnJvbSBib3QgdG8gZW90IGF0IG5vcm1hbCBzcGVlZCAoZGF0YSByYXRlKToKKwkgKiAgdGltZSA9ICgxK2RlbHRhKSAqIGxlbmd0aCAoZnQpICogMTIgKGluY2gvZnQpIC8gc3BlZWQgKGlwcykKKwkgKiAgZGVsdGEgPSAxMCAlIGZvciBzZWVrIHNwZWVkLCAyMCAlIGZvciByZXdpbmQgc3BlZWQuCisJICovCisJZnRhcGVfdGltZW91dC5zZWVrID0gKGxlbmd0aCAqIDEzMiAqIEZUX1NFQ09ORCkgLyBzcGVlZDsKKwlmdGFwZV90aW1lb3V0LnJld2luZCA9IChsZW5ndGggKiAxNDQgKiBGVF9TRUNPTkQpIC8gKDEwICogZmZfc3BlZWQpOworCWZ0YXBlX3RpbWVvdXQucmVzZXQgPSAyMCAqIEZUX1NFQ09ORCArIGZ0YXBlX3RpbWVvdXQucmV3aW5kOworCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0aW1lb3V0cyBmb3Igc3BlZWQgPSAlZCwgbGVuZ3RoID0gJWRcbiIKKwkgICAgICBLRVJOX0lORk8gInNlZWsgdGltZW91dCAgOiAlZCBzZWNcbiIKKwkgICAgICBLRVJOX0lORk8gInJld2luZCB0aW1lb3V0OiAlZCBzZWNcbiIKKwkgICAgICBLRVJOX0lORk8gInJlc2V0IHRpbWVvdXQgOiAlZCBzZWMiLAorCSAgICAgIHNwZWVkLCBsZW5ndGgsCisJICAgICAgKGZ0YXBlX3RpbWVvdXQuc2VlayArIDUwMCkgLyAxMDAwLAorCSAgICAgIChmdGFwZV90aW1lb3V0LnJld2luZCArIDUwMCkgLyAxMDAwLAorCSAgICAgIChmdGFwZV90aW1lb3V0LnJlc2V0ICsgNTAwKSAvIDEwMDApOworCVRSQUNFX0VYSVQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gY2FsaWJyYXRlcyB0aGUgZGF0YXJhdGUgKGkuZS4gZGV0ZXJtaW5lcyB0aGUgbWF4aW1hbAorICogdXNhYmxlIGRhdGEgcmF0ZSkgYW5kIHNldHMgdGhlIGdsb2JhbCB2YXJpYWJsZSBmdF9xaWNfc3RkIHRvIHFpY19zdGQKKyAqCisgKi8KK2ludCBmdGFwZV9jYWxpYnJhdGVfZGF0YV9yYXRlKHVuc2lnbmVkIGludCBxaWNfc3RkKQoreworCWludCByYXRlID0gZnRfZmRjX3JhdGVfbGltaXQ7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWZ0X3FpY19zdGQgPSBxaWNfc3RkOworCisJaWYgKGZ0X3FpY19zdGQgPT0gLTEpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCSJVbmFibGUgdG8gZGV0ZXJtaW5lIGRhdGEgcmF0ZSBpZiBRSUMgc3RhbmRhcmQgaXMgdW5rbm93biIpOworCX0KKworCS8qICBTZWxlY3QgaGlnaGVzdCByYXRlIHN1cHBvcnRlZCBieSBib3RoIGZkYyBhbmQgZHJpdmUuCisJICogIFN0YXJ0IHdpdGggaGlnaGVzdCByYXRlIHN1cHBvcnRlZCBieSB0aGUgZmRjLgorCSAqLworCXdoaWxlIChmZGNfc2V0X2RhdGFfcmF0ZShyYXRlKSA8IDAgJiYgcmF0ZSA+IDI1MCkgeworCQlyYXRlIC89IDI7CisJfQorCVRSQUNFKGZ0X3RfaW5mbywKKwkgICAgICAiSGlnaGVzdCBGREMgc3VwcG9ydGVkIGRhdGEgcmF0ZTogJWQgS2JwcyIsIHJhdGUpOworCWZ0X2ZkY19tYXhfcmF0ZSA9IHJhdGU7CisJZG8geworCQlyZXN1bHQgPSBmdGFwZV9zZXRfZGF0YV9yYXRlKHJhdGUsIGZ0X3FpY19zdGQpOworCX0gd2hpbGUgKHJlc3VsdCA9PSAtRUlOVkFMICYmIChyYXRlIC89IDIpID4gMjUwKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgInNldCBkYXRhcmF0ZSBmYWlsZWQiKTsKKwl9CisJZnRfZGF0YV9yYXRlID0gcmF0ZTsKKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgZnRhcGVfaW5pdF9kcml2ZSh2b2lkKQoreworCWludCBzdGF0dXM7CisJcWljX21vZGVsIG1vZGVsOworCXVuc2lnbmVkIGludCBxaWNfc3RkOworCXVuc2lnbmVkIGludCBkYXRhX3JhdGU7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlmdGFwZV9pbml0X2RyaXZlX25lZWRlZCA9IDA7IC8qIGRvbid0IHJldHJ5IGlmIHRoaXMgZmFpbHMgPyAqLworCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9yYXdfZHJpdmVfc3RhdHVzKCZzdGF0dXMpLCk7CisJaWYgKHN0YXR1cyAmIFFJQ19TVEFUVVNfQ0FSVFJJREdFX1BSRVNFTlQpIHsKKwkJaWYgKCEoc3RhdHVzICYgUUlDX1NUQVRVU19BVF9CT1QpKSB7CisJCQkvKiAgQW50aXF1ZSBkcml2ZXMgd2lsbCBnZXQgaGVyZSBhZnRlciBhIHNvZnQgcmVzZXQsCisJCQkgKiAgbW9kZXJuIG9uZXMgb25seSBpZiB0aGUgZHJpdmVyIGlzIGxvYWRlZCB3aGVuIHRoZQorCQkJICogIHRhcGUgd2Fzbid0IHJld291bmQgcHJvcGVybHkuCisJCQkgKi8KKwkJCS8qIFRhcGUgc2hvdWxkIGJlIGF0IGJvdCBpZiBuZXcgY2FydHJpZGdlICEgKi8KKwkJCWZ0YXBlX3NlZWtfdG9fYm90KCk7CisJCX0KKwkJaWYgKCEoc3RhdHVzICYgUUlDX1NUQVRVU19SRUZFUkVOQ0VEKSkgeworCQkJVFJBQ0UoZnRfdF9mbG93LCAic3RhcnRpbmcgc2Vla19sb2FkX3BvaW50Iik7CisJCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kX3dhaXQoUUlDX1NFRUtfTE9BRF9QT0lOVCwKKwkJCQkJCSAgICAgICBmdGFwZV90aW1lb3V0LnJlc2V0LAorCQkJCQkJICAgICAgICZzdGF0dXMpLCk7CisJCX0KKwl9CisJZnRfZm9ybWF0dGVkID0gKHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVGRVJFTkNFRCkgIT0gMDsKKwlpZiAoIWZ0X2Zvcm1hdHRlZCkgeworCQlUUkFDRShmdF90X3dhcm4sICJXYXJuaW5nOiB0YXBlIGlzIG5vdCBmb3JtYXR0ZWQgISIpOworCX0KKworCS8qICByZXBvcnQgY29uZmlndXJhdGlvbiBhYm9ydHMgd2hlbiBmdGFwZV90YXBlX2xlbiA9PSAtMQorCSAqICB1bmtub3duIHFpY19zdGQgaXMgb2theSBpZiBub3QgZm9ybWF0dGVkLgorCSAqLworCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9jb25maWd1cmF0aW9uKCZtb2RlbCwKKwkJCQkJICAgICAgICZkYXRhX3JhdGUsCisJCQkJCSAgICAgICAmcWljX3N0ZCwKKwkJCQkJICAgICAgICZmdGFwZV90YXBlX2xlbiksKTsKKworCS8qICBNYXliZSBhZGQgdGhlIGZvbGxvd2luZyB0byB0aGUgL3Byb2MgZW50cnkKKwkgKi8KKwlUUkFDRShmdF90X2luZm8sICIlcyBkcml2ZSBAICVkIEticHMiLAorCSAgICAgIChtb2RlbCA9PSBwcmVoaXN0b3JpYykgPyAicHJlaGlzdG9yaWMiIDoKKwkgICAgICAoKG1vZGVsID09IHByZV9xaWMxMTdjKSA/ICJwcmUgUUlDLTExN0MiIDoKKwkgICAgICAgKChtb2RlbCA9PSBwb3N0X3FpYzExN2IpID8gInBvc3QgUUlDLTExN0IiIDoKKwkJInBvc3QgUUlDLTExN0QiKSksIGRhdGFfcmF0ZSk7CisKKwlpZiAoZnRfZm9ybWF0dGVkKSB7CisJCS8qICBpbml0aWFsaXplIGZ0X3VzZWRfZGF0YV9yYXRlIHRvIG1heGltdW0gdmFsdWUgCisJCSAqICBhbmQgc2V0IGZ0X3FpY19zdGQKKwkJICovCisJCVRSQUNFX0NBVENIKGZ0YXBlX2NhbGlicmF0ZV9kYXRhX3JhdGUocWljX3N0ZCksKTsKKwkJaWYgKGZ0YXBlX3RhcGVfbGVuID09IDApIHsKKwkJCVRSQUNFKGZ0X3RfaW5mbywgInVua25vd24gbGVuZ3RoIFFJQy0lcyB0YXBlIiwKKwkJCSAgICAgIChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzQwKSA/ICI0MCIgOgorCQkJICAgICAgKChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzgwKSA/ICI4MCIgOgorCQkJICAgICAgICgoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUMzMDEwKSAKKwkJCQk/ICIzMDEwIiA6ICIzMDIwIikpKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3RfaW5mbywgIiVkIGZ0LiBRSUMtJXMgdGFwZSIsIGZ0YXBlX3RhcGVfbGVuLAorCQkJICAgICAgKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDNDApID8gIjQwIiA6CisJCQkgICAgICAoKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDODApID8gIjgwIiA6CisJCQkgICAgICAgKChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzMwMTApCisJCQkJPyAiMzAxMCIgOiAiMzAyMCIpKSk7CisJCX0KKwkJZnRhcGVfY2FsY190aW1lb3V0cyhmdF9xaWNfc3RkLCBmdF9kYXRhX3JhdGUsIGZ0YXBlX3RhcGVfbGVuKTsKKwkJLyogc29mdCB3cml0ZS1wcm90ZWN0IFFJQy00MC9RSUMtODAgY2FydHJpZGdlcyB1c2VkIHdpdGggYQorCQkgKiBDb2xvcmFkbyBUMzAwMCBkcml2ZS4gQnVnZ3kgaGFyZHdhcmUhCisJCSAqLworCQlpZiAoKGZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkID09IDB4MDExYzYpICYmCisJCSAgICAoKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDNDAgfHwKKwkJICAgICAgZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM4MCkgJiYKKwkJICAgICAhZnRfd3JpdGVfcHJvdGVjdGVkKSkgeworCQkJVFJBQ0UoZnRfdF93YXJuLCAiXG4iCisJS0VSTl9JTkZPICJUaGUgZmFtb3VzIENvbG9yYWRvIFQzMDAwIGJ1ZzpcbiIKKwlLRVJOX0lORk8gIiVzIGRyaXZlcyBjYW4ndCB3cml0ZSBRSUM0MCBhbmQgUUlDODBcbiIKKwlLRVJOX0lORk8gImNhcnRyaWRnZXMgYnV0IGRvbid0IHNldCB0aGUgd3JpdGUtcHJvdGVjdCBmbGFnISIsCisJCQkgICAgICBmdF9kcml2ZV90eXBlLm5hbWUpOworCQkJZnRfd3JpdGVfcHJvdGVjdGVkID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qICBEb2Vzbid0IG1ha2UgdG9vIG11Y2ggc2Vuc2UgdG8gc2V0IHRoZSBkYXRhIHJhdGUKKwkJICogIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSBmb3IgdGhlIHdyaXRlCisJCSAqICBwcmVjb21wZW5zYXRpb24uCisJCSAqICBOZWVkIHRvIGRvIHRoaXMgYWdhaW4gd2hlbiBmb3JtYXR0aW5nIHRoZSBjYXJ0cmlkZ2UuCisJCSAqLworCQlmdF9kYXRhX3JhdGUgPSBkYXRhX3JhdGU7CisJCWZ0YXBlX2NhbGNfdGltZW91dHMoUUlDX1RBUEVfUUlDNDAsCisJCQkJICAgIGRhdGFfcmF0ZSwKKwkJCQkgICAgZnRhcGVfdGFwZV9sZW4pOworCX0KKwlmdGFwZV9uZXdfY2FydHJpZGdlKCk7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgdm9pZCBmdGFwZV9tdW5tYXAodm9pZCkKK3sKKwlpbnQgaTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgZnRfbnJfYnVmZmVyczsgaSsrKSB7CisJCWZ0X2J1ZmZlcltpXS0+bW1hcHBlZCA9IDA7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qICAgTWFwIHRoZSBkbWEgYnVmZmVycyBpbnRvIHRoZSB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UgZ2l2ZW4gYnkgdm1hLgorICogICBXZSBvbmx5IGNoZWNrIHRoZSBjYWxsZXIgZG9lc24ndCBtYXAgbm9uLWV4aXN0ZW50IGJ1ZmZlcnMuIFdlCisgKiAgIGRvbid0IGNoZWNrIGZvciBtdWx0aXBsZSBtYXBwaW5ncy4KKyAqLworaW50IGZ0YXBlX21tYXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaW50IG51bV9idWZmZXJzOworCWludCBpOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmIChmdF9mYWlsdXJlKSB7CisJCVRSQUNFX0VYSVQgLUVOT0RFVjsKKwl9CisJaWYgKCEodm1hLT52bV9mbGFncyAmIChWTV9SRUFEfFZNX1dSSVRFKSkpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9lcnIsICJVbmRlZmluZWQgbW1hcCgpIGFjY2VzcyIpOworCX0KKwlpZiAodm1hX2dldF9wZ29mZih2bWEpICE9IDApIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9lcnIsICJwYWdlIG9mZnNldCBtdXN0IGJlIDAiKTsKKwl9CisJaWYgKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpICUgRlRfQlVGRl9TSVpFICE9IDApIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9lcnIsCisJCQkgICAgInNpemUgPSAlbGQsIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mICVkIiwKKwkJCSAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgRlRfQlVGRl9TSVpFKTsKKwl9CisJbnVtX2J1ZmZlcnMgPSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAvIEZUX0JVRkZfU0laRTsKKwlpZiAobnVtX2J1ZmZlcnMgPiBmdF9ucl9idWZmZXJzKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsCisJCQkgICAgZnRfdF9lcnIsICJzaXplID0gJWxkLCBzaG91bGQgYmUgbGVzcyB0aGFuICVkIiwKKwkJCSAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgZnRfbnJfYnVmZmVycyAqIEZUX0JVRkZfU0laRSk7CisJfQorCWlmIChmdF9kcml2ZXJfc3RhdGUgIT0gaWRsZSkgeworCQkvKiB0aGlzIGFsc28gY2xlYXJzIHRoZSBidWZmZXIgc3RhdGVzIAorCQkgKi8KKwkJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7CisJfSBlbHNlIHsKKwkJZnRhcGVfcmVzZXRfYnVmZmVyKCk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgcGZuOworCisJCXBmbiA9IHZpcnRfdG9fcGh5cyhmdF9idWZmZXJbaV0tPmFkZHJlc3MpID4+IFBBR0VfU0hJRlQ7CisJCVRSQUNFX0NBVENIKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQgKworCQkJCQkgICAgIGkgKiBGVF9CVUZGX1NJWkUsCisJCQkJCSAgICAgcGZuLAorCQkJCQkgICAgIEZUX0JVRkZfU0laRSwKKwkJCQkJICAgICB2bWEtPnZtX3BhZ2VfcHJvdCksCisJCQkgICAgX3JlcyA9IC1FQUdBSU4pOworCQlUUkFDRShmdF90X25vaXNlLCAicmVtYXBwZWQgZG1hIGJ1ZmZlciBAICVwIHRvIGxvY2F0aW9uIEAgJXAiLAorCQkgICAgICBmdF9idWZmZXJbaV0tPmFkZHJlc3MsCisJCSAgICAgICh2b2lkICopKHZtYS0+dm1fc3RhcnQgKyBpICogRlRfQlVGRl9TSVpFKSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgaSsrKSB7CisJCW1lbXNldChmdF9idWZmZXJbaV0tPmFkZHJlc3MsIDB4QUEsIEZUX0JVRkZfU0laRSk7CisJCWZ0X2J1ZmZlcltpXS0+bW1hcHBlZCsrOworCX0JCisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgdm9pZCBmdGFwZV9pbml0X2RyaXZlcih2b2lkKTsgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworCisvKiAgICAgIE9QRU4gcm91dGluZSBjYWxsZWQgYnkga2VybmVsLWludGVyZmFjZSBjb2RlCisgKi8KK2ludCBmdGFwZV9lbmFibGUoaW50IGRyaXZlX3NlbGVjdGlvbikKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGZ0X2RyaXZlX3NlbCA9PSAtMSB8fCBmdF9kcml2ZV9zZWwgIT0gZHJpdmVfc2VsZWN0aW9uKSB7CisJCS8qIE90aGVyIHNlbGVjdGlvbiB0aGFuIGxhc3QgdGltZQorCQkgKi8KKwkJZnRhcGVfaW5pdF9kcml2ZXIoKTsKKwl9CisJZnRfZHJpdmVfc2VsID0gRlRBUEVfU0VMKGRyaXZlX3NlbGVjdGlvbik7CisJZnRfZmFpbHVyZSA9IDA7CisJVFJBQ0VfQ0FUQ0goZmRjX2luaXQoKSwpOyAvKiBpbml0ICYgZGV0ZWN0IGZkYyAqLworCVRSQUNFX0NBVENIKGZ0YXBlX2FjdGl2YXRlX2RyaXZlKCZmdF9kcml2ZV90eXBlKSwKKwkJICAgIGZkY19kaXNhYmxlKCk7CisJCSAgICBmZGNfcmVsZWFzZV9pcnFfYW5kX2RtYSgpOworCQkgICAgZmRjX3JlbGVhc2VfcmVnaW9ucygpKTsKKwlUUkFDRV9DQVRDSChmdGFwZV9nZXRfZHJpdmVfc3RhdHVzKCksIGZ0YXBlX2RldGFjaF9kcml2ZSgpKTsKKwlpZiAoZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQgPT0gVU5LTk9XTl9WRU5ET1IpIHsKKwkJZnRhcGVfbG9nX3ZlbmRvcl9pZCgpOworCX0KKwlpZiAoZnRfbmV3X3RhcGUpIHsKKwkJZnRhcGVfaW5pdF9kcml2ZV9uZWVkZWQgPSAxOworCX0KKwlpZiAoIWZ0X25vX3RhcGUgJiYgZnRhcGVfaW5pdF9kcml2ZV9uZWVkZWQpIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfaW5pdF9kcml2ZSgpLCBmdGFwZV9kZXRhY2hfZHJpdmUoKSk7CisJfQorCWZ0YXBlX211bm1hcCgpOyAvKiBjbGVhciB0aGUgbW1hcCBmbGFnICovCisJY2xlYXJfaGlzdG9yeSgpOworCVRSQUNFX0VYSVQgMDsKK30KKworLyogICByZWxlYXNlIHJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBoaWdoIGxldmVsIGludGVyZmFjZSBtb2R1bGVzCisgKiAgIHpmdGFwZSBvciBzZnRhcGUuCisgKi8KK3ZvaWQgZnRhcGVfZGlzYWJsZSh2b2lkKQoreworCWludCBpOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnRfbnJfYnVmZmVyczsgaSsrKSB7CisJCWlmIChmdF9idWZmZXJbaV0tPm1tYXBwZWQpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJmaXJzdCBieXRlIG9mIGJ1ZmZlciAlZDogMHglMDJ4IiwKKwkJCSAgICAgIGksICpmdF9idWZmZXJbaV0tPmFkZHJlc3MpOworCQl9CisJfQorCWlmIChzaWd0ZXN0c2V0bWFzaygmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIF9ET05UX0JMT0NLKSAmJiAKKwkgICAgIShzaWd0ZXN0c2V0bWFzaygmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIF9ORVZFUl9CTE9DSykpICYmCisJICAgIGZ0YXBlX3RhcGVfcnVubmluZykgeworCQlUUkFDRShmdF90X3dhcm4sCisJCSAgICAgICJJbnRlcnJ1cHRlZCBieSBmYXRhbCBzaWduYWwgYW5kIHRhcGUgc3RpbGwgcnVubmluZyIpOworCQlmdGFwZV9kdW1iX3N0b3AoKTsKKwkJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7IC8qIGl0J3MgYW5ub3lpbmcgKi8KKwl9IGVsc2UgeworCQlmdGFwZV9zZXRfc3RhdGUoaWRsZSk7CisJfQorCWZ0YXBlX2RldGFjaF9kcml2ZSgpOworCWlmIChmdF9oaXN0b3J5LnVzZWQpIHsKKwkJVFJBQ0UoZnRfdF9pbmZvLCAiPT0gTm9uLWZhdGFsIGVycm9ycyB0aGlzIHJ1bjogPT0iKTsKKwkJVFJBQ0UoZnRfdF9pbmZvLCAiZmRjIGlzciBzdGF0aXN0aWNzOlxuIgorCQkgICAgICBLRVJOX0lORk8gIiBpZF9hbV9lcnJvcnMgICAgIDogJTNkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiIGlkX2NyY19lcnJvcnMgICAgOiAlM2RcbiIKKwkJICAgICAgS0VSTl9JTkZPICIgZGF0YV9hbV9lcnJvcnMgICA6ICUzZFxuIgorCQkgICAgICBLRVJOX0lORk8gIiBkYXRhX2NyY19lcnJvcnMgIDogJTNkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiIG92ZXJydW5fZXJyb3JzICAgOiAlM2RcbiIKKwkJICAgICAgS0VSTl9JTkZPICIgbm9fZGF0YV9lcnJvcnMgICA6ICUzZFxuIgorCQkgICAgICBLRVJOX0lORk8gIiByZXRyaWVzICAgICAgICAgIDogJTNkIiwKKwkJICAgICAgZnRfaGlzdG9yeS5pZF9hbV9lcnJvcnMsICAgZnRfaGlzdG9yeS5pZF9jcmNfZXJyb3JzLAorCQkgICAgICBmdF9oaXN0b3J5LmRhdGFfYW1fZXJyb3JzLCBmdF9oaXN0b3J5LmRhdGFfY3JjX2Vycm9ycywKKwkJICAgICAgZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9ycywgZnRfaGlzdG9yeS5ub19kYXRhX2Vycm9ycywKKwkJICAgICAgZnRfaGlzdG9yeS5yZXRyaWVzKTsKKwkJaWYgKGZ0X2hpc3RvcnkudXNlZCAmIDEpIHsKKwkJCVRSQUNFKGZ0X3RfaW5mbywgImVjYyBzdGF0aXN0aWNzOlxuIgorCQkJICAgICAgS0VSTl9JTkZPICIgY3JjX2Vycm9ycyAgICAgICA6ICUzZFxuIgorCQkJICAgICAgS0VSTl9JTkZPICIgY3JjX2ZhaWx1cmVzICAgICA6ICUzZFxuIgorCQkJICAgICAgS0VSTl9JTkZPICIgZWNjX2ZhaWx1cmVzICAgICA6ICUzZFxuIgorCQkJICAgICAgS0VSTl9JTkZPICIgc2VjdG9ycyBjb3JyZWN0ZWQ6ICUzZCIsCisJCQkgICAgICBmdF9oaXN0b3J5LmNyY19lcnJvcnMsICAgZnRfaGlzdG9yeS5jcmNfZmFpbHVyZXMsCisJCQkgICAgICBmdF9oaXN0b3J5LmVjY19mYWlsdXJlcywgZnRfaGlzdG9yeS5jb3JyZWN0ZWQpOworCQl9CisJCWlmIChmdF9oaXN0b3J5LmRlZmVjdHMgPiAwKSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJXYXJuaW5nOiAlZCBtZWRpYSBkZWZlY3RzISIsCisJCQkgICAgICBmdF9oaXN0b3J5LmRlZmVjdHMpOworCQl9CisJCWlmIChmdF9oaXN0b3J5LnJld2luZHMgPiAwKSB7CisJCQlUUkFDRShmdF90X2luZm8sICJ0YXBlIG1vdGlvbiBzdGF0aXN0aWNzOlxuIgorCQkJICAgICAgS0VSTl9JTkZPICJyZXBvc2l0aW9ucyAgICAgICA6ICUzZCIsCisJCQkgICAgICBmdF9oaXN0b3J5LnJld2luZHMpOworCQl9CisJfQorCWZ0X2ZhaWx1cmUgPSAxOworCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIGZ0YXBlX2luaXRfZHJpdmVyKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCA9IFVOS05PV05fVkVORE9SOworCWZ0X2RyaXZlX3R5cGUuc3BlZWQgICAgID0gMDsKKwlmdF9kcml2ZV90eXBlLndha2VfdXAgICA9IHVua25vd25fd2FrZV91cDsKKwlmdF9kcml2ZV90eXBlLm5hbWUgICAgICA9ICJVbmtub3duIjsKKworCWZ0YXBlX3RpbWVvdXQuc2VlayAgICAgID0gNjUwICogRlRfU0VDT05EOworCWZ0YXBlX3RpbWVvdXQucmVzZXQgICAgID0gNjcwICogRlRfU0VDT05EOworCWZ0YXBlX3RpbWVvdXQucmV3aW5kICAgID0gNjUwICogRlRfU0VDT05EOworCWZ0YXBlX3RpbWVvdXQuaGVhZF9zZWVrID0gIDE1ICogRlRfU0VDT05EOworCWZ0YXBlX3RpbWVvdXQuc3RvcCAgICAgID0gICA1ICogRlRfU0VDT05EOworCWZ0YXBlX3RpbWVvdXQucGF1c2UgICAgID0gIDE2ICogRlRfU0VDT05EOworCisJZnRfcWljX3N0ZCAgICAgICAgICAgICA9IC0xOworCWZ0YXBlX3RhcGVfbGVuICAgICAgICAgPSAwOyAgLyogdW5rbm93biAqLworCWZ0YXBlX2N1cnJlbnRfY29tbWFuZCAgPSAwOworCWZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPSAtMTsKKworCWZ0X3NlZ21lbnRzX3Blcl90cmFjayAgICAgICA9IDEwMjsKKwlmdGFwZV9zZWdtZW50c19wZXJfaGVhZCAgICAgPSAxMDIwOworCWZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciA9IDQ7CisJZnRfdHJhY2tzX3Blcl90YXBlICAgICAgICAgID0gMjA7CisKKwlmdF9mYWlsdXJlID0gMTsKKworCWZ0X2Zvcm1hdHRlZCAgICAgICA9IDA7CisJZnRfbm9fdGFwZSAgICAgICAgID0gMTsKKwlmdF93cml0ZV9wcm90ZWN0ZWQgPSAxOworCWZ0X25ld190YXBlICAgICAgICA9IDE7CisKKwlmdF9kcml2ZXJfc3RhdGUgPSBpZGxlOworCisJZnRfZGF0YV9yYXRlID0gCisJCWZ0X2ZkY19tYXhfcmF0ZSAgID0gNTAwOworCWZ0X2RyaXZlX21heF9yYXRlID0gMDsgLyogdHJpZ2dlcnMgc2V0X3JhdGVfdGVzdCgpICovCisKKwlmdGFwZV9pbml0X2RyaXZlX25lZWRlZCA9IDE7CisKKwlmdF9oZWFkZXJfc2VnbWVudF8xICAgID0gLTE7CisJZnRfaGVhZGVyX3NlZ21lbnRfMiAgICA9IC0xOworCWZ0X3VzZWRfaGVhZGVyX3NlZ21lbnQgPSAtMTsKKwlmdF9maXJzdF9kYXRhX3NlZ21lbnQgID0gLTE7CisJZnRfbGFzdF9kYXRhX3NlZ21lbnQgICA9IC0xOworCisJZnRfbG9jYXRpb24udHJhY2sgPSAtMTsKKwlmdF9sb2NhdGlvbi5rbm93biA9IDA7CisKKwlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCWZ0YXBlX21pZ2h0X2JlX29mZl90cmFjayA9IDE7CisKKwlmdGFwZV9uZXdfY2FydHJpZGdlKCk7CS8qIGluaXQgc29tZSB0YXBlIHJlbGF0ZWQgdmFyaWFibGVzICovCisJZnRhcGVfaW5pdF9ic20oKTsKKwlUUkFDRV9FWElUOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWN0bC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWN0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNWUzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY3RsLmgKQEAgLTAsMCArMSwxNjIgQEAKKyNpZm5kZWYgX0ZUQVBFX0NUTF9ICisjZGVmaW5lIF9GVEFQRV9DVExfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY3RsLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODowOSAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG5vbi1zdGFuZGFyZCBJT0NUTCByZWxhdGVkIGRlZmluaXRpb25zCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IKKyAqICAgICAgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvbXRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLXZlbmRvcnMuaD4KKworI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCisjaW5jbHVkZSA8bGludXgvZnRhcGUtaGVhZGVyLXNlZ21lbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB1c2VkOwkJLyogYW55IHJlYWRpbmcgb3Igd3JpdGluZyBkb25lICovCisJLyogaXNyIHN0YXRpc3RpY3MgKi8KKwl1bnNpZ25lZCBpbnQgaWRfYW1fZXJyb3JzOwkvKiBpZCBhZGRyZXNzIG1hcmsgbm90IGZvdW5kICovCisJdW5zaWduZWQgaW50IGlkX2NyY19lcnJvcnM7CS8qIGNyYyBlcnJvciBpbiBpZCBhZGRyZXNzIG1hcmsgKi8KKwl1bnNpZ25lZCBpbnQgZGF0YV9hbV9lcnJvcnM7CS8qIGRhdGEgYWRkcmVzcyBtYXJrIG5vdCBmb3VuZCAqLworCXVuc2lnbmVkIGludCBkYXRhX2NyY19lcnJvcnM7CS8qIGNyYyBlcnJvciBpbiBkYXRhIGZpZWxkICovCisJdW5zaWduZWQgaW50IG92ZXJydW5fZXJyb3JzOwkvKiBmZGMgYWNjZXNzIHRpbWluZyBwcm9ibGVtICovCisJdW5zaWduZWQgaW50IG5vX2RhdGFfZXJyb3JzOwkvKiBzZWN0b3Igbm90IGZvdW5kICovCisJdW5zaWduZWQgaW50IHJldHJpZXM7CS8qIG51bWJlciBvZiB0YXBlIHJldHJpZXMgKi8KKwkvKiBlY2Mgc3RhdGlzdGljcyAqLworCXVuc2lnbmVkIGludCBjcmNfZXJyb3JzOwkvKiBjcmMgZXJyb3IgaW4gZGF0YSAqLworCXVuc2lnbmVkIGludCBjcmNfZmFpbHVyZXM7CS8qIGJhZCBkYXRhIHdpdGhvdXQgY3JjIGVycm9yICovCisJdW5zaWduZWQgaW50IGVjY19mYWlsdXJlczsJLyogZmFpbGVkIHRvIGNvcnJlY3QgKi8KKwl1bnNpZ25lZCBpbnQgY29ycmVjdGVkOwkvKiB0b3RhbCBzZWN0b3JzIGNvcnJlY3RlZCAqLworCS8qIGdlbmVyYWwgc3RhdGlzdGljcyAqLworCXVuc2lnbmVkIGludCByZXdpbmRzOwkvKiBudW1iZXIgb2YgdGFwZSByZXdpbmRzICovCisJdW5zaWduZWQgaW50IGRlZmVjdHM7CS8qIGJhZCBzZWN0b3JzIGR1ZSB0byBtZWRpYSBkZWZlY3RzICovCit9IGhpc3RvcnlfcmVjb3JkOworCisvKiB0aGlzIHN0cnVjdHVyZSBjb250YWlucyAqIEFMTCAqIGluZm9ybWF0aW9uIHRoYXQgd2Ugd2FudAorICogb3VyIGNoaWxkIG1vZHVsZXMgdG8ga25vdyBhYm91dCwgYnV0IGRvbid0IHdhbnQgdGhlbSB0bworICogbW9kaWZ5LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qICB2ZW5kb3IgaW5mb3JtYXRpb24gKi8KKwl2ZW5kb3Jfc3RydWN0IGZ0aV9kcml2ZV90eXBlOworCS8qICBkYXRhIHJhdGVzICovCisJdW5zaWduZWQgaW50IGZ0aV91c2VkX2RhdGFfcmF0ZTsKKwl1bnNpZ25lZCBpbnQgZnRpX2RyaXZlX21heF9yYXRlOworCXVuc2lnbmVkIGludCBmdGlfZmRjX21heF9yYXRlOworCS8qICBkcml2ZSBzZWxlY3Rpb24sIGVpdGhlciBGVEFQRV9TRUxfQS9CL0MvRCAqLworCWludCBmdGlfZHJpdmVfc2VsOyAgICAgIAorCS8qICBmbGFncyBzZXQgYWZ0ZXIgZGVjb2RlIHRoZSBkcml2ZSBhbmQgdGFwZSBzdGF0dXMgICAqLworCXVuc2lnbmVkIGludCBmdGlfZm9ybWF0dGVkICAgICAgOjE7CisJdW5zaWduZWQgaW50IGZ0aV9ub190YXBlICAgICAgICA6MTsKKwl1bnNpZ25lZCBpbnQgZnRpX3dyaXRlX3Byb3RlY3RlZDoxOworCXVuc2lnbmVkIGludCBmdGlfbmV3X3RhcGUgICAgICAgOjE7CisJLyogIHZhbHVlcyBvZiBsYXN0IHF1ZXJpZWQgZHJpdmUvdGFwZSBzdGF0dXMgYW5kIGVycm9yICovCisJZnRfZHJpdmVfZXJyb3IgIGZ0aV9sYXN0X2Vycm9yOworCWZ0X2RyaXZlX3N0YXR1cyBmdGlfbGFzdF9zdGF0dXM7CisJLyogIGNhcnRyaWRnZSBnZW9tZXRyeSAqLworCXVuc2lnbmVkIGludCBmdGlfdHJhY2tzX3Blcl90YXBlOworCXVuc2lnbmVkIGludCBmdGlfc2VnbWVudHNfcGVyX3RyYWNrOworCS8qICBsb2NhdGlvbiBvZiBoZWFkZXIgc2VnbWVudHMsIGV0Yy4gKi8KKwlpbnQgZnRpX3VzZWRfaGVhZGVyX3NlZ21lbnQ7CisJaW50IGZ0aV9oZWFkZXJfc2VnbWVudF8xOworCWludCBmdGlfaGVhZGVyX3NlZ21lbnRfMjsKKwlpbnQgZnRpX2ZpcnN0X2RhdGFfc2VnbWVudDsKKwlpbnQgZnRpX2xhc3RfZGF0YV9zZWdtZW50OworCS8qICB0aGUgZm9ybWF0IGNvZGUgYXMgc3RvcmVkIGluIHRoZSBoZWFkZXIgc2VnbWVudCAgKi8KKwlmdF9mb3JtYXRfdHlwZSAgZnRpX2Zvcm1hdF9jb2RlOworCS8qICB0aGUgZm9sbG93aW5nIGlzIHRoZSBzb2xlIHJlYXNvbiBmb3IgdGhlIGZ0YXBlX3NldF9zdGF0dXMoKSBjYWxsICovCisJdW5zaWduZWQgaW50IGZ0aV9xaWNfc3RkOworCS8qICBpcyB0YXBlIHJ1bm5pbmc/ICovCisJdm9sYXRpbGUgZW51bSBydW5uZXJfc3RhdHVzX2VudW0gZnRpX3J1bm5lcl9zdGF0dXM7CisJLyogIGlzIHRhcGUgcmVhZGluZy93cml0aW5nL3ZlcmlmeWluZy9mb3JtYXR0aW5nL2RlbGV0aW5nICovCisJYnVmZmVyX3N0YXRlX2VudW0gZnRpX3N0YXRlOworCS8qICBmbGFncyBmYXRhbCBoYXJkd2FyZSBlcnJvciAqLworCXVuc2lnbmVkIGludCBmdGlfZmFpbHVyZToxOworCS8qICBoaXN0b3J5IHJlY29yZCAqLworCWhpc3RvcnlfcmVjb3JkIGZ0aV9oaXN0b3J5OworfSBmdGFwZV9pbmZvOworCisvKiB2ZW5kb3IgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgZnRfZHJpdmVfdHlwZSAgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX2RyaXZlX3R5cGUKKy8qICBkYXRhIHJhdGVzICovCisjZGVmaW5lIGZ0X2RhdGFfcmF0ZSAgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV91c2VkX2RhdGFfcmF0ZQorI2RlZmluZSBmdF9kcml2ZV9tYXhfcmF0ZSAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfZHJpdmVfbWF4X3JhdGUKKyNkZWZpbmUgZnRfZmRjX21heF9yYXRlICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX2ZkY19tYXhfcmF0ZQorLyogIGRyaXZlIHNlbGVjdGlvbiwgZWl0aGVyIEZUQVBFX1NFTF9BL0IvQy9EICovCisjZGVmaW5lIGZ0X2RyaXZlX3NlbCAgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9kcml2ZV9zZWwKKy8qICBmbGFncyBzZXQgYWZ0ZXIgZGVjb2RlIHRoZSBkcml2ZSBhbmQgdGFwZSBzdGF0dXMgICAqLworI2RlZmluZSBmdF9mb3JtYXR0ZWQgICAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfZm9ybWF0dGVkCisjZGVmaW5lIGZ0X25vX3RhcGUgICAgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9ub190YXBlCisjZGVmaW5lIGZ0X3dyaXRlX3Byb3RlY3RlZCAgICAgZnRhcGVfc3RhdHVzLmZ0aV93cml0ZV9wcm90ZWN0ZWQKKyNkZWZpbmUgZnRfbmV3X3RhcGUgICAgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX25ld190YXBlCisvKiAgdmFsdWVzIG9mIGxhc3QgcXVlcmllZCBkcml2ZS90YXBlIHN0YXR1cyBhbmQgZXJyb3IgKi8KKyNkZWZpbmUgZnRfbGFzdF9lcnJvciAgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX2xhc3RfZXJyb3IKKyNkZWZpbmUgZnRfbGFzdF9zdGF0dXMgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX2xhc3Rfc3RhdHVzCisvKiAgY2FydHJpZGdlIGdlb21ldHJ5ICovCisjZGVmaW5lIGZ0X3RyYWNrc19wZXJfdGFwZSAgICAgZnRhcGVfc3RhdHVzLmZ0aV90cmFja3NfcGVyX3RhcGUKKyNkZWZpbmUgZnRfc2VnbWVudHNfcGVyX3RyYWNrICBmdGFwZV9zdGF0dXMuZnRpX3NlZ21lbnRzX3Blcl90cmFjaworLyogIHRoZSBmb3JtYXQgY29kZSBhcyBzdG9yZWQgaW4gdGhlIGhlYWRlciBzZWdtZW50ICAqLworI2RlZmluZSBmdF9mb3JtYXRfY29kZSAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfZm9ybWF0X2NvZGUKKy8qICB0aGUgcWljIHN0YXR1cyBhcyByZXR1cm5lZCBieSByZXBvcnQgZHJpdmUgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBmdF9xaWNfc3RkICAgICAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfcWljX3N0ZAorI2RlZmluZSBmdF91c2VkX2hlYWRlcl9zZWdtZW50IGZ0YXBlX3N0YXR1cy5mdGlfdXNlZF9oZWFkZXJfc2VnbWVudAorI2RlZmluZSBmdF9oZWFkZXJfc2VnbWVudF8xICAgIGZ0YXBlX3N0YXR1cy5mdGlfaGVhZGVyX3NlZ21lbnRfMQorI2RlZmluZSBmdF9oZWFkZXJfc2VnbWVudF8yICAgIGZ0YXBlX3N0YXR1cy5mdGlfaGVhZGVyX3NlZ21lbnRfMgorI2RlZmluZSBmdF9maXJzdF9kYXRhX3NlZ21lbnQgIGZ0YXBlX3N0YXR1cy5mdGlfZmlyc3RfZGF0YV9zZWdtZW50CisjZGVmaW5lIGZ0X2xhc3RfZGF0YV9zZWdtZW50ICAgZnRhcGVfc3RhdHVzLmZ0aV9sYXN0X2RhdGFfc2VnbWVudAorLyogIGlzIHRhcGUgcnVubmluZz8gKi8KKyNkZWZpbmUgZnRfcnVubmVyX3N0YXR1cyAgICAgICBmdGFwZV9zdGF0dXMuZnRpX3J1bm5lcl9zdGF0dXMKKy8qICBpcyB0YXBlIHJlYWRpbmcvd3JpdGluZy92ZXJpZnlpbmcvZm9ybWF0dGluZy9kZWxldGluZyAqLworI2RlZmluZSBmdF9kcml2ZXJfc3RhdGUgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfc3RhdGUKKy8qICBmbGFncyBmYXRhbCBoYXJkd2FyZSBlcnJvciAqLworI2RlZmluZSBmdF9mYWlsdXJlICAgICAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfZmFpbHVyZQorLyogIGhpc3RvcnkgcmVjb3JkICovCisjZGVmaW5lIGZ0X2hpc3RvcnkgICAgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9oaXN0b3J5CisKKy8qCisgKiAgICAgIGZ0YXBlLWN0bC5jIGRlZmluZWQgZ2xvYmFsIHZhcnMuCisgKi8KK2V4dGVybiBmdGFwZV9pbmZvIGZ0YXBlX3N0YXR1czsKK2V4dGVybiBpbnQgZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQ7CitleHRlcm4gaW50IGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlcjsKK2V4dGVybiBpbnQgZnRhcGVfaW5pdF9kcml2ZV9uZWVkZWQ7CisKKy8qCisgKiAgICAgIGZ0YXBlLWN0bC5jIGRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9ucy4KKyAqLworZXh0ZXJuIGludCAgZnRhcGVfbW1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CitleHRlcm4gaW50ICBmdGFwZV9lbmFibGUoaW50IGRyaXZlX3NlbGVjdGlvbik7CitleHRlcm4gdm9pZCBmdGFwZV9kaXNhYmxlKHZvaWQpOworZXh0ZXJuIGludCAgZnRhcGVfc2Vla190b19ib3Qodm9pZCk7CitleHRlcm4gaW50ICBmdGFwZV9zZWVrX3RvX2VvdCh2b2lkKTsKK2V4dGVybiBpbnQgIGZ0YXBlX2Fib3J0X29wZXJhdGlvbih2b2lkKTsKK2V4dGVybiB2b2lkIGZ0YXBlX2NhbGNfdGltZW91dHModW5zaWduZWQgaW50IHFpY19zdGQsCisJCQkJIHVuc2lnbmVkIGludCBkYXRhX3JhdGUsCisJCQkJIHVuc2lnbmVkIGludCB0YXBlX2xlbik7CitleHRlcm4gaW50ICBmdGFwZV9jYWxpYnJhdGVfZGF0YV9yYXRlKHVuc2lnbmVkIGludCBxaWNfc3RkKTsKK2V4dGVybiBjb25zdCBmdGFwZV9pbmZvICpmdGFwZV9nZXRfc3RhdHVzKHZvaWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZWNjLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZWNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2MzJmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1lY2MuYwpAQCAtMCwwICsxLDg1MyBAQAorLyoKKyAqCisgKiAgICAgIENvcHlyaWdodCAoYykgMTk5MyBOaW5nIGFuZCBEYXZpZCBNb3NiZXJnZXIuCisgCisgVGhpcyBpcyBiYXNlZCBvbiBjb2RlIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBCYXMgTGFhcmhvdmVuIChiYXNAdmltZWMubmwpCisgYW5kIERhdmlkIEwuIEJyb3duLCBKci4sIGFuZCBpbmNvcnBvcmF0ZXMgaW1wcm92ZW1lbnRzIHN1Z2dlc3RlZCBieQorIEthaSBIYXJyZWtpbGRlLVBldGVyc2VuLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZWNjLmMsdiAkCisgKiAkUmV2aXNpb246IDEuMyAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODoxMCAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFJlZWQtU29sb21vbiBlcnJvciBjb3JyZWN0aW9uIGNvZGUgCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwIGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtZWNjLmgiCisKKy8qIE1hY2hpbmVzIHRoYXQgYXJlIGJpZy1lbmRpYW4gc2hvdWxkIGRlZmluZSBtYWNybyBCSUdfRU5ESUFOLgorICogVW5mb3J0dW5hdGVseSwgdGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSBzdGFuZGFyZCBpbmNsdWRlIGZpbGUKKyAqIHRoYXQgd29ya3MgZm9yIGFsbCBPU3MuCisgKi8KKworI2lmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9faHBwYSkKKyNkZWZpbmUgQklHX0VORElBTgorI2VuZGlmCQkJCS8qIF9fc3BhcmNfXyB8fCBfX2hwcGEgKi8KKworI2lmIGRlZmluZWQoX19taXBzX18pCisjZXJyb3IgRmluZCBhIHNtYXJ0IHdheSB0byBkZXRlcm1pbmUgdGhlIEVuZGlhbm5lc3Mgb2YgdGhlIE1JUFMgQ1BVCisjZW5kaWYKKworLyogTm90aWNlOiB0byBtaW5pbWl6ZSB0aGUgcG90ZW50aWFsIGZvciBjb25mdXNpb24sIHdlIHVzZSByIHRvCisgKiAgICAgICAgIGRlbm90ZSB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGUgb2YgdGhlIHBvbHlub21pYWxzIGluIHRoZQorICogICAgICAgICBHYWxvaXMgRmllbGQgR0YoMl44KS4gIFdlIHJlc2VydmUgeCBmb3IgcG9seW5vbWlhbHMgdGhhdAorICogICAgICAgICB0aGF0IGhhdmUgY29lZmZpY2llbnRzIGluIEdGKDJeOCkuCisgKiAgICAgICAgIAorICogVGhlIEdhbG9pcyBGaWVsZCBpbiB3aGljaCBjb2VmZmljaWVudCBhcml0aG1ldGljIGlzIHBlcmZvcm1lZCBhcmUKKyAqIHRoZSBwb2x5bm9taWFscyBvdmVyIFpfMiAoaS5lLiwgMCBhbmQgMSkgbW9kdWxvIHRoZSBpcnJlZHVjaWJsZQorICogcG9seW5vbWlhbCBmKHIpLCB3aGVyZSBmKHIpPXJeOCArIHJeNyArIHJeMiArIHIgKyAxLiAgQSBwb2x5bm9taWFsCisgKiBpcyByZXByZXNlbnRlZCBhcyBhIGJ5dGUgd2l0aCB0aGUgTVNCIGFzIHRoZSBjb2VmZmljaWVudCBvZiByXjcgYW5kCisgKiB0aGUgTFNCIGFzIHRoZSBjb2VmZmljaWVudCBvZiByXjAuICBGb3IgZXhhbXBsZSwgdGhlIGJpbmFyeQorICogcmVwcmVzZW50YXRpb24gb2YgZih4KSBpcyAweDE4NyAob2YgY291cnNlLCB0aGlzIGRvZXNuJ3QgZml0IGludG8gOAorICogYml0cykuICBJbiB0aGlzIGZpZWxkLCB0aGUgcG9seW5vbWlhbCByIGlzIGEgcHJpbWl0aXZlIGVsZW1lbnQuCisgKiBUaGF0IGlzLCByXmkgd2l0aCBpIGluIDAsLi4uLDI1NSBlbnVtZXJhdGVzIGFsbCBlbGVtZW50cyBpbiB0aGUKKyAqIGZpZWxkLgorICoKKyAqIFRoZSBnZW5lcmF0b3IgcG9seW5vbWlhbCBmb3IgdGhlIFFJQy04MCBFQ0MgaXMKKyAqCisgKiAgICAgIGcoeCkgPSB4XjMgKyByXjEwNSp4XjIgKyByXjEwNSp4ICsgMQorICoKKyAqIHdoaWNoIGNhbiBiZSBmYWN0b3JlZCBpbnRvOgorICoKKyAqICAgICAgZyh4KSA9ICh4LXJeLTEpKHgtcl4wKSh4LXJeMSkKKyAqCisgKiB0aGUgYnl0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29lZmZpY2llbnRzIGFyZToKKyAqCisgKiAgICAgIHJeMTA1ID0gMHhjMAorICogICAgICByXi0xICA9IDB4YzMKKyAqICAgICAgcl4wICAgPSAweDAxCisgKiAgICAgIHJeMSAgID0gMHgwMgorICoKKyAqIE5vdGljZSB0aGF0IHJeLTEgPSByXjI1NCBhcyBleHBvbmVudCBhcml0aG1ldGljIGlzIHBlcmZvcm1lZAorICogbW9kdWxvIDJeOC0xID0gMjU1LgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIEdhbG9pcyBGaWVsZHMgYW5kIFJlZWQtU29sb21vbiBjb2RlcywgcmVmZXIKKyAqIHRvIGFueSBnb29kIGJvb2suICBJIGZvdW5kIF9BbiBJbnRyb2R1Y3Rpb24gdG8gRXJyb3IgQ29ycmVjdGluZworICogQ29kZXMgd2l0aCBBcHBsaWNhdGlvbnNfIGJ5IFMuIEEuIFZhbnN0b25lIGFuZCBQLiBDLiB2YW4gT29yc2Nob3QKKyAqIHRvIGJlIGEgZ29vZCBpbnRyb2R1Y3Rpb24gaW50byB0aGUgZm9ybWVyLiAgX0NPRElORyBUSEVPUlk6IFRoZQorICogRXNzZW50aWFsc18gSSBmb3VuZCB2ZXJ5IHVzZWZ1bCBmb3IgaXRzIGNvbmNpc2UgZGVzY3JpcHRpb24gb2YKKyAqIFJlZWQtU29sb21vbiBlbmNvZGluZy9kZWNvZGluZy4KKyAqCisgKi8KKwordHlwZWRlZiBfX3U4IE1hdHJpeFszXVszXTsKKworLyoKKyAqIGdmcG93W10gaXMgZGVmaW5lZCBzdWNoIHRoYXQgZ2Zwb3dbaV0gcmV0dXJucyByXmkgaWYKKyAqIGkgaXMgaW4gdGhlIHJhbmdlIFswLi4yNTVdLgorICovCitzdGF0aWMgY29uc3QgX191OCBnZnBvd1tdID0KK3sKKwkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAorCTB4ODcsIDB4ODksIDB4OTUsIDB4YWQsIDB4ZGQsIDB4M2QsIDB4N2EsIDB4ZjQsCisJMHg2ZiwgMHhkZSwgMHgzYiwgMHg3NiwgMHhlYywgMHg1ZiwgMHhiZSwgMHhmYiwKKwkweDcxLCAweGUyLCAweDQzLCAweDg2LCAweDhiLCAweDkxLCAweGE1LCAweGNkLAorCTB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4NTcsIDB4YWUsIDB4ZGIsIDB4MzEsCisJMHg2MiwgMHhjNCwgMHgwZiwgMHgxZSwgMHgzYywgMHg3OCwgMHhmMCwgMHg2NywKKwkweGNlLCAweDFiLCAweDM2LCAweDZjLCAweGQ4LCAweDM3LCAweDZlLCAweGRjLAorCTB4M2YsIDB4N2UsIDB4ZmMsIDB4N2YsIDB4ZmUsIDB4N2IsIDB4ZjYsIDB4NmIsCisJMHhkNiwgMHgyYiwgMHg1NiwgMHhhYywgMHhkZiwgMHgzOSwgMHg3MiwgMHhlNCwKKwkweDRmLCAweDllLCAweGJiLCAweGYxLCAweDY1LCAweGNhLCAweDEzLCAweDI2LAorCTB4NGMsIDB4OTgsIDB4YjcsIDB4ZTksIDB4NTUsIDB4YWEsIDB4ZDMsIDB4MjEsCisJMHg0MiwgMHg4NCwgMHg4ZiwgMHg5OSwgMHhiNSwgMHhlZCwgMHg1ZCwgMHhiYSwKKwkweGYzLCAweDYxLCAweGMyLCAweDAzLCAweDA2LCAweDBjLCAweDE4LCAweDMwLAorCTB4NjAsIDB4YzAsIDB4MDcsIDB4MGUsIDB4MWMsIDB4MzgsIDB4NzAsIDB4ZTAsCisJMHg0NywgMHg4ZSwgMHg5YiwgMHhiMSwgMHhlNSwgMHg0ZCwgMHg5YSwgMHhiMywKKwkweGUxLCAweDQ1LCAweDhhLCAweDkzLCAweGExLCAweGM1LCAweDBkLCAweDFhLAorCTB4MzQsIDB4NjgsIDB4ZDAsIDB4MjcsIDB4NGUsIDB4OWMsIDB4YmYsIDB4ZjksCisJMHg3NSwgMHhlYSwgMHg1MywgMHhhNiwgMHhjYiwgMHgxMSwgMHgyMiwgMHg0NCwKKwkweDg4LCAweDk3LCAweGE5LCAweGQ1LCAweDJkLCAweDVhLCAweGI0LCAweGVmLAorCTB4NTksIDB4YjIsIDB4ZTMsIDB4NDEsIDB4ODIsIDB4ODMsIDB4ODEsIDB4ODUsCisJMHg4ZCwgMHg5ZCwgMHhiZCwgMHhmZCwgMHg3ZCwgMHhmYSwgMHg3MywgMHhlNiwKKwkweDRiLCAweDk2LCAweGFiLCAweGQxLCAweDI1LCAweDRhLCAweDk0LCAweGFmLAorCTB4ZDksIDB4MzUsIDB4NmEsIDB4ZDQsIDB4MmYsIDB4NWUsIDB4YmMsIDB4ZmYsCisJMHg3OSwgMHhmMiwgMHg2MywgMHhjNiwgMHgwYiwgMHgxNiwgMHgyYywgMHg1OCwKKwkweGIwLCAweGU3LCAweDQ5LCAweDkyLCAweGEzLCAweGMxLCAweDA1LCAweDBhLAorCTB4MTQsIDB4MjgsIDB4NTAsIDB4YTAsIDB4YzcsIDB4MDksIDB4MTIsIDB4MjQsCisJMHg0OCwgMHg5MCwgMHhhNywgMHhjOSwgMHgxNSwgMHgyYSwgMHg1NCwgMHhhOCwKKwkweGQ3LCAweDI5LCAweDUyLCAweGE0LCAweGNmLCAweDE5LCAweDMyLCAweDY0LAorCTB4YzgsIDB4MTcsIDB4MmUsIDB4NWMsIDB4YjgsIDB4ZjcsIDB4NjksIDB4ZDIsCisJMHgyMywgMHg0NiwgMHg4YywgMHg5ZiwgMHhiOSwgMHhmNSwgMHg2ZCwgMHhkYSwKKwkweDMzLCAweDY2LCAweGNjLCAweDFmLCAweDNlLCAweDdjLCAweGY4LCAweDc3LAorCTB4ZWUsIDB4NWIsIDB4YjYsIDB4ZWIsIDB4NTEsIDB4YTIsIDB4YzMsIDB4MDEKK307CisKKy8qCisgKiBUaGlzIGlzIGEgbG9nIHRhYmxlLiAgVGhhdCBpcywgZ2Zsb2dbcl5pXSByZXR1cm5zIGkgKG1vZHVsbyBmKHIpKS4KKyAqIGdmbG9nWzBdIGlzIHVuZGVmaW5lZCBhbmQgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlcmVmb3JlIG5vdCB2YWxpZC4KKyAqLworc3RhdGljIGNvbnN0IF9fdTggZ2Zsb2dbMjU2XSA9Cit7CisJMHhmZiwgMHgwMCwgMHgwMSwgMHg2MywgMHgwMiwgMHhjNiwgMHg2NCwgMHg2YSwKKwkweDAzLCAweGNkLCAweGM3LCAweGJjLCAweDY1LCAweDdlLCAweDZiLCAweDJhLAorCTB4MDQsIDB4OGQsIDB4Y2UsIDB4NGUsIDB4YzgsIDB4ZDQsIDB4YmQsIDB4ZTEsCisJMHg2NiwgMHhkZCwgMHg3ZiwgMHgzMSwgMHg2YywgMHgyMCwgMHgyYiwgMHhmMywKKwkweDA1LCAweDU3LCAweDhlLCAweGU4LCAweGNmLCAweGFjLCAweDRmLCAweDgzLAorCTB4YzksIDB4ZDksIDB4ZDUsIDB4NDEsIDB4YmUsIDB4OTQsIDB4ZTIsIDB4YjQsCisJMHg2NywgMHgyNywgMHhkZSwgMHhmMCwgMHg4MCwgMHhiMSwgMHgzMiwgMHgzNSwKKwkweDZkLCAweDQ1LCAweDIxLCAweDEyLCAweDJjLCAweDBkLCAweGY0LCAweDM4LAorCTB4MDYsIDB4OWIsIDB4NTgsIDB4MWEsIDB4OGYsIDB4NzksIDB4ZTksIDB4NzAsCisJMHhkMCwgMHhjMiwgMHhhZCwgMHhhOCwgMHg1MCwgMHg3NSwgMHg4NCwgMHg0OCwKKwkweGNhLCAweGZjLCAweGRhLCAweDhhLCAweGQ2LCAweDU0LCAweDQyLCAweDI0LAorCTB4YmYsIDB4OTgsIDB4OTUsIDB4ZjksIDB4ZTMsIDB4NWUsIDB4YjUsIDB4MTUsCisJMHg2OCwgMHg2MSwgMHgyOCwgMHhiYSwgMHhkZiwgMHg0YywgMHhmMSwgMHgyZiwKKwkweDgxLCAweGU2LCAweGIyLCAweDNmLCAweDMzLCAweGVlLCAweDM2LCAweDEwLAorCTB4NmUsIDB4MTgsIDB4NDYsIDB4YTYsIDB4MjIsIDB4ODgsIDB4MTMsIDB4ZjcsCisJMHgyZCwgMHhiOCwgMHgwZSwgMHgzZCwgMHhmNSwgMHhhNCwgMHgzOSwgMHgzYiwKKwkweDA3LCAweDllLCAweDljLCAweDlkLCAweDU5LCAweDlmLCAweDFiLCAweDA4LAorCTB4OTAsIDB4MDksIDB4N2EsIDB4MWMsIDB4ZWEsIDB4YTAsIDB4NzEsIDB4NWEsCisJMHhkMSwgMHgxZCwgMHhjMywgMHg3YiwgMHhhZSwgMHgwYSwgMHhhOSwgMHg5MSwKKwkweDUxLCAweDViLCAweDc2LCAweDcyLCAweDg1LCAweGExLCAweDQ5LCAweGViLAorCTB4Y2IsIDB4N2MsIDB4ZmQsIDB4YzQsIDB4ZGIsIDB4MWUsIDB4OGIsIDB4ZDIsCisJMHhkNywgMHg5MiwgMHg1NSwgMHhhYSwgMHg0MywgMHgwYiwgMHgyNSwgMHhhZiwKKwkweGMwLCAweDczLCAweDk5LCAweDc3LCAweDk2LCAweDVjLCAweGZhLCAweDUyLAorCTB4ZTQsIDB4ZWMsIDB4NWYsIDB4NGEsIDB4YjYsIDB4YTIsIDB4MTYsIDB4ODYsCisJMHg2OSwgMHhjNSwgMHg2MiwgMHhmZSwgMHgyOSwgMHg3ZCwgMHhiYiwgMHhjYywKKwkweGUwLCAweGQzLCAweDRkLCAweDhjLCAweGYyLCAweDFmLCAweDMwLCAweGRjLAorCTB4ODIsIDB4YWIsIDB4ZTcsIDB4NTYsIDB4YjMsIDB4OTMsIDB4NDAsIDB4ZDgsCisJMHgzNCwgMHhiMCwgMHhlZiwgMHgyNiwgMHgzNywgMHgwYywgMHgxMSwgMHg0NCwKKwkweDZmLCAweDc4LCAweDE5LCAweDlhLCAweDQ3LCAweDc0LCAweGE3LCAweGMxLAorCTB4MjMsIDB4NTMsIDB4ODksIDB4ZmIsIDB4MTQsIDB4NWQsIDB4ZjgsIDB4OTcsCisJMHgyZSwgMHg0YiwgMHhiOSwgMHg2MCwgMHgwZiwgMHhlZCwgMHgzZSwgMHhlNSwKKwkweGY2LCAweDg3LCAweGE1LCAweDE3LCAweDNhLCAweGEzLCAweDNjLCAweGI3Cit9OworCisvKiBUaGlzIGlzIGEgbXVsdGlwbGljYXRpb24gdGFibGUgZm9yIHRoZSBmYWN0b3IgMHhjMCAoaS5lLiwgcl4xMDUgKG1vZCBmKHIpKS4KKyAqIGdmbXVsX2MwW2ZdIHJldHVybnMgcl4xMDUgKiBmKHIpIChtb2R1bG8gZihyKSkuCisgKi8KK3N0YXRpYyBjb25zdCBfX3U4IGdmbXVsX2MwWzI1Nl0gPQoreworCTB4MDAsIDB4YzAsIDB4MDcsIDB4YzcsIDB4MGUsIDB4Y2UsIDB4MDksIDB4YzksCisJMHgxYywgMHhkYywgMHgxYiwgMHhkYiwgMHgxMiwgMHhkMiwgMHgxNSwgMHhkNSwKKwkweDM4LCAweGY4LCAweDNmLCAweGZmLCAweDM2LCAweGY2LCAweDMxLCAweGYxLAorCTB4MjQsIDB4ZTQsIDB4MjMsIDB4ZTMsIDB4MmEsIDB4ZWEsIDB4MmQsIDB4ZWQsCisJMHg3MCwgMHhiMCwgMHg3NywgMHhiNywgMHg3ZSwgMHhiZSwgMHg3OSwgMHhiOSwKKwkweDZjLCAweGFjLCAweDZiLCAweGFiLCAweDYyLCAweGEyLCAweDY1LCAweGE1LAorCTB4NDgsIDB4ODgsIDB4NGYsIDB4OGYsIDB4NDYsIDB4ODYsIDB4NDEsIDB4ODEsCisJMHg1NCwgMHg5NCwgMHg1MywgMHg5MywgMHg1YSwgMHg5YSwgMHg1ZCwgMHg5ZCwKKwkweGUwLCAweDIwLCAweGU3LCAweDI3LCAweGVlLCAweDJlLCAweGU5LCAweDI5LAorCTB4ZmMsIDB4M2MsIDB4ZmIsIDB4M2IsIDB4ZjIsIDB4MzIsIDB4ZjUsIDB4MzUsCisJMHhkOCwgMHgxOCwgMHhkZiwgMHgxZiwgMHhkNiwgMHgxNiwgMHhkMSwgMHgxMSwKKwkweGM0LCAweDA0LCAweGMzLCAweDAzLCAweGNhLCAweDBhLCAweGNkLCAweDBkLAorCTB4OTAsIDB4NTAsIDB4OTcsIDB4NTcsIDB4OWUsIDB4NWUsIDB4OTksIDB4NTksCisJMHg4YywgMHg0YywgMHg4YiwgMHg0YiwgMHg4MiwgMHg0MiwgMHg4NSwgMHg0NSwKKwkweGE4LCAweDY4LCAweGFmLCAweDZmLCAweGE2LCAweDY2LCAweGExLCAweDYxLAorCTB4YjQsIDB4NzQsIDB4YjMsIDB4NzMsIDB4YmEsIDB4N2EsIDB4YmQsIDB4N2QsCisJMHg0NywgMHg4NywgMHg0MCwgMHg4MCwgMHg0OSwgMHg4OSwgMHg0ZSwgMHg4ZSwKKwkweDViLCAweDliLCAweDVjLCAweDljLCAweDU1LCAweDk1LCAweDUyLCAweDkyLAorCTB4N2YsIDB4YmYsIDB4NzgsIDB4YjgsIDB4NzEsIDB4YjEsIDB4NzYsIDB4YjYsCisJMHg2MywgMHhhMywgMHg2NCwgMHhhNCwgMHg2ZCwgMHhhZCwgMHg2YSwgMHhhYSwKKwkweDM3LCAweGY3LCAweDMwLCAweGYwLCAweDM5LCAweGY5LCAweDNlLCAweGZlLAorCTB4MmIsIDB4ZWIsIDB4MmMsIDB4ZWMsIDB4MjUsIDB4ZTUsIDB4MjIsIDB4ZTIsCisJMHgwZiwgMHhjZiwgMHgwOCwgMHhjOCwgMHgwMSwgMHhjMSwgMHgwNiwgMHhjNiwKKwkweDEzLCAweGQzLCAweDE0LCAweGQ0LCAweDFkLCAweGRkLCAweDFhLCAweGRhLAorCTB4YTcsIDB4NjcsIDB4YTAsIDB4NjAsIDB4YTksIDB4NjksIDB4YWUsIDB4NmUsCisJMHhiYiwgMHg3YiwgMHhiYywgMHg3YywgMHhiNSwgMHg3NSwgMHhiMiwgMHg3MiwKKwkweDlmLCAweDVmLCAweDk4LCAweDU4LCAweDkxLCAweDUxLCAweDk2LCAweDU2LAorCTB4ODMsIDB4NDMsIDB4ODQsIDB4NDQsIDB4OGQsIDB4NGQsIDB4OGEsIDB4NGEsCisJMHhkNywgMHgxNywgMHhkMCwgMHgxMCwgMHhkOSwgMHgxOSwgMHhkZSwgMHgxZSwKKwkweGNiLCAweDBiLCAweGNjLCAweDBjLCAweGM1LCAweDA1LCAweGMyLCAweDAyLAorCTB4ZWYsIDB4MmYsIDB4ZTgsIDB4MjgsIDB4ZTEsIDB4MjEsIDB4ZTYsIDB4MjYsCisJMHhmMywgMHgzMywgMHhmNCwgMHgzNCwgMHhmZCwgMHgzZCwgMHhmYSwgMHgzYQorfTsKKworCisvKiBSZXR1cm5zIFYgbW9kdWxvIDI1NSBwcm92aWRlZCBWIGlzIGluIHRoZSByYW5nZSAtMjU1LC0yNTQsLi4uLDUwOS4KKyAqLworc3RhdGljIGlubGluZSBfX3U4IG1vZDI1NShpbnQgdikKK3sKKwlpZiAodiA+IDApIHsKKwkJaWYgKHYgPCAyNTUpIHsKKwkJCXJldHVybiB2OworCQl9IGVsc2UgeworCQkJcmV0dXJuIHYgLSAyNTU7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gdiArIDI1NTsKKwl9Cit9CisKKworLyogQWRkIHR3byBudW1iZXJzIGluIHRoZSBmaWVsZC4gIEFkZGl0aW9uIGluIHRoaXMgZmllbGQgaXMgZXF1aXZhbGVudAorICogdG8gYSBiaXQtd2lzZSBleGNsdXNpdmUgT1Igb3BlcmF0aW9uLS0tc3VidHJhY3Rpb24gaXMgdGhlcmVmb3JlCisgKiBpZGVudGljYWwgdG8gYWRkaXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgX191OCBnZmFkZChfX3U4IGEsIF9fdTggYikKK3sKKwlyZXR1cm4gYSBeIGI7Cit9CisKKworLyogQWRkIHR3byB2ZWN0b3JzIG9mIG51bWJlcnMgaW4gdGhlIGZpZWxkLiAgRWFjaCBieXRlIGluIEEgYW5kIEIgZ2V0cworICogYWRkZWQgaW5kaXZpZHVhbGx5LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2ZhZGRfbG9uZyh1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYikKK3sKKwlyZXR1cm4gYSBeIGI7Cit9CisKKworLyogTXVsdGlwbHkgdHdvIG51bWJlcnMgaW4gdGhlIGZpZWxkOgorICovCitzdGF0aWMgaW5saW5lIF9fdTggZ2ZtdWwoX191OCBhLCBfX3U4IGIpCit7CisJaWYgKGEgJiYgYikgeworCQlyZXR1cm4gZ2Zwb3dbbW9kMjU1KGdmbG9nW2FdICsgZ2Zsb2dbYl0pXTsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKKworLyogSnVzdCBsaWtlIGdmbXVsLCBleGNlcHQgd2UgaGF2ZSBhbHJlYWR5IGxvb2tlZCB1cCB0aGUgbG9nIG9mIHRoZQorICogc2Vjb25kIG51bWJlci4KKyAqLworc3RhdGljIGlubGluZSBfX3U4IGdmbXVsX2V4cChfX3U4IGEsIGludCBiKQoreworCWlmIChhKSB7CisJCXJldHVybiBnZnBvd1ttb2QyNTUoZ2Zsb2dbYV0gKyBiKV07CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorCisKKy8qIEp1c3QgbGlrZSBnZm11bF9leHAsIGV4Y2VwdCB0aGF0IEEgaXMgYSB2ZWN0b3Igb2YgbnVtYmVycy4gIFRoYXQKKyAqIGlzLCBlYWNoIGJ5dGUgaW4gQSBnZXRzIG11bHRpcGxpZWQgYnkgZ2Zwb3dbbW9kMjU1KEIpXS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdmbXVsX2V4cF9sb25nKHVuc2lnbmVkIGxvbmcgYSwgaW50IGIpCit7CisJX191OCB0OworCisJaWYgKHNpemVvZihsb25nKSA9PSA0KSB7CisJCXJldHVybiAoCisJCSgodCA9IChfX3UzMilhID4+IDI0ICYgMHhmZikgPworCQkgKCgoX191MzIpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgMjQpIDogMCkgfAorCQkoKHQgPSAoX191MzIpYSA+PiAxNiAmIDB4ZmYpID8KKwkJICgoKF9fdTMyKSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDE2KSA6IDApIHwKKwkJKCh0ID0gKF9fdTMyKWEgPj4gOCAmIDB4ZmYpID8KKwkJICgoKF9fdTMyKSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDgpIDogMCkgfAorCQkoKHQgPSAoX191MzIpYSA+PiAwICYgMHhmZikgPworCQkgKCgoX191MzIpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgMCkgOiAwKSk7CisJfSBlbHNlIGlmIChzaXplb2YobG9uZykgPT0gOCkgeworCQlyZXR1cm4gKAorCQkoKHQgPSAoX191NjQpYSA+PiA1NiAmIDB4ZmYpID8KKwkJICgoKF9fdTY0KSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDU2KSA6IDApIHwKKwkJKCh0ID0gKF9fdTY0KWEgPj4gNDggJiAweGZmKSA/CisJCSAoKChfX3U2NCkgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCA0OCkgOiAwKSB8CisJCSgodCA9IChfX3U2NClhID4+IDQwICYgMHhmZikgPworCQkgKCgoX191NjQpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgNDApIDogMCkgfAorCQkoKHQgPSAoX191NjQpYSA+PiAzMiAmIDB4ZmYpID8KKwkJICgoKF9fdTY0KSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDMyKSA6IDApIHwKKwkJKCh0ID0gKF9fdTY0KWEgPj4gMjQgJiAweGZmKSA/CisJCSAoKChfX3U2NCkgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCAyNCkgOiAwKSB8CisJCSgodCA9IChfX3U2NClhID4+IDE2ICYgMHhmZikgPworCQkgKCgoX191NjQpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgMTYpIDogMCkgfAorCQkoKHQgPSAoX191NjQpYSA+PiA4ICYgMHhmZikgPworCQkgKCgoX191NjQpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgOCkgOiAwKSB8CisJCSgodCA9IChfX3U2NClhID4+IDAgJiAweGZmKSA/CisJCSAoKChfX3U2NCkgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCAwKSA6IDApKTsKKwl9IGVsc2UgeworCQlUUkFDRV9GVU4oZnRfdF9hbnkpOworCQlUUkFDRV9BQk9SVCgtMSwgZnRfdF9lcnIsICJFcnJvcjogc2l6ZSBvZiBsb25nIGlzICVkIGJ5dGVzIiwKKwkJCSAgICAoaW50KXNpemVvZihsb25nKSk7CisJfQorfQorCisKKy8qIERpdmlkZSB0d28gbnVtYmVycyBpbiB0aGUgZmllbGQuICBSZXR1cm5zIGEvYiAobW9kdWxvIGYoeCkpLgorICovCitzdGF0aWMgaW5saW5lIF9fdTggZ2ZkaXYoX191OCBhLCBfX3U4IGIpCit7CisJaWYgKCFiKSB7CisJCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCVRSQUNFX0FCT1JUKDB4ZmYsIGZ0X3RfYnVnLCAiRXJyb3I6IGRpdmlzaW9uIGJ5IHplcm8iKTsKKwl9IGVsc2UgaWYgKGEgPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gZ2Zwb3dbbW9kMjU1KGdmbG9nW2FdIC0gZ2Zsb2dbYl0pXTsKKwl9Cit9CisKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcmV0dXJuIHRoZSBpbnZlcnNlIG9mIHRoZSBtYXRyaXggb2YgdGhlCisgKiBsaW5lYXIgc3lzdGVtIHRoYXQgbmVlZHMgdG8gYmUgc29sdmVkIHRvIGRldGVybWluZSB0aGUgZXJyb3IKKyAqIG1hZ25pdHVkZXMuICBUaGUgZmlyc3QgZGVhbHMgd2l0aCBtYXRyaWNlcyBvZiByYW5rIDMsIHdoaWxlIHRoZQorICogc2Vjb25kIGRlYWxzIHdpdGggbWF0cmljZXMgb2YgcmFuayAyLiAgVGhlIGVycm9yIGluZGljZXMgYXJlIHBhc3NlZAorICogaW4gYXJndW1lbnRzIEwwLC4uLEwyICgwPWZpcnN0IHNlY3RvciwgMzE9bGFzdCBzZWN0b3IpLiAgVGhlIGVycm9yCisgKiBpbmRpY2VzIG11c3QgYmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciwgaS5lLiwgTDA8TDE8TDIuCisgKgorICogVGhlIGxpbmVhciBzeXN0ZW0gdGhhdCBuZWVkcyB0byBiZSBzb2x2ZWQgZm9yIHRoZSBlcnJvciBtYWduaXR1ZGVzCisgKiBpcyBBICogYiA9IHMsIHdoZXJlIHMgaXMgdGhlIGtub3duIHZlY3RvciBvZiBzeW5kcm9tZXMsIGIgaXMgdGhlCisgKiB2ZWN0b3Igb2YgZXJyb3IgbWFnbml0dWRlcyBhbmQgQSBpbiB0aGUgT1JERVI9MyBjYXNlOgorICoKKyAqICAgIEFfMyA9IHt7MS9yXkxbMF0sIDEvcl5MWzFdLCAxL3JeTFsyXX0sCisgKiAgICAgICAgICB7ICAgICAgICAxLCAgICAgICAgMSwgICAgICAgIDF9LAorICogICAgICAgICAgeyByXkxbMF0sIHJeTFsxXSwgcl5MWzJdfX0gCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdmaW52MyhfX3U4IGwwLAorCQkJIF9fdTggbDEsIAorCQkJIF9fdTggbDIsIAorCQkJIE1hdHJpeCBBaW52KQoreworCV9fdTggZGV0OworCV9fdTggdDIwLCB0MTAsIHQyMSwgdDEyLCB0MDEsIHQwMjsKKwlpbnQgbG9nX2RldDsKKworCS8qIGNvbXB1dGUgc29tZSBpbnRlcm1lZGlhdGUgcmVzdWx0czogKi8KKwl0MjAgPSBnZnBvd1tsMiAtIGwwXTsJICAgICAgICAvKiB0MjAgPSByXmwyL3JebDAgKi8KKwl0MTAgPSBnZnBvd1tsMSAtIGwwXTsJICAgICAgICAvKiB0MTAgPSByXmwxL3JebDAgKi8KKwl0MjEgPSBnZnBvd1tsMiAtIGwxXTsJICAgICAgICAvKiB0MjEgPSByXmwyL3JebDEgKi8KKwl0MTIgPSBnZnBvd1tsMSAtIGwyICsgMjU1XTsJLyogdDEyID0gcl5sMS9yXmwyICovCisJdDAxID0gZ2Zwb3dbbDAgLSBsMSArIDI1NV07CS8qIHQwMSA9IHJebDAvcl5sMSAqLworCXQwMiA9IGdmcG93W2wwIC0gbDIgKyAyNTVdOwkvKiB0MDIgPSByXmwwL3JebDIgKi8KKwkvKiBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50IG9mIG1hdHJpeCBBXzNeLTEgKHNvbWV0aW1lcworCSAqIGNhbGxlZCB0aGUgVmFuZGVybW9uZGUgZGV0ZXJtaW5hbnQpOgorCSAqLworCWRldCA9IGdmYWRkKHQyMCwgZ2ZhZGQodDEwLCBnZmFkZCh0MjEsIGdmYWRkKHQxMiwgZ2ZhZGQodDAxLCB0MDIpKSkpKTsKKwlpZiAoIWRldCkgeworCQlUUkFDRV9GVU4oZnRfdF9hbnkpOworCQlUUkFDRV9BQk9SVCgwLCBmdF90X2VyciwKKwkJCSAgICJJbnZlcnNpb24gZmFpbGVkICgzIENSQyBlcnJvcnMsID4wIENSQyBmYWlsdXJlcykiKTsKKwl9CisJbG9nX2RldCA9IDI1NSAtIGdmbG9nW2RldF07CisKKwkvKiBOb3csIGNhbGN1bGF0ZSBhbGwgb2YgdGhlIGNvZWZmaWNpZW50czoKKwkgKi8KKwlBaW52WzBdWzBdPSBnZm11bF9leHAoZ2ZhZGQoZ2Zwb3dbbDFdLCBnZnBvd1tsMl0pLCBsb2dfZGV0KTsKKwlBaW52WzBdWzFdPSBnZm11bF9leHAoZ2ZhZGQodDIxLCB0MTIpLCBsb2dfZGV0KTsKKwlBaW52WzBdWzJdPSBnZm11bF9leHAoZ2ZhZGQoZ2Zwb3dbMjU1IC0gbDFdLCBnZnBvd1syNTUgLSBsMl0pLGxvZ19kZXQpOworCisJQWludlsxXVswXT0gZ2ZtdWxfZXhwKGdmYWRkKGdmcG93W2wwXSwgZ2Zwb3dbbDJdKSwgbG9nX2RldCk7CisJQWludlsxXVsxXT0gZ2ZtdWxfZXhwKGdmYWRkKHQyMCwgdDAyKSwgbG9nX2RldCk7CisJQWludlsxXVsyXT0gZ2ZtdWxfZXhwKGdmYWRkKGdmcG93WzI1NSAtIGwwXSwgZ2Zwb3dbMjU1IC0gbDJdKSxsb2dfZGV0KTsKKworCUFpbnZbMl1bMF09IGdmbXVsX2V4cChnZmFkZChnZnBvd1tsMF0sIGdmcG93W2wxXSksIGxvZ19kZXQpOworCUFpbnZbMl1bMV09IGdmbXVsX2V4cChnZmFkZCh0MTAsIHQwMSksIGxvZ19kZXQpOworCUFpbnZbMl1bMl09IGdmbXVsX2V4cChnZmFkZChnZnBvd1syNTUgLSBsMF0sIGdmcG93WzI1NSAtIGwxXSksbG9nX2RldCk7CisKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBnZmludjIoX191OCBsMCwgX191OCBsMSwgTWF0cml4IEFpbnYpCit7CisJX191OCBkZXQ7CisJX191OCB0MSwgdDI7CisJaW50IGxvZ19kZXQ7CisKKwl0MSA9IGdmcG93WzI1NSAtIGwwXTsKKwl0MiA9IGdmcG93WzI1NSAtIGwxXTsKKwlkZXQgPSBnZmFkZCh0MSwgdDIpOworCWlmICghZGV0KSB7CisJCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCVRSQUNFX0FCT1JUKDAsIGZ0X3RfZXJyLAorCQkJICAgIkludmVyc2lvbiBmYWlsZWQgKDIgQ1JDIGVycm9ycywgPjAgQ1JDIGZhaWx1cmVzKSIpOworCX0KKwlsb2dfZGV0ID0gMjU1IC0gZ2Zsb2dbZGV0XTsKKworCS8qIE5vdywgY2FsY3VsYXRlIGFsbCBvZiB0aGUgY29lZmZpY2llbnRzOgorCSAqLworCUFpbnZbMF1bMF0gPSBBaW52WzFdWzBdID0gZ2Zwb3dbbG9nX2RldF07CisKKwlBaW52WzBdWzFdID0gZ2ZtdWxfZXhwKHQyLCBsb2dfZGV0KTsKKwlBaW52WzFdWzFdID0gZ2ZtdWxfZXhwKHQxLCBsb2dfZGV0KTsKKworCXJldHVybiAxOworfQorCisKKy8qIE11bHRpcGx5IG1hdHJpeCBBIGJ5IHZlY3RvciBTIGFuZCByZXR1cm4gcmVzdWx0IGluIHZlY3RvciBCLiAgTSBpcworICogYXNzdW1lZCB0byBiZSBvZiBvcmRlciBOeE4sIFMgYW5kIEIgb2Ygb3JkZXIgTngxLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZ2ZtYXRfbXVsKGludCBuLCBNYXRyaXggQSwgCisJCQkgICAgIF9fdTggKnMsIF9fdTggKmIpCit7CisJaW50IGksIGo7CisJX191OCBkb3RfcHJvZDsKKworCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKwkJZG90X3Byb2QgPSAwOworCQlmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisJCQlkb3RfcHJvZCA9IGdmYWRkKGRvdF9wcm9kLCBnZm11bChBW2ldW2pdLCBzW2pdKSk7CisJCX0KKwkJYltpXSA9IGRvdF9wcm9kOworCX0KK30KKwwKKworCisvKiBUaGUgUmVlZCBTb2xvbW9uIEVDQyBjb2RlcyBhcmUgY29tcHV0ZWQgb3ZlciB0aGUgTi10aCBieXRlIG9mIGVhY2gKKyAqIGJsb2NrLCB3aGVyZSBOPVNFQ1RPUl9TSVpFLiAgVGhlcmUgYXJlIHVwIHRvIDI5IGJsb2NrcyBvZiBkYXRhLCBhbmQKKyAqIDMgYmxvY2tzIG9mIEVDQy4gIFRoZSBibG9ja3MgYXJlIHN0b3JlZCBjb250aWd1b3VzbHkgaW4gbWVtb3J5LiAgQQorICogc2VnbWVudCwgY29uc2VxdWVudGx5LCBpcyBhc3N1bWVkIHRvIGhhdmUgYXQgbGVhc3QgNCBibG9ja3M6IG9uZSBvcgorICogbW9yZSBkYXRhIGJsb2NrcyBwbHVzIHRocmVlIEVDQyBibG9ja3MuCisgKgorICogTm90aWNlOiBJbiBRSUMtODAgc3BlYWssIGEgQ1JDIGVycm9yIGlzIGEgc2VjdG9yIHdpdGggYW4gaW5jb3JyZWN0CisgKiAgICAgICAgIENSQy4gIEEgQ1JDIGZhaWx1cmUgaXMgYSBzZWN0b3Igd2l0aCBpbmNvcnJlY3QgZGF0YSwgYnV0CisgKiAgICAgICAgIGEgdmFsaWQgQ1JDLiAgSW4gdGhlIGVycm9yIGNvbnRyb2wgbGl0ZXJhdHVyZSwgdGhlIGZvcm1lcgorICogICAgICAgICBpcyB1c3VhbGx5IGNhbGxlZCAiZXJhc3VyZSIsIHRoZSBsYXR0ZXIgImVycm9yLiIKKyAqLworLyogQ29tcHV0ZSB0aGUgcGFyaXR5IGJ5dGVzIGZvciBDIGNvbHVtbnMgb2YgZGF0YSwgd2hlcmUgQyBpcyB0aGUKKyAqIG51bWJlciBvZiBieXRlcyB0aGF0IGZpdCBpbnRvIGEgbG9uZyBpbnRlZ2VyLiAgV2UgdXNlIGEgbGluZWFyCisgKiBmZWVkLWJhY2sgcmVnaXN0ZXIgdG8gZG8gdGhpcy4gIFRoZSBwYXJpdHkgYnl0ZXMgUFswXSwgUFtTVFJJREVdLAorICogUFsyKlNUUklERV0gYXJlIGNvbXB1dGVkIHN1Y2ggdGhhdDoKKyAqCisgKiAgICAgICAgICAgICAgeF5rICogcCh4KSArIG0oeCkgPSAwIChtb2R1bG8gZyh4KSkKKyAqCisgKiB3aGVyZSBrID0gTkJMT0NLUywKKyAqICAgICAgIHAoeCkgPSBQWzBdICsgUFtTVFJJREVdKnggKyBQWzIqU1RSSURFXSp4XjIsIGFuZAorICogICAgICAgbSh4KSA9IHN1bV97aT0wfV5rIG1faSp4XmkuCisgKiAgICAgICBtX2kgPSBEQVRBW2kqU0VDVE9SX1NJWkVdCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGFyaXR5KHVuc2lnbmVkIGxvbmcgKmRhdGEsCisJCQkgICAgICBpbnQgbmJsb2NrcywgCisJCQkgICAgICB1bnNpZ25lZCBsb25nICpwLCAKKwkJCSAgICAgIGludCBzdHJpZGUpCit7CisJdW5zaWduZWQgbG9uZyBwMCwgcDEsIHAyLCB0MSwgdDIsICplbmQ7CisKKwllbmQgPSBkYXRhICsgbmJsb2NrcyAqIChGVF9TRUNUT1JfU0laRSAvIHNpemVvZihsb25nKSk7CisJcDAgPSBwMSA9IHAyID0gMDsKKwl3aGlsZSAoZGF0YSA8IGVuZCkgeworCQkvKiBUaGUgbmV3IHBhcml0eSBieXRlcyBwMF9pLCBwMV9pLCBwMl9pIGFyZSBjb21wdXRlZAorCQkgKiBmcm9tIHRoZSBvbGQgdmFsdWVzIHAwX3tpLTF9LCBwMV97aS0xfSwgcDJfe2ktMX0KKwkJICogcmVjdXJzaXZlbHkgYXM6CisJCSAqCisJCSAqICAgICAgICBwMF9pID0gcDFfe2ktMX0gKyByXjEwNSAqIChtX3tpLTF9IC0gcDBfe2ktMX0pCisJCSAqICAgICAgICBwMV9pID0gcDJfe2ktMX0gKyByXjEwNSAqIChtX3tpLTF9IC0gcDBfe2ktMX0pCisJCSAqICAgICAgICBwMl9pID0gICAgICAgICAgICAgICAgICAgIChtX3tpLTF9IC0gcDBfe2ktMX0pCisJCSAqCisJCSAqIFdpdGggdGhlIGluaXRpYWwgY29uZGl0aW9uOiBwMF8wID0gcDFfMCA9IHAyXzAgPSAwLgorCQkgKi8KKwkJdDEgPSBnZmFkZF9sb25nKCpkYXRhLCBwMCk7CisJCS8qCisJCSAqIE11bHRpcGx5IGVhY2ggYnl0ZSBpbiB0MSBieSAweGMwOgorCQkgKi8KKwkJaWYgKHNpemVvZihsb25nKSA9PSA0KSB7CisJCQl0Mj0gKCgoX191MzIpIGdmbXVsX2MwWyhfX3UzMil0MSA+PiAyNCAmIDB4ZmZdKSA8PCAyNCB8CisJCQkgICAgICgoX191MzIpIGdmbXVsX2MwWyhfX3UzMil0MSA+PiAxNiAmIDB4ZmZdKSA8PCAxNiB8CisJCQkgICAgICgoX191MzIpIGdmbXVsX2MwWyhfX3UzMil0MSA+PiAgOCAmIDB4ZmZdKSA8PCAgOCB8CisJCQkgICAgICgoX191MzIpIGdmbXVsX2MwWyhfX3UzMil0MSA+PiAgMCAmIDB4ZmZdKSA8PCAgMCk7CisJCX0gZWxzZSBpZiAoc2l6ZW9mKGxvbmcpID09IDgpIHsKKwkJCXQyPSAoKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+IDU2ICYgMHhmZl0pIDw8IDU2IHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+IDQ4ICYgMHhmZl0pIDw8IDQ4IHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+IDQwICYgMHhmZl0pIDw8IDQwIHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+IDMyICYgMHhmZl0pIDw8IDMyIHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+IDI0ICYgMHhmZl0pIDw8IDI0IHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+IDE2ICYgMHhmZl0pIDw8IDE2IHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+ICA4ICYgMHhmZl0pIDw8ICA4IHwKKwkJCSAgICAgKChfX3U2NCkgZ2ZtdWxfYzBbKF9fdTY0KXQxID4+ICAwICYgMHhmZl0pIDw8ICAwKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCQlUUkFDRShmdF90X2VyciwgIkVycm9yOiBsb25nIGlzIG9mIHNpemUgJWQiLAorCQkJICAgICAgKGludCkgc2l6ZW9mKGxvbmcpKTsKKwkJCVRSQUNFX0VYSVQ7CisJCX0KKwkJcDAgPSBnZmFkZF9sb25nKHQyLCBwMSk7CisJCXAxID0gZ2ZhZGRfbG9uZyh0MiwgcDIpOworCQlwMiA9IHQxOworCQlkYXRhICs9IEZUX1NFQ1RPUl9TSVpFIC8gc2l6ZW9mKGxvbmcpOworCX0KKwkqcCA9IHAwOworCXAgKz0gc3RyaWRlOworCSpwID0gcDE7CisJcCArPSBzdHJpZGU7CisJKnAgPSBwMjsKKwlyZXR1cm47Cit9CisKKworLyogQ29tcHV0ZSB0aGUgMyBzeW5kcm9tZSB2YWx1ZXMuICBEQVRBIHNob3VsZCBwb2ludCB0byB0aGUgZmlyc3QgYnl0ZQorICogb2YgdGhlIGNvbHVtbiBmb3Igd2hpY2ggdGhlIHN5bmRyb21lcyBhcmUgZGVzaXJlZC4gIFRoZSBzeW5kcm9tZXMKKyAqIGFyZSBjb21wdXRlZCBvdmVyIHRoZSBmaXJzdCBOQkxPQ0tTIG9mIHJvd3MuICBUaGUgdGhyZWUgYnl0ZXMgd2lsbAorICogYmUgcGxhY2VkIGluIFNbMF0sIFNbMV0sIGFuZCBTWzJdLgorICoKKyAqIFNbaV0gaXMgdGhlIHZhbHVlIG9mIHRoZSAibWVzc2FnZSIgcG9seW5vbWlhbCBtKHgpIGV2YWx1YXRlZCBhdCB0aGUKKyAqIGktdGggcm9vdCBvZiB0aGUgZ2VuZXJhdG9yIHBvbHlub21pYWwgZyh4KS4KKyAqCisgKiBBcyBnKHgpPSh4LXJeLTEpKHgtMSkoeC1yXjEpIHdlIGV2YWx1YXRlIHRoZSBtZXNzYWdlIHBvbHlub21pYWwgYXQKKyAqIHg9cl4tMSB0byBnZXQgU1swXSwgYXQgeD1yXjA9MSB0byBnZXQgU1sxXSwgYW5kIGF0IHg9ciB0byBnZXQgU1syXS4KKyAqIFRoaXMgY291bGQgYmUgZG9uZSBkaXJlY3RseSBhbmQgZWZmaWNpZW50bHkgdmlhIHRoZSBIb3JuZXIgc2NoZW1lLgorICogSG93ZXZlciwgaXQgd291bGQgcmVxdWlyZSBtdWx0aXBsaWNhdGlvbiB0YWJsZXMgZm9yIHRoZSBmYWN0b3JzCisgKiByXi0xICgweGMzKSBhbmQgciAoMHgwMikuICBUaGUgZm9sbG93aW5nIHNjaGVtZSBkb2VzIG5vdCByZXF1aXJlCisgKiBhbnkgbXVsdGlwbGljYXRpb24gdGFibGVzIGJleW9uZCB3aGF0J3MgbmVlZGVkIGZvciBzZXRfcGFyaXR5KCkKKyAqIGFueXdheSBhbmQgaXMgc2xpZ2h0bHkgZmFzdGVyIGlmIHRoZXJlIGFyZSBubyBlcnJvcnMgYW5kIHNsaWdodGx5CisgKiBzbG93ZXIgaWYgdGhlcmUgYXJlIGVycm9ycy4gIFRoZSBsYXR0ZXIgaXMgaG9wZWZ1bGx5IHRoZSBpbmZyZXF1ZW50CisgKiBjYXNlLgorICoKKyAqIFRvIHVuZGVyc3RhbmQgdGhlIGFsdGVybmF0aXZlIGFsZ29yaXRobSwgbm90aWNlIHRoYXQgc2V0X3Bhcml0eShtLAorICogaywgcCkgY29tcHV0ZXMgcGFyaXR5IGJ5dGVzIHN1Y2ggdGhhdDoKKyAqCisgKiAgICAgIHheayAqIHAoeCkgPSBtKHgpIChtb2R1bG8gZyh4KSkuCisgKgorICogVGhhdCBpcywgdG8gZXZhbHVhdGUgbShyXm0pLCB3aGVyZSByXm0gaXMgYSByb290IG9mIGcoeCksIHdlIGNhbgorICogc2ltcGx5IGV2YWx1YXRlIChyXm0pXmsqcChyXm0pLiAgQWxzbywgbm90aWNlIHRoYXQgcCBpcyAwIGlmIGFuZAorICogb25seSBpZiBzIGlzIHplcm8uICBUaGF0IGlzLCBpZiBhbGwgcGFyaXR5IGJ5dGVzIGFyZSAwLCB3ZSBrbm93CisgKiB0aGVyZSBpcyBubyBlcnJvciBpbiB0aGUgZGF0YSBhbmQgY29uc2VxdWVudGx5IHRoZXJlIGlzIG5vIG5lZWQgdG8KKyAqIGNvbXB1dGUgcyh4KSBhdCBhbGwhICBJbiBhbGwgb3RoZXIgY2FzZXMsIHdlIGNvbXB1dGUgcyh4KSBmcm9tIHAoeCkKKyAqIGJ5IGV2YWx1YXRpbmcgKHJebSleaypwKHJebSkgZm9yIG09LTEsIG09MCwgYW5kIG09MS4gIFRoZSBwKHgpCisgKiBwb2x5bm9taWFsIGlzIGV2YWx1YXRlZCB2aWEgdGhlIEhvcm5lciBzY2hlbWUuCisgKi8KK3N0YXRpYyBpbnQgY29tcHV0ZV9zeW5kcm9tZXModW5zaWduZWQgbG9uZyAqZGF0YSwgaW50IG5ibG9ja3MsIHVuc2lnbmVkIGxvbmcgKnMpCit7CisJdW5zaWduZWQgbG9uZyBwWzNdOworCisJc2V0X3Bhcml0eShkYXRhLCBuYmxvY2tzLCBwLCAxKTsKKwlpZiAocFswXSB8IHBbMV0gfCBwWzJdKSB7CisJCS8qIFNvbWUgb2YgdGhlIGNoZWNrZWQgY29sdW1ucyBkbyBub3QgaGF2ZSBhIHplcm8KKwkJICogc3luZHJvbWUuICBGb3Igc2ltcGxpY2l0eSwgd2UgY29tcHV0ZSB0aGUgc3luZHJvbWVzCisJCSAqIGZvciBhbGwgY29sdW1ucyB0aGF0IHdlIGhhdmUgY29tcHV0ZWQgdGhlCisJCSAqIHJlbWFpbmRlcnMgZm9yLgorCQkgKi8KKwkJc1swXSA9IGdmbXVsX2V4cF9sb25nKAorCQkJZ2ZhZGRfbG9uZyhwWzBdLCAKKwkJCQkgICBnZm11bF9leHBfbG9uZygKKwkJCQkJICAgZ2ZhZGRfbG9uZyhwWzFdLCAKKwkJCQkJCSAgICAgIGdmbXVsX2V4cF9sb25nKHBbMl0sIC0xKSksCisJCQkJCSAgIC0xKSksIAorCQkJLW5ibG9ja3MpOworCQlzWzFdID0gZ2ZhZGRfbG9uZyhnZmFkZF9sb25nKHBbMl0sIHBbMV0pLCBwWzBdKTsKKwkJc1syXSA9IGdmbXVsX2V4cF9sb25nKAorCQkJZ2ZhZGRfbG9uZyhwWzBdLCAKKwkJCQkgICBnZm11bF9leHBfbG9uZygKKwkJCQkJICAgZ2ZhZGRfbG9uZyhwWzFdLAorCQkJCQkJICAgICAgZ2ZtdWxfZXhwX2xvbmcocFsyXSwgMSkpLAorCQkJCQkgICAxKSksCisJCQluYmxvY2tzKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDE7CisJfQorfQorCisKKy8qIENvcnJlY3QgdGhlIGJsb2NrIGluIHRoZSBjb2x1bW4gcG9pbnRlZCB0byBieSBEQVRBLiAgVGhlcmUgYXJlIE5CQUQKKyAqIENSQyBlcnJvcnMgYW5kIHRoZWlyIGluZGljZXMgYXJlIGluIEJBRF9MT0NbMF0sIHVwIHRvCisgKiBCQURfTE9DW05CQUQtMV0uICBJZiBOQkFEPjEsIEFpbnYgaG9sZHMgdGhlIGludmVyc2Ugb2YgdGhlIG1hdHJpeAorICogb2YgdGhlIGxpbmVhciBzeXN0ZW0gdGhhdCBuZWVkcyB0byBiZSBzb2x2ZWQgdG8gZGV0ZXJtaW5lIHRoZSBlcnJvcgorICogbWFnbml0dWRlcy4gIFNbMF0sIFNbMV0sIGFuZCBTWzJdIGFyZSB0aGUgc3luZHJvbWUgdmFsdWVzLiAgSWYgcm93CisgKiBqIGdldHMgY29ycmVjdGVkLCB0aGVuIGJpdCBqIHdpbGwgYmUgc2V0IGluIENPUlJFQ1RJT05fTUFQLgorICovCitzdGF0aWMgaW5saW5lIGludCBjb3JyZWN0X2Jsb2NrKF9fdTggKmRhdGEsIGludCBuYmxvY2tzLAorCQkJCWludCBuYmFkLCBpbnQgKmJhZF9sb2MsIE1hdHJpeCBBaW52LAorCQkJCV9fdTggKnMsCisJCQkJU2VjdG9yTWFwICogY29ycmVjdGlvbl9tYXApCit7CisJaW50IG5jb3JyZWN0ZWQgPSAwOworCWludCBpOworCV9fdTggdDEsIHQyOworCV9fdTggYzAsIGMxLCBjMjsJLyogY2hlY2sgYnl0ZXMgKi8KKwlfX3U4IGVycm9yX21hZ1szXSwgbG9nX2Vycm9yX21hZzsKKwlfX3U4ICpkcCwgbCwgZTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJc3dpdGNoIChuYmFkKSB7CisJY2FzZSAwOgorCQkvKiBtaWdodCBoYXZlIGEgQ1JDIGZhaWx1cmU6ICovCisJCWlmIChzWzBdID09IDApIHsKKwkJCS8qIG1vcmUgdGhhbiBvbmUgZXJyb3IgKi8KKwkJCVRSQUNFX0FCT1JUKC0xLCBmdF90X2VyciwKKwkJCQkgIkVDQyBmYWlsZWQgKDAgQ1JDIGVycm9ycywgPjEgQ1JDIGZhaWx1cmVzKSIpOworCQl9CisJCXQxID0gZ2ZkaXYoc1sxXSwgc1swXSk7CisJCWlmICgoYmFkX2xvY1tuYmFkKytdID0gZ2Zsb2dbdDFdKSA+PSBuYmxvY2tzKSB7CisJCQlUUkFDRShmdF90X2VyciwKKwkJCSAgICAgICJFQ0MgZmFpbGVkICgwIENSQyBlcnJvcnMsID4xIENSQyBmYWlsdXJlcykiKTsKKwkJCVRSQUNFX0FCT1JUKC0xLCBmdF90X2VyciwKKwkJCQkgICJhdHRlbXB0IHRvIGNvcnJlY3QgZGF0YSBhdCAlZCIsIGJhZF9sb2NbMF0pOworCQl9CisJCWVycm9yX21hZ1swXSA9IHNbMV07CisJCWJyZWFrOworCWNhc2UgMToKKwkJdDEgPSBnZmFkZChnZm11bF9leHAoc1sxXSwgYmFkX2xvY1swXSksIHNbMl0pOworCQl0MiA9IGdmYWRkKGdmbXVsX2V4cChzWzBdLCBiYWRfbG9jWzBdKSwgc1sxXSk7CisJCWlmICh0MSA9PSAwICYmIHQyID09IDApIHsKKwkJCS8qIG9uZSBlcmFzdXJlLCBubyBlcnJvcjogKi8KKwkJCUFpbnZbMF1bMF0gPSBnZnBvd1tiYWRfbG9jWzBdXTsKKwkJfSBlbHNlIGlmICh0MSA9PSAwIHx8IHQyID09IDApIHsKKwkJCS8qIG9uZSBlcmFzdXJlIGFuZCBtb3JlIHRoYW4gb25lIGVycm9yOiAqLworCQkJVFJBQ0VfQUJPUlQoLTEsIGZ0X3RfZXJyLAorCQkJCSAgICAiRUNDIGZhaWxlZCAoMSBlcmFzdXJlLCA+MSBlcnJvcikiKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG9uZSBlcmFzdXJlLCBvbmUgZXJyb3I6ICovCisJCQlpZiAoKGJhZF9sb2NbbmJhZCsrXSA9IGdmbG9nW2dmZGl2KHQxLCB0MildKSAKKwkJCSAgICA+PSBuYmxvY2tzKSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJFQ0MgZmFpbGVkICIKKwkJCQkgICAgICAiKDEgQ1JDIGVycm9ycywgPjEgQ1JDIGZhaWx1cmVzKSIpOworCQkJCVRSQUNFX0FCT1JUKC0xLCBmdF90X2VyciwKKwkJCQkJICAgICJhdHRlbXB0IHRvIGNvcnJlY3QgZGF0YSBhdCAlZCIsCisJCQkJCSAgICBiYWRfbG9jWzFdKTsKKwkJCX0KKwkJCWlmICghZ2ZpbnYyKGJhZF9sb2NbMF0sIGJhZF9sb2NbMV0sIEFpbnYpKSB7CisJCQkJLyogaW52ZXJzaW9uIGZhaWxlZC0tLW11c3QgaGF2ZSBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICB0aGFuIG9uZSBlcnJvciAKKwkJCQkgKi8KKwkJCQlUUkFDRV9FWElUIC0xOworCQkJfQorCQl9CisJCS8qIEZBTEwgVEhST1VHSCBUTyBFUlJPUiBNQUdOSVRVREUgQ09NUFVUQVRJT046CisJCSAqLworCWNhc2UgMjoKKwljYXNlIDM6CisJCS8qIGNvbXB1dGUgZXJyb3IgbWFnbml0dWRlczogKi8KKwkJZ2ZtYXRfbXVsKG5iYWQsIEFpbnYsIHMsIGVycm9yX21hZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJVFJBQ0VfQUJPUlQoLTEsIGZ0X3RfZXJyLAorCQkJICAgICJJbnRlcm5hbCBFcnJvcjogbnVtYmVyIG9mIENSQyBlcnJvcnMgPiAzIik7CisJfQorCisJLyogUGVyZm9ybSBjb3JyZWN0aW9uIGJ5IGFkZGluZyBFUlJPUl9NQUdbaV0gdG8gdGhlIGJ5dGUgYXQKKwkgKiBvZmZzZXQgQkFEX0xPQ1tpXS4gIEFsc28gYWRkIHRoZSB2YWx1ZSBvZiB0aGUgY29tcHV0ZWQKKwkgKiBlcnJvciBwb2x5bm9taWFsIHRvIHRoZSBzeW5kcm9tZSB2YWx1ZXMuICBJZiB0aGUgY29ycmVjdGlvbgorCSAqIHdhcyBzdWNjZXNzZnVsLCB0aGUgcmVzdWx0aW5nIGNoZWNrIGJ5dGVzIHNob3VsZCBiZSB6ZXJvCisJICogKGkuZS4sIHRoZSBjb3JyZWN0ZWQgZGF0YSBpcyBhIHZhbGlkIGNvZGUgd29yZCkuCisJICovCisJYzAgPSBzWzBdOworCWMxID0gc1sxXTsKKwljMiA9IHNbMl07CisJZm9yIChpID0gMDsgaSA8IG5iYWQ7ICsraSkgeworCQllID0gZXJyb3JfbWFnW2ldOworCQlpZiAoZSkgeworCQkJLyogY29ycmVjdCB0aGUgYnl0ZSBhdCBvZmZzZXQgTCBieSBtYWduaXR1ZGUgRTogKi8KKwkJCWwgPSBiYWRfbG9jW2ldOworCQkJZHAgPSAmZGF0YVtsICogRlRfU0VDVE9SX1NJWkVdOworCQkJKmRwID0gZ2ZhZGQoKmRwLCBlKTsKKwkJCSpjb3JyZWN0aW9uX21hcCB8PSAxIDw8IGw7CisJCQkrK25jb3JyZWN0ZWQ7CisKKwkJCWxvZ19lcnJvcl9tYWcgPSBnZmxvZ1tlXTsKKwkJCWMwID0gZ2ZhZGQoYzAsIGdmcG93W21vZDI1NShsb2dfZXJyb3JfbWFnIC0gbCldKTsKKwkJCWMxID0gZ2ZhZGQoYzEsIGUpOworCQkJYzIgPSBnZmFkZChjMiwgZ2Zwb3dbbW9kMjU1KGxvZ19lcnJvcl9tYWcgKyBsKV0pOworCQl9CisJfQorCWlmIChjMCB8fCBjMSB8fCBjMikgeworCQlUUkFDRV9BQk9SVCgtMSwgZnRfdF9lcnIsCisJCQkgICAgIkVDQyBzZWxmLWNoZWNrIGZhaWxlZCwgdG9vIG1hbnkgZXJyb3JzIik7CisJfQorCVRSQUNFX0VYSVQgbmNvcnJlY3RlZDsKK30KKworCisjaWYgZGVmaW5lZChFQ0NfU0FOSVRZX0NIRUNLKSB8fCBkZWZpbmVkKEVDQ19QQVJBTk9JRCkKKworLyogUGVyZm9ybSBhIHNhbml0eSBjaGVjayBvbiB0aGUgY29tcHV0ZWQgcGFyaXR5IGJ5dGVzOgorICovCitzdGF0aWMgaW50IHNhbml0eV9jaGVjayh1bnNpZ25lZCBsb25nICpkYXRhLCBpbnQgbmJsb2NrcykKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCXVuc2lnbmVkIGxvbmcgc1szXTsKKworCWlmICghY29tcHV0ZV9zeW5kcm9tZXMoZGF0YSwgbmJsb2NrcywgcykpIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfYnVnLAorCQkJICAgICJJbnRlcm5hbCBFcnJvcjogc3luZHJvbWUgc2VsZi1jaGVjayBmYWlsZWQiKTsKKwl9CisJVFJBQ0VfRVhJVCAxOworfQorCisjZW5kaWYgLyogZGVmaW5lZChFQ0NfU0FOSVRZX0NIRUNLKSB8fCBkZWZpbmVkKEVDQ19QQVJBTk9JRCkgKi8KKworLyogQ29tcHV0ZSB0aGUgcGFyaXR5IGZvciBhbiBlbnRpcmUgc2VnbWVudCBvZiBkYXRhLgorICovCitpbnQgZnRhcGVfZWNjX3NldF9zZWdtZW50X3Bhcml0eShzdHJ1Y3QgbWVtb3J5X3NlZ21lbnQgKm1zZWcpCit7CisJaW50IGk7CisJX191OCAqcGFyaXR5X2J5dGVzOworCisJcGFyaXR5X2J5dGVzID0gJm1zZWctPmRhdGFbKG1zZWctPmJsb2NrcyAtIDMpICogRlRfU0VDVE9SX1NJWkVdOworCWZvciAoaSA9IDA7IGkgPCBGVF9TRUNUT1JfU0laRTsgaSArPSBzaXplb2YobG9uZykpIHsKKwkJc2V0X3Bhcml0eSgodW5zaWduZWQgbG9uZyAqKSAmbXNlZy0+ZGF0YVtpXSwgbXNlZy0+YmxvY2tzIC0gMywKKwkJCSAgICh1bnNpZ25lZCBsb25nICopICZwYXJpdHlfYnl0ZXNbaV0sCisJCQkgICBGVF9TRUNUT1JfU0laRSAvIHNpemVvZihsb25nKSk7CisjaWZkZWYgRUNDX1BBUkFOT0lECisJCWlmICghc2FuaXR5X2NoZWNrKCh1bnNpZ25lZCBsb25nICopICZtc2VnLT5kYXRhW2ldLAorCQkJCSAgIG1zZWctPmJsb2NrcykpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorI2VuZGlmCQkJCS8qIEVDQ19QQVJBTk9JRCAqLworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBDaGVja3MgYW5kIGNvcnJlY3RzIChpZiBwb3NzaWJsZSkgdGhlIHNlZ21lbnQgTVNFRy4gIFJldHVybnMgb25lIG9mCisgKiBFQ0NfT0ssIEVDQ19DT1JSRUNURUQsIGFuZCBFQ0NfRkFJTEVELgorICovCitpbnQgZnRhcGVfZWNjX2NvcnJlY3RfZGF0YShzdHJ1Y3QgbWVtb3J5X3NlZ21lbnQgKm1zZWcpCit7CisJaW50IGNvbCwgaSwgcmVzdWx0OworCWludCBuY29ycmVjdGVkID0gMDsKKwlpbnQgbmVyYXN1cmVzID0gMDsJLyogIyBvZiBlcmFzdXJlcyAoQ1JDIGVycm9ycykgKi8KKwlpbnQgZXJhc3VyZV9sb2NbM107CS8qIGVyYXN1cmUgbG9jYXRpb25zICovCisJdW5zaWduZWQgbG9uZyBzc1szXTsKKwlfX3U4IHNbM107CisJTWF0cml4IEFpbnY7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwltc2VnLT5jb3JyZWN0ZWQgPSAwOworCisJLyogZmluZCBmaXJzdCBjb2x1bW4gdGhhdCBoYXMgbm9uLXplcm8gc3luZHJvbWVzOiAqLworCWZvciAoY29sID0gMDsgY29sIDwgRlRfU0VDVE9SX1NJWkU7IGNvbCArPSBzaXplb2YobG9uZykpIHsKKwkJaWYgKCFjb21wdXRlX3N5bmRyb21lcygodW5zaWduZWQgbG9uZyAqKSAmbXNlZy0+ZGF0YVtjb2xdLAorCQkJCSAgICAgICBtc2VnLT5ibG9ja3MsIHNzKSkgeworCQkJLyogc29tZXRoaW5nIGlzIHdyb25nLS0taGF2ZSB0byBmaXggdGhpbmdzICovCisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoY29sID49IEZUX1NFQ1RPUl9TSVpFKSB7CisJCS8qIGFsbCBzeW5kcm9tZXMgYXJlIG9rLCB0aGVyZWZvcmUgbm90aGluZyB0byBjb3JyZWN0ICovCisJCVRSQUNFX0VYSVQgRUNDX09LOworCX0KKwkvKiBjb3VudCB0aGUgbnVtYmVyIG9mIENSQyBlcnJvcnMgaWYgdGhlcmUgd2VyZSBhbnk6ICovCisJaWYgKG1zZWctPnJlYWRfYmFkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtc2VnLT5ibG9ja3M7IGkrKykgeworCQkJaWYgKEJBRF9DSEVDSyhtc2VnLT5yZWFkX2JhZCwgaSkpIHsKKwkJCQlpZiAobmVyYXN1cmVzID49IDMpIHsKKwkJCQkJLyogdGhpcyBpcyB0b28gbXVjaCBmb3IgRUNDICovCisJCQkJCVRSQUNFX0FCT1JUKEVDQ19GQUlMRUQsIGZ0X3RfZXJyLAorCQkJCQkJIkVDQyBmYWlsZWQgKD4zIENSQyBlcnJvcnMpIik7CisJCQkJfQkvKiBpZiAqLworCQkJCWVyYXN1cmVfbG9jW25lcmFzdXJlcysrXSA9IGk7CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgMiBDUkMgZXJyb3JzLCBkZXRlcm1pbmUgaW52ZXJzZSBvZiBtYXRyaXgKKwkgKiBvZiBsaW5lYXIgc3lzdGVtIHRvIGJlIHNvbHZlZDoKKwkgKi8KKwlzd2l0Y2ggKG5lcmFzdXJlcykgeworCWNhc2UgMjoKKwkJaWYgKCFnZmludjIoZXJhc3VyZV9sb2NbMF0sIGVyYXN1cmVfbG9jWzFdLCBBaW52KSkgeworCQkJVFJBQ0VfRVhJVCBFQ0NfRkFJTEVEOworCQl9CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaWYgKCFnZmludjMoZXJhc3VyZV9sb2NbMF0sIGVyYXN1cmVfbG9jWzFdLAorCQkJICAgIGVyYXN1cmVfbG9jWzJdLCBBaW52KSkgeworCQkJVFJBQ0VfRVhJVCBFQ0NfRkFJTEVEOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHRoaXMgaXMgbm90IGFuIGVycm9yIGNvbmRpdGlvbi4uLiAqLworCQlicmVhazsKKwl9CisKKwlkbyB7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobG9uZyk7ICsraSkgeworCQkJc1swXSA9IHNzWzBdOworCQkJc1sxXSA9IHNzWzFdOworCQkJc1syXSA9IHNzWzJdOworCQkJaWYgKHNbMF0gfCBzWzFdIHwgc1syXSkgeworI2lmZGVmIEJJR19FTkRJQU4KKwkJCQlyZXN1bHQgPSBjb3JyZWN0X2Jsb2NrKAorCQkJCQkmbXNlZy0+ZGF0YVtjb2wgKyBzaXplb2YobG9uZykgLSAxIC0gaV0sCisJCQkJCW1zZWctPmJsb2NrcywKKwkJCQkJbmVyYXN1cmVzLAorCQkJCQllcmFzdXJlX2xvYywKKwkJCQkJQWludiwKKwkJCQkJcywKKwkJCQkJJm1zZWctPmNvcnJlY3RlZCk7CisjZWxzZQorCQkJCXJlc3VsdCA9IGNvcnJlY3RfYmxvY2soJm1zZWctPmRhdGFbY29sICsgaV0sCisJCQkJCQkgICAgICAgbXNlZy0+YmxvY2tzLAorCQkJCQkJICAgICAgIG5lcmFzdXJlcywKKwkJCQkJCSAgICAgICBlcmFzdXJlX2xvYywKKwkJCQkJCSAgICAgICBBaW52LAorCQkJCQkJICAgICAgIHMsCisJCQkJCQkgICAgICAgJm1zZWctPmNvcnJlY3RlZCk7CisjZW5kaWYKKwkJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCQlUUkFDRV9FWElUIEVDQ19GQUlMRUQ7CisJCQkJfQorCQkJCW5jb3JyZWN0ZWQgKz0gcmVzdWx0OworCQkJfQorCQkJc3NbMF0gPj49IDg7CisJCQlzc1sxXSA+Pj0gODsKKwkJCXNzWzJdID4+PSA4OworCQl9CisKKyNpZmRlZiBFQ0NfU0FOSVRZX0NIRUNLCisJCWlmICghc2FuaXR5X2NoZWNrKCh1bnNpZ25lZCBsb25nICopICZtc2VnLT5kYXRhW2NvbF0sCisJCQkJICBtc2VnLT5ibG9ja3MpKSB7CisJCQlUUkFDRV9FWElUIEVDQ19GQUlMRUQ7CisJCX0KKyNlbmRpZgkJCQkvKiBFQ0NfU0FOSVRZX0NIRUNLICovCisKKwkJLyogZmluZCBuZXh0IGNvbHVtbiB3aXRoIG5vbi16ZXJvIHN5bmRyb21lczogKi8KKwkJd2hpbGUgKChjb2wgKz0gc2l6ZW9mKGxvbmcpKSA8IEZUX1NFQ1RPUl9TSVpFKSB7CisJCQlpZiAoIWNvbXB1dGVfc3luZHJvbWVzKCh1bnNpZ25lZCBsb25nICopCisJCQkJICAgICZtc2VnLT5kYXRhW2NvbF0sIG1zZWctPmJsb2Nrcywgc3MpKSB7CisJCQkJLyogc29tZXRoaW5nIGlzIHdyb25nLS0taGF2ZSB0byBmaXggdGhpbmdzICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IHdoaWxlIChjb2wgPCBGVF9TRUNUT1JfU0laRSk7CisJaWYgKG5jb3JyZWN0ZWQgJiYgbmVyYXN1cmVzID09IDApIHsKKwkJVFJBQ0UoZnRfdF93YXJuLCAiYmxvY2sgY29udGFpbmVkIGVycm9yIG5vdCBjYXVnaHQgYnkgQ1JDIik7CisJfQorCVRSQUNFKChuY29ycmVjdGVkID4gMCkgPyBmdF90X25vaXNlIDogZnRfdF9hbnksICJudW1iZXIgb2YgY29ycmVjdGlvbnM6ICVkIiwgbmNvcnJlY3RlZCk7CisJVFJBQ0VfRVhJVCBuY29ycmVjdGVkID8gRUNDX0NPUlJFQ1RFRCA6IEVDQ19PSzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1lY2MuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1lY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODI5MTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWVjYy5oCkBAIC0wLDAgKzEsODQgQEAKKyNpZm5kZWYgX0ZUQVBFX0VDQ19IXworI2RlZmluZSBfRlRBUEVfRUNDX0hfCisKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MyBOaW5nIGFuZCBEYXZpZCBNb3NiZXJnZXIuCisgKiAgICAgIE9yaWdpbmFsOgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMgQmFzIExhYXJob3Zlbi4KKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyIERhdmlkIEwuIEJyb3duLCBKci4KKyAKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorIFVTQS4KKyAKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZWNjLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODoxMSAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUKKyAqICAgICAgUmVlZC1Tb2xvbW9uIGVycm9yIGNvcnJlY3Rpb24gY29kZSAKKyAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAgdGFwZSBzdHJlYW1lciBkZXZpY2UgZHJpdmVyLgorICovCisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKKworI2RlZmluZSBCQURfQ0xFQVIoZW50cnkpICgoZW50cnkpPTApCisjZGVmaW5lIEJBRF9TRVQoZW50cnksc2VjdG9yKSAoKGVudHJ5KXw9KDE8PChzZWN0b3IpKSkKKyNkZWZpbmUgQkFEX0NIRUNLKGVudHJ5LHNlY3RvcikgKChlbnRyeSkmKDE8PChzZWN0b3IpKSkKKworLyoKKyAqIFJldHVybiB2YWx1ZXMgZm9yIGVjY19jb3JyZWN0X2RhdGE6CisgKi8KK2VudW0geworCUVDQ19PSywJCQkvKiBEYXRhIHdhcyBjb3JyZWN0LiAqLworCUVDQ19DT1JSRUNURUQsCQkvKiBDb3JyZWN0YWJsZSBlcnJvciBpbiBkYXRhLiAqLworCUVDQ19GQUlMRUQsCQkvKiBDb3VsZCBub3QgY29ycmVjdCBkYXRhLiAqLworfTsKKworLyoKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGFuIGluIG1lbW9yeSBzZWdtZW50LiAgTUFSS0VEX0JBRCBsaXN0cyB0aGUKKyAqIHNlY3RvcnMgdGhhdCB3ZXJlIG1hcmtlZCBiYWQgZHVyaW5nIGZvcm1hdHRpbmcuICBJZiB0aGUgTi10aCBzZWN0b3IKKyAqIGluIGEgc2VnbWVudCBpcyBtYXJrZWQgYmFkLCBiaXQgMTw8TiB3aWxsIGJlIHNldCBpbiBNQVJLRURfQkFELgorICogVGhlIHNlY3RvcnMgc2hvdWxkIGJlIHJlYWQgaW4gZnJvbSB0aGUgZGlzayBhbmQgcGFja2VkLCBhcyBpZiB0aGUKKyAqIGJhZCBzZWN0b3JzIHdlcmUgbm90IHRoZXJlLCBhbmQgdGhlIHNlZ21lbnQganVzdCBjb250YWluZWQgZmV3ZXIKKyAqIHNlY3RvcnMuICBSRUFEX1NFQ1RPUlMgaXMgYSBiaXRtYXAgb2YgZXJyb3JzIGVuY291bnRlcmVkIHdoaWxlCisgKiByZWFkaW5nIHRoZSBkYXRhLiAgVGhlc2Ugb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHBhY2tlZCBkYXRhLgorICogQkxPQ0tTIGlzIGEgY291bnQgb2YgdGhlIHNlY3RvcnMgbm90IG1hcmtlZCBiYWQuICBUaGlzIGlzIGp1c3QgdG8KKyAqIHByZXZlbnQgaGF2aW5nIHRvIGNvdW50IHRoZSB6ZXJvIGJpdHMgaW4gTUFSS0VEX0JBRCBlYWNoIHRpbWUgdGhpcworICogaXMgbmVlZGVkLiAgREFUQSBpcyB0aGUgYWN0dWFsIHNlY3RvciBwYWNrZWQgZGF0YSBmcm9tIChvciB0bykgdGhlCisgKiB0YXBlLgorICovCisgc3RydWN0IG1lbW9yeV9zZWdtZW50IHsKKwlTZWN0b3JNYXAgbWFya2VkX2JhZDsKKwlTZWN0b3JNYXAgcmVhZF9iYWQ7CisgCWludCBibG9ja3M7CisgCV9fdTggKmRhdGE7CisJU2VjdG9yTWFwIGNvcnJlY3RlZDsKKyB9OworCisvKgorICogZWNjLmMgZGVmaW5lZCBnbG9iYWwgdmFyaWFibGVzOgorICovCisjaWZkZWYgVEVTVAorZXh0ZXJuIGludCBmdGFwZV9lY2NfdHJhY2luZzsKKyNlbmRpZgorCisvKgorICogZWNjLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zOgorICovCitleHRlcm4gaW50IGZ0YXBlX2VjY19jb3JyZWN0X2RhdGEoc3RydWN0IG1lbW9yeV9zZWdtZW50ICpkYXRhKTsKK2V4dGVybiBpbnQgZnRhcGVfZWNjX3NldF9zZWdtZW50X3Bhcml0eShzdHJ1Y3QgbWVtb3J5X3NlZ21lbnQgKmRhdGEpOworCisjZW5kaWYJLyogX0ZUQVBFX0VDQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDRjNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmMKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1mb3JtYXQuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yLjQuMSAkCisgKiAkRGF0ZTogMTk5Ny8xMS8xNCAxNjowNTozOSAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdG8gc3VwcG9ydCBmb3JtYXR0aW5nIG9mIGZsb3BweQorICogICAgICB0YXBlIGNhcnRyaWRnZXMgd2l0aCB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZQorICogICAgICBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCisgKi8KKyAKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWVjYy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5oIgorCisjaWYgZGVmaW5lZChURVNUSU5HKQorI2RlZmluZSBGVF9GTVRfU0VHU19QRVJfQlVGIDUwCisjZWxzZQorI2RlZmluZSBGVF9GTVRfU0VHU19QRVJfQlVGIChGVF9CVUZGX1NJWkUvKDQqRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkpCisjZW5kaWYKKworc3RhdGljIHNwaW5sb2NrX3QgZnRhcGVfZm9ybWF0X2xvY2s7CisKKy8qCisgKiAgZmlyc3Qgc2VnbWVudCBvZiB0aGUgbmV3IGJ1ZmZlcgorICovCitzdGF0aWMgaW50IHN3aXRjaF9zZWdtZW50OworCisvKgorICogIGF0IG1vc3QgMjU2IHNlZ21lbnRzIGZpdCBpbnRvIG9uZSAzMiBrYiBidWZmZXIuICBFdmVuIFRSLTEgY2FydHJpZGdlcyBoYXZlCisgKiAgbW9yZSB0aGFuIHRoaXMgbWFueSBzZWdtZW50cyBwZXIgdHJhY2ssIHNvIGJldHRlciBiZSBjYXJlZnVsLgorICoKKyAqICBidWZmZXJfc3RydWN0ICpidWZmOiBidWZmZXIgdG8gc3RvcmUgdGhlIGZvcm1hdHRpbmcgY29vcmRpbmF0ZXMgaW4KKyAqICBpbnQgIHN0YXJ0OiBzdGFydGluZyBzZWdtZW50IGZvciB0aGlzIGJ1ZmZlci4KKyAqICBpbnQgICAgc3B0OiBzZWdtZW50cyBwZXIgdHJhY2sKKyAqCisgKiAgTm90ZTogc2VnbWVudCBpZHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgdHJhY2sgaGVyZS4KKyAqLworc3RhdGljIHZvaWQgc2V0dXBfZm9ybWF0X2J1ZmZlcihidWZmZXJfc3RydWN0ICpidWZmLCBpbnQgc3RhcnQsIGludCBzcHQsCisJCQkJX191OCBnYXAzKQoreworCWludCB0b19kbyA9IHNwdCAtIHN0YXJ0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKHRvX2RvID4gRlRfRk1UX1NFR1NfUEVSX0JVRikgeworCQl0b19kbyA9IEZUX0ZNVF9TRUdTX1BFUl9CVUY7CisJfQorCWJ1ZmYtPnB0ciAgICAgICAgICA9IGJ1ZmYtPmFkZHJlc3M7CisJYnVmZi0+cmVtYWluaW5nICAgID0gdG9fZG8gKiBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UOyAvKiAjIHNlY3RvcnMgKi8KKwlidWZmLT5ieXRlcyAgICAgICAgPSBidWZmLT5yZW1haW5pbmcgKiA0OyAvKiBuZWVkIDQgYnl0ZXMgcGVyIHNlY3RvciAqLworCWJ1ZmYtPmdhcDMgICAgICAgICA9IGdhcDM7CisJYnVmZi0+c2VnbWVudF9pZCAgID0gc3RhcnQ7CisJYnVmZi0+bmV4dF9zZWdtZW50ID0gc3RhcnQgKyB0b19kbzsKKwlpZiAoYnVmZi0+bmV4dF9zZWdtZW50ID49IHNwdCkgeworCQlidWZmLT5uZXh0X3NlZ21lbnQgPSAwOyAvKiAwIG1lYW5zOiBzdG9wIHJ1bm5lciAqLworCX0KKwlidWZmLT5zdGF0dXMgICAgICAgPSB3YWl0aW5nOyAvKiB0ZWxscyB0aGUgaXNyIHRoYXQgaXQgY2FuIHVzZQorCQkJCSAgICAgICAqIHRoaXMgYnVmZmVyCisJCQkJICAgICAgICovCisJVFJBQ0VfRVhJVDsKK30KKworCisvKgorICogIHN0YXJ0IGZvcm1hdHRpbmcgYSBuZXcgdHJhY2suCisgKi8KK2ludCBmdGFwZV9mb3JtYXRfdHJhY2soY29uc3QgdW5zaWduZWQgaW50IHRyYWNrLCBjb25zdCBfX3U4IGdhcDMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlidWZmZXJfc3RydWN0ICp0YWlsLCAqaGVhZDsKKwlpbnQgc3RhdHVzOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnBhdXNlLCAmc3RhdHVzKSwpOworCWlmICh0cmFjayAmIDEpIHsKKwkJaWYgKCEoc3RhdHVzICYgUUlDX1NUQVRVU19BVF9FT1QpKSB7CisJCQlUUkFDRV9DQVRDSChmdGFwZV9zZWVrX3RvX2VvdCgpLCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIShzdGF0dXMgJiBRSUNfU1RBVFVTX0FUX0JPVCkpIHsKKwkJCVRSQUNFX0NBVENIKGZ0YXBlX3NlZWtfdG9fYm90KCksKTsKKwkJfQorCX0KKwlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsgLyogdGhpcyBzZXRzIGZ0X2hlYWQgPSBmdF90YWlsID0gMCAqLworCWZ0YXBlX3NldF9zdGF0ZShmb3JtYXR0aW5nKTsKKworCVRSQUNFKGZ0X3Rfbm9pc2UsCisJICAgICAgIkZvcm1hdHRpbmcgdHJhY2sgJWQsIGxvZ2ljYWw6IGZyb20gc2VnbWVudCAlZCB0byAlZCIsCisJICAgICAgdHJhY2ssIHRyYWNrICogZnRfc2VnbWVudHNfcGVyX3RyYWNrLCAKKwkgICAgICAodHJhY2sgKyAxKSAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjayAtIDEpOworCQorCS8qCisJICogIGluaXRpYWxpemUgdGhlIGJ1ZmZlciBzd2l0Y2hpbmcgcHJvdG9jb2wgZm9yIHRoaXMgdHJhY2sKKwkgKi8KKwloZWFkID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsgLyogdGFwZSBpc24ndCBydW5uaW5nIHlldCAqLworCXRhaWwgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOyAvKiB0YXBlIGlzbid0IHJ1bm5pbmcgeWV0ICovCisJc3dpdGNoX3NlZ21lbnQgPSAwOworCWRvIHsKKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQlzZXR1cF9mb3JtYXRfYnVmZmVyKHRhaWwsIHN3aXRjaF9zZWdtZW50LAorCQkJCSAgICBmdF9zZWdtZW50c19wZXJfdHJhY2ssIGdhcDMpOworCQlzd2l0Y2hfc2VnbWVudCA9IHRhaWwtPm5leHRfc2VnbWVudDsKKwl9IHdoaWxlICgoc3dpdGNoX3NlZ21lbnQgIT0gMCkgJiYKKwkJICgodGFpbCA9IGZ0YXBlX25leHRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpKSAhPSBoZWFkKSk7CisJLyogZ28gKi8KKwloZWFkLT5zdGF0dXMgPSBmb3JtYXR0aW5nOworCVRSQUNFX0NBVENIKGZ0YXBlX3NlZWtfaGVhZF90b190cmFjayh0cmFjayksKTsKKwlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKFFJQ19MT0dJQ0FMX0ZPUldBUkQpLCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmZ0YXBlX2Zvcm1hdF9sb2NrLCBmbGFncyk7CisJVFJBQ0VfQ0FUQ0goZmRjX3NldHVwX2Zvcm1hdHRpbmcoaGVhZCksIHJlc3RvcmVfZmxhZ3MoZmxhZ3MpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmdGFwZV9mb3JtYXRfbG9jaywgZmxhZ3MpOworCVRSQUNFX0VYSVQgMDsKK30KKworLyogICByZXR1cm4gc2VnbWVudCBpZCBvZiBzZWdtZW50IGN1cnJlbnRseSBiZWluZyBmb3JtYXR0ZWQgYW5kIGRvIHRoZQorICogICBidWZmZXIgc3dpdGNoaW5nIHN0dWZmLgorICovCitpbnQgZnRhcGVfZm9ybWF0X3N0YXR1cyh1bnNpZ25lZCBpbnQgKnNlZ21lbnRfaWQpCit7CisJYnVmZmVyX3N0cnVjdCAqdGFpbCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfdGFpbCk7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXdoaWxlIChzd2l0Y2hfc2VnbWVudCAhPSAwICYmCisJICAgICAgIGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCkgIT0gdGFpbCkgeworCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCS8qICBuZWVkIG1vcmUgYnVmZmVycywgZmlyc3Qgd2FpdCBmb3IgZW1wdHkgYnVmZmVyCisJCSAqLworCQlUUkFDRV9DQVRDSChmdGFwZV93YWl0X3NlZ21lbnQoZm9ybWF0dGluZyksKTsKKwkJLyogIGRvbid0IHdvcnJ5IGZvciBnYXAzLiBJZiB3ZSBldmVyIGhpdCB0aGlzIHBpZWNlIG9mIGNvZGUsCisJCSAqICB0aGVuIGFsbCBidWZmZXIgYWxyZWFkeSBoYXZlIHRoZSBjb3JyZWN0IGdhcDMgc2V0IQorCQkgKi8KKwkJc2V0dXBfZm9ybWF0X2J1ZmZlcih0YWlsLCBzd2l0Y2hfc2VnbWVudCwKKwkJCQkgICAgZnRfc2VnbWVudHNfcGVyX3RyYWNrLCB0YWlsLT5nYXAzKTsKKwkJc3dpdGNoX3NlZ21lbnQgPSB0YWlsLT5uZXh0X3NlZ21lbnQ7CisJCWlmIChzd2l0Y2hfc2VnbWVudCAhPSAwKSB7CisJCQl0YWlsID0gZnRhcGVfbmV4dF9idWZmZXIoZnRfcXVldWVfdGFpbCk7CisJCX0KKwl9CisJLyogICAgc2hvdWxkIHJ1bm5lciBzdG9wID8KKwkgKi8KKwlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBhYm9ydGluZyB8fCBmdF9ydW5uZXJfc3RhdHVzID09IGRvX2Fib3J0KSB7CisJCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCQlUUkFDRShmdF90X3dhcm4sICJFcnJvciBmb3JtYXR0aW5nIHNlZ21lbnQgJWQiLAorCQkgICAgICBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpLT5zZWdtZW50X2lkKTsKKwkJKHZvaWQpZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7CisJCVRSQUNFX0VYSVQgKGhlYWQtPnN0YXR1cyAhPSBlcnJvcikgPyAtRUFHQUlOIDogLUVJTzsKKwl9CisJLyoKKwkgKiAgZG9uJ3QgY2FyZSBpZiB0aGUgdGltZXIgZXhwaXJlcywgdGhpcyBpcyBqdXN0IGtpbmQgb2YgYQorCSAqICAic2VsZWN0IiBvcGVyYXRpb24gdGhhdCBsZXRzIHRoZSBjYWxsaW5nIHByb2Nlc3Mgc2xlZXAKKwkgKiAgdW50aWwgc29tZXRoaW5nIGhhcyBoYXBwZW5lZAorCSAqLworCWlmIChmZGNfaW50ZXJydXB0X3dhaXQoNSAqIEZUX1NFQ09ORCkgPCAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJFbmQgb2YgdHJhY2sgJWQgYXQgc2VnbWVudCAlZCIsCisJCSAgICAgIGZ0X2xvY2F0aW9uLnRyYWNrLAorCQkgICAgICBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpLT5zZWdtZW50X2lkKTsKKwkJcmVzdWx0ID0gMTsgIC8qIGVuZCBvZiB0cmFjaywgdW5sb2NrIG1vZHVsZSAqLworCX0gZWxzZSB7CisJCXJlc3VsdCA9IDA7CisJfQorCS8qCisJICogIHRoZSBjYWxsaW5nIHByb2Nlc3Mgc2hvdWxkIHVzZSB0aGUgc2VnIGlkIHRvIGRldGVybWluZQorCSAqICB3aGljaCBwYXJ0cyBvZiB0aGUgZG1hIGJ1ZmZlcnMgY2FuIGJlIHNhZmVseSBvdmVyd3JpdHRlbgorCSAqICB3aXRoIG5ldyBkYXRhLgorCSAqLworCSpzZWdtZW50X2lkID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKS0+c2VnbWVudF9pZDsKKwkvKgorCSAqICBJbnRlcm5hbGx5IHdlIHN0YXJ0IGNvdW50aW5nIHNlZ21lbnQgaWRzIGZyb20gdGhlIHN0YXJ0IG9mCisJICogIGVhY2ggdHJhY2sgd2hlbiBmb3JtYXR0aW5nLCBidXQgZXh0ZXJuYWxseSB3ZSBrZWVwIHRoZW0KKwkgKiAgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0YXBlOgorCSAqLworCSpzZWdtZW50X2lkICs9IGZ0X2xvY2F0aW9uLnRyYWNrICogZnRfc2VnbWVudHNfcGVyX3RyYWNrOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKgorICogIFRoZSBzZWdtZW50IGlkIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgdGFwZQorICovCitpbnQgZnRhcGVfdmVyaWZ5X3NlZ21lbnQoY29uc3QgdW5zaWduZWQgaW50IHNlZ21lbnRfaWQsIFNlY3Rvck1hcCAqYnNtKQoreworCWludCByZXN1bHQ7CisJaW50IHZlcmlmeV9kb25lID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFKGZ0X3Rfbm9pc2UsICJWZXJpZnlpbmcgc2VnbWVudCAlZCIsIHNlZ21lbnRfaWQpOworCisJaWYgKGZ0X2RyaXZlcl9zdGF0ZSAhPSB2ZXJpZnlpbmcpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImNhbGxpbmcgZnRhcGVfYWJvcnRfb3BlcmF0aW9uIik7CisJCWlmIChmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSA8IDApIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiZnRhcGVfYWJvcnRfb3BlcmF0aW9uIGZhaWxlZCIpOworCQkJVFJBQ0VfRVhJVCAtRUlPOworCQl9CisJfQorCSpic20gPSAweDAwMDAwMDAwOworCWZ0YXBlX3NldF9zdGF0ZSh2ZXJpZnlpbmcpOworCWZvciAoOzspIHsKKwkJYnVmZmVyX3N0cnVjdCAqdGFpbDsKKwkJLyoKKwkJICogIEFsbG93IGVzY2FwZSBmcm9tIHRoaXMgbG9vcCBvbiBzaWduYWwKKwkJICovCisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJLyoKKwkJICogIFNlYXJjaCBhbGwgZnVsbCBidWZmZXJzIGZvciB0aGUgZmlyc3QgbWF0Y2hpbmcgdGhlCisJCSAqICB3YW50ZWQgc2VnbWVudC4gIENsZWFyIG90aGVyIGJ1ZmZlcnMgb24gdGhlIGZseS4KKwkJICovCisJCXRhaWwgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOworCQl3aGlsZSAoIXZlcmlmeV9kb25lICYmIHRhaWwtPnN0YXR1cyA9PSBkb25lKSB7CisJCQkvKgorCQkJICogIEFsbG93IGVzY2FwZSBmcm9tIHRoaXMgbG9vcCBvbiBzaWduYWwgIQorCQkJICovCisJCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCQlpZiAodGFpbC0+c2VnbWVudF9pZCA9PSBzZWdtZW50X2lkKSB7CisJCQkJLyogIElmIG91dCBidWZmZXIgaXMgYWxyZWFkeSBmdWxsLAorCQkJCSAqICByZXR1cm4gaXRzIGNvbnRlbnRzLiAgCisJCQkJICovCisJCQkJVFJBQ0UoZnRfdF9mbG93LCAiZm91bmQgc2VnbWVudCBpbiBjYWNoZTogJWQiLAorCQkJCSAgICAgIHNlZ21lbnRfaWQpOworCQkJCWlmICgodGFpbC0+c29mdF9lcnJvcl9tYXAgfAorCQkJCSAgICAgdGFpbC0+aGFyZF9lcnJvcl9tYXApICE9IDApIHsKKwkJCQkJVFJBQ0UoZnRfdF9pbmZvLCJic21bJWRdID0gMHglMDhseCIsCisJCQkJCSAgICAgIHNlZ21lbnRfaWQsCisJCQkJCSAgICAgICh1bnNpZ25lZCBsb25nKQorCQkJCQkgICAgICAodGFpbC0+c29mdF9lcnJvcl9tYXAgfAorCQkJCQkgICAgICB0YWlsLT5oYXJkX2Vycm9yX21hcCkpOworCQkJCQkqYnNtID0gKHRhaWwtPnNvZnRfZXJyb3JfbWFwIHwKKwkJCQkJCXRhaWwtPmhhcmRfZXJyb3JfbWFwKTsKKwkJCQl9CisJCQkJdmVyaWZ5X2RvbmUgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2Zsb3csInphcHBpbmcgc2VnbWVudCBpbiBjYWNoZTogJWQiLAorCQkJCSAgICAgIHRhaWwtPnNlZ21lbnRfaWQpOworCQkJfQorCQkJdGFpbC0+c3RhdHVzID0gd2FpdGluZzsKKwkJCXRhaWwgPSBmdGFwZV9uZXh0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKTsKKwkJfQorCQlpZiAoIXZlcmlmeV9kb25lICYmIHRhaWwtPnN0YXR1cyA9PSB2ZXJpZnlpbmcpIHsKKwkJCWlmICh0YWlsLT5zZWdtZW50X2lkID09IHNlZ21lbnRfaWQpIHsKKwkJCQlzd2l0Y2goZnRhcGVfd2FpdF9zZWdtZW50KHZlcmlmeWluZykpIHsKKwkJCQljYXNlIDA6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgLUVJTlRSOgorCQkJCQlUUkFDRV9BQk9SVCgtRUlOVFIsIGZ0X3Rfd2FybiwKKwkJCQkJCSAgICAiaW50ZXJydXB0ZWQgYnkgIgorCQkJCQkJICAgICJub24tYmxvY2thYmxlIHNpZ25hbCIpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKKwkJCQkJZnRhcGVfc2V0X3N0YXRlKHZlcmlmeWluZyk7CisJCQkJCS8qIGJlIHBpY2t5ICovCisJCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3Rfd2FybiwKKwkJCQkJCSAgICAid2FpdF9zZWdtZW50IGZhaWxlZCIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogIFdlJ3JlIHJlYWRpbmcgdGhlIHdyb25nIHNlZ21lbnQsCisJCQkJICogIHN0b3AgcnVubmVyLgorCQkJCSAqLworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ2ZXJpZnlpbmcgd3Jvbmcgc2VnbWVudCIpOworCQkJCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOworCQkJCWZ0YXBlX3NldF9zdGF0ZSh2ZXJpZnlpbmcpOworCQkJfQorCQl9CisJCS8qICAgIHNob3VsZCBydW5uZXIgc3RvcCA/CisJCSAqLworCQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBhYm9ydGluZykgeworCQkJYnVmZmVyX3N0cnVjdCAqaGVhZCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCk7CisJCQlpZiAoaGVhZC0+c3RhdHVzID09IGVycm9yIHx8CisJCQkgICAgaGVhZC0+c3RhdHVzID09IHZlcmlmeWluZykgeworCQkJCS8qIG5vIGRhdGEgb3Igb3ZlcnJ1biBlcnJvciAqLworCQkJCWhlYWQtPnN0YXR1cyA9IHdhaXRpbmc7CisJCQl9CisJCQlUUkFDRV9DQVRDSChmdGFwZV9kdW1iX3N0b3AoKSwpOworCQl9IGVsc2UgeworCQkJLyogIElmIGp1c3QgcGFzc2VkIGxhc3Qgc2VnbWVudCBvbiB0YXBlOiB3YWl0CisJCQkgKiAgZm9yIEJPVCBvciBFT1QgbWFyay4gU2V0cyBmdF9ydW5uZXJfc3RhdHVzIHRvCisJCQkgKiAgaWRsZSBpZiBhdCBsRU9UIGFuZCBzdWNjZXNzZnVsIAorCQkJICovCisJCQlUUkFDRV9DQVRDSChmdGFwZV9oYW5kbGVfbG9naWNhbF9lb3QoKSwpOworCQl9CisJCWlmICh2ZXJpZnlfZG9uZSkgeworCQkJVFJBQ0VfRVhJVCAwOworCQl9CisJCS8qICAgIE5vdyBhdCBsZWFzdCBvbmUgYnVmZmVyIGlzIGlkbGUhCisJCSAqICAgIFJlc3RhcnQgcnVubmVyICYgdGFwZSBpZiBuZWVkZWQuCisJCSAqLworCQkvKiAgV2UgY291bGQgb3B0aW1pemUgdGhlIGZvbGxvd2luZyBhIGxpdHRsZSBiaXQuIFdlIGtub3cgdGhhdCAKKwkJICogIHRoZSBiYWQgc2VjdG9yIG1hcCBpcyBlbXB0eS4KKwkJICovCisJCXRhaWwgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOworCQlpZiAodGFpbC0+c3RhdHVzID09IHdhaXRpbmcpIHsKKwkJCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCisJCQlmdGFwZV9zZXR1cF9uZXdfc2VnbWVudChoZWFkLCBzZWdtZW50X2lkLCAtMSk7CisJCQlmdGFwZV9jYWxjX25leHRfY2x1c3RlcihoZWFkKTsKKwkJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGlkbGUpIHsKKwkJCQlyZXN1bHQgPSBmdGFwZV9zdGFydF90YXBlKHNlZ21lbnRfaWQsCisJCQkJCQkJICBoZWFkLT5zZWN0b3Jfb2Zmc2V0KTsKKwkJCQlzd2l0Y2gocmVzdWx0KSB7CisJCQkJY2FzZSAwOgorCQkJCQlicmVhazsKKwkJCQljYXNlIC1FVElNRToKKwkJCQljYXNlIC1FSU5UUjoKKwkJCQkJVFJBQ0VfQUJPUlQocmVzdWx0LCBmdF90X2VyciwgIkVycm9yOiAiCisJCQkJCQkgICAgInNlZ21lbnQgJWQgdW5yZWFjaGFibGUiLAorCQkJCQkJICAgIHNlZ21lbnRfaWQpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQkqYnNtID0gRU1QVFlfU0VHTUVOVDsKKwkJCQkJVFJBQ0VfRVhJVCAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQloZWFkLT5zdGF0dXMgPSB2ZXJpZnlpbmc7CisJCQlmZGNfc2V0dXBfcmVhZF93cml0ZShoZWFkLCBGRENfVkVSSUZZKTsKKwkJfQorCX0KKwkvKiBub3QgcmVhY2hlZCAqLworCVRSQUNFX0VYSVQgLUVJTzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1mb3JtYXQuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1mb3JtYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTUxNjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5oCkBAIC0wLDAgKzEsMzcgQEAKKyNpZm5kZWYgX0ZUQVBFX0ZPUk1BVF9ICisjZGVmaW5lIF9GVEFQRV9GT1JNQVRfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1mb3JtYXQuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjEzICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbG93IGxldmVsIGRlZmluaXRpb25zIGZvciB0aGUKKyAqICAgICAgZm9ybWF0dGluZyBzdXBwb3J0IGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZQorICogICAgICBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCisgKi8KKworI2lmZGVmIF9fS0VSTkVMX18KK2V4dGVybiBpbnQgZnRhcGVfZm9ybWF0X3RyYWNrKGNvbnN0IHVuc2lnbmVkIGludCB0cmFjaywgY29uc3QgX191OCBnYXAzKTsKK2V4dGVybiBpbnQgZnRhcGVfZm9ybWF0X3N0YXR1cyh1bnNpZ25lZCBpbnQgKnNlZ21lbnRfaWQpOworZXh0ZXJuIGludCBmdGFwZV92ZXJpZnlfc2VnbWVudChjb25zdCB1bnNpZ25lZCBpbnQgc2VnbWVudF9pZCwgU2VjdG9yTWFwICpic20pOworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW5pdC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTQyNjBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWluaXQuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaW50ZXJmYWNlcyB0aGUga2VybmVsCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2lmZGVmIENPTkZJR19aRlRBUEUKKyNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1idWZmZXIuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1wcm9jLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorCisKKyNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgIWRlZmluZWQoQ09ORklHX0ZUX05PX1RSQUNFX0FUX0FMTCkKK3N0YXRpYyBpbnQgZnRfdHJhY2luZyA9IC0xOworI2VuZGlmCisKKworLyogIENhbGxlZCBieSBtb2R1bGVzIHBhY2thZ2Ugd2hlbiBpbnN0YWxsaW5nIHRoZSBkcml2ZXIKKyAqICBvciBieSBrZXJuZWwgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBwaGFzZQorICovCitzdGF0aWMgaW50IF9faW5pdCBmdGFwZV9pbml0KHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKyNpZmRlZiBNT0RVTEUKKyNpZm5kZWYgQ09ORklHX0ZUX05PX1RSQUNFX0FUX0FMTAorCWlmIChmdF90cmFjaW5nICE9IC0xKSB7CisJCWZ0YXBlX3RyYWNpbmcgPSBmdF90cmFjaW5nOworCX0KKyNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gRlRBUEVfVkVSU0lPTiAiXG4iKTsKKyAgICAgICAgaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfaW5mbykgeworCQlwcmludGsoCitLRVJOX0lORk8gIihjKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiAoYmFzQHZpbWVjLm5sKVxuIgorS0VSTl9JTkZPICIoYykgMTk5NS0xOTk2IEthaSBIYXJyZWtpbGRlLVBldGVyc2VuIChraHBAZG9scGhpbmljcy5ubylcbiIKK0tFUk5fSU5GTyAiKGMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUgKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSlcbiIKK0tFUk5fSU5GTyAiUUlDLTExNyBkcml2ZXIgZm9yIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5IHRhcGUgZHJpdmVzXG4iKTsKKyAgICAgICAgfQorI2Vsc2UgLyogIU1PRFVMRSAqLworCS8qIHByaW50IGEgc2hvcnQgbm8tbm9uc2Vuc2UgYm9vdCBtZXNzYWdlICovCisJcHJpbnRrKEtFUk5fSU5GTyBGVEFQRV9WRVJTSU9OICJcbiIpOworI2VuZGlmIC8qIE1PRFVMRSAqLworCVRSQUNFKGZ0X3RfaW5mbywgImluc3RhbGxpbmcgUUlDLTExNyBmbG9wcHkgdGFwZSBoYXJkd2FyZSBkcml2ZSAuLi4gIik7CisJVFJBQ0UoZnRfdF9pbmZvLCAiZnRhcGVfaW5pdCBAIDB4JXAiLCBmdGFwZV9pbml0KTsKKwkvKiAgQWxsb2NhdGUgdGhlIERNQSBidWZmZXJzLiBUaGV5IGFyZSBkZWFsbG9jYXRlZCBhdCBjbGVhbnVwKCkgdGltZS4KKwkgKi8KKyNpZmRlZiBURVNUSU5HCisjaWZkZWYgTU9EVUxFCisJd2hpbGUgKGZ0YXBlX3NldF9ucl9idWZmZXJzKENPTkZJR19GVF9OUl9CVUZGRVJTKSA8IDApIHsKKwkJZnRhcGVfc2xlZXAoRlRfU0VDT05ELzIwKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkodm9pZClmdGFwZV9zZXRfbnJfYnVmZmVycygwKTsKKwkJCVRSQUNFKGZ0X3RfYnVnLAorCQkJICAgICAgIktpbGxlZCBieSBzaWduYWwgd2hpbGUgYWxsb2NhdGluZyBidWZmZXJzLiIpOworCQkJVFJBQ0VfQUJPUlQoLUVJTlRSLCAKKwkJCQkgICAgZnRfdF9idWcsICJGcmVlIHVwIG1lbW9yeSBhbmQgcmV0cnkiKTsKKwkJfQorCX0KKyNlbHNlCisJVFJBQ0VfQ0FUQ0goZnRhcGVfc2V0X25yX2J1ZmZlcnMoQ09ORklHX0ZUX05SX0JVRkZFUlMpLAorCQkgICAgKHZvaWQpZnRhcGVfc2V0X25yX2J1ZmZlcnMoMCkpOworI2VuZGlmCisjZWxzZQorCVRSQUNFX0NBVENIKGZ0YXBlX3NldF9ucl9idWZmZXJzKENPTkZJR19GVF9OUl9CVUZGRVJTKSwKKwkJICAgICh2b2lkKWZ0YXBlX3NldF9ucl9idWZmZXJzKDApKTsKKyNlbmRpZgorCWZ0X2RyaXZlX3NlbCA9IC0xOworCWZ0X2ZhaWx1cmUgICA9IDE7ICAgICAgICAgLyogaW5oaWJpdCBhbnkgb3BlcmF0aW9uIGJ1dCBvcGVuICovCisJZnRhcGVfdWRlbGF5X2NhbGlicmF0ZSgpOyAvKiBtdXN0IGJlIGJlZm9yZSBmZGNfd2FpdF9jYWxpYnJhdGUgISAqLworCWZkY193YWl0X2NhbGlicmF0ZSgpOworI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX0ZUX1BST0NfRlMpCisJKHZvaWQpZnRhcGVfcHJvY19pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfWkZUQVBFCisJKHZvaWQpemZ0X2luaXQoKTsKKyNlbmRpZgorCVRSQUNFX0VYSVQgMDsKK30KKworbW9kdWxlX3BhcmFtKGZ0X2ZkY19iYXNlLCAgICAgICB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX2Jhc2UsICAiQmFzZSBhZGRyZXNzIG9mIEZEQyBjb250cm9sbGVyLiIpOworbW9kdWxlX3BhcmFtKGZ0X2ZkY19pcnEsICAgICAgICB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX2lycSwgICAiSVJRIChpbnRlcnJ1cHQgY2hhbm5lbCkgdG8gdXNlLiIpOworbW9kdWxlX3BhcmFtKGZ0X2ZkY19kbWEsICAgICAgICB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX2RtYSwgICAiRE1BIGNoYW5uZWwgdG8gdXNlLiIpOworbW9kdWxlX3BhcmFtKGZ0X2ZkY190aHJlc2hvbGQsICB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX3RocmVzaG9sZCwgICJUaHJlc2hvbGQgb2YgdGhlIEZEQyBGaWZvLiIpOworbW9kdWxlX3BhcmFtKGZ0X2ZkY19yYXRlX2xpbWl0LCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX3JhdGVfbGltaXQsICJNYXhpbWFsIGRhdGEgcmF0ZSBmb3IgRkRDLiIpOworbW9kdWxlX3BhcmFtKGZ0X3Byb2JlX2ZjMTAsICAgICBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfcHJvYmVfZmMxMCwKKwkgICAgIklmIG5vbi16ZXJvLCBwcm9iZSBmb3IgYSBDb2xvcmFkbyBGQy0xMC9GQy0yMCBjb250cm9sbGVyLiIpOworbW9kdWxlX3BhcmFtKGZ0X21hY2gyLCAgICAgICAgICBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfbWFjaDIsCisJICAgICJJZiBub24temVybywgcHJvYmUgZm9yIGEgTW91bnRhaW4gTUFDSC0yIGNvbnRyb2xsZXIuIik7CisjaWYgZGVmaW5lZChNT0RVTEUpICYmICFkZWZpbmVkKENPTkZJR19GVF9OT19UUkFDRV9BVF9BTEwpCittb2R1bGVfcGFyYW0oZnRfdHJhY2luZywgICAgICAgIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZ0X3RyYWNpbmcsCisJICAgICJBbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dCwgMCA8PSB0cmFjaW5nIDw9IDgsIGRlZmF1bHQgMy4iKTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKAorCSIoYykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4gKGJhc0B2aW1lYy5ubCksICIKKwkiKGMpIDE5OTUtMTk5NiBLYWkgSGFycmVraWxkZS1QZXRlcnNlbiAoa2hwQGRvbHBoaW5pY3Mubm8pLCAiCisJIihjKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZSAoY2xhdXNAbW9tby5tYXRoLnJ3dGgtYWFjaGVuLmRlKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKAorCSJRSUMtMTE3IGRyaXZlciBmb3IgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHkgdGFwZSBkcml2ZXMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmdGFwZV9leGl0KHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19GVF9QUk9DX0ZTKQorCWZ0YXBlX3Byb2NfZGVzdHJveSgpOworI2VuZGlmCisJKHZvaWQpZnRhcGVfc2V0X25yX2J1ZmZlcnMoMCk7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gImZ0YXBlOiB1bmxvYWRlZC5cbiIpOworCVRSQUNFX0VYSVQ7Cit9CisKK21vZHVsZV9pbml0KGZ0YXBlX2luaXQpOworbW9kdWxlX2V4aXQoZnRhcGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW5pdC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWluaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWE3YjhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWluaXQuaApAQCAtMCwwICsxLDQzIEBACisjaWZuZGVmIF9GVEFQRV9JTklUX0gKKyNkZWZpbmUgX0ZUQVBFX0lOSVRfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW5pdC5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MTYgJAorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBpbnRlcmZhY2UgdG8gCisgKiB0aGUgTGludXgga2VybmVsIGZvciBmbG9wcHkgdGFwZSBkcml2ZXIgZnRhcGUuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisKKyNkZWZpbmUgX05FVkVSX0JMT0NLICAgIChzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkKKyNkZWZpbmUgX0RPTlRfQkxPQ0sgICAgIChfTkVWRVJfQkxPQ0sgfCBzaWdtYXNrKFNJR0lOVCkpCisjZGVmaW5lIF9ET19CTE9DSyAgICAgICAoc2lnbWFzayhTSUdQSVBFKSkKKworI2lmbmRlZiBRSUMxMTdfVEFQRV9NQUpPUgorI2RlZmluZSBRSUMxMTdfVEFQRV9NQUpPUiAyNworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWlvLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTkwMTVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWlvLmMKQEAgLTAsMCArMSw5OTIgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgICAgICAoQykgMTk5NiAgICAgIEthaSBIYXJyZWtpbGRlLVBldGVyc2VuLAorICogICAgICAgICAgICAgICAgKEMpIDE5OTcgICAgICBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWlvLmMsdiAkCisgKiAkUmV2aXNpb246IDEuNCAkCisgKiAkRGF0ZTogMTk5Ny8xMS8xMSAxNDowMjozNiAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGdlbmVyYWwgY29udHJvbCBmdW5jdGlvbnMgZm9yIHRoZQorICogICAgICBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciAiZnRhcGUiIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvbXRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pby5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtd3JpdGUuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWNhbGlici5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCisvKiBOT1RFOiBzZWN0b3JzIHN0YXJ0IG51bWJlcmluZyBhdCAxLCBhbGwgb3RoZXJzIGF0IDAgISAqLworZnRfdGltZW91dF90YWJsZSBmdGFwZV90aW1lb3V0OwordW5zaWduZWQgaW50IGZ0YXBlX3RhcGVfbGVuOwordm9sYXRpbGUgcWljMTE3X2NtZF90IGZ0YXBlX2N1cnJlbnRfY29tbWFuZDsKK2NvbnN0IHN0cnVjdCBxaWMxMTdfY29tbWFuZF90YWJsZSBxaWMxMTdfY21kc1tdID0gUUlDMTE3X0NPTU1BTkRTOworaW50IGZ0YXBlX21pZ2h0X2JlX29mZl90cmFjazsKKworLyogICAgICBMb2NhbCB2YXJzLgorICovCitzdGF0aWMgaW50IGRpYWdub3N0aWNfbW9kZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnRhcGVfdWRlbGF5X2NvdW50Oworc3RhdGljIHVuc2lnbmVkIGludCBmdGFwZV91ZGVsYXlfdGltZTsKKwordm9pZCBmdGFwZV91ZGVsYXkodW5zaWduZWQgaW50IHVzZWNzKQoreworCXZvbGF0aWxlIGludCBjb3VudCA9IChmdGFwZV91ZGVsYXlfY291bnQgKiB1c2VjcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGFwZV91ZGVsYXlfY291bnQgLSAxKSAvIGZ0YXBlX3VkZWxheV90aW1lOworCXZvbGF0aWxlIGludCBpOworCisJd2hpbGUgKGNvdW50LS0gPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCAyMDsgKytpKTsKKwl9Cit9CisKK3ZvaWQgZnRhcGVfdWRlbGF5X2NhbGlicmF0ZSh2b2lkKQoreworCWZ0YXBlX2NhbGlicmF0ZSgiZnRhcGVfdWRlbGF5IiwKKwkJCWZ0YXBlX3VkZWxheSwgJmZ0YXBlX3VkZWxheV9jb3VudCwgJmZ0YXBlX3VkZWxheV90aW1lKTsKK30KKworLyogICAgICBEZWxheSAobXNlYykgcm91dGluZS4KKyAqLwordm9pZCBmdGFwZV9zbGVlcCh1bnNpZ25lZCBpbnQgdGltZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJdGltZSAqPSAxMDAwOyAgIC8qIG1zZWNzIC0+IHVzZWNzICovCisJaWYgKHRpbWUgPCBGVF9VU1BUKSB7CisJCS8qICBUaW1lIHRvbyBzbWFsbCBmb3Igc2NoZWR1bGVyLCBkbyBhIGJ1c3kgd2FpdCAhICovCisJCWZ0YXBlX3VkZWxheSh0aW1lKTsKKwl9IGVsc2UgeworCQlsb25nIHRpbWVvdXQ7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXVuc2lnbmVkIGludCB0aWNrcyA9ICh0aW1lICsgRlRfVVNQVCAtIDEpIC8gRlRfVVNQVDsKKworCQlUUkFDRShmdF90X2FueSwgIiVkIG1zZWMsICVkIHRpY2tzIiwgdGltZS8xMDAwLCB0aWNrcyk7CisJCXRpbWVvdXQgPSB0aWNrczsKKwkJc2F2ZV9mbGFncyhmbGFncyk7CisJCXN0aSgpOworCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHRpbWVvdXQpKTsKKwkJLyogIE1tbS4gSXNuJ3QgY3VycmVudC0+YmxvY2tlZCA9PSAweGZmZmZmZmZmID8KKwkJICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJVFJBQ0UoZnRfdF9lcnIsICJhd29rZW4gYnkgbm9uLWJsb2NrZWQgc2lnbmFsIDotKCIpOworCQl9CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCX0KKwlUUkFDRV9FWElUOworfQorCisvKiAgc2VuZCBhIGNvbW1hbmQgb3IgcGFyYW1ldGVyIHRvIHRoZSBkcml2ZQorICogIEdlbmVyYXRlcyAjIG9mIHN0ZXAgcHVsc2VzLgorICovCitzdGF0aWMgaW5saW5lIGludCBmdF9zZW5kX3RvX2RyaXZlKGludCBhcmcpCit7CisJLyogIEFsd2F5cyB3YWl0IGZvciBhIGNvbW1hbmRfdGltZW91dCBwZXJpb2QgdG8gc2VwYXJhdGUKKwkgKiAgaW5kaXZpZHVhbHMgY29tbWFuZHMgYW5kL29yIHBhcmFtZXRlcnMuCisJICovCisJZnRhcGVfc2xlZXAoMyAqIEZUX01JTExJU0VDT05EKTsKKwkvKiAgS2VlcCBjeWxpbmRlciBuciB3aXRoaW4gcmFuZ2UsIHN0ZXAgdG93YXJkcyBob21lIGlmIHBvc3NpYmxlLgorCSAqLworCWlmIChmdGFwZV9jdXJyZW50X2N5bGluZGVyID49IGFyZykgeworCQlyZXR1cm4gZmRjX3NlZWsoZnRhcGVfY3VycmVudF9jeWxpbmRlciAtIGFyZyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZkY19zZWVrKGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgKyBhcmcpOworCX0KK30KKworLyogZm9yd2FyZCAqLyBpbnQgZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoaW50ICpzdGF0dXMpOworCitzdGF0aWMgaW50IGZ0X2NoZWNrX2NtZF9yZXN0cmljdGlvbnMocWljMTE3X2NtZF90IGNvbW1hbmQpCit7CisJaW50IHN0YXR1cyA9IC0xOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCisJVFJBQ0UoZnRfdF9mbG93LCAiJXMiLCBxaWMxMTdfY21kc1tjb21tYW5kXS5uYW1lKTsKKwkvKiBBIG5ldyBtb3Rpb24gY29tbWFuZCBkdXJpbmcgYW4gdW5pbnRlcnJ1cHRpYmxlIChtb3Rpb24pCisJICogIGNvbW1hbmQgcmVxdWlyZXMgYSByZWFkeSBzdGF0dXMgYmVmb3JlIHRoZSBuZXcgY29tbWFuZCBjYW4KKwkgKiAgYmUgaXNzdWVkLiBPdGhlcndpc2UgYSBuZXcgbW90aW9uIGNvbW1hbmQgbmVlZHMgdG8gYmUKKwkgKiAgY2hlY2tlZCBhZ2FpbnN0IHJlcXVpcmVkIHN0YXR1cy4KKwkgKi8KKwlpZiAocWljMTE3X2NtZHNbY29tbWFuZF0uY21kX3R5cGUgPT0gbW90aW9uICYmCisJICAgIHFpYzExN19jbWRzW2Z0YXBlX2N1cnJlbnRfY29tbWFuZF0ubm9uX2ludHIpIHsKKwkJZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoJnN0YXR1cyk7CisJCWlmICgoc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkgPT0gMCkgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCSAgICAgICJtb3Rpb24gY21kICglZCkgZHVyaW5nIG5vbi1pbnRyIGNtZCAoJWQpIiwKKwkJCSAgICAgIGNvbW1hbmQsIGZ0YXBlX2N1cnJlbnRfY29tbWFuZCk7CisJCQlUUkFDRShmdF90X25vaXNlLCAid2FpdGluZyB1bnRpbCBkcml2ZSBnZXRzIHJlYWR5Iik7CisJCQlmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQuc2VlaywKKwkJCQkJICZzdGF0dXMpOworCQl9CisJfQorCWlmIChxaWMxMTdfY21kc1tjb21tYW5kXS5tYXNrICE9IDApIHsKKwkJX191OCBkaWZmZXJlbmNlOworCQkvKiAgU29tZSBjb21tYW5kcyBkbyByZXF1aXJlIGEgY2VydGFpbiBzdGF0dXM6CisJCSAqLworCQlpZiAoc3RhdHVzID09IC0xKSB7CS8qIG5vdCB5ZXQgc2V0ICovCisJCQlmdGFwZV9yZXBvcnRfcmF3X2RyaXZlX3N0YXR1cygmc3RhdHVzKTsKKwkJfQorCQlkaWZmZXJlbmNlID0gKChzdGF0dXMgXiBxaWMxMTdfY21kc1tjb21tYW5kXS5zdGF0ZSkgJgorCQkJICAgICAgcWljMTE3X2NtZHNbY29tbWFuZF0ubWFzayk7CisJCS8qICBXYWl0IHVudGlsIHRoZSBkcml2ZSBnZXRzCisJCSAqICByZWFkeS4gVGhpcyBtYXkgbGFzdCBmb3JldmVyIGlmCisJCSAqICB0aGUgZHJpdmUgbmV2ZXIgZ2V0cyByZWFkeS4uLiAKKwkJICovCisJCXdoaWxlICgoZGlmZmVyZW5jZSAmIFFJQ19TVEFUVVNfUkVBRFkpICE9IDApIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJjb21tYW5kICVkIGlzc3VlZCB3aGlsZSBub3QgcmVhZHkiLAorCQkJICAgICAgY29tbWFuZCk7CisJCQlUUkFDRShmdF90X25vaXNlLCAid2FpdGluZyB1bnRpbCBkcml2ZSBnZXRzIHJlYWR5Iik7CisJCQlpZiAoZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnNlZWssCisJCQkJCSAgICAgJnN0YXR1cykgPT0gLUVJTlRSKSB7CisJCQkJLyogIEJhaWwgb3V0IG9uIHNpZ25hbCAhCisJCQkJICovCisJCQkJVFJBQ0VfQUJPUlQoLUVJTlRSLCBmdF90X3dhcm4sCisJCQkJICAgICAgImludGVycnVwdGVkIGJ5IG5vbi1ibG9ja2FibGUgc2lnbmFsIik7CisJCQl9CisJCQlkaWZmZXJlbmNlID0gKChzdGF0dXMgXiBxaWMxMTdfY21kc1tjb21tYW5kXS5zdGF0ZSkgJgorCQkJCSAgICAgIHFpYzExN19jbWRzW2NvbW1hbmRdLm1hc2spOworCQl9CisJCXdoaWxlICgoZGlmZmVyZW5jZSAmIFFJQ19TVEFUVVNfRVJST1IpICE9IDApIHsKKwkJCWludCBlcnI7CisJCQlxaWMxMTdfY21kX3QgY21kOworCisJCQlUUkFDRShmdF90X25vaXNlLAorCQkJICAgICAgImNvbW1hbmQgJWQgaXNzdWVkIHdoaWxlIGVycm9yIHBlbmRpbmciLAorCQkJICAgICAgY29tbWFuZCk7CisJCQlUUkFDRShmdF90X25vaXNlLCAiY2xlYXJpbmcgZXJyb3Igc3RhdHVzIik7CisJCQlmdGFwZV9yZXBvcnRfZXJyb3IoJmVyciwgJmNtZCwgMSk7CisJCQlmdGFwZV9yZXBvcnRfcmF3X2RyaXZlX3N0YXR1cygmc3RhdHVzKTsKKwkJCWRpZmZlcmVuY2UgPSAoKHN0YXR1cyBeIHFpYzExN19jbWRzW2NvbW1hbmRdLnN0YXRlKSAmCisJCQkJICAgICAgcWljMTE3X2NtZHNbY29tbWFuZF0ubWFzayk7CisJCQlpZiAoKGRpZmZlcmVuY2UgJiBRSUNfU1RBVFVTX0VSUk9SKSAhPSAwKSB7CisJCQkJLyogIEJhaWwgb3V0IG9uIGZhdGFsIHNpZ25hbCAhCisJCQkJICovCisJCQkJRlRfU0lHTkFMX0VYSVQoX05FVkVSX0JMT0NLKTsKKwkJCX0KKwkJfQorCQlpZiAoZGlmZmVyZW5jZSkgeworCQkJLyogIEFueSByZW1haW5pbmcgZGlmZmVyZW5jZSBjYW4ndCBiZSBzb2x2ZWQKKwkJCSAqICBoZXJlLiAgCisJCQkgKi8KKwkJCWlmIChkaWZmZXJlbmNlICYgKFFJQ19TVEFUVVNfQ0FSVFJJREdFX1BSRVNFTlQgfAorCQkJCQkgIFFJQ19TVEFUVVNfTkVXX0NBUlRSSURHRSB8CisJCQkJCSAgUUlDX1NUQVRVU19SRUZFUkVOQ0VEKSkgeworCQkJCVRSQUNFKGZ0X3Rfd2FybiwKKwkJCQkgICAgICAiRmF0YWw6IHRhcGUgcmVtb3ZlZCBvciByZWluc2VydGVkICEiKTsKKwkJCQlmdF9mYWlsdXJlID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJ3cm9uZyBzdGF0ZTogMHglMDJ4IHNob3VsZCBiZTogMHglMDJ4IiwKKwkJCQkgICAgICBzdGF0dXMgJiBxaWMxMTdfY21kc1tjb21tYW5kXS5tYXNrLAorCQkJCSAgICAgIHFpYzExN19jbWRzW2NvbW1hbmRdLnN0YXRlKTsKKwkJCX0KKwkJCVRSQUNFX0VYSVQgLUVJTzsKKwkJfQorCQlpZiAofnN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkgJiBxaWMxMTdfY21kc1tjb21tYW5kXS5tYXNrKSB7CisJCQlUUkFDRV9BQk9SVCgtRUJVU1ksIGZ0X3RfZXJyLCAiQmFkOiBzdGlsbCBidXN5ISIpOworCQl9CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworLyogICAgICBJc3N1ZSBhIHRhcGUgY29tbWFuZDoKKyAqLworaW50IGZ0YXBlX2NvbW1hbmQocWljMTE3X2NtZF90IGNvbW1hbmQpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RhdGljIGludCBsZXZlbDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKCh1bnNpZ25lZCBpbnQpY29tbWFuZCA+IE5SX0lURU1TKHFpYzExN19jbWRzKSkgeworCQkvKiAgVGhpcyBpcyBhIGJ1ZyB3ZSdsbCB3YW50IHRvIGtub3cgYWJvdXQgdG9vLgorCQkgKi8KKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9idWcsICJidWcgLSBiYWQgY29tbWFuZDogJWQiLCBjb21tYW5kKTsKKwl9CisJaWYgKCsrbGV2ZWwgPiA1KSB7IC8qICBUaGlzIGlzIGEgYnVnIHdlJ2xsIHdhbnQgdG8ga25vdyBhYm91dC4gKi8KKwkJLS1sZXZlbDsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9idWcsICJidWcgLSByZWN1cnNpb24gZm9yIGNvbW1hbmQ6ICVkIiwKKwkJCSAgICBjb21tYW5kKTsKKwl9CisJLyogIGRpc2FibGUgbG9nZ2luZyBhbmQgcmVzdHJpY3Rpb24gY2hlY2sgZm9yIHNvbWUgY29tbWFuZHMsCisJICogIGNoZWNrIGFsbCBvdGhlciBjb21tYW5kcyB0aGF0IGhhdmUgYSBwcmVzY3JpYmVkIHN0YXJ0aW5nCisJICogIHN0YXR1cy4KKwkgKi8KKwlpZiAoZGlhZ25vc3RpY19tb2RlKSB7CisJCVRSQUNFKGZ0X3RfZmxvdywgImRpYWdub3N0aWMgY29tbWFuZCAlZCIsIGNvbW1hbmQpOworCX0gZWxzZSBpZiAoY29tbWFuZCA9PSBRSUNfUkVQT1JUX0RSSVZFX1NUQVRVUyB8fAorCQkgICBjb21tYW5kID09IFFJQ19SRVBPUlRfTkVYVF9CSVQpIHsKKwkJVFJBQ0UoZnRfdF9hbnksICIlcyIsIHFpYzExN19jbWRzW2NvbW1hbmRdLm5hbWUpOworCX0gZWxzZSB7CisJCVRSQUNFX0NBVENIKGZ0X2NoZWNrX2NtZF9yZXN0cmljdGlvbnMoY29tbWFuZCksIC0tbGV2ZWwpOworCX0KKwkvKiAgTm93IGFsbCBjb25kaXRpb25zIGFyZSBtZXQgb3IgcmVzdWx0IHdhcyA8IDAuCisJICovCisJcmVzdWx0ID0gZnRfc2VuZF90b19kcml2ZSgodW5zaWduZWQgaW50KWNvbW1hbmQpOworCWlmIChxaWMxMTdfY21kc1tjb21tYW5kXS5jbWRfdHlwZSA9PSBtb3Rpb24gJiYKKwkgICAgY29tbWFuZCAhPSBRSUNfTE9HSUNBTF9GT1JXQVJEICYmIGNvbW1hbmQgIT0gUUlDX1NUT1BfVEFQRSkgeworCQlmdF9sb2NhdGlvbi5rbm93biA9IDA7CisJfQorCWZ0YXBlX2N1cnJlbnRfY29tbWFuZCA9IGNvbW1hbmQ7CisJLS1sZXZlbDsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogICAgICBTZW5kIGEgdGFwZSBjb21tYW5kIHBhcmFtZXRlcjoKKyAqICAgICAgR2VuZXJhdGVzIGNvbW1hbmQgIyBvZiBzdGVwIHB1bHNlcy4KKyAqICAgICAgU2tpcHMgdGFwZS1zdGF0dXMgY2FsbCAhCisgKi8KK2ludCBmdGFwZV9wYXJhbWV0ZXIodW5zaWduZWQgaW50IHBhcmFtZXRlcikKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJVFJBQ0UoZnRfdF9mbG93LCAiY2FsbGVkIHdpdGggcGFyYW1ldGVyID0gJWQiLCBwYXJhbWV0ZXIpOworCVRSQUNFX0VYSVQgZnRfc2VuZF90b19kcml2ZShwYXJhbWV0ZXIgKyAyKTsKK30KKworLyogICAgICBXYWl0IGZvciB0aGUgZHJpdmUgdG8gZ2V0IHJlYWR5LgorICogICAgICB0aW1lb3V0IHRpbWUgaW4gbWlsbGktc2Vjb25kcworICogICAgICBSZXR1cm5lZCBzdGF0dXMgaXMgdmFsaWQgaWYgcmVzdWx0ICE9IC1FSU8KKyAqCisgKiAgICAgIFNob3VsZCB3ZSBhbGxvdyB0byBiZSBraWxsZWQgYnkgU0lHSU5UPyAgKF5DKQorICogICAgICBXb3VsZCBiZSBuaWNlIGF0IGxlYXN0IGZvciBsYXJnZSB0aW1lb3V0cy4KKyAqLworaW50IGZ0YXBlX3JlYWR5X3dhaXQodW5zaWduZWQgaW50IHRpbWVvdXQsIGludCAqc3RhdHVzKQoreworCXVuc2lnbmVkIGxvbmcgdDA7CisJdW5zaWduZWQgaW50IHBvbGxfZGVsYXk7CisJaW50IHNpZ25hbF9yZXRyaWVzOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwkvKiAgdGhlIGZvbGxvd2luZyAqKiBSRUFMTFkgKiogcmVkdWNlcyB0aGUgc3lzdGVtIGxvYWQgd2hlbgorCSAqICBlLmcuIG9uZSBzaW1wbHkgcmV3aW5kcyBvciByZXRlbnNpb25zLiBUaGUgdGFwZSBpcyBzbG93IAorCSAqICBhbnl3YXkuIEl0IGlzIHJlYWxseSBub3QgbmVjZXNzYXJ5IHRvIGRldGVjdCBlcnJvciAKKwkgKiAgY29uZGl0aW9ucyB3aXRoIDEvMTAgc2Vjb25kcyBncmFudWxhcml0eQorCSAqCisJICogIE9uIG15IEFNRCAxMzNNSFogNDg2OiAxMDAgbXM6IDIzJSBzeXN0ZW0gbG9hZAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgMSAgc2VjOiAgNSUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgIDUgIHNlYzogIDAuNiUsIHllYWgKKwkgKi8KKwlpZiAodGltZW91dCA8PSBGVF9TRUNPTkQpIHsKKwkJcG9sbF9kZWxheSA9IDEwMCAqIEZUX01JTExJU0VDT05EOworCQlzaWduYWxfcmV0cmllcyA9IDIwOyAvKiB0d28gc2Vjb25kcyAqLworCX0gZWxzZSBpZiAodGltZW91dCA8IDIwICogRlRfU0VDT05EKSB7CisJCVRSQUNFKGZ0X3RfZmxvdywgInNldHRpbmcgcG9sbCBkZWxheSB0byAxIHNlY29uZCIpOworCQlwb2xsX2RlbGF5ID0gRlRfU0VDT05EOworCQlzaWduYWxfcmV0cmllcyA9IDI7IC8qIHR3byBzZWNvbmRzICovCisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAic2V0dGluZyBwb2xsIGRlbGF5IHRvIDUgc2Vjb25kcyIpOworCQlwb2xsX2RlbGF5ID0gNSAqIEZUX1NFQ09ORDsKKwkJc2lnbmFsX3JldHJpZXMgPSAxOyAvKiBmaXZlIHNlY29uZHMgKi8KKwl9CisJZm9yICg7OykgeworCQl0MCA9IGppZmZpZXM7CisJCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9yYXdfZHJpdmVfc3RhdHVzKHN0YXR1cyksKTsKKwkJaWYgKCpzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSB7CisJCQlUUkFDRV9FWElUIDA7CisJCX0KKwkJaWYgKCFzaWduYWxfcmV0cmllcy0tKSB7CisJCQlGVF9TSUdOQUxfRVhJVChfTkVWRVJfQkxPQ0spOworCQl9CisJCWlmICgoaW50KXRpbWVvdXQgPj0gMCkgeworCQkJLyogdGhpcyB3aWxsIGZhaWwgd2hlbiBqaWZmaWVzIHdyYXBzIGFyb3VuZCBhYm91dAorCQkJICogb25jZSBldmVyeSB5ZWFyIDotKQorCQkJICovCisJCQl0aW1lb3V0IC09ICgoamlmZmllcyAtIHQwKSAqIEZUX1NFQ09ORCkgLyBIWjsKKwkJCWlmICh0aW1lb3V0IDw9IDApIHsKKwkJCQlUUkFDRV9BQk9SVCgtRVRJTUUsIGZ0X3RfZXJyLCAidGltZW91dCIpOworCQkJfQorCQkJZnRhcGVfc2xlZXAocG9sbF9kZWxheSk7CisJCQl0aW1lb3V0IC09IHBvbGxfZGVsYXk7CisJCX0gZWxzZSB7CisJCQlmdGFwZV9zbGVlcChwb2xsX2RlbGF5KTsKKwkJfQorCX0KKwlUUkFDRV9FWElUIC1FVElNRTsKK30KKworLyogICAgICBJc3N1ZSBjb21tYW5kIGFuZCB3YWl0IHVwIHRvIHRpbWVvdXQgbWlsbGkgc2Vjb25kcyBmb3IgZHJpdmUgcmVhZHkKKyAqLworaW50IGZ0YXBlX2NvbW1hbmRfd2FpdChxaWMxMTdfY21kX3QgY29tbWFuZCwgdW5zaWduZWQgaW50IHRpbWVvdXQsIGludCAqc3RhdHVzKQoreworCWludCByZXN1bHQ7CisKKwkvKiBEcml2ZSBzaG91bGQgYmUgcmVhZHksIGlzc3VlIGNvbW1hbmQKKwkgKi8KKwlyZXN1bHQgPSBmdGFwZV9jb21tYW5kKGNvbW1hbmQpOworCWlmIChyZXN1bHQgPj0gMCkgeworCQlyZXN1bHQgPSBmdGFwZV9yZWFkeV93YWl0KHRpbWVvdXQsIHN0YXR1cyk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZnRhcGVfcGFyYW1ldGVyX3dhaXQodW5zaWduZWQgaW50IHBhcm0sIHVuc2lnbmVkIGludCB0aW1lb3V0LCBpbnQgKnN0YXR1cykKK3sKKwlpbnQgcmVzdWx0OworCisJLyogRHJpdmUgc2hvdWxkIGJlIHJlYWR5LCBpc3N1ZSBjb21tYW5kCisJICovCisJcmVzdWx0ID0gZnRhcGVfcGFyYW1ldGVyKHBhcm0pOworCWlmIChyZXN1bHQgPj0gMCkgeworCQlyZXN1bHQgPSBmdGFwZV9yZWFkeV93YWl0KHRpbWVvdXQsIHN0YXR1cyk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgUmVwb3J0IG9wZXJhdGlvbnMKKyAqLworCisvKiBRdWVyeSB0aGUgZHJpdmUgYWJvdXQgaXRzIHN0YXR1cy4gIFRoZSBjb21tYW5kIGlzIHNlbnQgYW5kCisgICByZXN1bHRfbGVuZ3RoIGJpdHMgb2Ygc3RhdHVzIGFyZSByZXR1cm5lZCAoMiBleHRyYSBiaXRzIGFyZSByZWFkCisgICBmb3Igc3RhcnQgYW5kIHN0b3ApLiAqLworCitpbnQgZnRhcGVfcmVwb3J0X29wZXJhdGlvbihpbnQgKnN0YXR1cywKKwkJCSAgIHFpYzExN19jbWRfdCBjb21tYW5kLAorCQkJICAgaW50IHJlc3VsdF9sZW5ndGgpCit7CisJaW50IGksIHN0MzsKKwl1bnNpZ25lZCBpbnQgdDA7CisJdW5zaWduZWQgaW50IGR0OworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKGNvbW1hbmQpLCk7CisJdDAgPSBmdGFwZV90aW1lc3RhbXAoKTsKKwlpID0gMDsKKwlkbyB7CisJCSsraTsKKwkJZnRhcGVfc2xlZXAoMyAqIEZUX01JTExJU0VDT05EKTsJLyogc2VlIHJlbWFyayBiZWxvdyAqLworCQlUUkFDRV9DQVRDSChmZGNfc2Vuc2VfZHJpdmVfc3RhdHVzKCZzdDMpLCk7CisJCWR0ID0gZnRhcGVfdGltZWRpZmYodDAsIGZ0YXBlX3RpbWVzdGFtcCgpKTsKKwkJLyogIEFjayBzaG91bGQgYmUgYXNzZXJ0ZWQgd2l0aGluIFR0aW1vdXQgKyBUYWNrID0gNiBtc2VjLgorCQkgKiAgTG9va3MgbGlrZSBzb21lIGRyaXZlcyBmYWlsIHRvIGRvIHRoaXMgc28gZXh0ZW5kIHRoaXMKKwkJICogIHBlcmlvZCB0byAzMDAgbXNlYy4KKwkJICovCisJfSB3aGlsZSAoIShzdDMgJiBTVDNfVFJBQ0tfMCkgJiYgZHQgPCAzMDAwMDApOworCWlmICghKHN0MyAmIFNUM19UUkFDS18wKSkgeworCQlUUkFDRShmdF90X2VyciwKKwkJICAgICAgIk5vIGFja25vd2xlZGdlIGFmdGVyICV1IG1zZWMuICglaSBpdGVyKSIsIGR0IC8gMTAwMCwgaSk7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAidGltZW91dCBvbiBBY2tub3dsZWRnZSIpOworCX0KKwkvKiAgZHQgbWF5IGJlIGxhcmdlciB0aGFuIGV4cGVjdGVkIGJlY2F1c2Ugb2Ygb3RoZXIgdGFza3MKKwkgKiAgc2NoZWR1bGVkIHdoaWxlIHdlIHdlcmUgc2xlZXBpbmcuCisJICovCisJaWYgKGkgPiAxICYmIGR0ID4gNjAwMCkgeworCQlUUkFDRShmdF90X2VyciwgIkFja25vd2xlZGdlIGFmdGVyICV1IG1zZWMuICglaSBpdGVyKSIsCisJCSAgICAgIGR0IC8gMTAwMCwgaSk7CisJfQorCSpzdGF0dXMgPSAwOworCWZvciAoaSA9IDA7IGkgPCByZXN1bHRfbGVuZ3RoICsgMTsgaSsrKSB7CisJCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmQoUUlDX1JFUE9SVF9ORVhUX0JJVCksKTsKKwkJVFJBQ0VfQ0FUQ0goZmRjX3NlbnNlX2RyaXZlX3N0YXR1cygmc3QzKSwpOworCQlpZiAoaSA8IHJlc3VsdF9sZW5ndGgpIHsKKwkJCSpzdGF0dXMgfD0gKChzdDMgJiBTVDNfVFJBQ0tfMCkgPyAxIDogMCkgPDwgaTsKKwkJfSBlbHNlIGlmICgoc3QzICYgU1QzX1RSQUNLXzApID09IDApIHsKKwkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAibWlzc2luZyBzdGF0dXMgc3RvcCBiaXQiKTsKKwkJfQorCX0KKwkvKiB0aGlzIGNvbW1hbmQgd2lsbCBwdXQgdHJhY2sgemVybyBhbmQgaW5kZXggYmFjayBpbnRvIG5vcm1hbCBzdGF0ZSAqLworCSh2b2lkKWZ0YXBlX2NvbW1hbmQoUUlDX1JFUE9SVF9ORVhUX0JJVCk7CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiBSZXBvcnQgdGhlIGN1cnJlbnQgZHJpdmUgc3RhdHVzLiAqLworCitpbnQgZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoaW50ICpzdGF0dXMpCit7CisJaW50IHJlc3VsdDsKKwlpbnQgY291bnQgPSAwOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlkbyB7CisJCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oc3RhdHVzLAorCQkJCQkJUUlDX1JFUE9SVF9EUklWRV9TVEFUVVMsIDgpOworCX0gd2hpbGUgKHJlc3VsdCA8IDAgJiYgKytjb3VudCA8PSAzKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKKwkJCSAgICAicmVwb3J0X29wZXJhdGlvbiBmYWlsZWQgYWZ0ZXIgJWQgdHJpYWxzIiwgY291bnQpOworCX0KKwlpZiAoKCpzdGF0dXMgJiAweGZmKSA9PSAweGZmKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJpbXBvc3NpYmxlIGRyaXZlIHN0YXR1cyAweGZmIik7CisJfQorCWlmICgqc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkgeworCQlmdGFwZV9jdXJyZW50X2NvbW1hbmQgPSBRSUNfTk9fQ09NTUFORDsgLyogY29tcGxldGVkICovCisJfQorCWZ0X2xhc3Rfc3RhdHVzLnN0YXR1cy5kcml2ZV9zdGF0dXMgPSAoX191OCkoKnN0YXR1cyAmIDB4ZmYpOworCVRSQUNFX0VYSVQgMDsKK30KKworaW50IGZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMoaW50ICpzdGF0dXMpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9yYXdfZHJpdmVfc3RhdHVzKHN0YXR1cyksKTsKKwlpZiAoKnN0YXR1cyAmIFFJQ19TVEFUVVNfTkVXX0NBUlRSSURHRSB8fAorCSAgICAhKCpzdGF0dXMgJiBRSUNfU1RBVFVTX0NBUlRSSURHRV9QUkVTRU5UKSkgeworCQlmdF9mYWlsdXJlID0gMTsJLyogd2lsbCBpbmhpYml0IGZ1cnRoZXIgb3BlcmF0aW9ucyAqLworCQlUUkFDRV9FWElUIC1FSU87CisJfQorCWlmICgqc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSAmJiAqc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikgeworCQkvKiAgTGV0IGNhbGxlciBoYW5kbGUgYWxsIGVycm9ycyAqLworCQlUUkFDRV9BQk9SVCgxLCBmdF90X3dhcm4sICJ3YXJuaW5nOiBlcnJvciBzdGF0dXMgc2V0ISIpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK2ludCBmdGFwZV9yZXBvcnRfZXJyb3IodW5zaWduZWQgaW50ICplcnJvciwKKwkJICAgICAgIHFpYzExN19jbWRfdCAqY29tbWFuZCwgaW50IHJlcG9ydCkKK3sKKwlzdGF0aWMgY29uc3QgZnRhcGVfZXJyb3IgZnRhcGVfZXJyb3JzW10gPSBRSUMxMTdfRVJST1JTOworCWludCBjb2RlOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRV9DQVRDSChmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKCZjb2RlLCBRSUNfUkVQT1JUX0VSUk9SX0NPREUsIDE2KSwpOworCSplcnJvciAgID0gKHVuc2lnbmVkIGludCkoY29kZSAmIDB4ZmYpOworCSpjb21tYW5kID0gKHFpYzExN19jbWRfdCkoKGNvZGU+PjgpJjB4ZmYpOworCS8qICByZW1lbWJlciBoYXJkd2FyZSBzdGF0dXMsIG1heWJlIHVzZWZ1bCBmb3Igc3RhdHVzIGlvY3RscworCSAqLworCWZ0X2xhc3RfZXJyb3IuZXJyb3IuY29tbWFuZCA9IChfX3U4KSpjb21tYW5kOworCWZ0X2xhc3RfZXJyb3IuZXJyb3IuZXJyb3IgICA9IChfX3U4KSplcnJvcjsKKwlpZiAoIXJlcG9ydCkgeworCQlUUkFDRV9FWElUIDA7CisJfQorCWlmICgqZXJyb3IgPT0gMCkgeworCQlUUkFDRV9BQk9SVCgwLCBmdF90X2luZm8sICJObyBlcnJvciIpOworCX0KKwlUUkFDRShmdF90X2luZm8sICJlcnJvcmNvZGU6ICVkIiwgKmVycm9yKTsKKwlpZiAoKmVycm9yIDwgTlJfSVRFTVMoZnRhcGVfZXJyb3JzKSkgeworCQlUUkFDRShmdF90X25vaXNlLCAiJXNGYXRhbCBFUlJPUjoiLAorCQkgICAgICAoZnRhcGVfZXJyb3JzWyplcnJvcl0uZmF0YWwgPyAiIiA6ICJOb24tIikpOworCQlUUkFDRShmdF90X25vaXNlLCAiJXMgLi4uIiwgZnRhcGVfZXJyb3JzWyplcnJvcl0ubWVzc2FnZSk7CisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIlVua25vd24gRVJST1IgISIpOworCX0KKwlpZiAoKHVuc2lnbmVkIGludCkqY29tbWFuZCA8IE5SX0lURU1TKHFpYzExN19jbWRzKSAmJgorCSAgICBxaWMxMTdfY21kc1sqY29tbWFuZF0ubmFtZSAhPSBOVUxMKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICIuLi4gY2F1c2VkIGJ5IGNvbW1hbmQgXCclc1wnIiwKKwkJICAgICAgcWljMTE3X2NtZHNbKmNvbW1hbmRdLm5hbWUpOworCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICIuLi4gY2F1c2VkIGJ5IHVua25vd24gY29tbWFuZCAlZCIsCisJCSAgICAgICpjb21tYW5kKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgZnRhcGVfcmVwb3J0X2NvbmZpZ3VyYXRpb24ocWljX21vZGVsICptb2RlbCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnJhdGUsCisJCQkgICAgICAgaW50ICpxaWNfc3RkLAorCQkJICAgICAgIGludCAqdGFwZV9sZW4pCit7CisJaW50IHJlc3VsdDsKKwlpbnQgY29uZmlnOworCWludCBzdGF0dXM7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxaWNfcmF0ZXNbIDRdID0geyAyNTAsIDIwMDAsIDUwMCwgMTAwMCB9OworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKCZjb25maWcsCisJCQkJCVFJQ19SRVBPUlRfRFJJVkVfQ09ORklHVVJBVElPTiwgOCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZnRfbGFzdF9zdGF0dXMuc3RhdHVzLmRyaXZlX2NvbmZpZyA9IChfX3U4KTB4MDA7CisJCSptb2RlbCA9IHByZWhpc3RvcmljOworCQkqcmF0ZSA9IDUwMDsKKwkJKnFpY19zdGQgPSBRSUNfVEFQRV9RSUM0MDsKKwkJKnRhcGVfbGVuID0gMjA1OworCQlUUkFDRV9FWElUIDA7CisJfSBlbHNlIHsKKwkJZnRfbGFzdF9zdGF0dXMuc3RhdHVzLmRyaXZlX2NvbmZpZyA9IChfX3U4KShjb25maWcgJiAweGZmKTsKKwl9CisJKnJhdGUgPSBxaWNfcmF0ZXNbKGNvbmZpZyAmIFFJQ19DT05GSUdfUkFURV9NQVNLKSA+PiBRSUNfQ09ORklHX1JBVEVfU0hJRlRdOworCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oJnN0YXR1cywgUUlDX1JFUE9SVF9UQVBFX1NUQVRVUywgOCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZnRfbGFzdF9zdGF0dXMuc3RhdHVzLnRhcGVfc3RhdHVzID0gKF9fdTgpMHgwMDsKKwkJLyogcHJlLSBRSUMxMTcgcmV2IEMgc3BlYy4gZHJpdmUsIFFJQ19DT05GSUdfODAgYml0IGlzIHZhbGlkLgorCQkgKi8KKwkJKnFpY19zdGQgPSAoY29uZmlnICYgUUlDX0NPTkZJR184MCkgPworCQkJUUlDX1RBUEVfUUlDODAgOiBRSUNfVEFQRV9RSUM0MDsKKwkJLyogPz8gaG93J3MgYWJvdXQgNDI1ZnQgdGFwZXM/ICovCisJCSp0YXBlX2xlbiA9IChjb25maWcgJiBRSUNfQ09ORklHX0xPTkcpID8gMzA3IDogMDsKKwkJKm1vZGVsID0gcHJlX3FpYzExN2M7CisJCXJlc3VsdCA9IDA7CisJfSBlbHNlIHsKKwkJZnRfbGFzdF9zdGF0dXMuc3RhdHVzLnRhcGVfc3RhdHVzID0gKF9fdTgpKHN0YXR1cyAmIDB4ZmYpOworCQkqbW9kZWwgPSBwb3N0X3FpYzExN2I7CisJCVRSQUNFKGZ0X3RfYW55LCAicmVwb3J0IHRhcGUgc3RhdHVzIHJlc3VsdCA9ICUwMngiLCBzdGF0dXMpOworCQkvKiBwb3N0LSBRSUMxMTcgcmV2IEMgc3BlYy4gZHJpdmUsIFFJQ19DT05GSUdfODAgYml0IGlzCisJCSAqIGludmFsaWQuIAorCQkgKi8KKwkJc3dpdGNoIChzdGF0dXMgJiBRSUNfVEFQRV9TVERfTUFTSykgeworCQljYXNlIFFJQ19UQVBFX1FJQzQwOgorCQljYXNlIFFJQ19UQVBFX1FJQzgwOgorCQljYXNlIFFJQ19UQVBFX1FJQzMwMjA6CisJCWNhc2UgUUlDX1RBUEVfUUlDMzAxMDoKKwkJCSpxaWNfc3RkID0gc3RhdHVzICYgUUlDX1RBUEVfU1REX01BU0s7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCSpxaWNfc3RkID0gLTE7CisJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKHN0YXR1cyAmIFFJQ19UQVBFX0xFTl9NQVNLKSB7CisJCWNhc2UgUUlDX1RBUEVfMjA1RlQ6CisJCQkvKiAyMDUgb3IgNDI1KyBmdCA1NTAgT2UgdGFwZSAqLworCQkJKnRhcGVfbGVuID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFFJQ19UQVBFXzMwN0ZUOgorCQkJLyogMzA3LjUgZnQgNTUwIE9lIEV4dGVuZGVkIExlbmd0aCAoWEwpIHRhcGUgKi8KKwkJCSp0YXBlX2xlbiA9IDMwNzsKKwkJCWJyZWFrOworCQljYXNlIFFJQ19UQVBFX1ZBUklBQkxFOgorCQkJLyogVmFyaWFibGUgbGVuZ3RoIDU1MCBPZSB0YXBlICovCisJCQkqdGFwZV9sZW4gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgUUlDX1RBUEVfMTEwMEZUOgorCQkJLyogMTEwMCBmdCA1NTAgT2UgdGFwZSAqLworCQkJKnRhcGVfbGVuID0gMTEwMDsKKwkJCWJyZWFrOworCQljYXNlIFFJQ19UQVBFX0ZMRVg6CisJCQkvKiBWYXJpYWJsZSBsZW5ndGggOTAwIE9lIHRhcGUgKi8KKwkJCSp0YXBlX2xlbiA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCSp0YXBlX2xlbiA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCpxaWNfc3RkID09IC0xIHx8ICp0YXBlX2xlbiA9PSAtMSkgeworCQkJVFJBQ0UoZnRfdF9hbnksCisJCQkgICAgICAicG9zdCBxaWMtMTE3YiBzcGVjIGRyaXZlIHdpdGggdW5rbm93biB0YXBlIik7CisJCX0KKwkJcmVzdWx0ID0gKnRhcGVfbGVuID09IC0xID8gLUVJTyA6IDA7CisJCWlmIChzdGF0dXMgJiBRSUNfVEFQRV9XSURFKSB7CisJCQlzd2l0Y2ggKCpxaWNfc3RkKSB7CisJCQljYXNlIFFJQ19UQVBFX1FJQzgwOgorCQkJCVRSQUNFKGZ0X3RfaW5mbywgIlRSLTEgdGFwZSBkZXRlY3RlZCIpOworCQkJCWJyZWFrOworCQkJY2FzZSBRSUNfVEFQRV9RSUMzMDEwOgorCQkJCVRSQUNFKGZ0X3RfaW5mbywgIlRSLTIgdGFwZSBkZXRlY3RlZCIpOworCQkJCWJyZWFrOworCQkJY2FzZSBRSUNfVEFQRV9RSUMzMDIwOgorCQkJCVRSQUNFKGZ0X3RfaW5mbywgIlRSLTMgdGFwZSBkZXRlY3RlZCIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlUUkFDRShmdF90X3dhcm4sCisJCQkJICAgICAgIlVua25vd24gVHJhdmFuIHRhcGUgdHlwZSBkZXRlY3RlZCIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCVRSQUNFX0VYSVQgKHJlc3VsdCA8IDApID8gLUVJTyA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZnRhcGVfcmVwb3J0X3JvbV92ZXJzaW9uKGludCAqdmVyc2lvbikKK3sKKworCWlmIChmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKHZlcnNpb24sIFFJQ19SRVBPUlRfUk9NX1ZFUlNJT04sIDgpIDwgMCkgeworCQlyZXR1cm4gLUVJTzsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3ZvaWQgZnRhcGVfcmVwb3J0X3ZlbmRvcl9pZCh1bnNpZ25lZCBpbnQgKmlkKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qIFdlJ2xsIHRyeSB0byBnZXQgYSB2ZW5kb3IgaWQgZnJvbSB0aGUgZHJpdmUuICBGaXJzdAorCSAqIGFjY29yZGluZyB0byB0aGUgUUlDLTExNyBzcGVjLCBhIDE2LWJpdCBpZCBpcyByZXF1ZXN0ZWQuCisJICogSWYgdGhhdCBmYWlscyB3ZSdsbCB0cnkgYW4gOC1iaXQgdmVyc2lvbiwgb3RoZXJ3aXNlIHdlJ2xsCisJICogdHJ5IGFuIHVuZG9jdW1lbnRlZCBxdWVyeS4KKwkgKi8KKwlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKChpbnQgKikgaWQsIFFJQ19SRVBPUlRfVkVORE9SX0lELCAxNik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcmVzdWx0ID0gZnRhcGVfcmVwb3J0X29wZXJhdGlvbigoaW50ICopIGlkLAorCQkJCQkJUUlDX1JFUE9SVF9WRU5ET1JfSUQsIDgpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJLyogVGhlIGZvbGxvd2luZyBpcyBhbiB1bmRvY3VtZW50ZWQgY2FsbCBmb3VuZAorCQkJICogaW4gdGhlIENNUyBjb2RlLgorCQkJICovCisJCQlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKChpbnQgKikgaWQsIDI0LCA4KTsKKwkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJKmlkID0gVU5LTk9XTl9WRU5ET1I7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJnb3Qgb2xkIDggYml0IGlkOiAlMDR4IiwKKwkJCQkgICAgICAqaWQpOworCQkJCSppZCB8PSAweDIwMDAwOworCQkJfQorCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImdvdCA4IGJpdCBpZDogJTA0eCIsICppZCk7CisJCQkqaWQgfD0gMHgxMDAwMDsKKwkJfQorCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJnb3QgMTYgYml0IGlkOiAlMDR4IiwgKmlkKTsKKwl9CisJaWYgKCppZCA9PSAweDAwNDcpIHsKKwkJaW50IHZlcnNpb247CisJCWludCBzaWduOworCisJCWlmIChmdGFwZV9yZXBvcnRfcm9tX3ZlcnNpb24oJnZlcnNpb24pIDwgMCkgeworCQkJVFJBQ0UoZnRfdF9idWcsICJyZXBvcnQgcm9tIHZlcnNpb24gZmFpbGVkIik7CisJCQlUUkFDRV9FWElUOworCQl9CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJDTVMgcm9tIHZlcnNpb246ICVkIiwgdmVyc2lvbik7CisJCWZ0YXBlX2NvbW1hbmQoUUlDX0VOVEVSX0RJQUdOT1NUSUNfMSk7CisJCWZ0YXBlX2NvbW1hbmQoUUlDX0VOVEVSX0RJQUdOT1NUSUNfMSk7CisJCWRpYWdub3N0aWNfbW9kZSA9IDE7CisJCWlmIChmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKCZzaWduLCA5LCA4KSA8IDApIHsKKwkJCXVuc2lnbmVkIGludCBlcnJvcjsKKwkJCXFpYzExN19jbWRfdCBjb21tYW5kOworCisJCQlmdGFwZV9yZXBvcnRfZXJyb3IoJmVycm9yLCAmY29tbWFuZCwgMSk7CisJCQlmdGFwZV9jb21tYW5kKFFJQ19FTlRFUl9QUklNQVJZX01PREUpOworCQkJZGlhZ25vc3RpY19tb2RlID0gMDsKKwkJCVRSQUNFX0VYSVQ7CS8qIGZhaWx1cmUgISAqLworCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIkNNUyBzaWduYXR1cmU6ICUwMngiLCBzaWduKTsKKwkJfQorCQlpZiAoc2lnbiA9PSAweGE1KSB7CisJCQlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKCZzaWduLCAzNywgOCk7CisJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCWlmICh2ZXJzaW9uID49IDYzKSB7CisJCQkJCSppZCA9IDB4ODg4MDsKKwkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkJICAgICAgIlRoaXMgaXMgYW4gSW9tZWdhIGRyaXZlICEiKTsKKwkJCQl9IGVsc2UgeworCQkJCQkqaWQgPSAweDAwNDc7CisJCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCQkJCSAgICAgICJUaGlzIGlzIGEgcmVhbCBDTVMgZHJpdmUgISIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJKmlkID0gMHgwMDQ3OworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJDTVMgc3RhdHVzOiAlZCIsIHNpZ24pOworCQkJfQorCQl9IGVsc2UgeworCQkJKmlkID0gVU5LTk9XTl9WRU5ET1I7CisJCX0KKwkJZnRhcGVfY29tbWFuZChRSUNfRU5URVJfUFJJTUFSWV9NT0RFKTsKKwkJZGlhZ25vc3RpY19tb2RlID0gMDsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworc3RhdGljIGludCBxaWNfcmF0ZV9jb2RlKHVuc2lnbmVkIGludCByYXRlKQoreworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgMjUwOgorCQlyZXR1cm4gUUlDX0NPTkZJR19SQVRFXzI1MDsKKwljYXNlIDUwMDoKKwkJcmV0dXJuIFFJQ19DT05GSUdfUkFURV81MDA7CisJY2FzZSAxMDAwOgorCQlyZXR1cm4gUUlDX0NPTkZJR19SQVRFXzEwMDA7CisJY2FzZSAyMDAwOgorCQlyZXR1cm4gUUlDX0NPTkZJR19SQVRFXzIwMDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFFJQ19DT05GSUdfUkFURV81MDA7CisJfQorfQorCitzdGF0aWMgaW50IGZ0YXBlX3NldF9yYXRlX3Rlc3QodW5zaWduZWQgaW50ICptYXhfcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgZXJyb3I7CisJcWljMTE3X2NtZF90IGNvbW1hbmQ7CisJaW50IHN0YXR1czsKKwlpbnQgc3VwcG9ydGVkID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIENoZWNrIGlmIHRoZSBkcml2ZSBkb2VzIHN1cHBvcnQgdGhlIHNlbGVjdCByYXRlIGNvbW1hbmQKKwkgKiAgYnkgdGVzdGluZyBhbGwgZGlmZmVyZW50IHNldHRpbmdzLiBJZiBhbnkgb25lIGlzIGFjY2VwdGVkCisJICogIHdlIGFzc3VtZSB0aGUgY29tbWFuZCBpcyBzdXBwb3J0ZWQsIGVsc2Ugbm90LgorCSAqLworCWZvciAoKm1heF9yYXRlID0gMjAwMDsgKm1heF9yYXRlID49IDI1MDsgKm1heF9yYXRlIC89IDIpIHsKKwkJaWYgKGZ0YXBlX2NvbW1hbmQoUUlDX1NFTEVDVF9SQVRFKSA8IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CQkKKwkJaWYgKGZ0YXBlX3BhcmFtZXRlcl93YWl0KHFpY19yYXRlX2NvZGUoKm1heF9yYXRlKSwKKwkJCQkJIDEgKiBGVF9TRUNPTkQsICZzdGF0dXMpIDwgMCkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpIHsKKwkJCWZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyb3IsICZjb21tYW5kLCAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN1cHBvcnRlZCA9IDE7IC8qIGRpZCBhY2NlcHQgYSByZXF1ZXN0ICovCisJCWJyZWFrOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAiU2VsZWN0IFJhdGUgY29tbWFuZCBpcyVzIHN1cHBvcnRlZCIsIAorCSAgICAgIHN1cHBvcnRlZCA/ICIiIDogIiBub3QiKTsKKwlUUkFDRV9FWElUIHN1cHBvcnRlZDsKK30KKworaW50IGZ0YXBlX3NldF9kYXRhX3JhdGUodW5zaWduZWQgaW50IG5ld19yYXRlIC8qIEticHMgKi8sIHVuc2lnbmVkIGludCBxaWNfc3RkKQoreworCWludCBzdGF0dXM7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IGRhdGFfcmF0ZSA9IG5ld19yYXRlOworCXN0YXRpYyBpbnQgc3VwcG9ydGVkOworCWludCByYXRlX2NoYW5nZWQgPSAwOworCXFpY19tb2RlbCBkdW1teV9tb2RlbDsKKwl1bnNpZ25lZCBpbnQgZHVtbXlfcWljX3N0ZCwgZHVtbXlfdGFwZV9sZW47CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmIChmdF9kcml2ZV9tYXhfcmF0ZSA9PSAwKSB7IC8qIGZpcnN0IHRpbWUgKi8KKwkJc3VwcG9ydGVkID0gZnRhcGVfc2V0X3JhdGVfdGVzdCgmZnRfZHJpdmVfbWF4X3JhdGUpOworCX0KKwlpZiAoc3VwcG9ydGVkKSB7CisJCWZ0YXBlX2NvbW1hbmQoUUlDX1NFTEVDVF9SQVRFKTsKKwkJcmVzdWx0ID0gZnRhcGVfcGFyYW1ldGVyX3dhaXQocWljX3JhdGVfY29kZShuZXdfcmF0ZSksCisJCQkJCSAgICAgIDEgKiBGVF9TRUNPTkQsICZzdGF0dXMpOworCQlpZiAocmVzdWx0ID49IDAgJiYgIShzdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKSkgeworCQkJcmF0ZV9jaGFuZ2VkID0gMTsKKwkJfQorCX0KKwlUUkFDRV9DQVRDSChyZXN1bHQgPSBmdGFwZV9yZXBvcnRfY29uZmlndXJhdGlvbigmZHVtbXlfbW9kZWwsCisJCQkJCQkJJmRhdGFfcmF0ZSwgCisJCQkJCQkJJmR1bW15X3FpY19zdGQsCisJCQkJCQkJJmR1bW15X3RhcGVfbGVuKSwpOworCWlmIChkYXRhX3JhdGUgIT0gbmV3X3JhdGUpIHsKKwkJaWYgKCFzdXBwb3J0ZWQpIHsKKwkJCVRSQUNFKGZ0X3Rfd2FybiwgIlJhdGUgY2hhbmdlIG5vdCBzdXBwb3J0ZWQhIik7CisJCX0gZWxzZSBpZiAocmF0ZV9jaGFuZ2VkKSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJSZXF1ZXN0ZWQ6ICVkLCBnb3QgJWQiLAorCQkJICAgICAgbmV3X3JhdGUsIGRhdGFfcmF0ZSk7CisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJSYXRlIGNoYW5nZSBmYWlsZWQhIik7CisJCX0KKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwl9CisJLyoKKwkgKiAgU2V0IGRhdGEgcmF0ZSBhbmQgd3JpdGUgcHJlY29tcGVuc2F0aW9uIGFzIHNwZWNpZmllZDoKKwkgKgorCSAqICAgICAgICAgICAgfCAgUUlDLTQwLzgwICB8IFFJQy0zMDEwLzMwMjAKKwkgKiAgIHJhdGUgICAgIHwgICBwcmVjb21wICAgfCAgICBwcmVjb21wCisJICogIC0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLQorCSAqICAyNTAgS2Jwcy4gfCAgIDI1MCBucy4gICB8ICAgICAwIG5zLgorCSAqICA1MDAgS2Jwcy4gfCAgIDEyNSBucy4gICB8ICAgICAwIG5zLgorCSAqICAgIDEgTWJwcy4gfCAgICA0MiBucy4gICB8ICAgICAwIG5zLgorCSAqICAgIDIgTWJwcyAgfCAgICAgIE4vQSAgICB8ICAgICAwIG5zLgorCSAqLworCWlmICgocWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM0MCAmJiBkYXRhX3JhdGUgPiA1MDApIHx8IAorCSAgICAocWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM4MCAmJiBkYXRhX3JhdGUgPiAxMDAwKSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLAorCQkJICAgIGZ0X3Rfd2FybiwgIkRhdGFyYXRlIHRvbyBoaWdoIGZvciBRSUMtbW9kZSIpOworCX0KKwlUUkFDRV9DQVRDSChmZGNfc2V0X2RhdGFfcmF0ZShkYXRhX3JhdGUpLF9yZXMgPSAtRUlOVkFMKTsKKwlmdF9kYXRhX3JhdGUgPSBkYXRhX3JhdGU7CisJaWYgKHFpY19zdGQgPT0gUUlDX1RBUEVfUUlDNDAgfHwgcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM4MCkgeworCQlzd2l0Y2ggKGRhdGFfcmF0ZSkgeworCQljYXNlIDI1MDoKKwkJCWZkY19zZXRfd3JpdGVfcHJlY29tcCgyNTApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgNTAwOgorCQkJZmRjX3NldF93cml0ZV9wcmVjb21wKDEyNSk7CisJCQlicmVhazsKKwkJY2FzZSAxMDAwOgorCQkJZmRjX3NldF93cml0ZV9wcmVjb21wKDQyKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJZmRjX3NldF93cml0ZV9wcmVjb21wKDApOworCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogIFRoZSBuZXh0IHR3byBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gY29wZSB3aXRoIGV4Y2Vzc2l2ZSBvdmVycnVuIGVycm9ycworICovCitpbnQgZnRhcGVfaW5jcmVhc2VfdGhyZXNob2xkKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoZmRjLnR5cGUgPCBpODIwNzcgfHwgZnRfZmRjX3RocmVzaG9sZCA+PSAxMikgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgImNhbm5vdCBpbmNyZWFzZSBmaWZvIHRocmVzaG9sZCIpOworCX0KKwlpZiAoZmRjX2ZpZm9fdGhyZXNob2xkKCsrZnRfZmRjX3RocmVzaG9sZCwgTlVMTCwgTlVMTCwgTlVMTCkgPCAwKSB7CisJCVRSQUNFKGZ0X3RfZXJyLCAiY2Fubm90IGluY3JlYXNlIGZpZm8gdGhyZXNob2xkIik7CisJCWZ0X2ZkY190aHJlc2hvbGQgLS07CisJCWZkY19yZXNldCgpOworCX0KKwlUUkFDRShmdF90X2luZm8sICJOZXcgRklGTyB0aHJlc2hvbGQ6ICVkIiwgZnRfZmRjX3RocmVzaG9sZCk7CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgZnRhcGVfaGFsZl9kYXRhX3JhdGUodm9pZCkKK3sKKwlpZiAoZnRfZGF0YV9yYXRlIDwgNTAwKSB7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGZ0YXBlX3NldF9kYXRhX3JhdGUoZnRfZGF0YV9yYXRlIC8gMiwgZnRfcWljX3N0ZCkgPCAwKSB7CisJCXJldHVybiAtRUlPOworCX0KKwlmdGFwZV9jYWxjX3RpbWVvdXRzKGZ0X3FpY19zdGQsIGZ0X2RhdGFfcmF0ZSwgZnRhcGVfdGFwZV9sZW4pOworCXJldHVybiAwOworfQorCisvKiAgICAgIFNlZWsgdGhlIGhlYWQgdG8gdGhlIHNwZWNpZmllZCB0cmFjay4KKyAqLworaW50IGZ0YXBlX3NlZWtfaGVhZF90b190cmFjayh1bnNpZ25lZCBpbnQgdHJhY2spCit7CisJaW50IHN0YXR1czsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJZnRfbG9jYXRpb24udHJhY2sgPSAtMTsgLyogcmVtYWlucyBzZXQgaW4gY2FzZSBvZiBlcnJvciAqLworCWlmICh0cmFjayA+PSBmdF90cmFja3NfcGVyX3RhcGUpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9idWcsICJ0cmFjayBvdXQgb2YgYm91bmRzIik7CisJfQorCVRSQUNFKGZ0X3RfZmxvdywgInNlZWtpbmcgdHJhY2sgJWQiLCB0cmFjayk7CisJVFJBQ0VfQ0FUQ0goZnRhcGVfY29tbWFuZChRSUNfU0VFS19IRUFEX1RPX1RSQUNLKSwpOworCVRSQUNFX0NBVENIKGZ0YXBlX3BhcmFtZXRlcl93YWl0KHRyYWNrLCBmdGFwZV90aW1lb3V0LmhlYWRfc2VlaywKKwkJCQkJICZzdGF0dXMpLCk7CisJZnRfbG9jYXRpb24udHJhY2sgPSB0cmFjazsKKwlmdGFwZV9taWdodF9iZV9vZmZfdHJhY2sgPSAwOworCVRSQUNFX0VYSVQgMDsKK30KKworaW50IGZ0YXBlX3dha2V1cF9kcml2ZSh3YWtlX3VwX3R5cGVzIG1ldGhvZCkKK3sKKwlpbnQgc3RhdHVzOworCWludCBtb3Rvcl9vbiA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCXN3aXRjaCAobWV0aG9kKSB7CisJY2FzZSB3YWtlX3VwX2NvbG9yYWRvOgorCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKFFJQ19QSEFOVE9NX1NFTEVDVCksKTsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfcGFyYW1ldGVyKDAgLyogZnRfZHJpdmVfc2VsID8/ICovKSwpOworCQlicmVhazsKKwljYXNlIHdha2VfdXBfbW91bnRhaW46CisJCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmQoUUlDX1NPRlRfU0VMRUNUKSwpOworCQlmdGFwZV9zbGVlcChGVF9NSUxMSVNFQ09ORCk7CS8qIE5FRURFRCAqLworCQlUUkFDRV9DQVRDSChmdGFwZV9wYXJhbWV0ZXIoMTgpLCk7CisJCWJyZWFrOworCWNhc2Ugd2FrZV91cF9pbnNpZ2h0OgorCQlmdGFwZV9zbGVlcCgxMDAgKiBGVF9NSUxMSVNFQ09ORCk7CisJCW1vdG9yX29uID0gMTsKKwkJZmRjX21vdG9yKG1vdG9yX29uKTsJLyogZW5hYmxlIGlzIGRvbmUgYnkgbW90b3Itb24gKi8KKwljYXNlIG5vX3dha2VfdXA6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFX0VYSVQgLUVOT0RFVjsJLyogdW5rbm93biB3YWtldXAgbWV0aG9kICovCisJCWJyZWFrOworCX0KKwkvKiAgSWYgd2FrZXVwIHN1Y2NlZWRlZCB3ZSBzaG91bGRuJ3QgZ2V0IGFuIGVycm9yIGhlcmUuLgorCSAqLworCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9yYXdfZHJpdmVfc3RhdHVzKCZzdGF0dXMpLAorCQkgICAgaWYgKG1vdG9yX29uKSB7CisJCQkgICAgZmRjX21vdG9yKDApOworCQkgICAgfSk7CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgZnRhcGVfcHV0X2RyaXZlX3RvX3NsZWVwKHdha2VfdXBfdHlwZXMgbWV0aG9kKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlzd2l0Y2ggKG1ldGhvZCkgeworCWNhc2Ugd2FrZV91cF9jb2xvcmFkbzoKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfY29tbWFuZChRSUNfUEhBTlRPTV9ERVNFTEVDVCksKTsKKwkJYnJlYWs7CisJY2FzZSB3YWtlX3VwX21vdW50YWluOgorCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKFFJQ19TT0ZUX0RFU0VMRUNUKSwpOworCQlicmVhazsKKwljYXNlIHdha2VfdXBfaW5zaWdodDoKKwkJZmRjX21vdG9yKDApOwkvKiBlbmFibGUgaXMgZG9uZSBieSBtb3Rvci1vbiAqLworCWNhc2Ugbm9fd2FrZV91cDoJLyogbm8gd2FrZXVwIC8gbm8gc2xlZXAgISAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlUUkFDRV9FWElUIC1FTk9ERVY7CS8qIHVua25vd24gd2FrZXVwIG1ldGhvZCAqLworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK2ludCBmdGFwZV9yZXNldF9kcml2ZSh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCWludCBzdGF0dXM7CisJdW5zaWduZWQgaW50IGVycl9jb2RlOworCXFpYzExN19jbWRfdCBlcnJfY29tbWFuZDsKKwlpbnQgaTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIFdlIHdhbnQgdG8gcmUtZXN0YWJsaXNoIGNvbnRhY3Qgd2l0aCBvdXIgZHJpdmUuICBGaXJlIGEKKwkgKiAgbnVtYmVyIG9mIHJlc2V0IGNvbW1hbmRzIChzaW5nbGUgc3RlcCBwdWxzZXMpIGFuZCBwcmF5IGZvcgorCSAqICBzdWNjZXNzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAiUmVzZXR0aW5nIGZkYyIpOworCQlmZGNfcmVzZXQoKTsKKwkJZnRhcGVfc2xlZXAoMTAgKiBGVF9NSUxMSVNFQ09ORCk7CisJCVRSQUNFKGZ0X3RfZmxvdywgIlJlc2V0IGNvbW1hbmQgdG8gZHJpdmUiKTsKKwkJcmVzdWx0ID0gZnRhcGVfY29tbWFuZChRSUNfUkVTRVQpOworCQlpZiAocmVzdWx0ID09IDApIHsKKwkJCWZ0YXBlX3NsZWVwKDEgKiBGVF9TRUNPTkQpOyAvKiAgZHJpdmUgbm90CisJCQkJCQkgICAgICogIGFjY2Vzc2libGUKKwkJCQkJCSAgICAgKiAgZHVyaW5nIDEgc2Vjb25kCisJCQkJCQkgICAgICovCisJCQlUUkFDRShmdF90X2Zsb3csICJSZS1zZWxlY3RpbmcgZHJpdmUiKTsKKworCQkJLyogU3RyYW5nZSwgdGhlIFFJQy0xMTcgc3BlY3MgZG9uJ3QgbWVudGlvbgorCQkJICogdGhpcyBidXQgdGhlIGRyaXZlIGdldHMgZGVzZWxlY3RlZCBhZnRlciBhCisJCQkgKiBzb2Z0IHJlc2V0ICEgIFNvIHdlIG5lZWQgdG8gZW5hYmxlIGl0CisJCQkgKiBhZ2Fpbi4KKwkJCSAqLworCQkJaWYgKGZ0YXBlX3dha2V1cF9kcml2ZShmdF9kcml2ZV90eXBlLndha2VfdXApIDwgMCkgeworCQkJCVRSQUNFKGZ0X3RfZXJyLCAiV2FrZXVwIGZhaWxlZCAhIik7CisJCQl9CisJCQlUUkFDRShmdF90X2Zsb3csICJXYWl0aW5nIHVudGlsIGRyaXZlIGdldHMgcmVhZHkiKTsKKwkJCXJlc3VsdD0gZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnJlc2V0LCAmc3RhdHVzKTsKKwkJCWlmIChyZXN1bHQgPT0gMCAmJiAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikpIHsKKwkJCQlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfZXJyb3IoJmVycl9jb2RlLAorCQkJCQkJCSAgICAmZXJyX2NvbW1hbmQsIDEpOworCQkJCWlmIChyZXN1bHQgPT0gMCAmJiBlcnJfY29kZSA9PSAyNykgeworCQkJCQkvKiAgT2theSwgZHJpdmUgc2F3IHJlc2V0CisJCQkJCSAqICBjb21tYW5kIGFuZCByZXNwb25kZWQgYXMgaXQKKwkJCQkJICogIHNob3VsZAorCQkJCQkgKi8KKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVzdWx0ID0gLUVJTzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IC1FSU87CisJCQl9CisJCX0KKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCX0KKwlpZiAocmVzdWx0ICE9IDApIHsKKwkJVFJBQ0UoZnRfdF9lcnIsICJHZW5lcmFsIGZhaWx1cmUgdG8gcmVzZXQgdGFwZSBkcml2ZSIpOworCX0gZWxzZSB7CisJCS8qICBSZXN0b3JlIGNvcnJlY3Qgc2V0dGluZ3M6IGtlZXAgb3JpZ2luYWwgcmF0ZSAKKwkJICovCisJCWZ0YXBlX3NldF9kYXRhX3JhdGUoZnRfZGF0YV9yYXRlLCBmdF9xaWNfc3RkKTsKKwl9CisJZnRhcGVfaW5pdF9kcml2ZV9uZWVkZWQgPSAxOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWlvLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmE3YmFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWlvLmgKQEAgLTAsMCArMSw5MCBAQAorI2lmbmRlZiBfRlRBUEVfSU9fSAorI2RlZmluZSBfRlRBUEVfSU9fSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAoQykgMTk5NyAgICAgIENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjE4ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgdGhlIGdsdWUgcGFydCBvZiB0aGUKKyAqICAgICAgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLXZlbmRvcnMuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzZWVrOworCXVuc2lnbmVkIGludCByZXNldDsKKwl1bnNpZ25lZCBpbnQgcmV3aW5kOworCXVuc2lnbmVkIGludCBoZWFkX3NlZWs7CisJdW5zaWduZWQgaW50IHN0b3A7CisJdW5zaWduZWQgaW50IHBhdXNlOworfSBmdF90aW1lb3V0X3RhYmxlOworCit0eXBlZGVmIGVudW0geworCXByZWhpc3RvcmljLCBwcmVfcWljMTE3YywgcG9zdF9xaWMxMTdiLCBwb3N0X3FpYzExN2QgCit9IHFpY19tb2RlbDsKKworLyoKKyAqICAgICAgZnRhcGUtaW8uYyBkZWZpbmVkIGdsb2JhbCB2YXJzLgorICovCitleHRlcm4gZnRfdGltZW91dF90YWJsZSBmdGFwZV90aW1lb3V0OworZXh0ZXJuIHVuc2lnbmVkIGludCBmdGFwZV90YXBlX2xlbjsKK2V4dGVybiB2b2xhdGlsZSBxaWMxMTdfY21kX3QgZnRhcGVfY3VycmVudF9jb21tYW5kOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBxaWMxMTdfY29tbWFuZF90YWJsZSBxaWMxMTdfY21kc1tdOworZXh0ZXJuIGludCBmdGFwZV9taWdodF9iZV9vZmZfdHJhY2s7CisKKy8qCisgKiAgICAgIGZ0YXBlLWlvLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgorICovCitleHRlcm4gdm9pZCBmdGFwZV91ZGVsYXkodW5zaWduZWQgaW50IHVzZWNzKTsKK2V4dGVybiB2b2lkICBmdGFwZV91ZGVsYXlfY2FsaWJyYXRlKHZvaWQpOworZXh0ZXJuIHZvaWQgZnRhcGVfc2xlZXAodW5zaWduZWQgaW50IHRpbWUpOworZXh0ZXJuIHZvaWQgZnRhcGVfcmVwb3J0X3ZlbmRvcl9pZCh1bnNpZ25lZCBpbnQgKmlkKTsKK2V4dGVybiBpbnQgIGZ0YXBlX2NvbW1hbmQocWljMTE3X2NtZF90IGNvbW1hbmQpOworZXh0ZXJuIGludCAgZnRhcGVfY29tbWFuZF93YWl0KHFpYzExN19jbWRfdCBjb21tYW5kLAorCQkJICAgICAgIHVuc2lnbmVkIGludCB0aW1lb3V0LAorCQkJICAgICAgIGludCAqc3RhdHVzKTsKK2V4dGVybiBpbnQgIGZ0YXBlX3BhcmFtZXRlcih1bnNpZ25lZCBpbnQgcGFyYW1ldGVyKTsKK2V4dGVybiBpbnQgZnRhcGVfcmVwb3J0X29wZXJhdGlvbihpbnQgKnN0YXR1cywKKwkJCQkgIHFpYzExN19jbWRfdCAgY29tbWFuZCwKKwkJCQkgIGludCByZXN1bHRfbGVuZ3RoKTsKK2V4dGVybiBpbnQgZnRhcGVfcmVwb3J0X2NvbmZpZ3VyYXRpb24ocWljX21vZGVsICptb2RlbCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgKnJhdGUsCisJCQkJICAgICAgaW50ICpxaWNfc3RkLAorCQkJCSAgICAgIGludCAqdGFwZV9sZW4pOworZXh0ZXJuIGludCBmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKGludCAqc3RhdHVzKTsKK2V4dGVybiBpbnQgZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoaW50ICpzdGF0dXMpOworZXh0ZXJuIGludCBmdGFwZV9yZXBvcnRfc3RhdHVzKGludCAqc3RhdHVzKTsKK2V4dGVybiBpbnQgZnRhcGVfcmVhZHlfd2FpdCh1bnNpZ25lZCBpbnQgdGltZW91dCwgaW50ICpzdGF0dXMpOworZXh0ZXJuIGludCBmdGFwZV9zZWVrX2hlYWRfdG9fdHJhY2sodW5zaWduZWQgaW50IHRyYWNrKTsKK2V4dGVybiBpbnQgZnRhcGVfc2V0X2RhdGFfcmF0ZSh1bnNpZ25lZCBpbnQgbmV3X3JhdGUsIHVuc2lnbmVkIGludCBxaWNfc3RkKTsKK2V4dGVybiBpbnQgZnRhcGVfcmVwb3J0X2Vycm9yKHVuc2lnbmVkIGludCAqZXJyb3IsCisJCQkgICAgICBxaWMxMTdfY21kX3QgKmNvbW1hbmQsCisJCQkgICAgICBpbnQgcmVwb3J0KTsKK2V4dGVybiBpbnQgZnRhcGVfcmVzZXRfZHJpdmUodm9pZCk7CitleHRlcm4gaW50IGZ0YXBlX3B1dF9kcml2ZV90b19zbGVlcCh3YWtlX3VwX3R5cGVzIG1ldGhvZCk7CitleHRlcm4gaW50IGZ0YXBlX3dha2V1cF9kcml2ZSh3YWtlX3VwX3R5cGVzIG1ldGhvZCk7CitleHRlcm4gaW50IGZ0YXBlX2luY3JlYXNlX3RocmVzaG9sZCh2b2lkKTsKK2V4dGVybiBpbnQgZnRhcGVfaGFsZl9kYXRhX3JhdGUodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXByb2MuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2MjUxZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcHJvYy5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXByb2MuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4xMSAkCisgKiAkRGF0ZTogMTk5Ny8xMC8yNCAxNDo0NzozNyAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHByb2NmcyBpbnRlcmZhY2UgZm9yIHRoZQorICogICAgICBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciAiZnRhcGUiIGZvciBMaW51eC4KKworICoJT2xkIGNvZGUgcmVtb3ZlZCwgc3dpdGNoZWQgdG8gZHluYW1pYyBwcm9jIGVudHJ5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX0ZUX1BST0NfRlMpCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KKworI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcHJvYy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKworc3RhdGljIHNpemVfdCBnZXRfZHJpdmVyX2luZm8oY2hhciAqYnVmKQoreworCWNvbnN0IGNoYXIgKmRlYnVnX2xldmVsW10gPSB7ICJidWdzIiAgLAorCQkJCSAgICAgICJlcnJvcnMiLAorCQkJCSAgICAgICJ3YXJuaW5ncyIsCisJCQkJICAgICAgImluZm9ybWF0aW9uYWwiLAorCQkJCSAgICAgICJub2lzeSIsCisJCQkJICAgICAgInByb2dyYW0gZmxvdyIsCisJCQkJICAgICAgImZkYyBhbmQgZG1hIiwKKwkJCQkgICAgICAiZGF0YSBmbG93IiwKKwkJCQkgICAgICAiYW55dGhpbmciIH07CisKKwlyZXR1cm4gc3ByaW50ZihidWYsCisJCSAgICAgICAidmVyc2lvbiAgICAgICA6ICVzXG4iCisJCSAgICAgICAidXNlZCBkYXRhIHJhdGU6ICVkIGtiaXQvc2VjXG4iCisJCSAgICAgICAiZG1hIG1lbW9yeSAgICA6ICVkIGtiXG4iCisJCSAgICAgICAiZGVidWcgbWVzc2FnZXM6ICVzXG4iLAorCQkgICAgICAgRlRBUEVfVkVSU0lPTiwKKwkJICAgICAgIGZ0X2RhdGFfcmF0ZSwKKwkJICAgICAgIEZUX0JVRkZfU0laRSAqIGZ0X25yX2J1ZmZlcnMgPj4gMTAsCisJCSAgICAgICBkZWJ1Z19sZXZlbFtUUkFDRV9MRVZFTF0pOworfQorCitzdGF0aWMgc2l6ZV90IGdldF90YXBlZHJpdmVfaW5mbyhjaGFyICpidWYpCit7IAorCXJldHVybiBzcHJpbnRmKGJ1ZiwKKwkJICAgICAgICJ2ZW5kb3IgaWQgOiAweCUwNHhcbiIKKwkJICAgICAgICJkcml2ZSBuYW1lOiAlc1xuIgorCQkgICAgICAgIndpbmQgc3BlZWQ6ICVkIGlwc1xuIgorCQkgICAgICAgIndha2V1cCAgICA6ICVzXG4iCisJCSAgICAgICAibWF4LiByYXRlIDogJWQga2JpdC9zZWNcbiIsCisJCSAgICAgICBmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCwKKwkJICAgICAgIGZ0X2RyaXZlX3R5cGUubmFtZSwKKwkJICAgICAgIGZ0X2RyaXZlX3R5cGUuc3BlZWQsCisJCSAgICAgICAoKGZ0X2RyaXZlX3R5cGUud2FrZV91cCA9PSBub193YWtlX3VwKQorCQkJPyAiTm8gd2FrZXVwIG5lZWRlZCIgOgorCQkJKChmdF9kcml2ZV90eXBlLndha2VfdXAgPT0gd2FrZV91cF9jb2xvcmFkbykKKwkJCSA/ICJDb2xvcmFkbyIgOgorCQkJICgoZnRfZHJpdmVfdHlwZS53YWtlX3VwID09IHdha2VfdXBfbW91bnRhaW4pCisJCQkgID8gIk1vdW50YWluIiA6CisJCQkgICgoZnRfZHJpdmVfdHlwZS53YWtlX3VwID09IHdha2VfdXBfaW5zaWdodCkKKwkJCSAgID8gIk1vdG9yIG9uIiA6CisJCQkgICAiVW5rbm93biIpKSkpLAorCQkgICAgICAgZnRfZHJpdmVfbWF4X3JhdGUpOworfQorCitzdGF0aWMgc2l6ZV90IGdldF9jYXJ0cmlkZ2VfaW5mbyhjaGFyICpidWYpCit7CisJaWYgKGZ0YXBlX2luaXRfZHJpdmVfbmVlZGVkKSB7CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInVuaW5pdGlhbGl6ZWRcbiIpOworCX0KKwlpZiAoZnRfbm9fdGFwZSkgeworCQlyZXR1cm4gc3ByaW50ZihidWYsICJubyBjYXJ0cmlkZ2UgaW5zZXJ0ZWRcbiIpOworCX0KKwlyZXR1cm4gc3ByaW50ZihidWYsCisJCSAgICAgICAic2VnbWVudHMgIDogJTVkXG4iCisJCSAgICAgICAidHJhY2tzICAgIDogJTVkXG4iCisJCSAgICAgICAibGVuZ3RoICAgIDogJTVkZnRcbiIKKwkJICAgICAgICJmb3JtYXR0ZWQgOiAlM3NcbiIKKwkJICAgICAgICJ3cml0YWJsZSAgOiAlM3NcbiIKKwkJICAgICAgICJRSUMgc3BlYy4gOiBRSUMtJXNcbiIKKwkJICAgICAgICJmbXQtY29kZSAgOiAlMWRcbiIsCisJCSAgICAgICBmdF9zZWdtZW50c19wZXJfdHJhY2ssCisJCSAgICAgICBmdF90cmFja3NfcGVyX3RhcGUsCisJCSAgICAgICBmdGFwZV90YXBlX2xlbiwKKwkJICAgICAgIChmdF9mb3JtYXR0ZWQgPT0gMSkgPyAieWVzIiA6ICJubyIsCisJCSAgICAgICAoZnRfd3JpdGVfcHJvdGVjdGVkID09IDEpID8gIm5vIiA6ICJ5ZXMiLAorCQkgICAgICAgKChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzQwKSA/ICI0MCIgOgorCQkJKChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzgwKSA/ICI4MCIgOgorCQkJICgoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUMzMDEwKSA/ICIzMDEwIiA6CisJCQkgICgoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUMzMDIwKSA/ICIzMDIwIiA6CisJCQkgICAiPz8/IikpKSksCisJCSAgICAgICBmdF9mb3JtYXRfY29kZSk7Cit9CisKK3N0YXRpYyBzaXplX3QgZ2V0X2NvbnRyb2xsZXJfaW5mbyhjaGFyICpidWYpCit7CisJY29uc3QgY2hhciAgKmZkY19uYW1lW10gPSB7ICJubyBmZGMiLAorCQkJCSAgICAiaTgyNzIiLAorCQkJCSAgICAiaTgyMDc3IiwKKwkJCQkgICAgImk4MjA3N0FBIiwKKwkJCQkgICAgIkNvbG9yYWRvIEZDLTEwIG9yIEZDLTIwIiwKKwkJCQkgICAgImk4MjA3OCIsCisJCQkJICAgICJpODIwNzhfMSIgfTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwKKwkJICAgICAgICJGREMgdHlwZSAgOiAlc1xuIgorCQkgICAgICAgIkZEQyBiYXNlICA6IDB4JTAzeFxuIgorCQkgICAgICAgIkZEQyBpcnEgICA6ICVkXG4iCisJCSAgICAgICAiRkRDIGRtYSAgIDogJWRcbiIKKwkJICAgICAgICJGREMgdGhyLiAgOiAlZFxuIgorCQkgICAgICAgIm1heC4gcmF0ZSA6ICVkIGtiaXQvc2VjXG4iLAorCQkgICAgICAgZnRfbWFjaDIgPyAiTW91bnRhaW4gTUFDSC0yIiA6IGZkY19uYW1lW2ZkYy50eXBlXSwKKwkJICAgICAgIGZkYy5zcmEsIGZkYy5pcnEsIGZkYy5kbWEsCisJCSAgICAgICBmdF9mZGNfdGhyZXNob2xkLCBmdF9mZGNfbWF4X3JhdGUpOworfQorCitzdGF0aWMgc2l6ZV90IGdldF9oaXN0b3J5X2luZm8oY2hhciAqYnVmKQoreworICAgICAgICBzaXplX3QgbGVuOworCisJbGVuICA9IHNwcmludGYoYnVmLAorCQkgICAgICAgIlxuRkRDIGlzciBzdGF0aXN0aWNzXG4iCisJCSAgICAgICAiIGlkX2FtX2Vycm9ycyAgICAgOiAlM2RcbiIKKwkJICAgICAgICIgaWRfY3JjX2Vycm9ycyAgICA6ICUzZFxuIgorCQkgICAgICAgIiBkYXRhX2FtX2Vycm9ycyAgIDogJTNkXG4iCisJCSAgICAgICAiIGRhdGFfY3JjX2Vycm9ycyAgOiAlM2RcbiIKKwkJICAgICAgICIgb3ZlcnJ1bl9lcnJvcnMgICA6ICUzZFxuIgorCQkgICAgICAgIiBub19kYXRhX2Vycm9ycyAgIDogJTNkXG4iCisJCSAgICAgICAiIHJldHJpZXMgICAgICAgICAgOiAlM2RcbiIsCisJCSAgICAgICBmdF9oaXN0b3J5LmlkX2FtX2Vycm9ycywgICBmdF9oaXN0b3J5LmlkX2NyY19lcnJvcnMsCisJCSAgICAgICBmdF9oaXN0b3J5LmRhdGFfYW1fZXJyb3JzLCBmdF9oaXN0b3J5LmRhdGFfY3JjX2Vycm9ycywKKwkJICAgICAgIGZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnMsIGZ0X2hpc3Rvcnkubm9fZGF0YV9lcnJvcnMsCisJCSAgICAgICBmdF9oaXN0b3J5LnJldHJpZXMpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwKKwkJICAgICAgICJcbkVDQyBzdGF0aXN0aWNzXG4iCisJCSAgICAgICAiIGNyY19lcnJvcnMgICAgICAgOiAlM2RcbiIKKwkJICAgICAgICIgY3JjX2ZhaWx1cmVzICAgICA6ICUzZFxuIgorCQkgICAgICAgIiBlY2NfZmFpbHVyZXMgICAgIDogJTNkXG4iCisJCSAgICAgICAiIHNlY3RvcnMgY29ycmVjdGVkOiAlM2RcbiIsCisJCSAgICAgICBmdF9oaXN0b3J5LmNyY19lcnJvcnMsICAgZnRfaGlzdG9yeS5jcmNfZmFpbHVyZXMsCisJCSAgICAgICBmdF9oaXN0b3J5LmVjY19mYWlsdXJlcywgZnRfaGlzdG9yeS5jb3JyZWN0ZWQpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwKKwkJICAgICAgICJcbnRhcGUgcXVhbGl0eSBzdGF0aXN0aWNzXG4iCisJCSAgICAgICAiIG1lZGlhIGRlZmVjdHMgICAgOiAlM2RcbiIsCisJCSAgICAgICBmdF9oaXN0b3J5LmRlZmVjdHMpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwKKwkJICAgICAgICJcbnRhcGUgbW90aW9uIHN0YXRpc3RpY3NcbiIKKwkJICAgICAgICIgcmVwb3NpdGlvbnMgICAgICA6ICUzZFxuIiwKKwkJICAgICAgIGZ0X2hpc3RvcnkucmV3aW5kcyk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBmdGFwZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWNoYXIgKnB0ciA9IHBhZ2U7CisJc2l6ZV90IGxlbjsKKwkKKwlwdHIgKz0gc3ByaW50ZihwdHIsICJLZXJuZWwgRHJpdmVyXG5cbiIpOworCXB0ciArPSBnZXRfZHJpdmVyX2luZm8ocHRyKTsKKwlwdHIgKz0gc3ByaW50ZihwdHIsICJcblRhcGUgRHJpdmVcblxuIik7CisJcHRyICs9IGdldF90YXBlZHJpdmVfaW5mbyhwdHIpOworCXB0ciArPSBzcHJpbnRmKHB0ciwgIlxuRkRDIENvbnRyb2xsZXJcblxuIik7CisJcHRyICs9IGdldF9jb250cm9sbGVyX2luZm8ocHRyKTsKKwlwdHIgKz0gc3ByaW50ZihwdHIsICJcblRhcGUgQ2FydHJpZGdlXG5cbiIpOworCXB0ciArPSBnZXRfY2FydHJpZGdlX2luZm8ocHRyKTsKKwlwdHIgKz0gc3ByaW50ZihwdHIsICJcbkhpc3RvcnkgUmVjb3JkXG5cbiIpOworCXB0ciArPSBnZXRfaGlzdG9yeV9pbmZvKHB0cik7CisKKwlsZW4gPSBzdHJsZW4ocGFnZSk7CisJKnN0YXJ0ID0gTlVMTDsKKwlpZiAob2ZmK2NvdW50ID49IGxlbikgeworCQkqZW9mID0gMTsKKwl9IGVsc2UgeworCQkqZW9mID0gMDsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworaW50IF9faW5pdCBmdGFwZV9wcm9jX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZnRhcGUiLCAwLCAmcHJvY19yb290LAorCQlmdGFwZV9yZWFkX3Byb2MsIE5VTEwpICE9IE5VTEw7Cit9CisKK3ZvaWQgZnRhcGVfcHJvY19kZXN0cm95KHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImZ0YXBlIiwgJnByb2Nfcm9vdCk7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19GVF9QUk9DX0ZTKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXByb2MuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1wcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0ZGZjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1wcm9jLmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBfRlRBUEVfUFJPQ19ICisjZGVmaW5lIF9GVEFQRV9QUk9DX0gKKworLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1wcm9jLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODoyMCAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBwcm9jZnMgaW50ZXJmYWNlIG9mIHRoZQorICogICAgICBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciAiZnRhcGUiIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCitleHRlcm4gaW50ICBmdGFwZV9wcm9jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBmdGFwZV9wcm9jX2Rlc3Ryb3kodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJlYWQuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2N2Q4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1yZWFkLmMKQEAgLTAsMCArMSw2MjEgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcmVhZC5jLHYgJAorICogJFJldmlzaW9uOiAxLjYgJAorICogJERhdGU6IDE5OTcvMTAvMjEgMTQ6Mzk6MjIgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSByZWFkaW5nIGNvZGUKKyAqICAgICAgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtZWNjLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnNtLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KKworLyogICAgICBMb2NhbCB2YXJzLgorICovCisKK3ZvaWQgZnRhcGVfemFwX3JlYWRfYnVmZmVycyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGZ0X25yX2J1ZmZlcnM7ICsraSkgeworLyogIGNoYW5nZWQgdG8gImZpdCIgd2l0aCBkeW5hbWljIGFsbG9jYXRpb24gb2YgdGFwZV9idWZmZXIuIC0ta2hwICAqLworCQlmdF9idWZmZXJbaV0tPnN0YXR1cyA9IHdhaXRpbmc7CisJCWZ0X2J1ZmZlcltpXS0+Ynl0ZXMgPSAwOworCQlmdF9idWZmZXJbaV0tPnNraXAgPSAwOworCQlmdF9idWZmZXJbaV0tPnJldHJ5ID0gMDsKKwl9CisvKglmdGFwZV9yZXNldF9idWZmZXIoKTsgKi8KK30KKworc3RhdGljIFNlY3Rvck1hcCBjb252ZXJ0X3NlY3Rvcl9tYXAoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYpCit7CisJaW50IGkgPSAwOworCVNlY3Rvck1hcCBiYWRfbWFwID0gZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoYnVmZi0+c2VnbWVudF9pZCk7CisJU2VjdG9yTWFwIHNyY19tYXAgPSBidWZmLT5zb2Z0X2Vycm9yX21hcCB8IGJ1ZmYtPmhhcmRfZXJyb3JfbWFwOworCVNlY3Rvck1hcCBkc3RfbWFwID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGJhZF9tYXAgfHwgc3JjX21hcCkgeworCQlUUkFDRShmdF90X2Zsb3csICJiYWRfbWFwID0gMHglMDhseCIsIChsb25nKSBiYWRfbWFwKTsKKwkJVFJBQ0UoZnRfdF9mbG93LCAic3JjX21hcCA9IDB4JTA4bHgiLCAobG9uZykgc3JjX21hcCk7CisJfQorCXdoaWxlIChiYWRfbWFwKSB7CisJCXdoaWxlICgoYmFkX21hcCAmIDEpID09IDApIHsKKwkJCWlmIChzcmNfbWFwICYgMSkgeworCQkJCWRzdF9tYXAgfD0gKDEgPDwgaSk7CisJCQl9CisJCQlzcmNfbWFwID4+PSAxOworCQkJYmFkX21hcCA+Pj0gMTsKKwkJCSsraTsKKwkJfQorCQkvKiAoYmFkX21hcCAmIDEpID09IDEgKi8KKwkJc3JjX21hcCA+Pj0gMTsKKwkJYmFkX21hcCA+Pj0gMTsKKwl9CisJaWYgKHNyY19tYXApIHsKKwkJZHN0X21hcCB8PSAoc3JjX21hcCA8PCBpKTsKKwl9CisJaWYgKGRzdF9tYXApIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAiZHN0X21hcCA9IDB4JTA4bHgiLCAobG9uZykgZHN0X21hcCk7CisJfQorCVRSQUNFX0VYSVQgZHN0X21hcDsKK30KKworc3RhdGljIGludCBjb3JyZWN0X2FuZF9jb3B5X2ZyYWN0aW9uKGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmYsIF9fdTggKiBkZXN0aW5hdGlvbiwKKwkJCQkgICAgIGludCBzdGFydCwgaW50IHNpemUpCit7CisJc3RydWN0IG1lbW9yeV9zZWdtZW50IG1zZWc7CisJaW50IHJlc3VsdDsKKwlTZWN0b3JNYXAgcmVhZF9iYWQ7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCW1zZWcucmVhZF9iYWQgPSBjb252ZXJ0X3NlY3Rvcl9tYXAoYnVmZik7CisJbXNlZy5tYXJrZWRfYmFkID0gMDsJLyogbm90IHVzZWQuLi4gKi8KKwltc2VnLmJsb2NrcyA9IGJ1ZmYtPmJ5dGVzIC8gRlRfU0VDVE9SX1NJWkU7CisJbXNlZy5kYXRhID0gYnVmZi0+YWRkcmVzczsKKwkvKiAgICBJZiB0aGVyZSBhcmUgbm8gZGF0YSBzZWN0b3JzIHdlIGNhbiBza2lwIHRoaXMgc2VnbWVudC4KKwkgKi8KKwlpZiAobXNlZy5ibG9ja3MgPD0gMykgeworCQlUUkFDRV9BQk9SVCgwLCBmdF90X25vaXNlLCAiZW1wdHkgc2VnbWVudCIpOworCX0KKwlyZWFkX2JhZCA9IG1zZWcucmVhZF9iYWQ7CisJZnRfaGlzdG9yeS5jcmNfZXJyb3JzICs9IGNvdW50X29uZXMocmVhZF9iYWQpOworCXJlc3VsdCA9IGZ0YXBlX2VjY19jb3JyZWN0X2RhdGEoJm1zZWcpOworCWlmIChyZWFkX2JhZCAhPSAwIHx8IG1zZWcuY29ycmVjdGVkICE9IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImNyYyBlcnJvciBtYXA6IDB4JTA4bHgiLCAodW5zaWduZWQgbG9uZylyZWFkX2JhZCk7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJjb3JyZWN0ZWQgbWFwOiAweCUwOGx4IiwgKHVuc2lnbmVkIGxvbmcpbXNlZy5jb3JyZWN0ZWQpOworCQlmdF9oaXN0b3J5LmNvcnJlY3RlZCArPSBjb3VudF9vbmVzKG1zZWcuY29ycmVjdGVkKTsKKwl9CisJaWYgKHJlc3VsdCA9PSBFQ0NfQ09SUkVDVEVEIHx8IHJlc3VsdCA9PSBFQ0NfT0spIHsKKwkJaWYgKHJlc3VsdCA9PSBFQ0NfQ09SUkVDVEVEKSB7CisJCQlUUkFDRShmdF90X2luZm8sICJlY2MgY29ycmVjdGVkIHNlZ21lbnQ6ICVkIiwgYnVmZi0+c2VnbWVudF9pZCk7CisJCX0KKwkJaWYoc3RhcnQgPCAwKSB7CisJCQlzdGFydD0gMDsKKwkJfQorCQlpZigoc3RhcnQrc2l6ZSkgPiAoKG1zZWcuYmxvY2tzIC0gMykgKiBGVF9TRUNUT1JfU0laRSkpIHsKKwkJCXNpemUgPSAobXNlZy5ibG9ja3MgLSAzKSAqIEZUX1NFQ1RPUl9TSVpFICAtIHN0YXJ0OworCQl9IAorCQlpZiAoc2l6ZSA8IDApIHsKKwkJCXNpemU9IDA7CisJCX0KKwkJaWYoc2l6ZSA+IDApIHsKKwkJCW1lbWNweShkZXN0aW5hdGlvbiArIHN0YXJ0LCBtc2VnLmRhdGEgKyBzdGFydCwgc2l6ZSk7CisJCX0KKwkJaWYgKChyZWFkX2JhZCBeIG1zZWcuY29ycmVjdGVkKSAmIG1zZWcuY29ycmVjdGVkKSB7CisJCQkvKiBzZWN0b3JzIGNvcnJlY3RlZCB3aXRob3V0IGNyYyBlcnJvcnMgc2V0ICovCisJCQlmdF9oaXN0b3J5LmNyY19mYWlsdXJlcysrOworCQl9CisJCVRSQUNFX0VYSVQgc2l6ZTsgLyogKG1zZWcuYmxvY2tzIC0gMykgKiBGVF9TRUNUT1JfU0laRTsgKi8KKwl9IGVsc2UgeworCQlmdF9oaXN0b3J5LmVjY19mYWlsdXJlcysrOworCQlUUkFDRV9BQk9SVCgtRUFHQUlOLAorCQkJICAgIGZ0X3RfZXJyLCAiZWNjIGZhaWx1cmUgb24gc2VnbWVudCAlZCIsCisJCQkgICAgYnVmZi0+c2VnbWVudF9pZCk7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworLyogICAgICBSZWFkIGdpdmVuIHNlZ21lbnQgaW50byBidWZmZXIgYXQgYWRkcmVzcy4KKyAqLworaW50IGZ0YXBlX3JlYWRfc2VnbWVudF9mcmFjdGlvbihjb25zdCBpbnQgc2VnbWVudF9pZCwKKwkJCQl2b2lkICAqYWRkcmVzcywgCisJCQkJY29uc3QgZnRfcmVhZF9tb2RlX3QgcmVhZF9tb2RlLAorCQkJCWNvbnN0IGludCBzdGFydCwKKwkJCQljb25zdCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgcmV0cnkgID0gMDsKKwlpbnQgYnl0ZXNfcmVhZCA9IDA7CisJaW50IHJlYWRfZG9uZSAgPSAwOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJZnRfaGlzdG9yeS51c2VkIHw9IDE7CisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJzZWdtZW50X2lkID0gJWQiLCBzZWdtZW50X2lkKTsKKwlpZiAoZnRfZHJpdmVyX3N0YXRlICE9IHJlYWRpbmcpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImNhbGxpbmcgZnRhcGVfYWJvcnRfb3BlcmF0aW9uIik7CisJCVRSQUNFX0NBVENIKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpLCk7CisJCWZ0YXBlX3NldF9zdGF0ZShyZWFkaW5nKTsKKwl9CisJZm9yKDs7KSB7CisJCWJ1ZmZlcl9zdHJ1Y3QgKnRhaWw7CisJCS8qICBBbGxvdyBlc2NhcGUgZnJvbSB0aGlzIGxvb3Agb24gc2lnbmFsICEKKwkJICovCisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJLyogIFNlYXJjaCBhbGwgZnVsbCBidWZmZXJzIGZvciB0aGUgZmlyc3QgbWF0Y2hpbmcgdGhlCisJCSAqICB3YW50ZWQgc2VnbWVudC4gIENsZWFyIG90aGVyIGJ1ZmZlcnMgb24gdGhlIGZseS4KKwkJICovCisJCXRhaWwgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOworCQl3aGlsZSAoIXJlYWRfZG9uZSAmJiB0YWlsLT5zdGF0dXMgPT0gZG9uZSkgeworCQkJLyogIEFsbG93IGVzY2FwZSBmcm9tIHRoaXMgbG9vcCBvbiBzaWduYWwgIQorCQkJICovCisJCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCQlpZiAodGFpbC0+c2VnbWVudF9pZCA9PSBzZWdtZW50X2lkKSB7CisJCQkJLyogIElmIG91dCBidWZmZXIgaXMgYWxyZWFkeSBmdWxsLAorCQkJCSAqICByZXR1cm4gaXRzIGNvbnRlbnRzLiAgCisJCQkJICovCisJCQkJVFJBQ0UoZnRfdF9mbG93LCAiZm91bmQgc2VnbWVudCBpbiBjYWNoZTogJWQiLAorCQkJCSAgICAgIHNlZ21lbnRfaWQpOworCQkJCWlmICh0YWlsLT5kZWxldGVkKSB7CisJCQkJCS8qICBSZXR1cm4gYSB2YWx1ZSB0aGF0CisJCQkJCSAqICByZWFkX2hlYWRlcl9zZWdtZW50CisJCQkJCSAqICB1bmRlcnN0YW5kcy4gIEFzIHRoaXMKKwkJCQkJICogIHNob3VsZCBvbmx5IG9jY3VyIHdoZW4KKwkJCQkJICogIHNlYXJjaGluZyBmb3IgdGhlIGhlYWRlcgorCQkJCQkgKiAgc2VnbWVudHMgaXQgc2hvdWxkbid0IGJlCisJCQkJCSAqICBtaXNpbnRlcnByZXRlZCBlbHNld2hlcmUuCisJCQkJCSAqLworCQkJCQlUUkFDRV9FWElUIDA7CisJCQkJfQorCQkJCXJlc3VsdCA9IGNvcnJlY3RfYW5kX2NvcHlfZnJhY3Rpb24oCisJCQkJCXRhaWwsCisJCQkJCWFkZHJlc3MsCisJCQkJCXN0YXJ0LAorCQkJCQlzaXplKTsKKwkJCQlUUkFDRShmdF90X2Zsb3csICJzZWdtZW50IGNvbnRhaW5zIChieXRlcyk6ICVkIiwKKwkJCQkgICAgICByZXN1bHQpOworCQkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJCWlmIChyZXN1bHQgIT0gLUVBR0FJTikgeworCQkJCQkJVFJBQ0VfRVhJVCByZXN1bHQ7CisJCQkJCX0KKwkJCQkJLyoga2VlcCByZWFkX2RvbmUgPT0gMCwgd2lsbAorCQkJCQkgKiB0cmlnZ2VyCisJCQkJCSAqIGZ0YXBlX2Fib3J0X29wZXJhdGlvbgorCQkJCQkgKiBiZWNhdXNlIHJlYWRpbmcgd3JvbmcKKwkJCQkJICogc2VnbWVudC4KKwkJCQkJICovCisJCQkJCVRSQUNFKGZ0X3RfZXJyLCAiZWNjIGZhaWxlZCwgcmV0cnkiKTsKKwkJCQkJKytyZXRyeTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZWFkX2RvbmUgPSAxOworCQkJCQlieXRlc19yZWFkID0gcmVzdWx0OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0UoZnRfdF9mbG93LCJ6YXBwaW5nIHNlZ21lbnQgaW4gY2FjaGU6ICVkIiwKKwkJCQkgICAgICB0YWlsLT5zZWdtZW50X2lkKTsKKwkJCX0KKwkJCXRhaWwtPnN0YXR1cyA9IHdhaXRpbmc7CisJCQl0YWlsID0gZnRhcGVfbmV4dF9idWZmZXIoZnRfcXVldWVfdGFpbCk7CisJCX0KKwkJaWYgKCFyZWFkX2RvbmUgJiYgdGFpbC0+c3RhdHVzID09IHJlYWRpbmcpIHsKKwkJCWlmICh0YWlsLT5zZWdtZW50X2lkID09IHNlZ21lbnRfaWQpIHsKKwkJCQlzd2l0Y2goZnRhcGVfd2FpdF9zZWdtZW50KHJlYWRpbmcpKSB7CisJCQkJY2FzZSAwOgorCQkJCQlicmVhazsKKwkJCQljYXNlIC1FSU5UUjoKKwkJCQkJVFJBQ0VfQUJPUlQoLUVJTlRSLCBmdF90X3dhcm4sCisJCQkJCQkgICAgImludGVycnVwdGVkIGJ5ICIKKwkJCQkJCSAgICAibm9uLWJsb2NrYWJsZSBzaWduYWwiKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkJICAgICAgIndhaXRfc2VnbWVudCBmYWlsZWQiKTsKKwkJCQkJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7CisJCQkJCWZ0YXBlX3NldF9zdGF0ZShyZWFkaW5nKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiAgV2UncmUgcmVhZGluZyB0aGUgd3Jvbmcgc2VnbWVudCwKKwkJCQkgKiAgc3RvcCBydW5uZXIuCisJCQkJICovCisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgInJlYWRpbmcgd3Jvbmcgc2VnbWVudCIpOworCQkJCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOworCQkJCWZ0YXBlX3NldF9zdGF0ZShyZWFkaW5nKTsKKwkJCX0KKwkJfQorCQkvKiAgICBzaG91bGQgcnVubmVyIHN0b3AgPworCQkgKi8KKwkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gYWJvcnRpbmcpIHsKKwkJCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCQkJc3dpdGNoKGhlYWQtPnN0YXR1cykgeworCQkJY2FzZSBlcnJvcjoKKwkJCQlmdF9oaXN0b3J5LmRlZmVjdHMgKz0gCisJCQkJCWNvdW50X29uZXMoaGVhZC0+aGFyZF9lcnJvcl9tYXApOworCQkJY2FzZSByZWFkaW5nOgorCQkJCWhlYWQtPnN0YXR1cyA9IHdhaXRpbmc7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfZHVtYl9zdG9wKCksKTsKKwkJfSBlbHNlIHsKKwkJCS8qICBJZiBqdXN0IHBhc3NlZCBsYXN0IHNlZ21lbnQgb24gdGFwZTogd2FpdAorCQkJICogIGZvciBCT1Qgb3IgRU9UIG1hcmsuIFNldHMgZnRfcnVubmVyX3N0YXR1cyB0bworCQkJICogIGlkbGUgaWYgYXQgbEVPVCBhbmQgc3VjY2Vzc2Z1bCAKKwkJCSAqLworCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfaGFuZGxlX2xvZ2ljYWxfZW90KCksKTsKKwkJfQorCQkvKiAgICBJZiB3ZSBnb3QgYSBzZWdtZW50OiBxdWl0LCBvciBlbHNlIHJldHJ5IHVwIHRvIGxpbWl0LgorCQkgKgorCQkgKiAgICBJZiBzZWdtZW50IHRvIHJlYWQgaXMgZW1wdHksIGRvIG5vdCBzdGFydCBydW5uZXIgZm9yIGl0LAorCQkgKiAgICBidXQgd2FpdCBmb3IgbmV4dCByZWFkIGNhbGwuCisJCSAqLworCQlpZiAocmVhZF9kb25lIHx8CisJCSAgICBmdGFwZV9nZXRfYmFkX3NlY3Rvcl9lbnRyeShzZWdtZW50X2lkKSA9PSBFTVBUWV9TRUdNRU5UICkgeworCQkJLyogYnl0ZXNfcmVhZCA9IDA7ICBzaG91bGQgc3RpbGwgYmUgemVybyAqLworCQkJVFJBQ0VfRVhJVCBieXRlc19yZWFkOworCisJCX0KKwkJaWYgKHJldHJ5ID4gRlRfUkVUUklFU19PTl9FQ0NfRVJST1IpIHsKKwkJCWZ0X2hpc3RvcnkuZGVmZWN0cysrOworCQkJVFJBQ0VfQUJPUlQoLUVOT0RBVEEsIGZ0X3RfZXJyLAorCQkJCSAgICAidG9vIG1hbnkgcmV0cmllcyBvbiBlY2MgZmFpbHVyZSIpOworCQl9CisJCS8qICAgIE5vdyBhdCBsZWFzdCBvbmUgYnVmZmVyIGlzIGVtcHR5ICEKKwkJICogICAgUmVzdGFydCBydW5uZXIgJiB0YXBlIGlmIG5lZWRlZC4KKwkJICovCisJCVRSQUNFKGZ0X3RfYW55LCAiaGVhZDogJWQsIHRhaWw6ICVkLCBmdF9ydW5uZXJfc3RhdHVzOiAlZCIsCisJCSAgICAgIGZ0YXBlX2J1ZmZlcl9pZChmdF9xdWV1ZV9oZWFkKSwKKwkJICAgICAgZnRhcGVfYnVmZmVyX2lkKGZ0X3F1ZXVlX3RhaWwpLAorCQkgICAgICBmdF9ydW5uZXJfc3RhdHVzKTsKKwkJVFJBQ0UoZnRfdF9hbnksICJidWZmZXJbXS5zdGF0dXMsIFtoZWFkXTogJWQsIFt0YWlsXTogJWQiLAorCQkgICAgICBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpLT5zdGF0dXMsCisJCSAgICAgIGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfdGFpbCktPnN0YXR1cyk7CisJCXRhaWwgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOworCQlpZiAodGFpbC0+c3RhdHVzID09IHdhaXRpbmcpIHsKKwkJCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCisJCQlmdGFwZV9zZXR1cF9uZXdfc2VnbWVudChoZWFkLCBzZWdtZW50X2lkLCAtMSk7CisJCQlpZiAocmVhZF9tb2RlID09IEZUX1JEX1NJTkdMRSkgeworCQkJCS8qIGRpc2FibGUgcmVhZC1haGVhZCAqLworCQkJCWhlYWQtPm5leHRfc2VnbWVudCA9IDA7CisJCQl9CisJCQlmdGFwZV9jYWxjX25leHRfY2x1c3RlcihoZWFkKTsKKwkJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGlkbGUpIHsKKwkJCQlyZXN1bHQgPSBmdGFwZV9zdGFydF90YXBlKHNlZ21lbnRfaWQsCisJCQkJCQkJICBoZWFkLT5zZWN0b3Jfb2Zmc2V0KTsKKwkJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCQlUUkFDRV9BQk9SVChyZXN1bHQsIGZ0X3RfZXJyLCAiRXJyb3I6ICIKKwkJCQkJCSAgICAic2VnbWVudCAlZCB1bnJlYWNoYWJsZSIsCisJCQkJCQkgICAgc2VnbWVudF9pZCk7CisJCQkJfQorCQkJfQorCQkJaGVhZC0+c3RhdHVzID0gcmVhZGluZzsKKwkJCWZkY19zZXR1cF9yZWFkX3dyaXRlKGhlYWQsIEZEQ19SRUFEKTsKKwkJfQorCX0KKwkvKiBub3QgcmVhY2hlZCAqLworCVRSQUNFX0VYSVQgLUVJTzsKK30KKworaW50IGZ0YXBlX3JlYWRfaGVhZGVyX3NlZ21lbnQoX191OCAqYWRkcmVzcykKK3sKKwlpbnQgcmVzdWx0OworCWludCBoZWFkZXJfc2VnbWVudDsKKwlpbnQgZmlyc3RfZmFpbGVkID0gMDsKKwlpbnQgc3RhdHVzOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJZnRfdXNlZF9oZWFkZXJfc2VnbWVudCA9IC0xOworCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMoJnN0YXR1cyksKTsKKwlUUkFDRShmdF90X2Zsb3csICJyZWFkaW5nLi4uIik7CisJLyogIFdlJ3JlIGxvb2tpbmcgZm9yIHRoZSBmaXJzdCBoZWFkZXIgc2VnbWVudC4KKwkgKiAgQSBoZWFkZXIgc2VnbWVudCBjYW5ub3QgY29udGFpbiBiYWQgc2VjdG9ycywgdGhlcmVmb3IgYXQgdGhlCisJICogIHRhcGUgc3RhcnQsIHNlZ21lbnRzIHdpdGggYmFkIHNlY3RvcnMgYXJlIChhY2NvcmRpbmcgdG8gUUlDLTQwLzgwKQorCSAqICB3cml0dGVuIHdpdGggZGVsZXRlZCBkYXRhIG1hcmtzIGFuZCBtdXN0IGJlIHNraXBwZWQuCisJICovCisJbWVtc2V0KGFkZHJlc3MsICdcMCcsIChGVF9TRUNUT1JTX1BFUl9TRUdNRU5UIC0gMykgKiBGVF9TRUNUT1JfU0laRSk7IAorCXJlc3VsdCA9IDA7CisjZGVmaW5lIEhFQURFUl9TRUdNRU5UX0JPVU5EQVJZIDY4ICAvKiB3aHkgbm90IDQyPyAqLworCWZvciAoaGVhZGVyX3NlZ21lbnQgPSAwOworCSAgICAgaGVhZGVyX3NlZ21lbnQgPCBIRUFERVJfU0VHTUVOVF9CT1VOREFSWSAmJiByZXN1bHQgPT0gMDsKKwkgICAgICsraGVhZGVyX3NlZ21lbnQpIHsKKwkJLyogIFNldCBubyByZWFkLWFoZWFkLCB0aGUgaXNyIHdpbGwgZm9yY2UgcmVhZC1haGVhZCB3aGVuZXZlcgorCQkgKiAgaXQgZW5jb3VudGVycyBkZWxldGVkIGRhdGEgIQorCQkgKi8KKwkJcmVzdWx0ID0gZnRhcGVfcmVhZF9zZWdtZW50KGhlYWRlcl9zZWdtZW50LAorCQkJCQkgICAgYWRkcmVzcywKKwkJCQkJICAgIEZUX1JEX1NJTkdMRSk7CisJCWlmIChyZXN1bHQgPCAwICYmICFmaXJzdF9mYWlsZWQpIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiaGVhZGVyIHNlZ21lbnQgZGFtYWdlZCwgdHJ5aW5nIGJhY2t1cCIpOworCQkJZmlyc3RfZmFpbGVkID0gMTsKKwkJCXJlc3VsdCA9IDA7CS8qIGZvcmNlIHJlYWQgb2YgbmV4dCAoYmFja3VwKSBzZWdtZW50ICovCisJCX0KKwl9CisJaWYgKHJlc3VsdCA8IDAgfHwgaGVhZGVyX3NlZ21lbnQgPj0gSEVBREVSX1NFR01FTlRfQk9VTkRBUlkpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgIm5vIHJlYWRhYmxlIGhlYWRlciBzZWdtZW50IGZvdW5kIik7CisJfQorCVRSQUNFX0NBVENIKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpLCk7CisJZnRfdXNlZF9oZWFkZXJfc2VnbWVudCA9IGhlYWRlcl9zZWdtZW50OworCXJlc3VsdCA9IGZ0YXBlX2RlY29kZV9oZWFkZXJfc2VnbWVudChhZGRyZXNzKTsKKyAJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK2ludCBmdGFwZV9kZWNvZGVfaGVhZGVyX3NlZ21lbnQoX191OCAqYWRkcmVzcykKK3sKKwl1bnNpZ25lZCBpbnQgbWF4X2Zsb3BweV9zaWRlOworCXVuc2lnbmVkIGludCBtYXhfZmxvcHB5X3RyYWNrOworCXVuc2lnbmVkIGludCBtYXhfZmxvcHB5X3NlY3RvcjsKKwl1bnNpZ25lZCBpbnQgbmV3X3RhcGVfbGVuOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKEdFVDQoYWRkcmVzcywgRlRfU0lHTkFUVVJFKSA9PSBGVF9EMkdfTUFHSUMpIHsKKwkJLyogRGl0dG8gMkdCIGhlYWRlciBzZWdtZW50LiBUaGV5IGVuY3J5cHQgdGhlIGJhZCBzZWN0b3IgbWFwLgorCQkgKiBXZSBkZWNyeXB0IGl0IGFuZCBzdG9yZSB0aGVtIGluIG5vcm1hbCBmb3JtYXQuCisJCSAqIEkgaG9wZSB0aGlzIGlzIGNvcnJlY3QuCisJCSAqLworCQlpbnQgaTsKKwkJVFJBQ0UoZnRfdF93YXJuLAorCQkgICAgICAiRm91bmQgRGl0dG8gMkdCIHRhcGUsICIKKwkJICAgICAgInRyeWluZyB0byBkZWNyeXB0IGJhZCBzZWN0b3IgbWFwIik7CisJCWZvciAoaT0yNTY7IGkgPCAyOSAqIEZUX1NFQ1RPUl9TSVpFOyBpKyspIHsKKwkJCWFkZHJlc3NbaV0gPSB+KGFkZHJlc3NbaV0gLSAoaSYweGZmKSk7CisJCX0KKwkJUFVUNChhZGRyZXNzLCAwLEZUX0hTRUdfTUFHSUMpOworCX0gZWxzZSBpZiAoR0VUNChhZGRyZXNzLCBGVF9TSUdOQVRVUkUpICE9IEZUX0hTRUdfTUFHSUMpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgIndyb25nIHNpZ25hdHVyZSBpbiBoZWFkZXIgc2VnbWVudCIpOworCX0KKwlmdF9mb3JtYXRfY29kZSA9IChmdF9mb3JtYXRfdHlwZSkgYWRkcmVzc1tGVF9GTVRfQ09ERV07CisJaWYgKGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF9iaWcpIHsKKwkJZnRfaGVhZGVyX3NlZ21lbnRfMSAgID0gR0VUMihhZGRyZXNzLCBGVF9IU0VHXzEpOworCQlmdF9oZWFkZXJfc2VnbWVudF8yICAgPSBHRVQyKGFkZHJlc3MsIEZUX0hTRUdfMik7CisJCWZ0X2ZpcnN0X2RhdGFfc2VnbWVudCA9IEdFVDIoYWRkcmVzcywgRlRfRlJTVF9TRUcpOworCQlmdF9sYXN0X2RhdGFfc2VnbWVudCAgPSBHRVQyKGFkZHJlc3MsIEZUX0xBU1RfU0VHKTsKKwl9IGVsc2UgeworCQlmdF9oZWFkZXJfc2VnbWVudF8xICAgPSBHRVQ0KGFkZHJlc3MsIEZUXzZfSFNFR18xKTsKKwkJZnRfaGVhZGVyX3NlZ21lbnRfMiAgID0gR0VUNChhZGRyZXNzLCBGVF82X0hTRUdfMik7CisJCWZ0X2ZpcnN0X2RhdGFfc2VnbWVudCA9IEdFVDQoYWRkcmVzcywgRlRfNl9GUlNUX1NFRyk7CisJCWZ0X2xhc3RfZGF0YV9zZWdtZW50ICA9IEdFVDQoYWRkcmVzcywgRlRfNl9MQVNUX1NFRyk7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJmaXJzdCBkYXRhIHNlZ21lbnQ6ICVkIiwgZnRfZmlyc3RfZGF0YV9zZWdtZW50KTsKKwlUUkFDRShmdF90X25vaXNlLCAibGFzdCAgZGF0YSBzZWdtZW50OiAlZCIsIGZ0X2xhc3RfZGF0YV9zZWdtZW50KTsKKwlUUkFDRShmdF90X25vaXNlLCAiaGVhZGVyIHNlZ21lbnRzIGFyZSAlZCBhbmQgJWQiLAorCSAgICAgIGZ0X2hlYWRlcl9zZWdtZW50XzEsIGZ0X2hlYWRlcl9zZWdtZW50XzIpOworCisJLyogICAgVmVyaWZ5IHRhcGUgcGFyYW1ldGVycy4uLgorCSAqICAgIFFJQy00MC84MCBzcGVjOiAgICAgICAgICAgICAgICAgdGFwZV9wYXJhbWV0ZXJzOgorCSAqCisJICogICAgc2VnbWVudHMtcGVyLXRyYWNrICAgICAgICAgICAgICBzZWdtZW50c19wZXJfdHJhY2sKKwkgKiAgICB0cmFja3MtcGVyLWNhcnRyaWRnZSAgICAgICAgICAgIHRyYWNrc19wZXJfdGFwZQorCSAqICAgIG1heC1mbG9wcHktc2lkZSAgICAgICAgICAgICAgICAgKHNlZ21lbnRzX3Blcl90cmFjayAqCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja3NfcGVyX3RhcGUgLSAxKSAvCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGFwZV9zZWdtZW50c19wZXJfaGVhZAorCSAqICAgIG1heC1mbG9wcHktdHJhY2sgICAgICAgICAgICAgICAgZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQgLworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyIC0gMQorCSAqICAgIG1heC1mbG9wcHktc2VjdG9yICAgICAgICAgICAgICAgZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQKKwkgKi8KKwlmdF9zZWdtZW50c19wZXJfdHJhY2sgPSBHRVQyKGFkZHJlc3MsIEZUX1NQVCk7CisJZnRfdHJhY2tzX3Blcl90YXBlICAgID0gYWRkcmVzc1tGVF9UUENdOworCW1heF9mbG9wcHlfc2lkZSAgICAgICA9IGFkZHJlc3NbRlRfRkhNXTsKKwltYXhfZmxvcHB5X3RyYWNrICAgICAgPSBhZGRyZXNzW0ZUX0ZUTV07CisJbWF4X2Zsb3BweV9zZWN0b3IgICAgID0gYWRkcmVzc1tGVF9GU01dOworCVRSQUNFKGZ0X3Rfbm9pc2UsICIoZm10L3NwdC90cGMvZmhtL2Z0bS9mc20pID0gJWQvJWQvJWQvJWQvJWQvJWQiLAorCSAgICAgIGZ0X2Zvcm1hdF9jb2RlLCBmdF9zZWdtZW50c19wZXJfdHJhY2ssIGZ0X3RyYWNrc19wZXJfdGFwZSwKKwkgICAgICBtYXhfZmxvcHB5X3NpZGUsIG1heF9mbG9wcHlfdHJhY2ssIG1heF9mbG9wcHlfc2VjdG9yKTsKKwluZXdfdGFwZV9sZW4gPSBmdGFwZV90YXBlX2xlbjsKKwlzd2l0Y2ggKGZ0X2Zvcm1hdF9jb2RlKSB7CisJY2FzZSBmbXRfNDI1ZnQ6CisJCW5ld190YXBlX2xlbiA9IDQyNTsKKwkJYnJlYWs7CisJY2FzZSBmbXRfbm9ybWFsOgorCQlpZiAoZnRhcGVfdGFwZV9sZW4gPT0gMCkgewkvKiBvdGhlcndpc2UgMzA3IGZ0ICovCisJCQluZXdfdGFwZV9sZW4gPSAyMDU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBmbXRfMTEwMGZ0OgorCQluZXdfdGFwZV9sZW4gPSAxMTAwOworCQlicmVhazsKKwljYXNlIGZtdF92YXI6eworCQkJaW50IHNlZ21lbnRzX3Blcl8xMDAwX2luY2ggPSAxOwkJLyogbm9uLXplcm8gZGVmYXVsdCBmb3Igc3dpdGNoICovCisJCQlzd2l0Y2ggKGZ0X3FpY19zdGQpIHsKKwkJCWNhc2UgUUlDX1RBUEVfUUlDNDA6CisJCQkJc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDMzMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgUUlDX1RBUEVfUUlDODA6CisJCQkJc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDQ4ODsKKwkJCQlicmVhazsKKwkJCWNhc2UgUUlDX1RBUEVfUUlDMzAxMDoKKwkJCQlzZWdtZW50c19wZXJfMTAwMF9pbmNoID0gNzMwOworCQkJCWJyZWFrOworCQkJY2FzZSBRSUNfVEFQRV9RSUMzMDIwOgorCQkJCXNlZ21lbnRzX3Blcl8xMDAwX2luY2ggPSAxNDMwOworCQkJCWJyZWFrOworCQkJfQorCQkJbmV3X3RhcGVfbGVuID0gKDEwMDAgKiBmdF9zZWdtZW50c19wZXJfdHJhY2sgKworCQkJCQkoc2VnbWVudHNfcGVyXzEwMDBfaW5jaCAtIDEpKSAvIHNlZ21lbnRzX3Blcl8xMDAwX2luY2g7CisJCQlicmVhazsKKwkJfQorCWNhc2UgZm10X2JpZzp7CisJCQlpbnQgc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDE7CQkvKiBub24temVybyBkZWZhdWx0IGZvciBzd2l0Y2ggKi8KKwkJCXN3aXRjaCAoZnRfcWljX3N0ZCkgeworCQkJY2FzZSBRSUNfVEFQRV9RSUM0MDoKKwkJCQlzZWdtZW50c19wZXJfMTAwMF9pbmNoID0gMzMyOworCQkJCWJyZWFrOworCQkJY2FzZSBRSUNfVEFQRV9RSUM4MDoKKwkJCQlzZWdtZW50c19wZXJfMTAwMF9pbmNoID0gNDg4OworCQkJCWJyZWFrOworCQkJY2FzZSBRSUNfVEFQRV9RSUMzMDEwOgorCQkJCXNlZ21lbnRzX3Blcl8xMDAwX2luY2ggPSA3MzA7CisJCQkJYnJlYWs7CisJCQljYXNlIFFJQ19UQVBFX1FJQzMwMjA6CisJCQkJc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDE0MzA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfYnVnLAorCQkJIiV4IFFJQy1zdGFuZGFyZCB3aXRoIGZtdC1jb2RlICVkLCBwbGVhc2UgcmVwb3J0IiwKKwkJCQkJICAgIGZ0X3FpY19zdGQsIGZ0X2Zvcm1hdF9jb2RlKTsKKwkJCX0KKwkJCW5ld190YXBlX2xlbiA9ICgoMTAwMCAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjayArCisJCQkJCSAoc2VnbWVudHNfcGVyXzEwMDBfaW5jaCAtIDEpKSAvIAorCQkJCQlzZWdtZW50c19wZXJfMTAwMF9pbmNoKTsKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgInVua25vd24gdGFwZSBmb3JtYXQsIHBsZWFzZSByZXBvcnQgISIpOworCX0KKwlpZiAobmV3X3RhcGVfbGVuICE9IGZ0YXBlX3RhcGVfbGVuKSB7CisJCWZ0YXBlX3RhcGVfbGVuID0gbmV3X3RhcGVfbGVuOworCQlUUkFDRShmdF90X2luZm8sICJjYWxjdWxhdGVkIHRhcGUgbGVuZ3RoIGlzICVkIGZ0IiwKKwkJICAgICAgZnRhcGVfdGFwZV9sZW4pOworCQlmdGFwZV9jYWxjX3RpbWVvdXRzKGZ0X3FpY19zdGQsIGZ0X2RhdGFfcmF0ZSwgZnRhcGVfdGFwZV9sZW4pOworCX0KKwlpZiAoZnRfc2VnbWVudHNfcGVyX3RyYWNrID09IDAgJiYgZnRfdHJhY2tzX3Blcl90YXBlID09IDAgJiYKKwkgICAgbWF4X2Zsb3BweV9zaWRlID09IDAgJiYgbWF4X2Zsb3BweV90cmFjayA9PSAwICYmCisJICAgIG1heF9mbG9wcHlfc2VjdG9yID09IDApIHsKKwkJLyogIFFJQy00MCBSZXYgRSBhbmQgZWFybGllciBoYXMgbm8gdmFsdWVzIGluIHRoZSBoZWFkZXIuCisJCSAqLworCQlmdF9zZWdtZW50c19wZXJfdHJhY2sgPSA2ODsKKwkJZnRfdHJhY2tzX3Blcl90YXBlID0gMjA7CisJCW1heF9mbG9wcHlfc2lkZSA9IDE7CisJCW1heF9mbG9wcHlfdHJhY2sgPSAxNjk7CisJCW1heF9mbG9wcHlfc2VjdG9yID0gMTI4OworCX0KKwkvKiAgVGhpcyB0ZXN0IHdpbGwgY29tcGVuc2F0ZSBmb3IgdGhlIHdyb25nIHBhcmFtZXRlciBvbiB0YXBlcworCSAqICBmb3JtYXR0ZWQgYnkgQ29ubmVyIHNvZnR3YXJlLgorCSAqLworCWlmIChmdF9zZWdtZW50c19wZXJfdHJhY2sgPT0gMTUwICYmCisJICAgIGZ0X3RyYWNrc19wZXJfdGFwZSA9PSAyOCAmJgorCSAgICBtYXhfZmxvcHB5X3NpZGUgPT0gNyAmJgorCSAgICBtYXhfZmxvcHB5X3RyYWNrID09IDE0OSAmJgorCSAgICBtYXhfZmxvcHB5X3NlY3RvciA9PSAxMjgpIHsKK1RSQUNFKGZ0X3RfaW5mbywgInRoZSBmYW1vdXMgQ09OTkVSIGJ1ZzogbWF4X2Zsb3BweV9zaWRlIG9mZiBieSBvbmUgISIpOworCQltYXhfZmxvcHB5X3NpZGUgPSA2OworCX0KKwkvKiAgVGhlc2UgdGVzdHMgd2lsbCBjb21wZW5zYXRlIGZvciB0aGUgd3JvbmcgcGFyYW1ldGVyIG9uIHRhcGVzCisJICogIGZvcm1hdHRlZCBieSBDb21CeXRlIFdpbmRvd3Mgc29mdHdhcmUuCisJICoKKwkgKiAgRmlyc3QsIGZvciAyMDUgZm9vdCB0YXBlcworCSAqLworCWlmIChmdF9zZWdtZW50c19wZXJfdHJhY2sgPT0gMTAwICYmCisJICAgIGZ0X3RyYWNrc19wZXJfdGFwZSA9PSAyOCAmJgorCSAgICBtYXhfZmxvcHB5X3NpZGUgPT0gOSAmJgorCSAgICBtYXhfZmxvcHB5X3RyYWNrID09IDE0OSAmJgorCSAgICBtYXhfZmxvcHB5X3NlY3RvciA9PSAxMjgpIHsKK1RSQUNFKGZ0X3RfaW5mbywgInRoZSBDb21CeXRlIGJ1ZzogbWF4X2Zsb3BweV9zaWRlIGluY29ycmVjdCEiKTsKKwkJbWF4X2Zsb3BweV9zaWRlID0gNDsKKwl9CisJLyogTmV4dCwgZm9yIDMwNyBmb290IHRhcGVzLiAqLworCWlmIChmdF9zZWdtZW50c19wZXJfdHJhY2sgPT0gMTUwICYmCisJICAgIGZ0X3RyYWNrc19wZXJfdGFwZSA9PSAyOCAmJgorCSAgICBtYXhfZmxvcHB5X3NpZGUgPT0gOSAmJgorCSAgICBtYXhfZmxvcHB5X3RyYWNrID09IDE0OSAmJgorCSAgICBtYXhfZmxvcHB5X3NlY3RvciA9PSAxMjgpIHsKK1RSQUNFKGZ0X3RfaW5mbywgInRoZSBDb21CeXRlIGJ1ZzogbWF4X2Zsb3BweV9zaWRlIGluY29ycmVjdCEiKTsKKwkJbWF4X2Zsb3BweV9zaWRlID0gNjsKKwl9CisJLyogIFRoaXMgdGVzdCB3aWxsIGNvbXBlbnNhdGUgZm9yIHRoZSB3cm9uZyBwYXJhbWV0ZXIgb24gdGFwZXMKKwkgKiAgZm9ybWF0dGVkIGJ5IENvbG9yYWRvIFdpbmRvd3Mgc29mdHdhcmUuCisJICovCisJaWYgKGZ0X3NlZ21lbnRzX3Blcl90cmFjayA9PSAxNTAgJiYKKwkgICAgZnRfdHJhY2tzX3Blcl90YXBlID09IDI4ICYmCisJICAgIG1heF9mbG9wcHlfc2lkZSA9PSA2ICYmCisJICAgIG1heF9mbG9wcHlfdHJhY2sgPT0gMTUwICYmCisJICAgIG1heF9mbG9wcHlfc2VjdG9yID09IDEyOCkgeworVFJBQ0UoZnRfdF9pbmZvLCAidGhlIGZhbW91cyBDb2xvcmFkbyBidWc6IG1heF9mbG9wcHlfdHJhY2sgb2ZmIGJ5IG9uZSAhIik7CisJCW1heF9mbG9wcHlfdHJhY2sgPSAxNDk7CisJfQorCWZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkID0gKChtYXhfZmxvcHB5X3NlY3Rvci9GVF9TRUNUT1JTX1BFUl9TRUdNRU5UKSAqCisJCQkJICAgKG1heF9mbG9wcHlfdHJhY2sgKyAxKSk7CisJLyogIFRoaXMgdGVzdCB3aWxsIGNvbXBlbnNhdGUgZm9yIHNvbWUgYnVnIHJlcG9ydGVkIGJ5IERpbWEKKwkgKiAgQnJvZHNreS4gIFNlZW1zIHRvIGJlIGEgQ29sb3JhZG8gYnVnLCBlaXRoZXIuIChmcmVlYmVlCisJICogIEltYXRpb24gdGFwZSBzaGlwcGVkIHRvZ2V0aGVyIHdpdGggQ29sb3JhZG8gVDMwMDAKKwkgKi8KKwlpZiAoKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgJiYKKwkgICAgZnRfdHJhY2tzX3Blcl90YXBlID09IDUwICYmCisJICAgIG1heF9mbG9wcHlfc2lkZSA9PSA1NCAmJgorCSAgICBtYXhfZmxvcHB5X3RyYWNrID09IDI1NSAmJgorCSAgICBtYXhfZmxvcHB5X3NlY3RvciA9PSAxMjgpIHsKK1RSQUNFKGZ0X3RfaW5mbywgInRoZSBmYW1vdXMgPz8/IGJ1ZzogbWF4X2Zsb3BweV90cmFjayBvZmYgYnkgb25lICEiKTsKKwkJbWF4X2Zsb3BweV90cmFjayA9IDI1NDsKKwl9CisJLyoKKwkgKiAgICBWZXJpZnkgZHJpdmVfY29uZmlndXJhdGlvbiB3aXRoIHRhcGUgcGFyYW1ldGVycworCSAqLworCWlmIChmdGFwZV9zZWdtZW50c19wZXJfaGVhZCA9PSAwIHx8IGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciA9PSAwIHx8CisJICAoKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSAtIDEpIC8gZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQKKwkgICAhPSBtYXhfZmxvcHB5X3NpZGUpIHx8CisJICAgIChmdGFwZV9zZWdtZW50c19wZXJfaGVhZCAvIGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciAtIDEgIT0gbWF4X2Zsb3BweV90cmFjaykgfHwKKwkoZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyICogRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAhPSBtYXhfZmxvcHB5X3NlY3RvcikKKyNpZmRlZiBURVNUSU5HCisJICAgIHx8ICgoZnRfZm9ybWF0X2NvZGUgPT0gZm10X3ZhciB8fCBmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSAmJiAKKwkJKG1heF9mbG9wcHlfdHJhY2sgIT0gMjU0IHx8IG1heF9mbG9wcHlfc2VjdG9yICE9IDEyOCkpCisjZW5kaWYKKwkgICApIHsKKwkJY2hhciBzZWdwZXJoZWFkeiA9IGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkID8gJyAnIDogJz8nOworCQljaGFyIHNlZ3BlcmN5bHogID0gZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyID8gJyAnIDogJz8nOworCQlUUkFDRShmdF90X2VyciwiVGFwZSBwYXJhbWV0ZXJzIGluY29uc2lzdGVuY3ksIHBsZWFzZSByZXBvcnQiKTsKKwkJVFJBQ0UoZnRfdF9lcnIsICJyZXBvcnRlZCA9ICVkLyVkLyVkLyVkLyVkLyVkIiwKKwkJICAgICAgZnRfZm9ybWF0X2NvZGUsCisJCSAgICAgIGZ0X3NlZ21lbnRzX3Blcl90cmFjaywKKwkJICAgICAgZnRfdHJhY2tzX3Blcl90YXBlLAorCQkgICAgICBtYXhfZmxvcHB5X3NpZGUsCisJCSAgICAgIG1heF9mbG9wcHlfdHJhY2ssCisJCSAgICAgIG1heF9mbG9wcHlfc2VjdG9yKTsKKwkJVFJBQ0UoZnRfdF9lcnIsICJyZXF1aXJlZCA9ICVkLyVkLyVkLyVkJWMvJWQlYy8lZCIsCisJCSAgICAgIGZ0X2Zvcm1hdF9jb2RlLAorCQkgICAgICBmdF9zZWdtZW50c19wZXJfdHJhY2ssCisJCSAgICAgIGZ0X3RyYWNrc19wZXJfdGFwZSwKKwkJICAgICAgZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQgPworCQkgICAgICAoKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSAtMSkgLyAKKwkJICAgICAgIGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkICkgOgorCQkJKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSAtMSksCisJCQlzZWdwZXJoZWFkeiwKKwkJICAgICAgZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyID8KKwkJICAgICAgKGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkIC8gCisJCSAgICAgICBmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXIgLSAxICkgOgorCQkJZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQgLSAxLAorCQkJc2VncGVyY3lseiwKKwkJICAgICAgKGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciAqIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpKTsKKwkJVFJBQ0VfRVhJVCAtRUlPOworCX0KKwlmdGFwZV9leHRyYWN0X2JhZF9zZWN0b3JfbWFwKGFkZHJlc3MpOworIAlUUkFDRV9FWElUIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcmVhZC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjlmOTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJlYWQuaApAQCAtMCwwICsxLDUxIEBACisjaWZuZGVmIF9GVEFQRV9SRUFEX0gKKyNkZWZpbmUgX0ZUQVBFX1JFQURfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcmVhZC5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MjIgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlYWQgZnVuY3Rpb25zCisgKiAgICAgIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqLworCisvKiAgICAgIGZ0YXBlLXJlYWQuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJRlRfUkRfU0lOR0xFID0gMCwKKwlGVF9SRF9BSEVBRCAgPSAxLAorfSBmdF9yZWFkX21vZGVfdDsKKworZXh0ZXJuIGludCBmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KF9fdTggKmFkZHJlc3MpOworZXh0ZXJuIGludCBmdGFwZV9kZWNvZGVfaGVhZGVyX3NlZ21lbnQoX191OCAqYWRkcmVzcyk7CitleHRlcm4gaW50IGZ0YXBlX3JlYWRfc2VnbWVudF9mcmFjdGlvbihjb25zdCBpbnQgc2VnbWVudCwKKwkJCQkgICAgICAgdm9pZCAgKmFkZHJlc3MsIAorCQkJCSAgICAgICBjb25zdCBmdF9yZWFkX21vZGVfdCByZWFkX21vZGUsCisJCQkJICAgICAgIGNvbnN0IGludCBzdGFydCwKKwkJCQkgICAgICAgY29uc3QgaW50IHNpemUpOworI2RlZmluZSBmdGFwZV9yZWFkX3NlZ21lbnQoc2VnbWVudCwgYWRkcmVzcywgcmVhZF9tb2RlKQkJCVwKKwlmdGFwZV9yZWFkX3NlZ21lbnRfZnJhY3Rpb24oc2VnbWVudCwgYWRkcmVzcywgcmVhZF9tb2RlLAlcCisJCQkJICAgIDAsIEZUX1NFR01FTlRfU0laRSkKK2V4dGVybiB2b2lkIGZ0YXBlX3phcF9yZWFkX2J1ZmZlcnModm9pZCk7CisKKyNlbmRpZgkJCQkvKiBfRlRBUEVfUkVBRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ydy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDZkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuYwpAQCAtMCwwICsxLDEwOTIgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuYyx2ICQKKyAqICRSZXZpc2lvbjogMS43ICQKKyAqICREYXRlOiAxOTk3LzEwLzI4IDE0OjI2OjQ5ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGNvbW1vbiBjb2RlIGZvciB0aGUgc2VnbWVudCByZWFkIGFuZAorICogICAgICBzZWdtZW50IHdyaXRlIHJvdXRpbmVzIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yCisgKiAgICAgIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtZWNjLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnNtLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KK2ludCBmdF9ucl9idWZmZXJzOworYnVmZmVyX3N0cnVjdCAqZnRfYnVmZmVyW0ZUX01BWF9OUl9CVUZGRVJTXTsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgZnRfaGVhZDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgZnRfdGFpbDsJLyogbm90IHZvbGF0aWxlIGJ1dCBuZWVkIHNhbWUgdHlwZSBhcyBoZWFkICovCitpbnQgZmRjX3NldHVwX2Vycm9yOworbG9jYXRpb25fcmVjb3JkIGZ0X2xvY2F0aW9uID0gey0xLCAwfTsKK3ZvbGF0aWxlIGludCBmdGFwZV90YXBlX3J1bm5pbmc7CisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworc3RhdGljIGludCBvdmVycnVuX2NvdW50X29mZnNldDsKK3N0YXRpYyBpbnQgaW5oaWJpdF9jb3JyZWN0aW9uOworCisvKiAgbWF4bWltYWwgYWxsb3dlZCBvdmVyc2hvb3Qgd2hlbiBmYXN0IHNlZWtpbmcKKyAqLworI2RlZmluZSBPVkVSU0hPT1RfTElNSVQgMTAKKworLyogICAgICBJbmNyZW1lbnQgY3ljbGljIGJ1ZmZlciBuci4KKyAqLworYnVmZmVyX3N0cnVjdCAqZnRhcGVfbmV4dF9idWZmZXIoZnRfYnVmZmVyX3F1ZXVlX3QgcG9zKQoreworCXN3aXRjaCAocG9zKSB7CisJY2FzZSBmdF9xdWV1ZV9oZWFkOgorCQlpZiAoKytmdF9oZWFkID49IGZ0X25yX2J1ZmZlcnMpIHsKKwkJCWZ0X2hlYWQgPSAwOworCQl9CisJCXJldHVybiBmdF9idWZmZXJbZnRfaGVhZF07CisJY2FzZSBmdF9xdWV1ZV90YWlsOgorCQlpZiAoKytmdF90YWlsID49IGZ0X25yX2J1ZmZlcnMpIHsKKwkJCWZ0X3RhaWwgPSAwOworCQl9CisJCXJldHVybiBmdF9idWZmZXJbZnRfdGFpbF07CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQoraW50IGZ0YXBlX2J1ZmZlcl9pZChmdF9idWZmZXJfcXVldWVfdCBwb3MpCit7CisJc3dpdGNoKHBvcykgeworCWNhc2UgZnRfcXVldWVfaGVhZDogcmV0dXJuIGZ0X2hlYWQ7CisJY2FzZSBmdF9xdWV1ZV90YWlsOiByZXR1cm4gZnRfdGFpbDsKKwlkZWZhdWx0OiByZXR1cm4gLTE7CisJfQorfQorYnVmZmVyX3N0cnVjdCAqZnRhcGVfZ2V0X2J1ZmZlcihmdF9idWZmZXJfcXVldWVfdCBwb3MpCit7CisJc3dpdGNoKHBvcykgeworCWNhc2UgZnRfcXVldWVfaGVhZDogcmV0dXJuIGZ0X2J1ZmZlcltmdF9oZWFkXTsKKwljYXNlIGZ0X3F1ZXVlX3RhaWw6IHJldHVybiBmdF9idWZmZXJbZnRfdGFpbF07CisJZGVmYXVsdDogcmV0dXJuIE5VTEw7CisJfQorfQordm9pZCBmdGFwZV9yZXNldF9idWZmZXIodm9pZCkKK3sKKwlmdF9oZWFkID0gZnRfdGFpbCA9IDA7Cit9CisKK2J1ZmZlcl9zdGF0ZV9lbnVtIGZ0YXBlX3NldF9zdGF0ZShidWZmZXJfc3RhdGVfZW51bSBuZXdfc3RhdGUpCit7CisJYnVmZmVyX3N0YXRlX2VudW0gb2xkX3N0YXRlID0gZnRfZHJpdmVyX3N0YXRlOworCisJZnRfZHJpdmVyX3N0YXRlID0gbmV3X3N0YXRlOworCXJldHVybiBvbGRfc3RhdGU7Cit9CisvKiAgICAgIENhbGN1bGF0ZSBGbG9wcHkgRGlzayBDb250cm9sbGVyIGFuZCBETUEgcGFyYW1ldGVycyBmb3IgYSBzZWdtZW50LgorICogICAgICBoZWFkOiAgIHNlbGVjdHMgYnVmZmVyIHN0cnVjdCBpbiBhcnJheS4KKyAqICAgICAgb2Zmc2V0OiBudW1iZXIgb2YgcGh5c2ljYWwgc2VjdG9ycyB0byBza2lwIChpbmNsdWRpbmcgYmFkIG9uZXMpLgorICogICAgICBjb3VudDogIG51bWJlciBvZiBwaHlzaWNhbCBzZWN0b3JzIHRvIGhhbmRsZSAoaW5jbHVkaW5nIGJhZCBvbmVzKS4KKyAqLworc3RhdGljIGludCBzZXR1cF9zZWdtZW50KGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmLCAKKwkJCSBpbnQgc2VnbWVudF9pZCwKKwkJCSB1bnNpZ25lZCBpbnQgc2VjdG9yX29mZnNldCwgCisJCQkgdW5zaWduZWQgaW50IHNlY3Rvcl9jb3VudCwgCisJCQkgaW50IHJldHJ5KQoreworCVNlY3Rvck1hcCBvZmZzZXRfbWFzazsKKwlTZWN0b3JNYXAgbWFzazsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJYnVmZi0+c2VnbWVudF9pZCA9IHNlZ21lbnRfaWQ7CisJYnVmZi0+c2VjdG9yX29mZnNldCA9IHNlY3Rvcl9vZmZzZXQ7CisJYnVmZi0+cmVtYWluaW5nID0gc2VjdG9yX2NvdW50OworCWJ1ZmYtPmhlYWQgPSBzZWdtZW50X2lkIC8gZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQ7CisJYnVmZi0+Y3lsID0gKHNlZ21lbnRfaWQgJSBmdGFwZV9zZWdtZW50c19wZXJfaGVhZCkgLyBmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXI7CisJYnVmZi0+c2VjdCA9IChzZWdtZW50X2lkICUgZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyKSAqIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgKyAxOworCWJ1ZmYtPmRlbGV0ZWQgPSAwOworCW9mZnNldF9tYXNrID0gKDEgPDwgYnVmZi0+c2VjdG9yX29mZnNldCkgLSAxOworCW1hc2sgPSBmdGFwZV9nZXRfYmFkX3NlY3Rvcl9lbnRyeShzZWdtZW50X2lkKSAmIG9mZnNldF9tYXNrOworCXdoaWxlIChtYXNrKSB7CisJCWlmIChtYXNrICYgMSkgeworCQkJb2Zmc2V0X21hc2sgPj49IDE7CS8qIGRvbid0IGNvdW50IGJhZCBzZWN0b3IgKi8KKwkJfQorCQltYXNrID4+PSAxOworCX0KKwlidWZmLT5kYXRhX29mZnNldCA9IGNvdW50X29uZXMob2Zmc2V0X21hc2spOwkvKiBnb29kIHNlY3RvcnMgdG8gc2tpcCAqLworCWJ1ZmYtPnB0ciA9IGJ1ZmYtPmFkZHJlc3MgKyBidWZmLT5kYXRhX29mZnNldCAqIEZUX1NFQ1RPUl9TSVpFOworCVRSQUNFKGZ0X3RfZmxvdywgImRhdGEgb2Zmc2V0ID0gJWQgc2VjdG9ycyIsIGJ1ZmYtPmRhdGFfb2Zmc2V0KTsKKwlpZiAocmV0cnkpIHsKKwkJYnVmZi0+c29mdF9lcnJvcl9tYXAgJj0gb2Zmc2V0X21hc2s7CS8qIGtlZXAgc2tpcHBlZCBwYXJ0ICovCisJfSBlbHNlIHsKKwkJYnVmZi0+aGFyZF9lcnJvcl9tYXAgPSBidWZmLT5zb2Z0X2Vycm9yX21hcCA9IDA7CisJfQorCWJ1ZmYtPmJhZF9zZWN0b3JfbWFwID0gZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoYnVmZi0+c2VnbWVudF9pZCk7CisJaWYgKGJ1ZmYtPmJhZF9zZWN0b3JfbWFwICE9IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInNlZ21lbnQ6ICVkLCBiYWQgc2VjdG9yIG1hcDogJTA4bHgiLAorCQkJYnVmZi0+c2VnbWVudF9pZCwgKGxvbmcpYnVmZi0+YmFkX3NlY3Rvcl9tYXApOworCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3RfZmxvdywgInNlZ21lbnQ6ICVkIiwgYnVmZi0+c2VnbWVudF9pZCk7CisJfQorCWlmIChidWZmLT5zZWN0b3Jfb2Zmc2V0ID4gMCkgeworCQlidWZmLT5iYWRfc2VjdG9yX21hcCA+Pj0gYnVmZi0+c2VjdG9yX29mZnNldDsKKwl9CisJaWYgKGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgIT0gMCB8fCBidWZmLT5yZW1haW5pbmcgIT0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgeworCQlUUkFDRShmdF90X2Zsb3csICJzZWN0b3Igb2Zmc2V0ID0gJWQsIGNvdW50ID0gJWQiLAorCQkJYnVmZi0+c2VjdG9yX29mZnNldCwgYnVmZi0+cmVtYWluaW5nKTsKKwl9CisJLyogICAgU2VnbWVudHMgd2l0aCAzIG9yIGxlc3Mgc2VjdG9ycyBhcmUgbm90IHdyaXR0ZW4gd2l0aCB2YWxpZAorCSAqICAgIGRhdGEgYmVjYXVzZSB0aGVyZSBpcyBubyBzcGFjZSBsZWZ0IGZvciB0aGUgZWNjLiAgVGhlCisJICogICAgZGF0YSB3cml0dGVuIGlzIHdoYXRldmVyIGhhcHBlbnMgdG8gYmUgaW4gdGhlIGJ1ZmZlci4KKwkgKiAgICBSZWFkaW5nIHN1Y2ggYSBzZWdtZW50IHdpbGwgcmV0dXJuIGEgemVybyBieXRlLWNvdW50LgorCSAqICAgIFRvIGFsbG93IHVzIHRvIHJlYWQvd3JpdGUgc2VnbWVudHMgd2l0aCBhbGwgYmFkIHNlY3RvcnMKKwkgKiAgICB3ZSBmYWtlIG9uZSByZWFkYWJsZSBzZWN0b3IgaW4gdGhlIHNlZ21lbnQuIFRoaXMKKwkgKiAgICBwcmV2ZW50cyBoYXZpbmcgdG8gaGFuZGxlIHRoZXNlIHNlZ21lbnRzIGluIGEgdmVyeQorCSAqICAgIHNwZWNpYWwgd2F5LiAgSXQgaXMgbm90IGltcG9ydGFudCBpZiB0aGUgcmVhZGluZyBvZiB0aGlzCisJICogICAgYmFkIHNlY3RvciBmYWlscyBvciBub3QgKHRoZSBkYXRhIGlzIGlnbm9yZWQpLiBJdCBpcworCSAqICAgIG9ubHkgcmVhZCB0byBrZWVwIHRoZSBkcml2ZXIgcnVubmluZy4KKwkgKgorCSAqICAgIFRoZSBRSUMtNDAvODAgc3BlYy4gaGFzIG5vIGluZm9ybWF0aW9uIG9uIGhvdyB0byBoYW5kbGUKKwkgKiAgICB0aGlzIGNhc2UsIHNvIHRoaXMgaXMgbXkgaW50ZXJwcmV0YXRpb24uICAKKwkgKi8KKwlpZiAoYnVmZi0+YmFkX3NlY3Rvcl9tYXAgPT0gRU1QVFlfU0VHTUVOVCkgeworCQlUUkFDRShmdF90X2Zsb3csICJlbXB0eSBzZWdtZW50ICVkLCBmYWtlIGZpcnN0IHNlY3RvciBnb29kIiwKKwkJICAgICAgYnVmZi0+c2VnbWVudF9pZCk7CisJCWlmIChidWZmLT5wdHIgIT0gYnVmZi0+YWRkcmVzcykgeworCQkJVFJBQ0UoZnRfdF9idWcsICJUaGlzIGlzIGEgYnVnOiAlcC8lcCIsCisJCQkgICAgICBidWZmLT5wdHIsIGJ1ZmYtPmFkZHJlc3MpOworCQl9CisJCWJ1ZmYtPmJhZF9zZWN0b3JfbWFwID0gRkFLRV9TRUdNRU5UOworCX0KKwlmZGNfc2V0dXBfZXJyb3IgPSAwOworCWJ1ZmYtPm5leHRfc2VnbWVudCA9IHNlZ21lbnRfaWQgKyAxOworCVRSQUNFX0VYSVQgMDsKK30KKworLyogICAgICBDYWxjdWxhdGUgRmxvcHB5IERpc2sgQ29udHJvbGxlciBhbmQgRE1BIHBhcmFtZXRlcnMgZm9yIGEgbmV3IHNlZ21lbnQuCisgKi8KK2ludCBmdGFwZV9zZXR1cF9uZXdfc2VnbWVudChidWZmZXJfc3RydWN0ICogYnVmZiwgaW50IHNlZ21lbnRfaWQsIGludCBza2lwKQoreworCWludCByZXN1bHQgPSAwOworCXN0YXRpYyBpbnQgb2xkX3NlZ21lbnRfaWQgPSAtMTsKKwlzdGF0aWMgYnVmZmVyX3N0YXRlX2VudW0gb2xkX2Z0X2RyaXZlcl9zdGF0ZSA9IGlkbGU7CisJaW50IHJldHJ5ID0gMDsKKwl1bnNpZ25lZCBvZmZzZXQgPSAwOworCWludCBjb3VudCA9IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlUUkFDRShmdF90X2Zsb3csICIlcyBzZWdtZW50ICVkIChvbGQgPSAlZCkiLAorCSAgICAgIChmdF9kcml2ZXJfc3RhdGUgPT0gcmVhZGluZyB8fCBmdF9kcml2ZXJfc3RhdGUgPT0gdmVyaWZ5aW5nKSAKKwkgICAgICA/ICJyZWFkaW5nIiA6ICJ3cml0aW5nIiwKKwkgICAgICBzZWdtZW50X2lkLCBvbGRfc2VnbWVudF9pZCk7CisJaWYgKGZ0X2RyaXZlcl9zdGF0ZSAhPSBvbGRfZnRfZHJpdmVyX3N0YXRlKSB7CS8qIHdoZW4gdmVyaWZ5aW5nICovCisJCW9sZF9zZWdtZW50X2lkID0gLTE7CisJCW9sZF9mdF9kcml2ZXJfc3RhdGUgPSBmdF9kcml2ZXJfc3RhdGU7CisJfQorCWlmIChzZWdtZW50X2lkID09IG9sZF9zZWdtZW50X2lkKSB7CisJCSsrYnVmZi0+cmV0cnk7CisJCSsrZnRfaGlzdG9yeS5yZXRyaWVzOworCQlUUkFDRShmdF90X2Zsb3csICJzZXR0aW5nIHVwIGZvciByZXRyeSBuciAlZCIsIGJ1ZmYtPnJldHJ5KTsKKwkJcmV0cnkgPSAxOworCQlpZiAoc2tpcCAmJiBidWZmLT5za2lwID4gMCkgewkvKiBhbGxvdyBza2lwIG9uIHJldHJ5ICovCisJCQlvZmZzZXQgPSBidWZmLT5za2lwOworCQkJY291bnQgLT0gb2Zmc2V0OworCQkJVFJBQ0UoZnRfdF9mbG93LCAic2tpcHBpbmcgJWQgc2VjdG9ycyIsIG9mZnNldCk7CisJCX0KKwl9IGVsc2UgeworCQlidWZmLT5yZXRyeSA9IDA7CisJCWJ1ZmYtPnNraXAgPSAwOworCQlvbGRfc2VnbWVudF9pZCA9IHNlZ21lbnRfaWQ7CisJfQorCXJlc3VsdCA9IHNldHVwX3NlZ21lbnQoYnVmZiwgc2VnbWVudF9pZCwgb2Zmc2V0LCBjb3VudCwgcmV0cnkpOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKiAgICAgIERldGVybWluZSBzaXplIG9mIG5leHQgY2x1c3RlciBvZiBnb29kIHNlY3RvcnMuCisgKi8KK2ludCBmdGFwZV9jYWxjX25leHRfY2x1c3RlcihidWZmZXJfc3RydWN0ICogYnVmZikKK3sKKwkvKiBTa2lwIGJhZCBzZWN0b3JzLgorCSAqLworCXdoaWxlIChidWZmLT5yZW1haW5pbmcgPiAwICYmIChidWZmLT5iYWRfc2VjdG9yX21hcCAmIDEpICE9IDApIHsKKwkJYnVmZi0+YmFkX3NlY3Rvcl9tYXAgPj49IDE7CisJCSsrYnVmZi0+c2VjdG9yX29mZnNldDsKKwkJLS1idWZmLT5yZW1haW5pbmc7CisJfQorCS8qIEZpbmQgbmV4dCBjbHVzdGVyIG9mIGdvb2Qgc2VjdG9ycworCSAqLworCWlmIChidWZmLT5iYWRfc2VjdG9yX21hcCA9PSAwKSB7CS8qIHNwZWVkIHVwICovCisJCWJ1ZmYtPnNlY3Rvcl9jb3VudCA9IGJ1ZmYtPnJlbWFpbmluZzsKKwl9IGVsc2UgeworCQlTZWN0b3JNYXAgbWFwID0gYnVmZi0+YmFkX3NlY3Rvcl9tYXA7CisKKwkJYnVmZi0+c2VjdG9yX2NvdW50ID0gMDsKKwkJd2hpbGUgKGJ1ZmYtPnNlY3Rvcl9jb3VudCA8IGJ1ZmYtPnJlbWFpbmluZyAmJiAobWFwICYgMSkgPT0gMCkgeworCQkJKytidWZmLT5zZWN0b3JfY291bnQ7CisJCQltYXAgPj49IDE7CisJCX0KKwl9CisJcmV0dXJuIGJ1ZmYtPnNlY3Rvcl9jb3VudDsKK30KKworLyogIGlmIGp1c3QgcGFzc2VkIHRoZSBsYXN0IHNlZ21lbnQgb24gYSB0cmFjaywgd2FpdCBmb3IgQk9UCisgKiAgb3IgRU9UIG1hcmsuCisgKi8KK2ludCBmdGFwZV9oYW5kbGVfbG9naWNhbF9lb3Qodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGxvZ2ljYWxfZW90KSB7CisJCWludCBzdGF0dXM7CisKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInRhcGUgYXQgbG9naWNhbCBFT1QiKTsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnNlZWssICZzdGF0dXMpLCk7CisJCWlmICgoc3RhdHVzICYgKFFJQ19TVEFUVVNfQVRfQk9UIHwgUUlDX1NUQVRVU19BVF9FT1QpKSA9PSAwKSB7CisJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgImVvdC9ib3Qgbm90IHJlYWNoZWQiKTsKKwkJfQorCQlmdF9ydW5uZXJfc3RhdHVzID0gZW5kX29mX3RhcGU7CisJfQorCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGVuZF9vZl90YXBlKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJydW5uZXIgc3RvcHBlZCBiZWNhdXNlIG9mIGxvZ2ljYWwgRU9UIik7CisJCWZ0X3J1bm5lcl9zdGF0dXMgPSBpZGxlOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYm90X2VvdChpbnQgc3RhdHVzKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKHN0YXR1cyAmIChRSUNfU1RBVFVTX0FUX0JPVCB8IFFJQ19TVEFUVVNfQVRfRU9UKSkgeworCQlmdF9sb2NhdGlvbi5ib3QgPSAoKGZ0X2xvY2F0aW9uLnRyYWNrICYgMSkgPT0gMCA/CisJCQkJKHN0YXR1cyAmIFFJQ19TVEFUVVNfQVRfQk9UKSAhPSAwOgorCQkJCShzdGF0dXMgJiBRSUNfU1RBVFVTX0FUX0VPVCkgIT0gMCk7CisJCWZ0X2xvY2F0aW9uLmVvdCA9ICFmdF9sb2NhdGlvbi5ib3Q7CisJCWZ0X2xvY2F0aW9uLnNlZ21lbnQgPSAoZnRfbG9jYXRpb24udHJhY2sgKworCQkJKGZ0X2xvY2F0aW9uLmJvdCA/IDAgOiAxKSkgKiBmdF9zZWdtZW50c19wZXJfdHJhY2sgLSAxOworCQlmdF9sb2NhdGlvbi5zZWN0b3IgPSAtMTsKKwkJZnRfbG9jYXRpb24ua25vd24gID0gMTsKKwkJVFJBQ0UoZnRfdF9mbG93LCAidGFwZSBhdCBsb2dpY2FsICVzIiwKKwkJICAgICAgZnRfbG9jYXRpb24uYm90ID8gImJvdCIgOiAiZW90Iik7CisJCVRSQUNFKGZ0X3RfZmxvdywgInNlZ21lbnQgPSAlZCIsIGZ0X2xvY2F0aW9uLnNlZ21lbnQpOworCX0gZWxzZSB7CisJCWZ0X2xvY2F0aW9uLmtub3duID0gMDsKKwl9CisJVFJBQ0VfRVhJVCBmdF9sb2NhdGlvbi5rbm93bjsKK30KKworLyogICAgICBSZWFkIElkIG9mIGZpcnN0IHNlY3RvciBwYXNzaW5nIHRhcGUgaGVhZC4KKyAqLworc3RhdGljIGludCBmdGFwZV9yZWFkX2lkKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlfX3U4IG91dFsyXTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogQXNzdW1lIHRhcGUgaXMgcnVubmluZyBvbiBlbnRyeSwgYmUgYWJsZSB0byBoYW5kbGUKKwkgKiBzaXR1YXRpb24gd2hlcmUgaXQgc3RvcHBlZCBvciBpcyBzdG9wcGluZy4KKwkgKi8KKwlmdF9sb2NhdGlvbi5rbm93biA9IDA7CS8qIGRlZmF1bHQgaXMgbG9jYXRpb24gbm90IGtub3duICovCisJb3V0WzBdID0gRkRDX1JFQURJRDsKKwlvdXRbMV0gPSBmdF9kcml2ZV9zZWw7CisJVFJBQ0VfQ0FUQ0goZmRjX2NvbW1hbmQob3V0LCAyKSwpOworCXN3aXRjaCAoZmRjX2ludGVycnVwdF93YWl0KDIwICogRlRfU0VDT05EKSkgeworCWNhc2UgMDoKKwkJaWYgKGZkY19zZWN0ID09IDApIHsKKwkJCWlmIChmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKCZzdGF0dXMpID49IDAgJiYKKwkJCSAgICAoc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkpIHsKKwkJCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCQkJCVRSQUNFKGZ0X3RfZmxvdywgInRhcGUgaGFzIHN0b3BwZWQiKTsKKwkJCQljaGVja19ib3RfZW90KHN0YXR1cyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmdF9sb2NhdGlvbi5rbm93biA9IDE7CisJCQlmdF9sb2NhdGlvbi5zZWdtZW50ID0gKGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkCisJCQkJCSAgICAgICAqIGZkY19oZWFkCisJCQkJCSAgICAgICArIGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlcgorCQkJCQkgICAgICAgKiBmZGNfY3lsCisJCQkJCSAgICAgICArIChmZGNfc2VjdCAtIDEpCisJCQkJCSAgICAgICAvIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpOworCQkJZnRfbG9jYXRpb24uc2VjdG9yID0gKChmZGNfc2VjdCAtIDEpCisJCQkJCSAgICAgICUgRlRfU0VDVE9SU19QRVJfU0VHTUVOVCk7CisJCQlmdF9sb2NhdGlvbi5lb3QgPSBmdF9sb2NhdGlvbi5ib3QgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgLUVUSU1FOgorCQkvKiAgRGlkbid0IGZpbmQgaWQgb24gdGFwZSwgbXVzdCBiZSBuZWFyIGVuZDogV2FpdAorCQkgKiAgdW50aWwgc3RvcHBlZC4KKwkJICovCisJCWlmIChmdGFwZV9yZWFkeV93YWl0KEZUX0ZPUkVWRVIsICZzdGF0dXMpID49IDApIHsKKwkJCWZ0YXBlX3RhcGVfcnVubmluZyA9IDA7CisJCQlUUkFDRShmdF90X2Zsb3csICJ0YXBlIGhhcyBzdG9wcGVkIik7CisJCQljaGVja19ib3RfZW90KHN0YXR1cyk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogIEludGVycnVwdGVkIG9yIG90aGVyd2lzZSBmYWlsaW5nCisJCSAqICBmZGNfaW50ZXJydXB0X3dhaXQoKSAKKwkJICovCisJCVRSQUNFKGZ0X3RfZXJyLCAiZmRjX2ludGVycnVwdF93YWl0IGZhaWxlZCIpOworCQlicmVhazsKKwl9CisJaWYgKCFmdF9sb2NhdGlvbi5rbm93bikgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2Zsb3csICJubyBpZCBmb3VuZCIpOworCX0KKwlpZiAoZnRfbG9jYXRpb24uc2VjdG9yID09IDApIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAicGFzc2luZyBzZWdtZW50ICVkLyVkIiwKKwkJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yKTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X2ZkY19kbWEsICJwYXNzaW5nIHNlZ21lbnQgJWQvJWQiLAorCQkgICAgICBmdF9sb2NhdGlvbi5zZWdtZW50LCBmdF9sb2NhdGlvbi5zZWN0b3IpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgbG9naWNhbF9mb3J3YXJkKHZvaWQpCit7CisJZnRhcGVfdGFwZV9ydW5uaW5nID0gMTsKKwlyZXR1cm4gZnRhcGVfY29tbWFuZChRSUNfTE9HSUNBTF9GT1JXQVJEKTsKK30KKworaW50IGZ0YXBlX3N0b3BfdGFwZShpbnQgKnBzdGF0dXMpCit7CisJaW50IHJldHJ5ID0gMDsKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJZG8geworCQlyZXN1bHQgPSBmdGFwZV9jb21tYW5kX3dhaXQoUUlDX1NUT1BfVEFQRSwKKwkJCQkJICAgIGZ0YXBlX3RpbWVvdXQuc3RvcCwgcHN0YXR1cyk7CisJCWlmIChyZXN1bHQgPT0gMCkgeworCQkJaWYgKCgqcHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpID09IDApIHsKKwkJCQlyZXN1bHQgPSAtRUlPOworCQkJfSBlbHNlIHsKKwkJCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCQkJfQorCQl9CisJfSB3aGlsZSAocmVzdWx0IDwgMCAmJiArK3JldHJ5IDw9IDMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCVRSQUNFKGZ0X3RfZXJyLCAiZmFpbGVkICEgKGZhdGFsKSIpOworCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworaW50IGZ0YXBlX2R1bWJfc3RvcCh2b2lkKQoreworCWludCByZXN1bHQ7CisJaW50IHN0YXR1czsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCS8qICBBYm9ydCBjdXJyZW50IGZkYyBvcGVyYXRpb24gaWYgaXQncyBidXN5IChwcm9iYWJseSByZWFkCisJICogIG9yIHdyaXRlIG9wZXJhdGlvbiBwZW5kaW5nKSB3aXRoIGEgcmVzZXQuCisJICovCisJaWYgKGZkY19yZWFkeV93YWl0KDEwMCAvKiB1c2VjICovKSA8IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImFib3J0aW5nIGZkYyBvcGVyYXRpb24iKTsKKwkJZmRjX3Jlc2V0KCk7CisJfQorCS8qICBSZWFkaW5nIGlkJ3MgYWZ0ZXIgdGhlIGxhc3Qgc2VnbWVudCBvbiBhIHRyYWNrIG1heSBmYWlsCisJICogIGJ1dCBldmVudHVhbGx5IHRoZSBkcml2ZSB3aWxsIGJlY29tZSByZWFkeSAobG9naWNhbCBlb3QpLgorCSAqLworCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMoJnN0YXR1cyk7CisJZnRfbG9jYXRpb24ua25vd24gPSAwOworCWRvIHsKKwkJaWYgKHJlc3VsdCA9PSAwICYmIHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpIHsKKwkJCS8qIFRhcGUgaXMgbm90IHJ1bm5pbmcgYW55IG1vcmUuCisJCQkgKi8KKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0YXBlIGFscmVhZHkgaGFsdGVkIik7CisJCQljaGVja19ib3RfZW90KHN0YXR1cyk7CisJCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCQl9IGVsc2UgaWYgKGZ0YXBlX3RhcGVfcnVubmluZykgeworCQkJLyogIFRhcGUgaXMgKHdhcykgc3RpbGwgbW92aW5nLgorCQkJICovCisjaWZkZWYgVEVTVElORworCQkJZnRhcGVfcmVhZF9pZCgpOworI2VuZGlmCisJCQlyZXN1bHQgPSBmdGFwZV9zdG9wX3RhcGUoJnN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQkvKiAgVGFwZSBub3QgeWV0IHJlYWR5IGJ1dCBzdG9wcGVkLgorCQkJICovCisJCQlyZXN1bHQgPSBmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQucGF1c2UsJnN0YXR1cyk7CisJCX0KKwl9IHdoaWxlIChmdGFwZV90YXBlX3J1bm5pbmcKKwkJICYmICEoc2lndGVzdHNldG1hc2soJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBfTkVWRVJfQkxPQ0spKSk7CisjaWZuZGVmIFRFU1RJTkcKKwlmdF9sb2NhdGlvbi5rbm93biA9IDA7CisjZW5kaWYKKwlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBhYm9ydGluZyB8fCBmdF9ydW5uZXJfc3RhdHVzID09IGRvX2Fib3J0KSB7CisJCWZ0X3J1bm5lcl9zdGF0dXMgPSBpZGxlOworCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogICAgICBXYWl0IHVudGlsIHJ1bm5lciBoYXMgZmluaXNoZWQgdGFpbCBidWZmZXIuCisgKgorICovCitpbnQgZnRhcGVfd2FpdF9zZWdtZW50KGJ1ZmZlcl9zdGF0ZV9lbnVtIHN0YXRlKQoreworCWludCBzdGF0dXM7CisJaW50IHJlc3VsdCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwl3aGlsZSAoZnRfYnVmZmVyW2Z0X3RhaWxdLT5zdGF0dXMgPT0gc3RhdGUpIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAic3RhdGU6ICVkIiwgZnRfYnVmZmVyW2Z0X3RhaWxdLT5zdGF0dXMpOworCQkvKiAgRmlyc3QgYnVmZmVyIHN0aWxsIGJlaW5nIHdvcmtlZCBvbiwgd2FpdCB1cCB0byB0aW1lb3V0LgorCQkgKgorCQkgKiAgTm90ZTogd2UgY2hlY2sgdHdvIHRpbWVzIGZvciBiZWluZyBraWxsZWQuIDUwCisJCSAqICBzZWNvbmRzIGFyZSBxdWl0ZSBsb25nLiBOb3RlIHRoYXQKKwkJICogIGZkY19pbnRlcnJ1cHRfd2FpdCgpIGlzIG5vdCBraWxsYWJsZSBieSBhbnkKKwkJICogIG1lYW5zLiBmdGFwZV9yZWFkX3NlZ21lbnQoKSB3YW50cyB1cyB0byByZXR1cm4KKwkJICogIC1FSU5UUiBpbiBjYXNlIG9mIGEgc2lnbmFsLiAgCisJCSAqLworCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCXJlc3VsdCA9IGZkY19pbnRlcnJ1cHRfd2FpdCg1MCAqIEZUX1NFQ09ORCk7CisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCVRSQUNFX0FCT1JUKHJlc3VsdCwKKwkJCQkgICAgZnRfdF9lcnIsICJmZGNfaW50ZXJydXB0X3dhaXQgZmFpbGVkIik7CisJCX0KKwkJaWYgKGZkY19zZXR1cF9lcnJvcikgeworCQkJLyogcmVjb3Zlci4uLiBGSVhNRSAqLworCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJzZXR1cCBlcnJvciIpOworCQl9CisJfQorCWlmIChmdF9idWZmZXJbZnRfdGFpbF0tPnN0YXR1cyAhPSBlcnJvcikgeworCQlUUkFDRV9FWElUIDA7CisJfQorCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMoJnN0YXR1cyksKTsKKwlUUkFDRShmdF90X25vaXNlLCAiZnRhcGVfcmVwb3J0X2RyaXZlX3N0YXR1czogMHglMDJ4Iiwgc3RhdHVzKTsKKwlpZiAoKHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpICYmIAorCSAgICAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikpIHsKKwkJdW5zaWduZWQgaW50IGVycm9yOworCQlxaWMxMTdfY21kX3QgY29tbWFuZDsKKwkJCisJCS8qICBSZXBvcnQgYW5kIGNsZWFyIGVycm9yIHN0YXRlLgorCQkgKiAgSW4gY2FzZSB0aGUgZHJpdmUgY2FuJ3Qgb3BlcmF0ZSBhdCB0aGUgc2VsZWN0ZWQKKwkJICogIHJhdGUsIHNlbGVjdCB0aGUgbmV4dCBsb3dlciBkYXRhIHJhdGUuCisJCSAqLworCQlmdGFwZV9yZXBvcnRfZXJyb3IoJmVycm9yLCAmY29tbWFuZCwgMSk7CisJCWlmIChlcnJvciA9PSAzMSAmJiBjb21tYW5kID09IFFJQ19MT0dJQ0FMX0ZPUldBUkQpIHsKKwkJCS8qIGRyaXZlIGRvZXMgbm90IGFjY2VwdCB0aGlzIGRhdGEgcmF0ZSAqLworCQkJaWYgKGZ0X2RhdGFfcmF0ZSA+IDI1MCkgeworCQkJCVRSQUNFKGZ0X3RfaW5mbywKKwkJCQkgICAgICAiUHJvYmFibGUgZGF0YSByYXRlIGNvbmZsaWN0Iik7CisJCQkJVFJBQ0UoZnRfdF9pbmZvLAorCQkJCSAgICAgICJMb3dlcmluZyBkYXRhIHJhdGUgdG8gJWQgS2JwcyIsCisJCQkJICAgICAgZnRfZGF0YV9yYXRlIC8gMik7CisJCQkJZnRhcGVfaGFsZl9kYXRhX3JhdGUoKTsKKwkJCQlpZiAoZnRfYnVmZmVyW2Z0X3RhaWxdLT5yZXRyeSA+IDApIHsKKwkJCQkJLyogZ2l2ZSBpdCBhIGNoYW5jZSAqLworCQkJCQktLWZ0X2J1ZmZlcltmdF90YWlsXS0+cmV0cnk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBubyByYXRlIGlzIGFjY2VwdGVkLi4uICovCisJCQkJVFJBQ0UoZnRfdF9lcnIsICJXZSdyZSBkZWFkIDooIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X2VyciwgIlVua25vd24gZXJyb3IiKTsKKwkJfQorCQlUUkFDRV9FWElUIC1FSU87ICAgLyogZy5wLiBlcnJvciAqLworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qIGZvcndhcmQgKi8gc3RhdGljIGludCBzZWVrX2ZvcndhcmQoaW50IHNlZ21lbnRfaWQsIGludCBmYXN0KTsKKworc3RhdGljIGludCBmYXN0X3NlZWsoaW50IGNvdW50LCBpbnQgcmV2ZXJzZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgc3RhdHVzOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKGNvdW50ID4gMCkgeworCQkvKiAgSWYgcG9zaXRpb25lZCBhdCBiZWdpbiBvciBlbmQgb2YgdGFwZSwgZmFzdCBzZWVraW5nIG5lZWRzCisJCSAqICBzcGVjaWFsIHRyZWF0bWVudC4KKwkJICogIFN0YXJ0aW5nIGZyb20gbG9naWNhbCBib3QgbmVlZHMgYSAoc2xvdykgc2VlayB0byB0aGUgZmlyc3QKKwkJICogIHNlZ21lbnQgYmVmb3JlIHRoZSBoaWdoIHNwZWVkIHNlZWsuIE1vc3QgZHJpdmVzIGRvIHRoaXMKKwkJICogIGF1dG9tYXRpY2FsbHkgYnV0IHNvbWUgb2xkZXIgZG9uJ3QsIHNvIHdlIHRyZWF0IHRoZW0KKwkJICogIGFsbCB0aGUgc2FtZS4KKwkJICogIFN0YXJ0aW5nIGZyb20gbG9naWNhbCBlb3QgaXMgZXZlbiBtb3JlIGRpZmZpY3VsdCBiZWNhdXNlCisJCSAqICB3ZSBjYW5ub3QgKHNsb3cpIHJldmVyc2Ugc2VlayB0byB0aGUgbGFzdCBzZWdtZW50LgorCQkgKiAgVE8gQkUgSU1QTEVNRU5URUQuCisJCSAqLworCQlpbmhpYml0X2NvcnJlY3Rpb24gPSAwOworCQlpZiAoZnRfbG9jYXRpb24ua25vd24gJiYKKwkJICAgICgoZnRfbG9jYXRpb24uYm90ICYmICFyZXZlcnNlKSB8fAorCQkgICAgIChmdF9sb2NhdGlvbi5lb3QgJiYgcmV2ZXJzZSkpKSB7CisJCQlpZiAoIXJldmVyc2UpIHsKKwkJCQkvKiAgKHNsb3cpIHNraXAgdG8gZmlyc3Qgc2VnbWVudCBvbiBhIHRyYWNrCisJCQkJICovCisJCQkJc2Vla19mb3J3YXJkKGZ0X2xvY2F0aW9uLnRyYWNrICogZnRfc2VnbWVudHNfcGVyX3RyYWNrLCAwKTsKKwkJCQktLWNvdW50OworCQkJfSBlbHNlIHsKKwkJCQkvKiAgV2hlbiBzZWVraW5nIGJhY2t3YXJkcyBmcm9tCisJCQkJICogIGVuZC1vZi10YXBlIHRoZSBudW1iZXIgb2YgZXJhc2VkCisJCQkJICogIGdhcHMgZm91bmQgc2VlbXMgdG8gYmUgaGlnaGVyIHRoYW4KKwkJCQkgKiAgZXhwZWN0ZWQuICBUaGVyZWZvciB0aGUgZHJpdmUgbXVzdAorCQkJCSAqICBza2lwIHNvbWUgbW9yZSBzZWdtZW50cyB0aGFuCisJCQkJICogIGNhbGN1bGF0ZWQsIGJ1dCB3ZSBkb24ndCBrbm93IGhvdworCQkJCSAqICBtYW55LiAgVGh1cyB3ZSB3aWxsIHByZXZlbnQgdGhlCisJCQkJICogIHJlLWNhbGN1bGF0aW9uIG9mIG9mZnNldCBhbmQKKwkJCQkgKiAgb3ZlcnNob290IHdoZW4gc2Vla2luZyBiYWNrd2FyZHMuCisJCQkJICovCisJCQkJaW5oaWJpdF9jb3JyZWN0aW9uID0gMTsKKwkJCQljb3VudCArPSAzOwkvKiBiZXN0IGd1ZXNzICovCisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlUUkFDRShmdF90X2Zsb3csICJ3YXJuaW5nOiB6ZXJvIG9yIG5lZ2F0aXZlIGNvdW50OiAlZCIsIGNvdW50KTsKKwl9CisJaWYgKGNvdW50ID4gMCkgeworCQlpbnQgaTsKKwkJaW50IG5pYmJsZXMgPSBjb3VudCA+IDI1NSA/IDMgOiAyOworCisJCWlmIChjb3VudCA+IDQwOTUpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJza2lwcGluZyBjbGlwcGVkIGF0IDQwOTUgc2VnbWVudCIpOworCQkJY291bnQgPSA0MDk1OworCQl9CisJCS8qIElzc3VlIHRoaXMgdGFwZSBjb21tYW5kIGZpcnN0LiAqLworCQlpZiAoIXJldmVyc2UpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJza2lwcGluZyAlZCBzZWdtZW50KHMpIiwgY291bnQpOworCQkJcmVzdWx0ID0gZnRhcGVfY29tbWFuZChuaWJibGVzID09IDMgPworCQkJICAgUUlDX1NLSVBfRVhURU5ERURfRk9SV0FSRCA6IFFJQ19TS0lQX0ZPUldBUkQpOworCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImJhY2tpbmcgdXAgJWQgc2VnbWVudChzKSIsIGNvdW50KTsKKwkJCXJlc3VsdCA9IGZ0YXBlX2NvbW1hbmQobmliYmxlcyA9PSAzID8KKwkJCSAgIFFJQ19TS0lQX0VYVEVOREVEX1JFVkVSU0UgOiBRSUNfU0tJUF9SRVZFUlNFKTsKKwkJfQorCQlpZiAocmVzdWx0IDwgMCkgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIlNraXAgY29tbWFuZCBmYWlsZWQiKTsKKwkJfSBlbHNlIHsKKwkJCS0tY291bnQ7CS8qIDAgbWVhbnMgb25lIGdhcCBldGMuICovCisJCQlmb3IgKGkgPSAwOyBpIDwgbmliYmxlczsgKytpKSB7CisJCQkJaWYgKHJlc3VsdCA+PSAwKSB7CisJCQkJCXJlc3VsdCA9IGZ0YXBlX3BhcmFtZXRlcihjb3VudCAmIDE1KTsKKwkJCQkJY291bnQgLz0gMTY7CisJCQkJfQorCQkJfQorCQkJcmVzdWx0ID0gZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnJld2luZCwgJnN0YXR1cyk7CisJCQlpZiAocmVzdWx0ID49IDApIHsKKwkJCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCQkJfQorCQl9CisJfQorCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlKGludCBpZCkKK3sKKwkvKiBDaGVjayB0byBzZWUgaWYgcG9zaXRpb24gZm91bmQgaXMgb2ZmLXRyYWNrIGFzIHJlcG9ydGVkCisJICogIG9uY2UuICBCZWNhdXNlIGFsbCB0cmFja3MgaW4gb25lIGRpcmVjdGlvbiBsaWUgbmV4dCB0bworCSAqICBlYWNoIG90aGVyLCBpZiBvZmYtdHJhY2sgdGhlIGVycm9yIHdpbGwgYmUgYXBwcm94aW1hdGVseQorCSAqICAyICogZnRfc2VnbWVudHNfcGVyX3RyYWNrLgorCSAqLworCWlmIChmdF9sb2NhdGlvbi50cmFjayA9PSAtMSkgeworCQlyZXR1cm4gMTsgLyogdW5mb3JzZWVuIHNpdHVhdGlvbiwgZG9uJ3QgZ2VuZXJhdGUgZXJyb3IgKi8KKwl9IGVsc2UgeworCQkvKiBVc2UgbWFyZ2luIG9mIGZ0X3NlZ21lbnRzX3Blcl90cmFjayBvbiBib3RoIHNpZGVzCisJCSAqIGJlY2F1c2UgZnRhcGUgbmVlZHMgc29tZSBtYXJnaW4gYW5kIHRoZSBlcnJvciB3ZSdyZQorCQkgKiBsb29raW5nIGZvciBpcyBtdWNoIGxhcmdlciAhCisJCSAqLworCQlpbnQgbG8gPSAoZnRfbG9jYXRpb24udHJhY2sgLSAxKSAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjazsKKwkJaW50IGhpID0gKGZ0X2xvY2F0aW9uLnRyYWNrICsgMikgKiBmdF9zZWdtZW50c19wZXJfdHJhY2s7CisKKwkJcmV0dXJuIChpZCA+PSBsbyAmJiBpZCA8IGhpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2Vla19mb3J3YXJkKGludCBzZWdtZW50X2lkLCBpbnQgZmFzdCkKK3sKKwlpbnQgZmFpbHVyZXMgPSAwOworCWludCBjb3VudDsKKwlzdGF0aWMgaW50IG1hcmdpbiA9IDE7CS8qIGZpeGVkOiBzdG9wIHRoaXMgYmVmb3JlIHRhcmdldCAqLworCXN0YXRpYyBpbnQgb3ZlcnNob290ID0gMTsKKwlzdGF0aWMgaW50IG1pbl9jb3VudCA9IDg7CisJaW50IGV4cGVjdGVkID0gLTE7CisJaW50IHRhcmdldCA9IHNlZ21lbnRfaWQgLSBtYXJnaW47CisJaW50IGZhc3Rfc2Vla2luZzsKKwlpbnQgcHJldl9zZWdtZW50ID0gZnRfbG9jYXRpb24uc2VnbWVudDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICghZnRfbG9jYXRpb24ua25vd24pIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgImZhdGFsOiBjYW5ub3Qgc2VlayBmcm9tIHVua25vd24gbG9jYXRpb24iKTsKKwl9CisJaWYgKCF2YWxpZGF0ZShzZWdtZW50X2lkKSkgeworCQlmdGFwZV9zbGVlcCgxICogRlRfU0VDT05EKTsKKwkJZnRfZmFpbHVyZSA9IDE7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJmYXRhbDogaGVhZCBvZmYgdHJhY2sgKGJhZCBoYXJkd2FyZT8pIik7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJmcm9tICVkLyVkIHRvICVkLzAgLSAlZCIsCisJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yLHNlZ21lbnRfaWQsbWFyZ2luKTsKKwljb3VudCA9IHRhcmdldCAtIGZ0X2xvY2F0aW9uLnNlZ21lbnQgLSBvdmVyc2hvb3Q7CisJZmFzdF9zZWVraW5nID0gKGZhc3QgJiYKKwkJCWNvdW50ID4gKG1pbl9jb3VudCArIChmdF9sb2NhdGlvbi5ib3QgPyAxIDogMCkpKTsKKwlpZiAoZmFzdF9zZWVraW5nKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJmYXN0IHNraXBwaW5nICVkIHNlZ21lbnRzIiwgY291bnQpOworCQlleHBlY3RlZCA9IHNlZ21lbnRfaWQgLSBtYXJnaW47CisJCWZhc3Rfc2Vlayhjb3VudCwgMCk7CisJfQorCWlmICghZnRhcGVfdGFwZV9ydW5uaW5nKSB7CisJCWxvZ2ljYWxfZm9yd2FyZCgpOworCX0KKwl3aGlsZSAoZnRfbG9jYXRpb24uc2VnbWVudCA8IHNlZ21lbnRfaWQpIHsKKwkJLyogIFRoaXMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHNlY3RvciBpbiBhIChiYWQpIHNlZ21lbnQgdG8KKwkJICogIGhhdmUgYSB2YWxpZCBhbmQgcmVhZGFibGUgc2VjdG9yIGlkICEKKwkJICogIEl0IGxvb2tzIGxpa2UgdGhpcyBpcyBub3QgZ3VhcmFudGVlZCwgc28gd2UgbXVzdCB0cnkKKwkJICogIHRvIGZpbmQgYSB3YXkgdG8gc2tpcCBhbiBFTVBUWV9TRUdNRU5ULiAhISEgRklYTUUgISEhCisJCSAqLworCQlpZiAoZnRhcGVfcmVhZF9pZCgpIDwgMCB8fCAhZnRfbG9jYXRpb24ua25vd24gfHwKKwkJICAgIHNpZ3Rlc3RzZXRtYXNrKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgX0RPTlRfQkxPQ0spKSB7CisJCQlmdF9sb2NhdGlvbi5rbm93biA9IDA7CisJCQlpZiAoIWZ0YXBlX3RhcGVfcnVubmluZyB8fAorCQkJICAgICsrZmFpbHVyZXMgPiBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKSB7CisJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkJCSAgICAicmVhZF9pZCBmYWlsZWQgY29tcGxldGVseSIpOworCQkJfQorCQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQkJVFJBQ0UoZnRfdF9mbG93LCAicmVhZF9pZCBmYWlsZWQsIHJldHJ5ICglZCkiLAorCQkJICAgICAgZmFpbHVyZXMpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGZhc3Rfc2Vla2luZykgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImVuZGVkIGF0ICVkLyVkICglZCwlZCkiLAorCQkJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yLAorCQkJICAgICAgb3ZlcnNob290LCBpbmhpYml0X2NvcnJlY3Rpb24pOworCQkJaWYgKCFpbmhpYml0X2NvcnJlY3Rpb24gJiYKKwkJCSAgICAoZnRfbG9jYXRpb24uc2VnbWVudCA8IGV4cGVjdGVkIHx8CisJCQkgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQgPiBleHBlY3RlZCArIG1hcmdpbikpIHsKKwkJCQlpbnQgZXJyb3IgPSBmdF9sb2NhdGlvbi5zZWdtZW50IC0gZXhwZWN0ZWQ7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkgICAgICAiYWRqdXN0aW5nIG92ZXJzaG9vdCBmcm9tICVkIHRvICVkIiwKKwkJCQkgICAgICBvdmVyc2hvb3QsIG92ZXJzaG9vdCArIGVycm9yKTsKKwkJCQlvdmVyc2hvb3QgKz0gZXJyb3I7CisJCQkJLyogIEFsbCBvdmVyc2hvb3RzIGhhdmUgdGhlIHNhbWUKKwkJCQkgKiAgZGlyZWN0aW9uLCBzbyBpdCBzaG91bGQgbmV2ZXIKKwkJCQkgKiAgYmVjb21lIG5lZ2F0aXZlLCBidXQgd2hvIGtub3dzLgorCQkJCSAqLworCQkJCWlmIChvdmVyc2hvb3QgPCAtNSB8fAorCQkJCSAgICBvdmVyc2hvb3QgPiBPVkVSU0hPT1RfTElNSVQpIHsKKwkJCQkJaWYgKG92ZXJzaG9vdCA8IDApIHsKKwkJCQkJCS8qIGtlZXAgc2FuZSB2YWx1ZSAqLworCQkJCQkJb3ZlcnNob290ID0gLTU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBrZWVwIHNhbmUgdmFsdWUgKi8KKwkJCQkJCW92ZXJzaG9vdCA9IE9WRVJTSE9PVF9MSU1JVDsKKwkJCQkJfQorCQkJCQlUUkFDRShmdF90X25vaXNlLAorCQkJCQkgICAgICAiY2xpcHBlZCBvdmVyc2hvb3QgdG8gJWQiLAorCQkJCQkgICAgICBvdmVyc2hvb3QpOworCQkJCX0KKwkJCX0KKwkJCWZhc3Rfc2Vla2luZyA9IDA7CisJCX0KKwkJaWYgKGZ0X2xvY2F0aW9uLmtub3duKSB7CisJCQlpZiAoZnRfbG9jYXRpb24uc2VnbWVudCA+IHByZXZfc2VnbWVudCArIDEpIHsKKwkJCQlUUkFDRShmdF90X25vaXNlLAorCQkJCSAgICAgICJtaXNzZWQgc2VnbWVudCAlZCB3aGlsZSBza2lwcGluZyIsCisJCQkJICAgICAgcHJldl9zZWdtZW50ICsgMSk7CisJCQl9CisJCQlwcmV2X3NlZ21lbnQgPSBmdF9sb2NhdGlvbi5zZWdtZW50OworCQl9CisJfQorCWlmIChmdF9sb2NhdGlvbi5zZWdtZW50ID4gc2VnbWVudF9pZCkgeworCQlUUkFDRV9BQk9SVCgtRUlPLAorCQkJICAgIGZ0X3Rfbm9pc2UsICJmYWlsZWQ6IHNraXAgZW5kZWQgYXQgc2VnbWVudCAlZC8lZCIsCisJCQkgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IHNraXBfcmV2ZXJzZShpbnQgc2VnbWVudF9pZCwgaW50ICpwc3RhdHVzKQoreworCWludCBmYWlsdXJlcyA9IDA7CisJc3RhdGljIGludCBvdmVyc2hvb3QgPSAxOworCXN0YXRpYyBpbnQgbWluX3Jld2luZCA9IDI7CS8qIDEgKyBvdmVyc2hvb3QgKi8KKwlzdGF0aWMgY29uc3QgaW50IG1hcmdpbiA9IDE7CS8qIHN0b3AgdGhpcyBiZWZvcmUgdGFyZ2V0ICovCisJaW50IGV4cGVjdGVkID0gMDsKKwlpbnQgY291bnQgPSAxOworCWludCBzaG9ydF9zZWVrOworCWludCB0YXJnZXQgPSBzZWdtZW50X2lkIC0gbWFyZ2luOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKGZ0X2xvY2F0aW9uLmtub3duICYmICF2YWxpZGF0ZShzZWdtZW50X2lkKSkgeworCQlmdGFwZV9zbGVlcCgxICogRlRfU0VDT05EKTsKKwkJZnRfZmFpbHVyZSA9IDE7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJmYXRhbDogaGVhZCBvZmYgdHJhY2sgKGJhZCBoYXJkd2FyZT8pIik7CisJfQorCWRvIHsKKwkJaWYgKCFmdF9sb2NhdGlvbi5rbm93bikgeworCQkJVFJBQ0UoZnRfdF93YXJuLCAid2FybmluZzogbG9jYXRpb24gbm90IGtub3duIik7CisJCX0KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImZyb20gJWQvJWQgdG8gJWQvMCAtICVkIiwKKwkJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yLAorCQkgICAgICBzZWdtZW50X2lkLCBtYXJnaW4pOworCQkvKiAgbWluX3Jld2luZCA9PSAxICsgb3ZlcnNob290X3doZW5fZG9pbmdfbWluaW11bV9yZXdpbmQKKwkJICogIG92ZXJzaG9vdCAgPT0gb3ZlcnNob290X3doZW5fZG9pbmdfbGFyZ2VyX3Jld2luZAorCQkgKiAgSW5pdGlhbGx5IG1pbl9yZXdpbmQgPT0gMSArIG92ZXJzaG9vdCwgb3B0aW1pemF0aW9uCisJCSAqICBvZiBib3RoIHZhbHVlcyB3aWxsIGJlIGRvbmUgc2VwYXJhdGVseS4KKwkJICogIG92ZXJzaG9vdCBhbmQgbWluX3Jld2luZCBjYW4gYmUgbmVnYXRpdmUgYXMgYm90aCBhcmUKKwkJICogIHN1bXMgb2YgdGhyZWUgY29tcG9uZW50czoKKwkJICogIGFueV9vdmVyc2hvb3QgPT0gcmV3aW5kX292ZXJzaG9vdCAtIAorCQkgKiAgICAgICAgICAgICAgICAgICBzdG9wX292ZXJzaG9vdCAgIC0KKwkJICogICAgICAgICAgICAgICAgICAgc3RhcnRfb3ZlcnNob290CisJCSAqLworCQlpZiAoZnRfbG9jYXRpb24uc2VnbWVudCAtIHRhcmdldCAtIChtaW5fcmV3aW5kIC0gMSkgPCAxKSB7CisJCQlzaG9ydF9zZWVrID0gMTsKKwkJfSBlbHNlIHsKKwkJCWNvdW50ID0gZnRfbG9jYXRpb24uc2VnbWVudCAtIHRhcmdldCAtIG92ZXJzaG9vdDsKKwkJCXNob3J0X3NlZWsgPSAoY291bnQgPCAxKTsKKwkJfQorCQlpZiAoc2hvcnRfc2VlaykgeworCQkJY291bnQgPSAxOwkvKiBkbyBzaG9ydGVzdCByZXdpbmQgKi8KKwkJCWV4cGVjdGVkID0gZnRfbG9jYXRpb24uc2VnbWVudCAtIG1pbl9yZXdpbmQ7CisJCQlpZiAoZXhwZWN0ZWQvZnRfc2VnbWVudHNfcGVyX3RyYWNrICE9IGZ0X2xvY2F0aW9uLnRyYWNrKSB7CisJCQkJZXhwZWN0ZWQgPSAoZnRfbG9jYXRpb24udHJhY2sgKiAKKwkJCQkJICAgIGZ0X3NlZ21lbnRzX3Blcl90cmFjayk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlleHBlY3RlZCA9IHRhcmdldDsKKwkJfQorCQlmYXN0X3NlZWsoY291bnQsIDEpOworCQlsb2dpY2FsX2ZvcndhcmQoKTsKKwkJaWYgKGZ0YXBlX3JlYWRfaWQoKSA8IDAgfHwgIWZ0X2xvY2F0aW9uLmtub3duIHx8CisJCSAgICAoc2lndGVzdHNldG1hc2soJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBfRE9OVF9CTE9DSykpKSB7CisJCQlpZiAoKCFmdGFwZV90YXBlX3J1bm5pbmcgJiYgIWZ0X2xvY2F0aW9uLmtub3duKSB8fAorCQkJICAgICsrZmFpbHVyZXMgPiBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKSB7CisJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkJCSAgICAicmVhZF9pZCBmYWlsZWQgY29tcGxldGVseSIpOworCQkJfQorCQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X2RyaXZlX3N0YXR1cyhwc3RhdHVzKSwpOworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImZ0YXBlX3JlYWRfaWQgZmFpbGVkLCByZXRyeSAoJWQpIiwKKwkJCSAgICAgIGZhaWx1cmVzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlbmRlZCBhdCAlZC8lZCAoJWQsJWQsJWQpIiwgCisJCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3RvciwKKwkJICAgICAgbWluX3Jld2luZCwgb3ZlcnNob290LCBpbmhpYml0X2NvcnJlY3Rpb24pOworCQlpZiAoIWluaGliaXRfY29ycmVjdGlvbiAmJgorCQkgICAgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgPCBleHBlY3RlZCB8fAorCQkgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQgPiBleHBlY3RlZCArIG1hcmdpbikpIHsKKwkJCWludCBlcnJvciA9IGV4cGVjdGVkIC0gZnRfbG9jYXRpb24uc2VnbWVudDsKKwkJCWlmIChzaG9ydF9zZWVrKSB7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkgICAgICAiYWRqdXN0aW5nIG1pbl9yZXdpbmQgZnJvbSAlZCB0byAlZCIsCisJCQkJICAgICAgbWluX3Jld2luZCwgbWluX3Jld2luZCArIGVycm9yKTsKKwkJCQltaW5fcmV3aW5kICs9IGVycm9yOworCQkJCWlmIChtaW5fcmV3aW5kIDwgLTUpIHsKKwkJCQkJLyogaXMgdGhpcyByaWdodCA/IEZJWE1FICEgKi8KKwkJCQkJLyoga2VlcCBzYW5lIHZhbHVlICovCisJCQkJCW1pbl9yZXdpbmQgPSAtNTsKKwkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgCisJCQkJCSAgICAgICJjbGlwcGVkIG1pbl9yZXdpbmQgdG8gJWQiLAorCQkJCQkgICAgICBtaW5fcmV3aW5kKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCQkJICAgICAgImFkanVzdGluZyBvdmVyc2hvb3QgZnJvbSAlZCB0byAlZCIsCisJCQkJICAgICAgb3ZlcnNob290LCBvdmVyc2hvb3QgKyBlcnJvcik7CisJCQkJb3ZlcnNob290ICs9IGVycm9yOworCQkJCWlmIChvdmVyc2hvb3QgPCAtNSB8fAorCQkJCSAgICBvdmVyc2hvb3QgPiBPVkVSU0hPT1RfTElNSVQpIHsKKwkJCQkJaWYgKG92ZXJzaG9vdCA8IDApIHsKKwkJCQkJCS8qIGtlZXAgc2FuZSB2YWx1ZSAqLworCQkJCQkJb3ZlcnNob290ID0gLTU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBrZWVwIHNhbmUgdmFsdWUgKi8KKwkJCQkJCW92ZXJzaG9vdCA9IE9WRVJTSE9PVF9MSU1JVDsKKwkJCQkJfQorCQkJCQlUUkFDRShmdF90X25vaXNlLAorCQkJCQkgICAgICAiY2xpcHBlZCBvdmVyc2hvb3QgdG8gJWQiLAorCQkJCQkgICAgICBvdmVyc2hvb3QpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgPiBzZWdtZW50X2lkKTsKKwlpZiAoZnRfbG9jYXRpb24ua25vd24pIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImN1cnJlbnQgbG9jYXRpb246ICVkLyVkIiwKKwkJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IGRldGVybWluZV9wb3NpdGlvbih2b2lkKQoreworCWludCByZXRyeSA9IDA7CisJaW50IHN0YXR1czsKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKCFmdGFwZV90YXBlX3J1bm5pbmcpIHsKKwkJLyogIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRhcGUgaXMgc3RvcHBlZCBieSBpc3IuCisJCSAqLworCQlUUkFDRShmdF90X2Zsb3csICJ3YWl0aW5nIGZvciB0YXBlIHN0b3AiKTsKKwkJaWYgKGZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5wYXVzZSwgJnN0YXR1cykgPCAwKSB7CisJCQlUUkFDRShmdF90X2Zsb3csICJkcml2ZSBzdGlsbCBydW5uaW5nIChmYXRhbCkiKTsKKwkJCWZ0YXBlX3RhcGVfcnVubmluZyA9IDE7CS8qID8gKi8KKwkJfQorCX0gZWxzZSB7CisJCWZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMoJnN0YXR1cyk7CisJfQorCWlmIChzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSB7CisJCS8qICBEcml2ZSBtdXN0IGJlIHJlYWR5IHRvIGNoZWNrIGVycm9yIHN0YXRlICEKKwkJICovCisJCVRSQUNFKGZ0X3RfZmxvdywgImRyaXZlIGlzIHJlYWR5Iik7CisJCWlmIChzdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKSB7CisJCQl1bnNpZ25lZCBpbnQgZXJyb3I7CisJCQlxaWMxMTdfY21kX3QgY29tbWFuZDsKKworCQkJLyogIFJlcG9ydCBhbmQgY2xlYXIgZXJyb3Igc3RhdGUsIHRyeSB0byBjb250aW51ZS4KKwkJCSAqLworCQkJVFJBQ0UoZnRfdF9mbG93LCAiZXJyb3Igc3RhdHVzIHNldCIpOworCQkJZnRhcGVfcmVwb3J0X2Vycm9yKCZlcnJvciwgJmNvbW1hbmQsIDEpOworCQkJZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnJlc2V0LCAmc3RhdHVzKTsKKwkJCWZ0YXBlX3RhcGVfcnVubmluZyA9IDA7CS8qID8gKi8KKwkJfQorCQlpZiAoY2hlY2tfYm90X2VvdChzdGF0dXMpKSB7CisJCQlpZiAoZnRfbG9jYXRpb24uYm90KSB7CisJCQkJaWYgKChzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSA9PSAwKSB7CisJCQkJCS8qIHRhcGUgbW92aW5nIGF3YXkgZnJvbQorCQkJCQkgKiBib3QvZW90LCBsZXQncyBzZWUgaWYgd2UKKwkJCQkJICogY2FuIGNhdGNoIHVwIHdpdGggdGhlIGZpcnN0CisJCQkJCSAqIHNlZ21lbnQgb24gdGhpcyB0cmFjay4KKwkJCQkJICovCisJCQkJfSBlbHNlIHsKKwkJCQkJVFJBQ0UoZnRfdF9mbG93LAorCQkJCQkgICAgICAic3RhcnQgdGFwZSBmcm9tIGxvZ2ljYWwgYm90Iik7CisJCQkJCWxvZ2ljYWxfZm9yd2FyZCgpOwkvKiBzdGFydCBtb3ZpbmcgKi8KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICgoc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkgPT0gMCkgeworCQkJCQlUUkFDRShmdF90X25vaXNlLCAid2FpdGluZyBmb3IgbG9naWNhbCBlbmQgb2YgdHJhY2siKTsKKwkJCQkJcmVzdWx0ID0gZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnJlc2V0LCAmc3RhdHVzKTsKKwkJCQkJLyogZXJyb3IgaGFuZGxpbmcgbmVlZGVkID8gKi8KKwkJCQl9IGVsc2UgeworCQkJCQlUUkFDRShmdF90X25vaXNlLAorCQkJCQkgICAgICAidGFwZSBhdCBsb2dpY2FsIGVuZCBvZiB0cmFjayIpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgInN0YXJ0IHRhcGUiKTsKKwkJCWxvZ2ljYWxfZm9yd2FyZCgpOwkvKiBzdGFydCBtb3ZpbmcgKi8KKwkJCWZ0X2xvY2F0aW9uLmtub3duID0gMDsJLyogbm90IGNsZWFyZWQgYnkgbG9naWNhbCBmb3J3YXJkICEgKi8KKwkJfQorCX0KKwkvKiB0YXBlIHNob3VsZCBiZSBtb3Zpbmcgbm93LCBzdGFydCByZWFkaW5nIGlkJ3MKKwkgKi8KKwl3aGlsZSAoIWZ0X2xvY2F0aW9uLmtub3duICYmCisJICAgICAgIHJldHJ5KysgPCBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UICYmCisJICAgICAgIChyZXN1bHQgPSBmdGFwZV9yZWFkX2lkKCkpIDwgMCkgeworCisJCVRSQUNFKGZ0X3RfZmxvdywgImxvY2F0aW9uIHVua25vd24iKTsKKworCQkvKiBleGl0IG9uIHNpZ25hbAorCQkgKi8KKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCisJCS8qICByZWFkLWlkIHNvbWVob3cgZmFpbGVkLCB0YXBlIG1heQorCQkgKiAgaGF2ZSByZWFjaGVkIGVuZCBvciBzb21lIG90aGVyCisJCSAqICBlcnJvciBoYXBwZW5lZC4KKwkJICovCisJCVRSQUNFKGZ0X3RfZmxvdywgInJlYWQtaWQgZmFpbGVkIik7CisJCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMoJnN0YXR1cyksKTsKKwkJVFJBQ0UoZnRfdF9lcnIsICJmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzOiAweCUwMngiLCBzdGF0dXMpOworCQlpZiAoc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkgeworCQkJZnRhcGVfdGFwZV9ydW5uaW5nID0gMDsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0YXBlIHN0b3BwZWQgZm9yIHVua25vd24gcmVhc29uISAiCisJCQkgICAgICAic3RhdHVzID0gMHglMDJ4Iiwgc3RhdHVzKTsKKwkJCWlmIChzdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SIHx8CisJCQkgICAgIWNoZWNrX2JvdF9lb3Qoc3RhdHVzKSkgeworCQkJCS8qIG9vcHMsIHRhcGUgc3RvcHBlZCBidXQgbm90IGF0IGVuZCEKKwkJCQkgKi8KKwkJCQlUUkFDRV9FWElUIC1FSU87CisJCQl9CisJCX0KKwl9CisJVFJBQ0UoZnRfdF9mbG93LAorCSAgICAgICJ0YXBlIGlzIHBvc2l0aW9uZWQgYXQgc2VnbWVudCAlZCIsIGZ0X2xvY2F0aW9uLnNlZ21lbnQpOworCVRSQUNFX0VYSVQgZnRfbG9jYXRpb24ua25vd24gPyAwIDogLUVJTzsKK30KKworLyogICAgICBHZXQgdGhlIHRhcGUgcnVubmluZyBhbmQgcG9zaXRpb24gaXQganVzdCBiZWZvcmUgdGhlCisgKiAgICAgIHJlcXVlc3RlZCBzZWdtZW50LgorICogICAgICBTZWVrIHRhcGUtdHJhY2sgYW5kIHJlcG9zaXRpb24gYXMgbmVlZGVkLgorICovCitpbnQgZnRhcGVfc3RhcnRfdGFwZShpbnQgc2VnbWVudF9pZCwgaW50IHNlY3Rvcl9vZmZzZXQpCit7CisJaW50IHRyYWNrID0gc2VnbWVudF9pZCAvIGZ0X3NlZ21lbnRzX3Blcl90cmFjazsKKwlpbnQgcmVzdWx0ID0gLUVJTzsKKwlpbnQgc3RhdHVzOworCXN0YXRpYyBpbnQgbGFzdF9zZWdtZW50ID0gLTE7CisJc3RhdGljIGludCBiYWRfYnVzX3RpbWluZyA9IDA7CisJLyogbnVtYmVyIG9mIHNlZ21lbnRzIHBhc3NpbmcgdGhlIGhlYWQgYmV0d2VlbiBzdGFydGluZyB0aGUgdGFwZQorCSAqIGFuZCBiZWluZyBhYmxlIHRvIGFjY2VzcyB0aGUgZmlyc3Qgc2VjdG9yLgorCSAqLworCXN0YXRpYyBpbnQgc3RhcnRfb2Zmc2V0ID0gMTsKKwlpbnQgcmV0cnk7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwkvKiBJZiBzZWN0b3Jfb2Zmc2V0ID4gMCwgc2VlayBpbnRvIHdhbnRlZCBzZWdtZW50IGluc3RlYWQgb2YKKwkgKiBpbnRvIHByZXZpb3VzLgorCSAqIFRoaXMgYWxsb3dzIGVycm9yIHJlY292ZXJ5IGlmIGEgcGFydCBvZiB0aGUgc2VnbWVudCBpcyBiYWQKKwkgKiAoZXJhc2VkKSBjYXVzaW5nIHRoZSB0YXBlIGRyaXZlIHRvIGdlbmVyYXRlIGFuIGluZGV4IHB1bHNlCisJICogdGh1cyBjYXVzaW5nIGEgbm8tZGF0YSBlcnJvciBiZWZvcmUgdGhlIHJlcXVlc3RlZCBzZWN0b3IKKwkgKiBpcyByZWFjaGVkLgorCSAqLworCWZ0YXBlX3RhcGVfcnVubmluZyA9IDA7CisJVFJBQ0UoZnRfdF9ub2lzZSwgInRhcmdldCBzZWdtZW50OiAlZC8lZCVzIiwgc2VnbWVudF9pZCwgc2VjdG9yX29mZnNldCwKKwkJZnRfYnVmZmVyW2Z0X2hlYWRdLT5yZXRyeSA+IDAgPyAiIHJldHJ5IiA6ICIiKTsKKwlpZiAoZnRfYnVmZmVyW2Z0X2hlYWRdLT5yZXRyeSA+IDApIHsJLyogdGhpcyBpcyBhIHJldHJ5ICovCisJCWludCBkaXN0ID0gc2VnbWVudF9pZCAtIGxhc3Rfc2VnbWVudDsKKworCQlpZiAoKGludClmdF9oaXN0b3J5Lm92ZXJydW5fZXJyb3JzIDwgb3ZlcnJ1bl9jb3VudF9vZmZzZXQpIHsKKwkJCW92ZXJydW5fY291bnRfb2Zmc2V0ID0gZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9yczsKKwkJfSBlbHNlIGlmIChkaXN0IDwgMCB8fCBkaXN0ID4gNTApIHsKKwkJCW92ZXJydW5fY291bnRfb2Zmc2V0ID0gZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9yczsKKwkJfSBlbHNlIGlmICgoZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9ycyAtCisJCQkgICAgb3ZlcnJ1bl9jb3VudF9vZmZzZXQpID49IDgpIHsKKwkJCWlmIChmdGFwZV9pbmNyZWFzZV90aHJlc2hvbGQoKSA+PSAwKSB7CisJCQkJLS1mdF9idWZmZXJbZnRfaGVhZF0tPnJldHJ5OworCQkJCW92ZXJydW5fY291bnRfb2Zmc2V0ID0KKwkJCQkJZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9yczsKKwkJCQlUUkFDRShmdF90X3dhcm4sICJpbmNyZWFzZWQgdGhyZXNob2xkIGJlY2F1c2UgIgorCQkJCSAgICAgICJvZiBleGNlc3NpdmUgb3ZlcnJ1biBlcnJvcnMiKTsKKwkJCX0gZWxzZSBpZiAoIWJhZF9idXNfdGltaW5nICYmIGZ0X2RhdGFfcmF0ZSA+PSAxMDAwKSB7CisJCQkJZnRhcGVfaGFsZl9kYXRhX3JhdGUoKTsKKwkJCQktLWZ0X2J1ZmZlcltmdF9oZWFkXS0+cmV0cnk7CisJCQkJYmFkX2J1c190aW1pbmcgPSAxOworCQkJCW92ZXJydW5fY291bnRfb2Zmc2V0ID0KKwkJCQkJZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9yczsKKwkJCQlUUkFDRShmdF90X3dhcm4sICJyZWR1Y2VkIGRhdGFyYXRlIGJlY2F1c2UgIgorCQkJCSAgICAgICJvZiBleGNlc3NpdmUgb3ZlcnJ1biBlcnJvcnMiKTsKKwkJCX0KKwkJfQorCX0KKwlsYXN0X3NlZ21lbnQgPSBzZWdtZW50X2lkOworCWlmIChmdF9sb2NhdGlvbi50cmFjayAhPSB0cmFjayB8fAorCSAgICAoZnRhcGVfbWlnaHRfYmVfb2ZmX3RyYWNrICYmIGZ0X2J1ZmZlcltmdF9oZWFkXS0+cmV0cnk9PSAwKSkgeworCQkvKiBjdXJyZW50IHRyYWNrIHVua25vd24gb3Igbm90IGVxdWFsIHRvIGRlc3RpbmF0aW9uCisJCSAqLworCQlmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQuc2VlaywgJnN0YXR1cyk7CisJCWZ0YXBlX3NlZWtfaGVhZF90b190cmFjayh0cmFjayk7CisJCS8qIG92ZXJydW5fY291bnRfb2Zmc2V0ID0gZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9yczsgKi8KKwl9CisJcmVzdWx0ID0gLUVJTzsKKwlyZXRyeSA9IDA7CisJd2hpbGUgKHJlc3VsdCA8IDAgICAgICYmCisJICAgICAgIHJldHJ5KysgPD0gNSAgICYmCisJICAgICAgICFmdF9mYWlsdXJlICYmCisJICAgICAgICEoc2lndGVzdHNldG1hc2soJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBfRE9OVF9CTE9DSykpKSB7CisJCQorCQlpZiAocmV0cnkgJiYgc3RhcnRfb2Zmc2V0IDwgNSkgeworCQkJc3RhcnRfb2Zmc2V0ICsrOworCQl9CisJCS8qICBDaGVjayBpZiB3ZSBhcmUgYWJsZSB0byBjYXRjaCB0aGUgcmVxdWVzdGVkCisJCSAqICBzZWdtZW50IGluIHRpbWUuCisJCSAqLworCQlpZiAoKGZ0X2xvY2F0aW9uLmtub3duIHx8IChkZXRlcm1pbmVfcG9zaXRpb24oKSA9PSAwKSkgJiYKKwkJICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQgPj0KKwkJICAgIChzZWdtZW50X2lkIC0KKwkJICAgICAoKGZ0YXBlX3RhcGVfcnVubmluZyB8fCBmdF9sb2NhdGlvbi5ib3QpCisJCSAgICAgID8gMCA6IHN0YXJ0X29mZnNldCkpKSB7CisJCQkvKiAgVG9vIGZhciBhaGVhZCAoaW4gb3IgcGFzdCB0YXJnZXQgc2VnbWVudCkuCisJCQkgKi8KKwkJCWlmIChmdGFwZV90YXBlX3J1bm5pbmcpIHsKKwkJCQlpZiAoKHJlc3VsdCA9IGZ0YXBlX3N0b3BfdGFwZSgmc3RhdHVzKSkgPCAwKSB7CisJCQkJCVRSQUNFKGZ0X3RfZXJyLAorCQkJCQkgICAgICAic3RvcCB0YXBlIGZhaWxlZCB3aXRoIGNvZGUgJWQiLAorCQkJCQkgICAgICByZXN1bHQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgInRhcGUgc3RvcHBlZCIpOworCQkJCWZ0YXBlX3RhcGVfcnVubmluZyA9IDA7CisJCQl9CisJCQlUUkFDRShmdF90X25vaXNlLCAicmVwb3NpdGlvbmluZyIpOworCQkJKytmdF9oaXN0b3J5LnJld2luZHM7CisJCQlpZiAoc2VnbWVudF9pZCAlIGZ0X3NlZ21lbnRzX3Blcl90cmFjayA8IHN0YXJ0X29mZnNldCl7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImVuZCBvZiB0cmFjayBjb25kaXRpb25cbiIKKwkJCQkgICAgICBLRVJOX0lORk8gInNlZ21lbnRfaWQgICAgICAgIDogJWRcbiIKKwkJCQkgICAgICBLRVJOX0lORk8gImZ0X3NlZ21lbnRzX3Blcl90cmFjazogJWRcbiIKKwkJCQkgICAgICBLRVJOX0lORk8gInN0YXJ0X29mZnNldCAgICAgIDogJWQiLAorCQkJCSAgICAgIHNlZ21lbnRfaWQsIGZ0X3NlZ21lbnRzX3Blcl90cmFjaywgCisJCQkJICAgICAgc3RhcnRfb2Zmc2V0KTsKKwkJCQkgICAgICAKKwkJCQkvKiAgSWYgc2Vla2luZyB0byBmaXJzdCBzZWdtZW50cyBvbgorCQkJCSAqICB0cmFjayBiZXR0ZXIgZG8gYSBjb21wbGV0ZSByZXdpbmQKKwkJCQkgKiAgdG8gbG9naWNhbCBiZWdpbiBvZiB0cmFjayB0byBnZXQgYQorCQkJCSAqICBtb3JlIHN0ZWFkeSB0YXBlIG1vdGlvbi4gIAorCQkJCSAqLworCQkJCXJlc3VsdCA9IGZ0YXBlX2NvbW1hbmRfd2FpdCgKKwkJCQkJKGZ0X2xvY2F0aW9uLnRyYWNrICYgMSkKKwkJCQkJPyBRSUNfUEhZU0lDQUxfRk9SV0FSRAorCQkJCQk6IFFJQ19QSFlTSUNBTF9SRVZFUlNFLAorCQkJCQlmdGFwZV90aW1lb3V0LnJld2luZCwgJnN0YXR1cyk7CisJCQkJY2hlY2tfYm90X2VvdChzdGF0dXMpOwkvKiB1cGRhdGUgbG9jYXRpb24gKi8KKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0PSBza2lwX3JldmVyc2Uoc2VnbWVudF9pZCAtIHN0YXJ0X29mZnNldCwKKwkJCQkJCSAgICAgJnN0YXR1cyk7CisJCQl9CisJCX0KKwkJaWYgKCFmdF9sb2NhdGlvbi5rbm93bikgeworCQkJVFJBQ0UoZnRfdF9idWcsICJwYW5pYzogbG9jYXRpb24gbm90IGtub3duIik7CisJCQlyZXN1bHQgPSAtRUlPOworCQkJY29udGludWU7IC8qIHdoaWxlKCkgd2lsbCBjaGVjayBmb3IgZmFpbHVyZSAqLworCQl9CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJjdXJyZW50IHNlZ21lbnQ6ICVkLyVkIiwKKwkJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yKTsKKwkJLyogIFdlJ3JlIG9uIHRoZSByaWdodCB0cmFjayBzb21ld2hlcmUgYmVmb3JlIHRoZQorCQkgKiAgd2FudGVkIHNlZ21lbnQuICBTdGFydCB0YXBlIG1vdmVtZW50IGlmIG5lZWRlZCBhbmQKKwkJICogIHNraXAgdG8ganVzdCBiZWZvcmUgb3IgaW5zaWRlIHRoZSByZXF1ZXN0ZWQKKwkJICogIHNlZ21lbnQuIEtlZXAgdGFwZSBydW5uaW5nLiAgCisJCSAqLworCQlyZXN1bHQgPSAwOworCQlpZiAoZnRfbG9jYXRpb24uc2VnbWVudCA8IAorCQkgICAgKHNlZ21lbnRfaWQgLSAoKGZ0YXBlX3RhcGVfcnVubmluZyB8fCBmdF9sb2NhdGlvbi5ib3QpCisJCQkJICAgPyAwIDogc3RhcnRfb2Zmc2V0KSkpIHsKKwkJCWlmIChzZWN0b3Jfb2Zmc2V0ID4gMCkgeworCQkJCXJlc3VsdCA9IHNlZWtfZm9yd2FyZChzZWdtZW50X2lkLAorCQkJCQkJICAgICAgcmV0cnkgPD0gMyk7CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IHNlZWtfZm9yd2FyZChzZWdtZW50X2lkIC0gMSwKKwkJCQkJCSAgICAgIHJldHJ5IDw9IDMpOworCQkJfQorCQl9CisJCWlmIChyZXN1bHQgPT0gMCAmJgorCQkgICAgZnRfbG9jYXRpb24uc2VnbWVudCAhPQorCQkgICAgKHNlZ21lbnRfaWQgLSAoc2VjdG9yX29mZnNldCA+IDAgPyAwIDogMSkpKSB7CisJCQlyZXN1bHQgPSAtRUlPOworCQl9CisJfQorCWlmIChyZXN1bHQgPCAwKSB7CisJCVRSQUNFKGZ0X3RfZXJyLCAiZmFpbGVkIHRvIHJlcG9zaXRpb24iKTsKKwl9IGVsc2UgeworCQlmdF9ydW5uZXJfc3RhdHVzID0gcnVubmluZzsKKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ydy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjRmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuaApAQCAtMCwwICsxLDExMSBAQAorI2lmbmRlZiBfRlRBUEVfUldfSAorI2RlZmluZSBfRlRBUEVfUldfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjI1ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSByZWFkIGFuZCB3cml0ZQorICogICAgICBmdW5jdGlvbnMgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ2xhdXMtSnVzdHVzIEhlaW5lICgxOTk2LzA5LzIwKTogQWRkIGRlZmluaXRpb24gb2YgZm9ybWF0IGNvZGUgNgorICogQ2xhdXMtSnVzdHVzIEhlaW5lICgxOTk2LzEwLzA0KTogQ2hhbmdlZCBHRVQvUFVUIG1hY3JvcyB0byBjYXN0IHRvIChfX3U4ICopCisgKgorICovCisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnNtLmgiCisKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNkZWZpbmUgR0VUMihhZGRyZXNzLCBvZmZzZXQpIGdldF91bmFsaWduZWQoKF9fdTE2KikoKF9fdTggKilhZGRyZXNzICsgb2Zmc2V0KSkKKyNkZWZpbmUgR0VUNChhZGRyZXNzLCBvZmZzZXQpIGdldF91bmFsaWduZWQoKF9fdTMyKikoKF9fdTggKilhZGRyZXNzICsgb2Zmc2V0KSkKKyNkZWZpbmUgR0VUOChhZGRyZXNzLCBvZmZzZXQpIGdldF91bmFsaWduZWQoKF9fdTY0KikoKF9fdTggKilhZGRyZXNzICsgb2Zmc2V0KSkKKyNkZWZpbmUgUFVUMihhZGRyZXNzLCBvZmZzZXQgLCB2YWx1ZSkgcHV0X3VuYWxpZ25lZCgodmFsdWUpLCAoX191MTYqKSgoX191OCAqKWFkZHJlc3MgKyBvZmZzZXQpKQorI2RlZmluZSBQVVQ0KGFkZHJlc3MsIG9mZnNldCAsIHZhbHVlKSBwdXRfdW5hbGlnbmVkKCh2YWx1ZSksIChfX3UzMiopKChfX3U4ICopYWRkcmVzcyArIG9mZnNldCkpCisjZGVmaW5lIFBVVDgoYWRkcmVzcywgb2Zmc2V0ICwgdmFsdWUpIHB1dF91bmFsaWduZWQoKHZhbHVlKSwgKF9fdTY0KikoKF9fdTggKilhZGRyZXNzICsgb2Zmc2V0KSkKKworZW51bSBydW5uZXJfc3RhdHVzX2VudW0geworCWlkbGUgPSAwLAorCXJ1bm5pbmcsCisJZG9fYWJvcnQsCisJYWJvcnRpbmcsCisJbG9naWNhbF9lb3QsCisJZW5kX29mX3RhcGUsCit9OworCit0eXBlZGVmIGVudW0gZnRfYnVmZmVyX3F1ZXVlIHsKKwlmdF9xdWV1ZV9oZWFkID0gMCwKKwlmdF9xdWV1ZV90YWlsID0gMQorfSBmdF9idWZmZXJfcXVldWVfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHRyYWNrOwkJLyogdGFwZSBoZWFkIHBvc2l0aW9uICovCisJdm9sYXRpbGUgaW50IHNlZ21lbnQ7CS8qIGN1cnJlbnQgc2VnbWVudCAqLworCXZvbGF0aWxlIGludCBzZWN0b3I7CS8qIHNlY3RvciBvZmZzZXQgd2l0aGluIGN1cnJlbnQgc2VnbWVudCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBib3Q7CS8qIGxvZ2ljYWwgYmVnaW4gb2YgdHJhY2sgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgZW90OwkvKiBsb2dpY2FsIGVuZCBvZiB0cmFjayAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBrbm93bjsJLyogdmFsaWRhdGVzIGJvdCwgc2VnbWVudCwgc2VjdG9yICovCit9IGxvY2F0aW9uX3JlY29yZDsKKworLyogICAgICBDb3VudCBuciBvZiAxJ3MgaW4gcGF0dGVybi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY291bnRfb25lcyh1bnNpZ25lZCBsb25nIG1hc2spCit7CisJaW50IGJpdHM7CisKKwlmb3IgKGJpdHMgPSAwOyBtYXNrICE9IDA7IG1hc2sgPj49IDEpIHsKKwkJaWYgKG1hc2sgJiAxKSB7CisJCQkrK2JpdHM7CisJCX0KKwl9CisJcmV0dXJuIGJpdHM7Cit9CisKKyNkZWZpbmUgRlRfTUFYX05SX0JVRkZFUlMgMTYgLyogYXJiaXRyYXJ5IHZhbHVlICovCisvKiAgICAgIGZ0YXBlLXJ3LmMgZGVmaW5lZCBnbG9iYWwgdmFycy4KKyAqLworZXh0ZXJuIGJ1ZmZlcl9zdHJ1Y3QgKmZ0X2J1ZmZlcltGVF9NQVhfTlJfQlVGRkVSU107CitleHRlcm4gaW50IGZ0X25yX2J1ZmZlcnM7CitleHRlcm4gbG9jYXRpb25fcmVjb3JkIGZ0X2xvY2F0aW9uOworZXh0ZXJuIHZvbGF0aWxlIGludCBmdGFwZV90YXBlX3J1bm5pbmc7CisKKy8qICAgICAgZnRhcGUtcncuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCisgKi8KK2V4dGVybiBpbnQgIGZ0YXBlX3NldHVwX25ld19zZWdtZW50KGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmLAorCQkJCSAgICBpbnQgc2VnbWVudF9pZCwKKwkJCQkgICAgaW50IG9mZnNldCk7CitleHRlcm4gaW50ICBmdGFwZV9jYWxjX25leHRfY2x1c3RlcihidWZmZXJfc3RydWN0ICogYnVmZik7CitleHRlcm4gYnVmZmVyX3N0cnVjdCAqZnRhcGVfbmV4dF9idWZmZXIgKGZ0X2J1ZmZlcl9xdWV1ZV90IHBvcyk7CitleHRlcm4gYnVmZmVyX3N0cnVjdCAqZnRhcGVfZ2V0X2J1ZmZlciAgKGZ0X2J1ZmZlcl9xdWV1ZV90IHBvcyk7CitleHRlcm4gaW50ICAgICAgICAgICAgZnRhcGVfYnVmZmVyX2lkICAgKGZ0X2J1ZmZlcl9xdWV1ZV90IHBvcyk7CitleHRlcm4gdm9pZCAgICAgICAgICAgZnRhcGVfcmVzZXRfYnVmZmVyKHZvaWQpOworZXh0ZXJuIHZvaWQgZnRhcGVfdGFwZV9wYXJhbWV0ZXJzKF9fdTggZHJpdmVfY29uZmlndXJhdGlvbik7CitleHRlcm4gaW50ICBmdGFwZV93YWl0X3NlZ21lbnQoYnVmZmVyX3N0YXRlX2VudW0gc3RhdGUpOworZXh0ZXJuIGludCAgZnRhcGVfZHVtYl9zdG9wKHZvaWQpOworZXh0ZXJuIGludCAgZnRhcGVfc3RhcnRfdGFwZShpbnQgc2VnbWVudF9pZCwgaW50IG9mZnNldCk7CitleHRlcm4gaW50ICBmdGFwZV9zdG9wX3RhcGUoaW50ICpwc3RhdHVzKTsKK2V4dGVybiBpbnQgIGZ0YXBlX2hhbmRsZV9sb2dpY2FsX2VvdCh2b2lkKTsKK2V4dGVybiBidWZmZXJfc3RhdGVfZW51bSBmdGFwZV9zZXRfc3RhdGUoYnVmZmVyX3N0YXRlX2VudW0gbmV3X3N0YXRlKTsKKyNlbmRpZgkJCQkvKiBfRlRBUEVfUldfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXNldHVwLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODBhMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXNldHVwLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtc2V0dXAuYyx2ICQKKyAqICRSZXZpc2lvbjogMS43ICQKKyAqICREYXRlOiAxOTk3LzEwLzEwIDA5OjU3OjA2ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSBmb3IgcHJvY2Vzc2luZyB0aGUga2VybmVsIGNvbW1hbmQKKyAqICAgICAgbGluZSBvcHRpb25zIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIKKyAqICAgICAgImZ0YXBlIiBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKKworc3RhdGljIHN0cnVjdCBwYXJhbV90YWJsZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKnZhcjsKKwlpbnQgZGVmX3BhcmFtOworCWludCBtaW47CisJaW50IG1heDsKK30gY29uZmlnX3BhcmFtc1tdIF9faW5pdGRhdGEgPSB7CisjaWZuZGVmIENPTkZJR19GVF9OT19UUkFDRV9BVF9BTEwKKwl7ICJ0cmFjaW5nIiwgICAmZnRhcGVfdHJhY2luZywgICAgIDMsICAgICAgICAgICAgICBmdF90X2J1ZywgZnRfdF9hbnl9LAorI2VuZGlmCisJeyAiaW9wb3J0IiwgICAgJmZ0X2ZkY19iYXNlLCAgICAgICBDT05GSUdfRlRfRkRDX0JBU0UsICAgICAweDAsIDB4ZmZmfSwKKwl7ICJpcnEiLCAgICAgICAmZnRfZmRjX2lycSwgICAgICAgIENPTkZJR19GVF9GRENfSVJRLCAgICAgICAgMiwgICAgMTV9LAorCXsgImRtYSIsICAgICAgICZmdF9mZGNfZG1hLCAgICAgICAgQ09ORklHX0ZUX0ZEQ19ETUEsICAgICAgICAwLCAgICAgM30sCisJeyAidGhyZXNob2xkIiwgJmZ0X2ZkY190aHJlc2hvbGQsICBDT05GSUdfRlRfRkRDX1RIUiwgICAgICAgICAxLCAgICAxNn0sCisJeyAiZGF0YXJhdGUiLCAgJmZ0X2ZkY19yYXRlX2xpbWl0LCBDT05GSUdfRlRfRkRDX01BWF9SQVRFLCA1MDAsICAyMDAwfSwKKwl7ICJmYzEwIiwgICAgICAmZnRfcHJvYmVfZmMxMCwgICAgIENPTkZJR19GVF9QUk9CRV9GQzEwLCAgICAgMCwgICAgIDF9LAorCXsgIm1hY2gyIiwgICAgICZmdF9tYWNoMiwgICAgICAgICAgQ09ORklHX0ZUX01BQ0gyLCAgICAgICAgICAwLCAgICAgMX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZ0YXBlX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaTsKKwlpbnQgcGFyYW07CisJaW50IGludHNbMl07CisKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJaWYgKHN0cikgeworCQlmb3IgKGk9MDsgaSA8IE5SX0lURU1TKGNvbmZpZ19wYXJhbXMpOyBpKyspIHsKKwkJCWlmIChzdHJjbXAoc3RyLGNvbmZpZ19wYXJhbXNbaV0ubmFtZSkgPT0gMCl7CisJCQkJaWYgKGludHNbMF0pIHsKKwkJCQkJcGFyYW0gPSBpbnRzWzFdOworCQkJCX0gZWxzZSB7CisJCQkJCXBhcmFtID0gY29uZmlnX3BhcmFtc1tpXS5kZWZfcGFyYW07CisJCQkJfQorCQkJCWlmIChwYXJhbSA8IGNvbmZpZ19wYXJhbXNbaV0ubWluIHx8CisJCQkJICAgIHBhcmFtID4gY29uZmlnX3BhcmFtc1tpXS5tYXgpIHsKKwkJCQkJVFJBQ0UoZnRfdF9lcnIsCisJCQkJCSJwYXJhbWV0ZXIgJXMgb3V0IG9mIHJhbmdlICVkIC4uLiAlZCIsCisJCQkJCSAgICAgIGNvbmZpZ19wYXJhbXNbaV0ubmFtZSwKKwkJCQkJICAgICAgY29uZmlnX3BhcmFtc1tpXS5taW4sCisJCQkJCSAgICAgIGNvbmZpZ19wYXJhbXNbaV0ubWF4KTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWlmKGNvbmZpZ19wYXJhbXNbaV0udmFyKSB7CisJCQkJCVRSQUNFKGZ0X3RfaW5mbywgIiVzPSVkIiwgc3RyLCBwYXJhbSk7CisJCQkJCSpjb25maWdfcGFyYW1zW2ldLnZhciA9IHBhcmFtOworCQkJCX0KKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoc3RyKSB7CisJCVRSQUNFKGZ0X3RfZXJyLCAidW5rbm93biBmdGFwZSBvcHRpb24gWyVzXSIsIHN0cik7CisJCQorCQlUUkFDRShmdF90X2VyciwgImFsbG93ZWQgb3B0aW9ucyBhcmU6Iik7CisJCWZvciAoaT0wOyBpIDwgTlJfSVRFTVMoY29uZmlnX3BhcmFtcyk7IGkrKykgeworCQkJVFJBQ0UoZnRfdF9lcnIsICIgJXMiLGNvbmZpZ19wYXJhbXNbaV0ubmFtZSk7CisJCX0KKwl9IGVsc2UgeworCQlUUkFDRShmdF90X2VyciwgImJvdGNoZWQgZnRhcGUgb3B0aW9uIik7CisJfQorIG91dDoKKwlUUkFDRV9FWElUIDE7Cit9CisKK19fc2V0dXAoImZ0YXBlPSIsIGZ0YXBlX3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZGM2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjI3ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcmVhZGluZyBjb2RlCisgKiAgICAgIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKworLyogICAgICBHbG9iYWwgdmFycy4KKyAqLworLyogICAgICB0cmFjaW5nCisgKiAgICAgIHNldCBpdCB0bzogICAgIHRvIGxvZyA6CisgKiAgICAgICAwICAgICAgICAgICAgICBidWdzCisgKiAgICAgICAxICAgICAgICAgICAgICArIGVycm9ycworICogICAgICAgMiAgICAgICAgICAgICAgKyB3YXJuaW5ncworICogICAgICAgMyAgICAgICAgICAgICAgKyBpbmZvcm1hdGlvbgorICogICAgICAgNCAgICAgICAgICAgICAgKyBtb3JlIGluZm9ybWF0aW9uCisgKiAgICAgICA1ICAgICAgICAgICAgICArIHByb2dyYW0gZmxvdworICogICAgICAgNiAgICAgICAgICAgICAgKyBmZGMvZG1hIGluZm8KKyAqICAgICAgIDcgICAgICAgICAgICAgICsgZGF0YSBmbG93CisgKiAgICAgICA4ICAgICAgICAgICAgICArIGV2ZXJ5dGhpbmcgZWxzZQorICovCitmdF90cmFjZV90IGZ0YXBlX3RyYWNpbmcgPSBmdF90X2luZm87IC8qIERlZmF1bHQgbGV2ZWw6IGluZm9ybWF0aW9uIGFuZCB1cCAqLworaW50ICBmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsOworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyBfX3U4IHRyYWNlX2lkOworc3RhdGljIGNoYXIgc3BhY2luZ1tdID0gIiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworCit2b2lkIGZ0YXBlX3RyYWNlX2NhbGwoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICppbmRlbnQ7CisKKwkvKiAgICBTaW5jZSBwcmludGsgc2VlbXMgbm90IHRvIHdvcmsgd2l0aCAiJSpzIiBmb3JtYXQKKwkgKiAgICB3ZSdsbCB1c2UgdGhpcyB3b3JrLWFyb3VuZC4KKwkgKi8KKwlpZiAoZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZnVuY3Rpb24gbmVzdCBsZXZlbCAoJWQpIDwgMFxuIiwKKwkJICAgICAgIGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwpOworCQlmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsID0gMDsKKwl9CisJaWYgKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwgPCBzaXplb2Yoc3BhY2luZykpIHsKKwkJaW5kZW50ID0gKHNwYWNpbmcgKworCQkJICBzaXplb2Yoc3BhY2luZykgLSAxIC0KKwkJCSAgZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCk7CisJfSBlbHNlIHsKKwkJaW5kZW50ID0gc3BhY2luZzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiWyUwM2RdJXMrJXMgKCVzKVxuIiwKKwkgICAgICAgKGludCkgdHJhY2VfaWQrKywgaW5kZW50LCBmaWxlLCBuYW1lKTsKK30KKwordm9pZCBmdGFwZV90cmFjZV9leGl0KGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqaW5kZW50OworCisJLyogICAgU2luY2UgcHJpbnRrIHNlZW1zIG5vdCB0byB3b3JrIHdpdGggIiUqcyIgZm9ybWF0CisJICogICAgd2UnbGwgdXNlIHRoaXMgd29yay1hcm91bmQuCisJICovCisJaWYgKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImZ1bmN0aW9uIG5lc3QgbGV2ZWwgKCVkKSA8IDBcbiIsIGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwpOworCQlmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsID0gMDsKKwl9CisJaWYgKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwgPCBzaXplb2Yoc3BhY2luZykpIHsKKwkJaW5kZW50ID0gKHNwYWNpbmcgKworCQkJICBzaXplb2Yoc3BhY2luZykgLSAxIC0KKwkJCSAgZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCk7CisJfSBlbHNlIHsKKwkJaW5kZW50ID0gc3BhY2luZzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiWyUwM2RdJXMtJXMgKCVzKVxuIiwKKwkgICAgICAgKGludCkgdHJhY2VfaWQrKywgaW5kZW50LCBmaWxlLCBuYW1lKTsKK30KKwordm9pZCBmdGFwZV90cmFjZV9sb2coY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqZnVuY3Rpb24pCit7CisJY2hhciAqaW5kZW50OworCisJLyogICAgU2luY2UgcHJpbnRrIHNlZW1zIG5vdCB0byB3b3JrIHdpdGggIiUqcyIgZm9ybWF0CisJICogICAgd2UnbGwgdXNlIHRoaXMgd29yay1hcm91bmQuCisJICovCisJaWYgKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImZ1bmN0aW9uIG5lc3QgbGV2ZWwgKCVkKSA8IDBcbiIsIGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwpOworCQlmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsID0gMDsKKwl9CisJaWYgKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwgPCBzaXplb2Yoc3BhY2luZykpIHsKKwkJaW5kZW50ID0gKHNwYWNpbmcgKyAKKwkJCSAgc2l6ZW9mKHNwYWNpbmcpIC0gMSAtIAorCQkJICBmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsKTsKKwl9IGVsc2UgeworCQlpbmRlbnQgPSBzcGFjaW5nOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJbJTAzZF0lcyVzICglcykgLSAiLCAKKwkgICAgICAgKGludCkgdHJhY2VfaWQrKywgaW5kZW50LCBmaWxlLCBmdW5jdGlvbik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTdjZDIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaApAQCAtMCwwICsxLDE4MCBAQAorI2lmbmRlZiBfRlRBUEVfVFJBQ0lOR19ICisjZGVmaW5lIF9GVEFQRV9UUkFDSU5HX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjI4ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyB0aGF0IGVhc2VzIHRoZSBkZWJ1Z2dpbmcgb2YgdGhlCisgKiAgICAgIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyICJmdGFwZSIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworLyoKKyAqICBCZSB2ZXJ5IGNhcmVmdWwgd2l0aCBUUkFDRV9FWElUIGFuZCBUUkFDRV9BQk9SVC4KKyAqCisgKiAgaWYgKHNvbWV0aGluZykgVFJBQ0VfRVhJVCBlcnJvcjsKKyAqCisgKiAgd2lsbCBOT1Qgd29yay4gVXNlCisgKgorICogIGlmIChzb21ldGhpbmcpIHsKKyAqICAgIFRSQUNFX0VYSVQgZXJyb3I7CisgKiAgfQorICoKKyAqICBpbnN0ZWFkLiBNYXliZSBhIGJpdCBkYW5nZXJvdXMsIGJ1dCBzYXZlIGxvdHMgb2YgbGluZXMgb2YgY29kZS4KKyAqLworCisjZGVmaW5lIExMX1ggIiVkLyVkIEtCIgorI2RlZmluZSBMTCh4KSAodW5zaWduZWQgaW50KSgoX191NjQpKHgpPj4xMCksICh1bnNpZ25lZCBpbnQpKCh4KSYxMDIzKQorCit0eXBlZGVmIGVudW0geworCWZ0X3RfbmlsID0gLTEsCisJZnRfdF9idWcsCisJZnRfdF9lcnIsCisJZnRfdF93YXJuLAorCWZ0X3RfaW5mbywKKwlmdF90X25vaXNlLAorCWZ0X3RfZmxvdywKKwlmdF90X2ZkY19kbWEsCisJZnRfdF9kYXRhX2Zsb3csCisJZnRfdF9hbnkKK30gZnRfdHJhY2VfdDsKKworI2lmZGVmICBDT05GSUdfRlRfTk9fVFJBQ0VfQVRfQUxMCisvKiAgdGhlIGNvbXBpbGVyIHdpbGwgb3B0aW1pemUgYXdheSBtb3N0IFRSQUNFKCkgbWFjcm9zCisgKi8KKyNkZWZpbmUgRlRfVFJBQ0VfVE9QX0xFVkVMCWZ0X3RfYnVnCisjZGVmaW5lIFRSQUNFX0ZVTihsZXZlbCkJZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgVFJBQ0VfRVhJVAkJcmV0dXJuCisjZGVmaW5lIFRSQUNFKGwsIG0sIGkuLi4pCQkJCQkJXAorewkJCQkJCQkJCVwKKwlpZiAoKGZ0X3RyYWNlX3QpKGwpID09IEZUX1RSQUNFX1RPUF9MRVZFTCkgewkJCVwKKwkJcHJpbnRrKEtFUk5fSU5GTyJmdGFwZSVzKCVzKTpcbiIJICAgICAgICAgICAgICAgIFwKKwkJICAgICAgIEtFUk5fSU5GTyBtIi5cbiIgLF9fRklMRV9fLCBfX0ZVTkNUSU9OX18gLCAjI2kpOwlcCisJfQkJCQkJCQkJXAorfQorI2RlZmluZSBTRVRfVFJBQ0VfTEVWRUwobCkgICAgICBpZiAoKGwpID09IChsKSkgZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgVFJBQ0VfTEVWRUwJCUZUX1RSQUNFX1RPUF9MRVZFTAorCisjZWxzZQorCisjaWZkZWYgQ09ORklHX0ZUX05PX1RSQUNFCisvKiAgdGhlIGNvbXBpbGVyIHdpbGwgb3B0aW1pemUgYXdheSBtYW55IFRSQUNFKCkgbWFjcm9zCisgKiAgdGhlIGZ0YXBlX3NpbXBsZV90cmFjZV9jYWxsKCkgZnVuY3Rpb24gc2ltcGx5IGluY3JlbWVudHMgCisgKiAgdGhlIGZ1bmN0aW9uIG5lc3QgbGV2ZWwuCisgKi8gCisjZGVmaW5lIEZUX1RSQUNFX1RPUF9MRVZFTAlmdF90X3dhcm4KKyNkZWZpbmUgVFJBQ0VfRlVOKGxldmVsKQlmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsKysKKyNkZWZpbmUgVFJBQ0VfRVhJVAkJZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbC0tOyByZXR1cm4KKworI2Vsc2UKKyNpZmRlZiBDT05GSUdfRlRfRlVMTF9ERUJVRworI2RlZmluZSBGVF9UUkFDRV9UT1BfTEVWRUwgZnRfdF9hbnkKKyNlbHNlCisjZGVmaW5lIEZUX1RSQUNFX1RPUF9MRVZFTCBmdF90X2Zsb3cKKyNlbmRpZgorI2RlZmluZSBUUkFDRV9GVU4obGV2ZWwpCQkJCQlcCisJY29uc3QgZnRfdHJhY2VfdCBfdHJhY2luZyA9IGxldmVsOwkJCVwKKwlpZiAoZnRhcGVfdHJhY2luZyA+PSAoZnRfdHJhY2VfdCkobGV2ZWwpICYmCQlcCisJICAgIChmdF90cmFjZV90KShsZXZlbCkgPD0gRlRfVFJBQ0VfVE9QX0xFVkVMKQkJXAorCQlmdGFwZV90cmFjZV9jYWxsKF9fRklMRV9fLCBfX0ZVTkNUSU9OX18pOwlcCisJZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCArKzsKKworI2RlZmluZSBUUkFDRV9FWElUCQkJCQkJXAorCS0tZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbDsJCQkJXAorCWlmIChmdGFwZV90cmFjaW5nID49IChmdF90cmFjZV90KShfdHJhY2luZykgJiYJCVwKKwkgICAgKGZ0X3RyYWNlX3QpKF90cmFjaW5nKSA8PSBGVF9UUkFDRV9UT1BfTEVWRUwpCVwKKwkJZnRhcGVfdHJhY2VfZXhpdChfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsJXAorCXJldHVybgorCisjZW5kaWYKKworI2RlZmluZSBUUkFDRShsLCBtLCBpLi4uKQkJCQkJXAorewkJCQkJCQkJXAorCWlmIChmdGFwZV90cmFjaW5nID49IChmdF90cmFjZV90KShsKSAmJgkJCVwKKwkgICAgKGZ0X3RyYWNlX3QpKGwpIDw9IEZUX1RSQUNFX1RPUF9MRVZFTCkgewkJXAorCQlmdGFwZV90cmFjZV9sb2coX19GSUxFX18sIF9fRlVOQ1RJT05fXyk7CVwKKwkJcHJpbnRrKG0iLlxuIiAsIyNpKTsJCQkJXAorCX0JCQkJCQkJXAorfQorCisjZGVmaW5lIFNFVF9UUkFDRV9MRVZFTChsKSAJCQkJXAorewkJCQkJCQlcCisJaWYgKChmdF90cmFjZV90KShsKSA8PSBGVF9UUkFDRV9UT1BfTEVWRUwpIHsJXAorCQlmdGFwZV90cmFjaW5nID0gKGZ0X3RyYWNlX3QpKGwpOwlcCisJfSBlbHNlIHsJCQkJCVwKKwkJZnRhcGVfdHJhY2luZyA9IEZUX1RSQUNFX1RPUF9MRVZFTDsJXAorCX0JCQkJCQlcCit9CisjZGVmaW5lIFRSQUNFX0xFVkVMICAgIAkJCQkJCQkgICAgIFwKKygoZnRhcGVfdHJhY2luZyA8PSBGVF9UUkFDRV9UT1BfTEVWRUwpID8gZnRhcGVfdHJhY2luZyA6IEZUX1RSQUNFX1RPUF9MRVZFTCkKKworCisvKiAgICAgIEdsb2JhbCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdHJhY2luZy5jCisgKi8KK2V4dGVybiBmdF90cmFjZV90IGZ0YXBlX3RyYWNpbmc7ICAvKiBzZXRzIGRlZmF1bHQgbGV2ZWwgKi8KK2V4dGVybiBpbnQgZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbDsKKworLyogICAgICBHbG9iYWwgZnVuY3Rpb25zIGRlY2xhcmVkIGluIHRyYWNpbmcuYworICovCitleHRlcm4gdm9pZCBmdGFwZV90cmFjZV9jYWxsKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIHZvaWQgZnRhcGVfdHJhY2VfZXhpdChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIGZ0YXBlX3RyYWNlX2xvZyAoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbmFtZSk7CisKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfRlRfTk9fVFJBQ0VfQVRfQUxMKSAqLworCisvKgorICogICBBYm9ydCB3aXRoIGEgbWVzc2FnZS4KKyAqLworI2RlZmluZSBUUkFDRV9BQk9SVChyZXMsIGkuLi4pCQkJXAorewkJCQkJCVwKKyAJVFJBQ0UoaSk7CQkJCVwKKwlUUkFDRV9FWElUIHJlczsJCQkJXAorfQorCisvKiAgIFRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtcyB0aGUgY29tbW9uICJpZihyZXN1bHQgPCAwKSAuLi4gIiBpbnRvIGEKKyAqICAgb25lLWxpbmVyLgorICovCisjZGVmaW5lIF9UUkFDRV9DQVRDSChsZXZlbCwgZnVuLCBhY3Rpb24pCQkJCVwKK3sJCQkJCQkJCQlcCisJaW50IF9yZXMgPSAoZnVuKTsJCQkJCQlcCisJaWYgKF9yZXMgPCAwKSB7CQkJCQkJCVwKKwkJZG8geyBhY3Rpb24gLyogKi8gOyB9IHdoaWxlKDApOwkJCQlcCisJCVRSQUNFX0FCT1JUKF9yZXMsIGxldmVsLCAiJXMgZmFpbGVkOiAlZCIsICNmdW4sCV9yZXMpOwlcCisJfQkJCQkJCQkJXAorfQorCisjZGVmaW5lIFRSQUNFX0NBVENIKGZ1biwgZmFpbCkgX1RSQUNFX0NBVENIKGZ0X3RfZXJyLCBmdW4sIGZhaWwpCisKKy8qICBBYm9ydCB0aGUgY3VycmVudCBmdW5jdGlvbiB3aGVuIHNpZ25hbGxlZC4gVGhpcyBkb2Vzbid0IGJlbG9uZyBoZXJlLAorICogIGJ1dCByYXRoZXIgaW50byBmdGFwZS1ydy5oIChtYXliZSkKKyAqLworI2RlZmluZSBGVF9TSUdOQUxfRVhJVChzaWdfbWFzaykJCQkJCVwKKwlpZiAoc2lndGVzdHNldG1hc2soJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBzaWdfbWFzaykpIHsJXAorCQlUUkFDRV9BQk9SVCgtRUlOVFIsCQkJCQlcCisJCQkgICAgZnRfdF93YXJuLAkJCQkJXAorCQkJICAgICJpbnRlcnJ1cHRlZCBieSBub24tYmxvY2thYmxlIHNpZ25hbCIpOwlcCisJfQorCisjZW5kaWYgLyogX0ZUQVBFX1RSQUNJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYwMWVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmMKQEAgLTAsMCArMSwzMzYgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5My0xOTk1IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtd3JpdGUuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4zLjQuMSAkCisgKiAkRGF0ZTogMTk5Ny8xMS8xNCAxODowNzowNCAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHdyaXRpbmcgY29kZQorICogICAgICBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtd3JpdGUuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWVjYy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pc3IuaCIKKworLyogICAgICBHbG9iYWwgdmFycy4KKyAqLworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyBpbnQgbGFzdF93cml0ZV9mYWlsZWQ7CisKK3ZvaWQgZnRhcGVfemFwX3dyaXRlX2J1ZmZlcnModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBmdF9ucl9idWZmZXJzOyArK2kpIHsKKwkJZnRfYnVmZmVyW2ldLT5zdGF0dXMgPSBkb25lOworCX0KKwlmdGFwZV9yZXNldF9idWZmZXIoKTsKK30KKworc3RhdGljIGludCBjb3B5X2FuZF9nZW5fZWNjKHZvaWQgKmRlc3RpbmF0aW9uLCAKKwkJCSAgICBjb25zdCB2b2lkICpzb3VyY2UsCisJCQkgICAgY29uc3QgU2VjdG9yTWFwIGJhZF9zZWN0b3JfbWFwKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IG1lbW9yeV9zZWdtZW50IG1zZWc7CisJaW50IGJhZHMgPSBjb3VudF9vbmVzKGJhZF9zZWN0b3JfbWFwKTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGJhZHMgPiAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJiYWQgc2VjdG9ycyBpbiBtYXA6ICVkIiwgYmFkcyk7CisJfQorCWlmIChiYWRzICsgMyA+PSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlbXB0eSBzZWdtZW50Iik7CisJCW1zZWcuYmxvY2tzID0gMDsgLyogc2tpcCBlbnRpcmUgc2VnbWVudCAqLworCQlyZXN1bHQgPSAwOyAgICAgIC8qIG5vdGhpbmcgd3JpdHRlbiAqLworCX0gZWxzZSB7CisJCW1zZWcuYmxvY2tzID0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIGJhZHM7CisJCW1zZWcuZGF0YSA9IGRlc3RpbmF0aW9uOworCQltZW1jcHkobXNlZy5kYXRhLCBzb3VyY2UsIChtc2VnLmJsb2NrcyAtIDMpICogRlRfU0VDVE9SX1NJWkUpOworCQlyZXN1bHQgPSBmdGFwZV9lY2Nfc2V0X3NlZ21lbnRfcGFyaXR5KCZtc2VnKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiZWNjX3NldF9zZWdtZW50X3Bhcml0eSBmYWlsZWQiKTsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IChtc2VnLmJsb2NrcyAtIDMpICogRlRfU0VDVE9SX1NJWkU7CisJCX0KKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKworaW50IGZ0YXBlX3N0YXJ0X3dyaXRpbmcoY29uc3QgZnRfd3JpdGVfbW9kZV90IG1vZGUpCit7CisJYnVmZmVyX3N0cnVjdCAqaGVhZCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCk7CisJaW50IHNlZ21lbnRfaWQgPSBoZWFkLT5zZWdtZW50X2lkOworCWludCByZXN1bHQ7CisJYnVmZmVyX3N0YXRlX2VudW0gd2FudGVkX3N0YXRlID0gKG1vZGUgPT0gRlRfV1JfREVMRVRFCisJCQkJCSAgPyBkZWxldGluZworCQkJCQkgIDogd3JpdGluZyk7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoKGZ0X2RyaXZlcl9zdGF0ZSAhPSB3YW50ZWRfc3RhdGUpIHx8IGhlYWQtPnN0YXR1cyAhPSB3YWl0aW5nKSB7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJZnRhcGVfc2V0dXBfbmV3X3NlZ21lbnQoaGVhZCwgc2VnbWVudF9pZCwgMSk7CisJaWYgKG1vZGUgPT0gRlRfV1JfU0lOR0xFKSB7CisJCS8qIHN0b3AgdGFwZSBpbnN0ZWFkIG9mIHBhdXNlICovCisJCWhlYWQtPm5leHRfc2VnbWVudCA9IDA7CisJfQorCWZ0YXBlX2NhbGNfbmV4dF9jbHVzdGVyKGhlYWQpOyAvKiBwcmVwYXJlICovCisJaGVhZC0+c3RhdHVzID0gZnRfZHJpdmVyX3N0YXRlOyAvKiBlaXRoZXIgd3JpdGluZyBvciBkZWxldGluZyAqLworCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGlkbGUpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJICAgICAgInN0YXJ0aW5nIHJ1bm5lciBmb3Igc2VnbWVudCAlZCIsIHNlZ21lbnRfaWQpOworCQlUUkFDRV9DQVRDSChmdGFwZV9zdGFydF90YXBlKHNlZ21lbnRfaWQsaGVhZC0+c2VjdG9yX29mZnNldCksKTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X25vaXNlLCAicnVubmVyIG5vdCBpZGxlLCBub3Qgc3RhcnRpbmcgdGFwZSIpOworCX0KKwkvKiBnbyAqLworCXJlc3VsdCA9IGZkY19zZXR1cF9yZWFkX3dyaXRlKGhlYWQsIChtb2RlID09IEZUX1dSX0RFTEVURQorCQkJCQkgICAgID8gRkRDX1dSSVRFX0RFTEVURUQgOiBGRENfV1JJVEUpKTsKKwlmdGFwZV9zZXRfc3RhdGUod2FudGVkX3N0YXRlKTsgLyogc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgKi8KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogIFdhaXQgdW50aWwgYWxsIGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiB0byB0YXBlLgorICogIAorICogIFRoZXJlIGlzIGEgcHJvYmxlbTogd2hlbiB0aGUgdGFwZSBydW5zIGludG8gbG9naWNhbCBFT1QsIHRoZW4gdGhpcworICogIGZhaWxlcy4gV2UgbmVlZCB0byByZXN0YXJ0IHRoZSBydW5uZXIgaW4gdGhpcyBjYXNlLgorICovCitpbnQgZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSh2b2lkKQoreworCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwl3aGlsZSAoKGZ0X2RyaXZlcl9zdGF0ZSA9PSB3cml0aW5nIHx8IGZ0X2RyaXZlcl9zdGF0ZSA9PSBkZWxldGluZykgJiYgCisJICAgICAgIGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCktPnN0YXR1cyAhPSBkb25lKSB7CisJCS8qIHNldCB0aGUgcnVubmVyIHN0YXR1cyB0byBpZGxlIGlmIGF0IGxFT1QgKi8KKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfaGFuZGxlX2xvZ2ljYWxfZW90KCksCWxhc3Rfd3JpdGVfZmFpbGVkID0gMSk7CisJCS8qIHJlc3RhcnQgdGhlIHRhcGUgaWYgbmVjZXNzYXJ5ICovCisJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGlkbGUpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJydW5uZXIgaXMgaWRsZSwgcmVzdGFydGluZyIpOworCQkJaWYgKGZ0X2RyaXZlcl9zdGF0ZSA9PSBkZWxldGluZykgeworCQkJCVRSQUNFX0NBVENIKGZ0YXBlX3N0YXJ0X3dyaXRpbmcoRlRfV1JfREVMRVRFKSwKKwkJCQkJICAgIGxhc3Rfd3JpdGVfZmFpbGVkID0gMSk7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFX0NBVENIKGZ0YXBlX3N0YXJ0X3dyaXRpbmcoRlRfV1JfTVVMVEkpLAorCQkJCQkgICAgbGFzdF93cml0ZV9mYWlsZWQgPSAxKTsKKwkJCX0KKwkJfQorCQlUUkFDRShmdF90X25vaXNlLCAidGFpbDogJWQsIGhlYWQ6ICVkIiwgCisJCSAgICAgIGZ0YXBlX2J1ZmZlcl9pZChmdF9xdWV1ZV90YWlsKSwKKwkJICAgICAgZnRhcGVfYnVmZmVyX2lkKGZ0X3F1ZXVlX2hlYWQpKTsKKwkJVFJBQ0VfQ0FUQ0goZmRjX2ludGVycnVwdF93YWl0KDUgKiBGVF9TRUNPTkQpLAorCQkJICAgIGxhc3Rfd3JpdGVfZmFpbGVkID0gMSk7CisJCWhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCQlpZiAoaGVhZC0+c3RhdHVzID09IGVycm9yKSB7CisJCQkvKiBBbGxvdyBlc2NhcGUgZnJvbSBsb29wIHdoZW4gc2lnbmFsZWQgIQorCQkJICovCisJCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCQlpZiAoaGVhZC0+aGFyZF9lcnJvcl9tYXAgIT0gMCkgeworCQkJCS8qICBJbXBsZW1lbnQgaGFyZCB3cml0ZSBlcnJvciByZWNvdmVyeSBoZXJlCisJCQkJICovCisJCQl9CisJCQkvKiByZXRyeSB0aGlzIG9uZSAqLworCQkJaGVhZC0+c3RhdHVzID0gd2FpdGluZzsKKwkJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGFib3J0aW5nKSB7CisJCQkJZnRhcGVfZHVtYl9zdG9wKCk7CisJCQl9CisJCQlpZiAoZnRfcnVubmVyX3N0YXR1cyAhPSBpZGxlKSB7CisJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkJCSAgICAidW5leHBlY3RlZCBzdGF0ZTogIgorCQkJCQkgICAgImZ0X3J1bm5lcl9zdGF0dXMgIT0gaWRsZSIpOworCQkJfQorCQkJZnRhcGVfc3RhcnRfd3JpdGluZyhmdF9kcml2ZXJfc3RhdGUgPT0gZGVsZXRpbmcKKwkJCQkJICAgID8gRlRfV1JfTVVMVEkgOiBGVF9XUl9ERUxFVEUpOworCQl9CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJsb29waW5nIHVudGlsIHdyaXRlcyBkb25lIik7CisJfQorCWZ0YXBlX3NldF9zdGF0ZShpZGxlKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICAgICAgV3JpdGUgZ2l2ZW4gc2VnbWVudCBmcm9tIGJ1ZmZlciBhdCBhZGRyZXNzIHRvIHRhcGUuCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfc2VnbWVudChjb25zdCBpbnQgc2VnbWVudF9pZCwKKwkJCSBjb25zdCB2b2lkICphZGRyZXNzLCAKKwkJCSBjb25zdCBmdF93cml0ZV9tb2RlX3Qgd3JpdGVfbW9kZSkKK3sKKwlpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7CisJYnVmZmVyX3N0cnVjdCAqdGFpbDsKKwlidWZmZXJfc3RhdGVfZW51bSB3YW50ZWRfc3RhdGUgPSAod3JpdGVfbW9kZSA9PSBGVF9XUl9ERUxFVEUKKwkJCQkJICA/IGRlbGV0aW5nIDogd3JpdGluZyk7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlUUkFDRShmdF90X25vaXNlLCAic2VnbWVudF9pZCA9ICVkIiwgc2VnbWVudF9pZCk7CisJaWYgKGZ0X2RyaXZlcl9zdGF0ZSAhPSB3YW50ZWRfc3RhdGUpIHsKKwkJaWYgKGZ0X2RyaXZlcl9zdGF0ZSA9PSBkZWxldGluZyB8fAorCQkgICAgd2FudGVkX3N0YXRlID09IGRlbGV0aW5nKSB7CisJCQlUUkFDRV9DQVRDSChmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCksKTsKKwkJfQorCQlUUkFDRShmdF90X25vaXNlLCAiY2FsbGluZyBmdGFwZV9hYm9ydF9vcGVyYXRpb24iKTsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCksKTsKKwkJZnRhcGVfemFwX3dyaXRlX2J1ZmZlcnMoKTsKKwkJZnRhcGVfc2V0X3N0YXRlKHdhbnRlZF9zdGF0ZSk7CisJfQorCS8qICAgIGlmIGFsbCBidWZmZXJzIGZ1bGwgd2UnbGwgaGF2ZSB0byB3YWl0Li4uCisJICovCisJZnRhcGVfd2FpdF9zZWdtZW50KHdhbnRlZF9zdGF0ZSk7CisJdGFpbCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfdGFpbCk7CisJc3dpdGNoKHRhaWwtPnN0YXR1cykgeworCWNhc2UgZG9uZToKKwkJZnRfaGlzdG9yeS5kZWZlY3RzICs9IGNvdW50X29uZXModGFpbC0+aGFyZF9lcnJvcl9tYXApOworCQlicmVhazsKKwljYXNlIHdhaXRpbmc6CisJCS8qIHRoaXMgY291bGQgaGFwcGVuIHdpdGggbXVsdGlwbGUgRU1QVFlfU0VHTUVOVHMsIGJ1dAorCQkgKiBzaG91bGRuJ3QgaGFwcGVuIGFueSBtb3JlIGFzIHdlIHJlLXN0YXJ0IHRoZSBydW5uZXIgZXZlbgorCQkgKiB3aXRoIGFuIGVtcHR5IHNlZ21lbnQuCisJCSAqLworCQlieXRlc193cml0dGVuID0gLUVBR0FJTjsKKwkJYnJlYWs7CisJY2FzZSBlcnJvcjoKKwkJLyogIHNldHVwIGZvciBhIHJldHJ5CisJCSAqLworCQl0YWlsLT5zdGF0dXMgPSB3YWl0aW5nOworCQlieXRlc193cml0dGVuID0gLUVBR0FJTjsgLyogZm9yY2UgcmV0cnkgKi8KKwkJaWYgKHRhaWwtPmhhcmRfZXJyb3JfbWFwICE9IDApIHsKKwkJCVRSQUNFKGZ0X3Rfd2FybiwgCisJCQkgICAgICAid2FybmluZzogJWQgaGFyZCBlcnJvcihzKSBpbiB3cml0dGVuIHNlZ21lbnQiLAorCQkJICAgICAgY291bnRfb25lcyh0YWlsLT5oYXJkX2Vycm9yX21hcCkpOworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImhhcmRfZXJyb3JfbWFwID0gMHglMDhseCIsIAorCQkJICAgICAgKGxvbmcpdGFpbC0+aGFyZF9lcnJvcl9tYXApOworCQkJLyogIEltcGxlbWVudCBoYXJkIHdyaXRlIGVycm9yIHJlY292ZXJ5IGhlcmUKKwkJCSAqLworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJ3YWl0IGZvciBlbXB0eSBzZWdtZW50IGZhaWxlZCwgdGFpbCBzdGF0dXM6ICVkIiwKKwkJCSAgICB0YWlsLT5zdGF0dXMpOworCX0KKwkvKiAgICBzaG91bGQgcnVubmVyIHN0b3AgPworCSAqLworCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGFib3J0aW5nKSB7CisJCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCQlpZiAoaGVhZC0+c3RhdHVzID09IHdhbnRlZF9zdGF0ZSkgeworCQkJaGVhZC0+c3RhdHVzID0gZG9uZTsgLyogPz8/PyAqLworCQl9CisJCS8qICBkb24ndCBjYWxsIGFib3J0X29wZXJhdGlvbigpLCB3ZSBkb24ndCB3YW50IHRvIHphcAorCQkgKiAgdGhlIGRtYSBidWZmZXJzCisJCSAqLworCQlUUkFDRV9DQVRDSChmdGFwZV9kdW1iX3N0b3AoKSwpOworCX0gZWxzZSB7CisJCS8qICBJZiBqdXN0IHBhc3NlZCBsYXN0IHNlZ21lbnQgb24gdGFwZTogd2FpdCBmb3IgQk9UCisJCSAqICBvciBFT1QgbWFyay4gU2V0cyBmdF9ydW5uZXJfc3RhdHVzIHRvIGlkbGUgaWYgYXQgbEVPVAorCQkgKiAgYW5kIHN1Y2Nlc3NmdWwgCisJCSAqLworCQlUUkFDRV9DQVRDSChmdGFwZV9oYW5kbGVfbG9naWNhbF9lb3QoKSwpOworCX0KKwlpZiAodGFpbC0+c3RhdHVzID09IGRvbmUpIHsKKwkJLyogbm93IGF0IGxlYXN0IG9uZSBidWZmZXIgaXMgZW1wdHksIGZpbGwgaXQgd2l0aCBvdXIKKwkJICogZGF0YS4gIHNraXAgYmFkIHNlY3RvcnMgYW5kIGdlbmVyYXRlIGVjYy4KKwkJICogY29weV9hbmRfZ2VuX2VjYyByZXR1cm4gbnIgb2YgYnl0ZXMgd3JpdHRlbiwgcmFuZ2UKKwkJICogMC4uMjkgS2IgaW5jbHVzaXZlISAgCisJCSAqCisJCSAqIEVtcHR5IHNlZ21lbnRzIGFyZSBoYW5kbGVkIGluc2lkZSBjb3lwX2FuZF9nZW5fZWNjKCkKKwkJICovCisJCWlmICh3cml0ZV9tb2RlICE9IEZUX1dSX0RFTEVURSkgeworCQkJVFJBQ0VfQ0FUQ0goYnl0ZXNfd3JpdHRlbiA9IGNvcHlfYW5kX2dlbl9lY2MoCisJCQkJdGFpbC0+YWRkcmVzcywgYWRkcmVzcywKKwkJCQlmdGFwZV9nZXRfYmFkX3NlY3Rvcl9lbnRyeShzZWdtZW50X2lkKSksKTsKKwkJfQorCQl0YWlsLT5zZWdtZW50X2lkID0gc2VnbWVudF9pZDsKKwkJdGFpbC0+c3RhdHVzID0gd2FpdGluZzsKKwkJdGFpbCA9IGZ0YXBlX25leHRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOworCX0KKwkvKiAgU3RhcnQgdGFwZSBvbmx5IGlmIGFsbCBidWZmZXJzIGZ1bGwgb3IgZmx1c2ggbW9kZS4KKwkgKiAgVGhpcyB3aWxsIGdpdmUgaGlnaGVyIHByb2JhYmlsaXR5IG9mIHN0cmVhbWluZy4KKwkgKi8KKwlpZiAoZnRfcnVubmVyX3N0YXR1cyAhPSBydW5uaW5nICYmIAorCSAgICAoKHRhaWwtPnN0YXR1cyA9PSB3YWl0aW5nICYmCisJICAgICAgZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKSA9PSB0YWlsKSB8fAorCSAgICAgd3JpdGVfbW9kZSAhPSBGVF9XUl9BU1lOQykpIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfc3RhcnRfd3JpdGluZyh3cml0ZV9tb2RlKSwpOworCX0KKwlUUkFDRV9FWElUIGJ5dGVzX3dyaXR0ZW47Cit9CisKKy8qICBXcml0ZSBhcyBtdWNoIGFzIGZpdHMgZnJvbSBidWZmZXIgdG8gdGhlIGdpdmVuIHNlZ21lbnQgb24gdGFwZQorICogIGFuZCBoYW5kbGUgcmV0cmllcy4KKyAqICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuICg+PSAwKSwgb3I6CisgKiAgICAgIC1FSU8gICAgICAgICAgd3JpdGUgZmFpbGVkCisgKiAgICAgIC1FSU5UUiAgICAgICAgaW50ZXJydXB0ZWQgYnkgc2lnbmFsCisgKiAgICAgIC1FTk9TUEMgICAgICAgZGV2aWNlIGZ1bGwKKyAqLworaW50IGZ0YXBlX3dyaXRlX3NlZ21lbnQoY29uc3QgaW50IHNlZ21lbnRfaWQsCisJCQljb25zdCB2b2lkICpidWZmZXIsIAorCQkJY29uc3QgZnRfd3JpdGVfbW9kZV90IGZsdXNoKQoreworCWludCByZXRyeSA9IDA7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWZ0X2hpc3RvcnkudXNlZCB8PSAyOworCWlmIChzZWdtZW50X2lkID49IGZ0X3RyYWNrc19wZXJfdGFwZSpmdF9zZWdtZW50c19wZXJfdHJhY2spIHsKKwkJLyogdGFwZSBmdWxsICovCisJCVRSQUNFX0FCT1JUKC1FTk9TUEMsIGZ0X3RfZXJyLAorCQkJICAgICJpbnZhbGlkIHNlZ21lbnQgaWQ6ICVkIChtYXggJWQpIiwgCisJCQkgICAgc2VnbWVudF9pZCwgCisJCQkgICAgZnRfdHJhY2tzX3Blcl90YXBlICogZnRfc2VnbWVudHNfcGVyX3RyYWNrIC0xKTsKKwl9CisJZm9yICg7OykgeworCQlpZiAoKHJlc3VsdCA9IHdyaXRlX3NlZ21lbnQoc2VnbWVudF9pZCwgYnVmZmVyLCBmbHVzaCkpID49IDApIHsKKwkJCWlmIChyZXN1bHQgPT0gMCkgeyAvKiBlbXB0eSBzZWdtZW50ICovCisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkgICAgICAiZW1wdHkgc2VnbWVudCwgbm90aGluZyB3cml0dGVuIik7CisJCQl9CisJCQlUUkFDRV9FWElUIHJlc3VsdDsKKwkJfQorCQlpZiAocmVzdWx0ID09IC1FQUdBSU4pIHsKKwkJCWlmICgrK3JldHJ5ID4gMTAwKSB7IC8qIGdpdmUgdXAgKi8KKwkJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKKwkJCQkgICAgICAid3JpdGUgZmFpbGVkLCA+MTAwIHJldHJpZXMgaW4gc2VnbWVudCIpOworCQkJfQorCQkJVFJBQ0UoZnRfdF93YXJuLCAid3JpdGUgZXJyb3IsIHJldHJ5ICVkICglZCkiLAorCQkJICAgICAgcmV0cnksCisJCQkgICAgICBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpLT5zZWdtZW50X2lkKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFX0FCT1JUKHJlc3VsdCwgZnRfdF9lcnIsCisJCQkJICAgICJ3cml0ZV9zZWdtZW50IGZhaWxlZCwgZXJyb3I6ICVkIiwgcmVzdWx0KTsKKwkJfQorCQkvKiBBbGxvdyBlc2NhcGUgZnJvbSBsb29wIHdoZW4gc2lnbmFsZWQgIQorCQkgKi8KKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS13cml0ZS5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3Zjg5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS13cml0ZS5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0ZUQVBFX1dSSVRFX0gKKyNkZWZpbmUgX0ZUQVBFX1dSSVRFX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk1IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS13cml0ZS5oLHYgJAorICRBdXRob3I6IGNsYXVzICQKKyAqCisgJFJldmlzaW9uOiAxLjIgJAorICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjMwICQKKyAkU3RhdGU6IEV4cCAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgd3JpdGUgZnVuY3Rpb25zCisgKiAgICAgIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqLworCisKKy8qICAgICAgZnRhcGUtd3JpdGUuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJRlRfV1JfQVNZTkMgID0gMCwgLyogc3RhcnQgdGFwZSBvbmx5IHdoZW4gYWxsIGJ1ZmZlcnMgYXJlIGZ1bGwgKi8KKwlGVF9XUl9NVUxUSSAgPSAxLCAvKiBzdGFydCB0YXBlLCBidXQgZG9uJ3QgbmVjZXNzYXJpbHkgc3RvcCAqLworCUZUX1dSX1NJTkdMRSA9IDIsIC8qIHdyaXRlIGEgc2luZ2xlIHNlZ21lbnQgYW5kIHN0b3AgYWZ0ZXJ3YXJkcyAqLworCUZUX1dSX0RFTEVURSA9IDMgIC8qIHdyaXRlIGRlbGV0ZWQgZGF0YSBtYXJrcyAqLworfSBmdF93cml0ZV9tb2RlX3Q7CisKK2V4dGVybiBpbnQgIGZ0YXBlX3N0YXJ0X3dyaXRpbmcoY29uc3QgZnRfd3JpdGVfbW9kZV90IG1vZGUpOworZXh0ZXJuIGludCAgZnRhcGVfd3JpdGVfc2VnbWVudChjb25zdCBpbnQgc2VnbWVudCwKKwkJCQljb25zdCB2b2lkICphZGRyZXNzLCAKKwkJCQljb25zdCBmdF93cml0ZV9tb2RlX3QgZmx1c2hpbmcpOworZXh0ZXJuIHZvaWQgZnRhcGVfemFwX3dyaXRlX2J1ZmZlcnModm9pZCk7CitleHRlcm4gaW50ICBmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKHZvaWQpOworCisjZW5kaWYJCQkJLyogX0ZUQVBFX1dSSVRFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlX3N5bXMuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZV9zeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjM2EzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZV9zeW1zLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlX3N5bXMuYyx2ICQKKyAqICRSZXZpc2lvbjogMS40ICQKKyAqICREYXRlOiAxOTk3LzEwLzE3IDAwOjAzOjUxICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3ltYm9scyB0aGF0IHRoZSBmdGFwZSBsb3cgbGV2ZWwKKyAqICAgICAgcGFydCBvZiB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIgorICogICAgICBleHBvcnRzIHRvIGl0cyBoaWdoIGxldmVsIGNsaWVudHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5oIgorCisvKiBiYWQgc2VjdG9yIGhhbmRsaW5nIGZyb20gZnRhcGUtYnNtLmMgKi8KK0VYUE9SVF9TWU1CT0woZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkpOworRVhQT1JUX1NZTUJPTChmdGFwZV9maW5kX2VuZF9vZl9ic21fbGlzdCk7CisvKiBmcm9tIGZ0YXBlLXJ3LmMgKi8KK0VYUE9SVF9TWU1CT0woZnRhcGVfc2V0X3N0YXRlKTsKKy8qIGZyb20gZnRhcGUtY3RsLmMgKi8KK0VYUE9SVF9TWU1CT0woZnRhcGVfc2Vla190b19ib3QpOworRVhQT1JUX1NZTUJPTChmdGFwZV9zZWVrX3RvX2VvdCk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX2Fib3J0X29wZXJhdGlvbik7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX2dldF9zdGF0dXMpOworRVhQT1JUX1NZTUJPTChmdGFwZV9lbmFibGUpOworRVhQT1JUX1NZTUJPTChmdGFwZV9kaXNhYmxlKTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfbW1hcCk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX2NhbGlicmF0ZV9kYXRhX3JhdGUpOworLyogZnJvbSBmdGFwZS1pby5jICovCitFWFBPUlRfU1lNQk9MKGZ0YXBlX3Jlc2V0X2RyaXZlKTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfY29tbWFuZCk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX3BhcmFtZXRlcik7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX3JlYWR5X3dhaXQpOworRVhQT1JUX1NZTUJPTChmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfcmVwb3J0X2Vycm9yKTsKKy8qIGZyb20gZnRhcGUtcmVhZC5jICovCitFWFBPUlRfU1lNQk9MKGZ0YXBlX3JlYWRfc2VnbWVudF9mcmFjdGlvbik7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX3phcF9yZWFkX2J1ZmZlcnMpOworRVhQT1JUX1NZTUJPTChmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfZGVjb2RlX2hlYWRlcl9zZWdtZW50KTsKKy8qIGZyb20gZnRhcGUtd3JpdGUuYyAqLworRVhQT1JUX1NZTUJPTChmdGFwZV93cml0ZV9zZWdtZW50KTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfc3RhcnRfd3JpdGluZyk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX2xvb3BfdW50aWxfd3JpdGVzX2RvbmUpOworLyogZnJvbSBmdGFwZS1idWZmZXIuaCAqLworRVhQT1JUX1NZTUJPTChmdGFwZV9zZXRfbnJfYnVmZmVycyk7CisvKiBmcm9tIGZ0YXBlLWZvcm1hdC5oICovCitFWFBPUlRfU1lNQk9MKGZ0YXBlX2Zvcm1hdF90cmFjayk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX2Zvcm1hdF9zdGF0dXMpOworRVhQT1JUX1NZTUJPTChmdGFwZV92ZXJpZnlfc2VnbWVudCk7CisvKiBmcm9tIHRyYWNpbmcuYyAqLworI2lmbmRlZiBDT05GSUdfRlRfTk9fVFJBQ0VfQVRfQUxMCitFWFBPUlRfU1lNQk9MKGZ0YXBlX3RyYWNpbmcpOworRVhQT1JUX1NZTUJPTChmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsKTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfdHJhY2VfY2FsbCk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX3RyYWNlX2V4aXQpOworRVhQT1JUX1NZTUJPTChmdGFwZV90cmFjZV9sb2cpOworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTFjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL01ha2VmaWxlCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorIworIyAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL01ha2VmaWxlLHYgJAorIyAkUmV2aXNpb246IDEuNCAkCisjICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjU4ICQKKyMKKyMgICAgICBNYWtlZmlsZSBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgemZ0YXBlIGludGVyZmFjZSBWRlMgdG8KKyMgICAgICBmdGFwZQorIworCisKKyMgWkZUX09CU09MRVRFIC0gZW5hYmxlIHRoZSBNVElPQ19aRlRBUEVfR0VUQkxLU1ogaW9jdGwuIFlvdSBzaG91bGQKKyMgICAgICAgICAgICAgICAgbGVhdmUgdGhpcyBlbmFibGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGFwZXIuCisKK29iai0kKENPTkZJR19aRlRBUEUpICs9IHpmdGFwZS5vCisKK3pmdGFwZS1vYmpzIDo9IHpmdGFwZS1ydy5vIHpmdGFwZS1jdGwubyB6ZnRhcGUtcmVhZC5vIFwKKwkgICAgICAgemZ0YXBlLXdyaXRlLm8gemZ0YXBlLXZ0YmwubyB6ZnRhcGUtZW9mLm8gXAorCSAgICAgICB6ZnRhcGUtaW5pdC5vIHpmdGFwZS1idWZmZXJzLm8gemZ0YXBlX3N5bXMubworCitFWFRSQV9DRkxBR1MgOj0gLURaRlRfT0JTT0xFVEUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTA2ZjEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5jLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6NTkgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkeW5hbWljIGJ1ZmZlciBhbGxvY2F0aW9uIHJvdXRpbmVzIAorICogICAgICBvZiB6ZnRhcGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+CisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXZ0YmwuaCIKKworLyogIGdsb2JhbCB2YXJpYWJsZXMKKyAqLworCisvKiAgbG9jYWwgdmFyaWJhbGVzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXNlZF9tZW1vcnk7CitzdGF0aWMgdW5zaWduZWQgaW50IHBlYWtfbWVtb3J5OworCit2b2lkIHpmdF9tZW1vcnlfc3RhdHModm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFKGZ0X3Rfbm9pc2UsICJNZW1vcnkgdXNhZ2UgKHZtYWxsb2MgYWxsb2NhdGlvbnMpOlxuIgorCSAgICAgIEtFUk5fSU5GTyAidG90YWwgYWxsb2NhdGVkOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAicGVhayBhbGxvY2F0aW9uOiAlZCIsCisJICAgICAgdXNlZF9tZW1vcnksIHBlYWtfbWVtb3J5KTsKKwlwZWFrX21lbW9yeSA9IHVzZWRfbWVtb3J5OworCVRSQUNFX0VYSVQ7Cit9CisKK2ludCB6ZnRfdmNhbGxvY19vbmNlKHZvaWQgKm5ldywgc2l6ZV90IHNpemUpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJaWYgKHpmdF92bWFsbG9jX29uY2UobmV3LCBzaXplKSA8IDApIHsKKwkJVFJBQ0VfRVhJVCAtRU5PTUVNOworCX0KKwltZW1zZXQoKih2b2lkICoqKW5ldywgJ1wwJywgc2l6ZSk7CisJVFJBQ0VfRVhJVCAwOworfQoraW50IHpmdF92bWFsbG9jX29uY2Uodm9pZCAqbmV3LCBzaXplX3Qgc2l6ZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICgqKHZvaWQgKiopbmV3ICE9IE5VTEwgfHwgc2l6ZSA9PSAwKSB7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJaWYgKCgqKHZvaWQgKiopbmV3ID0gdm1hbGxvYyhzaXplKSkgPT0gTlVMTCkgeworCQlUUkFDRV9FWElUIC1FTk9NRU07CisJfQorCXVzZWRfbWVtb3J5ICs9IHNpemU7CisJaWYgKHBlYWtfbWVtb3J5IDwgdXNlZF9tZW1vcnkpIHsKKwkJcGVha19tZW1vcnkgPSB1c2VkX21lbW9yeTsKKwl9CisJVFJBQ0VfQUJPUlQoMCwgZnRfdF9ub2lzZSwKKwkJICAgICJhbGxvY2F0ZWQgYnVmZmVyIEAgJXAsICVkIGJ5dGVzIiwgKih2b2lkICoqKW5ldywgc2l6ZSk7Cit9CitpbnQgemZ0X3ZtYWxsb2NfYWx3YXlzKHZvaWQgKm5ldywgc2l6ZV90IHNpemUpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwl6ZnRfdmZyZWUobmV3LCBzaXplKTsKKwlUUkFDRV9FWElUIHpmdF92bWFsbG9jX29uY2UobmV3LCBzaXplKTsKK30KK3ZvaWQgemZ0X3ZmcmVlKHZvaWQgKm9sZCwgc2l6ZV90IHNpemUpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoKih2b2lkICoqKW9sZCkgeworCQl2ZnJlZSgqKHZvaWQgKiopb2xkKTsKKwkJdXNlZF9tZW1vcnkgLT0gc2l6ZTsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInJlbGVhc2VkIGJ1ZmZlciBAICVwLCAlZCBieXRlcyIsCisJCSAgICAgICoodm9pZCAqKilvbGQsIHNpemUpOworCQkqKHZvaWQgKiopb2xkID0gTlVMTDsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKwordm9pZCAqemZ0X2ttYWxsb2Moc2l6ZV90IHNpemUpCit7CisJdm9pZCAqbmV3OworCisJd2hpbGUgKChuZXcgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7CisJfQorCW1lbXNldChuZXcsIDAsIHNpemUpOworCXVzZWRfbWVtb3J5ICs9IHNpemU7CisJaWYgKHBlYWtfbWVtb3J5IDwgdXNlZF9tZW1vcnkpIHsKKwkJcGVha19tZW1vcnkgPSB1c2VkX21lbW9yeTsKKwl9CisJcmV0dXJuIG5ldzsKK30KKwordm9pZCB6ZnRfa2ZyZWUodm9pZCAqb2xkLCBzaXplX3Qgc2l6ZSkKK3sKKwlrZnJlZShvbGQpOworCXVzZWRfbWVtb3J5IC09IHNpemU7Cit9CisKKy8qIHRoZXJlIGFyZSBzb21lIG1vcmUgYnVmZmVycyB0aGF0IGFyZSBhbGxvY2F0ZWQgb24gZGVtYW5kLgorICogY2xlYW51cF9tb2R1bGUoKSBjYWxsZXMgdGhpcyBmdW5jdGlvbiB0byBiZSBzdXJlIHRvIGhhdmUgcmVsZWFzZWQKKyAqIHRoZW0gCisgKi8KK3ZvaWQgemZ0X3VuaW5pdF9tZW0odm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXpmdF92ZnJlZSgmemZ0X2hzZWdfYnVmLCBGVF9TRUdNRU5UX1NJWkUpOworCXpmdF92ZnJlZSgmemZ0X2RlYmxvY2tfYnVmLCBGVF9TRUdNRU5UX1NJWkUpOyB6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7CisJemZ0X2ZyZWVfdnRibCgpOworCWlmICh6ZnRfY21wcl9sb2NrKDAgLyogZG9uJ3QgbG9hZCAqLykgPT0gMCkgeworCQkoKnpmdF9jbXByX29wcy0+Y2xlYW51cCkoKTsKKwkJKCp6ZnRfY21wcl9vcHMtPnJlc2V0KSgpOyAvKiB1bmxvY2sgaXQgYWdhaW4gKi8KKwl9CisJemZ0X21lbW9yeV9zdGF0cygpOworCVRSQUNFX0VYSVQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4ZTMxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaApAQCAtMCwwICsxLDU1IEBACisjaWZuZGVmIF9GVEFQRV9EWU5NRU1fSAorI2RlZmluZSBfRlRBUEVfRFlOTUVNX0gKKworLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjU5ICQKKyAqCisgKiAgIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLgorICoKKyAqLworCisvKiB3ZSBkbyBub3QgYWxsb2NhdGUgYWxsIG9mIHRoZSByZWFsbHkgbGFyZ2UgYnVmZmVyIG1lbW9yeSBiZWZvcmUKKyAqIHNvbWVvbmUgdHJpZXMgdG8gb3BlbiB0aGUgZHJpdmUuIGZ0YXBlX29wZW4oKSBtYXkgZmFpbCB3aXRoCisgKiAtRU5PTUVNLCBidXQgdGhhdCdzIGJldHRlciBoYXZpbmcgMjAwayBvZiB2bWFsbG9jZWQgbWVtb3J5IHdoaWNoCisgKiBjYW5ub3QgYmUgc3dhcHBlZCBvdXQuCisgKi8KKworZXh0ZXJuIHZvaWQgIHpmdF9tZW1vcnlfc3RhdHModm9pZCk7CitleHRlcm4gaW50ICAgemZ0X3ZtYWxsb2Nfb25jZSh2b2lkICpuZXcsIHNpemVfdCBzaXplKTsKK2V4dGVybiBpbnQgICB6ZnRfdmNhbGxvY19vbmNlKHZvaWQgKm5ldywgc2l6ZV90IHNpemUpOworZXh0ZXJuIGludCAgIHpmdF92bWFsbG9jX2Fsd2F5cyh2b2lkICpuZXcsIHNpemVfdCBzaXplKTsKK2V4dGVybiB2b2lkICB6ZnRfdmZyZWUodm9pZCAqb2xkLCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCAqemZ0X2ttYWxsb2Moc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgIHpmdF9rZnJlZSh2b2lkICpvbGQsIHNpemVfdCBzaXplKTsKKworLyogY2FsbGVkIGJ5IGNsZWFudXBfbW9kdWxlKCkgCisgKi8KK2V4dGVybiB2b2lkIHpmdF91bmluaXRfbWVtKHZvaWQpOworCisjZW5kaWYKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtY3RsLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzc4NzRlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5jCkBAIC0wLDAgKzEsMTQxOCBAQAorLyogCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yLjYuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMS8xNCAxODowNzozMyAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG5vbi1yZWFkL3dyaXRlIHpmdGFwZSBmdW5jdGlvbnMKKyAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorCisjaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KK2ludCB6ZnRfd3JpdGVfcHJvdGVjdGVkOyAvKiB0aGlzIGlzIHdoZW4gY2FydHJpZGdlIHJkb25seSBvciBPX1JET05MWSAqLworaW50IHpmdF9oZWFkZXJfcmVhZDsKK2ludCB6ZnRfb2ZmbGluZTsKK3Vuc2lnbmVkIGludCB6ZnRfdW5pdDsKK2ludCB6ZnRfcmVzaWQ7CitpbnQgemZ0X210X2NvbXByZXNzaW9uOworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyBpbnQgZ29pbmdfb2ZmbGluZTsKKwordHlwZWRlZiBpbnQgKG10X2Z1bikoaW50ICphcmdwdHIpOwordHlwZWRlZiBpbnQgKCptdF9mdW5wKShpbnQgKmFyZ3B0cik7Cit0eXBlZGVmIHN0cnVjdAoreworCW10X2Z1bnAgZnVuY3Rpb247CisJdW5zaWduZWQgb2ZmbGluZSAgICAgICAgIDogMTsgLyogb3AgcGVybWl0dGVkIGlmIG9mZmxpbmUgb3Igbm9fdGFwZSAqLworCXVuc2lnbmVkIHdyaXRlX3Byb3RlY3RlZCA6IDE7IC8qIG9wIHBlcm1pdHRlZCBpZiB3cml0ZS1wcm90ZWN0ZWQgICAgKi8KKwl1bnNpZ25lZCBub3RfZm9ybWF0dGVkICAgOiAxOyAvKiBvcCBwZXJtaXR0ZWQgaWYgdGFwZSBub3QgZm9ybWF0dGVkICovCisJdW5zaWduZWQgcmF3X21vZGUgICAgICAgIDogMTsgLyogb3AgcGVybWl0dGVkIGlmIHpmdF9tb2RlID09IDAgICAgKi8KKwl1bnNpZ25lZCBuZWVkX2lkbGVfc3RhdGUgOiAxOyAvKiBuZWVkIHRvIGNhbGwgZGVmX2lkbGVfc3RhdGUgICAgICAgICovCisJY2hhciAgICAgKm5hbWU7Cit9IGZ1bl9lbnRyeTsKKworc3RhdGljIG10X2Z1biBtdF9kdW1teSwgbXRfcmVzZXQsIG10X2ZzciwgbXRfYnNyLCBtdF9yZXcsIG10X29mZmwsIG10X25vcCwKKwltdF93ZW9mLCBtdF9lcmFzZSwgbXRfcmFzMiwgbXRfc2V0YmxrLCBtdF9zZXRkZW5zaXR5LAorCW10X3NlZWssIG10X3RlbGwsIG10X3JldGVuLCBtdF9lb20sIG10X2ZzZiwgbXRfYnNmLAorCW10X2ZzZm0sIG10X2JzZm0sIG10X3NldGRydmJ1ZmZlciwgbXRfY29tcHJlc3Npb247CisKK3N0YXRpYyBmdW5fZW50cnkgbXRfZnVuc1tdPQoreyAKKwl7bXRfcmVzZXQgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfUkVTRVQiIH0sIC8qICAwICovCisJe210X2ZzZiAgICAgICAgICwgMCwgMSwgMCwgMCwgMSwgIk1UX0ZTRiIgICB9LAorCXttdF9ic2YgICAgICAgICAsIDAsIDEsIDAsIDAsIDEsICJNVF9CU0YiICAgfSwKKwl7bXRfZnNyICAgICAgICAgLCAwLCAxLCAwLCAxLCAxLCAiTVRfRlNSIiAgIH0sCisJe210X2JzciAgICAgICAgICwgMCwgMSwgMCwgMSwgMSwgIk1UX0JTUiIgICB9LAorCXttdF93ZW9mICAgICAgICAsIDAsIDAsIDAsIDAsIDAsICJNVF9XRU9GIiAgfSwgLyogIDUgKi8KKwl7bXRfcmV3ICAgICAgICAgLCAwLCAxLCAxLCAxLCAwLCAiTVRfUkVXIiAgIH0sCisJe210X29mZmwgICAgICAgICwgMCwgMSwgMSwgMSwgMCwgIk1UX09GRkwiICB9LAorCXttdF9ub3AgICAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9OT1AiICAgfSwKKwl7bXRfcmV0ZW4gICAgICAgLCAwLCAxLCAxLCAxLCAwLCAiTVRfUkVURU4iIH0sCisJe210X2JzZm0gICAgICAgICwgMCwgMSwgMCwgMCwgMSwgIk1UX0JTRk0iICB9LCAvKiAxMCAqLworCXttdF9mc2ZtICAgICAgICAsIDAsIDEsIDAsIDAsIDEsICJNVF9GU0ZNIiAgfSwKKwl7bXRfZW9tICAgICAgICAgLCAwLCAxLCAwLCAwLCAxLCAiTVRfRU9NIiAgIH0sCisJe210X2VyYXNlICAgICAgICwgMCwgMCwgMCwgMSwgMCwgIk1UX0VSQVNFIiB9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9SQVMxIiAgfSwKKwl7bXRfcmFzMiAgICAgICAgLCAwLCAwLCAwLCAxLCAwLCAiTVRfUkFTMiIgIH0sCisJe210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1JBUzMiICB9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJVTktOT1dOIiAgfSwKKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiVU5LTk9XTiIgIH0sCisJe210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIlVOS05PV04iICB9LAorCXttdF9zZXRibGsgICAgICAsIDEsIDEsIDEsIDEsIDEsICJNVF9TRVRCTEsifSwgLyogMjAgKi8KKwl7bXRfc2V0ZGVuc2l0eSAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfU0VUREVOU0lUWSJ9LAorCXttdF9zZWVrICAgICAgICAsIDAsIDEsIDAsIDEsIDEsICJNVF9TRUVLIiAgfSwKKwl7bXRfZHVtbXkgICAgICAgLCAwLCAxLCAwLCAxLCAxLCAiTVRfVEVMTCIgIH0sIC8qIHdyLW9ubHkgPyEgKi8KKwl7bXRfc2V0ZHJ2YnVmZmVyLCAxLCAxLCAxLCAxLCAwLCAiTVRfU0VURFJWQlVGRkVSIiB9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9GU1MiICAgfSwgLyogMjUgKi8KKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfQlNTIiAgIH0sCisJe210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1dTTSIgICB9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9MT0NLIiAgfSwKKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfVU5MT0NLIn0sCisJe210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX0xPQUQiICB9LCAvKiAzMCAqLworCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9VTkxPQUQifSwKKwl7bXRfY29tcHJlc3Npb24gLCAxLCAxLCAxLCAwLCAxLCAiTVRfQ09NUFJFU1NJT04ifSwKKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfU0VUUEFSVCJ9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9NS1BBUlQifQorfTsgIAorCisjZGVmaW5lIE5SX01UX0NNRFMgTlJfSVRFTVMobXRfZnVucykKKwordm9pZCB6ZnRfcmVzZXRfcG9zaXRpb24oemZ0X3Bvc2l0aW9uICpwb3MpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlwb3MtPnNlZ19ieXRlX3BvcyA9CisJCXBvcy0+dm9sdW1lX3BvcyA9IDA7CisJaWYgKHpmdF9oZWFkZXJfcmVhZCkgeworCQkvKiBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHZvbHVtZSB0YWJsZSBhbmQKKwkJICogY29tcHJlc3Npb24gbWFwLiBXZSB0aGVyZWZvciBzaW1wbHkKKwkJICogcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlyc3QKKwkJICogdm9sdW1lLiBUaGlzIGNvdmVycyBvbGQgZnRhcGUgYXJjaGl2ZXMgYXMKKwkJICogd2VsbCBoYXMgdmFyaW91cyBmbGF2b3VycyBvZiB0aGUKKwkJICogY29tcHJlc3Npb24gbWFwIHNlZ21lbnRzLiBUaGUgd29yc3QgY2FzZSBpcworCQkgKiB0aGF0IHRoZSBjb21wcmVzc2lvbiBtYXAgc2hvd3MgdXAgYXMgYQorCQkgKiBhZGRpdGlvbmFsIHZvbHVtZSBpbiBmcm9udCBvZiBhbGwgb3RoZXJzLgorCQkgKi8KKwkJcG9zLT5zZWdfcG9zICA9IHpmdF9maW5kX3ZvbHVtZSgwKS0+c3RhcnRfc2VnOworCQlwb3MtPnRhcGVfcG9zID0gemZ0X2NhbGNfdGFwZV9wb3MocG9zLT5zZWdfcG9zKTsKKwl9IGVsc2UgeworCQlwb3MtPnRhcGVfcG9zID0gIDA7CisJCXBvcy0+c2VnX3BvcyAgPSAtMTsKKwl9CisJemZ0X2p1c3RfYmVmb3JlX2VvZiA9ICAwOworCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsKKwl6ZnRfaW9fc3RhdGUgICAgICAgID0gemZ0X2lkbGU7CisJemZ0X3phcF9yZWFkX2J1ZmZlcnMoKTsKKwl6ZnRfcHJldmVudF9mbHVzaCgpOworCS8qICB1bmxvY2sgdGhlIGNvbXByZXNpc29uIG1vZHVsZSBpZiBpdCBpcyBsb2FkZWQuCisJICogIFRoZSB6ZXJvIGFyZyBtZWFucyBub3QgdG8gdHJ5IHRvIGxvYWQgdGhlIG1vZHVsZS4KKwkgKi8KKwlpZiAoemZ0X2NtcHJfbG9jaygwKSA9PSAwKSB7CisJCSgqemZ0X2NtcHJfb3BzLT5yZXNldCkoKTsgLyogdW5sb2NrICovCisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIHpmdF9pbml0X2RyaXZlcih2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJemZ0X3Jlc2lkID0KKwkJemZ0X2hlYWRlcl9yZWFkICAgICAgICAgID0KKwkJemZ0X29sZF9mdGFwZSAgICAgICAgICAgID0KKwkJemZ0X29mZmxpbmUgICAgICAgICAgICAgID0KKwkJemZ0X3dyaXRlX3Byb3RlY3RlZCAgICAgID0KKwkJZ29pbmdfb2ZmbGluZSAgICAgICAgICAgID0KKwkJemZ0X210X2NvbXByZXNzaW9uICAgICAgID0KKwkJemZ0X2hlYWRlcl9jaGFuZ2VkICAgICAgID0KKwkJemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkID0KKwkJemZ0X3dyaXR0ZW5fc2VnbWVudHMgICAgID0gMDsKKwl6ZnRfYmxrX3N6ID0gQ09ORklHX1pGVF9ERkxUX0JMS19TWjsKKwl6ZnRfcmVzZXRfcG9zaXRpb24oJnpmdF9wb3MpOyAvKiBkb2VzIG1vc3Qgb2YgdGhlIHN0dWZmICovCisJZnRhcGVfemFwX3JlYWRfYnVmZmVycygpOworCWZ0YXBlX3NldF9zdGF0ZShpZGxlKTsKKwlUUkFDRV9FWElUOworfQorCitpbnQgemZ0X2RlZl9pZGxlX3N0YXRlKHZvaWQpCit7IAorCWludCByZXN1bHQgPSAwOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmICghemZ0X2hlYWRlcl9yZWFkKSB7CisJCXJlc3VsdCA9IHpmdF9yZWFkX2hlYWRlcl9zZWdtZW50cygpOworCX0gZWxzZSBpZiAoKHJlc3VsdCA9IHpmdF9mbHVzaF9idWZmZXJzKCkpID49IDAgJiYgemZ0X3FpY19tb2RlKSB7CisJCS8qICBkb24ndCBtb3ZlIHBhc3QgZW9mCisJCSAqLworCQkodm9pZCl6ZnRfY2xvc2Vfdm9sdW1lKCZ6ZnRfcG9zKTsKKwl9CisJaWYgKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpIDwgMCkgeworCQlUUkFDRShmdF90X3dhcm4sICJmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSBmYWlsZWQiKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwl9CisJLyogY2xlYXIgcmVtYWluaW5nIHJlYWQgYnVmZmVycyAqLworCXpmdF96YXBfcmVhZF9idWZmZXJzKCk7CisJemZ0X2lvX3N0YXRlID0gemZ0X2lkbGU7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgZnVuY3Rpb25zIGZvciB0aGUgTVRJT0NUT1AgY29tbWFuZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG10X2R1bW15KGludCAqZHVtbXkpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJVFJBQ0VfRVhJVCAtRU5PU1lTOworfQorCitzdGF0aWMgaW50IG10X3Jlc2V0KGludCAqZHVtbXkpCit7ICAgICAgICAKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwkodm9pZClmdGFwZV9zZWVrX3RvX2JvdCgpOworCVRSQUNFX0NBVENIKGZ0YXBlX3Jlc2V0X2RyaXZlKCksCisJCSAgICB6ZnRfaW5pdF9kcml2ZXIoKTsgemZ0X3VuaW5pdF9tZW0oKTsgemZ0X29mZmxpbmUgPSAxKTsKKwkvKiAgZmFrZSBhIHJlLW9wZW4gb2YgdGhlIGRldmljZS4gVGhpcyB3aWxsIHNldCBhbGwgZmxhZ2UgYW5kIAorCSAqICBhbGxvY2F0ZSBidWZmZXJzIGFzIGFwcHJvcHJpYXRlLiBUaGUgbmV3IHRhcGUgY29uZGl0aW9uIHdpbGwKKwkgKiAgZm9yY2UgdGhlIG9wZW4gcm91dGluZSB0byBkbyBhbnl0aGluZyB3ZSBuZWVkLgorCSAqLworCVRSQUNFX0NBVENIKF96ZnRfb3BlbigtMSAvKiBmYWtlIHJlb3BlbiAqLywgMCAvKiBkdW1teSAqLyksKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRfZnNmKGludCAqYXJnKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlyZXN1bHQgPSB6ZnRfc2tpcF92b2x1bWVzKCphcmcsICZ6ZnRfcG9zKTsKKwl6ZnRfanVzdF9iZWZvcmVfZW9mID0gMDsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF9ic2YoaW50ICphcmcpCit7CisJaW50IHJlc3VsdCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYgKCphcmcgIT0gMCkgeworCQlyZXN1bHQgPSB6ZnRfc2tpcF92b2x1bWVzKC0qYXJnICsgMSwgJnpmdF9wb3MpOworCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBzZWVrX2Jsb2NrKF9fczY0IGRhdGFfb2Zmc2V0LAorCQkgICAgICBfX3M2NCBibG9ja19pbmNyZW1lbnQsCisJCSAgICAgIHpmdF9wb3NpdGlvbiAqcG9zKQoreyAKKwlpbnQgcmVzdWx0ICAgICAgPSAwOworCV9fczY0IG5ld19ibG9ja19wb3M7CisJX19zNjQgdm9sX2Jsb2NrX2NvdW50OworCWNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWU7CisJaW50IGV4Y2VlZDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwl2b2x1bWUgPSB6ZnRfZmluZF92b2x1bWUocG9zLT5zZWdfcG9zKTsKKwlpZiAodm9sdW1lLT5zdGFydF9zZWcgPT0gMCB8fCB2b2x1bWUtPmVuZF9zZWcgPT0gMCkgeworCQlUUkFDRV9FWElUIC1FSU87CisJfQorCW5ld19ibG9ja19wb3MgICA9ICh6ZnRfZGl2X2Jsa3N6KGRhdGFfb2Zmc2V0LCB2b2x1bWUtPmJsa19zeikKKwkJCSAgICsgYmxvY2tfaW5jcmVtZW50KTsKKwl2b2xfYmxvY2tfY291bnQgPSB6ZnRfZGl2X2Jsa3N6KHZvbHVtZS0+c2l6ZSwgdm9sdW1lLT5ibGtfc3opOworCWlmIChuZXdfYmxvY2tfcG9zIDwgMCkgeworCQlUUkFDRShmdF90X25vaXNlLAorCQkgICAgICAibmV3X2Jsb2NrX3BvcyAiIExMX1ggIiA8IDAiLCBMTChuZXdfYmxvY2tfcG9zKSk7CisJCXpmdF9yZXNpZCAgICAgPSAoaW50KW5ld19ibG9ja19wb3M7CisJCW5ld19ibG9ja19wb3MgPSAwOworCQlleGNlZWQgPSAxOworCX0gZWxzZSBpZiAobmV3X2Jsb2NrX3BvcyA+IHZvbF9ibG9ja19jb3VudCkgeworCQlUUkFDRShmdF90X25vaXNlLAorCQkgICAgICAibmV3X2Jsb2NrX3BvcyAiIExMX1ggIiBleGNlZWRzIHNpemUgb2Ygdm9sdW1lICIgTExfWCwKKwkJICAgICAgTEwobmV3X2Jsb2NrX3BvcyksIExMKHZvbF9ibG9ja19jb3VudCkpOworCQl6ZnRfcmVzaWQgICAgID0gKGludCkodm9sX2Jsb2NrX2NvdW50IC0gbmV3X2Jsb2NrX3Bvcyk7CisJCW5ld19ibG9ja19wb3MgPSB2b2xfYmxvY2tfY291bnQ7CisJCWV4Y2VlZCA9IDE7CisJfSBlbHNlIHsKKwkJZXhjZWVkID0gMDsKKwl9CisJaWYgKHpmdF91c2VfY29tcHJlc3Npb24gJiYgdm9sdW1lLT51c2VfY29tcHJlc3Npb24pIHsKKwkJVFJBQ0VfQ0FUQ0goemZ0X2NtcHJfbG9jaygxIC8qIHRyeSB0byBsb2FkICovKSwpOworCQlyZXN1bHQgPSAoKnpmdF9jbXByX29wcy0+c2VlaykobmV3X2Jsb2NrX3BvcywgcG9zLCB2b2x1bWUsCisJCQkJCSAgICAgICB6ZnRfZGVibG9ja19idWYpOworCQlwb3MtPnRhcGVfcG9zICA9IHpmdF9jYWxjX3RhcGVfcG9zKHBvcy0+c2VnX3Bvcyk7CisJCXBvcy0+dGFwZV9wb3MgKz0gcG9zLT5zZWdfYnl0ZV9wb3M7CisJfSBlbHNlIHsKKwkJcG9zLT52b2x1bWVfcG9zID0gemZ0X211bF9ibGtzeihuZXdfYmxvY2tfcG9zLCB2b2x1bWUtPmJsa19zeik7CisJCXBvcy0+dGFwZV9wb3MgICA9IHpmdF9jYWxjX3RhcGVfcG9zKHZvbHVtZS0+c3RhcnRfc2VnKTsKKwkJcG9zLT50YXBlX3BvcyAgKz0gcG9zLT52b2x1bWVfcG9zOworCQlwb3MtPnNlZ19wb3MgICAgPSB6ZnRfY2FsY19zZWdfYnl0ZV9jb29yZCgmcG9zLT5zZWdfYnl0ZV9wb3MsCisJCQkJCQkJICBwb3MtPnRhcGVfcG9zKTsKKwl9CisJemZ0X2p1c3RfYmVmb3JlX2VvZiA9IHZvbHVtZS0+c2l6ZSA9PSBwb3MtPnZvbHVtZV9wb3M7CisJaWYgKHpmdF9qdXN0X2JlZm9yZV9lb2YpIHsKKwkJLyogd2h5IHRoaXM/IGJlY2F1c2UgemZ0X2ZpbGVfbm8gY2hlY2tzIGFnYWlucyBzdGFydAorCQkgKiBhbmQgZW5kIHNlZ21lbnQgb2YgYSB2b2x1bWUuIFdlIGRvIG5vdCB3YW50IHRvCisJCSAqIGFkdmFuY2UgdG8gdGhlIG5leHQgdm9sdW1lIHdpdGggdGhpcyBmdW5jdGlvbi4KKwkJICovCisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJzZXQgemZ0X2p1c3RfYmVmb3JlX2VvZiIpOworCQl6ZnRfcG9zaXRpb25fYmVmb3JlX2VvZihwb3MsIHZvbHVtZSk7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJcbiIKKwkgICAgICBLRVJOX0lORk8gIm5ld19zZWdfcG9zIDogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gIm5ld190YXBlX3BvczogIiBMTF9YICJcbiIKKwkgICAgICBLRVJOX0lORk8gInZvbF9zaXplICAgIDogIiBMTF9YICJcbiIKKwkgICAgICBLRVJOX0lORk8gInNlZ19ieXRlX3BvczogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gImJsa19zeiAgOiAlZCIsIAorCSAgICAgIHBvcy0+c2VnX3BvcywgTEwocG9zLT50YXBlX3BvcyksCisJICAgICAgTEwodm9sdW1lLT5zaXplKSwgcG9zLT5zZWdfYnl0ZV9wb3MsCisJICAgICAgdm9sdW1lLT5ibGtfc3opOworCWlmICghZXhjZWVkKSB7CisJCXpmdF9yZXNpZCA9IG5ld19ibG9ja19wb3MgLSB6ZnRfZGl2X2Jsa3N6KHBvcy0+dm9sdW1lX3BvcywKKwkJCQkJCQkgIHZvbHVtZS0+YmxrX3N6KTsKKwl9CisJaWYgKHpmdF9yZXNpZCA8IDApIHsKKwkJemZ0X3Jlc2lkID0gLXpmdF9yZXNpZDsKKwl9CisJVFJBQ0VfRVhJVCAoKGV4Y2VlZCB8fCB6ZnRfcmVzaWQgIT0gMCkgJiYgcmVzdWx0ID49IDApID8gLUVJTlZBTCA6IHJlc3VsdDsKK30gICAgIAorCitzdGF0aWMgaW50IG10X2ZzcihpbnQgKmFyZykKK3sgCisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlyZXN1bHQgPSBzZWVrX2Jsb2NrKHpmdF9wb3Mudm9sdW1lX3BvcywgICphcmcsICZ6ZnRfcG9zKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF9ic3IoaW50ICphcmcpCit7ICAgCisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlyZXN1bHQgPSBzZWVrX2Jsb2NrKHpmdF9wb3Mudm9sdW1lX3BvcywgLSphcmcsICZ6ZnRfcG9zKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF93ZW9mKGludCAqYXJnKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJVFJBQ0VfQ0FUQ0goemZ0X2ZsdXNoX2J1ZmZlcnMoKSwpOworCXJlc3VsdCA9IHpmdF93ZW9mKCphcmcsICZ6ZnRfcG9zKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF9yZXcoaW50ICpkdW1teSkKK3sgICAgICAgICAgCisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZih6ZnRfaGVhZGVyX3JlYWQpIHsKKwkJKHZvaWQpemZ0X2RlZl9pZGxlX3N0YXRlKCk7CisJfQorCXJlc3VsdCA9IGZ0YXBlX3NlZWtfdG9fYm90KCk7CisJemZ0X3Jlc2V0X3Bvc2l0aW9uKCZ6ZnRfcG9zKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF9vZmZsKGludCAqZHVtbXkpCit7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlnb2luZ19vZmZsaW5lPSAxOworCXJlc3VsdCA9IG10X3JldyhOVUxMKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF9ub3AoaW50ICpkdW1teSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkvKiAgc2hvdWxkIHdlIHNldCB0YXBlIHN0YXR1cz8KKwkgKi8KKwlpZiAoIXpmdF9vZmZsaW5lKSB7IC8qIG9mZmxpbmUgaW5jbHVkZXMgbm9fdGFwZSAqLworCQkodm9pZCl6ZnRfZGVmX2lkbGVfc3RhdGUoKTsKKwl9CisJVFJBQ0VfRVhJVCAwOyAKK30KKworc3RhdGljIGludCBtdF9yZXRlbihpbnQgKmR1bW15KQoreyAgCisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZih6ZnRfaGVhZGVyX3JlYWQpIHsKKwkJKHZvaWQpemZ0X2RlZl9pZGxlX3N0YXRlKCk7CisJfQorCXJlc3VsdCA9IGZ0YXBlX3NlZWtfdG9fZW90KCk7CisJaWYgKHJlc3VsdCA+PSAwKSB7CisJCXJlc3VsdCA9IGZ0YXBlX3NlZWtfdG9fYm90KCk7CisJfQorCVRSQUNFX0VYSVQocmVzdWx0KTsKK30KKworc3RhdGljIGludCBmc2Zic2ZtKGludCBhcmcsIHpmdF9wb3NpdGlvbiAqcG9zKQoreyAKKwljb25zdCB6ZnRfdm9saW5mbyAqdnRibDsKKwlfX3M2NCBibG9ja19wb3M7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJLyogV2hhdCB0byBkbz8gVGhpcyBzaG91bGQgc2VlayB0byB0aGUgbmV4dCBmaWxlLW1hcmsgYW5kCisJICogcG9zaXRpb24gQkVGT1JFLiBUaGF0IGlzLCBhIG5leHQgd3JpdGUgd291bGQganVzdCBleHRlbmQKKwkgKiB0aGUgY3VycmVudCBmaWxlLiAgV2VsbC4gTGV0J3MganVzdCBzZWVrIHRvIHRoZSBlbmQgb2YgdGhlCisJICogY3VycmVudCBmaWxlLCBpZiBjb3VudCA9PSAxLiAgSWYgY291bnQgPiAxLCB0aGVuIGRvIGEKKwkgKiAibXRfZnNmKGNvdW50IC0gMSkiLCBhbmQgdGhlbiBzZWVrIHRvIHRoZSBlbmQgb2YgdGhhdCBmaWxlLgorCSAqIElmIGNvdW50ID09IDAsIGRvIG5vdGhpbmcKKwkgKi8KKwlpZiAoYXJnID09IDApIHsKKwkJVFJBQ0VfRVhJVCAwOworCX0KKwl6ZnRfanVzdF9iZWZvcmVfZW9mID0gMDsKKwlUUkFDRV9DQVRDSCh6ZnRfc2tpcF92b2x1bWVzKGFyZyA8IDAgPyBhcmcgOiBhcmctMSwgcG9zKSwKKwkJICAgIGlmIChhcmcgPiAwKSB7CisJCQkgICAgemZ0X3Jlc2lkICsrOyAKKwkJICAgIH0pOworCXZ0YmwgICAgICA9IHpmdF9maW5kX3ZvbHVtZShwb3MtPnNlZ19wb3MpOworCWJsb2NrX3BvcyA9IHpmdF9kaXZfYmxrc3oodnRibC0+c2l6ZSwgdnRibC0+YmxrX3N6KTsKKwkodm9pZClzZWVrX2Jsb2NrKDAsIGJsb2NrX3BvcywgcG9zKTsKKwlpZiAocG9zLT52b2x1bWVfcG9zICE9IHZ0YmwtPnNpemUpIHsKKwkJemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDA7CisJCXpmdF9yZXNpZCA9IDE7CisJCS8qIHdlIGRpZG4ndCBtYW5hZ2VkIHRvIGdvIHRoZXJlICovCisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAKKwkJCSAgICAid2FudGVkIGZpbGUgcG9zaXRpb24gIiBMTF9YICIsIGFycml2ZWQgYXQgIiBMTF9YLCAKKwkJCSAgICBMTCh2dGJsLT5zaXplKSwgTEwocG9zLT52b2x1bWVfcG9zKSk7CisJfQorCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAxOworCVRSQUNFX0VYSVQgMDsgCit9CisKK3N0YXRpYyBpbnQgbXRfYnNmbShpbnQgKmFyZykKK3sKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCXJlc3VsdCA9IGZzZmJzZm0oLSphcmcsICZ6ZnRfcG9zKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtdF9mc2ZtKGludCAqYXJnKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJcmVzdWx0ID0gZnNmYnNmbSgqYXJnLCAmemZ0X3Bvcyk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbXRfZW9tKGludCAqZHVtbXkpCit7ICAgICAgICAgICAgICAKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwl6ZnRfc2tpcF90b19lb20oJnpmdF9wb3MpOworCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGludCBtdF9lcmFzZShpbnQgKmR1bW15KQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJcmVzdWx0ID0gemZ0X2VyYXNlKCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbXRfcmFzMihpbnQgKmR1bW15KQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJcmVzdWx0ID0gLUVOT1NZUzsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30gCisKKy8qICBTZXRzIHRoZSBuZXcgYmxvY2tzaXplIGluIEJZVEVTCisgKgorICovCitzdGF0aWMgaW50IG10X3NldGJsayhpbnQgKm5ld19zaXplKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmKCh1bnNpZ25lZCBpbnQpKCpuZXdfc2l6ZSkgPiBaRlRfTUFYX0JMS19TWikgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sCisJCQkgICAgImRlc2lyZWQgYmxrX3N6ICglZCkgc2hvdWxkIGJlIDw9ICVkIGJ5dGVzIiwKKwkJCSAgICAqbmV3X3NpemUsIFpGVF9NQVhfQkxLX1NaKTsKKwl9CisJaWYgKCgqbmV3X3NpemUgJiAoRlRfU0VDVE9SX1NJWkUtMSkpICE9IDApIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLAorCQkJImRlc2lyZWQgYmxrX3N6ICglZCkgbXVzdCBiZSBhIG11bHRpcGxlIG9mICVkIGJ5dGVzIiwKKwkJCSAgICAqbmV3X3NpemUsIEZUX1NFQ1RPUl9TSVpFKTsKKwl9CisJaWYgKCpuZXdfc2l6ZSA9PSAwKSB7CisJCWlmICh6ZnRfdXNlX2NvbXByZXNzaW9uKSB7CisJCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sCisJCQkJICAgICJWYXJpYWJsZSBibG9jayBzaXplIG5vdCB5ZXQgIgorCQkJCSAgICAic3VwcG9ydGVkIHdpdGggY29tcHJlc3Npb24iKTsKKwkJfQorCQkqbmV3X3NpemUgPSAxOworCX0KKwl6ZnRfYmxrX3N6ID0gKm5ld19zaXplOworCVRSQUNFX0VYSVQgMDsKK30gCisKK3N0YXRpYyBpbnQgbXRfc2V0ZGVuc2l0eShpbnQgKmFyZykKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlTRVRfVFJBQ0VfTEVWRUwoKmFyZyk7CisJVFJBQ0UoVFJBQ0VfTEVWRUwsICJ0cmFjaW5nIHNldCB0byAlZCIsIFRSQUNFX0xFVkVMKTsKKwlpZiAoKGludClUUkFDRV9MRVZFTCAhPSAqYXJnKSB7CisJCVRSQUNFX0VYSVQgLUVJTlZBTDsKKwl9CisJVFJBQ0VfRVhJVCAwOworfSAgICAgICAgICAKKworc3RhdGljIGludCBtdF9zZWVrKGludCAqbmV3X2Jsb2NrX3BvcykKK3sgCisJaW50IHJlc3VsdD0gMDsgICAgICAgIAorCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCisJcmVzdWx0ID0gc2Vla19ibG9jaygwLCAoX19zNjQpKm5ld19ibG9ja19wb3MsICZ6ZnRfcG9zKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogIE9LLCB0aGlzIGlzIHRvdGFsbHkgZGlmZmVyZW50IGZyb20gU0NTSSwgYnV0IHRoZSB3b3JzdCB0aGluZyB0aGF0IGNhbiAKKyAqICBoYXBwZW4gaXMgdGhhdCB0aGVyZSBpcyBub3QgZW5vdWdoIGRlZnJhZ21lbnRhdGVkIG1lbW9yeSB0aGF0IGNhbiBiZSAKKyAqICBhbGxvY2F0ZWQuIEFsc28sIHRoZXJlIGlzIGEgaGFyZHdpcmVkIGxpbWl0IG9mIDE2IGRtYSBidWZmZXJzIGluIHRoZSAKKyAqICBzdG9jayBmdGFwZSBtb2R1bGUuIFRoaXMgc2hvdWxkbid0IGJyaW5nIHRoZSBzeXN0ZW0gZG93bi4KKyAqCisgKiBOT1RFOiB0aGUgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSB0b3RhbCBudW1iZXIgb2YgZG1hIGJ1ZmZlcnMgdG8gdXNlLgorICogICAgICAgVGhlIGRyaXZlciBuZWVkcyBhdCBsZWFzdCAzIGJ1ZmZlcnMgdG8gZnVuY3Rpb24gYXQgYWxsLgorICogCisgKi8KK3N0YXRpYyBpbnQgbXRfc2V0ZHJ2YnVmZmVyKGludCAqY250KQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKCpjbnQgPCAzKSB7CisJCVRSQUNFX0VYSVQgLUVJTlZBTDsKKwl9CisJVFJBQ0VfQ0FUQ0goZnRhcGVfc2V0X25yX2J1ZmZlcnMoKmNudCksKTsKKwlUUkFDRV9FWElUIDA7Cit9CisvKiByZXR1cm4gdGhlIGJsb2NrIHBvc2l0aW9uIGZyb20gc3RhcnQgb2Ygdm9sdW1lIAorICovCitzdGF0aWMgaW50IG10X3RlbGwoaW50ICphcmcpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJKmFyZyAgID0gemZ0X2Rpdl9ibGtzeih6ZnRfcG9zLnZvbHVtZV9wb3MsCisJCQkgICAgICAgemZ0X2ZpbmRfdm9sdW1lKHpmdF9wb3Muc2VnX3BvcyktPmJsa19zeik7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IG10X2NvbXByZXNzaW9uKGludCAqYXJnKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCS8qICBPay4gV2UgY291bGQgYWxzbyBjaGVjayB3aGV0aGVyIGNvbXByZXNzaW9uIGlzIGF2YWlsYWJsZSBhdAorCSAqICBhbGwgYnkgdHJ5aW5nIHRvIGxvYWQgdGhlIGNvbXByZXNzaW9uIG1vZHVsZS4gIFdlIGNvdWxkCisJICogIGFsc28gY2hlY2sgZm9yIGEgYmxvY2sgc2l6ZSBvZiAxIGJ5dGUgd2hpY2ggaXMgaWxsZWdhbAorCSAqICB3aXRoIGNvbXByZXNzaW9uLiAgSW5zdGVhZCBvZiBkb2luZyBpdCBoZXJlIHdlIHJlbHkgb24KKwkgKiAgemZ0YXBlX3dyaXRlKCkgdG8gZG8gdGhlIHByb3BlciBjaGVja3MuCisJICovCisJaWYgKCh1bnNpZ25lZCBpbnQpKmFyZyA+IDEpIHsKKwkJVFJBQ0VfRVhJVCAtRUlOVkFMOworCX0KKwlpZiAoKmFyZyAhPSAwICYmIHpmdF9ibGtfc3ogPT0gMSkgeyAvKiB2YXJpYWJsZSBibG9jayBzaXplICovCisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywKKwkJCSAgICAiQ29tcHJlc3Npb24gbm90IHlldCBzdXBwb3J0ZWQgIgorCQkJICAgICJ3aXRoIHZhcmlhYmxlIGJsb2NrIHNpemUiKTsKKwl9CisJemZ0X210X2NvbXByZXNzaW9uICA9ICphcmc7CisJaWYgKCh6ZnRfdW5pdCAmIFpGVF9aSVBfTU9ERSkgPT0gMCkgeworCQl6ZnRfdXNlX2NvbXByZXNzaW9uID0gemZ0X210X2NvbXByZXNzaW9uOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICBjaGVjayB3aGV0aGVyIHdyaXRlIGFjY2VzcyBpcyBhbGxvd2VkLiBXcml0ZSBhY2Nlc3MgaXMgZGVuaWVkIHdoZW4KKyAqICArIHpmdF93cml0ZV9wcm90ZWN0ZWQgPT0gMSAtLSB0aGlzIGFjY291bnRzIGZvciBlaXRoZXIgaGFyZCB3cml0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0aW9uIG9mIHRoZSBjYXJ0cmlkZ2Ugb3IgZm9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fUkRPTkxZIGFjY2VzcyBtb2RlIG9mIHRoZSB0YXBlIGRldmljZQorICogICsgemZ0X29mZmxpbmUgPT0gMSAgICAgICAgIC0tIHRoaXMgbWVhbnkgdGhhdCB0aGVyZSBpcyBlaXRoZXIgbm8gdGFwZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0aGF0IHRoZSBNVE9GRkxJTkUgaW9jdGwgaGFzIGJlZW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNseSBpc3N1ZWQgKGBzb2Z0IGVqZWN0JykKKyAqICArIGZ0X2Zvcm1hdHRlZCA9PSAwICAgICAgICAtLSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNhcnRyaWRnZSBpcyBub3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQKKyAqICBUaGVuIHdlIGRpc3RpbnVndWlzaCB0d28gY2FzZXMuIFdoZW4gemZ0X3FpY19tb2RlIGlzIFRSVUUsIHRoZW4gd2UgdHJ5CisgKiAgdG8gZW11bGF0ZSBhIGB0cmFkaXRpb25hbCcgKGFrYSBTQ1NJIGxpa2UpIFVOKlggdGFwZSBkZXZpY2UuIFRoZXJlZm9yZSB3ZQorICogIGRlbnkgd3JpdGVzIHdoZW4KKyAqICArIHpmdF9xaWNfbW9kZSA9PTEgJiYgCisgKiAgICAgICAoIXpmdF90YXBlX2F0X2xib3QoKSAmJiAgIC0tIHRhcGUgbm8gYXQgbG9naWNhbCBCT1QKKyAqICAgICAgICAhKHpmdF90YXBlX2F0X2VvbSgpIHx8ICAgLS0gdGFwZSBub3QgYXQgbG9naWNhbCBFT00gKG9yIEVPRCkKKyAqICAgICAgICAgICh6ZnRfdGFwZV9hdF9lb20oKSAmJgorICogICAgICAgICAgIHpmdF9vbGRfZnRhcGUoKSkpKSAgICAtLSB3ZSBjYW4ndCBhZGQgbmV3IHZvbHVtZSB0byB0YXBlcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiBieSBvbGQgZnRhcGUgYmVjYXVzZSBmdGFwZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCB1c2UgdGhlIHZvbHVtZSB0YWJsZQorICoKKyAqICB3aGVuIHRoZSBkcml2ZSBpcyBpbiB0cnVlIHJhdyBtb2RlIChha2EgL2Rldi9yYXdmdDApIHRoZW4gd2UgZG9uJ3QgCisgKiAgY2FyZSBhYm91dCBMQk9UIGFuZCBFT00gY29uZGl0aW9ucy4gVGhpcyBkZXZpY2UgaXMgaW50ZW5kZWQgZm9yIGEgCisgKiAgdXNlciBsZXZlbCBwcm9ncmFtIHRoYXQgd2FudHMgdG8gdHJ1bHkgaW1wbGVtZW50IHRoZSBRSUMtODAgY29tcGxpYW5jZQorICogIGF0IHRoZSBsb2dpY2FsIGRhdGEgbGF5b3V0IGxldmVsIG9mIHRoZSBjYXJ0cmlkZ2UsIGkuZS4gaW1wbGVtZW50IGFsbAorICogIHRoYXQgdm9sdW1lIHRhYmxlIGFuZCB2b2x1bWUgZGlyZWN0b3J5IHN0dWZmIGV0Yy48CisgKi8KK2ludCB6ZnRfY2hlY2tfd3JpdGVfYWNjZXNzKHpmdF9wb3NpdGlvbiAqcG9zKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKHpmdF9vZmZsaW5lKSB7IC8qIG9mZmxpbmUgaW5jbHVkZXMgbm9fdGFwZSAqLworCQlUUkFDRV9BQk9SVCgtRU5YSU8sCisJCQkgICAgZnRfdF9pbmZvLCAidGFwZSBpcyBvZmZsaW5lIG9yIG5vIGNhcnRyaWRnZSIpOworCX0KKwlpZiAoIWZ0X2Zvcm1hdHRlZCkgeworCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sICJ0YXBlIGlzIG5vdCBmb3JtYXR0ZWQiKTsKKwl9IAorCWlmICh6ZnRfd3JpdGVfcHJvdGVjdGVkKSB7CisJCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywgImNhcnRyaWRnZSB3cml0ZSBwcm90ZWN0ZWQiKTsKKwl9IAorCWlmICh6ZnRfcWljX21vZGUpIHsKKwkJLyogIGNoZWNrIEJPVCBjb25kaXRpb24gKi8KKwkJaWYgKCF6ZnRfdGFwZV9hdF9sYm90KHBvcykpIHsKKwkJCS8qICBwcm90ZWN0IGNhcnRyaWRnZXMgd3JpdHRlbiBieSBvbGQgZnRhcGUgaWYKKwkJCSAqICBub3QgYXQgQk9UIGJlY2F1c2UgdGhleSB1c2UgdGhlIHZ0YmwKKwkJCSAqICBzZWdtZW50IGZvciBzdG9yaW5nIGRhdGEKKwkJCSAqLworCQkJaWYgKHpmdF9vbGRfZnRhcGUpIHsKKwkJCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X3dhcm4sIAorICAgICAgIkNhbm5vdCB3cml0ZSB0byBjYXJ0cmlkZ2VzIHdyaXR0ZW4gYnkgb2xkIGZ0YXBlIHdoZW4gbm90IGF0IEJPVCIpOworCQkJfQorCQkJLyogIG5vdCBhdCBCT1QsIGJ1dCBhbGxvdyB3cml0ZXMgYXQgRU9ELCBvZiBjb3Vyc2UKKwkJCSAqLworCQkJaWYgKCF6ZnRfdGFwZV9hdF9lb2QocG9zKSkgeworCQkJCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywKKwkJCQkJICAgICJ0YXBlIG5vdCBhdCBCT1QgYW5kIG5vdCBhdCBFT0QiKTsKKwkJCX0KKwkJfQorCQkvKiAgZmluZS4gTm93IHRoZSB0YXBlIGlzIGVpdGhlciBhdCBCT1Qgb3IgYXQgRU9ELiAqLworCX0KKwkvKiBvciBpbiByYXcgbW9kZSBpbiB3aGljaCBjYXNlIHdlIGRvbid0IGNhcmUgYWJvdXQgQk9UIGFuZCBFT0QgKi8KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICAgICAgT1BFTiByb3V0aW5lIGNhbGxlZCBieSBrZXJuZWwtaW50ZXJmYWNlIGNvZGUKKyAqCisgKiAgICAgIE5PVEU6IHRoaXMgaXMgYWxzbyBjYWxsZWQgYnkgbXRfcmVzZXQoKSB3aXRoIGRldl9taW5vciA9PSAtMQorICogICAgICAgICAgICB0byBmYWtlIGEgcmVvcGVuIGFmdGVyIGEgcmVzZXQuCisgKi8KK2ludCBfemZ0X29wZW4odW5zaWduZWQgaW50IGRldl9taW5vciwgdW5zaWduZWQgaW50IGFjY2Vzc19tb2RlKQoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgdGFwZV91bml0OworCXN0YXRpYyB1bnNpZ25lZCBpbnQgZmlsZV9hY2Nlc3NfbW9kZTsKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKChpbnQpZGV2X21pbm9yID09IC0xKSB7CisJCS8qIGZha2UgcmVvcGVuICovCisJCXpmdF91bml0ICAgID0gdGFwZV91bml0OworCQlhY2Nlc3NfbW9kZSA9IGZpbGVfYWNjZXNzX21vZGU7CisJCXpmdF9pbml0X2RyaXZlcigpOyAvKiByZXNldCBhbGwgc3RhdGljIGRhdGEgdG8gZGVmYXVsdHMgKi8KKwl9IGVsc2UgeworCQl0YXBlX3VuaXQgICAgICAgID0gZGV2X21pbm9yOworCQlmaWxlX2FjY2Vzc19tb2RlID0gYWNjZXNzX21vZGU7CisJCWlmICgocmVzdWx0ID0gZnRhcGVfZW5hYmxlKEZUQVBFX1NFTChkZXZfbWlub3IpKSkgPCAwKSB7CisJCQlUUkFDRV9BQk9SVCgtRU5YSU8sIGZ0X3RfZXJyLAorCQkJCSAgICAiZnRhcGVfZW5hYmxlIGZhaWxlZDogJWQiLCByZXN1bHQpOworCQl9CisJCWlmIChmdF9uZXdfdGFwZSB8fCBmdF9ub190YXBlIHx8ICFmdF9mb3JtYXR0ZWQgfHwKKwkJICAgIChGVEFQRV9TRUwoemZ0X3VuaXQpICE9IEZUQVBFX1NFTChkZXZfbWlub3IpKSB8fAorCQkgICAgKHpmdF91bml0ICYgWkZUX1JBV19NT0RFKSAhPSAoZGV2X21pbm9yICYgWkZUX1JBV19NT0RFKSkgeworCQkJLyogcmVzZXQgYWxsIHN0YXRpYyBkYXRhIHRvIGRlZmF1bHRzLAorCQkJICovCisJCQl6ZnRfaW5pdF9kcml2ZXIoKTsgCisJCX0KKwkJemZ0X3VuaXQgPSBkZXZfbWlub3I7CisJfQorCXpmdF9zZXRfZmxhZ3MoemZ0X3VuaXQpOyAvKiBkZWNvZGUgdGhlIG1pbm9yIGJpdHMgKi8KKwlpZiAoemZ0X2Jsa19zeiA9PSAxICYmIHpmdF91c2VfY29tcHJlc3Npb24pIHsKKwkJZnRhcGVfZGlzYWJsZSgpOyAvKiByZXNldHMgZnRfbm9fdGFwZSAqLworCQlUUkFDRV9BQk9SVCgtRU5PREVWLCBmdF90X3dhcm4sICJWYXJpYWJsZSBibG9jayBzaXplIG5vdCB5ZXQgIgorCQkJICAgICJzdXBwb3J0ZWQgd2l0aCBjb21wcmVzc2lvbiIpOworCX0KKwkvKiAgbm8gbmVlZCBmb3IgbW9zdCBvZiB0aGUgYnVmZmVycyB3aGVuIG5vIHRhcGUgb3Igbm90CisJICogIGZvcm1hdHRlZC4gIGZvciB0aGUgcmVhZC93cml0ZSBvcGVyYXRpb25zLCBpdCBpcyB0aGUKKwkgKiAgcmVnYXJkbGVzcyB3aGV0aGVyIHRoZXJlIGlzIG5vIHRhcGUsIGEgbm90LWZvcm1hdHRlZCB0YXBlCisJICogIG9yIHRoZSB3aGV0aGVyIHRoZSBkcml2ZXIgaXMgc29mdCBvZmZsaW5lLiAgCisJICogIE5ldmVydGhlbGVzcyB3ZSBhbGxvdyBzb21lIGlvY3RscyB3aXRoIG5vbi1mb3JtYXR0ZWQgdGFwZXMsIAorCSAqICBsaWtlIHJld2luZCBhbmQgcmVzZXQuCisJICovCisJaWYgKGZ0X25vX3RhcGUgfHwgIWZ0X2Zvcm1hdHRlZCkgeworCQl6ZnRfdW5pbml0X21lbSgpOworCX0KKwlpZiAoZnRfbm9fdGFwZSkgeworCQl6ZnRfb2ZmbGluZSA9IDE7IC8qIHNvIHdlIG5lZWQgbm90IHRlc3QgdHdvIHZhcmlhYmxlcyAqLworCX0KKwlpZiAoKGFjY2Vzc19tb2RlID09IE9fV1JPTkxZIHx8IGFjY2Vzc19tb2RlID09IE9fUkRXUikgJiYKKwkgICAgKGZ0X3dyaXRlX3Byb3RlY3RlZCB8fCBmdF9ub190YXBlKSkgeworCQlmdGFwZV9kaXNhYmxlKCk7IC8qIHJlc2V0cyBmdF9ub190YXBlICovCisJCVRSQUNFX0FCT1JUKGZ0X25vX3RhcGUgPyAtRU5YSU8gOiAtRVJPRlMsCisJCQkgICAgZnRfdF93YXJuLCAid3JvbmcgYWNjZXNzIG1vZGUgJXMgY2FydHJpZGdlIiwKKwkJCSAgICBmdF9ub190YXBlID8gIndpdGhvdXQgYSIgOiAid2l0aCB3cml0ZSBwcm90ZWN0ZWQiKTsKKwl9CisJemZ0X3dyaXRlX3Byb3RlY3RlZCA9IChhY2Nlc3NfbW9kZSA9PSBPX1JET05MWSB8fCAKKwkJCSAgICAgICBmdF93cml0ZV9wcm90ZWN0ZWQgIT0gMCk7CisJaWYgKHpmdF93cml0ZV9wcm90ZWN0ZWQpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJICAgICAgInJlYWQgb25seSBhY2Nlc3MgbW9kZTogJWQsICIKKwkJICAgICAgImRyaXZlIHdyaXRlIHByb3RlY3RlZDogJWQiLCAKKwkJICAgICAgYWNjZXNzX21vZGUgPT0gT19SRE9OTFksCisJCSAgICAgIGZ0X3dyaXRlX3Byb3RlY3RlZCAhPSAwKTsKKwl9CisJaWYgKCF6ZnRfb2ZmbGluZSkgeworCQlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19vbmNlKCZ6ZnRfZGVibG9ja19idWYsRlRfU0VHTUVOVF9TSVpFKSwKKwkJCSAgICBmdGFwZV9kaXNhYmxlKCkpOworCX0KKwkvKiB6ZnRfc2VnX3BvcyBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHRoZSB2dGJsIHNlZ3BvcyBidXQgbm90CisJICogaWYgaW4gY29tcGF0aWJpbGl0eSBtb2RlIGFuZCBvbmx5IGFmdGVyIHdlIHJlYWQgaW4gdGhlCisJICogaGVhZGVyIHNlZ21lbnRzCisJICoKKwkgKiBtaWdodCBhbHNvIGJlIGEgcHJvYmxlbSBpZiB0aGUgdXNlciBtYWtlcyBhIGJhY2t1cCB3aXRoIGEKKwkgKiAqcWZ0KiBkZXZpY2UgYW5kIHJld2luZHMgaXQgd2l0aCBhIHJhdyBkZXZpY2UuCisJICovCisJaWYgKHpmdF9xaWNfbW9kZSAgICAgICAgICYmCisJICAgICF6ZnRfb2xkX2Z0YXBlICAgICAgICYmCisJICAgIHpmdF9wb3Muc2VnX3BvcyA+PSAwICYmCisJICAgIHpmdF9oZWFkZXJfcmVhZCAgICAgICYmIAorCSAgICB6ZnRfcG9zLnNlZ19wb3MgPD0gZnRfZmlyc3RfZGF0YV9zZWdtZW50KSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ5b3UgcHJvYmFibHkgbWl4ZWQgdXAgdGhlIHpmdGFwZSBkZXZpY2VzISIpOworCQl6ZnRfcmVzZXRfcG9zaXRpb24oJnpmdF9wb3MpOyAKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgICAgIFJFTEVBU0Ugcm91dGluZSBjYWxsZWQgYnkga2VybmVsLWludGVyZmFjZSBjb2RlCisgKi8KK2ludCBfemZ0X2Nsb3NlKHZvaWQpCit7CisJaW50IHJlc3VsdCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYgKHpmdF9vZmZsaW5lKSB7CisJCS8qIGNhbGwgdGhlIGhhcmR3YXJlIHJlbGVhc2Ugcm91dGluZS4gUHV0cyB0aGUgZHJpdmUgb2ZmbGluZSAqLworCQlmdGFwZV9kaXNhYmxlKCk7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJaWYgKCEoZnRfd3JpdGVfcHJvdGVjdGVkIHx8IHpmdF9vbGRfZnRhcGUpKSB7CisJCXJlc3VsdCA9IHpmdF9mbHVzaF9idWZmZXJzKCk7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ3cml0aW5nIGZpbGUgbWFyayBhdCBjdXJyZW50IHBvc2l0aW9uIik7CisJCWlmICh6ZnRfcWljX21vZGUgJiYgemZ0X2Nsb3NlX3ZvbHVtZSgmemZ0X3BvcykgPT0gMCkgeworCQkJemZ0X21vdmVfcGFzdF9lb2YoJnpmdF9wb3MpOworCQl9CisJCWlmICgoemZ0X3RhcGVfYXRfbGJvdCgmemZ0X3BvcykgfHwKKwkJICAgICAhKHpmdF91bml0ICYgRlRBUEVfTk9fUkVXSU5EKSkpIHsKKwkJCWlmIChyZXN1bHQgPj0gMCkgeworCQkJCXJlc3VsdCA9IHpmdF91cGRhdGVfaGVhZGVyX3NlZ21lbnRzKCk7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3RfZXJyLAorCQkJCSJFcnJvcjogdW5hYmxlIHRvIHVwZGF0ZSBoZWFkZXIgc2VnbWVudHMiKTsKKwkJCX0KKwkJfQorCX0KKwlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKKwlpZiAoISh6ZnRfdW5pdCAmIEZUQVBFX05PX1JFV0lORCkpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInJld2luZGluZyB0YXBlIik7CisJCWlmIChmdGFwZV9zZWVrX3RvX2JvdCgpIDwgMCAmJiByZXN1bHQgPj0gMCkgeworCQkJcmVzdWx0ID0gLUVJTzsgLyoga2VlcCBvbGQgdmFsdWUgKi8KKwkJfQorCQl6ZnRfcmVzZXRfcG9zaXRpb24oJnpmdF9wb3MpOworCX0gCisJemZ0X3phcF9yZWFkX2J1ZmZlcnMoKTsKKwkvKiAgbm93IGZyZWUgdXAgbWVtb3J5IGFzIG11Y2ggYXMgcG9zc2libGUuIFdlIGRvbid0IGRlc3Ryb3kKKwkgKiAgdGhlIGRlYmxvY2sgYnVmZmVyIGlmIGl0IGNvbnRhaW5lcyBhIHZhbGlkIHNlZ21lbnQuCisJICovCisJaWYgKHpmdF9kZWJsb2NrX3NlZ21lbnQgPT0gLTEpIHsKKwkJemZ0X3ZmcmVlKCZ6ZnRfZGVibG9ja19idWYsIEZUX1NFR01FTlRfU0laRSk7IAorCX0KKwkvKiBoaWdoIGxldmVsIGRyaXZlciBzdGF0dXMsIGZvcmNlcyBjcmVhdGlvbiBvZiBhIG5ldyB2b2x1bWUKKwkgKiB3aGVuIGNhbGxpbmcgZnRhcGVfd3JpdGUgYWdhaW4gYW5kIG5vdCB6ZnRfanVzdF9iZWZvcmVfZW9mCisJICovCisJemZ0X2lvX3N0YXRlID0gemZ0X2lkbGU7ICAKKwlpZiAoZ29pbmdfb2ZmbGluZSkgeworCQl6ZnRfaW5pdF9kcml2ZXIoKTsKKwkJemZ0X3VuaW5pdF9tZW0oKTsKKwkJZ29pbmdfb2ZmbGluZSA9IDA7CisJCXpmdF9vZmZsaW5lICAgPSAxOworCX0gZWxzZSBpZiAoemZ0X2NtcHJfbG9jaygwIC8qIGRvbid0IGxvYWQgKi8pID09IDApIHsKKwkJKCp6ZnRfY21wcl9vcHMtPnJlc2V0KSgpOyAvKiB1bmxvY2sgaXQgYWdhaW4gKi8KKwl9CisJemZ0X21lbW9yeV9zdGF0cygpOworCS8qIGNhbGwgdGhlIGhhcmR3YXJlIHJlbGVhc2Ugcm91dGluZS4gUHV0cyB0aGUgZHJpdmUgb2ZmbGluZSAqLworCWZ0YXBlX2Rpc2FibGUoKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyoKKyAqICB0aGUgd3JhcHBlciBmdW5jdGlvbiBhcm91bmQgdGhlIHdyYXBwZXIgTVRJT0NUT1AgaW9jdGwKKyAqLworc3RhdGljIGludCBtdGlvY3RvcChzdHJ1Y3QgbXRvcCAqbXRvcCwgaW50IGFyZ19zaXplKQoreworCWludCByZXN1bHQgPSAwOworCWZ1bl9lbnRyeSAqbXRfZnVuX2VudHJ5OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG10b3ApIHx8IG10b3AtPm10X29wID49IE5SX01UX0NNRFMpIHsKKwkJVFJBQ0VfRVhJVCAtRUlOVkFMOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAiY2FsbGluZyBNVElPQ1RPUCBjb21tYW5kOiAlcyIsCisJICAgICAgbXRfZnVuc1ttdG9wLT5tdF9vcF0ubmFtZSk7CisJbXRfZnVuX2VudHJ5PSAmbXRfZnVuc1ttdG9wLT5tdF9vcF07CisJemZ0X3Jlc2lkID0gbXRvcC0+bXRfY291bnQ7CisJaWYgKCFtdF9mdW5fZW50cnktPm9mZmxpbmUgJiYgemZ0X29mZmxpbmUpIHsKKwkJaWYgKGZ0X25vX3RhcGUpIHsKKwkJCVRSQUNFX0FCT1JUKC1FTlhJTywgZnRfdF9pbmZvLCAibm8gdGFwZSBwcmVzZW50Iik7CisJCX0gZWxzZSB7CisJCQlUUkFDRV9BQk9SVCgtRU5YSU8sIGZ0X3RfaW5mbywgImRyaXZlIGlzIG9mZmxpbmUiKTsKKwkJfQorCX0KKwlpZiAoIW10X2Z1bl9lbnRyeS0+bm90X2Zvcm1hdHRlZCAmJiAhZnRfZm9ybWF0dGVkKSB7CisJCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywgInRhcGUgaXMgbm90IGZvcm1hdHRlZCIpOworCX0KKwlpZiAoIW10X2Z1bl9lbnRyeS0+d3JpdGVfcHJvdGVjdGVkKSB7CisJCVRSQUNFX0NBVENIKHpmdF9jaGVja193cml0ZV9hY2Nlc3MoJnpmdF9wb3MpLCk7CisJfQorCWlmIChtdF9mdW5fZW50cnktPm5lZWRfaWRsZV9zdGF0ZSAmJiAhKHpmdF9vZmZsaW5lIHx8ICFmdF9mb3JtYXR0ZWQpKSB7CisJCVRSQUNFX0NBVENIKHpmdF9kZWZfaWRsZV9zdGF0ZSgpLCk7CisJfQorCWlmICghemZ0X3FpY19tb2RlICYmICFtdF9mdW5fZW50cnktPnJhd19tb2RlKSB7CisJCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywgCisiRHJpdmUgbmVlZHMgdG8gYmUgaW4gUUlDLTgwIGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgdGhpcyBjb21tYW5kIik7CisJfQorCXJlc3VsdCA9IChtdF9mdW5fZW50cnktPmZ1bmN0aW9uKSgmbXRvcC0+bXRfY291bnQpOworCWlmICh6ZnRfdGFwZV9hdF9sYm90KCZ6ZnRfcG9zKSkgeworCQlUUkFDRV9DQVRDSCh6ZnRfdXBkYXRlX2hlYWRlcl9zZWdtZW50cygpLCk7CisJfQorCWlmIChyZXN1bHQgPj0gMCkgeworCQl6ZnRfcmVzaWQgPSAwOworCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyoKKyAqICBzdGFuZGFyZCBNVElPQ0dFVCBpb2N0bAorICovCitzdGF0aWMgaW50IG10aW9jZ2V0KHN0cnVjdCBtdGdldCAqbXRnZXQsIGludCBhcmdfc2l6ZSkKK3sKKwljb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lOworCV9fczY0IG1heF90YXBlX3BvczsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdGdldCkpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwKKwkJCSAgICBhcmdfc2l6ZSk7CisJfQorCW10Z2V0LT5tdF90eXBlICA9IGZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkICsgMHg4MDAwMDA7CisJbXRnZXQtPm10X2RzcmVnID0gZnRfbGFzdF9zdGF0dXMuc3BhY2U7CisJbXRnZXQtPm10X2VycmVnID0gZnRfbGFzdF9lcnJvci5zcGFjZTsgLyogZXJyb3IgcmVnaXN0ZXIgKi8KKwltdGdldC0+bXRfcmVzaWQgPSB6ZnRfcmVzaWQ7IC8qIHJlc2lkdXVtIG9mIHdyaXRlcywgcmVhZHMgYW5kCisJCQkJICAgICAgKiBNVElPQ1RPUCBjb21tYW5kcyAKKwkJCQkgICAgICAqLworCWlmICghemZ0X29mZmxpbmUpIHsgLyogbmVpdGhlciBub190YXBlIG5vciBzb2Z0IG9mZmxpbmUgKi8KKwkJbXRnZXQtPm10X2dzdGF0ID0gR01UX09OTElORSh+MFVMKTsKKwkJLyogc2hvdWxkIHJhdGhlciByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgY2FydHJpZGdlCisJCSAqIHRoYW4gdGhlIGFjY2VzcyBtb2RlIG9mIHRoZSBmaWxlLCB0aGVyZWZvciB1c2UKKwkJICogZnRfd3JpdGVfcHJvdGVjdGVkLCBub3QgemZ0X3dyaXRlX3Byb3RlY3RlZCAKKwkJICovCisJCWlmIChmdF93cml0ZV9wcm90ZWN0ZWQpIHsKKwkJCW10Z2V0LT5tdF9nc3RhdCB8PSBHTVRfV1JfUFJPVCh+MFVMKTsKKwkJfQorCQlpZih6ZnRfaGVhZGVyX3JlYWQpIHsgLyogdGhpcyBjYXRjaGVzIG5vbi1mb3JtYXR0ZWQgKi8KKwkJCXZvbHVtZSA9IHpmdF9maW5kX3ZvbHVtZSh6ZnRfcG9zLnNlZ19wb3MpOworCQkJbXRnZXQtPm10X2ZpbGVubyA9IHZvbHVtZS0+Y291bnQ7CisJCQltYXhfdGFwZV9wb3MgPSB6ZnRfY2FwYWNpdHkgLSB6ZnRfYmxrX3N6OworCQkJaWYgKHpmdF91c2VfY29tcHJlc3Npb24pIHsKKwkJCQltYXhfdGFwZV9wb3MgLT0gWkZUX0NNUFJfT1ZFUkhFQUQ7CisJCQl9CisJCQlpZiAoemZ0X3RhcGVfYXRfZW9kKCZ6ZnRfcG9zKSkgeworCQkJCW10Z2V0LT5tdF9nc3RhdCB8PSBHTVRfRU9EKH4wVUwpOworCQkJfQorCQkJaWYgKHpmdF9wb3MudGFwZV9wb3MgPiBtYXhfdGFwZV9wb3MpIHsKKwkJCQltdGdldC0+bXRfZ3N0YXQgfD0gR01UX0VPVCh+MFVMKTsKKwkJCX0KKwkJCW10Z2V0LT5tdF9ibGtubyA9IHpmdF9kaXZfYmxrc3ooemZ0X3Bvcy52b2x1bWVfcG9zLAorCQkJCQkJCXZvbHVtZS0+YmxrX3N6KTsKKwkJCWlmICh6ZnRfanVzdF9iZWZvcmVfZW9mKSB7CisJCQkJbXRnZXQtPm10X2dzdGF0IHw9IEdNVF9FT0YofjBVTCk7CisJCQl9CisJCQlpZiAoemZ0X3RhcGVfYXRfbGJvdCgmemZ0X3BvcykpIHsKKwkJCQltdGdldC0+bXRfZ3N0YXQgfD0gR01UX0JPVCh+MFVMKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW10Z2V0LT5tdF9maWxlbm8gPSBtdGdldC0+bXRfYmxrbm8gPSAtMTsKKwkJCWlmIChtdGdldC0+bXRfZHNyZWcgJiBRSUNfU1RBVFVTX0FUX0JPVCkgeworCQkJCW10Z2V0LT5tdF9nc3RhdCB8PSBHTVRfQk9UKH4wVUwpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKGZ0X25vX3RhcGUpIHsKKwkJCW10Z2V0LT5tdF9nc3RhdCA9IEdNVF9EUl9PUEVOKH4wVUwpOworCQl9IGVsc2UgeworCQkJbXRnZXQtPm10X2dzdGF0ID0gMFVMOworCQl9CisgCQltdGdldC0+bXRfZmlsZW5vID0gbXRnZXQtPm10X2Jsa25vID0gLTE7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworI2lmZGVmIE1USU9DUkRGVFNFRworLyoKKyAqICBSZWFkIGEgZmxvcHB5IHRhcGUgc2VnbWVudC4gVGhpcyBpcyB1c2VmdWwgZm9yIG1hbmlwdWxhdGluZyB0aGUKKyAqICB2b2x1bWUgdGFibGUsIGFuZCByZWFkIHRoZSBvbGQgaGVhZGVyIHNlZ21lbnQgYmVmb3JlIHJlLWZvcm1hdHRpbmcKKyAqICB0aGUgY2FydHJpZGdlLgorICovCitzdGF0aWMgaW50IG10aW9jcmRmdHNlZyhzdHJ1Y3QgbXRmdHNlZyAqIG10ZnRzZWcsIGludCBhcmdfc2l6ZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlUUkFDRShmdF90X25vaXNlLCAiTWFnIHRhcGUgaW9jdGwgY29tbWFuZDogTVRJT0NSREZUU0VHIik7CisJaWYgKHpmdF9xaWNfbW9kZSkgeworCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sCisJCQkgICAgImRyaXZlciBuZWVkcyB0byBiZSBpbiByYXcgbW9kZSBmb3IgdGhpcyBpb2N0bCIpOworCX0gCisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXRmdHNlZykpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwKKwkJCSAgICBhcmdfc2l6ZSk7CisJfQorCWlmICh6ZnRfb2ZmbGluZSkgeworCQlUUkFDRV9FWElUIC1FTlhJTzsKKwl9CisJaWYgKG10ZnRzZWctPm10X21vZGUgIT0gRlRfUkRfU0lOR0xFICYmCisJICAgIG10ZnRzZWctPm10X21vZGUgIT0gRlRfUkRfQUhFQUQpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLCAiaW52YWxpZCByZWFkIG1vZGUiKTsKKwl9CisJaWYgKCFmdF9mb3JtYXR0ZWQpIHsKKwkJVFJBQ0VfRVhJVCAtRUFDQ0VTOyAvKiAtRU5YSU8gPyAqLworCisJfQorCWlmICghemZ0X2hlYWRlcl9yZWFkKSB7CisJCVRSQUNFX0NBVENIKHpmdF9kZWZfaWRsZV9zdGF0ZSgpLCk7CisJfQorCWlmIChtdGZ0c2VnLT5tdF9zZWdubyA+IGZ0X2xhc3RfZGF0YV9zZWdtZW50KSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywgInNlZ21lbnQgbnVtYmVyIGlzIHRvbyBsYXJnZSIpOworCX0KKwltdGZ0c2VnLT5tdF9yZXN1bHQgPSBmdGFwZV9yZWFkX3NlZ21lbnQobXRmdHNlZy0+bXRfc2Vnbm8sCisJCQkJCQl6ZnRfZGVibG9ja19idWYsCisJCQkJCQltdGZ0c2VnLT5tdF9tb2RlKTsKKwlpZiAobXRmdHNlZy0+bXRfcmVzdWx0IDwgMCkgeworCQkvKiAgYSBuZWdhdGl2IHJlc3VsdCBpcyBub3QgYW4gaW9jdGwgZXJyb3IuIGlmCisJCSAqICB0aGUgdXNlciB3YW50cyB0byByZWFkIGRhbWFnZWQgdGFwZXMsCisJCSAqICBpdCdzIHVwIHRvIGhlci9oaW0KKwkJICovCisJCVRSQUNFX0VYSVQgMDsKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihtdGZ0c2VnLT5tdF9kYXRhLAorCQkJIHpmdF9kZWJsb2NrX2J1ZiwKKwkJCSBtdGZ0c2VnLT5tdF9yZXN1bHQpICE9IDApIHsKKwkJVFJBQ0VfRVhJVCAtRUZBVUxUOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIE1USU9DV1JGVFNFRworLyoKKyAqICB3cml0ZSBhIGZsb3BweSB0YXBlIHNlZ21lbnQuIFRoaXMgdmVyc2lvbiBmZWF0dXJlcyB3cml0aW5nIG9mCisgKiAgZGVsZXRlZCBhZGRyZXNzIG1hcmtzLCBhbmQgZ3JhY2VmdWxseSBpZ25vcmVzIHRoZSAoc29mdHdhcmUpCisgKiAgZnRfZm9ybWF0dGVkIGZsYWcgdG8gc3VwcG9ydCB3cml0aW5nIG9mIGhlYWRlciBzZWdtZW50cyBhZnRlcgorICogIGZvcm1hdHRpbmcuCisgKi8KK3N0YXRpYyBpbnQgbXRpb2N3cmZ0c2VnKHN0cnVjdCBtdGZ0c2VnICogbXRmdHNlZywgaW50IGFyZ19zaXplKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJVFJBQ0UoZnRfdF9ub2lzZSwgIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DV1JGVFNFRyIpOworCWlmICh6ZnRfd3JpdGVfcHJvdGVjdGVkIHx8IHpmdF9xaWNfbW9kZSkgeworCQlUUkFDRV9FWElUIC1FQUNDRVM7CisJfSAKKwlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdGZ0c2VnKSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sICJiYWQgYXJndW1lbnQgc2l6ZTogJWQiLAorCQkJICAgIGFyZ19zaXplKTsKKwl9CisJaWYgKHpmdF9vZmZsaW5lKSB7CisJCVRSQUNFX0VYSVQgLUVOWElPOworCX0KKwlpZiAobXRmdHNlZy0+bXRfbW9kZSAhPSBGVF9XUl9BU1lOQyAgICYmIAorCSAgICBtdGZ0c2VnLT5tdF9tb2RlICE9IEZUX1dSX01VTFRJICAgJiYKKwkgICAgbXRmdHNlZy0+bXRfbW9kZSAhPSBGVF9XUl9TSU5HTEUgICYmCisJICAgIG10ZnRzZWctPm10X21vZGUgIT0gRlRfV1JfREVMRVRFKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywgImludmFsaWQgd3JpdGUgbW9kZSIpOworCX0KKwkvKgorCSAqICBXZSBkb24ndCBjaGVjayBmb3IgZnRfZm9ybWF0dGVkLCBiZWNhdXNlIHRoaXMgZ2l2ZXMKKwkgKiAgb25seSB0aGUgc29mdHdhcmUgc3RhdHVzIG9mIHRoZSBkcml2ZXIuCisJICoKKwkgKiAgV2UgYXNzdW1lIHRoYXQgdGhlIHVzZXIga25vd3Mgd2hhdCBpdCBpcworCSAqICBkb2luZy4gQW5kIHJlbHkgb24gdGhlIGxvdyBsZXZlbCBzdHVmZiB0byBmYWlsCisJICogIHdoZW4gdGhlIHRhcGUgaXNuJ3QgZm9ybWF0dGVkLiBXZSBvbmx5IG1ha2Ugc3VyZQorCSAqICB0aGF0IFRoZSBoZWFkZXIgc2VnbWVudCBidWZmZXIgaXMgYWxsb2NhdGVkLAorCSAqICBiZWNhdXNlIGl0IGhvbGRzIHRoZSBiYWQgc2VjdG9yIG1hcC4KKwkgKi8KKwlpZiAoemZ0X2hzZWdfYnVmID09IE5VTEwpIHsKKwkJVFJBQ0VfRVhJVCAtRU5YSU87CisJfQorCWlmIChtdGZ0c2VnLT5tdF9tb2RlICE9IEZUX1dSX0RFTEVURSkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoemZ0X2RlYmxvY2tfYnVmLCAKKwkJCQkgICBtdGZ0c2VnLT5tdF9kYXRhLAorCQkJCSAgIEZUX1NFR01FTlRfU0laRSkgIT0gMCkgeworCQkJVFJBQ0VfRVhJVCAtRUZBVUxUOworCQl9CisJfQorCW10ZnRzZWctPm10X3Jlc3VsdCA9IGZ0YXBlX3dyaXRlX3NlZ21lbnQobXRmdHNlZy0+bXRfc2Vnbm8sIAorCQkJCQkJIHpmdF9kZWJsb2NrX2J1ZiwKKwkJCQkJCSBtdGZ0c2VnLT5tdF9tb2RlKTsKKwlpZiAobXRmdHNlZy0+bXRfcmVzdWx0ID49IDAgJiYgbXRmdHNlZy0+bXRfbW9kZSA9PSBGVF9XUl9TSU5HTEUpIHsKKwkJLyogIAorCQkgKiAgYSBuZWdhdGl2IHJlc3VsdCBpcyBub3QgYW4gaW9jdGwgZXJyb3IuIGlmCisJCSAqICB0aGUgdXNlciB3YW50cyB0byB3cml0ZSBkYW1hZ2VkIHRhcGVzLAorCQkgKiAgaXQncyB1cCB0byBoZXIvaGltCisJCSAqLworCQlpZiAoKHJlc3VsdCA9IGZ0YXBlX2xvb3BfdW50aWxfd3JpdGVzX2RvbmUoKSkgPCAwKSB7CisJCQltdGZ0c2VnLT5tdF9yZXN1bHQgPSByZXN1bHQ7CisJCX0KKwl9CisJVFJBQ0VfRVhJVCAwOworfQorI2VuZGlmCisgIAorI2lmZGVmIE1USU9DVk9MSU5GTworLyoKKyAqICBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdm9sdW1lIHBvc2l0aW9uZWQgYXQuCisgKi8KK3N0YXRpYyBpbnQgbXRpb2N2b2xpbmZvKHN0cnVjdCBtdHZvbGluZm8gKnZvbGluZm8sIGludCBhcmdfc2l6ZSkKK3sKKwljb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJNYWcgdGFwZSBpb2N0bCBjb21tYW5kOiBNVElPQ1ZPTElORk8iKTsKKwlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdHZvbGluZm8pKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsCisJCQkgICAgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwgYXJnX3NpemUpOworCX0KKwlpZiAoemZ0X29mZmxpbmUpIHsKKwkJVFJBQ0VfRVhJVCAtRU5YSU87CisJfQorCWlmICghZnRfZm9ybWF0dGVkKSB7CisJCVRSQUNFX0VYSVQgLUVBQ0NFUzsKKwl9CisJVFJBQ0VfQ0FUQ0goemZ0X2RlZl9pZGxlX3N0YXRlKCksKTsKKwl2b2x1bWUgPSB6ZnRfZmluZF92b2x1bWUoemZ0X3Bvcy5zZWdfcG9zKTsKKwl2b2xpbmZvLT5tdF92b2xubyAgID0gdm9sdW1lLT5jb3VudDsKKwl2b2xpbmZvLT5tdF9ibGtzeiAgID0gdm9sdW1lLT5ibGtfc3ogPT0gMSA/IDAgOiB2b2x1bWUtPmJsa19zejsKKwl2b2xpbmZvLT5tdF9zaXplICAgID0gdm9sdW1lLT5zaXplID4+IDEwOworCXZvbGluZm8tPm10X3Jhd3NpemUgPSAoKHpmdF9jYWxjX3RhcGVfcG9zKHZvbHVtZS0+ZW5kX3NlZyArIDEpID4+IDEwKSAtCisJCQkgICAgICAgKHpmdF9jYWxjX3RhcGVfcG9zKHZvbHVtZS0+c3RhcnRfc2VnKSA+PiAxMCkpOworCXZvbGluZm8tPm10X2NtcHIgICAgPSB2b2x1bWUtPnVzZV9jb21wcmVzc2lvbjsKKwlUUkFDRV9FWElUIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIFpGVF9PQlNPTEVURSAgCitzdGF0aWMgaW50IG10aW9jX3pmdGFwZV9nZXRibGtzeihzdHJ1Y3QgbXRibGtzeiAqYmxrc3osIGludCBhcmdfc2l6ZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlUUkFDRShmdF90X25vaXNlLCAiXG4iCisJICAgICAgS0VSTl9JTkZPICJNYWcgdGFwZSBpb2N0bCBjb21tYW5kOiBNVElPQ19aVEFQRV9HRVRCTEtTWlxuIgorCSAgICAgIEtFUk5fSU5GTyAiVGhpcyBpb2N0bCBpcyBoZXJlIG1lcmVseSBmb3IgY29tcGF0aWJpbGl0eS5cbiIKKwkgICAgICBLRVJOX0lORk8gIlBsZWFzZSB1c2UgTVRJT0NWT0xJTkZPIGluc3RlYWQiKTsKKwlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdGJsa3N6KSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLAorCQkJICAgIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsIGFyZ19zaXplKTsKKwl9CisJaWYgKHpmdF9vZmZsaW5lKSB7CisJCVRSQUNFX0VYSVQgLUVOWElPOworCX0KKwlpZiAoIWZ0X2Zvcm1hdHRlZCkgeworCQlUUkFDRV9FWElUIC1FQUNDRVM7CisJfQorCVRSQUNFX0NBVENIKHpmdF9kZWZfaWRsZV9zdGF0ZSgpLCk7CisJYmxrc3otPm10X2Jsa3N6ID0gemZ0X2ZpbmRfdm9sdW1lKHpmdF9wb3Muc2VnX3BvcyktPmJsa19zejsKKwlUUkFDRV9FWElUIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIE1USU9DR0VUU0laRQorLyoKKyAqICBnZXQgdGhlIGNhcGFjaXR5IG9mIHRoZSB0YXBlIGNhcnRyaWRnZS4KKyAqLworc3RhdGljIGludCBtdGlvY2dldHNpemUoc3RydWN0IG10dGFwZXNpemUgKnNpemUsIGludCBhcmdfc2l6ZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlUUkFDRShmdF90X25vaXNlLCAiTWFnIHRhcGUgaW9jdGwgY29tbWFuZDogTVRJT0NfWkZUQVBFX0dFVFNJWkUiKTsKKwlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdHRhcGVzaXplKSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLAorCQkJICAgIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsIGFyZ19zaXplKTsKKwl9CisJaWYgKHpmdF9vZmZsaW5lKSB7CisJCVRSQUNFX0VYSVQgLUVOWElPOworCX0KKwlpZiAoIWZ0X2Zvcm1hdHRlZCkgeworCQlUUkFDRV9FWElUIC1FQUNDRVM7CisJfQorCVRSQUNFX0NBVENIKHpmdF9kZWZfaWRsZV9zdGF0ZSgpLCk7CisJc2l6ZS0+bXRfY2FwYWNpdHkgPSAodW5zaWduZWQgaW50KSh6ZnRfY2FwYWNpdHk+PjEwKTsKKwlzaXplLT5tdF91c2VkICAgICA9ICh1bnNpZ25lZCBpbnQpKHpmdF9nZXRfZW9tX3BvcygpPj4xMCk7CisJVFJBQ0VfRVhJVCAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbXRpb2Nwb3Moc3RydWN0IG10cG9zICptdHBvcywgaW50IGFyZ19zaXplKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJVFJBQ0UoZnRfdF9ub2lzZSwgIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DUE9TIik7CisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXRwb3MpKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsCisJCQkgICAgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwgYXJnX3NpemUpOworCX0KKwlyZXN1bHQgPSBtdF90ZWxsKChpbnQgKikmbXRwb3MtPm10X2Jsa25vKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworI2lmZGVmIE1USU9DRlRGT1JNQVQKKy8qCisgKiBmb3JtYXR0aW5nIG9mIGZsb3BweSB0YXBlIGNhcnRyaWRnZXMuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZAorICogdG9nZXRoZXIgd2l0aCB0aGUgTVRJT0NGVENNRCBpb2N0bCBhbmQgdGhlIG5ldyBtbWFwIGZlYXR1cmUgCisgKi8KKworLyogCisgKiAgVGhpcyBmdW5jdGlvbiB1c2VzIGZ0YXBlX2RlY29kZV9oZWFkZXJfc2VnbWVudCgpIHRvIGluZm9ybSB0aGUgbG93CisgKiAgbGV2ZWwgZnRhcGUgbW9kdWxlIGFib3V0IHRoZSBuZXcgcGFyYW1ldGVycy4KKyAqCisgKiAgSXQgZXJhc2VzIHRoZSBoc2VnX2J1Zi4gVGhlIGNhbGxpbmcgcHJvY2VzcyBtdXN0IHNwZWNpZnkgYWxsCisgKiAgcGFyYW1ldGVycyB0byBhc3N1cmUgcHJvcGVyIG9wZXJhdGlvbi4KKyAqCisgKiAgcmV0dXJuIHZhbHVlczogLUVJTlZBTCAtIHdyb25nIGFyZ3VtZW50IHNpemUKKyAqICAgICAgICAgICAgICAgICAtRUlOVkFMIC0gaWYgZnRhcGVfZGVjb2RlX2hlYWRlcl9zZWdtZW50KCkgZmFpbGVkLgorICovCitzdGF0aWMgaW50IHNldF9mb3JtYXRfcGFybXMoc3RydWN0IGZ0Zm10cGFybXMgKnAsIF9fdTggKmhzZWdfYnVmKQoreworCWZ0X3RyYWNlX3Qgb2xkX2xldmVsID0gVFJBQ0VfTEVWRUw7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlUUkFDRShmdF90X25vaXNlLCAiTVRJT0NGVEZPUk1BVCBvcGVyYXRpb24gRlRGTVRfU0VUUEFSTVMiKTsKKwltZW1zZXQoaHNlZ19idWYsIDAsIEZUX1NFR01FTlRfU0laRSk7CisJUFVUNChoc2VnX2J1ZiwgRlRfU0lHTkFUVVJFLCBGVF9IU0VHX01BR0lDKTsKKworCS8qICBmaWxsIGluIHVzZXIgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKwkgKi8KKwloc2VnX2J1ZltGVF9GTVRfQ09ERV0gPSAoX191OClwLT5mdF9mbXRjb2RlOworCVBVVDIoaHNlZ19idWYsIEZUX1NQVCwgcC0+ZnRfc3B0KTsKKwloc2VnX2J1ZltGVF9UUENdICAgICAgPSAoX191OClwLT5mdF90cGM7CisJaHNlZ19idWZbRlRfRkhNXSAgICAgID0gKF9fdTgpcC0+ZnRfZmhtOworCWhzZWdfYnVmW0ZUX0ZUTV0gICAgICA9IChfX3U4KXAtPmZ0X2Z0bTsKKworCS8qICBmaWxsIGluIHNhbmUgZGVmYXVsdHMgdG8gbWFrZSBmdGFwZSBoYXBweS4KKwkgKi8gCisJaHNlZ19idWZbRlRfRlNNXSA9IChfX3U4KTEyODsgLyogMTI4IGlzIGhhcmQgd2lyZWQgYWxsIG92ZXIgZnRhcGUgKi8KKwlpZiAocC0+ZnRfZm10Y29kZSA9PSBmbXRfYmlnKSB7CisJCVBVVDQoaHNlZ19idWYsIEZUXzZfSFNFR18xLCAgIDApOworCQlQVVQ0KGhzZWdfYnVmLCBGVF82X0hTRUdfMiwgICAxKTsKKwkJUFVUNChoc2VnX2J1ZiwgRlRfNl9GUlNUX1NFRywgMik7CisJCVBVVDQoaHNlZ19idWYsIEZUXzZfTEFTVF9TRUcsIHAtPmZ0X3NwdCAqIHAtPmZ0X3RwYyAtIDEpOworCX0gZWxzZSB7CisJCVBVVDIoaHNlZ19idWYsIEZUX0hTRUdfMSwgICAgMCk7CisJCVBVVDIoaHNlZ19idWYsIEZUX0hTRUdfMiwgICAgMSk7CisJCVBVVDIoaHNlZ19idWYsIEZUX0ZSU1RfU0VHLCAgMik7CisJCVBVVDIoaHNlZ19idWYsIEZUX0xBU1RfU0VHLCBwLT5mdF9zcHQgKiBwLT5mdF90cGMgLSAxKTsKKwl9CisKKwkvKiAgU3luY2hyb25pemUgd2l0aCB0aGUgbG93IGxldmVsIG1vZHVsZS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkKKwkgKiAgbmVlZGVkIGZvciB1bmZvcm1hdHRlZCBjYXJ0cmlkZ2VzIGFzIHRoZSBRSUMgc3RkIHdhcyBwcmV2aW91c2x5IAorCSAqICB1bmtub3duIEJVVCBpcyBuZWVkZWQgdG8gc2V0IGRhdGEgcmF0ZSBhbmQgdG8gY2FsY3VsYXRlIHRpbWVvdXRzLgorCSAqLworCVRSQUNFX0NBVENIKGZ0YXBlX2NhbGlicmF0ZV9kYXRhX3JhdGUocC0+ZnRfcWljc3RkJlFJQ19UQVBFX1NURF9NQVNLKSwKKwkJICAgIF9yZXMgPSAtRUlOVkFMKTsKKworCS8qICBUaGUgZm9sbG93aW5nIHdpbGwgYWxzbyByZWNhbGN1YWx0ZSB0aGUgdGltZW91dHMgZm9yIHRoZSB0YXBlCisJICogIGxlbmd0aCBhbmQgUUlDIHN0ZCB3ZSB3YW50IHRvIGZvcm1hdCB0by4KKwkgKiAgYWJvcnQgd2l0aCAtRUlOVkFMIHJhdGhlciB0aGFuIC1FSU8KKwkgKi8KKwlTRVRfVFJBQ0VfTEVWRUwoZnRfdF93YXJuKTsKKwlUUkFDRV9DQVRDSChmdGFwZV9kZWNvZGVfaGVhZGVyX3NlZ21lbnQoaHNlZ19idWYpLAorCQkgICAgU0VUX1RSQUNFX0xFVkVMKG9sZF9sZXZlbCk7IF9yZXMgPSAtRUlOVkFMKTsKKwlTRVRfVFJBQ0VfTEVWRUwob2xkX2xldmVsKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qCisgKiAgUmV0dXJuIHRoZSBpbnRlcm5hbCBTT0ZUV0FSRSBzdGF0dXMgb2YgdGhlIGtlcm5lbCBkcml2ZXIuIFRoaXMgZG9lcworICogIE5PVCBxdWVyeSB0aGUgdGFwZSBkcml2ZSBhYm91dCBpdHMgc3RhdHVzLgorICovCitzdGF0aWMgaW50IGdldF9mb3JtYXRfcGFybXMoc3RydWN0IGZ0Zm10cGFybXMgKnAsIF9fdTggKmhzZWdfYnVmZmVyKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9ub2lzZSwgIk1USU9DRlRGT1JNQVQgb3BlcmF0aW9uIEZURk1UX0dFVFBBUk1TIik7CisJcC0+ZnRfcWljc3RkICA9IGZ0X3FpY19zdGQ7CisJcC0+ZnRfZm10Y29kZSA9IGZ0X2Zvcm1hdF9jb2RlOworCXAtPmZ0X2ZobSAgICAgPSBoc2VnX2J1ZmZlcltGVF9GSE1dOworCXAtPmZ0X2Z0bSAgICAgPSBoc2VnX2J1ZmZlcltGVF9GVE1dOworCXAtPmZ0X3NwdCAgICAgPSBmdF9zZWdtZW50c19wZXJfdHJhY2s7CisJcC0+ZnRfdHBjICAgICA9IGZ0X3RyYWNrc19wZXJfdGFwZTsKKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRpb2NmdGZvcm1hdChzdHJ1Y3QgbXRmdGZvcm1hdCAqbXRmdGZvcm1hdCwgaW50IGFyZ19zaXplKQoreworCWludCByZXN1bHQ7CisJdW5pb24gZm10X2FyZyAqYXJnID0gJm10ZnRmb3JtYXQtPmZtdF9hcmc7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlUUkFDRShmdF90X25vaXNlLCAiTWFnIHRhcGUgaW9jdGwgY29tbWFuZDogTVRJT0NGVEZPUk1BVCIpOworCWlmICh6ZnRfb2ZmbGluZSkgeworCQlpZiAoZnRfbm9fdGFwZSkgeworCQkJVFJBQ0VfQUJPUlQoLUVOWElPLCBmdF90X2luZm8sICJubyB0YXBlIHByZXNlbnQiKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFX0FCT1JUKC1FTlhJTywgZnRfdF9pbmZvLCAiZHJpdmUgaXMgb2ZmbGluZSIpOworCQl9CisJfQorCWlmICh6ZnRfcWljX21vZGUpIHsKKwkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLAorCQkJICAgICJkcml2ZXIgbmVlZHMgdG8gYmUgaW4gcmF3IG1vZGUgZm9yIHRoaXMgaW9jdGwiKTsKKwl9IAorCWlmICh6ZnRfaHNlZ19idWYgPT0gTlVMTCkgeworCQlUUkFDRV9DQVRDSCh6ZnRfdmNhbGxvY19vbmNlKCZ6ZnRfaHNlZ19idWYsIEZUX1NFR01FTlRfU0laRSksKTsKKwl9CisJemZ0X2hlYWRlcl9yZWFkID0gMDsKKwlzd2l0Y2gobXRmdGZvcm1hdC0+Zm10X29wKSB7CisJY2FzZSBGVEZNVF9TRVRfUEFSTVM6CisJCVRSQUNFX0NBVENIKHNldF9mb3JtYXRfcGFybXMoJmFyZy0+Zm10X3Bhcm1zLCB6ZnRfaHNlZ19idWYpLCk7CisJCVRSQUNFX0VYSVQgMDsKKwljYXNlIEZURk1UX0dFVF9QQVJNUzoKKwkJVFJBQ0VfQ0FUQ0goZ2V0X2Zvcm1hdF9wYXJtcygmYXJnLT5mbXRfcGFybXMsIHpmdF9oc2VnX2J1ZiksKTsKKwkJVFJBQ0VfRVhJVCAwOworCWNhc2UgRlRGTVRfRk9STUFUX1RSQUNLOgorCQlpZiAoKGZ0X2Zvcm1hdHRlZCAmJiB6ZnRfY2hlY2tfd3JpdGVfYWNjZXNzKCZ6ZnRfcG9zKSA8IDApIHx8CisJCSAgICAoIWZ0X2Zvcm1hdHRlZCAmJiB6ZnRfd3JpdGVfcHJvdGVjdGVkKSkgeworCQkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLCAiV3JpdGUgYWNjZXNzIGRlbmllZCIpOworCQl9CisJCVRSQUNFX0NBVENIKGZ0YXBlX2Zvcm1hdF90cmFjayhhcmctPmZtdF90cmFjay5mdF90cmFjaywKKwkJCQkJICAgICAgIGFyZy0+Zm10X3RyYWNrLmZ0X2dhcDMpLCk7CisJCVRSQUNFX0VYSVQgMDsKKwljYXNlIEZURk1UX1NUQVRVUzoKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfZm9ybWF0X3N0YXR1cygmYXJnLT5mbXRfc3RhdHVzLmZ0X3NlZ21lbnQpLCk7CisJCVRSQUNFX0VYSVQgMDsKKwljYXNlIEZURk1UX1ZFUklGWToKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfdmVyaWZ5X3NlZ21lbnQoYXJnLT5mbXRfdmVyaWZ5LmZ0X3NlZ21lbnQsCisJCQkJKFNlY3Rvck1hcCAqKSZhcmctPmZtdF92ZXJpZnkuZnRfYnNtKSwpOworCQlUUkFDRV9FWElUIDA7CisJZGVmYXVsdDoKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9lcnIsICJJbnZhbGlkIGZvcm1hdCBvcGVyYXRpb24iKTsKKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmZGVmIE1USU9DRlRDTUQKKy8qCisgKiAgc2VuZCBhIFFJQy0xMTcgY29tbWFuZCB0byB0aGUgZHJpdmUsIHdpdGggb3B0aW9uYWwgdGltZW91dHMsCisgKiAgcGFyYW1ldGVyIGFuZCByZXN1bHQgYml0cy4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvZ2V0aGVyCisgKiAgd2l0aCB0aGUgZm9ybWF0dGluZyBpb2N0bC4KKyAqLworc3RhdGljIGludCBtdGlvY2Z0Y21kKHN0cnVjdCBtdGZ0Y21kICpmdGNtZCwgaW50IGFyZ19zaXplKQoreworCWludCBpOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9ub2lzZSwgIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DRlRDTUQiKTsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJVFJBQ0VfQUJPUlQoLUVQRVJNLCBmdF90X2luZm8sCisJCQkgICAgIm5lZWQgQ0FQX1NZU19BRE1JTiBjYXBhYmlsaXR5IHRvIHNlbmQgcmF3IHFpYy0xMTcgY29tbWFuZHMiKTsKKwl9CisJaWYgKHpmdF9xaWNfbW9kZSkgeworCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sCisJCQkgICAgImRyaXZlciBuZWVkcyB0byBiZSBpbiByYXcgbW9kZSBmb3IgdGhpcyBpb2N0bCIpOworCX0gCisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXRmdGNtZCkpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwKKwkJCSAgICBmdF90X2luZm8sICJiYWQgYXJndW1lbnQgc2l6ZTogJWQiLCBhcmdfc2l6ZSk7CisJfQorCWlmIChmdGNtZC0+ZnRfd2FpdF9iZWZvcmUpIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVhZHlfd2FpdChmdGNtZC0+ZnRfd2FpdF9iZWZvcmUsCisJCQkJCSAgICAgJmZ0Y21kLT5mdF9zdGF0dXMpLCk7CisJfQorCWlmIChmdGNtZC0+ZnRfc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikKKwkJZ290byBmdG10Y21kX2Vycm9yOworCWlmIChmdGNtZC0+ZnRfcmVzdWx0X2JpdHMgIT0gMCkgeworCQlUUkFDRV9DQVRDSChmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKCZmdGNtZC0+ZnRfcmVzdWx0LAorCQkJCQkJICAgZnRjbWQtPmZ0X2NtZCwKKwkJCQkJCSAgIGZ0Y21kLT5mdF9yZXN1bHRfYml0cyksKTsKKwl9IGVsc2UgeworCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKGZ0Y21kLT5mdF9jbWQpLCk7CisJCWlmIChmdGNtZC0+ZnRfc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikKKwkJCWdvdG8gZnRtdGNtZF9lcnJvcjsKKwkJZm9yIChpID0gMDsgaSA8IGZ0Y21kLT5mdF9wYXJtX2NudDsgaSsrKSB7CisJCQlUUkFDRV9DQVRDSChmdGFwZV9wYXJhbWV0ZXIoZnRjbWQtPmZ0X3Bhcm1zW2ldJjB4MGYpLCk7CisJCQlpZiAoZnRjbWQtPmZ0X3N0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpCisJCQkJZ290byBmdG10Y21kX2Vycm9yOworCQl9CisJfQorCWlmIChmdGNtZC0+ZnRfd2FpdF9hZnRlciAhPSAwKSB7CisJCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWR5X3dhaXQoZnRjbWQtPmZ0X3dhaXRfYWZ0ZXIsCisJCQkJCSAgICAgJmZ0Y21kLT5mdF9zdGF0dXMpLCk7CisJfQorZnRtdGNtZF9lcnJvcjoJICAgICAgIAorCWlmIChmdGNtZC0+ZnRfc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikgeworCQlUUkFDRShmdF90X25vaXNlLCAiZXJyb3Igc3RhdHVzIHNldCIpOworCQlUUkFDRV9DQVRDSChmdGFwZV9yZXBvcnRfZXJyb3IoJmZ0Y21kLT5mdF9lcnJvciwKKwkJCQkJICAgICAgICZmdGNtZC0+ZnRfY21kLCAxKSwpOworCX0KKwlUUkFDRV9FWElUIDA7IC8qIHRoaXMgaXMgbm90IGFuIGkvbyBlcnJvciAqLworfQorI2VuZGlmCisKKy8qICBJT0NUTCByb3V0aW5lIGNhbGxlZCBieSBrZXJuZWwtaW50ZXJmYWNlIGNvZGUKKyAqLworaW50IF96ZnRfaW9jdGwodW5zaWduZWQgaW50IGNvbW1hbmQsIHZvaWQgX191c2VyICogYXJnKQoreworCWludCByZXN1bHQ7CisJdW5pb24geyBzdHJ1Y3QgbXRvcCAgICAgICBtdG9wOworCQlzdHJ1Y3QgbXRnZXQgICAgICBtdGdldDsKKwkJc3RydWN0IG10cG9zICAgICAgbXRwb3M7CisjaWZkZWYgTVRJT0NSREZUU0VHCisJCXN0cnVjdCBtdGZ0c2VnICAgIG10ZnRzZWc7CisjZW5kaWYKKyNpZmRlZiBNVElPQ1ZPTElORk8KKwkJc3RydWN0IG10dm9saW5mbyAgbXR2b2xpbmZvOworI2VuZGlmCisjaWZkZWYgTVRJT0NHRVRTSVpFCisJCXN0cnVjdCBtdHRhcGVzaXplIG10dGFwZXNpemU7CisjZW5kaWYKKyNpZmRlZiBNVElPQ0ZURk9STUFUCisJCXN0cnVjdCBtdGZ0Zm9ybWF0IG10ZnRmb3JtYXQ7CisjZW5kaWYKKyNpZmRlZiBaRlRfT0JTT0xFVEUKKwkJc3RydWN0IG10Ymxrc3ogbXRibGtzejsKKyNlbmRpZgorI2lmZGVmIE1USU9DRlRDTUQKKwkJc3RydWN0IG10ZnRjbWQgbXRmdGNtZDsKKyNlbmRpZgorCX0ga3JubF9hcmc7CisJaW50IGFyZ19zaXplID0gX0lPQ19TSVpFKGNvbW1hbmQpOworCWludCBkaXIgPSBfSU9DX0RJUihjb21tYW5kKTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCS8qIFRoaXMgY2hlY2sgd2lsbCBvbmx5IGNhdGNoIGFyZ3VtZW50cyB0aGF0IGFyZSB0b28gbGFyZ2UgIQorCSAqLworCWlmIChkaXIgJiAoX0lPQ19SRUFEIHwgX0lPQ19XUklURSkgJiYgYXJnX3NpemUgPiBzaXplb2Yoa3JubF9hcmcpKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsCisJCQkgICAgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwgYXJnX3NpemUpOworCX0KKwlpZiAoZGlyICYgX0lPQ19XUklURSkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmtybmxfYXJnLCBhcmcsIGFyZ19zaXplKSAhPSAwKSB7CisJCQlUUkFDRV9FWElUIC1FRkFVTFQ7CisJCX0KKwl9CisJVFJBQ0UoZnRfdF9mbG93LCAiY2FsbGVkIHdpdGggaW9jdGwgY29tbWFuZDogMHglMDh4IiwgY29tbWFuZCk7CisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBNVElPQ1RPUDoKKwkJcmVzdWx0ID0gbXRpb2N0b3AoJmtybmxfYXJnLm10b3AsIGFyZ19zaXplKTsKKwkJYnJlYWs7CisJY2FzZSBNVElPQ0dFVDoKKwkJcmVzdWx0ID0gbXRpb2NnZXQoJmtybmxfYXJnLm10Z2V0LCBhcmdfc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgTVRJT0NQT1M6CisJCXJlc3VsdCA9IG10aW9jcG9zKCZrcm5sX2FyZy5tdHBvcywgYXJnX3NpemUpOworCQlicmVhazsKKyNpZmRlZiBNVElPQ1ZPTElORk8KKwljYXNlIE1USU9DVk9MSU5GTzoKKwkJcmVzdWx0ID0gbXRpb2N2b2xpbmZvKCZrcm5sX2FyZy5tdHZvbGluZm8sIGFyZ19zaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBaRlRfT0JTT0xFVEUKKwljYXNlIE1USU9DX1pGVEFQRV9HRVRCTEtTWjoKKwkJcmVzdWx0ID0gbXRpb2NfemZ0YXBlX2dldGJsa3N6KCZrcm5sX2FyZy5tdGJsa3N6LCBhcmdfc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgTVRJT0NSREZUU0VHCisJY2FzZSBNVElPQ1JERlRTRUc6IC8qIHJlYWQgYSBzZWdtZW50IHZpYSBpb2N0bCAqLworCQlyZXN1bHQgPSBtdGlvY3JkZnRzZWcoJmtybmxfYXJnLm10ZnRzZWcsIGFyZ19zaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBNVElPQ1dSRlRTRUcKKwljYXNlIE1USU9DV1JGVFNFRzogLyogd3JpdGUgYSBzZWdtZW50IHZpYSBpb2N0bCAqLworCQlyZXN1bHQgPSBtdGlvY3dyZnRzZWcoJmtybmxfYXJnLm10ZnRzZWcsIGFyZ19zaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBNVElPQ0dFVFNJWkUKKwljYXNlIE1USU9DR0VUU0laRToKKwkJcmVzdWx0ID0gbXRpb2NnZXRzaXplKCZrcm5sX2FyZy5tdHRhcGVzaXplLCBhcmdfc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgTVRJT0NGVEZPUk1BVAorCWNhc2UgTVRJT0NGVEZPUk1BVDoKKwkJcmVzdWx0ID0gbXRpb2NmdGZvcm1hdCgma3JubF9hcmcubXRmdGZvcm1hdCwgYXJnX3NpemUpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIE1USU9DRlRDTUQKKwljYXNlIE1USU9DRlRDTUQ6CisJCXJlc3VsdCA9IG10aW9jZnRjbWQoJmtybmxfYXJnLm10ZnRjbWQsIGFyZ19zaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXN1bHQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJaWYgKChyZXN1bHQgPj0gMCkgJiYgKGRpciAmIF9JT0NfUkVBRCkpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZrcm5sX2FyZywgYXJnX3NpemUpICE9IDApIHsKKwkJCVRSQUNFX0VYSVQgLUVGQVVMVDsKKwkJfQorCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0MTU5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5oCkBAIC0wLDAgKzEsNTkgQEAKKyNpZm5kZWYgX1pGVEFQRV9DVExfSAorI2RlZmluZSBfWkZUQVBFX0NUTF9ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4gCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjAyICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbm9uLXN0YW5kYXJkIElPQ1RMIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGlvLmg+CisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisKKyNpZmRlZiBDT05GSUdfWkZUQVBFX01PRFVMRQorI2RlZmluZSBmdGFwZV9zdGF0dXMgKCp6ZnRfc3RhdHVzKQorI2VuZGlmCisKK2V4dGVybiBpbnQgemZ0X29mZmxpbmU7CitleHRlcm4gaW50IHpmdF9tdF9jb21wcmVzc2lvbjsKK2V4dGVybiBpbnQgemZ0X3dyaXRlX3Byb3RlY3RlZDsKK2V4dGVybiBpbnQgemZ0X2hlYWRlcl9yZWFkOworZXh0ZXJuIHVuc2lnbmVkIGludCB6ZnRfdW5pdDsKK2V4dGVybiBpbnQgemZ0X3Jlc2lkOworCitleHRlcm4gdm9pZCB6ZnRfcmVzZXRfcG9zaXRpb24oemZ0X3Bvc2l0aW9uICpwb3MpOworZXh0ZXJuIGludCAgemZ0X2NoZWNrX3dyaXRlX2FjY2Vzcyh6ZnRfcG9zaXRpb24gKnBvcyk7CitleHRlcm4gaW50ICB6ZnRfZGVmX2lkbGVfc3RhdGUodm9pZCk7CisKKy8qICBob29rcyBmb3IgdGhlIFZGUyBpbnRlcmZhY2UgCisgKi8KK2V4dGVybiBpbnQgIF96ZnRfb3Blbih1bnNpZ25lZCBpbnQgZGV2X21pbm9yLCB1bnNpZ25lZCBpbnQgYWNjZXNzX21vZGUpOworZXh0ZXJuIGludCAgX3pmdF9jbG9zZSh2b2lkKTsKK2V4dGVybiBpbnQgIF96ZnRfaW9jdGwodW5zaWduZWQgaW50IGNvbW1hbmQsIHZvaWQgX191c2VyICphcmcpOworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYWRjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuYwpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqICAgSSB1c2UgdGhlc2Ugcm91dGluZXMganVzdCB0byBkZWNpZGUgd2hlbiBJIGhhdmUgdG8gZmFrZSBhIAorICogICB2b2x1bWUtdGFibGUgdG8gcHJlc2VydmUgY29tcGF0aWJpbGl0eSB0byBvcmlnaW5hbCBmdGFwZS4KKyAqLworLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUgQmFzIExhYXJob3Zlbi4KKyAqICAgICAgCisgKiAgICAgIE1vZGlmaWVkIGZvciB6ZnRhcGUgMTk5NiwgMTk5NyBDbGF1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5jLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MDIgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBlb2YgbWFyayBoYW5kbGluZyBjb2RlCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwIGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCisKKy8qIGEgY29weSBvZiB0aGUgZmFpbGVkIHNlY3RvciBsb2cgZnJvbSB0aGUgaGVhZGVyIHNlZ21lbnQuCisgKi8KK2VvZl9tYXJrX3VuaW9uICp6ZnRfZW9mX21hcDsKKworLyogbnVtYmVyIG9mIGVvZiBtYXJrcyAoZW50cmllcyBpbiBiYWQgc2VjdG9yIGxvZykgb24gdGFwZS4KKyAqLworaW50IHpmdF9ucl9lb2ZfbWFya3MgPSAtMTsKKworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KKworc3RhdGljIGNoYXIgbGludXhfdGFwZV9sYWJlbFtdID0gIkxpbnV4IHJhdyBmb3JtYXQgViI7CitlbnVtIHsgCisJbWluX2ZtdF92ZXJzaW9uID0gMSwgbWF4X2ZtdF92ZXJzaW9uID0gMiAKK307CitzdGF0aWMgdW5zaWduZWQgZnRhcGVfZm10X3ZlcnNpb24gPSAwOworCisKKy8qIEZ0YXBlIChtaXMpdXNlcyB0aGUgYmFkIHNlY3RvciBsb2cgdG8gcmVjb3JkIGVuZC1vZi1maWxlIG1hcmtzLgorICogSW5pdGlhbGx5ICh3aGVuIHRoZSB0YXBlIGlzIGVyYXNlZCkgYWxsIGVudHJpZXMgaW4gdGhlIGJhZCBzZWN0b3IKKyAqIGxvZyBhcmUgYWRkZWQgdG8gdGhlIHRhcGUncyBiYWQgc2VjdG9yIG1hcC4gVGhlIGJhZCBzZWN0b3IgbG9nIHRoZW4KKyAqIGlzIGNsZWFyZWQuCisgKgorICogVGhlIGJhZCBzZWN0b3IgbG9nIG5vcm1hbGx5IGNvbnRhaW5zIGVudHJpZXMgb2YgdGhlIGZvcm06IAorICogZXZlbiAxNi1iaXQgd29yZDogc2VnbWVudCBudW1iZXIgb2YgYmFkIHNlY3RvciAKKyAqIG9kZCAxNi1iaXQgd29yZDogZW5jb2RlZCBkYXRlCisgKiBUaGVyZSBjYW4gYmUgYSB0b3RhbCBvZiA0NDggZW50cmllcyAoMTc5MiBieXRlcykuCisgKgorICogTXkgZ3Vlc3MgaXMgdGhhdCBubyBwcm9ncmFtIGlzIHVzaW5nIHRoaXMgYmFkIHNlY3RvciBsb2cgKHRoZSAqCisgKiBmb3JtYXQgc2VlbXMgdXNlbGVzcyBhcyB0aGVyZSBpcyBubyBpbmRpY2F0aW9uIG9mIHRoZSBiYWQgc2VjdG9yCisgKiBpdHNlbGYsIG9ubHkgdGhlIHNlZ21lbnQpIEhvd2V2ZXIsIGlmIGFueSBwcm9ncmFtIGRvZXMgdXNlIHRoZSBiYWQKKyAqIHNlY3RvciBsb2csIHRoZSBmb3JtYXQgdXNlZCBieSBmdGFwZSB3aWxsIGxldCB0aGUgcHJvZ3JhbSB0aGluaworICogdGhlcmUgYXJlIHNvbWUgYmFkIHNlY3RvcnMgYW5kIG5vIGhhcm0gaXMgZG9uZS4KKyAqICAKKyAqIFRoZSBlb2YgbWFyayBlbnRyaWVzIHRoYXQgZnRhcGUgc3RvcmVzIGluIHRoZSBiYWQgc2VjdG9yIGxvZzogZXZlbgorICogMTYtYml0IHdvcmQ6IHNlZ21lbnQgbnVtYmVyIG9mIGVvZiBtYXJrIG9kZCAxNi1iaXQgd29yZDogc2VjdG9yCisgKiBudW1iZXIgb2YgZW9mIG1hcmsgWzEuLjMyXQorICogIAorICogVGhlIHpmdF9lb2ZfbWFwIGFzIG1haW50YWluZWQgaXMgYSBzb3J0ZWQgbGlzdCBvZiBlb2YgbWFyayBlbnRyaWVzLgorICoKKyAqCisgKiBUaGUgdGFwZSBuYW1lIGZpZWxkIGluIHRoZSBoZWFkZXIgc2VnbWVudHMgaXMgdXNlZCB0byBzdG9yZSBhIGxpbnV4CisgKiB0YXBlIGlkZW50aWZpY2F0aW9uIHN0cmluZyBhbmQgYSB2ZXJzaW9uIG51bWJlci4gIFRoaXMgd2F5IHRoZSB0YXBlCisgKiBjYW4gYmUgcmVjb2duaXplZCBhcyBhIExpbnV4IHJhdyBmb3JtYXQgdGFwZSB3aGVuIHVzaW5nIHRvb2xzIHVuZGVyCisgKiBvdGhlciBPUydzLgorICoKKyAqICdXaWRlJyBRSUMgdGFwZXMgKGZvcm1hdCBjb2RlIDQpIGRvbid0IGhhdmUgYSBmYWlsZWQgc2VjdG9yIGxpc3QKKyAqIGFueW1vcmUuIFRoYXQgc3BhY2UgaXMgdXNlZCBmb3IgdGhlIChsb25nZXIpIGJhZCBzZWN0b3IgbWFwIHRoYXQKKyAqIG5vdyBpcyBhIHZhcmlhYmxlIGxlbmd0aCBsaXN0IHRvby4gIFdlIG5vdyBzdG9yZSBvdXIgZW5kLW9mLWZpbGUKKyAqIG1hcmtlciBsaXN0IGFmdGVyIHRoZSBiYWQtc2VjdG9yLW1hcCBvbiB0YXBlLiBUaGUgbGlzdCBpcyBkZWxpbWl0ZWQKKyAqIGJ5IGEgKF9fdTMyKSAwIGVudHJ5LgorICovCisKK2ludCB6ZnRfZnRhcGVfdmFsaWRhdGVfbGFiZWwoY2hhciAqbGFiZWwpCit7CisJc3RhdGljIGNoYXIgdG1wX2xhYmVsWzQ1XTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCQorCW1lbWNweSh0bXBfbGFiZWwsIGxhYmVsLCBGVF9MQUJFTF9TWik7CisJdG1wX2xhYmVsW0ZUX0xBQkVMX1NaXSA9ICdcMCc7CisJVFJBQ0UoZnRfdF9ub2lzZSwgInRhcGUgIGxhYmVsID0gYCVzJyIsIHRtcF9sYWJlbCk7CisJZnRhcGVfZm10X3ZlcnNpb24gPSAwOworCWlmIChtZW1jbXAobGFiZWwsIGxpbnV4X3RhcGVfbGFiZWwsIHN0cmxlbihsaW51eF90YXBlX2xhYmVsKSkgPT0gMCkgeworCQlpbnQgcG9zID0gc3RybGVuKGxpbnV4X3RhcGVfbGFiZWwpOworCQl3aGlsZSAobGFiZWxbcG9zXSA+PSAnMCcgJiYgbGFiZWxbcG9zXSA8PSAnOScpIHsKKwkJCWZ0YXBlX2ZtdF92ZXJzaW9uICo9IDEwOworCQkJZnRhcGVfZm10X3ZlcnNpb24gPSBsYWJlbFsgcG9zKytdIC0gJzAnOworCQl9CisJCXJlc3VsdCA9IChmdGFwZV9mbXRfdmVyc2lvbiA+PSBtaW5fZm10X3ZlcnNpb24gJiYKKwkJCSAgZnRhcGVfZm10X3ZlcnNpb24gPD0gbWF4X2ZtdF92ZXJzaW9uKTsKKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwgImZvcm1hdCB2ZXJzaW9uID0gJWQiLCBmdGFwZV9mbXRfdmVyc2lvbik7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBfX3U4ICogZmluZF9lbmRfb2ZfZW9mX2xpc3QoX191OCAqIHB0ciwgX191OCAqIGxpbWl0KQoreworCXdoaWxlIChwdHIgKyAzIDwgbGltaXQpIHsKKworCQlpZiAoZ2V0X3VuYWxpZ25lZCgoX191MzIqKXB0cikpIHsKKwkJCXB0ciArPSBzaXplb2YoX191MzIpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHB0cjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCB6ZnRfZnRhcGVfZXh0cmFjdF9maWxlX21hcmtzKF9fdTgqIGFkZHJlc3MpCit7CisJaW50IGk7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKwkKKwl6ZnRfZW9mX21hcCA9IE5VTEw7CisJaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgeworCQlfX3U4KiBlbmQ7CisJCV9fdTgqIHN0YXJ0ID0gZnRhcGVfZmluZF9lbmRfb2ZfYnNtX2xpc3QoYWRkcmVzcyk7CisKKwkJemZ0X25yX2VvZl9tYXJrcyA9IDA7CisJCWlmIChzdGFydCkgeworCQkJc3RhcnQgKz0gMzsgLyogc2tpcCBlbmQgb2YgbGlzdCBtYXJrICovCisJCQllbmQgPSBmaW5kX2VuZF9vZl9lb2ZfbGlzdChzdGFydCwgCisJCQkJCQkgICBhZGRyZXNzICsgRlRfU0VHTUVOVF9TSVpFKTsKKwkJCWlmIChlbmQgJiYgZW5kIC0gc3RhcnQgPD0gRlRfRlNMX1NJWkUpIHsKKwkJCQl6ZnRfbnJfZW9mX21hcmtzID0gKChlbmQgLSBzdGFydCkgLyAKKwkJCQkJCSAgICBzaXplb2YoZW9mX21hcmtfdW5pb24pKTsKKwkJCQl6ZnRfZW9mX21hcCA9IChlb2ZfbWFya191bmlvbiAqKXN0YXJ0OworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2VyciwKKwkJCQkgICAgICAiRU9GIE1hcmsgTGlzdCBpcyB0b28gbG9uZyBvciBkYW1hZ2VkISIpOworCQkJfQorCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF9lcnIsIAorCQkJICAgICAgIkJhZCBTZWN0b3IgTGlzdCBpcyB0b28gbG9uZyBvciBkYW1hZ2VkICEiKTsKKwkJfQorCX0gZWxzZSB7CisJCXpmdF9lb2ZfbWFwID0gKGVvZl9tYXJrX3VuaW9uICopJmFkZHJlc3NbRlRfRlNMXTsKKwkJemZ0X25yX2VvZl9tYXJrcyA9IEdFVDIoYWRkcmVzcywgRlRfRlNMX0NOVCk7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJudW1iZXIgb2YgZmlsZSBtYXJrczogJWQiLCB6ZnRfbnJfZW9mX21hcmtzKTsKKwlpZiAoZnRhcGVfZm10X3ZlcnNpb24gPT0gMSkgeworCQlUUkFDRShmdF90X2luZm8sICJzd2FwcGluZyB2ZXJzaW9uIDEgZmllbGRzIik7CisJCS8qIHZlcnNpb24gMSBmb3JtYXQgdXNlcyBzd2FwcGVkIHNlY3RvciBhbmQgc2VnbWVudAorCQkgKiBmaWVsZHMsIGNvcnJlY3QgdGhhdCAhICAKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCB6ZnRfbnJfZW9mX21hcmtzOyArK2kpIHsKKwkJCV9fdTE2IHRtcCA9IEdFVDIoJnpmdF9lb2ZfbWFwW2ldLm1hcmsuc2VnbWVudCwwKTsKKwkJCVBVVDIoJnpmdF9lb2ZfbWFwW2ldLm1hcmsuc2VnbWVudCwgMCwgCisJCQkgICAgIEdFVDIoJnpmdF9lb2ZfbWFwW2ldLm1hcmsuZGF0ZSwwKSk7CisJCQlQVVQyKCZ6ZnRfZW9mX21hcFtpXS5tYXJrLmRhdGUsIDAsIHRtcCk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IHpmdF9ucl9lb2ZfbWFya3M7ICsraSkgeworCQlUUkFDRShmdF90X25vaXNlLCAiZW9mIG1hcms6ICU1ZC8lMmQiLAorCQkJR0VUMigmemZ0X2VvZl9tYXBbaV0ubWFyay5zZWdtZW50LCAwKSwgCisJCQlHRVQyKCZ6ZnRfZW9mX21hcFtpXS5tYXJrLmRhdGUsMCkpOworCX0KKwlUUkFDRV9FWElUOworfQorCit2b2lkIHpmdF9jbGVhcl9mdGFwZV9maWxlX21hcmtzKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJLyogIENsZWFyIGZhaWxlZCBzZWN0b3IgbG9nOiByZW1vdmUgYWxsIHRhcGUgbWFya3MuIFdlCisJICogIGRvbid0IHVzZSBvbGQgZnRhcGUtc3R5bGUgRU9GLW1hcmtzLgorCSAqLworCVRSQUNFKGZ0X3RfaW5mbywgIkNsZWFyaW5nIG9sZCBmdGFwZSdzIGVvZiBtYXAiKTsKKwltZW1zZXQoemZ0X2VvZl9tYXAsIDAsIHpmdF9ucl9lb2ZfbWFya3MgKiBzaXplb2YoX191MzIpKTsKKwl6ZnRfbnJfZW9mX21hcmtzID0gMDsKKwlQVVQyKHpmdF9oc2VnX2J1ZiwgRlRfRlNMX0NOVCwgMCk7IC8qIG5yIG9mIGVvZi1tYXJrcyAqLworCXpmdF9oZWFkZXJfY2hhbmdlZCA9IDE7CisJemZ0X3VwZGF0ZV9sYWJlbCh6ZnRfaHNlZ19idWYpOworCVRSQUNFX0VYSVQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NTY4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuaApAQCAtMCwwICsxLDUyIEBACisjaWZuZGVmIF9aRlRBUEVfRU9GX0gKKyNkZWZpbmUgX1pGVEFQRV9FT0ZfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUgQmFzIExhYXJob3Zlbi4KKyAqIGFkYXB0YWVkIGZvciB6ZnRhcGUgMTk5NiwgMTk5NyBieSBDbGF1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MDMgJAorICoKKyAqICAgICAgRGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGVuZCBvZiBmaWxlIG1hcmtlcnMKKyAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnRhcGUtaGVhZGVyLXNlZ21lbnQuaD4KKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaCIKKy8qICBmYWlsZWQgc2VjdG9yIGxvZyBzaXplIChvbmx5IHVzZWQgaWYgZm9ybWF0IGNvZGUgIT0gNCkuCisgKi8KKwordHlwZWRlZiB1bmlvbiB7CisJZnRfZnNsX2VudHJ5IG1hcms7CisJX191MzIgZW50cnk7Cit9IGVvZl9tYXJrX3VuaW9uOworIAorLyogICAgICBmdGFwZS1lb2YuYyBkZWZpbmVkIGdsb2JhbCB2YXJzLgorICovCitleHRlcm4gaW50IHpmdF9ucl9lb2ZfbWFya3M7CitleHRlcm4gZW9mX21hcmtfdW5pb24gKnpmdF9lb2ZfbWFwOworCisvKiAgICAgIGZ0YXBlLWVvZi5jIGRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9ucy4KKyAqLworZXh0ZXJuIHZvaWQgemZ0X2Z0YXBlX2V4dHJhY3RfZmlsZV9tYXJrcyhfX3U4KiBhZGRyZXNzKTsKK2V4dGVybiBpbnQgIHpmdF9mdGFwZV92YWxpZGF0ZV9sYWJlbChjaGFyKiBsYWJlbCk7CitleHRlcm4gdm9pZCB6ZnRfY2xlYXJfZnRhcGVfZmlsZV9tYXJrcyh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1pbml0LmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhYzdlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWluaXQuYwpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0aGF0IHJlZ2lzdGVycyB0aGUgemZ0YXBlIGZyb250ZW5kIAorICogICAgICB0byB0aGUgZnRhcGUgZmxvcHB5IHRhcGUgZHJpdmVyIGZvciBMaW51eAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaWZkZWYgQ09ORklHX0tNT0QKKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisKKyNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaCIKKworTU9EVUxFX0FVVEhPUigiKGMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lICIKKwkgICAgICAiKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSkiKTsKK01PRFVMRV9ERVNDUklQVElPTihaRlRBUEVfVkVSU0lPTiAiIC0gIgorCQkgICAiVkZTIGludGVyZmFjZSBmb3IgdGhlIExpbnV4IGZsb3BweSB0YXBlIGRyaXZlci4gIgorCQkgICAiU3VwcG9ydCBmb3IgUUlDLTExMyBjb21wYXRpYmxlIHZvbHVtZSB0YWJsZSAiCisJCSAgICJhbmQgYnVpbHRpbiBjb21wcmVzc2lvbiAobHpydzMgYWxnb3JpdGhtKSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoImNoYXItbWFqb3ItMjciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogICAgICBHbG9iYWwgdmFycy4KKyAqLworc3RydWN0IHpmdF9jbXByX29wcyAqemZ0X2NtcHJfb3BzID0gTlVMTDsKK2NvbnN0IGZ0YXBlX2luZm8gKnpmdF9zdGF0dXM7CisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVzeV9mbGFnOworCitzdGF0aWMgc2lnc2V0X3Qgb3JpZ19zaWdtYXNrOworCisvKiAgdGhlIGludGVyZmFjZSB0byB0aGUga2VybmVsIHZmcyBsYXllcgorICovCisKKy8qIE5vdGUgYWJvdXQgbGxzZWVrKCk6CisgKgorICogc3QuYyBhbmQgdHBxaWMuYyB1cGRhdGUgZnAtPmZfcG9zIGJ1dCBkb24ndCBpbXBsbWVudCBsbHNlZWsoKSBhbmQKKyAqIGluaXRpYWxpemUgdGhlIGxsc2VlayBjb21wb25lbnQgb2YgdGhlIGZpbGVfb3BzIHN0cnVjdCB3aXRoIE5VTEwuCisgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgd2lsbCBnZXQgdGhlIGRlZmF1bHQgc2VlaywgYnV0IHRoZSB0YXBlCisgKiBkZXZpY2Ugd2lsbCBub3QgcmVzcGVjdCB0aGUgbmV3IHBvc2l0aW9uLCBidXQgaGFwcGlseSByZWFkIGZyb20gdGhlCisgKiBvbGQgcG9zaXRpb24uIFRoaW5rIGEgemZ0YXBlIHNwZWNpZmljIGxsc2VlaygpIGZ1bmN0aW9uIHdvdWxkIGJlCisgKiBiZXR0ZXIsIHJldHVybmluZyAtRVNQSVBFLiBUT0RPLgorICovCisKK3N0YXRpYyBpbnQgIHpmdF9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwKTsKK3N0YXRpYyBpbnQgemZ0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOworc3RhdGljIGludCAgemZ0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCSAgICAgIHVuc2lnbmVkIGludCBjb21tYW5kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50ICB6ZnRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKK3N0YXRpYyBzc2l6ZV90IHpmdF9yZWFkIChzdHJ1Y3QgZmlsZSAqZnAsIGNoYXIgX191c2VyICpidWZmLAorCQkJIHNpemVfdCByZXFfbGVuLCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgemZ0X3dyaXRlKHN0cnVjdCBmaWxlICpmcCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmYsCisJCQkgc2l6ZV90IHJlcV9sZW4sIGxvZmZfdCAqcHBvcyk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHpmdF9jZGV2ID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJCT0gemZ0X3JlYWQsCisJLndyaXRlCQk9IHpmdF93cml0ZSwKKwkuaW9jdGwJCT0gemZ0X2lvY3RsLAorCS5tbWFwCQk9IHpmdF9tbWFwLAorCS5vcGVuCQk9IHpmdF9vcGVuLAorCS5yZWxlYXNlCT0gemZ0X2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKnpmdF9jbGFzczsKKworLyogICAgICBPcGVuIGZsb3BweSB0YXBlIGRldmljZQorICovCitzdGF0aWMgaW50IHpmdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCW5vbnNlZWthYmxlX29wZW4oaW5vLCBmaWxlcCk7CisJVFJBQ0UoZnRfdF9mbG93LCAiY2FsbGVkIGZvciBtaW5vciAlZCIsIGltaW5vcihpbm8pKTsKKwlpZiAoIHRlc3RfYW5kX3NldF9iaXQoMCwmYnVzeV9mbGFnKSApIHsKKwkJVFJBQ0VfQUJPUlQoLUVCVVNZLCBmdF90X3dhcm4sICJmYWlsZWQ6IGFscmVhZHkgYnVzeSIpOworCX0KKwlpZiAoKGltaW5vcihpbm8pICYgfihaRlRfTUlOT1JfT1BfTUFTSyB8IEZUQVBFX05PX1JFV0lORCkpCisJICAgICA+IAorCSAgICBGVEFQRV9TRUxfRCkgeworCQljbGVhcl9iaXQoMCwmYnVzeV9mbGFnKTsKKwkJVFJBQ0VfQUJPUlQoLUVOWElPLCBmdF90X2VyciwgImZhaWxlZDogaW52YWxpZCB1bml0IG5yIik7CisJfQorCW9yaWdfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7CisJcmVzdWx0ID0gX3pmdF9vcGVuKGltaW5vcihpbm8pLCBmaWxlcC0+Zl9mbGFncyAmIE9fQUNDTU9ERSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJY3VycmVudC0+YmxvY2tlZCA9IG9yaWdfc2lnbWFzazsgLyogcmVzdG9yZSBtYXNrICovCisJCWNsZWFyX2JpdCgwLCZidXN5X2ZsYWcpOworCQlUUkFDRV9BQk9SVChyZXN1bHQsIGZ0X3RfZXJyLCAiX2Z0YXBlX29wZW4gZmFpbGVkIik7CisJfSBlbHNlIHsKKwkJLyogTWFzayBzaWduYWxzIHRoYXQgd2lsbCBkaXN0dXJiIHByb3BlciBvcGVyYXRpb24gb2YgdGhlCisJCSAqIHByb2dyYW0gdGhhdCBpcyBjYWxsaW5nLgorCQkgKi8KKwkJY3VycmVudC0+YmxvY2tlZCA9IG9yaWdfc2lnbWFzazsKKwkJc2lnYWRkc2V0bWFzayAoJmN1cnJlbnQtPmJsb2NrZWQsIF9ET19CTE9DSyk7CisJCVRSQUNFX0VYSVQgMDsKKwl9Cit9CisKKy8qICAgICAgQ2xvc2UgZmxvcHB5IHRhcGUgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgemZ0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICggIXRlc3RfYml0KDAsJmJ1c3lfZmxhZykgfHwgaW1pbm9yKGlubykgIT0gemZ0X3VuaXQpIHsKKwkJVFJBQ0UoZnRfdF9lcnIsICJmYWlsZWQ6IG5vdCBidXN5IG9yIHdyb25nIHVuaXQiKTsKKwkJVFJBQ0VfRVhJVCAwOworCX0KKwlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKKwlyZXN1bHQgPSBfemZ0X2Nsb3NlKCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJVFJBQ0UoZnRfdF9lcnIsICJfemZ0X2Nsb3NlIGZhaWxlZCIpOworCX0KKwljdXJyZW50LT5ibG9ja2VkID0gb3JpZ19zaWdtYXNrOyAvKiByZXN0b3JlIGJlZm9yZSBvcGVuIHN0YXRlICovCisJY2xlYXJfYml0KDAsJmJ1c3lfZmxhZyk7CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgICAgIElvY3RsIGZvciBmbG9wcHkgdGFwZSBkZXZpY2UKKyAqLworc3RhdGljIGludCB6ZnRfaW9jdGwoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJICAgICB1bnNpZ25lZCBpbnQgY29tbWFuZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJlc3VsdCA9IC1FSU87CisJc2lnc2V0X3Qgb2xkX3NpZ21hc2s7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoICF0ZXN0X2JpdCgwLCZidXN5X2ZsYWcpIHx8IGltaW5vcihpbm8pICE9IHpmdF91bml0IHx8IGZ0X2ZhaWx1cmUpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgImZhaWxlZDogbm90IGJ1c3ksIGZhaWx1cmUgb3Igd3JvbmcgdW5pdCIpOworCX0KKwlvbGRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7IC8qIHNhdmUgbWFzayAqLworCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOworCS8qIFRoaXMgd2lsbCB3b3JrIGFzIGxvbmcgYXMgc2l6ZW9mKHZvaWQgKikgPT0gc2l6ZW9mKGxvbmcpICovCisJcmVzdWx0ID0gX3pmdF9pb2N0bChjb21tYW5kLCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwljdXJyZW50LT5ibG9ja2VkID0gb2xkX3NpZ21hc2s7IC8qIHJlc3RvcmUgbWFzayAqLworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKiAgICAgIElvY3RsIGZvciBmbG9wcHkgdGFwZSBkZXZpY2UKKyAqLworc3RhdGljIGludCAgemZ0X21tYXAoc3RydWN0IGZpbGUgKmZpbGVwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgcmVzdWx0ID0gLUVJTzsKKwlzaWdzZXRfdCBvbGRfc2lnbWFzazsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICggIXRlc3RfYml0KDAsJmJ1c3lfZmxhZykgfHwgCisJICAgIGltaW5vcihmaWxlcC0+Zl9kZW50cnktPmRfaW5vZGUpICE9IHpmdF91bml0IHx8IAorCSAgICBmdF9mYWlsdXJlKQorCXsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgImZhaWxlZDogbm90IGJ1c3ksIGZhaWx1cmUgb3Igd3JvbmcgdW5pdCIpOworCX0KKwlvbGRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7IC8qIHNhdmUgbWFzayAqLworCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOworCWlmICgocmVzdWx0ID0gZnRhcGVfbW1hcCh2bWEpKSA+PSAwKSB7CisjaWZuZGVmIE1TWU5DX0JVR19XQVNfRklYRUQKKwkJc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBkdW1teSA9IHsgTlVMTCwgfTsKKwkJdm1hLT52bV9vcHMgPSAmZHVtbXk7CisjZW5kaWYKKwl9CisJY3VycmVudC0+YmxvY2tlZCA9IG9sZF9zaWdtYXNrOyAvKiByZXN0b3JlIG1hc2sgKi8KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogICAgICBSZWFkIGZyb20gZmxvcHB5IHRhcGUgZGV2aWNlCisgKi8KK3N0YXRpYyBzc2l6ZV90IHpmdF9yZWFkKHN0cnVjdCBmaWxlICpmcCwgY2hhciBfX3VzZXIgKmJ1ZmYsCisJCQlzaXplX3QgcmVxX2xlbiwgbG9mZl90ICpwcG9zKQoreworCWludCByZXN1bHQgPSAtRUlPOworCXNpZ3NldF90IG9sZF9zaWdtYXNrOworCXN0cnVjdCBpbm9kZSAqaW5vID0gZnAtPmZfZGVudHJ5LT5kX2lub2RlOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJjYWxsZWQgd2l0aCBjb3VudDogJWxkIiwgKHVuc2lnbmVkIGxvbmcpcmVxX2xlbik7CisJaWYgKCF0ZXN0X2JpdCgwLCZidXN5X2ZsYWcpICB8fCBpbWlub3IoaW5vKSAhPSB6ZnRfdW5pdCB8fCBmdF9mYWlsdXJlKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJmYWlsZWQ6IG5vdCBidXN5LCBmYWlsdXJlIG9yIHdyb25nIHVuaXQiKTsKKwl9CisJb2xkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOyAvKiBzYXZlIG1hc2sgKi8KKwlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKKwlyZXN1bHQgPSBfemZ0X3JlYWQoYnVmZiwgcmVxX2xlbik7CisJY3VycmVudC0+YmxvY2tlZCA9IG9sZF9zaWdtYXNrOyAvKiByZXN0b3JlIG1hc2sgKi8KKwlUUkFDRShmdF90X2RhdGFfZmxvdywgInJldHVybiB3aXRoIGNvdW50OiAlZCIsIHJlc3VsdCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qICAgICAgV3JpdGUgdG8gdGFwZSBkZXZpY2UKKyAqLworc3RhdGljIHNzaXplX3QgemZ0X3dyaXRlKHN0cnVjdCBmaWxlICpmcCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmYsCisJCQkgc2l6ZV90IHJlcV9sZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmVzdWx0ID0gLUVJTzsKKwlzaWdzZXRfdCBvbGRfc2lnbWFzazsKKwlzdHJ1Y3QgaW5vZGUgKmlubyA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFKGZ0X3RfZmxvdywgImNhbGxlZCB3aXRoIGNvdW50OiAlbGQiLCAodW5zaWduZWQgbG9uZylyZXFfbGVuKTsKKwlpZiAoIXRlc3RfYml0KDAsJmJ1c3lfZmxhZykgfHwgaW1pbm9yKGlubykgIT0gemZ0X3VuaXQgfHwgZnRfZmFpbHVyZSkgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKKwkJCSAgICAiZmFpbGVkOiBub3QgYnVzeSwgZmFpbHVyZSBvciB3cm9uZyB1bml0Iik7CisJfQorCW9sZF9zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsgLyogc2F2ZSBtYXNrICovCisJc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7CisJcmVzdWx0ID0gX3pmdF93cml0ZShidWZmLCByZXFfbGVuKTsKKwljdXJyZW50LT5ibG9ja2VkID0gb2xkX3NpZ21hc2s7IC8qIHJlc3RvcmUgbWFzayAqLworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAicmV0dXJuIHdpdGggY291bnQ6ICVkIiwgcmVzdWx0KTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogICAgICAgICAgICAgICAgICAgIEVORCBPRiBWRlMgSU5URVJGQUNFIAorICogICAgICAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICBkcml2ZXIvbW9kdWxlIGluaXRpYWxpemF0aW9uCisgKi8KKworLyogIHRoZSBjb21wcmVzc2lvbiBtb2R1bGUgaGFzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBob29rIGludG8gdGhlIHpmdGFwZSAKKyAqICBjb2RlCisgKi8KK2ludCB6ZnRfY21wcl9yZWdpc3RlcihzdHJ1Y3QgemZ0X2NtcHJfb3BzICpuZXdfb3BzKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmICh6ZnRfY21wcl9vcHMgIT0gTlVMTCkgeworCQlUUkFDRV9FWElUIC1FQlVTWTsKKwl9IGVsc2UgeworCQl6ZnRfY21wcl9vcHMgPSBuZXdfb3BzOworCQlUUkFDRV9FWElUIDA7CisJfQorfQorCisvKiAgbG9jayB0aGUgemZ0LWNvbXByZXNzb3IoKSBtb2R1bGUuCisgKi8KK2ludCB6ZnRfY21wcl9sb2NrKGludCB0cnlfdG9fbG9hZCkKK3sKKwlpZiAoemZ0X2NtcHJfb3BzID09IE5VTEwpIHsKKyNpZmRlZiBDT05GSUdfS01PRAorCQlpZiAodHJ5X3RvX2xvYWQpIHsKKwkJCXJlcXVlc3RfbW9kdWxlKCJ6ZnQtY29tcHJlc3NvciIpOworCQkJaWYgKHpmdF9jbXByX29wcyA9PSBOVUxMKSB7CisJCQkJcmV0dXJuIC1FTk9TWVM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVOT1NZUzsKKwkJfQorI2Vsc2UKKwkJcmV0dXJuIC1FTk9TWVM7CisjZW5kaWYKKwl9CisJKCp6ZnRfY21wcl9vcHMtPmxvY2spKCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfWkZUX0NPTVBSRVNTT1IKK2V4dGVybiBpbnQgemZ0X2NvbXByZXNzb3JfaW5pdCh2b2lkKTsKKyNlbmRpZgorCisvKiAgQ2FsbGVkIGJ5IG1vZHVsZXMgcGFja2FnZSB3aGVuIGluc3RhbGxpbmcgdGhlIGRyaXZlciBvciBieSBrZXJuZWwKKyAqICBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIHBoYXNlCisgKi8KK2ludCBfX2luaXQgemZ0X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworI2lmZGVmIE1PRFVMRQorCXByaW50ayhLRVJOX0lORk8gWkZUQVBFX1ZFUlNJT04gIlxuIik7CisgICAgICAgIGlmIChUUkFDRV9MRVZFTCA+PSBmdF90X2luZm8pIHsKKwkJcHJpbnRrKAorS0VSTl9JTkZPCisiKGMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lIChjbGF1c0Btb21vLm1hdGgucnd0aC1hYWNoZW4uZGUpXG4iCitLRVJOX0lORk8KKyJ2ZnMgaW50ZXJmYWNlIGZvciBmdGFwZSBmbG9wcHkgdGFwZSBkcml2ZXIuXG4iCitLRVJOX0lORk8KKyJTdXBwb3J0IGZvciBRSUMtMTEzIGNvbXBhdGlibGUgdm9sdW1lIHRhYmxlLCBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uXG4iCitLRVJOX0lORk8KKyJhbmQgYnVpbHRpbiBjb21wcmVzc2lvbiAobHpydzMgYWxnb3JpdGhtKS5cbiIpOworICAgICAgICB9CisjZWxzZSAvKiAhTU9EVUxFICovCisJLyogcHJpbnQgYSBzaG9ydCBuby1ub25zZW5zZSBib290IG1lc3NhZ2UgKi8KKwlwcmludGsoS0VSTl9JTkZPIFpGVEFQRV9WRVJTSU9OICJcbiIpOworI2VuZGlmIC8qIE1PRFVMRSAqLworCVRSQUNFKGZ0X3RfaW5mbywgInpmdF9pbml0IEAgMHglcCIsIHpmdF9pbml0KTsKKwlUUkFDRShmdF90X2luZm8sCisJICAgICAgImluc3RhbGxpbmcgemZ0YXBlIFZGUyBpbnRlcmZhY2UgZm9yIGZ0YXBlIGRyaXZlciAuLi4iKTsKKwlUUkFDRV9DQVRDSChyZWdpc3Rlcl9jaHJkZXYoUUlDMTE3X1RBUEVfTUFKT1IsICJ6ZnQiLCAmemZ0X2NkZXYpLCk7CisKKwl6ZnRfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAiemZ0Iik7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh6ZnRfY2xhc3MsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpKSwgTlVMTCwgInFmdCVpIiwgaSk7CisJCWRldmZzX21rX2NkZXYoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkpLAorCQkJCVNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCQkicWZ0JWkiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoemZ0X2NsYXNzLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDQpLCBOVUxMLCAibnFmdCVpIiwgaSk7CisJCWRldmZzX21rX2NkZXYoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyA0KSwKKwkJCQlTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVdVU1IsCisJCQkJIm5xZnQlaSIsIGkpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh6ZnRfY2xhc3MsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMTYpLCBOVUxMLCAienFmdCVpIiwgaSk7CisJCWRldmZzX21rX2NkZXYoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAxNiksCisJCQkJU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJCSJ6cWZ0JWkiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoemZ0X2NsYXNzLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDIwKSwgTlVMTCwgIm56cWZ0JWkiLCBpKTsKKwkJZGV2ZnNfbWtfY2RldihNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDIwKSwKKwkJCQlTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVdVU1IsCisJCQkJIm56cWZ0JWkiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoemZ0X2NsYXNzLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDMyKSwgTlVMTCwgInJhd3FmdCVpIiwgaSk7CisJCWRldmZzX21rX2NkZXYoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAzMiksCisJCQkJU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJCSJyYXdxZnQlaSIsIGkpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh6ZnRfY2xhc3MsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMzYpLCBOVUxMLCAibnJhd3Jhd3FmdCVpIiwgaSk7CisJCWRldmZzX21rX2NkZXYoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAzNiksCisJCQkJU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJCSJucmF3cWZ0JWkiLCBpKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfWkZUX0NPTVBSRVNTT1IKKwkodm9pZCl6ZnRfY29tcHJlc3Nvcl9pbml0KCk7CisjZW5kaWYKKwl6ZnRfc3RhdHVzID0gZnRhcGVfZ2V0X3N0YXR1cygpOyAvKiAgZmV0Y2ggZ2xvYmFsIGRhdGEgb2YgZnRhcGUgCisJCQkJCSAgKiAgaGFyZHdhcmUgZHJpdmVyIAorCQkJCQkgICovCisJVFJBQ0VfRVhJVCAwOworfQorCisKKy8qIENhbGxlZCBieSBtb2R1bGVzIHBhY2thZ2Ugd2hlbiByZW1vdmluZyB0aGUgZHJpdmVyIAorICovCitzdGF0aWMgdm9pZCB6ZnRfZXhpdCh2b2lkKQoreworCWludCBpOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKHVucmVnaXN0ZXJfY2hyZGV2KFFJQzExN19UQVBFX01BSk9SLCAiemZ0IikgIT0gMCkgeworCQlUUkFDRShmdF90X3dhcm4sICJmYWlsZWQiKTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X2luZm8sICJzdWNjZXNzZnVsIik7CisJfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWRldmZzX3JlbW92ZSgicWZ0JWkiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkpKTsKKwkJZGV2ZnNfcmVtb3ZlKCJucWZ0JWkiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyA0KSk7CisJCWRldmZzX3JlbW92ZSgienFmdCVpIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMTYpKTsKKwkJZGV2ZnNfcmVtb3ZlKCJuenFmdCVpIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMjApKTsKKwkJZGV2ZnNfcmVtb3ZlKCJyYXdxZnQlaSIsIGkpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDMyKSk7CisJCWRldmZzX3JlbW92ZSgibnJhd3FmdCVpIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMzYpKTsKKwl9CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koemZ0X2NsYXNzKTsKKwl6ZnRfdW5pbml0X21lbSgpOyAvKiByZWxlYXNlIHJlbWFpbmluZyBtZW1vcnksIGlmIGFueSAqLworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJ6ZnRhcGUgc3VjY2Vzc2Z1bGx5IHVubG9hZGVkLlxuIik7CisJVFJBQ0VfRVhJVDsKK30KKworbW9kdWxlX2luaXQoemZ0X2luaXQpOworbW9kdWxlX2V4aXQoemZ0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtaW5pdC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzN2U1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1pbml0LmgKQEAgLTAsMCArMSw3NyBAQAorI2lmbmRlZiBfWkZUQVBFX0lOSVRfSAorI2RlZmluZSBfWkZUQVBFX0lOSVRfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWluaXQuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjA1ICQKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgYW5kIG1hY3JvIGZvciB0aGUgdmZzIAorICogaW50ZXJmYWNlIGRlZmluZWQgYnkgemZ0YXBlCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS1oZWFkZXItc2VnbWVudC5oPgorCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmgiCisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgZnRhcGVfc3RhdHVzICgqemZ0X3N0YXR1cykKKyNlbmRpZgorCitleHRlcm4gY29uc3QgIGZ0YXBlX2luZm8gKnpmdF9zdGF0dXM7IC8qIG5lZWRlZCBmb3IgemZ0YXBlLXZ0YmwuaCAqLworCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCisKK3N0cnVjdCB6ZnRfY21wcl9vcHMgeworCWludCAoKndyaXRlKShpbnQgKndyaXRlX2NudCwKKwkJICAgICBfX3U4ICpkc3RfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAorCQkgICAgIGNvbnN0IF9fdTggX191c2VyICpzcmNfYnVmLCBjb25zdCBpbnQgcmVxX2xlbiwgCisJCSAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpOworCWludCAoKnJlYWQpKGludCAqcmVhZF9jbnQsCisJCSAgICBfX3U4IF9fdXNlciAqZHN0X2J1ZiwgY29uc3QgaW50IHJlcV9sZW4sCisJCSAgICBjb25zdCBfX3U4ICpzcmNfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAorCQkgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpOworCWludCAoKnNlZWspKHVuc2lnbmVkIGludCBuZXdfYmxvY2tfcG9zLAorCQkgICAgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsCisJCSAgICBfX3U4ICpidWZmZXIpOworCXZvaWQgKCpsb2NrKSAgICh2b2lkKTsKKwl2b2lkICgqcmVzZXQpICAodm9pZCk7CisJdm9pZCAoKmNsZWFudXApKHZvaWQpOworfTsKKworZXh0ZXJuIHN0cnVjdCB6ZnRfY21wcl9vcHMgKnpmdF9jbXByX29wczsKKy8qIHpmdGFwZS1pbml0LmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgorICovCitleHRlcm4gaW50ICAgICAgICAgICAgICAgICAgemZ0X2NtcHJfcmVnaXN0ZXIoc3RydWN0IHpmdF9jbXByX29wcyAqbmV3X29wcyk7CitleHRlcm4gaW50ICAgICAgICAgICAgICAgICAgemZ0X2NtcHJfbG9jayhpbnQgdHJ5X3RvX2xvYWQpOworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0YmYwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuYwpAQCAtMCwwICsxLDM3NyBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjA2ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGlnaCBsZXZlbCByZWFkaW5nIGNvZGUKKyAqICAgICAgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCitpbnQgemZ0X2p1c3RfYmVmb3JlX2VvZjsKKworLyogICAgICBMb2NhbCB2YXJzLgorICovCitzdGF0aWMgaW50IGJ1Zl9sZW5fcmQ7CisKK3ZvaWQgemZ0X3phcF9yZWFkX2J1ZmZlcnModm9pZCkKK3sKKwlidWZfbGVuX3JkID0gMDsKK30KKworaW50IHpmdF9yZWFkX2hlYWRlcl9zZWdtZW50cyh2b2lkKSAgICAgIAoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJemZ0X2hlYWRlcl9yZWFkID0gMDsKKwlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19vbmNlKCZ6ZnRfaHNlZ19idWYsIEZUX1NFR01FTlRfU0laRSksKTsKKwlUUkFDRV9DQVRDSChmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KHpmdF9oc2VnX2J1ZiksKTsKKwlUUkFDRShmdF90X2luZm8sICJTZWdtZW50cyB3cml0dGVuIHNpbmNlIGZpcnN0IGZvcm1hdDogJWQiLAorCSAgICAgIChpbnQpR0VUNCh6ZnRfaHNlZ19idWYsIEZUX1NFR19DTlQpKTsKKwl6ZnRfcWljMTEzID0gKGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF9ub3JtYWwgJiYKKwkJICAgICAgZnRfZm9ybWF0X2NvZGUgIT0gZm10XzExMDBmdCAmJgorCQkgICAgICBmdF9mb3JtYXRfY29kZSAhPSBmbXRfNDI1ZnQpOworCVRSQUNFKGZ0X3RfaW5mbywgImZ0X2ZpcnN0X2RhdGFfc2VnbWVudDogJWQsIGZ0X2xhc3RfZGF0YV9zZWdtZW50OiAlZCIsIAorCSAgICAgIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCwgZnRfbGFzdF9kYXRhX3NlZ21lbnQpOworCXpmdF9jYXBhY2l0eSA9IHpmdF9nZXRfY2FwYWNpdHkoKTsKKwl6ZnRfb2xkX2Z0YXBlID0gemZ0X2Z0YXBlX3ZhbGlkYXRlX2xhYmVsKCZ6ZnRfaHNlZ19idWZbRlRfTEFCRUxdKTsKKwlpZiAoemZ0X29sZF9mdGFwZSkgeworCQlUUkFDRShmdF90X2luZm8sIAorIkZvdW5kIG9sZCBmdGFwZWQgdGFwZSwgZW11bGF0aW5nIGVvZiBtYXJrcywgZW50ZXJpbmcgcmVhZC1vbmx5IG1vZGUiKTsKKwkJemZ0X2Z0YXBlX2V4dHJhY3RfZmlsZV9tYXJrcyh6ZnRfaHNlZ19idWYpOworCQlUUkFDRV9DQVRDSCh6ZnRfZmFrZV92b2x1bWVfaGVhZGVycyh6ZnRfZW9mX21hcCwgCisJCQkJCQkgICAgemZ0X25yX2VvZl9tYXJrcyksKTsKKwl9IGVsc2UgeworCQkvKiB0aGUgc3BlY3Mgc2F5IHRoYXQgdGhlIHZvbHVtZSB0YWJsZSBtdXN0IGJlCisJCSAqIGluaXRpYWxpemVkIHdpdGggemVyb2VzIGR1cmluZyBmb3JtYXR0aW5nLCBzbyBpdAorCQkgKiBNVVNUIGJlIHJlYWRhYmxlLCBpLmUuIGNvbnRhaW4gdmFpZCBFQ0MKKwkJICogaW5mb3JtYXRpb24uICAKKwkJICovCisJCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWRfc2VnbWVudChmdF9maXJzdF9kYXRhX3NlZ21lbnQsIAorCQkJCQkgICAgICAgemZ0X2RlYmxvY2tfYnVmLCAKKwkJCQkJICAgICAgIEZUX1JEX1NJTkdMRSksKTsKKwkJVFJBQ0VfQ0FUQ0goemZ0X2V4dHJhY3Rfdm9sdW1lX2hlYWRlcnMoemZ0X2RlYmxvY2tfYnVmKSwpOworCX0KKwl6ZnRfaGVhZGVyX3JlYWQgPSAxOworCXpmdF9zZXRfZmxhZ3MoemZ0X3VuaXQpOworCXpmdF9yZXNldF9wb3NpdGlvbigmemZ0X3Bvcyk7CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgemZ0X2ZldGNoX3NlZ21lbnRfZnJhY3Rpb24oY29uc3QgdW5zaWduZWQgaW50IHNlZ21lbnQsIHZvaWQgKmJ1ZmZlciwKKwkJCSAgICAgICBjb25zdCBmdF9yZWFkX21vZGVfdCByZWFkX21vZGUsCisJCQkgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHN0YXJ0LAorCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzaXplKQoreworCWludCBzZWdfc3o7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoc2VnbWVudCA9PSB6ZnRfZGVibG9ja19zZWdtZW50KSB7CisJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LAorCQkgICAgICAicmUtdXNpbmcgc2VnbWVudCAlZCBhbHJlYWR5IGluIGRlYmxvY2sgYnVmZmVyIiwKKwkJICAgICAgc2VnbWVudCk7CisJCXNlZ19zeiA9IHpmdF9nZXRfc2VnX3N6KHNlZ21lbnQpOworCQlpZiAoc3RhcnQgPiBzZWdfc3opIHsKKwkJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfYnVnLAorCQkJCSAgICAidHJ5aW5nIHRvIHJlYWQgYmV5b25kIGVuZCBvZiBzZWdtZW50OlxuIgorCQkJCSAgICBLRVJOX0lORk8gInNlZ19zeiA6ICVkXG4iCisJCQkJICAgIEtFUk5fSU5GTyAic3RhcnQgIDogJWRcbiIKKwkJCQkgICAgS0VSTl9JTkZPICJzZWdtZW50OiAlZCIsCisJCQkJICAgIHNlZ19zeiwgc3RhcnQsIHNlZ21lbnQpOworCQl9CisJCWlmICgoc3RhcnQgKyBzaXplKSA+IHNlZ19zeikgeworCQkJVFJBQ0VfRVhJVCBzZWdfc3ogLSBzdGFydDsKKwkJfQorCQlUUkFDRV9FWElUIHNpemU7CisJfQorCXNlZ19zeiA9IGZ0YXBlX3JlYWRfc2VnbWVudF9mcmFjdGlvbihzZWdtZW50LCBidWZmZXIsIHJlYWRfbW9kZSwKKwkJCQkJICAgICBzdGFydCwgc2l6ZSk7CisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJzZWdtZW50ICVkLCByZXN1bHQgJWQiLCBzZWdtZW50LCBzZWdfc3opOworCWlmICgoaW50KXNlZ19zeiA+PSAwICYmIHN0YXJ0ID09IDAgJiYgc2l6ZSA9PSBGVF9TRUdNRU5UX1NJWkUpIHsKKwkJLyogIHRoaXMgaW1wbGljaXRseSBhc3N1bWVzIHRoYXQgd2UgYXJlIGFsd2F5cyBjYWxsZWQgd2l0aAorCQkgKiAgYnVmZmVyID09IHpmdF9kZWJsb2NrX2J1ZiAKKwkJICovCisJCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSBzZWdtZW50OworCX0gZWxzZSB7CisJCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsKKwl9CisJVFJBQ0VfRVhJVCBzZWdfc3o7Cit9CisKKy8qCisgKiBvdXQ6CisgKgorICogaW50ICpyZWFkX2NudDogdGhlIG51bWJlciBvZiBieXRlcyB3ZSByZW1vdmVkIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgICB6ZnRfZGVibG9ja19idWYgKHJlc3VsdCkKKyAqCisgKiBpbnQgKnRvX2RvICAgOiB0aGUgcmVtYWluaW5nIHNpemUgb2YgdGhlIHJlYWQtcmVxdWVzdC4gSXMgY2hhbmdlZC4KKyAqCisgKiBpbjoKKyAqCisgKiBjaGFyICpidWZmICAgICAgOiBidWZmIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSB1c2VyCisgKiAgICAgICAgICAgICAgICAgICBidWZmZXIsIHRoYXQgaGFzbid0IGJlZW4gZmlsbGVkIHdpdGggZGF0YSB5ZXQuCisgKiBpbnQgYnVmX3Bvc19yZWFkOiBjb3B5IG9mIGJ1Zl9wb3NfcmQKKyAqIGludCBidWZfbGVuX3JlYWQ6IGNvcHkgb2YgYnVmX2xlbl9yZAorICogY2hhciAqemZ0X2RlYmxvY2tfYnVmOiBmdGFwZV96ZnRfZGVibG9ja19idWYKKyAqCisgKiByZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSBhY3R1YWxseSBjb3BpZWQgdG8gdGhlIHVzZXItYnVmZmVyCisgKgorICogdG9fZG8gTVVTVCBOT1QgU0hSSU5LIGV4Y2VwdCB0byBpbmRpY2F0ZSBhbiBFT1QuIEluIHRoaXMgY2FzZSB0b19kbworICogaGFzIHRvIGJlIHNldCB0byAwLiBXZSBjYW5ub3QgcmV0dXJuIC1FTk9TUEMsIGJlY2F1c2Ugd2UgcmV0dXJuIHRoZQorICogYW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgKiBjb3BpZWQgdG8gdGhlIHVzZXItYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgemZ0X3NpbXBsZV9yZWFkIChpbnQgKnJlYWRfY250LCAKKwkJCSAgICBfX3U4ICBfX3VzZXIgKmRzdF9idWYsIAorCQkJICAgIGNvbnN0IGludCB0b19kbywgCisJCQkgICAgY29uc3QgX191OCAqc3JjX2J1ZiwgCisJCQkgICAgY29uc3QgaW50IHNlZ19zeiwgCisJCQkgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsCisJCQkgICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChzZWdfc3ogLSBwb3MtPnNlZ19ieXRlX3BvcyA8IHRvX2RvKSB7CisJCSpyZWFkX2NudCA9IHNlZ19zeiAtIHBvcy0+c2VnX2J5dGVfcG9zOworCX0gZWxzZSB7CisJCSpyZWFkX2NudCA9IHRvX2RvOworCX0KKwlpZiAoY29weV90b191c2VyKGRzdF9idWYsIAorCQkJIHNyY19idWYgKyBwb3MtPnNlZ19ieXRlX3BvcywgKnJlYWRfY250KSAhPSAwKSB7CisJCVRSQUNFX0VYSVQgLUVGQVVMVDsKKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwgIm5yIGJ5dGVzIGp1c3QgcmVhZDogJWQiLCAqcmVhZF9jbnQpOworCVRSQUNFX0VYSVQgKnJlYWRfY250OworfQorCisvKiByZXFfbGVuOiBnZXRzIGNsaXBwZWQgZHVlIHRvIEVPVCBvZiBFT0YuCisgKiByZXFfY2xpcHBlZDogaXMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciByZXFfbGVuIHdhcyBjbGlwcGVkIG9yIG5vdAorICogdm9sdW1lOiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjdXJyZW50IHZvbHVtZSAoYmxrX3N6IGV0Yy4pCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfcmVhZF9hY2Nlc3MoaW50ICpyZXFfbGVuLCAKKwkJCSAgICAgY29uc3QgemZ0X3ZvbGluZm8gKip2b2x1bWUsCisJCQkgICAgIGludCAqcmVxX2NsaXBwZWQsIAorCQkJICAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcykKK3sKKwlzdGF0aWMgX19zNjQgcmVtYWluaW5nOworCXN0YXRpYyBpbnQgZW9kOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmICh6ZnRfaW9fc3RhdGUgIT0gemZ0X3JlYWRpbmcpIHsKKwkJaWYgKHpmdF9vZmZsaW5lKSB7IC8qIG9mZmxpbmUgaW5jbHVkZXMgbm9fdGFwZSAqLworCQkJVFJBQ0VfQUJPUlQoLUVOWElPLCBmdF90X3dhcm4sCisJCQkJICAgICJ0YXBlIGlzIG9mZmxpbmUgb3Igbm8gY2FydHJpZGdlIik7CisJCX0KKwkJaWYgKCFmdF9mb3JtYXR0ZWQpIHsKKwkJCVRSQUNFX0FCT1JUKC1FQUNDRVMsCisJCQkJICAgIGZ0X3Rfd2FybiwgInRhcGUgaXMgbm90IGZvcm1hdHRlZCIpOworCQl9CisJCS8qICBub3cgZW50ZXIgZGVmaW5lZCBzdGF0ZSwgcmVhZCBoZWFkZXIgc2VnbWVudCBpZiBub3QKKwkJICogIGFscmVhZHkgZG9uZSBhbmQgZmx1c2ggd3JpdGUgYnVmZmVycworCQkgKi8KKwkJVFJBQ0VfQ0FUQ0goemZ0X2RlZl9pZGxlX3N0YXRlKCksKTsKKwkJemZ0X2lvX3N0YXRlID0gemZ0X3JlYWRpbmc7CisJCWlmICh6ZnRfdGFwZV9hdF9lb2QocG9zKSkgeworCQkJZW9kID0gMTsKKwkJCVRSQUNFX0VYSVQgMTsKKwkJfQorCQllb2QgPSAwOworCQkqdm9sdW1lID0gemZ0X2ZpbmRfdm9sdW1lKHBvcy0+c2VnX3Bvcyk7CisJCS8qIGdldCB0aGUgc3BhY2UgbGVmdCB1bnRpbCBFT0YgKi8KKwkJcmVtYWluaW5nID0gemZ0X2NoZWNrX2Zvcl9lb2YoKnZvbHVtZSwgcG9zKTsKKwkJYnVmX2xlbl9yZCA9IDA7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJyZW1haW5pbmc6ICIgTExfWCAiLCB2b2xfbm86ICVkIiwKKwkJICAgICAgTEwocmVtYWluaW5nKSwgKCp2b2x1bWUpLT5jb3VudCk7CisJfSBlbHNlIGlmICh6ZnRfdGFwZV9hdF9lb2QocG9zKSkgeworCQlpZiAoKytlb2QgPiAyKSB7CisJCQlUUkFDRV9FWElUIC1FSU87IC8qIHN0LmMgYWxzbyByZXR1cm5zIC1FSU8gKi8KKwkJfSBlbHNlIHsKKwkJCVRSQUNFX0VYSVQgMTsKKwkJfQorCX0KKwlpZiAoKCpyZXFfbGVuICUgKCp2b2x1bWUpLT5ibGtfc3opICE9IDApIHsKKwkJLyogIHRoaXMgbWVzc2FnZSBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuIFRoZSB1c2VyIGdldHMgdGhlCisJCSAqICBwcm9wZXIgcmV0dXJuIHZhbHVlCisJCSAqLworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sCisJCQkgICAgInJlcV9sZW4gJWQgbm90IGEgbXVsdGlwbGUgb2YgYmxvY2sgc2l6ZSAlZCIsCisJCQkgICAgKnJlcV9sZW4sICgqdm9sdW1lKS0+YmxrX3N6KTsKKwl9CisJLyogQXMgR05VIHRhciBkb2Vzbid0IGFjY2VwdCBwYXJ0aWFsIHJlYWQgY291bnRzIHdoZW4gdGhlCisJICogbXVsdGlwbGUgdm9sdW1lIGZsYWcgaXMgc2V0LCB3ZSBtYWtlIHN1cmUgdG8gcmV0dXJuIHRoZQorCSAqIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YS4gRXhjZXB0LCBvZiBjb3Vyc2UsIGF0IHRoZSBlbmQgb2YKKwkgKiB0aGUgdGFwZSBvciBmaWxlIG1hcmsuICAKKwkgKi8KKwlyZW1haW5pbmcgLT0gKnJlcV9sZW47CisJaWYgKHJlbWFpbmluZyA8PSAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsIAorCQkgICAgICAiY2xpcHBlZCByZXF1ZXN0IGZyb20gJWQgdG8gJWQuIiwgCisJCSAgICAgICpyZXFfbGVuLCAoaW50KSgqcmVxX2xlbiArIHJlbWFpbmluZykpOworCQkqcmVxX2xlbiArPSByZW1haW5pbmc7CisJCSpyZXFfY2xpcHBlZCA9IDE7CisJfSBlbHNlIHsKKwkJKnJlcV9jbGlwcGVkID0gMDsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiB0aGlzX3NlZ3Nfc2l6ZTogdGhlIGN1cnJlbnQgc2VnbWVudCdzIHNpemUuCisgKiBidWZmOiB0aGUgVVNFUi1TUEFDRSBidWZmZXIgcHJvdmlkZWQgYnkgdGhlIGNhbGxpbmcgZnVuY3Rpb24uCisgKiByZXFfbGVuOiBob3cgbXVjaCBkYXRhIHNob3VsZCBiZSByZWFkIGF0IG1vc3QuCisgKiB2b2x1bWU6IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGN1cnJlbnQgdm9sdW1lIChibGtfc3ogZXRjLikKKyAqLyAgCitzdGF0aWMgaW50IGVtcHR5X2RlYmxvY2tfYnVmKF9fdTggX191c2VyICp1c3JfYnVmLCBjb25zdCBpbnQgcmVxX2xlbiwKKwkJCSAgICAgY29uc3QgX191OCAqc3JjX2J1ZiwgY29uc3QgaW50IHNlZ19zeiwKKwkJCSAgICAgemZ0X3Bvc2l0aW9uICpwb3MsCisJCQkgICAgIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCit7CisJaW50IGNudDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAidGhpc19zZWdzX3NpemU6ICVkIiwgc2VnX3N6KTsKKwlpZiAoemZ0X3VzZV9jb21wcmVzc2lvbiAmJiB2b2x1bWUtPnVzZV9jb21wcmVzc2lvbikgeworCQlUUkFDRV9DQVRDSCh6ZnRfY21wcl9sb2NrKDEgLyogdHJ5IHRvIGxvYWQgKi8pLCk7CisJCVRSQUNFX0NBVENIKHJlc3VsdD0gKCp6ZnRfY21wcl9vcHMtPnJlYWQpKCZjbnQsCisJCQkJCQkJICB1c3JfYnVmLCByZXFfbGVuLAorCQkJCQkJCSAgc3JjX2J1Ziwgc2VnX3N6LAorCQkJCQkJCSAgcG9zLCB2b2x1bWUpLCk7CisJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCVRSQUNFX0NBVENIKHJlc3VsdD0gemZ0X3NpbXBsZV9yZWFkICgmY250LAorCQkJCQkJICAgICB1c3JfYnVmLCByZXFfbGVuLAorCQkJCQkJICAgICBzcmNfYnVmLCBzZWdfc3osCisJCQkJCQkgICAgIHBvcywgdm9sdW1lKSwpOworCX0KKwlwb3MtPnZvbHVtZV9wb3MgICArPSByZXN1bHQ7CisgICAgICAgIHBvcy0+dGFwZV9wb3MgICAgICs9IGNudDsKKwlwb3MtPnNlZ19ieXRlX3BvcyArPSBjbnQ7CisJYnVmX2xlbl9yZCAgICAgICAgLT0gY250OyAvKiByZW1haW5pbmcgYnl0ZXMgaW4gYnVmZmVyICovCisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJidWZfbGVuX3JkOiAlZCwgY250OiAlZCIsIGJ1Zl9sZW5fcmQsIGNudCk7CisJaWYocG9zLT5zZWdfYnl0ZV9wb3MgPj0gc2VnX3N6KSB7CisJCXBvcy0+c2VnX3BvcysrOworCQlwb3MtPnNlZ19ieXRlX3BvcyA9IDA7CisJfQorCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiYnl0ZXMgbW92ZWQgb3V0IG9mIGRlYmxvY2stYnVmZmVyOiAlZCIsIGNudCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKworLyogbm90ZTogd2Ugc3RvcmUgdGhlIHNlZ21lbnQgaWQgb2YgdGhlIHNlZ21lbnQgdGhhdCBpcyBpbnNpZGUgdGhlCisgKiBkZWJsb2NrIGJ1ZmZlci4gVGhpcyBzcGFyZXMgYSBsb3Qgb2YgZnRhcGVfcmVhZF9zZWdtZW50KClzIHdoZW4gd2UKKyAqIHVzZSBzbWFsbCBibG9jay1zaXplcy4gVGhlIGJsb2NrLXNpemUgbWF5IGJlIDFrYiAoU0VDVE9SX1NJWkUpLiBJbgorICogdGhpcyBjYXNlIGEgTVRGU1IgMjggbWF5YmUgc3RpbGwgaW5zaWRlIHRoZSBzYW1lIHNlZ21lbnQuCisgKi8KK2ludCBfemZ0X3JlYWQoY2hhciBfX3VzZXIgKmJ1ZmYsIGludCByZXFfbGVuKQoreworCWludCByZXFfY2xpcHBlZDsKKwlpbnQgcmVzdWx0ICAgICA9IDA7CisJaW50IGJ5dGVzX3JlYWQgPSAwOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgc2VnX3N6ID0gMDsKKwlzdGF0aWMgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSA9IE5VTEw7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJemZ0X3Jlc2lkID0gcmVxX2xlbjsKKwlyZXN1bHQgPSBjaGVja19yZWFkX2FjY2VzcygmcmVxX2xlbiwgJnZvbHVtZSwKKwkJCQkgICAmcmVxX2NsaXBwZWQsICZ6ZnRfcG9zKTsKKwlzd2l0Y2gocmVzdWx0KSB7CisJY2FzZSAwOiAKKwkJYnJlYWs7IC8qIG5vdGhpbmcgc3BlY2lhbCAqLworCWNhc2UgMTogCisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJFT0QgcmVhY2hlZCIpOworCQlUUkFDRV9FWElUIDA7ICAgLyogRU9EICovCisJZGVmYXVsdDoKKwkJVFJBQ0VfQUJPUlQocmVzdWx0LCBmdF90X25vaXNlLAorCQkJICAgICJjaGVja19yZWFkX2FjY2VzcygpIGZhaWxlZCB3aXRoIHJlc3VsdCAlZCIsCisJCQkgICAgcmVzdWx0KTsKKwkJVFJBQ0VfRVhJVCByZXN1bHQ7CisJfQorCXdoaWxlIChyZXFfbGVuID4gMCkgeyAKKwkJLyogIEFsbG93IGVzY2FwZSBmcm9tIHRoaXMgbG9vcCBvbiBzaWduYWwgIQorCQkgKi8KKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQkvKiBidWZfbGVuX3JkID09IDAgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHJlYWQgYSBuZXcKKwkJICogc2VnbWVudC4KKwkJICovCisJCWlmIChidWZfbGVuX3JkID09IDApIHsKKwkJCXdoaWxlKChyZXN1bHQgPSB6ZnRfZmV0Y2hfc2VnbWVudCh6ZnRfcG9zLnNlZ19wb3MsCisJCQkJCQkJICB6ZnRfZGVibG9ja19idWYsCisJCQkJCQkJICBGVF9SRF9BSEVBRCkpID09IDApIHsKKwkJCQl6ZnRfcG9zLnNlZ19wb3MgKys7CisJCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSAwOworCQkJfQorCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQl6ZnRfcmVzaWQgLT0gYnl0ZXNfcmVhZDsKKwkJCQlUUkFDRV9BQk9SVChyZXN1bHQsIGZ0X3Rfbm9pc2UsCisJCQkJCSAgICAiemZ0X2ZldGNoX3NlZ21lbnQoKTogJWQiLAorCQkJCQkgICAgcmVzdWx0KTsKKwkJCX0KKwkJCXNlZ19zeiA9IHJlc3VsdDsKKwkJCWJ1Zl9sZW5fcmQgPSBzZWdfc3ogLSB6ZnRfcG9zLnNlZ19ieXRlX3BvczsKKwkJfQorCQlUUkFDRV9DQVRDSChyZXN1bHQgPSBlbXB0eV9kZWJsb2NrX2J1ZihidWZmLCAKKwkJCQkJCSAgICAgICByZXFfbGVuLAorCQkJCQkJICAgICAgIHpmdF9kZWJsb2NrX2J1ZiwgCisJCQkJCQkgICAgICAgc2VnX3N6LCAKKwkJCQkJCSAgICAgICAmemZ0X3BvcywKKwkJCQkJCSAgICAgICB2b2x1bWUpLAorCQkJICAgIHpmdF9yZXNpZCAtPSBieXRlc19yZWFkKTsKKwkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJieXRlcyBqdXN0IHJlYWQ6ICVkIiwgcmVzdWx0KTsKKwkJYnl0ZXNfcmVhZCArPSByZXN1bHQ7IC8qIHdoYXQgd2UgZ290IHNvIGZhciAgICAgICAqLworCQlidWZmICAgICAgICs9IHJlc3VsdDsgLyogaW5kZXggaW4gdXNlci1idWZmZXIgICAgICovCisJCXJlcV9sZW4gICAgLT0gcmVzdWx0OyAvKiB3aGF0J3MgbGVmdCBmcm9tIHJlcV9sZW4gKi8KKwl9IC8qIHdoaWxlIChyZXFfbGVuICA+IDApICovCisJaWYgKHJlcV9jbGlwcGVkKSB7CisJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LAorCQkgICAgICAibWF5YmUgcGFydGlhbCBjb3VudCBiZWNhdXNlIG9mIGVvZiBtYXJrIik7CisJCWlmICh6ZnRfanVzdF9iZWZvcmVfZW9mICYmIGJ5dGVzX3JlYWQgPT0gMCkgeworCQkJLyogcmVxX2xlbiB3YXMgPiAwLCBidXQgdXNlciBkaWRuJ3QgZ2V0CisJCQkgKiBhbnl0aGluZyB0aGUgdXNlciBoYXMgcmVhZCBpbiB0aGUgZW9mLW1hcmsgCisJCQkgKi8KKwkJCXpmdF9tb3ZlX3Bhc3RfZW9mKCZ6ZnRfcG9zKTsKKwkJCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOworCQl9IGVsc2UgeworCQkJLyogZG9uJ3Qgc2tpcCB0byB0aGUgbmV4dCBmaWxlIGJlZm9yZSB0aGUgdXNlcgorCQkJICogdHJpZWQgdG8gcmVhZCBhIHNlY29uZCB0aW1lIHBhc3QgRU9GIEp1c3QKKwkJCSAqIG1hcmsgdGhhdCB3ZSBhcmUgYXQgRU9GIGFuZCBtYXliZSBkZWNyZW1lbnQKKwkJCSAqIHpmdF9zZWdfcG9zIHRvIHN0YXkgaW4gdGhlIHNhbWUgdm9sdW1lOworCQkJICovCisJCQl6ZnRfanVzdF9iZWZvcmVfZW9mID0gMTsKKwkJCXpmdF9wb3NpdGlvbl9iZWZvcmVfZW9mKCZ6ZnRfcG9zLCB2b2x1bWUpOworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImp1c3QgYmVmb3JlIGVvZiIpOworCQl9CisJfQorCXpmdF9yZXNpZCAtPSByZXN1bHQ7IC8qIGZvciBNVFNUQVRVUyAgICAgICAqLworCVRSQUNFX0VYSVQgYnl0ZXNfcmVhZDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk0MWRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcmVhZC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX1pGVEFQRV9SRUFEX0gKKyNkZWZpbmUgX1pGVEFQRV9SRUFEX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxOTowNyAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgcmVhZCBmdW5jdGlvbnMKKyAqICAgICAgZm9yIHRoZSB6ZnRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKi8KKworI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKKworLyogICAgICBmdGFwZS1yZWFkLmMgZGVmaW5lZCBnbG9iYWwgdmFycy4KKyAqLworZXh0ZXJuIGludCB6ZnRfanVzdF9iZWZvcmVfZW9mOworCQorLyogICAgICBmdGFwZS1yZWFkLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgorICovCitleHRlcm4gdm9pZCB6ZnRfemFwX3JlYWRfYnVmZmVycyh2b2lkKTsKK2V4dGVybiBpbnQgIHpmdF9yZWFkX2hlYWRlcl9zZWdtZW50cyh2b2lkKTsKK2V4dGVybiBpbnQgIHpmdF9mZXRjaF9zZWdtZW50X2ZyYWN0aW9uKGNvbnN0IHVuc2lnbmVkIGludCBzZWdtZW50LAorCQkJCSAgICAgICB2b2lkICpidWZmZXIsCisJCQkJICAgICAgIGNvbnN0IGZ0X3JlYWRfbW9kZV90IHJlYWRfbW9kZSwKKwkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHN0YXJ0LAorCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisjZGVmaW5lIHpmdF9mZXRjaF9zZWdtZW50KHNlZ21lbnQsIGFkZHJlc3MsIHJlYWRfbW9kZSkJCVwKKwl6ZnRfZmV0Y2hfc2VnbWVudF9mcmFjdGlvbihzZWdtZW50LCBhZGRyZXNzLCByZWFkX21vZGUsCVwKKwkJCQkgICAwLCBGVF9TRUdNRU5UX1NJWkUpCisvKiAgIGhvb2sgZm9yIHRoZSBWRlMgaW50ZXJmYWNlCisgKi8KK2V4dGVybiBpbnQgIF96ZnRfcmVhZChjaGFyIF9fdXNlciAqYnVmZiwgaW50IHJlcV9sZW4pOworCisjZW5kaWYgLyogX1pGVEFQRV9SRUFEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJ3LmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWVmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5jCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjA4ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGNvbW1vbiBjb2RlIGZvciB0aGUgci93IGNvZGUgZm9yCisgKiAgICAgIHpmdGFwZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+IC8qIGZvciBDT05GSUdfWkZUX0RGTFRfQkxLX1NaICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+CisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KKworX191OCAqemZ0X2RlYmxvY2tfYnVmOworX191OCAqemZ0X2hzZWdfYnVmOworaW50IHpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsKK3pmdF9zdGF0dXNfZW51bSB6ZnRfaW9fc3RhdGUgPSB6ZnRfaWRsZTsKK2ludCB6ZnRfaGVhZGVyX2NoYW5nZWQ7CitpbnQgemZ0X3FpYzExMzsgLyogY29uZm9ybSB0byBvbGQgc3BlY3MuIGFuZCBvbGQgemZ0YXBlICovCitpbnQgemZ0X3VzZV9jb21wcmVzc2lvbjsKK3pmdF9wb3NpdGlvbiB6ZnRfcG9zID0geworCS0xLCAvKiBzZWdfcG9zICovCisJMCwgIC8qIHNlZ19ieXRlX3BvcyAqLworCTAsICAvKiB0YXBlX3BvcyAqLworCTAgICAvKiB2b2x1bWVfcG9zICovCit9OwordW5zaWduZWQgaW50IHpmdF9ibGtfc3ogPSBDT05GSUdfWkZUX0RGTFRfQkxLX1NaOworX19zNjQgemZ0X2NhcGFjaXR5OworCit1bnNpZ25lZCBpbnQgemZ0X3dyaXR0ZW5fc2VnbWVudHM7CitpbnQgemZ0X2xhYmVsX2NoYW5nZWQ7CisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworCit1bnNpZ25lZCBpbnQgemZ0X2dldF9zZWdfc3oodW5zaWduZWQgaW50IHNlZ21lbnQpCit7CisJaW50IHNpemU7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKwkKKwlzaXplID0gRlRfU0VHTUVOVF9TSVpFIC0gCisJCWNvdW50X29uZXMoZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoc2VnbWVudCkpKkZUX1NFQ1RPUl9TSVpFOworCWlmIChzaXplID4gMCkgeworCQlUUkFDRV9FWElUICh1bnNpZ25lZClzaXplOyAKKwl9IGVsc2UgeworCQlUUkFDRV9FWElUIDA7CisJfQorfQorCisvKiBmdGFwZV9zZXRfZmxhZ3MoKS4gQ2xhdXMtSnVzdHVzIEhlaW5lLCAxOTk0LzE5OTUKKyAqLwordm9pZCB6ZnRfc2V0X2ZsYWdzKHVuc2lnbmVkIG1pbm9yX3VuaXQpCit7ICAgICAKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwl6ZnRfdXNlX2NvbXByZXNzaW9uID0gemZ0X3FpY19tb2RlID0gMDsKKwlzd2l0Y2ggKG1pbm9yX3VuaXQgJiBaRlRfTUlOT1JfT1BfTUFTSykgeworCWNhc2UgKFpGVF9RODBfTU9ERSB8IFpGVF9aSVBfTU9ERSk6CisJY2FzZSBaRlRfWklQX01PREU6CisJCXpmdF91c2VfY29tcHJlc3Npb24gPSAxOworCWNhc2UgMDoKKwljYXNlIFpGVF9RODBfTU9ERToKKwkJemZ0X3FpY19tb2RlID0gMTsKKwkJaWYgKHpmdF9tdF9jb21wcmVzc2lvbikgeyAvKiBvdmVycmlkZSB0aGUgZGVmYXVsdCAqLworCQkJemZ0X3VzZV9jb21wcmVzc2lvbiA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBaRlRfUkFXX01PREU6CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJzd2l0Y2hpbmcgdG8gcmF3IG1vZGUiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJVFJBQ0UoZnRfdF93YXJuLCAiV2FybmluZzpcbiIKKwkJICAgICAgS0VSTl9JTkZPICJXcm9uZyBjb21iaW5hdGlvbiBvZiBtaW5vciBkZXZpY2UgYml0cy5cbiIKKwkJICAgICAgS0VSTl9JTkZPICJTd2l0Y2hpbmcgdG8gcmF3IHJlYWQtb25seSBtb2RlLiIpOworCQl6ZnRfd3JpdGVfcHJvdGVjdGVkID0gMTsKKwkJYnJlYWs7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qIGNvbXB1dGVzIHRoZSBzZWdtZW50IGFuZCBieXRlIG9mZnNldCBpbnNpZGUgdGhlIHNlZ21lbnQKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGFwZV9wb3MuCisgKgorICogdGFwZV9wb3MgZ2l2ZXMgdGhlIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgKiBmdF9maXJzdF9kYXRhX3NlZ21lbnQgKnNlZ19ieXRlX3BvcyBpcyB0aGUgb2Zmc2V0IGluIHRoZSBjdXJyZW50CisgKiBzZWdtZW50IGluIGJ5dGVzCisgKgorICogT2YsIGlmIHRoaXMgcm91dGluZSB3YXMgY2FsbGVkIG9mdGVuIG9uZSBzaG91bGQgY2FjaGUgdGhlIGxhc3QgZGF0YQorICogcG9zIGl0IHdhcyBjYWxsZWQgd2l0aCwgYnV0IGFjdHVhbGx5IHRoaXMgaXMgb25seSBuZWVkZWQgaW4KKyAqIGZ0YXBlX3NlZWtfYmxvY2soKSwgdGhhdCBpcywgYWxtb3N0IG5ldmVyLgorICovCitpbnQgemZ0X2NhbGNfc2VnX2J5dGVfY29vcmQoaW50ICpzZWdfYnl0ZV9wb3MsIF9fczY0IHRhcGVfcG9zKQoreworCWludCBzZWdtZW50OworCWludCBzZWdfc3o7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYgKHRhcGVfcG9zID09IDApIHsKKwkJKnNlZ19ieXRlX3BvcyA9IDA7CisJCXNlZ21lbnQgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7CisJfSBlbHNlIHsKKwkJc2VnX3N6ID0gMDsKKwkJCisJCWZvciAoc2VnbWVudCA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsgCisJCSAgICAgKCh0YXBlX3BvcyA+IDApICYmIChzZWdtZW50IDw9IGZ0X2xhc3RfZGF0YV9zZWdtZW50KSk7CisJCSAgICAgc2VnbWVudCsrKSB7CisJCQlzZWdfc3ogPSB6ZnRfZ2V0X3NlZ19zeihzZWdtZW50KTsgCisJCQl0YXBlX3BvcyAtPSBzZWdfc3o7CisJCX0KKwkJaWYodGFwZV9wb3MgPj0gMCkgeworCQkJLyogdGhlIGNhc2UgdGFwZV9wb3MgPiAhPSAwIG1lYW5zIHRoYXQgdGhlCisJCQkgKiBhcmd1bWVudCB0YXBlX3BvcyBsaWVzIGJleW9uZCB0aGUgRU9ULgorCQkJICovCisJCQkqc2VnX2J5dGVfcG9zPSAwOworCQl9IGVsc2UgeyAvKiB0YXBlX3BvcyA8IDAgKi8KKwkJCXNlZ21lbnQtLTsKKwkJCSpzZWdfYnl0ZV9wb3M9IHRhcGVfcG9zICsgc2VnX3N6OworCQl9CisJfQorCVRSQUNFX0VYSVQoc2VnbWVudCk7Cit9CisKKy8qIGZ0YXBlX2NhbGNfdGFwZV9wb3MoKS4KKyAqCisgKiBjb21wdXRlcyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAqIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCBpbnZlcnNlIHRvIGZ0YXBlX2NhbGNfc2VnX2J5dGVfY29vcmQKKyAqCisgKiBXZSBzaG91bGQgZG8gc29tZSBjYWNoaW5nLiBCdXQgaG93OgorICoKKyAqIEVhY2ggdGltZSB0aGUgaGVhZGVyIHNlZ21lbnRzIGFyZSByZWFkIGluLCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkCisgKiB3aXRoIGZ0X3RyYWNrc19wZXJfdGFwZSpzZWdtZW50c19wZXJfdHJhY2sgYXJndW1uZXQuIFNvIHRoaXMgc2hvdWxkIGJlCisgKiB0aGUgdGltZSB0byByZXNldCB0aGUgY2FjaGUuCisgKgorICogQWxzbywgaXQgbWlnaHQgYmUgaW4gdGhlIGZ1dHVyZSB0aGF0IHRoZSBiYWQgc2VjdG9yIG1hcCBnZXRzCisgKiBjaGFuZ2VkLiAgLT4gcmVzZXQgdGhlIGNhY2hlCisgKi8KK3N0YXRpYyBpbnQgc2VnX3BvczsKK3N0YXRpYyBfX3M2NCB0YXBlX3BvczsKKworX19zNjQgemZ0X2dldF9jYXBhY2l0eSh2b2lkKQoreworCXNlZ19wb3MgID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OworCXRhcGVfcG9zID0gMDsKKworCXdoaWxlIChzZWdfcG9zIDw9IGZ0X2xhc3RfZGF0YV9zZWdtZW50KSB7CisJCXRhcGVfcG9zICs9IHpmdF9nZXRfc2VnX3N6KHNlZ19wb3MgKyspOworCX0KKwlyZXR1cm4gdGFwZV9wb3M7Cit9CisKK19fczY0IHpmdF9jYWxjX3RhcGVfcG9zKGludCBzZWdtZW50KQoreworCWludCBkMSwgZDIsIGQzOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCisJaWYgKHNlZ21lbnQgPiBmdF9sYXN0X2RhdGFfc2VnbWVudCkgeworCSAgICAgICAgVFJBQ0VfRVhJVCB6ZnRfY2FwYWNpdHk7CisJfQorCWlmIChzZWdtZW50IDwgZnRfZmlyc3RfZGF0YV9zZWdtZW50KSB7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJZDIgPSBzZWdtZW50IC0gc2VnX3BvczsKKwlpZiAoLWQyID4gMTApIHsKKwkJZDEgPSBzZWdtZW50IC0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OworCQlpZiAoLWQyID4gZDEpIHsKKwkJCXRhcGVfcG9zID0gMDsKKwkJCXNlZ19wb3MgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7CisJCQlkMiA9IGQxOworCQl9CisJfQorCWlmIChkMiA+IDEwKSB7CisJCWQzID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgLSBzZWdtZW50OworCQlpZiAoZDIgPiBkMykgeworCQkJdGFwZV9wb3MgPSB6ZnRfY2FwYWNpdHk7CisJCQlzZWdfcG9zICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICsgMTsKKwkJCWQyID0gLWQzOworCQl9CisJfQkJCisJaWYgKGQyID4gMCkgeworCQl3aGlsZSAoc2VnX3BvcyA8IHNlZ21lbnQpIHsKKwkJCXRhcGVfcG9zICs9ICB6ZnRfZ2V0X3NlZ19zeihzZWdfcG9zKyspOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKHNlZ19wb3MgPiBzZWdtZW50KSB7CisJCQl0YXBlX3BvcyAtPSAgemZ0X2dldF9zZWdfc3ooLS1zZWdfcG9zKTsKKwkJfQorCX0KKwlUUkFDRShmdF90X25vaXNlLCAibmV3IGNhY2hlZCBwb3M6ICVkIiwgc2VnX3Bvcyk7CisKKwlUUkFDRV9FWElUIHRhcGVfcG9zOworfQorCisvKiBjb3B5IFotbGFiZWwgc3RyaW5nIHRvIGJ1ZmZlciwga2VlcHMgdHJhY2sgb2YgdGhlIGNvcnJlY3Qgb2Zmc2V0IGluCisgKiBgYnVmZmVyJyAKKyAqLwordm9pZCB6ZnRfdXBkYXRlX2xhYmVsKF9fdTggKmJ1ZmZlcikKK3sgCisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYgKHN0cm5jbXAoJmJ1ZmZlcltGVF9MQUJFTF0sIFpGVEFQRV9MQUJFTCwgCisJCSAgICBzaXplb2YoWkZUQVBFX0xBQkVMKS0xKSAhPSAwKSB7CisJCVRSQUNFKGZ0X3RfaW5mbywgInVwZGF0aW5nIGxhYmVsIGZyb20gXCIlc1wiIHRvIFwiJXNcIiIsCisJCSAgICAgICZidWZmZXJbRlRfTEFCRUxdLCBaRlRBUEVfTEFCRUwpOworCQlzdHJjcHkoJmJ1ZmZlcltGVF9MQUJFTF0sIFpGVEFQRV9MQUJFTCk7CisJCW1lbXNldCgmYnVmZmVyW0ZUX0xBQkVMXSArIHNpemVvZihaRlRBUEVfTEFCRUwpIC0gMSwgJyAnLCAKKwkJICAgICAgIEZUX0xBQkVMX1NaIC0gc2l6ZW9mKFpGVEFQRV9MQUJFTCArIDEpKTsKKwkJUFVUNChidWZmZXIsIEZUX0xBQkVMX0RBVEUsIDApOworCQl6ZnRfbGFiZWxfY2hhbmdlZCA9IHpmdF9oZWFkZXJfY2hhbmdlZCA9IDE7IC8qIGNoYW5nZWQgKi8KKwl9CisJVFJBQ0VfRVhJVDsKK30KKworaW50IHpmdF92ZXJpZnlfd3JpdGVfc2VnbWVudHModW5zaWduZWQgaW50IHNlZ21lbnQsIAorCQkJICAgICAgX191OCAqZGF0YSwgc2l6ZV90IHNpemUsCisJCQkgICAgICBfX3U4ICpidWZmZXIpCit7CisJaW50IHJlc3VsdDsKKwlfX3U4ICp3cml0ZV9idWY7CisJX191OCAqc3JjX2J1ZjsKKwlpbnQgc2luZ2xlOworCWludCBzZWdfcG9zOworCWludCBzZWdfc3o7CisJaW50IHJlbWFpbmluZzsKKwlmdF93cml0ZV9tb2RlX3Qgd3JpdGVfbW9kZTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXNlZ19wb3MgICA9IHNlZ21lbnQ7CisJc2VnX3N6ICAgID0gemZ0X2dldF9zZWdfc3ooc2VnX3Bvcyk7CisJc3JjX2J1ZiAgID0gZGF0YTsKKwlzaW5nbGUgICAgPSBzaXplIDw9IHNlZ19zejsKKwlyZW1haW5pbmcgPSBzaXplOworCWRvIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIlxuIgorCQkgICAgICBLRVJOX0lORk8gInJlbWFpbmluZzogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJzZWdfc3ogICA6ICVkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAic2VnbWVudCAgOiAlZCIsCisJCSAgICAgIHJlbWFpbmluZywgc2VnX3N6LCBzZWdfcG9zKTsKKwkJaWYgKHJlbWFpbmluZyA9PSBzZWdfc3opIHsKKwkJCXdyaXRlX2J1ZiA9IHNyY19idWY7CisJCQl3cml0ZV9tb2RlID0gc2luZ2xlID8gRlRfV1JfU0lOR0xFIDogRlRfV1JfTVVMVEk7CisJCQlyZW1haW5pbmcgPSAwOworCQl9IGVsc2UgaWYgKHJlbWFpbmluZyA+IHNlZ19zeikgeworCQkJd3JpdGVfYnVmID0gc3JjX2J1ZjsKKwkJCXdyaXRlX21vZGUgPSBGVF9XUl9BU1lOQzsgLyogZG9uJ3Qgc3RhcnQgdGFwZSAqLworCQkJcmVtYWluaW5nIC09IHNlZ19zejsKKwkJfSBlbHNlIHsgLyogcmVtYWluaW5nIDwgc2VnX3N6ICovCisJCQl3cml0ZV9idWYgPSBidWZmZXI7CisJCQltZW1jcHkod3JpdGVfYnVmLCBzcmNfYnVmLCByZW1haW5pbmcpOworCQkJbWVtc2V0KCZ3cml0ZV9idWZbcmVtYWluaW5nXSwnXDAnLHNlZ19zei1yZW1haW5pbmcpOworCQkJd3JpdGVfbW9kZSA9IHNpbmdsZSA/IEZUX1dSX1NJTkdMRSA6IEZUX1dSX01VTFRJOworCQkJcmVtYWluaW5nID0gMDsKKwkJfQorCQlpZiAoKHJlc3VsdCA9IGZ0YXBlX3dyaXRlX3NlZ21lbnQoc2VnX3BvcywgCisJCQkJCQkgIHdyaXRlX2J1ZiwgCisJCQkJCQkgIHdyaXRlX21vZGUpKSAhPSBzZWdfc3opIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiRXJyb3I6ICIKKwkJCSAgICAgICJDb3VsZG4ndCB3cml0ZSBzZWdtZW50ICVkIiwgc2VnX3Bvcyk7CisJCQlUUkFDRV9FWElUIHJlc3VsdCA8IDAgPyByZXN1bHQgOiAtRUlPOyAvKiBiYWlsIG91dCAqLworCQl9CisJCXpmdF93cml0dGVuX3NlZ21lbnRzICsrOworCQlzZWdfc3ogPSB6ZnRfZ2V0X3NlZ19zeigrK3NlZ19wb3MpOworCQlzcmNfYnVmICs9IHJlc3VsdDsKKwl9IHdoaWxlIChyZW1haW5pbmcgPiAwKTsKKwlpZiAoZnRhcGVfZ2V0X3N0YXR1cygpLT5mdGlfc3RhdGUgPT0gd3JpdGluZykgeworCQlUUkFDRV9DQVRDSChmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCksKTsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCksKTsKKwkJemZ0X3ByZXZlbnRfZmx1c2goKTsKKwl9CisJc2VnX3BvcyA9IHNlZ21lbnQ7CisJc3JjX2J1ZiA9IGRhdGE7CisJcmVtYWluaW5nID0gc2l6ZTsKKwlkbyB7CisJCVRSQUNFX0NBVENIKHJlc3VsdCA9IGZ0YXBlX3JlYWRfc2VnbWVudChzZWdfcG9zLCBidWZmZXIsIAorCQkJCQkJCXNpbmdsZSA/IEZUX1JEX1NJTkdMRQorCQkJCQkJCTogRlRfUkRfQUhFQUQpLCk7CisJCWlmIChtZW1jbXAoc3JjX2J1ZiwgYnVmZmVyLCAKKwkJCSAgIHJlbWFpbmluZyA+IHJlc3VsdCA/IHJlc3VsdCA6IHJlbWFpbmluZykgIT0gMCkgeworCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkJICAgICJGYWlsZWQgdG8gdmVyaWZ5IHdyaXR0ZW4gc2VnbWVudCAlZCIsCisJCQkJICAgIHNlZ19wb3MpOworCQl9CisJCXJlbWFpbmluZyAtPSByZXN1bHQ7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ2ZXJpZnkgc3VjY2Vzc2Z1bDpcbiIKKwkJICAgICAgS0VSTl9JTkZPICJzZWdtZW50ICA6ICVkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAic2Vnc2l6ZSAgOiAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gInJlbWFpbmluZzogJWQiLAorCQkgICAgICBzZWdfcG9zLCByZXN1bHQsIHJlbWFpbmluZyk7CisJCXNyY19idWYgICArPSBzZWdfc3o7CisJCXNlZ19wb3MrKzsKKwl9IHdoaWxlIChyZW1haW5pbmcgPiAwKTsKKwlUUkFDRV9FWElUIHNpemU7Cit9CisKKworLyogemZ0X2VyYXNlKCkuICBpbXBsZW1lbnRlZCBjb21wcmVzc2lvbi1oYW5kbGluZworICoKKyAqIGNhbGN1bGF0ZSB0aGUgZmlyc3QgZGF0YS1zZWdtZW50IHdoZW4gdXNpbmcvbm90IHVzaW5nIGNvbXByZXNzaW9uLgorICoKKyAqIHVwZGF0ZSBoZWFkZXItc2VnbWVudCBhbmQgY29tcHJlc3Npb24tbWFwLXNlZ21lbnQuCisgKi8KK2ludCB6ZnRfZXJhc2Uodm9pZCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZiAoIXpmdF9oZWFkZXJfcmVhZCkgeworCQlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19vbmNlKCh2b2lkICoqKSZ6ZnRfaHNlZ19idWYsCisJCQkJCSAgICAgRlRfU0VHTUVOVF9TSVpFKSwpOworCQkvKiBubyBuZWVkIHRvIHJlYWQgdGhlIHZ0YmwgYW5kIGNvbXByZXNzaW9uIG1hcCAqLworCQlUUkFDRV9DQVRDSChmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KHpmdF9oc2VnX2J1ZiksKTsKKwkJaWYgKCh6ZnRfb2xkX2Z0YXBlID0gCisJCSAgICAgemZ0X2Z0YXBlX3ZhbGlkYXRlX2xhYmVsKCZ6ZnRfaHNlZ19idWZbRlRfTEFCRUxdKSkpIHsKKwkJCXpmdF9mdGFwZV9leHRyYWN0X2ZpbGVfbWFya3MoemZ0X2hzZWdfYnVmKTsKKwkJfQorCQlUUkFDRShmdF90X25vaXNlLAorCQkgICAgICAiZnRfZmlyc3RfZGF0YV9zZWdtZW50OiAlZCwgZnRfbGFzdF9kYXRhX3NlZ21lbnQ6ICVkIiwgCisJCSAgICAgIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCwgZnRfbGFzdF9kYXRhX3NlZ21lbnQpOworCQl6ZnRfcWljMTEzID0gKGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF9ub3JtYWwgJiYKKwkJCSAgICAgIGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF8xMTAwZnQgJiYKKwkJCSAgICAgIGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF80MjVmdCk7CisJfQorCWlmICh6ZnRfb2xkX2Z0YXBlKSB7CisJCXpmdF9jbGVhcl9mdGFwZV9maWxlX21hcmtzKCk7CisJCXpmdF9vbGRfZnRhcGUgPSAwOyAvKiBubyBsb25nZXIgb2xkIGZ0YXBlICovCisJfQorCVBVVDIoemZ0X2hzZWdfYnVmLCBGVF9DTUFQX1NUQVJULCAwKTsKKwl6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQgPSAxOworCXpmdF9jYXBhY2l0eSA9IHpmdF9nZXRfY2FwYWNpdHkoKTsKKwl6ZnRfaW5pdF92dGJsKCk7CisJLyogdGhlIHJlc3QgbXVzdCBiZSBkb25lIGluIGZ0YXBlX3VwZGF0ZV9oZWFkZXJfc2VnbWVudHMgCisJICovCisJemZ0X2hlYWRlcl9yZWFkID0gMTsKKwl6ZnRfaGVhZGVyX2NoYW5nZWQgPSAxOyAvKiBmb3JjZSB1cGRhdGUgb2YgdGltZXN0YW1wICovCisJcmVzdWx0ID0gemZ0X3VwZGF0ZV9oZWFkZXJfc2VnbWVudHMoKTsKKworCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOworCisJemZ0X3Jlc2V0X3Bvc2l0aW9uKCZ6ZnRfcG9zKTsKKwl6ZnRfc2V0X2ZsYWdzICh6ZnRfdW5pdCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3Vuc2lnbmVkIGludCB6ZnRfZ2V0X3RpbWUodm9pZCkgCit7CisJdW5zaWduZWQgaW50IGRhdGUgPSBGVF9USU1FX1NUQU1QKDIwOTcsIDExLCAzMCwgMjMsIDU5LCA1OSk7IC8qIGZ1biAqLworCXJldHVybiBkYXRlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJ3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjMDdmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJ3LmgKQEAgLTAsMCArMSwxMDIgQEAKKyNpZm5kZWYgX1pGVEFQRV9SV19ICisjZGVmaW5lIF9aRlRBUEVfUldfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MDkgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlYWQgYW5kIHdyaXRlCisgKiAgICAgIGZ1bmN0aW9ucyBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAvKiBmb3IgQ09ORklHX1pGVF9ERkxUX0JMS19TWiAqLworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oIgorCisjZGVmaW5lIFNFR01FTlRTX1BFUl9UQVBFICAoZnRfc2VnbWVudHNfcGVyX3RyYWNrICogZnRfdHJhY2tzX3Blcl90YXBlKQorCisvKiAgUUlDLTExMyBSZXYuIEcgc2F5cyB0aGF0IGBhIG1heGltdW0gb2YgNjM0ODggcmF3IGJ5dGVzIG1heSBiZQorICogIGNvbXByZXNzZWQgaW50byBhIHNpbmdsZSBmcmFtZScuCisgKiAgTWF5YmUgd2Ugc2hvdWxkIHN0aWNrIHRvIDMya2IgdG8gbWFrZSBpdCBtb3JlIGBiZWF1dGlmdWwnCisgKi8KKyNkZWZpbmUgWkZUX01BWF9CTEtfU1ogICAgICAgICAgICg2MioxMDI0KSAvKiBieXRlcyAqLworI2lmICFkZWZpbmVkKENPTkZJR19aRlRfREZMVF9CTEtfU1opCisjIGRlZmluZSBDT05GSUdfWkZUX0RGTFRfQkxLX1NaICAgKDEwKjEwMjQpIC8qIGJ5dGVzLCBkZWZhdWx0IG9mIGdudSB0YXIgKi8KKyNlbGlmIENPTkZJR19aRlRfREZMVF9CTEtfU1ogPT0gMAorIyB1bmRlZiAgQ09ORklHX1pGVF9ERkxUX0JMS19TWgorIyBkZWZpbmUgQ09ORklHX1pGVF9ERkxUX0JMS19TWiAxCisjZWxpZiAoQ09ORklHX1pGVF9ERkxUX0JMS19TWiAlIDEwMjQpICE9IDAKKyMgZXJyb3IgQ09ORklHX1pGVF9ERkxUX0JMS19TWiBtdXN0IGJlIDEgb3IgYSBtdWx0aXBsZSBvZiAxMDI0CisjZW5kaWYKKy8qIFRoZSAqb3B0aW9uYWwqIGNvbXByZXNzaW9uIHJvdXRpbmVzIG5lZWQgc29tZSBvdmVyaGVhZCBwZXIgdGFwZQorICogIGJsb2NrIGZvciB0aGVpciBwdXJwb3Nlcy4gSW5zdGVhZCBvZiBhc2tpbmcgdGhlIGFjdHVhbCBjb21wcmVzc2lvbgorICogIGltcGxlbWVudGF0aW9uIGhvdyBtdWNoIGl0IG5lZWRzLCB3ZSByZXN0cmljdCB0aGlzIG92ZXJoZWFkIHRvIGJlCisgKiAgbWF4aW1hbCBvZiBaRlRfQ01QVF9PVkVSSEVBRCBzaXplLiBXZSBuZWVkIHRoaXMgZm9yIEVPVAorICogIGNvbmRpdGlvbnMuIFRoZSB0YXBlIGlzIGFzc3VtZWQgdG8gYmUgbG9naWNhbCBhdCBFT1Qgd2hlbiB0aGUKKyAqICBkaXN0YW5jZSBmcm9tIHRoZSBwaHlzaWNhbCBFT1QgaXMgbGVzcyB0aGFuIAorICogIG9uZSB0YXBlIGJsb2NrICsgWkZUX0NNUFJfT1ZFUkhFQUQgCisgKi8KKyNkZWZpbmUgWkZUX0NNUFJfT1ZFUkhFQUQgMTYgICAgICAgIC8qIGJ5dGVzICovCisKK3R5cGVkZWYgZW51bQoreyAKKwl6ZnRfaWRsZSA9IDAsCisJemZ0X3JlYWRpbmcsCisJemZ0X3dyaXRpbmcsCit9IHpmdF9zdGF0dXNfZW51bTsKKwordHlwZWRlZiBzdHJ1Y3QgICAgICAgICAgICAgICAvKiAgYWxsIHZhbHVlcyBtZWFzdXJlZCBpbiBieXRlcyAqLworeworCWludCAgIHNlZ19wb3M7ICAgICAgIC8qICBzZWdtZW50IGN1cnJlbnRseSBwb3NpdGlvbmVkIGF0ICovCisJaW50ICAgc2VnX2J5dGVfcG9zOyAgLyogIG9mZnNldCBpbiBjdXJyZW50IHNlZ21lbnQgKi8gCisJX19zNjQgdGFwZV9wb3M7ICAgICAgLyogIHJlYWwgb2Zmc2V0IGZyb20gQk9UICovCisJX19zNjQgdm9sdW1lX3BvczsgICAgLyogIHBvcy4gaW4gdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtIGluCisJCQkgICAgICAqICBjdXJyZW50IHZvbHVtZSAKKwkJCSAgICAgICovCit9IHpmdF9wb3NpdGlvbjsgCisKK2V4dGVybiB6ZnRfcG9zaXRpb24gemZ0X3BvczsKK2V4dGVybiBfX3U4ICp6ZnRfZGVibG9ja19idWY7CitleHRlcm4gX191OCAqemZ0X2hzZWdfYnVmOworZXh0ZXJuIGludCB6ZnRfZGVibG9ja19zZWdtZW50OworZXh0ZXJuIHpmdF9zdGF0dXNfZW51bSB6ZnRfaW9fc3RhdGU7CitleHRlcm4gaW50IHpmdF9oZWFkZXJfY2hhbmdlZDsKK2V4dGVybiBpbnQgemZ0X3FpYzExMzsgLyogY29uZm9ybSB0byBvbGQgc3BlY3MuIGFuZCBvbGQgemZ0YXBlICovCitleHRlcm4gaW50IHpmdF91c2VfY29tcHJlc3Npb247CitleHRlcm4gdW5zaWduZWQgaW50IHpmdF9ibGtfc3o7CitleHRlcm4gX19zNjQgemZ0X2NhcGFjaXR5OworZXh0ZXJuIHVuc2lnbmVkIGludCB6ZnRfd3JpdHRlbl9zZWdtZW50czsKK2V4dGVybiBpbnQgemZ0X2xhYmVsX2NoYW5nZWQ7CisKKy8qICB6ZnRhcGUtcncuYyBleHBvcnRlZCBmdW5jdGlvbnMKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCB6ZnRfZ2V0X3NlZ19zeih1bnNpZ25lZCBpbnQgc2VnbWVudCk7CitleHRlcm4gdm9pZCAgemZ0X3NldF9mbGFncyh1bnNpZ25lZCBpbnQgbWlub3JfdW5pdCk7CitleHRlcm4gaW50ICAgemZ0X2NhbGNfc2VnX2J5dGVfY29vcmQoaW50ICpzZWdfYnl0ZV9wb3MsIF9fczY0IHRhcGVfcG9zKTsKK2V4dGVybiBfX3M2NCB6ZnRfY2FsY190YXBlX3BvcyhpbnQgc2VnbWVudCk7CitleHRlcm4gX19zNjQgemZ0X2dldF9jYXBhY2l0eSh2b2lkKTsKK2V4dGVybiB2b2lkICB6ZnRfdXBkYXRlX2xhYmVsKF9fdTggKmJ1ZmZlcik7CitleHRlcm4gaW50ICAgemZ0X2VyYXNlKHZvaWQpOworZXh0ZXJuIGludCAgIHpmdF92ZXJpZnlfd3JpdGVfc2VnbWVudHModW5zaWduZWQgaW50IHNlZ21lbnQsIAorCQkJCSAgICAgICBfX3U4ICpkYXRhLCBzaXplX3Qgc2l6ZSwgX191OCAqYnVmZmVyKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgemZ0X2dldF90aW1lKHZvaWQpOworI2VuZGlmIC8qIF9aRlRBUEVfUldfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3ZjhiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXZ0YmwuYwpAQCAtMCwwICsxLDc1NyBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lIAorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmMsdiAkCisgKiAkUmV2aXNpb246IDEuNy42LjEgJAorICogJERhdGU6IDE5OTcvMTEvMjQgMTM6NDg6MzEgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgYSB2b2x1bWUgdGFibGUgYXMgZGVmaW5lZCBpbiB2YXJpb3VzIFFJQworICogICAgICBzdGFuZGFyZHMuCisgKiAKKyAqICAgICAgVGhpcyBpcyBhIG1pbmltYWwgaW1wbGVtZW50YXRpb24sIGp1c3QgYWxsb3dpbmcgb3JkaW5hcnkgRE9TCisgKiAgICAgIDooIHByZ3JhbXMgdG8gaWRlbnRpZnkgdGhlIGNhcnRyaWRnZSBhcyB1c2VkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+CisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCisKKyNkZWZpbmUgWkZUX0NNQVBfSEFDSyAvKiBsZWF2ZSB0aGlzIGRlZmluZWQgdG8gaGlkZSB0aGUgY29tcHJlc3Npb24gbWFwICovCisKKy8qCisgKiAgZ2xvYmFsIHZhcmlhYmxlcyAKKyAqLworaW50IHpmdF9xaWNfbW9kZSAgID0gMTsgLyogdXNlIHRoZSB2dGJsICovCitpbnQgemZ0X29sZF9mdGFwZTsgLyogcHJldmVudHMgb2xkIGZ0YXBlZCB0YXBlcyB0byBiZSBvdmVyd3JpdHRlbiAqLworaW50IHpmdF92b2x1bWVfdGFibGVfY2hhbmdlZDsgLyogZm9yIHdyaXRlX2hlYWRlcl9zZWdtZW50cygpICovCisKKy8qCisgKiAgcHJpdmF0ZSB2YXJpYWJsZXMgKG9ubHkgZXhwb3J0ZWQgZm9yIGlubGluZSBmdW5jdGlvbnMpCisgKi8KK0xJU1RfSEVBRCh6ZnRfdnRibCk7CisKKy8qICBXZSBjb3VsZCBhbHNvIGFsbG9jYXRlIHRoZXNlIGR5bmFtaWNhbGx5IHdoZW4gZXh0cmFjdGluZyB0aGUgdm9sdW1lIHRhYmxlCisgKiAgc2l6ZW9mKHpmdF92b2xpbmZvKSBpcyBhYm91dCAzMiBvciBzb21ldGhpbmcgY2xvc2UgdG8gdGhhdAorICovCitzdGF0aWMgemZ0X3ZvbGluZm8gIHRhcGVfdnRibDsKK3N0YXRpYyB6ZnRfdm9saW5mbyAgZW90X3Z0Ymw7CitzdGF0aWMgemZ0X3ZvbGluZm8gKmN1cl92dGJsOworCitzdGF0aWMgaW5saW5lIHZvaWQgemZ0X25ld192dGJsX2VudHJ5KHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gJnpmdF9sYXN0X3Z0YmwtPm5vZGU7CisJemZ0X3ZvbGluZm8gKm5ldyA9IHpmdF9rbWFsbG9jKHNpemVvZih6ZnRfdm9saW5mbykpOworCisJbGlzdF9hZGQoJm5ldy0+bm9kZSwgdG1wKTsKKwluZXctPmNvdW50ID0gemZ0X2VvbV92dGJsLT5jb3VudCArKzsKK30KKwordm9pZCB6ZnRfZnJlZV92dGJsKHZvaWQpCit7CisJZm9yICg7OykgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAgPSB6ZnRfdnRibC5wcmV2OworCQl6ZnRfdm9saW5mbyAqdnRibDsKKworCQlpZiAodG1wID09ICZ6ZnRfdnRibCkKKwkJCWJyZWFrOworCQlsaXN0X2RlbCh0bXApOworCQl2dGJsID0gbGlzdF9lbnRyeSh0bXAsIHpmdF92b2xpbmZvLCBub2RlKTsKKwkJemZ0X2tmcmVlKHZ0YmwsIHNpemVvZih6ZnRfdm9saW5mbykpOworCX0KKwlJTklUX0xJU1RfSEVBRCgmemZ0X3Z0YmwpOworCWN1cl92dGJsID0gTlVMTDsKK30KKworLyogIGluaXRpYWxpemUgdnRibCwgY2FsbGVkIGJ5IGZ0YXBlX25ld19jYXJ0cmlkZ2UoKQorICovCit2b2lkIHpmdF9pbml0X3Z0Ymwodm9pZCkKK3sgCisJemZ0X3ZvbGluZm8gKm5ldzsKKworCXpmdF9mcmVlX3Z0YmwoKTsKKwkKKwkvKiAgQ3JlYXRlIHRoZSB0d28gZHVtbXkgdnRibCBlbnRyaWVzCisJICovCisJbmV3ID0gemZ0X2ttYWxsb2Moc2l6ZW9mKHpmdF92b2xpbmZvKSk7CisJbGlzdF9hZGQoJm5ldy0+bm9kZSwgJnpmdF92dGJsKTsKKwluZXcgPSB6ZnRfa21hbGxvYyhzaXplb2YoemZ0X3ZvbGluZm8pKTsKKwlsaXN0X2FkZCgmbmV3LT5ub2RlLCAmemZ0X3Z0YmwpOworCXpmdF9oZWFkX3Z0YmwtPmVuZF9zZWcgICA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsKKwl6ZnRfaGVhZF92dGJsLT5ibGtfc3ogICAgPSB6ZnRfYmxrX3N6OworCXpmdF9oZWFkX3Z0YmwtPmNvdW50ICAgICA9IC0xOworCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnICA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCArIDE7CisJemZ0X2VvbV92dGJsLT5lbmRfc2VnICAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgKyAxOworCXpmdF9lb21fdnRibC0+YmxrX3N6ICAgICA9IHpmdF9ibGtfc3o7CisJemZ0X2VvbV92dGJsLT5jb3VudCAgICAgID0gMDsKKworCS8qICBSZXNldCB0aGUgcG9pbnRlciBmb3IgemZ0X2ZpbmRfdm9sdW1lKCkKKwkgKi8KKwljdXJfdnRibCA9IHpmdF9lb21fdnRibDsKKworCS8qIGluaXRpYWxpemUgdGhlIGR1bW15IHZ0YmwgZW50cmllcyBmb3IgemZ0X3FpY19tb2RlID09IDAKKwkgKi8KKwllb3RfdnRibC5zdGFydF9zZWcgICAgICAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudCArIDE7CisJZW90X3Z0YmwuZW5kX3NlZyAgICAgICAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgKyAxOworCWVvdF92dGJsLmJsa19zeiAgICAgICAgICA9IHpmdF9ibGtfc3o7CisJZW90X3Z0YmwuY291bnQgICAgICAgICAgID0gLTE7CisJdGFwZV92dGJsLnN0YXJ0X3NlZyA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsKKwl0YXBlX3Z0YmwuZW5kX3NlZyAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQ7CisJdGFwZV92dGJsLmJsa19zeiAgICA9IHpmdF9ibGtfc3o7CisJdGFwZV92dGJsLnNpemUgICAgICA9IHpmdF9jYXBhY2l0eTsKKwl0YXBlX3Z0YmwuY291bnQgICAgID0gMDsKK30KKworLyogY2hlY2sgZm9yIGEgdmFsaWQgVlRCTCBzaWduYXR1cmUuIAorICovCitzdGF0aWMgaW50IHZ0Ymxfc2lnbmF0dXJlX3ZhbGlkKF9fdTggc2lnbmF0dXJlWzRdKQoreworCWNvbnN0IGNoYXIgKnZ0YmxfaWRzW10gPSBWVEJMX0lEUzsgLyogdmFsaWQgc2lnbmF0dXJlcyAqLworCWludCBqOworCQorCWZvciAoaiA9IDA7IAorCSAgICAgKGogPCBOUl9JVEVNUyh2dGJsX2lkcykpICYmIChtZW1jbXAoc2lnbmF0dXJlLCB2dGJsX2lkc1tqXSwgNCkgIT0gMCk7CisJICAgICBqKyspOworCXJldHVybiBqIDwgTlJfSVRFTVModnRibF9pZHMpOworfQorCisvKiBXZSB1c2VkIHRvIHN0b3JlIHRoZSBibG9jay1zaXplIG9mIHRoZSB2b2x1bWUgaW4gdGhlIHZvbHVtZS1sYWJlbCwKKyAqIHVzaW5nIHRoZSBrZXl3b3JkICJibG9ja3NpemUiLiBUaGUgYmxvY2tzaXplIHdyaXR0ZW4gdG8gdGhlCisgKiB2b2x1bWUtbGFiZWwgaXMgaW4gYnl0ZXMuCisgKgorICogV2UgdXNlIHRoaXMgbm93IG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgemZ0YXBlIHZlcnNpb24uIFdlCisgKiBzdG9yZSB0aGUgYmxvY2tzaXplIGRpcmVjdGx5IGFzIGJpbmFyeSBudW1iZXIgaW4gdGhlIHZlbmRvcgorICogZXh0ZW5zaW9uIHBhcnQgb2YgdGhlIHZvbHVtZSBlbnRyeS4KKyAqLworc3RhdGljIGludCBjaGVja192b2x1bWVfbGFiZWwoY29uc3QgY2hhciAqbGFiZWwsIGludCAqYmxrX3N6KQoreyAKKwlpbnQgdmFsaWRfZm9ybWF0OworCWNoYXIgKmJsb2Nrc2l6ZTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlUUkFDRShmdF90X25vaXNlLCAiY2FsbGVkIHdpdGggXCIlc1wiIC8gXCIlc1wiIiwgbGFiZWwsIFpGVF9WT0xfTkFNRSk7CisJaWYgKHN0cm5jbXAobGFiZWwsIFpGVF9WT0xfTkFNRSwgc3RybGVuKFpGVF9WT0xfTkFNRSkpICE9IDApIHsKKwkJKmJsa19zeiA9IDE7IC8qIHNtYWxsZXN0IGJsb2NrIHNpemUgdGhhdCB3ZSBhbGxvdyAqLworCQl2YWxpZF9mb3JtYXQgPSAwOworCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJnb3Qgb2xkIHN0eWxlIHpmdGFwZSB2dGJsIGVudHJ5Iik7CisJCS8qIGdldCB0aGUgZGVmYXVsdCBibG9ja3NpemUgKi8KKwkJLyogdXNlIHRoZSBrZXJuZWwgc3Ryc3RyKCkgICAqLworCQlibG9ja3NpemU9IHN0cnN0cihsYWJlbCwgIiBibG9ja3NpemUgIik7CisJCWlmIChibG9ja3NpemUpIHsKKwkJCWJsb2Nrc2l6ZSArPSBzdHJsZW4oIiBibG9ja3NpemUgIik7CisJCQlmb3IoKmJsa19zej0gMDsgCisJCQkgICAgKmJsb2Nrc2l6ZSA+PSAnMCcgJiYgKmJsb2Nrc2l6ZSA8PSAnOSc7IAorCQkJICAgIGJsb2Nrc2l6ZSsrKSB7CisJCQkJKmJsa19zeiAqPSAxMDsKKwkJCQkqYmxrX3N6ICs9ICpibG9ja3NpemUgLSAnMCc7CisJCQl9CisJCQlpZiAoKmJsa19zeiA+IFpGVF9NQVhfQkxLX1NaKSB7CisJCQkJKmJsa19zej0gMTsKKwkJCQl2YWxpZF9mb3JtYXQ9IDA7CisJCQl9IGVsc2UgeworCQkJCXZhbGlkX2Zvcm1hdCA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQkqYmxrX3N6PSAxOworCQkJdmFsaWRfZm9ybWF0PSAwOworCQl9CisJfQorCVRSQUNFX0VYSVQgdmFsaWRfZm9ybWF0OworfQorCisvKiAgIGNoZWNrIGZvciBhIHpmdGFwZSB2b2x1bWUKKyAqLworc3RhdGljIGludCBjaGVja192b2x1bWUoX191OCAqZW50cnksIHpmdF92b2xpbmZvICp2b2x1bWUpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYoc3RybmNtcCgmZW50cnlbVlRCTF9FWFQrRVhUX1pGVEFQRV9TSUddLCBaRlRBUEVfU0lHLAorCQkgICBzdHJsZW4oWkZUQVBFX1NJRykpID09IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImdvdCBuZXcgc3R5bGUgemZ0YXBlIHZ0YmwgZW50cnkiKTsKKwkJdm9sdW1lLT5ibGtfc3ogPSBHRVQyKGVudHJ5LCBWVEJMX0VYVCtFWFRfWkZUQVBFX0JMS1NaKTsKKwkJdm9sdW1lLT5xaWMxMTMgPSBlbnRyeVtWVEJMX0VYVCtFWFRfWkZUQVBFX1FJQzExM107CisJCVRSQUNFX0VYSVQgMTsKKwl9IGVsc2UgeworCQlUUkFDRV9FWElUIGNoZWNrX3ZvbHVtZV9sYWJlbCgmZW50cnlbVlRCTF9ERVNDXSwgJnZvbHVtZS0+YmxrX3N6KTsKKwl9Cit9CisKKworLyogY3JlYXRlIHpmdGFwZSBzcGVjaWZpYyB2dGJsIGVudHJ5LCB0aGUgdm9sdW1lIGJvdW5kcyBhcmUgaW5zZXJ0ZWQKKyAqIGluIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLCB6ZnRfY3JlYXRlX3ZvbHVtZV9oZWFkZXJzKCkKKyAqLworc3RhdGljIHZvaWQgY3JlYXRlX3pmdF92b2x1bWUoX191OCAqZW50cnksIHpmdF92b2xpbmZvICp2dGJsKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJbWVtc2V0KGVudHJ5LCAwLCBWVEJMX1NJWkUpOworCW1lbWNweSgmZW50cnlbVlRCTF9TSUddLCBWVEJMX0lELCA0KTsKKwlzcHJpbnRmKCZlbnRyeVtWVEJMX0RFU0NdLCBaRlRfVk9MX05BTUUiICUwM2QiLCB2dGJsLT5jb3VudCk7CisJZW50cnlbVlRCTF9GTEFHU10gPSAoVlRCTF9GTF9OT1RfVkVSSUZJRUQgfCBWVEJMX0ZMX1NFR19TUEFOTklORyk7CisJZW50cnlbVlRCTF9NX05PXSA9IDE7IC8qIG11bHRpX2NhcnRyaWRnZV9jb3VudCAqLworCXN0cmNweSgmZW50cnlbVlRCTF9FWFQrRVhUX1pGVEFQRV9TSUddLCBaRlRBUEVfU0lHKTsKKwlQVVQyKGVudHJ5LCBWVEJMX0VYVCtFWFRfWkZUQVBFX0JMS1NaLCB2dGJsLT5ibGtfc3opOworCWlmICh6ZnRfcWljMTEzKSB7CisJCVBVVDgoZW50cnksIFZUQkxfREFUQV9TSVpFLCB2dGJsLT5zaXplKTsKKwkJZW50cnlbVlRCTF9DTVBSXSA9IFZUQkxfQ01QUl9VTlJFRzsgCisJCWlmICh2dGJsLT51c2VfY29tcHJlc3Npb24pIHsgLyogdXNlIGNvbXByZXNzaW9uOiAqLworCQkJZW50cnlbVlRCTF9DTVBSXSB8PSBWVEJMX0NNUFJfVVNFRDsKKwkJfQorCQllbnRyeVtWVEJMX0VYVCtFWFRfWkZUQVBFX1FJQzExM10gPSAxOworCX0gZWxzZSB7CisJCVBVVDQoZW50cnksIFZUQkxfREFUQV9TSVpFLCB2dGJsLT5zaXplKTsKKwkJZW50cnlbVlRCTF9LX0NNUFJdID0gVlRCTF9DTVBSX1VOUkVHOyAKKwkJaWYgKHZ0YmwtPnVzZV9jb21wcmVzc2lvbikgeyAvKiB1c2UgY29tcHJlc3Npb246ICovCisJCQllbnRyeVtWVEJMX0tfQ01QUl0gfD0gVlRCTF9DTVBSX1VTRUQ7CisJCX0KKwl9CisJaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpIHsKKwkJLyogU0NTSSBsaWtlIHZ0YmwsIHN0b3JlIHRoZSBudW1iZXIgb2YgdXNlZAorCQkgKiBzZWdtZW50cyBhcyA0IGJ5dGUgdmFsdWUgCisJCSAqLworCQlQVVQ0KGVudHJ5LCBWVEJMX1NDU0lfU0VHUywgdnRibC0+ZW5kX3NlZy12dGJsLT5zdGFydF9zZWcgKyAxKTsKKwl9IGVsc2UgeworCQkvKiBub3JtYWwsIFFJQy04ME1DIGxpa2UgdnRibCAKKwkJICovCisJCVBVVDIoZW50cnksIFZUQkxfU1RBUlQsIHZ0YmwtPnN0YXJ0X3NlZyk7CisJCVBVVDIoZW50cnksIFZUQkxfRU5ELCB2dGJsLT5lbmRfc2VnKTsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworLyogdGhpcyBvbmUgY3JlYXRlcyB0aGUgdm9sdW1lIGhlYWRlcnMgZm9yIGVhY2ggdm9sdW1lLiBJdCBpcyBhc3N1bWVkCisgKiB0aGF0IGJ1ZmZlciBhbHJlYWR5IGNvbnRhaW5zIHRoZSBvbGQgdm9sdW1lLXRhYmxlLCBzbyB0aGF0IHZ0YmwKKyAqIGVudHJpZXMgd2l0aG91dCB0aGUgemZ0X3ZvbHVtZSBmbGFnIHNldCBjYW4gc2F2ZWx5IGJlIGlnbm9yZWQuCisgKi8KK3N0YXRpYyB2b2lkIHpmdF9jcmVhdGVfdm9sdW1lX2hlYWRlcnMoX191OCAqYnVmZmVyKQoreyAgIAorCV9fdTggKmVudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwl6ZnRfdm9saW5mbyAqdnRibDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKyNpZmRlZiBaRlRfQ01BUF9IQUNLCisJaWYoKHN0cm5jbXAoJmJ1ZmZlcltWVEJMX0VYVCtFWFRfWkZUQVBFX1NJR10sIFpGVEFQRV9TSUcsCisJCSAgICBzdHJsZW4oWkZUQVBFX1NJRykpID09IDApICYmIAorCSAgIGJ1ZmZlcltWVEJMX0VYVCtFWFRfWkZUQVBFX0NNQVBdICE9IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImRlbGV0aW5nIGNtYXAgdm9sdW1lIik7CisJCW1lbW1vdmUoYnVmZmVyLCBidWZmZXIgKyBWVEJMX1NJWkUsCisJCQlGVF9TRUdNRU5UX1NJWkUgLSBWVEJMX1NJWkUpOworCX0KKyNlbmRpZgorCWVudHJ5ID0gYnVmZmVyOworCWZvciAodG1wID0gemZ0X2hlYWRfdnRibC0+bm9kZS5uZXh0OworCSAgICAgdG1wICE9ICZ6ZnRfZW9tX3Z0YmwtPm5vZGU7CisJICAgICB0bXAgPSB0bXAtPm5leHQpIHsKKwkJdnRibCA9IGxpc3RfZW50cnkodG1wLCB6ZnRfdm9saW5mbywgbm9kZSk7CisJCS8qIHdlIG5vdyBmaWxsIGluIHRoZSB2YWx1ZXMgb25seSBmb3IgbmV3bHkgY3JlYXRlZCB2b2x1bWVzLgorCQkgKi8KKwkJaWYgKHZ0YmwtPm5ld192b2x1bWUpIHsKKwkJCWNyZWF0ZV96ZnRfdm9sdW1lKGVudHJ5LCB2dGJsKTsKKwkJCXZ0YmwtPm5ld192b2x1bWUgPSAwOyAvKiBjbGVhciB0aGUgZmxhZyAqLworCQl9CisJCQorCQlEVU1QX1ZPTElORk8oZnRfdF9ub2lzZSwgJmVudHJ5W1ZUQkxfREVTQ10sIHZ0YmwpOworCQllbnRyeSArPSBWVEJMX1NJWkU7CisJfQorCW1lbXNldChlbnRyeSwgMCwgRlRfU0VHTUVOVF9TSVpFIC0gemZ0X2VvbV92dGJsLT5jb3VudCAqIFZUQkxfU0laRSk7CisJVFJBQ0VfRVhJVDsKK30KKworLyogIHdyaXRlIHZvbHVtZSB0YWJsZSB0byB0YXBlLiBDYWxscyB6ZnRfY3JlYXRlX3ZvbHVtZV9oZWFkZXJzKCkKKyAqLworaW50IHpmdF91cGRhdGVfdm9sdW1lX3RhYmxlKHVuc2lnbmVkIGludCBzZWdtZW50KQoreworCWludCByZXN1bHQgPSAwOworCV9fdTggKnZlcmlmeV9idWYgPSBOVUxMOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0VfQ0FUQ0gocmVzdWx0ID0gZnRhcGVfcmVhZF9zZWdtZW50KGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCwgCisJCQkJCQl6ZnRfZGVibG9ja19idWYsCisJCQkJCQlGVF9SRF9TSU5HTEUpLCk7CisJemZ0X2NyZWF0ZV92b2x1bWVfaGVhZGVycyh6ZnRfZGVibG9ja19idWYpOworCVRSQUNFKGZ0X3Rfbm9pc2UsICJ3cml0aW5nIHZvbHVtZSB0YWJsZSBzZWdtZW50ICVkIiwgc2VnbWVudCk7CisJaWYgKHpmdF92bWFsbG9jX29uY2UoJnZlcmlmeV9idWYsIEZUX1NFR01FTlRfU0laRSkgPT0gMCkgeworCQlUUkFDRV9DQVRDSCh6ZnRfdmVyaWZ5X3dyaXRlX3NlZ21lbnRzKHNlZ21lbnQsIAorCQkJCQkJICAgICAgemZ0X2RlYmxvY2tfYnVmLCByZXN1bHQsCisJCQkJCQkgICAgICB2ZXJpZnlfYnVmKSwKKwkJCSAgICB6ZnRfdmZyZWUoJnZlcmlmeV9idWYsIEZUX1NFR01FTlRfU0laRSkpOworCQl6ZnRfdmZyZWUoJnZlcmlmeV9idWYsIEZUX1NFR01FTlRfU0laRSk7CisJfSBlbHNlIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfd3JpdGVfc2VnbWVudChzZWdtZW50LCB6ZnRfZGVibG9ja19idWYsIAorCQkJCQkJRlRfV1JfU0lOR0xFKSwpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qIG5vbiB6ZnRhcGUgdm9sdW1lcyBhcmUgaGFuZGxlZCBpbiByYXcgbW9kZS4gVGh1cyB3ZSBuZWVkIHRvCisgKiBjYWxjdWxhdGUgdGhlIHJhdyBhbW91bnQgb2YgZGF0YSBjb250YWluZWQgaW4gdGhvc2Ugc2VnbWVudHMuICAKKyAqLworc3RhdGljIHZvaWQgZXh0cmFjdF9hbGllbl92b2x1bWUoX191OCAqZW50cnksIHpmdF92b2xpbmZvICp2dGJsKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJdnRibC0+c2l6ZSAgPSAoemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2xhc3RfdnRibC0+ZW5kX3NlZysxKSAtCisJCSAgICAgICB6ZnRfY2FsY190YXBlX3Bvcyh6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcpKTsKKwl2dGJsLT51c2VfY29tcHJlc3Npb24gPSAwOworCXZ0YmwtPnFpYzExMyA9IHpmdF9xaWMxMTM7CisJaWYgKHZ0YmwtPnFpYzExMykgeworCQlUUkFDRShmdF90X25vaXNlLCAKKwkJICAgICAgIkZha2UgYWxpZW4gdm9sdW1lJ3Mgc2l6ZSBmcm9tICIgTExfWCAiIHRvICIgTExfWCwgCisJCSAgICAgIExMKEdFVDgoZW50cnksIFZUQkxfREFUQV9TSVpFKSksIExMKHZ0YmwtPnNpemUpKTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X25vaXNlLAorCQkgICAgICAiRmFrZSBhbGllbiB2b2x1bWUncyBzaXplIGZyb20gJWQgdG8gIiBMTF9YLCAKKwkJICAgICAgKGludClHRVQ0KGVudHJ5LCBWVEJMX0RBVEFfU0laRSksIExMKHZ0YmwtPnNpemUpKTsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworCisvKiBleHRyYWN0IGFuIHpmdGFwZSBzcGVjaWZpYyB2b2x1bWUKKyAqLworc3RhdGljIHZvaWQgZXh0cmFjdF96ZnRfdm9sdW1lKF9fdTggKmVudHJ5LCB6ZnRfdm9saW5mbyAqdnRibCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICh2dGJsLT5xaWMxMTMpIHsKKwkJdnRibC0+c2l6ZSA9IEdFVDgoZW50cnksIFZUQkxfREFUQV9TSVpFKTsKKwkJdnRibC0+dXNlX2NvbXByZXNzaW9uID0gCisJCQkoZW50cnlbVlRCTF9DTVBSXSAmIFZUQkxfQ01QUl9VU0VEKSAhPSAwOyAKKwl9IGVsc2UgeworCQl2dGJsLT5zaXplID0gR0VUNChlbnRyeSwgVlRCTF9EQVRBX1NJWkUpOworCQlpZiAoZW50cnlbVlRCTF9LX0NNUFJdICYgVlRCTF9DTVBSX1VOUkVHKSB7CisJCQl2dGJsLT51c2VfY29tcHJlc3Npb24gPSAKKwkJCQkoZW50cnlbVlRCTF9LX0NNUFJdICYgVlRCTF9DTVBSX1VTRUQpICE9IDA7CisJCX0gZWxzZSBpZiAoZW50cnlbVlRCTF9DTVBSXSAmIFZUQkxfQ01QUl9VTlJFRykgeworCQkJdnRibC0+dXNlX2NvbXByZXNzaW9uID0gCisJCQkJKGVudHJ5W1ZUQkxfQ01QUl0gJiBWVEJMX0NNUFJfVVNFRCkgIT0gMDsgCisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJHZWVoISBUaGVyZSBpcyBzb21ldGhpbmcgd3Jvbmc6XG4iCisJCQkgICAgICBLRVJOX0lORk8gIlFJQyBjb21wcmVzc2lvbiAoUmV2ID0gSyk6ICV4XG4iCisJCQkgICAgICBLRVJOX0lORk8gIlFJQyBjb21wcmVzc2lvbiAoUmV2ID4gSyk6ICV4IiwKKwkJCSAgICAgIGVudHJ5W1ZUQkxfS19DTVBSXSwgZW50cnlbVlRCTF9DTVBSXSk7CisJCX0KKwl9CisJVFJBQ0VfRVhJVDsKK30KKworLyogZXh0cmFjdCB0aGUgdm9sdW1lIHRhYmxlIGZyb20gYnVmZmVyLiAiYnVmZmVyIiBtdXN0IGFscmVhZHkgY29udGFpbgorICogdGhlIHZ0Ymwtc2VnbWVudCAKKyAqLworaW50IHpmdF9leHRyYWN0X3ZvbHVtZV9oZWFkZXJzKF9fdTggKmJ1ZmZlcikKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIF9fdTggKmVudHJ5OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCXpmdF9pbml0X3Z0YmwoKTsKKwllbnRyeSA9IGJ1ZmZlcjsKKyNpZmRlZiBaRlRfQ01BUF9IQUNLCisJaWYgKChzdHJuY21wKCZlbnRyeVtWVEJMX0VYVCtFWFRfWkZUQVBFX1NJR10sIFpGVEFQRV9TSUcsCisJCSAgICAgc3RybGVuKFpGVEFQRV9TSUcpKSA9PSAwKSAmJgorCSAgICBlbnRyeVtWVEJMX0VYVCtFWFRfWkZUQVBFX0NNQVBdICE9IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImlnbm9yaW5nIGNtYXAgdm9sdW1lIik7CisJCWVudHJ5ICs9IFZUQkxfU0laRTsKKwl9IAorI2VuZGlmCisJLyogdGhlIGVuZCBvZiB0aGUgdnRibCBpcyBpbmRpY2F0ZWQgYnkgYW4gaW52YWxpZCBzaWduYXR1cmUgCisJICovCisJd2hpbGUgKHZ0Ymxfc2lnbmF0dXJlX3ZhbGlkKCZlbnRyeVtWVEJMX1NJR10pICYmCisJICAgICAgIChlbnRyeSAtIGJ1ZmZlcikgPCBGVF9TRUdNRU5UX1NJWkUpIHsKKwkJemZ0X25ld192dGJsX2VudHJ5KCk7CisJCWlmIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSB7CisJCQkvKiBTQ1NJIGxpa2UgdnRibCwgc3RvcmVzIG9ubHkgdGhlIG51bWJlciBvZgorCQkJICogc2VnbWVudHMgdXNlZCAKKwkJCSAqLworCQkJdW5zaWduZWQgaW50IG51bV9zZWdtZW50cz0gR0VUNChlbnRyeSwgVlRCTF9TQ1NJX1NFR1MpOworCQkJemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnID0gemZ0X2VvbV92dGJsLT5zdGFydF9zZWc7CisJCQl6ZnRfbGFzdF92dGJsLT5lbmRfc2VnID0gCisJCQkJemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnICsgbnVtX3NlZ21lbnRzIC0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIGBub3JtYWwnLCBRSUMtODAgbGlrZSB2dGJsIAorCQkJICovCisJCQl6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcgPSBHRVQyKGVudHJ5LCBWVEJMX1NUQVJUKTsKKwkJCXpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgICA9IEdFVDIoZW50cnksIFZUQkxfRU5EKTsKKwkJfQorCQl6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyAgPSB6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICsgMTsKKwkJLyogY2hlY2sgaWYgd2UgY3JlYXRlZCB0aGlzIHZvbHVtZSBhbmQgZ2V0IHRoZQorCQkgKiBibGtfc3ogCisJCSAqLworCQl6ZnRfbGFzdF92dGJsLT56ZnRfdm9sdW1lID0gY2hlY2tfdm9sdW1lKGVudHJ5LCB6ZnRfbGFzdF92dGJsKTsKKwkJaWYgKHpmdF9sYXN0X3Z0YmwtPnpmdF92b2x1bWUgPT0gMCkgeworCQkJZXh0cmFjdF9hbGllbl92b2x1bWUoZW50cnksIHpmdF9sYXN0X3Z0YmwpOworCQl9IGVsc2UgeworCQkJZXh0cmFjdF96ZnRfdm9sdW1lKGVudHJ5LCB6ZnRfbGFzdF92dGJsKTsKKwkJfQorCQlEVU1QX1ZPTElORk8oZnRfdF9ub2lzZSwgJmVudHJ5W1ZUQkxfREVTQ10sIHpmdF9sYXN0X3Z0YmwpOworCQllbnRyeSArPVZUQkxfU0laRTsKKwl9CisjaWYgMAorLyoKKyAqICB1bmRlZmluZSB0byB0ZXN0IGVuZCBvZiB0YXBlIGhhbmRsaW5nCisgKi8KKwl6ZnRfbmV3X3Z0YmxfZW50cnkoKTsKKwl6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcgPSB6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZzsKKwl6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudCAtIDEwOworCXpmdF9sYXN0X3Z0YmwtPmJsa19zeiAgICAgICAgICA9IHpmdF9ibGtfc3o7CisJemZ0X2xhc3RfdnRibC0+emZ0X3ZvbHVtZSAgICAgID0gMTsKKwl6ZnRfbGFzdF92dGJsLT5xaWMxMTMgICAgICAgICAgPSB6ZnRfcWljMTEzOworCXpmdF9sYXN0X3Z0YmwtPnNpemUgPSAoemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2xhc3RfdnRibC0+ZW5kX3NlZysxKQorCQkJICAgICAgIC0gemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnKSk7CisjZW5kaWYKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb25zIHRyYW5zbGF0ZXMgdGhlIGZhaWxlZF9zZWN0b3JfbG9nLCBtaXN1c2VkIGFzCisgKiBFT0YtbWFya2VyIGxpc3QsIGludG8gYSB2aXJ0dWFsIHZvbHVtZSB0YWJsZS4gVGhlIHRhYmxlIG11c3RuJ3QgYmUKKyAqIHdyaXR0ZW4gdG8gdGFwZSwgYmVjYXVzZSB0aGlzIHdvdWxkIG9jY3VweSB0aGUgZmlyc3QgZGF0YSBzZWdtZW50LAorICogd2hpY2ggc2hvdWxkIGJlIHRoZSB2b2x1bWUgdGFibGUsIGJ1dCBpcyBhY3R1YWxseSB0aGUgZmlyc3Qgc2VnbWVudAorICogdGhhdCBpcyBmaWxsZWQgd2l0aCBkYXRhICh3aGVuIHVzaW5nIHN0YW5kYXJkIGZ0YXBlKS4gIFdlIGFzc3VtZSwKKyAqIHRoYXQgd2UgZ2V0IGEgbm9uLWVtcHR5IGZhaWxlZF9zZWN0b3JfbG9nLgorICovCitpbnQgemZ0X2Zha2Vfdm9sdW1lX2hlYWRlcnMgKGVvZl9tYXJrX3VuaW9uICplb2ZfbWFwLCBpbnQgbnVtX2ZhaWxlZF9zZWN0b3JzKQoreworCXVuc2lnbmVkIGludCBzZWdtZW50LCBzZWN0b3I7CisJaW50IGhhdmVfZW9tID0gMDsKKwlpbnQgdm9sX25vOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKChudW1fZmFpbGVkX3NlY3RvcnMgPj0gMikgJiYKKwkgICAgKEdFVDIoJmVvZl9tYXBbbnVtX2ZhaWxlZF9zZWN0b3JzIC0gMV0ubWFyay5zZWdtZW50LCAwKSAKKwkgICAgID09IAorCSAgICAgR0VUMigmZW9mX21hcFtudW1fZmFpbGVkX3NlY3RvcnMgLSAyXS5tYXJrLnNlZ21lbnQsIDApICsgMSkgJiYKKwkgICAgKEdFVDIoJmVvZl9tYXBbbnVtX2ZhaWxlZF9zZWN0b3JzIC0gMV0ubWFyay5kYXRlLCAwKSA9PSAxKSkgeworCQkvKiB0aGlzIHNob3VsZCBiZSBlb20uIFdlIGtlZXAgdGhlIHJlbWFpbmRlciBvZiB0aGUKKwkJICogdGFwZSBhcyBhbm90aGVyIHZvbHVtZS4KKwkJICovCisJCWhhdmVfZW9tID0gMTsKKwl9CisJemZ0X2luaXRfdnRibCgpOworCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OworCWZvcih2b2xfbm8gPSAwOyB2b2xfbm8gPCBudW1fZmFpbGVkX3NlY3RvcnMgLSBoYXZlX2VvbTsgdm9sX25vICsrKSB7CisJCXpmdF9uZXdfdnRibF9lbnRyeSgpOworCisJCXNlZ21lbnQgPSBHRVQyKCZlb2ZfbWFwW3ZvbF9ub10ubWFyay5zZWdtZW50LCAwKTsKKwkJc2VjdG9yICA9IEdFVDIoJmVvZl9tYXBbdm9sX25vXS5tYXJrLmRhdGUsIDApOworCisJCXpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyAgPSB6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZzsKKwkJemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyAgICA9IHNlZ21lbnQ7CisJCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnICA9IHNlZ21lbnQgKyAxOworCQl6ZnRfbGFzdF92dGJsLT5ibGtfc3ogICAgID0gMTsKKwkJemZ0X2xhc3RfdnRibC0+c2l6ZSAgICAgICA9IAorCQkJKHpmdF9jYWxjX3RhcGVfcG9zKHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcpCisJCQkgLSB6ZnRfY2FsY190YXBlX3Bvcyh6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcpCisJCQkgKyAoc2VjdG9yLTEpICogRlRfU0VDVE9SX1NJWkUpOworCQlUUkFDRShmdF90X25vaXNlLCAKKwkJICAgICAgImZhaWxlZCBzZWN0b3IgbG9nOiBzZWdtZW50OiAlZCwgc2VjdG9yOiAlZCIsIAorCQkgICAgICBzZWdtZW50LCBzZWN0b3IpOworCQlEVU1QX1ZPTElORk8oZnRfdF9ub2lzZSwgIkZha2VkIHZvbHVtZSIsIHpmdF9sYXN0X3Z0YmwpOworCX0KKwlpZiAoIWhhdmVfZW9tKSB7CisJCXpmdF9uZXdfdnRibF9lbnRyeSgpOworCQl6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcgPSB6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZzsKKwkJemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQ7CisJCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICsgMTsKKwkJemZ0X2xhc3RfdnRibC0+c2l6ZSAgICAgID0gemZ0X2NhcGFjaXR5OworCQl6ZnRfbGFzdF92dGJsLT5zaXplICAgICAtPSB6ZnRfY2FsY190YXBlX3Bvcyh6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcpOworCQl6ZnRfbGFzdF92dGJsLT5ibGtfc3ogICAgPSAxOworCQlEVU1QX1ZPTElORk8oZnRfdF9ub2lzZSwgIkZha2VkIHZvbHVtZSIsemZ0X2xhc3RfdnRibCk7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworLyogdXBkYXRlIHRoZSBpbnRlcm5hbCB2b2x1bWUgdGFibGUKKyAqCisgKiBpZiBiZWZvcmUgc3RhcnQgb2YgbGFzdCB2b2x1bWU6IGVyYXNlIGFsbCBmb2xsb3dpbmcgdm9sdW1lcyBpZgorICogaW5zaWRlIGEgdm9sdW1lOiBzZXQgZW5kIG9mIHZvbHVtZSB0byBpbmZpbml0eQorICoKKyAqIHRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgX2Z0YXBlX3dyaXRlKCkgaXMKKyAqIGNhbGxlZAorICoKKyAqIHJldHVybjogMCBpZiBubyBuZXcgdm9sdW1lIHdhcyBjcmVhdGVkLCAxIGlmIGEgbmV3IHZvbHVtZSB3YXMKKyAqIGNyZWF0ZWQKKyAqCisgKiBOT1RFOiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB6ZnRfbW9kZSBhcyBmdGFwZV93cml0ZSgpIGRvZXMKKyAqIHRoYXQgYWxyZWFkeS4gVGhpcyBmdW5jdGlvbiBnZXRzIG5ldmVyIGNhbGxlZCB3aXRob3V0IGFjY2Vzc2luZworICogemZ0YXBlIHZpYSB0aGUgKnFmdCogZGV2aWNlcyAKKyAqLworCitpbnQgemZ0X29wZW5fdm9sdW1lKHpmdF9wb3NpdGlvbiAqcG9zLCBpbnQgYmxrX3N6LCBpbnQgdXNlX2NvbXByZXNzaW9uKQoreyAKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZiAoIXpmdF9xaWNfbW9kZSkgeworCQlUUkFDRV9FWElUIDA7CisJfQorCWlmICh6ZnRfdGFwZV9hdF9sYm90KHBvcykpIHsKKwkJemZ0X2luaXRfdnRibCgpOworCQlpZih6ZnRfb2xkX2Z0YXBlKSB7CisJCQkvKiBjbGVhciBvbGQgZnRhcGUncyBlb2YgbWFya3MgKi8KKwkJCXpmdF9jbGVhcl9mdGFwZV9maWxlX21hcmtzKCk7CisJCQl6ZnRfb2xkX2Z0YXBlID0gMDsgLyogbm8gbG9uZ2VyIG9sZCBmdGFwZSAqLworCQl9CisJCXpmdF9yZXNldF9wb3NpdGlvbihwb3MpOworCX0KKwlpZiAocG9zLT5zZWdfcG9zICE9IHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgKyAxKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfYnVnLCAKKwkJICAgICAgIkJVRzogc2VnX3BvczogJWQsIHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWc6ICVkIiwgCisJCSAgICAgIHBvcy0+c2VnX3BvcywgemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyk7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlUUkFDRShmdF90X25vaXNlLCAiY3JlYXRlIG5ldyB2b2x1bWUiKTsKKwlpZiAoemZ0X2VvbV92dGJsLT5jb3VudCA+PSBaRlRfTUFYX1ZPTFVNRVMpIHsKKwkJVFJBQ0VfQUJPUlQoLUVOT1NQQywgZnRfdF9lcnIsCisJCQkgICAgIkVycm9yOiBtYXhtaW1hbCBudW1iZXIgb2Ygdm9sdW1lcyBleGhhdXN0ZWQgIgorCQkJICAgICIobWF4bWltdW0gaXMgJWQpIiwgWkZUX01BWF9WT0xVTUVTKTsKKwl9CisJemZ0X25ld192dGJsX2VudHJ5KCk7CisJcG9zLT52b2x1bWVfcG9zID0gcG9zLT5zZWdfYnl0ZV9wb3MgPSAwOworCXpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyAgICAgICA9IHBvcy0+c2VnX3BvczsKKwl6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICAgICAgICAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudDsgLyogaW5maW5pdHkgKi8KKwl6ZnRfbGFzdF92dGJsLT5ibGtfc3ogICAgICAgICAgPSBibGtfc3o7CisJemZ0X2xhc3RfdnRibC0+c2l6ZSAgICAgICAgICAgID0gemZ0X2NhcGFjaXR5OworCXpmdF9sYXN0X3Z0YmwtPnpmdF92b2x1bWUgICAgICA9IDE7CisJemZ0X2xhc3RfdnRibC0+dXNlX2NvbXByZXNzaW9uID0gdXNlX2NvbXByZXNzaW9uOworCXpmdF9sYXN0X3Z0YmwtPnFpYzExMyAgICAgICAgICA9IHpmdF9xaWMxMTM7CisJemZ0X2xhc3RfdnRibC0+bmV3X3ZvbHVtZSAgICAgID0gMTsKKwl6ZnRfbGFzdF92dGJsLT5vcGVuICAgICAgICAgICAgPSAxOworCXpmdF92b2x1bWVfdGFibGVfY2hhbmdlZCA9IDE7CisJemZ0X2VvbV92dGJsLT5zdGFydF9zZWcgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgKyAxOworCVRSQUNFX0VYSVQgMDsKK30KKworLyogIHBlcmZvcm0gbXRmc2YsIG10YnNmLCBub3QgYWxsb3dlZCB3aXRob3V0IHpmdF9xaWNfbW9kZQorICovCitpbnQgemZ0X3NraXBfdm9sdW1lcyhpbnQgY291bnQsIHpmdF9wb3NpdGlvbiAqcG9zKQoreyAKKwljb25zdCB6ZnRfdm9saW5mbyAqdnRibDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlUUkFDRShmdF90X25vaXNlLCAiY291bnQ6ICVkIiwgY291bnQpOworCQorCXZ0Ymw9IHpmdF9maW5kX3ZvbHVtZShwb3MtPnNlZ19wb3MpOworCXdoaWxlIChjb3VudCA+IDAgJiYgdnRibCAhPSB6ZnRfZW9tX3Z0YmwpIHsKKwkJdnRibCA9IGxpc3RfZW50cnkodnRibC0+bm9kZS5uZXh0LCB6ZnRfdm9saW5mbywgbm9kZSk7CisJCWNvdW50IC0tOworCX0KKwl3aGlsZSAoY291bnQgPCAwICYmIHZ0YmwgIT0gemZ0X2ZpcnN0X3Z0YmwpIHsKKwkJdnRibCA9IGxpc3RfZW50cnkodnRibC0+bm9kZS5wcmV2LCB6ZnRfdm9saW5mbywgbm9kZSk7CisJCWNvdW50ICsrOworCX0KKwlwb3MtPnNlZ19wb3MgICAgICAgID0gdnRibC0+c3RhcnRfc2VnOworCXBvcy0+c2VnX2J5dGVfcG9zICAgPSAwOworCXBvcy0+dm9sdW1lX3BvcyAgICAgPSAwOworCXBvcy0+dGFwZV9wb3MgICAgICAgPSB6ZnRfY2FsY190YXBlX3Bvcyhwb3MtPnNlZ19wb3MpOworCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSB2dGJsLT5zaXplID09IDA7CisJaWYgKHpmdF9jbXByX29wcykgeworCQkoKnpmdF9jbXByX29wcy0+cmVzZXQpKCk7CisJfQorCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsgLyogbm8gbmVlZCB0byBrZWVwIGNhY2hlICovCisJVFJBQ0UoZnRfdF9ub2lzZSwgInJlcG9zaXRpb25pbmcgdG86XG4iCisJICAgICAgS0VSTl9JTkZPICJ6ZnRfc2VnX3BvcyAgICAgICAgOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAiemZ0X3NlZ19ieXRlX3BvcyAgIDogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gInpmdF90YXBlX3BvcyAgICAgICA6ICIgTExfWCAiXG4iCisJICAgICAgS0VSTl9JTkZPICJ6ZnRfdm9sdW1lX3BvcyAgICAgOiAiIExMX1ggIlxuIgorCSAgICAgIEtFUk5fSU5GTyAiZmlsZSBudW1iZXIgICAgICAgIDogJWQiLAorCSAgICAgIHBvcy0+c2VnX3BvcywgcG9zLT5zZWdfYnl0ZV9wb3MsIAorCSAgICAgIExMKHBvcy0+dGFwZV9wb3MpLCBMTChwb3MtPnZvbHVtZV9wb3MpLCB2dGJsLT5jb3VudCk7CisJemZ0X3Jlc2lkID0gY291bnQgPCAwID8gLWNvdW50IDogY291bnQ7CisJVFJBQ0VfRVhJVCB6ZnRfcmVzaWQgPyAtRUlOVkFMIDogMDsKK30KKworLyogdGhlIGZvbGxvd2luZyBzaW1wbHkgcmV0dXJucyB0aGUgcmF3IGRhdGEgcG9zaXRpb24gb2YgdGhlIEVPTQorICogbWFya2VyLCBNVElPQ1NJWkUgaW9jdGwgCisgKi8KK19fczY0IHpmdF9nZXRfZW9tX3Bvcyh2b2lkKQoreworCWlmICh6ZnRfcWljX21vZGUpIHsKKwkJcmV0dXJuIHpmdF9jYWxjX3RhcGVfcG9zKHpmdF9lb21fdnRibC0+c3RhcnRfc2VnKTsKKwl9IGVsc2UgeworCQkvKiB0aGVyZSBpcyBvbmx5IG9uZSB2b2x1bWUgaW4gcmF3IG1vZGUgKi8KKwkJcmV0dXJuIHpmdF9jYXBhY2l0eTsKKwl9Cit9CisKKy8qIHNraXAgdG8gZW9tLCB1c2VkIGZvciBNVEVPTQorICovCit2b2lkIHpmdF9za2lwX3RvX2VvbSh6ZnRfcG9zaXRpb24gKnBvcykKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwlwb3MtPnNlZ19wb3MgICAgICA9IHpmdF9lb21fdnRibC0+c3RhcnRfc2VnOworCXBvcy0+c2VnX2J5dGVfcG9zID0gCisJCXBvcy0+dm9sdW1lX3BvcyAgICAgPSAKKwkJemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDA7CisJcG9zLT50YXBlX3BvcyA9IHpmdF9jYWxjX3RhcGVfcG9zKHBvcy0+c2VnX3Bvcyk7CisJVFJBQ0UoZnRfdF9ub2lzZSwgImZ0YXBlIHBvc2l0aW9uZWQgdG8gc2VnbWVudCAlZCwgZGF0YSBwb3MgIiBMTF9YLCAKKwkgICAgICBwb3MtPnNlZ19wb3MsIExMKHBvcy0+dGFwZV9wb3MpKTsKKwlUUkFDRV9FWElUOworfQorCisvKiAgd3JpdGUgYW4gRU9GLW1hcmtlciBieSBzZXR0aW5nIHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgdG8gc2VnX3Bvcy4KKyAqICBOT1RFOiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB6ZnRfbGFzdF92dGJsIHBvaW50cyB0byBhIHZhbGlkCisgKiAgdnRibCBlbnRyeQorICoKKyAqICBOT1RFOiB0aGlzIHJvdXRpbmUgYWx3YXlzIHBvc2l0aW9ucyBiZWZvcmUgdGhlIEVPRiBtYXJrZXIKKyAqLworaW50IHpmdF9jbG9zZV92b2x1bWUoemZ0X3Bvc2l0aW9uICpwb3MpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmICh6ZnRfdnRibF9lbXB0eSB8fCAhemZ0X2xhc3RfdnRibC0+b3BlbikgeyAvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCQlUUkFDRShmdF90X25vaXNlLCAiVGhlcmUgYXJlIG5vIHZvbHVtZXMgdG8gZmluaXNoIik7CisJCVRSQUNFX0VYSVQgLUVJTzsKKwl9CisJaWYgKHBvcy0+c2VnX2J5dGVfcG9zID09IDAgJiYgCisJICAgIHBvcy0+c2VnX3BvcyAhPSB6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcpIHsKKwkJcG9zLT5zZWdfcG9zIC0tOworCQlwb3MtPnNlZ19ieXRlX3BvcyAgICAgID0gemZ0X2dldF9zZWdfc3oocG9zLT5zZWdfcG9zKTsKKwl9CisJemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyAgID0gcG9zLT5zZWdfcG9zOworCXpmdF9sYXN0X3Z0YmwtPnNpemUgICAgICA9IHBvcy0+dm9sdW1lX3BvczsKKwl6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQgPSAxOworCXpmdF9qdXN0X2JlZm9yZV9lb2YgICAgICA9IDE7CisJemZ0X2VvbV92dGJsLT5zdGFydF9zZWcgID0gemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyArIDE7CisJemZ0X2xhc3RfdnRibC0+b3BlbiAgICAgID0gMDsgLyogY2xvc2VkICovCisJVFJBQ0VfRVhJVCAwOworfQorCisvKiB3cml0ZSBjb3VudCBmaWxlLW1hcmtzIGF0IGN1cnJlbnQgcG9zaXRpb24uIAorICoKKyAqICBUaGUgdGFwZSBpcyBwb3NpdGlvbmVkIGFmdGVyIHRoZSBlb2YtbWFya2VyLCB0aGF0IGlzIGF0IGJ5dGUgMCBvZgorICogIHRoZSBzZWdtZW50IGZvbGxvd2luZyB0aGUgZW9mLW1hcmtlcgorICoKKyAqICB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgYWxsb3dlZCBpbiB6ZnRfcWljX21vZGUKKyAqCisgKiAgT25seSBhbGxvd2VkIHdoZW4gdGFwZSBpcyBhdCBCT1Qgb3IgRU9ELgorICovCitpbnQgemZ0X3dlb2YodW5zaWduZWQgaW50IGNvdW50LCB6ZnRfcG9zaXRpb24gKnBvcykKK3sKKwkKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICghY291bnQpIHsgLyogd3JpdGUgemVybyBFT0YgbWFya3Mgc2hvdWxkIGJlIGEgcmVhbCBuby1vcCAqLworCQlUUkFDRV9FWElUIDA7CisJfQorCXpmdF92b2x1bWVfdGFibGVfY2hhbmdlZCA9IDE7CisJaWYgKHpmdF90YXBlX2F0X2xib3QocG9zKSkgeworCQl6ZnRfaW5pdF92dGJsKCk7CisJCWlmKHpmdF9vbGRfZnRhcGUpIHsKKwkJCS8qIGNsZWFyIG9sZCBmdGFwZSdzIGVvZiBtYXJrcyAqLworCQkJemZ0X2NsZWFyX2Z0YXBlX2ZpbGVfbWFya3MoKTsKKwkJCXpmdF9vbGRfZnRhcGUgPSAwOyAgICAvKiBubyBsb25nZXIgb2xkIGZ0YXBlICovCisJCX0KKwl9CisJaWYgKHpmdF9sYXN0X3Z0YmwtPm9wZW4pIHsKKwkJemZ0X2Nsb3NlX3ZvbHVtZShwb3MpOworCQl6ZnRfbW92ZV9wYXN0X2VvZihwb3MpOworCQljb3VudCAtLTsKKwl9CisJLyogbm93IGl0J3MgZWFzeSwganVzdCBhcHBlbmQgZW9mLW1hcmtzLCB0aGF0IGlzIGVtcHR5CisJICogdm9sdW1lcywgdG8gdGhlIGVuZCBvZiB0aGUgYWxyZWFkeSByZWNvcmRlZCBtZWRpYS4KKwkgKi8KKwl3aGlsZSAoY291bnQgPiAwICYmIAorCSAgICAgICBwb3MtPnNlZ19wb3MgPD0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgJiYgCisJICAgICAgIHpmdF9lb21fdnRibC0+Y291bnQgPCBaRlRfTUFYX1ZPTFVNRVMpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJICAgICAgIldyaXRpbmcgemVybyBzaXplZCBmaWxlIGF0IHNlZ21lbnQgJWQiLCBwb3MtPnNlZ19wb3MpOworCQl6ZnRfbmV3X3Z0YmxfZW50cnkoKTsKKwkJemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnICAgICAgID0gcG9zLT5zZWdfcG9zOworCQl6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICAgICAgICAgPSBwb3MtPnNlZ19wb3M7CisJCXpmdF9sYXN0X3Z0YmwtPnNpemUgICAgICAgICAgICA9IDA7CisJCXpmdF9sYXN0X3Z0YmwtPmJsa19zeiAgICAgICAgICA9IHpmdF9ibGtfc3o7CisJCXpmdF9sYXN0X3Z0YmwtPnpmdF92b2x1bWUgICAgICA9IDE7CisJCXpmdF9sYXN0X3Z0YmwtPnVzZV9jb21wcmVzc2lvbiA9IDA7CisJCXBvcy0+dGFwZV9wb3MgKz0gemZ0X2dldF9zZWdfc3oocG9zLT5zZWdfcG9zKTsKKwkJemZ0X2VvbV92dGJsLT5zdGFydF9zZWcgPSArKyBwb3MtPnNlZ19wb3M7CisJCWNvdW50IC0tOworCX0gCisJaWYgKGNvdW50ID4gMCkgeworCQkvKiAgdGhlcmUgYXJlIHR3byBwb3NzaWJpbGl0aWVzOiBlbmQgb2YgdGFwZSwgb3IgdGhlCisJCSAqICBtYXhpbXVtIG51bWJlciBvZiBmaWxlcyBpcyBleGhhdXN0ZWQuCisJCSAqLworCQl6ZnRfcmVzaWQgPSBjb3VudDsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwiTnVtYmVyIG9mIG1hcmtzIE5PVCB3cml0dGVuOiAlZCIsIHpmdF9yZXNpZCk7CisJCWlmICh6ZnRfZW9tX3Z0YmwtPmNvdW50ID09IFpGVF9NQVhfVk9MVU1FUykgeworCQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF93YXJuLAorCQkJCSAgICAibWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiBmaWxlcyAiCisJCQkJICAgICJleGhhdXN0ZWQ6ICVkIiwgWkZUX01BWF9WT0xVTUVTKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFX0FCT1JUKC1FTk9TUEMsCisJCQkJICAgIGZ0X3Rfbm9pc2UsICJyZWFjaGVkIGVuZCBvZiB0YXBlIik7CisJCX0KKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitjb25zdCB6ZnRfdm9saW5mbyAqemZ0X2ZpbmRfdm9sdW1lKHVuc2lnbmVkIGludCBzZWdfcG9zKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCVRSQUNFKGZ0X3RfYW55LCAiY2FsbGVkIHdpdGggc2VnX3BvcyAlZCIsc2VnX3Bvcyk7CisJaWYgKCF6ZnRfcWljX21vZGUpIHsKKwkJaWYgKHNlZ19wb3MgPiBmdF9sYXN0X2RhdGFfc2VnbWVudCkgeworCQkJVFJBQ0VfRVhJVCAmZW90X3Z0Ymw7CisJCX0KKwkJdGFwZV92dGJsLmJsa19zeiA9ICB6ZnRfYmxrX3N6OworCQlUUkFDRV9FWElUICZ0YXBlX3Z0Ymw7CisJfQorCWlmIChzZWdfcG9zIDwgemZ0X2ZpcnN0X3Z0YmwtPnN0YXJ0X3NlZykgeworCQlUUkFDRV9FWElUIChjdXJfdnRibCA9IHpmdF9maXJzdF92dGJsKTsKKwl9CisJd2hpbGUgKHNlZ19wb3MgPiBjdXJfdnRibC0+ZW5kX3NlZykgeworCQljdXJfdnRibCA9IGxpc3RfZW50cnkoY3VyX3Z0YmwtPm5vZGUubmV4dCwgemZ0X3ZvbGluZm8sIG5vZGUpOworCQlUUkFDRShmdF90X25vaXNlLCAiJWQgLSAlZCIsIGN1cl92dGJsLT5zdGFydF9zZWcsIGN1cl92dGJsLT5lbmRfc2VnKTsKKwl9CisJd2hpbGUgKHNlZ19wb3MgPCBjdXJfdnRibC0+c3RhcnRfc2VnKSB7CisJCWN1cl92dGJsID0gbGlzdF9lbnRyeShjdXJfdnRibC0+bm9kZS5wcmV2LCB6ZnRfdm9saW5mbywgbm9kZSk7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICIlZCAtICVkIiwgY3VyX3Z0YmwtPnN0YXJ0X3NlZywgY3VyX3Z0YmwtPmVuZF9zZWcpOworCX0KKwlpZiAoc2VnX3BvcyA+IGN1cl92dGJsLT5lbmRfc2VnIHx8IHNlZ19wb3MgPCBjdXJfdnRibC0+c3RhcnRfc2VnKSB7CisJCVRSQUNFKGZ0X3RfYnVnLCAiVGhpcyBjYW5ub3QgaGFwcGVuIik7CisJfQorCURVTVBfVk9MSU5GTyhmdF90X25vaXNlLCAiIiwgY3VyX3Z0YmwpOworCVRSQUNFX0VYSVQgY3VyX3Z0Ymw7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gcmVhbGx5IGFzc3VtZXMgdGhhdCB3ZSBhcmUganVzdCBiZWZvcmUgZW9mCisgKi8KK3ZvaWQgemZ0X21vdmVfcGFzdF9lb2YoemZ0X3Bvc2l0aW9uICpwb3MpCit7IAorCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9ub2lzZSwgIm9sZCBzZWcuIHBvczogJWQiLCBwb3MtPnNlZ19wb3MpOworCXBvcy0+dGFwZV9wb3MgKz0gemZ0X2dldF9zZWdfc3oocG9zLT5zZWdfcG9zKyspIC0gcG9zLT5zZWdfYnl0ZV9wb3M7CisJcG9zLT5zZWdfYnl0ZV9wb3MgPSAwOworCXBvcy0+dm9sdW1lX3BvcyAgID0gMDsKKwlpZiAoemZ0X2NtcHJfb3BzKSB7CisJCSgqemZ0X2NtcHJfb3BzLT5yZXNldCkoKTsKKwl9CisJemZ0X2p1c3RfYmVmb3JlX2VvZiA9ICAwOworCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsgLyogbm8gbmVlZCB0byBjYWNoZSBpdCBhbnltb3JlICovCisJVFJBQ0UoZnRfdF9ub2lzZSwgIm5ldyBzZWcuIHBvczogJWQiLCBwb3MtPnNlZ19wb3MpOworCVRSQUNFX0VYSVQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxZDE5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXZ0YmwuaApAQCAtMCwwICsxLDIyNyBAQAorI2lmbmRlZiBfWkZUQVBFX1ZUQkxfSAorI2RlZmluZSBfWkZUQVBFX1ZUQkxfSAorCisvKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NyAgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLXZ0YmwuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAxOTk3LzEwLzI4IDE0OjMwOjA5ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGEgdm9sdW1lIHRhYmxlIGFzIGRlZmluZWQgaW4gdGhlIFFJQy04MAorICogICAgICBkZXZlbG9wbWVudCBzdGFuZGFyZHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisKKyNkZWZpbmUgVlRCTF9TSVpFIDEyOCAvKiBieXRlcyAqLworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBvZmZzZXRzIGluIHRoZSB2dGJsLiAgKi8KKyNkZWZpbmUgVlRCTF9TSUcgICAwCisjZGVmaW5lIFZUQkxfU1RBUlQgNAorI2RlZmluZSBWVEJMX0VORCAgIDYKKyNkZWZpbmUgVlRCTF9ERVNDICA4CisjZGVmaW5lIFZUQkxfREFURSAgNTIKKyNkZWZpbmUgVlRCTF9GTEFHUyA1NgorI2RlZmluZSBWVEJMX0ZMX1ZFTkRPUl9TUEVDSUZJQyAoMTw8MCkKKyNkZWZpbmUgVlRCTF9GTF9NVVRMSV9DQVJUUklER0UgKDE8PDEpCisjZGVmaW5lIFZUQkxfRkxfTk9UX1ZFUklGSUVEICAgICgxPDwyKQorI2RlZmluZSBWVEJMX0ZMX1JFRElSX0lOSElCSVQgICAoMTw8MykKKyNkZWZpbmUgVlRCTF9GTF9TRUdfU1BBTk5JTkcgICAgKDE8PDQpCisjZGVmaW5lIFZUQkxfRkxfRElSRUNUT1JZX0xBU1QgICgxPDw1KQorI2RlZmluZSBWVEJMX0ZMX1JFU0VSVkVEXzYgICAgICAoMTw8NikKKyNkZWZpbmUgVlRCTF9GTF9SRVNFUlZFRF83ICAgICAgKDE8PDcpCisjZGVmaW5lIFZUQkxfTV9OTyAgNTcKKyNkZWZpbmUgVlRCTF9FWFQgICA1OAorI2RlZmluZSBFWFRfWkZUQVBFX1NJRyAgICAgMAorI2RlZmluZSBFWFRfWkZUQVBFX0JMS1NaICAxMAorI2RlZmluZSBFWFRfWkZUQVBFX0NNQVAgICAxMgorI2RlZmluZSBFWFRfWkZUQVBFX1FJQzExMyAxMworI2RlZmluZSBWVEJMX1BXRCAgIDg0CisjZGVmaW5lIFZUQkxfRElSX1NJWkUgOTIKKyNkZWZpbmUgVlRCTF9EQVRBX1NJWkUgOTYKKyNkZWZpbmUgVlRCTF9PU19WRVJTSU9OIDEwNAorI2RlZmluZSBWVEJMX1NSQ19EUklWRSAgMTA2CisjZGVmaW5lIFZUQkxfREVWICAgICAgICAxMjIKKyNkZWZpbmUgVlRCTF9SRVNFUlZFRF8xIDEyMworI2RlZmluZSBWVEJMX0NNUFIgICAgICAgMTI0CisjZGVmaW5lIFZUQkxfQ01QUl9VTlJFRyAweDNmCisjZGVmaW5lIFZUQkxfQ01QUl9VU0VEICAweDgwCisjZGVmaW5lIFZUQkxfRk1UICAgICAgICAxMjUKKyNkZWZpbmUgVlRCTF9SRVNFUlZFRF8yIDEyNgorI2RlZmluZSBWVEJMX1JFU0VSVkVEXzMgMTI3CisvKiBjb21wYXRpYmlsaXR5IHdpdGggcHJlIHJldmlzaW9uIEsgKi8KKyNkZWZpbmUgVlRCTF9LX0NNUFIgICAgIDEyMCAKKworLyogIHRoZSBuZXh0IGlzIHVzZWQgYnkgUUlDLTMwMjAgdGFwZXMgd2l0aCBmb3JtYXQgY29kZSA2ICg+Ml4xNgorICogIHNlZ21lbnRzKSBJdCBpcyBzcGVjaWZpZWQgaW4gUUlDLTExMywgUmV2LiBHLCBTZWN0aW9uIDUgKFNDU0kKKyAqICB2b2x1bWUgdGFibGUpLiBUaGUgZGlmZmVyZW5jZSBpcyBzaW1wbHksIHRoYXQgd2Ugb25seSBzdG9yZSB0aGUKKyAqICBudW1iZXIgb2Ygc2VnbWVudHMgdXNlZCwgbm90IHRoZSBzdGFydGluZyBzZWdtZW50LgorICovCisjZGVmaW5lIFZUQkxfU0NTSV9TRUdTICA0IC8qIGlzIGEgNCBieXRlIHZhbHVlICovCisKKy8qICBvbmUgdnRibCBpcyAxMjggYnl0ZXMsIHRoYXQgcmVzdWx0cyBpbiBhIG1heGltdW0gbnVtYmVyIG9mCisgKiAgMjkqMTAyNC8xMjggPSAyMzIgdm9sdW1lcy4KKyAqLworI2RlZmluZSBaRlRfTUFYX1ZPTFVNRVMgKEZUX1NFR01FTlRfU0laRS9WVEJMX1NJWkUpCisjZGVmaW5lIFZUQkxfSUQgICJWVEJMIgorI2RlZmluZSBWVEJMX0lEUyB7IFZUQkxfSUQsICJYVEJMIiwgIlVUSUQiLCAiRVhWVCIgfSAvKiBvdGhlciB2YWxpZCBpZHMgKi8KKyNkZWZpbmUgWkZUX1ZPTF9OQU1FICJ6ZnRhcGUgdm9sdW1lIiAvKiB2b2x1bWUgbGFiZWwgdXNlZCBieSBtZSAqLworI2RlZmluZSBaRlRBUEVfU0lHICJMSU5VWCBaRlQiCisKKy8qICBnbG9iYWwgdmFyaWFibGVzCisgKi8KK3R5cGVkZWYgc3RydWN0IHpmdF9pbnRlcm5hbF92dGJsCit7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCWludCAgICAgICAgICBjb3VudDsKKwl1bnNpZ25lZCBpbnQgc3RhcnRfc2VnOyAgICAgICAgIC8qIDMyIGJpdHMgYXJlIGVub3VnaCBmb3Igbm93ICovCisJdW5zaWduZWQgaW50IGVuZF9zZWc7ICAgICAgICAgICAvKiAzMiBiaXRzIGFyZSBlbm91Z2ggZm9yIG5vdyAqLworCV9fczY0ICAgICAgICBzaXplOyAgICAgICAgICAgICAgLyogdW5jb21wcmVzc2VkIHNpemUgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGJsa19zejsgICAgICAgICAgICAvKiBibG9jayBzaXplIGZvciB0aGlzIHZvbHVtZSAqLworCXVuc2lnbmVkIGludCB6ZnRfdm9sdW1lICAgICA6MTsgLyogemZ0YXBlIGNyZWF0ZWQgdGhpcyB2b2x1bWUgKi8KKwl1bnNpZ25lZCBpbnQgdXNlX2NvbXByZXNzaW9uOjE7IC8qIGNvbXByZXNzZWQgdm9sdW1lICAqLworCXVuc2lnbmVkIGludCBxaWMxMTMgICAgICAgICA6MTsgLyogbGF5b3V0IG9mIGNvbXByZXNzZWQgYmxvY2sKKwkJCQkJICogaW5mbyBhbmQgdnRibCBjb25mb3JtcyB0bworCQkJCQkgKiBRSUMtMTEzLCBSZXYuIEcgCisJCQkJCSAqLworCXVuc2lnbmVkIGludCBuZXdfdm9sdW1lICAgICA6MTsgLyogaXQgd2FzIGNyZWF0ZWQgYnkgdXMsIHRoaXMKKwkJCQkJICogcnVuLiAgdGhpcyBhbGxvd3MgdGhlCisJCQkJCSAqIGZpZWxkcyB0aGF0IGFyZW4ndCByZWFsbHkKKwkJCQkJICogdXNlZCBieSB6ZnRhcGUgdG8gYmUgZmlsbGVkCisJCQkJCSAqIGluIGJ5IHNvbWUgdXNlciBsZXZlbAorCQkJCQkgKiBwcm9ncmFtLgorCQkJCQkgKi8KKwl1bnNpZ25lZCBpbnQgb3BlbiAgICAgICAgICAgOjE7IC8qIGp1c3QgaW4gcHJvZ3Jlc3Mgb2YgYmVpbmcgCisJCQkJCSAqIHdyaXR0ZW4KKwkJCQkJICovCit9IHpmdF92b2xpbmZvOworCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCB6ZnRfdnRibDsKKyNkZWZpbmUgemZ0X2hlYWRfdnRibCAgbGlzdF9lbnRyeSh6ZnRfdnRibC5uZXh0LCB6ZnRfdm9saW5mbywgbm9kZSkKKyNkZWZpbmUgemZ0X2VvbV92dGJsICAgbGlzdF9lbnRyeSh6ZnRfdnRibC5wcmV2LCB6ZnRfdm9saW5mbywgbm9kZSkKKyNkZWZpbmUgemZ0X2xhc3RfdnRibCAgbGlzdF9lbnRyeSh6ZnRfZW9tX3Z0YmwtPm5vZGUucHJldiwgemZ0X3ZvbGluZm8sIG5vZGUpCisjZGVmaW5lIHpmdF9maXJzdF92dGJsIGxpc3RfZW50cnkoemZ0X2hlYWRfdnRibC0+bm9kZS5uZXh0LCB6ZnRfdm9saW5mbywgbm9kZSkKKyNkZWZpbmUgemZ0X3Z0YmxfZW1wdHkgKHpmdF9lb21fdnRibC0+bm9kZS5wcmV2ID09ICZ6ZnRfaGVhZF92dGJsLT5ub2RlKQorCisjZGVmaW5lIERVTVBfVk9MSU5GTyhsZXZlbCwgZGVzYywgaW5mbykJCQkJCVwKK3sJCQkJCQkJCQlcCisJY2hhciB0bXBbMjFdOwkJCQkJCQlcCisJc3RybGNweSh0bXAsIGRlc2MsIHNpemVvZih0bXApKTsJCQkJXAorCVRSQUNFKGxldmVsLCAiVm9sdW1lICVkOlxuIgkJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiZGVzY3JpcHRpb24gIDogJXNcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiZmlyc3Qgc2VnbWVudDogJWRcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAibGFzdCAgc2VnbWVudDogJWRcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAic2l6ZSAgICAgICAgIDogIiBMTF9YICJcbiIJCQlcCisJICAgICAgS0VSTl9JTkZPICJibG9jayBzaXplICAgOiAlZFxuIgkJCQlcCisJICAgICAgS0VSTl9JTkZPICJjb21wcmVzc2lvbiAgOiAlZFxuIgkJCQlcCisJICAgICAgS0VSTl9JTkZPICJ6ZnRhcGUgdm9sdW1lOiAlZFxuIgkJCQlcCisJICAgICAgS0VSTl9JTkZPICJRSUMtMTEzIGNvbmYuOiAlZCIsCQkJCVwKKwkgICAgICAoaW5mbyktPmNvdW50LCB0bXAsIChpbmZvKS0+c3RhcnRfc2VnLCAoaW5mbyktPmVuZF9zZWcsCVwKKwkgICAgICBMTCgoaW5mbyktPnNpemUpLCAoaW5mbyktPmJsa19zeiwJCQkJXAorCSAgICAgIChpbmZvKS0+dXNlX2NvbXByZXNzaW9uICE9IDAsIChpbmZvKS0+emZ0X3ZvbHVtZSAhPSAwLAlcCisJICAgICAgKGluZm8pLT5xaWMxMTMgIT0gMCk7CQkJCQlcCit9CisKK2V4dGVybiBpbnQgemZ0X3FpY19tb2RlOworZXh0ZXJuIGludCB6ZnRfb2xkX2Z0YXBlOworZXh0ZXJuIGludCB6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQ7CisKKy8qIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgIHpmdF9pbml0X3Z0YmwgICAgICAgICAgICAgKHZvaWQpOworZXh0ZXJuIHZvaWQgIHpmdF9mcmVlX3Z0YmwgICAgICAgICAgICAgKHZvaWQpOworZXh0ZXJuIGludCAgIHpmdF9leHRyYWN0X3ZvbHVtZV9oZWFkZXJzKF9fdTggKmJ1ZmZlcik7CitleHRlcm4gaW50ICAgemZ0X3VwZGF0ZV92b2x1bWVfdGFibGUgICAodW5zaWduZWQgaW50IHNlZ21lbnQpOworZXh0ZXJuIGludCAgIHpmdF9vcGVuX3ZvbHVtZSAgICAgICAgICAgKHpmdF9wb3NpdGlvbiAqcG9zLAorCQkJCQlpbnQgYmxrX3N6LCBpbnQgdXNlX2NvbXByZXNzaW9uKTsKK2V4dGVybiBpbnQgICB6ZnRfY2xvc2Vfdm9sdW1lICAgICAgICAgICh6ZnRfcG9zaXRpb24gKnBvcyk7CitleHRlcm4gY29uc3QgemZ0X3ZvbGluZm8gKnpmdF9maW5kX3ZvbHVtZSh1bnNpZ25lZCBpbnQgc2VnX3Bvcyk7CitleHRlcm4gaW50ICAgemZ0X3NraXBfdm9sdW1lcyAgICAgICAgICAoaW50IGNvdW50LCB6ZnRfcG9zaXRpb24gKnBvcyk7CitleHRlcm4gX19zNjQgemZ0X2dldF9lb21fcG9zICAgICAgICAgICAodm9pZCk7CitleHRlcm4gdm9pZCAgemZ0X3NraXBfdG9fZW9tICAgICAgICAgICAoemZ0X3Bvc2l0aW9uICpwb3MpOworZXh0ZXJuIGludCAgIHpmdF9mYWtlX3ZvbHVtZV9oZWFkZXJzICAgKGVvZl9tYXJrX3VuaW9uICplb2ZfbWFwLCAKKwkJCQkJaW50IG51bV9mYWlsZWRfc2VjdG9ycyk7CitleHRlcm4gaW50ICAgemZ0X3dlb2YgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50IGNvdW50LCB6ZnRfcG9zaXRpb24gKnBvcyk7CitleHRlcm4gdm9pZCAgemZ0X21vdmVfcGFzdF9lb2YgICAgICAgICAoemZ0X3Bvc2l0aW9uICpwb3MpOworCitzdGF0aWMgaW5saW5lIGludCAgIHpmdF90YXBlX2F0X2VvZCAgICAgICAgIChjb25zdCB6ZnRfcG9zaXRpb24gKnBvcyk7CitzdGF0aWMgaW5saW5lIGludCAgIHpmdF90YXBlX2F0X2xib3QgICAgICAgIChjb25zdCB6ZnRfcG9zaXRpb24gKnBvcyk7CitzdGF0aWMgaW5saW5lIHZvaWQgIHpmdF9wb3NpdGlvbl9iZWZvcmVfZW9mICh6ZnRfcG9zaXRpb24gKnBvcywgCisJCQkJCSAgICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSk7CitzdGF0aWMgaW5saW5lIF9fczY0IHpmdF9jaGVja19mb3JfZW9mKGNvbnN0IHpmdF92b2xpbmZvICp2dGJsLAorCQkJCSAgICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zKTsKKworLyogdGhpcyBmdW5jdGlvbiBkZWNyZW1lbnRzIHRoZSB6ZnRfc2VnX3BvcyBjb3VudGVyIGlmIHdlIGFyZSByaWdodAorICogYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNlZ21lbnQuIFRoaXMgaXMgdG8gaGFuZGxlIGZzZm0vYnNmbSAtLSB3ZQorICogbmVlZCB0byBwb3NpdGlvbiBiZWZvcmUgdGhlIGVvZiBtYXJrLiAgTk9URTogemZ0X3RhcGVfcG9zIGlzIG5vdAorICogY2hhbmdlZCAKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHpmdF9wb3NpdGlvbl9iZWZvcmVfZW9mKHpmdF9wb3NpdGlvbiAqcG9zLCAKKwkJCQkJICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKK3sgCisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAocG9zLT5zZWdfcG9zID09IHZvbHVtZS0+ZW5kX3NlZyArIDEgJiYgIHBvcy0+c2VnX2J5dGVfcG9zID09IDApIHsKKwkJcG9zLT5zZWdfcG9zIC0tOworCQlwb3MtPnNlZ19ieXRlX3BvcyA9IHpmdF9nZXRfc2VnX3N6KHBvcy0+c2VnX3Bvcyk7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qICBNbW1oLiBJcyB0aGUgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCB2b2x1bWUsIHRoYXQgaXMgcmlnaHQKKyAqICBiZWZvcmUgdGhlIGxhc3QgRU9GIG1hcmsgYWxzbyBsb2dpY2FsIGFuIEVPRCBjb25kaXRpb24/CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHpmdF90YXBlX2F0X2VvZChjb25zdCB6ZnRfcG9zaXRpb24gKnBvcykKK3sgCisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmICh6ZnRfcWljX21vZGUpIHsKKwkJVFJBQ0VfRVhJVCAocG9zLT5zZWdfcG9zID49IHpmdF9lb21fdnRibC0+c3RhcnRfc2VnIHx8CisJCQkgICAgemZ0X2xhc3RfdnRibC0+b3Blbik7CisJfSBlbHNlIHsKKwkJVFJBQ0VfRVhJVCBwb3MtPnNlZ19wb3MgPiBmdF9sYXN0X2RhdGFfc2VnbWVudDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHpmdF90YXBlX2F0X2xib3QoY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MpCit7CisJaWYgKHpmdF9xaWNfbW9kZSkgeworCQlyZXR1cm4gKHBvcy0+c2VnX3BvcyA8PSB6ZnRfZmlyc3RfdnRibC0+c3RhcnRfc2VnICYmCisJCQlwb3MtPnZvbHVtZV9wb3MgPT0gMCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIChwb3MtPnNlZ19wb3MgPD0gZnRfZmlyc3RfZGF0YV9zZWdtZW50ICYmIAorCQkJcG9zLT52b2x1bWVfcG9zID09IDApOworCX0KK30KKworLyogVGhpcyBvbmUgY2hlY2tzIGZvciBFT0YuICByZXR1cm4gcmVtYWluZyBzcGFjZSAobWF5IGJlIG5lZ2F0aXZlKSAKKyAqLworc3RhdGljIGlubGluZSBfX3M2NCB6ZnRfY2hlY2tfZm9yX2VvZihjb25zdCB6ZnRfdm9saW5mbyAqdnRibCwKKwkJCQkgICAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcykKK3sgICAgIAorCXJldHVybiAoX19zNjQpKHZ0YmwtPnNpemUgLSBwb3MtPnZvbHVtZV9wb3MpOworfQorCisjZW5kaWYgLyogX1pGVEFQRV9WVEJMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS13cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzI3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS13cml0ZS5jCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMgSGVpbmUKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS13cml0ZS5jLHYgJAorICogJFJldmlzaW9uOiAxLjMgJAorICogJERhdGU6IDE5OTcvMTEvMDYgMDA6NTA6MjkgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSB3cml0aW5nIGNvZGUKKyAqICAgICAgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworc3RhdGljIGludCBsYXN0X3dyaXRlX2ZhaWxlZDsKK3N0YXRpYyBpbnQgbmVlZF9mbHVzaDsKKwordm9pZCB6ZnRfcHJldmVudF9mbHVzaCh2b2lkKQoreworCW5lZWRfZmx1c2ggPSAwOworfQorCitzdGF0aWMgaW50IHpmdF93cml0ZV9oZWFkZXJfc2VnbWVudHMoX191OCogYnVmZmVyKQoreworCWludCBoZWFkZXJfMV9vayA9IDA7CisJaW50IGhlYWRlcl8yX29rID0gMDsKKwl1bnNpZ25lZCBpbnQgdGltZV9zdGFtcDsKKwlUUkFDRV9GVU4oZnRfdF9ub2lzZSk7CisJCisJVFJBQ0VfQ0FUQ0goZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCksKTsKKwlmdGFwZV9zZWVrX3RvX2JvdCgpOyAgICAvKiBwcmV2ZW50cyBleHRyYSByZXdpbmQgKi8KKwlpZiAoR0VUNChidWZmZXIsIDApICE9IEZUX0hTRUdfTUFHSUMpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgIndyb25nIGhlYWRlciBzaWduYXR1cmUgZm91bmQsIGFib3J0aW5nIik7CisJfSAKKwkvKiAgIEJlIG9wdGltaXN0aWM6ICovCisJUFVUNChidWZmZXIsIEZUX1NFR19DTlQsCisJICAgICB6ZnRfd3JpdHRlbl9zZWdtZW50cyArIEdFVDQoYnVmZmVyLCBGVF9TRUdfQ05UKSArIDIpOworCWlmICgodGltZV9zdGFtcCA9IHpmdF9nZXRfdGltZSgpKSAhPSAwKSB7CisJCVBVVDQoYnVmZmVyLCBGVF9XUl9EQVRFLCB0aW1lX3N0YW1wKTsKKwkJaWYgKHpmdF9sYWJlbF9jaGFuZ2VkKSB7CisJCQlQVVQ0KGJ1ZmZlciwgRlRfTEFCRUxfREFURSwgdGltZV9zdGFtcCk7CisJCX0KKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwKKwkgICAgICAid3JpdGluZyBmaXJzdCBoZWFkZXIgc2VnbWVudCAlZCIsIGZ0X2hlYWRlcl9zZWdtZW50XzEpOworCWhlYWRlcl8xX29rID0gemZ0X3ZlcmlmeV93cml0ZV9zZWdtZW50cyhmdF9oZWFkZXJfc2VnbWVudF8xLCAKKwkJCQkJCWJ1ZmZlciwgRlRfU0VHTUVOVF9TSVpFLAorCQkJCQkJemZ0X2RlYmxvY2tfYnVmKSA+PSAwOworCVRSQUNFKGZ0X3Rfbm9pc2UsCisJICAgICAgIndyaXRpbmcgc2Vjb25kIGhlYWRlciBzZWdtZW50ICVkIiwgZnRfaGVhZGVyX3NlZ21lbnRfMik7CisJaGVhZGVyXzJfb2sgPSB6ZnRfdmVyaWZ5X3dyaXRlX3NlZ21lbnRzKGZ0X2hlYWRlcl9zZWdtZW50XzIsIAorCQkJCQkJYnVmZmVyLCBGVF9TRUdNRU5UX1NJWkUsCisJCQkJCQl6ZnRfZGVibG9ja19idWYpID49IDA7CisJaWYgKCFoZWFkZXJfMV9vaykgeworCQlUUkFDRShmdF90X3dhcm4sICJXYXJuaW5nOiAiCisJCSAgICAgICJ1cGRhdGUgb2YgZmlyc3QgaGVhZGVyIHNlZ21lbnQgZmFpbGVkIik7CisJfQorCWlmICghaGVhZGVyXzJfb2spIHsKKwkJVFJBQ0UoZnRfdF93YXJuLCAiV2FybmluZzogIgorCQkgICAgICAidXBkYXRlIG9mIHNlY29uZCBoZWFkZXIgc2VnbWVudCBmYWlsZWQiKTsKKwl9CisJaWYgKCFoZWFkZXJfMV9vayAmJiAhaGVhZGVyXzJfb2spIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJFcnJvcjogIgorCQkgICAgICAidXBkYXRlIG9mIGJvdGggaGVhZGVyIHNlZ21lbnRzIGZhaWxlZC4iKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgemZ0X3VwZGF0ZV9oZWFkZXJfc2VnbWVudHModm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9ub2lzZSk7CisJCisJLyogIG11c3QgTk9UIHVzZSB6ZnRfd3JpdGVfcHJvdGVjdGVkLCBhcyBpdCBhbHNvIGluY2x1ZGVzIHRoZQorCSAqICBmaWxlIGFjY2VzcyBtb2RlLiBCdXQgd2UgYWxzbyB3YW50IHRvIHVwZGF0ZSB3aGVuIHNvZnQKKwkgKiAgd3JpdGUgcHJvdGVjdGlvbiBpcyBlbmFibGVkIChPX1JET05MWSkKKwkgKi8KKwlpZiAoZnRfd3JpdGVfcHJvdGVjdGVkIHx8IHpmdF9vbGRfZnRhcGUpIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9ub2lzZSwgIlRhcGUgc2V0IHJlYWQtb25seTogbm8gdXBkYXRlIik7CisJfSAKKwlpZiAoIXpmdF9oZWFkZXJfcmVhZCkgeworCQlUUkFDRV9BQk9SVCgwLCBmdF90X25vaXNlLCAiTm90aGluZyB0byB1cGRhdGUiKTsKKwl9CisJaWYgKCF6ZnRfaGVhZGVyX2NoYW5nZWQpIHsKKwkJemZ0X2hlYWRlcl9jaGFuZ2VkID0gemZ0X3dyaXR0ZW5fc2VnbWVudHMgPiAwOworCX0KKwlpZiAoIXpmdF9oZWFkZXJfY2hhbmdlZCAmJiAhemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkKSB7CisJCVRSQUNFX0FCT1JUKDAsIGZ0X3Rfbm9pc2UsICJOb3RoaW5nIHRvIHVwZGF0ZSIpOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAiVXBkYXRpbmcgaGVhZGVyIHNlZ21lbnRzIik7CisJaWYgKGZ0YXBlX2dldF9zdGF0dXMoKS0+ZnRpX3N0YXRlID09IHdyaXRpbmcpIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSgpLCk7CisJfQorCVRSQUNFX0NBVENIKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpLCk7CisJCisJemZ0X2RlYmxvY2tfc2VnbWVudCA9IC0xOyAvKiBpbnZhbGlkYXRlIHRoZSBjYWNoZSAqLworCWlmICh6ZnRfaGVhZGVyX2NoYW5nZWQpIHsKKwkJVFJBQ0VfQ0FUQ0goemZ0X3dyaXRlX2hlYWRlcl9zZWdtZW50cyh6ZnRfaHNlZ19idWYpLCk7CisJfQorCWlmICh6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQpIHsKKwkJVFJBQ0VfQ0FUQ0goemZ0X3VwZGF0ZV92b2x1bWVfdGFibGUoZnRfZmlyc3RfZGF0YV9zZWdtZW50KSwpOworCX0KKwl6ZnRfaGVhZGVyX2NoYW5nZWQgPQorCQl6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQgPSAKKwkJemZ0X2xhYmVsX2NoYW5nZWQgICAgICAgID0KKwkJemZ0X3dyaXR0ZW5fc2VnbWVudHMgICAgID0gMDsKKwlUUkFDRV9DQVRDSChmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSwpOworCWZ0YXBlX3NlZWtfdG9fYm90KCk7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IHJlYWRfbWVyZ2VfYnVmZmVyKGludCBzZWdfcG9zLCBfX3U4ICpidWZmZXIsIGludCBvZmZzZXQsIGludCBzZWdfc3opCit7CisJaW50IHJlc3VsdCA9IDA7CisJY29uc3QgZnRfdHJhY2VfdCBvbGRfdHJhY2luZyA9IFRSQUNFX0xFVkVMOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmICh6ZnRfcWljX21vZGUpIHsKKwkJLyogIHdyaXRpbmcgaW4gdGhlIG1pZGRsZSBvZiBhIHZvbHVtZSBpcyBOT1QgYWxsb3dlZAorCQkgKgorCQkgKi8KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIk5vIG5lZWQgdG8gcmVhZCBhIHNlZ21lbnQiKTsKKwkJbWVtc2V0KGJ1ZmZlciArIG9mZnNldCwgMCwgc2VnX3N6IC0gb2Zmc2V0KTsKKwkJVFJBQ0VfRVhJVCAwOworCX0KKwlUUkFDRShmdF90X2FueSwgIndhaXRpbmciKTsKKwlmdGFwZV9zdGFydF93cml0aW5nKEZUX1dSX01VTFRJKTsKKwlUUkFDRV9DQVRDSChmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCksKTsKKwkKKwlUUkFDRShmdF90X25vaXNlLCAidHJ5aW5nIHRvIHJlYWQgc2VnbWVudCAlZCBmcm9tIG9mZnNldCAlZCIsCisJICAgICAgc2VnX3Bvcywgb2Zmc2V0KTsKKwlTRVRfVFJBQ0VfTEVWRUwoZnRfdF9idWcpOworCXJlc3VsdCA9IHpmdF9mZXRjaF9zZWdtZW50X2ZyYWN0aW9uKHNlZ19wb3MsIGJ1ZmZlciwgCisJCQkJCSAgICBGVF9SRF9TSU5HTEUsCisJCQkJCSAgICBvZmZzZXQsIHNlZ19zeiAtIG9mZnNldCk7CisJU0VUX1RSQUNFX0xFVkVMKG9sZF90cmFjaW5nKTsKKwlpZiAocmVzdWx0ICE9IChzZWdfc3ogLSBvZmZzZXQpKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJJZ25vcmUgZXJyb3I6IHJlYWRfc2VnbWVudCgpIHJlc3VsdDogJWQiLAorCQkgICAgICByZXN1bHQpOworCQltZW1zZXQoYnVmZmVyICsgb2Zmc2V0LCAwLCBzZWdfc3ogLSBvZmZzZXQpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qIGZsdXNoIHRoZSB3cml0ZSBidWZmZXIgdG8gdGFwZSBhbmQgd3JpdGUgYW4gZW9mLW1hcmtlciBhdCB0aGUKKyAqIGN1cnJlbnQgcG9zaXRpb24gaWYgbm90IGluIHJhdyBtb2RlLiAgVGhpcyBmdW5jdGlvbiBhbHdheXMKKyAqIHBvc2l0aW9ucyB0aGUgdGFwZSBiZWZvcmUgdGhlIGVvZi1tYXJrZXIuICBfZnRhcGVfY2xvc2UoKSBzaG91bGQKKyAqIHRoZW4gYWR2YW5jZSB0byB0aGUgbmV4dCBzZWdtZW50LgorICoKKyAqIHRoZSBwYXJhbWV0ZXIgImZpbmlzaF92b2x1bWUiIGRlc2NyaWJlcyB3aGV0aGVyIHRvIHBvc2l0aW9uIGJlZm9yZQorICogb3IgYWZ0ZXIgdGhlIHBvc3NpYmx5IGNyZWF0ZWQgZmlsZS1tYXJrLiBXZSBhbHdheXMgcG9zaXRpb24gYWZ0ZXIKKyAqIHRoZSBmaWxlLW1hcmsgd2hlbiBjYWxsZWQgZnJvbSBmdGFwZV9jbG9zZSgpIGFuZCBhIGZsdXNoIHdhcyBuZWVkZWQKKyAqICh0aGF0IGlzIGZ0YXBlX3dyaXRlKCkgd2FzIHRoZSBsYXN0IHRhcGUgb3BlcmF0aW9uIGJlZm9yZSBjYWxsaW5nCisgKiBmdGFwZV9mbHVzaCkgQnV0IHdlIGFsd2F5cyBwb3NpdGlvbiBiZWZvcmUgdGhlIGZpbGUtbWFyayB3aGVuIHRoaXMKKyAqIGZ1bmN0aW9uIGdldCdzIGNhbGxlZCBmcm9tIG91dHNpZGUgZnRhcGVfY2xvc2UoKSAKKyAqLworaW50IHpmdF9mbHVzaF9idWZmZXJzKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlpbnQgZGF0YV9yZW1haW5pbmc7CisJaW50IHRoaXNfc2Vnc19zaXplOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csCisJICAgICAgImVudGVyZWQsIGZ0YXBlX3N0YXRlID0gJWQiLCBmdGFwZV9nZXRfc3RhdHVzKCktPmZ0aV9zdGF0ZSk7CisJaWYgKGZ0YXBlX2dldF9zdGF0dXMoKS0+ZnRpX3N0YXRlICE9IHdyaXRpbmcgJiYgIW5lZWRfZmx1c2gpIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9ub2lzZSwgIm5vIG5lZWQgZm9yIGZsdXNoIik7CisJfQorCXpmdF9pb19zdGF0ZSA9IHpmdF9pZGxlOyAvKiAgdHJpZ2dlcnMgc29tZSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZQorCQkJCSAgKiAgcmVhZCBhbmQgd3JpdGUgcm91dGluZXMgCisJCQkJICAqLworCWlmIChsYXN0X3dyaXRlX2ZhaWxlZCkgeworCQlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKKwkJVFJBQ0VfRVhJVCAtRUlPOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAiZmx1c2hpbmcgd3JpdGUgYnVmZmVycyIpOworCXRoaXNfc2Vnc19zaXplID0gemZ0X2dldF9zZWdfc3ooemZ0X3Bvcy5zZWdfcG9zKTsKKwlpZiAodGhpc19zZWdzX3NpemUgPT0gemZ0X3Bvcy5zZWdfYnl0ZV9wb3MpIHsKKwkJemZ0X3Bvcy5zZWdfcG9zICsrOworCQlkYXRhX3JlbWFpbmluZyA9IHpmdF9wb3Muc2VnX2J5dGVfcG9zID0gMDsKKwl9IGVsc2UgeworCQlkYXRhX3JlbWFpbmluZyA9IHpmdF9wb3Muc2VnX2J5dGVfcG9zOworCX0KKwkvKiBJZiB0aGVyZSBpcyBhbnkgZGF0YSBub3Qgd3JpdHRlbiB0byB0YXBlIHlldCwgYXBwZW5kIHplcm8ncworCSAqIHVwIHRvIHRoZSBlbmQgb2YgdGhlIHNlY3RvciAoaWYgdXNpbmcgY29tcHJlc3Npb24pIG9yIG1lcmdlCisJICogaXQgd2l0aCB0aGUgZGF0YSBleGlzdGluZyBvbiB0aGUgdGFwZSBUaGVuIHdyaXRlIHRoZQorCSAqIHNlZ21lbnQocykgdG8gdGFwZS4KKwkgKi8KKwlUUkFDRShmdF90X25vaXNlLCAiUG9zaXRpb246XG4iCisJICAgICAgS0VSTl9JTkZPICJzZWdfcG9zICA6ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICJieXRlIHBvcyA6ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICJyZW1haW5pbmc6ICVkIiwKKwkgICAgICB6ZnRfcG9zLnNlZ19wb3MsIHpmdF9wb3Muc2VnX2J5dGVfcG9zLCBkYXRhX3JlbWFpbmluZyk7CisJaWYgKGRhdGFfcmVtYWluaW5nID4gMCkgeworCQlkbyB7CisJCQl0aGlzX3NlZ3Nfc2l6ZSA9IHpmdF9nZXRfc2VnX3N6KHpmdF9wb3Muc2VnX3Bvcyk7CisJCQlpZiAodGhpc19zZWdzX3NpemUgPiBkYXRhX3JlbWFpbmluZykgeworCQkJCVRSQUNFX0NBVENIKHJlYWRfbWVyZ2VfYnVmZmVyKHpmdF9wb3Muc2VnX3BvcywKKwkJCQkJCQkgICAgICB6ZnRfZGVibG9ja19idWYsCisJCQkJCQkJICAgICAgZGF0YV9yZW1haW5pbmcsCisJCQkJCQkJICAgICAgdGhpc19zZWdzX3NpemUpLAorCQkJCQkgICAgbGFzdF93cml0ZV9mYWlsZWQgPSAxKTsKKwkJCX0KKwkJCXJlc3VsdCA9IGZ0YXBlX3dyaXRlX3NlZ21lbnQoemZ0X3Bvcy5zZWdfcG9zLCAKKwkJCQkJCSAgICAgemZ0X2RlYmxvY2tfYnVmLAorCQkJCQkJICAgICBGVF9XUl9NVUxUSSk7CisJCQlpZiAocmVzdWx0ICE9IHRoaXNfc2Vnc19zaXplKSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJmbHVzaCBidWZmZXJzIGZhaWxlZCIpOworCQkJCXpmdF9wb3MudGFwZV9wb3MgICAgLT0gemZ0X3Bvcy5zZWdfYnl0ZV9wb3M7CisJCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSAwOworCisJCQkJbGFzdF93cml0ZV9mYWlsZWQgPSAxOworCQkJCVRSQUNFX0VYSVQgcmVzdWx0OworCQkJfQorCQkJemZ0X3dyaXR0ZW5fc2VnbWVudHMgKys7CisJCQlUUkFDRShmdF90X2RhdGFfZmxvdywKKwkJCSAgICAgICJmbHVzaCwgbW92ZWQgb3V0IGJ1ZmZlcjogJWQiLCByZXN1bHQpOworCQkJLyogbmVlZCBuZXh0IHNlZ21lbnQgZm9yIG1vcmUgZGF0YSAoZW1wdHkgc2VnbWVudHM/KQorCQkJICovCisJCQlpZiAocmVzdWx0IDwgZGF0YV9yZW1haW5pbmcpIHsgCisJCQkJaWYgKHJlc3VsdCA+IDApIHsgICAgICAgCisJCQkJCS8qIG1vdmUgcmVtYWluZGVyIHRvIGJ1ZmZlciBiZWdpbm5pbmcgCisJCQkJCSAqLworCQkJCQltZW1tb3ZlKHpmdF9kZWJsb2NrX2J1ZiwgCisJCQkJCQl6ZnRfZGVibG9ja19idWYgKyByZXN1bHQsCisJCQkJCQlGVF9TRUdNRU5UX1NJWkUgLSByZXN1bHQpOworCQkJCX0KKwkJCX0gCisJCQlkYXRhX3JlbWFpbmluZyAtPSByZXN1bHQ7CisJCQl6ZnRfcG9zLnNlZ19wb3MgKys7CisJCX0gd2hpbGUgKGRhdGFfcmVtYWluaW5nID4gMCk7CisJCVRSQUNFKGZ0X3RfYW55LCAicmVzdWx0OiAlZCIsIHJlc3VsdCk7CisJCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtLXpmdF9wb3Muc2VnX3BvczsKKwkJaWYgKGRhdGFfcmVtYWluaW5nID09IDApIHsgIC8qIGZpcnN0IGJ5dGUgbmV4dCBzZWdtZW50ICovCisJCQl6ZnRfcG9zLnNlZ19ieXRlX3BvcyA9IHRoaXNfc2Vnc19zaXplOworCQl9IGVsc2UgeyAvKiBhZnRlciBkYXRhIHByZXZpb3VzIHNlZ21lbnQsIGRhdGFfcmVtYWluaW5nIDwgMCAqLworCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSBkYXRhX3JlbWFpbmluZyArIHJlc3VsdDsKKwkJfQorCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ6ZnRfZGVibG9ja19idWYgZW1wdHkiKTsKKwkJemZ0X3Bvcy5zZWdfcG9zIC0tOworCQl6ZnRfcG9zLnNlZ19ieXRlX3BvcyA9IHpmdF9nZXRfc2VnX3N6ICh6ZnRfcG9zLnNlZ19wb3MpOworCQlmdGFwZV9zdGFydF93cml0aW5nKEZUX1dSX01VTFRJKTsKKwl9CisJVFJBQ0UoZnRfdF9hbnksICJ3YWl0aW5nIik7CisJaWYgKChyZXN1bHQgPSBmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCkpIDwgMCkgeworCQkvKiB0aGF0J3MgcmVhbGx5IGJhZC4gV2hhdCB0byB0byB3aXRoIHpmdF90YXBlX3Bvcz8gCisJCSAqLworCQlUUkFDRShmdF90X2VyciwgImZsdXNoIGJ1ZmZlcnMgZmFpbGVkIik7CisJfQorCVRSQUNFKGZ0X3RfYW55LCAiemZ0X3NlZ19wb3M6ICVkLCB6ZnRfc2VnX2J5dGVfcG9zOiAlZCIsCisJICAgICAgemZ0X3Bvcy5zZWdfcG9zLCB6ZnRfcG9zLnNlZ19ieXRlX3Bvcyk7CisJbGFzdF93cml0ZV9mYWlsZWQgID0KKwkJbmVlZF9mbHVzaCA9IDA7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qIHJldHVybi12YWx1ZTogdGhlIG51bWJlciBvZiBieXRlcyByZW1vdmVkIGZyb20gdGhlIHVzZXItYnVmZmVyCisgKgorICogb3V0OiAKKyAqICAgICAgaW50ICp3cml0ZV9jbnQ6IGhvdyBtdWNoIGFjdHVhbGx5IGhhcyBiZWVuIG1vdmVkIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgemZ0X2RlYmxvY2tfYnVmCisgKiAgICAgIGludCByZXFfbGVuICA6IE1VU1QgTk9UIEJFIENIQU5HRUQsIGV4Y2VwdCBhdCBFT1QsIGluIAorICogICAgICAgICAgICAgICAgICAgICAgd2hpY2ggY2FzZSBpdCBtYXkgYmUgYWRqdXN0ZWQKKyAqIGluIDogCisgKiAgICAgIGNoYXIgKmJ1ZmYgICAgICAgIDogdGhlIHVzZXIgYnVmZmVyCisgKiAgICAgIGludCBidWZfcG9zX3dyaXRlIDogY29weSBvZiBidWZfbGVuX3dyIGludAorICogICAgICB0aGlzX3NlZ3Nfc2l6ZSAgICA6IHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBhY3R1YWwgc2VnbWVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIKKyAqICAgICAgKnpmdF9kZWJsb2NrX2J1ZiAgIDogemZ0X2RlYmxvY2tfYnVmCisgKi8KK3N0YXRpYyBpbnQgemZ0X3NpbXBsZV93cml0ZShpbnQgKmNudCwKKwkJCSAgICBfX3U4ICpkc3RfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAorCQkJICAgIGNvbnN0IF9fdTggX191c2VyICpzcmNfYnVmLCBjb25zdCBpbnQgcmVxX2xlbiwgCisJCQkgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKK3sKKwlpbnQgc3BhY2VfbGVmdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCS8qIHZvbHVtZS0+c2l6ZSBob2xkcyB0aGUgdGFwZSBjYXBhY2l0eSB3aGlsZSB2b2x1bWUgaXMgb3BlbiAqLworCWlmIChwb3MtPnRhcGVfcG9zICsgdm9sdW1lLT5ibGtfc3ogPiB2b2x1bWUtPnNpemUpIHsKKwkJVFJBQ0VfRVhJVCAtRU5PU1BDOworCX0KKwkvKiAgcmVtYWluaW5nIHNwYWNlIGluIHRoaXMgc2VnbWVudCwgTk9UIHpmdF9kZWJsb2NrX2J1ZgorCSAqLworCXNwYWNlX2xlZnQgPSBzZWdfc3ogLSBwb3MtPnNlZ19ieXRlX3BvczsKKwkqY250ID0gcmVxX2xlbiA8IHNwYWNlX2xlZnQgPyByZXFfbGVuIDogc3BhY2VfbGVmdDsKKwlpZiAoY29weV9mcm9tX3VzZXIoZHN0X2J1ZiArIHBvcy0+c2VnX2J5dGVfcG9zLCBzcmNfYnVmLCAqY250KSAhPSAwKSB7CisJCVRSQUNFX0VYSVQgLUVGQVVMVDsKKwl9CisJVFJBQ0VfRVhJVCAqY250OworfQorCitzdGF0aWMgaW50IGNoZWNrX3dyaXRlX2FjY2VzcyhpbnQgcmVxX2xlbiwKKwkJCSAgICAgIGNvbnN0IHpmdF92b2xpbmZvICoqdm9sdW1lLAorCQkJICAgICAgemZ0X3Bvc2l0aW9uICpwb3MsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgYmxrX3N6KQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoKHJlcV9sZW4gJSB6ZnRfYmxrX3N6KSAhPSAwKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywKKwkJCSAgICAid3JpdGUtY291bnQgJWQgbXVzdCBiZSBtdWx0aXBsZSBvZiBibG9jay1zaXplICVkIiwKKwkJCSAgICByZXFfbGVuLCBibGtfc3opOworCX0KKwlpZiAoemZ0X2lvX3N0YXRlID09IHpmdF93cml0aW5nKSB7CisJCS8qICBhbGwgb3RoZXIgZXJyb3IgY29uZGl0aW9ucyBoYXZlIGJlZW4gY2hlY2tlZCBlYXJsaWVyCisJCSAqLworCQlUUkFDRV9FWElUIDA7CisJfQorCXpmdF9pb19zdGF0ZSA9IHpmdF9pZGxlOworCVRSQUNFX0NBVENIKHpmdF9jaGVja193cml0ZV9hY2Nlc3MocG9zKSwpOworCS8qICBJZiB3ZSBoYXZlbid0IHJlYWQgdGhlIGhlYWRlciBzZWdtZW50IHlldCwgZG8gaXQgbm93LgorCSAqICBUaGlzIHdpbGwgdmVyaWZ5IHRoZSBjb25maWd1cmF0aW9uLCBnZXQgdGhlIGJhZCBzZWN0b3IKKwkgKiAgdGFibGUgYW5kIHJlYWQgdGhlIHZvbHVtZSB0YWJsZSBzZWdtZW50IAorCSAqLworCWlmICghemZ0X2hlYWRlcl9yZWFkKSB7CisJCVRSQUNFX0NBVENIKHpmdF9yZWFkX2hlYWRlcl9zZWdtZW50cygpLCk7CisJfQorCS8qICBmaW5lLiBOb3cgdGhlIHRhcGUgaXMgZWl0aGVyIGF0IEJPVCBvciBhdCBFT0QsCisJICogIFdyaXRlIHN0YXJ0IG9mIHZvbHVtZSBub3cKKwkgKi8KKwlUUkFDRV9DQVRDSCh6ZnRfb3Blbl92b2x1bWUocG9zLCBibGtfc3osIHpmdF91c2VfY29tcHJlc3Npb24pLCk7CisJKnZvbHVtZSA9IHpmdF9maW5kX3ZvbHVtZShwb3MtPnNlZ19wb3MpOworCURVTVBfVk9MSU5GTyhmdF90X25vaXNlLCAiIiwgKnZvbHVtZSk7CisJemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDA7CisJLyogbm93IG1lcmdlIHdpdGggb2xkIGRhdGEgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCF6ZnRfcWljX21vZGUgJiYgcG9zLT5zZWdfYnl0ZV9wb3MgIT0gMCl7CisJCXJlc3VsdCA9IHpmdF9mZXRjaF9zZWdtZW50KHBvcy0+c2VnX3BvcywKKwkJCQkJICAgemZ0X2RlYmxvY2tfYnVmLAorCQkJCQkgICBGVF9SRF9TSU5HTEUpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJaWYgKHJlc3VsdCA9PSAtRUlOVFIgfHwgcmVzdWx0ID09IC1FTk9TUEMpIHsKKwkJCQlUUkFDRV9FWElUIHJlc3VsdDsKKwkJCX0KKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsIAorCQkJICAgICAgImZ0YXBlX3JlYWRfc2VnbWVudCgpIHJlc3VsdDogJWQuICIKKwkJCSAgICAgICJUaGlzIG1pZ2h0IGJlIG5vcm1hbCB3aGVuIHVzaW5nICIKKwkJCSAgICAgICJhIG5ld2x5XG5mb3JtYXR0ZWQgdGFwZSIsIHJlc3VsdCk7CisJCQltZW1zZXQoemZ0X2RlYmxvY2tfYnVmLCAnXDAnLCBwb3MtPnNlZ19ieXRlX3Bvcyk7CisJCX0KKwl9CisJemZ0X2lvX3N0YXRlID0gemZ0X3dyaXRpbmc7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IGZpbGxfZGVibG9ja19idWYoX191OCAqZHN0X2J1ZiwgY29uc3QgaW50IHNlZ19zeiwKKwkJCSAgICB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSwKKwkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNyX2J1ZiwgY29uc3QgaW50IHJlcV9sZW4pCit7CisJaW50IGNudCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoc2VnX3N6ID09IDApIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9kYXRhX2Zsb3csICJlbXB0eSBzZWdtZW50Iik7CisJfQorCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiXG4iCisJICAgICAgS0VSTl9JTkZPICJyZW1haW5pbmcgcmVxX2xlbjogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gIiAgICAgICAgICBidWZfcG9zOiAlZCIsIAorCSAgICAgIHJlcV9sZW4sIHBvcy0+c2VnX2J5dGVfcG9zKTsKKwkvKiB6ZnRfZGVibG9ja19idWYgd2lsbCBub3QgY29udGFpbiBhIHZhbGlkIHNlZ21lbnQgYW55IGxvbmdlciAqLworCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsKKwlpZiAoemZ0X3VzZV9jb21wcmVzc2lvbikgeworCQlUUkFDRV9DQVRDSCh6ZnRfY21wcl9sb2NrKDEgLyogdHJ5IHRvIGxvYWQgKi8pLCk7CisJCVRSQUNFX0NBVENIKHJlc3VsdD0gKCp6ZnRfY21wcl9vcHMtPndyaXRlKSgmY250LAorCQkJCQkJCSAgIGRzdF9idWYsIHNlZ19zeiwKKwkJCQkJCQkgICB1c3JfYnVmLCByZXFfbGVuLAorCQkJCQkJCSAgIHBvcywgdm9sdW1lKSwpOworCX0gZWxzZSB7CisJCVRSQUNFX0NBVENIKHJlc3VsdD0gemZ0X3NpbXBsZV93cml0ZSgmY250LAorCQkJCQkJICAgICBkc3RfYnVmLCBzZWdfc3osCisJCQkJCQkgICAgIHVzcl9idWYsIHJlcV9sZW4sCisJCQkJCQkgICAgIHBvcywgdm9sdW1lKSwpOworCX0KKwlwb3MtPnZvbHVtZV9wb3MgICArPSByZXN1bHQ7CisJcG9zLT5zZWdfYnl0ZV9wb3MgKz0gY250OworCXBvcy0+dGFwZV9wb3MgICAgICs9IGNudDsKKwlUUkFDRShmdF90X2RhdGFfZmxvdywgIlxuIgorCSAgICAgIEtFUk5fSU5GTyAicmVtb3ZlZCBmcm9tIHVzZXItYnVmZmVyIDogJWQgYnl0ZXMuXG4iCisJICAgICAgS0VSTl9JTkZPICJjb3BpZWQgdG8gemZ0X2RlYmxvY2tfYnVmOiAlZCBieXRlcy5cbiIKKwkgICAgICBLRVJOX0lORk8gInpmdF90YXBlX3BvcyAgICAgICAgICAgICA6ICIgTExfWCAiIGJ5dGVzLiIsCisJICAgICAgcmVzdWx0LCBjbnQsIExMKHBvcy0+dGFwZV9wb3MpKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworCisvKiAgY2FsbGVkIGJ5IHRoZSBrZXJuZWwtaW50ZXJmYWNlIHJvdXRpbmUgInpmdF93cml0ZSgpIgorICovCitpbnQgX3pmdF93cml0ZShjb25zdCBjaGFyIF9fdXNlciAqYnVmZiwgaW50IHJlcV9sZW4pCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHdyaXR0ZW4gPSAwOworCWludCB3cml0ZV9jbnQ7CisJaW50IHNlZ19zejsKKwlzdGF0aWMgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSA9IE5VTEw7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJemZ0X3Jlc2lkICAgICAgICAgPSByZXFfbGVuOwkKKwlsYXN0X3dyaXRlX2ZhaWxlZCA9IDE7IC8qIHJlc2V0IHRvIDAgd2hlbiBzdWNjZXNzZnVsICovCisJLyogY2hlY2sgaWYgd3JpdGUgaXMgYWxsb3dlZCAKKwkgKi8KKwlUUkFDRV9DQVRDSChjaGVja193cml0ZV9hY2Nlc3MocmVxX2xlbiwgJnZvbHVtZSwmemZ0X3Bvcyx6ZnRfYmxrX3N6KSwpOworCXdoaWxlIChyZXFfbGVuID4gMCkgeworCQkvKiBBbGxvdyB1cyB0byBlc2NhcGUgZnJvbSB0aGlzIGxvb3Agd2l0aCBhIHNpZ25hbCAhCisJCSAqLworCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCXNlZ19zeiA9IHpmdF9nZXRfc2VnX3N6KHpmdF9wb3Muc2VnX3Bvcyk7CisJCWlmICgod3JpdGVfY250ID0gZmlsbF9kZWJsb2NrX2J1Zih6ZnRfZGVibG9ja19idWYsCisJCQkJCQkgIHNlZ19zeiwKKwkJCQkJCSAgJnpmdF9wb3MsCisJCQkJCQkgIHZvbHVtZSwKKwkJCQkJCSAgYnVmZiwKKwkJCQkJCSAgcmVxX2xlbikpIDwgMCkgeworCQkJemZ0X3Jlc2lkIC09IHdyaXR0ZW47CisJCQlpZiAod3JpdGVfY250ID09IC1FTk9TUEMpIHsKKwkJCQkvKiBsZWF2ZSB0aGUgcmVtYWluZGVyIHRvIGZsdXNoX2J1ZmZlcnMoKQorCQkJCSAqLworCQkJCVRSQUNFKGZ0X3RfaW5mbywgIk5vIHNwYWNlIGxlZnQgb24gZGV2aWNlIik7CisJCQkJbGFzdF93cml0ZV9mYWlsZWQgPSAwOworCQkJCWlmICghbmVlZF9mbHVzaCkgeworCQkJCQluZWVkX2ZsdXNoID0gd3JpdHRlbiA+IDA7CisJCQkJfQorCQkJCVRSQUNFX0VYSVQgd3JpdHRlbiA+IDAgPyB3cml0dGVuIDogLUVOT1NQQzsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0VfRVhJVCByZXN1bHQ7CisJCQl9CisJCX0KKwkJaWYgKHpmdF9wb3Muc2VnX2J5dGVfcG9zID09IHNlZ19zeikgeworCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfd3JpdGVfc2VnbWVudCh6ZnRfcG9zLnNlZ19wb3MsIAorCQkJCQkJCXpmdF9kZWJsb2NrX2J1ZiwKKwkJCQkJCQlGVF9XUl9BU1lOQyksCisJCQkJICAgIHpmdF9yZXNpZCAtPSB3cml0dGVuKTsKKwkJCXpmdF93cml0dGVuX3NlZ21lbnRzICsrOworCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSAgMDsKKwkJCXpmdF9kZWJsb2NrX3NlZ21lbnQgID0gemZ0X3Bvcy5zZWdfcG9zOworCQkJKyt6ZnRfcG9zLnNlZ19wb3M7CisJCX0KKwkJd3JpdHRlbiArPSB3cml0ZV9jbnQ7CisJCWJ1ZmYgICAgKz0gd3JpdGVfY250OworCQlyZXFfbGVuIC09IHdyaXRlX2NudDsKKwl9IC8qIHdoaWxlIChyZXFfbGVuID4gMCkgKi8KKwlUUkFDRShmdF90X2RhdGFfZmxvdywgInJlbWFpbmluZyBpbiBibG9ja2luZyBidWZmZXI6ICVkIiwKKwkgICAgICAgemZ0X3Bvcy5zZWdfYnl0ZV9wb3MpOworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAianVzdCB3cml0dGVuIGJ5dGVzOiAlZCIsIHdyaXR0ZW4pOworCWxhc3Rfd3JpdGVfZmFpbGVkID0gMDsKKwl6ZnRfcmVzaWQgLT0gd3JpdHRlbjsKKwluZWVkX2ZsdXNoID0gbmVlZF9mbHVzaCB8fCB3cml0dGVuID4gMDsKKwlUUkFDRV9FWElUIHdyaXR0ZW47ICAgICAgICAgICAgICAgLyogYnl0ZXMgd3JpdHRlbiAqLworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4ODcwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBfWkZUQVBFX1dSSVRFX0gKKyNkZWZpbmUgX1pGVEFQRV9XUklURV9ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjEzICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSB3cml0ZSBmdW5jdGlvbnMKKyAqICAgICAgZm9yIHRoZSB6ZnRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKi8KKworZXh0ZXJuIGludCAgemZ0X2ZsdXNoX2J1ZmZlcnModm9pZCk7CitleHRlcm4gaW50ICB6ZnRfdXBkYXRlX2hlYWRlcl9zZWdtZW50cyh2b2lkKTsKK2V4dGVybiB2b2lkIHpmdF9wcmV2ZW50X2ZsdXNoKHZvaWQpOworCisvKiAgaG9vayBmb3IgdGhlIFZGUyBpbnRlcmZhY2UgCisgKi8KK2V4dGVybiBpbnQgX3pmdF93cml0ZShjb25zdCBjaGFyIF9fdXNlciAqYnVmZiwgaW50IHJlcV9sZW4pOworI2VuZGlmIC8qIF9aRlRBUEVfV1JJVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGVfc3ltcy5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGVfc3ltcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjE0MDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZV9zeW1zLmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlX3N5bXMuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjE0ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3ltYm9scyB0aGF0IHRoZSB6ZnRhcGUgZnJvbnRlbmQgdG8gCisgKiAgICAgIHRoZSBmdGFwZSBmbG9wcHkgdGFwZSBkcml2ZXIgZXhwb3J0cyAKKyAqLwkJIAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCisKKy8qIHpmdGFwZS1pbml0LmMgKi8KK0VYUE9SVF9TWU1CT0woemZ0X2NtcHJfcmVnaXN0ZXIpOworLyogemZ0YXBlLXJlYWQuYyAqLworRVhQT1JUX1NZTUJPTCh6ZnRfZmV0Y2hfc2VnbWVudF9mcmFjdGlvbik7CisvKiB6ZnRhcGUtYnVmZmVycy5jICovCitFWFBPUlRfU1lNQk9MKHpmdF92bWFsbG9jX29uY2UpOworRVhQT1JUX1NZTUJPTCh6ZnRfdm1hbGxvY19hbHdheXMpOworRVhQT1JUX1NZTUJPTCh6ZnRfdmZyZWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2dlbmVyaWNfbnZyYW0uYyBiL2RyaXZlcnMvY2hhci9nZW5lcmljX252cmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1ZTAxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9nZW5lcmljX252cmFtLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBHZW5lcmljIC9kZXYvbnZyYW0gZHJpdmVyIGZvciBhcmNoaXRlY3R1cmVzIHByb3ZpZGluZyBzb21lCisgKiAiZ2VuZXJpYyIgaG9va3MsIHRoYXQgaXMgOgorICoKKyAqIG52cmFtX3JlYWRfYnl0ZSwgbnZyYW1fd3JpdGVfYnl0ZSwgbnZyYW1fc3luYworICoKKyAqIE5vdGUgdGhhdCBhbiBhZGRpdGlvbmFsIGhvb2sgaXMgc3VwcG9ydGVkIGZvciBQb3dlck1hYyBvbmx5CisgKiBmb3IgZ2V0dGluZyB0aGUgbnZyYW0gInBhcnRpdGlvbiIgaW5mb3JtYXRpb25zCisgKgorICovCisKKyNkZWZpbmUgTlZSQU1fVkVSU0lPTiAiMS4xIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9udnJhbS5oPgorCisjZGVmaW5lIE5WUkFNX1NJWkUJODE5MgorCitzdGF0aWMgbG9mZl90IG52cmFtX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlsb2NrX2tlcm5lbCgpOworCXN3aXRjaCAob3JpZ2luKSB7CisJY2FzZSAxOgorCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJb2Zmc2V0ICs9IE5WUkFNX1NJWkU7CisJCWJyZWFrOworCX0KKwlpZiAob2Zmc2V0IDwgMCkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGZpbGUtPmZfcG9zOworfQorCitzdGF0aWMgc3NpemVfdCByZWFkX252cmFtKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyIF9fdXNlciAqcCA9IGJ1ZjsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICgqcHBvcyA+PSBOVlJBTV9TSVpFKQorCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAqcHBvczsgY291bnQgPiAwICYmIGkgPCBOVlJBTV9TSVpFOyArK2ksICsrcCwgLS1jb3VudCkKKwkJaWYgKF9fcHV0X3VzZXIobnZyYW1fcmVhZF9ieXRlKGkpLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCSpwcG9zID0gaTsKKwlyZXR1cm4gcCAtIGJ1ZjsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfbnZyYW0oc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyIF9fdXNlciAqcCA9IGJ1ZjsKKwljaGFyIGM7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICgqcHBvcyA+PSBOVlJBTV9TSVpFKQorCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAqcHBvczsgY291bnQgPiAwICYmIGkgPCBOVlJBTV9TSVpFOyArK2ksICsrcCwgLS1jb3VudCkgeworCQlpZiAoX19nZXRfdXNlcihjLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQludnJhbV93cml0ZV9ieXRlKGMsIGkpOworCX0KKwkqcHBvcyA9IGk7CisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgbnZyYW1faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoKGNtZCkgeworI2lmZGVmIENPTkZJR19QUENfUE1BQworCWNhc2UgT0JTT0xFVEVfUE1BQ19OVlJBTV9HRVRfT0ZGU0VUOgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJudnJhbTogVXNpbmcgb2Jzb2xldGUgUE1BQ19OVlJBTV9HRVRfT0ZGU0VUIGlvY3RsXG4iKTsKKwljYXNlIElPQ19OVlJBTV9HRVRfT0ZGU0VUOiB7CisJCWludCBwYXJ0LCBvZmZzZXQ7CisKKwkJaWYgKF9tYWNoaW5lICE9IF9NQUNIX1BtYWMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJ0LCAodm9pZCBfX3VzZXIqKWFyZywgc2l6ZW9mKHBhcnQpKSAhPSAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChwYXJ0IDwgcG1hY19udnJhbV9PRiB8fCBwYXJ0ID4gcG1hY19udnJhbV9OUikKKwkJCXJldHVybiAtRUlOVkFMOworCQlvZmZzZXQgPSBwbWFjX2dldF9wYXJ0aXRpb24ocGFydCk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyKilhcmcsICZvZmZzZXQsIHNpemVvZihvZmZzZXQpKSAhPSAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KKwljYXNlIElPQ19OVlJBTV9TWU5DOgorCQludnJhbV9zeW5jKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG52cmFtX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbnZyYW1fbGxzZWVrLAorCS5yZWFkCQk9IHJlYWRfbnZyYW0sCisJLndyaXRlCQk9IHdyaXRlX252cmFtLAorCS5pb2N0bAkJPSBudnJhbV9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBudnJhbV9kZXYgPSB7CisJTlZSQU1fTUlOT1IsCisJIm52cmFtIiwKKwkmbnZyYW1fZm9wcworfTsKKworaW50IF9faW5pdCBudnJhbV9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWFjaW50b3NoIG5vbi12b2xhdGlsZSBtZW1vcnkgZHJpdmVyIHYlc1xuIiwKKwkJTlZSQU1fVkVSU0lPTik7CisJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJm52cmFtX2Rldik7Cit9CisKK3ZvaWQgX19leGl0IG52cmFtX2NsZWFudXAodm9pZCkKK3sKKyAgICAgICAgbWlzY19kZXJlZ2lzdGVyKCAmbnZyYW1fZGV2ICk7Cit9CisKK21vZHVsZV9pbml0KG52cmFtX2luaXQpOworbW9kdWxlX2V4aXQobnZyYW1fY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYyBiL2RyaXZlcnMvY2hhci9nZW5lcmljX3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNGE3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYwpAQCAtMCwwICsxLDEwMDEgQEAKKy8qCisgKiAgZ2VuZXJpY19zZXJpYWwuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgvMTk5OSBSLkUuV29sZmZAQml0V2l6YXJkLm5sCisgKgorICogIHdyaXR0ZW4gZm9yIHRoZSBTWCBzZXJpYWwgZHJpdmVyLgorICogICAgIENvbnRhaW5zIHRoZSBjb2RlIHRoYXQgc2hvdWxkIGJlIHNoYXJlZCBvdmVyIGFsbCB0aGUgc2VyaWFsIGRyaXZlcnMuCisgKgorICogIENyZWRpdCBmb3IgdGhlIGlkZWEgdG8gZG8gaXQgdGhpcyB3YXkgbWlnaHQgZ28gdG8gQWxhbiBDb3guIAorICoKKyAqCisgKiAgVmVyc2lvbiAwLjEgLS0gRGVjZW1iZXIsIDE5OTguIEluaXRpYWwgdmVyc2lvbi4KKyAqICBWZXJzaW9uIDAuMiAtLSBNYXJjaCwgMTk5OS4gICAgU29tZSBtb3JlIHJvdXRpbmVzLiBCdWdmaXhlcy4gRXRjLgorICogIFZlcnNpb24gMC41IC0tIEF1Z3VzdCwgMTk5OS4gICBTb21lIG1vcmUgZml4ZXMuIFJlZm9ybWF0IGZvciBMaW51cy4KKyAqCisgKiAgQml0V2l6YXJkIGlzIGFjdGl2ZWx5IG1haW50YWluaW5nIHRoaXMgZmlsZS4gV2Ugc29tZXRpbWVzIGZpbmQKKyAqICB0aGF0IHNvbWVvbmUgc3VibWl0dGVkIGNoYW5nZXMgdG8gdGhpcyBmaWxlLiBXZSByZWFsbHkgYXBwcmVjaWF0ZQorICogIHlvdXIgaGVscCwgYnV0IHBsZWFzZSBzdWJtaXQgY2hhbmdlcyB0aHJvdWdoIHVzLiBXZSdyZSBkb2luZyBvdXIKKyAqICBiZXN0IHRvIGJlIHJlc3BvbnNpdmUuICAtLSBSRVcKKyAqICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIERFQlVHIAorCitzdGF0aWMgY2hhciAqICAgICAgICAgICAgICAgICAgdG1wX2J1ZjsgCitzdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CisKK3N0YXRpYyBpbnQgZ3NfZGVidWc7CisKKyNpZmRlZiBERUJVRworI2RlZmluZSBnc19kcHJpbnRrKGYsIHN0ci4uLikgaWYgKGdzX2RlYnVnICYgZikgcHJpbnRrIChzdHIpCisjZWxzZQorI2RlZmluZSBnc19kcHJpbnRrKGYsIHN0ci4uLikgLyogbm90aGluZyAqLworI2VuZGlmCisKKyNkZWZpbmUgZnVuY19lbnRlcigpIGdzX2RwcmludGsgKEdTX0RFQlVHX0ZMT1csICJnczogZW50ZXIgJXNcbiIsIF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgZnVuY19leGl0KCkgIGdzX2RwcmludGsgKEdTX0RFQlVHX0ZMT1csICJnczogZXhpdCAgJXNcbiIsIF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgTkVXX1dSSVRFX0xPQ0tJTkcgMQorI2lmIE5FV19XUklURV9MT0NLSU5HCisjZGVmaW5lIERFQ0wgICAgICAvKiBOb3RoaW5nICovCisjZGVmaW5lIExPQ0tJVCAgICBkb3duICgmIHBvcnQtPnBvcnRfd3JpdGVfc2VtKTsKKyNkZWZpbmUgUkVMRUFTRUlUIHVwICgmcG9ydC0+cG9ydF93cml0ZV9zZW0pOworI2Vsc2UKKyNkZWZpbmUgREVDTCAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjZGVmaW5lIExPQ0tJVCAgICBzYXZlX2ZsYWdzIChmbGFncyk7Y2xpICgpCisjZGVmaW5lIFJFTEVBU0VJVCByZXN0b3JlX2ZsYWdzIChmbGFncykKKyNlbmRpZgorCisjZGVmaW5lIFJTX0VWRU5UX1dSSVRFX1dBS0VVUAkxCisKK21vZHVsZV9wYXJhbShnc19kZWJ1ZywgaW50LCAwNjQ0KTsKKworCit2b2lkIGdzX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0OworCURFQ0wKKworCWZ1bmNfZW50ZXIgKCk7IAorCisJaWYgKCF0dHkpIHJldHVybjsKKworCXBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKCFwb3J0KSByZXR1cm47CisKKwlpZiAoISAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHJldHVybjsKKworCS8qIFRha2UgYSBsb2NrIG9uIHRoZSBzZXJpYWwgdHJhbm1pdCBidWZmZXIhICovCisJTE9DS0lUOworCisJaWYgKHBvcnQtPnhtaXRfY250ID49IFNFUklBTF9YTUlUX1NJWkUgLSAxKSB7CisJCS8qIFNvcnJ5LCBidWZmZXIgaXMgZnVsbCwgZHJvcCBjaGFyYWN0ZXIuIFVwZGF0ZSBzdGF0aXN0aWNzPz8/PyAtLSBSRVcgKi8KKwkJUkVMRUFTRUlUOworCQlyZXR1cm47CisJfQorCisJcG9ydC0+eG1pdF9idWZbcG9ydC0+eG1pdF9oZWFkKytdID0gY2g7CisJcG9ydC0+eG1pdF9oZWFkICY9IFNFUklBTF9YTUlUX1NJWkUgLSAxOworCXBvcnQtPnhtaXRfY250Kys7ICAvKiBDaGFyYWN0ZXJzIGluIGJ1ZmZlciAqLworCisJUkVMRUFTRUlUOworCWZ1bmNfZXhpdCAoKTsKK30KKworCisjaWZkZWYgTkVXX1dSSVRFX0xPQ0tJTkcKKworLyoKKz4gUHJvYmxlbXMgdG8gdGFrZSBpbnRvIGFjY291bnQgYXJlOgorPiAgICAgICAtMS0gSW50ZXJydXB0cyB0aGF0IGVtcHR5IHBhcnQgb2YgdGhlIGJ1ZmZlci4KKz4gICAgICAgLTItIHBhZ2UgZmF1bHRzIG9uIHRoZSBhY2Nlc3MgdG8gdXNlcnNwYWNlLiAKKz4gICAgICAgLTMtIE90aGVyIHByb2Nlc3NlcyB0aGF0IGFyZSBhbHNvIHRyeWluZyB0byBkbyBhICJ3cml0ZSIuIAorKi8KKworaW50IGdzX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCAKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IGdzX3BvcnQgKnBvcnQ7CisJaW50IGMsIHRvdGFsID0gMDsKKwlpbnQgdDsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlpZiAoIXR0eSkgcmV0dXJuIDA7CisKKwlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghcG9ydCkgcmV0dXJuIDA7CisKKwlpZiAoISAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCXJldHVybiAwOworCisJLyogZ2V0IGV4Y2x1c2l2ZSAid3JpdGUiIGFjY2VzcyB0byB0aGlzIHBvcnQgKHByb2JsZW0gMykgKi8KKwkvKiBUaGlzIGlzIG5vdCBhIHNwaW5sb2NrIGJlY2F1c2Ugd2UgY2FuIGhhdmUgYSBkaXNrIGFjY2VzcyAocGFnZSAKKwkJIGZhdWx0KSBpbiBjb3B5X2Zyb21fdXNlciAqLworCWRvd24gKCYgcG9ydC0+cG9ydF93cml0ZV9zZW0pOworCisJd2hpbGUgKDEpIHsKKworCQljID0gY291bnQ7CisgCisJCS8qIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlICJPV04iIHRoZSAiaGVhZCIuIE5vb25lIGVsc2UgY2FuIAorCQkgICBjaGFuZ2UgdGhlICJoZWFkIjogd2Ugb3duIHRoZSBwb3J0X3dyaXRlX3NlbS4gKi8KKwkJLyogRG9uJ3Qgb3ZlcnJ1biB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKwkJdCA9IFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2hlYWQ7CisJCWlmICh0IDwgYykgYyA9IHQ7CisgCisJCS8qIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHRoZSB4bWl0X2NudCBjYW4gb25seSBkZWNyZWFzZS4gVGhpcyAKKwkJICAgd291bGQgaW5jcmVhc2UgInQiLCBzbyB3ZSBtaWdodCBjb3B5IHRvbyBsaXR0bGUgY2hhcnMuICovCisJCS8qIERvbid0IGNvcHkgcGFzdCB0aGUgImhlYWQiIG9mIHRoZSBidWZmZXIgKi8KKwkJdCA9IFNFUklBTF9YTUlUX1NJWkUgLSAxIC0gcG9ydC0+eG1pdF9jbnQ7CisJCWlmICh0IDwgYykgYyA9IHQ7CisgCisJCS8qIENhbid0IGNvcHkgbW9yZT8gYnJlYWsgb3V0ISAqLworCQlpZiAoYyA8PSAwKSBicmVhazsKKworCQltZW1jcHkgKHBvcnQtPnhtaXRfYnVmICsgcG9ydC0+eG1pdF9oZWFkLCBidWYsIGMpOworCisJCXBvcnQgLT4geG1pdF9jbnQgKz0gYzsKKwkJcG9ydCAtPiB4bWl0X2hlYWQgPSAocG9ydC0+eG1pdF9oZWFkICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRSAtMSk7CisJCWJ1ZiArPSBjOworCQljb3VudCAtPSBjOworCQl0b3RhbCArPSBjOworCX0KKwl1cCAoJiBwb3J0LT5wb3J0X3dyaXRlX3NlbSk7CisKKwlnc19kcHJpbnRrIChHU19ERUJVR19XUklURSwgIndyaXRlOiBpbnRlcnJ1cHRzIGFyZSAlc1xuIiwgCisJICAgICAgICAgICAgKHBvcnQtPmZsYWdzICYgR1NfVFhfSU5URU4pPyJlbmFibGVkIjogImRpc2FibGVkIik7IAorCisJaWYgKHBvcnQtPnhtaXRfY250ICYmIAorCSAgICAhdHR5LT5zdG9wcGVkICYmIAorCSAgICAhdHR5LT5od19zdG9wcGVkICYmCisJICAgICEocG9ydC0+ZmxhZ3MgJiBHU19UWF9JTlRFTikpIHsKKwkJcG9ydC0+ZmxhZ3MgfD0gR1NfVFhfSU5URU47CisJCXBvcnQtPnJkLT5lbmFibGVfdHhfaW50ZXJydXB0cyAocG9ydCk7CisJfQorCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gdG90YWw7Cit9CisjZWxzZQorLyoKKz4gUHJvYmxlbXMgdG8gdGFrZSBpbnRvIGFjY291bnQgYXJlOgorPiAgICAgICAtMS0gSW50ZXJydXB0cyB0aGF0IGVtcHR5IHBhcnQgb2YgdGhlIGJ1ZmZlci4KKz4gICAgICAgLTItIHBhZ2UgZmF1bHRzIG9uIHRoZSBhY2Nlc3MgdG8gdXNlcnNwYWNlLiAKKz4gICAgICAgLTMtIE90aGVyIHByb2Nlc3NlcyB0aGF0IGFyZSBhbHNvIHRyeWluZyB0byBkbyBhICJ3cml0ZSIuIAorKi8KKworaW50IGdzX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKKwlpbnQgYywgdG90YWwgPSAwOworCWludCB0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyICgpOworCisJLyogVGhlIHN0YW5kYXJkIHNlcmlhbCBkcml2ZXIgcmV0dXJucyAwIGluIHRoaXMgY2FzZS4gCisJICAgVGhhdCBzb3VuZHMgdG8gbWUgYXMgIk5vIGVycm9yLCBJIGp1c3QgZGlkbid0IGdldCB0byB3cml0aW5nIGFueQorCSAgIGJ5dGVzLiBGZWVsIGZyZWUgdG8gdHJ5IGFnYWluLiIgCisJICAgVGhlICJvZmZpY2lhbCIgd2F5IHRvIHdyaXRlIG4gYnl0ZXMgZnJvbSBidWYgaXM6CisKKwkJIGZvciAobndyaXR0ZW4gPSAwO253cml0dGVuIDwgbjtud3JpdHRlbiArPSBydikgeworCQkJIHJ2ID0gd3JpdGUgKGZkLCBidWYrbndyaXR0ZW4sIG4tbndyaXR0ZW4pOworCQkJIGlmIChydiA8IDApIGJyZWFrOyAvLyBFcnJvcjogYmFpbCBvdXQuIC8vCisJCSB9IAorCisJICAgd2hpY2ggd2lsbCBsb29wIGVuZGxlc3NseSBpbiB0aGlzIGNhc2UuIFRoZSBtYW51YWwgcGFnZSBmb3Igd3JpdGUKKwkgICBhZ3JlZXMgd2l0aCBtZS4gSW4gcHJhY3Rpc2UgYWxtb3N0IGV2ZXJ5Ym9keSB3cml0ZXMgCisJICAgIndyaXRlIChmZCwgYnVmLG4pOyIgYnV0IHNvbWUgcGVvcGxlIG1pZ2h0IGhhdmUgaGFkIHRvIGRlYWwgd2l0aCAKKwkgICBpbmNvbXBsZXRlIHdyaXRlcyBpbiB0aGUgcGFzdCBhbmQgY29ycmVjdGx5IGltcGxlbWVudGVkIGl0IGJ5IG5vdy4uLiAKKwkgKi8KKworCWlmICghdHR5KSByZXR1cm4gLUVJTzsKKworCXBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghcG9ydCB8fCAhcG9ydC0+eG1pdF9idWYgfHwgIXRtcF9idWYpCisJCXJldHVybiAtRUlPOworCisJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisJd2hpbGUgKDEpIHsKKwkJY2xpKCk7CisJCWMgPSBjb3VudDsKKworCQkvKiBUaGlzIGlzIHNhZmUgYmVjYXVzZSB3ZSAiT1dOIiB0aGUgImhlYWQiLiBOb29uZSBlbHNlIGNhbiAKKwkJICAgY2hhbmdlIHRoZSAiaGVhZCI6IHdlIG93biB0aGUgcG9ydF93cml0ZV9zZW0uICovCisJCS8qIERvbid0IG92ZXJydW4gdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisJCXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9oZWFkOworCQlpZiAodCA8IGMpIGMgPSB0OworCisJCS8qIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHRoZSB4bWl0X2NudCBjYW4gb25seSBkZWNyZWFzZS4gVGhpcyAKKwkJICAgd291bGQgaW5jcmVhc2UgInQiLCBzbyB3ZSBtaWdodCBjb3B5IHRvbyBsaXR0bGUgY2hhcnMuICovCisJCS8qIERvbid0IGNvcHkgcGFzdCB0aGUgImhlYWQiIG9mIHRoZSBidWZmZXIgKi8KKwkJdCA9IFNFUklBTF9YTUlUX1NJWkUgLSAxIC0gcG9ydC0+eG1pdF9jbnQ7CisJCWlmICh0IDwgYykgYyA9IHQ7CisKKwkJLyogQ2FuJ3QgY29weSBtb3JlPyBicmVhayBvdXQhICovCisJCWlmIChjIDw9IDApIHsKKwkJCWxvY2FsX3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJYnJlYWs7CisJCX0KKwkJbWVtY3B5KHBvcnQtPnhtaXRfYnVmICsgcG9ydC0+eG1pdF9oZWFkLCBidWYsIGMpOworCQlwb3J0LT54bWl0X2hlYWQgPSAoKHBvcnQtPnhtaXRfaGVhZCArIGMpICYKKwkJICAgICAgICAgICAgICAgICAgIChTRVJJQUxfWE1JVF9TSVpFLTEpKTsKKwkJcG9ydC0+eG1pdF9jbnQgKz0gYzsKKwkJbG9jYWxfcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCWJ1ZiArPSBjOworCQljb3VudCAtPSBjOworCQl0b3RhbCArPSBjOworCX0KKworCWlmIChwb3J0LT54bWl0X2NudCAmJiAKKwkgICAgIXR0eS0+c3RvcHBlZCAmJiAKKwkgICAgIXR0eS0+aHdfc3RvcHBlZCAmJgorCSAgICAhKHBvcnQtPmZsYWdzICYgR1NfVFhfSU5URU4pKSB7CisJCXBvcnQtPmZsYWdzIHw9IEdTX1RYX0lOVEVOOworCQlwb3J0LT5yZC0+ZW5hYmxlX3R4X2ludGVycnVwdHMgKHBvcnQpOworCX0KKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIHRvdGFsOworfQorCisjZW5kaWYKKworCisKK2ludCBnc193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OworCisJZnVuY19lbnRlciAoKTsKKwlyZXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9jbnQgLSAxOworCWlmIChyZXQgPCAwKQorCQlyZXQgPSAwOworCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBnc19jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJZnVuY19lbnRlciAoKTsKKworCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gcG9ydC0+eG1pdF9jbnQ7Cit9CisKKworc3RhdGljIGludCBnc19yZWFsX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0OworCWZ1bmNfZW50ZXIgKCk7CisKKwlpZiAoIXR0eSkgcmV0dXJuIDA7CisJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXBvcnQtPnJkKSByZXR1cm4gMDsKKwlpZiAoIXBvcnQtPnJkLT5jaGFyc19pbl9idWZmZXIpIHJldHVybiAwOworCisJZnVuY19leGl0ICgpOworCXJldHVybiBwb3J0LT54bWl0X2NudCArIHBvcnQtPnJkLT5jaGFyc19pbl9idWZmZXIgKHBvcnQpOworfQorCisKK3N0YXRpYyBpbnQgZ3Nfd2FpdF90eF9mbHVzaGVkICh2b2lkICogcHRyLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpIAoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0ID0gcHRyOworCXVuc2lnbmVkIGxvbmcgZW5kX2ppZmZpZXM7CisJaW50IGppZmZpZXNfdG9fdHJhbnNtaXQsIGNoYXJzbGVmdCA9IDAsIHJ2ID0gMDsKKwlpbnQgcmNpYjsKKworCWZ1bmNfZW50ZXIoKTsKKworCWdzX2RwcmludGsgKEdTX0RFQlVHX0ZMVVNILCAicG9ydD0lcC5cbiIsIHBvcnQpOworCWlmIChwb3J0KSB7CisJCWdzX2RwcmludGsgKEdTX0RFQlVHX0ZMVVNILCAieG1pdF9jbnQ9JXgsIHhtaXRfYnVmPSVwLCB0dHk9JXAuXG4iLCAKKwkJcG9ydC0+eG1pdF9jbnQsIHBvcnQtPnhtaXRfYnVmLCBwb3J0LT50dHkpOworCX0KKworCWlmICghcG9ydCB8fCBwb3J0LT54bWl0X2NudCA8IDAgfHwgIXBvcnQtPnhtaXRfYnVmKSB7CisJCWdzX2RwcmludGsgKEdTX0RFQlVHX0ZMVVNILCAiRVJST1I6ICFwb3J0LCAhcG9ydC0+eG1pdF9idWYgb3IgcHJvdC0+eG1pdF9jbnQgPCAwLlxuIik7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gLUVJTlZBTDsgIC8qIFRoaXMgaXMgYW4gZXJyb3Igd2hpY2ggd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLiAqLworCX0KKworCXJjaWIgPSBnc19yZWFsX2NoYXJzX2luX2J1ZmZlcihwb3J0LT50dHkpOworCisJaWYocmNpYiA8PSAwKSB7CisJCWdzX2RwcmludGsgKEdTX0RFQlVHX0ZMVVNILCAibm90aGluZyB0byB3YWl0IGZvci5cbiIpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIHJ2OworCX0KKwkvKiBzdG9wIHRyeWluZzogbm93ICsgdHdpY2UgdGhlIHRpbWUgaXQgd291bGQgbm9ybWFsbHkgdGFrZSArICBzZWNvbmRzICovCisJaWYgKHRpbWVvdXQgPT0gMCkgdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCWVuZF9qaWZmaWVzICA9IGppZmZpZXM7IAorCWlmICh0aW1lb3V0ICE9ICBNQVhfU0NIRURVTEVfVElNRU9VVCkKKwkJZW5kX2ppZmZpZXMgKz0gcG9ydC0+YmF1ZD8oMiAqIHJjaWIgKiAxMCAqIEhaIC8gcG9ydC0+YmF1ZCk6MDsKKwllbmRfamlmZmllcyArPSB0aW1lb3V0OworCisJZ3NfZHByaW50ayAoR1NfREVCVUdfRkxVU0gsICJub3c9JWx4LCBlbmQ9JWx4ICglbGQpLlxuIiwgCisJCSAgICBqaWZmaWVzLCBlbmRfamlmZmllcywgZW5kX2ppZmZpZXMtamlmZmllcyk7IAorCisJLyogdGhlIGV4cHJlc3Npb24gaXMgYWN0dWFsbHkgamlmZmllcyA8IGVuZF9qaWZmaWVzLCBidXQgdGhhdCB3b24ndAorCSAgIHdvcmsgYXJvdW5kIHRoZSB3cmFwYXJvdW5kLiBUcmlja3kgZWg/ICovCisJd2hpbGUgKChjaGFyc2xlZnQgPSBnc19yZWFsX2NoYXJzX2luX2J1ZmZlciAocG9ydC0+dHR5KSkgJiYKKwkgICAgICAgIHRpbWVfYWZ0ZXIgKGVuZF9qaWZmaWVzLCBqaWZmaWVzKSkgeworCQkvKiBVbml0cyBjaGVjazogCisJCSAgIGNoYXJzICogKGJpdHMvY2hhcikgKiAoamlmZmllcyAvc2VjKSAvIChiaXRzL3NlYykgPSBqaWZmaWVzIQorCQkgICBjaGVjayEgKi8KKworCQljaGFyc2xlZnQgKz0gMTY7IC8qIEFsbG93IDE2IGNoYXJzIG1vcmUgdG8gYmUgdHJhbnNtaXR0ZWQgLi4uICovCisJCWppZmZpZXNfdG9fdHJhbnNtaXQgPSBwb3J0LT5iYXVkPygxICsgY2hhcnNsZWZ0ICogMTAgKiBIWiAvIHBvcnQtPmJhdWQpOjA7CisJCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl4gUm91bmQgdXAuLi4uICovCisJCWlmIChqaWZmaWVzX3RvX3RyYW5zbWl0IDw9IDApIGppZmZpZXNfdG9fdHJhbnNtaXQgPSAxOworCisJCWdzX2RwcmludGsgKEdTX0RFQlVHX0ZMVVNILCAiRXhwZWN0IHRvIGZpbmlzaCBpbiAlZCBqaWZmaWVzICIKKwkJCSAgICAiKCVkIGNoYXJzKS5cbiIsIGppZmZpZXNfdG9fdHJhbnNtaXQsIGNoYXJzbGVmdCk7IAorCisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoamlmZmllc190b190cmFuc21pdCkpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKSB7CisJCQlnc19kcHJpbnRrIChHU19ERUJVR19GTFVTSCwgIlNpZ25hbCBwZW5kaW5nLiBCb21iaW5nIG91dDogIik7IAorCQkJcnYgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWdzX2RwcmludGsgKEdTX0RFQlVHX0ZMVVNILCAiY2hhcnNsZWZ0ID0gJWQuXG4iLCBjaGFyc2xlZnQpOyAKKwlzZXRfY3VycmVudF9zdGF0ZSAoVEFTS19SVU5OSU5HKTsKKworCWZ1bmNfZXhpdCgpOworCXJldHVybiBydjsKK30KKworCisKK3ZvaWQgZ3NfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGdzX3BvcnQgKnBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlpZiAoIXR0eSkgcmV0dXJuOworCisJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXBvcnQpIHJldHVybjsKKworCS8qIFhYWCBXb3VsZCB0aGUgd3JpdGUgc2VtYXBob3JlIGRvPyAqLworCXNwaW5fbG9ja19pcnFzYXZlICgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJdHR5X3dha2V1cCh0dHkpOworCWZ1bmNfZXhpdCAoKTsKK30KKworCit2b2lkIGdzX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0OworCisJZnVuY19lbnRlciAoKTsKKworCWlmICghdHR5KSByZXR1cm47CisKKwlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghcG9ydCkgcmV0dXJuOworCisJaWYgKHBvcnQtPnhtaXRfY250IDw9IDAgfHwgdHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCB8fAorCSAgICAhcG9ydC0+eG1pdF9idWYpIHsKKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm47CisJfQorCisJLyogQmVhdHMgbWUgLS0gUkVXICovCisJcG9ydC0+ZmxhZ3MgfD0gR1NfVFhfSU5URU47CisJcG9ydC0+cmQtPmVuYWJsZV90eF9pbnRlcnJ1cHRzIChwb3J0KTsKKwlmdW5jX2V4aXQgKCk7Cit9CisKKwordm9pZCBnc19zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0OworCisJZnVuY19lbnRlciAoKTsKKworCWlmICghdHR5KSByZXR1cm47CisKKwlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghcG9ydCkgcmV0dXJuOworCisJaWYgKHBvcnQtPnhtaXRfY250ICYmIAorCSAgICBwb3J0LT54bWl0X2J1ZiAmJiAKKwkgICAgKHBvcnQtPmZsYWdzICYgR1NfVFhfSU5URU4pICkgeworCQlwb3J0LT5mbGFncyAmPSB+R1NfVFhfSU5URU47CisJCXBvcnQtPnJkLT5kaXNhYmxlX3R4X2ludGVycnVwdHMgKHBvcnQpOworCX0KKwlmdW5jX2V4aXQgKCk7Cit9CisKKwordm9pZCBnc19zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKKworCWlmICghdHR5KSByZXR1cm47CisKKwlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghcG9ydCkgcmV0dXJuOworCisJaWYgKHBvcnQtPnhtaXRfY250ICYmIAorCSAgICBwb3J0LT54bWl0X2J1ZiAmJiAKKwkgICAgIShwb3J0LT5mbGFncyAmIEdTX1RYX0lOVEVOKSApIHsKKwkJcG9ydC0+ZmxhZ3MgfD0gR1NfVFhfSU5URU47CisJCXBvcnQtPnJkLT5lbmFibGVfdHhfaW50ZXJydXB0cyAocG9ydCk7CisJfQorCWZ1bmNfZXhpdCAoKTsKK30KKworCitzdGF0aWMgdm9pZCBnc19zaHV0ZG93bl9wb3J0IChzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlcigpOworCQorCWlmICghcG9ydCkgcmV0dXJuOworCQorCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWlmIChwb3J0LT54bWl0X2J1ZikgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBvcnQtPnhtaXRfYnVmKTsKKwkJcG9ydC0+eG1pdF9idWYgPSBOVUxMOworCX0KKworCWlmIChwb3J0LT50dHkpCisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmcG9ydC0+dHR5LT5mbGFncyk7CisKKwlwb3J0LT5yZC0+c2h1dGRvd25fcG9ydCAocG9ydCk7CisKKwlwb3J0LT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKK3ZvaWQgZ3NfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGdzX3BvcnQgICAqcG9ydDsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlpZiAoIXR0eSkgcmV0dXJuOworCisJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdHR5ID0gcG9ydC0+dHR5OworCWlmICghdHR5KSAKKwkJcmV0dXJuOworCisJZ3Nfc2h1dGRvd25fcG9ydCAocG9ydCk7CisJcG9ydC0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFfEdTX0FDVElWRSk7CisJcG9ydC0+dHR5ID0gTlVMTDsKKwlwb3J0LT5jb3VudCA9IDA7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7CisJZnVuY19leGl0ICgpOworfQorCisKK2ludCBnc19ibG9ja190aWxfcmVhZHkodm9pZCAqcG9ydF8sIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCA9IHBvcnRfOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludCAgICByZXR2YWw7CisJaW50ICAgIGRvX2Nsb2NhbCA9IDA7CisJaW50ICAgIENEOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlpZiAoIXBvcnQpIHJldHVybiAwOworCisJdHR5ID0gcG9ydC0+dHR5OworCisJaWYgKCF0dHkpIHJldHVybiAwOworCisJZ3NfZHByaW50ayAoR1NfREVCVUdfQlRSLCAiRW50ZXJpbmcgZ3NfYmxvY2tfdGlsbF9yZWFkeS5cbiIpOyAKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyBjbG9zZWQsIHRoZW4gYmxvY2sKKwkgKiB1bnRpbCBpdCdzIGRvbmUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4KKwkgKi8KKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCBwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydC0+Y2xvc2Vfd2FpdCk7CisJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJZWxzZQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisKKwlnc19kcHJpbnRrIChHU19ERUJVR19CVFIsICJhZnRlciBodW5nIHVwXG4iKTsgCisKKwkvKgorCSAqIElmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCwgb3IgdGhlIHBvcnQgaXMgbm90IGVuYWJsZWQsCisJICogdGhlbiBtYWtlIHRoZSBjaGVjayB1cCBmcm9udCBhbmQgdGhlbiBleGl0LgorCSAqLworCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8CisJICAgICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKKwkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJcmV0dXJuIDA7CisJfQorCisJZ3NfZHByaW50ayAoR1NfREVCVUdfQlRSLCAiYWZ0ZXIgbm9uYmxvY2tcbiIpOyAKKyAKKwlpZiAoQ19DTE9DQUwodHR5KSkKKwkJZG9fY2xvY2FsID0gMTsKKworCS8qCisJICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUKKwkgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgorCSAqIHRoaXMgbG9vcCwgcG9ydC0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKwkgKiByc19jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCXJldHZhbCA9IDA7CisKKwlhZGRfd2FpdF9xdWV1ZSgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCk7CisKKwlnc19kcHJpbnRrIChHU19ERUJVR19CVFIsICJhZnRlciBhZGQgd2FpdHEuXG4iKTsgCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCXBvcnQtPmNvdW50LS07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJcG9ydC0+YmxvY2tlZF9vcGVuKys7CisJd2hpbGUgKDEpIHsKKwkJQ0QgPSBwb3J0LT5yZC0+Z2V0X0NEIChwb3J0KTsKKwkJZ3NfZHByaW50ayAoR1NfREVCVUdfQlRSLCAiQ0QgaXMgbm93ICVkLlxuIiwgQ0QpOworCQlzZXRfY3VycmVudF9zdGF0ZSAoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkJICAgICEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKwkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmCisJCSAgICAoZG9fY2xvY2FsIHx8IENEKSkKKwkJCWJyZWFrOworCQlnc19kcHJpbnRrIChHU19ERUJVR19CVFIsICJzaWduYWxfcGVuZGluZyBpcyBub3c6ICVkICglbHgpXG4iLCAKKwkJKGludClzaWduYWxfcGVuZGluZyAoY3VycmVudCksICoobG9uZyopKCZjdXJyZW50LT5ibG9ja2VkKSk7IAorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCWdzX2RwcmludGsgKEdTX0RFQlVHX0JUUiwgIkdvdCBvdXQgb2YgdGhlIGxvb3AuICglZClcbiIsCisJCSAgICBwb3J0LT5ibG9ja2VkX29wZW4pOworCXNldF9jdXJyZW50X3N0YXRlIChUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJcG9ydC0+Y291bnQrKzsKKwl9CisJcG9ydC0+YmxvY2tlZF9vcGVuLS07CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJZnVuY19leGl0ICgpOworCXJldHVybiAwOworfQkJCSAKKworCit2b2lkIGdzX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKKwkKKwlmdW5jX2VudGVyICgpOworCisJaWYgKCF0dHkpIHJldHVybjsKKworCXBvcnQgPSAoc3RydWN0IGdzX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghcG9ydCkgcmV0dXJuOworCisJaWYgKCFwb3J0LT50dHkpIHsKKwkJLyogVGhpcyBzZWVtcyB0byBoYXBwZW4gd2hlbiB0aGlzIGlzIGNhbGxlZCBmcm9tIHZoYW5ndXAuICovCisJCWdzX2RwcmludGsgKEdTX0RFQlVHX0NMT1NFLCAiZ3M6IE9kZDogcG9ydC0+dHR5IGlzIE5VTExcbiIpOworCQlwb3J0LT50dHkgPSB0dHk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlpZiAocG9ydC0+cmQtPmh1bmd1cCkKKwkJCXBvcnQtPnJkLT5odW5ndXAgKHBvcnQpOworCQlmdW5jX2V4aXQgKCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKHBvcnQtPmNvdW50ICE9IDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ3M6IGdzX2Nsb3NlIHBvcnQgJXA6IGJhZCBwb3J0IGNvdW50OyIKKwkJICAgICAgICIgdHR5LT5jb3VudCBpcyAxLCBwb3J0IGNvdW50IGlzICVkXG4iLCBwb3J0LCBwb3J0LT5jb3VudCk7CisJCXBvcnQtPmNvdW50ID0gMTsKKwl9CisJaWYgKC0tcG9ydC0+Y291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ3M6IGdzX2Nsb3NlIHBvcnQgJXA6IGJhZCBwb3J0IGNvdW50OiAlZFxuIiwgcG9ydCwgcG9ydC0+Y291bnQpOworCQlwb3J0LT5jb3VudCA9IDA7CisJfQorCisJaWYgKHBvcnQtPmNvdW50KSB7CisJCWdzX2RwcmludGsoR1NfREVCVUdfQ0xPU0UsICJnc19jbG9zZSBwb3J0ICVwOiBjb3VudDogJWRcbiIsIHBvcnQsIHBvcnQtPmNvdW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm47CisJfQorCXBvcnQtPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisKKwkvKgorCSAqIE5vdyB3ZSB3YWl0IGZvciB0aGUgdHJhbnNtaXQgYnVmZmVyIHRvIGNsZWFyOyBhbmQgd2Ugbm90aWZ5IAorCSAqIHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gb25seSBwcm9jZXNzIFhPTi9YT0ZGIGNoYXJhY3RlcnMuCisJICovCisJdHR5LT5jbG9zaW5nID0gMTsKKwkvKiBpZiAocG9ydC0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQorCSAgIHR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBwb3J0LT5jbG9zaW5nX3dhaXQpOyAqLworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiAgVG8gZG8gdGhpcywgd2UKKwkgKiBkaXNhYmxlIHRoZSByZWNlaXZlIGxpbmUgc3RhdHVzIGludGVycnVwdHMsIGFuZCB0ZWxsIHRoZQorCSAqIGludGVycnVwdCBkcml2ZXIgdG8gc3RvcCBjaGVja2luZyB0aGUgZGF0YSByZWFkeSBiaXQgaW4gdGhlCisJICogbGluZSBzdGF0dXMgcmVnaXN0ZXIuCisJICovCisKKwlwb3J0LT5yZC0+ZGlzYWJsZV9yeF9pbnRlcnJ1cHRzIChwb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJLyogY2xvc2UgaGFzIG5vIHdheSBvZiByZXR1cm5pbmcgIkVJTlRSIiwgc28gZGlzY2FyZCByZXR1cm4gdmFsdWUgKi8KKwlpZiAocG9ydC0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQorCQlnc193YWl0X3R4X2ZsdXNoZWQgKHBvcnQsIHBvcnQtPmNsb3Npbmdfd2FpdCk7CisKKwlwb3J0LT5mbGFncyAmPSB+R1NfQUNUSVZFOworCisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKworCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCXR0eS0+Y2xvc2luZyA9IDA7CisKKwlwb3J0LT5ldmVudCA9IDA7CisJcG9ydC0+cmQtPmNsb3NlIChwb3J0KTsKKwlwb3J0LT5yZC0+c2h1dGRvd25fcG9ydCAocG9ydCk7CisJcG9ydC0+dHR5ID0gTlVMTDsKKworCWlmIChwb3J0LT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKHBvcnQtPmNsb3NlX2RlbGF5KSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2Vjcyhwb3J0LT5jbG9zZV9kZWxheSkpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOworCX0KKwlwb3J0LT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyB8IEFTWU5DX0lOSVRJQUxJWkVEKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPmNsb3NlX3dhaXQpOworCisJZnVuY19leGl0ICgpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgICAgIGdzX2JhdWRyYXRlc1tdID0geworICAwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsCisgIDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwLCA0NjA4MDAsIDkyMTYwMAorfTsKKworCit2b2lkIGdzX3NldF90ZXJtaW9zIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGVybWlvcyAqIG9sZF90ZXJtaW9zKQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0OworCWludCBiYXVkcmF0ZSwgdG1wLCBydjsKKwlzdHJ1Y3QgdGVybWlvcyAqdGlvc3A7CisKKwlmdW5jX2VudGVyKCk7CisKKwlpZiAoIXR0eSkgcmV0dXJuOworCisJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXBvcnQpIHJldHVybjsKKwlpZiAoIXBvcnQtPnR0eSkgeworCQkvKiBUaGlzIHNlZW1zIHRvIGhhcHBlbiB3aGVuIHRoaXMgaXMgY2FsbGVkIGFmdGVyIGdzX2Nsb3NlLiAqLworCQlnc19kcHJpbnRrIChHU19ERUJVR19URVJNSU9TLCAiZ3M6IE9kZDogcG9ydC0+dHR5IGlzIE5VTExcbiIpOworCQlwb3J0LT50dHkgPSB0dHk7CisJfQorCisKKwl0aW9zcCA9IHR0eS0+dGVybWlvczsKKworCWlmIChnc19kZWJ1ZyAmIEdTX0RFQlVHX1RFUk1JT1MpIHsKKwkJZ3NfZHByaW50ayAoR1NfREVCVUdfVEVSTUlPUywgInRlcm1pb3Mgc3RydWN0dXJlICglcCk6XG4iLCB0aW9zcCk7CisJfQorCisjaWYgMAorCS8qIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRoYXQgaXMgb25seSBhbGxvd2VkIGZvciBkdW1iIGNhcmRzICovCisJLyogU21hcnQgY2FyZHMgcmVxdWlyZSBrbm93bGVkZ2Ugb2YgaWZsYWdzIGFuZCBvZmxhZ3MgdG9vOiB0aGF0IAorCSAgIG1pZ2h0IGNoYW5nZSBoYXJkd2FyZSBjb29raW5nIG1vZGUuLi4uICovCisjZW5kaWYKKwlpZiAob2xkX3Rlcm1pb3MpIHsKKwkJaWYoICAgKHRpb3NwLT5jX2lmbGFnID09IG9sZF90ZXJtaW9zLT5jX2lmbGFnKQorCQkgICAmJiAodGlvc3AtPmNfb2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfb2ZsYWcpCisJCSAgICYmICh0aW9zcC0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKKwkJICAgJiYgKHRpb3NwLT5jX2xmbGFnID09IG9sZF90ZXJtaW9zLT5jX2xmbGFnKQorCQkgICAmJiAodGlvc3AtPmNfbGluZSAgPT0gb2xkX3Rlcm1pb3MtPmNfbGluZSkKKwkJICAgJiYgKG1lbWNtcCh0aW9zcC0+Y19jYywgb2xkX3Rlcm1pb3MtPmNfY2MsIE5DQykgPT0gMCkpIHsKKwkJCWdzX2RwcmludGsoR1NfREVCVUdfVEVSTUlPUywgImdzX3NldF90ZXJtaW9zOiBvcHRpbWl6ZWQgYXdheVxuIik7CisJCQlyZXR1cm4gLyogMCAqLzsKKwkJfQorCX0gZWxzZSAKKwkJZ3NfZHByaW50ayhHU19ERUJVR19URVJNSU9TLCAiZ3Nfc2V0X3Rlcm1pb3M6IG5vIG9sZF90ZXJtaW9zOiAiCisJCSAgICAgICAgICAgIm5vIG9wdGltaXphdGlvblxuIik7CisKKwlpZihvbGRfdGVybWlvcyAmJiAoZ3NfZGVidWcgJiBHU19ERUJVR19URVJNSU9TKSkgeworCQlpZih0aW9zcC0+Y19pZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19pZmxhZykgIHByaW50aygiY19pZmxhZyBjaGFuZ2VkXG4iKTsKKwkJaWYodGlvc3AtPmNfb2ZsYWcgIT0gb2xkX3Rlcm1pb3MtPmNfb2ZsYWcpICBwcmludGsoImNfb2ZsYWcgY2hhbmdlZFxuIik7CisJCWlmKHRpb3NwLT5jX2NmbGFnICE9IG9sZF90ZXJtaW9zLT5jX2NmbGFnKSAgcHJpbnRrKCJjX2NmbGFnIGNoYW5nZWRcbiIpOworCQlpZih0aW9zcC0+Y19sZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19sZmxhZykgIHByaW50aygiY19sZmxhZyBjaGFuZ2VkXG4iKTsKKwkJaWYodGlvc3AtPmNfbGluZSAgIT0gb2xkX3Rlcm1pb3MtPmNfbGluZSkgICBwcmludGsoImNfbGluZSBjaGFuZ2VkXG4iKTsKKwkJaWYoIW1lbWNtcCh0aW9zcC0+Y19jYywgb2xkX3Rlcm1pb3MtPmNfY2MsIE5DQykpIHByaW50aygiY19jYyBjaGFuZ2VkXG4iKTsKKwl9CisKKwliYXVkcmF0ZSA9IHRpb3NwLT5jX2NmbGFnICYgQ0JBVUQ7CisJaWYgKGJhdWRyYXRlICYgQ0JBVURFWCkgeworCQliYXVkcmF0ZSAmPSB+Q0JBVURFWDsKKwkJaWYgKChiYXVkcmF0ZSA8IDEpIHx8IChiYXVkcmF0ZSA+IDQpKQorCQkJdGlvc3AtPmNfY2ZsYWcgJj0gfkNCQVVERVg7CisJCWVsc2UKKwkJCWJhdWRyYXRlICs9IDE1OworCX0KKworCWJhdWRyYXRlID0gZ3NfYmF1ZHJhdGVzW2JhdWRyYXRlXTsKKwlpZiAoKHRpb3NwLT5jX2NmbGFnICYgQ0JBVUQpID09IEIzODQwMCkgeworCQlpZiAoICAgICAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQorCQkJYmF1ZHJhdGUgPSA1NzYwMDsKKwkJZWxzZSBpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCisJCQliYXVkcmF0ZSA9IDExNTIwMDsKKwkJZWxzZSBpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9TSEkpCisJCQliYXVkcmF0ZSA9IDIzMDQwMDsKKwkJZWxzZSBpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQorCQkJYmF1ZHJhdGUgPSA0NjA4MDA7CisJCWVsc2UgaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkKKwkJCWJhdWRyYXRlID0gKHBvcnQtPmJhdWRfYmFzZSAvIHBvcnQtPmN1c3RvbV9kaXZpc29yKTsKKwl9CisKKwkvKiBJIHJlY29tbWVuZCB1c2luZyBUSElTIGluc3RlYWQgb2YgdGhlIG1lc3MgaW4gdGVybWlvcyAoYW5kCisJICAgZHVwbGljYXRpbmcgdGhlIGFib3ZlIGNvZGUpLiBOZXh0IHdlIHNob3VsZCBjcmVhdGUgYSBjbGVhbgorCSAgIGludGVyZmFjZSB0b3dhcmRzIHRoaXMgdmFyaWFibGUuIElmIHlvdXIgY2FyZCBzdXBwb3J0cyBhcmJpdHJhcnkKKwkgICBiYXVkIHJhdGVzLCAoZS5nLiBDRDE0MDAgb3IgMTY1NTAgYmFzZWQgY2FyZHMpIHRoZW4gZXZlcnl0aGluZworCSAgIHdpbGwgYmUgdmVyeSBlYXN5Li4uLi4gKi8KKwlwb3J0LT5iYXVkID0gYmF1ZHJhdGU7CisKKwkvKiBUd28gdGltZXIgdGlja3Mgc2VlbXMgZW5vdWdoIHRvIHdha2V1cCBzb21ldGhpbmcgbGlrZSBTTElQIGRyaXZlciAqLworCS8qIEJhdWRyYXRlLzEwIGlzIGNwcy4gRGl2aWRlIGJ5IEhaIHRvIGdldCBjaGFycyBwZXIgdGljay4gKi8KKwl0bXAgPSAoYmF1ZHJhdGUgLyAxMCAvIEhaKSAqIDI7CQkJIAorCisJaWYgKHRtcCA8ICAgICAgICAgICAgICAgICAwKSB0bXAgPSAwOworCWlmICh0bXAgPj0gU0VSSUFMX1hNSVRfU0laRSkgdG1wID0gU0VSSUFMX1hNSVRfU0laRS0xOworCisJcG9ydC0+d2FrZXVwX2NoYXJzID0gdG1wOworCisJLyogV2Ugc2hvdWxkIHJlYWxseSB3YWl0IGZvciB0aGUgY2hhcmFjdGVycyB0byBiZSBhbGwgc2VudCBiZWZvcmUKKwkgICBjaGFuZ2luZyB0aGUgc2V0dGluZ3MuIC0tIENBTCAqLworCXJ2ID0gZ3Nfd2FpdF90eF9mbHVzaGVkIChwb3J0LCBNQVhfU0NIRURVTEVfVElNRU9VVCk7CisJaWYgKHJ2IDwgMCkgcmV0dXJuIC8qIHJ2ICovOworCisJcnYgPSBwb3J0LT5yZC0+c2V0X3JlYWxfdGVybWlvcyhwb3J0KTsKKwlpZiAocnYgPCAwKSByZXR1cm4gLyogcnYgKi87CisKKwlpZiAoKCFvbGRfdGVybWlvcyB8fCAKKwkgICAgIChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSAmJgorCSAgICAhKCAgICAgIHRpb3NwLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJdHR5LT5zdG9wcGVkID0gMDsKKwkJZ3Nfc3RhcnQodHR5KTsKKwl9CisKKyNpZmRlZiB0eXRzb19wYXRjaF85NE5vdjI1XzE3MjYKKwkvKiBUaGlzICJtYWtlcyBzZW5zZSIsIFdoeSBpcyBpdCBjb21tZW50ZWQgb3V0PyAqLworCisJaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICYmCisJICAgICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPmdzLm9wZW5fd2FpdCk7CisjZW5kaWYKKworCWZ1bmNfZXhpdCgpOworCXJldHVybiAvKiAwICovOworfQorCisKKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KK2ludCBnc19pbml0X3BvcnQoc3RydWN0IGdzX3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisKKwlmdW5jX2VudGVyICgpOworCisgICAgICAgIGlmICghdG1wX2J1ZikgeworCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlzcGluX2xvY2tfaXJxc2F2ZSAoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7IC8qIERvbid0IGV4cGVjdCB0aGlzIHRvIG1ha2UgYSBkaWZmZXJlbmNlLiAqLworCQlpZiAodG1wX2J1ZikKKwkJCWZyZWVfcGFnZShwYWdlKTsKKwkJZWxzZQorCQkJdG1wX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2U7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlpZiAoIXRtcF9idWYpIHsKKwkJCWZ1bmNfZXhpdCAoKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFwb3J0LT54bWl0X2J1ZikgeworCQkvKiBXZSBtYXkgc2xlZXAgaW4gZ2V0X3plcm9lZF9wYWdlKCkgKi8KKwkJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkJdG1wID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlzcGluX2xvY2tfaXJxc2F2ZSAoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCWlmIChwb3J0LT54bWl0X2J1ZikgCisJCQlmcmVlX3BhZ2UgKHRtcCk7CisJCWVsc2UKKwkJCXBvcnQtPnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgdG1wOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlpZiAoIXBvcnQtPnhtaXRfYnVmKSB7CisJCQlmdW5jX2V4aXQgKCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlICgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlpZiAocG9ydC0+dHR5KSAKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnBvcnQtPnR0eS0+ZmxhZ3MpOworCWluaXRfTVVURVgoJnBvcnQtPnBvcnRfd3JpdGVfc2VtKTsKKwlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlnc19zZXRfdGVybWlvcyhwb3J0LT50dHksIE5VTEwpOworCXNwaW5fbG9ja19pcnFzYXZlICgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlwb3J0LT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwlwb3J0LT5mbGFncyAmPSB+R1NfVFhfSU5URU47CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQgZ3Nfc2V0c2VyaWFsKHN0cnVjdCBnc19wb3J0ICpwb3J0LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHNpbzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc2lvLCBzcCwgc2l6ZW9mKHN0cnVjdCBzZXJpYWxfc3RydWN0KSkpCisJCXJldHVybigtRUZBVUxUKTsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlpZiAoKHNpby5iYXVkX2Jhc2UgIT0gcG9ydC0+YmF1ZF9iYXNlKSB8fAorCQkgICAgKHNpby5jbG9zZV9kZWxheSAhPSBwb3J0LT5jbG9zZV9kZWxheSkgfHwKKwkJICAgICgoc2lvLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPQorCQkgICAgIChwb3J0LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQorCQkJcmV0dXJuKC1FUEVSTSk7CisJfSAKKworCXBvcnQtPmZsYWdzID0gKHBvcnQtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CisJCShzaW8uZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSyk7CisgIAorCXBvcnQtPmJhdWRfYmFzZSA9IHNpby5iYXVkX2Jhc2U7CisJcG9ydC0+Y2xvc2VfZGVsYXkgPSBzaW8uY2xvc2VfZGVsYXk7CisJcG9ydC0+Y2xvc2luZ193YWl0ID0gc2lvLmNsb3Npbmdfd2FpdDsKKwlwb3J0LT5jdXN0b21fZGl2aXNvciA9IHNpby5jdXN0b21fZGl2aXNvcjsKKworCWdzX3NldF90ZXJtaW9zIChwb3J0LT50dHksIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogICAgICBHZW5lcmF0ZSB0aGUgc2VyaWFsIHN0cnVjdCBpbmZvLgorICovCisKK2ludCBnc19nZXRzZXJpYWwoc3RydWN0IGdzX3BvcnQgKnBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqc3ApCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgICAgc2lvOworCisJbWVtc2V0KCZzaW8sIDAsIHNpemVvZihzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkpOworCXNpby5mbGFncyA9IHBvcnQtPmZsYWdzOworCXNpby5iYXVkX2Jhc2UgPSBwb3J0LT5iYXVkX2Jhc2U7CisJc2lvLmNsb3NlX2RlbGF5ID0gcG9ydC0+Y2xvc2VfZGVsYXk7CisJc2lvLmNsb3Npbmdfd2FpdCA9IHBvcnQtPmNsb3Npbmdfd2FpdDsKKwlzaW8uY3VzdG9tX2Rpdmlzb3IgPSBwb3J0LT5jdXN0b21fZGl2aXNvcjsKKwlzaW8uaHViNiA9IDA7CisKKwkvKiBJZiB5b3Ugd2FudCB5b3UgY2FuIG92ZXJyaWRlIHRoZXNlLiAqLworCXNpby50eXBlID0gUE9SVF9VTktOT1dOOworCXNpby54bWl0X2ZpZm9fc2l6ZSA9IC0xOworCXNpby5saW5lID0gLTE7CisJc2lvLnBvcnQgPSAtMTsKKwlzaW8uaXJxID0gLTE7CisKKwlpZiAocG9ydC0+cmQtPmdldHNlcmlhbCkKKwkJcG9ydC0+cmQtPmdldHNlcmlhbCAocG9ydCwgJnNpbyk7CisKKwlpZiAoY29weV90b191c2VyKHNwLCAmc2lvLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7CisKK30KKworCit2b2lkIGdzX2dvdF9icmVhayhzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCkKK3sKKwlmdW5jX2VudGVyICgpOworCisJdHR5X2luc2VydF9mbGlwX2NoYXIocG9ydC0+dHR5LCAwLCBUVFlfQlJFQUspOworCXR0eV9zY2hlZHVsZV9mbGlwKHBvcnQtPnR0eSk7CisJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfU0FLKSB7CisJCWRvX1NBSyAocG9ydC0+dHR5KTsKKwl9CisKKwlmdW5jX2V4aXQgKCk7Cit9CisKKworRVhQT1JUX1NZTUJPTChnc19wdXRfY2hhcik7CitFWFBPUlRfU1lNQk9MKGdzX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woZ3Nfd3JpdGVfcm9vbSk7CitFWFBPUlRfU1lNQk9MKGdzX2NoYXJzX2luX2J1ZmZlcik7CitFWFBPUlRfU1lNQk9MKGdzX2ZsdXNoX2J1ZmZlcik7CitFWFBPUlRfU1lNQk9MKGdzX2ZsdXNoX2NoYXJzKTsKK0VYUE9SVF9TWU1CT0woZ3Nfc3RvcCk7CitFWFBPUlRfU1lNQk9MKGdzX3N0YXJ0KTsKK0VYUE9SVF9TWU1CT0woZ3NfaGFuZ3VwKTsKK0VYUE9SVF9TWU1CT0woZ3NfYmxvY2tfdGlsX3JlYWR5KTsKK0VYUE9SVF9TWU1CT0woZ3NfY2xvc2UpOworRVhQT1JUX1NZTUJPTChnc19zZXRfdGVybWlvcyk7CitFWFBPUlRfU1lNQk9MKGdzX2luaXRfcG9ydCk7CitFWFBPUlRfU1lNQk9MKGdzX3NldHNlcmlhbCk7CitFWFBPUlRfU1lNQk9MKGdzX2dldHNlcmlhbCk7CitFWFBPUlRfU1lNQk9MKGdzX2dvdF9icmVhayk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9nZW5ydGMuYyBiL2RyaXZlcnMvY2hhci9nZW5ydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2EyYmMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2dlbnJ0Yy5jCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICoJUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IKKyAqCQktIHE0MCBhbmQgb3RoZXIgbTY4ayBtYWNoaW5lcywKKyAqCQktIEhQIFBBUklTQyBtYWNoaW5lcworICoJCS0gUG93ZXJQQyBtYWNoaW5lcworICogICAgICBlbXVsYXRlIHNvbWUgUlRDIGlycSBjYXBhYmlsaXRpZXMgaW4gc29mdHdhcmUKKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5OSBSaWNoYXJkIFppZGxpY2t5CisgKgorICoJYmFzZWQgb24gUGF1bCBHb3J0bWFrZXIncyBydGMuYyBkZXZpY2UgYW5kCisgKiAgICAgICAgICAgU2FtIENyZWFzZXkgR2VuZXJpYyBydGMgZHJpdmVyCisgKgorICoJVGhpcyBkcml2ZXIgYWxsb3dzIHVzZSBvZiB0aGUgcmVhbCB0aW1lIGNsb2NrIChidWlsdCBpbnRvCisgKgluZWFybHkgYWxsIGNvbXB1dGVycykgZnJvbSB1c2VyIHNwYWNlLiBJdCBleHBvcnRzIHRoZSAvZGV2L3J0YworICoJaW50ZXJmYWNlIHN1cHBvcnRpbmcgdmFyaW91cyBpb2N0bCgpIGFuZCBhbHNvIHRoZSAvcHJvYy9kZXYvcnRjCisgKglwc2V1ZG8tZmlsZSBmb3Igc3RhdHVzIGluZm9ybWF0aW9uLgorICoKKyAqCVRoZSBpb2N0bHMgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbnRlcnJ1cHQgYmVoYXZpb3VyIHdoZXJlCisgKglzdXBwb3J0ZWQuCisgKgorICoJVGhlIC9kZXYvcnRjIGludGVyZmFjZSB3aWxsIGJsb2NrIG9uIHJlYWRzIHVudGlsIGFuIGludGVycnVwdAorICoJaGFzIGJlZW4gcmVjZWl2ZWQuIElmIGEgUlRDIGludGVycnVwdCBoYXMgYWxyZWFkeSBoYXBwZW5lZCwKKyAqCWl0IHdpbGwgb3V0cHV0IGFuIHVuc2lnbmVkIGxvbmcgYW5kIHRoZW4gYmxvY2suIFRoZSBvdXRwdXQgdmFsdWUKKyAqCWNvbnRhaW5zIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBsb3cgYnl0ZSBhbmQgdGhlIG51bWJlciBvZgorICoJaW50ZXJydXB0cyBzaW5jZSB0aGUgbGFzdCByZWFkIGluIHRoZSByZW1haW5pbmcgaGlnaCBieXRlcy4gVGhlCisgKgkvZGV2L3J0YyBpbnRlcmZhY2UgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBzZWxlY3QoMikgY2FsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKworICogICAgICAxLjAxIGZpeCBmb3IgMi4zLlggICAgICAgICAgICAgICAgICAgIHJ6QGxpbnV4LW02OGsub3JnCisgKiAgICAgIDEuMDIgbWVyZ2VkIHdpdGggY29kZSBmcm9tIGdlbnJ0Yy5jICAgcnpAbGludXgtbTY4ay5vcmcKKyAqICAgICAgMS4wMyBtYWtlIGl0IG1vcmUgcG9ydGFibGUgICAgICAgICAgICB6aXBwZWxAbGludXgtbTY4ay5vcmcKKyAqICAgICAgMS4wNCByZW1vdmVkIHVzZWxlc3MgdGltZXIgY29kZSAgICAgICByekBsaW51eC1tNjhrLm9yZworICogICAgICAxLjA1IHBvcnRhYmxlIFJUQ19VSUUgZW11bGF0aW9uICAgICAgIHJ6QGxpbnV4LW02OGsub3JnCisgKiAgICAgIDEuMDYgc2V0X3J0Y190aW1lIGNhbiByZXR1cm4gYW4gZXJyb3IgdHJpbmlAa2VybmVsLmNyYXNoaW5nLm9yZworICogICAgICAxLjA3IHBvcnRlZCB0byBIUCBQQVJJU0MgKGhwcGEpCSAgICAgIEhlbGdlIERlbGxlciA8ZGVsbGVyQGdteC5kZT4KKyAqLworCisjZGVmaW5lIFJUQ19WRVJTSU9OCSIxLjA3IgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3J0Yy5oPgorCisvKgorICoJV2Ugc3BvbmdlIGEgbWlub3Igb2ZmIG9mIHRoZSBtaXNjIG1ham9yLiBObyBuZWVkIHNsdXJwaW5nCisgKgl1cCBhbm90aGVyIHZhbHVhYmxlIG1ham9yIGRldiBudW1iZXIgZm9yIHRoaXMuIElmIHlvdSBhZGQKKyAqCWFuIGlvY3RsLCBtYWtlIHN1cmUgeW91IGRvbid0IGNvbmZsaWN0IHdpdGggU1BBUkMncyBSVEMKKyAqCWlvY3Rscy4KKyAqLworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZ2VuX3J0Y193YWl0KTsKKworLyoKKyAqCUJpdHMgaW4gZ2VuX3J0Y19zdGF0dXMuCisgKi8KKworI2RlZmluZSBSVENfSVNfT1BFTgkJMHgwMQkvKiBtZWFucyAvZGV2L3J0YyBpcyBpbiB1c2UJKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2VuX3J0Y19zdGF0dXM7CS8qIGJpdG1hcHBlZCBzdGF0dXMgYnl0ZS4JKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdlbl9ydGNfaXJxX2RhdGE7CS8qIG91ciBvdXRwdXQgdG8gdGhlIHdvcmxkCSovCisKKy8qIG1vbnRocyBzdGFydCBhdCAwIG5vdyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgZGF5c19pbl9tb1tdID0KK3szMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfTsKKworc3RhdGljIGludCBpcnFfYWN0aXZlOworCisjaWZkZWYgQ09ORklHX0dFTl9SVENfWAorc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBnZW5ydGNfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcl90YXNrOworCitzdGF0aWMgdW5zaWduZWQgaW50IG9sZHNlY3M7CitzdGF0aWMgaW50IGxvc3RpbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB0dF9leHA7CisKK3N0YXRpYyB2b2lkIGdlbl9ydGNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKKworc3RhdGljIHZvbGF0aWxlIGludCBzdGFza19hY3RpdmU7ICAgICAgICAgICAgICAvKiBzY2hlZHVsZV93b3JrICovCitzdGF0aWMgdm9sYXRpbGUgaW50IHR0YXNrX2FjdGl2ZTsgICAgICAgICAgICAgIC8qIHRpbWVyX3Rhc2sgKi8KK3N0YXRpYyBpbnQgc3RvcF9ydGNfdGltZXJzOyAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgcmVxdWV1ZSB0YXNrcyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhnZW5fcnRjX2xvY2spOworCitzdGF0aWMgdm9pZCBnZW5fcnRjX2ludGVycnVwdCh1bnNpZ25lZCBsb25nIGFyZyk7CisKKy8qCisgKiBSb3V0aW5lIHRvIHBvbGwgUlRDIHNlY29uZHMgZmllbGQgZm9yIGNoYW5nZSBhcyBvZnRlbiBhcyBwb3NzaWJsZSwKKyAqIGFmdGVyIGZpcnN0IFJUQ19VSUUgdXNlIHRpbWVyIHRvIHJlZHVjZSBwb2xsaW5nCisgKi8KK3N0YXRpYyB2b2lkIGdlbnJ0Y190cm91dGluZSh2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGludCB0bXAgPSBnZXRfcnRjX3NzKCk7CisJCisJaWYgKHN0b3BfcnRjX3RpbWVycykgeworCQlzdGFza19hY3RpdmUgPSAwOworCQlyZXR1cm47CisJfQorCisJaWYgKG9sZHNlY3MgIT0gdG1wKXsKKwkJb2xkc2VjcyA9IHRtcDsKKworCQl0aW1lcl90YXNrLmZ1bmN0aW9uID0gZ2VuX3J0Y190aW1lcjsKKwkJdGltZXJfdGFzay5leHBpcmVzID0gamlmZmllcyArIEhaIC0gKEhaLzEwKTsKKwkJdHRfZXhwPXRpbWVyX3Rhc2suZXhwaXJlczsKKwkJdHRhc2tfYWN0aXZlPTE7CisJCXN0YXNrX2FjdGl2ZT0wOworCQlhZGRfdGltZXIoJnRpbWVyX3Rhc2spOworCisJCWdlbl9ydGNfaW50ZXJydXB0KDApOworCX0gZWxzZSBpZiAoc2NoZWR1bGVfd29yaygmZ2VucnRjX3Rhc2spID09IDApCisJCXN0YXNrX2FjdGl2ZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9ydGNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWxvc3RpbnQgPSBnZXRfcnRjX3NzKCkgLSBvbGRzZWNzIDsKKwlpZiAobG9zdGludDwwKSAKKwkJbG9zdGludCA9IDYwIC0gbG9zdGludDsKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0dF9leHApKQorCQlwcmludGsoS0VSTl9JTkZPICJnZW5ydGM6IHRpbWVyIHRhc2sgZGVsYXllZCBieSAlbGQgamlmZmllc1xuIiwKKwkJICAgICAgIGppZmZpZXMtdHRfZXhwKTsKKwl0dGFza19hY3RpdmU9MDsKKwlzdGFza19hY3RpdmU9MTsKKwlpZiAoKHNjaGVkdWxlX3dvcmsoJmdlbnJ0Y190YXNrKSA9PSAwKSkKKwkJc3Rhc2tfYWN0aXZlID0gMDsKK30KKworLyogCisgKiBjYWxsIGdlbl9ydGNfaW50ZXJydXB0IGZ1bmN0aW9uIHRvIHNpZ25hbCBhbiBSVENfVUlFLAorICogYXJnIGlzIHVudXNlZC4KKyAqIENvdWxkIGJlIGludm9rZWQgZWl0aGVyIGZyb20gYSByZWFsIGludGVycnVwdCBoYW5kbGVyIG9yCisgKiBmcm9tIHNvbWUgcm91dGluZSB0aGF0IHBlcmlvZGljYWxseSAoZWcgMTAwSFopIG1vbml0b3JzCisgKiB3aGV0aGVyIFJUQ19TRUNTIGNoYW5nZWQKKyAqLworc3RhdGljIHZvaWQgZ2VuX3J0Y19pbnRlcnJ1cHQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJLyogIFdlIHN0b3JlIHRoZSBzdGF0dXMgaW4gdGhlIGxvdyBieXRlIGFuZCB0aGUgbnVtYmVyIG9mCisJICoJaW50ZXJydXB0cyByZWNlaXZlZCBzaW5jZSB0aGUgbGFzdCByZWFkIGluIHRoZSByZW1haW5kZXIKKwkgKglvZiBydGNfaXJxX2RhdGEuICAqLworCisJZ2VuX3J0Y19pcnFfZGF0YSArPSAweDEwMDsKKwlnZW5fcnRjX2lycV9kYXRhICY9IH4weGZmOworCWdlbl9ydGNfaXJxX2RhdGEgfD0gUlRDX1VJRTsKKworCWlmIChsb3N0aW50KXsKKwkJcHJpbnRrKCJnZW5ydGM6IHN5c3RlbSBkZWxheWluZyBjbG9jayB0aWNrcz9cbiIpOworCQkvKiBpbmNyZW1lbnQgY291bnQgc28gdGhhdCB1c2Vyc3BhY2Uga25vd3Mgc29tZXRoaW5nIGlzIHdyb25nICovCisJCWdlbl9ydGNfaXJxX2RhdGEgKz0gKChsb3N0aW50LTEpPDw4KTsKKwkJbG9zdGludCA9IDA7CisJfQorCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZnZW5fcnRjX3dhaXQpOworfQorCisvKgorICoJTm93IGFsbCB0aGUgdmFyaW91cyBmaWxlIG9wZXJhdGlvbnMgdGhhdCB3ZSBleHBvcnQuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGdlbl9ydGNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlzc2l6ZV90IHJldHZhbDsKKworCWlmIChjb3VudCAhPSBzaXplb2YgKHVuc2lnbmVkIGludCkgJiYgY291bnQgIT0gc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgJiYgIWdlbl9ydGNfaXJxX2RhdGEpCisJCXJldHVybiAtRUFHQUlOOworCisJYWRkX3dhaXRfcXVldWUoJmdlbl9ydGNfd2FpdCwgJndhaXQpOworCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWRhdGEgPSB4Y2hnKCZnZW5fcnRjX2lycV9kYXRhLCAwKTsKKwkJaWYgKGRhdGEpCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJZ290byBvdXQ7CisJCXNjaGVkdWxlKCk7CisJfQorCisJLyogZmlyc3QgdGVzdCBhbGxvd3Mgb3B0aW1pemVyIHRvIG51a2UgdGhpcyBjYXNlIGZvciAzMi1iaXQgbWFjaGluZXMgKi8KKwlpZiAoc2l6ZW9mIChpbnQpICE9IHNpemVvZiAobG9uZykgJiYgY291bnQgPT0gc2l6ZW9mICh1bnNpZ25lZCBpbnQpKSB7CisJCXVuc2lnbmVkIGludCB1aWRhdGEgPSBkYXRhOworCQlyZXR2YWwgPSBwdXRfdXNlcih1aWRhdGEsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWJ1Zik7CisJfQorCWVsc2UgeworCQlyZXR2YWwgPSBwdXRfdXNlcihkYXRhLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilidWYpOworCX0KKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworIG91dDoKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZ2VuX3J0Y193YWl0LCAmd2FpdCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGdlbl9ydGNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXBvbGxfd2FpdChmaWxlLCAmZ2VuX3J0Y193YWl0LCB3YWl0KTsKKwlpZiAoZ2VuX3J0Y19pcnFfZGF0YSAhPSAwKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8qCisgKiBVc2VkIHRvIGRpc2FibGUvZW5hYmxlIGludGVycnVwdHMsIG9ubHkgUlRDX1VJRSBzdXBwb3J0ZWQKKyAqIFdlIGFsc28gY2xlYXIgb3V0IGFueSBvbGQgaXJxIGRhdGEgYWZ0ZXIgYW4gaW9jdGwoKSB0aGF0CisgKiBtZWRkbGVzIHdpdGggdGhlIGludGVycnVwdCBlbmFibGUvZGlzYWJsZSBiaXRzLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fY2xlYXJfcnRjX2lycV9iaXQodW5zaWduZWQgY2hhciBiaXQpCit7CisjaWZkZWYgQ09ORklHX0dFTl9SVENfWAorCXN0b3BfcnRjX3RpbWVycyA9IDE7CisJaWYgKHR0YXNrX2FjdGl2ZSl7CisJCWRlbF90aW1lcl9zeW5jKCZ0aW1lcl90YXNrKTsKKwkJdHRhc2tfYWN0aXZlID0gMDsKKwl9CisJd2hpbGUgKHN0YXNrX2FjdGl2ZSkKKwkJc2NoZWR1bGUoKTsKKworCXNwaW5fbG9jaygmZ2VuX3J0Y19sb2NrKTsKKwlpcnFfYWN0aXZlID0gMDsKKwlzcGluX3VubG9jaygmZ2VuX3J0Y19sb2NrKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludCBnZW5fc2V0X3J0Y19pcnFfYml0KHVuc2lnbmVkIGNoYXIgYml0KQoreworI2lmZGVmIENPTkZJR19HRU5fUlRDX1gKKwlzcGluX2xvY2soJmdlbl9ydGNfbG9jayk7CisJaWYgKCAhaXJxX2FjdGl2ZSApIHsKKwkJaXJxX2FjdGl2ZSA9IDE7CisJCXN0b3BfcnRjX3RpbWVycyA9IDA7CisJCWxvc3RpbnQgPSAwOworCQlJTklUX1dPUksoJmdlbnJ0Y190YXNrLCBnZW5ydGNfdHJvdXRpbmUsIE5VTEwpOworCQlvbGRzZWNzID0gZ2V0X3J0Y19zcygpOworCQlpbml0X3RpbWVyKCZ0aW1lcl90YXNrKTsKKworCQlzdGFza19hY3RpdmUgPSAxOworCQlpZiAoc2NoZWR1bGVfd29yaygmZ2VucnRjX3Rhc2spID09IDApeworCQkJc3Rhc2tfYWN0aXZlID0gMDsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmZ2VuX3J0Y19sb2NrKTsKKwlnZW5fcnRjX2lycV9kYXRhID0gMDsKKwlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYKK30KKworc3RhdGljIGludCBnZW5fcnRjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBydGNfdGltZSB3dGltZTsKKwlzdHJ1Y3QgcnRjX3BsbF9pbmZvIHBsbDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIFJUQ19QTExfR0VUOgorCSAgICBpZiAoZ2V0X3J0Y19wbGwoJnBsbCkpCisJIAkgICAgcmV0dXJuIC1FSU5WQUw7CisJICAgIGVsc2UKKwkJICAgIHJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJnBsbCwgc2l6ZW9mIHBsbCkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgUlRDX1BMTF9TRVQ6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcGxsLCBhcmdwLCBzaXplb2YocGxsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkgICAgcmV0dXJuIHNldF9ydGNfcGxsKCZwbGwpOworCisJY2FzZSBSVENfVUlFX09GRjoJLyogZGlzYWJsZSBpbnRzIGZyb20gUlRDIHVwZGF0ZXMuCSovCisJCWdlbl9jbGVhcl9ydGNfaXJxX2JpdChSVENfVUlFKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFJUQ19VSUVfT046CS8qIGVuYWJsZSBpbnRzIGZvciBSVEMgdXBkYXRlcy4JKi8KKwkgICAgICAgIHJldHVybiBnZW5fc2V0X3J0Y19pcnFfYml0KFJUQ19VSUUpOworCisJY2FzZSBSVENfUkRfVElNRToJLyogUmVhZCB0aGUgdGltZS9kYXRlIGZyb20gUlRDCSovCisJCS8qIHRoaXMgZG9lc24ndCBnZXQgd2Vlay1kYXksIHdobyBjYXJlcyAqLworCQltZW1zZXQoJnd0aW1lLCAwLCBzaXplb2Yod3RpbWUpKTsKKwkJZ2V0X3J0Y190aW1lKCZ3dGltZSk7CisKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmd3RpbWUsIHNpemVvZih3dGltZSkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFJUQ19TRVRfVElNRToJLyogU2V0IHRoZSBSVEMgKi8KKwkgICAgeworCQlpbnQgeWVhcjsKKwkJdW5zaWduZWQgY2hhciBsZWFwX3lyOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ3dGltZSwgYXJncCwgc2l6ZW9mKHd0aW1lKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQl5ZWFyID0gd3RpbWUudG1feWVhciArIDE5MDA7CisJCWxlYXBfeXIgPSAoKCEoeWVhciAlIDQpICYmICh5ZWFyICUgMTAwKSkgfHwKKwkJCSAgICEoeWVhciAlIDQwMCkpOworCisJCWlmICgod3RpbWUudG1fbW9uIDwgMCB8fCB3dGltZS50bV9tb24gPiAxMSkgfHwgKHd0aW1lLnRtX21kYXkgPCAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICh3dGltZS50bV9tZGF5IDwgMCB8fCB3dGltZS50bV9tZGF5ID4KKwkJICAgIChkYXlzX2luX21vW3d0aW1lLnRtX21vbl0gKyAoKHd0aW1lLnRtX21vbiA9PSAxKSAmJiBsZWFwX3lyKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAod3RpbWUudG1faG91ciA8IDAgfHwgd3RpbWUudG1faG91ciA+PSAyNCB8fAorCQkgICAgd3RpbWUudG1fbWluIDwgMCB8fCB3dGltZS50bV9taW4gPj0gNjAgfHwKKwkJICAgIHd0aW1lLnRtX3NlYyA8IDAgfHwgd3RpbWUudG1fc2VjID49IDYwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmV0dXJuIHNldF9ydGNfdGltZSgmd3RpbWUpOworCSAgICB9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKglXZSBlbmZvcmNlIG9ubHkgb25lIHVzZXIgYXQgYSB0aW1lIGhlcmUgd2l0aCB0aGUgb3Blbi9jbG9zZS4KKyAqCUFsc28gY2xlYXIgdGhlIHByZXZpb3VzIGludGVycnVwdCBkYXRhIG9uIGFuIG9wZW4sIGFuZCBjbGVhbgorICoJdXAgdGhpbmdzIG9uIGEgY2xvc2UuCisgKi8KKworc3RhdGljIGludCBnZW5fcnRjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGdlbl9ydGNfc3RhdHVzICYgUlRDX0lTX09QRU4pCisJCXJldHVybiAtRUJVU1k7CisKKwlnZW5fcnRjX3N0YXR1cyB8PSBSVENfSVNfT1BFTjsKKwlnZW5fcnRjX2lycV9kYXRhID0gMDsKKwlpcnFfYWN0aXZlID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbl9ydGNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKgorCSAqIFR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIG9uY2UgdGhlIGRldmljZSBpcyBubyBsb25nZXIKKwkgKiBpbiB1c2UgYW5kIGNsZWFyIHRoZSBkYXRhLgorCSAqLworCisJZ2VuX2NsZWFyX3J0Y19pcnFfYml0KFJUQ19QSUV8UlRDX0FJRXxSVENfVUlFKTsKKworCWdlbl9ydGNfc3RhdHVzICY9IH5SVENfSVNfT1BFTjsKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworLyoKKyAqCUluZm8gZXhwb3J0ZWQgdmlhICIvcHJvYy9ydGMiLgorICovCisKK3N0YXRpYyBpbnQgZ2VuX3J0Y19wcm9jX291dHB1dChjaGFyICpidWYpCit7CisJY2hhciAqcDsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBydGNfcGxsX2luZm8gcGxsOworCisJcCA9IGJ1ZjsKKworCWZsYWdzID0gZ2V0X3J0Y190aW1lKCZ0bSk7CisKKwlwICs9IHNwcmludGYocCwKKwkJICAgICAicnRjX3RpbWVcdDogJTAyZDolMDJkOiUwMmRcbiIKKwkJICAgICAicnRjX2RhdGVcdDogJTA0ZC0lMDJkLSUwMmRcbiIKKwkJICAgICAicnRjX2Vwb2NoXHQ6ICUwNHVcbiIsCisJCSAgICAgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMsCisJCSAgICAgdG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiArIDEsIHRtLnRtX21kYXksIDE5MDApOworCisJdG0udG1faG91ciA9IHRtLnRtX21pbiA9IHRtLnRtX3NlYyA9IDA7CisKKwlwICs9IHNwcmludGYocCwgImFsYXJtXHRcdDogIik7CisJaWYgKHRtLnRtX2hvdXIgPD0gMjQpCisJCXAgKz0gc3ByaW50ZihwLCAiJTAyZDoiLCB0bS50bV9ob3VyKTsKKwllbHNlCisJCXAgKz0gc3ByaW50ZihwLCAiKio6Iik7CisKKwlpZiAodG0udG1fbWluIDw9IDU5KQorCQlwICs9IHNwcmludGYocCwgIiUwMmQ6IiwgdG0udG1fbWluKTsKKwllbHNlCisJCXAgKz0gc3ByaW50ZihwLCAiKio6Iik7CisKKwlpZiAodG0udG1fc2VjIDw9IDU5KQorCQlwICs9IHNwcmludGYocCwgIiUwMmRcbiIsIHRtLnRtX3NlYyk7CisJZWxzZQorCQlwICs9IHNwcmludGYocCwgIioqXG4iKTsKKworCXAgKz0gc3ByaW50ZihwLAorCQkgICAgICJEU1RfZW5hYmxlXHQ6ICVzXG4iCisJCSAgICAgIkJDRFx0XHQ6ICVzXG4iCisJCSAgICAgIjI0aHJcdFx0OiAlc1xuIgorCQkgICAgICJzcXVhcmVfd2F2ZVx0OiAlc1xuIgorCQkgICAgICJhbGFybV9JUlFcdDogJXNcbiIKKwkJICAgICAidXBkYXRlX0lSUVx0OiAlc1xuIgorCQkgICAgICJwZXJpb2RpY19JUlFcdDogJXNcbiIKKwkJICAgICAicGVyaW9kaWNfZnJlcVx0OiAlbGRcbiIKKwkJICAgICAiYmF0dF9zdGF0dXNcdDogJXNcbiIsCisJCSAgICAgKGZsYWdzICYgUlRDX0RTVF9FTikgPyAieWVzIiA6ICJubyIsCisJCSAgICAgKGZsYWdzICYgUlRDX0RNX0JJTkFSWSkgPyAibm8iIDogInllcyIsCisJCSAgICAgKGZsYWdzICYgUlRDXzI0SCkgPyAieWVzIiA6ICJubyIsCisJCSAgICAgKGZsYWdzICYgUlRDX1NRV0UpID8gInllcyIgOiAibm8iLAorCQkgICAgIChmbGFncyAmIFJUQ19BSUUpID8gInllcyIgOiAibm8iLAorCQkgICAgIGlycV9hY3RpdmUgPyAieWVzIiA6ICJubyIsCisJCSAgICAgKGZsYWdzICYgUlRDX1BJRSkgPyAieWVzIiA6ICJubyIsCisJCSAgICAgMEwgLyogZnJlcSAqLywKKwkJICAgICAoZmxhZ3MgJiBSVENfQkFUVF9CQUQpID8gImJhZCIgOiAib2theSIpOworCWlmICghZ2V0X3J0Y19wbGwoJnBsbCkpCisJICAgIHAgKz0gc3ByaW50ZihwLAorCQkJICJQTEwgYWRqdXN0bWVudFx0OiAlZFxuIgorCQkJICJQTEwgbWF4ICt2ZSBhZGp1c3RtZW50XHQ6ICVkXG4iCisJCQkgIlBMTCBtYXggLXZlIGFkanVzdG1lbnRcdDogJWRcbiIKKwkJCSAiUExMICt2ZSBhZGp1c3RtZW50IGZhY3Rvclx0OiAlZFxuIgorCQkJICJQTEwgLXZlIGFkanVzdG1lbnQgZmFjdG9yXHQ6ICVkXG4iCisJCQkgIlBMTCBmcmVxdWVuY3lcdDogJWxkXG4iLAorCQkJIHBsbC5wbGxfdmFsdWUsCisJCQkgcGxsLnBsbF9tYXgsCisJCQkgcGxsLnBsbF9taW4sCisJCQkgcGxsLnBsbF9wb3NtdWx0LAorCQkJIHBsbC5wbGxfbmVnbXVsdCwKKwkJCSBwbGwucGxsX2Nsb2NrKTsKKwlyZXR1cm4gcCAtIGJ1ZjsKK30KKworc3RhdGljIGludCBnZW5fcnRjX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gZ2VuX3J0Y19wcm9jX291dHB1dCAocGFnZSk7CisgICAgICAgIGlmIChsZW4gPD0gb2ZmK2NvdW50KSAqZW9mID0gMTsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCWxlbiAtPSBvZmY7CisgICAgICAgIGlmIChsZW4+Y291bnQpIGxlbiA9IGNvdW50OworICAgICAgICBpZiAobGVuPDApIGxlbiA9IDA7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBfX2luaXQgZ2VuX3J0Y19wcm9jX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnI7CisKKwlyID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZHJpdmVyL3J0YyIsIDAsIE5VTEwsIGdlbl9ydGNfcmVhZF9wcm9jLCBOVUxMKTsKKwlpZiAoIXIpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGdlbl9ydGNfcHJvY19pbml0KHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisKKy8qCisgKglUaGUgdmFyaW91cyBmaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydC4KKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBnZW5fcnRjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19HRU5fUlRDX1gKKwkucmVhZAkJPSBnZW5fcnRjX3JlYWQsCisJLnBvbGwJCT0gZ2VuX3J0Y19wb2xsLAorI2VuZGlmCisJLmlvY3RsCQk9IGdlbl9ydGNfaW9jdGwsCisJLm9wZW4JCT0gZ2VuX3J0Y19vcGVuLAorCS5yZWxlYXNlCT0gZ2VuX3J0Y19yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHJ0Y19nZW5fZGV2ID0KK3sKKwkubWlub3IJCT0gUlRDX01JTk9SLAorCS5uYW1lCQk9ICJydGMiLAorCS5mb3BzCQk9ICZnZW5fcnRjX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBydGNfZ2VuZXJpY19pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXByaW50ayhLRVJOX0lORk8gIkdlbmVyaWMgUlRDIERyaXZlciB2JXNcbiIsIFJUQ19WRVJTSU9OKTsKKworCXJldHZhbCA9IG1pc2NfcmVnaXN0ZXIoJnJ0Y19nZW5fZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IGdlbl9ydGNfcHJvY19pbml0KCk7CisJaWYgKHJldHZhbCkgeworCQltaXNjX2RlcmVnaXN0ZXIoJnJ0Y19nZW5fZGV2KTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJ0Y19nZW5lcmljX2V4aXQodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSAoImRyaXZlci9ydGMiLCBOVUxMKTsKKwltaXNjX2RlcmVnaXN0ZXIoJnJ0Y19nZW5fZGV2KTsKK30KKworCittb2R1bGVfaW5pdChydGNfZ2VuZXJpY19pbml0KTsKK21vZHVsZV9leGl0KHJ0Y19nZW5lcmljX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSaWNoYXJkIFppZGxpY2t5Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihSVENfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2hhbmdjaGVjay10aW1lci5jIGIvZHJpdmVycy9jaGFyL2hhbmdjaGVjay10aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZDZiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaGFuZ2NoZWNrLXRpbWVyLmMKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBoYW5nY2hlY2stdGltZXIuYworICoKKyAqIERyaXZlciBmb3IgYSBsaXR0bGUgaW8gZmVuY2luZyB0aW1lci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgT3JhY2xlIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBBdXRob3I6IEpvZWwgQmVja2VyIDxqb2VsLmJlY2tlckBvcmFjbGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKy8qCisgKiBUaGUgaGFuZ2NoZWNrLXRpbWVyIGRyaXZlciB1c2VzIHRoZSBUU0MgdG8gY2F0Y2ggZGVsYXlzIHRoYXQKKyAqIGppZmZpZXMgZG9lcyBub3Qgbm90aWNlLiAgQSB0aW1lciBpcyBzZXQuICBXaGVuIHRoZSB0aW1lciBmaXJlcywgaXQKKyAqIGNoZWNrcyB3aGV0aGVyIGl0IHdhcyBkZWxheWVkIGFuZCBpZiB0aGF0IGRlbGF5IGV4Y2VlZHMgYSBnaXZlbgorICogbWFyZ2luIG9mIGVycm9yLiAgVGhlIGhhbmdjaGVja190aWNrIG1vZHVsZSBwYXJhbXRlciB0YWtlcyB0aGUgdGltZXIKKyAqIGR1cmF0aW9uIGluIHNlY29uZHMuICBUaGUgaGFuZ2NoZWNrX21hcmdpbiBwYXJhbWV0ZXIgZGVmaW5lcyB0aGUKKyAqIG1hcmdpbiBvZiBlcnJvciwgaW4gc2Vjb25kcy4gIFRoZSBkZWZhdWx0cyBhcmUgNjAgc2Vjb25kcyBmb3IgdGhlCisgKiB0aW1lciBhbmQgMTgwIHNlY29uZHMgZm9yIHRoZSBtYXJnaW4gb2YgZXJyb3IuICBJT1csIGEgdGltZXIgaXMgc2V0CisgKiBmb3IgNjAgc2Vjb25kcy4gIFdoZW4gdGhlIHRpbWVyIGZpcmVzLCB0aGUgY2FsbGJhY2sgY2hlY2tzIHRoZQorICogYWN0dWFsIGR1cmF0aW9uIHRoYXQgdGhlIHRpbWVyIHdhaXRlZC4gIElmIHRoZSBkdXJhdGlvbiBleGNlZWRzIHRoZQorICogYWxsb3RlZCB0aW1lIGFuZCBtYXJnaW4gKGhlcmUgNjAgKyAxODAsIG9yIDI0MCBzZWNvbmRzKSwgdGhlIG1hY2hpbmUKKyAqIGlzIHJlc3RhcnRlZC4gIEEgaGVhbHRoeSBtYWNoaW5lIHdpbGwgaGF2ZSB0aGUgZHVyYXRpb24gbWF0Y2ggdGhlCisgKiBleHBlY3RlZCB0aW1lb3V0IHZlcnkgY2xvc2VseS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworCisjZGVmaW5lIFZFUlNJT05fU1RSICIwLjUuMCIKKworI2RlZmluZSBERUZBVUxUX0lPRkVOQ0VfTUFSR0lOIDYwCS8qIERlZmF1bHQgZnVkZ2UgZmFjdG9yLCBpbiBzZWNvbmRzICovCisjZGVmaW5lIERFRkFVTFRfSU9GRU5DRV9USUNLIDE4MAkvKiBEZWZhdWx0IHRpbWVyIHRpbWVvdXQsIGluIHNlY29uZHMgKi8KKworc3RhdGljIGludCBoYW5nY2hlY2tfdGljayA9IERFRkFVTFRfSU9GRU5DRV9USUNLOworc3RhdGljIGludCBoYW5nY2hlY2tfbWFyZ2luID0gREVGQVVMVF9JT0ZFTkNFX01BUkdJTjsKK3N0YXRpYyBpbnQgaGFuZ2NoZWNrX3JlYm9vdDsgIC8qIERlZmF1bHRzIHRvIG5vdCByZWJvb3QgKi8KKworLyogRHJpdmVyIG9wdGlvbnMgKi8KK21vZHVsZV9wYXJhbShoYW5nY2hlY2tfdGljaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaGFuZ2NoZWNrX3RpY2ssICJUaW1lciBkZWxheS4iKTsKK21vZHVsZV9wYXJhbShoYW5nY2hlY2tfbWFyZ2luLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhoYW5nY2hlY2tfbWFyZ2luLCAiSWYgdGhlIGhhbmdjaGVjayB0aW1lciBoYXMgYmVlbiBkZWxheWVkIG1vcmUgdGhhbiBoYW5nY2hlY2tfbWFyZ2luIHNlY29uZHMsIHRoZSBkcml2ZXIgd2lsbCBmaXJlLiIpOworbW9kdWxlX3BhcmFtKGhhbmdjaGVja19yZWJvb3QsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhhbmdjaGVja19yZWJvb3QsICJJZiBub256ZXJvLCB0aGUgbWFjaGluZSB3aWxsIHJlYm9vdCB3aGVuIHRoZSB0aW1lciBtYXJnaW4gaXMgZXhjZWVkZWQuIik7CisKK01PRFVMRV9BVVRIT1IoIkpvZWwgQmVja2VyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhbmdjaGVjay10aW1lciBkZXRlY3RzIHdoZW4gdGhlIHN5c3RlbSBoYXMgZ29uZSBvdXQgdG8gbHVuY2ggcGFzdCBhIGNlcnRhaW4gbWFyZ2luLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKy8qIExhc3QgdGltZSBzY2hlZHVsZWQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgaGFuZ2NoZWNrX3RzYywgaGFuZ2NoZWNrX3RzY19tYXJnaW47CisKK3N0YXRpYyB2b2lkIGhhbmdjaGVja19maXJlKHVuc2lnbmVkIGxvbmcpOworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgaGFuZ2NoZWNrX3RpY2t0b2NrID0KKwkJVElNRVJfSU5JVElBTElaRVIoaGFuZ2NoZWNrX2ZpcmUsIDAsIDApOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19jbG9jayh2b2lkKTsKKworc3RhdGljIHZvaWQgaGFuZ2NoZWNrX2ZpcmUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBjdXJfdHNjLCB0c2NfZGlmZjsKKworCWN1cl90c2MgPSBtb25vdG9uaWNfY2xvY2soKTsKKworCWlmIChjdXJfdHNjID4gaGFuZ2NoZWNrX3RzYykKKwkJdHNjX2RpZmYgPSBjdXJfdHNjIC0gaGFuZ2NoZWNrX3RzYzsKKwllbHNlCisJCXRzY19kaWZmID0gKGN1cl90c2MgKyAofjBVTEwgLSBoYW5nY2hlY2tfdHNjKSk7IC8qIG9yIHNvbWV0aGluZyAqLworCisJaWYgKHRzY19kaWZmID4gaGFuZ2NoZWNrX3RzY19tYXJnaW4pIHsKKwkJaWYgKGhhbmdjaGVja19yZWJvb3QpIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgIkhhbmdjaGVjazogaGFuZ2NoZWNrIGlzIHJlc3RhcnRpbmcgdGhlIG1hY2hpbmUuXG4iKTsKKwkJCW1hY2hpbmVfcmVzdGFydChOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgIkhhbmdjaGVjazogaGFuZ2NoZWNrIHZhbHVlIHBhc3QgbWFyZ2luIVxuIik7CisJCX0KKwl9CisJbW9kX3RpbWVyKCZoYW5nY2hlY2tfdGlja3RvY2ssIGppZmZpZXMgKyAoaGFuZ2NoZWNrX3RpY2sqSFopKTsKKwloYW5nY2hlY2tfdHNjID0gbW9ub3RvbmljX2Nsb2NrKCk7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgaGFuZ2NoZWNrX2luaXQodm9pZCkKK3sKKwlwcmludGsoIkhhbmdjaGVjazogc3RhcnRpbmcgaGFuZ2NoZWNrIHRpbWVyICVzICh0aWNrIGlzICVkIHNlY29uZHMsIG1hcmdpbiBpcyAlZCBzZWNvbmRzKS5cbiIsCisJICAgICAgIFZFUlNJT05fU1RSLCBoYW5nY2hlY2tfdGljaywgaGFuZ2NoZWNrX21hcmdpbik7CisKKwloYW5nY2hlY2tfdHNjX21hcmdpbiA9IGhhbmdjaGVja19tYXJnaW4gKyBoYW5nY2hlY2tfdGljazsKKwloYW5nY2hlY2tfdHNjX21hcmdpbiAqPSAxMDAwMDAwMDAwOworCisKKwloYW5nY2hlY2tfdHNjID0gbW9ub3RvbmljX2Nsb2NrKCk7CisJbW9kX3RpbWVyKCZoYW5nY2hlY2tfdGlja3RvY2ssIGppZmZpZXMgKyAoaGFuZ2NoZWNrX3RpY2sqSFopKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoYW5nY2hlY2tfZXhpdCh2b2lkKQoreworCWRlbF90aW1lcl9zeW5jKCZoYW5nY2hlY2tfdGlja3RvY2spOworfQorCittb2R1bGVfaW5pdChoYW5nY2hlY2tfaW5pdCk7Cittb2R1bGVfZXhpdChoYW5nY2hlY2tfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHBldC5jIGIvZHJpdmVycy9jaGFyL2hwZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWM3MzJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2hwZXQuYwpAQCAtMCwwICsxLDk5NCBAQAorLyoKKyAqIEludGVsICYgTVMgSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXIgSW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEludGVsIENvcnBvcmF0aW9uCisgKglWZW5raSBQYWxsaXBhZGkKKyAqIChjKSBDb3B5cmlnaHQgMjAwNCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgorICoJQm9iIFBpY2NvIDxyb2JlcnQucGljY29AaHAuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2hwZXQuaD4KKworLyoKKyAqIFRoZSBIaWdoIFByZWNpc2lvbiBFdmVudCBUaW1lciBkcml2ZXIuCisgKiBUaGlzIGRyaXZlciBpcyBjbG9zZWx5IG1vZGVsbGVkIGFmdGVyIHRoZSBydGMuYyBkcml2ZXIuCisgKiBodHRwOi8vd3d3LmludGVsLmNvbS9sYWJzL3BsYXRjb21wL2hwZXQvaHBldHNwZWMuaHRtCisgKi8KKyNkZWZpbmUJSFBFVF9VU0VSX0ZSRVEJKDY0KQorI2RlZmluZQlIUEVUX0RSSUZUCSg1MDApCisKK3N0YXRpYyB1MzIgaHBldF9udGltZXIsIGhwZXRfbmhwZXQsIGhwZXRfbWF4X2ZyZXEgPSBIUEVUX1VTRVJfRlJFUTsKKworLyogQSBsb2NrIGZvciBjb25jdXJyZW50IGFjY2VzcyBieSBhcHAgYW5kIGlzciBocGV0IGFjdGl2aXR5LiAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhocGV0X2xvY2spOworLyogQSBsb2NrIGZvciBjb25jdXJyZW50IGludGVybW9kdWxlIGFjY2VzcyB0byBocGV0IGFuZCBpc3IgaHBldCBhY3Rpdml0eS4gKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaHBldF90YXNrX2xvY2spOworCisjZGVmaW5lCUhQRVRfREVWX05BTUUJKDcpCisKK3N0cnVjdCBocGV0X2RldiB7CisJc3RydWN0IGhwZXRzICpoZF9ocGV0czsKKwlzdHJ1Y3QgaHBldCBfX2lvbWVtICpoZF9ocGV0OworCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKmhkX3RpbWVyOworCXVuc2lnbmVkIGxvbmcgaGRfaXJlcWZyZXE7CisJdW5zaWduZWQgbG9uZyBoZF9pcnFkYXRhOworCXdhaXRfcXVldWVfaGVhZF90IGhkX3dhaXRxdWV1ZTsKKwlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqaGRfYXN5bmNfcXVldWU7CisJc3RydWN0IGhwZXRfdGFzayAqaGRfdGFzazsKKwl1bnNpZ25lZCBpbnQgaGRfZmxhZ3M7CisJdW5zaWduZWQgaW50IGhkX2lycTsKKwl1bnNpZ25lZCBpbnQgaGRfaGR3aXJxOworCWNoYXIgaGRfbmFtZVtIUEVUX0RFVl9OQU1FXTsKK307CisKK3N0cnVjdCBocGV0cyB7CisJc3RydWN0IGhwZXRzICpocF9uZXh0OworCXN0cnVjdCBocGV0IF9faW9tZW0gKmhwX2hwZXQ7CisJdW5zaWduZWQgbG9uZyBocF9ocGV0X3BoeXM7CisJc3RydWN0IHRpbWVfaW50ZXJwb2xhdG9yICpocF9pbnRlcnBvbGF0b3I7CisJdW5zaWduZWQgbG9uZyBocF9wZXJpb2Q7CisJdW5zaWduZWQgbG9uZyBocF9kZWx0YTsKKwl1bnNpZ25lZCBpbnQgaHBfbnRpbWVyOworCXVuc2lnbmVkIGludCBocF93aGljaDsKKwlzdHJ1Y3QgaHBldF9kZXYgaHBfZGV2WzFdOworfTsKKworc3RhdGljIHN0cnVjdCBocGV0cyAqaHBldHM7CisKKyNkZWZpbmUJSFBFVF9PUEVOCQkweDAwMDEKKyNkZWZpbmUJSFBFVF9JRQkJCTB4MDAwMgkvKiBpbnRlcnJ1cHQgZW5hYmxlZCAqLworI2RlZmluZQlIUEVUX1BFUklPRElDCQkweDAwMDQKKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKyNkZWZpbmUJd3JpdGVfY291bnRlcihWLCBNQykJd3JpdGVxKFYsIE1DKQorI2RlZmluZQlyZWFkX2NvdW50ZXIoTUMpCXJlYWRxKE1DKQorI2Vsc2UKKyNkZWZpbmUJd3JpdGVfY291bnRlcihWLCBNQykgCXdyaXRlbChWLCBNQykKKyNkZWZpbmUJcmVhZF9jb3VudGVyKE1DKQlyZWFkbChNQykKKyNlbmRpZgorCisjaWZuZGVmIHJlYWRxCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIF9faW5saW5lIHJlYWRxKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gcmVhZGwoYWRkcikgfCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpcmVhZGwoYWRkciArIDQpKSA8PCAzMkxMKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIHdyaXRlcQorc3RhdGljIHZvaWQgX19pbmxpbmUgd3JpdGVxKHVuc2lnbmVkIGxvbmcgbG9uZyB2LCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJd3JpdGVsKHYgJiAweGZmZmZmZmZmLCBhZGRyKTsKKwl3cml0ZWwodiA+PiAzMiwgYWRkciArIDQpOworfQorI2VuZGlmCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBocGV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaHBldF9kZXYgKmRldnA7CisJdW5zaWduZWQgbG9uZyBpc3I7CisKKwlkZXZwID0gZGF0YTsKKworCXNwaW5fbG9jaygmaHBldF9sb2NrKTsKKwlkZXZwLT5oZF9pcnFkYXRhKys7CisKKwkvKgorCSAqIEZvciBub24tcGVyaW9kaWMgdGltZXJzLCBpbmNyZW1lbnQgdGhlIGFjY3VtdWxhdG9yLgorCSAqIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgdHJlYXRpbmcgbm9uLXBlcmlvZGljIGxpa2UgcGVyaW9kaWMuCisJICovCisJaWYgKChkZXZwLT5oZF9mbGFncyAmIChIUEVUX0lFIHwgSFBFVF9QRVJJT0RJQykpID09IEhQRVRfSUUpIHsKKwkJdW5zaWduZWQgbG9uZyBtLCB0OworCisJCXQgPSBkZXZwLT5oZF9pcmVxZnJlcTsKKwkJbSA9IHJlYWRfY291bnRlcigmZGV2cC0+aGRfaHBldC0+aHBldF9tYyk7CisJCXdyaXRlX2NvdW50ZXIodCArIG0gKyBkZXZwLT5oZF9ocGV0cy0+aHBfZGVsdGEsCisJCQkgICAgICAmZGV2cC0+aGRfdGltZXItPmhwZXRfY29tcGFyZSk7CisJfQorCisJaXNyID0gKDEgPDwgKGRldnAgLSBkZXZwLT5oZF9ocGV0cy0+aHBfZGV2KSk7CisJd3JpdGVxKGlzciwgJmRldnAtPmhkX2hwZXQtPmhwZXRfaXNyKTsKKwlzcGluX3VubG9jaygmaHBldF9sb2NrKTsKKworCXNwaW5fbG9jaygmaHBldF90YXNrX2xvY2spOworCWlmIChkZXZwLT5oZF90YXNrKQorCQlkZXZwLT5oZF90YXNrLT5odF9mdW5jKGRldnAtPmhkX3Rhc2stPmh0X2RhdGEpOworCXNwaW5fdW5sb2NrKCZocGV0X3Rhc2tfbG9jayk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldnAtPmhkX3dhaXRxdWV1ZSk7CisKKwlraWxsX2Zhc3luYygmZGV2cC0+aGRfYXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBocGV0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCXN0cnVjdCBocGV0cyAqaHBldHA7CisJaW50IGk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmaHBldF9sb2NrKTsKKworCWZvciAoZGV2cCA9IE5VTEwsIGhwZXRwID0gaHBldHM7IGhwZXRwICYmICFkZXZwOyBocGV0cCA9IGhwZXRwLT5ocF9uZXh0KQorCQlmb3IgKGkgPSAwOyBpIDwgaHBldHAtPmhwX250aW1lcjsgaSsrKQorCQkJaWYgKGhwZXRwLT5ocF9kZXZbaV0uaGRfZmxhZ3MgJiBIUEVUX09QRU4KKwkJCSAgICB8fCBocGV0cC0+aHBfZGV2W2ldLmhkX3Rhc2spCisJCQkJY29udGludWU7CisJCQllbHNlIHsKKwkJCQlkZXZwID0gJmhwZXRwLT5ocF9kZXZbaV07CisJCQkJYnJlYWs7CisJCQl9CisKKwlpZiAoIWRldnApIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldnA7CisJZGV2cC0+aGRfaXJxZGF0YSA9IDA7CisJZGV2cC0+aGRfZmxhZ3MgfD0gSFBFVF9PUEVOOworCXNwaW5fdW5sb2NrX2lycSgmaHBldF9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAoraHBldF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXNzaXplX3QgcmV0dmFsOworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKworCWRldnAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKCFkZXZwLT5oZF9pcmVxZnJlcSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoY291bnQgPCBzaXplb2YodW5zaWduZWQgbG9uZykpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRkX3dhaXRfcXVldWUoJmRldnAtPmhkX3dhaXRxdWV1ZSwgJndhaXQpOworCisJZm9yICggOyA7ICkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCXNwaW5fbG9ja19pcnEoJmhwZXRfbG9jayk7CisJCWRhdGEgPSBkZXZwLT5oZF9pcnFkYXRhOworCQlkZXZwLT5oZF9pcnFkYXRhID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOworCisJCWlmIChkYXRhKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCisJcmV0dmFsID0gcHV0X3VzZXIoZGF0YSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYnVmKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworb3V0OgorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZGV2cC0+aGRfd2FpdHF1ZXVlLCAmd2FpdCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGhwZXRfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCit7CisJdW5zaWduZWQgbG9uZyB2OworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKworCWRldnAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIWRldnAtPmhkX2lyZXFmcmVxKQorCQlyZXR1cm4gMDsKKworCXBvbGxfd2FpdChmaWxlLCAmZGV2cC0+aGRfd2FpdHF1ZXVlLCB3YWl0KTsKKworCXNwaW5fbG9ja19pcnEoJmhwZXRfbG9jayk7CisJdiA9IGRldnAtPmhkX2lycWRhdGE7CisJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOworCisJaWYgKHYgIT0gMCkKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBocGV0X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworI2lmZGVmCUNPTkZJR19IUEVUX01NQVAKKwlzdHJ1Y3QgaHBldF9kZXYgKmRldnA7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYgKCgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAhPSBQQUdFX1NJWkUpIHx8IHZtYS0+dm1fcGdvZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2cCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlhZGRyID0gZGV2cC0+aGRfaHBldHMtPmhwX2hwZXRfcGh5czsKKworCWlmIChhZGRyICYgKFBBR0VfU0laRSAtIDEpKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKwlhZGRyID0gX19wYShhZGRyKTsKKworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBhZGRyID4+IFBBR0VfU0hJRlQsCisJCQkJCVBBR0VfU0laRSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmVtYXBfcGZuX3JhbmdlIGZhaWxlZCBpbiBocGV0LmNcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIC1FTk9TWVM7CisjZW5kaWYKK30KKworc3RhdGljIGludCBocGV0X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pCit7CisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCisJZGV2cCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJmRldnAtPmhkX2FzeW5jX3F1ZXVlKSA+PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGhwZXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaHBldF9kZXYgKmRldnA7CisJc3RydWN0IGhwZXRfdGltZXIgX19pb21lbSAqdGltZXI7CisJaW50IGlycSA9IDA7CisKKwlkZXZwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXRpbWVyID0gZGV2cC0+aGRfdGltZXI7CisKKwlzcGluX2xvY2tfaXJxKCZocGV0X2xvY2spOworCisJd3JpdGVxKChyZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKSAmIH5Ubl9JTlRfRU5CX0NORl9NQVNLKSwKKwkgICAgICAgJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisKKwlpcnEgPSBkZXZwLT5oZF9pcnE7CisJZGV2cC0+aGRfaXJxID0gMDsKKworCWRldnAtPmhkX2lyZXFmcmVxID0gMDsKKworCWlmIChkZXZwLT5oZF9mbGFncyAmIEhQRVRfUEVSSU9ESUMKKwkgICAgJiYgcmVhZHEoJnRpbWVyLT5ocGV0X2NvbmZpZykgJiBUbl9UWVBFX0NORl9NQVNLKSB7CisJCXVuc2lnbmVkIGxvbmcgdjsKKworCQl2ID0gcmVhZHEoJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisJCXYgXj0gVG5fVFlQRV9DTkZfTUFTSzsKKwkJd3JpdGVxKHYsICZ0aW1lci0+aHBldF9jb25maWcpOworCX0KKworCWRldnAtPmhkX2ZsYWdzICY9IH4oSFBFVF9PUEVOIHwgSFBFVF9JRSB8IEhQRVRfUEVSSU9ESUMpOworCXNwaW5fdW5sb2NrX2lycSgmaHBldF9sb2NrKTsKKworCWlmIChpcnEpCisJCWZyZWVfaXJxKGlycSwgZGV2cCk7CisKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIEZBU1lOQykKKwkJaHBldF9mYXN5bmMoLTEsIGZpbGUsIDApOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBocGV0X2lvY3RsX2NvbW1vbihzdHJ1Y3QgaHBldF9kZXYgKiwgaW50LCB1bnNpZ25lZCBsb25nLCBpbnQpOworCitzdGF0aWMgaW50CitocGV0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKworCWRldnAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJcmV0dXJuIGhwZXRfaW9jdGxfY29tbW9uKGRldnAsIGNtZCwgYXJnLCAwKTsKK30KKworc3RhdGljIGludCBocGV0X2lvY3RsX2llb24oc3RydWN0IGhwZXRfZGV2ICpkZXZwKQoreworCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOworCXN0cnVjdCBocGV0IF9faW9tZW0gKmhwZXQ7CisJc3RydWN0IGhwZXRzICpocGV0cDsKKwlpbnQgaXJxOworCXVuc2lnbmVkIGxvbmcgZywgdiwgdCwgbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpc3I7CisKKwl0aW1lciA9IGRldnAtPmhkX3RpbWVyOworCWhwZXQgPSBkZXZwLT5oZF9ocGV0OworCWhwZXRwID0gZGV2cC0+aGRfaHBldHM7CisKKwl2ID0gcmVhZHEoJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisJc3Bpbl9sb2NrX2lycSgmaHBldF9sb2NrKTsKKworCWlmIChkZXZwLT5oZF9mbGFncyAmIEhQRVRfSUUpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWRldnAtPmhkX2ZsYWdzIHw9IEhQRVRfSUU7CisJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOworCisJdCA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCWlycSA9IGRldnAtPmhkX2hkd2lycTsKKworCWlmIChpcnEpIHsKKwkJc3ByaW50ZihkZXZwLT5oZF9uYW1lLCAiaHBldCVkIiwgKGludCkoZGV2cCAtIGhwZXRwLT5ocF9kZXYpKTsKKworCQlpZiAocmVxdWVzdF9pcnEKKwkJICAgIChpcnEsIGhwZXRfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsIGRldnAtPmhkX25hbWUsICh2b2lkICopZGV2cCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaHBldDogSVJRICVkIGlzIG5vdCBmcmVlXG4iLCBpcnEpOworCQkJaXJxID0gMDsKKwkJfQorCX0KKworCWlmIChpcnEgPT0gMCkgeworCQlzcGluX2xvY2tfaXJxKCZocGV0X2xvY2spOworCQlkZXZwLT5oZF9mbGFncyBePSBIUEVUX0lFOworCQlzcGluX3VubG9ja19pcnEoJmhwZXRfbG9jayk7CisJCXJldHVybiAtRUlPOworCX0KKworCWRldnAtPmhkX2lycSA9IGlycTsKKwl0ID0gZGV2cC0+aGRfaXJlcWZyZXE7CisJdiA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCWcgPSB2IHwgVG5fSU5UX0VOQl9DTkZfTUFTSzsKKworCWlmIChkZXZwLT5oZF9mbGFncyAmIEhQRVRfUEVSSU9ESUMpIHsKKwkJd3JpdGVfY291bnRlcih0LCAmdGltZXItPmhwZXRfY29tcGFyZSk7CisJCWcgfD0gVG5fVFlQRV9DTkZfTUFTSzsKKwkJdiB8PSBUbl9UWVBFX0NORl9NQVNLOworCQl3cml0ZXEodiwgJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisJCXYgfD0gVG5fVkFMX1NFVF9DTkZfTUFTSzsKKwkJd3JpdGVxKHYsICZ0aW1lci0+aHBldF9jb25maWcpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCW0gPSByZWFkX2NvdW50ZXIoJmhwZXQtPmhwZXRfbWMpOworCQl3cml0ZV9jb3VudGVyKHQgKyBtICsgaHBldHAtPmhwX2RlbHRhLCAmdGltZXItPmhwZXRfY29tcGFyZSk7CisJfSBlbHNlIHsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQltID0gcmVhZF9jb3VudGVyKCZocGV0LT5ocGV0X21jKTsKKwkJd3JpdGVfY291bnRlcih0ICsgbSArIGhwZXRwLT5ocF9kZWx0YSwgJnRpbWVyLT5ocGV0X2NvbXBhcmUpOworCX0KKworCWlzciA9ICgxIDw8IChkZXZwIC0gaHBldHMtPmhwX2RldikpOworCXdyaXRlcShpc3IsICZocGV0LT5ocGV0X2lzcik7CisJd3JpdGVxKGcsICZ0aW1lci0+aHBldF9jb25maWcpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaHBldF90aW1lX2Rpdih1bnNpZ25lZCBsb25nIGRpcykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbSA9IDEwMDAwMDAwMDAwMDAwMDBVTEw7CisKKwlkb19kaXYobSwgZGlzKTsKKworCXJldHVybiAodW5zaWduZWQgbG9uZyltOworfQorCitzdGF0aWMgaW50CitocGV0X2lvY3RsX2NvbW1vbihzdHJ1Y3QgaHBldF9kZXYgKmRldnAsIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQga2VybmVsKQoreworCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOworCXN0cnVjdCBocGV0IF9faW9tZW0gKmhwZXQ7CisJc3RydWN0IGhwZXRzICpocGV0cDsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgdjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBIUEVUX0lFX09GRjoKKwljYXNlIEhQRVRfSU5GTzoKKwljYXNlIEhQRVRfRVBJOgorCWNhc2UgSFBFVF9EUEk6CisJY2FzZSBIUEVUX0lSUUZSRVE6CisJCXRpbWVyID0gZGV2cC0+aGRfdGltZXI7CisJCWhwZXQgPSBkZXZwLT5oZF9ocGV0OworCQlocGV0cCA9IGRldnAtPmhkX2hwZXRzOworCQlicmVhazsKKwljYXNlIEhQRVRfSUVfT046CisJCXJldHVybiBocGV0X2lvY3RsX2llb24oZGV2cCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXJyID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBIUEVUX0lFX09GRjoKKwkJaWYgKChkZXZwLT5oZF9mbGFncyAmIEhQRVRfSUUpID09IDApCisJCQlicmVhazsKKwkJdiA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCQl2ICY9IH5Ubl9JTlRfRU5CX0NORl9NQVNLOworCQl3cml0ZXEodiwgJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisJCWlmIChkZXZwLT5oZF9pcnEpIHsKKwkJCWZyZWVfaXJxKGRldnAtPmhkX2lycSwgZGV2cCk7CisJCQlkZXZwLT5oZF9pcnEgPSAwOworCQl9CisJCWRldnAtPmhkX2ZsYWdzIF49IEhQRVRfSUU7CisJCWJyZWFrOworCWNhc2UgSFBFVF9JTkZPOgorCQl7CisJCQlzdHJ1Y3QgaHBldF9pbmZvIGluZm87CisKKwkJCWluZm8uaGlfaXJlcWZyZXEgPSBocGV0X3RpbWVfZGl2KGhwZXRwLT5ocF9wZXJpb2QgKgorCQkJCQkJCSBkZXZwLT5oZF9pcmVxZnJlcSk7CisJCQlpbmZvLmhpX2ZsYWdzID0KKwkJCSAgICByZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKSAmIFRuX1BFUl9JTlRfQ0FQX01BU0s7CisJCQlpbmZvLmhpX2hwZXQgPSBkZXZwLT5oZF9ocGV0cy0+aHBfd2hpY2g7CisJCQlpbmZvLmhpX3RpbWVyID0gZGV2cCAtIGRldnAtPmhkX2hwZXRzLT5ocF9kZXY7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBIUEVUX0VQSToKKwkJdiA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCQlpZiAoKHYgJiBUbl9QRVJfSU5UX0NBUF9NQVNLKSA9PSAwKSB7CisJCQllcnIgPSAtRU5YSU87CisJCQlicmVhazsKKwkJfQorCQlkZXZwLT5oZF9mbGFncyB8PSBIUEVUX1BFUklPRElDOworCQlicmVhazsKKwljYXNlIEhQRVRfRFBJOgorCQl2ID0gcmVhZHEoJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisJCWlmICgodiAmIFRuX1BFUl9JTlRfQ0FQX01BU0spID09IDApIHsKKwkJCWVyciA9IC1FTlhJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChkZXZwLT5oZF9mbGFncyAmIEhQRVRfUEVSSU9ESUMgJiYKKwkJICAgIHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpICYgVG5fVFlQRV9DTkZfTUFTSykgeworCQkJdiA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCQkJdiBePSBUbl9UWVBFX0NORl9NQVNLOworCQkJd3JpdGVxKHYsICZ0aW1lci0+aHBldF9jb25maWcpOworCQl9CisJCWRldnAtPmhkX2ZsYWdzICY9IH5IUEVUX1BFUklPRElDOworCQlicmVhazsKKwljYXNlIEhQRVRfSVJRRlJFUToKKwkJaWYgKCFrZXJuZWwgJiYgKGFyZyA+IGhwZXRfbWF4X2ZyZXEpICYmCisJCSAgICAhY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkgeworCQkJZXJyID0gLUVBQ0NFUzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFyZyAmIChhcmcgLSAxKSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJZGV2cC0+aGRfaXJlcWZyZXEgPSBocGV0X3RpbWVfZGl2KGhwZXRwLT5ocF9wZXJpb2QgKiBhcmcpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhwZXRfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS5yZWFkID0gaHBldF9yZWFkLAorCS5wb2xsID0gaHBldF9wb2xsLAorCS5pb2N0bCA9IGhwZXRfaW9jdGwsCisJLm9wZW4gPSBocGV0X29wZW4sCisJLnJlbGVhc2UgPSBocGV0X3JlbGVhc2UsCisJLmZhc3luYyA9IGhwZXRfZmFzeW5jLAorCS5tbWFwID0gaHBldF9tbWFwLAorfTsKKworRVhQT1JUX1NZTUJPTChocGV0X2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woaHBldF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGhwZXRfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGhwZXRfY29udHJvbCk7CisKK2ludCBocGV0X3JlZ2lzdGVyKHN0cnVjdCBocGV0X3Rhc2sgKnRwLCBpbnQgcGVyaW9kaWMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdTY0IG1hc2s7CisJc3RydWN0IGhwZXRfdGltZXIgX19pb21lbSAqdGltZXI7CisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCXN0cnVjdCBocGV0cyAqaHBldHA7CisKKwlzd2l0Y2ggKHBlcmlvZGljKSB7CisJY2FzZSAxOgorCQltYXNrID0gVG5fUEVSX0lOVF9DQVBfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQltYXNrID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmaHBldF90YXNrX2xvY2spOworCXNwaW5fbG9jaygmaHBldF9sb2NrKTsKKworCWZvciAoZGV2cCA9IE5VTEwsIGhwZXRwID0gaHBldHM7IGhwZXRwICYmICFkZXZwOyBocGV0cCA9IGhwZXRwLT5ocF9uZXh0KQorCQlmb3IgKHRpbWVyID0gaHBldHAtPmhwX2hwZXQtPmhwZXRfdGltZXJzLCBpID0gMDsKKwkJICAgICBpIDwgaHBldHAtPmhwX250aW1lcjsgaSsrLCB0aW1lcisrKSB7CisJCQlpZiAoKHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpICYgVG5fUEVSX0lOVF9DQVBfTUFTSykKKwkJCSAgICAhPSBtYXNrKQorCQkJCWNvbnRpbnVlOworCisJCQlkZXZwID0gJmhwZXRwLT5ocF9kZXZbaV07CisKKwkJCWlmIChkZXZwLT5oZF9mbGFncyAmIEhQRVRfT1BFTiB8fCBkZXZwLT5oZF90YXNrKSB7CisJCQkJZGV2cCA9IE5VTEw7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXRwLT5odF9vcGFxdWUgPSBkZXZwOworCQkJZGV2cC0+aGRfdGFzayA9IHRwOworCQkJYnJlYWs7CisJCX0KKworCXNwaW5fdW5sb2NrKCZocGV0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHBldF90YXNrX2xvY2spOworCisJaWYgKHRwLT5odF9vcGFxdWUpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaHBldF90cGNoZWNrKHN0cnVjdCBocGV0X3Rhc2sgKnRwKQoreworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKwlzdHJ1Y3QgaHBldHMgKmhwZXRwOworCisJZGV2cCA9IHRwLT5odF9vcGFxdWU7CisKKwlpZiAoIWRldnApCisJCXJldHVybiAtRU5YSU87CisKKwlmb3IgKGhwZXRwID0gaHBldHM7IGhwZXRwOyBocGV0cCA9IGhwZXRwLT5ocF9uZXh0KQorCQlpZiAoZGV2cCA+PSBocGV0cC0+aHBfZGV2CisJCSAgICAmJiBkZXZwIDwgKGhwZXRwLT5ocF9kZXYgKyBocGV0cC0+aHBfbnRpbWVyKQorCQkgICAgJiYgZGV2cC0+aGRfaHBldCA9PSBocGV0cC0+aHBfaHBldCkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIC1FTlhJTzsKK30KKworaW50IGhwZXRfdW5yZWdpc3RlcihzdHJ1Y3QgaHBldF90YXNrICp0cCkKK3sKKwlzdHJ1Y3QgaHBldF9kZXYgKmRldnA7CisJc3RydWN0IGhwZXRfdGltZXIgX19pb21lbSAqdGltZXI7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaHBldF90cGNoZWNrKHRwKSkpCisJCXJldHVybiBlcnI7CisKKwlzcGluX2xvY2tfaXJxKCZocGV0X3Rhc2tfbG9jayk7CisJc3Bpbl9sb2NrKCZocGV0X2xvY2spOworCisJZGV2cCA9IHRwLT5odF9vcGFxdWU7CisJaWYgKGRldnAtPmhkX3Rhc2sgIT0gdHApIHsKKwkJc3Bpbl91bmxvY2soJmhwZXRfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmaHBldF90YXNrX2xvY2spOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXRpbWVyID0gZGV2cC0+aGRfdGltZXI7CisJd3JpdGVxKChyZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKSAmIH5Ubl9JTlRfRU5CX0NORl9NQVNLKSwKKwkgICAgICAgJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisJZGV2cC0+aGRfZmxhZ3MgJj0gfihIUEVUX0lFIHwgSFBFVF9QRVJJT0RJQyk7CisJZGV2cC0+aGRfdGFzayA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmhwZXRfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZocGV0X3Rhc2tfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGhwZXRfY29udHJvbChzdHJ1Y3QgaHBldF90YXNrICp0cCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGhwZXRfdHBjaGVjayh0cCkpKQorCQlyZXR1cm4gZXJyOworCisJc3Bpbl9sb2NrX2lycSgmaHBldF9sb2NrKTsKKwlkZXZwID0gdHAtPmh0X29wYXF1ZTsKKwlpZiAoZGV2cC0+aGRfdGFzayAhPSB0cCkgeworCQlzcGluX3VubG9ja19pcnEoJmhwZXRfbG9jayk7CisJCXJldHVybiAtRU5YSU87CisJfQorCXNwaW5fdW5sb2NrX2lycSgmaHBldF9sb2NrKTsKKwlyZXR1cm4gaHBldF9pb2N0bF9jb21tb24oZGV2cCwgY21kLCBhcmcsIDEpOworfQorCitzdGF0aWMgY3RsX3RhYmxlIGhwZXRfdGFibGVbXSA9IHsKKwl7CisJIC5jdGxfbmFtZSA9IDEsCisJIC5wcm9jbmFtZSA9ICJtYXgtdXNlci1mcmVxIiwKKwkgLmRhdGEgPSAmaHBldF9tYXhfZnJlcSwKKwkgLm1heGxlbiA9IHNpemVvZihpbnQpLAorCSAubW9kZSA9IDA2NDQsCisJIC5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYywKKwkgfSwKKwl7LmN0bF9uYW1lID0gMH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgaHBldF9yb290W10gPSB7CisJeworCSAuY3RsX25hbWUgPSAxLAorCSAucHJvY25hbWUgPSAiaHBldCIsCisJIC5tYXhsZW4gPSAwLAorCSAubW9kZSA9IDA1NTUsCisJIC5jaGlsZCA9IGhwZXRfdGFibGUsCisJIH0sCisJey5jdGxfbmFtZSA9IDB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGRldl9yb290W10gPSB7CisJeworCSAuY3RsX25hbWUgPSBDVExfREVWLAorCSAucHJvY25hbWUgPSAiZGV2IiwKKwkgLm1heGxlbiA9IDAsCisJIC5tb2RlID0gMDU1NSwKKwkgLmNoaWxkID0gaHBldF9yb290LAorCSB9LAorCXsuY3RsX25hbWUgPSAwfQorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpzeXNjdGxfaGVhZGVyOworCitzdGF0aWMgdm9pZCBocGV0X3JlZ2lzdGVyX2ludGVycG9sYXRvcihzdHJ1Y3QgaHBldHMgKmhwZXRwKQoreworI2lmZGVmCUNPTkZJR19USU1FX0lOVEVSUE9MQVRJT04KKwlzdHJ1Y3QgdGltZV9pbnRlcnBvbGF0b3IgKnRpOworCisJdGkgPSBrbWFsbG9jKHNpemVvZigqdGkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRpKQorCQlyZXR1cm47CisKKwltZW1zZXQodGksIDAsIHNpemVvZigqdGkpKTsKKwl0aS0+c291cmNlID0gVElNRV9TT1VSQ0VfTU1JTzY0OworCXRpLT5zaGlmdCA9IDEwOworCXRpLT5hZGRyID0gJmhwZXRwLT5ocF9ocGV0LT5ocGV0X21jOworCXRpLT5mcmVxdWVuY3kgPSBocGV0X3RpbWVfZGl2KGhwZXRzLT5ocF9wZXJpb2QpOworCXRpLT5kcmlmdCA9IHRpLT5mcmVxdWVuY3kgKiBIUEVUX0RSSUZUIC8gMTAwMDAwMDsKKwl0aS0+bWFzayA9IC0xOworCisJaHBldHAtPmhwX2ludGVycG9sYXRvciA9IHRpOworCXJlZ2lzdGVyX3RpbWVfaW50ZXJwb2xhdG9yKHRpKTsKKyNlbmRpZgorfQorCisvKgorICogQWRqdXN0bWVudCBmb3Igd2hlbiBhcm1pbmcgdGhlIHRpbWVyIHdpdGgKKyAqIGluaXRpYWwgY29uZGl0aW9ucy4gIFRoYXQgaXMsIG1haW4gY291bnRlcgorICogdGlja3MgZXhwaXJlZCBiZWZvcmUgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKyAqLworI2RlZmluZQlUSUNLX0NBTElCUkFURQkoMTAwMFVMKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X2NhbGlicmF0ZShzdHJ1Y3QgaHBldHMgKmhwZXRwKQoreworCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHQsIG0sIGNvdW50LCBpLCBmbGFncywgc3RhcnQ7CisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCWludCBqOworCXN0cnVjdCBocGV0IF9faW9tZW0gKmhwZXQ7CisKKwlmb3IgKGogPSAwLCBkZXZwID0gaHBldHAtPmhwX2RldjsgaiA8IGhwZXRwLT5ocF9udGltZXI7IGorKywgZGV2cCsrKQorCQlpZiAoKGRldnAtPmhkX2ZsYWdzICYgSFBFVF9PUEVOKSA9PSAwKSB7CisJCQl0aW1lciA9IGRldnAtPmhkX3RpbWVyOworCQkJYnJlYWs7CisJCX0KKworCWlmICghdGltZXIpCisJCXJldHVybiAwOworCisJaHBldCA9IGhwZXRzLT5ocF9ocGV0OworCXQgPSByZWFkX2NvdW50ZXIoJnRpbWVyLT5ocGV0X2NvbXBhcmUpOworCisJaSA9IDA7CisJY291bnQgPSBocGV0X3RpbWVfZGl2KGhwZXRwLT5ocF9wZXJpb2QgKiBUSUNLX0NBTElCUkFURSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzdGFydCA9IHJlYWRfY291bnRlcigmaHBldC0+aHBldF9tYyk7CisKKwlkbyB7CisJCW0gPSByZWFkX2NvdW50ZXIoJmhwZXQtPmhwZXRfbWMpOworCQl3cml0ZV9jb3VudGVyKHQgKyBtICsgaHBldHAtPmhwX2RlbHRhLCAmdGltZXItPmhwZXRfY29tcGFyZSk7CisJfSB3aGlsZSAoaSsrLCAobSAtIHN0YXJ0KSA8IGNvdW50KTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAobSAtIHN0YXJ0KSAvIGk7Cit9CisKK2ludCBocGV0X2FsbG9jKHN0cnVjdCBocGV0X2RhdGEgKmhkcCkKK3sKKwl1NjQgY2FwLCBtY2ZnOworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKwl1MzIgaSwgbnRpbWVyOworCXN0cnVjdCBocGV0cyAqaHBldHA7CisJc2l6ZV90IHNpejsKKwlzdHJ1Y3QgaHBldCBfX2lvbWVtICpocGV0OworCXN0YXRpYyBzdHJ1Y3QgaHBldHMgKmxhc3QgPSAoc3RydWN0IGhwZXRzICopMDsKKwl1bnNpZ25lZCBsb25nIG5zOworCisJLyoKKwkgKiBocGV0X2FsbG9jIGNhbiBiZSBjYWxsZWQgYnkgcGxhdGZvcm0gZGVwZW5kZW50IGNvZGUuCisJICogaWYgcGxhdGZvcm0gZGVwZW5kZW50IGNvZGUgaGFzIGFsbG9jYXRlZCB0aGUgaHBldAorCSAqIEFDUEkgYWxzbyByZXBvcnRzIGhwZXQsIHRoZW4gd2UgY2F0Y2ggaXQgaGVyZS4KKwkgKi8KKwlmb3IgKGhwZXRwID0gaHBldHM7IGhwZXRwOyBocGV0cCA9IGhwZXRwLT5ocF9uZXh0KQorCQlpZiAoaHBldHAtPmhwX2hwZXQgPT0gaGRwLT5oZF9hZGRyZXNzKQorCQkJcmV0dXJuIDA7CisKKwlzaXogPSBzaXplb2Yoc3RydWN0IGhwZXRzKSArICgoaGRwLT5oZF9uaXJxcyAtIDEpICoKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IGhwZXRfZGV2KSk7CisKKwlocGV0cCA9IGttYWxsb2Moc2l6LCBHRlBfS0VSTkVMKTsKKworCWlmICghaHBldHApCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGhwZXRwLCAwLCBzaXopOworCisJaHBldHAtPmhwX3doaWNoID0gaHBldF9uaHBldCsrOworCWhwZXRwLT5ocF9ocGV0ID0gaGRwLT5oZF9hZGRyZXNzOworCWhwZXRwLT5ocF9ocGV0X3BoeXMgPSBoZHAtPmhkX3BoeXNfYWRkcmVzczsKKworCWhwZXRwLT5ocF9udGltZXIgPSBoZHAtPmhkX25pcnFzOworCisJZm9yIChpID0gMDsgaSA8IGhkcC0+aGRfbmlycXM7IGkrKykKKwkJaHBldHAtPmhwX2RldltpXS5oZF9oZHdpcnEgPSBoZHAtPmhkX2lycVtpXTsKKworCWhwZXQgPSBocGV0cC0+aHBfaHBldDsKKworCWNhcCA9IHJlYWRxKCZocGV0LT5ocGV0X2NhcCk7CisKKwludGltZXIgPSAoKGNhcCAmIEhQRVRfTlVNX1RJTV9DQVBfTUFTSykgPj4gSFBFVF9OVU1fVElNX0NBUF9TSElGVCkgKyAxOworCisJaWYgKGhwZXRwLT5ocF9udGltZXIgIT0gbnRpbWVyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhwZXQ6IG51bWJlciBpcnFzIGRvZXNuJ3QgYWdyZWUiCisJCSAgICAgICAiIHdpdGggbnVtYmVyIG9mIHRpbWVyc1xuIik7CisJCWtmcmVlKGhwZXRwKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGxhc3QpCisJCWxhc3QtPmhwX25leHQgPSBocGV0cDsKKwllbHNlCisJCWhwZXRzID0gaHBldHA7CisKKwlsYXN0ID0gaHBldHA7CisKKwlocGV0cC0+aHBfcGVyaW9kID0gKGNhcCAmIEhQRVRfQ09VTlRFUl9DTEtfUEVSSU9EX01BU0spID4+CisJICAgIEhQRVRfQ09VTlRFUl9DTEtfUEVSSU9EX1NISUZUOworCisJcHJpbnRrKEtFUk5fSU5GTyAiaHBldCVkOiBhdCBNTUlPIDB4JWx4LCBJUlElcyIsCisJCWhwZXRwLT5ocF93aGljaCwgaGRwLT5oZF9waHlzX2FkZHJlc3MsCisJCWhwZXRwLT5ocF9udGltZXIgPiAxID8gInMiIDogIiIpOworCWZvciAoaSA9IDA7IGkgPCBocGV0cC0+aHBfbnRpbWVyOyBpKyspCisJCXByaW50aygiJXMgJWQiLCBpID4gMCA/ICIsIiA6ICIiLCBoZHAtPmhkX2lycVtpXSk7CisJcHJpbnRrKCJcbiIpOworCisJbnMgPSBocGV0cC0+aHBfcGVyaW9kOwkvKiBmZW1wdG9zZWNvbmRzLCAxMF4tMTUgKi8KKwlkb19kaXYobnMsIDEwMDAwMDApOwkvKiBjb252ZXJ0IHRvIG5hbm9zZWNvbmRzLCAxMF4tOSAqLworCXByaW50ayhLRVJOX0lORk8gImhwZXQlZDogJWxkbnMgdGljaywgJWQgJWQtYml0IHRpbWVyc1xuIiwKKwkJaHBldHAtPmhwX3doaWNoLCBucywgaHBldHAtPmhwX250aW1lciwKKwkJY2FwICYgSFBFVF9DT1VOVEVSX1NJWkVfTUFTSyA/IDY0IDogMzIpOworCisJbWNmZyA9IHJlYWRxKCZocGV0LT5ocGV0X2NvbmZpZyk7CisJaWYgKChtY2ZnICYgSFBFVF9FTkFCTEVfQ05GX01BU0spID09IDApIHsKKwkJd3JpdGVfY291bnRlcigwTCwgJmhwZXQtPmhwZXRfbWMpOworCQltY2ZnIHw9IEhQRVRfRU5BQkxFX0NORl9NQVNLOworCQl3cml0ZXEobWNmZywgJmhwZXQtPmhwZXRfY29uZmlnKTsKKwl9CisKKwlmb3IgKGkgPSAwLCBkZXZwID0gaHBldHAtPmhwX2RldjsgaSA8IGhwZXRwLT5ocF9udGltZXI7CisJICAgICBpKyssIGhwZXRfbnRpbWVyKyssIGRldnArKykgeworCQl1bnNpZ25lZCBsb25nIHY7CisJCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOworCisJCXRpbWVyID0gJmhwZXQtPmhwZXRfdGltZXJzW2RldnAgLSBocGV0cC0+aHBfZGV2XTsKKwkJdiA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCisJCWRldnAtPmhkX2hwZXRzID0gaHBldHA7CisJCWRldnAtPmhkX2hwZXQgPSBocGV0OworCQlkZXZwLT5oZF90aW1lciA9IHRpbWVyOworCisJCS8qCisJCSAqIElmIHRoZSB0aW1lciB3YXMgcmVzZXJ2ZWQgYnkgcGxhdGZvcm0gY29kZSwKKwkJICogdGhlbiBtYWtlIHRpbWVyIHVuYXZhaWxhYmxlIGZvciBvcGVucy4KKwkJICovCisJCWlmIChoZHAtPmhkX3N0YXRlICYgKDEgPDwgaSkpIHsKKwkJCWRldnAtPmhkX2ZsYWdzID0gSFBFVF9PUEVOOworCQkJY29udGludWU7CisJCX0KKworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZwLT5oZF93YWl0cXVldWUpOworCX0KKworCWhwZXRwLT5ocF9kZWx0YSA9IGhwZXRfY2FsaWJyYXRlKGhwZXRwKTsKKwlocGV0X3JlZ2lzdGVyX2ludGVycG9sYXRvcihocGV0cCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIGhwZXRfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhwZXRfZGF0YSAqaGRwOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgYWRkcjsKKwlzdHJ1Y3QgaHBldHMgKmhwZXRwOworCisJaGRwID0gZGF0YTsKKworCXN0YXR1cyA9IGFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KHJlcywgJmFkZHIpOworCisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCQlzaXplID0gYWRkci5tYXhfYWRkcmVzc19yYW5nZSAtIGFkZHIubWluX2FkZHJlc3NfcmFuZ2UgKyAxOworCQloZHAtPmhkX3BoeXNfYWRkcmVzcyA9IGFkZHIubWluX2FkZHJlc3NfcmFuZ2U7CisJCWhkcC0+aGRfYWRkcmVzcyA9IGlvcmVtYXAoYWRkci5taW5fYWRkcmVzc19yYW5nZSwgc2l6ZSk7CisKKwkJZm9yIChocGV0cCA9IGhwZXRzOyBocGV0cDsgaHBldHAgPSBocGV0cC0+aHBfbmV4dCkKKwkJCWlmIChocGV0cC0+aHBfaHBldCA9PSBoZHAtPmhkX2FkZHJlc3MpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwl9IGVsc2UgaWYgKHJlcy0+aWQgPT0gQUNQSV9SU1RZUEVfRVhUX0lSUSkgeworCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxICppcnFwOworCQlpbnQgaTsKKworCQlpcnFwID0gJnJlcy0+ZGF0YS5leHRlbmRlZF9pcnE7CisKKwkJaWYgKGlycXAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzID4gMCkgeworCQkJaGRwLT5oZF9uaXJxcyA9IGlycXAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzOworCisJCQlmb3IgKGkgPSAwOyBpIDwgaGRwLT5oZF9uaXJxczsgaSsrKQorCQkJCWhkcC0+aGRfaXJxW2ldID0KKwkJCQkgICAgYWNwaV9yZWdpc3Rlcl9nc2koaXJxcC0+aW50ZXJydXB0c1tpXSwKKwkJCQkJCSAgICAgIGlycXAtPmVkZ2VfbGV2ZWwsCisJCQkJCQkgICAgICBpcnFwLT5hY3RpdmVfaGlnaF9sb3cpOworCQl9CisJfQorCisJcmV0dXJuIEFFX09LOworfQorCitzdGF0aWMgaW50IGhwZXRfYWNwaV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJYWNwaV9zdGF0dXMgcmVzdWx0OworCXN0cnVjdCBocGV0X2RhdGEgZGF0YTsKKworCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKworCXJlc3VsdCA9CisJICAgIGFjcGlfd2Fsa19yZXNvdXJjZXMoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCisJCQkJaHBldF9yZXNvdXJjZXMsICZkYXRhKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUocmVzdWx0KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWRhdGEuaGRfYWRkcmVzcyB8fCAhZGF0YS5oZF9uaXJxcykgeworCQlwcmludGsoIiVzOiBubyBhZGRyZXNzIG9yIGlycXMgaW4gX0NSU1xuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIGhwZXRfYWxsb2MoJmRhdGEpOworfQorCitzdGF0aWMgaW50IGhwZXRfYWNwaV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQoreworCS8qIFhYWCBuZWVkIHRvIHVucmVnaXN0ZXIgaW50ZXJwb2xhdG9yLCBkZWFsbG9jIG1lbSwgZXRjICovCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgaHBldF9hY3BpX2RyaXZlciA9IHsKKwkubmFtZSA9ICJocGV0IiwKKwkuaWRzID0gIlBOUDAxMDMiLAorCS5vcHMgPSB7CisJCS5hZGQgPSBocGV0X2FjcGlfYWRkLAorCQkucmVtb3ZlID0gaHBldF9hY3BpX3JlbW92ZSwKKwkJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBocGV0X21pc2MgPSB7IEhQRVRfTUlOT1IsICJocGV0IiwgJmhwZXRfZm9wcyB9OworCitzdGF0aWMgaW50IF9faW5pdCBocGV0X2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gbWlzY19yZWdpc3RlcigmaHBldF9taXNjKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzeXNjdGxfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGRldl9yb290LCAwKTsKKworCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmaHBldF9hY3BpX2RyaXZlcik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJaWYgKHN5c2N0bF9oZWFkZXIpCisJCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShzeXNjdGxfaGVhZGVyKTsKKwkJbWlzY19kZXJlZ2lzdGVyKCZocGV0X21pc2MpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaHBldF9leGl0KHZvaWQpCit7CisJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmhwZXRfYWNwaV9kcml2ZXIpOworCisJaWYgKHN5c2N0bF9oZWFkZXIpCisJCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN5c2N0bF9oZWFkZXIpOworCW1pc2NfZGVyZWdpc3RlcigmaHBldF9taXNjKTsKKworCXJldHVybjsKK30KKworbW9kdWxlX2luaXQoaHBldF9pbml0KTsKK21vZHVsZV9leGl0KGhwZXRfZXhpdCk7CitNT0RVTEVfQVVUSE9SKCJCb2IgUGljY28gPFJvYmVydC5QaWNjb0BocC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYyBiL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Y2Q4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwpAQCAtMCwwICsxLDgzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+LCBJQk0KKyAqIENvcHlyaWdodCAoQykgMjAwMSBQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQGF1LmlibS5jb20+LCBJQk0KKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+LCBJQk0gQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBBZGRpdGlvbmFsIEF1dGhvcihzKToKKyAqICBSeWFuIFMuIEFybm9sZCA8cnNhQHVzLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2JkX2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9odmNvbnNvbGUuaD4KKyNpbmNsdWRlIDxhc20vdmlvLmg+CisKKyNkZWZpbmUgSFZDX01BSk9SCTIyOQorI2RlZmluZSBIVkNfTUlOT1IJMAorCisjZGVmaW5lIFRJTUVPVVQJCSgxMCkKKworLyoKKyAqIFdhaXQgdGhpcyBsb25nIHBlciBpdGVyYXRpb24gd2hpbGUgdHJ5aW5nIHRvIHB1c2ggYnVmZmVyZWQgZGF0YSB0byB0aGUKKyAqIGh5cGVydmlzb3IgYmVmb3JlIGFsbG93aW5nIHRoZSB0dHkgdG8gY29tcGxldGUgYSBjbG9zZSBvcGVyYXRpb24uCisgKi8KKyNkZWZpbmUgSFZDX0NMT1NFX1dBSVQgKEhaLzEwMCkgLyogMS8xMCBvZiBhIHNlY29uZCAqLworCisvKgorICogVGhlIExpbnV4IFRUWSBjb2RlIGRvZXMgbm90IHN1cHBvcnQgZHluYW1pYyBhZGRpdGlvbiBvZiB0dHkgZGVyaXZlZCBkZXZpY2VzCisgKiBzbyB3ZSBuZWVkIHRvIGtub3cgaG93IG1hbnkgdHR5IGRldmljZXMgd2UgbWlnaHQgbmVlZCB3aGVuIHNwYWNlIGlzIGFsbG9jYXRlZAorICogZm9yIHRoZSB0dHkgZGV2aWNlLiAgU2luY2UgdGhpcyBkcml2ZXIgc3VwcG9ydHMgaG90cGx1ZyBvZiB2dHkgYWRhcHRlcnMgd2UKKyAqIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIGFsbG9jYXRlZC4KKyAqLworI2RlZmluZSBIVkNfQUxMT0NfVFRZX0FEQVBURVJTCTgKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpodmNfZHJpdmVyOworI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQorc3RhdGljIGludCBzeXNycV9wcmVzc2VkOworI2VuZGlmCisKKyNkZWZpbmUgTl9PVVRCVUYJMTYKKyNkZWZpbmUgTl9JTkJVRgkJMTYKKworI2RlZmluZSBfX0FMSUdORURfXwlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg4KSkpCisKK3N0cnVjdCBodmNfc3RydWN0IHsKKwlzcGlubG9ja190IGxvY2s7CisJaW50IGluZGV4OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgaW50IGNvdW50OworCWludCBkb193YWtldXA7CisJY2hhciBvdXRidWZbTl9PVVRCVUZdIF9fQUxJR05FRF9fOworCWludCBuX291dGJ1ZjsKKwl1aW50MzJfdCB2dGVybW5vOworCWludCBpcnFfcmVxdWVzdGVkOworCWludCBpcnE7CisJc3RydWN0IGxpc3RfaGVhZCBuZXh0OworCXN0cnVjdCBrb2JqZWN0IGtvYmo7IC8qIHJlZiBjb3VudCAmIGh2Y19zdHJ1Y3QgbGlmZXRpbWUgKi8KKwlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKK307CisKKy8qIGR5bmFtaWMgbGlzdCBvZiBodmNfc3RydWN0IGluc3RhbmNlcyAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaHZjX3N0cnVjdHMgPSBMSVNUX0hFQURfSU5JVChodmNfc3RydWN0cyk7CisKKy8qCisgKiBQcm90ZWN0IHRoZSBsaXN0IG9mIGh2Y19zdHJ1Y3QgaW5zdGFuY2VzIGZyb20gaW5zZXJ0cyBhbmQgcmVtb3ZhbHMgZHVyaW5nCisgKiBsaXN0IHRyYXZlcnNhbC4KKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhodmNfc3RydWN0c19sb2NrKTsKKworLyoKKyAqIEluaXRpYWwgY29uc29sZSB2dGVybW5vcyBmb3IgY29uc29sZSBBUEkgdXNhZ2UgcHJpb3IgdG8gZnVsbCBjb25zb2xlCisgKiBpbml0aWFsaXphdGlvbi4gIEFueSB2dHkgYWRhcHRlciBvdXRzaWRlIHRoaXMgcmFuZ2Ugd2lsbCBub3QgaGF2ZSB1c2FibGUKKyAqIGNvbnNvbGUgaW50ZXJmYWNlcyBidXQgY2FuIHN0aWxsIGJlIHVzZWQgYXMgYSB0dHkgZGV2aWNlLiAgVGhpcyBoYXMgdG8gYmUKKyAqIHN0YXRpYyBiZWNhdXNlIGttYWxsb2Mgd2lsbCBub3Qgd29yayBkdXJpbmcgZWFybHkgY29uc29sZSBpbml0LgorICovCitzdGF0aWMgdWludDMyX3QgdnRlcm1ub3NbTUFYX05SX0hWQ19DT05TT0xFU107CisKKy8qIFVzZWQgZm9yIGFjY291bnRpbmcgcHVycG9zZXMgKi8KK3N0YXRpYyBpbnQgbnVtX3Z0ZXJtcyA9IDA7CisKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmh2Y190YXNrOworCisvKgorICogVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGFzc29jaWF0ZSBhIHR0eS0+aW5kZXggdmFsdWUgdG8gYSBodmNfc3RydWN0IGJhc2VkCisgKiB1cG9uIG9yZGVyIG9mIGV4cG9zdXJlIHZpYSBodmNfcHJvYmUoKS4KKyAqLworc3RhdGljIGludCBodmNfY291bnQgPSAtMTsKKworLyogUGlja3MgdXAgbGF0ZSBraWNrcyBhZnRlciBsaXN0IHdhbGsgYnV0IGJlZm9yZSBzY2hlZHVsZSgpICovCitzdGF0aWMgaW50IGh2Y19raWNrZWQ7CisKKy8qIFdha2UgdGhlIHNsZWVwaW5nIGtodmNkICovCitzdGF0aWMgdm9pZCBodmNfa2ljayh2b2lkKQoreworCWh2Y19raWNrZWQgPSAxOworCXdha2VfdXBfcHJvY2VzcyhodmNfdGFzayk7Cit9CisKKy8qCisgKiBOT1RFOiBUaGlzIEFQSSBpc24ndCB1c2VkIGlmIHRoZSBjb25zb2xlIGFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0IGludGVycnVwdHMuCisgKiBJbiB0aGlzIGNhc2UgdGhlIGNvbnNvbGUgaXMgcG9sbCBkcml2ZW4uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBodmNfaGFuZGxlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWh2Y19raWNrKCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBodmNfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWh2Y19raWNrKCk7Cit9CisKKy8qCisgKiBEbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggZWl0aGVyIHRoZSBodmNfc3RydWNzdF9sb2NrIG9yIHRoZSBodmNfc3RydWN0CisgKiBsb2NrIGhlbGQuICBJZiBzdWNjZXNzZnVsLCB0aGlzIGZ1bmN0aW9uIGluY3JlbWVudHMgdGhlIGtvYmplY3QgcmVmZXJlbmNlCisgKiBjb3VudCBhZ2FpbnN0IHRoZSB0YXJnZXQgaHZjX3N0cnVjdCBzbyBpdCBzaG91bGQgYmUgcmVsZWFzZWQgd2hlbiBmaW5pc2hlZC4KKyAqLworc3RydWN0IGh2Y19zdHJ1Y3QgKmh2Y19nZXRfYnlfaW5kZXgoaW50IGluZGV4KQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrKCZodmNfc3RydWN0c19sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaHAsICZodmNfc3RydWN0cywgbmV4dCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGhwLT5pbmRleCA9PSBpbmRleCkgeworCQkJa29iamVjdF9nZXQoJmhwLT5rb2JqKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisJCQlzcGluX3VubG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CisJCQlyZXR1cm4gaHA7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwl9CisJaHAgPSBOVUxMOworCisJc3Bpbl91bmxvY2soJmh2Y19zdHJ1Y3RzX2xvY2spOworCXJldHVybiBocDsKK30KKworLyoKKyAqIFRoZSBUVFkgaW50ZXJmYWNlIHdvbid0IGJlIHVzZWQgdW50aWwgYWZ0ZXIgdGhlIHZpbyBsYXllciBoYXMgZXhwb3NlZCB0aGUgdnR5CisgKiBhZGFwdGVyIHRvIHRoZSBrZXJuZWwuCisgKi8KK3N0YXRpYyBpbnQgaHZjX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpcnEgPSBOT19JUlE7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3Qga29iamVjdCAqa29ianA7CisKKwkvKiBBdXRvIGluY3JlbWVudHMga29iamVjdCByZWZlcmVuY2UgaWYgZm91bmQuICovCisJaWYgKCEoaHAgPSBodmNfZ2V0X2J5X2luZGV4KHR0eS0+aW5kZXgpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJodmNfY29uc29sZTogdHR5IG9wZW4gZmFpbGVkLCBubyB2dHkgYXNzb2NpYXRlZCB3aXRoIHR0eS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkvKiBDaGVjayBhbmQgdGhlbiBpbmNyZW1lbnQgZm9yIGZhc3QgcGF0aCBvcGVuLiAqLworCWlmIChocC0+Y291bnQrKyA+IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkJaHZjX2tpY2soKTsKKwkJcmV0dXJuIDA7CisJfSAvKiBlbHNlIGNvdW50ID09IDAgKi8KKworCXR0eS0+ZHJpdmVyX2RhdGEgPSBocDsKKwlocC0+dHR5ID0gdHR5OworCS8qIFNhdmUgZm9yIHJlcXVlc3RfaXJxIG91dHNpZGUgb2Ygc3Bpbl9sb2NrLiAqLworCWlycSA9IGhwLT5pcnE7CisJaWYgKGlycSAhPSBOT19JUlEpCisJCWhwLT5pcnFfcmVxdWVzdGVkID0gMTsKKworCWtvYmpwID0gJmhwLT5rb2JqOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkvKiBjaGVjayBlcnJvciwgZmFsbGJhY2sgdG8gbm9uLWlycSAqLworCWlmIChpcnEgIT0gTk9fSVJRKQorCQlyYyA9IHJlcXVlc3RfaXJxKGlycSwgaHZjX2hhbmRsZV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgImh2Y19jb25zb2xlIiwgaHApOworCisJLyoKKwkgKiBJZiB0aGUgcmVxdWVzdF9pcnEoKSBmYWlscyBhbmQgd2UgcmV0dXJuIGFuIGVycm9yLiAgVGhlIHR0eSBsYXllcgorCSAqIHdpbGwgY2FsbCBodmNfY2xvc2UoKSBhZnRlciBhIGZhaWxlZCBvcGVuIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNsZWFuCisJICogdXAgdGhlcmUgc28gd2UnbGwgY2xlYW4gdXAgaGVyZSBhbmQgY2xlYXIgb3V0IHRoZSBwcmV2aW91c2x5IHNldAorCSAqIHR0eSBmaWVsZHMgYW5kIHJldHVybiB0aGUga29iamVjdCByZWZlcmVuY2UuCisJICovCisJaWYgKHJjKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCQlocC0+dHR5ID0gTlVMTDsKKwkJaHAtPmlycV9yZXF1ZXN0ZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKKwkJa29iamVjdF9wdXQoa29ianApOworCQlwcmludGsoS0VSTl9FUlIgImh2Y19vcGVuOiByZXF1ZXN0X2lycSBmYWlsZWQgd2l0aCByYyAlZC5cbiIsIHJjKTsKKwl9CisJLyogRm9yY2Ugd2FrZXVwIG9mIHRoZSBwb2xsaW5nIHRocmVhZCAqLworCWh2Y19raWNrKCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGh2Y19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGh2Y19zdHJ1Y3QgKmhwOworCXN0cnVjdCBrb2JqZWN0ICprb2JqcDsKKwlpbnQgaXJxID0gTk9fSVJROworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBObyBkcml2ZXJfZGF0YSBtZWFucyB0aGF0IHRoaXMgY2xvc2Ugd2FzIGlzc3VlZCBhZnRlciBhIGZhaWxlZAorCSAqIGh2Y19vcGVuIGJ5IHRoZSB0dHkgbGF5ZXIncyByZWxlYXNlX2RldigpIGZ1bmN0aW9uIGFuZCB3ZSBjYW4ganVzdAorCSAqIGV4aXQgY2xlYW5seSBiZWNhdXNlIHRoZSBrb2JqZWN0IHJlZmVyZW5jZSB3YXNuJ3QgbWFkZS4KKwkgKi8KKwlpZiAoIXR0eS0+ZHJpdmVyX2RhdGEpCisJCXJldHVybjsKKworCWhwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCWtvYmpwID0gJmhwLT5rb2JqOworCWlmICgtLWhwLT5jb3VudCA9PSAwKSB7CisJCWlmIChocC0+aXJxX3JlcXVlc3RlZCkKKwkJCWlycSA9IGhwLT5pcnE7CisJCWhwLT5pcnFfcmVxdWVzdGVkID0gMDsKKworCQkvKiBXZSBhcmUgZG9uZSB3aXRoIHRoZSB0dHkgcG9pbnRlciBub3cuICovCisJCWhwLT50dHkgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJCS8qCisJCSAqIENoYWluIGNhbGxzIGNoYXJzX2luX2J1ZmZlcigpIGFuZCByZXR1cm5zIGltbWVkaWF0ZWx5IGlmCisJCSAqIHRoZXJlIGlzIG5vIGJ1ZmZlcmVkIGRhdGEgb3RoZXJ3aXNlIHNsZWVwcyBvbiBhIHdhaXQgcXVldWUKKwkJICogd2FraW5nIHBlcmlvZGljYWxseSB0byBjaGVjayBjaGFyc19pbl9idWZmZXIoKS4KKwkJICovCisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBIVkNfQ0xPU0VfV0FJVCk7CisKKwkJaWYgKGlycSAhPSBOT19JUlEpCisJCQlmcmVlX2lycShpcnEsIGhwKTsKKworCX0gZWxzZSB7CisJCWlmIChocC0+Y291bnQgPCAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJodmNfY2xvc2UgJVg6IG9vcHMsIGNvdW50IGlzICVkXG4iLAorCQkJCWhwLT52dGVybW5vLCBocC0+Y291bnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCX0KKworCWtvYmplY3RfcHV0KGtvYmpwKTsKK30KKworc3RhdGljIHZvaWQgaHZjX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaXJxID0gTk9fSVJROworCWludCB0ZW1wX29wZW5fY291bnQ7CisJc3RydWN0IGtvYmplY3QgKmtvYmpwOworCisJaWYgKCFocCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFRoZSBOX1RUWSBsaW5lIGRpc2NpcGxpbmUgaGFzIHByb2JsZW1zIHN1Y2ggdGhhdCBpbiBhIGNsb3NlIHZzCisJICogb3Blbi0+aGFuZ3VwIGNhc2UgdGhpcyBjYW4gYmUgY2FsbGVkIGFmdGVyIHRoZSBmaW5hbCBjbG9zZSBzbyBwcmV2ZW50CisJICogdGhhdCBmcm9tIGhhcHBlbmluZyBmb3Igbm93LgorCSAqLworCWlmIChocC0+Y291bnQgPD0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJa29ianAgPSAmaHAtPmtvYmo7CisJdGVtcF9vcGVuX2NvdW50ID0gaHAtPmNvdW50OworCWhwLT5jb3VudCA9IDA7CisJaHAtPm5fb3V0YnVmID0gMDsKKwlocC0+dHR5ID0gTlVMTDsKKwlpZiAoaHAtPmlycV9yZXF1ZXN0ZWQpCisJCS8qIFNhdmVkIGZvciB1c2Ugb3V0c2lkZSBvZiBzcGluX2xvY2suICovCisJCWlycSA9IGhwLT5pcnE7CisJaHAtPmlycV9yZXF1ZXN0ZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisJaWYgKGlycSAhPSBOT19JUlEpCisJCWZyZWVfaXJxKGlycSwgaHApOworCXdoaWxlKHRlbXBfb3Blbl9jb3VudCkgeworCQktLXRlbXBfb3Blbl9jb3VudDsKKwkJa29iamVjdF9wdXQoa29ianApOworCX0KK30KKworLyoKKyAqIFB1c2ggYnVmZmVyZWQgY2hhcmFjdGVycyB3aGV0aGVyIHRoZXkgd2VyZSBqdXN0IHJlY2VudGx5IGJ1ZmZlcmVkIG9yIHdhaXRpbmcKKyAqIG9uIGEgYmxvY2tlZCBoeXBlcnZpc29yLiAgQ2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggaHAtPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQgaHZjX3B1c2goc3RydWN0IGh2Y19zdHJ1Y3QgKmhwKQoreworCWludCBuOworCisJbiA9IGh2Y19wdXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIGhwLT5vdXRidWYsIGhwLT5uX291dGJ1Zik7CisJaWYgKG4gPD0gMCkgeworCQlpZiAobiA9PSAwKQorCQkJcmV0dXJuOworCQkvKiB0aHJvdyBhd2F5IG91dHB1dCBvbiBlcnJvcjsgdGhpcyBoYXBwZW5zIHdoZW4KKwkJICAgdGhlcmUgaXMgbm8gc2Vzc2lvbiBjb25uZWN0ZWQgdG8gdGhlIHZ0ZXJtLiAqLworCQlocC0+bl9vdXRidWYgPSAwOworCX0gZWxzZQorCQlocC0+bl9vdXRidWYgLT0gbjsKKwlpZiAoaHAtPm5fb3V0YnVmID4gMCkKKwkJbWVtbW92ZShocC0+b3V0YnVmLCBocC0+b3V0YnVmICsgbiwgaHAtPm5fb3V0YnVmKTsKKwllbHNlCisJCWhwLT5kb193YWtldXAgPSAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2h2Y193cml0ZV9rZXJuZWwoc3RydWN0IGh2Y19zdHJ1Y3QgKmhwLAorCQkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJzaXplLCB3cml0dGVuID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCisJLyogUHVzaCBwZW5kaW5nIHdyaXRlcyAqLworCWlmIChocC0+bl9vdXRidWYgPiAwKQorCQlodmNfcHVzaChocCk7CisKKwl3aGlsZSAoY291bnQgPiAwICYmIChyc2l6ZSA9IE5fT1VUQlVGIC0gaHAtPm5fb3V0YnVmKSA+IDApIHsKKwkJaWYgKHJzaXplID4gY291bnQpCisJCQlyc2l6ZSA9IGNvdW50OworCQltZW1jcHkoaHAtPm91dGJ1ZiArIGhwLT5uX291dGJ1ZiwgYnVmLCByc2l6ZSk7CisJCWNvdW50IC09IHJzaXplOworCQlidWYgKz0gcnNpemU7CisJCWhwLT5uX291dGJ1ZiArPSByc2l6ZTsKKwkJd3JpdHRlbiArPSByc2l6ZTsKKwkJaHZjX3B1c2goaHApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHdyaXR0ZW47Cit9CitzdGF0aWMgaW50IGh2Y193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWludCB3cml0dGVuOworCisJLyogVGhpcyB3cml0ZSB3YXMgcHJvYmFibHkgZXhlY3V0ZWQgZHVyaW5nIGEgdHR5IGNsb3NlLiAqLworCWlmICghaHApCisJCXJldHVybiAtRVBJUEU7CisKKwlpZiAoaHAtPmNvdW50IDw9IDApCisJCXJldHVybiAtRUlPOworCisJd3JpdHRlbiA9IF9faHZjX3dyaXRlX2tlcm5lbChocCwgYnVmLCBjb3VudCk7CisKKwkvKgorCSAqIFJhY3ksIGJ1dCBoYXJtbGVzcywga2ljayB0aHJlYWQgaWYgdGhlcmUgaXMgc3RpbGwgcGVuZGluZyBkYXRhLgorCSAqIFRoZXJlIHJlYWxseSBpcyBub3RoaW5nIHdyb25nIHdpdGgga2lja2luZyB0aGUgdGhyZWFkLCBldmVuIGlmIHRoZXJlCisJICogaXMgbm8gYnVmZmVyZWQgZGF0YS4KKwkgKi8KKwlpZiAoaHAtPm5fb3V0YnVmKQorCQlodmNfa2ljaygpOworCisJcmV0dXJuIHdyaXR0ZW47Cit9CisKKy8qCisgKiBUaGlzIGlzIGFjdHVhbGx5IGEgY29udHJhY3QgYmV0d2VlbiB0aGUgZHJpdmVyIGFuZCB0aGUgdHR5IGxheWVyIG91dGxpbmluZworICogaG93IG11Y2ggd3JpdGUgcm9vbSB0aGUgZHJpdmVyIGNhbiBndWFyZW50ZWUgd2lsbCBiZSBzZW50IE9SIEJVRkZFUkVELiAgVGhpcworICogZHJpdmVyIE1VU1QgaG9ub3IgdGhlIHJldHVybiB2YWx1ZS4KKyAqLworc3RhdGljIGludCBodmNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIWhwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gTl9PVVRCVUYgLSBocC0+bl9vdXRidWY7Cit9CisKK3N0YXRpYyBpbnQgaHZjX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIWhwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGhwLT5uX291dGJ1ZjsKK30KKworI2RlZmluZSBIVkNfUE9MTF9SRUFECTB4MDAwMDAwMDEKKyNkZWZpbmUgSFZDX1BPTExfV1JJVEUJMHgwMDAwMDAwMgorI2RlZmluZSBIVkNfUE9MTF9RVUlDSwkweDAwMDAwMDA0CisKK3N0YXRpYyBpbnQgaHZjX3BvbGwoc3RydWN0IGh2Y19zdHJ1Y3QgKmhwKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IGksIG4sIHBvbGxfbWFzayA9IDA7CisJY2hhciBidWZbTl9JTkJVRl0gX19BTElHTkVEX187CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVhZF90b3RhbCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIFB1c2ggcGVuZGluZyB3cml0ZXMgKi8KKwlpZiAoaHAtPm5fb3V0YnVmID4gMCkKKwkJaHZjX3B1c2goaHApOworCS8qIFJlc2NoZWR1bGUgdXMgaWYgc3RpbGwgc29tZSB3cml0ZSBwZW5kaW5nICovCisJaWYgKGhwLT5uX291dGJ1ZiA+IDApCisJCXBvbGxfbWFzayB8PSBIVkNfUE9MTF9XUklURTsKKworCS8qIE5vIHR0eSBhdHRhY2hlZCwganVzdCBza2lwICovCisJdHR5ID0gaHAtPnR0eTsKKwlpZiAodHR5ID09IE5VTEwpCisJCWdvdG8gYmFpbDsKKworCS8qIE5vdyBjaGVjayBpZiB3ZSBjYW4gZ2V0IGRhdGEgKGFyZSB3ZSB0aHJvdHRsZWQgPykgKi8KKwlpZiAodGVzdF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpKQorCQlnb3RvIHRocm90dGxlZDsKKworCS8qIElmIHdlIGFyZW4ndCBpbnRlcnJ1cHQgZHJpdmVuIGFuZCBhcmVuJ3QgdGhyb3R0bGVkLCB3ZSBhbHdheXMKKwkgKiByZXF1ZXN0IGEgcmVzY2hlZHVsZQorCSAqLworCWlmIChocC0+aXJxID09IE5PX0lSUSkKKwkJcG9sbF9tYXNrIHw9IEhWQ19QT0xMX1JFQUQ7CisKKwkvKiBSZWFkIGRhdGEgaWYgYW55ICovCisJZm9yICg7OykgeworCQlpbnQgY291bnQgPSBOX0lOQlVGOworCQlpZiAoY291bnQgPiAoVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudCkpCisJCQljb3VudCA9IFRUWV9GTElQQlVGX1NJWkUgLSB0dHktPmZsaXAuY291bnQ7CisKKwkJLyogSWYgZmxpcCBpcyBmdWxsLCBqdXN0IHJlc2NoZWR1bGUgYSBsYXRlciByZWFkICovCisJCWlmIChjb3VudCA9PSAwKSB7CisJCQlwb2xsX21hc2sgfD0gSFZDX1BPTExfUkVBRDsKKwkJCWJyZWFrOworCQl9CisKKwkJbiA9IGh2Y19nZXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIGJ1ZiwgY291bnQpOworCQlpZiAobiA8PSAwKSB7CisJCQkvKiBIYW5ndXAgdGhlIHR0eSB3aGVuIGRpc2Nvbm5lY3RlZCBmcm9tIGhvc3QgKi8KKwkJCWlmIChuID09IC1FUElQRSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisJCQkJdHR5X2hhbmd1cCh0dHkpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQorCQkJLyogSGFuZGxlIHRoZSBTeXNScSBIYWNrICovCisJCQlpZiAoYnVmW2ldID09ICdceDBmJykgewkvKiBeTyAtLSBzaG91bGQgc3VwcG9ydCBhIHNlcXVlbmNlICovCisJCQkJc3lzcnFfcHJlc3NlZCA9IDE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKHN5c3JxX3ByZXNzZWQpIHsKKwkJCQloYW5kbGVfc3lzcnEoYnVmW2ldLCBOVUxMLCB0dHkpOworCQkJCXN5c3JxX3ByZXNzZWQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8qIENPTkZJR19NQUdJQ19TWVNSUSAqLworCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBidWZbaV0sIDApOworCQl9CisKKwkJaWYgKHR0eS0+ZmxpcC5jb3VudCkKKwkJCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7CisKKwkJLyoKKwkJICogQWNjb3VudCBmb3IgdGhlIHRvdGFsIGFtb3VudCByZWFkIGluIG9uZSBsb29wLCBhbmQgaWYgYWJvdmUKKwkJICogNjQgYnl0ZXMsIHdlIGRvIGEgcXVpY2sgc2NoZWR1bGUgbG9vcCB0byBsZXQgdGhlIHR0eSBncm9rIHRoZQorCQkgKiBkYXRhIGFuZCBldmVudHVhbGx5IHRocm90dGxlIHVzLgorCQkgKi8KKwkJcmVhZF90b3RhbCArPSBuOworCQlpZiAocmVhZF90b3RhbCA+PSA2NCkgeworCQkJcG9sbF9tYXNrIHw9IEhWQ19QT0xMX1FVSUNLOworCQkJYnJlYWs7CisJCX0KKwl9CisgdGhyb3R0bGVkOgorCS8qIFdha2V1cCB3cml0ZSBxdWV1ZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoaHAtPmRvX3dha2V1cCkgeworCQlocC0+ZG9fd2FrZXVwID0gMDsKKwkJdHR5X3dha2V1cCh0dHkpOworCX0KKyBiYWlsOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcG9sbF9tYXNrOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfWE1PTikgJiYgZGVmaW5lZChDT05GSUdfU01QKQorZXh0ZXJuIGNwdW1hc2tfdCBjcHVzX2luX3htb247CisjZWxzZQorc3RhdGljIGNvbnN0IGNwdW1hc2tfdCBjcHVzX2luX3htb24gPSBDUFVfTUFTS19OT05FOworI2VuZGlmCisKKy8qCisgKiBUaGlzIGt0aHJlYWQgaXMgZWl0aGVyIHBvbGxpbmcgb3IgaW50ZXJydXB0IGRyaXZlbi4gIFRoaXMgaXMgZGV0ZXJtaW5lZCBieQorICogY2FsbGluZyBodmNfcG9sbCgpIHdobyBkZXRlcm1pbmVzIHdoZXRoZXIgYSBjb25zb2xlIGFkYXB0ZXIgc3VwcG9ydAorICogaW50ZXJydXB0cy4KKyAqLworaW50IGtodmNkKHZvaWQgKnVudXNlZCkKK3sKKwlpbnQgcG9sbF9tYXNrOworCXN0cnVjdCBodmNfc3RydWN0ICpocDsKKworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlkbyB7CisJCXBvbGxfbWFzayA9IDA7CisJCWh2Y19raWNrZWQgPSAwOworCQl3bWIoKTsKKwkJaWYgKGNwdXNfZW1wdHkoY3B1c19pbl94bW9uKSkgeworCQkJc3Bpbl9sb2NrKCZodmNfc3RydWN0c19sb2NrKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoaHAsICZodmNfc3RydWN0cywgbmV4dCkgeworCQkJCS8qaHAgPSBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBodmNfc3RydWN0LCAqIG5leHQpOyAqLworCQkJCXBvbGxfbWFzayB8PSBodmNfcG9sbChocCk7CisJCQl9CisJCQlzcGluX3VubG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CisJCX0gZWxzZQorCQkJcG9sbF9tYXNrIHw9IEhWQ19QT0xMX1JFQUQ7CisJCWlmIChodmNfa2lja2VkKQorCQkJY29udGludWU7CisJCWlmIChwb2xsX21hc2sgJiBIVkNfUE9MTF9RVUlDSykgeworCQkJeWllbGQoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICghaHZjX2tpY2tlZCkgeworCQkJaWYgKHBvbGxfbWFzayA9PSAwKQorCQkJCXNjaGVkdWxlKCk7CisJCQllbHNlCisJCQkJbXNsZWVwX2ludGVycnVwdGlibGUoVElNRU9VVCk7CisJCX0KKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgaHZjX29wcyA9IHsKKwkub3BlbiA9IGh2Y19vcGVuLAorCS5jbG9zZSA9IGh2Y19jbG9zZSwKKwkud3JpdGUgPSBodmNfd3JpdGUsCisJLmhhbmd1cCA9IGh2Y19oYW5ndXAsCisJLnVudGhyb3R0bGUgPSBodmNfdW50aHJvdHRsZSwKKwkud3JpdGVfcm9vbSA9IGh2Y193cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBodmNfY2hhcnNfaW5fYnVmZmVyLAorfTsKKworY2hhciBodmNfZHJpdmVyX25hbWVbXSA9ICJodmNfY29uc29sZSI7CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCBodmNfZHJpdmVyX3RhYmxlW10gX19kZXZpbml0ZGF0YT0geworCXsic2VyaWFsIiwgImh2dGVybTEifSwKKwl7IE5VTEwsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgaHZjX2RyaXZlcl90YWJsZSk7CisKKy8qIGNhbGxiYWNrIHdoZW4gdGhlIGtib2plY3QgcmVmIGNvdW50IHJlYWNoZXMgemVyby4gKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaHZjX3N0cnVjdChzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGh2Y19zdHJ1Y3QsIGtvYmopOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2soJmh2Y19zdHJ1Y3RzX2xvY2spOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJihocC0+bmV4dCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlzcGluX3VubG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CisKKwlrZnJlZShocCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGh2Y19rb2JqX3R5cGUgPSB7CisJLnJlbGVhc2UgPSBkZXN0cm95X2h2Y19zdHJ1Y3QsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBodmNfcHJvYmUoCisJCXN0cnVjdCB2aW9fZGV2ICpkZXYsCisJCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHA7CisKKwkvKiBwcm9iZWQgd2l0aCBpbnZhbGlkIHBhcmFtZXRlcnMuICovCisJaWYgKCFkZXYgfHwgIWlkKQorCQlyZXR1cm4gLUVQRVJNOworCisJaHAgPSBrbWFsbG9jKHNpemVvZigqaHApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChocCwgMHgwMCwgc2l6ZW9mKCpocCkpOworCWhwLT52dGVybW5vID0gZGV2LT51bml0X2FkZHJlc3M7CisJaHAtPnZkZXYgPSBkZXY7CisJaHAtPnZkZXYtPmRldi5kcml2ZXJfZGF0YSA9IGhwOworCWhwLT5pcnEgPSBkZXYtPmlycTsKKworCWtvYmplY3RfaW5pdCgmaHAtPmtvYmopOworCWhwLT5rb2JqLmt0eXBlID0gJmh2Y19rb2JqX3R5cGU7CisKKwlzcGluX2xvY2tfaW5pdCgmaHAtPmxvY2spOworCXNwaW5fbG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CisJaHAtPmluZGV4ID0gKytodmNfY291bnQ7CisJbGlzdF9hZGRfdGFpbCgmKGhwLT5uZXh0KSwgJmh2Y19zdHJ1Y3RzKTsKKwlzcGluX3VubG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgaHZjX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqZGV2KQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocCA9IGRldi0+ZGV2LmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGtvYmplY3QgKmtvYmpwOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwl0dHkgPSBocC0+dHR5OworCWtvYmpwID0gJmhwLT5rb2JqOworCisJaWYgKGhwLT5pbmRleCA8IE1BWF9OUl9IVkNfQ09OU09MRVMpCisJCXZ0ZXJtbm9zW2hwLT5pbmRleF0gPSAtMTsKKworCS8qIERvbid0IHdoYWNrIGhwLT5pcnEgYmVjYXVzZSB0dHlfaGFuZ3VwKCkgd2lsbCBuZWVkIHRvIGZyZWUgdGhlIGlycS4gKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFdlICdwdXQnIHRoZSBpbnN0YW5jZSB0aGF0IHdhcyBncmFiYmVkIHdoZW4gdGhlIGtvYmplY3QgaW5zdGFuY2UKKwkgKiB3YXMgaW50aWFsaXplZCB1c2luZyBrb2JqZWN0X2luaXQoKS4gIExldCB0aGUgbGFzdCBob2xkZXIgb2YgdGhpcworCSAqIGtvYmplY3QgY2F1c2UgaXQgdG8gYmUgcmVtb3ZlZCwgd2hpY2ggd2lsbCBwcm9iYWJseSBiZSB0aGUgdHR5X2hhbmd1cAorCSAqIGJlbG93LgorCSAqLworCWtvYmplY3RfcHV0KGtvYmpwKTsKKworCS8qCisJICogVGhpcyBmdW5jdGlvbiBjYWxsIHdpbGwgYXV0byBjaGFpbiBjYWxsIGh2Y19oYW5ndXAuICBUaGUgdHR5IHNob3VsZAorCSAqIGFsd2F5cyBiZSB2YWxpZCBhdCB0aGlzIHRpbWUgdW5sZXNzIGEgc2ltdWx0YW5lb3VzIHR0eSBjbG9zZSBhbHJlYWR5CisJICogY2xlYW5lZCB1cCB0aGUgaHZjX3N0cnVjdC4KKwkgKi8KKwlpZiAodHR5KQorCQl0dHlfaGFuZ3VwKHR0eSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciBodmNfdmlvX2RyaXZlciA9IHsKKwkubmFtZQkJPSBodmNfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlCT0gaHZjX2RyaXZlcl90YWJsZSwKKwkucHJvYmUJCT0gaHZjX3Byb2JlLAorCS5yZW1vdmUJCT0gaHZjX3JlbW92ZSwKK307CisKKy8qIERyaXZlciBpbml0aWFsaXphdGlvbi4gIEZvbGxvdyBjb25zb2xlIGluaXRpYWxpemF0aW9uLiAgVGhpcyBpcyB3aGVyZSB0aGUgVFRZCisgKiBpbnRlcmZhY2VzIHN0YXJ0IHRvIGJlY29tZSBhdmFpbGFibGUuICovCitpbnQgX19pbml0IGh2Y19pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJLyogV2UgbmVlZCBtb3JlIHRoYW4gbnVtX3Z0ZXJtcyBhZGFwdGVycyBkdWUgdG8gaG90cGx1ZyBhZGRpdGlvbnMuICovCisJaHZjX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoSFZDX0FMTE9DX1RUWV9BREFQVEVSUyk7CisJLyogaHZjX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIobnVtX3Z0ZXJtcyk7ICovCisJaWYgKCFodmNfZHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWh2Y19kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJaHZjX2RyaXZlci0+ZGV2ZnNfbmFtZSA9ICJodmMvIjsKKwlodmNfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJodmMiOworCWh2Y19kcml2ZXItPm5hbWUgPSAiaHZjIjsKKwlodmNfZHJpdmVyLT5tYWpvciA9IEhWQ19NQUpPUjsKKwlodmNfZHJpdmVyLT5taW5vcl9zdGFydCA9IEhWQ19NSU5PUjsKKwlodmNfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NZU1RFTTsKKwlodmNfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJaHZjX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhodmNfZHJpdmVyLCAmaHZjX29wcyk7CisKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihodmNfZHJpdmVyKSkKKwkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIGh2YyBjb25zb2xlIGRyaXZlclxuIik7CisKKwkvKiBBbHdheXMgc3RhcnQgdGhlIGt0aHJlYWQgYmVjYXVzZSB0aGVyZSBjYW4gYmUgaG90cGx1ZyB2dHkgYWRhcHRlcnMKKwkgKiBhZGRlZCBsYXRlci4gKi8KKwlodmNfdGFzayA9IGt0aHJlYWRfcnVuKGtodmNkLCBOVUxMLCAia2h2Y2QiKTsKKwlpZiAoSVNfRVJSKGh2Y190YXNrKSkgeworCQlwYW5pYygiQ291bGRuJ3QgY3JlYXRlIGt0aHJlYWQgZm9yIGNvbnNvbGUuXG4iKTsKKwkJcHV0X3R0eV9kcml2ZXIoaHZjX2RyaXZlcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFJlZ2lzdGVyIGFzIGEgdmlvIGRldmljZSB0byByZWNlaXZlIGNhbGxiYWNrcyAqLworCXJjID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmaHZjX3Zpb19kcml2ZXIpOworCisJcmV0dXJuIHJjOworfQorCisvKiBUaGlzIGlzbid0IHBhcnRpY3VsYXJpbHkgbmVjZXNzYXJ5IGR1ZSB0byB0aGlzIGJlaW5nIGEgY29uc29sZSBkcml2ZXIgYnV0IGl0CisgKiBpcyBuaWNlIHRvIGJlIHRob3JvdWdoICovCitzdGF0aWMgdm9pZCBfX2V4aXQgaHZjX2V4aXQodm9pZCkKK3sKKwlrdGhyZWFkX3N0b3AoaHZjX3Rhc2spOworCisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZodmNfdmlvX2RyaXZlcik7CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGh2Y19kcml2ZXIpOworCS8qIHJldHVybiB0dHlfc3RydWN0IGluc3RhbmNlcyBhbGxvY2F0ZWQgaW4gaHZjX2luaXQoKS4gKi8KKwlwdXRfdHR5X2RyaXZlcihodmNfZHJpdmVyKTsKK30KKworLyoKKyAqIENvbnNvbGUgQVBJcywgTk9UIFRUWS4gIFRoZXNlIEFQSXMgYXJlIGF2YWlsYWJsZSBpbW1lZGlhdGVseSB3aGVuCisgKiBodmNfY29uc29sZV9zZXR1cCgpIGZpbmRzIGFkYXB0ZXJzLgorICovCisKKy8qCisgKiBodmNfaW5zdGFudGlhdGUoKSBpcyBhbiBlYXJseSBjb25zb2xlIGRpc2NvdmVyeSBtZXRob2Qgd2hpY2ggbG9jYXRlcyBjb25zb2xlcworICogcHJpb3IgdG8gdGhlIHZpbyBzdWJzeXN0ZW0gZGlzY292ZXJpbmcgdGhlbS4gIEhvdHBsdWdnZWQgdnR5IGFkYXB0ZXJzIGRvIE5PVAorICogZ2V0IGFuIGh2Y19pbnN0YW50aWF0ZSgpIGNhbGxiYWNrIHNpbmNlIHRoZSBhcHBlYXIgYWZ0ZXIgZWFybHkgY29uc29sZSBpbml0LgorICovCitpbnQgaHZjX2luc3RhbnRpYXRlKHVpbnQzMl90IHZ0ZXJtbm8sIGludCBpbmRleCkKK3sKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9OUl9IVkNfQ09OU09MRVMpCisJCXJldHVybiAtMTsKKworCWlmICh2dGVybW5vc1tpbmRleF0gIT0gLTEpCisJCXJldHVybiAtMTsKKworCXZ0ZXJtbm9zW2luZGV4XSA9IHZ0ZXJtbm87CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaHZjX2NvbnNvbGVfcHJpbnQoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpiLCB1bnNpZ25lZCBjb3VudCkKK3sKKwljaGFyIGNbMTZdIF9fQUxJR05FRF9fOworCXVuc2lnbmVkIGkgPSAwLCBuID0gMDsKKwlpbnQgciwgZG9uZWNyID0gMDsKKworCS8qIENvbnNvbGUgYWNjZXNzIGF0dGVtcHQgb3V0c2lkZSBvZiBhY2NlcHRhYmxlIGNvbnNvbGUgcmFuZ2UuICovCisJaWYgKGNvLT5pbmRleCA+PSBNQVhfTlJfSFZDX0NPTlNPTEVTKQorCQlyZXR1cm47CisKKwkvKiBUaGlzIGNvbnNvbGUgYWRhcHRlciB3YXMgcmVtb3ZlZCBzbyBpdCBpcyBub3QgdXNlYWJsZS4gKi8KKwlpZiAodnRlcm1ub3NbY28tPmluZGV4XSA8IDApCisJCXJldHVybjsKKworCXdoaWxlIChjb3VudCA+IDAgfHwgaSA+IDApIHsKKwkJaWYgKGNvdW50ID4gMCAmJiBpIDwgc2l6ZW9mKGMpKSB7CisJCQlpZiAoYltuXSA9PSAnXG4nICYmICFkb25lY3IpIHsKKwkJCQljW2krK10gPSAnXHInOworCQkJCWRvbmVjciA9IDE7CisJCQl9IGVsc2UgeworCQkJCWNbaSsrXSA9IGJbbisrXTsKKwkJCQlkb25lY3IgPSAwOworCQkJCS0tY291bnQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyID0gaHZjX3B1dF9jaGFycyh2dGVybW5vc1tjby0+aW5kZXhdLCBjLCBpKTsKKwkJCWlmIChyIDwgMCkgeworCQkJCS8qIHRocm93IGF3YXkgY2hhcnMgb24gZXJyb3IgKi8KKwkJCQlpID0gMDsKKwkJCX0gZWxzZSBpZiAociA+IDApIHsKKwkJCQlpIC09IHI7CisJCQkJaWYgKGkgPiAwKQorCQkJCQltZW1tb3ZlKGMsIGMrciwgaSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqaHZjX2NvbnNvbGVfZGV2aWNlKHN0cnVjdCBjb25zb2xlICpjLCBpbnQgKmluZGV4KQoreworCSppbmRleCA9IGMtPmluZGV4OworCXJldHVybiBodmNfZHJpdmVyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBodmNfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjb25zb2xlIGh2Y19jb25fZHJpdmVyID0geworCS5uYW1lCQk9ICJodmMiLAorCS53cml0ZQkJPSBodmNfY29uc29sZV9wcmludCwKKwkuZGV2aWNlCQk9IGh2Y19jb25zb2xlX2RldmljZSwKKwkuc2V0dXAJCT0gaHZjX2NvbnNvbGVfc2V0dXAsCisJLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXgJCT0gLTEsCit9OworCisvKiBFYXJseSBjb25zb2xlIGluaXRpYWxpemF0aW9uLiAgUHJlY2VlZHMgZHJpdmVyIGluaXRpYWxpemF0aW9uLiAqLworc3RhdGljIGludCBfX2luaXQgaHZjX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8TUFYX05SX0hWQ19DT05TT0xFUzsgaSsrKQorCQl2dGVybW5vc1tpXSA9IC0xOworCW51bV92dGVybXMgPSBodmNfZmluZF92dHlzKCk7CisJcmVnaXN0ZXJfY29uc29sZSgmaHZjX2Nvbl9kcml2ZXIpOworCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChodmNfY29uc29sZV9pbml0KTsKKworbW9kdWxlX2luaXQoaHZjX2luaXQpOworbW9kdWxlX2V4aXQoaHZjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y3MuYyBiL2RyaXZlcnMvY2hhci9odmNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmYmRjZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9odmNzLmMKQEAgLTAsMCArMSwxNjQ5IEBACisvKgorICogSUJNIGVTZXJ2ZXIgSHlwZXJ2aXNvciBWaXJ0dWFsIENvbnNvbGUgU2VydmVyIERldmljZSBEcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBJQk0gQ29ycC4KKyAqICBSeWFuIFMuIEFybm9sZCAocnNhQHVzLmlibS5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBBdXRob3IocykgOiAgUnlhbiBTLiBBcm5vbGQgPHJzYUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgaXMgdGhlIGRldmljZSBkcml2ZXIgZm9yIHRoZSBJQk0gSHlwZXJ2aXNvciBWaXJ0dWFsIENvbnNvbGUgU2VydmVyLAorICogImh2Y3MiLiAgVGhlIElCTSBodmNzIHByb3ZpZGVzIGEgdHR5IGRyaXZlciBpbnRlcmZhY2UgdG8gYWxsb3cgTGludXgKKyAqIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIGFjY2VzcyB0byB0aGUgc3lzdGVtIGNvbnNvbGVzIG9mIGxvZ2ljYWxseQorICogcGFydGl0aW9uZWQgb3BlcmF0aW5nIHN5c3RlbXMsIGUuZy4gTGludXgsIHJ1bm5pbmcgb24gdGhlIHNhbWUgcGFydGl0aW9uZWQKKyAqIFBvd2VyNSBwcGM2NCBzeXN0ZW0uICBQaHlzaWNhbCBoYXJkd2FyZSBjb25zb2xlcyBwZXIgcGFydGl0aW9uIGFyZSBub3QKKyAqIHByYWN0aWNhbCBvbiB0aGlzIGhhcmR3YXJlIHNvIHN5c3RlbSBjb25zb2xlcyBhcmUgYWNjZXNzZWQgYnkgdGhpcyBkcml2ZXIKKyAqIHVzaW5nIGludGVyLXBhcnRpdGlvbiBmaXJtd2FyZSBpbnRlcmZhY2VzIHRvIHZpcnR1YWwgdGVybWluYWwgZGV2aWNlcy4KKyAqCisgKiBBIHZ0eSBpcyBrbm93biB0byB0aGUgSE1DIGFzIGEgInZpcnR1YWwgc2VyaWFsIHNlcnZlciBhZGFwdGVyIi4gIEl0IGlzIGEKKyAqIHZpcnR1YWwgdGVybWluYWwgZGV2aWNlIHRoYXQgaXMgY3JlYXRlZCBieSBmaXJtd2FyZSB1cG9uIHBhcnRpdGlvbiBjcmVhdGlvbgorICogdG8gYWN0IGFzIGEgcGFydGl0aW9uZWQgT1MncyBjb25zb2xlIGRldmljZS4KKyAqCisgKiBGaXJtd2FyZSBkeW5hbWljYWxseSAodmlhIGhvdHBsdWcpIGV4cG9zZXMgdnR5LXNlcnZlcnMgdG8gYSBydW5uaW5nIHBwYzY0CisgKiBMaW51eCBzeXN0ZW0gdXBvbiB0aGVpciBjcmVhdGlvbiBieSB0aGUgSE1DIG9yIHRoZWlyIGV4cG9zdXJlIGR1cmluZyBib290LgorICogVGhlIG5vbi11c2VyIGludGVyYWN0aXZlIGJhY2tlbmQgb2YgdGhpcyBkcml2ZXIgaXMgaW1wbGVtZW50ZWQgYXMgYSB2aW8KKyAqIGRldmljZSBkcml2ZXIgc28gdGhhdCBpdCBjYW4gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdnR5LXNlcnZlciBsaWZldGltZXMKKyAqIGFmdGVyIGl0IHJlZ2lzdGVycyB3aXRoIHRoZSB2aW8gYnVzIHRvIGhhbmRsZSB2dHktc2VydmVyIHByb2JlIGFuZCByZW1vdmUKKyAqIGNhbGxiYWNrcy4KKyAqCisgKiBNYW55IHZ0eS1zZXJ2ZXJzIGNhbiBiZSBjb25maWd1cmVkIHRvIGNvbm5lY3QgdG8gb25lIHZ0eSwgYnV0IGEgdnR5IGNhbgorICogb25seSBiZSBhY3RpdmVseSBjb25uZWN0ZWQgdG8gYnkgYSBzaW5nbGUgdnR5LXNlcnZlciwgaW4gYW55IG1hbm5lciwgYXQgb25lCisgKiB0aW1lLiAgSWYgdGhlIEhNQyBpcyBjdXJyZW50bHkgaG9zdGluZyB0aGUgY29uc29sZSBmb3IgYSB0YXJnZXQgTGludXgKKyAqIHBhcnRpdGlvbjsgYXR0ZW1wdHMgdG8gb3BlbiB0aGUgdHR5IGRldmljZSB0byB0aGUgcGFydGl0aW9uJ3MgY29uc29sZSB1c2luZworICogdGhlIGh2Y3Mgb24gYW55IHBhcnRpdGlvbiB3aWxsIHJldHVybiAtRUJVU1kgd2l0aCBldmVyeSBvcGVuIGF0dGVtcHQgdW50aWwKKyAqIHRoZSBITUMgZnJlZXMgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiBpdHMgdnR5LXNlcnZlciBhbmQgdGhlIGRlc2lyZWQKKyAqIHBhcnRpdGlvbidzIHZ0eSBkZXZpY2UuICBDb252ZXJzZWx5LCBhIHZ0eS1zZXJ2ZXIgbWF5IG9ubHkgYmUgY29ubmVjdGVkIHRvCisgKiBhIHNpbmdsZSB2dHkgYXQgb25lIHRpbWUgZXZlbiB0aG91Z2ggaXQgbWF5IGhhdmUgc2V2ZXJhbCBjb25maWd1cmVkIHZ0eQorICogcGFydG5lciBwb3NzaWJpbGl0aWVzLgorICoKKyAqIEZpcm13YXJlIGRvZXMgbm90IHByb3ZpZGUgbm90aWZpY2F0aW9uIG9mIHZ0eSBwYXJ0bmVyIGNoYW5nZXMgdG8gdGhpcworICogZHJpdmVyLiAgVGhpcyBtZWFucyB0aGF0IGFuIEhNQyBTdXBlciBBZG1pbiBtYXkgYWRkIG9yIHJlbW92ZSBwYXJ0bmVyIHZ0eXMKKyAqIGZyb20gYSB2dHktc2VydmVyJ3MgcGFydG5lciBsaXN0IGJ1dCB0aGUgY2hhbmdlcyB3aWxsIG5vdCBiZSBzaWduYWxlZCB0bworICogdGhlIHZ0eS1zZXJ2ZXIuICBGaXJtd2FyZSBvbmx5IG5vdGlmaWVzIHRoZSBkcml2ZXIgd2hlbiBhIHZ0eS1zZXJ2ZXIgaXMKKyAqIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLiAgVG8gY29tcGVuc2F0ZSBmb3IgdGhpcyBkZWZpY2llbmN5LCB0aGlzCisgKiBkcml2ZXIgaW1wbGVtZW50cyBhIHN5c2ZzIHVwZGF0ZSBhdHRyaWJ1dGUgd2hpY2ggcHJvdmlkZXMgYSBtZXRob2QgZm9yCisgKiByZXNjYW5uaW5nIHBhcnRuZXIgaW5mb3JtYXRpb24gdXBvbiBhIHVzZXIncyByZXF1ZXN0LgorICoKKyAqIEVhY2ggdnR5LXNlcnZlciwgcHJpb3IgdG8gYmVpbmcgZXhwb3NlZCB0byB0aGlzIGRyaXZlciBpcyByZWZlcmVuY2UgY291bnRlZAorICogdXNpbmcgdGhlIDIuNiBMaW51eCBrZXJuZWwga29iamVjdCBjb25zdHJ1Y3QuICBUaGlzIGtvYmplY3QgaXMgYWxzbyB1c2VkIGJ5CisgKiB0aGUgdmlvIGJ1cyB0byBwcm92aWRlIGEgdmlvIGRldmljZSBzeXNmcyBlbnRyeSB0aGF0IHRoaXMgZHJpdmVyIGF0dGFjaGVzCisgKiBkZXZpY2Ugc3BlY2lmaWMgYXR0cmlidXRlcyB0bywgaW5jbHVkaW5nIHBhcnRuZXIgaW5mb3JtYXRpb24uICBUaGUgdmlvIGJ1cworICogZnJhbWV3b3JrIGFsc28gcHJvdmlkZXMgYSBzeXNmcyBlbnRyeSBmb3IgZWFjaCB2aW8gZHJpdmVyLiAgVGhlIGh2Y3MgZHJpdmVyCisgKiBwcm92aWRlcyBkcml2ZXIgYXR0cmlidXRlcyBpbiB0aGlzIGVudHJ5LgorICoKKyAqIEZvciBkaXJlY3Rpb24gb24gaW5zdGFsbGF0aW9uIGFuZCB1c2FnZSBvZiB0aGlzIGRyaXZlciBwbGVhc2UgcmVmZXJlbmNlCisgKiBEb2N1bWVudGF0aW9uL3Bvd2VycGMvaHZjcy50eHQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGFzbS9odmNvbnNvbGUuaD4KKyNpbmNsdWRlIDxhc20vaHZjc2VydmVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdmlvLmg+CisKKy8qCisgKiAxLjMuMCAtPiAxLjMuMSBJbiBodmNzX29wZW4gbWVtc2V0KC4uLDB4MDAsLi4pIGluc3RlYWQgb2YgbWVtc2V0KC4uLDB4M0YsMDApLgorICogUmVtb3ZlZCBicmFjZXMgYXJvdW5kIHNpbmdsZSBzdGF0ZW1lbnRzIGZvbGxvd2luZyBjb25kaXRpb25hbHMuICBSZW1vdmVkICc9CisgKiAwJyBhZnRlciBzdGF0aWMgaW50IGRlY2xhcmF0aW9ucyBzaW5jZSB0aGVzZSBkZWZhdWx0IHRvIHplcm8uICBSZW1vdmVkCisgKiBsaXN0X2Zvcl9lYWNoX3NhZmUoKSBhbmQgcmVwbGFjZWQgd2l0aCBsaXN0X2Zvcl9lYWNoX2VudHJ5KCkgaW4KKyAqIGh2Y3NfZ2V0X2J5X2luZGV4KCkuICBUaGUgJ3NhZmUnIHZlcnNpb24gaXMgdW4tbmVlZGVkIG5vdyB0aGF0IHRoZSBkcml2ZXIgaXMKKyAqIHVzaW5nIHNwaW5sb2Nrcy4gIENoYW5nZWQgc3Bpbl9sb2NrX2lycXNhdmUoKSB0byBzcGluX2xvY2soKSB3aGVuIGxvY2tpbmcKKyAqIGh2Y3Nfc3RydWN0c19sb2NrIGFuZCBodmNzX3BpX2xvY2sgc2luY2UgdGhlc2UgYXJlIG5vdCB0b3VjaGVkIGluIGFuIGludAorICogaGFuZGxlci4gIEluaXRpYWxpemVkIGh2Y3Nfc3RydWN0c19sb2NrIGFuZCBodmNzX3BpX2xvY2sgdG8KKyAqIFNQSU5fTE9DS19VTkxPQ0tFRCBhdCBkZWNsYXJhdGlvbiB0aW1lIHJhdGhlciB0aGFuIGluIGh2Y3NfbW9kdWxlX2luaXQoKS4KKyAqIEFkZGVkIHNwaW5fbG9jayBhcm91bmQgbGlzdF9kZWwoKSBpbiBkZXN0cm95X2h2Y3Nfc3RydWN0KCkgdG8gcHJvdGVjdCB0aGUKKyAqIGxpc3QgdHJhdmVyc2FscyBmcm9tIGEgZGVsZXRpb24uICBSZW1vdmVkICc9IE5VTEwnIGZyb20gcG9pbnRlciBkZWNsYXJhdGlvbgorICogc3RhdGVtZW50cyBzaW5jZSB0aGV5IGFyZSBpbml0aWFsaXplZCBOVUxMIGJ5IGRlZmF1bHQuICBSZW1vdmVkIHdtYigpCisgKiBpbnN0YW5jZXMgZnJvbSBodmNzX3RyeV93cml0ZSgpLiAgVGhleSBwcm9iYWJseSBhcmVuJ3QgbmVlZGVkIHdpdGggbG9ja2luZyBpbgorICogcGxhY2UuICBBZGRlZCBjaGVjayBhbmQgY2xlYW51cCBmb3IgaHZjc19waV9idWZmID0ga21hbGxvYygpIGluCisgKiBodmNzX21vZHVsZV9pbml0KCkuICBFeHBvc2VkIGh2Y3Nfc3RydWN0LmluZGV4IHZpYSBhIHN5c2ZzIGF0dHJpYnV0ZSBzbyB0aGF0CisgKiB0aGUgY291cGxpbmcgYmV0d2VlbiAvZGV2L2h2Y3MqIGFuZCBhIHZ0eS1zZXJ2ZXIgY2FuIGJlIGF1dG9tYXRpY2FsbHkKKyAqIGRldGVybWluZWQuICBNb3ZlZCBrb2JqZWN0X3B1dCgpIGluIGh2Y3Nfb3BlbiBvdXRzaWRlIG9mIHRoZQorICogc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgpLgorICoKKyAqIDEuMy4xIC0+IDEuMy4yIENoYW5nZWQgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBodmNzX3N0cnVjdC0+aW5kZXggYW5kIGhhZCBpdAorICogYWxpZ24gd2l0aCBob3cgdGhlIHR0eSBsYXllciBhbHdheXMgYXNzaWducyB0aGUgbG93ZXN0IGluZGV4IGF2YWlsYWJsZS4gIFRoaXMKKyAqIGNoYW5nZSByZXN1bHRlZCBpbiBhIGxpc3Qgb2YgaW50cyB0aGF0IGRlbm90ZXMgd2hpY2ggaW5kZXhlcyBhcmUgYXZhaWxhYmxlLgorICogRGV2aWNlIGFkZGl0aW9ucyBhbmQgcmVtb3ZhbHMgdXNlIHRoZSBuZXcgaHZjc19nZXRfaW5kZXgoKSBhbmQKKyAqIGh2Y3NfcmV0dXJuX2luZGV4KCkgaGVscGVyIGZ1bmN0aW9ucy4gIFRoZSBsaXN0IGlzIGNyZWF0ZWQgd2l0aAorICogaHZzY19hbGxvY19pbmRleF9saXN0KCkgYW5kIGl0IGlzIGRlc3Ryb3llZCB3aXRoIGh2Y3NfZnJlZV9pbmRleF9saXN0KCkuCisgKiBXaXRob3V0IHRoZXNlIGZpeGVzIGhvdHBsdWcgdnR5LXNlcnZlciBhZGFwdGVyIHN1cHBvcnQgZ29lcyBjcmF6eSB3aXRoIHRoaXMKKyAqIGRyaXZlciBpZiB0aGUgdXNlciByZW1vdmVzIGEgdnR5LXNlcnZlciBhZGFwdGVyLiAgTW92ZWQgZnJlZV9pcnEoKSBvdXRzaWRlIG9mCisgKiB0aGUgaHZjc19maW5hbF9jbG9zZSgpIGZ1bmN0aW9uIGluIG9yZGVyIHRvIGdldCBpdCBvdXQgb2YgdGhlIHNwaW5sb2NrLgorICogUmVhcnJhbmdlZCBodmNzX2Nsb3NlKCkuICBDbGVhbmVkIHVwIHNvbWUgcHJpbnRrcyBhbmQgZGlkIHNvbWUgaG91c2VrZWVwaW5nCisgKiBvbiB0aGUgY2hhbmdlbG9nLiAgUmVtb3ZlZCBsb2NhbCBDTENfTEVOR1RIIGFuZCB1c2VkIEhWQ1NfQ0xDX0xFTkdUSCBmcm9tCisgKiBhcmNoL3BwYzY0L2h2Y3NlcnZlci5oLgorICoKKyAqIDEuMy4yIC0+IDEuMy4zIFJlcGxhY2VkIHlpZWxkKCkgaW4gaHZjc19jbG9zZSgpIHdpdGggdHR5X3dhaXRfdW50aWxfc2VudCgpIHRvCisgKiBwcmV2ZW50IHBvc3NpYmxlIGxvY2t1cCB3aXRoIHJlYWx0aW1lIHNjaGVkdWxpbmcgYXMgc2ltaWxhcmlseSBwb2ludGVkIG91dCBieQorICogYWtwbSBpbiBodmNfY29uc29sZS4gIENoYW5nZWQgcmVzdWx0ZWQgaW4gdGhlIHJlbW92YWwgb2YgaHZjc19maW5hbF9jbG9zZSgpCisgKiB0byByZW9yZGVyIGNsZWFudXAgb3BlcmF0aW9ucyBhbmQgcHJldmVudCBkaXNjYXJkaW5nIG9mIHBlbmRpbmcgZGF0YSBkdXJpbmcKKyAqIGFuIGh2Y3NfY2xvc2UoKS4gIFJlbW92ZWQgc3BpbmxvY2sgcHJvdGVjdGlvbiBvZiBodmNzX3N0cnVjdCBkYXRhIG1lbWJlcnMgaW4KKyAqIGh2Y3Nfd3JpdGVfcm9vbSgpIGFuZCBodmNzX2NoYXJzX2luX2J1ZmZlcigpIGJlY2F1c2UgdGhleSBhcmVuJ3QgbmVlZGVkLgorICovCisKKyNkZWZpbmUgSFZDU19EUklWRVJfVkVSU0lPTiAiMS4zLjMiCisKK01PRFVMRV9BVVRIT1IoIlJ5YW4gUy4gQXJub2xkIDxyc2FAdXMuaWJtLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSUJNIGh2Y3MgKEh5cGVydmlzb3IgVmlydHVhbCBDb25zb2xlIFNlcnZlcikgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihIVkNTX0RSSVZFUl9WRVJTSU9OKTsKKworLyoKKyAqIFdhaXQgdGhpcyBsb25nIHBlciBpdGVyYXRpb24gd2hpbGUgdHJ5aW5nIHRvIHB1c2ggYnVmZmVyZWQgZGF0YSB0byB0aGUKKyAqIGh5cGVydmlzb3IgYmVmb3JlIGFsbG93aW5nIHRoZSB0dHkgdG8gY29tcGxldGUgYSBjbG9zZSBvcGVyYXRpb24uCisgKi8KKyNkZWZpbmUgSFZDU19DTE9TRV9XQUlUIChIWi8xMDApIC8qIDEvMTAgb2YgYSBzZWNvbmQgKi8KKworLyoKKyAqIFNpbmNlIHRoZSBMaW51eCBUVFkgY29kZSBkb2VzIG5vdCBjdXJyZW50bHkgKDItMDQtMjAwNCkgc3VwcG9ydCBkeW5hbWljCisgKiBhZGRpdGlvbiBvZiB0dHkgZGVyaXZlZCBkZXZpY2VzIGFuZCB3ZSBzaG91bGRuJ3QgYWxsb2NhdGUgdGhvdXNhbmRzIG9mCisgKiB0dHlfZGV2aWNlIHBvaW50ZXJzIHdoZW4gdGhlIG51bWJlciBvZiB2dHktc2VydmVyICYgdnR5IHBhcnRuZXIgY29ubmVjdGlvbnMKKyAqIHdpbGwgbW9zdCBvZnRlbiBiZSBtdWNoIGxvd2VyIHRoYW4gdGhpcywgd2UnbGwgYXJiaXRyYXJpbHkgYWxsb2NhdGUKKyAqIEhWQ1NfREVGQVVMVF9TRVJWRVJfQURBUFRFUlMgdHR5X3N0cnVjdHMgYW5kIGNkZXYncyBieSBkZWZhdWx0IHdoZW4gd2UKKyAqIHJlZ2lzdGVyIHRoZSB0dHlfZHJpdmVyLiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIGFuIGluc21vZCBwYXJhbWV0ZXIuCisgKi8KKyNkZWZpbmUgSFZDU19ERUZBVUxUX1NFUlZFUl9BREFQVEVSUwk2NAorCisvKgorICogVGhlIHVzZXIgY2FuJ3QgaW5zbW9kIHdpdGggbW9yZSB0aGFuIEhWQ1NfTUFYX1NFUlZFUl9BREFQVEVSUyBodmNzIGRldmljZQorICogbm9kZXMgYXMgYSBzYW5pdHkgY2hlY2suICBUaGVvcmV0aWNhbGx5IHRoZXJlIGNhbiBiZSBvdmVyIDEgQmlsbGlvbgorICogdnR5LXNlcnZlciAmIHZ0eSBwYXJ0bmVyIGNvbm5lY3Rpb25zLgorICovCisjZGVmaW5lIEhWQ1NfTUFYX1NFUlZFUl9BREFQVEVSUwkxMDI0CisKKy8qCisgKiBXZSBsZXQgTGludXggYXNzaWduIHVzIGEgbWFqb3IgbnVtYmVyIGFuZCB3ZSBzdGFydCB0aGUgbWlub3JzIGF0IHplcm8uICBUaGVyZQorICogaXMgbm8gaW50dWl0aXZlIG1hcHBpbmcgYmV0d2VlbiBtaW5vciBudW1iZXIgYW5kIHRoZSB0YXJnZXQgdnR5LXNlcnZlcgorICogYWRhcHRlciBleGNlcHQgdGhhdCBlYWNoIG5ldyB2dHktc2VydmVyIGFkYXB0ZXIgaXMgYWx3YXlzIGFzc2lnbmVkIHRvIHRoZQorICogc21hbGxlc3QgbWlub3IgbnVtYmVyIGF2YWlsYWJsZS4KKyAqLworI2RlZmluZSBIVkNTX01JTk9SX1NUQVJUCTAKKworLyoKKyAqIFRoZSBoY2FsbCBpbnRlcmZhY2UgaW52b2x2ZXMgcHV0dGluZyA4IGNoYXJzIGludG8gZWFjaCBvZiB0d28gcmVnaXN0ZXJzLgorICogV2UgbG9hZCB1cCB0aG9zZSAyIHJlZ2lzdGVycyAoaW4gYXJjaC9wcGM2NC9odmNvbnNvbGUuYykgYnkgY2FzdGluZyBjaGFyWzE2XQorICogdG8gbG9uZ1syXS4gIEl0IHdvdWxkIHdvcmsgd2l0aG91dCBfX0FMSUdORURfXywgYnV0IGEgbGl0dGxlICh0aW55KSBiaXQKKyAqIHNsb3dlciBiZWNhdXNlIGFuIHVuYWxpZ25lZCBsb2FkIGlzIHNsb3dlciB0aGFuIGFsaWduZWQgbG9hZC4KKyAqLworI2RlZmluZSBfX0FMSUdORURfXwlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg4KSkpCisKKy8qCisgKiBIb3cgbXVjaCBkYXRhIGNhbiBmaXJtd2FyZSBzZW5kIHdpdGggZWFjaCBodmNfcHV0X2NoYXJzKCk/ICBNYXliZSB0aGlzCisgKiBzaG91bGQgYmUgbW92ZWQgaW50byBhbiBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgYXJlYS4KKyAqLworI2RlZmluZSBIVkNTX0JVRkZfTEVOCTE2CisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIHdlJ2xsIGxldCB0aGUgdXNlciBzZW5kIHVzIChodmNzX3dyaXRlKSBhdAorICogb25jZSBpbiBhIGNodW5rIGFzIGEgc2FuaXR5IGNoZWNrLgorICovCisjZGVmaW5lIEhWQ1NfTUFYX0ZST01fVVNFUgk0MDk2CisKKy8qCisgKiBCZSBjYXJlZnVsIHdoZW4gYWRkaW5nIGZsYWdzIHRvIHRoaXMgbGluZSBkaXNjaXBsaW5lLiAgRG9uJ3QgYWRkIGFueXRoaW5nCisgKiB0aGF0IHdpbGwgY2F1c2UgZWNob2luZyBvciB3ZSdsbCBnbyBpbnRvIHJlY3Vyc2l2ZSBsb29wIGVjaG9pbmcgY2hhcnMgYmFjaworICogYW5kIGZvcnRoIHdpdGggdGhlIGNvbnNvbGUgZHJpdmVycy4KKyAqLworc3RhdGljIHN0cnVjdCB0ZXJtaW9zIGh2Y3NfdHR5X3Rlcm1pb3MgPSB7CisJLmNfaWZsYWcgPSBJR05CUksgfCBJR05QQVIsCisJLmNfb2ZsYWcgPSBPUE9TVCwKKwkuY19jZmxhZyA9IEIzODQwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wsCisJLmNfY2MgPSBJTklUX0NfQ0MKK307CisKKy8qCisgKiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gdGFrZSB0aGUgcGxhY2Ugb2YgYSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIHdoZW4gdGhlCisgKiBtb2R1bGUgaXMgaW5zZXJ0ZWQuICBJdCBzdGFydHMgYXMgLTEgYW5kIHN0YXlzIGFzIHN1Y2ggaWYgdGhlIHVzZXIgZG9lc24ndAorICogc3BlY2lmeSBhIG1vZHVsZSBpbnNtb2QgcGFyYW1ldGVyLiAgSWYgdGhleSBETyBzcGVjaWZ5IG9uZSB0aGVuIGl0IGlzIHNldCB0bworICogdGhlIHZhbHVlIG9mIHRoZSBpbnRlZ2VyIHBhc3NlZCBpbi4KKyAqLworc3RhdGljIGludCBodmNzX3Bhcm1fbnVtX2RldnMgPSAtMTsKK21vZHVsZV9wYXJhbShodmNzX3Bhcm1fbnVtX2RldnMsIGludCwgMCk7CisKK2NoYXIgaHZjc19kcml2ZXJfbmFtZVtdID0gImh2Y3MiOworY2hhciBodmNzX2RldmljZV9ub2RlW10gPSAiaHZjcyI7CitjaGFyIGh2Y3NfZHJpdmVyX3N0cmluZ1tdCisJPSAiSUJNIGh2Y3MgKEh5cGVydmlzb3IgVmlydHVhbCBDb25zb2xlIFNlcnZlcikgRHJpdmVyIjsKKworLyogU3RhdHVzIG9mIHBhcnRuZXIgaW5mbyByZXNjYW4gdHJpZ2dlcmVkIHZpYSBzeXNmcy4gKi8KK3N0YXRpYyBpbnQgaHZjc19yZXNjYW5fc3RhdHVzOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmh2Y3NfdHR5X2RyaXZlcjsKKworLyoKKyAqIEluIG9yZGVyIHRvIGJlIHNvbWV3aGF0IHNhbmUgdGhpcyBkcml2ZXIgYWx3YXlzIGFzc29jaWF0ZXMgdGhlIGh2Y3Nfc3RydWN0CisgKiBpbmRleCBlbGVtZW50IHdpdGggdGhlIG51bWVyaWNhbGx5IGVxdWFsIHR0eS0+aW5kZXguICBUaGlzIG1lYW5zIHRoYXQgYQorICogaG90cGx1Z2dlZCB2dHktc2VydmVyIGFkYXB0ZXIgd2lsbCBhbHdheXMgbWFwIHRvIHRoZSBsb3dlc3QgaW5kZXggdmFsdWVkCisgKiBkZXZpY2Ugbm9kZS4gIElmIHZ0eS1zZXJ2ZXJzIHdlcmUgaG90cGx1ZyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbSBhbmQgdGhlbgorICogbmV3IG9uZXMgYWRkZWQgdGhlIG5ldyB2dHktc2VydmVyIG1heSBoYXZlIHRoZSBsYXJnZXN0IHNsb3QgbnVtYmVyIG9mIGFsbAorICogdGhlIHZ0eS1zZXJ2ZXIgYWRhcHRlcnMgaW4gdGhlIHBhcnRpdGlvbiBidXQgaXQgbWF5IGhhdmUgdGhlIGxvd2VzdCBkZXYgbm9kZQorICogaW5kZXggb2YgYWxsIHRoZSBhZGFwdGVycyBkdWUgdG8gdGhlIGhvbGUgbGVmdCBieSB0aGUgaG90cGx1ZyByZW1vdmVkCisgKiBhZGFwdGVyLiAgVGhlcmUgYXJlIGEgc2V0IG9mIGZ1bmN0aW9ucyBwcm92aWRlZCB0byBnZXQgdGhlIGxvd2VzdCBpbmRleCBmb3IKKyAqIGEgbmV3IGRldmljZSBhcyB3ZWxsIGFzIHJldHVybiB0aGUgaW5kZXggdG8gdGhlIGxpc3QuICBUaGlzIGxpc3QgaXMgYWxsb2NhdGVkCisgKiB3aXRoIGEgbnVtYmVyIG9mIGVsZW1lbnRzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgZGV2aWNlIG5vZGVzIHJlcXVlc3RlZCB3aGVuCisgKiB0aGUgbW9kdWxlIHdhcyBpbnNlcnRlZC4KKyAqLworc3RhdGljIGludCAqaHZjc19pbmRleF9saXN0OworCisvKgorICogSG93IGxhcmdlIGlzIHRoZSBsaXN0PyAgVGhpcyBpcyBrZXB0IGZvciB0cmF2ZXJzYWwgc2luY2UgdGhlIGxpc3QgaXMKKyAqIGR5bmFtaWNhbGx5IGNyZWF0ZWQuCisgKi8KK3N0YXRpYyBpbnQgaHZjc19pbmRleF9jb3VudDsKKworLyoKKyAqIFVzZWQgYnkgdGhlIGtodmNzZCB0byBwaWNrIHVwIEkvTyBvcGVyYXRpb25zIHdoZW4gdGhlIGtlcm5lbF90aHJlYWQgaXMKKyAqIGFscmVhZHkgYXdha2UgYnV0IHBvdGVudGlhbGx5IHNoaWZ0ZWQgdG8gVEFTS19JTlRFUlJVUFRJQkxFIHN0YXRlLgorICovCitzdGF0aWMgaW50IGh2Y3Nfa2lja2VkOworCisvKgorICogVXNlIGJ5IHRoZSBrdGhyZWFkIGNvbnN0cnVjdCBmb3IgdGFzayBvcGVyYXRpb25zIGxpa2Ugd2FraW5nIHRoZSBzbGVlcGluZworICogdGhyZWFkIGFuZCBzdG9wcGluZyB0aGUga3RocmVhZC4KKyAqLworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqaHZjc190YXNrOworCisvKgorICogV2UgYWxsb2NhdGUgdGhpcyBmb3IgdGhlIHVzZSBvZiBhbGwgb2YgdGhlIGh2Y3Nfc3RydWN0cyB3aGVuIHRoZXkgZmV0Y2gKKyAqIHBhcnRuZXIgaW5mby4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgKmh2Y3NfcGlfYnVmZjsKKworLyogT25seSBhbGxvdyBvbmUgaHZjc19zdHJ1Y3QgdG8gdXNlIHRoZSBodmNzX3BpX2J1ZmYgYXQgYSB0aW1lLiAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhodmNzX3BpX2xvY2spOworCisvKiBPbmUgdnR5LXNlcnZlciBwZXIgaHZjc19zdHJ1Y3QgKi8KK3N0cnVjdCBodmNzX3N0cnVjdCB7CisJc3BpbmxvY2tfdCBsb2NrOworCisJLyoKKwkgKiBUaGlzIGluZGV4IGlkZW50aWZpZXMgdGhpcyBodmNzIGRldmljZSBhcyB0aGUgY29tcGxlbWVudCB0byBhCisJICogc3BlY2lmaWMgdHR5IGluZGV4LgorCSAqLworCXVuc2lnbmVkIGludCBpbmRleDsKKworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgaW50IG9wZW5fY291bnQ7CisKKwkvKgorCSAqIFVzZWQgdG8gdGVsbCB0aGUgZHJpdmVyIGtlcm5lbF90aHJlYWQgd2hhdCBvcGVyYXRpb25zIG5lZWQgdG8gdGFrZQorCSAqIHBsYWNlIHVwb24gdGhpcyBodmNzX3N0cnVjdCBpbnN0YW5jZS4KKwkgKi8KKwlpbnQgdG9kb19tYXNrOworCisJLyoKKwkgKiBUaGlzIGJ1ZmZlciBpcyByZXF1aXJlZCBzbyB0aGF0IHdoZW4gaHZjc193cml0ZV9yb29tKCkgcmVwb3J0cyB0aGF0CisJICogaXQgY2FuIHNlbmQgSFZDU19CVUZGX0xFTiBjaGFyYWN0ZXJzIHRoYXQgaXQgd2lsbCBidWZmZXIgdGhlIGZ1bGwKKwkgKiBIVkNTX0JVRkZfTEVOIGNoYXJhY3RlcnMgaWYgbmVlZCBiZS4gIFRoaXMgaXMgZXNzZW50aWFsIGZvciBvcG9zdAorCSAqIHdyaXRlcyBzaW5jZSB0aGV5IGRvIG5vdCBkbyBoaWdoIGxldmVsIGJ1ZmZlcmluZyBhbmQgZXhwZWN0IHRvIGJlCisJICogYWJsZSB0byBzZW5kIHdoYXQgdGhlIGRyaXZlciBjb21taXRzIHRvIHNlbmRpbmcgYnVmZmVyaW5nCisJICogW2UuZy4gdGFiIHRvIHNwYWNlIGNvbnZlcnNpb25zIGluIG5fdHR5LmMgb3Bvc3QoKV0uCisJICovCisJY2hhciBidWZmZXJbSFZDU19CVUZGX0xFTl07CisJaW50IGNoYXJzX2luX2J1ZmZlcjsKKworCS8qCisJICogQW55IHZhcmlhYmxlIGJlbG93IHRoZSBrb2JqZWN0IGlzIHZhbGlkIGJlZm9yZSBhIHR0eSBpcyBjb25uZWN0ZWQgYW5kCisJICogc3RheXMgdmFsaWQgYWZ0ZXIgdGhlIHR0eSBpcyBkaXNjb25uZWN0ZWQuICBUaGVzZSBzaG91bGRuJ3QgYmUKKwkgKiB3aGFja2VkIHVudGlsIHRoZSBrb2plY3QgcmVmY291bnQgcmVhY2hlcyB6ZXJvIHRob3VnaCBzb21lIGVudHJpZXMKKwkgKiBtYXkgYmUgY2hhbmdlZCB2aWEgc3lzZnMgaW5pdGlhdGl2ZXMuCisJICovCisJc3RydWN0IGtvYmplY3Qga29iajsgLyogcmVmIGNvdW50ICYgaHZjc19zdHJ1Y3QgbGlmZXRpbWUgKi8KKwlpbnQgY29ubmVjdGVkOyAvKiBpcyB0aGUgdnR5LXNlcnZlciBjdXJyZW50bHkgY29ubmVjdGVkIHRvIGEgdnR5PyAqLworCXVpbnQzMl90IHBfdW5pdF9hZGRyZXNzOyAvKiBwYXJ0bmVyIHVuaXQgYWRkcmVzcyAqLworCXVpbnQzMl90IHBfcGFydGl0aW9uX0lEOyAvKiBwYXJ0bmVyIHBhcnRpdGlvbiBJRCAqLworCWNoYXIgcF9sb2NhdGlvbl9jb2RlW0hWQ1NfQ0xDX0xFTkdUSCArIDFdOyAvKiBDTEMgKyBOdWxsIFRlcm0gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7IC8qIGxpc3QgbWFuYWdlbWVudCAqLworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2OworfTsKKworLyogUmVxdWlyZWQgdG8gYmFjayBtYXAgYSBrb2JqZWN0IHRvIGl0cyBjb250YWluaW5nIG9iamVjdCAqLworI2RlZmluZSBmcm9tX2tvYmooa29iaikgY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBodmNzX3N0cnVjdCwga29iaikKKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaHZjc19zdHJ1Y3RzID0gTElTVF9IRUFEX0lOSVQoaHZjc19zdHJ1Y3RzKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaHZjc19zdHJ1Y3RzX2xvY2spOworCitzdGF0aWMgdm9pZCBodmNzX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBodmNzX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGlycXJldHVybl90IGh2Y3NfaGFuZGxlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCXN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworc3RhdGljIGludCBodmNzX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyBpbnQgaHZjc193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludCBodmNzX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKKworc3RhdGljIGludCBodmNzX2hhc19waShzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKTsKK3N0YXRpYyB2b2lkIGh2Y3Nfc2V0X3BpKHN0cnVjdCBodmNzX3BhcnRuZXJfaW5mbyAqcGksCisJCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QpOworc3RhdGljIGludCBodmNzX2dldF9waShzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKTsKK3N0YXRpYyBpbnQgaHZjc19yZXNjYW5fZGV2aWNlc19saXN0KHZvaWQpOworCitzdGF0aWMgaW50IGh2Y3NfcGFydG5lcl9jb25uZWN0KHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QpOworc3RhdGljIHZvaWQgaHZjc19wYXJ0bmVyX2ZyZWUoc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCk7CisKK3N0YXRpYyBpbnQgaHZjc19lbmFibGVfZGV2aWNlKHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QsCisJCXVpbnQzMl90IHVuaXRfYWRkcmVzcywgdW5zaWduZWQgaW50IGlycSwgc3RydWN0IHZpb19kZXYgKmRldik7CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaHZjc19zdHJ1Y3Qoc3RydWN0IGtvYmplY3QgKmtvYmopOworc3RhdGljIGludCBodmNzX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHZvaWQgaHZjc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgdm9pZCBodmNzX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSk7CisKK3N0YXRpYyB2b2lkIGh2Y3NfY3JlYXRlX2RldmljZV9hdHRycyhzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKTsKK3N0YXRpYyB2b2lkIGh2Y3NfcmVtb3ZlX2RldmljZV9hdHRycyhzdHJ1Y3QgdmlvX2RldiAqdmRldik7CitzdGF0aWMgdm9pZCBodmNzX2NyZWF0ZV9kcml2ZXJfYXR0cnModm9pZCk7CitzdGF0aWMgdm9pZCBodmNzX3JlbW92ZV9kcml2ZXJfYXR0cnModm9pZCk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGh2Y3NfcHJvYmUoc3RydWN0IHZpb19kZXYgKmRldiwKKwkJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyBpbnQgX19kZXZleGl0IGh2Y3NfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICpkZXYpOworc3RhdGljIGludCBfX2luaXQgaHZjc19tb2R1bGVfaW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIF9fZXhpdCBodmNzX21vZHVsZV9leGl0KHZvaWQpOworCisjZGVmaW5lIEhWQ1NfU0NIRURfUkVBRAkweDAwMDAwMDAxCisjZGVmaW5lIEhWQ1NfUVVJQ0tfUkVBRAkweDAwMDAwMDAyCisjZGVmaW5lIEhWQ1NfVFJZX1dSSVRFCTB4MDAwMDAwMDQKKyNkZWZpbmUgSFZDU19SRUFEX01BU0sJKEhWQ1NfU0NIRURfUkVBRCB8IEhWQ1NfUVVJQ0tfUkVBRCkKKworc3RhdGljIHZvaWQgaHZjc19raWNrKHZvaWQpCit7CisJaHZjc19raWNrZWQgPSAxOworCXdtYigpOworCXdha2VfdXBfcHJvY2VzcyhodmNzX3Rhc2spOworfQorCitzdGF0aWMgdm9pZCBodmNzX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJaHZjc2QtPnRvZG9fbWFzayB8PSBIVkNTX1NDSEVEX1JFQUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlodmNzX2tpY2soKTsKK30KKworc3RhdGljIHZvaWQgaHZjc190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwl2aW9fZGlzYWJsZV9pbnRlcnJ1cHRzKGh2Y3NkLT52ZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogSWYgdGhlIGRldmljZSBpcyBiZWluZyByZW1vdmVkIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhpcyBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIgdGFraW5nIGFueSBmdXJ0aGVyIGludGVycnVwdHMgYmVjYXVzZSB0aGV5IGFyZSBkaXNhYmxlZCB3aGljaCBtZWFucworICogdGhlIGh2Y3Nfc3RydWN0IHdpbGwgYWx3YXlzIGJlIHZhbGlkIGluIHRoaXMgaGFuZGxlci4KKyAqLworc3RhdGljIGlycXJldHVybl90IGh2Y3NfaGFuZGxlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBkZXZfaW5zdGFuY2U7CisKKwlzcGluX2xvY2soJmh2Y3NkLT5sb2NrKTsKKwl2aW9fZGlzYWJsZV9pbnRlcnJ1cHRzKGh2Y3NkLT52ZGV2KTsKKwlodmNzZC0+dG9kb19tYXNrIHw9IEhWQ1NfU0NIRURfUkVBRDsKKwlzcGluX3VubG9jaygmaHZjc2QtPmxvY2spOworCWh2Y3Nfa2ljaygpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGh2Y3NkLT5sb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGh2Y3NfdHJ5X3dyaXRlKHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QpCit7CisJdWludDMyX3QgdW5pdF9hZGRyZXNzID0gaHZjc2QtPnZkZXYtPnVuaXRfYWRkcmVzczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaHZjc2QtPnR0eTsKKwlpbnQgc2VudDsKKworCWlmIChodmNzZC0+dG9kb19tYXNrICYgSFZDU19UUllfV1JJVEUpIHsKKwkJLyogd29uJ3Qgc2VuZCBwYXJ0aWFsIHdyaXRlcyAqLworCQlzZW50ID0gaHZjX3B1dF9jaGFycyh1bml0X2FkZHJlc3MsCisJCQkJJmh2Y3NkLT5idWZmZXJbMF0sCisJCQkJaHZjc2QtPmNoYXJzX2luX2J1ZmZlciApOworCQlpZiAoc2VudCA+IDApIHsKKwkJCWh2Y3NkLT5jaGFyc19pbl9idWZmZXIgPSAwOworCQkJLyogd21iKCk7ICovCisJCQlodmNzZC0+dG9kb19tYXNrICY9IH4oSFZDU19UUllfV1JJVEUpOworCQkJLyogd21iKCk7ICovCisKKwkJCS8qCisJCQkgKiBXZSBhcmUgc3RpbGwgb2JsaWdhdGVkIHRvIGRlbGl2ZXIgdGhlIGRhdGEgdG8gdGhlCisJCQkgKiBoeXBlcnZpc29yIGV2ZW4gaWYgdGhlIHR0eSBoYXMgYmVlbiBjbG9zZWQgYmVjYXVzZQorCQkJICogd2UgY29tbWl0ZWQgdG8gZGVsaXZlcmluZyBpdC4gIEJ1dCBkb24ndCB0cnkgdG8gd2FrZQorCQkJICogYSBub24tZXhpc3RlbnQgdHR5LgorCQkJICovCisJCQlpZiAodHR5KSB7CisJCQkJdHR5X3dha2V1cCh0dHkpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IGh2Y3NfaW8oc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCkKK3sKKwl1aW50MzJfdCB1bml0X2FkZHJlc3M7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwljaGFyIGJ1ZltIVkNTX0JVRkZfTEVOXSBfX0FMSUdORURfXzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBnb3QgPSAwOworCWludCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisKKwl1bml0X2FkZHJlc3MgPSBodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzOworCXR0eSA9IGh2Y3NkLT50dHk7CisKKwlodmNzX3RyeV93cml0ZShodmNzZCk7CisKKwlpZiAoIXR0eSB8fCB0ZXN0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykpIHsKKwkJaHZjc2QtPnRvZG9fbWFzayAmPSB+KEhWQ1NfUkVBRF9NQVNLKTsKKwkJZ290byBiYWlsOworCX0gZWxzZSBpZiAoIShodmNzZC0+dG9kb19tYXNrICYgKEhWQ1NfUkVBRF9NQVNLKSkpCisJCWdvdG8gYmFpbDsKKworCS8qIHJlbW92ZSB0aGUgcmVhZCBtYXNrcyAqLworCWh2Y3NkLT50b2RvX21hc2sgJj0gfihIVkNTX1JFQURfTUFTSyk7CisKKwlpZiAoKHR0eS0+ZmxpcC5jb3VudCArIEhWQ1NfQlVGRl9MRU4pIDwgVFRZX0ZMSVBCVUZfU0laRSkgeworCQlnb3QgPSBodmNfZ2V0X2NoYXJzKHVuaXRfYWRkcmVzcywKKwkJCQkmYnVmWzBdLAorCQkJCUhWQ1NfQlVGRl9MRU4pOworCQlmb3IgKGk9MDtnb3QgJiYgaTxnb3Q7aSsrKQorCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBidWZbaV0sIFRUWV9OT1JNQUwpOworCX0KKworCS8qIEdpdmUgdGhlIFRUWSB0aW1lIHRvIHByb2Nlc3MgdGhlIGRhdGEgd2UganVzdCBzZW50LiAqLworCWlmIChnb3QpCisJCWh2Y3NkLT50b2RvX21hc2sgfD0gSFZDU19RVUlDS19SRUFEOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlpZiAodHR5LT5mbGlwLmNvdW50KSB7CisJCS8qIFRoaXMgaXMgc3luY2ggYmVjYXVzZSB0dHktPmxvd19sYXRlbmN5ID09IDEgKi8KKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwl9CisKKwlpZiAoIWdvdCkgeworCQkvKiBEbyB0aGlzIF9hZnRlcl8gdGhlIGZsaXBfYnVmZmVyX3B1c2ggKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJCXZpb19lbmFibGVfaW50ZXJydXB0cyhodmNzZC0+dmRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIGh2Y3NkLT50b2RvX21hc2s7CisKKyBiYWlsOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGh2Y3NkLT50b2RvX21hc2s7Cit9CisKK3N0YXRpYyBpbnQga2h2Y3NkKHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkOworCWludCBodmNzX3RvZG9fbWFzazsKKworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCWRvIHsKKwkJaHZjc190b2RvX21hc2sgPSAwOworCQlodmNzX2tpY2tlZCA9IDA7CisJCXdtYigpOworCisJCXNwaW5fbG9jaygmaHZjc19zdHJ1Y3RzX2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGh2Y3NkLCAmaHZjc19zdHJ1Y3RzLCBuZXh0KSB7CisJCQlodmNzX3RvZG9fbWFzayB8PSBodmNzX2lvKGh2Y3NkKTsKKwkJfQorCQlzcGluX3VubG9jaygmaHZjc19zdHJ1Y3RzX2xvY2spOworCisJCS8qCisJCSAqIElmIGFueSBvZiB0aGUgaHZjcyBhZGFwdGVycyB3YW50IHRvIHRyeSBhIHdyaXRlIG9yIHF1aWNrIHJlYWQKKwkJICogZG9uJ3Qgc2NoZWR1bGUoKSwgeWllbGQgYSBzbWlkZ2VuIHRoZW4gZXhlY3V0ZSB0aGUgaHZjc19pbworCQkgKiB0aHJlYWQgYWdhaW4gZm9yIHRob3NlIHRoYXQgd2FudCB0aGUgd3JpdGUuCisJCSAqLworCQkgaWYgKGh2Y3NfdG9kb19tYXNrICYgKEhWQ1NfVFJZX1dSSVRFIHwgSFZDU19RVUlDS19SRUFEKSkgeworCQkJeWllbGQoKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKCFodmNzX2tpY2tlZCkKKwkJCXNjaGVkdWxlKCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgaHZjc19kcml2ZXJfdGFibGVbXSBfX2RldmluaXRkYXRhPSB7CisJeyJzZXJpYWwtc2VydmVyIiwgImh2dGVybTIifSwKKwl7IE5VTEwsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgaHZjc19kcml2ZXJfdGFibGUpOworCitzdGF0aWMgdm9pZCBodmNzX3JldHVybl9pbmRleChpbnQgaW5kZXgpCit7CisJLyogUGFyYW5vaWEgY2hlY2sgKi8KKwlpZiAoIWh2Y3NfaW5kZXhfbGlzdCkKKwkJcmV0dXJuOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaHZjc19pbmRleF9jb3VudCkKKwkJcmV0dXJuOworCWlmIChodmNzX2luZGV4X2xpc3RbaW5kZXhdID09IC0xKQorCQlyZXR1cm47CisJZWxzZQorCQlodmNzX2luZGV4X2xpc3RbaW5kZXhdID0gLTE7Cit9CisKKy8qIGNhbGxiYWNrIHdoZW4gdGhlIGtib2plY3QgcmVmIGNvdW50IHJlYWNoZXMgemVybyAqLworc3RhdGljIHZvaWQgZGVzdHJveV9odmNzX3N0cnVjdChzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gZnJvbV9rb2JqKGtvYmopOworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2soJmh2Y3Nfc3RydWN0c19sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCS8qIHRoZSBsaXN0X2RlbCBwb2lzb25zIHRoZSBwb2ludGVycyAqLworCWxpc3RfZGVsKCYoaHZjc2QtPm5leHQpKTsKKworCWlmIChodmNzZC0+Y29ubmVjdGVkID09IDEpIHsKKwkJaHZjc19wYXJ0bmVyX2ZyZWUoaHZjc2QpOworCQlwcmludGsoS0VSTl9JTkZPICJIVkNTOiBDbG9zZWQgdnR5LXNlcnZlckAlWCBhbmQiCisJCQkJIiBwYXJ0bmVyIHZ0eUAlWDolZCBjb25uZWN0aW9uLlxuIiwKKwkJCQlodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzLAorCQkJCWh2Y3NkLT5wX3VuaXRfYWRkcmVzcywKKwkJCQkodWludDMyX3QpaHZjc2QtPnBfcGFydGl0aW9uX0lEKTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogRGVzdHJveWVkIGh2Y3Nfc3RydWN0IGZvciB2dHktc2VydmVyQCVYLlxuIiwKKwkJCWh2Y3NkLT52ZGV2LT51bml0X2FkZHJlc3MpOworCisJdmRldiA9IGh2Y3NkLT52ZGV2OworCWh2Y3NkLT52ZGV2ID0gTlVMTDsKKworCWh2Y3NkLT5wX3VuaXRfYWRkcmVzcyA9IDA7CisJaHZjc2QtPnBfcGFydGl0aW9uX0lEID0gMDsKKwlodmNzX3JldHVybl9pbmRleChodmNzZC0+aW5kZXgpOworCW1lbXNldCgmaHZjc2QtPnBfbG9jYXRpb25fY29kZVswXSwgMHgwMCwgSFZDU19DTENfTEVOR1RIICsgMSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisKKwlodmNzX3JlbW92ZV9kZXZpY2VfYXR0cnModmRldik7CisKKwlrZnJlZShodmNzZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGh2Y3Nfa29ial90eXBlID0geworCS5yZWxlYXNlID0gZGVzdHJveV9odmNzX3N0cnVjdCwKK307CisKK3N0YXRpYyBpbnQgaHZjc19nZXRfaW5kZXgodm9pZCkKK3sKKwlpbnQgaTsKKwkvKiBQYXJhbm9pYSBjaGVjayAqLworCWlmICghaHZjc19pbmRleF9saXN0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogaHZjc19pbmRleF9saXN0IE5PVCB2YWxpZCEuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCS8qIEZpbmQgdGhlIG51bWVyaWNhbGx5IGxvd2VzdCBmaXJzdCBmcmVlIGluZGV4LiAqLworCWZvcihpID0gMDsgaSA8IGh2Y3NfaW5kZXhfY291bnQ7IGkrKykgeworCQlpZiAoaHZjc19pbmRleF9saXN0W2ldID09IC0xKSB7CisJCQlodmNzX2luZGV4X2xpc3RbaV0gPSAwOworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBodmNzX3Byb2JlKAorCXN0cnVjdCB2aW9fZGV2ICpkZXYsCisJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2Q7CisJaW50IGluZGV4OworCisJaWYgKCFkZXYgfHwgIWlkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogcHJvYmVkIHdpdGggaW52YWxpZCBwYXJhbWV0ZXIuXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBlYXJseSB0byBhdm9pZCBjbGVhbnVwIG9uIGZhaWx1cmUgKi8KKwlpbmRleCA9IGh2Y3NfZ2V0X2luZGV4KCk7CisJaWYgKGluZGV4IDwgMCkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlodmNzZCA9IGttYWxsb2Moc2l6ZW9mKCpodmNzZCksIEdGUF9LRVJORUwpOworCWlmICghaHZjc2QpCisJCXJldHVybiAtRU5PREVWOworCisJLyogaHZjc2QtPnR0eSBpcyB6ZXJvZWQgb3V0IHdpdGggdGhlIG1lbXNldCAqLworCW1lbXNldChodmNzZCwgMHgwMCwgc2l6ZW9mKCpodmNzZCkpOworCisJc3Bpbl9sb2NrX2luaXQoJmh2Y3NkLT5sb2NrKTsKKwkvKiBBdXRvbWF0aWNhbGx5IGluY3MgdGhlIHJlZmNvdW50IHRoZSBmaXJzdCB0aW1lICovCisJa29iamVjdF9pbml0KCZodmNzZC0+a29iaik7CisJLyogU2V0IHVwIHRoZSBjYWxsYmFjayBmb3IgdGVybWluYXRpbmcgdGhlIGh2Y3Nfc3RydWN0J3MgbGlmZSAqLworCWh2Y3NkLT5rb2JqLmt0eXBlID0gJmh2Y3Nfa29ial90eXBlOworCisJaHZjc2QtPnZkZXYgPSBkZXY7CisJZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBodmNzZDsKKworCWh2Y3NkLT5pbmRleCA9IGluZGV4OworCisJLyogaHZjc2QtPmluZGV4ID0gKytodmNzX3N0cnVjdF9jb3VudDsgKi8KKwlodmNzZC0+Y2hhcnNfaW5fYnVmZmVyID0gMDsKKwlodmNzZC0+dG9kb19tYXNrID0gMDsKKwlodmNzZC0+Y29ubmVjdGVkID0gMDsKKworCS8qCisJICogVGhpcyB3aWxsIHBvcHVsYXRlIHRoZSBodmNzX3N0cnVjdCdzIHBhcnRuZXIgaW5mbyBmaWVsZHMgZm9yIHRoZQorCSAqIGZpcnN0IHRpbWUuCisJICovCisJaWYgKGh2Y3NfZ2V0X3BpKGh2Y3NkKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkhWQ1M6IEZhaWxlZCB0byBmZXRjaCBwYXJ0bmVyIgorCQkJIiBpbmZvIGZvciB2dHktc2VydmVyQCVYIG9uIGRldmljZSBwcm9iZS5cbiIsCisJCQlodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzKTsKKwl9CisKKwkvKgorCSAqIElmIGEgdXNlciBhcHAgb3BlbnMgYSB0dHkgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIHZ0eS1zZXJ2ZXIgYmVmb3JlCisJICogdGhlIGh2Y3Nfc3RydWN0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBkZXZpY2VzIGxpc3QgdGhlbiB0aGUgdXNlciBhcHAKKwkgKiB3aWxsIGdldCAtRU5PREVWLgorCSAqLworCisJc3Bpbl9sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisKKwlsaXN0X2FkZF90YWlsKCYoaHZjc2QtPm5leHQpLCAmaHZjc19zdHJ1Y3RzKTsKKworCXNwaW5fdW5sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisKKwlodmNzX2NyZWF0ZV9kZXZpY2VfYXR0cnMoaHZjc2QpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogdnR5LXNlcnZlckAlWCBhZGRlZCB0byB0aGUgdmlvIGJ1cy5cbiIsIGRldi0+dW5pdF9hZGRyZXNzKTsKKworCS8qCisJICogRE9OJ1QgZW5hYmxlIGludGVycnVwdHMgaGVyZSBiZWNhdXNlIHRoZXJlIGlzIG5vIHVzZXIgdG8gcmVjZWl2ZSB0aGUKKwkgKiBkYXRhLgorCSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBodmNzX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqZGV2KQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBkZXYtPmRldi5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBrb2JqZWN0ICprb2JqcDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCisJaWYgKCFodmNzZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBCeSB0aGlzIHRpbWUgdGhlIHZ0eS1zZXJ2ZXIgd29uJ3QgYmUgZ2V0dGluZyBhbnkgbW9yZSBpbnRlcnJ1cHMgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCisJdHR5ID0gaHZjc2QtPnR0eTsKKworCWtvYmpwID0gJmh2Y3NkLT5rb2JqOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogTGV0IHRoZSBsYXN0IGhvbGRlciBvZiB0aGlzIG9iamVjdCBjYXVzZSBpdCB0byBiZSByZW1vdmVkLCB3aGljaAorCSAqIHdvdWxkIHByb2JhYmx5IGJlIHR0eV9oYW5ndXAgYmVsb3cuCisJICovCisJa29iamVjdF9wdXQgKGtvYmpwKTsKKworCS8qCisJICogVGhlIGhhbmd1cCBpcyBhIHNjaGVkdWxlZCBmdW5jdGlvbiB3aGljaCB3aWxsIGF1dG8gY2hhaW4gY2FsbAorCSAqIGh2Y3NfaGFuZ3VwLiAgVGhlIHR0eSBzaG91bGQgYWx3YXlzIGJlIHZhbGlkIGF0IHRoaXMgdGltZSB1bmxlc3MgYQorCSAqIHNpbXVsdGFuZW91cyB0dHkgY2xvc2UgYWxyZWFkeSBjbGVhbmVkIHVwIHRoZSBodmNzX3N0cnVjdC4KKwkgKi8KKwlpZiAodHR5KQorCQl0dHlfaGFuZ3VwKHR0eSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJIVkNTOiB2dHktc2VydmVyQCVYIHJlbW92ZWQgZnJvbSB0aGUiCisJCQkiIHZpbyBidXMuXG4iLCBkZXYtPnVuaXRfYWRkcmVzcyk7CisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgaHZjc192aW9fZHJpdmVyID0geworCS5uYW1lCQk9IGh2Y3NfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlCT0gaHZjc19kcml2ZXJfdGFibGUsCisJLnByb2JlCQk9IGh2Y3NfcHJvYmUsCisJLnJlbW92ZQkJPSBodmNzX3JlbW92ZSwKK307CisKKy8qIE9ubHkgY2FsbGVkIGZyb20gaHZjc19nZXRfcGkgcGxlYXNlICovCitzdGF0aWMgdm9pZCBodmNzX3NldF9waShzdHJ1Y3QgaHZjc19wYXJ0bmVyX2luZm8gKnBpLCBzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKQoreworCWludCBjbGNsZW5ndGg7CisKKwlodmNzZC0+cF91bml0X2FkZHJlc3MgPSBwaS0+dW5pdF9hZGRyZXNzOworCWh2Y3NkLT5wX3BhcnRpdGlvbl9JRCAgPSBwaS0+cGFydGl0aW9uX0lEOworCWNsY2xlbmd0aCA9IHN0cmxlbigmcGktPmxvY2F0aW9uX2NvZGVbMF0pOworCWlmIChjbGNsZW5ndGggPiBIVkNTX0NMQ19MRU5HVEgpCisJCWNsY2xlbmd0aCA9IEhWQ1NfQ0xDX0xFTkdUSDsKKworCS8qIGNvcHkgdGhlIG51bGwtdGVybSBjaGFyIHRvbyAqLworCXN0cm5jcHkoJmh2Y3NkLT5wX2xvY2F0aW9uX2NvZGVbMF0sCisJCQkmcGktPmxvY2F0aW9uX2NvZGVbMF0sIGNsY2xlbmd0aCArIDEpOworfQorCisvKgorICogVHJhdmVyc2UgdGhlIGxpc3QgYW5kIGFkZCB0aGUgcGFydG5lciBpbmZvIHRoYXQgaXMgZm91bmQgdG8gdGhlIGh2Y3Nfc3RydWN0CisgKiBzdHJ1Y3QgZW50cnkuIE5PVEU6IEF0IHRoaXMgdGltZSBJIGtub3cgdGhhdCBwYXJ0bmVyIGluZm8gd2lsbCByZXR1cm4gYQorICogc2luZ2xlIGVudHJ5IGJ1dCBpbiB0aGUgZnV0dXJlIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBwYXJ0bmVyIGluZm8gZW50cmllcyBwZXIKKyAqIHZ0eS1zZXJ2ZXIgYW5kIHlvdSdsbCB3YW50IHRvIHplcm8gb3V0IHRoYXQgbGlzdCBhbmQgcmVzZXQgaXQuICBJZiBmb3Igc29tZQorICogcmVhc29uIHlvdSBoYXZlIGFuIG9sZCB2ZXJzaW9uIG9mIHRoaXMgZHJpdmVyIGJ1dCB0aGVyZSBJUyBtb3JlIHRoYW4gb25lCisgKiBwYXJ0bmVyIGluZm8gdGhlbiBodmNzZC0+cF8qIHdpbGwgaG9sZCB0aGUgbGFzdCBwYXJ0bmVyIGluZm8gZGF0YSBmcm9tIHRoZQorICogZmlybXdhcmUgcXVlcnkuICBBIGdvb2Qgd2F5IHRvIHVwZGF0ZSB0aGlzIGNvZGUgd291bGQgYmUgdG8gcmVwbGFjZSB0aGUgdGhyZWUKKyAqIHBhcnRuZXIgaW5mbyBmaWVsZHMgaW4gaHZjc19zdHJ1Y3Qgd2l0aCBhIGxpc3Qgb2YgaHZjc19wYXJ0bmVyX2luZm8KKyAqIGluc3RhbmNlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGh2Y3NkLT5sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgaHZjc19nZXRfcGkoc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCkKK3sKKwlzdHJ1Y3QgaHZjc19wYXJ0bmVyX2luZm8gKnBpOworCXVpbnQzMl90IHVuaXRfYWRkcmVzcyA9IGh2Y3NkLT52ZGV2LT51bml0X2FkZHJlc3M7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCWludCByZXR2YWw7CisKKwlzcGluX2xvY2soJmh2Y3NfcGlfbG9jayk7CisJaWYgKCFodmNzX3BpX2J1ZmYpIHsKKwkJc3Bpbl91bmxvY2soJmh2Y3NfcGlfbG9jayk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR2YWwgPSBodmNzX2dldF9wYXJ0bmVyX2luZm8odW5pdF9hZGRyZXNzLCAmaGVhZCwgaHZjc19waV9idWZmKTsKKwlzcGluX3VubG9jaygmaHZjc19waV9sb2NrKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogRmFpbGVkIHRvIGZldGNoIHBhcnRuZXIiCisJCQkiIGluZm8gZm9yIHZ0eS1zZXJ2ZXJAJXguXG4iLCB1bml0X2FkZHJlc3MpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCS8qIG5peGVzIHRoZSB2YWx1ZXMgaWYgdGhlIHBhcnRuZXIgdnR5IHdlbnQgYXdheSAqLworCWh2Y3NkLT5wX3VuaXRfYWRkcmVzcyA9IDA7CisJaHZjc2QtPnBfcGFydGl0aW9uX0lEID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocGksICZoZWFkLCBub2RlKQorCQlodmNzX3NldF9waShwaSwgaHZjc2QpOworCisJaHZjc19mcmVlX3BhcnRuZXJfaW5mbygmaGVhZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IHRoZSBkcml2ZXIgInJlc2NhbiIgc3lzZnMgZW50cnkuICBJdCBzaG91bGRuJ3QKKyAqIGJlIGV4ZWN1dGVkIGVsc2V3aGVyZSwgaW4gb3JkZXIgdG8gcHJldmVudCBkZWFkbG9jayBpc3N1ZXMuCisgKi8KK3N0YXRpYyBpbnQgaHZjc19yZXNjYW5fZGV2aWNlc19saXN0KHZvaWQpCit7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGh2Y3NkLCAmaHZjc19zdHJ1Y3RzLCBuZXh0KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCQlodmNzX2dldF9waShodmNzZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJfQorCisJc3Bpbl91bmxvY2soJmh2Y3Nfc3RydWN0c19sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRmFybSB0aGlzIG9mZiBpbnRvIGl0cyBvd24gZnVuY3Rpb24gYmVjYXVzZSBpdCBjb3VsZCBiZSBtb3JlIGNvbXBsZXggb25jZQorICogbXVsdGlwbGUgcGFydG5lcnMgc3VwcG9ydCBpcyBhZGRlZC4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGgKKyAqIHRoZSBodmNzZC0+bG9jayBoZWxkLgorICovCitzdGF0aWMgaW50IGh2Y3NfaGFzX3BpKHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QpCit7CisJaWYgKCghaHZjc2QtPnBfdW5pdF9hZGRyZXNzKSB8fCAoIWh2Y3NkLT5wX3BhcnRpdGlvbl9JRCkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogTk9URTogSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgc3VwZXIgYWRtaW4gcmVtb3ZlZCBhIHBhcnRuZXIgdnR5IGFuZCB0aGVuCisgKiBhZGRlZCBhIGRpZmZlcmVudCB2dHkgYXMgdGhlIG5ldyBwYXJ0bmVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgaHZjc2QtPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBodmNzX3BhcnRuZXJfY29ubmVjdChzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKQoreworCWludCByZXR2YWw7CisJdW5zaWduZWQgaW50IHVuaXRfYWRkcmVzcyA9IGh2Y3NkLT52ZGV2LT51bml0X2FkZHJlc3M7CisKKwkvKgorCSAqIElmIHRoZXJlIHdhc24ndCBhbnkgcGkgd2hlbiB0aGUgZGV2aWNlIHdhcyBhZGRlZCBpdCBkb2Vzbid0IG1lYW50CisJICogdGhlcmUgaXNuJ3QgYW55IG5vdy4gIFRoaXMgZHJpdmVyIGlzbid0IG5vdGlmaWVkIHdoZW4gYSBuZXcgcGFydG5lcgorCSAqIHZ0eSBpcyBhZGRlZCB0byBhIHZ0eS1zZXJ2ZXIgc28gd2UgZGlzY292ZXIgY2hhbmdlcyBvbiBvdXIgb3duLgorCSAqIFBsZWFzZSBzZWUgY29tbWVudHMgaW4gaHZjc19yZWdpc3Rlcl9jb25uZWN0aW9uKCkgZm9yIGp1c3RpZmljYXRpb24KKwkgKiBvZiB0aGlzIGJpemFycmUgY29kZS4KKwkgKi8KKwlyZXR2YWwgPSBodmNzX3JlZ2lzdGVyX2Nvbm5lY3Rpb24odW5pdF9hZGRyZXNzLAorCQkJaHZjc2QtPnBfcGFydGl0aW9uX0lELAorCQkJaHZjc2QtPnBfdW5pdF9hZGRyZXNzKTsKKwlpZiAoIXJldHZhbCkgeworCQlodmNzZC0+Y29ubmVjdGVkID0gMTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChyZXR2YWwgIT0gLUVJTlZBTCkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qCisJICogQXMgcGVyIHRoZSBzcGVjIHJlLWdldCB0aGUgcGkgYW5kIHRyeSBhZ2FpbiBpZiAtRUlOVkFMIGFmdGVyIHRoZQorCSAqIGZpcnN0IGNvbm5lY3Rpb24gYXR0ZW1wdC4KKwkgKi8KKwlpZiAoaHZjc19nZXRfcGkoaHZjc2QpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghaHZjc19oYXNfcGkoaHZjc2QpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHZhbCA9IGh2Y3NfcmVnaXN0ZXJfY29ubmVjdGlvbih1bml0X2FkZHJlc3MsCisJCQlodmNzZC0+cF9wYXJ0aXRpb25fSUQsCisJCQlodmNzZC0+cF91bml0X2FkZHJlc3MpOworCWlmIChyZXR2YWwgIT0gLUVJTlZBTCkgeworCQlodmNzZC0+Y29ubmVjdGVkID0gMTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKgorCSAqIEVCVVNZIGlzIHRoZSBtb3N0IGxpa2VseSBzY2VuYXJpbyB0aG91Z2ggdGhlIHZ0eSBjb3VsZCBoYXZlIGJlZW4KKwkgKiByZW1vdmVkIG9yIHRoZXJlIHJlYWxseSBjb3VsZCBiZSBhbiBoY2FsbCBlcnJvciBkdWUgdG8gdGhlIHBhcmFtZXRlcgorCSAqIGRhdGEgYnV0IHRoYW5rcyB0byBhbWJpZ3VvdXMgZmlybXdhcmUgcmV0dXJuIGNvZGVzIHdlIGNhbid0IHJlYWxseQorCSAqIHRlbGwuCisJICovCisJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogdnR5LXNlcnZlciBvciBwYXJ0bmVyIgorCQkJIiB2dHkgaXMgYnVzeS4gIFRyeSBhZ2FpbiBsYXRlci5cbiIpOworCXJldHVybiAtRUJVU1k7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgaHZjc2QtPmxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQgaHZjc19wYXJ0bmVyX2ZyZWUoc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCkKK3sKKwlpbnQgcmV0dmFsOworCWRvIHsKKwkJcmV0dmFsID0gaHZjc19mcmVlX2Nvbm5lY3Rpb24oaHZjc2QtPnZkZXYtPnVuaXRfYWRkcmVzcyk7CisJfSB3aGlsZSAocmV0dmFsID09IC1FQlVTWSk7CisJaHZjc2QtPmNvbm5lY3RlZCA9IDA7Cit9CisKKy8qIFRoaXMgaGVscGVyIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIFdJVEhPVVQgdGhlIGh2Y3NkLT5sb2NrIGhlbGQgKi8KK3N0YXRpYyBpbnQgaHZjc19lbmFibGVfZGV2aWNlKHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QsIHVpbnQzMl90IHVuaXRfYWRkcmVzcywKKwkJdW5zaWduZWQgaW50IGlycSwgc3RydWN0IHZpb19kZXYgKnZkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHZ0eS1zZXJ2ZXIgd2FzIHJlbW92ZWQgYmV0d2VlbiB0aGUgdGltZSB0aGF0CisJICogdGhlIGNvbm4gd2FzIHJlZ2lzdGVyZWQgYW5kIG5vdy4KKwkgKi8KKwlpZiAoIShyYyA9IHJlcXVlc3RfaXJxKGlycSwgJmh2Y3NfaGFuZGxlX2ludGVycnVwdCwKKwkJCQlTQV9JTlRFUlJVUFQsICJpYm1odmNzIiwgaHZjc2QpKSkgeworCQkvKgorCQkgKiBJdCBpcyBwb3NzaWJsZSB0aGUgdnR5LXNlcnZlciB3YXMgcmVtb3ZlZCBhZnRlciB0aGUgaXJxIHdhcworCQkgKiByZXF1ZXN0ZWQgYnV0IGJlZm9yZSB3ZSBoYXZlIHRpbWUgdG8gZW5hYmxlIGludGVycnVwdHMuCisJCSAqLworCQlpZiAodmlvX2VuYWJsZV9pbnRlcnJ1cHRzKHZkZXYpID09IEhfU3VjY2VzcykKKwkJCXJldHVybiAwOworCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogaW50IGVuYWJsZSBmYWlsZWQgZm9yIgorCQkJCQkiIHZ0eS1zZXJ2ZXJAJVguXG4iLCB1bml0X2FkZHJlc3MpOworCQkJZnJlZV9pcnEoaXJxLCBodmNzZCk7CisJCX0KKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJIVkNTOiBpcnEgcmVxIGZhaWxlZCBmb3IiCisJCQkJIiB2dHktc2VydmVyQCVYLlxuIiwgdW5pdF9hZGRyZXNzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCWh2Y3NfcGFydG5lcl9mcmVlKGh2Y3NkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJjOworCit9CisKKy8qCisgKiBUaGlzIGFsd2F5cyBpbmNyZW1lbnRzIHRoZSBrb2JqZWN0IHJlZiBjb3VudCBpZiB0aGUgY2FsbCBpcyBzdWNjZXNzZnVsLgorICogUGxlYXNlIHJlbWVtYmVyIHRvIGRlYyB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoZSBpbnN0YW5jZS4KKyAqCisgKiBOT1RJQ0U6IERvIE5PVCBob2xkIGVpdGhlciB0aGUgaHZjc19zdHJ1Y3QubG9jayBvciBodmNzX3N0cnVjdHNfbG9jayB3aGVuCisgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gb3IgeW91IHdpbGwgZ2V0IGRlYWRsb2NrLgorICovCitzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NfZ2V0X2J5X2luZGV4KGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisJLyogV2UgY2FuIGltbWVkaWF0ZWx5IGRpc2NhcmQgT09CIHJlcXVlc3RzICovCisJaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBIVkNTX01BWF9TRVJWRVJfQURBUFRFUlMpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShodmNzZCwgJmh2Y3Nfc3RydWN0cywgbmV4dCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoaHZjc2QtPmluZGV4ID09IGluZGV4KSB7CisJCQkJa29iamVjdF9nZXQoJmh2Y3NkLT5rb2JqKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCQkJCXNwaW5fdW5sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisJCQkJcmV0dXJuIGh2Y3NkOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlodmNzZCA9IE5VTEw7CisJfQorCisJc3Bpbl91bmxvY2soJmh2Y3Nfc3RydWN0c19sb2NrKTsKKwlyZXR1cm4gaHZjc2Q7Cit9CisKKy8qCisgKiBUaGlzIGlzIGludm9rZWQgdmlhIHRoZSB0dHlfb3BlbiBpbnRlcmZhY2Ugd2hlbiBhIHVzZXIgYXBwIGNvbm5lY3RzIHRvIHRoZQorICogL2RldiBub2RlLgorICovCitzdGF0aWMgaW50IGh2Y3Nfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkOworCWludCByYywgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpcnE7CisJc3RydWN0IHZpb19kZXYgKnZkZXY7CisJdW5zaWduZWQgbG9uZyB1bml0X2FkZHJlc3M7CisJc3RydWN0IGtvYmplY3QgKmtvYmpwOworCisJaWYgKHR0eS0+ZHJpdmVyX2RhdGEpCisJCWdvdG8gZmFzdF9vcGVuOworCisJLyoKKwkgKiBJcyB0aGVyZSBhIHZ0eS1zZXJ2ZXIgdGhhdCBzaGFyZXMgdGhlIHNhbWUgaW5kZXg/CisJICogVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBrb2JqZWN0IGluZGV4LgorCSAqLworCWlmICghKGh2Y3NkID0gaHZjc19nZXRfYnlfaW5kZXgodHR5LT5pbmRleCkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhWQ1M6IG9wZW4gZmFpbGVkLCBubyBkZXZpY2UgYXNzb2NpYXRlZCIKKwkJCQkiIHdpdGggdHR5LT5pbmRleCAlZC5cbiIsIHR0eS0+aW5kZXgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCWlmIChodmNzZC0+Y29ubmVjdGVkID09IDApCisJCWlmICgocmV0dmFsID0gaHZjc19wYXJ0bmVyX2Nvbm5lY3QoaHZjc2QpKSkKKwkJCWdvdG8gZXJyb3JfcmVsZWFzZTsKKworCWh2Y3NkLT5vcGVuX2NvdW50ID0gMTsKKwlodmNzZC0+dHR5ID0gdHR5OworCXR0eS0+ZHJpdmVyX2RhdGEgPSBodmNzZDsKKworCS8qCisJICogU2V0IHRoaXMgZHJpdmVyIHRvIGxvdyBsYXRlbmN5IHNvIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBhIGNoYW5jZSBhdAorCSAqIGNhdGNoaW5nIGEgdGhyb3R0bGVkIFRUWSBhZnRlciB3ZSBmbGlwX2J1ZmZlcl9wdXNoLiAgT3RoZXJ3aXNlIHRoZQorCSAqIGZsdXNoX3RvX2FzeW5jIG1heSBub3QgZXhlY3V0ZSB1bnRpbCBhZnRlciB0aGUga2VybmVsX3RocmVhZCBoYXMKKwkgKiB5aWVsZGVkIGFuZCByZXN1bWVkIHRoZSBuZXh0IGZsaXBfYnVmZmVyX3B1c2ggcmVzdWx0aW5nIGluIGRhdGEKKwkgKiBsb3NzLgorCSAqLworCXR0eS0+bG93X2xhdGVuY3kgPSAxOworCisJbWVtc2V0KCZodmNzZC0+YnVmZmVyWzBdLCAweDAwLCBIVkNTX0JVRkZfTEVOKTsKKworCS8qCisJICogU2F2ZSB0aGVzZSBpbiB0aGUgc3BpbmxvY2sgZm9yIHRoZSBlbmFibGUgb3BlcmF0aW9ucyB0aGF0IG5lZWQgdGhlbQorCSAqIG91dHNpZGUgb2YgdGhlIHNwaW5sb2NrLgorCSAqLworCWlycSA9IGh2Y3NkLT52ZGV2LT5pcnE7CisJdmRldiA9IGh2Y3NkLT52ZGV2OworCXVuaXRfYWRkcmVzcyA9IGh2Y3NkLT52ZGV2LT51bml0X2FkZHJlc3M7CisKKwlodmNzZC0+dG9kb19tYXNrIHw9IEhWQ1NfU0NIRURfUkVBRDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBUaGlzIG11c3QgYmUgZG9uZSBvdXRzaWRlIG9mIHRoZSBzcGlubG9jayBiZWNhdXNlIGl0IHJlcXVlc3RzIGlycXMKKwkgKiBhbmQgd2lsbCBncmFiIHRoZSBzcGlubG9jayBhbmQgZnJlZSB0aGUgY29ubmVjdGlvbiBpZiBpdCBmYWlscy4KKwkgKi8KKwlpZiAoKChyYyA9IGh2Y3NfZW5hYmxlX2RldmljZShodmNzZCwgdW5pdF9hZGRyZXNzLCBpcnEsIHZkZXYpKSkpIHsKKwkJa29iamVjdF9wdXQoJmh2Y3NkLT5rb2JqKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSFZDUzogZW5hYmxlIGRldmljZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWdvdG8gb3Blbl9zdWNjZXNzOworCitmYXN0X29wZW46CisJaHZjc2QgPSB0dHktPmRyaXZlcl9kYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJaWYgKCFrb2JqZWN0X2dldCgmaHZjc2QtPmtvYmopKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogS29iamVjdCBvZiBvcGVuIgorCQkJIiBodmNzIGRvZXNuJ3QgZXhpc3QuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7IC8qIElzIHRoaXMgdGhlIHJpZ2h0IHJldHVybiB2YWx1ZT8gKi8KKwl9CisKKwlodmNzZC0+b3Blbl9jb3VudCsrOworCisJaHZjc2QtPnRvZG9fbWFzayB8PSBIVkNTX1NDSEVEX1JFQUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKK29wZW5fc3VjY2VzczoKKwlodmNzX2tpY2soKTsKKworCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IHZ0eS1zZXJ2ZXJAJVggY29ubmVjdGlvbiBvcGVuZWQuXG4iLAorCQlodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzICk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfcmVsZWFzZToKKwlrb2JqcCA9ICZodmNzZC0+a29iajsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCWtvYmplY3RfcHV0KCZodmNzZC0+a29iaik7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJIVkNTOiBwYXJ0bmVyIGNvbm5lY3QgZmFpbGVkLlxuIik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgaHZjc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGtvYmplY3QgKmtvYmpwOworCWludCBpcnEgPSBOT19JUlE7CisKKwkvKgorCSAqIElzIHNvbWVvbmUgdHJ5aW5nIHRvIGNsb3NlIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldmljZSBhZnRlcgorCSAqIHdlIGhhdmUgaHVuZyB1cD8gIElmIHNvIHR0eS0+ZHJpdmVyX2RhdGEgd291bGRuJ3QgYmUgdmFsaWQuCisJICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpCisJCXJldHVybjsKKworCS8qCisJICogTm8gZHJpdmVyX2RhdGEgbWVhbnMgdGhhdCB0aGlzIGNsb3NlIHdhcyBwcm9iYWJseSBpc3N1ZWQgYWZ0ZXIgYQorCSAqIGZhaWxlZCBodmNzX29wZW4gYnkgdGhlIHR0eSBsYXllcidzIHJlbGVhc2VfZGV2KCkgYXBpIGFuZCB3ZSBjYW4ganVzdAorCSAqIGV4aXQgY2xlYW5seS4KKwkgKi8KKwlpZiAoIXR0eS0+ZHJpdmVyX2RhdGEpCisJCXJldHVybjsKKworCWh2Y3NkID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCWtvYmpwID0gJmh2Y3NkLT5rb2JqOworCWlmICgtLWh2Y3NkLT5vcGVuX2NvdW50ID09IDApIHsKKworCQl2aW9fZGlzYWJsZV9pbnRlcnJ1cHRzKGh2Y3NkLT52ZGV2KTsKKworCQkvKgorCQkgKiBOVUxMIHRoaXMgZWFybHkgc28gdGhhdCB0aGUga2VybmVsX3RocmVhZCBkb2Vzbid0IHRyeSB0bworCQkgKiBleGVjdXRlIGFueSBvcGVyYXRpb25zIG9uIHRoZSBUVFkgZXZlbiB0aG91Z2ggaXQgaXMgb2JsaWdhdGVkCisJCSAqIHRvIGRlbGl2ZXIgYW55IHBlbmRpbmcgSS9PIHRvIHRoZSBoeXBlcnZpc29yLgorCQkgKi8KKwkJaHZjc2QtPnR0eSA9IE5VTEw7CisKKwkJaXJxID0gaHZjc2QtPnZkZXYtPmlycTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgSFZDU19DTE9TRV9XQUlUKTsKKworCQkvKgorCQkgKiBUaGlzIGxpbmUgaXMgaW1wb3J0YW50IGJlY2F1c2UgaXQgdGVsbHMgaHZjc19vcGVuIHRoYXQgdGhpcworCQkgKiBkZXZpY2UgbmVlZHMgdG8gYmUgcmUtY29uZmlndXJlZCB0aGUgbmV4dCB0aW1lIGh2Y3Nfb3BlbiBpcworCQkgKiBjYWxsZWQuCisJCSAqLworCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKKworCQlmcmVlX2lycShpcnEsIGh2Y3NkKTsKKwkJa29iamVjdF9wdXQoa29ianApOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChodmNzZC0+b3Blbl9jb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJIVkNTOiB2dHktc2VydmVyQCVYIG9wZW5fY291bnQ6ICVkIgorCQkJCSIgaXMgbWlzc21hbmFnZWQuXG4iLAorCQlodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzLCBodmNzZC0+b3Blbl9jb3VudCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlrb2JqZWN0X3B1dChrb2JqcCk7Cit9CisKK3N0YXRpYyB2b2lkIGh2Y3NfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRlbXBfb3Blbl9jb3VudDsKKwlzdHJ1Y3Qga29iamVjdCAqa29ianA7CisJaW50IGlycSA9IE5PX0lSUTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCS8qIFByZXNlcnZlIHRoaXMgc28gdGhhdCB3ZSBrbm93IGhvdyBtYW55IGtvYmplY3QgcmVmcyB0byBwdXQgKi8KKwl0ZW1wX29wZW5fY291bnQgPSBodmNzZC0+b3Blbl9jb3VudDsKKworCS8qCisJICogRG9uJ3Qga29iamVjdCBwdXQgaW5zaWRlIHRoZSBzcGlubG9jayBiZWNhdXNlIHRoZSBkZXN0cnVjdGlvbgorCSAqIGNhbGxiYWNrIG1heSB1c2UgdGhlIHNwaW5sb2NrIGFuZCBpdCBtYXkgZ2V0IGNhbGxlZCBiZWZvcmUgdGhlCisJICogc3BpbmxvY2sgaGFzIGJlZW4gcmVsZWFzZWQuICBHZXQgYSBwb2ludGVyIHRvIHRoZSBrb2JqZWN0IGFuZAorCSAqIGtvYmplY3RfcHV0IG9uIHRoYXQgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBzcGlubG9jay4KKwkgKi8KKwlrb2JqcCA9ICZodmNzZC0+a29iajsKKworCXZpb19kaXNhYmxlX2ludGVycnVwdHMoaHZjc2QtPnZkZXYpOworCisJaHZjc2QtPnRvZG9fbWFzayA9IDA7CisKKwkvKiBJIGRvbid0IHRoaW5rIHRoZSB0dHkgbmVlZHMgdGhlIGh2Y3Nfc3RydWN0IHBvaW50ZXIgYWZ0ZXIgYSBoYW5ndXAgKi8KKwlodmNzZC0+dHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJaHZjc2QtPnR0eSA9IE5VTEw7CisKKwlodmNzZC0+b3Blbl9jb3VudCA9IDA7CisKKwkvKiBUaGlzIHdpbGwgZHJvcCBhbnkgYnVmZmVyZWQgZGF0YSBvbiB0aGUgZmxvb3Igd2hpY2ggaXMgT0sgaW4gYSBoYW5ndXAKKwkgKiBzY2VuYXJpby4gKi8KKwltZW1zZXQoJmh2Y3NkLT5idWZmZXJbMF0sIDB4MDAsIEhWQ1NfQlVGRl9MRU4pOworCWh2Y3NkLT5jaGFyc19pbl9idWZmZXIgPSAwOworCisJaXJxID0gaHZjc2QtPnZkZXYtPmlycTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisKKwlmcmVlX2lycShpcnEsIGh2Y3NkKTsKKworCS8qCisJICogV2UgbmVlZCB0byBrb2JqZWN0X3B1dCgpIGZvciBldmVyeSBvcGVuX2NvdW50IHdlIGhhdmUgc2luY2UgdGhlCisJICogdHR5X2hhbmd1cCgpIGZ1bmN0aW9uIGRvZXNuJ3QgaW52b2tlIGEgY2xvc2UgcGVyIG9wZW4gY29ubmVjdGlvbiBvbiBhCisJICogbm9uLWNvbnNvbGUgZGV2aWNlLgorCSAqLworCXdoaWxlKHRlbXBfb3Blbl9jb3VudCkgeworCQktLXRlbXBfb3Blbl9jb3VudDsKKwkJLyoKKwkJICogVGhlIGZpbmFsIHB1dCB3aWxsIHRyaWdnZXIgZGVzdHJ1Y3Rpb24gb2YgdGhlIGh2Y3Nfc3RydWN0LgorCQkgKiBOT1RFOiAgSWYgdGhpcyBoYW5ndXAgd2FzIHNpZ25hbGVkIGZyb20gdXNlciBzcGFjZSB0aGVuIHRoZQorCQkgKiBmaW5hbCBwdXQgd2lsbCBuZXZlciBoYXBwZW4uCisJCSAqLworCQlrb2JqZWN0X3B1dChrb2JqcCk7CisJfQorfQorCisvKgorICogTk9URTogVGhpcyBpcyBhbG1vc3QgYWx3YXlzIGZyb21fdXNlciBzaW5jZSB1c2VyIGxldmVsIGFwcHMgaW50ZXJhY3Qgd2l0aCB0aGUKKyAqIC9kZXYgbm9kZXMuIEknbSB0cnVzdGluZyB0aGF0IGlmIGh2Y3Nfd3JpdGUgZ2V0cyBjYWxsZWQgYW5kIGludGVycnVwdGVkIGJ5CisgKiBodmNzX3JlbW92ZSAod2hpY2ggcmVtb3ZlcyB0aGUgdGFyZ2V0IGRldmljZSBhbmQgZXhlY3V0ZXMgdHR5X2hhbmd1cCgpKSB0aGF0CisgKiB0dHlfaGFuZ3VwIHdpbGwgYWxsb3cgaHZjc193cml0ZSB0aW1lIHRvIGNvbXBsZXRlIGV4ZWN1dGlvbiBiZWZvcmUgaXQKKyAqIHRlcm1pbmF0ZXMgb3VyIGRldmljZS4KKyAqLworc3RhdGljIGludCBodmNzX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGludCB1bml0X2FkZHJlc3M7CisJY29uc3QgdW5zaWduZWQgY2hhciAqY2hhcmJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0b3RhbF9zZW50ID0gMDsKKwlpbnQgdG9zZW5kID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCS8qCisJICogSWYgdGhleSBkb24ndCBjaGVjayB0aGUgcmV0dXJuIGNvZGUgb2ZmIG9mIHRoZWlyIG9wZW4gdGhleSBtYXkKKwkgKiBhdHRlbXB0IHRoaXMgZXZlbiBpZiB0aGVyZSBpcyBubyBjb25uZWN0ZWQgZGV2aWNlLgorCSAqLworCWlmICghaHZjc2QpCisJCXJldHVybiAtRU5PREVWOworCisJLyogUmVhc29uYWJsZSBzaXplIHRvIHByZXZlbnQgdXNlciBsZXZlbCBmbG9vZGluZyAqLworCWlmIChjb3VudCA+IEhWQ1NfTUFYX0ZST01fVVNFUikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJIVkNTIHdyaXRlOiBjb3VudCBiZWluZyB0cnVuY2F0ZWQgdG8iCisJCQkJIiBIVkNTX01BWF9GUk9NX1VTRVIuXG4iKTsKKwkJY291bnQgPSBIVkNTX01BWF9GUk9NX1VTRVI7CisJfQorCisJY2hhcmJ1ZiA9IGJ1ZjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBTb21laG93IGFuIG9wZW4gc3VjY2VkZGVkIGJ1dCB0aGUgZGV2aWNlIHdhcyByZW1vdmVkIG9yIHRoZQorCSAqIGNvbm5lY3Rpb24gdGVybWluYXRlZCBiZXR3ZWVuIHRoZSB2dHktc2VydmVyIGFuZCBwYXJ0bmVyIHZ0eSBkdXJpbmcKKwkgKiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUgb3BlcmF0aW9uPyAgVGhpcyBpcyBhIGNydW1teSBwbGFjZSB0byBkbyB0aGlzCisJICogYnV0IHdlIHdhbnQgdG8ga2VlcCBpdCBhbGwgaW4gdGhlIHNwaW5sb2NrLgorCSAqLworCWlmIChodmNzZC0+b3Blbl9jb3VudCA8PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXVuaXRfYWRkcmVzcyA9IGh2Y3NkLT52ZGV2LT51bml0X2FkZHJlc3M7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXRvc2VuZCA9IG1pbihjb3VudCwgKEhWQ1NfQlVGRl9MRU4gLSBodmNzZC0+Y2hhcnNfaW5fYnVmZmVyKSk7CisJCS8qCisJCSAqIE5vIG1vcmUgc3BhY2UsIHRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgbGFzdCBjYWxsIHRvCisJCSAqIGh2Y3Nfd3JpdGUoKSBkaWRuJ3Qgc3VjY2VlZCBhbmQgdGhlIGJ1ZmZlciB3YXMgZmlsbGVkIHVwLgorCQkgKi8KKwkJaWYgKCF0b3NlbmQpCisJCQlicmVhazsKKworCQltZW1jcHkoJmh2Y3NkLT5idWZmZXJbaHZjc2QtPmNoYXJzX2luX2J1ZmZlcl0sCisJCQkJJmNoYXJidWZbdG90YWxfc2VudF0sCisJCQkJdG9zZW5kKTsKKworCQlodmNzZC0+Y2hhcnNfaW5fYnVmZmVyICs9IHRvc2VuZDsKKworCQlyZXN1bHQgPSAwOworCisJCS8qCisJCSAqIElmIHRoaXMgaXMgdHJ1ZSB0aGVuIHdlIGRvbid0IHdhbnQgdG8gdHJ5IHdyaXRpbmcgdG8gdGhlCisJCSAqIGh5cGVydmlzb3IgYmVjYXVzZSB0aGF0IGlzIHRoZSBrZXJuZWxfdGhyZWFkcyBqb2Igbm93LiAgV2UnbGwKKwkJICoganVzdCBhZGQgdG8gdGhlIGJ1ZmZlci4KKwkJICovCisJCWlmICghKGh2Y3NkLT50b2RvX21hc2sgJiBIVkNTX1RSWV9XUklURSkpCisJCQkvKiB3b24ndCBzZW5kIHBhcnRpYWwgd3JpdGVzICovCisJCQlyZXN1bHQgPSBodmNfcHV0X2NoYXJzKHVuaXRfYWRkcmVzcywKKwkJCQkJJmh2Y3NkLT5idWZmZXJbMF0sCisJCQkJCWh2Y3NkLT5jaGFyc19pbl9idWZmZXIpOworCisJCS8qCisJCSAqIFNpbmNlIHdlIGtub3cgd2UgaGF2ZSBlbm91Z2ggcm9vbSBpbiBodmNzZC0+YnVmZmVyIGZvcgorCQkgKiB0b3NlbmQgd2UgcmVjb3JkIHRoYXQgaXQgd2FzIHNlbnQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZQorCQkgKiBoeXBlcnZpc29yIGFjdHVhbGx5IHRvb2sgaXQgYmVjYXVzZSB3ZSBoYXZlIGl0IGJ1ZmZlcmVkLgorCQkgKi8KKwkJdG90YWxfc2VudCs9dG9zZW5kOworCQljb3VudC09dG9zZW5kOworCQlpZiAocmVzdWx0ID09IDApIHsKKwkJCWh2Y3NkLT50b2RvX21hc2sgfD0gSFZDU19UUllfV1JJVEU7CisJCQlodmNzX2tpY2soKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaHZjc2QtPmNoYXJzX2luX2J1ZmZlciA9IDA7CisJCS8qCisJCSAqIFRlc3QgYWZ0ZXIgdGhlIGNoYXJzX2luX2J1ZmZlciByZXNldCBvdGhlcndpc2UgdGhpcyBjb3VsZAorCQkgKiBkZWFkbG9jayBvdXIgd3JpdGVzIGlmIGh2Y19wdXRfY2hhcnMgZmFpbHMuCisJCSAqLworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAocmVzdWx0ID09IC0xKQorCQlyZXR1cm4gLUVJTzsKKwllbHNlCisJCXJldHVybiB0b3RhbF9zZW50OworfQorCisvKgorICogVGhpcyBpcyByZWFsbHkgYXNraW5nIGhvdyBtdWNoIGNhbiB3ZSBndWFyZW50ZWUgdGhhdCB3ZSBjYW4gc2VuZCBvciB0aGF0IHdlCisgKiBhYnNvbHV0ZWx5IFdJTEwgQlVGRkVSIGlmIHdlIGNhbid0IHNlbmQgaXQuICBUaGlzIGRyaXZlciBNVVNUIGhvbm9yIHRoZQorICogcmV0dXJuIHZhbHVlLCBoZW5jZSB0aGUgcmVhc29uIGZvciBodmNzX3N0cnVjdCBidWZmZXJpbmcuCisgKi8KK3N0YXRpYyBpbnQgaHZjc193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIWh2Y3NkIHx8IGh2Y3NkLT5vcGVuX2NvdW50IDw9IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIEhWQ1NfQlVGRl9MRU4gLSBodmNzZC0+Y2hhcnNfaW5fYnVmZmVyOworfQorCitzdGF0aWMgaW50IGh2Y3NfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlyZXR1cm4gaHZjc2QtPmNoYXJzX2luX2J1ZmZlcjsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBodmNzX29wcyA9IHsKKwkub3BlbiA9IGh2Y3Nfb3BlbiwKKwkuY2xvc2UgPSBodmNzX2Nsb3NlLAorCS5oYW5ndXAgPSBodmNzX2hhbmd1cCwKKwkud3JpdGUgPSBodmNzX3dyaXRlLAorCS53cml0ZV9yb29tID0gaHZjc193cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBodmNzX2NoYXJzX2luX2J1ZmZlciwKKwkudW50aHJvdHRsZSA9IGh2Y3NfdW50aHJvdHRsZSwKKwkudGhyb3R0bGUgPSBodmNzX3Rocm90dGxlLAorfTsKKworc3RhdGljIGludCBodmNzX2FsbG9jX2luZGV4X2xpc3QoaW50IG4pCit7CisJaW50IGk7CisJaHZjc19pbmRleF9saXN0ID0ga21hbGxvYyhuICogc2l6ZW9mKGh2Y3NfaW5kZXhfY291bnQpLEdGUF9LRVJORUwpOworCWlmICghaHZjc19pbmRleF9saXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKwlodmNzX2luZGV4X2NvdW50ID0gbjsKKwlmb3IoaSA9IDA7IGkgPCBodmNzX2luZGV4X2NvdW50OyBpKyspCisJCWh2Y3NfaW5kZXhfbGlzdFtpXSA9IC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBodmNzX2ZyZWVfaW5kZXhfbGlzdCh2b2lkKQoreworCS8qIFBhcmFub2lhIGNoZWNrIHRvIGJlIHRob3JvdWdoLiAqLworCWlmIChodmNzX2luZGV4X2xpc3QpIHsKKwkJa2ZyZWUoaHZjc19pbmRleF9saXN0KTsKKwkJaHZjc19pbmRleF9saXN0ID0gTlVMTDsKKwkJaHZjc19pbmRleF9jb3VudCA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBodmNzX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJjOworCWludCBudW1fdHR5c190b19hbGxvYzsKKworCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemluZyAlc1xuIiwgaHZjc19kcml2ZXJfc3RyaW5nKTsKKworCS8qIEhhcyB0aGUgdXNlciBzcGVjaWZpZWQgYW4gb3ZlcmxvYWQgd2l0aCBhbiBpbnNtb2QgcGFyYW0/ICovCisJaWYgKGh2Y3NfcGFybV9udW1fZGV2cyA8PSAwIHx8CisJCShodmNzX3Bhcm1fbnVtX2RldnMgPiBIVkNTX01BWF9TRVJWRVJfQURBUFRFUlMpKSB7CisJCW51bV90dHlzX3RvX2FsbG9jID0gSFZDU19ERUZBVUxUX1NFUlZFUl9BREFQVEVSUzsKKwl9IGVsc2UKKwkJbnVtX3R0eXNfdG9fYWxsb2MgPSBodmNzX3Bhcm1fbnVtX2RldnM7CisKKwlodmNzX3R0eV9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKG51bV90dHlzX3RvX2FsbG9jKTsKKwlpZiAoIWh2Y3NfdHR5X2RyaXZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoaHZjc19hbGxvY19pbmRleF9saXN0KG51bV90dHlzX3RvX2FsbG9jKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlodmNzX3R0eV9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlodmNzX3R0eV9kcml2ZXItPmRyaXZlcl9uYW1lID0gaHZjc19kcml2ZXJfbmFtZTsKKwlodmNzX3R0eV9kcml2ZXItPm5hbWUgPSBodmNzX2RldmljZV9ub2RlOworCWh2Y3NfdHR5X2RyaXZlci0+ZGV2ZnNfbmFtZSA9IGh2Y3NfZGV2aWNlX25vZGU7CisKKwkvKgorCSAqIFdlJ2xsIGxldCB0aGUgc3lzdGVtIGFzc2lnbiB1cyBhIG1ham9yIG51bWJlciwgaW5kaWNhdGVkIGJ5IGxlYXZpbmcKKwkgKiBpdCBibGFuay4KKwkgKi8KKworCWh2Y3NfdHR5X2RyaXZlci0+bWlub3Jfc3RhcnQgPSBIVkNTX01JTk9SX1NUQVJUOworCWh2Y3NfdHR5X2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TWVNURU07CisKKwkvKgorCSAqIFdlIHJvbGUgb3VyIG93biBzbyB0aGF0IHdlIERPTlQgRUNITy4gIFdlIGNhbid0IGVjaG8gYmVjYXVzZSB0aGUKKwkgKiBkZXZpY2Ugd2UgYXJlIGNvbm5lY3RpbmcgdG8gYWxyZWFkeSBlY2hvZXMgYnkgZGVmYXVsdCBhbmQgdGhpcyB3b3VsZAorCSAqIHRocm93IHVzIGludG8gYSBob3JyaWJsZSByZWN1cnNpdmUgZWNoby1lY2hvLWVjaG8gbG9vcC4KKwkgKi8KKwlodmNzX3R0eV9kcml2ZXItPmluaXRfdGVybWlvcyA9IGh2Y3NfdHR5X3Rlcm1pb3M7CisJaHZjc190dHlfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisKKwl0dHlfc2V0X29wZXJhdGlvbnMoaHZjc190dHlfZHJpdmVyLCAmaHZjc19vcHMpOworCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGNhbGwgd2lsbCByZXN1bHQgaW4gc3lzZnMgZW50cmllcyB0aGF0IGRlbm90ZSB0aGUKKwkgKiBkeW5hbWljYWxseSBhc3NpZ25lZCBtYWpvciBhbmQgbWlub3IgbnVtYmVycyBmb3Igb3VyIGRldmljZXMuCisJICovCisJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoaHZjc190dHlfZHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkhWQ1M6IHJlZ2lzdHJhdGlvbiAiCisJCQkiIGFzIGEgdHR5IGRyaXZlciBmYWlsZWQuXG4iKTsKKwkJaHZjc19mcmVlX2luZGV4X2xpc3QoKTsKKwkJcHV0X3R0eV9kcml2ZXIoaHZjc190dHlfZHJpdmVyKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaHZjc19waV9idWZmID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghaHZjc19waV9idWZmKSB7CisJCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihodmNzX3R0eV9kcml2ZXIpOworCQlodmNzX2ZyZWVfaW5kZXhfbGlzdCgpOworCQlwdXRfdHR5X2RyaXZlcihodmNzX3R0eV9kcml2ZXIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlodmNzX3Rhc2sgPSBrdGhyZWFkX3J1bihraHZjc2QsIE5VTEwsICJraHZjc2QiKTsKKwlpZiAoSVNfRVJSKGh2Y3NfdGFzaykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJIVkNTOiBraHZjc2QgY3JlYXRpb24gZmFpbGVkLiAgRHJpdmVyIG5vdCBsb2FkZWQuXG4iKTsKKwkJa2ZyZWUoaHZjc19waV9idWZmKTsKKwkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGh2Y3NfdHR5X2RyaXZlcik7CisJCWh2Y3NfZnJlZV9pbmRleF9saXN0KCk7CisJCXB1dF90dHlfZHJpdmVyKGh2Y3NfdHR5X2RyaXZlcik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJjID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmaHZjc192aW9fZHJpdmVyKTsKKworCS8qCisJICogVGhpcyBuZWVkcyB0byBiZSBkb25lIEFGVEVSIHRoZSB2aW9fcmVnaXN0ZXJfZHJpdmVyKCkgY2FsbCBvciBlbHNlCisJICogdGhlIGtvYmplY3RzIHdvbid0IGJlIGluaXRpYWxpemVkIHByb3Blcmx5LgorCSAqLworCWh2Y3NfY3JlYXRlX2RyaXZlcl9hdHRycygpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogZHJpdmVyIG1vZHVsZSBpbnNlcnRlZC5cbiIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaHZjc19tb2R1bGVfZXhpdCh2b2lkKQoreworCS8qCisJICogVGhpcyBkcml2ZXIgcmVjZWl2ZXMgaHZjc19yZW1vdmUgY2FsbGJhY2tzIGZvciBlYWNoIGRldmljZSB1cG9uCisJICogbW9kdWxlIHJlbW92YWwuCisJICovCisKKwkvKgorCSAqIFRoaXMgc3luY2hyb25vdXMgb3BlcmF0aW9uICB3aWxsIHdha2UgdGhlIGtodmNzZCBrdGhyZWFkIGlmIGl0IGlzCisJICogYXNsZWVwIGFuZCB3aWxsIHJldHVybiB3aGVuIGtodmNzZCBoYXMgdGVybWluYXRlZC4KKwkgKi8KKwlrdGhyZWFkX3N0b3AoaHZjc190YXNrKTsKKworCXNwaW5fbG9jaygmaHZjc19waV9sb2NrKTsKKwlrZnJlZShodmNzX3BpX2J1ZmYpOworCWh2Y3NfcGlfYnVmZiA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmh2Y3NfcGlfbG9jayk7CisKKwlodmNzX3JlbW92ZV9kcml2ZXJfYXR0cnMoKTsKKworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmaHZjc192aW9fZHJpdmVyKTsKKworCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihodmNzX3R0eV9kcml2ZXIpOworCisJaHZjc19mcmVlX2luZGV4X2xpc3QoKTsKKworCXB1dF90dHlfZHJpdmVyKGh2Y3NfdHR5X2RyaXZlcik7CisKKwlwcmludGsoS0VSTl9JTkZPICJIVkNTOiBkcml2ZXIgbW9kdWxlIHJlbW92ZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQoaHZjc19tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChodmNzX21vZHVsZV9leGl0KTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmZyb21fdmlvX2RldihzdHJ1Y3QgdmlvX2RldiAqdmlvZCkKK3sKKwlyZXR1cm4gdmlvZC0+ZGV2LmRyaXZlcl9kYXRhOworfQorLyogVGhlIHN5c2ZzIGludGVyZmFjZSBmb3IgdGhlIGRyaXZlciBhbmQgZGV2aWNlcyAqLworCitzdGF0aWMgc3NpemVfdCBodmNzX3BhcnRuZXJfdnR5c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBmcm9tX3Zpb19kZXYodmlvZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gc3ByaW50ZihidWYsICIlWFxuIiwgaHZjc2QtPnBfdW5pdF9hZGRyZXNzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocGFydG5lcl92dHlzLCBTX0lSVUdPLCBodmNzX3BhcnRuZXJfdnR5c19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgaHZjc19wYXJ0bmVyX2NsY3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmlvZCA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gZnJvbV92aW9fZGV2KHZpb2QpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHZhbCA9IHNwcmludGYoYnVmLCAiJXNcbiIsICZodmNzZC0+cF9sb2NhdGlvbl9jb2RlWzBdKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocGFydG5lcl9jbGNzLCBTX0lSVUdPLCBodmNzX3BhcnRuZXJfY2xjc19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgaHZjc19jdXJyZW50X3Z0eV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKiBidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwkvKgorCSAqIERvbid0IG5lZWQgdGhpcyBmZWF0dXJlIGF0IHRoZSBwcmVzZW50IHRpbWUgYmVjYXVzZSBmaXJtd2FyZSBkb2Vzbid0CisJICogeWV0IHN1cHBvcnQgbXVsdGlwbGUgcGFydG5lcnMuCisJICovCisJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogRGVuaWVkIGN1cnJlbnRfdnR5IGNoYW5nZTogLUVQRVJNLlxuIik7CisJcmV0dXJuIC1FUEVSTTsKK30KKworc3RhdGljIHNzaXplX3QgaHZjc19jdXJyZW50X3Z0eV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBmcm9tX3Zpb19kZXYodmlvZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gc3ByaW50ZihidWYsICIlc1xuIiwgJmh2Y3NkLT5wX2xvY2F0aW9uX2NvZGVbMF0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGN1cnJlbnRfdnR5LAorCVNfSVJVR08gfCBTX0lXVVNSLCBodmNzX2N1cnJlbnRfdnR5X3Nob3csIGh2Y3NfY3VycmVudF92dHlfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBodmNzX3Z0ZXJtX3N0YXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IHZpb19kZXYgKnZpb2QgPSB0b192aW9fZGV2KGRldik7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IGZyb21fdmlvX2Rldih2aW9kKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogd3JpdGluZyBhICcwJyB0byB0aGlzIHN5c2ZzIGVudHJ5IHdpbGwgcmVzdWx0IGluIHRoZSBkaXNjb25uZWN0LiAqLworCWlmIChzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMCkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCWlmIChodmNzZC0+b3Blbl9jb3VudCA+IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogdnRlcm0gc3RhdGUgdW5jaGFuZ2VkLiAgIgorCQkJCSJUaGUgaHZjcyBkZXZpY2Ugbm9kZSBpcyBzdGlsbCBpbiB1c2UuXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAoaHZjc2QtPmNvbm5lY3RlZCA9PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IHZ0ZXJtIHN0YXRlIHVuY2hhbmdlZC4gVGhlIgorCQkJCSIgdnR5LXNlcnZlciBpcyBub3QgY29ubmVjdGVkIHRvIGEgdnR5LlxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaHZjc19wYXJ0bmVyX2ZyZWUoaHZjc2QpOworCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IENsb3NlZCB2dHktc2VydmVyQCVYIGFuZCIKKwkJCSIgcGFydG5lciB2dHlAJVg6JWQgY29ubmVjdGlvbi5cbiIsCisJCQlodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzLAorCQkJaHZjc2QtPnBfdW5pdF9hZGRyZXNzLAorCQkJKHVpbnQzMl90KWh2Y3NkLT5wX3BhcnRpdGlvbl9JRCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgaHZjc192dGVybV9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBmcm9tX3Zpb19kZXYodmlvZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gc3ByaW50ZihidWYsICIlZFxuIiwgaHZjc2QtPmNvbm5lY3RlZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorc3RhdGljIERFVklDRV9BVFRSKHZ0ZXJtX3N0YXRlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJaHZjc192dGVybV9zdGF0ZV9zaG93LCBodmNzX3Z0ZXJtX3N0YXRlX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgaHZjc19pbmRleF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBmcm9tX3Zpb19kZXYodmlvZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gc3ByaW50ZihidWYsICIlZFxuIiwgaHZjc2QtPmluZGV4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihpbmRleCwgU19JUlVHTywgaHZjc19pbmRleF9zaG93LCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmh2Y3NfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfcGFydG5lcl92dHlzLmF0dHIsCisJJmRldl9hdHRyX3BhcnRuZXJfY2xjcy5hdHRyLAorCSZkZXZfYXR0cl9jdXJyZW50X3Z0eS5hdHRyLAorCSZkZXZfYXR0cl92dGVybV9zdGF0ZS5hdHRyLAorCSZkZXZfYXR0cl9pbmRleC5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBodmNzX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gaHZjc19hdHRycywKK307CisKK3N0YXRpYyB2b2lkIGh2Y3NfY3JlYXRlX2RldmljZV9hdHRycyhzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKQoreworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2ID0gaHZjc2QtPnZkZXY7CisJc3lzZnNfY3JlYXRlX2dyb3VwKCZ2ZGV2LT5kZXYua29iaiwgJmh2Y3NfYXR0cl9ncm91cCk7Cit9CisKK3N0YXRpYyB2b2lkIGh2Y3NfcmVtb3ZlX2RldmljZV9hdHRycyhzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnZkZXYtPmRldi5rb2JqLCAmaHZjc19hdHRyX2dyb3VwKTsKK30KKworc3RhdGljIHNzaXplX3QgaHZjc19yZXNjYW5fc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCit7CisJLyogQSAxIG1lYW5zIGl0IGlzIHVwZGF0aW5nLCBhIDAgbWVhbnMgaXQgaXMgZG9uZSB1cGRhdGluZyAqLworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBodmNzX3Jlc2Nhbl9zdGF0dXMpOworfQorCitzdGF0aWMgc3NpemVfdCBodmNzX3Jlc2Nhbl9zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjb25zdCBjaGFyICogYnVmLAorCQlzaXplX3QgY291bnQpCit7CisJaWYgKChzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMCkgIT0gMSkKKwkJJiYgKGh2Y3NfcmVzY2FuX3N0YXR1cyAhPSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlodmNzX3Jlc2Nhbl9zdGF0dXMgPSAxOworCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IHJlc2Nhbm5pbmcgcGFydG5lciBpbmZvIGZvciBhbGwiCisJCSIgdnR5LXNlcnZlcnMuXG4iKTsKKwlodmNzX3Jlc2Nhbl9kZXZpY2VzX2xpc3QoKTsKKwlodmNzX3Jlc2Nhbl9zdGF0dXMgPSAwOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBEUklWRVJfQVRUUihyZXNjYW4sCisJU19JUlVHTyB8IFNfSVdVU1IsIGh2Y3NfcmVzY2FuX3Nob3csIGh2Y3NfcmVzY2FuX3N0b3JlKTsKKworc3RhdGljIHZvaWQgaHZjc19jcmVhdGVfZHJpdmVyX2F0dHJzKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcmZzID0gJihodmNzX3Zpb19kcml2ZXIuZHJpdmVyKTsKKwlkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9yZXNjYW4pOworfQorCitzdGF0aWMgdm9pZCBodmNzX3JlbW92ZV9kcml2ZXJfYXR0cnModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyZnMgPSAmKGh2Y3NfdmlvX2RyaXZlci5kcml2ZXIpOworCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3Jlc2Nhbik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZzaS5jIGIvZHJpdmVycy9jaGFyL2h2c2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWYxMTkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2h2c2kuYwpAQCAtMCwwICsxLDEzMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSG9sbGlzIEJsYW5jaGFyZCA8aG9sbGlzYkB1cy5pYm0uY29tPiwgSUJNCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogSG9zdCBWaXJ0dWFsIFNlcmlhbCBJbnRlcmZhY2UgKEhWU0kpIGlzIGEgcHJvdG9jb2wgYmV0d2VlbiB0aGUgaG9zdGVkIE9TCisgKiBhbmQgdGhlIHNlcnZpY2UgcHJvY2Vzc29yIG9uIElCTSBwU2VyaWVzIHNlcnZlcnMuIE9uIHRoZXNlIHNlcnZlcnMsIHRoZXJlCisgKiBhcmUgbm8gc2VyaWFsIHBvcnRzIHVuZGVyIHRoZSBPUydzIGNvbnRyb2wsIGFuZCBzb21ldGltZXMgdGhlcmUgaXMgbm8gb3RoZXIKKyAqIGNvbnNvbGUgYXZhaWxhYmxlIGVpdGhlci4gSG93ZXZlciwgdGhlIHNlcnZpY2UgcHJvY2Vzc29yIGhhcyB0d28gc3RhbmRhcmQKKyAqIHNlcmlhbCBwb3J0cywgc28gdGhpcyBvdmVyLWNvbXBsaWNhdGVkIHByb3RvY29sIGFsbG93cyB0aGUgT1MgdG8gY29udHJvbAorICogdGhvc2UgcG9ydHMgYnkgcHJveHkuCisgKgorICogQmVzaWRlcyBkYXRhLCB0aGUgcHJvY290b2wgc3VwcG9ydHMgdGhlIHJlYWRpbmcvd3JpdGluZyBvZiB0aGUgc2VyaWFsCisgKiBwb3J0J3MgRFRSIGxpbmUsIGFuZCB0aGUgcmVhZGluZyBvZiB0aGUgQ0QgbGluZS4gVGhpcyBpcyB0byBhbGxvdyB0aGUgT1MgdG8KKyAqIGNvbnRyb2wgYSBtb2RlbSBhdHRhY2hlZCB0byB0aGUgc2VydmljZSBwcm9jZXNzb3IncyBzZXJpYWwgcG9ydC4gTm90ZSB0aGF0CisgKiB0aGUgT1MgY2Fubm90IGNoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIHBvcnQgdGhyb3VnaCB0aGlzIHByb3RvY29sLgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KKyNpbmNsdWRlIDxhc20vaHZjb25zb2xlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KKworI2RlZmluZSBIVlNJX01BSk9SCTIyOQorI2RlZmluZSBIVlNJX01JTk9SCTEyOAorI2RlZmluZSBNQVhfTlJfSFZTSV9DT05TT0xFUyA0CisKKyNkZWZpbmUgSFZTSV9USU1FT1VUICg1KkhaKQorI2RlZmluZSBIVlNJX1ZFUlNJT04gMQorI2RlZmluZSBIVlNJX01BWF9QQUNLRVQgMjU2CisjZGVmaW5lIEhWU0lfTUFYX1JFQUQgMTYKKyNkZWZpbmUgSFZTSV9NQVhfT1VUR09JTkdfREFUQSAxMgorI2RlZmluZSBOX09VVEJVRiAxMgorCisvKgorICogd2UgcGFzcyBkYXRhIHZpYSB0d28gOC1ieXRlIHJlZ2lzdGVycywgc28gd2Ugd291bGQgbGlrZSBvdXIgY2hhciBhcnJheXMKKyAqIHByb3Blcmx5IGFsaWduZWQgZm9yIHRob3NlIGxvYWRzLgorICovCisjZGVmaW5lIF9fQUxJR05FRF9fCV9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKHNpemVvZihsb25nKSkpKQorCitzdHJ1Y3QgaHZzaV9zdHJ1Y3QgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3cml0ZXI7CisJc3RydWN0IHdvcmtfc3RydWN0IGhhbmRzaGFrZXI7CisJd2FpdF9xdWV1ZV9oZWFkX3QgZW1wdHlxOyAvKiB3b2tlbiB3aGVuIG91dGJ1ZiBpcyBlbXB0aWVkICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgc3RhdGVxOyAvKiB3b2tlbiB3aGVuIEhWU0kgc3RhdGUgY2hhbmdlcyAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgaW5kZXg7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdWludDhfdCB0aHJvdHRsZV9idWZbMTI4XTsKKwl1aW50OF90IG91dGJ1ZltOX09VVEJVRl07IC8qIHRvIGltcGxlbWVudCB3cml0ZV9yb29tIGFuZCBjaGFyc19pbl9idWZmZXIgKi8KKwkvKiBpbmJ1ZiBpcyBmb3IgcGFja2V0IHJlYXNzZW1ibHkuIGxlYXZlIGEgbGl0dGxlIHJvb20gZm9yIGxlZnRvdmVycy4gKi8KKwl1aW50OF90IGluYnVmW0hWU0lfTUFYX1BBQ0tFVCArIEhWU0lfTUFYX1JFQURdOworCXVpbnQ4X3QgKmluYnVmX2VuZDsKKwlpbnQgbl90aHJvdHRsZTsKKwlpbnQgbl9vdXRidWY7CisJdWludDMyX3QgdnRlcm1ubzsKKwl1aW50MzJfdCB2aXJxOworCWF0b21pY190IHNlcW5vOyAvKiBIVlNJIHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1aW50MTZfdCBtY3RybDsKKwl1aW50OF90IHN0YXRlOyAgLyogSFZTSSBwcm90b2NvbCBzdGF0ZSAqLworCXVpbnQ4X3QgZmxhZ3M7CisjaWZkZWYgQ09ORklHX01BR0lDX1NZU1JRCisJdWludDhfdCBzeXNycTsKKyNlbmRpZiAvKiBDT05GSUdfTUFHSUNfU1lTUlEgKi8KK307CitzdGF0aWMgc3RydWN0IGh2c2lfc3RydWN0IGh2c2lfcG9ydHNbTUFYX05SX0hWU0lfQ09OU09MRVNdOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmh2c2lfZHJpdmVyOworc3RhdGljIGludCBodnNpX2NvdW50Oworc3RhdGljIGludCAoKmh2c2lfd2FpdCkoc3RydWN0IGh2c2lfc3RydWN0ICpocCwgaW50IHN0YXRlKTsKKworZW51bSBIVlNJX1BST1RPQ09MX1NUQVRFIHsKKwlIVlNJX0NMT1NFRCwKKwlIVlNJX1dBSVRfRk9SX1ZFUl9SRVNQT05TRSwKKwlIVlNJX1dBSVRfRk9SX1ZFUl9RVUVSWSwKKwlIVlNJX09QRU4sCisJSFZTSV9XQUlUX0ZPUl9NQ1RSTF9SRVNQT05TRSwKKwlIVlNJX0ZTUF9ESUVELAorfTsKKyNkZWZpbmUgSFZTSV9DT05TT0xFIDB4MQorCisjZGVmaW5lIFZTX0RBVEFfUEFDS0VUX0hFQURFUiAgICAgICAgICAgMHhmZgorI2RlZmluZSBWU19DT05UUk9MX1BBQ0tFVF9IRUFERVIgICAgICAgIDB4ZmUKKyNkZWZpbmUgVlNfUVVFUllfUEFDS0VUX0hFQURFUiAgICAgICAgICAweGZkCisjZGVmaW5lIFZTX1FVRVJZX1JFU1BPTlNFX1BBQ0tFVF9IRUFERVIgMHhmYworCisvKiBjb250cm9sIHZlcmJzICovCisjZGVmaW5lIFZTVl9TRVRfTU9ERU1fQ1RMICAgIDEgLyogdG8gc2VydmljZSBwcm9jZXNzb3Igb25seSAqLworI2RlZmluZSBWU1ZfTU9ERU1fQ1RMX1VQREFURSAyIC8qIGZyb20gc2VydmljZSBwcm9jZXNzb3Igb25seSAqLworI2RlZmluZSBWU1ZfQ0xPU0VfUFJPVE9DT0wgICAzCisKKy8qIHF1ZXJ5IHZlcmJzICovCisjZGVmaW5lIFZTVl9TRU5EX1ZFUlNJT05fTlVNQkVSIDEKKyNkZWZpbmUgVlNWX1NFTkRfTU9ERU1fQ1RMX1NUQVRVUyAyCisKKy8qIHllcywgdGhlc2UgbWFza3MgYXJlIG5vdCBjb25zZWN1dGl2ZS4gKi8KKyNkZWZpbmUgSFZTSV9UU0RUUiAweDAxCisjZGVmaW5lIEhWU0lfVFNDRCAgMHgyMAorCitzdHJ1Y3QgaHZzaV9oZWFkZXIgeworCXVpbnQ4X3QgIHR5cGU7CisJdWludDhfdCAgbGVuOworCXVpbnQxNl90IHNlcW5vOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2c2lfZGF0YSB7CisJdWludDhfdCAgdHlwZTsKKwl1aW50OF90ICBsZW47CisJdWludDE2X3Qgc2Vxbm87CisJdWludDhfdCAgZGF0YVtIVlNJX01BWF9PVVRHT0lOR19EQVRBXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBodnNpX2NvbnRyb2wgeworCXVpbnQ4X3QgIHR5cGU7CisJdWludDhfdCAgbGVuOworCXVpbnQxNl90IHNlcW5vOworCXVpbnQxNl90IHZlcmI7CisJLyogb3B0aW9uYWwgZGVwZW5kaW5nIG9uIHZlcmI6ICovCisJdWludDMyX3Qgd29yZDsKKwl1aW50MzJfdCBtYXNrOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2c2lfcXVlcnkgeworCXVpbnQ4X3QgIHR5cGU7CisJdWludDhfdCAgbGVuOworCXVpbnQxNl90IHNlcW5vOworCXVpbnQxNl90IHZlcmI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaHZzaV9xdWVyeV9yZXNwb25zZSB7CisJdWludDhfdCAgdHlwZTsKKwl1aW50OF90ICBsZW47CisJdWludDE2X3Qgc2Vxbm87CisJdWludDE2X3QgdmVyYjsKKwl1aW50MTZfdCBxdWVyeV9zZXFubzsKKwl1bmlvbiB7CisJCXVpbnQ4X3QgIHZlcnNpb247CisJCXVpbnQzMl90IG1jdHJsX3dvcmQ7CisJfSB1OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2NvbnNvbGUoc3RydWN0IGh2c2lfc3RydWN0ICpocCkKK3sKKwlyZXR1cm4gaHAtPmZsYWdzICYgSFZTSV9DT05TT0xFOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19vcGVuKHN0cnVjdCBodnNpX3N0cnVjdCAqaHApCit7CisJLyogaWYgd2UncmUgd2FpdGluZyBmb3IgYW4gbWN0cmwgdGhlbiB3ZSdyZSBhbHJlYWR5IG9wZW4gKi8KKwlyZXR1cm4gKGhwLT5zdGF0ZSA9PSBIVlNJX09QRU4pCisJCQl8fCAoaHAtPnN0YXRlID09IEhWU0lfV0FJVF9GT1JfTUNUUkxfUkVTUE9OU0UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfc3RhdGUoc3RydWN0IGh2c2lfc3RydWN0ICpocCkKK3sKKyNpZmRlZiBERUJVRworCXN0YXRpYyBjb25zdCBjaGFyICpzdGF0ZV9uYW1lc1tdID0geworCQkiSFZTSV9DTE9TRUQiLAorCQkiSFZTSV9XQUlUX0ZPUl9WRVJfUkVTUE9OU0UiLAorCQkiSFZTSV9XQUlUX0ZPUl9WRVJfUVVFUlkiLAorCQkiSFZTSV9PUEVOIiwKKwkJIkhWU0lfV0FJVF9GT1JfTUNUUkxfUkVTUE9OU0UiLAorCQkiSFZTSV9GU1BfRElFRCIsCisJfTsKKwljb25zdCBjaGFyICpuYW1lID0gc3RhdGVfbmFtZXNbaHAtPnN0YXRlXTsKKworCWlmIChocC0+c3RhdGUgPiAoc2l6ZW9mKHN0YXRlX25hbWVzKS9zaXplb2YoY2hhciopKSkKKwkJbmFtZSA9ICJVTktOT1dOIjsKKworCXByX2RlYnVnKCJodnNpJWk6IHN0YXRlID0gJXNcbiIsIGhwLT5pbmRleCwgbmFtZSk7CisjZW5kaWYgLyogREVCVUcgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fc2V0X3N0YXRlKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIGludCBzdGF0ZSkKK3sKKwlocC0+c3RhdGUgPSBzdGF0ZTsKKwlwcmludF9zdGF0ZShocCk7CisJd2FrZV91cF9hbGwoJmhwLT5zdGF0ZXEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3N0YXRlKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisJX19zZXRfc3RhdGUoaHAsIHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBsZW5fcGFja2V0KGNvbnN0IHVpbnQ4X3QgKnBhY2tldCkKK3sKKwlyZXR1cm4gKGludCkoKHN0cnVjdCBodnNpX2hlYWRlciAqKXBhY2tldCktPmxlbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfaGVhZGVyKGNvbnN0IHVpbnQ4X3QgKnBhY2tldCkKK3sKKwlzdHJ1Y3QgaHZzaV9oZWFkZXIgKmhlYWRlciA9IChzdHJ1Y3QgaHZzaV9oZWFkZXIgKilwYWNrZXQ7CisJcmV0dXJuIGhlYWRlci0+dHlwZSA+PSBWU19RVUVSWV9SRVNQT05TRV9QQUNLRVRfSEVBREVSOworfQorCitzdGF0aWMgaW5saW5lIGludCBnb3RfcGFja2V0KGNvbnN0IHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHVpbnQ4X3QgKnBhY2tldCkKK3sKKwlpZiAoaHAtPmluYnVmX2VuZCA8IHBhY2tldCArIHNpemVvZihzdHJ1Y3QgaHZzaV9oZWFkZXIpKQorCQlyZXR1cm4gMDsgLyogZG9uJ3QgZXZlbiBoYXZlIHRoZSBwYWNrZXQgaGVhZGVyICovCisKKwlpZiAoaHAtPmluYnVmX2VuZCA8IChwYWNrZXQgKyBsZW5fcGFja2V0KHBhY2tldCkpKQorCQlyZXR1cm4gMDsgLyogZG9uJ3QgaGF2ZSB0aGUgcmVzdCBvZiB0aGUgcGFja2V0ICovCisKKwlyZXR1cm4gMTsKK30KKworLyogc2hpZnQgcmVtYWluaW5nIGJ5dGVzIGluIHBhY2tldGJ1ZiBkb3duICovCitzdGF0aWMgdm9pZCBjb21wYWN0X2luYnVmKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHVpbnQ4X3QgKnJlYWRfdG8pCit7CisJaW50IHJlbWFpbmluZyA9IChpbnQpKGhwLT5pbmJ1Zl9lbmQgLSByZWFkX3RvKTsKKworCXByX2RlYnVnKCIlczogJWkgY2hhcnMgcmVtYWluXG4iLCBfX0ZVTkNUSU9OX18sIHJlbWFpbmluZyk7CisKKwlpZiAocmVhZF90byAhPSBocC0+aW5idWYpCisJCW1lbW1vdmUoaHAtPmluYnVmLCByZWFkX3RvLCByZW1haW5pbmcpOworCisJaHAtPmluYnVmX2VuZCA9IGhwLT5pbmJ1ZiArIHJlbWFpbmluZzsKK30KKworI2lmZGVmIERFQlVHCisjZGVmaW5lIGRiZ19kdW1wX3BhY2tldChwYWNrZXQpIGR1bXBfcGFja2V0KHBhY2tldCkKKyNkZWZpbmUgZGJnX2R1bXBfaGV4KGRhdGEsIGxlbikgZHVtcF9oZXgoZGF0YSwgbGVuKQorI2Vsc2UKKyNkZWZpbmUgZGJnX2R1bXBfcGFja2V0KHBhY2tldCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkYmdfZHVtcF9oZXgoZGF0YSwgbGVuKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgZHVtcF9oZXgoY29uc3QgdWludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCXByaW50aygiICAgICIpOworCWZvciAoaT0wOyBpIDwgbGVuOyBpKyspCisJCXByaW50aygiJS4yeCIsIGRhdGFbaV0pOworCisJcHJpbnRrKCJcbiAgICAiKTsKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChpc3ByaW50KGRhdGFbaV0pKQorCQkJcHJpbnRrKCIlYyIsIGRhdGFbaV0pOworCQllbHNlCisJCQlwcmludGsoIi4iKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3BhY2tldCh1aW50OF90ICpwYWNrZXQpCit7CisJc3RydWN0IGh2c2lfaGVhZGVyICpoZWFkZXIgPSAoc3RydWN0IGh2c2lfaGVhZGVyICopcGFja2V0OworCisJcHJpbnRrKCJ0eXBlIDB4JXgsIGxlbiAlaSwgc2Vxbm8gJWk6XG4iLCBoZWFkZXItPnR5cGUsIGhlYWRlci0+bGVuLAorCQkJaGVhZGVyLT5zZXFubyk7CisKKwlkdW1wX2hleChwYWNrZXQsIGhlYWRlci0+bGVuKTsKK30KKworLyogY2FuJ3QgdXNlIGh2Y19nZXRfY2hhcnMgYmVjYXVzZSB0aGF0IHN0cmlwcyBDUnMgKi8KK3N0YXRpYyBpbnQgaHZzaV9yZWFkKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZ290OworCisJaWYgKHBscGFyX2hjYWxsKEhfR0VUX1RFUk1fQ0hBUiwgaHAtPnZ0ZXJtbm8sIDAsIDAsIDAsICZnb3QsCisJCQkodW5zaWduZWQgbG9uZyAqKWJ1ZiwgKHVuc2lnbmVkIGxvbmcgKilidWYrMSkgPT0gSF9TdWNjZXNzKQorCQlyZXR1cm4gZ290OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBodnNpX3JlY3ZfY29udHJvbChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCB1aW50OF90ICpwYWNrZXQsCisJc3RydWN0IHR0eV9zdHJ1Y3QgKip0b19oYW5ndXAsIHN0cnVjdCBodnNpX3N0cnVjdCAqKnRvX2hhbmRzaGFrZSkKK3sKKwlzdHJ1Y3QgaHZzaV9jb250cm9sICpoZWFkZXIgPSAoc3RydWN0IGh2c2lfY29udHJvbCAqKXBhY2tldDsKKworCXN3aXRjaCAoaGVhZGVyLT52ZXJiKSB7CisJCWNhc2UgVlNWX01PREVNX0NUTF9VUERBVEU6CisJCQlpZiAoKGhlYWRlci0+d29yZCAmIEhWU0lfVFNDRCkgPT0gMCkgeworCQkJCS8qIENEIHdlbnQgYXdheTsgbm8gbW9yZSBjb25uZWN0aW9uICovCisJCQkJcHJfZGVidWcoImh2c2klaTogQ0QgZHJvcHBlZFxuIiwgaHAtPmluZGV4KTsKKwkJCQlocC0+bWN0cmwgJj0gVElPQ01fQ0Q7CisJCQkJaWYgKCEoaHAtPnR0eS0+ZmxhZ3MgJiBDTE9DQUwpKQorCQkJCQkqdG9faGFuZ3VwID0gaHAtPnR0eTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFZTVl9DTE9TRV9QUk9UT0NPTDoKKwkJCXByX2RlYnVnKCJodnNpJWk6IHNlcnZpY2UgcHJvY2Vzc29yIGNhbWUgYmFja1xuIiwgaHAtPmluZGV4KTsKKwkJCWlmIChocC0+c3RhdGUgIT0gSFZTSV9DTE9TRUQpIHsKKwkJCQkqdG9faGFuZHNoYWtlID0gaHA7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImh2c2klaTogdW5rbm93biBIVlNJIGNvbnRyb2wgcGFja2V0OiAiLAorCQkJCWhwLT5pbmRleCk7CisJCQlkdW1wX3BhY2tldChwYWNrZXQpOworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBodnNpX3JlY3ZfcmVzcG9uc2Uoc3RydWN0IGh2c2lfc3RydWN0ICpocCwgdWludDhfdCAqcGFja2V0KQoreworCXN0cnVjdCBodnNpX3F1ZXJ5X3Jlc3BvbnNlICpyZXNwID0gKHN0cnVjdCBodnNpX3F1ZXJ5X3Jlc3BvbnNlICopcGFja2V0OworCisJc3dpdGNoIChocC0+c3RhdGUpIHsKKwkJY2FzZSBIVlNJX1dBSVRfRk9SX1ZFUl9SRVNQT05TRToKKwkJCV9fc2V0X3N0YXRlKGhwLCBIVlNJX1dBSVRfRk9SX1ZFUl9RVUVSWSk7CisJCQlicmVhazsKKwkJY2FzZSBIVlNJX1dBSVRfRk9SX01DVFJMX1JFU1BPTlNFOgorCQkJaHAtPm1jdHJsID0gMDsKKwkJCWlmIChyZXNwLT51Lm1jdHJsX3dvcmQgJiBIVlNJX1RTRFRSKQorCQkJCWhwLT5tY3RybCB8PSBUSU9DTV9EVFI7CisJCQlpZiAocmVzcC0+dS5tY3RybF93b3JkICYgSFZTSV9UU0NEKQorCQkJCWhwLT5tY3RybCB8PSBUSU9DTV9DRDsKKwkJCV9fc2V0X3N0YXRlKGhwLCBIVlNJX09QRU4pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImh2c2klaTogdW5leHBlY3RlZCBxdWVyeSByZXNwb25zZTogIiwgaHAtPmluZGV4KTsKKwkJCWR1bXBfcGFja2V0KHBhY2tldCk7CisJCQlicmVhazsKKwl9Cit9CisKKy8qIHJlc3BvbmQgdG8gc2VydmljZSBwcm9jZXNzb3IncyB2ZXJzaW9uIHF1ZXJ5ICovCitzdGF0aWMgaW50IGh2c2lfdmVyc2lvbl9yZXNwb25kKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHVpbnQxNl90IHF1ZXJ5X3NlcW5vKQoreworCXN0cnVjdCBodnNpX3F1ZXJ5X3Jlc3BvbnNlIHBhY2tldCBfX0FMSUdORURfXzsKKwlpbnQgd3JvdGU7CisKKwlwYWNrZXQudHlwZSA9IFZTX1FVRVJZX1JFU1BPTlNFX1BBQ0tFVF9IRUFERVI7CisJcGFja2V0LmxlbiA9IHNpemVvZihzdHJ1Y3QgaHZzaV9xdWVyeV9yZXNwb25zZSk7CisJcGFja2V0LnNlcW5vID0gYXRvbWljX2luY19yZXR1cm4oJmhwLT5zZXFubyk7CisJcGFja2V0LnZlcmIgPSBWU1ZfU0VORF9WRVJTSU9OX05VTUJFUjsKKwlwYWNrZXQudS52ZXJzaW9uID0gSFZTSV9WRVJTSU9OOworCXBhY2tldC5xdWVyeV9zZXFubyA9IHF1ZXJ5X3NlcW5vKzE7CisKKwlwcl9kZWJ1ZygiJXM6IHNlbmRpbmcgJWkgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXywgcGFja2V0Lmxlbik7CisJZGJnX2R1bXBfaGV4KCh1aW50OF90KikmcGFja2V0LCBwYWNrZXQubGVuKTsKKworCXdyb3RlID0gaHZjX3B1dF9jaGFycyhocC0+dnRlcm1ubywgKGNoYXIgKikmcGFja2V0LCBwYWNrZXQubGVuKTsKKwlpZiAod3JvdGUgIT0gcGFja2V0LmxlbikgeworCQlwcmludGsoS0VSTl9FUlIgImh2c2klaTogY291bGRuJ3Qgc2VuZCBxdWVyeSByZXNwb25zZSFcbiIsCisJCQlocC0+aW5kZXgpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaHZzaV9yZWN2X3F1ZXJ5KHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHVpbnQ4X3QgKnBhY2tldCkKK3sKKwlzdHJ1Y3QgaHZzaV9xdWVyeSAqcXVlcnkgPSAoc3RydWN0IGh2c2lfcXVlcnkgKilwYWNrZXQ7CisKKwlzd2l0Y2ggKGhwLT5zdGF0ZSkgeworCQljYXNlIEhWU0lfV0FJVF9GT1JfVkVSX1FVRVJZOgorCQkJaHZzaV92ZXJzaW9uX3Jlc3BvbmQoaHAsIHF1ZXJ5LT5zZXFubyk7CisJCQlfX3NldF9zdGF0ZShocCwgSFZTSV9PUEVOKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IHVuZXhwZWN0ZWQgcXVlcnk6ICIsIGhwLT5pbmRleCk7CisJCQlkdW1wX3BhY2tldChwYWNrZXQpOworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBodnNpX2luc2VydF9jaGFycyhzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCBjb25zdCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CisJCWNoYXIgYyA9IGJ1ZltpXTsKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKKwkJaWYgKGMgPT0gJ1wwJykgeworCQkJaHAtPnN5c3JxID0gMTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGhwLT5zeXNycSkgeworCQkJaGFuZGxlX3N5c3JxKGMsIE5VTEwsIGhwLT50dHkpOworCQkJaHAtPnN5c3JxID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYgLyogQ09ORklHX01BR0lDX1NZU1JRICovCisJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKGhwLT50dHksIGMsIDApOworCX0KK30KKworLyoKKyAqIFdlIGNvdWxkIGdldCAyNTIgYnl0ZXMgb2YgZGF0YSBhdCBvbmNlIGhlcmUuIEJ1dCB0aGUgdHR5IGxheWVyIG9ubHkKKyAqIHRocm90dGxlcyB1cyBhdCBUVFlfVEhSRVNIT0xEX1RIUk9UVExFICgxMjgpIGJ5dGVzLCBzbyB3ZSBjb3VsZCBvdmVyZmxvdworICogaXQuIEFjY29yZGluZ2x5IHdlIHdvbid0IHNlbmQgbW9yZSB0aGFuIDEyOCBieXRlcyBhdCBhIHRpbWUgdG8gdGhlIGZsaXAKKyAqIGJ1ZmZlciwgd2hpY2ggd2lsbCBnaXZlIHRoZSB0dHkgYnVmZmVyIGEgY2hhbmNlIHRvIHRocm90dGxlIHVzLiBTaG91bGQgdGhlCisgKiB2YWx1ZSBvZiBUVFlfVEhSRVNIT0xEX1RIUk9UVExFIGNoYW5nZSBpbiBuX3R0eS5jLCB0aGlzIGNvZGUgc2hvdWxkIGJlCisgKiByZXZpc2l0ZWQuCisgKi8KKyNkZWZpbmUgVFRZX1RIUkVTSE9MRF9USFJPVFRMRSAxMjgKK3N0YXRpYyBzdHJ1Y3QgdHR5X3N0cnVjdCAqaHZzaV9yZWN2X2RhdGEoc3RydWN0IGh2c2lfc3RydWN0ICpocCwKKwkJY29uc3QgdWludDhfdCAqcGFja2V0KQoreworCWNvbnN0IHN0cnVjdCBodnNpX2hlYWRlciAqaGVhZGVyID0gKGNvbnN0IHN0cnVjdCBodnNpX2hlYWRlciAqKXBhY2tldDsKKwljb25zdCB1aW50OF90ICpkYXRhID0gcGFja2V0ICsgc2l6ZW9mKHN0cnVjdCBodnNpX2hlYWRlcik7CisJaW50IGRhdGFsZW4gPSBoZWFkZXItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaHZzaV9oZWFkZXIpOworCWludCBvdmVyZmxvdyA9IGRhdGFsZW4gLSBUVFlfVEhSRVNIT0xEX1RIUk9UVExFOworCisJcHJfZGVidWcoInF1ZXVlaW5nICVpIGNoYXJzICclLipzJ1xuIiwgZGF0YWxlbiwgZGF0YWxlbiwgZGF0YSk7CisKKwlpZiAoZGF0YWxlbiA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChvdmVyZmxvdyA+IDApIHsKKwkJcHJfZGVidWcoIiVzOiBnb3QgPlRUWV9USFJFU0hPTERfVEhST1RUTEUgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRhdGFsZW4gPSBUVFlfVEhSRVNIT0xEX1RIUk9UVExFOworCX0KKworCWh2c2lfaW5zZXJ0X2NoYXJzKGhwLCBkYXRhLCBkYXRhbGVuKTsKKworCWlmIChvdmVyZmxvdyA+IDApIHsKKwkJLyoKKwkJICogd2Ugc3RpbGwgaGF2ZSBtb3JlIGRhdGEgdG8gZGVsaXZlciwgc28gd2UgbmVlZCB0byBzYXZlIG9mZiB0aGUKKwkJICogb3ZlcmZsb3cgYW5kIHNlbmQgaXQgbGF0ZXIKKwkJICovCisJCXByX2RlYnVnKCIlczogZGVmZXJyaW5nIG92ZXJmbG93XG4iLCBfX0ZVTkNUSU9OX18pOworCQltZW1jcHkoaHAtPnRocm90dGxlX2J1ZiwgZGF0YSArIFRUWV9USFJFU0hPTERfVEhST1RUTEUsIG92ZXJmbG93KTsKKwkJaHAtPm5fdGhyb3R0bGUgPSBvdmVyZmxvdzsKKwl9CisKKwlyZXR1cm4gaHAtPnR0eTsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZS9mYWxzZSBpbmRpY2F0aW5nIGRhdGEgc3VjY2Vzc2Z1bGx5IHJlYWQgZnJvbSBoeXBlcnZpc29yLgorICogVXNlZCBib3RoIHRvIGdldCBwYWNrZXRzIGZvciB0dHkgY29ubmVjdGlvbnMgYW5kIHRvIGFkdmFuY2UgdGhlIHN0YXRlCisgKiBtYWNoaW5lIGR1cmluZyBjb25zb2xlIGhhbmRzaGFraW5nIChpbiB3aGljaCBjYXNlIHR0eSA9IE5VTEwgYW5kIHdlIGlnbm9yZQorICogaW5jb21pbmcgZGF0YSkuCisgKi8KK3N0YXRpYyBpbnQgaHZzaV9sb2FkX2NodW5rKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHN0cnVjdCB0dHlfc3RydWN0ICoqZmxpcCwKKwkJc3RydWN0IHR0eV9zdHJ1Y3QgKipoYW5ndXAsIHN0cnVjdCBodnNpX3N0cnVjdCAqKmhhbmRzaGFrZSkKK3sKKwl1aW50OF90ICpwYWNrZXQgPSBocC0+aW5idWY7CisJaW50IGNodW5rbGVuOworCisJKmZsaXAgPSBOVUxMOworCSpoYW5ndXAgPSBOVUxMOworCSpoYW5kc2hha2UgPSBOVUxMOworCisJY2h1bmtsZW4gPSBodnNpX3JlYWQoaHAsIGhwLT5pbmJ1Zl9lbmQsIEhWU0lfTUFYX1JFQUQpOworCWlmIChjaHVua2xlbiA9PSAwKSB7CisJCXByX2RlYnVnKCIlczogMC1sZW5ndGggcmVhZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJfZGVidWcoIiVzOiBnb3QgJWkgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXywgY2h1bmtsZW4pOworCWRiZ19kdW1wX2hleChocC0+aW5idWZfZW5kLCBjaHVua2xlbik7CisKKwlocC0+aW5idWZfZW5kICs9IGNodW5rbGVuOworCisJLyogaGFuZGxlIGFsbCBjb21wbGV0ZWQgcGFja2V0cyAqLworCXdoaWxlICgocGFja2V0IDwgaHAtPmluYnVmX2VuZCkgJiYgZ290X3BhY2tldChocCwgcGFja2V0KSkgeworCQlzdHJ1Y3QgaHZzaV9oZWFkZXIgKmhlYWRlciA9IChzdHJ1Y3QgaHZzaV9oZWFkZXIgKilwYWNrZXQ7CisKKwkJaWYgKCFpc19oZWFkZXIocGFja2V0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IGdvdCBtYWxmb3JtZWQgcGFja2V0XG4iLCBocC0+aW5kZXgpOworCQkJLyogc2tpcCBieXRlcyB1bnRpbCB3ZSBmaW5kIGEgaGVhZGVyIG9yIHJ1biBvdXQgb2YgZGF0YSAqLworCQkJd2hpbGUgKChwYWNrZXQgPCBocC0+aW5idWZfZW5kKSAmJiAoIWlzX2hlYWRlcihwYWNrZXQpKSkKKwkJCQlwYWNrZXQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiBoYW5kbGluZyAlaS1ieXRlIHBhY2tldFxuIiwgX19GVU5DVElPTl9fLAorCQkJCWxlbl9wYWNrZXQocGFja2V0KSk7CisJCWRiZ19kdW1wX3BhY2tldChwYWNrZXQpOworCisJCXN3aXRjaCAoaGVhZGVyLT50eXBlKSB7CisJCQljYXNlIFZTX0RBVEFfUEFDS0VUX0hFQURFUjoKKwkJCQlpZiAoIWlzX29wZW4oaHApKQorCQkJCQlicmVhazsKKwkJCQlpZiAoaHAtPnR0eSA9PSBOVUxMKQorCQkJCQlicmVhazsgLyogbm8gdHR5IGJ1ZmZlciB0byBwdXQgZGF0YSBpbiAqLworCQkJCSpmbGlwID0gaHZzaV9yZWN2X2RhdGEoaHAsIHBhY2tldCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTX0NPTlRST0xfUEFDS0VUX0hFQURFUjoKKwkJCQlodnNpX3JlY3ZfY29udHJvbChocCwgcGFja2V0LCBoYW5ndXAsIGhhbmRzaGFrZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTX1FVRVJZX1JFU1BPTlNFX1BBQ0tFVF9IRUFERVI6CisJCQkJaHZzaV9yZWN2X3Jlc3BvbnNlKGhwLCBwYWNrZXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBWU19RVUVSWV9QQUNLRVRfSEVBREVSOgorCQkJCWh2c2lfcmVjdl9xdWVyeShocCwgcGFja2V0KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IHVua25vd24gSFZTSSBwYWNrZXQgdHlwZSAweCV4XG4iLAorCQkJCQkJaHAtPmluZGV4LCBoZWFkZXItPnR5cGUpOworCQkJCWR1bXBfcGFja2V0KHBhY2tldCk7CisJCQkJYnJlYWs7CisJCX0KKworCQlwYWNrZXQgKz0gbGVuX3BhY2tldChwYWNrZXQpOworCisJCWlmICgqaGFuZ3VwIHx8ICpoYW5kc2hha2UpIHsKKwkJCXByX2RlYnVnKCIlczogaGFuZ3VwIG9yIGhhbmRzaGFrZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCS8qCisJCQkgKiB3ZSBuZWVkIHRvIHNlbmQgdGhlIGhhbmd1cCBub3cgYmVmb3JlIHJlY2VpdmluZyBhbnkgbW9yZSBkYXRhLgorCQkJICogSWYgd2UgZ2V0ICJkYXRhLCBoYW5ndXAsIGRhdGEiLCB3ZSBjYW4ndCBkZWxpdmVyIHRoZSBzZWNvbmQKKwkJCSAqIGRhdGEgYmVmb3JlIHRoZSBoYW5ndXAuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJY29tcGFjdF9pbmJ1ZihocCwgcGFja2V0KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBodnNpX3NlbmRfb3ZlcmZsb3coc3RydWN0IGh2c2lfc3RydWN0ICpocCkKK3sKKwlwcl9kZWJ1ZygiJXM6IGRlbGl2ZXJpbmcgJWkgYnl0ZXMgb3ZlcmZsb3dcbiIsIF9fRlVOQ1RJT05fXywKKwkJCWhwLT5uX3Rocm90dGxlKTsKKworCWh2c2lfaW5zZXJ0X2NoYXJzKGhwLCBocC0+dGhyb3R0bGVfYnVmLCBocC0+bl90aHJvdHRsZSk7CisJaHAtPm5fdGhyb3R0bGUgPSAwOworfQorCisvKgorICogbXVzdCBnZXQgYWxsIHBlbmRpbmcgZGF0YSBiZWNhdXNlIHdlIG9ubHkgZ2V0IGFuIGlycSBvbiBlbXB0eS0+bm9uLWVtcHR5CisgKiB0cmFuc2l0aW9uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBodnNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICphcmcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAoc3RydWN0IGh2c2lfc3RydWN0ICopYXJnOworCXN0cnVjdCB0dHlfc3RydWN0ICpmbGlwOworCXN0cnVjdCB0dHlfc3RydWN0ICpoYW5ndXA7CisJc3RydWN0IGh2c2lfc3RydWN0ICpoYW5kc2hha2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYWdhaW4gPSAxOworCisJcHJfZGVidWcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJd2hpbGUgKGFnYWluKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCQlhZ2FpbiA9IGh2c2lfbG9hZF9jaHVuayhocCwgJmZsaXAsICZoYW5ndXAsICZoYW5kc2hha2UpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJCS8qCisJCSAqIHdlIGhhdmUgdG8gY2FsbCB0dHlfZmxpcF9idWZmZXJfcHVzaCgpIGFuZCB0dHlfaGFuZ3VwKCkgb3V0c2lkZSBvdXIKKwkJICogc3BpbmxvY2suIEJ1dCB3ZSBhbHNvIGhhdmUgdG8ga2VlcCBnb2luZyB1bnRpbCB3ZSd2ZSByZWFkIGFsbCB0aGUKKwkJICogYXZhaWxhYmxlIGRhdGEuCisJCSAqLworCisJCWlmIChmbGlwKSB7CisJCQkvKiB0aGVyZSB3YXMgZGF0YSBwdXQgaW4gdGhlIHR0eSBmbGlwIGJ1ZmZlciAqLworCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2goZmxpcCk7CisJCQlmbGlwID0gTlVMTDsKKwkJfQorCisJCWlmIChoYW5ndXApIHsKKwkJCXR0eV9oYW5ndXAoaGFuZ3VwKTsKKwkJfQorCisJCWlmIChoYW5kc2hha2UpIHsKKwkJCXByX2RlYnVnKCJodnNpJWk6IGF0dGVtcHRpbmcgcmUtaGFuZHNoYWtlXG4iLCBoYW5kc2hha2UtPmluZGV4KTsKKwkJCXNjaGVkdWxlX3dvcmsoJmhhbmRzaGFrZS0+aGFuZHNoYWtlcik7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaHAtPnR0eSAmJiBocC0+bl90aHJvdHRsZQorCQkJJiYgKCF0ZXN0X2JpdChUVFlfVEhST1RUTEVELCAmaHAtPnR0eS0+ZmxhZ3MpKSkgeworCQkvKiB3ZSB3ZXJlbid0IGh1bmcgdXAgYW5kIHdlIHdlcmVuJ3QgdGhyb3R0bGVkLCBzbyB3ZSBjYW4gZGVsaXZlciB0aGUKKwkJICogcmVzdCBub3cgKi8KKwkJZmxpcCA9IGhwLT50dHk7CisJCWh2c2lfc2VuZF9vdmVyZmxvdyhocCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZmxpcCkgeworCQl0dHlfZmxpcF9idWZmZXJfcHVzaChmbGlwKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIGZvciBib290IGNvbnNvbGUsIGJlZm9yZSB0aGUgaXJxIGhhbmRsZXIgaXMgcnVubmluZyAqLworc3RhdGljIGludCBfX2luaXQgcG9sbF9mb3Jfc3RhdGUoc3RydWN0IGh2c2lfc3RydWN0ICpocCwgaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgZW5kX2ppZmZpZXMgPSBqaWZmaWVzICsgSFZTSV9USU1FT1VUOworCisJZm9yICg7OykgeworCQlodnNpX2ludGVycnVwdChocC0+dmlycSwgKHZvaWQgKilocCwgTlVMTCk7IC8qIGdldCBwZW5kaW5nIGRhdGEgKi8KKworCQlpZiAoaHAtPnN0YXRlID09IHN0YXRlKQorCQkJcmV0dXJuIDA7CisKKwkJbWRlbGF5KDUpOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBlbmRfamlmZmllcykpCisJCQlyZXR1cm4gLUVJTzsKKwl9Cit9CisKKy8qIHdhaXQgZm9yIGlycSBoYW5kbGVyIHRvIGNoYW5nZSBvdXIgc3RhdGUgKi8KK3N0YXRpYyBpbnQgd2FpdF9mb3Jfc3RhdGUoc3RydWN0IGh2c2lfc3RydWN0ICpocCwgaW50IHN0YXRlKQoreworCWludCByZXQgPSAwOworCisJaWYgKCF3YWl0X2V2ZW50X3RpbWVvdXQoaHAtPnN0YXRlcSwgKGhwLT5zdGF0ZSA9PSBzdGF0ZSksIEhWU0lfVElNRU9VVCkpCisJCXJldCA9IC1FSU87CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGh2c2lfcXVlcnkoc3RydWN0IGh2c2lfc3RydWN0ICpocCwgdWludDE2X3QgdmVyYikKK3sKKwlzdHJ1Y3QgaHZzaV9xdWVyeSBwYWNrZXQgX19BTElHTkVEX187CisJaW50IHdyb3RlOworCisJcGFja2V0LnR5cGUgPSBWU19RVUVSWV9QQUNLRVRfSEVBREVSOworCXBhY2tldC5sZW4gPSBzaXplb2Yoc3RydWN0IGh2c2lfcXVlcnkpOworCXBhY2tldC5zZXFubyA9IGF0b21pY19pbmNfcmV0dXJuKCZocC0+c2Vxbm8pOworCXBhY2tldC52ZXJiID0gdmVyYjsKKworCXByX2RlYnVnKCIlczogc2VuZGluZyAlaSBieXRlc1xuIiwgX19GVU5DVElPTl9fLCBwYWNrZXQubGVuKTsKKwlkYmdfZHVtcF9oZXgoKHVpbnQ4X3QqKSZwYWNrZXQsIHBhY2tldC5sZW4pOworCisJd3JvdGUgPSBodmNfcHV0X2NoYXJzKGhwLT52dGVybW5vLCAoY2hhciAqKSZwYWNrZXQsIHBhY2tldC5sZW4pOworCWlmICh3cm90ZSAhPSBwYWNrZXQubGVuKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiBjb3VsZG4ndCBzZW5kIHF1ZXJ5ICglaSkhXG4iLCBocC0+aW5kZXgsCisJCQl3cm90ZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh2c2lfZ2V0X21jdHJsKHN0cnVjdCBodnNpX3N0cnVjdCAqaHApCit7CisJaW50IHJldDsKKworCXNldF9zdGF0ZShocCwgSFZTSV9XQUlUX0ZPUl9NQ1RSTF9SRVNQT05TRSk7CisJaHZzaV9xdWVyeShocCwgVlNWX1NFTkRfTU9ERU1fQ1RMX1NUQVRVUyk7CisKKwlyZXQgPSBodnNpX3dhaXQoaHAsIEhWU0lfT1BFTik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IGRpZG4ndCBnZXQgbW9kZW0gZmxhZ3NcbiIsIGhwLT5pbmRleCk7CisJCXNldF9zdGF0ZShocCwgSFZTSV9PUEVOKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IG1jdHJsIDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgaHAtPm1jdHJsKTsKKworCXJldHVybiAwOworfQorCisvKiBub3RlIHRoYXQgd2UgY2FuIG9ubHkgc2V0IERUUiAqLworc3RhdGljIGludCBodnNpX3NldF9tY3RybChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCB1aW50MTZfdCBtY3RybCkKK3sKKwlzdHJ1Y3QgaHZzaV9jb250cm9sIHBhY2tldCBfX0FMSUdORURfXzsKKwlpbnQgd3JvdGU7CisKKwlwYWNrZXQudHlwZSA9IFZTX0NPTlRST0xfUEFDS0VUX0hFQURFUiwKKwlwYWNrZXQuc2Vxbm8gPSBhdG9taWNfaW5jX3JldHVybigmaHAtPnNlcW5vKTsKKwlwYWNrZXQubGVuID0gc2l6ZW9mKHN0cnVjdCBodnNpX2NvbnRyb2wpOworCXBhY2tldC52ZXJiID0gVlNWX1NFVF9NT0RFTV9DVEw7CisJcGFja2V0Lm1hc2sgPSBIVlNJX1RTRFRSOworCisJaWYgKG1jdHJsICYgVElPQ01fRFRSKQorCQlwYWNrZXQud29yZCA9IEhWU0lfVFNEVFI7CisKKwlwcl9kZWJ1ZygiJXM6IHNlbmRpbmcgJWkgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXywgcGFja2V0Lmxlbik7CisJZGJnX2R1bXBfaGV4KCh1aW50OF90KikmcGFja2V0LCBwYWNrZXQubGVuKTsKKworCXdyb3RlID0gaHZjX3B1dF9jaGFycyhocC0+dnRlcm1ubywgKGNoYXIgKikmcGFja2V0LCBwYWNrZXQubGVuKTsKKwlpZiAod3JvdGUgIT0gcGFja2V0LmxlbikgeworCQlwcmludGsoS0VSTl9FUlIgImh2c2klaTogY291bGRuJ3Qgc2V0IERUUiFcbiIsIGhwLT5pbmRleCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBodnNpX2RyYWluX2lucHV0KHN0cnVjdCBodnNpX3N0cnVjdCAqaHApCit7CisJdWludDhfdCBidWZbSFZTSV9NQVhfUkVBRF0gX19BTElHTkVEX187CisJdW5zaWduZWQgbG9uZyBlbmRfamlmZmllcyA9IGppZmZpZXMgKyBIVlNJX1RJTUVPVVQ7CisKKwl3aGlsZSAodGltZV9iZWZvcmUoZW5kX2ppZmZpZXMsIGppZmZpZXMpKQorCQlpZiAoMCA9PSBodnNpX3JlYWQoaHAsIGJ1ZiwgSFZTSV9NQVhfUkVBRCkpCisJCQlicmVhazsKK30KKworc3RhdGljIGludCBodnNpX2hhbmRzaGFrZShzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwKQoreworCWludCByZXQ7CisKKwkvKgorCSAqIFdlIGNvdWxkIGhhdmUgYSBDTE9TRSBvciBvdGhlciBkYXRhIHdhaXRpbmcgZm9yIHVzIGJlZm9yZSB3ZSBldmVuIHRyeQorCSAqIHRvIG9wZW47IHRyeSB0byB0aHJvdyBpdCBhbGwgYXdheSBzbyB3ZSBkb24ndCBnZXQgY29uZnVzZWQuIChDTE9TRQorCSAqIGlzIHRoZSBmaXJzdCBtZXNzYWdlIHNlbnQgdXAgdGhlIHBpcGUgd2hlbiB0aGUgRlNQIGNvbWVzIG9ubGluZS4gV2UKKwkgKiBuZWVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gIml0IGNhbWUgdXAgYSB3aGlsZSBhZ28gYW5kIHdlJ3JlIHRoZSBmaXJzdAorCSAqIHVzZXIiIGFuZCAiaXQgd2FzIGp1c3QgcmVzZXQgYmVmb3JlIGl0IHNhdyBvdXIgaGFuZHNoYWtlIHBhY2tldCIuKQorCSAqLworCWh2c2lfZHJhaW5faW5wdXQoaHApOworCisJc2V0X3N0YXRlKGhwLCBIVlNJX1dBSVRfRk9SX1ZFUl9SRVNQT05TRSk7CisJcmV0ID0gaHZzaV9xdWVyeShocCwgVlNWX1NFTkRfVkVSU0lPTl9OVU1CRVIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiBjb3VsZG4ndCBzZW5kIHZlcnNpb24gcXVlcnlcbiIsIGhwLT5pbmRleCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaHZzaV93YWl0KGhwLCBIVlNJX09QRU4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGh2c2lfaGFuZHNoYWtlcih2b2lkICphcmcpCit7CisJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9IChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKilhcmc7CisKKwlpZiAoaHZzaV9oYW5kc2hha2UoaHApID49IDApCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiByZS1oYW5kc2hha2luZyBmYWlsZWRcbiIsIGhwLT5pbmRleCk7CisJaWYgKGlzX2NvbnNvbGUoaHApKSB7CisJCS8qCisJCSAqIHR0eXMgd2lsbCByZS1hdHRlbXB0IHRoZSBoYW5kc2hha2UgdmlhIGh2c2lfb3BlbiwgYnV0CisJCSAqIHRoZSBjb25zb2xlIHdpbGwgbm90LgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IGxvc3QgY29uc29sZSFcbiIsIGhwLT5pbmRleCk7CisJfQorfQorCitzdGF0aWMgaW50IGh2c2lfcHV0X2NoYXJzKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCBodnNpX2RhdGEgcGFja2V0IF9fQUxJR05FRF9fOworCWludCByZXQ7CisKKwlCVUdfT04oY291bnQgPiBIVlNJX01BWF9PVVRHT0lOR19EQVRBKTsKKworCXBhY2tldC50eXBlID0gVlNfREFUQV9QQUNLRVRfSEVBREVSOworCXBhY2tldC5zZXFubyA9IGF0b21pY19pbmNfcmV0dXJuKCZocC0+c2Vxbm8pOworCXBhY2tldC5sZW4gPSBjb3VudCArIHNpemVvZihzdHJ1Y3QgaHZzaV9oZWFkZXIpOworCW1lbWNweSgmcGFja2V0LmRhdGEsIGJ1ZiwgY291bnQpOworCisJcmV0ID0gaHZjX3B1dF9jaGFycyhocC0+dnRlcm1ubywgKGNoYXIgKikmcGFja2V0LCBwYWNrZXQubGVuKTsKKwlpZiAocmV0ID09IHBhY2tldC5sZW4pIHsKKwkJLyogcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcnMgd3JpdHRlbiwgbm90IHRoZSBwYWNrZXQgbGVuZ3RoICovCisJCXJldHVybiBjb3VudDsKKwl9CisJcmV0dXJuIHJldDsgLyogcmV0dXJuIGFueSBlcnJvcnMgKi8KK30KKworc3RhdGljIHZvaWQgaHZzaV9jbG9zZV9wcm90b2NvbChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwKQoreworCXN0cnVjdCBodnNpX2NvbnRyb2wgcGFja2V0IF9fQUxJR05FRF9fOworCisJcGFja2V0LnR5cGUgPSBWU19DT05UUk9MX1BBQ0tFVF9IRUFERVI7CisJcGFja2V0LnNlcW5vID0gYXRvbWljX2luY19yZXR1cm4oJmhwLT5zZXFubyk7CisJcGFja2V0LmxlbiA9IDY7CisJcGFja2V0LnZlcmIgPSBWU1ZfQ0xPU0VfUFJPVE9DT0w7CisKKwlwcl9kZWJ1ZygiJXM6IHNlbmRpbmcgJWkgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXywgcGFja2V0Lmxlbik7CisJZGJnX2R1bXBfaGV4KCh1aW50OF90KikmcGFja2V0LCBwYWNrZXQubGVuKTsKKworCWh2Y19wdXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIChjaGFyICopJnBhY2tldCwgcGFja2V0Lmxlbik7Cit9CisKK3N0YXRpYyBpbnQgaHZzaV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbGluZSA9IHR0eS0+aW5kZXg7CisJaW50IHJldDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWlmIChsaW5lIDwgMCB8fCBsaW5lID49IGh2c2lfY291bnQpCisJCXJldHVybiAtRU5PREVWOworCWhwID0gJmh2c2lfcG9ydHNbbGluZV07CisKKwl0dHktPmRyaXZlcl9kYXRhID0gaHA7CisJdHR5LT5sb3dfbGF0ZW5jeSA9IDE7IC8qIGF2b2lkIHRocm90dGxlL3R0eV9mbGlwX2J1ZmZlcl9wdXNoIHJhY2UgKi8KKworCW1iKCk7CisJaWYgKGhwLT5zdGF0ZSA9PSBIVlNJX0ZTUF9ESUVEKQorCQlyZXR1cm4gLUVJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCWhwLT50dHkgPSB0dHk7CisJaHAtPmNvdW50Kys7CisJYXRvbWljX3NldCgmaHAtPnNlcW5vLCAwKTsKKwloX3Zpb19zaWduYWwoaHAtPnZ0ZXJtbm8sIFZJT19JUlFfRU5BQkxFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGlzX2NvbnNvbGUoaHApKQorCQlyZXR1cm4gMDsgLyogdGhpcyBoYXMgYWxyZWFkeSBiZWVuIGhhbmRzaGFrZWQgYXMgdGhlIGNvbnNvbGUgKi8KKworCXJldCA9IGh2c2lfaGFuZHNoYWtlKGhwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBIVlNJIGhhbmRzaGFraW5nIGZhaWxlZFxuIiwgdHR5LT5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBodnNpX2dldF9tY3RybChocCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3QgZ2V0IGluaXRpYWwgbW9kZW0gZmxhZ3NcbiIsIHR0eS0+bmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaHZzaV9zZXRfbWN0cmwoaHAsIGhwLT5tY3RybCB8IFRJT0NNX0RUUik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3Qgc2V0IERUUlxuIiwgdHR5LT5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogd2FpdCBmb3IgaHZzaV93cml0ZV93b3JrZXIgdG8gZW1wdHkgaHAtPm91dGJ1ZiAqLworc3RhdGljIHZvaWQgaHZzaV9mbHVzaF9vdXRwdXQoc3RydWN0IGh2c2lfc3RydWN0ICpocCkKK3sKKwl3YWl0X2V2ZW50X3RpbWVvdXQoaHAtPmVtcHR5cSwgKGhwLT5uX291dGJ1ZiA8PSAwKSwgSFZTSV9USU1FT1VUKTsKKworCS8qICd3cml0ZXInIGNvdWxkIHN0aWxsIGJlIHBlbmRpbmcgaWYgaXQgZGlkbid0IHNlZSBuX291dGJ1ZiA9IDAgeWV0ICovCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaHAtPndyaXRlcik7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCS8qCisJICogaXQncyBhbHNvIHBvc3NpYmxlIHRoYXQgb3VyIHRpbWVvdXQgZXhwaXJlZCBhbmQgaHZzaV93cml0ZV93b3JrZXIKKwkgKiBkaWRuJ3QgbWFuYWdlIHRvIHB1c2ggb3V0YnVmLiBwb29mLgorCSAqLworCWhwLT5uX291dGJ1ZiA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGh2c2lfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCWlmICgtLWhwLT5jb3VudCA9PSAwKSB7CisJCWhwLT50dHkgPSBOVUxMOworCQlocC0+aW5idWZfZW5kID0gaHAtPmluYnVmOyAvKiBkaXNjYXJkIHJlbWFpbmluZyBwYXJ0aWFsIHBhY2tldHMgKi8KKworCQkvKiBvbmx5IGNsb3NlIGRvd24gY29ubmVjdGlvbiBpZiBpdCBpcyBub3QgdGhlIGNvbnNvbGUgKi8KKwkJaWYgKCFpc19jb25zb2xlKGhwKSkgeworCQkJaF92aW9fc2lnbmFsKGhwLT52dGVybW5vLCBWSU9fSVJRX0RJU0FCTEUpOyAvKiBubyBtb3JlIGlycXMgKi8KKwkJCV9fc2V0X3N0YXRlKGhwLCBIVlNJX0NMT1NFRCk7CisJCQkvKgorCQkJICogYW55IGRhdGEgZGVsaXZlcmVkIHRvIHRoZSB0dHkgbGF5ZXIgYWZ0ZXIgdGhpcyB3aWxsIGJlCisJCQkgKiBkaXNjYXJkZWQgKGV4Y2VwdCBmb3IgWE9OL1hPRkYpCisJCQkgKi8KKwkJCXR0eS0+Y2xvc2luZyA9IDE7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwkJCS8qIGxldCBhbnkgZXhpc3RpbmcgaXJxIGhhbmRsZXJzIGZpbmlzaC4gbm8gbW9yZSB3aWxsIHN0YXJ0LiAqLworCQkJc3luY2hyb25pemVfaXJxKGhwLT52aXJxKTsKKworCQkJLyogaHZzaV93cml0ZV93b3JrZXIgd2lsbCByZS1zY2hlZHVsZSB1bnRpbCBvdXRidWYgaXMgZW1wdHkuICovCisJCQlodnNpX2ZsdXNoX291dHB1dChocCk7CisKKwkJCS8qIHRlbGwgRlNQIHRvIHN0b3Agc2VuZGluZyBkYXRhICovCisJCQlodnNpX2Nsb3NlX3Byb3RvY29sKGhwKTsKKworCQkJLyoKKwkJCSAqIGRyYWluIGFueXRoaW5nIEZTUCBpcyBzdGlsbCBpbiB0aGUgbWlkZGxlIG9mIHNlbmRpbmcsIGFuZCBsZXQKKwkJCSAqIGh2c2lfaGFuZHNoYWtlIGRyYWluIHRoZSByZXN0IG9uIHRoZSBuZXh0IG9wZW4uCisJCQkgKi8KKwkJCWh2c2lfZHJhaW5faW5wdXQoaHApOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkJfQorCX0gZWxzZSBpZiAoaHAtPmNvdW50IDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJodnNpX2Nsb3NlICVsdTogb29wcywgY291bnQgaXMgJWRcbiIsCisJCSAgICAgICBocCAtIGh2c2lfcG9ydHMsIGhwLT5jb3VudCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBodnNpX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCWhwLT5jb3VudCA9IDA7CisJaHAtPm5fb3V0YnVmID0gMDsKKwlocC0+dHR5ID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIGNhbGxlZCB3aXRoIGhwLT5sb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGh2c2lfcHVzaChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwKQoreworCWludCBuOworCisJaWYgKGhwLT5uX291dGJ1ZiA8PSAwKQorCQlyZXR1cm47CisKKwluID0gaHZzaV9wdXRfY2hhcnMoaHAsIGhwLT5vdXRidWYsIGhwLT5uX291dGJ1Zik7CisJaWYgKG4gPiAwKSB7CisJCS8qIHN1Y2Nlc3MgKi8KKwkJcHJfZGVidWcoIiVzOiB3cm90ZSAlaSBjaGFyc1xuIiwgX19GVU5DVElPTl9fLCBuKTsKKwkJaHAtPm5fb3V0YnVmID0gMDsKKwl9IGVsc2UgaWYgKG4gPT0gLUVJTykgeworCQlfX3NldF9zdGF0ZShocCwgSFZTSV9GU1BfRElFRCk7CisJCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiBzZXJ2aWNlIHByb2Nlc3NvciBkaWVkXG4iLCBocC0+aW5kZXgpOworCX0KK30KKworLyogaHZzaV93cml0ZV93b3JrZXIgd2lsbCBrZWVwIHJlc2NoZWR1bGluZyBpdHNlbGYgdW50aWwgb3V0YnVmIGlzIGVtcHR5ICovCitzdGF0aWMgdm9pZCBodnNpX3dyaXRlX3dvcmtlcih2b2lkICphcmcpCit7CisJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9IChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKilhcmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBERUJVRworCXN0YXRpYyBsb25nIHN0YXJ0X2ogPSAwOworCisJaWYgKHN0YXJ0X2ogPT0gMCkKKwkJc3RhcnRfaiA9IGppZmZpZXM7CisjZW5kaWYgLyogREVCVUcgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCisJcHJfZGVidWcoIiVzOiAlaSBjaGFycyBpbiBidWZmZXJcbiIsIF9fRlVOQ1RJT05fXywgaHAtPm5fb3V0YnVmKTsKKworCWlmICghaXNfb3BlbihocCkpIHsKKwkJLyoKKwkJICogV2UgY291bGQgaGF2ZSBhIG5vbi1vcGVuIGNvbm5lY3Rpb24gaWYgdGhlIHNlcnZpY2UgcHJvY2Vzc29yIGRpZWQKKwkJICogd2hpbGUgd2Ugd2VyZSBidXNpbHkgc2NoZWR1bGluZyBvdXJzZWx2ZXMuIEluIHRoYXQgY2FzZSwgaXQgY291bGQKKwkJICogYmUgbWludXRlcyBiZWZvcmUgdGhlIHNlcnZpY2UgcHJvY2Vzc29yIGNvbWVzIGJhY2ssIHNvIG9ubHkgdHJ5CisJCSAqIGFnYWluIG9uY2UgYSBzZWNvbmQuCisJCSAqLworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmhwLT53cml0ZXIsIEhaKTsKKwkJZ290byBvdXQ7CisJfQorCisJaHZzaV9wdXNoKGhwKTsKKwlpZiAoaHAtPm5fb3V0YnVmID4gMCkKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZocC0+d3JpdGVyLCAxMCk7CisJZWxzZSB7CisjaWZkZWYgREVCVUcKKwkJcHJfZGVidWcoIiVzOiBvdXRidWYgZW1wdGllZCBhZnRlciAlbGkgamlmZmllc1xuIiwgX19GVU5DVElPTl9fLAorCQkJCWppZmZpZXMgLSBzdGFydF9qKTsKKwkJc3RhcnRfaiA9IDA7CisjZW5kaWYgLyogREVCVUcgKi8KKwkJd2FrZV91cF9hbGwoJmhwLT5lbXB0eXEpOworCQlpZiAodGVzdF9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJmhwLT50dHktPmZsYWdzKQorCQkJCSYmIGhwLT50dHktPmxkaXNjLndyaXRlX3dha2V1cCkKKwkJCWhwLT50dHktPmxkaXNjLndyaXRlX3dha2V1cChocC0+dHR5KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZocC0+dHR5LT53cml0ZV93YWl0KTsKKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGh2c2lfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAoc3RydWN0IGh2c2lfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKworCXJldHVybiBOX09VVEJVRiAtIGhwLT5uX291dGJ1ZjsKK30KKworc3RhdGljIGludCBodnNpX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAoc3RydWN0IGh2c2lfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKworCXJldHVybiBocC0+bl9vdXRidWY7Cit9CisKK3N0YXRpYyBpbnQgaHZzaV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWNvbnN0IGNoYXIgKnNvdXJjZSA9IGJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0b3RhbCA9IDA7CisJaW50IG9yaWdjb3VudCA9IGNvdW50OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlwcl9kZWJ1ZygiJXM6ICVpIGNoYXJzIGluIGJ1ZmZlclxuIiwgX19GVU5DVElPTl9fLCBocC0+bl9vdXRidWYpOworCisJaWYgKCFpc19vcGVuKGhwKSkgeworCQkvKiB3ZSdyZSBlaXRoZXIgY2xvc2luZyBvciBub3QgeWV0IG9wZW47IGRvbid0IGFjY2VwdCBkYXRhICovCisJCXByX2RlYnVnKCIlczogbm90IG9wZW5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogd2hlbiB0aGUgaHlwZXJ2aXNvciBidWZmZXIgKDE2SykgZmlsbHMsIGRhdGEgd2lsbCBzdGF5IGluIGhwLT5vdXRidWYKKwkgKiBhbmQgaHZzaV93cml0ZV93b3JrZXIgd2lsbCBiZSBzY2hlZHVsZWQuIHN1YnNlcXVlbnQgaHZzaV93cml0ZSgpIGNhbGxzCisJICogd2lsbCBzZWUgdGhlcmUgaXMgbm8gcm9vbSBpbiBvdXRidWYgYW5kIHJldHVybi4KKwkgKi8KKwl3aGlsZSAoKGNvdW50ID4gMCkgJiYgKGh2c2lfd3JpdGVfcm9vbShocC0+dHR5KSA+IDApKSB7CisJCWludCBjaHVua3NpemUgPSBtaW4oY291bnQsIGh2c2lfd3JpdGVfcm9vbShocC0+dHR5KSk7CisKKwkJQlVHX09OKGhwLT5uX291dGJ1ZiA8IDApOworCQltZW1jcHkoaHAtPm91dGJ1ZiArIGhwLT5uX291dGJ1Ziwgc291cmNlLCBjaHVua3NpemUpOworCQlocC0+bl9vdXRidWYgKz0gY2h1bmtzaXplOworCisJCXRvdGFsICs9IGNodW5rc2l6ZTsKKwkJc291cmNlICs9IGNodW5rc2l6ZTsKKwkJY291bnQgLT0gY2h1bmtzaXplOworCQlodnNpX3B1c2goaHApOworCX0KKworCWlmIChocC0+bl9vdXRidWYgPiAwKSB7CisJCS8qCisJCSAqIHdlIHdlcmVuJ3QgYWJsZSB0byB3cml0ZSBpdCBhbGwgdG8gdGhlIGh5cGVydmlzb3IuCisJCSAqIHNjaGVkdWxlIGFub3RoZXIgcHVzaCBhdHRlbXB0LgorCQkgKi8KKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZocC0+d3JpdGVyLCAxMCk7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCWlmICh0b3RhbCAhPSBvcmlnY291bnQpCisJCXByX2RlYnVnKCIlczogd2FudGVkICVpLCBvbmx5IHdyb3RlICVpXG4iLCBfX0ZVTkNUSU9OX18sIG9yaWdjb3VudCwKKwkJCXRvdGFsKTsKKworCXJldHVybiB0b3RhbDsKK30KKworLyoKKyAqIEkgaGF2ZSBuZXZlciBzZWVuIHRocm90dGxlIG9yIHVudGhyb3R0bGUgY2FsbGVkLCBzbyB0aGlzIGxpdHRsZSB0aHJvdHRsZQorICogYnVmZmVyaW5nIHNjaGVtZSBtYXkgb3IgbWF5IG5vdCB3b3JrLgorICovCitzdGF0aWMgdm9pZCBodnNpX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9IChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCisJcHJfZGVidWcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaF92aW9fc2lnbmFsKGhwLT52dGVybW5vLCBWSU9fSVJRX0RJU0FCTEUpOworfQorCitzdGF0aWMgdm9pZCBodnNpX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwID0gKHN0cnVjdCBodnNpX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc2hvdWxkZmxpcCA9IDA7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaHAtPm5fdGhyb3R0bGUpIHsKKwkJaHZzaV9zZW5kX292ZXJmbG93KGhwKTsKKwkJc2hvdWxkZmxpcCA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc2hvdWxkZmxpcCkKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2goaHAtPnR0eSk7CisKKwloX3Zpb19zaWduYWwoaHAtPnZ0ZXJtbm8sIFZJT19JUlFfRU5BQkxFKTsKK30KKworc3RhdGljIGludCBodnNpX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAoc3RydWN0IGh2c2lfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKworCWh2c2lfZ2V0X21jdHJsKGhwKTsKKwlyZXR1cm4gaHAtPm1jdHJsOworfQorCitzdGF0aWMgaW50IGh2c2lfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwID0gKHN0cnVjdCBodnNpX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1aW50MTZfdCBuZXdfbWN0cmw7CisKKwkvKiB3ZSBjYW4gb25seSBhbHRlciBEVFIgKi8KKwljbGVhciAmPSBUSU9DTV9EVFI7CisJc2V0ICY9IFRJT0NNX0RUUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCisJbmV3X21jdHJsID0gKGhwLT5tY3RybCAmIH5jbGVhcikgfCBzZXQ7CisKKwlpZiAoaHAtPm1jdHJsICE9IG5ld19tY3RybCkgeworCQlodnNpX3NldF9tY3RybChocCwgbmV3X21jdHJsKTsKKwkJaHAtPm1jdHJsID0gbmV3X21jdHJsOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBodnNpX29wcyA9IHsKKwkub3BlbiA9IGh2c2lfb3BlbiwKKwkuY2xvc2UgPSBodnNpX2Nsb3NlLAorCS53cml0ZSA9IGh2c2lfd3JpdGUsCisJLmhhbmd1cCA9IGh2c2lfaGFuZ3VwLAorCS53cml0ZV9yb29tID0gaHZzaV93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBodnNpX2NoYXJzX2luX2J1ZmZlciwKKwkudGhyb3R0bGUgPSBodnNpX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gaHZzaV91bnRocm90dGxlLAorCS50aW9jbWdldCA9IGh2c2lfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gaHZzaV90aW9jbXNldCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGh2c2lfaW5pdCh2b2lkKQoreworCWludCBpOworCisJaHZzaV9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKGh2c2lfY291bnQpOworCWlmICghaHZzaV9kcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJaHZzaV9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJaHZzaV9kcml2ZXItPmRldmZzX25hbWUgPSAiaHZzaS8iOworCWh2c2lfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJodnNpIjsKKwlodnNpX2RyaXZlci0+bmFtZSA9ICJodnNpIjsKKwlodnNpX2RyaXZlci0+bWFqb3IgPSBIVlNJX01BSk9SOworCWh2c2lfZHJpdmVyLT5taW5vcl9zdGFydCA9IEhWU0lfTUlOT1I7CisJaHZzaV9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU1lTVEVNOworCWh2c2lfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJaHZzaV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMOworCWh2c2lfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKGh2c2lfZHJpdmVyLCAmaHZzaV9vcHMpOworCisJZm9yIChpPTA7IGkgPCBodnNpX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9ICZodnNpX3BvcnRzW2ldOworCQlpbnQgcmV0ID0gMTsKKworCQlyZXQgPSByZXF1ZXN0X2lycShocC0+dmlycSwgaHZzaV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgImh2c2kiLCBocCk7CisJCWlmIChyZXQpCisJCQlwcmludGsoS0VSTl9FUlIgIkhWU0k6IGNvdWxkbid0IHJlc2VydmUgaXJxIDB4JXggKGVycm9yICVpKVxuIiwKKwkJCQlocC0+dmlycSwgcmV0KTsKKwl9CisJaHZzaV93YWl0ID0gd2FpdF9mb3Jfc3RhdGU7IC8qIGlycXMgYWN0aXZlIG5vdyAqLworCisJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoaHZzaV9kcml2ZXIpKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgaHZzaSBjb25zb2xlIGRyaXZlclxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICJIVlNJOiByZWdpc3RlcmVkICVpIGRldmljZXNcbiIsIGh2c2lfY291bnQpOworCisJcmV0dXJuIDA7Cit9CitkZXZpY2VfaW5pdGNhbGwoaHZzaV9pbml0KTsKKworLyoqKioqIGNvbnNvbGUgKG5vdCB0dHkpIGNvZGU6ICoqKioqLworCitzdGF0aWMgdm9pZCBodnNpX2NvbnNvbGVfcHJpbnQoc3RydWN0IGNvbnNvbGUgKmNvbnNvbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAmaHZzaV9wb3J0c1tjb25zb2xlLT5pbmRleF07CisJY2hhciBjW0hWU0lfTUFYX09VVEdPSU5HX0RBVEFdIF9fQUxJR05FRF9fOworCXVuc2lnbmVkIGludCBpID0gMCwgbiA9IDA7CisJaW50IHJldCwgZG9uZWNyID0gMDsKKworCW1iKCk7CisJaWYgKCFpc19vcGVuKGhwKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiB1Z2gsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIExGIC0+IENSTEYgb3Vyc2VsdmVzLCBpbiBwbGFjZS4KKwkgKiBjb3BpZWQgZnJvbSBodmNfY29uc29sZS5jOgorCSAqLworCXdoaWxlIChjb3VudCA+IDAgfHwgaSA+IDApIHsKKwkJaWYgKGNvdW50ID4gMCAmJiBpIDwgc2l6ZW9mKGMpKSB7CisJCQlpZiAoYnVmW25dID09ICdcbicgJiYgIWRvbmVjcikgeworCQkJCWNbaSsrXSA9ICdccic7CisJCQkJZG9uZWNyID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJY1tpKytdID0gYnVmW24rK107CisJCQkJZG9uZWNyID0gMDsKKwkJCQktLWNvdW50OworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0ID0gaHZzaV9wdXRfY2hhcnMoaHAsIGMsIGkpOworCQkJaWYgKHJldCA8IDApCisJCQkJaSA9IDA7CisJCQlpIC09IHJldDsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpodnNpX2NvbnNvbGVfZGV2aWNlKHN0cnVjdCBjb25zb2xlICpjb25zb2xlLAorCWludCAqaW5kZXgpCit7CisJKmluZGV4ID0gY29uc29sZS0+aW5kZXg7CisJcmV0dXJuIGh2c2lfZHJpdmVyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBodnNpX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvbnNvbGUsIGNoYXIgKm9wdGlvbnMpCit7CisJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9ICZodnNpX3BvcnRzW2NvbnNvbGUtPmluZGV4XTsKKwlpbnQgcmV0OworCisJaWYgKGNvbnNvbGUtPmluZGV4IDwgMCB8fCBjb25zb2xlLT5pbmRleCA+PSBodnNpX2NvdW50KQorCQlyZXR1cm4gLTE7CisKKwkvKiBnaXZlIHRoZSBGU1AgYSBjaGFuY2UgdG8gY2hhbmdlIHRoZSBiYXVkIHJhdGUgd2hlbiB3ZSByZS1vcGVuICovCisJaHZzaV9jbG9zZV9wcm90b2NvbChocCk7CisKKwlyZXQgPSBodnNpX2hhbmRzaGFrZShocCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBodnNpX2dldF9tY3RybChocCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBodnNpX3NldF9tY3RybChocCwgaHAtPm1jdHJsIHwgVElPQ01fRFRSKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWhwLT5mbGFncyB8PSBIVlNJX0NPTlNPTEU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjb25zb2xlIGh2c2lfY29uX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaHZzaSIsCisJLndyaXRlCQk9IGh2c2lfY29uc29sZV9wcmludCwKKwkuZGV2aWNlCQk9IGh2c2lfY29uc29sZV9kZXZpY2UsCisJLnNldHVwCQk9IGh2c2lfY29uc29sZV9zZXR1cCwKKwkuZmxhZ3MJCT0gQ09OX1BSSU5UQlVGRkVSLAorCS5pbmRleAkJPSAtMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGh2c2lfY29uc29sZV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICp2dHk7CisKKwlodnNpX3dhaXQgPSBwb2xsX2Zvcl9zdGF0ZTsgLyogbm8gaXJxcyB5ZXQ7IG11c3QgcG9sbCAqLworCisJLyogc2VhcmNoIGRldmljZSB0cmVlIGZvciB2dHkgbm9kZXMgKi8KKwlmb3IgKHZ0eSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJzZXJpYWwiLCAiaHZ0ZXJtLXByb3RvY29sIik7CisJCQl2dHkgIT0gTlVMTDsKKwkJCXZ0eSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKHZ0eSwgInNlcmlhbCIsICJodnRlcm0tcHJvdG9jb2wiKSkgeworCQlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwOworCQl1aW50MzJfdCAqdnRlcm1ubzsKKwkJdWludDMyX3QgKmlycTsKKworCQl2dGVybW5vID0gKHVpbnQzMl90ICopZ2V0X3Byb3BlcnR5KHZ0eSwgInJlZyIsIE5VTEwpOworCQlpcnEgPSAodWludDMyX3QgKilnZXRfcHJvcGVydHkodnR5LCAiaW50ZXJydXB0cyIsIE5VTEwpOworCQlpZiAoIXZ0ZXJtbm8gfHwgIWlycSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChodnNpX2NvdW50ID49IE1BWF9OUl9IVlNJX0NPTlNPTEVTKSB7CisJCQlvZl9ub2RlX3B1dCh2dHkpOworCQkJYnJlYWs7CisJCX0KKworCQlocCA9ICZodnNpX3BvcnRzW2h2c2lfY291bnRdOworCQlJTklUX1dPUksoJmhwLT53cml0ZXIsIGh2c2lfd3JpdGVfd29ya2VyLCBocCk7CisJCUlOSVRfV09SSygmaHAtPmhhbmRzaGFrZXIsIGh2c2lfaGFuZHNoYWtlciwgaHApOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZocC0+ZW1wdHlxKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaHAtPnN0YXRlcSk7CisJCXNwaW5fbG9ja19pbml0KCZocC0+bG9jayk7CisJCWhwLT5pbmRleCA9IGh2c2lfY291bnQ7CisJCWhwLT5pbmJ1Zl9lbmQgPSBocC0+aW5idWY7CisJCWhwLT5zdGF0ZSA9IEhWU0lfQ0xPU0VEOworCQlocC0+dnRlcm1ubyA9ICp2dGVybW5vOworCQlocC0+dmlycSA9IHZpcnRfaXJxX2NyZWF0ZV9tYXBwaW5nKGlycVswXSk7CisJCWlmIChocC0+dmlycSA9PSBOT19JUlEpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkbid0IGNyZWF0ZSBpcnEgbWFwcGluZyBmb3IgMHgleFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGhwLT52aXJxKTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UKKwkJCWhwLT52aXJxID0gaXJxX29mZnNldF91cChocC0+dmlycSk7CisKKwkJaHZzaV9jb3VudCsrOworCX0KKworCWlmIChodnNpX2NvdW50KQorCQlyZWdpc3Rlcl9jb25zb2xlKCZodnNpX2Nvbl9kcml2ZXIpOworCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChodnNpX2NvbnNvbGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2YWMxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20uYwpAQCAtMCwwICsxLDYzMCBAQAorLyoKKyAJSGFyZHdhcmUgZHJpdmVyIGZvciB0aGUgSW50ZWwvQU1EL1ZJQSBSYW5kb20gTnVtYmVyIEdlbmVyYXRvcnMgKFJORykKKwkoYykgQ29weXJpZ2h0IDIwMDMgUmVkIEhhdCBJbmMgPGpnYXJ6aWtAcmVkaGF0LmNvbT4KKyAKKyAJZGVyaXZlZCBmcm9tCisgCisgICAgICAgIEhhcmR3YXJlIGRyaXZlciBmb3IgdGhlIEFNRCA3NjggUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKFJORykKKyAgICAgICAgKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jIDxhbGFuQHJlZGhhdC5jb20+CisKKyAJZGVyaXZlZCBmcm9tCisgCisJSGFyZHdhcmUgZHJpdmVyIGZvciBJbnRlbCBpODEwIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIChSTkcpCisJQ29weXJpZ2h0IDIwMDAsMjAwMSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJQ29weXJpZ2h0IDIwMDAsMjAwMSBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAbWFuZHJha2Vzb2Z0LmNvbT4KKworCVBsZWFzZSByZWFkIERvY3VtZW50YXRpb24vaHdfcmFuZG9tLnR4dCBmb3IgZGV0YWlscyBvbiB1c2UuCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICAgICAgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpZmRlZiBfX2kzODZfXworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKy8qCisgKiBjb3JlIG1vZHVsZSBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbgorICovCisjZGVmaW5lIFJOR19WRVJTSU9OICIxLjAuMCIKKyNkZWZpbmUgUk5HX01PRFVMRV9OQU1FICJod19yYW5kb20iCisjZGVmaW5lIFJOR19EUklWRVJfTkFNRSAgIFJOR19NT0RVTEVfTkFNRSAiIGhhcmR3YXJlIGRyaXZlciAiIFJOR19WRVJTSU9OCisjZGVmaW5lIFBGWCBSTkdfTU9EVUxFX05BTUUgIjogIgorCisKKy8qCisgKiBkZWJ1Z2dpbmcgbWFjcm9zCisgKi8KKworLyogcHJfZGVidWcoKSBjb2xsYXBzZXMgdG8gYSBuby1vcCBpZiBERUJVRyBpcyBub3QgZGVmaW5lZCAqLworI2RlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikgcHJfZGVidWcoUEZYICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisKKworI3VuZGVmIFJOR19OREVCVUcgICAgICAgIC8qIGRlZmluZSB0byBlbmFibGUgbGlnaHR3ZWlnaHQgcnVudGltZSBjaGVja3MgKi8KKyNpZmRlZiBSTkdfTkRFQlVHCisjZGVmaW5lIGFzc2VydChleHByKQkJCQkJCQlcCisJCWlmKCEoZXhwcikpIHsJCQkJCQlcCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiQXNzZXJ0aW9uIGZhaWxlZCEgJXMsJXMsJXMsIglcCisJCSJsaW5lPSVkXG4iLCAjZXhwciwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwlcCisJCX0KKyNlbHNlCisjZGVmaW5lIGFzc2VydChleHByKQorI2VuZGlmCisKKyNkZWZpbmUgUk5HX01JU0NERVZfTUlOT1IJCTE4MyAvKiBvZmZpY2lhbCAqLworCitzdGF0aWMgaW50IHJuZ19kZXZfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHNzaXplX3Qgcm5nX2Rldl9yZWFkIChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUsCisJCQkJbG9mZl90ICogb2ZmcCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGludGVsX2luaXQgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworc3RhdGljIHZvaWQgaW50ZWxfY2xlYW51cCh2b2lkKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW50ZWxfZGF0YV9wcmVzZW50ICh2b2lkKTsKK3N0YXRpYyB1MzIgaW50ZWxfZGF0YV9yZWFkICh2b2lkKTsKKworc3RhdGljIGludCBfX2luaXQgYW1kX2luaXQgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworc3RhdGljIHZvaWQgYW1kX2NsZWFudXAodm9pZCk7CitzdGF0aWMgdW5zaWduZWQgaW50IGFtZF9kYXRhX3ByZXNlbnQgKHZvaWQpOworc3RhdGljIHUzMiBhbWRfZGF0YV9yZWFkICh2b2lkKTsKKworI2lmZGVmIF9faTM4Nl9fCitzdGF0aWMgaW50IF9faW5pdCB2aWFfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK3N0YXRpYyB2b2lkIHZpYV9jbGVhbnVwKHZvaWQpOworc3RhdGljIHVuc2lnbmVkIGludCB2aWFfZGF0YV9wcmVzZW50ICh2b2lkKTsKK3N0YXRpYyB1MzIgdmlhX2RhdGFfcmVhZCAodm9pZCk7CisjZW5kaWYKKworc3RydWN0IHJuZ19vcGVyYXRpb25zIHsKKwlpbnQgKCppbml0KSAoc3RydWN0IHBjaV9kZXYgKmRldik7CisJdm9pZCAoKmNsZWFudXApICh2b2lkKTsKKwl1bnNpZ25lZCBpbnQgKCpkYXRhX3ByZXNlbnQpICh2b2lkKTsKKwl1MzIgKCpkYXRhX3JlYWQpICh2b2lkKTsKKwl1bnNpZ25lZCBpbnQgbl9ieXRlczsgLyogbnVtYmVyIG9mIGJ5dGVzIHBlciAtPmRhdGFfcmVhZCAqLworfTsKK3N0YXRpYyBzdHJ1Y3Qgcm5nX29wZXJhdGlvbnMgKnJuZ19vcHM7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJuZ19jaHJkZXZfb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBybmdfZGV2X29wZW4sCisJLnJlYWQJCT0gcm5nX2Rldl9yZWFkLAorfTsKKworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugcm5nX21pc2NkZXYgPSB7CisJUk5HX01JU0NERVZfTUlOT1IsCisJUk5HX01PRFVMRV9OQU1FLAorCSZybmdfY2hyZGV2X29wcywKK307CisKK2VudW0geworCXJuZ19od19ub25lLAorCXJuZ19od19pbnRlbCwKKwlybmdfaHdfYW1kLAorCXJuZ19od192aWEsCit9OworCitzdGF0aWMgc3RydWN0IHJuZ19vcGVyYXRpb25zIHJuZ192ZW5kb3Jfb3BzW10gPSB7CisJLyogcm5nX2h3X25vbmUgKi8KKwl7IH0sCisKKwkvKiBybmdfaHdfaW50ZWwgKi8KKwl7IGludGVsX2luaXQsIGludGVsX2NsZWFudXAsIGludGVsX2RhdGFfcHJlc2VudCwKKwkgIGludGVsX2RhdGFfcmVhZCwgMSB9LAorCisJLyogcm5nX2h3X2FtZCAqLworCXsgYW1kX2luaXQsIGFtZF9jbGVhbnVwLCBhbWRfZGF0YV9wcmVzZW50LCBhbWRfZGF0YV9yZWFkLCA0IH0sCisKKyNpZmRlZiBfX2kzODZfXworCS8qIHJuZ19od192aWEgKi8KKwl7IHZpYV9pbml0LCB2aWFfY2xlYW51cCwgdmlhX2RhdGFfcHJlc2VudCwgdmlhX2RhdGFfcmVhZCwgMSB9LAorI2VuZGlmCit9OworCisvKgorICogRGF0YSBmb3IgUENJIGRyaXZlciBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIGRhdGEgb25seSBleGlzdHMgZm9yIGV4cG9ydGluZyB0aGUgc3VwcG9ydGVkCisgKiBQQ0kgaWRzIHZpYSBNT0RVTEVfREVWSUNFX1RBQkxFLiAgV2UgZG8gbm90IGFjdHVhbGx5CisgKiByZWdpc3RlciBhIHBjaV9kcml2ZXIsIGJlY2F1c2Ugc29tZW9uZSBlbHNlIG1pZ2h0IG9uZSBkYXkKKyAqIHdhbnQgdG8gcmVnaXN0ZXIgYW5vdGhlciBkcml2ZXIgb24gdGhlIHNhbWUgUENJIGlkLgorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcm5nX3BjaV90YmxbXSA9IHsKKwl7IDB4MTAyMiwgMHg3NDQzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBybmdfaHdfYW1kIH0sCisJeyAweDEwMjIsIDB4NzQ2YiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2FtZCB9LAorCisJeyAweDgwODYsIDB4MjQxOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2ludGVsIH0sCisJeyAweDgwODYsIDB4MjQyOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2ludGVsIH0sCisJeyAweDgwODYsIDB4MjQ0OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2ludGVsIH0sCisJeyAweDgwODYsIDB4MjQ0ZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2ludGVsIH0sCisJeyAweDgwODYsIDB4MjQ1ZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2ludGVsIH0sCisKKwl7IDAsIH0sCS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBybmdfcGNpX3RibCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW50ZWwgUk5HIG9wZXJhdGlvbnMKKyAqCisgKi8KKworLyoKKyAqIFJORyByZWdpc3RlcnMgKG9mZnNldHMgZnJvbSBybmdfbWVtKQorICovCisjZGVmaW5lIElOVEVMX1JOR19IV19TVEFUVVMJCQkwCisjZGVmaW5lICAgICAgICAgSU5URUxfUk5HX1BSRVNFTlQJCTB4NDAKKyNkZWZpbmUgICAgICAgICBJTlRFTF9STkdfRU5BQkxFRAkJMHgwMQorI2RlZmluZSBJTlRFTF9STkdfU1RBVFVTCQkJMQorI2RlZmluZSAgICAgICAgIElOVEVMX1JOR19EQVRBX1BSRVNFTlQJCTB4MDEKKyNkZWZpbmUgSU5URUxfUk5HX0RBVEEJCQkJMgorCisvKgorICogTWFnaWMgYWRkcmVzcyBhdCB3aGljaCBJbnRlbCBQQ0kgYnJpZGdlcyBsb2NhdGUgdGhlIFJORworICovCisjZGVmaW5lIElOVEVMX1JOR19BRERSCQkJCTB4RkZCQzAxNUYKKyNkZWZpbmUgSU5URUxfUk5HX0FERFJfTEVOCQkJMworCisvKiB0b2tlbiB0byBvdXIgaW9yZW1hcCdkIFJORyByZWdpc3RlciBhcmVhICovCitzdGF0aWMgdm9pZCBfX2lvbWVtICpybmdfbWVtOworCitzdGF0aWMgaW5saW5lIHU4IGludGVsX2h3c3RhdHVzICh2b2lkKQoreworCWFzc2VydCAocm5nX21lbSAhPSBOVUxMKTsKKwlyZXR1cm4gcmVhZGIgKHJuZ19tZW0gKyBJTlRFTF9STkdfSFdfU1RBVFVTKTsKK30KKworc3RhdGljIGlubGluZSB1OCBpbnRlbF9od3N0YXR1c19zZXQgKHU4IGh3X3N0YXR1cykKK3sKKwlhc3NlcnQgKHJuZ19tZW0gIT0gTlVMTCk7CisJd3JpdGViIChod19zdGF0dXMsIHJuZ19tZW0gKyBJTlRFTF9STkdfSFdfU1RBVFVTKTsKKwlyZXR1cm4gaW50ZWxfaHdzdGF0dXMgKCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW50ZWxfZGF0YV9wcmVzZW50KHZvaWQpCit7CisJYXNzZXJ0IChybmdfbWVtICE9IE5VTEwpOworCisJcmV0dXJuIChyZWFkYiAocm5nX21lbSArIElOVEVMX1JOR19TVEFUVVMpICYgSU5URUxfUk5HX0RBVEFfUFJFU0VOVCkgPworCQkxIDogMDsKK30KKworc3RhdGljIHUzMiBpbnRlbF9kYXRhX3JlYWQodm9pZCkKK3sKKwlhc3NlcnQgKHJuZ19tZW0gIT0gTlVMTCk7CisKKwlyZXR1cm4gcmVhZGIgKHJuZ19tZW0gKyBJTlRFTF9STkdfREFUQSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGludGVsX2luaXQgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHJjOworCXU4IGh3X3N0YXR1czsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlybmdfbWVtID0gaW9yZW1hcCAoSU5URUxfUk5HX0FERFIsIElOVEVMX1JOR19BRERSX0xFTik7CisJaWYgKHJuZ19tZW0gPT0gTlVMTCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IGlvcmVtYXAgUk5HIE1lbW9yeVxuIik7CisJCXJjID0gLUVCVVNZOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogQ2hlY2sgZm9yIEludGVsIDgyODAyICovCisJaHdfc3RhdHVzID0gaW50ZWxfaHdzdGF0dXMgKCk7CisJaWYgKChod19zdGF0dXMgJiBJTlRFTF9STkdfUFJFU0VOVCkgPT0gMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiUk5HIG5vdCBkZXRlY3RlZFxuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbWFwOworCX0KKworCS8qIHR1cm4gUk5HIGgvdyBvbiwgaWYgaXQncyBvZmYgKi8KKwlpZiAoKGh3X3N0YXR1cyAmIElOVEVMX1JOR19FTkFCTEVEKSA9PSAwKQorCQlod19zdGF0dXMgPSBpbnRlbF9od3N0YXR1c19zZXQgKGh3X3N0YXR1cyB8IElOVEVMX1JOR19FTkFCTEVEKTsKKwlpZiAoKGh3X3N0YXR1cyAmIElOVEVMX1JOR19FTkFCTEVEKSA9PSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgZW5hYmxlIFJORywgYWJvcnRpbmdcbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyX291dF9mcmVlX21hcDsKKwl9CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfbWFwOgorCWlvdW5tYXAgKHJuZ19tZW0pOworCXJuZ19tZW0gPSBOVUxMOworZXJyX291dDoKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9jbGVhbnVwKHZvaWQpCit7CisJdTggaHdfc3RhdHVzOworCisJaHdfc3RhdHVzID0gaW50ZWxfaHdzdGF0dXMgKCk7CisJaWYgKGh3X3N0YXR1cyAmIElOVEVMX1JOR19FTkFCTEVEKQorCQlpbnRlbF9od3N0YXR1c19zZXQgKGh3X3N0YXR1cyAmIH5JTlRFTF9STkdfRU5BQkxFRCk7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAidW51c3VhbDogUk5HIGFscmVhZHkgZGlzYWJsZWRcbiIpOworCWlvdW5tYXAocm5nX21lbSk7CisJcm5nX21lbSA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEFNRCBSTkcgb3BlcmF0aW9ucworICoKKyAqLworCitzdGF0aWMgdTMyIHBtYmFzZTsJCQkvKiBQTXh4IEkvTyBiYXNlICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmFtZF9kZXY7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYW1kX2RhdGFfcHJlc2VudCAodm9pZCkKK3sKKyAgICAgIAlyZXR1cm4gaW5sKHBtYmFzZSArIDB4RjQpICYgMTsKK30KKworCitzdGF0aWMgdTMyIGFtZF9kYXRhX3JlYWQgKHZvaWQpCit7CisJcmV0dXJuIGlubChwbWJhc2UgKyAweEYwKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYW1kX2luaXQgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHJjOworCXU4IHJuZW47CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg1OCwgJnBtYmFzZSk7CisKKwlwbWJhc2UgJj0gMHgwMDAwRkYwMDsKKworCWlmIChwbWJhc2UgPT0gMCkKKwl7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJwb3dlciBtYW5hZ2VtZW50IGJhc2Ugbm90IHNldFxuIik7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgJnJuZW4pOworCXJuZW4gfD0gKDEgPDwgNyk7CS8qIFJORyBvbiAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDAsIHJuZW4pOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQxLCAmcm5lbik7CisJcm5lbiB8PSAoMSA8PCA3KTsJLyogUE1JTyBlbmFibGUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQxLCBybmVuKTsKKworCXByX2luZm8oIFBGWCAiQU1ENzY4IHN5c3RlbSBtYW5hZ2VtZW50IEkvTyByZWdpc3RlcnMgYXQgMHglWC5cbiIsCisJCQlwbWJhc2UpOworCisJYW1kX2RldiA9IGRldjsKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYW1kX2NsZWFudXAodm9pZCkKK3sKKwl1OCBybmVuOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYW1kX2RldiwgMHg0MCwgJnJuZW4pOworCXJuZW4gJj0gfigxIDw8IDcpOwkvKiBSTkcgb2ZmICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFtZF9kZXYsIDB4NDAsIHJuZW4pOworCisJLyogRklYTUU6IHR3aWRkbGUgcG1pbywgYWxzbz8gKi8KK30KKworI2lmZGVmIF9faTM4Nl9fCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBWSUEgUk5HIG9wZXJhdGlvbnMKKyAqCisgKi8KKworZW51bSB7CisJVklBX1NUUkZJTFRfQ05UX1NISUZUCT0gMTYsCisJVklBX1NUUkZJTFRfRkFJTAk9ICgxIDw8IDE1KSwKKwlWSUFfU1RSRklMVF9FTkFCTEUJPSAoMSA8PCAxNCksCisJVklBX1JBV0JJVFNfRU5BQkxFCT0gKDEgPDwgMTMpLAorCVZJQV9STkdfRU5BQkxFCQk9ICgxIDw8IDYpLAorCVZJQV9YU1RPUkVfQ05UX01BU0sJPSAweDBGLAorCisJVklBX1JOR19DSFVOS184CQk9IDB4MDAsCS8qIDY0IHJhbmQgYml0cywgNjQgc3RvcmVkIGJpdHMgKi8KKwlWSUFfUk5HX0NIVU5LXzQJCT0gMHgwMSwJLyogMzIgcmFuZCBiaXRzLCAzMiBzdG9yZWQgYml0cyAqLworCVZJQV9STkdfQ0hVTktfNF9NQVNLCT0gMHhGRkZGRkZGRiwKKwlWSUFfUk5HX0NIVU5LXzIJCT0gMHgwMiwJLyogMTYgcmFuZCBiaXRzLCAzMiBzdG9yZWQgYml0cyAqLworCVZJQV9STkdfQ0hVTktfMl9NQVNLCT0gMHhGRkZGLAorCVZJQV9STkdfQ0hVTktfMQkJPSAweDAzLAkvKiA4IHJhbmQgYml0cywgMzIgc3RvcmVkIGJpdHMgKi8KKwlWSUFfUk5HX0NIVU5LXzFfTUFTSwk9IDB4RkYsCit9OworCitzdGF0aWMgdTMyIHZpYV9ybmdfZGF0dW07CisKKy8qCisgKiBJbnZlc3RpZ2F0ZSB1c2luZyB0aGUgJ3JlcCcgcHJlZml4IHRvIG9idGFpbiAzMiBiaXRzIG9mIHJhbmRvbSBkYXRhCisgKiBpbiBvbmUgaW5zbi4gIFRoZSB1cHNpZGUgaXMgcG90ZW50aWFsbHkgYmV0dGVyIHBlcmZvcm1hbmNlLiAgVGhlCisgKiBkb3duc2lkZSBpcyB0aGF0IHRoZSBpbnN0cnVjdGlvbiBiZWNvbWVzIG5vIGxvbmdlciBhdG9taWMuICBEdWUgdG8KKyAqIHRoaXMsIGp1c3QgbGlrZSBmYW1pbGlhciBpc3N1ZXMgd2l0aCAvZGV2L3JhbmRvbSBpdHNlbGYsIHRoZSB3b3JzdAorICogY2FzZSBvZiBhICdyZXAgeHN0b3JlJyBjb3VsZCBwb3RlbnRpYWxseSBwYXVzZSBhIGNwdSBmb3IgYW4KKyAqIHVucmVhc29uYWJseSBsb25nIHRpbWUuICBJbiBwcmFjdGljZSwgdGhpcyBjb25kaXRpb24gd291bGQgbGlrZWx5CisgKiBvbmx5IG9jY3VyIHdoZW4gdGhlIGhhcmR3YXJlIGlzIGZhaWxpbmcuICAob3Igc28gd2UgaG9wZSA6KSkKKyAqCisgKiBBbm90aGVyIHBvc3NpYmxlIHBlcmZvcm1hbmNlIGJvb3N0IG1heSBjb21lIGZyb20gc2ltcGx5IGJ1ZmZlcmluZworICogdW50aWwgd2UgaGF2ZSA0IGJ5dGVzLCB0aHVzIHJldHVybmluZyBhIHUzMiBhdCBhIHRpbWUsCisgKiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHU4LWF0LWEtdGltZS4KKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiB4c3RvcmUodTMyICphZGRyLCB1MzIgZWR4X2luKQoreworCXUzMiBlYXhfb3V0OworCisJYXNtKCIuYnl0ZSAweDBGLDB4QTcsMHhDMCAvKiB4c3RvcmUgJSVlZGkgKGFkZHI9JTApICovIgorCQk6Ij1tIigqYWRkciksICI9YSIoZWF4X291dCkKKwkJOiJEIihhZGRyKSwgImQiKGVkeF9pbikpOworCisJcmV0dXJuIGVheF9vdXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlhX2RhdGFfcHJlc2VudCh2b2lkKQoreworCXUzMiBieXRlc19vdXQ7CisKKwkvKiBXZSBjaG9vc2UgdGhlIHJlY29tbWVuZGVkIDEtYnl0ZS1wZXItaW5zdHJ1Y3Rpb24gUk5HIHJhdGUsCisJICogZm9yIGdyZWF0ZXIgcmFuZG9tbmVzcyBhdCB0aGUgZXhwZW5zZSBvZiBzcGVlZC4gIExhcmdlcgorCSAqIHZhbHVlcyAyLCA0LCBvciA4IGJ5dGVzLXBlci1pbnN0cnVjdGlvbiB5aWVsZCBncmVhdGVyCisJICogc3BlZWQgYXQgbGVzc2VyIHJhbmRvbW5lc3MuCisJICoKKwkgKiBJZiB5b3UgY2hhbmdlIHRoaXMgdG8gYW5vdGhlciBWSUFfQ0hVTktfbiwgeW91IG11c3QgYWxzbworCSAqIGNoYW5nZSB0aGUgLT5uX2J5dGVzIHZhbHVlcyBpbiBybmdfdmVuZG9yX29wc1tdIHRhYmxlcy4KKwkgKiBWSUFfQ0hVTktfOCByZXF1aXJlcyBmdXJ0aGVyIGNvZGUgY2hhbmdlcy4KKwkgKgorCSAqIEEgY29weSBvZiBNU1JfVklBX1JORyBpcyBwbGFjZWQgaW4gZWF4X291dCB3aGVuIHhzdG9yZQorCSAqIGNvbXBsZXRlcy4KKwkgKi8KKwl2aWFfcm5nX2RhdHVtID0gMDsgLyogcGFyYW5vaWEsIG5vdCByZWFsbHkgbmVjZXNzYXJ5ICovCisJYnl0ZXNfb3V0ID0geHN0b3JlKCZ2aWFfcm5nX2RhdHVtLCBWSUFfUk5HX0NIVU5LXzEpICYgVklBX1hTVE9SRV9DTlRfTUFTSzsKKwlpZiAoYnl0ZXNfb3V0ID09IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1MzIgdmlhX2RhdGFfcmVhZCh2b2lkKQoreworCXJldHVybiB2aWFfcm5nX2RhdHVtOworfQorCitzdGF0aWMgaW50IF9faW5pdCB2aWFfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUzMiBsbywgaGksIG9sZF9sbzsKKworCS8qIENvbnRyb2wgdGhlIFJORyB2aWEgTVNSLiAgVHJlYWQgbGlnaHRseSBhbmQgcGF5IHZlcnkgY2xvc2UKKwkgKiBjbG9zZSBhdHRlbnRpb24gdG8gdmFsdWVzIHdyaXR0ZW4sIGFzIHRoZSByZXNlcnZlZCBmaWVsZHMKKwkgKiBhcmUgZG9jdW1lbnRlZCB0byBiZSAidW5kZWZpbmVkIGFuZCB1bnByZWRpY3RhYmxlIjsgYnV0IGl0CisJICogZG9lcyBub3Qgc2F5IHRvIHdyaXRlIHRoZW0gYXMgemVybywgc28gSSBtYWtlIGEgZ3Vlc3MgdGhhdAorCSAqIHdlIHJlc3RvcmUgdGhlIHZhbHVlcyB3ZSBmaW5kIGluIHRoZSByZWdpc3Rlci4KKwkgKi8KKwlyZG1zcihNU1JfVklBX1JORywgbG8sIGhpKTsKKworCW9sZF9sbyA9IGxvOworCWxvICY9IH4oMHg3ZiA8PCBWSUFfU1RSRklMVF9DTlRfU0hJRlQpOworCWxvICY9IH5WSUFfWFNUT1JFX0NOVF9NQVNLOworCWxvICY9IH4oVklBX1NUUkZJTFRfRU5BQkxFIHwgVklBX1NUUkZJTFRfRkFJTCB8IFZJQV9SQVdCSVRTX0VOQUJMRSk7CisJbG8gfD0gVklBX1JOR19FTkFCTEU7CisKKwlpZiAobG8gIT0gb2xkX2xvKQorCQl3cm1zcihNU1JfVklBX1JORywgbG8sIGhpKTsKKworCS8qIHBlcmhhcHMtdW5uZWNlc3Nhcnkgc2FuaXR5IGNoZWNrOyByZW1vdmUgYWZ0ZXIgdGVzdGluZyBpZgorCSAgIHVubmVlZGVkICovCisJcmRtc3IoTVNSX1ZJQV9STkcsIGxvLCBoaSk7CisJaWYgKChsbyAmIFZJQV9STkdfRU5BQkxFKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCBlbmFibGUgVklBIEMzIFJORywgYWJvcnRpbmdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmlhX2NsZWFudXAodm9pZCkKK3sKKwkvKiBkbyBub3RoaW5nICovCit9CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAvZGV2L2h3cmFuZG9tIGNoYXJhY3RlciBkZXZpY2UgaGFuZGxpbmcgKG1ham9yIDEwLCBtaW5vciAxODMpCisgKgorICovCisKK3N0YXRpYyBpbnQgcm5nX2Rldl9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwkvKiBlbmZvcmNlIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhpcyBjaHJkZXYgKi8KKwlpZiAoKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3NpemVfdCBybmdfZGV2X3JlYWQgKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSwKKwkJCQlsb2ZmX3QgKiBvZmZwKQoreworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socm5nX2xvY2spOworCXVuc2lnbmVkIGludCBoYXZlX2RhdGE7CisJdTMyIGRhdGEgPSAwOworCXNzaXplX3QgcmV0ID0gMDsKKworCXdoaWxlIChzaXplKSB7CisJCXNwaW5fbG9jaygmcm5nX2xvY2spOworCisJCWhhdmVfZGF0YSA9IDA7CisJCWlmIChybmdfb3BzLT5kYXRhX3ByZXNlbnQoKSkgeworCQkJZGF0YSA9IHJuZ19vcHMtPmRhdGFfcmVhZCgpOworCQkJaGF2ZV9kYXRhID0gcm5nX29wcy0+bl9ieXRlczsKKwkJfQorCisJCXNwaW5fdW5sb2NrICgmcm5nX2xvY2spOworCisJCXdoaWxlIChoYXZlX2RhdGEgJiYgc2l6ZSkgeworCQkJaWYgKHB1dF91c2VyKCh1OClkYXRhLCBidWYrKykpIHsKKwkJCQlyZXQgPSByZXQgPyA6IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzaXplLS07CisJCQlyZXQrKzsKKwkJCWhhdmVfZGF0YS0tOworCQkJZGF0YT4+PTg7CisJCX0KKworCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlyZXR1cm4gcmV0ID8gOiAtRUFHQUlOOworCisJCWlmKG5lZWRfcmVzY2hlZCgpKQorCQl7CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0KKwkJZWxzZQorCQkJdWRlbGF5KDIwMCk7CS8qIEZJWE1FOiBXZSBjb3VsZCBwb2xsIGZvciAyNTB1UyA/PyAqLworCisJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpCisJCQlyZXR1cm4gcmV0ID8gOiAtRVJFU1RBUlRTWVM7CisJfQorCXJldHVybiByZXQ7Cit9CisKKworCisvKgorICogcm5nX2luaXRfb25lIC0gbG9vayBmb3IgYW5kIGF0dGVtcHQgdG8gaW5pdCBhIHNpbmdsZSBSTkcKKyAqLworc3RhdGljIGludCBfX2luaXQgcm5nX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCByYzsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQocm5nX29wcyAhPSBOVUxMKTsKKworCXJjID0gcm5nX29wcy0+aW5pdChkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJcmMgPSBtaXNjX3JlZ2lzdGVyICgmcm5nX21pc2NkZXYpOworCWlmIChyYykgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAibWlzYyBkZXZpY2UgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfb3V0X2NsZWFudXBfaHc7CisJfQorCisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAwXG4iKTsKKwlyZXR1cm4gMDsKKworZXJyX291dF9jbGVhbnVwX2h3OgorCXJuZ19vcHMtPmNsZWFudXAoKTsKK2Vycl9vdXQ6CisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworCisKK01PRFVMRV9BVVRIT1IoIlRoZSBMaW51eCBLZXJuZWwgdGVhbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIL1cgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKFJORykgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworLyoKKyAqIHJuZ19pbml0IC0gaW5pdGlhbGl6ZSBSTkcgbW9kdWxlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHJuZ19pbml0ICh2b2lkKQoreworCWludCByYzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudDsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwkvKiBQcm9iZSBmb3IgSW50ZWwsIEFNRCBSTkdzICovCisJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCWVudCA9IHBjaV9tYXRjaF9kZXZpY2UgKHJuZ19wY2lfdGJsLCBwZGV2KTsKKwkJaWYgKGVudCkgeworCQkJcm5nX29wcyA9ICZybmdfdmVuZG9yX29wc1tlbnQtPmRyaXZlcl9kYXRhXTsKKwkJCWdvdG8gbWF0Y2g7CisJCX0KKwl9CisKKyNpZmRlZiBfX2kzODZfXworCS8qIFByb2JlIGZvciBWSUEgUk5HICovCisJaWYgKGNwdV9oYXNfeHN0b3JlKSB7CisJCXJuZ19vcHMgPSAmcm5nX3ZlbmRvcl9vcHNbcm5nX2h3X3ZpYV07CisJCXBkZXYgPSBOVUxMOworCQlnb3RvIG1hdGNoOworCX0KKyNlbmRpZgorCisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAtRU5PREVWXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworbWF0Y2g6CisJcmMgPSBybmdfaW5pdF9vbmUgKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcHJfaW5mbyggUk5HX0RSSVZFUl9OQU1FICIgbG9hZGVkXG4iKTsKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHJuZ19pbml0IC0gc2h1dGRvd24gUk5HIG1vZHVsZQorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgcm5nX2NsZWFudXAgKHZvaWQpCit7CisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCW1pc2NfZGVyZWdpc3RlciAoJnJuZ19taXNjZGV2KTsKKworCWlmIChybmdfb3BzLT5jbGVhbnVwKQorCQlybmdfb3BzLT5jbGVhbnVwKCk7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKworbW9kdWxlX2luaXQgKHJuZ19pbml0KTsKK21vZHVsZV9leGl0IChybmdfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaThrLmMgYi9kcml2ZXJzL2NoYXIvaThrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxMTk3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pOGsuYwpAQCAtMCwwICsxLDc4OCBAQAorLyoKKyAqIGk4ay5jIC0tIExpbnV4IGRyaXZlciBmb3IgYWNjZXNzaW5nIHRoZSBTTU0gQklPUyBvbiBEZWxsIGxhcHRvcHMuCisgKgkgICAgU2VlIGh0dHA6Ly93d3cuZGViaWFuLm9yZy9+ZHovaThrLyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICoJICAgIGFuZCBmb3IgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBNYXNzaW1vIERhbCBab3R0byA8ZHpAZGViaWFuLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hcG1fYmlvcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pOGsuaD4KKworI2RlZmluZSBJOEtfVkVSU0lPTgkJIjEuMTMgMTQvMDUvMjAwMiIKKworI2RlZmluZSBJOEtfU01NX0ZOX1NUQVRVUwkweDAwMjUKKyNkZWZpbmUgSThLX1NNTV9QT1dFUl9TVEFUVVMJMHgwMDY5CisjZGVmaW5lIEk4S19TTU1fU0VUX0ZBTgkJMHgwMWEzCisjZGVmaW5lIEk4S19TTU1fR0VUX0ZBTgkJMHgwMGEzCisjZGVmaW5lIEk4S19TTU1fR0VUX1NQRUVECTB4MDJhMworI2RlZmluZSBJOEtfU01NX0dFVF9URU1QCTB4MTBhMworI2RlZmluZSBJOEtfU01NX0dFVF9ERUxMX1NJRwkweGZmYTMKKyNkZWZpbmUgSThLX1NNTV9CSU9TX1ZFUlNJT04JMHgwMGE2CisKKyNkZWZpbmUgSThLX0ZBTl9NVUxUCQkzMAorI2RlZmluZSBJOEtfTUFYX1RFTVAJCTEyNworCisjZGVmaW5lIEk4S19GTl9OT05FCQkweDAwCisjZGVmaW5lIEk4S19GTl9VUAkJMHgwMQorI2RlZmluZSBJOEtfRk5fRE9XTgkJMHgwMgorI2RlZmluZSBJOEtfRk5fTVVURQkJMHgwNAorI2RlZmluZSBJOEtfRk5fTUFTSwkJMHgwNworI2RlZmluZSBJOEtfRk5fU0hJRlQJCTgKKworI2RlZmluZSBJOEtfUE9XRVJfQUMJCTB4MDUKKyNkZWZpbmUgSThLX1BPV0VSX0JBVFRFUlkJMHgwMQorCisjZGVmaW5lIEk4S19URU1QRVJBVFVSRV9CVUcJMQorCisjZGVmaW5lIERFTExfU0lHTkFUVVJFCQkiRGVsbCBDb21wdXRlciIKKworc3RhdGljIGNoYXIgKnN1cHBvcnRlZF9tb2RlbHNbXSA9IHsKKyAgICAiSW5zcGlyb24iLAorICAgICJMYXRpdHVkZSIsCisgICAgTlVMTAorfTsKKworc3RhdGljIGNoYXIgc3lzdGVtX3ZlbmRvcls0OF0gPSAiPyI7CitzdGF0aWMgY2hhciBwcm9kdWN0X25hbWUgWzQ4XSA9ICI/IjsKK3N0YXRpYyBjaGFyIGJpb3NfdmVyc2lvbiBbNF0gID0gIj8iOworc3RhdGljIGNoYXIgc2VyaWFsX251bWJlclsxNl0gPSAiPyI7CisKK01PRFVMRV9BVVRIT1IoIk1hc3NpbW8gRGFsIFpvdHRvIChkekBkZWJpYW4ub3JnKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIGFjY2Vzc2luZyBTTU0gQklPUyBvbiBEZWxsIGxhcHRvcHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBmb3JjZTsKK21vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiRm9yY2UgbG9hZGluZyB3aXRob3V0IGNoZWNraW5nIGZvciBzdXBwb3J0ZWQgbW9kZWxzIik7CisKK3N0YXRpYyBpbnQgcmVzdHJpY3RlZDsKK21vZHVsZV9wYXJhbShyZXN0cmljdGVkLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVzdHJpY3RlZCwgIkFsbG93IGZhbiBjb250cm9sIGlmIFNZU19BRE1JTiBjYXBhYmlsaXR5IHNldCIpOworCitzdGF0aWMgaW50IHBvd2VyX3N0YXR1czsKK21vZHVsZV9wYXJhbShwb3dlcl9zdGF0dXMsIGJvb2wsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9zdGF0dXMsICJSZXBvcnQgcG93ZXIgc3RhdHVzIGluIC9wcm9jL2k4ayIpOworCitzdGF0aWMgc3NpemVfdCBpOGtfcmVhZChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3N0YXRpYyBpbnQgaThrX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsCisJCSAgICAgdW5zaWduZWQgbG9uZyk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGk4a19mb3BzID0geworICAgIC5yZWFkCT0gaThrX3JlYWQsCisgICAgLmlvY3RsCT0gaThrX2lvY3RsLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBlYXg7CisgICAgdW5zaWduZWQgaW50IGVieCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisgICAgdW5zaWduZWQgaW50IGVjeCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisgICAgdW5zaWduZWQgaW50IGVkeCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisgICAgdW5zaWduZWQgaW50IGVzaSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisgICAgdW5zaWduZWQgaW50IGVkaSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IFNNTVJlZ2lzdGVyczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHU4CXR5cGU7CisgICAgdTgJbGVuZ3RoOworICAgIHUxNgloYW5kbGU7Cit9IERNSUhlYWRlcjsKKworLyoKKyAqIENhbGwgdGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUgQklPUy4gQ29kZSBwcm92aWRlZCBieSBKb25hdGhhbiBCdXp6YXJkLgorICovCitzdGF0aWMgaW50IGk4a19zbW0oU01NUmVnaXN0ZXJzICpyZWdzKQoreworICAgIGludCByYzsKKyAgICBpbnQgZWF4ID0gcmVncy0+ZWF4OworCisgICAgYXNtKCJwdXNobCAlJWVheFxuXHQiIFwKKwkibW92bCAwKCUlZWF4KSwlJWVkeFxuXHQiIFwKKwkicHVzaCAlJWVkeFxuXHQiIFwKKwkibW92bCA0KCUlZWF4KSwlJWVieFxuXHQiIFwKKwkibW92bCA4KCUlZWF4KSwlJWVjeFxuXHQiIFwKKwkibW92bCAxMiglJWVheCksJSVlZHhcblx0IiBcCisJIm1vdmwgMTYoJSVlYXgpLCUlZXNpXG5cdCIgXAorCSJtb3ZsIDIwKCUlZWF4KSwlJWVkaVxuXHQiIFwKKwkicG9wbCAlJWVheFxuXHQiIFwKKwkib3V0ICUlYWwsJDB4YjJcblx0IiBcCisJIm91dCAlJWFsLCQweDg0XG5cdCIgXAorCSJ4Y2hnbCAlJWVheCwoJSVlc3ApXG5cdCIKKwkibW92bCAlJWVieCw0KCUlZWF4KVxuXHQiIFwKKwkibW92bCAlJWVjeCw4KCUlZWF4KVxuXHQiIFwKKwkibW92bCAlJWVkeCwxMiglJWVheClcblx0IiBcCisJIm1vdmwgJSVlc2ksMTYoJSVlYXgpXG5cdCIgXAorCSJtb3ZsICUlZWRpLDIwKCUlZWF4KVxuXHQiIFwKKwkicG9wbCAlJWVkeFxuXHQiIFwKKwkibW92bCAlJWVkeCwwKCUlZWF4KVxuXHQiIFwKKwkibGFoZlxuXHQiIFwKKwkic2hybCAkOCwlJWVheFxuXHQiIFwKKwkiYW5kbCAkMSwlJWVheFxuIiBcCisJOiAiPWEiIChyYykKKwk6ICJhIiAocmVncykKKwk6ICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIsICIlZXNpIiwgIiVlZGkiLCAibWVtb3J5Iik7CisKKyAgICBpZiAoKHJjICE9IDApIHx8ICgocmVncy0+ZWF4ICYgMHhmZmZmKSA9PSAweGZmZmYpIHx8IChyZWdzLT5lYXggPT0gZWF4KSkgeworCXJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogUmVhZCB0aGUgYmlvcyB2ZXJzaW9uLiBSZXR1cm4gdGhlIHZlcnNpb24gYXMgYW4gaW50ZWdlciBjb3JyZXNwb25kaW5nCisgKiB0byB0aGUgYXNjaWkgdmFsdWUsIGZvciBleGFtcGxlICJBMTciIGlzIHJldHVybmVkIGFzIDB4MDA0MTMxMzcuCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9iaW9zX3ZlcnNpb24odm9pZCkKK3sKKyAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIGludCByYzsKKworICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9CSU9TX1ZFUlNJT047CisgICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7CisJcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiByZWdzLmVheDsKK30KKworLyoKKyAqIFJlYWQgdGhlIG1hY2hpbmUgaWQuCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9zZXJpYWxfbnVtYmVyKHVuc2lnbmVkIGNoYXIgKmJ1ZmYpCit7CisgICAgc3RybGNweShidWZmLCBzZXJpYWxfbnVtYmVyLCBzaXplb2Yoc2VyaWFsX251bWJlcikpOworICAgIHJldHVybiAwOworfQorCisvKgorICogUmVhZCB0aGUgRm4ga2V5IHN0YXR1cy4KKyAqLworc3RhdGljIGludCBpOGtfZ2V0X2ZuX3N0YXR1cyh2b2lkKQoreworICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgICAgaW50IHJjOworCisgICAgcmVncy5lYXggPSBJOEtfU01NX0ZOX1NUQVRVUzsKKyAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKKwlyZXR1cm4gcmM7CisgICAgfQorCisgICAgc3dpdGNoICgocmVncy5lYXggPj4gSThLX0ZOX1NISUZUKSAmIEk4S19GTl9NQVNLKSB7CisgICAgY2FzZSBJOEtfRk5fVVA6CisJcmV0dXJuIEk4S19WT0xfVVA7CisgICAgY2FzZSBJOEtfRk5fRE9XTjoKKwlyZXR1cm4gSThLX1ZPTF9ET1dOOworICAgIGNhc2UgSThLX0ZOX01VVEU6CisJcmV0dXJuIEk4S19WT0xfTVVURTsKKyAgICBkZWZhdWx0OgorCXJldHVybiAwOworICAgIH0KK30KKworLyoKKyAqIFJlYWQgdGhlIHBvd2VyIHN0YXR1cy4KKyAqLworc3RhdGljIGludCBpOGtfZ2V0X3Bvd2VyX3N0YXR1cyh2b2lkKQoreworICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgICAgaW50IHJjOworCisgICAgcmVncy5lYXggPSBJOEtfU01NX1BPV0VSX1NUQVRVUzsKKyAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKKwlyZXR1cm4gcmM7CisgICAgfQorCisgICAgc3dpdGNoIChyZWdzLmVheCAmIDB4ZmYpIHsKKyAgICBjYXNlIEk4S19QT1dFUl9BQzoKKwlyZXR1cm4gSThLX0FDOworICAgIGRlZmF1bHQ6CisJcmV0dXJuIEk4S19CQVRURVJZOworICAgIH0KK30KKworLyoKKyAqIFJlYWQgdGhlIGZhbiBzdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9mYW5fc3RhdHVzKGludCBmYW4pCit7CisgICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgcmM7CisKKyAgICByZWdzLmVheCA9IEk4S19TTU1fR0VUX0ZBTjsKKyAgICByZWdzLmVieCA9IGZhbiAmIDB4ZmY7CisgICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7CisJcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiAocmVncy5lYXggJiAweGZmKTsKK30KKworLyoKKyAqIFJlYWQgdGhlIGZhbiBzcGVlZCBpbiBSUE0uCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9mYW5fc3BlZWQoaW50IGZhbikKK3sKKyAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIGludCByYzsKKworICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9HRVRfU1BFRUQ7CisgICAgcmVncy5lYnggPSBmYW4gJiAweGZmOworICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgeworCXJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gKHJlZ3MuZWF4ICYgMHhmZmZmKSAqIEk4S19GQU5fTVVMVDsKK30KKworLyoKKyAqIFNldCB0aGUgZmFuIHNwZWVkIChvZmYsIGxvdywgaGlnaCkuIFJldHVybnMgdGhlIG5ldyBmYW4gc3RhdHVzLgorICovCitzdGF0aWMgaW50IGk4a19zZXRfZmFuKGludCBmYW4sIGludCBzcGVlZCkKK3sKKyAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIGludCByYzsKKworICAgIHNwZWVkID0gKHNwZWVkIDwgMCkgPyAwIDogKChzcGVlZCA+IEk4S19GQU5fTUFYKSA/IEk4S19GQU5fTUFYIDogc3BlZWQpOworCisgICAgcmVncy5lYXggPSBJOEtfU01NX1NFVF9GQU47CisgICAgcmVncy5lYnggPSAoZmFuICYgMHhmZikgfCAoc3BlZWQgPDwgOCk7CisgICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7CisJcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiAoaThrX2dldF9mYW5fc3RhdHVzKGZhbikpOworfQorCisvKgorICogUmVhZCB0aGUgY3B1IHRlbXBlcmF0dXJlLgorICovCitzdGF0aWMgaW50IGk4a19nZXRfY3B1X3RlbXAodm9pZCkKK3sKKyAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIGludCByYzsKKyAgICBpbnQgdGVtcDsKKworI2lmZGVmIEk4S19URU1QRVJBVFVSRV9CVUcKKyAgICBzdGF0aWMgaW50IHByZXYgPSAwOworI2VuZGlmCisKKyAgICByZWdzLmVheCA9IEk4S19TTU1fR0VUX1RFTVA7CisgICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7CisJcmV0dXJuIHJjOworICAgIH0KKyAgICB0ZW1wID0gcmVncy5lYXggJiAweGZmOworCisjaWZkZWYgSThLX1RFTVBFUkFUVVJFX0JVRworICAgIC8qCisgICAgICogU29tZXRpbWVzIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmV0dXJucyAweDk5LCB3aGljaCBpcyBvdXQgb2YgcmFuZ2UuCisgICAgICogSW4gdGhpcyBjYXNlIHdlIHJldHVybiAob25jZSkgdGhlIHByZXZpb3VzIGNhY2hlZCB2YWx1ZS4gRm9yIGV4YW1wbGU6CisgICAgICMgMTAwMzY1NTEzNyAwMDAwMDA1OCAwMDAwNWE0YgorICAgICAjIDEwMDM2NTUxMzggMDAwMDAwOTkgMDAwMDNhODAgPC0tLSAweDk5ID0gMTUzIGRlZ3JlZXMKKyAgICAgIyAxMDAzNjU1MTM5IDAwMDAwMDU0IDAwMDA1YzUyCisgICAgICovCisgICAgaWYgKHRlbXAgPiBJOEtfTUFYX1RFTVApIHsKKwl0ZW1wID0gcHJldjsKKwlwcmV2ID0gSThLX01BWF9URU1QOworICAgIH0gZWxzZSB7CisJcHJldiA9IHRlbXA7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gdGVtcDsKK30KKworc3RhdGljIGludCBpOGtfZ2V0X2RlbGxfc2lnbmF0dXJlKHZvaWQpCit7CisgICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgcmM7CisKKyAgICByZWdzLmVheCA9IEk4S19TTU1fR0VUX0RFTExfU0lHOworICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgeworCXJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAoKHJlZ3MuZWF4ID09IDExNDU2NTE1MjcpICYmIChyZWdzLmVkeCA9PSAxMTQ1MzkyMjA0KSkgeworCXJldHVybiAwOworICAgIH0gZWxzZSB7CisJcmV0dXJuIC0xOworICAgIH0KK30KKworc3RhdGljIGludCBpOGtfaW9jdGwoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgIGludCB2YWw7CisgICAgaW50IHNwZWVkOworICAgIHVuc2lnbmVkIGNoYXIgYnVmZlsxNl07CisgICAgaW50IF9fdXNlciAqYXJncCA9IChpbnQgX191c2VyICopYXJnOworCisgICAgaWYgKCFhcmdwKQorCXJldHVybiAtRUlOVkFMOworCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIEk4S19CSU9TX1ZFUlNJT046CisJdmFsID0gaThrX2dldF9iaW9zX3ZlcnNpb24oKTsKKwlicmVhazsKKworICAgIGNhc2UgSThLX01BQ0hJTkVfSUQ6CisJbWVtc2V0KGJ1ZmYsIDAsIDE2KTsKKwl2YWwgPSBpOGtfZ2V0X3NlcmlhbF9udW1iZXIoYnVmZik7CisJYnJlYWs7CisKKyAgICBjYXNlIEk4S19GTl9TVEFUVVM6CisJdmFsID0gaThrX2dldF9mbl9zdGF0dXMoKTsKKwlicmVhazsKKworICAgIGNhc2UgSThLX1BPV0VSX1NUQVRVUzoKKwl2YWwgPSBpOGtfZ2V0X3Bvd2VyX3N0YXR1cygpOworCWJyZWFrOworCisgICAgY2FzZSBJOEtfR0VUX1RFTVA6CisJdmFsID0gaThrX2dldF9jcHVfdGVtcCgpOworCWJyZWFrOworCisgICAgY2FzZSBJOEtfR0VUX1NQRUVEOgorCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkpIHsKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisJfQorCXZhbCA9IGk4a19nZXRfZmFuX3NwZWVkKHZhbCk7CisJYnJlYWs7CisKKyAgICBjYXNlIEk4S19HRVRfRkFOOgorCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkpIHsKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisJfQorCXZhbCA9IGk4a19nZXRfZmFuX3N0YXR1cyh2YWwpOworCWJyZWFrOworCisgICAgY2FzZSBJOEtfU0VUX0ZBTjoKKwlpZiAocmVzdHJpY3RlZCAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCSAgICByZXR1cm4gLUVQRVJNOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpKSB7CisJICAgIHJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJnNwZWVkLCBhcmdwKzEsIHNpemVvZihpbnQpKSkgeworCSAgICByZXR1cm4gLUVGQVVMVDsKKwl9CisJdmFsID0gaThrX3NldF9mYW4odmFsLCBzcGVlZCk7CisJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCXJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmICh2YWwgPCAwKSB7CisJcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgSThLX0JJT1NfVkVSU0lPTjoKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwsIDQpKSB7CisJICAgIHJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKKyAgICBjYXNlIEk4S19NQUNISU5FX0lEOgorCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgYnVmZiwgMTYpKSB7CisJICAgIHJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbCwgc2l6ZW9mKGludCkpKSB7CisJICAgIHJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFByaW50IHRoZSBpbmZvcm1hdGlvbiBmb3IgL3Byb2MvaThrLgorICovCitzdGF0aWMgaW50IGk4a19nZXRfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3QgZnBvcywgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgbiwgZm5fa2V5LCBjcHVfdGVtcCwgYWNfcG93ZXI7CisgICAgaW50IGxlZnRfZmFuLCByaWdodF9mYW4sIGxlZnRfc3BlZWQsIHJpZ2h0X3NwZWVkOworCisgICAgY3B1X3RlbXAgICAgID0gaThrX2dldF9jcHVfdGVtcCgpOwkJCS8qIDExMTAwILVzICovCisgICAgbGVmdF9mYW4gICAgID0gaThrX2dldF9mYW5fc3RhdHVzKEk4S19GQU5fTEVGVCk7CS8qICAgNTgwILVzICovCisgICAgcmlnaHRfZmFuICAgID0gaThrX2dldF9mYW5fc3RhdHVzKEk4S19GQU5fUklHSFQpOwkvKiAgIDU4MCC1cyAqLworICAgIGxlZnRfc3BlZWQgICA9IGk4a19nZXRfZmFuX3NwZWVkKEk4S19GQU5fTEVGVCk7CS8qICAgNTgwILVzICovCisgICAgcmlnaHRfc3BlZWQgID0gaThrX2dldF9mYW5fc3BlZWQoSThLX0ZBTl9SSUdIVCk7CS8qICAgNTgwILVzICovCisgICAgZm5fa2V5ICAgICAgID0gaThrX2dldF9mbl9zdGF0dXMoKTsJCQkvKiAgIDc1MCC1cyAqLworICAgIGlmIChwb3dlcl9zdGF0dXMpIHsKKwlhY19wb3dlciA9IGk4a19nZXRfcG93ZXJfc3RhdHVzKCk7CQkvKiAxNDcwMCC1cyAqLworICAgIH0gZWxzZSB7CisJYWNfcG93ZXIgPSAtMTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEluZm86CisgICAgICoKKyAgICAgKiAxKSAgRm9ybWF0IHZlcnNpb24gKHRoaXMgd2lsbCBjaGFuZ2UgaWYgZm9ybWF0IGNoYW5nZXMpCisgICAgICogMikgIEJJT1MgdmVyc2lvbgorICAgICAqIDMpICBCSU9TIG1hY2hpbmUgSUQKKyAgICAgKiA0KSAgQ3B1IHRlbXBlcmF0dXJlCisgICAgICogNSkgIExlZnQgZmFuIHN0YXR1cworICAgICAqIDYpICBSaWdodCBmYW4gc3RhdHVzCisgICAgICogNykgIExlZnQgZmFuIHNwZWVkCisgICAgICogOCkgIFJpZ2h0IGZhbiBzcGVlZAorICAgICAqIDkpICBBQyBwb3dlcgorICAgICAqIDEwKSBGbiBLZXkgc3RhdHVzCisgICAgICovCisgICAgbiA9IHNwcmludGYoYnVmZmVyLCAiJXMgJXMgJXMgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCisJCUk4S19QUk9DX0ZNVCwKKwkJYmlvc192ZXJzaW9uLAorCQlzZXJpYWxfbnVtYmVyLAorCQljcHVfdGVtcCwKKwkJbGVmdF9mYW4sCisJCXJpZ2h0X2ZhbiwKKwkJbGVmdF9zcGVlZCwKKwkJcmlnaHRfc3BlZWQsCisJCWFjX3Bvd2VyLAorCQlmbl9rZXkpOworCisgICAgcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGk4a19yZWFkKHN0cnVjdCBmaWxlICpmLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgbGVuLCBsb2ZmX3QgKmZwb3MpCit7CisgICAgaW50IG47CisgICAgY2hhciBpbmZvWzEyOF07CisKKyAgICBuID0gaThrX2dldF9pbmZvKGluZm8sIE5VTEwsIDAsIDEyOCk7CisgICAgaWYgKG4gPD0gMCkgeworCXJldHVybiBuOworICAgIH0KKworICAgIGlmICgqZnBvcyA+PSBuKSB7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCgqZnBvcyArIGxlbikgPj0gbikgeworCWxlbiA9IG4gLSAqZnBvczsKKyAgICB9CisKKyAgICBpZiAoY29weV90b191c2VyKGJ1ZmZlciwgaW5mbywgbGVuKSAhPSAwKSB7CisJcmV0dXJuIC1FRkFVTFQ7CisgICAgfQorCisgICAgKmZwb3MgKz0gbGVuOworICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBjaGFyKiBfX2luaXQgc3RyaW5nX3RyaW0oY2hhciAqcywgaW50IHNpemUpCit7CisgICAgaW50IGxlbjsKKyAgICBjaGFyICpwOworCisgICAgaWYgKChsZW4gPSBzdHJsZW4ocykpID4gc2l6ZSkgeworCWxlbiA9IHNpemU7CisgICAgfQorCisgICAgZm9yIChwPXMrbGVuLTE7IGxlbiAmJiAoKnA9PScgJyk7IGxlbi0tLHAtLSkgeworCSpwID0gJ1wwJzsKKyAgICB9CisKKyAgICByZXR1cm4gczsKK30KKworLyogRE1JIGNvZGUsIHN0b2xlbiBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvZG1pX3NjYW4uYyAqLworCisvKgorICogfDwtLSBkbWktPmxlbmd0aCAtLT58CisgKiB8ICAgICAgICAgICAgICAgICAgIHwKKyAqIHxkbWkgaGVhZGVyICAgIHM9TiAgfCBzdHJpbmcxLFwwLCAuLi4sIHN0cmluZ04sXDAsIC4uLiwgXDAKKyAqICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqLworc3RhdGljIGNoYXIqIF9faW5pdCBkbWlfc3RyaW5nKERNSUhlYWRlciAqZG1pLCB1OCBzKQoreworICAgIHU4ICpwOworCisgICAgaWYgKCFzKSB7CisJcmV0dXJuICIiOworICAgIH0KKyAgICBzLS07CisKKyAgICBwID0gKHU4ICopZG1pICsgZG1pLT5sZW5ndGg7CisgICAgd2hpbGUgKHMgPiAwKSB7CisJcCArPSBzdHJsZW4ocCk7CisJcCsrOworCXMtLTsKKyAgICB9CisKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGRtaV9kZWNvZGUoRE1JSGVhZGVyICpkbWkpCit7CisgICAgdTggKmRhdGEgPSAodTggKikgZG1pOworICAgIGNoYXIgKnA7CisKKyNpZmRlZiBJOEtfREVCVUcKKyAgICBpbnQgaTsKKyAgICBwcmludGsoIiUwOHggIiwgKGludClkYXRhKTsKKyAgICBmb3IgKGk9MDsgaTxkYXRhWzFdICYmIGk8NjQ7IGkrKykgeworCXByaW50aygiJTAyeCAiLCBkYXRhW2ldKTsKKyAgICB9CisgICAgcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKGRtaS0+dHlwZSkgeworICAgIGNhc2UgIDA6CS8qIEJJT1MgSW5mb3JtYXRpb24gKi8KKwlwID0gZG1pX3N0cmluZyhkbWksZGF0YVs1XSk7CisJaWYgKCpwKSB7CisJICAgIHN0cmxjcHkoYmlvc192ZXJzaW9uLCBwLCBzaXplb2YoYmlvc192ZXJzaW9uKSk7CisJICAgIHN0cmluZ190cmltKGJpb3NfdmVyc2lvbiwgc2l6ZW9mKGJpb3NfdmVyc2lvbikpOworCX0KKwlicmVhazsJCisgICAgY2FzZSAxOgkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gKi8KKwlwID0gZG1pX3N0cmluZyhkbWksZGF0YVs0XSk7CisJaWYgKCpwKSB7CisJICAgIHN0cmxjcHkoc3lzdGVtX3ZlbmRvciwgcCwgc2l6ZW9mKHN5c3RlbV92ZW5kb3IpKTsKKwkgICAgc3RyaW5nX3RyaW0oc3lzdGVtX3ZlbmRvciwgc2l6ZW9mKHN5c3RlbV92ZW5kb3IpKTsKKwl9CisJcCA9IGRtaV9zdHJpbmcoZG1pLGRhdGFbNV0pOworCWlmICgqcCkgeworCSAgICBzdHJsY3B5KHByb2R1Y3RfbmFtZSwgcCwgc2l6ZW9mKHByb2R1Y3RfbmFtZSkpOworCSAgICBzdHJpbmdfdHJpbShwcm9kdWN0X25hbWUsIHNpemVvZihwcm9kdWN0X25hbWUpKTsKKwl9CisJcCA9IGRtaV9zdHJpbmcoZG1pLGRhdGFbN10pOworCWlmICgqcCkgeworCSAgICBzdHJsY3B5KHNlcmlhbF9udW1iZXIsIHAsIHNpemVvZihzZXJpYWxfbnVtYmVyKSk7CisJICAgIHN0cmluZ190cmltKHNlcmlhbF9udW1iZXIsIHNpemVvZihzZXJpYWxfbnVtYmVyKSk7CisJfQorCWJyZWFrOworICAgIH0KK30KKworc3RhdGljIGludCBfX2luaXQgZG1pX3RhYmxlKHUzMiBiYXNlLCBpbnQgbGVuLCBpbnQgbnVtLCB2b2lkICgqZm4pKERNSUhlYWRlciopKQoreworICAgIHU4ICpidWY7CisgICAgdTggKmRhdGE7CisgICAgRE1JSGVhZGVyICpkbWk7CisgICAgaW50IGkgPSAxOworCisgICAgYnVmID0gaW9yZW1hcChiYXNlLCBsZW4pOworICAgIGlmIChidWYgPT0gTlVMTCkgeworCXJldHVybiAtMTsKKyAgICB9CisgICAgZGF0YSA9IGJ1ZjsKKworICAgIC8qCisgICAgICogU3RvcCB3aGVuIHdlIHNlZSBhbCB0aGUgaXRlbXMgdGhlIHRhYmxlIGNsYWltZWQgdG8gaGF2ZQorICAgICAqIG9yIHdlIHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgdGFibGUgKGFsc28gaGFwcGVucykKKyAgICAgKi8KKyAgICB3aGlsZSAoKGk8bnVtKSAmJiAoKGRhdGEtYnVmKSA8IGxlbikpIHsKKwlkbWkgPSAoRE1JSGVhZGVyICopZGF0YTsKKwkvKgorCSAqIEF2b2lkIG1pc3BhcnNpbmcgY3J1ZCBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBsYXN0CisJICogcmVjb3JkIGlzIGNyYXAKKwkgKi8KKwlpZiAoKGRhdGEtYnVmK2RtaS0+bGVuZ3RoKSA+PSBsZW4pIHsKKwkgICAgYnJlYWs7CisJfQorCWZuKGRtaSk7CisJZGF0YSArPSBkbWktPmxlbmd0aDsKKwkvKgorCSAqIERvbid0IGdvIG9mZiB0aGUgZW5kIG9mIHRoZSBkYXRhIGlmIHRoZXJlIGlzCisJICogc3R1ZmYgbG9va2luZyBsaWtlIHN0cmluZyBmaWxsIHBhc3QgdGhlIGVuZAorCSAqLworCXdoaWxlICgoKGRhdGEtYnVmKSA8IGxlbikgJiYgKCpkYXRhIHx8IGRhdGFbMV0pKSB7CisJICAgIGRhdGErKzsKKwl9CisJZGF0YSArPSAyOworCWkrKzsKKyAgICB9CisgICAgaW91bm1hcChidWYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRtaV9pdGVyYXRlKHZvaWQgKCpkZWNvZGUpKERNSUhlYWRlciAqKSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyMF07CisJdm9pZCBfX2lvbWVtICpwID0gaW9yZW1hcCgweGUwMDAwLCAweDIwMDAwKSwgKnE7CisKKwlpZiAoIXApCisJCXJldHVybiAtMTsKKworCWZvciAocSA9IHA7IHEgPCBwICsgMHgyMDAwMDsgcSArPSAxNikgeworCQltZW1jcHlfZnJvbWlvKGJ1ZiwgcSwgMjApOworCQlpZiAobWVtY21wKGJ1ZiwgIl9ETUlfIiwgNSk9PTApIHsKKwkJCXUxNiBudW0gID0gYnVmWzEzXTw8OCAgfCBidWZbMTJdOworCQkJdTE2IGxlbiAgPSBidWYgWzddPDw4ICB8IGJ1ZiBbNl07CisJCQl1MzIgYmFzZSA9IGJ1ZlsxMV08PDI0IHwgYnVmWzEwXTw8MTYgfCBidWZbOV08PDggfCBidWZbOF07CisjaWZkZWYgSThLX0RFQlVHCisJCQlwcmludGsoS0VSTl9JTkZPICJETUkgJWQuJWQgcHJlc2VudC5cbiIsCisJCQkgICBidWZbMTRdPj40LCBidWZbMTRdJjB4MEYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJWQgc3RydWN0dXJlcyBvY2N1cHlpbmcgJWQgYnl0ZXMuXG4iLAorCQkJICAgYnVmWzEzXTw8OCB8IGJ1ZlsxMl0sCisJCQkgICBidWYgWzddPDw4IHwgYnVmWzZdKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIkRNSSB0YWJsZSBhdCAweCUwOFguXG4iLAorCQkJICAgYnVmWzExXTw8MjQgfCBidWZbMTBdPDwxNiB8IGJ1Zls5XTw8OCB8IGJ1Zls4XSk7CisjZW5kaWYKKwkJCWlmIChkbWlfdGFibGUoYmFzZSwgbGVuLCBudW0sIGRlY29kZSk9PTApIHsKKwkJCQlpb3VubWFwKHApOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCWlvdW5tYXAocCk7CisJcmV0dXJuIC0xOworfQorLyogZW5kIG9mIERNSSBjb2RlICovCisKKy8qCisgKiBHZXQgRE1JIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgaW50IF9faW5pdCBpOGtfZG1pX3Byb2JlKHZvaWQpCit7CisgICAgY2hhciAqKnA7CisKKyAgICBpZiAoZG1pX2l0ZXJhdGUoZG1pX2RlY29kZSkgIT0gMCkgeworCXByaW50ayhLRVJOX0lORk8gImk4azogdW5hYmxlIHRvIGdldCBETUkgaW5mb3JtYXRpb25cbiIpOworCXJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIGlmIChzdHJuY21wKHN5c3RlbV92ZW5kb3IsREVMTF9TSUdOQVRVUkUsc3RybGVuKERFTExfU0lHTkFUVVJFKSkgIT0gMCkgeworCXByaW50ayhLRVJOX0lORk8gImk4azogbm90IHJ1bm5pbmcgb24gYSBEZWxsIHN5c3RlbVxuIik7CisJcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgZm9yIChwPXN1cHBvcnRlZF9tb2RlbHM7IDsgcCsrKSB7CisJaWYgKCEqcCkgeworCSAgICBwcmludGsoS0VSTl9JTkZPICJpOGs6IHVuc3VwcG9ydGVkIG1vZGVsOiAlc1xuIiwgcHJvZHVjdF9uYW1lKTsKKwkgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChzdHJuY21wKHByb2R1Y3RfbmFtZSwqcCxzdHJsZW4oKnApKSA9PSAwKSB7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFByb2JlIGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBzdXBwb3J0ZWQgbGFwdG9wLgorICovCitzdGF0aWMgaW50IF9faW5pdCBpOGtfcHJvYmUodm9pZCkKK3sKKyAgICBjaGFyIGJ1ZmZbNF07CisgICAgaW50IHZlcnNpb247CisgICAgaW50IHNtbV9mb3VuZCA9IDA7CisKKyAgICAvKgorICAgICAqIEdldCBETUkgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBpZiAoaThrX2RtaV9wcm9iZSgpICE9IDApIHsKKwlwcmludGsoS0VSTl9JTkZPICJpOGs6IHZlbmRvcj0lcywgbW9kZWw9JXMsIHZlcnNpb249JXNcbiIsCisJICAgICAgIHN5c3RlbV92ZW5kb3IsIHByb2R1Y3RfbmFtZSwgYmlvc192ZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldCBTTU0gRGVsbCBzaWduYXR1cmUKKyAgICAgKi8KKyAgICBpZiAoaThrX2dldF9kZWxsX3NpZ25hdHVyZSgpICE9IDApIHsKKwlwcmludGsoS0VSTl9JTkZPICJpOGs6IHVuYWJsZSB0byBnZXQgU01NIERlbGwgc2lnbmF0dXJlXG4iKTsKKyAgICB9IGVsc2UgeworCXNtbV9mb3VuZCA9IDE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZXQgU01NIEJJT1MgdmVyc2lvbi4KKyAgICAgKi8KKyAgICB2ZXJzaW9uID0gaThrX2dldF9iaW9zX3ZlcnNpb24oKTsKKyAgICBpZiAodmVyc2lvbiA8PSAwKSB7CisJcHJpbnRrKEtFUk5fSU5GTyAiaThrOiB1bmFibGUgdG8gZ2V0IFNNTSBCSU9TIHZlcnNpb25cbiIpOworICAgIH0gZWxzZSB7CisJc21tX2ZvdW5kID0gMTsKKwlidWZmWzBdID0gKHZlcnNpb24gPj4gMTYpICYgMHhmZjsKKwlidWZmWzFdID0gKHZlcnNpb24gPj4gIDgpICYgMHhmZjsKKwlidWZmWzJdID0gKHZlcnNpb24pICAgICAgICYgMHhmZjsKKwlidWZmWzNdID0gJ1wwJzsKKwkvKgorCSAqIElmIERNSSBCSU9TIHZlcnNpb24gaXMgdW5rbm93biB1c2UgU01NIEJJT1MgdmVyc2lvbi4KKwkgKi8KKwlpZiAoYmlvc192ZXJzaW9uWzBdID09ICc/JykgeworCSAgICBzdHJjcHkoYmlvc192ZXJzaW9uLCBidWZmKTsKKwl9CisJLyoKKwkgKiBDaGVjayBpZiB0aGUgdHdvIHZlcnNpb25zIG1hdGNoLgorCSAqLworCWlmIChzdHJuY21wKGJ1ZmYsYmlvc192ZXJzaW9uLHNpemVvZihiaW9zX3ZlcnNpb24pKSAhPSAwKSB7CisJICAgIHByaW50ayhLRVJOX0lORk8gImk4azogQklPUyB2ZXJzaW9uIG1pc21hdGNoOiAlcyAhPSAlc1xuIiwKKwkJICAgYnVmZiwgYmlvc192ZXJzaW9uKTsKKwl9CisgICAgfQorCisgICAgaWYgKCFzbW1fZm91bmQgJiYgIWZvcmNlKSB7CisJcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYworI2VuZGlmCitpbnQgX19pbml0IGk4a19pbml0KHZvaWQpCit7CisgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2k4azsKKworICAgIC8qIEFyZSB3ZSBydW5uaW5nIG9uIGFuIHN1cHBvcnRlZCBsYXB0b3A/ICovCisgICAgaWYgKGk4a19wcm9iZSgpICE9IDApIHsKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICAvKiBSZWdpc3RlciB0aGUgcHJvYyBlbnRyeSAqLworICAgIHByb2NfaThrID0gY3JlYXRlX3Byb2NfaW5mb19lbnRyeSgiaThrIiwgMCwgTlVMTCwgaThrX2dldF9pbmZvKTsKKyAgICBpZiAoIXByb2NfaThrKSB7CisJcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorICAgIHByb2NfaThrLT5wcm9jX2ZvcHMgPSAmaThrX2ZvcHM7CisgICAgcHJvY19pOGstPm93bmVyID0gVEhJU19NT0RVTEU7CisKKyAgICBwcmludGsoS0VSTl9JTkZPCisJICAgIkRlbGwgbGFwdG9wIFNNTSBkcml2ZXIgdiVzIE1hc3NpbW8gRGFsIFpvdHRvIChkekBkZWJpYW4ub3JnKVxuIiwKKwkgICBJOEtfVkVSU0lPTik7CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIE1PRFVMRQoraW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisgICAgcmV0dXJuIGk4a19pbml0KCk7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKyAgICAvKiBSZW1vdmUgdGhlIHByb2MgZW50cnkgKi8KKyAgICByZW1vdmVfcHJvY19lbnRyeSgiaThrIiwgTlVMTCk7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICJpOGs6IG1vZHVsZSB1bmxvYWRlZFxuIik7Cit9CisjZW5kaWYKKworLyogZW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIuYyBiL2RyaXZlcnMvY2hhci9pcDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QxMmYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi5jCkBAIC0wLDAgKzEsMTEwIEBACisvLyBpcDIuYworLy8gVGhpcyBpcyBhIGR1bW15IG1vZHVsZSB0byBtYWtlIHRoZSBmaXJtd2FyZSBhdmFpbGFibGUgd2hlbiBuZWVkZWQKKy8vIGFuZCBhbGxvd3MgaXQgdG8gYmUgdW5sb2FkZWQgd2hlbiBub3QuIFJ1bW9yIGlzIHRoZSBfX2luaXRkYXRhIAorLy8gbWFjcm8gZG9lc24ndCBhbHdheXMgd29ya3Mgb24gYWxsIHBsYXRmb3JtcyBzbyB3ZSB1c2UgdGhpcyBrbHVkZ2UuCisvLyBJZiBub3QgY29tcGlsZWQgYXMgYSBtb2R1bGUgaXQganVzdCBtYWtlcyBmaXBfZmlybSBhdmFsaWFibGUgdGhlbgorLy8gIF9faW5pdGRhdGEgc2hvdWxkIHdvcmsgYXMgYWR2ZXJ0aXplZAorLy8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaWZuZGVmIF9faW5pdAorI2RlZmluZSBfX2luaXQKKyNlbmRpZgorI2lmbmRlZiBfX2luaXRmdW5jCisjZGVmaW5lIF9faW5pdGZ1bmMoYSkgYQorI2VuZGlmCisjaWZuZGVmIF9faW5pdGRhdGEKKyNkZWZpbmUgX19pbml0ZGF0YQorI2VuZGlmCisKKyNpbmNsdWRlICIuL2lwMi9pcDJ0eXBlcy5oIgkJCisjaW5jbHVkZSAiLi9pcDIvZmlwX2Zpcm0uaCIJCS8vIHRoZSBtZWF0CisKK2ludAoraXAyX2xvYWRtYWluKGludCAqLCBpbnQgICosIHVuc2lnbmVkIGNoYXIgKiwgaW50ICk7IC8vIHJlZiBpbnRvIGlwMm1haW4uYworCisvKiBOb3RlOiBBZGQgY29tcGlsZWQgaW4gZGVmYXVsdHMgdG8gdGhlc2UgYXJyYXlzLCBub3QgdG8gdGhlIHN0cnVjdHVyZQorCWluIGlwMi9pcDIuaCBhbnkgbG9uZ2VyLiAgVGhhdCBzdHJ1Y3R1cmUgV0lMTCBnZXQgb3ZlcnJpZGRlbgorCWJ5IHRoZXNlIHZhbHVlcywgb3IgY29tbWFuZCBsaW5lIHZhbHVlcywgb3IgaW5zbW9kIHZhbHVlcyEhISAgPW1odz0KKyovCitzdGF0aWMgaW50IGlvW0lQMl9NQVhfQk9BUkRTXT0geyAwLCAwLCAwLCAwIH07CitzdGF0aWMgaW50IGlycVtJUDJfTUFYX0JPQVJEU10gPSB7IC0xLCAtMSwgLTEsIC0xIH07IAorCitzdGF0aWMgaW50IHBvbGxfb25seSA9IDA7CisKK01PRFVMRV9BVVRIT1IoIkRvdWcgTWNOYXNoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbXB1dG9uZSBJbnRlbGxpUG9ydCBQbHVzIERyaXZlciIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCJJbnRlcnJ1cHRzIGZvciBJbnRlbGxpUG9ydCBDYXJkcyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywiSS9PIHBvcnRzIGZvciBJbnRlbGxpUG9ydCBDYXJkcyIpOworbW9kdWxlX3BhcmFtKHBvbGxfb25seSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvbGxfb25seSwiRG8gbm90IHVzZSBjYXJkIGludGVycnVwdHMiKTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpcDJfaW5pdCh2b2lkKQoreworCWlmKCBwb2xsX29ubHkgKSB7CisJCS8qIEhhcmQgbG9jayB0aGUgaW50ZXJydXB0cyB0byB6ZXJvICovCisJCWlycVswXSA9IGlycVsxXSA9IGlycVsyXSA9IGlycVszXSA9IDA7CisJfQorCisJcmV0dXJuIGlwMl9sb2FkbWFpbihpbyxpcnEsKHVuc2lnbmVkIGNoYXIgKilmaXBfZmlybSxzaXplb2YoZmlwX2Zpcm0pKTsKK30KK21vZHVsZV9pbml0KGlwMl9pbml0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZuZGVmIE1PRFVMRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJaXAyX3NldHVwOgorICoJCXN0cjoga2VybmVsIGNvbW1hbmQgbGluZSBzdHJpbmcKKyAqCisgKglDYW4ndCBhdXRvcHJvYmUgdGhlIGJvYXJkcyBzbyB1c2VyIG11c3Qgc3BlY2lmeSBjb25maWd1cmF0aW9uIG9uCisgKglrZXJuZWwgY29tbWFuZCBsaW5lLiAgU2FuZSBwZW9wbGUgYnVpbGQgaXQgbW9kdWxhciBidXQgdGhlIG90aGVycworICoJY29tZSBoZXJlLgorICoKKyAqCUFsdGVybmF0aW5nIHBhaXJzIG9mIGlvLGlycSBmb3IgdXAgdG8gNCBib2FyZHMuCisgKgkJaXAyPWlvMCxpcnEwLGlvMSxpcnExLGlvMixpcnEyLGlvMyxpcnEzCisgKgorICoJCWlvPTAgPT4gTm8gYm9hcmQKKyAqCQlpbz0xID0+IFBDSQorICoJCWlvPTIgPT4gRUlTQQorICoJCWVsc2UgPT4gSVNBIEkvTyBhZGRyZXNzCisgKgorICoJCWlycT0wIG9yIGludmFsaWQgZm9yIElTQSB3aWxsIHJldmVydCB0byBwb2xsaW5nIG1vZGUKKyAqCisgKgkJQW55IHZhbHVlID0gLTEsIGRvIG5vdCBvdmVyd3JpdGUgY29tcGlsZWQgaW4gdmFsdWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgX19pbml0IGlwMl9zZXR1cChjaGFyICpzdHIpCit7CisJaW50CWludHNbMTBdOwkvKiA0IGJvYXJkcywgMiBwYXJhbWV0ZXJzICsgMiAqLworCWludAlpLCBqOworCisJc3RyID0gZ2V0X29wdGlvbnMgKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlmb3IoIGkgPSAwLCBqID0gMTsgaSA8IDQ7IGkrKyApIHsKKwkJaWYoIGogPiBpbnRzWzBdICkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYoIGludHNbal0gPj0gMCApIHsKKwkJCWlvW2ldID0gaW50c1tqXTsKKwkJfQorCQlqKys7CisJCWlmKCBqID4gaW50c1swXSApIHsKKwkJCWJyZWFrOworCQl9CisJCWlmKCBpbnRzW2pdID49IDAgKSB7CisJCQlpcnFbaV0gPSBpbnRzW2pdOworCQl9CisJCWorKzsKKwl9CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJpcDI9IiwgaXAyX3NldHVwKTsKKyNlbmRpZiAvKiAhTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2ZpcF9maXJtLmggYi9kcml2ZXJzL2NoYXIvaXAyL2ZpcF9maXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM1MjVmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvZmlwX2Zpcm0uaApAQCAtMCwwICsxLDIxNDkgQEAKKy8qIGZpcF9maXJtLmggLSBJbnRlbGxpcG9ydCBJSSBsb2Fkd2FyZSAqLworLyogLTMxMjMyIGJ5dGVzIHJlYWQgZnJvbSBmZi5sb2QgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlwX2Zpcm1bXSBfX2luaXRkYXRhID0geworMHgzQywweDQyLDB4MzcsMHgxOCwweDAyLDB4MDEsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4NTcsMHg2NSwweDY0LDB4MjAsMHg0NCwweDY1LDB4NjMsMHgyMCwweDMwLDB4MzEsMHgyMCwweDMxLDB4MzIsMHgzQSwweDMyLDB4MzQsCisweDNBLDB4MzMsMHgzMCwweDIwLDB4MzEsMHgzOSwweDM5LDB4MzksMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHhFOSwweDZDLDB4MEYsMHg0MiwweDY1LDB4NDcsMHg2OSwweDRFLDB4NkUsMHg0OSwweDZFLDB4NDcsMHgyMCwweDZGLDB4NDYsMHgyMCwKKzB4NjMsMHg0RiwweDY0LDB4NDUsMHhDQywweDEzLDB4NUEsMHgxNSwweEU4LDB4MTYsMHg3NiwweDE4LDB4MDQsMHgxQSwweDkyLDB4MUIsCisweDIwLDB4MUQsMHhBRSwweDFFLDB4M0MsMHgyMCwweENBLDB4MjEsMHg1OCwweDIzLDB4RTYsMHgyNCwweDc0LDB4MjYsMHgwMiwweDI4LAorMHg5MCwweDI5LDB4MUUsMHgyQiwweEFDLDB4MkMsMHgzQSwweDJFLDB4QzgsMHgyRiwweDU2LDB4MzEsMHhFNCwweDMyLDB4NzIsMHgzNCwKKzB4MDAsMHgzNiwweDhFLDB4MzcsMHgxQywweDM5LDB4QUEsMHgzQSwweDM4LDB4M0MsMHhDNiwweDNELDB4NTQsMHgzRiwweEUyLDB4NDAsCisweDcwLDB4NDIsMHhGRSwweDQzLDB4OEMsMHg0NSwweDFBLDB4NDcsMHhBOCwweDQ4LDB4MzYsMHg0QSwweEM0LDB4NEIsMHg1MiwweDRELAorMHhFMCwweDRFLDB4NkUsMHg1MCwweEZDLDB4NTEsMHg4QSwweDUzLDB4MTgsMHg1NSwweEE2LDB4NTYsMHgzNCwweDU4LDB4QzIsMHg1OSwKKzB4NTAsMHg1QiwweERFLDB4NUMsMHg2QywweDVFLDB4RkEsMHg1RiwweDg4LDB4NjEsMHgxNiwweDYzLDB4QTQsMHg2NCwweDMyLDB4NjYsCisweEMwLDB4NjcsMHg0RSwweDY5LDB4REMsMHg2QSwweDZBLDB4NkMsMHhGOCwweDZELDB4ODYsMHg2RiwweDE0LDB4NzEsMHhBMiwweDcyLAorMHgzMCwweDc0LDB4QkUsMHg3NSwweDRDLDB4NzcsMHg2QywweDc3LDB4OEMsMHg3NywweEFDLDB4NzcsMHgzMywweERCLDB4OEEsMHhEQywKKzB4NTMsMHgzMywweERCLDB4MjUsMHgwNywweDAwLDB4NzUsMHgwQSwweDhBLDB4MUUsMHgwOCwweDAxLDB4ODMsMHhFMywweDBDLDB4RUIsCisweDIwLDB4OTAsMHgzQywweDAxLDB4NzUsMHgwQSwweDhBLDB4MUUsMHgwOCwweDAxLDB4ODAsMHhFMywweEMwLDB4RUIsMHgxMiwweDkwLAorMHg4QSwweDFFLDB4MEQsMHgwMSwweDNDLDB4MDIsMHg3NSwweDA2LDB4ODAsMHhFMywweDBDLDB4RUIsMHgwNCwweDkwLDB4ODAsMHhFMywKKzB4QzAsMHg1MywweDUwLDB4OEIsMHgxRSwweEJBLDB4MTMsMHg4RSwweERCLDB4RTgsMHg2QSwweDY1LDB4NTUsMHg4QiwweEVDLDB4NTMsCisweDFFLDB4MkIsMHhDMCwweDhFLDB4RDgsMHg4QiwweDVFLDB4MDQsMHhDMSwweEUzLDB4MDQsMHgwMywweDVFLDB4MDYsMHhEMSwweEUzLAorMHgyRSwweDhCLDB4OUYsMHg0NCwweDAwLDB4OEQsMHg0NywweDJBLDB4MUUsMHg1QSwweDFGLDB4NUIsMHg1RCwweEMzLDB4NTUsMHg4QiwKKzB4RUMsMHg1MywweDFFLDB4MkIsMHhDMCwweDhFLDB4RDgsMHg4QiwweDVFLDB4MDQsMHhDMSwweEUzLDB4MDQsMHgwMywweDVFLDB4MDYsCisweEQxLDB4RTMsMHgyRSwweDhCLDB4OUYsMHg0NCwweDAwLDB4OEQsMHg0NywweDM0LDB4MUUsMHg1QSwweDFGLDB4NUIsMHg1RCwweEMzLAorMHhGQiwweDU1LDB4OEIsMHhFQywweDUzLDB4NTEsMHg1MiwweDU2LDB4NTcsMHgxRSwweDA2LDB4MUUsMHgwNywweDMzLDB4QzAsMHg4RSwKKzB4RDgsMHg4QiwweDVFLDB4MDQsMHgyNiwweDhBLDB4NDcsMHg1OSwweDI1LDB4MDMsMHgwMCwweDhCLDB4RjAsMHhEMSwweEU2LDB4MkUsCisweDhCLDB4QjQsMHhDNCwweDAwLDB4QzEsMHhFMCwweDA0LDB4MjYsMHgwMiwweDQ3LDB4MUEsMHhEMSwweEUwLDB4OEIsMHhFOCwweDJFLAorMHg4QiwweEFFLDB4NDQsMHgwMCwweDg5LDB4MkMsMHgyNiwweDhBLDB4NDcsMHgxQywweDg4LDB4NDQsMHgwRiwweDI2LDB4OEEsMHg0NywKKzB4MUQsMHg4OCwweDQ0LDB4MTAsMHgyNiwweDhBLDB4NDcsMHgxRSwweDg4LDB4NDQsMHgxMSwweDI2LDB4OEEsMHg0NywweDFGLDB4ODgsCisweDQ0LDB4MTIsMHgyNiwweDhBLDB4NDcsMHgyMCwweDg4LDB4NDQsMHgxMywweDI2LDB4OEEsMHg0NywweDIzLDB4ODgsMHg0NCwweDE0LAorMHgyNiwweDhBLDB4NDcsMHgyNCwweDg4LDB4NDQsMHgxNSwweDI2LDB4OEEsMHg0NywweDVBLDB4ODgsMHg0NCwweDBFLDB4MzMsMHhDMCwKKzB4ODksMHg0NCwweDA2LDB4ODksMHg0NCwweDA4LDB4ODgsMHg0NCwweDBCLDB4ODgsMHg0NCwweDBBLDB4QjAsMHgyMSwweEI0LDB4NjQsCisweDg5LDB4NDQsMHgwNCwweDg5LDB4NDQsMHgwMiwweEIwLDB4NTUsMHg4OCwweDQ0LDB4MEQsMHg4OCwweDQ0LDB4MEMsMHhFOCwweDZBLAorMHgwMCwweDcyLDB4NUIsMHhFOCwweEM5LDB4MDAsMHhFOCwweEMxLDB4MTAsMHg4OSwweDQ0LDB4MDgsMHg4MCwweDdDLDB4MEYsMHgwMSwKKzB4NzQsMHgyOSwweEU4LDB4MkIsMHgwMiwweEU4LDB4N0YsMHgwMiwweDgwLDB4N0MsMHgwRiwweDAzLDB4NzQsMHgxRCwweEU4LDB4QTksCisweDEwLDB4OEIsMHhGOCwweDJCLDB4NDQsMHgwOCwweDNELDB4QTAsMHgwRiwweDcyLDB4MTAsMHg4OSwweDdDLDB4MDgsMHgzMywweEMwLAorMHg4NywweDQ0LDB4MDYsMHg4NSwweEMwLDB4NzUsMHgwNCwweEM2LDB4NDQsMHgwQSwweEZGLDB4OEEsMHg0NCwweDBBLDB4ODQsMHhDMCwKKzB4NzUsMHgwQiwweEI4LDB4MDgsMHgwMCwweEU4LDB4NkEsMHg0QSwweEU4LDB4QTksMHgwMSwweDczLDB4QkYsMHhFOCwweDRGLDB4MDEsCisweDgxLDB4NjYsMHg0OCwweDdGLDB4RkYsMHg4MywweDY2LDB4N0EsMHhCRiwweEIwLDB4MDIsMHhFOCwweDA0LDB4MEUsMHg4QSwweDQ0LAorMHgwQSwweDk4LDB4MDcsMHgxRiwweDVGLDB4NUUsMHg1QSwweDU5LDB4NUIsMHg1RCwweEMzLDB4ODEsMHg0RSwweDQ4LDB4ODAsMHgwMCwKKzB4QjAsMHg0MCwweEU4LDB4M0QsMHg0QSwweEU4LDB4ODksMHg0MCwweDczLDB4MkEsMHhFOCwweDRELDB4MTAsMHg4QiwweEQ4LDB4QjAsCisweDA1LDB4RTgsMHgyRSwweDRBLDB4RjYsMHg0NiwweDI3LDB4MDIsMHg3NSwweDFBLDB4RTgsMHgzRCwweDEwLDB4MkIsMHhDMywweDNELAorMHg1OCwweDFCLDB4NzIsMHhFQiwweDgxLDB4NjYsMHg0OCwweDdGLDB4RkYsMHhCMCwweDAyLDB4RTgsMHhDNCwweDBELDB4QzYsMHg0NCwKKzB4MEEsMHgwMSwweEY5LDB4QzMsMHg4MywweDRFLDB4N0EsMHg0MCwweEY4LDB4QzMsMHhGQiwweEIwLDB4MDEsMHhFOCwweDAyLDB4NEEsCisweEZBLDB4RTgsMHg5OSwweDFFLDB4RTQsMHgwQSwweDg0LDB4QzAsMHg3NSwweEYwLDB4QjAsMHg0RSwweEU2LDB4MEEsMHhGQiwweEIwLAorMHgwMSwweEU4LDB4RUUsMHg0OSwweEZBLDB4RTgsMHg4NSwweDFFLDB4RTQsMHgwQSwweDg0LDB4QzAsMHg3NSwweEYwLDB4QzMsMHhGQSwKKzB4RTgsMHg3QSwweDFFLDB4RTQsMHhFQywweDg4LDB4NDQsMHgxNiwweEU0LDB4RTQsMHg4OCwweDQ0LDB4MTcsMHhFNCwweEY4LDB4ODgsCisweDQ0LDB4MTgsMHhFNCwweEYwLDB4ODgsMHg0NCwweDE5LDB4RTQsMHgxMCwweDg4LDB4NDQsMHgxQSwweEU0LDB4MTIsMHg4OCwweDQ0LAorMHgxQiwweEU0LDB4MTQsMHg4OCwweDQ0LDB4MUMsMHhFNCwweDM0LDB4ODgsMHg0NCwweDFELDB4RTQsMHgzNiwweDg4LDB4NDQsMHgxRSwKKzB4RTQsMHhEOCwweDI0LDB4MDEsMHg4QSwweEUwLDB4RTQsMHhEQSwweDI0LDB4MDIsMHgwQSwweEM0LDB4ODgsMHg0NCwweDFGLDB4OEEsCisweDQ0LDB4MTAsMHhFOCwweENELDB4MUYsMHg4QSwweDQ0LDB4MTEsMHhFOCwweDM1LDB4MjEsMHg4QSwweDQ0LDB4MTIsMHhFOCwweDg5LAorMHgyMSwweDhBLDB4NDQsMHgxMywweEU4LDB4NDMsMHgyMSwweEM2LDB4ODYsMHhBMSwweDAwLDB4MDAsMHhFNCwweDE0LDB4MjQsMHgxMCwKKzB4RTYsMHgxNCwweEU0LDB4MTIsMHgyNCwweDNELDB4RTYsMHgxMiwweDhBLDB4NDQsMHgxNSwweDNDLDB4MDEsMHg3MiwweDFFLDB4NzcsCisweDE2LDB4QjAsMHgxMSwweEU2LDB4MzQsMHhCMCwweDEzLDB4RTYsMHgzNiwweEU0LDB4MTQsMHgwQywweDEwLDB4RTYsMHgxNCwweEU0LAorMHgxMiwweDBDLDB4NDAsMHhFNiwweDEyLDB4RUIsMHgwNiwweEU0LDB4MTIsMHgwQywweDAyLDB4RTYsMHgxMiwweDhBLDB4NDQsMHgwRiwKKzB4M0MsMHgwMSwweDc0LDB4MDYsMHgzQywweDAyLDB4NzQsMHgwQSwweEVCLDB4MEUsMHhFNCwweDEyLDB4MEMsMHgwOCwweEU2LDB4MTIsCisweEVCLDB4MDYsMHhFNCwweDEyLDB4MEMsMHgxMCwweEU2LDB4MTIsMHhFOCwweDJGLDB4RkYsMHg4QSwweDQ0LDB4MTQsMHgzQywweDAyLAorMHg3NSwweDA4LDB4QjAsMHg1NSwweDg4LDB4NDQsMHgwQywweDg4LDB4NDQsMHgwRCwweEIwLDB4MjEsMHhCNCwweDY0LDB4ODksMHg0NCwKKzB4MDQsMHg4OSwweDQ0LDB4MDIsMHhFNCwweDBDLDB4MEMsMHgxMCwweEU2LDB4MEMsMHhFOCwweEVELDB4MzksMHhGQiwweEMzLDB4RTgsCisweDVGLDB4M0YsMHg3MywweDA4LDB4RkIsMHhCMCwweDBBLDB4RTgsMHgwOCwweDQ5LDB4RUIsMHhGMywweEZBLDB4RTgsMHg5RCwweDFELAorMHg4QSwweDY0LDB4MTYsMHg4QSwweDQ0LDB4MTcsMHg4OSwweDg2LDB4OTQsMHgwMCwweEU2LDB4RTQsMHg4QSwweEM0LDB4RTYsMHhFQywKKzB4OEEsMHg2NCwweDE4LDB4OEEsMHg0NCwweDE5LDB4ODksMHg4NiwweDk2LDB4MDAsMHhFNiwweEYwLDB4OEEsMHhDNCwweEU2LDB4RjgsCisweDhBLDB4NDQsMHgxQSwweEU2LDB4MTAsMHg4QSwweDQ0LDB4MUIsMHhFNiwweDEyLDB4OEEsMHg0NCwweDFDLDB4RTYsMHgxNCwweDhBLAorMHg0NCwweDFELDB4RTYsMHgzNCwweDhBLDB4NDQsMHgxRSwweEU2LDB4MzYsMHg4QSwweDQ0LDB4MUYsMHhFNiwweEQ4LDB4RTYsMHhEQSwKKzB4RTksMHhCNywweEZFLDB4OTAsMHhGQSwweDhBLDB4NDQsMHgwRSwweEU2LDB4RkUsMHhFNCwweDAyLDB4QTgsMHgwMSwweDc1LDB4MDUsCisweDMzLDB4QzAsMHhGQiwweEY4LDB4QzMsMHgzMywweEMwLDB4RTQsMHgwMCwweEZCLDB4RjksMHhDMywweDhBLDB4NjQsMHgxNCwweDgwLAorMHhGQywweDAyLDB4NzQsMHgyQiwweEZFLDB4QzAsMHhGRSwweEM3LDB4ODAsMHhGRiwweDRFLDB4NzIsMHgxQywweDc0LDB4MDksMHg4MCwKKzB4RkYsMHg1MCwweDczLDB4MDgsMHhCMCwweDBBLDB4RUIsMHgxNywweEIwLDB4MEQsMHhFQiwweDEzLDB4MDIsMHhEQywweDMyLDB4RkYsCisweDgwLDB4RkIsMHg3RiwweDdDLDB4MDIsMHhCMywweDIxLDB4OEEsMHhDMywweDNDLDB4N0YsMHg3QywweDAyLDB4QjAsMHgyMSwweEMzLAorMHhGQSwweDgwLDB4N0MsMHgwQiwweDA0LDB4NzYsMHgwMiwweEZCLDB4QzMsMHg4QiwweDQ2LDB4MjQsMHgzRCwweDA4LDB4MDAsMHg3MiwKKzB4RjYsMHg4RSwweDQ2LDB4MDIsMHg4QiwweDdFLDB4MjIsMHg4QSwweDQ0LDB4MEMsMHg4QiwweDVDLDB4MDIsMHhBQSwweEU4LDB4QUIsCisweEZGLDB4QUEsMHhFOCwweEE3LDB4RkYsMHhBQSwweEU4LDB4QTMsMHhGRiwweEFBLDB4RTgsMHg5RiwweEZGLDB4ODgsMHg0NCwweDBDLAorMHg4OSwweDVDLDB4MDIsMHg4MCwweDQ0LDB4MEIsMHgwNCwweDg5LDB4N0UsMHgyMiwweDgzLDB4NkUsMHgyNCwweDA0LDB4ODMsMHg0NiwKKzB4MUEsMHgwNCwweDgwLDB4N0UsMHgyNiwweDAyLDB4NzQsMHgwNiwweDgwLDB4NjYsMHgyNiwweEZELDB4RkIsMHhDMywweDYwLDB4QjAsCisweEZELDB4RTgsMHgwMiwweDNGLDB4NjEsMHhGQiwweEMzLDB4RkEsMHg4MCwweDdDLDB4MEYsMHgwMywweDc1LDB4MDksMHhDNiwweDQ0LAorMHgwQiwweDAwLDB4RTgsMHhFNSwweDM4LDB4RkIsMHhDMywweEM0LDB4N0UsMHgxNCwweDhCLDB4NEUsMHgzQSwweDg1LDB4QzksMHg3NSwKKzB4MzUsMHgyNiwweDhCLDB4MEQsMHg0NywweDQ3LDB4RTMsMHhFQSwweDNCLDB4N0UsMHgwNCwweDc2LDB4MjIsMHhCOCwweDAyLDB4MDAsCisweDM5LDB4NDYsMHgyRSwweDc3LDB4MDcsMHhDNywweDQ2LDB4MkUsMHgwMCwweDAwLDB4RUIsMHgxMywweDhCLDB4NUUsMHgyQywweDg5LAorMHg1RSwweDA0LDB4MjYsMHhDNywweDA3LDB4MDAsMHgwMCwweDQzLDB4NDMsMHg4OSwweDVFLDB4MkMsMHgyOSwweDQ2LDB4MkUsMHg4NSwKKzB4QzksMHg3OCwweENFLDB4ODksMHg0RSwweDNBLDB4OEEsMHg0NCwweDBELDB4OEIsMHg1QywweDA0LDB4MjYsMHg4QSwweDI1LDB4NDcsCisweDNBLDB4QzQsMHg3NSwweDE2LDB4RkUsMHg0QywweDBCLDB4RkYsMHg0NCwweDA2LDB4RTgsMHgwRiwweEZGLDB4RTIsMHhFRCwweDg4LAorMHg0NCwweDBELDB4ODksMHg1QywweDA0LDB4ODksMHg0RSwweDNBLDB4RUIsMHhBNywweEM2LDB4NDQsMHgwQSwweEZFLDB4RTgsMHg3OSwKKzB4MzgsMHhGQiwweEMzLDB4OTAsMHhFOCwweEIzLDB4MEQsMHg4QSwweEU4LDB4OEEsMHgwRSwweENCLDB4MTMsMHhCMywweDA3LDB4OEEsCisweEMxLDB4RUUsMHhFQiwweDAwLDB4RUMsMHgzQSwweEMxLDB4NzUsMHgwOSwweDAyLDB4Q0QsMHhGRSwweENCLDB4NzUsMHhGMCwweEVCLAorMHgwQywweDkwLDB4ODgsMHgwRSwweENCLDB4MTMsMHg4QSwweEU4LDB4QkIsMHhGRiwweEZGLDB4RjksMHhDMywweDg4LDB4MEUsMHhDQiwKKzB4MTMsMHhGOCwweEMzLDB4OTAsMHhCQiwweDNGLDB4M0YsMHg4QSwweDhFLDB4OUUsMHgwMCwweEJBLDB4RkUsMHgwMCwweEVDLDB4OEEsCisweEU4LDB4MzIsMHhDMSwweDIyLDB4QzMsMHg3NSwweDAyLDB4RjgsMHhDMywweEY5LDB4QzMsMHg5MCwweEU4LDB4RTUsMHhGRiwweDczLAorMHgwMSwweEMzLDB4QkEsMHhEMCwweDAwLDB4QkIsMHgwMywweDAzLDB4OEEsMHg4RSwweDlGLDB4MDAsMHhFQywweDhBLDB4RTgsMHgzMiwKKzB4QzEsMHgyMiwweEMzLDB4NzUsMHgwMiwweEY4LDB4QzMsMHhGOSwweEMzLDB4OTAsMHgzMywweEMwLDB4OEUsMHhEOCwweDhFLDB4QzAsCisweDgwLDB4M0UsMHhDOCwweDEzLDB4MDAsMHg3NSwweDA3LDB4QjAsMHgwQSwweEU4LDB4MjYsMHg0NywweEVCLDB4RjIsMHhGQiwweDMzLAorMHhEQiwweDhBLDB4MUUsMHhDOSwweDEzLDB4NDMsMHg0MywweDgzLDB4RkIsMHg3RSwweDc2LDB4MDcsMHgzMywweERCLDB4QjAsMHgwMiwKKzB4RTgsMHgwRiwweDQ3LDB4MkUsMHg4QiwweEFGLDB4NDQsMHgwMCwweDgzLDB4N0UsMHgwOCwweDAwLDB4NzQsMHhFNywweDg4LDB4MUUsCisweEM5LDB4MTMsMHhCMCwweDAyLDB4RTgsMHhGQiwweDQ2LDB4RkEsMHhGNywweDQ2LDB4MzgsMHg0MCwweDAwLDB4NzQsMHgxNCwweEU4LAorMHg5NiwweDFCLDB4RTgsMHg3RiwweEZGLDB4NzIsMHgxQywweDMzLDB4RDIsMHg4QSwweDk2LDB4OUYsMHgwMCwweDgzLDB4QzIsMHgwRSwKKzB4RUIsMHgwQywweDkwLDB4RTgsMHg3NywweDFCLDB4RTgsMHg4MywweEZGLDB4NzIsMHgwOCwweEJBLDB4NDgsMHgwMCwweEU4LDB4MzMsCisweEZGLDB4NzMsMHhBQiwweDIzLDB4Q0IsMHg4OSwweDhFLDB4OUEsMHgwMCwweDg5LDB4OTYsMHg5QywweDAwLDB4RkUsMHg4NiwweEI1LAorMHgwMCwweEM2LDB4MDYsMHhDOCwweDEzLDB4MDAsMHhCMCwweDBBLDB4RTgsMHg2NywweDBBLDB4RkIsMHhFQiwweDg5LDB4MTAsMHgxOCwKKzB4MDgsMHgyOCwweDMzLDB4QzAsMHhBMCwweDA1LDB4MDEsMHg4QSwweEM4LDB4MjQsMHg0MCwweDc1LDB4MjQsMHhDNywweDA2LDB4N0MsCisweDEyLDB4OEUsMHg0NSwweEM3LDB4MDYsMHg0MiwweDEyLDB4MDEsMHgwMCwweEM2LDB4MDYsMHg1NCwweDEyLDB4MDIsMHhCMCwweDA4LAorMHhGNiwweEMxLDB4MDEsMHg3NCwweDAyLDB4QjAsMHgwNCwweEEzLDB4NDYsMHgxMiwweEEyLDB4NEMsMHgxMiwweEEyLDB4OTQsMHgxMiwKKzB4QzMsMHhDNywweDA2LDB4N0MsMHgxMiwweEI2LDB4NDUsMHhBMCwweDBGLDB4MDEsMHg4NCwweEMwLDB4NzUsMHgwRSwweDZBLDB4MDAsCisweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgxRSwweDlDLDB4MEUsMHhFOCwweEIxLDB4MEMsMHg5MCwweEM3LDB4MDYsMHg0NCwweDEyLAorMHgwMSwweDAwLDB4QTMsMHg0MiwweDEyLDB4OEIsMHhEOCwweEMxLDB4RTMsMHgwNCwweDg4LDB4MUUsMHg5NCwweDEyLDB4QkUsMHhFMiwKKzB4MDUsMHgyQiwweEYwLDB4OEIsMHhDOCwweDMzLDB4REIsMHg4QiwweEZCLDB4MkUsMHhBQywweDg4LDB4ODUsMHg0OCwweDEyLDB4OEEsCisweEQ4LDB4MEMsMHgwNSwweEU2LDB4RkUsMHg4QSwweEUwLDB4RUIsMHgwMCwweEU0LDB4RkUsMHgzMiwweEM0LDB4QTgsMHgzRiwweDc0LAorMHgwMywweEU5LDB4OUUsMHgwMCwweEU0LDB4MDAsMHg4OCwweDg1LDB4NTAsMHgxMiwweDhBLDB4RTAsMHgyNCwweDMwLDB4QkEsMHgxMCwKKzB4RkYsMHgzQywweDMwLDB4NzQsMHgxMiwweDgwLDB4RkMsMHgwNCwweDc0LDB4MEEsMHhCQSwweDA0LDB4MDMsMHhGNiwweDA2LDB4MDgsCisweDAxLDB4RkUsMHg3NCwweDAzLDB4QkEsMHgwOCwweDBGLDB4ODgsMHg5NSwweDRDLDB4MTIsMHgwMiwweEZBLDB4MzIsMHhDMCwweEY2LAorMHhDNCwweDA4LDB4NzQsMHgwMiwweEIwLDB4MDEsMHg4OCwweDg1LDB4NTgsMHgxMiwweDhBLDB4QzQsMHgzQywweDM1LDB4NzQsMHg1QiwKKzB4M0MsMHgzNiwweDc0LDB4NTcsMHgzQywweDM0LDB4NzQsMHg1MywweDNDLDB4MDQsMHg3NCwweDRGLDB4M0MsMHgxNCwweDc0LDB4NEIsCisweDNDLDB4MTUsMHg3NCwweDQ3LDB4QTgsMHg0MCwweDc0LDB4MjUsMHhDNiwweDg1LDB4NTQsMHgxMiwweDA0LDB4RDEsMHhFNywweEI0LAorMHgwMywweDhBLDB4QzMsMHg4OSwweDg1LDB4NUMsMHgxMiwweDhBLDB4QzMsMHg4QSwweEUzLDB4ODAsMHhDQywweDAxLDB4ODksMHg4NSwKKzB4NjQsMHgxMiwweEQxLDB4RUYsMHg0NywweEUyLDB4MDMsMHhFQiwweDFBLDB4OTAsMHhFOSwweDZDLDB4RkYsMHhDNiwweDg1LDB4NTQsCisweDEyLDB4MDIsMHhEMSwweEU3LDB4OEEsMHhFNiwweDhBLDB4QzMsMHgwQywweDA0LDB4ODksMHg4NSwweDVDLDB4MTIsMHhEMSwweEVGLAorMHg0NywweEUyLDB4RTcsMHgzMywweEMwLDB4OEEsMHhDNywweEEzLDB4NDYsMHgxMiwweEMzLDB4QzYsMHg4NSwweDU0LDB4MTIsMHgwNiwKKzB4RUIsMHhCQiwweEM2LDB4ODUsMHg1NCwweDEyLDB4MDAsMHgzMywweEMwLDB4ODgsMHg4NSwweDUwLDB4MTIsMHg4OCwweDg1LDB4NEMsCisweDEyLDB4ODgsMHg4NSwweDU4LDB4MTIsMHhFQiwweEE2LDB4QzcsMHg0NiwweDI2LDB4MDIsMHgxMiwweDhCLDB4NDYsMHgxRSwweDg5LAorMHg0NiwweDAwLDB4ODksMHg0NiwweDIyLDB4OEIsMHg0NiwweDIwLDB4ODksMHg0NiwweDI0LDB4QzcsMHg0NiwweDFBLDB4MDAsMHgwMCwKKzB4QzMsMHhDNywweDQ2LDB4M0MsMHg4MCwweDAwLDB4QzcsMHg0NiwweDM4LDB4MDEsMHgwMCwweDFFLDB4NTYsMHg4QiwweDc2LDB4MzAsCisweDg5LDB4NzYsMHgwNCwweDg5LDB4NzYsMHgxNCwweDhFLDB4NUUsMHgwNiwweDMzLDB4QzAsMHg4OSwweDA0LDB4NDYsMHg0NiwweDg5LAorMHg3NiwweDJDLDB4ODksMHg0NiwweDNBLDB4OEIsMHg0NiwweDMyLDB4NDgsMHg0OCwweDg5LDB4NDYsMHgyRSwweDVFLDB4MUYsMHhDMywKKzB4MzMsMHhDMCwweDg5LDB4NDYsMHg0OCwweDg5LDB4NDYsMHg0QSwweEM3LDB4NDYsMHg0NiwweEFFLDB4MDEsMHg4OSwweDQ2LDB4NEUsCisweDhCLDB4NDYsMHg0NCwweDg5LDB4NDYsMHg1MCwweDhCLDB4NDYsMHg0MiwweDg5LDB4NDYsMHg0MCwweDg5LDB4NDYsMHgwOCwweEMzLAorMHgzMywweEMwLDB4ODksMHg0NiwweDc2LDB4ODksMHg0NiwweDc4LDB4QzcsMHg0NiwweDdBLDB4MTAsMHgwMCwweDU2LDB4MUUsMHg4QiwKKzB4NzYsMHg3MCwweDg5LDB4NzYsMHgxMCwweDg5LDB4NzYsMHgwQywweDhFLDB4NUUsMHgxMiwweEM3LDB4MDQsMHgwMCwweDAwLDB4OEIsCisweDQ2LDB4NzIsMHg4OSwweDQ2LDB4NzQsMHgxRiwweDVFLDB4QzMsMHg4OSwweDU2LDB4MTgsMHg4OSwweDU2LDB4MDIsMHg4OSwweDU2LAorMHgwNiwweDg5LDB4NTYsMHgwQSwweDg5LDB4NTYsMHgwRSwweDg5LDB4NTYsMHgxMiwweDg5LDB4NTYsMHgxNiwweDhCLDB4RDgsMHg0QiwKKzB4NEIsMHhDMSwweEUzLDB4MDIsMHhCRiwweDAyLDB4MDAsMHg4OSwweDdFLDB4MUUsMHgwMywweEZCLDB4ODksMHg3RSwweDMwLDB4MDMsCisweEZCLDB4ODksMHg3RSwweDQyLDB4MDMsMHhGQiwweDg5LDB4N0UsMHg3MCwweDgzLDB4RUIsMHgwOCwweDg5LDB4NUUsMHgyMCwweDg5LAorMHg1RSwweDMyLDB4ODksMHg1RSwweDQ0LDB4ODksMHg1RSwweDcyLDB4NTAsMHhFOCwweDJCLDB4RkYsMHhFOCwweDcxLDB4RkYsMHhFOCwKKzB4M0YsMHhGRiwweEU4LDB4OEIsMHhGRiwweDU4LDB4QzMsMHhCOCwweDMwLDB4NzUsMHhDMSwweEU4LDB4MDQsMHgwRSwweDVCLDB4MDMsCisweEMzLDB4QTMsMHhCQSwweDEzLDB4ODMsMHgzRSwweDQyLDB4MTIsMHgwMCwweDc0LDB4MDcsMHg4MCwweDNFLDB4OTQsMHgxMiwweDAwLAorMHg3NSwweDBFLDB4NkEsMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgxRSwweDlDLDB4MEUsMHhFOCwweEJELDB4MEEsMHg5MCwKKzB4QjgsMHgzMCwweDdBLDB4QzEsMHhFOCwweDA0LDB4NDAsMHhBMywweEMwLDB4MTMsMHgyQiwweDA2LDB4MTIsMHgwMSwweEY3LDB4RDgsCisweDMzLDB4RDIsMHg4QiwweENBLDB4OEEsMHgwRSwweDk0LDB4MTIsMHhGNywweEYxLDB4M0QsMHg4MCwweDAwLDB4NzcsMHgwRSwweDZBLAorMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgyNSwweDlDLDB4MEUsMHhFOCwweDkwLDB4MEEsMHg5MCwweDQ4LDB4M0QsMHhGRiwKKzB4MDcsMHg3MiwweDAzLDB4QjgsMHhGRiwweDA3LDB4QTMsMHhDMiwweDEzLDB4MzMsMHhDOSwweDhBLDB4MEUsMHg5NCwweDEyLDB4MzMsCisweEY2LDB4QjgsMHgwMCwweDA5LDB4MkUsMHg4QiwweEFDLDB4NDQsMHgwMCwweDg5LDB4NDYsMHg0QywweDQwLDB4NDYsMHg0NiwweEUyLAorMHhGMywweDhBLDB4MEUsMHg5NCwweDEyLDB4MzMsMHhGNiwweDhCLDB4MTYsMHhDMCwweDEzLDB4QTEsMHhDMiwweDEzLDB4MkUsMHg4QiwKKzB4QUMsMHg0NCwweDAwLDB4RTgsMHgyMiwweEZGLDB4MDMsMHhEMCwweDQ2LDB4NDYsMHhFMiwweEYyLDB4QzMsMHgzMywweEMwLDB4MkUsCisweDhCLDB4QUQsMHg0NCwweDAwLDB4ODksMHg0NiwweDA4LDB4NDcsMHg0NywweEUyLDB4RjQsMHhDMywweDUxLDB4MzMsMHhDMCwweDBBLAorMHhDMiwweDJFLDB4OEIsMHhBRCwweDQ0LDB4MDAsMHg4OSwweDg2LDB4OUUsMHgwMCwweDgxLDB4NEUsMHgzOCwweDAwLDB4MjAsMHg0NywKKzB4NDcsMHhGRSwweEM0LDB4ODAsMHhGQywweDA0LDB4NzIsMHgwNCwweDMyLDB4RTQsMHhGRSwweEMwLDB4RTIsMHhFMywweDU5LDB4ODMsCisweEU5LDB4MTAsMHg3NCwweDA1LDB4RjcsMHhEOSwweEU4LDB4QzQsMHhGRiwweEMzLDB4NTEsMHgzMywweEMwLDB4MEEsMHhDMiwweDJFLAorMHg4QiwweEFELDB4NDQsMHgwMCwweDg5LDB4ODYsMHg5RSwweDAwLDB4ODMsMHg0RSwweDM4LDB4NDAsMHg0NywweDQ3LDB4ODAsMHhDNCwKKzB4MTAsMHg3OSwweDA0LDB4MzIsMHhFNCwweEZFLDB4QzAsMHhFMiwweEU2LDB4NTksMHg4MywweEU5LDB4MTAsMHg3NCwweDA1LDB4RjcsCisweEQ5LDB4RTgsMHg5OSwweEZGLDB4QzMsMHhFOCwweEQyLDB4RkYsMHhDMywweDhELDB4MDgsMHg5QywweDA4LDB4Q0EsMHgwOCwweEY1LAorMHgwOCwweDhCLDB4MEUsMHg0MiwweDEyLDB4MzMsMHhGNiwweDUxLDB4NTYsMHgzMywweERCLDB4OEIsMHhDQiwweDhBLDB4OTQsMHg0OCwKKzB4MTIsMHg4QSwweDhDLDB4NEMsMHgxMiwweDhBLDB4OUMsMHg1NCwweDEyLDB4OEIsMHhGRSwweEMxLDB4RTcsMHgwNSwweDg1LDB4REIsCisweDc1LDB4MDIsMHhCMSwweDEwLDB4MkUsMHhGRiwweDk3LDB4RjksMHgwOCwweDVFLDB4NTksMHg0NiwweEUyLDB4RDksMHhDMywweDAxLAorMHhDQywweDAzLDB4RDAsMHgwMCwweEU4LDB4MDIsMHhEMCwweDAwLDB4RTgsMHgwMSwweEQwLDB4MDAsMHhFOCwweDAwLDB4RDAsMHgwMCwKKzB4RTgsMHgwNCwweEQwLDB4QTgsMHhEQSwweDAwLDB4REMsMHgwMCwweERFLDB4MDEsMHhEOCwweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsCisweENDLDB4MDQsMHhEMCwweEE4LDB4REEsMHgyMCwweERDLDB4MDAsMHhERSwweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsMHhDQywweDAwLAorMHhEOCwweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMywKKzB4Q0MsMHgwMywweENDLDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsCisweENDLDB4MDQsMHhEMCwweDAwLDB4REEsMHgyMCwweERDLDB4MDMsMHhERSwweDAxLDB4RDgsMHgwMywweENDLDB4MDMsMHhDQywweDAzLAorMHhDQywweDAzLDB4Q0MsMHgwMCwweEQ4LDB4MDAsMHhDQywweDAwLDB4RDAsMHgwMCwweDAwLDB4NTYsMHg1MiwweDFFLDB4MEUsMHgxRiwKKzB4QkUsMHgyRiwweDA5LDB4MzMsMHhEMiwweEZDLDB4QUQsMHg4NSwweEMwLDB4NzQsMHgwRCwweDhBLDB4RDQsMHhFRSwweEFELDB4ODUsCisweEMwLDB4NzQsMHgwNSwweDhBLDB4RDQsMHhFRSwweEVCLDB4RUUsMHgxRiwweDVBLDB4NUUsMHhDMywweEU0LDB4ODAsMHg4NCwweEMwLAorMHg3NCwweDE2LDB4NzgsMHgxNCwweEIwLDB4MjcsMHhFNiwweEZDLDB4QjAsMHgxMSwweEU2LDB4MzQsMHhFNCwweEZDLDB4M0MsMHgyNywKKzB4NzUsMHgwNiwweEU0LDB4MTEsMHg3NSwweDAyLDB4RjgsMHhDMywweEY5LDB4QzMsMHg4MywweEMyLDB4MDYsMHhCMCwweEJGLDB4RUUsCisweDgzLDB4RUEsMHgwMiwweEIwLDB4MTAsMHhFRSwweDg4LDB4ODYsMHhBRiwweDAwLDB4QjAsMHgxMSwweDgzLDB4QzIsMHgwNCwweEVFLAorMHg4MywweEMyLDB4MDIsMHhFRSwweEIwLDB4MTMsMHg4MywweEMyLDB4MDIsMHhFRSwweDgzLDB4QzIsMHgwMiwweEVFLDB4MkUsMHhBMSwKKzB4NEMsMHgyRCwweDg5LDB4ODYsMHg5NCwweDAwLDB4ODMsMHhFQSwweDBFLDB4RUUsMHg4MywweEMyLDB4MDIsMHg4QSwweEM0LDB4RUUsCisweDgzLDB4QzIsMHgwNCwweEIwLDB4MDMsMHhFRSwweDg4LDB4ODYsMHhBOCwweDAwLDB4ODMsMHhFQSwweDA0LDB4MzIsMHhDMCwweEVFLAorMHg4MywweEMyLDB4MDIsMHhCMCwweDg5LDB4RUUsMHg4OCwweDg2LDB4QTYsMHgwMCwweDBDLDB4MDYsMHhFRSwweEIwLDB4NDAsMHhCNCwKKzB4MzgsMHg4OSwweDQ2LDB4MUMsMHhDNywweDQ2LDB4MzYsMHgzOCwweDAwLDB4ODMsMHhDMiwweDA0LDB4MzIsMHhDMCwweEVFLDB4ODgsCisweDg2LDB4QTcsMHgwMCwweEMzLDB4ODMsMHhDMiwweDA2LDB4QjAsMHhCRiwweEVFLDB4ODMsMHhFQSwweDAyLDB4RUMsMHgzQSwweDg2LAorMHhBRiwweDAwLDB4NzUsMHgyNCwweDgzLDB4QzIsMHgwNCwweEVDLDB4M0MsMHgxMSwweDc1LDB4MUMsMHg4MywweEMyLDB4MDYsMHhFQywKKzB4M0MsMHgxMywweDc1LDB4MTQsMHg4MywweEVBLDB4MDgsMHg4QSwweDg2LDB4QTgsMHgwMCwweEVFLDB4ODMsMHhFQSwweDAyLDB4RUMsCisweDI0LDB4QzAsMHgzQywweEMwLDB4NzUsMHgwMiwweEY4LDB4QzMsMHhGOSwweEMzLDB4MzMsMHhDOSwweDhCLDB4RDEsMHg4QiwweEYxLAorMHg4QSwweDBFLDB4OTQsMHgxMiwweEMxLDB4RTksMHgwMiwweDJFLDB4OEIsMHhBQywweDQ0LDB4MDAsMHhGNywweDQ2LDB4MzgsMHgwMCwKKzB4MjAsMHg3NCwweDBFLDB4OEEsMHg4NiwweDlFLDB4MDAsMHhFNiwweEZFLDB4MzIsMHhDMCwweEU2LDB4ODAsMHg0MiwweEU4LDB4RkEsCisweEZFLDB4ODMsMHhDNiwweDA4LDB4RTIsMHhFMSwweDg1LDB4RDIsMHg3NCwweDAzLDB4RTgsMHgwNSwweDA4LDB4QzMsMHgzMywweEM5LAorMHg4QiwweEYxLDB4OEEsMHgwRSwweDk0LDB4MTIsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLDB4RjcsMHg0NiwweDM4LDB4NDAsMHgwMCwKKzB4NzQsMHgwNiwweEU4LDB4NzMsMHgxNiwweEU4LDB4MTIsMHhGRiwweDQ2LDB4NDYsMHhFMiwweEVBLDB4QzMsMHgzMywweEM5LDB4OEIsCisweEYxLDB4OEEsMHgwRSwweDk0LDB4MTIsMHhDMSwweEU5LDB4MDIsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLDB4RjcsMHg0NiwweDM4LAorMHgwMCwweDIwLDB4NzQsMHgxNiwweEU4LDB4NDYsMHgxNiwweEU4LDB4RDIsMHhGRSwweDczLDB4MEUsMHg2QSwweDAwLDB4MUYsMHhDNiwKKzB4MDYsMHg5MywweDEyLDB4MUMsMHg5QywweDBFLDB4RTgsMHhFMywweDA3LDB4OTAsMHg4MywweEM2LDB4MDgsMHhFMiwweEQ5LDB4QzMsCisweDMzLDB4QzksMHg4QiwweEYxLDB4OEEsMHgwRSwweDk0LDB4MTIsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLDB4RjcsMHg0NiwweDM4LAorMHg0MCwweDAwLDB4NzQsMHgxNiwweEU4LDB4MjEsMHgxNiwweEU4LDB4MkEsMHhGRiwweDczLDB4MEUsMHg2QSwweDAwLDB4MUYsMHhDNiwKKzB4MDYsMHg5MywweDEyLDB4MUMsMHg5QywweDBFLDB4RTgsMHhCMywweDA3LDB4OTAsMHg0NiwweDQ2LDB4RTIsMHhEQSwweEMzLDB4MEMsCisweDAwLDB4MDAsMHgxMCwweDAwLDB4MTMsMHgxMiwweDAwLDB4MDAsMHgxNCwweDAwLDB4MjgsMHgzQywweDAwLDB4MUIsMHgzRSwweDAwLAorMHgwMCwweDJBLDB4MDAsMHgwMCwweDJDLDB4MDAsMHgwMCwweDQyLDB4MDAsMHgxNCwweEQ4LDB4MDAsMHgwMCwweERBLDB4MDAsMHgwMCwKKzB4MzQsMHgwMCwweDExLDB4MzYsMHgwMCwweDEzLDB4MzgsMHgwMCwweDExLDB4M0EsMHgwMCwweDEzLDB4MDAsMHgwMCwweDU2LDB4NTAsCisweDUyLDB4QkUsMHgyRiwweDBCLDB4MkUsMHhBRCwweDg1LDB4QzAsMHg3NCwweDA2LDB4OTIsMHgyRSwweEFDLDB4RUUsMHhFQiwweEY0LAorMHg1QSwweDU4LDB4NUUsMHhDMywweDUzLDB4MkUsMHhBMSwweDYwLDB4MjIsMHhFNiwweEU0LDB4RTYsMHhGMCwweDhBLDB4QzQsMHhFNiwKKzB4RUMsMHhFNiwweEY4LDB4RTgsMHhEOCwweEZGLDB4QjAsMHg0QiwweEU2LDB4MTAsMHhCMCwweDUwLDB4RTYsMHgxMiwweEIwLDB4MzgsCisweEU2LDB4MTQsMHhFOCwweEFFLDB4MTUsMHhCMCwweDQ2LDB4RTYsMHgwQSwweEU4LDB4QTcsMHgxNSwweEIwLDB4MUEsMHhFNiwweDBBLAorMHhFOCwweEEwLDB4MTUsMHhCMCwweDIyLDB4RTYsMHgwQSwweEU4LDB4OTksMHgxNSwweEU4LDB4RkQsMHgwNiwweDhCLDB4RDgsMHhFNCwKKzB4MTYsMHhBOCwweDA0LDB4NzUsMHgxOCwweEU4LDB4RjIsMHgwNiwweDJCLDB4QzMsMHgzRCwweDMyLDB4MDAsMHg3MiwweEYwLDB4NkEsCisweDAwLDB4MUYsMHhDNiwweDA2LDB4OTMsMHgxMiwweDIzLDB4OUMsMHgwRSwweEU4LDB4MTAsMHgwNywweDkwLDB4RTgsMHhEQSwweDA2LAorMHgyQiwweEMzLDB4M0QsMHgyNCwweDAwLDB4NzcsMHgxQiwweEIwLDB4MzEsMHhFNiwweEZDLDB4NTYsMHg1MSwweDU1LDB4QjksMHgxMCwKKzB4MDAsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLDB4ODEsMHg0RSwweDM4LDB4ODAsMHgwMCwweDQ2LDB4NDYsMHhFMiwweEYyLDB4NUQsCisweDU5LDB4NUUsMHhFOCwweDY5LDB4RkYsMHhFOCwweDRCLDB4MTUsMHhCMCwweDQ2LDB4RTYsMHgwQSwweEU4LDB4NDQsMHgxNSwweDVCLAorMHhDMywweDMzLDB4RjYsMHg4QiwweDBFLDB4NDIsMHgxMiwweDJFLDB4OEIsMHhBQywweDQ0LDB4MDAsMHhGNywweDQ2LDB4MzgsMHgwMCwKKzB4MjAsMHg3NCwweDA2LDB4RTgsMHgxNywweDE1LDB4RTgsMHg1QiwweEZGLDB4ODMsMHhDNiwweDIwLDB4RTIsMHhFOSwweEMzLDB4OEIsCisweEMyLDB4MDUsMHgwNCwweDAwLDB4ODksMHg0NiwweDI4LDB4MkUsMHhBMSwweDRDLDB4MkQsMHg4OSwweDg2LDB4OEUsMHgwMCwweDg5LAorMHg4NiwweDkwLDB4MDAsMHg4OSwweDg2LDB4OTIsMHgwMCwweEM2LDB4ODYsMHhBMywweDAwLDB4MEEsMHhDNiwweDg2LDB4QzMsMHgwMCwKKzB4MDMsMHg1MiwweDgzLDB4QzIsMHgwNCwweDhBLDB4ODYsMHhBNiwweDAwLDB4MEMsMHgwNiwweEVFLDB4NUEsMHg4MywweEMyLDB4MDIsCisweEIwLDB4MDUsMHhFRSwweDg4LDB4ODYsMHhBNSwweDAwLDB4QzMsMHhFOCwweDAzLDB4RkYsMHhFOCwweEU1LDB4MTQsMHhCMCwweDQyLAorMHhFNiwweDBBLDB4RjcsMHg0NiwweDM4LDB4ODAsMHgwMCwweDc0LDB4MDYsMHgyRSwweEExLDB4OUMsMHgyMiwweEVCLDB4MDQsMHgyRSwKKzB4QTEsMHg2QywweDIyLDB4QzcsMHg0NiwweDFDLDB4MEMsMHgwMCwweDg5LDB4ODYsMHg5NCwweDAwLDB4ODksMHg4NiwweDk2LDB4MDAsCisweDg5LDB4ODYsMHg4RSwweDAwLDB4ODksMHg4NiwweDkwLDB4MDAsMHg4OSwweDg2LDB4OTIsMHgwMCwweEU2LDB4RjAsMHhFNiwweEU0LAorMHg4QSwweEM0LDB4RTYsMHhGOCwweEU2LDB4RUMsMHhDNiwweDg2LDB4QzMsMHgwMCwweDAzLDB4RTgsMHhBNSwweDE0LDB4QjAsMHgxQSwKKzB4RTYsMHgwQSwweEIwLDB4MTAsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHhDMywweDMzLDB4QzksMHg4QiwweEYxLDB4OEEsCisweDBFLDB4OTQsMHgxMiwweDJFLDB4OEIsMHhBQywweDQ0LDB4MDAsMHhGNywweDQ2LDB4MzgsMHg0MCwweDAwLDB4NzQsMHgwNiwweEU4LAorMHg3NiwweDE0LDB4RTgsMHg1QSwweEZGLDB4NDYsMHg0NiwweEUyLDB4RUEsMHhDMywweDMzLDB4QzksMHg4QiwweEYxLDB4OEEsMHgwRSwKKzB4OTQsMHgxMiwweDJFLDB4OEIsMHhBQywweDQ0LDB4MDAsMHhGNywweDQ2LDB4MzgsMHgwMCwweDIwLDB4NzQsMHgwNiwweEU4LDB4NEMsCisweDE0LDB4RTgsMHg3NCwweEZGLDB4NDYsMHg0NiwweEUyLDB4RUEsMHhDMywweDkwLDB4ODMsMHgzRSwweDQ0LDB4MTIsMHgwMCwweDc1LAorMHgxNCwweEIwLDB4MDEsMHhCQSwweDA2LDB4MDEsMHhFRSwweDJBLDB4QzAsMHhFRSwweEIwLDB4MDIsMHhFRSwweEIwLDB4MDQsMHhFRSwKKzB4QjgsMHgwMCwweDAyLDB4RUIsMHgwRiwweEJBLDB4MDYsMHgwMSwweEIwLDB4NDAsMHhFRSwweEI4LDB4MDEsMHgwMCwweDhBLDB4MEUsCisweDBFLDB4MDEsMHhEMywweEUwLDB4QTMsMHg4OCwweDEyLDB4QzMsMHhBMSwweDg4LDB4MTIsMHhBMywweDg0LDB4MTIsMHgyRCwweDIwLAorMHgwMCwweEEzLDB4OEEsMHgxMiwweDJELDB4MjAsMHgwMCwweEEzLDB4ODIsMHgxMiwweEM3LDB4MDYsMHg4NiwweDEyLDB4MjAsMHgwMCwKKzB4QzcsMHgwNiwweDgwLDB4MTIsMHgzMiwweDAwLDB4QzMsMHg4MywweDNFLDB4NDQsMHgxMiwweDAwLDB4NzQsMHg3NiwweDhCLDB4MEUsCisweDQyLDB4MTIsMHgzMywweEY2LDB4OEEsMHhBNCwweDU0LDB4MTIsMHg4NCwweEU0LDB4NzQsMHg1RiwweDhBLDB4ODQsMHg0OCwweDEyLAorMHgwQywweDA0LDB4RTYsMHhGRSwweEY2LDB4QzQsMHgwNCwweDc0LDB4MjUsMHhCMCwweDFCLDB4QkEsMHgwMCwweDAwLDB4RUUsMHhFQiwKKzB4MDAsMHgyQSwweEMwLDB4QkEsMHgwMiwweDAwLDB4RUUsMHhFQiwweDAwLDB4QjAsMHgwMywweEVFLDB4RUIsMHgwMCwweDMyLDB4QzAsCisweEJBLDB4MDIsMHgwMCwweEVFLDB4RUIsMHgwMCwweEJBLDB4MDAsMHgwMCwweEIwLDB4MDAsMHhFRSwweEVCLDB4MkQsMHhCMCwweDFGLAorMHhCQSwweDAwLDB4MDAsMHhFRSwweEVCLDB4MDAsMHgyQSwweEMwLDB4QkEsMHgwMiwweDAwLDB4RUUsMHhFQiwweDAwLDB4QjAsMHgwMywKKzB4RUUsMHhFQiwweDAwLDB4RDEsMHhFNiwweDhBLDB4ODQsMHg1RCwweDEyLDB4RDEsMHhFRSwweEY2LDB4RDAsMHhCQSwweDAyLDB4MDAsCisweEVFLDB4RUIsMHgwMCwweEJBLDB4MDAsMHgwMCwweEIwLDB4MEEsMHhFRSwweEVCLDB4MDAsMHhFNCwweDA0LDB4RUIsMHgwMCwweEU0LAorMHgwNCwweDQ2LDB4RTIsMHg5MCwweEMzLDB4OTAsMHhCOCwweDE0LDB4MDAsMHhCQSwweDNFLDB4RkYsMHhFRiwweEI4LDB4MDYsMHgwMCwKKzB4QkEsMHgzMiwweEZGLDB4RUYsMHhCOCwweDBGLDB4MDAsMHhCQSwweDM0LDB4RkYsMHhFRiwweEJBLDB4MzYsMHhGRiwweEVGLDB4ODMsCisweDNFLDB4NDQsMHgxMiwweDAwLDB4NzUsMHgxNiwweEI4LDB4MTEsMHgwMCwweEJBLDB4MzgsMHhGRiwweEVGLDB4QjgsMHgxMiwweDAwLAorMHhCQSwweDNBLDB4RkYsMHhFRiwweEI4LDB4MUIsMHgwMCwweEJBLDB4M0MsMHhGRiwweEVGLDB4QzMsMHhCOCwweDExLDB4MDAsMHhCQSwKKzB4MzgsMHhGRiwweEVGLDB4QjgsMHgxMiwweDAwLDB4QkEsMHgzQSwweEZGLDB4RUYsMHhCOCwweDFCLDB4MDAsMHhCQSwweDNDLDB4RkYsCisweEVGLDB4QzMsMHhCOCwweEZDLDB4MDAsMHhCQSwweDI4LDB4RkYsMHhFRiwweEZCLDB4ODMsMHgzRSwweDQ0LDB4MTIsMHgwMCwweDc0LAorMHgwNywweEI4LDB4Q0MsMHgwMCwweEJBLDB4MjgsMHhGRiwweEVGLDB4QzMsMHgwMCwweEZGLDB4RkYsMHgyMCwweDI0LDB4MjgsMHhGRiwKKzB4MkMsMHhGRiwweEZGLDB4MzAsMHgzNCwweDM4LDB4RkYsMHhGRiwweDNDLDB4OTAsMHgzQywweDBGLDB4NzcsMHgwRSwweEJCLDB4MTksCisweDBFLDB4MkUsMHhENywweDNDLDB4RkYsMHg3NCwweDA1LDB4OEEsMHhEOCwweEY4LDB4QzMsMHg5MCwweDJBLDB4REIsMHhGOSwweEMzLAorMHg4MywweDNFLDB4NDQsMHgxMiwweDAwLDB4NzQsMHgyNywweEEwLDB4MDYsMHgwMSwweDgwLDB4MjYsMHgwNiwweDAxLDB4MzAsMHg4MCwKKzB4M0UsMHgwNiwweDAxLDB4MzAsMHg3NSwweDE4LDB4QjksMHgwMiwweDAwLDB4QkYsMHhDNCwweDEzLDB4QkEsMHgwNiwweDAxLDB4RUMsCisweEE4LDB4MjAsMHg3NSwweEY4LDB4QkEsMHgwNCwweDAxLDB4RUQsMHhBQiwweEUyLDB4RjEsMHhFQiwweDE2LDB4OTAsMHhCOSwweDA0LAorMHgwMCwweEJGLDB4QzQsMHgxMywweEJBLDB4MDYsMHgwMSwweEVDLDB4QTgsMHgyMCwweDc1LDB4RjgsMHhCQSwweDA0LDB4MDEsMHhFQywKKzB4QUEsMHhFMiwweEYxLDB4RkEsMHg5MCwweEJFLDB4QzQsMHgxMywweEFELDB4ODAsMHhFNCwweDNGLDB4ODAsMHhGQywweDAyLDB4NzQsCisweDBFLDB4NkEsMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgwQSwweDlDLDB4MEUsMHhFOCwweDNFLDB4MDQsMHg5MCwweEFELAorMHgzQywweDBGLDB4NzUsMHhFRCwweDhBLDB4QzQsMHhFOCwweDgxLDB4RkYsMHg3MiwweEU2LDB4ODgsMHgxRSwweDFBLDB4MDEsMHhDNiwKKzB4MDYsMHg4RSwweDEyLDB4MDAsMHhCMCwweDAwLDB4MEEsMHgwNiwweDFBLDB4MDEsMHhCQSwweDAwLDB4MDEsMHhFRSwweEM2LDB4MDYsCisweDhGLDB4MTIsMHg0MCwweDgzLDB4M0UsMHg0NCwweDEyLDB4MDAsMHg3NSwweDA2LDB4QjgsMHgwQywweDAwLDB4RUIsMHgwNCwweDkwLAorMHhCOCwweDRDLDB4MDAsMHhCQSwweDI4LDB4RkYsMHhFRiwweEMzLDB4ODMsMHgzRSwweDQ0LDB4MTIsMHgwMCwweDc1LDB4MDEsMHhDMywKKzB4QTEsMHg1MCwweDEyLDB4MEIsMHgwNiwweDUyLDB4MTIsMHgwQSwweEM0LDB4QTgsMHgwOCwweDc0LDB4RjIsMHhBMCwweDBGLDB4MDEsCisweDJBLDB4RTQsMHg1MCwweEZGLDB4MzYsMHhCQSwweDEzLDB4MUYsMHhFOCwweDUwLDB4NTYsMHg4MywweEM0LDB4MDIsMHg2QSwweDAwLAorMHgxRiwweDMzLDB4QzAsMHhBMywweEJDLDB4MTMsMHhBMCwweDBGLDB4MDEsMHhBMywweEJFLDB4MTMsMHg4QiwweDFFLDB4QkMsMHgxMywKKzB4OEEsMHg4NywweDUwLDB4MTIsMHhGNiwweDg3LDB4NTAsMHgxMiwweDA4LDB4NzQsMHgwRCwweDI0LDB4MDcsMHg4QSwweEUwLDB4QkUsCisweENDLDB4MDAsMHhBMCwweEJDLDB4MTMsMHhFOCwweDk0LDB4M0QsMHhGRiwweDA2LDB4QkMsMHgxMywweEZGLDB4MEUsMHhCRSwweDEzLAorMHg3NSwweERBLDB4QzMsMHg5MCwweDFFLDB4MzMsMHhDMCwweDhFLDB4RDgsMHhCMCwweDAxLDB4RTgsMHg1NCwweDNELDB4MUYsMHhDMywKKzB4MzMsMHhDOSwweDhCLDB4RjEsMHg4QSwweDBFLDB4OTQsMHgxMiwweDJFLDB4OEIsMHhBQywweDQ0LDB4MDAsMHhDNywweDQ2LDB4NjIsCisweDM4LDB4NDQsMHhDNywweDQ2LDB4N0MsMHhGQywweDNCLDB4QzcsMHg0NiwweDdFLDB4RTIsMHgzQiwweEM3LDB4ODYsMHg4MCwweDAwLAorMHhFQywweDNDLDB4RTgsMHhBQiwweDE2LDB4QzYsMHg4NiwweEMwLDB4MDAsMHgxMSwweDgzLDB4N0UsMHgwOCwweDAwLDB4NzQsMHgwNywKKzB4NTEsMHg1NiwweEU4LDB4MzMsMHgzMywweDVFLDB4NTksMHg0NiwweDQ2LDB4RTIsMHhDRCwweEMzLDB4MzMsMHhDOSwweDhCLDB4RjEsCisweDhCLDB4RjksMHg4QSwweDBFLDB4OTQsMHgxMiwweEMxLDB4RTksMHgwMiwweEUzLDB4MTMsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLAorMHg4QSwweDg2LDB4OUUsMHgwMCwweDg4LDB4ODUsMHg2QywweDEyLDB4ODMsMHhDNiwweDA4LDB4NDcsMHhFMiwweEVELDB4QzMsMHhGQSwKKzB4RkMsMHhCMCwweEMwLDB4QkEsMHgwMCwweDAxLDB4RUUsMHgzMywweEMwLDB4OEUsMHhEOCwweDhFLDB4QzAsMHg4RSwweEQwLDB4QkYsCisweDE2LDB4MDEsMHhCOSwweENDLDB4NzcsMHgyQiwweENGLDB4RDEsMHhFOSwweEYzLDB4QUIsMHhCQywweDQwLDB4MTIsMHhFOCwweEQ5LAorMHgwMiwweEU4LDB4NzAsMHgzQywweEJFLDB4Q0MsMHgwRiwweEU4LDB4RjIsMHgzQywweEY0LDB4OTAsMHgzMywweEMwLDB4OEUsMHhEOCwKKzB4OEUsMHhDMCwweDhFLDB4RDAsMHhGNiwweDA2LDB4MEEsMHgwMSwweDgwLDB4NzQsMHgwQiwweEJFLDB4MzUsMHg1NSwweEU4LDB4REIsCisweDNDLDB4QjAsMHgwMSwweEU4LDB4QUMsMHgzQywweEU4LDB4QjMsMHgwMCwweEU4LDB4RjYsMHhGNSwweEU4LDB4MDgsMHhGOCwweEU4LAorMHgwRiwweEY5LDB4RTgsMHg4NSwweEZBLDB4RTgsMHhCNiwweEZBLDB4RTgsMHhFRiwweEZDLDB4RTgsMHhDMiwweDEwLDB4RTgsMHgwMywKKzB4M0MsMHhFOCwweEIyLDB4RkQsMHhFOCwweDMwLDB4RkQsMHhFOCwweDU0LDB4MDIsMHhDNiwweDA2LDB4OEYsMHgxMiwweEMwLDB4RTgsCisweEJCLDB4RkEsMHhFOCwweEVCLDB4RkEsMHhFOCwweEU5LDB4RkIsMHhFOCwweEFGLDB4RkMsMHhFOCwweDhELDB4RkMsMHhFOCwweDFGLAorMHhGRiwweEU4LDB4NTgsMHhGRiwweEU4LDB4REIsMHhGRCwweEU4LDB4MTYsMHhGRSwweDMzLDB4QzAsMHhCRSwweDVBLDB4MDUsMHhFOCwKKzB4OEEsMHgzQywweEU4LDB4QTMsMHhGRSwweEU4LDB4RTAsMHhGQywweEZCLDB4QkUsMHhBNCwweDQ0LDB4RTgsMHg3RCwweDNDLDB4RTksCisweENBLDB4MkQsMHg1NiwweDk4LDB4OEIsMHhGMCwweDhCLDB4NDIsMHg1MiwweDg1LDB4QzAsMHg3NSwweDI3LDB4QzcsMHg0MiwweDUyLAorMHgwMSwweDAwLDB4NTMsMHgzNiwweDhCLDB4OUMsMHgyQywweDAxLDB4RjYsMHhDMywweDAxLDB4NzUsMHgwQywweDM2LDB4ODksMHg2OCwKKzB4NTIsMHgzNiwweDg5LDB4QUMsMHgyQywweDAxLDB4NUIsMHg1RSwweEMzLDB4MzYsMHg4OSwweEFDLDB4MkMsMHgwMSwweDM2LDB4ODksCisweEFDLDB4MUMsMHgwMSwweDVCLDB4NUUsMHhDMywweDU2LDB4OTgsMHg4QiwweEYwLDB4MzMsMHhFRCwweDM2LDB4OEIsMHg4NCwweDFDLAorMHgwMSwweEE4LDB4MDEsMHg3NSwweDE1LDB4OEIsMHhFOCwweDMzLDB4QzAsMHg4NywweDQyLDB4NTIsMHgzNiwweDg5LDB4ODQsMHgxQywKKzB4MDEsMHhBOCwweDAxLDB4NzQsMHgwNSwweDM2LDB4ODksMHg4NCwweDJDLDB4MDEsMHg1RSwweEMzLDB4NTYsMHg1MSwweDMzLDB4RjYsCisweEI4LDB4MDEsMHgwMCwweEI5LDB4MDgsMHgwMCwweDg5LDB4ODQsMHgxQywweDAxLDB4ODksMHg4NCwweDJDLDB4MDEsMHg0NiwweDQ2LAorMHhFMiwweEY0LDB4NTksMHg1RSwweEMzLDB4OTAsMHhCQiwweDAxLDB4MDAsMHg4QiwweEU4LDB4RkYsMHg0RSwweDZFLDB4NzQsMHgwQSwKKzB4OEIsMHhERCwweDhCLDB4NDYsMHg1OCwweEE4LDB4MDEsMHg3NCwweEYwLDB4QzMsMHg4QiwweDQ2LDB4NDgsMHhBOSwweDA4LDB4MDAsCisweDc0LDB4NDUsMHhGNywweDQ2LDB4MzgsMHg0MCwweDAwLDB4NzQsMHgyNywweEU4LDB4NUMsMHgxMCwweDgwLDB4QzIsMHgwNiwweDhBLAorMHg4NiwweEE4LDB4MDAsMHgyNCwweEJGLDB4ODgsMHg4NiwweEE4LDB4MDAsMHhFRSwweDYwLDB4QjAsMHhGRSwweEU4LDB4ODYsMHgzMiwKKzB4NjEsMHhCMCwweDAyLDB4RTgsMHg0QywweEZGLDB4OEIsMHg0NiwweDQ4LDB4MjQsMHhGNywweDg5LDB4NDYsMHg0OCwweEVCLDB4MTcsCisweEU4LDB4MkEsMHgxMCwweDgxLDB4NEUsMHgyNiwweDAwLDB4NDAsMHg4QSwweDg2LDB4QTUsMHgwMCwweDBDLDB4MDIsMHg4OCwweDg2LAorMHhBNSwweDAwLDB4RTYsMHgwQywweDhCLDB4NDYsMHg0OCwweEE5LDB4MDQsMHgwMCwweDc0LDB4MTQsMHhCMCwweDAyLDB4RTgsMHgyMSwKKzB4RkYsMHg4QiwweDQ2LDB4NDgsMHgyNCwweEZCLDB4ODksMHg0NiwweDQ4LDB4NjAsMHhCMCwweERGLDB4RTgsMHg0NywweDMyLDB4NjEsCisweDMzLDB4QzAsMHg4NywweDQ2LDB4NTgsMHhGNiwweEMzLDB4MDEsMHg3NSwweDBCLDB4MzYsMHg4OSwweDQ3LDB4NTgsMHhBOCwweDAxLAorMHg3NSwweDBELDB4RTksMHg3NCwweEZGLDB4QTMsMHgyMiwweDAxLDB4QTgsMHgwMSwweDc1LDB4MDMsMHhFOSwweDZBLDB4RkYsMHg4OSwKKzB4MUUsMHgzMiwweDAxLDB4QzMsMHhCQiwweDAxLDB4MDAsMHg4QiwweEU4LDB4RjcsMHg0NiwweDM4LDB4NDAsMHgwMCwweDc0LDB4MTUsCisweEU4LDB4RDUsMHgwRiwweDgwLDB4QzIsMHgwQSwweEVDLDB4QTgsMHg0MCwweDc1LDB4MEEsMHg4QiwweERELDB4OEIsMHg0NiwweDU2LAorMHhBOCwweDAxLDB4NzQsMHhFMywweEMzLDB4OEIsMHg0NiwweDI2LDB4ODAsMHhFNCwweEZFLDB4ODAsMHhDQywweDAyLDB4ODksMHg0NiwKKzB4MjYsMHhCMCwweDAyLDB4RTgsMHhCQywweEZFLDB4MzMsMHhDMCwweDg3LDB4NDYsMHg1NiwweEY2LDB4QzMsMHgwMSwweDc1LDB4MEEsCisweDM2LDB4ODksMHg0NywweDU2LDB4QTgsMHgwMSwweDc1LDB4MEIsMHhFQiwweEJELDB4QTMsMHgyMCwweDAxLDB4QTgsMHgwMSwweDc1LAorMHgwMiwweEVCLDB4QjQsMHg4OSwweDFFLDB4MzAsMHgwMSwweEMzLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMCwKKzB4OTAsMHgxMiwweDg0LDB4QzAsMHg3NSwweDQ5LDB4QTEsMHgyMiwweDAxLDB4QTgsMHgwMSwweDc1LDB4MDMsMHhFOCwweEY2LDB4RkUsCisweEExLDB4MjAsMHgwMSwweEE4LDB4MDEsMHg3NSwweDAzLDB4RTgsMHg4QSwweEZGLDB4QTEsMHhBQywweDEzLDB4NDgsMHg3OCwweDA1LAorMHg3NCwweDQ1LDB4QTMsMHhBQywweDEzLDB4QTEsMHhBRSwweDEzLDB4NDgsMHg3OCwweDA1LDB4NzQsMHg1MSwweEEzLDB4QUUsMHgxMywKKzB4QTEsMHhCMCwweDEzLDB4NDgsMHg3OCwweDA1LDB4NzQsMHg2MywweEEzLDB4QjAsMHgxMywweEExLDB4N0UsMHgxMiwweDQwLDB4NzgsCisweDAzLDB4QTMsMHg3RSwweDEyLDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLDB4RUYsMHgwNywweDFGLDB4NjEsMHhDRiwweEEwLAorMHg5MSwweDEyLDB4NDAsMHgzQywweDAyLDB4NzIsMHgwQiwweDMzLDB4QzAsMHhBMiwweDkxLDB4MTIsMHhGRiwweDE2LDB4N0MsMHgxMiwKKzB4RUIsMHhBNCwweEEyLDB4OTEsMHgxMiwweEVCLDB4OUYsMHhBMCwweDhFLDB4MTIsMHgzMiwweDA2LDB4OEYsMHgxMiwweEEyLDB4OEUsCisweDEyLDB4MEEsMHgwNiwweDFBLDB4MDEsMHhCQSwweDAwLDB4MDEsMHhFRSwweEI4LDB4MkMsMHgwMSwweEVCLDB4QTQsMHg4MywweDNFLAorMHg4NCwweDEyLDB4MTAsMHg3MiwweDExLDB4QkEsMHgyOCwweEZGLDB4RUQsMHgwQywweDgxLDB4RUYsMHhFOCwweDUzLDB4MzcsMHhCQSwKKzB4MjgsMHhGRiwweEVELDB4MjQsMHg3RSwweEVGLDB4QjgsMHgwNCwweDAwLDB4RUIsMHg5MiwweEM2LDB4MDYsMHg4RCwweDEyLDB4MDEsCisweEU4LDB4M0YsMHgzNywweEM2LDB4MDYsMHg4RCwweDEyLDB4MDAsMHhBMSwweEIyLDB4MTMsMHhFQiwweDhCLDB4OTAsMHg4QSwweDFFLAorMHgwQiwweDAxLDB4MkEsMHhGRiwweDZCLDB4QzMsMHgxOSwweEJBLDB4NjIsMHhGRiwweEVGLDB4QjgsMHgwQSwweDAwLDB4QkEsMHg2MCwKKzB4RkYsMHhFRiwweEI4LDB4MDEsMHhFMCwweEJBLDB4NjYsMHhGRiwweEVGLDB4QjgsMHhGRiwweEZGLDB4QkEsMHg1MiwweEZGLDB4RUYsCisweEI4LDB4MDksMHhDMCwweEJBLDB4NTYsMHhGRiwweEVGLDB4QzcsMHgwNiwweEFDLDB4MTMsMHgyQywweDAxLDB4QzcsMHgwNiwweEFFLAorMHgxMywweDA0LDB4MDAsMHhDNiwweDA2LDB4OTEsMHgxMiwweDAwLDB4QzMsMHg5MCwweDhBLDB4MUUsMHgwQiwweDAxLDB4MkEsMHhGRiwKKzB4NkIsMHhDMywweDA1LDB4RDEsMHhFOCwweEEzLDB4MTgsMHgwMSwweEMzLDB4OTAsMHg1MiwweEJBLDB4NTAsMHhGRiwweEVELDB4NUEsCisweEMzLDB4OTAsMHg1MywweDUxLDB4OEIsMHgxRSwweDE4LDB4MDEsMHhCOSwweDMyLDB4MDUsMHg5MCwweEUyLDB4RkUsMHg0QiwweDc1LAorMHhGNywweDU5LDB4NUIsMHhDMywweEIwLDB4ODAsMHhCQSwweDAwLDB4MDEsMHgwQSwweDA2LDB4MUEsMHgwMSwweEVFLDB4QzMsMHg5MCwKKzB4QjAsMHg0MCwweEVCLDB4RjIsMHhCMCwweEMwLDB4RUIsMHhFRSwweEIwLDB4MDAsMHhFQiwweEVBLDB4RkEsMHg2MCwweDA2LDB4MUUsCisweDE2LDB4MkIsMHhEQiwweDhFLDB4REIsMHgyRSwweEExLDB4QkEsMHg0QywweDJFLDB4QTMsMHg5MiwweDRDLDB4QTAsMHg5MywweDEyLAorMHg5OCwweDhCLDB4RTgsMHg4OSwweDI2LDB4MkQsMHg3QSwweDgwLDB4M0UsMHhDQSwweDEzLDB4MDAsMHg3NCwweDAzLDB4RTksMHg2QiwKKzB4NDIsMHhFOCwweEMwLDB4RkYsMHhFOCwweEFCLDB4RkYsMHhFOCwweEE4LDB4RkYsMHhCMCwweDIwLDB4QzYsMHgwNiwweDkwLDB4MTIsCisweDAwLDB4RkYsMHgxNiwweDdDLDB4MTIsMHg4QiwweEZELDB4ODMsMHhGRiwweDBBLDB4NzIsMHgxMSwweEU4LDB4QjksMHhGRiwweEU4LAorMHg5MCwweEZGLDB4RTgsMHhBQiwweEZGLDB4RTgsMHg4QSwweEZGLDB4ODMsMHhFRiwweDBBLDB4RUIsMHhFQSwweDBCLDB4RkYsMHg3NCwKKzB4MEYsMHhFOCwweEE0LDB4RkYsMHhFOCwweDdCLDB4RkYsMHhFOCwweDlBLDB4RkYsMHhFOCwweDc1LDB4RkYsMHg0RiwweDc1LDB4RjEsCisweEU4LDB4OTUsMHhGRiwweEU4LDB4NkMsMHhGRiwweEVCLDB4QjksMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RkQsMHhFRSwweDg4LAorMHg4NiwweEE1LDB4MDAsMHhDMywweDhBLDB4ODYsMHhBNiwweDAwLDB4MEMsMHgwMiwweEVFLDB4QzMsMHg4QiwweDc2LDB4MzgsMHhGNywKKzB4QzYsMHgwMSwweDAwLDB4NzQsMHhFRiwweDhCLDB4NEUsMHgzNiwweDhCLDB4NDYsMHgyRSwweDNCLDB4QzEsMHg3MywweDAyLDB4OEIsCisweEM4LDB4MkIsMHhDMSwweDg5LDB4NDYsMHgyRSwweDAxLDB4NEUsMHgzNCwweEM0LDB4N0UsMHgwNCwweDI2LDB4MDEsMHgwRCwweDhCLAorMHg3RSwweDJDLDB4ODMsMHhFQSwweDA0LDB4RjMsMHg2QywweDhFLDB4QzEsMHg4OSwweDdFLDB4MkMsMHgzQiwweDQ2LDB4M0MsMHg3MiwKKzB4MTIsMHhGNywweEM2LDB4MjAsMHgwMCwweDc1LDB4MEIsMHg4MywweENFLDB4MjAsMHg4OSwweDc2LDB4MzgsMHhCMCwweDAwLDB4RTgsCisweEEwLDB4RkMsMHhDMywweEY3LDB4QzYsMHgwNCwweDAwLDB4NzQsMHgxQiwweDhCLDB4RDgsMHg4MywweENFLDB4MTAsMHg4OSwweDc2LAorMHgzOCwweDhBLDB4ODYsMHhBNywweDAwLDB4MjQsMHhGRSwweDg4LDB4ODYsMHhBNywweDAwLDB4ODMsMHhDMiwweDA4LDB4RUUsMHg4MywKKzB4RUEsMHgwOCwweDhCLDB4QzMsMHgzRCwweDQwLDB4MDAsMHg3MiwweDAxLDB4QzMsMHg4MSwweDRFLDB4MzgsMHgwMCwweDA0LDB4ODMsCisweEMyLDB4MDIsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RkEsMHg4OCwweDg2LDB4QTUsMHgwMCwweEVFLDB4QzMsMHg4QSwweDg2LAorMHhBNiwweDAwLDB4MEMsMHgwMiwweEVFLDB4QzMsMHhGNywweDQ2LDB4MzgsMHgwMSwweDAwLDB4NzQsMHhGMSwweDhCLDB4NEUsMHgyRSwKKzB4MzIsMHhEQiwweDhBLDB4QkUsMHhBMywweDAwLDB4ODMsMHhDMiwweDA2LDB4QzQsMHg3NiwweDA0LDB4OEIsMHg3RSwweDJDLDB4ODMsCisweEY5LDB4MDgsMHg3MiwweDJDLDB4RUMsMHhBOCwweDAxLDB4NzQsMHgxNiwweDhBLDB4RTAsMHg4MywweEVBLDB4MEEsMHhFQywweDgzLAorMHhDMiwweDBBLDB4ODQsMHhFNywweDc1LDB4NTEsMHhBQSwweEZFLDB4QzMsMHg0OSwweDgzLDB4RjksMHgwOCwweDczLDB4RTUsMHgzMiwKKzB4RkYsMHgyNiwweDAxLDB4MUMsMHgwMSwweDVFLDB4MzQsMHg4OSwweDc2LDB4MDQsMHg4OSwweDRFLDB4MkUsMHg4OSwweDdFLDB4MkMsCisweDNCLDB4NEUsMHgzQywweDcyLDB4MTEsMHhGNiwweDQ2LDB4MzgsMHgyMCwweDc0LDB4MDEsMHhDMywweDgzLDB4NEUsMHgzOCwweDIwLAorMHhCMCwweDAwLDB4RTgsMHhGRCwweEZCLDB4QzMsMHhGNiwweDQ2LDB4MzgsMHgwNCwweDc0LDB4MTUsMHg4MywweDRFLDB4MzgsMHgxMCwKKzB4OEEsMHg4NiwweEE3LDB4MDAsMHgyNCwweEZFLDB4ODgsMHg4NiwweEE3LDB4MDAsMHg4MywweEVBLDB4MDIsMHhFRSwweDgzLDB4QzIsCisweDAyLDB4M0QsMHg0MCwweDAwLDB4NzIsMHg1RCwweEMzLDB4MzIsMHhGRiwweDI2LDB4MDMsMHgxQywweDg1LDB4REIsMHg3NCwweDA5LAorMHgyNiwweDg5LDB4MUMsMHg4QiwweEY3LDB4NDcsMHg0NywweDQ5LDB4NDksMHg4MCwweEU0LDB4MUUsMHg4MCwweENDLDB4QzAsMHgyNiwKKzB4ODksMHgwNCwweEY2LDB4QzQsMHgxMCwweDc0LDB4MjcsMHg4QiwweDc2LDB4MzgsMHhGNywweEM2LDB4MDAsMHgxMCwweDc0LDB4MEIsCisweDUwLDB4RkUsMHg4NiwweEIyLDB4MDAsMHhCMCwweDBBLDB4RTgsMHhBOCwweEZCLDB4NTgsMHhGNywweEM2LDB4MDAsMHgwMSwweDc0LAorMHgwRCwweEU4LDB4ODIsMHgyNiwweDhCLDB4NzYsMHgzOCwweDhCLDB4NEUsMHgyRSwweDhCLDB4N0UsMHgwNCwweEFCLDB4OEIsMHhGNywKKzB4MzMsMHhDMCwweEFCLDB4MzIsMHhEQiwweDhBLDB4QkUsMHhBMywweDAwLDB4NDksMHg0OSwweDgzLDB4RjksMHgwOCwweDcyLDB4MTcsCisweEU5LDB4NDEsMHhGRiwweDgxLDB4NEUsMHgzOCwweDAwLDB4MDQsMHg4MywweEMyLDB4RjgsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LAorMHhGQSwweDg4LDB4ODYsMHhBNSwweDAwLDB4RUUsMHhDMywweEU5LDB4NDUsMHhGRiwweDgzLDB4QzIsMHgwOCwweEVDLDB4ODgsMHg4NiwKKzB4QUEsMHgwMCwweEMwLDB4RTgsMHgwNCwweDhBLDB4RTAsMHg4QSwweEM4LDB4ODYsMHg4NiwweEE5LDB4MDAsMHgzMiwweEUwLDB4OEIsCisweDVFLDB4M0UsMHg4NCwweEUzLDB4NzQsMHg0RiwweDhBLDB4QzEsMHg4QiwweDRFLDB4MjYsMHhGNiwweEM1LDB4MDQsMHg3NCwweDBDLAorMHhBOCwweDA4LDB4NzQsMHgwNSwweDgwLDB4RTEsMHhCRiwweEVCLDB4MDMsMHg4MCwweEM5LDB4NDAsMHhGNiwweEM1LDB4MDgsMHg3NCwKKzB4MEMsMHhBOCwweDAyLDB4NzQsMHgwNSwweDgwLDB4RTEsMHg3RiwweEVCLDB4MDMsMHg4MCwweEM5LDB4ODAsMHg4OCwweDRFLDB4MjYsCisweDhCLDB4RjAsMHg4QSwweDg2LDB4QTUsMHgwMCwweDg0LDB4QzksMHg3NCwweDA4LDB4QTgsMHgwMiwweDc0LDB4MTUsMHgyNCwweEZELAorMHhFQiwweDA2LDB4QTgsMHgwMiwweDc1LDB4MEQsMHgwQywweDAyLDB4ODgsMHg4NiwweEE1LDB4MDAsMHg4MywweEVBLDB4MEEsMHhFRSwKKzB4ODMsMHhDMiwweDBBLDB4OEIsMHhDNiwweDg0LDB4RTcsMHg3NSwweDAxLDB4QzMsMHhDNiwweDg2LDB4QkEsMHgwMCwweDAxLDB4QjAsCisweDBFLDB4RTgsMHhFRSwweEZBLDB4RjcsMHg0NiwweDM4LDB4MDAsMHgwMiwweDc0LDB4RUUsMHg4MywweDdFLDB4MkUsMHgwNiwweDcyLAorMHhFOCwweDhBLDB4QTYsMHhBQSwweDAwLDB4QzQsMHg1RSwweDA0LDB4OEIsMHg3RSwweDJDLDB4QjAsMHhGRiwweEFBLDB4QjAsMHgwMiwKKzB4QUIsMHgyNiwweDgzLDB4MDcsMHgwMywweDgzLDB4NkUsMHgyRSwweDAzLDB4ODksMHg3RSwweDJDLDB4RjYsMHg0NiwweDM4LDB4MjAsCisweDc0LDB4MDEsMHhDMywweDgzLDB4NEUsMHgzOCwweDIwLDB4QjAsMHgwMCwweEU4LDB4QjYsMHhGQSwweEMzLDB4OTAsMHg4MywweEVBLAorMHgwOCwweEU5LDB4QjQsMHhGRCwweDgzLDB4QzIsMHgwNiwweDhCLDB4NUUsMHgyNiwweEY2LDB4QzMsMHhDMCwweDc1LDB4RUYsMHg4QiwKKzB4NEUsMHgxQywweEVDLDB4ODgsMHg4NiwweEE0LDB4MDAsMHg4MywweEVBLDB4MEEsMHhBOCwweDIwLDB4NzUsMHgwMiwweDhBLDB4Q0QsCisweDMyLDB4RUQsMHg4QiwweDQ2LDB4MUEsMHgzQiwweEM4LDB4NzMsMHgxOCwweDAxLDB4NEUsMHgyQSwweDJCLDB4QzEsMHg4OSwweDQ2LAorMHgxQSwweEM1LDB4NzYsMHgwMCwweEYzLDB4NkUsMHg4RSwweEQ5LDB4ODksMHg3NiwweDAwLDB4M0QsMHgyMCwweDAwLDB4NzIsMHgzMCwKKzB4QzMsMHg4NSwweEMwLDB4NzQsMHgzMSwweDhCLDB4QzgsMHgwMSwweDQ2LDB4MkEsMHhDNSwweDc2LDB4MDAsMHhGMywweDZFLDB4OEUsCisweEQ5LDB4ODAsMHhDQiwweDAyLDB4ODksMHg1RSwweDI2LDB4RTgsMHgzMiwweEYxLDB4RjYsMHhDNywweDAxLDB4NzUsMHgxNiwweDgzLAorMHhDMiwweDAyLDB4RTgsMHg1MywweEZELDB4RjYsMHhDNywweDEwLDB4NzUsMHgwQiwweEIwLDB4MDIsMHhFOCwweDQzLDB4RkEsMHhDMywKKzB4RjYsMHhDNywweDAxLDB4NzQsMHhGMCwweEMzLDB4ODAsMHhDQiwweDAyLDB4ODksMHg1RSwweDI2LDB4RjYsMHhDNywweDAxLDB4NzQsCisweERFLDB4ODMsMHhDMiwweDAyLDB4RTgsMHgzMSwweEZELDB4RjYsMHg4NiwweEE0LDB4MDAsMHg0MCwweDc0LDB4MEIsMHg4MCwweEU3LAorMHhGRSwweDgwLDB4Q0YsMHgwMiwweDg5LDB4NUUsMHgyNiwweEVCLDB4Q0MsMHhCMCwweDA0LDB4RTgsMHgxNCwweEZBLDB4QzMsMHhDMCwKKzB4QzIsMHhDOCwweENBLDB4QzQsMHhDNiwweENDLDB4Q0UsMHhEMCwweEQyLDB4RDgsMHhEQSwweEQ0LDB4RDYsMHhEQywweERFLDB4OTAsCisweEU5LDB4MEUsMHgwMSwweEU0LDB4QzQsMHg4QSwweEUwLDB4RTQsMHhDNCwweDhCLDB4RDAsMHg4MywweEY5LDB4MDgsMHg3MiwweEYwLAorMHgyNiwweDgzLDB4M0YsMHgwMCwweDc0LDB4MDQsMHg4QiwweERGLDB4NDksMHg0OSwweDhCLDB4RkIsMHg4QSwweERFLDB4ODMsMHhFMywKKzB4MEYsMHgyRSwweDhBLDB4QTcsMHgyRiwweDE2LDB4QUIsMHhGNiwweEM0LDB4MTAsMHg3NCwweDI0LDB4RjcsMHhDNiwweDAwLDB4MTAsCisweDc0LDB4MEIsMHg1MCwweEZFLDB4ODYsMHhCMiwweDAwLDB4QjAsMHgwQSwweEU4LDB4QzYsMHhGOSwweDU4LDB4RjcsMHhDNiwweDAwLAorMHgwMSwweDc0LDB4MEQsMHhFOCwweEEwLDB4MjQsMHg4QiwweDc2LDB4MzgsMHg4QiwweDRFLDB4MkUsMHg4QiwweDdFLDB4MDQsMHhBQiwKKzB4ODksMHg3RSwweDA0LDB4MzMsMHhDMCwweEFCLDB4NDksMHg0OSwweDg5LDB4NEUsMHgyRSwweDg5LDB4N0UsMHgyQywweDhCLDB4QzEsCisweEVCLDB4NEUsMHg5MCwweEVCLDB4OUUsMHg5MCwweEU0LDB4RDYsMHg4NCwweEMwLDB4NzksMHg2MywweEU2LDB4RDAsMHg4QSwweEM4LAorMHgyNSwweDAzLDB4MDAsMHgwMywweEQ4LDB4RDEsMHhFMywweDJFLDB4OEIsMHhBRiwweDQ0LDB4MDAsMHg4OCwweDhFLDB4QUUsMHgwMCwKKzB4OEIsMHg0RSwweDJFLDB4QzQsMHg1RSwweDA0LDB4OEIsMHg3RSwweDJDLDB4OEIsMHg3NiwweDM4LDB4RTQsMHg4NiwweDI0LDB4MDcsCisweDNDLDB4MDMsMHg3NSwweENGLDB4RTQsMHgxQywweDkxLDB4M0IsMHhDMSwweDczLDB4MDIsMHg4QiwweEM4LDB4MkIsMHhDMSwweDg5LAorMHg0NiwweDJFLDB4MDEsMHg0RSwweDM0LDB4MjYsMHgwMSwweDBGLDB4QkEsMHhDNCwweDAwLDB4RjMsMHg2QywweDg5LDB4N0UsMHgyQywKKzB4M0IsMHg0NiwweDNDLDB4NzIsMHgxQywweEY3LDB4QzYsMHgyMCwweDAwLDB4NzUsMHgwQiwweDgzLDB4Q0UsMHgyMCwweDg5LDB4NzYsCisweDM4LDB4QjAsMHgwMCwweEU4LDB4M0MsMHhGOSwweDhBLDB4ODYsMHhBRSwweDAwLDB4MjQsMHgzRiwweEU2LDB4RDYsMHhDMywweEY5LAorMHhDMywweEY3LDB4QzYsMHgwQSwweDAwLDB4NzQsMHgzNSwweEY3LDB4QzYsMHgxMCwweDAwLDB4NzUsMHgyRiwweDgzLDB4Q0UsMHgxMCwKKzB4ODksMHg3NiwweDM4LDB4RjcsMHhDNiwweDAyLDB4MDAsMHg3NCwweDBFLDB4NTAsMHhFNCwweEQ4LDB4MjQsMHhGRSwweEU2LDB4RDgsCisweDU4LDB4RjcsMHhDNiwweDA4LDB4MDAsMHg3NCwweDE1LDB4NTAsMHg1MSwweEI5LDB4RTgsMHgwMywweEU0LDB4MEEsMHg4NCwweEMwLAorMHhFMCwweEZBLDB4ODQsMHhDMCwweDc1LDB4MDQsMHhCMCwweDI0LDB4RTYsMHgwQSwweDU5LDB4NTgsMHgzRCwweDQwLDB4MDAsMHg3MywKKzB4QjUsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RUYsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHg4MSwweENFLDB4MTAsCisweDA0LDB4ODksMHg3NiwweDM4LDB4RUIsMHhBMCwweDAwLDB4MDgsMHgwNCwweDBDLDB4MDEsMHgwOSwweDA1LDB4MEQsMHgwMiwweDBBLAorMHgwNiwweDBFLDB4MDMsMHgwQiwweDA3LDB4MEYsMHgwMCwweDQwLDB4ODAsMHhDMCwweDIwLDB4NjAsMHhBMCwweEUwLDB4MTAsMHg1MCwKKzB4OTAsMHhEMCwweDMwLDB4NzAsMHhCMCwweEYwLDB4RTQsMHhEMiwweEU2LDB4RDAsMHg4QSwweEM4LDB4MjUsMHgwMywweDAwLDB4MDMsCisweEQ4LDB4RDEsMHhFMywweDJFLDB4OEIsMHhBRiwweDQ0LDB4MDAsMHg4OCwweDhFLDB4QUUsMHgwMCwweEU0LDB4RDgsMHhDMCwweEU4LAorMHgwNCwweDhCLDB4RDgsMHgyRSwweDhBLDB4ODcsMHg2NiwweDE3LDB4OEEsMHhFMCwweDhBLDB4QzgsMHg4NiwweDg2LDB4QTksMHgwMCwKKzB4MzIsMHhFMCwweEU0LDB4OTgsMHg4QiwweDVFLDB4M0UsMHg4NCwweEUzLDB4NzQsMHg1NCwweDhBLDB4QzEsMHg4QiwweDRFLDB4MjYsCisweEY2LDB4QzUsMHgwNCwweDc0LDB4MEMsMHhBOCwweDA4LDB4NzQsMHgwNSwweDgwLDB4RTEsMHhCRiwweEVCLDB4MDMsMHg4MCwweEM5LAorMHg0MCwweEY2LDB4QzUsMHgwOCwweDc0LDB4MEMsMHhBOCwweDAyLDB4NzQsMHgwNSwweDgwLDB4RTEsMHg3RiwweEVCLDB4MDMsMHg4MCwKKzB4QzksMHg4MCwweDg4LDB4NEUsMHgyNiwweDhCLDB4RjAsMHg4QSwweDg2LDB4QTUsMHgwMCwweEY2LDB4QzEsMHhGRCwweDc0LDB4MDgsCisweEE4LDB4MDYsMHg3NCwweDE5LDB4MjQsMHhGOSwweEVCLDB4MEYsMHhBOCwweDA2LDB4NzUsMHgxMSwweEY2LDB4QzUsMHgwMSwweDc1LAorMHgwNCwweDBDLDB4MDQsMHhFQiwweDAyLDB4MEMsMHgwMiwweDg4LDB4ODYsMHhBNSwweDAwLDB4RTYsMHgwQywweDhCLDB4QzYsMHg4NCwKKzB4RTcsMHg3NSwweDA5LDB4OEEsMHg4NiwweEFFLDB4MDAsMHgyNCwweDNGLDB4RTYsMHhEMiwweEMzLDB4QzYsMHg4NiwweEJBLDB4MDAsCisweDAxLDB4QjAsMHgwRSwweEU4LDB4MUMsMHhGOCwweEY3LDB4NDYsMHgzOCwweDAwLDB4MDIsMHg3NCwweEU2LDB4ODMsMHg3RSwweDJFLAorMHgwNiwweDcyLDB4RTAsMHg4QSwweDg2LDB4QTksMHgwMCwweDhBLDB4RTAsMHg4NiwweDg2LDB4QUEsMHgwMCwweDhBLDB4QzgsMHgzMiwKKzB4QzQsMHg4MCwweEM5LDB4MEIsMHgyMiwweEMxLDB4QzAsMHhFNCwweDA0LDB4MEEsMHhFMCwweEM0LDB4NUUsMHgwNCwweDhCLDB4N0UsCisweDJDLDB4QjAsMHhGRiwweEFBLDB4QjAsMHgwMiwweEFCLDB4MjYsMHg4MywweDA3LDB4MDMsMHg4MywweDZFLDB4MkUsMHgwMywweDg5LAorMHg3RSwweDJDLDB4RjYsMHg0NiwweDM4LDB4MjAsMHg3NSwweEFCLDB4ODMsMHg0RSwweDM4LDB4MjAsMHhCMCwweDAwLDB4RTgsMHhEMSwKKzB4RjcsMHhFQiwweEEwLDB4OTAsMHhFNCwweDEyLDB4MjQsMHhERiwweEU2LDB4MTIsMHg4MSwweEUzLDB4RkUsMHg5RiwweDg5LDB4NUUsCisweDI2LDB4ODMsMHg2NiwweDQ4LDB4RjcsMHhFQiwweDczLDB4OTAsMHhGNiwweEM3LDB4MjAsMHg3NSwweEU3LDB4RTQsMHgxMiwweDBDLAorMHgyMCwweEU2LDB4MTIsMHgzMiwweEMwLDB4RTYsMHhDNiwweEIwLDB4ODMsMHhFNiwweEM2LDB4ODAsMHhDRiwweDIwLDB4ODksMHg1RSwKKzB4MjYsMHg4QSwweDg2LDB4QTUsMHgwMCwweDBDLDB4MDIsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHhFQiwweDc0LDB4OTAsCisweEY2LDB4QzcsMHg0MCwweDc1LDB4RDMsMHhFNCwweDEyLDB4MEMsMHgyMCwweEU2LDB4MTIsMHgzMiwweEMwLDB4RTYsMHhDNiwweEIwLAorMHg4MSwweEU2LDB4QzYsMHg4MCwweEU3LDB4REYsMHg4MCwweENCLDB4MDEsMHg4OSwweDVFLDB4MjYsMHhCMCwweDA2LDB4RTgsMHg3MSwKKzB4RjcsMHg5MCwweDhBLDB4ODYsMHhBNSwweDAwLDB4MjQsMHhGOSwweEU2LDB4MEMsMHg4OCwweDg2LDB4QTUsMHgwMCwweEVCLDB4NDMsCisweEU0LDB4RDQsMHhFNiwweEQwLDB4OEIsMHhGOCwweDI1LDB4MDMsMHgwMCwweDAzLDB4RDgsMHhEMSwweEUzLDB4MkUsMHg4QiwweEFGLAorMHg0NCwweDAwLDB4OEIsMHg1RSwweDI2LDB4RjYsMHhDNywweDYwLDB4NzUsMHhCNiwweEY2LDB4QzMsMHhDMCwweDc1LDB4RDMsMHhCQSwKKzB4QzYsMHgwMCwweDhCLDB4NEUsMHgxQywweDhCLDB4NDYsMHgxQSwweDNCLDB4QzgsMHg3MywweDFFLDB4MDEsMHg0RSwweDJBLDB4MkIsCisweEMxLDB4ODksMHg0NiwweDFBLDB4QzUsMHg3NiwweDAwLDB4RjMsMHg2RSwweDhFLDB4RDksMHg4OSwweDc2LDB4MDAsMHgzRCwweDIwLAorMHgwMCwweDcyLDB4M0QsMHg4QiwweEM3LDB4MjQsMHgzRiwweEU2LDB4RDQsMHhDMywweDg1LDB4QzAsMHg3NCwweDM5LDB4OEIsMHhDOCwKKzB4MDEsMHg0NiwweDJBLDB4QzUsMHg3NiwweDAwLDB4RjMsMHg2RSwweDhFLDB4RDksMHg4MywweENCLDB4MDIsMHg4OSwweDVFLDB4MjYsCisweEU4LDB4RDksMHhFRCwweEY2LDB4QzcsMHgwMSwweDc1LDB4MzksMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RjksMHhFNiwweDBDLAorMHg4OCwweDg2LDB4QTUsMHgwMCwweEY2LDB4QzcsMHgxMCwweDc1LDB4Q0EsMHhCMCwweDAyLDB4RTgsMHhFNCwweEY2LDB4RUIsMHhDMywKKzB4RjYsMHhDNywweDAxLDB4NzQsMHhFRiwweEVCLDB4QkMsMHhGNiwweEM3LDB4MDEsMHg3NCwweERDLDB4OEEsMHg4NiwweEE1LDB4MDAsCisweEE4LDB4MDIsMHg3NCwweDExLDB4ODEsMHhFMywweEZGLDB4RkUsMHg4MSwweENCLDB4MDAsMHgwMiwweDg5LDB4NUUsMHgyNiwweEVCLAorMHhDNywweDhBLDB4ODYsMHhBNSwweDAwLDB4MjQsMHhGQiwweDBDLDB4MDIsMHhFNiwweDBDLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFQiwKKzB4OTIsMHg5MCwweEZELDB4RjcsMHhERiwweDdGLDB4RkUsMHhGQiwweEVGLDB4QkYsMHgwMCwweDA0LDB4MDAsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwMSwweDA0LDB4MDAsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDAyLDB4MDQsMHgwMCwweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDAxLDB4MDQsMHgwMCwweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDcsMHgwNCwweDA3LDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDcsMHgwNCwweDA3LDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwNywweDA0LDB4MDcsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwNywweDA0LDB4MDcsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDAzLDB4MDQsMHgwMCwweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDAxLDB4MDQsMHgwMCwweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDIsMHgwNCwweDAwLDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDEsMHgwNCwweDAwLDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwNywweDA0LDB4MDcsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwNywweDA0LDB4MDcsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDA3LDB4MDQsMHgwNywweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDA3LDB4MDQsMHgwNywweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MzMsMHhEQiwweDhBLDB4RDgsMHg4QSwweDg3LAorMHg2QywweDEyLDB4RTYsMHhGRSwweEMxLDB4RTMsMHgwMiwweEU0LDB4Q0UsMHhBOCwweDA0LDB4NzUsMHgwOSwweEE4LDB4MDIsMHg3NCwKKzB4MDMsMHhFOSwweDJDLDB4RkUsMHhGOSwweEMzLDB4NTAsMHg1MywweEU4LDB4Q0IsMHhGQywweDVCLDB4NTgsMHhBOCwweDAyLDB4NzQsCisweDAzLDB4RTksMHgxQywweEZFLDB4RjgsMHhDMywweDMzLDB4REIsMHg4QSwweEQ4LDB4OEEsMHg4NywweDZDLDB4MTIsMHhFNiwweEZFLAorMHhDMSwweEUzLDB4MDIsMHhFOSwweEQwLDB4RkIsMHg5QSwweDFBLDB4QzYsMHgxQSwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwOCwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MEEsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDA4LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwQywweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MDgsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDBBLDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwOCwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MEUsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDA4LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwQSwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MDgsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDBDLDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwOCwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MEEsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDA4LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHhDMywweDkwLDB4REEsMHgxNCwweDk0LDB4MTUsCisweDVDLDB4MTMsMHhFNiwweDEzLDB4REEsMHgxQiwweERBLDB4MUIsMHhFNiwweDEzLDB4REEsMHgxQiwweDhCLDB4OTQsMHg2NCwweDEyLAorMHhDMSwweEU2LDB4MDQsMHhBOCwweDAxLDB4NzQsMHgzNSwweDUwLDB4MzMsMHhDMCwweDhBLDB4QzIsMHhFNiwweEZFLDB4RTQsMHhBMCwKKzB4ODUsMHhDMCwweDc0LDB4MjcsMHg4QiwweEQ4LDB4MkUsMHg4QSwweDlGLDB4REEsMHgxQSwweDUyLDB4NTYsMHgyRSwweDhCLDB4QTgsCisweDQ0LDB4MDAsMHg4QiwweDU2LDB4MjgsMHhFQywweEE4LDB4MDEsMHg3NSwweDBELDB4ODgsMHg4NiwweEFELDB4MDAsMHgyNCwweDBFLAorMHg4QSwweEQ4LDB4MkUsMHhGRiwweDk3LDB4REMsMHgxQiwweDVFLDB4NUEsMHhFQiwweENELDB4NTgsMHhBOCwweDAyLDB4NzQsMHgzNiwKKzB4ODMsMHhDNiwweDEwLDB4MzMsMHhDMCwweDhBLDB4QzYsMHhFNiwweEZFLDB4RTQsMHhBMCwweDg1LDB4QzAsMHg3NCwweDI3LDB4OEIsCisweEQ4LDB4MkUsMHg4QSwweDlGLDB4REEsMHgxQSwweDUyLDB4NTYsMHgyRSwweDhCLDB4QTgsMHg0NCwweDAwLDB4OEIsMHg1NiwweDI4LAorMHhFQywweEE4LDB4MDEsMHg3NSwweDBELDB4ODgsMHg4NiwweEFELDB4MDAsMHgyNCwweDBFLDB4OEEsMHhEOCwweDJFLDB4RkYsMHg5NywKKzB4REMsMHgxQiwweDVFLDB4NUEsMHhFQiwweENELDB4QzMsMHg5MCwweDMyLDB4RTQsMHg4QiwweEQ4LDB4OEIsMHhEMCwweDJFLDB4OEEsCisweDlGLDB4OUEsMHgxOSwweDJFLDB4MjIsMHg5NywweDkyLDB4MTksMHg1NiwweDUyLDB4OEEsMHhDMywweDI0LDB4MDMsMHgwMywweEM2LAorMHg4MCwweEUzLDB4MDQsMHhEMCwweEVCLDB4MkUsMHhGRiwweDk3LDB4RDYsMHgxQSwweDU4LDB4NUUsMHhBOSwweDU1LDB4MDAsMHg3NSwKKzB4RDksMHhDMywweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsMHg1QywweDEyLDB4RTYsMHhGRSwweEU0LDB4MDAsCisweDIyLDB4QzQsMHg3NCwweDA4LDB4MzMsMHhGNiwweEU4LDB4QkYsMHhGRiwweEVCLDB4RUUsMHg5MCwweEU0LDB4MDQsMHgwNywweEU0LAorMHgwNCwweDFGLDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLDB4RUYsMHg2MSwweENGLDB4OTAsMHg2MCwweDFFLDB4MDYsMHgyQiwKKzB4QzAsMHg4RSwweEQ4LDB4QTEsMHg1RSwweDEyLDB4RTYsMHhGRSwweEU0LDB4MDAsMHgyMiwweEM0LDB4NzQsMHgwOCwweEJFLDB4MDQsCisweDAwLDB4RTgsMHg5NCwweEZGLDB4RUIsMHhFRCwweEU0LDB4MDQsMHgwNywweEU0LDB4MDQsMHgxRiwweEI4LDB4MDAsMHg4MCwweEJBLAorMHgyMiwweEZGLDB4RUYsMHg2MSwweENGLDB4OTAsMHg2MCwweDFFLDB4MDYsMHgyQiwweEMwLDB4OEUsMHhEOCwweEExLDB4NUMsMHgxMiwKKzB4RTYsMHhGRSwweEU0LDB4MDAsMHgyMiwweEM0LDB4NzQsMHgxOCwweDMzLDB4RjYsMHhFOCwweDZCLDB4RkYsMHhBMSwweDYwLDB4MTIsCisweEU2LDB4RkUsMHhFNCwweDAwLDB4MjIsMHhDNCwweDc0LDB4RTUsMHhCRSwweDA4LDB4MDAsMHhFOCwweDVBLDB4RkYsMHhFQiwweERELAorMHhBMSwweDYwLDB4MTIsMHhFNiwweEZFLDB4RTQsMHgwMCwweDIyLDB4QzQsMHg3NSwweEVELDB4RTQsMHgwNCwweDA3LDB4RTQsMHgwNCwKKzB4QTEsMHg1QywweDEyLDB4RTYsMHhGRSwweEU0LDB4MDQsMHgxRiwweEU0LDB4MDQsMHhCOCwweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsCisweEVGLDB4NjEsMHhDRiwweDkwLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMSwweDVFLDB4MTIsMHhFNiwweEZFLAorMHhFNCwweDAwLDB4MjIsMHhDNCwweDc0LDB4MTksMHhCRSwweDA0LDB4MDAsMHhFOCwweDFDLDB4RkYsMHhBMSwweDYyLDB4MTIsMHhFNiwKKzB4RkUsMHhFNCwweDAwLDB4MjIsMHhDNCwweDc0LDB4RTQsMHhCRSwweDBDLDB4MDAsMHhFOCwweDBCLDB4RkYsMHhFQiwweERDLDB4QTEsCisweDYyLDB4MTIsMHhFNiwweEZFLDB4RTQsMHgwMCwweDIyLDB4QzQsMHg3NSwweEVELDB4RTQsMHgwNCwweDA3LDB4RTQsMHgwNCwweEExLAorMHg1RSwweDEyLDB4RTYsMHhGRSwweEU0LDB4MDQsMHgxRiwweEU0LDB4MDQsMHhCOCwweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwKKzB4NjEsMHhDRiwweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsMHg1QywweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsCisweDg0LDB4QzQsMHg3NCwweDA4LDB4MzMsMHhGNiwweEU4LDB4NTMsMHhGRSwweEVCLDB4RUUsMHg5MCwweEI4LDB4MDAsMHg4MCwweEJBLAorMHgyMiwweEZGLDB4RUYsMHgwNywweDFGLDB4NjEsMHhDRiwweDkwLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMSwKKzB4NUUsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLDB4ODQsMHhDNCwweDc0LDB4MDgsMHhCRSwweDAyLDB4MDAsMHhFOCwweDJDLDB4RkUsCisweEVCLDB4RUQsMHhCOCwweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDA3LDB4MUYsMHg2MSwweENGLDB4OTAsMHg2MCwweDFFLAorMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsMHg2MCwweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzQsMHgwOCwKKzB4QkUsMHgwNCwweDAwLDB4RTgsMHgwNiwweEZFLDB4RUIsMHhFRCwweEI4LDB4MDAsMHg4MCwweEJBLDB4MjIsMHhGRiwweEVGLDB4MDcsCisweDFGLDB4NjEsMHhDRiwweDkwLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMSwweDYyLDB4MTIsMHhFNiwweEZFLAorMHhFNCwweDgwLDB4ODQsMHhDNCwweDc0LDB4MDgsMHhCRSwweDA2LDB4MDAsMHhFOCwweEUwLDB4RkQsMHhFQiwweEVELDB4QjgsMHgwMCwKKzB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDA3LDB4MUYsMHg2MSwweENGLDB4OTAsMHg2MCwweDFFLDB4MDYsMHgyQiwweEMwLDB4OEUsCisweEQ4LDB4QTEsMHg1QywweDEyLDB4RTYsMHhGRSwweEU0LDB4MDAsMHgyMiwweEM0LDB4NzQsMHgxOCwweDMzLDB4RjYsMHhFOCwweDM3LAorMHhGRSwweEExLDB4NjAsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLDB4ODQsMHhDNCwweDc0LDB4RTUsMHhCRSwweDA0LDB4MDAsMHhFOCwKKzB4QUEsMHhGRCwweEVCLDB4REQsMHhBMSwweDYwLDB4MTIsMHhFNiwweEZFLDB4RTQsMHg4MCwweDg0LDB4QzQsMHg3NSwweEVELDB4QTEsCisweDVDLDB4MTIsMHhFNiwweEZFLDB4RTQsMHgwNCwweDA3LDB4RTQsMHgwNCwweDFGLDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLAorMHhFRiwweDYxLDB4Q0YsMHg5MCwweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsMHg1RSwweDEyLDB4RTYsMHhGRSwKKzB4RTQsMHgwMCwweDIyLDB4QzQsMHg3NCwweDE5LDB4QkUsMHgwNCwweDAwLDB4RTgsMHhFQywweEZELDB4QTEsMHg2MiwweDEyLDB4RTYsCisweEZFLDB4RTQsMHg4MCwweDg0LDB4QzQsMHg3NCwweEU0LDB4QkUsMHgwNiwweDAwLDB4RTgsMHg1RiwweEZELDB4RUIsMHhEQywweEExLAorMHg2MiwweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzUsMHhFRCwweEExLDB4NUUsMHgxMiwweEU2LDB4RkUsMHhFNCwKKzB4MDQsMHgwNywweEU0LDB4MDQsMHgxRiwweEI4LDB4MDAsMHg4MCwweEJBLDB4MjIsMHhGRiwweEVGLDB4NjEsMHhDRiwweDYwLDB4MUUsCisweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMSwweDVDLDB4MTIsMHhFNiwweEZFLDB4RTQsMHg4MCwweDg0LDB4QzQsMHg3NCwweDE4LAorMHgzMywweEY2LDB4RTgsMHgyNywweEZELDB4QTEsMHg2MCwweDEyLDB4RTYsMHhGRSwweEU0LDB4MDAsMHgyMiwweEM0LDB4NzQsMHhFNSwKKzB4QkUsMHgwOCwweDAwLDB4RTgsMHg5MiwweEZELDB4RUIsMHhERCwweEExLDB4NjAsMHgxMiwweEU2LDB4RkUsMHhFNCwweDAwLDB4MjIsCisweEM0LDB4NzUsMHhFRCwweEU0LDB4MDQsMHgwNywweEU0LDB4MDQsMHgxRiwweEI4LDB4MDAsMHg4MCwweEJBLDB4MjIsMHhGRiwweEVGLAorMHg2MSwweENGLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMSwweDVFLDB4MTIsMHhFNiwweEZFLDB4RTQsMHg4MCwKKzB4ODQsMHhDNCwweDc0LDB4MTksMHhCRSwweDAyLDB4MDAsMHhFOCwweEUyLDB4RkMsMHhBMSwweDYyLDB4MTIsMHhFNiwweEZFLDB4RTQsCisweDAwLDB4MjIsMHhDNCwweDc0LDB4RTQsMHhCRSwweDBDLDB4MDAsMHhFOCwweDRELDB4RkQsMHhFQiwweERDLDB4QTEsMHg2MiwweDEyLAorMHhFNiwweEZFLDB4RTQsMHgwMCwweDIyLDB4QzQsMHg3NSwweEVELDB4RTQsMHgwNCwweDA3LDB4RTQsMHgwNCwweDFGLDB4QjgsMHgwMCwKKzB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDYxLDB4Q0YsMHg5MCwweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsCisweDVDLDB4MTIsMHhFNiwweEZFLDB4RTQsMHg4MCwweDg0LDB4QzQsMHg3NCwweDE4LDB4MzMsMHhGNiwweEU4LDB4OUQsMHhGQywweEExLAorMHg2MCwweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzQsMHhFNSwweEJFLDB4MDQsMHgwMCwweEU4LDB4OEMsMHhGQywKKzB4RUIsMHhERCwweEExLDB4NjAsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLDB4ODQsMHhDNCwweDc1LDB4RUQsMHgwNywweDFGLDB4QjgsCisweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDYxLDB4Q0YsMHg2MCwweDFFLDB4MDYsMHgyQiwweEMwLDB4OEUsMHhEOCwweEExLAorMHg1RSwweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzQsMHgxOSwweEJFLDB4MDIsMHgwMCwweEU4LDB4NUMsMHhGQywKKzB4QTEsMHg2MiwweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzQsMHhFNCwweEJFLDB4MDYsMHgwMCwweEU4LDB4NEIsCisweEZDLDB4RUIsMHhEQywweEExLDB4NjIsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLDB4ODQsMHhDNCwweDc1LDB4RUQsMHgwNywweDFGLAorMHhCOCwweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDYxLDB4Q0YsMHg5MCwweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwKKzB4RDgsMHg5MCwweDJBLDB4QzAsMHhFNiwweEZFLDB4RTQsMHhDRSwweEE4LDB4MDEsMHg3NCwweDE0LDB4MzMsMHhEQiwweEU4LDB4RDUsCisweEY2LDB4RUIsMHhFRiwweDkwLDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLDB4RUYsMHgwNywweDFGLDB4NjEsMHhDRiwweDkwLAorMHhGNiwweDA2LDB4MDUsMHgwMSwweDAxLDB4NzUsMHhFRCwweEIwLDB4MDEsMHhFNiwweEZFLDB4RTQsMHhDRSwweEE4LDB4MDEsMHg3NCwKKzB4RTMsMHhCQiwweDA0LDB4MDAsMHhFOCwweEFGLDB4RjYsMHhFQiwweEM5LDB4OTAsMHg2MCwweDFFLDB4MDYsMHgyQiwweEMwLDB4OEUsCisweEQ4LDB4OTAsMHhGQiwweDkwLDB4RkEsMHgyQSwweEMwLDB4RTYsMHhGRSwweEU0LDB4Q0UsMHhBOCwweDAyLDB4NzQsMHgxMywweDMzLAorMHhEQiwweEU4LDB4Q0MsMHhGOCwweEVCLDB4RUMsMHhCOCwweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDA3LDB4MUYsMHg2MSwKKzB4Q0YsMHg5MCwweEE4LDB4MDQsMHg3NCwweEYwLDB4MzMsMHhEQiwweEU4LDB4NUIsMHhGNywweEVCLDB4RDUsMHg5MCwweDYwLDB4MUUsCisweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHg5MCwweEZCLDB4OTAsMHhGQSwweEIwLDB4MDEsMHhFNiwweEZFLDB4RTQsMHhDRSwweEE4LAorMHgwMiwweDc0LDB4MTUsMHhCQiwweDA0LDB4MDAsMHhFOCwweDk3LDB4RjgsMHhFQiwweEVCLDB4OTAsMHhCOCwweDAwLDB4ODAsMHhCQSwKKzB4MjIsMHhGRiwweEVGLDB4MDcsMHgxRiwweDYxLDB4Q0YsMHg5MCwweEE4LDB4MDQsMHg3NCwweEYwLDB4QkIsMHgwNCwweDAwLDB4RTgsCisweDI0LDB4RjcsMHhFQiwweEQyLDB4NkEsMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgwOSwweDlDLDB4MEUsMHhFOCwweDZCLAorMHhGMiwweDkwLDB4NkEsMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgyOSwweDlDLDB4MEUsMHhFOCwweDVELDB4RjIsMHg5MCwKKzB4NzIsMHgyMCwweDcyLDB4MjAsMHg3MiwweDIwLDB4Q0UsMHgxRCwweDkyLDB4MUMsMHhFNiwweDFDLDB4MUEsMHgxRSwweDcyLDB4MjAsCisweDgyLDB4MUQsMHhBRSwweDFFLDB4MzgsMHgxRiwweDcyLDB4MjAsMHg4MiwweDFELDB4NzIsMHgyMCwweDcyLDB4MjAsMHgzOCwweDFGLAorMHg3MiwweDIwLDB4NzIsMHgyMCwweDcyLDB4MjAsMHhGNCwweDFELDB4QkMsMHgxQywweDM0LDB4MUQsMHg2NCwweDFFLDB4NzIsMHgyMCwKKzB4QTgsMHgxRCwweEYyLDB4MUUsMHg3OCwweDFGLDB4NzIsMHgyMCwweEE4LDB4MUQsMHg3MiwweDIwLDB4NzIsMHgyMCwweDc4LDB4MUYsCisweEZDLDB4QjksMHg0MCwweDAwLDB4OEMsMHhDQiwweEI4LDB4NjQsMHgyMCwweDJCLDB4RkYsMHhBQiwweDkzLDB4QUIsMHg5MywweEUyLAorMHhGQSwweEM3LDB4MDYsMHg0QywweDAwLDB4QTgsMHgxMSwweDgzLDB4M0UsMHg0NCwweDEyLDB4MDAsMHg3NSwweDIwLDB4QzcsMHgwNiwKKzB4M0MsMHgwMCwweDA4LDB4NEIsMHhDNywweDA2LDB4MzAsMHgwMCwweEJBLDB4MUYsMHhDNywweDA2LDB4MzQsMHgwMCwweEZBLDB4MUYsCisweEY2LDB4MDYsMHgwNSwweDAxLDB4MDEsMHg3NSwweDA2LDB4QzcsMHgwNiwweDM4LDB4MDAsMHgyRSwweDIwLDB4QzMsMHhDNywweDA2LAorMHgzQywweDAwLDB4NTYsMHg0QiwweDMzLDB4REIsMHg4QSwweDFFLDB4NTQsMHgxMiwweEMxLDB4RTMsMHgwMiwweDAyLDB4MUUsMHg1NiwKKzB4MTIsMHgyRSwweDhCLDB4ODcsMHg4MCwweDIwLDB4QTMsMHgzMCwweDAwLDB4OEEsMHgxRSwweDU1LDB4MTIsMHhDMSwweEUzLDB4MDIsCisweDAyLDB4MUUsMHg1NywweDEyLDB4MkUsMHg4QiwweDg3LDB4QTAsMHgyMCwweEEzLDB4MzQsMHgwMCwweEMzLDB4OEIsMHg4NiwweDlFLAorMHgwMCwweEU2LDB4RkUsMHg4NiwweEM0LDB4RTYsMHhEMCwweEMzLDB4OEIsMHg4NiwweDlFLDB4MDAsMHhFNiwweEZFLDB4MzMsMHhEMiwKKzB4OEEsMHhENCwweEMzLDB4NTEsMHhCOSwweDEwLDB4MjcsMHhFNCwweDBBLDB4OTAsMHg5MCwweDg0LDB4QzAsMHg3NCwweDA1LDB4RTIsCisweEY2LDB4NTksMHhGOSwweEMzLDB4NTksMHhGOCwweEMzLDB4ODQsMHhDMCwweDc4LDB4MUUsMHg1MSwweDhBLDB4RTgsMHg4QSwweEM4LAorMHhCOCwweDAxLDB4MDAsMHhEMywweEUwLDB4MDksMHg4NiwweDk4LDB4MDAsMHgzQSwweEFFLDB4QTAsMHgwMCwweDU5LDB4NzUsMHgxMCwKKzB4RTgsMHhBOSwweEU1LDB4ODMsMHg0RSwweDI2LDB4MDIsMHhGOSwweEMzLDB4OTgsMHg4OSwweDg2LDB4OTgsMHgwMCwweEVCLDB4RjAsCisweEY4LDB4QzMsMHg4NCwweEMwLDB4NzgsMHgxMiwweDUxLDB4OEEsMHhFMCwweDhBLDB4QzgsMHhCOCwweDAxLDB4MDAsMHhEMywweEUwLAorMHg1OSwweEY3LDB4RDAsMHgyMSwweDg2LDB4OTgsMHgwMCwweEMzLDB4QzcsMHg4NiwweDk4LDB4MDAsMHgwMCwweDAwLDB4QzMsMHg4MywKKzB4QzIsMHgwNCwweDhBLDB4ODYsMHhBNiwweDAwLDB4MEMsMHgwNCwweEVFLDB4ODMsMHhFQSwweDA0LDB4QzMsMHhFOCwweDkzLDB4RkYsCisweDcyLDB4MDQsMHhCMCwweDgyLDB4RTYsMHgwQSwweEMzLDB4OEIsMHg0NiwweDI2LDB4QTgsMHhGRCwweDc0LDB4MTEsMHg4QSwweDg2LAorMHhBNSwweDAwLDB4QTgsMHgwNiwweDc0LDB4MDgsMHgyNCwweEY5LDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4QzMsMHhGNiwKKzB4QzQsMHgwMSwweDc0LDB4MEEsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RkIsMHgwQywweDAyLDB4RUIsMHgwQywweEE4LDB4MDIsCisweDc1LDB4MEYsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RkQsMHgwQywweDA0LDB4M0EsMHg4NiwweEE1LDB4MDAsMHg3NSwweEQ4LAorMHhDMywweDhBLDB4ODYsMHhBNSwweDAwLDB4RUIsMHhDRiwweEU0LDB4RDgsMHgzMywweERCLDB4OEEsMHhEOCwweEMwLDB4RUIsMHgwNCwKKzB4MkUsMHg4QSwweDlGLDB4NjYsMHgxNywweDg4LDB4OUUsMHhBOSwweDAwLDB4OEIsMHg1RSwweDI2LDB4ODAsMHhFMywweDNGLDB4RjYsCisweEM3LDB4MDQsMHg3NCwweDA3LDB4QTgsMHgxMCwweDc1LDB4MDMsMHg4MCwweENCLDB4NDAsMHhGNiwweEM3LDB4MDgsMHg3NCwweDA3LAorMHhBOCwweDgwLDB4NzUsMHgwMywweDgwLDB4Q0IsMHg0MCwweDg4LDB4NUUsMHgyNiwweDhBLDB4ODYsMHhBNSwweDAwLDB4RjYsMHhDMywKKzB4RkQsMHg3NCwweDBELDB4QTgsMHgwNiwweDc0LDB4MDgsMHgyNCwweEY5LDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4QzMsCisweEY2LDB4QzcsMHgwMSwweDc0LDB4MDQsMHgwQywweDAyLDB4RUIsMHhGMCwweEY2LDB4QzMsMHgwMiwweDc1LDB4RTksMHgwQywweDA0LAorMHhFQiwweEU3LDB4QzQsMHgwNCwweEM0LDB4MDQsMHg4NSwweDA0LDB4NTksMHgwNCwweDQ4LDB4MDQsMHg0MSwweDA0LDB4QzMsMHgwMywKKzB4ODIsMHgwMywweDQxLDB4MDMsMHg4MiwweDAyLDB4NTcsMHgwMiwweDQxLDB4MDIsMHg4MiwweDAxLDB4NDEsMHgwMSwweDgyLDB4MDAsCisweDQxLDB4MDAsMHg0RSwweDAyLDB4QUQsMHgwMSwweDU3LDB4MDEsMHgyRCwweDAwLDB4MkIsMHgwMCwweDI3LDB4MDAsMHgyMSwweDAwLAorMHgxNiwweDAwLDB4RjQsMHgwNCwweEY0LDB4MDQsMHhBMywweDA0LDB4NkYsMHgwNCwweDVCLDB4MDQsMHg1MSwweDA0LDB4RjQsMHgwMywKKzB4QTMsMHgwMywweDUxLDB4MDMsMHhBMywweDAyLDB4NkQsMHgwMiwweDUxLDB4MDIsMHhBMywweDAxLDB4NTEsMHgwMSwweEEzLDB4MDAsCisweDUxLDB4MDAsMHg2MiwweDAyLDB4RDksMHgwMSwweDZELDB4MDEsMHgzOCwweDAwLDB4MzYsMHgwMCwweDMxLDB4MDAsMHgyOSwweDAwLAorMHgxQiwweDAwLDB4NTEsMHg1NywweEJGLDB4MDIsMHgwMCwweEVCLDB4MEYsMHg5MCwweDUxLDB4NTYsMHhCRiwweDAxLDB4MDAsMHhFQiwKKzB4MDcsMHg5MCwweDUxLDB4NTYsMHhCRiwweDAzLDB4MDAsMHg5MCwweDNDLDB4MTksMHg3NiwweDAyLDB4QjAsMHgxNywweDk4LDB4OEIsCisweEYwLDB4OEEsMHg4MiwweEM0LDB4MDAsMHgyQSwweEU0LDB4OEIsMHhGMCwweDgzLDB4RkUsMHgxOCwweDczLDB4NDYsMHhEMSwweEU2LAorMHgyRSwweDhCLDB4OEMsMHg1MiwweDIyLDB4RjcsMHg0NiwweDM4LDB4ODAsMHgwMCwweDc0LDB4MDUsMHgyRSwweDhCLDB4OEMsMHg4MiwKKzB4MjIsMHhGNywweEM3LDB4MDIsMHgwMCwweDc0LDB4MTIsMHgzQiwweDhFLDB4OTQsMHgwMCwweDc0LDB4MEMsMHg4OSwweDhFLDB4OTQsCisweDAwLDB4OEEsMHhDNSwweEU2LDB4RUMsMHg4QSwweEMxLDB4RTYsMHhFNCwweEY3LDB4QzcsMHgwMSwweDAwLDB4NzQsMHgxMiwweDNCLAorMHg4RSwweDk2LDB4MDAsMHg3NCwweDBDLDB4ODksMHg4RSwweDk2LDB4MDAsMHg4QSwweEM1LDB4RTYsMHhGOCwweDhBLDB4QzEsMHhFNiwKKzB4RjAsMHg1RSwweDU5LDB4QzMsMHg3NywweDA2LDB4OEIsMHg4RSwweDhFLDB4MDAsMHhFQiwweEM1LDB4OEIsMHg4RSwweDkwLDB4MDAsCisweEVCLDB4QkYsMHhENSwweDAzLDB4RjYsMHgwMCwweDNFLDB4MDAsMHgxMCwweDAwLDB4MDQsMHgwMCwweENBLDB4MDQsMHgzMywweDAxLAorMHg0RCwweDAwLDB4MTQsMHgwMCwweDA1LDB4MDAsMHgwMSwweDAzLDB4MDUsMHgwNywweDA5LDB4MDAsMHgwMSwweDAyLDB4MDMsMHgwNCwKKzB4ODAsMHg4NCwweDFFLDB4MDAsMHhBMCwweDI1LDB4MjYsMHgwMCwweDAwLDB4MDAsMHg2MCwweDhCLDB4RjAsMHgzMywweEZGLDB4MkUsCisweEExLDB4NTAsMHgyMywweDJFLDB4OEIsMHgxNiwweDUyLDB4MjMsMHhCQiwweDMyLDB4MjMsMHhGNywweDQ2LDB4MzgsMHg4MCwweDAwLAorMHg3NCwweDBDLDB4MkUsMHhBMSwweDU0LDB4MjMsMHgyRSwweDhCLDB4MTYsMHg1NiwweDIzLDB4QkIsMHgzQywweDIzLDB4QjksMHgwNSwKKzB4MDAsMHgyRSwweDNCLDB4MzEsMHg3MywweDBBLDB4NDcsMHg0NywweEUyLDB4RjcsMHhCOCwweEZGLDB4RkYsMHhFQiwweDFELDB4OTAsCisweEQxLDB4RUYsMHgyRSwweDhBLDB4OEQsMHg0NiwweDIzLDB4MkEsMHhFRCwweEQxLDB4RUEsMHhEMSwweEQ4LDB4RTIsMHhGQSwweEY3LAorMHhGNiwweDA1LDB4MDIsMHgwMCwweEMxLDB4RTgsMHgwMiwweDJFLDB4OEEsMHhBNSwweDRCLDB4MjMsMHgyRSwweEEzLDB4NTgsMHgyMywKKzB4NjEsMHgyRSwweEExLDB4NTgsMHgyMywweEMzLDB4MDgsMHgwMCwweDIwLDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMiwweDYwLDB4MDksCisweDA4LDB4MDAsMHgyMCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMiwweDAwLAorMHgwMywweDAwLDB4MDQsMHgwMCwweDUyLDB4NTYsMHg1NywweDg1LDB4QzAsMHg3NCwweDA1LDB4M0QsMHgwMSwweDA5LDB4NzYsMHgwMywKKzB4QjgsMHgwMSwweDA5LDB4QkYsMHg1QiwweDAxLDB4RjcsMHg0NiwweDM4LDB4ODAsMHgwMCwweDc0LDB4MDMsMHhCRiwweEIyLDB4MDEsCisweDMzLDB4RjYsMHgyRSwweDNCLDB4ODQsMHhCNiwweDIzLDB4NzYsMHgwNCwweDQ2LDB4NDYsMHhFQiwweEY1LDB4RjcsMHhFNywweDJFLAorMHg4QiwweEJDLDB4QzAsMHgyMywweDAzLDB4QzcsMHg4MywweEQyLDB4MDAsMHhEMSwweEU3LDB4RjcsMHhGNywweDJFLDB4OEEsMHhBNCwKKzB4Q0EsMHgyMywweDVGLDB4NUUsMHg1QSwweEMzLDB4RTQsMHgzRSwweDgwLDB4QkUsMHhDMywweDAwLDB4MDMsMHg3NSwweDBDLDB4RjcsCisweDQ2LDB4N0EsMHgyMCwweDAwLDB4NzQsMHgwNSwweDBDLDB4ODAsMHhFNiwweDNFLDB4QzMsMHgyNCwweDdGLDB4RTYsMHgzRSwweEMzLAorMHgyNCwweDAzLDB4ODgsMHg4NiwweEMzLDB4MDAsMHg4QSwweEUwLDB4RTQsMHgxMCwweDI0LDB4RkMsMHgwQSwweEM0LDB4RTYsMHgxMCwKKzB4ODAsMHg4RSwweEExLDB4MDAsMHg0MiwweEU4LDB4Q0UsMHhGRiwweEMzLDB4OTAsMHg1NiwweDhCLDB4RjAsMHg4MywweEU2LDB4MDcsCisweEQxLDB4RTYsMHgyRSwweEZGLDB4QTQsMHg1OCwweDI0LDB4OTAsMHg2OCwweDI0LDB4NkMsMHgyNCwweDcwLDB4MjQsMHg3NCwweDI0LAorMHg3OCwweDI0LDB4ODcsMHgyNCwweDg3LDB4MjQsMHg4NywweDI0LDB4QjQsMHgwMCwweEVCLDB4MEUsMHhCNCwweEMwLDB4RUIsMHgwQSwKKzB4QjQsMHg0MCwweEVCLDB4MDYsMHhCNCwweDIwLDB4RUIsMHgwMiwweEI0LDB4QTAsMHhFNCwweDEwLDB4MjQsMHgxRiwweDBBLDB4QzQsCisweEU2LDB4MTAsMHg4MCwweDhFLDB4QTEsMHgwMCwweDQyLDB4NUUsMHhDMywweDkwLDB4M0MsMHgwMiwweDc3LDB4MTIsMHg4QSwweEUwLAorMHhFNCwweDEwLDB4MjQsMHhGMywweEMwLDB4RTQsMHgwMiwweDBBLDB4QzQsMHhFNiwweDEwLDB4ODAsMHg4RSwweEExLDB4MDAsMHg0MiwKKzB4QzMsMHg5MCwweDhCLDB4NUUsMHgzOCwweDg0LDB4QzAsMHg3NCwweDFGLDB4M0MsMHgwMiwweDc0LDB4MjAsMHg4MywweENCLDB4MDgsCisweDhCLDB4NDYsMHgyRSwweDNCLDB4NDYsMHgzQywweDc3LDB4MEMsMHhFOCwweDg4LDB4RkMsMHg3MiwweDA3LDB4QjAsMHgyNCwweEU2LAorMHgwQSwweDgzLDB4Q0IsMHgxMCwweDg5LDB4NUUsMHgzOCwweEMzLDB4ODMsMHhFMywweEY3LDB4RUIsMHhGNywweEY3LDB4QzMsMHgxMCwKKzB4MDAsMHg3NCwweEY1LDB4RTgsMHg2RCwweEZDLDB4NzIsMHhFQywweDhBLDB4ODYsMHhDMCwweDAwLDB4RTYsMHgzOCwweEIwLDB4MjMsCisweEU2LDB4MEEsMHhFQiwweEUwLDB4OEIsMHg1RSwweDM4LDB4OEIsMHg0NiwweDJFLDB4M0IsMHg0NiwweDNDLDB4RTQsMHhEOCwweDc3LAorMHgwQiwweDI0LDB4RkUsMHg4MCwweENCLDB4MTIsMHhFNiwweEQ4LDB4ODksMHg1RSwweDM4LDB4QzMsMHgwQywweDAxLDB4ODAsMHhDQiwKKzB4MDIsMHhFQiwweEYzLDB4NTAsMHgzMywweERCLDB4QzEsMHhFOCwweDA0LDB4MjUsMHgwRiwweDBGLDB4OEEsMHhEOCwweDJFLDB4OEEsCisweDg3LDB4NjYsMHgxNywweDhBLDB4REMsMHgyRSwweDhBLDB4QTcsMHg2NiwweDE3LDB4MDksMHg0NiwweDNFLDB4NTgsMHhDMywweDUwLAorMHgzMywweERCLDB4QzEsMHhFOCwweDA0LDB4MjUsMHgwRiwweDBGLDB4OEEsMHhEOCwweDJFLDB4OEEsMHg4NywweDY2LDB4MTcsMHg4QSwKKzB4REMsMHgyRSwweDhBLDB4QTcsMHg2NiwweDE3LDB4RjcsMHhEMCwweDIxLDB4NDYsMHgzRSwweDU4LDB4QzMsMHg4QiwweDQ2LDB4M0UsCisweDMzLDB4REIsMHg4QSwweEQ4LDB4MEEsMHhEQywweDJFLDB4OEEsMHg4NywweDc2LDB4MTcsMHhFNiwweDJDLDB4OEEsMHhFMCwweEU0LAorMHgyQSwweDI0LDB4MEYsMHgwQSwweEM0LDB4RTYsMHgyQSwweDhBLDB4ODYsMHhBNSwweDAwLDB4ODQsMHhFNCwweDc1LDB4MEQsMHhBOCwKKzB4ODAsMHg3NCwweDExLDB4MjQsMHg3RiwweDg4LDB4ODYsMHhBNSwweDAwLDB4RTYsMHgwQywweEMzLDB4QTgsMHg4MCwweDc1LDB4MDQsCisweDBDLDB4ODAsMHhFQiwweEYxLDB4QzMsMHgxRSwweDYwLDB4MzMsMHhDOSwweDMzLDB4RDIsMHgzMywweEY2LDB4OEUsMHhEOSwweDhELAorMHhCRSwweEZELDB4MDAsMHg1NywweDhCLDB4MDUsMHg4NCwweEMwLDB4NzQsMHgxNiwweDhCLDB4RDEsMHg0MiwweDhCLDB4RkUsMHg0RiwKKzB4NzgsMHgwOSwweDM4LDB4QTMsMHhFNCwweDAwLDB4NzQsMHgwOCwweDRGLDB4NzksMHhGNywweDg4LDB4QTIsMHhFNCwweDAwLDB4NDYsCisweDVGLDB4ODMsMHhDNywweDA5LDB4NDEsMHg4MywweEY5LDB4MTAsMHg3MiwweEQ5LDB4ODksMHhCNiwweDg2LDB4MDAsMHg4OSwweDk2LAorMHg4NCwweDAwLDB4NjEsMHgxRiwweEMzLDB4NTMsMHhDNywweDQ2LDB4NjYsMHgwMCwweDAwLDB4OEIsMHg0NiwweDY0LDB4QTksMHg0MCwKKzB4MDAsMHg3NCwweDBELDB4QjMsMHgwMCwweEE5LDB4ODAsMHgwMCwweDc0LDB4MDIsMHhCMywweDdGLDB4ODgsMHg5RSwweEMxLDB4MDAsCisweDMyLDB4REIsMHhBOSwweDAyLDB4MDAsMHg3NCwweDAzLDB4ODAsMHhDQiwweDQwLDB4QTksMHgwMCwweDQwLDB4NzQsMHgwMywweDgwLAorMHhDQiwweDAyLDB4QTksMHgwMCwweDgwLDB4NzQsMHgwMywweDgwLDB4Q0IsMHgwMSwweEE5LDB4MzAsMHgxRSwweDc0LDB4MDMsMHg4MCwKKzB4Q0IsMHhCQywweEE5LDB4MDAsMHgyMCwweDc0LDB4MDMsMHg4MCwweENCLDB4MDgsMHhBOSwweDA0LDB4MDEsMHg3NCwweDAzLDB4ODAsCisweENCLDB4MTAsMHhBOSwweDA4LDB4MDAsMHg3NCwweDAzLDB4ODAsMHhDQiwweDIwLDB4ODgsMHg5RSwweEMyLDB4MDAsMHg1QiwweEMzLAorMHgwNiwweDUxLDB4NTcsMHg1MCwweDE2LDB4MDcsMHg4RCwweEJFLDB4QzQsMHgwMCwweEI5LDB4MUYsMHgwMCwweDMzLDB4QzAsMHhBQSwKKzB4NDAsMHhFMiwweEZDLDB4OEIsMHg4NiwweDkyLDB4MDAsMHg4OSwweDg2LDB4OEUsMHgwMCwweDg5LDB4ODYsMHg5MCwweDAwLDB4NTgsCisweDVGLDB4NTksMHgwNywweEMzLDB4RTQsMHhEOCwweEMwLDB4RTgsMHgwNCwweDUzLDB4MjUsMHgwRiwweDAwLDB4OEIsMHhEOCwweDJFLAorMHg4QSwweDg3LDB4NjYsMHgxNywweDg4LDB4ODYsMHhBOSwweDAwLDB4NUEsMHhDMywweDA4LDB4ODYsMHhBQywweDAwLDB4QzYsMHg4NiwKKzB4QkEsMHgwMCwweDAxLDB4QjAsMHgwRSwweEU4LDB4RUEsMHhFOSwweEMzLDB4QUQsMHgzNiwweEEzLDB4QjQsMHgxMywweEFELDB4MzYsCisweEEzLDB4QjYsMHgxMywweEFELDB4MzYsMHhBMywweEI4LDB4MTMsMHg4MywweEU5LDB4MDYsMHgzNiwweEY3LDB4MDYsMHhCNiwweDEzLAorMHgwRiwweDAwLDB4QzMsMHg4QSwweDQ2LDB4MjYsMHhGNywweDQ2LDB4NDgsMHg4MCwweDAwLDB4NzQsMHgwMiwweDBDLDB4MTAsMHg4OCwKKzB4ODYsMHhCRCwweDAwLDB4MzIsMHhDMCwweDgzLDB4N0UsMHgxQSwweDAwLDB4NzUsMHgwRSwweDhCLDB4NUUsMHg0MCwweDQzLDB4ODAsCisweEUzLDB4RkUsMHgzQiwweDVFLDB4MDgsMHg3NSwweDAyLDB4MEMsMHgwMSwweDgzLDB4N0UsMHgzQSwweDAwLDB4NzUsMHgwRCwweDFFLAorMHhDNSwweDVFLDB4MTQsMHg4QiwweDFGLDB4MUYsMHg4NSwweERCLDB4NzUsMHgwMiwweDBDLDB4MDIsMHhGNywweDQ2LDB4MzgsMHgxMCwKKzB4MDAsMHg3NCwweDAyLDB4MEMsMHgwNCwweDhCLDB4NUUsMHg3QSwweEY3LDB4QzMsMHgwMiwweDAwLDB4NzQsMHgwMiwweDBDLDB4MDgsCisweEY3LDB4QzMsMHgwNCwweDAwLDB4NzQsMHgwMiwweDBDLDB4MTAsMHhGNywweEMzLDB4MDgsMHgwMCwweDc0LDB4MDIsMHgwQywweDIwLAorMHhGNywweEMzLDB4NDAsMHgwMCwweDc0LDB4MDIsMHgwQywweDQwLDB4ODgsMHg4NiwweEJGLDB4MDAsMHhDMywweDkwLDB4NkEsMHgwMCwKKzB4MUYsMHhDNiwweDA2LDB4OTMsMHgxMiwweDBELDB4OUMsMHgwRSwweEU4LDB4RjEsMHhFQiwweDkwLDB4QjAsMHgwMiwweEU2LDB4REEsCisweEY4LDB4QzMsMHgzMywweEMwLDB4RTYsMHhEQSwweEY4LDB4QzMsMHhCMCwweDAxLDB4RTYsMHhEOCwweEY4LDB4QzMsMHgzMywweEMwLAorMHhFNiwweEQ4LDB4RjgsMHhDMywweEIwLDB4RkYsMHhFOCwweDRFLDB4RkEsMHhFOCwweEExLDB4RkEsMHhGOCwweEMzLDB4QUMsMHg0OSwKKzB4RTgsMHhBRiwweEZCLDB4RjgsMHhDMywweDkwLDB4QUMsMHg0OSwweEU4LDB4MTUsMHhGRCwweEY4LDB4QzMsMHg5MCwweEFDLDB4NDksCisweEU4LDB4NjcsMHhGRCwweEY4LDB4QzMsMHg5MCwweEFDLDB4NDksMHhFOCwweDFGLDB4RkQsMHhGOCwweEMzLDB4OTAsMHhBQywweDQ5LAorMHhFNiwweDM0LDB4RjgsMHhDMywweEFDLDB4NDksMHhFNiwweDM2LDB4RjgsMHhDMywweEFDLDB4NDksMHgzQywweDAyLDB4NzcsMHgxRiwKKzB4ODQsMHhDMCwweDc1LDB4MUQsMHhFNCwweDE0LDB4MjQsMHhFRiwweEU2LDB4MTQsMHhFNCwweDEyLDB4MjQsMHgzRiwweEU2LDB4MTIsCisweEU0LDB4MTYsMHhBOCwweDA0LDB4NzQsMHgwOSwweEU4LDB4RUEsMHhGOSwweDcyLDB4MDQsMHhCMCwweDE4LDB4RTYsMHgwQSwweEY4LAorMHhDMywweDhBLDB4RTAsMHhFNCwweDE0LDB4MEMsMHgxMCwweEU2LDB4MTQsMHhFNCwweDEyLDB4MEMsMHhDMCwweEY2LDB4QzQsMHgwMSwKKzB4NzQsMHgwMiwweDI0LDB4N0YsMHhFNiwweDEyLDB4RjgsMHhDMywweEFDLDB4NDksMHhFOCwweDI1LDB4RkQsMHhGOCwweEMzLDB4OTAsCisweEI4LDB4MDAsMHg0MCwweEU4LDB4N0QsMHhGRCwweEU4LDB4QjQsMHhGRCwweEU4LDB4QTgsMHhGRSwweEIwLDB4MDEsMHhFOCwweEI5LAorMHhGRSwweEY4LDB4QzMsMHg5MCwweEI4LDB4MDAsMHg0MCwweEU4LDB4ODUsMHhGRCwweEU4LDB4QTAsMHhGRCwweEY4LDB4QzMsMHg5MCwKKzB4QjgsMHgwMCwweDEwLDB4RTgsMHg1RCwweEZELDB4RTgsMHg5NCwweEZELDB4RTgsMHg4OCwweEZFLDB4QjAsMHgwOCwweEU4LDB4OTksCisweEZFLDB4RjgsMHhDMywweDkwLDB4QjgsMHgwMCwweDEwLDB4RTgsMHg2NSwweEZELDB4RTgsMHg4MCwweEZELDB4RjgsMHhDMywweDkwLAorMHhCOCwweDAwLDB4ODAsMHhFOCwweDNELDB4RkQsMHhFOCwweDc0LDB4RkQsMHhFOCwweDY4LDB4RkUsMHhCMCwweDAyLDB4RTgsMHg3OSwKKzB4RkUsMHhGOCwweEMzLDB4OTAsMHhCOCwweDAwLDB4ODAsMHhFOCwweDQ1LDB4RkQsMHhFOCwweDYwLDB4RkQsMHhGOCwweEMzLDB4OTAsCisweEI4LDB4MDAsMHgyMCwweEU4LDB4MUQsMHhGRCwweEU4LDB4NTQsMHhGRCwweEU4LDB4NDgsMHhGRSwweEIwLDB4MDQsMHhFOCwweDU5LAorMHhGRSwweEY4LDB4QzMsMHg5MCwweEI4LDB4MDAsMHgyMCwweEU4LDB4MjUsMHhGRCwweEU4LDB4NDAsMHhGRCwweEY4LDB4QzMsMHg5MCwKKzB4QUMsMHg0OSwweEU4LDB4NDgsMHgxNCwweEU0LDB4M0MsMHgyNCwweEU3LDB4MEEsMHhDNCwweEU2LDB4M0MsMHhGOCwweEMzLDB4OTAsCisweEI4LDB4RkMsMHgzQiwweDg5LDB4NDYsMHg3QywweEU0LDB4M0MsMHgwQywweDE4LDB4RTYsMHgzQywweEY4LDB4QzMsMHhFNCwweDEyLAorMHgwQywweDAyLDB4RTYsMHgxMiwweEY4LDB4QzMsMHhFNCwweDEyLDB4MjQsMHhGRCwweEVCLDB4RjYsMHhFOCwweEI1LDB4RkMsMHhGOCwKKzB4QzMsMHg5MCwweDgzLDB4NjYsMHgzOCwweEZELDB4RjgsMHhDMywweEFDLDB4NDksMHhBOCwweDAxLDB4NzQsMHgwNiwweDgzLDB4NEUsCisweDdBLDB4MjAsMHhFQiwweDA0LDB4ODMsMHg2NiwweDdBLDB4REYsMHhFOCwweENCLDB4RkIsMHhGOCwweEMzLDB4OTAsMHg4QSwweDg2LAorMHhBNSwweDAwLDB4MEMsMHgwMiwweDI0LDB4RkIsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHg4MSwweDRFLDB4MjYsMHgwMSwKKzB4MjAsMHhBQywweDQ5LDB4MzIsMHhFNCwweDg5LDB4NDYsMHg2RSwweDgzLDB4NEUsMHg0OCwweDA4LDB4NDksMHg0NiwweEY5LDB4QzMsCisweDhBLDB4ODYsMHhBNSwweDAwLDB4MEMsMHgwMiwweDI0LDB4RkIsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHg4MSwweDRFLAorMHgyNiwweDAxLDB4MjAsMHhBQywweEI0LDB4MEEsMHhGNiwweEU0LDB4RUIsMHhEOCwweEU4LDB4RkEsMHgxMywweEU0LDB4M0MsMHgyNCwKKzB4RjgsMHgwQSwweEM0LDB4RTYsMHgzQywweEY4LDB4QzMsMHg5MCwweEFELDB4NDksMHg0OSwweDg5LDB4NDYsMHg2NCwweEE5LDB4MDEsCisweDAwLDB4NzQsMHgxQiwweDhCLDB4RDgsMHg4MywweEUzLDB4RkEsMHg3NSwweDFBLDB4QTksMHgwNCwweDAwLDB4NzQsMHgwRiwweEU0LAorMHgzRSwweDBDLDB4MDIsMHhFNiwweDNFLDB4QjgsMHgzOCwweDQ0LDB4ODksMHg0NiwweDYyLDB4RjgsMHhDMywweDkwLDB4RTQsMHgzRSwKKzB4MjQsMHhGQywweEVCLDB4RUYsMHhFNCwweDNFLDB4MjQsMHhGQywweEU2LDB4M0UsMHhFOCwweEU4LDB4RkMsMHhCOCwweEFBLDB4NDAsCisweEVCLDB4RTYsMHhFOCwweDZFLDB4RjgsMHg3MiwweDA1LDB4QjAsMHgxOCwweEU2LDB4MEEsMHhGOCwweEMzLDB4OTAsMHhBQywweDQ5LAorMHhFOCwweENGLDB4RjksMHhGOCwweEMzLDB4OTAsMHhBQywweDQ5LDB4RTgsMHhDRiwweEY5LDB4RjgsMHhDMywweDkwLDB4RTgsMHg2OCwKKzB4RkQsMHg3NSwweDA2LDB4MzIsMHhDMCwweEU2LDB4REEsMHhGOCwweEMzLDB4QjAsMHgwMiwweEU2LDB4REEsMHgzNiwweEEwLDB4QjQsCisweDEzLDB4MjQsMHgxMCwweDM0LDB4MTAsMHhFOCwweDE2LDB4MDEsMHgzNiwweEExLDB4QjQsMHgxMywweEE5LDB4MDEsMHgwMCwweDc0LAorMHgwNSwweEU4LDB4RkMsMHhGRSwweEVCLDB4MEUsMHhBOSwweDAyLDB4MDAsMHg3NCwweDA0LDB4MzIsMHhDMCwweEVCLDB4MDIsMHhCMCwKKzB4MDEsMHhFOCwweERFLDB4RkUsMHgzNiwweEExLDB4QjQsMHgxMywweEU4LDB4QjUsMHgxMywweEU0LDB4M0MsMHgyNCwweEY4LDB4MEEsCisweEM0LDB4RTYsMHgzQywweDM2LDB4QTEsMHhCNCwweDEzLDB4QzEsMHhFOCwweDA1LDB4MjUsMHgwMSwweDAwLDB4RTgsMHhGQSwweEZFLAorMHgzNiwweEEwLDB4QjUsMHgxMywweDI0LDB4MTAsMHhFOCwweDU5LDB4RkIsMHgzMiwweEMwLDB4MzYsMHg4QSwweDI2LDB4QjUsMHgxMywKKzB4RjYsMHhDNCwweDA0LDB4NzQsMHgwOSwweEZFLDB4QzAsMHhGNiwweEM0LDB4MDgsMHg3NCwweDAyLDB4RkUsMHhDMCwweEU4LDB4REIsCisweEZELDB4MzYsMHhBMSwweEI2LDB4MTMsMHgyNSwweDBGLDB4MDAsMHhFOCwweDU3LDB4RjksMHgzNiwweEExLDB4QjYsMHgxMywweEMxLAorMHhFOCwweDA0LDB4MjUsMHgwMywweDAwLDB4RTgsMHhCOCwweEZBLDB4MzYsMHhBMSwweEI2LDB4MTMsMHhDMSwweEU4LDB4MDUsMHgyNSwKKzB4MDIsMHgwMCwweEU4LDB4MDUsMHhGQiwweDM2LDB4QTEsMHhCNiwweDEzLDB4RjYsMHhDNCwweDAxLDB4NzUsMHgwNCwweDMyLDB4QzAsCisweEVCLDB4MDksMHg4MCwweEU0LDB4MDIsMHhEMCwweEVDLDB4QjAsMHgwMiwweDJBLDB4QzQsMHhFOCwweEFDLDB4RkEsMHgzNiwweEY2LAorMHgwNiwweEI3LDB4MTMsMHg0MCwweDc0LDB4MDUsMHhFOCwweDgzLDB4RkUsMHhFQiwweDAzLDB4RTgsMHg4NCwweEZFLDB4MzYsMHhGNiwKKzB4MDYsMHhCNywweDEzLDB4MjAsMHg3NCwweDA1LDB4RTgsMHg2NSwweEZFLDB4RUIsMHgwMywweEU4LDB4NjgsMHhGRSwweEY4LDB4QzMsCisweEU0LDB4MTIsMHgwQywweDAxLDB4RTYsMHgxMiwweEY4LDB4QzMsMHhFNCwweDEyLDB4MjQsMHhGRSwweEVCLDB4RjYsMHhFNCwweDE0LAorMHgyNCwweEYwLDB4MEMsMHgwNSwweEU2LDB4MTQsMHhFNCwweDJBLDB4MjQsMHhGMCwweDBDLDB4MDYsMHhFNiwweDJBLDB4RjgsMHhDMywKKzB4RTQsMHgyQSwweDI0LDB4RjAsMHhFNiwweDJBLDB4RTQsMHgxNCwweDI0LDB4RjAsMHgwQywweDA3LDB4RTYsMHgxNCwweEY4LDB4QzMsCisweEFELDB4NDksMHg0OSwweEU4LDB4NjQsMHhGOSwweDg5LDB4ODYsMHg4RSwweDAwLDB4RjgsMHhDMywweEFELDB4NDksMHg0OSwweEU4LAorMHg1OCwweEY5LDB4ODksMHg4NiwweDkwLDB4MDAsMHhGOCwweEMzLDB4ODMsMHg0RSwweDI2LDB4MDQsMHhFOCwweEE4LDB4RjcsMHhGOCwKKzB4QzMsMHg5MCwweDgzLDB4NjYsMHgyNiwweEZCLDB4RTgsMHg5RSwweEY3LDB4RjgsMHhDMywweDkwLDB4QUMsMHg0OSwweDg0LDB4QzAsCisweDc1LDB4MEQsMHhFNCwweDEwLDB4MjQsMHhFRiwweEU2LDB4MTAsMHg4MCwweDhFLDB4QTEsMHgwMCwweDQyLDB4RjgsMHhDMywweEU0LAorMHgxMCwweDBDLDB4MTAsMHhFQiwweEYxLDB4OTAsMHhBQywweDQ5LDB4M0MsMHgwMiwweDc2LDB4MDIsMHgzMiwweEMwLDB4QzAsMHhFMCwKKzB4MDQsMHhBOCwweDIwLDB4NzQsMHgwMiwweDBDLDB4MDgsMHgyNCwweDE4LDB4OEEsMHhFMCwweEU0LDB4MTIsMHgyNCwweEU3LDB4MEEsCisweEM0LDB4RTYsMHgxMiwweDgwLDB4OEUsMHhBMSwweDAwLDB4NDQsMHhGOCwweEMzLDB4QUMsMHg0OSwweDg4LDB4ODYsMHhDMCwweDAwLAorMHhGOCwweEMzLDB4QUMsMHg0OSwweEU2LDB4M0EsMHhGOCwweEMzLDB4QUMsMHg0OSwweDg0LDB4QzAsMHg3NCwweDA4LDB4RTQsMHgxMiwKKzB4MEMsMHgwNCwweEU2LDB4MTIsMHhGOCwweEMzLDB4RTQsMHgxMiwweDI0LDB4RkIsMHhFQiwweEY2LDB4QUMsMHg0OSwweEU4LDB4RDYsCisweEY2LDB4NzMsMHgwMywweEU4LDB4MjcsMHhGNywweEY4LDB4QzMsMHhFNCwweDEyLDB4QTgsMHgwMiwweDc0LDB4MDQsMHgyNCwweEZELAorMHhFNiwweDEyLDB4QjgsMHhGMCwweDAwLDB4RTgsMHg4NywweEZBLDB4ODEsMHg2NiwweDI2LDB4RkYsMHhGMywweEU4LDB4NTcsMHhGNywKKzB4RTgsMHg5QSwweEZBLDB4RjgsMHhDMywweDkwLDB4QjgsMHg4MCwweDAwLDB4RTgsMHg1NywweEZBLDB4ODAsMHg0RSwweDI3LDB4MDgsCisweEU4LDB4NDQsMHhGNywweEU4LDB4ODcsMHhGQSwweEY4LDB4QzMsMHhCOCwweDgwLDB4MDAsMHhFOCwweDYxLDB4RkEsMHg4MSwweDY2LAorMHgyNiwweEZGLDB4RjcsMHhFOCwweDMxLDB4RjcsMHhFOCwweDc0LDB4RkEsMHhGOCwweEMzLDB4OTAsMHhCOCwweDEwLDB4MDAsMHhFOCwKKzB4MzEsMHhGQSwweDgwLDB4NEUsMHgyNywweDA0LDB4RTgsMHgxRSwweEY3LDB4RTgsMHg2MSwweEZBLDB4RjgsMHhDMywweEI4LDB4MTAsCisweDAwLDB4RTgsMHgzQiwweEZBLDB4ODEsMHg2NiwweDI2LDB4RkYsMHhGQiwweEU4LDB4MEIsMHhGNywweEU4LDB4NEUsMHhGQSwweEY4LAorMHhDMywweDkwLDB4MzMsMHhDMCwweEFDLDB4NDksMHgzQywweDAxLDB4NzMsMHgwNCwweEIwLDB4MDEsMHhFQiwweDA2LDB4M0MsMHgwQywKKzB4NzYsMHgwMiwweEIwLDB4MEMsMHg4OSwweDQ2LDB4MUMsMHhGOCwweEMzLDB4OTAsMHg4MSwweDRFLDB4MjYsMHgwMCwweDIwLDB4OEEsCisweDg2LDB4QTUsMHgwMCwweDBDLDB4MDIsMHgyNCwweEZCLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4ODMsMHg0RSwweDI2LAorMHgwMSwweEY4LDB4QzMsMHg5MCwweDgxLDB4NEUsMHgyNiwweDAwLDB4NDAsMHg4QSwweDg2LDB4QTUsMHgwMCwweDBDLDB4MDIsMHg4OCwKKzB4ODYsMHhBNSwweDAwLDB4RTYsMHgwQywweEY4LDB4QzMsMHg5MCwweEFDLDB4NDksMHg1MCwweEU4LDB4MDUsMHhGNiwweDU4LDB4NzIsCisweDA4LDB4RTYsMHgzOCwweEIwLDB4MjMsMHhFNiwweDBBLDB4RjgsMHhDMywweEY5LDB4QzMsMHg5MCwweEFDLDB4NTAsMHhBRCwweEU4LAorMHg4MiwweEY4LDB4NUEsMHhGNiwweEMyLDB4MDEsMHg3NCwweDEyLDB4MzksMHg4NiwweDk2LDB4MDAsMHg3NCwweDBDLDB4ODksMHg4NiwKKzB4OTYsMHgwMCwweEU2LDB4RjAsMHg4NiwweEUwLDB4RTYsMHhGOCwweDg2LDB4RTAsMHhGNiwweEMyLDB4MDIsMHg3NCwweDEwLDB4MzksCisweDg2LDB4OTQsMHgwMCwweDc0LDB4MEEsMHg4OSwweDg2LDB4OTQsMHgwMCwweEU2LDB4RTQsMHg4NiwweEUwLDB4RTYsMHhFQywweDgzLAorMHhFOSwweDAzLDB4QzMsMHg5MCwweEU0LDB4MTYsMHg4OCwweDg2LDB4QkMsMHgwMCwweEU4LDB4RTYsMHhGQSwweDMzLDB4REIsMHhFNCwKKzB4MEMsMHhBOCwweDA2LDB4NzQsMHgwMywweDgwLDB4Q0IsMHgwMSwweEE4LDB4MTAsMHg3NCwweDAzLDB4ODAsMHhDQiwweDAyLDB4QTgsCisweDgwLDB4NzQsMHgwMywweDgwLDB4Q0IsMHgwNCwweEU0LDB4MTIsMHg4QSwweEUwLDB4MjQsMHgxOCwweDBBLDB4RDgsMHhFNCwweERBLAorMHhGNiwweEM0LDB4MDIsMHg3NCwweDA3LDB4QTgsMHg0MCwweDc1LDB4MDMsMHg4MCwweENCLDB4MjAsMHhBOCwweDAyLDB4NzUsMHgwOSwKKzB4RTQsMHgyQSwweEE4LDB4MEYsMHg3NCwweDAzLDB4ODAsMHhDQiwweDQwLDB4RjcsMHg0NiwweDM4LDB4MDIsMHgwMCwweDc0LDB4MDksCisweEU0LDB4RDgsMHhBOCwweDAxLDB4NzUsMHgwMywweDgwLDB4Q0IsMHg4MCwweDg4LDB4OUUsMHhCRSwweDAwLDB4RkUsMHg4NiwweEI0LAorMHgwMCwweEIwLDB4MEEsMHhFOCwweDVDLDB4RTQsMHhGOCwweEMzLDB4QUMsMHg0OSwweDNDLDB4MDIsMHg3NCwweDQxLDB4NzcsMHgxRiwKKzB4NTAsMHhFOCwweDRGLDB4RjUsMHg1OCwweDcyLDB4MEMsMHg4NCwweEMwLDB4NzQsMHgwQSwweEIwLDB4MTIsMHhFNiwweDBBLDB4ODAsCisweDRFLDB4MzgsMHgwMSwweEY4LDB4QzMsMHhCMCwweDExLDB4RTYsMHgwQSwweDgwLDB4NjYsMHgzOCwweEZFLDB4RjgsMHhDMywweDhCLAorMHg0NiwweDM4LDB4MjUsMHhGRiwweEY3LDB4ODksMHg0NiwweDM4LDB4QTksMHgwMCwweDA0LDB4NzUsMHhFNiwweDhBLDB4ODYsMHhBNSwKKzB4MDAsMHhBOCwweDEwLDB4NzUsMHhERSwweDBDLDB4MTAsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHhGOCwweEMzLDB4ODEsCisweDRFLDB4MzgsMHgwMCwweDA4LDB4OEEsMHg4NiwweEE1LDB4MDAsMHhBOCwweDEwLDB4NzQsMHhDNywweDI0LDB4RUYsMHhFQiwweEU3LAorMHhBRCwweDQ5LDB4NDksMHgzQywweDAxLDB4NzIsMHgxMSwweDNDLDB4MEMsMHg3NywweDBELDB4NTAsMHg4QSwweEUwLDB4RTQsMHgxNCwKKzB4MjUsMHhGMCwweDBGLDB4MEEsMHhDNCwweEU2LDB4MTQsMHg1OCwweDhBLDB4QzQsMHg4NCwweEMwLDB4NzQsMHgwMiwweEU2LDB4NDIsCisweEY4LDB4QzMsMHhFOCwweENGLDB4RjksMHhGRSwweDg2LDB4QjksMHgwMCwweEIwLDB4MEUsMHhFOCwweEQ0LDB4RTMsMHhGOCwweEMzLAorMHgzQSwweDg2LDB4QUYsMHgwMCwweDc0LDB4MUYsMHg4OCwweDg2LDB4QUYsMHgwMCwweDhBLDB4RTAsMHg4MCwweEMyLDB4MDYsMHhCMCwKKzB4QkYsMHhFRSwweDgwLDB4RUEsMHgwMiwweDhBLDB4QzQsMHhFRSwweDhBLDB4ODYsMHhBOCwweDAwLDB4ODAsMHhDMiwweDAyLDB4RUUsCisweDgwLDB4RUEsMHgwNiwweDhBLDB4QzQsMHhDMywweDhCLDB4NDYsMHgzRSwweDg1LDB4QzAsMHg4QSwweDg2LDB4QTUsMHgwMCwweDc0LAorMHgxMiwweEE4LDB4MDgsMHg3NSwweDBELDB4MEMsMHgwOCwweDg4LDB4ODYsMHhBNSwweDAwLDB4ODAsMHhDMiwweDAyLDB4RUUsMHg4MCwKKzB4RUEsMHgwMiwweEMzLDB4QTgsMHgwOCwweDc0LDB4RkIsMHgyNCwweEY3LDB4RUIsMHhFQywweDhCLDB4NDYsMHgyNiwweDg0LDB4QzAsCisweDc0LDB4MTYsMHg4QSwweDg2LDB4QTUsMHgwMCwweEE4LDB4MDIsMHg3NCwweDBELDB4MjQsMHhGRCwweDg4LDB4ODYsMHhBNSwweDAwLAorMHg4MywweEMyLDB4MDIsMHhFRSwweDgzLDB4RUEsMHgwMiwweEMzLDB4OEEsMHg4NiwweEE1LDB4MDAsMHhBOCwweDAyLDB4NzUsMHhGNywKKzB4MEMsMHgwMiwweEVCLDB4RTgsMHg1MiwweDgzLDB4QzIsMHgwQywweEVDLDB4QzAsMHhFOCwweDA0LDB4ODgsMHg4NiwweEE5LDB4MDAsCisweDhCLDB4NUUsMHgyNiwweDgwLDB4RTMsMHgzRiwweEY2LDB4QzcsMHgwNCwweDc0LDB4MDcsMHhBOCwweDA4LDB4NzUsMHgwMywweDgwLAorMHhDQiwweDQwLDB4RjYsMHhDNywweDA4LDB4NzQsMHgwNywweEE4LDB4MDIsMHg3NSwweDAzLDB4ODAsMHhDQiwweDgwLDB4ODgsMHg1RSwKKzB4MjYsMHg4QSwweDg2LDB4QTUsMHgwMCwweDg0LDB4REIsMHg3NCwweDEwLDB4QTgsMHgwMiwweDc0LDB4MEEsMHgyNCwweEZELDB4ODgsCisweDg2LDB4QTUsMHgwMCwweDgzLDB4RUEsMHgwQSwweEVFLDB4NUEsMHhDMywweEE4LDB4MDIsMHg3NSwweEZBLDB4MEMsMHgwMiwweEVCLAorMHhFRSwweDkwLDB4RkYsMHhGRiwweDAwLDB4NDgsMHgwMCwweDMwLDB4QkEsMHgyMCwweEM0LDB4MUEsMHgwMCwweDE4LDB4MDAsMHgxMiwKKzB4MDAsMHgwQywweDAwLDB4MDYsMHgwMCwweDAzLDB4MDAsMHgwMiwweDgwLDB4MDEsMHhDMCwweDAwLDB4NjAsMHgwMCwweDMwLDB4MDAsCisweDE4LDB4MDAsMHhDRCwweDAxLDB4MDAsMHgwMSwweDgwLDB4MDAsMHgxMCwweDAwLDB4MTAsMHgwMCwweDBFLDB4MDAsMHgwQywweDAwLAorMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNiwweDAwLDB4MDQsMHgwMCwweDAzLDB4MDAsMHgwMiwweDAwLDB4MDEsMHgwMCwKKzB4NTIsMHg1MSwweDU2LDB4M0MsMHgxRSwweDc3LDB4NDcsMHg5OCwweDhCLDB4RjAsMHg4QSwweDgyLDB4QzQsMHgwMCwweDMyLDB4RTQsCisweDgzLDB4RkUsMHgxOCwweDc0LDB4M0QsMHg4MywweEZFLDB4MTksMHg3NCwweDNFLDB4ODMsMHhGRSwweDFFLDB4NzcsMHgyRiwweEQxLAorMHhFNiwweDJFLDB4OEIsMHg4QywweDMyLDB4MkQsMHgzQiwweDhFLDB4OTQsMHgwMCwweDc0LDB4MjIsMHg4OSwweDhFLDB4OTQsMHgwMCwKKzB4ODMsMHhDMiwweDA2LDB4OEEsMHg4NiwweEE4LDB4MDAsMHg4QSwweEUwLDB4MEMsMHg4MCwweEVFLDB4ODMsMHhFQSwweDA2LDB4OEEsCisweEMxLDB4RUUsMHg4MywweEMyLDB4MDIsMHg4QSwweEM1LDB4RUUsMHg4MywweEMyLDB4MDQsMHg4QSwweEM0LDB4RUUsMHg1RSwweDU5LAorMHg1QSwweEMzLDB4OEIsMHg4RSwweDhFLDB4MDAsMHhFQiwweENFLDB4OEIsMHg4RSwweDkwLDB4MDAsMHhFQiwweEM4LDB4NTIsMHg1MSwKKzB4M0QsMHgwNSwweDAwLDB4NzcsMHgwMywweEI4LDB4MDUsMHgwMCwweDhCLDB4QzgsMHhCQSwweDAyLDB4MDAsMHhCOCwweDAwLDB4RDAsCisweEY3LDB4RjEsMHgwNSwweDAxLDB4MDAsMHhEMSwweEU4LDB4NTksMHg1QSwweEMzLDB4OEIsMHg0NiwweDdBLDB4QTgsMHgyMCwweDc0LAorMHgwQiwweDgwLDB4QkUsMHhDMywweDAwLDB4MDMsMHg3NSwweDA0LDB4MEMsMHgwMSwweEVCLDB4MDIsMHgyNCwweEZFLDB4ODksMHg0NiwKKzB4N0EsMHhDMywweDI0LDB4MDMsMHg4OCwweDg2LDB4QzMsMHgwMCwweDhBLDB4QTYsMHhBOCwweDAwLDB4OEEsMHhEQywweDgwLDB4RTQsCisweEZDLDB4MEEsMHhDNCwweDNBLDB4QzMsMHg3NCwweDBCLDB4ODgsMHg4NiwweEE4LDB4MDAsMHg4MywweEMyLDB4MDYsMHhFRSwweDgzLAorMHhFQSwweDA2LDB4RTgsMHhDNSwweEZGLDB4QzMsMHgwMCwweDA4LDB4MTgsMHgzOCwweDI4LDB4OTAsMHgzQywweDA0LDB4NzcsMHgyMywKKzB4MzIsMHhFNCwweDhCLDB4RDgsMHgyRSwweDhBLDB4ODcsMHgyNiwweDJFLDB4OEEsMHhBNiwweEE4LDB4MDAsMHg4QSwweERDLDB4ODAsCisweEU0LDB4QzcsMHgwQSwweEM0LDB4M0EsMHhDMywweDc0LDB4MEIsMHg4OCwweDg2LDB4QTgsMHgwMCwweDgzLDB4QzIsMHgwNiwweEVFLAorMHg4MywweEVBLDB4MDYsMHhDMywweDg0LDB4QzAsMHg3NCwweDAyLDB4QjAsMHgwNCwweDhBLDB4QTYsMHhBOCwweDAwLDB4OEEsMHhEQywKKzB4ODAsMHhFNCwweEZCLDB4MEEsMHhDNCwweDNBLDB4QzMsMHg3NCwweDBCLDB4ODgsMHg4NiwweEE4LDB4MDAsMHg4MywweEMyLDB4MDYsCisweEVFLDB4ODMsMHhFQSwweDA2LDB4QzMsMHg5MCwweDhCLDB4NUUsMHgzOCwweDg0LDB4QzAsMHg3NCwweDM0LDB4M0MsMHgwMiwweDc0LAorMHgzQiwweDhBLDB4ODYsMHhBRiwweDAwLDB4MEMsMHgwNCwweEU4LDB4RTYsMHhGRCwweDhCLDB4NDYsMHgyRSwweDNCLDB4NDYsMHgzQywKKzB4NzcsMHgxQiwweEY3LDB4QzMsMHgwMCwweDA0LDB4NzUsMHgxNSwweDgxLDB4Q0IsMHgwMCwweDA0LDB4ODMsMHhDMiwweDAyLDB4OEEsCisweDg2LDB4QTUsMHgwMCwweDI0LDB4RkEsMHg4OCwweDg2LDB4QTUsMHgwMCwweEVFLDB4ODMsMHhFQSwweDAyLDB4ODksMHg1RSwweDM4LAorMHhDMywweDhBLDB4ODYsMHhBRiwweDAwLDB4MjQsMHhGQiwweEU4LDB4QjYsMHhGRCwweEVCLDB4RjEsMHhGNywweEMzLDB4MTAsMHgwMCwKKzB4NzQsMHhFRiwweEVCLDB4RUQsMHg4MywweEMyLDB4MEMsMHhFQywweDgzLDB4RUEsMHgwQywweEMwLDB4RTgsMHgwNCwweDg4LDB4ODYsCisweEE5LDB4MDAsMHhDMywweDkwLDB4OEEsMHg4NiwweEE3LDB4MDAsMHgwQywweDAxLDB4ODgsMHg4NiwweEE3LDB4MDAsMHg4QiwweERBLAorMHg4MCwweEMyLDB4MDgsMHhFRSwweDhCLDB4RDMsMHhGOCwweEMzLDB4OEEsMHg4NiwweEE3LDB4MDAsMHgyNCwweEZFLDB4RUIsMHhFQSwKKzB4OEEsMHg4NiwweEE3LDB4MDAsMHgwQywweDAyLDB4RUIsMHhFMiwweDhBLDB4ODYsMHhBNywweDAwLDB4MjQsMHhGRCwweEVCLDB4REEsCisweEIwLDB4RkYsMHhFOCwweDUyLDB4RjIsMHhFOCwweDk3LDB4RjIsMHhGOCwweEMzLDB4QUMsMHg0OSwweEU4LDB4NjEsMHhGRSwweEY4LAorMHhDMywweDkwLDB4QUMsMHg0OSwweEU4LDB4RUIsMHhGRSwweEY4LDB4QzMsMHg5MCwweEFDLDB4NDksMHhFOCwweDM1LDB4RkYsMHhGOCwKKzB4QzMsMHg5MCwweEFDLDB4NDksMHhFOCwweDA1LDB4RkYsMHhGOCwweEMzLDB4OTAsMHg1MiwweDgzLDB4QzIsMHgwNiwweEIwLDB4QkYsCisweEVFLDB4NTIsMHg4MywweEMyLDB4MDIsMHhBQywweDQ5LDB4RUUsMHg1QSwweDhBLDB4ODYsMHhBOCwweDAwLDB4RUUsMHg1QSwweEY4LAorMHhDMywweDkwLDB4NTIsMHg4MywweEMyLDB4MDYsMHhCMCwweEJGLDB4RUUsMHg1MiwweDgzLDB4QzIsMHgwNiwweEVCLDB4RTYsMHg5MCwKKzB4QUMsMHg0OSwweDNDLDB4MDIsMHg3NywweDBELDB4ODQsMHhDMCwweDc1LDB4MEIsMHg4QSwweDg2LDB4QUYsMHgwMCwweDI0LDB4RkQsCisweEU4LDB4MEQsMHhGRCwweEY4LDB4QzMsMHg1MCwweDhBLDB4ODYsMHhBRiwweDAwLDB4MEMsMHgwMiwweEU4LDB4MDEsMHhGRCwweDVCLAorMHg4MywweEMyLDB4MDgsMHg4QSwweDg2LDB4QTcsMHgwMCwweEY2LDB4QzMsMHgwMSwweDc0LDB4MEMsMHgyNCwweERGLDB4ODgsMHg4NiwKKzB4QTcsMHgwMCwweEVFLDB4ODMsMHhFQSwweDA4LDB4RjgsMHhDMywweDBDLDB4MjAsMHhFQiwweEYyLDB4QUMsMHg0OSwweEU4LDB4RTUsCisweEZFLDB4RjgsMHhDMywweDkwLDB4QjgsMHgwMCwweDQwLDB4RTgsMHg2OSwweEY1LDB4RTgsMHhGOSwweEZDLDB4RTgsMHgyNCwweEZGLAorMHhCMCwweDAxLDB4RTgsMHhBNSwweEY2LDB4RjgsMHhDMywweDkwLDB4QjgsMHgwMCwweDQwLDB4RTgsMHg3MSwweEY1LDB4RTgsMHhFNSwKKzB4RkMsMHhGOCwweEMzLDB4OTAsMHhCOCwweDAwLDB4MTAsMHhFOCwweDQ5LDB4RjUsMHhFOCwweEQ5LDB4RkMsMHhFOCwweDA0LDB4RkYsCisweEIwLDB4MDgsMHhFOCwweDg1LDB4RjYsMHhGOCwweEMzLDB4OTAsMHhCOCwweDAwLDB4MTAsMHhFOCwweDUxLDB4RjUsMHhFOCwweEM1LAorMHhGQywweEY4LDB4QzMsMHg5MCwweEI4LDB4MDAsMHg4MCwweEU4LDB4MjksMHhGNSwweEU4LDB4QjksMHhGQywweEU4LDB4RTQsMHhGRSwKKzB4QjAsMHgwMiwweEU4LDB4NjUsMHhGNiwweEY4LDB4QzMsMHg5MCwweEI4LDB4MDAsMHg4MCwweEU4LDB4MzEsMHhGNSwweEU4LDB4QTUsCisweEZDLDB4RjgsMHhDMywweDkwLDB4QjgsMHgwMCwweDIwLDB4RTgsMHgwOSwweEY1LDB4RTgsMHg5OSwweEZDLDB4RTgsMHhDNCwweEZFLAorMHhCMCwweDA0LDB4RTgsMHg0NSwweEY2LDB4RjgsMHhDMywweDkwLDB4QjgsMHgwMCwweDIwLDB4RTgsMHgxMSwweEY1LDB4RTgsMHg4NSwKKzB4RkMsMHhGOCwweEMzLDB4OTAsMHhBQywweDQ5LDB4RTgsMHgzNCwweDBDLDB4RjgsMHhDMywweDkwLDB4QjgsMHhGQywweDNCLDB4ODksCisweDQ2LDB4N0MsMHhGOCwweEMzLDB4OEEsMHg4NiwweEFGLDB4MDAsMHgwQywweDgwLDB4RTgsMHg0MywweEZDLDB4RjgsMHhDMywweDkwLAorMHg4QSwweDg2LDB4QUYsMHgwMCwweDI0LDB4N0YsMHhFQiwweEYyLDB4OEEsMHg4NiwweEFGLDB4MDAsMHgwQywweDQwLDB4RTgsMHgyRiwKKzB4RkMsMHhGOCwweEMzLDB4OTAsMHg4QSwweDg2LDB4QUYsMHgwMCwweDI0LDB4QkYsMHhFQiwweEYyLDB4QUMsMHg0OSwweEE4LDB4MDEsCisweDc0LDB4MDcsMHg4MywweDRFLDB4N0EsMHgyMCwweEVCLDB4MDUsMHg5MCwweDgzLDB4NjYsMHg3QSwweERGLDB4RTgsMHg4QSwweEZELAorMHhGOCwweEMzLDB4ODMsMHhDMiwweDA2LDB4OEEsMHg4NiwweEE4LDB4MDAsMHgwQywweDQwLDB4ODgsMHg4NiwweEE4LDB4MDAsMHhFRSwKKzB4ODMsMHhFQSwweDA2LDB4QUMsMHg0OSwweDMyLDB4RTQsMHg4OSwweDQ2LDB4NkUsMHg4MywweDRFLDB4MjYsMHgwMSwweDgzLDB4NEUsCisweDQ4LDB4MDgsMHhCMCwweDA2LDB4RTgsMHhCQiwweERGLDB4NDksMHg0NiwweEY5LDB4QzMsMHg5MCwweDgzLDB4QzIsMHgwNiwweDhBLAorMHg4NiwweEE4LDB4MDAsMHgwQywweDQwLDB4ODgsMHg4NiwweEE4LDB4MDAsMHhFRSwweDgzLDB4RUEsMHgwNiwweEFDLDB4QjQsMHgwQSwKKzB4RjYsMHhFNCwweEVCLDB4RDAsMHhFOCwweEUwLDB4MEIsMHhGOCwweEMzLDB4OTAsMHhBRCwweDQ5LDB4NDksMHg4OSwweDQ2LDB4NjQsCisweEE5LDB4MDEsMHgwMCwweDc0LDB4MTksMHg4QiwweEQ4LDB4ODMsMHhFMywweEZBLDB4NzUsMHgwQSwweEE5LDB4MDQsMHgwMCwweDc0LAorMHgwRCwweEI4LDB4RTIsMHgzRiwweEVCLDB4MEIsMHhFOCwweEVDLDB4RjQsMHhCOCwweEFBLDB4NDAsMHhFQiwweDAzLDB4QjgsMHgzOCwKKzB4NDQsMHg4OSwweDQ2LDB4NjIsMHhGOCwweEMzLDB4OEEsMHg4NiwweEFGLDB4MDAsMHhBOCwweDAyLDB4NzQsMHgwQSwweDI0LDB4RkQsCisweEU4LDB4OEQsMHhGQiwweDBDLDB4MDIsMHhFOCwweDg4LDB4RkIsMHhGOCwweEMzLDB4QUMsMHg0OSwweEU4LDB4ODEsMHhGQywweEY4LAorMHhDMywweDkwLDB4QUMsMHg0OSwweEU4LDB4NzksMHhGQywweEY4LDB4QzMsMHg5MCwweEU4LDB4NUMsMHhGNSwweDc1LDB4MDUsMHhFOCwKKzB4RTYsMHhGRCwweEY4LDB4QzMsMHhFOCwweENELDB4RkQsMHgzNiwweEEwLDB4QjQsMHgxMywweDI0LDB4MTAsMHgzNCwweDEwLDB4RTgsCisweDI2LDB4MDEsMHgzNiwweEExLDB4QjQsMHgxMywweEE5LDB4MDEsMHgwMCwweDc0LDB4MDUsMHhFOCwweEZFLDB4RkUsMHhFQiwweDBFLAorMHhBOSwweDAyLDB4MDAsMHg3NCwweDA0LDB4MzIsMHhDMCwweEVCLDB4MDIsMHhCMCwweDAxLDB4RTgsMHhFOCwweEZFLDB4MzYsMHhBMSwKKzB4QjQsMHgxMywweEU4LDB4QUIsMHgwQiwweDM2LDB4QTEsMHhCNCwweDEzLDB4QzEsMHhFOCwweDA1LDB4MjUsMHgwMSwweDAwLDB4RTgsCisweDBDLDB4RkYsMHgzNiwweEEwLDB4QjUsMHgxMywweDI0LDB4MTAsMHhFOCwweDJCLDB4RkQsMHgzMiwweEMwLDB4MzYsMHg4QSwweDI2LAorMHhCNSwweDEzLDB4RjYsMHhDNCwweDA0LDB4NzQsMHgwOSwweEZFLDB4QzAsMHhGNiwweEM0LDB4MDgsMHg3NCwweDAyLDB4RkUsMHhDMCwKKzB4RTgsMHhFRiwweEZELDB4MzYsMHhBMSwweEI2LDB4MTMsMHgyNSwweDBGLDB4MDAsMHhFOCwweDAzLDB4RkMsMHgzNiwweEExLDB4QjYsCisweDEzLDB4QzEsMHhFOCwweDA0LDB4MjUsMHgwMywweDAwLDB4RTgsMHg4OCwweEZDLDB4MzYsMHhBMSwweEI2LDB4MTMsMHhDMSwweEU4LAorMHgwNSwweDI1LDB4MDIsMHgwMCwweEU4LDB4Q0QsMHhGQywweDM2LDB4QTEsMHhCNiwweDEzLDB4RjYsMHhDNCwweDAxLDB4NzUsMHgwNCwKKzB4MzIsMHhDMCwweEVCLDB4MDksMHg4MCwweEU0LDB4MDIsMHhEMCwweEVDLDB4QjAsMHgwMiwweDJBLDB4QzQsMHhFOCwweDhDLDB4RkMsCisweDM2LDB4RjYsMHgwNiwweEI3LDB4MTMsMHg0MCwweDc0LDB4MDUsMHhFOCwweDhELDB4RkUsMHhFQiwweDAzLDB4RTgsMHg5NCwweEZFLAorMHgzNiwweEY2LDB4MDYsMHhCNywweDEzLDB4MjAsMHg3NCwweDA1LDB4RTgsMHg2OSwweEZFLDB4RUIsMHgwMywweEU4LDB4NzAsMHhGRSwKKzB4RjgsMHhDMywweEY4LDB4QzMsMHg4QiwweDQ2LDB4MzgsMHhBOSwweDA0LDB4MDAsMHg3NSwweDIzLDB4MEQsMHgwNCwweDAwLDB4ODksCisweDQ2LDB4MzgsMHg4MywweEMyLDB4MDgsMHg4QiwweDQ2LDB4MkUsMHgzQiwweDQ2LDB4M0MsMHg3MywweDE0LDB4ODMsMHg0RSwweDM4LAorMHgxMCwweDhBLDB4ODYsMHhBNywweDAwLDB4MjQsMHhGRSwweDg4LDB4ODYsMHhBNywweDAwLDB4RUUsMHg4MywweEVBLDB4MDgsMHhGOCwKKzB4QzMsMHg4QSwweDg2LDB4QTcsMHgwMCwweDBDLDB4MDEsMHhFQiwweEVFLDB4OTAsMHg4QiwweDQ2LDB4MzgsMHhBOSwweDA0LDB4MDAsCisweDc0LDB4MDYsMHgyNSwweEZCLDB4RkYsMHg4OSwweDQ2LDB4MzgsMHhGOCwweEMzLDB4QUQsMHg0OSwweDQ5LDB4RTgsMHhCRSwweEZCLAorMHg4OSwweDg2LDB4OEUsMHgwMCwweEY4LDB4QzMsMHhBRCwweDQ5LDB4NDksMHhFOCwweEIyLDB4RkIsMHg4OSwweDg2LDB4OTAsMHgwMCwKKzB4RjgsMHhDMywweDgzLDB4NEUsMHgyNiwweDA0LDB4RTgsMHg5MiwweEZBLDB4RjgsMHhDMywweDkwLDB4ODMsMHg2NiwweDI2LDB4RkIsCisweEU4LDB4ODgsMHhGQSwweEY4LDB4QzMsMHg5MCwweEFDLDB4NDksMHg4NCwweEMwLDB4NzUsMHgwNywweDgwLDB4OEUsMHhBMywweDAwLAorMHgwNCwweEY4LDB4QzMsMHg4MCwweEE2LDB4QTMsMHgwMCwweEZCLDB4RjgsMHhDMywweEFDLDB4NDksMHg4MywweEMyLDB4MDgsMHgzQywKKzB4MDIsMHg3NiwweDAyLDB4MzIsMHhDMCwweDNDLDB4MDEsMHg3NCwweDEyLDB4NzcsMHgwQiwweDhBLDB4ODYsMHhBNywweDAwLDB4MjQsCisweEVGLDB4ODgsMHg4NiwweEE3LDB4MDAsMHhFRSwweDgzLDB4RUEsMHgwOCwweEY4LDB4QzMsMHg4QSwweDg2LDB4QTcsMHgwMCwweDBDLAorMHgxMCwweEVCLDB4RUUsMHg5MCwweDUyLDB4ODMsMHhDMiwweDA2LDB4QjAsMHhCRiwweEVFLDB4NTIsMHg4MywweEMyLDB4MDQsMHhBQywKKzB4NDksMHhFRSwweDVBLDB4OEEsMHg4NiwweEE4LDB4MDAsMHhFRSwweDVBLDB4RjgsMHhDMywweDkwLDB4NTIsMHg4MywweEMyLDB4MDYsCisweEIwLDB4QkYsMHhFRSwweDUyLDB4ODMsMHhDMiwweDA4LDB4RUIsMHhFNiwweDkwLDB4QUMsMHg0OSwweEY4LDB4QzMsMHhBQywweDQ5LAorMHhFOCwweEI0LDB4RUUsMHg3MywweDAzLDB4RTgsMHhGNywweEVFLDB4RjgsMHhDMywweDhBLDB4ODYsMHhBRiwweDAwLDB4MjQsMHg3RiwKKzB4RTgsMHhCRCwweEY5LDB4QjgsMHhGMCwweDAwLDB4RTgsMHg2NiwweEYyLDB4ODEsMHg2NiwweDI2LDB4RkYsMHhGMywweEU4LDB4MjMsCisweEZBLDB4RTgsMHhEMiwweEY5LDB4RjgsMHhDMywweEI4LDB4ODAsMHgwMCwweEU4LDB4MzcsMHhGMiwweDgwLDB4NEUsMHgyNywweDA4LAorMHhFOCwweDExLDB4RkEsMHhFOCwweEMwLDB4RjksMHhGOCwweEMzLDB4QjgsMHg4MCwweDAwLDB4RTgsMHg0MSwweEYyLDB4ODEsMHg2NiwKKzB4MjYsMHhGRiwweEY3LDB4RTgsMHhGRSwweEY5LDB4RTgsMHhBRCwweEY5LDB4RjgsMHhDMywweDkwLDB4QjgsMHgxMCwweDAwLDB4RTgsCisweDExLDB4RjIsMHg4MCwweDRFLDB4MjcsMHgwNCwweEU4LDB4RUIsMHhGOSwweEU4LDB4OUEsMHhGOSwweEY4LDB4QzMsMHhCOCwweDEwLAorMHgwMCwweEU4LDB4RkYsMHhGMSwweDgxLDB4NjYsMHgyNiwweEZGLDB4RkIsMHhFOCwweEQ4LDB4RjksMHhGOCwweEMzLDB4QUMsMHg0OSwKKzB4RjgsMHhDMywweDgzLDB4QzIsMHgwNiwweDhBLDB4ODYsMHhBOCwweDAwLDB4MEMsMHg0MCwweDg4LDB4ODYsMHhBOCwweDAwLDB4RUUsCisweDgzLDB4RUEsMHgwNiwweEY4LDB4QzMsMHg5MCwweDgzLDB4QzIsMHgwNiwweDhBLDB4ODYsMHhBOCwweDAwLDB4MjQsMHhCRiwweEVCLAorMHhFQSwweDkwLDB4QUMsMHg0OSwweDhBLDB4RTAsMHg4MCwweEMyLDB4MEEsMHhFQywweDgwLDB4RUEsMHgwQSwweEE4LDB4MjAsMHg3NCwKKzB4MDUsMHg4QSwweEM0LDB4RUUsMHhGOCwweEMzLDB4MDYsMHg1MSwweDU3LDB4OEIsMHg0RSwweDI0LDB4RTMsMHgzNCwweDQ5LDB4ODksCisweDRFLDB4MjQsMHhGRiwweDQ2LDB4MUEsMHg4RSwweDQ2LDB4MDIsMHg4QiwweDdFLDB4MjIsMHg4QSwweEM0LDB4QUEsMHg4OSwweDdFLAorMHgyMiwweDhCLDB4NDYsMHgyNiwweDI0LDB4RkQsMHg4OSwweDQ2LDB4MjYsMHg3NSwweDI5LDB4OEEsMHg4NiwweEE1LDB4MDAsMHhBOCwKKzB4MDIsMHg3NSwweDIxLDB4ODAsMHhDMiwweDAyLDB4MEMsMHgwMiwweDg4LDB4ODYsMHhBNSwweDAwLDB4RUUsMHg4MCwweEVBLDB4MDIsCisweEVCLDB4MTIsMHhDNCwweDdFLDB4MDAsMHgzQiwweDdFLDB4MUUsMHg3NiwweDBBLDB4NEYsMHgyNiwweDg4LDB4MjUsMHg4OSwweDdFLAorMHgwMCwweEZGLDB4NDYsMHgxQSwweDVGLDB4NTksMHgwNywweEY4LDB4QzMsMHg5MCwweEFDLDB4QUQsMHg4MywweEU5LDB4MDMsMHg4NSwKKzB4QzAsMHg3NCwweDA1LDB4M0QsMHgwMCwweDIwLDB4NzIsMHgwNSwweEI4LDB4RkYsMHhGRiwweEVCLDB4MDMsMHhDMSwweEUwLDB4MDMsCisweDNCLDB4ODYsMHg5NCwweDAwLDB4NzQsMHgyNiwweDg5LDB4ODYsMHg5NCwweDAwLDB4OEIsMHhEOCwweDUyLDB4ODMsMHhDMiwweDA2LAorMHg4QSwweDg2LDB4QTgsMHgwMCwweDhBLDB4RTAsMHgwQywweDgwLDB4RUUsMHg4MywweEVBLDB4MDYsMHg4QSwweEMzLDB4RUUsMHg4MywKKzB4QzIsMHgwMiwweDhBLDB4QzcsMHhFRSwweDgzLDB4QzIsMHgwNCwweDhBLDB4QzQsMHhFRSwweDVBLDB4RjgsMHhDMywweEIwLDB4ODgsCisweDg4LDB4ODYsMHhCQywweDAwLDB4RTgsMHg4QywweEYyLDB4MzMsMHhEQiwweDhBLDB4ODYsMHhBNSwweDAwLDB4QTgsMHgwMiwweDc0LAorMHgwMywweDgwLDB4Q0IsMHgwMSwweEE4LDB4MDUsMHg3NCwweDAzLDB4ODAsMHhDQiwweDAyLDB4QTgsMHgwOCwweDc0LDB4MDMsMHg4MCwKKzB4Q0IsMHgwNCwweEY2LDB4ODYsMHhBNywweDAwLDB4MTAsMHg3NCwweDAzLDB4ODAsMHhDQiwweDEwLDB4OEEsMHg4NiwweEE5LDB4MDAsCisweEY2LDB4QzMsMHgwNCwweDc1LDB4MEEsMHg4MywweEMyLDB4MEMsMHhFQywweDgzLDB4RUEsMHgwQywweEMwLDB4RTgsMHgwNCwweDhBLAorMHhFMCwweDhBLDB4ODYsMHhBRiwweDAwLDB4QTgsMHg4MCwweDc0LDB4MDgsMHhGNiwweEM0LDB4MDEsMHg3NSwweDAzLDB4ODAsMHhDQiwKKzB4MjAsMHhGNiwweDg2LDB4QTcsMHgwMCwweDAyLDB4NzUsMHgwQSwweEY3LDB4NDYsMHgzOCwweDA0LDB4MDAsMHg3NCwweDAzLDB4ODAsCisweENCLDB4NDAsMHg4OCwweDlFLDB4QkUsMHgwMCwweEZFLDB4ODYsMHhCNCwweDAwLDB4QjAsMHgwQSwweEU4LDB4RjMsMHhEQiwweEY4LAorMHhDMywweEZFLDB4ODYsMHhCNCwweDAwLDB4QjAsMHgwQSwweEU4LDB4RTgsMHhEQiwweEY4LDB4QzMsMHhBQywweDQ5LDB4M0MsMHgwMiwKKzB4NzQsMHgzNywweDc3LDB4MTAsMHg4NCwweEMwLDB4NzQsMHgwNiwweDgwLDB4NEUsMHgzOCwweDAxLDB4RjgsMHhDMywweDgwLDB4NjYsCisweDM4LDB4RkUsMHhGOCwweEMzLDB4OEIsMHg0NiwweDM4LDB4MjUsMHhGRiwweEY3LDB4ODksMHg0NiwweDM4LDB4QTksMHgwMCwweDA0LAorMHg3NSwweEVBLDB4OEEsMHg4NiwweEE1LDB4MDAsMHhBOCwweDAxLDB4NzUsMHhFMiwweDBDLDB4MDUsMHg4MywweEMyLDB4MDIsMHg4OCwKKzB4ODYsMHhBNSwweDAwLDB4RUUsMHg4MywweEVBLDB4MDIsMHhGOCwweEMzLDB4ODEsMHg0RSwweDM4LDB4MDAsMHgwOCwweDhBLDB4ODYsCisweEE1LDB4MDAsMHhBOCwweDAxLDB4NzQsMHhDNiwweDI0LDB4RkEsMHhFQiwweEUyLDB4QUQsMHg0OSwweDQ5LDB4RjgsMHhDMywweDkwLAorMHhFOCwweDExLDB4RkEsMHhGRSwweDg2LDB4QjksMHgwMCwweEIwLDB4MEUsMHhFOCwweDg2LDB4REIsMHhGOCwweEMzLDB4QjAsMHhGRiwKKzB4RTgsMHhCRiwweEVDLDB4RjgsMHhDMywweDkwLDB4ODMsMHg2NiwweDdBLDB4RkIsMHhCMCwweDAwLDB4RTgsMHg3MywweERCLDB4RjgsCisweEMzLDB4OTAsMHhBQywweDQ5LDB4RTgsMHg1MywweEQ5LDB4NzIsMHgxMSwweDM2LDB4ODgsMHgxRSwweDFBLDB4MDEsMHgzNiwweEEwLAorMHg4RSwweDEyLDB4MEEsMHhDMywweDUyLDB4QkEsMHgwMCwweDAxLDB4RUUsMHg1QSwweEY4LDB4QzMsMHhBQywweDQ5LDB4MzIsMHhFNCwKKzB4MzYsMHhBMywweDg2LDB4MTIsMHgwNSwweDA2LDB4MDAsMHgzNiwweDhCLDB4MUUsMHg4OCwweDEyLDB4MkIsMHhEOCwweDM2LDB4ODksCisweDFFLDB4OEEsMHgxMiwweEY4LDB4QzMsMHg5MCwweEFELDB4OEIsMHhEOCwweEFELDB4ODMsMHhFOSwweDA0LDB4MDMsMHhDMywweDJCLAorMHg0NiwweDc2LDB4ODksMHg0NiwweDc4LDB4RjcsMHg0NiwweDdBLDB4MDIsMHgwMCwweDc0LDB4MEEsMHg4MywweDY2LDB4N0EsMHhGRCwKKzB4QjgsMHgwMCwweDAwLDB4RTgsMHgxQywweERCLDB4RjgsMHhDMywweDA2LDB4MTYsMHgwNywweEFDLDB4NDksMHgyNSwweDBGLDB4MDAsCisweDZCLDB4QzAsMHgwOSwweDhELDB4QkUsMHhGRCwweDAwLDB4MDMsMHhGOCwweEFDLDB4NDksMHgyNSwweDBGLDB4MDAsMHhBQSwweDg1LAorMHhDMCwweDc0LDB4MDgsMHgyQiwweEM4LDB4NTEsMHg4QiwweEM4LDB4RjMsMHhBNCwweDU5LDB4RTgsMHgyNywweEYwLDB4RTgsMHg0NCwKKzB4MDMsMHgwNywweEY4LDB4QzMsMHgzMywweEMwLDB4QUMsMHg0OSwweDM2LDB4QTMsMHhCMiwweDEzLDB4MzYsMHhBMywweEIwLDB4MTMsCisweEY4LDB4QzMsMHg4MywweDY2LDB4N0EsMHhFRiwweEU4LDB4MkMsMHgwMywweEY4LDB4QzMsMHg5MCwweDgzLDB4NEUsMHg3QSwweDEwLAorMHhFQiwweEY0LDB4RTgsMHg5QiwweEYwLDB4RjgsMHhDMywweDkwLDB4QUQsMHgzQywweDE5LDB4NzcsMHgwRSwweDNDLDB4MTksMHg3NywKKzB4MEEsMHg4QiwweEY4LDB4ODEsMHhFNywweEZGLDB4MDAsMHg4OCwweEE2LDB4QzQsMHgwMCwweEY4LDB4QzMsMHg5MCwweDgzLDB4NEUsCisweDI2LDB4MjAsMHhBQywweDQ5LDB4MzIsMHhFNCwweEQxLDB4RTAsMHg4QiwweEQ4LDB4QzEsMHhFMywweDAyLDB4MDMsMHhDMywweDg5LAorMHg0NiwweDZFLDB4ODMsMHg0RSwweDQ4LDB4MDQsMHhCMCwweDA2LDB4RTgsMHg5NywweERBLDB4NDksMHg0NiwweEY5LDB4QzMsMHg5MCwKKzB4RkUsMHg4NiwweEIzLDB4MDAsMHhCMCwweDBBLDB4RTgsMHg4OSwweERBLDB4RjgsMHhDMywweDkwLDB4MzMsMHhDMCwweEFDLDB4NDksCisweDZCLDB4QzAsMHgwQSwweDg5LDB4ODYsMHg4QSwweDAwLDB4RjgsMHhDMywweDkwLDB4QUMsMHg0OSwweDMyLDB4RTQsMHgzRCwweDBBLAorMHgwMCwweDc3LDB4MDUsMHhCOCwweDBBLDB4MDAsMHhFQiwweDA4LDB4M0QsMHg1QSwweDAwLDB4NzIsMHgwMywweEI4LDB4NUEsMHgwMCwKKzB4NTEsMHhGNywweEQ4LDB4MDUsMHg2NCwweDAwLDB4OEIsMHhDOCwweDhCLDB4NDYsMHg0NCwweEY3LDB4RTEsMHhCOSwweDY0LDB4MDAsCisweEY3LDB4RjEsMHg4OSwweDQ2LDB4NDYsMHg1OSwweEY4LDB4QzMsMHhBQywweDQ5LDB4RTgsMHg4NSwweEVCLDB4RjgsMHhDMywweDkwLAorMHhBQywweDQ5LDB4ODQsMHhDMCwweDc1LDB4MDcsMHg4MSwweDY2LDB4MzgsMHhGRiwweEZELDB4RjgsMHhDMywweDgxLDB4NEUsMHgzOCwKKzB4MDAsMHgwMiwweEY3LDB4NDYsMHgzOCwweDQwLDB4MDAsMHg3NSwweDA4LDB4OEEsMHg4NiwweEE5LDB4MDAsMHg4OCwweDg2LDB4QUEsCisweDAwLDB4RjgsMHhDMywweDkwLDB4NTEsMHg1NiwweEU4LDB4N0YsMHgwQywweDVFLDB4NTksMHhGOCwweEMzLDB4OTAsMHhGRSwweDg2LAorMHhCNiwweDAwLDB4QjAsMHgwQSwweEU4LDB4MEIsMHhEQSwweEY4LDB4QzMsMHg5MCwweEZFLDB4ODYsMHhCNywweDAwLDB4QjAsMHgwQSwKKzB4RTgsMHhGRiwweEQ5LDB4RjgsMHhDMywweDkwLDB4RkUsMHg4NiwweEI4LDB4MDAsMHhCMCwweDBBLDB4RTgsMHhGMywweEQ5LDB4RjgsCisweEMzLDB4OTAsMHgwMCwweDkwLDB4NTEsMHg1NSwweEFDLDB4MkUsMHhBMiwweDUyLDB4MzYsMHgzMywweEM5LDB4QUQsMHg4QiwweEY5LAorMHhDMSwweEU3LDB4MDUsMHhBOSwweDAxLDB4MDAsMHg3NCwweDIzLDB4MkUsMHg4QiwweEFELDB4NDQsMHgwMCwweDgzLDB4N0UsMHgwOCwKKzB4MDAsMHg3NCwweDE4LDB4MkUsMHg4MCwweDNFLDB4NTIsMHgzNiwweDAxLDB4NzQsMHgwOSwweDYwLDB4QjAsMHgwNCwweEU4LDB4QkIsCisweDBDLDB4NjEsMHhFQiwweDA3LDB4NjAsMHhCMCwweEZCLDB4RTgsMHhFQywweDBDLDB4NjEsMHg0NywweDQ3LDB4RDEsMHhFOCwweDc1LAorMHhEMiwweDQxLDB4ODMsMHhGOSwweDA0LDB4NzIsMHhDNiwweDVELDB4NTksMHg4MywweEU5LDB4MDUsMHhGNywweDQ2LDB4MzgsMHg0MCwKKzB4MDAsMHg3NCwweDA1LDB4RTgsMHg4NywweEVBLDB4RjgsMHhDMywweEU4LDB4OEQsMHhFQSwweEY4LDB4QzMsMHg5MCwweDM2LDB4QzYsCisweDA2LDB4QzgsMHgxMywweDAxLDB4RjgsMHhDMywweDMzLDB4QzAsMHhBQywweDQ5LDB4MzYsMHhBMywweDgwLDB4MTIsMHhBQywweDQ5LAorMHgzNiwweDJCLDB4MDYsMHg4OCwweDEyLDB4RjcsMHhEOCwweDM2LDB4QTMsMHg4MiwweDEyLDB4RjgsMHhDMywweDkwLDB4REUsMHgyNiwKKzB4REUsMHgyNiwweEVDLDB4MjYsMHhGMiwweDI2LDB4RjgsMHgyNiwweEZFLDB4MjYsMHgwNCwweDI3LDB4MEUsMHgyNywweDE2LDB4MjcsCisweDFFLDB4MjcsMHgyNiwweDI3LDB4MkUsMHgyNywweDM0LDB4MjcsMHhCRSwweDM0LDB4QzYsMHgzNCwweEQyLDB4MzQsMHgzQSwweDI3LAorMHg3OCwweDI3LDB4ODAsMHgyNywweDk0LDB4MjcsMHhBMCwweDI3LDB4QjQsMHgyNywweEMwLDB4MjcsMHhENCwweDI3LDB4RTAsMHgyNywKKzB4RjQsMHgyNywweDAwLDB4MjgsMHgxMCwweDI4LDB4RUMsMHgzNCwweERFLDB4MjYsMHgxRSwweDI4LDB4MjYsMHgyOCwweDJDLDB4MjgsCisweDMyLDB4MjgsMHgzOCwweDI4LDB4NEUsMHgyOCwweDhBLDB4MjgsMHgwNiwweDM1LDB4MjgsMHgzNSwweDk4LDB4MjgsMHhCRSwweDI4LAorMHhEMiwweDI4LDB4REUsMHgyOCwweEU2LDB4MjgsMHg1NCwweDM1LDB4NjIsMHgzNSwweDZDLDB4MzUsMHhFRSwweDI4LDB4QzAsMHgyOSwKKzB4QzgsMHgyOSwweENFLDB4MjksMHhFMCwweDI5LDB4NzIsMHgzNSwweDc4LDB4MzUsMHhGMCwweDI5LDB4RkMsMHgyOSwweDhFLDB4MzUsCisweDA4LDB4MkEsMHgxMiwweDJBLDB4MUMsMHgyQSwweEIwLDB4MzUsMHgzNiwweDJBLDB4QkMsMHgzNSwweDVBLDB4MkEsMHg2MiwweDJBLAorMHg2OCwweDJBLDB4Q0EsMHgzNSwweDdDLDB4MkEsMHhGOCwweDM1LDB4ODgsMHgyQSwweEE2LDB4MkEsMHhCOCwweDJBLDB4Q0MsMHgyQSwKKzB4REUsMHgyQSwweEYyLDB4MkEsMHgwMCwweDM2LDB4MEEsMHgyQiwweDI0LDB4MkIsMHgyNCwweDM2LDB4MzgsMHgyQiwweDRDLDB4MkIsCisweDg0LDB4MkIsMHgyRSwweDM2LDB4M0EsMHgzNiwweDQ2LDB4MzYsMHg1NCwweDM2LDB4RTgsMHgyQiwweEFFLDB4MzYsMHg0MCwweDJDLAorMHg2MiwweDJDLDB4QjYsMHgzNiwweDcwLDB4MjgsMHhERSwweDI2LDB4REUsMHgyNiwweEQ0LDB4MkUsMHhFOCwweDJFLDB4RjAsMHgyRSwKKzB4RjgsMHgyRSwweDAwLDB4MkYsMHgwQSwweDJGLDB4MTIsMHgyRiwweDFBLDB4MkYsMHgyMiwweDJGLDB4MkEsMHgyRiwweDQyLDB4MkYsCisweEJFLDB4MzQsMHhDNiwweDM0LDB4RDIsMHgzNCwweDUwLDB4MkYsMHg4QywweDJGLDB4OTQsMHgyRiwweEE4LDB4MkYsMHhCNCwweDJGLAorMHhDOCwweDJGLDB4RDQsMHgyRiwweEU4LDB4MkYsMHhGNCwweDJGLDB4MDgsMHgzMCwweDE0LDB4MzAsMHgxQywweDMwLDB4RUMsMHgzNCwKKzB4REUsMHgyNiwweDI0LDB4MzAsMHgzMCwweDMwLDB4MzgsMHgzMCwweDQ0LDB4MzAsMHg0QywweDMwLDB4NjIsMHgzMCwweEE0LDB4MzAsCisweDA2LDB4MzUsMHgyOCwweDM1LDB4QUEsMHgzMCwweENFLDB4MzAsMHhENiwweDMwLDB4RUEsMHgzMCwweEYyLDB4MzAsMHg1NCwweDM1LAorMHg2MiwweDM1LDB4NkMsMHgzNSwweEZBLDB4MzAsMHhDMiwweDMxLDB4QzIsMHgzMSwweEM0LDB4MzEsMHhGQSwweDMxLDB4NzIsMHgzNSwKKzB4NzgsMHgzNSwweDBBLDB4MzIsMHgxNiwweDMyLDB4OEUsMHgzNSwweDIyLDB4MzIsMHgyQywweDMyLDB4MzYsMHgzMiwweEIwLDB4MzUsCisweDRBLDB4MzIsMHhCQywweDM1LDB4NzQsMHgzMiwweDhDLDB4MzIsMHg5QSwweDMyLDB4Q0EsMHgzNSwweDlFLDB4MzIsMHhGOCwweDM1LAorMHhBQSwweDMyLDB4QzYsMHgzMiwweEQ4LDB4MzIsMHhFQywweDMyLDB4RkUsMHgzMiwweDBFLDB4MzMsMHgwMCwweDM2LDB4MTIsMHgzMywKKzB4MjYsMHgzMywweDI0LDB4MzYsMHgzMiwweDMzLDB4OUEsMHgzMywweERFLDB4MzMsMHgyRSwweDM2LDB4M0EsMHgzNiwweDQ2LDB4MzYsCisweDU0LDB4MzYsMHg1QywweDM0LDB4QUUsMHgzNiwweEFBLDB4MzQsMHhCMCwweDM0LDB4QjYsMHgzNiwweDhDLDB4MzAsMHhFMywweDI4LAorMHhGNywweDQ2LDB4MzgsMHg0MCwweDAwLDB4NzUsMHgzMiwweEU4LDB4RTMsMHhFOCwweDMzLDB4QzAsMHhBQywweDQ5LDB4M0QsMHg1QiwKKzB4MDAsMHg3NywweDE5LDB4OEIsMHhEOCwweEQxLDB4RTMsMHgyRSwweEZGLDB4OTcsMHhDRSwweDM2LDB4NzIsMHgwQiwweDg1LDB4QzksCisweDc1LDB4RTgsMHg4QiwweDQ2LDB4NDgsMHhFOCwweDFBLDB4MEMsMHhDMywweDRFLDB4NDEsMHhDMywweDZBLDB4MDAsMHgxRiwweEM2LAorMHgwNiwweDkzLDB4MTIsMHgwQywweDlDLDB4MEUsMHhFOCwweDYzLDB4REEsMHhFOCwweEJDLDB4RTgsMHgzMywweEMwLDB4QUMsMHg0OSwKKzB4M0QsMHg1QiwweDAwLDB4NzcsMHhFNywweDhCLDB4RDgsMHhEMSwweEUzLDB4MkUsMHhGRiwweDk3LDB4ODYsMHgzNywweDcyLDB4RDksCisweDg1LDB4QzksMHg3NSwweEU4LDB4QzMsMHhGNywweDQ2LDB4N0EsMHgxMCwweDAwLDB4NzUsMHgwRiwweDgzLDB4QkUsMHg4NCwweDAwLAorMHgwMCwweDc0LDB4MDgsMHhCOCwweDQ4LDB4M0EsMHg4OSwweDg2LDB4ODAsMHgwMCwweEMzLDB4ODEsMHhCRSwweDgwLDB4MDAsMHhFQywKKzB4M0MsMHg3NCwweEY3LDB4ODMsMHhCRSwweDg4LDB4MDAsMHgwMCwweDc1LDB4MDUsMHhCOCwweEVDLDB4M0MsMHhFQiwweEU3LDB4RjcsCisweDQ2LDB4N0EsMHgwOCwweDAwLDB4NzUsMHg0MCwweDFFLDB4NjAsMHg4QiwweDhFLDB4ODgsMHgwMCwweDNCLDB4NEUsMHg3NCwweDc3LAorMHgzMywweDNCLDB4NEUsMHg3OCwweDc3LDB4MkUsMHhDNCwweDdFLDB4MTAsMHg4QiwweERGLDB4MjYsMHgwMywweDNELDB4NDcsMHg0NywKKzB4MzMsMHhDMCwweDhFLDB4RDgsMHg4RCwweEI2LDB4RjQsMHgwMCwweDhCLDB4QzEsMHhGNywweDQ2LDB4N0EsMHgwMSwweDAwLDB4NzUsCisweDFELDB4RjMsMHhBNCwweDI2LDB4MDEsMHgwNywweDI5LDB4NDYsMHg3OCwweDAxLDB4NDYsMHg3NiwweDI5LDB4NDYsMHg3NCwweEIwLAorMHgwQywweEU4LDB4M0UsMHhENywweDYxLDB4MUYsMHhDNywweDg2LDB4ODgsMHgwMCwweDAwLDB4MDAsMHhFQiwweEFDLDB4RTMsMHhFMywKKzB4NTAsMHg5MCwweEFDLDB4MjQsMHg3RiwweEFBLDB4RTIsMHhGQSwweDU4LDB4RUIsMHhEOCwweDkwLDB4OEIsMHg4RSwweDg4LDB4MDAsCisweEUzLDB4NDYsMHg4QiwweDlFLDB4OEEsMHgwMCwweDg1LDB4REIsMHg3NCwweDNFLDB4QkEsMHg1MCwweEZGLDB4RUQsMHgyQiwweDg2LAorMHg4MiwweDAwLDB4M0IsMHhDMywweDcyLDB4MzcsMHg4RCwweEI2LDB4RjQsMHgwMCwweEM0LDB4N0UsMHgxMCwweDhCLDB4REYsMHgyNiwKKzB4MDMsMHgzRCwweDQ3LDB4NDcsMHg4QiwweEMxLDB4MTYsMHgxRiwweEY3LDB4NDYsMHg3QSwweDAxLDB4MDAsMHg3NSwweDI0LDB4RjMsCisweEE0LDB4MjYsMHgwMSwweDA3LDB4MjksMHg0NiwweDc4LDB4MDEsMHg0NiwweDc2LDB4MjksMHg0NiwweDc0LDB4QzcsMHg4NiwweDg4LAorMHgwMCwweDAwLDB4MDAsMHhCMCwweDBDLDB4RTgsMHhEQSwweEQ2LDB4ODMsMHg2NiwweDdBLDB4RjcsMHhDMywweEIwLDB4MDAsMHhFOCwKKzB4RDAsMHhENiwweEMzLDB4RTMsMHhEQywweDUwLDB4QUMsMHgyNCwweDdGLDB4QUEsMHhFMiwweEZBLDB4NTgsMHhFQiwweEQyLDB4OTAsCisweDFFLDB4NjAsMHgzMywweEMwLDB4OEUsMHhEOCwweDhELDB4QjYsMHhGRCwweDAwLDB4OEIsMHg4NiwweDg4LDB4MDAsMHg4QiwweDk2LAorMHg4NCwweDAwLDB4M0EsMHgwNCwweDc1LDB4MTAsMHg4QiwweERFLDB4NDYsMHg4QiwweEM4LDB4OEQsMHhCRSwweEY0LDB4MDAsMHhGMywKKzB4QTYsMHg3NCwweDY2LDB4OEIsMHhGMywweDkwLDB4ODMsMHhDNiwweDA5LDB4NEEsMHg3NSwweEU2LDB4OEQsMHhCNiwweEZELDB4MDAsCisweDhCLDB4OTYsMHg4NCwweDAwLDB4M0EsMHgwNCwweDczLDB4MTAsMHg4QiwweERFLDB4NDYsMHg4QiwweEM4LDB4OEQsMHhCRSwweEY0LAorMHgwMCwweEYzLDB4QTYsMHg3NCwweDc2LDB4OEIsMHhGMywweDkwLDB4ODMsMHhDNiwweDA5LDB4NEEsMHg3NSwweEU2LDB4OEQsMHhCNiwKKzB4RjQsMHgwMCwweEFDLDB4RjcsMHg0NiwweDdBLDB4MDEsMHgwMCwweDc0LDB4MDIsMHgyNCwweDdGLDB4MUUsMHhDNSwweDVFLDB4MTAsCisweDhCLDB4MzcsMHg4OCwweDQwLDB4MDIsMHg0NiwweDg5LDB4MzcsMHhGRiwweDRFLDB4NzgsMHhGRiwweDQ2LDB4NzYsMHhGRiwweDRFLAorMHg3NCwweDFGLDB4OEIsMHg4RSwweDg4LDB4MDAsMHg0OSwweDg5LDB4OEUsMHg4OCwweDAwLDB4RTMsMHg0MywweDhELDB4QjYsMHhGNCwKKzB4MDAsMHg4QiwweEZFLDB4NDYsMHhGMywweEE0LDB4RTksMHg3RCwweEZGLDB4QzUsMHg3NiwweDEwLDB4OEIsMHgxQywweDg1LDB4REIsCisweDc0LDB4MDgsMHgwMywweEYzLDB4ODMsMHhDNiwweDAzLDB4ODMsMHhFNiwweEZFLDB4OEIsMHg4NiwweDg0LDB4MDAsMHgyQiwweEMyLAorMHhCNCwweDgwLDB4ODksMHgwNCwweDQ2LDB4NDYsMHhDNywweDA0LDB4MDAsMHgwMCwweDg5LDB4NzYsMHgxMCwweDgzLDB4NEUsMHg3QSwKKzB4MDQsMHhDNywweDg2LDB4ODgsMHgwMCwweDAwLDB4MDAsMHg2MSwweDFGLDB4RjksMHhDMywweDMzLDB4QzAsMHg2MSwweDFGLDB4QzMsCisweEIwLDB4ODAsMHg4NCwweEMwLDB4NjEsMHgxRiwweEMzLDB4OTAsMHg4QiwweDRFLDB4NzgsMHgyQiwweDhFLDB4ODgsMHgwMCwweDc2LAorMHgyNywweDg5LDB4QjYsMHg4QywweDAwLDB4OEIsMHg1RSwweDc0LDB4M0IsMHhDQiwweDcyLDB4MDIsMHg4QiwweENCLDB4M0IsMHhDOCwKKzB4NzIsMHgwMiwweDhCLDB4QzgsMHg4QiwweEMxLDB4RTMsMHg0NCwweDMzLDB4RDIsMHg4RSwweEMyLDB4OEIsMHhEMSwweDgzLDB4QkUsCisweDg4LDB4MDAsMHgwMCwweDc0LDB4MDYsMHhFOSwweDhFLDB4MDAsMHgzMywweEMwLDB4QzMsMHg4QiwweDVFLDB4MTAsMHgwMywweDFGLAorMHg0MywweDQzLDB4NTIsMHhGNywweDQ2LDB4N0EsMHgwMSwweDAwLDB4NzUsMHgyQSwweEFDLDB4OEQsMHhCRSwweEU0LDB4MDAsMHg4QiwKKzB4OEUsMHg4NiwweDAwLDB4RjIsMHhBRSwweDc0LDB4MzQsMHg4OCwweDA3LDB4NDMsMHg0QSwweDc1LDB4RUQsMHg1OCwweDhCLDB4NUUsCisweDEwLDB4MDEsMHgwNywweDI5LDB4NDYsMHg3OCwweDAxLDB4NDYsMHg3NiwweDI5LDB4NDYsMHg3NCwweDhCLDB4QzYsMHgyQiwweDg2LAorMHg4QywweDAwLDB4QzMsMHg5MCwweEFDLDB4OEQsMHhCRSwweEU0LDB4MDAsMHg4QiwweDhFLDB4ODYsMHgwMCwweEYyLDB4QUUsMHg3NCwKKzB4MEEsMHgyNCwweDdGLDB4ODgsMHgwNywweDQzLDB4NEEsMHg3NSwweEVCLDB4RUIsMHhEMiwweDg4LDB4ODYsMHhGNCwweDAwLDB4QzcsCisweDg2LDB4ODgsMHgwMCwweDAxLDB4MDAsMHg1OCwweDJCLDB4QzIsMHg3NCwweDBFLDB4OEIsMHg1RSwweDEwLDB4MDEsMHgwNywweDI5LAorMHg0NiwweDc4LDB4MDEsMHg0NiwweDc2LDB4MjksMHg0NiwweDc0LDB4NDAsMHhFOCwweDk0LDB4RkUsMHg3MiwweEJFLDB4NEEsMHg3NSwKKzB4MTUsMHg4MywweEJFLDB4OEEsMHgwMCwweDAwLDB4NzQsMHhCNCwweEJBLDB4NTAsMHhGRiwweEVELDB4ODksMHg4NiwweDgyLDB4MDAsCisweDgzLDB4NEUsMHg3QSwweDA4LDB4RUIsMHhBNiwweDhELDB4QkUsMHhGNCwweDAwLDB4MDMsMHhCRSwweDg4LDB4MDAsMHhBNCwweEZGLAorMHg4NiwweDg4LDB4MDAsMHhFOCwweDZBLDB4RkUsMHg3MiwweDk0LDB4NzksMHgwNiwweDRBLDB4NzQsMHg4RiwweEU5LDB4NUIsMHhGRiwKKzB4NEEsMHg3NCwweENFLDB4RUIsMHhFMSwweDkwLDB4NTAsMHhFOCwweDExLDB4Q0MsMHg4QiwweDQ2LDB4NzQsMHgzOSwweDQ2LDB4NzIsCisweDc0LDB4MjcsMHgxRSwweDU2LDB4NTEsMHgzMywweEM5LDB4QzUsMHg3NiwweDBDLDB4QUQsMHg3NCwweDEwLDB4NzgsMHgwOSwweDAzLAorMHhDOCwweDA1LDB4MDEsMHgwMCwweDI0LDB4RkUsMHgwMywweEYwLDB4M0IsMHg3NiwweDEwLDB4NzYsMHhFRCwweDI5LDB4NEUsMHg3NiwKKzB4MDEsMHg0RSwweDc4LDB4RTgsMHgzNywweENDLDB4NTksMHg1RSwweDFGLDB4NTgsMHhDMywweDkwLDB4QzQsMHg3RSwweDEwLDB4MjYsCisweDhCLDB4MUQsMHg4MywweEMzLDB4MDMsMHgyNiwweDg5LDB4MUQsMHg0QiwweDAzLDB4RkIsMHhBQiwweDkxLDB4QUEsMHhCOCwweDAzLAorMHgwMCwweDI5LDB4NDYsMHg3OCwweDAxLDB4NDYsMHg3NiwweDI5LDB4NDYsMHg3NCwweEMzLDB4OTAsMHhDNCwweDdFLDB4MTAsMHgyNiwKKzB4OEIsMHgxRCwweDQzLDB4MjYsMHg4OSwweDFELDB4NDMsMHgwMywweEZCLDB4QUEsMHhGRiwweDRFLDB4NzgsMHhGRiwweDQ2LDB4NzYsCisweEZGLDB4NEUsMHg3NCwweEMzLDB4RTgsMHhFNSwweEZGLDB4QzMsMHg4MCwweDgxLDB4ODQsMHg4NSwweDgyLDB4ODMsMHg4NiwweDg3LAorMHg1MCwweDUzLDB4OEEsMHhEQywweDgzLDB4RTMsMHgwRSwweEQxLDB4RUIsMHgyRSwweDhBLDB4ODcsMHg5OCwweDNCLDB4MDgsMHg4NiwKKzB4QjAsMHgwMCwweEZFLDB4ODYsMHhCMSwweDAwLDB4QjAsMHgwQSwweEU4LDB4ODcsMHhENCwweDVCLDB4NTgsMHhDMywweDUwLDB4OEEsCisweEM4LDB4QjgsMHhGRiwweDAwLDB4RTgsMHg5NSwweEZGLDB4NTgsMHhDMywweDkwLDB4OEEsMHg4NiwweEJCLDB4MDAsMHhFOCwweEFCLAorMHhGRiwweEMzLDB4RTgsMHhDQiwweEZGLDB4RTgsMHhGMiwweEZGLDB4QzMsMHg5MCwweEU4LDB4QzMsMHhGRiwweEU4LDB4QjQsMHhGRiwKKzB4QzMsMHg5MCwweDMzLDB4QzAsMHhFOCwweDk1LDB4RkYsMHhDMywweEI4LDB4RkYsMHgwMCwweDMzLDB4QzksMHhFOCwweDZDLDB4RkYsCisweEMzLDB4OTAsMHhCOCwweEZGLDB4MDEsMHhCMSwweDEwLDB4RTgsMHg2MiwweEZGLDB4QzMsMHg5MCwweEMzLDB4RkMsMHgzQiwweEUyLAorMHgzQiwweEYyLDB4M0IsMHhGMiwweDNCLDB4RkMsMHgzQiwweEUyLDB4M0IsMHhFOCwweDNCLDB4RTgsMHgzQiwweEZDLDB4M0IsMHhFMiwKKzB4M0IsMHhFOCwweDNCLDB4RTgsMHgzQiwweEZDLDB4M0IsMHhFMiwweDNCLDB4RTIsMHgzQiwweEUyLDB4M0IsMHgwMCwweDEwLDB4MDAsCisweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLAorMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwKKzB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHg1MSwweDUzLDB4OEIsCisweDRFLDB4MzgsMHg4MSwweEUxLDB4RkYsMHhFRSwweEE4LDB4MDQsMHg3NCwweDA0LDB4ODEsMHhDOSwweDAwLDB4MDEsMHg4QSwweEUwLAorMHg4MCwweEU0LDB4MDMsMHgyNCwweDE4LDB4RDAsMHhFNCwweDBBLDB4QzQsMHgzMywweERCLDB4OEEsMHhEOCwweDJFLDB4OEIsMHg4NywKKzB4RkQsMHgzQiwweDg5LDB4NDYsMHg3QywweDJFLDB4MEIsMHg4RiwweDFELDB4M0MsMHg4OSwweDRFLDB4MzgsMHhEMSwweEVCLDB4MkUsCisweDhBLDB4QTcsMHgzRCwweDNDLDB4NUIsMHg1OSwweEMzLDB4QUMsMHg0OSwweDNDLDB4MDEsMHg3MiwweDFELDB4NzQsMHgyMCwweDNDLAorMHgwMywweDcyLDB4MjMsMHg3NCwweDI4LDB4M0MsMHgwOCwweDcyLDB4MkIsMHg3NCwweDMwLDB4M0MsMHgyMCwweDcyLDB4MzcsMHg3NCwKKzB4M0EsMHhCQiwweERBLDB4M0IsMHgzMiwweEU0LDB4ODksMHg1RSwweDdFLDB4QzMsMHhCQiwweEEwLDB4M0IsMHhFQiwweEY1LDB4QkIsCisweDk0LDB4M0IsMHhCNCwweDAxLDB4RUIsMHhGMCwweEJCLDB4RkMsMHgzQiwweEI0LDB4MDIsMHhFQiwweEU5LDB4QkIsMHhFMiwweDNCLAorMHhCNCwweDAzLDB4RUIsMHhFMiwweEJCLDB4QkUsMHgzQiwweEI0LDB4MDQsMHhFQiwweERCLDB4QkIsMHhDQSwweDNCLDB4QUMsMHg0OSwKKzB4ODgsMHg4NiwweEJCLDB4MDAsMHhFQiwweENFLDB4QkIsMHhEMiwweDNCLDB4RUIsMHhGMywweEJCLDB4RkMsMHgzQiwweEVCLDB4QzQsCisweEE5LDB4MDQsMHgwMCwweDc1LDB4RDEsMHhBOSwweDA4LDB4MDAsMHg3NSwweERBLDB4RUIsMHhEMSwweDhCLDB4NUUsMHg3NCwweDhCLAorMHg0RSwweDc4LDB4M0IsMHhDQiwweDcyLDB4MDIsMHg4QiwweENCLDB4M0IsMHhDOCwweDcyLDB4MDIsMHg4QiwweEM4LDB4OEIsMHhDMSwKKzB4RTMsMHgyQywweEM0LDB4N0UsMHgxMCwweDhCLDB4REYsMHgyNiwweDAzLDB4M0QsMHg0NywweDQ3LDB4RjcsMHg0NiwweDdBLDB4MDEsCisweDAwLDB4NzUsMHgxQywweEY3LDB4QzcsMHgwMSwweDAwLDB4NzQsMHgwMiwweDQ5LDB4QTQsMHhEMSwweEU5LDB4RjMsMHhBNSwweDczLAorMHgwMSwweEE0LDB4MjYsMHgwMSwweDA3LDB4MjksMHg0NiwweDc4LDB4MDEsMHg0NiwweDc2LDB4MjksMHg0NiwweDc0LDB4QzMsMHg1MCwKKzB4NTMsMHhCQiwweDdGLDB4N0YsMHhGNywweEM3LDB4MDEsMHgwMCwweDc0LDB4MDUsMHg0OSwweEFDLDB4MjIsMHhDMywweEFBLDB4RDEsCisweEU5LDB4RTMsMHgxRCwweDlDLDB4QUQsMHgyMywweEMzLDB4QUIsMHg0OSwweDc0LDB4MTQsMHhBRCwweDIzLDB4QzMsMHhBQiwweDQ5LAorMHg3NCwweDBELDB4QUQsMHgyMywweEMzLDB4QUIsMHg0OSwweDc0LDB4MDYsMHhBRCwweDIzLDB4QzMsMHhBQiwweEUyLDB4RTUsMHg5RCwKKzB4NzMsMHgwNCwweEFDLDB4MjIsMHhDMywweEFCLDB4NUIsMHg1OCwweEVCLDB4QjgsMHhFOCwweENFLDB4QzksMHg4QiwweDVFLDB4MzgsCisweEY3LDB4QzMsMHgxMCwweDA0LDB4NzUsMHgwMSwweEMzLDB4RjcsMHhDMywweDQwLDB4MDAsMHg3NCwweDA1LDB4RTgsMHhCOCwweEUzLAorMHhFQiwweDAzLDB4RTgsMHhBOCwweEUzLDB4ODEsMHg2NiwweDM4LDB4RUYsMHhGQiwweEY2LDB4QzMsMHgxMCwweDc0LDB4M0MsMHhGNiwKKzB4QzMsMHgwMiwweDc0LDB4MDYsMHhFNCwweEQ4LDB4MEMsMHgwMSwweEU2LDB4RDgsMHhGNiwweEMzLDB4MDQsMHg3NCwweDExLDB4ODMsCisweEMyLDB4MDgsMHg4QSwweDg2LDB4QTcsMHgwMCwweDBDLDB4MDEsMHhFRSwweDg4LDB4ODYsMHhBNywweDAwLDB4ODMsMHhFQSwweDA4LAorMHhGNiwweEMzLDB4MDgsMHg3NCwweDBGLDB4RTgsMHg4QiwweEUzLDB4NzIsMHgwQSwweDhBLDB4ODYsMHhDMCwweDAwLDB4RTYsMHgzOCwKKzB4QjAsMHgyMywweEU2LDB4MEEsMHhGNywweEMzLDB4MDAsMHgwNCwweDc1LDB4MDEsMHhDMywweEY3LDB4QzMsMHgwMCwweDA4LDB4NzUsCisweEY5LDB4OEEsMHg4NiwweEE1LDB4MDAsMHhGNiwweEMzLDB4NDAsMHg3NSwweDBELDB4QTgsMHgxMCwweDc1LDB4RUMsMHgwQywweDEwLAorMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHhDMywweEE4LDB4MDEsMHg3NSwweERGLDB4ODMsMHhDMiwweDAyLDB4MEMsMHgwNSwKKzB4RUUsMHg4OCwweDg2LDB4QTUsMHgwMCwweEMzLDB4QjAsMHgwMCwweEU4LDB4NDcsMHhEMiwweEVCLDB4MEYsMHhCMCwweDAyLDB4RTgsCisweDkwLDB4MEUsMHhFQiwweDA4LDB4ODMsMHg2NiwweDM4LDB4REYsMHg4MywweDRFLDB4N0EsMHgwMiwweDMzLDB4QzAsMHg4RSwweEQ4LAorMHhGQSwweEEwLDB4OTIsMHgxMiwweDQwLDB4QTIsMHg5MiwweDEyLDB4M0MsMHgwNSwweDcyLDB4MUUsMHhDNiwweDA2LDB4OTIsMHgxMiwKKzB4MDAsMHhGQiwweEIwLDB4MDEsMHhFOCwweDZCLDB4MEUsMHhGQSwweEExLDB4MjYsMHgwMSwweDIzLDB4MDYsMHgyQSwweDAxLDB4QTgsCisweDAxLDB4NzUsMHgwNywweEU4LDB4RTIsMHgwNywweEU4LDB4NjEsMHgwOSwweDkwLDB4QjAsMHgwMCwweEU4LDB4MzcsMHhEMiwweEZCLAorMHg4NSwweEVELDB4NzQsMHhCOSwweEZBLDB4RjcsMHg0NiwweDdBLDB4NDYsMHgwMCwweDc1LDB4QzAsMHg4QiwweDQ2LDB4NzgsMHgzRCwKKzB4MEEsMHgwMCwweDcyLDB4QjAsMHg4QiwweDRFLDB4NzQsMHg4MywweEY5LDB4NTAsMHg3MiwweDlBLDB4ODMsMHg2NiwweDM4LDB4REYsCisweEM1LDB4NzYsMHgxNCwweDhCLDB4NDYsMHgzQSwweDg1LDB4QzAsMHg3NSwweDU4LDB4QUQsMHg4NSwweEMwLDB4NzUsMHgwRiwweEU4LAorMHhGOCwweEZFLDB4RjcsMHg0NiwweDdBLDB4MDgsMHgwMCwweDc0LDB4OTMsMHhFOCwweEEwLDB4RkEsMHhFQiwweDhFLDB4M0IsMHg3NiwKKzB4MDQsMHg3NiwweDIxLDB4QjksMHgwMiwweDAwLDB4MzksMHg0RSwweDJFLDB4NzcsMHgwNSwweEM3LDB4NDYsMHgyRSwweDAwLDB4MDAsCisweDU2LDB4OEIsMHg3NiwweDJDLDB4ODksMHg3NiwweDA0LDB4QzcsMHgwNCwweDAwLDB4MDAsMHg0NiwweDQ2LDB4ODksMHg3NiwweDJDLAorMHgyOSwweDRFLDB4MkUsMHg1RSwweDg1LDB4QzAsMHg3OSwweDE3LDB4RjYsMHhDNCwweDEwLDB4NzQsMHgwNSwweEZGLDB4NTYsMHg3QywKKzB4RUIsMHgwMywweEZGLDB4NTYsMHg3RSwweDg5LDB4NzYsMHgxNCwweEIwLDB4MEMsMHhFOCwweDg1LDB4RDEsMHhFQiwweDg2LDB4ODksCisweDQ2LDB4M0EsMHhGRiwweDk2LDB4ODAsMHgwMCwweDI5LDB4NDYsMHgzQSwweDg5LDB4NzYsMHgxNCwweEIwLDB4MEMsMHhFOCwweDcxLAorMHhEMSwweEU5LDB4NzEsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDA0LDB4MTAsMHgwMiwKKzB4MDEsMHgyMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwKKzB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsCisweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwKKzB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4ODAsCisweDgwLDB4ODAsMHg4MCwweDAwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwKKzB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsCisweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwKKzB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsCisweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwKKzB4ODAsMHg4MCwweDgwLDB4ODAsMHg0RSwweDQxLDB4NzgsMHg0MSwweEQwLDB4NDEsMHhGNCwweDQxLDB4MDYsMHg0MiwweDE4LDB4NDIsCisweEMzLDB4OTAsMHg4RSwweDQ2LDB4MDIsMHg4QiwweDdFLDB4MjIsMHg4OSwweDdFLDB4NkMsMHg4MCwweDY2LDB4MjcsMHhGRCwweDhCLAorMHg1NiwweDI0LDB4ODMsMHhGQSwweDA0LDB4NzIsMHhFOSwweDgzLDB4RUEsMHgwMiwweDhCLDB4RDksMHgzQiwweENBLDB4NzYsMHgwMiwKKzB4OEIsMHhDQSwweEIwLDB4MEEsMHg1NywweDUxLDB4OEIsMHhGRSwweEYyLDB4QUUsMHg4QiwweEMxLDB4NTksMHg1RiwweDc1LDB4MUUsCisweDUwLDB4NDAsMHgyQiwweEM4LDB4NzQsMHgwNiwweDJCLDB4RDEsMHgyQiwweEQ5LDB4RjMsMHhBNCwweDU5LDB4NEIsMHg0QSwweDRBLAorMHhCMCwweDBELDB4QUEsMHhBNCwweDNCLDB4Q0EsMHg3NiwweDAyLDB4OEIsMHhDQSwweEUzLDB4MTMsMHhFQiwweEQ0LDB4MkIsMHhEOSwKKzB4RjcsMHhDNiwweDAxLDB4MDAsMHg3NCwweDAyLDB4QTQsMHg0OSwweEQxLDB4RTksMHhGMywweEE1LDB4NzMsMHgwMSwweEE0LDB4ODksCisweDdFLDB4MjIsMHgyQiwweDdFLDB4NkMsMHgyOSwweDdFLDB4MjQsMHgwMSwweDdFLDB4MUEsMHg4QiwweENCLDB4ODAsMHg3RSwweDI2LAorMHgwMiwweDc0LDB4MDUsMHg4MCwweDY2LDB4MjYsMHhGRCwweEMzLDB4NjAsMHhCMCwweEZELDB4RTgsMHgxOCwweDAzLDB4NjEsMHhDMywKKzB4QzMsMHg5MCwweEU4LDB4N0MsMHgwMiwweDcyLDB4RjksMHg5MCwweDgzLDB4NEUsMHgyNiwweDIwLDB4OEIsMHg0NiwweDZBLDB4ODksCisweDQ2LDB4NkUsMHg4QiwweDQ2LDB4NDgsMHgwRCwweDA0LDB4MDAsMHgyNSwweEJGLDB4RkYsMHg4OSwweDQ2LDB4NDgsMHhCMCwweDA2LAorMHhFOCwweEJGLDB4Q0YsMHhDMywweDg5LDB4N0UsMHgyMiwweDJCLDB4N0UsMHg2QywweDAxLDB4N0UsMHgxQSwweDI5LDB4N0UsMHgyNCwKKzB4ODAsMHg3RSwweDI2LDB4MDIsMHg3NCwweDA1LDB4ODMsMHg2NiwweDI2LDB4RkQsMHhDMywweDYwLDB4QjAsMHhGRCwweEU4LDB4RDUsCisweDAyLDB4NjEsMHhDMywweDkwLDB4OEEsMHhCRSwweEMyLDB4MDAsMHhFQiwweDI0LDB4RjcsMHg0NiwweDQ4LDB4NDAsMHgwMCwweDc1LAorMHhCMSwweDhFLDB4NDYsMHgwMiwweDhCLDB4N0UsMHgyMiwweDg5LDB4N0UsMHg2QywweDhCLDB4NTYsMHgyNCwweDgzLDB4RUEsMHgwQSwKKzB4NzgsMHg5RSwweDAzLDB4RDcsMHg4MCwweDY2LDB4MjcsMHhGRCwweDMzLDB4QzAsMHg4QSwweEJFLDB4QzIsMHgwMCwweEUzLDB4QjQsCisweDNCLDB4RkEsMHg3NywweEIwLDB4QUMsMHg0OSwweDkzLDB4MkUsMHg4QSwweDg3LDB4RDQsMHgzRSwweDkzLDB4MjIsMHhERiwweDc1LAorMHgxNywweEFBLDB4RTMsMHhBMCwweDNCLDB4RkEsMHg3NywweDlDLDB4QUMsMHg0OSwweDkzLDB4MkUsMHg4QSwweDg3LDB4RDQsMHgzRSwKKzB4OTMsMHgyMiwweERGLDB4NzUsMHgwMywweEFBLDB4RUIsMHhENiwweEY2LDB4QzMsMHg3RiwweDc1LDB4MDUsMHhGRiwweDQ2LDB4NjYsCisweEVCLDB4REYsMHhGNiwweEMzLDB4NDAsMHg3NSwweDBDLDB4OEIsMHhEOCwweDgzLDB4RUIsMHgwOCwweEQxLDB4RTMsMHgyRSwweEZGLAorMHhBNywweEQ0LDB4M0YsMHhGRiwweDQ2LDB4NjYsMHgyQywweDIwLDB4RUIsMHhDNywweDg1LDB4QzAsMHg3NCwweDJDLDB4ODksMHg0NiwKKzB4NkEsMHg4MywweDRFLDB4NDgsMHg0MCwweDg5LDB4N0UsMHgyMiwweDJCLDB4N0UsMHg2QywweDAxLDB4N0UsMHgxQSwweDI5LDB4N0UsCisweDI0LDB4ODAsMHg3RSwweDI2LDB4MDIsMHg3NCwweDA4LDB4ODMsMHg2NiwweDI2LDB4RkQsMHhFOCwweEEzLDB4MDEsMHhDMywweDYwLAorMHhCMCwweEZELDB4RTgsMHgzMSwweDAyLDB4NjEsMHhFOCwweDk4LDB4MDEsMHhDMywweEU5LDB4NTcsMHhGRiwweDkwLDB4OEIsMHg1RSwKKzB4NjYsMHg0QiwweDc4LDB4MDMsMHg4OSwweDVFLDB4NjYsMHhBQSwweDhCLDB4NUUsMHg2NCwweEY3LDB4QzMsMHgwMCwweDIwLDB4NzUsCisweDAzLDB4RTksMHg0MCwweEZGLDB4RjcsMHhDMywweDQwLDB4MDAsMHg3NCwweDA4LDB4OEEsMHg4NiwweEMxLDB4MDAsMHhBQSwweEU5LAorMHgzMiwweEZGLDB4QjgsMHgzMiwweDAwLDB4RUIsMHhBMywweDkwLDB4OEIsMHg1RSwweDY2LDB4ODksMHg1RSwweDY4LDB4ODMsMHhDMywKKzB4MDgsMHg4MCwweEUzLDB4RjgsMHg4OSwweDVFLDB4NjYsMHg4QiwweDVFLDB4NjQsMHg4MSwweEUzLDB4MDAsMHgxOCwweDgxLDB4RkIsCisweDAwLDB4MTgsMHg3NCwweDJELDB4QUEsMHg4NSwweERCLDB4NzQsMHgyNSwweEY3LDB4NDYsMHg2NCwweDQwLDB4MDAsMHg3NSwweDE4LAorMHg4MSwweEZCLDB4MDAsMHgxMCwweDc0LDB4MEMsMHg4QiwweDQ2LDB4NjYsMHgyQiwweDQ2LDB4NjgsMHhDMSwweEUwLDB4MDQsMHhFOSwKKzB4NjgsMHhGRiwweEI4LDB4NjQsMHgwMCwweEU5LDB4NjIsMHhGRiwweDhBLDB4ODYsMHhDMSwweDAwLDB4QUEsMHhBQSwweEU5LDB4RTMsCisweEZFLDB4NTEsMHg4QiwweDRFLDB4NjYsMHgyQiwweDRFLDB4NjgsMHhCMCwweDIwLDB4RjMsMHhBQSwweDU5LDB4RTksMHhENCwweEZFLAorMHg4QiwweDVFLDB4NjYsMHg4OSwweDVFLDB4NjgsMHg4QiwweDVFLDB4NjQsMHhGNywweEMzLDB4MjQsMHgwMCwweDc0LDB4MTAsMHhDNywKKzB4NDYsMHg2NiwweDAwLDB4MDAsMHhGNywweEMzLDB4MDQsMHgwMCwweDc0LDB4MDUsMHhCMCwweDBELDB4QUEsMHhCMCwweDBBLDB4QUEsCisweEVCLDB4NDgsMHg5MCwweDkwLDB4QUEsMHhGNywweDQ2LDB4NjQsMHgwMCwweDQwLDB4NzQsMHgwNiwweEI4LDB4RDAsMHgwNywweEU5LAorMHgxOCwweEZGLDB4RTksMHg5RiwweEZFLDB4OTAsMHhBQSwweEY3LDB4NDYsMHg2NCwweDAwLDB4ODAsMHg3NCwweDA2LDB4QjgsMHhEMCwKKzB4MDcsMHhFOSwweDA2LDB4RkYsMHhFOSwweDhELDB4RkUsMHg5MCwweDhCLDB4NUUsMHg2NiwweDg5LDB4NUUsMHg2OCwweDg1LDB4REIsCisweDc1LDB4MEMsMHg4QiwweDVFLDB4NjQsMHhGNywweEMzLDB4MTAsMHgwMCwweDc0LDB4MDYsMHhFOSwweDc2LDB4RkUsMHg4QiwweDVFLAorMHg2NCwweEY3LDB4QzMsMHgwOCwweDAwLDB4NzQsMHgyNywweEIwLDB4MEEsMHhBQSwweEY3LDB4QzMsMHgyMCwweDAwLDB4NzUsMHgxRiwKKzB4RjcsMHhDMywweDAwLDB4MDEsMHg3NSwweDAzLDB4RTksMHg1QiwweEZFLDB4RjcsMHhDMywweDQwLDB4MDAsMHg3NSwweDA2LDB4QjgsCisweDY0LDB4MDAsMHhFOSwweEM1LDB4RkUsMHg4QSwweDg2LDB4QzEsMHgwMCwweEFBLDB4QUEsMHhFOSwweDQ2LDB4RkUsMHhBQSwweEM3LAorMHg0NiwweDY2LDB4MDAsMHgwMCwweEY3LDB4QzMsMHgwMCwweDA2LDB4NzQsMHhGMSwweEY3LDB4QzMsMHg0MCwweDAwLDB4NzQsMHgxOSwKKzB4OEEsMHg4NiwweEMxLDB4MDAsMHg4MSwweEUzLDB4MDAsMHgwNiwweDgxLDB4RkIsMHgwMCwweDA0LDB4NzIsMHgwNiwweDc2LDB4MDIsCisweEFBLDB4QUEsMHhBQSwweEFBLDB4QUEsMHhBQSwweEU5LDB4MUIsMHhGRSwweDgxLDB4RTMsMHgwMCwweDA2LDB4ODEsMHhGQiwweDAwLAorMHgwNCwweDcyLDB4MEUsMHg3NiwweDA2LDB4QjgsMHg5NiwweDAwLDB4RTksMHg3RiwweEZFLDB4QjgsMHg2NCwweDAwLDB4RTksMHg3OSwKKzB4RkUsMHg4QiwweDQ2LDB4NjgsMHhFOSwweDczLDB4RkUsMHg5MCwweDM2LDB4OEIsMHgwRSwweERBLDB4MTIsMHg4MywweEY5LDB4MzIsCisweDczLDB4MUQsMHgxRSwweDA2LDB4MzMsMHhDMCwweDhFLDB4RDgsMHg4RSwweEMwLDB4OEQsMHg3NiwweDRDLDB4QkYsMHhEQywweDEyLAorMHgwMywweEY5LDB4QTUsMHhBNSwweEE1LDB4ODMsMHhDMSwweDA2LDB4ODksMHgwRSwweERBLDB4MTIsMHgwNywweDFGLDB4QzMsMHhCMCwKKzB4MDgsMHhFOCwweDZFLDB4Q0QsMHhDMywweDkwLDB4ODMsMHg2NiwweDQ4LDB4RkUsMHhFOCwweDkzLDB4QzQsMHhFOCwweEM4LDB4RkYsCisweEMzLDB4RjYsMHg0NiwweDI3LDB4MDIsMHg3NSwweDBGLDB4OUMsMHhGQSwweDgzLDB4N0UsMHgxQSwweDAwLDB4NzQsMHgwOSwweDgwLAorMHg0RSwweDI3LDB4MDEsMHg5RCwweEY5LDB4QzMsMHhGOCwweEMzLDB4NTAsMHg1MiwweEY3LDB4NDYsMHgzOCwweDQwLDB4MDAsMHg3NCwKKzB4MUQsMHhFOCwweDM0LDB4REUsMHg4MywweEMyLDB4MEEsMHhFQywweEE4LDB4NDAsMHg3NSwweDI3LDB4ODMsMHhFQSwweDA4LDB4OEEsCisweDg2LDB4QTUsMHgwMCwweDBDLDB4MDIsMHg4OCwweDg2LDB4QTUsMHgwMCwweEVFLDB4NUEsMHg1OCwweEVCLDB4RDEsMHhFOCwweDBDLAorMHhERSwweDhBLDB4ODYsMHhBNSwweDAwLDB4MjQsMHhGQiwweDBDLDB4MDIsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHg1QSwKKzB4NTgsMHhFQiwweEJDLDB4ODAsMHg0RSwweDI3LDB4MDIsMHg1QSwweDU4LDB4OUQsMHhGOCwweEMzLDB4MDgsMHg0NiwweDI2LDB4OUMsCisweEZBLDB4OEEsMHg4RSwweEE1LDB4MDAsMHhGNywweDQ2LDB4MzgsMHg0MCwweDAwLDB4NzUsMHgxNCwweEY2LDB4QzEsMHgwNiwweDc0LAorMHgyMywweEU4LDB4RDksMHhERCwweDhBLDB4QzEsMHgyNCwweEY5LDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4OUQsMHhDMywKKzB4RjYsMHhDMSwweDAyLDB4NzQsMHgwRiwweEU4LDB4RDAsMHhERCwweDgzLDB4QzIsMHgwMiwweDhBLDB4QzEsMHgyNCwweEZELDB4ODgsCisweDg2LDB4QTUsMHgwMCwweEVFLDB4OUQsMHhDMywweDhCLDB4NUUsMHgyNiwweDIyLDB4QzMsMHg4OCwweDQ2LDB4MjYsMHg3NCwweDAxLAorMHhDMywweDgwLDB4NjYsMHgyNywweEZELDB4OUMsMHhGQSwweDhBLDB4OEUsMHhBNSwweDAwLDB4RjcsMHg0NiwweDM4LDB4NDAsMHgwMCwKKzB4NzUsMHgxNiwweEY2LDB4QzEsMHgwNCwweDc1LDB4MEYsMHhFOCwweDkzLDB4REQsMHg4QSwweEMxLDB4MjQsMHhGRCwweDBDLDB4MDQsCisweDg4LDB4ODYsMHhBNSwweDAwLDB4RTYsMHgwQywweDlELDB4QzMsMHhGNiwweEMxLDB4MDIsMHg3NSwweEY5LDB4RTgsMHg4OCwweERELAorMHg4MywweEMyLDB4MEEsMHhFQywweEE4LDB4MjAsMHg3NSwweDBFLDB4ODMsMHhFQSwweDA4LDB4OEEsMHhDMSwweDBDLDB4MDIsMHg4OCwKKzB4ODYsMHhBNSwweDAwLDB4RUUsMHg5RCwweEMzLDB4ODMsMHhFQSwweDBBLDB4MzMsMHhDOSwweDhBLDB4NEUsMHgxQywweDhCLDB4NDYsCisweDFBLDB4M0IsMHhDOCwweDczLDB4MUIsMHgwMSwweDRFLDB4MkEsMHgyQiwweEMxLDB4ODksMHg0NiwweDFBLDB4MUUsMHhDNSwweDc2LAorMHgwMCwweEYzLDB4NkUsMHgxRiwweDg5LDB4NzYsMHgwMCwweDgzLDB4QzIsMHgwMiwweDhBLDB4ODYsMHhBNSwweDAwLDB4RUIsMHhDRCwKKzB4ODUsMHhDMCwweDc0LDB4MTIsMHgwMSwweDQ2LDB4MkEsMHg4QiwweEM4LDB4MUUsMHhDNSwweDc2LDB4MDAsMHhGMywweDZFLDB4MUYsCisweDg5LDB4NzYsMHgwMCwweDg5LDB4NEUsMHgxQSwweEY2LDB4QzcsMHgwMSwweDc1LDB4MjMsMHg4MCwweENCLDB4MDIsMHg4OSwweDVFLAorMHgyNiwweEU4LDB4MDgsMHhDMywweDgzLDB4QzIsMHgwMiwweDhBLDB4ODYsMHhBNSwweDAwLDB4MjQsMHhGRCwweEVFLDB4ODgsMHg4NiwKKzB4QTUsMHgwMCwweEY2LDB4QzcsMHgxMCwweDc1LDB4MDUsMHhCMCwweDAyLDB4RTgsMHgxNiwweENDLDB4OUQsMHhDMywweDgzLDB4QzIsCisweDAyLDB4OEEsMHg4NiwweEE1LDB4MDAsMHhFQiwweDg2LDB4OTAsMHg4QiwweEQxLDB4OEIsMHg0NiwweDI0LDB4M0IsMHhDOCwweDc2LAorMHgwMiwweDhCLDB4QzgsMHgyQiwweEQxLDB4MkIsMHhDMSwweDhCLDB4RDksMHhFMywweDIyLDB4ODAsMHg2NiwweDI3LDB4RkQsMHg4RSwKKzB4NDYsMHgwMiwweDhCLDB4N0UsMHgyMiwweEY3LDB4QzYsMHgwMSwweDAwLDB4NzQsMHgwMiwweEE0LDB4NDksMHhEMSwweEU5LDB4RjMsCisweEE1LDB4NzMsMHgwMSwweEE0LDB4ODksMHg3RSwweDIyLDB4ODksMHg0NiwweDI0LDB4MDEsMHg1RSwweDFBLDB4OEIsMHhDQSwweDgwLAorMHg3RSwweDI2LDB4MDIsMHg3NCwweDA1LDB4ODAsMHg2NiwweDI2LDB4RkQsMHhDMywweDYwLDB4QjAsMHhGRCwweEU4LDB4RjYsMHhGRSwKKzB4NjEsMHhDMywweDUwLDB4RTQsMHgwQSwweDg0LDB4QzAsMHg3NSwweDBBLDB4ODYsMHg4NiwweEExLDB4MDAsMHg4NCwweEMwLDB4NzQsCisweDBBLDB4RTYsMHgwQSwweDU4LDB4MEMsMHgyMCwweDg5LDB4NDYsMHg0OCwweEY5LDB4QzMsMHg1OCwweDI0LDB4REYsMHg4OSwweDQ2LAorMHg0OCwweEY4LDB4QzMsMHg5MCwweEZCLDB4QjAsMHgwMiwweEU4LDB4RTgsMHgwNywweEZBLDB4RTgsMHgyRSwweDAxLDB4RkIsMHhCMCwKKzB4MDEsMHhFOCwweERFLDB4MDcsMHhGQSwweEIwLDB4MDIsMHhFOCwweEJDLDB4Q0IsMHhGQiwweDg1LDB4RUQsMHg3NCwweEU1LDB4RkEsCisweDhFLDB4NUUsMHgwQSwweEZCLDB4OTAsMHhGQSwweDhCLDB4NDYsMHg0OCwweDhCLDB4NzYsMHg0MCwweEE4LDB4OEMsMHg3NSwweERFLAorMHhBOCwweDIwLDB4NzQsMHgxQSwweDUwLDB4RTgsMHg1NSwweERDLDB4NTgsMHhFOCwweEE2LDB4RkYsMHg3MywweDEwLDB4QjAsMHgwMiwKKzB4RTgsMHg1RiwweENCLDB4RUIsMHhDOSwweDkwLDB4MjUsMHhGRiwweDAwLDB4OEIsMHhDOCwweEVCLDB4MzYsMHg5MCwweEE4LDB4MDEsCisweDc1LDB4MjIsMHg0NiwweDgzLDB4RTYsMHhGRSwweDNCLDB4NzYsMHgwOCwweDc0LDB4NzksMHhBRCwweDhBLDB4RkMsMHhCMywweEYwLAorMHgyMiwweEZCLDB4M0EsMHhGQiwweDc0LDB4RTAsMHgzQSwweEJFLDB4QTAsMHgwMCwweDc0LDB4MkUsMHhFOCwweEQyLDB4RkQsMHg3MywKKzB4NzcsMHhFQiwweDlCLDB4OTAsMHg4QSwweEUwLDB4MjQsMHhGQywweDg4LDB4NDYsMHg0OCwweDhCLDB4NEUsMHg0QSwweEY2LDB4QzQsCisweDAyLDB4NzQsMHgxRCwweEU4LDB4QkIsMHhGRCwweDcyLDB4ODYsMHhFOCwweDEzLDB4RjMsMHg4OSwweDc2LDB4NDAsMHhFMywweDkzLAorMHg4MywweDRFLDB4NDgsMHgwMywweDg5LDB4NEUsMHg0QSwweEU5LDB4NzQsMHhGRiwweDI1LDB4RkYsMHgwRiwweDhCLDB4QzgsMHg5MCwKKzB4OEIsMHg4NiwweDk4LDB4MDAsMHg4NSwweEMwLDB4NzQsMHgxQSwweDUxLDB4OEEsMHg4RSwweEEwLDB4MDAsMHhDMCwweEU5LDB4MDQsCisweEJBLDB4MDEsMHgwMCwweEQzLDB4RTIsMHg1OSwweDIzLDB4QzIsMHg3NCwweDA4LDB4MDMsMHhGMSwweDg5LDB4NzYsMHg0MCwweEU5LAorMHg2MSwweEZGLDB4RkYsMHg1NiwweDYyLDB4RTMsMHhGNSwweDgzLDB4NEUsMHg0OCwweDAxLDB4ODksMHg0RSwweDRBLDB4ODksMHg3NiwKKzB4NDAsMHhFOSwweDNBLDB4RkYsMHg4MSwweDRFLDB4MjYsMHgwMCwweDEwLDB4OEIsMHg0NiwweDUwLDB4M0IsMHg0NiwweDQ2LDB4NzcsCisweDAzLDB4RTgsMHg1MiwweEZELDB4RTksMHgyNywweEZGLDB4OTAsMHg4OCwweEJFLDB4QTAsMHgwMCwweEVCLDB4QUMsMHgwQSwweDA2LAorMHg5MCwweDEyLDB4OEEsMHhFMCwweEJBLDB4MDYsMHgwMSwweEIwLDB4MDQsMHhFRSwweEVDLDB4ODQsMHhDMCwweDc1LDB4MTIsMHhCMCwKKzB4MDQsMHhFRSwweDhBLDB4QzQsMHhFRSwweDMyLDB4RTQsMHhBOCwweDgwLDB4NzQsMHgwNiwweEM3LDB4MDYsMHg4NCwweDEyLDB4MDAsCisweDAwLDB4ODgsMHgyNiwweDkwLDB4MTIsMHhDMywweDBBLDB4MDYsMHg5MCwweDEyLDB4OEEsMHhFMCwweEJBLDB4MDYsMHgwMSwweEVDLAorMHhBOCwweDAxLDB4NzUsMHhFRCwweEJBLDB4MDgsMHgwMSwweDhBLDB4QzQsMHhFRSwweDMyLDB4RTQsMHhBOCwweDgwLDB4NzQsMHhFMSwKKzB4QzcsMHgwNiwweDg0LDB4MTIsMHgwMCwweDAwLDB4ODgsMHgyNiwweDkwLDB4MTIsMHhDMywweDkwLDB4MzYsMHhGNywweDA2LDB4MjQsCisweDAxLDB4MDEsMHgwMCwweDc1LDB4MzAsMHgzNiwweDhCLDB4MEUsMHhEQSwweDEyLDB4ODAsMHhGOSwweDM2LDB4NzMsMHgyNiwweDMzLAorMHhDMCwweDhFLDB4QzAsMHg4RSwweEQ4LDB4QkYsMHhEQywweDEyLDB4MDMsMHhGOSwweEIwLDB4MDgsMHhFOCwweDc3LDB4Q0EsMHg4NSwKKzB4RUQsMHg3NCwweDBFLDB4OEQsMHg3NiwweDRDLDB4QTUsMHhBNSwweEE1LDB4ODAsMHhDMSwweDA2LDB4ODAsMHhGOSwweDM2LDB4NzIsCisweEU5LDB4ODksMHgwRSwweERBLDB4MTIsMHhDMywweEMzLDB4OTAsMHhGNywweDA2LDB4MjYsMHgwMSwweDAxLDB4MDAsMHg3NSwweEY2LAorMHg4QiwweDBFLDB4MjAsMHgxMywweDg1LDB4QzksMHg3NSwweEVFLDB4MzMsMHhDMCwweDhFLDB4QzAsMHg4RSwweEQ4LDB4QkYsMHgyNCwKKzB4MTMsMHhCOSwweDM2LDB4MDAsMHhCMCwweDBBLDB4RTgsMHgzRCwweENBLDB4ODUsMHhFRCwweDc1LDB4MDYsMHhFOSwweDEyLDB4MDEsCisweEU5LDB4MEEsMHgwMSwweDMzLDB4REIsMHg4QSwweDQ2LDB4NEMsMHg4QSwweEE2LDB4QjMsMHgwMCwweEZFLDB4Q0MsMHg3OCwweDBFLAorMHg4OCwweEE2LDB4QjMsMHgwMCwweDBBLDB4REMsMHhCNCwweDBBLDB4QUIsMHg4MywweEU5LDB4MDIsMHg3NiwweEUyLDB4OEEsMHhBNiwKKzB4QjIsMHgwMCwweEZFLDB4Q0MsMHg3OCwweDBFLDB4ODgsMHhBNiwweEIyLDB4MDAsMHgwQSwweERDLDB4QjQsMHgwOCwweEFCLDB4ODMsCisweEU5LDB4MDIsMHg3NiwweENDLDB4OEEsMHhBNiwweEIxLDB4MDAsMHhGRSwweENDLDB4NzgsMHgxOCwweDhBLDB4QkUsMHhCMCwweDAwLAorMHg3NSwweDA0LDB4ODgsMHhBNiwweEIwLDB4MDAsMHg4OCwweEE2LDB4QjEsMHgwMCwweDBBLDB4REMsMHg4QSwweEU3LDB4QUIsMHg4MywKKzB4RTksMHgwMiwweDc2LDB4QUMsMHg4QSwweEE2LDB4QjQsMHgwMCwweEZFLDB4Q0MsMHg3OCwweDFGLDB4ODgsMHhBNiwweEI0LDB4MDAsCisweDBBLDB4REMsMHhCNCwweDBCLDB4QUIsMHg4QSwweDg2LDB4QkMsMHgwMCwweDhBLDB4QTYsMHhCRCwweDAwLDB4QUIsMHg4QiwweDg2LAorMHhCRSwweDAwLDB4QUIsMHg4MywweEU5LDB4MDYsMHg3NiwweDg4LDB4OEEsMHg0NiwweDRDLDB4OEEsMHhBNiwweEI2LDB4MDAsMHhGRSwKKzB4Q0MsMHg3OCwweDE5LDB4ODgsMHhBNiwweEI2LDB4MDAsMHgwQSwweERDLDB4QjQsMHgwQywweEFCLDB4RTgsMHhEQiwweENCLDB4QUIsCisweDhCLDB4NDYsMHgyQSwweEFCLDB4ODMsMHhFOSwweDA2LDB4NzYsMHg3NCwweDhBLDB4NDYsMHg0QywweDhBLDB4QTYsMHhCNywweDAwLAorMHhGRSwweENDLDB4NzgsMHgxOSwweDg4LDB4QTYsMHhCNywweDAwLDB4MEEsMHhEQywweEI0LDB4MEQsMHhBQiwweEU4LDB4QkEsMHhDQiwKKzB4QUIsMHg4QiwweDQ2LDB4MzQsMHhBQiwweDgzLDB4RTksMHgwNiwweDc2LDB4NTMsMHg4QSwweDQ2LDB4NEMsMHg4QSwweEE2LDB4QjgsCisweDAwLDB4RkUsMHhDQywweDc4LDB4MTksMHg4OCwweEE2LDB4QjgsMHgwMCwweDBBLDB4REMsMHhCNCwweDBFLDB4QUIsMHhBMSwweDUwLAorMHgxMiwweEFCLDB4QTEsMHg1MiwweDEyLDB4QUIsMHg4MywweEU5LDB4MDYsMHg3NiwweDMyLDB4OEEsMHg0NiwweDRDLDB4OEEsMHhBNiwKKzB4QjUsMHgwMCwweEZFLDB4Q0MsMHg3OCwweDE4LDB4ODgsMHhBNiwweEI1LDB4MDAsMHgwQSwweERDLDB4QjQsMHgwRiwweEFCLDB4OEIsCisweDg2LDB4OUEsMHgwMCwweEFCLDB4OEIsMHg4NiwweDlDLDB4MDAsMHhBQiwweDgzLDB4RTksMHgwNiwweDc2LDB4MEYsMHg4NCwweERCLAorMHg3NSwweDAzLDB4RTksMHhFRiwweEZFLDB4QjAsMHgwQSwweEU4LDB4RjgsMHhDOCwweEU5LDB4RTcsMHhGRSwweEIwLDB4MEEsMHhFOCwKKzB4RjAsMHhDOCwweEY3LDB4RDksMHg4MywweEMxLDB4MzYsMHg4QiwweEMxLDB4MEQsMHg4MCwweDAwLDB4ODYsMHhDNCwweEEzLDB4MjIsCisweDEzLDB4NDEsMHg0MSwweDg5LDB4MEUsMHgyMCwweDEzLDB4QzMsMHhBMSwweDg0LDB4MTIsMHgyQiwweEMxLDB4NzIsMHgxMSwweEEzLAorMHg4NCwweDEyLDB4QkUsMHgyMiwweDEzLDB4RDEsMHhFOSwweEYzLDB4NkYsMHg5MCwweDg5LDB4MEUsMHgyMCwweDEzLDB4RjgsMHhDMywKKzB4RjksMHhDMywweEMzLDB4ODEsMHhFRiwweDZBLDB4MTMsMHg3NCwweEY5LDB4OEIsMHhDNywweDBELDB4ODAsMHgwMCwweDg2LDB4QzQsCisweEEzLDB4NjgsMHgxMywweDQ3LDB4NDcsMHg4OSwweDNFLDB4NjYsMHgxMywweEMzLDB4RjcsMHgwNiwweDJBLDB4MDEsMHgwMSwweDAwLAorMHg3NSwweEUwLDB4OEIsMHgwRSwweDY2LDB4MTMsMHhFMywweDA3LDB4ODAsMHhGOSwweDIwLDB4NzcsMHhENSwweDQ5LDB4NDksMHgzMywKKzB4QzAsMHg4RSwweEMwLDB4OEUsMHhEOCwweEJGLDB4NkEsMHgxMywweDhCLDB4RjcsMHgwMywweEY5LDB4ODMsMHhDNiwweDM0LDB4M0IsCisweEZFLDB4NzcsMHhDMCwweEIwLDB4MEUsMHhFOCwweEFFLDB4QzgsMHg4NSwweEVELDB4NzQsMHhCNywweDhBLDB4NDYsMHg0QywweDhBLAorMHhCNiwweEI5LDB4MDAsMHhGRSwweENFLDB4NzgsMHgxNSwweDg4LDB4QjYsMHhCOSwweDAwLDB4OEEsMHhBNiwweEE5LDB4MDAsMHg4MCwKKzB4Q0MsMHhDMCwweEFCLDB4ODQsMHhGNiwweDc0LDB4MDUsMHhCMCwweDBFLDB4RTgsMHg1NiwweEM4LDB4OEEsMHhCNiwweEJBLDB4MDAsCisweEZFLDB4Q0UsMHg3OCwweENCLDB4OEEsMHg5RSwweEE5LDB4MDAsMHg4QSwweEJFLDB4QUIsMHgwMCwweDhBLDB4NTYsMHgzRiwweDhBLAorMHhGMywweDMyLDB4RjcsMHgwQSwweEI2LDB4QUMsMHgwMCwweEM2LDB4ODYsMHhBQywweDAwLDB4MDAsMHgyMiwweEYyLDB4NzQsMHg0QiwKKzB4RjYsMHhDNiwweDA4LDB4NzQsMHgwRiwweEI0LDB4MDIsMHhGNiwweEMzLDB4MDgsMHg3NSwweDAyLDB4QjQsMHgwMywweEFCLDB4ODAsCisweEU2LDB4RjcsMHg3NCwweDM3LDB4RjYsMHhDNiwweDAxLDB4NzQsMHgwRiwweEI0LDB4MDAsMHhGNiwweEMzLDB4MDEsMHg3NSwweDAyLAorMHhCNCwweDAxLDB4QUIsMHg4MCwweEU2LDB4RkUsMHg3NCwweDIzLDB4RjYsMHhDNiwweDAyLDB4NzQsMHgwRiwweEI0LDB4MDQsMHhGNiwKKzB4QzMsMHgwMiwweDc1LDB4MDIsMHhCNCwweDA1LDB4QUIsMHg4MCwweEU2LDB4RkQsMHg3NCwweDBGLDB4RjYsMHhDNiwweDA0LDB4NzQsCisweDBBLDB4QjQsMHgwNiwweEY2LDB4QzMsMHgwNCwweDc1LDB4MDIsMHhCNCwweDA3LDB4QUIsMHhDNiwweDg2LDB4QkEsMHgwMCwweDAwLAorMHg4OCwweDlFLDB4QUIsMHgwMCwweEU5LDB4NTgsMHhGRiwweDkwLDB4QTEsMHg4NCwweDEyLDB4MkIsMHhDMSwweDcyLDB4MTEsMHhBMywKKzB4ODQsMHgxMiwweEJFLDB4NjgsMHgxMywweEQxLDB4RTksMHhGMywweDZGLDB4OTAsMHg4OSwweDBFLDB4NjYsMHgxMywweEY4LDB4QzMsCisweEY5LDB4QzMsMHhBMSwweDg0LDB4MTIsMHg0MSwweDQxLDB4MkIsMHhDMSwweDcyLDB4MjMsMHhBMywweDg0LDB4MTIsMHg4QiwweEMxLAorMHg0OCwweDQ4LDB4MzIsMHhFNCwweDBDLDB4ODAsMHg4NiwweEM0LDB4RUYsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4QkUsMHhEQywKKzB4MTIsMHg0OSwweDQ5LDB4RDEsMHhFOSwweEYzLDB4NkYsMHg5MCwweDg5LDB4MEUsMHhEQSwweDEyLDB4RjgsMHhDMywweEY5LDB4QzMsCisweDhBLDB4QzgsMHg4QSwweDQ2LDB4NEMsMHhCNCwweDAxLDB4ODMsMHhFQiwweDA2LDB4RUYsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLAorMHhCOCwweDAxLDB4MDAsMHhFRiwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg4QSwweEMxLDB4RUYsMHg5MCwweDkwLDB4OTAsMHg5MCwKKzB4OTAsMHhFOSwweDk3LDB4MDAsMHhFOSwweEFDLDB4MDAsMHgzMywweEMwLDB4OEUsMHhEOCwweDg5LDB4MUUsMHg4NCwweDEyLDB4QzMsCisweDM2LDB4OEIsMHgxRSwweDg0LDB4MTIsMHhGQiwweDkwLDB4RkEsMHhCMCwweDBDLDB4RTgsMHg4OSwweEM3LDB4ODUsMHhFRCwweDc0LAorMHhFNiwweEM1LDB4NzYsMHgwQywweDgzLDB4RkIsMHgxNCwweDcyLDB4REIsMHhGQiwweDkwLDB4RkEsMHhBRCwweDg1LDB4QzAsMHg3OCwKKzB4QUYsMHg3NCwweEUyLDB4OEIsMHhGRSwweDAzLDB4RjgsMHgzNiwweDhCLDB4MEUsMHg4NiwweDEyLDB4M0IsMHhDMSwweDc3LDB4MDIsCisweDhCLDB4QzgsMHg4MywweEVCLDB4MDQsMHgzQiwweEQ5LDB4NzcsMHgwMiwweDhCLDB4Q0IsMHgzMywweEMwLDB4OEEsMHg0NiwweDRDLAorMHhFRiwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg4QiwweEMxLDB4RUYsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4NDEsMHg4MCwKKzB4RTEsMHhGRSwweDJCLDB4RDksMHg1MSwweEQxLDB4RTksMHhGMywweDZGLDB4OTAsMHg1OSwweDhCLDB4QzcsMHg0MCwweDI0LDB4RkUsCisweDNCLDB4QzYsMHg3NCwweDI3LDB4MkIsMHhGRSwweDRFLDB4NEUsMHg1MywweDhCLDB4NUUsMHgxMCwweDNCLDB4RjMsMHg3MiwweDEzLAorMHgwMywweDFGLDB4ODMsMHhDMywweDAzLDB4ODAsMHhFMywweEZFLDB4QzcsMHgwNywweDAwLDB4MDAsMHg4MywweDZFLDB4NzQsMHgwMiwKKzB4ODksMHg1RSwweDEwLDB4NUIsMHg4OSwweDNDLDB4ODksMHg3NiwweDBDLDB4RUIsMHg4OSwweDg5LDB4NzYsMHgwQywweDM5LDB4NzYsCisweDEwLDB4NzcsMHg4MSwweDcyLDB4MDgsMHg4MywweDNDLDB4MDAsMHg3NCwweDAzLDB4RTksMHg3NywweEZGLDB4RTgsMHgwRCwweEJFLAorMHhFOSwweDYyLDB4RkYsMHgzNiwweDg5LDB4MUUsMHg4NCwweDEyLDB4QjAsMHgwQywweEU4LDB4QjUsMHhDNiwweDMzLDB4QzAsMHg4RSwKKzB4RDgsMHhDMywweEExLDB4ODQsMHgxMiwweDNELDB4MTAsMHgwMCwweDcyLDB4NzcsMHhCQSwweDA0LDB4MDEsMHgzQiwweDA2LDB4ODgsCisweDEyLDB4NzUsMHgwNiwweEM3LDB4MDYsMHg3RSwweDEyLDB4MDAsMHgwMCwweDhCLDB4MEUsMHhEQSwweDEyLDB4RTMsMHgwQiwweEU4LAorMHhEMCwweEZFLDB4NzIsMHg1NywweEM3LDB4MDYsMHg3RSwweDEyLDB4RkYsMHg3RiwweDhCLDB4MEUsMHgyMCwweDEzLDB4RTMsMHgwQiwKKzB4RTgsMHhBNSwweEZELDB4NzIsMHg0NiwweEM3LDB4MDYsMHg3RSwweDEyLDB4RkYsMHg3RiwweDhCLDB4MEUsMHg2NiwweDEzLDB4RTMsCisweDBCLDB4RTgsMHg5NCwweEZFLDB4NzIsMHgzNSwweEM3LDB4MDYsMHg3RSwweDEyLDB4RkYsMHg3RiwweEExLDB4MjgsMHgwMSwweEE5LAorMHgwMSwweDAwLDB4NzUsMHgwMywweEU4LDB4RjksMHhGRSwweDgwLDB4M0UsMHg4RCwweDEyLDB4MDAsMHg3NSwweDFELDB4QTEsMHg4NCwKKzB4MTIsMHgzRCwweDIwLDB4MDAsMHg3NiwweDE1LDB4M0IsMHgwNiwweDgyLDB4MTIsMHg3NiwweDA5LDB4QTEsMHg3RSwweDEyLDB4M0IsCisweDA2LDB4ODAsMHgxMiwweDcyLDB4MEMsMHg4MCwweDBFLDB4OTAsMHgxMiwweDgwLDB4QzMsMHhCMCwweDgwLDB4RkYsMHgxNiwweDdDLAorMHgxMiwweEMzLDB4ODAsMHgwRSwweDkwLDB4MTIsMHg0MCwweEMzLDB4NkEsMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgxNywKKzB4OUMsMHgwRSwweEU4LDB4QjcsMHhDOCwweDZBLDB4MDAsMHgxRiwweEM2LDB4MDYsMHg5MywweDEyLDB4MjAsMHg5QywweDBFLDB4RTgsCisweEFBLDB4QzgsMHg2QSwweDAwLDB4MUYsMHhDNiwweDA2LDB4OTMsMHgxMiwweDE2LDB4OUMsMHgwRSwweEU4LDB4OUQsMHhDOCwweDkwLAorMHhCQSwweDA2LDB4MDEsMHhFQywweEE4LDB4MjAsMHg3NSwweENBLDB4RkIsMHg5MCwweEZBLDB4QkEsMHgwNCwweDAxLDB4RUQsMHg5MCwKKzB4OTAsMHg5MCwweDkwLDB4OTAsMHgzQSwweDA2LDB4OTQsMHgxMiwweDc3LDB4QkUsMHgzMywweERCLDB4OEEsMHhEOCwweEQxLDB4RTMsCisweDJFLDB4OEIsMHhBRiwweDQ0LDB4MDAsMHhDNCwweDdFLDB4MDgsMHg4NSwweEZGLDB4NzQsMHhCOSwweEY2LDB4QzQsMHhDMCwweDc1LAorMHg1NSwweDMyLDB4QzAsMHhDMSwweEUwLDB4MDIsMHg4MCwweEU0LDB4RjAsMHg4QiwweEYwLDB4RUQsMHg5MCwweDkwLDB4OTAsMHg5MCwKKzB4OTAsMHg4NSwweEMwLDB4NzQsMHhCQiwweDhCLDB4QzgsMHg0MSwweDgwLDB4RTEsMHhGRSwweDBCLDB4QzYsMHg4QiwweDVFLDB4NTAsCisweDRCLDB4NEIsMHgyQiwweEQ5LDB4NzgsMHg5QywweEFCLDB4OEIsMHhDMSwweDQwLDB4NDAsMHgwMSwweDQ2LDB4NEUsMHhEMSwweEU5LAorMHhGMywweDZELDB4OTAsMHg4OSwweDVFLDB4NTAsMHg4OSwweDdFLDB4MDgsMHg4QiwweDQ2LDB4MjYsMHg4MCwweEU0LDB4RUYsMHg4OSwKKzB4NDYsMHgyNiwweEY2LDB4QzQsMHgwMSwweDc1LDB4MEMsMHhGNywweDQ2LDB4NDgsMHgwQywweDAwLDB4NzUsMHgwNSwweEIwLDB4MDIsCisweEU4LDB4N0YsMHhDNSwweEU5LDB4N0EsMHhGRiwweDg2LDB4QzQsMHg4QiwweEM4LDB4ODMsMHhFMSwweDNGLDB4NDEsMHg4MCwweEUxLAorMHhGRSwweEUzLDB4MEEsMHgzQywweDgwLDB4NzIsMHgwOSwweDI0LDB4M0YsMHhCNCwweEYwLDB4RUIsMHhCMCwweEU5LDB4NjAsMHhGRiwKKzB4MjUsMHgzRiwweDAwLDB4MzMsMHhGRiwweDhFLDB4QzcsMHhCRiwweDk2LDB4MTIsMHg4QiwweEY3LDB4RDEsMHhFOSwweEYzLDB4NkQsCisweDkwLDB4OEIsMHhDOCwweEU4LDB4NDgsMHhFRCwweEU5LDB4NDcsMHhGRiwweDkwLDB4NkEsMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLAorMHgxMiwweDFCLDB4OUMsMHgwRSwweEU4LDB4RDUsMHhDNywweDkwLDB4NjAsMHgxRSwweDA2LDB4MzMsMHhDMCwweDhFLDB4RDgsMHg4RSwKKzB4QzAsMHhCQSwweDA2LDB4MDEsMHhFQywweEE4LDB4MDQsMHg3NCwweEUxLDB4QjAsMHgwNiwweEVFLDB4RUMsMHhBMiwweDhDLDB4MTIsCisweEE4LDB4NDAsMHg3NCwweDExLDB4QTEsMHg4OCwweDEyLDB4QTMsMHg4NCwweDEyLDB4QzYsMHgwNiwweDhELDB4MTIsMHgwMCwweEU4LAorMHg2MCwweEZFLDB4QTAsMHg4QywweDEyLDB4QTgsMHg4MCwweDc0LDB4MDMsMHhFOCwweDA0LDB4RkYsMHhCOCwweDAwLDB4ODAsMHhCQSwKKzB4MjIsMHhGRiwweEVGLDB4MDcsMHgxRiwweDYxLDB4Q0YsMHg5MCwweDZBLDB4MDAsMHgxRiwweEM2LDB4MDYsMHg5MywweDEyLDB4MUIsCisweDlDLDB4MEUsMHhFOCwweDg3LDB4QzcsMHg5MCwweDYwLDB4MUUsMHgwNiwweDMzLDB4QzAsMHg4RSwweEQ4LDB4OEUsMHhDMCwweEJBLAorMHgwNiwweDAxLDB4RUMsMHhBOCwweDA0LDB4NzQsMHhFMSwweEJBLDB4MDgsMHgwMSwweEVDLDB4QTIsMHg4QywweDEyLDB4QTgsMHg0MCwKKzB4NzQsMHgxMSwweEExLDB4ODgsMHgxMiwweEEzLDB4ODQsMHgxMiwweEM2LDB4MDYsMHg4RCwweDEyLDB4MDAsMHhFOCwweDEyLDB4RkUsCisweEEwLDB4OEMsMHgxMiwweEE4LDB4ODAsMHg3NCwweDAzLDB4RTgsMHhCNiwweEZFLDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLAorMHhFRiwweDA3LDB4MUYsMHg2MSwweENGLDB4OTAsMHhFRSwweDg2LDB4RTAsMHhFRSwweDg2LDB4RTAsMHhFQywweDg2LDB4RTAsMHhFQywKKzB4ODYsMHhFMCwweDgwLDB4RTEsMHhGRSwweEYzLDB4NkMsMHg5MCwweDgwLDB4RTEsMHhGRSwweEYzLDB4NkUsMHg5MCwweDA1LDB4MDAsCisweDc1LDB4NDcsMHhBOCwweDRCLDB4MDUsMHgwMCwweDc1LDB4NDgsMHhBOCwweDRCLDB4MDUsMHgwMCwweEEzLDB4NDgsMHhBOCwweDRCLAorMHgwNSwweDAwLDB4MzUsMHg0OSwweEE4LDB4NEIsMHgwNiwweDAwLDB4OTgsMHg0OCwweDk2LDB4NEIsMHgwNiwweDAwLDB4QkEsMHg0OCwKKzB4OTYsMHg0QiwweDA2LDB4MDAsMHhDMywweDQ4LDB4OTYsMHg0QiwweDA2LDB4MDAsMHhDQiwweDQ4LDB4OTYsMHg0QiwweDA2LDB4MDAsCisweDIwLDB4NDksMHg5NiwweDRCLDB4MDYsMHgwMCwweDI4LDB4NDksMHg5NiwweDRCLDB4MDYsMHgwMCwweDRFLDB4NEEsMHg5QywweDRCLAorMHgwNiwweDAwLDB4N0IsMHg0QSwweDlDLDB4NEIsMHgwNSwweDAwLDB4OUUsMHg0QSwweEEyLDB4NEIsMHgwNSwweDAwLDB4RUMsMHg0QSwKKzB4QTIsMHg0QiwweDAwLDB4MDAsMHgxRSwweDA2LDB4ODMsMHgzRSwweDQ0LDB4MTIsMHgwMCwweDc0LDB4MDksMHhBMCwweDA2LDB4MDEsCisweDI0LDB4MzAsMHgzQywweDMwLDB4NzQsMHgxQSwweDhDLDB4QzgsMHg4RSwweEQ4LDB4OEUsMHhDMCwweEJCLDB4QUUsMHg0QiwweDhCLAorMHgwRiwweEUzLDB4MEQsMHg4QiwweDdGLDB4MDIsMHg4QiwweDc3LDB4MDQsMHhGMywweEE0LDB4ODMsMHhDMywweDA2LDB4RUIsMHhFRiwKKzB4MDcsMHgxRiwweEMzLDB4OTAsMHgzMywweEMwLDB4QTMsMHgzRSwweDAxLDB4QjksMHgwQywweDAxLDB4QkUsMHg0MCwweDAxLDB4OEIsCisweEZFLDB4ODEsMHhDNiwweEI0LDB4MEYsMHg4OSwweDA0LDB4OEIsMHhDNiwweDJCLDB4RjEsMHgzQiwweEM3LDB4NzcsMHhGNiwweEEzLAorMHgzQywweDAxLDB4QzMsMHg5MCwweDFFLDB4MDYsMHg2MCwweDM2LDB4OEIsMHgyRSwweDNFLDB4MDEsMHg4QiwweDVFLDB4MDAsMHgzQiwKKzB4RUIsMHg3NCwweDJCLDB4OEIsMHg3NiwweDAyLDB4ODksMHgxQywweDg5LDB4NzcsMHgwMiwweDM2LDB4QTEsMHgzQywweDAxLDB4ODksCisweDQ2LDB4MDAsMHgzNiwweDg5LDB4MkUsMHgzQywweDAxLDB4OEIsMHhFQiwweEZGLDB4NEUsMHgwNiwweDc0LDB4MDgsMHg4QiwweDZFLAorMHgwMCwweEZGLDB4NEUsMHgwNiwweDc1LDB4RjgsMHgzNiwweDg5LDB4MkUsMHgzRSwweDAxLDB4OEIsMHg2NiwweDA0LDB4NjEsMHgwNywKKzB4MUYsMHhDMywweDFFLDB4MDYsMHg2MCwweDM2LDB4OEIsMHgyRSwweDNFLDB4MDEsMHg5OCwweDg5LDB4NDYsMHgwNiwweDg5LDB4NjYsCisweDA0LDB4M0IsMHg2RSwweDAwLDB4NzQsMHgxMCwweDhCLDB4NkUsMHgwMCwweEZGLDB4NEUsMHgwNiwweDc1LDB4RjgsMHgzNiwweDg5LAorMHgyRSwweDNFLDB4MDEsMHg4QiwweDY2LDB4MDQsMHg2MSwweDA3LDB4MUYsMHhDMywweEMzLDB4OTAsMHgxRSwweDA2LDB4NjAsMHg5QywKKzB4RkEsMHgzMywweEVELDB4OEUsMHhERCwweDhCLDB4MkUsMHgzQywweDAxLDB4ODUsMHhFRCwweDc0LDB4M0QsMHg4QiwweDRFLDB4MDAsCisweDg5LDB4MEUsMHgzQywweDAxLDB4OEIsMHhDQywweDhELDB4QTYsMHgwQSwweDAxLDB4NTYsMHgxRSwweDA2LDB4NjAsMHg4OSwweDY2LAorMHgwNCwweEM3LDB4NDYsMHgwOCwweDBGLDB4MUEsMHhDNywweDQ2LDB4MDYsMHgwMSwweDAwLDB4OEIsMHgxRSwweDNFLDB4MDEsMHg4NSwKKzB4REIsMHg3NCwweDFELDB4OEIsMHhDNSwweDg3LDB4MDcsMHg4OSwweDQ2LDB4MDAsMHg4OSwweDVFLDB4MDIsMHg4QiwweEQ4LDB4ODksCisweDZGLDB4MDIsMHg4QiwweEUxLDB4OUQsMHg2MSwweDA3LDB4MUYsMHhGOCwweEMzLDB4OUQsMHg2MSwweDA3LDB4MUYsMHhGOSwweEMzLAorMHg4OSwweDJFLDB4M0UsMHgwMSwweDg5LDB4NkUsMHgwMCwweDg5LDB4NkUsMHgwMiwweDg3LDB4RTEsMHg5RCwweDhCLDB4RTEsMHhFQiwKKzB4RTQsMHgwMCwweDBELDB4MEEsMHg1NCwweDY1LDB4NzIsMHg2RCwweDY5LDB4NkUsMHg2MSwweDZDLDB4NzMsMHgyMCwweDczLDB4NzUsCisweDcwLDB4NzAsMHg2RiwweDcyLDB4NzQsMHg2NSwweDY0LDB4M0EsMHgwRCwweDBBLDB4MzEsMHgyOSwweDIwLDB4NDEsMHg0RSwweDUzLAorMHg0OSwweDIwLDB4NjMsMHg2RiwweDZELDB4NzAsMHg2MSwweDc0LDB4NjksMHg2MiwweDZDLDB4NjUsMHgwRCwweDBBLDB4MzIsMHgyOSwKKzB4MjAsMHg1NywweDc5LDB4NzMsMHg2NSwweDIwLDB4MzMsMHgzMCwweDBELDB4MEEsMHg1MCwweDZDLDB4NjUsMHg2MSwweDczLDB4NjUsCisweDIwLDB4NzMsMHg2NSwweDZDLDB4NjUsMHg2MywweDc0LDB4M0EsMHgyMCwweDAwLDB4MEQsMHgwQSwweDYzLDB4NkYsMHg2NCwweDY1LAorMHgyMCwweDczLDB4NjUsMHg2NywweDZELDB4NjUsMHg2RSwweDc0LDB4M0QsMHgwMCwweDBELDB4MEEsMHg0RCwweDZGLDB4NkUsMHg2OSwKKzB4NzQsMHg2RiwweDcyLDB4MjAsMHg3NiwweDMyLDB4MkUsMHgzNSwweDBBLDB4MEQsMHgwQSwweDNFLDB4MDAsMHgwRCwweDBBLDB4NTAsCisweDYxLDB4NzIsMHg2NCwweDZGLDB4NkUsMHgzRiwweDAwLDB4MEQsMHgwQSwweDRFLDB4NkYsMHgyMCwweDYxLDB4NjQsMHg2NCwweDcyLAorMHg2NSwweDczLDB4NzMsMHgyMCwweDczLDB4NzAsMHg2NSwweDYzLDB4NjksMHg2NiwweDY5LDB4NjUsMHg2NCwweDAwLDB4MEQsMHgwQSwKKzB4M0EsMHgwMCwweDBELDB4MEEsMHgwMCwweDRDLDB4NkYsMHg2MywweDNELDB4MDAsMHgwRCwweDBBLDB4NDYsMHg0MSwweDU0LDB4NDEsCisweDRDLDB4MjAsMHg0NSwweDUyLDB4NTIsMHg0RiwweDUyLDB4M0QsMHgwMCwweDBELDB4MEEsMHg0RCwweDZGLDB4NkUsMHg2OSwweDc0LAorMHg2RiwweDcyLDB4MjAsMHg2MywweDZGLDB4NkQsMHg2RCwweDYxLDB4NkUsMHg2NCwweDczLDB4M0EsMHgyRCwweDBELDB4MEEsMHgyMCwKKzB4MjAsMHgyMCwweDQ0LDB4MkMsMHg2NCwweDVCLDB4NUIsMHg3OCwweDc4LDB4NzgsMHg3OCwweDNBLDB4NUQsMHg3OCwweDc4LDB4NzgsCisweDc4LDB4NUQsMHgyMCwweDJELDB4MjAsMHg2NCwweDc1LDB4NkQsMHg3MCwweDIwLDB4NkQsMHg2NSwweDZELDB4NkYsMHg3MiwweDc5LAorMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLDB4NEMsMHgyQywweDZDLDB4NUIsMHg1QiwweDc4LDB4NzgsMHg3OCwweDc4LDB4M0EsMHg1RCwKKzB4NzgsMHg3OCwweDc4LDB4NzgsMHg1RCwweDIwLDB4MkQsMHgyMCwweDY0LDB4NzUsMHg2RCwweDcwLDB4MjAsMHg3MywweDY5LDB4NkUsCisweDY3LDB4NkMsMHg2NSwweDIwLDB4NkMsMHg2OSwweDZFLDB4NjUsMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLDB4NDUsMHgyQywweDY1LAorMHg1QiwweDVCLDB4NzgsMHg3OCwweDc4LDB4NzgsMHgzQSwweDVELDB4NzgsMHg3OCwweDc4LDB4NzgsMHg1RCwweDIwLDB4MkQsMHgyMCwKKzB4NjUsMHg2NCwweDY5LDB4NzQsMHgyMCwweDZELDB4NjUsMHg2RCwweDZGLDB4NzIsMHg3OSwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsCisweDQ2LDB4MkMsMHg2NiwweDVCLDB4NUIsMHg3OCwweDc4LDB4NzgsMHg3OCwweDIwLDB4NUQsMHg3OCwweDc4LDB4NzgsMHg3OCwweDVELAorMHgyMCwweDJELDB4MjAsMHg2NiwweDY5LDB4NkMsMHg2QywweDIwLDB4NkQsMHg2NSwweDZELDB4NkYsMHg3MiwweDc5LDB4MjAsMHg3MCwKKzB4NjEsMHg3MiwweDYxLDB4NjcsMHg3MiwweDYxLDB4NzAsMHg2OCwweDczLDB4MEQsMHgwQSwweDIwLDB4MjAsMHgyMCwweDQ5LDB4NUIsCisweDc4LDB4NzgsMHg3OCwweDc4LDB4NUQsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDJELAorMHgyMCwweDc3LDB4NkYsMHg3MiwweDY0LDB4MjAsMHg2OSwweDZFLDB4NzAsMHg3NSwweDc0LDB4MjAsMHg2NiwweDcyLDB4NkYsMHg2RCwKKzB4MjAsMHg3MCwweDZGLDB4NzIsMHg3NCwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg2OSwweDVCLDB4NzgsMHg3OCwweDc4LDB4NzgsCisweDVELDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyRCwweDIwLDB4NjIsMHg3OSwweDc0LAorMHg2NSwweDIwLDB4NjksMHg2RSwweDcwLDB4NzUsMHg3NCwweDIwLDB4NjYsMHg3MiwweDZGLDB4NkQsMHgyMCwweDcwLDB4NkYsMHg3MiwKKzB4NzQsMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLDB4NEYsMHg3OCwweDc4LDB4NzgsMHg3OCwweDIwLDB4NzgsMHg3OCwweDIwLDB4MjAsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MkQsMHgyMCwweDZGLDB4NzUsMHg3NCwweDcwLDB4NzUsMHg3NCwweDIwLAorMHg3NywweDZGLDB4NzIsMHg2NCwweDIwLDB4NzQsMHg2RiwweDIwLDB4NzAsMHg2RiwweDcyLDB4NzQsMHgwRCwweDBBLDB4MjAsMHgyMCwKKzB4MjAsMHg2RiwweDc4LDB4NzgsMHg3OCwweDc4LDB4MjAsMHg3OCwweDc4LDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsCisweDIwLDB4MjAsMHgyRCwweDIwLDB4NkYsMHg3NSwweDc0LDB4NzAsMHg3NSwweDc0LDB4MjAsMHg2MiwweDc5LDB4NzQsMHg2NSwweDIwLAorMHg3NCwweDZGLDB4MjAsMHg3MCwweDZGLDB4NzIsMHg3NCwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg0NywweDVCLDB4NUIsMHg3OCwKKzB4NzgsMHg3OCwweDc4LDB4M0EsMHg1RCwweDc4LDB4NzgsMHg3OCwweDc4LDB4NUQsMHgyMCwweDIwLDB4MjAsMHgyRCwweDIwLDB4NjcsCisweDZGLDB4NzQsMHg2RiwweDIwLDB4NjEsMHg2NCwweDY0LDB4NzIsMHg2NSwweDczLDB4NzMsMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLAorMHg1NywweDVCLDB4NUIsMHg3OCwweDc4LDB4NzgsMHg3OCwweDNBLDB4NUQsMHg3OCwweDc4LDB4NzgsMHg3OCwweDVELDB4MjAsMHgyMCwKKzB4MjAsMHgyRCwweDIwLDB4NzcsMHg2MSwweDc0LDB4NjMsMHg2OCwweDIwLDB4NjEsMHgyMCwweDc3LDB4NkYsMHg3MiwweDY0LDB4MEQsCisweDBBLDB4MjAsMHgyMCwweDIwLDB4NDMsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLAorMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MkQsMHgyMCwweDY5LDB4NkUsMHg3NCwweDY1LDB4NzIsMHg3MiwweDc1LDB4NzAsMHg3NCwKKzB4NzMsMHgyMCwweDZGLDB4NjYsMHg2NiwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg1MywweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyRCwweDIwLDB4NjksMHg2RSwweDc0LAorMHg2NSwweDcyLDB4NzIsMHg3NSwweDcwLDB4NzQsMHg3MywweDIwLDB4NkYsMHg2RSwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg3MywKKzB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsCisweDJELDB4MjAsMHg3MywweDY5LDB4NkUsMHg2NywweDZDLDB4NjUsMHgyMCwweDczLDB4NzQsMHg2NSwweDcwLDB4MEQsMHgwQSwweDIwLAorMHgyMCwweDIwLDB4NDIsMHg3OCwweDc4LDB4NzgsMHg3OCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwKKzB4MjAsMHgyMCwweDIwLDB4MkQsMHgyMCwweDYyLDB4NzIsMHg2NSwweDYxLDB4NkIsMHg3MCwweDZGLDB4NjksMHg2RSwweDc0LDB4MjAsCisweDczLDB4NjUsMHg3NCwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg2MiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLAorMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyRCwweDIwLDB4NjIsMHg3MiwweDY1LDB4NjEsMHg2QiwKKzB4NzAsMHg2RiwweDY5LDB4NkUsMHg3NCwweDIwLDB4NjMsMHg2QywweDY1LDB4NjEsMHg3MiwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsCisweDUyLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLAorMHgyMCwweDJELDB4MjAsMHg3MiwweDY1LDB4NzMsMHg3NCwweDYxLDB4NzIsMHg3NCwweDIwLDB4NjIsMHg3MiwweDY1LDB4NjEsMHg2QiwKKzB4NzAsMHg2RiwweDY5LDB4NkUsMHg3NCwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg3MiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyRCwweDIwLDB4NzIsMHg2NSwweDY3LAorMHg2OSwweDczLDB4NzQsMHg2NSwweDcyLDB4NzMsMHgyMCwweDYxLDB4NzQsMHgyMCwweDYyLDB4NzIsMHg2QiwweDcwLDB4NzQsMHgwRCwKKzB4MEEsMHgyMCwweDIwLDB4MjAsMHg1OCwweDJDLDB4NzgsMHgyMCwweDZFLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyRCwweDIwLDB4NjUsMHg3OCwweDYxLDB4NkQsMHg2OSwweDZFLDB4NjUsMHgyMCwweDYzLAorMHg2OCwweDYxLDB4NkUsMHg2RSwweDY1LDB4NkMsMHgyMCwweDZFLDB4MEQsMHgwQSwweDIwLDB4MjAsMHgyMCwweDQ4LDB4MkMsMHgzRiwKKzB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDJELDB4MjAsCisweDc0LDB4NjgsMHg2OSwweDczLDB4MjAsMHg2RCwweDY1LDB4NzMsMHg3MywweDYxLDB4NjcsMHg2NSwweDAwLDB4MUIsMHg1QiwweDMyLAorMHg0QSwweDFCLDB4NUIsMHgzMSwweDNCLDB4MzEsMHg0OCwweDQxLDB4NEUsMHg1MywweDQ5LDB4MjAsMHg1NCwweDY1LDB4NzIsMHg2RCwKKzB4NjksMHg2RSwweDYxLDB4NkMsMHgwRCwweDBBLDB4MEEsMHgwMCwweDFCLDB4NUIsMHg0QiwweDAwLDB4MUIsMHg1QiwweDRBLDB4MDAsCisweDFCLDB4NUIsMHgzMiwweDRBLDB4MUIsMHg1QiwweDMxLDB4M0IsMHgzMSwweDQ4LDB4MDAsMHgxQiwweDVCLDB4NDQsMHgyMCwweDFCLAorMHg1QiwweDQ0LDB4MDAsMHgxQiwweDVCLDB4MzEsMHgzQiwweDM3LDB4MzIsMHg0OCwweDAwLDB4MUIsMHg1QiwweDAwLDB4M0IsMHgwMCwKKzB4NDgsMHgwMCwweDFCLDB4NUIsMHg3MywweDAwLDB4MUIsMHg1QiwweDc1LDB4MDAsMHgxQiwweDdBLDB4MkIsMHgwQiwweDdGLDB4MUIsCisweDdBLDB4MkUsMHgwQywweDdGLDB4MUIsMHg3QSwweDJELDB4MDgsMHg3RiwweDFCLDB4N0EsMHgyQywweDBBLDB4N0YsMHgxQiwweDdBLAorMHgyMiwweDA4LDB4N0YsMHgxQSwweDU3LDB4NzksMHg3MywweDY1LDB4MjAsMHgzMywweDMwLDB4MjAsMHg1NCwweDY1LDB4NzIsMHg2RCwKKzB4NjksMHg2RSwweDYxLDB4NkMsMHgwRCwweDBBLDB4MDAsMHgxQiwweDU0LDB4MDAsMHgxQiwweDU5LDB4MDAsMHgxQSwweDAwLDB4MUUsCisweDAwLDB4MDgsMHgyMCwweDA4LDB4MDAsMHgwMCwweDFCLDB4M0QsMHgwMCwweDAwLDB4MDAsMHgxQiwweDQ2LDB4MDAsMHgwRCwweDAwLAorMHgzRiwweDQ0LDB4NjQsMHg0NSwweDY1LDB4NDYsMHg2NiwweDQ3LDB4NjcsMHg0OCwweDY4LDB4NDksMHg2OSwweDRGLDB4NkYsMHg0MywKKzB4NjMsMHg1MywweDczLDB4NDIsMHg2MiwweDUyLDB4NzIsMHg1NywweDc3LDB4NTgsMHg3OCwweDRDLDB4NkMsMHgzQywweDYwLDB4RDQsCisweDU3LDB4RDQsMHg1NywweDUwLDB4NTgsMHg1MCwweDU4LDB4RDYsMHg1OSwweEQ2LDB4NTksMHhCNCwweDU5LDB4QjQsMHg1OSwweDNDLAorMHg2MCwweDNDLDB4NjAsMHg2QywweDU3LDB4NDgsMHg1NywweDI2LDB4NTcsMHgwNiwweDU3LDB4OTAsMHg1NywweDkwLDB4NTcsMHg5OCwKKzB4NTcsMHg0OCwweDVGLDB4MEMsMHg1RiwweDU4LDB4NUYsMHgzMywweDVGLDB4NDAsMHg1RiwweEEwLDB4NTcsMHhBMCwweDU3LDB4RkUsCisweDU5LDB4RkUsMHg1OSwweERDLDB4NTcsMHhEQywweDU3LDB4ODgsMHg2MSwweDk4LDB4NjEsMHhDMCwweDYxLDB4Q0MsMHg2MSwweEQ4LAorMHg2MSwweEY2LDB4NjEsMHgwMiwweDYyLDB4MjIsMHg2MiwweEY4LDB4NTYsMHg0QSwweDYyLDB4NTgsMHg2MiwweDYwLDB4NTksMHgyMCwKKzB4MjAsMHg2NiwweDZDLDB4NjEsMHg2NywweDczLDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MSwweDc4LDB4M0QsMHgwMCwweDIwLDB4MjAsCisweDYyLDB4NzgsMHgzRCwweDAwLDB4MjAsMHgyMCwweDYzLDB4NzgsMHgzRCwweDAwLDB4MjAsMHgyMCwweDY0LDB4NzgsMHgzRCwweDAwLAorMHgyMCwweDIwLDB4NjMsMHg3MywweDNELDB4MDAsMHgyMCwweDIwLDB4NjQsMHg3MywweDNELDB4MDAsMHgyMCwweDIwLDB4NjUsMHg3MywKKzB4M0QsMHgwMCwweDIwLDB4MjAsMHg3MywweDczLDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2NCwweDY5LDB4M0QsMHgwMCwweDIwLDB4MjAsCisweDczLDB4NjksMHgzRCwweDAwLDB4MjAsMHgyMCwweDYyLDB4NzAsMHgzRCwweDAwLDB4MjAsMHgyMCwweDczLDB4NzAsMHgzRCwweDAwLAorMHgyMCwweDIwLDB4NjksMHg3MCwweDNELDB4MDAsMHgyMCwweDYzLDB4NjgsMHg2MSwweDZFLDB4NjUsMHg2QywweDNELDB4MDAsMHgyMCwKKzB4MjAsMHgyMCwweDIwLDB4NzMsMHg2NSwweDY3LDB4M0QsMHgwMCwweDIwLDB4NzQsMHg2OSwweDVGLDB4NzMsMHg3NCwweDcyLDB4M0QsCisweDAwLDB4MjAsMHg3NCwweDY5LDB4NUYsMHg3NCwweDZGLDB4NzMsMHgzRCwweDAwLDB4MjAsMHg3NCwweDY5LDB4NUYsMHg2RCwweDYxLAorMHg3OCwweDNELDB4MDAsMHgyMCwweDc0LDB4NjksMHg1RiwweDYyLDB4NjEsMHg3MywweDNELDB4MDAsMHgyMCwweDc0LDB4NjksMHg1RiwKKzB4NzMsMHg2OSwweDdBLDB4M0QsMHgwMCwweDIwLDB4NzQsMHg2OSwweDVGLDB4NzMsMHg3NCwweDY2LDB4M0QsMHgwMCwweDIwLDB4NzQsCisweDY5LDB4NUYsMHg3MiwweDZGLDB4NkYsMHgzRCwweDAwLDB4MjAsMHg3NCwweDY5LDB4NUYsMHg2NiwweDZDLDB4NjcsMHgzRCwweDAwLAorMHgyMCwweDc0LDB4NjksMHg1RiwweDc0LDB4NkYsMHg3NCwweDNELDB4MDAsMHgyMCwweDcyLDB4NjksMHg1RiwweDcwLDB4NjMsMHg2RSwKKzB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OSwweDVGLDB4NzMsMHg3NCwweDcyLDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OSwweDVGLDB4NzMsCisweDc0LDB4NjYsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY5LDB4NUYsMHg3MiwweDZGLDB4NkYsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY5LAorMHg1RiwweDYyLDB4NjEsMHg3MywweDNELDB4MDAsMHgyMCwweDcyLDB4NjksMHg1RiwweDczLDB4NjksMHg3QSwweDNELDB4MDAsMHgyMCwKKzB4NzIsMHg2OSwweDVGLDB4NzQsMHg2RiwweDc0LDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OSwweDVGLDB4NkQsMHg2OSwweDZFLDB4M0QsCisweDAwLDB4MjAsMHg3MiwweDY5LDB4NUYsMHg2NiwweDZDLDB4NjcsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY5LDB4NUYsMHg3NCwweDZGLAorMHg3MywweDNELDB4MDAsMHgyMCwweDcyLDB4NjksMHg1RiwweDc0LDB4NjgsMHg3MiwweDNELDB4MDAsMHgyMCwweDc0LDB4NjgsMHg1RiwKKzB4NzMsMHg3NCwweDY2LDB4M0QsMHgwMCwweDIwLDB4NzQsMHg2OCwweDVGLDB4NzMsMHg3NCwweDcyLDB4M0QsMHgwMCwweDIwLDB4NzQsCisweDY4LDB4NUYsMHg2MiwweDYxLDB4NzMsMHgzRCwweDAwLDB4MjAsMHg3NCwweDY4LDB4NUYsMHg3MywweDY5LDB4N0EsMHgzRCwweDAwLAorMHgyMCwweDc0LDB4NjgsMHg1RiwweDc0LDB4NzIsMHg2NywweDNELDB4MDAsMHgyMCwweDc0LDB4NjgsMHg1RiwweDY2LDB4NkMsMHg2NywKKzB4M0QsMHgwMCwweDIwLDB4NzQsMHg2OCwweDVGLDB4NjMsMHg2RSwweDc0LDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OCwweDVGLDB4NzMsCisweDc0LDB4NzIsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY4LDB4NUYsMHg3MywweDc0LDB4NjYsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY4LAorMHg1RiwweDYyLDB4NjEsMHg3MywweDNELDB4MDAsMHgyMCwweDcyLDB4NjgsMHg1RiwweDczLDB4NjksMHg3QSwweDNELDB4MDAsMHgyMCwKKzB4NzIsMHg2OCwweDVGLDB4NzMsMHg3MCwweDYxLDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OCwweDVGLDB4NjEsMHg3MywweDZGLDB4M0QsCisweDAwLDB4MjAsMHg3MiwweDY4LDB4NUYsMHg3MiwweDZGLDB4NkYsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY4LDB4NUYsMHg2NiwweDZDLAorMHg2NywweDNELDB4MDAsMHgyMCwweDZELDB4NUYsMHg2MywweDYxLDB4NzIsMHg2NSwweDNELDB4MDAsMHgyMCwweDcwLDB4NzQsMHg1RiwKKzB4NjYsMHg2QywweDZGLDB4M0QsMHgwMCwweDIwLDB4NjEsMHg3MywweDVGLDB4NjYsMHg2QywweDZGLDB4M0QsMHgwMCwweDIwLDB4NzIsCisweDZELDB4NUYsMHg2NiwweDZDLDB4NkYsMHgzRCwweDAwLDB4MjAsMHgyMCwweDIwLDB4NzEsMHg1RiwweDY5LDB4NkUsMHgzRCwweDAwLAorMHgyMCwweDIwLDB4NzEsMHg1RiwweDZGLDB4NzUsMHg3NCwweDNELDB4MDAsMHgyMCwweDcxLDB4NUYsMHg2NCwweDcyLDB4NjEsMHg2RSwKKzB4M0QsMHgwMCwweDIwLDB4MjAsMHg3MSwweDVGLDB4NzQsMHg2OSwweDZELDB4M0QsMHgwMCwweDIwLDB4MjAsMHgyMCwweDcxLDB4NUYsCisweDY2LDB4NjMsMHgzRCwweDAwLDB4MjAsMHg3MSwweDVGLDB4NzMsMHg3NCwweDYxLDB4NzQsMHgzRCwweDAwLDB4MjAsMHg3MSwweDVGLAorMHg2NCwweDYxLDB4NzQsMHg2MSwweDNELDB4MDAsMHgyMCwweDcxLDB4NUYsMHg2RCwweDZGLDB4NjQsMHg2RCwweDNELDB4MDAsMHgyMCwKKzB4NjgsMHg2MSwweDZFLDB4NjQsMHg1RiwweDZGLDB4M0QsMHgwMCwweDIwLDB4NjgsMHg2MSwweDZFLDB4NjQsMHg1RiwweDYyLDB4M0QsCisweDAwLDB4MjAsMHg2OCwweDYxLDB4NkUsMHg2NCwweDVGLDB4NjUsMHgzRCwweDAwLDB4MjAsMHg2OCwweDYxLDB4NkUsMHg2NCwweDVGLAorMHg2OSwweDNELDB4MDAsMHgyMCwweDIwLDB4NkYsMHg3MCwweDZGLDB4NzMsMHg3NCwweDNELDB4MDAsMHgyMCwweDIwLDB4NzQsMHg2OSwKKzB4NkQsMHg2NSwweDZGLDB4M0QsMHgwMCwweDIwLDB4NjMsMHg3NSwweDczLDB4NzQsMHg2RCwweDMxLDB4M0QsMHgwMCwweDIwLDB4NjMsCisweDc1LDB4NzMsMHg3NCwweDZELDB4MzIsMHgzRCwweDAwLDB4MjAsMHg2MywweDc1LDB4NzMsMHg3NCwweDZELDB4NjQsMHgzRCwweDAwLAorMHgyMCwweDc0LDB4NzgsMHg3MiwweDYxLDB4NzQsMHg2NSwweDNELDB4MDAsMHgyMCwweDcyLDB4NzgsMHg3MiwweDYxLDB4NzQsMHg2NSwKKzB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MywweDVGLDB4NkQsMHg2MSwweDcwLDB4M0QsMHgwMCwweDIwLDB4NjMsMHg1RiwweDYxLDB4NjQsCisweDY0LDB4NzIsMHgzRCwweDAwLDB4MjAsMHg2MywweDVGLDB4NjEsMHg2OSwweDczLDB4NzIsMHgzRCwweDAwLDB4MjAsMHg2MywweDVGLAorMHg3OCwweDc0LDB4NjEsMHg2NywweDNELDB4MDAsMHgyMCwweDYzLDB4NUYsMHg2NCwweDY1LDB4NjYsMHg3MiwweDNELDB4MDAsMHgyMCwKKzB4NjMsMHg1RiwweDY2LDB4NkMsMHg3MywweDY4LDB4M0QsMHgwMCwweDIwLDB4NzQsMHg3OCwweDZELDB4NjEsMHg3OCwweDczLDB4M0QsCisweDAwLDB4MjAsMHg3MiwweDY5LDB4NUYsMHg2NSwweDZELDB4NzMsMHgzRCwweDAwLDB4MjAsMHgyMCwweDYzLDB4NUYsMHg2QywweDczLAorMHg3MiwweDNELDB4MDAsMHgyMCwweDIwLDB4NjMsMHg1RiwweDY5LDB4NjUsMHg3MiwweDNELDB4MDAsMHgyMCwweDIwLDB4NjMsMHg1RiwKKzB4NjYsMHg2MywweDcyLDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MywweDVGLDB4NkQsMHg2MywweDcyLDB4M0QsMHgwMCwweDIwLDB4MjAsCisweDYzLDB4NUYsMHg2QywweDYzLDB4NzIsMHgzRCwweDAwLDB4MjAsMHgyMCwweDYzLDB4NUYsMHg2NCwweDczLDB4NzMsMHgzRCwweDAwLAorMHgyMCwweDYzLDB4NUYsMHg2NCwweDczLDB4NzMsMHg2OSwweDNELDB4MDAsMHgyMCwweDYzLDB4NUYsMHg2NCwweDczLDB4NzMsMHg3MiwKKzB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MywweDVGLDB4NjksMHg3MywweDcyLDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MywweDVGLDB4NjMsCisweDYxLDB4NzIsMHgzRCwweDAwLDB4MjAsMHgyMCwweDYzLDB4NUYsMHg2NSwweDY2LDB4NzIsMHgzRCwweDAwLDB4MjAsMHg2MywweDVGLAorMHg2NSwweDcyLDB4NzMsMHg3NCwweDNELDB4MDAsMHgyMCwweDYzLDB4NUYsMHg2NSwweDYzLDB4NkUsMHg3NCwweDNELDB4MDAsMHgyMCwKKzB4NjMsMHg1RiwweDYyLDB4NzIsMHg2QiwweDYzLDB4M0QsMHgwMCwweDIwLDB4NjMsMHg1RiwweDYyLDB4NkYsMHg2QiwweDYzLDB4M0QsCisweDAwLDB4MjAsMHg2MywweDVGLDB4NzIsMHg2NSwweDcwLDB4NkMsMHgzRCwweDAwLDB4MjAsMHg2MywweDVGLDB4NjMsMHg2MywweDczLAorMHg3MiwweDNELDB4MDAsMHgyMCwweDYzLDB4NUYsMHg3MywweDc0LDB4NzQsMHgzMSwweDNELDB4MDAsMHgyMCwweDYzLDB4NUYsMHg3MywKKzB4NzQsMHg3NCwweDMyLDB4M0QsMHgwMCwweDJCLDB4QzAsMHg4RSwweEQ4LDB4OEUsMHhDMCwweEU4LDB4QzIsMHgwMCwweEU4LDB4RTUsCisweDAwLDB4RkEsMHhCRiwweDg0LDB4MDAsMHhDNywweDA1LDB4REMsMHg1NiwweDhDLDB4NEQsMHgwMiwweEJGLDB4MEMsMHgwMCwweEM3LAorMHgwNSwweDZFLDB4NUUsMHg4QywweDRELDB4MDIsMHhCRiwweDA0LDB4MDAsMHhDNywweDA1LDB4QkEsMHg1RSwweDhDLDB4NEQsMHgwMiwKKzB4RTgsMHhGMSwweDAwLDB4OTAsMHhFOCwweDQ5LDB4MDEsMHhFOCwweDE2LDB4MDAsMHhGNCwweDkwLDB4RTgsMHhFNSwweDAwLDB4QkUsCisweEJBLDB4NEQsMHhFOCwweDA5LDB4MEMsMHhBMCwweDkzLDB4MTIsMHhFOCwweDVELDB4MEMsMHhFOCwweEMyLDB4MDksMHhFQiwweEU0LAorMHhFOCwweEQ1LDB4MEMsMHhFOCwweEM0LDB4MEMsMHgwQSwweEMwLDB4NzQsMHhGNiwweDhCLDB4MUUsMHhGOCwweDc5LDB4M0MsMHgwRCwKKzB4NzQsMHgyRSwweDNDLDB4MDgsMHg3NCwweDE3LDB4M0MsMHg3RiwweDc0LDB4MTMsMHg4MywweEZCLDB4MjAsMHg3RiwweEUxLDB4ODgsCisweDg3LDB4RDYsMHg3OSwweDQzLDB4ODksMHgxRSwweEY4LDB4NzksMHhFOCwweDc3LDB4MEMsMHhFQiwweEQzLDB4MEIsMHhEQiwweDc0LAorMHhDRiwweDRCLDB4ODksMHgxRSwweEY4LDB4NzksMHg4QiwweDM2LDB4MTYsMHg3QSwweEU4LDB4QzEsMHgwQiwweEVCLDB4QzEsMHg5MCwKKzB4RTgsMHgwMiwweDAwLDB4RUIsMHhCQiwweEM2LDB4ODcsMHhENiwweDc5LDB4MDAsMHgwQiwweERCLDB4NzQsMHgxRSwweEEwLDB4RDYsCisweDc5LDB4QkYsMHg2MCwweDUxLDB4QjksMHgxRCwweDAwLDB4OEIsMHhEOSwweDA2LDB4MEUsMHgwNywweEYyLDB4QUUsMHgwNywweDc1LAorMHgxNywweDQxLDB4MkIsMHhEOSwweEQxLDB4RTMsMHgyRSwweEZGLDB4OTcsMHg3RCwweDUxLDB4OTAsMHgzMywweEMwLDB4QTMsMHhGOCwKKzB4NzksMHhCRSwweDg5LDB4NEQsMHhFOCwweDg3LDB4MEIsMHhDMywweEJFLDB4OEQsMHg0RCwweEU4LDB4ODAsMHgwQiwweEVCLDB4RUMsCisweEJBLDB4MDAsMHgwMiwweEIwLDB4OTMsMHhFRSwweEIwLDB4NTUsMHhFRSwweEJBLDB4MTAsMHgwMiwweEIwLDB4OTMsMHhFRSwweEIwLAorMHhBQSwweEVFLDB4QkEsMHgwMCwweDAyLDB4RUMsMHgzQywweDU1LDB4NzUsMHgwOCwweEJBLDB4MTAsMHgwMiwweEVDLDB4M0MsMHhBQSwKKzB4NzQsMHgwMywweEU4LDB4MkYsMHhGNiwweEMzLDB4QkEsMHgwNCwweDAyLDB4QjAsMHgxQSwweEVFLDB4QjAsMHgyMCwweEVFLDB4QjAsCisweDMwLDB4RUUsMHhCMCwweDQwLDB4RUUsMHhCMCwweDgwLDB4RUUsMHhCQSwweDAwLDB4MDIsMHhCMCwweDEzLDB4RUUsMHhCMCwweDA3LAorMHhFRSwweEJBLDB4MDgsMHgwMiwweEIwLDB4ODAsMHhFRSwweEJBLDB4MDIsMHgwMiwweEIwLDB4QkIsMHhFRSwweEJBLDB4MDQsMHgwMiwKKzB4QjAsMHgwNSwweEVFLDB4QzMsMHhDNiwweDA2LDB4Q0EsMHgxMywweDAxLDB4QzcsMHgwNiwweEY4LDB4NzksMHgwMCwweDAwLDB4QzYsCisweDA2LDB4RjYsMHg3OSwweDAxLDB4QzcsMHgwNiwweEQwLDB4NzksMHgwMCwweDAwLDB4QzcsMHgwNiwweEQyLDB4NzksMHgwMCwweDAwLAorMHhDNywweDA2LDB4RDQsMHg3OSwweDAwLDB4MDAsMHhDNywweDA2LDB4RkEsMHg3OSwweDAwLDB4MDAsMHhDNywweDA2LDB4RkMsMHg3OSwKKzB4MDAsMHgwMCwweEM3LDB4MDYsMHhGRSwweDc5LDB4MDAsMHgwMCwweEM3LDB4MDYsMHgwMCwweDdBLDB4MDAsMHgwMCwweEM3LDB4MDYsCisweDAyLDB4N0EsMHhDRSwweDU5LDB4OEMsMHgwRSwweDA0LDB4N0EsMHhDNywweDA2LDB4MDYsMHg3QSwweDAwLDB4MDAsMHhDNywweDA2LAorMHgyNywweDdBLDB4MDAsMHgwMCwweEM2LDB4MDYsMHgyOSwweDdBLDB4MDAsMHhDNiwweDA2LDB4MkEsMHg3QSwweDAwLDB4QzMsMHg5MCwKKzB4QkUsMHgyMiwweDRELDB4RTgsMHhDOCwweDBBLDB4RTgsMHgzRiwweDAwLDB4MkMsMHgzMSwweDNDLDB4MDEsMHg3NywweEY3LDB4RTgsCisweDgxLDB4MDksMHg4QiwweDM2LDB4MEMsMHg3QSwweEU4LDB4QjUsMHgwQSwweEJFLDB4NkEsMHg0RCwweEU4LDB4QUYsMHgwQSwweDBFLAorMHg1OCwweEU4LDB4RjgsMHgwQSwweEJFLDB4N0EsMHg0RCwweEU4LDB4QTQsMHgwQSwweEMzLDB4OTAsMHg2MCwweEQxLDB4RTMsMHg4MywKKzB4RkIsMHgxOCwweDczLDB4MTEsMHgxRSwweEJBLDB4MDAsMHgwMCwweDhFLDB4REEsMHgyRSwweEZGLDB4OTcsMHhCNywweDUxLDB4OEIsCisweEVDLDB4ODksMHg0NiwweDEwLDB4MUYsMHg2MSwweENGLDB4OTAsMHhFOCwweDRGLDB4MEIsMHgwQSwweEMwLDB4NzUsMHgwNSwweEU4LAorMHg1NiwweDBCLDB4RUIsMHhGNCwweEMzLDB4OTAsMHg4MywweDNFLDB4RjgsMHg3OSwweDAxLDB4NzQsMHgxNiwweEJFLDB4RDcsMHg3OSwKKzB4RTgsMHgzMSwweDBBLDB4OEIsMHhEMCwweEFDLDB4M0MsMHgyQywweDc0LDB4MDQsMHgzQywweDIwLDB4NzUsMHgwNSwweEU4LDB4MjMsCisweDBBLDB4RUUsMHhDMywweEU5LDB4RDIsMHhGRSwweDgzLDB4M0UsMHhGOCwweDc5LDB4MDEsMHg3NCwweEY2LDB4QkUsMHhENywweDc5LAorMHhFOCwweDExLDB4MEEsMHg4QiwweEQwLDB4QUMsMHgzQywweDJDLDB4NzQsMHgwOCwweDNDLDB4MjAsMHg3NCwweDA0LDB4RTksMHhCNywKKzB4RkUsMHg5MCwweEU4LDB4RkYsMHgwOSwweEVGLDB4QzMsMHg5MCwweDhCLDB4MTYsMHgwNiwweDdBLDB4ODMsMHgzRSwweEY4LDB4NzksCisweDAxLDB4NzQsMHgwQiwweEJFLDB4RDcsMHg3OSwweEU4LDB4RUIsMHgwOSwweDhCLDB4RDAsMHhBMywweDA2LDB4N0EsMHhCMCwweDIwLAorMHhFOCwweDU3LDB4MEIsMHg4QiwweDE2LDB4MDYsMHg3QSwweEVDLDB4RTgsMHg2RiwweDBCLDB4QzMsMHg4QiwweDE2LDB4MDYsMHg3QSwKKzB4ODMsMHgzRSwweEY4LDB4NzksMHgwMSwweDc0LDB4MEIsMHhCRSwweEQ3LDB4NzksMHhFOCwweEM3LDB4MDksMHg4QiwweEQwLDB4QTMsCisweDA2LDB4N0EsMHhCMCwweDIwLDB4RTgsMHgzMywweDBCLDB4OEIsMHgxNiwweDA2LDB4N0EsMHhFRCwweEU4LDB4NjcsMHgwQiwweEMzLAorMHhGQSwweEM2LDB4MDYsMHhGNiwweDc5LDB4MDAsMHhDMywweDkwLDB4QzYsMHgwNiwweEY2LDB4NzksMHgwMSwweEZCLDB4QzMsMHg5MCwKKzB4MDYsMHhFOCwweDU4LDB4MDksMHhCMCwweDIwLDB4RTgsMHgxMSwweDBCLDB4MjYsMHg4QiwweDA1LDB4RTgsMHg0NywweDBCLDB4QjAsCisweDA4LDB4RTgsMHgwNiwweDBCLDB4RTgsMHgwMywweDBCLDB4RTgsMHgwMCwweDBCLDB4RTgsMHhGRCwweDBBLDB4QjgsMHgwMSwweDAwLAorMHhFOCwweENGLDB4RjQsMHhCQSwweDAyLDB4MDIsMHhFQywweDI0LDB4MDEsMHg3NSwweDAyLDB4RUIsMHhEQywweEJBLDB4MDYsMHgwMiwKKzB4RUMsMHgwNywweEMzLDB4OTAsMHhDNywweDA2LDB4MDgsMHg3QSwweDEwLDB4MDAsMHhFQiwweDA2LDB4QzcsMHgwNiwweDA4LDB4N0EsCisweDAxLDB4MDAsMHgwNiwweDhFLDB4MDYsMHhGQywweDc5LDB4OEIsMHgzRSwweEZBLDB4NzksMHhFOCwweDBFLDB4MDksMHhFOCwweDBCLAorMHgwMCwweDg5LDB4M0UsMHhGQSwweDc5LDB4OEMsMHgwNiwweEZDLDB4NzksMHgwNywweEMzLDB4OTAsMHhCRSwweEIyLDB4NEQsMHhFOCwKKzB4N0MsMHgwOSwweDhCLDB4MTYsMHgwOCwweDdBLDB4NTIsMHhFOCwweDJBLDB4MDksMHhFOCwweDBGLDB4MEEsMHhFOCwweDBDLDB4MEEsCisweDMzLDB4REIsMHhCOSwweDEwLDB4MDAsMHg5MCwweDI2LDB4OEEsMHgwMSwweEU4LDB4QkMsMHgwOSwweEU4LDB4RkQsMHgwOSwweDQzLAorMHhFMiwweEY0LDB4RTgsMHhGNywweDA5LDB4RTgsMHhGNCwweDA5LDB4MzMsMHhEQiwweEI5LDB4MTAsMHgwMCwweDkwLDB4MjYsMHg4QSwKKzB4MDEsMHgzQywweDIwLDB4NzIsMHgwNSwweDNDLDB4N0UsMHg3NiwweDAzLDB4OTAsMHhCMCwweDJFLDB4RTgsMHhFMywweDA5LDB4NDMsCisweEUyLDB4RUMsMHhCRSwweEIyLDB4NEQsMHhFOCwweDM2LDB4MDksMHg4MywweEM3LDB4MTAsMHg1QSwweDRBLDB4NzUsMHhCNywweEMzLAorMHgwNiwweDhFLDB4MDYsMHgwMCwweDdBLDB4OEIsMHgzRSwweEZFLDB4NzksMHhFOCwweEEwLDB4MDgsMHg4OSwweDNFLDB4RkUsMHg3OSwKKzB4OEMsMHgwNiwweDAwLDB4N0EsMHg1NywweDhCLDB4MzYsMHgwRSwweDdBLDB4RTgsMHgxMiwweDA5LDB4QzcsMHgwNiwweDA4LDB4N0EsCisweDEwLDB4MDAsMHhCQSwweDAwLDB4MDIsMHhFOCwweEU4LDB4MDAsMHhFOCwweDgxLDB4RkYsMHg1RiwweEJBLDB4MDAsMHgwMCwweEU4LAorMHhERSwweDAwLDB4QkUsMHhCNSwweDRELDB4RTgsMHhGNiwweDA4LDB4OEMsMHhDMCwweEU4LDB4M0YsMHgwOSwweEIwLDB4M0EsMHhFOCwKKzB4OTAsMHgwOSwweDhCLDB4QzcsMHhFOCwweDM1LDB4MDksMHhFOCwweDdFLDB4MDgsMHhFOCwweEMzLDB4MDAsMHg5MCwweEU4LDB4QjcsCisweDA5LDB4RTgsMHhBNiwweDA5LDB4MEEsMHhDMCwweDc0LDB4RjYsMHgzQywweDBCLDB4NzUsMHgwNiwweDgzLDB4RUYsMHgxMCwweEVCLAorMHgxOSwweDkwLDB4M0MsMHgwQSwweDc1LDB4MDYsMHg4MywweEM3LDB4MTAsMHhFQiwweDBGLDB4OTAsMHgzQywweDBDLDB4NzUsMHgwNCwKKzB4NDcsMHhFQiwweDA3LDB4OTAsMHgzQywweDA4LDB4NzUsMHgyNCwweDRGLDB4OTAsMHg4QiwweDM2LDB4RkUsMHg3OSwweDhCLDB4QzcsCisweDJCLDB4QzYsMHgzRCwweDAwLDB4MDEsMHg3MiwweEE1LDB4M0QsMHgxMCwweDAxLDB4NzIsMHgwNCwweDgzLDB4RUUsMHgyMCwweDkwLAorMHg4MywweEM2LDB4MTAsMHg4OSwweDM2LDB4RkUsMHg3OSwweDU3LDB4OEIsMHhGRSwweEVCLDB4ODAsMHgzQywweDJFLDB4NzUsMHgwOCwKKzB4QkEsMHgwMSwweDEzLDB4RTgsMHg2QSwweDAwLDB4MDcsMHhDMywweEM2LDB4MDYsMHgwQSwweDdBLDB4MDIsMHgzMiwweEM5LDB4OTAsCisweDNDLDB4MzAsMHg3MiwweDRDLDB4M0MsMHgzOSwweDc2LDB4MEMsMHgyNCwweDVGLDB4M0MsMHg0MSwweDcyLDB4NDIsMHgzQywweDQ2LAorMHg3NywweDNFLDB4MkMsMHgwNywweDJDLDB4MzAsMHg1MCwweEU4LDB4Q0MsMHgwOCwweDU4LDB4MDIsMHhDOCwweEZFLDB4MEUsMHgwQSwKKzB4N0EsMHg3NCwweDBGLDB4QzAsMHhFMSwweDA0LDB4RTgsMHgyRiwweDA5LDB4RTgsMHgxRSwweDA5LDB4MEEsMHhDMCwweDc0LDB4RjYsCisweEVCLDB4Q0UsMHgyNiwweDg4LDB4MEQsMHhFOCwweEUwLDB4MDcsMHg4QSwweEQwLDB4RTgsMHgyMywweDAwLDB4OEEsMHhDMSwweDNDLAorMHgyMCwweDcyLDB4MDUsMHgzQywweDdFLDB4NzYsMHgwMywweDkwLDB4QjAsMHgyRSwweEU4LDB4RDUsMHgwOCwweEU5LDB4NzAsMHhGRiwKKzB4RTgsMHhDNSwweDA3LDB4RTgsMHgwQSwweDAwLDB4MjYsMHg4QSwweDA1LDB4RTgsMHg3QywweDA4LDB4RTksMHgxRCwweEZGLDB4OTAsCisweEY2LDB4MDYsMHgyNiwweDdBLDB4MDIsMHg3NSwweDAyLDB4ODYsMHhGMiwweDUyLDB4OEIsMHgzNiwweDFBLDB4N0EsMHhFOCwweDBELAorMHgwOCwweDVBLDB4NTIsMHg4QSwweEM2LDB4MDIsMHgwNiwweDI0LDB4N0EsMHhGNiwweDA2LDB4MjYsMHg3QSwweDAxLDB4NzUsMHgwNiwKKzB4RTgsMHg5RiwweDA4LDB4RUIsMHgwRCwweDkwLDB4MzIsMHhFNCwweEU4LDB4MEQsMHgwOCwweDhCLDB4MzYsMHgxQywweDdBLDB4RTgsCisweEVDLDB4MDcsMHg1QSwweDhBLDB4QzIsMHgwMiwweDA2LDB4MjUsMHg3QSwweEY2LDB4MDYsMHgyNiwweDdBLDB4MDEsMHg3NSwweDA2LAorMHhFOCwweDdGLDB4MDgsMHhFQiwweDA2LDB4OTAsMHgzMiwweEU0LDB4RTgsMHhFRCwweDA3LDB4OEIsMHgzNiwweDFFLDB4N0EsMHhFOCwKKzB4Q0MsMHgwNywweEMzLDB4OTAsMHgwNiwweDhFLDB4MDYsMHgwNCwweDdBLDB4OEIsMHgzRSwweDAyLDB4N0EsMHhFOCwweDNDLDB4MDcsCisweDg5LDB4M0UsMHgwMiwweDdBLDB4OEMsMHgwNiwweDA0LDB4N0EsMHgwNywweEZGLDB4MUUsMHgwMiwweDdBLDB4QzMsMHhCRSwweDk3LAorMHg0RCwweEU4LDB4QUEsMHgwNywweENCLDB4OTAsMHgwNiwweDU3LDB4QkUsMHhENywweDc5LDB4RTgsMHg2NiwweDA3LDB4OEIsMHhEOCwKKzB4RTgsMHg2MSwweDA3LDB4OEIsMHhDOCwweDJCLDB4Q0IsMHg3OCwweDExLDB4OEUsMHhDMywweEJGLDB4MDAsMHgwMCwweEI4LDB4RkYsCisweEZGLDB4NTEsMHhCOSwweDA4LDB4MDAsMHhGMywweEFCLDB4NTksMHhFMiwweEY3LDB4NUYsMHgwNywweEMzLDB4OTAsMHgwNiwweEJFLAorMHhENywweDc5LDB4RTgsMHgzRiwweDA3LDB4OEIsMHhEOCwweEQxLDB4RTMsMHgyRSwweDhCLDB4OUYsMHg0NCwweDAwLDB4QkUsMHgyNiwKKzB4NTIsMHhFOCwweEYxLDB4MDgsMHg4QiwweEMzLDB4RTgsMHhERCwweDA4LDB4QjgsMHgwMSwweDAwLDB4RTgsMHg3MywweEYyLDB4RTgsCisweEUwLDB4MDgsMHhCRSwweDJGLDB4NTIsMHhFOCwweERELDB4MDgsMHg4QiwweDQ3LDB4MTgsMHhFOCwweEM4LDB4MDgsMHhCRSwweDc3LAorMHg1MiwweEU4LDB4RDEsMHgwOCwweDhCLDB4NDcsMHgyNiwweEU4LDB4QkMsMHgwOCwweEJFLDB4NTMsMHg1MiwweEU4LDB4QzUsMHgwOCwKKzB4OEIsMHg0NywweDFFLDB4RTgsMHhCMCwweDA4LDB4QkUsMHg1QywweDUyLDB4RTgsMHhCOSwweDA4LDB4OEIsMHg0NywweDIwLDB4RTgsCisweEE0LDB4MDgsMHhCRSwweDZFLDB4NTIsMHhFOCwweEFELDB4MDgsMHg4QiwweDQ3LDB4MjQsMHhFOCwweDk4LDB4MDgsMHhCRSwweDgwLAorMHg1MiwweEU4LDB4QTEsMHgwOCwweDhCLDB4NDcsMHgyQSwweEU4LDB4OEMsMHgwOCwweEU4LDB4OTUsMHgwOCwweEJFLDB4MzgsMHg1MiwKKzB4RTgsMHg5MiwweDA4LDB4OEIsMHgwNywweEU4LDB4N0UsMHgwOCwweEJFLDB4NDEsMHg1MiwweEU4LDB4ODcsMHgwOCwweDhCLDB4NDcsCisweDFBLDB4RTgsMHg3MiwweDA4LDB4QkUsMHg0QSwweDUyLDB4RTgsMHg3QiwweDA4LDB4OEIsMHg0NywweDFDLDB4RTgsMHg2NiwweDA4LAorMHhCRSwweDY1LDB4NTIsMHhFOCwweDZGLDB4MDgsMHg4QiwweDQ3LDB4MjIsMHhFOCwweDVBLDB4MDgsMHhFOCwweDYzLDB4MDgsMHhCRSwKKzB4RDEsMHg1MiwweEU4LDB4NjAsMHgwOCwweDhCLDB4NDcsMHgzOCwweEU4LDB4NEIsMHgwOCwweEJFLDB4QUQsMHg1MiwweEU4LDB4NTQsCisweDA4LDB4OEIsMHg0NywweDMwLDB4RTgsMHgzRiwweDA4LDB4QkUsMHhCNiwweDUyLDB4RTgsMHg0OCwweDA4LDB4OEIsMHg0NywweDMyLAorMHhFOCwweDMzLDB4MDgsMHhCRSwweEE0LDB4NTIsMHhFOCwweDNDLDB4MDgsMHg4QiwweDQ3LDB4MkUsMHhFOCwweDI3LDB4MDgsMHhCRSwKKzB4QkYsMHg1MiwweEU4LDB4MzAsMHgwOCwweDhCLDB4NDcsMHgzNCwweEU4LDB4MUIsMHgwOCwweEU4LDB4MjQsMHgwOCwweEJFLDB4ODksCisweDUyLDB4RTgsMHgyMSwweDA4LDB4OEIsMHg0NywweDA0LDB4RTgsMHgwQywweDA4LDB4QkUsMHg5MiwweDUyLDB4RTgsMHgxNSwweDA4LAorMHg4QiwweDQ3LDB4MTQsMHhFOCwweDAwLDB4MDgsMHhCRSwweDlCLDB4NTIsMHhFOCwweDA5LDB4MDgsMHg4QiwweDQ3LDB4MkMsMHhFOCwKKzB4RjQsMHgwNywweEJFLDB4QzgsMHg1MiwweEU4LDB4RkQsMHgwNywweDhCLDB4NDcsMHgzNiwweEU4LDB4RTgsMHgwNywweEJFLDB4REEsCisweDUyLDB4RTgsMHhGMSwweDA3LDB4OEIsMHg0NywweDNBLDB4RTgsMHhEQywweDA3LDB4QkUsMHhFMywweDUyLDB4RTgsMHhFNSwweDA3LAorMHg4QiwweDQ3LDB4M0MsMHhFOCwweEQwLDB4MDcsMHhFOCwweEQ5LDB4MDcsMHhCRSwweDE5LDB4NTMsMHhFOCwweEQ2LDB4MDcsMHg4QiwKKzB4NDcsMHg0OCwweEU4LDB4QzEsMHgwNywweEJFLDB4RkUsMHg1MiwweEU4LDB4Q0EsMHgwNywweDhCLDB4NDcsMHg0MiwweEU4LDB4QjUsCisweDA3LDB4QkUsMHgwNywweDUzLDB4RTgsMHhCRSwweDA3LDB4OEIsMHg0NywweDQ0LDB4RTgsMHhBOSwweDA3LDB4QkUsMHg3QywweDUzLAorMHhFOCwweEIyLDB4MDcsMHg4QiwweDQ3LDB4NEMsMHhFOCwweDlELDB4MDcsMHhCRSwweDg1LDB4NTMsMHhFOCwweEE2LDB4MDcsMHg4QiwKKzB4NDcsMHg0RSwweEU4LDB4OTEsMHgwNywweEJFLDB4OEUsMHg1MywweEU4LDB4OUEsMHgwNywweDhCLDB4NDcsMHg1MCwweEU4LDB4ODUsCisweDA3LDB4RTgsMHg4RSwweDA3LDB4QkUsMHgyMiwweDUzLDB4RTgsMHg4QiwweDA3LDB4OEIsMHg0NywweDRBLDB4RTgsMHg3NiwweDA3LAorMHhCRSwweEVDLDB4NTIsMHhFOCwweDdGLDB4MDcsMHg4QiwweDQ3LDB4MDgsMHhFOCwweDZBLDB4MDcsMHhCRSwweEY1LDB4NTIsMHhFOCwKKzB4NzMsMHgwNywweDhCLDB4NDcsMHg0MCwweEU4LDB4NUUsMHgwNywweEJFLDB4MTAsMHg1MywweEU4LDB4NjcsMHgwNywweDhCLDB4NDcsCisweDQ2LDB4RTgsMHg1MiwweDA3LDB4RTgsMHg1QiwweDA3LDB4QkUsMHg2QSwweDUzLDB4RTgsMHg1OCwweDA3LDB4OEIsMHg0NywweDdBLAorMHhFOCwweDQzLDB4MDcsMHhCRSwweDNELDB4NTMsMHhFOCwweDRDLDB4MDcsMHg4QiwweDQ3LDB4NzAsMHhFOCwweDM3LDB4MDcsMHhCRSwKKzB4NDYsMHg1MywweEU4LDB4NDAsMHgwNywweDhCLDB4NDcsMHg3MiwweEU4LDB4MkIsMHgwNywweEJFLDB4NEYsMHg1MywweEU4LDB4MzQsCisweDA3LDB4OEIsMHg0NywweDc0LDB4RTgsMHgxRiwweDA3LDB4RTgsMHgyOCwweDA3LDB4QkUsMHgyQiwweDUzLDB4RTgsMHgyNSwweDA3LAorMHg4QiwweDQ3LDB4MEMsMHhFOCwweDEwLDB4MDcsMHhCRSwweDM0LDB4NTMsMHhFOCwweDE5LDB4MDcsMHg4QiwweDQ3LDB4MTAsMHhFOCwKKzB4MDQsMHgwNywweEJFLDB4NTgsMHg1MywweEU4LDB4MEQsMHgwNywweDhCLDB4NDcsMHg3NiwweEU4LDB4RjgsMHgwNiwweEJFLDB4NjEsCisweDUzLDB4RTgsMHgwMSwweDA3LDB4OEIsMHg0NywweDc4LDB4RTgsMHhFQywweDA2LDB4QkUsMHg3MywweDUzLDB4RTgsMHhGNSwweDA2LAorMHg4QiwweDQ3LDB4M0UsMHhFOCwweEUwLDB4MDYsMHhFOCwweEU5LDB4MDYsMHhCRSwweDk3LDB4NTMsMHhFOCwweEU2LDB4MDYsMHg4QiwKKzB4NDcsMHg1MiwweEU4LDB4RDEsMHgwNiwweEJFLDB4QTAsMHg1MywweEU4LDB4REEsMHgwNiwweDhCLDB4NDcsMHg1NCwweEU4LDB4QzUsCisweDA2LDB4QkUsMHhBOSwweDUzLDB4RTgsMHhDRSwweDA2LDB4OEIsMHg0NywweDU2LDB4RTgsMHhCOSwweDA2LDB4QkUsMHhCMiwweDUzLAorMHhFOCwweEMyLDB4MDYsMHg4QiwweDQ3LDB4NTgsMHhFOCwweEFELDB4MDYsMHhCRSwweEJCLDB4NTMsMHhFOCwweEI2LDB4MDYsMHg4QiwKKzB4NDcsMHg1QSwweEU4LDB4QTEsMHgwNiwweEJFLDB4QzQsMHg1MywweEU4LDB4QUEsMHgwNiwweDhCLDB4NDcsMHg1QywweEU4LDB4OTUsCisweDA2LDB4RTgsMHg5RSwweDA2LDB4QkUsMHhDRCwweDUzLDB4RTgsMHg5QiwweDA2LDB4OEIsMHg0NywweDVFLDB4RTgsMHg4NiwweDA2LAorMHhCRSwweEQ2LDB4NTMsMHhFOCwweDhGLDB4MDYsMHg4QiwweDQ3LDB4NjAsMHhFOCwweDdBLDB4MDYsMHhCRSwweERGLDB4NTMsMHhFOCwKKzB4ODMsMHgwNiwweDhCLDB4NDcsMHg2MiwweEU4LDB4NkUsMHgwNiwweEJFLDB4RTgsMHg1MywweEU4LDB4NzcsMHgwNiwweDhCLDB4NDcsCisweDdDLDB4RTgsMHg2MiwweDA2LDB4QkUsMHhGMSwweDUzLDB4RTgsMHg2QiwweDA2LDB4OEIsMHg0NywweDdFLDB4RTgsMHg1NiwweDA2LAorMHhCRSwweEZBLDB4NTMsMHhFOCwweDVGLDB4MDYsMHg4QiwweDg3LDB4ODAsMHgwMCwweEU4LDB4NDksMHgwNiwweEU4LDB4NTIsMHgwNiwKKzB4QkUsMHg0MiwweDU0LDB4RTgsMHg0RiwweDA2LDB4OEIsMHg4NywweDlFLDB4MDAsMHhFOCwweDM5LDB4MDYsMHhCRSwweDAzLDB4NTQsCisweEU4LDB4NDIsMHgwNiwweDhCLDB4NDcsMHg2NCwweEU4LDB4MkQsMHgwNiwweEJFLDB4MEMsMHg1NCwweEU4LDB4MzYsMHgwNiwweDhCLAorMHg0NywweDZFLDB4RTgsMHgyMSwweDA2LDB4QkUsMHgxNSwweDU0LDB4RTgsMHgyQSwweDA2LDB4OEIsMHg4NywweDhFLDB4MDAsMHhFOCwKKzB4MTQsMHgwNiwweEJFLDB4MUUsMHg1NCwweEU4LDB4MUQsMHgwNiwweDhCLDB4ODcsMHg5MCwweDAwLDB4RTgsMHgwNywweDA2LDB4QkUsCisweDI3LDB4NTQsMHhFOCwweDEwLDB4MDYsMHg4QiwweDg3LDB4OTIsMHgwMCwweEU4LDB4RkEsMHgwNSwweEU4LDB4MDMsMHgwNiwweEJFLAorMHgzMCwweDU0LDB4RTgsMHgwMCwweDA2LDB4OEIsMHg4NywweDk0LDB4MDAsMHhFOCwweEVBLDB4MDUsMHhCRSwweDM5LDB4NTQsMHhFOCwKKzB4RjMsMHgwNSwweDhCLDB4ODcsMHg5NiwweDAwLDB4RTgsMHhERCwweDA1LDB4QkUsMHg2RiwweDU0LDB4RTgsMHhFNiwweDA1LDB4OEIsCisweDg3LDB4OTgsMHgwMCwweEU4LDB4RDAsMHgwNSwweEJFLDB4NUQsMHg1NCwweEU4LDB4RDksMHgwNSwweDhBLDB4ODcsMHhBMCwweDAwLAorMHhFOCwweEE3LDB4MDUsMHhCRSwweDU0LDB4NTQsMHhFOCwweENDLDB4MDUsMHg4QSwweDQ3LDB4MjgsMHhFOCwweDlCLDB4MDUsMHhCRSwKKzB4NjYsMHg1NCwweEU4LDB4QzAsMHgwNSwweDhBLDB4ODcsMHhBMSwweDAwLDB4RTgsMHg4RSwweDA1LDB4RTgsMHhCMywweDA1LDB4QkUsCisweDc4LDB4NTQsMHhFOCwweEIwLDB4MDUsMHg4QSwweDg3LDB4QTIsMHgwMCwweEU4LDB4N0UsMHgwNSwweEJFLDB4ODEsMHg1NCwweEU4LAorMHhBMywweDA1LDB4OEEsMHg4NywweEEzLDB4MDAsMHhFOCwweDcxLDB4MDUsMHhCRSwweDhBLDB4NTQsMHhFOCwweDk2LDB4MDUsMHg4QSwKKzB4ODcsMHhBNCwweDAwLDB4RTgsMHg2NCwweDA1LDB4QkUsMHg5MywweDU0LDB4RTgsMHg4OSwweDA1LDB4OEEsMHg4NywweEE1LDB4MDAsCisweEU4LDB4NTcsMHgwNSwweEJFLDB4OUMsMHg1NCwweEU4LDB4N0MsMHgwNSwweDhBLDB4ODcsMHhBNiwweDAwLDB4RTgsMHg0QSwweDA1LAorMHhCRSwweEE1LDB4NTQsMHhFOCwweDZGLDB4MDUsMHg4QSwweDg3LDB4QTcsMHgwMCwweEU4LDB4M0QsMHgwNSwweEJFLDB4QUUsMHg1NCwKKzB4RTgsMHg2MiwweDA1LDB4OEEsMHg4NywweEE4LDB4MDAsMHhFOCwweDMwLDB4MDUsMHhFOCwweDU1LDB4MDUsMHhCRSwweEI3LDB4NTQsCisweEU4LDB4NTIsMHgwNSwweDhBLDB4ODcsMHhBOSwweDAwLDB4RTgsMHgyMCwweDA1LDB4QkUsMHhDMCwweDU0LDB4RTgsMHg0NSwweDA1LAorMHg4QSwweDg3LDB4QUEsMHgwMCwweEU4LDB4MTMsMHgwNSwweEJFLDB4QzksMHg1NCwweEU4LDB4MzgsMHgwNSwweDhBLDB4ODcsMHhBQiwKKzB4MDAsMHhFOCwweDA2LDB4MDUsMHhCRSwweEQyLDB4NTQsMHhFOCwweDJCLDB4MDUsMHg4QSwweDg3LDB4QUQsMHgwMCwweEU4LDB4RjksCisweDA0LDB4QkUsMHhEQiwweDU0LDB4RTgsMHgxRSwweDA1LDB4OEEsMHg4NywweEFFLDB4MDAsMHhFOCwweEVDLDB4MDQsMHhCRSwweEU0LAorMHg1NCwweEU4LDB4MTEsMHgwNSwweDhBLDB4ODcsMHhBRiwweDAwLDB4RTgsMHhERiwweDA0LDB4QkUsMHhFRCwweDU0LDB4RTgsMHgwNCwKKzB4MDUsMHg4QSwweDg3LDB4QjAsMHgwMCwweEU4LDB4RDIsMHgwNCwweEU4LDB4RjcsMHgwNCwweEJFLDB4RjYsMHg1NCwweEU4LDB4RjQsCisweDA0LDB4OEEsMHg4NywweEIxLDB4MDAsMHhFOCwweEMyLDB4MDQsMHhCRSwweEZGLDB4NTQsMHhFOCwweEU3LDB4MDQsMHg4QSwweDg3LAorMHhCMiwweDAwLDB4RTgsMHhCNSwweDA0LDB4QkUsMHgwOCwweDU1LDB4RTgsMHhEQSwweDA0LDB4OEEsMHg4NywweEIzLDB4MDAsMHhFOCwKKzB4QTgsMHgwNCwweEJFLDB4MTEsMHg1NSwweEU4LDB4Q0QsMHgwNCwweDhBLDB4ODcsMHhCQiwweDAwLDB4RTgsMHg5QiwweDA0LDB4RTgsCisweEMwLDB4MDQsMHhCRSwweDFBLDB4NTUsMHhFOCwweEJELDB4MDQsMHg4QSwweDg3LDB4QkMsMHgwMCwweEU4LDB4OEIsMHgwNCwweEJFLAorMHgyMywweDU1LDB4RTgsMHhCMCwweDA0LDB4OEEsMHg4NywweEJFLDB4MDAsMHhFOCwweDdFLDB4MDQsMHhCRSwweDJDLDB4NTUsMHhFOCwKKzB4QTMsMHgwNCwweDhBLDB4ODcsMHhCRiwweDAwLDB4RTgsMHg3MSwweDA0LDB4RTgsMHg5NiwweDA0LDB4MDcsMHhDMywweDYwLDB4MDYsCisweDFFLDB4MTYsMHg4QiwweEVDLDB4RkYsMHg0RSwweDE2LDB4RjcsMHg0NiwweDFBLDB4MDAsMHgwMiwweDc0LDB4MDEsMHhGQiwweEI4LAorMHgwMCwweDAwLDB4OEUsMHhEOCwweDhFLDB4QzAsMHg4OSwweDJFLDB4MkQsMHg3QSwweEU4LDB4Q0IsMHgwMCwweDgxLDB4NjYsMHgxQSwKKzB4RkYsMHhGRSwweEM2LDB4MDYsMHgyQSwweDdBLDB4MDAsMHhFOCwweEQ4LDB4MDAsMHhCOCwweDAwLDB4NUYsMHhBMywweDJCLDB4N0EsCisweEU4LDB4NUQsMHgwMCwweDgwLDB4M0UsMHgyQSwweDdBLDB4MDAsMHg3NCwweDBBLDB4ODEsMHg0RSwweDFBLDB4MDAsMHgwMSwweEM2LAorMHgwNiwweDJBLDB4N0EsMHgwMCwweDE3LDB4MUYsMHgwNywweDYxLDB4Q0YsMHg5MCwweDYwLDB4MDYsMHgxRSwweDE2LDB4OEIsMHhFQywKKzB4RjcsMHg0NiwweDFBLDB4MDAsMHgwMiwweDc0LDB4MDEsMHhGQiwweEI4LDB4MDAsMHgwMCwweDhFLDB4RDgsMHg4RSwweEMwLDB4ODksCisweDJFLDB4MkQsMHg3QSwweDgxLDB4NjYsMHgxQSwweEZGLDB4RkUsMHhDNiwweDA2LDB4MkEsMHg3QSwweDAwLDB4RTgsMHg5MiwweDAwLAorMHhCOCwweDAwLDB4NUYsMHhBMywweDJCLDB4N0EsMHhFOCwweDE3LDB4MDAsMHg4MCwweDNFLDB4MkEsMHg3QSwweDAwLDB4NzQsMHgwQSwKKzB4ODEsMHg0RSwweDFBLDB4MDAsMHgwMSwweEM2LDB4MDYsMHgyQSwweDdBLDB4MDAsMHgxNywweDFGLDB4MDcsMHg2MSwweENGLDB4OTAsCisweEI4LDB4RjAsMHgwMCwweEU4LDB4OEMsMHhFRCwweEZGLDB4MjYsMHgyQiwweDdBLDB4QzMsMHg5MCwweDA2LDB4NTMsMHg1NiwweDgwLAorMHgzRSwweDI5LDB4N0EsMHgwMCwweDc0LDB4MDMsMHhFOCwweDNGLDB4MDAsMHhCRSwweEQ3LDB4NzksMHhFOCwweDI1LDB4MDIsMHg4QiwKKzB4RDgsMHhBMywweDI3LDB4N0EsMHgyRSwweDhBLDB4MDcsMHhBMiwweDI5LDB4N0EsMHhCMCwweENDLDB4MkUsMHg4OCwweDA3LDB4NUUsCisweDVCLDB4MDcsMHhDMywweEM2LDB4MDYsMHgyQSwweDdBLDB4MDAsMHhCOCwweDBBLDB4NUYsMHhBMywweDJCLDB4N0EsMHhDMywweDkwLAorMHg4QiwweDJFLDB4MkQsMHg3QSwweEU4LDB4MkIsMHgwMCwweEMzLDB4QzYsMHgwNiwweDJBLDB4N0EsMHgwMSwweEU4LDB4MDgsMHgwMCwKKzB4QjgsMHgwQSwweDVGLDB4QTMsMHgyQiwweDdBLDB4QzMsMHg5MCwweDU3LDB4ODAsMHgzRSwweDI5LDB4N0EsMHgwMCwweDc0LDB4MEYsCisweDhCLDB4M0UsMHgyNywweDdBLDB4QTAsMHgyOSwweDdBLDB4MkUsMHg4OCwweDA1LDB4QzYsMHgwNiwweDI5LDB4N0EsMHgwMCwweDVGLAorMHhDMywweDkwLDB4QkUsMHhCMiwweDRELDB4RTgsMHgwNiwweDAyLDB4QkUsMHhEOCwweDUxLDB4RTgsMHgwMCwweDAyLDB4RkYsMHg3NiwKKzB4MTQsMHg1OCwweEU4LDB4NDcsMHgwMiwweEJFLDB4REUsMHg1MSwweEU4LDB4RjMsMHgwMSwweEZGLDB4NzYsMHgwRSwweDU4LDB4RTgsCisweDNBLDB4MDIsMHhCRSwweEU0LDB4NTEsMHhFOCwweEU2LDB4MDEsMHhGRiwweDc2LDB4MTIsMHg1OCwweEU4LDB4MkQsMHgwMiwweEJFLAorMHhFQSwweDUxLDB4RTgsMHhEOSwweDAxLDB4RkYsMHg3NiwweDEwLDB4NTgsMHhFOCwweDIwLDB4MDIsMHhCRSwweDE0LDB4NTIsMHhFOCwKKzB4Q0MsMHgwMSwweEZGLDB4NzYsMHgwQSwweDU4LDB4RTgsMHgxMywweDAyLDB4QkUsMHgxQSwweDUyLDB4RTgsMHhCRiwweDAxLDB4RkYsCisweDc2LDB4MEMsMHg1OCwweEU4LDB4MDYsMHgwMiwweEJFLDB4Q0YsMHg1MSwweEU4LDB4QjIsMHgwMSwweEZGLDB4NzYsMHgxQSwweDU4LAorMHhFOCwweEY5LDB4MDEsMHhCRSwweEIyLDB4NEQsMHhFOCwweEE1LDB4MDEsMHhCRSwweEYwLDB4NTEsMHhFOCwweDlGLDB4MDEsMHhGRiwKKzB4NzYsMHgxOCwweDU4LDB4RTgsMHhFNiwweDAxLDB4QkUsMHhGNiwweDUxLDB4RTgsMHg5MiwweDAxLDB4RkYsMHg3NiwweDAyLDB4NTgsCisweEU4LDB4RDksMHgwMSwweEJFLDB4RkMsMHg1MSwweEU4LDB4ODUsMHgwMSwweEZGLDB4NzYsMHgwNCwweDU4LDB4RTgsMHhDQywweDAxLAorMHhCRSwweDAyLDB4NTIsMHhFOCwweDc4LDB4MDEsMHhGRiwweDc2LDB4MDAsMHg1OCwweEU4LDB4QkYsMHgwMSwweEJFLDB4MDgsMHg1MiwKKzB4RTgsMHg2QiwweDAxLDB4RkYsMHg3NiwweDA2LDB4NTgsMHhFOCwweEIyLDB4MDEsMHhCRSwweDBFLDB4NTIsMHhFOCwweDVFLDB4MDEsCisweEZGLDB4NzYsMHgwOCwweDU4LDB4RTgsMHhBNSwweDAxLDB4QkUsMHgyMCwweDUyLDB4RTgsMHg1MSwweDAxLDB4RkYsMHg3NiwweDE2LAorMHg1OCwweEU4LDB4OTgsMHgwMSwweEJFLDB4ODksMHg0RCwweEU4LDB4NDQsMHgwMSwweEMzLDB4OTAsMHhCRSwweEM5LDB4NEQsMHhFOCwKKzB4M0MsMHgwMSwweEMzLDB4M0MsMHgwMCwweDc0LDB4MDUsMHgzQywweDAxLDB4NzQsMHg1OSwweEMzLDB4QzcsMHgwNiwweDBDLDB4N0EsCisweENELDB4NTAsMHhDNywweDA2LDB4MEUsMHg3QSwweEYwLDB4NTAsMHhDNywweDA2LDB4MTAsMHg3QSwweEU4LDB4NTAsMHhDNywweDA2LAorMHgxMiwweDdBLDB4RUMsMHg1MCwweEM3LDB4MDYsMHgxNCwweDdBLDB4RjQsMHg1MCwweEM3LDB4MDYsMHgxNiwweDdBLDB4RkIsMHg1MCwKKzB4QzcsMHgwNiwweDE4LDB4N0EsMHgwMywweDUxLDB4QzcsMHgwNiwweDFBLDB4N0EsMHgwQiwweDUxLDB4QzcsMHgwNiwweDFDLDB4N0EsCisweDBFLDB4NTEsMHhDNywweDA2LDB4MUUsMHg3QSwweDEwLDB4NTEsMHhDNywweDA2LDB4MjAsMHg3QSwweDEyLDB4NTEsMHhDNywweDA2LAorMHgyMiwweDdBLDB4MTYsMHg1MSwweEM2LDB4MDYsMHgyNCwweDdBLDB4MDEsMHhDNiwweDA2LDB4MjUsMHg3QSwweDAxLDB4QzYsMHgwNiwKKzB4MjYsMHg3QSwweDAzLDB4QzMsMHhDNywweDA2LDB4MEMsMHg3QSwweDFBLDB4NTEsMHhDNywweDA2LDB4MEUsMHg3QSwweDRELDB4NTEsCisweEM3LDB4MDYsMHgxMCwweDdBLDB4NDcsMHg1MSwweEM3LDB4MDYsMHgxMiwweDdBLDB4NEEsMHg1MSwweEM3LDB4MDYsMHgxNCwweDdBLAorMHg0RiwweDUxLDB4QzcsMHgwNiwweDE2LDB4N0EsMHg1MSwweDUxLDB4QzcsMHgwNiwweDE4LDB4N0EsMHg1NSwweDUxLDB4QzcsMHgwNiwKKzB4MUEsMHg3QSwweDU2LDB4NTEsMHhDNywweDA2LDB4MUMsMHg3QSwweDU5LDB4NTEsMHhDNywweDA2LDB4MUUsMHg3QSwweDVBLDB4NTEsCisweEM3LDB4MDYsMHgyMCwweDdBLDB4NUIsMHg1MSwweEM3LDB4MDYsMHgyMiwweDdBLDB4NUUsMHg1MSwweEM2LDB4MDYsMHgyNCwweDdBLAorMHgyMCwweEM2LDB4MDYsMHgyNSwweDdBLDB4MjAsMHhDNiwweDA2LDB4MjYsMHg3QSwweDAyLDB4QzMsMHhBMSwweEY4LDB4NzksMHg0OCwKKzB4NzQsMHgxNCwweEJFLDB4RDcsMHg3OSwweEU4LDB4M0MsMHgwMCwweDhCLDB4RjgsMHhBQywweDNDLDB4M0EsMHg3NSwweDA3LDB4OEUsCisweEM3LDB4RTgsMHgzMCwweDAwLDB4OEIsMHhGOCwweEMzLDB4OTAsMHg4QiwweEM3LDB4MkIsMHgwNiwweEZFLDB4NzksMHg4QSwweEYwLAorMHgyNCwweDBGLDB4OEEsMHhEMCwweDAyLDB4RDAsMHgwMiwweEQwLDB4ODAsMHhDMiwweDBCLDB4QzAsMHhFRSwweDA0LDB4ODAsMHhDNiwKKzB4MDMsMHgwNCwweDNELDB4QzMsMHg4QywweEMwLDB4RTgsMHg5MywweDAwLDB4QjAsMHgzQSwweEU4LDB4RTQsMHgwMCwweDhCLDB4QzcsCisweEU4LDB4ODksMHgwMCwweEMzLDB4NTEsMHgzMywweEM5LDB4OTAsMHhBQywweDNDLDB4MjAsMHg3NCwweEZCLDB4OTAsMHgwQSwweEMwLAorMHg3NCwweDI2LDB4MkMsMHgzMCwweDcyLDB4MjIsMHgzQywweDA5LDB4NzYsMHgxNCwweDNDLDB4MTEsMHg3MiwweDFBLDB4MkMsMHgwNywKKzB4M0MsMHgwRiwweDc2LDB4MEEsMHgzQywweDJBLDB4NzIsMHgxMCwweDJDLDB4MjAsMHgzQywweDBGLDB4NzcsMHgwQSwweDk4LDB4QzEsCisweEUxLDB4MDQsMHgwMywweEM4LDB4QUMsMHhFQiwweEQ3LDB4OTAsMHg0RSwweDhCLDB4QzEsMHg1OSwweEMzLDB4OTAsMHgwNiwweDhDLAorMHhDOCwweDhFLDB4QzAsMHhFOCwweDAyLDB4MDAsMHgwNywweEMzLDB4MjYsMHg4QSwweDA0LDB4NDYsMHgwQSwweEMwLDB4NzQsMHgwNiwKKzB4RTgsMHg4RiwweDAwLDB4RUIsMHhGMywweDkwLDB4QzMsMHg5MCwweDBCLDB4QzAsMHg3NCwweDdBLDB4NTEsMHgzMywweEQyLDB4QjksCisweEU4LDB4MDMsMHhGNywweEYxLDB4OEIsMHhDQSwweEU4LDB4MDMsMHgwMCwweDhCLDB4QzEsMHg1OSwweEJBLDB4NjQsMHgwMCwweEY2LAorMHhGMiwweEU4LDB4MEMsMHgwMCwweDhBLDB4QzQsMHg5OCwweEIyLDB4MEEsMHhGNiwweEYyLDB4RTgsMHgwMiwweDAwLDB4OEEsMHhDNCwKKzB4NTAsMHgwQSwweEYwLDB4NzQsMHgwNSwweDA0LDB4MzAsMHhFOCwweDU4LDB4MDAsMHg1OCwweEMzLDB4ODYsMHhDNCwweEU4LDB4MDcsCisweDAwLDB4ODYsMHhDNCwweEU4LDB4MDIsMHgwMCwweEMzLDB4OTAsMHhDMSwweEM4LDB4MDQsMHhFOCwweDA4LDB4MDAsMHhDMSwweEMwLAorMHgwNCwweEU4LDB4MDIsMHgwMCwweEMzLDB4OTAsMHg1MywweDUwLDB4MjQsMHgwRiwweEJCLDB4Q0EsMHg2MiwweDJFLDB4RDcsMHhFOCwKKzB4MzAsMHgwMCwweDU4LDB4NUIsMHhDMywweDkwLDB4ODYsMHhDNCwweEU4LDB4MDcsMHgwMCwweDg2LDB4QzQsMHhFOCwweDAyLDB4MDAsCisweEMzLDB4OTAsMHg1MCwweEI5LDB4MDgsMHgwMCwweDhBLDB4RTAsMHgzMiwweEMwLDB4RDEsMHhDMCwweDA0LDB4MzAsMHhFOCwweDExLAorMHgwMCwweEUyLDB4RjUsMHg1OCwweEMzLDB4OTAsMHhCMCwweDMwLDB4RTgsMHgwNywweDAwLDB4QzMsMHhCMCwweDIwLDB4RTgsMHgwMSwKKzB4MDAsMHhDMywweDU2LDB4OEIsMHgzNiwweEQwLDB4NzksMHg4OCwweDg0LDB4RDAsMHg3NywweDQ2LDB4ODEsMHhFNiwweEZGLDB4MDEsCisweEZGLDB4MDYsMHhENCwweDc5LDB4ODksMHgzNiwweEQwLDB4NzksMHg4MSwweDNFLDB4RDQsMHg3OSwweEZFLDB4MDEsMHg3NSwweDA4LAorMHg1NiwweEU4LDB4MTQsMHgwMCwweDVFLDB4RUIsMHhGMSwweDkwLDB4NUUsMHhDMywweEJBLDB4MDIsMHgwMiwweEVDLDB4MjQsMHgwMSwKKzB4NzQsMHgwNCwweEJBLDB4MDYsMHgwMiwweEVDLDB4QzMsMHg5MCwweDgwLDB4M0UsMHhGNiwweDc5LDB4MDAsMHg3NCwweDA5LDB4NjAsCisweEI4LDB4MDEsMHgwMCwweEU4LDB4MkMsMHhFQSwweDYxLDB4OTAsMHhCQSwweDAyLDB4MDIsMHhFQywweEE4LDB4MDQsMHg3NCwweDI4LAorMHg4QiwweDM2LDB4RDIsMHg3OSwweDgzLDB4M0UsMHhENCwweDc5LDB4MDAsMHg3NCwweDFELDB4OEEsMHg4NCwweEQwLDB4NzcsMHg0NiwKKzB4ODEsMHhFNiwweEZGLDB4MDEsMHg4OSwweDM2LDB4RDIsMHg3OSwweEZGLDB4MEUsMHhENCwweDc5LDB4QkEsMHgwNiwweDAyLDB4RUUsCisweEJBLDB4MDIsMHgwMiwweEVDLDB4QTgsMHgwNCwweDc1LDB4REMsMHhBMSwweEQ0LDB4NzksMHhDMywweDUyLDB4QkEsMHgwNiwweDAyLAorMHhFRSwweDVBLDB4QzMsMHg5MCwweDUyLDB4NTAsMHhCQSwweDAyLDB4MDIsMHhFQywweEE4LDB4MDQsMHg3NCwweDA4LDB4NTgsMHg1QSwKKzB4RTgsMHhFOSwweEZGLDB4RjksMHhDMywweDkwLDB4NTgsMHg1QSwweEY4LDB4QzMsMHg1MiwweDUwLDB4QkEsMHgwMiwweDAyLDB4RUMsCisweEE4LDB4MDQsMHg3NCwweEZCLDB4NTgsMHg1QSwweEU4LDB4RDMsMHhGRiwweEMzLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAorMHgzNiwweDM3LDB4MzgsMHgzOSwweDQxLDB4NDIsMHg0MywweDQ0LDB4NDUsMHg0NiwweDUzLDB4NTAsMHg4QSwweEUwLDB4ODAsMHhFNCwKKzB4MEYsMHhCQiwweENBLDB4NjIsMHhDMCwweEU4LDB4MDQsMHgyRSwweEQ3LDB4RTgsMHhDRSwweEZGLDB4OEEsMHhDNCwweDJFLDB4RDcsCisweEU4LDB4QzcsMHhGRiwweDU4LDB4NUIsMHhDMywweDg2LDB4RTAsMHhFOCwweERGLDB4RkYsMHg4NiwweEUwLDB4RTgsMHhEQSwweEZGLAorMHhDMywweDkwLDB4QkUsMHhCMiwweDRELDB4NTAsMHgyRSwweEFDLDB4M0MsMHgwMCwweDc0LDB4MDUsMHhFOCwweEFCLDB4RkYsMHhFQiwKKzB4RjUsMHg1OCwweEMzLDB4OTAsMHhDOCwweDA4LDB4MDAsMHgwMCwweDU2LDB4NTcsMHg4QiwweDc2LDB4MDQsMHhCRiwweDA0LDB4MDAsCisweEM3LDB4NDYsMHhGQywweDAwLDB4MDAsMHhDNywweDQ2LDB4RkEsMHgwMCwweDAwLDB4QzcsMHg0NiwweEY4LDB4MDAsMHgwMCwweDgzLAorMHg3RSwweDA2LDB4MDAsMHg3NSwweDBFLDB4NTYsMHhFOCwweEI2LDB4MEUsMHg1OSwweDBCLDB4QzAsMHg3NSwweDA1LDB4OEIsMHhDNywKKzB4RTksMHg1QiwweDAxLDB4OEIsMHg0NiwweEZDLDB4ODksMHg0NiwweEZFLDB4MEIsMHhGRiwweDc1LDB4MDUsMHhCOCwweDAxLDB4MDAsCisweEVCLDB4MDIsMHgzMywweEMwLDB4NTAsMHg1NiwweEU4LDB4QTQsMHgwRCwweDU5LDB4NTksMHhCNCwweDAwLDB4ODksMHg0NiwweEZDLAorMHg4QiwweDVFLDB4RkMsMHg4MywweEZCLDB4MDgsMHg3NiwweDAzLDB4RTksMHgyQiwweDAxLDB4RDEsMHhFMywweDJFLDB4RkYsMHhBNywKKzB4QjIsMHg2NCwweEI4LDB4MDMsMHgwMCwweEU5LDB4MjYsMHgwMSwweDgzLDB4N0UsMHhGQSwweDAwLDB4NzQsMHgxNCwweEM3LDB4NDYsCisweEZBLDB4MDAsMHgwMCwweDhBLDB4NDQsMHg1OCwweDk4LDB4NTAsMHg4QSwweDQ0LDB4NTksMHg5OCwweDUwLDB4RTgsMHhDMiwweDBGLAorMHg1OSwweDU5LDB4ODMsMHg3RSwweEY4LDB4MDAsMHg3NCwweDBBLDB4QzcsMHg0NiwweEY4LDB4MDAsMHgwMCwweDU2LDB4RTgsMHg5QiwKKzB4MDgsMHg1OSwweDgzLDB4N0UsMHgwNiwweDAwLDB4NzUsMHgwNSwweDhCLDB4QzcsMHhFOSwweEYxLDB4MDAsMHg4MywweEZGLDB4MDQsCisweDc1LDB4MDMsMHhFOSwweEU2LDB4MDAsMHg4QiwweEM3LDB4RTksMHhFNCwweDAwLDB4ODMsMHg3RSwweEZFLDB4MDAsMHg3NSwweDAzLAorMHhCRiwweDAyLDB4MDAsMHhFOSwweEQ1LDB4MDAsMHg4MywweDdFLDB4RkUsMHgwMCwweDc1LDB4MDMsMHhCRiwweDAxLDB4MDAsMHhFOSwKKzB4QzksMHgwMCwweDhCLDB4NUUsMHhGRSwweDgzLDB4RkIsMHgwNywweDc2LDB4MDMsMHhFOSwweDg2LDB4MDAsMHhEMSwweEUzLDB4MkUsCisweEZGLDB4QTcsMHhBMiwweDY0LDB4MzMsMHhGRiwweEU5LDB4N0YsMHgwMCwweEJGLDB4MDQsMHgwMCwweDgwLDB4N0MsMHg1OCwweDBGLAorMHg3NCwweDIyLDB4ODMsMHg3RSwweEY4LDB4MDAsMHg3NSwweDFDLDB4RkUsMHg0NCwweDU4LDB4NkEsMHgwOCwweDU2LDB4RTgsMHg3RSwKKzB4MEMsMHg1OSwweDU5LDB4OEEsMHg0NCwweDU4LDB4MDQsMHg4MCwweDUwLDB4NTYsMHhFOCwweDcyLDB4MEMsMHg1OSwweDU5LDB4QzcsCisweDQ2LDB4RkEsMHgwMSwweDAwLDB4ODMsMHg3RSwweEY4LDB4MDAsMHg3NCwweDBBLDB4QzcsMHg0NiwweEY4LDB4MDAsMHgwMCwweDU2LAorMHhFOCwweDE5LDB4MDgsMHg1OSwweEVCLDB4NDIsMHhCRiwweDA0LDB4MDAsMHg4MCwweDdDLDB4NTgsMHgwMCwweDc0LDB4MjIsMHg4MywKKzB4N0UsMHhGOCwweDAwLDB4NzUsMHgxQywweEZFLDB4NEMsMHg1OCwweDZBLDB4MDgsMHg1NiwweEU4LDB4NDEsMHgwQywweDU5LDB4NTksCisweDhBLDB4NDQsMHg1OCwweDA0LDB4ODAsMHg1MCwweDU2LDB4RTgsMHgzNSwweDBDLDB4NTksMHg1OSwweEM3LDB4NDYsMHhGQSwweDAxLAorMHgwMCwweDgzLDB4N0UsMHhGOCwweDAwLDB4NzQsMHgwQSwweEM3LDB4NDYsMHhGOCwweDAwLDB4MDAsMHg1NiwweEU4LDB4REMsMHgwNywKKzB4NTksMHhFQiwweDA1LDB4QkYsMHgwNCwweDAwLDB4RUIsMHgwMCwweEVCLDB4MzEsMHhCRiwweDA0LDB4MDAsMHhFQiwweDJDLDB4QzcsCisweDQ2LDB4RjgsMHgwMSwweDAwLDB4NkEsMHgwOCwweDU2LDB4RTgsMHgwNSwweDBDLDB4NTksMHg1OSwweDgwLDB4N0MsMHg1OCwweDA5LAorMHg3RCwweDA0LDB4QjAsMHgwRiwweEVCLDB4MDIsMHhCMCwweDAwLDB4MDQsMHg4MCwweDUwLDB4NTYsMHhFOCwweEYwLDB4MEIsMHg1OSwKKzB4NTksMHhCRiwweDA0LDB4MDAsMHhFQiwweDA1LDB4QkYsMHgwNCwweDAwLDB4RUIsMHgwMCwweEU5LDB4QTUsMHhGRSwweDVGLDB4NUUsCisweEM5LDB4QzMsMHhFNCwweDYzLDB4NjMsMHg2NCwweDYzLDB4NjQsMHg2MywweDY0LDB4NjMsMHg2NCwweEU5LDB4NjMsMHgyNiwweDY0LAorMHg1MSwweDY0LDB4NzgsMHg2MywweEJBLDB4NjMsMHhDNiwweDYzLDB4OTYsMHg2NCwweEQyLDB4NjMsMHg2QSwweDY0LDB4NkEsMHg2NCwKKzB4NkYsMHg2NCwweDcyLDB4NjMsMHhDOCwweDA4LDB4MDAsMHgwMCwweDU2LDB4NTcsMHg4QiwweDc2LDB4MDQsMHg4QiwweDdFLDB4MDgsCisweDZBLDB4MDEsMHg1NiwweEU4LDB4QTksMHgwQiwweDU5LDB4NTksMHg4QSwweDQ2LDB4MDYsMHhDMCwweEUwLDB4MDYsMHgwNCwweDgwLAorMHg1MCwweDU2LDB4RTgsMHg5QSwweDBCLDB4NTksMHg1OSwweEM3LDB4NDYsMHhGRSwweDAwLDB4MDAsMHg4OSwweDdFLDB4RjgsMHhFQiwKKzB4MDMsMHhGRiwweDQ2LDB4RkUsMHg4QiwweDVFLDB4RjgsMHhGRiwweDQ2LDB4RjgsMHg4MCwweDNGLDB4MDAsMHg3NSwweEYyLDB4ODMsCisweDdFLDB4RkUsMHgxMCwweDdELDB4MjUsMHhCOCwweDEwLDB4MDAsMHgyQiwweDQ2LDB4RkUsMHhEMSwweEY4LDB4ODksMHg0NiwweEZDLAorMHhDNywweDQ2LDB4RkEsMHgwMCwweDAwLDB4RUIsMHgwQiwweDZBLDB4MjAsMHg1NiwweEU4LDB4NjIsMHgwQiwweDU5LDB4NTksMHhGRiwKKzB4NDYsMHhGQSwweDhCLDB4NDYsMHhGQSwweDNCLDB4NDYsMHhGQywweDdDLDB4RUQsMHhFQiwweDBDLDB4OEIsMHhERiwweDQ3LDB4OEEsCisweDA3LDB4NTAsMHg1NiwweEU4LDB4NDksMHgwQiwweDU5LDB4NTksMHg4MCwweDNELDB4MDAsMHg3NSwweEVGLDB4NkEsMHgwMiwweDU2LAorMHhFOCwweDNDLDB4MEIsMHg1OSwweDU5LDB4RUIsMHgwMCwweDVGLDB4NUUsMHhDOSwweEMzLDB4QzgsMHgwNCwweDAwLDB4MDAsMHg1NiwKKzB4NTcsMHg4QiwweDdFLDB4MDQsMHhDNywweDQ2LDB4RkUsMHgwMCwweDAwLDB4QkUsMHgxNCwweDAwLDB4RTksMHgwOSwweDAxLDB4OEIsCisweDVFLDB4RkUsMHg4MywweEMzLDB4MDQsMHgyQiwweERGLDB4OEEsMHg4NywweEFDLDB4MEIsMHg4OCwweDQ0LDB4NUEsMHhDNiwweDQ0LAorMHg1OCwweDA4LDB4OEEsMHg0NiwweEZFLDB4ODgsMHg0NCwweDU5LDB4QzcsMHg0NCwweDA2LDB4MDAsMHgwMCwweEM2LDB4NDQsMHgxOSwKKzB4MDAsMHhDNiwweDQ0LDB4MUEsMHgwMCwweEM2LDB4NDQsMHgxQiwweDAwLDB4QzYsMHg0NCwweDFELDB4MEQsMHhDNiwweDQ0LDB4MUUsCisweDAzLDB4QzYsMHg0NCwweDFGLDB4MDAsMHhDNiwweDQ0LDB4MjAsMHgwMCwweEM2LDB4NDQsMHgyMSwweDAwLDB4QzYsMHg0NCwweDVCLAorMHgwMCwweEM2LDB4NDQsMHg1RCwweDAwLDB4QzYsMHg0NCwweDVFLDB4MDAsMHhDNiwweDQ0LDB4NUYsMHgwMCwweEM2LDB4NDQsMHg2MCwKKzB4MDAsMHhDNywweDQ2LDB4RkMsMHgwMCwweDAwLDB4RUIsMHgwRCwweDhCLDB4NUUsMHhGQywweEQxLDB4RTMsMHhDNywweDQwLDB4MzAsCisweDAwLDB4MDAsMHhGRiwweDQ2LDB4RkMsMHg4MywweDdFLDB4RkMsMHgxMCwweDdDLDB4RUQsMHhDNywweDQ2LDB4RkMsMHgwMCwweDAwLAorMHhFQiwweDBBLDB4OEIsMHg1RSwweEZDLDB4QzYsMHg0MCwweDUwLDB4MDAsMHhGRiwweDQ2LDB4RkMsMHg4MywweDdFLDB4RkMsMHgwNCwKKzB4N0MsMHhGMCwweEM3LDB4NDQsMHg1NCwweDAwLDB4MDAsMHhDNywweDQ0LDB4NTYsMHgwMCwweDAwLDB4OEEsMHg0NCwweDVBLDB4OTgsCisweEJBLDB4RjgsMHgwMCwweDIzLDB4RDAsMHhCOCwweDA1LDB4MDAsMHgwQiwweEMyLDB4ODksMHg0NiwweEZDLDB4OUMsMHhGQSwweDhBLAorMHg0NiwweEZDLDB4QkEsMHhGRSwweDAwLDB4RUUsMHhCQSwweDAwLDB4MDAsMHhFQywweDlELDB4MjQsMHgwOCwweDg4LDB4NDYsMHhGQywKKzB4ODMsMHg3RSwweEZDLDB4MDAsMHg3NSwweDAyLDB4RUIsMHg0QSwweEZGLDB4NzYsMHhGRSwweEU4LDB4N0EsMHgwQywweDU5LDB4NjgsCisweDM1LDB4MDIsMHg1NiwweEU4LDB4MzIsMHgwQSwweDU5LDB4NTksMHgwQiwweEMwLDB4NzUsMHgzNCwweDY4LDB4MzgsMHgwMiwweDU2LAorMHhFOCwweDI1LDB4MEEsMHg1OSwweDU5LDB4MEIsMHhDMCwweDc1LDB4MjcsMHg2OCwweDQyLDB4MDIsMHg1NiwweEU4LDB4MTgsMHgwQSwKKzB4NTksMHg1OSwweDBCLDB4QzAsMHg3NSwweDFBLDB4NjgsMHg0QywweDAyLDB4NTYsMHhFOCwweDBCLDB4MEEsMHg1OSwweDU5LDB4MEIsCisweEMwLDB4NzUsMHgwRCwweDY4LDB4NTYsMHgwMiwweDU2LDB4RTgsMHhGRSwweDA5LDB4NTksMHg1OSwweDBCLDB4QzAsMHg3NCwweDAyLAorMHhFQiwweDAwLDB4RkYsMHg0NiwweEZFLDB4ODMsMHhDNiwweDYyLDB4MzksMHg3RSwweEZFLDB4N0QsMHgwMywweEU5LDB4RUYsMHhGRSwKKzB4RUIsMHgwMCwweDVGLDB4NUUsMHhDOSwweEMzLDB4QzgsMHgwOCwweDAwLDB4MDAsMHg1NiwweDU3LDB4OEIsMHg0NiwweDA0LDB4QkEsCisweDYyLDB4MDAsMHhGNywweEVBLDB4MDUsMHgxNCwweDAwLDB4OEIsMHhGMCwweDgzLDB4N0UsMHgwNiwweDAwLDB4NzQsMHgwNSwweEI4LAorMHgxMCwweDAwLDB4RUIsMHgwMywweEI4LDB4MDgsMHgwMCwweDg5LDB4NDQsMHgwNCwweDhBLDB4NDYsMHgwOCwweDg4LDB4NDQsMHg1QywKKzB4NTYsMHhFOCwweDU5LDB4MDQsMHg1OSwweDhCLDB4RjgsMHg4QiwweEM3LDB4ODksMHg0NCwweDU2LDB4ODksMHg0NCwweDU0LDB4OEEsCisweDQ0LDB4NUQsMHg4OCwweDQ0LDB4MkYsMHgwQiwweEZGLDB4NzUsMHgxRCwweDY4LDB4QzIsMHgwRiwweDZBLDB4MDEsMHg1NiwweEU4LAorMHgwMiwweEZFLDB4ODMsMHhDNCwweDA2LDB4RUIsMHgwMCwweDZBLDB4MDEsMHg1NiwweEU4LDB4NDcsMHhGQywweDU5LDB4NTksMHgwQiwKKzB4QzAsMHg3NSwweEY0LDB4QkYsMHgwMSwweDAwLDB4ODksMHg3RSwweEZBLDB4QjksMHgwNSwweDAwLDB4QkIsMHhFOSwweDZBLDB4MkUsCisweDhCLDB4MDcsMHgzQiwweDQ2LDB4RkEsMHg3NCwweDA3LDB4NDMsMHg0MywweEUyLDB4RjQsMHhFOSwweEE0LDB4MDMsMHgyRSwweEZGLAorMHg2NywweDBBLDB4QzcsMHg0NCwweDA2LDB4MDIsMHgwMCwweEM3LDB4NDQsMHgwOCwweEY0LDB4MDgsMHg4QiwweDVFLDB4MDQsMHhEMSwKKzB4RTMsMHg4QiwweDg3LDB4RkMsMHgwOCwweDg5LDB4NDQsMHgwQSwweDMzLDB4QzAsMHg4QiwweEY4LDB4ODksMHg0NCwweDU0LDB4RTksCisweDgwLDB4MDMsMHg1NiwweEU4LDB4QkIsMHgwNSwweDU5LDB4QkYsMHgwMSwweDAwLDB4OEEsMHg0NCwweDVELDB4ODgsMHg0NCwweDYwLAorMHhFOSwweDZGLDB4MDMsMHg4MywweDdDLDB4MDQsMHgwOCwweDc1LDB4MzAsMHg4MCwweDdDLDB4NUMsMHgwMSwweDc1LDB4MTUsMHg4QSwKKzB4NDQsMHg1RCwweEI0LDB4MDAsMHhEMSwweEUwLDB4OEIsMHhEOCwweEZGLDB4QjcsMHhFNCwweDA4LDB4NTYsMHhFOCwweEY3LDB4MDgsCisweDU5LDB4NTksMHhFQiwweDEzLDB4OEEsMHg0NCwweDVELDB4QjQsMHgwMCwweEQxLDB4RTAsMHg4QiwweEQ4LDB4RkYsMHhCNywweEM0LAorMHgwOCwweDU2LDB4RTgsMHhFMiwweDA4LDB4NTksMHg1OSwweEVCLDB4MkUsMHg4MCwweDdDLDB4NUMsMHgwMSwweDc1LDB4MTUsMHg4QSwKKzB4NDQsMHg1RCwweEI0LDB4MDAsMHhEMSwweEUwLDB4OEIsMHhEOCwweEZGLDB4QjcsMHhENCwweDA4LDB4NTYsMHhFOCwweEM3LDB4MDgsCisweDU5LDB4NTksMHhFQiwweDEzLDB4OEEsMHg0NCwweDVELDB4QjQsMHgwMCwweEQxLDB4RTAsMHg4QiwweEQ4LDB4RkYsMHhCNywweEI0LAorMHgwOCwweDU2LDB4RTgsMHhCMiwweDA4LDB4NTksMHg1OSwweDZBLDB4MDEsMHg1NiwweEU4LDB4ODcsMHhGQiwweDU5LDB4NTksMHg4QiwKKzB4RDgsMHg4MywweEZCLDB4MDMsMHg3NywweDJBLDB4RDEsMHhFMywweDJFLDB4RkYsMHhBNywweEUxLDB4NkEsMHhCRiwweDAxLDB4MDAsCisweDhBLDB4NDQsMHg1RCwweDg4LDB4NDQsMHg1RSwweEVCLDB4MTgsMHg4QSwweDQ0LDB4NUQsMHgwNCwweEZGLDB4MjQsMHgwNywweDg4LAorMHg0NCwweDVELDB4RUIsMHgwQywweDhBLDB4NDQsMHg1RCwweEZFLDB4QzAsMHgyNCwweDA3LDB4ODgsMHg0NCwweDVELDB4RUIsMHgwMCwKKzB4RTksMHhDRiwweDAyLDB4OEEsMHg0NCwweDVELDB4QjQsMHgwMCwweEQxLDB4RTAsMHg4QiwweEQ4LDB4RkYsMHhCNywweEZELDB4MDIsCisweDU2LDB4RTgsMHg2MywweDA4LDB4NTksMHg1OSwweDY4LDB4MUQsMHgwMywweDU2LDB4RTgsMHg1QSwweDA4LDB4NTksMHg1OSwweDZBLAorMHgwMSwweDU2LDB4RTgsMHgyRiwweEZCLDB4NTksMHg1OSwweDhCLDB4RDgsMHg4MywweEZCLDB4MDMsMHg3NywweDM2LDB4RDEsMHhFMywKKzB4MkUsMHhGRiwweEE3LDB4RDksMHg2QSwweEJGLDB4MDEsMHgwMCwweDhBLDB4NDQsMHg1RCwweDg4LDB4NDQsMHg1RiwweEVCLDB4MjQsCisweDhBLDB4NDQsMHg1RCwweDA0LDB4RkYsMHg4QSwweDU0LDB4MDQsMHg4MCwweEMyLDB4RkYsMHgyMiwweEMyLDB4ODgsMHg0NCwweDVELAorMHhFQiwweDEyLDB4OEEsMHg0NCwweDVELDB4RkUsMHhDMCwweDhBLDB4NTQsMHgwNCwweDgwLDB4QzIsMHhGRiwweDIyLDB4QzIsMHg4OCwKKzB4NDQsMHg1RCwweEVCLDB4MDAsMHhFOSwweDZCLDB4MDIsMHg4QiwweDVDLDB4MDYsMHg4MywweEMzLDB4RkUsMHhEMSwweEUzLDB4OEIsCisweDQwLDB4MDgsMHg4OSwweDA0LDB4OEIsMHgxQywweEZGLDB4NzcsMHgwNiwweDZBLDB4MDAsMHg1NiwweEU4LDB4ODUsMHhGQywweDgzLAorMHhDNCwweDA2LDB4OEIsMHg1QywweDA2LDB4NEIsMHhEMSwweEUzLDB4OEIsMHg0MCwweDA4LDB4ODksMHg0NCwweDAyLDB4OEIsMHg1QywKKzB4MDIsMHhGRiwweDc3LDB4MDYsMHg2QSwweDAxLDB4NTYsMHhFOCwweDZBLDB4RkMsMHg4MywweEM0LDB4MDYsMHg2QSwweDAxLDB4NTYsCisweEU4LDB4QjEsMHhGQSwweDU5LDB4NTksMHg4QiwweEQ4LDB4ODMsMHhGQiwweDAzLDB4NzYsMHgwMywweEU5LDB4MUYsMHgwMiwweEQxLAorMHhFMywweDJFLDB4RkYsMHhBNywweEQxLDB4NkEsMHg4QiwweDVDLDB4MDIsMHg4QiwweDQ3LDB4MDQsMHg4OSwweDQ0LDB4MDIsMHg4QiwKKzB4NUMsMHgwMiwweDgwLDB4M0YsMHg0NCwweDc1LDB4MEQsMHg4QiwweDVDLDB4MDIsMHg4QSwweDQ3LDB4MDEsMHhCNCwweDAwLDB4M0IsCisweDQ0LDB4MDQsMHg3RCwweEUyLDB4OEIsMHg0NiwweDA0LDB4RDEsMHhFMCwweDhCLDB4MUMsMHgwMywweEQ4LDB4OEIsMHg0NCwweDAyLAorMHg4OSwweDQ3LDB4MDgsMHg4QiwweDVDLDB4MDYsMHg0QiwweEQxLDB4RTMsMHg4QiwweDQ0LDB4MDIsMHg4OSwweDQwLDB4MDgsMHhFOSwKKzB4REUsMHgwMSwweDhCLDB4NUMsMHgwMiwweDhCLDB4NDcsMHgwMiwweDg5LDB4NDQsMHgwMiwweDhCLDB4NUMsMHgwMiwweDgwLDB4M0YsCisweDQ0LDB4NzUsMHgwRCwweDhCLDB4NUMsMHgwMiwweDhBLDB4NDcsMHgwMSwweEI0LDB4MDAsMHgzQiwweDQ0LDB4MDQsMHg3RCwweEUyLAorMHg4QiwweDQ2LDB4MDQsMHhEMSwweEUwLDB4OEIsMHgxQywweDAzLDB4RDgsMHg4QiwweDQ0LDB4MDIsMHg4OSwweDQ3LDB4MDgsMHg4QiwKKzB4NUMsMHgwNiwweDRCLDB4RDEsMHhFMywweDhCLDB4NDQsMHgwMiwweDg5LDB4NDAsMHgwOCwweEU5LDB4QTIsMHgwMSwweEJGLDB4MDEsCisweDAwLDB4RTksMHg5QywweDAxLDB4OEIsMHg1QywweDAyLDB4OEEsMHgwNywweEI0LDB4MDAsMHg4OSwweDQ2LDB4RjgsMHhCOSwweDBDLAorMHgwMCwweEJCLDB4QTEsMHg2QSwweDJFLDB4OEIsMHgwNywweDNCLDB4NDYsMHhGOCwweDc0LDB4MDcsMHg0MywweDQzLDB4RTIsMHhGNCwKKzB4RTksMHg3NywweDAxLDB4MkUsMHhGRiwweDY3LDB4MTgsMHg4QiwweDQ2LDB4MDQsMHhEMSwweEUwLDB4OEIsMHg1QywweDAyLDB4MDMsCisweEQ4LDB4OEIsMHg0NywweDA4LDB4OEIsMHg1QywweDA2LDB4RkYsMHg0NCwweDA2LDB4RDEsMHhFMywweDg5LDB4NDAsMHgwOCwweDhCLAorMHgxQywweDgwLDB4N0YsMHgwMSwweDAwLDB4NzQsMHgxMiwweDhCLDB4NUMsMHgwMiwweDhBLDB4NDcsMHgwMSwweDhCLDB4MUMsMHg4QSwKKzB4NTcsMHgwMSwweEI2LDB4MDAsMHg4QiwweERBLDB4ODgsMHg0MCwweDE4LDB4RTksMHg0MCwweDAxLDB4RkYsMHg0QywweDA2LDB4RTksCisweDNBLDB4MDEsMHg4QiwweDVDLDB4MDIsMHg4QSwweDQ3LDB4MDEsMHg4QiwweDFDLDB4OEEsMHg1NywweDAxLDB4QjYsMHgwMCwweDhCLAorMHhEQSwweDg4LDB4NDAsMHgxOCwweEU5LDB4MjUsMHgwMSwweDhCLDB4NUMsMHgwMiwweDhBLDB4NDcsMHgwMSwweDhCLDB4MUMsMHg4QSwKKzB4NTcsMHgwMSwweEI2LDB4MDAsMHg4QiwweERBLDB4ODgsMHg0MCwweDE4LDB4RkYsMHg0QywweDA2LDB4RTksMHgwRCwweDAxLDB4OEIsCisweDVDLDB4MDIsMHg4QSwweDQ3LDB4MDEsMHg4QiwweDFDLDB4OEEsMHg1NywweDAxLDB4QjYsMHgwMCwweDhCLDB4REEsMHgzMCwweDQwLAorMHgxOCwweEU5LDB4RjgsMHgwMCwweEI4LDB4RjAsMHgxMCwweDhCLDB4RjgsMHg4OSwweDQ0LDB4NTQsMHg4QSwweDQ0LDB4NUYsMHg4OCwKKzB4NDQsMHg1RCwweEU5LDB4RTcsMHgwMCwweDhBLDB4NDQsMHgxQywweDk4LDB4M0QsMHgwMiwweDAwLDB4NzQsMHgwNywweDNELDB4MDMsCisweDAwLDB4NzQsMHgwMiwweEVCLDB4MDcsMHhDNywweDQ2LDB4RkUsMHgwMCwweDAwLDB4RUIsMHgyQiwweDhBLDB4NDQsMHgxQywweDk4LAorMHhEMSwweEUwLDB4OEIsMHhEOCwweEZGLDB4QjcsMHg2OSwweDAyLDB4NTYsMHhFOCwweDZCLDB4MDYsMHg1OSwweDU5LDB4NkEsMHgwMSwKKzB4NTYsMHhFOCwweDQwLDB4RjksMHg1OSwweDU5LDB4ODksMHg0NiwweEZFLDB4ODMsMHg3RSwweEZFLDB4MDAsMHg3NCwweDA2LDB4ODMsCisweDdFLDB4RkUsMHgwMywweDc1LDB4RTksMHhFQiwweDAwLDB4ODMsMHg3RSwweEZFLDB4MDMsMHg3NCwweDYyLDB4OEEsMHg0NCwweDFDLAorMHg5OCwweEQxLDB4RTAsMHg4QiwweEQ4LDB4RkYsMHhCNywweDZELDB4MDIsMHg1NiwweEU4LDB4M0EsMHgwNiwweDU5LDB4NTksMHg1NiwKKzB4RTgsMHg0RCwweDk3LDB4NTksMHg4OSwweDQ2LDB4RkMsMHg4QiwweDVFLDB4RkMsMHg4MywweEVCLDB4RkUsMHg4MywweEZCLDB4MDMsCisweDc3LDB4MzMsMHhEMSwweEUzLDB4MkUsMHhGRiwweEE3LDB4OTksMHg2QSwweDY4LDB4QUMsMHgwMiwweDU2LDB4RTgsMHgxNywweDA2LAorMHg1OSwweDU5LDB4RUIsMHgyMywweDY4LDB4OEYsMHgwMiwweDU2LDB4RTgsMHgwQywweDA2LDB4NTksMHg1OSwweEVCLDB4MTgsMHg2OCwKKzB4NzUsMHgwMiwweDU2LDB4RTgsMHgwMSwweDA2LDB4NTksMHg1OSwweEVCLDB4MEQsMHg2OCwweEM2LDB4MDIsMHg1NiwweEU4LDB4RjYsCisweDA1LDB4NTksMHg1OSwweEVCLDB4MDIsMHhFQiwweDAwLDB4NkEsMHgwMSwweDU2LDB4RTgsMHhDNywweEY4LDB4NTksMHg1OSwweEJGLAorMHgwMSwweDAwLDB4RUIsMHgzOCwweDY4LDB4REQsMHgwMiwweDU2LDB4RTgsMHhEQywweDA1LDB4NTksMHg1OSwweDZBLDB4MDEsMHg1NiwKKzB4RTgsMHhCMSwweEY4LDB4NTksMHg1OSwweEJGLDB4MDEsMHgwMCwweEVCLDB4MjIsMHhCOCwweEQwLDB4MzAsMHg4QiwweEY4LDB4ODksCisweDQ0LDB4NTQsMHg4QSwweDQ0LDB4NjAsMHg4OCwweDQ0LDB4NUQsMHhFQiwweDEyLDB4QjgsMHhFMCwweDIwLDB4OEIsMHhGOCwweDg5LAorMHg0NCwweDU0LDB4OEEsMHg0NCwweDVFLDB4ODgsMHg0NCwweDVELDB4RUIsMHgwMiwweEVCLDB4MDAsMHhFQiwweDAyLDB4RUIsMHgwMCwKKzB4RUIsMHgwMCwweEU5LDB4NDEsMHhGQywweDVGLDB4NUUsMHhDOSwweEMzLDB4MTksMHg2QSwweDI0LDB4NkEsMHgyRiwweDZBLDB4M0EsCisweDZBLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDQxLDB4MDAsMHg0MiwweDAwLDB4NDMsMHgwMCwweDQ0LAorMHgwMCwweDgwLDB4MDAsMHg4MSwweDAwLDB4ODIsMHgwMCwweEZGLDB4MDAsMHgxNywweDY5LDB4NTQsMHg2QSwweDdBLDB4NkEsMHhBNSwKKzB4NjksMHg1MiwweDY5LDB4OTQsMHg2OSwweDZBLDB4NkEsMHg2NywweDY5LDB4NTIsMHg2OSwweDdGLDB4NjksMHg2NywweDY5LDB4NEMsCisweDY5LDB4RjQsMHg2OCwweDc2LDB4NjgsMHhCMiwweDY4LDB4RUUsMHg2OCwweEY1LDB4NjcsMHgwMCwweDY4LDB4MTIsMHg2OCwweEY1LAorMHg2NywweDlELDB4NjcsMHhBOCwweDY3LDB4QjQsMHg2NywweDlELDB4NjcsMHgwMCwweDAwLDB4MDEsMHgwMCwweEYwLDB4MTAsMHhFMCwKKzB4MjAsMHhEMCwweDMwLDB4MjcsMHg2OCwweEYyLDB4NjYsMHhDMywweDY3LDB4MjMsMHg2NywweDEyLDB4NjcsMHhDOCwweDA0LDB4MDAsCisweDAwLDB4NTYsMHg1NywweDhCLDB4NzYsMHgwNCwweDhBLDB4NDQsMHg1OSwweDk4LDB4ODksMHg0NiwweEZDLDB4NkEsMHgwOSwweDhCLAorMHg0NiwweEZDLDB4MDUsMHg4NCwweDAxLDB4NTAsMHhFOCwweDkzLDB4MDgsMHg1OSwweDU5LDB4OEIsMHhGOCwweDhCLDB4QzcsMHgyNSwKKzB4MDAsMHhGMCwweDNELDB4MDAsMHgxMCwweDc1LDB4NTUsMHg4QiwweEM3LDB4MjUsMHhGMCwweDAwLDB4M0QsMHhGMCwweDAwLDB4NzUsCisweDRCLDB4OEIsMHhDNywweDI1LDB4MDAsMHgwRiwweEMxLDB4RjgsMHgwOCwweDg5LDB4NDYsMHhGRSwweDhCLDB4NDQsMHgwNCwweDNCLAorMHg0NiwweEZFLDB4N0QsMHgwNSwweDMzLDB4QzAsMHhFOSwweEVGLDB4MDAsMHg4QiwweEM3LDB4MjUsMHgwRiwweDAwLDB4QkEsMHgwRiwKKzB4MDAsMHgyQiwweEQwLDB4M0IsMHg1NiwweEZFLDB4NzQsMHgwNSwweDMzLDB4QzAsMHhFOSwweERCLDB4MDAsMHhDNywweDQ0LDB4MDIsCisweDA0LDB4MDksMHg4QSwweDQ2LDB4RkUsMHg4OCwweDQ0LDB4NUYsMHg4OCwweDQ0LDB4NUQsMHg4QiwweDVFLDB4RkMsMHhEMSwweEUzLAorMHhDNywweDg3LDB4RkMsMHgwOCwweDA0LDB4MDksMHhCOCwweEYwLDB4MTAsMHhFOSwweEJDLDB4MDAsMHg4QiwweEM3LDB4MjUsMHgwMCwKKzB4RjAsMHgzRCwweDAwLDB4MjAsMHg3NSwweDUyLDB4OEIsMHhDNywweDI1LDB4RjAsMHgwMCwweDNELDB4RTAsMHgwMCwweDc1LDB4NDgsCisweDhCLDB4QzcsMHgyNSwweDAwLDB4MEYsMHhDMSwweEY4LDB4MDgsMHg4OSwweDQ2LDB4RkUsMHg4MywweDdFLDB4RkUsMHgwOCwweDdFLAorMHgwNSwweDMzLDB4QzAsMHhFOSwweDkyLDB4MDAsMHg4QiwweEM3LDB4MjUsMHgwRiwweDAwLDB4QkEsMHgwRiwweDAwLDB4MkIsMHhEMCwKKzB4M0IsMHg1NiwweEZFLDB4NzQsMHgwNSwweDMzLDB4QzAsMHhFQiwweDdGLDB4OTAsMHhDNywweDQ0LDB4MDIsMHgwQywweDA5LDB4OEEsCisweDQ2LDB4RkUsMHg4OCwweDQ0LDB4NUUsMHg4OCwweDQ0LDB4NUQsMHg4QiwweDVFLDB4RkMsMHhEMSwweEUzLDB4QzcsMHg4NywweEZDLAorMHgwOCwweDBDLDB4MDksMHhCOCwweEUwLDB4MjAsMHhFQiwweDYwLDB4OEIsMHhDNywweDI1LDB4MDAsMHhGMCwweDNELDB4MDAsMHgzMCwKKzB4NzUsMHg1MiwweDhCLDB4QzcsMHgyNSwweEYwLDB4MDAsMHgzRCwweEQwLDB4MDAsMHg3NSwweDQ4LDB4OEIsMHhDNywweDI1LDB4MDAsCisweDBGLDB4QzEsMHhGOCwweDA4LDB4ODksMHg0NiwweEZFLDB4OEIsMHg0NCwweDA0LDB4M0IsMHg0NiwweEZFLDB4N0QsMHgwNCwweDMzLAorMHhDMCwweEVCLDB4MzUsMHg4QiwweEM3LDB4MjUsMHgwRiwweDAwLDB4QkEsMHgwRiwweDAwLDB4MkIsMHhEMCwweDNCLDB4NTYsMHhGRSwKKzB4NzQsMHgwNCwweDMzLDB4QzAsMHhFQiwweDIyLDB4QzcsMHg0NCwweDAyLDB4MTQsMHgwOSwweDhBLDB4NDYsMHhGRSwweDg4LDB4NDQsCisweDYwLDB4ODgsMHg0NCwweDVELDB4OEIsMHg1RSwweEZDLDB4RDEsMHhFMywweEM3LDB4ODcsMHhGQywweDA4LDB4MTQsMHgwOSwweEI4LAorMHhEMCwweDMwLDB4RUIsMHgwNCwweDMzLDB4QzAsMHhFQiwweDAwLDB4NUYsMHg1RSwweEM5LDB4QzMsMHhDOCwweDA2LDB4MDAsMHgwMCwKKzB4NTYsMHg4QiwweDc2LDB4MDQsMHg2QSwweDA4LDB4NTYsMHhFOCwweDM1LDB4MDQsMHg1OSwweDU5LDB4OEEsMHg0NCwweDU4LDB4MDQsCisweDgwLDB4NTAsMHg1NiwweEU4LDB4MjksMHgwNCwweDU5LDB4NTksMHg4QiwweDQ0LDB4NTQsMHgzQiwweDQ0LDB4NTYsMHg3NSwweDBBLAorMHg4QSwweDQ0LDB4NUQsMHgzQSwweDQ0LDB4MkYsMHg3NSwweDAyLDB4RUIsMHg2NCwweDhCLDB4NDQsMHg1NCwweDg5LDB4NDQsMHg1NiwKKzB4OEIsMHg1QywweDAyLDB4OEEsMHg0NywweDAxLDB4ODgsMHg0NCwweDJGLDB4OEEsMHg0NCwweDVELDB4QjQsMHgwMCwweEMxLDB4RTAsCisweDA4LDB4OEIsMHg1NCwweDU0LDB4MEIsMHhEMCwweDhBLDB4NDQsMHg1RCwweEI0LDB4MDAsMHhCQiwweDBGLDB4MDAsMHgyQiwweEQ4LAorMHgwQiwweEQzLDB4ODksMHg1NiwweEZFLDB4NkEsMHgxMCwweDhBLDB4NDQsMHg1OSwweDk4LDB4MDUsMHgwNCwweDAwLDB4OTksMHgwNSwKKzB4NDAsMHgwMSwweDgzLDB4RDIsMHgwMCwweDUyLDB4NTAsMHhFOCwweDU0LDB4MDgsMHg4MywweEM0LDB4MDYsMHg4OSwweDU2LDB4RkMsCisweDg5LDB4NDYsMHhGQSwweDhCLDB4NDYsMHhGRSwweDA5LDB4NDYsMHhGQSwweDgzLDB4NEUsMHhGQywweDAwLDB4NkEsMHgxOSwweEZGLAorMHg3NiwweEZDLDB4RkYsMHg3NiwweEZBLDB4RTgsMHg3MywweDA3LDB4ODMsMHhDNCwweDA2LDB4RTgsMHhGRSwweDA3LDB4NUUsMHhDOSwKKzB4QzMsMHhDOCwweDFDLDB4MDAsMHgwMCwweDU2LDB4NTcsMHg4QiwweDVFLDB4MDQsMHg4QSwweDQ3LDB4NTksMHg5OCwweDhCLDB4RjAsCisweDhCLDB4NUUsMHgwNCwweDhBLDB4NDcsMHg1RCwweEI0LDB4MDAsMHg4OSwweDQ2LDB4RTYsMHg4MywweDdFLDB4RTYsMHgwMCwweDdELAorMHgwQSwweDhCLDB4NUUsMHgwNCwweDhCLDB4NDcsMHgwNCwweDQ4LDB4ODksMHg0NiwweEU2LDB4OEIsMHg1RSwweDA0LDB4OEIsMHg0NywKKzB4MDQsMHgzQiwweDQ2LDB4RTYsMHg3RiwweDA1LDB4QzcsMHg0NiwweEU2LDB4MDAsMHgwMCwweDhCLDB4NUUsMHgwNCwweDhBLDB4NDYsCisweEU2LDB4ODgsMHg0NywweDVELDB4OEIsMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NTksMHgwMiwweEM2LDB4NDcsMHgwMiwweDIwLAorMHg4QiwweERFLDB4RDEsMHhFMywweDhCLDB4OUYsMHg1OSwweDAyLDB4QzYsMHg0NywweDAzLDB4MzAsMHg4QiwweERFLDB4RDEsMHhFMywKKzB4OEIsMHg5RiwweDYxLDB4MDIsMHhDNiwweDQ3LDB4MDIsMHgyMCwweDhCLDB4REUsMHhEMSwweEUzLDB4OEIsMHg5RiwweDYxLDB4MDIsCisweEM2LDB4NDcsMHgwMywweDMwLDB4OEIsMHg0NiwweEU2LDB4ODksMHg0NiwweEZBLDB4ODMsMHg3RSwweEZBLDB4MDAsMHg3NCwweDE4LAorMHg4QiwweDQ2LDB4RkEsMHhCQiwweDBBLDB4MDAsMHgzMywweEQyLDB4RjcsMHhGMywweDgwLDB4QzIsMHgzMCwweDhCLDB4REUsMHhEMSwKKzB4RTMsMHg4QiwweDlGLDB4NTksMHgwMiwweDg4LDB4NTcsMHgwMywweEJCLDB4MEEsMHgwMCwweDhCLDB4NDYsMHhGQSwweDMzLDB4RDIsCisweEY3LDB4RjMsMHg4OSwweDQ2LDB4RkEsMHg4MywweDdFLDB4RkEsMHgwMCwweDc0LDB4MTgsMHg4QiwweDQ2LDB4RkEsMHhCQiwweDBBLAorMHgwMCwweDMzLDB4RDIsMHhGNywweEYzLDB4ODAsMHhDMiwweDMwLDB4OEIsMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NTksMHgwMiwKKzB4ODgsMHg1NywweDAyLDB4OEIsMHg0NiwweEU2LDB4ODksMHg0NiwweEZBLDB4ODMsMHg3RSwweEZBLDB4MDAsMHg3NCwweDE4LDB4OEIsCisweDQ2LDB4RkEsMHhCQiwweDBBLDB4MDAsMHgzMywweEQyLDB4RjcsMHhGMywweDgwLDB4QzIsMHgzMCwweDhCLDB4REUsMHhEMSwweEUzLAorMHg4QiwweDlGLDB4NjEsMHgwMiwweDg4LDB4NTcsMHgwMywweEJCLDB4MEEsMHgwMCwweDhCLDB4NDYsMHhGQSwweDMzLDB4RDIsMHhGNywKKzB4RjMsMHg4OSwweDQ2LDB4RkEsMHg4MywweDdFLDB4RkEsMHgwMCwweDc0LDB4MTgsMHg4QiwweDQ2LDB4RkEsMHhCQiwweDBBLDB4MDAsCisweDMzLDB4RDIsMHhGNywweEYzLDB4ODAsMHhDMiwweDMwLDB4OEIsMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NjEsMHgwMiwweDg4LAorMHg1NywweDAyLDB4OEIsMHg1RSwweEU2LDB4RDEsMHhFMywweEZGLDB4QjcsMHgxMiwweDAyLDB4NkEsMHgwMCwweEZGLDB4NzYsMHgwNCwKKzB4RTgsMHhEMSwweEY2LDB4ODMsMHhDNCwweDA2LDB4NjgsMHhEMywweDBGLDB4NkEsMHgwMSwweEZGLDB4NzYsMHgwNCwweEU4LDB4QzMsCisweEY2LDB4ODMsMHhDNCwweDA2LDB4RkYsMHg3NiwweEU2LDB4NTYsMHhFOCwweDAxLDB4OTMsMHg1OSwweDU5LDB4ODksMHg1NiwweEYyLAorMHg4OSwweDQ2LDB4RjAsMHhGRiwweDc2LDB4RTYsMHg1NiwweEU4LDB4MTQsMHg5MywweDU5LDB4NTksMHg4OSwweDU2LDB4RUUsMHg4OSwKKzB4NDYsMHhFQywweDlDLDB4RkEsMHhDNCwweDVFLDB4RjAsMHgyNiwweDhCLDB4MDcsMHg4OSwweDQ2LDB4RUEsMHhDNCwweDVFLDB4RUMsCisweDI2LDB4OEIsMHgwNywweDg5LDB4NDYsMHhFOCwweEJBLDB4NTAsMHhGRiwweEVELDB4ODksMHg0NiwweEZFLDB4OUQsMHhDNywweDQ2LAorMHhFNCwweDAxLDB4MDAsMHhFOCwweEVFLDB4QTAsMHhCQSwweDUwLDB4RkYsMHhFRCwweDg5LDB4NDYsMHhGQywweDhCLDB4NDYsMHhGQywKKzB4MkIsMHg0NiwweEZFLDB4M0QsMHhFOCwweDAzLDB4NzMsMHgwMywweEU5LDB4ODAsMHgwMSwweDlDLDB4RkEsMHhCQSwweDUwLDB4RkYsCisweEVELDB4ODksMHg0NiwweEZDLDB4OEIsMHg0NiwweEZDLDB4MkIsMHg0NiwweEZFLDB4ODksMHg0NiwweEY4LDB4QzQsMHg1RSwweEYwLAorMHgyNiwweDhCLDB4MDcsMHgyQiwweDQ2LDB4RUEsMHg4OSwweDQ2LDB4RjYsMHhDNCwweDVFLDB4RjAsMHgyNiwweDhCLDB4MDcsMHg4OSwKKzB4NDYsMHhFQSwweEM0LDB4NUUsMHhFQywweDI2LDB4OEIsMHgwNywweDJCLDB4NDYsMHhFOCwweDg5LDB4NDYsMHhGNCwweEM0LDB4NUUsCisweEVDLDB4MjYsMHg4QiwweDA3LDB4ODksMHg0NiwweEU4LDB4QkEsMHg1MCwweEZGLDB4RUQsMHg4OSwweDQ2LDB4RkUsMHg5RCwweDgxLAorMHg3RSwweEY4LDB4RTgsMHgwMywweDc2LDB4MUMsMHhGRiwweDc2LDB4RjgsMHhGRiwweDc2LDB4RjYsMHhFOCwweDc2LDB4MDEsMHg1OSwKKzB4NTksMHg4OSwweDQ2LDB4RjYsMHhGRiwweDc2LDB4RjgsMHhGRiwweDc2LDB4RjQsMHhFOCwweDY4LDB4MDEsMHg1OSwweDU5LDB4ODksCisweDQ2LDB4RjQsMHhCRiwweDBFLDB4MDAsMHhFQiwweDE3LDB4OEIsMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NTksMHgwMiwweEM2LAorMHgwMSwweDIwLDB4OEIsMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NjEsMHgwMiwweEM2LDB4MDEsMHgyMCwweDQ3LDB4ODMsMHhGRiwKKzB4MTEsMHg3NiwweEU0LDB4OEIsMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NTksMHgwMiwweEM2LDB4NDcsMHgwRCwweDMwLDB4OEIsCisweERFLDB4RDEsMHhFMywweDhCLDB4OUYsMHg2MSwweDAyLDB4QzYsMHg0NywweDBELDB4MzAsMHg4MywweDdFLDB4RjYsMHgwOSwweDc3LAorMHgwNSwweEI4LDB4MEQsMHgwMCwweEVCLDB4MjYsMHg4MywweDdFLDB4RjYsMHg2MywweDc3LDB4MDUsMHhCOCwweDBFLDB4MDAsMHhFQiwKKzB4MUIsMHg4MSwweDdFLDB4RjYsMHhFNywweDAzLDB4NzcsMHgwNSwweEI4LDB4MEYsMHgwMCwweEVCLDB4MEYsMHg4MSwweDdFLDB4RjYsCisweDBGLDB4MjcsMHg3NywweDA1LDB4QjgsMHgxMCwweDAwLDB4RUIsMHgwMywweEI4LDB4MTEsMHgwMCwweDhCLDB4RjgsMHhFQiwweDI1LAorMHg4QiwweDQ2LDB4RjYsMHhCQiwweDBBLDB4MDAsMHgzMywweEQyLDB4RjcsMHhGMywweDgwLDB4QzIsMHgzMCwweDhCLDB4REUsMHhEMSwKKzB4RTMsMHg4QiwweDlGLDB4NTksMHgwMiwweDg4LDB4MTEsMHg0RiwweEJCLDB4MEEsMHgwMCwweDhCLDB4NDYsMHhGNiwweDMzLDB4RDIsCisweEY3LDB4RjMsMHg4OSwweDQ2LDB4RjYsMHg4MywweDdFLDB4RjYsMHgwMCwweDc1LDB4RDUsMHg4MywweDdFLDB4RjQsMHgwOSwweDc3LAorMHgwNSwweEI4LDB4MEQsMHgwMCwweEVCLDB4MjYsMHg4MywweDdFLDB4RjQsMHg2MywweDc3LDB4MDUsMHhCOCwweDBFLDB4MDAsMHhFQiwKKzB4MUIsMHg4MSwweDdFLDB4RjQsMHhFNywweDAzLDB4NzcsMHgwNSwweEI4LDB4MEYsMHgwMCwweEVCLDB4MEYsMHg4MSwweDdFLDB4RjQsCisweDBGLDB4MjcsMHg3NywweDA1LDB4QjgsMHgxMCwweDAwLDB4RUIsMHgwMywweEI4LDB4MTEsMHgwMCwweDhCLDB4RjgsMHhFQiwweDI1LAorMHg4QiwweDQ2LDB4RjQsMHhCQiwweDBBLDB4MDAsMHgzMywweEQyLDB4RjcsMHhGMywweDgwLDB4QzIsMHgzMCwweDhCLDB4REUsMHhEMSwKKzB4RTMsMHg4QiwweDlGLDB4NjEsMHgwMiwweDg4LDB4MTEsMHg0RiwweEJCLDB4MEEsMHgwMCwweDhCLDB4NDYsMHhGNCwweDMzLDB4RDIsCisweEY3LDB4RjMsMHg4OSwweDQ2LDB4RjQsMHg4MywweDdFLDB4RjQsMHgwMCwweDc1LDB4RDUsMHg4QiwweERFLDB4RDEsMHhFMywweEZGLAorMHhCNywweDU5LDB4MDIsMHhGRiwweDc2LDB4MDQsMHhFOCwweDZFLDB4MDAsMHg1OSwweDU5LDB4OEIsMHhERSwweEQxLDB4RTMsMHhGRiwKKzB4QjcsMHg2MSwweDAyLDB4RkYsMHg3NiwweDA0LDB4RTgsMHg1RSwweDAwLDB4NTksMHg1OSwweDZBLDB4MDAsMHhGRiwweDc2LDB4MDQsCisweEU4LDB4MzEsMHhGMywweDU5LDB4NTksMHg4QiwweEQ4LDB4ODMsMHhGQiwweDA0LDB4NzcsMHgxRiwweEQxLDB4RTMsMHgyRSwweEZGLAorMHhBNywweDFCLDB4NzAsMHhFQiwweDIyLDB4QzcsMHg0NiwweEU0LDB4MDAsMHgwMCwweEZGLDB4NEUsMHhFNiwweEVCLDB4MEMsMHhDNywKKzB4NDYsMHhFNCwweDAwLDB4MDAsMHhGRiwweDQ2LDB4RTYsMHhFQiwweDAyLDB4RUIsMHgwMCwweDgzLDB4N0UsMHhFNCwweDAwLDB4NzQsCisweDAzLDB4RTksMHgyQSwweEZFLDB4RTksMHhENCwweEZDLDB4NUYsMHg1RSwweEM5LDB4QzMsMHhGMywweDZGLDB4RjUsMHg2RiwweEZGLAorMHg2RiwweEYzLDB4NkYsMHgwOSwweDcwLDB4NTUsMHg4QiwweEVDLDB4OEIsMHg0NiwweDA0LDB4QjksMHhFOCwweDAzLDB4RjcsMHhFMSwKKzB4OEIsMHg0RSwweDA2LDB4RjcsMHhGMSwweDVELDB4QzMsMHg1NSwweDhCLDB4RUMsMHg1NiwweDhCLDB4NzYsMHgwNiwweEVCLDB4MEUsCisweDhCLDB4REUsMHg0NiwweDhBLDB4MDcsMHg1MCwweEZGLDB4NzYsMHgwNCwweEU4LDB4MzMsMHgwMCwweDU5LDB4NTksMHg4MCwweDNDLAorMHgwMCwweDc1LDB4RUQsMHhFQiwweDAwLDB4NUUsMHg1RCwweEMzLDB4NTUsMHg4QiwweEVDLDB4NTYsMHg4QiwweDc2LDB4MDYsMHhFQiwKKzB4MTQsMHg4QiwweERFLDB4NDYsMHg4QSwweDA3LDB4NTAsMHhGRiwweDc2LDB4MDQsMHhFOCwweDQ1LDB4MDAsMHg1OSwweDU5LDB4MEIsCisweEMwLDB4NzQsMHgwMiwweEVCLDB4MDcsMHg4MCwweDNDLDB4MDAsMHg3NSwweEU3LDB4RUIsMHgwMCwweDVFLDB4NUQsMHhDMywweEM4LAorMHgwMiwweDAwLDB4MDAsMHg1NiwweDhCLDB4NzYsMHgwNCwweDhBLDB4NDQsMHg1QSwweDk4LDB4ODksMHg0NiwweEZFLDB4OUMsMHhGQSwKKzB4OEEsMHg0NiwweEZFLDB4QkEsMHhGRSwweDAwLDB4RUUsMHhCQSwweDAyLDB4MDAsMHhFQywweEE4LDB4MDIsMHg3NCwweDA2LDB4OUQsCisweEU4LDB4OTEsMHg5RSwweEVCLDB4RTksMHhCQSwweDAwLDB4MDAsMHg4QSwweDQ2LDB4MDYsMHhFRSwweDlELDB4RUIsMHgwMCwweDVFLAorMHhDOSwweEMzLDB4QzgsMHgwNCwweDAwLDB4MDAsMHg1NiwweDhCLDB4NzYsMHgwNCwweDhBLDB4NDQsMHg1QSwweDk4LDB4ODksMHg0NiwKKzB4RkUsMHhFOCwweEU2LDB4QTEsMHg4OSwweDQ2LDB4RkMsMHhFOCwweEUwLDB4QTEsMHgyQiwweDQ2LDB4RkMsMHgzRCwweEI4LDB4MEIsCisweDc2LDB4MDUsMHhCOCwweDAxLDB4MDAsMHhFQiwweDIzLDB4OUMsMHhGQSwweDhBLDB4NDYsMHhGRSwweEJBLDB4RkUsMHgwMCwweEVFLAorMHhCQSwweDAyLDB4MDAsMHhFQywweEE4LDB4MDIsMHg3NCwweDA2LDB4OUQsMHhFOCwweDQ4LDB4OUUsMHhFQiwweEQ5LDB4QkEsMHgwMCwKKzB4MDAsMHg4QSwweDQ2LDB4MDYsMHhFRSwweDlELDB4MzMsMHhDMCwweEVCLDB4MDAsMHg1RSwweEM5LDB4QzMsMHhDOCwweDA0LDB4MDAsCisweDAwLDB4NTYsMHg1NywweDhCLDB4NzYsMHgwNCwweDgzLDB4N0UsMHgwNiwweDAwLDB4NzQsMHgwNywweDU2LDB4RTgsMHgwMywweDAxLAorMHg1OSwweEVCLDB4MDUsMHg1NiwweEU4LDB4QTIsMHgwMCwweDU5LDB4ODgsMHg0NiwweEZGLDB4ODAsMHg3RSwweEZGLDB4MDgsMHg3NywKKzB4MDYsMHg4QSwweDQ2LDB4RkYsMHhFOSwweDg0LDB4MDAsMHg4MCwweDdFLDB4RkYsMHgwRiwweDc2LDB4MDMsMHhFQiwweDc5LDB4OTAsCisweDhBLDB4NDYsMHhGRiwweEI0LDB4MDAsMHgyRCwweDBBLDB4MDAsMHg4QiwweEQ4LDB4ODMsMHhGQiwweDA0LDB4NzcsMHg2NywweEQxLAorMHhFMywweDJFLDB4RkYsMHhBNywweEFGLDB4NzEsMHhCMCwweDAwLDB4RUIsMHg2MSwweDU2LDB4RTgsMHg2QiwweDAwLDB4NTksMHhCNCwKKzB4MDAsMHgyNSwweDBGLDB4MDAsMHg4OSwweDQ2LDB4RkMsMHg1NiwweEU4LDB4NUUsMHgwMCwweDU5LDB4QjQsMHgwMCwweDhCLDB4RjgsCisweDU2LDB4RTgsMHg1NSwweDAwLDB4NTksMHhCNCwweDAwLDB4QzEsMHhFMCwweDA4LDB4OEIsMHhENywweDAzLDB4RDAsMHg4QiwweEZBLAorMHg4QiwweDVFLDB4RkMsMHhEMSwweEUzLDB4ODksMHg3OCwweDMwLDB4RUIsMHgyRSwweDU2LDB4RTgsMHgzQiwweDAwLDB4NTksMHg4OCwKKzB4NDQsMHg1QiwweEVCLDB4MjQsMHg1NiwweEU4LDB4MzEsMHgwMCwweDU5LDB4ODgsMHg0NCwweDUwLDB4NTYsMHhFOCwweDI5LDB4MDAsCisweDU5LDB4ODgsMHg0NCwweDUxLDB4NTYsMHhFOCwweDIxLDB4MDAsMHg1OSwweDg4LDB4NDQsMHg1MiwweDU2LDB4RTgsMHgxOSwweDAwLAorMHg1OSwweDg4LDB4NDQsMHg1MywweEVCLDB4MDIsMHhFQiwweDAwLDB4RTksMHg1QiwweEZGLDB4NUYsMHg1RSwweEM5LDB4QzMsMHg0NiwKKzB4NzEsMHhBNiwweDcxLDB4NEEsMHg3MSwweDdBLDB4NzEsMHg4NCwweDcxLDB4QzgsMHgwNCwweDAwLDB4MDAsMHg1NiwweDhCLDB4NzYsCisweDA0LDB4OEEsMHg0NCwweDVBLDB4OTgsMHg4OSwweDQ2LDB4RkUsMHg5QywweEZBLDB4OEEsMHg0NiwweEZFLDB4QkEsMHhGRSwweDAwLAorMHhFRSwweEJBLDB4MDIsMHgwMCwweEVDLDB4QTgsMHgwMSwweDc1LDB4MDYsMHg5RCwweEU4LDB4NTcsMHg5RCwweEVCLDB4RTksMHhCQSwKKzB4MDAsMHgwMCwweEVDLDB4ODgsMHg0NiwweEZELDB4OUQsMHg4QSwweDQ2LDB4RkQsMHhFQiwweDAwLDB4NUUsMHhDOSwweEMzLDB4QzgsCisweDAyLDB4MDAsMHgwMCwweDU2LDB4OEIsMHg3NiwweDA0LDB4OEEsMHg0NCwweDVBLDB4OTgsMHg4OSwweDQ2LDB4RkUsMHg5QywweEZBLAorMHg4QSwweDQ2LDB4RkUsMHhCQSwweEZFLDB4MDAsMHhFRSwweEJBLDB4MDIsMHgwMCwweEVDLDB4MzIsMHhFNCwweDI0LDB4MDEsMHg5RCwKKzB4NUUsMHhDOSwweEMzLDB4QzgsMHgwNiwweDAwLDB4MDAsMHg1NiwweDhCLDB4NzYsMHgwNCwweDhBLDB4NDQsMHg1QSwweDk4LDB4ODksCisweDQ2LDB4RkUsMHhFOCwweDg1LDB4QTAsMHg4OSwweDQ2LDB4RkEsMHhFOCwweDdGLDB4QTAsMHgyQiwweDQ2LDB4RkEsMHgzRCwweEI4LAorMHgwQiwweDc2LDB4MDQsMHhCMCwweDA4LDB4RUIsMHgyNCwweDlDLDB4RkEsMHg4QSwweDQ2LDB4RkUsMHhCQSwweEZFLDB4MDAsMHhFRSwKKzB4QkEsMHgwMiwweDAwLDB4RUMsMHhBOCwweDAxLDB4NzUsMHgwNiwweDlELDB4RTgsMHhFOCwweDlDLDB4RUIsMHhEQSwweEJBLDB4MDAsCisweDAwLDB4RUMsMHg4OCwweDQ2LDB4RkQsMHg5RCwweDhBLDB4NDYsMHhGRCwweEVCLDB4MDAsMHg1RSwweEM5LDB4QzMsMHg1NSwweDhCLAorMHhFQywweDU2LDB4OEIsMHg1NiwweDA0LDB4OEEsMHg0NiwweDA2LDB4RUUsMHgzMywweEY2LDB4RUIsMHgwMywweDUwLDB4NTgsMHg0NiwKKzB4ODMsMHhGRSwweDE0LDB4N0MsMHhGOCwweDVFLDB4NUQsMHhDMywweEM4LDB4MDIsMHgwMCwweDAwLDB4NTYsMHg4QiwweDU2LDB4MDQsCisweEVDLDB4ODgsMHg0NiwweEZGLDB4MzMsMHhGNiwweEVCLDB4MDMsMHg1MCwweDU4LDB4NDYsMHg4MywweEZFLDB4MTQsMHg3QywweEY4LAorMHg4QSwweDQ2LDB4RkYsMHhFQiwweDAwLDB4NUUsMHhDOSwweEMzLDB4QzgsMHgwMiwweDAwLDB4MDAsMHg1NiwweDU3LDB4OEIsMHg3NiwKKzB4MDQsMHg4MywweDNFLDB4QjAsMHgwQiwweDAwLDB4NzUsMHgxRiwweEJBLDB4ODgsMHgwMSwweEIwLDB4MDAsMHhFRSwweEJBLDB4ODYsCisweDAxLDB4QjAsMHgwMCwweEVFLDB4NkEsMHgwOSwweDZBLDB4MDAsMHg2OCwweDMwLDB4MDEsMHhFOCwweDdELDB4MDEsMHg4MywweEM0LAorMHgwNiwweEM3LDB4MDYsMHhCMCwweDBCLDB4MDEsMHgwMCwweDZBLDB4MDksMHg4QiwweEM2LDB4MDUsMHg4MCwweDAxLDB4NTAsMHhFOCwKKzB4REEsMHgwMCwweDU5LDB4NTksMHg4QiwweEY4LDB4OEIsMHhDNywweEMxLDB4RTgsMHgwQywweDI1LDB4MEYsMHgwMCwweDg5LDB4NDYsCisweEZFLDB4OEIsMHhDNywweEMxLDB4RTgsMHgwOCwweDI1LDB4MEYsMHgwMCwweDhCLDB4NTYsMHhGRSwweDgzLDB4RjIsMHgwQywweDNCLAorMHhDMiwweDc1LDB4MjEsMHg4QiwweEM3LDB4QzEsMHhFOCwweDA0LDB4MjUsMHgwRiwweDAwLDB4OEIsMHg1NiwweEZFLDB4ODMsMHhGMiwKKzB4MDYsMHgzQiwweEMyLDB4NzUsMHgwRiwweDhCLDB4QzcsMHgyNSwweDBGLDB4MDAsMHg4QiwweDU2LDB4RkUsMHg4MywweEYyLDB4MDksCisweDNCLDB4QzIsMHg3NCwweDBELDB4NkEsMHgwNywweDU2LDB4RTgsMHgzOCwweDAwLDB4NTksMHg1OSwweEM3LDB4NDYsMHhGRSwweDA3LAorMHgwMCwweDhBLDB4NDYsMHhGRSwweDA0LDB4ODAsMHhBMiwweDMzLDB4MDIsMHg4QiwweEM2LDB4QkEsMHg2MiwweDAwLDB4RjcsMHhFQSwKKzB4OEEsMHg1NiwweEZFLDB4OEIsMHhEOCwweDg4LDB4OTcsMHg2QywweDAwLDB4NjgsMHgzMiwweDAyLDB4OEIsMHhDNiwweEJBLDB4NjIsCisweDAwLDB4RjcsMHhFQSwweDA1LDB4MTQsMHgwMCwweDUwLDB4RTgsMHgwRSwweEZELDB4NTksMHg1OSwweEVCLDB4MDAsMHg1RiwweDVFLAorMHhDOSwweEMzLDB4QzgsMHgwMiwweDAwLDB4MDAsMHg1NiwweDhCLDB4NzYsMHgwNiwweDgzLDB4RTYsMHgwRiwweDhCLDB4QzYsMHhDMSwKKzB4RTAsMHgwQywweDhCLDB4RDYsMHg4MywweEYyLDB4MEMsMHhDMSwweEUyLDB4MDgsMHgwQiwweEMyLDB4OEIsMHhENiwweDgzLDB4RjIsCisweDA2LDB4QzEsMHhFMiwweDA0LDB4MEIsMHhDMiwweDhCLDB4RDYsMHg4MywweEYyLDB4MDksMHgwQiwweEMyLDB4ODksMHg0NiwweEZFLAorMHg2QSwweDE5LDB4NkEsMHgxMCwweDhCLDB4NDYsMHgwNCwweDk5LDB4MDUsMHg0MCwweDAxLDB4ODMsMHhEMiwweDAwLDB4NTIsMHg1MCwKKzB4RTgsMHg2QiwweDAxLDB4ODMsMHhDNCwweDA2LDB4MEIsMHg0NiwweEZFLDB4ODMsMHhDQSwweDAwLDB4NTIsMHg1MCwweEU4LDB4OUEsCisweDAwLDB4ODMsMHhDNCwweDA2LDB4RTgsMHgyNSwweDAxLDB4RUIsMHgwMCwweDVFLDB4QzksMHhDMywweDU1LDB4OEIsMHhFQywweDU2LAorMHg1NywweDMzLDB4RkYsMHg2QSwweDAxLDB4NjgsMHg4NiwweDAxLDB4RTgsMHhBMywweEZFLDB4NTksMHg1OSwweEIxLDB4MTAsMHgyQSwKKzB4NEUsMHgwNiwweEQzLDB4NjYsMHgwNCwweDMzLDB4RjYsMHhFQiwweDJFLDB4ODEsMHg3RSwweDA0LDB4MDAsMHg4MCwweDcyLDB4MDQsCisweEIwLDB4MDEsMHhFQiwweDAyLDB4QjAsMHgwMCwweDUwLDB4NjgsMHg4OCwweDAxLDB4RTgsMHg4MSwweEZFLDB4NTksMHg1OSwweDZBLAorMHgwMywweDY4LDB4ODYsMHgwMSwweEU4LDB4NzcsMHhGRSwweDU5LDB4NTksMHg2QSwweDAxLDB4NjgsMHg4NiwweDAxLDB4RTgsMHg2RCwKKzB4RkUsMHg1OSwweDU5LDB4RDEsMHg2NiwweDA0LDB4NDYsMHgzQiwweDc2LDB4MDYsMHg3QywweENELDB4MzMsMHhGNiwweEVCLDB4MjQsCisweEQxLDB4RTcsMHg2QSwweDAzLDB4NjgsMHg4NiwweDAxLDB4RTgsMHg1NCwweEZFLDB4NTksMHg1OSwweDZBLDB4MDEsMHg2OCwweDg2LAorMHgwMSwweEU4LDB4NEEsMHhGRSwweDU5LDB4NTksMHg2OCwweDg4LDB4MDEsMHhFOCwweDVDLDB4RkUsMHg1OSwweDk4LDB4MjUsMHgwMSwKKzB4MDAsMHgwQiwweEY4LDB4NDYsMHg4MywweEZFLDB4MTAsMHg3QywweEQ3LDB4NkEsMHgwMCwweDY4LDB4ODYsMHgwMSwweEU4LDB4MkQsCisweEZFLDB4NTksMHg1OSwweDhCLDB4QzcsMHhFQiwweDAwLDB4NUYsMHg1RSwweDVELDB4QzMsMHg1NSwweDhCLDB4RUMsMHg1NiwweDU3LAorMHg4QiwweDdFLDB4MDgsMHg2QSwweDAxLDB4NjgsMHg4NiwweDAxLDB4RTgsMHgxMywweEZFLDB4NTksMHg1OSwweEI4LDB4MjAsMHgwMCwKKzB4MkIsMHhDNywweDUwLDB4RkYsMHg3NiwweDA2LDB4RkYsMHg3NiwweDA0LDB4RTgsMHhBMiwweDAwLDB4ODMsMHhDNCwweDA2LDB4ODksCisweDU2LDB4MDYsMHg4OSwweDQ2LDB4MDQsMHgzMywweEY2LDB4RUIsMHg0NywweDgxLDB4N0UsMHgwNiwweDAwLDB4ODAsMHg3MiwweDBDLAorMHg3NSwweDA2LDB4ODMsMHg3RSwweDA0LDB4MDAsMHg3MiwweDA0LDB4QjAsMHgwMSwweEVCLDB4MDIsMHhCMCwweDAwLDB4NTAsMHg2OCwKKzB4ODgsMHgwMSwweEU4LDB4RDksMHhGRCwweDU5LDB4NTksMHg2QSwweDAzLDB4NjgsMHg4NiwweDAxLDB4RTgsMHhDRiwweEZELDB4NTksCisweDU5LDB4NkEsMHgwMSwweDY4LDB4ODYsMHgwMSwweEU4LDB4QzUsMHhGRCwweDU5LDB4NTksMHg2QSwweDAxLDB4RkYsMHg3NiwweDA2LAorMHhGRiwweDc2LDB4MDQsMHhFOCwweDU4LDB4MDAsMHg4MywweEM0LDB4MDYsMHg4OSwweDU2LDB4MDYsMHg4OSwweDQ2LDB4MDQsMHg0NiwKKzB4M0IsMHhGNywweDdDLDB4QjUsMHg2QSwweDAwLDB4NjgsMHg4NiwweDAxLDB4RTgsMHhBMiwweEZELDB4NTksMHg1OSwweDZBLDB4MDAsCisweDY4LDB4ODYsMHgwMSwweEU4LDB4OTgsMHhGRCwweDU5LDB4NTksMHg1RiwweDVFLDB4NUQsMHhDMywweDU1LDB4OEIsMHhFQywweDU2LAorMHg2QSwweDAxLDB4NjgsMHg4NiwweDAxLDB4RTgsMHg4NiwweEZELDB4NTksMHg1OSwweDMzLDB4RjYsMHhFQiwweDAwLDB4NjgsMHg4OCwKKzB4MDEsMHhFOCwweDk0LDB4RkQsMHg1OSwweEE4LDB4MDEsMHg3NSwweDA4LDB4OEIsMHhDNiwweDQ2LDB4M0QsMHg2NCwweDAwLDB4N0MsCisweEVELDB4NkEsMHgwMCwweDY4LDB4ODYsMHgwMSwweEU4LDB4NjUsMHhGRCwweDU5LDB4NTksMHg1RSwweDVELDB4QzMsMHhDOCwweDA0LAorMHgwMCwweDAwLDB4OEIsMHg0NiwweDA0LDB4OEIsMHg1NiwweDA2LDB4OEIsMHg0RSwweDA4LDB4RTMsMHgwNiwweEQxLDB4RTAsMHhEMSwKKzB4RDIsMHhFMiwweEZBLDB4ODksMHg0NiwweEZDLDB4ODksMHg1NiwweEZFLDB4OEIsMHg1NiwweEZFLDB4OEIsMHg0NiwweEZDLDB4RUIsCisweDAwLDB4QzksMHhDMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg1MCwweDcyLDB4NjUsMHg3NiwweDY5LDB4NkYsMHg3NSwweDczLDB4MjAsMHg0RCwweDY1LDB4NkUsMHg3NSwweDAwLDB4NDIsMHg2NSwKKzB4NjcsMHg2OSwweDZFLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsCisweDIwLDB4MzAsMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzMSwweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDMyLAorMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzMywweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDM0LDB4MDAsMHg1MCwKKzB4NkYsMHg3MiwweDc0LDB4MjAsMHgzNSwweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDM2LDB4MDAsMHg1MCwweDZGLDB4NzIsCisweDc0LDB4MjAsMHgzNywweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDM4LDB4MDAsMHg1MCwweDZGLDB4NzIsMHg3NCwweDIwLAorMHgzOSwweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDMxLDB4MzAsMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzMSwKKzB4MzEsMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzMSwweDMyLDB4MDAsMHg1MCwweDZGLDB4NzIsMHg3NCwweDIwLDB4MzEsCisweDMzLDB4MDAsMHg1MCwweDZGLDB4NzIsMHg3NCwweDIwLDB4MzEsMHgzNCwweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDMxLAorMHgzNSwweDAwLDB4OUMsMHgwMSwweEEzLDB4MDEsMHhBQSwweDAxLDB4QjEsMHgwMSwweEI4LDB4MDEsMHhCRiwweDAxLDB4QzYsMHgwMSwKKzB4Q0QsMHgwMSwweEQ0LDB4MDEsMHhEQiwweDAxLDB4RTIsMHgwMSwweEVBLDB4MDEsMHhGMiwweDAxLDB4RkEsMHgwMSwweDAyLDB4MDIsCisweDBBLDB4MDIsMHgwOCwweDAwLDB4MDAsMHgwNywweDgxLDB4MDAsMHgwMywweDgwLDB4ODAsMHg4MCwweDlGLDB4OTEsMHg5NSwweDkxLAorMHg5RiwweDAwLDB4MDMsMHg4MSwweDg0LDB4OEUsMHg5NSwweDg0LDB4ODQsMHg4NCwweDg0LDB4MDAsMHgwMywweDgyLDB4ODQsMHg4NCwKKzB4ODQsMHg4NCwweDk1LDB4OEUsMHg4NCwweDAwLDB4MDQsMHg4OCwweDAwLDB4QjIsMHgwQiwweEM2LDB4MEIsMHhEQSwweDBCLDB4RUUsCisweDBCLDB4MDIsMHgwQywweDE2LDB4MEMsMHgyQSwweDBDLDB4M0UsMHgwQywweDUyLDB4MEMsMHg3NywweDBDLDB4OUMsMHgwQywweEJFLAorMHgwQywweEUwLDB4MEMsMHgwMiwweDBELDB4MDEsMHg4MCwweDIwLDB4NTQsMHg2NSwweDczLDB4NzQsMHgyMCwweDUwLDB4NjEsMHg3MywKKzB4NzMsMHg2NSwweDY0LDB4MjAsMHgxRiwweDIwLDB4NTAsMHg3MiwweDY1LDB4NzMsMHg3MywweDIwLDB4ODAsMHgwMiwweDAwLDB4MDEsCisweDgwLDB4MjAsMHg0RCwweDY5LDB4NzMsMHg3MywweDY5LDB4NkUsMHg2NywweDIwLDB4NTIsMHg3OCwweDIwLDB4NDQsMHg2MSwweDc0LAorMHg2MSwweDFGLDB4MjAsMHg1MCwweDcyLDB4NjUsMHg3MywweDczLDB4MjAsMHg4MCwweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHg0MiwKKzB4NjEsMHg2NCwweDIwLDB4NTIsMHg3OCwweDIwLDB4NDQsMHg2MSwweDc0LDB4NjEsMHgyMCwweDFGLDB4MjAsMHg1MCwweDcyLDB4NjUsCisweDczLDB4NzMsMHgyMCwweDgwLDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDU4LDB4NkQsMHg3NCwweDcyLDB4MjAsMHg0MiwweDc1LAorMHg3MywweDc5LDB4MUYsMHgyMCwweDUwLDB4NzIsMHg2NSwweDczLDB4NzMsMHgyMCwweDgwLDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwKKzB4NkUsMHg2RiwweDc0LDB4MjAsMHg2MywweDc1LDB4NzIsMHg3MiwweDY1LDB4NkUsMHg3NCwweDZDLDB4NzksMHgxRiwweDIwLDB4MjAsCisweDY5LDB4NkQsMHg3MCwweDZDLDB4NjUsMHg2RCwweDY1LDB4NkUsMHg3NCwweDY1LDB4NjQsMHgwMiwweDAwLDB4MjQsMHgwRCwweDJGLAorMHgwRCwweDNBLDB4MEQsMHg0NSwweDBELDB4NTAsMHgwRCwweDVCLDB4MEQsMHg2NiwweDBELDB4NzEsMHgwRCwweDdDLDB4MEQsMHg4NywKKzB4MEQsMHg5MiwweDBELDB4OUQsMHgwRCwweEE4LDB4MEQsMHhCMywweDBELDB4QkUsMHgwRCwweEM5LDB4MEQsMHg1MywweDgwLDB4MkMsCisweDMyLDB4NTQsMHg0NCwweDIwLDB4NTMsMHg4NiwweDJDLDB4MzMsMHg0NCwweDU0LDB4NTIsMHgyMCwweDUzLDB4ODIsMHgyQywweDMzLAorMHg1MiwweDU0LDB4NTMsMHgyMCwweDFGLDB4NTMsMHg4MSwweDJDLDB4MzIsMHg1MiwweDQ0LDB4MjAsMHg1MywweDg1LDB4MkMsMHgzMiwKKzB4NDMsMHg0NCwweDIwLDB4NTMsMHg4MywweDJDLDB4MzMsMHg0MywweDU0LDB4NTMsMHgyMCwweDUzLDB4ODQsMHgyQywweDMzLDB4NDQsCisweDUzLDB4NTIsMHgyMCwweDUzLDB4ODcsMHgyQywweDMyLDB4NTIsMHg0OSwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLAorMHg0NCwweDQzLDB4NDQsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDMyLDB4MzAsMHgxRiwweDI3LDB4NTMsMHg4NSwKKzB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDg4LDB4ODksCisweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NDQsMHg1MywweDUyLAorMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDMxLDB4MzEsMHgxRiwweDI3LDB4NTMsMHg4NCwweDJFLDB4MzEsMHg4MSwKKzB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDg4LDB4ODksMHg4QSwweDhCLDB4OEMsCisweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NDMsMHg1NCwweDUzLDB4MjAsMHgyRCwweDIwLAorMHg3MCwweDY5LDB4NkUsMHgyMCwweDM0LDB4MUYsMHgyNywweDUzLDB4ODMsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4OTAsMHg4MCwKKzB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OEEsMHg4QiwweDhDLDB4OEQsMHg4RSwweDhGLDB4MjcsCisweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NDksMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDMyLAorMHgzMiwweDFGLDB4MjcsMHg1MywweDg3LDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwKKzB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsCisweDIwLDB4MjAsMHg0NCwweDU0LDB4NTIsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDM2LDB4MkYsMHgzOCwweDFGLAorMHgyNywweDUzLDB4ODYsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4OTAsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwKKzB4ODcsMHg4OCwweDg5LDB4OEEsMHg4QiwweDhDLDB4OEQsMHg4RSwweDhGLDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsCisweDUyLDB4NTQsMHg1MywweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzUsMHgxRiwweDI3LDB4NTMsMHg4MiwweDJFLAorMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDg4LDB4ODksMHg4QSwKKzB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NTIsMHg3OCwweDQ0LDB4MjAsCisweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDMyLDB4MUYsMHgyNywweDUzLDB4ODEsMHgyRSwweDMwLDB4NTMsMHg0RCwweDgxLAorMHg4MiwweDYzLDB4OTAsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywKKzB4OEQsMHg4RSwweDhGLDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg1NCwweDc4LDB4NDQsMHgyMCwweDJELDB4MjAsCisweDcwLDB4NjksMHg2RSwweDIwLDB4MzMsMHgxRiwweDI3LDB4NTMsMHg4MCwweDJFLDB4MzAsMHg1MywweDRELDB4ODEsMHg4MiwweDYzLAorMHg5MCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OEEsMHg4QiwweDhDLDB4OEQsMHg4RSwKKzB4OEYsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDQ0LDB4NDMsMHg0NCwweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksCisweDZFLDB4MjAsMHgzNSwweDFGLDB4MjcsMHg1MywweDg1LDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLAorMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwKKzB4MDEsMHg4MCwweDIwLDB4MjAsMHg0NCwweDUzLDB4NTIsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDM1LDB4MUYsCisweDI3LDB4NTMsMHg4NCwweDJFLDB4MzEsMHg4MSwweDgyLDB4NjMsMHg5MCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LAorMHg4NywweDg4LDB4ODksMHg4QSwweDhCLDB4OEMsMHg4RCwweDhFLDB4OEYsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwKKzB4NDMsMHg1NCwweDUzLDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzMSwweDFGLDB4MjcsMHg1MywweDgzLDB4MkUsCisweDMxLDB4ODEsMHg4MiwweDYzLDB4OTAsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLAorMHg4QiwweDhDLDB4OEQsMHg4RSwweDhGLDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg1MiwweDQ5LDB4MjAsMHgyRCwKKzB4MjAsMHgyOCwweDZFLDB4MkUsMHg2MywweDJFLDB4MjksMHgxRiwweDI3LDB4NTMsMHg4NywweDJFLDB4MzEsMHg4MSwweDgyLDB4NjMsCisweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDg4LDB4ODksMHg4QSwweDhCLDB4OEMsMHg4RCwweDhFLAorMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NDQsMHg1NCwweDUyLDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwKKzB4NkUsMHgyMCwweDMyLDB4MUYsMHgyNywweDUzLDB4ODYsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4OTAsMHg4MCwweDgxLDB4ODIsCisweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OEEsMHg4QiwweDhDLDB4OEQsMHg4RSwweDhGLDB4MjcsMHgwMiwweDAwLAorMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NTQsMHg1MywweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzcsMHgxRiwKKzB4MjcsMHg1MywweDgyLDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsCisweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLAorMHg1MiwweDc4LDB4NDQsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDM2LDB4MUYsMHgyNywweDUzLDB4ODEsMHgyRSwKKzB4MzAsMHg1MywweDRELDB4ODEsMHg4MiwweDYzLDB4OTAsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsCisweDg5LDB4OEEsMHg4QiwweDhDLDB4OEQsMHg4RSwweDhGLDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg1NCwweDc4LAorMHg0NCwweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzMsMHgxRiwweDI3LDB4NTMsMHg4MCwweDJFLDB4MzAsMHg1MywKKzB4NEQsMHg4MSwweDgyLDB4NjMsMHg5MCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OEEsCisweDhCLDB4OEMsMHg4RCwweDhFLDB4OEYsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDQ0LDB4NDMsMHg0NCwweDIwLAorMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNSwweDFGLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODUsMHgyRSwKKzB4MzEsMHg4MSwweDgyLDB4NjMsMHg4OCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsCisweDAxLDB4ODAsMHgyMCwweDIwLDB4NDQsMHg1MywweDUyLDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNSwweDFGLAorMHgyMCwweDIwLDB4MjAsMHgyMCwweDI3LDB4NTMsMHg4NCwweDJFLDB4MzEsMHg4MSwweDgyLDB4NjMsMHg4OCwweDgwLDB4ODEsMHg4MiwKKzB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NDMsMHg1NCwweDUzLDB4MjAsCisweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDMxLDB4MUYsMHgyMCwweDIwLDB4MjAsMHgyMCwweDI3LDB4NTMsMHg4MywweDJFLAorMHgzMSwweDgxLDB4ODIsMHg2MywweDg4LDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDI3LDB4MDIsMHgwMCwKKzB4MDEsMHg4MCwweDIwLDB4MjAsMHg1MiwweDQ5LDB4MjAsMHgyRCwweDIwLDB4MjgsMHg2RSwweDJFLDB4NjMsMHgyRSwweDI5LDB4MUYsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywweDg3LDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDg4LDB4ODAsMHg4MSwweDgyLAorMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg0NCwweDU0LDB4NTIsMHgyMCwKKzB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzIsMHgxRiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywweDg2LDB4MkUsCisweDMxLDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLAorMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NTQsMHg1MywweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzcsMHgxRiwKKzB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODIsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsCisweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NzgsMHg0NCwweDIwLAorMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNiwweDFGLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODEsMHgyRSwKKzB4MzAsMHg1MywweDRELDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsCisweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDU0LDB4NzgsMHg0NCwweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLAorMHgzMywweDFGLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODAsMHgyRSwweDMwLDB4NTMsMHg0RCwweDgxLDB4ODIsMHg2MywKKzB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsCisweDQ0LDB4NDMsMHg0NCwweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzIsMHgzMCwweDFGLDB4MjAsMHgyMCwweDIwLAorMHgyMCwweDI3LDB4NTMsMHg4NSwweDJFLDB4MzEsMHg4MSwweDgyLDB4NjMsMHg4OCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwKKzB4ODYsMHg4NywweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NDQsMHg1MywweDUyLDB4MjAsMHgyRCwweDIwLDB4NzAsCisweDY5LDB4NkUsMHgyMCwweDMxLDB4MzEsMHgxRiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywweDg0LDB4MkUsMHgzMSwweDgxLAorMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwKKzB4MjAsMHgyMCwweDQzLDB4NTQsMHg1MywweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzQsMHgxRiwweDIwLDB4MjAsCisweDIwLDB4MjAsMHgyNywweDUzLDB4ODMsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LAorMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NDksMHgyMCwweDJELDB4MjAsMHg3MCwKKzB4NjksMHg2RSwweDIwLDB4MzIsMHgzMiwweDFGLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODcsMHgyRSwweDMxLDB4ODEsCisweDgyLDB4NjMsMHg4OCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLAorMHgyMCwweDIwLDB4NDQsMHg1NCwweDUyLDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNiwweDJGLDB4MzgsMHgxRiwKKzB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODYsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsCisweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NTQsMHg1MywweDIwLAorMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNSwweDFGLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODIsMHgyRSwKKzB4MzEsMHg4MSwweDgyLDB4NjMsMHg4OCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsCisweDAxLDB4ODAsMHgyMCwweDIwLDB4NTIsMHg3OCwweDQ0LDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzMiwweDFGLAorMHgyMCwweDIwLDB4MjAsMHgyMCwweDI3LDB4NTMsMHg4MSwweDJFLDB4MzAsMHg1MywweDRELDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwKKzB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDU0LDB4NzgsCisweDQ0LDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzMywweDFGLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLAorMHg4MCwweDJFLDB4MzAsMHg1MywweDRELDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwKKzB4ODcsMHgyNywweDAyLDB4MDAsMHg2OCwweDA0LDB4OTYsMHgwNCwweEI2LDB4MDMsMHgzQywweDA0LDB4MEUsMHgwNCwweDg5LDB4MDMsCisweDVDLDB4MDMsMHhFMiwweDAzLDB4NjAsMHgwOCwweDhBLDB4MDgsMHhCRSwweDA3LDB4MzgsMHgwOCwweDBFLDB4MDgsMHg5NSwweDA3LAorMHg2QywweDA3LDB4RTYsMHgwNywweDFDLDB4MDUsMHg3NCwweDA1LDB4RkEsMHgwNSwweEM0LDB4MDQsMHhGMCwweDA0LDB4Q0MsMHgwNSwKKzB4QTAsMHgwNSwweDQ4LDB4MDUsMHg3OCwweDA2LDB4QzgsMHgwNiwweDQyLDB4MDcsMHgyOCwweDA2LDB4NTAsMHgwNiwweDE4LDB4MDcsCisweEYwLDB4MDYsMHhBMCwweDA2LDB4MDAsMHgwMCwweEY0LDB4MDgsMHhGNCwweDA4LDB4RDQsMHgwRCwweDA0LDB4MDksMHgwNCwweDA5LAorMHgwNCwweDA5LDB4MDQsMHgwOSwweDQyLDB4MDAsMHgwQywweDA5LDB4MUMsMHgwOSwweEU1LDB4MEQsMHgwMiwweDAwLDB4MTQsMHgwOSwKKzB4MDQsMHgwOSwweEY0LDB4MEQsMHg0MywweDAwLDB4MUMsMHgwOSwweDBDLDB4MDksMHgwNSwweDBFLDB4MDAsMHgwNCwweDA0LDB4MDksCisweDE0LDB4MDksMHgxMiwweDBFLDB4MkMsMHgwOSwweDJDLDB4MDksMHgyQywweDA5LDB4MkMsMHgwOSwweDAwLDB4MDAsMHgzQywweDA5LAorMHg2QywweDA5LDB4MUUsMHgwRSwweDc0LDB4MDksMHg3NCwweDA5LDB4NzQsMHgwOSwweDc0LDB4MDksMHgwMCwweDAxLDB4NEMsMHgwOSwKKzB4MkMsMHgwOSwweDJELDB4MEUsMHg3NCwweDA5LDB4NzQsMHgwOSwweDc0LDB4MDksMHg3NCwweDA5LDB4MDAsMHgwMiwweDVDLDB4MDksCisweDNDLDB4MDksMHgzRCwweDBFLDB4NzQsMHgwOSwweDc0LDB4MDksMHg3NCwweDA5LDB4NzQsMHgwOSwweDAwLDB4MDMsMHg2QywweDA5LAorMHg0QywweDA5LDB4NEQsMHgwRSwweDc0LDB4MDksMHg3NCwweDA5LDB4NzQsMHgwOSwweDc0LDB4MDksMHhGRiwweDAwLDB4MkMsMHgwOSwKKzB4NUMsMHgwOSwweDAwLDB4MDAsMHgwMCwweDA1LDB4ODQsMHgwOSwweEVDLDB4MDksMHg1RSwweDBFLDB4RjQsMHgwOSwweEY0LDB4MDksCisweEY0LDB4MDksMHhGNCwweDA5LDB4MDAsMHgwNiwweDk0LDB4MDksMHg3NCwweDA5LDB4NjgsMHgwRSwweEFDLDB4MEEsMHhBQywweDBBLAorMHhBQywweDBBLDB4QUMsMHgwQSwweDAwLDB4MDcsMHhBNCwweDA5LDB4ODQsMHgwOSwweDcyLDB4MEUsMHhCQywweDBBLDB4QkMsMHgwQSwKKzB4QkMsMHgwQSwweEJDLDB4MEEsMHgwMCwweDA4LDB4QjQsMHgwOSwweDk0LDB4MDksMHg3QywweDBFLDB4RDQsMHgwQSwweEQ0LDB4MEEsCisweEQ0LDB4MEEsMHhENCwweDBBLDB4MDAsMHgwQiwweEM0LDB4MDksMHhBNCwweDA5LDB4ODMsMHgwRSwweEZDLDB4MEEsMHhGQywweDBBLAorMHhGQywweDBBLDB4RkMsMHgwQSwweDAwLDB4MEMsMHhENCwweDA5LDB4QjQsMHgwOSwweDkwLDB4MEUsMHgxNCwweDBCLDB4MTQsMHgwQiwKKzB4MTQsMHgwQiwweDE0LDB4MEIsMHgwMCwweDAyLDB4RTQsMHgwOSwweEM0LDB4MDksMHhBMCwweDBFLDB4MkMsMHgwQiwweDJDLDB4MEIsCisweDJDLDB4MEIsMHgyQywweDBCLDB4MDQsMHgwMCwweEVDLDB4MDksMHhENCwweDA5LDB4MEUsMHgwMCwweEZGLDB4MDAsMHg3NCwweDA5LAorMHhFNCwweDA5LDB4MDAsMHgwMCwweDgyLDB4MDEsMHhGQywweDA5LDB4QTQsMHgwQSwweEFDLDB4MEUsMHg4MiwweDAyLDB4MDQsMHgwQSwKKzB4RjQsMHgwOSwweEFGLDB4MEUsMHg4MiwweDAzLDB4MEMsMHgwQSwweEZDLDB4MDksMHhCMiwweDBFLDB4ODIsMHgwNCwweDE0LDB4MEEsCisweDA0LDB4MEEsMHhCNiwweDBFLDB4ODIsMHgwNSwweDFDLDB4MEEsMHgwQywweDBBLDB4QkMsMHgwRSwweDgyLDB4MDYsMHgyNCwweDBBLAorMHgxNCwweDBBLDB4QzAsMHgwRSwweDgyLDB4MDcsMHgyQywweDBBLDB4MUMsMHgwQSwweEM0LDB4MEUsMHg4MiwweDA4LDB4MzQsMHgwQSwKKzB4MjQsMHgwQSwweEM4LDB4MEUsMHg4MiwweDA5LDB4M0MsMHgwQSwweDJDLDB4MEEsMHhDQywweDBFLDB4ODIsMHgwQSwweDQ0LDB4MEEsCisweDM0LDB4MEEsMHhEMSwweDBFLDB4ODIsMHgxMCwweDRDLDB4MEEsMHgzQywweDBBLDB4RDYsMHgwRSwweDgyLDB4MEIsMHg1NCwweDBBLAorMHg0NCwweDBBLDB4REIsMHgwRSwweDgyLDB4MTEsMHg1QywweDBBLDB4NEMsMHgwQSwweEUwLDB4MEUsMHg4MiwweDBDLDB4NjQsMHgwQSwKKzB4NTQsMHgwQSwweEU1LDB4MEUsMHg4MiwweDEyLDB4NkMsMHgwQSwweDVDLDB4MEEsMHhFQSwweDBFLDB4ODIsMHgwRCwweDc0LDB4MEEsCisweDY0LDB4MEEsMHhFRiwweDBFLDB4ODIsMHgwRSwweDdDLDB4MEEsMHg2QywweDBBLDB4RjQsMHgwRSwweDgyLDB4MEYsMHg4NCwweDBBLAorMHg3NCwweDBBLDB4RkIsMHgwRSwweDgyLDB4MTMsMHg4QywweDBBLDB4N0MsMHgwQSwweDAyLDB4MEYsMHg4MiwweDE0LDB4OTQsMHgwQSwKKzB4ODQsMHgwQSwweDA5LDB4MEYsMHg4MiwweDE1LDB4OUMsMHgwQSwweDhDLDB4MEEsMHgxMCwweDBGLDB4ODIsMHgxNiwweEE0LDB4MEEsCisweDk0LDB4MEEsMHgxNywweDBGLDB4ODIsMHgxNywweEY0LDB4MDksMHg5QywweDBBLDB4MUUsMHgwRiwweDgyLDB4MDIsMHhCNCwweDBBLAorMHhCNCwweDBBLDB4MjYsMHgwRiwweDgyLDB4MDMsMHhBQywweDBBLDB4QUMsMHgwQSwweDJELDB4MEYsMHg4MiwweDAwLDB4QzQsMHgwQSwKKzB4Q0MsMHgwQSwweDM0LDB4MEYsMHg4MiwweDAxLDB4Q0MsMHgwQSwweEJDLDB4MEEsMHgzRiwweDBGLDB4ODIsMHgwMiwweEJDLDB4MEEsCisweEM0LDB4MEEsMHg0RCwweDBGLDB4ODIsMHgwMCwweERDLDB4MEEsMHhGNCwweDBBLDB4NTksMHgwRiwweDgyLDB4MDEsMHhFNCwweDBBLAorMHhENCwweDBBLDB4NjMsMHgwRiwweDgyLDB4MDIsMHhFQywweDBBLDB4REMsMHgwQSwweDZFLDB4MEYsMHg4MiwweDAzLDB4RjQsMHgwQSwKKzB4RTQsMHgwQSwweDdBLDB4MEYsMHg4MiwweDA0LDB4RDQsMHgwQSwweEVDLDB4MEEsMHg4NywweDBGLDB4ODIsMHgwMCwweDA0LDB4MEIsCisweDBDLDB4MEIsMHg5MywweDBGLDB4ODIsMHgwMSwweDBDLDB4MEIsMHhGQywweDBBLDB4OUIsMHgwRiwweDgyLDB4MDIsMHhGQywweDBBLAorMHgwNCwweDBCLDB4QTcsMHgwRiwweDgyLDB4MDAsMHgxQywweDBCLDB4MjQsMHgwQiwweEIwLDB4MEYsMHg4MiwweDAxLDB4MjQsMHgwQiwKKzB4MTQsMHgwQiwweEI1LDB4MEYsMHg4MiwweDAyLDB4MTQsMHgwQiwweDFDLDB4MEIsMHhCRSwweDBGLDB4NDQsMHgwMCwweDM0LDB4MEIsCisweEE0LDB4MEIsMHg5QywweDAxLDB4NDQsMHgwMSwweDNDLDB4MEIsMHgyQywweDBCLDB4QTMsMHgwMSwweDQ0LDB4MDIsMHg0NCwweDBCLAorMHgzNCwweDBCLDB4QUEsMHgwMSwweDQ0LDB4MDMsMHg0QywweDBCLDB4M0MsMHgwQiwweEIxLDB4MDEsMHg0NCwweDA0LDB4NTQsMHgwQiwKKzB4NDQsMHgwQiwweEI4LDB4MDEsMHg0NCwweDA1LDB4NUMsMHgwQiwweDRDLDB4MEIsMHhCRiwweDAxLDB4NDQsMHgwNiwweDY0LDB4MEIsCisweDU0LDB4MEIsMHhDNiwweDAxLDB4NDQsMHgwNywweDZDLDB4MEIsMHg1QywweDBCLDB4Q0QsMHgwMSwweDQ0LDB4MDgsMHg3NCwweDBCLAorMHg2NCwweDBCLDB4RDQsMHgwMSwweDQ0LDB4MDksMHg3QywweDBCLDB4NkMsMHgwQiwweERCLDB4MDEsMHg0NCwweDBBLDB4ODQsMHgwQiwKKzB4NzQsMHgwQiwweEUyLDB4MDEsMHg0NCwweDBCLDB4OEMsMHgwQiwweDdDLDB4MEIsMHhFQSwweDAxLDB4NDQsMHgwQywweDk0LDB4MEIsCisweDg0LDB4MEIsMHhGMiwweDAxLDB4NDQsMHgwRCwweDlDLDB4MEIsMHg4QywweDBCLDB4RkEsMHgwMSwweDQ0LDB4MEUsMHhBNCwweDBCLAorMHg5NCwweDBCLDB4MDIsMHgwMiwweDQ0LDB4MEYsMHgyQywweDBCLDB4OUMsMHgwQiwweDBBLDB4MDIsMHgxNywweDFGLDB4MEYsMHgyRiwKKzB4MDAsMHgwMCwweDAxLDB4ODAsMHg3OCwweDc4LDB4M0EsMHgyMCwweDc0LDB4NzgsMHgyMCwweDYzLDB4NzAsMHg3MywweDIwLDB4MkEsCisweDJBLDB4MkEsMHgyQSwweDJBLDB4MDIsMHgwMCwweDAxLDB4ODAsMHg3OCwweDc4LDB4M0EsMHgyMCwweDc0LDB4NzgsMHgyMCwweDYzLAorMHg3MCwweDczLDB4MjAsMHgyQSwweDJBLDB4MkEsMHgyQSwweDJBLDB4MDIsMHgwMCwweDAxLDB4ODAsMHg3OCwweDc4LDB4M0EsMHgyMCwKKzB4NzQsMHg3OCwweDIwLDB4NjMsMHg3MCwweDczLDB4MjAsMHgyQSwweDJBLDB4MkEsMHgyQSwweDJBLDB4MDIsMHgwMCwweDAxLDB4ODAsCisweDc4LDB4NzgsMHgzQSwweDIwLDB4NzQsMHg3OCwweDIwLDB4NjMsMHg3MCwweDczLDB4MjAsMHgyQSwweDJBLDB4MkEsMHgyQSwweDJBLAorMHgwMiwweDAwLDB4MDEsMHhDMCwweDc4LDB4NzgsMHgzQSwweDIwLDB4NzIsMHg2MywweDIwLDB4NjMsMHg3MCwweDczLDB4MjAsMHgyQSwKKzB4MkEsMHgyQSwweDJBLDB4MkEsMHgwMiwweDAwLDB4MDEsMHhDMCwweDc4LDB4NzgsMHgzQSwweDIwLDB4NzIsMHg2MywweDIwLDB4NjMsCisweDcwLDB4NzMsMHgyMCwweDJBLDB4MkEsMHgyQSwweDJBLDB4MkEsMHgwMiwweDAwLDB4MDEsMHhDMCwweDc4LDB4NzgsMHgzQSwweDIwLAorMHg3MiwweDYzLDB4MjAsMHg2MywweDcwLDB4NzMsMHgyMCwweDJBLDB4MkEsMHgyQSwweDJBLDB4MkEsMHgwMiwweDAwLDB4MDEsMHhDMCwKKzB4NzgsMHg3OCwweDNBLDB4MjAsMHg3MiwweDYzLDB4MjAsMHg2MywweDcwLDB4NzMsMHgyMCwweDJBLDB4MkEsMHgyQSwweDJBLDB4MkEsCisweDAyLDB4MDAsMHgwMSwweDgwLDB4NDksMHg2RSwweDczLDB4NzQsMHg2MSwweDZDLDB4NkMsMHgyMCwweDRDLDB4NkYsMHg2RiwweDcwLAorMHg2MiwweDYxLDB4NjMsMHg2QiwweDFGLDB4NTAsMHg3MiwweDY1LDB4NzMsMHg3MywweDIwLDB4ODAsMHgyMCwweDc0LDB4NkYsMHgyMCwKKzB4NzMsMHg3NCwweDYxLDB4NzIsMHg3NCwweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHg0MywweDYxLDB4NjIsMHg2QywweDY1LDB4MjAsCisweDc0LDB4NkYsMHgyMCwweDUyLDB4NjUsMHg2RCwweDZGLDB4NzQsMHg2NSwweDFGLDB4NTAsMHg3MiwweDY1LDB4NzMsMHg3MywweDIwLAorMHg4MCwweDIwLDB4NzQsMHg2RiwweDIwLDB4NzMsMHg3NCwweDYxLDB4NzIsMHg3NCwweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHg0QywKKzB4NkYsMHg2MywweDYxLDB4NkMsMHgyMCwweDRDLDB4NkYsMHg2RiwweDcwLDB4NjIsMHg2MSwweDYzLDB4NkIsMHgyMCwweDFGLDB4MjAsCisweDIwLDB4NTIsMHg3NSwweDZFLDB4NkUsMHg2OSwweDZFLDB4NjcsMHgyMCwweDJFLDB4MkUsMHgyRSwweDAyLDB4MDAsMHgwMSwweDgwLAorMHg1MiwweDY1LDB4NkQsMHg2RiwweDc0LDB4NjUsMHgyMCwweDRDLDB4NkYsMHg2RiwweDcwLDB4NjIsMHg2MSwweDYzLDB4NkIsMHgyMCwKKzB4MUYsMHgyMCwweDIwLDB4NTIsMHg3NSwweDZFLDB4NkUsMHg2OSwweDZFLDB4NjcsMHgyMCwweDJFLDB4MkUsMHgyRSwweDAyLDB4MDAsCisweDAxLDB4ODAsMHgyMCwweDQ5LDB4NkUsMHg3NCwweDcyLDB4NkUsMHg2QywweDIwLDB4NEMsMHg2RiwweDZGLDB4NzAsMHg2MiwweDYxLAorMHg2MywweDZCLDB4MUYsMHgyMCwweDIwLDB4NTIsMHg3NSwweDZFLDB4NkUsMHg2OSwweDZFLDB4NjcsMHgyMCwweDJFLDB4MkUsMHgyRSwKKzB4MDIsMHgwMCwweDAxLDB4ODAsMHg1NCwweDcyLDB4NjEsMHg2RSwweDczLDB4NkQsMHg2OSwweDc0LDB4MjAsMHg1MCwweDYxLDB4NzQsCisweDc0LDB4NjUsMHg3MiwweDZFLDB4MUYsMHgyMCwweDIwLDB4NTIsMHg3NSwweDZFLDB4NkUsMHg2OSwweDZFLDB4NjcsMHgyMCwweDJFLAorMHgyRSwweDJFLDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4MzAsMHgzQSwweDIwLDB4MjcsMHg0MywweDgwLDB4MDAsMHgwMSwKKzB4ODAsMHgyMCwweDIwLDB4MzEsMHgzQSwweDIwLDB4MjcsMHg0MywweDgxLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDMyLDB4M0EsCisweDIwLDB4MjcsMHg0MywweDgyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDMzLDB4M0EsMHgyMCwweDI3LDB4NDMsMHg4MywweDAwLAorMHgwMSwweDgwLDB4MjAsMHgyMCwweDM0LDB4M0EsMHgyMCwweDI3LDB4NDMsMHg4NCwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHgzNSwKKzB4M0EsMHgyMCwweDI3LDB4NDMsMHg4NSwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHgzNiwweDNBLDB4MjAsMHgyNywweDQzLDB4ODYsCisweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHgzNywweDNBLDB4MjAsMHgyNywweDQzLDB4ODcsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLAorMHgzOCwweDNBLDB4MjAsMHgyNywweDQzLDB4ODgsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4MzksMHgzQSwweDIwLDB4MjcsMHg0MywKKzB4ODksMHgwMCwweDAxLDB4ODAsMHgyMCwweDMxLDB4MzAsMHgzQSwweDIwLDB4MjcsMHg0MywweDhBLDB4MDAsMHgwMSwweDgwLDB4MjAsCisweDMxLDB4MzEsMHgzQSwweDIwLDB4MjcsMHg0MywweDhCLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgzMSwweDMyLDB4M0EsMHgyMCwweDI3LAorMHg0MywweDhDLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgzMSwweDMzLDB4M0EsMHgyMCwweDI3LDB4NDMsMHg4RCwweDAwLDB4MDEsMHg4MCwKKzB4MjAsMHgzMSwweDM0LDB4M0EsMHgyMCwweDI3LDB4NDMsMHg4RSwweDAwLDB4MDEsMHg4MCwweDIwLDB4MzEsMHgzNSwweDNBLDB4MjAsCisweDI3LDB4NDMsMHg4RiwweDAwLDB4MkEsMHgyQSwweDIwLDB4NEQsMHg2MSwweDY5LDB4NkUsMHgyMCwweDIwLDB4NEQsMHg2NSwweDZFLAorMHg3NSwweDIwLDB4MkEsMHgyQSwweDAwLDB4NEQsMHg2RiwweDZFLDB4NjksMHg3NCwweDZGLDB4NzIsMHgyMCwweDYxLDB4MjAsMHg1MCwKKzB4NkYsMHg3MiwweDc0LDB4MDAsMHg0RCwweDZGLDB4NkUsMHg2OSwweDc0LDB4NkYsMHg3MiwweDIwLDB4NjEsMHgyMCwweDUzLDB4NjksCisweDY3LDB4NkUsMHg2MSwweDZDLDB4MDAsMHg0NSwweDczLDB4NzQsMHg2OSwweDZELDB4NjEsMHg3NCwweDY1LDB4MjAsMHg0MywweDUwLAorMHg1MywweDAwLDB4NDQsMHg2OSwweDYxLDB4NjcsMHg2RSwweDZGLDB4NzMsMHg3NCwweDY5LDB4NjMsMHg3MywweDAwLDB4NEMsMHg2RiwKKzB4NjMsMHg2MSwweDZDLDB4MjAsMHg0QywweDZGLDB4NkYsMHg3MCwweDYyLDB4NjEsMHg2MywweDZCLDB4MDAsMHg1MiwweDY1LDB4NkQsCisweDZGLDB4NzQsMHg2NSwweDIwLDB4NEMsMHg2RiwweDZGLDB4NzAsMHg2MiwweDYxLDB4NjMsMHg2QiwweDAwLDB4NDksMHg2RSwweDc0LAorMHg3MiwweDZFLDB4NkMsMHgyMCwweDRDLDB4NkYsMHg2RiwweDcwLDB4NjIsMHg2MSwweDYzLDB4NkIsMHgwMCwweDU0LDB4NzIsMHg2MSwKKzB4NkUsMHg3MywweDZELDB4NjksMHg3NCwweDIwLDB4NTAsMHg2MSwweDc0LDB4NzQsMHg2NSwweDcyLDB4NkUsMHgwMCwweDQyLDB4NjEsCisweDc1LDB4NjQsMHgyMCwweDUyLDB4NjEsMHg3NCwweDY1LDB4MDAsMHg0NCwweDYxLDB4NzQsMHg2MSwweDIwLDB4NDIsMHg2OSwweDc0LAorMHg3MywweDAwLDB4NTMsMHg3NCwweDZGLDB4NzAsMHgyMCwweDQyLDB4NjksMHg3NCwweDczLDB4MDAsMHg1MCwweDYxLDB4NzIsMHg2OSwKKzB4NzQsMHg3OSwweDAwLDB4NDQsMHg2MSwweDc0LDB4NjEsMHgyMCwweDUwLDB4NjEsMHg3NCwweDc0LDB4NjUsMHg3MiwweDZFLDB4MDAsCisweDU0LDB4NzgsMHgyMCwweDQ2LDB4NkMsMHg2RiwweDc3LDB4MjAsMHg0MywweDZGLDB4NkUsMHg3NCwweDcyLDB4NkYsMHg2QywweDAwLAorMHg1MCwweDZGLDB4NzIsMHg3NCwweDIwLDB4NEUsMHg3NSwweDZELDB4NjIsMHg2NSwweDcyLDB4MDAsMHgzNSwweDMwLDB4MDAsMHgzNywKKzB4MzUsMHgwMCwweDMxLDB4MzEsMHgzMCwweDAwLDB4MzEsMHgzMywweDM0LDB4MkUsMHgzNSwweDAwLDB4MzEsMHgzNSwweDMwLDB4MDAsCisweDMyLDB4MzAsMHgzMCwweDAwLDB4MzMsMHgzMCwweDMwLDB4MDAsMHgzNiwweDMwLDB4MzAsMHgwMCwweDMxLDB4MzIsMHgzMCwweDMwLAorMHgwMCwweDMxLDB4MzgsMHgzMCwweDMwLDB4MDAsMHgzMiwweDMwLDB4MzAsMHgzMCwweDAwLDB4MzIsMHgzNCwweDMwLDB4MzAsMHgwMCwKKzB4MzMsMHgzNiwweDMwLDB4MzAsMHgwMCwweDM0LDB4MzgsMHgzMCwweDMwLDB4MDAsMHgzNywweDMyLDB4MzAsMHgzMCwweDAwLDB4MzksCisweDM2LDB4MzAsMHgzMCwweDAwLDB4MzEsMHgzOSwweDJDLDB4MzIsMHgzMCwweDMwLDB4MDAsMHgzMywweDM4LDB4MkMsMHgzNCwweDMwLAorMHgzMCwweDAwLDB4MzUsMHgzNiwweDJDLDB4MzAsMHgzMCwweDMwLDB4MDAsMHgzNSwweDM3LDB4MkMsMHgzNiwweDMwLDB4MzAsMHgwMCwKKzB4MzYsMHgzNCwweDJDLDB4MzAsMHgzMCwweDMwLDB4MDAsMHgzNywweDM2LDB4MkMsMHgzOCwweDMwLDB4MzAsMHgwMCwweDMxLDB4MzEsCisweDM1LDB4MkMsMHgzMiwweDMwLDB4MzAsMHgwMCwweDM3LDB4MjAsMHg2MiwweDY5LDB4NzQsMHg3MywweDAwLDB4MzgsMHgyMCwweDYyLAorMHg2OSwweDc0LDB4NzMsMHgwMCwweDMxLDB4MjAsMHg3MywweDc0LDB4NkYsMHg3MCwweDIwLDB4NjIsMHg2OSwweDc0LDB4MDAsMHgzMSwKKzB4MkUsMHgzNSwweDIwLDB4NzMsMHg3NCwweDZGLDB4NzAsMHgyMCwweDYyLDB4NjksMHg3NCwweDczLDB4MDAsMHgzMiwweDIwLDB4NzMsCisweDc0LDB4NkYsMHg3MCwweDIwLDB4NjIsMHg2OSwweDc0LDB4NzMsMHgwMCwweDZFLDB4NkYsMHgyMCwweDcwLDB4NjEsMHg3MiwweDY5LAorMHg3NCwweDc5LDB4MDAsMHg2RiwweDY0LDB4NjQsMHgyMCwweDcwLDB4NjEsMHg3MiwweDY5LDB4NzQsMHg3OSwweDAwLDB4NjUsMHg3NiwKKzB4NjUsMHg2RSwweDIwLDB4NzAsMHg2MSwweDcyLDB4NjksMHg3NCwweDc5LDB4MDAsMHg3MywweDcwLDB4NjEsMHg2MywweDY1LDB4MjAsCisweDcwLDB4NjEsMHg3MiwweDY5LDB4NzQsMHg3OSwweDAwLDB4NkQsMHg2MSwweDcyLDB4NkIsMHgyMCwweDcwLDB4NjEsMHg3MiwweDY5LAorMHg3NCwweDc5LDB4MDAsMHg0MywweDZGLDB4NkMsMHg3NSwweDZELDB4NkUsMHg3MywweDAwLDB4NDIsMHg2MSwweDcyLDB4NjIsMHg2NSwKKzB4NzIsMHgyMCwweDUwLDB4NkYsMHg2QywweDY1LDB4MDAsMHg1NSwweDU1LDB4NTUsMHg1NSwweDU1LDB4MkUsMHgyRSwweDJFLDB4MDAsCisweDRFLDB4NkYsMHg2RSwweDY1LDB4MDAsMHg1OCwweDZGLDB4NkUsMHgyRiwweDU4LDB4NkYsMHg2NiwweDY2LDB4MDAsMHg0MywweDU0LAorMHg1MywweDAwLDB4NTAsMHg3MiwweDY1LDB4NzMsMHg3MywweDIwLDB4ODAsMHgyMCwweDY2LDB4NkYsMHg3MiwweDIwLDB4NkQsMHg2NSwKKzB4NkUsMHg3NSwweDAwLDB4MjgsMHg2MywweDZGLDB4NzUsMHg2RSwweDc0LDB4NjksMHg2RSwweDY3LDB4MkUsMHgyRSwweDJFLDB4MjksCisweDAwLDB4MDAsMHg2NSwweDRFLDB4NjQsMHgyMCwweDRGLDB4NjYsMHgyMCwweDQzLDB4NkYsMHg0NCwweDY1LDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pMmNtZC5jIGIvZHJpdmVycy9jaGFyL2lwMi9pMmNtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMjk5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2kyY21kLmMKQEAgLTAsMCArMSwyMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgKGMpIDE5OTggYnkgQ29tcHV0b25lIENvcnBvcmF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKiAgIFBBQ0tBR0U6ICAgICBMaW51eCB0dHkgRGV2aWNlIERyaXZlciBmb3IgSW50ZWxsaVBvcnQgZmFtaWx5IG9mIG11bHRpcG9ydAorKiAgICAgICAgICAgICAgICBzZXJpYWwgSS9PIGNvbnRyb2xsZXJzLgorKgorKiAgIERFU0NSSVBUSU9OOiBEZWZpbml0aW9uIHRhYmxlIGZvciBJbi1saW5lIGFuZCBCeXBhc3MgY29tbWFuZHMuIEFwcGxpY2FibGUKKyogICAgICAgICAgICAgICAgb25seSB3aGVuIHRoZSBzdGFuZGFyZCBsb2Fkd2FyZSBpcyBhY3RpdmUuIChUaGlzIGlzIGluY2x1ZGVkCisqICAgICAgICAgICAgICAgIHNvdXJjZSBjb2RlLCBub3QgYSBzZXBhcmF0ZSBjb21waWxhdGlvbiBtb2R1bGUuKQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBSZXZpc2lvbiBIaXN0b3J5OgorLy8KKy8vIDEwIE9jdG9iZXIgMTk5MSAgIE1BRyBGaXJzdCBEcmFmdAorLy8gIDcgTm92ZW1iZXIgMTk5MSAgTUFHIFJlZmxlY3RzIGFkZGl0aW9uYWwgY29tbWFuZHMuCisvLyAyNCBGZWJydWFyeSAxOTkyICBNQUcgQWRkaXRpb25hbCBjb21tYW5kcyBmb3IgMS40LnggbG9hZHdhcmUKKy8vIDExIE1hcmNoIDE5OTIgICAgIE1BRyBBZGRpdGlvbmFsIGNvbW1hbmRzCisvLyAzMCBNYXJjaCAxOTkyICAgICBNQUcgQWRkaXRpb25hbCBjb21tYW5kOiBDTURfRFNTX05PVworLy8gMTggTWF5IDE5OTIgICAgICAgTUFHIERpc2NvdmVyZWQgY29tbWFuZHMgMzkgJiA0MCBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgYQorLy8gICAgICAgICAgICAgICAgICAgICAgIHBhY2tldDogYWZmZWN0cyBpbXBsZW1lbnRhdGlvbi4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vKioqKioqKioqKioqCisvLyogSW5jbHVkZXMgKgorLy8qKioqKioqKioqKioKKworI2luY2x1ZGUgImkyY21kLmgiICAgLyogVG8gZ2V0IHNvbWUgYml0LWRlZmluZXMgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlcmUgaXMgdGhlIHRhYmxlIG9mIGdsb2JhbCBhcnJheXMgd2hpY2ggcmVwcmVzZW50IGVhY2ggdHlwZSBvZiBjb21tYW5kCisvLyBzdXBwb3J0ZWQgaW4gdGhlIEludGVsbGlQb3J0IHN0YW5kYXJkIGxvYWR3YXJlLiBTZWUgYWxzbyBpMmNtZC5oCisvLyBmb3IgYSBtb3JlIGNvbXBsZXRlIGV4cGxhbmF0aW9uIG9mIHdoYXQgaXMgZ29pbmcgb24uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBIZXJlIGFyZSB0aGUgdmFyaW91cyBnbG9iYWxzOiBub3RlIHRoYXQgdGhlIG5hbWVzIGFyZSBub3QgdXNlZCBleGNlcHQgdGhyb3VnaAorLy8gdGhlIG1hY3JvcyBkZWZpbmVkIGluIGkyY21kLmguIEFsc28gbm90ZSB0aGF0IGFsdGhvdWdoIHRoZXkgYXJlIGNoYXJhY3RlcgorLy8gYXJyYXlzIGhlcmUgKGZvciBleHRlbmRhYmlsaXR5KSB0aGV5IGFyZSBjYXN0IHRvIHN0cnVjdHVyZSBwb2ludGVycyBpbiB0aGUKKy8vIGkyY21kLmggbWFjcm9zLiBTZWUgaTJjbWQuaCBmb3IgZmxhZ3MgZGVmaW5pdGlvbnMuCisKKy8vICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoIEZsYWdzIENvbW1hbmQKK3N0YXRpYyBVQ0hBUiBjdDAyW10gPSB7IDEsIEJUSCwgICAgIDB4MDIgICAgICAgICAgICAgICAgICAgICB9OyAvLyBEVFIgVVAKK3N0YXRpYyBVQ0hBUiBjdDAzW10gPSB7IDEsIEJUSCwgICAgIDB4MDMgICAgICAgICAgICAgICAgICAgICB9OyAvLyBEVFIgRE4KK3N0YXRpYyBVQ0hBUiBjdDA0W10gPSB7IDEsIEJUSCwgICAgIDB4MDQgICAgICAgICAgICAgICAgICAgICB9OyAvLyBSVFMgVVAKK3N0YXRpYyBVQ0hBUiBjdDA1W10gPSB7IDEsIEJUSCwgICAgIDB4MDUgICAgICAgICAgICAgICAgICAgICB9OyAvLyBSVFMgRE4KK3N0YXRpYyBVQ0hBUiBjdDA2W10gPSB7IDEsIEJZUCwgICAgIDB4MDYgICAgICAgICAgICAgICAgICAgICB9OyAvLyBTVEFSVCBGTAorc3RhdGljIFVDSEFSIGN0MDdbXSA9IHsgMiwgQlRILCAgICAgMHgwNywwICAgICAgICAgICAgICAgICAgIH07IC8vIEJBVUQKK3N0YXRpYyBVQ0hBUiBjdDA4W10gPSB7IDIsIEJUSCwgICAgIDB4MDgsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBCSVRTCitzdGF0aWMgVUNIQVIgY3QwOVtdID0geyAyLCBCVEgsICAgICAweDA5LDAgICAgICAgICAgICAgICAgICAgfTsgLy8gU1RPUAorc3RhdGljIFVDSEFSIGN0MTBbXSA9IHsgMiwgQlRILCAgICAgMHgwQSwwICAgICAgICAgICAgICAgICAgIH07IC8vIFBBUklUWQorc3RhdGljIFVDSEFSIGN0MTFbXSA9IHsgMiwgQlRILCAgICAgMHgwQiwwICAgICAgICAgICAgICAgICAgIH07IC8vIFhPTgorc3RhdGljIFVDSEFSIGN0MTJbXSA9IHsgMiwgQlRILCAgICAgMHgwQywwICAgICAgICAgICAgICAgICAgIH07IC8vIFhPRkYKK3N0YXRpYyBVQ0hBUiBjdDEzW10gPSB7IDEsIEJUSCwgICAgIDB4MEQgICAgICAgICAgICAgICAgICAgICB9OyAvLyBTVE9QIEZMCitzdGF0aWMgVUNIQVIgY3QxNFtdID0geyAxLCBCWVB8VklQLCAweDBFICAgICAgICAgICAgICAgICAgICAgfTsgLy8gQUNLIEhPVEsKKy8vc3RhdGljIFVDSEFSIGN0MTVbXT17IDIsIEJUSHxWSVAsIDB4MEYsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBJUlEgU0VUCitzdGF0aWMgVUNIQVIgY3QxNltdID0geyAyLCBJTkwsICAgICAweDEwLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gSVhPTk9QVFMKK3N0YXRpYyBVQ0hBUiBjdDE3W10gPSB7IDIsIElOTCwgICAgIDB4MTEsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBPWE9OT1BUUworc3RhdGljIFVDSEFSIGN0MThbXSA9IHsgMSwgSU5MLCAgICAgMHgxMiAgICAgICAgICAgICAgICAgICAgIH07IC8vIENUU0VOQUIKK3N0YXRpYyBVQ0hBUiBjdDE5W10gPSB7IDEsIEJUSCwgICAgIDB4MTMgICAgICAgICAgICAgICAgICAgICB9OyAvLyBDVFNEU0FCCitzdGF0aWMgVUNIQVIgY3QyMFtdID0geyAxLCBJTkwsICAgICAweDE0ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gRENERU5BQgorc3RhdGljIFVDSEFSIGN0MjFbXSA9IHsgMSwgQlRILCAgICAgMHgxNSAgICAgICAgICAgICAgICAgICAgIH07IC8vIERDRERTQUIKK3N0YXRpYyBVQ0hBUiBjdDIyW10gPSB7IDEsIEJUSCwgICAgIDB4MTYgICAgICAgICAgICAgICAgICAgICB9OyAvLyBEU1JFTkFCCitzdGF0aWMgVUNIQVIgY3QyM1tdID0geyAxLCBCVEgsICAgICAweDE3ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gRFNSRFNBQgorc3RhdGljIFVDSEFSIGN0MjRbXSA9IHsgMSwgQlRILCAgICAgMHgxOCAgICAgICAgICAgICAgICAgICAgIH07IC8vIFJJRU5BQgorc3RhdGljIFVDSEFSIGN0MjVbXSA9IHsgMSwgQlRILCAgICAgMHgxOSAgICAgICAgICAgICAgICAgICAgIH07IC8vIFJJRFNBQgorc3RhdGljIFVDSEFSIGN0MjZbXSA9IHsgMiwgQlRILCAgICAgMHgxQSwwICAgICAgICAgICAgICAgICAgIH07IC8vIEJSS0VOQUIKK3N0YXRpYyBVQ0hBUiBjdDI3W10gPSB7IDEsIEJUSCwgICAgIDB4MUIgICAgICAgICAgICAgICAgICAgICB9OyAvLyBCUktEU0FCCisvL3N0YXRpYyBVQ0hBUiBjdDI4W109eyAyLCBCVEgsICAgICAweDFDLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gTUFYQkxPS1NJWkUKKy8vc3RhdGljIFVDSEFSIGN0MjlbXT17IDIsIDAsICAgICAgIDB4MUQsMCAgICAgICAgICAgICAgICAgICB9OyAvLyByZXNlcnZlZAorc3RhdGljIFVDSEFSIGN0MzBbXSA9IHsgMSwgSU5MLCAgICAgMHgxRSAgICAgICAgICAgICAgICAgICAgIH07IC8vIENUU0ZMT1dFTkFCCitzdGF0aWMgVUNIQVIgY3QzMVtdID0geyAxLCBJTkwsICAgICAweDFGICAgICAgICAgICAgICAgICAgICAgfTsgLy8gQ1RTRkxPV0RTQUIKK3N0YXRpYyBVQ0hBUiBjdDMyW10gPSB7IDEsIElOTCwgICAgIDB4MjAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBSVFNGTE9XRU5BQgorc3RhdGljIFVDSEFSIGN0MzNbXSA9IHsgMSwgSU5MLCAgICAgMHgyMSAgICAgICAgICAgICAgICAgICAgIH07IC8vIFJUU0ZMT1dEU0FCCitzdGF0aWMgVUNIQVIgY3QzNFtdID0geyAyLCBCVEgsICAgICAweDIyLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gSVNUUklQTU9ERQorc3RhdGljIFVDSEFSIGN0MzVbXSA9IHsgMiwgQlRIfEVORCwgMHgyMywwICAgICAgICAgICAgICAgICAgIH07IC8vIFNFTkRCUkVBSworc3RhdGljIFVDSEFSIGN0MzZbXSA9IHsgMiwgQlRILCAgICAgMHgyNCwwICAgICAgICAgICAgICAgICAgIH07IC8vIFNFVEVSUk1PREUKKy8vc3RhdGljIFVDSEFSIGN0MzZhW109eyAzLCBJTkwsICAgIDB4MjQsMCwwICAgICAgICAgICAgICAgICB9OyAvLyBTRVRfUkVQTEFDRQorCisvLyBUaGUgZm9sbG93aW5nIGlzIGxpc3RlZCBmb3IgY29tcGxldGVuZXNzLCBidXQgc2hvdWxkIG5ldmVyIGJlIHNlbnQgZGlyZWN0bHkKKy8vIGJ5IHVzZXItbGV2ZWwgY29kZS4gSXQgaXMgc2VudCBvbmx5IGJ5IGxpYnJhcnkgcm91dGluZXMgaW4gcmVzcG9uc2UgdG8gZGF0YQorLy8gbW92ZW1lbnQuCisvL3N0YXRpYyBVQ0hBUiBjdDM3W109eyA1LCBCWVB8VklQLCAweDI1LDAsMCwwLDAgICAgICAgICAgICAgfTsgLy8gRkxPVyBQQUNLRVQKKworLy8gQmFjayB0byBub3JtYWwKKy8vc3RhdGljIFVDSEFSIGN0MzhbXSA9IHsxMSwgQlRIfFZBUiwgMHgyNiwwLDAsMCwwLDAsMCwwLDAsMCwwIH07IC8vIERFRiBLRVkgU0VRCisvL3N0YXRpYyBVQ0hBUiBjdDM5W109eyAzLCBCVEh8RU5ELCAweDI3LDAsMCAgICAgICAgICAgICAgICAgfTsgLy8gT1BPU1RPTgorLy9zdGF0aWMgVUNIQVIgY3Q0MFtdPXsgMSwgQlRIfEVORCwgMHgyOCAgICAgICAgICAgICAgICAgICAgIH07IC8vIE9QT1NUT0ZGCitzdGF0aWMgVUNIQVIgY3Q0MVtdID0geyAxLCBCWVAsICAgICAweDI5ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gUkVTVU1FCisvL3N0YXRpYyBVQ0hBUiBjdDQyW109eyAyLCBCVEgsICAgICAweDJBLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gVFhCQVVECisvL3N0YXRpYyBVQ0hBUiBjdDQzW109eyAyLCBCVEgsICAgICAweDJCLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gUlhCQVVECisvL3N0YXRpYyBVQ0hBUiBjdDQ0W109eyAyLCBCVEgsICAgICAweDJDLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gTVMgUElORworLy9zdGF0aWMgVUNIQVIgY3Q0NVtdPXsgMSwgQlRILCAgICAgMHgyRCAgICAgICAgICAgICAgICAgICAgIH07IC8vIEhPVEVOQUIKKy8vc3RhdGljIFVDSEFSIGN0NDZbXT17IDEsIEJUSCwgICAgIDB4MkUgICAgICAgICAgICAgICAgICAgICB9OyAvLyBIT1REU0FCCitzdGF0aWMgVUNIQVIgY3Q0N1tdID0geyA3LCBCVEgsICAgICAweDJGLDAsMCwwLDAsMCwwICAgICAgICAgfTsgLy8gVU5JWCBGTEFHUworLy9zdGF0aWMgVUNIQVIgY3Q0OFtdPXsgMSwgQlRILCAgICAgMHgzMCAgICAgICAgICAgICAgICAgICAgIH07IC8vIERTUkZMT1dFTkFCCisvL3N0YXRpYyBVQ0hBUiBjdDQ5W109eyAxLCBCVEgsICAgICAweDMxICAgICAgICAgICAgICAgICAgICAgfTsgLy8gRFNSRkxPV0RTQUIKKy8vc3RhdGljIFVDSEFSIGN0NTBbXT17IDEsIEJUSCwgICAgIDB4MzIgICAgICAgICAgICAgICAgICAgICB9OyAvLyBEVFJGTE9XRU5BQgorLy9zdGF0aWMgVUNIQVIgY3Q1MVtdPXsgMSwgQlRILCAgICAgMHgzMyAgICAgICAgICAgICAgICAgICAgIH07IC8vIERUUkZMT1dEU0FCCisvL3N0YXRpYyBVQ0hBUiBjdDUyW109eyAxLCBCVEgsICAgICAweDM0ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gQkFVRFRBQlJFU0VUCisvL3N0YXRpYyBVQ0hBUiBjdDUzW10gPSB7IDMsIEJUSCwgICAgIDB4MzUsMCwwICAgICAgICAgICAgICAgICB9OyAvLyBCQVVEUkVNQVAKK3N0YXRpYyBVQ0hBUiBjdDU0W10gPSB7IDMsIEJUSCwgICAgIDB4MzYsMCwwICAgICAgICAgICAgICAgICB9OyAvLyBDVVNUT01CQVVEMQorc3RhdGljIFVDSEFSIGN0NTVbXSA9IHsgMywgQlRILCAgICAgMHgzNywwLDAgICAgICAgICAgICAgICAgIH07IC8vIENVU1RPTUJBVUQyCitzdGF0aWMgVUNIQVIgY3Q1NltdID0geyAyLCBCVEh8RU5ELCAweDM4LDAgICAgICAgICAgICAgICAgICAgfTsgLy8gUEFVU0UKK3N0YXRpYyBVQ0hBUiBjdDU3W10gPSB7IDEsIEJZUCwgICAgIDB4MzkgICAgICAgICAgICAgICAgICAgICB9OyAvLyBTVVNQRU5ECitzdGF0aWMgVUNIQVIgY3Q1OFtdID0geyAxLCBCWVAsICAgICAweDNBICAgICAgICAgICAgICAgICAgICAgfTsgLy8gVU5TVVNQRU5ECitzdGF0aWMgVUNIQVIgY3Q1OVtdID0geyAyLCBCVEgsICAgICAweDNCLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gUEFSSVRZQ0hLCitzdGF0aWMgVUNIQVIgY3Q2MFtdID0geyAxLCBJTkx8VklQLCAweDNDICAgICAgICAgICAgICAgICAgICAgfTsgLy8gQk9PS01BUktSRVEKKy8vc3RhdGljIFVDSEFSIGN0NjFbXT17IDIsIEJUSCwgICAgIDB4M0QsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBJTlRFUk5BTExPT1AKKy8vc3RhdGljIFVDSEFSIGN0NjJbXT17IDIsIEJUSCwgICAgIDB4M0UsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBIT1RLVElNRU9VVAorc3RhdGljIFVDSEFSIGN0NjNbXSA9IHsgMiwgSU5MLCAgICAgMHgzRiwwICAgICAgICAgICAgICAgICAgIH07IC8vIFNFVFRYT04KK3N0YXRpYyBVQ0hBUiBjdDY0W10gPSB7IDIsIElOTCwgICAgIDB4NDAsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBTRVRUWE9GRgorLy9zdGF0aWMgVUNIQVIgY3Q2NVtdPXsgMiwgQlRILCAgICAgMHg0MSwwICAgICAgICAgICAgICAgICAgIH07IC8vIFNFVEFVVE9SVFMKKy8vc3RhdGljIFVDSEFSIGN0NjZbXT17IDIsIEJUSCwgICAgIDB4NDIsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBTRVRISUdIV0FUCisvL3N0YXRpYyBVQ0hBUiBjdDY3W109eyAyLCBCWVAsICAgICAweDQzLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gU1RBUlRTRUxGTAorLy9zdGF0aWMgVUNIQVIgY3Q2OFtdPXsgMiwgSU5MLCAgICAgMHg0NCwwICAgICAgICAgICAgICAgICAgIH07IC8vIEVORFNFTEZMCisvL3N0YXRpYyBVQ0hBUiBjdDY5W109eyAxLCBCWVAsICAgICAweDQ1ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gSFdGTE9XX09GRgorLy9zdGF0aWMgVUNIQVIgY3Q3MFtdPXsgMSwgQlRILCAgICAgMHg0NiAgICAgICAgICAgICAgICAgICAgIH07IC8vIE9EU1JGTF9FTkFCCisvL3N0YXRpYyBVQ0hBUiBjdDcxW109eyAxLCBCVEgsICAgICAweDQ3ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gT0RTUkZMX0RTQUIKKy8vc3RhdGljIFVDSEFSIGN0NzJbXT17IDEsIEJUSCwgICAgIDB4NDggICAgICAgICAgICAgICAgICAgICB9OyAvLyBPRENERkxfRU5BQgorLy9zdGF0aWMgVUNIQVIgY3Q3M1tdPXsgMSwgQlRILCAgICAgMHg0OSAgICAgICAgICAgICAgICAgICAgIH07IC8vIE9EQ0RGTF9EU0FCCisvL3N0YXRpYyBVQ0hBUiBjdDc0W109eyAyLCBCVEgsICAgICAweDRBLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gTE9BRExFVkVMCisvL3N0YXRpYyBVQ0hBUiBjdDc1W109eyAyLCBCVEgsICAgICAweDRCLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gU1RBVERBVEEKKy8vc3RhdGljIFVDSEFSIGN0NzZbXT17IDEsIEJZUCwgICAgIDB4NEMgICAgICAgICAgICAgICAgICAgICB9OyAvLyBCUkVBS19PTgorLy9zdGF0aWMgVUNIQVIgY3Q3N1tdPXsgMSwgQllQLCAgICAgMHg0RCAgICAgICAgICAgICAgICAgICAgIH07IC8vIEJSRUFLX09GRgorLy9zdGF0aWMgVUNIQVIgY3Q3OFtdPXsgMSwgQllQLCAgICAgMHg0RSAgICAgICAgICAgICAgICAgICAgIH07IC8vIEdFVEZDCitzdGF0aWMgVUNIQVIgY3Q3OVtdID0geyAyLCBCWVAsICAgICAweDRGLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gWE1JVF9OT1cKKy8vc3RhdGljIFVDSEFSIGN0ODBbXT17IDQsIEJUSCwgICAgIDB4NTAsMCwwLDAgICAgICAgICAgICAgICB9OyAvLyBESVZJU09SX0xBVENICisvL3N0YXRpYyBVQ0hBUiBjdDgxW109eyAxLCBCWVAsICAgICAweDUxICAgICAgICAgICAgICAgICAgICAgfTsgLy8gR0VUX1NUQVRVUworLy9zdGF0aWMgVUNIQVIgY3Q4MltdPXsgMSwgQllQLCAgICAgMHg1MiAgICAgICAgICAgICAgICAgICAgIH07IC8vIEdFVF9UWENOVAorLy9zdGF0aWMgVUNIQVIgY3Q4M1tdPXsgMSwgQllQLCAgICAgMHg1MyAgICAgICAgICAgICAgICAgICAgIH07IC8vIEdFVF9SWENOVAorLy9zdGF0aWMgVUNIQVIgY3Q4NFtdPXsgMSwgQllQLCAgICAgMHg1NCAgICAgICAgICAgICAgICAgICAgIH07IC8vIEdFVF9CT1hJRFMKKy8vc3RhdGljIFVDSEFSIGN0ODVbXT17MTAsIEJZUCwgICAgIDB4NTUsMCwwLDAsMCwwLDAsMCwwLDAgICB9OyAvLyBFTkFCX01VTFQKKy8vc3RhdGljIFVDSEFSIGN0ODZbXT17IDIsIEJUSCwgICAgIDB4NTYsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBSQ1ZfRU5BQkxFCitzdGF0aWMgVUNIQVIgY3Q4N1tdID0geyAxLCBCWVAsICAgICAweDU3ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gSFdfVEVTVAorLy9zdGF0aWMgVUNIQVIgY3Q4OFtdPXsgMywgQlRILCAgICAgMHg1OCwwLDAgICAgICAgICAgICAgICAgIH07IC8vIFJDVl9USFJFU0hPTEQKK3N0YXRpYyBVQ0hBUiBjdDg5W109eyAxLCBCWVAsICAgICAweDU5ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gRFNTX05PVworLy9zdGF0aWMgVUNIQVIgY3Q5MFtdPXsgMywgQllQLCAgICAgMHg1QSwwLDAgICAgICAgICAgICAgICAgIH07IC8vIFNldCBTSUxPCisvL3N0YXRpYyBVQ0hBUiBjdDkxW109eyAyLCBCWVAsICAgICAweDVCLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gdGltZWQgYnJlYWsKKworLy8gU29tZSBjb21wb3NpdGUgY29tbWFuZHMgYXMgd2VsbAorLy9zdGF0aWMgVUNIQVIgY2MwMVtdPXsgMiwgQlRILCAgICAgMHgwMiwweDA0ICAgICAgICAgICAgICAgIH07IC8vIERUUiAmIFJUUyBVUAorLy9zdGF0aWMgVUNIQVIgY2MwMltdPXsgMiwgQlRILCAgICAgMHgwMywweDA1ICAgICAgICAgICAgICAgIH07IC8vIERUUiAmIFJUUyBETgorCisvLyoqKioqKioqCisvLyogQ29kZSAqCisvLyoqKioqKioqCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMmNtZFVuaXhGbGFncyhpZmxhZywgY2ZsYWcsIGxmbGFnKQorLy8gUGFyYW1ldGVyczogVW5peCB0dHkgZmxhZ3MKKy8vCisvLyBSZXR1cm5zOiAgICBQb2ludGVyIHRvIGNvbW1hbmQgc3RydWN0dXJlCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gVGhpcyByb3V0aW5lIHNldHMgdGhlIHBhcmFtZXRlcnMgb2YgY29tbWFuZCA0NyBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCisvLyBhcHByb3ByaWF0ZSBzdHJ1Y3R1cmUuCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorY21kU3ludGF4UHRyCitpMmNtZFVuaXhGbGFncyh1bnNpZ25lZCBzaG9ydCBpZmxhZyx1bnNpZ25lZCBzaG9ydCBjZmxhZyx1bnNpZ25lZCBzaG9ydCBsZmxhZykKK3sKKwljbWRTeW50YXhQdHIgcENNID0gKGNtZFN5bnRheFB0cikgY3Q0NzsKKworCXBDTS0+Y21kWzFdID0gKHVuc2lnbmVkIGNoYXIpICBpZmxhZzsKKwlwQ00tPmNtZFsyXSA9ICh1bnNpZ25lZCBjaGFyKSAoaWZsYWcgPj4gOCk7CisJcENNLT5jbWRbM10gPSAodW5zaWduZWQgY2hhcikgIGNmbGFnOworCXBDTS0+Y21kWzRdID0gKHVuc2lnbmVkIGNoYXIpIChjZmxhZyA+PiA4KTsKKwlwQ00tPmNtZFs1XSA9ICh1bnNpZ25lZCBjaGFyKSAgbGZsYWc7CisJcENNLT5jbWRbNl0gPSAodW5zaWduZWQgY2hhcikgKGxmbGFnID4+IDgpOworCXJldHVybiBwQ007Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMmNtZEJhdWREZWYod2hpY2gsIHJhdGUpCisvLyBQYXJhbWV0ZXJzOiA/CisvLworLy8gUmV0dXJuczogICAgUG9pbnRlciB0byBjb21tYW5kIHN0cnVjdHVyZQorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFRoaXMgcm91dGluZSBzZXRzIHRoZSBwYXJhbWV0ZXJzIG9mIGNvbW1hbmRzIDU0IG9yIDU1IChhY2NvcmRpbmcgdG8gdGhlCisvLyBhcmd1bWVudCB3aGljaCksIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgc3RydWN0dXJlLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2NtZFN5bnRheFB0cgoraTJjbWRCYXVkRGVmKGludCB3aGljaCwgdW5zaWduZWQgc2hvcnQgcmF0ZSkKK3sKKwljbWRTeW50YXhQdHIgcENNOworCisJc3dpdGNoKHdoaWNoKQorCXsKKwljYXNlIDE6CisJCXBDTSA9IChjbWRTeW50YXhQdHIpIGN0NTQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSAyOgorCQlwQ00gPSAoY21kU3ludGF4UHRyKSBjdDU1OworCQlicmVhazsKKwl9CisJcENNLT5jbWRbMV0gPSAodW5zaWduZWQgY2hhcikgcmF0ZTsKKwlwQ00tPmNtZFsyXSA9ICh1bnNpZ25lZCBjaGFyKSAocmF0ZSA+PiA4KTsKKwlyZXR1cm4gcENNOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kyY21kLmggYi9kcml2ZXJzL2NoYXIvaXAyL2kyY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxNzI4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvaTJjbWQuaApAQCAtMCwwICsxLDY0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAoYykgMTk5OSBieSBDb21wdXRvbmUgQ29ycG9yYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqICAgUEFDS0FHRTogICAgIExpbnV4IHR0eSBEZXZpY2UgRHJpdmVyIGZvciBJbnRlbGxpUG9ydCBJSSBmYW1pbHkgb2YgbXVsdGlwb3J0CisqICAgICAgICAgICAgICAgIHNlcmlhbCBJL08gY29udHJvbGxlcnMuCisqCisqICAgREVTQ1JJUFRJT046IERlZmluaXRpb25zIGFuZCBzdXBwb3J0IGZvciBJbi1saW5lIGFuZCBCeXBhc3MgY29tbWFuZHMuCisqICAgICAgICAgICAgICAgIEFwcGxpY2FibGUgb25seSB3aGVuIHRoZSBzdGFuZGFyZCBsb2Fkd2FyZSBpcyBhY3RpdmUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmlzaW9uIEhpc3Rvcnk6CisvLworLy8gMTAgT2N0b2JlciAxOTkxICAgTUFHIEZpcnN0IERyYWZ0CisvLyAgNyBOb3ZlbWJlciAxOTkxICBNQUcgUmVmbGVjdHMgc29tZSBuZXcgY29tbWFuZHMKKy8vIDIwIEZlYnJ1YXJ5IDE5OTIgIE1BRyBDTURfSE9UQUNLIGNvcnJlY3RlZDogbm8gYXJndW1lbnQuCisvLyAyNCBGZWJydWFyeSAxOTkyICBNQUcgU3VwcG9ydCBhZGRlZCBmb3IgbmV3IGNvbW1hbmRzIGZvciAxLjQueCBsb2Fkd2FyZS4KKy8vIDExIE1hcmNoIDE5OTIgICAgIE1BRyBBZGRpdGlvbmFsIGNvbW1hbmRzLgorLy8gMTYgTWFyY2ggMTk5MiAgICAgTUFHIEFkZGl0aW9uYWwgY29tbWFuZHMuCisvLyAzMCBNYXJjaCAxOTkyICAgICBNQUcgQWRkaXRpb25hbCBjb21tYW5kOiBDTURfRFNTX05PVworLy8gMTggTWF5ICAgMTk5MiAgICAgTUFHIENoYW5nZWQgQ01EX09QT1NUCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZm5kZWYgSTJDTURfSCAgICAgIC8vIFRvIHByZXZlbnQgbXVsdGlwbGUgaW5jbHVkZXMKKyNkZWZpbmUgSTJDTURfSCAgIDEKKworI2luY2x1ZGUgImlwMnR5cGVzLmgiCisKKy8vIFRoaXMgbW9kdWxlIGlzIGRlc2lnbmVkIHRvIHByb3ZpZGUgYSB1bmlmb3JtIG1ldGhvZCBvZiBzZW5kaW5nIGNvbW1hbmRzIHRvCisvLyB0aGUgYm9hcmQgdGhyb3VnaCBjb21tYW5kIHBhY2tldHMuIFRoZSBkaWZmaWN1bHR5IGlzLCBzb21lIGNvbW1hbmRzIHRha2UKKy8vIHBhcmFtZXRlcnMsIG90aGVycyBkbyBub3QuIEZ1cnRoZXJtb3JlLCBpdCBpcyBvZnRlbiB1c2VmdWwgdG8gc2VuZCBzZXZlcmFsCisvLyBjb21tYW5kcyB0byB0aGUgc2FtZSBjaGFubmVsIGFzIHBhcnQgb2YgdGhlIHNhbWUgcGFja2V0LiAoU2VlIGFsc28gaTJwYWNrLmguKQorLy8KKy8vIFRoaXMgbW9kdWxlIGlzIGRlc2lnbmVkIHNvIHRoYXQgdGhlIGNhbGxlciBzaG91bGQgbm90IGJlIHJlc3BvbnNpYmxlIGZvcgorLy8gcmVtZW1iZXJpbmcgdGhlIGV4YWN0IHN5bnRheCBvZiBlYWNoIGNvbW1hbmQsIG9yIGF0IGxlYXN0IHNvIHRoYXQgdGhlCisvLyBjb21waWxlciBjb3VsZCBjaGVjayB0aGluZ3Mgc29tZXdoYXQuIEknbGwgZXhwbGFpbiBhcyB3ZSBnby4uLgorLy8KKy8vIEZpcnN0LCBhIHN0cnVjdHVyZSB3aGljaCBjYW4gZW1ib2R5IHRoZSBzeW50YXggb2YgZWFjaCB0eXBlIG9mIGNvbW1hbmQuCisvLwordHlwZWRlZiBzdHJ1Y3QgX2NtZFN5bnRheAoreworCVVDSEFSIGxlbmd0aDsgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGNvbW1hbmQKKwlVQ0hBUiBmbGFnczsgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbW1hbmQgKHNlZSBiZWxvdykKKworCS8vIFRoZSBjb21tYW5kIGFuZCBpdHMgcGFyYW1ldGVycywgd2hpY2ggbWF5IGJlIG9mIGFyYml0cmFyeSBsZW5ndGguIERvbid0CisJLy8gd29ycnkgeWV0IGhvdyB0aGUgcGFyYW1ldGVycyB3aWxsIGJlIGluaXRpYWxpemVkOyBtYWNyb3MgbGF0ZXIgdGFrZSBjYXJlCisJLy8gb2YgaXQuIEFsc28sIGRvbid0IHdvcnJ5IGFib3V0IHRoZSBhcmJpdHJhcnkgbGVuZ3RoIGlzc3VlOyB0aGlzIHN0cnVjdHVyZQorCS8vIGlzIG5ldmVyIHVzZWQgdG8gYWxsb2NhdGUgc3BhY2UgKHNlZSBpMmNtZC5jKS4KKwlVQ0hBUiBjbWRbMl07Cit9IGNtZFN5bnRheCwgKmNtZFN5bnRheFB0cjsKKworLy8gQml0IGFzc2lnbm1lbnRzIGZvciBmbGFncworCisjZGVmaW5lIElOTCAxICAgICAgICAgICAvLyBTZXQgaWYgc3VpdGFibGUgZm9yIGlubGluZSBjb21tYW5kcworI2RlZmluZSBCWVAgMiAgICAgICAgICAgLy8gU2V0IGlmIHN1aXRhYmxlIGZvciBieXBhc3MgY29tbWFuZHMKKyNkZWZpbmUgQlRIIChJTkx8QllQKSAgIC8vIHN1aXRhYmxlIGZvciBlaXRoZXIhCisjZGVmaW5lIEVORCA0ICAgICAgICAgICAvLyBTZXQgaWYgdGhpcyBtdXN0IGJlIHRoZSBsYXN0IGNvbW1hbmQgaW4gYSBibG9jaworI2RlZmluZSBWSVAgOCAgICAgICAgICAgLy8gU2V0IGlmIHRoaXMgY29tbWFuZCBpcyBzcGVjaWFsIGluIHNvbWUgd2F5IGFuZCByZWFsbHkKKwkJCQkJCS8vIHNob3VsZCBvbmx5IGJlIHNlbnQgZnJvbSB0aGUgbGlicmFyeS1sZXZlbCBhbmQgbm90CisJCQkJCQkvLyBkaXJlY3RseSBmcm9tIHVzZXItbGV2ZWwKKyNkZWZpbmUgVkFSIDB4MTAgICAgICAgIC8vIFRoaXMgY29tbWFuZCBpcyBvZiB2YXJpYWJsZSBsZW5ndGghCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEV4dGVybmFsIGRlY2xhcmF0aW9ucyBmb3IgaTJjbWQuYworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZSB0byBzZXQgdXAgcGFyYW1ldGVycyBmb3IgdGhlICJkZWZpbmUgaG90LWtleSBzZXF1ZW5jZSIgY29tbWFuZC4gU2luY2UKKy8vIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyIHRvIGFzc2lnbiwgd2UgbXVzdCB1c2UgYSBmdW5jdGlvbiByYXRoZXIKKy8vIHRoYW4gYSBtYWNybyAodXNlZCB1c3VhbGx5KS4KKy8vCitleHRlcm4gY21kU3ludGF4UHRyIGkyY21kVW5peEZsYWdzKFVTSE9SVCBpZmxhZyxVU0hPUlQgY2ZsYWcsVVNIT1JUIGxmbGFnKTsKK2V4dGVybiBjbWRTeW50YXhQdHIgaTJjbWRCYXVkRGVmKGludCB3aGljaCwgVVNIT1JUIHJhdGUpOworCisvLyBEZWNsYXJhdGlvbnMgZm9yIHRoZSBnbG9iYWwgYXJyYXlzIHVzZWQgdG8gYmVhciB0aGUgY29tbWFuZHMgYW5kIHRoZWlyCisvLyBhcmd1bWVudHMuCisvLworLy8gTm90ZTogU2luY2UgdGhlc2UgYXJlIGdsb2JhbHMgYW5kIHRoZSBhcmd1bWVudHMgbWlnaHQgY2hhbmdlLCBpdCBpcyBpbXBvcnRhbnQKKy8vIHRoYXQgdGhlIGxpYnJhcnkgcm91dGluZSBDT1BZIHRoZXNlIGludG8gYnVmZmVycyBmcm9tIHdoZW5jZSB0aGV5IHdvdWxkIGJlCisvLyBzZW50LCByYXRoZXIgdGhhbiBtZXJlbHkgc3RvcmluZyB0aGUgcG9pbnRlcnMuIEluIG11bHRpLXRocmVhZGVkCisvLyBlbnZpcm9ubWVudHMsIGltcG9ydGFudCB0aGF0IHRoZSBjb3B5IHNob3VsZCBvYnRhaW4gYmVmb3JlIGFueSBjb250ZXh0IHN3aXRjaAorLy8gaXMgYWxsb3dlZC4gQWxzbywgZm9yIHBhcmFtZXRlcml6ZWQgY29tbWFuZHMsIERPIE5PVCBJU1NVRSBUSEUgU0FNRSBDT01NQU5ECisvLyBNT1JFIFRIQU4gT05DRSBXSVRIIFRIRSBTQU1FIFBBUkFNRVRFUlMgaW4gdGhlIHNhbWUgY2FsbC4KKy8vCitzdGF0aWMgVUNIQVIgY3QwMltdOworc3RhdGljIFVDSEFSIGN0MDNbXTsKK3N0YXRpYyBVQ0hBUiBjdDA0W107CitzdGF0aWMgVUNIQVIgY3QwNVtdOworc3RhdGljIFVDSEFSIGN0MDZbXTsKK3N0YXRpYyBVQ0hBUiBjdDA3W107CitzdGF0aWMgVUNIQVIgY3QwOFtdOworc3RhdGljIFVDSEFSIGN0MDlbXTsKK3N0YXRpYyBVQ0hBUiBjdDEwW107CitzdGF0aWMgVUNIQVIgY3QxMVtdOworc3RhdGljIFVDSEFSIGN0MTJbXTsKK3N0YXRpYyBVQ0hBUiBjdDEzW107CitzdGF0aWMgVUNIQVIgY3QxNFtdOworc3RhdGljIFVDSEFSIGN0MTVbXTsKK3N0YXRpYyBVQ0hBUiBjdDE2W107CitzdGF0aWMgVUNIQVIgY3QxN1tdOworc3RhdGljIFVDSEFSIGN0MThbXTsKK3N0YXRpYyBVQ0hBUiBjdDE5W107CitzdGF0aWMgVUNIQVIgY3QyMFtdOworc3RhdGljIFVDSEFSIGN0MjFbXTsKK3N0YXRpYyBVQ0hBUiBjdDIyW107CitzdGF0aWMgVUNIQVIgY3QyM1tdOworc3RhdGljIFVDSEFSIGN0MjRbXTsKK3N0YXRpYyBVQ0hBUiBjdDI1W107CitzdGF0aWMgVUNIQVIgY3QyNltdOworc3RhdGljIFVDSEFSIGN0MjdbXTsKK3N0YXRpYyBVQ0hBUiBjdDI4W107CitzdGF0aWMgVUNIQVIgY3QyOVtdOworc3RhdGljIFVDSEFSIGN0MzBbXTsKK3N0YXRpYyBVQ0hBUiBjdDMxW107CitzdGF0aWMgVUNIQVIgY3QzMltdOworc3RhdGljIFVDSEFSIGN0MzNbXTsKK3N0YXRpYyBVQ0hBUiBjdDM0W107CitzdGF0aWMgVUNIQVIgY3QzNVtdOworc3RhdGljIFVDSEFSIGN0MzZbXTsKK3N0YXRpYyBVQ0hBUiBjdDM2YVtdOworc3RhdGljIFVDSEFSIGN0NDFbXTsKK3N0YXRpYyBVQ0hBUiBjdDQyW107CitzdGF0aWMgVUNIQVIgY3Q0M1tdOworc3RhdGljIFVDSEFSIGN0NDRbXTsKK3N0YXRpYyBVQ0hBUiBjdDQ1W107CitzdGF0aWMgVUNIQVIgY3Q0NltdOworc3RhdGljIFVDSEFSIGN0NDhbXTsKK3N0YXRpYyBVQ0hBUiBjdDQ5W107CitzdGF0aWMgVUNIQVIgY3Q1MFtdOworc3RhdGljIFVDSEFSIGN0NTFbXTsKK3N0YXRpYyBVQ0hBUiBjdDUyW107CitzdGF0aWMgVUNIQVIgY3Q1NltdOworc3RhdGljIFVDSEFSIGN0NTdbXTsKK3N0YXRpYyBVQ0hBUiBjdDU4W107CitzdGF0aWMgVUNIQVIgY3Q1OVtdOworc3RhdGljIFVDSEFSIGN0NjBbXTsKK3N0YXRpYyBVQ0hBUiBjdDYxW107CitzdGF0aWMgVUNIQVIgY3Q2MltdOworc3RhdGljIFVDSEFSIGN0NjNbXTsKK3N0YXRpYyBVQ0hBUiBjdDY0W107CitzdGF0aWMgVUNIQVIgY3Q2NVtdOworc3RhdGljIFVDSEFSIGN0NjZbXTsKK3N0YXRpYyBVQ0hBUiBjdDY3W107CitzdGF0aWMgVUNIQVIgY3Q2OFtdOworc3RhdGljIFVDSEFSIGN0NjlbXTsKK3N0YXRpYyBVQ0hBUiBjdDcwW107CitzdGF0aWMgVUNIQVIgY3Q3MVtdOworc3RhdGljIFVDSEFSIGN0NzJbXTsKK3N0YXRpYyBVQ0hBUiBjdDczW107CitzdGF0aWMgVUNIQVIgY3Q3NFtdOworc3RhdGljIFVDSEFSIGN0NzVbXTsKK3N0YXRpYyBVQ0hBUiBjdDc2W107CitzdGF0aWMgVUNIQVIgY3Q3N1tdOworc3RhdGljIFVDSEFSIGN0NzhbXTsKK3N0YXRpYyBVQ0hBUiBjdDc5W107CitzdGF0aWMgVUNIQVIgY3Q4MFtdOworc3RhdGljIFVDSEFSIGN0ODFbXTsKK3N0YXRpYyBVQ0hBUiBjdDgyW107CitzdGF0aWMgVUNIQVIgY3Q4M1tdOworc3RhdGljIFVDSEFSIGN0ODRbXTsKK3N0YXRpYyBVQ0hBUiBjdDg1W107CitzdGF0aWMgVUNIQVIgY3Q4NltdOworc3RhdGljIFVDSEFSIGN0ODdbXTsKK3N0YXRpYyBVQ0hBUiBjdDg4W107CitzdGF0aWMgVUNIQVIgY3Q4OVtdOworc3RhdGljIFVDSEFSIGN0OTBbXTsKK3N0YXRpYyBVQ0hBUiBjdDkxW107CitzdGF0aWMgVUNIQVIgY2MwMVtdOworc3RhdGljIFVDSEFSIGNjMDJbXTsKKworLy8gTm93LCByZWZlciB0byBpMmNtZC5jLCBhbmQgc2VlIHRoZSBjaGFyYWN0ZXIgYXJyYXlzIGRlZmluZWQgdGhlcmUuIFRoZXkgYXJlCisvLyBjYXN0IGhlcmUgdG8gY21kU3ludGF4UHRyLgorLy8KKy8vIFRoZXJlIGFyZSBsaWJyYXJ5IGZ1bmN0aW9ucyBmb3IgaXNzdWluZyBieXBhc3Mgb3IgaW5saW5lIGNvbW1hbmRzLiBUaGVzZQorLy8gZnVuY3Rpb25zIHRha2Ugb25lIG9yIG1vcmUgYXJndW1lbnRzIG9mIHRoZSB0eXBlIGNtZFN5bnRheFB0ci4gVGhlIHJvdXRpbmUKKy8vIHRoZW4gY2FuIGZpZ3VyZSBvdXQgaG93IGxvbmcgZWFjaCBjb21tYW5kIGlzIHN1cHBvc2VkIHRvIGJlIGFuZCBlYXNpbHkgYWRkIGl0CisvLyB0byB0aGUgbGlzdC4KKy8vCisvLyBGb3IgZWFzZSBvZiB1c2UsIHdlIGRlZmluZSBtYW5pZmVzdHMgd2hpY2ggcmV0dXJuIHBvaW50ZXJzIHRvIGFwcHJvcHJpYXRlCisvLyBjbWRTeW50YXhQdHIgdGhpbmdzLiBCdXQgc29tZSBjb21tYW5kcyBhbHNvIHRha2UgYXJndW1lbnRzLiBJZiBhIHNpbmdsZQorLy8gYXJndW1lbnQgaXMgdXNlZCwgd2UgZGVmaW5lIGEgbWFjcm8gd2hpY2ggcGVyZm9ybXMgdGhlIHNpbmdsZSBhc3NpZ25tZW50IGFuZAorLy8gKHRocm91Z2ggdGhlIGV4cGVkaWVudCBvZiBhIGNvbW1hIGV4cHJlc3Npb24pIHJlZmVyZW5jZXMgdGhlIGFwcHJvcHJpYXRlCisvLyBwb2ludGVyLiBGb3IgY29tbWFuZHMgcmVxdWlyaW5nIHNldmVyYWwgYXJndW1lbnRzLCB3ZSBhY3R1YWxseSBkZWZpbmUgYQorLy8gZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgYXNzaWdubWVudHMuCisKKyNkZWZpbmUgQ01EX0RUUlVQCShjbWRTeW50YXhQdHIpKGN0MDIpCS8vIFJhaXNlIERUUgorI2RlZmluZSBDTURfRFRSRE4JKGNtZFN5bnRheFB0cikoY3QwMykJLy8gTG93ZXIgRFRSCisjZGVmaW5lIENNRF9SVFNVUAkoY21kU3ludGF4UHRyKShjdDA0KQkvLyBSYWlzZSBSVFMKKyNkZWZpbmUgQ01EX1JUU0ROCShjbWRTeW50YXhQdHIpKGN0MDUpCS8vIExvd2VyIFJUUworI2RlZmluZSBDTURfU1RBUlRGTAkoY21kU3ludGF4UHRyKShjdDA2KQkvLyBTdGFydCBGbHVzaGluZyBEYXRhCisKKyNkZWZpbmUgQ01EX0RUUlJUU19VUCAoY21kU3ludGF4UHRyKShjYzAxKQkvLyBSYWlzZSBEVFIgYW5kIFJUUworI2RlZmluZSBDTURfRFRSUlRTX0ROIChjbWRTeW50YXhQdHIpKGNjMDIpCS8vIExvd2VyIERUUiBhbmQgUlRTCisKKy8vIFNldCBCYXVkIFJhdGUgZm9yIHRyYW5zbWl0IGFuZCByZWNlaXZlCisjZGVmaW5lIENNRF9TRVRCQVVEKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3QwNykpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDA3KSkKKworI2RlZmluZSBDQlJfNTAgICAgICAgMQorI2RlZmluZSBDQlJfNzUgICAgICAgMgorI2RlZmluZSBDQlJfMTEwICAgICAgMworI2RlZmluZSBDQlJfMTM0ICAgICAgNAorI2RlZmluZSBDQlJfMTUwICAgICAgNQorI2RlZmluZSBDQlJfMjAwICAgICAgNgorI2RlZmluZSBDQlJfMzAwICAgICAgNworI2RlZmluZSBDQlJfNjAwICAgICAgOAorI2RlZmluZSBDQlJfMTIwMCAgICAgOQorI2RlZmluZSBDQlJfMTgwMCAgICAgMTAKKyNkZWZpbmUgQ0JSXzI0MDAgICAgIDExCisjZGVmaW5lIENCUl80ODAwICAgICAxMgorI2RlZmluZSBDQlJfOTYwMCAgICAgMTMKKyNkZWZpbmUgQ0JSXzE5MjAwICAgIDE0CisjZGVmaW5lIENCUl8zODQwMCAgICAxNQorI2RlZmluZSBDQlJfMjAwMCAgICAgMTYKKyNkZWZpbmUgQ0JSXzM2MDAgICAgIDE3CisjZGVmaW5lIENCUl83MjAwICAgICAxOAorI2RlZmluZSBDQlJfNTYwMDAgICAgMTkKKyNkZWZpbmUgQ0JSXzU3NjAwICAgIDIwCisjZGVmaW5lIENCUl82NDAwMCAgICAyMQorI2RlZmluZSBDQlJfNzY4MDAgICAgMjIKKyNkZWZpbmUgQ0JSXzExNTIwMCAgIDIzCisjZGVmaW5lIENCUl9DMSAgICAgICAyNCAgICAvLyBDdXN0b20gYmF1ZCByYXRlIDEKKyNkZWZpbmUgQ0JSX0MyICAgICAgIDI1ICAgIC8vIEN1c3RvbSBiYXVkIHJhdGUgMgorI2RlZmluZSBDQlJfMTUzNjAwICAgMjYKKyNkZWZpbmUgQ0JSXzIzMDQwMCAgIDI3CisjZGVmaW5lIENCUl8zMDcyMDAgICAyOAorI2RlZmluZSBDQlJfNDYwODAwICAgMjkKKyNkZWZpbmUgQ0JSXzkyMTYwMCAgIDMwCisKKy8vIFNldCBDaGFyYWN0ZXIgc2l6ZQorLy8KKyNkZWZpbmUgQ01EX1NFVEJJVFMoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDA4KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MDgpKQorCisjZGVmaW5lIENTWl81ICAwCisjZGVmaW5lIENTWl82ICAxCisjZGVmaW5lIENTWl83ICAyCisjZGVmaW5lIENTWl84ICAzCisKKy8vIFNldCBudW1iZXIgb2Ygc3RvcCBiaXRzCisvLworI2RlZmluZSBDTURfU0VUU1RPUChhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0MDkpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3QwOSkpCisKKyNkZWZpbmUgQ1NUXzEgIDAKKyNkZWZpbmUgQ1NUXzE1IDEgIC8vIDEuNSBzdG9wIGJpdHMKKyNkZWZpbmUgQ1NUXzIgIDIKKworLy8gU2V0IHBhcml0eSBvcHRpb24KKy8vCisjZGVmaW5lIENNRF9TRVRQQVIoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDEwKSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MTApKQorCisjZGVmaW5lIENTUF9OUCAwICAvLyBubyBwYXJpdHkKKyNkZWZpbmUgQ1NQX09EIDEgIC8vIG9kZCBwYXJpdHkKKyNkZWZpbmUgQ1NQX0VWIDIgIC8vIEV2ZW4gcGFyaXR5CisjZGVmaW5lIENTUF9TUCAzICAvLyBTcGFjZSBwYXJpdHkKKyNkZWZpbmUgQ1NQX01LIDQgIC8vIE1hcmsgcGFyaXR5CisKKy8vIERlZmluZSB4b24gY2hhciBmb3IgdHJhbnNtaXR0ZXIgZmxvdyBjb250cm9sCisvLworI2RlZmluZSBDTURfREVGX0lYT04oYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDExKSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MTEpKQorCisvLyBEZWZpbmUgeG9mZiBjaGFyIGZvciB0cmFuc21pdHRlciBmbG93IGNvbnRyb2wKKy8vCisjZGVmaW5lIENNRF9ERUZfSVhPRkYoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDEyKSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MTIpKQorCisjZGVmaW5lIENNRF9TVE9QRkwgICAoY21kU3ludGF4UHRyKShjdDEzKSAvLyBTdG9wIEZsdXNoaW5nIGRhdGEKKworLy8gQWNrbm93bGVkZ2UgcmVjZWlwdCBvZiBob3RrZXkgc2lnbmFsCisvLworI2RlZmluZSBDTURfSE9UQUNLICAgKGNtZFN5bnRheFB0cikoY3QxNCkKKworLy8gRGVmaW5lIGlycSBsZXZlbCB0byB1c2UuIFNob3VsZCBhY3R1YWxseSBiZSBzZW50IGJ5IGxpYnJhcnktbGV2ZWwgY29kZSwgbm90CisvLyBkaXJlY3RseSBmcm9tIHVzZXIuLi4KKy8vCisjZGVmaW5lIENNRFZBTFVFX0lSUSAxNSAvLyBGb3IgbGlicmFyeSB1c2UgYXQgaW5pdGlhbGl6YXRpb24uIFVudGlsIHRoaXMgY29tbWFuZAorCQkJCQkJLy8gaXMgc2VudCwgYm9hcmQgcHJvY2Vzc2luZyBkb2Vzbid0IHJlYWxseSBzdGFydC4KKyNkZWZpbmUgQ01EX1NFVF9JUlEoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDE1KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MTUpKQorCisjZGVmaW5lIENJUl9QT0xMICAwICAvLyBObyBJUlEgLSBQb2xsCisjZGVmaW5lIENJUl8zICAgICAzICAvLyBJUlEgMworI2RlZmluZSBDSVJfNCAgICAgNCAgLy8gSVJRIDQKKyNkZWZpbmUgQ0lSXzUgICAgIDUgIC8vIElSUSA1CisjZGVmaW5lIENJUl83ICAgICA3ICAvLyBJUlEgNworI2RlZmluZSBDSVJfMTAgICAgMTAgLy8gSVJRIDEwCisjZGVmaW5lIENJUl8xMSAgICAxMSAvLyBJUlEgMTEKKyNkZWZpbmUgQ0lSXzEyICAgIDEyIC8vIElSUSAxMgorI2RlZmluZSBDSVJfMTUgICAgMTUgLy8gSVJRIDE1CisKKy8vIFNlbGVjdCB0cmFuc21pdCBmbG93IHhvbi94b2ZmIG9wdGlvbnMKKy8vCisjZGVmaW5lIENNRF9JWE9OX09QVChhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0MTYpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3QxNikpCisKKyNkZWZpbmUgQ0lYX05PTkUgIDAgIC8vIEluY29taW5nIFhvbi9Yb2ZmIGNoYXJhY3RlcnMgbm90IHNwZWNpYWwKKyNkZWZpbmUgQ0lYX1hPTiAgIDEgIC8vIFhvZmYgZGlzYWJsZSwgWG9uIGVuYWJsZQorI2RlZmluZSBDSVhfWEFOWSAgMiAgLy8gWG9mZiBkaXNhYmxlLCBhbnkga2V5IGVuYWJsZQorCisvLyBTZWxlY3QgcmVjZWl2ZSBmbG93IHhvbi94b2ZmIG9wdGlvbnMKKy8vCisjZGVmaW5lIENNRF9PWE9OX09QVChhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0MTcpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3QxNykpCisKKyNkZWZpbmUgQ09YX05PTkUgIDAgIC8vIERvbid0IHNlbmQgWG9uL1hvZmYKKyNkZWZpbmUgQ09YX1hPTiAgIDEgIC8vIFNlbmQgeG9uL3hvZmYgdG8gc3RhcnQvc3RvcCBpbmNvbWluZyBkYXRhCisKKworI2RlZmluZSBDTURfQ1RTX1JFUCAgKGNtZFN5bnRheFB0cikoY3QxOCkgLy8gRW5hYmxlICBDVFMgcmVwb3J0aW5nCisjZGVmaW5lIENNRF9DVFNfTlJFUCAoY21kU3ludGF4UHRyKShjdDE5KSAvLyBEaXNhYmxlIENUUyByZXBvcnRpbmcKKworI2RlZmluZSBDTURfRENEX1JFUCAgKGNtZFN5bnRheFB0cikoY3QyMCkgLy8gRW5hYmxlICBEQ0QgcmVwb3J0aW5nCisjZGVmaW5lIENNRF9EQ0RfTlJFUCAoY21kU3ludGF4UHRyKShjdDIxKSAvLyBEaXNhYmxlIERDRCByZXBvcnRpbmcKKworI2RlZmluZSBDTURfRFNSX1JFUCAgKGNtZFN5bnRheFB0cikoY3QyMikgLy8gRW5hYmxlICBEU1IgcmVwb3J0aW5nCisjZGVmaW5lIENNRF9EU1JfTlJFUCAoY21kU3ludGF4UHRyKShjdDIzKSAvLyBEaXNhYmxlIERTUiByZXBvcnRpbmcKKworI2RlZmluZSBDTURfUklfUkVQICAgKGNtZFN5bnRheFB0cikoY3QyNCkgLy8gRW5hYmxlICBSSSAgcmVwb3J0aW5nCisjZGVmaW5lIENNRF9SSV9OUkVQICAoY21kU3ludGF4UHRyKShjdDI1KSAvLyBEaXNhYmxlIFJJICByZXBvcnRpbmcKKworLy8gRW5hYmxlIGJyZWFrIHJlcG9ydGluZyBhbmQgc2VsZWN0IHN0eWxlCisvLworI2RlZmluZSBDTURfQlJLX1JFUChhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0MjYpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3QyNikpCisKKyNkZWZpbmUgQ0JLX1NUQVQgICAgIDB4MDAgIC8vIFJlcG9ydCBicmVha3MgYXMgYSBzdGF0dXMgKGV4Y2VwdGlvbixpcnEpCisjZGVmaW5lIENCS19OVUxMICAgICAweDAxICAvLyBSZXBvcnQgYnJlYWtzIGFzIGEgZ29vZCBudWxsCisjZGVmaW5lIENCS19TVEFUX1NFUSAweDAyICAvLyBSZXBvcnQgYnJlYWtzIGFzIGEgc3RhdHVzIEFORCBhcyBpbi1iYW5kIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHNlcXVlbmNlIEZGaCwgMDFoLCAxMGgKKyNkZWZpbmUgQ0JLX1NFUSAgICAgIDB4MDMgIC8vIFJlcG9ydCBicmVha3MgYXMgdGhlIGluLWJhbmQgCisJCQkJCQkgICAvL3NlcXVlbmNlIEZGaCwgMDFoLCAxMGggT05MWS4KKyNkZWZpbmUgQ0JLX0ZMU0ggICAgIDB4MDQgIC8vIGlmIHRoaXMgYml0IHNldCBhbHNvIGZsdXNoIGlucHV0IGRhdGEKKyNkZWZpbmUgQ0JLX1BPU0lYICAgIDB4MDggIC8vIGlmIHRoaXMgYml0IHNldCByZXBvcnQgYXMgRkYsMCwwIHNlcXVlbmNlCisjZGVmaW5lIENCS19TSU5HTEUgICAweDEwICAvLyBpZiB0aGlzIGJpdCBzZXQgd2l0aCBDQktfU0VRIG9yIENCS19TVEFUX1NFUQorCQkJCQkJICAgLy90aGVuIHJlcG9ydHMgc2luZ2xlIG51bGwgaW5zdGVhZCBvZiB0cmlwbGUKKworI2RlZmluZSBDTURfQlJLX05SRVAgKGNtZFN5bnRheFB0cikoY3QyNykgLy8gRGlzYWJsZSBicmVhayByZXBvcnRpbmcKKworLy8gU3BlY2lmeSBtYXhpbXVtIGJsb2NrIHNpemUgZm9yIHJlY2VpdmVkIGRhdGEKKy8vCisjZGVmaW5lIENNRF9NQVhfQkxPQ0soYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDI4KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MjgpKQorCisvLyAtLSBDT01NQU5EIDI5IGlzIHJlc2VydmVkIC0tCisKKyNkZWZpbmUgQ01EX0NUU0ZMX0VOQUIgIChjbWRTeW50YXhQdHIpKGN0MzApIC8vIEVuYWJsZSAgQ1RTIGZsb3cgY29udHJvbAorI2RlZmluZSBDTURfQ1RTRkxfRFNBQiAgKGNtZFN5bnRheFB0cikoY3QzMSkgLy8gRGlzYWJsZSBDVFMgZmxvdyBjb250cm9sCisjZGVmaW5lIENNRF9SVFNGTF9FTkFCICAoY21kU3ludGF4UHRyKShjdDMyKSAvLyBFbmFibGUgIFJUUyBmbG93IGNvbnRyb2wKKyNkZWZpbmUgQ01EX1JUU0ZMX0RTQUIgIChjbWRTeW50YXhQdHIpKGN0MzMpIC8vIERpc2FibGUgUlRTIGZsb3cgY29udHJvbAorCisvLyBTcGVjaWZ5IGlzdHJpcCBvcHRpb24KKy8vCisjZGVmaW5lIENNRF9JU1RSSVBfT1BUKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3QzNCkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDM0KSkKKworI2RlZmluZSBDSVNfTk9TVFJJUCAgMCAgLy8gU3RyaXAgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgc2l6ZQorI2RlZmluZSBDSVNfU1RSSVAgICAgMSAgLy8gU3RyaXAgYW55IDgtYml0IGNoYXJhY3RlcnMgdG8gNyBiaXRzCisKKy8vIFNlbmQgYSBicmVhayBvZiBhcmcgbWlsbGlzZWNvbmRzCisvLworI2RlZmluZSBDTURfU0VORF9CUksoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDM1KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MzUpKQorCisvLyBTZXQgZXJyb3IgcmVwb3J0aW5nIG1vZGUKKy8vCisjZGVmaW5lIENNRF9TRVRfRVJST1IoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDM2KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MzYpKQorCisjZGVmaW5lIENTRV9FU1RBVCAwICAvLyBSZXBvcnQgZXJyb3IgaW4gYSBzdGF0dXMgcGFja2V0CisjZGVmaW5lIENTRV9OT1JFUCAxICAvLyBUcmVhdCBjaGFyYWN0ZXIgYXMgdGhvdWdoIGl0IHdlcmUgZ29vZAorI2RlZmluZSBDU0VfRFJPUCAgMiAgLy8gRGlzY2FyZCB0aGUgY2hhcmFjdGVyCisjZGVmaW5lIENTRV9OVUxMICAzICAvLyBSZXBsYWNlIHdpdGggYSBudWxsCisjZGVmaW5lIENTRV9NQVJLICA0ICAvLyBSZXBsYWNlIHdpdGggYSAzLWNoYXJhY3RlciBzZXF1ZW5jZSAoYXMgVW5peCkKKworI2RlZmluZSAgQ01EX1NFVF9SRVBMQUNFTUVOVChhcmcsY2gpICAgXAorCQkJKCgoY21kU3ludGF4UHRyKShjdDM2YSkpLT5jbWRbMV0gPSAoYXJnKSwgXAorCQkJKCgoY21kU3ludGF4UHRyKShjdDM2YSkpLT5jbWRbMl0gPSAoY2gpLCAgXAorCQkJKGNtZFN5bnRheFB0cikoY3QzNmEpKQorCisjZGVmaW5lIENTRV9SRVBMQUNFICAweDgJLy8gUmVwbGFjZSB0aGUgZXJyb3JlZCBjaGFyYWN0ZXIgd2l0aCB0aGUKKwkJCQkJCQkvLyByZXBsYWNlbWVudCBjaGFyYWN0ZXIgZGVmaW5lZCBoZXJlCisKKyNkZWZpbmUgQ1NFX1NUQVRfUkVQTEFDRSAgIDB4MTgJLy8gUmVwbGFjZSB0aGUgZXJyb3JlZCBjaGFyYWN0ZXIgd2l0aCB0aGUKKwkJCQkJCQkJLy8gcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGRlZmluZWQgaGVyZSBBTkQKKwkJCQkJCQkJLy8gcmVwb3J0IHRoZSBlcnJvciBhcyBhIHN0YXR1cyBwYWNrZXQgKGFzIGluCisJCQkJCQkJCS8vIENTRV9FU1RBVCkuCisKKworLy8gQ09NTUFORCAzNywgdG8gc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0cywgaXMgaGFuZGxlZCBvbmx5IGJ5IGxvdy1sZXZlbAorLy8gbGlicmFyeSBjb2RlIGluIHJlc3BvbnNlIHRvIGRhdGEgbW92ZW1lbnQgYW5kIHNob3VsZG4ndCBldmVyIGJlIHNlbnQgYnkgdGhlCisvLyB1c2VyIGNvZGUuIFNlZSBpMnBhY2suaCBhbmQgdGhlIGJvZHkgb2YgaTJsaWIuYyBmb3IgZGV0YWlscy4KKworLy8gRW5hYmxlIG9uLWJvYXJkIHBvc3QtcHJvY2Vzc2luZywgdXNpbmcgb3B0aW9ucyBnaXZlbiBpbiBvZmxhZyBhcmd1bWVudC4KKy8vIEZvcm1lcmx5LCB0aGlzIGNvbW1hbmQgd2FzIGF1dG9tYXRpY2FsbHkgcHJlY2VkZWQgYnkgYSBDTURfT1BPU1RfT0ZGIGNvbW1hbmQKKy8vIGJlY2F1c2UgdGhlIGxvYWR3YXJlIGRvZXMgbm90IHBlcm1pdCBzZW5kaW5nIGJhY2stdG8tYmFjayBDTURfT1BPU1RfT04KKy8vIGNvbW1hbmRzIHdpdGhvdXQgYW4gaW50ZXJ2ZW5pbmcgQ01EX09QT1NUX09GRi4gQlVULCBXRSBMRUFSTiAxOCBNQVkgOTIsIHRoYXQKKy8vIENNRF9PUE9TVF9PTiBhbmQgQ01EX09QT1NUX09GRiBtdXN0IGVhY2ggYmUgYXQgdGhlIGVuZCBvZiBhIHBhY2tldCAob3IgaW4gYQorLy8gc29sbyBwYWNrZXQpLiBUaGlzIG1lYW5zIHRoZSBjYWxsZXIgbXVzdCBzcGVjaWZ5IHNlcGFyYXRlbHkgQ01EX09QT1NUX09GRiwKKy8vIENNRF9PUE9TVF9PTihwYXJtKSB3aGVuIGhlIGNhbGxzIGkyUXVldWVDb21tYW5kcygpLiBUaGF0IGZ1bmN0aW9uIHdpbGwgZW5zdXJlCisvLyBlYWNoIGdldHMgYSBzZXBhcmF0ZSBwYWNrZXQuIEV4dHJhIENNRF9PUE9TVF9PRkYncyBhcmUgYWx3YXlzIG9rLgorLy8KKyNkZWZpbmUgQ01EX09QT1NUX09OKG9mbGFnKSAgIFwKKwkoKihVU0hPUlQgKikoKChjbWRTeW50YXhQdHIpKGN0MzkpKS0+Y21kWzFdKSA9IChvZmxhZyksIFwKKwkJKGNtZFN5bnRheFB0cikoY3QzOSkpCisKKyNkZWZpbmUgQ01EX09QT1NUX09GRiAgIChjbWRTeW50YXhQdHIpKGN0NDApIC8vIERpc2FibGUgb24tYm9hcmQgcG9zdC1wcm9jCisKKyNkZWZpbmUgQ01EX1JFU1VNRSAgIChjbWRTeW50YXhQdHIpKGN0NDEpCS8vIFJlc3VtZTogYmVoYXZlIGFzIHRob3VnaCBhbiBYT04KKwkJCQkJCQkJCQkJLy8gd2VyZSByZWNlaXZlZDsKKworLy8gU2V0IFRyYW5zbWl0IGJhdWQgcmF0ZSAoc2VlIGNvbW1hbmQgNyBmb3IgYXJndW1lbnRzKQorLy8KKyNkZWZpbmUgQ01EX1NFVEJBVURfVFgoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDQyKSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0NDIpKQorCisvLyBTZXQgUmVjZWl2ZSBiYXVkIHJhdGUgKHNlZSBjb21tYW5kIDcgZm9yIGFyZ3VtZW50cykKKy8vCisjZGVmaW5lIENNRF9TRVRCQVVEX1JYKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q0MykpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDQzKSkKKworLy8gUmVxdWVzdCBpbnRlcnJ1cHQgZnJvbSBib2FyZCBlYWNoIGFyZyBtaWxsaXNlY29uZHMuIEludGVycnVwdCB3aWxsIHNwZWNpZnkKKy8vICJyZWNlaXZlZCBkYXRhIiwgZXZlbiB0aG91Z2ggdGhlcmUgbWF5IGJlIG5vIGRhdGEgcHJlc2VudC4gSWYgYXJnID09IDAsCisvLyBkaXNhYmxlcyBhbnkgc3VjaCBpbnRlcnJ1cHRzLgorLy8KKyNkZWZpbmUgQ01EX1BJTkdfUkVRKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q0NCkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDQ0KSkKKworI2RlZmluZSBDTURfSE9UX0VOQUIgKGNtZFN5bnRheFB0cikoY3Q0NSkgLy8gRW5hYmxlIEhvdC1rZXkgY2hlY2tpbmcKKyNkZWZpbmUgQ01EX0hPVF9EU0FCIChjbWRTeW50YXhQdHIpKGN0NDYpIC8vIERpc2FibGUgSG90LWtleSBjaGVja2luZworCisvLyBDT01NQU5EIDQ3OiBTZW5kIFByb3RvY29sIGluZm8gdmlhIFVuaXggZmxhZ3M6CisvLyBpZmxhZyA9IFVuaXggdHR5IHRfaWZsYWcKKy8vIGNmbGFnID0gVW5peCB0dHkgdF9jZmxhZworLy8gbGZsYWcgPSBVbml4IHR0eSB0X2xmbGFnCisvLyBTZWUgU3lzdGVtIFYgVW5peC9YZW5peCBkb2N1bWVudGF0aW9uIGZvciB0aGUgbWVhbmluZ3Mgb2YgdGhlIGJpdCBmaWVsZHMKKy8vIHdpdGhpbiB0aGVzZSBmbGFncworLy8KKyNkZWZpbmUgQ01EX1VOSVhfRkxBR1MoaWZsYWcsY2ZsYWcsbGZsYWcpIGkyY21kVW5peEZsYWdzKGlmbGFnLGNmbGFnLGxmbGFnKQorCisjZGVmaW5lIENNRF9EU1JGTF9FTkFCICAoY21kU3ludGF4UHRyKShjdDQ4KSAvLyBFbmFibGUgIERTUiByZWNlaXZlciBjdHJsCisjZGVmaW5lIENNRF9EU1JGTF9EU0FCICAoY21kU3ludGF4UHRyKShjdDQ5KSAvLyBEaXNhYmxlIERTUiByZWNlaXZlciBjdHJsCisjZGVmaW5lIENNRF9EVFJGTF9FTkFCICAoY21kU3ludGF4UHRyKShjdDUwKSAvLyBFbmFibGUgIERUUiBmbG93IGNvbnRyb2wKKyNkZWZpbmUgQ01EX0RUUkZMX0RTQUIgIChjbWRTeW50YXhQdHIpKGN0NTEpIC8vIERpc2FibGUgRFRSIGZsb3cgY29udHJvbAorI2RlZmluZSBDTURfQkFVRF9SRVNFVCAgKGNtZFN5bnRheFB0cikoY3Q1MikgLy8gUmVzZXQgYmF1ZHJhdGUgdGFibGUKKworLy8gQ09NTUFORCA1NDogRGVmaW5lIGN1c3RvbSByYXRlICMxCisvLyByYXRlID0gKHNob3J0KSAxLzEwIG9mIHRoZSBkZXNpcmVkIGJhdWQgcmF0ZQorLy8KKyNkZWZpbmUgQ01EX0JBVURfREVGMShyYXRlKSBpMmNtZEJhdWREZWYoMSxyYXRlKQorCisvLyBDT01NQU5EIDU1OiBEZWZpbmUgY3VzdG9tIHJhdGUgIzIKKy8vIHJhdGUgPSAoc2hvcnQpIDEvMTAgb2YgdGhlIGRlc2lyZWQgYmF1ZCByYXRlCisvLworI2RlZmluZSBDTURfQkFVRF9ERUYyKHJhdGUpIGkyY21kQmF1ZERlZigyLHJhdGUpCisKKy8vIFBhdXNlIGFyZyBodW5kcmVkdGhzIG9mIHNlY29uZHMuIChOb3RlLCB0aGlzIGlzIE5PVCBtaWxsaXNlY29uZHMuKQorLy8KKyNkZWZpbmUgQ01EX1BBVVNFKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q1NikpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDU2KSkKKworI2RlZmluZSBDTURfU1VTUEVORCAgICAgKGNtZFN5bnRheFB0cikoY3Q1NykgLy8gU3VzcGVuZCBvdXRwdXQKKyNkZWZpbmUgQ01EX1VOU1VTUEVORCAgIChjbWRTeW50YXhQdHIpKGN0NTgpIC8vIFVuLVN1c3BlbmQgb3V0cHV0CisKKy8vIFNldCBwYXJpdHktY2hlY2tpbmcgb3B0aW9ucworLy8KKyNkZWZpbmUgQ01EX1BBUkNISyhhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0NTkpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3Q1OSkpCisKKyNkZWZpbmUgQ1BLX0VOQUIgIDAgICAgIC8vIEVuYWJsZSBwYXJpdHkgY2hlY2tpbmcgb24gaW5wdXQKKyNkZWZpbmUgQ1BLX0RTQUIgIDEgICAgIC8vIERpc2FibGUgcGFyaXR5IGNoZWNraW5nIG9uIGlucHV0CisKKyNkZWZpbmUgQ01EX0JNQVJLX1JFUSAgIChjbWRTeW50YXhQdHIpKGN0NjApIC8vIEJvb2ttYXJrIHJlcXVlc3QKKworCisvLyBFbmFibGUvRGlzYWJsZSBpbnRlcm5hbCBsb29wYmFjayBtb2RlCisvLworI2RlZmluZSBDTURfSU5MT09QKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q2MSkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDYxKSkKKworI2RlZmluZSBDSU5fRElTQUJMRSAgMCAgLy8gTm9ybWFsIG9wZXJhdGlvbiAoZGVmYXVsdCkKKyNkZWZpbmUgQ0lOX0VOQUJMRSAgIDEgIC8vIEludGVybmFsIChsb2NhbCkgbG9vcGJhY2sKKyNkZWZpbmUgQ0lOX1JFTU9URSAgIDIgIC8vIFJlbW90ZSBsb29wYmFjaworCisvLyBTcGVjaWZ5IHRpbWVvdXQgZm9yIGhvdGtleXM6IERlbGF5IHdpbGwgYmUgKGFyZyB4IDEwKSBtaWxsaXNlY29uZHMsIGFyZyA9PSAwCisvLyAtLT4gbm8gdGltZW91dDogd2FpdCBmb3JldmVyLgorLy8KKyNkZWZpbmUgQ01EX0hPVF9USU1FKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q2MikpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDYyKSkKKworCisvLyBEZWZpbmUgKG91dGdvaW5nKSB4b24gZm9yIHJlY2VpdmUgZmxvdyBjb250cm9sCisvLworI2RlZmluZSBDTURfREVGX09YT04oYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDYzKSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0NjMpKQorCisvLyBEZWZpbmUgKG91dGdvaW5nKSB4b2ZmIGZvciByZWNlaXZlciBmbG93IGNvbnRyb2wKKy8vCisjZGVmaW5lIENNRF9ERUZfT1hPRkYoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDY0KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0NjQpKQorCisvLyBFbmFibGUvRGlzYWJsZSBSVFMgb24gdHJhbnNtaXQgKDEvMiBkdXBsZXgtc3R5bGUpCisvLworI2RlZmluZSBDTURfUlRTX1hNSVQoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDY1KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0NjUpKQorCisjZGVmaW5lIENIRF9ESVNBQkxFICAwCisjZGVmaW5lIENIRF9FTkFCTEUgICAxCisKKy8vIFNldCBoaWdoLXdhdGVyLW1hcmsgbGV2ZWwgKGRlYnVnZ2luZyB1c2Ugb25seSkKKy8vCisjZGVmaW5lIENNRF9TRVRISUdIV0FUKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q2NikpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDY2KSkKKworLy8gU3RhcnQgZmx1c2hpbmcgdGFnZ2VkIGRhdGEgKHRhZyA9IDAtMTQpCisvLworI2RlZmluZSBDTURfU1RBUlRfU0VMRkwodGFnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDY3KSktPmNtZFsxXSA9ICh0YWcpLChjbWRTeW50YXhQdHIpKGN0NjcpKQorCisvLyBFbmQgZmx1c2hpbmcgdGFnZ2VkIGRhdGEgKHRhZyA9IDAtMTQpCisvLworI2RlZmluZSBDTURfRU5EX1NFTEZMKHRhZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q2OCkpLT5jbWRbMV0gPSAodGFnKSwoY21kU3ludGF4UHRyKShjdDY4KSkKKworI2RlZmluZSBDTURfSFdGTE9XX09GRiAgKGNtZFN5bnRheFB0cikoY3Q2OSkgLy8gRGlzYWJsZSBIVyBUWCBmbG93IGNvbnRyb2wKKyNkZWZpbmUgQ01EX09EU1JGTF9FTkFCIChjbWRTeW50YXhQdHIpKGN0NzApIC8vIEVuYWJsZSBEU1Igb3V0cHV0IGYvYworI2RlZmluZSBDTURfT0RTUkZMX0RTQUIgKGNtZFN5bnRheFB0cikoY3Q3MSkgLy8gRGlzYWJsZSBEU1Igb3V0cHV0IGYvYworI2RlZmluZSBDTURfT0RDREZMX0VOQUIgKGNtZFN5bnRheFB0cikoY3Q3MikgLy8gRW5hYmxlIERDRCBvdXRwdXQgZi9jCisjZGVmaW5lIENNRF9PRENERkxfRFNBQiAoY21kU3ludGF4UHRyKShjdDczKSAvLyBEaXNhYmxlIERDRCBvdXRwdXQgZi9jCisKKy8vIFNldCB0cmFuc21pdCBpbnRlcnJ1cHQgbG9hZCBsZXZlbC4gQ291bnQgc2hvdWxkIGJlIGFuIGV2ZW4gdmFsdWUgMi0xMgorLy8KKyNkZWZpbmUgQ01EX0xPQURMRVZFTChjb3VudCkgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q3NCkpLT5jbWRbMV0gPSAoY291bnQpLChjbWRTeW50YXhQdHIpKGN0NzQpKQorCisvLyBJZiByZXBvcnRpbmcgRFNTIGNoYW5nZXMsIG1hcCB0byBjaGFyYWN0ZXIgc2VxdWVuY2UgRkZoLCAyLCBNU1IKKy8vCisjZGVmaW5lIENNRF9TVEFUREFUQShhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0NzUpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3Q3NSkpCisKKyNkZWZpbmUgQ1NURF9ESVNBQkxFLy8gUmVwb3J0IERTUyBjaGFuZ2VzIGFzIHN0YXR1cyBwYWNrZXRzIG9ubHkgKGRlZmF1bHQpCisjZGVmaW5lIENTVERfRU5BQkxFCS8vIFJlcG9ydCBEU1MgY2hhbmdlcyBhcyBpbi1iYW5kIGRhdGEgc2VxdWVuY2UgYXMgd2VsbCBhcworCQkJCQkvLyBieSBzdGF0dXMgcGFja2V0LgorCisjZGVmaW5lIENNRF9CUkVBS19PTiAgICAoY21kU3ludGF4UHRyKShjdDc2KS8vIFNldCBicmVhayBhbmQgc3RvcCB4bWl0CisjZGVmaW5lIENNRF9CUkVBS19PRkYgICAoY21kU3ludGF4UHRyKShjdDc3KS8vIEVuZCBicmVhayBhbmQgcmVzdGFydCB4bWl0CisjZGVmaW5lIENNRF9HRVRGQyAgICAgICAoY21kU3ludGF4UHRyKShjdDc4KS8vIFJlcXVlc3QgZm9yIGZsb3cgY29udHJvbCBwYWNrZXQKKwkJCQkJCQkJCQkJLy8gZnJvbSBib2FyZC4KKworLy8gVHJhbnNtaXQgdGhpcyBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkKKy8vCisjZGVmaW5lIENNRF9YTUlUX05PVyhjaCkgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q3OSkpLT5jbWRbMV0gPSAoY2gpLChjbWRTeW50YXhQdHIpKGN0NzkpKQorCisvLyBTZXQgYmF1ZCByYXRlIHZpYSAiZGl2aXNvciBsYXRjaCIKKy8vCisjZGVmaW5lIENNRF9ESVZJU09SX0xBVENIKHdoaWNoLHZhbHVlKSBcCisJCQkoKChjbWRTeW50YXhQdHIpKGN0ODApKS0+Y21kWzFdID0gKHdoaWNoKSwgXAorCQkJKihVU0hPUlQgKikoKChjbWRTeW50YXhQdHIpKGN0ODApKS0+Y21kWzJdKSA9ICh2YWx1ZSksIFwKKwkJCShjbWRTeW50YXhQdHIpKGN0ODApKQorCisjZGVmaW5lIENETF9SWCAxCS8vIFNldCByZWNlaXZlciByYXRlCisjZGVmaW5lIENETF9UWCAyCS8vIFNldCB0cmFuc21pdCByYXRlCisJCQkJCS8vIChDRExfVFggfCBDRExfUlgpIFNldCBib3RoIHJhdGVzCisKKy8vIFJlcXVlc3QgZm9yIHNwZWNpYWwgZGlhZ25vc3RpYyBzdGF0dXMgcGt0IGZyb20gdGhlIGJvYXJkLgorLy8KKyNkZWZpbmUgQ01EX0dFVF9TVEFUVVMgKGNtZFN5bnRheFB0cikoY3Q4MSkKKworLy8gUmVxdWVzdCB0aW1lLXN0YW1wZWQgdHJhbnNtaXQgY2hhcmFjdGVyIGNvdW50IHBhY2tldC4KKy8vCisjZGVmaW5lIENNRF9HRVRfVFhDTlQgIChjbWRTeW50YXhQdHIpKGN0ODIpCisKKy8vIFJlcXVlc3QgdGltZS1zdGFtcGVkIHJlY2VpdmUgY2hhcmFjdGVyIGNvdW50IHBhY2tldC4KKy8vCisjZGVmaW5lIENNRF9HRVRfUlhDTlQgIChjbWRTeW50YXhQdHIpKGN0ODMpCisKKy8vIFJlcXVlc3QgZm9yIGJveC9ib2FyZCBJLkQuIHBhY2tldC4KKyNkZWZpbmUgQ01EX0dFVF9CT1hJRFMgKGNtZFN5bnRheFB0cikoY3Q4NCkKKworLy8gRW5hYmxlIG9yIGRpc2FibGUgbXVsdGlwbGUgY2hhbm5lbHMgYWNjb3JkaW5nIHRvIGJpdC1tYXBwZWQgdXNob3J0cyBib3ggMS00CisvLworI2RlZmluZSBDTURfRU5BQl9NVUxUKGVuYWJsZSwgYm94MSwgYm94MiwgYm94MywgYm94NCkgICAgXAorCQkJKCgoY21kU3l0YXhQdHIpKGN0ODUpKS0+Y21kWzFdID0gKGVuYWJsZSksICAgICAgICAgICAgXAorCQkJKihVU0hPUlQgKikoKChjbWRTeW50YXhQdHIpKGN0ODUpKS0+Y21kWzJdKSA9IChib3gxKSwgXAorCQkJKihVU0hPUlQgKikoKChjbWRTeW50YXhQdHIpKGN0ODUpKS0+Y21kWzRdKSA9IChib3gyKSwgXAorCQkJKihVU0hPUlQgKikoKChjbWRTeW50YXhQdHIpKGN0ODUpKS0+Y21kWzZdKSA9IChib3gzKSwgXAorCQkJKihVU0hPUlQgKikoKChjbWRTeW50YXhQdHIpKGN0ODUpKS0+Y21kWzhdKSA9IChib3g0KSwgXAorCQkJKGNtZFN5bnRheFB0cikoY3Q4NSkpCisKKyNkZWZpbmUgQ0VNX0RJU0FCTEUgIDAKKyNkZWZpbmUgQ0VNX0VOQUJMRSAgIDEKKworLy8gRW5hYmxlIG9yIGRpc2FibGUgcmVjZWl2ZXIgb3IgcmVjZWl2ZXIgaW50ZXJydXB0cyAoZGVmYXVsdCBib3RoIGVuYWJsZWQpCisvLworI2RlZmluZSBDTURfUkNWX0VOQUJMRShjaCkgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q4NikpLT5jbWRbMV0gPSAoY2gpLChjbWRTeW50YXhQdHIpKGN0ODYpKQorCisjZGVmaW5lIENSRV9PRkYgICAgICAwICAvLyBEaXNhYmxlIHRoZSByZWNlaXZlcgorI2RlZmluZSBDUkVfT04gICAgICAgMSAgLy8gRW5hYmxlIHRoZSByZWNlaXZlcgorI2RlZmluZSBDUkVfSU5UT0ZGICAgMiAgLy8gRGlzYWJsZSByZWNlaXZlciBpbnRlcnJ1cHRzICh0byBsb2Fkd2FyZSkKKyNkZWZpbmUgQ1JFX0lOVE9OICAgIDMgIC8vIEVuYWJsZSByZWNlaXZlciBpbnRlcnJ1cHRzICh0byBsb2Fkd2FyZSkKKworLy8gU3RhcnRzIHVwIGEgaGFyZHdhcmUgdGVzdCBwcm9jZXNzLCB3aGljaCBydW5zIHRyYW5zcGFyZW50bHksIGFuZCBzZW5kcyBhCisvLyBTVEFUX0hXRkFJTCBwYWNrZXQgaW4gY2FzZSBhIGhhcmR3YXJlIGZhaWx1cmUgaXMgZGV0ZWN0ZWQuCisvLworI2RlZmluZSBDTURfSFdfVEVTVCAgKGNtZFN5bnRheFB0cikoY3Q4NykKKworLy8gQ2hhbmdlIHJlY2VpdmVyIHRocmVzaG9sZCBhbmQgdGltZW91dCB2YWx1ZToKKy8vIERlZmF1bHRzOiB0aW1lb3V0ID0gMjBtUworLy8gdGhyZXNob2xkIGNvdW50ID0gOCB3aGVuIERUUmZsb3cgbm90IGluIHVzZSwKKy8vIHRocmVzaG9sZCBjb3VudCA9IDUgd2hlbiBEVFJmbG93IGluIHVzZS4KKy8vCisjZGVmaW5lIENNRF9SQ1ZfVEhSRVNIT0xEKGNvdW50LG1zKSBcCisJCQkoKChjbWRTeW50YXhQdHIpKGN0ODgpKS0+Y21kWzFdID0gKGNvdW50KSwgXAorCQkJKChjbWRTeW50YXhQdHIpKGN0ODgpKS0+Y21kWzJdID0gKG1zKSwgXAorCQkJKGNtZFN5bnRheFB0cikoY3Q4OCkpCisKKy8vIE1ha2VzIHRoZSBsb2Fkd2FyZSByZXBvcnQgRFNTIHNpZ25hbHMgZm9yIHRoaXMgY2hhbm5lbCBpbW1lZGlhdGVseS4KKy8vCisjZGVmaW5lIENNRF9EU1NfTk9XIChjbWRTeW50YXhQdHIpKGN0ODkpCisJCisvLyBTZXQgdGhlIHJlY2VpdmUgc2lsbyBwYXJhbWV0ZXJzIAorLy8gCXRpbWVvdXQgaXMgbXMgaWRsZSB3YWl0IHVudGlsIGRlbGl2ZXJ5ICAgICAgICh+VlRJTUUpCisvLyAJdGhyZXNob2xkIGlzIG1heCBjaGFyYWN0ZXJzIGNhdXNlIGludGVycnVwdCAgKH5WTUlOKQorLy8KKyNkZWZpbmUgQ01EX1NFVF9TSUxPKHRpbWVvdXQsdGhyZXNob2xkKSBcCisJCQkoKChjbWRTeW50YXhQdHIpKGN0OTApKS0+Y21kWzFdID0gKHRpbWVvdXQpLCBcCisJCQkoKGNtZFN5bnRheFB0cikoY3Q5MCkpLT5jbWRbMl0gID0gKHRocmVzaG9sZCksIFwKKwkJCShjbWRTeW50YXhQdHIpKGN0OTApKQorCisvLyBTZXQgdGltZWQgYnJlYWsgaW4gZGVjaXNlY29uZCAoMS8xMHMpCisvLworI2RlZmluZSBDTURfTEJSRUFLKGRzKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDkxKSktPmNtZFsxXSA9IChkcyksKGNtZFN5bnRheFB0cikoY3Q2NikpCisKKworCisjZW5kaWYgLy8gSTJDTURfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2kyZWxsaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODM0ZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmMKQEAgLTAsMCArMSwxNDg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIChjKSAxOTk4IGJ5IENvbXB1dG9uZSBDb3Jwb3JhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogICBQQUNLQUdFOiAgICAgTGludXggdHR5IERldmljZSBEcml2ZXIgZm9yIEludGVsbGlQb3J0IGZhbWlseSBvZiBtdWx0aXBvcnQKKyogICAgICAgICAgICAgICAgc2VyaWFsIEkvTyBjb250cm9sbGVycy4KKyoKKyogICBERVNDUklQVElPTjogTG93LWxldmVsIGludGVyZmFjZSBjb2RlIGZvciB0aGUgZGV2aWNlIGRyaXZlcgorKiAgICAgICAgICAgICAgICAoVGhpcyBpcyBpbmNsdWRlZCBzb3VyY2UgY29kZSwgbm90IGEgc2VwYXJhdGUgY29tcGlsYXRpb24KKyogICAgICAgICAgICAgICAgbW9kdWxlLikKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb24gZGVjbGFyYXRpb25zIHByaXZhdGUgdG8gdGhpcyBtb2R1bGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbnMgY2FsbGVkIG9ubHkgaW5kaXJlY3RseSB0aHJvdWdoIGkyZUJvcmRTdHIgZW50cmllcy4KKworc3RhdGljIGludCBpaVdyaXRlQnVmMTYoaTJlQm9yZFN0clB0ciwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBpaVdyaXRlQnVmOChpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IGlpUmVhZEJ1ZjE2KGkyZUJvcmRTdHJQdHIsIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgaWlSZWFkQnVmOChpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBjaGFyICosIGludCk7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpaVJlYWRXb3JkMTYoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWlSZWFkV29yZDgoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgdm9pZCBpaVdyaXRlV29yZDE2KGkyZUJvcmRTdHJQdHIsIHVuc2lnbmVkIHNob3J0KTsKK3N0YXRpYyB2b2lkIGlpV3JpdGVXb3JkOChpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBzaG9ydCk7CisKK3N0YXRpYyBpbnQgaWlXYWl0Rm9yVHhFbXB0eUlJKGkyZUJvcmRTdHJQdHIsIGludCk7CitzdGF0aWMgaW50IGlpV2FpdEZvclR4RW1wdHlJSUVYKGkyZUJvcmRTdHJQdHIsIGludCk7CitzdGF0aWMgaW50IGlpVHhNYWlsRW1wdHlJSShpMmVCb3JkU3RyUHRyKTsKK3N0YXRpYyBpbnQgaWlUeE1haWxFbXB0eUlJRVgoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgaW50IGlpVHJ5U2VuZE1haWxJSShpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBjaGFyKTsKK3N0YXRpYyBpbnQgaWlUcnlTZW5kTWFpbElJRVgoaTJlQm9yZFN0clB0ciwgdW5zaWduZWQgY2hhcik7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpaUdldE1haWxJSShpMmVCb3JkU3RyUHRyKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpaUdldE1haWxJSUVYKGkyZUJvcmRTdHJQdHIpOworCitzdGF0aWMgdm9pZCBpaUVuYWJsZU1haWxJcnFJSShpMmVCb3JkU3RyUHRyKTsKK3N0YXRpYyB2b2lkIGlpRW5hYmxlTWFpbElycUlJRVgoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgdm9pZCBpaVdyaXRlTWFza0lJKGkyZUJvcmRTdHJQdHIsIHVuc2lnbmVkIGNoYXIpOworc3RhdGljIHZvaWQgaWlXcml0ZU1hc2tJSUVYKGkyZUJvcmRTdHJQdHIsIHVuc2lnbmVkIGNoYXIpOworCitzdGF0aWMgdm9pZCBpaTJEZWxheVRpbWVyKHVuc2lnbmVkIGludCk7CitzdGF0aWMgdm9pZCBpaTJEZWxheVdha2V1cCh1bnNpZ25lZCBsb25nIGlkKTsKK3N0YXRpYyB2b2lkIGlpMk5vcCh2b2lkKTsKKworLy8qKioqKioqKioqKioqKioKKy8vKiBTdGF0aWMgRGF0YSAqCisvLyoqKioqKioqKioqKioqKgorCitzdGF0aWMgaW50IGlpMlNhZmU7ICAgICAgICAgLy8gU2FmZSBJL08gYWRkcmVzcyBmb3IgZGVsYXkgcm91dGluZQorCitzdGF0aWMgaW50IGlpRGVsYXllZDsJLy8gU2V0IHdoZW4gdGhlIGlpUmVzZXREZWxheSBmdW5jdGlvbiBpcworCQkJCQkJCS8vIGNhbGxlZC4gQ2xlYXJlZCB3aGVuIEFOWSBib2FyZCBpcyByZXNldC4KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCAqIHBEZWxheVRpbWVyOyAgIC8vIFVzZWQgYnkgaWlEZWxheVRpbWVyCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgcERlbGF5V2FpdDsgICAgLy8gVXNlZCBieSBpaURlbGF5VGltZXIKK3N0YXRpYyByd2xvY2tfdCBEbF9zcGlubG9jazsKKworLy8qKioqKioqKgorLy8qIENvZGUgKgorLy8qKioqKioqKgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEluaXRpYWxpemF0aW9uIFJvdXRpbmVzCisvLworLy8gaWlTZXRBZGRyZXNzCisvLyBpaVJlc2V0CisvLyBpaVJlc2V0RGVsYXkKKy8vIGlpSW5pdGlhbGl6ZQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaUVsbGlzSW5pdCgpCisvLyBQYXJhbWV0ZXJzOiBOb25lCisvLworLy8gUmV0dXJuczogICAgTm90aGluZworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGlpRWxsaXMgc3Vic3lzdGVtLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWlFbGxpc0luaXQodm9pZCkKK3sKKwlwRGVsYXlUaW1lciA9IGttYWxsb2MgKCBzaXplb2YgKHN0cnVjdCB0aW1lcl9saXN0KSwgR0ZQX0tFUk5FTCApOworCWluaXRfdGltZXIocERlbGF5VGltZXIpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBEZWxheVdhaXQpOworCUxPQ0tfSU5JVCgmRGxfc3BpbmxvY2spOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlFbGxpc0NsZWFudXAoKQorLy8gUGFyYW1ldGVyczogTm9uZQorLy8KKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IHJlcXVpcmVkIGNsZWFudXAgb2YgdGhlIGlpRWxsaXMgc3Vic3lzdGVtLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWlFbGxpc0NsZWFudXAodm9pZCkKK3sKKwlpZiAoIHBEZWxheVRpbWVyICE9IE5VTEwgKSB7CisJCWtmcmVlICggcERlbGF5VGltZXIgKTsKKwl9Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVNldEFkZHJlc3MocEIsIGFkZHJlc3MsIGRlbGF5KQorLy8gUGFyYW1ldGVyczogcEIgICAgICAtIHBvaW50ZXIgdG8gdGhlIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgYWRkcmVzcyAtIHRoZSBwdXJwb3J0ZWQgSS9PIGFkZHJlc3Mgb2YgdGhlIGJvYXJkCisvLyAgICAgICAgICAgICBkZWxheSAgIC0gcG9pbnRlciB0byB0aGUgMS1tcyBkZWxheSBmdW5jdGlvbiB0byB1c2UKKy8vICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGFuZCBhbnkgZnV0dXJlIG9wZXJhdGlvbnMgdG8gdGhpcyBib2FyZAorLy8KKy8vIFJldHVybnM6ICAgIFRydWUgaWYgZXZlcnl0aGluZyBhcHBlYXJzIGNvcGFjZXRpYy4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIHRoZXJlIGlzIGFueSBlcnJvcjogdGhlIHBCLT5pMmVFcnJvciBmaWVsZCBoYXMgdGhlIGVycm9yCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gVGhpcyByb3V0aW5lIChyb3VnaGx5KSBjaGVja3MgZm9yIGFkZHJlc3MgdmFsaWRpdHksIHNldHMgdGhlIGkyZVZhbGlkIE9LIGFuZAorLy8gc2V0cyB0aGUgc3RhdGUgdG8gSUlfU1RBVEVfQ09MRCB3aGljaCBtZWFucyB0aGF0IHdlIGhhdmVuJ3QgZXZlbiBzZW50IGEgcmVzZXQKKy8vIHlldC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlTZXRBZGRyZXNzKCBpMmVCb3JkU3RyUHRyIHBCLCBpbnQgYWRkcmVzcywgZGVsYXlGdW5jX3QgZGVsYXkgKQoreworCS8vIFNob3VsZCBhbnkgZmFpbHVyZSBvY2N1ciBiZWZvcmUgaW5pdCBpcyBmaW5pc2hlZC4uLgorCXBCLT5pMmVWYWxpZCA9IEkyRV9JTkNPTVBMRVRFOworCisJLy8gQ2Fubm90IGNoZWNrIHVwcGVyIGxpbWl0IGV4Y2VwdCBleHRyZW1lbHk6IE1pZ2h0IGJlIG1pY3JvY2hhbm5lbAorCS8vIEFkZHJlc3MgbXVzdCBiZSBvbiBhbiA4LWJ5dGUgYm91bmRhcnkKKworCWlmICgodW5zaWduZWQgaW50KWFkZHJlc3MgPD0gMHgxMDAKKwkJfHwgKHVuc2lnbmVkIGludClhZGRyZXNzID49IDB4ZmZmOAorCQl8fCAoYWRkcmVzcyAmIDB4NykKKwkJKQorCXsKKwkJQ09NUExFVEUocEIsSTJFRV9CQURBRERSKTsKKwl9CisKKwkvLyBJbml0aWFsaXplIGFjY2VsZXJhdG9ycworCXBCLT5pMmVCYXNlICAgID0gYWRkcmVzczsKKwlwQi0+aTJlRGF0YSAgICA9IGFkZHJlc3MgKyBGSUZPX0RBVEE7CisJcEItPmkyZVN0YXR1cyAgPSBhZGRyZXNzICsgRklGT19TVEFUVVM7CisJcEItPmkyZVBvaW50ZXIgPSBhZGRyZXNzICsgRklGT19QVFI7CisJcEItPmkyZVhNYWlsICAgPSBhZGRyZXNzICsgRklGT19NQUlMOworCXBCLT5pMmVYTWFzayAgID0gYWRkcmVzcyArIEZJRk9fTUFTSzsKKworCS8vIEluaXRpYWxpemUgaS9vIGFkZHJlc3MgZm9yIGlpMkRlbGF5SU8KKwlpaTJTYWZlID0gYWRkcmVzcyArIEZJRk9fTk9QOworCisJLy8gSW5pdGlhbGl6ZSB0aGUgZGVsYXkgcm91dGluZQorCXBCLT5pMmVEZWxheSA9ICgoZGVsYXkgIT0gKGRlbGF5RnVuY190KU5VTEwpID8gZGVsYXkgOiAoZGVsYXlGdW5jX3QpaWkyTm9wKTsKKworCXBCLT5pMmVWYWxpZCA9IEkyRV9NQUdJQzsKKwlwQi0+aTJlU3RhdGUgPSBJSV9TVEFURV9DT0xEOworCisJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVJlc2V0KHBCKQorLy8gUGFyYW1ldGVyczogcEIgLSBwb2ludGVyIHRvIHRoZSBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIEF0dGVtcHRzIHRvIHJlc2V0IHRoZSBib2FyZCAoc2VlIGFsc28gaTJody5oKS4gTm9ybWFsbHksIHdlIHdvdWxkIHVzZSB0aGlzIHRvCisvLyByZXNldCBhIGJvYXJkIGltbWVkaWF0ZWx5IGFmdGVyIGlpU2V0QWRkcmVzcygpLCBidXQgaXQgaXMgdmFsaWQgdG8gcmVzZXQgYQorLy8gYm9hcmQgZnJvbSBhbnkgc3RhdGUsIHNheSwgaW4gb3JkZXIgdG8gY2hhbmdlIG9yIHJlLWxvYWQgbG9hZHdhcmUuIChVbmRlcgorLy8gc3VjaCBjaXJjdW1zdGFuY2VzLCBubyByZWFzb24gdG8gcmUtcnVuIGlpU2V0QWRkcmVzcygpLCB3aGljaCBpcyB3aHkgaXQgaXMgYQorLy8gc2VwYXJhdGUgcm91dGluZSBhbmQgbm90IGluY2x1ZGVkIGluIHRoaXMgcm91dGluZS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlSZXNldChpMmVCb3JkU3RyUHRyIHBCKQoreworCS8vIE1hZ2ljIG51bWJlciBzaG91bGQgYmUgc2V0LCBlbHNlIGV2ZW4gdGhlIGFkZHJlc3MgaXMgc3VzcGVjdAorCWlmIChwQi0+aTJlVmFsaWQgIT0gSTJFX01BR0lDKQorCXsKKwkJQ09NUExFVEUocEIsIEkyRUVfQkFETUFHSUMpOworCX0KKworCU9VVEIocEItPmkyZUJhc2UgKyBGSUZPX1JFU0VULCAwKTsgIC8vIEFueSBkYXRhIHdpbGwgZG8KKwlpaURlbGF5KHBCLCA1MCk7ICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSBiZXR3ZWVuIHJlc2V0cworCU9VVEIocEItPmkyZUJhc2UgKyBGSUZPX1JFU0VULCAwKTsgIC8vIFNlY29uZCByZXNldAorCisJLy8gV2UgbXVzdCB3YWl0IGJlZm9yZSBldmVuIGF0dGVtcHRpbmcgdG8gcmVhZCBhbnl0aGluZyBmcm9tIHRoZSBGSUZPOiB0aGUKKwkvLyBib2FyZCdzIFAuTy5TLlQgbWF5IGFjdHVhbGx5IGF0dGVtcHQgdG8gcmVhZCBhbmQgd3JpdGUgaXRzIGVuZCBvZiB0aGUKKwkvLyBGSUZPIGluIG9yZGVyIHRvIGNoZWNrIGZsYWdzLCBsb29wIGJhY2sgKHdoZXJlIHN1cHBvcnRlZCksIGV0Yy4gT24KKwkvLyBjb21wbGV0aW9uIG9mIHRoaXMgdGVzdGluZyBpdCB3b3VsZCByZXNldCB0aGUgRklGTywgYW5kIG9uIGNvbXBsZXRpb24KKwkvLyBvZiBhbGwgLy8gUC5PLlMuVC4sIHdyaXRlIHRoZSBtZXNzYWdlLiBXZSBtdXN0IG5vdCBtaXN0YWtlIGRhdGEgd2hpY2gKKwkvLyBtaWdodCBoYXZlIGJlZW4gc2VudCBmb3IgdGVzdGluZyBhcyBwYXJ0IG9mIHRoZSByZXNldCBtZXNzYWdlLiBUbworCS8vIGJldHRlciB1dGlsaXplIHRpbWUsIHNheSwgd2hlbiByZXNldHRpbmcgc2V2ZXJhbCBib2FyZHMsIHdlIGFsbG93IHRoZQorCS8vIGRlbGF5IHRvIGJlIHBlcmZvcm1lZCBleHRlcm5hbGx5OyBpbiB0aGlzIHdheSB0aGUgY2FsbGVyIGNhbiByZXNldCAKKwkvLyBzZXZlcmFsIGJvYXJkcywgZGVsYXkgYSBzaW5nbGUgdGltZSwgdGhlbiBjYWxsIHRoZSBpbml0aWFsaXphdGlvbgorCS8vIHJvdXRpbmUgZm9yIGFsbC4KKworCXBCLT5pMmVTdGF0ZSA9IElJX1NUQVRFX1JFU0VUOworCisJaWlEZWxheWVkID0gMDsJLy8gaS5lLiwgdGhlIGRlbGF5IHJvdXRpbmUgaGFzbid0IGJlZW4gY2FsbGVkIHNpbmNlIHRoZSBtb3N0CisJCQkJCS8vIHJlY2VudCByZXNldC4KKworCS8vIEVuc3VyZSBhbnl0aGluZyB3aGljaCB3b3VsZCBoYXZlIGJlZW4gb2YgdXNlIHRvIHN0YW5kYXJkIGxvYWR3YXJlIGlzCisJLy8gYmxhbmtlZCBvdXQsIHNpbmNlIGJvYXJkIGhhcyBub3cgZm9yZ290dGVuIGV2ZXJ5dGhpbmchLgorCisJcEItPmkyZVVzaW5nSXJxID0gSVJRX1VOREVGSU5FRDsgLy8gTm90IHNldCB1cCB0byB1c2UgYW4gaW50ZXJydXB0IHlldAorCXBCLT5pMmVXYWl0aW5nRm9yRW1wdHlGaWZvID0gMDsKKwlwQi0+aTJlT3V0TWFpbFdhaXRpbmcgPSAwOworCXBCLT5pMmVDaGFubmVsUHRyID0gTlVMTDsKKwlwQi0+aTJlQ2hhbm5lbENudCA9IDA7CisKKwlwQi0+aTJlTGVhZG9mZldvcmRbMF0gPSAwOworCXBCLT5pMmVGaWZvSW5JbnRzID0gMDsKKwlwQi0+aTJlRmlmb091dEludHMgPSAwOworCXBCLT5pMmVGYXRhbFRyYXAgPSBOVUxMOworCXBCLT5pMmVGYXRhbCA9IDA7CisKKwlDT01QTEVURShwQiwgSTJFRV9HT09EKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpUmVzZXREZWxheShwQikKKy8vIFBhcmFtZXRlcnM6IHBCIC0gcG9pbnRlciB0byB0aGUgYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBVc2luZyB0aGUgZGVsYXkgZGVmaW5lZCBpbiBib2FyZCBzdHJ1Y3R1cmUsIHdhaXRzIHR3byBzZWNvbmRzIChmb3IgYm9hcmQgdG8KKy8vIHJlc2V0KS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlSZXNldERlbGF5KGkyZUJvcmRTdHJQdHIgcEIpCit7CisJaWYgKHBCLT5pMmVWYWxpZCAhPSBJMkVfTUFHSUMpIHsKKwkJQ09NUExFVEUocEIsIEkyRUVfQkFETUFHSUMpOworCX0KKwlpZiAocEItPmkyZVN0YXRlICE9IElJX1NUQVRFX1JFU0VUKSB7CisJCUNPTVBMRVRFKHBCLCBJMkVFX0JBRFNUQVRFKTsKKwl9CisJaWlEZWxheShwQiwyMDAwKTsgICAgICAgLyogTm93IHdlIHdhaXQgZm9yIHR3byBzZWNvbmRzLiAqLworCWlpRGVsYXllZCA9IDE7ICAgICAgICAgIC8qIERlbGF5IGhhcyBiZWVuIGNhbGxlZDogb2sgdG8gaW5pdGlhbGl6ZSAqLworCUNPTVBMRVRFKHBCLCBJMkVFX0dPT0QpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlJbml0aWFsaXplKHBCKQorLy8gUGFyYW1ldGVyczogcEIgLSBwb2ludGVyIHRvIHRoZSBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIEF0dGVtcHRzIHRvIHJlYWQgdGhlIFBvd2VyLW9uIHJlc2V0IG1lc3NhZ2UuIEluaXRpYWxpemVzIGFueSByZW1haW5pbmcgZmllbGRzCisvLyBpbiB0aGUgcEIgc3RydWN0dXJlLgorLy8KKy8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhcyB0aGUgdGhpcmQgc3RlcCBvZiBhIHByb2Nlc3MgYmVnaW5uaW5nIHdpdGgKKy8vIGlpUmVzZXQoKSwgdGhlbiBpaVJlc2V0RGVsYXkoKS4gVGhpcyByb3V0aW5lIGNoZWNrcyB0byBzZWUgdGhhdCB0aGUgc3RydWN0dXJlCisvLyBpcyAidmFsaWQiIGFuZCBpbiB0aGUgcmVzZXQgc3RhdGUsIGFsc28gY29uZmlybXMgdGhhdCB0aGUgZGVsYXkgcm91dGluZSBoYXMKKy8vIGJlZW4gY2FsbGVkIHNpbmNlIHRoZSBsYXRlc3QgcmVzZXQgKHRvIGFueSBib2FyZCEgb3Zlcmx5IHN0cm9uZyEpLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaUluaXRpYWxpemUoaTJlQm9yZFN0clB0ciBwQikKK3sKKwlpbnQgaXRlbXA7CisJdW5zaWduZWQgY2hhciBjOworCXVuc2lnbmVkIHNob3J0IHV0ZW1wOworCXVuc2lnbmVkIGludCBpbGltaXQ7CisKKwlpZiAocEItPmkyZVZhbGlkICE9IEkyRV9NQUdJQykKKwl7CisJCUNPTVBMRVRFKHBCLCBJMkVFX0JBRE1BR0lDKTsKKwl9CisKKwlpZiAocEItPmkyZVN0YXRlICE9IElJX1NUQVRFX1JFU0VUIHx8ICFpaURlbGF5ZWQpCisJeworCQlDT01QTEVURShwQiwgSTJFRV9CQURTVEFURSk7CisJfQorCisJLy8gSW4gY2FzZSB0aGVyZSBpcyBhIGZhaWx1cmUgc2hvcnQgb2Ygb3VyIGNvbXBsZXRlbHkgcmVhZGluZyB0aGUgcG93ZXItdXAKKwkvLyBtZXNzYWdlLgorCXBCLT5pMmVWYWxpZCA9IEkyRV9JTkNPTVBMRVRFOworCisKKwkvLyBOb3cgYXR0ZW1wdCB0byByZWFkIHRoZSBtZXNzYWdlLgorCisJZm9yIChpdGVtcCA9IDA7IGl0ZW1wIDwgc2l6ZW9mKHBvclN0cik7IGl0ZW1wKyspCisJeworCQkvLyBXZSBleHBlY3QgdGhlIGVudGlyZSBtZXNzYWdlIGlzIHJlYWR5LgorCQlpZiAoSEFTX05PX0lOUFVUKHBCKSkKKwkJeworCQkJcEItPmkyZVBvbVNpemUgPSBpdGVtcDsKKwkJCUNPTVBMRVRFKHBCLCBJMkVFX1BPUk1fU0hPUlQpOworCQl9CisKKwkJcEItPmkyZVBvbS5jW2l0ZW1wXSA9IGMgPSBCWVRFX0ZST00ocEIpOworCisJCS8vIFdlIGNoZWNrIHRoZSBtYWdpYyBudW1iZXJzIGFzIHNvb24gYXMgdGhleSBhcmUgc3VwcG9zZWQgdG8gYmUgcmVhZAorCQkvLyAocmF0aGVyIHRoYW4gYWZ0ZXIpIHRvIG1pbmltaXplIGVmZmVjdCBvZiByZWFkaW5nIHNvbWV0aGluZyB3ZQorCQkvLyBhbHJlYWR5IHN1c3BlY3QgY2FuJ3QgYmUgInVzIi4KKwkJaWYgKCAgKGl0ZW1wID09IFBPUl8xX0lOREVYICYmIGMgIT0gUE9SX01BR0lDXzEpIHx8CisJCQkJKGl0ZW1wID09IFBPUl8yX0lOREVYICYmIGMgIT0gUE9SX01BR0lDXzIpKQorCQl7CisJCQlwQi0+aTJlUG9tU2l6ZSA9IGl0ZW1wKzE7CisJCQlDT01QTEVURShwQiwgSTJFRV9CQURNQUdJQyk7CisJCX0KKwl9CisKKwlwQi0+aTJlUG9tU2l6ZSA9IGl0ZW1wOworCisJLy8gRW5zdXJlIHRoYXQgdGhpcyB3YXMgYWxsIHRoZSBkYXRhLi4uCisJaWYgKEhBU19JTlBVVChwQikpCisJCUNPTVBMRVRFKHBCLCBJMkVFX1BPUk1fTE9ORyk7CisKKwkvLyBGb3Igbm93LCB3ZSdsbCBmYWlsIHRvIGluaXRpYWxpemUgaWYgUC5PLlMuVCByZXBvcnRzIGJhZCBjaGlwIG1hcHBlcjoKKwkvLyBJbXBseWluZyB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGRvd25sb2FkIGFueSBjb2RlIGVpdGhlcjogIFRoYXQncyBvazogdGhlCisJLy8gY29uZGl0aW9uIGlzIHByZXR0eSBleHBsaWNpdC4KKwlpZiAocEItPmkyZVBvbS5lLnBvckRpYWcxICYgUE9SX0JBRF9NQVBQRVIpCisJeworCQlDT01QTEVURShwQiwgSTJFRV9QT1NURVJSKTsKKwl9CisKKwkvLyBEZXRlcm1pbmUgYW55dGhpbmcgd2hpY2ggbXVzdCBiZSBkb25lIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB0aGUgZmFtaWx5CisJLy8gb2YgYm9hcmRzIQorCXN3aXRjaCAocEItPmkyZVBvbS5lLnBvcklEICYgUE9SX0lEX0ZBTUlMWSkKKwl7CisJY2FzZSBQT1JfSURfRklJOiAgLy8gSW50ZWxsaVBvcnQtSUkKKworCQlwQi0+aTJlRmlmb1N0eWxlICAgPSBGSUZPX0lJOworCQlwQi0+aTJlRmlmb1NpemUgICAgPSA1MTI7ICAgICAvLyA1MTIgYnl0ZXMsIGFsd2F5cworCQlwQi0+aTJlRGF0YVdpZHRoMTYgPSBOTzsKKworCQlwQi0+aTJlTWF4SXJxID0gMTU7CS8vIEJlY2F1c2UgYm9hcmQgY2Fubm90IHRlbGwgdXMgaXQgaXMgaW4gYW4gOC1iaXQKKwkJCQkJCQkvLyBzbG90LCB3ZSBkbyBhbGxvdyBpdCB0byBiZSBkb25lIChkb2N1bWVudGF0aW9uISkKKworCQlwQi0+aTJlR29vZE1hcFsxXSA9CisJCXBCLT5pMmVHb29kTWFwWzJdID0KKwkJcEItPmkyZUdvb2RNYXBbM10gPQorCQlwQi0+aTJlQ2hhbm5lbE1hcFsxXSA9CisJCXBCLT5pMmVDaGFubmVsTWFwWzJdID0KKwkJcEItPmkyZUNoYW5uZWxNYXBbM10gPSAwOworCisJCXN3aXRjaCAocEItPmkyZVBvbS5lLnBvcklEICYgUE9SX0lEX1NJWkUpCisJCXsKKwkJY2FzZSBQT1JfSURfSUlfNDoKKwkJCXBCLT5pMmVHb29kTWFwWzBdID0KKwkJCXBCLT5pMmVDaGFubmVsTWFwWzBdID0gMHgwZjsgIC8vIGZvdXItcG9ydAorCisJCQkvLyBTaW5jZSBwb3JQb3J0czEgaXMgYmFzZWQgb24gdGhlIEhhcmR3YXJlIElEIHJlZ2lzdGVyLCB0aGUgbnVtYmVycworCQkJLy8gc2hvdWxkIGFsd2F5cyBiZSBjb25zaXN0ZW50IGZvciBJbnRlbGxpUG9ydC1JSS4gIERpdHRvIGJlbG93Li4uCisJCQlpZiAocEItPmkyZVBvbS5lLnBvclBvcnRzMSAhPSA0KQorCQkJeworCQkJCUNPTVBMRVRFKHBCLCBJMkVFX0lOQ09OU0lTVCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFBPUl9JRF9JSV84OgorCQljYXNlIFBPUl9JRF9JSV84UjoKKwkJCXBCLT5pMmVHb29kTWFwWzBdID0KKwkJCXBCLT5pMmVDaGFubmVsTWFwWzBdID0gMHhmZjsgIC8vIEVpZ2h0IHBvcnQKKwkJCWlmIChwQi0+aTJlUG9tLmUucG9yUG9ydHMxICE9IDgpCisJCQl7CisJCQkJQ09NUExFVEUocEIsIEkyRUVfSU5DT05TSVNUKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUE9SX0lEX0lJXzY6CisJCQlwQi0+aTJlR29vZE1hcFswXSA9CisJCQlwQi0+aTJlQ2hhbm5lbE1hcFswXSA9IDB4M2Y7ICAvLyBTaXggUG9ydAorCQkJaWYgKHBCLT5pMmVQb20uZS5wb3JQb3J0czEgIT0gNikKKwkJCXsKKwkJCQlDT01QTEVURShwQiwgSTJFRV9JTkNPTlNJU1QpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBGaXggdXAgdGhlICJnb29kIGNoYW5uZWwgbGlzdCBiYXNlZCBvbiBhbnkgZXJyb3JzIHJlcG9ydGVkLgorCQlpZiAocEItPmkyZVBvbS5lLnBvckRpYWcxICYgUE9SX0JBRF9VQVJUMSkKKwkJeworCQkJcEItPmkyZUdvb2RNYXBbMF0gJj0gfjB4MGY7CisJCX0KKworCQlpZiAocEItPmkyZVBvbS5lLnBvckRpYWcxICYgUE9SX0JBRF9VQVJUMikKKwkJeworCQkJcEItPmkyZUdvb2RNYXBbMF0gJj0gfjB4ZjA7CisJCX0KKworCQlicmVhazsgICAvLyBQT1JfSURfRklJIGNhc2UKKworCWNhc2UgUE9SX0lEX0ZJSUVYOiAgIC8vIEludGVsbGlQb3J0LUlJRVgKKworCQlwQi0+aTJlRmlmb1N0eWxlID0gRklGT19JSUVYOworCisJCWl0ZW1wID0gcEItPmkyZVBvbS5lLnBvckZpZm9TaXplOworCisJCS8vIEltcGxpY2l0IGFzc3VtcHRpb24gdGhhdCBmaWZvIHdvdWxkIG5vdCBncm93IGJleW9uZCAzMmssIAorCQkvLyBub3Igd291bGQgZXZlciBiZSBsZXNzIHRoYW4gMjU2LgorCisJCWlmIChpdGVtcCA8IDggfHwgaXRlbXAgPiAxNSkKKwkJeworCQkJQ09NUExFVEUocEIsIEkyRUVfSU5DT05TSVNUKTsKKwkJfQorCQlwQi0+aTJlRmlmb1NpemUgPSAoMSA8PCBpdGVtcCk7CisKKwkJLy8gVGhlc2UgYXJlIGJhc2VkIG9uIHdoYXQgUC5PLlMuVCB0aGlua3Mgc2hvdWxkIGJlIHRoZXJlLCBiYXNlZCBvbgorCQkvLyBib3ggSUQgcmVnaXN0ZXJzCisJCWlsaW1pdCA9IHBCLT5pMmVQb20uZS5wb3JOdW1Cb3hlczsKKwkJaWYgKGlsaW1pdCA+IEFCU19NQVhfQk9YRVMpCisJCXsKKwkJCWlsaW1pdCA9IEFCU19NQVhfQk9YRVM7CisJCX0KKworCQkvLyBGb3IgYXMgbWFueSBib3hlcyBhcyBFWElTVCwgZ2l2ZXMgdGhlIHR5cGUgb2YgYm94LgorCQkvLyBBZGRlZCA4LzYvOTM6IGNoZWNrIGZvciB0aGUgSVNBLTQgKGFzaWMpIHdoaWNoIGxvb2tzIGxpa2UgYW4KKwkJLy8gZXhwYW5kYWJsZSBidXQgZm9yIHdob20gIjggb3IgMTY/IiBpcyBub3QgdGhlIHJpZ2h0IHF1ZXN0aW9uLgorCisJCXV0ZW1wID0gcEItPmkyZVBvbS5lLnBvckZsYWdzOworCQlpZiAodXRlbXAgJiBQT1JfQ0VYNCkKKwkJeworCQkJcEItPmkyZUNoYW5uZWxNYXBbMF0gPSAweDAwMGY7CisJCX0gZWxzZSB7CisJCQl1dGVtcCAmPSBQT1JfQk9YRVM7CisJCQlmb3IgKGl0ZW1wID0gMDsgaXRlbXAgPCBpbGltaXQ7IGl0ZW1wKyspCisJCQl7CisJCQkJcEItPmkyZUNoYW5uZWxNYXBbaXRlbXBdID0gCisJCQkJCSgodXRlbXAgJiBQT1JfQk9YXzE2KSA/IDB4ZmZmZiA6IDB4MDBmZik7CisJCQkJdXRlbXAgPj49IDE7CisJCQl9CisJCX0KKworCQkvLyBUaGVzZSBhcmUgYmFzZWQgb24gd2hhdCBQLk8uUy5UIGFjdHVhbGx5IGZvdW5kLgorCisJCXV0ZW1wID0gKHBCLT5pMmVQb20uZS5wb3JQb3J0czIgPDwgOCkgKyBwQi0+aTJlUG9tLmUucG9yUG9ydHMxOworCisJCWZvciAoaXRlbXAgPSAwOyBpdGVtcCA8IGlsaW1pdDsgaXRlbXArKykKKwkJeworCQkJcEItPmkyZUdvb2RNYXBbaXRlbXBdID0gMDsKKwkJCWlmICh1dGVtcCAmIDEpIHBCLT5pMmVHb29kTWFwW2l0ZW1wXSB8PSAweDAwMGY7CisJCQlpZiAodXRlbXAgJiAyKSBwQi0+aTJlR29vZE1hcFtpdGVtcF0gfD0gMHgwMGYwOworCQkJaWYgKHV0ZW1wICYgNCkgcEItPmkyZUdvb2RNYXBbaXRlbXBdIHw9IDB4MGYwMDsKKwkJCWlmICh1dGVtcCAmIDgpIHBCLT5pMmVHb29kTWFwW2l0ZW1wXSB8PSAweGYwMDA7CisJCQl1dGVtcCA+Pj0gNDsKKwkJfQorCisJCS8vIE5vdyBkZXRlcm1pbmUgd2hldGhlciB3ZSBzaG91bGQgdHJhbnNmZXIgaW4gOCBvciAxNi1iaXQgbW9kZS4KKwkJc3dpdGNoIChwQi0+aTJlUG9tLmUucG9yQnVzICYgKFBPUl9CVVNfU0xPVDE2IHwgUE9SX0JVU19ESVAxNikgKQorCQl7CisJCWNhc2UgUE9SX0JVU19TTE9UMTYgfCBQT1JfQlVTX0RJUDE2OgorCQkJcEItPmkyZURhdGFXaWR0aDE2ID0gWUVTOworCQkJcEItPmkyZU1heElycSA9IDE1OworCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JfQlVTX1NMT1QxNjoKKwkJCXBCLT5pMmVEYXRhV2lkdGgxNiA9IE5POworCQkJcEItPmkyZU1heElycSA9IDE1OworCQkJYnJlYWs7CisKKwkJY2FzZSAwOgorCQljYXNlIFBPUl9CVVNfRElQMTY6ICAgICAvLyBJbiBhbiA4LWJpdCBzbG90LCBESVAgc3dpdGNoIGRvbid0IGNhcmUuCisJCWRlZmF1bHQ6CisJCQlwQi0+aTJlRGF0YVdpZHRoMTYgPSBOTzsKKwkJCXBCLT5pMmVNYXhJcnEgPSA3OworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7ICAgLy8gUE9SX0lEX0ZJSUVYIGNhc2UKKworCWRlZmF1bHQ6ICAgIC8vIFVua25vd24gdHlwZSBvZiBib2FyZAorCQlDT01QTEVURShwQiwgSTJFRV9CQURfRkFNSUxZKTsKKwkJYnJlYWs7CisJfSAgLy8gRW5kIHRoZSBzd2l0Y2ggYmFzZWQgb24gZmFtaWx5CisKKwkvLyBUZW1wb3JhcmlseSwgY2xhaW0gdGhlcmUgaXMgbm8gcm9vbSBpbiB0aGUgb3V0Ym91bmQgZmlmby4gCisJLy8gV2Ugd2lsbCBtYWludGFpbiB0aGlzIHdoZW5ldmVyIHdlIGNoZWNrIGZvciBhbiBlbXB0eSBvdXRib3VuZCBGSUZPLgorCXBCLT5pMmVGaWZvUmVtYWlucyA9IDA7CisKKwkvLyBOb3csIGJhc2VkIG9uIHRoZSBidXMgdHlwZSwgc2hvdWxkIHdlIGV4cGVjdCB0byBiZSBhYmxlIHRvIHJlLWNvbmZpZ3VyZQorCS8vIGludGVycnVwdHMgKHNheSwgZm9yIHRlc3RpbmcgcHVycG9zZXMpLgorCXN3aXRjaCAocEItPmkyZVBvbS5lLnBvckJ1cyAmIFBPUl9CVVNfVFlQRSkKKwl7CisJY2FzZSBQT1JfQlVTX1RfSVNBOgorCWNhc2UgUE9SX0JVU19UX1VOSzogIC8vIElmIHRoZSB0eXBlIG9mIGJ1cyBpcyB1bmRlY2xhcmVkLCBhc3N1bWUgb2suCisJCXBCLT5pMmVDaGFuZ2VJcnEgPSBZRVM7CisJCWJyZWFrOworCWNhc2UgUE9SX0JVU19UX01DQToKKwljYXNlIFBPUl9CVVNfVF9FSVNBOgorCQlwQi0+aTJlQ2hhbmdlSXJxID0gTk87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUNPTVBMRVRFKHBCLCBJMkVFX0JBREJVUyk7CisJfQorCisJaWYgKHBCLT5pMmVEYXRhV2lkdGgxNiA9PSBZRVMpCisJeworCQlwQi0+aTJlV3JpdGVCdWYgID0gaWlXcml0ZUJ1ZjE2OworCQlwQi0+aTJlUmVhZEJ1ZiAgID0gaWlSZWFkQnVmMTY7CisJCXBCLT5pMmVXcml0ZVdvcmQgPSBpaVdyaXRlV29yZDE2OworCQlwQi0+aTJlUmVhZFdvcmQgID0gaWlSZWFkV29yZDE2OworCX0gZWxzZSB7CisJCXBCLT5pMmVXcml0ZUJ1ZiAgPSBpaVdyaXRlQnVmODsKKwkJcEItPmkyZVJlYWRCdWYgICA9IGlpUmVhZEJ1Zjg7CisJCXBCLT5pMmVXcml0ZVdvcmQgPSBpaVdyaXRlV29yZDg7CisJCXBCLT5pMmVSZWFkV29yZCAgPSBpaVJlYWRXb3JkODsKKwl9CisKKwlzd2l0Y2gocEItPmkyZUZpZm9TdHlsZSkKKwl7CisJY2FzZSBGSUZPX0lJOgorCQlwQi0+aTJlV2FpdEZvclR4RW1wdHkgPSBpaVdhaXRGb3JUeEVtcHR5SUk7CisJCXBCLT5pMmVUeE1haWxFbXB0eSAgICA9IGlpVHhNYWlsRW1wdHlJSTsKKwkJcEItPmkyZVRyeVNlbmRNYWlsICAgID0gaWlUcnlTZW5kTWFpbElJOworCQlwQi0+aTJlR2V0TWFpbCAgICAgICAgPSBpaUdldE1haWxJSTsKKwkJcEItPmkyZUVuYWJsZU1haWxJcnEgID0gaWlFbmFibGVNYWlsSXJxSUk7CisJCXBCLT5pMmVXcml0ZU1hc2sgICAgICA9IGlpV3JpdGVNYXNrSUk7CisKKwkJYnJlYWs7CisKKwljYXNlIEZJRk9fSUlFWDoKKwkJcEItPmkyZVdhaXRGb3JUeEVtcHR5ID0gaWlXYWl0Rm9yVHhFbXB0eUlJRVg7CisJCXBCLT5pMmVUeE1haWxFbXB0eSAgICA9IGlpVHhNYWlsRW1wdHlJSUVYOworCQlwQi0+aTJlVHJ5U2VuZE1haWwgICAgPSBpaVRyeVNlbmRNYWlsSUlFWDsKKwkJcEItPmkyZUdldE1haWwgICAgICAgID0gaWlHZXRNYWlsSUlFWDsKKwkJcEItPmkyZUVuYWJsZU1haWxJcnEgID0gaWlFbmFibGVNYWlsSXJxSUlFWDsKKwkJcEItPmkyZVdyaXRlTWFzayAgICAgID0gaWlXcml0ZU1hc2tJSUVYOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQ09NUExFVEUocEIsIEkyRUVfSU5DT05TSVNUKTsKKwl9CisKKwkvLyBJbml0aWFsaXplIHN0YXRlIGluZm9ybWF0aW9uLgorCXBCLT5pMmVTdGF0ZSA9IElJX1NUQVRFX1JFQURZOyAgIC8vIFJlYWR5IHRvIGxvYWQgbG9hZHdhcmUuCisKKwkvLyBTb21lIEZpbmFsIGNsZWFudXA6CisJLy8gRm9yIHNvbWUgYm9hcmRzLCB0aGUgYm9vdHN0cmFwIGZpcm13YXJlIG1heSBwZXJmb3JtIHNvbWUgc29ydCBvZiB0ZXN0CisJLy8gcmVzdWx0aW5nIGluIGEgc3RyYXkgY2hhcmFjdGVyIHBlbmRpbmcgaW4gdGhlIGluY29taW5nIG1haWxib3guIElmIG9uZSBpcworCS8vIHRoZXJlLCBpdCBzaG91bGQgYmUgcmVhZCBhbmQgZGlzY2FyZGVkLCBlc3BlY2lhbGx5IHNpbmNlIGZvciB0aGUgc3RhbmRhcmQKKwkvLyBmaXJtd2FyZSwgaXQncyB0aGUgbWFpbGJveCB0aGF0IGludGVycnVwdHMgdGhlIGhvc3QuCisKKwlwQi0+aTJlU3RhcnRNYWlsID0gaWlHZXRNYWlsKHBCKTsKKworCS8vIFRocm93IGl0IGF3YXkgYW5kIGNsZWFyIHRoZSBtYWlsYm94IHN0cnVjdHVyZSBlbGVtZW50CisJcEItPmkyZVN0YXJ0TWFpbCA9IE5PX01BSUxfSEVSRTsKKworCS8vIEV2ZXJ5dGhpbmcgaXMgb2sgbm93LCByZXR1cm4gd2l0aCBnb29kIHN0YXR1cy8KKworCXBCLT5pMmVWYWxpZCA9IEkyRV9NQUdJQzsKKwlDT01QTEVURShwQiwgSTJFRV9HT09EKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEZWxheSBSb3V0aW5lcworLy8KKy8vIGlpRGVsYXlJTworLy8gaWlOb3AKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgdm9pZAoraWkyRGVsYXlXYWtldXAodW5zaWduZWQgbG9uZyBpZCkKK3sKKwl3YWtlX3VwX2ludGVycnVwdGlibGUgKCAmcERlbGF5V2FpdCApOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWkyRGVsYXlUaW1lcihtc2Vjb25kcykKKy8vIFBhcmFtZXRlcnM6IG1zZWNvbmRzIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheQorLy8KKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBUaGlzIHJvdXRpbmUgZGVsYXlzIGZvciBhcHByb3hpbWF0ZWx5IG1zZWNvbmRzIG1pbGxpc2Vjb25kcyBhbmQgaXMgaW50ZW5kZWQKKy8vIHRvIGJlIGNhbGxlZCBpbmRpcmVjdGx5IHRocm91Z2ggaTJEZWxheSBmaWVsZCBpbiBpMmVCb3JkU3RyLiBJdCB1c2VzIHRoZQorLy8gTGludXggdGltZXJfbGlzdCBtZWNoYW5pc20uCisvLworLy8gVGhlIExpbnV4IHRpbWVycyB1c2UgYSB1bml0IGNhbGxlZCAiamlmZmllcyIgd2hpY2ggYXJlIDEwbVMgaW4gdGhlIEludGVsCisvLyBhcmNoaXRlY3R1cmUuIFRoaXMgZnVuY3Rpb24gcm91bmRzIHRoZSBkZWxheSBwZXJpb2QgdXAgdG8gdGhlIG5leHQgImppZmZ5Ii4KKy8vIEluIHRoZSBBbHBoYSBhcmNoaXRlY3R1cmUgdGhlICJqaWZmeSIgaXMgMW1TLCBidXQgdGhpcyBkcml2ZXIgaXMgbm90IGludGVuZGVkCisvLyBmb3IgQWxwaGEgcGxhdGZvcm1zIGF0IHRoaXMgdGltZS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQKK2lpMkRlbGF5VGltZXIodW5zaWduZWQgaW50IG1zZWNvbmRzKQoreworCXdhaXRfcXVldWVfdCB3YWl0OworCisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCisJaW5pdF90aW1lciAoIHBEZWxheVRpbWVyICk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmcERlbGF5V2FpdCwgJndhaXQpOworCisJc2V0X2N1cnJlbnRfc3RhdGUoIFRBU0tfSU5URVJSVVBUSUJMRSApOworCisJcERlbGF5VGltZXItPmV4cGlyZXMgID0gamlmZmllcyArICggbXNlY29uZHMgKyA5ICkgLyAxMDsKKwlwRGVsYXlUaW1lci0+ZnVuY3Rpb24gPSBpaTJEZWxheVdha2V1cDsKKwlwRGVsYXlUaW1lci0+ZGF0YSAgICAgPSAwOworCisJYWRkX3RpbWVyICggcERlbGF5VGltZXIgKTsKKworCXNjaGVkdWxlKCk7CisKKwlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19SVU5OSU5HICk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnBEZWxheVdhaXQsICZ3YWl0KTsKKworCWRlbF90aW1lciAoIHBEZWxheVRpbWVyICk7Cit9CisKKyNpZiAwCisvL3N0YXRpYyB2b2lkIGlpMkRlbGF5SU8odW5zaWduZWQgaW50KTsKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAhISEgTm90IFVzZWQsIHRoaXMgaXMgRE9TIGNyYXAsIHNvbWUgb2YgeW91IHlvdW5nIGZvbGtzIG1heSBiZSBpbnRlcmVzdGVkIGluCisvLyAgICAgaW4gaG93IHRoaW5ncyB3ZXJlIGRvbmUgaW4gdGhlIHN0b25lIGFnZSBvZiBjYWN1bGF0aW5nIG1hY2hpbmVzICAgICAgICEhIQorLy8gRnVuY3Rpb246ICAgaWkyRGVsYXlJTyhtc2Vjb25kcykKKy8vIFBhcmFtZXRlcnM6IG1zZWNvbmRzIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheQorLy8KKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBUaGlzIHJvdXRpbmUgZGVsYXlzIGZvciBhcHByb3hpbWF0ZWx5IG1zZWNvbmRzIG1pbGxpc2Vjb25kcyBhbmQgaXMgaW50ZW5kZWQKKy8vIHRvIGJlIGNhbGxlZCBpbmRpcmVjdGx5IHRocm91Z2ggaTJEZWxheSBmaWVsZCBpbiBpMmVCb3JkU3RyLiBJdCBpcyBpbnRlbmRlZAorLy8gZm9yIHVzZSB3aGVyZSBhIGNsb2NrLWJhc2VkIGZ1bmN0aW9uIGlzIGltcG9zc2libGU6IGZvciBleGFtcGxlLCBET1MgZHJpdmVycy4KKy8vCisvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIElOIGluc3RydWN0aW9uIHRvIHBsYWNlIGJvdW5kcyBvbiB0aGUgdGltaW5nIGFuZAorLy8gYXNzdW1lcyB0aGF0IGlpMlNhZmUgaGFzIGJlZW4gc2V0LiBUaGlzIGlzIGJlY2F1c2UgSS9PIGluc3RydWN0aW9ucyBhcmUgbm90CisvLyBzdWJqZWN0IHRvIGNhY2hpbmcgYW5kIHdpbGwgdGhlcmVmb3JlIHRha2UgYSBjZXJ0YWluIG1pbmltdW0gdGltZS4gVG8gZW5zdXJlCisvLyB0aGUgZGVsYXkgaXMgYXQgbGVhc3QgbG9uZyBlbm91Z2ggb24gZmFzdCBtYWNoaW5lcywgaXQgaXMgYmFzZWQgb24gc29tZQorLy8gZmFzdGVzdC1jYXNlIGNhbGN1bGF0aW9ucy4gIE9uIHNsb3dlciBtYWNoaW5lcyB0aGlzIG1heSBjYXVzZSBWRVJZIGxvbmcKKy8vIGRlbGF5cy4gKDMgeCBmYXN0ZXN0IGNhc2UpLiBJbiB0aGUgZmFzdGVzdCBjYXNlLCBldmVyeXRoaW5nIGlzIGNhY2hlZCBleGNlcHQKKy8vIHRoZSBJL08gaW5zdHJ1Y3Rpb24gaXRzZWxmLgorLy8KKy8vIFRpbWluZyBjYWxjdWxhdGlvbnM6CisvLyBUaGUgZmFzdGVzdCBidXMgc3BlZWQgZm9yIEkvTyBvcGVyYXRpb25zIGlzIGxpa2VseSB0byBiZSAxMCBNSHouIFRoZSBJL08KKy8vIG9wZXJhdGlvbiBpbiBxdWVzdGlvbiBpcyBhIGJ5dGUgb3BlcmF0aW9uIHRvIGFuIG9kZCBhZGRyZXNzLiBGb3IgOC1iaXQKKy8vIG9wZXJhdGlvbnMsIHRoZSBhcmNoaXRlY3R1cmUgZ2VuZXJhbGx5IGVuZm9yY2VzIHR3byB3YWl0IHN0YXRlcy4gQXQgMTAgTUh6LCBhCisvLyBzaW5nbGUgY3ljbGUgdGltZSBpcyAxMDBuUy4gQSByZWFkIG9wZXJhdGlvbiBhdCB0d28gd2FpdCBzdGF0ZXMgdGFrZXMgNgorLy8gY3ljbGVzIGZvciBhIHRvdGFsIHRpbWUgb2YgNjAwblMuIFRoZXJlZm9yZSBhcHByb3hpbWF0ZWx5IDE2NjYgaXRlcmF0aW9ucworLy8gd291bGQgYmUgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgYSBzaW5nbGUgbWlsbGlzZWNvbmQgZGVsYXkuIFRoZSB3b3JzdAorLy8gKHJlYXNvbmFibGUpIGNhc2Ugd291bGQgYmUgYW4gOE1IeiBzeXN0ZW0gd2l0aCBubyBjYWNoZWluZy4gSW4gdGhpcyBjYXNlLCB0aGUKKy8vIEkvTyBpbnN0cnVjdGlvbiB3b3VsZCB0YWtlIDEyNW5TIHggNiBjeWxlcyA9IDc1MCBuUy4gTW9yZSBpbXBvcnRhbnRseSwgY29kZQorLy8gZmV0Y2ggb2Ygb3RoZXIgaW5zdHJ1Y3Rpb25zIGluIHRoZSBsb29wIHdvdWxkIHRha2UgdGltZSAoemVybyB3YWl0IHN0YXRlcywKKy8vIGhvd2V2ZXIpIGFuZCB3b3VsZCBiZSBoYXJkIHRvIGVzdGltYXRlLiBUaGlzIGlzIG1pbmltaXplZCBieSB1c2luZyBpbi1saW5lCisvLyBhc3NlbWJsZXIgZm9yIHRoZSBpbiBpbm5lciBsb29wIG9mIElOIGluc3RydWN0aW9ucy4gVGhpcyBjb25zaXN0cyBvZiBqdXN0IGEKKy8vIGZldyBieXRlcy4gU28gd2UnbGwgZ3Vlc3MgYWJvdXQgZm91ciBjb2RlIGZldGNoZXMgcGVyIGxvb3AuIEVhY2ggY29kZSBmZXRjaAorLy8gc2hvdWxkIHRha2UgZm91ciBjeWNsZXMsIHNvIHdlIGhhdmUgMTI1blMgKiA4ID0gMTAwMG5TLiBXb3JzdCBjYXNlIHRoZW4gaXMKKy8vIHRoYXQgd2hhdCBzaG91bGQgaGF2ZSB0YWtlbiAxIG1TIHRha2VzIGluc3RlYWQgMTY2NiAqICgxNzUwKSA9IDIuOSBtUy4KKy8vCisvLyBTbyBtdWNoIGZvciB0aGVvcmV0aWNhbCB0aW1pbmdzOiByZXN1bHRzIHVzaW5nIDE2NjYgdmFsdWUgb24gc29tZSBhY3R1YWwKKy8vIG1hY2hpbmVzOgorLy8gSUJNICAgICAgMjg2ICAgICAgNk1IeiAgICAgMy4xNSBtUworLy8gWmVuaXRoICAgMzg2ICAgICAgMzNNSHogICAgMi40NSBtUworLy8gKGJyYW5kWCkgMzg2ICAgICAgMzNNSHogICAgMS45MCBtUyAgKGhhcyBjYWNoZSkKKy8vIChicmFuZFkpIDQ4NiAgICAgIDMzTUh6ICAgIDIuMzUgbVMKKy8vIE5DUiAgICAgIDQ4NiAgICAgID8/ICAgICAgIDEuNjUgbVMgKG1pY3JvY2hhbm5lbCkKKy8vCisvLyBGb3IgbW9zdCBtYWNoaW5lcywgaXQgaXMgcHJvYmFibHkgc2FmZSB0byBzY2FsZSB0aGlzIG51bWJlciBiYWNrIChyZW1lbWJlciwKKy8vIGZvciByb2J1c3Qgb3BlcmF0aW9uIHVzZSBhbiBhY3R1YWwgdGltZWQgZGVsYXkgaWYgcG9zc2libGUpLCBzbyB3ZSBhcmUgdXNpbmcKKy8vIGEgdmFsdWUgb2YgMTE5MC4gVGhpcyB5aWVsZHMgMS4xNyBtUyBmb3IgdGhlIGZhc3Rlc3QgbWFjaGluZSBpbiBvdXIgc2FtcGxlLAorLy8gMS43NSBtUyBmb3IgdHlwaWNhbCAzODYgbWFjaGluZXMsIGFuZCAyLjI1IG1TIHRoZSBhYnNvbHV0ZSBzbG93ZXN0IG1hY2hpbmUuCisvLworLy8gMS8yOS85MzoKKy8vIFRoZSBhYm92ZSB0aW1pbmdzIGFyZSB0b28gc2xvdy4gQWN0dWFsIGN5Y2xlIHRpbWVzIG1pZ2h0IGJlIGZhc3Rlci4gSVNBIGN5Y2xlCisvLyB0aW1lcyBjb3VsZCBhcHByb2FjaCA1MDAgblMsIGFuZCAuLi4KKy8vIFRoZSBJQk0gbW9kZWwgNzcgYmVpbmcgbWljcm9jaGFubmVsIGhhcyBubyB3YWl0IHN0YXRlcyBmb3IgOC1iaXQgcmVhZHMgYW5kCisvLyBzZWVtcyB0byBiZSBhY2Nlc3NpbmcgdGhlIEkvTyBhdCA0NDAgblMgcGVyIGFjY2VzcyAoZnJvbSBzdGFydCBvZiBvbmUgdG8KKy8vIHN0YXJ0IG9mIG5leHQpLiBUaGlzIHdvdWxkIGltcGx5IHdlIG5lZWQgMTAwMC8uNDQwID0gMjI3MiBpdGVyYXRpb25zIHRvCisvLyBndWFyYW50ZWUgd2UgYXJlIGZhc3QgZW5vdWdoLiBJbiBhY3R1YWwgdGVzdGluZywgd2Ugc2VlIHRoYXQgMiAqIDExOTAgYXJlIGluCisvLyBmYWN0IGVub3VnaC4gRm9yIGRpYWdub3N0aWNzLCB3ZSBrZWVwIHRoZSBsZXZlbCBhdCAxMTkwLCBidXQgZGV2ZWxvcGVycyBub3RlCisvLyB0aGlzIG5lZWRzIHR1bmluZy4KKy8vCisvLyBTYWZlIGFzc3VtcHRpb246ICAyMjcwIGkvbyByZWFkcyA9IDEgbWlsbGlzZWNvbmQKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKK3N0YXRpYyBpbnQgaWkyRGVsVmFsdWUgPSAxMTkwOyAgLy8gU2VlIHRpbWluZyBjYWxjdWxhdGlvbnMgYmVsb3cKKwkJCQkJCS8vIDE2NjYgZm9yIGZhc3Rlc3QgdGhlb3JldGljYWwgbWFjaGluZQorCQkJCQkJLy8gMTE5MCBzYWZlIGZvciBtb3N0IGZhc3QgMzg2IG1hY2hpbmVzCisJCQkJCQkvLyAxMDAwIGZvciBmYXN0ZXN0IG1hY2hpbmUgdGVzdGVkIGhlcmUKKwkJCQkJCS8vICA1NDAgKHNpYykgZm9yIEFUMjg2LzZNaHoKK3N0YXRpYyB2b2lkCitpaTJEZWxheUlPKHVuc2lnbmVkIGludCBtc2Vjb25kcykKK3sKKwlpZiAoIWlpMlNhZmUpIAorCQlyZXR1cm47ICAgLyogRG8gbm90aGluZyBpZiB0aGlzIHZhcmlhYmxlIHVuaW5pdGlhbGl6ZWQgKi8KKworCXdoaWxlKG1zZWNvbmRzLS0pIHsKKwkJaW50IGkgPSBpaTJEZWxWYWx1ZTsKKwkJd2hpbGUgKCBpLS0gKSB7CisJCQlJTkIgKCBpaTJTYWZlICk7CisJCX0KKwl9Cit9CisjZW5kaWYgCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaTJOb3AoKQorLy8gUGFyYW1ldGVyczogTm9uZQorLy8KKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBpaUluaXRpYWxpemUgd2lsbCBzZXQgaTJlRGVsYXkgdG8gdGhpcyBpZiB0aGUgZGVsYXkgcGFyYW1ldGVyIGlzIE5VTEwuIFRoaXMKKy8vIHNhdmVzIGNoZWNraW5nIGZvciBhIE5VTEwgcG9pbnRlciBhdCBldmVyeSBjYWxsLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkCitpaTJOb3Aodm9pZCkKK3sKKwlyZXR1cm47CS8vIG5vIG15c3RlcnkgaGVyZQorfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFJvdXRpbmVzIHdoaWNoIGFyZSBhdmFpbGFibGUgaW4gOC8xNi1iaXQgdmVyc2lvbnMsIG9yCisvLyBpbiBkaWZmZXJlbnQgZmlmbyBzdHlsZXMuIFRoZXNlIGFyZSBBTEwgY2FsbGVkCisvLyBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIGJvYXJkIHN0cnVjdHVyZS4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlXcml0ZUJ1ZjE2KHBCLCBhZGRyZXNzLCBjb3VudCkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgYWRkcmVzcyAtIGFkZHJlc3Mgb2YgZGF0YSB0byB3cml0ZQorLy8gICAgICAgICAgICAgY291bnQgICAtIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRvIHdyaXRlCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBXcml0ZXMgJ2NvdW50JyBieXRlcyBmcm9tICdhZGRyZXNzJyB0byB0aGUgZGF0YSBmaWZvIHNwZWNpZmllZCBieSB0aGUgYm9hcmQKKy8vIHN0cnVjdHVyZSBwb2ludGVyIHBCLiBTaG91bGQgY291bnQgaGFwcGVuIHRvIGJlIG9kZCwgYW4gZXh0cmEgcGFkIGJ5dGUgaXMKKy8vIHNlbnQgKGlkZW50aXR5IHVua25vd24uLi4pLiBVc2VzIDE2LWJpdCAod29yZCkgb3BlcmF0aW9ucy4gSXMgY2FsbGVkCisvLyBpbmRpcmVjdGx5IHRocm91Z2ggcEItPmkyZVdyaXRlQnVmLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVdyaXRlQnVmMTYoaTJlQm9yZFN0clB0ciBwQiwgdW5zaWduZWQgY2hhciAqYWRkcmVzcywgaW50IGNvdW50KQoreworCS8vIFJ1ZGltZW50YXJ5IHNhbml0eSBjaGVja2luZyBoZXJlLgorCWlmIChwQi0+aTJlVmFsaWQgIT0gSTJFX01BR0lDKQorCQlDT01QTEVURShwQiwgSTJFRV9JTlZBTElEKTsKKworCU9VVFNXICggcEItPmkyZURhdGEsIGFkZHJlc3MsIGNvdW50KTsKKworCUNPTVBMRVRFKHBCLCBJMkVFX0dPT0QpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlXcml0ZUJ1ZjgocEIsIGFkZHJlc3MsIGNvdW50KQorLy8gUGFyYW1ldGVyczogcEIgICAgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLyAgICAgICAgICAgICBhZGRyZXNzIC0gYWRkcmVzcyBvZiBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICBjb3VudCAgIC0gbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdG8gd3JpdGUKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFdyaXRlcyAnY291bnQnIGJ5dGVzIGZyb20gJ2FkZHJlc3MnIHRvIHRoZSBkYXRhIGZpZm8gc3BlY2lmaWVkIGJ5IHRoZSBib2FyZAorLy8gc3RydWN0dXJlIHBvaW50ZXIgcEIuIFNob3VsZCBjb3VudCBoYXBwZW4gdG8gYmUgb2RkLCBhbiBleHRyYSBwYWQgYnl0ZSBpcworLy8gc2VudCAoaWRlbnRpdHkgdW5rbm93bi4uLikuIFRoaXMgaXMgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSAxNi1iaXQgdmVyc2lvbi4KKy8vIFVzZXMgOC1iaXQgKGJ5dGUpIG9wZXJhdGlvbnMuIElzIGNhbGxlZCBpbmRpcmVjdGx5IHRocm91Z2ggcEItPmkyZVdyaXRlQnVmLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVdyaXRlQnVmOChpMmVCb3JkU3RyUHRyIHBCLCB1bnNpZ25lZCBjaGFyICphZGRyZXNzLCBpbnQgY291bnQpCit7CisJLyogUnVkaW1lbnRhcnkgc2FuaXR5IGNoZWNraW5nIGhlcmUgKi8KKwlpZiAocEItPmkyZVZhbGlkICE9IEkyRV9NQUdJQykKKwkJQ09NUExFVEUocEIsIEkyRUVfSU5WQUxJRCk7CisKKwlPVVRTQiAoIHBCLT5pMmVEYXRhLCBhZGRyZXNzLCBjb3VudCApOworCisJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVJlYWRCdWYxNihwQiwgYWRkcmVzcywgY291bnQpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIGFkZHJlc3MgLSBhZGRyZXNzIHRvIHB1dCBkYXRhIHJlYWQKKy8vICAgICAgICAgICAgIGNvdW50ICAgLSBudW1iZXIgb2YgZGF0YSBieXRlcyB0byByZWFkCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBSZWFkcyAnY291bnQnIGJ5dGVzIGludG8gJ2FkZHJlc3MnIGZyb20gdGhlIGRhdGEgZmlmbyBzcGVjaWZpZWQgYnkgdGhlIGJvYXJkCisvLyBzdHJ1Y3R1cmUgcG9pbnRlciBwQi4gU2hvdWxkIGNvdW50IGhhcHBlbiB0byBiZSBvZGQsIGFuIGV4dHJhIHBhZCBieXRlIGlzCisvLyByZWNlaXZlZCAoaWRlbnRpdHkgdW5rbm93bi4uLikuIFVzZXMgMTYtYml0ICh3b3JkKSBvcGVyYXRpb25zLiBJcyBjYWxsZWQKKy8vIGluZGlyZWN0bHkgdGhyb3VnaCBwQi0+aTJlUmVhZEJ1Zi4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlSZWFkQnVmMTYoaTJlQm9yZFN0clB0ciBwQiwgdW5zaWduZWQgY2hhciAqYWRkcmVzcywgaW50IGNvdW50KQoreworCS8vIFJ1ZGltZW50YXJ5IHNhbml0eSBjaGVja2luZyBoZXJlLgorCWlmIChwQi0+aTJlVmFsaWQgIT0gSTJFX01BR0lDKQorCQlDT01QTEVURShwQiwgSTJFRV9JTlZBTElEKTsKKworCUlOU1cgKCBwQi0+aTJlRGF0YSwgYWRkcmVzcywgY291bnQpOworCisJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVJlYWRCdWY4KHBCLCBhZGRyZXNzLCBjb3VudCkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgYWRkcmVzcyAtIGFkZHJlc3MgdG8gcHV0IGRhdGEgcmVhZAorLy8gICAgICAgICAgICAgY291bnQgICAtIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRvIHJlYWQKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFJlYWRzICdjb3VudCcgYnl0ZXMgaW50byAnYWRkcmVzcycgZnJvbSB0aGUgZGF0YSBmaWZvIHNwZWNpZmllZCBieSB0aGUgYm9hcmQKKy8vIHN0cnVjdHVyZSBwb2ludGVyIHBCLiBTaG91bGQgY291bnQgaGFwcGVuIHRvIGJlIG9kZCwgYW4gZXh0cmEgcGFkIGJ5dGUgaXMKKy8vIHJlY2VpdmVkIChpZGVudGl0eSB1bmtub3duLi4uKS4gVGhpcyB0byBtYXRjaCB0aGUgMTYtYml0IGJlaGF2aW91ci4gVXNlcworLy8gOC1iaXQgKGJ5dGUpIG9wZXJhdGlvbnMuIElzIGNhbGxlZCBpbmRpcmVjdGx5IHRocm91Z2ggcEItPmkyZVJlYWRCdWYuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2lpUmVhZEJ1ZjgoaTJlQm9yZFN0clB0ciBwQiwgdW5zaWduZWQgY2hhciAqYWRkcmVzcywgaW50IGNvdW50KQoreworCS8vIFJ1ZGltZW50YXJ5IHNhbml0eSBjaGVja2luZyBoZXJlLgorCWlmIChwQi0+aTJlVmFsaWQgIT0gSTJFX01BR0lDKQorCQlDT01QTEVURShwQiwgSTJFRV9JTlZBTElEKTsKKworCUlOU0IgKCBwQi0+aTJlRGF0YSwgYWRkcmVzcywgY291bnQpOworCisJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVJlYWRXb3JkMTYocEIpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFJldHVybnMgdGhlIHdvcmQgcmVhZCBmcm9tIHRoZSBkYXRhIGZpZm8gc3BlY2lmaWVkIGJ5IHRoZSBib2FyZC1zdHJ1Y3R1cmUKKy8vIHBvaW50ZXIgcEIuIFVzZXMgYSAxNi1iaXQgb3BlcmF0aW9uLiBJcyBjYWxsZWQgaW5kaXJlY3RseSB0aHJvdWdoCisvLyBwQi0+aTJlUmVhZFdvcmQuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAoraWlSZWFkV29yZDE2KGkyZUJvcmRTdHJQdHIgcEIpCit7CisJcmV0dXJuICh1bnNpZ25lZCBzaG9ydCkoIElOVyhwQi0+aTJlRGF0YSkgKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpUmVhZFdvcmQ4KHBCKQorLy8gUGFyYW1ldGVyczogcEIgICAgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBSZXR1cm5zIHRoZSB3b3JkIHJlYWQgZnJvbSB0aGUgZGF0YSBmaWZvIHNwZWNpZmllZCBieSB0aGUgYm9hcmQtc3RydWN0dXJlCisvLyBwb2ludGVyIHBCLiBVc2VzIHR3byA4LWJpdCBvcGVyYXRpb25zLiBCeXRlcyBhcmUgYXNzdW1lZCB0byBiZSBMU0IgZmlyc3QuIElzCisvLyBjYWxsZWQgaW5kaXJlY3RseSB0aHJvdWdoIHBCLT5pMmVSZWFkV29yZC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHVuc2lnbmVkIHNob3J0CitpaVJlYWRXb3JkOChpMmVCb3JkU3RyUHRyIHBCKQoreworCXVuc2lnbmVkIHNob3J0IHVyczsKKworCXVycyA9IElOQiAoIHBCLT5pMmVEYXRhICk7CisKKwlyZXR1cm4gKCAoIElOQiAoIHBCLT5pMmVEYXRhICkgPDwgOCApIHwgdXJzICk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVdyaXRlV29yZDE2KHBCLCB2YWx1ZSkKKy8vIFBhcmFtZXRlcnM6IHBCICAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIHZhbHVlIC0gZGF0YSB0byB3cml0ZQorLy8KKy8vIFJldHVybnM6ICAgIFRydWUgaWYgZXZlcnl0aGluZyBhcHBlYXJzIGNvcGFjZXRpYy4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIHRoZXJlIGlzIGFueSBlcnJvcjogdGhlIHBCLT5pMmVFcnJvciBmaWVsZCBoYXMgdGhlIGVycm9yCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gV3JpdGVzIHRoZSB3b3JkICd2YWx1ZScgdG8gdGhlIGRhdGEgZmlmbyBzcGVjaWZpZWQgYnkgdGhlIGJvYXJkLXN0cnVjdHVyZQorLy8gcG9pbnRlciBwQi4gVXNlcyAxNi1iaXQgb3BlcmF0aW9uLiBJcyBjYWxsZWQgaW5kaXJlY3RseSB0aHJvdWdoCisvLyBwQi0+aTJlV3JpdGVXb3JkLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWlXcml0ZVdvcmQxNihpMmVCb3JkU3RyUHRyIHBCLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwlXT1JEX1RPKHBCLCAoaW50KXZhbHVlKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpV3JpdGVXb3JkOChwQiwgdmFsdWUpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLyAgICAgICAgICAgICB2YWx1ZSAtIGRhdGEgdG8gd3JpdGUKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFdyaXRlcyB0aGUgd29yZCAndmFsdWUnIHRvIHRoZSBkYXRhIGZpZm8gc3BlY2lmaWVkIGJ5IHRoZSBib2FyZC1zdHJ1Y3R1cmUKKy8vIHBvaW50ZXIgcEIuIFVzZXMgdHdvIDgtYml0IG9wZXJhdGlvbnMgKHdyaXRlcyBMU0IgZmlyc3QpLiBJcyBjYWxsZWQKKy8vIGluZGlyZWN0bHkgdGhyb3VnaCBwQi0+aTJlV3JpdGVXb3JkLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWlXcml0ZVdvcmQ4KGkyZUJvcmRTdHJQdHIgcEIsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCUJZVEVfVE8ocEIsIChjaGFyKXZhbHVlKTsKKwlCWVRFX1RPKHBCLCAoY2hhcikodmFsdWUgPj4gOCkgKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpV2FpdEZvclR4RW1wdHlJSShwQiwgbVNkZWxheSkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgbVNkZWxheSAtIHBlcmlvZCB0byB3YWl0IGJlZm9yZSByZXR1cm5pbmcKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIHRoZSBGSUZPIGlzIGVtcHR5LgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgaXQgbm90IGVtcHR5IGluIHRoZSByZXF1aXJlZCB0aW1lOiB0aGUgcEItPmkyZUVycm9yCisvLyAgICAgICAgICAgICBmaWVsZCBoYXMgdGhlIGVycm9yLgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFdhaXRzIHVwIHRvICJtU2RlbGF5IiBtaWxsaXNlY29uZHMgZm9yIHRoZSBvdXRnb2luZyBGSUZPIHRvIGJlY29tZSBlbXB0eTsgaWYKKy8vIG5vdCBlbXB0eSBieSB0aGUgcmVxdWlyZWQgdGltZSwgcmV0dXJucyBmYWxzZSBhbmQgZXJyb3IgaW4gcEItPmkyZUVycm9yLAorLy8gb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4KKy8vCisvLyBtU2RlbGF5ID09IDAgaXMgdGFrZW4gdG8gbWVhbiBtdXN0IGJlIGVtcHR5IG9uIHRoZSBmaXJzdCB0ZXN0LgorLy8KKy8vIFRoaXMgdmVyc2lvbiBvcGVyYXRlcyBvbiBJbnRlbGxpUG9ydC1JSSAtIHN0eWxlIEZJRk8ncworLy8KKy8vIE5vdGUgdGhpcyByb3V0aW5lIGlzIG9yZ2FuaXplZCBzbyB0aGF0IGlmIHN0YXR1cyBpcyBvayB0aGVyZSBpcyBubyBkZWxheSBhdAorLy8gYWxsIGNhbGxlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSB0ZXN0LiAgSXMgY2FsbGVkIGluZGlyZWN0bHkgdGhyb3VnaAorLy8gcEItPmkyZVdhaXRGb3JUeEVtcHR5LgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVdhaXRGb3JUeEVtcHR5SUkoaTJlQm9yZFN0clB0ciBwQiwgaW50IG1TZGVsYXkpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQgaXRlbXA7CisKKwlmb3IgKDs7KQorCXsKKwkJLy8gVGhpcyByb3V0aW5lIGhpbmdlcyBvbiBiZWluZyBhYmxlIHRvIHNlZSB0aGUgIm90aGVyIiBzdGF0dXMgcmVnaXN0ZXIKKwkJLy8gKGFzIHNlZW4gYnkgdGhlIGxvY2FsIHByb2Nlc3NvcikuICBIaXMgaW5jb21pbmcgZmlmbyBpcyBvdXIgb3V0Z29pbmcKKwkJLy8gRklGTy4KKwkJLy8KKwkJLy8gQnkgdGhlIG5hdHVyZSBvZiB0aGlzIHJvdXRpbmUsIHlvdSB3b3VsZCBiZSB1c2luZyB0aGlzIGFzIHBhcnQgb2YgYQorCQkvLyBsYXJnZXIgYXRvbWljIGNvbnRleHQ6IGkuZS4sIHlvdSB3b3VsZCB1c2UgdGhpcyByb3V0aW5lIHRvIGVuc3VyZSB0aGUKKwkJLy8gZmlmbyBlbXB0eSwgdGhlbiBhY3Qgb24gdGhpcyBpbmZvcm1hdGlvbi4gQmV0d2VlbiB0aGVzZSB0d28gaGFsdmVzLCAKKwkJLy8geW91IHdpbGwgZ2VuZXJhbGx5IG5vdCB3YW50IHRvIHNlcnZpY2UgaW50ZXJydXB0cyBvciBpbiBhbnkgd2F5IAorCQkvLyBkaXNydXB0IHRoZSBhc3N1bXB0aW9ucyBpbXBsaWNpdCBpbiB0aGUgbGFyZ2VyIGNvbnRleHQuCisJCS8vCisJCS8vIEV2ZW4gd29yc2UsIGhvd2V2ZXIsIHRoaXMgcm91dGluZSAic2hpZnRzIiB0aGUgc3RhdHVzIHJlZ2lzdGVyIHRvIAorCQkvLyBwb2ludCB0byB0aGUgbG9jYWwgc3RhdHVzIHJlZ2lzdGVyIHdoaWNoIGlzIG5vdCB0aGUgdXN1YWwgc2l0dWF0aW9uLgorCQkvLyBUaGVyZWZvcmUgZm9yIGV4dHJhIHNhZmV0eSwgd2UgZm9yY2UgdGhlIGNyaXRpY2FsIHNlY3Rpb24gdG8gYmUKKwkJLy8gY29tcGxldGVseSBhdG9taWMsIGFuZCBwaWNrIHVwIGFmdGVyIG91cnNlbHZlcyBiZWZvcmUgYWxsb3dpbmcgYW55CisJCS8vIGludGVycnVwdHMgb2YgYW55IGtpbmQuCisKKworCQlXUklURV9MT0NLX0lSUVNBVkUoJkRsX3NwaW5sb2NrLGZsYWdzKQorCQlPVVRCKHBCLT5pMmVQb2ludGVyLCBTRUxfQ09NTUFORCk7CisJCU9VVEIocEItPmkyZVBvaW50ZXIsIFNFTF9DTURfU0gpOworCisJCWl0ZW1wID0gSU5CKHBCLT5pMmVTdGF0dXMpOworCisJCU9VVEIocEItPmkyZVBvaW50ZXIsIFNFTF9DT01NQU5EKTsKKwkJT1VUQihwQi0+aTJlUG9pbnRlciwgU0VMX0NNRF9VTlNIKTsKKworCQlpZiAoaXRlbXAgJiBTVF9JTl9FTVBUWSkKKwkJeworCQkJVVBEQVRFX0ZJRk9fUk9PTShwQik7CisJCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmRGxfc3BpbmxvY2ssZmxhZ3MpCisJCQlDT01QTEVURShwQiwgSTJFRV9HT09EKTsKKwkJfQorCisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZEbF9zcGlubG9jayxmbGFncykKKworCQlpZiAobVNkZWxheS0tID09IDApCisJCQlicmVhazsKKworCQlpaURlbGF5KHBCLCAxKTsgICAgICAvKiAxIG1TIGdyYW51bGFyaXR5IG9uIGNoZWNraW5nIGNvbmRpdGlvbiAqLworCX0KKwlDT01QTEVURShwQiwgSTJFRV9UWEVfVElNRSk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVdhaXRGb3JUeEVtcHR5SUlFWChwQiwgbVNkZWxheSkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgbVNkZWxheSAtIHBlcmlvZCB0byB3YWl0IGJlZm9yZSByZXR1cm5pbmcKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIHRoZSBGSUZPIGlzIGVtcHR5LgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgaXQgbm90IGVtcHR5IGluIHRoZSByZXF1aXJlZCB0aW1lOiB0aGUgcEItPmkyZUVycm9yCisvLyAgICAgICAgICAgICBmaWVsZCBoYXMgdGhlIGVycm9yLgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFdhaXRzIHVwIHRvICJtU2RlbGF5IiBtaWxsaXNlY29uZHMgZm9yIHRoZSBvdXRnb2luZyBGSUZPIHRvIGJlY29tZSBlbXB0eTsgaWYKKy8vIG5vdCBlbXB0eSBieSB0aGUgcmVxdWlyZWQgdGltZSwgcmV0dXJucyBmYWxzZSBhbmQgZXJyb3IgaW4gcEItPmkyZUVycm9yLAorLy8gb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4KKy8vCisvLyBtU2RlbGF5ID09IDAgaXMgdGFrZW4gdG8gbWVhbiBtdXN0IGJlIGVtcHR5IG9uIHRoZSBmaXJzdCB0ZXN0LgorLy8KKy8vIFRoaXMgdmVyc2lvbiBvcGVyYXRlcyBvbiBJbnRlbGxpUG9ydC1JSUVYIC0gc3R5bGUgRklGTydzCisvLworLy8gTm90ZSB0aGlzIHJvdXRpbmUgaXMgb3JnYW5pemVkIHNvIHRoYXQgaWYgc3RhdHVzIGlzIG9rIHRoZXJlIGlzIG5vIGRlbGF5IGF0CisvLyBhbGwgY2FsbGVkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHRlc3QuICBJcyBjYWxsZWQgaW5kaXJlY3RseSB0aHJvdWdoCisvLyBwQi0+aTJlV2FpdEZvclR4RW1wdHkuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2lpV2FpdEZvclR4RW1wdHlJSUVYKGkyZUJvcmRTdHJQdHIgcEIsIGludCBtU2RlbGF5KQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlmb3IgKDs7KQorCXsKKwkJLy8gQnkgdGhlIG5hdHVyZSBvZiB0aGlzIHJvdXRpbmUsIHlvdSB3b3VsZCBiZSB1c2luZyB0aGlzIGFzIHBhcnQgb2YgYQorCQkvLyBsYXJnZXIgYXRvbWljIGNvbnRleHQ6IGkuZS4sIHlvdSB3b3VsZCB1c2UgdGhpcyByb3V0aW5lIHRvIGVuc3VyZSB0aGUKKwkJLy8gZmlmbyBlbXB0eSwgdGhlbiBhY3Qgb24gdGhpcyBpbmZvcm1hdGlvbi4gQmV0d2VlbiB0aGVzZSB0d28gaGFsdmVzLAorCQkvLyB5b3Ugd2lsbCBnZW5lcmFsbHkgbm90IHdhbnQgdG8gc2VydmljZSBpbnRlcnJ1cHRzIG9yIGluIGFueSB3YXkKKwkJLy8gZGlzcnVwdCB0aGUgYXNzdW1wdGlvbnMgaW1wbGljaXQgaW4gdGhlIGxhcmdlciBjb250ZXh0LgorCisJCVdSSVRFX0xPQ0tfSVJRU0FWRSgmRGxfc3BpbmxvY2ssZmxhZ3MpCisKKwkJaWYgKElOQihwQi0+aTJlU3RhdHVzKSAmIFNURV9PVVRfTVQpIHsKKwkJCVVQREFURV9GSUZPX1JPT00ocEIpOworCQkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJkRsX3NwaW5sb2NrLGZsYWdzKQorCQkJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7CisJCX0KKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJkRsX3NwaW5sb2NrLGZsYWdzKQorCisJCWlmIChtU2RlbGF5LS0gPT0gMCkKKwkJCWJyZWFrOworCisJCWlpRGVsYXkocEIsIDEpOyAgICAgIC8vIDEgbVMgZ3JhbnVsYXJpdHkgb24gY2hlY2tpbmcgY29uZGl0aW9uCisJfQorCUNPTVBMRVRFKHBCLCBJMkVFX1RYRV9USU1FKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpVHhNYWlsRW1wdHlJSShwQikKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgIFRydWUgaWYgdGhlIHRyYW5zbWl0IG1haWxib3ggaXMgZW1wdHkuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiBpdCBub3QgZW1wdHkuCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gUmV0dXJucyB0cnVlIG9yIGZhbHNlIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSB0cmFuc21pdCBtYWlsYm94IGlzIGVtcHR5IChhbmQKKy8vIHRoZXJlZm9yZSBhYmxlIHRvIGFjY2VwdCBtb3JlIG1haWwpCisvLworLy8gVGhpcyB2ZXJzaW9uIG9wZXJhdGVzIG9uIEludGVsbGlQb3J0LUlJIC0gc3R5bGUgRklGTydzCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2lpVHhNYWlsRW1wdHlJSShpMmVCb3JkU3RyUHRyIHBCKQoreworCWludCBwb3J0ID0gcEItPmkyZVBvaW50ZXI7CisJT1VUQiAoIHBvcnQsIFNFTF9PVVRNQUlMICk7CisJcmV0dXJuICggSU5CKHBvcnQpID09IDAgKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpVHhNYWlsRW1wdHlJSUVYKHBCKQorLy8gUGFyYW1ldGVyczogcEIgICAgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiB0aGUgdHJhbnNtaXQgbWFpbGJveCBpcyBlbXB0eS4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIGl0IG5vdCBlbXB0eS4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBSZXR1cm5zIHRydWUgb3IgZmFsc2UgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlIHRyYW5zbWl0IG1haWxib3ggaXMgZW1wdHkgKGFuZAorLy8gdGhlcmVmb3JlIGFibGUgdG8gYWNjZXB0IG1vcmUgbWFpbCkKKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUlFWCAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVR4TWFpbEVtcHR5SUlFWChpMmVCb3JkU3RyUHRyIHBCKQoreworCXJldHVybiAhKElOQihwQi0+aTJlU3RhdHVzKSAmIFNURV9PVVRfTUFJTCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVRyeVNlbmRNYWlsSUkocEIsbWFpbCkKKy8vIFBhcmFtZXRlcnM6IHBCICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgbWFpbCAtIHZhbHVlIHRvIHdyaXRlIHRvIG1haWxib3gKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIHRoZSB0cmFuc21pdCBtYWlsYm94IGlzIGVtcHR5LCBhbmQgbWFpbCBpcyBzZW50LgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgaXQgbm90IGVtcHR5LgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIElmIG91dGdvaW5nIG1haWxib3ggaXMgZW1wdHksIHNlbmRzIG1haWwgYW5kIHJldHVybnMgdHJ1ZS4gSWYgb3V0Z29pbmcKKy8vIG1haWxib3ggaXMgbm90IGVtcHR5LCByZXR1cm5zIGZhbHNlLgorLy8KKy8vIFRoaXMgdmVyc2lvbiBvcGVyYXRlcyBvbiBJbnRlbGxpUG9ydC1JSSAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVRyeVNlbmRNYWlsSUkoaTJlQm9yZFN0clB0ciBwQiwgdW5zaWduZWQgY2hhciBtYWlsKQoreworCWludCBwb3J0ID0gcEItPmkyZVBvaW50ZXI7CisKKwlPVVRCKHBvcnQsIFNFTF9PVVRNQUlMKTsKKwlpZiAoSU5CKHBvcnQpID09IDApIHsKKwkJT1VUQihwb3J0LCBTRUxfT1VUTUFJTCk7CisJCU9VVEIocG9ydCwgbWFpbCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpVHJ5U2VuZE1haWxJSUVYKHBCLG1haWwpCisvLyBQYXJhbWV0ZXJzOiBwQiAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIG1haWwgLSB2YWx1ZSB0byB3cml0ZSB0byBtYWlsYm94CisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiB0aGUgdHJhbnNtaXQgbWFpbGJveCBpcyBlbXB0eSwgYW5kIG1haWwgaXMgc2VudC4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIGl0IG5vdCBlbXB0eS4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBJZiBvdXRnb2luZyBtYWlsYm94IGlzIGVtcHR5LCBzZW5kcyBtYWlsIGFuZCByZXR1cm5zIHRydWUuIElmIG91dGdvaW5nCisvLyBtYWlsYm94IGlzIG5vdCBlbXB0eSwgcmV0dXJucyBmYWxzZS4KKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUlFWCAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVRyeVNlbmRNYWlsSUlFWChpMmVCb3JkU3RyUHRyIHBCLCB1bnNpZ25lZCBjaGFyIG1haWwpCit7CisJaWYoSU5CKHBCLT5pMmVTdGF0dXMpICYgU1RFX09VVF9NQUlMKSB7CisJCXJldHVybiAwOworCX0KKwlPVVRCKHBCLT5pMmVYTWFpbCwgbWFpbCk7CisJcmV0dXJuIDE7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaUdldE1haWxJSShwQixtYWlsKQorLy8gUGFyYW1ldGVyczogcEIgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgTWFpbGJveCBkYXRhIG9yIE5PX01BSUxfSEVSRS4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBJZiBubyBtYWlsIGF2YWlsYWJsZSwgcmV0dXJucyBOT19NQUlMX0hFUkUgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGRhdGEgZnJvbQorLy8gdGhlIG1haWxib3gsIHdoaWNoIGlzIGd1YXJhbnRlZWQgIT0gTk9fTUFJTF9IRVJFLgorLy8KKy8vIFRoaXMgdmVyc2lvbiBvcGVyYXRlcyBvbiBJbnRlbGxpUG9ydC1JSSAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK2lpR2V0TWFpbElJKGkyZUJvcmRTdHJQdHIgcEIpCit7CisJaWYgKEhBU19NQUlMKHBCKSkgeworCQlPVVRCKHBCLT5pMmVQb2ludGVyLCBTRUxfSU5NQUlMKTsKKwkJcmV0dXJuIElOQihwQi0+aTJlUG9pbnRlcik7CisJfSBlbHNlIHsKKwkJcmV0dXJuIE5PX01BSUxfSEVSRTsKKwl9Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaUdldE1haWxJSUVYKHBCLG1haWwpCisvLyBQYXJhbWV0ZXJzOiBwQiAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBNYWlsYm94IGRhdGEgb3IgTk9fTUFJTF9IRVJFLgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIElmIG5vIG1haWwgYXZhaWxhYmxlLCByZXR1cm5zIE5PX01BSUxfSEVSRSBvdGhlcndpc2UgcmV0dXJucyB0aGUgZGF0YSBmcm9tCisvLyB0aGUgbWFpbGJveCwgd2hpY2ggaXMgZ3VhcmFudGVlZCAhPSBOT19NQUlMX0hFUkUuCisvLworLy8gVGhpcyB2ZXJzaW9uIG9wZXJhdGVzIG9uIEludGVsbGlQb3J0LUlJRVggLSBzdHlsZSBGSUZPJ3MKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHVuc2lnbmVkIHNob3J0CitpaUdldE1haWxJSUVYKGkyZUJvcmRTdHJQdHIgcEIpCit7CisJaWYgKEhBU19NQUlMKHBCKSkgeworCQlyZXR1cm4gSU5CKHBCLT5pMmVYTWFpbCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIE5PX01BSUxfSEVSRTsKKwl9Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaUVuYWJsZU1haWxJcnFJSShwQikKKy8vIFBhcmFtZXRlcnM6IHBCIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gRW5hYmxlcyBib2FyZCB0byBpbnRlcnJ1cHQgaG9zdCAob25seSkgYnkgd3JpdGluZyB0byBob3N0J3MgaW4tYm91bmQgbWFpbGJveC4KKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUkgLSBzdHlsZSBGSUZPJ3MKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQKK2lpRW5hYmxlTWFpbElycUlJKGkyZUJvcmRTdHJQdHIgcEIpCit7CisJT1VUQihwQi0+aTJlUG9pbnRlciwgU0VMX01BU0spOworCU9VVEIocEItPmkyZVBvaW50ZXIsIFNUX0lOX01BSUwpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlFbmFibGVNYWlsSXJxSUlFWChwQikKKy8vIFBhcmFtZXRlcnM6IHBCIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gRW5hYmxlcyBib2FyZCB0byBpbnRlcnJ1cHQgaG9zdCAob25seSkgYnkgd3JpdGluZyB0byBob3N0J3MgaW4tYm91bmQgbWFpbGJveC4KKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUlFWCAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWlFbmFibGVNYWlsSXJxSUlFWChpMmVCb3JkU3RyUHRyIHBCKQoreworCU9VVEIocEItPmkyZVhNYXNrLCBNWF9JTl9NQUlMKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpV3JpdGVNYXNrSUkocEIpCisvLyBQYXJhbWV0ZXJzOiBwQiAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgTm90aGluZworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFdyaXRlcyBhcmJpdHJhcnkgdmFsdWUgdG8gdGhlIG1hc2sgcmVnaXN0ZXIuCisvLworLy8gVGhpcyB2ZXJzaW9uIG9wZXJhdGVzIG9uIEludGVsbGlQb3J0LUlJIC0gc3R5bGUgRklGTydzCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkCitpaVdyaXRlTWFza0lJKGkyZUJvcmRTdHJQdHIgcEIsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJT1VUQihwQi0+aTJlUG9pbnRlciwgU0VMX01BU0spOworCU9VVEIocEItPmkyZVBvaW50ZXIsIHZhbHVlKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpV3JpdGVNYXNrSUlFWChwQikKKy8vIFBhcmFtZXRlcnM6IHBCIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gV3JpdGVzIGFyYml0cmFyeSB2YWx1ZSB0byB0aGUgbWFzayByZWdpc3Rlci4KKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUlFWCAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWlXcml0ZU1hc2tJSUVYKGkyZUJvcmRTdHJQdHIgcEIsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJT1VUQihwQi0+aTJlWE1hc2ssIHZhbHVlKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpRG93bmxvYWRCbG9jayhwQiwgcFNvdXJjZSwgaXNTdGFuZGFyZCkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgcFNvdXJjZSAgICAtIGxvYWR3YXJlIGJsb2NrIHRvIGRvd25sb2FkCisvLyAgICAgICAgICAgICBpc1N0YW5kYXJkIC0gVHJ1ZSBpZiAic3RhbmRhcmQiIGxvYWR3YXJlLCBlbHNlIGZhbHNlLgorLy8KKy8vIFJldHVybnM6ICAgIFN1Y2Nlc3Mgb3IgRmFpbHVyZQorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIERvd25sb2FkcyBhIHNpbmdsZSBibG9jayAoYXQgcFNvdXJjZSl0byB0aGUgYm9hcmQgcmVmZXJlbmNlZCBieSBwQi4gQ2FsbGVyCisvLyBzZXRzIGlzU3RhbmRhcmQgdG8gdHJ1ZS9mYWxzZSBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgInN0YW5kYXJkIiBsb2Fkd2FyZSBpcworLy8gd2hhdCdzIGJlaW5nIGxvYWRlZC4gVGhlIG5vcm1hbCBwcm9jZXNzLCB0aGVuLCBpcyB0byBwZXJmb3JtIGFuIGlpSW5pdGlhbGl6ZQorLy8gdG8gdGhlIGJvYXJkLCB0aGVuIHBlcmZvcm0gc29tZSBudW1iZXIgb2YgaWlEb3dubG9hZEJsb2NrcyB1c2luZyB0aGUgcmV0dXJuZWQKKy8vIHN0YXRlIHRvIGRldGVybWluZSB3aGVuIGRvd25sb2FkIGlzIGNvbXBsZXRlLgorLy8KKy8vIFBvc3NpYmxlIHJldHVybiB2YWx1ZXM6IChzZWUgSTJFTExJUy5IKQorLy8gSUlfRE9XTl9CQURWQUxJRAorLy8gSUlfRE9XTl9CQURGSUxFCisvLyBJSV9ET1dOX0NPTlRJTlVJTkcKKy8vIElJX0RPV05fR09PRAorLy8gSUlfRE9XTl9CQUQKKy8vIElJX0RPV05fQkFEU1RBVEUKKy8vIElJX0RPV05fVElNRU9VVAorLy8KKy8vIFVzZXMgdGhlIGkyZVN0YXRlIGFuZCBpMmVUb0xvYWQgZmllbGRzIChpbml0aWFsaXplZCBhdCBpaUluaXRpYWxpemUpIHRvCisvLyBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCBibG9jaywgd2hldGhlciB0byBjaGVjayBmb3IgbWFnaWMKKy8vIG51bWJlcnMsIGhvdyBtYW55IGJsb2NrcyB0aGVyZSBhcmUgdG8gZ28uLi4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlEb3dubG9hZEJsb2NrICggaTJlQm9yZFN0clB0ciBwQiwgbG9hZEhkclN0clB0ciBwU291cmNlLCBpbnQgaXNTdGFuZGFyZCkKK3sKKwlpbnQgaXRlbXA7CisJaW50IGxvYWRlZEZpcnN0OworCisJaWYgKHBCLT5pMmVWYWxpZCAhPSBJMkVfTUFHSUMpIHJldHVybiBJSV9ET1dOX0JBRFZBTElEOworCisJc3dpdGNoKHBCLT5pMmVTdGF0ZSkKKwl7CisJY2FzZSBJSV9TVEFURV9SRUFEWToKKworCQkvLyBMb2FkaW5nIHRoZSBmaXJzdCBibG9jayBhZnRlciByZXNldC4gTXVzdCBjaGVjayB0aGUgbWFnaWMgbnVtYmVyIG9mIHRoZQorCQkvLyBsb2FkZmlsZSwgc3RvcmUgdGhlIG51bWJlciBvZiBibG9ja3Mgd2UgZXhwZWN0IHRvIGxvYWQuCisJCWlmIChwU291cmNlLT5lLmxvYWRNYWdpYyAhPSBNQUdJQ19MT0FERklMRSkKKwkJeworCQkJcmV0dXJuIElJX0RPV05fQkFERklMRTsKKwkJfQorCisJCS8vIE5leHQgd2Ugc3RvcmUgdGhlIHRvdGFsIG51bWJlciBvZiBibG9ja3MgdG8gbG9hZCwgaW5jbHVkaW5nIHRoaXMgb25lLgorCQlwQi0+aTJlVG9Mb2FkID0gMSArIHBTb3VyY2UtPmUubG9hZEJsb2Nrc01vcmU7CisKKwkJLy8gU2V0IHRoZSBzdGF0ZSwgc3RvcmUgdGhlIHZlcnNpb24gbnVtYmVycy4gKCdDYXVzZSB0aGlzIG1heSBoYXZlIGNvbWUKKwkJLy8gZnJvbSBhIGZpbGUgLSB3ZSBtaWdodCB3YW50IHRvIHJlcG9ydCB0aGVzZSB2ZXJzaW9ucyBhbmQgcmV2aXNpb25zIGluCisJCS8vIGNhc2Ugb2YgYW4gZXJyb3IhCisJCXBCLT5pMmVTdGF0ZSA9IElJX1NUQVRFX0xPQURJTkc7CisJCXBCLT5pMmVMVmVyc2lvbiA9IHBTb3VyY2UtPmUubG9hZFZlcnNpb247CisJCXBCLT5pMmVMUmV2aXNpb24gPSBwU291cmNlLT5lLmxvYWRSZXZpc2lvbjsKKwkJcEItPmkyZUxTdWIgPSBwU291cmNlLT5lLmxvYWRTdWJSZXZpc2lvbjsKKworCQkvLyBUaGUgdGltZSBhbmQgZGF0ZSBvZiBjb21waWxhdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSBidXQgZG9uJ3QgYm90aGVyCisJCS8vIHN0b3JpbmcgaXQgZm9yIG5vcm1hbCBwdXJwb3Nlcy4KKwkJbG9hZGVkRmlyc3QgPSAxOworCQlicmVhazsKKworCWNhc2UgSUlfU1RBVEVfTE9BRElORzoKKwkJbG9hZGVkRmlyc3QgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiBJSV9ET1dOX0JBRFNUQVRFOworCX0KKworCS8vIE5vdyB3ZSBtdXN0IGJlIGluIHRoZSBJSV9TVEFURV9MT0FESU5HIHN0YXRlLCBhbmQgd2UgYXNzdW1lIGkyZVRvTG9hZAorCS8vIG11c3QgYmUgcG9zaXRpdmUgc3RpbGwsIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvdWxkIGhhdmUgY2xlYW5lZCB1cCBsYXN0CisJLy8gdGltZSBhbmQgc2V0IHRoZSBzdGF0ZSB0byBJSV9TVEFURV9MT0FERUQuCisJaWYgKCFpaVdhaXRGb3JUeEVtcHR5KHBCLCBNQVhfRExPQURfUkVBRF9USU1FKSkgeworCQlyZXR1cm4gSUlfRE9XTl9USU1FT1VUOworCX0KKworCWlmICghaWlXcml0ZUJ1ZihwQiwgcFNvdXJjZS0+YywgTE9BRFdBUkVfQkxPQ0tfU0laRSkpIHsKKwkJcmV0dXJuIElJX0RPV05fQkFEVkFMSUQ7CisJfQorCisJLy8gSWYgd2UganVzdCBsb2FkZWQgdGhlIGZpcnN0IGJsb2NrLCB3YWl0IGZvciB0aGUgZmlmbyB0byBlbXB0eSBhbiBleHRyYQorCS8vIGxvbmcgdGltZSB0byBhbGxvdyBmb3IgYW55IHNwZWNpYWwgc3RhcnR1cCBjb2RlIGluIHRoZSBmaXJtd2FyZSwgbGlrZQorCS8vIHNlbmRpbmcgc3RhdHVzIG1lc3NhZ2VzIHRvIHRoZSBMQ0Qncy4KKworCWlmIChsb2FkZWRGaXJzdCkgeworCQlpZiAoIWlpV2FpdEZvclR4RW1wdHkocEIsIE1BWF9ETE9BRF9TVEFSVF9USU1FKSkgeworCQkJcmV0dXJuIElJX0RPV05fVElNRU9VVDsKKwkJfQorCX0KKworCS8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgd2FzIG91ciBsYXN0IGJsb2NrIQorCWlmICgtLShwQi0+aTJlVG9Mb2FkKSkgeworCQlyZXR1cm4gSUlfRE9XTl9DT05USU5VSU5HOyAgICAvLyBtb3JlIHRvIGNvbWUuLi4KKwl9CisKKwkvLyBJdCBXQVMgb3VyIGxhc3QgYmxvY2s6IENsZWFuIHVwIG9wZXJhdGlvbnMuLi4KKwkvLyAuLi5XYWl0IGZvciBsYXN0IGJ1ZmZlciB0byBkcmFpbiBmcm9tIHRoZSBib2FyZC4uLgorCWlmICghaWlXYWl0Rm9yVHhFbXB0eShwQiwgTUFYX0RMT0FEX1JFQURfVElNRSkpIHsKKwkJcmV0dXJuIElJX0RPV05fVElNRU9VVDsKKwl9CisJLy8gSWYgdGhlcmUgd2VyZSBvbmx5IGEgc2luZ2xlIGJsb2NrIHdyaXR0ZW4sIHRoaXMgd291bGQgY29tZSBiYWNrCisJLy8gaW1tZWRpYXRlbHkgYW5kIGJlIGhhcm1sZXNzLCB0aG91Z2ggbm90IHN0cmljdGx5IG5lY2Vzc2FyeS4KKwlpdGVtcCA9IE1BWF9ETE9BRF9BQ0tfVElNRS8xMDsKKwl3aGlsZSAoLS1pdGVtcCkgeworCQlpZiAoSEFTX0lOUFVUKHBCKSkgeworCQkJc3dpdGNoKEJZVEVfRlJPTShwQikpCisJCQl7CisJCQljYXNlIExPQURXQVJFX09LOgorCQkJCXBCLT5pMmVTdGF0ZSA9CisJCQkJCWlzU3RhbmRhcmQgPyBJSV9TVEFURV9TVERMT0FERUQgOklJX1NUQVRFX0xPQURFRDsKKworCQkJCS8vIFNvbWUgcmV2aXNpb25zIG9mIHRoZSBib290c3RyYXAgZmlybXdhcmUgKGUuZy4gSVNBLTggMS4wLjIpCisJCQkJLy8gd2lsbCwgLy8gaWYgdGhlcmUgaXMgYSBkZWJ1ZyBwb3J0IGF0dGFjaGVkLCByZXF1aXJlIHNvbWUKKwkJCQkvLyB0aW1lIHRvIHNlbmQgaW5mb3JtYXRpb24gdG8gdGhlIGRlYnVnIHBvcnQgbm93LiBJdCB3aWxsIGRvCisJCQkJLy8gdGhpcyBiZWZvcmUgLy8gZXhlY3V0aW5nIGFueSBvZiB0aGUgY29kZSB3ZSBqdXN0IGRvd25sb2FkZWQuCisJCQkJLy8gSXQgbWF5IHRha2UgdXAgdG8gNzAwIG1pbGxpc2Vjb25kcy4KKwkJCQlpZiAocEItPmkyZVBvbS5lLnBvckRpYWcyICYgUE9SX0RFQlVHX1BPUlQpIHsKKwkJCQkJaWlEZWxheShwQiwgNzAwKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gSUlfRE9XTl9HT09EOworCisJCQljYXNlIExPQURXQVJFX0JBRDoKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIElJX0RPV05fQkFEOworCQkJfQorCQl9CisKKwkJaWlEZWxheShwQiwgMTApOyAgICAgIC8vIDEwIG1TIGdyYW51bGFyaXR5IG9uIGNoZWNraW5nIGNvbmRpdGlvbgorCX0KKworCS8vIERyb3AtdGhyb3VnaCAtLT4gdGltZWQgb3V0IHdhaXRpbmcgZm9yIGZpcm13YXJlIGNvbmZpcm1hdGlvbgorCisJcEItPmkyZVN0YXRlID0gSUlfU1RBVEVfQkFETE9BRDsKKwlyZXR1cm4gSUlfRE9XTl9USU1FT1VUOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlEb3dubG9hZEFsbChwQiwgcFNvdXJjZSwgaXNTdGFuZGFyZCwgc2l6ZSkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgcFNvdXJjZSAgICAtIGxvYWR3YXJlIGJsb2NrIHRvIGRvd25sb2FkCisvLyAgICAgICAgICAgICBpc1N0YW5kYXJkIC0gVHJ1ZSBpZiAic3RhbmRhcmQiIGxvYWR3YXJlLCBlbHNlIGZhbHNlLgorLy8gICAgICAgICAgICAgc2l6ZSAgICAgICAtIHNpemUgb2YgZGF0YSB0byBkb3dubG9hZCAoaW4gYnl0ZXMpCisvLworLy8gUmV0dXJuczogICAgU3VjY2VzcyBvciBGYWlsdXJlCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIGEgYm9hcmQgc3RydWN0dXJlLCBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBzb21lCisvLyBsb2Fkd2FyZSwgd2hldGhlciBpdCBpcyBjb25zaWRlcmVkIHRoZSAic3RhbmRhcmQgbG9hZHdhcmUiLCBhbmQgdGhlIHNpemUgb2YKKy8vIHRoZSBhcnJheSBpbiBieXRlcyBsb2FkcyB0aGUgZW50aXJlIGFycmF5IHRvIHRoZSBib2FyZCBhcyBsb2Fkd2FyZS4KKy8vCisvLyBBc3N1bWVzIHRoZSBib2FyZCBoYXMgYmVlbiBmcmVzaGx5IHJlc2V0IGFuZCB0aGUgcG93ZXItdXAgcmVzZXQgbWVzc2FnZSByZWFkLgorLy8gKGkuZS4sIGluIElJX1NUQVRFX1JFQURZKS4gQ29tcGxhaW5zIGlmIHN0YXRlIGlzIGJhZCwgb3IgaWYgdGhlcmUgc2VlbXMgdG8gYmUKKy8vIHRvbyBtdWNoIG9yIHRvbyBsaXR0bGUgZGF0YSB0byBsb2FkLCBvciBpZiBpaURvd25sb2FkQmxvY2sgY29tcGxhaW5zLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2lpRG93bmxvYWRBbGwoaTJlQm9yZFN0clB0ciBwQiwgbG9hZEhkclN0clB0ciBwU291cmNlLCBpbnQgaXNTdGFuZGFyZCwgaW50IHNpemUpCit7CisJaW50IHN0YXR1czsKKworCS8vIFdlIGtub3cgKGZyb20gY29udGV4dCkgYm9hcmQgc2hvdWxkIGJlIHJlYWR5IGZvciB0aGUgZmlyc3QgYmxvY2sgb2YKKwkvLyBkb3dubG9hZC4gIENvbXBsYWluIGlmIG5vdC4KKwlpZiAocEItPmkyZVN0YXRlICE9IElJX1NUQVRFX1JFQURZKSByZXR1cm4gSUlfRE9XTl9CQURTVEFURTsKKworCXdoaWxlIChzaXplID4gMCkgeworCQlzaXplIC09IExPQURXQVJFX0JMT0NLX1NJWkU7CS8vIEhvdyBtdWNoIGRhdGEgc2hvdWxkIHRoZXJlIGJlIGxlZnQgdG8KKwkJCQkJCQkJCQkvLyBsb2FkIGFmdGVyIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uID8KKworCQkvLyBOb3RlIHdlIGp1c3QgYnVtcCBwU291cmNlIGJ5ICJvbmUiLCBiZWNhdXNlIGl0cyBzaXplIGlzIGFjdHVhbGx5IHRoYXQKKwkJLy8gb2YgYW4gZW50aXJlIGJsb2NrLCBzYW1lIGFzIExPQURXQVJFX0JMT0NLX1NJWkUuCisJCXN0YXR1cyA9IGlpRG93bmxvYWRCbG9jayhwQiwgcFNvdXJjZSsrLCBpc1N0YW5kYXJkKTsKKworCQlzd2l0Y2goc3RhdHVzKQorCQl7CisJCWNhc2UgSUlfRE9XTl9HT09EOgorCQkJcmV0dXJuICggKHNpemUgPiAwKSA/IElJX0RPV05fT1ZFUiA6IElJX0RPV05fR09PRCk7CisKKwkJY2FzZSBJSV9ET1dOX0NPTlRJTlVJTkc6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0KKworCS8vIFdlIHNob3VsZG4ndCBkcm9wIG91dDogaXQgbWVhbnMgIndoaWxlIiBjYXVnaHQgdXMgd2l0aCBub3RoaW5nIGxlZnQgdG8KKwkvLyBkb3dubG9hZCwgeWV0IHRoZSBwcmV2aW91cyBEb3dubG9hZEJsb2NrIGRpZCBub3QgcmV0dXJuIGNvbXBsZXRlLiBFcmdvLAorCS8vIG5vdCBlbm91Z2ggZGF0YSB0byBtYXRjaCB0aGUgc2l6ZSBieXRlIGluIHRoZSBoZWFkZXIuCisJcmV0dXJuIElJX0RPV05fVU5ERVI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kyZWxsaXMuaCBiL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMGIwMjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2kyZWxsaXMuaApAQCAtMCwwICsxLDYxNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAoYykgMTk5OSBieSBDb21wdXRvbmUgQ29ycG9yYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqICAgUEFDS0FHRTogICAgIExpbnV4IHR0eSBEZXZpY2UgRHJpdmVyIGZvciBJbnRlbGxpUG9ydCBJSSBmYW1pbHkgb2YgbXVsdGlwb3J0CisqICAgICAgICAgICAgICAgIHNlcmlhbCBJL08gY29udHJvbGxlcnMuCisqCisqICAgREVTQ1JJUFRJT046IE1haW5saW5lIGNvZGUgZm9yIHRoZSBkZXZpY2UgZHJpdmVyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGkyZWxsaXMuaAorLy8KKy8vIEludGVsbGlQb3J0LUlJIGFuZCBJbnRlbGxpUG9ydC1JSUVYCisvLworLy8gRXh0cmVtZWx5CisvLyBMb3cKKy8vIExldmVsCisvLyBJbnRlcmZhY2UKKy8vIFNlcnZpY2VzCisvLworLy8gU3RydWN0dXJlIERlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZm9yICJFTExJUyIgc2VydmljZSByb3V0aW5lcyBmb3VuZCBpbgorLy8gaTJlbGxpcy5jCisvLworLy8gVGhlc2Ugcm91dGluZXMgYXJlIGJhc2VkIG9uIHByb3BlcnRpZXMgb2YgdGhlIEludGVsbGlQb3J0LUlJIGFuZCAtSUlFWAorLy8gaGFyZHdhcmUgYW5kIGJvb3RzdHJhcCBmaXJtd2FyZSwgYW5kIGFyZSBub3Qgc2Vuc2l0aXZlIHRvIHBhcnRpY3VsYXIKKy8vIGNvbnZlbnRpb25zIG9mIGFueSBwYXJ0aWN1bGFyIGxvYWR3YXJlLgorLy8KKy8vIFVubGlrZSBpMmh3LmgsIHdoaWNoIHByb3ZpZGVzIElST05DTEFEIGhhcmR3YXJlIGRlZmluaXRpb25zLCB0aGUgbWF0ZXJpYWwKKy8vIGhlcmUgYW5kIGluIGkyZWxsaXMuYyBpcyBpbnRlbmRlZCB0byBwcm92aWNlIGEgdXNlZnVsLCBidXQgbm90IHJlcXVpcmVkLAorLy8gbGF5ZXIgb2YgaW5zdWxhdGlvbiBmcm9tIHRoZSBoYXJkd2FyZSBzcGVjaWZpY3MuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmbmRlZiAgSTJFTExJU19IICAgLyogVG8gcHJldmVudCBtdWx0aXBsZSBpbmNsdWRlcyAqLworI2RlZmluZSAgSTJFTExJU19IICAgMQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmlzaW9uIEhpc3Rvcnk6CisvLworLy8gMzAgU2VwdGVtYmVyIDE5OTEgTUFHIEZpcnN0IERyYWZ0IFN0YXJ0ZWQKKy8vIDEyIE9jdG9iZXIgICAxOTkxIC4uLmNvbnRpbnVlZC4uLgorLy8KKy8vIDIwIERlY2VtYmVyICAxOTk2IEFLTSBMaW51eCB2ZXJzaW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYW5kYXRvcnkgSW5jbHVkZXM6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJpcDJ0eXBlcy5oIgorI2luY2x1ZGUgImkyaHcuaCIgICAgICAgLy8gVGhlIGhhcmR3YXJlIGRlZmluaXRpb25zCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTVEFUX0JPWElEUyBwYWNrZXRzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBNQVhfQk9YCQk0CisKK3R5cGVkZWYgc3RydWN0IF9iaWRTdGF0Cit7CisJdW5zaWduZWQgY2hhciBiaWRfdmFsdWVbTUFYX0JPWF07Cit9IGJpZFN0YXQsICpiaWRTdGF0UHRyOworCisvLyBUaGlzIHBhY2tldCBpcyBzZW50IGluIHJlc3BvbnNlIHRvIGEgQ01EX0dFVF9CT1hJRFMgYnlwYXNzIGNvbW1hbmQuIEZvciAtSUlFWAorLy8gYm9hcmRzLCByZXBvcnRzIHRoZSBoYXJkd2FyZS1zcGVjaWZpYyAiYXN5bmNocm9ub3VzIHJlc291cmNlIHJlZ2lzdGVyIiBvbgorLy8gZWFjaCBleHBhbnNpb24gYm94LiBCb3hlcyBub3QgcHJlc2VudCByZXBvcnQgMHhmZi4gRm9yIC1JSSBib2FyZHMsIHRoZSBmaXJzdAorLy8gZWxlbWVudCBjb250YWlucyAweDgwIGZvciA4LXBvcnQsIDB4NDAgZm9yIDQtcG9ydCBib2FyZHMuCisKKy8vIEJveCBJRHMgYWthIEFSUiBvciBBc3luYyBSZXNvdXJjZSBSZWdpc3RlciAobW9yZSB0aGFuIHlvdSB3YW50IHRvIGtub3cpCisvLyAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisvLyAgIEYgICBGICAgTiAgIE4gICBMICAgUyAgIFMgICBTCisvLyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEYgICBGICAgLSAgUHJvZHVjdCBGYW1pbHkgRGVzaWduYXRvcgorLy8gICA9PT09PSsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKy8vICAgMCAgIDAgICAtICBJbnRlbGxpcG9ydCBJSSBFWCAvIElTQS04CisvLyAgIDEgICAwICAgLSAgSW50ZWxsaVNlcnZlcgorLy8gICAwICAgMSAgIC0gIFNBQyAtIFBvcnQgRGV2aWNlIChJbnRlbGxpcG9ydCBJSUkgPz8/ICkKKy8vICAgICAgICAgICA9PT09PSsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworLy8gICAgICAgICAgIE4gICBOICAgLSAgTnVtYmVyIG9mIFBvcnRzCisvLyAgICAgICAgICAgMCAgIDAgICAtICA4ICAoZWlnaHQpCisvLyAgICAgICAgICAgMCAgIDEgICAtICA0ICAoZm91cikKKy8vICAgICAgICAgICAxICAgMCAgIC0gIDEyICh0d2VsdmUpCisvLyAgICAgICAgICAgMSAgIDEgICAtICAxNiAoc2l4dGVlbikKKy8vICAgICAgICAgICAgICAgICAgID0rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisvLyAgICAgICAgICAgICAgICAgICBMICAtICAgTENEIERpc3BsYXkgTW9kdWxlIFByZXNlbnQKKy8vICAgICAgICAgICAgICAgICAgIDAgIC0gICBObworLy8gICAgICAgICAgICAgICAgICAgMSAgLSAgIExDRCBtb2R1bGUgcHJlc2VudAorLy8gICAgICAgICAgICAgICAgICAgPT09PT09PT09KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworLy8gICAgICAgICAgICAgICAgICAgICAgUyAgIFMgICBTIC0gQXN5bmMgU2lnbmFscyBTdXBwb3J0ZWQgRGVzaWduYXRvcgorLy8gICAgICAgICAgICAgICAgICAgICAgMCAgIDAgICAwIC0gOGRzcywgTW9kIERDRSBEQjI1IEZlbWFsZQorLy8gICAgICAgICAgICAgICAgICAgICAgMCAgIDAgICAxIC0gNmRzcywgUkotNDUKKy8vICAgICAgICAgICAgICAgICAgICAgIDAgICAxICAgMCAtIFJTLTIzMi80MjIgZHNzLCBEQjI1IEZlbWFsZQorLy8gICAgICAgICAgICAgICAgICAgICAgMCAgIDEgICAxIC0gUlMtMjMyLzQyMiBkc3MsIHNlcGFyYXRlIDIzMi80MjIgREIyNSBGZW1hbGUKKy8vICAgICAgICAgICAgICAgICAgICAgIDEgICAwICAgMCAtIDZkc3MsIDkyMS42IEkvRiB3aXRoIFNUNjU0J3MKKy8vICAgICAgICAgICAgICAgICAgICAgIDEgICAwICAgMSAtIFJTLTQyMy8yMzIgOGRzcywgUkotNDUgMTBQaW4KKy8vICAgICAgICAgICAgICAgICAgICAgIDEgICAxICAgMCAtIDZkc3MsIE1vZCBEQ0UgREIyNSBGZW1hbGUKKy8vICAgICAgICAgICAgICAgICAgICAgIDEgICAxICAgMSAtIE5PIEJPWCBQUkVTRU5UCisKKyNkZWZpbmUgRkYoYykJKChjICYgMHhDMCkgPj4gNikKKyNkZWZpbmUgTk4oYykJKChjICYgMHgzMCkgPj4gNCkKKyNkZWZpbmUgTChjKQkoKGMgJiAweDA4KSA+PiAzKQorI2RlZmluZSBTU1MoYykJIChjICYgMHgwNykKKworI2RlZmluZSBCSURfSEFTXzY1NCh4KQkoU1NTKHgpID09IDB4MDQpCisjZGVmaW5lIEJJRF9OT19CT1gJMHhmZiAvKiBubyBib3ggKi8KKyNkZWZpbmUgQklEXzhQT1JUICAJMHg4MCAvKiBJUDItOCBwb3J0ICovCisjZGVmaW5lIEJJRF80UE9SVCAgIAkweDgxIC8qIElQMi00IHBvcnQgKi8KKyNkZWZpbmUgQklEX0VYUF9NQVNLICAgCTB4MzAgLyogSVAyLUVYICAqLworI2RlZmluZSBCSURfRVhQXzhQT1JUCTB4MDAgLyogICAgIDgsICovCisjZGVmaW5lIEJJRF9FWFBfNFBPUlQJMHgxMCAvKiAgICAgNCwgKi8KKyNkZWZpbmUgQklEX0VYUF9VTkRFRgkweDIwIC8qICAgICBVTkRFRiwgKi8KKyNkZWZpbmUgQklEX0VYUF8xNlBPUlQJMHgzMCAvKiAgICAxNiwgKi8KKyNkZWZpbmUgQklEX0xDRF9DVFJMICAgCTB4MDggLyogTENEIENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgQklEX0xDRF9OT05FCTB4MDAgLyogLSBubyBjb250cm9sbGVyIHByZXNlbnQgKi8KKyNkZWZpbmUgQklEX0xDRF9QUkVTICAgCTB4MDggLyogLSBjb250cm9sbGVyIHByZXNlbnQgKi8KKyNkZWZpbmUgQklEX0NPTl9NQVNLCTB4MDcgLyogLSBjb25uZWN0b3IgcGlub3V0cyAqLworI2RlZmluZSBCSURfQ09OX0RCMjUJMHgwMCAvKiAtIERCLTI1IEYgKi8KKyNkZWZpbmUgQklEX0NPTl9SSjQ1CTB4MDEgLyogLSByajQ1ICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpMmVCb3JkU3RyCisvLworLy8gVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiB0aGUgRUxMSVMgcm91dGluZXMgcmVxdWlyZSBpbgorLy8gZGVhbGluZyB3aXRoIGEgcGFydGljdWxhciBib2FyZC4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGVyZSBhcmUgc29tZSBxdWV1ZXMgaGVyZSB3aGljaCBhcmUgZ3VhcmFudGVlZCB0byBuZXZlciBjb250YWluIHRoZSBlbnRyeQorLy8gZm9yIGEgc2luZ2xlIGNoYW5uZWwgdHdpY2UuIFNvIHRoZXkgbXVzdCBiZSBzbGlnaHRseSBsYXJnZXIgdG8gYWxsb3cKKy8vIHVuYW1iaWd1b3VzIGZ1bGwvZW1wdHkgbWFuYWdlbWVudAorLy8KKyNkZWZpbmUgQ0hfUVVFVUVfU0laRSBBQlNfTU9TVF9QT1JUUysyCisKK3R5cGVkZWYgc3RydWN0IF9pMmVCb3JkU3RyCit7CisJcG9yU3RyICAgICAgICAgaTJlUG9tOwkvLyBTdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcG93ZXItb24gbWVzc2FnZS4KKworCXVuc2lnbmVkIHNob3J0IGkyZVBvbVNpemU7CisJCQkJCQkvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgaWYKKwkJCQkJCS8vIGRpZmZlcmVudCBmcm9tIHNpemVvZiBpMmVQb20sIGluZGljYXRlcworCQkJCQkJLy8gdGhlcmUgaXMgYW4gZXJyb3IhCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVTdGFydE1haWw7CisJCQkJCQkvLyBDb250YWlucyB3aGF0ZXZlciBpbmJvdW5kIG1haWxib3ggZGF0YQorCQkJCQkJLy8gcHJlc2VudCBhdCBzdGFydHVwLiBOT19NQUlMX0hFUkUgaW5kaWNhdGVzCisJCQkJCQkvLyBub3RoaW5nIHdhcyBwcmVzZW50LiBObyBzcGVjaWFsCisJCQkJCQkvLyBzaWduaWZpY2FuY2UgYXMgb2YgdGhpcyB3cml0aW5nLCBidXQgbWF5IGJlCisJCQkJCQkvLyB1c2VmdWwgZm9yIGRpYWdub3N0aWMgcmVhc29ucy4KKworCXVuc2lnbmVkIHNob3J0IGkyZVZhbGlkOworCQkJCQkJLy8gSW5kaWNhdGVzIHZhbGlkaXR5IG9mIHRoZSBzdHJ1Y3R1cmU7IGlmCisJCQkJCQkvLyBpMmVWYWxpZCA9PSBJMkVfTUFHSUMsIHRoZW4gd2UgY2FuIHRydXN0CisJCQkJCQkvLyB0aGUgb3RoZXIgZmllbGRzLiBTb21lIChlc3BlY2lhbGx5CisJCQkJCQkvLyBpbml0aWFsaXphdGlvbikgZnVuY3Rpb25zIGFyZSBnb29kIGFib3V0CisJCQkJCQkvLyBjaGVja2luZyBmb3IgdmFsaWRpdHkuICBNYW55IGZ1bmN0aW9ucyBkbworCQkJCQkJLy8gbm90LCBpdCBiZWluZyBhc3N1bWVkIHRoYXQgdGhlIGxhcmdlcgorCQkJCQkJLy8gY29udGV4dCBhc3N1cmVzIHdlIGFyZSB1c2luZyBhIHZhbGlkCisJCQkJCQkvLyBpMmVCb3JkU3RyUHRyLgorCisJdW5zaWduZWQgc2hvcnQgaTJlRXJyb3I7CisJCQkJCQkvLyBVc2VkIGZvciByZXR1cm5pbmcgYW4gZXJyb3IgY29uZGl0aW9uIGZyb20KKwkJCQkJCS8vIHNldmVyYWwgZnVuY3Rpb25zIHdoaWNoIHVzZSBpMmVCb3JkU3RyUHRyCisJCQkJCQkvLyBhcyBhbiBhcmd1bWVudC4KKworCS8vIEFjY2VsZXJhdG9ycyB0byBjaGFyYWN0ZXJpemUgc2VwYXJhdGUgZmVhdHVyZXMgb2YgYSBib2FyZCwgZGVyaXZlZCBmcm9tIGEKKwkvLyBudW1iZXIgb2Ygc291cmNlcy4KKworCXVuc2lnbmVkIHNob3J0IGkyZUZpZm9TaXplOworCQkJCQkJLy8gQWx3YXlzLCB0aGUgc2l6ZSBvZiB0aGUgRklGTy4gRm9yCisJCQkJCQkvLyBJbnRlbGxpUG9ydC1JSSwgYWx3YXlzIHRoZSBzYW1lLCBmb3IgLUlJRVgKKwkJCQkJCS8vIHRha2VuIGZyb20gdGhlIFBvd2VyLU9uIHJlc2V0IG1lc3NhZ2UuCisKKwl2b2xhdGlsZSAKKwl1bnNpZ25lZCBzaG9ydCBpMmVGaWZvUmVtYWluczsKKwkJCQkJCS8vIFVzZWQgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24gdG8gaW5kaWNhdGUgYQorCQkJCQkJLy8gbG93ZXIgYm91bmQgb24gdGhlIGFtb3VudCBvZiBkYXRhIHdoaWNoCisJCQkJCQkvLyBtaWdodCBiZSBpbiB0aGUgb3V0Ym91bmQgZmlmby4KKworCXVuc2lnbmVkIGNoYXIgIGkyZUZpZm9TdHlsZTsKKwkJCQkJCS8vIEFjY2VsZXJhdG9yIHdoaWNoIHRlbGxzIHdoaWNoIHN0eWxlICgtSUkgb3IKKwkJCQkJCS8vIC1JSUVYKSBGSUZPIHdlIGFyZSB1c2luZy4KKworCXVuc2lnbmVkIGNoYXIgIGkyZURhdGFXaWR0aDE2OworCQkJCQkJLy8gQWNjZWxlcmF0b3Igd2hpY2ggdGVsbHMgd2hldGhlciB3ZSBzaG91bGQKKwkJCQkJCS8vIGRvIDggb3IgMTYtYml0IGRhdGEgdHJhbnNmZXJzLgorCisJdW5zaWduZWQgY2hhciAgaTJlTWF4SXJxOworCQkJCQkJLy8gVGhlIGhpZ2hlc3QgYWxsb3dhYmxlIElSUSwgYmFzZWQgb24gdGhlCisJCQkJCQkvLyBzbG90IHNpemUuCisKKwl1bnNpZ25lZCBjaGFyICBpMmVDaGFuZ2VJcnE7CisJCQkJCQkvLyBXaGV0aGVyIHRpcyB2YWxpZCB0byBjaGFuZ2UgSVJRJ3MKKwkJCQkJCS8vIElTQSA9IG9rLCBFSVNBLCBNaWNyb0NoYW5uZWwsIG5vCisKKwkvLyBBY2NlbGVyYXRvcnMgZm9yIHZhcmlvdXMgYWRkcmVzc2VzIG9uIHRoZSBib2FyZAorCWludCAgICAgICAgICAgIGkyZUJhc2U7ICAgICAgICAvLyBJL08gQWRkcmVzcyBvZiB0aGUgQm9hcmQKKwlpbnQgICAgICAgICAgICBpMmVEYXRhOyAgICAgICAgLy8gRnJvbSBoZXJlIGRhdGEgdHJhbnNmZXJzIGhhcHBlbgorCWludCAgICAgICAgICAgIGkyZVN0YXR1czsgICAgICAvLyBGcm9tIGhlcmUgc3RhdHVzIHJlYWRzIGhhcHBlbgorCWludCAgICAgICAgICAgIGkyZVBvaW50ZXI7ICAgICAvLyAoSW50ZWxsaVBvcnQtSUk6IHBvaW50ZXIvY29tbWFuZHMpCisJaW50ICAgICAgICAgICAgaTJlWE1haWw7ICAgICAgIC8vIChJbnRlbGxpUE9ydC1JSUVYOiBtYWlsYm94ZXMKKwlpbnQgICAgICAgICAgICBpMmVYTWFzazsgICAgICAgLy8gKEludGVsbGlQb3J0LUlJRVg6IG1hc2sgd3JpdGUKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIEluZm9ybWF0aW9uIHByZXNlbnRlZCBpbiBhIGNvbW1vbiBmb3JtYXQgYWNyb3NzIGJvYXJkcworCS8vIEZvciBlYWNoIGJveCwgYml0IG1hcCBvZiB0aGUgY2hhbm5lbHMgcHJlc2VudC4gIEJveCBjbG9zZXN0IHRvIAorCS8vIHRoZSBob3N0IGlzIGJveCAwLiBMU0IgaXMgY2hhbm5lbCAwLiBJbnRlbGxpUG9ydC1JSSAobm9uLWV4cGFuZGFibGUpCisJLy8gaXMgdGFrZW4gdG8gYmUgYm94IDAuIFRoZXNlIGFyZSBkZXJpdmVkIGZyb20gcHJvZHVjdCBpLmQuIHJlZ2lzdGVycy4KKworCXVuc2lnbmVkIHNob3J0IGkyZUNoYW5uZWxNYXBbQUJTX01BWF9CT1hFU107CisKKwkvLyBTYW1lIGFzIGFib3ZlLCBleGNlcHQgZWFjaCBpcyBkZXJpdmVkIGZyb20gZmlybXdhcmUgYXR0ZW1wdGluZyB0byBkZXRlY3QKKwkvLyB0aGUgdWFydCBwcmVzZW5jZSAoYnkgcmVhZGluZyBhIHZhbGlkIEdGUkNSIHJlZ2lzdGVyKS4gSWYgYml0cyBhcmUgc2V0IGluCisJLy8gaTJlQ2hhbm5lbE1hcCBhbmQgbm90IGluIGkyZUdvb2RNYXAsIHRoZXJlIGlzIGEgcG90ZW50aWFsIHByb2JsZW0uCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVHb29kTWFwW0FCU19NQVhfQk9YRVNdOworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gRm9yIGluZGlyZWN0IGZ1bmN0aW9uIGNhbGxzCisKKwkvLyBSb3V0aW5lIHRvIGNhdXNlIGFuIE4tbWlsbGlzZWNvbmQgZGVsYXk6IFBhdGNoZWQgYnkgdGhlIGlpMkluaXRpYWxpemUKKwkvLyBmdW5jdGlvbi4KKworCXZvaWQgICgqaTJlRGVsYXkpKHVuc2lnbmVkIGludCk7CisKKwkvLyBSb3V0aW5lIHRvIHdyaXRlIE4gYnl0ZXMgdG8gdGhlIGJvYXJkIHRocm91Z2ggdGhlIEZJRk8uIFJldHVybnMgdHJ1ZSBpZgorCS8vIGFsbCBjb3BhY2V0aWMsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlIGFuZCBlcnJvciBpcyBpbiBpMmVFcnJvciBmaWVsZC4KKwkvLyBJRiBDT1VOVCBJUyBPREQsIFJPVU5EUyBVUCBUTyBUSEUgTkVYVCBFVkVOIE5VTUJFUi4KKworCWludCAgICgqaTJlV3JpdGVCdWYpKHN0cnVjdCBfaTJlQm9yZFN0ciAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CisKKwkvLyBSb3V0aW5lIHRvIHJlYWQgTiBieXRlcyBmcm9tIHRoZSBib2FyZCB0aHJvdWdoIHRoZSBGSUZPLiBSZXR1cm5zIHRydWUgaWYKKwkvLyBjb3BhY2V0aWMsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlIGFuZCBlcnJvciBpbiBpMmVFcnJvci4KKwkvLyBJRiBDT1VOVCBJUyBPREQsIFJPVU5EUyBVUCBUTyBUSEUgTkVYVCBFVkVOIE5VTUJFUi4KKworCWludCAgICgqaTJlUmVhZEJ1Zikoc3RydWN0IF9pMmVCb3JkU3RyICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKworCS8vIFJldHVybnMgYSB3b3JkIGZyb20gRklGTy4gV2lsbCB1c2UgMiBieXRlIG9wZXJhdGlvbnMgaWYgbmVlZGVkLgorCisJdW5zaWduZWQgc2hvcnQgKCppMmVSZWFkV29yZCkoc3RydWN0IF9pMmVCb3JkU3RyICopOworCisJLy8gV3JpdGVzIGEgd29yZCB0byBGSUZPLiBXaWxsIHVzZSAyIGJ5dGUgb3BlcmF0aW9ucyBpZiBuZWVkZWQuCisKKwl2b2lkICAoKmkyZVdyaXRlV29yZCkoc3RydWN0IF9pMmVCb3JkU3RyICosIHVuc2lnbmVkIHNob3J0KTsKKworCS8vIFdhaXRzIHNwZWNpZmllZCB0aW1lIGZvciB0aGUgVHJhbnNtaXQgRklGTyB0byBnbyBlbXB0eS4gUmV0dXJucyB0cnVlIGlmCisJLy8gIG9rLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgZXJyb3IgaW4gaTJlRXJyb3IuCisKKwlpbnQgICAoKmkyZVdhaXRGb3JUeEVtcHR5KShzdHJ1Y3QgX2kyZUJvcmRTdHIgKiwgaW50KTsKKworCS8vIFJldHVybnMgdHJ1ZSBvciBmYWxzZSBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgb3V0Z29pbmcgbWFpbGJveCBpcyBlbXB0eS4KKworCWludCAgICgqaTJlVHhNYWlsRW1wdHkpKHN0cnVjdCBfaTJlQm9yZFN0ciAqKTsKKworCS8vIENoZWNrcyB3aGV0aGVyIG91dGdvaW5nIG1haWxib3ggaXMgZW1wdHkuICBJZiBzbywgc2VuZHMgbWFpbCBhbmQgcmV0dXJucworCS8vIHRydWUuICBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKworCWludCAgICgqaTJlVHJ5U2VuZE1haWwpKHN0cnVjdCBfaTJlQm9yZFN0ciAqLCB1bnNpZ25lZCBjaGFyKTsKKworCS8vIElmIG5vIG1haWwgYXZhaWxhYmxlLCByZXR1cm5zIE5PX01BSUxfSEVSRSwgZWxzZSByZXR1cm5zIHRoZSB2YWx1ZSBpbiB0aGUKKwkvLyBtYWlsYm94IChndWFyYW50ZWVkIGNhbid0IGJlIE5PX01BSUxfSEVSRSkuCisKKwl1bnNpZ25lZCBzaG9ydCAoKmkyZUdldE1haWwpKHN0cnVjdCBfaTJlQm9yZFN0ciAqKTsKKworCS8vIEVuYWJsZXMgdGhlIGJvYXJkIHRvIGludGVycnVwdCB0aGUgaG9zdCB3aGVuIGl0IHdyaXRlcyB0byB0aGUgbWFpbGJveC4KKwkvLyBJcnFzIHdpbGwgbm90IG9jY3VyLCBob3dldmVyLCB1bnRpbCB0aGUgbG9hZHdhcmUgc2VwYXJhdGVseSBlbmFibGVzCisJLy8gaW50ZXJydXB0IGdlbmVyYXRpb24gdG8gdGhlIGhvc3QuICBUaGUgc3RhbmRhcmQgbG9hZHdhcmUgZG9lcyB0aGlzIGluCisJLy8gcmVzcG9uc2UgdG8gYSBjb21tYW5kIHBhY2tldCBzZW50IGJ5IHRoZSBob3N0LiAoQWxzbywgZGlzYWJsZXMKKwkvLyBhbnkgb3RoZXIgcG90ZW50aWFsIGludGVycnVwdCBzb3VyY2VzIGZyb20gdGhlIGJvYXJkIC0tIG90aGVyIHRoYW4gdGhlCisJLy8gaW5ib3VuZCBtYWlsYm94KS4KKworCXZvaWQgICgqaTJlRW5hYmxlTWFpbElycSkoc3RydWN0IF9pMmVCb3JkU3RyICopOworCisJLy8gV3JpdGVzIGFuIGFyYml0cmFyeSB2YWx1ZSB0byB0aGUgbWFzayByZWdpc3Rlci4KKworCXZvaWQgICgqaTJlV3JpdGVNYXNrKShzdHJ1Y3QgX2kyZUJvcmRTdHIgKiwgdW5zaWduZWQgY2hhcik7CisKKworCS8vIFN0YXRlIGluZm9ybWF0aW9uCisKKwkvLyBEdXJpbmcgZG93bmxvYWRpbmcsIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJsb2NrcyByZW1haW5pbmcgdG8gZG93bmxvYWQKKwkvLyB0byB0aGUgYm9hcmQuCisKKwlzaG9ydCBpMmVUb0xvYWQ7CisKKwkvLyBTdGF0ZSBvZiBib2FyZCAoc2VlIG1hbmlmZXN0cyBiZWxvdykgKGUuZy4sIHdoZXRoZXIgaW4gcmVzZXQgY29uZGl0aW9uLAorCS8vIHdoZXRoZXIgc3RhbmRhcmQgbG9hZHdhcmUgaXMgaW5zdGFsbGVkLCBldGMuCisKKwl1bnNpZ25lZCBjaGFyICBpMmVTdGF0ZTsKKworCS8vIFRoZXNlIHRocmVlIGZpZWxkcyBhcmUgb25seSB2YWxpZCB3aGVuIHRoZXJlIGlzIGxvYWR3YXJlIHJ1bm5pbmcgb24gdGhlCisJLy8gYm9hcmQuIChpMmVTdGF0ZSA9PSBJSV9TVEFURV9MT0FERUQgb3IgaTJlU3RhdGUgPT0gSUlfU1RBVEVfU1RETE9BREVEICkKKworCXVuc2lnbmVkIGNoYXIgIGkyZUxWZXJzaW9uOyAgLy8gTG9hZHdhcmUgdmVyc2lvbgorCXVuc2lnbmVkIGNoYXIgIGkyZUxSZXZpc2lvbjsgLy8gTG9hZHdhcmUgcmV2aXNpb24KKwl1bnNpZ25lZCBjaGFyICBpMmVMU3ViOyAgICAgIC8vIExvYWR3YXJlIHN1YnJldmlzaW9uCisKKwkvLyBGbGFncyB3aGljaCBvbmx5IGhhdmUgbWVhbmluZyBpbiB0aGUgY29udGV4dCBvZiB0aGUgc3RhbmRhcmQgbG9hZHdhcmUuCisJLy8gU29tZXdoYXQgdmlvbGF0ZXMgdGhlIGxheWVyaW5nIGNvbmNlcHQsIGJ1dCB0aGVyZSBpcyBzbyBsaXR0bGUgYWRkaXRpb25hbAorCS8vIG5lZWRlZCBhdCB0aGUgYm9hcmQgbGV2ZWwgKHdoaWxlIG11Y2ggYWRkaXRpb25hbCBhdCB0aGUgY2hhbm5lbCBsZXZlbCksCisJLy8gdGhhdCB0aGlzIGJlYXRzIG1haW50YWluaW5nIHR3byBkaWZmZXJlbnQgcGVyLWJvYXJkIHN0cnVjdHVyZXMuCisKKwkvLyBJbmRpY2F0ZXMgd2hpY2ggSVJRIHRoZSBib2FyZCBoYXMgYmVlbiBpbml0aWFsaXplZCAoZnJvbSBzb2Z0d2FyZSkgdG8gdXNlCisJLy8gRm9yIE1pY3JvQ2hhbm5lbCBib2FyZHMsIGFueSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSBJUlFfVU5ERUZJTkVEIG1lYW5zCisJLy8gdGhhdCB0aGUgc29mdHdhcmUgY29tbWFuZCBoYXMgYmVlbiBzZW50IHRvIGVuYWJsZSBpbnRlcnJ1cHRzIChvciBzcGVjaWZ5CisJLy8gdGhleSBhcmUgZGlzYWJsZWQpLiBTcGVjaWFsIHZhbHVlOiBJUlFfVU5ERUZJTkVEIGluZGljYXRlcyB0aGF0IHRoZQorCS8vIHNvZnR3YXJlIGNvbW1hbmQgdG8gc2VsZWN0IHRoZSBpbnRlcnJ1cHQgaGFzIG5vdCB5ZXQgYmVlbiBzZW50LCB0aGVyZWZvcmUKKwkvLyAoc2luY2UgdGhlIHN0YW5kYXJkIGxvYWR3YXJlIGluc2lzdHMgdGhhdCBpdCBiZSBzZW50IGJlZm9yZSBhbnkgb3RoZXIKKwkvLyBwYWNrZXRzIGFyZSBzZW50KSBubyBvdGhlciBwYWNrZXRzIHNob3VsZCBiZSBzZW50IHlldC4KKworCXVuc2lnbmVkIHNob3J0IGkyZVVzaW5nSXJxOworCisJLy8gVGhpcyBpcyBzZXQgd2hlbiB3ZSBoaXQgdGhlIE1CX09VVF9TVFVGRkVEIG1haWxib3gsIHdoaWNoIHByZXZlbnRzIHVzCisJLy8gcHV0dGluZyBtb3JlIGluIHRoZSBtYWlsYm94IHVudGlsIGFuIGFwcHJvcHJpYXRlIG1haWxib3ggbWVzc2FnZSBpcworCS8vIHJlY2VpdmVkLgorCisJdW5zaWduZWQgY2hhciAgaTJlV2FpdGluZ0ZvckVtcHR5RmlmbzsKKworCS8vIEFueSBtYWlsYm94IGJpdHMgd2FpdGluZyB0byBiZSBzZW50IHRvIHRoZSBib2FyZCBhcmUgT1InZWQgaW4gaGVyZS4KKworCXVuc2lnbmVkIGNoYXIgIGkyZU91dE1haWxXYWl0aW5nOworCisJLy8gVGhlIGhlYWQgb2YgYW55IGluY29taW5nIHBhY2tldCBpcyByZWFkIGludG8gaGVyZSwgaXMgdGhlbiBleGFtaW5lZCBhbmQgCisJLy8gd2UgZGlzcGF0Y2ggYWNjb3JkaW5nbHkuCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVMZWFkb2ZmV29yZFsxXTsKKworCS8vIFJ1bm5pbmcgY291bnRlciBvZiBpbnRlcnJ1cHRzIHdoZXJlIHRoZSBtYWlsYm94IGluZGljYXRlZCBpbmNvbWluZyBkYXRhLgorCisJdW5zaWduZWQgc2hvcnQgaTJlRmlmb0luSW50czsKKworCS8vIFJ1bm5pbmcgY291bnRlciBvZiBpbnRlcnJ1cHRzIHdoZXJlIHRoZSBtYWlsYm94IGluZGljYXRlZCBvdXRnb2luZyBkYXRhCisJLy8gaGFkIGJlZW4gc3RyaXBwZWQuCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVGaWZvT3V0SW50czsKKworCS8vIElmIG5vdCB2b2lkLCBnaXZlcyB0aGUgYWRkcmVzcyBvZiBhIHJvdXRpbmUgdG8gY2FsbCBpZiBmYXRhbCBib2FyZCBlcnJvcgorCS8vIGlzIGZvdW5kIChvbmx5IGFwcGxpZXMgdG8gc3RhbmRhcmQgbC93KS4KKworCXZvaWQgICgqaTJlRmF0YWxUcmFwKShzdHJ1Y3QgX2kyZUJvcmRTdHIgKik7CisKKwkvLyBXaWxsIHBvaW50IHRvIGFuIGFycmF5IG9mIHNvbWUgc29ydCBvZiBjaGFubmVsIHN0cnVjdHVyZXMgKHdob3NlIGZvcm1hdAorCS8vIGlzIHVua25vd24gYXQgdGhpcyBsZXZlbCwgYmVpbmcgYSBmdW5jdGlvbiBvZiB3aGF0IGxvYWR3YXJlIGlzCisJLy8gaW5zdGFsbGVkIGFuZCB0aGUgY29kZSBjb25maWd1cmF0aW9uIChtYXggc2l6ZXMgb2YgYnVmZmVycywgZXRjLikpLgorCisJdm9pZCAgKmkyZUNoYW5uZWxQdHI7CisKKwkvLyBTZXQgaW5kaWNhdGVzIHRoYXQgdGhlIGJvYXJkIGhhcyBnb25lIGZhdGFsLgorCisJdW5zaWduZWQgc2hvcnQgaTJlRmF0YWw7CisKKwkvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHBvaW50ZWQgdG8gYnkgaTJlQ2hhbm5lbFB0ci4KKworCXVuc2lnbmVkIHNob3J0IGkyZUNoYW5uZWxDbnQ7CisKKwkvLyBSaW5nLWJ1ZmZlcnMgb2YgY2hhbm5lbCBzdHJ1Y3R1cmVzIHdob3NlIGNoYW5uZWxzIGhhdmUgcGFydGljdWxhciBuZWVkcy4KKworCXJ3bG9ja190CUZidWZfc3BpbmxvY2s7CisJdm9sYXRpbGUKKwl1bnNpZ25lZCBzaG9ydCBpMkZidWZfc3RyaXA7CS8vIFN0cmlwIGluZGV4CisJdm9sYXRpbGUgCisJdW5zaWduZWQgc2hvcnQgaTJGYnVmX3N0dWZmOwkvLyBTdHVmZiBpbmRleAorCXZvaWQgICppMkZidWZbQ0hfUVVFVUVfU0laRV07CS8vIEFuIGFycmF5IG9mIGNoYW5uZWwgcG9pbnRlcnMKKwkJCQkJCQkJCS8vIG9mIGNoYW5uZWxzIHdobyBuZWVkIHRvIHNlbmQKKwkJCQkJCQkJCS8vIGZsb3cgY29udHJvbCBwYWNrZXRzLgorCXJ3bG9ja190CURidWZfc3BpbmxvY2s7CisJdm9sYXRpbGUKKwl1bnNpZ25lZCBzaG9ydCBpMkRidWZfc3RyaXA7CS8vIFN0cmlwIGluZGV4CisJdm9sYXRpbGUKKwl1bnNpZ25lZCBzaG9ydCBpMkRidWZfc3R1ZmY7CS8vIFN0dWZmIGluZGV4CisJdm9pZCAgKmkyRGJ1ZltDSF9RVUVVRV9TSVpFXTsJLy8gQW4gYXJyYXkgb2YgY2hhbm5lbCBwb2ludGVycworCQkJCQkJCQkJLy8gb2YgY2hhbm5lbHMgd2hvIG5lZWQgdG8gc2VuZAorCQkJCQkJCQkJLy8gZGF0YSBvciBpbi1saW5lIGNvbW1hbmQgcGFja2V0cy4KKwlyd2xvY2tfdAlCYnVmX3NwaW5sb2NrOworCXZvbGF0aWxlCisJdW5zaWduZWQgc2hvcnQgaTJCYnVmX3N0cmlwOwkvLyBTdHJpcCBpbmRleAorCXZvbGF0aWxlCisJdW5zaWduZWQgc2hvcnQgaTJCYnVmX3N0dWZmOwkvLyBTdHVmZiBpbmRleAorCXZvaWQgICppMkJidWZbQ0hfUVVFVUVfU0laRV07CS8vIEFuIGFycmF5IG9mIGNoYW5uZWwgcG9pbnRlcnMKKwkJCQkJCQkJCS8vIG9mIGNoYW5uZWxzIHdobyBuZWVkIHRvIHNlbmQKKwkJCQkJCQkJCS8vIGJ5cGFzcyBjb21tYW5kIHBhY2tldHMuCisKKwkvKgorCSAqIEEgc2V0IG9mIGZsYWdzIHRvIGluZGljYXRlIHRoYXQgY2VydGFpbiBldmVudHMgaGF2ZSBvY2N1cnJlZCBvbiBhdCBsZWFzdAorCSAqIG9uZSBvZiB0aGUgcG9ydHMgb24gdGhpcyBib2FyZC4gV2UgdXNlIHRoaXMgdG8gZGVjaWRlIHdoZXRoZXIgdG8gc3BpbgorCSAqIHRocm91Z2ggdGhlIGNoYW5uZWxzIGxvb2tpbmcgZm9yIGJyZWFrcywgZXRjLgorCSAqLworCWludAkJZ290X2lucHV0OworCWludAkJc3RhdHVzX2NoYW5nZTsKKwliaWRTdGF0CWNoYW5uZWxCdHlwZXM7CisKKwkvKgorCSAqIERlYnVnZ2luZyBjb3VudGVycywgZXRjLgorCSAqLworCXVuc2lnbmVkIGxvbmcgZGVidWdGbG93UXVldWVkOworCXVuc2lnbmVkIGxvbmcgZGVidWdJbmxpbmVRdWV1ZWQ7CisJdW5zaWduZWQgbG9uZyBkZWJ1Z0RhdGFRdWV1ZWQ7CisJdW5zaWduZWQgbG9uZyBkZWJ1Z0J5cGFzc1F1ZXVlZDsKKwl1bnNpZ25lZCBsb25nIGRlYnVnRmxvd0NvdW50OworCXVuc2lnbmVkIGxvbmcgZGVidWdJbmxpbmVDb3VudDsKKwl1bnNpZ25lZCBsb25nIGRlYnVnQnlwYXNzQ291bnQ7CisJCisJcndsb2NrX3QJcmVhZF9maWZvX3NwaW5sb2NrOworCXJ3bG9ja190CXdyaXRlX2ZpZm9fc3BpbmxvY2s7CisKKy8vCUZvciBxdWV1aW5nIGludGVycnVwdCBib3R0b20gaGFsZiBoYW5kbGVycy4JL1wvXHw9bWh3PXxcL1wvCisJc3RydWN0IHdvcmtfc3RydWN0CXRxdWV1ZV9pbnRlcnJ1cHQ7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCAgU2VuZFBlbmRpbmdUaW1lcjsgICAvLyBVc2VkIGJ5IGlpU2VuZFBlbmRpbmcKKwl1bnNpZ25lZCBpbnQJU2VuZFBlbmRpbmdSZXRyeTsKK30gaTJlQm9yZFN0ciwgKmkyZUJvcmRTdHJQdHI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFjcm8gRGVmaW5pdGlvbnMgZm9yIHRoZSBpbmRpcmVjdCBjYWxscyBkZWZpbmVkIGluIHRoZSBpMmVCb3JkU3RyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisjZGVmaW5lIGlpRGVsYXkoYSxiKSAgICAgICAgICAoKihhKS0+aTJlRGVsYXkpKGIpCisjZGVmaW5lIGlpV3JpdGVCdWYoYSxiLGMpICAgICAoKihhKS0+aTJlV3JpdGVCdWYpKGEsYixjKQorI2RlZmluZSBpaVJlYWRCdWYoYSxiLGMpICAgICAgKCooYSktPmkyZVJlYWRCdWYpKGEsYixjKQorCisjZGVmaW5lIGlpV3JpdGVXb3JkKGEsYikgICAgICAoKihhKS0+aTJlV3JpdGVXb3JkKShhLGIpCisjZGVmaW5lIGlpUmVhZFdvcmQoYSkgICAgICAgICAoKihhKS0+aTJlUmVhZFdvcmQpKGEpCisKKyNkZWZpbmUgaWlXYWl0Rm9yVHhFbXB0eShhLGIpICgqKGEpLT5pMmVXYWl0Rm9yVHhFbXB0eSkoYSxiKQorCisjZGVmaW5lIGlpVHhNYWlsRW1wdHkoYSkgICAgICAoKihhKS0+aTJlVHhNYWlsRW1wdHkpKGEpCisjZGVmaW5lIGlpVHJ5U2VuZE1haWwoYSxiKSAgICAoKihhKS0+aTJlVHJ5U2VuZE1haWwpKGEsYikKKworI2RlZmluZSBpaUdldE1haWwoYSkgICAgICAgICAgKCooYSktPmkyZUdldE1haWwpKGEpCisjZGVmaW5lIGlpRW5hYmxlTWFpbElycShhKSAgICAoKihhKS0+aTJlRW5hYmxlTWFpbElycSkoYSkKKyNkZWZpbmUgaWlEaXNhYmxlTWFpbElycShhKSAgICgqKGEpLT5pMmVXcml0ZU1hc2spKGEsMCkKKyNkZWZpbmUgaWlXcml0ZU1hc2soYSxiKSAgICAgICgqKGEpLT5pMmVXcml0ZU1hc2spKGEsYikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYW5pZmVzdHMgZm9yIGkyZUJvcmRTdHI6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBZRVMgMQorI2RlZmluZSBOTyAgMAorCisjZGVmaW5lIE5VTExGVU5DICh2b2lkICgqKSh2b2lkKSkwCisjZGVmaW5lIE5VTExQVFIgKHZvaWQgKikwCisKK3R5cGVkZWYgdm9pZCAoKmRlbGF5RnVuY190KSh1bnNpZ25lZCBpbnQpOworCisvLyBpMmVWYWxpZAorLy8KKyNkZWZpbmUgSTJFX01BR0lDICAgICAgIDB4NDI1MSAgIC8vIFN0cnVjdHVyZSBpcyB2YWxpZC4KKyNkZWZpbmUgSTJFX0lOQ09NUExFVEUgIDB4MTEyMiAgIC8vIFN0cnVjdHVyZSBmYWlsZWQgZHVyaW5nIGluaXQuCisKKworLy8gaTJlRXJyb3IKKy8vCisjZGVmaW5lIEkyRUVfR09PRCAgICAgICAwCS8vIE9wZXJhdGlvbiBzdWNjZXNzZnVsCisjZGVmaW5lIEkyRUVfQkFEQUREUiAgICAxCS8vIEFkZHJlc3Mgb3V0IG9mIHJhbmdlCisjZGVmaW5lIEkyRUVfQkFEU1RBVEUgICAyCS8vIEF0dGVtcHQgdG8gcGVyZm9ybSBhIGZ1bmN0aW9uIHdoZW4gdGhlIGJvYXJkCisJCQkJCQkJLy8gc3RydWN0dXJlIHdhcyBpbiB0aGUgaW5jb3JyZWN0IHN0YXRlCisjZGVmaW5lIEkyRUVfQkFETUFHSUMgICAzCS8vIEJhZCBtYWdpYyBudW1iZXIgZnJvbSBQb3dlciBPbiB0ZXN0IChpMmVQb21TaXplCisJCQkJCQkJLy8gcmVmbGVjdHMgd2hhdCB3YXMgcmVhZAorI2RlZmluZSBJMkVFX1BPUk1fU0hPUlQgNAkvLyBQb3dlciBPbiBtZXNzYWdlIHRvbyBzaG9ydAorI2RlZmluZSBJMkVFX1BPUk1fTE9ORyAgNQkvLyBQb3dlciBPbiBtZXNzYWdlIHRvbyBsb25nCisjZGVmaW5lIEkyRUVfQkFEX0ZBTUlMWSA2CS8vIFVuLXN1cHBvcnRlZCBib2FyZCBmYW1pbHkgdHlwZQorI2RlZmluZSBJMkVFX0lOQ09OU0lTVCAgNwkvLyBGaXJtd2FyZSByZXBvcnRzIHNvbWV0aGluZyBpbXBvc3NpYmxlLAorCQkJCQkJCS8vIGUuZy4gdW5leHBlY3RlZCBudW1iZXIgb2YgcG9ydHMuLi4gQWxtb3N0IG5vCisJCQkJCQkJLy8gZXhjdXNlIG90aGVyIHRoYW4gYmFkIEZJRk8uLi4KKyNkZWZpbmUgSTJFRV9QT1NURVJSICAgIDgJLy8gUG93ZXItT24gc2VsZiB0ZXN0IHJlcG9ydGVkIGEgYmFkIGVycm9yCisjZGVmaW5lIEkyRUVfQkFEQlVTICAgICA5CS8vIFVua25vd24gQnVzIHR5cGUgZGVjbGFyZWQgaW4gbWVzc2FnZQorI2RlZmluZSBJMkVFX1RYRV9USU1FICAgMTAJLy8gVGltZWQgb3V0IHdhaXRpbmcgZm9yIFRYIEZpZm8gdG8gZW1wdHkKKyNkZWZpbmUgSTJFRV9JTlZBTElEICAgIDExCS8vIGkyZVZhbGlkIGZpZWxkIGRvZXMgbm90IGluZGljYXRlIGEgdmFsaWQgYW5kCisJCQkJCQkJLy8gY29tcGxldGUgYm9hcmQgc3RydWN0dXJlIChmb3IgZnVuY3Rpb25zIHdoaWNoCisJCQkJCQkJLy8gcmVxdWlyZSB0aGlzIGJlIHNvLikKKyNkZWZpbmUgSTJFRV9CQURfUE9SVCAgIDEyCS8vIERpc2NyZXBhbmN5IGJldHdlZW4gY2hhbm5lbHMgYWN0dWFsbHkgZm91bmQgYW5kCisJCQkJCQkJLy8gd2hhdCB0aGUgcHJvZHVjdCBpcyBzdXBwb3NlZCB0byBoYXZlLiBDaGVjaworCQkJCQkJCS8vIGkyZUdvb2RNYXAgdnMgaTJlQ2hhbm5lbE1hcCBmb3IgZGV0YWlscy4KKyNkZWZpbmUgSTJFRV9CQURfSVJRICAgIDEzCS8vIFNvbWVvbmUgc3BlY2lmaWVkIGFuIHVuc3VwcG9ydGVkIElSUQorI2RlZmluZSBJMkVFX05PQ0hBTk5FTFMgMTQJLy8gTm8gY2hhbm5lbCBzdHJ1Y3R1cmVzIGhhdmUgYmVlbiBkZWZpbmVkIChmb3IKKwkJCQkJCQkvLyBmdW5jdGlvbnMgcmVxdWlyaW5nIHRoaXMpLgorCisvLyBpMmVGaWZvU3R5bGUKKy8vCisjZGVmaW5lIEZJRk9fSUkgICAwICAvKiBJbnRlbGxpUG9ydC1JSSBzdHlsZTogc2VlIGFsc28gaTJody5oICovCisjZGVmaW5lIEZJRk9fSUlFWCAxICAvKiBJbnRlbGxpUG9ydC1JSUVYIHN0eWxlICovCisKKy8vIGkyZUdldE1haWwKKy8vCisjZGVmaW5lIE5PX01BSUxfSEVSRSAgICAweDExMTEJLy8gU2luY2UgbWFpbCBpcyB1bnNpZ25lZCBjaGFyLCBjYW5ub3QgcG9zc2libHkKKwkJCQkJCQkJLy8gcHJvbW90ZSB0byAweDExMTEuCisvLyBpMmVTdGF0ZQorLy8KKyNkZWZpbmUgSUlfU1RBVEVfQ09MRCAgICAgIDAgIC8vIEFkZHJlc3NlcyBoYXZlIGJlZW4gZGVmaW5lZCwgYnV0IGJvYXJkIG5vdCBldmVuCisJCQkJCQkJICAvLyByZXNldCB5ZXQuCisjZGVmaW5lIElJX1NUQVRFX1JFU0VUICAgICAxICAvLyBCb2FyZCxpZiBpdCBleGlzdHMsIGhhcyBqdXN0IGJlZW4gcmVzZXQKKyNkZWZpbmUgSUlfU1RBVEVfUkVBRFkgICAgIDIgIC8vIEJvYXJkIHJlYWR5IGZvciBpdHMgZmlyc3QgYmxvY2sKKyNkZWZpbmUgSUlfU1RBVEVfTE9BRElORyAgIDMgIC8vIEJvYXJkIGNvbnRpbnVpbmcgbG9hZAorI2RlZmluZSBJSV9TVEFURV9MT0FERUQgICAgNCAgLy8gQm9hcmQgaGFzIGZpbmlzaGVkIGxvYWQ6IHN0YXR1cyBvaworI2RlZmluZSBJSV9TVEFURV9CQURMT0FEICAgNSAgLy8gQm9hcmQgaGFzIGZpbmlzaGVkIGxvYWQ6IGZhaWxlZCEKKyNkZWZpbmUgSUlfU1RBVEVfU1RETE9BREVEIDYgIC8vIEJvYXJkIGhhcyBmaW5pc2hlZCBsb2FkOiBzdGFuZGFyZCBmaXJtd2FyZQorCisvLyBpMmVVc2luZ0lycQorLy8KKyNkZWZpbmUgSVJRX1VOREVGSU5FRCAgIDB4MTM1MiAgLy8gTm8gdmFsaWQgaXJxIChvciBwb2xsaW5nID0gMCkgY2FuIGV2ZXIKKwkJCQkJCQkJLy8gcHJvbW90ZSB0byB0aGlzIQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhhbmR5IE1hY3JvcyBmb3IgaTJlbGxpcy5jIGFuZCBvdGhlcnMKKy8vIE5vdGUgdGhlc2UgYXJlIGNvbW1vbiB0byAtSUkgYW5kIC1JSUVYCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIGJvYXJkIHN0cnVjdHVyZSwgZG9lcyB0aGUgaW5wdXQgRklGTyBoYXZlIGFueSBkYXRhIG9yCisvLyBub3Q/CisvLworI2RlZmluZSBIQVNfSU5QVVQocEIpICAgICAgIShJTkIocEItPmkyZVN0YXR1cykgJiBTVF9JTl9FTVBUWSkKKyNkZWZpbmUgSEFTX05PX0lOUFVUKHBCKSAgIChJTkIocEItPmkyZVN0YXR1cykgJiBTVF9JTl9FTVBUWSkKKworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZSwgcmVhZCBhIGJ5dGUgb3Igd29yZCBmcm9tIHRoZSBmaWZvCisvLworI2RlZmluZSBCWVRFX0ZST00ocEIpICAgICAgKHVuc2lnbmVkIGNoYXIpSU5CKHBCLT5pMmVEYXRhKQorI2RlZmluZSBXT1JEX0ZST00ocEIpICAgICAgKHVuc2lnbmVkIHNob3J0KUlOVyhwQi0+aTJlRGF0YSkKKworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZSwgaXMgdGhlcmUgcm9vbSBmb3IgYW55IGRhdGEgdG8gYmUgd3JpdHRlbgorLy8gdG8gdGhlIGRhdGEgZmlmbz8KKy8vCisjZGVmaW5lIEhBU19PVVRST09NKHBCKSAgICAhKElOQihwQi0+aTJlU3RhdHVzKSAmIFNUX09VVF9GVUxMKQorI2RlZmluZSBIQVNfTk9fT1VUUk9PTShwQikgKElOQihwQi0+aTJlU3RhdHVzKSAmIFNUX09VVF9GVUxMKQorCisvLyBHaXZlbiBhIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlLCB3cml0ZSBhIHNpbmdsZSBieXRlIHRvIHRoZSBmaWZvCisvLyBzdHJ1Y3R1cmUuIE5vdGUgdGhhdCBmb3IgMTYtYml0IGludGVyZmFjZXMsIHRoZSBoaWdoIG9yZGVyIGJ5dGUgaXMgdW5kZWZpbmVkCisvLyBhbmQgdW5rbm93bi4KKy8vCisjZGVmaW5lIEJZVEVfVE8ocEIsIGMpICAgICBPVVRCKHBCLT5pMmVEYXRhLChjKSkKKworLy8gV3JpdGUgYSB3b3JkIHRvIHRoZSBmaWZvIHN0cnVjdHVyZS4gRm9yIDgtYml0IGludGVyZmFjZXMsIHRoaXMgbWF5IGhhdmUKKy8vIHVua25vd24gcmVzdWx0cy4KKy8vCisjZGVmaW5lIFdPUkRfVE8ocEIsIGMpICAgICBPVVRXKHBCLT5pMmVEYXRhLChjKSkKKworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBib2FyZCBzdHJ1Y3R1cmUsIGlzIHRoZXJlIGFueXRoaW5nIGluIHRoZSBpbmNvbWluZworLy8gbWFpbGJveD8KKy8vCisjZGVmaW5lIEhBU19NQUlMKHBCKSAgICAgICAoSU5CKHBCLT5pMmVTdGF0dXMpICYgU1RfSU5fTUFJTCkKKworI2RlZmluZSBVUERBVEVfRklGT19ST09NKHBCKSAgKHBCKS0+aTJlRmlmb1JlbWFpbnM9KHBCKS0+aTJlRmlmb1NpemUKKworLy8gSGFuZHkgbWFjcm8gdG8gcm91bmQgdXAgYSBudW1iZXIgKGxpa2UgdGhlIGJ1ZmZlciB3cml0ZSBhbmQgcmVhZCByb3V0aW5lcyBkbykKKy8vIAorI2RlZmluZSBST1VORFVQKG51bWJlcikgICAgKCgobnVtYmVyKSsxKSAmICh+MSkpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgZm9yIGkyZWxsaXMuYworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbnMgY2FsbGVkIGRpcmVjdGx5CisvLworLy8gSW5pdGlhbGl6YXRpb24gb2YgYSBib2FyZCAmIHN0cnVjdHVyZSBpcyBpbiBmb3VyIChmaXZlISkgcGFydHM6CisvLworLy8gMCkgaWlFbGxpc0luaXQoKSAgLSBJbml0aWFsaXplIGlpRWxsaXMgc3Vic3lzdGVtLgorLy8gMSkgaWlTZXRBZGRyZXNzKCkgLSBEZWZpbmUgdGhlIGJvYXJkIGFkZHJlc3MgJiBkZWxheSBmdW5jdGlvbiBmb3IgYSBib2FyZC4KKy8vIDIpIGlpUmVzZXQoKSAgICAgIC0gUmVzZXQgdGhlIGJvYXJkICAgKHByb3ZpZGVkIGl0IGV4aXN0cykKKy8vICAgICAgIC0tIE5vdGUgeW91IG1heSBkbyB0aGlzIHRvIHNldmVyYWwgYm9hcmRzIC0tCisvLyAzKSBpaVJlc2V0RGVsYXkoKSAtIERlbGF5IGZvciAyIHNlY29uZHMgKG9uY2UgZm9yIGFsbCBib2FyZHMpCisvLyA0KSBpaUluaXRpYWxpemUoKSAtIEF0dGVtcHQgdG8gcmVhZCBQb3dlci11cCBtZXNzYWdlOyBmdXJ0aGVyIGluaXRpYWxpemUKKy8vICAgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0b3JzCisvLworLy8gVGhlbiB5b3UgbWF5IHVzZSBpaURvd25sb2FkQWxsKCkgb3IgaWlEb3dubG9hZEZpbGUoKSAoaW4gaTJmaWxlLmMpIHRvIHdyaXRlCisvLyBsb2Fkd2FyZS4gIFRvIGNoYW5nZSBsb2Fkd2FyZSwgeW91IG11c3QgYmVnaW4gYWdhaW4gd2l0aCBzdGVwIDIsIHJlc2V0dGluZworLy8gdGhlIGJvYXJkIGFnYWluIChzdGVwIDEgbm90IG5lZWRlZCkuCisKK3N0YXRpYyB2b2lkIGlpRWxsaXNJbml0KHZvaWQpOworc3RhdGljIGludCBpaVNldEFkZHJlc3MoaTJlQm9yZFN0clB0ciwgaW50LCBkZWxheUZ1bmNfdCApOworc3RhdGljIGludCBpaVJlc2V0KGkyZUJvcmRTdHJQdHIpOworc3RhdGljIGludCBpaVJlc2V0RGVsYXkoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgaW50IGlpSW5pdGlhbGl6ZShpMmVCb3JkU3RyUHRyKTsKKworLy8gUm91dGluZSB0byB2YWxpZGF0ZSB0aGF0IGFsbCBjaGFubmVscyBleHBlY3RlZCBhcmUgdGhlcmUuCisvLworZXh0ZXJuIGludCBpaVZhbGlkYXRlQ2hhbm5lbHMoaTJlQm9yZFN0clB0cik7CisKKy8vIFJvdXRpbmUgdXNlZCB0byBkb3dubG9hZCBhIGJsb2NrIG9mIGxvYWR3YXJlLgorLy8KK3N0YXRpYyBpbnQgaWlEb3dubG9hZEJsb2NrKGkyZUJvcmRTdHJQdHIsIGxvYWRIZHJTdHJQdHIsIGludCk7CisKKy8vIFJldHVybiB2YWx1ZXMgZ2l2ZW4gYnkgaWlEb3dubG9hZEJsb2NrLCBpaURvd25sb2FkQWxsLCBpaURvd25sb2FkRmlsZToKKy8vCisjZGVmaW5lIElJX0RPV05fQkFEVkFMSUQgICAwCS8vIGJvYXJkIHN0cnVjdHVyZSBpcyBpbnZhbGlkCisjZGVmaW5lIElJX0RPV05fQ09OVElOVUlORyAxCS8vIFNvIGZhciwgc28gZ29vZCwgZmlybXdhcmUgZXhwZWN0cyBtb3JlCisjZGVmaW5lIElJX0RPV05fR09PRCAgICAgICAyCS8vIERvd25sb2FkIGNvbXBsZXRlLCBDUkMgZ29vZAorI2RlZmluZSBJSV9ET1dOX0JBRCAgICAgICAgMwkvLyBEb3dubG9hZCBjb21wbGV0ZSwgYnV0IENSQyBiYWQKKyNkZWZpbmUgSUlfRE9XTl9CQURGSUxFICAgIDQJLy8gQmFkIG1hZ2ljIG51bWJlciBpbiBsb2Fkd2FyZSBmaWxlCisjZGVmaW5lIElJX0RPV05fQkFEU1RBVEUgICA1CS8vIEJvYXJkIGlzIGluIGFuIGluYXBwcm9wcmlhdGUgc3RhdGUgZm9yCisJCQkJCQkJCS8vIGRvd25sb2FkaW5nIGxvYWR3YXJlLiAoc2VlIGkyZVN0YXRlKQorI2RlZmluZSBJSV9ET1dOX1RJTUVPVVQgICAgNgkvLyBUaW1lb3V0IHdhaXRpbmcgZm9yIGZpcm13YXJlCisjZGVmaW5lIElJX0RPV05fT1ZFUiAgICAgICA3CS8vIFRvbyBtdWNoIGRhdGEKKyNkZWZpbmUgSUlfRE9XTl9VTkRFUiAgICAgIDgJLy8gTm90IGVub3VnaCBkYXRhCisjZGVmaW5lIElJX0RPV05fTk9GSUxFICAgICA5CS8vIExvYWR3YXJlIGZpbGUgbm90IGZvdW5kCisKKy8vIFJvdXRpbmUgdG8gZG93bmxvYWQgYW4gZW50aXJlIGxvYWR3YXJlIG1vZHVsZTogUmV0dXJuIHZhbHVlcyBhcmUgYSBzdWJzZXQgb2YKKy8vIGlpRG93bmxvYWRCbG9jaydzLCBleGNsdWRpbmcsIG9mIGNvdXJzZSwgSUlfRE9XTl9DT05USU5VSU5HCisvLworc3RhdGljIGludCBpaURvd25sb2FkQWxsKGkyZUJvcmRTdHJQdHIsIGxvYWRIZHJTdHJQdHIsIGludCwgaW50KTsKKworLy8gQ2FsbGVkIGluZGlyZWN0bHkgYWx3YXlzLiAgTmVlZGVkIGV4dGVybmFsbHkgc28gdGhlIHJvdXRpbmUgbWlnaHQgYmUKKy8vIFNQRUNJRklFRCBhcyBhbiBhcmd1bWVudCB0byBpaVJlc2V0KCkKKy8vCisvL3N0YXRpYyB2b2lkIGlpMkRlbGF5SU8odW5zaWduZWQgaW50KTsJCS8vIE4tbWlsbGlzZWNvbmQgZGVsYXkgdXNpbmcKKwkJCQkJCQkJCQkJLy9oYXJkd2FyZSBzcGluCisvL3N0YXRpYyB2b2lkIGlpMkRlbGF5VGltZXIodW5zaWduZWQgaW50KTsJLy8gTi1taWxsaXNlY29uZCBkZWxheSB1c2luZyBMaW51eAorCQkJCQkJCQkJCQkvL3RpbWVyCisKKy8vIE1hbnkgZnVuY3Rpb25zIGRlZmluZWQgaGVyZSByZXR1cm4gVHJ1ZSBpZiBnb29kLCBGYWxzZSBvdGhlcndpc2UsIHdpdGggYW4KKy8vIGVycm9yIGNvZGUgaW4gaTJlRXJyb3IgZmllbGQuIEhlcmUgaXMgYSBoYW5keSBtYWNybyBmb3Igc2V0dGluZyB0aGUgZXJyb3IKKy8vIGNvZGUgYW5kIHJldHVybmluZy4KKy8vCisjZGVmaW5lIENPTVBMRVRFKHBCLGNvZGUpIFwKKwlpZigxKXsgXAorCQkgcEItPmkyZUVycm9yID0gY29kZTsgXAorCQkgcmV0dXJuIChjb2RlID09IEkyRUVfR09PRCk7XAorCX0KKworI2VuZGlmICAgLy8gSTJFTExJU19ICmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kyaHcuaCBiL2RyaXZlcnMvY2hhci9pcDIvaTJody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZmUwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2kyaHcuaApAQCAtMCwwICsxLDY0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAoYykgMTk5OSBieSBDb21wdXRvbmUgQ29ycG9yYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqICAgUEFDS0FHRTogICAgIExpbnV4IHR0eSBEZXZpY2UgRHJpdmVyIGZvciBJbnRlbGxpUG9ydCBJSSBmYW1pbHkgb2YgbXVsdGlwb3J0CisqICAgICAgICAgICAgICAgIHNlcmlhbCBJL08gY29udHJvbGxlcnMuCisqCisqICAgREVTQ1JJUFRJT046IERlZmluaXRpb25zIGxpbWl0ZWQgdG8gcHJvcGVydGllcyBvZiB0aGUgaGFyZHdhcmUgb3IgdGhlCisqICAgICAgICAgICAgICAgIGJvb3RzdHJhcCBmaXJtd2FyZS4gQXMgc3VjaCwgdGhleSBhcmUgYXBwbGljYWJsZSByZWdhcmRsZXNzIG9mCisqICAgICAgICAgICAgICAgIG9wZXJhdGluZyBzeXN0ZW0gb3IgbG9hZHdhcmUgKHN0YW5kYXJkIG9yIGRpYWdub3N0aWMpLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgSTJIV19ICisjZGVmaW5lIEkySFdfSCAxCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2aXNpb24gSGlzdG9yeToKKy8vCisvLyAyMyBTZXB0ZW1iZXIgMTk5MSBNQUcgICBGaXJzdCBEcmFmdCBTdGFydGVkLi4udGhyb3VnaC4uLgorLy8gMTEgT2N0b2JlciAxOTkxICAgLi4uICAgQ29udGludWluZyBkZXZlbG9wbWVudC4uLgorLy8gIDYgQXVndXN0IDE5OTMgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgSVNBLTQgKGFzaWMpIHdoaWNoIGlzIGFyY2hpdGVjdGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhbiBJU0EtQ0VYIHdpdGggYSBzaW5nbGUgNC1wb3J0IGJveC4KKy8vCisvLyAyMCBEZWNlbWJlciAxOTk2ICBBS00gICBWZXJzaW9uIGZvciBMaW51eAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIQVJEV0FSRSBERVNDUklQVElPTjoKKworSW50cm9kdWN0aW9uOgorCitUaGUgSW50ZWxsaVBvcnQtSUkgYW5kIEludGVsbGlQb3J0LUlJRVggcHJvZHVjdHMgb2NjdXB5IGEgYmxvY2sgb2YgZWlnaHQgKDgpCithZGRyZXNzZXMgaW4gdGhlIGhvc3QncyBJL08gc3BhY2UuCisKK1NvbWUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIHRyYW5zZmVyIGRhdGEgdG8vZnJvbSB0aGUgYm9hcmQsIHNvbWUgdG8gdHJhbnNmZXIKK3NvLWNhbGxlZCAibWFpbGJveCIgbWVzc2FnZXMsIGFuZCBzb21lIHRvIHJlYWQgYml0LW1hcHBlZCBzdGF0dXMgaW5mb3JtYXRpb24uCitXaGlsZSBhbGwgdGhlIHByb2R1Y3RzIGluIHRoZSBsaW5lIGFyZSBmdW5jdGlvbmFsbHkgc2ltaWxhciwgc29tZSB1c2UgYSAxNi1iaXQKK2RhdGEgcGF0aCB0byB0cmFuc2ZlciBkYXRhIHdoaWxlIG90aGVycyB1c2UgYW4gOC1iaXQgcGF0aC4gQWxzbywgdGhlIHVzZSBvZgorY29tbWFuZCAvc3RhdHVzL21haWxib3ggcmVnaXN0ZXJzIGRpZmZlcnMgc2xpZ2h0bHkgYmV0d2VlbiB0aGUgSUkgYW5kIElJRVgKK2JyYW5jaGVzIG9mIHRoZSBmYW1pbHkuCisKK1RoZSBob3N0IGRldGVybWluZXMgd2hhdCB0eXBlIG9mIGJvYXJkIGl0IGlzIGRlYWxpbmcgd2l0aCBieSByZWFkaW5nIGEgc3RyaW5nIG9mCitzaXh0ZWVuIGNoYXJhY3RlcnMgZnJvbSB0aGUgYm9hcmQuIFRoZXNlIGNoYXJhY3RlcnMgYXJlIGFsd2F5cyBwbGFjZWQgaW4gdGhlCitmaWZvIGJ5IHRoZSBib2FyZCdzIGxvY2FsIHByb2Nlc3NvciB3aGVuZXZlciB0aGUgYm9hcmQgaXMgcmVzZXQgKGVpdGhlciBmcm9tCitwb3dlci1vbiBvciB1bmRlciBzb2Z0d2FyZSBjb250cm9sKSBhbmQgYXJlIGtub3duIGFzIHRoZSAiUG93ZXItb24gUmVzZXQKK01lc3NhZ2UuIiBJbiBvcmRlciB0aGF0IHRoaXMgbWVzc2FnZSBjYW4gYmUgcmVhZCBmcm9tIGVpdGhlciB0eXBlIG9mIGJvYXJkLCB0aGUKK2hhcmR3YXJlIHJlZ2lzdGVycyB1c2VkIGluIHJlYWRpbmcgdGhpcyBtZXNzYWdlIGFyZSB0aGUgc2FtZS4gT25jZSB0aGlzIG1lc3NhZ2UKK2hhcyBiZWVuIHJlYWQgYnkgdGhlIGhvc3QsIHRoZW4gaXQgaGFzIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBvcGVyYXRlLgorCitHZW5lcmFsIERpZmZlcmVuY2VzIGJldHdlZW4gYm9hcmRzOgorCitUaGUgZ3JlYXRlc3Qgc3RydWN0dXJhbCBkaWZmZXJlbmNlIGlzIGJldHdlZW4gdGhlIC1JSSBhbmQgLUlJRVggZmFtaWxpZXMgb2YKK3Byb2R1Y3QuIFRoZSAtSUkgYm9hcmRzIHVzZSB0aGUgQW00NzAxIGR1YWwgNTEyeDggYmlkaXJlY3Rpb25hbCBmaWZvIHRvIHN1cHBvcnQKK3RoZSBkYXRhIHBhdGgsIG1haWxib3ggcmVnaXN0ZXJzLCBhbmQgc3RhdHVzIHJlZ2lzdGVycy4gVGhpcyBjaGlwIGNvbnRhaW5zIHNvbWUKK2ZlYXR1cmVzIHdoaWNoIGFyZSBub3QgdXNlZCBpbiB0aGUgSW50ZWxsaVBvcnQtSUkgcHJvZHVjdHM7IGEgZGVzY3JpcHRpb24gb2YKK3RoZXNlIGlzIG9taXR0ZWQgaGVyZS4gQmVjYXVzZSBvZiB0aGVzZSBtYW55IGZlYXR1cmVzLCBpdCBjb250YWlucyBtYW55CityZWdpc3RlcnMsIHRvbyBtYW55IHRvIGFjY2VzcyBkaXJlY3RseSB3aXRoaW4gYSBzbWFsbCBhZGRyZXNzIHNwYWNlLiBUaGV5IGFyZQorYWNjZXNzZWQgYnkgZmlyc3Qgd3JpdGluZyBhIHZhbHVlIHRvIGEgInBvaW50ZXIiIHJlZ2lzdGVyLiBUaGlzIHZhbHVlIHNlbGVjdHMKK3RoZSByZWdpc3RlciB0byBiZSBhY2Nlc3NlZC4gIFRoZSBuZXh0IHJlYWQgb3Igd3JpdGUgdG8gdGhhdCBhZGRyZXNzIGFjY2Vzc2VzCit0aGUgc2VsZWN0ZWQgcmVnaXN0ZXIgcmF0aGVyIHRoYW4gdGhlIHBvaW50ZXIgcmVnaXN0ZXIuCisKK1RoZSAtSUlFWCBib2FyZHMgdXNlIGEgcHJvcHJpZXRhcnkgZGVzaWduIHNpbWlsYXIgdG8gdGhlIEFtNDcwMSBpbiBmdW5jdGlvbi4gQnV0CitiZWNhdXNlIG9mIGEgc2ltcGxlciwgbW9yZSBzdHJlYW1saW5lZCBkZXNpZ24gaXQgZG9lc24ndCByZXF1aXJlIHNvIG1hbnkKK3JlZ2lzdGVycy4gVGhpcyBtZWFucyB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBpbiBzaW5nbGUgb3BlcmF0aW9ucyByYXRoZXIKK3RoYW4gdGhyb3VnaCBhIHBvaW50ZXIgcmVnaXN0ZXIuCisKK0Jlc2lkZXMgdGhlc2UgZGlmZmVyZW5jZXMsIHRoZXJlIGFyZSBkaWZmZXJlbmNlcyBpbiB3aGV0aGVyIDgtYml0IG9yIDE2LWJpdAordHJhbnNmZXJzIGFyZSB1c2VkIHRvIG1vdmUgZGF0YSB0byB0aGUgYm9hcmQuCisKK1RoZSAtSUkgYm9hcmRzIGFyZSBjYXBhYmxlIG9ubHkgb2YgOC1iaXQgZGF0YSB0cmFuc2ZlcnMsIHdoaWxlIHRoZSAtSUlFWCBib2FyZHMKK21heSBiZSBjb25maWd1cmVkIGZvciBlaXRoZXIgOC1iaXQgb3IgMTYtYml0IGRhdGEgdHJhbnNmZXJzLiBJZiB0aGUgb24tYm9hcmQgRElQCitzd2l0Y2ggIzggaXMgT04sIGFuZCB0aGUgY2FyZCBoYXMgYmVlbiBpbnN0YWxsZWQgaW4gYSAxNi1iaXQgc2xvdCwgMTYtYml0Cit0cmFuc2ZlcnMgYXJlIHN1cHBvcnRlZCAoYW5kIHdpbGwgYmUgZXhwZWN0ZWQgYnkgdGhlIHN0YW5kYXJkIGxvYWR3YXJlKS4gVGhlCitvbi1ib2FyZCBmaXJtd2FyZSBjYW4gZGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiB0aGUgc3dpdGNoLCBhbmQgd2hldGhlciB0aGUKK2JvYXJkIGlzIGluc3RhbGxlZCBpbiBhIDE2LWJpdCBzbG90OyBpdCBzdXBwbGllcyB0aGlzIGluZm9ybWF0aW9uIHRvIHRoZSBob3N0IGFzCitwYXJ0IG9mIHRoZSBwb3dlci11cCByZXNldCBtZXNzYWdlLgorCitUaGUgY29uZmlndXJhdGlvbiBzd2l0Y2ggKCM4KSBhbmQgc2xvdCBzZWxlY3Rpb24gZG8gbm90IGRpcmVjdGx5IGNvbmZpZ3VyZSB0aGUKK2hhcmR3YXJlLiBJdCBpcyB1cCB0byB0aGUgb24tYm9hcmQgbG9hZHdhcmUgYW5kIGhvc3QtYmFzZWQgZHJpdmVycyB0byBhY3QKK2FjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgb3B0aW9ucy4gVGhhdCBpcywgbG9hZHdhcmUgYW5kIGRyaXZlcnMgY291bGQgYmUKK3dyaXR0ZW4gdG8gcGVyZm9ybSA4LWJpdCB0cmFuc2ZlcnMgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdGUgb2YgdGhlIERJUCBzd2l0Y2ggb3IKK3Nsb3QgKGFuZCBpbiBhIGRpYWdub3N0aWMgZW52aXJvbm1lbnQgbWlnaHQgd2VsbCBkbyBzbykuIExpa2V3aXNlLCAxNi1iaXQKK3RyYW5zZmVycyBjb3VsZCBiZSBwZXJmb3JtZWQgYXMgbG9uZyBhcyB0aGUgY2FyZCBpcyBpbiBhIDE2LWJpdCBzbG90LgorCitOb3RlIHRoZSBzbG90IHNlbGVjdGlvbiBhbmQgRElQIHN3aXRjaCBzZWxlY3Rpb24gYXJlIHByb3ZpZGVkIHNlcGFyYXRlbHk6IGEKK2JvYXJkIHJ1bm5pbmcgaW4gOC1iaXQgbW9kZSBpbiBhIDE2LWJpdCBzbG90IGhhcyBhIGdyZWF0ZXIgcmFuZ2Ugb2YgcG9zc2libGUKK2ludGVycnVwdHMgdG8gY2hvb3NlIGZyb207IGluZm9ybWF0aW9uIG9mIHBvdGVudGlhbCB1c2UgdG8gdGhlIGhvc3QuCisKK0FsbCA4LWJpdCBkYXRhIHRyYW5zZmVycyBhcmUgZG9uZSBpbiB0aGUgc2FtZSB3YXksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvbiBhCistSUkgYm9hcmQgb3IgYSAtSUlFWCBib2FyZC4KKworVGhlIGhvc3QgbXVzdCBjb25zaWRlciB0d28gdGhpbmdzIHRoZW46IDEpIHdoZXRoZXIgYSAtSUkgb3IgLUlJRVggcHJvZHVjdCBpcworYmVpbmcgdXNlZCwgYW5kIDIpIHdoZXRoZXIgYW4gOC1iaXQgb3IgMTYtYml0IGRhdGEgcGF0aCBpcyB1c2VkLgorCitBIGZ1cnRoZXIgZGlmZmVyZW5jZSBpcyB0aGF0IC1JSSBib2FyZHMgYWx3YXlzIGhhdmUgYSA1MTItYnl0ZSBmaWZvIG9wZXJhdGluZyBpbgorZWFjaCBkaXJlY3Rpb24uIC1JSUVYIGJvYXJkcyBtYXkgdXNlIGZpZm9zIG9mIHZhcnlpbmcgc2l6ZTsgdGhpcyBzaXplIGlzCityZXBvcnRlZCBhcyBwYXJ0IG9mIHRoZSBwb3dlci11cCBtZXNzYWdlLgorCitJL08gTWFwIE9mIEludGVsbGlQb3J0LUlJIGFuZCBJbnRlbGxpUG9ydC1JSUVYIGJvYXJkczoKKyhSZWxhdGl2ZSB0byB0aGUgY2hvc2VuIGJhc2UgYWRkcmVzcykKKworQWRkciAgUi9XICAgICAgSW50ZWxsaVBvcnQtSUkgICAgSW50ZWxsaVBvcnQtSUlFWAorLS0tLSAgLS0tICAgICAgLS0tLS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLQorMCAgICAgUi9XICAgICAgRGF0YSBQb3J0IChieXRlKSAgRGF0YSBQb3J0IChieXRlIG9yIHdvcmQpCisxICAgICBSL1cgICAgICAoTm90IHVzZWQpICAgICAgICAoTVNCIG9mIHdvcmQtd2lkZSBkYXRhIHdyaXR0ZW4gdG8gRGF0YSBQb3J0KQorMiAgICAgUiAgICAgICAgU3RhdHVzIFJlZ2lzdGVyICAgU3RhdHVzIFJlZ2lzdGVyCisyICAgICBXICAgICAgICBQb2ludGVyIFJlZ2lzdGVyICBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgorMyAgICAgUi9XICAgICAgKE5vdCB1c2VkKSAgICAgICAgTWFpbGJveCBSZWdpc3RlcnMgKDYgYml0czogMTExMTExMDApCis0LDUgICAtLSAgICAgICBSZXNlcnZlZCBmb3IgZnV0dXJlIHByb2R1Y3RzCis2ICAgICAtLSAgICAgICBSZXNlcnZlZCBmb3IgZnV0dXJlIHByb2R1Y3RzCis3ICAgICBSICAgICAgICBHdWFyYW50ZWVkIHRvIGhhdmUgbm8gZWZmZWN0Cis3ICAgICBXICAgICAgICBIYXJkd2FyZSByZXNldCBvZiBib2FyZC4KKworCitSdWxlczoKK0FsbCBkYXRhIHRyYW5zZmVycyBhcmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBldmVuIGkvbyBhZGRyZXNzLiBJZiBieXRlLXdpZGUgZGF0YQordHJhbnNmZXJzIGFyZSBiZWluZyB1c2VkLCBkbyBJTkIvT1VUQiBvcGVyYXRpb25zIG9uIHRoZSBkYXRhIHBvcnQuIElmIHdvcmQtd2lkZQordHJhbnNmZXJzIGFyZSB1c2VkLCBkbyBJTlcvT1VUVyBvcGVyYXRpb25zLiBJbiBzb21lIGNpcmN1bXN0YW5jZXMgKHN1Y2ggYXMKK3JlYWRpbmcgdGhlIHBvd2VyLXVwIG1lc3NhZ2UpIHlvdSB3aWxsIGRvIElOQiBmcm9tIHRoZSBkYXRhIHBvcnQsIGJ1dCBpbiB0aGlzCitjYXNlIHRoZSBNU0Igb2YgZWFjaCB3b3JkIHJlYWQgaXMgbG9zdC4gV2hlbiBhY2Nlc3NpbmcgYWxsIG90aGVyIHVucmVzZXJ2ZWQKK3JlZ2lzdGVycywgdXNlIGJ5dGUgb3BlcmF0aW9ucyBvbmx5LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hbmRhdG9yeSBJbmNsdWRlczoKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworI2luY2x1ZGUgImlwMnR5cGVzLmgiCisjaW5jbHVkZSAiaTJvcy5oIiAgICAvKiBGb3IgYW55IG8ucy4sIGNvbXBpbGVyLCBvciBob3N0LXJlbGF0ZWQgaXNzdWVzICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFuaWZlc3RzIGZvciB0aGUgSS9PIG1hcDoKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUi9XOiBEYXRhIHBvcnQgKGJ5dGUpIGZvciBJbnRlbGxpUG9ydC1JSSwKKy8vIFIvVzogRGF0YSBwb3J0IChieXRlIG9yIHdvcmQpIGZvciBJbnRlbGxpUG9ydC1JSUVYCisvLyBJbmNvbWluZyBvciBvdXRnb2luZyBkYXRhIHBhc3NlcyB0aHJvdWdoIGEgRklGTywgdGhlIHN0YXR1cyBvZiB3aGljaCBpcworLy8gYXZhaWxhYmxlIGluIHNvbWUgb2YgdGhlIGJpdHMgaW4gRklGT19TVEFUVVMuIFRoaXMgKGJpZGlyZWN0aW9uYWwpIEZJRk8gaXMKKy8vIHRoZSBwcmltYXJ5IG1lYW5zIG9mIHRyYW5zZmVycmluZyBkYXRhLCBjb21tYW5kcywgZmxvdy1jb250cm9sLCBhbmQgc3RhdHVzCisvLyBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFuZCBib2FyZC4KKy8vCisjZGVmaW5lIEZJRk9fREFUQSAwCisKKy8vIEFub3RoZXIgd2F5IG9mIHBhc3NpbmcgaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgYm9hcmQgYW5kIHRoZSBob3N0IGlzCisvLyB0aHJvdWdoICJtYWlsYm94ZXMiLiBVbmxpa2UgYSBGSUZPLCBhIG1haWxib3ggaG9sZHMgb25seSBhIHNpbmdsZSBieXRlIG9mCisvLyBkYXRhLiAgV3JpdGluZyBkYXRhIHRvIHRoZSBtYWlsYm94IGNhdXNlcyBhIHN0YXR1cyBiaXQgdG8gYmUgc2V0LCBhbmQKKy8vIHBvdGVudGlhbGx5IGludGVycnVwdGluZyB0aGUgaW50ZW5kZWQgcmVjZWl2ZXIuIFRoZSBzZW5kZXIgaGFzIHNvbWUgd2F5IHRvCisvLyBkZXRlcm1pbmUgd2hldGhlciB0aGUgZGF0YSBoYXMgYmVlbiByZWFkIHlldDsgYXMgc29vbiBhcyBpdCBoYXMsIGl0IG1heSBzZW5kCisvLyBtb3JlLiBUaGUgbWFpbGJveGVzIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IG9uIC1JSSBhbmQgLUlJRVggcHJvZHVjdHMsIGFzCisvLyBzdWdnZXN0ZWQgYmVsb3cuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVhZDogU3RhdHVzIFJlZ2lzdGVyIGZvciBJbnRlbGxpUG9ydC1JSSBvciAtSUlFWAorLy8gVGhlIHByZXNlbmNlIG9mIGFueSBiaXQgc2V0IGhlcmUgd2lsbCBjYXVzZSBhbiBpbnRlcnJ1cHQgdG8gdGhlIGhvc3QsCisvLyBwcm92aWRlZCB0aGUgY29ycmVzcG9uZGluZyBiaXQgaGFzIGJlZW4gdW5tYXNrZWQgaW4gdGhlIGludGVycnVwdCBtYXNrCisvLyByZWdpc3Rlci4gRnVydGhlcm1vcmUsIGludGVycnVwdHMgdG8gdGhlIGhvc3QgYXJlIGRpc2FibGVkIGdsb2JhbGx5IHVudGlsIHRoZQorLy8gbG9hZHdhcmUgc2VsZWN0cyB0aGUgaXJxIGxpbmUgdG8gdXNlLiBXaXRoIHRoZSBleGNlcHRpb24gb2YgU1ROX01SLCB0aGUgYml0cworLy8gcmVtYWluIHNldCBzbyBsb25nIGFzIHRoZSBhc3NvY2lhdGVkIGNvbmRpdGlvbiBpcyB0cnVlLgorLy8KKyNkZWZpbmUgRklGT19TVEFUVVMgMgorCisvLyBCaXQgbWFwIG9mIHN0YXR1cyBiaXRzIHdoaWNoIGFyZSBpZGVudGljYWwgZm9yIC1JSSBhbmQgLUlJRVgKKy8vCisjZGVmaW5lIFNUX09VVF9GVUxMICAweDQwICAvLyBPdXRib3VuZCBGSUZPIGZ1bGwKKyNkZWZpbmUgU1RfSU5fRU1QVFkgIDB4MjAgIC8vIEluYm91bmQgRklGTyBlbXB0eQorI2RlZmluZSBTVF9JTl9NQUlMICAgMHgwNCAgLy8gSW5ib3VuZCBNYWlsYm94IGZ1bGwKKworLy8gVGhlIGZvbGxvd2luZyBleGlzdHMgb25seSBvbiB0aGUgSW50ZWxsaXBvcnQtSUlFWCwgYW5kIGluZGljYXRlcyB0aGF0IHRoZQorLy8gYm9hcmQgaGFzIG5vdCByZWFkIHRoZSBsYXN0IG91dGdvaW5nIG1haWxib3ggZGF0YSB5ZXQuIEluIHRoZSBJbnRlbGxpUG9ydC1JSSwKKy8vIHRoZSBvdXRnb2luZyBtYWlsYm94IG1heSBiZSByZWFkIGJhY2s6IGEgemVybyBpbmRpY2F0ZXMgdGhlIGJvYXJkIGhhcyByZWFkCisvLyB0aGUgZGF0YS4KKy8vCisjZGVmaW5lIFNURV9PVVRfTUFJTCAweDgwICAvLyBPdXRib3VuZCBtYWlsYm94IGZ1bGwgKCEpCisKKy8vIFRoZSBmb2xsb3dpbmcgYml0cyBhcmUgZGVmaW5lZCBkaWZmZXJlbnRseSBmb3IgLUlJIGFuZCAtSUlFWCBib2FyZHMuIENvZGUKKy8vIHdoaWNoIHJlbGllcyBvbiB0aGVzZSBiaXRzIHdpbGwgbmVlZCB0byBiZSBmdW5jdGlvbmFsbHkgZGlmZmVyZW50IGZvciB0aGUgdHdvCisvLyB0eXBlcyBvZiBib2FyZHMgYW5kIHNob3VsZCBiZSBnZW5lcmFsbHkgYXZvaWRlZCBiZWNhdXNlIG9mIHRoZSBhZGRpdGlvbmFsCisvLyBjb21wbGV4aXR5IHRoaXMgY3JlYXRlczoKKworLy8gQml0IG1hcCBvZiBzdGF0dXMgYml0cyBvbmx5IG9uIC1JSQorCisvLyBGaWZvIGhhcyBiZWVuIFJFU0VUIChjbGVhcmVkIHdoZW4gdGhlIHN0YXR1cyByZWdpc3RlciBpcyByZWFkKS4gTm90ZSB0aGF0CisvLyB0aGlzIGNvbmRpdGlvbiBjYW5ub3QgYmUgbWFza2VkIGFuZCB3b3VsZCBhbHdheXMgaW50ZXJydXB0IHRoZSBob3N0LCBleGNlcHQKKy8vIHRoYXQgdGhlIGhhcmR3YXJlIHJlc2V0IGFsc28gZGlzYWJsZXMgaW50ZXJydXB0cyBnbG9iYWxseSBmcm9tIHRoZSBib2FyZAorLy8gdW50aWwgcmUtZW5hYmxlZCBieSBsb2Fkd2FyZS4gVGhpcyBjb3VsZCBhbHNvIGFyaXNlIGZyb20gdGhlCisvLyBBbTQ3MDEtc3VwcG9ydGVkIGNvbW1hbmQgdG8gcmVzZXQgdGhlIGNoaXAsIGJ1dCB0aGlzIGNvbW1hbmQgaXMgZ2VuZXJhbGx5IG5vdAorLy8gdXNlZCBoZXJlLgorLy8KKyNkZWZpbmUgU1ROX01SICAgICAgIDB4ODAKKworLy8gU2VlIHRoZSBBTUQgQW00NzAxIGRhdGEgc2hlZXQgZm9yIGRldGFpbHMgb24gdGhlIGZvbGxvd2luZyBmb3VyIGJpdHMuIFRoZXkKKy8vIGFyZSBub3QgcHJlc2VudGx5IHVzZWQgYnkgQ29tcHV0b25lIGRyaXZlcnMuCisvLworI2RlZmluZSBTVE5fT1VUX0FGICAweDEwICAvLyBPdXRib3VuZCBGSUZPIGFsbW9zdCBmdWxsIChwcm9ncmFtbWFibGUpCisjZGVmaW5lIFNUTl9JTl9BRSAgIDB4MDggIC8vIEluYm91bmQgRklGTyBhbG1vc3QgZW1wdHkgKHByb2dyYW1tYWJsZSkKKyNkZWZpbmUgU1ROX0JEICAgICAgMHgwMiAgLy8gSW5ib3VuZCBieXRlIGRldGVjdGVkCisjZGVmaW5lIFNUTl9QRSAgICAgIDB4MDEgIC8vIFBhcml0eS9GcmFtaW5nIGNvbmRpdGlvbiBkZXRlY3RlZAorCisvLyBCaXQtbWFwIG9mIHN0YXR1cyBiaXRzIG9ubHkgb24gLUlJRVgKKy8vCisjZGVmaW5lIFNURV9PVVRfSEYgIDB4MTAgIC8vIE91dGJvdW5kIEZJRk8gaGFsZiBmdWxsCisjZGVmaW5lIFNURV9JTl9IRiAgIDB4MDggIC8vIEluYm91bmQgRklGTyBoYWxmIGZ1bGwKKyNkZWZpbmUgU1RFX0lOX0ZVTEwgMHgwMiAgLy8gSW5ib3VuZCBGSUZPIGZ1bGwKKyNkZWZpbmUgU1RFX09VVF9NVCAgMHgwMSAgLy8gT3V0Ym91bmQgRklGTyBlbXB0eQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBJbnRlbGxpcG9ydC1JSSAtLSBXcml0ZSBPbmx5OiB0aGUgcG9pbnRlciByZWdpc3Rlci4KKy8vIFZhbHVlcyBhcmUgd3JpdHRlbiB0byB0aGlzIHJlZ2lzdGVyIHRvIHNlbGVjdCB0aGUgQW00NzAxIGludGVybmFsIHJlZ2lzdGVyIHRvCisvLyBiZSBhY2Nlc3NlZCBvbiB0aGUgbmV4dCBvcGVyYXRpb24uCisvLworI2RlZmluZSBGSUZPX1BUUiAgICAweDAyCisKKy8vIFZhbHVlcyBmb3IgdGhlIHBvaW50ZXIgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIFNFTF9DT01NQU5EIDB4MSAgICAvLyBTZWxlY3RzIHRoZSBBbTQ3MDEgY29tbWFuZCByZWdpc3RlcgorCisvLyBTb21lIHBvc3NpYmxlIGNvbW1hbmRzOgorLy8KKyNkZWZpbmUgU0VMX0NNRF9NUiAgMHg4MAkvLyBBbTQ3MDEgY29tbWFuZCB0byByZXNldCB0aGUgY2hpcAorI2RlZmluZSBTRUxfQ01EX1NIICAweDQwCS8vIEFtNDcwMSBjb21tYW5kIHRvIG1hcCB0aGUgIm90aGVyIiBwb3J0IGludG8gdGhlCisJCQkJCQkJLy8gc3RhdHVzIHJlZ2lzdGVyLgorI2RlZmluZSBTRUxfQ01EX1VOU0ggICAwCS8vIEFtNDcwMSBjb21tYW5kIHRvICJ1bnNoaWZ0IjogcG9ydCBtYXBzIGludG8gaXRzCisJCQkJCQkJLy8gb3duIHN0YXR1cyByZWdpc3Rlci4KKyNkZWZpbmUgU0VMX01BU0sgICAgIDB4MgkvLyBTZWxlY3RzIHRoZSBBbTQ3MDEgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIuIFRoZQorCQkJCQkJCS8vIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyIGlzIGJpdC1tYXBwZWQgdG8gbWF0Y2ggCisJCQkJCQkJLy8gdGhlIHN0YXR1cyByZWdpc3RlciAoRklGT19TVEFUVVMpIGV4Y2VwdCBmb3IKKwkJCQkJCQkvLyBTVE5fTVIuIChTZWUgYWJvdmUuKQorI2RlZmluZSBTRUxfQllURV9ERVQgMHgzCS8vIFNlbGVjdHMgdGhlIEFtNDcwMSBieXRlLWRldGVjdCByZWdpc3Rlci4gKE5vdAorCQkJCQkJCS8vIG5vcm1hbGx5IHVzZWQgZXhjZXB0IGluIGRpYWdub3N0aWNzLikKKyNkZWZpbmUgU0VMX09VVE1BSUwgIDB4NAkvLyBTZWxlY3RzIHRoZSBvdXRib3VuZCBtYWlsYm94IChSL1cpLiBSZWFkaW5nIGJhY2sKKwkJCQkJCQkvLyBhIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIG1haWxib3ggaGFzCisJCQkJCQkJLy8gYmVlbiByZWFkIGJ5IHRoZSBib2FyZCBhbmQgaXMgYXZhaWxhYmxlIGZvciBtb3JlCisJCQkJCQkJLy8gZGF0YS4vIFdyaXRpbmcgdG8gdGhlIG1haWxib3ggb3B0aW9uYWxseQorCQkJCQkJCS8vIGludGVycnVwdHMgdGhlIGJvYXJkLCBkZXBlbmRpbmcgb24gdGhlIGxvYWR3YXJlJ3MKKwkJCQkJCQkvLyBzZXR0aW5nIG9mIGl0cyBpbnRlcnJ1cHQgbWFzayByZWdpc3Rlci4KKyNkZWZpbmUgU0VMX0FFQUYgICAgIDB4NQkvLyBTZWxlY3RzIEFFL0FGIHRocmVzaG9sZCByZWdpc3Rlci4KKyNkZWZpbmUgU0VMX0lOTUFJTCAgIDB4NgkvLyBTZWxlY3RzIHRoZSBpbmJvdW5kIG1haWxib3ggKFJlYWQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRlbGxpUG9ydC1JSUVYIC0tICBXcml0ZSBPbmx5OiBpbnRlcnJ1cHQgbWFzayAoYW5kIG1pc2MgZmxhZ3MpIHJlZ2lzdGVyOgorLy8gVW5saWtlIEludGVsbGlQb3J0LUlJLCBiaXQgYXNzaWdubWVudHMgZG8gTk9UIG1hdGNoIHRob3NlIG9mIHRoZSBzdGF0dXMKKy8vIHJlZ2lzdGVyLgorLy8KKyNkZWZpbmUgRklGT19NQVNLICAgIDB4MgorCisvLyBNYWlsYm94IHJlYWRiYWNrIHNlbGVjdDoKKy8vIElmIHNldCwgcmVhZHMgdG8gRklGT19NQUlMIHdpbGwgcmVhZCB0aGUgT1VUQk9VTkQgbWFpbGJveCAoaG9zdCB0byBib2FyZCkuIElmCisvLyBjbGVhciAoZGVmYXVsdCBvbiByZXNldCkgcmVhZHMgdG8gRklGT19NQUlMIHdpbGwgcmVhZCB0aGUgSU5CT1VORCBtYWlsYm94LgorLy8gVGhpcyBpcyB0aGUgbm9ybWFsIHNpdHVhdGlvbi4gVGhlIGNsZWFyaW5nIG9mIGEgbWFpbGJveCBpcyBkZXRlcm1pbmVkIG9uCisvLyAtSUlFWCBib2FyZHMgYnkgd2FpdGluZyBmb3IgdGhlIFNURV9PVVRfTUFJTCBiaXQgdG8gY2xlYXIuIFJlYWRiYWNrCisvLyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzIG9ubHkuCisvLworI2RlZmluZSAgTVhfT1VUTUFJTF9SU0VMICAgMHg4MAorCisjZGVmaW5lICBNWF9JTl9NQUlMICAweDQwCS8vIEVuYWJsZXMgaW50ZXJydXB0cyB3aGVuIGluY29taW5nIG1haWxib3ggZ29lcworCQkJCQkJCS8vIGZ1bGwgKFNUX0lOX01BSUwgc2V0KS4KKyNkZWZpbmUgIE1YX0lOX0ZVTEwgIDB4MjAJLy8gRW5hYmxlcyBpbnRlcnJ1cHRzIHdoZW4gaW5jb21pbmcgRklGTyBnb2VzIGZ1bGwKKwkJCQkJCQkvLyAoU1RFX0lOX0ZVTEwpLgorI2RlZmluZSAgTVhfSU5fTVQgICAgMHgwOAkvLyBFbmFibGVzIGludGVycnVwdHMgd2hlbiBpbmNvbWluZyBGSUZPIGdvZXMgZW1wdHkKKwkJCQkJCQkvLyAoU1RfSU5fTVQpLgorI2RlZmluZSAgTVhfT1VUX0ZVTEwgMHgwNAkvLyBFbmFibGVzIGludGVycnVwdHMgd2hlbiBvdXRnb2luZyBGSUZPIGdvZXMgZnVsbAorCQkJCQkJCS8vIChTVF9PVVRfRlVMTCkuCisjZGVmaW5lICBNWF9PVVRfTVQgICAweDAxCS8vIEVuYWJsZXMgaW50ZXJydXB0cyB3aGVuIG91dGdvaW5nIEZJRk8gZ29lcyBlbXB0eQorCQkJCQkJCS8vIChTVEVfT1VUX01UKS4KKworLy8gQW55IHJlbWFpbmluZyBiaXRzIGFyZSByZXNlcnZlZCwgYW5kIHNob3VsZCBiZSB3cml0dGVuIHRvIFpFUk8gZm9yCisvLyBjb21wYXRpYmlsaXR5IHdpdGggZnV0dXJlIENvbXB1dG9uZSBwcm9kdWN0cy4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVsbGlQb3J0LUlJRVg6IC0tIFRoZXNlIGFyZSBvbmx5IDYtYml0IG1haWxib3hlcyAhISEgLS0gMTExMTExMDAgKGxvdyB0d28KKy8vIGJpdHMgYWx3YXlzIHJlYWQgYmFjayAwKS4KKy8vIFJlYWQ6ICBPbmUgb2YgdGhlIG1haWxib3hlcywgdXN1YWxseSBJbmJvdW5kLgorLy8gICAgICAgIEluYm91bmQgTWFpbGJveCAoTVhfT1VUTUFJTF9SU0VMID0gMCkKKy8vICAgICAgICBPdXRib3VuZCBNYWlsYm94IChNWF9PVVRNQUlMX1JTRUwgPSAxKQorLy8gV3JpdGU6IE91dGJvdW5kIE1haWxib3gKKy8vIEZvciB0aGUgSW50ZWxsaVBvcnQtSUkgYm9hcmRzLCB0aGUgb3V0Ym91bmQgbWFpbGJveCBpcyByZWFkIGJhY2sgdG8gZGV0ZXJtaW5lCisvLyB3aGV0aGVyIHRoZSBib2FyZCBoYXMgcmVhZCB0aGUgZGF0YSAoMCAtLT4gZGF0YSBoYXMgYmVlbiByZWFkKS4gRm9yIHRoZQorLy8gSW50ZWxsaVBvcnQtSUlFWCwgdGhpcyBpcyBkb25lIGJ5IHJlYWRpbmcgYSBzdGF0dXMgcmVnaXN0ZXIuIFRvIGRldGVybWluZQorLy8gd2hldGhlciBtYWlsYm94IGlzIGF2YWlsYWJsZSBmb3IgbW9yZSBvdXRib3VuZCBkYXRhLCB1c2UgdGhlIFNURV9PVVRfTUFJTCBiaXQKKy8vIGluIEZJRk9fU1RBVFVTLiBNb3Jlb3ZlciwgYWx0aG91Z2ggdGhlIE91dGJvdW5kIE1haWxib3ggY2FuIGJlIHJlYWQgYmFjayBieQorLy8gc2V0dGluZyBNWF9PVVRNQUlMX1JTRUwsIGl0IGlzIE5PVCBjbGVhcmVkIHdoZW4gdGhlIGJvYXJkIHJlYWRzIGl0LCBhcyBpcyB0aGUKKy8vIGNhc2Ugd2l0aCB0aGUgLUlJIGJvYXJkcy4gRm9yIHRoaXMgcmVhc29uLCBGSUZPX01BSUwgaXMgbm9ybWFsbHkgdXNlZCB0byByZWFkCisvLyB0aGUgaW5ib3VuZCBGSUZPLCBhbmQgTVhfT1VUTUFJTF9SU0VMIGtlcHQgY2xlYXIuIChTZWUgYWJvdmUgZm9yCisvLyBNWF9PVVRNQUlMX1JTRUwgZGVzY3JpcHRpb24uKQorLy8KKyNkZWZpbmUgIEZJRk9fTUFJTCAgIDB4MworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV1JJVEUgT05MWTogIFJlc2V0cyB0aGUgYm9hcmQuIChEYXRhIGRvZXNuJ3QgbWF0dGVyKS4KKy8vCisjZGVmaW5lICBGSUZPX1JFU0VUICAweDcKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJFQUQgT05MWTogIFdpbGwgaGF2ZSBubyBlZmZlY3QuIChEYXRhIGlzIHVuZGVmaW5lZC4pCisvLyBBY3R1YWxseSwgdGhlcmUgd2lsbCBiZSBhbiBlZmZlY3QsIGluIHRoYXQgdGhlIG9wZXJhdGlvbiBpcyBzdXJlIHRvIGdlbmVyYXRlCisvLyBhIGJ1cyBjeWNsZTogdml6LiwgYW4gSS9PIGJ5dGUgUmVhZC4gVGhpcyBmYWN0IGNhbiBiZSB1c2VkIHRvIGVuZm9yY2Ugc2hvcnQKKy8vIGRlbGF5cyB3aGVuIG5vIGNvbXBhcmFibGUgdGltZSBjb25zdGFudCBpcyBhdmFpbGFibGUuCisvLworI2RlZmluZSAgRklGT19OT1AgICAgMHg3CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSRVNFVCAmIFBPV0VSLU9OIFJFU0VUIE1FU1NBR0UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSRVNFVDoKKworVGhlIEludGVsbGlQb3J0LUlJIGFuZCAtSUlFWCBib2FyZHMgYXJlIHJlc2V0IGluIHRocmVlIHdheXM6IFBvd2VyLXVwLCBjaGFubmVsCityZXNldCwgYW5kIHZpYSBhIHdyaXRlIHRvIHRoZSByZXNldCByZWdpc3RlciBkZXNjcmliZWQgYWJvdmUuIEZvciBwcm9kdWN0cyB1c2luZwordGhlIElTQSBidXMsIHRoZXNlIHRocmVlIHNvdXJjZXMgb2YgcmVzZXQgYXJlIGVxdXZhbGVudC4gRm9yIE1DQSBhbmQgRUlTQSBidXNlcywKK3RoZSBQb3dlci11cCBhbmQgY2hhbm5lbCByZXNldCBzb3VyY2VzIGNhdXNlIGFkZGl0aW9uYWwgaGFyZHdhcmUgaW5pdGlhbGl6YXRpb24KK3doaWNoIHNob3VsZCBvbmx5IG9jY3VyIGF0IHN5c3RlbSBzdGFydHVwIHRpbWUuCisKK1RoZSB0aGlyZCB0eXBlIG9mIHJlc2V0LCBjYWxsZWQgYSAiY29tbWFuZCByZXNldCIsIGlzIGRvbmUgYnkgd3JpdGluZyBhbnkgZGF0YQordG8gdGhlIEZJRk9fUkVTRVQgYWRkcmVzcyBkZXNjcmliZWQgYWJvdmUuIFRoaXMgcmVzZXRzIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IsCitGSUZPLCBVQVJUUywgYW5kIGFzc29jaWF0ZWQgaGFyZHdhcmUuCisKK1RoaXMgcGFzc2VzIGNvbnRyb2wgb2YgdGhlIGJvYXJkIHRvIHRoZSBib290c3RyYXAgZmlybXdhcmUsIHdoaWNoIHBlcmZvcm1zIGEKK1Bvd2VyLU9uIFNlbGYgVGVzdCBhbmQgd2hpY2ggZGV0ZWN0cyBpdHMgY3VycmVudCBjb25maWd1cmF0aW9uLiBGb3IgZXhhbXBsZSwKKy1JSUVYIHByb2R1Y3RzIGRldGVybWluZSB0aGUgc2l6ZSBvZiBGSUZPIHdoaWNoIGhhcyBiZWVuIGluc3RhbGxlZCwgYW5kIHRoZQorbnVtYmVyIGFuZCB0eXBlIG9mIGV4cGFuc2lvbiBib3hlcyBhdHRhY2hlZC4KKworVGhpcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gaXMgdGhlbiB3cml0dGVuIHRvIHRoZSBGSUZPIGluIGEgMTYtYnl0ZSBkYXRhIGJsb2NrCit0byBiZSByZWFkIGJ5IHRoZSBob3N0LiBUaGlzIGJsb2NrIGlzIGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VudCB3aXRoaW4gdHdvICgyKQorc2Vjb25kcyBvZiBoYXZpbmcgcmVjZWl2ZWQgdGhlIGNvbW1hbmQgcmVzZXQuIFRoZSBmaXJtd2FyZSBpcyBub3cgcmVhZHkgdG8KK3JlY2VpdmUgbG9hZHdhcmUgZnJvbSB0aGUgaG9zdC4KKworSXQgaXMgZ29vZCBwcmFjdGljZSB0byBwZXJmb3JtIGEgY29tbWFuZCByZXNldCB0byB0aGUgYm9hcmQgZXhwbGljaXRseSBhcyBwYXJ0CitvZiB5b3VyIHNvZnR3YXJlIGluaXRpYWxpemF0aW9uLiAgVGhpcyBhbGxvd3MgeW91ciBjb2RlIHRvIHByb3Blcmx5IHJlc3RhcnQgZnJvbQorYSBzb2Z0IGJvb3QuIChNYW55IHN5c3RlbXMgZG8gbm90IGlzc3VlIGNoYW5uZWwgcmVzZXQgb24gc29mdCBib290KS4KKworQmVjYXVzZSBvZiBhIGhhcmR3YXJlIHJlc2V0IHByb2JsZW0gb24gc29tZSBvZiB0aGUgQ2lycnVzIExvZ2ljIDE0MDAncyB3aGljaCBhcmUKK3VzZWQgb24gdGhlIHByb2R1Y3QsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHJlc2V0IHRoZSBib2FyZCB0d2ljZSwgc2VwYXJhdGVkCitieSBhbiBhcHByb3hpbWF0ZWx5IDUwIG1pbGxpc2Vjb25kcyBkZWxheS4gKFZFUlkgYXBwcm94aW1hdGVseTogcHJvYmFibHkgb2sgdG8KK2JlIG9mZiBieSBhIGZhY3RvciBvZiBmaXZlLiBUaGUgaW1wb3J0YW50IHBvaW50IGlzIHRoYXQgdGhlIGZpcnN0IGNvbW1hbmQgcmVzZXQKK2luIGZhY3QgZ2VuZXJhdGVzIGEgcmVzZXQgcHVsc2Ugb24gdGhlIGJvYXJkLiBUaGlzIHB1bHNlIGlzIGd1YXJhbnRlZWQgdG8gbGFzdAorbGVzcyB0aGFuIDEwIG1pbGxpc2Vjb25kcy4gVGhlIGFkZGl0aW9uYWwgZGVsYXkgZW5zdXJlcyB0aGUgMTQwMCBoYXMgaGFkIHRoZQorY2hhbmNlIHRvIHJlc3BvbmQgc3VmZmljaWVudGx5IHRvIHRoZSBmaXJzdCByZXNldC4gV2h5IG5vdCBhIGxvbmdlciBkZWxheT8gTXVjaAorbW9yZSB0aGFuIDUwIG1pbGxpc2Vjb25kcyBnZXRzIHRvIGJlIG5vdGljYWJsZSwgYnV0IHRoZSBib2FyZCB3b3VsZCBzdGlsbCB3b3JrLgorCitPbmNlIGFsbCAxNiBieXRlcyBvZiB0aGUgUG93ZXItb24gUmVzZXQgTWVzc2FnZSBoYXZlIGJlZW4gcmVhZCwgdGhlIGJvb3RzdHJhcAorZmlybXdhcmUgaXMgcmVhZHkgdG8gcmVjZWl2ZSBsb2Fkd2FyZS4KKworTm90ZSBvbiBQb3dlci1vbiBSZXNldCBNZXNzYWdlIGZvcm1hdDoKK1RoZSB2YXJpb3VzIGZpZWxkcyBoYXZlIGJlZW4gZGVzaWduZWQgd2l0aCBmdXR1cmUgZXhwYW5zaW9uIGluIHZpZXcuCitDb21iaW5hdGlvbnMgb2YgYml0ZmllbGRzIGFuZCB2YWx1ZXMgaGF2ZSBiZWVuIGRlZmluZWQgd2hpY2ggZGVmaW5lIHByb2R1Y3RzCit3aGljaCBtYXkgbm90IGN1cnJlbnRseSBleGlzdC4gVGhpcyBoYXMgYmVlbiBkb25lIHRvIGFsbG93IGRyaXZlcnMgdG8gYW50aWNpcGF0ZQordGhlIHBvc3NpYmxlIGludHJvZHVjdGlvbiBvZiBwcm9kdWN0cyBpbiBhIHN5c3RlbWF0aWMgZmFzaGlvbi4gVGhpcyBpcyBub3QKK2ludGVuZGVkIHRvIHN1Z2dlc3QgdGhhdCBlYWNoIHBvdGVudGlhbCBwcm9kdWN0IGlzIGFjdHVhbGx5IHVuZGVyIGNvbnNpZGVyYXRpb24uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZvcm1hdCBvZiBQb3dlci1vbiBSZXNldCBNZXNzYWdlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB1bmlvbiBfcG9yU3RyCQkvLyAicG9yIiBzdGFuZHMgZm9yIFBvd2VyIE9uIFJlc2V0Cit7CisJdW5zaWduZWQgY2hhciAgY1sxNl07CS8vIGFycmF5IHVzZWQgd2hlbiBjb25zaWRlcmluZyB0aGUgbWVzc2FnZSBhcyBhCisJCQkJCQkJLy8gc3RyaW5nIG9mIHVuZGlmZmVyZW50aWF0ZWQgY2hhcmFjdGVycworCisJc3RydWN0CQkJCQkvLyBFbGVtZW50cyB1c2VkIHdoZW4gY29uc2lkZXJpbmcgdmFsdWVzCisJeworCQkvLyBUaGUgZmlyc3QgdHdvIGJ5dGVzIG91dCBvZiB0aGUgRklGTyBhcmUgdHdvIG1hZ2ljIG51bWJlcnMuIFRoZXNlIGFyZQorCQkvLyBpbnRlbmRlZCB0byBlc3RhYmxpc2ggdGhhdCB0aGVyZSBpcyBpbmRlZWQgYSBtZW1iZXIgb2YgdGhlCisJCS8vIEludGVsbGlQb3J0LUlJKEVYKSBmYW1pbHkgcHJlc2VudC4gVGhlIHJlbWFpbmluZyBieXRlcyBtYXkgYmUgCisJCS8vIGV4cGVjdGVkIC8vIHRvIGJlIHZhbGlkLiBXaGVuIHJlYWRpbmcgdGhlIFBvd2VyLW9uIFJlc2V0IG1lc3NhZ2UsIAorCQkvLyBpZiB0aGUgbWFnaWMgbnVtYmVycyBkbyBub3QgbWF0Y2ggaXQgaXMgcHJvYmFibHkgYmVzdCB0byBzdG9wCisJCS8vIHJlYWRpbmcgaW1tZWRpYXRlbHkuIFlvdSBhcmUgY2VydGFpbmx5IG5vdCByZWFkaW5nIG91ciBib2FyZCAodW5sZXNzCisJCS8vIGhhcmR3YXJlIGlzIGZhdWx0eSksIGFuZCBtYXkgaW4gZmFjdCBiZSByZWFkaW5nIHNvbWUgb3RoZXIgcGllY2Ugb2YKKwkJLy8gaGFyZHdhcmUuCisKKwkJdW5zaWduZWQgY2hhciBwb3JNYWdpYzE7ICAgLy8gbWFnaWMgbnVtYmVyOiBmaXJzdCBieXRlID09IFBPUl9NQUdJQ18xIAorCQl1bnNpZ25lZCBjaGFyIHBvck1hZ2ljMjsgICAvLyBtYWdpYyBudW1iZXI6IHNlY29uZCBieXRlID09IFBPUl9NQUdJQ18yIAorCisJCS8vIFRoZSBWZXJzaW9uLCBSZXZpc2lvbiwgYW5kIFN1YnJldmlzaW9uIGFyZSBzdG9yZWQgYXMgYWJzb2x1dGUgbnVtYmVycworCQkvLyBhbmQgd291bGQgbm9ybWFsbHkgYmUgZGlzcGxheWVkIGluIHRoZSBmb3JtYXQgVi5SLlMgKGUuZy4gMS4wLjIpCisKKwkJdW5zaWduZWQgY2hhciBwb3JWZXJzaW9uOyAgLy8gQm9vdHN0cmFwIGZpcm13YXJlIHZlcnNpb24gbnVtYmVyCisJCXVuc2lnbmVkIGNoYXIgcG9yUmV2aXNpb247IC8vIEJvb3RzdHJhcCBmaXJtd2FyZSByZXZpc2lvbiBudW1iZXIKKwkJdW5zaWduZWQgY2hhciBwb3JTdWJSZXY7ICAgLy8gQm9vdHN0cmFwIGZpcm13YXJlIHN1Yi1yZXZpc2lvbiBudW1iZXIKKworCQl1bnNpZ25lZCBjaGFyIHBvcklEOwkvLyBQcm9kdWN0IElEOiAgQml0LW1hcHBlZCBhY2NvcmRpbmcgdG8KKwkJCQkJCQkJLy8gY29udmVudGlvbnMgZGVzY3JpYmVkIGJlbG93LiBBbW9uZyBvdGhlcgorCQkJCQkJCQkvLyB0aGluZ3MsIHRoaXMgYWxsb3dzIHVzIHRvIGRpc3Rpbmd1aXNoCisJCQkJCQkJCS8vIEludGVsbGlQb3J0LUlJIGJvYXJkcyBmcm9tIEludGVsbGlQb3J0LUlJRVgKKwkJCQkJCQkJLy8gYm9hcmRzLgorCisJCXVuc2lnbmVkIGNoYXIgcG9yQnVzOwkvLyBJbnRlbGxpUG9ydC1JSTogVW51c2VkCisJCQkJCQkJCS8vIEludGVsbGlQb3J0LUlJRVg6IEJ1cyBJbmZvcm1hdGlvbjoKKwkJCQkJCQkJLy8gQml0LW1hcHBlZCBiZWxvdworCisJCXVuc2lnbmVkIGNoYXIgcG9yTWVtb3J5OwkvLyBPbi1ib2FyZCBEUkFNIHNpemU6IGluIDMyayBibG9ja3MKKworCQkvLyBwb3JQb3J0czEgKGFuZCBwb3JQb3J0czIpIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9ydHMgd2hpY2ggYXJlCisJCS8vIGF2YWlsYWJsZSB0byB0aGUgYm9hcmQuIEZvciBub24tZXhwYW5kYWJsZSBwcm9kdWN0LCBhIHNpbmdsZSBudW1iZXIgCisJCS8vIGlzIHN1ZmZpY2llbnQuIEZvciBleHBhbmRhYmxlIHByb2R1Y3QsIHRoZSBib2FyZCBtYXkgYmUgY29ubmVjdGVkCisJCS8vIHRvIGFzIG1hbnkgYXMgZm91ciBib3hlcy4gRWFjaCBib3ggbWF5IGJlIChzbyBmYXIpIGVpdGhlciBhIDE2LXBvcnQKKwkJLy8gb3IgYW4gOC1wb3J0IHNpemUuIFdoZW5ldmVyIGFuIDgtcG9ydCBib3ggaXMgdXNlZCwgdGhlIHJlbWFpbmluZyA4CisJCS8vIHBvcnRzIGxlYXZlIGdhcHMgYmV0d2VlbiBleGlzdGluZyBjaGFubmVscy4gRm9yIHRoYXQgcmVhc29uLAorCQkvLyBleHBhbmRhYmxlIHByb2R1Y3RzIG11c3QgcmVwb3J0IGEgTUFQIG9mIGF2YWlsYWJsZSBjaGFubmVscy4gU2luY2UgCisJCS8vIGVhY2ggVUFSVCBzdXBwb3J0cyBmb3VyIHBvcnRzLCB3ZSByZXByZXNlbnQgZWFjaCBVQVJUIGZvdW5kIGJ5IGEKKwkJLy8gc2luZ2xlIGJpdC4gVXNpbmcgdHdvIGJ5dGVzIHRvIHN1cHBseSB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiB3ZQorCQkvLyByZXBvcnQgdGhlIHByZXNlbnNlIG9yIGFic2Vuc2Ugb2YgdXAgdG8gMTYgVUFSVFMsIG9yIDY0IHBvcnRzIGluCisJCS8vIHN0ZXBzIG9mIDQgcG9ydHMuIEZvciAtSUlFWCBwcm9kdWN0cywgdGhlIHBvcnRzIGFyZSBudW1iZXJlZAorCQkvLyBzdGFydGluZyBhdCB0aGUgYm94IGNsb3Nlc3QgdG8gdGhlIGNvbnRyb2xsZXIgaW4gdGhlICJjaGFpbiIuCisKKwkJLy8gSW50ZXJwcmV0ZWQgRGlmZmVyZW50bHkgZm9yIEludGVsbGlQb3J0LUlJIGFuZCAtSUlFWC4KKwkJLy8gLUlJOiAgIE51bWJlciBvZiBwb3J0cyAoRGVyaXZlZCBhY3R1YWxseSBmcm9tIHByb2R1Y3QgSUQpLiBTZWUKKwkJLy8gRGlhZzEmMiB0byBpbmRpY2F0ZSBpZiB1YXJ0IHdhcyBhY3R1YWxseSBkZXRlY3RlZC4KKwkJLy8gLUlJRVg6IEJpdC1tYXAgb2YgVUFSVFMgZm91bmQsIExTQiAoc2VlIGJlbG93IGZvciBNU0Igb2YgdGhpcykuIFRoaXMKKwkJLy8gICAgICAgIGJpdG1hcCBpcyBiYXNlZCBvbiBkZXRlY3RpbmcgdGhlIHVhcnRzIHRoZW1zZWx2ZXM7IAorCQkvLyAgICAgICAgc2VlIHBvckZsYWdzIGZvciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBib3ggaS5kJ3MuCisJCXVuc2lnbmVkIGNoYXIgIHBvclBvcnRzMTsKKworCQl1bnNpZ25lZCBjaGFyICBwb3JEaWFnMTsJLy8gUmVzdWx0cyBvZiBvbi1ib2FyZCBQLk8uUy5ULCAxc3QgYnl0ZQorCQl1bnNpZ25lZCBjaGFyICBwb3JEaWFnMjsJLy8gUmVzdWx0cyBvZiBvbi1ib2FyZCBQLk8uUy5ULCAybmQgYnl0ZQorCQl1bnNpZ25lZCBjaGFyICBwb3JTcGVlZDsJLy8gU3BlZWQgb2YgbG9jYWwgQ1BVOiBnaXZlbiBhcyBNSHogeDEwCisJCQkJCQkJCQkvLyBlLmcuLCAxNi4wIE1IeiBDUFUgaXMgcmVwb3J0ZWQgYXMgMTYwCisJCXVuc2lnbmVkIGNoYXIgIHBvckZsYWdzOwkvLyBNaXNjIGluZm9ybWF0aW9uIChzZWUgbWFuaWZlc3RzIGJlbG93KQorCQkJCQkJCQkJLy8gQml0LW1hcHBlZDogQ1BVIHR5cGUsIFVBUlQncyBwcmVzZW50CisKKwkJdW5zaWduZWQgY2hhciAgcG9yUG9ydHMyOwkvLyAtSUk6ICBVbmRlZmluZWQKKwkJCQkJCQkJCS8vIC1JSUVYOiBCaXQtbWFwIG9mIFVBUlRTIGZvdW5kLCBNU0IgKHNlZQorCQkJCQkJCQkJLy8gICAgICAgIGFib3ZlIGZvciBMU0IpCisKKwkJLy8gSW50ZWxsaVBvcnQtSUk6IHVuZGVmaW5lZAorCQkvLyBJbnRlbGxpUG9ydC1JSUVYOiAxIDw8IHBvckZpZm9TaXplIGdpdmVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlCisJCS8vIGhvc3QgaW50ZXJmYWNlIEZJRk8sIGluIGVhY2ggZGlyZWN0aW9uLiBXaGVuIHJ1bm5pbmcgdGhlIC1JSUVYIGluCisJCS8vIDgtYml0IG1vZGUsIGZpZm8gY2FwYWNpdHkgaXMgaGFsdmVkLiBUaGUgYm9vdHN0cmFwIGZpcm13YXJlIHdpbGwKKwkJLy8gaGF2ZSBhbHJlYWR5IGFjY291bnRlZCBmb3IgdGhpcyBmYWN0IGluIGdlbmVyYXRpbmcgdGhpcyBudW1iZXIuCisJCXVuc2lnbmVkIGNoYXIgIHBvckZpZm9TaXplOworCisJCS8vIEludGVsbGlQb3J0LUlJOiB1bmRlZmluZWQKKwkJLy8gSW50ZWxsaVBvcnQtSUlFWDogVGhlIG51bWJlciBvZiBib3hlcyBjb25uZWN0ZWQuIChQcmVzZW50bHkgMS00KQorCQl1bnNpZ25lZCBjaGFyICBwb3JOdW1Cb3hlczsKKwl9IGU7Cit9IHBvclN0ciwgKnBvclN0clB0cjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmFsdWVzIGZvciBwb3JTdHIgZmllbGRzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwb3JNYWdpYzEsIHBvck1hZ2ljMgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworI2RlZmluZSAgUE9SX01BR0lDXzEgICAgMHg5NiAgLy8gVGhlIG9ubHkgdmFsaWQgdmFsdWUgZm9yIHBvck1hZ2ljMQorI2RlZmluZSAgUE9SX01BR0lDXzIgICAgMHgzNSAgLy8gVGhlIG9ubHkgdmFsaWQgdmFsdWUgZm9yIHBvck1hZ2ljMgorI2RlZmluZSAgUE9SXzFfSU5ERVggICAgMCAgICAgLy8gQnl0ZSBwb3NpdGlvbiBvZiBQT1JfTUFHSUNfMQorI2RlZmluZSAgUE9SXzJfSU5ERVggICAgMSAgICAgLy8gRGl0dG8gZm9yIFBPUl9NQUdJQ18yCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcG9ySUQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKyNkZWZpbmUgIFBPUl9JRF9GQU1JTFkgIDB4YzAJLy8gVGhlc2UgYml0cyBpbmRpY2F0ZSB0aGUgZ2VuZXJhbCBmYW1pbHkgb2YKKwkJCQkJCQkJLy8gcHJvZHVjdC4KKyNkZWZpbmUgIFBPUl9JRF9GSUkgICAgIDB4MDAJLy8gRmFtaWx5IGlzICJJbnRlbGxpUG9ydC1JSSIKKyNkZWZpbmUgIFBPUl9JRF9GSUlFWCAgIDB4NDAJLy8gRmFtaWx5IGlzICJJbnRlbGxpUG9ydC1JSUVYIgorCisvLyBUaGVzZSBiaXRzIGFyZSByZXNlcnZlZCwgcHJlc2VudGx5IHplcm8uIE1heSBiZSB1c2VkIGF0IGEgbGF0ZXIgZGF0ZSB0bworLy8gY29udmV5IG90aGVyIHByb2R1Y3QgaW5mb3JtYXRpb24uCisvLworI2RlZmluZSBQT1JfSURfUkVTRVJWRUQgMHgzYworCisjZGVmaW5lIFBPUl9JRF9TSVpFICAgICAweDAzCS8vIFJlbWFpbmluZyBiaXRzIGluZGljYXRlIG51bWJlciBvZiBwb3J0cyAmCisJCQkJCQkJCS8vIENvbm5lY3RvciBpbmZvcm1hdGlvbi4KKyNkZWZpbmUgUE9SX0lEX0lJXzggICAgIDB4MDAJLy8gRm9yIEludGVsbGlQb3J0LUlJLCBpbmRpY2F0ZXMgOC1wb3J0IHVzaW5nCisJCQkJCQkJCS8vIHN0YW5kYXJkIGJyaWNrLgorI2RlZmluZSBQT1JfSURfSUlfOFIgICAgMHgwMQkvLyBGb3IgSW50ZWxsaVBvcnQtSUksIGluZGljYXRlcyA4LXBvcnQgdXNpbmcKKwkJCQkJCQkJLy8gUkoxMSdzIChubyBDVFMpCisjZGVmaW5lIFBPUl9JRF9JSV82ICAgICAweDAyCS8vIEZvciBJbnRlbGxpUG9ydC1JSSwgaW5kaWNhdGVzIDYtcG9ydCB1c2luZworCQkJCQkJCQkvLyBSSjQ1J3MKKyNkZWZpbmUgUE9SX0lEX0lJXzQgICAgIDB4MDMJLy8gRm9yIEludGVsbGlQb3J0LUlJLCBpbmRpY2F0ZXMgNC1wb3J0IHVzaW5nCisJCQkJCQkJCS8vIDR4Uko0NSBjb25uZWN0b3JzCisjZGVmaW5lIFBPUl9JRF9FWCAgICAgICAweDAwCS8vIEZvciBJbnRlbGxpUG9ydC1JSUVYLCBpbmRpY2F0ZXMgc3RhbmRhcmQKKwkJCQkJCQkJLy8gZXhwYW5kYWJsZSBjb250cm9sbGVyIChvdGhlciB2YWx1ZXMgcmVzZXJ2ZWQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcG9yQnVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gSW50ZWxsaVBvcnQtSUlFWCBvbmx5OiBCb2FyZCBpcyBpbnN0YWxsZWQgaW4gYSAxNi1iaXQgc2xvdAorLy8KKyNkZWZpbmUgUE9SX0JVU19TTE9UMTYgIDB4MjAKKworLy8gSW50ZWxsaVBvcnQtSUlFWCBvbmx5OiBESVAgc3dpdGNoICM4IGlzIG9uLCBzZWxlY3RpbmcgMTYtYml0IGhvc3QgaW50ZXJmYWNlCisvLyBvcGVyYXRpb24uCisvLyAKKyNkZWZpbmUgUE9SX0JVU19ESVAxNiAgIDB4MTAKKworLy8gQml0cyAwLTIgaW5kaWNhdGUgdHlwZSBvZiBidXM6IFRoaXMgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBib290c3RyYXAKKy8vIGxvYWR3YXJlLCBkaWZmZXJlbnQgbG9hZHdhcmUgYmVpbmcgdXNlZCBvbiBkaWZmZXJlbnQgcHJvZHVjdHMgZm9yIGRpZmZlcmVudAorLy8gYnVzZXMuIEZvciBtb3N0IHNpdHVhdGlvbnMsIHRoZSBkcml2ZXJzIGRvIG5vdCBuZWVkIHRoaXMgaW5mb3JtYXRpb247IGJ1dCBpdAorLy8gaXMgaGFuZHkgaW4gYSBkaWFnbm9zdGljIGVudmlyb25tZW50LiBGb3IgZXhhbXBsZSwgb24gbWljcm9jaGFubmVsIGJvYXJkcywKKy8vIHlvdSB3b3VsZCBub3Qgd2FudCB0byB0cnkgdG8gdGVzdCBzZXZlcmFsIGludGVycnVwdHMsIG9ubHkgdGhlIG9uZSBmb3Igd2hpY2gKKy8vIHlvdSB3ZXJlIGNvbmZpZ3VyZWQuCisvLworI2RlZmluZSAgUE9SX0JVU19UWVBFICAgMHgwNworCisvLyBVbmtub3duOiAgdGhpcyBwcm9kdWN0IGRvZXNuJ3Qga25vdyB3aGF0IGJ1cyBpdCBpcyBydW5uaW5nIGluLiAoZS5nLiBpZiBzYW1lCisvLyBib290c3RyYXAgZmlybXdhcmUgd2VyZSB3YW50ZWQgZm9yIHR3byBkaWZmZXJlbnQgYnVzZXMuKQorLy8KKyNkZWZpbmUgIFBPUl9CVVNfVF9VTksgIDAKKworLy8gTm90ZTogZXhpc3RpbmcgZmlybXdhcmUgZm9yIElTQS04IGFuZCBNQy04IGN1cnJlbnRseSByZXBvcnQgdGhlIFBPUl9CVVNfVF9VTksKKy8vIHN0YXRlLCBzaW5jZSB0aGUgc2FtZSBib290c3RyYXAgZmlybXdhcmUgaXMgdXNlZCBmb3IgZWFjaC4KKworI2RlZmluZSAgUE9SX0JVU19UX01DQSAgMSAgLy8gTUNBIEJVUyAqLworI2RlZmluZSAgUE9SX0JVU19UX0VJU0EgMiAgLy8gRUlTQSBCVVMgKi8KKyNkZWZpbmUgIFBPUl9CVVNfVF9JU0EgIDMgIC8vIElTQSBCVVMgKi8KKworLy8gVmFsdWVzIDQtNyBSZXNlcnZlZAorCisvLyBSZW1haW5pbmcgYml0cyBhcmUgcmVzZXJ2ZWQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwb3JEaWFnMQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgIFBPUl9CQURfTUFQUEVSIDB4ODAJLy8gSFcgZmFpbHVyZSBvbiBQLk8uUy5UOiBDaGlwIG1hcHBlciBmYWlsZWQKKworLy8gVGhlc2UgdHdvIGJpdHMgdmFsaWQgb25seSBmb3IgdGhlIEludGVsbGlQb3J0LUlJCisvLworI2RlZmluZSAgUE9SX0JBRF9VQVJUMSAgMHgwMQkvLyBGaXJzdCAgMTQwMCBiYWQKKyNkZWZpbmUgIFBPUl9CQURfVUFSVDIgIDB4MDIJLy8gU2Vjb25kIDE0MDAgYmFkCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcG9yRGlhZzIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lICBQT1JfREVCVUdfUE9SVCAweDgwCS8vIGRlYnVnIHBvcnQgd2FzIGRldGVjdGVkIGJ5IHRoZSBQLk8uUy5UCisjZGVmaW5lICBQT1JfRElBR19PSyAgICAweDAwCS8vIEluZGljYXRlcyBwYXNzYWdlOiBGYWlsdXJlIGNvZGVzIG5vdCB5ZXQKKwkJCQkJCQkJLy8gYXZhaWxhYmxlLgorCQkJCQkJCQkvLyBPdGhlciBiaXRzIHVuZGVmaW5lZC4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcG9yRmxhZ3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lICBQT1JfQ1BVICAgICAweDAzCS8vIFRoZXNlIGJpdHMgaW5kaWNhdGUgc3VwcG9zZWQgQ1BVIHR5cGUKKyNkZWZpbmUgIFBPUl9DUFVfOCAgIDB4MDEJLy8gQm9hcmQgdXNlcyBhbiA4MDE4OCAobm8gc3VjaCB0aGluZyB5ZXQpCisjZGVmaW5lICBQT1JfQ1BVXzYgICAweDAyCS8vIEJvYXJkIHVzZXMgYW4gODAxODYgKGFsbCBleGlzdGluZyBwcm9kdWN0cykKKyNkZWZpbmUgIFBPUl9DRVg0ICAgIDB4MDQJLy8gSWYgc2V0LCB0aGlzIGlzIGFuIElTQS1DRVgvNDogQW4gSVNBLTQgKGFzaWMpCisJCQkJCQkJLy8gd2hpY2ggaXMgYXJjaGl0ZWN0ZWQgbGlrZSBhbiBJU0EtQ0VYIGNvbm5lY3RlZAorCQkJCQkJCS8vIHRvIGEgKGhpdGhlcnRvIGltcG9zc2libGUpIDQtcG9ydCBib3guCisjZGVmaW5lIFBPUl9CT1hFUyAgICAweGYwCS8vIFZhbGlkIGZvciBJbnRlbGxpUG9ydC1JSUVYIG9ubHk6IE1hcCBvZiBCb3gKKwkJCQkJCQkvLyBzaXplcyBiYXNlZCBvbiBib3ggSS5ELgorI2RlZmluZSBQT1JfQk9YXzE2ICAgMHgxMAkvLyBTZXQgaW5kaWNhdGVzIDE2LXBvcnQsIGNsZWFyIDgtcG9ydAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExPQURXQVJFIGFuZCBET1dOTE9BRElORyBDT0RFCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKK0xvYWR3YXJlIG1heSBiZSBzZW50IHRvIHRoZSBib2FyZCBpbiB0d28gd2F5czoKKzEpIEl0IG1heSBiZSByZWFkIGZyb20gYSAoYmluYXJ5IGltYWdlKSBkYXRhIGZpbGUgYmxvY2sgYnkgYmxvY2sgYXMgZWFjaCBibG9jaworCWlzIHNlbnQgdG8gdGhlIGJvYXJkLiBUaGlzIGlzIG9ubHkgcG9zc2libGUgd2hlbiB0aGUgaW5pdGlhbGl6YXRpb24gaXMKKwlwZXJmb3JtZWQgYnkgY29kZSB3aGljaCBjYW4gYWNjZXNzIHlvdXIgZmlsZSBzeXN0ZW0uIFRoaXMgaXMgbW9zdCBzdWl0YWJsZQorCWZvciBkaWFnbm9zdGljcyBhbmQgYXBwaWNhdGlvbnMgd2hpY2ggdXNlIHRoZSBpbnRlcmZhY2UgbGlicmFyeSBkaXJlY3RseS4KKworMikgSXQgbWF5IGJlIGhhcmQtY29kZWQgaW50byB5b3VyIHNvdXJjZSBieSBpbmNsdWRpbmcgYSAuaCBmaWxlICh0eXBpY2FsbHkKKwlzdXBwbGllZCBieSBDb21wdXRvbmUpLCB3aGljaCBkZWNsYXJlcyBhIGRhdGEgYXJyYXkgYW5kIGluaXRpYWxpemVzIGV2ZXJ5CisJZWxlbWVudC4gVGhpcyBhY2hlaXZlcyB0aGUgc2FtZSByZXN1bHQgYXMgaWYgYW4gZW50aXJlIGxvYWR3YXJlIGZpbGUgaGFkIAorCWJlZW4gcmVhZCBpbnRvIHRoZSBhcnJheS4KKworCVRoaXMgcmVxdWlyZXMgbW9yZSBkYXRhIHNwYWNlIGluIHlvdXIgcHJvZ3JhbSwgYnV0IGFjY2VzcyB0byB0aGUgZmlsZSBzeXN0ZW0KKwlpcyBub3QgcmVxdWlyZWQuIFRoaXMgbWV0aG9kIGlzIG1vcmUgc3VpdGVkIHRvIGRyaXZlciBjb2RlLCB3aGljaCB0eXBpY2FsbHkKKwlpcyBydW5uaW5nIGF0IGEgbGV2ZWwgdG9vIGxvdyB0byBhY2Nlc3MgdGhlIGZpbGUgc3lzdGVtIGRpcmVjdGx5LgorCitBdCBwcmVzZW50LCBsb2Fkd2FyZSBjYW4gb25seSBiZSBnZW5lcmF0ZWQgYXQgQ29tcHV0b25lLgorCitBbGwgTG9hZHdhcmUgYmVnaW5zIHdpdGggYSBoZWFkZXIgYXJlYSB3aGljaCBoYXMgYSBwYXJ0aWN1bGFyIGZvcm1hdC4gVGhpcworaW5jbHVkZXMgYSBtYWdpYyBudW1iZXIgd2hpY2ggaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBiZWluZyAocHVycG9ydGVkbHkpCitsb2Fkd2FyZSwgQ1JDIChmb3IgdGhlIGxvYWRlciksIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uLgorKi8KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGb3JtYXQgb2YgbG9hZHdhcmUgYmxvY2sKKy8vCisvLyBUaGlzIGlzIGRlZmluZWQgYXMgYSB1bmlvbiBzbyB3ZSBjYW4gcGFzcyBhIHBvaW50ZXIgdG8gb25lIG9mIHRoZXNlIGl0ZW1zCisvLyBhbmQgKGlmIGl0IGlzIHRoZSBmaXJzdCBibG9jaykgcGljayBvdXQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24sIGV0Yy4KKy8vCisvLyBPdGhlcndpc2UsIHRvIGRlYWwgd2l0aCB0aGlzIGFzIGEgc2ltcGxlIGNoYXJhY3RlciBhcnJheQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBMT0FEV0FSRV9CTE9DS19TSVpFICAgNTEyICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIGVhY2ggYmxvY2sgb2YgbG9hZHdhcmUKKwordHlwZWRlZiB1bmlvbiBfbG9hZEhkclN0cgoreworCXVuc2lnbmVkIGNoYXIgY1tMT0FEV0FSRV9CTE9DS19TSVpFXTsgIC8vIFZhbGlkIGZvciBldmVyeSBibG9jaworCisJc3RydWN0CS8vIFRoZXNlIGZpZWxkcyBhcmUgdmFsaWQgZm9yIG9ubHkgdGhlIGZpcnN0IGJsb2NrIG9mIGxvYWR3YXJlLgorCXsKKwkJdW5zaWduZWQgY2hhciBsb2FkTWFnaWM7CQkvLyBNYWdpYyBudW1iZXI6IHNlZSBiZWxvdworCQl1bnNpZ25lZCBjaGFyIGxvYWRCbG9ja3NNb3JlOwkvLyBIb3cgbWFueSBtb3JlIGJsb2Nrcz8KKwkJdW5zaWduZWQgY2hhciBsb2FkQ1JDWzJdOwkJLy8gVHdvIENSQyBieXRlczogdXNlZCBieSBsb2FkZXIKKwkJdW5zaWduZWQgY2hhciBsb2FkVmVyc2lvbjsJCS8vIFZlcnNpb24gbnVtYmVyCisJCXVuc2lnbmVkIGNoYXIgbG9hZFJldmlzaW9uOwkJLy8gUmV2aXNpb24gbnVtYmVyCisJCXVuc2lnbmVkIGNoYXIgbG9hZFN1YlJldmlzaW9uOwkvLyBTdWItcmV2aXNpb24gbnVtYmVyCisJCXVuc2lnbmVkIGNoYXIgbG9hZFNwYXJlc1s5XTsJLy8gUHJlc2VudGx5IHVudXNlZAorCQl1bnNpZ25lZCBjaGFyIGxvYWREYXRlc1szMl07CS8vIE51bGwtdGVybWluYXRlZCBzdHJpbmcgd2hpY2ggY2FuIGdpdmUKKwkJCQkJCQkJCQkvLyBkYXRlIGFuZCB0aW1lIG9mIGNvbXBpbGF0aW9uCisJfSBlOworfSBsb2FkSGRyU3RyLCAqbG9hZEhkclN0clB0cjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmluZXMgZm9yIGRvd25sb2FkaW5nIGNvZGU6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGUgbG9hZE1hZ2ljIGZpZWxkIGluIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgbG9hZGZpbGUgbXVzdCBiZSB0aGlzLCBlbHNlIHRoZQorLy8gZmlsZSBpcyBub3QgdmFsaWQuCisvLworI2RlZmluZSAgTUFHSUNfTE9BREZJTEUgMHgzYworCisvLyBIb3cgZG8gd2Uga25vdyB0aGUgbG9hZCB3YXMgc3VjY2Vzc2Z1bD8gT24gY29tcGxldGlvbiBvZiB0aGUgbG9hZCwgdGhlCisvLyBib290c3RyYXAgZmlybXdhcmUgcmV0dXJucyBhIGNvZGUgdG8gaW5kaWNhdGUgd2hldGhlciBpdCB0aG91Z2h0IHRoZSBkb3dubG9hZAorLy8gd2FzIHZhbGlkIGFuZCBpbnRlbmRzIHRvIGV4ZWN1dGUgaXQuIFRoZXNlIGFyZSB0aGUgb25seSBwb3NzaWJsZSB2YWxpZCBjb2RlczoKKy8vCisjZGVmaW5lICBMT0FEV0FSRV9PSyAgICAweGMzICAgICAgICAvLyBEb3dubG9hZCB3YXMgb2sKKyNkZWZpbmUgIExPQURXQVJFX0JBRCAgIDB4NWEgICAgICAgIC8vIERvd25sb2FkIHdhcyBiYWQgKENSQyBlcnJvcikKKworLy8gQ29uc3RhbnRzIGFwcGxpY2FibGUgdG8gd3JpdGluZyBibG9ja3Mgb2YgbG9hZHdhcmU6CisvLyBUaGUgZmlyc3QgYmxvY2sgb2YgbG9hZHdhcmUgbWlnaHQgdGFrZSA2MDAgbVMgdG8gbG9hZCwgaW4gZXh0cmVtZSBjYXNlcy4KKy8vIChFeHBhbmRhYmxlIGJvYXJkOiB3b3JzdCBjYXNlIGZvciBzZW5kaW5nIHN0YXJ0dXAgbWVzc2FnZXMgdG8gdGhlIExDRCdzKS4KKy8vIFRoZSA2MDBtUyBmaWd1cmUgaXMgbm90IHJlYWxseSBhIGNhbGN1bGF0aW9uLCBidXQgYSBjb25zZXJ2YXRpdmUKKy8vIGd1ZXNzL2d1YXJhbnRlZS4gVXN1YWxseSB0aGlzIHdpbGwgYmUgd2l0aGluIDEwMCBtUywgbGlrZSBzdWJzZXF1ZW50IGJsb2Nrcy4KKy8vCisjZGVmaW5lICBNQVhfRExPQURfU1RBUlRfVElNRSAxMDAwICAvLyAxMDAwIG1TCisjZGVmaW5lICBNQVhfRExPQURfUkVBRF9USU1FICAxMDAgICAvLyAxMDAgbVMKKworLy8gRmlybXdhcmUgc2hvdWxkIHJlc3BvbmQgd2l0aCBzdGF0dXMgKHNlZSBhYm92ZSkgd2l0aGluIHRoaXMgbG9uZyBvZiBob3N0CisvLyBoYXZpbmcgc2VudCB0aGUgZmluYWwgYmxvY2suCisvLworI2RlZmluZSAgTUFYX0RMT0FEX0FDS19USU1FICAgMTAwICAgLy8gMTAwIG1TLCBhZ2FpbiEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1BWElNVU0gTlVNQkVSIE9GIFBPUlRTIFBFUiBCT0FSRDoKKy8vIFRoaXMgaXMgZml4ZWQgZm9yIG5vdyAod2l0aCB0aGUgZXhwYW5kYWJsZSksIGJ1dCBtYXkKKy8vIGJlIGV4cGFuZGluZyBhY2NvcmRpbmcgdG8gZXZlbiBuZXdlciBwcm9kdWN0cy4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworI2RlZmluZSBBQlNfTUFYX0JPWEVTICAgNCAgICAgLy8gQWJzb2x1dGUgbW9zdCBib3hlcyBwZXIgYm9hcmQKKyNkZWZpbmUgQUJTX0JJR0dFU1RfQk9YIDE2ICAgIC8vIEFic29sdXRlIHRoZSBtb3N0IHBvcnRzIHBlciBib3gKKyNkZWZpbmUgQUJTX01PU1RfUE9SVFMgIChBQlNfTUFYX0JPWEVTICogQUJTX0JJR0dFU1RfQk9YKQorCisjZW5kaWYgICAvLyBJMkhXX0gKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jIGIvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYzVmMzAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jCkBAIC0wLDAgKzEsMjIxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAoYykgMTk5OSBieSBDb21wdXRvbmUgQ29ycG9yYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqICAgUEFDS0FHRTogICAgIExpbnV4IHR0eSBEZXZpY2UgRHJpdmVyIGZvciBJbnRlbGxpUG9ydCBmYW1pbHkgb2YgbXVsdGlwb3J0CisqICAgICAgICAgICAgICAgIHNlcmlhbCBJL08gY29udHJvbGxlcnMuCisqCisqICAgREVTQ1JJUFRJT046IEhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGNvZGUgZm9yIHRoZSBkZXZpY2UgZHJpdmVyLiBVc2VzIHRoZQorKiAgICAgICAgICAgICAgICBFeHRyZW1lbHkgTG93IExldmVsIEludGVyZmFjZSBTdXBwb3J0IChpMmVsbGlzLmMpLiBQcm92aWRlcyBhbgorKiAgICAgICAgICAgICAgICBpbnRlcmZhY2UgdG8gdGhlIHN0YW5kYXJkIGxvYWR3YXJlLCB0byBzdXBwb3J0IGRyaXZlcnMgb3IKKyogICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY29kZS4gKFRoaXMgaXMgaW5jbHVkZWQgc291cmNlIGNvZGUsIG5vdCBhIHNlcGFyYXRlCisqICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uIG1vZHVsZS4pCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5vdGUgb24gU3RyYXRlZ3k6CisvLyBPbmNlIHRoZSBib2FyZCBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgd2lsbCBpbnRlcnJ1cHQgdXMgd2hlbjoKKy8vIDEpIEl0IGhhcyBzb21ldGhpbmcgaW4gdGhlIGZpZm8gZm9yIHVzIHRvIHJlYWQgKGluY29taW5nIGRhdGEsIGZsb3cgY29udHJvbAorLy8gcGFja2V0cywgb3Igd2hhdGV2ZXIpLgorLy8gMikgSXQgaGFzIHN0cmlwcGVkIHdoYXRldmVyIHdlIGhhdmUgc2VudCBsYXN0IHRpbWUgaW4gdGhlIEZJRk8gKGFuZAorLy8gY29uc2VxdWVudGx5IGlzIHJlYWR5IGZvciBtb3JlKS4KKy8vCisvLyBOb3RlIGFsc28gdGhhdCB0aGUgYnVmZmVyIHNpemVzIGRlY2xhcmVkIGluIGkybGliLmggYXJlIFZFUlkgU01BTEwuIFRoaXMKKy8vIHdvcnNlbnMgcGVyZm9ybWFuY2UgY29uc2lkZXJhYmx5LCBidXQgaXMgZG9uZSBzbyB0aGF0IGEgZ3JlYXQgbWFueSBjaGFubmVscworLy8gbWlnaHQgdXNlIG9ubHkgYSBsaXR0bGUgbWVtb3J5LgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmlzaW9uIEhpc3Rvcnk6CisvLworLy8gMC4wMCAtICA0LzE2LzkxIC0tLSBGaXJzdCBEcmFmdAorLy8gMC4wMSAtICA0LzI5LzkxIC0tLSAxc3QgYmV0YSByZWxlYXNlCisvLyAwLjAyIC0gIDYvMTQvOTEgLS0tIENoYW5nZXMgdG8gYWxsb3cgc21hbGwgbW9kZWwgY29tcGlsYXRpb24KKy8vIDAuMDMgLSAgNi8xNy85MSBNQUcgQnJlYWsgcmVwb3J0aW5nIHByb3RlY3RlZCBmcm9tIGludGVycnVwdHMgcm91dGluZXMgd2l0aAorLy8gICAgICAgICAgICAgICAgICAgICBpbi1saW5lIGFzbSBhZGRlZCBmb3IgbW92aW5nIGRhdGEgdG8vZnJvbSByaW5nIGJ1ZmZlcnMsCisvLyAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2luZyBhIHZhcmlldHkgb2YgbWV0aG9kcyB1c2VkIHByZXZpb3VzbHkuCisvLyAwLjA0IC0gIDYvMjEvOTEgTUFHIEluaXRpYWwgZmxvdy1jb250cm9sIHBhY2tldHMgbm90IHF1ZXVlZCB1bnRpbAorLy8gICAgICAgICAgICAgICAgICAgICBpMl9lbmFibGVfaW50ZXJydXB0cyB0aW1lLiBGb3JtZXIgdmVyc2lvbnMgd291bGQgZW5xdWV1ZQorLy8gICAgICAgICAgICAgICAgICAgICB0aGVtIGF0IGkyX2luaXRfY2hhbm5lbCB0aW1lLCBiZWZvcmUgd2Uga25ldyBob3cgbWFueQorLy8gICAgICAgICAgICAgICAgICAgICBjaGFubmVscyB3ZXJlIHN1cHBvc2VkIHRvIGV4aXN0IQorLy8gMC4wNSAtIDEwLzEyLzkxIE1BRyBNYWpvciBjaGFuZ2VzOiB3b3JrcyB0aHJvdWdoIHRoZSBlbGxpcy5jIHJvdXRpbmVzIG5vdzsKKy8vICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgbmV3IDE2LWJpdCBwcm90b2NvbCBhbmQgZXhwYW5kYWJsZSBib2FyZHMuCisvLyAgICAgIC0gMTAvMjQvOTEgTUFHIE1vc3QgY2hhbmdlcyBpbiBwbGFjZSBhbmQgc3RhYmxlLgorLy8gMC4wNiAtICAyLzIwLzkyIE1BRyBGb3JtYXQgb2YgQ01EX0hPVEFDSyBjb3JyZWN0ZWQ6IHRoZSBjb21tYW5kIHRha2VzIG5vCisvLyAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LgorLy8gMC4wNyAtLSAzLzExLzkyIE1BRyBTdXBwb3J0IGFkZGVkIHRvIHN0b3JlIHNwZWNpYWwgcGFja2V0IHR5cGVzIGF0IGludGVycnVwdAorLy8gICAgICAgICAgICAgICAgICAgICBsZXZlbCAobW9zdGx5IHJlc3BvbnNlcyB0byBzcGVjaWZpYyBjb21tYW5kcy4pCisvLyAwLjA4IC0tIDMvMzAvOTIgTUFHIFN1cHBvcnQgYWRkZWQgZm9yIFNUQVRfTU9ERU0gcGFja2V0CisvLyAwLjA5IC0tIDYvMjQvOTMgTUFHIGkyTGluay4uLiBuZWVkZWQgdG8gdXBkYXRlIG51bWJlciBvZiBib2FyZHMgQkVGT1JFCisvLyAgICAgICAgICAgICAgICAgICAgIHR1cm5pbmcgb24gdGhlIGludGVycnVwdC4KKy8vIDAuMTAgLS0gNi8yNS85MyBNQUcgVG8gYXZvaWQgZ3J1ZXNvbWUgZGVhdGggZnJvbSBhIGJhZCBib2FyZCwgd2Ugc2FuaXR5IGNoZWNrCisvLyAgICAgICAgICAgICAgICAgICAgIHNvbWUgaW5jb21pbmcuCisvLworLy8gMS4xICAtIDEyLzI1Lzk2IEFLTSBMaW51eCB2ZXJzaW9uLgorLy8gICAgICAtIDEwLzA5Lzk4IERNQyBSZXZpc2VkIExpbnV4IHZlcnNpb24uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyoqKioqKioqKioqKgorLy8qIEluY2x1ZGVzICoKKy8vKioqKioqKioqKioqCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgImkybGliLmgiCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKgorLy8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKgorLy8qKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQgaTJRdWV1ZU5lZWRzKGkyZUJvcmRTdHJQdHIsIGkyQ2hhblN0clB0ciwgaW50KTsKK3N0YXRpYyBpMkNoYW5TdHJQdHIgaTJEZVF1ZXVlTmVlZHMoaTJlQm9yZFN0clB0ciwgaW50ICk7CitzdGF0aWMgdm9pZCBpMlN0cmlwRmlmbyhpMmVCb3JkU3RyUHRyKTsKK3N0YXRpYyB2b2lkIGkyU3R1ZmZGaWZvQnlwYXNzKGkyZUJvcmRTdHJQdHIpOworc3RhdGljIHZvaWQgaTJTdHVmZkZpZm9GbG93KGkyZUJvcmRTdHJQdHIpOworc3RhdGljIHZvaWQgaTJTdHVmZkZpZm9JbmxpbmUoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgaW50IGkyUmV0cnlGbHVzaE91dHB1dChpMkNoYW5TdHJQdHIpOworCisvLyBOb3QgYSBkb2N1bWVudGVkIHBhcnQgb2YgdGhlIGxpYnJhcnkgcm91dGluZXMgKGNhcmVmdWwuLi4pIGJ1dCB0aGUgRGlhZ25vc3RpYworLy8gaTJkaWFnLmMgZmluZHMgdGhlbSB1c2VmdWwgdG8gaGVscCB0aGUgdGhyb3VnaHB1dCBpbiBjZXJ0YWluIGxpbWl0ZWQKKy8vIHNpbmdsZS10aHJlYWRlZCBvcGVyYXRpb25zLgorc3RhdGljIHZvaWQgaWlTZW5kUGVuZGluZ01haWwoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgdm9pZCBzZXJ2aWNlT3V0Z29pbmdGaWZvKGkyZUJvcmRTdHJQdHIpOworCisvLyBGdW5jdGlvbnMgZGVmaW5lZCBpbiBpcDIuYyBhcyBwYXJ0IG9mIGludGVycnVwdCBoYW5kbGluZworc3RhdGljIHZvaWQgZG9faW5wdXQodm9pZCAqKTsKK3N0YXRpYyB2b2lkIGRvX3N0YXR1cyh2b2lkICopOworCisvLyoqKioqKioqKioqKioqKgorLy8qIERlYnVnICBEYXRhICoKKy8vKioqKioqKioqKioqKioqCisjaWZkZWYgREVCVUdfRklGTworCit1bnNpZ25lZCBjaGFyIERCR0J1ZlsweDQwMDBdOwordW5zaWduZWQgc2hvcnQgSSA9IDA7CisKK3N0YXRpYyB2b2lkCitXcml0ZURCR0J1ZihjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIHNob3J0IG4gKSAKK3sKKwljaGFyICpwID0gc3JjOworCisJLy8gWFhYOiBXZSBuZWVkIGEgc3BpbiBsb2NrIGhlcmUgaWYgd2UgZXZlciB1c2UgdGhpcyBhZ2FpbgorCisJd2hpbGUgKCpzKSB7CS8vIGNvcHkgbGFiZWwKKwkJREJHQnVmW0ldID0gKnMrKzsKKwkJSSA9IEkrKyAmIDB4M2ZmZjsKKwl9CisJd2hpbGUgKG4tLSkgewkvLyBjb3B5IGRhdGEKKwkJREJHQnVmW0ldID0gKnArKzsKKwkJSSA9IEkrKyAmIDB4M2ZmZjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitmYXRhbGl0eShpMmVCb3JkU3RyUHRyIHBCICkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wO2k8c2l6ZW9mKERCR0J1Zik7aSsrKSB7CisJCWlmICgoaSUxNikgPT0gMCkKKwkJCXByaW50aygiXG4lNHg6IixpKTsKKwkJcHJpbnRrKCIlMDJ4ICIsREJHQnVmW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCWZvciAoaT0wO2k8c2l6ZW9mKERCR0J1Zik7aSsrKSB7CisJCWlmICgoaSUxNikgPT0gMCkKKwkJCXByaW50aygiXG4lNHg6IixpKTsKKwkJaWYgKERCR0J1ZltpXSA+PSAnICcgJiYgREJHQnVmW2ldIDw9ICd+JykgeworCQkJcHJpbnRrKCIgJWMgIixEQkdCdWZbaV0pOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCIgLiAiKTsKKwkJfQorCX0KKwlwcmludGsoIlxuIik7CisJcHJpbnRrKCJMYXN0IGluZGV4ICV4XG4iLEkpOworfQorI2VuZGlmIC8qIERFQlVHX0ZJRk8gKi8KKworLy8qKioqKioqKgorLy8qIENvZGUgKgorLy8qKioqKioqKgorCitzdGF0aWMgaW5saW5lIGludAoraTJWYWxpZGF0ZSAoIGkyQ2hhblN0clB0ciBwQ2ggKQoreworCS8vaXAydHJhY2UocENoLT5wb3J0X2luZGV4LCBJVFJDX1ZFUklGWSxJVFJDX0VOVEVSLDIscENoLT52YWxpZGl0eSwKKwkvLwkoQ0hBTk5FTF9NQUdJQyB8IENIQU5ORUxfU1VQUE9SVCkpOworCXJldHVybiAoKHBDaC0+dmFsaWRpdHkgJiAoQ0hBTk5FTF9NQUdJQ19CSVRTIHwgQ0hBTk5FTF9TVVBQT1JUKSkgCisJCQkgID09IChDSEFOTkVMX01BR0lDIHwgQ0hBTk5FTF9TVVBQT1JUKSk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVNlbmRQZW5kaW5nTWFpbChwQikKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBib2FyZCBzdHJ1Y3R1cmUKKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vIElmIGFueSBvdXRnb2luZyBtYWlsIGJpdHMgYXJlIHNldCBhbmQgdGhlcmUgaXMgb3V0Z29pbmcgbWFpbGJveCBpcyBlbXB0eSwKKy8vIHNlbmQgdGhlIG1haWwgYW5kIGNsZWFyIHRoZSBiaXRzLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWlTZW5kUGVuZGluZ01haWwoaTJlQm9yZFN0clB0ciBwQikKK3sKKwlpZiAocEItPmkyZU91dE1haWxXYWl0aW5nICYmICghcEItPmkyZVdhaXRpbmdGb3JFbXB0eUZpZm8pICkKKwl7CisJCWlmIChpaVRyeVNlbmRNYWlsKHBCLCBwQi0+aTJlT3V0TWFpbFdhaXRpbmcpKQorCQl7CisJCQkvKiBJZiB3ZSB3ZXJlIGFscmVhZHkgd2FpdGluZyBmb3IgZmlmbyB0byBlbXB0eSwKKwkJCSAqIG9yIGp1c3Qgc2VudCBNQl9PVVRfU1RVRkZFRCwgdGhlbiB3ZSBhcmUKKwkJCSAqIHN0aWxsIHdhaXRpbmcgZm9yIGl0IHRvIGVtcHR5LCB1bnRpbCB3ZSBzaG91bGQKKwkJCSAqIHJlY2VpdmUgYW4gTUJfSU5fU1RSSVBQRUQgZnJvbSB0aGUgYm9hcmQuCisJCQkgKi8KKwkJCXBCLT5pMmVXYWl0aW5nRm9yRW1wdHlGaWZvIHw9CisJCQkJKHBCLT5pMmVPdXRNYWlsV2FpdGluZyAmIE1CX09VVF9TVFVGRkVEKTsKKwkJCXBCLT5pMmVPdXRNYWlsV2FpdGluZyA9IDA7CisJCQlwQi0+U2VuZFBlbmRpbmdSZXRyeSA9IDA7CisJCX0gZWxzZSB7CisvKgkJVGhlIG9ubHkgdGltZSB3ZSBoaXQgdGhpcyBhcmVhIGlzIHdoZW4gImlpVHJ5U2VuZE1haWwiIGhhcworCQlmYWlsZWQuICBUaGF0IG9ubHkgb2NjdXJzIHdoZW4gdGhlIG91dGJvdW5kIG1haWxib3ggaXMKKwkJc3RpbGwgYnVzeSB3aXRoIHRoZSBsYXN0IG1lc3NhZ2UuICBXZSB0YWtlIGEgc2hvcnQgYnJlYXRoZXIKKwkJdG8gbGV0IHRoZSBib2FyZCBjYXRjaCB1cCB3aXRoIGl0c2VsZiBhbmQgdGhlbiB0cnkgYWdhaW4uCisJCTE2IFJldHJpZXMgaXMgdGhlIGxpbWl0IC0gdGhlbiB3ZSBnb3QgYSBib3JrZWQgYm9hcmQuCisJCQkvXC9cfD1taHc9fFwvXC8JCQkJKi8KKworCQkJaWYoICsrcEItPlNlbmRQZW5kaW5nUmV0cnkgPCAxNiApIHsKKworCQkJCWluaXRfdGltZXIoICYocEItPlNlbmRQZW5kaW5nVGltZXIpICk7CisJCQkJcEItPlNlbmRQZW5kaW5nVGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgMTsKKwkJCQlwQi0+U2VuZFBlbmRpbmdUaW1lci5mdW5jdGlvbiA9ICh2b2lkKikodW5zaWduZWQgbG9uZylpaVNlbmRQZW5kaW5nTWFpbDsKKwkJCQlwQi0+U2VuZFBlbmRpbmdUaW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKXBCOworCQkJCWFkZF90aW1lciggJihwQi0+U2VuZFBlbmRpbmdUaW1lcikgKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBpaVNlbmRQZW5kaW5nTWFpbCB1bmFibGUgdG8gcXVldWUgb3V0Ym91bmQgbWFpbFxuIiApOworCQkJfQorCQl9CisJfQorfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaTJJbml0Q2hhbm5lbHMocEIsIG5DaGFubmVscywgcENoKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBFbGxpcyBCb2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIE51bWJlciBvZiBjaGFubmVscyB0byBpbml0aWFsaXplCisvLyAgICAgICAgICAgICBQb2ludGVyIHRvIGZpcnN0IGVsZW1lbnQgaW4gYW4gYXJyYXkgb2YgY2hhbm5lbCBzdHJ1Y3R1cmVzCisvLyBSZXR1cm5zOiAgICBTdWNjZXNzIG9yIGZhaWx1cmUKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIHBhdGNoZXMgcG9pbnRlcnMsIGJhY2stcG9pbnRlcnMsIGFuZCBpbml0aWFsaXplcyBhbGwgdGhlCisvLyBlbGVtZW50cyBpbiB0aGUgY2hhbm5lbCBzdHJ1Y3R1cmUgYXJyYXkuCisvLworLy8gVGhpcyBzaG91bGQgYmUgcnVuIGFmdGVyIHRoZSBib2FyZCBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIHRocm91Z2ggaGF2aW5nCisvLyBsb2FkZWQgdGhlIHN0YW5kYXJkIGxvYWR3YXJlIChvdGhlcndpc2UgaXQgY29tcGxhaW5zKS4KKy8vCisvLyBJbiBhbnkgY2FzZSwgaXQgbXVzdCBiZSBkb25lIGJlZm9yZSBhbnkgc2VyaW91cyB3b3JrIGJlZ2lucyBpbml0aWFsaXppbmcgdGhlCisvLyBpcnEncyBvciBzZW5kaW5nIGNvbW1hbmRzLi4uCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2kySW5pdENoYW5uZWxzICggaTJlQm9yZFN0clB0ciBwQiwgaW50IG5DaGFubmVscywgaTJDaGFuU3RyUHRyIHBDaCkKK3sKKwlpbnQgaW5kZXgsIHN0dWZmSW5kZXg7CisJaTJDaGFuU3RyUHRyICpwcENoOworCQorCWlmIChwQi0+aTJlVmFsaWQgIT0gSTJFX01BR0lDKSB7CisJCUNPTVBMRVRFKHBCLCBJMkVFX0JBRE1BR0lDKTsKKwl9CisJaWYgKHBCLT5pMmVTdGF0ZSAhPSBJSV9TVEFURV9TVERMT0FERUQpIHsKKwkJQ09NUExFVEUocEIsIEkyRUVfQkFEU1RBVEUpOworCX0KKworCUxPQ0tfSU5JVCgmcEItPnJlYWRfZmlmb19zcGlubG9jayk7CisJTE9DS19JTklUKCZwQi0+d3JpdGVfZmlmb19zcGlubG9jayk7CisJTE9DS19JTklUKCZwQi0+RGJ1Zl9zcGlubG9jayk7CisJTE9DS19JTklUKCZwQi0+QmJ1Zl9zcGlubG9jayk7CisJTE9DS19JTklUKCZwQi0+RmJ1Zl9zcGlubG9jayk7CisJCisJLy8gTk8gTE9DSyBuZWVkZWQgeWV0IC0gdGhpcyBpcyBpbml0CisKKwlwQi0+aTJlQ2hhbm5lbFB0ciA9IHBDaDsKKwlwQi0+aTJlQ2hhbm5lbENudCA9IG5DaGFubmVsczsKKworCXBCLT5pMkZidWZfc3RyaXAgPSBwQi0+aTJGYnVmX3N0dWZmID0gMDsKKwlwQi0+aTJEYnVmX3N0cmlwID0gcEItPmkyRGJ1Zl9zdHVmZiA9IDA7CisJcEItPmkyQmJ1Zl9zdHJpcCA9IHBCLT5pMkJidWZfc3R1ZmYgPSAwOworCisJcEItPlNlbmRQZW5kaW5nUmV0cnkgPSAwOworCisJbWVtc2V0ICggcENoLCAwLCBzaXplb2YgKGkyQ2hhblN0cikgKiBuQ2hhbm5lbHMgKTsKKworCWZvciAoaW5kZXggPSBzdHVmZkluZGV4ID0gMCwgcHBDaCA9IChpMkNoYW5TdHJQdHIgKikocEItPmkyRmJ1Zik7CisJCSAgbkNoYW5uZWxzICYmIGluZGV4IDwgQUJTX01PU1RfUE9SVFM7CisJCSAgaW5kZXgrKykKKwl7CisJCWlmICggIShwQi0+aTJlQ2hhbm5lbE1hcFtpbmRleCA+PiA0XSAmICgxIDw8IChpbmRleCAmIDB4ZikpICkgKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlMT0NLX0lOSVQoJnBDaC0+SWJ1Zl9zcGlubG9jayk7CisJCUxPQ0tfSU5JVCgmcENoLT5PYnVmX3NwaW5sb2NrKTsKKwkJTE9DS19JTklUKCZwQ2gtPkNidWZfc3BpbmxvY2spOworCQlMT0NLX0lOSVQoJnBDaC0+UGJ1Zl9zcGlubG9jayk7CisJCS8vIE5PIExPQ0sgbmVlZGVkIHlldCAtIHRoaXMgaXMgaW5pdAorCQkvLyBTZXQgdXAgdmFsaWRpdHkgZmxhZyBhY2NvcmRpbmcgdG8gc3VwcG9ydCBsZXZlbAorCQlpZiAocEItPmkyZUdvb2RNYXBbaW5kZXggPj4gNF0gJiAoMSA8PCAoaW5kZXggJiAweGYpKSApIHsKKwkJCXBDaC0+dmFsaWRpdHkgPSBDSEFOTkVMX01BR0lDIHwgQ0hBTk5FTF9TVVBQT1JUOworCQl9IGVsc2UgeworCQkJcENoLT52YWxpZGl0eSA9IENIQU5ORUxfTUFHSUM7CisJCX0KKwkJcENoLT5wTXlCb3JkID0gcEI7ICAgICAgLyogQmFjay1wb2ludGVyICovCisKKwkJLy8gUHJlcGFyZSBhbiBvdXRnb2luZyBmbG93LWNvbnRyb2wgcGFja2V0IHRvIHNlbmQgYXMgc29vbiBhcyB0aGUgY2hhbmNlCisJCS8vIG9jY3Vycy4KKwkJaWYgKCBwQ2gtPnZhbGlkaXR5ICYgQ0hBTk5FTF9TVVBQT1JUICkgeworCQkJcENoLT5pbmZsLmhkLmkyc0NoYW5uZWwgPSBpbmRleDsKKwkJCXBDaC0+aW5mbC5oZC5pMnNDb3VudCA9IDU7CisJCQlwQ2gtPmluZmwuaGQuaTJzVHlwZSA9IFBUWVBFX0JZUEFTUzsKKwkJCXBDaC0+aW5mbC5mY21kID0gMzc7CisJCQlwQ2gtPmluZmwuYXNvZiA9IDA7CisJCQlwQ2gtPmluZmwucm9vbSA9IElCVUZfU0laRSAtIDE7CisKKwkJCXBDaC0+d2hlblNlbmRGbG93ID0gKElCVUZfU0laRS81KSo0OyAvLyB3aGVuIDgwJSBmdWxsCisKKwkJLy8gVGhlIGZvbGxvd2luZyBpcyBzaW1pbGFyIHRvIGNhbGxpbmcgaTJRdWV1ZU5lZWRzLCBleGNlcHQgdGhhdCB0aGlzCisJCS8vIGlzIGRvbmUgaW4gbG9uZ2hhbmQsIHNpbmNlIHdlIGFyZSBzZXR0aW5nIHVwIGluaXRpYWwgY29uZGl0aW9ucyBvbgorCQkvLyBtYW55IGNoYW5uZWxzIGF0IG9uY2UuCisJCQlwQ2gtPmNoYW5uZWxOZWVkcyA9IE5FRURfRkxPVzsgIC8vIFNpbmNlIHN0YXJ0aW5nIGZyb20gc2NyYXRjaAorCQkJcENoLT5zaW5jZUxhc3RGbG93ID0gMDsgICAgICAgICAvLyBObyBieXRlcyByZWNlaXZlZCBzaW5jZSBsYXN0IGZsb3cKKwkJCQkJCQkJCQkJLy8gY29udHJvbCBwYWNrZXQgd2FzIHF1ZXVlZAorCQkJc3R1ZmZJbmRleCsrOworCQkJKnBwQ2grKyA9IHBDaDsgICAgICAvLyBMaXN0IHRoaXMgY2hhbm5lbCBhcyBuZWVkaW5nCisJCQkJCQkJCS8vIGluaXRpYWwgZmxvdyBjb250cm9sIHBhY2tldCBzZW50CisJCX0KKworCQkvLyBEb24ndCBhbGxvdyBhbnl0aGluZyB0byBiZSBzZW50IHVudGlsIHRoZSBzdGF0dXMgcGFja2V0cyBjb21lIGluIGZyb20KKwkJLy8gdGhlIGJvYXJkLgorCisJCXBDaC0+b3V0ZmwuYXNvZiA9IDA7CisJCXBDaC0+b3V0Zmwucm9vbSA9IDA7CisKKwkJLy8gSW5pdGlhbGl6ZSBhbGwgdGhlIHJpbmcgYnVmZmVycworCisJCXBDaC0+SWJ1Zl9zdHVmZiA9IHBDaC0+SWJ1Zl9zdHJpcCA9IDA7CisJCXBDaC0+T2J1Zl9zdHVmZiA9IHBDaC0+T2J1Zl9zdHJpcCA9IDA7CisJCXBDaC0+Q2J1Zl9zdHVmZiA9IHBDaC0+Q2J1Zl9zdHJpcCA9IDA7CisKKwkJbWVtc2V0KCAmcENoLT5pY291bnQsIDAsIHNpemVvZiAoc3RydWN0IGFzeW5jX2ljb3VudCkgKTsKKwkJcENoLT5ob3RLZXlJbiAgICAgICA9IEhPVF9DTEVBUjsKKwkJcENoLT5jaGFubmVsT3B0aW9ucyA9IDA7CisJCXBDaC0+Ym9va01hcmtzICAgICAgPSAwOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwQ2gtPnBCb29rbWFya1dhaXQpOworCisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBDaC0+b3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcENoLT5jbG9zZV93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcENoLT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkJLy8gU2V0IGJhc2UgYW5kIGRpdmlzb3Igc28gZGVmYXVsdCBjdXN0b20gcmF0ZSBpcyA5NjAwCisJCXBDaC0+QmF1ZEJhc2UgICAgPSA5MjE2MDA7CS8vIE1BWCBmb3IgU1Q2NTQsIGNoYW5nZWQgYWZ0ZXIgd2UgZ2V0CisJCXBDaC0+QmF1ZERpdmlzb3IgPSA5NjsJCS8vIHRoZSBib3hpZHMgKFVBUlQgdHlwZXMpIGxhdGVyCisKKwkJcENoLT5kYXRhU2V0SW4gICA9IDA7CisJCXBDaC0+ZGF0YVNldE91dCAgPSAwOworCisJCXBDaC0+d29wZW4gICAgICAgPSAwOworCQlwQ2gtPnRocm90dGxlZCAgID0gMDsKKworCQlwQ2gtPnNwZWVkICAgICAgID0gQ0JSXzk2MDA7CisKKwkJcENoLT5mbGFncyAgICA9IDA7CisKKwkJcENoLT5DbG9zaW5nRGVsYXkgICAgID0gNSpIWi8xMDsKKwkJcENoLT5DbG9zaW5nV2FpdFRpbWUgID0gMzAqSFo7CisKKwkJLy8gSW5pdGlhbGl6ZSB0YXNrIHF1ZXVlIG9iamVjdHMKKwkJSU5JVF9XT1JLKCZwQ2gtPnRxdWV1ZV9pbnB1dCwgZG9faW5wdXQsIHBDaCk7CisJCUlOSVRfV09SSygmcENoLT50cXVldWVfc3RhdHVzLCBkb19zdGF0dXMsIHBDaCk7CisKKyNpZmRlZiBJUDJERUJVR19UUkFDRQorCQlwQ2gtPnRyYWNlID0gaXAydHJhY2U7CisjZW5kaWYKKworCQkrK3BDaDsKKyAgICAgCS0tbkNoYW5uZWxzOworCX0KKwkvLyBObyBuZWVkIHRvIGNoZWNrIGZvciB3cmFwIGhlcmU7IHRoaXMgaXMgaW5pdGlhbGl6YXRpb24uCisJcEItPmkyRmJ1Zl9zdHVmZiA9IHN0dWZmSW5kZXg7CisJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7CisKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyRGVRdWV1ZU5lZWRzKHBCLCB0eXBlKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgdHlwZSBiaXQgbWFwOiBtYXkgaW5jbHVkZSBORUVEX0lOTElORSwgTkVFRF9CWVBBU1MsIG9yIE5FRURfRkxPVworLy8gUmV0dXJuczogICAKKy8vICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBjaGFubmVsIHN0cnVjdHVyZQorLy8KKy8vIERlc2NyaXB0aW9uOiBSZXR1cm5zIHBvaW50ZXIgc3RydWN0IG9mIG5leHQgY2hhbm5lbCB0aGF0IG5lZWRzIHNlcnZpY2Ugb2YKKy8vICB0aGUgdHlwZSBzcGVjaWZpZWQuIE90aGVyd2lzZSByZXR1cm5zIGEgTlVMTCByZWZlcmVuY2UuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpMkNoYW5TdHJQdHIgCitpMkRlUXVldWVOZWVkcyhpMmVCb3JkU3RyUHRyIHBCLCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBxdWV1ZUluZGV4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpMkNoYW5TdHJQdHIgcENoID0gTlVMTDsKKworCXN3aXRjaCh0eXBlKSB7CisKKwljYXNlICBORUVEX0lOTElORToKKworCQlXUklURV9MT0NLX0lSUVNBVkUoJnBCLT5EYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwkJaWYgKCBwQi0+aTJEYnVmX3N0dWZmICE9IHBCLT5pMkRidWZfc3RyaXApCisJCXsKKwkJCXF1ZXVlSW5kZXggPSBwQi0+aTJEYnVmX3N0cmlwOworCQkJcENoID0gcEItPmkyRGJ1ZltxdWV1ZUluZGV4XTsKKwkJCXF1ZXVlSW5kZXgrKzsKKwkJCWlmIChxdWV1ZUluZGV4ID49IENIX1FVRVVFX1NJWkUpIHsKKwkJCQlxdWV1ZUluZGV4ID0gMDsKKwkJCX0KKwkJCXBCLT5pMkRidWZfc3RyaXAgPSBxdWV1ZUluZGV4OworCQkJcENoLT5jaGFubmVsTmVlZHMgJj0gfk5FRURfSU5MSU5FOworCQl9CisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+RGJ1Zl9zcGlubG9jayxmbGFncyk7IAorCQlicmVhazsKKworCWNhc2UgTkVFRF9CWVBBU1M6CisKKwkJV1JJVEVfTE9DS19JUlFTQVZFKCZwQi0+QmJ1Zl9zcGlubG9jayxmbGFncyk7CisJCWlmIChwQi0+aTJCYnVmX3N0dWZmICE9IHBCLT5pMkJidWZfc3RyaXApCisJCXsKKwkJCXF1ZXVlSW5kZXggPSBwQi0+aTJCYnVmX3N0cmlwOworCQkJcENoID0gcEItPmkyQmJ1ZltxdWV1ZUluZGV4XTsKKwkJCXF1ZXVlSW5kZXgrKzsKKwkJCWlmIChxdWV1ZUluZGV4ID49IENIX1FVRVVFX1NJWkUpIHsKKwkJCQlxdWV1ZUluZGV4ID0gMDsKKwkJCX0KKwkJCXBCLT5pMkJidWZfc3RyaXAgPSBxdWV1ZUluZGV4OworCQkJcENoLT5jaGFubmVsTmVlZHMgJj0gfk5FRURfQllQQVNTOworCQl9CisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+QmJ1Zl9zcGlubG9jayxmbGFncyk7IAorCQlicmVhazsKKwkKKwljYXNlIE5FRURfRkxPVzoKKworCQlXUklURV9MT0NLX0lSUVNBVkUoJnBCLT5GYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwkJaWYgKHBCLT5pMkZidWZfc3R1ZmYgIT0gcEItPmkyRmJ1Zl9zdHJpcCkKKwkJeworCQkJcXVldWVJbmRleCA9IHBCLT5pMkZidWZfc3RyaXA7CisJCQlwQ2ggPSBwQi0+aTJGYnVmW3F1ZXVlSW5kZXhdOworCQkJcXVldWVJbmRleCsrOworCQkJaWYgKHF1ZXVlSW5kZXggPj0gQ0hfUVVFVUVfU0laRSkgeworCQkJCXF1ZXVlSW5kZXggPSAwOworCQkJfQorCQkJcEItPmkyRmJ1Zl9zdHJpcCA9IHF1ZXVlSW5kZXg7CisJCQlwQ2gtPmNoYW5uZWxOZWVkcyAmPSB+TkVFRF9GTE9XOworCQl9CisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+RmJ1Zl9zcGlubG9jayxmbGFncyk7IAorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgImkyRGVRdWV1ZU5lZWRzIGNhbGxlZCB3aXRoIGJhZCB0eXBlOiV4XG4iLHR5cGUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHBDaDsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyUXVldWVOZWVkcyhwQiwgcENoLCB0eXBlKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgUG9pbnRlciB0byBhIGNoYW5uZWwgc3RydWN0dXJlCisvLyAgICAgICAgICAgICB0eXBlIGJpdCBtYXA6IG1heSBpbmNsdWRlIE5FRURfSU5MSU5FLCBORUVEX0JZUEFTUywgb3IgTkVFRF9GTE9XCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLyBGb3IgZWFjaCB0eXBlIG9mIG5lZWQgc2VsZWN0ZWQsIGlmIHRoZSBnaXZlbiBjaGFubmVsIGlzIG5vdCBhbHJlYWR5IGluIHRoZQorLy8gcXVldWUsIGFkZHMgaXQsIGFuZCBzZXRzIHRoZSBmbGFnIGluZGljYXRpbmcgaXQgaXMgaW4gdGhlIHF1ZXVlLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkCitpMlF1ZXVlTmVlZHMoaTJlQm9yZFN0clB0ciBwQiwgaTJDaGFuU3RyUHRyIHBDaCwgaW50IHR5cGUpCit7CisJdW5zaWduZWQgc2hvcnQgcXVldWVJbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLy8gV2UgdHVybiBvZmYgYWxsIHRoZSBpbnRlcnJ1cHRzIGR1cmluZyB0aGlzIGJyaWVmIHByb2Nlc3MsIHNpbmNlIHRoZQorCS8vIGludGVycnVwdC1sZXZlbCBjb2RlIG1pZ2h0IHdhbnQgdG8gcHV0IHRoaW5ncyBvbiB0aGUgcXVldWUgYXMgd2VsbC4KKworCXN3aXRjaCAodHlwZSkgeworCisJY2FzZSBORUVEX0lOTElORToKKworCQlXUklURV9MT0NLX0lSUVNBVkUoJnBCLT5EYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwkJaWYgKCAhKHBDaC0+Y2hhbm5lbE5lZWRzICYgTkVFRF9JTkxJTkUpICkKKwkJeworCQkJcENoLT5jaGFubmVsTmVlZHMgfD0gTkVFRF9JTkxJTkU7CisJCQlxdWV1ZUluZGV4ID0gcEItPmkyRGJ1Zl9zdHVmZjsKKwkJCXBCLT5pMkRidWZbcXVldWVJbmRleCsrXSA9IHBDaDsKKwkJCWlmIChxdWV1ZUluZGV4ID49IENIX1FVRVVFX1NJWkUpCisJCQkJcXVldWVJbmRleCA9IDA7CisJCQlwQi0+aTJEYnVmX3N0dWZmID0gcXVldWVJbmRleDsKKwkJfQorCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcEItPkRidWZfc3BpbmxvY2ssZmxhZ3MpOyAKKwkJYnJlYWs7CisKKwljYXNlIE5FRURfQllQQVNTOgorCisJCVdSSVRFX0xPQ0tfSVJRU0FWRSgmcEItPkJidWZfc3BpbmxvY2ssZmxhZ3MpOworCQlpZiAoKHR5cGUgJiBORUVEX0JZUEFTUykgJiYgIShwQ2gtPmNoYW5uZWxOZWVkcyAmIE5FRURfQllQQVNTKSkKKwkJeworCQkJcENoLT5jaGFubmVsTmVlZHMgfD0gTkVFRF9CWVBBU1M7CisJCQlxdWV1ZUluZGV4ID0gcEItPmkyQmJ1Zl9zdHVmZjsKKwkJCXBCLT5pMkJidWZbcXVldWVJbmRleCsrXSA9IHBDaDsKKwkJCWlmIChxdWV1ZUluZGV4ID49IENIX1FVRVVFX1NJWkUpCisJCQkJcXVldWVJbmRleCA9IDA7CisJCQlwQi0+aTJCYnVmX3N0dWZmID0gcXVldWVJbmRleDsKKwkJfSAKKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBCLT5CYnVmX3NwaW5sb2NrLGZsYWdzKTsgCisJCWJyZWFrOworCisJY2FzZSBORUVEX0ZMT1c6CisKKwkJV1JJVEVfTE9DS19JUlFTQVZFKCZwQi0+RmJ1Zl9zcGlubG9jayxmbGFncyk7CisJCWlmICgodHlwZSAmIE5FRURfRkxPVykgJiYgIShwQ2gtPmNoYW5uZWxOZWVkcyAmIE5FRURfRkxPVykpCisJCXsKKwkJCXBDaC0+Y2hhbm5lbE5lZWRzIHw9IE5FRURfRkxPVzsKKwkJCXF1ZXVlSW5kZXggPSBwQi0+aTJGYnVmX3N0dWZmOworCQkJcEItPmkyRmJ1ZltxdWV1ZUluZGV4KytdID0gcENoOworCQkJaWYgKHF1ZXVlSW5kZXggPj0gQ0hfUVVFVUVfU0laRSkKKwkJCQlxdWV1ZUluZGV4ID0gMDsKKwkJCXBCLT5pMkZidWZfc3R1ZmYgPSBxdWV1ZUluZGV4OworCQl9CisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+RmJ1Zl9zcGlubG9jayxmbGFncyk7IAorCQlicmVhazsKKworCWNhc2UgTkVFRF9DUkVESVQ6CisJCXBDaC0+Y2hhbm5lbE5lZWRzIHw9IE5FRURfQ1JFRElUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgImkyUXVldWVOZWVkcyBjYWxsZWQgd2l0aCBiYWQgdHlwZToleFxuIix0eXBlKTsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyUXVldWVDb21tYW5kcyh0eXBlLCBwQ2gsIHRpbWVvdXQsIG5Db21tYW5kcywgcENzLC4uLikKKy8vIFBhcmFtZXRlcnM6IHR5cGUgLSBQVFlQRV9CWVBBU1Mgb3IgUFRZUEVfSU5MSU5FCisvLyAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjaGFubmVsIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgbWF4aW11bSBwZXJpb2QgdG8gd2FpdAorLy8gICAgICAgICAgICAgbnVtYmVyIG9mIGNvbW1hbmRzIChuKQorLy8gICAgICAgICAgICAgbiBjb21tYW5kcworLy8gUmV0dXJuczogICAgTnVtYmVyIG9mIGNvbW1hbmRzIHNlbnQsIG9yIC0xIGZvciBlcnJvcgorLy8KKy8vIGdldCBib2FyZCBsb2NrIGJlZm9yZSBjYWxsaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLyBRdWV1ZXMgdXAgc29tZSBjb21tYW5kcyB0byBiZSBzZW50IHRvIGEgY2hhbm5lbC4gVG8gc2VuZCBwb3NzaWJseSBzZXZlcmFsCisvLyBieXBhc3Mgb3IgaW5saW5lIGNvbW1hbmRzIHRvIHRoZSBnaXZlbiBjaGFubmVsLiBUaGUgdGltZW91dCBwYXJhbWV0ZXIKKy8vIGluZGljYXRlcyBob3cgbWFueSBIVU5EUkVEVEhTIE9GIFNFQ09ORFMgdG8gd2FpdCB1bnRpbCB0aGVyZSBpcyByb29tOgorLy8gMCA9IHJldHVybiBpbW1lZGlhdGVseSBpZiBubyByb29tLCAtaXZlICA9IHdhaXQgZm9yZXZlciwgK2l2ZSA9IG51bWJlciBvZgorLy8gMS8xMDAgc2Vjb25kcyB0byB3YWl0LiBSZXR1cm4gdmFsdWVzOgorLy8gLTEgU29tZSBraW5kIG9mIG5hc3R5IGVycm9yOiBiYWQgY2hhbm5lbCBzdHJ1Y3R1cmUgb3IgaW52YWxpZCBhcmd1bWVudHMuCisvLyAgMCBObyByb29tIHRvIHNlbmQgYWxsIHRoZSBjb21tYW5kcworLy8gKCspICAgTnVtYmVyIG9mIGNvbW1hbmRzIHNlbnQKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpMlF1ZXVlQ29tbWFuZHMoaW50IHR5cGUsIGkyQ2hhblN0clB0ciBwQ2gsIGludCB0aW1lb3V0LCBpbnQgbkNvbW1hbmRzLAorCQkJCQkgY21kU3ludGF4UHRyIHBDczAsLi4uKQoreworCWludCB0b3RhbHNpemUgPSAwOworCWludCBibG9ja3NpemU7CisJaW50IGxhc3RlbmRlZDsKKwljbWRTeW50YXhQdHIgKnBwQ3M7CisJY21kU3ludGF4UHRyIHBDczsKKwlpbnQgY291bnQ7CisJaW50IGZsYWc7CisJaTJlQm9yZFN0clB0ciBwQjsKKworCXVuc2lnbmVkIHNob3J0IG1heEJsb2NrOworCXVuc2lnbmVkIHNob3J0IG1heEJ1ZmY7CisJc2hvcnQgYnVmcm9vbTsKKwl1bnNpZ25lZCBzaG9ydCBzdHVmZkluZGV4OworCXVuc2lnbmVkIGNoYXIgKnBCdWY7CisJdW5zaWduZWQgY2hhciAqcEluc2VydDsKKwl1bnNpZ25lZCBjaGFyICpwRGVzdCwgKnBTb3VyY2U7CisJdW5zaWduZWQgc2hvcnQgY2hhbm5lbDsKKwlpbnQgY250OworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXJ3bG9ja190ICpsb2NrX3Zhcl9wID0gTlVMTDsKKworCS8vIE1ha2Ugc3VyZSB0aGUgY2hhbm5lbCBleGlzdHMsIG90aGVyd2lzZSBkbyBub3RoaW5nCisJaWYgKCAhaTJWYWxpZGF0ZSAoIHBDaCApICkgeworCQlyZXR1cm4gLTE7CisJfQorCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX1FVRVVFLCBJVFJDX0VOVEVSLCAwICk7CisKKwlwQiA9IHBDaC0+cE15Qm9yZDsKKworCS8vIEJvYXJkIG11c3QgYWxzbyBleGlzdCwgYW5kIFRIRSBJTlRFUlJVUFQgQ09NTUFORCBBTFJFQURZIFNFTlQKKwlpZiAocEItPmkyZVZhbGlkICE9IEkyRV9NQUdJQyB8fCBwQi0+aTJlVXNpbmdJcnEgPT0gSVJRX1VOREVGSU5FRCkgeworCQlyZXR1cm4gLTI7CisJfQorCS8vIElmIHRoZSBib2FyZCBoYXMgZ29uZSBmYXRhbCwgcmV0dXJuIGJhZCwgYW5kIGFsc28gaGl0IHRoZSB0cmFwIHJvdXRpbmUgaWYKKwkvLyBpdCBleGlzdHMuCisJaWYgKHBCLT5pMmVGYXRhbCkgeworCQlpZiAoIHBCLT5pMmVGYXRhbFRyYXAgKSB7CisJCQkoKihwQiktPmkyZUZhdGFsVHJhcCkocEIpOworCQl9CisJCXJldHVybiAtMzsKKwl9CisJLy8gU2V0IHVwIHNvbWUgdmFyaWFibGVzLCBXaGljaCBidWZmZXJzIGFyZSB3ZSB1c2luZz8gIEhvdyBiaWcgYXJlIHRoZXk/CisJc3dpdGNoKHR5cGUpCisJeworCWNhc2UgUFRZUEVfSU5MSU5FOgorCQlmbGFnID0gSU5MOworCQltYXhCbG9jayA9IE1BWF9PQlVGX0JMT0NLOworCQltYXhCdWZmID0gT0JVRl9TSVpFOworCQlwQnVmID0gcENoLT5PYnVmOworCQlicmVhazsKKwljYXNlIFBUWVBFX0JZUEFTUzoKKwkJZmxhZyA9IEJZUDsKKwkJbWF4QmxvY2sgPSBNQVhfQ0JVRl9CTE9DSzsKKwkJbWF4QnVmZiA9IENCVUZfU0laRTsKKwkJcEJ1ZiA9IHBDaC0+Q2J1ZjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC00OworCX0KKwkvLyBEZXRlcm1pbmUgdGhlIHRvdGFsIHNpemUgcmVxdWlyZWQgZm9yIGFsbCB0aGUgY29tbWFuZHMKKwl0b3RhbHNpemUgPSBibG9ja3NpemUgPSBzaXplb2YoaTJDbWRIZWFkZXIpOworCWxhc3RlbmRlZCA9IDA7CisJcHBDcyA9ICZwQ3MwOworCWZvciAoIGNvdW50ID0gbkNvbW1hbmRzOyBjb3VudDsgY291bnQtLSwgcHBDcysrKQorCXsKKwkJcENzID0gKnBwQ3M7CisJCWNudCA9IHBDcy0+bGVuZ3RoOworCQkvLyBXaWxsIGEgbmV3IGJsb2NrIGJlIG5lZWRlZCBmb3IgdGhpcyBvbmU/IAorCQkvLyBUd28gcG9zc2libGUgcmVhc29uczogdG9vCisJCS8vIGJpZyBvciBwcmV2aW91cyBjb21tYW5kIGhhcyB0byBiZSBhdCB0aGUgZW5kIG9mIGEgcGFja2V0LgorCQlpZiAoKGJsb2Nrc2l6ZSArIGNudCA+IG1heEJsb2NrKSB8fCBsYXN0ZW5kZWQpIHsKKwkJCWJsb2Nrc2l6ZSA9IHNpemVvZihpMkNtZEhlYWRlcik7CisJCQl0b3RhbHNpemUgKz0gc2l6ZW9mKGkyQ21kSGVhZGVyKTsKKwkJfQorCQl0b3RhbHNpemUgKz0gY250OworCQlibG9ja3NpemUgKz0gY250OworCisJCS8vIElmIHRoaXMgY29tbWFuZCBoYWQgdG8gZW5kIGEgYmxvY2ssIHRoZW4gd2Ugd2lsbCBtYWtlIHN1cmUgdG8KKwkJLy8gYWNjb3VudCBmb3IgaXQgc2hvdWxkIHRoZXJlIGJlIGFueSBtb3JlIGJsb2Nrcy4KKwkJbGFzdGVuZGVkID0gcENzLT5mbGFncyAmIEVORDsKKwl9CisJZm9yICg7OykgeworCQkvLyBNYWtlIHN1cmUgYW55IHBlbmRpbmcgZmx1c2ggY29tbWFuZHMgZ28gb3V0IGJlZm9yZSB3ZSBhZGQgbW9yZSBkYXRhLgorCQlpZiAoICEoIHBDaC0+Zmx1c2hfZmxhZ3MgJiYgaTJSZXRyeUZsdXNoT3V0cHV0KCBwQ2ggKSApICkgeworCQkJLy8gSG93IG11Y2ggcm9vbSAodGhpcyB0aW1lIHRocm91Z2gpID8KKwkJCXN3aXRjaCh0eXBlKSB7CisJCQljYXNlIFBUWVBFX0lOTElORToKKwkJCQlsb2NrX3Zhcl9wID0gJnBDaC0+T2J1Zl9zcGlubG9jazsKKwkJCQlXUklURV9MT0NLX0lSUVNBVkUobG9ja192YXJfcCxmbGFncyk7CisJCQkJc3R1ZmZJbmRleCA9IHBDaC0+T2J1Zl9zdHVmZjsKKwkJCQlidWZyb29tID0gcENoLT5PYnVmX3N0cmlwIC0gc3R1ZmZJbmRleDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUFRZUEVfQllQQVNTOgorCQkJCWxvY2tfdmFyX3AgPSAmcENoLT5DYnVmX3NwaW5sb2NrOworCQkJCVdSSVRFX0xPQ0tfSVJRU0FWRShsb2NrX3Zhcl9wLGZsYWdzKTsKKwkJCQlzdHVmZkluZGV4ID0gcENoLT5DYnVmX3N0dWZmOworCQkJCWJ1ZnJvb20gPSBwQ2gtPkNidWZfc3RyaXAgLSBzdHVmZkluZGV4OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLTU7CisJCQl9CisJCQlpZiAoLS1idWZyb29tIDwgMCkgeworCQkJCWJ1ZnJvb20gKz0gbWF4QnVmZjsKKwkJCX0KKworCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX1FVRVVFLCAyLCAxLCBidWZyb29tICk7CisKKwkJCS8vIENoZWNrIGZvciBvdmVyZmxvdworCQkJaWYgKHRvdGFsc2l6ZSA8PSBidWZyb29tKSB7CisJCQkJLy8gTm9ybWFsIEV4cGVjdGVkIHBhdGggLSBXZSBzdGlsbCBob2xkIExPQ0sKKwkJCQlicmVhazsgLyogZnJvbSBmb3IoKS0gRW5vdWdoIHJvb206IGdvdG8gcHJvY2VlZCAqLworCQkJfQorCQl9CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX1FVRVVFLCAzLCAxLCB0b3RhbHNpemUgKTsKKworCQkvLyBQcmVwYXJlIHRvIHdhaXQgZm9yIGJ1ZmZlcnMgdG8gZW1wdHkKKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUobG9ja192YXJfcCxmbGFncyk7IAorCQlzZXJ2aWNlT3V0Z29pbmdGaWZvKHBCKTsJLy8gRHVtcCB3aGF0IHdlIGdvdAorCisJCWlmICh0aW1lb3V0ID09IDApIHsKKwkJCXJldHVybiAwOyAgIC8vIFRpcmVkIG9mIHdhaXRpbmcKKwkJfQorCQlpZiAodGltZW91dCA+IDApCisJCQl0aW1lb3V0LS07ICAgLy8gU28gbmVnYXRpdmUgdmFsdWVzID09IGZvcmV2ZXIKKwkJCisJCWlmICghaW5faW50ZXJydXB0KCkpIHsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsJLy8gc2hvcnQgbmFwIAorCQl9IGVsc2UgeworCQkJLy8gd2UgY2Fubm90IHNjaGVkL3NsZWVwIGluIGludGVycnJ1cHQgc2lsbHkKKwkJCXJldHVybiAwOyAgIAorCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dXJuIDA7ICAgLy8gV2FrZSB1cCEgVGltZSB0byBkaWUhISEKKwkJfQorCisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19RVUVVRSwgNCwgMCApOworCisJfQkvLyBlbmQgb2YgZm9yKDs7KQorCisJLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHJvb20gYW5kIHRoZSBsb2NrIC0gc3RpY2sgdGhlbSBpbi4KKwljaGFubmVsID0gcENoLT5pbmZsLmhkLmkyc0NoYW5uZWw7CisJcEluc2VydCA9ICZwQnVmW3N0dWZmSW5kZXhdOyAgICAgLy8gUG9pbnRlciB0byBzdGFydCBvZiBwYWNrZXQKKwlwRGVzdCA9IENNRF9PRihwSW5zZXJ0KTsgICAgICAgICAvLyBQb2ludGVyIHRvIHN0YXJ0IG9mIGNvbW1hbmQKKworCS8vIFdoZW4gd2Ugc3RhcnQgY291bnRpbmcsIHRoZSBibG9jayBpcyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyCisJZm9yIChibG9ja3NpemUgPSBzaXplb2YoaTJDbWRIZWFkZXIpLCBjb3VudCA9IG5Db21tYW5kcywKKwkJCWxhc3RlbmRlZCA9IDAsIHBwQ3MgPSAmcENzMDsKKwkJY291bnQ7CisJCWNvdW50LS0sIHBwQ3MrKykKKwl7CisJCXBDcyA9ICpwcENzOyAgICAgICAgIC8vIFBvaW50cyB0byBjb21tYW5kIHByb3RvY29sIHN0cnVjdHVyZQorCisJCS8vIElmIHRoaXMgaXMgYSBib29rbWFyayByZXF1ZXN0IGNvbW1hbmQsIHBvc3QgdGhlIGZhY3QgdGhhdCBhIGJvb2ttYXJrCisJCS8vIHJlcXVlc3QgaXMgcGVuZGluZy4gTk9URSBUSElTIFRSSUNLIE9OTFkgV09SS1MgQkVDQVVTRSBDTURfQk1BUktfUkVRCisJCS8vIGhhcyBubyBwYXJhbWV0ZXJzISAgVGhlIG1vcmUgZ2VuZXJhbCBzb2x1dGlvbiB3b3VsZCBiZSB0byByZWZlcmVuY2UKKwkJLy8gcENzLT5jbWRbMF0uCisJCWlmIChwQ3MgPT0gQ01EX0JNQVJLX1JFUSkgeworCQkJcENoLT5ib29rTWFya3MrKzsKKworCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0RSQUlOLCAzMCwgMSwgcENoLT5ib29rTWFya3MgKTsKKworCQl9CisJCWNudCA9IHBDcy0+bGVuZ3RoOworCisJCS8vIElmIHRoaXMgY29tbWFuZCB3b3VsZCBwdXQgdXMgb3ZlciB0aGUgbWF4aW11bSBibG9jayBzaXplIG9yIAorCQkvLyBpZiB0aGUgbGFzdCBjb21tYW5kIGhhZCB0byBiZSBhdCB0aGUgZW5kIG9mIGEgYmxvY2ssIHdlIGVuZAorCQkvLyB0aGUgZXhpc3RpbmcgYmxvY2sgaGVyZSBhbmQgc3RhcnQgYSBuZXcgb25lLgorCQlpZiAoKGJsb2Nrc2l6ZSArIGNudCA+IG1heEJsb2NrKSB8fCBsYXN0ZW5kZWQpIHsKKworCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX1FVRVVFLCA1LCAwICk7CisKKwkJCVBUWVBFX09GKHBJbnNlcnQpID0gdHlwZTsKKwkJCUNIQU5ORUxfT0YocEluc2VydCkgPSBjaGFubmVsOworCQkJLy8gY291bnQgaGVyZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBoZWFkZXIKKwkJCUNNRF9DT1VOVF9PRihwSW5zZXJ0KSA9IGJsb2Nrc2l6ZSAtIHNpemVvZihpMkNtZEhlYWRlcik7CisJCQlzdHVmZkluZGV4ICs9IGJsb2Nrc2l6ZTsKKwkJCWlmKHN0dWZmSW5kZXggPj0gbWF4QnVmZikgeworCQkJCXN0dWZmSW5kZXggPSAwOworCQkJCXBJbnNlcnQgPSBwQnVmOworCQkJfQorCQkJcEluc2VydCA9ICZwQnVmW3N0dWZmSW5kZXhdOyAgLy8gUG9pbnRlciB0byBzdGFydCBvZiBuZXh0IHBrdAorCQkJcERlc3QgPSBDTURfT0YocEluc2VydCk7CisJCQlibG9ja3NpemUgPSBzaXplb2YoaTJDbWRIZWFkZXIpOworCQl9CisJCS8vIE5vdyB3ZSBrbm93IHRoZXJlIGlzIHJvb20gZm9yIHRoaXMgb25lIGluIHRoZSBjdXJyZW50IGJsb2NrCisKKwkJYmxvY2tzaXplICs9IGNudDsgICAgICAgLy8gVG90YWwgYnl0ZXMgaW4gdGhpcyBjb21tYW5kCisJCXBTb3VyY2UgPSBwQ3MtPmNtZDsgICAgIC8vIENvcHkgdGhlIGNvbW1hbmQgaW50byB0aGUgYnVmZmVyCisJCXdoaWxlIChjbnQtLSkgeworCQkJKnBEZXN0KysgPSAqcFNvdXJjZSsrOworCQl9CisJCS8vIElmIHRoaXMgY29tbWFuZCBoYWQgdG8gZW5kIGEgYmxvY2ssIHRoZW4gd2Ugd2lsbCBtYWtlIHN1cmUgdG8gYWNjb3VudAorCQkvLyBmb3IgaXQgc2hvdWxkIHRoZXJlIGJlIGFueSBtb3JlIGJsb2Nrcy4KKwkJbGFzdGVuZGVkID0gcENzLT5mbGFncyAmIEVORDsKKwl9CS8vIGVuZCBmb3IKKwkvLyBDbGVhbiB1cCB0aGUgZmluYWwgYmxvY2sgYnkgd3JpdGluZyBoZWFkZXIsIGV0YworCisJUFRZUEVfT0YocEluc2VydCkgPSB0eXBlOworCUNIQU5ORUxfT0YocEluc2VydCkgPSBjaGFubmVsOworCS8vIGNvdW50IGhlcmUgZG9lcyBub3QgaW5jbHVkZSB0aGUgaGVhZGVyCisJQ01EX0NPVU5UX09GKHBJbnNlcnQpID0gYmxvY2tzaXplIC0gc2l6ZW9mKGkyQ21kSGVhZGVyKTsKKwlzdHVmZkluZGV4ICs9IGJsb2Nrc2l6ZTsKKwlpZihzdHVmZkluZGV4ID49IG1heEJ1ZmYpIHsKKwkJc3R1ZmZJbmRleCA9IDA7CisJCXBJbnNlcnQgPSBwQnVmOworCX0KKwkvLyBVcGRhdGVzIHRoZSBpbmRleCwgYW5kIHBvc3QgdGhlIG5lZWQgZm9yIHNlcnZpY2UuIFdoZW4gYWRkaW5nIHRoZXNlIHRvCisJLy8gdGhlIHF1ZXVlIG9mIGNoYW5uZWxzLCB3ZSB0dXJuIG9mZiB0aGUgaW50ZXJydXB0IHdoaWxlIGRvaW5nIHNvLAorCS8vIGJlY2F1c2UgYXQgaW50ZXJydXB0IGxldmVsIHdlIG1pZ2h0IHdhbnQgdG8gcHVzaCBhIGNoYW5uZWwgYmFjayB0byB0aGUKKwkvLyBlbmQgb2YgdGhlIHF1ZXVlLgorCXN3aXRjaCh0eXBlKQorCXsKKwljYXNlIFBUWVBFX0lOTElORToKKwkJcENoLT5PYnVmX3N0dWZmID0gc3R1ZmZJbmRleDsgIC8vIFN0b3JlIGJ1ZmZlciBwb2ludGVyCisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPk9idWZfc3BpbmxvY2ssZmxhZ3MpOyAKKworCQlwQi0+ZGVidWdJbmxpbmVRdWV1ZWQrKzsKKwkJLy8gQWRkIHRoZSBjaGFubmVsIHBvaW50ZXIgdG8gbGlzdCBvZiBjaGFubmVscyBuZWVkaW5nIHNlcnZpY2UgKGZpcnN0CisJCS8vIGNvbWUuLi4pLCBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlLgorCQlpMlF1ZXVlTmVlZHMocEIsIHBDaCwgTkVFRF9JTkxJTkUpOworCQlicmVhazsKKworCWNhc2UgUFRZUEVfQllQQVNTOgorCQlwQ2gtPkNidWZfc3R1ZmYgPSBzdHVmZkluZGV4OyAgLy8gU3RvcmUgYnVmZmVyIHBvaW50ZXIKKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+Q2J1Zl9zcGlubG9jayxmbGFncyk7IAorCisJCXBCLT5kZWJ1Z0J5cGFzc1F1ZXVlZCsrOworCQkvLyBBZGQgdGhlIGNoYW5uZWwgcG9pbnRlciB0byBsaXN0IG9mIGNoYW5uZWxzIG5lZWRpbmcgc2VydmljZSAoZmlyc3QKKwkJLy8gY29tZS4uLiksIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUuCisJCWkyUXVldWVOZWVkcyhwQiwgcENoLCBORUVEX0JZUEFTUyk7CisJCWJyZWFrOworCX0KKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19RVUVVRSwgSVRSQ19SRVRVUk4sIDEsIG5Db21tYW5kcyApOworCisJcmV0dXJuIG5Db21tYW5kczsgLy8gR29vZCBzdGF0dXM6IG51bWJlciBvZiBjb21tYW5kcyBzZW50Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMkdldFN0YXR1cyhwQ2gscmVzZXRCaXRzKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGNoYW5uZWwgc3RydWN0dXJlCisvLyAgICAgICAgICAgICBCaXQgbWFwIG9mIHN0YXR1cyBiaXRzIHRvIGNsZWFyCisvLyBSZXR1cm5zOiAgICBCaXQgbWFwIG9mIGN1cnJlbnQgc3RhdHVzIGJpdHMKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vIFJldHVybnMgdGhlIHN0YXRlIG9mIGRhdGEgc2V0IHNpZ25hbHMsIGFuZCB3aGV0aGVyIGEgYnJlYWsgaGFzIGJlZW4gcmVjZWl2ZWQsCisvLyAoc2VlIGkybGliLmggZm9yIGJpdC1tYXBwZWQgcmVzdWx0KS4gcmVzZXRCaXRzIGlzIGEgYml0LW1hcCBvZiBhbnkgc3RhdHVzCisvLyBiaXRzIHRvIGJlIGNsZWFyZWQ6IEkyX0JSSywgSTJfUEFSLCBJMl9GUkEsIEkyX09WUiwuLi4gVGhlc2UgYXJlIGNsZWFyZWQKKy8vIEFGVEVSIHRoZSBjb25kaXRpb24gaXMgcGFzc2VkLiBJZiBwQ2ggZG9lcyBub3QgcG9pbnQgdG8gYSB2YWxpZCBjaGFubmVsLAorLy8gcmV0dXJucyAtMSAod2hpY2ggd291bGQgYmUgaW1wb3NzaWJsZSBvdGhlcndpc2UuCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraTJHZXRTdGF0dXMoaTJDaGFuU3RyUHRyIHBDaCwgaW50IHJlc2V0Qml0cykKK3sKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJaTJlQm9yZFN0clB0ciBwQjsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19TVEFUVVMsIElUUkNfRU5URVIsIDIsIHBDaC0+ZGF0YVNldEluLCByZXNldEJpdHMgKTsKKworCS8vIE1ha2Ugc3VyZSB0aGUgY2hhbm5lbCBleGlzdHMsIG90aGVyd2lzZSBkbyBub3RoaW5nICovCisJaWYgKCAhaTJWYWxpZGF0ZSAoIHBDaCApICkKKwkJcmV0dXJuIC0xOworCisJcEIgPSBwQ2gtPnBNeUJvcmQ7CisKKwlzdGF0dXMgPSBwQ2gtPmRhdGFTZXRJbjsKKworCS8vIENsZWFyIGFueSBzcGVjaWZpZWQgZXJyb3IgYml0czogYnV0IG5vdGUgdGhhdCBvbmx5IGFjdHVhbCBlcnJvciBiaXRzIGNhbgorCS8vIGJlIGNsZWFyZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIHBhc3NlZC4KKwlpZiAocmVzZXRCaXRzKQorCXsKKwkJcENoLT5kYXRhU2V0SW4gJj0gfihyZXNldEJpdHMgJiAoSTJfQlJLIHwgSTJfUEFSIHwgSTJfRlJBIHwgSTJfT1ZSKSk7CisJCXBDaC0+ZGF0YVNldEluICY9IH4oSTJfRERDRCB8IEkyX0RDVFMgfCBJMl9ERFNSIHwgSTJfRFJJKTsKKwl9CisKKwlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU1RBVFVTLCBJVFJDX1JFVFVSTiwgMSwgcENoLT5kYXRhU2V0SW4gKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMklucHV0KHBDaHBEZXN0LGNvdW50KQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGNoYW5uZWwgc3RydWN0dXJlCisvLyAgICAgICAgICAgICBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisvLyAgICAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorLy8gUmV0dXJuczogICAgTnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIGZvciBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8gU3RyaXBzIGRhdGEgZnJvbSB0aGUgaW5wdXQgYnVmZmVyIGFuZCB3cml0ZXMgaXQgdG8gcERlc3QuIElmIHRoZXJlIGlzIGEKKy8vIGNvbGxvc2FsIGJsdW5kZXIsIChpbnZhbGlkIHN0cnVjdHVyZSBwb2ludGVycyBvciB0aGUgbGlrZSksIHJldHVybnMgLTEuCisvLyBPdGhlcndpc2UsIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2kySW5wdXQoaTJDaGFuU3RyUHRyIHBDaCkKK3sKKwlpbnQgYW1vdW50VG9Nb3ZlOworCXVuc2lnbmVkIHNob3J0IHN0cmlwSW5kZXg7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0lOUFVULCBJVFJDX0VOVEVSLCAwKTsKKworCS8vIEVuc3VyZSBjaGFubmVsIHN0cnVjdHVyZSBzZWVtcyByZWFsCisJaWYgKCAhaTJWYWxpZGF0ZSggcENoICkgKSB7CisJCWNvdW50ID0gLTE7CisJCWdvdG8gaTJJbnB1dF9leGl0OworCX0KKwlXUklURV9MT0NLX0lSUVNBVkUoJnBDaC0+SWJ1Zl9zcGlubG9jayxmbGFncyk7CisKKwkvLyBpbml0aWFsaXplIHNvbWUgYWNjZWxlcmF0b3JzIGFuZCBwcml2YXRlIGNvcGllcworCXN0cmlwSW5kZXggPSBwQ2gtPklidWZfc3RyaXA7CisKKwljb3VudCA9IHBDaC0+SWJ1Zl9zdHVmZiAtIHN0cmlwSW5kZXg7CisKKwkvLyBJZiBidWZmZXIgaXMgZW1wdHkgb3IgcmVxdWVzdGVkIGRhdGEgY291bnQgd2FzIDAsICh0cml2aWFsIGNhc2UpIHJldHVybgorCS8vIHdpdGhvdXQgYW55IGZ1cnRoZXIgdGhvdWdodC4KKwlpZiAoIGNvdW50ID09IDAgKSB7CisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPklidWZfc3BpbmxvY2ssZmxhZ3MpOworCQlnb3RvIGkySW5wdXRfZXhpdDsKKwl9CisJLy8gQWRqdXN0IGZvciBidWZmZXIgd3JhcAorCWlmICggY291bnQgPCAwICkgeworCQljb3VudCArPSBJQlVGX1NJWkU7CisJfQorCS8vIERvbid0IGdpdmUgbW9yZSB0aGFuIGNhbiBiZSB0YWtlbiBieSB0aGUgbGluZSBkaXNjaXBsaW5lCisJYW1vdW50VG9Nb3ZlID0gcENoLT5wVFRZLT5sZGlzYy5yZWNlaXZlX3Jvb20oIHBDaC0+cFRUWSApOworCWlmIChjb3VudCA+IGFtb3VudFRvTW92ZSkgeworCQljb3VudCA9IGFtb3VudFRvTW92ZTsKKwl9CisJLy8gSG93IG11Y2ggY291bGQgd2UgY29weSB3aXRob3V0IGEgd3JhcD8KKwlhbW91bnRUb01vdmUgPSBJQlVGX1NJWkUgLSBzdHJpcEluZGV4OworCisJaWYgKGFtb3VudFRvTW92ZSA+IGNvdW50KSB7CisJCWFtb3VudFRvTW92ZSA9IGNvdW50OworCX0KKwkvLyBNb3ZlIHRoZSBmaXJzdCBibG9jaworCXBDaC0+cFRUWS0+bGRpc2MucmVjZWl2ZV9idWYoIHBDaC0+cFRUWSwgCisJCSAmKHBDaC0+SWJ1ZltzdHJpcEluZGV4XSksIE5VTEwsIGFtb3VudFRvTW92ZSApOworCS8vIElmIHdlIG5lZWRlZCB0byB3cmFwLCBkbyB0aGUgc2Vjb25kIGRhdGEgbW92ZQorCWlmIChjb3VudCA+IGFtb3VudFRvTW92ZSkgeworCQlwQ2gtPnBUVFktPmxkaXNjLnJlY2VpdmVfYnVmKCBwQ2gtPnBUVFksIAorCQkgcENoLT5JYnVmLCBOVUxMLCBjb3VudCAtIGFtb3VudFRvTW92ZSApOworCX0KKwkvLyBCdW1wIGFuZCB3cmFwIHRoZSBzdHJpcEluZGV4IGFsbCBhdCBvbmNlIGJ5IHRoZSBhbW91bnQgb2YgZGF0YSByZWFkLiBUaGlzCisJLy8gbWV0aG9kIGlzIGdvb2QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBkYXRhIHdhcyBpbiBvbmUgb3IgdHdvIHBpZWNlcy4KKwlzdHJpcEluZGV4ICs9IGNvdW50OworCWlmIChzdHJpcEluZGV4ID49IElCVUZfU0laRSkgeworCQlzdHJpcEluZGV4IC09IElCVUZfU0laRTsKKwl9CisJcENoLT5JYnVmX3N0cmlwID0gc3RyaXBJbmRleDsKKworCS8vIFVwZGF0ZSBvdXIgZmxvdyBjb250cm9sIGluZm9ybWF0aW9uIGFuZCBwb3NzaWJseSBxdWV1ZSBvdXJzZWx2ZXMgdG8gc2VuZAorCS8vIGl0LCBkZXBlbmRpbmcgb24gaG93IG11Y2ggZGF0YSBoYXMgYmVlbiBzdHJpcHBlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIGEKKwkvLyBwYWNrZXQgd2FzIHNlbnQuCisJcENoLT5pbmZsLmFzb2YgKz0gY291bnQ7CisKKwlpZiAoKHBDaC0+c2luY2VMYXN0RmxvdyArPSBjb3VudCkgPj0gcENoLT53aGVuU2VuZEZsb3cpIHsKKwkJcENoLT5zaW5jZUxhc3RGbG93IC09IHBDaC0+d2hlblNlbmRGbG93OworCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5JYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwkJaTJRdWV1ZU5lZWRzKHBDaC0+cE15Qm9yZCwgcENoLCBORUVEX0ZMT1cpOworCX0gZWxzZSB7CisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPklidWZfc3BpbmxvY2ssZmxhZ3MpOworCX0KKworaTJJbnB1dF9leGl0OgorCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0lOUFVULCBJVFJDX1JFVFVSTiwgMSwgY291bnQpOworCisJcmV0dXJuIGNvdW50OworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaTJJbnB1dEZsdXNoKHBDaCkKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBjaGFubmVsIHN0cnVjdHVyZQorLy8gUmV0dXJuczogICAgTnVtYmVyIG9mIGJ5dGVzIHN0cmlwcGVkLCBvciAtMSBmb3IgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vIFN0cmlwcyBhbnkgZGF0YSBmcm9tIHRoZSBpbnB1dCBidWZmZXIuIElmIHRoZXJlIGlzIGEgY29sbG9zYWwgYmx1bmRlciwKKy8vIChpbnZhbGlkIHN0cnVjdHVyZSBwb2ludGVycyBvciB0aGUgbGlrZSksIHJldHVybnMgLTEuIE90aGVyd2lzZSwgcmV0dXJucyB0aGUKKy8vIG51bWJlciBvZiBieXRlcyBzdHJpcHBlZC4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpMklucHV0Rmx1c2goaTJDaGFuU3RyUHRyIHBDaCkKK3sKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8vIEVuc3VyZSBjaGFubmVsIHN0cnVjdHVyZSBzZWVtcyByZWFsCisJaWYgKCAhaTJWYWxpZGF0ZSAoIHBDaCApICkKKwkJcmV0dXJuIC0xOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0lOUFVULCAxMCwgMCk7CisKKwlXUklURV9MT0NLX0lSUVNBVkUoJnBDaC0+SWJ1Zl9zcGlubG9jayxmbGFncyk7CisJY291bnQgPSBwQ2gtPklidWZfc3R1ZmYgLSBwQ2gtPklidWZfc3RyaXA7CisKKwkvLyBBZGp1c3QgZm9yIGJ1ZmZlciB3cmFwCisJaWYgKGNvdW50IDwgMCkgeworCQljb3VudCArPSBJQlVGX1NJWkU7CisJfQorCisJLy8gRXhwZWRpZW50IHdheSB0byB6ZXJvIG91dCB0aGUgYnVmZmVyCisJcENoLT5JYnVmX3N0cmlwID0gcENoLT5JYnVmX3N0dWZmOworCisKKwkvLyBVcGRhdGUgb3VyIGZsb3cgY29udHJvbCBpbmZvcm1hdGlvbiBhbmQgcG9zc2libHkgcXVldWUgb3Vyc2VsdmVzIHRvIHNlbmQKKwkvLyBpdCwgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIGRhdGEgaGFzIGJlZW4gc3RyaXBwZWQgc2luY2UgdGhlIGxhc3QgdGltZSBhCisJLy8gcGFja2V0IHdhcyBzZW50LgorCisJcENoLT5pbmZsLmFzb2YgKz0gY291bnQ7CisKKwlpZiAoIChwQ2gtPnNpbmNlTGFzdEZsb3cgKz0gY291bnQpID49IHBDaC0+d2hlblNlbmRGbG93ICkKKwl7CisJCXBDaC0+c2luY2VMYXN0RmxvdyAtPSBwQ2gtPndoZW5TZW5kRmxvdzsKKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+SWJ1Zl9zcGlubG9jayxmbGFncyk7CisJCWkyUXVldWVOZWVkcyhwQ2gtPnBNeUJvcmQsIHBDaCwgTkVFRF9GTE9XKTsKKwl9IGVsc2UgeworCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5JYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwl9CisKKwlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfSU5QVVQsIDE5LCAxLCBjb3VudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMklucHV0QXZhaWxhYmxlKHBDaCkKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBjaGFubmVsIHN0cnVjdHVyZQorLy8gUmV0dXJuczogICAgTnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSwgb3IgLTEgZm9yIGVycm9yCisvLworLy8gRGVzY3JpcHRpb246CisvLyBJZiB0aGVyZSBpcyBhIGNvbGxvc2FsIGJsdW5kZXIsIChpbnZhbGlkIHN0cnVjdHVyZSBwb2ludGVycyBvciB0aGUgbGlrZSksCisvLyByZXR1cm5zIC0xLiBPdGhlcndpc2UsIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzdHJpcHBlZC4gT3RoZXJ3aXNlLAorLy8gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNpZiAwCitzdGF0aWMgaW50CitpMklucHV0QXZhaWxhYmxlKGkyQ2hhblN0clB0ciBwQ2gpCit7CisJaW50IGNvdW50OworCisJLy8gRW5zdXJlIGNoYW5uZWwgc3RydWN0dXJlIHNlZW1zIHJlYWwKKwlpZiAoICFpMlZhbGlkYXRlICggcENoICkgKSByZXR1cm4gLTE7CisKKworCS8vIGluaXRpYWxpemUgc29tZSBhY2NlbGVyYXRvcnMgYW5kIHByaXZhdGUgY29waWVzCisJUkVBRF9MT0NLX0lSUVNBVkUoJnBDaC0+SWJ1Zl9zcGlubG9jayxmbGFncyk7CisJY291bnQgPSBwQ2gtPklidWZfc3R1ZmYgLSBwQ2gtPklidWZfc3RyaXA7CisJUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5JYnVmX3NwaW5sb2NrLGZsYWdzKTsKKworCS8vIEFkanVzdCBmb3IgYnVmZmVyIHdyYXAKKwlpZiAoY291bnQgPCAwKQorCXsKKwkJY291bnQgKz0gSUJVRl9TSVpFOworCX0KKworCXJldHVybiBjb3VudDsKK30KKyNlbmRpZiAKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyT3V0cHV0KHBDaCwgcFNvdXJjZSwgY291bnQpCisvLyBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisvLyAgICAgICAgICAgICBQb2ludGVyIHRvIHNvdXJjZSBkYXRhCisvLyAgICAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gc2VuZAorLy8gUmV0dXJuczogICAgTnVtYmVyIG9mIGJ5dGVzIHNlbnQsIG9yIC0xIGZvciBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8gUXVldWVzIHRoZSBkYXRhIGF0IHBTb3VyY2UgdG8gYmUgc2VudCBhcyBkYXRhIHBhY2tldHMgdG8gdGhlIGJvYXJkLiBJZiB0aGVyZQorLy8gaXMgYSBjb2xsb3NhbCBibHVuZGVyLCAoaW52YWxpZCBzdHJ1Y3R1cmUgcG9pbnRlcnMgb3IgdGhlIGxpa2UpLCByZXR1cm5zIC0xLgorLy8gT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gV2hhdCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoCisvLyByb29tIGZvciBhbGwgdGhlIGRhdGE/IElmIHBDaC0+Y2hhbm5lbE9wdGlvbnMgJiBDT19OQkxPQ0tfV1JJVEUgaXMgc2V0LCB0aGVuCisvLyB3ZSB0cmFuc2ZlciBhcyBtYW55IGNoYXJhY3RlcnMgYXMgd2UgY2FuIG5vdywgdGhlbiByZXR1cm4uIElmIHRoaXMgYml0IGlzCisvLyBjbGVhciAoZGVmYXVsdCksIHJvdXRpbmUgd2lsbCBzcGluIGFsb25nIHVudGlsIGFsbCB0aGUgZGF0YSBpcyBidWZmZXJlZC4KKy8vIFNob3VsZCB0aGlzIG9jY3VyLCB0aGUgMS1tcyBkZWxheSByb3V0aW5lIGlzIGNhbGxlZCB3aGlsZSB3YWl0aW5nIHRvIGF2b2lkCisvLyBhcHBsaWNhdGlvbnMgdGhhdCBvbmUgY2Fubm90IGJyZWFrIG91dCBvZi4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpMk91dHB1dChpMkNoYW5TdHJQdHIgcENoLCBjb25zdCBjaGFyICpwU291cmNlLCBpbnQgY291bnQsIGludCB1c2VyICkKK3sKKwlpMmVCb3JkU3RyUHRyIHBCOworCXVuc2lnbmVkIGNoYXIgKnBJbnNlcnQ7CisJaW50IGFtb3VudFRvTW92ZTsKKwlpbnQgY291bnRPcmlnaW5hbCA9IGNvdW50OworCXVuc2lnbmVkIHNob3J0IGNoYW5uZWw7CisJdW5zaWduZWQgc2hvcnQgc3R1ZmZJbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IDA7CisKKwlpbnQgYmFpbG91dCA9IDEwOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX09VVFBVVCwgSVRSQ19FTlRFUiwgMiwgY291bnQsIHVzZXIgKTsKKworCS8vIEVuc3VyZSBjaGFubmVsIHN0cnVjdHVyZSBzZWVtcyByZWFsCisJaWYgKCAhaTJWYWxpZGF0ZSAoIHBDaCApICkgCisJCXJldHVybiAtMTsKKworCS8vIGluaXRpYWxpemUgc29tZSBhY2NlbGVyYXRvcnMgYW5kIHByaXZhdGUgY29waWVzCisJcEIgPSBwQ2gtPnBNeUJvcmQ7CisJY2hhbm5lbCA9IHBDaC0+aW5mbC5oZC5pMnNDaGFubmVsOworCisJLy8gSWYgdGhlIGJvYXJkIGhhcyBnb25lIGZhdGFsLCByZXR1cm4gYmFkLCBhbmQgYWxzbyBoaXQgdGhlIHRyYXAgcm91dGluZSBpZgorCS8vIGl0IGV4aXN0cy4KKwlpZiAocEItPmkyZUZhdGFsKSB7CisJCWlmIChwQi0+aTJlRmF0YWxUcmFwKSB7CisJCQkoKihwQiktPmkyZUZhdGFsVHJhcCkocEIpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisJLy8gUHJvY2VlZCBhcyB0aG91Z2ggd2Ugd291bGQgZG8gZXZlcnl0aGluZworCXdoaWxlICggY291bnQgPiAwICkgeworCisJCS8vIEhvdyBtdWNoIHJvb20gaW4gb3V0cHV0IGJ1ZmZlciBpcyB0aGVyZT8KKwkJUkVBRF9MT0NLX0lSUVNBVkUoJnBDaC0+T2J1Zl9zcGlubG9jayxmbGFncyk7CisJCWFtb3VudFRvTW92ZSA9IHBDaC0+T2J1Zl9zdHJpcCAtIHBDaC0+T2J1Zl9zdHVmZiAtIDE7CisJCVJFQURfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+T2J1Zl9zcGlubG9jayxmbGFncyk7CisJCWlmIChhbW91bnRUb01vdmUgPCAwKSB7CisJCQlhbW91bnRUb01vdmUgKz0gT0JVRl9TSVpFOworCQl9CisJCS8vIFN1YnRyYWN0IG9mZiB0aGUgaGVhZGVycyBzaXplIGFuZCBzZWUgaG93IG11Y2ggcm9vbSB0aGVyZSBpcyBmb3IgcmVhbAorCQkvLyBkYXRhLiBJZiB0aGlzIGlzIG5lZ2F0aXZlLCB3ZSB3aWxsIGRpc2NvdmVyIGxhdGVyLgorCQlhbW91bnRUb01vdmUgLT0gc2l6ZW9mIChpMkRhdGFIZWFkZXIpOworCisJCS8vIERvbid0IG1vdmUgbW9yZSAobm93KSB0aGFuIGNhbiBnbyBpbiBhIHNpbmdsZSBwYWNrZXQKKwkJaWYgKCBhbW91bnRUb01vdmUgPiAoaW50KShNQVhfT0JVRl9CTE9DSyAtIHNpemVvZihpMkRhdGFIZWFkZXIpKSApIHsKKwkJCWFtb3VudFRvTW92ZSA9IE1BWF9PQlVGX0JMT0NLIC0gc2l6ZW9mKGkyRGF0YUhlYWRlcik7CisJCX0KKwkJLy8gRG9uJ3QgbW92ZSBtb3JlIHRoYW4gdGhlIGNvdW50IHdlIHdlcmUgZ2l2ZW4KKwkJaWYgKGFtb3VudFRvTW92ZSA+IGNvdW50KSB7CisJCQlhbW91bnRUb01vdmUgPSBjb3VudDsKKwkJfQorCQkvLyBOb3cgd2Uga25vdyBob3cgbXVjaCB3ZSBtdXN0IG1vdmU6IE5CIGJlY2F1c2UgdGhlIHJpbmcgYnVmZmVycyBoYXZlCisJCS8vIGFuIG92ZXJmbG93IGFyZWEgYXQgdGhlIGVuZCwgd2UgbmVlZG4ndCB3b3JyeSBhYm91dCB3cmFwcGluZyBpbiB0aGUKKwkJLy8gbWlkZGxlIG9mIGEgcGFja2V0LgorCisvLyBTbWFsbCBXSU5ET1cgaGVyZSB3aXRoIG5vIExPQ0sgYnV0IEkgY2FuJ3QgY2FsbCBGbHVzaCB3aXRoIExPQ0sKKy8vIFdlIHdvdWxkIGJlIGZsdXNoaW5nIChvciBlbmRpbmcgZmx1c2gpIGFueXdheQorCisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19PVVRQVVQsIDEwLCAxLCBhbW91bnRUb01vdmUgKTsKKworCQlpZiAoICEocENoLT5mbHVzaF9mbGFncyAmJiBpMlJldHJ5Rmx1c2hPdXRwdXQocENoKSApIAorCQkJCSYmIGFtb3VudFRvTW92ZSA+IDAgKQorCQl7CisJCQlXUklURV9MT0NLX0lSUVNBVkUoJnBDaC0+T2J1Zl9zcGlubG9jayxmbGFncyk7CisJCQlzdHVmZkluZGV4ID0gcENoLT5PYnVmX3N0dWZmOworICAgICAgCisJCQkvLyBIYWQgcm9vbSB0byBtb3ZlIHNvbWUgZGF0YTogZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSBibG9jayBzaXplLAorCQkJLy8gYnVmZmVyIHNwYWNlLCBvciB3aGF0IHdhcyB0aGUgbGltaXRpbmcgZmFjdG9yLi4uCisJCQlwSW5zZXJ0ID0gJihwQ2gtPk9idWZbc3R1ZmZJbmRleF0pOworCisJCQkvLyBTZXQgdXAgdGhlIGhlYWRlcgorCQkJQ0hBTk5FTF9PRihwSW5zZXJ0KSAgICAgPSBjaGFubmVsOworCQkJUFRZUEVfT0YocEluc2VydCkgICAgICAgPSBQVFlQRV9EQVRBOworCQkJVEFHX09GKHBJbnNlcnQpICAgICAgICAgPSAwOworCQkJSURfT0YocEluc2VydCkgICAgICAgICAgPSBJRF9PUkRJTkFSWV9EQVRBOworCQkJREFUQV9DT1VOVF9PRihwSW5zZXJ0KSAgPSBhbW91bnRUb01vdmU7CisKKwkJCS8vIE1vdmUgdGhlIGRhdGEKKwkJCWlmICggdXNlciApIHsKKwkJCQlyYyA9IGNvcHlfZnJvbV91c2VyKChjaGFyKikoREFUQV9PRihwSW5zZXJ0KSksIHBTb3VyY2UsCisJCQkJCQlhbW91bnRUb01vdmUgKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtY3B5KCAoY2hhciopKERBVEFfT0YocEluc2VydCkpLCBwU291cmNlLCBhbW91bnRUb01vdmUgKTsKKwkJCX0KKwkJCS8vIEFkanVzdCBwb2ludGVycyBhbmQgaW5kaWNlcworCQkJcFNvdXJjZQkJCQkJKz0gYW1vdW50VG9Nb3ZlOworCQkJcENoLT5PYnVmX2NoYXJfY291bnQJKz0gYW1vdW50VG9Nb3ZlOworCQkJc3R1ZmZJbmRleCAJCQkJKz0gYW1vdW50VG9Nb3ZlICsgc2l6ZW9mKGkyRGF0YUhlYWRlcik7CisJCQljb3VudCAJCQkJCS09IGFtb3VudFRvTW92ZTsKKworCQkJaWYgKHN0dWZmSW5kZXggPj0gT0JVRl9TSVpFKSB7CisJCQkJc3R1ZmZJbmRleCA9IDA7CisJCQl9CisJCQlwQ2gtPk9idWZfc3R1ZmYgPSBzdHVmZkluZGV4OworCisJCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5PYnVmX3NwaW5sb2NrLGZsYWdzKTsKKworCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX09VVFBVVCwgMTMsIDEsIHN0dWZmSW5kZXggKTsKKworCQl9IGVsc2UgeworCisJCQkvLyBDYW5ub3QgbW92ZSBkYXRhCisJCQkvLyBiZWN1eiB3ZSBuZWVkIHRvIHN0dWZmIGEgZmx1c2ggCisJCQkvLyBvciBhbW91bnQgdG8gbW92ZSBpcyA8PSAwCisKKwkJCWlwMnRyYWNlKENIQU5OLCBJVFJDX09VVFBVVCwgMTQsIDMsCisJCQkJYW1vdW50VG9Nb3ZlLCAgcEItPmkyZUZpZm9SZW1haW5zLAorCQkJCXBCLT5pMmVXYWl0aW5nRm9yRW1wdHlGaWZvICk7CisKKwkJCS8vIFB1dCB0aGlzIGNoYW5uZWwgYmFjayBvbiBxdWV1ZQorCQkJLy8gdGhpcyB1bHRpbWF0bHkgZ2V0cyBtb3JlIGRhdGEgb3Igd2FrZXMgd3JpdGUgb3V0cHV0CisJCQlpMlF1ZXVlTmVlZHMocEIsIHBDaCwgTkVFRF9JTkxJTkUpOworCisJCQlpZiAoIHBCLT5pMmVXYWl0aW5nRm9yRW1wdHlGaWZvICkgeworCisJCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX09VVFBVVCwgMTYsIDAgKTsKKworCQkJCS8vIG9yIHNjaGVkdWxlCisJCQkJaWYgKCFpbl9pbnRlcnJ1cHQoKSkgeworCisJCQkJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19PVVRQVVQsIDYxLCAwICk7CisKKwkJCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQkJCXNjaGVkdWxlX3RpbWVvdXQoMik7CisJCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsKKworCQkJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfT1VUUFVULCA2MiwgMCApOworCisJCQkJCS8vIGxldCBpbnRlcnJ1cHQgaW4gPSBXQVMgcmVzdG9yZV9mbGFncygpCisJCQkJCS8vIFdlIGhvbGQgbm8gbG9jayBub3IgaXMgaXJxIG9mZiBhbnltb3JlPz8/CisJCQkJCQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7ICAgLy8gZnJvbSB3aGlsZShjb3VudCkKKwkJCX0KKwkJCWVsc2UgaWYgKCBwQi0+aTJlRmlmb1JlbWFpbnMgPCAzMiAmJiAhcEItPmkyZVR4TWFpbEVtcHR5ICggcEIgKSApCisJCQl7CisJCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX09VVFBVVCwgMTksIDIsCisJCQkJCXBCLT5pMmVGaWZvUmVtYWlucywKKwkJCQkJcEItPmkyZVR4TWFpbEVtcHR5ICk7CisKKwkJCQlicmVhazsgICAvLyBmcm9tIHdoaWxlKGNvdW50KQorCQkJfSBlbHNlIGlmICggcENoLT5jaGFubmVsTmVlZHMgJiBORUVEX0NSRURJVCApIHsKKworCQkJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19PVVRQVVQsIDIyLCAwICk7CisKKwkJCQlicmVhazsgICAvLyBmcm9tIHdoaWxlKGNvdW50KQorCQkJfSBlbHNlIGlmICggLS1iYWlsb3V0KSB7CisKKwkJCQkvLyBUcnkgdG8gdGhyb3cgbW9yZSB0aGluZ3MgKG1heWJlIG5vdCB1cykgaW4gdGhlIGZpZm8gaWYgd2UncmUKKwkJCQkvLyBub3QgYWxyZWFkeSB3YWl0aW5nIGZvciBpdC4KKwkKKwkJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfT1VUUFVULCAyMCwgMCApOworCisJCQkJc2VydmljZU91dGdvaW5nRmlmbyhwQik7CisJCQkJLy9icmVhazsgIENPTlRJTlVFOworCQkJfSBlbHNlIHsKKwkJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfT1VUUFVULCAyMSwgMywKKwkJCQkJcEItPmkyZUZpZm9SZW1haW5zLAorCQkJCQlwQi0+aTJlT3V0TWFpbFdhaXRpbmcsCisJCQkJCXBCLT5pMmVXYWl0aW5nRm9yRW1wdHlGaWZvICk7CisKKwkJCQlicmVhazsgICAvLyBmcm9tIHdoaWxlKGNvdW50KQorCQkJfQorCQl9CisJfSAvLyBFbmQgb2Ygd2hpbGUoY291bnQpCisKKwlpMlF1ZXVlTmVlZHMocEIsIHBDaCwgTkVFRF9JTkxJTkUpOworCisJLy8gV2UgZHJvcCB0aHJvdWdoIGVpdGhlciB3aGVuIHRoZSBjb3VudCBleHBpcmVzLCBvciB3aGVuIHRoZXJlIGlzIHNvbWUKKwkvLyBjb3VudCBsZWZ0LCBidXQgdGhlcmUgd2FzIGEgbm9uLWJsb2NraW5nIHdyaXRlLgorCWlmIChjb3VudE9yaWdpbmFsID4gY291bnQpIHsKKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfT1VUUFVULCAxNywgMiwgY291bnRPcmlnaW5hbCwgY291bnQgKTsKKworCQlzZXJ2aWNlT3V0Z29pbmdGaWZvKCBwQiApOworCX0KKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19PVVRQVVQsIElUUkNfUkVUVVJOLCAyLCBjb3VudE9yaWdpbmFsLCBjb3VudCApOworCisJcmV0dXJuIGNvdW50T3JpZ2luYWwgLSBjb3VudDsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyRmx1c2hPdXRwdXQocENoKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGNoYW5uZWwgc3RydWN0dXJlCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLyBTZW5kcyBieXBhc3MgY29tbWFuZCB0byBzdGFydCBmbHVzaGluZyAod2FpdGluZyBwb3NzaWJseSBmb3JldmVyIHVudGlsIHRoZXJlCisvLyBpcyByb29tKSwgdGhlbiBzZW5kcyBpbmxpbmUgY29tbWFuZCB0byBzdG9wIGZsdXNoaW5nIG91dHB1dCwgKGFnYWluIHdhaXRpbmcKKy8vIHBvc3NpYmx5IGZvcmV2ZXIpLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbmxpbmUgdm9pZAoraTJGbHVzaE91dHB1dChpMkNoYW5TdHJQdHIgcENoKQoreworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0ZMVVNILCAxLCAxLCBwQ2gtPmZsdXNoX2ZsYWdzICk7CisKKwlpZiAocENoLT5mbHVzaF9mbGFncykKKwkJcmV0dXJuOworCisJaWYgKCAxICE9IGkyUXVldWVDb21tYW5kcyhQVFlQRV9CWVBBU1MsIHBDaCwgMCwgMSwgQ01EX1NUQVJURkwpICkgeworCQlwQ2gtPmZsdXNoX2ZsYWdzID0gU1RBUlRGTF9GTEFHOwkJLy8gRmFpbGVkIC0gZmxhZyBmb3IgbGF0ZXIKKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfRkxVU0gsIDIsIDAgKTsKKworCX0gZWxzZSBpZiAoIDEgIT0gaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAwLCAxLCBDTURfU1RPUEZMKSApIHsKKwkJcENoLT5mbHVzaF9mbGFncyA9IFNUT1BGTF9GTEFHOwkJLy8gRmFpbGVkIC0gZmxhZyBmb3IgbGF0ZXIKKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfRkxVU0gsIDMsIDAgKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgCitpMlJldHJ5Rmx1c2hPdXRwdXQoaTJDaGFuU3RyUHRyIHBDaCkKK3sKKwlpbnQgb2xkX2ZsYWdzID0gcENoLT5mbHVzaF9mbGFnczsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19GTFVTSCwgMTQsIDEsIG9sZF9mbGFncyApOworCisJcENoLT5mbHVzaF9mbGFncyA9IDA7CS8vIENsZWFyIGZsYWcgc28gd2UgY2FuIGF2b2lkIHJlY3Vyc2lvbgorCQkJCQkJCQkJLy8gYW5kIHF1ZXVlIHRoZSBjb21tYW5kcworCisJaWYgKCBvbGRfZmxhZ3MgJiBTVEFSVEZMX0ZMQUcgKSB7CisJCWlmICggMSA9PSBpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfQllQQVNTLCBwQ2gsIDAsIDEsIENNRF9TVEFSVEZMKSApIHsKKwkJCW9sZF9mbGFncyA9IFNUT1BGTF9GTEFHOwkvL1N1Y2Nlc3MgLSBzZW5kIHN0b3AgZmx1c2gKKwkJfSBlbHNlIHsKKwkJCW9sZF9mbGFncyA9IFNUQVJURkxfRkxBRzsJLy9GYWlsdXJlIC0gRmxhZyBmb3IgcmV0cnkgbGF0ZXIKKwkJfQorCisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19GTFVTSCwgMTUsIDEsIG9sZF9mbGFncyApOworCisJfQorCWlmICggb2xkX2ZsYWdzICYgU1RPUEZMX0ZMQUcgKSB7CisJCWlmICgxID09IGkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMCwgMSwgQ01EX1NUT1BGTCkpIHsKKwkJCW9sZF9mbGFncyA9IDA7CS8vIFN1Y2Nlc3MgLSBjbGVhciBmbGFncworCQl9CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0ZMVVNILCAxNiwgMSwgb2xkX2ZsYWdzICk7CisJfQorCXBDaC0+Zmx1c2hfZmxhZ3MgPSBvbGRfZmxhZ3M7CisKKwlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfRkxVU0gsIDE3LCAxLCBvbGRfZmxhZ3MgKTsKKworCXJldHVybiBvbGRfZmxhZ3M7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMkRyYWluT3V0cHV0KHBDaCx0aW1lb3V0KQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGNoYW5uZWwgc3RydWN0dXJlCisvLyAgICAgICAgICAgICBNYXhpbXVtIHBlcmlvZCB0byB3YWl0CisvLyBSZXR1cm5zOiAgICA/CisvLworLy8gRGVzY3JpcHRpb246CisvLyBVc2VzIHRoZSBib29rbWFyayByZXF1ZXN0IGNvbW1hbmQgdG8gYXNrIHRoZSBib2FyZCB0byBzZW5kIGEgYm9va21hcmsgYmFjayBhcworLy8gc29vbiBhcyBhbGwgdGhlIGRhdGEgaXMgY29tcGxldGVseSBzZW50LgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkCitpMkRyYWluV2FrZXVwKGkyQ2hhblN0clB0ciBwQ2gpCit7CisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0RSQUlOLCAxMCwgMSwgcENoLT5Cb29rbWFya1RpbWVyLmV4cGlyZXMgKTsKKworCXBDaC0+Qm9va21hcmtUaW1lci5leHBpcmVzID0gMDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoICZwQ2gtPnBCb29rbWFya1dhaXQgKTsKK30KKworc3RhdGljIHZvaWQKK2kyRHJhaW5PdXRwdXQoaTJDaGFuU3RyUHRyIHBDaCwgaW50IHRpbWVvdXQpCit7CisJd2FpdF9xdWV1ZV90IHdhaXQ7CisJaTJlQm9yZFN0clB0ciBwQjsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19EUkFJTiwgSVRSQ19FTlRFUiwgMSwgcENoLT5Cb29rbWFya1RpbWVyLmV4cGlyZXMpOworCisJcEIgPSBwQ2gtPnBNeUJvcmQ7CisJLy8gSWYgdGhlIGJvYXJkIGhhcyBnb25lIGZhdGFsLCByZXR1cm4gYmFkLCAKKwkvLyBhbmQgYWxzbyBoaXQgdGhlIHRyYXAgcm91dGluZSBpZiBpdCBleGlzdHMuCisJaWYgKHBCLT5pMmVGYXRhbCkgeworCQlpZiAocEItPmkyZUZhdGFsVHJhcCkgeworCQkJKCoocEIpLT5pMmVGYXRhbFRyYXApKHBCKTsKKwkJfQorCQlyZXR1cm47CisJfQorCWlmICgodGltZW91dCA+IDApICYmIChwQ2gtPkJvb2ttYXJrVGltZXIuZXhwaXJlcyA9PSAwICkpIHsKKwkJLy8gT25lIHBlciBjdXN0b21lciAoY2hhbm5lbCkKKwkJaW5pdF90aW1lciggJihwQ2gtPkJvb2ttYXJrVGltZXIpICk7CisJCXBDaC0+Qm9va21hcmtUaW1lci5leHBpcmVzICA9IGppZmZpZXMgKyB0aW1lb3V0OworCQlwQ2gtPkJvb2ttYXJrVGltZXIuZnVuY3Rpb24gPSAodm9pZCopKHVuc2lnbmVkIGxvbmcpaTJEcmFpbldha2V1cDsKKwkJcENoLT5Cb29rbWFya1RpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpcENoOworCisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19EUkFJTiwgMSwgMSwgcENoLT5Cb29rbWFya1RpbWVyLmV4cGlyZXMgKTsKKworCQlhZGRfdGltZXIoICYocENoLT5Cb29rbWFya1RpbWVyKSApOworCX0KKwkKKwlpMlF1ZXVlQ29tbWFuZHMoIFBUWVBFX0lOTElORSwgcENoLCAtMSwgMSwgQ01EX0JNQVJLX1JFUSApOworCisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCWFkZF93YWl0X3F1ZXVlKCYocENoLT5wQm9va21hcmtXYWl0KSwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX0lOVEVSUlVQVElCTEUgKTsKKworCXNlcnZpY2VPdXRnb2luZ0ZpZm8oIHBCICk7CisJCisJc2NoZWR1bGUoKTsJLy8gTm93IHdlIHRha2Ugb3VyIGludGVycnVwdGlibGUgc2xlZXAgb24KKworCS8vIENsZWFuIHVwIHRoZSBxdWV1ZQorCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX1JVTk5JTkcgKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmKHBDaC0+cEJvb2ttYXJrV2FpdCksICZ3YWl0KTsKKworCS8vIGlmIGV4cGlyZXMgPT0gMCB0aGVuIHRpbWVyIHBvcGVkLCB0aGVuIGRvIG5vdCBuZWVkIHRvIGRlbF90aW1lcgorCWlmICgodGltZW91dCA+IDApICYmIHBDaC0+Qm9va21hcmtUaW1lci5leHBpcmVzICYmIAorCSAgICAgICAgICAgICAgICAgICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIHBDaC0+Qm9va21hcmtUaW1lci5leHBpcmVzKSkgeworCQlkZWxfdGltZXIoICYocENoLT5Cb29rbWFya1RpbWVyKSApOworCQlwQ2gtPkJvb2ttYXJrVGltZXIuZXhwaXJlcyA9IDA7CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0RSQUlOLCAzLCAxLCBwQ2gtPkJvb2ttYXJrVGltZXIuZXhwaXJlcyApOworCisJfQorCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19EUkFJTiwgSVRSQ19SRVRVUk4sIDEsIHBDaC0+Qm9va21hcmtUaW1lci5leHBpcmVzICk7CisJcmV0dXJuOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaTJPdXRwdXRGcmVlKHBDaCkKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBjaGFubmVsIHN0cnVjdHVyZQorLy8gUmV0dXJuczogICAgU3BhY2UgaW4gb3V0cHV0IGJ1ZmZlcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8gUmV0dXJucyAtMSBpZiB2ZXJ5IGdyb3NzIGVycm9yLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgYW1vdW50IG9mIGJ5dGVzIHN0aWxsCisvLyBmcmVlIGluIHRoZSBvdXRwdXQgYnVmZmVyLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2kyT3V0cHV0RnJlZShpMkNoYW5TdHJQdHIgcENoKQoreworCWludCBhbW91bnRUb01vdmU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8vIEVuc3VyZSBjaGFubmVsIHN0cnVjdHVyZSBzZWVtcyByZWFsCisJaWYgKCAhaTJWYWxpZGF0ZSAoIHBDaCApICkgeworCQlyZXR1cm4gLTE7CisJfQorCVJFQURfTE9DS19JUlFTQVZFKCZwQ2gtPk9idWZfc3BpbmxvY2ssZmxhZ3MpOworCWFtb3VudFRvTW92ZSA9IHBDaC0+T2J1Zl9zdHJpcCAtIHBDaC0+T2J1Zl9zdHVmZiAtIDE7CisJUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5PYnVmX3NwaW5sb2NrLGZsYWdzKTsKKworCWlmIChhbW91bnRUb01vdmUgPCAwKSB7CisJCWFtb3VudFRvTW92ZSArPSBPQlVGX1NJWkU7CisJfQorCS8vIElmIHRoaXMgaXMgbmVnYXRpdmUsIHdlIHdpbGwgZGlzY292ZXIgbGF0ZXIKKwlhbW91bnRUb01vdmUgLT0gc2l6ZW9mKGkyRGF0YUhlYWRlcik7CisKKwlyZXR1cm4gKGFtb3VudFRvTW92ZSA8IDApID8gMCA6IGFtb3VudFRvTW92ZTsKK30KK3N0YXRpYyB2b2lkCisKK2lwMl9vd2FrZSggUFRUWSB0cCkKK3sKKwlpMkNoYW5TdHJQdHIgIHBDaDsKKworCWlmICh0cCA9PSBOVUxMKSByZXR1cm47CisKKwlwQ2ggPSB0cC0+ZHJpdmVyX2RhdGE7CisKKwlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU0lDTUQsIDEwLCAyLCB0cC0+ZmxhZ3MsCisJCQkoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSApOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICggJnRwLT53cml0ZV93YWl0ICk7CisJaWYgKCAoIHRwLT5mbGFncyAmICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApICkgCisJICAmJiB0cC0+bGRpc2Mud3JpdGVfd2FrZXVwICkKKwl7CisJCSh0cC0+bGRpc2Mud3JpdGVfd2FrZXVwKSAoIHRwICk7CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX1NJQ01ELCAxMSwgMCApOworCisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NldF9iYXVkX3BhcmFtcyhpMmVCb3JkU3RyUHRyIHBCKSAKK3sKKwlpbnQgaSxqOworCWkyQ2hhblN0clB0ciAgKnBDaDsKKworCXBDaCA9IChpMkNoYW5TdHJQdHIgKikgcEItPmkyZUNoYW5uZWxQdHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUJTX01BWF9CT1hFUzsgaSsrKSB7CisJCWlmIChwQi0+Y2hhbm5lbEJ0eXBlcy5iaWRfdmFsdWVbaV0pIHsKKwkJCWlmIChCSURfSEFTXzY1NChwQi0+Y2hhbm5lbEJ0eXBlcy5iaWRfdmFsdWVbaV0pKSB7CisJCQkJZm9yIChqID0gMDsgaiA8IEFCU19CSUdHRVNUX0JPWDsgaisrKSB7CisJCQkJCWlmIChwQ2hbaSoxNitqXSA9PSBOVUxMKQorCQkJCQkJYnJlYWs7CisJCQkJCShwQ2hbaSoxNitqXSktPkJhdWRCYXNlICAgID0gOTIxNjAwOwkvLyBNQVggZm9yIFNUNjU0CisJCQkJCShwQ2hbaSoxNitqXSktPkJhdWREaXZpc29yID0gOTY7CisJCQkJfQorCQkJfSBlbHNlIHsJLy8gaGFzIGNpcnJ1cyBjZDE0MDAKKwkJCQlmb3IgKGogPSAwOyBqIDwgQUJTX0JJR0dFU1RfQk9YOyBqKyspIHsKKwkJCQkJaWYgKHBDaFtpKjE2K2pdID09IE5VTEwpCisJCQkJCQlicmVhazsKKwkJCQkJKHBDaFtpKjE2K2pdKS0+QmF1ZEJhc2UgICAgPSAxMTUyMDA7CS8vIE1BWCBmb3IgQ0QxNDAwCisJCQkJCShwQ2hbaSoxNitqXSktPkJhdWREaXZpc29yID0gMTI7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaTJTdHJpcEZpZm8ocEIpCisvLyBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGEgYm9hcmQgc3RydWN0dXJlCisvLyBSZXR1cm5zOiAgICA/CisvLworLy8gRGVzY3JpcHRpb246CisvLyBTdHJpcHMgYWxsIHRoZSBhdmFpbGFibGUgZGF0YSBmcm9tIHRoZSBpbmNvbWluZyBGSUZPLCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mCisvLyBwYWNrZXQsIGFuZCBlaXRoZXIgYnVmZmVycyB0aGUgZGF0YSBvciBkb2VzIHdoYXQgbmVlZHMgdG8gYmUgZG9uZS4KKy8vCisvLyBOb3RlIHRoZXJlIGlzIG5vIG92ZXJmbG93IGNoZWNraW5nIGhlcmU6IGlmIHRoZSBib2FyZCBzZW5kcyBtb3JlIGRhdGEgdGhhbiBpdAorLy8gb3VnaHQgdG8sIHdlIHdpbGwgbm90IGRldGVjdCBpdCBoZXJlLCBidXQgYmxpbmRseSBvdmVyZmxvdy4uLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gQSBidWZmZXIgZm9yIHJlYWRpbmcgaW4gYmxvY2tzIGZvciB1bmtub3duIGNoYW5uZWxzCitzdGF0aWMgdW5zaWduZWQgY2hhciBqdW5rQnVmZmVyW0lCVUZfU0laRV07CisKKy8vIEEgYnVmZmVyIHRvIHJlYWQgaW4gYSBzdGF0dXMgcGFja2V0LiBCZWNhdXNlIG9mIHRoZSBzaXplIG9mIHRoZSBjb3VudCBmaWVsZAorLy8gZm9yIHRoZXNlIHRoaW5ncywgdGhlIG1heGltdW0gcGFja2V0IHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gTUFYX0NNRF9QQUNLX1NJWkUKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNtZEJ1ZmZlcltNQVhfQ01EX1BBQ0tfU0laRSArIDRdOworCisvLyBUaGlzIHRhYmxlIGNoYW5nZXMgdGhlIGJpdCBvcmRlciBmcm9tIE1TUiBvcmRlciBnaXZlbiBieSBTVEFUX01PREVNIHBhY2tldCB0bworLy8gc3RhdHVzIGJpdHMgdXNlZCBpbiBvdXIgbGlicmFyeS4KK3N0YXRpYyBjaGFyIHhsYXREc3NbMTZdID0geworMCAgICAgIHwgMCAgICAgfCAwICAgICAgfCAwICAgICAgLAorMCAgICAgIHwgMCAgICAgfCAwICAgICAgfCBJMl9DVFMgLAorMCAgICAgIHwgMCAgICAgfCBJMl9EU1IgfCAwICAgICAgLAorMCAgICAgIHwgMCAgICAgfCBJMl9EU1IgfCBJMl9DVFMgLAorMCAgICAgIHwgSTJfUkkgfCAwICAgICAgfCAwICAgICAgLAorMCAgICAgIHwgSTJfUkkgfCAwICAgICAgfCBJMl9DVFMgLAorMCAgICAgIHwgSTJfUkkgfCBJMl9EU1IgfCAwICAgICAgLAorMCAgICAgIHwgSTJfUkkgfCBJMl9EU1IgfCBJMl9DVFMgLAorSTJfRENEIHwgMCAgICAgfCAwICAgICAgfCAwICAgICAgLAorSTJfRENEIHwgMCAgICAgfCAwICAgICAgfCBJMl9DVFMgLAorSTJfRENEIHwgMCAgICAgfCBJMl9EU1IgfCAwICAgICAgLAorSTJfRENEIHwgMCAgICAgfCBJMl9EU1IgfCBJMl9DVFMgLAorSTJfRENEIHwgSTJfUkkgfCAwICAgICAgfCAwICAgICAgLAorSTJfRENEIHwgSTJfUkkgfCAwICAgICAgfCBJMl9DVFMgLAorSTJfRENEIHwgSTJfUkkgfCBJMl9EU1IgfCAwICAgICAgLAorSTJfRENEIHwgSTJfUkkgfCBJMl9EU1IgfCBJMl9DVFMgfTsKKworc3RhdGljIGlubGluZSB2b2lkCitpMlN0cmlwRmlmbyhpMmVCb3JkU3RyUHRyIHBCKQoreworCWkyQ2hhblN0clB0ciBwQ2g7CisJaW50IGNoYW5uZWw7CisJaW50IGNvdW50OworCXVuc2lnbmVkIHNob3J0IHN0dWZmSW5kZXg7CisJaW50IGFtb3VudFRvUmVhZDsKKwl1bnNpZ25lZCBjaGFyICpwYywgKnBjTGltaXQ7CisJdW5zaWduZWQgY2hhciB1YzsKKwl1bnNpZ25lZCBjaGFyIGRzc19jaGFuZ2U7CisJdW5zaWduZWQgbG9uZyBiZmxhZ3MsY2ZsYWdzOworCisvLwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX1NGSUZPLCBJVFJDX0VOVEVSLCAwICk7CisKKwl3aGlsZSAoSEFTX0lOUFVUKHBCKSkgeworLy8JCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfU0ZJRk8sIDIsIDAgKTsKKworCQkvLyBQcm9jZXNzIHBhY2tldCBmcm9tIGZpZm8gYSBvbmUgYXRvbWljIHVuaXQKKwkJV1JJVEVfTE9DS19JUlFTQVZFKCZwQi0+cmVhZF9maWZvX3NwaW5sb2NrLGJmbGFncyk7CisgICAKKwkJLy8gVGhlIGZpcnN0IHdvcmQgKG9yIHR3byBieXRlcykgd2lsbCBoYXZlIGNoYW5uZWwgbnVtYmVyIGFuZCB0eXBlIG9mCisJCS8vIHBhY2tldCwgcG9zc2libHkgb3RoZXIgaW5mb3JtYXRpb24KKwkJcEItPmkyZUxlYWRvZmZXb3JkWzBdID0gaWlSZWFkV29yZChwQik7CisKKwkJc3dpdGNoKFBUWVBFX09GKHBCLT5pMmVMZWFkb2ZmV29yZCkpCisJCXsKKwkJY2FzZSBQVFlQRV9EQVRBOgorCQkJcEItPmdvdF9pbnB1dCA9IDE7CisKKy8vCQkJaXAydHJhY2UgKElUUkNfTk9fUE9SVCwgSVRSQ19TRklGTywgMywgMCApOworCisJCQljaGFubmVsID0gQ0hBTk5FTF9PRihwQi0+aTJlTGVhZG9mZldvcmQpOyAvKiBTdG9yZSBjaGFubmVsICovCisJCQljb3VudCA9IGlpUmVhZFdvcmQocEIpOyAgICAgICAgICAvKiBDb3VudCBpcyBpbiB0aGUgbmV4dCB3b3JkICovCisKKy8vIE5FVzogQ2hlY2sgdGhlIGNvdW50IGZvciBzYW5pdHkhIFNob3VsZCB0aGUgaGFyZHdhcmUgZmFpbCwgb3VyIGRlYXRoCisvLyBpcyBtb3JlIHBsZWFzYW50LiBXaGlsZSBhbiBvdmVyc2l6ZSBjaGFubmVsIGlzIGFjY2VwdGFibGUgKGp1c3QgbW9yZQorLy8gdGhhbiB0aGUgZHJpdmVyIHN1cHBvcnRzKSwgYW4gb3Zlci1sZW5ndGggY291bnQgY2xlYXJseSBtZWFucyB3ZSBhcmUKKy8vIHNpY2shCisJCQlpZiAoICgodW5zaWduZWQgaW50KWNvdW50KSA+IElCVUZfU0laRSApIHsKKwkJCQlwQi0+aTJlRmF0YWwgPSAyOworCQkJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+cmVhZF9maWZvX3NwaW5sb2NrLGJmbGFncyk7CisJCQkJcmV0dXJuOyAgICAgLyogQmFpbCBvdXQgQVNBUCAqLworCQkJfQorCQkJLy8gQ2hhbm5lbCBpcyBpbGxlZ2FsbHkgYmlnID8KKwkJCWlmICgoY2hhbm5lbCA+PSBwQi0+aTJlQ2hhbm5lbENudCkgfHwKKwkJCQkoTlVMTD09KHBDaCA9ICgoaTJDaGFuU3RyUHRyKilwQi0+aTJlQ2hhbm5lbFB0cilbY2hhbm5lbF0pKSkKKwkJCXsKKwkJCQlpaVJlYWRCdWYocEIsIGp1bmtCdWZmZXIsIGNvdW50KTsKKwkJCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcEItPnJlYWRfZmlmb19zcGlubG9jayxiZmxhZ3MpOworCQkJCWJyZWFrOyAgICAgICAgIC8qIEZyb20gc3dpdGNoOiByZWFkeSBmb3IgbmV4dCBwYWNrZXQgKi8KKwkJCX0KKworCQkJLy8gQ2hhbm5lbCBzaG91bGQgYmUgdmFsaWQsIHRoZW4KKworCQkJLy8gSWYgdGhpcyBpcyBhIGhvdC1rZXksIG1lcmVseSBwb3N0IGl0cyByZWNlaXB0IGZvciBub3cuIFRoZXNlIGFyZQorCQkJLy8gYWx3YXlzIHN1cHBvc2VkIHRvIGJlIDEtYnl0ZSBwYWNrZXRzLCBzbyB3ZSB3b24ndCBldmVuIGNoZWNrIHRoZQorCQkJLy8gY291bnQuIEFsc28gd2Ugd2lsbCBwb3N0IGFuIGFja25vd2xlZGdlbWVudCB0byB0aGUgYm9hcmQgc28gdGhhdAorCQkJLy8gbW9yZSBkYXRhIGNhbiBiZSBmb3J0aGNvbWluZy4gTm90ZSB0aGF0IHdlIGFyZSBub3QgdHJ5aW5nIHRvIHVzZQorCQkJLy8gdGhlc2Ugc2VxdWVuY2VzIGluIHRoaXMgZHJpdmVyLCBtZXJlbHkgdG8gcm9idXN0bHkgaWdub3JlIHRoZW0uCisJCQlpZihJRF9PRihwQi0+aTJlTGVhZG9mZldvcmQpID09IElEX0hPVF9LRVkpCisJCQl7CisJCQkJcENoLT5ob3RLZXlJbiA9IGlpUmVhZFdvcmQocEIpICYgMHhmZjsKKwkJCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcEItPnJlYWRfZmlmb19zcGlubG9jayxiZmxhZ3MpOworCQkJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9CWVBBU1MsIHBDaCwgMCwgMSwgQ01EX0hPVEFDSyk7CisJCQkJYnJlYWs7ICAgLyogRnJvbSB0aGUgc3dpdGNoOiByZWFkeSBmb3IgbmV4dCBwYWNrZXQgKi8KKwkJCX0KKworCQkJLy8gTm9ybWFsIGRhdGEhIFdlIGNydWRlbHkgYXNzdW1lIHRoZXJlIGlzIHJvb20gZm9yIHRoZSBkYXRhIGluIG91cgorCQkJLy8gYnVmZmVyIGJlY2F1c2UgdGhlIGJvYXJkIHdvdWxkbid0IGhhdmUgZXhjZWVkZWQgaGlzIGNyZWRpdCBsaW1pdC4KKwkJCVdSSVRFX0xPQ0tfSVJRU0FWRSgmcENoLT5JYnVmX3NwaW5sb2NrLGNmbGFncyk7CisJCQkJCQkJCQkJCQkJLy8gV2UgaGF2ZSAyIGxvY2tzIG5vdworCQkJc3R1ZmZJbmRleCA9IHBDaC0+SWJ1Zl9zdHVmZjsKKwkJCWFtb3VudFRvUmVhZCA9IElCVUZfU0laRSAtIHN0dWZmSW5kZXg7CisJCQlpZiAoYW1vdW50VG9SZWFkID4gY291bnQpCisJCQkJYW1vdW50VG9SZWFkID0gY291bnQ7CisKKwkJCS8vIHN0dWZmSW5kZXggd291bGQgaGF2ZSBiZWVuIGFscmVhZHkgYWRqdXN0ZWQgc28gdGhlcmUgd291bGQgCisJCQkvLyBhbHdheXMgYmUgcm9vbSBmb3IgYXQgbGVhc3Qgb25lLCBhbmQgY291bnQgaXMgYWx3YXlzIGF0IGxlYXN0CisJCQkvLyBvbmUuCisKKwkJCWlpUmVhZEJ1ZihwQiwgJihwQ2gtPklidWZbc3R1ZmZJbmRleF0pLCBhbW91bnRUb1JlYWQpOworCQkJcENoLT5pY291bnQucnggKz0gYW1vdW50VG9SZWFkOworCisJCQkvLyBVcGRhdGUgdGhlIHN0dWZmSW5kZXggYnkgdGhlIGFtb3VudCBvZiBkYXRhIG1vdmVkLiBOb3RlIHdlIGNvdWxkCisJCQkvLyBuZXZlciBhc2sgZm9yIG1vcmUgZGF0YSB0aGFuIHdvdWxkIGp1c3QgZml0LiBIb3dldmVyLCB3ZSBtaWdodAorCQkJLy8gaGF2ZSByZWFkIGluIG9uZSBtb3JlIGJ5dGUgdGhhbiB3ZSB3YW50ZWQgYmVjYXVzZSB0aGUgcmVhZAorCQkJLy8gcm91bmRzIHVwIHRvIGV2ZW4gYnl0ZXMuIElmIHRoaXMgYnl0ZSBpcyBvbiB0aGUgZW5kIG9mIHRoZQorCQkJLy8gcGFja2V0LCBhbmQgaXMgcGFkZGluZywgd2UgaWdub3JlIGl0LiBJZiB0aGUgYnl0ZSBpcyBwYXJ0IG9mCisJCQkvLyB0aGUgYWN0dWFsIGRhdGEsIHdlIG5lZWQgdG8gbW92ZSBpdC4KKworCQkJc3R1ZmZJbmRleCArPSBhbW91bnRUb1JlYWQ7CisKKwkJCWlmIChzdHVmZkluZGV4ID49IElCVUZfU0laRSkgeworCQkJCWlmICgoYW1vdW50VG9SZWFkICYgMSkgJiYgKGNvdW50ID4gYW1vdW50VG9SZWFkKSkgeworCQkJCQlwQ2gtPklidWZbMF0gPSBwQ2gtPklidWZbSUJVRl9TSVpFXTsKKwkJCQkJYW1vdW50VG9SZWFkKys7CisJCQkJCXN0dWZmSW5kZXggPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCXN0dWZmSW5kZXggPSAwOworCQkJCX0KKwkJCX0KKworCQkJLy8gSWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdCBvdmVyLCByZWFkIGl0IGFzIHdlbGwKKwkJCWlmIChjb3VudCA+IGFtb3VudFRvUmVhZCkgeworCQkJCWFtb3VudFRvUmVhZCA9IGNvdW50IC0gYW1vdW50VG9SZWFkOworCQkJCWlpUmVhZEJ1ZihwQiwgJihwQ2gtPklidWZbc3R1ZmZJbmRleF0pLCBhbW91bnRUb1JlYWQpOworCQkJCXBDaC0+aWNvdW50LnJ4ICs9IGFtb3VudFRvUmVhZDsKKwkJCQlzdHVmZkluZGV4ICs9IGFtb3VudFRvUmVhZDsKKwkJCX0KKworCQkJLy8gVXBkYXRlIHN0dWZmIGluZGV4CisJCQlwQ2gtPklidWZfc3R1ZmYgPSBzdHVmZkluZGV4OworCQkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+SWJ1Zl9zcGlubG9jayxjZmxhZ3MpOworCQkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBCLT5yZWFkX2ZpZm9fc3BpbmxvY2ssYmZsYWdzKTsKKworI2lmZGVmIFVTRV9JUQorCQkJc2NoZWR1bGVfd29yaygmcENoLT50cXVldWVfaW5wdXQpOworI2Vsc2UKKwkJCWRvX2lucHV0KHBDaCk7CisjZW5kaWYKKworCQkJLy8gTm90ZSB3ZSBkbyBub3QgbmVlZCB0byBtYWludGFpbiBhbnkgZmxvdy1jb250cm9sIGNyZWRpdHMgYXQgdGhpcworCQkJLy8gdGltZTogIGlmIHdlIHdlcmUgdG8gaW5jcmVtZW50IC5hc29mIGFuZCBkZWNyZW1lbnQgLnJvb20sIHRoZXJlCisJCQkvLyB3b3VsZCBiZSBubyBuZXQgZWZmZWN0LiBJbnN0ZWFkLCB3aGVuIHdlIHN0cmlwIGRhdGEsIHdlIHdpbGwKKwkJCS8vIGluY3JlbWVudCAuYXNvZiBhbmQgbGVhdmUgLnJvb20gdW5jaGFuZ2VkLgorCisJCQlicmVhazsgICAvLyBGcm9tIHN3aXRjaDogcmVhZHkgZm9yIG5leHQgcGFja2V0CisKKwkJY2FzZSBQVFlQRV9TVEFUVVM6CisJCQlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX1NGSUZPLCA0LCAwICk7CisgICAgICAKKwkJCWNvdW50ID0gQ01EX0NPVU5UX09GKHBCLT5pMmVMZWFkb2ZmV29yZCk7CisKKwkJCWlpUmVhZEJ1ZihwQiwgY21kQnVmZmVyLCBjb3VudCk7CisJCQkvLyBXZSBjYW4gcmVsZWFzZSBlYXJseSB3aXRoIGJ1ZmZlciBncmFiCisJCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcEItPnJlYWRfZmlmb19zcGlubG9jayxiZmxhZ3MpOworCisJCQlwYyA9IGNtZEJ1ZmZlcjsKKwkJCXBjTGltaXQgPSAmKGNtZEJ1ZmZlcltjb3VudF0pOworCisJCQl3aGlsZSAocGMgPCBwY0xpbWl0KSB7CisJCQkJY2hhbm5lbCA9ICpwYysrOworCisJCQkJaXAydHJhY2UgKGNoYW5uZWwsIElUUkNfU0ZJRk8sIDcsIDIsIGNoYW5uZWwsICpwYyApOworCisJCQkJLyogY2hlY2sgZm9yIHZhbGlkIGNoYW5uZWwgKi8KKwkJCQlpZiAoY2hhbm5lbCA8IHBCLT5pMmVDaGFubmVsQ250CisJCQkJCSAmJiAKKwkJCQkJIChwQ2ggPSAoKChpMkNoYW5TdHJQdHIqKXBCLT5pMmVDaGFubmVsUHRyKVtjaGFubmVsXSkpICE9IE5VTEwKKwkJCQkJKQorCQkJCXsKKwkJCQkJZHNzX2NoYW5nZSA9IDA7CisKKwkJCQkJc3dpdGNoICh1YyA9ICpwYysrKQorCQkJCQl7CisJCQkJCS8qIEJyZWFrcyBhbmQgbW9kZW0gc2lnbmFscyBhcmUgZWFzeToganVzdCB1cGRhdGUgc3RhdHVzICovCisJCQkJCWNhc2UgU1RBVF9DVFNfVVA6CisJCQkJCQlpZiAoICEocENoLT5kYXRhU2V0SW4gJiBJMl9DVFMpICkKKwkJCQkJCXsKKwkJCQkJCQlwQ2gtPmRhdGFTZXRJbiB8PSBJMl9EQ1RTOworCQkJCQkJCXBDaC0+aWNvdW50LmN0cysrOworCQkJCQkJCWRzc19jaGFuZ2UgPSAxOworCQkJCQkJfQorCQkJCQkJcENoLT5kYXRhU2V0SW4gfD0gSTJfQ1RTOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTVEFUX0NUU19ETjoKKwkJCQkJCWlmICggcENoLT5kYXRhU2V0SW4gJiBJMl9DVFMgKQorCQkJCQkJeworCQkJCQkJCXBDaC0+ZGF0YVNldEluIHw9IEkyX0RDVFM7CisJCQkJCQkJcENoLT5pY291bnQuY3RzKys7CisJCQkJCQkJZHNzX2NoYW5nZSA9IDE7CisJCQkJCQl9CisJCQkJCQlwQ2gtPmRhdGFTZXRJbiAmPSB+STJfQ1RTOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTVEFUX0RDRF9VUDoKKwkJCQkJCWlwMnRyYWNlIChjaGFubmVsLCBJVFJDX01PREVNLCAxLCAxLCBwQ2gtPmRhdGFTZXRJbiApOworCisJCQkJCQlpZiAoICEocENoLT5kYXRhU2V0SW4gJiBJMl9EQ0QpICkKKwkJCQkJCXsKKwkJCQkJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfTU9ERU0sIDIsIDAgKTsKKwkJCQkJCQlwQ2gtPmRhdGFTZXRJbiB8PSBJMl9ERENEOworCQkJCQkJCXBDaC0+aWNvdW50LmRjZCsrOworCQkJCQkJCWRzc19jaGFuZ2UgPSAxOworCQkJCQkJfQorCQkJCQkJcENoLT5kYXRhU2V0SW4gfD0gSTJfRENEOworCisJCQkJCQlpcDJ0cmFjZSAoY2hhbm5lbCwgSVRSQ19NT0RFTSwgMywgMSwgcENoLT5kYXRhU2V0SW4gKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgU1RBVF9EQ0RfRE46CisJCQkJCQlpcDJ0cmFjZSAoY2hhbm5lbCwgSVRSQ19NT0RFTSwgNCwgMSwgcENoLT5kYXRhU2V0SW4gKTsKKwkJCQkJCWlmICggcENoLT5kYXRhU2V0SW4gJiBJMl9EQ0QgKQorCQkJCQkJeworCQkJCQkJCWlwMnRyYWNlIChjaGFubmVsLCBJVFJDX01PREVNLCA1LCAwICk7CisJCQkJCQkJcENoLT5kYXRhU2V0SW4gfD0gSTJfRERDRDsKKwkJCQkJCQlwQ2gtPmljb3VudC5kY2QrKzsKKwkJCQkJCQlkc3NfY2hhbmdlID0gMTsKKwkJCQkJCX0KKwkJCQkJCXBDaC0+ZGF0YVNldEluICY9IH5JMl9EQ0Q7CisKKwkJCQkJCWlwMnRyYWNlIChjaGFubmVsLCBJVFJDX01PREVNLCA2LCAxLCBwQ2gtPmRhdGFTZXRJbiApOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTVEFUX0RTUl9VUDoKKwkJCQkJCWlmICggIShwQ2gtPmRhdGFTZXRJbiAmIEkyX0RTUikgKQorCQkJCQkJeworCQkJCQkJCXBDaC0+ZGF0YVNldEluIHw9IEkyX0REU1I7CisJCQkJCQkJcENoLT5pY291bnQuZHNyKys7CisJCQkJCQkJZHNzX2NoYW5nZSA9IDE7CisJCQkJCQl9CisJCQkJCQlwQ2gtPmRhdGFTZXRJbiB8PSBJMl9EU1I7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFNUQVRfRFNSX0ROOgorCQkJCQkJaWYgKCBwQ2gtPmRhdGFTZXRJbiAmIEkyX0RTUiApCisJCQkJCQl7CisJCQkJCQkJcENoLT5kYXRhU2V0SW4gfD0gSTJfRERTUjsKKwkJCQkJCQlwQ2gtPmljb3VudC5kc3IrKzsKKwkJCQkJCQlkc3NfY2hhbmdlID0gMTsKKwkJCQkJCX0KKwkJCQkJCXBDaC0+ZGF0YVNldEluICY9IH5JMl9EU1I7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFNUQVRfUklfVVA6CisJCQkJCQlpZiAoICEocENoLT5kYXRhU2V0SW4gJiBJMl9SSSkgKQorCQkJCQkJeworCQkJCQkJCXBDaC0+ZGF0YVNldEluIHw9IEkyX0RSSTsKKwkJCQkJCQlwQ2gtPmljb3VudC5ybmcrKzsKKwkJCQkJCQlkc3NfY2hhbmdlID0gMTsKKwkJCQkJCX0KKwkJCQkJCXBDaC0+ZGF0YVNldEluIHw9IEkyX1JJIDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgU1RBVF9SSV9ETjoKKwkJCQkJCS8vIHRvIGJlIGNvbXBhdCB3aXRoIHNlcmlhbC5jCisJCQkJCQkvL2lmICggcENoLT5kYXRhU2V0SW4gJiBJMl9SSSApCisJCQkJCQkvL3sKKwkJCQkJCS8vCXBDaC0+ZGF0YVNldEluIHw9IEkyX0RSSTsKKwkJCQkJCS8vCXBDaC0+aWNvdW50LnJuZysrOyAKKwkJCQkJCS8vCWRzc19jaGFuZ2UgPSAxOworCQkJCQkJLy99CisJCQkJCQlwQ2gtPmRhdGFTZXRJbiAmPSB+STJfUkkgOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTVEFUX0JSS19ERVQ6CisJCQkJCQlwQ2gtPmRhdGFTZXRJbiB8PSBJMl9CUks7CisJCQkJCQlwQ2gtPmljb3VudC5icmsrKzsKKwkJCQkJCWRzc19jaGFuZ2UgPSAxOworCQkJCQkJYnJlYWs7CisKKwkJCQkJLy8gQm9va21hcmtzPyBvbmUgbGVzcyByZXF1ZXN0IHdlJ3JlIHdhaXRpbmcgZm9yCisJCQkJCWNhc2UgU1RBVF9CTUFSSzoKKwkJCQkJCXBDaC0+Ym9va01hcmtzLS07CisJCQkJCQlpZiAocENoLT5ib29rTWFya3MgPD0gMCApIHsKKwkJCQkJCQlwQ2gtPmJvb2tNYXJrcyA9IDA7CisJCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCAmcENoLT5wQm9va21hcmtXYWl0ICk7CisKKwkJCQkJCWlwMnRyYWNlIChjaGFubmVsLCBJVFJDX0RSQUlOLCAyMCwgMSwgcENoLT5Cb29rbWFya1RpbWVyLmV4cGlyZXMgKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCS8vIEZsb3cgY29udHJvbCBwYWNrZXRzPyBVcGRhdGUgdGhlIG5ldyBjcmVkaXRzLCBhbmQgaWYKKwkJCQkJLy8gc29tZW9uZSB3YXMgd2FpdGluZyBmb3Igb3V0cHV0LCBxdWV1ZSBoaW0gdXAgYWdhaW4uCisJCQkJCWNhc2UgU1RBVF9GTE9XOgorCQkJCQkJcENoLT5vdXRmbC5yb29tID0KKwkJCQkJCQkoKGZsb3dTdGF0UHRyKXBjKS0+cm9vbSAtCisJCQkJCQkJKHBDaC0+b3V0ZmwuYXNvZiAtICgoZmxvd1N0YXRQdHIpcGMpLT5hc29mKTsKKworCQkJCQkJaXAydHJhY2UgKGNoYW5uZWwsIElUUkNfU1RGTFcsIDEsIDEsIHBDaC0+b3V0Zmwucm9vbSApOworCisJCQkJCQlpZiAocENoLT5jaGFubmVsTmVlZHMgJiBORUVEX0NSRURJVCkKKwkJCQkJCXsKKwkJCQkJCQlpcDJ0cmFjZSAoY2hhbm5lbCwgSVRSQ19TVEZMVywgMiwgMSwgcENoLT5jaGFubmVsTmVlZHMpOworCisJCQkJCQkJcENoLT5jaGFubmVsTmVlZHMgJj0gfk5FRURfQ1JFRElUOworCQkJCQkJCWkyUXVldWVOZWVkcyhwQiwgcENoLCBORUVEX0lOTElORSk7CisJCQkJCQkJaWYgKCBwQ2gtPnBUVFkgKQorCQkJCQkJCQlpcDJfb3dha2UocENoLT5wVFRZKTsKKwkJCQkJCX0KKworCQkJCQkJaXAydHJhY2UgKGNoYW5uZWwsIElUUkNfU1RGTFcsIDMsIDEsIHBDaC0+Y2hhbm5lbE5lZWRzKTsKKworCQkJCQkJcGMgKz0gc2l6ZW9mKGZsb3dTdGF0KTsKKwkJCQkJCWJyZWFrOworCisJCQkJCS8qIFNwZWNpYWwgcGFja2V0czogKi8KKwkJCQkJLyogSnVzdCBjb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSBjaGFubmVsIHN0cnVjdHVyZSAqLworCisJCQkJCWNhc2UgU1RBVF9TVEFUVVM6CisKKwkJCQkJCXBDaC0+Y2hhbm5lbFN0YXR1cyA9ICooKGRlYnVnU3RhdFB0cilwYyk7CisJCQkJCQlwYyArPSBzaXplb2YoZGVidWdTdGF0KTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgU1RBVF9UWENOVDoKKworCQkJCQkJcENoLT5jaGFubmVsVGNvdW50ID0gKigoY250U3RhdFB0cilwYyk7CisJCQkJCQlwYyArPSBzaXplb2YoY250U3RhdCk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFNUQVRfUlhDTlQ6CisKKwkJCQkJCXBDaC0+Y2hhbm5lbFJjb3VudCA9ICooKGNudFN0YXRQdHIpcGMpOworCQkJCQkJcGMgKz0gc2l6ZW9mKGNudFN0YXQpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTVEFUX0JPWElEUzoKKwkJCQkJCXBCLT5jaGFubmVsQnR5cGVzID0gKigoYmlkU3RhdFB0cilwYyk7CisJCQkJCQlwYyArPSBzaXplb2YoYmlkU3RhdCk7CisJCQkJCQlzZXRfYmF1ZF9wYXJhbXMocEIpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTVEFUX0hXRkFJTDoKKwkJCQkJCWkyUXVldWVDb21tYW5kcyAoUFRZUEVfSU5MSU5FLCBwQ2gsIDAsIDEsIENNRF9IV19URVNUKTsKKwkJCQkJCXBDaC0+Y2hhbm5lbEZhaWwgPSAqKChmYWlsU3RhdFB0cilwYyk7CisJCQkJCQlwYyArPSBzaXplb2YoZmFpbFN0YXQpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJLyogTm8gZXhwbGljaXQgbWF0Y2g/IHRoZW4KKwkJCQkJICogTWlnaHQgYmUgYW4gZXJyb3IgcGFja2V0Li4uCisJCQkJCSAqLworCQkJCQlkZWZhdWx0OgorCQkJCQkJc3dpdGNoICh1YyAmIFNUQVRfTU9EX0VSUk9SKQorCQkJCQkJeworCQkJCQkJY2FzZSBTVEFUX0VSUk9SOgorCQkJCQkJCWlmICh1YyAmIFNUQVRfRV9QQVJJVFkpIHsKKwkJCQkJCQkJcENoLT5kYXRhU2V0SW4gfD0gSTJfUEFSOworCQkJCQkJCQlwQ2gtPmljb3VudC5wYXJpdHkrKzsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHVjICYgU1RBVF9FX0ZSQU1JTkcpeworCQkJCQkJCQlwQ2gtPmRhdGFTZXRJbiB8PSBJMl9GUkE7CisJCQkJCQkJCXBDaC0+aWNvdW50LmZyYW1lKys7CisJCQkJCQkJfQorCQkJCQkJCWlmICh1YyAmIFNUQVRfRV9PVkVSUlVOKXsKKwkJCQkJCQkJcENoLT5kYXRhU2V0SW4gfD0gSTJfT1ZSOworCQkJCQkJCQlwQ2gtPmljb3VudC5vdmVycnVuKys7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIFNUQVRfTU9ERU06CisJCQkJCQkJLy8gdGhlIGFuc3dlciB0byBEU1NfTk9XIHJlcXVlc3QgKG5vdCBjaGFuZ2UpCisJCQkJCQkJcENoLT5kYXRhU2V0SW4gPSAocENoLT5kYXRhU2V0SW4KKwkJCQkJCQkJJiB+KEkyX1JJIHwgSTJfQ1RTIHwgSTJfRENEIHwgSTJfRFNSKSApCisJCQkJCQkJCXwgeGxhdERzc1t1YyAmIDB4Zl07CisJCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICggJnBDaC0+ZHNzX25vd193YWl0ICk7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9ICAvKiBFbmQgb2Ygc3dpdGNoIG9uIHN0YXR1cyB0eXBlICovCisJCQkJCWlmIChkc3NfY2hhbmdlKSB7CisjaWZkZWYgVVNFX0lRCisJCQkJCQlzY2hlZHVsZV93b3JrKCZwQ2gtPnRxdWV1ZV9zdGF0dXMpOworI2Vsc2UKKwkJCQkJCWRvX3N0YXR1cyhwQ2gpOworI2VuZGlmCisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSAgLyogT3IgZWxzZSwgY2hhbm5lbCBpcyBpbnZhbGlkICovCisJCQkJeworCQkJCQkvLyBFdmVuIHRob3VnaCB0aGUgY2hhbm5lbCBpcyBpbnZhbGlkLCB3ZSBtdXN0IHRlc3QgdGhlCisJCQkJCS8vIHN0YXR1cyB0byBzZWUgaG93IG11Y2ggYWRkaXRpb25hbCBkYXRhIGl0IGhhcyAodG8gYmUKKwkJCQkJLy8gc2tpcHBlZCkKKwkJCQkJc3dpdGNoICgqcGMrKykKKwkJCQkJeworCQkJCQljYXNlIFNUQVRfRkxPVzoKKwkJCQkJCXBjICs9IDQ7ICAgIC8qIFNraXAgdGhlIGRhdGEgKi8KKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gIC8vIEVuZCBvZiB3aGlsZSAodGhlcmUgaXMgc3RpbGwgc29tZSBzdGF0dXMgcGFja2V0IGxlZnQpCisJCQlicmVhazsKKworCQlkZWZhdWx0OiAvLyBOZWl0aGVyIHBhY2tldD8gc2hvdWxkIGJlIGltcG9zc2libGUKKwkJCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfU0ZJRk8sIDUsIDEsCisJCQkJUFRZUEVfT0YocEItPmkyZUxlYWRvZmZXb3JkKSApOworCisJCQlicmVhazsKKwkJfSAgLy8gRW5kIG9mIHN3aXRjaCBvbiB0eXBlIG9mIHBhY2tldHMKKwl9CS8vd2hpbGUoYm9hcmQgSEFTX0lOUFVUKQorCisJaXAydHJhY2UgKElUUkNfTk9fUE9SVCwgSVRSQ19TRklGTywgSVRSQ19SRVRVUk4sIDAgKTsKKworCS8vIFNlbmQgYWNrbm93bGVkZ2VtZW50IHRvIHRoZSBib2FyZCBldmVuIGlmIHRoZXJlIHdhcyBubyBkYXRhIQorCXBCLT5pMmVPdXRNYWlsV2FpdGluZyB8PSBNQl9JTl9TVFJJUFBFRDsKKwlyZXR1cm47Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMldyaXRlMkZpZm8ocEIsYWRkcmVzcyxjb3VudCkKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBib2FyZCBzdHJ1Y3R1cmUsIHNvdXJjZSBhZGRyZXNzLCBieXRlIGNvdW50CisvLyBSZXR1cm5zOiAgICBieXRlcyB3cml0dGVuCisvLworLy8gRGVzY3JpcHRpb246CisvLyAgV3JpdGVzIGNvdW50IGJ5dGVzIHRvIGJvYXJkIGlvIGFkZHJlc3MoaW1wbGllZCkgZnJvbSBzb3VyY2UKKy8vICBBZGp1c3RzIGNvdW50LCBsZWF2ZXMgcmVzZXJ2ZSBmb3IgbmV4dCB0aW1lIGFyb3VuZCBieXBhc3MgY21kcworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2kyV3JpdGUyRmlmbyhpMmVCb3JkU3RyUHRyIHBCLCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIGludCBjb3VudCxpbnQgcmVzZXJ2ZSkKK3sKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJV1JJVEVfTE9DS19JUlFTQVZFKCZwQi0+d3JpdGVfZmlmb19zcGlubG9jayxmbGFncyk7CisJaWYgKCFwQi0+aTJlV2FpdGluZ0ZvckVtcHR5RmlmbykgeworCQlpZiAocEItPmkyZUZpZm9SZW1haW5zID4gKGNvdW50K3Jlc2VydmUpKSB7CisJCQlwQi0+aTJlRmlmb1JlbWFpbnMgLT0gY291bnQ7CisJCQlpaVdyaXRlQnVmKHBCLCBzb3VyY2UsIGNvdW50KTsKKwkJCXBCLT5pMmVPdXRNYWlsV2FpdGluZyB8PSBNQl9PVVRfU1RVRkZFRDsKKwkJCXJjID0gIGNvdW50OworCQl9CisJfQorCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+d3JpdGVfZmlmb19zcGlubG9jayxmbGFncyk7CisJcmV0dXJuIHJjOworfQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyU3R1ZmZGaWZvQnlwYXNzKHBCKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGJvYXJkIHN0cnVjdHVyZQorLy8gUmV0dXJuczogICAgTm90aGluZworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8gU3R1ZmZzIGFzIG1hbnkgYnlwYXNzIGNvbW1hbmRzIGludG8gdGhlIGZpZm8gYXMgcG9zc2libGUuIFRoaXMgaXMgc2ltcGxlcgorLy8gdGhhbiBzdHVmZmluZyBkYXRhIG9yIGlubGluZSBjb21tYW5kcyB0byBmaWZvLCBzaW5jZSB3ZSBkbyBub3QgaGF2ZQorLy8gZmxvdy1jb250cm9sIHRvIGRlYWwgd2l0aC4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW5saW5lIHZvaWQKK2kyU3R1ZmZGaWZvQnlwYXNzKGkyZUJvcmRTdHJQdHIgcEIpCit7CisJaTJDaGFuU3RyUHRyIHBDaDsKKwl1bnNpZ25lZCBjaGFyICpwUmVtb3ZlOworCXVuc2lnbmVkIHNob3J0IHN0cmlwSW5kZXg7CisJdW5zaWduZWQgc2hvcnQgcGFja2V0U2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCBwYWRkZWRTaXplOworCXVuc2lnbmVkIHNob3J0IG5vdENsb2dnZWQgPSAxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbnQgYmFpbG91dCA9IDEwMDA7CisKKwkvLyBDb250aW51ZSBwcm9jZXNzaW5nIHNvIGxvbmcgYXMgdGhlcmUgYXJlIGVudHJpZXMsIG9yIHRoZXJlIGlzIHJvb20gaW4gdGhlCisJLy8gZmlmby4gRWFjaCBlbnRyeSByZXByZXNlbnRzIGEgY2hhbm5lbCB3aXRoIHNvbWV0aGluZyB0byBkby4KKwl3aGlsZSAoIC0tYmFpbG91dCAmJiBub3RDbG9nZ2VkICYmIAorCQkJKE5VTEwgIT0gKHBDaCA9IGkyRGVRdWV1ZU5lZWRzKHBCLE5FRURfQllQQVNTKSkpKQorCXsKKwkJV1JJVEVfTE9DS19JUlFTQVZFKCZwQ2gtPkNidWZfc3BpbmxvY2ssZmxhZ3MpOworCQlzdHJpcEluZGV4ID0gcENoLT5DYnVmX3N0cmlwOworCisJCS8vIGFzIGxvbmcgYXMgdGhlcmUgYXJlIHBhY2tldHMgZm9yIHRoaXMgY2hhbm5lbC4uLgorCisJCXdoaWxlIChzdHJpcEluZGV4ICE9IHBDaC0+Q2J1Zl9zdHVmZikgeworCQkJcFJlbW92ZSA9ICYocENoLT5DYnVmW3N0cmlwSW5kZXhdKTsKKwkJCXBhY2tldFNpemUgPSBDTURfQ09VTlRfT0YocFJlbW92ZSkgKyBzaXplb2YoaTJDbWRIZWFkZXIpOworCQkJcGFkZGVkU2l6ZSA9IFJPVU5EVVAocGFja2V0U2l6ZSk7CisKKwkJCWlmIChwYWRkZWRTaXplID4gMCkgeworCQkJCWlmICggMCA9PSBpMldyaXRlMkZpZm8ocEIsIHBSZW1vdmUsIHBhZGRlZFNpemUsMCkpIHsKKwkJCQkJbm90Q2xvZ2dlZCA9IDA7CS8qIGZpZm8gZnVsbCAqLworCQkJCQlpMlF1ZXVlTmVlZHMocEIsIHBDaCwgTkVFRF9CWVBBU1MpOwkvLyBQdXQgYmFjayBvbiBxdWV1ZQorCQkJCQlicmVhazsgICAvLyBCcmVhayBmcm9tIHRoZSBjaGFubmVsCisJCQkJfSAKKwkJCX0KKyNpZmRlZiBERUJVR19GSUZPCitXcml0ZURCR0J1ZigiQllQUyIsIHBSZW1vdmUsIHBhZGRlZFNpemUpOworI2VuZGlmCS8qIERFQlVHX0ZJRk8gKi8KKwkJCXBCLT5kZWJ1Z0J5cGFzc0NvdW50Kys7CisKKwkJCXBSZW1vdmUgKz0gcGFja2V0U2l6ZTsKKwkJCXN0cmlwSW5kZXggKz0gcGFja2V0U2l6ZTsKKwkJCWlmIChzdHJpcEluZGV4ID49IENCVUZfU0laRSkgeworCQkJCXN0cmlwSW5kZXggPSAwOworCQkJCXBSZW1vdmUgPSBwQ2gtPkNidWY7CisJCQl9CisJCX0KKwkJLy8gRG9uZSB3aXRoIHRoaXMgY2hhbm5lbC4gTW92ZSB0byBuZXh0LCByZW1vdmluZyB0aGlzIG9uZSBmcm9tIAorCQkvLyB0aGUgcXVldWUgb2YgY2hhbm5lbHMgaWYgd2UgY2xlYW5lZCBpdCBvdXQgKGkuZS4sIGRpZG4ndCBnZXQgY2xvZ2dlZC4KKwkJcENoLT5DYnVmX3N0cmlwID0gc3RyaXBJbmRleDsKKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+Q2J1Zl9zcGlubG9jayxmbGFncyk7CisJfSAgLy8gRWl0aGVyIGNsb2dnZWQgb3IgZmluaXNoZWQgYWxsIHRoZSB3b3JrCisKKyNpZmRlZiBJUDJERUJVR19UUkFDRQorCWlmICggIWJhaWxvdXQgKSB7CisJCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfRVJST1IsIDEsIDAgKTsKKwl9CisjZW5kaWYKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyU3R1ZmZGaWZvRmxvdyhwQikKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBib2FyZCBzdHJ1Y3R1cmUKKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vIFN0dWZmcyBhcyBtYW55IGZsb3cgY29udHJvbCBwYWNrZXRzIGludG8gdGhlIGZpZm8gYXMgcG9zc2libGUuIFRoaXMgaXMgZWFzaWVyCisvLyBldmVuIHRoYW4gZG9pbmcgbm9ybWFsIGJ5cGFzcyBjb21tYW5kcywgYmVjYXVzZSB0aGVyZSBpcyBhbHdheXMgYXQgbW9zdCBvbmUKKy8vIHBhY2tldCwgYWxyZWFkeSBhc3NlbWJsZWQsIGZvciBlYWNoIGNoYW5uZWwuCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGlubGluZSB2b2lkCitpMlN0dWZmRmlmb0Zsb3coaTJlQm9yZFN0clB0ciBwQikKK3sKKwlpMkNoYW5TdHJQdHIgcENoOworCXVuc2lnbmVkIHNob3J0IHBhZGRlZFNpemUJCT0gUk9VTkRVUChzaXplb2YoZmxvd0luKSk7CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX1NGTE9XLCBJVFJDX0VOVEVSLCAyLAorCQlwQi0+aTJlRmlmb1JlbWFpbnMsIHBhZGRlZFNpemUgKTsKKworCS8vIENvbnRpbnVlIHByb2Nlc3Npbmcgc28gbG9uZyBhcyB0aGVyZSBhcmUgZW50cmllcywgb3IgdGhlcmUgaXMgcm9vbSBpbiB0aGUKKwkvLyBmaWZvLiBFYWNoIGVudHJ5IHJlcHJlc2VudHMgYSBjaGFubmVsIHdpdGggc29tZXRoaW5nIHRvIGRvLgorCXdoaWxlICggKE5VTEwgIT0gKHBDaCA9IGkyRGVRdWV1ZU5lZWRzKHBCLE5FRURfRkxPVykpKSkgeworCQlwQi0+ZGVidWdGbG93Q291bnQrKzsKKworCQkvLyBOTyBDaGFuIExPQ0sgbmVlZGVkID8/PworCQlpZiAoIDAgPT0gaTJXcml0ZTJGaWZvKHBCLCh1bnNpZ25lZCBjaGFyICopJihwQ2gtPmluZmwpLHBhZGRlZFNpemUsMCkpIHsKKwkJCWJyZWFrOworCQl9CisjaWZkZWYgREVCVUdfRklGTworCQlXcml0ZURCR0J1ZigiRkxPVyIsKHVuc2lnbmVkIGNoYXIgKikgJihwQ2gtPmluZmwpLCBwYWRkZWRTaXplKTsKKyNlbmRpZiAvKiBERUJVR19GSUZPICovCisKKwl9ICAvLyBFaXRoZXIgY2xvZ2dlZCBvciBmaW5pc2hlZCBhbGwgdGhlIHdvcmsKKworCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfU0ZMT1csIElUUkNfUkVUVVJOLCAwICk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpMlN0dWZmRmlmb0lubGluZShwQikKKy8vIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gYSBib2FyZCBzdHJ1Y3R1cmUKKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vIFN0dWZmcyBhcyBtdWNoIGRhdGEgYW5kIGlubGluZSBjb21tYW5kcyBpbnRvIHRoZSBmaWZvIGFzIHBvc3NpYmxlLiBUaGlzIGlzCisvLyB0aGUgbW9zdCBjb21wbGV4IGZpZm8tc3R1ZmZpbmcgb3BlcmF0aW9uLCBzaW5jZSB0aGVyZSBpZiBub3cgdGhlIGNoYW5uZWwKKy8vIGZsb3ctY29udHJvbCBpc3N1ZSB0byBkZWFsIHdpdGguCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGlubGluZSB2b2lkCitpMlN0dWZmRmlmb0lubGluZShpMmVCb3JkU3RyUHRyIHBCKQoreworCWkyQ2hhblN0clB0ciBwQ2g7CisJdW5zaWduZWQgY2hhciAqcFJlbW92ZTsKKwl1bnNpZ25lZCBzaG9ydCBzdHJpcEluZGV4OworCXVuc2lnbmVkIHNob3J0IHBhY2tldFNpemU7CisJdW5zaWduZWQgc2hvcnQgcGFkZGVkU2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCBub3RDbG9nZ2VkID0gMTsKKwl1bnNpZ25lZCBzaG9ydCBmbG93c2l6ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW50IGJhaWxvdXQgID0gMTAwMDsKKwlpbnQgYmFpbG91dDI7CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX1NJQ01ELCBJVFJDX0VOVEVSLCAzLCBwQi0+aTJlRmlmb1JlbWFpbnMsIAorCQkJcEItPmkyRGJ1Zl9zdHJpcCwgcEItPmkyRGJ1Zl9zdHVmZiApOworCisJLy8gQ29udGludWUgcHJvY2Vzc2luZyBzbyBsb25nIGFzIHRoZXJlIGFyZSBlbnRyaWVzLCBvciB0aGVyZSBpcyByb29tIGluIHRoZQorCS8vIGZpZm8uIEVhY2ggZW50cnkgcmVwcmVzZW50cyBhIGNoYW5uZWwgd2l0aCBzb21ldGhpbmcgdG8gZG8uCisJd2hpbGUgKCAtLWJhaWxvdXQgJiYgbm90Q2xvZ2dlZCAmJiAKKwkJCShOVUxMICE9IChwQ2ggPSBpMkRlUXVldWVOZWVkcyhwQixORUVEX0lOTElORSkpKSApCisJeworCQlXUklURV9MT0NLX0lSUVNBVkUoJnBDaC0+T2J1Zl9zcGlubG9jayxmbGFncyk7CisJCXN0cmlwSW5kZXggPSBwQ2gtPk9idWZfc3RyaXA7CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX1NJQ01ELCAzLCAyLCBzdHJpcEluZGV4LCBwQ2gtPk9idWZfc3R1ZmYgKTsKKworCQkvLyBhcyBsb25nIGFzIHRoZXJlIGFyZSBwYWNrZXRzIGZvciB0aGlzIGNoYW5uZWwuLi4KKwkJYmFpbG91dDIgPSAxMDAwOworCQl3aGlsZSAoIC0tYmFpbG91dDIgJiYgc3RyaXBJbmRleCAhPSBwQ2gtPk9idWZfc3R1ZmYpIHsKKwkJCXBSZW1vdmUgPSAmKHBDaC0+T2J1ZltzdHJpcEluZGV4XSk7CisKKwkJCS8vIE11c3QgZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBiZSBhIGRhdGEgb3IgY29tbWFuZCBwYWNrZXQgdG8KKwkJCS8vIGNhbGN1bGF0ZSBjb3JyZWN0bHkgdGhlIGhlYWRlciBzaXplIGFuZCB0aGUgYW1vdW50IG9mCisJCQkvLyBmbG93LWNvbnRyb2wgY3JlZGl0IHRoaXMgdHlwZSBvZiBwYWNrZXQgd2lsbCB1c2UuCisJCQlpZiAoUFRZUEVfT0YocFJlbW92ZSkgPT0gUFRZUEVfREFUQSkgeworCQkJCWZsb3dzaXplID0gREFUQV9DT1VOVF9PRihwUmVtb3ZlKTsKKwkJCQlwYWNrZXRTaXplID0gZmxvd3NpemUgKyBzaXplb2YoaTJEYXRhSGVhZGVyKTsKKwkJCX0gZWxzZSB7CisJCQkJZmxvd3NpemUgPSBDTURfQ09VTlRfT0YocFJlbW92ZSk7CisJCQkJcGFja2V0U2l6ZSA9IGZsb3dzaXplICsgc2l6ZW9mKGkyQ21kSGVhZGVyKTsKKwkJCX0KKwkJCWZsb3dzaXplID0gQ1JFRElUX1VTQUdFKGZsb3dzaXplKTsKKwkJCXBhZGRlZFNpemUgPSBST1VORFVQKHBhY2tldFNpemUpOworCisJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU0lDTUQsIDQsIDIsIHBCLT5pMmVGaWZvUmVtYWlucywgcGFkZGVkU2l6ZSApOworCisJCQkvLyBJZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBjcmVkaXRzIGZyb20gdGhlIGJvYXJkIHRvIHNlbmQgdGhlIGRhdGEsCisJCQkvLyBmbGFnIHRoZSBjaGFubmVsIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIGZsb3cgY29udHJvbCBjcmVkaXQsIGFuZAorCQkJLy8gYnJlYWsgb3V0LiBUaGlzIHdpbGwgY2xlYW4gdXAgdGhpcyBjaGFubmVsIGFuZCByZW1vdmUgdXMgZnJvbSB0aGUKKwkJCS8vIHF1ZXVlIG9mIGhvdCB0aGluZ3MgdG8gZG8uCisKKwkJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU0lDTUQsIDUsIDIsIHBDaC0+b3V0Zmwucm9vbSwgZmxvd3NpemUgKTsKKworCQkJaWYgKHBDaC0+b3V0Zmwucm9vbSA8PSBmbG93c2l6ZSkJeworCQkJCS8vIERvIE5vdCBoYXZlIHRoZSBjcmVkaXRzIHRvIHNlbmQgdGhpcyBwYWNrZXQuCisJCQkJaTJRdWV1ZU5lZWRzKHBCLCBwQ2gsIE5FRURfQ1JFRElUKTsKKwkJCQlub3RDbG9nZ2VkID0gMDsKKwkJCQlicmVhazsgICAvLyBTbyB0byBkbyBuZXh0IGNoYW5uZWwKKwkJCX0KKwkJCWlmICggKHBhZGRlZFNpemUgPiAwKSAKKwkJCQkmJiAoIDAgPT0gaTJXcml0ZTJGaWZvKHBCLCBwUmVtb3ZlLCBwYWRkZWRTaXplLCAxMjgpKSkgeworCQkJCS8vIERvIE5vdCBoYXZlIHJvb20gaW4gZmlmbyB0byBzZW5kIHRoaXMgcGFja2V0LgorCQkJCW5vdENsb2dnZWQgPSAwOworCQkJCWkyUXVldWVOZWVkcyhwQiwgcENoLCBORUVEX0lOTElORSk7CQorCQkJCWJyZWFrOyAgIC8vIEJyZWFrIGZyb20gdGhlIGNoYW5uZWwKKwkJCX0KKyNpZmRlZiBERUJVR19GSUZPCitXcml0ZURCR0J1ZigiREFUQSIsIHBSZW1vdmUsIHBhZGRlZFNpemUpOworI2VuZGlmIC8qIERFQlVHX0ZJRk8gKi8KKwkJCXBCLT5kZWJ1Z0lubGluZUNvdW50Kys7CisKKwkJCXBDaC0+aWNvdW50LnR4ICs9IGZsb3dzaXplOworCQkJLy8gVXBkYXRlIGN1cnJlbnQgY3JlZGl0cworCQkJcENoLT5vdXRmbC5yb29tIC09IGZsb3dzaXplOworCQkJcENoLT5vdXRmbC5hc29mICs9IGZsb3dzaXplOworCQkJaWYgKFBUWVBFX09GKHBSZW1vdmUpID09IFBUWVBFX0RBVEEpIHsKKwkJCQlwQ2gtPk9idWZfY2hhcl9jb3VudCAtPSBEQVRBX0NPVU5UX09GKHBSZW1vdmUpOworCQkJfQorCQkJcFJlbW92ZSArPSBwYWNrZXRTaXplOworCQkJc3RyaXBJbmRleCArPSBwYWNrZXRTaXplOworCisJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU0lDTUQsIDYsIDIsIHN0cmlwSW5kZXgsIHBDaC0+T2J1Zl9zdHJpcCk7CisKKwkJCWlmIChzdHJpcEluZGV4ID49IE9CVUZfU0laRSkgeworCQkJCXN0cmlwSW5kZXggPSAwOworCQkJCXBSZW1vdmUgPSBwQ2gtPk9idWY7CisKKwkJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU0lDTUQsIDcsIDEsIHN0cmlwSW5kZXggKTsKKworCQkJfQorCQl9CS8qIHdoaWxlICovCisJCWlmICggIWJhaWxvdXQyICkgeworCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0VSUk9SLCAzLCAwICk7CisJCX0KKwkJLy8gRG9uZSB3aXRoIHRoaXMgY2hhbm5lbC4gTW92ZSB0byBuZXh0LCByZW1vdmluZyB0aGlzIG9uZSBmcm9tIHRoZQorCQkvLyBxdWV1ZSBvZiBjaGFubmVscyBpZiB3ZSBjbGVhbmVkIGl0IG91dCAoaS5lLiwgZGlkbid0IGdldCBjbG9nZ2VkLgorCQlwQ2gtPk9idWZfc3RyaXAgPSBzdHJpcEluZGV4OworCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5PYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwkJaWYgKCBub3RDbG9nZ2VkICkKKwkJeworCisJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU0lDTUQsIDgsIDAgKTsKKworCQkJaWYgKCBwQ2gtPnBUVFkgKSB7CisJCQkJaXAyX293YWtlKHBDaC0+cFRUWSk7CisJCQl9CisJCX0KKwl9ICAvLyBFaXRoZXIgY2xvZ2dlZCBvciBmaW5pc2hlZCBhbGwgdGhlIHdvcmsKKworCWlmICggIWJhaWxvdXQgKSB7CisJCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfRVJST1IsIDQsIDAgKTsKKwl9CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX1NJQ01ELCBJVFJDX1JFVFVSTiwgMSxwQi0+aTJEYnVmX3N0cmlwKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIHNlcnZpY2VPdXRnb2luZ0ZpZm8ocEIpCisvLyBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGEgYm9hcmQgc3RydWN0dXJlCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLyBIZWxwZXIgcm91dGluZSB0byBwdXQgZGF0YSBpbiB0aGUgb3V0Z29pbmcgZmlmbywgaWYgd2UgYXJlbid0IGFscmVhZHkgd2FpdGluZworLy8gZm9yIHNvbWV0aGluZyB0byBiZSB0aGVyZS4gSWYgdGhlIGZpZm8gaGFzIG9ubHkgcm9vbSBmb3IgYSB2ZXJ5IGxpdHRsZSBkYXRhLAorLy8gZ28gaGVhZCBhbmQgaGl0IHRoZSBib2FyZCB3aXRoIGEgbWFpbGJveCBoaXQgaW1tZWRpYXRlbHkuIE90aGVyd2lzZSwgaXQgd2lsbAorLy8gaGF2ZSB0byBoYXBwZW4gbGF0ZXIgaW4gdGhlIGludGVycnVwdCBwcm9jZXNzaW5nLiBTaW5jZSB0aGlzIHJvdXRpbmUgbWF5IGJlCisvLyBjYWxsZWQgYm90aCBhdCBpbnRlcnJ1cHQgYW5kIGZvcmVncm91bmQgdGltZSwgd2UgbXVzdCB0dXJuIG9mZiBpbnRlcnJ1cHRzCisvLyBkdXJpbmcgdGhlIGVudGlyZSBwcm9jZXNzLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkCitzZXJ2aWNlT3V0Z29pbmdGaWZvKGkyZUJvcmRTdHJQdHIgcEIpCit7CisJLy8gSWYgd2UgYXJlbid0IGN1cnJlbnRseSB3YWl0aW5nIGZvciB0aGUgYm9hcmQgdG8gZW1wdHkgb3VyIGZpZm8sIHNlcnZpY2UKKwkvLyBldmVyeXRoaW5nIHRoYXQgaXMgcGVuZGluZywgaW4gcHJpb3JpdHkgb3JkZXIgKGVzcGVjaWFsbHksIEJ5cGFzcyBiZWZvcmUKKwkvLyBJbmxpbmUpLgorCWlmICggISBwQi0+aTJlV2FpdGluZ0ZvckVtcHR5RmlmbyApCisJeworCQlpMlN0dWZmRmlmb0Zsb3cocEIpOworCQlpMlN0dWZmRmlmb0J5cGFzcyhwQik7CisJCWkyU3R1ZmZGaWZvSW5saW5lKHBCKTsKKworCQlpaVNlbmRQZW5kaW5nTWFpbChwQik7CisJfSAKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGkyU2VydmljZUJvYXJkKHBCKQorLy8gUGFyYW1ldGVyczogUG9pbnRlciB0byBhIGJvYXJkIHN0cnVjdHVyZQorLy8gUmV0dXJuczogICAgTm90aGluZworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8gTm9ybWFsbHkgdGhpcyBpcyBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgbGV2ZWwsIGJ1dCB0aGVyZSBpcyBkZWxpYmVyYXRlbHkKKy8vIG5vdGhpbmcgaW4gaGVyZSBzcGVjaWZpYyB0byBiZWluZyBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgbGV2ZWwuIEFsbCB0aGUKKy8vIGhhcmR3YXJlLXNwZWNpZmljLCBpbnRlcnJ1cHQtc3BlY2lmaWMgdGhpbmdzIGhhcHBlbiBhdCB0aGUgb3V0ZXIgbGV2ZWxzLgorLy8KKy8vIEZvciBleGFtcGxlLCBhIHRpbWVyIGludGVycnVwdCBjb3VsZCBkcml2ZSB0aGlzIHJvdXRpbmUgZm9yIHNvbWUgc29ydCBvZgorLy8gcG9sbGVkIG9wZXJhdGlvbi4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUgcHJvZ3JhbW1lciBkZWFsIHdpdGggYW55CisvLyBhdG9taXRpY2l0eS9jb25jdXJyZW5jeSBpc3N1ZXMgdGhhdCByZXN1bHQuCisvLworLy8gVGhpcyByb3V0aW5lIHJlc3BvbmRzIHRvIHRoZSBib2FyZCdzIGhhdmluZyBzZW50IG1haWxib3ggaW5mb3JtYXRpb24gdG8gdGhlCisvLyBob3N0ICh3aGljaCB3b3VsZCBub3JtYWxseSBjYXVzZSBhbiBpbnRlcnJ1cHQpLiBUaGlzIHJvdXRpbmUgcmVhZHMgdGhlCisvLyBpbmNvbWluZyBtYWlsYm94LiBJZiB0aGVyZSBpcyBubyBkYXRhIGluIGl0LCB0aGlzIGJvYXJkIGRpZCBub3QgY3JlYXRlIHRoZQorLy8gaW50ZXJydXB0IGFuZC9vciBoYXMgbm90aGluZyB0byBiZSBkb25lIHRvIGl0LiAoRXhjZXB0LCBpZiB3ZSBoYXZlIGJlZW4KKy8vIHdhaXRpbmcgdG8gd3JpdGUgbWFpbGJveCBkYXRhIHRvIGl0LCB3ZSBtYXkgZG8gc28uCisvLworLy8gQmFzZWQgb24gdGhlIHZhbHVlIGluIHRoZSBtYWlsYm94LCB3ZSBtYXkgdGFrZSB2YXJpb3VzIGFjdGlvbnMuCisvLworLy8gTm8gY2hlY2tpbmcgaGVyZSBvZiBwQiB2YWxpZGl0eTogYWZ0ZXIgYWxsLCBpdCBzaG91bGRuJ3QgaGF2ZSBiZWVuIGNhbGxlZCBieQorLy8gdGhlIGhhbmRsZXIgdW5sZXNzIHBCIHdlcmUgb24gdGhlIGxpc3QuCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGlubGluZSBpbnQKK2kyU2VydmljZUJvYXJkICggaTJlQm9yZFN0clB0ciBwQiApCit7CisJdW5zaWduZWQgaW5tYWlsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCS8qIFRoaXMgc2hvdWxkIGJlIGF0b21pYyBiZWNhdXNlIG9mIHRoZSB3YXkgd2UgYXJlIGNhbGxlZC4uLiAqLworCWlmIChOT19NQUlMX0hFUkUgPT0gKCBpbm1haWwgPSBwQi0+aTJlU3RhcnRNYWlsICkgKSB7CisJCWlubWFpbCA9IGlpR2V0TWFpbChwQik7CisJfQorCXBCLT5pMmVTdGFydE1haWwgPSBOT19NQUlMX0hFUkU7CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX0lOVFIsIDIsIDEsIGlubWFpbCApOworCisJaWYgKGlubWFpbCAhPSBOT19NQUlMX0hFUkUpIHsKKwkJLy8gSWYgdGhlIGJvYXJkIGhhcyBnb25lIGZhdGFsLCBub3RoaW5nIHRvIGRvIGJ1dCBoaXQgYSBiaXQgdGhhdCB3aWxsCisJCS8vIGFsZXJ0IGZvcmVncm91bmQgdGFza3MgdG8gcHJvdGVzdCEKKwkJaWYgKCBpbm1haWwgJiBNQl9GQVRBTF9FUlJPUiApIHsKKwkJCXBCLT5pMmVGYXRhbCA9IDE7CisJCQlnb3RvIGV4aXRfaTJTZXJ2aWNlQm9hcmQ7CisJCX0KKworCQkvKiBBc3N1bWluZyBubyBmYXRhbCBjb25kaXRpb24sIHdlIHByb2NlZWQgdG8gZG8gd29yayAqLworCQlpZiAoIGlubWFpbCAmIE1CX0lOX1NUVUZGRUQgKSB7CisJCQlwQi0+aTJlRmlmb0luSW50cysrOworCQkJaTJTdHJpcEZpZm8ocEIpOyAgICAgLyogVGhlcmUgbWlnaHQgYmUgaW5jb21pbmcgcGFja2V0cyAqLworCQl9CisKKwkJaWYgKGlubWFpbCAmIE1CX09VVF9TVFJJUFBFRCkgeworCQkJcEItPmkyZUZpZm9PdXRJbnRzKys7CisJCQlXUklURV9MT0NLX0lSUVNBVkUoJnBCLT53cml0ZV9maWZvX3NwaW5sb2NrLGZsYWdzKTsKKwkJCXBCLT5pMmVGaWZvUmVtYWlucyA9IHBCLT5pMmVGaWZvU2l6ZTsKKwkJCXBCLT5pMmVXYWl0aW5nRm9yRW1wdHlGaWZvID0gMDsKKwkJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQi0+d3JpdGVfZmlmb19zcGlubG9jayxmbGFncyk7CisKKwkJCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfSU5UUiwgMzAsIDEsIHBCLT5pMmVGaWZvUmVtYWlucyApOworCisJCX0KKwkJc2VydmljZU91dGdvaW5nRmlmbyhwQik7CisJfQorCisJaXAydHJhY2UgKElUUkNfTk9fUE9SVCwgSVRSQ19JTlRSLCA4LCAwICk7CisKK2V4aXRfaTJTZXJ2aWNlQm9hcmQ6CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuaCBiL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTJlMTEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5oCkBAIC0wLDAgKzEsMzUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIChjKSAxOTk4IGJ5IENvbXB1dG9uZSBDb3Jwb3JhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogICBQQUNLQUdFOiAgICAgTGludXggdHR5IERldmljZSBEcml2ZXIgZm9yIEludGVsbGlQb3J0IElJIGZhbWlseSBvZiBtdWx0aXBvcnQKKyogICAgICAgICAgICAgICAgc2VyaWFsIEkvTyBjb250cm9sbGVycy4KKyoKKyogICBERVNDUklQVElPTjogSGVhZGVyIGZpbGUgZm9yIGhpZ2ggbGV2ZWwgbGlicmFyeSBmdW5jdGlvbnMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEkyTElCX0gKKyNkZWZpbmUgSTJMSUJfSCAgIDEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJMkxJQi5ICisvLworLy8gSW50ZWxsaVBvcnQtSUkgYW5kIEludGVsbGlQb3J0LUlJRVgKKy8vCisvLyBEZWZpbmVzLCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMsIGFuZCBleHRlcm5hbCBkZWNsYXJhdGlvbnMgZm9yIGkybGliLmMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYW5kYXRvcnkgSW5jbHVkZXM6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaW5jbHVkZSAiaXAydHlwZXMuaCIKKyNpbmNsdWRlICJpMmVsbGlzLmgiCisjaW5jbHVkZSAiaTJwYWNrLmgiCisjaW5jbHVkZSAiaTJjbWQuaCIKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGkyQ2hhblN0ciAtLSBDaGFubmVsIFN0cnVjdHVyZToKKy8vIFVzZWQgdG8gdHJhY2sgcGVyLWNoYW5uZWwgaW5mb3JtYXRpb24gZm9yIHRoZSBsaWJyYXJ5IHJvdXRpbmVzIHVzaW5nIHN0YW5kYXJkCisvLyBsb2Fkd2FyZS4gTm90ZSBhbHNvLCBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyBwYXRjaGVkCisvLyBpbnRvIHRoZSBpMmVCb3JkU3RyIChzZWUgaTJlbGxpcy5oKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJZiB3ZSBtYWtlIHNvbWUgbGltaXRzIG9uIHRoZSBtYXhpbXVtIGJsb2NrIHNpemVzLCB3ZSBjYW4gYXZvaWQgZGVhbGluZyB3aXRoCisvLyBidWZmZXIgd3JhcC4gVGhlIHdyYXBwaW5nIG9mIHRoZSBidWZmZXIgaXMgYmFzZWQgb24gd2hlcmUgdGhlIHN0YXJ0IG9mIHRoZQorLy8gcGFja2V0IGlzLiBUaGVuIHRoZXJlIGlzIGFsd2F5cyByb29tIGZvciB0aGUgcGFja2V0IGNvbnRpZ3VvdXNseS4KKy8vCisvLyBNYXhpbXVtIHRvdGFsIGxlbmd0aCBvZiBhbiBvdXRnb2luZyBkYXRhIG9yIGluLWxpbmUgY29tbWFuZCBibG9jay4gVGhlIGxpbWl0CisvLyBvZiAzNiBvbiBkYXRhIGlzIHF1aXRlIGFyYml0cmFyeSBhbmQgYmFzZWQgbW9yZSBvbiBET1MgbWVtb3J5IGxpbWl0YXRpb25zCisvLyB0aGFuIHRoZSBib2FyZCBpbnRlcmZhY2UuIEhvd2V2ZXIsIGZvciBjb21tYW5kcywgdGhlIG1heGltdW0gcGFja2V0IGxlbmd0aCBpcworLy8gTUFYX0NNRF9QQUNLX1NJWkUsIGJlY2F1c2UgdGhlIGZpZWxkIHNpemUgZm9yIHRoZSBjb3VudCBpcyBvbmx5IGEgZmV3IGJpdHMKKy8vIChzZWUgSTJQQUNLLkgpIGluIHN1Y2ggcGFja2V0cy4gRm9yIGRhdGEgcGFja2V0cywgdGhlIGNvdW50IGZpZWxkIHNpemUgaXMgbm90CisvLyB0aGUgbGltaXRpbmcgZmFjdG9yLiBBcyBvZiB0aGlzIHdyaXRpbmcsIE1BWF9PQlVGX0JMT0NLIDwgTUFYX0NNRF9QQUNLX1NJWkUsCisvLyBidXQgYmUgY2FyZWZ1bCBpZiB3YW50aW5nIHRvIG1vZGlmeSBlaXRoZXIuCisvLworI2RlZmluZSBNQVhfT0JVRl9CTE9DSyAgMzYKKworLy8gQW5vdGhlciBub3RlIG9uIG1heGltdW0gYmxvY2sgc2l6ZXM6IHdlIGFyZSBidWZmZXJpbmcgcGFja2V0cyBoZXJlLiBEYXRhIGlzCisvLyBwdXQgaW50byB0aGUgYnVmZmVyIChpZiB0aGVyZSBpcyByb29tKSByZWdhcmRsZXNzIG9mIHRoZSBjcmVkaXRzIGZyb20gdGhlCisvLyBib2FyZC4gVGhlIGJvYXJkIHNlbmRzIG5ldyBjcmVkaXRzIHdoZW5ldmVyIGl0IGhhcyByZW1vdmVkIGZyb20gaGlzIGJ1ZmZlcnMgYQorLy8gbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXF1YWwgdG8gODAlIG9mIHRvdGFsIGJ1ZmZlciBzaXplLiAoT2YgY291cnNlLCB0aGUgdG90YWwKKy8vIGJ1ZmZlciBzaXplIGlzIHdoYXQgaXMgcmVwb3J0ZWQgd2hlbiB0aGUgdmVyeSBmaXJzdCBzZXQgb2YgZmxvdyBjb250cm9sCisvLyBzdGF0dXMgcGFja2V0cyBhcmUgcmVjZWl2ZWQgZnJvbSB0aGUgYm9hcmQuIFRoZXJlZm9yZSwgdG8gYmUgcm9idXN0LCB5b3UgbXVzdAorLy8gYWx3YXlzIGZpbGwgdGhlIGJvYXJkIHRvIGF0IGxlYXN0IDgwJSBvZiB0aGUgY3VycmVudCBjcmVkaXQgbGltaXQsIGVsc2UgeW91CisvLyBtaWdodCBub3QgZ2l2ZSBpdCBlbm91Z2ggdG8gdHJpZ2dlciBhIG5ldyByZXBvcnQuIFRoZXNlIGNvbmRpdGlvbnMgYXJlCisvLyBvYnRhaW5lZCBoZXJlIHNvIGxvbmcgYXMgdGhlIG1heGltdW0gb3V0cHV0IGJsb2NrIHNpemUgaXMgbGVzcyB0aGFuIDIwJSB0aGUKKy8vIHNpemUgb2YgdGhlIGJvYXJkJ3Mgb3V0cHV0IGJ1ZmZlcnMuIFRoaXMgaXMgdHJ1ZSBhdCBwcmVzZW50IGJ5ICJjb2luY2lkZW5jZSIKKy8vIG9yICJpbmZlcm5hbCBrbm93bGVkZ2UiOiB0aGUgYm9hcmQncyBvdXRwdXQgYnVmZmVycyBhcmUgYXQgbGVhc3QgNzAwIGJ5dGVzCisvLyBsb25nICgyMCUgPSAxNDAgYnl0ZXMsIGF0IGxlYXN0KS4gVGhlIDgwJSBmaWd1cmUgaXMgIm9mZmljaWFsIiwgc28gdGhlIHNhZmVzdAorLy8gc3RyYXRlZ3kgbWlnaHQgYmUgdG8gdHJhcCB0aGUgZmlyc3QgZmxvdyBjb250cm9sIHJlcG9ydCBhbmQgZ3VhcmFudGVlIHRoYXQKKy8vIHRoZSBlZmZlY3RpdmUgbWF4T2J1ZkJsb2NrIGlzIHRoZSBtaW5pbXVtIG9mIE1BWF9PQlVGX0JMT0NLIGFuZCAyMCUgb2YgZmlyc3QKKy8vIHJlcG9ydGVkIGJ1ZmZlciBjcmVkaXQuCisvLworI2RlZmluZSBNQVhfQ0JVRl9CTE9DSyAgNgkvLyBNYXhpbXVtIHRvdGFsIGxlbmd0aCBvZiBhIGJ5cGFzcyBjb21tYW5kIGJsb2NrCisKKyNkZWZpbmUgSUJVRl9TSVpFICAgICAgIDUxMgkvLyBjaGFyYWN0ZXIgY2FwYWNpdHkgb2YgaW5wdXQgYnVmZmVyIHBlciBjaGFubmVsCisjZGVmaW5lIE9CVUZfU0laRSAgICAgICAxMDI0Ly8gY2hhcmFjdGVyIGNhcGFjaXR5IG9mIG91dHB1dCBidWZmZXIgcGVyIGNoYW5uZWwKKyNkZWZpbmUgQ0JVRl9TSVpFICAgICAgIDEwCS8vIGNoYXJhY3RlciBjYXBhY2l0eSBvZiBvdXRwdXQgYnlwYXNzIGJ1ZmZlcgorCit0eXBlZGVmIHN0cnVjdCBfaTJDaGFuU3RyCit7CisJLy8gRmlyc3QsIGJhY2stcG9pbnRlcnMgc28gdGhhdCBnaXZlbiBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIHlvdSBjYW4KKwkvLyBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgYm9hcmQgYW5kIGNoYW5uZWwgbnVtYmVyIHRvIHJlZmVyZW5jZSwgKHNheSwgd2hlbgorCS8vIGlzc3VpbmcgY29tbWFuZHMsIGV0Yy4gKE5vdGUsIGNoYW5uZWwgbnVtYmVyIGlzIGluIGluZmwuaGQuaTJzQ2hhbm5lbC4pCisKKwlpbnQgICAgICBwb3J0X2luZGV4OyAgICAvLyBJbmRleCBvZiBwb3J0IGluIGNoYW5uZWwgc3RydWN0dXJlIGFycmF5IGF0dGFjaGVkCisJCQkJCQkJLy8gdG8gYm9hcmQgc3RydWN0dXJlLgorCVBUVFkgICAgIHBUVFk7ICAgICAgICAgIC8vIFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSBmb3IgcG9ydCAoT1Mgc3BlY2lmaWMpCisJVVNIT1JUICAgdmFsaWRpdHk7ICAgICAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIGNoYW5uZWwgaGFzIGJlZW4KKwkJCQkJCQkvLyBpbml0aWFsaXplZCwgcmVhbGx5IGV4aXN0cyAob3IgaXMgYSBtaXNzaW5nCisJCQkJCQkJLy8gY2hhbm5lbCwgZS5nLiBjaGFubmVsIDkgb24gYW4gOC1wb3J0IGJveC4pCisKKwlpMmVCb3JkU3RyUHRyICBwTXlCb3JkOyAvLyBCYWNrLXBvaW50ZXIgdG8gdGhpcyBjaGFubmVsJ3MgYm9hcmQgc3RydWN0dXJlIAorCisJaW50ICAgICAgd29wZW47CQkJLy8gd2FpdGluZyBmZXIgY2FycmllcgorCisJaW50ICAgICAgdGhyb3R0bGVkOwkJLy8gU2V0IGlmIHVwcGVyIGxheWVyIGNhbiB0YWtlIG5vIGRhdGEKKworCWludCAgICAgIGZsYWdzOyAgICAgICAgIC8vIERlZmluZWQgaW4gdHR5LmgKKworCVBXQUlUUSAgIG9wZW5fd2FpdDsgICAgIC8vIFBvaW50ZXIgZm9yIE9TIHNsZWVwIGZ1bmN0aW9uLgorCVBXQUlUUSAgIGNsb3NlX3dhaXQ7ICAgIC8vIFBvaW50ZXIgZm9yIE9TIHNsZWVwIGZ1bmN0aW9uLgorCVBXQUlUUSAgIGRlbHRhX21zcl93YWl0Oy8vIFBvaW50ZXIgZm9yIE9TIHNsZWVwIGZ1bmN0aW9uLgorCVBXQUlUUSAgIGRzc19ub3dfd2FpdDsJLy8gUG9pbnRlciBmb3IgT1Mgc2xlZXAgZnVuY3Rpb24uCisKKwlzdHJ1Y3QgdGltZXJfbGlzdCAgQm9va21hcmtUaW1lcjsgICAvLyBVc2VkIGJ5IGkyRHJhaW5PdXRwdXQKKwl3YWl0X3F1ZXVlX2hlYWRfdCBwQm9va21hcmtXYWl0OyAgIC8vIFVzZWQgYnkgaTJEcmFpbk91dHB1dAorCisJaW50ICAgICAgQmF1ZEJhc2U7CisJaW50ICAgICAgQmF1ZERpdmlzb3I7CisKKwlVU0hPUlQgICBDbG9zaW5nRGVsYXk7CisJVVNIT1JUICAgQ2xvc2luZ1dhaXRUaW1lOworCisJdm9sYXRpbGUKKwlmbG93SW4gICBpbmZsOwkvLyBUaGlzIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCBhcyBhIGNvbXBsZXRlbHkKKwkJCQkJLy8gZm9ybWVkIGZsb3ctY29udHJvbCBjb21tYW5kIHBhY2tldCwgYW5kIGFzIHN1Y2gKKwkJCQkJLy8gaGFzIHRoZSBjaGFubmVsIG51bWJlciwgYWxzbyB0aGUgY2FwYWNpdHkgYW5kCisJCQkJCS8vICJhcy1vZiIgZGF0YSBuZWVkZWQgY29udGludW91c2x5LgorCisJVVNIT1JUICAgc2luY2VMYXN0RmxvdzsgLy8gQ291bnRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGZyb20gaW5wdXQKKwkJCQkJCQkvLyBidWZmZXJzLCBzaW5jZSB0aGUgbGFzdCB0aW1lIGZsb3cgY29udHJvbCBpbmZvCisJCQkJCQkJLy8gd2FzIHNlbnQuCisKKwlVU0hPUlQgICB3aGVuU2VuZEZsb3c7ICAvLyBEZXRlcm1pbmVzIHdoZW4gbmV3IGZsb3cgY29udHJvbCBpcyB0byBiZSBzZW50IHRvCisJCQkJCQkJLy8gdGhlIGJvYXJkLiBOb3RlIHVubGlrZSBlYXJsaWVyIG1hbmlmZXN0YXRpb25zIG9mCisJCQkJCQkJLy8gdGhlIGRyaXZlciwgdGhlc2UgcGFja2V0cyBjYW4gYmUgc2VudCBmcm9tCisJCQkJCQkJLy8gaW4tcGxhY2UuCisKKwlVU0hPUlQgICBjaGFubmVsTmVlZHM7ICAvLyBCaXQgbWFwIG9mIGltcG9ydGFudCB0aGluZ3Mgd2hpY2ggbXVzdCBiZSBkb25lCisJCQkJCQkJLy8gZm9yIHRoaXMgY2hhbm5lbC4gKFNlZSBiaXRzIGJlbG93ICkKKworCXZvbGF0aWxlCisJZmxvd1N0YXQgb3V0Zmw7ICAgICAgICAgLy8gU2FtZSB0eXBlIG9mIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgY3VycmVudAorCQkJCQkJCS8vIGZsb3cgY29udHJvbCBpbmZvcm1hdGlvbiB1c2VkIHRvIGNvbnRyb2wgb3VyCisJCQkJCQkJLy8gb3V0cHV0LiAiYXNvZiIgaXMga2VwdCB1cGRhdGVkIGFzIGRhdGEgaXMgc2VudCwKKwkJCQkJCQkvLyBhbmQgInJvb20iIG5ldmVyIGdvZXMgdG8gemVyby4KKworCS8vIFRoZSBpbmNvbWluZyByaW5nIGJ1ZmZlcgorCS8vIFVubGlrZSB0aGUgb3V0Z29pbmcgYnVmZmVycywgdGhpcyBob2xkcyByYXcgZGF0YSwgbm90IHBhY2tldHMuIFRoZSB0d28KKwkvLyBleHRyYSBieXRlcyBhcmUgdXNlZCB0byBob2xkIHRoZSBieXRlLXBhZGRpbmcgd2hlbiB0aGVyZSBpcyByb29tIGZvciBhbgorCS8vIG9kZCBudW1iZXIgb2YgYnl0ZXMgYmVmb3JlIHdlIG11c3Qgd3JhcC4KKwkvLworCVVDSEFSICAgIElidWZbSUJVRl9TSVpFICsgMl07CisJdm9sYXRpbGUKKwlVU0hPUlQgICBJYnVmX3N0dWZmOyAgICAgLy8gU3R1ZmZpbmcgaW5kZXgKKwl2b2xhdGlsZQorCVVTSE9SVCAgIElidWZfc3RyaXA7ICAgICAvLyBTdHJpcHBpbmcgaW5kZXgKKworCS8vIFRoZSBvdXRnb2luZyByaW5nLWJ1ZmZlcjogSG9sZHMgRGF0YSBhbmQgY29tbWFuZCBwYWNrZXRzLiBOLkIuLCBldmVuCisJLy8gdGhvdWdoIHRoZXNlIGFyZSBpbiB0aGUgY2hhbm5lbCBzdHJ1Y3R1cmUsIHRoZSBjaGFubmVsIGlzIGFsc28gd3JpdHRlbgorCS8vIGhlcmUsIHRoZSBlYXNpZXIgdG8gc2VuZCBpdCB0byB0aGUgZmlmbyB3aGVuIHJlYWR5LiBIT1dFVkVSLCBpbmRpdmlkdWFsCisJLy8gcGFja2V0cyBoZXJlIGFyZSBOT1QgcGFkZGVkIHRvIGV2ZW4gbGVuZ3RoOiB0aGUgcm91dGluZXMgZm9yIHdyaXRpbmcKKwkvLyBibG9ja3MgdG8gdGhlIGZpZm8gd2lsbCBwYWQgdG8gZXZlbiBieXRlIGNvdW50cy4KKwkvLworCVVDSEFSCU9idWZbT0JVRl9TSVpFK01BWF9PQlVGX0JMT0NLKzRdOworCXZvbGF0aWxlCisJVVNIT1JUCU9idWZfc3R1ZmY7ICAgICAvLyBTdHVmZmluZyBpbmRleAorCXZvbGF0aWxlCisJVVNIT1JUCU9idWZfc3RyaXA7ICAgICAvLyBTdHJpcHBpbmcgaW5kZXgKKwlpbnQJT2J1Zl9jaGFyX2NvdW50OworCisJLy8gVGhlIG91dGdvaW5nIGJ5cGFzcy1jb21tYW5kIGJ1ZmZlci4gVW5saWtlIGVhcmxpZXIgbWFuaWZlc3RhdGlvbnMsIHRoZQorCS8vIGZsb3cgY29udHJvbCBwYWNrZXRzIGFyZSBzZW50IGRpcmVjdGx5IGZyb20gdGhlIHN0cnVjdHVyZXMuIEFzIGFib3ZlLCB0aGUKKwkvLyBjaGFubmVsIG51bWJlciBpcyBpbmNsdWRlZCBpbiB0aGUgcGFja2V0LCBidXQgdGhleSBhcmUgTk9UIHBhZGRlZCB0byBldmVuCisJLy8gc2l6ZS4KKwkvLworCVVDSEFSICAgIENidWZbQ0JVRl9TSVpFK01BWF9DQlVGX0JMT0NLKzJdOworCXZvbGF0aWxlCisJVVNIT1JUICAgQ2J1Zl9zdHVmZjsgICAgIC8vIFN0dWZmaW5nIGluZGV4CisJdm9sYXRpbGUKKwlVU0hPUlQgICBDYnVmX3N0cmlwOyAgICAgLy8gU3RyaXBwaW5nIGluZGV4CisKKwkvLyBUaGUgdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgdGhlIExpbnV4IHR0eSBkcml2ZXIgUHV0Q2hhciBlbnRyeS4KKwkvLworCVVDSEFSICAgIFBidWZbTUFYX09CVUZfQkxPQ0sgLSBzaXplb2YgKGkyRGF0YUhlYWRlcildOworCXZvbGF0aWxlCisJVVNIT1JUICAgUGJ1Zl9zdHVmZjsgICAgIC8vIFN0dWZmaW5nIGluZGV4CisKKwkvLyBUaGUgc3RhdGUgb2YgaW5jb21pbmcgZGF0YS1zZXQgc2lnbmFscworCS8vCisJVVNIT1JUICAgZGF0YVNldEluOyAgICAgLy8gQml0LW1hcHBlZCBhY2NvcmRpbmcgdG8gYmVsb3cuIEFsc28gaW5kaWNhdGVzCisJCQkJCQkJLy8gd2hldGhlciBhIGJyZWFrIGhhcyBiZWVuIGRldGVjdGVkIHNpbmNlIGxhc3QKKwkJCQkJCQkvLyBpbnF1aXJ5LgorCisJLy8gVGhlIHN0YXRlIG9mIG91dGNvbWluZyBkYXRhLXNldCBzaWduYWxzIChhcyBmYXIgYXMgd2UgY2FuIHRlbGwhKQorCS8vCisJVVNIT1JUICAgZGF0YVNldE91dDsgICAgIC8vIEJpdC1tYXBwZWQgYWNjb3JkaW5nIHRvIGJlbG93LiAKKworCS8vIE1vc3QgcmVjZW50IGhvdC1rZXkgaWRlbnRpZmllciBkZXRlY3RlZAorCS8vCisJVVNIT1JUICAgaG90S2V5SW47ICAgICAgLy8gSG90IGtleSBhcyBzZW50IGJ5IHRoZSBib2FyZCwgSE9UX0NMRUFSIGluZGljYXRlcworCQkJCS8vIG5vIGhvdCBrZXkgZGV0ZWN0ZWQgc2luY2UgbGFzdCBleGFtaW5lZC4KKworCS8vIENvdW50ZXIgb2Ygb3V0c3RhbmRpbmcgcmVxdWVzdHMgZm9yIGJvb2ttYXJrcworCS8vCisJc2hvcnQgICBib29rTWFya3M7CS8vIE51bWJlciBvZiBvdXRzdGFuZGluZyBib29rbWFyayByZXF1ZXN0cywgKCtpdmUKKwkJCQkJCS8vIHdoZW5ldmVyIGEgYm9va21hcmsgcmVxdWVzdCBpZiBxdWV1ZWQgdXAsIC1pdmUKKwkJCQkJCS8vIHdoZW5ldmVyIGEgYm9va21hcmsgaXMgcmVjZWl2ZWQpLgorCisJLy8gTWlzYyBvcHRpb25zCisJLy8KKwlVU0hPUlQgICBjaGFubmVsT3B0aW9uczsgICAvLyBTZWUgYmVsb3cKKworCS8vIFRvIHN0b3JlIHZhcmlvdXMgaW5jb21pbmcgc3BlY2lhbCBwYWNrZXRzCisJLy8KKwlkZWJ1Z1N0YXQgICBjaGFubmVsU3RhdHVzOworCWNudFN0YXQgICAgIGNoYW5uZWxSY291bnQ7CisJY250U3RhdCAgICAgY2hhbm5lbFRjb3VudDsKKwlmYWlsU3RhdCAgICBjaGFubmVsRmFpbDsKKworCS8vIFRvIHN0b3JlIHRoZSBsYXN0IHZhbHVlcyBmb3IgbGluZSBjaGFyYWN0ZXJpc3RpY3Mgd2Ugc2VudCB0byB0aGUgYm9hcmQuCisJLy8KKwlpbnQJc3BlZWQ7CisKKwlpbnQgZmx1c2hfZmxhZ3M7CisKKwl2b2lkICgqdHJhY2UpKHVuc2lnbmVkIHNob3J0LHVuc2lnbmVkIGNoYXIsdW5zaWduZWQgY2hhcix1bnNpZ25lZCBsb25nLC4uLik7CisKKwkvKgorCSAqIEtlcm5lbCBjb3VudGVycyBmb3IgdGhlIDQgaW5wdXQgaW50ZXJydXB0cyAKKwkgKi8KKwlzdHJ1Y3QgYXN5bmNfaWNvdW50IGljb3VudDsKKworCS8qCisJICoJVGFzayBxdWV1ZXMgZm9yIHByb2Nlc3NpbmcgaW5wdXQgcGFja2V0cyBmcm9tIHRoZSBib2FyZC4KKwkgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHF1ZXVlX2lucHV0OworCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWVfc3RhdHVzOworCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWVfaGFuZ3VwOworCisJcndsb2NrX3QgSWJ1Zl9zcGlubG9jazsKKwlyd2xvY2tfdCBPYnVmX3NwaW5sb2NrOworCXJ3bG9ja190IENidWZfc3BpbmxvY2s7CisJcndsb2NrX3QgUGJ1Zl9zcGlubG9jazsKKworfSBpMkNoYW5TdHIsICppMkNoYW5TdHJQdHI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYW5pZmVzdHMgYW5kIGJpdC1tYXBzIGZvciBlbGVtZW50cyBpbiBpMkNoYW5TdHIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gZmx1c2ggZmxhZ3MKKy8vCisjZGVmaW5lIFNUQVJURkxfRkxBRyAxCisjZGVmaW5lIFNUT1BGTF9GTEFHICAyCisKKy8vIHZhbGlkaXR5CisvLworI2RlZmluZSBDSEFOTkVMX01BR0lDX0JJVFMgMHhmZjAwCisjZGVmaW5lIENIQU5ORUxfTUFHSUMgICAgICAweDUzMDAgICAvLyAodmFsaWRpdHkgJiBDSEFOTkVMX01BR0lDX0JJVFMpID09CisJCQkJCQkJCQkvLyBDSEFOTkVMX01BR0lDIC0tPiBzdHJ1Y3R1cmUgZ29vZAorCisjZGVmaW5lIENIQU5ORUxfU1VQUE9SVCAgICAweDAwMDEgICAvLyBJbmRpY2F0ZXMgY2hhbm5lbCBpcyBzdXBwb3J0ZWQsIGV4aXN0cywKKwkJCQkJCQkJCS8vIGFuZCBwYXNzZWQgUC5PLlMuVC4KKworLy8gY2hhbm5lbE5lZWRzCisvLworI2RlZmluZSBORUVEX0ZMT1cgICAgMSAgLy8gSW5kaWNhdGVzIGZsb3cgY29udHJvbCBoYXMgYmVlbiBxdWV1ZWQKKyNkZWZpbmUgTkVFRF9JTkxJTkUgIDIgIC8vIEluZGljYXRlcyBpbmxpbmUgY29tbWFuZHMgb3IgZGF0YSBxdWV1ZWQKKyNkZWZpbmUgTkVFRF9CWVBBU1MgIDQgIC8vIEluZGljYXRlcyBieXBhc3MgY29tbWFuZHMgcXVldWVkCisjZGVmaW5lIE5FRURfQ1JFRElUICA4ICAvLyBJbmRpY2F0ZXMgd291bGQgYmUgc2VuZGluZyBleGNlcHQgaGFzIG5vdCBzdWZmaWNpZW50CisJCQkJCQkvLyBjcmVkaXQuIFRoZSBkYXRhIGlzIHN0aWxsIGluIHRoZSBjaGFubmVsIHN0cnVjdHVyZSwKKwkJCQkJCS8vIGJ1dCB0aGUgY2hhbm5lbCBpcyBub3QgZW5xdWV1ZWQgaW4gdGhlIGJvYXJkCisJCQkJCQkvLyBzdHJ1Y3R1cmUgYWdhaW4gdW50aWwgdGhlcmUgaXMgYSBjcmVkaXQgcmVjZWl2ZWQgZnJvbQorCQkJCQkJLy8gdGhlIGJvYXJkLgorCisvLyBkYXRhU2V0SW4gKEFsc28gdGhlIGJpdHMgZm9yIGkyR2V0U3RhdHVzIHJldHVybiB2YWx1ZSkKKy8vCisjZGVmaW5lIEkyX0RDRCAxCisjZGVmaW5lIEkyX0NUUyAyCisjZGVmaW5lIEkyX0RTUiA0CisjZGVmaW5lIEkyX1JJICA4CisKKy8vIGRhdGFTZXRPdXQgKEFsc28gdGhlIGJpdHMgZm9yIGkyR2V0U3RhdHVzIHJldHVybiB2YWx1ZSkKKy8vCisjZGVmaW5lIEkyX0RUUiAxCisjZGVmaW5lIEkyX1JUUyAyCisKKy8vIGkyR2V0U3RhdHVzKCkgY2FuIG9wdGlvbmFsbHkgY2xlYXIgdGhlc2UgYml0cworLy8KKyNkZWZpbmUgSTJfQlJLICAgIDB4MTAgIC8vIEEgYnJlYWsgd2FzIGRldGVjdGVkCisjZGVmaW5lIEkyX1BBUiAgICAweDIwICAvLyBBIHBhcml0eSBlcnJvciB3YXMgcmVjZWl2ZWQgCisjZGVmaW5lIEkyX0ZSQSAgICAweDQwICAvLyBBIGZyYW1pbmcgZXJyb3Igd2FzIHJlY2VpdmVkCisjZGVmaW5lIEkyX09WUiAgICAweDgwICAvLyBBbiBvdmVycnVuIGVycm9yIHdhcyByZWNlaXZlZCAKKworLy8gaTJHZXRTdGF0dXMoKSBhdXRvbWF0aWNhbGx5IGNsZWFycyB0aGVzZSBiaXRzICovCisvLworI2RlZmluZSBJMl9ERENEICAgMHgxMDAgLy8gRENEIGNoYW5nZWQgZnJvbSBpdHMgIGZvcm1lciB2YWx1ZQorI2RlZmluZSBJMl9EQ1RTICAgMHgyMDAgLy8gQ1RTIGNoYW5nZWQgZnJvbSBpdHMgZm9ybWVyIHZhbHVlIAorI2RlZmluZSBJMl9ERFNSICAgMHg0MDAgLy8gRFNSIGNoYW5nZWQgZnJvbSBpdHMgZm9ybWVyIHZhbHVlIAorI2RlZmluZSBJMl9EUkkgICAgMHg4MDAgLy8gUkkgY2hhbmdlZCBmcm9tIGl0cyBmb3JtZXIgdmFsdWUgCisKKy8vIGhvdEtleUluCisvLworI2RlZmluZSBIT1RfQ0xFQVIgMHgxMzIyICAgLy8gSW5kaWNhdGVzIHRoYXQgbm8gaG90LWtleSBoYXMgYmVlbiBkZXRlY3RlZAorCisvLyBjaGFubmVsT3B0aW9ucworLy8KKyNkZWZpbmUgQ09fTkJMT0NLX1dSSVRFIDEgIAkvLyBXcml0ZXMgZG9uJ3QgYmxvY2sgd2FpdGluZyBmb3IgYnVmZmVyLiAoRGVmYXVsdAorCQkJCQkJCS8vIGlzLCB0aGV5IGRvIHdhaXQuKQorCisvLyBmY21vZGVzCisvLworI2RlZmluZSBJMl9PVVRGTE9XX0NUUyAgMHgwMDAxCisjZGVmaW5lIEkyX0lORkxPV19SVFMgICAweDAwMDIKKyNkZWZpbmUgSTJfSU5GTE9XX0RTUiAgIDB4MDAwNAorI2RlZmluZSBJMl9JTkZMT1dfRFRSICAgMHgwMDA4CisjZGVmaW5lIEkyX09VVEZMT1dfRFNSICAweDAwMTAKKyNkZWZpbmUgSTJfT1VURkxPV19EVFIgIDB4MDAyMAorI2RlZmluZSBJMl9PVVRGTE9XX1hPTiAgMHgwMDQwCisjZGVmaW5lIEkyX09VVEZMT1dfWEFOWSAweDAwODAKKyNkZWZpbmUgSTJfSU5GTE9XX1hPTiAgIDB4MDEwMAorCisjZGVmaW5lIEkyX0NSVFNDVFMgICAgICAoSTJfT1VURkxPV19DVFN8STJfSU5GTE9XX1JUUykKKyNkZWZpbmUgSTJfSVhBTllfTU9ERSAgIChJMl9PVVRGTE9XX1hPTnxJMl9PVVRGTE9XX1hBTlkpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFjcm9zIHVzZWQgZnJvbSB1c2VyIGxldmVsIGxpa2UgZnVuY3Rpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTWFjcm9zIHRvIHNldCBhbmQgY2xlYXIgY2hhbm5lbCBvcHRpb25zCisvLworI2RlZmluZSBpMlNldE9wdGlvbihwQ2gsIG9wdGlvbikgcENoLT5jaGFubmVsT3B0aW9ucyB8PSBvcHRpb24KKyNkZWZpbmUgaTJDbHJPcHRpb24ocENoLCBvcHRpb24pIHBDaC0+Y2hhbm5lbE9wdGlvbnMgJj0gfm9wdGlvbgorCisvLyBNYWNybyB0byBzZXQgZmF0YWwtZXJyb3IgdHJhcAorLy8KKyNkZWZpbmUgaTJTZXRGYXRhbFRyYXAocEIsIHJvdXRpbmUpIHBCLT5pMmVGYXRhbFRyYXAgPSByb3V0aW5lCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY2xhcmF0aW9ucyBhbmQgcHJvdG90eXBlcyBmb3IgaTJsaWIuYworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KK3N0YXRpYyBpbnQgIGkySW5pdENoYW5uZWxzKGkyZUJvcmRTdHJQdHIsIGludCwgaTJDaGFuU3RyUHRyKTsKK3N0YXRpYyBpbnQgIGkyUXVldWVDb21tYW5kcyhpbnQsIGkyQ2hhblN0clB0ciwgaW50LCBpbnQsIGNtZFN5bnRheFB0ciwuLi4pOworc3RhdGljIGludCAgaTJHZXRTdGF0dXMoaTJDaGFuU3RyUHRyLCBpbnQpOworc3RhdGljIGludCAgaTJJbnB1dChpMkNoYW5TdHJQdHIpOworc3RhdGljIGludCAgaTJJbnB1dEZsdXNoKGkyQ2hhblN0clB0cik7CitzdGF0aWMgaW50ICBpMk91dHB1dChpMkNoYW5TdHJQdHIsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOworc3RhdGljIGludCAgaTJPdXRwdXRGcmVlKGkyQ2hhblN0clB0cik7CitzdGF0aWMgaW50ICBpMlNlcnZpY2VCb2FyZChpMmVCb3JkU3RyUHRyKTsKK3N0YXRpYyB2b2lkIGkyRHJhaW5PdXRwdXQoaTJDaGFuU3RyUHRyLCBpbnQpOworCisjaWZkZWYgSVAyREVCVUdfVFJBQ0UKK3ZvaWQgaXAydHJhY2UodW5zaWduZWQgc2hvcnQsdW5zaWduZWQgY2hhcix1bnNpZ25lZCBjaGFyLHVuc2lnbmVkIGxvbmcsLi4uKTsKKyNlbHNlCisjZGVmaW5lIGlwMnRyYWNlKGEsYixjLGQuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKy8vIEFyZ3VtZW50IHRvIGkyUXVldWVDb21tYW5kcworLy8KKyNkZWZpbmUgQ19JTl9MSU5FIDEKKyNkZWZpbmUgQ19CWVBBU1MgIDAKKworI2VuZGlmICAgLy8gSTJMSUJfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pMm9zLmggYi9kcml2ZXJzL2NoYXIvaXAyL2kyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmY5YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMm9zLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgKGMpIDE5OTkgYnkgQ29tcHV0b25lIENvcnBvcmF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKiAgIFBBQ0tBR0U6ICAgICBMaW51eCB0dHkgRGV2aWNlIERyaXZlciBmb3IgSW50ZWxsaVBvcnQgSUkgZmFtaWx5IG9mIG11bHRpcG9ydAorKiAgICAgICAgICAgICAgICBzZXJpYWwgSS9PIGNvbnRyb2xsZXJzLgorKgorKiAgIERFU0NSSVBUSU9OOiBEZWZpbmVzLCBkZWZpbml0aW9ucyBhbmQgaW5jbHVkZXMgd2hpY2ggYXJlIGhlYXZpbHkgZGVwZW5kZW50CisqICAgICAgICAgICAgICAgIG9uIE8vUywgaG9zdCwgY29tcGlsZXIsIGV0Yy4gVGhpcyBmaWxlIGlzIHRhaWxvcmVkIGZvcjoKKyogICAgICAgICAgICAgICAgIExpbnV4IHYyLjAuMCBhbmQgbGF0ZXIKKyogICAgICAgICAgICAgICAgIEdudSBnY2MgYzIuNy4yCisqICAgICAgICAgICAgICAgICA4MHg4NiBhcmNoaXRlY3R1cmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSTJPU19IICAgIC8qIFRvIHByZXZlbnQgbXVsdGlwbGUgaW5jbHVkZXMgKi8KKyNkZWZpbmUgSTJPU19IIDEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXF1aXJlZCBJbmNsdWRlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpbmNsdWRlICJpcDJ0eXBlcy5oIgorI2luY2x1ZGUgPGFzbS9pby5oPiAgLyogRm9yIGluYiwgZXRjICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbmVzIGZvciBJL08gaW5zdHJ1Y3Rpb25zOgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBJTkIocG9ydCkgICAgICAgICAgICAgICAgaW5iKHBvcnQpCisjZGVmaW5lIE9VVEIocG9ydCx2YWx1ZSkgICAgICAgICBvdXRiKCh2YWx1ZSksKHBvcnQpKQorI2RlZmluZSBJTlcocG9ydCkgICAgICAgICAgICAgICAgaW53KHBvcnQpCisjZGVmaW5lIE9VVFcocG9ydCx2YWx1ZSkgICAgICAgICBvdXR3KCh2YWx1ZSksKHBvcnQpKQorI2RlZmluZSBPVVRTVyhwb3J0LGFkZHIsY291bnQpICAgb3V0c3coKHBvcnQpLChhZGRyKSwoKChjb3VudCkrMSkvMikpCisjZGVmaW5lIE9VVFNCKHBvcnQsYWRkcixjb3VudCkgICBvdXRzYigocG9ydCksKGFkZHIpLCgoKGNvdW50KSsxKSkmLTIpCisjZGVmaW5lIElOU1cocG9ydCxhZGRyLGNvdW50KSAgICBpbnN3KChwb3J0KSwoYWRkciksKCgoY291bnQpKzEpLzIpKQorI2RlZmluZSBJTlNCKHBvcnQsYWRkcixjb3VudCkgICAgaW5zYigocG9ydCksKGFkZHIpLCgoKGNvdW50KSsxKSkmLTIpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVycnVwdCBjb250cm9sCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTE9DS19JTklUKGEpCXJ3bG9ja19pbml0KGEpCisKKyNkZWZpbmUgU0FWRV9BTkRfRElTQUJMRV9JTlRTKGEsYikgeyBcCisJLyogcHJpbnRrKCJnZXRfbG9jazogMHgleCwlNGQsJXNcbiIsKGludClhLF9fTElORV9fLF9fRklMRV9fKTsqLyBcCisJc3Bpbl9sb2NrX2lycXNhdmUoYSxiKTsgXAorfQorCisjZGVmaW5lIFJFU1RPUkVfSU5UUyhhLGIpIHsgXAorCS8qIHByaW50aygicmVsX2xvY2s6IDB4JXgsJTRkLCVzXG4iLChpbnQpYSxfX0xJTkVfXyxfX0ZJTEVfXyk7Ki8gXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYSxiKTsgXAorfQorCisjZGVmaW5lIFJFQURfTE9DS19JUlFTQVZFKGEsYikgeyBcCisJLyogcHJpbnRrKCJnZXRfcmVhZF9sb2NrOiAweCV4LCU0ZCwlc1xuIiwoaW50KWEsX19MSU5FX18sX19GSUxFX18pOyovIFwKKwlyZWFkX2xvY2tfaXJxc2F2ZShhLGIpOyBcCit9CisKKyNkZWZpbmUgUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRShhLGIpIHsgXAorCS8qIHByaW50aygicmVsX3JlYWRfbG9jazogMHgleCwlNGQsJXNcbiIsKGludClhLF9fTElORV9fLF9fRklMRV9fKTsqLyBcCisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZShhLGIpOyBcCit9CisKKyNkZWZpbmUgV1JJVEVfTE9DS19JUlFTQVZFKGEsYikgeyBcCisJLyogcHJpbnRrKCJnZXRfd3JpdGVfbG9jazogMHgleCwlNGQsJXNcbiIsKGludClhLF9fTElORV9fLF9fRklMRV9fKTsqLyBcCisJd3JpdGVfbG9ja19pcnFzYXZlKGEsYik7IFwKK30KKworI2RlZmluZSBXUklURV9VTkxPQ0tfSVJRUkVTVE9SRShhLGIpIHsgXAorCS8qIHByaW50aygicmVsX3dyaXRlX2xvY2s6IDB4JXgsJTRkLCVzXG4iLChpbnQpYSxfX0xJTkVfXyxfX0ZJTEVfXyk7Ki8gXAorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKGEsYik7IFwKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGFyZHdhcmUtZGVsYXkgbG9vcAorLy8KKy8vIFByb2JhYmx5IHVzZWQgaW4gb25seSBvbmUgcGxhY2UgKHNlZSBpMmVsbGlzLmMpIGJ1dCB0aGlzIGhlbHBzIGtlZXAgdGhpbmdzCisvLyB0b2dldGhlci4gTm90ZSB3ZSBoYXZlIHVud291bmQgdGhlIElOIGluc3RydWN0aW9ucy4gT24gbWFjaGluZXMgd2l0aCBhCisvLyByZWFzb25hYmxlIGNhY2hlLCB0aGUgZWlnaHQgaW5zdHJ1Y3Rpb25zICgxIGJ5dGUgZWFjaCkgc2hvdWxkIGZpdCBpbiBjYWNoZQorLy8gbmljZWx5LCBhbmQgb24gdW4tY2FjaGVkIG1hY2hpbmVzLCB0aGUgY29kZS1mZXRjaCB3b3VsZCB0ZW5kIG5vdCB0byBkb21pbmF0ZS4KKy8vIE5vdGUgdGhhdCBjeCBpcyBzaGlmdGVkIHNvIHRoYXQgImNvdW50IiBzdGlsbCByZWZsZWN0cyB0aGUgdG90YWwgbnVtYmVyIG9mCisvLyBpdGVyYXRpb25zIGFzc3VtaW5nIG5vIHVud2luZGluZy4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vI2RlZmluZSAgREVMQVkxTVMocG9ydCxjb3VudCxsYWJlbCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hY3JvcyB0byBzd2l0Y2ggdG8gYSBuZXcgc3RhY2ssIHNhdmluZyBzdGFjayBwb2ludGVycywgYW5kIHRvIHJlc3RvcmUgdGhlCisvLyBvbGQgc3RhY2sgKFVzZWQsIGZvciBleGFtcGxlLCBpbiBpMmxpYi5jKSAiaGVhcCIgaXMgdGhlIGFkZHJlc3Mgb2Ygc29tZQorLy8gYnVmZmVyIHdoaWNoIHdpbGwgYmVjb21lIHRoZSBuZXcgc3RhY2sgKHdvcmtpbmcgZG93biBmcm9tIGhpZ2hlc3QgYWRkcmVzcykuCisvLyBUaGUgdHdvIHdvcmRzIGF0IHRoZSB0d28gbG93ZXN0IGFkZHJlc3NlcyBpbiB0aGlzIHN0YWNrIGFyZSBmb3Igc3RvcmluZyB0aGUKKy8vIFNTIGFuZCBTUC4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vI2RlZmluZSAgVE9fTkVXX1NUQUNLKGhlYXAsc2l6ZSkKKy8vI2RlZmluZSAgVE9fT0xEX1NUQUNLKGhlYXApCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWNyb3MgdG8gc2F2ZSB0aGUgb3JpZ2luYWwgSVJRIHZlY3RvcnMgYW5kIG1hc2tzLCBhbmQgdG8gcGF0Y2ggaW4gbmV3IG9uZXMuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyNkZWZpbmUgIFNBVkVfSVJRX01BU0tTKGRlc3QpCisvLyNkZWZpbmUgIFdSSVRFX0lSUV9NQVNLUyhzcmMpCisvLyNkZWZpbmUgIFNBVkVfSVJRX1ZFQ1RPUih2YWx1ZSxkZXN0KQorLy8jZGVmaW5lICBXUklURV9JUlFfVkVDVE9SKHZhbHVlLHNyYykKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hY3JvIHRvIGNvcHkgZGF0YSBmcm9tIG9uZSBmYXIgcG9pbnRlciB0byBhbm90aGVyLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSAgSTJfTU9WRV9EQVRBKGZwU291cmNlLGZwRGVzdCxjb3VudCkgbWVtbW92ZShmcERlc3QsZnBTb3VyY2UsY291bnQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFjcm9zIHRvIGlzc3VlIGVvaSdzIHRvIGhvc3QgaW50ZXJydXB0IGNvbnRyb2wgKElCTSBBVCA4MjU5LXN0eWxlKS4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vI2RlZmluZSBNQVNURVJfRU9JCisvLyNkZWZpbmUgU0xBVkVfRU9JCisKKyNlbmRpZiAgIC8qIEkyT1NfSCAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaTJwYWNrLmggYi9kcml2ZXJzL2NoYXIvaXAyL2kycGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Yjg3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2kycGFjay5oCkBAIC0wLDAgKzEsMzY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIChjKSAxOTk4IGJ5IENvbXB1dG9uZSBDb3Jwb3JhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogICBQQUNLQUdFOiAgICAgTGludXggdHR5IERldmljZSBEcml2ZXIgZm9yIEludGVsbGlQb3J0IElJIGZhbWlseSBvZiBtdWx0aXBvcnQKKyogICAgICAgICAgICAgICAgc2VyaWFsIEkvTyBjb250cm9sbGVycy4KKyoKKyogICBERVNDUklQVElPTjogRGVmaW5pdGlvbnMgb2YgdGhlIHBhY2tldHMgdXNlZCB0byB0cmFuc2ZlciBkYXRhIGFuZCBjb21tYW5kcworKiAgICAgICAgICAgICAgICBIb3N0IDwtLT4gQm9hcmQuIEluZm9ybWF0aW9uIHByb3ZpZGVkIGhlcmUgaXMgb25seSBhcHBsaWNhYmxlCisqICAgICAgICAgICAgICAgIHdoZW4gdGhlIHN0YW5kYXJkIGxvYWR3YXJlIGlzIGFjdGl2ZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEkyUEFDS19ICisjZGVmaW5lIEkyUEFDS19IICAxCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmlzaW9uIEhpc3Rvcnk6CisvLworLy8gMTAgT2N0b2JlciAxOTkxICAgTUFHIEZpcnN0IGRyYWZ0CisvLyAyNCBGZWJydWFyeSAxOTkyICBNQUcgQWRkaXRpb25zIGZvciAxLjQueCBsb2Fkd2FyZQorLy8gMTEgTWFyY2ggMTk5MiAgICAgTUFHIE5ldyBzdGF0dXMgcGFja2V0cworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhY2tldCBGb3JtYXRzOgorLy8KKy8vIEluZm9ybWF0aW9uIHBhc3NlcyBiZXR3ZWVuIHRoZSBob3N0IGFuZCBib2FyZCB0aHJvdWdoIHRoZSBGSUZPIGluIHBhY2tldHMuCisvLyBUaGVzZSBoYXZlIGhlYWRlcnMgd2hpY2ggaW5kaWNhdGUgdGhlIHR5cGUgb2YgcGFja2V0LiBCZWNhdXNlIHRoZSBmaWZvIGRhdGEKKy8vIHBhdGggbWF5IGJlIDE2LWJpdHMgd2lkZSwgdGhlIHByb3RvY29sIGlzIGNvbnN0cmFpbmVkIHN1Y2ggdGhhdCBlYWNoIHBhY2tldAorLy8gaXMgYWx3YXlzIHBhZGRlZCB0byBhbiBldmVuIGJ5dGUgY291bnQuIChUaGUgbG93ZXItbGV2ZWwgaW50ZXJmYWNlIHJvdXRpbmVzCisvLyAtLSBpMmVsbGlzLmMgLS0gYXJlIGRlc2lnbmVkIHRvIGRvIHRoaXMpLgorLy8KKy8vIFRoZSBzZW5kZXIgKGJlIGl0IGhvc3Qgb3IgYm9hcmQpIG11c3QgcGxhY2Ugc29tZSBudW1iZXIgb2YgY29tcGxldGUgcGFja2V0cworLy8gaW4gdGhlIGZpZm8sIHRoZW4gcGxhY2UgYSBtZXNzYWdlIGluIHRoZSBtYWlsYm94IHRoYXQgcGFja2V0cyBhcmUgYXZhaWxhYmxlLgorLy8gUGxhY2luZyBzdWNoIGEgbWVzc2FnZSBpbnRlcnJ1cHRzIHRoZSAicmVjZWl2ZXIiIChiZSBpdCBib2FyZCBvciBob3N0KSwgd2hvCisvLyByZWFkcyB0aGUgbWFpbGJveCBtZXNzYWdlIGFuZCBkZXRlcm1pbmVzIHRoYXQgdGhlcmUgYXJlIGluY29taW5nIHBhY2tldHMKKy8vIHJlYWR5LiBTaW5jZSB0aGVyZSBhcmUgbm8gcGFydGlhbCBwYWNrZXRzLCBhbmQgdGhlIGxlbmd0aCBvZiBhIHBhY2tldCBpcworLy8gZ2l2ZW4gaW4gdGhlIGhlYWRlciwgdGhlIHJlbWFpbmRlciBvZiB0aGUgcGFja2V0IGNhbiBiZSByZWFkIHdpdGhvdXQgY2hlY2tpbmcKKy8vIGZvciBGSUZPIGVtcHR5IGNvbmRpdGlvbi4gVGhlIHByb2Nlc3MgaXMgcmVwZWF0ZWQsIHBhY2tldCBieSBwYWNrZXQsIHVudGlsCisvLyB0aGUgaW5jb21pbmcgRklGTyBpcyBlbXB0eS4gVGhlbiB0aGUgcmVjZWl2ZXIgdXNlcyB0aGUgb3V0Ym91bmQgbWFpbGJveCB0bworLy8gc2lnbmFsIHRoZSBib2FyZCB0aGF0IGl0IGhhcyByZWFkIHRoZSBkYXRhLiBPbmx5IHRoZW4gY2FuIHRoZSBzZW5kZXIgcGxhY2UKKy8vIGFkZGl0aW9uYWwgZGF0YSBpbiB0aGUgZmlmby4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmluaXRpb24gb2YgUGFja2V0IEhlYWRlciBBcmVhCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENhdXRpb246IHRoZXNlIG9ubHkgZGVmaW5lIGhlYWRlciBhcmVhcy4gSW4gYWN0dWFsIHVzZSB0aGUgZGF0YSBydW5zIG9mZgorLy8gYmV5b25kIHRoZSBlbmQgb2YgdGhlc2Ugc3RydWN0dXJlcy4KKy8vCisvLyBTaW5jZSB0aGVzZSBzdHJ1Y3R1cmVzIGFyZSBiYXNlZCBvbiBzZXF1ZW5jZXMgb2YgYnl0ZXMgd2hpY2ggZ28gdG8gdGhlIGJvYXJkLAorLy8gdGhlcmUgY2Fubm90IGJlIEFOWSBwYWRkaW5nIGJldHdlZW4gdGhlIGVsZW1lbnRzLgorI3ByYWdtYSBwYWNrKDEpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gREFUQSBQQUNLRVRTCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX2kyRGF0YUhlYWRlcgoreworCXVuc2lnbmVkIGNoYXIgaTJzQ2hhbm5lbDsgIC8qIFRoZSBjaGFubmVsIG51bWJlcjogMC0yNTUgKi8KKworCS8vIC0tIEJpdGZpZWxkcyBhcmUgYWxsb2NhdGVkIExTQiBmaXJzdCAtLQorCisJLy8gRm9yIGluY29taW5nIGRhdGEsIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gb3JkaW5hcnkgcGFja2V0IG9yIGEKKwkvLyBzcGVjaWFsIG9uZSAoZS5nLiwgaG90IGtleSBoaXQpLgorCXVuc2lnbmVkIGkyc0lkIDogMiBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisJLy8gRm9yIHRhZ2dpbmcgZGF0YSBwYWNrZXRzLiBUaGVyZSBhcmUgZmx1c2ggY29tbWFuZHMgd2hpY2ggZmx1c2ggb25seSBkYXRhCisJLy8gcGFja2V0cyBiZWFyaW5nIGEgcGFydGljdWxhciB0YWcuICh1c2VkIGluIGltcGxlbWVudGluZyBJbnRlbGxpVmlldyBhbmQKKwkvLyBJbnRlbGxpUHJpbnQpLiBUSEUgVEFHIFZBTFVFIDB4ZiBpcyBSRVNFUlZFRCBhbmQgbXVzdCBub3QgYmUgdXNlZCAoaXQgaGFzCisJLy8gbWVhbmluZyBpbnRlcm5hbGx5IHRvIHRoZSBsb2Fkd2FyZSkuCisJdW5zaWduZWQgaTJzVGFnIDogNDsKKworCS8vIFRoZXNlIHR3byBiaXRzIGRldGVybWluZSB0aGUgdHlwZSBvZiBwYWNrZXQgc2VudC9yZWNlaXZlZC4KKwl1bnNpZ25lZCBpMnNUeXBlIDogMjsKKworCS8vIFRoZSBjb3VudCBvZiBkYXRhIHRvIGZvbGxvdzogZG9lcyBub3QgaW5jbHVkZSB0aGUgcG9zc2libGUgYWRkaXRpb25hbAorCS8vIHBhZGRpbmcgYnl0ZS4gTUFYSU1VTSBDT1VOVDogNDA5NC4gVGhlIHRvcCBmb3VyIGJpdHMgbXVzdCBiZSAwLgorCXVuc2lnbmVkIHNob3J0IGkyc0NvdW50OworCit9IGkyRGF0YUhlYWRlciwgKmkyRGF0YUhlYWRlclB0cjsKKworLy8gU3RydWN0dXJlIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHRoZSBkYXRhLCBwcm9wZXIuCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTk9OLURBVEEgUEFDS0VUUworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IF9pMkNtZEhlYWRlcgoreworCXVuc2lnbmVkIGNoYXIgaTJzQ2hhbm5lbDsJLy8gVGhlIGNoYW5uZWwgbnVtYmVyOiAwLTI1NSAoRXhjZXB0IHdoZXJlIG5vdGVkCisJCQkJCQkJCS8vIC0gc2VlIGJlbG93CisKKwkvLyBOdW1iZXIgb2YgYnl0ZXMgb2YgY29tbWFuZHMsIHN0YXR1cyBvciB3aGF0ZXZlciB0byBmb2xsb3cKKwl1bnNpZ25lZCBpMnNDb3VudCA6IDY7CisKKwkvLyBUaGVzZSB0d28gYml0cyBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgcGFja2V0IHNlbnQvcmVjZWl2ZWQuCisJdW5zaWduZWQgaTJzVHlwZSA6IDI7CisKK30gaTJDbWRIZWFkZXIsICppMkNtZEhlYWRlclB0cjsKKworLy8gU3RydWN0dXJlIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHRoZSBhcHBsaWNhYmxlIGRhdGEuCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGbG93IENvbnRyb2wgUGFja2V0cyAoT3V0Ym91bmQpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBPbmUgdHlwZSBvZiBvdXRib3VuZCBjb21tYW5kIHBhY2tldCBpcyBzbyBpbXBvcnRhbnQgdGhhdCB0aGUgZW50aXJlIHN0cnVjdHVyZQorLy8gaXMgZXhwbGljaXRseSBkZWZpbmVkIGhlcmUuIFRoYXQgaXMgdGhlIGZsb3ctY29udHJvbCBwYWNrZXQuIFRoaXMgaXMgbmV2ZXIKKy8vIHNlbnQgYnkgdXNlci1sZXZlbCBjb2RlIChhcyB3b3VsZCBiZSB0aGUgY29tbWFuZHMgdG8gcmFpc2UvbG93ZXIgRFRSLCBmb3IKKy8vIGV4YW1wbGUpLiBUaGVzZSBhcmUgb25seSBzZW50IGJ5IHRoZSBsaWJyYXJ5IHJvdXRpbmVzIGluIHJlc3BvbnNlIHRvIHJlYWRpbmcKKy8vIGluY29taW5nIGRhdGEgaW50byB0aGUgYnVmZmVycy4KKy8vCisvLyBUaGUgcGFyYW1ldGVycyBpbnNpZGUgdGhlIGNvbW1hbmQgYmxvY2sgYXJlIG1haW50YWluZWQgaW4gcGxhY2UsIHRoZW4gdGhlCisvLyBibG9jayBpcyBzZW50IGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lLgorCit0eXBlZGVmIHN0cnVjdCBfZmxvd0luCit7CisJaTJDbWRIZWFkZXIgICAgaGQ7ICAgICAgLy8gQ2hhbm5lbCAjLCBjb3VudCwgdHlwZSAoc2VlIGFib3ZlKQorCXVuc2lnbmVkIGNoYXIgIGZjbWQ7ICAgIC8vIFRoZSBmbG93IGNvbnRyb2wgY29tbWFuZCAoMzcpCisJdW5zaWduZWQgc2hvcnQgYXNvZjsgICAgLy8gQXMgb2YgYnl0ZSBudW1iZXIgImFzb2YiIChMU0IgZmlyc3QhKSBJIGhhdmUgcm9vbQorCQkJCQkJCS8vIGZvciAicm9vbSIgYnl0ZXMKKwl1bnNpZ25lZCBzaG9ydCByb29tOworfSBmbG93SW4sICpmbG93SW5QdHI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gKEluY29taW5nKSBTdGF0dXMgUGFja2V0cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEluY29taW5nIHBhY2tldHMgd2hpY2ggYXJlIG5vbi1kYXRhIHBhY2tldHMgYXJlIHN0YXR1cyBwYWNrZXRzLiBJbiB0aGlzIGNhc2UsCisvLyB0aGUgY2hhbm5lbCBudW1iZXIgaW4gdGhlIGhlYWRlciBpcyB1bmltcG9ydGFudC4gV2hhdCBmb2xsb3dzIGFyZSBvbmUgb3IgbW9yZQorLy8gc3ViLXBhY2tldHMsIHRoZSBmaXJzdCB3b3JkIG9mIHdoaWNoIGNvbnNpc3RzIG9mIHRoZSBjaGFubmVsIChmaXJzdCBvciBsb3cKKy8vIGJ5dGUpIGFuZCB0aGUgc3RhdHVzIGluZGljYXRvciAoc2Vjb25kIG9yIGhpZ2ggYnl0ZSksIGZvbGxvd2VkIGJ5IHBvc3NpYmx5CisvLyBtb3JlIGRhdGEuCisKKyNkZWZpbmUgU1RBVF9DVFNfVVAgICAgIDAgIC8qIENUUyByYWlzZWQgIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9DVFNfRE4gICAgIDEgIC8qIENUUyBkcm9wcGVkIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9EQ0RfVVAgICAgIDIgIC8qIERDRCByYWlzZWQgIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9EQ0RfRE4gICAgIDMgIC8qIERDRCBkcm9wcGVkIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9EU1JfVVAgICAgIDQgIC8qIERTUiByYWlzZWQgIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9EU1JfRE4gICAgIDUgIC8qIERTUiBkcm9wcGVkIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9SSV9VUCAgICAgIDYgIC8qIFJJICByYWlzZWQgIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9SSV9ETiAgICAgIDcgIC8qIFJJICBkcm9wcGVkIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9CUktfREVUICAgIDggIC8qIEJSSyBkZXRlY3QgIChubyBvdGhlciBieXRlcykgKi8KKyNkZWZpbmUgU1RBVF9GTE9XICAgICAgIDkgIC8qIEZsb3cgY29udHJvbCgtLSBtb3JlOiBzZWUgYmVsb3cgKi8KKyNkZWZpbmUgU1RBVF9CTUFSSyAgICAgIDEwIC8qIEJvb2ttYXJrICAgIChubyBvdGhlciBieXRlcykKKwkJCQkJCQkqIEJvb2ttYXJrIGlzIHNlbnQgYXMgYSByZXNwb25zZSB0bworCQkJCQkJCSogYSBjb21tYW5kIDYwOiByZXF1ZXN0IGZvciBib29rbWFyaworCQkJCQkJCSovCisjZGVmaW5lIFNUQVRfU1RBVFVTICAgICAxMSAvKiBTcGVjaWFsIHBhY2tldDogc2VlIGJlbG93ICovCisjZGVmaW5lIFNUQVRfVFhDTlQgICAgICAxMiAvKiBTcGVjaWFsIHBhY2tldDogc2VlIGJlbG93ICovCisjZGVmaW5lIFNUQVRfUlhDTlQgICAgICAxMyAvKiBTcGVjaWFsIHBhY2tldDogc2VlIGJlbG93ICovCisjZGVmaW5lIFNUQVRfQk9YSURTICAgICAxNCAvKiBTcGVjaWFsIHBhY2tldDogc2VlIGJlbG93ICovCisjZGVmaW5lIFNUQVRfSFdGQUlMICAgICAxNSAvKiBTcGVjaWFsIHBhY2tldDogc2VlIGJlbG93ICovCisKKyNkZWZpbmUgU1RBVF9NT0RfRVJST1IgIDB4YzAKKyNkZWZpbmUgU1RBVF9NT0RFTSAgICAgIDB4YzAvKiBJZiBzdGF0dXMgJiBTVEFUX01PRF9FUlJPUjoKKwkJCQkJCQkgKiA9PSBTVEFUX01PREVNLCB0aGVuIHRoaXMgaXMgYSBtb2RlbQorCQkJCQkJCSAqIHN0YXR1cyBwYWNrZXQsIGdpdmVuIGluIHJlc3BvbnNlIHRvIGEKKwkJCQkJCQkgKiBDTURfRFNTX05PVyBjb21tYW5kLgorCQkJCQkJCSAqIFRoZSBsb3cgbmliYmxlIGhhcyBlYWNoIGRhdGEgc2lnbmFsOgorCQkJCQkJCSAqLworI2RlZmluZSBTVEFUX01PRF9EQ0QgICAgMHg4CisjZGVmaW5lIFNUQVRfTU9EX1JJICAgICAweDQKKyNkZWZpbmUgU1RBVF9NT0RfRFNSICAgIDB4MgorI2RlZmluZSBTVEFUX01PRF9DVFMgICAgMHgxCisKKyNkZWZpbmUgU1RBVF9FUlJPUiAgICAgIDB4ODAvKiBJZiBzdGF0dXMgJiBTVEFUX01PRF9FUlJPUgorCQkJCQkJCSAqID09IFNUQVRfRVJST1IsIHRoZW4KKwkJCQkJCQkgKiBzb3J0IG9mIGVycm9yIG9uIHRoZSBjaGFubmVsLgorCQkJCQkJCSAqIFRoZSByZW1haW5pbmcgc2V2ZW4gYml0cyBpbmRpY2F0ZQorCQkJCQkJCSAqIHdoYXQgc29ydCBvZiBlcnJvciBpdCBpcy4KKwkJCQkJCQkgKi8KKy8qIFRoZSBsb3cgdGhyZWUgYml0cyBpbmRpY2F0ZSBwYXJpdHksIGZyYW1pbmcsIG9yIG92ZXJydW4gZXJyb3JzICovCisKKyNkZWZpbmUgU1RBVF9FX1BBUklUWSAgIDQgICAgIC8qIFBhcml0eSBlcnJvciAqLworI2RlZmluZSBTVEFUX0VfRlJBTUlORyAgMiAgICAgLyogRnJhbWluZyBlcnJvciAqLworI2RlZmluZSBTVEFUX0VfT1ZFUlJVTiAgMSAgICAgLyogKHV4YXJ0KSBvdmVycnVuIGVycm9yICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTVEFUX0ZMT1cgcGFja2V0cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX2Zsb3dTdGF0Cit7CisJdW5zaWduZWQgc2hvcnQgYXNvZjsKKwl1bnNpZ25lZCBzaG9ydCByb29tOworfWZsb3dTdGF0LCAqZmxvd1N0YXRQdHI7CisKKy8vIGZsb3dTdGF0IHBhY2tldHMgYXJlIHJlY2VpdmVkIGZyb20gdGhlIGJvYXJkIHRvIHJlZ3VsYXRlIHRoZSBmbG93IG9mIG91dGdvaW5nCisvLyBkYXRhLiBBIGxvY2FsIGNvcHkgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgYWxzbyBrZXB0IHRvIHRyYWNrIHRoZSBhbW91bnQgb2YKKy8vIGNyZWRpdHMgdXNlZCBhbmQgY3JlZGl0cyByZW1haW5pbmcuICJyb29tIiBpcyB0aGUgYW1vdW50IG9mIHNwYWNlIGluIHRoZQorLy8gYm9hcmQncyBidWZmZXJzLCAiYXMgb2YiIGhhdmluZyByZWNlaXZlZCBhIGNlcnRhaW4gYnl0ZSBudW1iZXIuIFdoZW4gc2VuZGluZworLy8gZGF0YSB0byB0aGUgZmlmbywgeW91IG11c3QgY2FsY3VsYXRlIGhvdyBtdWNoIGJ1ZmZlciBzcGFjZSB5b3VyIHBhY2tldCB3aWxsCisvLyB1c2UuICBBZGQgdGhpcyB0byB0aGUgY3VycmVudCAiYXNvZiIgYW5kIHN1YnRyYWN0IGl0IGZyb20gdGhlIGN1cnJlbnQgInJvb20iLgorLy8KKy8vIFRoZSBjYWxjdWxhdGlvbiBmb3IgdGhlIGJvYXJkJ3MgYnVmZmVyIGlzIGdpdmVuIGJ5IENSRURJVF9VU0FHRSwgd2hlcmUgc2l6ZQorLy8gaXMgdGhlIHVuLXJvdW5kZWQgY291bnQgb2YgZWl0aGVyIGRhdGEgY2hhcmFjdGVycyBvciBjb21tYW5kIGNoYXJhY3RlcnMuCisvLyAoV2hpY2ggaXMgdG8gc2F5LCB0aGUgY291bnQgcm91bmRlZCB1cCwgcGx1cyB0d28pLgorCisjZGVmaW5lIENSRURJVF9VU0FHRShzaXplKSAoKChzaXplKSArIDMpICYgfjEpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTVEFUX1NUQVRVUyBwYWNrZXRzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmICBzdHJ1Y3QgICBfZGVidWdTdGF0Cit7CisJdW5zaWduZWQgY2hhciBkX2Njc3I7CisJdW5zaWduZWQgY2hhciBkX3R4aW5oOworCXVuc2lnbmVkIGNoYXIgZF9zdGF0MTsKKwl1bnNpZ25lZCBjaGFyIGRfc3RhdDI7Cit9IGRlYnVnU3RhdCwgKmRlYnVnU3RhdFB0cjsKKworLy8gZGVidWdTdGF0IHBhY2tldHMgYXJlIHNlbnQgdG8gdGhlIGhvc3QgaW4gcmVzcG9uc2UgdG8gYSBDTURfR0VUX1NUQVRVUworLy8gY29tbWFuZC4gIEVhY2ggYnl0ZSBpcyBiaXQtbWFwcGVkIGFzIGRlc2NyaWJlZCBiZWxvdzoKKworI2RlZmluZSBEX0NDU1JfWE9OICAgICAgMiAgICAgLyogSGFzIHJlY2VpdmVkIFhPTiwgcmVhZHkgdG8gdHJhbnNtaXQgKi8KKyNkZWZpbmUgRF9DQ1NSX1hPRkYgICAgIDQgICAgIC8qIEhhcyByZWNlaXZlZCBYT0ZGLCBub3QgdHJhbnNtaXR0aW5nICovCisjZGVmaW5lIERfQ0NTUl9UWEVOQUIgICA4ICAgICAvKiBUcmFuc21pdHRlciBpcyBlbmFibGVkICovCisjZGVmaW5lIERfQ0NTUl9SWEVOQUIgICAweDgwICAvKiBSZWNlaXZlciBpcyBlbmFibGVkICovCisKKyNkZWZpbmUgRF9UWElOSF9CUkVBSyAgIDEgICAgIC8qIFdlIGFyZSBzZW5kaW5nIGEgYnJlYWsgKi8KKyNkZWZpbmUgRF9UWElOSF9FTVBUWSAgIDIgICAgIC8qIE5vIGRhdGEgdG8gc2VuZCAqLworI2RlZmluZSBEX1RYSU5IX1NVU1AgICAgNCAgICAgLyogT3V0cHV0IHN1c3BlbmRlZCB2aWEgY29tbWFuZCA1NyAqLworI2RlZmluZSBEX1RYSU5IX0NNRCAgICAgOCAgICAgLyogV2UgYXJlIHByb2Nlc3NpbmcgYW4gaW4tbGluZSBjb21tYW5kICovCisjZGVmaW5lIERfVFhJTkhfTENEICAgICAweDEwICAvKiBMQ0QgZGlhZ25vc3RpY3MgYXJlIHJ1bm5pbmcgKi8KKyNkZWZpbmUgRF9UWElOSF9QQVVTRSAgIDB4MjAgIC8qIFdlIGFyZSBwcm9jZXNzaW5nIGEgUEFVU0UgY29tbWFuZCAqLworI2RlZmluZSBEX1RYSU5IX0RDRCAgICAgMHg0MCAgLyogRENEIGlzIGxvdywgcHJldmVudGluZyB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgRF9UWElOSF9EU1IgICAgIDB4ODAgIC8qIERTUiBpcyBsb3csIHByZXZlbnRpbmcgdHJhbnNtaXNzaW9uICovCisKKyNkZWZpbmUgRF9TVEFUMV9UWEVOICAgIDEgICAgIC8qIFRyYW5zbWl0IElOVEVSUlVQVFMgZW5hYmxlZCAqLworI2RlZmluZSBEX1NUQVQxX1JYRU4gICAgMiAgICAgLyogUmVjZWl2ZXIgSU5URVJSVVBUUyBlbmFibGVkICovCisjZGVmaW5lIERfU1RBVDFfTURFTiAgICA0ICAgICAvKiBNb2RlbSAoZGF0YSBzZXQgc2lncykgaW50ZXJydXB0cyBlbmFibGVkICovCisjZGVmaW5lIERfU1RBVDFfUkxNICAgICA4ICAgICAvKiBSZW1vdGUgbG9vcGJhY2sgbW9kZSBzZWxlY3RlZCAqLworI2RlZmluZSBEX1NUQVQxX0xMTSAgICAgMHgxMCAgLyogTG9jYWwgaW50ZXJuYWwgbG9vcGJhY2sgbW9kZSBzZWxlY3RlZCAqLworI2RlZmluZSBEX1NUQVQxX0NUUyAgICAgMHgyMCAgLyogQ1RTIGlzIGxvdywgcHJldmVudGluZyB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgRF9TVEFUMV9EVFIgICAgIDB4NDAgIC8qIERUUiBpcyBsb3csIHRvIHN0b3AgcmVtb3RlIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBEX1NUQVQxX1JUUyAgICAgMHg4MCAgLyogUlRTIGlzIGxvdywgdG8gc3RvcCByZW1vdGUgdHJhbnNtaXNzaW9uICovCisKKyNkZWZpbmUgRF9TVEFUMl9UWE1UICAgIDEgICAgIC8qIFRyYW5zbWl0IGJ1ZmZlcnMgYXJlIGFsbCBlbXB0eSAqLworI2RlZmluZSBEX1NUQVQyX1JYTVQgICAgMiAgICAgLyogUmVjZWl2ZSBidWZmZXJzIGFyZSBhbGwgZW1wdHkgKi8KKyNkZWZpbmUgRF9TVEFUMl9SWElOSCAgIDQgICAgIC8qIExvYWR3YXJlIGhhcyB0cmllZCB0byBpbmhpYml0IHJlbW90ZQorCQkJCQkJCSAgICogdHJhbnNtaXNzaW9uOiAgZHJvcHBlZCBEVFIsIHNlbnQgWE9GRiwKKwkJCQkJCQkgICAqIHdoYXRldmVyLi4uCisJCQkJCQkJICAgKi8KKyNkZWZpbmUgRF9TVEFUMl9SWEZMTyAgIDggICAgIC8qIExvYWR3YXJlIGNhbiBzZW5kIG5vIG1vcmUgZGF0YSB0byBob3N0CisJCQkJCQkJICAgKiB1bnRpbCBpdCByZWNlaXZlcyBhIGZsb3ctY29udHJvbCBwYWNrZXQKKwkJCQkJCQkgICAqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU1RBVF9UWENOVCBhbmQgU1RBVF9SWENOVCBwYWNrZXRzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiAgc3RydWN0ICAgX2NudFN0YXQKK3sKKwl1bnNpZ25lZCBzaG9ydCBjc190aW1lOyAgICAvLyAoQXNzdW1lcyBob3N0IGlzIGxpdHRsZS1lbmRpYW4hKQorCXVuc2lnbmVkIHNob3J0IGNzX2NvdW50OworfSBjbnRTdGF0LCAqY250U3RhdFB0cjsKKworLy8gVGhlc2UgcGFja2V0cyBhcmUgc2VudCBpbiByZXNwb25zZSB0byBhIENNRF9HRVRfUlhDTlQgb3IgYSBDTURfR0VUX1RYQ05UCisvLyBieXBhc3MgY29tbWFuZC4gY3NfdGltZSBpcyBhIHJ1bm5pbmcgMSBNaWxsaXNlY29uZCBjb3VudGVyIHdoaWNoIGFjdHMgYXMgYQorLy8gdGltZSBzdGFtcC4gY3NfY291bnQgaXMgYSBydW5uaW5nIGNvdW50ZXIgb2YgZGF0YSBzZW50IG9yIHJlY2VpdmVkIGZyb20gdGhlCisvLyB1eGFydHMuIChOb3QgaW5jbHVkaW5nIGRhdGEgYWRkZWQgYnkgdGhlIGNoaXAgaXRzZWxmLCBhcyB3aXRoIENSTEYKKy8vIHByb2Nlc3NpbmcpLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNUQVRfSFdGQUlMIHBhY2tldHMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IF9mYWlsU3RhdAoreworCXVuc2lnbmVkIGNoYXIgZnNfd3JpdHRlbjsKKwl1bnNpZ25lZCBjaGFyIGZzX3JlYWQ7CisJdW5zaWduZWQgc2hvcnQgZnNfYWRkcmVzczsKK30gZmFpbFN0YXQsICpmYWlsU3RhdFB0cjsKKworLy8gVGhpcyBwYWNrZXQgaXMgc2VudCB3aGVuZXZlciB0aGUgb24tYm9hcmQgZGlhZ25vc3RpYyBwcm9jZXNzIGRldGVjdHMgYW4KKy8vIGVycm9yLiBBdCBzdGFydHVwLCB0aGlzIHByb2Nlc3MgaXMgZG9ybWFudC4gVGhlIGhvc3QgY2FuIHdha2UgaXQgdXAgYnkKKy8vIGlzc3VpbmcgdGhlIGJ5cGFzcyBjb21tYW5kIENNRF9IV19URVNULiBUaGUgcHJvY2VzcyBydW5zIGF0IGxvdyBwcmlvcml0eSBhbmQKKy8vIHBlcmZvcm1zIGNvbnRpbnVvdXMgaGFyZHdhcmUgdmVyaWZpY2F0aW9uOyB3cml0aW5nIGRhdGEgdG8gY2VydGFpbiBvbi1ib2FyZAorLy8gcmVnaXN0ZXJzLCByZWFkaW5nIGl0IGJhY2ssIGFuZCBjb21wYXJpbmcuIElmIGl0IGRldGVjdHMgYW4gZXJyb3IsIHRoaXMKKy8vIHBhY2tldCBpcyBzZW50IHRvIHRoZSBob3N0LCBhbmQgdGhlIHByb2Nlc3MgZ29lcyBkb3JtYW50IGFnYWluIHVudGlsIHRoZSBob3N0CisvLyBzZW5kcyBhbm90aGVyIENNRF9IV19URVNULiBJdCB0aGVuIGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IHJlZ2lzdGVyIHRvIGJlCisvLyB0ZXN0ZWQuCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWNyb3MgdG8gZGVhbCB3aXRoIHRoZSBoZWFkZXJzIG1vcmUgZWFzaWx5ISBOb3RlIHRoYXQgdGhlc2UgYXJlIGRlZmluZWQgc28KKy8vIHRoZXkgbWF5IGJlIHVzZWQgYXMgImxlZnQiIGFzIHdlbGwgYXMgInJpZ2h0IiBleHByZXNzaW9ucy4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEdpdmVuIGEgcG9pbnRlciB0byB0aGUgcGFja2V0LCByZWZlcmVuY2UgdGhlIGNoYW5uZWwgbnVtYmVyCisvLworI2RlZmluZSBDSEFOTkVMX09GKHBQKSAgKChpMkRhdGFIZWFkZXJQdHIpKHBQKSktPmkyc0NoYW5uZWwKKworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBwYWNrZXQsIHJlZmVyZW5jZSB0aGUgUGFja2V0IHR5cGUKKy8vCisjZGVmaW5lIFBUWVBFX09GKHBQKSAoKGkyRGF0YUhlYWRlclB0cikocFApKS0+aTJzVHlwZQorCisvLyBUaGUgcG9zc2libGUgdHlwZXMgb2YgcGFja2V0cworLy8KKyNkZWZpbmUgUFRZUEVfREFUQSAgIDAgIC8qIEhvc3QgPC0tPiBCb2FyZCAqLworI2RlZmluZSBQVFlQRV9CWVBBU1MgMSAgLyogSG9zdCAtLS0+IEJvYXJkICovCisjZGVmaW5lIFBUWVBFX0lOTElORSAyICAvKiBIb3N0IC0tLT4gQm9hcmQgKi8KKyNkZWZpbmUgUFRZUEVfU1RBVFVTIDIgIC8qIEhvc3QgPC0tLSBCb2FyZCAqLworCisvLyBHaXZlbiBhIHBvaW50ZXIgdG8gYSBEYXRhIHBhY2tldCwgcmVmZXJlbmNlIHRoZSBUYWcKKy8vCisjZGVmaW5lIFRBR19PRihwUCkgKChpMkRhdGFIZWFkZXJQdHIpKHBQKSktPmkyc1RhZworCisvLyBHaXZlbiBhIHBvaW50ZXIgdG8gYSBEYXRhIHBhY2tldCwgcmVmZXJlbmNlIHRoZSBkYXRhIGkuZC4KKy8vCisjZGVmaW5lIElEX09GKHBQKSAgKChpMkRhdGFIZWFkZXJQdHIpKHBQKSktPmkyc0lkCisKKy8vIFRoZSBwb3NzaWJsZSB0eXBlcyBvZiBJRCdzCisvLworI2RlZmluZSBJRF9PUkRJTkFSWV9EQVRBICAgMAorI2RlZmluZSBJRF9IT1RfS0VZICAgICAgICAgMQorCisvLyBHaXZlbiBhIHBvaW50ZXIgdG8gYSBEYXRhIHBhY2tldCwgcmVmZXJlbmNlIHRoZSBjb3VudAorLy8KKyNkZWZpbmUgREFUQV9DT1VOVF9PRihwUCkgKChpMkRhdGFIZWFkZXJQdHIpKHBQKSktPmkyc0NvdW50CisKKy8vIEdpdmVuIGEgcG9pbnRlciB0byBhIERhdGEgcGFja2V0LCByZWZlcmVuY2UgdGhlIGJlZ2lubmluZyBvZiBkYXRhCisvLworI2RlZmluZSBEQVRBX09GKHBQKSAmKCh1bnNpZ25lZCBjaGFyICopKHBQKSlbNF0gLy8gNCA9IHNpemUgb2YgaGVhZGVyCisKKy8vIEdpdmVuIGEgcG9pbnRlciB0byBhIE5vbi1EYXRhIHBhY2tldCwgcmVmZXJlbmNlIHRoZSBjb3VudAorLy8KKyNkZWZpbmUgQ01EX0NPVU5UX09GKHBQKSAoKGkyQ21kSGVhZGVyUHRyKShwUCkpLT5pMnNDb3VudAorCisjZGVmaW5lIE1BWF9DTURfUEFDS19TSVpFICA2MiAvLyBNYXhpbXVtIHNpemUgb2Ygc3VjaCBhIGNvdW50CisKKy8vIEdpdmVuIGEgcG9pbnRlciB0byBhIE5vbi1EYXRhIHBhY2tldCwgcmVmZXJlbmNlIHRoZSBiZWdpbm5pbmcgb2YgZGF0YQorLy8KKyNkZWZpbmUgQ01EX09GKHBQKSAmKCh1bnNpZ25lZCBjaGFyICopKHBQKSlbMl0gIC8vIDIgPSBzaXplIG9mIGhlYWRlcgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWlsQm94IEJpdHM6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE91dGdvaW5nIChob3N0IHRvIGJvYXJkKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKyNkZWZpbmUgTUJfT1VUX1NUVUZGRUQgICAgIDB4ODAgIC8vIEhvc3QgaGFzIHBsYWNlZCBvdXRwdXQgaW4gZmlmbyAKKyNkZWZpbmUgTUJfSU5fU1RSSVBQRUQgICAgIDB4NDAgIC8vIEhvc3QgaGFzIHJlYWQgaW4gYWxsIGlucHV0IGZyb20gZmlmbyAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5jb21pbmcgKGJvYXJkIHRvIGhvc3QpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworI2RlZmluZSBNQl9JTl9TVFVGRkVEICAgICAgMHg4MCAgLy8gQm9hcmQgaGFzIHBsYWNlZCBpbnB1dCBpbiBmaWZvIAorI2RlZmluZSBNQl9PVVRfU1RSSVBQRUQgICAgMHg0MCAgLy8gQm9hcmQgaGFzIHJlYWQgYWxsIG91dHB1dCBmcm9tIGZpZm8gCisjZGVmaW5lIE1CX0ZBVEFMX0VSUk9SICAgICAweDIwICAvLyBCb2FyZCBoYXMgZW5jb3VudGVyZWQgYSBmYXRhbCBlcnJvcgorCisjcHJhZ21hIHBhY2soNCkgICAgICAgICAgICAgICAgICAvLyBSZXNldCBwYWRkaW5nIHRvIGNvbW1hbmQtbGluZSBkZWZhdWx0CisKKyNlbmRpZiAgICAgIC8vIEkyUEFDS19ICisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaXAyLmggYi9kcml2ZXJzL2NoYXIvaXAyL2lwMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmNjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMi5oCkBAIC0wLDAgKzEsMTA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIChjKSAxOTk4IGJ5IENvbXB1dG9uZSBDb3Jwb3JhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogICBQQUNLQUdFOiAgICAgTGludXggdHR5IERldmljZSBEcml2ZXIgZm9yIEludGVsbGlQb3J0IElJIGZhbWlseSBvZiBtdWx0aXBvcnQKKyogICAgICAgICAgICAgICAgc2VyaWFsIEkvTyBjb250cm9sbGVycy4KKyoKKyogICBERVNDUklQVElPTjogRHJpdmVyIGNvbnN0YW50cyBmb3IgY29uZmlndXJhdGlvbiBhbmQgdHVuaW5nCisqCisqICAgTk9URVM6CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBJUDJfSAorI2RlZmluZSBJUDJfSAorCisjaW5jbHVkZSAiaXAydHlwZXMuaCIKKyNpbmNsdWRlICJpMmNtZC5oIgorCisvKioqKioqKioqKioqKi8KKy8qIENvbnN0YW50cyAqLworLyoqKioqKioqKioqKiovCisKKy8qIERldmljZSBtYWpvciBudW1iZXJzIC0gc2luY2UgdmVyc2lvbiAyLjAuMjYuICovCisjZGVmaW5lIElQMl9UVFlfTUFKT1IgICAgICA3MQorI2RlZmluZSBJUDJfQ0FMTE9VVF9NQUpPUiAgNzIKKyNkZWZpbmUgSVAyX0lQTF9NQUpPUiAgICAgIDczCisKKy8qIEJvYXJkIGNvbmZpZ3VyYXRpb24gYXJyYXkuCisgKiBUaGlzIGFycmF5IGRlZmluZXMgdGhlIGhhcmR3YXJlIGlycSBhbmQgYWRkcmVzcyBmb3IgdXAgdG8gSVAyX01BWF9CT0FSRFMKKyAqICg0IHN1cHBvcnRlZCBwZXIgaXAyX3R5cGVzLmgpIElTQSBib2FyZCBhZGRyZXNzZXMgYW5kIGlycXMgTVVTVCBiZSBzcGVjaWZpZWQsCisgKiBQQ0kgYW5kIEVJU0EgYm9hcmRzIGFyZSBwcm9iZWQgZm9yIGFuZCBhdXRvbWFnaWNseSBjb25maWdlZAorICogaWZmIHRoZSBhZGRyZXNzZXMgYXJlIHNldCB0byAxIGFuZCAyIHJlc3BlY3RpdmlseS4KKyAqICAgIDB4MDEwMCAtIDB4MDNmMCA9PSBJU0EKKyAqCSAgICAgICAgIDEgICAgICAgID09IFBDSQorICoJICAgICAgICAgMiAgICAgICAgPT0gRUlTQQorICoJICAgICAgICAgMCAgICAgICAgPT0gKHNraXAgdGhpcyBib2FyZCkKKyAqIFRoaXMgYXJyYXkgZGVmaW5lcyB0aGUgaGFyZHdhcmUgYWRkcmVzc2VzIGZvciB0aGVtLiBTcGVjaWFsIAorICogYWRkcmVzc2VzIGFyZSBFSVNBIGFuZCBQQ0kgd2hpY2ggZ28gc25pZmZpbmcgZm9yIGJvYXJkcy4gCisKKyAqIEluIGEgbXVsdGlib2FyZCBzeXN0ZW0gdGhlIHBvc2l0aW9uIGluIHRoZSBhcnJheSBkZXRlcm1pbmVzIHdoaWNoIHBvcnQKKyAqIGRldmljZXMgYXJlIGFzc2lnbmVkIHRvIGVhY2ggYm9hcmQ6IAorICoJCWJvYXJkIDAgaXMgYXNzaWduZWQgdHR5RjAuLiB0byB0dHlGNjMsIAorICoJCWJvYXJkIDEgaXMgYXNzaWduZWQgdHR5RjY0ICB0byB0dHlGMTI3LAorICoJCWJvYXJkIDIgaXMgYXNzaWduZWQgdHR5RjEyOCB0byB0dHlGMTkxLAorICoJCWJvYXJkIDMgaXMgYXNzaWduZWQgdHR5RjE5MiB0byB0dHlGMjU1LiAKKyAqCisgKiBJbiBQQ0kgYW5kIEVJU0EgYnVzIHN5c3RlbXMgZWFjaCByYW5nZSBpcyBtYXBwZWQgdG8gY2FyZCBpbiAKKyAqIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBzbG90IG51bWJlciBvcmRlciwgSVNBIHBvc2l0aW9uIGlzIGFzIHNwZWNpZmllZAorICogaGVyZS4KKworICogSWYgdGhlIGlycXMgYXJlIEFMTCBzZXQgdG8gMCwwLDAsMCBhbGwgYm9hcmRzIG9wZXJhdGUgaW4gCisgKiBwb2xsZWQgbW9kZS4gRm9yIGludGVycnVwdCBvcGVyYXRpb24gSVNBIGJvYXJkcyByZXF1aXJlIHRoYXQgdGhlIElSUSBiZSAKKyAqIHNwZWNpZmllZCwgd2hpbGUgUENJIGFuZCBFSVNBIGJvYXJkcyBhbnkgbm9uemVybyBlbnRyeSAKKyAqIHdpbGwgZW5hYmxlIGludGVycnVwdHMgdXNpbmcgdGhlIEJJT1MgY29uZmlndXJlZCBpcnEgZm9yIHRoZSBib2FyZC4gCisgKiBBbiBpbnZhbGlkIGlycSBlbnRyeSB3aWxsIGRlZmF1bHQgdG8gcG9sbGVkIG1vZGUgZm9yIHRoYXQgY2FyZCBhbmQgcHJpbnQKKyAqIGNvbnNvbGUgd2FybmluZy4KKyAKKyAqIFdoZW4gdGhlIGRyaXZlciBpcyBsb2FkZWQgYXMgYSBtb2R1bGUgdGhlc2Ugc2V0dGluZyBjYW4gYmUgb3ZlcnJpZGRlbiBvbiB0aGUgCisgKiBtb2Rwcm9iZSBjb21tYW5kIGxpbmUgb3Igb24gYW4gb3B0aW9uIGxpbmUgaW4gL2V0Yy9tb2Rwcm9iZS5jb25mLgorICogSWYgdGhlIGRyaXZlciBpcyBidWlsdC1pbiB0aGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIAorICogc2V0IGhlcmUgZm9yIElTQSBjYXJkcyBhbmQgYWRkcmVzcyBzZXQgdG8gMSBhbmQgMiBmb3IgUENJIGFuZCBFSVNBLgorICoKKyAqIEhlcmUgaXMgYW4gZXhhbXBsZSB0aGF0IHNob3dzIG1vc3QgaWYgbm90IGFsbCBwb3NzaWJlIGNvbWJpbmF0aW9uczoKKworICpzdGF0aWMgaXAyY29uZmlnX3QgaXAyY29uZmlnID0KKyAqeworICoJezExLDEsMCwwfSwJCS8vIGlycXMKKyAqCXsJCQkJLy8gQWRkcmVzc2VzCisgKgkJMHgwMzA4LAkJLy8gQm9hcmQgMCwgdHR5RjAgICAtIHR0eUY2My8vIElTQSBjYXJkIGF0IGlvPTB4MzA4LCBpcnE9MTEKKyAqCQkweDAwMDEsCQkvLyBCb2FyZCAxLCB0dHlGNjQgIC0gdHR5RjEyNy8vUENJIGNhcmQgY29uZmlndXJlZCBieSBCSU9TCisgKgkJMHgwMDAwLAkJLy8gQm9hcmQgMiwgdHR5RjEyOCAtIHR0eUYxOTEvLyBTbG90IHNraXBwZWQKKyAqCQkweDAwMDIJCS8vIEJvYXJkIDMsIHR0eUYxOTIgLSB0dHlGMjU1Ly9FSVNBIGNhcmQgY29uZmlndXJlZCBieSBCSU9TCisgKgkJCQkJCQkJCQkJCSAvLyBidXQgcG9sbGVkIG5vdCBpcnEgZHJpdmVuCisgKgl9CisgKn07CisgKi8KKworIC8qIHRoaXMgc3RydWN0dXJlIGlzIHplcm9lZCBvdXQgYmVjYXVzZSB0aGUgc3VnZ2VzdGVkIG1ldGhvZCBpcyB0byBjb25maWd1cmUKKyAgKiB0aGUgZHJpdmVyIGFzIGEgbW9kdWxlLCBzZXQgdXAgdGhlIHBhcmFtZXRlcnMgd2l0aCBhbiBvcHRpb25zIGxpbmUgaW4KKyAgKiAvZXRjL21vZHByb2JlLmNvbmYgYW5kIGxvYWQgd2l0aCBtb2Rwcm9iZSBvciBrbW9kLCB0aGUga2VybmVsCisgICogbW9kdWxlIGxvYWRlcgorICAqLworCisgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgTk9XIGFsd2F5cyBpbml0aWFsaXplZCB3aGVuIHRoZSBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQuCisgICogQ29tcGlsZWQgaW4gZGVmYXVsdHMgTVVTVCBiZSBhZGRlZCB0byB0aGUgaW8gYW5kIGlycSBhcnJheXMgaW4KKyAgKiBpcDIuYy4gIFRob3NlIHZhbHVlcyBhcmUgY29uZmlndXJhYmxlIGZyb20gaW5zbW9kIHBhcmFtZXRlcnMgaW4gdGhlCisgICogY2FzZSBvZiBtb2R1bGVzIG9yIGZyb20gY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgKGlwMj1pbyxpcnEpIHdoZW4KKyAgKiBjb21waWxlZCBpbi4KKyAgKi8KKworc3RhdGljIGlwMmNvbmZpZ190IGlwMmNvbmZpZyA9Cit7CisJezAsMCwwLDB9LAkJLy8gaXJxcworCXsJCQkJLy8gQWRkcmVzc2VzCisJLyogRG8gTk9UIHNldCBjb21waWxlIHRpbWUgZGVmYXVsdHMgSEVSRSEgIFVzZSB0aGUgYXJyYXlzIGluCisJCWlwMi5jISAgVGhlc2UgV0lMTCBiZSBvdmVyd3JpdHRlbiEgID1taHc9ICovCisJCTB4MDAwMCwJCS8vIEJvYXJkIDAsIHR0eUYwICAgLSB0dHlGNjMKKwkJMHgwMDAwLAkJLy8gQm9hcmQgMSwgdHR5RjY0ICAtIHR0eUYxMjcKKwkJMHgwMDAwLAkJLy8gQm9hcmQgMiwgdHR5RjEyOCAtIHR0eUYxOTEKKwkJMHgwMDAwCQkvLyBCb2FyZCAzLCB0dHlGMTkyIC0gdHR5RjI1NQorCX0KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pcDJpb2N0bC5oIGIvZHJpdmVycy9jaGFyL2lwMi9pcDJpb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMGE5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMmlvY3RsLmgKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAoYykgMTk5OCBieSBDb21wdXRvbmUgQ29ycG9yYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqICAgUEFDS0FHRTogICAgIExpbnV4IHR0eSBEZXZpY2UgRHJpdmVyIGZvciBJbnRlbGxpUG9ydCBJSSBmYW1pbHkgb2YgbXVsdGlwb3J0CisqICAgICAgICAgICAgICAgIHNlcmlhbCBJL08gY29udHJvbGxlcnMuCisqCisqICAgREVTQ1JJUFRJT046IERyaXZlciBjb25zdGFudHMgZm9yIGNvbmZpZ3VyYXRpb24gYW5kIHR1bmluZworKgorKiAgIE5PVEVTOgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBJUDJJT0NUTF9ICisjZGVmaW5lIElQMklPQ1RMX0gKKworLy8qKioqKioqKioqKioqCisvLyogQ29uc3RhbnRzICoKKy8vKioqKioqKioqKioqKgorCisvLyBIaWdoIGJhdWQgcmF0ZXMgKGlmIG5vdCBkZWZpbmVkIGVsc2V3aGVyZS4KKyNpZm5kZWYgQjE1MzYwMCAgIAorIwlkZWZpbmUgQjE1MzYwMCAgIDAwMTAwMDUKKyNlbmRpZgorI2lmbmRlZiBCMzA3MjAwICAgCisjCWRlZmluZSBCMzA3MjAwICAgMDAxMDAwNgorI2VuZGlmCisjaWZuZGVmIEI5MjE2MDAgICAKKyMJZGVmaW5lIEI5MjE2MDAgICAwMDEwMDA3CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2lwMnRyYWNlLmggYi9kcml2ZXJzL2NoYXIvaXAyL2lwMnRyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEyMDQzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvaXAydHJhY2UuaApAQCAtMCwwICsxLDQyIEBACisKKy8vCit1bmlvbiBpcDJicmVhZGNydW1iIAoreworCXN0cnVjdCB7IAorCQl1bnNpZ25lZCBjaGFyIHBvcnQsIGNhdCwgY29kZXMsIGxhYmVsOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGhkcjsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworfTsKKworI2RlZmluZSBJVFJDX05PX1BPUlQgCTB4RkYKKyNkZWZpbmUgQ0hBTk4JKHBDaC0+cG9ydF9pbmRleCkKKworI2RlZmluZQlJVFJDX0VSUk9SCSchJworI2RlZmluZQlJVFJDX0lOSVQgCSdBJworI2RlZmluZQlJVFJDX09QRU4JJ0InCisjZGVmaW5lCUlUUkNfQ0xPU0UJJ0MnCisjZGVmaW5lCUlUUkNfRFJBSU4JJ0QnCisjZGVmaW5lCUlUUkNfSU9DVEwJJ0UnCisjZGVmaW5lCUlUUkNfRkxVU0gJJ0YnCisjZGVmaW5lCUlUUkNfU1RBVFVTCSdHJworI2RlZmluZQlJVFJDX0hBTkdVUAknSCcKKyNkZWZpbmUJSVRSQ19JTlRSIAknSScKKyNkZWZpbmUJSVRSQ19TRkxPVwknSicKKyNkZWZpbmUJSVRSQ19TQkNNRAknSycKKyNkZWZpbmUJSVRSQ19TSUNNRAknTCcKKyNkZWZpbmUJSVRSQ19NT0RFTQknTScKKyNkZWZpbmUJSVRSQ19JTlBVVAknTicKKyNkZWZpbmUJSVRSQ19PVVRQVVQJJ08nCisjZGVmaW5lCUlUUkNfUFVUQwknUCcKKyNkZWZpbmUJSVRSQ19RVUVVRQknUScKKyNkZWZpbmUJSVRSQ19TVEZMVwknUicKKyNkZWZpbmUJSVRSQ19TRklGTwknUycKKyNkZWZpbmUJSVRSQ19WRVJJRlkJJ1YnCisjZGVmaW5lCUlUUkNfV1JJVEUJJ1cnCisKKyNkZWZpbmUJSVRSQ19FTlRFUgkweDAwCisjZGVmaW5lCUlUUkNfUkVUVVJOCTB4RkYKKworI2RlZmluZQlJVFJDX1FVRVVFX1JPT00JMgorI2RlZmluZQlJVFJDX1FVRVVFX0NNRAk2CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaXAydHlwZXMuaCBiL2RyaXZlcnMvY2hhci9pcDIvaXAydHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDY3YjI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pcDJ0eXBlcy5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgKGMpIDE5OTggYnkgQ29tcHV0b25lIENvcnBvcmF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKiAgIFBBQ0tBR0U6ICAgICBMaW51eCB0dHkgRGV2aWNlIERyaXZlciBmb3IgSW50ZWxsaVBvcnQgSUkgZmFtaWx5IG9mIG11bHRpcG9ydAorKiAgICAgICAgICAgICAgICBzZXJpYWwgSS9PIGNvbnRyb2xsZXJzLgorKgorKiAgIERFU0NSSVBUSU9OOiBEcml2ZXIgY29uc3RhbnRzIGFuZCB0eXBlIGRlZmluaXRpb25zLgorKgorKiAgIE5PVEVTOgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgSVAyVFlQRVNfSAorI2RlZmluZSBJUDJUWVBFU19ICisKKy8vKioqKioqKioqKioqKgorLy8qIENvbnN0YW50cyAqCisvLyoqKioqKioqKioqKioKKworLy8gRGVmaW5lIHNvbWUgbGltaXRzIGZvciB0aGlzIGRyaXZlci4gUG9ydHMgcGVyIGJvYXJkIGlzIGEgaGFyZHdhcmUgbGltaXRhdGlvbgorLy8gdGhhdCB3aWxsIG5vdCBjaGFuZ2UuIEN1cnJlbnQgaGFyZHdhcmUgbGltaXRzIHRoaXMgdG8gNjQgcG9ydHMgcGVyIGJvYXJkLgorLy8gQm9hcmRzIHBlciBkcml2ZXIgaXMgYSBzZWxmLWltcG9zZWQgbGltaXQuCisvLworI2RlZmluZSBJUDJfTUFYX0JPQVJEUyAgICAgICAgNAorI2RlZmluZSBJUDJfUE9SVFNfUEVSX0JPQVJEICAgQUJTX01PU1RfUE9SVFMKKyNkZWZpbmUgSVAyX01BWF9QT1JUUyAgICAgICAgIChJUDJfTUFYX0JPQVJEUypJUDJfUE9SVFNfUEVSX0JPQVJEKQorCisjZGVmaW5lIElTQSAgICAwCisjZGVmaW5lIFBDSSAgICAxCisjZGVmaW5lIEVJU0EgICAyCisKKy8vKioqKioqKioqKioqKioqKioqKioKKy8vKiBUeXBlIERlZmluaXRpb25zICoKKy8vKioqKioqKioqKioqKioqKioqKioKKwordHlwZWRlZiBzdHJ1Y3QgdHR5X3N0cnVjdCAqICAgUFRUWTsKK3R5cGVkZWYgd2FpdF9xdWV1ZV9oZWFkX3QgICBQV0FJVFE7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICAgIFVDSEFSOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgVUlOVDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgIFVTSE9SVDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgIFVMT05HOworCit0eXBlZGVmIHN0cnVjdCAKK3sKKwlzaG9ydCBpcnFbSVAyX01BWF9CT0FSRFNdOyAKKwl1bnNpZ25lZCBzaG9ydCBhZGRyW0lQMl9NQVhfQk9BUkRTXTsKKwlpbnQgdHlwZVtJUDJfTUFYX0JPQVJEU107CisjaWZkZWYgQ09ORklHX1BDSQorCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2W0lQMl9NQVhfQk9BUkRTXTsKKyNlbmRpZgorfSBpcDJjb25maWdfdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyNy1ydGMuYyBiL2RyaXZlcnMvY2hhci9pcDI3LXJ0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhY2RhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyNy1ydGMuYwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqCURyaXZlciBmb3IgdGhlIFNHUy1UaG9tc29uIE00OFQzNSBUaW1la2VlcGVyIFJBTSBjaGlwCisgKgorICoJUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IgTGludXgKKyAqCisgKglUT0RPOiBJbXBsZW1lbnQgcGVyaW9kaWMgaW50ZXJydXB0cy4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoJV3JpdHRlbiBieSBVbGYgQ2FybHNzb24gKHVsZmNAZW5nci5zZ2kuY29tKQorICoKKyAqCUJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBQYXVsIEdvcnRtYWtlci4KKyAqCisgKglUaGlzIGRyaXZlciBhbGxvd3MgdXNlIG9mIHRoZSByZWFsIHRpbWUgY2xvY2sgKGJ1aWx0IGludG8KKyAqCW5lYXJseSBhbGwgY29tcHV0ZXJzKSBmcm9tIHVzZXIgc3BhY2UuIEl0IGV4cG9ydHMgdGhlIC9kZXYvcnRjCisgKglpbnRlcmZhY2Ugc3VwcG9ydGluZyB2YXJpb3VzIGlvY3RsKCkgYW5kIGFsc28gdGhlIC9wcm9jL3J0YworICoJcHNldWRvLWZpbGUgZm9yIHN0YXR1cyBpbmZvcm1hdGlvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjZGVmaW5lIFJUQ19WRVJTSU9OCQkiMS4wOWIiCisKKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vbTQ4dDM1Lmg+CisjaW5jbHVkZSA8YXNtL3NuL2lvYzMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vc24va2xjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vc24vc24wL2lwMjcuaD4KKyNpbmNsdWRlIDxhc20vc24vc24wL2h1Yi5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbl9wcml2YXRlLmg+CisKK3N0YXRpYyBpbnQgcnRjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIGludCBydGNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworCitzdGF0aWMgdm9pZCBnZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICpydGNfdG0pOworCisvKgorICoJQml0cyBpbiBydGNfc3RhdHVzLiAoNiBiaXRzIG9mIHJvb20gZm9yIGZ1dHVyZSBleHBhbnNpb24pCisgKi8KKworI2RlZmluZSBSVENfSVNfT1BFTgkJMHgwMQkvKiBtZWFucyAvZGV2L3J0YyBpcyBpbiB1c2UJKi8KKyNkZWZpbmUgUlRDX1RJTUVSX09OCQkweDAyCS8qIG1pc3NlZCBpcnEgdGltZXIgYWN0aXZlCSovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJ0Y19zdGF0dXM7CS8qIGJpdG1hcHBlZCBzdGF0dXMgYnl0ZS4JKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ0Y19mcmVxOwkvKiBDdXJyZW50IHBlcmlvZGljIElSUSByYXRlCSovCitzdGF0aWMgc3RydWN0IG00OHQzNV9ydGMgKnJ0YzsKKworLyoKKyAqCUlmIHRoaXMgZHJpdmVyIGV2ZXIgYmVjb21lcyBtb2R1bGFyaXNlZCwgaXQgd2lsbCBiZSByZWFsbHkgbmljZQorICoJdG8gbWFrZSB0aGUgZXBvY2ggcmV0YWluIGl0cyB2YWx1ZSBhY3Jvc3MgbW9kdWxlIHJlbG9hZC4uLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVwb2NoID0gMTk3MDsJLyogeWVhciBjb3JyZXNwb25kaW5nIHRvIDB4MDAJKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGF5c19pbl9tb1tdID0KK3swLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfTsKKworc3RhdGljIGludCBydGNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisKKwlzdHJ1Y3QgcnRjX3RpbWUgd3RpbWU7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX1JEX1RJTUU6CS8qIFJlYWQgdGhlIHRpbWUvZGF0ZSBmcm9tIFJUQwkqLworCXsKKwkJZ2V0X3J0Y190aW1lKCZ3dGltZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFJUQ19TRVRfVElNRToJLyogU2V0IHRoZSBSVEMgKi8KKwl7CisJCXN0cnVjdCBydGNfdGltZSBydGNfdG07CisJCXVuc2lnbmVkIGNoYXIgbW9uLCBkYXksIGhycywgbWluLCBzZWMsIGxlYXBfeXI7CisJCXVuc2lnbmVkIGludCB5cnM7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ0Y190bSwgKHN0cnVjdCBydGNfdGltZSopYXJnLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXlycyA9IHJ0Y190bS50bV95ZWFyICsgMTkwMDsKKwkJbW9uID0gcnRjX3RtLnRtX21vbiArIDE7ICAgLyogdG1fbW9uIHN0YXJ0cyBhdCB6ZXJvICovCisJCWRheSA9IHJ0Y190bS50bV9tZGF5OworCQlocnMgPSBydGNfdG0udG1faG91cjsKKwkJbWluID0gcnRjX3RtLnRtX21pbjsKKwkJc2VjID0gcnRjX3RtLnRtX3NlYzsKKworCQlpZiAoeXJzIDwgMTk3MCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWxlYXBfeXIgPSAoKCEoeXJzICUgNCkgJiYgKHlycyAlIDEwMCkpIHx8ICEoeXJzICUgNDAwKSk7CisKKwkJaWYgKChtb24gPiAxMikgfHwgKGRheSA9PSAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChkYXkgPiAoZGF5c19pbl9tb1ttb25dICsgKChtb24gPT0gMikgJiYgbGVhcF95cikpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKChocnMgPj0gMjQpIHx8IChtaW4gPj0gNjApIHx8IChzZWMgPj0gNjApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCh5cnMgLT0gZXBvY2gpID4gMjU1KSAgICAvKiBUaGV5IGFyZSB1bnNpZ25lZCAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKHlycyA+IDE2OSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICh5cnMgPj0gMTAwKQorCQkJeXJzIC09IDEwMDsKKworCQlzZWMgPSBCSU4yQkNEKHNlYyk7CisJCW1pbiA9IEJJTjJCQ0QobWluKTsKKwkJaHJzID0gQklOMkJDRChocnMpOworCQlkYXkgPSBCSU4yQkNEKGRheSk7CisJCW1vbiA9IEJJTjJCQ0QobW9uKTsKKwkJeXJzID0gQklOMkJDRCh5cnMpOworCisJCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJcnRjLT5jb250cm9sIHw9IE00OFQzNV9SVENfU0VUOworCQlydGMtPnllYXIgPSB5cnM7CisJCXJ0Yy0+bW9udGggPSBtb247CisJCXJ0Yy0+ZGF0ZSA9IGRheTsKKwkJcnRjLT5ob3VyID0gaHJzOworCQlydGMtPm1pbiA9IG1pbjsKKwkJcnRjLT5zZWMgPSBzZWM7CisJCXJ0Yy0+Y29udHJvbCAmPSB+TTQ4VDM1X1JUQ19TRVQ7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJCXJldHVybiAwOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnd0aW1lLCBzaXplb2Ygd3RpbWUpID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qCisgKglXZSBlbmZvcmNlIG9ubHkgb25lIHVzZXIgYXQgYSB0aW1lIGhlcmUgd2l0aCB0aGUgb3Blbi9jbG9zZS4KKyAqCUFsc28gY2xlYXIgdGhlIHByZXZpb3VzIGludGVycnVwdCBkYXRhIG9uIGFuIG9wZW4sIGFuZCBjbGVhbgorICoJdXAgdGhpbmdzIG9uIGEgY2xvc2UuCisgKi8KKworc3RhdGljIGludCBydGNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwlpZiAocnRjX3N0YXR1cyAmIFJUQ19JU19PUEVOKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJ0Y19zdGF0dXMgfD0gUlRDX0lTX09QRU47CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKgorCSAqIFR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIG9uY2UgdGhlIGRldmljZSBpcyBubyBsb25nZXIKKwkgKiBpbiB1c2UsIGFuZCBjbGVhciB0aGUgZGF0YS4KKwkgKi8KKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlydGNfc3RhdHVzICY9IH5SVENfSVNfT1BFTjsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICoJVGhlIHZhcmlvdXMgZmlsZSBvcGVyYXRpb25zIHdlIHN1cHBvcnQuCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAkJPSBydGNfaW9jdGwsCisJLm9wZW4JCT0gcnRjX29wZW4sCisJLnJlbGVhc2UJPSBydGNfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBydGNfZGV2PQoreworCVJUQ19NSU5PUiwKKwkicnRjIiwKKwkmcnRjX2ZvcHMKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJ0Y19pbml0KHZvaWQpCit7CisJcnRjID0gKHN0cnVjdCBtNDh0MzVfcnRjICopCisJKEtMX0NPTkZJR19DSF9DT05TX0lORk8obWFzdGVyX25hc2lkKS0+bWVtb3J5X2Jhc2UgKyBJT0MzX0JZVEVCVVNfREVWMCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJSZWFsIFRpbWUgQ2xvY2sgRHJpdmVyIHYlc1xuIiwgUlRDX1ZFUlNJT04pOworCWlmIChtaXNjX3JlZ2lzdGVyKCZydGNfZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgInJ0YzogY2Fubm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoIWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImRyaXZlci9ydGMiLCAwLCBOVUxMLCBydGNfcmVhZF9wcm9jLCBOVUxMKSkgeworCQlwcmludGsoS0VSTl9FUlIgInJ0YzogY2Fubm90IGNyZWF0ZSAvcHJvYy9ydGMuXG4iKTsKKwkJbWlzY19kZXJlZ2lzdGVyKCZydGNfZGV2KTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcnRjX2ZyZXEgPSAxMDI0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBydGNfZXhpdCAodm9pZCkKK3sKKwkvKiBpbnRlcnJ1cHRzIGFuZCB0aW1lciBkaXNhYmxlZCBhdCB0aGlzIHBvaW50IGJ5IHJ0Y19yZWxlYXNlICovCisKKwlyZW1vdmVfcHJvY19lbnRyeSAoInJ0YyIsIE5VTEwpOworCW1pc2NfZGVyZWdpc3RlcigmcnRjX2Rldik7Cit9CisKK21vZHVsZV9pbml0KHJ0Y19pbml0KTsKK21vZHVsZV9leGl0KHJ0Y19leGl0KTsKKworLyoKKyAqCUluZm8gZXhwb3J0ZWQgdmlhICIvcHJvYy9ydGMiLgorICovCisKK3N0YXRpYyBpbnQgcnRjX2dldF9zdGF0dXMoY2hhciAqYnVmKQoreworCWNoYXIgKnA7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCisJLyoKKwkgKiBKdXN0IGVtdWxhdGUgdGhlIHN0YW5kYXJkIC9wcm9jL3J0YworCSAqLworCisJcCA9IGJ1ZjsKKworCWdldF9ydGNfdGltZSgmdG0pOworCisJLyoKKwkgKiBUaGVyZSBpcyBubyB3YXkgdG8gdGVsbCBpZiB0aGUgbHVzZXIgaGFzIHRoZSBSVEMgc2V0IGZvciBsb2NhbAorCSAqIHRpbWUgb3IgZm9yIFVuaXZlcnNhbCBTdGFuZGFyZCBUaW1lIChHTVQpLiBQcm9iYWJseSBsb2NhbCB0aG91Z2guCisJICovCisJcCArPSBzcHJpbnRmKHAsCisJCSAgICAgInJ0Y190aW1lXHQ6ICUwMmQ6JTAyZDolMDJkXG4iCisJCSAgICAgInJ0Y19kYXRlXHQ6ICUwNGQtJTAyZC0lMDJkXG4iCisJIAkgICAgICJydGNfZXBvY2hcdDogJTA0bHVcbiIKKwkJICAgICAiMjRoclx0XHQ6IHllc1xuIiwKKwkJICAgICB0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYywKKwkJICAgICB0bS50bV95ZWFyICsgMTkwMCwgdG0udG1fbW9uICsgMSwgdG0udG1fbWRheSwgZXBvY2gpOworCisJcmV0dXJuICBwIC0gYnVmOworfQorCitzdGF0aWMgaW50IHJ0Y19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworICAgICAgICBpbnQgbGVuID0gcnRjX2dldF9zdGF0dXMocGFnZSk7CisgICAgICAgIGlmIChsZW4gPD0gb2ZmK2NvdW50KSAqZW9mID0gMTsKKyAgICAgICAgKnN0YXJ0ID0gcGFnZSArIG9mZjsKKyAgICAgICAgbGVuIC09IG9mZjsKKyAgICAgICAgaWYgKGxlbj5jb3VudCkgbGVuID0gY291bnQ7CisgICAgICAgIGlmIChsZW48MCkgbGVuID0gMDsKKyAgICAgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQgZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQoreworCS8qCisJICogRG8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgbGFzdCB1cGRhdGUgdG8gZmluaXNoPworCSAqLworCisJLyoKKwkgKiBPbmx5IHRoZSB2YWx1ZXMgdGhhdCB3ZSByZWFkIGZyb20gdGhlIFJUQyBhcmUgc2V0LiBXZSBsZWF2ZQorCSAqIHRtX3dkYXksIHRtX3lkYXkgYW5kIHRtX2lzZHN0IHVudG91Y2hlZC4gRXZlbiB0aG91Z2ggdGhlCisJICogUlRDIGhhcyBSVENfREFZX09GX1dFRUssIHdlIGlnbm9yZSBpdCwgYXMgaXQgaXMgb25seSB1cGRhdGVkCisJICogYnkgdGhlIFJUQyB3aGVuIGluaXRpYWxseSBzZXQgdG8gYSBub24temVybyB2YWx1ZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJcnRjLT5jb250cm9sIHw9IE00OFQzNV9SVENfUkVBRDsKKwlydGNfdG0tPnRtX3NlYyA9IHJ0Yy0+c2VjOworCXJ0Y190bS0+dG1fbWluID0gcnRjLT5taW47CisJcnRjX3RtLT50bV9ob3VyID0gcnRjLT5ob3VyOworCXJ0Y190bS0+dG1fbWRheSA9IHJ0Yy0+ZGF0ZTsKKwlydGNfdG0tPnRtX21vbiA9IHJ0Yy0+bW9udGg7CisJcnRjX3RtLT50bV95ZWFyID0gcnRjLT55ZWFyOworCXJ0Yy0+Y29udHJvbCAmPSB+TTQ4VDM1X1JUQ19SRUFEOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJcnRjX3RtLT50bV9zZWMgPSBCQ0QyQklOKHJ0Y190bS0+dG1fc2VjKTsKKwlydGNfdG0tPnRtX21pbiA9IEJDRDJCSU4ocnRjX3RtLT50bV9taW4pOworCXJ0Y190bS0+dG1faG91ciA9IEJDRDJCSU4ocnRjX3RtLT50bV9ob3VyKTsKKwlydGNfdG0tPnRtX21kYXkgPSBCQ0QyQklOKHJ0Y190bS0+dG1fbWRheSk7CisJcnRjX3RtLT50bV9tb24gPSBCQ0QyQklOKHJ0Y190bS0+dG1fbW9uKTsKKwlydGNfdG0tPnRtX3llYXIgPSBCQ0QyQklOKHJ0Y190bS0+dG1feWVhcik7CisKKwkvKgorCSAqIEFjY291bnQgZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gaG93IHRoZSBSVEMgdXNlcyB0aGUgdmFsdWVzCisJICogYW5kIGhvdyB0aGV5IGFyZSBkZWZpbmVkIGluIGEgc3RydWN0IHJ0Y190aW1lOworCSAqLworCWlmICgocnRjX3RtLT50bV95ZWFyICs9IChlcG9jaCAtIDE5MDApKSA8PSA2OSkKKwkJcnRjX3RtLT50bV95ZWFyICs9IDEwMDsKKworCXJ0Y190bS0+dG1fbW9uLS07Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAybWFpbi5jIGIvZHJpdmVycy9jaGFyL2lwMm1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2E5YTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMm1haW4uYwpAQCAtMCwwICsxLDMyNjUgQEAKKy8qCisqCisqICAgKGMpIDE5OTkgYnkgQ29tcHV0b25lIENvcnBvcmF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIFBBQ0tBR0U6ICAgICBMaW51eCB0dHkgRGV2aWNlIERyaXZlciBmb3IgSW50ZWxsaVBvcnQgZmFtaWx5IG9mIG11bHRpcG9ydAorKiAgICAgICAgICAgICAgICBzZXJpYWwgSS9PIGNvbnRyb2xsZXJzLgorKgorKiAgIERFU0NSSVBUSU9OOiBNYWlubGluZSBjb2RlIGZvciB0aGUgZGV2aWNlIGRyaXZlcgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRvRG86CisvLworLy8gRml4IHRoZSBpbW1lZGlhdGUgRFNTX05PVyBwcm9ibGVtLgorLy8gV29yayBvdmVyIHRoZSBjaGFubmVsIHN0YXRzIHJldHVybiBsb2dpYyBpbiBpcDJfaXBsX2lvY3RsIHNvIHRoZXkKKy8vCW1ha2Ugc2Vuc2UgZm9yIGFsbCAyNTYgcG9zc2libGUgY2hhbm5lbHMgYW5kIHNvIHRoZSB1c2VyIHNwYWNlCisvLwl1dGlsaXRpZXMgd2lsbCBjb21waWxlIGFuZCB3b3JrIHByb3Blcmx5LgorLy8KKy8vIERvbmU6CisvLworLy8gMS4yLjE0CS9cL1x8PW1odz18XC9cLworLy8gQWRkZWQgYm91bmRzIGNoZWNraW5nIHRvIGlwMl9pcGxfaW9jdGwgdG8gYXZvaWQgcG90ZW50aWFsIHRlcnJvcmlzdGljIGFjdHMuCisvLyBDaGFuZ2VkIHRoZSBkZWZpbml0aW9uIG9mIGlwMnRyYWNlIHRvIGJlIG1vcmUgY29uc2lzdGVudCB3aXRoIGtlcm5lbCBzdHlsZQorLy8JVGhhbmtzIHRvIEFuZHJlYXMgRGlsZ2VyIDxhZGlsZ2VyQHR1cmJvbGFicy5jb20+IGZvciB0aGVzZSB1cGRhdGVzCisvLworLy8gMS4yLjEzCS9cL1x8PW1odz18XC9cLworLy8gREVWRlM6IFJlbmFtZWQgdHRmL3tufSB0byB0dHMvRntufSBhbmQgY3VmL3tufSB0byBjdWEvRntufSB0byBjb25mb3JtCisvLwl0byBhZ3JlZWQgZGV2ZnMgc2VyaWFsIGRldmljZSBuYW1pbmcgY29udmVudGlvbi4KKy8vCisvLyAxLjIuMTIJL1wvXHw9bWh3PXxcL1wvCisvLyBDbGVhbmVkIHVwIHNvbWUgcmVtb3ZlIHF1ZXVlIGN1dCBhbmQgcGFzdGUgZXJyb3JzCisvLworLy8gMS4yLjExCS9cL1x8PW1odz18XC9cLworLy8gQ2xlYW4gdXAgcG90ZW50aWFsIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMKKy8vIENsZWFuIHVwIGRldmZzIHJlZ2lzdHJhdGlvbgorLy8gQWRkIGtlcm5lbCBjb21tYW5kIGxpbmUgcGFyc2luZyBmb3IgaW8gYW5kIGlycQorLy8JQ29tcGlsZSBkZWZhdWx0cyBmb3IgaW8gYW5kIGlycSBhcmUgbm93IHNldCBpbiBpcDIuYyBub3QgaXAyL2lwMi5oIQorLy8gUmV3b3JrZWQgcG9sbF9vbmx5IGhhY2sgZm9yIGV4cGxpY2l0IHBhcmFtZXRlciBzZXR0aW5nCisvLwlZb3UgbXVzdCBub3cgRVhQTElDSVRMWSBzZXQgcG9sbF9vbmx5ID0gMSBvciBzZXQgYWxsIGlycXMgdG8gMAorLy8gTWVyZ2VkIGlwMl9sb2FkbWFpbiBhbmQgb2xkX2lwMl9pbml0CisvLyBDb252ZXJ0ZWQgYWxsIGluc3RhbmNlcyBvZiBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uIGludG8gcXVldWUgY2FsbHMKKy8vCU1vc3Qgb2YgdGhlc2UgaGFkIG5vIHJhY2UgY29uZGl0aW9ucyBidXQgYmV0dGVyIHRvIGNsZWFuIHVwIG5vdworLy8KKy8vIDEuMi4xMAkvXC9cfD1taHc9fFwvXC8KKy8vIEZpeGVkIHRoZSBib3R0b20gaGFsZiBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgZW5hYmxlZCBVU0VfSVFJCisvLwl0byBzcGxpdCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaW50byBhIGZvcm1hbCB0b3AtaGFsZiAvIGJvdHRvbS1oYWxmCisvLyBGaXhlZCB0aW1pbmcgd2luZG93IG9uIGhpZ2ggc3BlZWQgcHJvY2Vzc29ycyB0aGF0IHF1ZXVlZCBtZXNzYWdlcyB0bworLy8gCXRoZSBvdXRib3VuZCBtYWlsIGZpZm8gZmFzdGVyIHRoYW4gdGhlIGJvYXJkIGNvdWxkIGhhbmRsZS4KKy8vCisvLyAxLjIuOQorLy8gRm91ciBib3ggRVggd2FzIGJhcmZpbmcgb24gPjEyOGsga21hbGxvYywgbWFkZSBzdHJ1Y3R1cmUgc21hbGxlciBieQorLy8gcmVkdWNpbmcgb3V0cHV0IGJ1ZmZlciBzaXplCisvLworLy8gMS4yLjgKKy8vIERldmljZSBmaWxlIHN5c3RlbSBzdXBwb3J0IChNSFcpCisvLworLy8gMS4yLjcgCisvLyBGaXhlZAorLy8gUmVsb2FkIG9mIGlwMiB3aXRob3V0IHVubG9hZGluZyBpcDJtYWluIGhhbmdzIHN5c3RlbSBvbiBjYXQgb2YgL3Byb2MvbW9kdWxlcworLy8KKy8vIDEuMi42CisvL0ZpeGVzIERDRCBwcm9ibGVtcworLy8JRENEIHdhcyBub3QgcmVwb3J0ZWQgd2hlbiBDTE9DQUwgd2FzIHNldCBvbiBjYWxsIHRvIFRJT0NNR0VUCisvLworLy9FbmhhbmNlbWVudHM6CisvLwlUSU9DTUdFVCByZXF1ZXN0cyBhbmQgd2FpdHMgZm9yIHN0YXR1cyByZXR1cm4KKy8vCU5vIERTUyBpbnRlcnJ1cHRzIGVuYWJsZWQgZXhjZXB0IGZvciBEQ0Qgd2hlbiBuZWVkZWQKKy8vCisvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkKKy8vCisvLyNkZWZpbmUgSVAyREVCVUdfSU5JVAorLy8jZGVmaW5lIElQMkRFQlVHX09QRU4KKy8vI2RlZmluZSBJUDJERUJVR19XUklURQorLy8jZGVmaW5lIElQMkRFQlVHX1JFQUQKKy8vI2RlZmluZSBJUDJERUJVR19JT0NUTAorLy8jZGVmaW5lIElQMkRFQlVHX0lQTAorCisvLyNkZWZpbmUgSVAyREVCVUdfVFJBQ0UKKy8vI2RlZmluZSBERUJVR19GSUZPCisKKy8qKioqKioqKioqKiovCisvKiBJbmNsdWRlcyAqLworLyoqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Nkay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXN0YXRzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICIuL2lwMi9pcDJ0eXBlcy5oIgorI2luY2x1ZGUgIi4vaXAyL2lwMnRyYWNlLmgiCisjaW5jbHVkZSAiLi9pcDIvaXAyaW9jdGwuaCIKKyNpbmNsdWRlICIuL2lwMi9pcDIuaCIKKyNpbmNsdWRlICIuL2lwMi9pMmVsbGlzLmgiCisjaW5jbHVkZSAiLi9pcDIvaTJsaWIuaCIKKworLyoqKioqKioqKioqKioqKioqCisgKiAvcHJvYy9pcDJtZW0gICoKKyAqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworc3RhdGljIGludCBpcDJfcmVhZF9wcm9jbWVtKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCk7CitzdGF0aWMgaW50IGlwMl9yZWFkX3Byb2MoY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQgKiwgdm9pZCAqICk7CisKKy8qKioqKioqKioqKioqKioqKioqKi8KKy8qIFR5cGUgRGVmaW5pdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKiovCisvKiBDb25zdGFudHMgKi8KKy8qKioqKioqKioqKioqLworCisvKiBTdHJpbmcgY29uc3RhbnRzIHRvIGlkZW50aWZ5IG91cnNlbHZlcyAqLworc3RhdGljIGNoYXIgKnBjTmFtZSAgICA9ICJDb21wdXRvbmUgSW50ZWxsaVBvcnQgUGx1cyBtdWx0aXBvcnQgZHJpdmVyIjsKK3N0YXRpYyBjaGFyICpwY1ZlcnNpb24gPSAiMS4yLjE0IjsKKworLyogU3RyaW5nIGNvbnN0YW50cyBmb3IgcG9ydCBuYW1lcyAqLworc3RhdGljIGNoYXIgKnBjRHJpdmVyX25hbWUgICA9ICJpcDIiOworc3RhdGljIGNoYXIgKnBjSXBsICAgIAkJID0gImlwMmlwbCI7CisKKy8qIFNlcmlhbCBzdWJ0eXBlIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNFUklBTF9UWVBFX05PUk1BTCAgICAxCisKKy8vIGNoZWV6eSBrbHVkZ2Ugb3IgZ2VuaXVzIC0geW91IGRlY2lkZT8KK2ludCBpcDJfbG9hZG1haW4oaW50ICosIGludCAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqRmlwX2Zpcm13YXJlOworc3RhdGljIGludCBGaXBfZmlybXdhcmVfc2l6ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBHbG9iYWwgbW9kdWxlIGVudHJ5IGZ1bmN0aW9ucyAqLworCisvKiBQcml2YXRlIChzdGF0aWMpIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCAgaXAyX29wZW4oUFRUWSwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgdm9pZCBpcDJfY2xvc2UoUFRUWSwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50ICBpcDJfd3JpdGUoUFRUWSwgaW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7CitzdGF0aWMgdm9pZCBpcDJfcHV0Y2hhcihQVFRZLCB1bnNpZ25lZCBjaGFyKTsKK3N0YXRpYyB2b2lkIGlwMl9mbHVzaF9jaGFycyhQVFRZKTsKK3N0YXRpYyBpbnQgIGlwMl93cml0ZV9yb29tKFBUVFkpOworc3RhdGljIGludCAgaXAyX2NoYXJzX2luX2J1ZihQVFRZKTsKK3N0YXRpYyB2b2lkIGlwMl9mbHVzaF9idWZmZXIoUFRUWSk7CitzdGF0aWMgaW50ICBpcDJfaW9jdGwoUFRUWSwgc3RydWN0IGZpbGUgKiwgVUlOVCwgVUxPTkcpOworc3RhdGljIHZvaWQgaXAyX3NldF90ZXJtaW9zKFBUVFksIHN0cnVjdCB0ZXJtaW9zICopOworc3RhdGljIHZvaWQgaXAyX3NldF9saW5lX2Rpc2NpcGxpbmUoUFRUWSk7CitzdGF0aWMgdm9pZCBpcDJfdGhyb3R0bGUoUFRUWSk7CitzdGF0aWMgdm9pZCBpcDJfdW50aHJvdHRsZShQVFRZKTsKK3N0YXRpYyB2b2lkIGlwMl9zdG9wKFBUVFkpOworc3RhdGljIHZvaWQgaXAyX3N0YXJ0KFBUVFkpOworc3RhdGljIHZvaWQgaXAyX2hhbmd1cChQVFRZKTsKK3N0YXRpYyBpbnQgIGlwMl90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50ICBpcDJfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKKworc3RhdGljIHZvaWQgc2V0X2lycShpbnQsIGludCk7CitzdGF0aWMgdm9pZCBpcDJfaW50ZXJydXB0X2JoKGkyZUJvcmRTdHJQdHIgcEIpOworc3RhdGljIGlycXJldHVybl90IGlwMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworc3RhdGljIHZvaWQgaXAyX3BvbGwodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGlubGluZSB2b2lkIHNlcnZpY2VfYWxsX2JvYXJkcyh2b2lkKTsKK3N0YXRpYyB2b2lkIGRvX2lucHV0KHZvaWQgKnApOworc3RhdGljIHZvaWQgZG9fc3RhdHVzKHZvaWQgKnApOworCitzdGF0aWMgdm9pZCBpcDJfd2FpdF91bnRpbF9zZW50KFBUVFksaW50KTsKKworc3RhdGljIHZvaWQgc2V0X3BhcmFtcyAoaTJDaGFuU3RyUHRyLCBzdHJ1Y3QgdGVybWlvcyAqKTsKK3N0YXRpYyBpbnQgZ2V0X3NlcmlhbF9pbmZvKGkyQ2hhblN0clB0ciwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopOworc3RhdGljIGludCBzZXRfc2VyaWFsX2luZm8oaTJDaGFuU3RyUHRyLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKik7CisKK3N0YXRpYyBzc2l6ZV90IGlwMl9pcGxfcmVhZChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3N0YXRpYyBzc2l6ZV90IGlwMl9pcGxfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CitzdGF0aWMgaW50IGlwMl9pcGxfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIFVJTlQsIFVMT05HKTsKK3N0YXRpYyBpbnQgaXAyX2lwbF9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKKworc3RhdGljIGludCBEdW1wVHJhY2VCdWZmZXIoY2hhciBfX3VzZXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgRHVtcEZpZm9CdWZmZXIoIGNoYXIgX191c2VyICosIGludCk7CisKK3N0YXRpYyB2b2lkIGlwMl9pbml0X2JvYXJkKGludCk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZmluZF9laXNhX2JvYXJkKGludCk7CisKKy8qKioqKioqKioqKioqKiovCisvKiBTdGF0aWMgRGF0YSAqLworLyoqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICppcDJfdHR5X2RyaXZlcjsKKworLyogSGVyZSwgdGhlbiBpcyBhIHRhYmxlIG9mIGJvYXJkIHBvaW50ZXJzIHdoaWNoIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBzaG91bGQKKyAqIHNjYW4gdGhyb3VnaCB0byBkZXRlcm1pbmUgd2hvIGl0IG11c3Qgc2VydmljZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGkybkJvYXJkczsgLy8gTnVtYmVyIG9mIGJvYXJkcyBoZXJlCisKK3N0YXRpYyBpMmVCb3JkU3RyUHRyIGkyQm9hcmRQdHJUYWJsZVtJUDJfTUFYX0JPQVJEU107CisKK3N0YXRpYyBpMkNoYW5TdHJQdHIgIERldlRhYmxlW0lQMl9NQVhfUE9SVFNdOworLy9EZXZUYWJsZU1lbSBqdXN0IHVzZWQgdG8gc2F2ZSBhZGRyZXNzZXMgZm9yIGtmcmVlCitzdGF0aWMgdm9pZCAgKkRldlRhYmxlTWVtW0lQMl9NQVhfQk9BUkRTXTsKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIGRlc2NyaXB0b3IgZm9yIHRoZSBpcDJpcGwgZGV2aWNlLCB3aGljaCBpcyB1c2VkIHRvCisgKiBkb3dubG9hZCB0aGUgbG9hZHdhcmUgdG8gdGhlIGJvYXJkcy4KKyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXAyX2lwbCA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJCT0gaXAyX2lwbF9yZWFkLAorCS53cml0ZQkJPSBpcDJfaXBsX3dyaXRlLAorCS5pb2N0bAkJPSBpcDJfaXBsX2lvY3RsLAorCS5vcGVuCQk9IGlwMl9pcGxfb3BlbiwKK307IAorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcnFfY291bnRlciA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBiaF9jb3VudGVyID0gMDsKKworLy8gVXNlIGltbWVkaWF0ZSBxdWV1ZSB0byBzZXJ2aWNlIGludGVycnVwdHMKKyNkZWZpbmUgVVNFX0lRSQorLy8jZGVmaW5lIFVTRV9JUQkvLyBQQ0kmMi4yIG5lZWRzIHdvcmsKKworLyogVGhlIHRpbWVyX2xpc3QgZW50cnkgZm9yIG91ciBwb2xsIHJvdXRpbmUuIElmIGludGVycnVwdCBvcGVyYXRpb24gaXMgbm90CisgKiBzZWxlY3RlZCwgdGhlIGJvYXJkIGlzIHNlcnZpY2VkIHBlcmlvZGljYWxseSB0byBzZWUgaWYgYW55dGhpbmcgbmVlZHMgZG9pbmcuCisgKi8KKyNkZWZpbmUgIFBPTExfVElNRU9VVCAgIChqaWZmaWVzICsgMSkKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBQb2xsVGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihpcDJfcG9sbCwgMCwgMCk7CitzdGF0aWMgY2hhciAgVGltZXJPbjsKKworI2lmZGVmIElQMkRFQlVHX1RSQUNFCisvKiBUcmFjZSAoZGVidWcpIGJ1ZmZlciBkYXRhICovCisjZGVmaW5lIFRSQUNFTUFYICAxMDAwCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0cmFjZWJ1ZltUUkFDRU1BWF07CitzdGF0aWMgaW50IHRyYWNlc3R1ZmY7CitzdGF0aWMgaW50IHRyYWNlc3RyaXA7CitzdGF0aWMgaW50IHRyYWNld3JhcDsKKyNlbmRpZgorCisvKioqKioqKioqKi8KKy8qIE1hY3JvcyAqLworLyoqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChJUDJERUJVR19PUEVOKQorI2RlZmluZSBEQkdfQ05UKHMpIHByaW50ayhLRVJOX0RFQlVHICIoJXMpOiBbJXhdIHJlZmM9JWQsIHR0eWM9JWQsIG1vZGM9JXggLT4gJXNcbiIsIFwKKwkJICAgIHR0eS0+bmFtZSwocENoLT5mbGFncyksaXAyX3R0eV9kcml2ZXItPnJlZmNvdW50LCBcCisJCSAgICB0dHktPmNvdW50LC8qR0VUX1VTRV9DT1VOVChtb2R1bGUpKi8wLHMpCisjZWxzZQorI2RlZmluZSBEQkdfQ05UKHMpCisjZW5kaWYKKworLyoqKioqKioqLworLyogQ29kZSAqLworLyoqKioqKioqLworCisjaW5jbHVkZSAiLi9pcDIvaTJlbGxpcy5jIiAgICAvKiBFeHRyZW1lbHkgbG93LWxldmVsIGludGVyZmFjZSBzZXJ2aWNlcyAqLworI2luY2x1ZGUgIi4vaXAyL2kyY21kLmMiICAgICAgLyogU3RhbmRhcmQgbG9hZHdhcmUgY29tbWFuZCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIi4vaXAyL2kybGliLmMiICAgICAgLyogSGlnaCBsZXZlbCBpbnRlcmZhY2Ugc2VydmljZXMgKi8KKworLyogQ29uZmlndXJhdGlvbiBhcmVhIGZvciBtb2Rwcm9iZSAqLworCitNT0RVTEVfQVVUSE9SKCJEb3VnIE1jTmFzaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21wdXRvbmUgSW50ZWxsaVBvcnQgUGx1cyBEcml2ZXIiKTsKKworc3RhdGljIGludCBwb2xsX29ubHkgPSAwOworCitzdGF0aWMgaW50IEVpc2FfaXJxOworc3RhdGljIGludCBFaXNhX3Nsb3Q7CisKK3N0YXRpYyBpbnQgaWluZHg7CitzdGF0aWMgY2hhciByaXJxc1tJUDJfTUFYX0JPQVJEU107CitzdGF0aWMgaW50IFZhbGlkX0lycXNbXSA9IHsgMywgNCwgNSwgNywgMTAsIDExLCAxMiwgMTUsIDB9OworCisvKiBmb3Igc3lzZnMgY2xhc3Mgc3VwcG9ydCAqLworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKmlwMl9jbGFzczsKKworLy8gU29tZSBmdW5jdGlvbnMgdG8ga2VlcCB0cmFjayBvZiB3aGF0IGlycSdzIHdlIGhhdmUKKworc3RhdGljIGludCBfX2luaXQKK2lzX3ZhbGlkX2lycShpbnQgaXJxKQoreworCWludCAqaSA9IFZhbGlkX0lycXM7CisJCisJd2hpbGUgKCgqaSAhPSAwKSAmJiAoKmkgIT0gaXJxKSkgeworCQlpKys7CisJfQorCXJldHVybiAoKmkpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK21hcmtfcmVxdWVzdGVkX2lycSggY2hhciBpcnEgKQoreworCXJpcnFzW2lpbmR4KytdID0gaXJxOworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdAorY2xlYXJfcmVxdWVzdGVkX2lycSggY2hhciBpcnEgKQoreworCWludCBpOworCWZvciAoIGkgPSAwOyBpIDwgSVAyX01BWF9CT0FSRFM7ICsraSApIHsKKwkJaWYgKHJpcnFzW2ldID09IGlycSkgeworCQkJcmlycXNbaV0gPSAwOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQKK2hhdmVfcmVxdWVzdGVkX2lycSggY2hhciBpcnEgKQoreworCS8vIGFycmF5IGluaXQgdG8gemVyb3Mgc28gMCBpcnEgd2lsbCBub3QgYmUgcmVxdWVzdGVkIGFzIGEgc2lkZSBlZmZlY3QKKwlpbnQgaTsKKwlmb3IgKCBpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kgKSB7CisJCWlmIChyaXJxc1tpXSA9PSBpcnEpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpbml0X21vZHVsZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIFN1Y2Nlc3MgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgaXMgYSByZXF1aXJlZCBlbnRyeSBwb2ludCBmb3IgYW4gaW5zdGFsbGFibGUgbW9kdWxlLiBJdCBzaW1wbHkgY2FsbHMgICovCisvKiB0aGUgZHJpdmVyIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGFuZCByZXR1cm5zIHdoYXQgaXQgcmV0dXJucy4gICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBNT0RVTEUKK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKyNpZmRlZiBJUDJERUJVR19JTklUCisJcHJpbnRrIChLRVJOX0RFQlVHICJMb2FkaW5nIG1vZHVsZSAuLi5cbiIgKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgY2xlYW51cF9tb2R1bGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGlzIGEgcmVxdWlyZWQgZW50cnkgcG9pbnQgZm9yIGFuIGluc3RhbGxhYmxlIG1vZHVsZS4gSXQgaGFzIHRvIHJldHVybiAqLworLyogdGhlIGRldmljZSBhbmQgdGhlIGRyaXZlciB0byBhIHBhc3NpdmUgc3RhdGUuIEl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5ICAgKi8KKy8qIHRvIHJlc2V0IHRoZSBib2FyZCBmdWxseSwgZXNwZWNpYWxseSBhcyB0aGUgbG9hZHdhcmUgaXMgZG93bmxvYWRlZCAgICAgICAgICovCisvKiBleHRlcm5hbGx5IHJhdGhlciB0aGFuIGluIHRoZSBkcml2ZXIuIFdlIGp1c3Qgd2FudCB0byBkaXNhYmxlIHRoZSBib2FyZCAgICAqLworLyogYW5kIGNsZWFyIHRoZSBsb2Fkd2FyZSB0byBhIHJlc2V0IHN0YXRlLiBUbyBhbGxvdyB0aGlzIHRoZXJlIGhhcyB0byBiZSBhICAgKi8KKy8qIHdheSB0byBkZXRlY3Qgd2hldGhlciB0aGUgYm9hcmQgaGFzIHRoZSBsb2Fkd2FyZSBydW5uaW5nIGF0IGluaXQgdGltZSB0byAgICovCisvKiBoYW5kbGUgc3Vic2VxdWVudCBpbnN0YWxsYXRpb25zIG9mIHRoZSBkcml2ZXIuIEFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSAqLworLyogZHJpdmVyIHNob3VsZCBiZSByZXR1cm5lZCBzaW5jZSBpdCBtYXkgYmUgdW5sb2FkZWQgZnJvbSBtZW1vcnkuICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgTU9EVUxFCit2b2lkCitjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCBlcnI7CisJaW50IGk7CisKKyNpZmRlZiBJUDJERUJVR19JTklUCisJcHJpbnRrIChLRVJOX0RFQlVHICJVbmxvYWRpbmcgJXM6IHZlcnNpb24gJXNcbiIsIHBjTmFtZSwgcGNWZXJzaW9uICk7CisjZW5kaWYKKwkvKiBTdG9wIHBvbGwgdGltZXIgaWYgd2UgaGFkIG9uZS4gKi8KKwlpZiAoIFRpbWVyT24gKSB7CisJCWRlbF90aW1lciAoICZQb2xsVGltZXIgKTsKKwkJVGltZXJPbiA9IDA7CisJfQorCisJLyogUmVzZXQgdGhlIGJvYXJkcyB3ZSBoYXZlLiAqLworCWZvciggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgeworCQlpZiAoIGkyQm9hcmRQdHJUYWJsZVtpXSApIHsKKwkJCWlpUmVzZXQoIGkyQm9hcmRQdHJUYWJsZVtpXSApOworCQl9CisJfQorCisJLyogVGhlIGZvbGxvd2luZyBpcyBkb25lIGF0IG1vc3Qgb25jZSwgaWYgYW55IGJvYXJkcyB3ZXJlIGluc3RhbGxlZC4gKi8KKwlmb3IgKCBpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kgKSB7CisJCWlmICggaTJCb2FyZFB0clRhYmxlW2ldICkgeworCQkJaWlSZXNldERlbGF5KCBpMkJvYXJkUHRyVGFibGVbaV0gKTsKKwkJCS8qIGZyZWUgaW8gYWRkcmVzc2VzIGFuZCBUaWJldCAqLworCQkJcmVsZWFzZV9yZWdpb24oIGlwMmNvbmZpZy5hZGRyW2ldLCA4ICk7CisJCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihJUDJfSVBMX01BSk9SLCA0ICogaSkpOyAKKwkJCWRldmZzX3JlbW92ZSgiaXAyL2lwbCVkIiwgaSk7CisJCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihJUDJfSVBMX01BSk9SLCA0ICogaSArIDEpKTsKKwkJCWRldmZzX3JlbW92ZSgiaXAyL3N0YXQlZCIsIGkpOworCQl9CisJCS8qIERpc2FibGUgYW5kIHJlbW92ZSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KKwkJaWYgKCAoaXAyY29uZmlnLmlycVtpXSA+IDApICYmIGhhdmVfcmVxdWVzdGVkX2lycShpcDJjb25maWcuaXJxW2ldKSApIHsJCisJCQlmcmVlX2lycSAoIGlwMmNvbmZpZy5pcnFbaV0sICh2b2lkICopJnBjTmFtZSk7CisJCQljbGVhcl9yZXF1ZXN0ZWRfaXJxKCBpcDJjb25maWcuaXJxW2ldKTsKKwkJfQorCX0KKwljbGFzc19zaW1wbGVfZGVzdHJveShpcDJfY2xhc3MpOworCWRldmZzX3JlbW92ZSgiaXAyIik7CisJaWYgKCAoIGVyciA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlciAoIGlwMl90dHlfZHJpdmVyICkgKSApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIHR0eSBkcml2ZXIgKCVkKVxuIiwgZXJyKTsKKwl9CisJcHV0X3R0eV9kcml2ZXIoaXAyX3R0eV9kcml2ZXIpOworCWlmICggKCBlcnIgPSB1bnJlZ2lzdGVyX2NocmRldiAoIElQMl9JUExfTUFKT1IsIHBjSXBsICkgKSApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIElQTCBkcml2ZXIgKCVkKVxuIiwgZXJyKTsKKwl9CisJcmVtb3ZlX3Byb2NfZW50cnkoImlwMm1lbSIsICZwcm9jX3Jvb3QpOworCisJLy8gZnJlZSBtZW1vcnkKKwlmb3IgKGkgPSAwOyBpIDwgSVAyX01BWF9CT0FSRFM7IGkrKykgeworCQl2b2lkICpwQjsKKyNpZmRlZiBDT05GSUdfUENJCisJCWlmIChpcDJjb25maWcudHlwZVtpXSA9PSBQQ0kgJiYgaXAyY29uZmlnLnBjaV9kZXZbaV0pIHsKKwkJCXBjaV9kaXNhYmxlX2RldmljZShpcDJjb25maWcucGNpX2RldltpXSk7CisJCQlpcDJjb25maWcucGNpX2RldltpXSA9IE5VTEw7CisJCX0KKyNlbmRpZgorCQlpZiAoKHBCID0gaTJCb2FyZFB0clRhYmxlW2ldKSAhPSAwICkgeworCQkJa2ZyZWUgKCBwQiApOworCQkJaTJCb2FyZFB0clRhYmxlW2ldID0gTlVMTDsKKwkJfQorCQlpZiAoKERldlRhYmxlTWVtW2ldKSAhPSBOVUxMICkgeworCQkJa2ZyZWUgKCBEZXZUYWJsZU1lbVtpXSAgKTsKKwkJCURldlRhYmxlTWVtW2ldID0gTlVMTDsKKwkJfQorCX0KKworCS8qIENsZWFudXAgdGhlIGlpRWxsaXMgc3Vic3lzdGVtLiAqLworCWlpRWxsaXNDbGVhbnVwKCk7CisjaWZkZWYgSVAyREVCVUdfSU5JVAorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAyIFVubG9hZGVkXG4iICk7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBpcDJfb3BzID0geworCS5vcGVuICAgICAgICAgICAgPSBpcDJfb3BlbiwKKwkuY2xvc2UgICAgICAgICAgID0gaXAyX2Nsb3NlLAorCS53cml0ZSAgICAgICAgICAgPSBpcDJfd3JpdGUsCisJLnB1dF9jaGFyICAgICAgICA9IGlwMl9wdXRjaGFyLAorCS5mbHVzaF9jaGFycyAgICAgPSBpcDJfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gICAgICA9IGlwMl93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBpcDJfY2hhcnNfaW5fYnVmLAorCS5mbHVzaF9idWZmZXIgICAgPSBpcDJfZmx1c2hfYnVmZmVyLAorCS5pb2N0bCAgICAgICAgICAgPSBpcDJfaW9jdGwsCisJLnRocm90dGxlICAgICAgICA9IGlwMl90aHJvdHRsZSwKKwkudW50aHJvdHRsZSAgICAgID0gaXAyX3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zICAgICA9IGlwMl9zZXRfdGVybWlvcywKKwkuc2V0X2xkaXNjICAgICAgID0gaXAyX3NldF9saW5lX2Rpc2NpcGxpbmUsCisJLnN0b3AgICAgICAgICAgICA9IGlwMl9zdG9wLAorCS5zdGFydCAgICAgICAgICAgPSBpcDJfc3RhcnQsCisJLmhhbmd1cCAgICAgICAgICA9IGlwMl9oYW5ndXAsCisJLnJlYWRfcHJvYyAgICAgICA9IGlwMl9yZWFkX3Byb2MsCisJLnRpb2NtZ2V0CSA9IGlwMl90aW9jbWdldCwKKwkudGlvY21zZXQJID0gaXAyX3Rpb2Ntc2V0LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9sb2FkbWFpbigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBpcnEsIGlvIGZyb20gY29tbWFuZCBsaW5lIG9mIGluc21vZCBldC4gYWwuICAgICAgICAgICAgICAgICAgICAqLworLyoJCXBvaW50ZXIgdG8gZmlwIGZpcm13YXJlIGFuZCBmaXJtd2FyZSBzaXplIGZvciBib2FyZHMJICAgICAgKi8KKy8qIFJldHVybnM6ICAgIFN1Y2Nlc3MgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgd2FzIHRoZSByZXF1aXJlZCBlbnRyeSBwb2ludCBmb3IgYWxsIGRyaXZlcnMgKG5vdyBpbiBpcDIuYykgICAgICAgICAgICovCisvKiBJdCBwZXJmb3JtcyBhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogaW5pdGlhbGlzYXRpb24gb2YgdGhlIGRldmljZXMgYW5kIGRyaXZlciBzdHJ1Y3R1cmVzLCBhbmQgcmVnaXN0ZXJzIGl0c2VsZiAgKi8KKy8qIHdpdGggdGhlIHJlbGV2YW50IGtlcm5lbCBtb2R1bGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU0FfSU5URVJSVVBULSBpZiBzZXQgYmxvY2tzIGFsbCBpbnRlcnJ1cHRzIGVsc2Ugb25seSB0aGlzIGxpbmUgKi8KKy8qIFNBX1NISVJRICAgIC0gZm9yIHNoYXJlZCBpcnEgUENJIG9yIG1heWJlIEVJU0Egb25seSAqLworLyogU0FfUkFORE9NICAgLSBjYW4gYmUgc291cmNlIGZvciBjZXJ0LiByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgKi8KKyNkZWZpbmUgSVAyX1NBX0ZMQUdTCTAKKworaW50CitpcDJfbG9hZG1haW4oaW50ICppb3AsIGludCAqaXJxcCwgdW5zaWduZWQgY2hhciAqZmlybXdhcmUsIGludCBmaXJtc2l6ZSkgCit7CisJaW50IGksIGosIGJveDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdGF0aWMgaW50IGxvYWRlZDsKKwlpMmVCb3JkU3RyUHRyIHBCID0gTlVMTDsKKwlpbnQgcmMgPSAtMTsKKworCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfSU5JVCwgSVRSQ19FTlRFUiwgMCApOworCisJLyogcHJvY2VzcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIG1vZHByb2JlIG9yCisJCWluc21vZCBpLmUuIGlvcCAmIGlycXAgKi8KKwkvKiBpcnFwIGFuZCBpb3Agc2hvdWxkIEFMV0FZUyBiZSBzcGVjaWZpZWQgbm93Li4uICBCdXQgd2UgY2hlY2sKKwkJdGhlbSBpbmRpdmlkdWFsbHkganVzdCB0byBiZSBzdXJlLCBhbnl3YXlzLi4uICovCisJZm9yICggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgeworCQlpZiAoaW9wKSB7CisJCQlpcDJjb25maWcuYWRkcltpXSA9IGlvcFtpXTsKKwkJCWlmIChpcnFwKSB7CisJCQkJaWYoIGlycXBbaV0gPj0gMCApIHsKKwkJCQkJaXAyY29uZmlnLmlycVtpXSA9IGlycXBbaV07CisJCQkJfSBlbHNlIHsKKwkJCQkJaXAyY29uZmlnLmlycVtpXSA9IDA7CisJCQkJfQorCS8vIFRoaXMgaXMgYSBsaXR0bGUgYml0IG9mIGEgaGFjay4gIElmIHBvbGxfb25seT0xIG9uIGNvbW1hbmQKKwkvLyBsaW5lIGJhY2sgaW4gaXAyLmMgT1IgYWxsIElSUXMgb24gYWxsIHNwZWNpZmllZCBib2FyZHMgYXJlCisJLy8gZXhwbGljaXRseSBzZXQgdG8gMCwgdGhlbiBkcm9wIHRvIHBvbGwgb25seSBtb2RlIGFuZCBvdmVycmlkZQorCS8vIFBDSSBvciBFSVNBIGludGVycnVwdHMuICBUaGlzIHN1cGVyY2VlZHMgdGhlIG9sZCBoYWNrIG9mCisJLy8gdHJpZ2dlcmluZyBpZiBhbGwgaW50ZXJydXB0cyB3ZXJlIHplcm8gKGxpa2UgZGEgZGVmYXVsdCkuCisJLy8gU3RpbGwgYSBoYWNrIGJ1dCBsZXNzIHByb25lIHRvIHJhbmRvbSBhY3RzIG9mIHRlcnJvcmlzbS4KKwkvLworCS8vIFdoYXQgd2UgcmVhbGx5IHNob3VsZCBkbywgbm93IHRoYXQgdGhlIElSUSBkZWZhdWx0IGlzIHNldAorCS8vIHRvIC0xLCBpcyB0byB1c2UgMCBhcyBhIGhhcmQgY29kZWQsIGRvIG5vdCBwcm9iZS4KKwkvLworCS8vCS9cL1x8PW1odz18XC9cLworCQkJCXBvbGxfb25seSB8PSBpcnFwW2ldOworCQkJfQorCQl9CisJfQorCXBvbGxfb25seSA9ICFwb2xsX29ubHk7CisKKwlGaXBfZmlybXdhcmUgPSBmaXJtd2FyZTsKKwlGaXBfZmlybXdhcmVfc2l6ZSA9IGZpcm1zaXplOworCisJLyogQW5ub3VuY2Ugb3VyIHByZXNlbmNlICovCisJcHJpbnRrKCBLRVJOX0lORk8gIiVzIHZlcnNpb24gJXNcbiIsIHBjTmFtZSwgcGNWZXJzaW9uICk7CisKKwkvLyBpcDIgY2FuIGJlIHVubG9hZGVkIGFuZCByZWxvYWRlZCBmb3Igbm8gZ29vZCByZWFzb24KKwkvLyB3ZSBjYW4ndCBsZXQgdGhhdCBoYXBwZW4gaGVyZSBvciBiYWQgdGhpbmdzIGhhcHBlbgorCS8vIHNlY29uZCBsb2FkIGhvc2VzIGJvYXJkIGJ1dCBub3Qgc3lzdGVtIC0gZml4bWUgbGF0ZXIKKwlpZiAobG9hZGVkKSB7CisJCXByaW50ayggS0VSTl9JTkZPICJTdGlsbCBsb2FkZWRcbiIgKTsKKwkJcmV0dXJuIDA7CisJfQorCWxvYWRlZCsrOworCisJaXAyX3R0eV9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKElQMl9NQVhfUE9SVFMpOworCWlmICghaXAyX3R0eV9kcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogSW5pdGlhbGlzZSB0aGUgaWlFbGxpcyBzdWJzeXN0ZW0uICovCisJaWlFbGxpc0luaXQoKTsKKworCS8qIEluaXRpYWxpemUgYXJyYXlzLiAqLworCW1lbXNldCggaTJCb2FyZFB0clRhYmxlLCAwLCBzaXplb2YgaTJCb2FyZFB0clRhYmxlICk7CisJbWVtc2V0KCBEZXZUYWJsZSwgMCwgc2l6ZW9mIERldlRhYmxlICk7CisKKwkvKiBJbml0aWFsaXNlIGFsbCB0aGUgYm9hcmRzIHdlIGNhbiBmaW5kICh1cCB0byB0aGUgbWF4aW11bSkuICovCisJZm9yICggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgeworCQlzd2l0Y2ggKCBpcDJjb25maWcuYWRkcltpXSApIHsgCisJCWNhc2UgMDoJLyogc2tpcCB0aGlzIHNsb3QgZXZlbiBpZiBjYXJkIGlzIHByZXNlbnQgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBJU0EgKi8KKwkJICAgLyogSVNBIGFkZHJlc3MgbXVzdCBiZSBzcGVjaWZpZWQgKi8KKwkJCWlmICggKGlwMmNvbmZpZy5hZGRyW2ldIDwgMHgxMDApIHx8IChpcDJjb25maWcuYWRkcltpXSA+IDB4M2Y4KSApIHsKKwkJCQlwcmludGsgKCBLRVJOX0VSUiAiSVAyOiBCYWQgSVNBIGJvYXJkICVkIGFkZHJlc3MgJXhcbiIsCisJCQkJCQkJIGksIGlwMmNvbmZpZy5hZGRyW2ldICk7CisJCQkJaXAyY29uZmlnLmFkZHJbaV0gPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpcDJjb25maWcudHlwZVtpXSA9IElTQTsKKworCQkJCS8qIENoZWNrIGZvciB2YWxpZCBpcnEgYXJndW1lbnQsIHNldCBmb3IgcG9sbGluZyBpZiBpbnZhbGlkICovCisJCQkJaWYgKGlwMmNvbmZpZy5pcnFbaV0gJiYgIWlzX3ZhbGlkX2lycShpcDJjb25maWcuaXJxW2ldKSkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIklQMjogQmFkIElSUSglZCkgc3BlY2lmaWVkXG4iLGlwMmNvbmZpZy5pcnFbaV0pOworCQkJCQlpcDJjb25maWcuaXJxW2ldID0gMDsvLyAwIGlzIHBvbGxpbmcgYW5kIGlzIHZhbGlkIGluIHRoYXQgc2Vuc2UKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQQ0k6CisjaWZkZWYgQ09ORklHX1BDSQorCQkJeworCQkJCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2X2kgPSBOVUxMOworCQkJCXBjaV9kZXZfaSA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0NPTVBVVE9ORSwKKwkJCQkJCQkgIFBDSV9ERVZJQ0VfSURfQ09NUFVUT05FX0lQMkVYLCBwY2lfZGV2X2kpOworCQkJCWlmIChwY2lfZGV2X2kgIT0gTlVMTCkgeworCQkJCQl1bnNpZ25lZCBpbnQgYWRkcjsKKworCQkJCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldl9pKSkgeworCQkJCQkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBjYW4ndCBlbmFibGUgUENJIGRldmljZSBhdCAlc1xuIiwKKwkJCQkJCQlwY2lfbmFtZShwY2lfZGV2X2kpKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlwMmNvbmZpZy50eXBlW2ldID0gUENJOworCQkJCQlpcDJjb25maWcucGNpX2RldltpXSA9IHBjaV9kZXZfaTsKKwkJCQkJc3RhdHVzID0KKwkJCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXZfaSwgUENJX0JBU0VfQUREUkVTU18xLCAmYWRkcik7CisJCQkJCWlmICggYWRkciAmIDEgKSB7CisJCQkJCQlpcDJjb25maWcuYWRkcltpXT0oVVNIT1JUKShhZGRyJjB4ZmZmZSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGsoIEtFUk5fRVJSICJJUDI6IFBDSSBJL08gYWRkcmVzcyBlcnJvclxuIik7CisJCQkJCX0KKworLy8JCUlmIHRoZSBQQ0kgQklPUyBhc3NpZ25lZCBpdCwgbGV0cyB0cnkgYW5kIHVzZSBpdC4gIElmIHdlCisvLwkJY2FuJ3QgYWNxdWlyZSBpdCBvciBpdCBzY3Jld3MgdXAsIGRlYWwgd2l0aCBpdCB0aGVuLgorCisvLwkJCQkJaWYgKCFpc192YWxpZF9pcnEocGNpX2lycSkpIHsKKy8vCQkJCQkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBCYWQgUENJIEJJT1MgSVJRKCVkKVxuIixwY2lfaXJxKTsKKy8vCQkJCQkJcGNpX2lycSA9IDA7CisvLwkJCQkJfQorCQkJCQlpcDJjb25maWcuaXJxW2ldID0gcGNpX2Rldl9pLT5pcnE7CisJCQkJfSBlbHNlIHsJLy8gYW5uIGVycm9yCisJCQkJCWlwMmNvbmZpZy5hZGRyW2ldID0gMDsKKwkJCQkJaWYgKHN0YXR1cyA9PSBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQpIHsKKwkJCQkJCXByaW50ayggS0VSTl9FUlIgIklQMjogUENJIGJvYXJkICVkIG5vdCBmb3VuZFxuIiwgaSApOworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBQQ0kgZXJyb3IgMHgleCBcbiIsIHN0YXR1cyApOworCQkJCQl9CisJCQkJfSAKKwkJCX0KKyNlbHNlCisJCQlwcmludGsoIEtFUk5fRVJSICJJUDI6IFBDSSBjYXJkIHNwZWNpZmllZCBidXQgUENJIHN1cHBvcnQgbm90XG4iKTsKKwkJCXByaW50ayggS0VSTl9FUlIgIklQMjogY29uZmlndXJlZCBpbiB0aGlzIGtlcm5lbC5cbiIpOworCQkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBSZWNvbXBpbGUga2VybmVsIHdpdGggQ09ORklHX1BDSSBkZWZpbmVkIVxuIik7CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCQkJYnJlYWs7CisJCWNhc2UgRUlTQToKKwkJCWlmICggKGlwMmNvbmZpZy5hZGRyW2ldID0gZmluZF9laXNhX2JvYXJkKCBFaXNhX3Nsb3QgKyAxICkpICE9IDApIHsKKwkJCQkvKiBFaXNhX2lycSBzZXQgYXMgc2lkZSBlZmZlY3QsIGJvbyAqLworCQkJCWlwMmNvbmZpZy50eXBlW2ldID0gRUlTQTsKKwkJCX0gCisJCQlpcDJjb25maWcuaXJxW2ldID0gRWlzYV9pcnE7CisJCQlicmVhazsKKwkJfQkvKiBzd2l0Y2ggKi8KKwl9CS8qIGZvciAqLworCWZvciAoIGkgPSAwOyBpIDwgSVAyX01BWF9CT0FSRFM7ICsraSApIHsKKwkJaWYgKCBpcDJjb25maWcuYWRkcltpXSApIHsKKwkJCXBCID0ga21hbGxvYyggc2l6ZW9mKGkyZUJvcmRTdHIpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICggcEIgIT0gTlVMTCApIHsKKwkJCQlpMkJvYXJkUHRyVGFibGVbaV0gPSBwQjsKKwkJCQltZW1zZXQoIHBCLCAwLCBzaXplb2YoaTJlQm9yZFN0cikgKTsKKwkJCQlpaVNldEFkZHJlc3MoIHBCLCBpcDJjb25maWcuYWRkcltpXSwgaWkyRGVsYXlUaW1lciApOworCQkJCWlpUmVzZXQoIHBCICk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSVAyOiBib2FyZCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCQl9CisJCX0KKwl9CisJZm9yICggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgeworCQlpZiAoICggcEIgPSBpMkJvYXJkUHRyVGFibGVbaV0gKSAhPSBOVUxMICkgeworCQkJaWlSZXNldERlbGF5KCBwQiApOworCQkJYnJlYWs7CisJCX0KKwl9CisJZm9yICggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgeworCQlpZiAoIGkyQm9hcmRQdHJUYWJsZVtpXSAhPSBOVUxMICkgeworCQkJaXAyX2luaXRfYm9hcmQoIGkgKTsKKwkJfQorCX0KKworCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfSU5JVCwgMiwgMCApOworCisJaXAyX3R0eV9kcml2ZXItPm93bmVyCQkgICAgPSBUSElTX01PRFVMRTsKKwlpcDJfdHR5X2RyaXZlci0+bmFtZSAgICAgICAgICAgICAgICAgPSAidHR5RiI7CisJaXAyX3R0eV9kcml2ZXItPmRldmZzX25hbWUJICAgID0gInR0cy9GIjsKKwlpcDJfdHR5X2RyaXZlci0+ZHJpdmVyX25hbWUgICAgICAgICAgPSBwY0RyaXZlcl9uYW1lOworCWlwMl90dHlfZHJpdmVyLT5tYWpvciAgICAgICAgICAgICAgICA9IElQMl9UVFlfTUFKT1I7CisJaXAyX3R0eV9kcml2ZXItPm1pbm9yX3N0YXJ0ICAgICAgICAgID0gMDsKKwlpcDJfdHR5X2RyaXZlci0+dHlwZSAgICAgICAgICAgICAgICAgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCWlwMl90dHlfZHJpdmVyLT5zdWJ0eXBlICAgICAgICAgICAgICA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlpcDJfdHR5X2RyaXZlci0+aW5pdF90ZXJtaW9zICAgICAgICAgPSB0dHlfc3RkX3Rlcm1pb3M7CisJaXAyX3R0eV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDB8Q1M4fENSRUFEfEhVUENMfENMT0NBTDsKKwlpcDJfdHR5X2RyaXZlci0+ZmxhZ3MgICAgICAgICAgICAgICAgPSBUVFlfRFJJVkVSX1JFQUxfUkFXIHwgVFRZX0RSSVZFUl9OT19ERVZGUzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoaXAyX3R0eV9kcml2ZXIsICZpcDJfb3BzKTsKKworCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfSU5JVCwgMywgMCApOworCisJLyogUmVnaXN0ZXIgdGhlIHR0eSBkZXZpY2VzLiAqLworCWlmICggKCBlcnIgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyICggaXAyX3R0eV9kcml2ZXIgKSApICkgeworCQlwcmludGsoS0VSTl9FUlIgIklQMjogZmFpbGVkIHRvIHJlZ2lzdGVyIHR0eSBkcml2ZXIgKCVkKVxuIiwgZXJyKTsKKwkJcHV0X3R0eV9kcml2ZXIoaXAyX3R0eV9kcml2ZXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UKKwkvKiBSZWdpc3RlciB0aGUgSVBMIGRyaXZlci4gKi8KKwlpZiAoICggZXJyID0gcmVnaXN0ZXJfY2hyZGV2ICggSVAyX0lQTF9NQUpPUiwgcGNJcGwsICZpcDJfaXBsICkgKSApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGZhaWxlZCB0byByZWdpc3RlciBJUEwgZGV2aWNlICglZClcbiIsIGVyciApOworCX0gZWxzZSB7CisJCS8qIGNyZWF0ZSB0aGUgc3lzZnMgY2xhc3MgKi8KKwkJaXAyX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgImlwMiIpOworCQlpZiAoSVNfRVJSKGlwMl9jbGFzcykpIHsKKwkJCWVyciA9IFBUUl9FUlIoaXAyX2NsYXNzKTsKKwkJCWdvdG8gb3V0X2NocmRldjsJCisJCX0KKwl9CisJLyogUmVnaXN0ZXIgdGhlIHJlYWRfcHJvY21lbSB0aGluZyAqLworCWlmICghY3JlYXRlX3Byb2NfaW5mb19lbnRyeSgiaXAybWVtIiwwLCZwcm9jX3Jvb3QsaXAyX3JlYWRfcHJvY21lbSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGZhaWxlZCB0byByZWdpc3RlciByZWFkX3Byb2NtZW1cbiIpOworCX0gZWxzZSB7CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX0lOSVQsIDQsIDAgKTsKKwkJLyogUmVnaXN0ZXIgdGhlIGludGVycnVwdCBoYW5kbGVyIG9yIHBvbGwgaGFuZGxlciwgZGVwZW5kaW5nIHVwb24gdGhlCisJCSAqIHNwZWNpZmllZCBpbnRlcnJ1cHQuCisJCSAqLworCisJCWZvciggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgeworCQkJaWYgKCAwID09IGlwMmNvbmZpZy5hZGRyW2ldICkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIE5VTEwgIT0gKCBwQiA9IGkyQm9hcmRQdHJUYWJsZVtpXSApICkgeworCQkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGlwMl9jbGFzcywgTUtERVYoSVAyX0lQTF9NQUpPUiwgCisJCQkJCQk0ICogaSksIE5VTEwsICJpcGwlZCIsIGkpOworCQkJCWVyciA9IGRldmZzX21rX2NkZXYoTUtERVYoSVAyX0lQTF9NQUpPUiwgNCAqIGkpLAorCQkJCQkJU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JRkNIUiwKKwkJCQkJCSJpcDIvaXBsJWQiLCBpKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKElQMl9JUExfTUFKT1IsIAorCQkJCQkJNCAqIGkpKTsKKwkJCQkJZ290byBvdXRfY2xhc3M7CisJCQkJfQorCisJCQkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoaXAyX2NsYXNzLCBNS0RFVihJUDJfSVBMX01BSk9SLCAKKwkJCQkJCTQgKiBpICsgMSksIE5VTEwsICJzdGF0JWQiLCBpKTsKKwkJCQllcnIgPSBkZXZmc19ta19jZGV2KE1LREVWKElQMl9JUExfTUFKT1IsIDQgKiBpICsgMSksCisJCQkJCQlTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lGQ0hSLAorCQkJCQkJImlwMi9zdGF0JWQiLCBpKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKElQMl9JUExfTUFKT1IsIAorCQkJCQkJNCAqIGkgKyAxKSk7CisJCQkJCWdvdG8gb3V0X2NsYXNzOworCQkJCX0KKworCQkJICAgIGZvciAoIGJveCA9IDA7IGJveCA8IEFCU19NQVhfQk9YRVM7ICsrYm94ICkKKwkJCSAgICB7CisJCQkgICAgICAgIGZvciAoIGogPSAwOyBqIDwgQUJTX0JJR0dFU1RfQk9YOyArK2ogKQorCQkJICAgICAgICB7CisJCQkJICAgIGlmICggcEItPmkyZUNoYW5uZWxNYXBbYm94XSAmICgxIDw8IGopICkKKwkJCQkgICAgeworCQkJCSAgICAgICAgdHR5X3JlZ2lzdGVyX2RldmljZShpcDJfdHR5X2RyaXZlciwKKwkJCQkJICAgIGogKyBBQlNfQklHR0VTVF9CT1ggKgorCQkJCQkJICAgIChib3graSpBQlNfTUFYX0JPWEVTKSwgTlVMTCk7CisJCQkgICAgCSAgICB9CisJCQkgICAgICAgIH0KKwkJCSAgICB9CisJCQl9CisKKwkJCWlmIChwb2xsX29ubHkpIHsKKy8vCQlQb2xsIG9ubHkgZm9yY2VzIGRyaXZlciB0byBvbmx5IHVzZSBwb2xsaW5nIGFuZAorLy8JCXRvIGlnbm9yZSB0aGUgcHJvYmVkIFBDSSBvciBFSVNBIGludGVycnVwdHMuCisJCQkJaXAyY29uZmlnLmlycVtpXSA9IENJUl9QT0xMOworCQkJfQorCQkJaWYgKCBpcDJjb25maWcuaXJxW2ldID09IENJUl9QT0xMICkgeworcmV0cnk6CisJCQkJaWYgKCFUaW1lck9uKSB7CisJCQkJCVBvbGxUaW1lci5leHBpcmVzID0gUE9MTF9USU1FT1VUOworCQkJCQlhZGRfdGltZXIgKCAmUG9sbFRpbWVyICk7CisJCQkJCVRpbWVyT24gPSAxOworCQkJCQlwcmludGsoIEtFUk5fSU5GTyAiSVAyOiBwb2xsaW5nXG4iKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChoYXZlX3JlcXVlc3RlZF9pcnEoaXAyY29uZmlnLmlycVtpXSkpCisJCQkJCWNvbnRpbnVlOworCQkJCXJjID0gcmVxdWVzdF9pcnEoIGlwMmNvbmZpZy5pcnFbaV0sIGlwMl9pbnRlcnJ1cHQsCisJCQkJCUlQMl9TQV9GTEFHUyB8IChpcDJjb25maWcudHlwZVtpXSA9PSBQQ0kgPyBTQV9TSElSUSA6IDApLAorCQkJCQlwY05hbWUsICh2b2lkICopJnBjTmFtZSk7CisJCQkJaWYgKHJjKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiSVAyOiBhbiByZXF1ZXN0X2lycSBmYWlsZWQ6IGVycm9yICVkXG4iLHJjKTsKKwkJCQkJaXAyY29uZmlnLmlycVtpXSA9IENJUl9QT0xMOworCQkJCQlwcmludGsoIEtFUk5fSU5GTyAiSVAyOiBQb2xsaW5nICVsZC9zZWMuXG4iLAorCQkJCQkJCShQT0xMX1RJTUVPVVQgLSBqaWZmaWVzKSk7CisJCQkJCWdvdG8gcmV0cnk7CisJCQkJfSAKKwkJCQltYXJrX3JlcXVlc3RlZF9pcnEoaXAyY29uZmlnLmlycVtpXSk7CisJCQkJLyogSW5pdGlhbGlzZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYm90dG9tIGhhbGYgKGFrYSBzbGloKS4gKi8KKwkJCX0KKwkJfQorCQlmb3IoIGkgPSAwOyBpIDwgSVAyX01BWF9CT0FSRFM7ICsraSApIHsKKwkJCWlmICggaTJCb2FyZFB0clRhYmxlW2ldICkgeworCQkJCXNldF9pcnEoIGksIGlwMmNvbmZpZy5pcnFbaV0gKTsgLyogc2V0IGFuZCBlbmFibGUgYm9hcmQgaW50ZXJydXB0ICovCisJCQl9CisJCX0KKwl9CisJaXAydHJhY2UgKElUUkNfTk9fUE9SVCwgSVRSQ19JTklULCBJVFJDX1JFVFVSTiwgMCApOworCWdvdG8gb3V0OworCitvdXRfY2xhc3M6CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koaXAyX2NsYXNzKTsKK291dF9jaHJkZXY6CisJdW5yZWdpc3Rlcl9jaHJkZXYoSVAyX0lQTF9NQUpPUiwgImlwMiIpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK0VYUE9SVF9TWU1CT0woaXAyX2xvYWRtYWluKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9pbml0X2JvYXJkKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBJbmRleCBvZiBib2FyZCBpbiBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgU3VjY2VzcyAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIGJvYXJkLiBUaGUgbG9hZHdhcmUgaXMgY29waWVkIHRvICAgKi8KKy8qIHRoZSBib2FyZCwgdGhlIGNoYW5uZWwgc3RydWN0dXJlcyBhcmUgaW5pdGlhbGl6ZWQsIGFuZCB0aGUgYm9hcmQgZGV0YWlscyAgICovCisvKiBhcmUgcmVwb3J0ZWQgb24gdGhlIGNvbnNvbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9faW5pdAoraXAyX2luaXRfYm9hcmQoIGludCBib2FyZG51bSApCit7CisJaW50IGk7CisJaW50IG5wb3J0cyA9IDAsIG5ib3hlcyA9IDA7CisJaTJDaGFuU3RyUHRyIHBDaDsKKwlpMmVCb3JkU3RyUHRyIHBCID0gaTJCb2FyZFB0clRhYmxlW2JvYXJkbnVtXTsKKworCWlmICggIWlpSW5pdGlhbGl6ZSAoIHBCICkgKSB7CisJCXByaW50ayAoIEtFUk5fRVJSICJJUDI6IEZhaWxlZCB0byBpbml0aWFsaXplIGJvYXJkIGF0IDB4JXgsIGVycm9yICVkXG4iLAorCQkJIHBCLT5pMmVCYXNlLCBwQi0+aTJlRXJyb3IgKTsKKwkJZ290byBlcnJfaW5pdGlhbGl6ZTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiSVAyOiBCb2FyZCAlZDogYWRkcj0weCV4IGlycT0lZFxuIiwgYm9hcmRudW0gKyAxLAorCSAgICAgICBpcDJjb25maWcuYWRkcltib2FyZG51bV0sIGlwMmNvbmZpZy5pcnFbYm9hcmRudW1dICk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKCBpcDJjb25maWcuYWRkcltib2FyZG51bV0sIDgsIHBjTmFtZSApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSVAyOiBiYWQgYWRkcj0weCV4XG4iLCBpcDJjb25maWcuYWRkcltib2FyZG51bV0pOworCQlnb3RvIGVycl9pbml0aWFsaXplOworCX0KKworCWlmICggaWlEb3dubG9hZEFsbCAoIHBCLCAobG9hZEhkclN0clB0cilGaXBfZmlybXdhcmUsIDEsIEZpcF9maXJtd2FyZV9zaXplICkKKwkgICAgIT0gSUlfRE9XTl9HT09EICkgeworCQlwcmludGsgKCBLRVJOX0VSUiAiSVAyOiBmYWlsZWQgdG8gZG93bmxvYWQgbG9hZHdhcmVcbiIgKTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJfSBlbHNlIHsKKwkJcHJpbnRrICggS0VSTl9JTkZPICJJUDI6IGZ2PSVkLiVkLiVkIGx2PSVkLiVkLiVkXG4iLAorCQkJIHBCLT5pMmVQb20uZS5wb3JWZXJzaW9uLAorCQkJIHBCLT5pMmVQb20uZS5wb3JSZXZpc2lvbiwKKwkJCSBwQi0+aTJlUG9tLmUucG9yU3ViUmV2LCBwQi0+aTJlTFZlcnNpb24sCisJCQkgcEItPmkyZUxSZXZpc2lvbiwgcEItPmkyZUxTdWIgKTsKKwl9CisKKwlzd2l0Y2ggKCBwQi0+aTJlUG9tLmUucG9ySUQgJiB+UE9SX0lEX1JFU0VSVkVEICkgeworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBVbmtub3duIGJvYXJkIHR5cGUsIElEID0gJXhcbiIsCisJCQkJcEItPmkyZVBvbS5lLnBvcklEICk7CisJCW5wb3J0cyA9IDA7CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uOworCQlicmVhazsKKworCWNhc2UgUE9SX0lEX0lJXzQ6IC8qIEludGVsbGlQb3J0LUlJLCBJU0EtNCAoNHhSSjQ1KSAqLworCQlwcmludGsgKCBLRVJOX0lORk8gIklQMjogSVNBLTRcbiIgKTsKKwkJbnBvcnRzID0gNDsKKwkJYnJlYWs7CisKKwljYXNlIFBPUl9JRF9JSV84OiAvKiBJbnRlbGxpUG9ydC1JSSwgOC1wb3J0IHVzaW5nIHN0YW5kYXJkIGJyaWNrLiAqLworCQlwcmludGsgKCBLRVJOX0lORk8gIklQMjogSVNBLTggc3RkXG4iICk7CisJCW5wb3J0cyA9IDg7CisJCWJyZWFrOworCisJY2FzZSBQT1JfSURfSUlfOFI6IC8qIEludGVsbGlQb3J0LUlJLCA4LXBvcnQgdXNpbmcgUkoxMSdzIChubyBDVFMpICovCisJCXByaW50ayAoIEtFUk5fSU5GTyAiSVAyOiBJU0EtOCBSSjExXG4iICk7CisJCW5wb3J0cyA9IDg7CisJCWJyZWFrOworCisJY2FzZSBQT1JfSURfRklJRVg6IC8qIEludGVsbGlQb3J0IElJRVggKi8KKwl7CisJCWludCBwb3J0bnVtID0gSVAyX1BPUlRTX1BFUl9CT0FSRCAqIGJvYXJkbnVtOworCQlpbnQgICAgICAgICAgICBib3g7CisKKwkJZm9yKCBib3ggPSAwOyBib3ggPCBBQlNfTUFYX0JPWEVTOyArK2JveCApIHsKKwkJCWlmICggcEItPmkyZUNoYW5uZWxNYXBbYm94XSAhPSAwICkgeworCQkJCSsrbmJveGVzOworCQkJfQorCQkJZm9yKCBpID0gMDsgaSA8IEFCU19CSUdHRVNUX0JPWDsgKytpICkgeworCQkJCWlmICggcEItPmkyZUNoYW5uZWxNYXBbYm94XSAmIDE8PCBpICkgeworCQkJCQkrK25wb3J0czsKKwkJCQl9CisJCQl9CisJCX0KKwkJRGV2VGFibGVNZW1bYm9hcmRudW1dID0gcENoID0KKwkJCWttYWxsb2MoIHNpemVvZihpMkNoYW5TdHIpICogbnBvcnRzLCBHRlBfS0VSTkVMICk7CisJCWlmICggIXBDaCApIHsKKwkJCXByaW50ayAoIEtFUk5fRVJSICJJUDI6IChpMl9pbml0X2NoYW5uZWw6KSBPdXQgb2YgbWVtb3J5LlxuIik7CisJCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKKwkJfQorCQlpZiAoICFpMkluaXRDaGFubmVscyggcEIsIG5wb3J0cywgcENoICkgKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIklQMjogaTJJbml0Q2hhbm5lbHMgZmFpbGVkOiAlZFxuIixwQi0+aTJlRXJyb3IpOworCQkJa2ZyZWUgKCBwQ2ggKTsKKwkJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uOworCQl9CisJCXBCLT5pMmVDaGFubmVsUHRyID0gJkRldlRhYmxlW3BvcnRudW1dOworCQlwQi0+aTJlQ2hhbm5lbENudCA9IEFCU19NT1NUX1BPUlRTOworCisJCWZvciggYm94ID0gMDsgYm94IDwgQUJTX01BWF9CT1hFUzsgKytib3gsIHBvcnRudW0gKz0gQUJTX0JJR0dFU1RfQk9YICkgeworCQkJZm9yKCBpID0gMDsgaSA8IEFCU19CSUdHRVNUX0JPWDsgKytpICkgeworCQkJCWlmICggcEItPmkyZUNoYW5uZWxNYXBbYm94XSAmICgxIDw8IGkpICkgeworCQkJCQlEZXZUYWJsZVtwb3J0bnVtICsgaV0gPSBwQ2g7CisJCQkJCXBDaC0+cG9ydF9pbmRleCA9IHBvcnRudW0gKyBpOworCQkJCQlwQ2grKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiSVAyOiBFWCBib3g9JWQgcG9ydHM9JWQgJWQgYml0XG4iLAorCQkJbmJveGVzLCBucG9ydHMsIHBCLT5pMmVEYXRhV2lkdGgxNiA/IDE2IDogOCApOworCQl9CisJCWdvdG8gZXhfZXhpdDsKKwl9CisJRGV2VGFibGVNZW1bYm9hcmRudW1dID0gcENoID0KKwkJa21hbGxvYyAoIHNpemVvZiAoaTJDaGFuU3RyKSAqIG5wb3J0cywgR0ZQX0tFUk5FTCApOworCWlmICggIXBDaCApIHsKKwkJcHJpbnRrICggS0VSTl9FUlIgIklQMjogKGkyX2luaXRfY2hhbm5lbDopIE91dCBvZiBtZW1vcnkuXG4iKTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJfQorCXBCLT5pMmVDaGFubmVsUHRyID0gcENoOworCXBCLT5pMmVDaGFubmVsQ250ID0gbnBvcnRzOworCWlmICggIWkySW5pdENoYW5uZWxzKCBwQiwgbnBvcnRzLCBwQ2ggKSApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGkySW5pdENoYW5uZWxzIGZhaWxlZDogJWRcbiIscEItPmkyZUVycm9yKTsKKwkJa2ZyZWUgKCBwQ2ggKTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJfQorCXBCLT5pMmVDaGFubmVsUHRyID0gJkRldlRhYmxlW0lQMl9QT1JUU19QRVJfQk9BUkQgKiBib2FyZG51bV07CisKKwlmb3IoIGkgPSAwOyBpIDwgcEItPmkyZUNoYW5uZWxDbnQ7ICsraSApIHsKKwkJRGV2VGFibGVbSVAyX1BPUlRTX1BFUl9CT0FSRCAqIGJvYXJkbnVtICsgaV0gPSBwQ2g7CisJCXBDaC0+cG9ydF9pbmRleCA9IChJUDJfUE9SVFNfUEVSX0JPQVJEICogYm9hcmRudW0pICsgaTsKKwkJcENoKys7CisJfQorZXhfZXhpdDoKKwlJTklUX1dPUksoJnBCLT50cXVldWVfaW50ZXJydXB0LCAodm9pZCgqKSh2b2lkKikpIGlwMl9pbnRlcnJ1cHRfYmgsIHBCKTsKKwlyZXR1cm47CisKK2Vycl9yZWxlYXNlX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihpcDJjb25maWcuYWRkcltib2FyZG51bV0sIDgpOworZXJyX2luaXRpYWxpemU6CisJa2ZyZWUgKCBwQiApOworCWkyQm9hcmRQdHJUYWJsZVtib2FyZG51bV0gPSBOVUxMOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGZpbmRfZWlzYV9ib2FyZCAoIGludCBzdGFydF9zbG90ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBGaXJzdCBzbG90IHRvIGNoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgQWRkcmVzcyBvZiBFSVNBIEludGVsbGlQb3J0IElJIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYW4gRUlTQSBJbnRlbGxpUG9ydCBjb250cm9sbGVyLCBzdGFydGluZyAgICAgICAgKi8KKy8qIGZyb20gdGhlIHNwZWNpZmllZCBzbG90IG51bWJlci4gSWYgdGhlIG1vdGhlcmJvYXJkIGlzIG5vdCBpZGVudGlmaWVkIGFzIGFuICovCisvKiBFSVNBIG1vdGhlcmJvYXJkLCBvciBubyB2YWxpZCBib2FyZCBJRCBpcyBzZWxlY3RlZCBpdCByZXR1cm5zIDAuIE90aGVyd2lzZSAqLworLyogaXQgcmV0dXJucyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBjb250cm9sbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgX19pbml0CitmaW5kX2Vpc2FfYm9hcmQoIGludCBzdGFydF9zbG90ICkKK3sKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBpbnQgaWRtID0gMDsKKwl1bnNpZ25lZCBpbnQgaWRwID0gMDsKKwl1bnNpZ25lZCBpbnQgYmFzZSA9IDA7CisJdW5zaWduZWQgaW50IHZhbHVlOworCWludCBzZXR1cF9hZGRyZXNzOworCWludCBzZXR1cF9pcnE7CisJaW50IGlzbWluZSA9IDA7CisKKwkvKgorCSAqIEZpcnN0IGEgY2hlY2sgZm9yIGFuIEVJU0EgbW90aGVyYm9hcmQsIHdoaWNoIHdlIGRvIGJ5IGNvbXBhcmluZyB0aGUKKwkgKiBFSVNBIElEIHJlZ2lzdGVycyBmb3IgdGhlIHN5c3RlbSBib2FyZCBhbmQgdGhlIGZpcnN0IGNvdXBsZSBvZiBzbG90cy4KKwkgKiBObyBzbG90IElEIHNob3VsZCBtYXRjaCB0aGUgc3lzdGVtIGJvYXJkIElELCBidXQgb24gYW4gSVNBIG9yIFBDSQorCSAqIG1hY2hpbmUgdGhlIG9kZHMgYXJlIHRoYXQgYW4gZW1wdHkgYnVzIHdpbGwgcmV0dXJuIHNpbWlsYXIgdmFsdWVzIGZvcgorCSAqIGVhY2ggc2xvdC4KKwkgKi8KKwlpID0gMHgwYzgwOworCXZhbHVlID0gKGluYihpKSA8PCAyNCkgKyAoaW5iKGkrMSkgPDwgMTYpICsgKGluYihpKzIpIDw8IDgpICsgaW5iKGkrMyk7CisJZm9yKCBpID0gMHgxYzgwOyBpIDw9IDB4NGM4MDsgaSArPSAweDEwMDAgKSB7CisJCWogPSAoaW5iKGkpPDwyNCkrKGluYihpKzEpPDwxNikrKGluYihpKzIpPDw4KStpbmIoaSszKTsKKwkJaWYgKCB2YWx1ZSA9PSBqICkKKwkJCXJldHVybiAwOworCX0KKworCS8qCisJICogT0ssIHNvIHdlIGFyZSBpbmNsaW5lZCB0byBiZWxpZXZlIHRoYXQgdGhpcyBpcyBhbiBFSVNBIG1hY2hpbmUuIEZpbmQKKwkgKiBhbiBJbnRlbGxpUG9ydCBjb250cm9sbGVyLgorCSAqLworCWZvciggaSA9IHN0YXJ0X3Nsb3Q7IGkgPCAxNjsgaSsrICkgeworCQliYXNlID0gaSA8PCAxMjsKKwkJaWRtID0gKGluYihiYXNlICsgMHhjODApIDw8IDgpIHwgKGluYihiYXNlICsgMHhjODEpICYgMHhmZik7CisJCWlkcCA9IChpbmIoYmFzZSArIDB4YzgyKSA8PCA4KSB8IChpbmIoYmFzZSArIDB4YzgzKSAmIDB4ZmYpOworCQlpc21pbmUgPSAwOworCQlpZiAoIGlkbSA9PSAweDBlOGUgKSB7CisJCQlpZiAoIGlkcCA9PSAweDAyODEgfHwgaWRwID09IDB4MDIxOCApIHsKKwkJCQlpc21pbmUgPSAxOworCQkJfSBlbHNlIGlmICggaWRwID09IDB4MDI4MiB8fCBpZHAgPT0gMHgwMjgzICkgeworCQkJCWlzbWluZSA9IDM7CS8qIENhbiBkbyBlZGdlLXRyaWdnZXIgKi8KKwkJCX0KKwkJCWlmICggaXNtaW5lICkgeworCQkJCUVpc2Ffc2xvdCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKCAhaXNtaW5lICkKKwkJcmV0dXJuIDA7CisKKwkvKiBJdCdzIHNvbWUgc29ydCBvZiBFSVNBIGNhcmQsIGJ1dCBhdCB3aGF0IGFkZHJlc3MgaXMgaXQgY29uZmlndXJlZD8gKi8KKworCXNldHVwX2FkZHJlc3MgPSBiYXNlICsgMHhjODg7CisJdmFsdWUgPSBpbmIoYmFzZSArIDB4Yzg2KTsKKwlzZXR1cF9pcnEgPSAodmFsdWUgJiA4KSA/IFZhbGlkX0lycXNbdmFsdWUgJiA3XSA6IDA7CisKKwlpZiAoIChpc21pbmUgJiAyKSAmJiAhKHZhbHVlICYgMHgxMCkgKSB7CisJCWlzbWluZSA9IDE7CS8qIENvdWxkIGJlIGVkZ2luZywgYnV0IG5vdCAqLworCX0KKworCWlmICggRWlzYV9pcnEgPT0gMCApIHsKKwkJRWlzYV9pcnEgPSBzZXR1cF9pcnE7CisJfSBlbHNlIGlmICggRWlzYV9pcnEgIT0gc2V0dXBfaXJxICkgeworCQlwcmludGsgKCBLRVJOX0VSUiAiSVAyOiBFSVNBIGlycSBtaXNtYXRjaCBiZXR3ZWVuIEVJU0EgY29udHJvbGxlcnNcbiIgKTsKKwl9CisKKyNpZmRlZiBJUDJERUJVR19JTklUCitwcmludGsoS0VSTl9ERUJVRyAiQ29tcHV0b25lIEVJU0EgYm9hcmQgaW4gc2xvdCAlZCwgSS5ELiAweCV4JXgsIEFkZHJlc3MgMHgleCIsCisJICAgICAgIGJhc2UgPj4gMTIsIGlkbSwgaWRwLCBzZXR1cF9hZGRyZXNzKTsKKwlpZiAoIEVpc2FfaXJxICkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiLCBJbnRlcnJ1cHQgJWQgJXNcbiIsCisJCSAgICAgICBzZXR1cF9pcnEsIChpc21pbmUgJiAyKSA/ICIoZWRnZSkiIDogIihsZXZlbCkiKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRyAiLCAocG9sbGVkKVxuIik7CisJfQorI2VuZGlmCisJcmV0dXJuIHNldHVwX2FkZHJlc3M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBzZXRfaXJxKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogaW5kZXggdG8gYm9hcmQgaW4gYm9hcmQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIElSUSB0byB1c2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBTdWNjZXNzICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3NldF9pcnEoIGludCBib2FyZG51bSwgaW50IGJvYXJkSXJxICkKK3sKKwl1bnNpZ25lZCBjaGFyIHRlbXBDb21tYW5kWzE2XTsKKwlpMmVCb3JkU3RyUHRyIHBCID0gaTJCb2FyZFB0clRhYmxlW2JvYXJkbnVtXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBOb3RpZnkgdGhlIGJvYXJkcyB0aGV5IG1heSBnZW5lcmF0ZSBpbnRlcnJ1cHRzLiBUaGlzIGlzIGRvbmUgYnkKKwkgKiBzZW5kaW5nIGFuIGluLWxpbmUgY29tbWFuZCB0byBjaGFubmVsIDAgb24gZWFjaCBib2FyZC4gVGhpcyBpcyB3aHkKKwkgKiB0aGUgY2hhbm5lbHMgaGF2ZSB0byBiZSBkZWZpbmVkIGFscmVhZHkuIEZvciBlYWNoIGJvYXJkLCBpZiB0aGUKKwkgKiBpbnRlcnJ1cHQgaGFzIG5ldmVyIGJlZW4gZGVmaW5lZCwgd2UgbXVzdCBkbyBzbyBOT1csIGRpcmVjdGx5LCBzaW5jZQorCSAqIGJvYXJkIHdpbGwgbm90IHNlbmQgZmxvdyBjb250cm9sIG9yIGV2ZW4gZ2l2ZSBhbiBpbnRlcnJ1cHQgdW50aWwgdGhpcworCSAqIGlzIGRvbmUuICBJZiBwb2xsaW5nIHdlIG11c3Qgc2VuZCAwIGFzIHRoZSBpbnRlcnJ1cHQgcGFyYW1ldGVyLgorCSAqLworCisJLy8gV2Ugd2lsbCBnZXQgYW4gaW50ZXJydXB0IGhlcmUgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uCisKKwlpaURpc2FibGVNYWlsSXJxKHBCKTsKKworCS8qIFdlIGJ1aWxkIHVwIHRoZSBlbnRpcmUgcGFja2V0IGhlYWRlci4gKi8KKwlDSEFOTkVMX09GKHRlbXBDb21tYW5kKSA9IDA7CisJUFRZUEVfT0YodGVtcENvbW1hbmQpID0gUFRZUEVfSU5MSU5FOworCUNNRF9DT1VOVF9PRih0ZW1wQ29tbWFuZCkgPSAyOworCShDTURfT0YodGVtcENvbW1hbmQpKVswXSA9IENNRFZBTFVFX0lSUTsKKwkoQ01EX09GKHRlbXBDb21tYW5kKSlbMV0gPSBib2FyZElycTsKKwkvKgorCSAqIFdyaXRlIHRvIEZJRk87IGRvbid0IGJvdGhlciB0byBhZGp1c3QgZmlmbyBjYXBhY2l0eSBmb3IgdGhpcywgc2luY2UKKwkgKiBib2FyZCB3aWxsIHJlc3BvbmQgYWxtb3N0IGltbWVkaWF0ZWx5IGFmdGVyIFNlbmRNYWlsIGhpdC4KKwkgKi8KKwlXUklURV9MT0NLX0lSUVNBVkUoJnBCLT53cml0ZV9maWZvX3NwaW5sb2NrLGZsYWdzKTsKKwlpaVdyaXRlQnVmKHBCLCB0ZW1wQ29tbWFuZCwgNCk7CisJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBCLT53cml0ZV9maWZvX3NwaW5sb2NrLGZsYWdzKTsKKwlwQi0+aTJlVXNpbmdJcnEgPSBib2FyZElycTsKKwlwQi0+aTJlT3V0TWFpbFdhaXRpbmcgfD0gTUJfT1VUX1NUVUZGRUQ7CisKKwkvKiBOZWVkIHRvIHVwZGF0ZSBudW1iZXIgb2YgYm9hcmRzIGJlZm9yZSB5b3UgZW5hYmxlIG1haWxib3ggaW50ICovCisJKytpMm5Cb2FyZHM7CisKKwlDSEFOTkVMX09GKHRlbXBDb21tYW5kKSA9IDA7CisJUFRZUEVfT0YodGVtcENvbW1hbmQpID0gUFRZUEVfQllQQVNTOworCUNNRF9DT1VOVF9PRih0ZW1wQ29tbWFuZCkgPSA2OworCShDTURfT0YodGVtcENvbW1hbmQpKVswXSA9IDg4OwkvLyBTSUxPCisJKENNRF9PRih0ZW1wQ29tbWFuZCkpWzFdID0gNjQ7CS8vIGNoYXJzCisJKENNRF9PRih0ZW1wQ29tbWFuZCkpWzJdID0gMzI7CS8vIG1zCisKKwkoQ01EX09GKHRlbXBDb21tYW5kKSlbM10gPSAyODsJLy8gTUFYX0JMT0NLCisJKENNRF9PRih0ZW1wQ29tbWFuZCkpWzRdID0gNjQ7CS8vIGNoYXJzCisKKwkoQ01EX09GKHRlbXBDb21tYW5kKSlbNV0gPSA4NzsJLy8gSFdfVEVTVAorCVdSSVRFX0xPQ0tfSVJRU0FWRSgmcEItPndyaXRlX2ZpZm9fc3BpbmxvY2ssZmxhZ3MpOworCWlpV3JpdGVCdWYocEIsIHRlbXBDb21tYW5kLCA4KTsKKwlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcEItPndyaXRlX2ZpZm9fc3BpbmxvY2ssZmxhZ3MpOworCisJQ0hBTk5FTF9PRih0ZW1wQ29tbWFuZCkgPSAwOworCVBUWVBFX09GKHRlbXBDb21tYW5kKSA9IFBUWVBFX0JZUEFTUzsKKwlDTURfQ09VTlRfT0YodGVtcENvbW1hbmQpID0gMTsKKwkoQ01EX09GKHRlbXBDb21tYW5kKSlbMF0gPSA4NDsJLyogZ2V0IEJPWF9JRFMgKi8KKwlpaVdyaXRlQnVmKHBCLCB0ZW1wQ29tbWFuZCwgMyk7CisKKyNpZmRlZiBYWFgKKwkvLyBlbmFibGUgaGVhcnRiZWF0IGZvciB0ZXN0IHBvcnBvaXNlcworCUNIQU5ORUxfT0YodGVtcENvbW1hbmQpID0gMDsKKwlQVFlQRV9PRih0ZW1wQ29tbWFuZCkgPSBQVFlQRV9CWVBBU1M7CisJQ01EX0NPVU5UX09GKHRlbXBDb21tYW5kKSA9IDI7CisJKENNRF9PRih0ZW1wQ29tbWFuZCkpWzBdID0gNDQ7CS8qIGdldCBwaW5nICovCisJKENNRF9PRih0ZW1wQ29tbWFuZCkpWzFdID0gMjAwOwkvKiAyMDAgbXMgKi8KKwlXUklURV9MT0NLX0lSUVNBVkUoJnBCLT53cml0ZV9maWZvX3NwaW5sb2NrLGZsYWdzKTsKKwlpaVdyaXRlQnVmKHBCLCB0ZW1wQ29tbWFuZCwgNCk7CisJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBCLT53cml0ZV9maWZvX3NwaW5sb2NrLGZsYWdzKTsKKyNlbmRpZgorCisJaWlFbmFibGVNYWlsSXJxKHBCKTsKKwlpaVNlbmRQZW5kaW5nTWFpbChwQik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlcnJ1cHQgSGFuZGxlciBTZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSB2b2lkCitzZXJ2aWNlX2FsbF9ib2FyZHModm9pZCkKK3sKKwlpbnQgaTsKKwlpMmVCb3JkU3RyUHRyICBwQjsKKworCS8qIFNlcnZpY2UgZXZlcnkgYm9hcmQgb24gdGhlIGxpc3QgKi8KKwlmb3IoIGkgPSAwOyBpIDwgSVAyX01BWF9CT0FSRFM7ICsraSApIHsKKwkJcEIgPSBpMkJvYXJkUHRyVGFibGVbaV07CisJCWlmICggcEIgKSB7CisJCQlpMlNlcnZpY2VCb2FyZCggcEIgKTsKKwkJfQorCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX2ludGVycnVwdF9iaChwQikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IHBCIC0gcG9pbnRlciB0byB0aGUgYm9hcmQgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKglTZXJ2aWNlIHRoZSBib2FyZCBpbiBhIGJvdHRvbSBoYWxmIGludGVycnVwdCBoYW5kbGVyIGFuZCB0aGVuICAgICAgICAgKi8KKy8qCXJlZW5hYmxlIHRoZSBib2FyZCdzIGludGVycnVwdHMgaWYgaXQgaGFzIGFuIElSUSBudW1iZXIgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXAyX2ludGVycnVwdF9iaChpMmVCb3JkU3RyUHRyIHBCKQoreworLy8JcEIgYmV0dGVyIHdlbGwgYmUgc2V0IG9yIHdlIGhhdmUgYSBwcm9ibGVtISAgV2UgY2FuIG9ubHkgZ2V0CisvLwloZXJlIGZyb20gdGhlIElNTUVESUFURSBxdWV1ZS4gIEhlcmUsIHdlIHByb2Nlc3MgdGhlIGJvYXJkcy4KKy8vCUNoZWNraW5nIHBCIGRvZXNuJ3QgY29zdCBtdWNoIGFuZCBpdCBzYXZlcyB1cyBmcm9tIHRoZSBzYW5pdHkgY2hlY2tlcnMuCisKKwliaF9jb3VudGVyKys7IAorCisJaWYgKCBwQiApIHsKKwkJaTJTZXJ2aWNlQm9hcmQoIHBCICk7CisJCWlmKCBwQi0+aTJlVXNpbmdJcnEgKSB7CisvLwkJCVJlLWVuYWJsZSBoaXMgaW50ZXJydXB0cworCQkJaWlFbmFibGVNYWlsSXJxKHBCKTsKKwkJfQorCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykgICAgKi8KKy8qIFBhcmFtZXRlcnM6IGlycSAtIGludGVycnVwdCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBwb2ludGVyIHRvIG9wdGlvbmFsIGRldmljZSBJRCBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgcG9pbnRlciB0byByZWdpc3RlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKglPdXIgdGFzayBoZXJlIGlzIHNpbXBseSB0byBpZGVudGlmeSBlYWNoIGJvYXJkIHdoaWNoIG5lZWRzIHNlcnZpY2luZy4gKi8KKy8qCUlmIHdlIGFyZSBxdWV1aW5nIHRoZW4sIHF1ZXVlIGl0IHRvIGJlIHNlcnZpY2VkLCBhbmQgZGlzYWJsZSBpdHMgaXJxICAqLworLyoJbWFzayBvdGhlcndpc2UgcHJvY2VzcyB0aGUgYm9hcmQgZGlyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoJV2UgY291bGQgcXVldWUgYnkgSVJRIGJ1dCB0aGF0IGp1c3QgY29tcGxpY2F0ZXMgdGhpbmdzIG9uIGJvdGggZW5kcyAgICovCisvKgl3aXRoIHZlcnkgbGl0dGxlIGdhaW4gaW4gcGVyZm9ybWFuY2UgKGhvdyBtYW55IGluc3RydWN0aW9ucyBkb2VzICAgICAgKi8KKy8qCWl0IHRha2UgdG8gaXRlcmF0ZSBvbiB0aGUgaW1tZWRpYXRlIHF1ZXVlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlycXJldHVybl90CitpcDJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBpOworCWkyZUJvcmRTdHJQdHIgIHBCOworCWludCBoYW5kbGVkID0gMDsKKworCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfSU5UUiwgOTksIDEsIGlycSApOworCisJLyogU2VydmljZSBqdXN0IHRoZSBib2FyZHMgb24gdGhlIGxpc3QgdXNpbmcgdGhpcyBpcnEgKi8KKwlmb3IoIGkgPSAwOyBpIDwgaTJuQm9hcmRzOyArK2kgKSB7CisJCXBCID0gaTJCb2FyZFB0clRhYmxlW2ldOworCisvLwkJT25seSBwcm9jZXNzIHRob3NlIGJvYXJkcyB3aGljaCBtYXRjaCBvdXIgSVJRLgorLy8JCQlJUlEgPSAwIGZvciBwb2xsZWQgYm9hcmRzLCB3ZSB3b24ndCBwb2xsICJJUlEiIGJvYXJkcworCisJCWlmICggcEIgJiYgKHBCLT5pMmVVc2luZ0lycSA9PSBpcnEpICkgeworCQkJaGFuZGxlZCA9IDE7CisjaWZkZWYgVVNFX0lRSQorCisJCSAgICBpZiAoTk9fTUFJTF9IRVJFICE9ICggcEItPmkyZVN0YXJ0TWFpbCA9IGlpR2V0TWFpbChwQikpKSB7CisvLwkJCURpc2FibGUgaGlzIGludGVycnVwdCAod2lsbCBiZSBlbmFibGVkIHdoZW4gc2VydmljZWQpCisvLwkJCVRoaXMgaXMgbW9zdGx5IHRvIHByb3RlY3QgZnJvbSByZWVudHJhbmN5LgorCQkJaWlEaXNhYmxlTWFpbElycShwQik7CisKKy8vCQkJUGFyayB0aGUgYm9hcmQgb24gdGhlIGltbWVkaWF0ZSBxdWV1ZSBmb3IgcHJvY2Vzc2luZy4KKwkJCXNjaGVkdWxlX3dvcmsoJnBCLT50cXVldWVfaW50ZXJydXB0KTsKKworLy8JCQlNYWtlIHN1cmUgdGhlIGltbWVkaWF0ZSBxdWV1ZSBpcyBmbGFnZ2VkIHRvIGZpcmUuCisJCSAgICB9CisjZWxzZQorLy8JCVdlIGFyZSB1c2luZyBpbW1lZGlhdGUgc2VydmljaW5nIGhlcmUuICBUaGlzIHN1Y2tzIGFuZCBjYW4KKy8vCQljYXVzZSBhbGwgc29ydHMgb2YgaGF2b2Mgd2l0aCBwcHAgYW5kIG90aGVycy4gIFRoZSBmYWlsc2FmZQorLy8JCWNoZWNrIG9uIGlpU2VuZFBlbmRpbmdNYWlsIGNvdWxkIGFsc28gdGhyb3cgYSBoYWlyYmFsbC4KKwkJCWkyU2VydmljZUJvYXJkKCBwQiApOworI2VuZGlmIC8qIFVTRV9JUUkgKi8KKwkJfQorCX0KKworCSsraXJxX2NvdW50ZXI7CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX0lOVFIsIElUUkNfUkVUVVJOLCAwICk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfcG9sbCh1bnNpZ25lZCBsb25nIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIGxpYnJhcnkgcm91dGluZSBpMlNlcnZpY2VCb2FyZCBmb3IgZWFjaCBib2FyZCBpbiAgICovCisvKiB0aGUgYm9hcmQgdGFibGUuIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBpbnRlcnJ1cHQgcm91dGluZSB3aGVuIHBvbGxlZCAqLworLyogbW9kZSBpcyBzcGVjaWZpZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXAyX3BvbGwodW5zaWduZWQgbG9uZyBhcmcpCit7CisJaXAydHJhY2UgKElUUkNfTk9fUE9SVCwgSVRSQ19JTlRSLCAxMDAsIDAgKTsKKworCVRpbWVyT24gPSAwOyAvLyBpdCdzIHRoZSB0cnV0aCBidXQgbm90IGNoZWNrZWQgaW4gc2VydmljZQorCisJLy8gSnVzdCBwb2xsZWQgYm9hcmRzLCBJUlEgPSAwIHdpbGwgaGl0IGFsbCBub24taW50ZXJydXB0IGJvYXJkcy4KKwkvLyBJdCB3aWxsIE5PVCBwb2xsIGJvYXJkcyBoYW5kbGVkIGJ5IGhhcmQgaW50ZXJydXB0cy4KKwkvLyBUaGUgaXNzdWUgb2YgcXVldWVkIEJIIGludGVycnVwcyBpcyBoYW5kbGVkIGluIGlwMl9pbnRlcnJ1cHQoKS4KKwlpcDJfaW50ZXJydXB0KDAsIE5VTEwsIE5VTEwpOworCisJUG9sbFRpbWVyLmV4cGlyZXMgPSBQT0xMX1RJTUVPVVQ7CisJYWRkX3RpbWVyKCAmUG9sbFRpbWVyICk7CisJVGltZXJPbiA9IDE7CisKKwlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX0lOVFIsIElUUkNfUkVUVVJOLCAwICk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2lucHV0KHZvaWQgKnApCit7CisJaTJDaGFuU3RyUHRyIHBDaCA9IHA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlwMnRyYWNlKENIQU5OLCBJVFJDX0lOUFVULCAyMSwgMCApOworCisJLy8gRGF0YSBpbnB1dAorCWlmICggcENoLT5wVFRZICE9IE5VTEwgKSB7CisJCVJFQURfTE9DS19JUlFTQVZFKCZwQ2gtPklidWZfc3BpbmxvY2ssZmxhZ3MpCisJCWlmICghcENoLT50aHJvdHRsZWQgJiYgKHBDaC0+SWJ1Zl9zdHVmZiAhPSBwQ2gtPklidWZfc3RyaXApKSB7CisJCQlSRUFEX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPklidWZfc3BpbmxvY2ssZmxhZ3MpCisJCQlpMklucHV0KCBwQ2ggKTsKKwkJfSBlbHNlCisJCQlSRUFEX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPklidWZfc3BpbmxvY2ssZmxhZ3MpCisJfSBlbHNlIHsKKwkJaXAydHJhY2UoQ0hBTk4sIElUUkNfSU5QVVQsIDIyLCAwICk7CisKKwkJaTJJbnB1dEZsdXNoKCBwQ2ggKTsKKwl9Cit9CisKKy8vIGNvZGUgZHVwbGljYXRlZCBmcm9tIG5fdHR5IChsZGlzYykKK3N0YXRpYyBpbmxpbmUgdm9pZCAgaXNpZyhpbnQgc2lnLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgZmx1c2gpCit7CisJaWYgKHR0eS0+cGdycCA+IDApCisJCWtpbGxfcGcodHR5LT5wZ3JwLCBzaWcsIDEpOworCWlmIChmbHVzaCB8fCAhTF9OT0ZMU0godHR5KSkgeworCQlpZiAoIHR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyICkgIAorCQkJdHR5LT5sZGlzYy5mbHVzaF9idWZmZXIodHR5KTsKKwkJaTJJbnB1dEZsdXNoKCB0dHktPmRyaXZlcl9kYXRhICk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkb19zdGF0dXModm9pZCAqcCkKK3sKKwlpMkNoYW5TdHJQdHIgcENoID0gcDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gIGkyR2V0U3RhdHVzKCBwQ2gsIChJMl9CUkt8STJfUEFSfEkyX0ZSQXxJMl9PVlIpICk7CisKKwlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfU1RBVFVTLCAyMSwgMSwgc3RhdHVzICk7CisKKwlpZiAocENoLT5wVFRZICYmIChzdGF0dXMgJiAoSTJfQlJLfEkyX1BBUnxJMl9GUkF8STJfT1ZSKSkgKSB7CisJCWlmICggKHN0YXR1cyAmIEkyX0JSSykgKSB7CisJCQkvLyBjb2RlIGR1cGxpY2F0ZWQgZnJvbSBuX3R0eSAobGRpc2MpCisJCQlpZiAoSV9JR05CUksocENoLT5wVFRZKSkKKwkJCQlnb3RvIHNraXBfdGhpczsKKwkJCWlmIChJX0JSS0lOVChwQ2gtPnBUVFkpKSB7CisJCQkJaXNpZyhTSUdJTlQsIHBDaC0+cFRUWSwgMSk7CisJCQkJZ290byBza2lwX3RoaXM7CisJCQl9CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBDaC0+cFRUWS0+cmVhZF93YWl0KTsKKwkJfQorI2lmZGVmIE5FVkVSX0hBUFBFTlNfQVNfU0VUVVBfWFhYCisJLy8gYW5kIGNhbid0IHdvcmsgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZV9jaGFyCisJLy8gYXMgdGhlX2NoYXIgaXMgcmVwb3J0ZWQgb24gYSBzZXBhcmF0ZSBwYXRoCisJLy8gVGhlIGludGVsbGlnZW50IGJvYXJkIGRvZXMgdGhpcyBzdHVmZiBhcyBzZXR1cAorCXsKKwljaGFyIGJya2YgPSBUVFlfTk9STUFMOworCXVuc2lnbmVkIGNoYXIgYnJrYyA9ICdcMCc7CisJdW5zaWduZWQgY2hhciB0bXA7CisJCWlmICggKHN0YXR1cyAmIEkyX0JSSykgKSB7CisJCQlicmtmID0gVFRZX0JSRUFLOworCQkJYnJrYyA9ICdcMCc7CisJCX0gCisJCWVsc2UgaWYgKHN0YXR1cyAmIEkyX1BBUikgeworCQkJYnJrZiA9IFRUWV9QQVJJVFk7CisJCQlicmtjID0gdGhlX2NoYXI7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgSTJfRlJBKSB7CisJCQlicmtmID0gVFRZX0ZSQU1FOworCQkJYnJrYyA9IHRoZV9jaGFyOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIEkyX09WUikgeworCQkJYnJrZiA9IFRUWV9PVkVSUlVOOworCQkJYnJrYyA9IHRoZV9jaGFyOworCQl9CisJCXRtcCA9IHBDaC0+cFRUWS0+cmVhbF9yYXc7CisJCXBDaC0+cFRUWS0+cmVhbF9yYXcgPSAwOworCQlwQ2gtPnBUVFktPmxkaXNjLnJlY2VpdmVfYnVmKCBwQ2gtPnBUVFksICZicmtjLCAmYnJrZiwgMSApOworCQlwQ2gtPnBUVFktPnJlYWxfcmF3ID0gdG1wOworCX0KKyNlbmRpZiAvKiBORVZFUl9IQVBQRU5TX0FTX1NFVFVQX1hYWCAqLworCX0KK3NraXBfdGhpczoKKworCWlmICggc3RhdHVzICYgKEkyX0REQ0QgfCBJMl9ERFNSIHwgSTJfRENUUyB8IEkyX0RSSSkgKSB7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcENoLT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkJaWYgKCAocENoLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAmJiAoc3RhdHVzICYgSTJfRERDRCkgKSB7CisJCQlpZiAoIHN0YXR1cyAmIEkyX0RDRCApIHsKKwkJCQlpZiAoIHBDaC0+d29wZW4gKSB7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoICZwQ2gtPm9wZW5fd2FpdCApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBDaC0+cFRUWSAmJiAgKCEocENoLT5wVFRZLT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSkgKSB7CisJCQkJCXR0eV9oYW5ndXAoIHBDaC0+cFRUWSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19TVEFUVVMsIDI2LCAwICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgT3Blbi9DbG9zZS9Jb2N0bCBFbnRyeSBQb2ludCBTZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIG9wZW5fc2FuaXR5X2NoZWNrKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIFN1Y2Nlc3Mgb3IgZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFZlcmlmaWVzIHRoZSBzdHJ1Y3R1cmUgbWFnaWMgbnVtYmVycyBhbmQgY3Jvc3MgbGlua3MuICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIElQMkRFQlVHX09QRU4KK3N0YXRpYyB2b2lkIAorb3Blbl9zYW5pdHlfY2hlY2soIGkyQ2hhblN0clB0ciBwQ2gsIGkyZUJvcmRTdHJQdHIgcEJyZCApCit7CisJaWYgKCBwQnJkLT5pMmVWYWxpZCAhPSBJMkVfTUFHSUMgKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSVAyOiBpbnZhbGlkIGJvYXJkIHN0cnVjdHVyZVxuIiApOworCX0gZWxzZSBpZiAoIHBCcmQgIT0gcENoLT5wTXlCb3JkICkgeworCQlwcmludGsoS0VSTl9FUlIgIklQMjogYm9hcmQgc3RydWN0dXJlIHBvaW50ZXIgbWlzbWF0Y2ggKCVwKVxuIiwKKwkJCSBwQ2gtPnBNeUJvcmQgKTsKKwl9IGVsc2UgaWYgKCBwQnJkLT5pMmVDaGFubmVsQ250IDwgcENoLT5wb3J0X2luZGV4ICkgeworCQlwcmludGsoS0VSTl9FUlIgIklQMjogYmFkIGRldmljZSBpbmRleCAoJWQpXG4iLCBwQ2gtPnBvcnRfaW5kZXggKTsKKwl9IGVsc2UgaWYgKCYoKGkyQ2hhblN0clB0cilwQnJkLT5pMmVDaGFubmVsUHRyKVtwQ2gtPnBvcnRfaW5kZXhdICE9IHBDaCkgeworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIklQMjogYWxsIHBvaW50ZXJzIGNoZWNrIG91dCFcbiIgKTsKKwl9Cit9CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX29wZW4oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBQb2ludGVyIHRvIGZpbGUgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgU3VjY2VzcyBvciBmYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogKE1BTkRBVE9SWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQSBzdWNjZXNzZnVsIGRldmljZSBvcGVuIGhhcyB0byBydW4gYSBnYXVudGxldCBvZiBjaGVja3MgYmVmb3JlIGl0ICAgICAgICAgKi8KKy8qIGNvbXBsZXRlcy4gQWZ0ZXIgc29tZSBzYW5pdHkgY2hlY2tpbmcgYW5kIHBvaW50ZXIgc2V0dXAsIHRoZSBmdW5jdGlvbiAgICAgICovCisvKiBibG9ja3MgdW50aWwgYWxsIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZC4gSXQgdGhlbiBpbml0aWFsaXNlcyB0aGUgcG9ydCB0byAqLworLyogdGhlIGRlZmF1bHQgY2hhcmFjdGVyaXN0aWNzIGFuZCByZXR1cm5zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcDJfb3BlbiggUFRUWSB0dHksIHN0cnVjdCBmaWxlICpwRmlsZSApCit7CisJd2FpdF9xdWV1ZV90IHdhaXQ7CisJaW50IHJjID0gMDsKKwlpbnQgZG9fY2xvY2FsID0gMDsKKwlpMkNoYW5TdHJQdHIgIHBDaCA9IERldlRhYmxlW3R0eS0+aW5kZXhdOworCisJaXAydHJhY2UgKHR0eS0+aW5kZXgsIElUUkNfT1BFTiwgSVRSQ19FTlRFUiwgMCApOworCisJaWYgKCBwQ2ggPT0gTlVMTCApIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIFNldHVwIHBvaW50ZXIgbGlua3MgaW4gZGV2aWNlIGFuZCB0dHkgc3RydWN0dXJlcyAqLworCXBDaC0+cFRUWSA9IHR0eTsKKwl0dHktPmRyaXZlcl9kYXRhID0gcENoOworCisjaWZkZWYgSVAyREVCVUdfT1BFTgorCXByaW50ayhLRVJOX0RFQlVHIFwKKwkJCSJJUDI6b3Blbih0dHk9JXAscEZpbGU9JXApOmRldj0lcyxjaD0lZCxpZHg9JWRcbiIsCisJICAgICAgIHR0eSwgcEZpbGUsIHR0eS0+bmFtZSwgcENoLT5pbmZsLmhkLmkyc0NoYW5uZWwsIHBDaC0+cG9ydF9pbmRleCk7CisJb3Blbl9zYW5pdHlfY2hlY2sgKCBwQ2gsIHBDaC0+cE15Qm9yZCApOworI2VuZGlmCisKKwlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMywgQ01EX0RUUlVQLENNRF9SVFNVUCxDTURfRENEX1JFUCk7CisJcENoLT5kYXRhU2V0T3V0IHw9IChJMl9EVFIgfCBJMl9SVFMpOworCXNlcnZpY2VPdXRnb2luZ0ZpZm8oIHBDaC0+cE15Qm9yZCApOworCisJLyogQmxvY2sgaGVyZSB1bnRpbCB0aGUgcG9ydCBpcyByZWFkeSAocGVyIHNlcmlhbCBhbmQgaXN0YWxsaW9uKSAqLworCS8qCisJICogMS4gSWYgdGhlIHBvcnQgaXMgaW4gdGhlIG1pZGRsZSBvZiBjbG9zaW5nIHdhaXQgZm9yIHRoZSBjb21wbGV0aW9uCisJICogICAgYW5kIHRoZW4gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBlcnJvci4KKwkgKi8KKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CisJYWRkX3dhaXRfcXVldWUoJnBDaC0+Y2xvc2Vfd2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX0lOVEVSUlVQVElCTEUgKTsKKworCWlmICggdHR5X2h1bmdfdXBfcChwRmlsZSkgfHwgKCBwQ2gtPmZsYWdzICYgQVNZTkNfQ0xPU0lORyApKSB7CisJCWlmICggcENoLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcgKSB7CisJCQlzY2hlZHVsZSgpOworCQl9CisJCWlmICggdHR5X2h1bmdfdXBfcChwRmlsZSkgKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19SVU5OSU5HICk7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcENoLT5jbG9zZV93YWl0LCAmd2FpdCk7CisJCQlyZXR1cm4oIHBDaC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZICkgPyAtRUFHQUlOIDogLUVSRVNUQVJUU1lTOworCQl9CisJfQorCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX1JVTk5JTkcgKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcENoLT5jbG9zZV93YWl0LCAmd2FpdCk7CisKKwkvKgorCSAqIDMuIEhhbmRsZSBhIG5vbi1ibG9ja2luZyBvcGVuIG9mIGEgbm9ybWFsIHBvcnQuCisJICovCisJaWYgKCAocEZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fCAodHR5LT5mbGFncyAmICgxPDxUVFlfSU9fRVJST1IpICkpIHsKKwkJcENoLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlnb3RvIG5vYmxvY2s7CisJfQorCS8qCisJICogNC4gTm93IGxvb3Agd2FpdGluZyBmb3IgdGhlIHBvcnQgdG8gYmUgZnJlZSBhbmQgY2FycmllciBwcmVzZW50CisJICogICAgKGlmIHJlcXVpcmVkKS4KKwkgKi8KKwlpZiAoIHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCApCisJCWRvX2Nsb2NhbCA9IDE7CisKKyNpZmRlZiBJUDJERUJVR19PUEVOCisJcHJpbnRrKEtFUk5fREVCVUcgIk9wZW5CbG9jazogZG9fY2xvY2FsID0gJWRcbiIsIGRvX2Nsb2NhbCk7CisjZW5kaWYKKworCSsrcENoLT53b3BlbjsKKworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKKwlhZGRfd2FpdF9xdWV1ZSgmcENoLT5vcGVuX3dhaXQsICZ3YWl0KTsKKworCWZvcig7OykgeworCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMiwgQ01EX0RUUlVQLCBDTURfUlRTVVApOworCQlwQ2gtPmRhdGFTZXRPdXQgfD0gKEkyX0RUUiB8IEkyX1JUUyk7CisJCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX0lOVEVSUlVQVElCTEUgKTsKKwkJc2VydmljZU91dGdvaW5nRmlmbyggcENoLT5wTXlCb3JkICk7CisJCWlmICggdHR5X2h1bmdfdXBfcChwRmlsZSkgKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19SVU5OSU5HICk7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcENoLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJCXJldHVybiAoIHBDaC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZICkgPyAtRUJVU1kgOiAtRVJFU1RBUlRTWVM7CisJCX0KKwkJaWYgKCEocENoLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmIAorCQkJCShkb19jbG9jYWwgfHwgKHBDaC0+ZGF0YVNldEluICYgSTJfRENEKSApKSB7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgSVAyREVCVUdfT1BFTgorCQlwcmludGsoS0VSTl9ERUJVRyAiQVNZTkNfQ0xPU0lORyA9ICVzXG4iLAorCQkJKHBDaC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKT8iVHJ1ZSI6IkZhbHNlIik7CisJCXByaW50ayhLRVJOX0RFQlVHICJPcGVuQmxvY2s6IHdhaXRpbmcgZm9yIENEIG9yIHNpZ25hbFxuIik7CisjZW5kaWYKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX09QRU4sIDMsIDIsIDAsCisJCQkJKHBDaC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSApOworCQkvKiBjaGVjayBmb3Igc2lnbmFsICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmMgPSAoKCBwQ2gtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSApID8gLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisJCQlicmVhazsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19SVU5OSU5HICk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnBDaC0+b3Blbl93YWl0LCAmd2FpdCk7CisKKwktLXBDaC0+d29wZW47IC8vd2h5IGNvdW50PworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX09QRU4sIDQsIDAgKTsKKworCWlmIChyYyAhPSAwICkgeworCQlyZXR1cm4gcmM7CisJfQorCXBDaC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKworbm9ibG9jazoKKworCS8qIGZpcnN0IG9wZW4gLSBBc3NpZ24gdGVybWlvcyBzdHJ1Y3R1cmUgdG8gcG9ydCAqLworCWlmICggdHR5LT5jb3VudCA9PSAxICkgeworCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDAsIDIsIENNRF9DVFNGTF9EU0FCLCBDTURfUlRTRkxfRFNBQik7CisJCS8qIE5vdyB3ZSBtdXN0IHNlbmQgdGhlIHRlcm1pb3Mgc2V0dGluZ3MgdG8gdGhlIGxvYWR3YXJlICovCisJCXNldF9wYXJhbXMoIHBDaCwgTlVMTCApOworCX0KKworCS8qCisJICogTm93IHNldCBhbnkgaTJsaWIgb3B0aW9ucy4gVGhlc2UgbWF5IGdvIGF3YXkgaWYgdGhlIGkybGliIGNvZGUgZW5kcworCSAqIHVwIHJvbGxlZCBpbnRvIHRoZSBtYWlubGluZS4KKwkgKi8KKwlwQ2gtPmNoYW5uZWxPcHRpb25zIHw9IENPX05CTE9DS19XUklURTsKKworI2lmZGVmIElQMkRFQlVHX09QRU4KKwlwcmludGsgKEtFUk5fREVCVUcgIklQMjogb3BlbiBjb21wbGV0ZWRcbiIgKTsKKyNlbmRpZgorCXNlcnZpY2VPdXRnb2luZ0ZpZm8oIHBDaC0+cE15Qm9yZCApOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX09QRU4sIElUUkNfUkVUVVJOLCAwICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9jbG9zZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcDJfY2xvc2UoIFBUVFkgdHR5LCBzdHJ1Y3QgZmlsZSAqcEZpbGUgKQoreworCWkyQ2hhblN0clB0ciAgcENoID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICggIXBDaCApIHsKKwkJcmV0dXJuOworCX0KKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19DTE9TRSwgSVRSQ19FTlRFUiwgMCApOworCisjaWZkZWYgSVAyREVCVUdfT1BFTgorCXByaW50ayhLRVJOX0RFQlVHICJJUDI6Y2xvc2UgJXM6XG4iLHR0eS0+bmFtZSk7CisjZW5kaWYKKworCWlmICggdHR5X2h1bmdfdXBfcCAoIHBGaWxlICkgKSB7CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0NMT1NFLCAyLCAxLCAyICk7CisKKwkJcmV0dXJuOworCX0KKwlpZiAoIHR0eS0+Y291bnQgPiAxICkgeyAvKiBub3QgdGhlIGxhc3QgY2xvc2UgKi8KKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfQ0xPU0UsIDIsIDEsIDMgKTsKKworCQlyZXR1cm47CisJfQorCXBDaC0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsJLy8gbGFzdCBjbG9zZSBhY3R1YWxseQorCisJdHR5LT5jbG9zaW5nID0gMTsKKworCWlmIChwQ2gtPkNsb3NpbmdXYWl0VGltZSAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkgeworCQkvKgorCQkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgdHJhbnNtaXR0ZXIgaGFzIGNvbXBsZXRlbHkgZHJhaW5lZC4KKwkJICogVGhpcyB1c2VzIGFuIHRpbWVvdXQsIGFmdGVyIHdoaWNoIHRoZSBjbG9zZQorCQkgKiBjb21wbGV0ZXMuCisJCSAqLworCQlpcDJfd2FpdF91bnRpbF9zZW50KHR0eSwgcENoLT5DbG9zaW5nV2FpdFRpbWUgKTsKKwl9CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiBIZXJlIHdlIGZsdXNoIHRoZSBjaGFubmVsCisJICogaW5wdXQgYnVmZmVyIHdoaWNoIHdpbGwgYWxsb3cgdGhlIGJvYXJkIHRvIHNlbmQgdXAgbW9yZSBkYXRhLiBBbnkKKwkgKiBhZGRpdGlvbmFsIGlucHV0IGlzIHRvc3NlZCBhdCBpbnRlcnJ1cHQvcG9sbCB0aW1lLgorCSAqLworCWkySW5wdXRGbHVzaCggcENoICk7CisKKwkvKiBkaXNhYmxlIERTUyByZXBvcnRpbmcgKi8KKwlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgNCwKKwkJCQlDTURfRENEX05SRVAsIENNRF9DVFNfTlJFUCwgQ01EX0RTUl9OUkVQLCBDTURfUklfTlJFUCk7CisJaWYgKCAhdHR5IHx8ICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkgKSB7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAyLCBDTURfUlRTRE4sIENNRF9EVFJETik7CisJCXBDaC0+ZGF0YVNldE91dCAmPSB+KEkyX0RUUiB8IEkyX1JUUyk7CisJCWkyUXVldWVDb21tYW5kcyggUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX1BBVVNFKDI1KSk7CisJfQorCisJc2VydmljZU91dGdvaW5nRmlmbyAoIHBDaC0+cE15Qm9yZCApOworCisJaWYgKCB0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyICkgCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwlpZiAoIHR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyICkgIAorCQl0dHktPmxkaXNjLmZsdXNoX2J1ZmZlcih0dHkpOworCXR0eS0+Y2xvc2luZyA9IDA7CisJCisJcENoLT5wVFRZID0gTlVMTDsKKworCWlmIChwQ2gtPndvcGVuKSB7CisJCWlmIChwQ2gtPkNsb3NpbmdEZWxheSkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhwQ2gtPkNsb3NpbmdEZWxheSkpOworCQl9CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcENoLT5vcGVuX3dhaXQpOworCX0KKworCXBDaC0+ZmxhZ3MgJj1+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwQ2gtPmNsb3NlX3dhaXQpOworCisjaWZkZWYgSVAyREVCVUdfT1BFTgorCURCR19DTlQoImlwMl9jbG9zZTogYWZ0ZXIgd2FrZXVwcy0tIik7CisjZW5kaWYKKworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0NMT1NFLCBJVFJDX1JFVFVSTiwgMSwgMSApOworCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX2hhbmd1cCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXAyX2hhbmd1cCAoIFBUVFkgdHR5ICkKK3sKKwlpMkNoYW5TdHJQdHIgIHBDaCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiggIXBDaCApIHsKKwkJcmV0dXJuOworCX0KKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19IQU5HVVAsIElUUkNfRU5URVIsIDAgKTsKKworCWlwMl9mbHVzaF9idWZmZXIodHR5KTsKKworCS8qIGRpc2FibGUgRFNTIHJlcG9ydGluZyAqLworCisJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAwLCAxLCBDTURfRENEX05SRVApOworCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMCwgMiwgQ01EX0NUU0ZMX0RTQUIsIENNRF9SVFNGTF9EU0FCKTsKKwlpZiAoICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkgKSB7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9CWVBBU1MsIHBDaCwgMCwgMiwgQ01EX1JUU0ROLCBDTURfRFRSRE4pOworCQlwQ2gtPmRhdGFTZXRPdXQgJj0gfihJMl9EVFIgfCBJMl9SVFMpOworCQlpMlF1ZXVlQ29tbWFuZHMoIFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9QQVVTRSgyNSkpOworCX0KKwlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEsIDMsIAorCQkJCUNNRF9DVFNfTlJFUCwgQ01EX0RTUl9OUkVQLCBDTURfUklfTlJFUCk7CisJc2VydmljZU91dGdvaW5nRmlmbyAoIHBDaC0+cE15Qm9yZCApOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICggJnBDaC0+ZGVsdGFfbXNyX3dhaXQgKTsKKworCXBDaC0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcENoLT5wVFRZID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUgKCAmcENoLT5vcGVuX3dhaXQgKTsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19IQU5HVVAsIElUUkNfUkVUVVJOLCAwICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGV2aWNlIE91dHB1dCBTZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX3dyaXRlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBGbGFnIGRlbm90aW5nIGRhdGEgaXMgaW4gdXNlciAoMSkgb3Iga2VybmVsICgwKSBzcGFjZSAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIE51bWJlciBvZiBieXRlcyB0byB3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOdW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAoTUFOREFUT1JZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcDJfd3JpdGUoIFBUVFkgdHR5LCBpbnQgdXNlciwgY29uc3QgdW5zaWduZWQgY2hhciAqcERhdGEsIGludCBjb3VudCkKK3sKKwlpMkNoYW5TdHJQdHIgIHBDaCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IGJ5dGVzU2VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19XUklURSwgSVRSQ19FTlRFUiwgMiwgY291bnQsIC0xICk7CisKKwkvKiBGbHVzaCBvdXQgYW55IGJ1ZmZlcmVkIGRhdGEgbGVmdCBvdmVyIGZyb20gaXAyX3B1dGNoYXIoKSBjYWxscy4gKi8KKwlpcDJfZmx1c2hfY2hhcnMoIHR0eSApOworCisJLyogVGhpcyBpcyB0aGUgYWN0dWFsIG1vdmUgYml0LiBNYWtlIHN1cmUgaXQgZG9lcyB3aGF0IHdlIG5lZWQhISEhISAqLworCVdSSVRFX0xPQ0tfSVJRU0FWRSgmcENoLT5QYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwlieXRlc1NlbnQgPSBpMk91dHB1dCggcENoLCBwRGF0YSwgY291bnQsIHVzZXIgKTsKKwlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5QYnVmX3NwaW5sb2NrLGZsYWdzKTsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19XUklURSwgSVRSQ19SRVRVUk4sIDEsIGJ5dGVzU2VudCApOworCisJcmV0dXJuIGJ5dGVzU2VudCA+IDAgPyBieXRlc1NlbnQgOiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX3B1dGNoYXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBDaGFyYWN0ZXIgdG8gd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgTm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwMl9wdXRjaGFyKCBQVFRZIHR0eSwgdW5zaWduZWQgY2hhciBjaCApCit7CisJaTJDaGFuU3RyUHRyICBwQ2ggPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKy8vCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19QVVRDLCBJVFJDX0VOVEVSLCAxLCBjaCApOworCisJV1JJVEVfTE9DS19JUlFTQVZFKCZwQ2gtPlBidWZfc3BpbmxvY2ssZmxhZ3MpOworCXBDaC0+UGJ1ZltwQ2gtPlBidWZfc3R1ZmYrK10gPSBjaDsKKwlpZiAoIHBDaC0+UGJ1Zl9zdHVmZiA9PSBzaXplb2YgcENoLT5QYnVmICkgeworCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5QYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwkJaXAyX2ZsdXNoX2NoYXJzKCB0dHkgKTsKKwl9IGVsc2UKKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+UGJ1Zl9zcGlubG9jayxmbGFncyk7CisKKy8vCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19QVVRDLCBJVFJDX1JFVFVSTiwgMSwgY2ggKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9mbHVzaF9jaGFycygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgTm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXAyX2ZsdXNoX2NoYXJzKCBQVFRZIHR0eSApCit7CisJaW50ICAgc3RyaXA7CisJaTJDaGFuU3RyUHRyICBwQ2ggPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlXUklURV9MT0NLX0lSUVNBVkUoJnBDaC0+UGJ1Zl9zcGlubG9jayxmbGFncyk7CisJaWYgKCBwQ2gtPlBidWZfc3R1ZmYgKSB7CisKKy8vCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfUFVUQywgMTAsIDEsIHN0cmlwICk7CisKKwkJLy8KKwkJLy8gV2UgbWF5IG5lZWQgdG8gcmVzdGFydCBpMk91dHB1dCBpZiBpdCBkb2VzIG5vdCBmdWxsZmlsbCB0aGlzIHJlcXVlc3QKKwkJLy8KKwkJc3RyaXAgPSBpMk91dHB1dCggcENoLCBwQ2gtPlBidWYsIHBDaC0+UGJ1Zl9zdHVmZiwgMCApOworCQlpZiAoIHN0cmlwICE9IHBDaC0+UGJ1Zl9zdHVmZiApIHsKKwkJCW1lbW1vdmUoIHBDaC0+UGJ1ZiwgJnBDaC0+UGJ1ZltzdHJpcF0sIHBDaC0+UGJ1Zl9zdHVmZiAtIHN0cmlwICk7CisJCX0KKwkJcENoLT5QYnVmX3N0dWZmIC09IHN0cmlwOworCX0KKwlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5QYnVmX3NwaW5sb2NrLGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl93cml0ZV9yb29tKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgTnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhlIGRyaXZlciBjYW4gYWNjZXB0ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcDJfd3JpdGVfcm9vbSAoIFBUVFkgdHR5ICkKK3sKKwlpbnQgYnl0ZXNGcmVlOworCWkyQ2hhblN0clB0ciAgcENoID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJUkVBRF9MT0NLX0lSUVNBVkUoJnBDaC0+UGJ1Zl9zcGlubG9jayxmbGFncyk7CisJYnl0ZXNGcmVlID0gaTJPdXRwdXRGcmVlKCBwQ2ggKSAtIHBDaC0+UGJ1Zl9zdHVmZjsKKwlSRUFEX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPlBidWZfc3BpbmxvY2ssZmxhZ3MpOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX1dSSVRFLCAxMSwgMSwgYnl0ZXNGcmVlICk7CisKKwlyZXR1cm4gKChieXRlc0ZyZWUgPiAwKSA/IGJ5dGVzRnJlZSA6IDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX2NoYXJzX2luX2J1ZigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOdW1iZXIgb2YgYnl0ZXMgcXVldWVkIGZvciB0cmFuc21pc3Npb24gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcDJfY2hhcnNfaW5fYnVmICggUFRUWSB0dHkgKQoreworCWkyQ2hhblN0clB0ciAgcENoID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19XUklURSwgMTIsIDEsIHBDaC0+T2J1Zl9jaGFyX2NvdW50ICsgcENoLT5QYnVmX3N0dWZmICk7CisKKyNpZmRlZiBJUDJERUJVR19XUklURQorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAyOiBjaGFycyBpbiBidWZmZXIgPSAlZCAoJWQsJWQpXG4iLAorCQkJCSBwQ2gtPk9idWZfY2hhcl9jb3VudCArIHBDaC0+UGJ1Zl9zdHVmZiwKKwkJCQkgcENoLT5PYnVmX2NoYXJfY291bnQsIHBDaC0+UGJ1Zl9zdHVmZiApOworI2VuZGlmCisJUkVBRF9MT0NLX0lSUVNBVkUoJnBDaC0+T2J1Zl9zcGlubG9jayxmbGFncyk7CisJcmMgPSAgcENoLT5PYnVmX2NoYXJfY291bnQ7CisJUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5PYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwlSRUFEX0xPQ0tfSVJRU0FWRSgmcENoLT5QYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwlyYyArPSAgcENoLT5QYnVmX3N0dWZmOworCVJFQURfVU5MT0NLX0lSUVJFU1RPUkUoJnBDaC0+UGJ1Zl9zcGlubG9jayxmbGFncyk7CisJcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX2ZsdXNoX2J1ZmZlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gdHR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXAyX2ZsdXNoX2J1ZmZlciggUFRUWSB0dHkgKQoreworCWkyQ2hhblN0clB0ciAgcENoID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0ZMVVNILCBJVFJDX0VOVEVSLCAwICk7CisKKyNpZmRlZiBJUDJERUJVR19XUklURQorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAyOiBmbHVzaCBidWZmZXJcbiIgKTsKKyNlbmRpZgorCVdSSVRFX0xPQ0tfSVJRU0FWRSgmcENoLT5QYnVmX3NwaW5sb2NrLGZsYWdzKTsKKwlwQ2gtPlBidWZfc3R1ZmYgPSAwOworCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPlBidWZfc3BpbmxvY2ssZmxhZ3MpOworCWkyRmx1c2hPdXRwdXQoIHBDaCApOworCWlwMl9vd2FrZSh0dHkpOworCisJaXAydHJhY2UgKENIQU5OLCBJVFJDX0ZMVVNILCBJVFJDX1JFVFVSTiwgMCApOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfd2FpdF91bnRpbF9zZW50KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogUG9pbnRlciB0byB0dHkgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIFRpbWVvdXQgZm9yIHdhaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIG5vcm1hbCB0dHlfd2FpdF91bnRpbF9zZW50LCB3aGljaCAgICAqLworLyogb25seSB3YWl0cyBmb3IgdGhlIGRyaXZlciBidWZmZXJzIHRvIGJlIGVtcHR5IChvciByYXRoZXIsIHRob3NlIGJ1ZmZlcnMgICAgKi8KKy8qIHJlcG9ydGVkIGJ5IGNoYXJzX2luX2J1ZmZlcikgd2hpY2ggZG9lc24ndCB3b3JrIGZvciBJUDIgZHVlIHRvIHRoZSAgICAgICAgICovCisvKiBpbmRldGVybWluYXRlIG51bWJlciBvZiBieXRlcyBidWZmZXJlZCBvbiB0aGUgYm9hcmQuICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcDJfd2FpdF91bnRpbF9zZW50ICggUFRUWSB0dHksIGludCB0aW1lb3V0ICkKK3sKKwlpbnQgaSA9IGppZmZpZXM7CisJaTJDaGFuU3RyUHRyICBwQ2ggPSB0dHktPmRyaXZlcl9kYXRhOworCisJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIHRpbWVvdXQgKTsKKwlpZiAoIChpID0gdGltZW91dCAtIChqaWZmaWVzIC1pKSkgPiAwKQorCQlpMkRyYWluT3V0cHV0KCBwQ2gsIGkgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgSW5wdXQgU2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfdGhyb3R0bGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogUG9pbnRlciB0byB0dHkgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcDJfdGhyb3R0bGUgKCBQVFRZIHR0eSApCit7CisJaTJDaGFuU3RyUHRyICBwQ2ggPSB0dHktPmRyaXZlcl9kYXRhOworCisjaWZkZWYgSVAyREVCVUdfUkVBRAorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAyOiB0aHJvdHRsZVxuIiApOworI2VuZGlmCisJLyoKKwkgKiBTaWduYWwgdGhlIHBvbGwvaW50ZXJydXB0IGhhbmRsZXJzIG5vdCB0byBmb3J3YXJkIGluY29taW5nIGRhdGEgdG8KKwkgKiB0aGUgbGluZSBkaXNjaXBsaW5lLiBUaGlzIHdpbGwgY2F1c2UgdGhlIGJ1ZmZlcnMgdG8gZmlsbCB1cCBpbiB0aGUKKwkgKiBsaWJyYXJ5IGFuZCB0aHVzIGNhdXNlIHRoZSBsaWJyYXJ5IHJvdXRpbmVzIHRvIHNlbmQgdGhlIGZsb3cgY29udHJvbAorCSAqIHN0dWZmLgorCSAqLworCXBDaC0+dGhyb3R0bGVkID0gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl91bnRocm90dGxlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgTm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwMl91bnRocm90dGxlICggUFRUWSB0dHkgKQoreworCWkyQ2hhblN0clB0ciAgcENoID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgSVAyREVCVUdfUkVBRAorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAyOiB1bnRocm90dGxlXG4iICk7CisjZW5kaWYKKworCS8qIFBhc3MgaW5jb21pbmcgZGF0YSB1cCB0byB0aGUgbGluZSBkaXNjaXBsaW5lIGFnYWluLiAqLworCXBDaC0+dGhyb3R0bGVkID0gMDsKKyAJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAwLCAxLCBDTURfUkVTVU1FKTsKKwlzZXJ2aWNlT3V0Z29pbmdGaWZvKCBwQ2gtPnBNeUJvcmQgKTsKKwlSRUFEX0xPQ0tfSVJRU0FWRSgmcENoLT5JYnVmX3NwaW5sb2NrLGZsYWdzKQorCWlmICggcENoLT5JYnVmX3N0dWZmICE9IHBDaC0+SWJ1Zl9zdHJpcCApIHsKKwkJUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5JYnVmX3NwaW5sb2NrLGZsYWdzKQorI2lmZGVmIElQMkRFQlVHX1JFQUQKKwkJcHJpbnRrIChLRVJOX0RFQlVHICJpMklucHV0IGNhbGxlZCBmcm9tIHVudGhyb3R0bGVcbiIgKTsKKyNlbmRpZgorCQlpMklucHV0KCBwQ2ggKTsKKwl9IGVsc2UKKwkJUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSgmcENoLT5JYnVmX3NwaW5sb2NrLGZsYWdzKQorfQorCitzdGF0aWMgdm9pZAoraXAyX3N0YXJ0ICggUFRUWSB0dHkgKQoreworIAlpMkNoYW5TdHJQdHIgIHBDaCA9IERldlRhYmxlW3R0eS0+aW5kZXhdOworCisgCWkyUXVldWVDb21tYW5kcyhQVFlQRV9CWVBBU1MsIHBDaCwgMCwgMSwgQ01EX1JFU1VNRSk7CisgCWkyUXVldWVDb21tYW5kcyhQVFlQRV9CWVBBU1MsIHBDaCwgMTAwLCAxLCBDTURfVU5TVVNQRU5EKTsKKyAJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAxMDAsIDEsIENNRF9SRVNVTUUpOworI2lmZGVmIElQMkRFQlVHX1dSSVRFCisJcHJpbnRrIChLRVJOX0RFQlVHICJJUDI6IHN0YXJ0IHR4XG4iICk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2lwMl9zdG9wICggUFRUWSB0dHkgKQoreworIAlpMkNoYW5TdHJQdHIgIHBDaCA9IERldlRhYmxlW3R0eS0+aW5kZXhdOworCisgCWkyUXVldWVDb21tYW5kcyhQVFlQRV9CWVBBU1MsIHBDaCwgMTAwLCAxLCBDTURfU1VTUEVORCk7CisjaWZkZWYgSVAyREVCVUdfV1JJVEUKKwlwcmludGsgKEtFUk5fREVCVUcgIklQMjogc3RvcCB0eFxuIiApOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgSW9jdGwgU2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBpcDJfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaTJDaGFuU3RyUHRyIHBDaCA9IERldlRhYmxlW3R0eS0+aW5kZXhdOworCXdhaXRfcXVldWVfdCB3YWl0OworCisJaWYgKHBDaCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworLyoKKwlGSVhNRSAtIHRoZSBmb2xsb3dpbmcgY29kZSBpcyBjYXVzaW5nIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIGluCisJMi4zLjUxIGluIGFuIGludGVycnVwdCBoYW5kbGVyLiAgSXQncyBzdXBwb3NlIHRvIHByb21wdCB0aGUgYm9hcmQKKwl0byByZXR1cm4gdGhlIERTUyBzaWduYWwgc3RhdHVzIGltbWVkaWF0ZWx5LiAgV2h5IGRvZXNuJ3QgaXQgZG8KKwl0aGUgc2FtZSB0aGluZyBpbiAyLjIuMTQ/CisqLworCisvKglUaGlzIHRoaW5nIGlzIHN0aWxsIGJ1c3RlZCBpbiB0aGUgMS4yLjEyIGRyaXZlciBvbiAyLjQueAorCWFuZCBldmVuIGhvc2VzIHRoZSBzZXJpYWwgY29uc29sZSBzbyB0aGUgb29wcyBjYW4gYmUgdHJhcHBlZC4KKwkJL1wvXHw9bWh3PXxcL1wvCQkJKi8KKworI2lmZGVmCUVOQUJMRV9EU1NOT1cKKwlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfQllQQVNTLCBwQ2gsIDEwMCwgMSwgQ01EX0RTU19OT1cpOworCisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCWFkZF93YWl0X3F1ZXVlKCZwQ2gtPmRzc19ub3dfd2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX0lOVEVSUlVQVElCTEUgKTsKKworCXNlcnZpY2VPdXRnb2luZ0ZpZm8oIHBDaC0+cE15Qm9yZCApOworCisJc2NoZWR1bGUoKTsKKworCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX1JVTk5JTkcgKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcENoLT5kc3Nfbm93X3dhaXQsICZ3YWl0KTsKKworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlyZXR1cm4gLUVJTlRSOworCX0KKyNlbmRpZgorCXJldHVybiAgKChwQ2gtPmRhdGFTZXRPdXQgJiBJMl9SVFMpID8gVElPQ01fUlRTIDogMCkKKwkgICAgICB8ICgocENoLT5kYXRhU2V0T3V0ICYgSTJfRFRSKSA/IFRJT0NNX0RUUiA6IDApCisJICAgICAgfCAoKHBDaC0+ZGF0YVNldEluICAmIEkyX0RDRCkgPyBUSU9DTV9DQVIgOiAwKQorCSAgICAgIHwgKChwQ2gtPmRhdGFTZXRJbiAgJiBJMl9SSSkgID8gVElPQ01fUk5HIDogMCkKKwkgICAgICB8ICgocENoLT5kYXRhU2V0SW4gICYgSTJfRFNSKSA/IFRJT0NNX0RTUiA6IDApCisJICAgICAgfCAoKHBDaC0+ZGF0YVNldEluICAmIEkyX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKK30KKworc3RhdGljIGludCBpcDJfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJaTJDaGFuU3RyUHRyIHBDaCA9IERldlRhYmxlW3R0eS0+aW5kZXhdOworCisJaWYgKHBDaCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpIHsKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9SVFNVUCk7CisJCXBDaC0+ZGF0YVNldE91dCB8PSBJMl9SVFM7CisJfQorCWlmIChzZXQgJiBUSU9DTV9EVFIpIHsKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9EVFJVUCk7CisJCXBDaC0+ZGF0YVNldE91dCB8PSBJMl9EVFI7CisJfQorCisJaWYgKGNsZWFyICYgVElPQ01fUlRTKSB7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCBDTURfUlRTRE4pOworCQlwQ2gtPmRhdGFTZXRPdXQgJj0gfkkyX1JUUzsKKwl9CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKSB7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCBDTURfRFRSRE4pOworCQlwQ2gtPmRhdGFTZXRPdXQgJj0gfkkyX0RUUjsKKwl9CisJc2VydmljZU91dGdvaW5nRmlmbyggcENoLT5wTXlCb3JkICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfaW9jdGwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogUG9pbnRlciB0byB0dHkgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIFBvaW50ZXIgdG8gZmlsZSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBDb21tYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgQXJndW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIFN1Y2Nlc3Mgb3IgZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwMl9pb2N0bCAoIFBUVFkgdHR5LCBzdHJ1Y3QgZmlsZSAqcEZpbGUsIFVJTlQgY21kLCBVTE9ORyBhcmcgKQoreworCXdhaXRfcXVldWVfdCB3YWl0OworCWkyQ2hhblN0clB0ciBwQ2ggPSBEZXZUYWJsZVt0dHktPmluZGV4XTsKKwlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNwcmV2LCBjbm93OwkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLworCXN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IF9fdXNlciAqcF9jdXNlcjsKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoIHBDaCA9PSBOVUxMICkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfSU9DVEwsIElUUkNfRU5URVIsIDIsIGNtZCwgYXJnICk7CisKKyNpZmRlZiBJUDJERUJVR19JT0NUTAorCXByaW50ayhLRVJOX0RFQlVHICJJUDI6IGlvY3RsIGNtZCAoJXgpLCBhcmcgKCVseClcbiIsIGNtZCwgYXJnICk7CisjZW5kaWYKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFRJT0NHU0VSSUFMOgorCisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19JT0NUTCwgMiwgMSwgcmMgKTsKKworCQlyYyA9IGdldF9zZXJpYWxfaW5mbyhwQ2gsIGFyZ3ApOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJCWJyZWFrOworCisJY2FzZSBUSU9DU1NFUklBTDoKKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfSU9DVEwsIDMsIDEsIHJjICk7CisKKwkJcmMgPSBzZXRfc2VyaWFsX2luZm8ocENoLCBhcmdwKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQlicmVhazsKKworCWNhc2UgVENYT05DOgorCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQlzd2l0Y2ggKGFyZykgeworCQljYXNlIFRDT09GRjoKKwkJCS8vcmV0dXJuICAtRU5PSU9DVExDTUQ7CisJCQlicmVhazsKKwkJY2FzZSBUQ09PTjoKKwkJCS8vcmV0dXJuICAtRU5PSU9DVExDTUQ7CisJCQlicmVhazsKKwkJY2FzZSBUQ0lPRkY6CisJCQlpZiAoU1RPUF9DSEFSKHR0eSkgIT0gX19ESVNBQkxFRF9DSEFSKSB7CisJCQkJaTJRdWV1ZUNvbW1hbmRzKCBQVFlQRV9CWVBBU1MsIHBDaCwgMTAwLCAxLAorCQkJCQkJQ01EX1hNSVRfTk9XKFNUT1BfQ0hBUih0dHkpKSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUQ0lPTjoKKwkJCWlmIChTVEFSVF9DSEFSKHR0eSkgIT0gX19ESVNBQkxFRF9DSEFSKSB7CisJCQkJaTJRdWV1ZUNvbW1hbmRzKCBQVFlQRV9CWVBBU1MsIHBDaCwgMTAwLCAxLAorCQkJCQkJQ01EX1hNSVRfTk9XKFNUQVJUX0NIQVIodHR5KSkpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgVENTQlJLOiAgIC8qIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhayAqLworCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfSU9DVEwsIDQsIDEsIHJjICk7CisKKwkJaWYgKCFyYykgeworCQkJaXAyX3dhaXRfdW50aWxfc2VudCh0dHksMCk7CisJCQlpZiAoIWFyZykgeworCQkJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCBDTURfU0VORF9CUksoMjUwKSk7CisJCQkJc2VydmljZU91dGdvaW5nRmlmbyggcENoLT5wTXlCb3JkICk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFRDU0JSS1A6ICAvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpICovCisJCXJjID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19JT0NUTCwgNSwgMSwgcmMgKTsKKworCQlpZiAoIXJjKSB7CisJCQlpcDJfd2FpdF91bnRpbF9zZW50KHR0eSwwKTsKKwkJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLAorCQkJCUNNRF9TRU5EX0JSSyhhcmcgPyBhcmcqMTAwIDogMjUwKSk7CisJCQlzZXJ2aWNlT3V0Z29pbmdGaWZvICggcENoLT5wTXlCb3JkICk7CQorCQl9CisJCWJyZWFrOworCisJY2FzZSBUSU9DR1NPRlRDQVI6CisKKwkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0lPQ1RMLCA2LCAxLCByYyApOworCisJCQlyYyA9IHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJncCk7CisJCWlmIChyYykJCisJCQlyZXR1cm4gcmM7CisJYnJlYWs7CisKKwljYXNlIFRJT0NTU09GVENBUjoKKworCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfSU9DVEwsIDcsIDEsIHJjICk7CisKKwkJcmMgPSBnZXRfdXNlcihhcmcsKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApOworCQlpZiAocmMpIAorCQkJcmV0dXJuIHJjOworCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpCisJCQkJCSB8IChhcmcgPyBDTE9DQUwgOiAwKSk7CisJCQorCQlicmVhazsKKworCS8qCisJICogV2FpdCBmb3IgYW55IG9mIHRoZSA0IG1vZGVtIGlucHV0cyAoRENELFJJLERTUixDVFMpIHRvIGNoYW5nZSAtIG1hc2sKKwkgKiBwYXNzZWQgaW4gYXJnIGZvciBsaW5lcyBvZiBpbnRlcmVzdCAodXNlIHwnZWQgVElPQ01fUk5HL0RTUi9DRC9DVFMKKwkgKiBmb3IgbWFza2luZykuIENhbGxlciBzaG91bGQgdXNlIFRJT0NHSUNPVU5UIHRvIHNlZSB3aGljaCBvbmUgaXQgd2FzCisJICovCisJY2FzZSBUSU9DTUlXQUlUOgorCQlzYXZlX2ZsYWdzKGZsYWdzKTtjbGkoKTsKKwkJY3ByZXYgPSBwQ2gtPmljb3VudDsJIC8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfQllQQVNTLCBwQ2gsIDEwMCwgNCwgCisJCQkJCQlDTURfRENEX1JFUCwgQ01EX0NUU19SRVAsIENNRF9EU1JfUkVQLCBDTURfUklfUkVQKTsKKwkJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCQlhZGRfd2FpdF9xdWV1ZSgmcENoLT5kZWx0YV9tc3Jfd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19JTlRFUlJVUFRJQkxFICk7CisKKwkJc2VydmljZU91dGdvaW5nRmlmbyggcENoLT5wTXlCb3JkICk7CisJCWZvcig7OykgeworCQkJaXAydHJhY2UgKENIQU5OLCBJVFJDX0lPQ1RMLCAxMCwgMCApOworCisJCQlzY2hlZHVsZSgpOworCisJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfSU9DVEwsIDExLCAwICk7CisKKwkJCS8qIHNlZSBpZiBhIHNpZ25hbCBkaWQgaXQgKi8KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJjID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJc2F2ZV9mbGFncyhmbGFncyk7Y2xpKCk7CisJCQljbm93ID0gcENoLT5pY291bnQ7IC8qIGF0b21pYyBjb3B5ICovCisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCWlmIChjbm93LnJuZyA9PSBjcHJldi5ybmcgJiYgY25vdy5kc3IgPT0gY3ByZXYuZHNyICYmCisJCQkJY25vdy5kY2QgPT0gY3ByZXYuZGNkICYmIGNub3cuY3RzID09IGNwcmV2LmN0cykgeworCQkJCXJjID0gIC1FSU87IC8qIG5vIGNoYW5nZSA9PiByYyAqLworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCgoYXJnICYgVElPQ01fUk5HKSAmJiAoY25vdy5ybmcgIT0gY3ByZXYucm5nKSkgfHwKKwkJCSAgICAoKGFyZyAmIFRJT0NNX0RTUikgJiYgKGNub3cuZHNyICE9IGNwcmV2LmRzcikpIHx8CisJCQkgICAgKChhcmcgJiBUSU9DTV9DRCkgICYmIChjbm93LmRjZCAhPSBjcHJldi5kY2QpKSB8fAorCQkJICAgICgoYXJnICYgVElPQ01fQ1RTKSAmJiAoY25vdy5jdHMgIT0gY3ByZXYuY3RzKSkgKSB7CisJCQkJcmMgPSAgMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNwcmV2ID0gY25vdzsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19SVU5OSU5HICk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZwQ2gtPmRlbHRhX21zcl93YWl0LCAmd2FpdCk7CisKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAxMDAsIDMsIAorCQkJCQkJIENNRF9DVFNfTlJFUCwgQ01EX0RTUl9OUkVQLCBDTURfUklfTlJFUCk7CisJCWlmICggISAocENoLT5mbGFncwkmIEFTWU5DX0NIRUNLX0NEKSkgeworCQkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAxMDAsIDEsIENNRF9EQ0RfTlJFUCk7CisJCX0KKwkJc2VydmljZU91dGdvaW5nRmlmbyggcENoLT5wTXlCb3JkICk7CisJCXJldHVybiByYzsKKwkJYnJlYWs7CisKKwkvKgorCSAqIEdldCBjb3VudGVyIG9mIGlucHV0IHNlcmlhbCBsaW5lIGludGVycnVwdHMgKERDRCxSSSxEU1IsQ1RTKQorCSAqIFJldHVybjogd3JpdGUgY291bnRlcnMgdG8gdGhlIHVzZXIgcGFzc2VkIGNvdW50ZXIgc3RydWN0CisJICogTkI6IGJvdGggMS0+MCBhbmQgMC0+MSB0cmFuc2l0aW9ucyBhcmUgY291bnRlZCBleGNlcHQgZm9yIFJJIHdoZXJlCisJICogb25seSAwLT4xIGlzIGNvdW50ZWQuIFRoZSBjb250cm9sbGVyIGlzIHF1aXRlIGNhcGFibGUgb2YgY291bnRpbmcKKwkgKiBib3RoLCBidXQgdGhpcyBkb25lIHRvIHByZXNlcnZlIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgc3RhbmRhcmQKKwkgKiBzZXJpYWwgZHJpdmVyLgorCSAqLworCWNhc2UgVElPQ0dJQ09VTlQ6CisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19JT0NUTCwgMTEsIDEsIHJjICk7CisKKwkJc2F2ZV9mbGFncyhmbGFncyk7Y2xpKCk7CisJCWNub3cgPSBwQ2gtPmljb3VudDsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXBfY3VzZXIgPSBhcmdwOworCQlyYyA9IHB1dF91c2VyKGNub3cuY3RzLCAmcF9jdXNlci0+Y3RzKTsKKwkJcmMgPSBwdXRfdXNlcihjbm93LmRzciwgJnBfY3VzZXItPmRzcik7CisJCXJjID0gcHV0X3VzZXIoY25vdy5ybmcsICZwX2N1c2VyLT5ybmcpOworCQlyYyA9IHB1dF91c2VyKGNub3cuZGNkLCAmcF9jdXNlci0+ZGNkKTsKKwkJcmMgPSBwdXRfdXNlcihjbm93LnJ4LCAmcF9jdXNlci0+cngpOworCQlyYyA9IHB1dF91c2VyKGNub3cudHgsICZwX2N1c2VyLT50eCk7CisJCXJjID0gcHV0X3VzZXIoY25vdy5mcmFtZSwgJnBfY3VzZXItPmZyYW1lKTsKKwkJcmMgPSBwdXRfdXNlcihjbm93Lm92ZXJydW4sICZwX2N1c2VyLT5vdmVycnVuKTsKKwkJcmMgPSBwdXRfdXNlcihjbm93LnBhcml0eSwgJnBfY3VzZXItPnBhcml0eSk7CisJCXJjID0gcHV0X3VzZXIoY25vdy5icmssICZwX2N1c2VyLT5icmspOworCQlyYyA9IHB1dF91c2VyKGNub3cuYnVmX292ZXJydW4sICZwX2N1c2VyLT5idWZfb3ZlcnJ1bik7CisJCWJyZWFrOworCisJLyoKKwkgKiBUaGUgcmVzdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4gQnkgcmV0dXJuaW5nIC1FTk9JT0NUTENNRCB0aGV5CisJICogd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGxpbmUgZGlzY2lwbGluZSBmb3IgaXQgdG8gaGFuZGxlLgorCSAqLworCWNhc2UgVElPQ1NFUkNPTkZJRzoKKwljYXNlIFRJT0NTRVJHV0lMRDoKKwljYXNlIFRJT0NTRVJHRVRMU1I6CisJY2FzZSBUSU9DU0VSU1dJTEQ6CisJY2FzZSBUSU9DU0VSR1NUUlVDVDoKKwljYXNlIFRJT0NTRVJHRVRNVUxUSToKKwljYXNlIFRJT0NTRVJTRVRNVUxUSToKKworCWRlZmF1bHQ6CisJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19JT0NUTCwgMTIsIDAgKTsKKworCQlyYyA9ICAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKworCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19JT0NUTCwgSVRSQ19SRVRVUk4sIDAgKTsKKworCXJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIEdldFNlcmlhbEluZm8oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBvbGQgdGVybWlvcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgc2V0c2VyaWFsIGNvbW1hbmQsIGFuZCByZXF1aXJlcyBwcm9jZXNzaW5nIG9mIHRoZSAgICovCisvKiBzdGFuZGFyZCBMaW51eCBzZXJpYWwgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2dldF9zZXJpYWxfaW5mbyAoIGkyQ2hhblN0clB0ciBwQ2gsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqcmV0aW5mbyApCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOworCisJbWVtc2V0ICggJnRtcCwgMCwgc2l6ZW9mKHRtcCkgKTsKKwl0bXAudHlwZSA9IHBDaC0+cE15Qm9yZC0+Y2hhbm5lbEJ0eXBlcy5iaWRfdmFsdWVbKHBDaC0+cG9ydF9pbmRleCAmIChJUDJfUE9SVFNfUEVSX0JPQVJELTEpKS8xNl07CisJaWYgKEJJRF9IQVNfNjU0KHRtcC50eXBlKSkgeworCQl0bXAudHlwZSA9IFBPUlRfMTY2NTA7CisJfSBlbHNlIHsKKwkJdG1wLnR5cGUgPSBQT1JUX0NJUlJVUzsKKwl9CisJdG1wLmxpbmUgPSBwQ2gtPnBvcnRfaW5kZXg7CisJdG1wLnBvcnQgPSBwQ2gtPnBNeUJvcmQtPmkyZUJhc2U7CisJdG1wLmlycSAgPSBpcDJjb25maWcuaXJxW3BDaC0+cG9ydF9pbmRleC82NF07CisJdG1wLmZsYWdzID0gcENoLT5mbGFnczsKKwl0bXAuYmF1ZF9iYXNlID0gcENoLT5CYXVkQmFzZTsKKwl0bXAuY2xvc2VfZGVsYXkgPSBwQ2gtPkNsb3NpbmdEZWxheTsKKwl0bXAuY2xvc2luZ193YWl0ID0gcENoLT5DbG9zaW5nV2FpdFRpbWU7CisJdG1wLmN1c3RvbV9kaXZpc29yID0gcENoLT5CYXVkRGl2aXNvcjsKKyAgIAlyZXR1cm4gY29weV90b191c2VyKHJldGluZm8sJnRtcCxzaXplb2YoKnJldGluZm8pKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIFNldFNlcmlhbEluZm8oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBvbGQgdGVybWlvcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgc3VwcG9ydCBmb3Igc2V0c2VyaWFsLCB3aGljaCB1c2VzIHRoZSBUSU9DU1NFUklBTCAgICovCisvKiBpb2N0bC4gTm90IGFsbCBzZXRzZXJpYWwgcGFyYW1ldGVycyBhcmUgcmVsZXZhbnQuIElmIHRoZSB1c2VyIGF0dGVtcHRzIHRvICAqLworLyogY2hhbmdlIHRoZSBJUlEsIGFkZHJlc3Mgb3IgdHlwZSBvZiB0aGUgcG9ydCB0aGUgaW9jdGwgZmFpbHMuICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitzZXRfc2VyaWFsX2luZm8oIGkyQ2hhblN0clB0ciBwQ2gsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqbmV3X2luZm8gKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5zOworCWludCAgIG9sZF9mbGFncywgb2xkX2JhdWRfZGl2aXNvcjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbnMsIG5ld19pbmZvLCBzaXplb2YgKG5zKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyoKKwkgKiBXZSBkb24ndCBhbGxvdyBzZXRzZXJpYWwgdG8gY2hhbmdlIElSUSwgYm9hcmQgYWRkcmVzcywgdHlwZSBvciBiYXVkCisJICogYmFzZS4gQWxzbyBsaW5lIG51bmJlciBhcyBzdWNoIGlzIG1lYW5pbmdsZXNzIGJ1dCB3ZSB1c2UgaXQgZm9yIG91cgorCSAqIGFycmF5IGluZGV4IHNvIGl0IGlzIGZpeGVkIGFsc28uCisJICovCisJaWYgKCAobnMuaXJxICAJICAgICE9IGlwMmNvbmZpZy5pcnFbcENoLT5wb3J0X2luZGV4XSkKKwkgICAgfHwgKChpbnQpIG5zLnBvcnQgICAgICAhPSAoKGludCkgKHBDaC0+cE15Qm9yZC0+aTJlQmFzZSkpKQorCSAgICB8fCAobnMuYmF1ZF9iYXNlICE9IHBDaC0+QmF1ZEJhc2UpCisJICAgIHx8IChucy5saW5lICAgICAgIT0gcENoLT5wb3J0X2luZGV4KSApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb2xkX2ZsYWdzID0gcENoLT5mbGFnczsKKwlvbGRfYmF1ZF9kaXZpc29yID0gcENoLT5CYXVkRGl2aXNvcjsKKworCWlmICggIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgKSB7CisJCWlmICggKCBucy5jbG9zZV9kZWxheSAhPSBwQ2gtPkNsb3NpbmdEZWxheSApIHx8CisJCSAgICAoIChucy5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KKwkJICAgICAgKHBDaC0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spICkgKSB7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisKKwkJcENoLT5mbGFncyA9IChwQ2gtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CisJCQkgICAgICAgKG5zLmZsYWdzICYgQVNZTkNfVVNSX01BU0spOworCQlwQ2gtPkJhdWREaXZpc29yID0gbnMuY3VzdG9tX2Rpdmlzb3I7CisJfSBlbHNlIHsKKwkJcENoLT5mbGFncyA9IChwQ2gtPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CisJCQkgICAgICAgKG5zLmZsYWdzICYgQVNZTkNfRkxBR1MpOworCQlwQ2gtPkJhdWREaXZpc29yID0gbnMuY3VzdG9tX2Rpdmlzb3I7CisJCXBDaC0+Q2xvc2luZ0RlbGF5ID0gbnMuY2xvc2VfZGVsYXkgKiBIWi8xMDA7CisJCXBDaC0+Q2xvc2luZ1dhaXRUaW1lID0gbnMuY2xvc2luZ193YWl0ICogSFovMTAwOworCX0KKworCWlmICggKCAob2xkX2ZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9IChwQ2gtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spICkKKwkgICAgfHwgKG9sZF9iYXVkX2Rpdmlzb3IgIT0gcENoLT5CYXVkRGl2aXNvcikgKSB7CisJCS8vIEludmFsaWRhdGUgc3BlZWQgYW5kIHJlc2V0IHBhcmFtZXRlcnMKKwkJc2V0X3BhcmFtcyggcENoLCBOVUxMICk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfc2V0X3Rlcm1pb3MoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogUG9pbnRlciB0byB0dHkgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIFBvaW50ZXIgdG8gb2xkIHRlcm1pb3Mgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXAyX3NldF90ZXJtaW9zKCBQVFRZIHR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zICkKK3sKKwlpMkNoYW5TdHJQdHIgcENoID0gKGkyQ2hhblN0clB0cil0dHktPmRyaXZlcl9kYXRhOworCisjaWZkZWYgSVAyREVCVUdfSU9DVEwKKwlwcmludGsgKEtFUk5fREVCVUcgIklQMjogc2V0IHRlcm1pb3MgJXBcbiIsIG9sZF90ZXJtaW9zICk7CisjZW5kaWYKKworCXNldF9wYXJhbXMoIHBDaCwgb2xkX3Rlcm1pb3MgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9zZXRfbGluZV9kaXNjaXBsaW5lKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgTm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogIERvZXMgbm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwMl9zZXRfbGluZV9kaXNjaXBsaW5lICggUFRUWSB0dHkgKQoreworI2lmZGVmIElQMkRFQlVHX0lPQ1RMCisJcHJpbnRrIChLRVJOX0RFQlVHICJJUDI6IHNldCBsaW5lIGRpc2NpcGxpbmVcbiIgKTsKKyNlbmRpZgorCisJaXAydHJhY2UgKCgoaTJDaGFuU3RyUHRyKXR0eS0+ZHJpdmVyX2RhdGEpLT5wb3J0X2luZGV4LCBJVFJDX0lPQ1RMLCAxNiwgMCApOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBTZXRMaW5lIENoYXJhY3RlcmlzdGljcygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogUG9pbnRlciB0byBjaGFubmVsIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gdXBkYXRlIHRoZSBjaGFubmVsIHN0cnVjdHVyZSB3aXRoIHRoZSBuZXcgbGluZSAgICovCisvKiBjaGFyYWN0ZXJpc3RpY3MsIGFuZCBzZW5kIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kcyB0byB0aGUgYm9hcmQgd2hlbiB0aGV5ICAqLworLyogY2hhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorc2V0X3BhcmFtcyggaTJDaGFuU3RyUHRyIHBDaCwgc3RydWN0IHRlcm1pb3MgKm9fdGlvcyApCit7CisJdGNmbGFnX3QgY2ZsYWcsIGlmbGFnLCBsZmxhZzsKKwljaGFyIHN0b3BfY2hhciwgc3RhcnRfY2hhcjsKKwlzdHJ1Y3QgdGVybWlvcyBkdW1teTsKKworCWxmbGFnID0gcENoLT5wVFRZLT50ZXJtaW9zLT5jX2xmbGFnOworCWNmbGFnID0gcENoLT5wVFRZLT50ZXJtaW9zLT5jX2NmbGFnOworCWlmbGFnID0gcENoLT5wVFRZLT50ZXJtaW9zLT5jX2lmbGFnOworCisJaWYgKG9fdGlvcyA9PSBOVUxMKSB7CisJCWR1bW15LmNfbGZsYWcgPSB+bGZsYWc7CisJCWR1bW15LmNfY2ZsYWcgPSB+Y2ZsYWc7CisJCWR1bW15LmNfaWZsYWcgPSB+aWZsYWc7CisJCW9fdGlvcyA9ICZkdW1teTsKKwl9CisKKwl7CisJCXN3aXRjaCAoIGNmbGFnICYgQ0JBVUQgKSB7CisJCWNhc2UgQjA6CisJCQlpMlF1ZXVlQ29tbWFuZHMoIFBUWVBFX0JZUEFTUywgcENoLCAxMDAsIDIsIENNRF9SVFNETiwgQ01EX0RUUkROKTsKKwkJCXBDaC0+ZGF0YVNldE91dCAmPSB+KEkyX0RUUiB8IEkyX1JUUyk7CisJCQlpMlF1ZXVlQ29tbWFuZHMoIFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9QQVVTRSgyNSkpOworCQkJcENoLT5wVFRZLT50ZXJtaW9zLT5jX2NmbGFnIHw9IChDQkFVRCAmIG9fdGlvcy0+Y19jZmxhZyk7CisJCQlnb3RvIHNlcnZpY2VfaXQ7CisJCQlicmVhazsKKwkJY2FzZSBCMzg0MDA6CisJCQkvKgorCQkJICogVGhpcyBpcyB0aGUgc3BlZWQgdGhhdCBpcyBvdmVybG9hZGVkIHdpdGggYWxsIHRoZSBvdGhlciBoaWdoCisJCQkgKiBzcGVlZHMsIGRlcGVuZGluZyB1cG9uIHRoZSBmbGFnIHNldHRpbmdzLgorCQkJICovCisJCQlpZiAoICggcENoLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLICkgPT0gQVNZTkNfU1BEX0hJICkgeworCQkJCXBDaC0+c3BlZWQgPSBDQlJfNTc2MDA7CisJCQl9IGVsc2UgaWYgKCAocENoLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJICkgeworCQkJCXBDaC0+c3BlZWQgPSBDQlJfMTE1MjAwOworCQkJfSBlbHNlIGlmICggKHBDaC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QgKSB7CisJCQkJcENoLT5zcGVlZCA9IENCUl9DMTsKKwkJCX0gZWxzZSB7CisJCQkJcENoLT5zcGVlZCA9IENCUl8zODQwMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEI1MDogICAgICBwQ2gtPnNwZWVkID0gQ0JSXzUwOyAgICAgIGJyZWFrOworCQljYXNlIEI3NTogICAgICBwQ2gtPnNwZWVkID0gQ0JSXzc1OyAgICAgIGJyZWFrOworCQljYXNlIEIxMTA6ICAgICBwQ2gtPnNwZWVkID0gQ0JSXzExMDsgICAgIGJyZWFrOworCQljYXNlIEIxMzQ6ICAgICBwQ2gtPnNwZWVkID0gQ0JSXzEzNDsgICAgIGJyZWFrOworCQljYXNlIEIxNTA6ICAgICBwQ2gtPnNwZWVkID0gQ0JSXzE1MDsgICAgIGJyZWFrOworCQljYXNlIEIyMDA6ICAgICBwQ2gtPnNwZWVkID0gQ0JSXzIwMDsgICAgIGJyZWFrOworCQljYXNlIEIzMDA6ICAgICBwQ2gtPnNwZWVkID0gQ0JSXzMwMDsgICAgIGJyZWFrOworCQljYXNlIEI2MDA6ICAgICBwQ2gtPnNwZWVkID0gQ0JSXzYwMDsgICAgIGJyZWFrOworCQljYXNlIEIxMjAwOiAgICBwQ2gtPnNwZWVkID0gQ0JSXzEyMDA7ICAgIGJyZWFrOworCQljYXNlIEIxODAwOiAgICBwQ2gtPnNwZWVkID0gQ0JSXzE4MDA7ICAgIGJyZWFrOworCQljYXNlIEIyNDAwOiAgICBwQ2gtPnNwZWVkID0gQ0JSXzI0MDA7ICAgIGJyZWFrOworCQljYXNlIEI0ODAwOiAgICBwQ2gtPnNwZWVkID0gQ0JSXzQ4MDA7ICAgIGJyZWFrOworCQljYXNlIEI5NjAwOiAgICBwQ2gtPnNwZWVkID0gQ0JSXzk2MDA7ICAgIGJyZWFrOworCQljYXNlIEIxOTIwMDogICBwQ2gtPnNwZWVkID0gQ0JSXzE5MjAwOyAgIGJyZWFrOworCQljYXNlIEI1NzYwMDogICBwQ2gtPnNwZWVkID0gQ0JSXzU3NjAwOyAgIGJyZWFrOworCQljYXNlIEIxMTUyMDA6ICBwQ2gtPnNwZWVkID0gQ0JSXzExNTIwMDsgIGJyZWFrOworCQljYXNlIEIxNTM2MDA6ICBwQ2gtPnNwZWVkID0gQ0JSXzE1MzYwMDsgIGJyZWFrOworCQljYXNlIEIyMzA0MDA6ICBwQ2gtPnNwZWVkID0gQ0JSXzIzMDQwMDsgIGJyZWFrOworCQljYXNlIEIzMDcyMDA6ICBwQ2gtPnNwZWVkID0gQ0JSXzMwNzIwMDsgIGJyZWFrOworCQljYXNlIEI0NjA4MDA6ICBwQ2gtPnNwZWVkID0gQ0JSXzQ2MDgwMDsgIGJyZWFrOworCQljYXNlIEI5MjE2MDA6ICBwQ2gtPnNwZWVkID0gQ0JSXzkyMTYwMDsgIGJyZWFrOworCQlkZWZhdWx0OiAgICAgICBwQ2gtPnNwZWVkID0gQ0JSXzk2MDA7ICAgIGJyZWFrOworCQl9CisJCWlmICggcENoLT5zcGVlZCA9PSBDQlJfQzEgKSB7CisJCQkvLyBQcm9jZXNzIHRoZSBjdXN0b20gc3BlZWQgcGFyYW1ldGVycy4KKwkJCWludCBicHMgPSBwQ2gtPkJhdWRCYXNlIC8gcENoLT5CYXVkRGl2aXNvcjsKKwkJCWlmICggYnBzID09IDkyMTYwMCApIHsKKwkJCQlwQ2gtPnNwZWVkID0gQ0JSXzkyMTYwMDsKKwkJCX0gZWxzZSB7CisJCQkJYnBzID0gYnBzLzEwOworCQkJCWkyUXVldWVDb21tYW5kcyggUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX0JBVURfREVGMShicHMpICk7CisJCQl9CisJCX0KKwkJaTJRdWV1ZUNvbW1hbmRzKCBQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCBDTURfU0VUQkFVRChwQ2gtPnNwZWVkKSk7CisJCQorCQlpMlF1ZXVlQ29tbWFuZHMgKCBQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAyLCBDTURfRFRSVVAsIENNRF9SVFNVUCk7CisJCXBDaC0+ZGF0YVNldE91dCB8PSAoSTJfRFRSIHwgSTJfUlRTKTsKKwl9CisJaWYgKCAoQ1NUT1BCICYgY2ZsYWcpIF4gKENTVE9QQiAmIG9fdGlvcy0+Y19jZmxhZykpIAorCXsKKwkJaTJRdWV1ZUNvbW1hbmRzICggUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgCisJCQlDTURfU0VUU1RPUCggKCBjZmxhZyAmIENTVE9QQiApID8gQ1NUXzIgOiBDU1RfMSkpOworCX0KKwlpZiAoKChQQVJFTkJ8UEFST0REKSAmIGNmbGFnKSBeICgoUEFSRU5CfFBBUk9ERCkgJiBvX3Rpb3MtPmNfY2ZsYWcpKSAKKwl7CisJCWkyUXVldWVDb21tYW5kcyAoIFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsCisJCQlDTURfU0VUUEFSKCAKKwkJCQkoY2ZsYWcgJiBQQVJFTkIgPyAgKGNmbGFnICYgUEFST0REID8gQ1NQX09EIDogQ1NQX0VWKSA6IENTUF9OUCkKKwkJCSkKKwkJKTsKKwl9CisJLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KKwlpZiAoIChDU0laRSAmIGNmbGFnKV4oQ1NJWkUgJiBvX3Rpb3MtPmNfY2ZsYWcpKSAKKwl7CisJCWludCBkYXRhc2l6ZTsKKwkJc3dpdGNoICggY2ZsYWcgJiBDU0laRSApIHsKKwkJY2FzZSBDUzU6IGRhdGFzaXplID0gQ1NaXzU7IGJyZWFrOworCQljYXNlIENTNjogZGF0YXNpemUgPSBDU1pfNjsgYnJlYWs7CisJCWNhc2UgQ1M3OiBkYXRhc2l6ZSA9IENTWl83OyBicmVhazsKKwkJY2FzZSBDUzg6IGRhdGFzaXplID0gQ1NaXzg7IGJyZWFrOworCQlkZWZhdWx0OiAgZGF0YXNpemUgPSBDU1pfNTsgYnJlYWs7CS8qIGFzIHBlciBzZXJpYWwuYyAqLworCQl9CisJCWkyUXVldWVDb21tYW5kcyAoIFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9TRVRCSVRTKGRhdGFzaXplKSApOworCX0KKwkvKiBQcm9jZXNzIENUUyBmbG93IGNvbnRyb2wgZmxhZyBzZXR0aW5nICovCisJaWYgKCAoY2ZsYWcgJiBDUlRTQ1RTKSApIHsKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsCisJCQkJCQkyLCBDTURfQ1RTRkxfRU5BQiwgQ01EX1JUU0ZMX0VOQUIpOworCX0gZWxzZSB7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLAorCQkJCQkJMiwgQ01EX0NUU0ZMX0RTQUIsIENNRF9SVFNGTF9EU0FCKTsKKwl9CisJLy8KKwkvLyBQcm9jZXNzIFhPTi9YT0ZGIGZsb3cgY29udHJvbCBmbGFncyBzZXR0aW5ncworCS8vCisJc3RvcF9jaGFyID0gU1RPUF9DSEFSKHBDaC0+cFRUWSk7CisJc3RhcnRfY2hhciA9IFNUQVJUX0NIQVIocENoLT5wVFRZKTsKKworCS8vLy8vLy8vLy8vLyBjYW4ndCBiZSBcMDAwCisJaWYgKHN0b3BfY2hhciA9PSBfX0RJU0FCTEVEX0NIQVIgKSAKKwl7CisJCXN0b3BfY2hhciA9IH5fX0RJU0FCTEVEX0NIQVI7IAorCX0KKwlpZiAoc3RhcnRfY2hhciA9PSBfX0RJU0FCTEVEX0NIQVIgKSAKKwl7CisJCXN0YXJ0X2NoYXIgPSB+X19ESVNBQkxFRF9DSEFSOworCX0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlmICggb190aW9zLT5jX2NjW1ZTVEFSVF0gIT0gc3RhcnRfY2hhciApIAorCXsKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAxMDAsIDEsIENNRF9ERUZfSVhPTihzdGFydF9jaGFyKSk7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCBDTURfREVGX09YT04oc3RhcnRfY2hhcikpOworCX0KKwlpZiAoIG9fdGlvcy0+Y19jY1tWU1RPUF0gIT0gc3RvcF9jaGFyICkgCisJeworCQkgaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAxMDAsIDEsIENNRF9ERUZfSVhPRkYoc3RvcF9jaGFyKSk7CisJCSBpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX0RFRl9PWE9GRihzdG9wX2NoYXIpKTsKKwl9CisJaWYgKHN0b3BfY2hhciA9PSBfX0RJU0FCTEVEX0NIQVIgKSAKKwl7CisJCXN0b3BfY2hhciA9IH5fX0RJU0FCTEVEX0NIQVI7ICAvL1RFU1QxMjMKKwkJZ290byBub194b2ZmOworCX0KKwlpZiAoKGlmbGFnICYgKElYT0ZGKSleKG9fdGlvcy0+Y19pZmxhZyAmIChJWE9GRikpKSAKKwl7CisJCWlmICggaWZsYWcgJiBJWE9GRiApIHsJLy8gRW5hYmxlIFhPRkYgb3V0cHV0IGZsb3cgY29udHJvbAorCQkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9PWE9OX09QVChDT1hfWE9OKSk7CisJCX0gZWxzZSB7CS8vIERpc2FibGUgWE9GRiBvdXRwdXQgZmxvdyBjb250cm9sCitub194b2ZmOgorCQkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9PWE9OX09QVChDT1hfTk9ORSkpOworCQl9CisJfQorCWlmIChzdGFydF9jaGFyID09IF9fRElTQUJMRURfQ0hBUiApIAorCXsKKwkJZ290byBub194b247CisJfQorCWlmICgoaWZsYWcgJiAoSVhPTnxJWEFOWSkpIF4gKG9fdGlvcy0+Y19pZmxhZyAmIChJWE9OfElYQU5ZKSkpIAorCXsKKwkJaWYgKCBpZmxhZyAmIElYT04gKSB7CisJCQlpZiAoIGlmbGFnICYgSVhBTlkgKSB7IC8vIEVuYWJsZSBYT04vWEFOWSBvdXRwdXQgZmxvdyBjb250cm9sCisJCQkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9JWE9OX09QVChDSVhfWEFOWSkpOworCQkJfSBlbHNlIHsgLy8gRW5hYmxlIFhPTiBvdXRwdXQgZmxvdyBjb250cm9sCisJCQkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9JWE9OX09QVChDSVhfWE9OKSk7CisJCQl9CisJCX0gZWxzZSB7IC8vIERpc2FibGUgWE9OIG91dHB1dCBmbG93IGNvbnRyb2wKK25vX3hvbjoKKwkJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCBDTURfSVhPTl9PUFQoQ0lYX05PTkUpKTsKKwkJfQorCX0KKwlpZiAoIChpZmxhZyAmIElTVFJJUCkgXiAoIG9fdGlvcy0+Y19pZmxhZyAmIChJU1RSSVApKSApIAorCXsKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIAorCQkJCUNNRF9JU1RSSVBfT1BUKChpZmxhZyAmIElTVFJJUCA/IDEgOiAwKSkpOworCX0KKwlpZiAoIChpZmxhZyAmIElOUENLKSBeICggb190aW9zLT5jX2lmbGFnICYgKElOUENLKSkgKSAKKwl7CisJCWkyUXVldWVDb21tYW5kcyhQVFlQRV9JTkxJTkUsIHBDaCwgMTAwLCAxLCAKKwkJCQlDTURfUEFSQ0hLKChpZmxhZyAmIElOUENLKSA/IENQS19FTkFCIDogQ1BLX0RTQUIpKTsKKwl9CisKKwlpZiAoIChpZmxhZyAmIChJR05CUkt8UEFSTVJLfEJSS0lOVHxJR05QQVIpKSAKKwkJCV4JKCBvX3Rpb3MtPmNfaWZsYWcgJiAoSUdOQlJLfFBBUk1SS3xCUktJTlR8SUdOUEFSKSkgKSAKKwl7CisJCWNoYXIgYnJrcnB0ID0gMDsKKwkJY2hhciBwYXJycHQgPSAwOworCisJCWlmICggaWZsYWcgJiBJR05CUksgKSB7IC8qIElnbm9yZSBicmVha3MgYWx0b2dldGhlciAqLworCQkJLyogSWdub3JlIGJyZWFrcyBhbHRvZ2V0aGVyICovCisJCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX0JSS19OUkVQKTsKKwkJfSBlbHNlIHsKKwkJCWlmICggaWZsYWcgJiBCUktJTlQgKSB7CisJCQkJaWYgKCBpZmxhZyAmIFBBUk1SSyApIHsKKwkJCQkJYnJrcnB0ID0gMHgwYTsJLy8gZXhjZXB0aW9uIGFuIGlubGluZSB0cmlwbGUKKwkJCQl9IGVsc2UgeworCQkJCQlicmtycHQgPSAweDFhOwkvLyBleGNlcHRpb24gYW5kIE5VTEwKKwkJCQl9CisJCQkJYnJrcnB0IHw9IDB4MDQ7CS8vIGZsdXNoIGlucHV0CisJCQl9IGVsc2UgeworCQkJCWlmICggaWZsYWcgJiBQQVJNUksgKSB7CisJCQkJCWJya3JwdCA9IDB4MGI7CS8vUE9TSVggdHJpcGxlIFwwMzc3IFwwIFwwCisJCQkJfSBlbHNlIHsKKwkJCQkJYnJrcnB0ID0gMHgwMTsJLy8gTnVsbCBvbmx5CisJCQkJfQorCQkJfQorCQkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9CUktfUkVQKGJya3JwdCkpOworCQl9IAorCisJCWlmIChpZmxhZyAmIElHTlBBUikgeworCQkJcGFycnB0ID0gMHgyMDsKKwkJCQkJCQkJCQkJCQkvKiB3b3VsZCBiZSAyIGZvciBub3QgY2lycnVzIGJ1ZyAqLworCQkJCQkJCQkJCQkJCS8qIHdvdWxkIGJlIDB4MjAgY2VwdCBmb3IgY2lycnVzIGJ1ZyAqLworCQl9IGVsc2UgeworCQkJaWYgKCBpZmxhZyAmIFBBUk1SSyApIHsKKwkJCQkvKgorCQkJCSAqIFJlcGxhY2UgZXJyb3IgY2hhcmFjdGVycyB3aXRoIDMtYnl0ZSBzZXF1ZW5jZSAoXDAzNzcsXDAsY2hhcikKKwkJCQkgKi8KKwkJCQlwYXJycHQgPSAweDA0IDsKKwkJCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX0lTVFJJUF9PUFQoKGNoYXIpMCkpOworCQkJfSBlbHNlIHsKKwkJCQlwYXJycHQgPSAweDAzOworCQkJfSAKKwkJfQorCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX1NFVF9FUlJPUihwYXJycHQpKTsKKwl9CisJaWYgKGNmbGFnICYgQ0xPQ0FMKSB7CisJCS8vIFN0YXR1cyByZXBvcnRpbmcgZmFpbHMgZm9yIERDRCBpZiB0aGlzIGlzIG9mZgorCQlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfSU5MSU5FLCBwQ2gsIDEwMCwgMSwgQ01EX0RDRF9OUkVQKTsKKwkJcENoLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJfSBlbHNlIHsKKwkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0lOTElORSwgcENoLCAxMDAsIDEsIENNRF9EQ0RfUkVQKTsKKwkJcENoLT5mbGFncwl8PSBBU1lOQ19DSEVDS19DRDsKKwl9CisKKyNpZmRlZiBYWFgKK2RvX2ZsYWdzX3RoaW5nOgkvLyBUaGlzIGlzIGEgdGVzdCwgd2UgZG9uJ3QgZG8gdGhlIGZsYWdzIHRoaW5nCisJCisJaWYgKCAoY2ZsYWcgJiBDUlRTQ1RTKSApIHsKKwkJY2ZsYWcgfD0gMDE0MDAwMDAwMDAwOworCX0KKwlpMlF1ZXVlQ29tbWFuZHMoUFRZUEVfQllQQVNTLCBwQ2gsIDEwMCwgMSwgCisJCQkJQ01EX1VOSVhfRkxBR1MoaWZsYWcsY2ZsYWcsbGZsYWcpKTsKKyNlbmRpZgorCQkKK3NlcnZpY2VfaXQ6CisJaTJEcmFpbk91dHB1dCggcENoLCAxMDAgKTsJCQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSVBMIERldmljZSBTZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfaXBsX3JlYWQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IFBvaW50ZXIgdG8gZGV2aWNlIGlub2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBQb2ludGVyIHRvIGZpbGUgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIE51bWJlciBvZiBieXRlcyB0byByZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiAgICBTdWNjZXNzIG9yIGZhaWx1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgIFVnbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyAKK3NzaXplX3QKK2lwMl9pcGxfcmVhZChzdHJ1Y3QgZmlsZSAqcEZpbGUsIGNoYXIgX191c2VyICpwRGF0YSwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZiApCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKHBGaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaW50IHJjID0gMDsKKworI2lmZGVmIElQMkRFQlVHX0lQTAorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAySVBMOiByZWFkICVwLCAlZCBieXRlc1xuIiwgcERhdGEsIGNvdW50ICk7CisjZW5kaWYKKworCXN3aXRjaCggbWlub3IgKSB7CisJY2FzZSAwOgkgICAgLy8gSVBMIGRldmljZQorCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgMToJICAgIC8vIFN0YXR1cyBkdW1wCisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSAyOgkgICAgLy8gUGluZyBkZXZpY2UKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIDM6CSAgICAvLyBUcmFjZSBkZXZpY2UKKwkJcmMgPSBEdW1wVHJhY2VCdWZmZXIgKCBwRGF0YSwgY291bnQgKTsKKwkJYnJlYWs7CisJY2FzZSA0OgkgICAgLy8gVHJhY2UgZGV2aWNlCisJCXJjID0gRHVtcEZpZm9CdWZmZXIgKCBwRGF0YSwgY291bnQgKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PREVWOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitEdW1wRmlmb0J1ZmZlciAoIGNoYXIgX191c2VyICpwRGF0YSwgaW50IGNvdW50ICkKK3sKKyNpZmRlZiBERUJVR19GSUZPCisJaW50IHJjOworCXJjID0gY29weV90b191c2VyKHBEYXRhLCBEQkdCdWYsIGNvdW50KTsKKworCXByaW50ayhLRVJOX0RFQlVHICJMYXN0IGluZGV4ICVkXG4iLCBJICk7CisKKwlyZXR1cm4gY291bnQ7CisjZW5kaWYJLyogREVCVUdfRklGTyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitEdW1wVHJhY2VCdWZmZXIgKCBjaGFyIF9fdXNlciAqcERhdGEsIGludCBjb3VudCApCit7CisjaWZkZWYgSVAyREVCVUdfVFJBQ0UKKwlpbnQgcmM7CisJaW50IGR1bXBjb3VudDsKKwlpbnQgY2h1bms7CisJaW50ICpwSW5kZXggPSAoaW50IF9fdXNlciAqKXBEYXRhOworCisJaWYgKCBjb3VudCA8IChzaXplb2YoaW50KSAqIDYpICkgeworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmMgPSBwdXRfdXNlcih0cmFjZXdyYXAsIHBJbmRleCApOworCXJjID0gcHV0X3VzZXIoVFJBQ0VNQVgsICsrcEluZGV4ICk7CisJcmMgPSBwdXRfdXNlcih0cmFjZXN0cmlwLCArK3BJbmRleCApOworCXJjID0gcHV0X3VzZXIodHJhY2VzdHVmZiwgKytwSW5kZXggKTsKKwlwRGF0YSArPSBzaXplb2YoaW50KSAqIDY7CisJY291bnQgLT0gc2l6ZW9mKGludCkgKiA2OworCisJZHVtcGNvdW50ID0gdHJhY2VzdHVmZiAtIHRyYWNlc3RyaXA7CisJaWYgKCBkdW1wY291bnQgPCAwICkgeworCQlkdW1wY291bnQgKz0gVFJBQ0VNQVg7CisJfQorCWlmICggZHVtcGNvdW50ID4gY291bnQgKSB7CisJCWR1bXBjb3VudCA9IGNvdW50OworCX0KKwljaHVuayA9IFRSQUNFTUFYIC0gdHJhY2VzdHJpcDsKKwlpZiAoIGR1bXBjb3VudCA+IGNodW5rICkgeworCQlyYyA9IGNvcHlfdG9fdXNlcihwRGF0YSwgJnRyYWNlYnVmW3RyYWNlc3RyaXBdLAorCQkJICAgICAgY2h1bmsgKiBzaXplb2YodHJhY2VidWZbMF0pICk7CisJCXBEYXRhICs9IGNodW5rICogc2l6ZW9mKHRyYWNlYnVmWzBdKTsKKwkJdHJhY2VzdHJpcCA9IDA7CisJCWNodW5rID0gZHVtcGNvdW50IC0gY2h1bms7CisJfSBlbHNlIHsKKwkJY2h1bmsgPSBkdW1wY291bnQ7CisJfQorCXJjID0gY29weV90b191c2VyKHBEYXRhLCAmdHJhY2VidWZbdHJhY2VzdHJpcF0sCisJCSAgICAgIGNodW5rICogc2l6ZW9mKHRyYWNlYnVmWzBdKSApOworCXRyYWNlc3RyaXAgKz0gY2h1bms7CisJdHJhY2V3cmFwID0gMDsKKworCXJjID0gcHV0X3VzZXIodHJhY2VzdHJpcCwgKytwSW5kZXggKTsKKwlyYyA9IHB1dF91c2VyKHRyYWNlc3R1ZmYsICsrcEluZGV4ICk7CisKKwlyZXR1cm4gZHVtcGNvdW50OworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb246ICAgaXAyX2lwbF93cml0ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgU3VjY2VzcyBvciBmYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHNzaXplX3QKK2lwMl9pcGxfd3JpdGUoc3RydWN0IGZpbGUgKnBGaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqcERhdGEsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpCit7CisjaWZkZWYgSVAyREVCVUdfSVBMCisJcHJpbnRrIChLRVJOX0RFQlVHICJJUDJJUEw6IHdyaXRlICVwLCAlZCBieXRlc1xuIiwgcERhdGEsIGNvdW50ICk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9pcGxfaW9jdGwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGRldmljZSBpbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIENvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBBcmd1bWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgU3VjY2VzcyBvciBmYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXAyX2lwbF9pb2N0bCAoIHN0cnVjdCBpbm9kZSAqcElub2RlLCBzdHJ1Y3QgZmlsZSAqcEZpbGUsIFVJTlQgY21kLCBVTE9ORyBhcmcgKQoreworCXVuc2lnbmVkIGludCBpcGxtaW5vciA9IGltaW5vcihwSW5vZGUpOworCWludCByYyA9IDA7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJVUxPTkcgX191c2VyICpwSW5kZXggPSBhcmdwOworCWkyZUJvcmRTdHJQdHIgcEIgPSBpMkJvYXJkUHRyVGFibGVbaXBsbWlub3IgLyA0XTsKKwlpMkNoYW5TdHJQdHIgcENoOworCisjaWZkZWYgSVAyREVCVUdfSVBMCisJcHJpbnRrIChLRVJOX0RFQlVHICJJUDJJUEw6IGlvY3RsIGNtZCAlZCwgYXJnICVsZFxuIiwgY21kLCBhcmcgKTsKKyNlbmRpZgorCisJc3dpdGNoICggaXBsbWlub3IgKSB7CisJY2FzZSAwOgkgICAgLy8gSVBMIGRldmljZQorCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgMToJICAgIC8vIFN0YXR1cyBkdW1wCisJY2FzZSA1OgorCWNhc2UgOToKKwljYXNlIDEzOgorCQlzd2l0Y2ggKCBjbWQgKSB7CisJCWNhc2UgNjQ6CS8qIERyaXZlciAtIGlwMnN0YXQgKi8KKwkJCXJjID0gcHV0X3VzZXIoaXAyX3R0eV9kcml2ZXItPnJlZmNvdW50LCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihpcnFfY291bnRlciwgcEluZGV4KysgICk7CisJCQlyYyA9IHB1dF91c2VyKGJoX2NvdW50ZXIsIHBJbmRleCsrICApOworCQkJYnJlYWs7CisKKwkJY2FzZSA2NToJLyogQm9hcmQgIC0gaXAyc3RhdCAqLworCQkJaWYgKCBwQiApIHsKKwkJCQlyYyA9IGNvcHlfdG9fdXNlcihhcmdwLCBwQiwgc2l6ZW9mKGkyZUJvcmRTdHIpKTsKKwkJCQlyYyA9IHB1dF91c2VyKElOQihwQi0+aTJlU3RhdHVzKSwKKwkJCQkJKFVMT05HIF9fdXNlciAqKShhcmcgKyAoVUxPTkcpKCZwQi0+aTJlU3RhdHVzKSAtIChVTE9ORylwQiApICk7CisJCQl9IGVsc2UgeworCQkJCXJjID0gLUVOT0RFVjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoY21kIDwgSVAyX01BWF9QT1JUUykgeworCQkJCXBDaCA9IERldlRhYmxlW2NtZF07CisJCQkJaWYgKCBwQ2ggKQorCQkJCXsKKwkJCQkJcmMgPSBjb3B5X3RvX3VzZXIoYXJncCwgcENoLCBzaXplb2YoaTJDaGFuU3RyKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmMgPSAtRU5PREVWOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSAyOgkgICAgLy8gUGluZyBkZXZpY2UKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIDM6CSAgICAvLyBUcmFjZSBkZXZpY2UKKwkJaWYgKCBjbWQgPT0gMSApIHsKKwkJCXJjID0gcHV0X3VzZXIoaWlTZW5kUGVuZGluZ01haWwsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkySW5pdENoYW5uZWxzLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihpMlF1ZXVlTmVlZHMsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyUXVldWVDb21tYW5kcywgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaTJHZXRTdGF0dXMsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkySW5wdXQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkySW5wdXRGbHVzaCwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaTJPdXRwdXQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyRmx1c2hPdXRwdXQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyRHJhaW5XYWtldXAsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyRHJhaW5PdXRwdXQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyT3V0cHV0RnJlZSwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaTJTdHJpcEZpZm8sIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyU3R1ZmZGaWZvQnlwYXNzLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihpMlN0dWZmRmlmb0Zsb3csIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGkyU3R1ZmZGaWZvSW5saW5lLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihpMlNlcnZpY2VCb2FyZCwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoc2VydmljZU91dGdvaW5nRmlmbywgcEluZGV4KysgKTsKKwkJCS8vIHJjID0gcHV0X3VzZXIoaXAyX2luaXQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9pbml0X2JvYXJkLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihmaW5kX2Vpc2FfYm9hcmQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKHNldF9pcnEsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9pbnRlcnJ1cHQsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9wb2xsLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihzZXJ2aWNlX2FsbF9ib2FyZHMsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGRvX2lucHV0LCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihkb19zdGF0dXMsIHBJbmRleCsrICk7CisjaWZuZGVmIElQMkRFQlVHX09QRU4KKwkJCXJjID0gcHV0X3VzZXIoMCwgcEluZGV4KysgKTsKKyNlbHNlCisJCQlyYyA9IHB1dF91c2VyKG9wZW5fc2FuaXR5X2NoZWNrLCBwSW5kZXgrKyApOworI2VuZGlmCisJCQlyYyA9IHB1dF91c2VyKGlwMl9vcGVuLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihpcDJfY2xvc2UsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9oYW5ndXAsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl93cml0ZSwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaXAyX3B1dGNoYXIsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9mbHVzaF9jaGFycywgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaXAyX3dyaXRlX3Jvb20sIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9jaGFyc19pbl9idWYsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9mbHVzaF9idWZmZXIsIHBJbmRleCsrICk7CisKKwkJCS8vcmMgPSBwdXRfdXNlcihpcDJfd2FpdF91bnRpbF9zZW50LCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcigwLCBwSW5kZXgrKyApOworCisJCQlyYyA9IHB1dF91c2VyKGlwMl90aHJvdHRsZSwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaXAyX3VudGhyb3R0bGUsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9pb2N0bCwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoMCwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoZ2V0X3NlcmlhbF9pbmZvLCBwSW5kZXgrKyApOworCQkJcmMgPSBwdXRfdXNlcihzZXRfc2VyaWFsX2luZm8sIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKGlwMl9zZXRfdGVybWlvcywgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoaXAyX3NldF9saW5lX2Rpc2NpcGxpbmUsIHBJbmRleCsrICk7CisJCQlyYyA9IHB1dF91c2VyKHNldF9wYXJhbXMsIHBJbmRleCsrICk7CisJCX0gZWxzZSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJjID0gLUVOT0RFVjsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMl9pcGxfb3BlbigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBQb2ludGVyIHRvIGRldmljZSBpbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnM6ICAgIFN1Y2Nlc3Mgb3IgZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwMl9pcGxfb3Blbiggc3RydWN0IGlub2RlICpwSW5vZGUsIHN0cnVjdCBmaWxlICpwRmlsZSApCit7CisJdW5zaWduZWQgaW50IGlwbG1pbm9yID0gaW1pbm9yKHBJbm9kZSk7CisJaTJlQm9yZFN0clB0ciBwQjsKKwlpMkNoYW5TdHJQdHIgIHBDaDsKKworI2lmZGVmIElQMkRFQlVHX0lQTAorCXByaW50ayAoS0VSTl9ERUJVRyAiSVAySVBMOiBvcGVuXG4iICk7CisjZW5kaWYKKworCXN3aXRjaChpcGxtaW5vcikgeworCS8vIFRoZXNlIGFyZSB0aGUgSVBMIGRldmljZXMKKwljYXNlIDA6CisJY2FzZSA0OgorCWNhc2UgODoKKwljYXNlIDEyOgorCQlicmVhazsKKworCS8vIFRoZXNlIGFyZSB0aGUgc3RhdHVzIGRldmljZXMKKwljYXNlIDE6CisJY2FzZSA1OgorCWNhc2UgOToKKwljYXNlIDEzOgorCQlicmVhazsKKworCS8vIFRoZXNlIGFyZSB0aGUgZGVidWcgZGV2aWNlcworCWNhc2UgMjoKKwljYXNlIDY6CisJY2FzZSAxMDoKKwljYXNlIDE0OgorCQlwQiA9IGkyQm9hcmRQdHJUYWJsZVtpcGxtaW5vciAvIDRdOworCQlwQ2ggPSAoaTJDaGFuU3RyUHRyKSBwQi0+aTJlQ2hhbm5lbFB0cjsKKwkJYnJlYWs7CisKKwkvLyBUaGlzIGlzIHRoZSB0cmFjZSBkZXZpY2UKKwljYXNlIDM6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbjogICBpcDJfcmVhZF9wcm9jbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGFyYW1ldGVyczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zOiBMZW5ndGggb2Ygb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFN1cHBsaWVzIHNvbWUgZHJpdmVyIG9wZXJhdGluZyBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoJTm90IHJlYWwgdXNlZnVsIHVubGVzcyB5b3VyIGRlYnVnZ2luZyB0aGUgZmlmbwkJCQkJCQkgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMSU1JVCAgKFBBR0VfU0laRSAtIDEyMCkKKworc3RhdGljIGludAoraXAyX3JlYWRfcHJvY21lbShjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuKQoreworCWkyZUJvcmRTdHJQdHIgIHBCOworCWkyQ2hhblN0clB0ciAgcENoOworCVBUVFkgdHR5OworCWludCBpOworCisJbGVuID0gMDsKKworI2RlZmluZSBGTVRMSU5FCSIlM2Q6IDB4JTA4eCAweCUwOHggMCUwMTFvIDAlMDExb1xuIgorI2RlZmluZSBGTVRMSU4yCSIgICAgIDB4JTA0eCAweCUwNHggdHggZmxvdyAweCV4XG4iCisjZGVmaW5lIEZNVExJTjMJIiAgICAgMHglMDR4IDB4JTA0eCByYyBmbG93XG4iCisKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJcbiIpOworCisJZm9yKCBpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kgKSB7CisJCXBCID0gaTJCb2FyZFB0clRhYmxlW2ldOworCQlpZiAoIHBCICkgeworCQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiYm9hcmQgJWQ6XG4iLGkpOworCQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiXHRGaWZvIHJlbTogJWQgbXR5OiAleCBvdXRNICV4XG4iLAorCQkJCXBCLT5pMmVGaWZvUmVtYWlucyxwQi0+aTJlV2FpdGluZ0ZvckVtcHR5RmlmbyxwQi0+aTJlT3V0TWFpbFdhaXRpbmcpOworCQl9CisJfQorCisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiIzogdHR5IGZsYWdzLCBwb3J0IGZsYWdzLCAgICAgY2ZsYWdzLCAgICAgaWZsYWdzXG4iKTsKKwlmb3IgKGk9MDsgaSA8IElQMl9NQVhfUE9SVFM7IGkrKykgeworCQlpZiAobGVuID4gTElNSVQpCisJCQlicmVhazsKKwkJcENoID0gRGV2VGFibGVbaV07CisJCWlmIChwQ2gpIHsKKwkJCXR0eSA9IHBDaC0+cFRUWTsKKwkJCWlmICh0dHkgJiYgdHR5LT5jb3VudCkgeworCQkJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sRk1UTElORSxpLChpbnQpdHR5LT5mbGFncyxwQ2gtPmZsYWdzLAorCQkJCQkJCQkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnLHR0eS0+dGVybWlvcy0+Y19pZmxhZyk7CisKKwkJCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLEZNVExJTjIsCisJCQkJCQlwQ2gtPm91dGZsLmFzb2YscENoLT5vdXRmbC5yb29tLHBDaC0+Y2hhbm5lbE5lZWRzKTsKKwkJCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLEZNVExJTjMscENoLT5pbmZsLmFzb2YscENoLT5pbmZsLnJvb20pOworCQkJfQorCQl9CisJfQorCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBoYW5kbGVyIGZvciAvcHJvYy90dHkvZHJpdmVyL2lwMgorICoKKyAqIFRoaXMgc3RyZXRjaCBvZiBjb2RlIGhhcyBiZWVuIGxhcmdlbHkgcGxhZ2VyaXplZCBmcm9tIGF0IGxlYXN0IHRocmVlCisgKiBkaWZmZXJlbnQgc291cmNlcyBpbmNsdWRpbmcgaXAybWtkZXYuYyBhbmQgYSBjb3VwbGUgb2Ygb3RoZXIgZHJpdmVycy4KKyAqIFRoZSBidWdzIGFyZSBhbGwgbWluZS4gIDotKQk9bWh3PQorICovCitzdGF0aWMgaW50IGlwMl9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQJaSwgaiwgYm94OworCWludAlsZW4gPSAwOworCWludAlib3hlcyA9IDA7CisJaW50CXBvcnRzID0gMDsKKwlpbnQJdHBvcnRzID0gMDsKKwlvZmZfdAliZWdpbiA9IDA7CisJaTJlQm9yZFN0clB0ciAgcEI7CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlLCAiaXAyaW5mbzogMS4wIGRyaXZlcjogJXNcbiIsIHBjVmVyc2lvbiApOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiRHJpdmVyOiBTTWFqb3I9JWQgQ01ham9yPSVkIElNYWpvcj0lZCBNYXhCb2FyZHM9JWQgTWF4Qm94ZXM9JWQgTWF4UG9ydHM9JWRcbiIsCisJCQlJUDJfVFRZX01BSk9SLCBJUDJfQ0FMTE9VVF9NQUpPUiwgSVAyX0lQTF9NQUpPUiwKKwkJCUlQMl9NQVhfQk9BUkRTLCBBQlNfTUFYX0JPWEVTLCBBQlNfQklHR0VTVF9CT1gpOworCisJZm9yKCBpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kgKSB7CisJCS8qIFRoaXMgbmVlZCB0byBiZSByZXNldCBmb3IgYSBib2FyZCBieSBib2FyZCBjb3VudC4uLiAqLworCQlib3hlcyA9IDA7CisJCXBCID0gaTJCb2FyZFB0clRhYmxlW2ldOworCQlpZiggcEIgKSB7CisJCQlzd2l0Y2goIHBCLT5pMmVQb20uZS5wb3JJRCAmIH5QT1JfSURfUkVTRVJWRUQgKSAKKwkJCXsKKwkJCWNhc2UgUE9SX0lEX0ZJSUVYOgorCQkJCWxlbiArPSBzcHJpbnRmKCBwYWdlK2xlbiwgIkJvYXJkICVkOiBFWCBwb3J0cz0iLCBpICk7CisJCQkJZm9yKCBib3ggPSAwOyBib3ggPCBBQlNfTUFYX0JPWEVTOyArK2JveCApCisJCQkJeworCQkJCQlwb3J0cyA9IDA7CisKKwkJCQkJaWYoIHBCLT5pMmVDaGFubmVsTWFwW2JveF0gIT0gMCApICsrYm94ZXM7CisJCQkJCWZvciggaiA9IDA7IGogPCBBQlNfQklHR0VTVF9CT1g7ICsraiApIAorCQkJCQl7CisJCQkJCQlpZiggcEItPmkyZUNoYW5uZWxNYXBbYm94XSAmIDE8PCBqICkgeworCQkJCQkJCSsrcG9ydHM7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJbGVuICs9IHNwcmludGYoIHBhZ2UrbGVuLCAiJWQsIiwgcG9ydHMgKTsKKwkJCQkJdHBvcnRzICs9IHBvcnRzOworCQkJCX0KKworCQkJCS0tbGVuOwkvKiBCYWNrdXAgb3ZlciB0aGF0IGxhc3QgY29tbWEgKi8KKworCQkJCWxlbiArPSBzcHJpbnRmKCBwYWdlK2xlbiwgIiBib3hlcz0lZCB3aWR0aD0lZCIsIGJveGVzLCBwQi0+aTJlRGF0YVdpZHRoMTYgPyAxNiA6IDggKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQT1JfSURfSUlfNDoKKwkJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIkJvYXJkICVkOiBJU0EtNCBwb3J0cz00IGJveGVzPTEiLCBpICk7CisJCQkJdHBvcnRzID0gcG9ydHMgPSA0OworCQkJCWJyZWFrOworCisJCQljYXNlIFBPUl9JRF9JSV84OgorCQkJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiQm9hcmQgJWQ6IElTQS04LXN0ZCBwb3J0cz04IGJveGVzPTEiLCBpICk7CisJCQkJdHBvcnRzID0gcG9ydHMgPSA4OworCQkJCWJyZWFrOworCisJCQljYXNlIFBPUl9JRF9JSV84UjoKKwkJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIkJvYXJkICVkOiBJU0EtOC1SSjExIHBvcnRzPTggYm94ZXM9MSIsIGkgKTsKKwkJCQl0cG9ydHMgPSBwb3J0cyA9IDg7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJCb2FyZCAlZDogdW5rbm93biIsIGkgKTsKKwkJCQkvKiBEb24ndCB0cnkgYW5kIHByb2JlIGZvciBtaW5vciBudW1iZXJzICovCisJCQkJdHBvcnRzID0gcG9ydHMgPSAwOworCQkJfQorCisJCX0gZWxzZSB7CisJCQkvKiBEb24ndCB0cnkgYW5kIHByb2JlIGZvciBtaW5vciBudW1iZXJzICovCisJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIkJvYXJkICVkOiB2YWNhbnQiLCBpICk7CisJCQl0cG9ydHMgPSBwb3J0cyA9IDA7CisJCX0KKworCQlpZiggdHBvcnRzICkgeworCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIgbWlub3JzPSIgKTsKKworCQkJZm9yICggYm94ID0gMDsgYm94IDwgQUJTX01BWF9CT1hFUzsgKytib3ggKQorCQkJeworCQkJCWZvciAoIGogPSAwOyBqIDwgQUJTX0JJR0dFU1RfQk9YOyArK2ogKQorCQkJCXsKKwkJCQkJaWYgKCBwQi0+aTJlQ2hhbm5lbE1hcFtib3hdICYgKDEgPDwgaikgKQorCQkJCQl7CisJCQkJCQlsZW4gKz0gc3ByaW50ZiAocGFnZStsZW4sIiVkLCIsCisJCQkJCQkJaiArIEFCU19CSUdHRVNUX0JPWCAqCisJCQkJCQkJKGJveCtpKkFCU19NQVhfQk9YRVMpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcGFnZVsgbGVuIC0gMSBdID0gJ1xuJzsJLyogT3ZlcndyaXRlIHRoYXQgbGFzdCBjb21tYSAqLworCQl9IGVsc2UgeworCQkJbGVuICs9IHNwcmludGYgKHBhZ2UrbGVuLCJcbiIgKTsKKwkJfQorCisJCWlmIChsZW4rYmVnaW4gPiBvZmYrY291bnQpCisJCQlicmVhazsKKwkJaWYgKGxlbitiZWdpbiA8IG9mZikgeworCQkJYmVnaW4gKz0gbGVuOworCQkJbGVuID0gMDsKKwkJfQorCX0KKworCWlmIChpID49IElQMl9NQVhfQk9BUkRTKQorCQkqZW9mID0gMTsKKwlpZiAob2ZmID49IGxlbitiZWdpbikKKwkJcmV0dXJuIDA7CisKKwkqc3RhcnQgPSBwYWdlICsgKG9mZi1iZWdpbik7CisJcmV0dXJuICgoY291bnQgPCBiZWdpbitsZW4tb2ZmKSA/IGNvdW50IDogYmVnaW4rbGVuLW9mZik7CisgfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uOiAgIGlwMnRyYWNlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQYXJhbWV0ZXJzOiBWYWx1ZSB0byBhZGQgdG8gdHJhY2UgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuczogICAgTm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIElQMkRFQlVHX1RSQUNFCit2b2lkCitpcDJ0cmFjZSAodW5zaWduZWQgc2hvcnQgcG4sIHVuc2lnbmVkIGNoYXIgY2F0LCB1bnNpZ25lZCBjaGFyIGxhYmVsLCB1bnNpZ25lZCBsb25nIGNvZGVzLCAuLi4pCit7CisJbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nICpwQ29kZSA9ICZjb2RlczsKKwl1bmlvbiBpcDJicmVhZGNydW1iIGJjOworCWkyQ2hhblN0clB0ciAgcENoOworCisKKwl0cmFjZWJ1Zlt0cmFjZXN0dWZmKytdID0gamlmZmllczsKKwlpZiAoIHRyYWNlc3R1ZmYgPT0gVFJBQ0VNQVggKSB7CisJCXRyYWNlc3R1ZmYgPSAwOworCX0KKwlpZiAoIHRyYWNlc3R1ZmYgPT0gdHJhY2VzdHJpcCApIHsKKwkJaWYgKCArK3RyYWNlc3RyaXAgPT0gVFJBQ0VNQVggKSB7CisJCQl0cmFjZXN0cmlwID0gMDsKKwkJfQorCQkrK3RyYWNld3JhcDsKKwl9CisKKwliYy5oZHIucG9ydCAgPSAweGZmICYgcG47CisJYmMuaGRyLmNhdCAgID0gY2F0OworCWJjLmhkci5jb2RlcyA9ICh1bnNpZ25lZCBjaGFyKSggY29kZXMgJiAweGZmICk7CisJYmMuaGRyLmxhYmVsID0gbGFiZWw7CisJdHJhY2VidWZbdHJhY2VzdHVmZisrXSA9IGJjLnZhbHVlOworCisJZm9yICg7OykgeworCQlpZiAoIHRyYWNlc3R1ZmYgPT0gVFJBQ0VNQVggKSB7CisJCQl0cmFjZXN0dWZmID0gMDsKKwkJfQorCQlpZiAoIHRyYWNlc3R1ZmYgPT0gdHJhY2VzdHJpcCApIHsKKwkJCWlmICggKyt0cmFjZXN0cmlwID09IFRSQUNFTUFYICkgeworCQkJCXRyYWNlc3RyaXAgPSAwOworCQkJfQorCQkJKyt0cmFjZXdyYXA7CisJCX0KKworCQlpZiAoICFjb2Rlcy0tICkKKwkJCWJyZWFrOworCisJCXRyYWNlYnVmW3RyYWNlc3R1ZmYrK10gPSAqKytwQ29kZTsKKwl9Cit9CisjZW5kaWYKKworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9LY29uZmlnIGIvZHJpdmVycy9jaGFyL2lwbWkvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmRjYjI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvS2NvbmZpZwpAQCAtMCwwICsxLDY3IEBACisjCisjIElQTUkgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiSVBNSSIKK2NvbmZpZyBJUE1JX0hBTkRMRVIKKyAgICAgICB0cmlzdGF0ZSAnSVBNSSB0b3AtbGV2ZWwgbWVzc2FnZSBoYW5kbGVyJworICAgICAgIGhlbHAKKyAgICAgICAgIFRoaXMgZW5hYmxlcyB0aGUgY2VudHJhbCBJUE1JIG1lc3NhZ2UgaGFuZGxlciwgcmVxdWlyZWQgZm9yIElQTUkKKwkgdG8gd29yay4KKworICAgICAgICAgSVBNSSBpcyBhIHN0YW5kYXJkIGZvciBtYW5hZ2luZyBzZW5zb3JzICh0ZW1wZXJhdHVyZSwKKyAgICAgICAgIHZvbHRhZ2UsIGV0Yy4pIGluIGEgc3lzdGVtLgorCisgICAgICAgICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9JUE1JLnR4dD4gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgZHJpdmVyLgorCisJIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUE1JX1BBTklDX0VWRU5UCisgICAgICAgYm9vbCAnR2VuZXJhdGUgYSBwYW5pYyBldmVudCB0byBhbGwgQk1DcyBvbiBhIHBhbmljJworICAgICAgIGRlcGVuZHMgb24gSVBNSV9IQU5ETEVSCisgICAgICAgaGVscAorICAgICAgICAgV2hlbiBhIHBhbmljIG9jY3VycywgdGhpcyB3aWxsIGNhdXNlIHRoZSBJUE1JIG1lc3NhZ2UgaGFuZGxlciB0bworCSBnZW5lcmF0ZSBhbiBJUE1JIGV2ZW50IGRlc2NyaWJpbmcgdGhlIHBhbmljIHRvIGVhY2ggaW50ZXJmYWNlCisJIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbWVzc2FnZSBoYW5kbGVyLgorCitjb25maWcgSVBNSV9QQU5JQ19TVFJJTkcKKwlib29sICdHZW5lcmF0ZSBPRU0gZXZlbnRzIGNvbnRhaW5pbmcgdGhlIHBhbmljIHN0cmluZycKKwlkZXBlbmRzIG9uIElQTUlfUEFOSUNfRVZFTlQKKwloZWxwCisJICBXaGVuIGEgcGFuaWMgb2NjdXJzLCB0aGlzIHdpbGwgY2F1c2UgdGhlIElQTUkgbWVzc2FnZSBoYW5kbGVyIHRvCisJICBnZW5lcmF0ZSBJUE1JIE9FTSB0eXBlIGYwIGV2ZW50cyBob2xkaW5nIHRoZSBJUE1CIGFkZHJlc3Mgb2YgdGhlCisJICBwYW5pYyBnZW5lcmF0b3IgKGJ5dGUgNCBvZiB0aGUgZXZlbnQpLCBhIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlCisJICBzdHJpbmcgKGJ5dGUgNSBvZiB0aGUgZXZlbnQpIGFuZCBwYXJ0IG9mIHRoZSBzdHJpbmcgKHRoZSByZXN0IG9mIHRoZQorCSAgZXZlbnQpLiAgQnl0ZXMgMSwgMiwgYW5kIDMgYXJlIHRoZSBub3JtYWwgdXNhZ2UgZm9yIGFuIE9FTSBldmVudC4KKwkgIFlvdSBjYW4gZmV0Y2ggdGhlc2UgZXZlbnRzIGFuZCB1c2UgdGhlIHNlcXVlbmNlIG51bWJlcnMgdG8gcGllY2UgdGhlCisJICBzdHJpbmcgdG9nZXRoZXIuCisKK2NvbmZpZyBJUE1JX0RFVklDRV9JTlRFUkZBQ0UKKyAgICAgICB0cmlzdGF0ZSAnRGV2aWNlIGludGVyZmFjZSBmb3IgSVBNSScKKyAgICAgICBkZXBlbmRzIG9uIElQTUlfSEFORExFUgorICAgICAgIGhlbHAKKyAgICAgICAgIFRoaXMgcHJvdmlkZXMgYW4gSU9DVEwgaW50ZXJmYWNlIHRvIHRoZSBJUE1JIG1lc3NhZ2UgaGFuZGxlciBzbworCSB1c2VybGFuZCBwcm9jZXNzZXMgbWF5IHVzZSBJUE1JLiAgSXQgc3VwcG9ydHMgcG9sbCgpIGFuZCBzZWxlY3QoKS4KKworY29uZmlnIElQTUlfU0kKKyAgICAgICB0cmlzdGF0ZSAnSVBNSSBTeXN0ZW0gSW50ZXJmYWNlIGhhbmRsZXInCisgICAgICAgZGVwZW5kcyBvbiBJUE1JX0hBTkRMRVIKKyAgICAgICBoZWxwCisgICAgICAgICBQcm92aWRlcyBhIGRyaXZlciBmb3IgU3lzdGVtIEludGVyZmFjZXMgKEtDUywgU01JQywgQlQpLgorCSBDdXJyZW50bHksIG9ubHkgS0NTIGFuZCBTTUlDIGFyZSBzdXBwb3J0ZWQuICBJZgorCSB5b3UgYXJlIHVzaW5nIElQTUksIHlvdSBzaG91bGQgcHJvYmFibHkgc2F5ICJ5IiBoZXJlLgorCitjb25maWcgSVBNSV9XQVRDSERPRworICAgICAgIHRyaXN0YXRlICdJUE1JIFdhdGNoZG9nIFRpbWVyJworICAgICAgIGRlcGVuZHMgb24gSVBNSV9IQU5ETEVSCisgICAgICAgaGVscAorICAgICAgICAgVGhpcyBlbmFibGVzIHRoZSBJUE1JIHdhdGNoZG9nIHRpbWVyLgorCitjb25maWcgSVBNSV9QT1dFUk9GRgorICAgICAgIHRyaXN0YXRlICdJUE1JIFBvd2Vyb2ZmJworICAgICAgIGRlcGVuZHMgb24gSVBNSV9IQU5ETEVSCisgICAgICAgaGVscAorICAgICAgICAgVGhpcyBlbmFibGVzIGEgZnVuY3Rpb24gdG8gcG93ZXIgb2ZmIHRoZSBzeXN0ZW0gd2l0aCBJUE1JIGlmCisJIHRoZSBJUE1JIG1hbmFnZW1lbnQgY29udHJvbGxlciBpcyBjYXBhYmxlIG9mIHRoaXMuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2lwbWkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzZjBhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBpcG1pIGRyaXZlcnMuCisjCisKK2lwbWlfc2ktb2JqcyA6PSBpcG1pX3NpX2ludGYubyBpcG1pX2tjc19zbS5vIGlwbWlfc21pY19zbS5vIGlwbWlfYnRfc20ubworCitvYmotJChDT05GSUdfSVBNSV9IQU5ETEVSKSArPSBpcG1pX21zZ2hhbmRsZXIubworb2JqLSQoQ09ORklHX0lQTUlfREVWSUNFX0lOVEVSRkFDRSkgKz0gaXBtaV9kZXZpbnRmLm8KK29iai0kKENPTkZJR19JUE1JX1NJKSArPSBpcG1pX3NpLm8KK29iai0kKENPTkZJR19JUE1JX1dBVENIRE9HKSArPSBpcG1pX3dhdGNoZG9nLm8KK29iai0kKENPTkZJR19JUE1JX1BPV0VST0ZGKSArPSBpcG1pX3Bvd2Vyb2ZmLm8KKworaXBtaV9zaS5vOgkkKGlwbWlfc2ktb2JqcykKKwkkKExEKSAtciAtbyAkQCAkKGlwbWlfc2ktb2JqcykKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9idF9zbS5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9idF9zbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNWIzMzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2J0X3NtLmMKQEAgLTAsMCArMSw1MTMgQEAKKy8qCisgKiAgaXBtaV9idF9zbS5jCisgKgorICogIFRoZSBzdGF0ZSBtYWNoaW5lIGZvciBhbiBPcGVuIElQTUkgQlQgc3ViLWRyaXZlciB1bmRlciBpcG1pX3NpLmMsIHBhcnQKKyAqICBvZiB0aGUgZHJpdmVyIGFyY2hpdGVjdHVyZSBhdCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvb3BlbmlwbWkKKyAqCisgKiAgQXV0aG9yOglSb2NreSBDcmFpZyA8Zmlyc3QubGFzdEBocC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICogIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAqICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiAgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4gLyogRm9yIHByaW50ay4gKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pcG1pX21zZ2RlZnMuaD4JCS8qIGZvciBjb21wbGV0aW9uIGNvZGVzICovCisjaW5jbHVkZSAiaXBtaV9zaV9zbS5oIgorCisjZGVmaW5lIElQTUlfQlRfVkVSU0lPTiAidjMzIgorCitzdGF0aWMgaW50IGJ0X2RlYnVnID0gMHgwMDsJLyogUHJvZHVjdGlvbiB2YWx1ZSAwLCBzZWUgZm9sbG93aW5nIGZsYWdzICovCisKKyNkZWZpbmUJQlRfREVCVUdfRU5BQkxFCTEKKyNkZWZpbmUgQlRfREVCVUdfTVNHCTIKKyNkZWZpbmUgQlRfREVCVUdfU1RBVEVTCTQKKworLyogVHlwaWNhbCAiR2V0IEJUIENhcGFiaWxpdGllcyIgdmFsdWVzIGFyZSAyLTMgcmV0cmllcywgNS0xMCBzZWNvbmRzLAorICAgYW5kIDY0IGJ5dGUgYnVmZmVycy4gIEhvd2V2ZXIsIG9uZSBIUCBpbXBsZW1lbnRhdGlvbiB3YW50cyAyNTUgYnl0ZXMgb2YKKyAgIGJ1ZmZlciAod2l0aCBhIGRvY3VtZW50ZWQgbWVzc2FnZSBvZiAxNjAgYnl0ZXMpIHNvIGdvIGZvciB0aGUgbWF4LgorICAgU2luY2UgdGhlIE9wZW4gSVBNSSBhcmNoaXRlY3R1cmUgaXMgc2luZ2xlLW1lc3NhZ2Ugb3JpZW50ZWQgYXQgdGhpcworICAgc3RhZ2UsIHRoZSBxdWV1ZSBkZXB0aCBvZiBCVCBpcyBvZiBubyBjb25jZXJuLiAqLworCisjZGVmaW5lIEJUX05PUk1BTF9USU1FT1VUCTIwMDAwMDAJLyogc2Vjb25kcyBpbiBtaWNyb3NlY29uZHMgKi8KKyNkZWZpbmUgQlRfUkVUUllfTElNSVQJCTIKKyNkZWZpbmUgQlRfUkVTRVRfREVMQVkJCTYwMDAwMDAJLyogNiBzZWNvbmRzIGFmdGVyIHdhcm0gcmVzZXQgKi8KKworZW51bSBidF9zdGF0ZXMgeworCUJUX1NUQVRFX0lETEUsCisJQlRfU1RBVEVfWEFDVElPTl9TVEFSVCwKKwlCVF9TVEFURV9XUklURV9CWVRFUywKKwlCVF9TVEFURV9XUklURV9FTkQsCisJQlRfU1RBVEVfV1JJVEVfQ09OU1VNRSwKKwlCVF9TVEFURV9CMkhfV0FJVCwKKwlCVF9TVEFURV9SRUFEX0VORCwKKwlCVF9TVEFURV9SRVNFVDEsCQkvKiBUaGVzZSBtdXN0IGNvbWUgbGFzdCAqLworCUJUX1NUQVRFX1JFU0VUMiwKKwlCVF9TVEFURV9SRVNFVDMsCisJQlRfU1RBVEVfUkVTVEFSVCwKKwlCVF9TVEFURV9IT1NFRAorfTsKKworc3RydWN0IHNpX3NtX2RhdGEgeworCWVudW0gYnRfc3RhdGVzCXN0YXRlOworCWVudW0gYnRfc3RhdGVzCWxhc3Rfc3RhdGU7CS8qIGFzc2lzdCBwcmludGluZyBhbmQgcmVzZXRzICovCisJdW5zaWduZWQgY2hhcglzZXE7CQkvKiBCVCBzZXF1ZW5jZSBudW1iZXIgKi8KKwlzdHJ1Y3Qgc2lfc21faW8JKmlvOworICAgICAgICB1bnNpZ25lZCBjaGFyCXdyaXRlX2RhdGFbSVBNSV9NQVhfTVNHX0xFTkdUSF07CisgICAgICAgIGludAkJd3JpdGVfY291bnQ7CisgICAgICAgIHVuc2lnbmVkIGNoYXIJcmVhZF9kYXRhW0lQTUlfTUFYX01TR19MRU5HVEhdOworICAgICAgICBpbnQJCXJlYWRfY291bnQ7CisgICAgICAgIGludAkJdHJ1bmNhdGVkOworICAgICAgICBsb25nCQl0aW1lb3V0OworICAgICAgICB1bnNpZ25lZCBpbnQJZXJyb3JfcmV0cmllczsJLyogZW5kIG9mICJjb21tb24iIGZpZWxkcyAqLworCWludAkJbm9uemVyb19zdGF0dXM7CS8qIGh1bmcgQk1DcyBzdGF5IGFsbCAwICovCit9OworCisjZGVmaW5lIEJUX0NMUl9XUl9QVFIJMHgwMQkvKiBTZWUgSVBNSSAxLjUgdGFibGUgMTEuNi40ICovCisjZGVmaW5lIEJUX0NMUl9SRF9QVFIJMHgwMgorI2RlZmluZSBCVF9IMkJfQVROCTB4MDQKKyNkZWZpbmUgQlRfQjJIX0FUTgkweDA4CisjZGVmaW5lIEJUX1NNU19BVE4JMHgxMAorI2RlZmluZSBCVF9PRU0wCQkweDIwCisjZGVmaW5lIEJUX0hfQlVTWQkweDQwCisjZGVmaW5lIEJUX0JfQlVTWQkweDgwCisKKy8qIFNvbWUgYml0cyBhcmUgdG9nZ2xlZCBvbiBlYWNoIHdyaXRlOiB3cml0ZSBvbmNlIHRvIHNldCBpdCwgb25jZQorICAgbW9yZSB0byBjbGVhciBpdDsgd3JpdGluZyBhIHplcm8gZG9lcyBub3RoaW5nLiAgVG8gYWJzb2x1dGVseQorICAgY2xlYXIgaXQsIGNoZWNrIGl0cyBzdGF0ZSBhbmQgd3JpdGUgaWYgc2V0LiAgVGhpcyBhdm9pZHMgdGhlICJnZXQKKyAgIGN1cnJlbnQgdGhlbiB1c2UgYXMgbWFzayIgc2NoZW1lIHRvIG1vZGlmeSBvbmUgYml0LiAgTm90ZSB0aGF0IHRoZQorICAgdmFyaWFibGUgImJ0IiBpcyBoYXJkY29kZWQgaW50byB0aGVzZSBtYWNyb3MuICovCisKKyNkZWZpbmUgQlRfU1RBVFVTCWJ0LT5pby0+aW5wdXRiKGJ0LT5pbywgMCkKKyNkZWZpbmUgQlRfQ09OVFJPTCh4KQlidC0+aW8tPm91dHB1dGIoYnQtPmlvLCAwLCB4KQorCisjZGVmaW5lIEJNQzJIT1NUCWJ0LT5pby0+aW5wdXRiKGJ0LT5pbywgMSkKKyNkZWZpbmUgSE9TVDJCTUMoeCkJYnQtPmlvLT5vdXRwdXRiKGJ0LT5pbywgMSwgeCkKKworI2RlZmluZSBCVF9JTlRNQVNLX1IJYnQtPmlvLT5pbnB1dGIoYnQtPmlvLCAyKQorI2RlZmluZSBCVF9JTlRNQVNLX1coeCkJYnQtPmlvLT5vdXRwdXRiKGJ0LT5pbywgMiwgeCkKKworLyogQ29udmVuaWVuY2Ugcm91dGluZXMgZm9yIGRlYnVnZ2luZy4gIFRoZXNlIGFyZSBub3QgbXVsdGktb3BlbiBzYWZlIQorICAgTm90ZSB0aGUgbWFjcm9zIGhhdmUgaGFyZGNvZGVkIHZhcmlhYmxlcyBpbiB0aGVtLiAqLworCitzdGF0aWMgY2hhciAqc3RhdGUydHh0KHVuc2lnbmVkIGNoYXIgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIEJUX1NUQVRFX0lETEU6CQlyZXR1cm4oIklETEUiKTsKKwkJY2FzZSBCVF9TVEFURV9YQUNUSU9OX1NUQVJUOglyZXR1cm4oIlhBQ1RJT04iKTsKKwkJY2FzZSBCVF9TVEFURV9XUklURV9CWVRFUzoJcmV0dXJuKCJXUl9CWVRFUyIpOworCQljYXNlIEJUX1NUQVRFX1dSSVRFX0VORDoJcmV0dXJuKCJXUl9FTkQiKTsKKwkJY2FzZSBCVF9TVEFURV9XUklURV9DT05TVU1FOglyZXR1cm4oIldSX0NPTlNVTUUiKTsKKwkJY2FzZSBCVF9TVEFURV9CMkhfV0FJVDoJCXJldHVybigiQjJIX1dBSVQiKTsKKwkJY2FzZSBCVF9TVEFURV9SRUFEX0VORDoJCXJldHVybigiUkRfRU5EIik7CisJCWNhc2UgQlRfU1RBVEVfUkVTRVQxOgkJcmV0dXJuKCJSRVNFVDEiKTsKKwkJY2FzZSBCVF9TVEFURV9SRVNFVDI6CQlyZXR1cm4oIlJFU0VUMiIpOworCQljYXNlIEJUX1NUQVRFX1JFU0VUMzoJCXJldHVybigiUkVTRVQzIik7CisJCWNhc2UgQlRfU1RBVEVfUkVTVEFSVDoJCXJldHVybigiUkVTVEFSVCIpOworCQljYXNlIEJUX1NUQVRFX0hPU0VEOgkJcmV0dXJuKCJIT1NFRCIpOworCX0KKwlyZXR1cm4oIkJBRCBTVEFURSIpOworfQorI2RlZmluZSBTVEFURTJUWFQgc3RhdGUydHh0KGJ0LT5zdGF0ZSkKKworc3RhdGljIGNoYXIgKnN0YXR1czJ0eHQodW5zaWduZWQgY2hhciBzdGF0dXMsIGNoYXIgKmJ1ZikKK3sKKwlzdHJjcHkoYnVmLCAiWyAiKTsKKwlpZiAoc3RhdHVzICYgQlRfQl9CVVNZKSBzdHJjYXQoYnVmLCAiQl9CVVNZICIpOworCWlmIChzdGF0dXMgJiBCVF9IX0JVU1kpIHN0cmNhdChidWYsICJIX0JVU1kgIik7CisJaWYgKHN0YXR1cyAmIEJUX09FTTApIHN0cmNhdChidWYsICJPRU0wICIpOworCWlmIChzdGF0dXMgJiBCVF9TTVNfQVROKSBzdHJjYXQoYnVmLCAiU01TICIpOworCWlmIChzdGF0dXMgJiBCVF9CMkhfQVROKSBzdHJjYXQoYnVmLCAiQjJIICIpOworCWlmIChzdGF0dXMgJiBCVF9IMkJfQVROKSBzdHJjYXQoYnVmLCAiSDJCICIpOworCXN0cmNhdChidWYsICJdIik7CisJcmV0dXJuIGJ1ZjsKK30KKyNkZWZpbmUgU1RBVFVTMlRYVChidWYpIHN0YXR1czJ0eHQoc3RhdHVzLCBidWYpCisKKy8qIFRoaXMgd2lsbCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhpcyBtb2R1bGUgb24gYSBob3NlZCBjb25kaXRpb24gKi8KKyNkZWZpbmUgRklSU1RfU0VRCTAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnRfaW5pdF9kYXRhKHN0cnVjdCBzaV9zbV9kYXRhICpidCwgc3RydWN0IHNpX3NtX2lvICppbykKK3sKKwlidC0+c3RhdGUgPSBCVF9TVEFURV9JRExFOworCWJ0LT5sYXN0X3N0YXRlID0gQlRfU1RBVEVfSURMRTsKKwlidC0+c2VxID0gRklSU1RfU0VROworCWJ0LT5pbyA9IGlvOworCWJ0LT53cml0ZV9jb3VudCA9IDA7CisJYnQtPnJlYWRfY291bnQgPSAwOworCWJ0LT5lcnJvcl9yZXRyaWVzID0gMDsKKwlidC0+bm9uemVyb19zdGF0dXMgPSAwOworCWJ0LT50cnVuY2F0ZWQgPSAwOworCWJ0LT50aW1lb3V0ID0gQlRfTk9STUFMX1RJTUVPVVQ7CisJcmV0dXJuIDM7IC8qIFdlIGNsYWltIDMgYnl0ZXMgb2Ygc3BhY2U7IG91Z2h0IHRvIGNoZWNrIFNQTUkgdGFibGUgKi8KK30KKworc3RhdGljIGludCBidF9zdGFydF90cmFuc2FjdGlvbihzdHJ1Y3Qgc2lfc21fZGF0YSAqYnQsCisJCQkJdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCQl1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICgoc2l6ZSA8IDIpIHx8IChzaXplID4gSVBNSV9NQVhfTVNHX0xFTkdUSCkpIHJldHVybiAtMTsKKworCWlmICgoYnQtPnN0YXRlICE9IEJUX1NUQVRFX0lETEUpICYmIChidC0+c3RhdGUgIT0gQlRfU1RBVEVfSE9TRUQpKQorCQlyZXR1cm4gLTI7CisKKwlpZiAoYnRfZGVidWcgJiBCVF9ERUJVR19NU0cpIHsKKyAgICAJCXByaW50ayhLRVJOX1dBUk5JTkcgIisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKytcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVDogd3JpdGUgc2VxPTB4JTAyWDoiLCBidC0+c2VxKTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKyspIHByaW50ayAoIiAlMDJ4IiwgZGF0YVtpXSk7CisJCXByaW50aygiXG4iKTsKKwl9CisJYnQtPndyaXRlX2RhdGFbMF0gPSBzaXplICsgMTsJLyogYWxsIGRhdGEgcGx1cyBzZXEgYnl0ZSAqLworCWJ0LT53cml0ZV9kYXRhWzFdID0gKmRhdGE7CS8qIE5ldEZuL0xVTiAqLworCWJ0LT53cml0ZV9kYXRhWzJdID0gYnQtPnNlcTsKKwltZW1jcHkoYnQtPndyaXRlX2RhdGEgKyAzLCBkYXRhICsgMSwgc2l6ZSAtIDEpOworCWJ0LT53cml0ZV9jb3VudCA9IHNpemUgKyAyOworCisJYnQtPmVycm9yX3JldHJpZXMgPSAwOworCWJ0LT5ub256ZXJvX3N0YXR1cyA9IDA7CisJYnQtPnJlYWRfY291bnQgPSAwOworCWJ0LT50cnVuY2F0ZWQgPSAwOworCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX1hBQ1RJT05fU1RBUlQ7CisJYnQtPmxhc3Rfc3RhdGUgPSBCVF9TVEFURV9JRExFOworCWJ0LT50aW1lb3V0ID0gQlRfTk9STUFMX1RJTUVPVVQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIEFmdGVyIHRoZSB1cHBlciBzdGF0ZSBtYWNoaW5lIGhhcyBiZWVuIHRvbGQgU0lfU01fVFJBTlNBQ1RJT05fQ09NUExFVEUKKyAgIGl0IGNhbGxzIHRoaXMuICBTdHJpcCBvdXQgdGhlIGxlbmd0aCBhbmQgc2VxIGJ5dGVzLiAqLworCitzdGF0aWMgaW50IGJ0X2dldF9yZXN1bHQoc3RydWN0IHNpX3NtX2RhdGEgKmJ0LAorCQkJICAgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCSAgIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJaW50IGksIG1zZ19sZW47CisKKwltc2dfbGVuID0gYnQtPnJlYWRfY291bnQgLSAyOwkJLyogYWNjb3VudCBmb3IgbGVuZ3RoICYgc2VxICovCisJLyogQWx3YXlzIE5ldEZuLCBDbWQsIGNDb2RlICovCisJaWYgKG1zZ19sZW4gPCAzIHx8IG1zZ19sZW4gPiBJUE1JX01BWF9NU0dfTEVOR1RIKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJUIHJlc3VsdHM6IGJhZCBtc2dfbGVuID0gJWRcbiIsIG1zZ19sZW4pOworCQlkYXRhWzBdID0gYnQtPndyaXRlX2RhdGFbMV0gfCAweDQ7CS8qIEtsdWRnZSBhIHJlc3BvbnNlICovCisJCWRhdGFbMV0gPSBidC0+d3JpdGVfZGF0YVszXTsKKwkJZGF0YVsyXSA9IElQTUlfRVJSX1VOU1BFQ0lGSUVEOworCQltc2dfbGVuID0gMzsKKwl9IGVsc2UgeworCQlkYXRhWzBdID0gYnQtPnJlYWRfZGF0YVsxXTsKKwkJZGF0YVsxXSA9IGJ0LT5yZWFkX2RhdGFbM107CisJCWlmIChsZW5ndGggPCBtc2dfbGVuKSBidC0+dHJ1bmNhdGVkID0gMTsKKwkJaWYgKGJ0LT50cnVuY2F0ZWQpIHsJLyogY2FuIGJlIHNldCBpbiByZWFkX2FsbF9ieXRlcygpICovCisJCQlkYXRhWzJdID0gSVBNSV9FUlJfTVNHX1RSVU5DQVRFRDsKKwkJCW1zZ19sZW4gPSAzOworCQl9IGVsc2UgbWVtY3B5KGRhdGEgKyAyLCBidC0+cmVhZF9kYXRhICsgNCwgbXNnX2xlbiAtIDIpOworCisJCWlmIChidF9kZWJ1ZyAmIEJUX0RFQlVHX01TRykgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIkJUOiByZXMgKHJhdykiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBtc2dfbGVuOyBpKyspIHByaW50aygiICUwMngiLCBkYXRhW2ldKTsKKwkJCXByaW50ayAoIlxuIik7CisJCX0KKwl9CisJYnQtPnJlYWRfY291bnQgPSAwOwkvKiBwYXJhbm9pYSAqLworCXJldHVybiBtc2dfbGVuOworfQorCisvKiBUaGlzIGJpdCdzIGZ1bmN0aW9uYWxpdHkgaXMgb3B0aW9uYWwgKi8KKyNkZWZpbmUgQlRfQk1DX0hXUlNUCTB4ODAKKworc3RhdGljIHZvaWQgcmVzZXRfZmxhZ3Moc3RydWN0IHNpX3NtX2RhdGEgKmJ0KQoreworCWlmIChCVF9TVEFUVVMgJiBCVF9IX0JVU1kpIEJUX0NPTlRST0woQlRfSF9CVVNZKTsKKwlpZiAoQlRfU1RBVFVTICYgQlRfQl9CVVNZKSBCVF9DT05UUk9MKEJUX0JfQlVTWSk7CisJQlRfQ09OVFJPTChCVF9DTFJfV1JfUFRSKTsKKwlCVF9DT05UUk9MKEJUX1NNU19BVE4pOworCUJUX0lOVE1BU0tfVyhCVF9CTUNfSFdSU1QpOworI2lmZGVmIERFVkVMT1BNRU5UX09OTFlfTk9UX0ZPUl9QUk9EVUNUSU9OCisJaWYgKEJUX1NUQVRVUyAmIEJUX0IySF9BVE4pIHsKKwkJaW50IGk7CisJCUJUX0NPTlRST0woQlRfSF9CVVNZKTsKKwkJQlRfQ09OVFJPTChCVF9CMkhfQVROKTsKKwkJQlRfQ09OVFJPTChCVF9DTFJfUkRfUFRSKTsKKwkJZm9yIChpID0gMDsgaSA8IElQTUlfTUFYX01TR19MRU5HVEggKyAyOyBpKyspIEJNQzJIT1NUOworCQlCVF9DT05UUk9MKEJUX0hfQlVTWSk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9hbGxfYnl0ZXMoc3RydWN0IHNpX3NtX2RhdGEgKmJ0KQoreworCWludCBpOworCisJaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKSB7CisgICAgCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVDogd3JpdGUgJWQgYnl0ZXMgc2VxPTB4JTAyWCIsCisJCQlidC0+d3JpdGVfY291bnQsIGJ0LT5zZXEpOworCQlmb3IgKGkgPSAwOyBpIDwgYnQtPndyaXRlX2NvdW50OyBpKyspCisJCQlwcmludGsgKCIgJTAyeCIsIGJ0LT53cml0ZV9kYXRhW2ldKTsKKwkJcHJpbnRrICgiXG4iKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGJ0LT53cml0ZV9jb3VudDsgaSsrKSBIT1NUMkJNQyhidC0+d3JpdGVfZGF0YVtpXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlYWRfYWxsX2J5dGVzKHN0cnVjdCBzaV9zbV9kYXRhICpidCkKK3sKKwl1bnNpZ25lZCBjaGFyIGk7CisKKwlidC0+cmVhZF9kYXRhWzBdID0gQk1DMkhPU1Q7CisJYnQtPnJlYWRfY291bnQgPSBidC0+cmVhZF9kYXRhWzBdOworCWlmIChidF9kZWJ1ZyAmIEJUX0RFQlVHX01TRykKKyAgICAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJUOiByZWFkICVkIGJ5dGVzOiIsIGJ0LT5yZWFkX2NvdW50KTsKKworCS8qIG1pbmltdW06IGxlbmd0aCwgTmV0Rm4sIFNlcSwgQ21kLCBjQ29kZSA9PSA1IHRvdGFsLCBvciA0IG1vcmUKKwkgICBmb2xsb3dpbmcgdGhlIGxlbmd0aCBieXRlLiAqLworCWlmIChidC0+cmVhZF9jb3VudCA8IDQgfHwgYnQtPnJlYWRfY291bnQgPj0gSVBNSV9NQVhfTVNHX0xFTkdUSCkgeworCQlpZiAoYnRfZGVidWcgJiBCVF9ERUJVR19NU0cpCisJCQlwcmludGsoImJhZCBsZW5ndGggJWRcbiIsIGJ0LT5yZWFkX2NvdW50KTsKKwkJYnQtPnRydW5jYXRlZCA9IDE7CisJCXJldHVybiAxOwkvKiBsZXQgbmV4dCBYQUNUSU9OIFNUQVJUIGNsZWFuIGl0IHVwICovCisJfQorCWZvciAoaSA9IDE7IGkgPD0gYnQtPnJlYWRfY291bnQ7IGkrKykgYnQtPnJlYWRfZGF0YVtpXSA9IEJNQzJIT1NUOworCWJ0LT5yZWFkX2NvdW50Kys7CS8qIGFjY291bnQgZm9yIHRoZSBsZW5ndGggYnl0ZSAqLworCisJaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKSB7CisJICAgIAlmb3IgKGkgPSAwOyBpIDwgYnQtPnJlYWRfY291bnQ7IGkrKykKKwkJCXByaW50ayAoIiAlMDJ4IiwgYnQtPnJlYWRfZGF0YVtpXSk7CisJICAgIAlwcmludGsgKCJcbiIpOworCX0KKwlpZiAoYnQtPnNlcSAhPSBidC0+d3JpdGVfZGF0YVsyXSkJLyogaWRpb3QgY2hlY2sgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlQ6IGludGVybmFsIGVycm9yOiBzZXF1ZW5jZSBtaXNtYXRjaFxuIik7CisKKwkvKiBwZXIgdGhlIHNwZWMsIHRoZSAoTmV0Rm4sIFNlcSwgQ21kKSB0dXBsZXMgc2hvdWxkIG1hdGNoICovCisJaWYgKChidC0+cmVhZF9kYXRhWzNdID09IGJ0LT53cml0ZV9kYXRhWzNdKSAmJgkJLyogQ21kICovCisgICAgICAgIAkoYnQtPnJlYWRfZGF0YVsyXSA9PSBidC0+d3JpdGVfZGF0YVsyXSkgJiYJLyogU2VxdWVuY2UgKi8KKyAgICAgICAgCSgoYnQtPnJlYWRfZGF0YVsxXSAmIDB4RjgpID09IChidC0+d3JpdGVfZGF0YVsxXSAmIDB4RjgpKSkKKwkJCXJldHVybiAxOworCisJaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKSBwcmludGsoS0VSTl9XQVJOSU5HICJCVDogYmFkIHBhY2tldDogIgorCQkid2FudCAweCglMDJYLCAlMDJYLCAlMDJYKSBnb3QgKCUwMlgsICUwMlgsICUwMlgpXG4iLAorCQlidC0+d3JpdGVfZGF0YVsxXSwgYnQtPndyaXRlX2RhdGFbMl0sIGJ0LT53cml0ZV9kYXRhWzNdLAorCQlidC0+cmVhZF9kYXRhWzFdLCAgYnQtPnJlYWRfZGF0YVsyXSwgIGJ0LT5yZWFkX2RhdGFbM10pOworCXJldHVybiAwOworfQorCisvKiBNb2RpZmllcyBidC0+c3RhdGUgYXBwcm9wcmlhdGVseSwgbmVlZCB0byBnZXQgaW50byB0aGUgYnRfZXZlbnQoKSBzd2l0Y2ggKi8KKworc3RhdGljIHZvaWQgZXJyb3JfcmVjb3Zlcnkoc3RydWN0IHNpX3NtX2RhdGEgKmJ0LCBjaGFyICpyZWFzb24pCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJY2hhciBidWZbNDBdOyAvKiBGb3IgZ2V0dGluZyBzdGF0dXMgKi8KKworCWJ0LT50aW1lb3V0ID0gQlRfTk9STUFMX1RJTUVPVVQ7IC8qIHZhcmlvdXMgcGxhY2VzIHdhbnQgdG8gcmV0cnkgKi8KKworCXN0YXR1cyA9IEJUX1NUQVRVUzsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJCVDogJXMgaW4gJXMgJXMgIiwgcmVhc29uLCBTVEFURTJUWFQsCisJICAgICAgIFNUQVRVUzJUWFQoYnVmKSk7CisKKwkoYnQtPmVycm9yX3JldHJpZXMpKys7CisJaWYgKGJ0LT5lcnJvcl9yZXRyaWVzID4gQlRfUkVUUllfTElNSVQpIHsKKwkJcHJpbnRrKCJyZXRyeSBsaW1pdCAoJWQpIGV4Y2VlZGVkXG4iLCBCVF9SRVRSWV9MSU1JVCk7CisJCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX0hPU0VEOworCQlpZiAoIWJ0LT5ub256ZXJvX3N0YXR1cykKKwkJCXByaW50ayhLRVJOX0VSUiAiSVBNSTogQlQgc3R1Y2ssIHRyeSBwb3dlciBjeWNsZVxuIik7CisJCWVsc2UgaWYgKGJ0LT5zZXEgPT0gRklSU1RfU0VRICsgQlRfUkVUUllfTElNSVQpIHsKKwkJCS8qIG1vc3QgbGlrZWx5IGR1cmluZyBpbnNtb2QgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklQTUk6IEJUIHJlc2V0ICh0YWtlcyA1IHNlY3MpXG4iKTsKKyAgICAgICAgCQlidC0+c3RhdGUgPSBCVF9TVEFURV9SRVNFVDE7CisJCX0KKwlyZXR1cm47CisJfQorCisJLyogU29tZXRpbWVzIHRoZSBCTUMgcXVldWVzIGdldCBpbiBhbiAib2ZmLWJ5LW9uZSIgc3RhdGUuLi4qLworCWlmICgoYnQtPnN0YXRlID09IEJUX1NUQVRFX0IySF9XQUlUKSAmJiAoc3RhdHVzICYgQlRfQjJIX0FUTikpIHsKKyAgICAJCXByaW50aygicmV0cnkgQjJIX1dBSVRcbiIpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRrKCJyZXN0YXJ0IGNvbW1hbmRcbiIpOworCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX1JFU1RBUlQ7Cit9CisKKy8qIENoZWNrIHRoZSBzdGF0dXMgYW5kIChwb3NzaWJseSkgYWR2YW5jZSB0aGUgQlQgc3RhdGUgbWFjaGluZS4gIFRoZQorICAgZGVmYXVsdCByZXR1cm4gaXMgU0lfU01fQ0FMTF9XSVRIX0RFTEFZLiAqLworCitzdGF0aWMgZW51bSBzaV9zbV9yZXN1bHQgYnRfZXZlbnQoc3RydWN0IHNpX3NtX2RhdGEgKmJ0LCBsb25nIHRpbWUpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJY2hhciBidWZbNDBdOyAvKiBGb3IgZ2V0dGluZyBzdGF0dXMgKi8KKwlpbnQgaTsKKworCXN0YXR1cyA9IEJUX1NUQVRVUzsKKwlidC0+bm9uemVyb19zdGF0dXMgfD0gc3RhdHVzOworCisJaWYgKChidF9kZWJ1ZyAmIEJUX0RFQlVHX1NUQVRFUykgJiYgKGJ0LT5zdGF0ZSAhPSBidC0+bGFzdF9zdGF0ZSkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJUOiAlcyAlcyBUTz0lbGQgLSAlbGQgXG4iLAorCQkJU1RBVEUyVFhULAorCQkJU1RBVFVTMlRYVChidWYpLAorCQkJYnQtPnRpbWVvdXQsCisJCQl0aW1lKTsKKwlidC0+bGFzdF9zdGF0ZSA9IGJ0LT5zdGF0ZTsKKworCWlmIChidC0+c3RhdGUgPT0gQlRfU1RBVEVfSE9TRUQpIHJldHVybiBTSV9TTV9IT1NFRDsKKworCWlmIChidC0+c3RhdGUgIT0gQlRfU1RBVEVfSURMRSkgewkvKiBkbyB0aW1lb3V0IHRlc3QgKi8KKworCQkvKiBDZXJ0YWluIHN0YXRlcywgb24gZXJyb3IgY29uZGl0aW9ucywgY2FuIGxvY2sgdXAgYSBDUFUKKwkJICAgYmVjYXVzZSB0aGV5IGFyZSBlZmZlY3RpdmVseSBpbiBhbiBpbmZpbml0ZSBsb29wIHdpdGgKKwkJICAgQ0FMTF9XSVRIT1VUX0RFTEFZIChyaWdodCBiYWNrIGhlcmUgd2l0aCB0aW1lID09IDApLgorCQkgICBQcmV2ZW50IGluZmluaXRlIGxvY2t1cCBieSBBTFdBWVMgZGVjcmVtZW50aW5nIHRpbWVvdXQuICovCisKKyAgICAJLyogRklYTUU6IGJ0X2V2ZW50IGlzIHNvbWV0aW1lcyBjYWxsZWQgd2l0aCB0aW1lID4gQlRfTk9STUFMX1RJTUVPVVQKKyAgICAgICAgICAgICAgKG5vdGljZWQgaW4gaXBtaV9zbWljX3NtLmMgSmFudWFyeSAyMDA0KSAqLworCisJCWlmICgodGltZSA8PSAwKSB8fCAodGltZSA+PSBCVF9OT1JNQUxfVElNRU9VVCkpIHRpbWUgPSAxMDA7CisJCWJ0LT50aW1lb3V0IC09IHRpbWU7CisJCWlmICgoYnQtPnRpbWVvdXQgPCAwKSAmJiAoYnQtPnN0YXRlIDwgQlRfU1RBVEVfUkVTRVQxKSkgeworCQkJZXJyb3JfcmVjb3ZlcnkoYnQsICJ0aW1lZCBvdXQiKTsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVk7CisJCX0KKwl9CisKKwlzd2l0Y2ggKGJ0LT5zdGF0ZSkgeworCisgICAgCWNhc2UgQlRfU1RBVEVfSURMRToJLyogY2hlY2sgZm9yIGFzeW5jaHJvbm91cyBtZXNzYWdlcyAqLworCQlpZiAoc3RhdHVzICYgQlRfU01TX0FUTikgeworCQkJQlRfQ09OVFJPTChCVF9TTVNfQVROKTsJLyogY2xlYXIgaXQgKi8KKwkJCXJldHVybiBTSV9TTV9BVFROOworCQl9CisJCXJldHVybiBTSV9TTV9JRExFOworCisJY2FzZSBCVF9TVEFURV9YQUNUSU9OX1NUQVJUOgorCQlpZiAoc3RhdHVzICYgQlRfSF9CVVNZKSB7CisJCQlCVF9DT05UUk9MKEJUX0hfQlVTWSk7CisJCQlicmVhazsKKwkJfQorICAgIAkJaWYgKHN0YXR1cyAmIEJUX0IySF9BVE4pIGJyZWFrOworCQlidC0+c3RhdGUgPSBCVF9TVEFURV9XUklURV9CWVRFUzsKKwkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWTsJLyogZm9yIGxvZ2dpbmcgKi8KKworCWNhc2UgQlRfU1RBVEVfV1JJVEVfQllURVM6CisJCWlmIChzdGF0dXMgJiAoQlRfQl9CVVNZIHwgQlRfSDJCX0FUTikpIGJyZWFrOworCQlCVF9DT05UUk9MKEJUX0NMUl9XUl9QVFIpOworCQl3cml0ZV9hbGxfYnl0ZXMoYnQpOworCQlCVF9DT05UUk9MKEJUX0gyQl9BVE4pOwkvKiBjbGVhcnMgdG9vIGZhc3QgdG8gY2F0Y2g/ICovCisJCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX1dSSVRFX0NPTlNVTUU7CisJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVk7IC8qIGl0IE1JR0hUIHNhaWwgdGhyb3VnaCAqLworCisJY2FzZSBCVF9TVEFURV9XUklURV9DT05TVU1FOiAvKiBCTUNzIHVzdWFsbHkgYmxvdyByaWdodCB0aHJ1IGhlcmUgKi8KKyAgICAgICAgCWlmIChzdGF0dXMgJiAoQlRfSDJCX0FUTiB8IEJUX0JfQlVTWSkpIGJyZWFrOworCQlidC0+c3RhdGUgPSBCVF9TVEFURV9CMkhfV0FJVDsKKwkJLyogZmFsbCB0aHJvdWdoIHdpdGggc3RhdHVzICovCisKKwkvKiBTdGF5IGluIEJUX1NUQVRFX0IySF9XQUlUIHVudGlsIGEgcGFja2V0IG1hdGNoZXMuICBIb3dldmVyLCBzcGlubmluZworCSAgIGhhcmQgaGVyZSwgY29uc3RhbnRseSByZWFkaW5nIHN0YXR1cywgc2VlbXMgdG8gaG9sZCBvZmYgdGhlCisJICAgZ2VuZXJhdGlvbiBvZiBCMkhfQVROIHNvIEFMV0FZUyByZXR1cm4gQ0FMTF9XSVRIX0RFTEFZLiAqLworCisJY2FzZSBCVF9TVEFURV9CMkhfV0FJVDoKKyAgICAJCWlmICghKHN0YXR1cyAmIEJUX0IySF9BVE4pKSBicmVhazsKKworCQkvKiBBc3N1bWUgb3JkZXJlZCwgdW5jYWNoZWQgd3JpdGVzOiBubyBuZWVkIHRvIHdhaXQgKi8KKwkJaWYgKCEoc3RhdHVzICYgQlRfSF9CVVNZKSkgQlRfQ09OVFJPTChCVF9IX0JVU1kpOyAvKiBzZXQgKi8KKwkJQlRfQ09OVFJPTChCVF9CMkhfQVROKTsJCS8qIGNsZWFyIGl0LCBBQ0sgdG8gdGhlIEJNQyAqLworCQlCVF9DT05UUk9MKEJUX0NMUl9SRF9QVFIpOwkvKiByZXNldCB0aGUgcXVldWUgKi8KKwkJaSA9IHJlYWRfYWxsX2J5dGVzKGJ0KTsKKwkJQlRfQ09OVFJPTChCVF9IX0JVU1kpOwkJLyogY2xlYXIgKi8KKwkJaWYgKCFpKSBicmVhazsJCQkvKiBUcnkgdGhpcyBzdGF0ZSBhZ2FpbiAqLworCQlidC0+c3RhdGUgPSBCVF9TVEFURV9SRUFEX0VORDsKKwkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWTsJLyogZm9yIGxvZ2dpbmcgKi8KKworICAgIAljYXNlIEJUX1NUQVRFX1JFQURfRU5EOgorCisJCS8qIEkgY291bGQgd2FpdCBvbiBCVF9IX0JVU1kgdG8gZ28gY2xlYXIgZm9yIGEgdHJ1bHkgY2xlYW4KKwkJICAgZXhpdC4gIEhvd2V2ZXIsIHRoaXMgaXMgYWxyZWFkeSBkb25lIGluIFhBQ1RJT05fU1RBUlQKKwkJICAgYW5kIHRoZSAocG9zc2libGUpIGV4dHJhIGxvb3Avc3RhdHVzL3Bvc3NpYmxlIHdhaXQgYWZmZWN0cworCQkgICBwZXJmb3JtYW5jZS4gIFNvLCBhcyBsb25nIGFzIGl0IHdvcmtzLCBqdXN0IGlnbm9yZSBIX0JVU1kgKi8KKworI2lmZGVmIE1BS0VfVEhJU19UUlVFX0lGX05FQ0VTU0FSWQorCisJCWlmIChzdGF0dXMgJiBCVF9IX0JVU1kpIGJyZWFrOworI2VuZGlmCisJCWJ0LT5zZXErKzsKKwkJYnQtPnN0YXRlID0gQlRfU1RBVEVfSURMRTsKKwkJcmV0dXJuIFNJX1NNX1RSQU5TQUNUSU9OX0NPTVBMRVRFOworCisJY2FzZSBCVF9TVEFURV9SRVNFVDE6CisgICAgCQlyZXNldF9mbGFncyhidCk7CisgICAgCQlidC0+dGltZW91dCA9IEJUX1JFU0VUX0RFTEFZOworCQlidC0+c3RhdGUgPSBCVF9TVEFURV9SRVNFVDI7CisJCWJyZWFrOworCisJY2FzZSBCVF9TVEFURV9SRVNFVDI6CQkvKiBTZW5kIGEgc29mdCByZXNldCAqLworCQlCVF9DT05UUk9MKEJUX0NMUl9XUl9QVFIpOworCQlIT1NUMkJNQygzKTsJCS8qIG51bWJlciBvZiBieXRlcyBmb2xsb3dpbmcgKi8KKwkJSE9TVDJCTUMoMHgxOCk7CQkvKiBOZXRGbi9MVU4gPT0gQXBwbGljYXRpb24sIExVTiAwICovCisJCUhPU1QyQk1DKDQyKTsJCS8qIFNlcXVlbmNlIG51bWJlciAqLworCQlIT1NUMkJNQygzKTsJCS8qIENtZCA9PSBTb2Z0IHJlc2V0ICovCisJCUJUX0NPTlRST0woQlRfSDJCX0FUTik7CisJCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX1JFU0VUMzsKKwkJYnJlYWs7CisKKwljYXNlIEJUX1NUQVRFX1JFU0VUMzoKKwkJaWYgKGJ0LT50aW1lb3V0ID4gMCkgcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKwkJYnQtPnN0YXRlID0gQlRfU1RBVEVfUkVTVEFSVDsJLyogcHJpbnRrIGluIGRlYnVnIG1vZGVzICovCisJCWJyZWFrOworCisJY2FzZSBCVF9TVEFURV9SRVNUQVJUOgkJLyogZG9uJ3QgcmVzZXQgcmV0cmllcyEgKi8KKwkJYnQtPndyaXRlX2RhdGFbMl0gPSArK2J0LT5zZXE7CisJCWJ0LT5yZWFkX2NvdW50ID0gMDsKKwkJYnQtPm5vbnplcm9fc3RhdHVzID0gMDsKKwkJYnQtPnRpbWVvdXQgPSBCVF9OT1JNQUxfVElNRU9VVDsKKwkJYnQtPnN0YXRlID0gQlRfU1RBVEVfWEFDVElPTl9TVEFSVDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkvKiBIT1NFRCBpcyBzdXBwb3NlZCB0byBiZSBjYXVnaHQgbXVjaCBlYXJsaWVyICovCisJCWVycm9yX3JlY292ZXJ5KGJ0LCAiaW50ZXJuYWwgbG9naWMgZXJyb3IiKTsKKwkJYnJlYWs7CisgIAl9CisgIAlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworfQorCitzdGF0aWMgaW50IGJ0X2RldGVjdChzdHJ1Y3Qgc2lfc21fZGF0YSAqYnQpCit7CisJLyogSXQncyBpbXBvc3NpYmxlIGZvciB0aGUgQlQgc3RhdHVzIGFuZCBpbnRlcnJ1cHQgcmVnaXN0ZXJzIHRvIGJlCisJICAgYWxsIDEncywgKGFzc3VtaW5nIGEgcHJvcGVybHkgZnVuY3Rpb25pbmcsIHNlbGYtaW5pdGlhbGl6ZWQgQk1DKQorCSAgIGJ1dCB0aGF0J3Mgd2hhdCB5b3UgZ2V0IGZyb20gcmVhZGluZyBhIGJvZ3VzIGFkZHJlc3MsIHNvIHdlCisJICAgdGVzdCB0aGF0IGZpcnN0LiAgVGhlIGNhbGxpbmcgcm91dGluZSB1c2VzIG5lZ2F0aXZlIGxvZ2ljLiAqLworCisJaWYgKChCVF9TVEFUVVMgPT0gMHhGRikgJiYgKEJUX0lOVE1BU0tfUiA9PSAweEZGKSkgcmV0dXJuIDE7CisJcmVzZXRfZmxhZ3MoYnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBidF9jbGVhbnVwKHN0cnVjdCBzaV9zbV9kYXRhICpidCkKK3sKK30KKworc3RhdGljIGludCBidF9zaXplKHZvaWQpCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3Qgc2lfc21fZGF0YSk7Cit9CisKK3N0cnVjdCBzaV9zbV9oYW5kbGVycyBidF9zbWlfaGFuZGxlcnMgPQoreworCS52ZXJzaW9uICAgICAgICAgICA9IElQTUlfQlRfVkVSU0lPTiwKKwkuaW5pdF9kYXRhICAgICAgICAgPSBidF9pbml0X2RhdGEsCisJLnN0YXJ0X3RyYW5zYWN0aW9uID0gYnRfc3RhcnRfdHJhbnNhY3Rpb24sCisJLmdldF9yZXN1bHQgICAgICAgID0gYnRfZ2V0X3Jlc3VsdCwKKwkuZXZlbnQgICAgICAgICAgICAgPSBidF9ldmVudCwKKwkuZGV0ZWN0ICAgICAgICAgICAgPSBidF9kZXRlY3QsCisJLmNsZWFudXAgICAgICAgICAgID0gYnRfY2xlYW51cCwKKwkuc2l6ZSAgICAgICAgICAgICAgPSBidF9zaXplLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfZGV2aW50Zi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9kZXZpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkNjdmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfZGV2aW50Zi5jCkBAIC0wLDAgKzEsNTgyIEBACisvKgorICogaXBtaV9kZXZpbnRmLmMKKyAqCisgKiBMaW51eCBkZXZpY2UgaW50ZXJmYWNlIGZvciB0aGUgSVBNSSBtZXNzYWdlIGhhbmRsZXIuCisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIENvcmV5IE1pbnlhcmQgPG1pbnlhcmRAbXZpc3RhLmNvbT4KKyAqICAgICAgICAgc291cmNlQG12aXN0YS5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICogIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAqICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiAgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pcG1pLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2RlZmluZSBJUE1JX0RFVklOVEZfVkVSU0lPTiAidjMzIgorCitzdHJ1Y3QgaXBtaV9maWxlX3ByaXZhdGUKK3sKKwlpcG1pX3VzZXJfdCAgICAgICAgICB1c2VyOworCXNwaW5sb2NrX3QgICAgICAgICAgIHJlY3ZfbXNnX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgcmVjdl9tc2dzOworCXN0cnVjdCBmaWxlICAgICAgICAgICpmaWxlOworCXN0cnVjdCBmYXN5bmNfc3RydWN0ICpmYXN5bmNfcXVldWU7CisJd2FpdF9xdWV1ZV9oZWFkX3QgICAgd2FpdDsKKwlzdHJ1Y3Qgc2VtYXBob3JlICAgICByZWN2X3NlbTsKKwlpbnQgICAgICAgICAgICAgICAgICBkZWZhdWx0X3JldHJpZXM7CisJdW5zaWduZWQgaW50ICAgICAgICAgZGVmYXVsdF9yZXRyeV90aW1lX21zOworfTsKKworc3RhdGljIHZvaWQgZmlsZV9yZWNlaXZlX2hhbmRsZXIoc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZywKKwkJCQkgdm9pZCAgICAgICAgICAgICAgICAgKmhhbmRsZXJfZGF0YSkKK3sKKwlzdHJ1Y3QgaXBtaV9maWxlX3ByaXZhdGUgKnByaXYgPSBoYW5kbGVyX2RhdGE7CisJaW50ICAgICAgICAgICAgICAgICAgICAgIHdhc19lbXB0eTsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHByaXYtPnJlY3ZfbXNnX2xvY2spLCBmbGFncyk7CisKKwl3YXNfZW1wdHkgPSBsaXN0X2VtcHR5KCYocHJpdi0+cmVjdl9tc2dzKSk7CisJbGlzdF9hZGRfdGFpbCgmKG1zZy0+bGluayksICYocHJpdi0+cmVjdl9tc2dzKSk7CisKKwlpZiAod2FzX2VtcHR5KSB7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+d2FpdCk7CisJCWtpbGxfZmFzeW5jKCZwcml2LT5mYXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocHJpdi0+cmVjdl9tc2dfbG9jayksIGZsYWdzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpcG1pX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGlwbWlfZmlsZV9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICBtYXNrID0gMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgZmxhZ3M7CisKKwlwb2xsX3dhaXQoZmlsZSwgJnByaXYtPndhaXQsIHdhaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlY3ZfbXNnX2xvY2ssIGZsYWdzKTsKKworCWlmICghIGxpc3RfZW1wdHkoJihwcml2LT5yZWN2X21zZ3MpKSkKKwkJbWFzayB8PSAoUE9MTElOIHwgUE9MTFJETk9STSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWN2X21zZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBpcG1pX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pCit7CisJc3RydWN0IGlwbWlfZmlsZV9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ7CisKKwlyZXN1bHQgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJnByaXYtPmZhc3luY19xdWV1ZSk7CisKKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBtaV91c2VyX2huZGwgaXBtaV9obmRscnMgPQoreworCS5pcG1pX3JlY3ZfaG5kbAk9IGZpbGVfcmVjZWl2ZV9oYW5kbGVyLAorfTsKKworc3RhdGljIGludCBpcG1pX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50ICAgICAgICAgICAgICAgICAgICAgIGlmX251bSA9IGltaW5vcihpbm9kZSk7CisJaW50ICAgICAgICAgICAgICAgICAgICAgIHJ2OworCXN0cnVjdCBpcG1pX2ZpbGVfcHJpdmF0ZSAqcHJpdjsKKworCisJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPmZpbGUgPSBmaWxlOworCisJcnYgPSBpcG1pX2NyZWF0ZV91c2VyKGlmX251bSwKKwkJCSAgICAgICZpcG1pX2huZGxycywKKwkJCSAgICAgIHByaXYsCisJCQkgICAgICAmKHByaXYtPnVzZXIpKTsKKwlpZiAocnYpIHsKKwkJa2ZyZWUocHJpdik7CisJCXJldHVybiBydjsKKwl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBwcml2OworCisJc3Bpbl9sb2NrX2luaXQoJihwcml2LT5yZWN2X21zZ19sb2NrKSk7CisJSU5JVF9MSVNUX0hFQUQoJihwcml2LT5yZWN2X21zZ3MpKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT53YWl0KTsKKwlwcml2LT5mYXN5bmNfcXVldWUgPSBOVUxMOworCXNlbWFfaW5pdCgmKHByaXYtPnJlY3Zfc2VtKSwgMSk7CisKKwkvKiBVc2UgdGhlIGxvdy1sZXZlbCBkZWZhdWx0cy4gKi8KKwlwcml2LT5kZWZhdWx0X3JldHJpZXMgPSAtMTsKKwlwcml2LT5kZWZhdWx0X3JldHJ5X3RpbWVfbXMgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBtaV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBpcG1pX2ZpbGVfcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgcnY7CisKKwlydiA9IGlwbWlfZGVzdHJveV91c2VyKHByaXYtPnVzZXIpOworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCisJaXBtaV9mYXN5bmMgKC0xLCBmaWxlLCAwKTsKKworCS8qIEZJWE1FIC0gZnJlZSB0aGUgbWVzc2FnZXMgaW4gdGhlIGxpc3QuICovCisJa2ZyZWUocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfc2VuZF9yZXEoaXBtaV91c2VyX3QgICAgIHVzZXIsCisJCQkgICBzdHJ1Y3QgaXBtaV9yZXEgKnJlcSwKKwkJCSAgIGludCAgICAgICAgICAgICByZXRyaWVzLAorCQkJICAgdW5zaWduZWQgaW50ICAgIHJldHJ5X3RpbWVfbXMpCit7CisJaW50ICAgICAgICAgICAgICBydjsKKwlzdHJ1Y3QgaXBtaV9hZGRyIGFkZHI7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyBtc2c7CisKKwlpZiAocmVxLT5hZGRyX2xlbiA+IHNpemVvZihzdHJ1Y3QgaXBtaV9hZGRyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmFkZHIsIHJlcS0+YWRkciwgcmVxLT5hZGRyX2xlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJbXNnLm5ldGZuID0gcmVxLT5tc2cubmV0Zm47CisJbXNnLmNtZCA9IHJlcS0+bXNnLmNtZDsKKwltc2cuZGF0YV9sZW4gPSByZXEtPm1zZy5kYXRhX2xlbjsKKwltc2cuZGF0YSA9IGttYWxsb2MoSVBNSV9NQVhfTVNHX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc2cuZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBGcm9tIGhlcmUgb3V0IHdlIGNhbm5vdCByZXR1cm4sIHdlIG11c3QganVtcCB0byAib3V0IiBmb3IKKwkgICBlcnJvciBleGl0cyB0byBmcmVlIG1zZ2RhdGEuICovCisKKwlydiA9IGlwbWlfdmFsaWRhdGVfYWRkcigmYWRkciwgcmVxLT5hZGRyX2xlbik7CisJaWYgKHJ2KQorCQlnb3RvIG91dDsKKworCWlmIChyZXEtPm1zZy5kYXRhICE9IE5VTEwpIHsKKwkJaWYgKHJlcS0+bXNnLmRhdGFfbGVuID4gSVBNSV9NQVhfTVNHX0xFTkdUSCkgeworCQkJcnYgPSAtRU1TR1NJWkU7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcihtc2cuZGF0YSwKKwkJCQkgICByZXEtPm1zZy5kYXRhLAorCQkJCSAgIHJlcS0+bXNnLmRhdGFfbGVuKSkKKwkJeworCQkJcnYgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQltc2cuZGF0YV9sZW4gPSAwOworCX0KKworCXJ2ID0gaXBtaV9yZXF1ZXN0X3NldHRpbWUodXNlciwKKwkJCQkgICZhZGRyLAorCQkJCSAgcmVxLT5tc2dpZCwKKwkJCQkgICZtc2csCisJCQkJICBOVUxMLAorCQkJCSAgMCwKKwkJCQkgIHJldHJpZXMsCisJCQkJICByZXRyeV90aW1lX21zKTsKKyBvdXQ6CisJa2ZyZWUobXNnLmRhdGEpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBpcG1pX2lvY3RsKHN0cnVjdCBpbm9kZSAgKmlub2RlLAorCQkgICAgICBzdHJ1Y3QgZmlsZSAgICpmaWxlLAorCQkgICAgICB1bnNpZ25lZCBpbnQgIGNtZCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBkYXRhKQoreworCWludCAgICAgICAgICAgICAgICAgICAgICBydiA9IC1FSU5WQUw7CisJc3RydWN0IGlwbWlfZmlsZV9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXZvaWQgX191c2VyICphcmcgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCisJc3dpdGNoIChjbWQpIAorCXsKKwljYXNlIElQTUlDVExfU0VORF9DT01NQU5EOgorCXsKKwkJc3RydWN0IGlwbWlfcmVxIHJlcTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJlcSwgYXJnLCBzaXplb2YocmVxKSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJcnYgPSBoYW5kbGVfc2VuZF9yZXEocHJpdi0+dXNlciwKKwkJCQkgICAgICZyZXEsCisJCQkJICAgICBwcml2LT5kZWZhdWx0X3JldHJpZXMsCisJCQkJICAgICBwcml2LT5kZWZhdWx0X3JldHJ5X3RpbWVfbXMpOworCQlicmVhazsKKwl9CisKKwljYXNlIElQTUlDVExfU0VORF9DT01NQU5EX1NFVFRJTUU6CisJeworCQlzdHJ1Y3QgaXBtaV9yZXFfc2V0dGltZSByZXE7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEsIGFyZywgc2l6ZW9mKHJlcSkpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXJ2ID0gaGFuZGxlX3NlbmRfcmVxKHByaXYtPnVzZXIsCisJCQkJICAgICAmcmVxLnJlcSwKKwkJCQkgICAgIHJlcS5yZXRyaWVzLAorCQkJCSAgICAgcmVxLnJldHJ5X3RpbWVfbXMpOworCQlicmVhazsKKwl9CisKKwljYXNlIElQTUlDVExfUkVDRUlWRV9NU0c6CisJY2FzZSBJUE1JQ1RMX1JFQ0VJVkVfTVNHX1RSVU5DOgorCXsKKwkJc3RydWN0IGlwbWlfcmVjdiAgICAgIHJzcDsKKwkJaW50ICAgICAgICAgICAgICBhZGRyX2xlbjsKKwkJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJCXN0cnVjdCBpcG1pX3JlY3ZfbXNnICAqbXNnOworCQl1bnNpZ25lZCBsb25nICAgIGZsYWdzOworCQkKKworCQlydiA9IDA7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcnNwLCBhcmcsIHNpemVvZihyc3ApKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBXZSBjbGFpbSBhIHNlbWFwaG9yZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdHdvCisgICAgICAgICAgICAgICAgICAgdXNlcnMgZ2V0dGluZyBzb21ldGhpbmcgZnJvbSB0aGUgcXVldWUgYXQgYSB0aW1lLgorICAgICAgICAgICAgICAgICAgIFNpbmNlIHdlIGhhdmUgdG8gcmVsZWFzZSB0aGUgc3BpbmxvY2sgYmVmb3JlIHdlIGNhbgorICAgICAgICAgICAgICAgICAgIGNvcHkgdGhlIGRhdGEgdG8gdGhlIHVzZXIsIGl0J3MgcG9zc2libGUgYW5vdGhlcgorICAgICAgICAgICAgICAgICAgIHVzZXIgd2lsbCBncmFiIHNvbWV0aGluZyBmcm9tIHRoZSBxdWV1ZSwgdG9vLiAgVGhlbgorICAgICAgICAgICAgICAgICAgIHRoZSBtZXNzYWdlcyBtaWdodCBnZXQgb3V0IG9mIG9yZGVyIGlmIHNvbWV0aGluZworICAgICAgICAgICAgICAgICAgIGZhaWxzIGFuZCB0aGUgbWVzc2FnZSBnZXRzIHB1dCBiYWNrIG9udG8gdGhlCisgICAgICAgICAgICAgICAgICAgcXVldWUuICBUaGlzIHNlbWFwaG9yZSBwcmV2ZW50cyB0aGF0IHByb2JsZW0uICovCisJCWRvd24oJihwcml2LT5yZWN2X3NlbSkpOworCisJCS8qIEdyYWIgdGhlIG1lc3NhZ2Ugb2ZmIHRoZSBsaXN0LiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmKHByaXYtPnJlY3ZfbXNnX2xvY2spLCBmbGFncyk7CisJCWlmIChsaXN0X2VtcHR5KCYocHJpdi0+cmVjdl9tc2dzKSkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwcml2LT5yZWN2X21zZ19sb2NrKSwgZmxhZ3MpOworCQkJcnYgPSAtRUFHQUlOOworCQkJZ290byByZWN2X2VycjsKKwkJfQorCQllbnRyeSA9IHByaXYtPnJlY3ZfbXNncy5uZXh0OworCQltc2cgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgaXBtaV9yZWN2X21zZywgbGluayk7CisJCWxpc3RfZGVsKGVudHJ5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHByaXYtPnJlY3ZfbXNnX2xvY2spLCBmbGFncyk7CisKKwkJYWRkcl9sZW4gPSBpcG1pX2FkZHJfbGVuZ3RoKG1zZy0+YWRkci5hZGRyX3R5cGUpOworCQlpZiAocnNwLmFkZHJfbGVuIDwgYWRkcl9sZW4pCisJCXsKKwkJCXJ2ID0gLUVJTlZBTDsKKwkJCWdvdG8gcmVjdl9wdXRiYWNrX29uX2VycjsKKwkJfQorCisJCWlmIChjb3B5X3RvX3VzZXIocnNwLmFkZHIsICYobXNnLT5hZGRyKSwgYWRkcl9sZW4pKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlnb3RvIHJlY3ZfcHV0YmFja19vbl9lcnI7CisJCX0KKwkJcnNwLmFkZHJfbGVuID0gYWRkcl9sZW47CisKKwkJcnNwLnJlY3ZfdHlwZSA9IG1zZy0+cmVjdl90eXBlOworCQlyc3AubXNnaWQgPSBtc2ctPm1zZ2lkOworCQlyc3AubXNnLm5ldGZuID0gbXNnLT5tc2cubmV0Zm47CisJCXJzcC5tc2cuY21kID0gbXNnLT5tc2cuY21kOworCisJCWlmIChtc2ctPm1zZy5kYXRhX2xlbiA+IDApIHsKKwkJCWlmIChyc3AubXNnLmRhdGFfbGVuIDwgbXNnLT5tc2cuZGF0YV9sZW4pIHsKKwkJCQlydiA9IC1FTVNHU0laRTsKKwkJCQlpZiAoY21kID09IElQTUlDVExfUkVDRUlWRV9NU0dfVFJVTkMpIHsKKwkJCQkJbXNnLT5tc2cuZGF0YV9sZW4gPSByc3AubXNnLmRhdGFfbGVuOworCQkJCX0gZWxzZSB7CisJCQkJCWdvdG8gcmVjdl9wdXRiYWNrX29uX2VycjsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChjb3B5X3RvX3VzZXIocnNwLm1zZy5kYXRhLAorCQkJCQkgbXNnLT5tc2cuZGF0YSwKKwkJCQkJIG1zZy0+bXNnLmRhdGFfbGVuKSkKKwkJCXsKKwkJCQlydiA9IC1FRkFVTFQ7CisJCQkJZ290byByZWN2X3B1dGJhY2tfb25fZXJyOworCQkJfQorCQkJcnNwLm1zZy5kYXRhX2xlbiA9IG1zZy0+bXNnLmRhdGFfbGVuOworCQl9IGVsc2UgeworCQkJcnNwLm1zZy5kYXRhX2xlbiA9IDA7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKGFyZywgJnJzcCwgc2l6ZW9mKHJzcCkpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlnb3RvIHJlY3ZfcHV0YmFja19vbl9lcnI7CisJCX0KKworCQl1cCgmKHByaXYtPnJlY3Zfc2VtKSk7CisJCWlwbWlfZnJlZV9yZWN2X21zZyhtc2cpOworCQlicmVhazsKKworCXJlY3ZfcHV0YmFja19vbl9lcnI6CisJCS8qIElmIHdlIGdvdCBhbiBlcnJvciwgcHV0IHRoZSBtZXNzYWdlIGJhY2sgb250bworCQkgICB0aGUgaGVhZCBvZiB0aGUgcXVldWUuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCYocHJpdi0+cmVjdl9tc2dfbG9jayksIGZsYWdzKTsKKwkJbGlzdF9hZGQoZW50cnksICYocHJpdi0+cmVjdl9tc2dzKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwcml2LT5yZWN2X21zZ19sb2NrKSwgZmxhZ3MpOworCQl1cCgmKHByaXYtPnJlY3Zfc2VtKSk7CisJCWJyZWFrOworCisJcmVjdl9lcnI6CisJCXVwKCYocHJpdi0+cmVjdl9zZW0pKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJUE1JQ1RMX1JFR0lTVEVSX0ZPUl9DTUQ6CisJeworCQlzdHJ1Y3QgaXBtaV9jbWRzcGVjIHZhbDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJnLCBzaXplb2YodmFsKSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJcnYgPSBpcG1pX3JlZ2lzdGVyX2Zvcl9jbWQocHJpdi0+dXNlciwgdmFsLm5ldGZuLCB2YWwuY21kKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJUE1JQ1RMX1VOUkVHSVNURVJfRk9SX0NNRDoKKwl7CisJCXN0cnVjdCBpcG1pX2NtZHNwZWMgICB2YWw7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZywgc2l6ZW9mKHZhbCkpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXJ2ID0gaXBtaV91bnJlZ2lzdGVyX2Zvcl9jbWQocHJpdi0+dXNlciwgdmFsLm5ldGZuLCB2YWwuY21kKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJUE1JQ1RMX1NFVF9HRVRTX0VWRU5UU19DTUQ6CisJeworCQlpbnQgdmFsOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmcsIHNpemVvZih2YWwpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlydiA9IGlwbWlfc2V0X2dldHNfZXZlbnRzKHByaXYtPnVzZXIsIHZhbCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgSVBNSUNUTF9TRVRfTVlfQUREUkVTU19DTUQ6CisJeworCQl1bnNpZ25lZCBpbnQgdmFsOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmcsIHNpemVvZih2YWwpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpcG1pX3NldF9teV9hZGRyZXNzKHByaXYtPnVzZXIsIHZhbCk7CisJCXJ2ID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJUE1JQ1RMX0dFVF9NWV9BRERSRVNTX0NNRDoKKwl7CisJCXVuc2lnbmVkIGludCB2YWw7CisKKwkJdmFsID0gaXBtaV9nZXRfbXlfYWRkcmVzcyhwcml2LT51c2VyKTsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlydiA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgSVBNSUNUTF9TRVRfTVlfTFVOX0NNRDoKKwl7CisJCXVuc2lnbmVkIGludCB2YWw7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZywgc2l6ZW9mKHZhbCkpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlwbWlfc2V0X215X0xVTihwcml2LT51c2VyLCB2YWwpOworCQlydiA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgSVBNSUNUTF9HRVRfTVlfTFVOX0NNRDoKKwl7CisJCXVuc2lnbmVkIGludCB2YWw7CisKKwkJdmFsID0gaXBtaV9nZXRfbXlfTFVOKHByaXYtPnVzZXIpOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJ2ID0gMDsKKwkJYnJlYWs7CisJfQorCWNhc2UgSVBNSUNUTF9TRVRfVElNSU5HX1BBUk1TX0NNRDoKKwl7CisJCXN0cnVjdCBpcG1pX3RpbWluZ19wYXJtcyBwYXJtczsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnBhcm1zLCBhcmcsIHNpemVvZihwYXJtcykpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXByaXYtPmRlZmF1bHRfcmV0cmllcyA9IHBhcm1zLnJldHJpZXM7CisJCXByaXYtPmRlZmF1bHRfcmV0cnlfdGltZV9tcyA9IHBhcm1zLnJldHJ5X3RpbWVfbXM7CisJCXJ2ID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJUE1JQ1RMX0dFVF9USU1JTkdfUEFSTVNfQ01EOgorCXsKKwkJc3RydWN0IGlwbWlfdGltaW5nX3Bhcm1zIHBhcm1zOworCisJCXBhcm1zLnJldHJpZXMgPSBwcml2LT5kZWZhdWx0X3JldHJpZXM7CisJCXBhcm1zLnJldHJ5X3RpbWVfbXMgPSBwcml2LT5kZWZhdWx0X3JldHJ5X3RpbWVfbXM7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZwYXJtcywgc2l6ZW9mKHBhcm1zKSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJcnYgPSAwOworCQlicmVhazsKKwl9CisJfQorICAKKwlyZXR1cm4gcnY7Cit9CisKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXBtaV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW9jdGwJCT0gaXBtaV9pb2N0bCwKKwkub3BlbgkJPSBpcG1pX29wZW4sCisJLnJlbGVhc2UJPSBpcG1pX3JlbGVhc2UsCisJLmZhc3luYwkJPSBpcG1pX2Zhc3luYywKKwkucG9sbAkJPSBpcG1pX3BvbGwsCit9OworCisjZGVmaW5lIERFVklDRV9OQU1FICAgICAiaXBtaWRldiIKKworc3RhdGljIGludCBpcG1pX21ham9yID0gMDsKK21vZHVsZV9wYXJhbShpcG1pX21ham9yLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcG1pX21ham9yLCAiU2V0cyB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSBJUE1JIGRldmljZS4gIEJ5IgorCQkgIiBkZWZhdWx0LCBvciBpZiB5b3Ugc2V0IGl0IHRvIHplcm8sIGl0IHdpbGwgY2hvb3NlIHRoZSBuZXh0IgorCQkgIiBhdmFpbGFibGUgZGV2aWNlLiAgU2V0dGluZyBpdCB0byAtMSB3aWxsIGRpc2FibGUgdGhlIgorCQkgIiBpbnRlcmZhY2UuICBPdGhlciB2YWx1ZXMgd2lsbCBzZXQgdGhlIG1ham9yIGRldmljZSBudW1iZXIiCisJCSAiIHRvIHRoYXQgdmFsdWUuIik7CisKK3N0YXRpYyB2b2lkIGlwbWlfbmV3X3NtaShpbnQgaWZfbnVtKQoreworCWRldmZzX21rX2NkZXYoTUtERVYoaXBtaV9tYWpvciwgaWZfbnVtKSwKKwkJICAgICAgU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAorCQkgICAgICAiaXBtaWRldi8lZCIsIGlmX251bSk7Cit9CisKK3N0YXRpYyB2b2lkIGlwbWlfc21pX2dvbmUoaW50IGlmX251bSkKK3sKKwlkZXZmc19yZW1vdmUoImlwbWlkZXYvJWQiLCBpZl9udW0pOworfQorCitzdGF0aWMgc3RydWN0IGlwbWlfc21pX3dhdGNoZXIgc21pX3dhdGNoZXIgPQoreworCS5vd25lciAgICA9IFRISVNfTU9EVUxFLAorCS5uZXdfc21pICA9IGlwbWlfbmV3X3NtaSwKKwkuc21pX2dvbmUgPSBpcG1pX3NtaV9nb25lLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgaW5pdF9pcG1pX2RldmludGYodm9pZCkKK3sKKwlpbnQgcnY7CisKKwlpZiAoaXBtaV9tYWpvciA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcHJpbnRrKEtFUk5fSU5GTyAiaXBtaSBkZXZpY2UgaW50ZXJmYWNlIHZlcnNpb24gIgorCSAgICAgICBJUE1JX0RFVklOVEZfVkVSU0lPTiAiXG4iKTsKKworCXJ2ID0gcmVnaXN0ZXJfY2hyZGV2KGlwbWlfbWFqb3IsIERFVklDRV9OQU1FLCAmaXBtaV9mb3BzKTsKKwlpZiAocnYgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXBtaTogY2FuJ3QgZ2V0IG1ham9yICVkXG4iLCBpcG1pX21ham9yKTsKKwkJcmV0dXJuIHJ2OworCX0KKworCWlmIChpcG1pX21ham9yID09IDApIHsKKwkJaXBtaV9tYWpvciA9IHJ2OworCX0KKworCWRldmZzX21rX2RpcihERVZJQ0VfTkFNRSk7CisKKwlydiA9IGlwbWlfc21pX3dhdGNoZXJfcmVnaXN0ZXIoJnNtaV93YXRjaGVyKTsKKwlpZiAocnYpIHsKKwkJdW5yZWdpc3Rlcl9jaHJkZXYoaXBtaV9tYWpvciwgREVWSUNFX05BTUUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpcG1pOiBjYW4ndCByZWdpc3RlciBzbWkgd2F0Y2hlclxuIik7CisJCXJldHVybiBydjsKKwl9CisKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGluaXRfaXBtaV9kZXZpbnRmKTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGNsZWFudXBfaXBtaSh2b2lkKQoreworCWlwbWlfc21pX3dhdGNoZXJfdW5yZWdpc3Rlcigmc21pX3dhdGNoZXIpOworCWRldmZzX3JlbW92ZShERVZJQ0VfTkFNRSk7CisJdW5yZWdpc3Rlcl9jaHJkZXYoaXBtaV9tYWpvciwgREVWSUNFX05BTUUpOworfQorbW9kdWxlX2V4aXQoY2xlYW51cF9pcG1pKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9rY3Nfc20uYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfa2NzX3NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjY2UyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfa2NzX3NtLmMKQEAgLTAsMCArMSw1MDAgQEAKKy8qCisgKiBpcG1pX2tjc19zbS5jCisgKgorICogU3RhdGUgbWFjaGluZSBmb3IgaGFuZGxpbmcgSVBNSSBLQ1MgaW50ZXJmYWNlcy4KKyAqCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgQ29yZXkgTWlueWFyZCA8bWlueWFyZEBtdmlzdGEuY29tPgorICogICAgICAgICBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAyIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgKiAgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorICogIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqICBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qCisgKiBUaGlzIHN0YXRlIG1hY2hpbmUgaXMgdGFrZW4gZnJvbSB0aGUgc3RhdGUgbWFjaGluZSBpbiB0aGUgSVBNSSBzcGVjLAorICogcHJldHR5IG11Y2ggdmVyYmF0aW0uICBJZiB5b3UgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgdGhlIHN0YXRlcywgc2VlCisgKiB0aGF0IGRvY3VtZW50LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4gLyogRm9yIHByaW50ay4gKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pcG1pX21zZ2RlZnMuaD4JCS8qIGZvciBjb21wbGV0aW9uIGNvZGVzICovCisjaW5jbHVkZSAiaXBtaV9zaV9zbS5oIgorCisjZGVmaW5lIElQTUlfS0NTX1ZFUlNJT04gInYzMyIKKworLyogU2V0IHRoaXMgaWYgeW91IHdhbnQgYSBwcmludG91dCBvZiB3aHkgdGhlIHN0YXRlIG1hY2hpbmUgd2FzIGhvc2VkCisgICB3aGVuIGl0IGdldHMgaG9zZWQuICovCisjZGVmaW5lIERFQlVHX0hPU0VEX1JFQVNPTgorCisvKiBQcmludCB0aGUgc3RhdGUgbWFjaGluZSBzdGF0ZSBvbiBlbnRyeSBldmVyeSB0aW1lLiAqLworI3VuZGVmIERFQlVHX1NUQVRFCisKKy8qIFRoZSBzdGF0ZXMgdGhlIEtDUyBkcml2ZXIgbWF5IGJlIGluLiAqLworZW51bSBrY3Nfc3RhdGVzIHsKKwlLQ1NfSURMRSwJCS8qIFRoZSBLQ1MgaW50ZXJmYWNlIGlzIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2luZyBub3RoaW5nLiAqLworCUtDU19TVEFSVF9PUCwJCS8qIFdlIGFyZSBzdGFydGluZyBhbiBvcGVyYXRpb24uICBUaGUKKwkJCQkgICBkYXRhIGlzIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBidXQKKwkJCQkgICBub3RoaW5nIGhhcyBiZWVuIGRvbmUgdG8gdGhlCisJCQkJICAgaW50ZXJmYWNlIHlldC4gIFRoaXMgd2FzIGFkZGVkIHRvCisJCQkJICAgdGhlIHN0YXRlIG1hY2hpbmUgaW4gdGhlIHNwZWMgdG8KKwkJCQkgICB3YWl0IGZvciB0aGUgaW5pdGlhbCBJQkYuICovCisJS0NTX1dBSVRfV1JJVEVfU1RBUlQsCS8qIFdlIGhhdmUgd3JpdHRlbiBhIHdyaXRlIGNtZCB0byB0aGUKKwkJCQkgICBpbnRlcmZhY2UuICovCisJS0NTX1dBSVRfV1JJVEUsCQkvKiBXZSBhcmUgd3JpdGluZyBieXRlcyB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLiAqLworCUtDU19XQUlUX1dSSVRFX0VORCwJLyogV2UgaGF2ZSB3cml0dGVuIHRoZSB3cml0ZSBlbmQgY21kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBpbnRlcmZhY2UsIGFuZCBzdGlsbCBuZWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIHRoZSBsYXN0IGJ5dGUuICovCisJS0NTX1dBSVRfUkVBRCwJCS8qIFdlIGFyZSB3YWl0aW5nIHRvIHJlYWQgZGF0YSBmcm9tCisJCQkJICAgdGhlIGludGVyZmFjZS4gKi8KKwlLQ1NfRVJST1IwLAkJLyogU3RhdGUgdG8gdHJhbnNpdGlvbiB0byB0aGUgZXJyb3IKKwkJCQkgICBoYW5kbGVyLCB0aGlzIHdhcyBhZGRlZCB0byB0aGUKKwkJCQkgICBzdGF0ZSBtYWNoaW5lIGluIHRoZSBzcGVjIHRvIGJlCisJCQkJICAgc3VyZSBJQkYgd2FzIHRoZXJlLiAqLworCUtDU19FUlJPUjEsCQkvKiBGaXJzdCBzdGFnZSBlcnJvciBoYW5kbGVyLCB3YWl0IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJmYWNlIHRvIHJlc3BvbmQuICovCisJS0NTX0VSUk9SMiwJCS8qIFRoZSBhYm9ydCBjbWQgaGFzIGJlZW4gd3JpdHRlbiwKKwkJCQkgICB3YWl0IGZvciB0aGUgaW50ZXJmYWNlIHRvCisJCQkJICAgcmVzcG9uZC4gKi8KKwlLQ1NfRVJST1IzLAkJLyogV2Ugd3JvdGUgc29tZSBkYXRhIHRvIHRoZQorCQkJCSAgIGludGVyZmFjZSwgd2FpdCBmb3IgaXQgdG8gc3dpdGNoIHRvCisJCQkJICAgcmVhZCBtb2RlLiAqLworCUtDU19IT1NFRAkJLyogVGhlIGhhcmR3YXJlIGZhaWxlZCB0byBmb2xsb3cgdGhlCisJCQkJICAgc3RhdGUgbWFjaGluZS4gKi8KK307CisKKyNkZWZpbmUgTUFYX0tDU19SRUFEX1NJWkUgODAKKyNkZWZpbmUgTUFYX0tDU19XUklURV9TSVpFIDgwCisKKy8qIFRpbWVvdXRzIGluIG1pY3Jvc2Vjb25kcy4gKi8KKyNkZWZpbmUgSUJGX1JFVFJZX1RJTUVPVVQgMTAwMDAwMAorI2RlZmluZSBPQkZfUkVUUllfVElNRU9VVCAxMDAwMDAwCisjZGVmaW5lIE1BWF9FUlJPUl9SRVRSSUVTIDEwCisKK3N0cnVjdCBzaV9zbV9kYXRhCit7CisJZW51bSBrY3Nfc3RhdGVzICBzdGF0ZTsKKwlzdHJ1Y3Qgc2lfc21faW8gKmlvOworCXVuc2lnbmVkIGNoYXIgICAgd3JpdGVfZGF0YVtNQVhfS0NTX1dSSVRFX1NJWkVdOworCWludCAgICAgICAgICAgICAgd3JpdGVfcG9zOworCWludCAgICAgICAgICAgICAgd3JpdGVfY291bnQ7CisJaW50ICAgICAgICAgICAgICBvcmlnX3dyaXRlX2NvdW50OworCXVuc2lnbmVkIGNoYXIgICAgcmVhZF9kYXRhW01BWF9LQ1NfUkVBRF9TSVpFXTsKKwlpbnQgICAgICAgICAgICAgIHJlYWRfcG9zOworCWludAkgICAgICAgICB0cnVuY2F0ZWQ7CisKKwl1bnNpZ25lZCBpbnQgIGVycm9yX3JldHJpZXM7CisJbG9uZyAgICAgICAgICBpYmZfdGltZW91dDsKKwlsb25nICAgICAgICAgIG9iZl90aW1lb3V0OworfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBpbml0X2tjc19kYXRhKHN0cnVjdCBzaV9zbV9kYXRhICprY3MsCisJCQkJICBzdHJ1Y3Qgc2lfc21faW8gKmlvKQoreworCWtjcy0+c3RhdGUgPSBLQ1NfSURMRTsKKwlrY3MtPmlvID0gaW87CisJa2NzLT53cml0ZV9wb3MgPSAwOworCWtjcy0+d3JpdGVfY291bnQgPSAwOworCWtjcy0+b3JpZ193cml0ZV9jb3VudCA9IDA7CisJa2NzLT5yZWFkX3BvcyA9IDA7CisJa2NzLT5lcnJvcl9yZXRyaWVzID0gMDsKKwlrY3MtPnRydW5jYXRlZCA9IDA7CisJa2NzLT5pYmZfdGltZW91dCA9IElCRl9SRVRSWV9USU1FT1VUOworCWtjcy0+b2JmX3RpbWVvdXQgPSBPQkZfUkVUUllfVElNRU9VVDsKKworCS8qIFJlc2VydmUgMiBJL08gYnl0ZXMuICovCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWFkX3N0YXR1cyhzdHJ1Y3Qgc2lfc21fZGF0YSAqa2NzKQoreworCXJldHVybiBrY3MtPmlvLT5pbnB1dGIoa2NzLT5pbywgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWFkX2RhdGEoc3RydWN0IHNpX3NtX2RhdGEgKmtjcykKK3sKKwlyZXR1cm4ga2NzLT5pby0+aW5wdXRiKGtjcy0+aW8sIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfY21kKHN0cnVjdCBzaV9zbV9kYXRhICprY3MsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlrY3MtPmlvLT5vdXRwdXRiKGtjcy0+aW8sIDEsIGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfZGF0YShzdHJ1Y3Qgc2lfc21fZGF0YSAqa2NzLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJa2NzLT5pby0+b3V0cHV0YihrY3MtPmlvLCAwLCBkYXRhKTsKK30KKworLyogQ29udHJvbCBjb2Rlcy4gKi8KKyNkZWZpbmUgS0NTX0dFVF9TVEFUVVNfQUJPUlQJMHg2MAorI2RlZmluZSBLQ1NfV1JJVEVfU1RBUlQJCTB4NjEKKyNkZWZpbmUgS0NTX1dSSVRFX0VORAkJMHg2MgorI2RlZmluZSBLQ1NfUkVBRF9CWVRFCQkweDY4CisKKy8qIFN0YXR1cyBiaXRzLiAqLworI2RlZmluZSBHRVRfU1RBVFVTX1NUQVRFKHN0YXR1cykgKCgoc3RhdHVzKSA+PiA2KSAmIDB4MDMpCisjZGVmaW5lIEtDU19JRExFX1NUQVRFCTAKKyNkZWZpbmUgS0NTX1JFQURfU1RBVEUJMQorI2RlZmluZSBLQ1NfV1JJVEVfU1RBVEUJMgorI2RlZmluZSBLQ1NfRVJST1JfU1RBVEUJMworI2RlZmluZSBHRVRfU1RBVFVTX0FUTihzdGF0dXMpICgoc3RhdHVzKSAmIDB4MDQpCisjZGVmaW5lIEdFVF9TVEFUVVNfSUJGKHN0YXR1cykgKChzdGF0dXMpICYgMHgwMikKKyNkZWZpbmUgR0VUX1NUQVRVU19PQkYoc3RhdHVzKSAoKHN0YXR1cykgJiAweDAxKQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9uZXh0X2J5dGUoc3RydWN0IHNpX3NtX2RhdGEgKmtjcykKK3sKKwl3cml0ZV9kYXRhKGtjcywga2NzLT53cml0ZV9kYXRhW2tjcy0+d3JpdGVfcG9zXSk7CisJKGtjcy0+d3JpdGVfcG9zKSsrOworCShrY3MtPndyaXRlX2NvdW50KS0tOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfZXJyb3JfcmVjb3Zlcnkoc3RydWN0IHNpX3NtX2RhdGEgKmtjcywgY2hhciAqcmVhc29uKQoreworCShrY3MtPmVycm9yX3JldHJpZXMpKys7CisJaWYgKGtjcy0+ZXJyb3JfcmV0cmllcyA+IE1BWF9FUlJPUl9SRVRSSUVTKSB7CisjaWZkZWYgREVCVUdfSE9TRURfUkVBU09OCisJCXByaW50aygiaXBtaV9rY3Nfc206IGtjcyBob3NlZDogJXNcbiIsIHJlYXNvbik7CisjZW5kaWYKKwkJa2NzLT5zdGF0ZSA9IEtDU19IT1NFRDsKKwl9IGVsc2UgeworCQlrY3MtPnN0YXRlID0gS0NTX0VSUk9SMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWFkX25leHRfYnl0ZShzdHJ1Y3Qgc2lfc21fZGF0YSAqa2NzKQoreworCWlmIChrY3MtPnJlYWRfcG9zID49IE1BWF9LQ1NfUkVBRF9TSVpFKSB7CisJCS8qIFRocm93IHRoZSBkYXRhIGF3YXkgYW5kIG1hcmsgaXQgdHJ1bmNhdGVkLiAqLworCQlyZWFkX2RhdGEoa2NzKTsKKwkJa2NzLT50cnVuY2F0ZWQgPSAxOworCX0gZWxzZSB7CisJCWtjcy0+cmVhZF9kYXRhW2tjcy0+cmVhZF9wb3NdID0gcmVhZF9kYXRhKGtjcyk7CisJCShrY3MtPnJlYWRfcG9zKSsrOworCX0KKwl3cml0ZV9kYXRhKGtjcywgS0NTX1JFQURfQllURSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2liZihzdHJ1Y3Qgc2lfc21fZGF0YSAqa2NzLCB1bnNpZ25lZCBjaGFyIHN0YXR1cywKKwkJCSAgICBsb25nIHRpbWUpCit7CisJaWYgKEdFVF9TVEFUVVNfSUJGKHN0YXR1cykpIHsKKwkJa2NzLT5pYmZfdGltZW91dCAtPSB0aW1lOworCQlpZiAoa2NzLT5pYmZfdGltZW91dCA8IDApIHsKKwkJCXN0YXJ0X2Vycm9yX3JlY292ZXJ5KGtjcywgIklCRiBub3QgcmVhZHkgaW4gdGltZSIpOworCQkJa2NzLT5pYmZfdGltZW91dCA9IElCRl9SRVRSWV9USU1FT1VUOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWtjcy0+aWJmX3RpbWVvdXQgPSBJQkZfUkVUUllfVElNRU9VVDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfb2JmKHN0cnVjdCBzaV9zbV9kYXRhICprY3MsIHVuc2lnbmVkIGNoYXIgc3RhdHVzLAorCQkJICAgIGxvbmcgdGltZSkKK3sKKwlpZiAoISBHRVRfU1RBVFVTX09CRihzdGF0dXMpKSB7CisJCWtjcy0+b2JmX3RpbWVvdXQgLT0gdGltZTsKKwkJaWYgKGtjcy0+b2JmX3RpbWVvdXQgPCAwKSB7CisJCSAgICBzdGFydF9lcnJvcl9yZWNvdmVyeShrY3MsICJPQkYgbm90IHJlYWR5IGluIHRpbWUiKTsKKwkJICAgIHJldHVybiAxOworCQl9CisJCXJldHVybiAwOworCX0KKwlrY3MtPm9iZl90aW1lb3V0ID0gT0JGX1JFVFJZX1RJTUVPVVQ7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX29iZihzdHJ1Y3Qgc2lfc21fZGF0YSAqa2NzLCB1bnNpZ25lZCBjaGFyIHN0YXR1cykKK3sKKwlpZiAoR0VUX1NUQVRVU19PQkYoc3RhdHVzKSkKKwkJcmVhZF9kYXRhKGtjcyk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc3RhcnRfa2NzX3RyYW5zYWN0aW9uKHN0cnVjdCBzaV9zbV9kYXRhICprY3MpCit7CisJa2NzLT53cml0ZV9jb3VudCA9IGtjcy0+b3JpZ193cml0ZV9jb3VudDsKKwlrY3MtPndyaXRlX3BvcyA9IDA7CisJa2NzLT5yZWFkX3BvcyA9IDA7CisJa2NzLT5zdGF0ZSA9IEtDU19XQUlUX1dSSVRFX1NUQVJUOworCWtjcy0+aWJmX3RpbWVvdXQgPSBJQkZfUkVUUllfVElNRU9VVDsKKwlrY3MtPm9iZl90aW1lb3V0ID0gT0JGX1JFVFJZX1RJTUVPVVQ7CisJd3JpdGVfY21kKGtjcywgS0NTX1dSSVRFX1NUQVJUKTsKK30KKworc3RhdGljIGludCBzdGFydF9rY3NfdHJhbnNhY3Rpb24oc3RydWN0IHNpX3NtX2RhdGEgKmtjcywgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCQkgdW5zaWduZWQgaW50IHNpemUpCit7CisJaWYgKChzaXplIDwgMikgfHwgKHNpemUgPiBNQVhfS0NTX1dSSVRFX1NJWkUpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKGtjcy0+c3RhdGUgIT0gS0NTX0lETEUpICYmIChrY3MtPnN0YXRlICE9IEtDU19IT1NFRCkpIHsKKwkJcmV0dXJuIC0yOworCX0KKworCWtjcy0+ZXJyb3JfcmV0cmllcyA9IDA7CisJbWVtY3B5KGtjcy0+d3JpdGVfZGF0YSwgZGF0YSwgc2l6ZSk7CisJa2NzLT53cml0ZV9jb3VudCA9IHNpemU7CisJa2NzLT5vcmlnX3dyaXRlX2NvdW50ID0gc2l6ZTsKKwlrY3MtPndyaXRlX3BvcyA9IDA7CisJa2NzLT5yZWFkX3BvcyA9IDA7CisJa2NzLT5zdGF0ZSA9IEtDU19TVEFSVF9PUDsKKwlrY3MtPmliZl90aW1lb3V0ID0gSUJGX1JFVFJZX1RJTUVPVVQ7CisJa2NzLT5vYmZfdGltZW91dCA9IE9CRl9SRVRSWV9USU1FT1VUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9rY3NfcmVzdWx0KHN0cnVjdCBzaV9zbV9kYXRhICprY3MsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJaWYgKGxlbmd0aCA8IGtjcy0+cmVhZF9wb3MpIHsKKwkJa2NzLT5yZWFkX3BvcyA9IGxlbmd0aDsKKwkJa2NzLT50cnVuY2F0ZWQgPSAxOworCX0KKworCW1lbWNweShkYXRhLCBrY3MtPnJlYWRfZGF0YSwga2NzLT5yZWFkX3Bvcyk7CisKKwlpZiAoKGxlbmd0aCA+PSAzKSAmJiAoa2NzLT5yZWFkX3BvcyA8IDMpKSB7CisJCS8qIEd1YXJhbnRlZSB0aGF0IHdlIHJldHVybiBhdCBsZWFzdCAzIGJ5dGVzLCB3aXRoIGFuCisJCSAgIGVycm9yIGluIHRoZSB0aGlyZCBieXRlIGlmIGl0IGlzIHRvbyBzaG9ydC4gKi8KKwkJZGF0YVsyXSA9IElQTUlfRVJSX1VOU1BFQ0lGSUVEOworCQlrY3MtPnJlYWRfcG9zID0gMzsKKwl9CisJaWYgKGtjcy0+dHJ1bmNhdGVkKSB7CisJCS8qIFJlcG9ydCBhIHRydW5jYXRlZCBlcnJvci4gIFdlIG1pZ2h0IG92ZXJ3cml0ZQorCQkgICBhbm90aGVyIGVycm9yLCBidXQgdGhhdCdzIHRvbyBiYWQsIHRoZSB1c2VyIG5lZWRzCisJCSAgIHRvIGtub3cgaXQgd2FzIHRydW5jYXRlZC4gKi8KKwkJZGF0YVsyXSA9IElQTUlfRVJSX01TR19UUlVOQ0FURUQ7CisJCWtjcy0+dHJ1bmNhdGVkID0gMDsKKwl9CisKKwlyZXR1cm4ga2NzLT5yZWFkX3BvczsKK30KKworLyogVGhpcyBpbXBsZW1lbnRzIHRoZSBzdGF0ZSBtYWNoaW5lIGRlZmluZWQgaW4gdGhlIElQTUkgbWFudWFsLCBzZWUKKyAgIHRoYXQgZm9yIGRldGFpbHMgb24gaG93IHRoaXMgd29ya3MuICBEaXZpZGUgdGhhdCBmbG93Y2hhcnQgaW50bworICAgc2VjdGlvbnMgZGVsaW1pdGVkIGJ5ICJXYWl0IGZvciBJQkYiIGFuZCB0aGlzIHdpbGwgYmVjb21lIGNsZWFyLiAqLworc3RhdGljIGVudW0gc2lfc21fcmVzdWx0IGtjc19ldmVudChzdHJ1Y3Qgc2lfc21fZGF0YSAqa2NzLCBsb25nIHRpbWUpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBzdGF0ZTsKKworCXN0YXR1cyA9IHJlYWRfc3RhdHVzKGtjcyk7CisKKyNpZmRlZiBERUJVR19TVEFURQorCXByaW50aygiICBTdGF0ZSA9ICVkLCAleFxuIiwga2NzLT5zdGF0ZSwgc3RhdHVzKTsKKyNlbmRpZgorCS8qIEFsbCBzdGF0ZXMgd2FpdCBmb3IgaWJmLCBzbyBqdXN0IGRvIGl0IGhlcmUuICovCisJaWYgKCFjaGVja19pYmYoa2NzLCBzdGF0dXMsIHRpbWUpKQorCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCisJLyogSnVzdCBhYm91dCBldmVyeXRoaW5nIGxvb2tzIGF0IHRoZSBLQ1Mgc3RhdGUsIHNvIGdyYWIgdGhhdCwgdG9vLiAqLworCXN0YXRlID0gR0VUX1NUQVRVU19TVEFURShzdGF0dXMpOworCisJc3dpdGNoIChrY3MtPnN0YXRlKSB7CisJY2FzZSBLQ1NfSURMRToKKwkJLyogSWYgdGhlcmUncyBhbmQgaW50ZXJydXB0IHNvdXJjZSwgdHVybiBpdCBvZmYuICovCisJCWNsZWFyX29iZihrY3MsIHN0YXR1cyk7CisKKwkJaWYgKEdFVF9TVEFUVVNfQVROKHN0YXR1cykpCisJCQlyZXR1cm4gU0lfU01fQVRUTjsKKwkJZWxzZQorCQkJcmV0dXJuIFNJX1NNX0lETEU7CisKKwljYXNlIEtDU19TVEFSVF9PUDoKKwkJaWYgKHN0YXRlICE9IEtDU19JRExFKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShrY3MsCisJCQkJCSAgICAgIlN0YXRlIG1hY2hpbmUgbm90IGlkbGUgYXQgc3RhcnQiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2xlYXJfb2JmKGtjcywgc3RhdHVzKTsKKwkJd3JpdGVfY21kKGtjcywgS0NTX1dSSVRFX1NUQVJUKTsKKwkJa2NzLT5zdGF0ZSA9IEtDU19XQUlUX1dSSVRFX1NUQVJUOworCQlicmVhazsKKworCWNhc2UgS0NTX1dBSVRfV1JJVEVfU1RBUlQ6CisJCWlmIChzdGF0ZSAhPSBLQ1NfV1JJVEVfU1RBVEUpIHsKKwkJCXN0YXJ0X2Vycm9yX3JlY292ZXJ5KAorCQkJCWtjcywKKwkJCQkiTm90IGluIHdyaXRlIHN0YXRlIGF0IHdyaXRlIHN0YXJ0Iik7CisJCQlicmVhazsKKwkJfQorCQlyZWFkX2RhdGEoa2NzKTsKKwkJaWYgKGtjcy0+d3JpdGVfY291bnQgPT0gMSkgeworCQkJd3JpdGVfY21kKGtjcywgS0NTX1dSSVRFX0VORCk7CisJCQlrY3MtPnN0YXRlID0gS0NTX1dBSVRfV1JJVEVfRU5EOworCQl9IGVsc2UgeworCQkJd3JpdGVfbmV4dF9ieXRlKGtjcyk7CisJCQlrY3MtPnN0YXRlID0gS0NTX1dBSVRfV1JJVEU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEtDU19XQUlUX1dSSVRFOgorCQlpZiAoc3RhdGUgIT0gS0NTX1dSSVRFX1NUQVRFKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShrY3MsCisJCQkJCSAgICAgIk5vdCBpbiB3cml0ZSBzdGF0ZSBmb3Igd3JpdGUiKTsKKwkJCWJyZWFrOworCQl9CisJCWNsZWFyX29iZihrY3MsIHN0YXR1cyk7CisJCWlmIChrY3MtPndyaXRlX2NvdW50ID09IDEpIHsKKwkJCXdyaXRlX2NtZChrY3MsIEtDU19XUklURV9FTkQpOworCQkJa2NzLT5zdGF0ZSA9IEtDU19XQUlUX1dSSVRFX0VORDsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlX25leHRfYnl0ZShrY3MpOworCQl9CisJCWJyZWFrOworCQkKKwljYXNlIEtDU19XQUlUX1dSSVRFX0VORDoKKwkJaWYgKHN0YXRlICE9IEtDU19XUklURV9TVEFURSkgeworCQkJc3RhcnRfZXJyb3JfcmVjb3Zlcnkoa2NzLAorCQkJCQkgICAgICJOb3QgaW4gd3JpdGUgc3RhdGUgZm9yIHdyaXRlIGVuZCIpOworCQkJYnJlYWs7CisJCX0KKwkJY2xlYXJfb2JmKGtjcywgc3RhdHVzKTsKKwkJd3JpdGVfbmV4dF9ieXRlKGtjcyk7CisJCWtjcy0+c3RhdGUgPSBLQ1NfV0FJVF9SRUFEOworCQlicmVhazsKKworCWNhc2UgS0NTX1dBSVRfUkVBRDoKKwkJaWYgKChzdGF0ZSAhPSBLQ1NfUkVBRF9TVEFURSkgJiYgKHN0YXRlICE9IEtDU19JRExFX1NUQVRFKSkgeworCQkJc3RhcnRfZXJyb3JfcmVjb3ZlcnkoCisJCQkJa2NzLAorCQkJCSJOb3QgaW4gcmVhZCBvciBpZGxlIGluIHJlYWQgc3RhdGUiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXRlID09IEtDU19SRUFEX1NUQVRFKSB7CisJCQlpZiAoISBjaGVja19vYmYoa2NzLCBzdGF0dXMsIHRpbWUpKQorCQkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCQlyZWFkX25leHRfYnl0ZShrY3MpOworCQl9IGVsc2UgeworCQkJLyogV2UgZG9uJ3QgaW1wbGVtZW50IHRoaXMgZXhhY3RseSBsaWtlIHRoZSBzdGF0ZQorCQkJICAgbWFjaGluZSBpbiB0aGUgc3BlYy4gIFNvbWUgYnJva2VuIGhhcmR3YXJlCisJCQkgICBkb2VzIG5vdCB3cml0ZSB0aGUgZmluYWwgZHVtbXkgYnl0ZSB0byB0aGUKKwkJCSAgIHJlYWQgcmVnaXN0ZXIuICBUaHVzIG9iZiB3aWxsIG5ldmVyIGdvIGhpZ2gKKwkJCSAgIGhlcmUuICBXZSBqdXN0IGdvIHN0cmFpZ2h0IHRvIGlkbGUsIGFuZCB3ZQorCQkJICAgaGFuZGxlIGNsZWFyaW5nIG91dCBvYmYgaW4gaWRsZSBzdGF0ZSBpZiBpdAorCQkJICAgaGFwcGVucyB0byBjb21lIGluLiAqLworCQkJY2xlYXJfb2JmKGtjcywgc3RhdHVzKTsKKwkJCWtjcy0+b3JpZ193cml0ZV9jb3VudCA9IDA7CisJCQlrY3MtPnN0YXRlID0gS0NTX0lETEU7CisJCQlyZXR1cm4gU0lfU01fVFJBTlNBQ1RJT05fQ09NUExFVEU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEtDU19FUlJPUjA6CisJCWNsZWFyX29iZihrY3MsIHN0YXR1cyk7CisJCXdyaXRlX2NtZChrY3MsIEtDU19HRVRfU1RBVFVTX0FCT1JUKTsKKwkJa2NzLT5zdGF0ZSA9IEtDU19FUlJPUjE7CisJCWJyZWFrOworCisJY2FzZSBLQ1NfRVJST1IxOgorCQljbGVhcl9vYmYoa2NzLCBzdGF0dXMpOworCQl3cml0ZV9kYXRhKGtjcywgMCk7CisJCWtjcy0+c3RhdGUgPSBLQ1NfRVJST1IyOworCQlicmVhazsKKwkJCisJY2FzZSBLQ1NfRVJST1IyOgorCQlpZiAoc3RhdGUgIT0gS0NTX1JFQURfU1RBVEUpIHsKKwkJCXN0YXJ0X2Vycm9yX3JlY292ZXJ5KGtjcywKKwkJCQkJICAgICAiTm90IGluIHJlYWQgc3RhdGUgZm9yIGVycm9yMiIpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEgY2hlY2tfb2JmKGtjcywgc3RhdHVzLCB0aW1lKSkKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisKKwkJY2xlYXJfb2JmKGtjcywgc3RhdHVzKTsKKwkJd3JpdGVfZGF0YShrY3MsIEtDU19SRUFEX0JZVEUpOworCQlrY3MtPnN0YXRlID0gS0NTX0VSUk9SMzsKKwkJYnJlYWs7CisJCQorCWNhc2UgS0NTX0VSUk9SMzoKKwkJaWYgKHN0YXRlICE9IEtDU19JRExFX1NUQVRFKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShrY3MsCisJCQkJCSAgICAgIk5vdCBpbiBpZGxlIHN0YXRlIGZvciBlcnJvcjMiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCEgY2hlY2tfb2JmKGtjcywgc3RhdHVzLCB0aW1lKSkKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisKKwkJY2xlYXJfb2JmKGtjcywgc3RhdHVzKTsKKwkJaWYgKGtjcy0+b3JpZ193cml0ZV9jb3VudCkgeworCQkJcmVzdGFydF9rY3NfdHJhbnNhY3Rpb24oa2NzKTsKKwkJfSBlbHNlIHsKKwkJCWtjcy0+c3RhdGUgPSBLQ1NfSURMRTsKKwkJCXJldHVybiBTSV9TTV9UUkFOU0FDVElPTl9DT01QTEVURTsKKwkJfQorCQlicmVhazsKKwkJCQorCWNhc2UgS0NTX0hPU0VEOgorCQlicmVhazsKKwl9CisKKwlpZiAoa2NzLT5zdGF0ZSA9PSBLQ1NfSE9TRUQpIHsKKwkJaW5pdF9rY3NfZGF0YShrY3MsIGtjcy0+aW8pOworCQlyZXR1cm4gU0lfU01fSE9TRUQ7CisJfQorCisJcmV0dXJuIFNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWTsKK30KKworc3RhdGljIGludCBrY3Nfc2l6ZSh2b2lkKQoreworCXJldHVybiBzaXplb2Yoc3RydWN0IHNpX3NtX2RhdGEpOworfQorCitzdGF0aWMgaW50IGtjc19kZXRlY3Qoc3RydWN0IHNpX3NtX2RhdGEgKmtjcykKK3sKKwkvKiBJdCdzIGltcG9zc2libGUgZm9yIHRoZSBLQ1Mgc3RhdHVzIHJlZ2lzdGVyIHRvIGJlIGFsbCAxJ3MsCisJICAgKGFzc3VtaW5nIGEgcHJvcGVybHkgZnVuY3Rpb25pbmcsIHNlbGYtaW5pdGlhbGl6ZWQgQk1DKQorCSAgIGJ1dCB0aGF0J3Mgd2hhdCB5b3UgZ2V0IGZyb20gcmVhZGluZyBhIGJvZ3VzIGFkZHJlc3MsIHNvIHdlCisJICAgdGVzdCB0aGF0IGZpcnN0LiAqLworCWlmIChyZWFkX3N0YXR1cyhrY3MpID09IDB4ZmYpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGtjc19jbGVhbnVwKHN0cnVjdCBzaV9zbV9kYXRhICprY3MpCit7Cit9CisKK3N0cnVjdCBzaV9zbV9oYW5kbGVycyBrY3Nfc21pX2hhbmRsZXJzID0KK3sKKwkudmVyc2lvbiAgICAgICAgICAgPSBJUE1JX0tDU19WRVJTSU9OLAorCS5pbml0X2RhdGEgICAgICAgICA9IGluaXRfa2NzX2RhdGEsCisJLnN0YXJ0X3RyYW5zYWN0aW9uID0gc3RhcnRfa2NzX3RyYW5zYWN0aW9uLAorCS5nZXRfcmVzdWx0ICAgICAgICA9IGdldF9rY3NfcmVzdWx0LAorCS5ldmVudCAgICAgICAgICAgICA9IGtjc19ldmVudCwKKwkuZGV0ZWN0ICAgICAgICAgICAgPSBrY3NfZGV0ZWN0LAorCS5jbGVhbnVwICAgICAgICAgICA9IGtjc19jbGVhbnVwLAorCS5zaXplICAgICAgICAgICAgICA9IGtjc19zaXplLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2MDZhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jCkBAIC0wLDAgKzEsMzE3NCBAQAorLyoKKyAqIGlwbWlfbXNnaGFuZGxlci5jCisgKgorICogSW5jb21pbmcgYW5kIG91dGdvaW5nIG1lc3NhZ2Ugcm91dGluZyBmb3IgYW4gSVBNSSBpbnRlcmZhY2UuCisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIENvcmV5IE1pbnlhcmQgPG1pbnlhcmRAbXZpc3RhLmNvbT4KKyAqICAgICAgICAgc291cmNlQG12aXN0YS5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICogIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAqICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiAgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcG1pLmg+CisjaW5jbHVkZSA8bGludXgvaXBtaV9zbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKKyNkZWZpbmUgUEZYICJJUE1JIG1lc3NhZ2UgaGFuZGxlcjogIgorI2RlZmluZSBJUE1JX01TR0hBTkRMRVJfVkVSU0lPTiAidjMzIgorCitzdGF0aWMgc3RydWN0IGlwbWlfcmVjdl9tc2cgKmlwbWlfYWxsb2NfcmVjdl9tc2codm9pZCk7CitzdGF0aWMgaW50IGlwbWlfaW5pdF9tc2doYW5kbGVyKHZvaWQpOworCitzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pcG1pX3Jvb3QgPSBOVUxMOworCisjZGVmaW5lIE1BWF9FVkVOVFNfSU5fUVVFVUUJMjUKKworLyogRG9uJ3QgbGV0IGEgbWVzc2FnZSBzaXQgaW4gYSBxdWV1ZSBmb3JldmVyLCBhbHdheXMgdGltZSBpdCB3aXRoIGF0IGxlc3QKKyAgIHRoZSBtYXggbWVzc2FnZSB0aW1lci4gIFRoaXMgaXMgaW4gbWlsbGlzZWNvbmRzLiAqLworI2RlZmluZSBNQVhfTVNHX1RJTUVPVVQJCTYwMDAwCisKK3N0cnVjdCBpcG1pX3VzZXIKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisKKwkvKiBUaGUgdXBwZXIgbGF5ZXIgdGhhdCBoYW5kbGVzIHJlY2VpdmUgbWVzc2FnZXMuICovCisJc3RydWN0IGlwbWlfdXNlcl9obmRsICpoYW5kbGVyOworCXZvaWQgICAgICAgICAgICAgKmhhbmRsZXJfZGF0YTsKKworCS8qIFRoZSBpbnRlcmZhY2UgdGhpcyB1c2VyIGlzIGJvdW5kIHRvLiAqLworCWlwbWlfc21pX3QgaW50ZjsKKworCS8qIERvZXMgdGhpcyBpbnRlcmZhY2UgcmVjZWl2ZSBJUE1JIGV2ZW50cz8gKi8KKwlpbnQgZ2V0c19ldmVudHM7Cit9OworCitzdHJ1Y3QgY21kX3JjdnIKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisKKwlpcG1pX3VzZXJfdCAgIHVzZXI7CisJdW5zaWduZWQgY2hhciBuZXRmbjsKKwl1bnNpZ25lZCBjaGFyIGNtZDsKK307CisKK3N0cnVjdCBzZXFfdGFibGUKK3sKKwl1bnNpZ25lZCBpbnQgICAgICAgICBpbnVzZSA6IDE7CisJdW5zaWduZWQgaW50ICAgICAgICAgYnJvYWRjYXN0IDogMTsKKworCXVuc2lnbmVkIGxvbmcgICAgICAgIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyAgICAgICAgb3JpZ190aW1lb3V0OworCXVuc2lnbmVkIGludCAgICAgICAgIHJldHJpZXNfbGVmdDsKKworCS8qIFRvIHZlcmlmeSBvbiBhbiBpbmNvbWluZyBzZW5kIG1lc3NhZ2UgcmVzcG9uc2UgdGhhdCB0aGlzIGlzCisgICAgICAgICAgIHRoZSBtZXNzYWdlIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGZvciwgd2Uga2VlcCBhIHNlcXVlbmNlIGlkCisgICAgICAgICAgIGFuZCBpbmNyZW1lbnQgaXQgZXZlcnkgdGltZSB3ZSBzZW5kIGEgbWVzc2FnZS4gKi8KKwlsb25nICAgICAgICAgICAgICAgICBzZXFpZDsKKworCS8qIFRoaXMgaXMgaGVsZCBzbyB3ZSBjYW4gcHJvcGVybHkgcmVzcG9uZCB0byB0aGUgbWVzc2FnZSBvbiBhCisgICAgICAgICAgIHRpbWVvdXQsIGFuZCBpdCBpcyB1c2VkIHRvIGhvbGQgdGhlIHRlbXBvcmFyeSBkYXRhIGZvcgorICAgICAgICAgICByZXRyYW5zbWlzc2lvbiwgdG9vLiAqLworCXN0cnVjdCBpcG1pX3JlY3ZfbXNnICpyZWN2X21zZzsKK307CisKKy8qIFN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiBhIG1zZ2lkIChsb25nKSB0byBhbGxvdyB1cyB0byBmaW5kIGEKKyAgIHNlcXVlbmNlIHRhYmxlIGVudHJ5IGZyb20gdGhlIG1zZ2lkLiAqLworI2RlZmluZSBTVE9SRV9TRVFfSU5fTVNHSUQoc2VxLCBzZXFpZCkgKCgoc2VxJjB4ZmYpPDwyNikgfCAoc2VxaWQmMHgzZmZmZmZmKSkKKworI2RlZmluZSBHRVRfU0VRX0ZST01fTVNHSUQobXNnaWQsIHNlcSwgc2VxaWQpIFwKKwlkbyB7CQkJCQkJCQlcCisJCXNlcSA9ICgobXNnaWQgPj4gMjYpICYgMHgzZik7CQkJCVwKKwkJc2VxaWQgPSAobXNnaWQgJiAweDNmZmZmZik7CQkJCVwKKyAgICAgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIE5FWFRfU0VRSUQoc2VxaWQpICgoKHNlcWlkKSArIDEpICYgMHgzZmZmZmYpCisKK3N0cnVjdCBpcG1pX2NoYW5uZWwKK3sKKwl1bnNpZ25lZCBjaGFyIG1lZGl1bTsKKwl1bnNpZ25lZCBjaGFyIHByb3RvY29sOworfTsKKworc3RydWN0IGlwbWlfcHJvY19lbnRyeQoreworCWNoYXIgICAgICAgICAgICAgICAgICAgKm5hbWU7CisJc3RydWN0IGlwbWlfcHJvY19lbnRyeSAqbmV4dDsKK307CisKKyNkZWZpbmUgSVBNSV9JUE1CX05VTV9TRVEJNjQKKyNkZWZpbmUgSVBNSV9NQVhfQ0hBTk5FTFMgICAgICAgOAorc3RydWN0IGlwbWlfc21pCit7CisJLyogV2hhdCBpbnRlcmZhY2UgbnVtYmVyIGFyZSB3ZT8gKi8KKwlpbnQgaW50Zl9udW07CisKKwkvKiBUaGUgbGlzdCBvZiB1cHBlciBsYXllcnMgdGhhdCBhcmUgdXNpbmcgbWUuICBXZSByZWFkLWxvY2sKKyAgICAgICAgICAgdGhpcyB3aGVuIGRlbGl2ZXJpbmcgbWVzc2FnZXMgdG8gdGhlIHVwcGVyIGxheWVyIHRvIGtlZXAKKyAgICAgICAgICAgdGhlIHVzZXIgZnJvbSBnb2luZyBhd2F5IHdoaWxlIHdlIGFyZSBwcm9jZXNzaW5nIHRoZQorICAgICAgICAgICBtZXNzYWdlLiAgVGhpcyBtZWFucyB0aGF0IHlvdSBjYW5ub3QgYWRkIG9yIGRlbGV0ZSBhIHVzZXIKKyAgICAgICAgICAgZnJvbSB0aGUgcmVjZWl2ZSBjYWxsYmFjay4gKi8KKwlyd2xvY2tfdCAgICAgICAgICAgICAgICB1c2Vyc19sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIHVzZXJzOworCisJLyogVXNlZCBmb3Igd2FrZSB1cHMgYXQgc3RhcnR1cC4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKKworCS8qIFRoZSBJUE1JIHZlcnNpb24gb2YgdGhlIEJNQyBvbiB0aGUgb3RoZXIgZW5kLiAqLworCXVuc2lnbmVkIGNoYXIgICAgICAgdmVyc2lvbl9tYWpvcjsKKwl1bnNpZ25lZCBjaGFyICAgICAgIHZlcnNpb25fbWlub3I7CisKKwkvKiBUaGlzIGlzIHRoZSBsb3dlci1sYXllcidzIHNlbmRlciByb3V0aW5lLiAqLworCXN0cnVjdCBpcG1pX3NtaV9oYW5kbGVycyAqaGFuZGxlcnM7CisJdm9pZCAgICAgICAgICAgICAgICAgICAgICpzZW5kX2luZm87CisKKwkvKiBBIGxpc3Qgb2YgcHJvYyBlbnRyaWVzIGZvciB0aGlzIGludGVyZmFjZS4gIFRoaXMgZG9lcyBub3QKKwkgICBuZWVkIGEgbG9jaywgb25seSBvbmUgdGhyZWFkIGNyZWF0ZXMgaXQgYW5kIG9ubHkgb25lIHRocmVhZAorCSAgIGRlc3Ryb3lzIGl0LiAqLworCXN0cnVjdCBpcG1pX3Byb2NfZW50cnkgKnByb2NfZW50cmllczsKKworCS8qIEEgdGFibGUgb2Ygc2VxdWVuY2UgbnVtYmVycyBmb3IgdGhpcyBpbnRlcmZhY2UuICBXZSB1c2UgdGhlCisgICAgICAgICAgIHNlcXVlbmNlIG51bWJlcnMgZm9yIElQTUIgbWVzc2FnZXMgdGhhdCBnbyBvdXQgb2YgdGhlCisgICAgICAgICAgIGludGVyZmFjZSB0byBtYXRjaCB0aGVtIHVwIHdpdGggdGhlaXIgcmVzcG9uc2VzLiAgQSByb3V0aW5lCisgICAgICAgICAgIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgdG8gdGltZSB0aGUgaXRlbXMgaW4gdGhpcyBsaXN0LiAqLworCXNwaW5sb2NrX3QgICAgICAgc2VxX2xvY2s7CisJc3RydWN0IHNlcV90YWJsZSBzZXFfdGFibGVbSVBNSV9JUE1CX05VTV9TRVFdOworCWludCBjdXJyX3NlcTsKKworCS8qIE1lc3NhZ2VzIHRoYXQgd2VyZSBkZWxheWVkIGZvciBzb21lIHJlYXNvbiAob3V0IG9mIG1lbW9yeSwKKyAgICAgICAgICAgZm9yIGluc3RhbmNlKSwgd2lsbCBnbyBpbiBoZXJlIHRvIGJlIHByb2Nlc3NlZCBsYXRlciBpbiBhCisgICAgICAgICAgIHBlcmlvZGljIHRpbWVyIGludGVycnVwdC4gKi8KKwlzcGlubG9ja190ICAgICAgIHdhaXRpbmdfbXNnc19sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgd2FpdGluZ19tc2dzOworCisJLyogVGhlIGxpc3Qgb2YgY29tbWFuZCByZWNlaXZlcnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCBmb3IgY29tbWFuZHMKKwkgICBvbiB0aGlzIGludGVyZmFjZS4gKi8KKwlyd2xvY2tfdAkgY21kX3JjdnJfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNtZF9yY3ZyczsKKworCS8qIEV2ZW50cyB0aGF0IHdlcmUgcXVldWVzIGJlY2F1c2Ugbm8gb25lIHdhcyB0aGVyZSB0byByZWNlaXZlCisgICAgICAgICAgIHRoZW0uICovCisJc3BpbmxvY2tfdCAgICAgICBldmVudHNfbG9jazsgLyogRm9yIGRlYWxpbmcgd2l0aCBldmVudCBzdHVmZi4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRpbmdfZXZlbnRzOworCXVuc2lnbmVkIGludCAgICAgd2FpdGluZ19ldmVudHNfY291bnQ7IC8qIEhvdyBtYW55IGV2ZW50cyBpbiBxdWV1ZT8gKi8KKworCS8qIFRoaXMgd2lsbCBiZSBub24tbnVsbCBpZiBzb21lb25lIHJlZ2lzdGVycyB0byByZWNlaXZlIGFsbAorCSAgIElQTUkgY29tbWFuZHMgKHRoaXMgaXMgZm9yIGludGVyZmFjZSBlbXVsYXRpb24pLiAgVGhlcmUKKwkgICBtYXkgbm90IGJlIGFueSB0aGluZ3MgaW4gdGhlIGNtZF9yY3ZycyBsaXN0IGFib3ZlIHdoZW4KKwkgICB0aGlzIGlzIHJlZ2lzdGVyZWQuICovCisJaXBtaV91c2VyX3QgYWxsX2NtZF9yY3ZyOworCisJLyogTXkgc2xhdmUgYWRkcmVzcy4gIFRoaXMgaXMgaW5pdGlhbGl6ZWQgdG8gSVBNSV9CTUNfU0xBVkVfQUREUiwKKwkgICBidXQgbWF5IGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIuICovCisJdW5zaWduZWQgY2hhciBteV9hZGRyZXNzOworCisJLyogTXkgTFVOLiAgVGhpcyBzaG91bGQgZ2VuZXJhbGx5IHN0YXkgdGhlIFNNUyBMVU4sIGJ1dCBqdXN0IGluCisJICAgY2FzZS4uLiAqLworCXVuc2lnbmVkIGNoYXIgbXlfbHVuOworCisJLyogVGhlIGV2ZW50IHJlY2VpdmVyIGZvciBteSBCTUMsIG9ubHkgcmVhbGx5IHVzZWQgYXQgcGFuaWMKKwkgICBzaHV0ZG93biBhcyBhIHBsYWNlIHRvIHN0b3JlIHRoaXMuICovCisJdW5zaWduZWQgY2hhciBldmVudF9yZWNlaXZlcjsKKwl1bnNpZ25lZCBjaGFyIGV2ZW50X3JlY2VpdmVyX2x1bjsKKwl1bnNpZ25lZCBjaGFyIGxvY2FsX3NlbF9kZXZpY2U7CisJdW5zaWduZWQgY2hhciBsb2NhbF9ldmVudF9nZW5lcmF0b3I7CisKKwkvKiBBIGNoZWFwIGhhY2ssIGlmIHRoaXMgaXMgbm9uLW51bGwgYW5kIGEgbWVzc2FnZSB0byBhbgorCSAgIGludGVyZmFjZSBjb21lcyBpbiB3aXRoIGEgTlVMTCB1c2VyLCBjYWxsIHRoaXMgcm91dGluZSB3aXRoCisJICAgaXQuICBOb3RlIHRoYXQgdGhlIG1lc3NhZ2Ugd2lsbCBzdGlsbCBiZSBmcmVlZCBieSB0aGUKKwkgICBjYWxsZXIuICBUaGlzIG9ubHkgd29ya3Mgb24gdGhlIHN5c3RlbSBpbnRlcmZhY2UuICovCisJdm9pZCAoKm51bGxfdXNlcl9oYW5kbGVyKShpcG1pX3NtaV90IGludGYsIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZyk7CisKKwkvKiBXaGVuIHdlIGFyZSBzY2FubmluZyB0aGUgY2hhbm5lbHMgZm9yIGFuIFNNSSwgdGhpcyB3aWxsCisJICAgdGVsbCB3aGljaCBjaGFubmVsIHdlIGFyZSBzY2FubmluZy4gKi8KKwlpbnQgY3Vycl9jaGFubmVsOworCisJLyogQ2hhbm5lbCBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBpcG1pX2NoYW5uZWwgY2hhbm5lbHNbSVBNSV9NQVhfQ0hBTk5FTFNdOworCisJLyogUHJvYyBGUyBzdHVmZi4gKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZGlyOworCWNoYXIgICAgICAgICAgICAgICAgICBwcm9jX2Rpcl9uYW1lWzEwXTsKKworCXNwaW5sb2NrX3QgICBjb3VudGVyX2xvY2s7IC8qIEZvciBtYWtpbmcgY291bnRlcnMgYXRvbWljLiAqLworCisJLyogQ29tbWFuZHMgd2UgZ290IHRoYXQgd2VyZSBpbnZhbGlkLiAqLworCXVuc2lnbmVkIGludCBzZW50X2ludmFsaWRfY29tbWFuZHM7CisKKwkvKiBDb21tYW5kcyB3ZSBzZW50IHRvIHRoZSBNQy4gKi8KKwl1bnNpZ25lZCBpbnQgc2VudF9sb2NhbF9jb21tYW5kczsKKwkvKiBSZXNwb25zZXMgZnJvbSB0aGUgTUMgdGhhdCB3ZXJlIGRlbGl2ZXJlZCB0byBhIHVzZXIuICovCisJdW5zaWduZWQgaW50IGhhbmRsZWRfbG9jYWxfcmVzcG9uc2VzOworCS8qIFJlc3BvbnNlcyBmcm9tIHRoZSBNQyB0aGF0IHdlcmUgbm90IGRlbGl2ZXJlZCB0byBhIHVzZXIuICovCisJdW5zaWduZWQgaW50IHVuaGFuZGxlZF9sb2NhbF9yZXNwb25zZXM7CisKKwkvKiBDb21tYW5kcyB3ZSBzZW50IG91dCB0byB0aGUgSVBNQiBidXMuICovCisJdW5zaWduZWQgaW50IHNlbnRfaXBtYl9jb21tYW5kczsKKwkvKiBDb21tYW5kcyBzZW50IG9uIHRoZSBJUE1CIHRoYXQgaGFkIGVycm9ycyBvbiB0aGUgU0VORCBDTUQgKi8KKwl1bnNpZ25lZCBpbnQgc2VudF9pcG1iX2NvbW1hbmRfZXJyczsKKwkvKiBFYWNoIHJldHJhbnNtaXQgaW5jcmVtZW50cyB0aGlzIGNvdW50LiAqLworCXVuc2lnbmVkIGludCByZXRyYW5zbWl0dGVkX2lwbWJfY29tbWFuZHM7CisJLyogV2hlbiBhIG1lc3NhZ2UgdGltZXMgb3V0IChydW5zIG91dCBvZiByZXRyYW5zbWl0cykgdGhpcyBpcworICAgICAgICAgICBpbmNyZW1lbnRlZC4gKi8KKwl1bnNpZ25lZCBpbnQgdGltZWRfb3V0X2lwbWJfY29tbWFuZHM7CisKKwkvKiBUaGlzIGlzIGxpa2UgYWJvdmUsIGJ1dCBmb3IgYnJvYWRjYXN0cy4gIEJyb2FkY2FzdHMgYXJlCisgICAgICAgICAgICpub3QqIGluY2x1ZGVkIGluIHRoZSBhYm92ZSBjb3VudCAodGhleSBhcmUgZXhwZWN0ZWQgdG8KKyAgICAgICAgICAgdGltZSBvdXQpLiAqLworCXVuc2lnbmVkIGludCB0aW1lZF9vdXRfaXBtYl9icm9hZGNhc3RzOworCisJLyogUmVzcG9uc2VzIEkgaGF2ZSBzZW50IHRvIHRoZSBJUE1CIGJ1cy4gKi8KKwl1bnNpZ25lZCBpbnQgc2VudF9pcG1iX3Jlc3BvbnNlczsKKworCS8qIFRoZSByZXNwb25zZSB3YXMgZGVsaXZlcmVkIHRvIHRoZSB1c2VyLiAqLworCXVuc2lnbmVkIGludCBoYW5kbGVkX2lwbWJfcmVzcG9uc2VzOworCS8qIFRoZSByZXNwb25zZSBoYWQgaW52YWxpZCBkYXRhIGluIGl0LiAqLworCXVuc2lnbmVkIGludCBpbnZhbGlkX2lwbWJfcmVzcG9uc2VzOworCS8qIFRoZSByZXNwb25zZSBkaWRuJ3QgaGF2ZSBhbnlvbmUgd2FpdGluZyBmb3IgaXQuICovCisJdW5zaWduZWQgaW50IHVuaGFuZGxlZF9pcG1iX3Jlc3BvbnNlczsKKworCS8qIENvbW1hbmRzIHdlIHNlbnQgb3V0IHRvIHRoZSBJUE1CIGJ1cy4gKi8KKwl1bnNpZ25lZCBpbnQgc2VudF9sYW5fY29tbWFuZHM7CisJLyogQ29tbWFuZHMgc2VudCBvbiB0aGUgSVBNQiB0aGF0IGhhZCBlcnJvcnMgb24gdGhlIFNFTkQgQ01EICovCisJdW5zaWduZWQgaW50IHNlbnRfbGFuX2NvbW1hbmRfZXJyczsKKwkvKiBFYWNoIHJldHJhbnNtaXQgaW5jcmVtZW50cyB0aGlzIGNvdW50LiAqLworCXVuc2lnbmVkIGludCByZXRyYW5zbWl0dGVkX2xhbl9jb21tYW5kczsKKwkvKiBXaGVuIGEgbWVzc2FnZSB0aW1lcyBvdXQgKHJ1bnMgb3V0IG9mIHJldHJhbnNtaXRzKSB0aGlzIGlzCisgICAgICAgICAgIGluY3JlbWVudGVkLiAqLworCXVuc2lnbmVkIGludCB0aW1lZF9vdXRfbGFuX2NvbW1hbmRzOworCisJLyogUmVzcG9uc2VzIEkgaGF2ZSBzZW50IHRvIHRoZSBJUE1CIGJ1cy4gKi8KKwl1bnNpZ25lZCBpbnQgc2VudF9sYW5fcmVzcG9uc2VzOworCisJLyogVGhlIHJlc3BvbnNlIHdhcyBkZWxpdmVyZWQgdG8gdGhlIHVzZXIuICovCisJdW5zaWduZWQgaW50IGhhbmRsZWRfbGFuX3Jlc3BvbnNlczsKKwkvKiBUaGUgcmVzcG9uc2UgaGFkIGludmFsaWQgZGF0YSBpbiBpdC4gKi8KKwl1bnNpZ25lZCBpbnQgaW52YWxpZF9sYW5fcmVzcG9uc2VzOworCS8qIFRoZSByZXNwb25zZSBkaWRuJ3QgaGF2ZSBhbnlvbmUgd2FpdGluZyBmb3IgaXQuICovCisJdW5zaWduZWQgaW50IHVuaGFuZGxlZF9sYW5fcmVzcG9uc2VzOworCisJLyogVGhlIGNvbW1hbmQgd2FzIGRlbGl2ZXJlZCB0byB0aGUgdXNlci4gKi8KKwl1bnNpZ25lZCBpbnQgaGFuZGxlZF9jb21tYW5kczsKKwkvKiBUaGUgY29tbWFuZCBoYWQgaW52YWxpZCBkYXRhIGluIGl0LiAqLworCXVuc2lnbmVkIGludCBpbnZhbGlkX2NvbW1hbmRzOworCS8qIFRoZSBjb21tYW5kIGRpZG4ndCBoYXZlIGFueW9uZSB3YWl0aW5nIGZvciBpdC4gKi8KKwl1bnNpZ25lZCBpbnQgdW5oYW5kbGVkX2NvbW1hbmRzOworCisJLyogSW52YWxpZCBkYXRhIGluIGFuIGV2ZW50LiAqLworCXVuc2lnbmVkIGludCBpbnZhbGlkX2V2ZW50czsKKwkvKiBFdmVudHMgdGhhdCB3ZXJlIHJlY2VpdmVkIHdpdGggdGhlIHByb3BlciBmb3JtYXQuICovCisJdW5zaWduZWQgaW50IGV2ZW50czsKK307CisKKyNkZWZpbmUgTUFYX0lQTUlfSU5URVJGQUNFUyA0CitzdGF0aWMgaXBtaV9zbWlfdCBpcG1pX2ludGVyZmFjZXNbTUFYX0lQTUlfSU5URVJGQUNFU107CisKKy8qIFVzZWQgdG8ga2VlcCBpbnRlcmZhY2VzIGZyb20gZ29pbmcgYXdheSB3aGlsZSBvcGVyYXRpb25zIGFyZQorICAgb3BlcmF0aW5nIG9uIGludGVyZmFjZXMuICBHcmFiIHJlYWQgaWYgeW91IGFyZSBub3QgbW9kaWZ5aW5nIHRoZQorICAgaW50ZXJmYWNlcywgd3JpdGUgaWYgeW91IGFyZS4gKi8KK3N0YXRpYyBERUNMQVJFX1JXU0VNKGludGVyZmFjZXNfc2VtKTsKKworLyogRGlyZWN0bHkgcHJvdGVjdHMgdGhlIGlwbWlfaW50ZXJmYWNlcyBkYXRhIHN0cnVjdHVyZS4gIFRoaXMgaXMKKyAgIGNsYWltZWQgaW4gdGhlIHRpbWVyIGludGVycnVwdC4gKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW50ZXJmYWNlc19sb2NrKTsKKworLyogTGlzdCBvZiB3YXRjaGVycyB0aGF0IHdhbnQgdG8ga25vdyB3aGVuIHNtaSdzIGFyZSBhZGRlZCBhbmQKKyAgIGRlbGV0ZWQuICovCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBzbWlfd2F0Y2hlcnMgPSBMSVNUX0hFQURfSU5JVChzbWlfd2F0Y2hlcnMpOworc3RhdGljIERFQ0xBUkVfUldTRU0oc21pX3dhdGNoZXJzX3NlbSk7CisKK2ludCBpcG1pX3NtaV93YXRjaGVyX3JlZ2lzdGVyKHN0cnVjdCBpcG1pX3NtaV93YXRjaGVyICp3YXRjaGVyKQoreworCWludCBpOworCisJZG93bl9yZWFkKCZpbnRlcmZhY2VzX3NlbSk7CisJZG93bl93cml0ZSgmc21pX3dhdGNoZXJzX3NlbSk7CisJbGlzdF9hZGQoJih3YXRjaGVyLT5saW5rKSwgJnNtaV93YXRjaGVycyk7CisJZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJCWlmIChpcG1pX2ludGVyZmFjZXNbaV0gIT0gTlVMTCkgeworCQkJd2F0Y2hlci0+bmV3X3NtaShpKTsKKwkJfQorCX0KKwl1cF93cml0ZSgmc21pX3dhdGNoZXJzX3NlbSk7CisJdXBfcmVhZCgmaW50ZXJmYWNlc19zZW0pOworCXJldHVybiAwOworfQorCitpbnQgaXBtaV9zbWlfd2F0Y2hlcl91bnJlZ2lzdGVyKHN0cnVjdCBpcG1pX3NtaV93YXRjaGVyICp3YXRjaGVyKQoreworCWRvd25fd3JpdGUoJnNtaV93YXRjaGVyc19zZW0pOworCWxpc3RfZGVsKCYod2F0Y2hlci0+bGluaykpOworCXVwX3dyaXRlKCZzbWlfd2F0Y2hlcnNfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2NhbGxfc21pX3dhdGNoZXJzKGludCBpKQoreworCXN0cnVjdCBpcG1pX3NtaV93YXRjaGVyICp3OworCisJZG93bl9yZWFkKCZzbWlfd2F0Y2hlcnNfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZzbWlfd2F0Y2hlcnMsIGxpbmspIHsKKwkJaWYgKHRyeV9tb2R1bGVfZ2V0KHctPm93bmVyKSkgeworCQkJdy0+bmV3X3NtaShpKTsKKwkJCW1vZHVsZV9wdXQody0+b3duZXIpOworCQl9CisJfQorCXVwX3JlYWQoJnNtaV93YXRjaGVyc19zZW0pOworfQorCitzdGF0aWMgaW50CitpcG1pX2FkZHJfZXF1YWwoc3RydWN0IGlwbWlfYWRkciAqYWRkcjEsIHN0cnVjdCBpcG1pX2FkZHIgKmFkZHIyKQoreworCWlmIChhZGRyMS0+YWRkcl90eXBlICE9IGFkZHIyLT5hZGRyX3R5cGUpCisJCXJldHVybiAwOworCisJaWYgKGFkZHIxLT5jaGFubmVsICE9IGFkZHIyLT5jaGFubmVsKQorCQlyZXR1cm4gMDsKKworCWlmIChhZGRyMS0+YWRkcl90eXBlID09IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEUpIHsKKwkJc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyICpzbWlfYWRkcjEKKwkJICAgID0gKHN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciAqKSBhZGRyMTsKKwkJc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyICpzbWlfYWRkcjIKKwkJICAgID0gKHN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciAqKSBhZGRyMjsKKwkJcmV0dXJuIChzbWlfYWRkcjEtPmx1biA9PSBzbWlfYWRkcjItPmx1bik7CisJfQorCisJaWYgKChhZGRyMS0+YWRkcl90eXBlID09IElQTUlfSVBNQl9BRERSX1RZUEUpCisJICAgIHx8IChhZGRyMS0+YWRkcl90eXBlID09IElQTUlfSVBNQl9CUk9BRENBU1RfQUREUl9UWVBFKSkKKwl7CisJCXN0cnVjdCBpcG1pX2lwbWJfYWRkciAqaXBtYl9hZGRyMQorCQkgICAgPSAoc3RydWN0IGlwbWlfaXBtYl9hZGRyICopIGFkZHIxOworCQlzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIgKmlwbWJfYWRkcjIKKwkJICAgID0gKHN0cnVjdCBpcG1pX2lwbWJfYWRkciAqKSBhZGRyMjsKKworCQlyZXR1cm4gKChpcG1iX2FkZHIxLT5zbGF2ZV9hZGRyID09IGlwbWJfYWRkcjItPnNsYXZlX2FkZHIpCisJCQkmJiAoaXBtYl9hZGRyMS0+bHVuID09IGlwbWJfYWRkcjItPmx1bikpOworCX0KKworCWlmIChhZGRyMS0+YWRkcl90eXBlID09IElQTUlfTEFOX0FERFJfVFlQRSkgeworCQlzdHJ1Y3QgaXBtaV9sYW5fYWRkciAqbGFuX2FkZHIxCisJCQk9IChzdHJ1Y3QgaXBtaV9sYW5fYWRkciAqKSBhZGRyMTsKKwkJc3RydWN0IGlwbWlfbGFuX2FkZHIgKmxhbl9hZGRyMgorCQkgICAgPSAoc3RydWN0IGlwbWlfbGFuX2FkZHIgKikgYWRkcjI7CisKKwkJcmV0dXJuICgobGFuX2FkZHIxLT5yZW1vdGVfU1dJRCA9PSBsYW5fYWRkcjItPnJlbW90ZV9TV0lEKQorCQkJJiYgKGxhbl9hZGRyMS0+bG9jYWxfU1dJRCA9PSBsYW5fYWRkcjItPmxvY2FsX1NXSUQpCisJCQkmJiAobGFuX2FkZHIxLT5zZXNzaW9uX2hhbmRsZQorCQkJICAgID09IGxhbl9hZGRyMi0+c2Vzc2lvbl9oYW5kbGUpCisJCQkmJiAobGFuX2FkZHIxLT5sdW4gPT0gbGFuX2FkZHIyLT5sdW4pKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGlwbWlfdmFsaWRhdGVfYWRkcihzdHJ1Y3QgaXBtaV9hZGRyICphZGRyLCBpbnQgbGVuKQoreworCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYWRkci0+YWRkcl90eXBlID09IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEUpIHsKKwkJaWYgKGFkZHItPmNoYW5uZWwgIT0gSVBNSV9CTUNfQ0hBTk5FTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGFkZHItPmNoYW5uZWwgPT0gSVBNSV9CTUNfQ0hBTk5FTCkKKwkgICAgfHwgKGFkZHItPmNoYW5uZWwgPj0gSVBNSV9OVU1fQ0hBTk5FTFMpCisJICAgIHx8IChhZGRyLT5jaGFubmVsIDwgMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChhZGRyLT5hZGRyX3R5cGUgPT0gSVBNSV9JUE1CX0FERFJfVFlQRSkKKwkgICAgfHwgKGFkZHItPmFkZHJfdHlwZSA9PSBJUE1JX0lQTUJfQlJPQURDQVNUX0FERFJfVFlQRSkpCisJeworCQlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBpcG1pX2lwbWJfYWRkcikpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldHVybiAwOworCX0KKworCWlmIChhZGRyLT5hZGRyX3R5cGUgPT0gSVBNSV9MQU5fQUREUl9UWVBFKSB7CisJCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGlwbWlfbGFuX2FkZHIpKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwordW5zaWduZWQgaW50IGlwbWlfYWRkcl9sZW5ndGgoaW50IGFkZHJfdHlwZSkKK3sKKwlpZiAoYWRkcl90eXBlID09IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEUpCisJCXJldHVybiBzaXplb2Yoc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyKTsKKworCWlmICgoYWRkcl90eXBlID09IElQTUlfSVBNQl9BRERSX1RZUEUpCisJICAgIHx8IChhZGRyX3R5cGUgPT0gSVBNSV9JUE1CX0JST0FEQ0FTVF9BRERSX1RZUEUpKQorCXsKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIpOworCX0KKworCWlmIChhZGRyX3R5cGUgPT0gSVBNSV9MQU5fQUREUl9UWVBFKQorCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpcG1pX2xhbl9hZGRyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZWxpdmVyX3Jlc3BvbnNlKHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2cpCit7CisJbXNnLT51c2VyLT5oYW5kbGVyLT5pcG1pX3JlY3ZfaG5kbChtc2csIG1zZy0+dXNlci0+aGFuZGxlcl9kYXRhKTsKK30KKworLyogRmluZCB0aGUgbmV4dCBzZXF1ZW5jZSBudW1iZXIgbm90IGJlaW5nIHVzZWQgYW5kIGFkZCB0aGUgZ2l2ZW4KKyAgIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gdGltZW91dCB0byB0aGUgc2VxdWVuY2UgdGFibGUuICBUaGlzIG11c3QgYmUKKyAgIGNhbGxlZCB3aXRoIHRoZSBpbnRlcmZhY2UncyBzZXFfbG9jayBoZWxkLiAqLworc3RhdGljIGludCBpbnRmX25leHRfc2VxKGlwbWlfc21pX3QgICAgICAgICAgIGludGYsCisJCQkgc3RydWN0IGlwbWlfcmVjdl9tc2cgKnJlY3ZfbXNnLAorCQkJIHVuc2lnbmVkIGxvbmcgICAgICAgIHRpbWVvdXQsCisJCQkgaW50ICAgICAgICAgICAgICAgICAgcmV0cmllcywKKwkJCSBpbnQgICAgICAgICAgICAgICAgICBicm9hZGNhc3QsCisJCQkgdW5zaWduZWQgY2hhciAgICAgICAgKnNlcSwKKwkJCSBsb25nICAgICAgICAgICAgICAgICAqc2VxaWQpCit7CisJaW50ICAgICAgICAgIHJ2ID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaT1pbnRmLT5jdXJyX3NlcTsKKwkgICAgIChpKzEpJUlQTUlfSVBNQl9OVU1fU0VRICE9IGludGYtPmN1cnJfc2VxOworCSAgICAgaT0oaSsxKSVJUE1JX0lQTUJfTlVNX1NFUSkKKwl7CisJCWlmICghIGludGYtPnNlcV90YWJsZVtpXS5pbnVzZSkKKwkJCWJyZWFrOworCX0KKworCWlmICghIGludGYtPnNlcV90YWJsZVtpXS5pbnVzZSkgeworCQlpbnRmLT5zZXFfdGFibGVbaV0ucmVjdl9tc2cgPSByZWN2X21zZzsKKworCQkvKiBTdGFydCB3aXRoIHRoZSBtYXhpbXVtIHRpbWVvdXQsIHdoZW4gdGhlIHNlbmQgcmVzcG9uc2UKKwkJICAgY29tZXMgaW4gd2Ugd2lsbCBzdGFydCB0aGUgcmVhbCB0aW1lci4gKi8KKwkJaW50Zi0+c2VxX3RhYmxlW2ldLnRpbWVvdXQgPSBNQVhfTVNHX1RJTUVPVVQ7CisJCWludGYtPnNlcV90YWJsZVtpXS5vcmlnX3RpbWVvdXQgPSB0aW1lb3V0OworCQlpbnRmLT5zZXFfdGFibGVbaV0ucmV0cmllc19sZWZ0ID0gcmV0cmllczsKKwkJaW50Zi0+c2VxX3RhYmxlW2ldLmJyb2FkY2FzdCA9IGJyb2FkY2FzdDsKKwkJaW50Zi0+c2VxX3RhYmxlW2ldLmludXNlID0gMTsKKwkJaW50Zi0+c2VxX3RhYmxlW2ldLnNlcWlkID0gTkVYVF9TRVFJRChpbnRmLT5zZXFfdGFibGVbaV0uc2VxaWQpOworCQkqc2VxID0gaTsKKwkJKnNlcWlkID0gaW50Zi0+c2VxX3RhYmxlW2ldLnNlcWlkOworCQlpbnRmLT5jdXJyX3NlcSA9IChpKzEpJUlQTUlfSVBNQl9OVU1fU0VROworCX0gZWxzZSB7CisJCXJ2ID0gLUVBR0FJTjsKKwl9CisJCisJcmV0dXJuIHJ2OworfQorCisvKiBSZXR1cm4gdGhlIHJlY2VpdmUgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIHNlcXVlbmNlIG51bWJlciBhbmQKKyAgIHJlbGVhc2UgdGhlIHNlcXVlbmNlIG51bWJlciBzbyBpdCBjYW4gYmUgcmV1c2VkLiAgU29tZSBvdGhlciBkYXRhCisgICBpcyBwYXNzZWQgaW4gdG8gYmUgc3VyZSB0aGUgbWVzc2FnZSBtYXRjaGVzIHVwIGNvcnJlY3RseSAodG8gaGVscAorICAgZ3VhcmQgYWdhaW5zdCBtZXNzYWdlIGNvbWluZyBpbiBhZnRlciB0aGVpciB0aW1lb3V0IGFuZCB0aGUKKyAgIHNlcXVlbmNlIG51bWJlciBiZWluZyByZXVzZWQpLiAqLworc3RhdGljIGludCBpbnRmX2ZpbmRfc2VxKGlwbWlfc21pX3QgICAgICAgICAgIGludGYsCisJCQkgdW5zaWduZWQgY2hhciAgICAgICAgc2VxLAorCQkJIHNob3J0ICAgICAgICAgICAgICAgIGNoYW5uZWwsCisJCQkgdW5zaWduZWQgY2hhciAgICAgICAgY21kLAorCQkJIHVuc2lnbmVkIGNoYXIgICAgICAgIG5ldGZuLAorCQkJIHN0cnVjdCBpcG1pX2FkZHIgICAgICphZGRyLAorCQkJIHN0cnVjdCBpcG1pX3JlY3ZfbXNnICoqcmVjdl9tc2cpCit7CisJaW50ICAgICAgICAgICBydiA9IC1FTk9ERVY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXEgPj0gSVBNSV9JUE1CX05VTV9TRVEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJihpbnRmLT5zZXFfbG9jayksIGZsYWdzKTsKKwlpZiAoaW50Zi0+c2VxX3RhYmxlW3NlcV0uaW51c2UpIHsKKwkJc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZyA9IGludGYtPnNlcV90YWJsZVtzZXFdLnJlY3ZfbXNnOworCisJCWlmICgobXNnLT5hZGRyLmNoYW5uZWwgPT0gY2hhbm5lbCkKKwkJICAgICYmIChtc2ctPm1zZy5jbWQgPT0gY21kKQorCQkgICAgJiYgKG1zZy0+bXNnLm5ldGZuID09IG5ldGZuKQorCQkgICAgJiYgKGlwbWlfYWRkcl9lcXVhbChhZGRyLCAmKG1zZy0+YWRkcikpKSkKKwkJeworCQkJKnJlY3ZfbXNnID0gbXNnOworCQkJaW50Zi0+c2VxX3RhYmxlW3NlcV0uaW51c2UgPSAwOworCQkJcnYgPSAwOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpbnRmLT5zZXFfbG9jayksIGZsYWdzKTsKKworCXJldHVybiBydjsKK30KKworCisvKiBTdGFydCB0aGUgdGltZXIgZm9yIGEgc3BlY2lmaWMgc2VxdWVuY2UgdGFibGUgZW50cnkuICovCitzdGF0aWMgaW50IGludGZfc3RhcnRfc2VxX3RpbWVyKGlwbWlfc21pX3QgaW50ZiwKKwkJCQlsb25nICAgICAgIG1zZ2lkKQoreworCWludCAgICAgICAgICAgcnYgPSAtRU5PREVWOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBzZXE7CisJdW5zaWduZWQgbG9uZyBzZXFpZDsKKworCisJR0VUX1NFUV9GUk9NX01TR0lEKG1zZ2lkLCBzZXEsIHNlcWlkKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoaW50Zi0+c2VxX2xvY2spLCBmbGFncyk7CisJLyogV2UgZG8gdGhpcyB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBjYW4gYmUgZGVsZXRlZAorICAgICAgICAgICB3aGlsZSBhIG1lc3NhZ2UgaXMgb3V0c3RhbmRpbmcuICovCisJaWYgKChpbnRmLT5zZXFfdGFibGVbc2VxXS5pbnVzZSkKKwkgICAgJiYgKGludGYtPnNlcV90YWJsZVtzZXFdLnNlcWlkID09IHNlcWlkKSkKKwl7CisJCXN0cnVjdCBzZXFfdGFibGUgKmVudCA9ICYoaW50Zi0+c2VxX3RhYmxlW3NlcV0pOworCQllbnQtPnRpbWVvdXQgPSBlbnQtPm9yaWdfdGltZW91dDsKKwkJcnYgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaW50Zi0+c2VxX2xvY2spLCBmbGFncyk7CisKKwlyZXR1cm4gcnY7Cit9CisKKy8qIEdvdCBhbiBlcnJvciBmb3IgdGhlIHNlbmQgbWVzc2FnZSBmb3IgYSBzcGVjaWZpYyBzZXF1ZW5jZSBudW1iZXIuICovCitzdGF0aWMgaW50IGludGZfZXJyX3NlcShpcG1pX3NtaV90ICAgaW50ZiwKKwkJCWxvbmcgICAgICAgICBtc2dpZCwKKwkJCXVuc2lnbmVkIGludCBlcnIpCit7CisJaW50ICAgICAgICAgICAgICAgICAgcnYgPSAtRU5PREVWOworCXVuc2lnbmVkIGxvbmcgICAgICAgIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgICAgICAgIHNlcTsKKwl1bnNpZ25lZCBsb25nICAgICAgICBzZXFpZDsKKwlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnID0gTlVMTDsKKworCisJR0VUX1NFUV9GUk9NX01TR0lEKG1zZ2lkLCBzZXEsIHNlcWlkKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoaW50Zi0+c2VxX2xvY2spLCBmbGFncyk7CisJLyogV2UgZG8gdGhpcyB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBjYW4gYmUgZGVsZXRlZAorICAgICAgICAgICB3aGlsZSBhIG1lc3NhZ2UgaXMgb3V0c3RhbmRpbmcuICovCisJaWYgKChpbnRmLT5zZXFfdGFibGVbc2VxXS5pbnVzZSkKKwkgICAgJiYgKGludGYtPnNlcV90YWJsZVtzZXFdLnNlcWlkID09IHNlcWlkKSkKKwl7CisJCXN0cnVjdCBzZXFfdGFibGUgKmVudCA9ICYoaW50Zi0+c2VxX3RhYmxlW3NlcV0pOworCisJCWVudC0+aW51c2UgPSAwOworCQltc2cgPSBlbnQtPnJlY3ZfbXNnOworCQlydiA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpbnRmLT5zZXFfbG9jayksIGZsYWdzKTsKKworCWlmIChtc2cpIHsKKwkJbXNnLT5yZWN2X3R5cGUgPSBJUE1JX1JFU1BPTlNFX1JFQ1ZfVFlQRTsKKwkJbXNnLT5tc2dfZGF0YVswXSA9IGVycjsKKwkJbXNnLT5tc2cubmV0Zm4gfD0gMTsgLyogQ29udmVydCB0byBhIHJlc3BvbnNlLiAqLworCQltc2ctPm1zZy5kYXRhX2xlbiA9IDE7CisJCW1zZy0+bXNnLmRhdGEgPSBtc2ctPm1zZ19kYXRhOworCQlkZWxpdmVyX3Jlc3BvbnNlKG1zZyk7CisJfQorCisJcmV0dXJuIHJ2OworfQorCisKK2ludCBpcG1pX2NyZWF0ZV91c2VyKHVuc2lnbmVkIGludCAgICAgICAgICBpZl9udW0sCisJCSAgICAgc3RydWN0IGlwbWlfdXNlcl9obmRsICpoYW5kbGVyLAorCQkgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqaGFuZGxlcl9kYXRhLAorCQkgICAgIGlwbWlfdXNlcl90ICAgICAgICAgICAqdXNlcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlwbWlfdXNlcl90ICAgbmV3X3VzZXI7CisJaW50ICAgICAgICAgICBydiA9IDA7CisJaXBtaV9zbWlfdCAgICBpbnRmOworCisJLyogVGhlcmUgaXMgbm8gbW9kdWxlIHVzZWNvdW50IGhlcmUsIGJlY2F1c2UgaXQncyBub3QKKyAgICAgICAgICAgcmVxdWlyZWQuICBTaW5jZSB0aGlzIGNhbiBvbmx5IGJlIHVzZWQgYnkgYW5kIGNhbGxlZCBmcm9tCisgICAgICAgICAgIG90aGVyIG1vZHVsZXMsIHRoZXkgd2lsbCBpbXBsaWNpdGx5IHVzZSB0aGlzIG1vZHVsZSwgYW5kCisgICAgICAgICAgIHRodXMgdGhpcyBjYW4ndCBiZSByZW1vdmVkIHVubGVzcyB0aGUgb3RoZXIgbW9kdWxlcyBhcmUKKyAgICAgICAgICAgcmVtb3ZlZC4gKi8KKworCWlmIChoYW5kbGVyID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogTWFrZSBzdXJlIHRoZSBkcml2ZXIgaXMgYWN0dWFsbHkgaW5pdGlhbGl6ZWQsIHRoaXMgaGFuZGxlcworCSAgIHByb2JsZW1zIHdpdGggaW5pdGlhbGl6YXRpb24gb3JkZXIuICovCisJaWYgKCFpbml0aWFsaXplZCkgeworCQlydiA9IGlwbWlfaW5pdF9tc2doYW5kbGVyKCk7CisJCWlmIChydikKKwkJCXJldHVybiBydjsKKworCQkvKiBUaGUgaW5pdCBjb2RlIGRvZXNuJ3QgcmV0dXJuIGFuIGVycm9yIGlmIGl0IHdhcyB0dXJuZWQKKwkJICAgb2ZmLCBidXQgaXQgd29uJ3QgaW5pdGlhbGl6ZS4gIENoZWNrIHRoYXQuICovCisJCWlmICghaW5pdGlhbGl6ZWQpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwluZXdfdXNlciA9IGttYWxsb2Moc2l6ZW9mKCpuZXdfdXNlciksIEdGUF9LRVJORUwpOworCWlmICghIG5ld191c2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRvd25fcmVhZCgmaW50ZXJmYWNlc19zZW0pOworCWlmICgoaWZfbnVtID4gTUFYX0lQTUlfSU5URVJGQUNFUykgfHwgaXBtaV9pbnRlcmZhY2VzW2lmX251bV0gPT0gTlVMTCkKKwl7CisJCXJ2ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWludGYgPSBpcG1pX2ludGVyZmFjZXNbaWZfbnVtXTsKKworCW5ld191c2VyLT5oYW5kbGVyID0gaGFuZGxlcjsKKwluZXdfdXNlci0+aGFuZGxlcl9kYXRhID0gaGFuZGxlcl9kYXRhOworCW5ld191c2VyLT5pbnRmID0gaW50ZjsKKwluZXdfdXNlci0+Z2V0c19ldmVudHMgPSAwOworCisJaWYgKCF0cnlfbW9kdWxlX2dldChpbnRmLT5oYW5kbGVycy0+b3duZXIpKSB7CisJCXJ2ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmIChpbnRmLT5oYW5kbGVycy0+aW5jX3VzZWNvdW50KSB7CisJCXJ2ID0gaW50Zi0+aGFuZGxlcnMtPmluY191c2Vjb3VudChpbnRmLT5zZW5kX2luZm8pOworCQlpZiAocnYpIHsKKwkJCW1vZHVsZV9wdXQoaW50Zi0+aGFuZGxlcnMtPm93bmVyKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCX0KKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmaW50Zi0+dXNlcnNfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJm5ld191c2VyLT5saW5rLCAmaW50Zi0+dXNlcnMpOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT51c2Vyc19sb2NrLCBmbGFncyk7CisKKyBvdXRfdW5sb2NrOgkKKwlpZiAocnYpIHsKKwkJa2ZyZWUobmV3X3VzZXIpOworCX0gZWxzZSB7CisJCSp1c2VyID0gbmV3X3VzZXI7CisJfQorCisJdXBfcmVhZCgmaW50ZXJmYWNlc19zZW0pOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBpcG1pX2Rlc3Ryb3lfdXNlcl9ub2xvY2soaXBtaV91c2VyX3QgdXNlcikKK3sKKwlpbnQgICAgICAgICAgICAgIHJ2ID0gLUVOT0RFVjsKKwlpcG1pX3VzZXJfdCAgICAgIHRfdXNlcjsKKwlzdHJ1Y3QgY21kX3JjdnIgICpyY3ZyLCAqcmN2cjI7CisJaW50ICAgICAgICAgICAgICBpOworCXVuc2lnbmVkIGxvbmcgICAgZmxhZ3M7CisKKwkvKiBGaW5kIHRoZSB1c2VyIGFuZCBkZWxldGUgdGhlbSBmcm9tIHRoZSBsaXN0LiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodF91c2VyLCAmKHVzZXItPmludGYtPnVzZXJzKSwgbGluaykgeworCQlpZiAodF91c2VyID09IHVzZXIpIHsKKwkJCWxpc3RfZGVsKCZ0X3VzZXItPmxpbmspOworCQkJcnYgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocnYpIHsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qIFJlbW92ZSB0aGUgdXNlciBmcm9tIHRoZSBpbnRlcmZhY2VzIHNlcXVlbmNlIHRhYmxlLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCYodXNlci0+aW50Zi0+c2VxX2xvY2spLCBmbGFncyk7CisJZm9yIChpPTA7IGk8SVBNSV9JUE1CX05VTV9TRVE7IGkrKykgeworCQlpZiAodXNlci0+aW50Zi0+c2VxX3RhYmxlW2ldLmludXNlCisJCSAgICAmJiAodXNlci0+aW50Zi0+c2VxX3RhYmxlW2ldLnJlY3ZfbXNnLT51c2VyID09IHVzZXIpKQorCQl7CisJCQl1c2VyLT5pbnRmLT5zZXFfdGFibGVbaV0uaW51c2UgPSAwOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJih1c2VyLT5pbnRmLT5zZXFfbG9jayksIGZsYWdzKTsKKworCS8qIFJlbW92ZSB0aGUgdXNlciBmcm9tIHRoZSBjb21tYW5kIHJlY2VpdmVyJ3MgdGFibGUuICovCisJd3JpdGVfbG9ja19pcnFzYXZlKCYodXNlci0+aW50Zi0+Y21kX3JjdnJfbG9jayksIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmN2ciwgcmN2cjIsICYodXNlci0+aW50Zi0+Y21kX3JjdnJzKSwgbGluaykgeworCQlpZiAocmN2ci0+dXNlciA9PSB1c2VyKSB7CisJCQlsaXN0X2RlbCgmcmN2ci0+bGluayk7CisJCQlrZnJlZShyY3ZyKTsKKwkJfQorCX0KKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmKHVzZXItPmludGYtPmNtZF9yY3ZyX2xvY2spLCBmbGFncyk7CisKKwlrZnJlZSh1c2VyKTsKKworIG91dF91bmxvY2s6CisKKwlyZXR1cm4gcnY7Cit9CisKK2ludCBpcG1pX2Rlc3Ryb3lfdXNlcihpcG1pX3VzZXJfdCB1c2VyKQoreworCWludCAgICAgICAgICAgcnY7CisJaXBtaV9zbWlfdCAgICBpbnRmID0gdXNlci0+aW50ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZG93bl9yZWFkKCZpbnRlcmZhY2VzX3NlbSk7CisJd3JpdGVfbG9ja19pcnFzYXZlKCZpbnRmLT51c2Vyc19sb2NrLCBmbGFncyk7CisJcnYgPSBpcG1pX2Rlc3Ryb3lfdXNlcl9ub2xvY2sodXNlcik7CisJaWYgKCFydikgeworCQltb2R1bGVfcHV0KGludGYtPmhhbmRsZXJzLT5vd25lcik7CisJCWlmIChpbnRmLT5oYW5kbGVycy0+ZGVjX3VzZWNvdW50KQorCQkJaW50Zi0+aGFuZGxlcnMtPmRlY191c2Vjb3VudChpbnRmLT5zZW5kX2luZm8pOworCX0KKwkJCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPnVzZXJzX2xvY2ssIGZsYWdzKTsKKwl1cF9yZWFkKCZpbnRlcmZhY2VzX3NlbSk7CisJcmV0dXJuIHJ2OworfQorCit2b2lkIGlwbWlfZ2V0X3ZlcnNpb24oaXBtaV91c2VyX3QgICB1c2VyLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICptYWpvciwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqbWlub3IpCit7CisJKm1ham9yID0gdXNlci0+aW50Zi0+dmVyc2lvbl9tYWpvcjsKKwkqbWlub3IgPSB1c2VyLT5pbnRmLT52ZXJzaW9uX21pbm9yOworfQorCit2b2lkIGlwbWlfc2V0X215X2FkZHJlc3MoaXBtaV91c2VyX3QgICB1c2VyLAorCQkJIHVuc2lnbmVkIGNoYXIgYWRkcmVzcykKK3sKKwl1c2VyLT5pbnRmLT5teV9hZGRyZXNzID0gYWRkcmVzczsKK30KKwordW5zaWduZWQgY2hhciBpcG1pX2dldF9teV9hZGRyZXNzKGlwbWlfdXNlcl90IHVzZXIpCit7CisJcmV0dXJuIHVzZXItPmludGYtPm15X2FkZHJlc3M7Cit9CisKK3ZvaWQgaXBtaV9zZXRfbXlfTFVOKGlwbWlfdXNlcl90ICAgdXNlciwKKwkJICAgICB1bnNpZ25lZCBjaGFyIExVTikKK3sKKwl1c2VyLT5pbnRmLT5teV9sdW4gPSBMVU4gJiAweDM7Cit9CisKK3Vuc2lnbmVkIGNoYXIgaXBtaV9nZXRfbXlfTFVOKGlwbWlfdXNlcl90IHVzZXIpCit7CisJcmV0dXJuIHVzZXItPmludGYtPm15X2x1bjsKK30KKworaW50IGlwbWlfc2V0X2dldHNfZXZlbnRzKGlwbWlfdXNlcl90IHVzZXIsIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyAgICAgICAgIGZsYWdzOworCXN0cnVjdCBpcG1pX3JlY3ZfbXNnICAqbXNnLCAqbXNnMjsKKworCXJlYWRfbG9jaygmKHVzZXItPmludGYtPnVzZXJzX2xvY2spKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHVzZXItPmludGYtPmV2ZW50c19sb2NrKSwgZmxhZ3MpOworCXVzZXItPmdldHNfZXZlbnRzID0gdmFsOworCisJaWYgKHZhbCkgeworCQkvKiBEZWxpdmVyIGFueSBxdWV1ZWQgZXZlbnRzLiAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCBtc2cyLCAmKHVzZXItPmludGYtPndhaXRpbmdfZXZlbnRzKSwgbGluaykgeworCQkJbGlzdF9kZWwoJm1zZy0+bGluayk7CisJCQltc2ctPnVzZXIgPSB1c2VyOworCQkJZGVsaXZlcl9yZXNwb25zZShtc2cpOworCQl9CisJfQorCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJih1c2VyLT5pbnRmLT5ldmVudHNfbG9jayksIGZsYWdzKTsKKwlyZWFkX3VubG9jaygmKHVzZXItPmludGYtPnVzZXJzX2xvY2spKTsKKworCXJldHVybiAwOworfQorCitpbnQgaXBtaV9yZWdpc3Rlcl9mb3JfY21kKGlwbWlfdXNlcl90ICAgdXNlciwKKwkJCSAgdW5zaWduZWQgY2hhciBuZXRmbiwKKwkJCSAgdW5zaWduZWQgY2hhciBjbWQpCit7CisJc3RydWN0IGNtZF9yY3ZyICAqY21wOworCXVuc2lnbmVkIGxvbmcgICAgZmxhZ3M7CisJc3RydWN0IGNtZF9yY3ZyICAqcmN2cjsKKwlpbnQgICAgICAgICAgICAgIHJ2ID0gMDsKKworCisJcmN2ciA9IGttYWxsb2Moc2l6ZW9mKCpyY3ZyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEgcmN2cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZWFkX2xvY2soJih1c2VyLT5pbnRmLT51c2Vyc19sb2NrKSk7CisJd3JpdGVfbG9ja19pcnFzYXZlKCYodXNlci0+aW50Zi0+Y21kX3JjdnJfbG9jayksIGZsYWdzKTsKKwlpZiAodXNlci0+aW50Zi0+YWxsX2NtZF9yY3ZyICE9IE5VTEwpIHsKKwkJcnYgPSAtRUJVU1k7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhlIGNvbW1hbmQvbmV0Zm4gaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNtcCwgJih1c2VyLT5pbnRmLT5jbWRfcmN2cnMpLCBsaW5rKSB7CisJCWlmICgoY21wLT5uZXRmbiA9PSBuZXRmbikgJiYgKGNtcC0+Y21kID09IGNtZCkpIHsKKwkJCXJ2ID0gLUVCVVNZOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoISBydikgeworCQlyY3ZyLT5jbWQgPSBjbWQ7CisJCXJjdnItPm5ldGZuID0gbmV0Zm47CisJCXJjdnItPnVzZXIgPSB1c2VyOworCQlsaXN0X2FkZF90YWlsKCYocmN2ci0+bGluayksICYodXNlci0+aW50Zi0+Y21kX3JjdnJzKSk7CisJfQorIG91dF91bmxvY2s6CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJih1c2VyLT5pbnRmLT5jbWRfcmN2cl9sb2NrKSwgZmxhZ3MpOworCXJlYWRfdW5sb2NrKCYodXNlci0+aW50Zi0+dXNlcnNfbG9jaykpOworCisJaWYgKHJ2KQorCQlrZnJlZShyY3ZyKTsKKworCXJldHVybiBydjsKK30KKworaW50IGlwbWlfdW5yZWdpc3Rlcl9mb3JfY21kKGlwbWlfdXNlcl90ICAgdXNlciwKKwkJCSAgICB1bnNpZ25lZCBjaGFyIG5ldGZuLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgY21kKQoreworCXVuc2lnbmVkIGxvbmcgICAgZmxhZ3M7CisJc3RydWN0IGNtZF9yY3ZyICAqcmN2cjsKKwlpbnQgICAgICAgICAgICAgIHJ2ID0gLUVOT0VOVDsKKworCXJlYWRfbG9jaygmKHVzZXItPmludGYtPnVzZXJzX2xvY2spKTsKKwl3cml0ZV9sb2NrX2lycXNhdmUoJih1c2VyLT5pbnRmLT5jbWRfcmN2cl9sb2NrKSwgZmxhZ3MpOworCS8qIE1ha2Ugc3VyZSB0aGUgY29tbWFuZC9uZXRmbiBpcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocmN2ciwgJih1c2VyLT5pbnRmLT5jbWRfcmN2cnMpLCBsaW5rKSB7CisJCWlmICgocmN2ci0+bmV0Zm4gPT0gbmV0Zm4pICYmIChyY3ZyLT5jbWQgPT0gY21kKSkgeworCQkJcnYgPSAwOworCQkJbGlzdF9kZWwoJnJjdnItPmxpbmspOworCQkJa2ZyZWUocmN2cik7CisJCQlicmVhazsKKwkJfQorCX0KKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmKHVzZXItPmludGYtPmNtZF9yY3ZyX2xvY2spLCBmbGFncyk7CisJcmVhZF91bmxvY2soJih1c2VyLT5pbnRmLT51c2Vyc19sb2NrKSk7CisKKwlyZXR1cm4gcnY7Cit9CisKK3ZvaWQgaXBtaV91c2VyX3NldF9ydW5fdG9fY29tcGxldGlvbihpcG1pX3VzZXJfdCB1c2VyLCBpbnQgdmFsKQoreworCXVzZXItPmludGYtPmhhbmRsZXJzLT5zZXRfcnVuX3RvX2NvbXBsZXRpb24odXNlci0+aW50Zi0+c2VuZF9pbmZvLAorCQkJCQkJICAgIHZhbCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitpcG1iX2NoZWNrc3VtKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBzaXplKQoreworCXVuc2lnbmVkIGNoYXIgY3N1bSA9IDA7CisJCisJZm9yICg7IHNpemUgPiAwOyBzaXplLS0sIGRhdGErKykKKwkJY3N1bSArPSAqZGF0YTsKKworCXJldHVybiAtY3N1bTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZvcm1hdF9pcG1iX21zZyhzdHJ1Y3QgaXBtaV9zbWlfbXNnICAgKnNtaV9tc2csCisJCQkJICAgc3RydWN0IGtlcm5lbF9pcG1pX21zZyAqbXNnLAorCQkJCSAgIHN0cnVjdCBpcG1pX2lwbWJfYWRkciAqaXBtYl9hZGRyLAorCQkJCSAgIGxvbmcgICAgICAgICAgICAgICAgICBtc2dpZCwKKwkJCQkgICB1bnNpZ25lZCBjaGFyICAgICAgICAgaXBtYl9zZXEsCisJCQkJICAgaW50ICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdCwKKwkJCQkgICB1bnNpZ25lZCBjaGFyICAgICAgICAgc291cmNlX2FkZHJlc3MsCisJCQkJICAgdW5zaWduZWQgY2hhciAgICAgICAgIHNvdXJjZV9sdW4pCit7CisJaW50IGkgPSBicm9hZGNhc3Q7CisKKwkvKiBGb3JtYXQgdGhlIElQTUIgaGVhZGVyIGRhdGEuICovCisJc21pX21zZy0+ZGF0YVswXSA9IChJUE1JX05FVEZOX0FQUF9SRVFVRVNUIDw8IDIpOworCXNtaV9tc2ctPmRhdGFbMV0gPSBJUE1JX1NFTkRfTVNHX0NNRDsKKwlzbWlfbXNnLT5kYXRhWzJdID0gaXBtYl9hZGRyLT5jaGFubmVsOworCWlmIChicm9hZGNhc3QpCisJCXNtaV9tc2ctPmRhdGFbM10gPSAwOworCXNtaV9tc2ctPmRhdGFbaSszXSA9IGlwbWJfYWRkci0+c2xhdmVfYWRkcjsKKwlzbWlfbXNnLT5kYXRhW2krNF0gPSAobXNnLT5uZXRmbiA8PCAyKSB8IChpcG1iX2FkZHItPmx1biAmIDB4Myk7CisJc21pX21zZy0+ZGF0YVtpKzVdID0gaXBtYl9jaGVja3N1bSgmKHNtaV9tc2ctPmRhdGFbaSszXSksIDIpOworCXNtaV9tc2ctPmRhdGFbaSs2XSA9IHNvdXJjZV9hZGRyZXNzOworCXNtaV9tc2ctPmRhdGFbaSs3XSA9IChpcG1iX3NlcSA8PCAyKSB8IHNvdXJjZV9sdW47CisJc21pX21zZy0+ZGF0YVtpKzhdID0gbXNnLT5jbWQ7CisKKwkvKiBOb3cgdGFjayBvbiB0aGUgZGF0YSB0byB0aGUgbWVzc2FnZS4gKi8KKwlpZiAobXNnLT5kYXRhX2xlbiA+IDApCisJCW1lbWNweSgmKHNtaV9tc2ctPmRhdGFbaSs5XSksIG1zZy0+ZGF0YSwKKwkJICAgICAgIG1zZy0+ZGF0YV9sZW4pOworCXNtaV9tc2ctPmRhdGFfc2l6ZSA9IG1zZy0+ZGF0YV9sZW4gKyA5OworCisJLyogTm93IGNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gYW5kIHRhY2sgaXQgb24uICovCisJc21pX21zZy0+ZGF0YVtpK3NtaV9tc2ctPmRhdGFfc2l6ZV0KKwkJPSBpcG1iX2NoZWNrc3VtKCYoc21pX21zZy0+ZGF0YVtpKzZdKSwKKwkJCQlzbWlfbXNnLT5kYXRhX3NpemUtNik7CisKKwkvKiBBZGQgb24gdGhlIGNoZWNrc3VtIHNpemUgYW5kIHRoZSBvZmZzZXQgZnJvbSB0aGUKKwkgICBicm9hZGNhc3QuICovCisJc21pX21zZy0+ZGF0YV9zaXplICs9IDEgKyBpOworCisJc21pX21zZy0+bXNnaWQgPSBtc2dpZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZvcm1hdF9sYW5fbXNnKHN0cnVjdCBpcG1pX3NtaV9tc2cgICAqc21pX21zZywKKwkJCQkgIHN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgKm1zZywKKwkJCQkgIHN0cnVjdCBpcG1pX2xhbl9hZGRyICAqbGFuX2FkZHIsCisJCQkJICBsb25nICAgICAgICAgICAgICAgICAgbXNnaWQsCisJCQkJICB1bnNpZ25lZCBjaGFyICAgICAgICAgaXBtYl9zZXEsCisJCQkJICB1bnNpZ25lZCBjaGFyICAgICAgICAgc291cmNlX2x1bikKK3sKKwkvKiBGb3JtYXQgdGhlIElQTUIgaGVhZGVyIGRhdGEuICovCisJc21pX21zZy0+ZGF0YVswXSA9IChJUE1JX05FVEZOX0FQUF9SRVFVRVNUIDw8IDIpOworCXNtaV9tc2ctPmRhdGFbMV0gPSBJUE1JX1NFTkRfTVNHX0NNRDsKKwlzbWlfbXNnLT5kYXRhWzJdID0gbGFuX2FkZHItPmNoYW5uZWw7CisJc21pX21zZy0+ZGF0YVszXSA9IGxhbl9hZGRyLT5zZXNzaW9uX2hhbmRsZTsKKwlzbWlfbXNnLT5kYXRhWzRdID0gbGFuX2FkZHItPnJlbW90ZV9TV0lEOworCXNtaV9tc2ctPmRhdGFbNV0gPSAobXNnLT5uZXRmbiA8PCAyKSB8IChsYW5fYWRkci0+bHVuICYgMHgzKTsKKwlzbWlfbXNnLT5kYXRhWzZdID0gaXBtYl9jaGVja3N1bSgmKHNtaV9tc2ctPmRhdGFbNF0pLCAyKTsKKwlzbWlfbXNnLT5kYXRhWzddID0gbGFuX2FkZHItPmxvY2FsX1NXSUQ7CisJc21pX21zZy0+ZGF0YVs4XSA9IChpcG1iX3NlcSA8PCAyKSB8IHNvdXJjZV9sdW47CisJc21pX21zZy0+ZGF0YVs5XSA9IG1zZy0+Y21kOworCisJLyogTm93IHRhY2sgb24gdGhlIGRhdGEgdG8gdGhlIG1lc3NhZ2UuICovCisJaWYgKG1zZy0+ZGF0YV9sZW4gPiAwKQorCQltZW1jcHkoJihzbWlfbXNnLT5kYXRhWzEwXSksIG1zZy0+ZGF0YSwKKwkJICAgICAgIG1zZy0+ZGF0YV9sZW4pOworCXNtaV9tc2ctPmRhdGFfc2l6ZSA9IG1zZy0+ZGF0YV9sZW4gKyAxMDsKKworCS8qIE5vdyBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtIGFuZCB0YWNrIGl0IG9uLiAqLworCXNtaV9tc2ctPmRhdGFbc21pX21zZy0+ZGF0YV9zaXplXQorCQk9IGlwbWJfY2hlY2tzdW0oJihzbWlfbXNnLT5kYXRhWzddKSwKKwkJCQlzbWlfbXNnLT5kYXRhX3NpemUtNyk7CisKKwkvKiBBZGQgb24gdGhlIGNoZWNrc3VtIHNpemUgYW5kIHRoZSBvZmZzZXQgZnJvbSB0aGUKKwkgICBicm9hZGNhc3QuICovCisJc21pX21zZy0+ZGF0YV9zaXplICs9IDE7CisKKwlzbWlfbXNnLT5tc2dpZCA9IG1zZ2lkOworfQorCisvKiBTZXBhcmF0ZSBmcm9tIGlwbWlfcmVxdWVzdCBzbyB0aGF0IHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgdG8gYmUKKyAgIHN1cHBsaWVkIGluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyAobWFpbmx5IGF0IHBhbmljIHRpbWUpLiAgSWYKKyAgIG1lc3NhZ2VzIGFyZSBzdXBwbGllZCwgdGhleSB3aWxsIGJlIGZyZWVkLCBldmVuIGlmIGFuIGVycm9yCisgICBvY2N1cnMuICovCitzdGF0aWMgaW5saW5lIGludCBpX2lwbWlfcmVxdWVzdChpcG1pX3VzZXJfdCAgICAgICAgICB1c2VyLAorCQkJCSBpcG1pX3NtaV90ICAgICAgICAgICBpbnRmLAorCQkJCSBzdHJ1Y3QgaXBtaV9hZGRyICAgICAqYWRkciwKKwkJCQkgbG9uZyAgICAgICAgICAgICAgICAgbXNnaWQsCisJCQkJIHN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgKm1zZywKKwkJCQkgdm9pZCAgICAgICAgICAgICAgICAgKnVzZXJfbXNnX2RhdGEsCisJCQkJIHZvaWQgICAgICAgICAgICAgICAgICpzdXBwbGllZF9zbWksCisJCQkJIHN0cnVjdCBpcG1pX3JlY3ZfbXNnICpzdXBwbGllZF9yZWN2LAorCQkJCSBpbnQgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKKwkJCQkgdW5zaWduZWQgY2hhciAgICAgICAgc291cmNlX2FkZHJlc3MsCisJCQkJIHVuc2lnbmVkIGNoYXIgICAgICAgIHNvdXJjZV9sdW4sCisJCQkJIGludCAgICAgICAgICAgICAgICAgIHJldHJpZXMsCisJCQkJIHVuc2lnbmVkIGludCAgICAgICAgIHJldHJ5X3RpbWVfbXMpCit7CisJaW50ICAgICAgICAgICAgICAgICAgcnYgPSAwOworCXN0cnVjdCBpcG1pX3NtaV9tc2cgICpzbWlfbXNnOworCXN0cnVjdCBpcG1pX3JlY3ZfbXNnICpyZWN2X21zZzsKKwl1bnNpZ25lZCBsb25nICAgICAgICBmbGFnczsKKworCisJaWYgKHN1cHBsaWVkX3JlY3YpIHsKKwkJcmVjdl9tc2cgPSBzdXBwbGllZF9yZWN2OworCX0gZWxzZSB7CisJCXJlY3ZfbXNnID0gaXBtaV9hbGxvY19yZWN2X21zZygpOworCQlpZiAocmVjdl9tc2cgPT0gTlVMTCkgeworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJcmVjdl9tc2ctPnVzZXJfbXNnX2RhdGEgPSB1c2VyX21zZ19kYXRhOworCisJaWYgKHN1cHBsaWVkX3NtaSkgeworCQlzbWlfbXNnID0gKHN0cnVjdCBpcG1pX3NtaV9tc2cgKikgc3VwcGxpZWRfc21pOworCX0gZWxzZSB7CisJCXNtaV9tc2cgPSBpcG1pX2FsbG9jX3NtaV9tc2coKTsKKwkJaWYgKHNtaV9tc2cgPT0gTlVMTCkgeworCQkJaXBtaV9mcmVlX3JlY3ZfbXNnKHJlY3ZfbXNnKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJcmVjdl9tc2ctPnVzZXIgPSB1c2VyOworCXJlY3ZfbXNnLT5tc2dpZCA9IG1zZ2lkOworCS8qIFN0b3JlIHRoZSBtZXNzYWdlIHRvIHNlbmQgaW4gdGhlIHJlY2VpdmUgbWVzc2FnZSBzbyB0aW1lb3V0CisJICAgcmVzcG9uc2VzIGNhbiBnZXQgdGhlIHByb3BlciByZXNwb25zZSBkYXRhLiAqLworCXJlY3ZfbXNnLT5tc2cgPSAqbXNnOworCisJaWYgKGFkZHItPmFkZHJfdHlwZSA9PSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFKSB7CisJCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciAqc21pX2FkZHI7CisKKwkJaWYgKG1zZy0+bmV0Zm4gJiAxKSB7CisJCQkvKiBSZXNwb25zZXMgYXJlIG5vdCBhbGxvd2VkIHRvIHRoZSBTTUkuICovCisJCQlydiA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQlzbWlfYWRkciA9IChzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgKikgYWRkcjsKKwkJaWYgKHNtaV9hZGRyLT5sdW4gPiAzKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlpbnRmLT5zZW50X2ludmFsaWRfY29tbWFuZHMrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJcnYgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZXJyOworCQl9CisKKwkJbWVtY3B5KCZyZWN2X21zZy0+YWRkciwgc21pX2FkZHIsIHNpemVvZigqc21pX2FkZHIpKTsKKworCQlpZiAoKG1zZy0+bmV0Zm4gPT0gSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCkKKwkJICAgICYmICgobXNnLT5jbWQgPT0gSVBNSV9TRU5EX01TR19DTUQpCisJCQl8fCAobXNnLT5jbWQgPT0gSVBNSV9HRVRfTVNHX0NNRCkKKwkJCXx8IChtc2ctPmNtZCA9PSBJUE1JX1JFQURfRVZFTlRfTVNHX0JVRkZFUl9DTUQpKSkKKwkJeworCQkJLyogV2UgZG9uJ3QgbGV0IHRoZSB1c2VyIGRvIHRoZXNlLCBzaW5jZSB3ZSBtYW5hZ2UKKwkJCSAgIHRoZSBzZXF1ZW5jZSBudW1iZXJzLiAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJaW50Zi0+c2VudF9pbnZhbGlkX2NvbW1hbmRzKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCXJ2ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCisJCWlmICgobXNnLT5kYXRhX2xlbiArIDIpID4gSVBNSV9NQVhfTVNHX0xFTkdUSCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJaW50Zi0+c2VudF9pbnZhbGlkX2NvbW1hbmRzKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCXJ2ID0gLUVNU0dTSVpFOworCQkJZ290byBvdXRfZXJyOworCQl9CisKKwkJc21pX21zZy0+ZGF0YVswXSA9IChtc2ctPm5ldGZuIDw8IDIpIHwgKHNtaV9hZGRyLT5sdW4gJiAweDMpOworCQlzbWlfbXNnLT5kYXRhWzFdID0gbXNnLT5jbWQ7CisJCXNtaV9tc2ctPm1zZ2lkID0gbXNnaWQ7CisJCXNtaV9tc2ctPnVzZXJfZGF0YSA9IHJlY3ZfbXNnOworCQlpZiAobXNnLT5kYXRhX2xlbiA+IDApCisJCQltZW1jcHkoJihzbWlfbXNnLT5kYXRhWzJdKSwgbXNnLT5kYXRhLCBtc2ctPmRhdGFfbGVuKTsKKwkJc21pX21zZy0+ZGF0YV9zaXplID0gbXNnLT5kYXRhX2xlbiArIDI7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJaW50Zi0+c2VudF9sb2NhbF9jb21tYW5kcysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgaWYgKChhZGRyLT5hZGRyX3R5cGUgPT0gSVBNSV9JUE1CX0FERFJfVFlQRSkKKwkJICAgfHwgKGFkZHItPmFkZHJfdHlwZSA9PSBJUE1JX0lQTUJfQlJPQURDQVNUX0FERFJfVFlQRSkpCisJeworCQlzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIgKmlwbWJfYWRkcjsKKwkJdW5zaWduZWQgY2hhciAgICAgICAgIGlwbWJfc2VxOworCQlsb25nICAgICAgICAgICAgICAgICAgc2VxaWQ7CisJCWludCAgICAgICAgICAgICAgICAgICBicm9hZGNhc3QgPSAwOworCisJCWlmIChhZGRyLT5jaGFubmVsID4gSVBNSV9OVU1fQ0hBTk5FTFMpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWludGYtPnNlbnRfaW52YWxpZF9jb21tYW5kcysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlydiA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQlpZiAoaW50Zi0+Y2hhbm5lbHNbYWRkci0+Y2hhbm5lbF0ubWVkaXVtCisJCSAgICAhPSBJUE1JX0NIQU5ORUxfTUVESVVNX0lQTUIpCisJCXsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWludGYtPnNlbnRfaW52YWxpZF9jb21tYW5kcysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlydiA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQlpZiAocmV0cmllcyA8IDApIHsKKwkJICAgIGlmIChhZGRyLT5hZGRyX3R5cGUgPT0gSVBNSV9JUE1CX0JST0FEQ0FTVF9BRERSX1RZUEUpCisJCQlyZXRyaWVzID0gMDsgLyogRG9uJ3QgcmV0cnkgYnJvYWRjYXN0cy4gKi8KKwkJICAgIGVsc2UKKwkJCXJldHJpZXMgPSA0OworCQl9CisJCWlmIChhZGRyLT5hZGRyX3R5cGUgPT0gSVBNSV9JUE1CX0JST0FEQ0FTVF9BRERSX1RZUEUpIHsKKwkJICAgIC8qIEJyb2FkY2FzdHMgYWRkIGEgemVybyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorCQkgICAgICAgbWVzc2FnZSwgYnV0IG90aGVyd2lzZSBpcyB0aGUgc2FtZSBhcyBhbiBJUE1CCisJCSAgICAgICBhZGRyZXNzLiAqLworCQkgICAgYWRkci0+YWRkcl90eXBlID0gSVBNSV9JUE1CX0FERFJfVFlQRTsKKwkJICAgIGJyb2FkY2FzdCA9IDE7CisJCX0KKworCisJCS8qIERlZmF1bHQgdG8gMSBzZWNvbmQgcmV0cmllcy4gKi8KKwkJaWYgKHJldHJ5X3RpbWVfbXMgPT0gMCkKKwkJICAgIHJldHJ5X3RpbWVfbXMgPSAxMDAwOworCisJCS8qIDkgZm9yIHRoZSBoZWFkZXIgYW5kIDEgZm9yIHRoZSBjaGVja3N1bSwgcGx1cworICAgICAgICAgICAgICAgICAgIHBvc3NpYmx5IG9uZSBmb3IgdGhlIGJyb2FkY2FzdC4gKi8KKwkJaWYgKChtc2ctPmRhdGFfbGVuICsgMTAgKyBicm9hZGNhc3QpID4gSVBNSV9NQVhfTVNHX0xFTkdUSCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJaW50Zi0+c2VudF9pbnZhbGlkX2NvbW1hbmRzKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCXJ2ID0gLUVNU0dTSVpFOworCQkJZ290byBvdXRfZXJyOworCQl9CisKKwkJaXBtYl9hZGRyID0gKHN0cnVjdCBpcG1pX2lwbWJfYWRkciAqKSBhZGRyOworCQlpZiAoaXBtYl9hZGRyLT5sdW4gPiAzKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlpbnRmLT5zZW50X2ludmFsaWRfY29tbWFuZHMrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJcnYgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZXJyOworCQl9CisKKwkJbWVtY3B5KCZyZWN2X21zZy0+YWRkciwgaXBtYl9hZGRyLCBzaXplb2YoKmlwbWJfYWRkcikpOworCisJCWlmIChyZWN2X21zZy0+bXNnLm5ldGZuICYgMHgxKSB7CisJCQkvKiBJdCdzIGEgcmVzcG9uc2UsIHNvIHVzZSB0aGUgdXNlcidzIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1zZ2lkLiAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJaW50Zi0+c2VudF9pcG1iX3Jlc3BvbnNlcysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlmb3JtYXRfaXBtYl9tc2coc21pX21zZywgbXNnLCBpcG1iX2FkZHIsIG1zZ2lkLAorCQkJCQltc2dpZCwgYnJvYWRjYXN0LAorCQkJCQlzb3VyY2VfYWRkcmVzcywgc291cmNlX2x1bik7CisKKwkJCS8qIFNhdmUgdGhlIHJlY2VpdmUgbWVzc2FnZSBzbyB3ZSBjYW4gdXNlIGl0CisJCQkgICB0byBkZWxpdmVyIHRoZSByZXNwb25zZS4gKi8KKwkJCXNtaV9tc2ctPnVzZXJfZGF0YSA9IHJlY3ZfbXNnOworCQl9IGVsc2UgeworCQkJLyogSXQncyBhIGNvbW1hbmQsIHNvIGdldCBhIHNlcXVlbmNlIGZvciBpdC4gKi8KKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJihpbnRmLT5zZXFfbG9jayksIGZsYWdzKTsKKworCQkJc3Bpbl9sb2NrKCZpbnRmLT5jb3VudGVyX2xvY2spOworCQkJaW50Zi0+c2VudF9pcG1iX2NvbW1hbmRzKys7CisJCQlzcGluX3VubG9jaygmaW50Zi0+Y291bnRlcl9sb2NrKTsKKworCQkJLyogQ3JlYXRlIGEgc2VxdWVuY2UgbnVtYmVyIHdpdGggYSAxIHNlY29uZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCBhbmQgNCByZXRyaWVzLiAqLworCQkJcnYgPSBpbnRmX25leHRfc2VxKGludGYsCisJCQkJCSAgIHJlY3ZfbXNnLAorCQkJCQkgICByZXRyeV90aW1lX21zLAorCQkJCQkgICByZXRyaWVzLAorCQkJCQkgICBicm9hZGNhc3QsCisJCQkJCSAgICZpcG1iX3NlcSwKKwkJCQkJICAgJnNlcWlkKTsKKwkJCWlmIChydikgeworCQkJCS8qIFdlIGhhdmUgdXNlZCB1cCBhbGwgdGhlIHNlcXVlbmNlIG51bWJlcnMsCisJCQkJICAgcHJvYmFibHksIHNvIGFib3J0LiAqLworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpbnRmLT5zZXFfbG9jayksCisJCQkJCQkgICAgICAgZmxhZ3MpOworCQkJCWdvdG8gb3V0X2VycjsKKwkJCX0KKworCQkJLyogU3RvcmUgdGhlIHNlcXVlbmNlIG51bWJlciBpbiB0aGUgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgd2hlbiB0aGUgc2VuZCBtZXNzYWdlIHJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21lcyBiYWNrIHdlIGNhbiBzdGFydCB0aGUgdGltZXIuICovCisJCQlmb3JtYXRfaXBtYl9tc2coc21pX21zZywgbXNnLCBpcG1iX2FkZHIsCisJCQkJCVNUT1JFX1NFUV9JTl9NU0dJRChpcG1iX3NlcSwgc2VxaWQpLAorCQkJCQlpcG1iX3NlcSwgYnJvYWRjYXN0LAorCQkJCQlzb3VyY2VfYWRkcmVzcywgc291cmNlX2x1bik7CisKKwkJCS8qIENvcHkgdGhlIG1lc3NhZ2UgaW50byB0aGUgcmVjdiBtZXNzYWdlIGRhdGEsIHNvIHdlCisJCQkgICBjYW4gcmV0cmFuc21pdCBpdCBsYXRlciBpZiBuZWNlc3NhcnkuICovCisJCQltZW1jcHkocmVjdl9tc2ctPm1zZ19kYXRhLCBzbWlfbXNnLT5kYXRhLAorCQkJICAgICAgIHNtaV9tc2ctPmRhdGFfc2l6ZSk7CisJCQlyZWN2X21zZy0+bXNnLmRhdGEgPSByZWN2X21zZy0+bXNnX2RhdGE7CisJCQlyZWN2X21zZy0+bXNnLmRhdGFfbGVuID0gc21pX21zZy0+ZGF0YV9zaXplOworCisJCQkvKiBXZSBkb24ndCB1bmxvY2sgdW50aWwgaGVyZSwgYmVjYXVzZSB3ZSBuZWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBjb3B5IHRoZSBjb21wbGV0ZWQgbWVzc2FnZSBpbnRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdl9tc2cgYmVmb3JlIHdlIHJlbGVhc2UgdGhlIGxvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHJhY2UgY29uZGl0aW9ucyBtYXkgYml0ZSB1cy4gIEkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3cgdGhhdCdzIHByZXR0eSBwYXJhbm9pZCwgYnV0IEkgcHJlZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjb3JyZWN0LiAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGludGYtPnNlcV9sb2NrKSwgZmxhZ3MpOworCQl9CisJfSBlbHNlIGlmIChhZGRyLT5hZGRyX3R5cGUgPT0gSVBNSV9MQU5fQUREUl9UWVBFKSB7CisJCXN0cnVjdCBpcG1pX2xhbl9hZGRyICAqbGFuX2FkZHI7CisJCXVuc2lnbmVkIGNoYXIgICAgICAgICBpcG1iX3NlcTsKKwkJbG9uZyAgICAgICAgICAgICAgICAgIHNlcWlkOworCisJCWlmIChhZGRyLT5jaGFubmVsID4gSVBNSV9OVU1fQ0hBTk5FTFMpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWludGYtPnNlbnRfaW52YWxpZF9jb21tYW5kcysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlydiA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQlpZiAoKGludGYtPmNoYW5uZWxzW2FkZHItPmNoYW5uZWxdLm1lZGl1bQorCQkgICAgIT0gSVBNSV9DSEFOTkVMX01FRElVTV84MDIzTEFOKQorCQkgICAgJiYgKGludGYtPmNoYW5uZWxzW2FkZHItPmNoYW5uZWxdLm1lZGl1bQorCQkJIT0gSVBNSV9DSEFOTkVMX01FRElVTV9BU1lOQykpCisJCXsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWludGYtPnNlbnRfaW52YWxpZF9jb21tYW5kcysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlydiA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQlyZXRyaWVzID0gNDsKKworCQkvKiBEZWZhdWx0IHRvIDEgc2Vjb25kIHJldHJpZXMuICovCisJCWlmIChyZXRyeV90aW1lX21zID09IDApCisJCSAgICByZXRyeV90aW1lX21zID0gMTAwMDsKKworCQkvKiAxMSBmb3IgdGhlIGhlYWRlciBhbmQgMSBmb3IgdGhlIGNoZWNrc3VtLiAqLworCQlpZiAoKG1zZy0+ZGF0YV9sZW4gKyAxMikgPiBJUE1JX01BWF9NU0dfTEVOR1RIKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlpbnRmLT5zZW50X2ludmFsaWRfY29tbWFuZHMrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJcnYgPSAtRU1TR1NJWkU7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQlsYW5fYWRkciA9IChzdHJ1Y3QgaXBtaV9sYW5fYWRkciAqKSBhZGRyOworCQlpZiAobGFuX2FkZHItPmx1biA+IDMpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWludGYtPnNlbnRfaW52YWxpZF9jb21tYW5kcysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlydiA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQltZW1jcHkoJnJlY3ZfbXNnLT5hZGRyLCBsYW5fYWRkciwgc2l6ZW9mKCpsYW5fYWRkcikpOworCisJCWlmIChyZWN2X21zZy0+bXNnLm5ldGZuICYgMHgxKSB7CisJCQkvKiBJdCdzIGEgcmVzcG9uc2UsIHNvIHVzZSB0aGUgdXNlcidzIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1zZ2lkLiAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJaW50Zi0+c2VudF9sYW5fcmVzcG9uc2VzKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWZvcm1hdF9sYW5fbXNnKHNtaV9tc2csIG1zZywgbGFuX2FkZHIsIG1zZ2lkLAorCQkJCSAgICAgICBtc2dpZCwgc291cmNlX2x1bik7CisKKwkJCS8qIFNhdmUgdGhlIHJlY2VpdmUgbWVzc2FnZSBzbyB3ZSBjYW4gdXNlIGl0CisJCQkgICB0byBkZWxpdmVyIHRoZSByZXNwb25zZS4gKi8KKwkJCXNtaV9tc2ctPnVzZXJfZGF0YSA9IHJlY3ZfbXNnOworCQl9IGVsc2UgeworCQkJLyogSXQncyBhIGNvbW1hbmQsIHNvIGdldCBhIHNlcXVlbmNlIGZvciBpdC4gKi8KKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJihpbnRmLT5zZXFfbG9jayksIGZsYWdzKTsKKworCQkJc3Bpbl9sb2NrKCZpbnRmLT5jb3VudGVyX2xvY2spOworCQkJaW50Zi0+c2VudF9sYW5fY29tbWFuZHMrKzsKKwkJCXNwaW5fdW5sb2NrKCZpbnRmLT5jb3VudGVyX2xvY2spOworCisJCQkvKiBDcmVhdGUgYSBzZXF1ZW5jZSBudW1iZXIgd2l0aCBhIDEgc2Vjb25kCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0IGFuZCA0IHJldHJpZXMuICovCisJCQlydiA9IGludGZfbmV4dF9zZXEoaW50ZiwKKwkJCQkJICAgcmVjdl9tc2csCisJCQkJCSAgIHJldHJ5X3RpbWVfbXMsCisJCQkJCSAgIHJldHJpZXMsCisJCQkJCSAgIDAsCisJCQkJCSAgICZpcG1iX3NlcSwKKwkJCQkJICAgJnNlcWlkKTsKKwkJCWlmIChydikgeworCQkJCS8qIFdlIGhhdmUgdXNlZCB1cCBhbGwgdGhlIHNlcXVlbmNlIG51bWJlcnMsCisJCQkJICAgcHJvYmFibHksIHNvIGFib3J0LiAqLworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpbnRmLT5zZXFfbG9jayksCisJCQkJCQkgICAgICAgZmxhZ3MpOworCQkJCWdvdG8gb3V0X2VycjsKKwkJCX0KKworCQkJLyogU3RvcmUgdGhlIHNlcXVlbmNlIG51bWJlciBpbiB0aGUgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgd2hlbiB0aGUgc2VuZCBtZXNzYWdlIHJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21lcyBiYWNrIHdlIGNhbiBzdGFydCB0aGUgdGltZXIuICovCisJCQlmb3JtYXRfbGFuX21zZyhzbWlfbXNnLCBtc2csIGxhbl9hZGRyLAorCQkJCSAgICAgICBTVE9SRV9TRVFfSU5fTVNHSUQoaXBtYl9zZXEsIHNlcWlkKSwKKwkJCQkgICAgICAgaXBtYl9zZXEsIHNvdXJjZV9sdW4pOworCisJCQkvKiBDb3B5IHRoZSBtZXNzYWdlIGludG8gdGhlIHJlY3YgbWVzc2FnZSBkYXRhLCBzbyB3ZQorCQkJICAgY2FuIHJldHJhbnNtaXQgaXQgbGF0ZXIgaWYgbmVjZXNzYXJ5LiAqLworCQkJbWVtY3B5KHJlY3ZfbXNnLT5tc2dfZGF0YSwgc21pX21zZy0+ZGF0YSwKKwkJCSAgICAgICBzbWlfbXNnLT5kYXRhX3NpemUpOworCQkJcmVjdl9tc2ctPm1zZy5kYXRhID0gcmVjdl9tc2ctPm1zZ19kYXRhOworCQkJcmVjdl9tc2ctPm1zZy5kYXRhX2xlbiA9IHNtaV9tc2ctPmRhdGFfc2l6ZTsKKworCQkJLyogV2UgZG9uJ3QgdW5sb2NrIHVudGlsIGhlcmUsIGJlY2F1c2Ugd2UgbmVlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY29weSB0aGUgY29tcGxldGVkIG1lc3NhZ2UgaW50byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3ZfbXNnIGJlZm9yZSB3ZSByZWxlYXNlIHRoZSBsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCByYWNlIGNvbmRpdGlvbnMgbWF5IGJpdGUgdXMuICBJCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93IHRoYXQncyBwcmV0dHkgcGFyYW5vaWQsIGJ1dCBJIHByZWZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY29ycmVjdC4gKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpbnRmLT5zZXFfbG9jayksIGZsYWdzKTsKKwkJfQorCX0gZWxzZSB7CisJICAgIC8qIFVua25vd24gYWRkcmVzcyB0eXBlLiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCWludGYtPnNlbnRfaW52YWxpZF9jb21tYW5kcysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJcnYgPSAtRUlOVkFMOworCQlnb3RvIG91dF9lcnI7CisJfQorCisjaWZkZWYgREVCVUdfTVNHSU5HCisJeworCQlpbnQgbTsKKwkJZm9yIChtPTA7IG08c21pX21zZy0+ZGF0YV9zaXplOyBtKyspCisJCQlwcmludGsoIiAlMi4yeCIsIHNtaV9tc2ctPmRhdGFbbV0pOworCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisJaW50Zi0+aGFuZGxlcnMtPnNlbmRlcihpbnRmLT5zZW5kX2luZm8sIHNtaV9tc2csIHByaW9yaXR5KTsKKworCXJldHVybiAwOworCisgb3V0X2VycjoKKwlpcG1pX2ZyZWVfc21pX21zZyhzbWlfbXNnKTsKKwlpcG1pX2ZyZWVfcmVjdl9tc2cocmVjdl9tc2cpOworCXJldHVybiBydjsKK30KKworaW50IGlwbWlfcmVxdWVzdF9zZXR0aW1lKGlwbWlfdXNlcl90ICAgICAgdXNlciwKKwkJCSBzdHJ1Y3QgaXBtaV9hZGRyICphZGRyLAorCQkJIGxvbmcgICAgICAgICAgICAgbXNnaWQsCisJCQkgc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgKm1zZywKKwkJCSB2b2lkICAgICAgICAgICAgICp1c2VyX21zZ19kYXRhLAorCQkJIGludCAgICAgICAgICAgICAgcHJpb3JpdHksCisJCQkgaW50ICAgICAgICAgICAgICByZXRyaWVzLAorCQkJIHVuc2lnbmVkIGludCAgICAgcmV0cnlfdGltZV9tcykKK3sKKwlyZXR1cm4gaV9pcG1pX3JlcXVlc3QodXNlciwKKwkJCSAgICAgIHVzZXItPmludGYsCisJCQkgICAgICBhZGRyLAorCQkJICAgICAgbXNnaWQsCisJCQkgICAgICBtc2csCisJCQkgICAgICB1c2VyX21zZ19kYXRhLAorCQkJICAgICAgTlVMTCwgTlVMTCwKKwkJCSAgICAgIHByaW9yaXR5LAorCQkJICAgICAgdXNlci0+aW50Zi0+bXlfYWRkcmVzcywKKwkJCSAgICAgIHVzZXItPmludGYtPm15X2x1biwKKwkJCSAgICAgIHJldHJpZXMsCisJCQkgICAgICByZXRyeV90aW1lX21zKTsKK30KKworaW50IGlwbWlfcmVxdWVzdF9zdXBwbHlfbXNncyhpcG1pX3VzZXJfdCAgICAgICAgICB1c2VyLAorCQkJICAgICBzdHJ1Y3QgaXBtaV9hZGRyICAgICAqYWRkciwKKwkJCSAgICAgbG9uZyAgICAgICAgICAgICAgICAgbXNnaWQsCisJCQkgICAgIHN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgKm1zZywKKwkJCSAgICAgdm9pZCAgICAgICAgICAgICAgICAgKnVzZXJfbXNnX2RhdGEsCisJCQkgICAgIHZvaWQgICAgICAgICAgICAgICAgICpzdXBwbGllZF9zbWksCisJCQkgICAgIHN0cnVjdCBpcG1pX3JlY3ZfbXNnICpzdXBwbGllZF9yZWN2LAorCQkJICAgICBpbnQgICAgICAgICAgICAgICAgICBwcmlvcml0eSkKK3sKKwlyZXR1cm4gaV9pcG1pX3JlcXVlc3QodXNlciwKKwkJCSAgICAgIHVzZXItPmludGYsCisJCQkgICAgICBhZGRyLAorCQkJICAgICAgbXNnaWQsCisJCQkgICAgICBtc2csCisJCQkgICAgICB1c2VyX21zZ19kYXRhLAorCQkJICAgICAgc3VwcGxpZWRfc21pLAorCQkJICAgICAgc3VwcGxpZWRfcmVjdiwKKwkJCSAgICAgIHByaW9yaXR5LAorCQkJICAgICAgdXNlci0+aW50Zi0+bXlfYWRkcmVzcywKKwkJCSAgICAgIHVzZXItPmludGYtPm15X2x1biwKKwkJCSAgICAgIC0xLCAwKTsKK30KKworc3RhdGljIGludCBpcG1iX2ZpbGVfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJY2hhciAgICAgICAqb3V0ID0gKGNoYXIgKikgcGFnZTsKKwlpcG1pX3NtaV90IGludGYgPSBkYXRhOworCisJcmV0dXJuIHNwcmludGYob3V0LCAiJXhcbiIsIGludGYtPm15X2FkZHJlc3MpOworfQorCitzdGF0aWMgaW50IHZlcnNpb25fZmlsZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWNoYXIgICAgICAgKm91dCA9IChjaGFyICopIHBhZ2U7CisJaXBtaV9zbWlfdCBpbnRmID0gZGF0YTsKKworCXJldHVybiBzcHJpbnRmKG91dCwgIiVkLiVkXG4iLAorCQkgICAgICAgaW50Zi0+dmVyc2lvbl9tYWpvciwgaW50Zi0+dmVyc2lvbl9taW5vcik7Cit9CisKK3N0YXRpYyBpbnQgc3RhdF9maWxlX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCSAgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWNoYXIgICAgICAgKm91dCA9IChjaGFyICopIHBhZ2U7CisJaXBtaV9zbWlfdCBpbnRmID0gZGF0YTsKKworCW91dCArPSBzcHJpbnRmKG91dCwgInNlbnRfaW52YWxpZF9jb21tYW5kczogICAgICAgJWRcbiIsCisJCSAgICAgICBpbnRmLT5zZW50X2ludmFsaWRfY29tbWFuZHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgInNlbnRfbG9jYWxfY29tbWFuZHM6ICAgICAgICAgJWRcbiIsCisJCSAgICAgICBpbnRmLT5zZW50X2xvY2FsX2NvbW1hbmRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJoYW5kbGVkX2xvY2FsX3Jlc3BvbnNlczogICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+aGFuZGxlZF9sb2NhbF9yZXNwb25zZXMpOworCW91dCArPSBzcHJpbnRmKG91dCwgInVuaGFuZGxlZF9sb2NhbF9yZXNwb25zZXM6ICAgJWRcbiIsCisJCSAgICAgICBpbnRmLT51bmhhbmRsZWRfbG9jYWxfcmVzcG9uc2VzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJzZW50X2lwbWJfY29tbWFuZHM6ICAgICAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+c2VudF9pcG1iX2NvbW1hbmRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJzZW50X2lwbWJfY29tbWFuZF9lcnJzOiAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+c2VudF9pcG1iX2NvbW1hbmRfZXJycyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAicmV0cmFuc21pdHRlZF9pcG1iX2NvbW1hbmRzOiAlZFxuIiwKKwkJICAgICAgIGludGYtPnJldHJhbnNtaXR0ZWRfaXBtYl9jb21tYW5kcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAidGltZWRfb3V0X2lwbWJfY29tbWFuZHM6ICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPnRpbWVkX291dF9pcG1iX2NvbW1hbmRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJ0aW1lZF9vdXRfaXBtYl9icm9hZGNhc3RzOiAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+dGltZWRfb3V0X2lwbWJfYnJvYWRjYXN0cyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAic2VudF9pcG1iX3Jlc3BvbnNlczogICAgICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPnNlbnRfaXBtYl9yZXNwb25zZXMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImhhbmRsZWRfaXBtYl9yZXNwb25zZXM6ICAgICAgJWRcbiIsCisJCSAgICAgICBpbnRmLT5oYW5kbGVkX2lwbWJfcmVzcG9uc2VzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJpbnZhbGlkX2lwbWJfcmVzcG9uc2VzOiAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+aW52YWxpZF9pcG1iX3Jlc3BvbnNlcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAidW5oYW5kbGVkX2lwbWJfcmVzcG9uc2VzOiAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPnVuaGFuZGxlZF9pcG1iX3Jlc3BvbnNlcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAic2VudF9sYW5fY29tbWFuZHM6ICAgICAgICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPnNlbnRfbGFuX2NvbW1hbmRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJzZW50X2xhbl9jb21tYW5kX2VycnM6ICAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+c2VudF9sYW5fY29tbWFuZF9lcnJzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJyZXRyYW5zbWl0dGVkX2xhbl9jb21tYW5kczogICVkXG4iLAorCQkgICAgICAgaW50Zi0+cmV0cmFuc21pdHRlZF9sYW5fY29tbWFuZHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgInRpbWVkX291dF9sYW5fY29tbWFuZHM6ICAgICAgJWRcbiIsCisJCSAgICAgICBpbnRmLT50aW1lZF9vdXRfbGFuX2NvbW1hbmRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJzZW50X2xhbl9yZXNwb25zZXM6ICAgICAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+c2VudF9sYW5fcmVzcG9uc2VzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJoYW5kbGVkX2xhbl9yZXNwb25zZXM6ICAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+aGFuZGxlZF9sYW5fcmVzcG9uc2VzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJpbnZhbGlkX2xhbl9yZXNwb25zZXM6ICAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+aW52YWxpZF9sYW5fcmVzcG9uc2VzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJ1bmhhbmRsZWRfbGFuX3Jlc3BvbnNlczogICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+dW5oYW5kbGVkX2xhbl9yZXNwb25zZXMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImhhbmRsZWRfY29tbWFuZHM6ICAgICAgICAgICAgJWRcbiIsCisJCSAgICAgICBpbnRmLT5oYW5kbGVkX2NvbW1hbmRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJpbnZhbGlkX2NvbW1hbmRzOiAgICAgICAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+aW52YWxpZF9jb21tYW5kcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAidW5oYW5kbGVkX2NvbW1hbmRzOiAgICAgICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPnVuaGFuZGxlZF9jb21tYW5kcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiaW52YWxpZF9ldmVudHM6ICAgICAgICAgICAgICAlZFxuIiwKKwkJICAgICAgIGludGYtPmludmFsaWRfZXZlbnRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJldmVudHM6ICAgICAgICAgICAgICAgICAgICAgICVkXG4iLAorCQkgICAgICAgaW50Zi0+ZXZlbnRzKTsKKworCXJldHVybiAob3V0IC0gKChjaGFyICopIHBhZ2UpKTsKK30KKworaW50IGlwbWlfc21pX2FkZF9wcm9jX2VudHJ5KGlwbWlfc21pX3Qgc21pLCBjaGFyICpuYW1lLAorCQkJICAgIHJlYWRfcHJvY190ICpyZWFkX3Byb2MsIHdyaXRlX3Byb2NfdCAqd3JpdGVfcHJvYywKKwkJCSAgICB2b2lkICpkYXRhLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgICpmaWxlOworCWludCAgICAgICAgICAgICAgICAgICAgcnYgPSAwOworCXN0cnVjdCBpcG1pX3Byb2NfZW50cnkgKmVudHJ5OworCisJLyogQ3JlYXRlIGEgbGlzdCBlbGVtZW50LiAqLworCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbnRyeSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZW50cnktPm5hbWUgPSBrbWFsbG9jKHN0cmxlbihuYW1lKSsxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudHJ5LT5uYW1lKSB7CisJCWtmcmVlKGVudHJ5KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXN0cmNweShlbnRyeS0+bmFtZSwgbmFtZSk7CisKKwlmaWxlID0gY3JlYXRlX3Byb2NfZW50cnkobmFtZSwgMCwgc21pLT5wcm9jX2Rpcik7CisJaWYgKCFmaWxlKSB7CisJCWtmcmVlKGVudHJ5LT5uYW1lKTsKKwkJa2ZyZWUoZW50cnkpOworCQlydiA9IC1FTk9NRU07CisJfSBlbHNlIHsKKwkJZmlsZS0+bmxpbmsgPSAxOworCQlmaWxlLT5kYXRhID0gZGF0YTsKKwkJZmlsZS0+cmVhZF9wcm9jID0gcmVhZF9wcm9jOworCQlmaWxlLT53cml0ZV9wcm9jID0gd3JpdGVfcHJvYzsKKwkJZmlsZS0+b3duZXIgPSBvd25lcjsKKworCQkvKiBTdGljayBpdCBvbiB0aGUgbGlzdC4gKi8KKwkJZW50cnktPm5leHQgPSBzbWktPnByb2NfZW50cmllczsKKwkJc21pLT5wcm9jX2VudHJpZXMgPSBlbnRyeTsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3Byb2NfZW50cmllcyhpcG1pX3NtaV90IHNtaSwgaW50IG51bSkKK3sKKwlpbnQgcnYgPSAwOworCisJc3ByaW50ZihzbWktPnByb2NfZGlyX25hbWUsICIlZCIsIG51bSk7CisJc21pLT5wcm9jX2RpciA9IHByb2NfbWtkaXIoc21pLT5wcm9jX2Rpcl9uYW1lLCBwcm9jX2lwbWlfcm9vdCk7CisJaWYgKCFzbWktPnByb2NfZGlyKQorCQlydiA9IC1FTk9NRU07CisJZWxzZSB7CisJCXNtaS0+cHJvY19kaXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJfQorCisJaWYgKHJ2ID09IDApCisJCXJ2ID0gaXBtaV9zbWlfYWRkX3Byb2NfZW50cnkoc21pLCAic3RhdHMiLAorCQkJCQkgICAgIHN0YXRfZmlsZV9yZWFkX3Byb2MsIE5VTEwsCisJCQkJCSAgICAgc21pLCBUSElTX01PRFVMRSk7CisKKwlpZiAocnYgPT0gMCkKKwkJcnYgPSBpcG1pX3NtaV9hZGRfcHJvY19lbnRyeShzbWksICJpcG1iIiwKKwkJCQkJICAgICBpcG1iX2ZpbGVfcmVhZF9wcm9jLCBOVUxMLAorCQkJCQkgICAgIHNtaSwgVEhJU19NT0RVTEUpOworCisJaWYgKHJ2ID09IDApCisJCXJ2ID0gaXBtaV9zbWlfYWRkX3Byb2NfZW50cnkoc21pLCAidmVyc2lvbiIsCisJCQkJCSAgICAgdmVyc2lvbl9maWxlX3JlYWRfcHJvYywgTlVMTCwKKwkJCQkJICAgICBzbWksIFRISVNfTU9EVUxFKTsKKworCXJldHVybiBydjsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX3Byb2NfZW50cmllcyhpcG1pX3NtaV90IHNtaSkKK3sKKwlzdHJ1Y3QgaXBtaV9wcm9jX2VudHJ5ICplbnRyeTsKKworCXdoaWxlIChzbWktPnByb2NfZW50cmllcykgeworCQllbnRyeSA9IHNtaS0+cHJvY19lbnRyaWVzOworCQlzbWktPnByb2NfZW50cmllcyA9IGVudHJ5LT5uZXh0OworCisJCXJlbW92ZV9wcm9jX2VudHJ5KGVudHJ5LT5uYW1lLCBzbWktPnByb2NfZGlyKTsKKwkJa2ZyZWUoZW50cnktPm5hbWUpOworCQlrZnJlZShlbnRyeSk7CisJfQorCXJlbW92ZV9wcm9jX2VudHJ5KHNtaS0+cHJvY19kaXJfbmFtZSwgcHJvY19pcG1pX3Jvb3QpOworfQorCitzdGF0aWMgaW50CitzZW5kX2NoYW5uZWxfaW5mb19jbWQoaXBtaV9zbWlfdCBpbnRmLCBpbnQgY2hhbikKK3sKKwlzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICAgICAgICAgICAgbXNnOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdOworCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciBzaTsKKworCXNpLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisJc2kuY2hhbm5lbCA9IElQTUlfQk1DX0NIQU5ORUw7CisJc2kubHVuID0gMDsKKworCW1zZy5uZXRmbiA9IElQTUlfTkVURk5fQVBQX1JFUVVFU1Q7CisJbXNnLmNtZCA9IElQTUlfR0VUX0NIQU5ORUxfSU5GT19DTUQ7CisJbXNnLmRhdGEgPSBkYXRhOworCW1zZy5kYXRhX2xlbiA9IDE7CisJZGF0YVswXSA9IGNoYW47CisJcmV0dXJuIGlfaXBtaV9yZXF1ZXN0KE5VTEwsCisJCQkgICAgICBpbnRmLAorCQkJICAgICAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJnNpLAorCQkJICAgICAgMCwKKwkJCSAgICAgICZtc2csCisJCQkgICAgICBOVUxMLAorCQkJICAgICAgTlVMTCwKKwkJCSAgICAgIE5VTEwsCisJCQkgICAgICAwLAorCQkJICAgICAgaW50Zi0+bXlfYWRkcmVzcywKKwkJCSAgICAgIGludGYtPm15X2x1biwKKwkJCSAgICAgIC0xLCAwKTsKK30KKworc3RhdGljIHZvaWQKK2NoYW5uZWxfaGFuZGxlcihpcG1pX3NtaV90IGludGYsIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKKwlpbnQgcnYgPSAwOworCWludCBjaGFuOworCisJaWYgKChtc2ctPnJzcFswXSA9PSAoSVBNSV9ORVRGTl9BUFBfUkVTUE9OU0UgPDwgMikpCisJICAgICYmIChtc2ctPnJzcFsxXSA9PSBJUE1JX0dFVF9DSEFOTkVMX0lORk9fQ01EKSkKKwl7CisJCS8qIEl0J3MgdGhlIG9uZSB3ZSB3YW50ICovCisJCWlmIChtc2ctPnJzcFsyXSAhPSAwKSB7CisJCQkvKiBHb3QgYW4gZXJyb3IgZnJvbSB0aGUgY2hhbm5lbCwganVzdCBnbyBvbi4gKi8KKworCQkJaWYgKG1zZy0+cnNwWzJdID09IElQTUlfSU5WQUxJRF9DT01NQU5EX0VSUikgeworCQkJCS8qIElmIHRoZSBNQyBkb2VzIG5vdCBzdXBwb3J0IHRoaXMKKwkJCQkgICBjb21tYW5kLCB0aGF0IGlzIGxlZ2FsLiAgV2UganVzdAorCQkJCSAgIGFzc3VtZSBpdCBoYXMgb25lIElQTUIgYXQgY2hhbm5lbAorCQkJCSAgIHplcm8uICovCisJCQkJaW50Zi0+Y2hhbm5lbHNbMF0ubWVkaXVtCisJCQkJCT0gSVBNSV9DSEFOTkVMX01FRElVTV9JUE1COworCQkJCWludGYtPmNoYW5uZWxzWzBdLnByb3RvY29sCisJCQkJCT0gSVBNSV9DSEFOTkVMX1BST1RPQ09MX0lQTUI7CisJCQkJcnYgPSAtRU5PU1lTOworCisJCQkJaW50Zi0+Y3Vycl9jaGFubmVsID0gSVBNSV9NQVhfQ0hBTk5FTFM7CisJCQkJd2FrZV91cCgmaW50Zi0+d2FpdHEpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZ290byBuZXh0X2NoYW5uZWw7CisJCX0KKwkJaWYgKG1zZy0+cnNwX3NpemUgPCA2KSB7CisJCQkvKiBNZXNzYWdlIG5vdCBiaWcgZW5vdWdoLCBqdXN0IGdvIG9uLiAqLworCQkJZ290byBuZXh0X2NoYW5uZWw7CisJCX0KKwkJY2hhbiA9IGludGYtPmN1cnJfY2hhbm5lbDsKKwkJaW50Zi0+Y2hhbm5lbHNbY2hhbl0ubWVkaXVtID0gbXNnLT5yc3BbNF0gJiAweDdmOworCQlpbnRmLT5jaGFubmVsc1tjaGFuXS5wcm90b2NvbCA9IG1zZy0+cnNwWzVdICYgMHgxZjsKKworCW5leHRfY2hhbm5lbDoKKwkJaW50Zi0+Y3Vycl9jaGFubmVsKys7CisJCWlmIChpbnRmLT5jdXJyX2NoYW5uZWwgPj0gSVBNSV9NQVhfQ0hBTk5FTFMpCisJCQl3YWtlX3VwKCZpbnRmLT53YWl0cSk7CisJCWVsc2UKKwkJCXJ2ID0gc2VuZF9jaGFubmVsX2luZm9fY21kKGludGYsIGludGYtPmN1cnJfY2hhbm5lbCk7CisKKwkJaWYgKHJ2KSB7CisJCQkvKiBHb3QgYW4gZXJyb3Igc29tZWhvdywganVzdCBnaXZlIHVwLiAqLworCQkJaW50Zi0+Y3Vycl9jaGFubmVsID0gSVBNSV9NQVhfQ0hBTk5FTFM7CisJCQl3YWtlX3VwKCZpbnRmLT53YWl0cSk7CisKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCisJCQkgICAgICAgIkVycm9yIHNlbmRpbmcgY2hhbm5lbCBpbmZvcm1hdGlvbjogJWRcbiIsCisJCQkgICAgICAgcnYpOworCQl9CisJfQorIG91dDoKKwlyZXR1cm47Cit9CisKK2ludCBpcG1pX3JlZ2lzdGVyX3NtaShzdHJ1Y3QgaXBtaV9zbWlfaGFuZGxlcnMgKmhhbmRsZXJzLAorCQkgICAgICB2b2lkCQkgICAgICAgKnNlbmRfaW5mbywKKwkJICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICAgIHZlcnNpb25fbWFqb3IsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICB2ZXJzaW9uX21pbm9yLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgc2xhdmVfYWRkciwKKwkJICAgICAgaXBtaV9zbWlfdCAgICAgICAgICAgICAgICppbnRmKQoreworCWludCAgICAgICAgICAgICAgaSwgajsKKwlpbnQgICAgICAgICAgICAgIHJ2OworCWlwbWlfc21pX3QgICAgICAgbmV3X2ludGY7CisJdW5zaWduZWQgbG9uZyAgICBmbGFnczsKKworCisJLyogTWFrZSBzdXJlIHRoZSBkcml2ZXIgaXMgYWN0dWFsbHkgaW5pdGlhbGl6ZWQsIHRoaXMgaGFuZGxlcworCSAgIHByb2JsZW1zIHdpdGggaW5pdGlhbGl6YXRpb24gb3JkZXIuICovCisJaWYgKCFpbml0aWFsaXplZCkgeworCQlydiA9IGlwbWlfaW5pdF9tc2doYW5kbGVyKCk7CisJCWlmIChydikKKwkJCXJldHVybiBydjsKKwkJLyogVGhlIGluaXQgY29kZSBkb2Vzbid0IHJldHVybiBhbiBlcnJvciBpZiBpdCB3YXMgdHVybmVkCisJCSAgIG9mZiwgYnV0IGl0IHdvbid0IGluaXRpYWxpemUuICBDaGVjayB0aGF0LiAqLworCQlpZiAoIWluaXRpYWxpemVkKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbmV3X2ludGYgPSBrbWFsbG9jKHNpemVvZigqbmV3X2ludGYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19pbnRmKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQobmV3X2ludGYsIDAsIHNpemVvZigqbmV3X2ludGYpKTsKKworCW5ld19pbnRmLT5wcm9jX2RpciA9IE5VTEw7CisKKwlydiA9IC1FTk9NRU07CisKKwlkb3duX3dyaXRlKCZpbnRlcmZhY2VzX3NlbSk7CisJZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJCWlmIChpcG1pX2ludGVyZmFjZXNbaV0gPT0gTlVMTCkgeworCQkJbmV3X2ludGYtPmludGZfbnVtID0gaTsKKwkJCW5ld19pbnRmLT52ZXJzaW9uX21ham9yID0gdmVyc2lvbl9tYWpvcjsKKwkJCW5ld19pbnRmLT52ZXJzaW9uX21pbm9yID0gdmVyc2lvbl9taW5vcjsKKwkJCWlmIChzbGF2ZV9hZGRyID09IDApCisJCQkJbmV3X2ludGYtPm15X2FkZHJlc3MgPSBJUE1JX0JNQ19TTEFWRV9BRERSOworCQkJZWxzZQorCQkJCW5ld19pbnRmLT5teV9hZGRyZXNzID0gc2xhdmVfYWRkcjsKKwkJCW5ld19pbnRmLT5teV9sdW4gPSAyOyAgLyogdGhlIFNNUyBMVU4uICovCisJCQlyd2xvY2tfaW5pdCgmKG5ld19pbnRmLT51c2Vyc19sb2NrKSk7CisJCQlJTklUX0xJU1RfSEVBRCgmKG5ld19pbnRmLT51c2VycykpOworCQkJbmV3X2ludGYtPmhhbmRsZXJzID0gaGFuZGxlcnM7CisJCQluZXdfaW50Zi0+c2VuZF9pbmZvID0gc2VuZF9pbmZvOworCQkJc3Bpbl9sb2NrX2luaXQoJihuZXdfaW50Zi0+c2VxX2xvY2spKTsKKwkJCWZvciAoaj0wOyBqPElQTUlfSVBNQl9OVU1fU0VROyBqKyspIHsKKwkJCQluZXdfaW50Zi0+c2VxX3RhYmxlW2pdLmludXNlID0gMDsKKwkJCQluZXdfaW50Zi0+c2VxX3RhYmxlW2pdLnNlcWlkID0gMDsKKwkJCX0KKwkJCW5ld19pbnRmLT5jdXJyX3NlcSA9IDA7CisJCQlzcGluX2xvY2tfaW5pdCgmKG5ld19pbnRmLT53YWl0aW5nX21zZ3NfbG9jaykpOworCQkJSU5JVF9MSVNUX0hFQUQoJihuZXdfaW50Zi0+d2FpdGluZ19tc2dzKSk7CisJCQlzcGluX2xvY2tfaW5pdCgmKG5ld19pbnRmLT5ldmVudHNfbG9jaykpOworCQkJSU5JVF9MSVNUX0hFQUQoJihuZXdfaW50Zi0+d2FpdGluZ19ldmVudHMpKTsKKwkJCW5ld19pbnRmLT53YWl0aW5nX2V2ZW50c19jb3VudCA9IDA7CisJCQlyd2xvY2tfaW5pdCgmKG5ld19pbnRmLT5jbWRfcmN2cl9sb2NrKSk7CisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZuZXdfaW50Zi0+d2FpdHEpOworCQkJSU5JVF9MSVNUX0hFQUQoJihuZXdfaW50Zi0+Y21kX3JjdnJzKSk7CisJCQluZXdfaW50Zi0+YWxsX2NtZF9yY3ZyID0gTlVMTDsKKworCQkJc3Bpbl9sb2NrX2luaXQoJihuZXdfaW50Zi0+Y291bnRlcl9sb2NrKSk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlcmZhY2VzX2xvY2ssIGZsYWdzKTsKKwkJCWlwbWlfaW50ZXJmYWNlc1tpXSA9IG5ld19pbnRmOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZXJmYWNlc19sb2NrLCBmbGFncyk7CisKKwkJCXJ2ID0gMDsKKwkJCSppbnRmID0gbmV3X2ludGY7CisJCQlicmVhazsKKwkJfQorCX0KKworCWRvd25ncmFkZV93cml0ZSgmaW50ZXJmYWNlc19zZW0pOworCisJaWYgKHJ2ID09IDApCisJCXJ2ID0gYWRkX3Byb2NfZW50cmllcygqaW50ZiwgaSk7CisKKwlpZiAocnYgPT0gMCkgeworCQlpZiAoKHZlcnNpb25fbWFqb3IgPiAxKQorCQkgICAgfHwgKCh2ZXJzaW9uX21ham9yID09IDEpICYmICh2ZXJzaW9uX21pbm9yID49IDUpKSkKKwkJeworCQkJLyogU3RhcnQgc2Nhbm5pbmcgdGhlIGNoYW5uZWxzIHRvIHNlZSB3aGF0IGlzCisJCQkgICBhdmFpbGFibGUuICovCisJCQkoKmludGYpLT5udWxsX3VzZXJfaGFuZGxlciA9IGNoYW5uZWxfaGFuZGxlcjsKKwkJCSgqaW50ZiktPmN1cnJfY2hhbm5lbCA9IDA7CisJCQlydiA9IHNlbmRfY2hhbm5lbF9pbmZvX2NtZCgqaW50ZiwgMCk7CisJCQlpZiAocnYpCisJCQkJZ290byBvdXQ7CisKKwkJCS8qIFdhaXQgZm9yIHRoZSBjaGFubmVsIGluZm8gdG8gYmUgcmVhZC4gKi8KKwkJCXVwX3JlYWQoJmludGVyZmFjZXNfc2VtKTsKKwkJCXdhaXRfZXZlbnQoKCppbnRmKS0+d2FpdHEsCisJCQkJICAgKCgqaW50ZiktPmN1cnJfY2hhbm5lbD49SVBNSV9NQVhfQ0hBTk5FTFMpKTsKKwkJCWRvd25fcmVhZCgmaW50ZXJmYWNlc19zZW0pOworCisJCQlpZiAoaXBtaV9pbnRlcmZhY2VzW2ldICE9IG5ld19pbnRmKQorCQkJCS8qIFdlbGwsIGl0IHdlbnQgYXdheS4gIEp1c3QgcmV0dXJuLiAqLworCQkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJLyogQXNzdW1lIGEgc2luZ2xlIElQTUIgY2hhbm5lbCBhdCB6ZXJvLiAqLworCQkJKCppbnRmKS0+Y2hhbm5lbHNbMF0ubWVkaXVtID0gSVBNSV9DSEFOTkVMX01FRElVTV9JUE1COworCQkJKCppbnRmKS0+Y2hhbm5lbHNbMF0ucHJvdG9jb2wKKwkJCQk9IElQTUlfQ0hBTk5FTF9QUk9UT0NPTF9JUE1COworICAJCX0KKworCQkvKiBDYWxsIGFsbCB0aGUgd2F0Y2hlciBpbnRlcmZhY2VzIHRvIHRlbGwKKwkJICAgdGhlbSB0aGF0IGEgbmV3IGludGVyZmFjZSBpcyBhdmFpbGFibGUuICovCisJCWNhbGxfc21pX3dhdGNoZXJzKGkpOworCX0KKworIG91dDoKKwl1cF9yZWFkKCZpbnRlcmZhY2VzX3NlbSk7CisKKwlpZiAocnYpIHsKKwkJaWYgKG5ld19pbnRmLT5wcm9jX2RpcikKKwkJCXJlbW92ZV9wcm9jX2VudHJpZXMobmV3X2ludGYpOworCQlrZnJlZShuZXdfaW50Zik7CisJfQorCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBmcmVlX3JlY3ZfbXNnX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqcSkKK3sKKwlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnLCAqbXNnMjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIG1zZzIsIHEsIGxpbmspIHsKKwkJbGlzdF9kZWwoJm1zZy0+bGluayk7CisJCWlwbWlfZnJlZV9yZWN2X21zZyhtc2cpOworCX0KK30KKworc3RhdGljIHZvaWQgZnJlZV9jbWRfcmN2cl9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKnEpCit7CisJc3RydWN0IGNtZF9yY3ZyICAqcmN2ciwgKnJjdnIyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJjdnIsIHJjdnIyLCBxLCBsaW5rKSB7CisJCWxpc3RfZGVsKCZyY3ZyLT5saW5rKTsKKwkJa2ZyZWUocmN2cik7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbGVhbl91cF9pbnRlcmZhY2VfZGF0YShpcG1pX3NtaV90IGludGYpCit7CisJaW50IGk7CisKKwlmcmVlX3JlY3ZfbXNnX2xpc3QoJihpbnRmLT53YWl0aW5nX21zZ3MpKTsKKwlmcmVlX3JlY3ZfbXNnX2xpc3QoJihpbnRmLT53YWl0aW5nX2V2ZW50cykpOworCWZyZWVfY21kX3JjdnJfbGlzdCgmKGludGYtPmNtZF9yY3ZycykpOworCisJZm9yIChpPTA7IGk8SVBNSV9JUE1CX05VTV9TRVE7IGkrKykgeworCQlpZiAoKGludGYtPnNlcV90YWJsZVtpXS5pbnVzZSkKKwkJICAgICYmIChpbnRmLT5zZXFfdGFibGVbaV0ucmVjdl9tc2cpKQorCQl7CisJCQlpcG1pX2ZyZWVfcmVjdl9tc2coaW50Zi0+c2VxX3RhYmxlW2ldLnJlY3ZfbXNnKTsKKwkJfQkKKwl9Cit9CisKK2ludCBpcG1pX3VucmVnaXN0ZXJfc21pKGlwbWlfc21pX3QgaW50ZikKK3sKKwlpbnQgICAgICAgICAgICAgICAgICAgICBydiA9IC1FTk9ERVY7CisJaW50ICAgICAgICAgICAgICAgICAgICAgaTsKKwlzdHJ1Y3QgaXBtaV9zbWlfd2F0Y2hlciAqdzsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKKworCWRvd25fd3JpdGUoJmludGVyZmFjZXNfc2VtKTsKKwlpZiAobGlzdF9lbXB0eSgmKGludGYtPnVzZXJzKSkpCisJeworCQlmb3IgKGk9MDsgaTxNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKKwkJCWlmIChpcG1pX2ludGVyZmFjZXNbaV0gPT0gaW50ZikgeworCQkJCXJlbW92ZV9wcm9jX2VudHJpZXMoaW50Zik7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVyZmFjZXNfbG9jaywgZmxhZ3MpOworCQkJCWlwbWlfaW50ZXJmYWNlc1tpXSA9IE5VTEw7CisJCQkJY2xlYW5fdXBfaW50ZXJmYWNlX2RhdGEoaW50Zik7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZXJmYWNlc19sb2NrLGZsYWdzKTsKKwkJCQlrZnJlZShpbnRmKTsKKwkJCQlydiA9IDA7CisJCQkJZ290byBvdXRfY2FsbF93YXRjaGVyOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcnYgPSAtRUJVU1k7CisJfQorCXVwX3dyaXRlKCZpbnRlcmZhY2VzX3NlbSk7CisKKwlyZXR1cm4gcnY7CisKKyBvdXRfY2FsbF93YXRjaGVyOgorCWRvd25ncmFkZV93cml0ZSgmaW50ZXJmYWNlc19zZW0pOworCisJLyogQ2FsbCBhbGwgdGhlIHdhdGNoZXIgaW50ZXJmYWNlcyB0byB0ZWxsIHRoZW0gdGhhdAorCSAgIGFuIGludGVyZmFjZSBpcyBnb25lLiAqLworCWRvd25fcmVhZCgmc21pX3dhdGNoZXJzX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmc21pX3dhdGNoZXJzLCBsaW5rKSB7CisJCXctPnNtaV9nb25lKGkpOworCX0KKwl1cF9yZWFkKCZzbWlfd2F0Y2hlcnNfc2VtKTsKKwl1cF9yZWFkKCZpbnRlcmZhY2VzX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2lwbWJfZ2V0X21zZ19yc3AoaXBtaV9zbWlfdCAgICAgICAgICBpbnRmLAorCQkJCSAgIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIgaXBtYl9hZGRyOworCXN0cnVjdCBpcG1pX3JlY3ZfbXNnICAqcmVjdl9tc2c7CisJdW5zaWduZWQgbG9uZyAgICAgICAgIGZsYWdzOworCisJCisJLyogVGhpcyBpcyAxMSwgbm90IDEwLCBiZWNhdXNlIHRoZSByZXNwb25zZSBtdXN0IGNvbnRhaW4gYQorCSAqIGNvbXBsZXRpb24gY29kZS4gKi8KKwlpZiAobXNnLT5yc3Bfc2l6ZSA8IDExKSB7CisJCS8qIE1lc3NhZ2Ugbm90IGJpZyBlbm91Z2gsIGp1c3QgaWdub3JlIGl0LiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCWludGYtPmludmFsaWRfaXBtYl9yZXNwb25zZXMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChtc2ctPnJzcFsyXSAhPSAwKSB7CisJCS8qIEFuIGVycm9yIGdldHRpbmcgdGhlIHJlc3BvbnNlLCBqdXN0IGlnbm9yZSBpdC4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaXBtYl9hZGRyLmFkZHJfdHlwZSA9IElQTUlfSVBNQl9BRERSX1RZUEU7CisJaXBtYl9hZGRyLnNsYXZlX2FkZHIgPSBtc2ctPnJzcFs2XTsKKwlpcG1iX2FkZHIuY2hhbm5lbCA9IG1zZy0+cnNwWzNdICYgMHgwZjsKKwlpcG1iX2FkZHIubHVuID0gbXNnLT5yc3BbN10gJiAzOworCisJLyogSXQncyBhIHJlc3BvbnNlIGZyb20gYSByZW1vdGUgZW50aXR5LiAgTG9vayB1cCB0aGUgc2VxdWVuY2UKKwkgICBudW1iZXIgYW5kIGhhbmRsZSB0aGUgcmVzcG9uc2UuICovCisJaWYgKGludGZfZmluZF9zZXEoaW50ZiwKKwkJCSAgbXNnLT5yc3BbN10gPj4gMiwKKwkJCSAgbXNnLT5yc3BbM10gJiAweDBmLAorCQkJICBtc2ctPnJzcFs4XSwKKwkJCSAgKG1zZy0+cnNwWzRdID4+IDIpICYgKH4xKSwKKwkJCSAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJihpcG1iX2FkZHIpLAorCQkJICAmcmVjdl9tc2cpKQorCXsKKwkJLyogV2Ugd2VyZSB1bmFibGUgdG8gZmluZCB0aGUgc2VxdWVuY2UgbnVtYmVyLAorCQkgICBzbyBqdXN0IG51a2UgdGhlIG1lc3NhZ2UuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJaW50Zi0+dW5oYW5kbGVkX2lwbWJfcmVzcG9uc2VzKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1jcHkocmVjdl9tc2ctPm1zZ19kYXRhLAorCSAgICAgICAmKG1zZy0+cnNwWzldKSwKKwkgICAgICAgbXNnLT5yc3Bfc2l6ZSAtIDkpOworCS8qIFRIZSBvdGhlciBmaWVsZHMgbWF0Y2hlZCwgc28gbm8gbmVlZCB0byBzZXQgdGhlbSwgZXhjZXB0CisgICAgICAgICAgIGZvciBuZXRmbiwgd2hpY2ggbmVlZHMgdG8gYmUgdGhlIHJlc3BvbnNlIHRoYXQgd2FzCisgICAgICAgICAgIHJldHVybmVkLCBub3QgdGhlIHJlcXVlc3QgdmFsdWUuICovCisJcmVjdl9tc2ctPm1zZy5uZXRmbiA9IG1zZy0+cnNwWzRdID4+IDI7CisJcmVjdl9tc2ctPm1zZy5kYXRhID0gcmVjdl9tc2ctPm1zZ19kYXRhOworCXJlY3ZfbXNnLT5tc2cuZGF0YV9sZW4gPSBtc2ctPnJzcF9zaXplIC0gMTA7CisJcmVjdl9tc2ctPnJlY3ZfdHlwZSA9IElQTUlfUkVTUE9OU0VfUkVDVl9UWVBFOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwlpbnRmLT5oYW5kbGVkX2lwbWJfcmVzcG9uc2VzKys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJZGVsaXZlcl9yZXNwb25zZShyZWN2X21zZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfaXBtYl9nZXRfbXNnX2NtZChpcG1pX3NtaV90ICAgICAgICAgIGludGYsCisJCQkJICAgc3RydWN0IGlwbWlfc21pX21zZyAqbXNnKQoreworCXN0cnVjdCBjbWRfcmN2ciAgICAgICAqcmN2cjsKKwlpbnQgICAgICAgICAgICAgICAgICAgcnYgPSAwOworCXVuc2lnbmVkIGNoYXIgICAgICAgICBuZXRmbjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgY21kOworCWlwbWlfdXNlcl90ICAgICAgICAgICB1c2VyID0gTlVMTDsKKwlzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIgKmlwbWJfYWRkcjsKKwlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAgKnJlY3ZfbXNnOworCXVuc2lnbmVkIGxvbmcgICAgICAgICBmbGFnczsKKworCWlmIChtc2ctPnJzcF9zaXplIDwgMTApIHsKKwkJLyogTWVzc2FnZSBub3QgYmlnIGVub3VnaCwganVzdCBpZ25vcmUgaXQuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJaW50Zi0+aW52YWxpZF9jb21tYW5kcysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1zZy0+cnNwWzJdICE9IDApIHsKKwkJLyogQW4gZXJyb3IgZ2V0dGluZyB0aGUgcmVzcG9uc2UsIGp1c3QgaWdub3JlIGl0LiAqLworCQlyZXR1cm4gMDsKKwl9CisKKwluZXRmbiA9IG1zZy0+cnNwWzRdID4+IDI7CisJY21kID0gbXNnLT5yc3BbOF07CisKKwlyZWFkX2xvY2soJihpbnRmLT5jbWRfcmN2cl9sb2NrKSk7CisJCisJaWYgKGludGYtPmFsbF9jbWRfcmN2cikgeworCQl1c2VyID0gaW50Zi0+YWxsX2NtZF9yY3ZyOworCX0gZWxzZSB7CisJCS8qIEZpbmQgdGhlIGNvbW1hbmQvbmV0Zm4uICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmN2ciwgJihpbnRmLT5jbWRfcmN2cnMpLCBsaW5rKSB7CisJCQlpZiAoKHJjdnItPm5ldGZuID09IG5ldGZuKSAmJiAocmN2ci0+Y21kID09IGNtZCkpIHsKKwkJCQl1c2VyID0gcmN2ci0+dXNlcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZWFkX3VubG9jaygmKGludGYtPmNtZF9yY3ZyX2xvY2spKTsKKworCWlmICh1c2VyID09IE5VTEwpIHsKKwkJLyogV2UgZGlkbid0IGZpbmQgYSB1c2VyLCBkZWxpdmVyIGFuIGVycm9yIHJlc3BvbnNlLiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCWludGYtPnVuaGFuZGxlZF9jb21tYW5kcysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKworCQltc2ctPmRhdGFbMF0gPSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKTsKKwkJbXNnLT5kYXRhWzFdID0gSVBNSV9TRU5EX01TR19DTUQ7CisJCW1zZy0+ZGF0YVsyXSA9IG1zZy0+cnNwWzNdOworCQltc2ctPmRhdGFbM10gPSBtc2ctPnJzcFs2XTsKKyAgICAgICAgICAgICAgICBtc2ctPmRhdGFbNF0gPSAoKG5ldGZuICsgMSkgPDwgMikgfCAobXNnLT5yc3BbN10gJiAweDMpOworCQltc2ctPmRhdGFbNV0gPSBpcG1iX2NoZWNrc3VtKCYobXNnLT5kYXRhWzNdKSwgMik7CisJCW1zZy0+ZGF0YVs2XSA9IGludGYtPm15X2FkZHJlc3M7CisgICAgICAgICAgICAgICAgLyogcnFzZXEvbHVuICovCisgICAgICAgICAgICAgICAgbXNnLT5kYXRhWzddID0gKG1zZy0+cnNwWzddICYgMHhmYykgfCAobXNnLT5yc3BbNF0gJiAweDMpOworCQltc2ctPmRhdGFbOF0gPSBtc2ctPnJzcFs4XTsgLyogY21kICovCisJCW1zZy0+ZGF0YVs5XSA9IElQTUlfSU5WQUxJRF9DTURfQ09NUExFVElPTl9DT0RFOworCQltc2ctPmRhdGFbMTBdID0gaXBtYl9jaGVja3N1bSgmKG1zZy0+ZGF0YVs2XSksIDQpOworCQltc2ctPmRhdGFfc2l6ZSA9IDExOworCisjaWZkZWYgREVCVUdfTVNHSU5HCisJeworCQlpbnQgbTsKKwkJcHJpbnRrKCJJbnZhbGlkIGNvbW1hbmQ6Iik7CisJCWZvciAobT0wOyBtPG1zZy0+ZGF0YV9zaXplOyBtKyspCisJCQlwcmludGsoIiAlMi4yeCIsIG1zZy0+ZGF0YVttXSk7CisJCXByaW50aygiXG4iKTsKKwl9CisjZW5kaWYKKwkJaW50Zi0+aGFuZGxlcnMtPnNlbmRlcihpbnRmLT5zZW5kX2luZm8sIG1zZywgMCk7CisKKwkJcnYgPSAtMTsgLyogV2UgdXNlZCB0aGUgbWVzc2FnZSwgc28gcmV0dXJuIHRoZSB2YWx1ZSB0aGF0CisJCQkgICAgY2F1c2VzIGl0IHRvIG5vdCBiZSBmcmVlZCBvciBxdWV1ZWQuICovCisJfSBlbHNlIHsKKwkJLyogRGVsaXZlciB0aGUgbWVzc2FnZSB0byB0aGUgdXNlci4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlpbnRmLT5oYW5kbGVkX2NvbW1hbmRzKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCisJCXJlY3ZfbXNnID0gaXBtaV9hbGxvY19yZWN2X21zZygpOworCQlpZiAoISByZWN2X21zZykgeworCQkJLyogV2UgY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHNvIHJlcXVldWUgaXQgZm9yIGhhbmRsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlci4gKi8KKwkJCXJ2ID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIEV4dHJhY3QgdGhlIHNvdXJjZSBhZGRyZXNzIGZyb20gdGhlIGRhdGEuICovCisJCQlpcG1iX2FkZHIgPSAoc3RydWN0IGlwbWlfaXBtYl9hZGRyICopICZyZWN2X21zZy0+YWRkcjsKKwkJCWlwbWJfYWRkci0+YWRkcl90eXBlID0gSVBNSV9JUE1CX0FERFJfVFlQRTsKKwkJCWlwbWJfYWRkci0+c2xhdmVfYWRkciA9IG1zZy0+cnNwWzZdOworCQkJaXBtYl9hZGRyLT5sdW4gPSBtc2ctPnJzcFs3XSAmIDM7CisJCQlpcG1iX2FkZHItPmNoYW5uZWwgPSBtc2ctPnJzcFszXSAmIDB4ZjsKKworCQkJLyogRXh0cmFjdCB0aGUgcmVzdCBvZiB0aGUgbWVzc2FnZSBpbmZvcm1hdGlvbgorCQkJICAgZnJvbSB0aGUgSVBNQiBoZWFkZXIuKi8KKwkJCXJlY3ZfbXNnLT51c2VyID0gdXNlcjsKKwkJCXJlY3ZfbXNnLT5yZWN2X3R5cGUgPSBJUE1JX0NNRF9SRUNWX1RZUEU7CisJCQlyZWN2X21zZy0+bXNnaWQgPSBtc2ctPnJzcFs3XSA+PiAyOworCQkJcmVjdl9tc2ctPm1zZy5uZXRmbiA9IG1zZy0+cnNwWzRdID4+IDI7CisJCQlyZWN2X21zZy0+bXNnLmNtZCA9IG1zZy0+cnNwWzhdOworCQkJcmVjdl9tc2ctPm1zZy5kYXRhID0gcmVjdl9tc2ctPm1zZ19kYXRhOworCisJCQkvKiBXZSBjaG9wIG9mZiAxMCwgbm90IDkgYnl0ZXMgYmVjYXVzZSB0aGUgY2hlY2tzdW0KKwkJCSAgIGF0IHRoZSBlbmQgYWxzbyBuZWVkcyB0byBiZSByZW1vdmVkLiAqLworCQkJcmVjdl9tc2ctPm1zZy5kYXRhX2xlbiA9IG1zZy0+cnNwX3NpemUgLSAxMDsKKwkJCW1lbWNweShyZWN2X21zZy0+bXNnX2RhdGEsCisJCQkgICAgICAgJihtc2ctPnJzcFs5XSksCisJCQkgICAgICAgbXNnLT5yc3Bfc2l6ZSAtIDEwKTsKKwkJCWRlbGl2ZXJfcmVzcG9uc2UocmVjdl9tc2cpOworCQl9CisJfQorCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IGhhbmRsZV9sYW5fZ2V0X21zZ19yc3AoaXBtaV9zbWlfdCAgICAgICAgICBpbnRmLAorCQkJCSAgc3RydWN0IGlwbWlfc21pX21zZyAqbXNnKQoreworCXN0cnVjdCBpcG1pX2xhbl9hZGRyICBsYW5fYWRkcjsKKwlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAgKnJlY3ZfbXNnOworCXVuc2lnbmVkIGxvbmcgICAgICAgICBmbGFnczsKKworCisJLyogVGhpcyBpcyAxMywgbm90IDEyLCBiZWNhdXNlIHRoZSByZXNwb25zZSBtdXN0IGNvbnRhaW4gYQorCSAqIGNvbXBsZXRpb24gY29kZS4gKi8KKwlpZiAobXNnLT5yc3Bfc2l6ZSA8IDEzKSB7CisJCS8qIE1lc3NhZ2Ugbm90IGJpZyBlbm91Z2gsIGp1c3QgaWdub3JlIGl0LiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCWludGYtPmludmFsaWRfbGFuX3Jlc3BvbnNlcysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1zZy0+cnNwWzJdICE9IDApIHsKKwkJLyogQW4gZXJyb3IgZ2V0dGluZyB0aGUgcmVzcG9uc2UsIGp1c3QgaWdub3JlIGl0LiAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlsYW5fYWRkci5hZGRyX3R5cGUgPSBJUE1JX0xBTl9BRERSX1RZUEU7CisJbGFuX2FkZHIuc2Vzc2lvbl9oYW5kbGUgPSBtc2ctPnJzcFs0XTsKKwlsYW5fYWRkci5yZW1vdGVfU1dJRCA9IG1zZy0+cnNwWzhdOworCWxhbl9hZGRyLmxvY2FsX1NXSUQgPSBtc2ctPnJzcFs1XTsKKwlsYW5fYWRkci5jaGFubmVsID0gbXNnLT5yc3BbM10gJiAweDBmOworCWxhbl9hZGRyLnByaXZpbGVnZSA9IG1zZy0+cnNwWzNdID4+IDQ7CisJbGFuX2FkZHIubHVuID0gbXNnLT5yc3BbOV0gJiAzOworCisJLyogSXQncyBhIHJlc3BvbnNlIGZyb20gYSByZW1vdGUgZW50aXR5LiAgTG9vayB1cCB0aGUgc2VxdWVuY2UKKwkgICBudW1iZXIgYW5kIGhhbmRsZSB0aGUgcmVzcG9uc2UuICovCisJaWYgKGludGZfZmluZF9zZXEoaW50ZiwKKwkJCSAgbXNnLT5yc3BbOV0gPj4gMiwKKwkJCSAgbXNnLT5yc3BbM10gJiAweDBmLAorCQkJICBtc2ctPnJzcFsxMF0sCisJCQkgIChtc2ctPnJzcFs2XSA+PiAyKSAmICh+MSksCisJCQkgIChzdHJ1Y3QgaXBtaV9hZGRyICopICYobGFuX2FkZHIpLAorCQkJICAmcmVjdl9tc2cpKQorCXsKKwkJLyogV2Ugd2VyZSB1bmFibGUgdG8gZmluZCB0aGUgc2VxdWVuY2UgbnVtYmVyLAorCQkgICBzbyBqdXN0IG51a2UgdGhlIG1lc3NhZ2UuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJaW50Zi0+dW5oYW5kbGVkX2xhbl9yZXNwb25zZXMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCW1lbWNweShyZWN2X21zZy0+bXNnX2RhdGEsCisJICAgICAgICYobXNnLT5yc3BbMTFdKSwKKwkgICAgICAgbXNnLT5yc3Bfc2l6ZSAtIDExKTsKKwkvKiBUaGUgb3RoZXIgZmllbGRzIG1hdGNoZWQsIHNvIG5vIG5lZWQgdG8gc2V0IHRoZW0sIGV4Y2VwdAorICAgICAgICAgICBmb3IgbmV0Zm4sIHdoaWNoIG5lZWRzIHRvIGJlIHRoZSByZXNwb25zZSB0aGF0IHdhcworICAgICAgICAgICByZXR1cm5lZCwgbm90IHRoZSByZXF1ZXN0IHZhbHVlLiAqLworCXJlY3ZfbXNnLT5tc2cubmV0Zm4gPSBtc2ctPnJzcFs2XSA+PiAyOworCXJlY3ZfbXNnLT5tc2cuZGF0YSA9IHJlY3ZfbXNnLT5tc2dfZGF0YTsKKwlyZWN2X21zZy0+bXNnLmRhdGFfbGVuID0gbXNnLT5yc3Bfc2l6ZSAtIDEyOworCXJlY3ZfbXNnLT5yZWN2X3R5cGUgPSBJUE1JX1JFU1BPTlNFX1JFQ1ZfVFlQRTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJaW50Zi0+aGFuZGxlZF9sYW5fcmVzcG9uc2VzKys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJZGVsaXZlcl9yZXNwb25zZShyZWN2X21zZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfbGFuX2dldF9tc2dfY21kKGlwbWlfc21pX3QgICAgICAgICAgaW50ZiwKKwkJCQkgIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgY21kX3JjdnIgICAgICAgKnJjdnI7CisJaW50ICAgICAgICAgICAgICAgICAgIHJ2ID0gMDsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgbmV0Zm47CisJdW5zaWduZWQgY2hhciAgICAgICAgIGNtZDsKKwlpcG1pX3VzZXJfdCAgICAgICAgICAgdXNlciA9IE5VTEw7CisJc3RydWN0IGlwbWlfbGFuX2FkZHIgICpsYW5fYWRkcjsKKwlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAgKnJlY3ZfbXNnOworCXVuc2lnbmVkIGxvbmcgICAgICAgICBmbGFnczsKKworCWlmIChtc2ctPnJzcF9zaXplIDwgMTIpIHsKKwkJLyogTWVzc2FnZSBub3QgYmlnIGVub3VnaCwganVzdCBpZ25vcmUgaXQuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJaW50Zi0+aW52YWxpZF9jb21tYW5kcysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1zZy0+cnNwWzJdICE9IDApIHsKKwkJLyogQW4gZXJyb3IgZ2V0dGluZyB0aGUgcmVzcG9uc2UsIGp1c3QgaWdub3JlIGl0LiAqLworCQlyZXR1cm4gMDsKKwl9CisKKwluZXRmbiA9IG1zZy0+cnNwWzZdID4+IDI7CisJY21kID0gbXNnLT5yc3BbMTBdOworCisJcmVhZF9sb2NrKCYoaW50Zi0+Y21kX3JjdnJfbG9jaykpOworCisJaWYgKGludGYtPmFsbF9jbWRfcmN2cikgeworCQl1c2VyID0gaW50Zi0+YWxsX2NtZF9yY3ZyOworCX0gZWxzZSB7CisJCS8qIEZpbmQgdGhlIGNvbW1hbmQvbmV0Zm4uICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmN2ciwgJihpbnRmLT5jbWRfcmN2cnMpLCBsaW5rKSB7CisJCQlpZiAoKHJjdnItPm5ldGZuID09IG5ldGZuKSAmJiAocmN2ci0+Y21kID09IGNtZCkpIHsKKwkJCQl1c2VyID0gcmN2ci0+dXNlcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZWFkX3VubG9jaygmKGludGYtPmNtZF9yY3ZyX2xvY2spKTsKKworCWlmICh1c2VyID09IE5VTEwpIHsKKwkJLyogV2UgZGlkbid0IGZpbmQgYSB1c2VyLCBkZWxpdmVyIGFuIGVycm9yIHJlc3BvbnNlLiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCWludGYtPnVuaGFuZGxlZF9jb21tYW5kcysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKworCQlydiA9IDA7IC8qIERvbid0IGRvIGFueXRoaW5nIHdpdGggdGhlc2UgbWVzc2FnZXMsIGp1c3QKKwkJCSAgIGFsbG93IHRoZW0gdG8gYmUgZnJlZWQuICovCisJfSBlbHNlIHsKKwkJLyogRGVsaXZlciB0aGUgbWVzc2FnZSB0byB0aGUgdXNlci4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlpbnRmLT5oYW5kbGVkX2NvbW1hbmRzKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCisJCXJlY3ZfbXNnID0gaXBtaV9hbGxvY19yZWN2X21zZygpOworCQlpZiAoISByZWN2X21zZykgeworCQkJLyogV2UgY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHNvIHJlcXVldWUgaXQgZm9yIGhhbmRsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlci4gKi8KKwkJCXJ2ID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIEV4dHJhY3QgdGhlIHNvdXJjZSBhZGRyZXNzIGZyb20gdGhlIGRhdGEuICovCisJCQlsYW5fYWRkciA9IChzdHJ1Y3QgaXBtaV9sYW5fYWRkciAqKSAmcmVjdl9tc2ctPmFkZHI7CisJCQlsYW5fYWRkci0+YWRkcl90eXBlID0gSVBNSV9MQU5fQUREUl9UWVBFOworCQkJbGFuX2FkZHItPnNlc3Npb25faGFuZGxlID0gbXNnLT5yc3BbNF07CisJCQlsYW5fYWRkci0+cmVtb3RlX1NXSUQgPSBtc2ctPnJzcFs4XTsKKwkJCWxhbl9hZGRyLT5sb2NhbF9TV0lEID0gbXNnLT5yc3BbNV07CisJCQlsYW5fYWRkci0+bHVuID0gbXNnLT5yc3BbOV0gJiAzOworCQkJbGFuX2FkZHItPmNoYW5uZWwgPSBtc2ctPnJzcFszXSAmIDB4ZjsKKwkJCWxhbl9hZGRyLT5wcml2aWxlZ2UgPSBtc2ctPnJzcFszXSA+PiA0OworCisJCQkvKiBFeHRyYWN0IHRoZSByZXN0IG9mIHRoZSBtZXNzYWdlIGluZm9ybWF0aW9uCisJCQkgICBmcm9tIHRoZSBJUE1CIGhlYWRlci4qLworCQkJcmVjdl9tc2ctPnVzZXIgPSB1c2VyOworCQkJcmVjdl9tc2ctPnJlY3ZfdHlwZSA9IElQTUlfQ01EX1JFQ1ZfVFlQRTsKKwkJCXJlY3ZfbXNnLT5tc2dpZCA9IG1zZy0+cnNwWzldID4+IDI7CisJCQlyZWN2X21zZy0+bXNnLm5ldGZuID0gbXNnLT5yc3BbNl0gPj4gMjsKKwkJCXJlY3ZfbXNnLT5tc2cuY21kID0gbXNnLT5yc3BbMTBdOworCQkJcmVjdl9tc2ctPm1zZy5kYXRhID0gcmVjdl9tc2ctPm1zZ19kYXRhOworCisJCQkvKiBXZSBjaG9wIG9mZiAxMiwgbm90IDExIGJ5dGVzIGJlY2F1c2UgdGhlIGNoZWNrc3VtCisJCQkgICBhdCB0aGUgZW5kIGFsc28gbmVlZHMgdG8gYmUgcmVtb3ZlZC4gKi8KKwkJCXJlY3ZfbXNnLT5tc2cuZGF0YV9sZW4gPSBtc2ctPnJzcF9zaXplIC0gMTI7CisJCQltZW1jcHkocmVjdl9tc2ctPm1zZ19kYXRhLAorCQkJICAgICAgICYobXNnLT5yc3BbMTFdKSwKKwkJCSAgICAgICBtc2ctPnJzcF9zaXplIC0gMTIpOworCQkJZGVsaXZlcl9yZXNwb25zZShyZWN2X21zZyk7CisJCX0KKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfZXZlbnRfaW50b19yZWN2X21zZyhzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqcmVjdl9tc2csCisJCQkJICAgICBzdHJ1Y3QgaXBtaV9zbWlfbXNnICAqbXNnKQoreworCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciAqc21pX2FkZHI7CisJCisJcmVjdl9tc2ctPm1zZ2lkID0gMDsKKwlzbWlfYWRkciA9IChzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgKikgJihyZWN2X21zZy0+YWRkcik7CisJc21pX2FkZHItPmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisJc21pX2FkZHItPmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworCXNtaV9hZGRyLT5sdW4gPSBtc2ctPnJzcFswXSAmIDM7CisJcmVjdl9tc2ctPnJlY3ZfdHlwZSA9IElQTUlfQVNZTkNfRVZFTlRfUkVDVl9UWVBFOworCXJlY3ZfbXNnLT5tc2cubmV0Zm4gPSBtc2ctPnJzcFswXSA+PiAyOworCXJlY3ZfbXNnLT5tc2cuY21kID0gbXNnLT5yc3BbMV07CisJbWVtY3B5KHJlY3ZfbXNnLT5tc2dfZGF0YSwgJihtc2ctPnJzcFszXSksIG1zZy0+cnNwX3NpemUgLSAzKTsKKwlyZWN2X21zZy0+bXNnLmRhdGEgPSByZWN2X21zZy0+bXNnX2RhdGE7CisJcmVjdl9tc2ctPm1zZy5kYXRhX2xlbiA9IG1zZy0+cnNwX3NpemUgLSAzOworfQorCisvKiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGludGYtPnVzZXJzX2xvY2sgcmVhZC1sb2NrZWQsIHNvIG5vIG5lZWQKKyAgIHRvIGRvIHRoYXQgaGVyZS4gKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3JlYWRfZXZlbnRfcnNwKGlwbWlfc21pX3QgICAgICAgICAgaW50ZiwKKwkJCQkgc3RydWN0IGlwbWlfc21pX21zZyAqbXNnKQoreworCXN0cnVjdCBpcG1pX3JlY3ZfbXNnICpyZWN2X21zZywgKnJlY3ZfbXNnMjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICBtc2dzOworCWlwbWlfdXNlcl90ICAgICAgICAgIHVzZXI7CisJaW50ICAgICAgICAgICAgICAgICAgcnYgPSAwOworCWludCAgICAgICAgICAgICAgICAgIGRlbGl2ZXJfY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgICAgICAgIGZsYWdzOworCisJaWYgKG1zZy0+cnNwX3NpemUgPCAxOSkgeworCQkvKiBNZXNzYWdlIGlzIHRvbyBzbWFsbCB0byBiZSBhbiBJUE1CIGV2ZW50LiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCWludGYtPmludmFsaWRfZXZlbnRzKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobXNnLT5yc3BbMl0gIT0gMCkgeworCQkvKiBBbiBlcnJvciBnZXR0aW5nIHRoZSBldmVudCwganVzdCBpZ25vcmUgaXQuICovCisJCXJldHVybiAwOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZtc2dzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoaW50Zi0+ZXZlbnRzX2xvY2spLCBmbGFncyk7CisKKwlzcGluX2xvY2soJmludGYtPmNvdW50ZXJfbG9jayk7CisJaW50Zi0+ZXZlbnRzKys7CisJc3Bpbl91bmxvY2soJmludGYtPmNvdW50ZXJfbG9jayk7CisKKwkvKiBBbGxvY2F0ZSBhbmQgZmlsbCBpbiBvbmUgbWVzc2FnZSBmb3IgZXZlcnkgdXNlciB0aGF0IGlzIGdldHRpbmcKKwkgICBldmVudHMuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh1c2VyLCAmKGludGYtPnVzZXJzKSwgbGluaykgeworCQlpZiAoISB1c2VyLT5nZXRzX2V2ZW50cykKKwkJCWNvbnRpbnVlOworCisJCXJlY3ZfbXNnID0gaXBtaV9hbGxvY19yZWN2X21zZygpOworCQlpZiAoISByZWN2X21zZykgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlY3ZfbXNnLCByZWN2X21zZzIsICZtc2dzLCBsaW5rKSB7CisJCQkJbGlzdF9kZWwoJnJlY3ZfbXNnLT5saW5rKTsKKwkJCQlpcG1pX2ZyZWVfcmVjdl9tc2cocmVjdl9tc2cpOworCQkJfQorCQkJLyogV2UgY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHNvIHJlcXVldWUgaXQgZm9yIGhhbmRsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlci4gKi8KKwkJCXJ2ID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZGVsaXZlcl9jb3VudCsrOworCisJCWNvcHlfZXZlbnRfaW50b19yZWN2X21zZyhyZWN2X21zZywgbXNnKTsKKwkJcmVjdl9tc2ctPnVzZXIgPSB1c2VyOworCQlsaXN0X2FkZF90YWlsKCYocmVjdl9tc2ctPmxpbmspLCAmbXNncyk7CisJfQorCisJaWYgKGRlbGl2ZXJfY291bnQpIHsKKwkJLyogTm93IGRlbGl2ZXIgYWxsIHRoZSBtZXNzYWdlcy4gKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlY3ZfbXNnLCByZWN2X21zZzIsICZtc2dzLCBsaW5rKSB7CisJCQlsaXN0X2RlbCgmcmVjdl9tc2ctPmxpbmspOworCQkJZGVsaXZlcl9yZXNwb25zZShyZWN2X21zZyk7CisJCX0KKwl9IGVsc2UgaWYgKGludGYtPndhaXRpbmdfZXZlbnRzX2NvdW50IDwgTUFYX0VWRU5UU19JTl9RVUVVRSkgeworCQkvKiBObyBvbmUgdG8gcmVjZWl2ZSB0aGUgbWVzc2FnZSwgcHV0IGl0IGluIHF1ZXVlIGlmIHRoZXJlJ3MKKwkJICAgbm90IGFscmVhZHkgdG9vIG1hbnkgdGhpbmdzIGluIHRoZSBxdWV1ZS4gKi8KKwkJcmVjdl9tc2cgPSBpcG1pX2FsbG9jX3JlY3ZfbXNnKCk7CisJCWlmICghIHJlY3ZfbXNnKSB7CisJCQkvKiBXZSBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgc28gcmVxdWV1ZSBpdCBmb3IgaGFuZGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVyLiAqLworCQkJcnYgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKworCQljb3B5X2V2ZW50X2ludG9fcmVjdl9tc2cocmVjdl9tc2csIG1zZyk7CisJCWxpc3RfYWRkX3RhaWwoJihyZWN2X21zZy0+bGluayksICYoaW50Zi0+d2FpdGluZ19ldmVudHMpKTsKKwl9IGVsc2UgeworCQkvKiBUaGVyZSdzIHRvbyBtYW55IHRoaW5ncyBpbiB0aGUgcXVldWUsIGRpc2NhcmQgdGhpcworCQkgICBtZXNzYWdlLiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiRXZlbnQgcXVldWUgZnVsbCwgZGlzY2FyZGluZyBhbiIKKwkJICAgICAgICIgaW5jb21pbmcgZXZlbnRcbiIpOworCX0KKworIG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaW50Zi0+ZXZlbnRzX2xvY2spLCBmbGFncyk7CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2JtY19yc3AoaXBtaV9zbWlfdCAgICAgICAgICBpbnRmLAorCQkJICBzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7CisJc3RydWN0IGlwbWlfcmVjdl9tc2cgKnJlY3ZfbXNnOworCWludCAgICAgICAgICAgICAgICAgIGZvdW5kID0gMDsKKwlzdHJ1Y3QgaXBtaV91c2VyICAgICAqdXNlcjsKKwl1bnNpZ25lZCBsb25nICAgICAgICBmbGFnczsKKworCXJlY3ZfbXNnID0gKHN0cnVjdCBpcG1pX3JlY3ZfbXNnICopIG1zZy0+dXNlcl9kYXRhOworCisJLyogTWFrZSBzdXJlIHRoZSB1c2VyIHN0aWxsIGV4aXN0cy4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVzZXIsICYoaW50Zi0+dXNlcnMpLCBsaW5rKSB7CisJCWlmICh1c2VyID09IHJlY3ZfbXNnLT51c2VyKSB7CisJCQkvKiBGb3VuZCBpdCwgc28gd2UgY2FuIGRlbGl2ZXIgaXQgKi8KKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQkvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBOVUxMIHVzZXJzLiAqLworCQlpZiAoIXJlY3ZfbXNnLT51c2VyICYmIGludGYtPm51bGxfdXNlcl9oYW5kbGVyKXsKKwkJCWludGYtPm51bGxfdXNlcl9oYW5kbGVyKGludGYsIG1zZyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlpbnRmLT5oYW5kbGVkX2xvY2FsX3Jlc3BvbnNlcysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCX1lbHNleworCQkJLyogVGhlIHVzZXIgZm9yIHRoZSBtZXNzYWdlIHdlbnQgYXdheSwgc28gZ2l2ZSB1cC4gKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWludGYtPnVuaGFuZGxlZF9sb2NhbF9yZXNwb25zZXMrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQl9CisJCWlwbWlfZnJlZV9yZWN2X21zZyhyZWN2X21zZyk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyICpzbWlfYWRkcjsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCWludGYtPmhhbmRsZWRfbG9jYWxfcmVzcG9uc2VzKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlyZWN2X21zZy0+cmVjdl90eXBlID0gSVBNSV9SRVNQT05TRV9SRUNWX1RZUEU7CisJCXJlY3ZfbXNnLT5tc2dpZCA9IG1zZy0+bXNnaWQ7CisJCXNtaV9hZGRyID0gKChzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgKikKKwkJCSAgICAmKHJlY3ZfbXNnLT5hZGRyKSk7CisJCXNtaV9hZGRyLT5hZGRyX3R5cGUgPSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFOworCQlzbWlfYWRkci0+Y2hhbm5lbCA9IElQTUlfQk1DX0NIQU5ORUw7CisJCXNtaV9hZGRyLT5sdW4gPSBtc2ctPnJzcFswXSAmIDM7CisJCXJlY3ZfbXNnLT5tc2cubmV0Zm4gPSBtc2ctPnJzcFswXSA+PiAyOworCQlyZWN2X21zZy0+bXNnLmNtZCA9IG1zZy0+cnNwWzFdOworCQltZW1jcHkocmVjdl9tc2ctPm1zZ19kYXRhLAorCQkgICAgICAgJihtc2ctPnJzcFsyXSksCisJCSAgICAgICBtc2ctPnJzcF9zaXplIC0gMik7CisJCXJlY3ZfbXNnLT5tc2cuZGF0YSA9IHJlY3ZfbXNnLT5tc2dfZGF0YTsKKwkJcmVjdl9tc2ctPm1zZy5kYXRhX2xlbiA9IG1zZy0+cnNwX3NpemUgLSAyOworCQlkZWxpdmVyX3Jlc3BvbnNlKHJlY3ZfbXNnKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogSGFuZGxlIGEgbmV3IG1lc3NhZ2UuICBSZXR1cm4gMSBpZiB0aGUgbWVzc2FnZSBzaG91bGQgYmUgcmVxdWV1ZWQsCisgICAwIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBmcmVlZCwgb3IgLTEgaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIG5vdAorICAgYmUgZnJlZWQgb3IgcmVxdWV1ZWQuICovCitzdGF0aWMgaW50IGhhbmRsZV9uZXdfcmVjdl9tc2coaXBtaV9zbWlfdCAgICAgICAgICBpbnRmLAorCQkJICAgICAgIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKKwlpbnQgcmVxdWV1ZTsKKwlpbnQgY2hhbjsKKworI2lmZGVmIERFQlVHX01TR0lORworCWludCBtOworCXByaW50aygiUmVjdjoiKTsKKwlmb3IgKG09MDsgbTxtc2ctPnJzcF9zaXplOyBtKyspCisJCXByaW50aygiICUyLjJ4IiwgbXNnLT5yc3BbbV0pOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCWlmIChtc2ctPnJzcF9zaXplIDwgMikgeworCQkvKiBNZXNzYWdlIGlzIHRvbyBzbWFsbCB0byBiZSBjb3JyZWN0LiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiQk1DIHJldHVybmVkIHRvIHNtYWxsIGEgbWVzc2FnZSIKKwkJICAgICAgICIgZm9yIG5ldGZuICV4IGNtZCAleCwgZ290ICVkIGJ5dGVzXG4iLAorCQkgICAgICAgKG1zZy0+ZGF0YVswXSA+PiAyKSB8IDEsIG1zZy0+ZGF0YVsxXSwgbXNnLT5yc3Bfc2l6ZSk7CisKKwkJLyogR2VuZXJhdGUgYW4gZXJyb3IgcmVzcG9uc2UgZm9yIHRoZSBtZXNzYWdlLiAqLworCQltc2ctPnJzcFswXSA9IG1zZy0+ZGF0YVswXSB8ICgxIDw8IDIpOworCQltc2ctPnJzcFsxXSA9IG1zZy0+ZGF0YVsxXTsKKwkJbXNnLT5yc3BbMl0gPSBJUE1JX0VSUl9VTlNQRUNJRklFRDsKKwkJbXNnLT5yc3Bfc2l6ZSA9IDM7CisJfSBlbHNlIGlmICgoKG1zZy0+cnNwWzBdID4+IDIpICE9ICgobXNnLT5kYXRhWzBdID4+IDIpIHwgMSkpLyogTmV0Zm4gKi8KKwkJICAgfHwgKG1zZy0+cnNwWzFdICE9IG1zZy0+ZGF0YVsxXSkpCQkgIC8qIENvbW1hbmQgKi8KKwl7CisJCS8qIFRoZSByZXNwb25zZSBpcyBub3QgZXZlbiBtYXJnaW5hbGx5IGNvcnJlY3QuICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJCTUMgcmV0dXJuZWQgaW5jb3JyZWN0IHJlc3BvbnNlLCIKKwkJICAgICAgICIgZXhwZWN0ZWQgbmV0Zm4gJXggY21kICV4LCBnb3QgbmV0Zm4gJXggY21kICV4XG4iLAorCQkgICAgICAgKG1zZy0+ZGF0YVswXSA+PiAyKSB8IDEsIG1zZy0+ZGF0YVsxXSwKKwkJICAgICAgIG1zZy0+cnNwWzBdID4+IDIsIG1zZy0+cnNwWzFdKTsKKworCQkvKiBHZW5lcmF0ZSBhbiBlcnJvciByZXNwb25zZSBmb3IgdGhlIG1lc3NhZ2UuICovCisJCW1zZy0+cnNwWzBdID0gbXNnLT5kYXRhWzBdIHwgKDEgPDwgMik7CisJCW1zZy0+cnNwWzFdID0gbXNnLT5kYXRhWzFdOworCQltc2ctPnJzcFsyXSA9IElQTUlfRVJSX1VOU1BFQ0lGSUVEOworCQltc2ctPnJzcF9zaXplID0gMzsKKwl9CisKKwlpZiAoKG1zZy0+cnNwWzBdID09ICgoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVHwxKSA8PCAyKSkKKwkgICAgJiYgKG1zZy0+cnNwWzFdID09IElQTUlfU0VORF9NU0dfQ01EKQorCSAgICAmJiAobXNnLT51c2VyX2RhdGEgIT0gTlVMTCkpCisJeworCQkvKiBJdCdzIGEgcmVzcG9uc2UgdG8gYSByZXNwb25zZSB3ZSBzZW50LiAgRm9yIHRoaXMgd2UKKwkJICAgZGVsaXZlciBhIHNlbmQgbWVzc2FnZSByZXNwb25zZSB0byB0aGUgdXNlci4gKi8KKwkJc3RydWN0IGlwbWlfcmVjdl9tc2cgKnJlY3ZfbXNnID0gbXNnLT51c2VyX2RhdGE7CisKKwkJcmVxdWV1ZSA9IDA7CisJCWlmIChtc2ctPnJzcF9zaXplIDwgMikKKwkJCS8qIE1lc3NhZ2UgaXMgdG9vIHNtYWxsIHRvIGJlIGNvcnJlY3QuICovCisJCQlnb3RvIG91dDsKKworCQljaGFuID0gbXNnLT5kYXRhWzJdICYgMHgwZjsKKwkJaWYgKGNoYW4gPj0gSVBNSV9NQVhfQ0hBTk5FTFMpCisJCQkvKiBJbnZhbGlkIGNoYW5uZWwgbnVtYmVyICovCisJCQlnb3RvIG91dDsKKworCQlpZiAocmVjdl9tc2cpIHsKKwkJCXJlY3ZfbXNnLT5yZWN2X3R5cGUgPSBJUE1JX1JFU1BPTlNFX1JFU1BPTlNFX1RZUEU7CisJCQlyZWN2X21zZy0+bXNnLmRhdGEgPSByZWN2X21zZy0+bXNnX2RhdGE7CisJCQlyZWN2X21zZy0+bXNnLmRhdGFfbGVuID0gMTsKKwkJCXJlY3ZfbXNnLT5tc2dfZGF0YVswXSA9IG1zZy0+cnNwWzJdOworCQkJZGVsaXZlcl9yZXNwb25zZShyZWN2X21zZyk7CisJCX0KKwl9IGVsc2UgaWYgKChtc2ctPnJzcFswXSA9PSAoKElQTUlfTkVURk5fQVBQX1JFUVVFU1R8MSkgPDwgMikpCisJCSAgICYmIChtc2ctPnJzcFsxXSA9PSBJUE1JX0dFVF9NU0dfQ01EKSkKKwl7CisJCS8qIEl0J3MgZnJvbSB0aGUgcmVjZWl2ZSBxdWV1ZS4gKi8KKwkJY2hhbiA9IG1zZy0+cnNwWzNdICYgMHhmOworCQlpZiAoY2hhbiA+PSBJUE1JX01BWF9DSEFOTkVMUykgeworCQkJLyogSW52YWxpZCBjaGFubmVsIG51bWJlciAqLworCQkJcmVxdWV1ZSA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN3aXRjaCAoaW50Zi0+Y2hhbm5lbHNbY2hhbl0ubWVkaXVtKSB7CisJCWNhc2UgSVBNSV9DSEFOTkVMX01FRElVTV9JUE1COgorCQkJaWYgKG1zZy0+cnNwWzRdICYgMHgwNCkgeworCQkJCS8qIEl0J3MgYSByZXNwb25zZSwgc28gZmluZCB0aGUKKwkJCQkgICByZXF1ZXN0aW5nIG1lc3NhZ2UgYW5kIHNlbmQgaXQgdXAuICovCisJCQkJcmVxdWV1ZSA9IGhhbmRsZV9pcG1iX2dldF9tc2dfcnNwKGludGYsIG1zZyk7CisJCQl9IGVsc2UgeworCQkJCS8qIEl0J3MgYSBjb21tYW5kIHRvIHRoZSBTTVMgZnJvbSBzb21lIG90aGVyCisJCQkJICAgZW50aXR5LiAgSGFuZGxlIHRoYXQuICovCisJCQkJcmVxdWV1ZSA9IGhhbmRsZV9pcG1iX2dldF9tc2dfY21kKGludGYsIG1zZyk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIElQTUlfQ0hBTk5FTF9NRURJVU1fODAyM0xBTjoKKwkJY2FzZSBJUE1JX0NIQU5ORUxfTUVESVVNX0FTWU5DOgorCQkJaWYgKG1zZy0+cnNwWzZdICYgMHgwNCkgeworCQkJCS8qIEl0J3MgYSByZXNwb25zZSwgc28gZmluZCB0aGUKKwkJCQkgICByZXF1ZXN0aW5nIG1lc3NhZ2UgYW5kIHNlbmQgaXQgdXAuICovCisJCQkJcmVxdWV1ZSA9IGhhbmRsZV9sYW5fZ2V0X21zZ19yc3AoaW50ZiwgbXNnKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogSXQncyBhIGNvbW1hbmQgdG8gdGhlIFNNUyBmcm9tIHNvbWUgb3RoZXIKKwkJCQkgICBlbnRpdHkuICBIYW5kbGUgdGhhdC4gKi8KKwkJCQlyZXF1ZXVlID0gaGFuZGxlX2xhbl9nZXRfbXNnX2NtZChpbnRmLCBtc2cpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIFdlIGRvbid0IGhhbmRsZSB0aGUgY2hhbm5lbCB0eXBlLCBzbyBqdXN0CisJCQkgKiBmcmVlIHRoZSBtZXNzYWdlLiAqLworCQkJcmVxdWV1ZSA9IDA7CisJCX0KKworCX0gZWxzZSBpZiAoKG1zZy0+cnNwWzBdID09ICgoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVHwxKSA8PCAyKSkKKwkJICAgJiYgKG1zZy0+cnNwWzFdID09IElQTUlfUkVBRF9FVkVOVF9NU0dfQlVGRkVSX0NNRCkpCisJeworCQkvKiBJdCdzIGFuIGFzeW5jcm9ub3VzIGV2ZW50LiAqLworCQlyZXF1ZXVlID0gaGFuZGxlX3JlYWRfZXZlbnRfcnNwKGludGYsIG1zZyk7CisJfSBlbHNlIHsKKwkJLyogSXQncyBhIHJlc3BvbnNlIGZyb20gdGhlIGxvY2FsIEJNQy4gKi8KKwkJcmVxdWV1ZSA9IGhhbmRsZV9ibWNfcnNwKGludGYsIG1zZyk7CisJfQorCisgb3V0OgorCXJldHVybiByZXF1ZXVlOworfQorCisvKiBIYW5kbGUgYSBuZXcgbWVzc2FnZSBmcm9tIHRoZSBsb3dlciBsYXllci4gKi8KK3ZvaWQgaXBtaV9zbWlfbXNnX3JlY2VpdmVkKGlwbWlfc21pX3QgICAgICAgICAgaW50ZiwKKwkJCSAgIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgICAgICAgICAgcnY7CisKKworCS8qIExvY2sgdGhlIHVzZXIgbG9jayBzbyB0aGUgdXNlciBjYW4ndCBnbyBhd2F5IHdoaWxlIHdlIGFyZQorCSAgIHdvcmtpbmcgb24gaXQuICovCisJcmVhZF9sb2NrKCYoaW50Zi0+dXNlcnNfbG9jaykpOworCisJaWYgKChtc2ctPmRhdGFfc2l6ZSA+PSAyKQorCSAgICAmJiAobXNnLT5kYXRhWzBdID09IChJUE1JX05FVEZOX0FQUF9SRVFVRVNUIDw8IDIpKQorCSAgICAmJiAobXNnLT5kYXRhWzFdID09IElQTUlfU0VORF9NU0dfQ01EKQorCSAgICAmJiAobXNnLT51c2VyX2RhdGEgPT0gTlVMTCkpIHsKKwkJLyogVGhpcyBpcyB0aGUgbG9jYWwgcmVzcG9uc2UgdG8gYSBjb21tYW5kIHNlbmQsIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgdGhlIHRpbWVyIGZvciB0aGVzZS4gIFRoZSB1c2VyX2RhdGEgd2lsbCBub3QgYmUKKyAgICAgICAgICAgICAgICAgICBOVUxMIGlmIHRoaXMgaXMgYSByZXNwb25zZSBzZW5kLCBhbmQgd2Ugd2lsbCBsZXQKKyAgICAgICAgICAgICAgICAgICByZXNwb25zZSBzZW5kcyBqdXN0IGdvIHRocm91Z2guICovCisKKwkJLyogQ2hlY2sgZm9yIGVycm9ycywgaWYgd2UgZ2V0IGNlcnRhaW4gZXJyb3JzIChvbmVzCisgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFuIGJhc2ljYWxseSB3ZSBjYW4gdHJ5IGFnYWluIGxhdGVyKSwgd2UKKyAgICAgICAgICAgICAgICAgICBpZ25vcmUgdGhlbSBhbmQgc3RhcnQgdGhlIHRpbWVyLiAgT3RoZXJ3aXNlIHdlCisgICAgICAgICAgICAgICAgICAgcmVwb3J0IHRoZSBlcnJvciBpbW1lZGlhdGVseS4gKi8KKwkJaWYgKChtc2ctPnJzcF9zaXplID49IDMpICYmIChtc2ctPnJzcFsyXSAhPSAwKQorCQkgICAgJiYgKG1zZy0+cnNwWzJdICE9IElQTUlfTk9ERV9CVVNZX0VSUikKKwkJICAgICYmIChtc2ctPnJzcFsyXSAhPSBJUE1JX0xPU1RfQVJCSVRSQVRJT05fRVJSKSkKKwkJeworCQkJaW50IGNoYW4gPSBtc2ctPnJzcFszXSAmIDB4ZjsKKworCQkJLyogR290IGFuIGVycm9yIHNlbmRpbmcgdGhlIG1lc3NhZ2UsIGhhbmRsZSBpdC4gKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWlmIChjaGFuID49IElQTUlfTUFYX0NIQU5ORUxTKQorCQkJCTsgLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCisJCQllbHNlIGlmICgoaW50Zi0+Y2hhbm5lbHNbY2hhbl0ubWVkaXVtCisJCQkJICA9PSBJUE1JX0NIQU5ORUxfTUVESVVNXzgwMjNMQU4pCisJCQkJIHx8IChpbnRmLT5jaGFubmVsc1tjaGFuXS5tZWRpdW0KKwkJCQkgICAgID09IElQTUlfQ0hBTk5FTF9NRURJVU1fQVNZTkMpKQorCQkJCWludGYtPnNlbnRfbGFuX2NvbW1hbmRfZXJycysrOworCQkJZWxzZQorCQkJCWludGYtPnNlbnRfaXBtYl9jb21tYW5kX2VycnMrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJaW50Zl9lcnJfc2VxKGludGYsIG1zZy0+bXNnaWQsIG1zZy0+cnNwWzJdKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFRoZSBtZXNzYWdlIHdhcyBzZW50LCBzdGFydCB0aGUgdGltZXIuICovCisJCQlpbnRmX3N0YXJ0X3NlcV90aW1lcihpbnRmLCBtc2ctPm1zZ2lkKTsKKwkJfQorCisJCWlwbWlfZnJlZV9zbWlfbXNnKG1zZyk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBUbyBwcmVzZXJ2ZSBtZXNzYWdlIG9yZGVyLCBpZiB0aGUgbGlzdCBpcyBub3QgZW1wdHksIHdlCisgICAgICAgICAgIHRhY2sgdGhpcyBtZXNzYWdlIG9udG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmKGludGYtPndhaXRpbmdfbXNnc19sb2NrKSwgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmKGludGYtPndhaXRpbmdfbXNncykpKSB7CisJCWxpc3RfYWRkX3RhaWwoJihtc2ctPmxpbmspLCAmKGludGYtPndhaXRpbmdfbXNncykpOworCQlzcGluX3VubG9jaygmKGludGYtPndhaXRpbmdfbXNnc19sb2NrKSk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGludGYtPndhaXRpbmdfbXNnc19sb2NrKSwgZmxhZ3MpOworCQkKKwlydiA9IGhhbmRsZV9uZXdfcmVjdl9tc2coaW50ZiwgbXNnKTsKKwlpZiAocnYgPiAwKSB7CisJCS8qIENvdWxkIG5vdCBoYW5kbGUgdGhlIG1lc3NhZ2Ugbm93LCBqdXN0IGFkZCBpdCB0byBhCisgICAgICAgICAgICAgICAgICAgbGlzdCB0byBoYW5kbGUgbGF0ZXIuICovCisJCXNwaW5fbG9jaygmKGludGYtPndhaXRpbmdfbXNnc19sb2NrKSk7CisJCWxpc3RfYWRkX3RhaWwoJihtc2ctPmxpbmspLCAmKGludGYtPndhaXRpbmdfbXNncykpOworCQlzcGluX3VubG9jaygmKGludGYtPndhaXRpbmdfbXNnc19sb2NrKSk7CisJfSBlbHNlIGlmIChydiA9PSAwKSB7CisJCWlwbWlfZnJlZV9zbWlfbXNnKG1zZyk7CisJfQorCisgb3V0X3VubG9jazoKKwlyZWFkX3VubG9jaygmKGludGYtPnVzZXJzX2xvY2spKTsKK30KKwordm9pZCBpcG1pX3NtaV93YXRjaGRvZ19wcmV0aW1lb3V0KGlwbWlfc21pX3QgaW50ZikKK3sKKwlpcG1pX3VzZXJfdCB1c2VyOworCisJcmVhZF9sb2NrKCYoaW50Zi0+dXNlcnNfbG9jaykpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodXNlciwgJihpbnRmLT51c2VycyksIGxpbmspIHsKKwkJaWYgKCEgdXNlci0+aGFuZGxlci0+aXBtaV93YXRjaGRvZ19wcmV0aW1lb3V0KQorCQkJY29udGludWU7CisKKwkJdXNlci0+aGFuZGxlci0+aXBtaV93YXRjaGRvZ19wcmV0aW1lb3V0KHVzZXItPmhhbmRsZXJfZGF0YSk7CisJfQorCXJlYWRfdW5sb2NrKCYoaW50Zi0+dXNlcnNfbG9jaykpOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX21zZ190aW1lb3V0KHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2cpCit7CisJbXNnLT5yZWN2X3R5cGUgPSBJUE1JX1JFU1BPTlNFX1JFQ1ZfVFlQRTsKKwltc2ctPm1zZ19kYXRhWzBdID0gSVBNSV9USU1FT1VUX0NPTVBMRVRJT05fQ09ERTsKKwltc2ctPm1zZy5uZXRmbiB8PSAxOyAvKiBDb252ZXJ0IHRvIGEgcmVzcG9uc2UuICovCisJbXNnLT5tc2cuZGF0YV9sZW4gPSAxOworCW1zZy0+bXNnLmRhdGEgPSBtc2ctPm1zZ19kYXRhOworCWRlbGl2ZXJfcmVzcG9uc2UobXNnKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfZnJvbV9yZWN2X21zZyhpcG1pX3NtaV90IGludGYsIHN0cnVjdCBpcG1pX3JlY3ZfbXNnICpyZWN2X21zZywKKwkJICAgc3RydWN0IGlwbWlfc21pX21zZyAqc21pX21zZywKKwkJICAgdW5zaWduZWQgY2hhciBzZXEsIGxvbmcgc2VxaWQpCit7CisJaWYgKCFzbWlfbXNnKQorCQlzbWlfbXNnID0gaXBtaV9hbGxvY19zbWlfbXNnKCk7CisJaWYgKCFzbWlfbXNnKQorCQkvKiBJZiB3ZSBjYW4ndCBhbGxvY2F0ZSB0aGUgbWVzc2FnZSwgdGhlbiBqdXN0IHJldHVybiwgd2UKKwkJICAgZ2V0IDQgcmV0cmllcywgc28gdGhpcyBzaG91bGQgYmUgb2suICovCisJCXJldHVybjsKKworCW1lbWNweShzbWlfbXNnLT5kYXRhLCByZWN2X21zZy0+bXNnLmRhdGEsIHJlY3ZfbXNnLT5tc2cuZGF0YV9sZW4pOworCXNtaV9tc2ctPmRhdGFfc2l6ZSA9IHJlY3ZfbXNnLT5tc2cuZGF0YV9sZW47CisJc21pX21zZy0+bXNnaWQgPSBTVE9SRV9TRVFfSU5fTVNHSUQoc2VxLCBzZXFpZCk7CisJCQorCS8qIFNlbmQgdGhlIG5ldyBtZXNzYWdlLiAgV2Ugc2VuZCB3aXRoIGEgemVybyBwcmlvcml0eS4gIEl0CisJICAgdGltZWQgb3V0LCBJIGRvdWJ0IHRpbWUgaXMgdGhhdCBjcml0aWNhbCBub3csIGFuZCBoaWdoCisJICAgcHJpb3JpdHkgbWVzc2FnZXMgYXJlIHJlYWxseSBvbmx5IGZvciBtZXNzYWdlcyB0byB0aGUgbG9jYWwKKwkgICBNQywgd2hpY2ggZG9uJ3QgZ2V0IHJlc2VudC4gKi8KKwlpbnRmLT5oYW5kbGVycy0+c2VuZGVyKGludGYtPnNlbmRfaW5mbywgc21pX21zZywgMCk7CisKKyNpZmRlZiBERUJVR19NU0dJTkcKKwl7CisJCWludCBtOworCQlwcmludGsoIlJlc2VuZDogIik7CisJCWZvciAobT0wOyBtPHNtaV9tc2ctPmRhdGFfc2l6ZTsgbSsrKQorCQkJcHJpbnRrKCIgJTIuMngiLCBzbWlfbXNnLT5kYXRhW21dKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAoraXBtaV90aW1lb3V0X2hhbmRsZXIobG9uZyB0aW1lb3V0X3BlcmlvZCkKK3sKKwlpcG1pX3NtaV90ICAgICAgICAgICBpbnRmOworCXN0cnVjdCBsaXN0X2hlYWQgICAgIHRpbWVvdXRzOworCXN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2csICptc2cyOworCXN0cnVjdCBpcG1pX3NtaV9tc2cgICpzbWlfbXNnLCAqc21pX21zZzI7CisJdW5zaWduZWQgbG9uZyAgICAgICAgZmxhZ3M7CisJaW50ICAgICAgICAgICAgICAgICAgaSwgajsKKworCUlOSVRfTElTVF9IRUFEKCZ0aW1lb3V0cyk7CisKKwlzcGluX2xvY2soJmludGVyZmFjZXNfbG9jayk7CisJZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJCWludGYgPSBpcG1pX2ludGVyZmFjZXNbaV07CisJCWlmIChpbnRmID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlyZWFkX2xvY2soJihpbnRmLT51c2Vyc19sb2NrKSk7CisKKwkJLyogU2VlIGlmIGFueSB3YWl0aW5nIG1lc3NhZ2VzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkLiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmKGludGYtPndhaXRpbmdfbXNnc19sb2NrKSwgZmxhZ3MpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc21pX21zZywgc21pX21zZzIsICYoaW50Zi0+d2FpdGluZ19tc2dzKSwgbGluaykgeworCQkJaWYgKCEgaGFuZGxlX25ld19yZWN2X21zZyhpbnRmLCBzbWlfbXNnKSkgeworCQkJCWxpc3RfZGVsKCZzbWlfbXNnLT5saW5rKTsKKwkJCQlpcG1pX2ZyZWVfc21pX21zZyhzbWlfbXNnKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogVG8gcHJlc2VydmUgbWVzc2FnZSBvcmRlciwgcXVpdCBpZiB3ZQorCQkJCSAgIGNhbid0IGhhbmRsZSBhIG1lc3NhZ2UuICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGludGYtPndhaXRpbmdfbXNnc19sb2NrKSwgZmxhZ3MpOworCisJCS8qIEdvIHRocm91Z2ggdGhlIHNlcSB0YWJsZSBhbmQgZmluZCBhbnkgbWVzc2FnZXMgdGhhdAorCQkgICBoYXZlIHRpbWVkIG91dCwgcHV0dGluZyB0aGVtIGluIHRoZSB0aW1lb3V0cworCQkgICBsaXN0LiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmKGludGYtPnNlcV9sb2NrKSwgZmxhZ3MpOworCQlmb3IgKGo9MDsgajxJUE1JX0lQTUJfTlVNX1NFUTsgaisrKSB7CisJCQlzdHJ1Y3Qgc2VxX3RhYmxlICplbnQgPSAmKGludGYtPnNlcV90YWJsZVtqXSk7CisJCQlpZiAoIWVudC0+aW51c2UpCisJCQkJY29udGludWU7CisKKwkJCWVudC0+dGltZW91dCAtPSB0aW1lb3V0X3BlcmlvZDsKKwkJCWlmIChlbnQtPnRpbWVvdXQgPiAwKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZW50LT5yZXRyaWVzX2xlZnQgPT0gMCkgeworCQkJCS8qIFRoZSBtZXNzYWdlIGhhcyB1c2VkIGFsbCBpdHMgcmV0cmllcy4gKi8KKwkJCQllbnQtPmludXNlID0gMDsKKwkJCQltc2cgPSBlbnQtPnJlY3ZfbXNnOworCQkJCWxpc3RfYWRkX3RhaWwoJihtc2ctPmxpbmspLCAmdGltZW91dHMpOworCQkJCXNwaW5fbG9jaygmaW50Zi0+Y291bnRlcl9sb2NrKTsKKwkJCQlpZiAoZW50LT5icm9hZGNhc3QpCisJCQkJCWludGYtPnRpbWVkX291dF9pcG1iX2Jyb2FkY2FzdHMrKzsKKwkJCQllbHNlIGlmIChlbnQtPnJlY3ZfbXNnLT5hZGRyLmFkZHJfdHlwZQorCQkJCQkgPT0gSVBNSV9MQU5fQUREUl9UWVBFKQorCQkJCQlpbnRmLT50aW1lZF9vdXRfbGFuX2NvbW1hbmRzKys7CisJCQkJZWxzZQorCQkJCQlpbnRmLT50aW1lZF9vdXRfaXBtYl9jb21tYW5kcysrOworCQkJCXNwaW5fdW5sb2NrKCZpbnRmLT5jb3VudGVyX2xvY2spOworCQkJfSBlbHNlIHsKKwkJCQkvKiBNb3JlIHJldHJpZXMsIHNlbmQgYWdhaW4uICovCisKKwkJCQkvKiBTdGFydCB3aXRoIHRoZSBtYXggdGltZXIsIHNldCB0byBub3JtYWwKKwkJCQkgICB0aW1lciBhZnRlciB0aGUgbWVzc2FnZSBpcyBzZW50LiAqLworCQkJCWVudC0+dGltZW91dCA9IE1BWF9NU0dfVElNRU9VVDsKKwkJCQllbnQtPnJldHJpZXNfbGVmdC0tOworCQkJCXNlbmRfZnJvbV9yZWN2X21zZyhpbnRmLCBlbnQtPnJlY3ZfbXNnLCBOVUxMLAorCQkJCQkJICAgaiwgZW50LT5zZXFpZCk7CisJCQkJc3Bpbl9sb2NrKCZpbnRmLT5jb3VudGVyX2xvY2spOworCQkJCWlmIChlbnQtPnJlY3ZfbXNnLT5hZGRyLmFkZHJfdHlwZQorCQkJCSAgICA9PSBJUE1JX0xBTl9BRERSX1RZUEUpCisJCQkJCWludGYtPnJldHJhbnNtaXR0ZWRfbGFuX2NvbW1hbmRzKys7CisJCQkJZWxzZQorCQkJCQlpbnRmLT5yZXRyYW5zbWl0dGVkX2lwbWJfY29tbWFuZHMrKzsKKwkJCQlzcGluX3VubG9jaygmaW50Zi0+Y291bnRlcl9sb2NrKTsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaW50Zi0+c2VxX2xvY2spLCBmbGFncyk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgJnRpbWVvdXRzLCBsaW5rKSB7CisJCQloYW5kbGVfbXNnX3RpbWVvdXQobXNnKTsKKwkJfQorCisJCXJlYWRfdW5sb2NrKCYoaW50Zi0+dXNlcnNfbG9jaykpOworCX0KKwlzcGluX3VubG9jaygmaW50ZXJmYWNlc19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgaXBtaV9yZXF1ZXN0X2V2ZW50KHZvaWQpCit7CisJaXBtaV9zbWlfdCBpbnRmOworCWludCAgICAgICAgaTsKKworCXNwaW5fbG9jaygmaW50ZXJmYWNlc19sb2NrKTsKKwlmb3IgKGk9MDsgaTxNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKKwkJaW50ZiA9IGlwbWlfaW50ZXJmYWNlc1tpXTsKKwkJaWYgKGludGYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWludGYtPmhhbmRsZXJzLT5yZXF1ZXN0X2V2ZW50cyhpbnRmLT5zZW5kX2luZm8pOworCX0KKwlzcGluX3VubG9jaygmaW50ZXJmYWNlc19sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGlwbWlfdGltZXI7CisKKy8qIENhbGwgZXZlcnkgfjEwMCBtcy4gKi8KKyNkZWZpbmUgSVBNSV9USU1FT1VUX1RJTUUJMTAwCisKKy8qIEhvdyBtYW55IGppZmZpZXMgZG9lcyBpdCB0YWtlIHRvIGdldCB0byB0aGUgdGltZW91dCB0aW1lLiAqLworI2RlZmluZSBJUE1JX1RJTUVPVVRfSklGRklFUwkoKElQTUlfVElNRU9VVF9USU1FICogSFopIC8gMTAwMCkKKworLyogUmVxdWVzdCBldmVudHMgZnJvbSB0aGUgcXVldWUgZXZlcnkgc2Vjb25kICh0aGlzIGlzIHRoZSBudW1iZXIgb2YKKyAgIElQTUlfVElNRU9VVF9USU1FUyBiZXR3ZWVuIGV2ZW50IHJlcXVlc3RzKS4gIEhvcGVmdWxseSwgaW4gdGhlCisgICBmdXR1cmUsIElQTUkgd2lsbCBhZGQgYSB3YXkgdG8ga25vdyBpbW1lZGlhdGVseSBpZiBhbiBldmVudCBpcyBpbgorICAgdGhlIHF1ZXVlIGFuZCB0aGlzIHNpbGxpbmVzcyBjYW4gZ28gYXdheS4gKi8KKyNkZWZpbmUgSVBNSV9SRVFVRVNUX0VWX1RJTUUJKDEwMDAgLyAoSVBNSV9USU1FT1VUX1RJTUUpKQorCitzdGF0aWMgdm9sYXRpbGUgaW50IHN0b3Bfb3BlcmF0aW9uID0gMDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgdGltZXJfc3RvcHBlZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHRpY2tzX3RvX3JlcV9ldiA9IElQTUlfUkVRVUVTVF9FVl9USU1FOworCitzdGF0aWMgdm9pZCBpcG1pX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWlmIChzdG9wX29wZXJhdGlvbikgeworCQl0aW1lcl9zdG9wcGVkID0gMTsKKwkJcmV0dXJuOworCX0KKworCXRpY2tzX3RvX3JlcV9ldi0tOworCWlmICh0aWNrc190b19yZXFfZXYgPT0gMCkgeworCQlpcG1pX3JlcXVlc3RfZXZlbnQoKTsKKwkJdGlja3NfdG9fcmVxX2V2ID0gSVBNSV9SRVFVRVNUX0VWX1RJTUU7CisJfQorCisJaXBtaV90aW1lb3V0X2hhbmRsZXIoSVBNSV9USU1FT1VUX1RJTUUpOworCisJaXBtaV90aW1lci5leHBpcmVzICs9IElQTUlfVElNRU9VVF9KSUZGSUVTOworCWFkZF90aW1lcigmaXBtaV90aW1lcik7Cit9CisKKworc3RhdGljIGF0b21pY190IHNtaV9tc2dfaW51c2VfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBhdG9taWNfdCByZWN2X21zZ19pbnVzZV9jb3VudCA9IEFUT01JQ19JTklUKDApOworCisvKiBGSVhNRSAtIGNvbnZlcnQgdGhlc2UgdG8gc2xhYnMuICovCitzdGF0aWMgdm9pZCBmcmVlX3NtaV9tc2coc3RydWN0IGlwbWlfc21pX21zZyAqbXNnKQoreworCWF0b21pY19kZWMoJnNtaV9tc2dfaW51c2VfY291bnQpOworCWtmcmVlKG1zZyk7Cit9CisKK3N0cnVjdCBpcG1pX3NtaV9tc2cgKmlwbWlfYWxsb2Nfc21pX21zZyh2b2lkKQoreworCXN0cnVjdCBpcG1pX3NtaV9tc2cgKnJ2OworCXJ2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwbWlfc21pX21zZyksIEdGUF9BVE9NSUMpOworCWlmIChydikgeworCQlydi0+ZG9uZSA9IGZyZWVfc21pX21zZzsKKwkJcnYtPnVzZXJfZGF0YSA9IE5VTEw7CisJCWF0b21pY19pbmMoJnNtaV9tc2dfaW51c2VfY291bnQpOworCX0KKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmVjdl9tc2coc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZykKK3sKKwlhdG9taWNfZGVjKCZyZWN2X21zZ19pbnVzZV9jb3VudCk7CisJa2ZyZWUobXNnKTsKK30KKworc3RydWN0IGlwbWlfcmVjdl9tc2cgKmlwbWlfYWxsb2NfcmVjdl9tc2codm9pZCkKK3sKKwlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqcnY7CisKKwlydiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcG1pX3JlY3ZfbXNnKSwgR0ZQX0FUT01JQyk7CisJaWYgKHJ2KSB7CisJCXJ2LT5kb25lID0gZnJlZV9yZWN2X21zZzsKKwkJYXRvbWljX2luYygmcmVjdl9tc2dfaW51c2VfY291bnQpOworCX0KKwlyZXR1cm4gcnY7Cit9CisKKyNpZmRlZiBDT05GSUdfSVBNSV9QQU5JQ19FVkVOVAorCitzdGF0aWMgdm9pZCBkdW1teV9zbWlfZG9uZV9oYW5kbGVyKHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKK30KKworc3RhdGljIHZvaWQgZHVtbXlfcmVjdl9kb25lX2hhbmRsZXIoc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZykKK3sKK30KKworI2lmZGVmIENPTkZJR19JUE1JX1BBTklDX1NUUklORworc3RhdGljIHZvaWQgZXZlbnRfcmVjZWl2ZXJfZmV0Y2hlcihpcG1pX3NtaV90IGludGYsIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKKwlpZiAoKG1zZy0+cnNwWzBdID09IChJUE1JX05FVEZOX1NFTlNPUl9FVkVOVF9SRVNQT05TRSA8PCAyKSkKKwkgICAgJiYgKG1zZy0+cnNwWzFdID09IElQTUlfR0VUX0VWRU5UX1JFQ0VJVkVSX0NNRCkKKwkgICAgJiYgKG1zZy0+cnNwWzJdID09IElQTUlfQ0NfTk9fRVJST1IpKQorCXsKKwkJLyogQSBnZXQgZXZlbnQgcmVjZWl2ZXIgY29tbWFuZCwgc2F2ZSBpdC4gKi8KKwkJaW50Zi0+ZXZlbnRfcmVjZWl2ZXIgPSBtc2ctPnJzcFszXTsKKwkJaW50Zi0+ZXZlbnRfcmVjZWl2ZXJfbHVuID0gbXNnLT5yc3BbNF0gJiAweDM7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZXZpY2VfaWRfZmV0Y2hlcihpcG1pX3NtaV90IGludGYsIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKKwlpZiAoKG1zZy0+cnNwWzBdID09IChJUE1JX05FVEZOX0FQUF9SRVNQT05TRSA8PCAyKSkKKwkgICAgJiYgKG1zZy0+cnNwWzFdID09IElQTUlfR0VUX0RFVklDRV9JRF9DTUQpCisJICAgICYmIChtc2ctPnJzcFsyXSA9PSBJUE1JX0NDX05PX0VSUk9SKSkKKwl7CisJCS8qIEEgZ2V0IGRldmljZSBpZCBjb21tYW5kLCBzYXZlIGlmIHdlIGFyZSBhbiBldmVudAorCQkgICByZWNlaXZlciBvciBnZW5lcmF0b3IuICovCisJCWludGYtPmxvY2FsX3NlbF9kZXZpY2UgPSAobXNnLT5yc3BbOF0gPj4gMikgJiAxOworCQlpbnRmLT5sb2NhbF9ldmVudF9nZW5lcmF0b3IgPSAobXNnLT5yc3BbOF0gPj4gNSkgJiAxOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzZW5kX3BhbmljX2V2ZW50cyhjaGFyICpzdHIpCit7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgICAgICAgICAgIG1zZzsKKwlpcG1pX3NtaV90ICAgICAgICAgICAgICAgICAgICAgICAgaW50ZjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgZGF0YVsxNl07CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyICpzaTsKKwlzdHJ1Y3QgaXBtaV9hZGRyICAgICAgICAgICAgICAgICAgYWRkcjsKKwlzdHJ1Y3QgaXBtaV9zbWlfbXNnICAgICAgICAgICAgICAgc21pX21zZzsKKwlzdHJ1Y3QgaXBtaV9yZWN2X21zZyAgICAgICAgICAgICAgcmVjdl9tc2c7CisKKwlzaSA9IChzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgKikgJmFkZHI7CisJc2ktPmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisJc2ktPmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworCXNpLT5sdW4gPSAwOworCisJLyogRmlsbCBpbiBhbiBldmVudCB0ZWxsaW5nIHRoYXQgd2UgaGF2ZSBmYWlsZWQuICovCisJbXNnLm5ldGZuID0gMHgwNDsgLyogU2Vuc29yIG9yIEV2ZW50LiAqLworCW1zZy5jbWQgPSAyOyAvKiBQbGF0Zm9ybSBldmVudCBjb21tYW5kLiAqLworCW1zZy5kYXRhID0gZGF0YTsKKwltc2cuZGF0YV9sZW4gPSA4OworCWRhdGFbMF0gPSAweDIxOyAvKiBLZXJuZWwgZ2VuZXJhdG9yIElELCBJUE1JIHRhYmxlIDUtNCAqLworCWRhdGFbMV0gPSAweDAzOyAvKiBUaGlzIGlzIGZvciBJUE1JIDEuMC4gKi8KKwlkYXRhWzJdID0gMHgyMDsgLyogT1MgQ3JpdGljYWwgU3RvcCwgSVBNSSB0YWJsZSAzNi0zICovCisJZGF0YVs0XSA9IDB4NmY7IC8qIFNlbnNvciBzcGVjaWZpYywgSVBNSSB0YWJsZSAzNi0xICovCisJZGF0YVs1XSA9IDB4YTE7IC8qIFJ1bnRpbWUgc3RvcCBPRU0gYnl0ZXMgMiAmIDMuICovCisKKwkvKiBQdXQgYSBmZXcgYnJlYWRjcnVtYnMgaW4uICBIb3BlZnVsbHkgbGF0ZXIgd2UgY2FuIGFkZCBtb3JlIHRoaW5ncworCSAgIHRvIG1ha2UgdGhlIHBhbmljIGV2ZW50cyBtb3JlIHVzZWZ1bC4gKi8KKwlpZiAoc3RyKSB7CisJCWRhdGFbM10gPSBzdHJbMF07CisJCWRhdGFbNl0gPSBzdHJbMV07CisJCWRhdGFbN10gPSBzdHJbMl07CisJfQorCisJc21pX21zZy5kb25lID0gZHVtbXlfc21pX2RvbmVfaGFuZGxlcjsKKwlyZWN2X21zZy5kb25lID0gZHVtbXlfcmVjdl9kb25lX2hhbmRsZXI7CisKKwkvKiBGb3IgZXZlcnkgcmVnaXN0ZXJlZCBpbnRlcmZhY2UsIHNlbmQgdGhlIGV2ZW50LiAqLworCWZvciAoaT0wOyBpPE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCQlpbnRmID0gaXBtaV9pbnRlcmZhY2VzW2ldOworCQlpZiAoaW50ZiA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJLyogU2VuZCB0aGUgZXZlbnQgYW5ub3VuY2luZyB0aGUgcGFuaWMuICovCisJCWludGYtPmhhbmRsZXJzLT5zZXRfcnVuX3RvX2NvbXBsZXRpb24oaW50Zi0+c2VuZF9pbmZvLCAxKTsKKwkJaV9pcG1pX3JlcXVlc3QoTlVMTCwKKwkJCSAgICAgICBpbnRmLAorCQkJICAgICAgICZhZGRyLAorCQkJICAgICAgIDAsCisJCQkgICAgICAgJm1zZywKKwkJCSAgICAgICBOVUxMLAorCQkJICAgICAgICZzbWlfbXNnLAorCQkJICAgICAgICZyZWN2X21zZywKKwkJCSAgICAgICAwLAorCQkJICAgICAgIGludGYtPm15X2FkZHJlc3MsCisJCQkgICAgICAgaW50Zi0+bXlfbHVuLAorCQkJICAgICAgIDAsIDEpOyAvKiBEb24ndCByZXRyeSwgYW5kIGRvbid0IHdhaXQuICovCisJfQorCisjaWZkZWYgQ09ORklHX0lQTUlfUEFOSUNfU1RSSU5HCisJLyogT24gZXZlcnkgaW50ZXJmYWNlLCBkdW1wIGEgYnVuY2ggb2YgT0VNIGV2ZW50IGhvbGRpbmcgdGhlCisJICAgc3RyaW5nLiAqLworCWlmICghc3RyKSAKKwkJcmV0dXJuOworCisJZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJCWNoYXIgICAgICAgICAgICAgICAgICAqcCA9IHN0cjsKKwkJc3RydWN0IGlwbWlfaXBtYl9hZGRyICppcG1iOworCQlpbnQgICAgICAgICAgICAgICAgICAgajsKKworCQlpbnRmID0gaXBtaV9pbnRlcmZhY2VzW2ldOworCQlpZiAoaW50ZiA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJLyogRmlyc3Qgam9iIGhlcmUgaXMgdG8gZmlndXJlIG91dCB3aGVyZSB0byBzZW5kIHRoZQorCQkgICBPRU0gZXZlbnRzLiAgVGhlcmUncyBubyB3YXkgaW4gSVBNSSB0byBzZW5kIE9FTQorCQkgICBldmVudHMgdXNpbmcgYW4gZXZlbnQgc2VuZCBjb21tYW5kLCBzbyB3ZSBoYXZlIHRvCisJCSAgIGZpbmQgdGhlIFNFTCB0byBwdXQgdGhlbSBpbiBhbmQgc3RpY2sgdGhlbSBpbgorCQkgICB0aGVyZS4gKi8KKworCQkvKiBHZXQgY2FwYWJpbGl0aWVzIGZyb20gdGhlIGdldCBkZXZpY2UgaWQuICovCisJCWludGYtPmxvY2FsX3NlbF9kZXZpY2UgPSAwOworCQlpbnRmLT5sb2NhbF9ldmVudF9nZW5lcmF0b3IgPSAwOworCQlpbnRmLT5ldmVudF9yZWNlaXZlciA9IDA7CisKKwkJLyogUmVxdWVzdCB0aGUgZGV2aWNlIGluZm8gZnJvbSB0aGUgbG9jYWwgTUMuICovCisJCW1zZy5uZXRmbiA9IElQTUlfTkVURk5fQVBQX1JFUVVFU1Q7CisJCW1zZy5jbWQgPSBJUE1JX0dFVF9ERVZJQ0VfSURfQ01EOworCQltc2cuZGF0YSA9IE5VTEw7CisJCW1zZy5kYXRhX2xlbiA9IDA7CisJCWludGYtPm51bGxfdXNlcl9oYW5kbGVyID0gZGV2aWNlX2lkX2ZldGNoZXI7CisJCWlfaXBtaV9yZXF1ZXN0KE5VTEwsCisJCQkgICAgICAgaW50ZiwKKwkJCSAgICAgICAmYWRkciwKKwkJCSAgICAgICAwLAorCQkJICAgICAgICZtc2csCisJCQkgICAgICAgTlVMTCwKKwkJCSAgICAgICAmc21pX21zZywKKwkJCSAgICAgICAmcmVjdl9tc2csCisJCQkgICAgICAgMCwKKwkJCSAgICAgICBpbnRmLT5teV9hZGRyZXNzLAorCQkJICAgICAgIGludGYtPm15X2x1biwKKwkJCSAgICAgICAwLCAxKTsgLyogRG9uJ3QgcmV0cnksIGFuZCBkb24ndCB3YWl0LiAqLworCisJCWlmIChpbnRmLT5sb2NhbF9ldmVudF9nZW5lcmF0b3IpIHsKKwkJCS8qIFJlcXVlc3QgdGhlIGV2ZW50IHJlY2VpdmVyIGZyb20gdGhlIGxvY2FsIE1DLiAqLworCQkJbXNnLm5ldGZuID0gSVBNSV9ORVRGTl9TRU5TT1JfRVZFTlRfUkVRVUVTVDsKKwkJCW1zZy5jbWQgPSBJUE1JX0dFVF9FVkVOVF9SRUNFSVZFUl9DTUQ7CisJCQltc2cuZGF0YSA9IE5VTEw7CisJCQltc2cuZGF0YV9sZW4gPSAwOworCQkJaW50Zi0+bnVsbF91c2VyX2hhbmRsZXIgPSBldmVudF9yZWNlaXZlcl9mZXRjaGVyOworCQkJaV9pcG1pX3JlcXVlc3QoTlVMTCwKKwkJCQkgICAgICAgaW50ZiwKKwkJCQkgICAgICAgJmFkZHIsCisJCQkJICAgICAgIDAsCisJCQkJICAgICAgICZtc2csCisJCQkJICAgICAgIE5VTEwsCisJCQkJICAgICAgICZzbWlfbXNnLAorCQkJCSAgICAgICAmcmVjdl9tc2csCisJCQkJICAgICAgIDAsCisJCQkJICAgICAgIGludGYtPm15X2FkZHJlc3MsCisJCQkJICAgICAgIGludGYtPm15X2x1biwKKwkJCQkgICAgICAgMCwgMSk7IC8qIG5vIHJldHJ5LCBhbmQgbm8gd2FpdC4gKi8KKwkJfQorCQlpbnRmLT5udWxsX3VzZXJfaGFuZGxlciA9IE5VTEw7CisKKwkJLyogVmFsaWRhdGUgdGhlIGV2ZW50IHJlY2VpdmVyLiAgVGhlIGxvdyBiaXQgbXVzdCBub3QKKwkJICAgYmUgMSAoaXQgbXVzdCBiZSBhIHZhbGlkIElQTUIgYWRkcmVzcyksIGl0IGNhbm5vdAorCQkgICBiZSB6ZXJvLCBhbmQgaXQgbXVzdCBub3QgYmUgbXkgYWRkcmVzcy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoKChpbnRmLT5ldmVudF9yZWNlaXZlciAmIDEpID09IDApCisJCSAgICAmJiAoaW50Zi0+ZXZlbnRfcmVjZWl2ZXIgIT0gMCkKKwkJICAgICYmIChpbnRmLT5ldmVudF9yZWNlaXZlciAhPSBpbnRmLT5teV9hZGRyZXNzKSkKKwkJeworCQkJLyogVGhlIGV2ZW50IHJlY2VpdmVyIGlzIHZhbGlkLCBzZW5kIGFuIElQTUIKKwkJCSAgIG1lc3NhZ2UuICovCisJCQlpcG1iID0gKHN0cnVjdCBpcG1pX2lwbWJfYWRkciAqKSAmYWRkcjsKKwkJCWlwbWItPmFkZHJfdHlwZSA9IElQTUlfSVBNQl9BRERSX1RZUEU7CisJCQlpcG1iLT5jaGFubmVsID0gMDsgLyogRklYTUUgLSBpcyB0aGlzIHJpZ2h0PyAqLworCQkJaXBtYi0+bHVuID0gaW50Zi0+ZXZlbnRfcmVjZWl2ZXJfbHVuOworCQkJaXBtYi0+c2xhdmVfYWRkciA9IGludGYtPmV2ZW50X3JlY2VpdmVyOworCQl9IGVsc2UgaWYgKGludGYtPmxvY2FsX3NlbF9kZXZpY2UpIHsKKwkJCS8qIFRoZSBldmVudCByZWNlaXZlciB3YXMgbm90IHZhbGlkIChvciB3YXMKKwkJCSAgIG1lKSwgYnV0IEkgYW0gYW4gU0VMIGRldmljZSwganVzdCBkdW1wIGl0CisJCQkgICBpbiBteSBTRUwuICovCisJCQlzaSA9IChzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgKikgJmFkZHI7CisJCQlzaS0+YWRkcl90eXBlID0gSVBNSV9TWVNURU1fSU5URVJGQUNFX0FERFJfVFlQRTsKKwkJCXNpLT5jaGFubmVsID0gSVBNSV9CTUNfQ0hBTk5FTDsKKwkJCXNpLT5sdW4gPSAwOworCQl9IGVsc2UKKwkJCWNvbnRpbnVlOyAvKiBObyB3aGVyZSB0byBzZW5kIHRoZSBldmVudC4gKi8KKworCQkKKwkJbXNnLm5ldGZuID0gSVBNSV9ORVRGTl9TVE9SQUdFX1JFUVVFU1Q7IC8qIFN0b3JhZ2UuICovCisJCW1zZy5jbWQgPSBJUE1JX0FERF9TRUxfRU5UUllfQ01EOworCQltc2cuZGF0YSA9IGRhdGE7CisJCW1zZy5kYXRhX2xlbiA9IDE2OworCisJCWogPSAwOworCQl3aGlsZSAoKnApIHsKKwkJCWludCBzaXplID0gc3RybGVuKHApOworCisJCQlpZiAoc2l6ZSA+IDExKQorCQkJCXNpemUgPSAxMTsKKwkJCWRhdGFbMF0gPSAwOworCQkJZGF0YVsxXSA9IDA7CisJCQlkYXRhWzJdID0gMHhmMDsgLyogT0VNIGV2ZW50IHdpdGhvdXQgdGltZXN0YW1wLiAqLworCQkJZGF0YVszXSA9IGludGYtPm15X2FkZHJlc3M7CisJCQlkYXRhWzRdID0gaisrOyAvKiBzZXF1ZW5jZSAjICovCisJCQkvKiBBbHdheXMgZ2l2ZSAxMSBieXRlcywgc28gc3RybmNweSB3aWxsIGZpbGwKKwkJCSAgIGl0IHdpdGggemVyb2VzIGZvciBtZS4gKi8KKwkJCXN0cm5jcHkoZGF0YSs1LCBwLCAxMSk7CisJCQlwICs9IHNpemU7CisKKwkJCWlfaXBtaV9yZXF1ZXN0KE5VTEwsCisJCQkJICAgICAgIGludGYsCisJCQkJICAgICAgICZhZGRyLAorCQkJCSAgICAgICAwLAorCQkJCSAgICAgICAmbXNnLAorCQkJCSAgICAgICBOVUxMLAorCQkJCSAgICAgICAmc21pX21zZywKKwkJCQkgICAgICAgJnJlY3ZfbXNnLAorCQkJCSAgICAgICAwLAorCQkJCSAgICAgICBpbnRmLT5teV9hZGRyZXNzLAorCQkJCSAgICAgICBpbnRmLT5teV9sdW4sCisJCQkJICAgICAgIDAsIDEpOyAvKiBubyByZXRyeSwgYW5kIG5vIHdhaXQuICovCisJCX0KKwl9CQorI2VuZGlmIC8qIENPTkZJR19JUE1JX1BBTklDX1NUUklORyAqLworfQorI2VuZGlmIC8qIENPTkZJR19JUE1JX1BBTklDX0VWRU5UICovCisKK3N0YXRpYyBpbnQgaGFzX3BhbmljZWQgPSAwOworCitzdGF0aWMgaW50IHBhbmljX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICpwdHIpCit7CisJaW50ICAgICAgICBpOworCWlwbWlfc21pX3QgaW50ZjsKKworCWlmIChoYXNfcGFuaWNlZCkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCWhhc19wYW5pY2VkID0gMTsKKworCS8qIEZvciBldmVyeSByZWdpc3RlcmVkIGludGVyZmFjZSwgc2V0IGl0IHRvIHJ1biB0byBjb21wbGV0aW9uLiAqLworCWZvciAoaT0wOyBpPE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCQlpbnRmID0gaXBtaV9pbnRlcmZhY2VzW2ldOworCQlpZiAoaW50ZiA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaW50Zi0+aGFuZGxlcnMtPnNldF9ydW5fdG9fY29tcGxldGlvbihpbnRmLT5zZW5kX2luZm8sIDEpOworCX0KKworI2lmZGVmIENPTkZJR19JUE1JX1BBTklDX0VWRU5UCisJc2VuZF9wYW5pY19ldmVudHMocHRyKTsKKyNlbmRpZgorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBhbmljX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsCT0gcGFuaWNfZXZlbnQsCisJLm5leHQJCT0gTlVMTCwKKwkucHJpb3JpdHkJPSAyMDAJLyogcHJpb3JpdHk6IElOVF9NQVggPj0geCA+PSAwICovCit9OworCitzdGF0aWMgaW50IGlwbWlfaW5pdF9tc2doYW5kbGVyKHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoaW5pdGlhbGl6ZWQpCisJCXJldHVybiAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiaXBtaSBtZXNzYWdlIGhhbmRsZXIgdmVyc2lvbiAiCisJICAgICAgIElQTUlfTVNHSEFORExFUl9WRVJTSU9OICJcbiIpOworCisJZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJCWlwbWlfaW50ZXJmYWNlc1tpXSA9IE5VTEw7CisJfQorCisJcHJvY19pcG1pX3Jvb3QgPSBwcm9jX21rZGlyKCJpcG1pIiwgTlVMTCk7CisJaWYgKCFwcm9jX2lwbWlfcm9vdCkgeworCSAgICBwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gY3JlYXRlIElQTUkgcHJvYyBkaXIiKTsKKwkgICAgcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJvY19pcG1pX3Jvb3QtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlpbml0X3RpbWVyKCZpcG1pX3RpbWVyKTsKKwlpcG1pX3RpbWVyLmRhdGEgPSAwOworCWlwbWlfdGltZXIuZnVuY3Rpb24gPSBpcG1pX3RpbWVvdXQ7CisJaXBtaV90aW1lci5leHBpcmVzID0gamlmZmllcyArIElQTUlfVElNRU9VVF9KSUZGSUVTOworCWFkZF90aW1lcigmaXBtaV90aW1lcik7CisKKwlub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJnBhbmljX2Jsb2NrKTsKKworCWluaXRpYWxpemVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbml0IGludCBpcG1pX2luaXRfbXNnaGFuZGxlcl9tb2Qodm9pZCkKK3sKKwlpcG1pX2luaXRfbXNnaGFuZGxlcigpOworCXJldHVybiAwOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgY2xlYW51cF9pcG1pKHZvaWQpCit7CisJaW50IGNvdW50OworCisJaWYgKCFpbml0aWFsaXplZCkKKwkJcmV0dXJuOworCisJbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJnBhbmljX2Jsb2NrKTsKKworCS8qIFRoaXMgY2FuJ3QgYmUgY2FsbGVkIGlmIGFueSBpbnRlcmZhY2VzIGV4aXN0LCBzbyBubyB3b3JyeSBhYm91dAorCSAgIHNodXR0aW5nIGRvd24gdGhlIGludGVyZmFjZXMuICovCisKKwkvKiBUZWxsIHRoZSB0aW1lciB0byBzdG9wLCB0aGVuIHdhaXQgZm9yIGl0IHRvIHN0b3AuICBUaGlzIGF2b2lkcworCSAgIHByb2JsZW1zIHdpdGggcmFjZSBjb25kaXRpb25zIHJlbW92aW5nIHRoZSB0aW1lciBoZXJlLiAqLworCXN0b3Bfb3BlcmF0aW9uID0gMTsKKwl3aGlsZSAoIXRpbWVyX3N0b3BwZWQpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfaXBtaV9yb290LT5uYW1lLCAmcHJvY19yb290KTsKKworCWluaXRpYWxpemVkID0gMDsKKworCS8qIENoZWNrIGZvciBidWZmZXIgbGVha3MuICovCisJY291bnQgPSBhdG9taWNfcmVhZCgmc21pX21zZ19pbnVzZV9jb3VudCk7CisJaWYgKGNvdW50ICE9IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJTTUkgbWVzc2FnZSBjb3VudCAlZCBhdCBleGl0XG4iLAorCQkgICAgICAgY291bnQpOworCWNvdW50ID0gYXRvbWljX3JlYWQoJnJlY3ZfbXNnX2ludXNlX2NvdW50KTsKKwlpZiAoY291bnQgIT0gMCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggInJlY3YgbWVzc2FnZSBjb3VudCAlZCBhdCBleGl0XG4iLAorCQkgICAgICAgY291bnQpOworfQorbW9kdWxlX2V4aXQoY2xlYW51cF9pcG1pKTsKKworbW9kdWxlX2luaXQoaXBtaV9pbml0X21zZ2hhbmRsZXJfbW9kKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChpcG1pX2NyZWF0ZV91c2VyKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9kZXN0cm95X3VzZXIpOworRVhQT1JUX1NZTUJPTChpcG1pX2dldF92ZXJzaW9uKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9yZXF1ZXN0X3NldHRpbWUpOworRVhQT1JUX1NZTUJPTChpcG1pX3JlcXVlc3Rfc3VwcGx5X21zZ3MpOworRVhQT1JUX1NZTUJPTChpcG1pX3JlZ2lzdGVyX3NtaSk7CitFWFBPUlRfU1lNQk9MKGlwbWlfdW5yZWdpc3Rlcl9zbWkpOworRVhQT1JUX1NZTUJPTChpcG1pX3JlZ2lzdGVyX2Zvcl9jbWQpOworRVhQT1JUX1NZTUJPTChpcG1pX3VucmVnaXN0ZXJfZm9yX2NtZCk7CitFWFBPUlRfU1lNQk9MKGlwbWlfc21pX21zZ19yZWNlaXZlZCk7CitFWFBPUlRfU1lNQk9MKGlwbWlfc21pX3dhdGNoZG9nX3ByZXRpbWVvdXQpOworRVhQT1JUX1NZTUJPTChpcG1pX2FsbG9jX3NtaV9tc2cpOworRVhQT1JUX1NZTUJPTChpcG1pX2FkZHJfbGVuZ3RoKTsKK0VYUE9SVF9TWU1CT0woaXBtaV92YWxpZGF0ZV9hZGRyKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9zZXRfZ2V0c19ldmVudHMpOworRVhQT1JUX1NZTUJPTChpcG1pX3NtaV93YXRjaGVyX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9zbWlfd2F0Y2hlcl91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9zZXRfbXlfYWRkcmVzcyk7CitFWFBPUlRfU1lNQk9MKGlwbWlfZ2V0X215X2FkZHJlc3MpOworRVhQT1JUX1NZTUJPTChpcG1pX3NldF9teV9MVU4pOworRVhQT1JUX1NZTUJPTChpcG1pX2dldF9teV9MVU4pOworRVhQT1JUX1NZTUJPTChpcG1pX3NtaV9hZGRfcHJvY19lbnRyeSk7CitFWFBPUlRfU1lNQk9MKGlwbWlfdXNlcl9zZXRfcnVuX3RvX2NvbXBsZXRpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNWNkYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMKQEAgLTAsMCArMSw1NDkgQEAKKy8qCisgKiBpcG1pX3Bvd2Vyb2ZmLmMKKyAqCisgKiBNb250YVZpc3RhIElQTUkgUG93ZXJvZmYgZXh0ZW5zaW9uIHRvIHN5c19yZWJvb3QKKyAqCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgU3RldmVuIERha2UgPHNkYWtlQG12aXN0YS5jb20+CisgKiAgICAgICAgIENvcmV5IE1pbnlhcmQgPGNtaW55YXJkQG12aXN0YS5jb20+CisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICogIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAqICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiAgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pcG1pLmg+CisjaW5jbHVkZSA8bGludXgvaXBtaV9zbWkuaD4KKworI2RlZmluZSBQRlggIklQTUkgcG93ZXJvZmY6ICIKKyNkZWZpbmUgSVBNSV9QT1dFUk9GRl9WRVJTSU9OCSJ2MzMiCisKKy8qIFdoZXJlIHRvIHdlIGluc2VydCBvdXIgcG93ZXJvZmYgZnVuY3Rpb24/ICovCitleHRlcm4gdm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCk7CisKKy8qIFN0dWZmIGZyb20gdGhlIGdldCBkZXZpY2UgaWQgY29tbWFuZC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWZnX2lkOworc3RhdGljIHVuc2lnbmVkIGludCBwcm9kX2lkOworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2FwYWJpbGl0aWVzOworCisvKiBXZSB1c2Ugb3VyIG93biBtZXNzYWdlcyBmb3IgdGhpcyBvcGVyYXRpb24sIHdlIGRvbid0IGxldCB0aGUgc3lzdGVtCisgICBhbGxvY2F0ZSB0aGVtLCBzaW5jZSB3ZSBtYXkgYmUgaW4gYSBwYW5pYyBzaXR1YXRpb24uICBUaGUgd2hvbGUKKyAgIHRoaW5nIGlzIHNpbmdsZS10aHJlYWRlZCwgYW55d2F5LCBzbyBtdWx0aXBsZSBtZXNzYWdlcyBhcmUgbm90CisgICByZXF1aXJlZC4gKi8KK3N0YXRpYyB2b2lkIGR1bW15X3NtaV9mcmVlKHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKK30KK3N0YXRpYyB2b2lkIGR1bW15X3JlY3ZfZnJlZShzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnKQoreworfQorc3RhdGljIHN0cnVjdCBpcG1pX3NtaV9tc2cgaGFsdF9zbWlfbXNnID0KK3sKKwkuZG9uZSA9IGR1bW15X3NtaV9mcmVlCit9Oworc3RhdGljIHN0cnVjdCBpcG1pX3JlY3ZfbXNnIGhhbHRfcmVjdl9tc2cgPQoreworCS5kb25lID0gZHVtbXlfcmVjdl9mcmVlCit9OworCisKKy8qCisgKiBDb2RlIHRvIHNlbmQgYSBtZXNzYWdlIGFuZCB3YWl0IGZvciB0aGUgcmVwb25zZS4KKyAqLworCitzdGF0aWMgdm9pZCByZWNlaXZlX2hhbmRsZXIoc3RydWN0IGlwbWlfcmVjdl9tc2cgKnJlY3ZfbXNnLCB2b2lkICpoYW5kbGVyX2RhdGEpCit7CisJc3RydWN0IHNlbWFwaG9yZSAqc2VtID0gcmVjdl9tc2ctPnVzZXJfbXNnX2RhdGE7CisKKwlpZiAoc2VtKQorCQl1cChzZW0pOworfQorCitzdGF0aWMgc3RydWN0IGlwbWlfdXNlcl9obmRsIGlwbWlfcG93ZXJvZmZfaGFuZGxlciA9Cit7CisJLmlwbWlfcmVjdl9obmRsID0gcmVjZWl2ZV9oYW5kbGVyCit9OworCisKK3N0YXRpYyBpbnQgaXBtaV9yZXF1ZXN0X3dhaXRfZm9yX3Jlc3BvbnNlKGlwbWlfdXNlcl90ICAgICAgICAgICAgdXNlciwKKwkJCQkJICBzdHJ1Y3QgaXBtaV9hZGRyICAgICAgICphZGRyLAorCQkJCQkgIHN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgKnNlbmRfbXNnKQoreworCWludCAgICAgICAgICAgICAgcnY7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07CisKKwlzZW1hX2luaXQgKCZzZW0sIDApOworCisJcnYgPSBpcG1pX3JlcXVlc3Rfc3VwcGx5X21zZ3ModXNlciwgYWRkciwgMCwgc2VuZF9tc2csICZzZW0sCisJCQkJICAgICAgJmhhbHRfc21pX21zZywgJmhhbHRfcmVjdl9tc2csIDApOworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCisJZG93biAoJnNlbSk7CisKKwlyZXR1cm4gaGFsdF9yZWN2X21zZy5tc2cuZGF0YVswXTsKK30KKworLyogV2UgYXJlIGluIHJ1bi10by1jb21wbGV0aW9uIG1vZGUsIG5vIHNlbWFwaG9yZSBpcyBkZXNpcmVkLiAqLworc3RhdGljIGludCBpcG1pX3JlcXVlc3RfaW5fcmNfbW9kZShpcG1pX3VzZXJfdCAgICAgICAgICAgIHVzZXIsCisJCQkJICAgc3RydWN0IGlwbWlfYWRkciAgICAgICAqYWRkciwKKwkJCQkgICBzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICpzZW5kX21zZykKK3sKKwlpbnQgICAgICAgICAgICAgIHJ2OworCisJcnYgPSBpcG1pX3JlcXVlc3Rfc3VwcGx5X21zZ3ModXNlciwgYWRkciwgMCwgc2VuZF9tc2csIE5VTEwsCisJCQkJICAgICAgJmhhbHRfc21pX21zZywgJmhhbHRfcmVjdl9tc2csIDApOworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCisJcmV0dXJuIGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMF07Cit9CisKKy8qCisgKiBBVENBIFN1cHBvcnQKKyAqLworCisjZGVmaW5lIElQTUlfTkVURk5fQVRDQQkJCTB4MmMKKyNkZWZpbmUgSVBNSV9BVENBX1NFVF9QT1dFUl9DTUQJCTB4MTEKKyNkZWZpbmUgSVBNSV9BVENBX0dFVF9BRERSX0lORk9fQ01ECTB4MDEKKyNkZWZpbmUgSVBNSV9QSUNNR19JRAkJCTAKKworc3RhdGljIGludCBpcG1pX2F0Y2FfZGV0ZWN0IChpcG1pX3VzZXJfdCB1c2VyKQoreworCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciBzbWlfYWRkcjsKKwlzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICAgICAgICAgICAgc2VuZF9tc2c7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2OworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdOworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbmZpZ3VyZSBJUE1JIGFkZHJlc3MgZm9yIGxvY2FsIGFjY2VzcworICAgICAgICAgKi8KKyAgICAgICAgc21pX2FkZHIuYWRkcl90eXBlID0gSVBNSV9TWVNURU1fSU5URVJGQUNFX0FERFJfVFlQRTsKKyAgICAgICAgc21pX2FkZHIuY2hhbm5lbCA9IElQTUlfQk1DX0NIQU5ORUw7CisgICAgICAgIHNtaV9hZGRyLmx1biA9IDA7CisKKwkvKgorCSAqIFVzZSBnZXQgYWRkcmVzcyBpbmZvIHRvIGNoZWNrIGFuZCBzZWUgaWYgd2UgYXJlIEFUQ0EKKwkgKi8KKwlzZW5kX21zZy5uZXRmbiA9IElQTUlfTkVURk5fQVRDQTsKKwlzZW5kX21zZy5jbWQgPSBJUE1JX0FUQ0FfR0VUX0FERFJfSU5GT19DTUQ7CisJZGF0YVswXSA9IElQTUlfUElDTUdfSUQ7CisJc2VuZF9tc2cuZGF0YSA9IGRhdGE7CisJc2VuZF9tc2cuZGF0YV9sZW4gPSBzaXplb2YoZGF0YSk7CisJcnYgPSBpcG1pX3JlcXVlc3Rfd2FpdF9mb3JfcmVzcG9uc2UodXNlciwKKwkJCQkJICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzbWlfYWRkciwKKwkJCQkJICAgICZzZW5kX21zZyk7CisJcmV0dXJuICFydjsKK30KKworc3RhdGljIHZvaWQgaXBtaV9wb3dlcm9mZl9hdGNhIChpcG1pX3VzZXJfdCB1c2VyKQoreworCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciBzbWlfYWRkcjsKKwlzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICAgICAgICAgICAgc2VuZF9tc2c7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2OworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgICBkYXRhWzRdOworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbmZpZ3VyZSBJUE1JIGFkZHJlc3MgZm9yIGxvY2FsIGFjY2VzcworICAgICAgICAgKi8KKyAgICAgICAgc21pX2FkZHIuYWRkcl90eXBlID0gSVBNSV9TWVNURU1fSU5URVJGQUNFX0FERFJfVFlQRTsKKyAgICAgICAgc21pX2FkZHIuY2hhbm5lbCA9IElQTUlfQk1DX0NIQU5ORUw7CisgICAgICAgIHNtaV9hZGRyLmx1biA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiUG93ZXJpbmcgZG93biB2aWEgQVRDQSBwb3dlciBjb21tYW5kXG4iKTsKKworCS8qCisJICogUG93ZXIgZG93bgorCSAqLworCXNlbmRfbXNnLm5ldGZuID0gSVBNSV9ORVRGTl9BVENBOworCXNlbmRfbXNnLmNtZCA9IElQTUlfQVRDQV9TRVRfUE9XRVJfQ01EOworCWRhdGFbMF0gPSBJUE1JX1BJQ01HX0lEOworCWRhdGFbMV0gPSAwOyAvKiBGUlUgaWQgKi8KKwlkYXRhWzJdID0gMDsgLyogUG93ZXIgTGV2ZWwgKi8KKwlkYXRhWzNdID0gMDsgLyogRG9uJ3QgY2hhbmdlIHNhdmVkIHByZXNldHMgKi8KKwlzZW5kX21zZy5kYXRhID0gZGF0YTsKKwlzZW5kX21zZy5kYXRhX2xlbiA9IHNpemVvZiAoZGF0YSk7CisJcnYgPSBpcG1pX3JlcXVlc3RfaW5fcmNfbW9kZSh1c2VyLAorCQkJCSAgICAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJnNtaV9hZGRyLAorCQkJCSAgICAgJnNlbmRfbXNnKTsKKwlpZiAocnYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHNlbmQgQVRDQSBwb3dlcmRvd24gbWVzc2FnZSwiCisJCSAgICAgICAiIElQTUkgZXJyb3IgMHgleFxuIiwgcnYpOworCQlnb3RvIG91dDsKKwl9CisKKyBvdXQ6CisJcmV0dXJuOworfQorCisvKgorICogQ1BJMSBTdXBwb3J0CisgKi8KKworI2RlZmluZSBJUE1JX05FVEZOX09FTV8xCQkJCTB4ZjgKKyNkZWZpbmUgT0VNX0dSUF9DTURfU0VUX1JFU0VUX1NUQVRFCQkweDg0CisjZGVmaW5lIE9FTV9HUlBfQ01EX1NFVF9QT1dFUl9TVEFURQkJMHg4MgorI2RlZmluZSBJUE1JX05FVEZOX09FTV84CQkJCTB4ZjgKKyNkZWZpbmUgT0VNX0dSUF9DTURfUkVRVUVTVF9IT1RTV0FQX0NUUkwJMHg4MAorI2RlZmluZSBPRU1fR1JQX0NNRF9HRVRfU0xPVF9HQQkJCTB4YTMKKyNkZWZpbmUgSVBNSV9ORVRGTl9TRU5TT1JfRVZUCQkJMHgxMAorI2RlZmluZSBJUE1JX0NNRF9HRVRfRVZFTlRfUkVDRUlWRVIJCTB4MDEKKworI2RlZmluZSBJUE1JX0NQSTFfUFJPRFVDVF9JRAkJMHgwMDAxNTcKKyNkZWZpbmUgSVBNSV9DUEkxX01BTlVGQUNUVVJFUl9JRAkweDAxMDgKKworc3RhdGljIGludCBpcG1pX2NwaTFfZGV0ZWN0IChpcG1pX3VzZXJfdCB1c2VyKQoreworCXJldHVybiAoKG1mZ19pZCA9PSBJUE1JX0NQSTFfTUFOVUZBQ1RVUkVSX0lEKQorCQkmJiAocHJvZF9pZCA9PSBJUE1JX0NQSTFfUFJPRFVDVF9JRCkpOworfQorCitzdGF0aWMgdm9pZCBpcG1pX3Bvd2Vyb2ZmX2NwaTEgKGlwbWlfdXNlcl90IHVzZXIpCit7CisJc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyIHNtaV9hZGRyOworCXN0cnVjdCBpcG1pX2lwbWJfYWRkciAgICAgICAgICAgICBpcG1iX2FkZHI7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgICAgICAgICAgIHNlbmRfbXNnOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdDsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgaG90c3dhcF9pcG1iOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgICBhZXJfYWRkcjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgYWVyX2x1bjsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb25maWd1cmUgSVBNSSBhZGRyZXNzIGZvciBsb2NhbCBhY2Nlc3MKKyAgICAgICAgICovCisgICAgICAgIHNtaV9hZGRyLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisgICAgICAgIHNtaV9hZGRyLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworICAgICAgICBzbWlfYWRkci5sdW4gPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlBvd2VyaW5nIGRvd24gdmlhIENQSTEgcG93ZXIgY29tbWFuZFxuIik7CisKKwkvKgorCSAqIEdldCBJUE1JIGlwbWIgYWRkcmVzcworCSAqLworCXNlbmRfbXNnLm5ldGZuID0gSVBNSV9ORVRGTl9PRU1fOCA+PiAyOworCXNlbmRfbXNnLmNtZCA9IE9FTV9HUlBfQ01EX0dFVF9TTE9UX0dBOworCXNlbmRfbXNnLmRhdGEgPSBOVUxMOworCXNlbmRfbXNnLmRhdGFfbGVuID0gMDsKKwlydiA9IGlwbWlfcmVxdWVzdF9pbl9yY19tb2RlKHVzZXIsCisJCQkJICAgICAoc3RydWN0IGlwbWlfYWRkciAqKSAmc21pX2FkZHIsCisJCQkJICAgICAmc2VuZF9tc2cpOworCWlmIChydikKKwkJZ290byBvdXQ7CisJc2xvdCA9IGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMV07CisJaG90c3dhcF9pcG1iID0gKHNsb3QgPiA5KSA/ICgweGIwICsgMiAqIHNsb3QpIDogKDB4YWUgKyAyICogc2xvdCk7CisKKwkvKgorCSAqIEdldCBhY3RpdmUgZXZlbnQgcmVjZWl2ZXIKKwkgKi8KKwlzZW5kX21zZy5uZXRmbiA9IElQTUlfTkVURk5fU0VOU09SX0VWVCA+PiAyOworCXNlbmRfbXNnLmNtZCA9IElQTUlfQ01EX0dFVF9FVkVOVF9SRUNFSVZFUjsKKwlzZW5kX21zZy5kYXRhID0gTlVMTDsKKwlzZW5kX21zZy5kYXRhX2xlbiA9IDA7CisJcnYgPSBpcG1pX3JlcXVlc3RfaW5fcmNfbW9kZSh1c2VyLAorCQkJCSAgICAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJnNtaV9hZGRyLAorCQkJCSAgICAgJnNlbmRfbXNnKTsKKwlpZiAocnYpCisJCWdvdG8gb3V0OworCWFlcl9hZGRyID0gaGFsdF9yZWN2X21zZy5tc2cuZGF0YVsxXTsKKwlhZXJfbHVuID0gaGFsdF9yZWN2X21zZy5tc2cuZGF0YVsyXTsKKworCS8qCisJICogU2V0dXAgSVBNQiBhZGRyZXNzIHRhcmdldCBpbnN0ZWFkIG9mIGxvY2FsIHRhcmdldAorCSAqLworCWlwbWJfYWRkci5hZGRyX3R5cGUgPSBJUE1JX0lQTUJfQUREUl9UWVBFOworCWlwbWJfYWRkci5jaGFubmVsID0gMDsKKwlpcG1iX2FkZHIuc2xhdmVfYWRkciA9IGFlcl9hZGRyOworCWlwbWJfYWRkci5sdW4gPSBhZXJfbHVuOworCisJLyoKKwkgKiBTZW5kIHJlcXVlc3QgaG90c3dhcCBjb250cm9sIHRvIHJlbW92ZSBibGFkZSBmcm9tIGRwdgorCSAqLworCXNlbmRfbXNnLm5ldGZuID0gSVBNSV9ORVRGTl9PRU1fOCA+PiAyOworCXNlbmRfbXNnLmNtZCA9IE9FTV9HUlBfQ01EX1JFUVVFU1RfSE9UU1dBUF9DVFJMOworCXNlbmRfbXNnLmRhdGEgPSAmaG90c3dhcF9pcG1iOworCXNlbmRfbXNnLmRhdGFfbGVuID0gMTsKKwlpcG1pX3JlcXVlc3RfaW5fcmNfbW9kZSh1c2VyLAorCQkJCShzdHJ1Y3QgaXBtaV9hZGRyICopICZpcG1iX2FkZHIsCisJCQkJJnNlbmRfbXNnKTsKKworCS8qCisJICogU2V0IHJlc2V0IGFzc2VydGVkCisJICovCisJc2VuZF9tc2cubmV0Zm4gPSBJUE1JX05FVEZOX09FTV8xID4+IDI7CisJc2VuZF9tc2cuY21kID0gT0VNX0dSUF9DTURfU0VUX1JFU0VUX1NUQVRFOworCXNlbmRfbXNnLmRhdGEgPSBkYXRhOworCWRhdGFbMF0gPSAxOyAvKiBSZXNldCBhc3NlcnRlZCBzdGF0ZSAqLworCXNlbmRfbXNnLmRhdGFfbGVuID0gMTsKKwlydiA9IGlwbWlfcmVxdWVzdF9pbl9yY19tb2RlKHVzZXIsCisJCQkJICAgICAoc3RydWN0IGlwbWlfYWRkciAqKSAmc21pX2FkZHIsCisJCQkJICAgICAmc2VuZF9tc2cpOworCWlmIChydikKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFBvd2VyIGRvd24KKwkgKi8KKwlzZW5kX21zZy5uZXRmbiA9IElQTUlfTkVURk5fT0VNXzEgPj4gMjsKKwlzZW5kX21zZy5jbWQgPSBPRU1fR1JQX0NNRF9TRVRfUE9XRVJfU1RBVEU7CisJc2VuZF9tc2cuZGF0YSA9IGRhdGE7CisJZGF0YVswXSA9IDE7IC8qIFBvd2VyIGRvd24gc3RhdGUgKi8KKwlzZW5kX21zZy5kYXRhX2xlbiA9IDE7CisJcnYgPSBpcG1pX3JlcXVlc3RfaW5fcmNfbW9kZSh1c2VyLAorCQkJCSAgICAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJnNtaV9hZGRyLAorCQkJCSAgICAgJnNlbmRfbXNnKTsKKwlpZiAocnYpCisJCWdvdG8gb3V0OworCisgb3V0OgorCXJldHVybjsKK30KKworLyoKKyAqIFN0YW5kYXJkIGNoYXNzaXMgc3VwcG9ydAorICovCisKKyNkZWZpbmUgSVBNSV9ORVRGTl9DSEFTU0lTX1JFUVVFU1QJMAorI2RlZmluZSBJUE1JX0NIQVNTSVNfQ09OVFJPTF9DTUQJMHgwMgorCitzdGF0aWMgaW50IGlwbWlfY2hhc3Npc19kZXRlY3QgKGlwbWlfdXNlcl90IHVzZXIpCit7CisJLyogQ2hhc3NpcyBzdXBwb3J0LCB1c2UgaXQuICovCisJcmV0dXJuIChjYXBhYmlsaXRpZXMgJiAweDgwKTsKK30KKworc3RhdGljIHZvaWQgaXBtaV9wb3dlcm9mZl9jaGFzc2lzIChpcG1pX3VzZXJfdCB1c2VyKQoreworCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciBzbWlfYWRkcjsKKwlzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICAgICAgICAgICAgc2VuZF9tc2c7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2OworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdOworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbmZpZ3VyZSBJUE1JIGFkZHJlc3MgZm9yIGxvY2FsIGFjY2VzcworICAgICAgICAgKi8KKyAgICAgICAgc21pX2FkZHIuYWRkcl90eXBlID0gSVBNSV9TWVNURU1fSU5URVJGQUNFX0FERFJfVFlQRTsKKyAgICAgICAgc21pX2FkZHIuY2hhbm5lbCA9IElQTUlfQk1DX0NIQU5ORUw7CisgICAgICAgIHNtaV9hZGRyLmx1biA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiUG93ZXJpbmcgZG93biB2aWEgSVBNSSBjaGFzc2lzIGNvbnRyb2wgY29tbWFuZFxuIik7CisKKwkvKgorCSAqIFBvd2VyIGRvd24KKwkgKi8KKwlzZW5kX21zZy5uZXRmbiA9IElQTUlfTkVURk5fQ0hBU1NJU19SRVFVRVNUOworCXNlbmRfbXNnLmNtZCA9IElQTUlfQ0hBU1NJU19DT05UUk9MX0NNRDsKKwlkYXRhWzBdID0gMDsgLyogUG93ZXIgZG93biAqLworCXNlbmRfbXNnLmRhdGEgPSBkYXRhOworCXNlbmRfbXNnLmRhdGFfbGVuID0gc2l6ZW9mKGRhdGEpOworCXJ2ID0gaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUodXNlciwKKwkJCQkgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzbWlfYWRkciwKKwkJCQkgICAgICZzZW5kX21zZyk7CisJaWYgKHJ2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBzZW5kIGNoYXNzaXMgcG93ZXJkb3duIG1lc3NhZ2UsIgorCQkgICAgICAgIiBJUE1JIGVycm9yIDB4JXhcbiIsIHJ2KTsKKwkJZ290byBvdXQ7CisJfQorCisgb3V0OgorCXJldHVybjsKK30KKworCisvKiBUYWJsZSBvZiBwb3NzaWJsZSBwb3dlciBvZmYgZnVuY3Rpb25zLiAqLworc3RydWN0IHBvd2Vyb2ZmX2Z1bmN0aW9uIHsKKwljaGFyICpwbGF0Zm9ybV90eXBlOworCWludCAgKCpkZXRlY3QpKGlwbWlfdXNlcl90IHVzZXIpOworCXZvaWQgKCpwb3dlcm9mZl9mdW5jKShpcG1pX3VzZXJfdCB1c2VyKTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcG93ZXJvZmZfZnVuY3Rpb24gcG93ZXJvZmZfZnVuY3Rpb25zW10gPSB7CisJeyAucGxhdGZvcm1fdHlwZQk9ICJBVENBIiwKKwkgIC5kZXRlY3QJCT0gaXBtaV9hdGNhX2RldGVjdCwKKwkgIC5wb3dlcm9mZl9mdW5jCT0gaXBtaV9wb3dlcm9mZl9hdGNhIH0sCisJeyAucGxhdGZvcm1fdHlwZQk9ICJDUEkxIiwKKwkgIC5kZXRlY3QJCT0gaXBtaV9jcGkxX2RldGVjdCwKKwkgIC5wb3dlcm9mZl9mdW5jCT0gaXBtaV9wb3dlcm9mZl9jcGkxIH0sCisJLyogQ2hhc3NpcyBzaG91bGQgZ2VuZXJhbGx5IGJlIGxhc3QsIG90aGVyIHRoaW5ncyBzaG91bGQgb3ZlcnJpZGUKKwkgICBpdC4gKi8KKwl7IC5wbGF0Zm9ybV90eXBlCT0gImNoYXNzaXMiLAorCSAgLmRldGVjdAkJPSBpcG1pX2NoYXNzaXNfZGV0ZWN0LAorCSAgLnBvd2Vyb2ZmX2Z1bmMJPSBpcG1pX3Bvd2Vyb2ZmX2NoYXNzaXMgfSwKK307CisjZGVmaW5lIE5VTV9QT19GVU5DUyAoc2l6ZW9mKHBvd2Vyb2ZmX2Z1bmN0aW9ucykgXAorCQkgICAgICAvIHNpemVvZihzdHJ1Y3QgcG93ZXJvZmZfZnVuY3Rpb24pKQorCisKKy8qIE91ciBsb2NhbCBzdGF0ZS4gKi8KK3N0YXRpYyBpbnQgcmVhZHkgPSAwOworc3RhdGljIGlwbWlfdXNlcl90IGlwbWlfdXNlcjsKK3N0YXRpYyB2b2lkICgqc3BlY2lmaWNfcG93ZXJvZmZfZnVuYykoaXBtaV91c2VyX3QgdXNlcikgPSBOVUxMOworCisvKiBIb2xkcyB0aGUgb2xkIHBvd2Vyb2ZmIGZ1bmN0aW9uIHNvIHdlIGNhbiByZXN0b3JlIGl0IG9uIHJlbW92YWwuICovCitzdGF0aWMgdm9pZCAoKm9sZF9wb3dlcm9mZl9mdW5jKSh2b2lkKTsKKworCisvKiBDYWxsZWQgb24gYSBwb3dlcmRvd24gcmVxdWVzdC4gKi8KK3N0YXRpYyB2b2lkIGlwbWlfcG93ZXJvZmZfZnVuY3Rpb24gKHZvaWQpCit7CisJaWYgKCFyZWFkeSkKKwkJcmV0dXJuOworCisJLyogVXNlIHJ1bi10by1jb21wbGV0aW9uIG1vZGUsIHNpbmNlIGludGVycnVwdHMgbWF5IGJlIG9mZi4gKi8KKwlpcG1pX3VzZXJfc2V0X3J1bl90b19jb21wbGV0aW9uKGlwbWlfdXNlciwgMSk7CisJc3BlY2lmaWNfcG93ZXJvZmZfZnVuYyhpcG1pX3VzZXIpOworCWlwbWlfdXNlcl9zZXRfcnVuX3RvX2NvbXBsZXRpb24oaXBtaV91c2VyLCAwKTsKK30KKworLyogV2FpdCBmb3IgYW4gSVBNSSBpbnRlcmZhY2UgdG8gYmUgaW5zdGFsbGVkLCB0aGUgZmlyc3Qgb25lIGluc3RhbGxlZAorICAgd2lsbCBiZSBncmFiYmVkIGJ5IHRoaXMgY29kZSBhbmQgdXNlZCB0byBwZXJmb3JtIHRoZSBwb3dlcmRvd24uICovCitzdGF0aWMgdm9pZCBpcG1pX3BvX25ld19zbWkoaW50IGlmX251bSkKK3sKKwlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgc21pX2FkZHI7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgICAgICAgICAgIHNlbmRfbXNnOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKworCWlmIChyZWFkeSkKKwkJcmV0dXJuOworCisJcnYgPSBpcG1pX2NyZWF0ZV91c2VyKGlmX251bSwgJmlwbWlfcG93ZXJvZmZfaGFuZGxlciwgTlVMTCwgJmlwbWlfdXNlcik7CisJaWYgKHJ2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNvdWxkIG5vdCBjcmVhdGUgSVBNSSB1c2VyLCBlcnJvciAlZFxuIiwKKwkJICAgICAgIHJ2KTsKKwkJcmV0dXJuOworCX0KKworICAgICAgICAvKgorICAgICAgICAgKiBEbyBhIGdldCBkZXZpY2UgaWRlIGFuZCBzdG9yZSBzb21lIHJlc3VsdHMsIHNpbmNlIHRoaXMgaXMKKwkgKiB1c2VkIGJ5IHNldmVyYWwgZnVuY3Rpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgc21pX2FkZHIuYWRkcl90eXBlID0gSVBNSV9TWVNURU1fSU5URVJGQUNFX0FERFJfVFlQRTsKKyAgICAgICAgc21pX2FkZHIuY2hhbm5lbCA9IElQTUlfQk1DX0NIQU5ORUw7CisgICAgICAgIHNtaV9hZGRyLmx1biA9IDA7CisKKwlzZW5kX21zZy5uZXRmbiA9IElQTUlfTkVURk5fQVBQX1JFUVVFU1Q7CisJc2VuZF9tc2cuY21kID0gSVBNSV9HRVRfREVWSUNFX0lEX0NNRDsKKwlzZW5kX21zZy5kYXRhID0gTlVMTDsKKwlzZW5kX21zZy5kYXRhX2xlbiA9IDA7CisJcnYgPSBpcG1pX3JlcXVlc3Rfd2FpdF9mb3JfcmVzcG9uc2UoaXBtaV91c2VyLAorCQkJCQkgICAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJnNtaV9hZGRyLAorCQkJCQkgICAgJnNlbmRfbXNnKTsKKwlpZiAocnYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHNlbmQgSVBNSSBnZXQgZGV2aWNlIGlkIGluZm8sIgorCQkgICAgICAgIiBJUE1JIGVycm9yIDB4JXhcbiIsIHJ2KTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWlmIChoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhX2xlbiA8IDEyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIihjaGFzc2lzKSBJUE1JIGdldCBkZXZpY2UgaWQgaW5mbyB0b28sIgorCQkgICAgICAgIiBzaG9ydCwgd2FzICVkIGJ5dGVzLCBuZWVkZWQgJWQgYnl0ZXNcbiIsCisJCSAgICAgICBoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhX2xlbiwgMTIpOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJbWZnX2lkID0gKGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbN10KKwkJICB8IChoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhWzhdIDw8IDgpCisJCSAgfCAoaGFsdF9yZWN2X21zZy5tc2cuZGF0YVs5XSA8PCAxNikpOworCXByb2RfaWQgPSAoaGFsdF9yZWN2X21zZy5tc2cuZGF0YVsxMF0KKwkJICAgfCAoaGFsdF9yZWN2X21zZy5tc2cuZGF0YVsxMV0gPDwgOCkpOworCWNhcGFiaWxpdGllcyA9IGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbNl07CisKKworCS8qIFNjYW4gZm9yIGEgcG93ZXJvZmYgbWV0aG9kICovCisJZm9yIChpPTA7IGk8TlVNX1BPX0ZVTkNTOyBpKyspIHsKKwkJaWYgKHBvd2Vyb2ZmX2Z1bmN0aW9uc1tpXS5kZXRlY3QoaXBtaV91c2VyKSkKKwkJCWdvdG8gZm91bmQ7CisJfQorCisgb3V0X2VycjoKKwlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gZmluZCBhIHBvd2Vyb2ZmIGZ1bmN0aW9uIHRoYXQiCisJICAgICAgICIgd2lsbCB3b3JrLCBnaXZpbmcgdXBcbiIpOworCWlwbWlfZGVzdHJveV91c2VyKGlwbWlfdXNlcik7CisJcmV0dXJuOworCisgZm91bmQ6CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkZvdW5kIGEgJXMgc3R5bGUgcG93ZXJvZmYgZnVuY3Rpb25cbiIsCisJICAgICAgIHBvd2Vyb2ZmX2Z1bmN0aW9uc1tpXS5wbGF0Zm9ybV90eXBlKTsKKwlzcGVjaWZpY19wb3dlcm9mZl9mdW5jID0gcG93ZXJvZmZfZnVuY3Rpb25zW2ldLnBvd2Vyb2ZmX2Z1bmM7CisJb2xkX3Bvd2Vyb2ZmX2Z1bmMgPSBwbV9wb3dlcl9vZmY7CisJcG1fcG93ZXJfb2ZmID0gaXBtaV9wb3dlcm9mZl9mdW5jdGlvbjsKKwlyZWFkeSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGlwbWlfcG9fc21pX2dvbmUoaW50IGlmX251bSkKK3sKKwkvKiBUaGlzIGNhbiBuZXZlciBiZSBjYWxsZWQsIGJlY2F1c2Ugb25jZSBwb3dlcm9mZiBkcml2ZXIgaXMKKwkgICByZWdpc3RlcmVkLCB0aGUgaW50ZXJmYWNlIGNhbid0IGdvIGF3YXkgdW50aWwgdGhlIHBvd2VyCisJICAgZHJpdmVyIGlzIHVucmVnaXN0ZXJlZC4gKi8KK30KKworc3RhdGljIHN0cnVjdCBpcG1pX3NtaV93YXRjaGVyIHNtaV93YXRjaGVyID0KK3sKKwkub3duZXIgICAgPSBUSElTX01PRFVMRSwKKwkubmV3X3NtaSAgPSBpcG1pX3BvX25ld19zbWksCisJLnNtaV9nb25lID0gaXBtaV9wb19zbWlfZ29uZQorfTsKKworCisvKgorICogU3RhcnR1cCBhbmQgc2h1dGRvd24gZnVuY3Rpb25zLgorICovCitzdGF0aWMgaW50IGlwbWlfcG93ZXJvZmZfaW5pdCAodm9pZCkKK3sKKwlpbnQgcnY7CisKKwlwcmludGsgKCJDb3B5cmlnaHQgKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSAtIgorCQkiIElQTUkgUG93ZXJkb3duIHZpYSBzeXNfcmVib290IHZlcnNpb24gIgorCQlJUE1JX1BPV0VST0ZGX1ZFUlNJT04gIi5cbiIpOworCisJcnYgPSBpcG1pX3NtaV93YXRjaGVyX3JlZ2lzdGVyKCZzbWlfd2F0Y2hlcik7CisJaWYgKHJ2KQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gcmVnaXN0ZXIgU01JIHdhdGNoZXI6ICVkXG4iLCBydik7CisKKwlyZXR1cm4gcnY7Cit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBfX2V4aXQgdm9pZCBpcG1pX3Bvd2Vyb2ZmX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgcnY7CisKKwlpcG1pX3NtaV93YXRjaGVyX3VucmVnaXN0ZXIoJnNtaV93YXRjaGVyKTsKKworCWlmIChyZWFkeSkgeworCQlydiA9IGlwbWlfZGVzdHJveV91c2VyKGlwbWlfdXNlcik7CisJCWlmIChydikKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggImNvdWxkIG5vdCBjbGVhbnVwIHRoZSBJUE1JIgorCQkJICAgICAgICIgdXNlcjogMHgleFxuIiwgcnYpOworCQlwbV9wb3dlcl9vZmYgPSBvbGRfcG93ZXJvZmZfZnVuYzsKKwl9Cit9Cittb2R1bGVfZXhpdChpcG1pX3Bvd2Vyb2ZmX2NsZWFudXApOworI2VuZGlmCisKK21vZHVsZV9pbml0KGlwbWlfcG93ZXJvZmZfaW5pdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZGUyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwpAQCAtMCwwICsxLDIzNTkgQEAKKy8qCisgKiBpcG1pX3NpLmMKKyAqCisgKiBUaGUgaW50ZXJmYWNlIHRvIHRoZSBJUE1JIGRyaXZlciBmb3IgdGhlIHN5c3RlbSBpbnRlcmZhY2VzIChLQ1MsIFNNSUMsCisgKiBCVCkuCisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIENvcmV5IE1pbnlhcmQgPG1pbnlhcmRAbXZpc3RhLmNvbT4KKyAqICAgICAgICAgc291cmNlQG12aXN0YS5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICogIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAqICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiAgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGhvbGRzIHRoZSAicG9saWN5IiBmb3IgdGhlIGludGVyZmFjZSB0byB0aGUgU01JIHN0YXRlCisgKiBtYWNoaW5lLiAgSXQgZG9lcyB0aGUgY29uZmlndXJhdGlvbiwgaGFuZGxlcyB0aW1lcnMgYW5kIGludGVycnVwdHMsCisgKiBhbmQgZHJpdmVzIHRoZSByZWFsIFNNSSBzdGF0ZSBtYWNoaW5lLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworI2luY2x1ZGUgPGxpbnV4L2hydGltZS5oPgorIyBpZiBkZWZpbmVkKHNjaGVkdWxlX25leHRfaW50KQorLyogT2xkIGhpZ2gtcmVzIHRpbWVyIGNvZGUsIGRvIHRyYW5zbGF0aW9ucy4gKi8KKyMgIGRlZmluZSBnZXRfYXJjaF9jeWNsZXMoYSkgcXVpY2tfdXBkYXRlX2ppZmZpZXNfc3ViKGEpCisjICBkZWZpbmUgYXJjaF9jeWNsZXNfcGVyX2ppZmZ5IGN5Y2xlc19wZXJfamlmZmllcworIyBlbmRpZgorc3RhdGljIGlubGluZSB2b2lkIGFkZF91c2VjX3RvX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0LCBsb25nIHYpCit7CisJdC0+c3ViX2V4cGlyZXMgKz0gbnNlY190b19hcmNoX2N5Y2xlKHYgKiAxMDAwKTsKKwl3aGlsZSAodC0+c3ViX2V4cGlyZXMgPj0gYXJjaF9jeWNsZXNfcGVyX2ppZmZ5KQorCXsKKwkJdC0+ZXhwaXJlcysrOworCQl0LT5zdWJfZXhwaXJlcyAtPSBhcmNoX2N5Y2xlc19wZXJfamlmZnk7CisJfQorfQorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcG1pX3NtaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgImlwbWlfc2lfc20uaCIKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNkZWZpbmUgSVBNSV9TSV9WRVJTSU9OICJ2MzMiCisKKy8qIE1lYXN1cmUgdGltZXMgYmV0d2VlbiBldmVudHMgaW4gdGhlIGRyaXZlci4gKi8KKyN1bmRlZiBERUJVR19USU1JTkcKKworLyogQ2FsbCBldmVyeSAxMCBtcy4gKi8KKyNkZWZpbmUgU0lfVElNRU9VVF9USU1FX1VTRUMJMTAwMDAKKyNkZWZpbmUgU0lfVVNFQ19QRVJfSklGRlkJKDEwMDAwMDAvSFopCisjZGVmaW5lIFNJX1RJTUVPVVRfSklGRklFUwkoU0lfVElNRU9VVF9USU1FX1VTRUMvU0lfVVNFQ19QRVJfSklGRlkpCisjZGVmaW5lIFNJX1NIT1JUX1RJTUVPVVRfVVNFQyAgMjUwIC8qIC4yNW1zIHdoZW4gdGhlIFNNIHJlcXVlc3QgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgdGltZW91dCAqLworCitlbnVtIHNpX2ludGZfc3RhdGUgeworCVNJX05PUk1BTCwKKwlTSV9HRVRUSU5HX0ZMQUdTLAorCVNJX0dFVFRJTkdfRVZFTlRTLAorCVNJX0NMRUFSSU5HX0ZMQUdTLAorCVNJX0NMRUFSSU5HX0ZMQUdTX1RIRU5fU0VUX0lSUSwKKwlTSV9HRVRUSU5HX01FU1NBR0VTLAorCVNJX0VOQUJMRV9JTlRFUlJVUFRTMSwKKwlTSV9FTkFCTEVfSU5URVJSVVBUUzIKKwkvKiBGSVhNRSAtIGFkZCB3YXRjaGRvZyBzdHVmZi4gKi8KK307CisKK2VudW0gc2lfdHlwZSB7CisgICAgU0lfS0NTLCBTSV9TTUlDLCBTSV9CVAorfTsKKworc3RydWN0IHNtaV9pbmZvCit7CisJaXBtaV9zbWlfdCAgICAgICAgICAgICBpbnRmOworCXN0cnVjdCBzaV9zbV9kYXRhICAgICAgKnNpX3NtOworCXN0cnVjdCBzaV9zbV9oYW5kbGVycyAgKmhhbmRsZXJzOworCWVudW0gc2lfdHlwZSAgICAgICAgICAgc2lfdHlwZTsKKwlzcGlubG9ja190ICAgICAgICAgICAgIHNpX2xvY2s7CisJc3BpbmxvY2tfdCAgICAgICAgICAgICBtc2dfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgIHhtaXRfbXNnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgIGhwX3htaXRfbXNnczsKKwlzdHJ1Y3QgaXBtaV9zbWlfbXNnICAgICpjdXJyX21zZzsKKwllbnVtIHNpX2ludGZfc3RhdGUgICAgIHNpX3N0YXRlOworCisJLyogVXNlZCB0byBoYW5kbGUgdGhlIHZhcmlvdXMgdHlwZXMgb2YgSS9PIHRoYXQgY2FuIG9jY3VyIHdpdGgKKyAgICAgICAgICAgSVBNSSAqLworCXN0cnVjdCBzaV9zbV9pbyBpbzsKKwlpbnQgKCppb19zZXR1cCkoc3RydWN0IHNtaV9pbmZvICppbmZvKTsKKwl2b2lkICgqaW9fY2xlYW51cCkoc3RydWN0IHNtaV9pbmZvICppbmZvKTsKKwlpbnQgKCppcnFfc2V0dXApKHN0cnVjdCBzbWlfaW5mbyAqaW5mbyk7CisJdm9pZCAoKmlycV9jbGVhbnVwKShzdHJ1Y3Qgc21pX2luZm8gKmluZm8pOworCXVuc2lnbmVkIGludCBpb19zaXplOworCisJLyogRmxhZ3MgZnJvbSB0aGUgbGFzdCBHRVRfTVNHX0ZMQUdTIGNvbW1hbmQsIHVzZWQgd2hlbiBhbiBBVFROCisJICAgaXMgc2V0IHRvIGhvbGQgdGhlIGZsYWdzIHVudGlsIHdlIGFyZSBkb25lIGhhbmRsaW5nIGV2ZXJ5dGhpbmcKKwkgICBmcm9tIHRoZSBmbGFncy4gKi8KKyNkZWZpbmUgUkVDRUlWRV9NU0dfQVZBSUwJMHgwMQorI2RlZmluZSBFVkVOVF9NU0dfQlVGRkVSX0ZVTEwJMHgwMgorI2RlZmluZSBXRFRfUFJFX1RJTUVPVVRfSU5UCTB4MDgKKwl1bnNpZ25lZCBjaGFyICAgICAgIG1zZ19mbGFnczsKKworCS8qIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgcmVxdWVzdCBldmVudHMgdGhlIG5leHQgdGltZSB0aGUKKwkgICBzdGF0ZSBtYWNoaW5lIGlzIGlkbGUuICovCisJYXRvbWljX3QgICAgICAgICAgICByZXFfZXZlbnRzOworCisJLyogSWYgdHJ1ZSwgcnVuIHRoZSBzdGF0ZSBtYWNoaW5lIHRvIGNvbXBsZXRpb24gb24gZXZlcnkgc2VuZAorCSAgIGNhbGwuICBHZW5lcmFsbHkgdXNlZCBhZnRlciBhIHBhbmljIHRvIG1ha2Ugc3VyZSBzdHVmZiBnb2VzCisJICAgb3V0LiAqLworCWludCAgICAgICAgICAgICAgICAgcnVuX3RvX2NvbXBsZXRpb247CisKKwkvKiBUaGUgSS9PIHBvcnQgb2YgYW4gU0kgaW50ZXJmYWNlLiAqLworCWludCAgICAgICAgICAgICAgICAgcG9ydDsKKworCS8qIFRoZSBzcGFjZSBiZXR3ZWVuIHN0YXJ0IGFkZHJlc3NlcyBvZiB0aGUgdHdvIHBvcnRzLiAgRm9yCisJICAgaW5zdGFuY2UsIGlmIHRoZSBmaXJzdCBwb3J0IGlzIDB4Y2EyIGFuZCB0aGUgc3BhY2luZyBpcyA0LCB0aGVuCisJICAgdGhlIHNlY29uZCBwb3J0IGlzIDB4Y2E2LiAqLworCXVuc2lnbmVkIGludCAgICAgICAgc3BhY2luZzsKKworCS8qIHplcm8gaWYgbm8gaXJxOyAqLworCWludCAgICAgICAgICAgICAgICAgaXJxOworCisJLyogVGhlIHRpbWVyIGZvciB0aGlzIHNpLiAqLworCXN0cnVjdCB0aW1lcl9saXN0ICAgc2lfdGltZXI7CisKKwkvKiBUaGUgdGltZSAoaW4gamlmZmllcykgdGhlIGxhc3QgdGltZW91dCBvY2N1cnJlZCBhdC4gKi8KKwl1bnNpZ25lZCBsb25nICAgICAgIGxhc3RfdGltZW91dF9qaWZmaWVzOworCisJLyogVXNlZCB0byBncmFjZWZ1bGx5IHN0b3AgdGhlIHRpbWVyIHdpdGhvdXQgcmFjZSBjb25kaXRpb25zLiAqLworCXZvbGF0aWxlIGludCAgICAgICAgc3RvcF9vcGVyYXRpb247CisJdm9sYXRpbGUgaW50ICAgICAgICB0aW1lcl9zdG9wcGVkOworCisJLyogVGhlIGRyaXZlciB3aWxsIGRpc2FibGUgaW50ZXJydXB0cyB3aGVuIGl0IGdldHMgaW50byBhCisJICAgc2l0dWF0aW9uIHdoZXJlIGl0IGNhbm5vdCBoYW5kbGUgbWVzc2FnZXMgZHVlIHRvIGxhY2sgb2YKKwkgICBtZW1vcnkuICBPbmNlIHRoYXQgc2l0dWF0aW9uIGNsZWFycyB1cCwgaXQgd2lsbCByZS1lbmFibGUKKwkgICBpbnRlcnJ1cHRzLiAqLworCWludCBpbnRlcnJ1cHRfZGlzYWJsZWQ7CisKKwl1bnNpZ25lZCBjaGFyIGlwbWlfc2lfZGV2X3JldjsKKwl1bnNpZ25lZCBjaGFyIGlwbWlfc2lfZndfcmV2X21ham9yOworCXVuc2lnbmVkIGNoYXIgaXBtaV9zaV9md19yZXZfbWlub3I7CisJdW5zaWduZWQgY2hhciBpcG1pX3ZlcnNpb25fbWFqb3I7CisJdW5zaWduZWQgY2hhciBpcG1pX3ZlcnNpb25fbWlub3I7CisKKwkvKiBTbGF2ZSBhZGRyZXNzLCBjb3VsZCBiZSByZXBvcnRlZCBmcm9tIERNSS4gKi8KKwl1bnNpZ25lZCBjaGFyIHNsYXZlX2FkZHI7CisKKwkvKiBDb3VudGVycyBhbmQgdGhpbmdzIGZvciB0aGUgcHJvYyBmaWxlc3lzdGVtLiAqLworCXNwaW5sb2NrX3QgY291bnRfbG9jazsKKwl1bnNpZ25lZCBsb25nIHNob3J0X3RpbWVvdXRzOworCXVuc2lnbmVkIGxvbmcgbG9uZ190aW1lb3V0czsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXRfcmVzdGFydHM7CisJdW5zaWduZWQgbG9uZyBpZGxlczsKKwl1bnNpZ25lZCBsb25nIGludGVycnVwdHM7CisJdW5zaWduZWQgbG9uZyBhdHRlbnRpb25zOworCXVuc2lnbmVkIGxvbmcgZmxhZ19mZXRjaGVzOworCXVuc2lnbmVkIGxvbmcgaG9zZWRfY291bnQ7CisJdW5zaWduZWQgbG9uZyBjb21wbGV0ZV90cmFuc2FjdGlvbnM7CisJdW5zaWduZWQgbG9uZyBldmVudHM7CisJdW5zaWduZWQgbG9uZyB3YXRjaGRvZ19wcmV0aW1lb3V0czsKKwl1bnNpZ25lZCBsb25nIGluY29taW5nX21lc3NhZ2VzOworfTsKKworc3RhdGljIHZvaWQgc2lfcmVzdGFydF9zaG9ydF90aW1lcihzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKTsKKworc3RhdGljIHZvaWQgZGVsaXZlcl9yZWN2X21zZyhzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvLAorCQkJICAgICBzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7CisJLyogRGVsaXZlciB0aGUgbWVzc2FnZSB0byB0aGUgdXBwZXIgbGF5ZXIgd2l0aCB0aGUgbG9jaworICAgICAgICAgICByZWxlYXNlZC4gKi8KKwlzcGluX3VubG9jaygmKHNtaV9pbmZvLT5zaV9sb2NrKSk7CisJaXBtaV9zbWlfbXNnX3JlY2VpdmVkKHNtaV9pbmZvLT5pbnRmLCBtc2cpOworCXNwaW5fbG9jaygmKHNtaV9pbmZvLT5zaV9sb2NrKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJldHVybl9ob3NlZF9tc2coc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwlzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cgPSBzbWlfaW5mby0+Y3Vycl9tc2c7CisKKwkvKiBNYWtlIGl0IGEgcmVwb25zZSAqLworCW1zZy0+cnNwWzBdID0gbXNnLT5kYXRhWzBdIHwgNDsKKwltc2ctPnJzcFsxXSA9IG1zZy0+ZGF0YVsxXTsKKwltc2ctPnJzcFsyXSA9IDB4RkY7IC8qIFVua25vd24gZXJyb3IuICovCisJbXNnLT5yc3Bfc2l6ZSA9IDM7CisKKwlzbWlfaW5mby0+Y3Vycl9tc2cgPSBOVUxMOworCWRlbGl2ZXJfcmVjdl9tc2coc21pX2luZm8sIG1zZyk7Cit9CisKK3N0YXRpYyBlbnVtIHNpX3NtX3Jlc3VsdCBzdGFydF9uZXh0X21zZyhzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKQoreworCWludCAgICAgICAgICAgICAgcnY7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnkgPSBOVUxMOworI2lmZGVmIERFQlVHX1RJTUlORworCXN0cnVjdCB0aW1ldmFsIHQ7CisjZW5kaWYKKworCS8qIE5vIG5lZWQgdG8gc2F2ZSBmbGFncywgd2UgYWxlYWR5IGhhdmUgaW50ZXJydXB0cyBvZmYgYW5kIHdlCisJICAgYWxyZWFkeSBob2xkIHRoZSBTTUkgbG9jay4gKi8KKwlzcGluX2xvY2soJihzbWlfaW5mby0+bXNnX2xvY2spKTsKKworCS8qIFBpY2sgdGhlIGhpZ2ggcHJpb3JpdHkgcXVldWUgZmlyc3QuICovCisJaWYgKCEgbGlzdF9lbXB0eSgmKHNtaV9pbmZvLT5ocF94bWl0X21zZ3MpKSkgeworCQllbnRyeSA9IHNtaV9pbmZvLT5ocF94bWl0X21zZ3MubmV4dDsKKwl9IGVsc2UgaWYgKCEgbGlzdF9lbXB0eSgmKHNtaV9pbmZvLT54bWl0X21zZ3MpKSkgeworCQllbnRyeSA9IHNtaV9pbmZvLT54bWl0X21zZ3MubmV4dDsKKwl9CisKKwlpZiAoIWVudHJ5KSB7CisJCXNtaV9pbmZvLT5jdXJyX21zZyA9IE5VTEw7CisJCXJ2ID0gU0lfU01fSURMRTsKKwl9IGVsc2UgeworCQlpbnQgZXJyOworCisJCWxpc3RfZGVsKGVudHJ5KTsKKwkJc21pX2luZm8tPmN1cnJfbXNnID0gbGlzdF9lbnRyeShlbnRyeSwKKwkJCQkJCXN0cnVjdCBpcG1pX3NtaV9tc2csCisJCQkJCQlsaW5rKTsKKyNpZmRlZiBERUJVR19USU1JTkcKKwkJZG9fZ2V0dGltZW9mZGF5KCZ0KTsKKwkJcHJpbnRrKCIqKlN0YXJ0MjogJWQuJTkuOWRcbiIsIHQudHZfc2VjLCB0LnR2X3VzZWMpOworI2VuZGlmCisJCWVyciA9IHNtaV9pbmZvLT5oYW5kbGVycy0+c3RhcnRfdHJhbnNhY3Rpb24oCisJCQlzbWlfaW5mby0+c2lfc20sCisJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGEsCisJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGFfc2l6ZSk7CisJCWlmIChlcnIpIHsKKwkJCXJldHVybl9ob3NlZF9tc2coc21pX2luZm8pOworCQl9CisKKwkJcnYgPSBTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVk7CisJfQorCXNwaW5fdW5sb2NrKCYoc21pX2luZm8tPm1zZ19sb2NrKSk7CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2VuYWJsZV9pcnEoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIG1zZ1syXTsKKworCS8qIElmIHdlIGFyZSBlbmFibGluZyBpbnRlcnJ1cHRzLCB3ZSBoYXZlIHRvIHRlbGwgdGhlCisJICAgQk1DIHRvIHVzZSB0aGVtLiAqLworCW1zZ1swXSA9IChJUE1JX05FVEZOX0FQUF9SRVFVRVNUIDw8IDIpOworCW1zZ1sxXSA9IElQTUlfR0VUX0JNQ19HTE9CQUxfRU5BQkxFU19DTUQ7CisKKwlzbWlfaW5mby0+aGFuZGxlcnMtPnN0YXJ0X3RyYW5zYWN0aW9uKHNtaV9pbmZvLT5zaV9zbSwgbXNnLCAyKTsKKwlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9FTkFCTEVfSU5URVJSVVBUUzE7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2NsZWFyX2ZsYWdzKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCit7CisJdW5zaWduZWQgY2hhciBtc2dbM107CisKKwkvKiBNYWtlIHN1cmUgdGhlIHdhdGNoZG9nIHByZS10aW1lb3V0IGZsYWcgaXMgbm90IHNldCBhdCBzdGFydHVwLiAqLworCW1zZ1swXSA9IChJUE1JX05FVEZOX0FQUF9SRVFVRVNUIDw8IDIpOworCW1zZ1sxXSA9IElQTUlfQ0xFQVJfTVNHX0ZMQUdTX0NNRDsKKwltc2dbMl0gPSBXRFRfUFJFX1RJTUVPVVRfSU5UOworCisJc21pX2luZm8tPmhhbmRsZXJzLT5zdGFydF90cmFuc2FjdGlvbihzbWlfaW5mby0+c2lfc20sIG1zZywgMyk7CisJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfQ0xFQVJJTkdfRkxBR1M7Cit9CisKKy8qIFdoZW4gd2UgaGF2ZSBhIHNpdHV0YWlvbiB3aGVyZSB3ZSBydW4gb3V0IG9mIG1lbW9yeSBhbmQgY2Fubm90CisgICBhbGxvY2F0ZSBtZXNzYWdlcywgd2UganVzdCBsZWF2ZSB0aGVtIGluIHRoZSBCTUMgYW5kIHJ1biB0aGUgc3lzdGVtCisgICBwb2xsZWQgdW50aWwgd2UgY2FuIGFsbG9jYXRlIHNvbWUgbWVtb3J5LiAgT25jZSB3ZSBoYXZlIHNvbWUKKyAgIG1lbW9yeSwgd2Ugd2lsbCByZS1lbmFibGUgdGhlIGludGVycnVwdC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX3NpX2lycShzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKQoreworCWlmICgoc21pX2luZm8tPmlycSkgJiYgKCFzbWlfaW5mby0+aW50ZXJydXB0X2Rpc2FibGVkKSkgeworCQlkaXNhYmxlX2lycV9ub3N5bmMoc21pX2luZm8tPmlycSk7CisJCXNtaV9pbmZvLT5pbnRlcnJ1cHRfZGlzYWJsZWQgPSAxOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9zaV9pcnEoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwlpZiAoKHNtaV9pbmZvLT5pcnEpICYmIChzbWlfaW5mby0+aW50ZXJydXB0X2Rpc2FibGVkKSkgeworCQllbmFibGVfaXJxKHNtaV9pbmZvLT5pcnEpOworCQlzbWlfaW5mby0+aW50ZXJydXB0X2Rpc2FibGVkID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9mbGFncyhzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKQoreworCWlmIChzbWlfaW5mby0+bXNnX2ZsYWdzICYgV0RUX1BSRV9USU1FT1VUX0lOVCkgeworCQkvKiBXYXRjaGRvZyBwcmUtdGltZW91dCAqLworCQlzcGluX2xvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKwkJc21pX2luZm8tPndhdGNoZG9nX3ByZXRpbWVvdXRzKys7CisJCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisKKwkJc3RhcnRfY2xlYXJfZmxhZ3Moc21pX2luZm8pOworCQlzbWlfaW5mby0+bXNnX2ZsYWdzICY9IH5XRFRfUFJFX1RJTUVPVVRfSU5UOworCQlzcGluX3VubG9jaygmKHNtaV9pbmZvLT5zaV9sb2NrKSk7CisJCWlwbWlfc21pX3dhdGNoZG9nX3ByZXRpbWVvdXQoc21pX2luZm8tPmludGYpOworCQlzcGluX2xvY2soJihzbWlfaW5mby0+c2lfbG9jaykpOworCX0gZWxzZSBpZiAoc21pX2luZm8tPm1zZ19mbGFncyAmIFJFQ0VJVkVfTVNHX0FWQUlMKSB7CisJCS8qIE1lc3NhZ2VzIGF2YWlsYWJsZS4gKi8KKwkJc21pX2luZm8tPmN1cnJfbXNnID0gaXBtaV9hbGxvY19zbWlfbXNnKCk7CisJCWlmICghc21pX2luZm8tPmN1cnJfbXNnKSB7CisJCQlkaXNhYmxlX3NpX2lycShzbWlfaW5mbyk7CisJCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9OT1JNQUw7CisJCQlyZXR1cm47CisJCX0KKwkJZW5hYmxlX3NpX2lycShzbWlfaW5mbyk7CisKKwkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhWzBdID0gKElQTUlfTkVURk5fQVBQX1JFUVVFU1QgPDwgMik7CisJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YVsxXSA9IElQTUlfR0VUX01TR19DTUQ7CisJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YV9zaXplID0gMjsKKworCQlzbWlfaW5mby0+aGFuZGxlcnMtPnN0YXJ0X3RyYW5zYWN0aW9uKAorCQkJc21pX2luZm8tPnNpX3NtLAorCQkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhLAorCQkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhX3NpemUpOworCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9HRVRUSU5HX01FU1NBR0VTOworCX0gZWxzZSBpZiAoc21pX2luZm8tPm1zZ19mbGFncyAmIEVWRU5UX01TR19CVUZGRVJfRlVMTCkgeworCQkvKiBFdmVudHMgYXZhaWxhYmxlLiAqLworCQlzbWlfaW5mby0+Y3Vycl9tc2cgPSBpcG1pX2FsbG9jX3NtaV9tc2coKTsKKwkJaWYgKCFzbWlfaW5mby0+Y3Vycl9tc2cpIHsKKwkJCWRpc2FibGVfc2lfaXJxKHNtaV9pbmZvKTsKKwkJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX05PUk1BTDsKKwkJCXJldHVybjsKKwkJfQorCQllbmFibGVfc2lfaXJxKHNtaV9pbmZvKTsKKworCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGFbMF0gPSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKTsKKwkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhWzFdID0gSVBNSV9SRUFEX0VWRU5UX01TR19CVUZGRVJfQ01EOworCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGFfc2l6ZSA9IDI7CisKKwkJc21pX2luZm8tPmhhbmRsZXJzLT5zdGFydF90cmFuc2FjdGlvbigKKwkJCXNtaV9pbmZvLT5zaV9zbSwKKwkJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YSwKKwkJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YV9zaXplKTsKKwkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfR0VUVElOR19FVkVOVFM7CisJfSBlbHNlIHsKKwkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfTk9STUFMOworCX0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3RyYW5zYWN0aW9uX2RvbmUoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwlzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2c7CisjaWZkZWYgREVCVUdfVElNSU5HCisJc3RydWN0IHRpbWV2YWwgdDsKKworCWRvX2dldHRpbWVvZmRheSgmdCk7CisJcHJpbnRrKCIqKkRvbmU6ICVkLiU5LjlkXG4iLCB0LnR2X3NlYywgdC50dl91c2VjKTsKKyNlbmRpZgorCXN3aXRjaCAoc21pX2luZm8tPnNpX3N0YXRlKSB7CisJY2FzZSBTSV9OT1JNQUw6CisJCWlmICghc21pX2luZm8tPmN1cnJfbXNnKQorCQkJYnJlYWs7CisKKwkJc21pX2luZm8tPmN1cnJfbXNnLT5yc3Bfc2l6ZQorCQkJPSBzbWlfaW5mby0+aGFuZGxlcnMtPmdldF9yZXN1bHQoCisJCQkJc21pX2luZm8tPnNpX3NtLAorCQkJCXNtaV9pbmZvLT5jdXJyX21zZy0+cnNwLAorCQkJCUlQTUlfTUFYX01TR19MRU5HVEgpOworCisJCS8qIERvIHRoaXMgaGVyZSBiZWNhc2UgZGVsaXZlcl9yZWN2X21zZygpIHJlbGVhc2VzIHRoZQorCQkgICBsb2NrLCBhbmQgYSBuZXcgbWVzc2FnZSBjYW4gYmUgcHV0IGluIGR1cmluZyB0aGUKKwkJICAgdGltZSB0aGUgbG9jayBpcyByZWxlYXNlZC4gKi8KKwkJbXNnID0gc21pX2luZm8tPmN1cnJfbXNnOworCQlzbWlfaW5mby0+Y3Vycl9tc2cgPSBOVUxMOworCQlkZWxpdmVyX3JlY3ZfbXNnKHNtaV9pbmZvLCBtc2cpOworCQlicmVhazsKKworCWNhc2UgU0lfR0VUVElOR19GTEFHUzoKKwl7CisJCXVuc2lnbmVkIGNoYXIgbXNnWzRdOworCQl1bnNpZ25lZCBpbnQgIGxlbjsKKworCQkvKiBXZSBnb3QgdGhlIGZsYWdzIGZyb20gdGhlIFNNSSwgbm93IGhhbmRsZSB0aGVtLiAqLworCQlsZW4gPSBzbWlfaW5mby0+aGFuZGxlcnMtPmdldF9yZXN1bHQoc21pX2luZm8tPnNpX3NtLCBtc2csIDQpOworCQlpZiAobXNnWzJdICE9IDApIHsKKwkJCS8qIEVycm9yIGZldGNoaW5nIGZsYWdzLCBqdXN0IGdpdmUgdXAgZm9yCisJCQkgICBub3cuICovCisJCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9OT1JNQUw7CisJCX0gZWxzZSBpZiAobGVuIDwgNCkgeworCQkJLyogSG1tLCBubyBmbGFncy4gIFRoYXQncyB0ZWNobmljYWxseSBpbGxlZ2FsLCBidXQKKwkJCSAgIGRvbid0IHVzZSB1bmluaXRpYWxpemVkIGRhdGEuICovCisJCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9OT1JNQUw7CisJCX0gZWxzZSB7CisJCQlzbWlfaW5mby0+bXNnX2ZsYWdzID0gbXNnWzNdOworCQkJaGFuZGxlX2ZsYWdzKHNtaV9pbmZvKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFNJX0NMRUFSSU5HX0ZMQUdTOgorCWNhc2UgU0lfQ0xFQVJJTkdfRkxBR1NfVEhFTl9TRVRfSVJROgorCXsKKwkJdW5zaWduZWQgY2hhciBtc2dbM107CisKKwkJLyogV2UgY2xlYXJlZCB0aGUgZmxhZ3MuICovCisJCXNtaV9pbmZvLT5oYW5kbGVycy0+Z2V0X3Jlc3VsdChzbWlfaW5mby0+c2lfc20sIG1zZywgMyk7CisJCWlmIChtc2dbMl0gIT0gMCkgeworCQkJLyogRXJyb3IgY2xlYXJpbmcgZmxhZ3MgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiaXBtaV9zaTogRXJyb3IgY2xlYXJpbmcgZmxhZ3M6ICUyLjJ4XG4iLAorCQkJICAgICAgIG1zZ1syXSk7CisJCX0KKwkJaWYgKHNtaV9pbmZvLT5zaV9zdGF0ZSA9PSBTSV9DTEVBUklOR19GTEFHU19USEVOX1NFVF9JUlEpCisJCQlzdGFydF9lbmFibGVfaXJxKHNtaV9pbmZvKTsKKwkJZWxzZQorCQkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfTk9STUFMOworCQlicmVhazsKKwl9CisKKwljYXNlIFNJX0dFVFRJTkdfRVZFTlRTOgorCXsKKwkJc21pX2luZm8tPmN1cnJfbXNnLT5yc3Bfc2l6ZQorCQkJPSBzbWlfaW5mby0+aGFuZGxlcnMtPmdldF9yZXN1bHQoCisJCQkJc21pX2luZm8tPnNpX3NtLAorCQkJCXNtaV9pbmZvLT5jdXJyX21zZy0+cnNwLAorCQkJCUlQTUlfTUFYX01TR19MRU5HVEgpOworCisJCS8qIERvIHRoaXMgaGVyZSBiZWNhc2UgZGVsaXZlcl9yZWN2X21zZygpIHJlbGVhc2VzIHRoZQorCQkgICBsb2NrLCBhbmQgYSBuZXcgbWVzc2FnZSBjYW4gYmUgcHV0IGluIGR1cmluZyB0aGUKKwkJICAgdGltZSB0aGUgbG9jayBpcyByZWxlYXNlZC4gKi8KKwkJbXNnID0gc21pX2luZm8tPmN1cnJfbXNnOworCQlzbWlfaW5mby0+Y3Vycl9tc2cgPSBOVUxMOworCQlpZiAobXNnLT5yc3BbMl0gIT0gMCkgeworCQkJLyogRXJyb3IgZ2V0dGluZyBldmVudCwgcHJvYmFibHkgZG9uZS4gKi8KKwkJCW1zZy0+ZG9uZShtc2cpOworCisJCQkvKiBUYWtlIG9mZiB0aGUgZXZlbnQgZmxhZy4gKi8KKwkJCXNtaV9pbmZvLT5tc2dfZmxhZ3MgJj0gfkVWRU5UX01TR19CVUZGRVJfRlVMTDsKKwkJCWhhbmRsZV9mbGFncyhzbWlfaW5mbyk7CisJCX0gZWxzZSB7CisJCQlzcGluX2xvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKwkJCXNtaV9pbmZvLT5ldmVudHMrKzsKKwkJCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisKKwkJCS8qIERvIHRoaXMgYmVmb3JlIHdlIGRlbGl2ZXIgdGhlIG1lc3NhZ2UKKwkJCSAgIGJlY2F1c2UgZGVsaXZlcmluZyB0aGUgbWVzc2FnZSByZWxlYXNlcyB0aGUKKwkJCSAgIGxvY2sgYW5kIHNvbWV0aGluZyBlbHNlIGNhbiBtZXNzIHdpdGggdGhlCisJCQkgICBzdGF0ZS4gKi8KKwkJCWhhbmRsZV9mbGFncyhzbWlfaW5mbyk7CisKKwkJCWRlbGl2ZXJfcmVjdl9tc2coc21pX2luZm8sIG1zZyk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBTSV9HRVRUSU5HX01FU1NBR0VTOgorCXsKKwkJc21pX2luZm8tPmN1cnJfbXNnLT5yc3Bfc2l6ZQorCQkJPSBzbWlfaW5mby0+aGFuZGxlcnMtPmdldF9yZXN1bHQoCisJCQkJc21pX2luZm8tPnNpX3NtLAorCQkJCXNtaV9pbmZvLT5jdXJyX21zZy0+cnNwLAorCQkJCUlQTUlfTUFYX01TR19MRU5HVEgpOworCisJCS8qIERvIHRoaXMgaGVyZSBiZWNhc2UgZGVsaXZlcl9yZWN2X21zZygpIHJlbGVhc2VzIHRoZQorCQkgICBsb2NrLCBhbmQgYSBuZXcgbWVzc2FnZSBjYW4gYmUgcHV0IGluIGR1cmluZyB0aGUKKwkJICAgdGltZSB0aGUgbG9jayBpcyByZWxlYXNlZC4gKi8KKwkJbXNnID0gc21pX2luZm8tPmN1cnJfbXNnOworCQlzbWlfaW5mby0+Y3Vycl9tc2cgPSBOVUxMOworCQlpZiAobXNnLT5yc3BbMl0gIT0gMCkgeworCQkJLyogRXJyb3IgZ2V0dGluZyBldmVudCwgcHJvYmFibHkgZG9uZS4gKi8KKwkJCW1zZy0+ZG9uZShtc2cpOworCisJCQkvKiBUYWtlIG9mZiB0aGUgbXNnIGZsYWcuICovCisJCQlzbWlfaW5mby0+bXNnX2ZsYWdzICY9IH5SRUNFSVZFX01TR19BVkFJTDsKKwkJCWhhbmRsZV9mbGFncyhzbWlfaW5mbyk7CisJCX0gZWxzZSB7CisJCQlzcGluX2xvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKwkJCXNtaV9pbmZvLT5pbmNvbWluZ19tZXNzYWdlcysrOworCQkJc3Bpbl91bmxvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKworCQkJLyogRG8gdGhpcyBiZWZvcmUgd2UgZGVsaXZlciB0aGUgbWVzc2FnZQorCQkJICAgYmVjYXVzZSBkZWxpdmVyaW5nIHRoZSBtZXNzYWdlIHJlbGVhc2VzIHRoZQorCQkJICAgbG9jayBhbmQgc29tZXRoaW5nIGVsc2UgY2FuIG1lc3Mgd2l0aCB0aGUKKwkJCSAgIHN0YXRlLiAqLworCQkJaGFuZGxlX2ZsYWdzKHNtaV9pbmZvKTsKKworCQkJZGVsaXZlcl9yZWN2X21zZyhzbWlfaW5mbywgbXNnKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFNJX0VOQUJMRV9JTlRFUlJVUFRTMToKKwl7CisJCXVuc2lnbmVkIGNoYXIgbXNnWzRdOworCisJCS8qIFdlIGdvdCB0aGUgZmxhZ3MgZnJvbSB0aGUgU01JLCBub3cgaGFuZGxlIHRoZW0uICovCisJCXNtaV9pbmZvLT5oYW5kbGVycy0+Z2V0X3Jlc3VsdChzbWlfaW5mby0+c2lfc20sIG1zZywgNCk7CisJCWlmIChtc2dbMl0gIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJpcG1pX3NpOiBDb3VsZCBub3QgZW5hYmxlIGludGVycnVwdHMiCisJCQkgICAgICAgIiwgZmFpbGVkIGdldCwgdXNpbmcgcG9sbGVkIG1vZGUuXG4iKTsKKwkJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX05PUk1BTDsKKwkJfSBlbHNlIHsKKwkJCW1zZ1swXSA9IChJUE1JX05FVEZOX0FQUF9SRVFVRVNUIDw8IDIpOworCQkJbXNnWzFdID0gSVBNSV9TRVRfQk1DX0dMT0JBTF9FTkFCTEVTX0NNRDsKKwkJCW1zZ1syXSA9IG1zZ1szXSB8IDE7IC8qIGVuYWJsZSBtc2cgcXVldWUgaW50ICovCisJCQlzbWlfaW5mby0+aGFuZGxlcnMtPnN0YXJ0X3RyYW5zYWN0aW9uKAorCQkJCXNtaV9pbmZvLT5zaV9zbSwgbXNnLCAzKTsKKwkJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX0VOQUJMRV9JTlRFUlJVUFRTMjsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFNJX0VOQUJMRV9JTlRFUlJVUFRTMjoKKwl7CisJCXVuc2lnbmVkIGNoYXIgbXNnWzRdOworCisJCS8qIFdlIGdvdCB0aGUgZmxhZ3MgZnJvbSB0aGUgU01JLCBub3cgaGFuZGxlIHRoZW0uICovCisJCXNtaV9pbmZvLT5oYW5kbGVycy0+Z2V0X3Jlc3VsdChzbWlfaW5mby0+c2lfc20sIG1zZywgNCk7CisJCWlmIChtc2dbMl0gIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJpcG1pX3NpOiBDb3VsZCBub3QgZW5hYmxlIGludGVycnVwdHMiCisJCQkgICAgICAgIiwgZmFpbGVkIHNldCwgdXNpbmcgcG9sbGVkIG1vZGUuXG4iKTsKKwkJfQorCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9OT1JNQUw7CisJCWJyZWFrOworCX0KKwl9Cit9CisKKy8qIENhbGxlZCBvbiB0aW1lb3V0cyBhbmQgZXZlbnRzLiAgVGltZW91dHMgc2hvdWxkIHBhc3MgdGhlIGVsYXBzZWQKKyAgIHRpbWUsIGludGVycnVwdHMgc2hvdWxkIHBhc3MgaW4gemVyby4gKi8KK3N0YXRpYyBlbnVtIHNpX3NtX3Jlc3VsdCBzbWlfZXZlbnRfaGFuZGxlcihzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvLAorCQkJCQkgICBpbnQgdGltZSkKK3sKKwllbnVtIHNpX3NtX3Jlc3VsdCBzaV9zbV9yZXN1bHQ7CisKKyByZXN0YXJ0OgorCS8qIFRoZXJlIHVzZWQgdG8gYmUgYSBsb29wIGhlcmUgdGhhdCB3YWl0ZWQgYSBsaXR0bGUgd2hpbGUKKwkgICAoYXJvdW5kIDI1dXMpIGJlZm9yZSBnaXZpbmcgdXAuICBUaGF0IHR1cm5lZCBvdXQgdG8gYmUKKwkgICBwb2ludGxlc3MsIHRoZSBtaW5pbXVtIGRlbGF5cyBJIHdhcyBzZWVpbmcgd2VyZSBpbiB0aGUgMzAwdXMKKwkgICByYW5nZSwgd2hpY2ggaXMgZmFyIHRvbyBsb25nIHRvIHdhaXQgaW4gYW4gaW50ZXJydXB0LiAgU28KKwkgICB3ZSBqdXN0IHJ1biB1bnRpbCB0aGUgc3RhdGUgbWFjaGluZSB0ZWxscyB1cyBzb21ldGhpbmcKKwkgICBoYXBwZW5lZCBvciBpdCBuZWVkcyBhIGRlbGF5LiAqLworCXNpX3NtX3Jlc3VsdCA9IHNtaV9pbmZvLT5oYW5kbGVycy0+ZXZlbnQoc21pX2luZm8tPnNpX3NtLCB0aW1lKTsKKwl0aW1lID0gMDsKKwl3aGlsZSAoc2lfc21fcmVzdWx0ID09IFNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWSkKKwl7CisJCXNpX3NtX3Jlc3VsdCA9IHNtaV9pbmZvLT5oYW5kbGVycy0+ZXZlbnQoc21pX2luZm8tPnNpX3NtLCAwKTsKKwl9CisKKwlpZiAoc2lfc21fcmVzdWx0ID09IFNJX1NNX1RSQU5TQUNUSU9OX0NPTVBMRVRFKQorCXsKKwkJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJCXNtaV9pbmZvLT5jb21wbGV0ZV90cmFuc2FjdGlvbnMrKzsKKwkJc3Bpbl91bmxvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKworCQloYW5kbGVfdHJhbnNhY3Rpb25fZG9uZShzbWlfaW5mbyk7CisJCXNpX3NtX3Jlc3VsdCA9IHNtaV9pbmZvLT5oYW5kbGVycy0+ZXZlbnQoc21pX2luZm8tPnNpX3NtLCAwKTsKKwl9CisJZWxzZSBpZiAoc2lfc21fcmVzdWx0ID09IFNJX1NNX0hPU0VEKQorCXsKKwkJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJCXNtaV9pbmZvLT5ob3NlZF9jb3VudCsrOworCQlzcGluX3VubG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCisJCS8qIERvIHRoZSBiZWZvcmUgcmV0dXJuX2hvc2VkX21zZywgYmVjYXVzZSB0aGF0CisJCSAgIHJlbGVhc2VzIHRoZSBsb2NrLiAqLworCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9OT1JNQUw7CisJCWlmIChzbWlfaW5mby0+Y3Vycl9tc2cgIT0gTlVMTCkgeworCQkJLyogSWYgd2Ugd2VyZSBoYW5kbGluZyBhIHVzZXIgbWVzc2FnZSwgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHJlc3BvbnNlIHRvIHNlbmQgdG8gdGhlIHVwcGVyIGxheWVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWxsIGl0IGFib3V0IHRoZSBlcnJvci4gKi8KKwkJCXJldHVybl9ob3NlZF9tc2coc21pX2luZm8pOworCQl9CisJCXNpX3NtX3Jlc3VsdCA9IHNtaV9pbmZvLT5oYW5kbGVycy0+ZXZlbnQoc21pX2luZm8tPnNpX3NtLCAwKTsKKwl9CisKKwkvKiBXZSBwcmVmZXIgaGFuZGxpbmcgYXR0biBvdmVyIG5ldyBtZXNzYWdlcy4gKi8KKwlpZiAoc2lfc21fcmVzdWx0ID09IFNJX1NNX0FUVE4pCisJeworCQl1bnNpZ25lZCBjaGFyIG1zZ1syXTsKKworCQlzcGluX2xvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKwkJc21pX2luZm8tPmF0dGVudGlvbnMrKzsKKwkJc3Bpbl91bmxvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKworCQkvKiBHb3QgYSBhdHRuLCBzZW5kIGRvd24gYSBnZXQgbWVzc2FnZSBmbGFncyB0byBzZWUKKyAgICAgICAgICAgICAgICAgICB3aGF0J3MgY2F1c2luZyBpdC4gIEl0IHdvdWxkIGJlIGJldHRlciB0byBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICB0aGlzIGluIHRoZSB1cHBlciBsYXllciwgYnV0IGR1ZSB0byB0aGUgd2F5CisgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyB3b3JrIHdpdGggdGhlIFNNSSwgdGhhdCdzIG5vdCByZWFsbHkKKyAgICAgICAgICAgICAgICAgICBwb3NzaWJsZS4gKi8KKwkJbXNnWzBdID0gKElQTUlfTkVURk5fQVBQX1JFUVVFU1QgPDwgMik7CisJCW1zZ1sxXSA9IElQTUlfR0VUX01TR19GTEFHU19DTUQ7CisKKwkJc21pX2luZm8tPmhhbmRsZXJzLT5zdGFydF90cmFuc2FjdGlvbigKKwkJCXNtaV9pbmZvLT5zaV9zbSwgbXNnLCAyKTsKKwkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfR0VUVElOR19GTEFHUzsKKwkJZ290byByZXN0YXJ0OworCX0KKworCS8qIElmIHdlIGFyZSBjdXJyZW50bHkgaWRsZSwgdHJ5IHRvIHN0YXJ0IHRoZSBuZXh0IG1lc3NhZ2UuICovCisJaWYgKHNpX3NtX3Jlc3VsdCA9PSBTSV9TTV9JRExFKSB7CisJCXNwaW5fbG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCQlzbWlfaW5mby0+aWRsZXMrKzsKKwkJc3Bpbl91bmxvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKworCQlzaV9zbV9yZXN1bHQgPSBzdGFydF9uZXh0X21zZyhzbWlfaW5mbyk7CisJCWlmIChzaV9zbV9yZXN1bHQgIT0gU0lfU01fSURMRSkKKwkJCWdvdG8gcmVzdGFydDsKKyAgICAgICAgfQorCisJaWYgKChzaV9zbV9yZXN1bHQgPT0gU0lfU01fSURMRSkKKwkgICAgJiYgKGF0b21pY19yZWFkKCZzbWlfaW5mby0+cmVxX2V2ZW50cykpKQorCXsKKwkJLyogV2UgYXJlIGlkbGUgYW5kIHRoZSB1cHBlciBsYXllciByZXF1ZXN0ZWQgdGhhdCBJIGZldGNoCisJCSAgIGV2ZW50cywgc28gZG8gc28uICovCisJCXVuc2lnbmVkIGNoYXIgbXNnWzJdOworCisJCXNwaW5fbG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCQlzbWlfaW5mby0+ZmxhZ19mZXRjaGVzKys7CisJCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisKKwkJYXRvbWljX3NldCgmc21pX2luZm8tPnJlcV9ldmVudHMsIDApOworCQltc2dbMF0gPSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKTsKKwkJbXNnWzFdID0gSVBNSV9HRVRfTVNHX0ZMQUdTX0NNRDsKKworCQlzbWlfaW5mby0+aGFuZGxlcnMtPnN0YXJ0X3RyYW5zYWN0aW9uKAorCQkJc21pX2luZm8tPnNpX3NtLCBtc2csIDIpOworCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9HRVRUSU5HX0ZMQUdTOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJcmV0dXJuIHNpX3NtX3Jlc3VsdDsKK30KKworc3RhdGljIHZvaWQgc2VuZGVyKHZvaWQgICAgICAgICAgICAgICAgKnNlbmRfaW5mbywKKwkJICAgc3RydWN0IGlwbWlfc21pX21zZyAqbXNnLAorCQkgICBpbnQgICAgICAgICAgICAgICAgIHByaW9yaXR5KQoreworCXN0cnVjdCBzbWlfaW5mbyAgICpzbWlfaW5mbyA9IHNlbmRfaW5mbzsKKwllbnVtIHNpX3NtX3Jlc3VsdCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisjaWZkZWYgREVCVUdfVElNSU5HCisJc3RydWN0IHRpbWV2YWwgICAgdDsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJihzbWlfaW5mby0+bXNnX2xvY2spLCBmbGFncyk7CisjaWZkZWYgREVCVUdfVElNSU5HCisJZG9fZ2V0dGltZW9mZGF5KCZ0KTsKKwlwcmludGsoIioqRW5xdWV1ZTogJWQuJTkuOWRcbiIsIHQudHZfc2VjLCB0LnR2X3VzZWMpOworI2VuZGlmCisKKwlpZiAoc21pX2luZm8tPnJ1bl90b19jb21wbGV0aW9uKSB7CisJCS8qIElmIHdlIGFyZSBydW5uaW5nIHRvIGNvbXBsZXRpb24sIHRoZW4gdGhyb3cgaXQgaW4KKwkJICAgdGhlIGxpc3QgYW5kIHJ1biB0cmFuc2FjdGlvbnMgdW50aWwgZXZlcnl0aGluZyBpcworCQkgICBjbGVhci4gIFByaW9yaXR5IGRvZXNuJ3QgbWF0dGVyIGhlcmUuICovCisJCWxpc3RfYWRkX3RhaWwoJihtc2ctPmxpbmspLCAmKHNtaV9pbmZvLT54bWl0X21zZ3MpKTsKKworCQkvKiBXZSBoYXZlIHRvIHJlbGVhc2UgdGhlIG1zZyBsb2NrIGFuZCBjbGFpbSB0aGUgc21pCisJCSAgIGxvY2sgaW4gdGhpcyBjYXNlLCBiZWNhdXNlIG9mIHJhY2UgY29uZGl0aW9ucy4gKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHNtaV9pbmZvLT5tc2dfbG9jayksIGZsYWdzKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworCQlyZXN1bHQgPSBzbWlfZXZlbnRfaGFuZGxlcihzbWlfaW5mbywgMCk7CisJCXdoaWxlIChyZXN1bHQgIT0gU0lfU01fSURMRSkgeworCQkJdWRlbGF5KFNJX1NIT1JUX1RJTUVPVVRfVVNFQyk7CisJCQlyZXN1bHQgPSBzbWlfZXZlbnRfaGFuZGxlcihzbWlfaW5mbywKKwkJCQkJCSAgIFNJX1NIT1JUX1RJTUVPVVRfVVNFQyk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJaWYgKHByaW9yaXR5ID4gMCkgeworCQkJbGlzdF9hZGRfdGFpbCgmKG1zZy0+bGluayksICYoc21pX2luZm8tPmhwX3htaXRfbXNncykpOworCQl9IGVsc2UgeworCQkJbGlzdF9hZGRfdGFpbCgmKG1zZy0+bGluayksICYoc21pX2luZm8tPnhtaXRfbXNncykpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihzbWlfaW5mby0+bXNnX2xvY2spLCBmbGFncyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworCWlmICgoc21pX2luZm8tPnNpX3N0YXRlID09IFNJX05PUk1BTCkKKwkgICAgJiYgKHNtaV9pbmZvLT5jdXJyX21zZyA9PSBOVUxMKSkKKwl7CisJCXN0YXJ0X25leHRfbXNnKHNtaV9pbmZvKTsKKwkJc2lfcmVzdGFydF9zaG9ydF90aW1lcihzbWlfaW5mbyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihzbWlfaW5mby0+c2lfbG9jayksIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3J1bl90b19jb21wbGV0aW9uKHZvaWQgKnNlbmRfaW5mbywgaW50IGlfcnVuX3RvX2NvbXBsZXRpb24pCit7CisJc3RydWN0IHNtaV9pbmZvICAgKnNtaV9pbmZvID0gc2VuZF9pbmZvOworCWVudW0gc2lfc21fcmVzdWx0IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nICAgICBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoc21pX2luZm8tPnNpX2xvY2spLCBmbGFncyk7CisKKwlzbWlfaW5mby0+cnVuX3RvX2NvbXBsZXRpb24gPSBpX3J1bl90b19jb21wbGV0aW9uOworCWlmIChpX3J1bl90b19jb21wbGV0aW9uKSB7CisJCXJlc3VsdCA9IHNtaV9ldmVudF9oYW5kbGVyKHNtaV9pbmZvLCAwKTsKKwkJd2hpbGUgKHJlc3VsdCAhPSBTSV9TTV9JRExFKSB7CisJCQl1ZGVsYXkoU0lfU0hPUlRfVElNRU9VVF9VU0VDKTsKKwkJCXJlc3VsdCA9IHNtaV9ldmVudF9oYW5kbGVyKHNtaV9pbmZvLAorCQkJCQkJICAgU0lfU0hPUlRfVElNRU9VVF9VU0VDKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihzbWlfaW5mby0+c2lfbG9jayksIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcG9sbCh2b2lkICpzZW5kX2luZm8pCit7CisJc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbyA9IHNlbmRfaW5mbzsKKworCXNtaV9ldmVudF9oYW5kbGVyKHNtaV9pbmZvLCAwKTsKK30KKworc3RhdGljIHZvaWQgcmVxdWVzdF9ldmVudHModm9pZCAqc2VuZF9pbmZvKQoreworCXN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8gPSBzZW5kX2luZm87CisKKwlhdG9taWNfc2V0KCZzbWlfaW5mby0+cmVxX2V2ZW50cywgMSk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmIGFuZCB3aXRoIHRoZSBzaV9sb2NrIGhlbGQuICovCitzdGF0aWMgdm9pZCBzaV9yZXN0YXJ0X3Nob3J0X3RpbWVyKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCit7CisjaWYgZGVmaW5lZChDT05GSUdfSElHSF9SRVNfVElNRVJTKQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBqaWZmaWVzX25vdzsKKworCWlmIChkZWxfdGltZXIoJihzbWlfaW5mby0+c2lfdGltZXIpKSkgeworCQkvKiBJZiB3ZSBkb24ndCBkZWxldGUgdGhlIHRpbWVyLCB0aGVuIGl0IHdpbGwgZ28gb2ZmCisJCSAgIGltbWVkaWF0ZWx5LCBhbnl3YXkuICBTbyB3ZSBvbmx5IHByb2Nlc3MgaWYgd2UKKwkJICAgYWN0dWFsbHkgZGVsZXRlIHRoZSB0aW1lci4gKi8KKworCQkvKiBXZSBhbHJlYWR5IGhhdmUgaXJxc2F2ZSBvbiwgc28gbm8gbmVlZCBmb3IgaXQKKyAgICAgICAgICAgICAgICAgICBoZXJlLiAqLworCQlyZWFkX2xvY2soJnh0aW1lX2xvY2spOworCQlqaWZmaWVzX25vdyA9IGppZmZpZXM7CisJCXNtaV9pbmZvLT5zaV90aW1lci5leHBpcmVzID0gamlmZmllc19ub3c7CisJCXNtaV9pbmZvLT5zaV90aW1lci5zdWJfZXhwaXJlcyA9IGdldF9hcmNoX2N5Y2xlcyhqaWZmaWVzX25vdyk7CisKKwkJYWRkX3VzZWNfdG9fdGltZXIoJnNtaV9pbmZvLT5zaV90aW1lciwgU0lfU0hPUlRfVElNRU9VVF9VU0VDKTsKKworCQlhZGRfdGltZXIoJihzbWlfaW5mby0+c2lfdGltZXIpKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNtaV9pbmZvLT5jb3VudF9sb2NrLCBmbGFncyk7CisJCXNtaV9pbmZvLT50aW1lb3V0X3Jlc3RhcnRzKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtaV9pbmZvLT5jb3VudF9sb2NrLCBmbGFncyk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHNtaV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc21pX2luZm8gICAqc21pX2luZm8gPSAoc3RydWN0IHNtaV9pbmZvICopIGRhdGE7CisJZW51bSBzaV9zbV9yZXN1bHQgc21pX3Jlc3VsdDsKKwl1bnNpZ25lZCBsb25nICAgICBmbGFnczsKKwl1bnNpZ25lZCBsb25nICAgICBqaWZmaWVzX25vdzsKKwl1bnNpZ25lZCBsb25nICAgICB0aW1lX2RpZmY7CisjaWZkZWYgREVCVUdfVElNSU5HCisJc3RydWN0IHRpbWV2YWwgICAgdDsKKyNlbmRpZgorCisJaWYgKHNtaV9pbmZvLT5zdG9wX29wZXJhdGlvbikgeworCQlzbWlfaW5mby0+dGltZXJfc3RvcHBlZCA9IDE7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworI2lmZGVmIERFQlVHX1RJTUlORworCWRvX2dldHRpbWVvZmRheSgmdCk7CisJcHJpbnRrKCIqKlRpbWVyOiAlZC4lOS45ZFxuIiwgdC50dl9zZWMsIHQudHZfdXNlYyk7CisjZW5kaWYKKwlqaWZmaWVzX25vdyA9IGppZmZpZXM7CisJdGltZV9kaWZmID0gKChqaWZmaWVzX25vdyAtIHNtaV9pbmZvLT5sYXN0X3RpbWVvdXRfamlmZmllcykKKwkJICAgICAqIFNJX1VTRUNfUEVSX0pJRkZZKTsKKwlzbWlfcmVzdWx0ID0gc21pX2V2ZW50X2hhbmRsZXIoc21pX2luZm8sIHRpbWVfZGlmZik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoc21pX2luZm8tPnNpX2xvY2spLCBmbGFncyk7CisKKwlzbWlfaW5mby0+bGFzdF90aW1lb3V0X2ppZmZpZXMgPSBqaWZmaWVzX25vdzsKKworCWlmICgoc21pX2luZm8tPmlycSkgJiYgKCEgc21pX2luZm8tPmludGVycnVwdF9kaXNhYmxlZCkpIHsKKwkJLyogUnVubmluZyB3aXRoIGludGVycnVwdHMsIG9ubHkgZG8gbG9uZyB0aW1lb3V0cy4gKi8KKwkJc21pX2luZm8tPnNpX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgU0lfVElNRU9VVF9KSUZGSUVTOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc21pX2luZm8tPmNvdW50X2xvY2ssIGZsYWdzKTsKKwkJc21pX2luZm8tPmxvbmdfdGltZW91dHMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc21pX2luZm8tPmNvdW50X2xvY2ssIGZsYWdzKTsKKwkJZ290byBkb19hZGRfdGltZXI7CisJfQorCisJLyogSWYgdGhlIHN0YXRlIG1hY2hpbmUgYXNrcyBmb3IgYSBzaG9ydCBkZWxheSwgdGhlbiBzaG9ydGVuCisgICAgICAgICAgIHRoZSB0aW1lciB0aW1lb3V0LiAqLworCWlmIChzbWlfcmVzdWx0ID09IFNJX1NNX0NBTExfV0lUSF9ERUxBWSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc21pX2luZm8tPmNvdW50X2xvY2ssIGZsYWdzKTsKKwkJc21pX2luZm8tPnNob3J0X3RpbWVvdXRzKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtaV9pbmZvLT5jb3VudF9sb2NrLCBmbGFncyk7CisjaWYgZGVmaW5lZChDT05GSUdfSElHSF9SRVNfVElNRVJTKQorCQlyZWFkX2xvY2soJnh0aW1lX2xvY2spOworICAgICAgICAgICAgICAgIHNtaV9pbmZvLT5zaV90aW1lci5leHBpcmVzID0gamlmZmllczsKKyAgICAgICAgICAgICAgICBzbWlfaW5mby0+c2lfdGltZXIuc3ViX2V4cGlyZXMKKyAgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0X2FyY2hfY3ljbGVzKHNtaV9pbmZvLT5zaV90aW1lci5leHBpcmVzKTsKKyAgICAgICAgICAgICAgICByZWFkX3VubG9jaygmeHRpbWVfbG9jayk7CisJCWFkZF91c2VjX3RvX3RpbWVyKCZzbWlfaW5mby0+c2lfdGltZXIsIFNJX1NIT1JUX1RJTUVPVVRfVVNFQyk7CisjZWxzZQorCQlzbWlfaW5mby0+c2lfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxOworI2VuZGlmCisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNtaV9pbmZvLT5jb3VudF9sb2NrLCBmbGFncyk7CisJCXNtaV9pbmZvLT5sb25nX3RpbWVvdXRzKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtaV9pbmZvLT5jb3VudF9sb2NrLCBmbGFncyk7CisJCXNtaV9pbmZvLT5zaV90aW1lci5leHBpcmVzID0gamlmZmllcyArIFNJX1RJTUVPVVRfSklGRklFUzsKKyNpZiBkZWZpbmVkKENPTkZJR19ISUdIX1JFU19USU1FUlMpCisJCXNtaV9pbmZvLT5zaV90aW1lci5zdWJfZXhwaXJlcyA9IDA7CisjZW5kaWYKKwl9CisKKyBkb19hZGRfdGltZXI6CisJYWRkX3RpbWVyKCYoc21pX2luZm8tPnNpX3RpbWVyKSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzaV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvID0gZGF0YTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisjaWZkZWYgREVCVUdfVElNSU5HCisJc3RydWN0IHRpbWV2YWwgIHQ7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoc21pX2luZm8tPnNpX2xvY2spLCBmbGFncyk7CisKKwlzcGluX2xvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKwlzbWlfaW5mby0+aW50ZXJydXB0cysrOworCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisKKwlpZiAoc21pX2luZm8tPnN0b3Bfb3BlcmF0aW9uKQorCQlnb3RvIG91dDsKKworI2lmZGVmIERFQlVHX1RJTUlORworCWRvX2dldHRpbWVvZmRheSgmdCk7CisJcHJpbnRrKCIqKkludGVycnVwdDogJWQuJTkuOWRcbiIsIHQudHZfc2VjLCB0LnR2X3VzZWMpOworI2VuZGlmCisJc21pX2V2ZW50X2hhbmRsZXIoc21pX2luZm8sIDApOworIG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoc21pX2luZm8tPnNpX2xvY2spLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlwbWlfc21pX2hhbmRsZXJzIGhhbmRsZXJzID0KK3sKKwkub3duZXIgICAgICAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5zZW5kZXIJCQk9IHNlbmRlciwKKwkucmVxdWVzdF9ldmVudHMJCT0gcmVxdWVzdF9ldmVudHMsCisJLnNldF9ydW5fdG9fY29tcGxldGlvbiAgPSBzZXRfcnVuX3RvX2NvbXBsZXRpb24sCisJLnBvbGwJCQk9IHBvbGwsCit9OworCisvKiBUaGVyZSBjYW4gYmUgNCBJTyBwb3J0cyBwYXNzZWQgaW4gKHdpdGggb3Igd2l0aG91dCBJUlFzKSwgNCBhZGRyZXNzZXMsCisgICBhIGRlZmF1bHQgSU8gcG9ydCwgYW5kIDEgQUNQSS9TUE1JIGFkZHJlc3MuICBUaGF0IHNldHMgU0lfTUFYX0RSSVZFUlMgKi8KKworI2RlZmluZSBTSV9NQVhfUEFSTVMgNAorI2RlZmluZSBTSV9NQVhfRFJJVkVSUyAoKFNJX01BWF9QQVJNUyAqIDIpICsgMikKK3N0YXRpYyBzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvc1tTSV9NQVhfRFJJVkVSU10gPQoreyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisKKyNkZWZpbmUgREVWSUNFX05BTUUgImlwbWlfc2kiCisKKyNkZWZpbmUgREVGQVVMVF9LQ1NfSU9fUE9SVAkweGNhMgorI2RlZmluZSBERUZBVUxUX1NNSUNfSU9fUE9SVAkweGNhOQorI2RlZmluZSBERUZBVUxUX0JUX0lPX1BPUlQJMHhlNAorI2RlZmluZSBERUZBVUxUX1JFR1NQQUNJTkcJMQorCitzdGF0aWMgaW50ICAgICAgICAgICBzaV90cnlkZWZhdWx0cyA9IDE7CitzdGF0aWMgY2hhciAgICAgICAgICAqc2lfdHlwZVtTSV9NQVhfUEFSTVNdOworI2RlZmluZSBNQVhfU0lfVFlQRV9TVFIgMzAKK3N0YXRpYyBjaGFyICAgICAgICAgIHNpX3R5cGVfc3RyW01BWF9TSV9UWVBFX1NUUl07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBhZGRyc1tTSV9NQVhfUEFSTVNdOworc3RhdGljIGludCBudW1fYWRkcnM7CitzdGF0aWMgdW5zaWduZWQgaW50ICBwb3J0c1tTSV9NQVhfUEFSTVNdOworc3RhdGljIGludCBudW1fcG9ydHM7CitzdGF0aWMgaW50ICAgICAgICAgICBpcnFzW1NJX01BWF9QQVJNU107CitzdGF0aWMgaW50IG51bV9pcnFzOworc3RhdGljIGludCAgICAgICAgICAgcmVnc3BhY2luZ3NbU0lfTUFYX1BBUk1TXTsKK3N0YXRpYyBpbnQgbnVtX3JlZ3NwYWNpbmdzID0gMDsKK3N0YXRpYyBpbnQgICAgICAgICAgIHJlZ3NpemVzW1NJX01BWF9QQVJNU107CitzdGF0aWMgaW50IG51bV9yZWdzaXplcyA9IDA7CitzdGF0aWMgaW50ICAgICAgICAgICByZWdzaGlmdHNbU0lfTUFYX1BBUk1TXTsKK3N0YXRpYyBpbnQgbnVtX3JlZ3NoaWZ0cyA9IDA7CitzdGF0aWMgaW50IHNsYXZlX2FkZHJzW1NJX01BWF9QQVJNU107CitzdGF0aWMgaW50IG51bV9zbGF2ZV9hZGRycyA9IDA7CisKKworbW9kdWxlX3BhcmFtX25hbWVkKHRyeWRlZmF1bHRzLCBzaV90cnlkZWZhdWx0cywgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRyeWRlZmF1bHRzLCAiU2V0dGluZyB0aGlzIHRvICdmYWxzZScgd2lsbCBkaXNhYmxlIHRoZSIKKwkJICIgZGVmYXVsdCBzY2FuIG9mIHRoZSBLQ1MgYW5kIFNNSUMgaW50ZXJmYWNlIGF0IHRoZSBzdGFuZGFyZCIKKwkJICIgYWRkcmVzcyIpOworbW9kdWxlX3BhcmFtX3N0cmluZyh0eXBlLCBzaV90eXBlX3N0ciwgTUFYX1NJX1RZUEVfU1RSLCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModHlwZSwgIkRlZmluZXMgdGhlIHR5cGUgb2YgZWFjaCBpbnRlcmZhY2UsIGVhY2giCisJCSAiIGludGVyZmFjZSBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgVGhlIHR5cGVzIGFyZSAna2NzJywiCisJCSAiICdzbWljJywgYW5kICdidCcuICBGb3IgZXhhbXBsZSBzaV90eXBlPWtjcyxidCB3aWxsIHNldCIKKwkJICIgdGhlIGZpcnN0IGludGVyZmFjZSB0byBrY3MgYW5kIHRoZSBzZWNvbmQgdG8gYnQiKTsKK21vZHVsZV9wYXJhbV9hcnJheShhZGRycywgbG9uZywgJm51bV9hZGRycywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFkZHJzLCAiU2V0cyB0aGUgbWVtb3J5IGFkZHJlc3Mgb2YgZWFjaCBpbnRlcmZhY2UsIHRoZSIKKwkJICIgYWRkcmVzc2VzIHNlcGFyYXRlZCBieSBjb21tYXMuICBPbmx5IHVzZSBpZiBhbiBpbnRlcmZhY2UiCisJCSAiIGlzIGluIG1lbW9yeS4gIE90aGVyd2lzZSwgc2V0IGl0IHRvIHplcm8gb3IgbGVhdmUiCisJCSAiIGl0IGJsYW5rLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KHBvcnRzLCBpbnQsICZudW1fcG9ydHMsIDApOworTU9EVUxFX1BBUk1fREVTQyhwb3J0cywgIlNldHMgdGhlIHBvcnQgYWRkcmVzcyBvZiBlYWNoIGludGVyZmFjZSwgdGhlIgorCQkgIiBhZGRyZXNzZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIE9ubHkgdXNlIGlmIGFuIGludGVyZmFjZSIKKwkJICIgaXMgYSBwb3J0LiAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gemVybyBvciBsZWF2ZSIKKwkJICIgaXQgYmxhbmsuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxcywgaW50LCAmbnVtX2lycXMsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnFzLCAiU2V0cyB0aGUgaW50ZXJydXB0IG9mIGVhY2ggaW50ZXJmYWNlLCB0aGUiCisJCSAiIGFkZHJlc3NlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgT25seSB1c2UgaWYgYW4gaW50ZXJmYWNlIgorCQkgIiBoYXMgYW4gaW50ZXJydXB0LiAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gemVybyBvciBsZWF2ZSIKKwkJICIgaXQgYmxhbmsuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkocmVnc3BhY2luZ3MsIGludCwgJm51bV9yZWdzcGFjaW5ncywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlZ3NwYWNpbmdzLCAiVGhlIG51bWJlciBvZiBieXRlcyBiZXR3ZWVuIHRoZSBzdGFydCBhZGRyZXNzIgorCQkgIiBhbmQgZWFjaCBzdWNjZXNzaXZlIHJlZ2lzdGVyIHVzZWQgYnkgdGhlIGludGVyZmFjZS4gIEZvciIKKwkJICIgaW5zdGFuY2UsIGlmIHRoZSBzdGFydCBhZGRyZXNzIGlzIDB4Y2EyIGFuZCB0aGUgc3BhY2luZyIKKwkJICIgaXMgMiwgdGhlbiB0aGUgc2Vjb25kIGFkZHJlc3MgaXMgYXQgMHhjYTQuICBEZWZhdWx0cyIKKwkJICIgdG8gMS4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShyZWdzaXplcywgaW50LCAmbnVtX3JlZ3NpemVzLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVnc2l6ZXMsICJUaGUgc2l6ZSBvZiB0aGUgc3BlY2lmaWMgSVBNSSByZWdpc3RlciBpbiBieXRlcy4iCisJCSAiIFRoaXMgc2hvdWxkIGdlbmVyYWxseSBiZSAxLCAyLCA0LCBvciA4IGZvciBhbiA4LWJpdCwiCisJCSAiIDE2LWJpdCwgMzItYml0LCBvciA2NC1iaXQgcmVnaXN0ZXIuICBVc2UgdGhpcyBpZiB5b3UiCisJCSAiIHRoZSA4LWJpdCBJUE1JIHJlZ2lzdGVyIGhhcyB0byBiZSByZWFkIGZyb20gYSBsYXJnZXIiCisJCSAiIHJlZ2lzdGVyLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KHJlZ3NoaWZ0cywgaW50LCAmbnVtX3JlZ3NoaWZ0cywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlZ3NoaWZ0cywgIlRoZSBhbW91bnQgdG8gc2hpZnQgdGhlIGRhdGEgcmVhZCBmcm9tIHRoZS4iCisJCSAiIElQTUkgcmVnaXN0ZXIsIGluIGJpdHMuICBGb3IgaW5zdGFuY2UsIGlmIHRoZSBkYXRhIgorCQkgIiBpcyByZWFkIGZyb20gYSAzMi1iaXQgd29yZCBhbmQgdGhlIElQTUkgZGF0YSBpcyBpbiIKKwkJICIgYml0IDgtMTUsIHRoZW4gdGhlIHNoaWZ0IHdvdWxkIGJlIDgiKTsKK21vZHVsZV9wYXJhbV9hcnJheShzbGF2ZV9hZGRycywgaW50LCAmbnVtX3NsYXZlX2FkZHJzLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2xhdmVfYWRkcnMsICJTZXQgdGhlIGRlZmF1bHQgSVBNQiBzbGF2ZSBhZGRyZXNzIGZvciIKKwkJICIgdGhlIGNvbnRyb2xsZXIuICBOb3JtYWxseSB0aGlzIGlzIDB4MjAsIGJ1dCBjYW4gYmUiCisJCSAiIG92ZXJyaWRkZW4gYnkgdGhpcyBwYXJtLiAgVGhpcyBpcyBhbiBhcnJheSBpbmRleGVkIgorCQkgIiBieSBpbnRlcmZhY2UgbnVtYmVyLiIpOworCisKKyNkZWZpbmUgSVBNSV9NRU1fQUREUl9TUEFDRSAxCisjZGVmaW5lIElQTUlfSU9fQUREUl9TUEFDRSAgMgorCisjaWYgZGVmaW5lZChDT05GSUdfQUNQSV9JTlRFUlBSRVRFUikgfHwgZGVmaW5lZChDT05GSUdfWDg2KSB8fCBkZWZpbmVkKENPTkZJR19QQ0kpCitzdGF0aWMgaW50IGlzX25ld19pbnRlcmZhY2UoaW50IGludGYsIHU4IGFkZHJfc3BhY2UsIHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNJX01BWF9QQVJNUzsgKytpKSB7CisJCS8qIERvbid0IGNoZWNrIG91ciBhZGRyZXNzLiAqLworCQlpZiAoaSA9PSBpbnRmKQorCQkJY29udGludWU7CisJCWlmIChzaV90eXBlW2ldICE9IE5VTEwpIHsKKwkJCWlmICgoYWRkcl9zcGFjZSA9PSBJUE1JX01FTV9BRERSX1NQQUNFICYmCisJCQkgICAgIGJhc2VfYWRkciA9PSBhZGRyc1tpXSkgfHwKKwkJCSAgICAoYWRkcl9zcGFjZSA9PSBJUE1JX0lPX0FERFJfU1BBQ0UgJiYKKwkJCSAgICAgYmFzZV9hZGRyID09IHBvcnRzW2ldKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQllbHNlCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHN0ZF9pcnFfc2V0dXAoc3RydWN0IHNtaV9pbmZvICppbmZvKQoreworCWludCBydjsKKworCWlmICghaW5mby0+aXJxKQorCQlyZXR1cm4gMDsKKworCXJ2ID0gcmVxdWVzdF9pcnEoaW5mby0+aXJxLAorCQkJIHNpX2lycV9oYW5kbGVyLAorCQkJIFNBX0lOVEVSUlVQVCwKKwkJCSBERVZJQ0VfTkFNRSwKKwkJCSBpbmZvKTsKKwlpZiAocnYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImlwbWlfc2k6ICVzIHVuYWJsZSB0byBjbGFpbSBpbnRlcnJ1cHQgJWQsIgorCQkgICAgICAgIiBydW5uaW5nIHBvbGxlZFxuIiwKKwkJICAgICAgIERFVklDRV9OQU1FLCBpbmZvLT5pcnEpOworCQlpbmZvLT5pcnEgPSAwOworCX0gZWxzZSB7CisJCXByaW50aygiICBVc2luZyBpcnEgJWRcbiIsIGluZm8tPmlycSk7CisJfQorCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBzdGRfaXJxX2NsZWFudXAoc3RydWN0IHNtaV9pbmZvICppbmZvKQoreworCWlmICghaW5mby0+aXJxKQorCQlyZXR1cm47CisKKwlmcmVlX2lycShpbmZvLT5pcnEsIGluZm8pOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBwb3J0X2luYihzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGludCAqYWRkciA9IGlvLT5pbmZvOworCisJcmV0dXJuIGluYigoKmFkZHIpKyhvZmZzZXQqaW8tPnJlZ3NwYWNpbmcpKTsKK30KKworc3RhdGljIHZvaWQgcG9ydF9vdXRiKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgYikKK3sKKwl1bnNpZ25lZCBpbnQgKmFkZHIgPSBpby0+aW5mbzsKKworCW91dGIoYiwgKCphZGRyKSsob2Zmc2V0ICogaW8tPnJlZ3NwYWNpbmcpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcG9ydF9pbncoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgKmFkZHIgPSBpby0+aW5mbzsKKworCXJldHVybiAoaW53KCgqYWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSkgPj4gaW8tPnJlZ3NoaWZ0KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRfb3V0dyhzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkgICAgICB1bnNpZ25lZCBjaGFyIGIpCit7CisJdW5zaWduZWQgaW50ICphZGRyID0gaW8tPmluZm87CisKKwlvdXR3KGIgPDwgaW8tPnJlZ3NoaWZ0LCAoKmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBwb3J0X2lubChzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGludCAqYWRkciA9IGlvLT5pbmZvOworCisJcmV0dXJuIChpbmwoKCphZGRyKSsob2Zmc2V0ICogaW8tPnJlZ3NwYWNpbmcpKSA+PiBpby0+cmVnc2hpZnQpICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgcG9ydF9vdXRsKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgYikKK3sKKwl1bnNpZ25lZCBpbnQgKmFkZHIgPSBpby0+aW5mbzsKKworCW91dGwoYiA8PCBpby0+cmVnc2hpZnQsICgqYWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRfY2xlYW51cChzdHJ1Y3Qgc21pX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50ICphZGRyID0gaW5mby0+aW8uaW5mbzsKKwlpbnQgICAgICAgICAgIG1hcHNpemU7CisKKwlpZiAoYWRkciAmJiAoKmFkZHIpKSB7CisJCW1hcHNpemUgPSAoKGluZm8tPmlvX3NpemUgKiBpbmZvLT5pby5yZWdzcGFjaW5nKQorCQkJICAgLSAoaW5mby0+aW8ucmVnc3BhY2luZyAtIGluZm8tPmlvLnJlZ3NpemUpKTsKKworCQlyZWxlYXNlX3JlZ2lvbiAoKmFkZHIsIG1hcHNpemUpOworCX0KKwlrZnJlZShpbmZvKTsKK30KKworc3RhdGljIGludCBwb3J0X3NldHVwKHN0cnVjdCBzbWlfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgKmFkZHIgPSBpbmZvLT5pby5pbmZvOworCWludCAgICAgICAgICAgbWFwc2l6ZTsKKworCWlmICghYWRkciB8fCAoISphZGRyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbmZvLT5pb19jbGVhbnVwID0gcG9ydF9jbGVhbnVwOworCisJLyogRmlndXJlIG91dCB0aGUgYWN0dWFsIGluYi9pbncvaW5sL2V0YyByb3V0aW5lIHRvIHVzZSBiYXNlZAorCSAgIHVwb24gdGhlIHJlZ2lzdGVyIHNpemUuICovCisJc3dpdGNoIChpbmZvLT5pby5yZWdzaXplKSB7CisJY2FzZSAxOgorCQlpbmZvLT5pby5pbnB1dGIgPSBwb3J0X2luYjsKKwkJaW5mby0+aW8ub3V0cHV0YiA9IHBvcnRfb3V0YjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpbmZvLT5pby5pbnB1dGIgPSBwb3J0X2ludzsKKwkJaW5mby0+aW8ub3V0cHV0YiA9IHBvcnRfb3V0dzsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpbmZvLT5pby5pbnB1dGIgPSBwb3J0X2lubDsKKwkJaW5mby0+aW8ub3V0cHV0YiA9IHBvcnRfb3V0bDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJpcG1pX3NpOiBJbnZhbGlkIHJlZ2lzdGVyIHNpemU6ICVkXG4iLAorCQkgICAgICAgaW5mby0+aW8ucmVnc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENhbGN1bGF0ZSB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSB0byBjbGFpbS4gIFRoaXMgaXMgYW4KKwkgKiB1bnVzdWFsIGxvb2tpbmcgY2FsY3VsYXRpb24sIGJ1dCBpdCBhdm9pZHMgY2xhaW1pbmcgYW55CisJICogbW9yZSBtZW1vcnkgdGhhbiBpdCBoYXMgdG8uICBJdCB3aWxsIGNsYWltIGV2ZXJ5dGhpbmcKKwkgKiBiZXR3ZWVuIHRoZSBmaXJzdCBhZGRyZXNzIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QgZnVsbAorCSAqIHJlZ2lzdGVyLiAqLworCW1hcHNpemUgPSAoKGluZm8tPmlvX3NpemUgKiBpbmZvLT5pby5yZWdzcGFjaW5nKQorCQkgICAtIChpbmZvLT5pby5yZWdzcGFjaW5nIC0gaW5mby0+aW8ucmVnc2l6ZSkpOworCisJaWYgKHJlcXVlc3RfcmVnaW9uKCphZGRyLCBtYXBzaXplLCBERVZJQ0VfTkFNRSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X2luaXRfcG9ydChpbnQgaW50Zl9udW0sIHN0cnVjdCBzbWlfaW5mbyAqKm5ld19pbmZvKQoreworCXN0cnVjdCBzbWlfaW5mbyAqaW5mbzsKKworCWlmICghcG9ydHNbaW50Zl9udW1dKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghaXNfbmV3X2ludGVyZmFjZShpbnRmX251bSwgSVBNSV9JT19BRERSX1NQQUNFLAorCQkJICAgICAgcG9ydHNbaW50Zl9udW1dKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcG1pX3NpOiBDb3VsZCBub3QgYWxsb2NhdGUgU0kgZGF0YSAoMSlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCisJaW5mby0+aW9fc2V0dXAgPSBwb3J0X3NldHVwOworCWluZm8tPmlvLmluZm8gPSAmKHBvcnRzW2ludGZfbnVtXSk7CisJaW5mby0+aW8uYWRkciA9IE5VTEw7CisJaW5mby0+aW8ucmVnc3BhY2luZyA9IHJlZ3NwYWNpbmdzW2ludGZfbnVtXTsKKwlpZiAoIWluZm8tPmlvLnJlZ3NwYWNpbmcpCisJCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSBERUZBVUxUX1JFR1NQQUNJTkc7CisJaW5mby0+aW8ucmVnc2l6ZSA9IHJlZ3NpemVzW2ludGZfbnVtXTsKKwlpZiAoIWluZm8tPmlvLnJlZ3NpemUpCisJCWluZm8tPmlvLnJlZ3NpemUgPSBERUZBVUxUX1JFR1NQQUNJTkc7CisJaW5mby0+aW8ucmVnc2hpZnQgPSByZWdzaGlmdHNbaW50Zl9udW1dOworCWluZm8tPmlycSA9IDA7CisJaW5mby0+aXJxX3NldHVwID0gTlVMTDsKKwkqbmV3X2luZm8gPSBpbmZvOworCisJaWYgKHNpX3R5cGVbaW50Zl9udW1dID09IE5VTEwpCisJCXNpX3R5cGVbaW50Zl9udW1dID0gImtjcyI7CisKKwlwcmludGsoImlwbWlfc2k6IFRyeWluZyBcIiVzXCIgYXQgSS9PIHBvcnQgMHgleFxuIiwKKwkgICAgICAgc2lfdHlwZVtpbnRmX251bV0sIHBvcnRzW2ludGZfbnVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1lbV9pbmIoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZGIoKGlvLT5hZGRyKSsob2Zmc2V0ICogaW8tPnJlZ3NwYWNpbmcpKTsKK30KKworc3RhdGljIHZvaWQgbWVtX291dGIoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJICAgICB1bnNpZ25lZCBjaGFyIGIpCit7CisJd3JpdGViKGIsIChpby0+YWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1lbV9pbncoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKHJlYWR3KChpby0+YWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSkgPj4gaW8tPnJlZ3NoaWZ0KQorCQkmJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBtZW1fb3V0dyhzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkgICAgIHVuc2lnbmVkIGNoYXIgYikKK3sKKwl3cml0ZWIoYiA8PCBpby0+cmVnc2hpZnQsIChpby0+YWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1lbV9pbmwoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKHJlYWRsKChpby0+YWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSkgPj4gaW8tPnJlZ3NoaWZ0KQorCQkmJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBtZW1fb3V0bChzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkgICAgIHVuc2lnbmVkIGNoYXIgYikKK3sKKwl3cml0ZWwoYiA8PCBpby0+cmVnc2hpZnQsIChpby0+YWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSk7Cit9CisKKyNpZmRlZiByZWFkcQorc3RhdGljIHVuc2lnbmVkIGNoYXIgbWVtX2lucShzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXJldHVybiAocmVhZHEoKGlvLT5hZGRyKSsob2Zmc2V0ICogaW8tPnJlZ3NwYWNpbmcpKSA+PiBpby0+cmVnc2hpZnQpCisJCSYmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIG1lbV9vdXRxKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCSAgICAgdW5zaWduZWQgY2hhciBiKQoreworCXdyaXRlcShiIDw8IGlvLT5yZWdzaGlmdCwgKGlvLT5hZGRyKSsob2Zmc2V0ICogaW8tPnJlZ3NwYWNpbmcpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBtZW1fY2xlYW51cChzdHJ1Y3Qgc21pX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyAqYWRkciA9IGluZm8tPmlvLmluZm87CisJaW50ICAgICAgICAgICBtYXBzaXplOworCisJaWYgKGluZm8tPmlvLmFkZHIpIHsKKwkJaW91bm1hcChpbmZvLT5pby5hZGRyKTsKKworCQltYXBzaXplID0gKChpbmZvLT5pb19zaXplICogaW5mby0+aW8ucmVnc3BhY2luZykKKwkJCSAgIC0gKGluZm8tPmlvLnJlZ3NwYWNpbmcgLSBpbmZvLT5pby5yZWdzaXplKSk7CisKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKCphZGRyLCBtYXBzaXplKTsKKwl9CisJa2ZyZWUoaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgbWVtX3NldHVwKHN0cnVjdCBzbWlfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nICphZGRyID0gaW5mby0+aW8uaW5mbzsKKwlpbnQgICAgICAgICAgIG1hcHNpemU7CisKKwlpZiAoIWFkZHIgfHwgKCEqYWRkcikpCisJCXJldHVybiAtRU5PREVWOworCisJaW5mby0+aW9fY2xlYW51cCA9IG1lbV9jbGVhbnVwOworCisJLyogRmlndXJlIG91dCB0aGUgYWN0dWFsIHJlYWRiL3JlYWR3L3JlYWRsL2V0YyByb3V0aW5lIHRvIHVzZSBiYXNlZAorCSAgIHVwb24gdGhlIHJlZ2lzdGVyIHNpemUuICovCisJc3dpdGNoIChpbmZvLT5pby5yZWdzaXplKSB7CisJY2FzZSAxOgorCQlpbmZvLT5pby5pbnB1dGIgPSBtZW1faW5iOworCQlpbmZvLT5pby5vdXRwdXRiID0gbWVtX291dGI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaW5mby0+aW8uaW5wdXRiID0gbWVtX2ludzsKKwkJaW5mby0+aW8ub3V0cHV0YiA9IG1lbV9vdXR3OworCQlicmVhazsKKwljYXNlIDQ6CisJCWluZm8tPmlvLmlucHV0YiA9IG1lbV9pbmw7CisJCWluZm8tPmlvLm91dHB1dGIgPSBtZW1fb3V0bDsKKwkJYnJlYWs7CisjaWZkZWYgcmVhZHEKKwljYXNlIDg6CisJCWluZm8tPmlvLmlucHV0YiA9IG1lbV9pbnE7CisJCWluZm8tPmlvLm91dHB1dGIgPSBtZW1fb3V0cTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlwcmludGsoImlwbWlfc2k6IEludmFsaWQgcmVnaXN0ZXIgc2l6ZTogJWRcbiIsCisJCSAgICAgICBpbmZvLT5pby5yZWdzaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2FsY3VsYXRlIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IHRvIGNsYWltLiAgVGhpcyBpcyBhbgorCSAqIHVudXN1YWwgbG9va2luZyBjYWxjdWxhdGlvbiwgYnV0IGl0IGF2b2lkcyBjbGFpbWluZyBhbnkKKwkgKiBtb3JlIG1lbW9yeSB0aGFuIGl0IGhhcyB0by4gIEl0IHdpbGwgY2xhaW0gZXZlcnl0aGluZworCSAqIGJldHdlZW4gdGhlIGZpcnN0IGFkZHJlc3MgdG8gdGhlIGVuZCBvZiB0aGUgbGFzdCBmdWxsCisJICogcmVnaXN0ZXIuICovCisJbWFwc2l6ZSA9ICgoaW5mby0+aW9fc2l6ZSAqIGluZm8tPmlvLnJlZ3NwYWNpbmcpCisJCSAgIC0gKGluZm8tPmlvLnJlZ3NwYWNpbmcgLSBpbmZvLT5pby5yZWdzaXplKSk7CisKKwlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKCphZGRyLCBtYXBzaXplLCBERVZJQ0VfTkFNRSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisKKwlpbmZvLT5pby5hZGRyID0gaW9yZW1hcCgqYWRkciwgbWFwc2l6ZSk7CisJaWYgKGluZm8tPmlvLmFkZHIgPT0gTlVMTCkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oKmFkZHIsIG1hcHNpemUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X2luaXRfbWVtKGludCBpbnRmX251bSwgc3RydWN0IHNtaV9pbmZvICoqbmV3X2luZm8pCit7CisJc3RydWN0IHNtaV9pbmZvICppbmZvOworCisJaWYgKCFhZGRyc1tpbnRmX251bV0pCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFpc19uZXdfaW50ZXJmYWNlKGludGZfbnVtLCBJUE1JX01FTV9BRERSX1NQQUNFLAorCQkJICAgICAgYWRkcnNbaW50Zl9udW1dKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcG1pX3NpOiBDb3VsZCBub3QgYWxsb2NhdGUgU0kgZGF0YSAoMilcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCisJaW5mby0+aW9fc2V0dXAgPSBtZW1fc2V0dXA7CisJaW5mby0+aW8uaW5mbyA9ICZhZGRyc1tpbnRmX251bV07CisJaW5mby0+aW8uYWRkciA9IE5VTEw7CisJaW5mby0+aW8ucmVnc3BhY2luZyA9IHJlZ3NwYWNpbmdzW2ludGZfbnVtXTsKKwlpZiAoIWluZm8tPmlvLnJlZ3NwYWNpbmcpCisJCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSBERUZBVUxUX1JFR1NQQUNJTkc7CisJaW5mby0+aW8ucmVnc2l6ZSA9IHJlZ3NpemVzW2ludGZfbnVtXTsKKwlpZiAoIWluZm8tPmlvLnJlZ3NpemUpCisJCWluZm8tPmlvLnJlZ3NpemUgPSBERUZBVUxUX1JFR1NQQUNJTkc7CisJaW5mby0+aW8ucmVnc2hpZnQgPSByZWdzaGlmdHNbaW50Zl9udW1dOworCWluZm8tPmlycSA9IDA7CisJaW5mby0+aXJxX3NldHVwID0gTlVMTDsKKwkqbmV3X2luZm8gPSBpbmZvOworCisJaWYgKHNpX3R5cGVbaW50Zl9udW1dID09IE5VTEwpCisJCXNpX3R5cGVbaW50Zl9udW1dID0gImtjcyI7CisKKwlwcmludGsoImlwbWlfc2k6IFRyeWluZyBcIiVzXCIgYXQgbWVtb3J5IGFkZHJlc3MgMHglbHhcbiIsCisJICAgICAgIHNpX3R5cGVbaW50Zl9udW1dLCBhZGRyc1tpbnRmX251bV0pOworCXJldHVybiAwOworfQorCisKKyNpZmRlZiBDT05GSUdfQUNQSV9JTlRFUlBSRVRFUgorCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorCisvKiBPbmNlIHdlIGdldCBhbiBBQ1BJIGZhaWx1cmUsIHdlIGRvbid0IHRyeSBhbnkgbW9yZSwgYmVjYXVzZSB3ZSBnbworICAgdGhyb3VnaCB0aGUgdGFibGVzIHNlcXVlbnRpYWxseS4gIE9uY2Ugd2UgZG9uJ3QgZmluZCBhIHRhYmxlLCB0aGVyZQorICAgYXJlIG5vIG1vcmUuICovCitzdGF0aWMgaW50IGFjcGlfZmFpbHVyZSA9IDA7CisKKy8qIEZvciBHUEUtdHlwZSBpbnRlcnJ1cHRzLiAqLworc3RhdGljIHUzMiBpcG1pX2FjcGlfZ3BlKHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbyA9IGNvbnRleHQ7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworI2lmZGVmIERFQlVHX1RJTUlORworCXN0cnVjdCB0aW1ldmFsIHQ7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoc21pX2luZm8tPnNpX2xvY2spLCBmbGFncyk7CisKKwlzcGluX2xvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKwlzbWlfaW5mby0+aW50ZXJydXB0cysrOworCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisKKwlpZiAoc21pX2luZm8tPnN0b3Bfb3BlcmF0aW9uKQorCQlnb3RvIG91dDsKKworI2lmZGVmIERFQlVHX1RJTUlORworCWRvX2dldHRpbWVvZmRheSgmdCk7CisJcHJpbnRrKCIqKkFDUElfR1BFOiAlZC4lOS45ZFxuIiwgdC50dl9zZWMsIHQudHZfdXNlYyk7CisjZW5kaWYKKwlzbWlfZXZlbnRfaGFuZGxlcihzbWlfaW5mbywgMCk7Cisgb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihzbWlfaW5mby0+c2lfbG9jayksIGZsYWdzKTsKKworCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGFjcGlfZ3BlX2lycV9zZXR1cChzdHJ1Y3Qgc21pX2luZm8gKmluZm8pCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKCFpbmZvLT5pcnEpCisJCXJldHVybiAwOworCisJLyogRklYTUUgLSBpcyBsZXZlbCB0cmlnZ2VyZWQgcmlnaHQ/ICovCisJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyKE5VTEwsCisJCQkJCSAgaW5mby0+aXJxLAorCQkJCQkgIEFDUElfR1BFX0xFVkVMX1RSSUdHRVJFRCwKKwkJCQkJICAmaXBtaV9hY3BpX2dwZSwKKwkJCQkJICBpbmZvKTsKKwlpZiAoc3RhdHVzICE9IEFFX09LKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJpcG1pX3NpOiAlcyB1bmFibGUgdG8gY2xhaW0gQUNQSSBHUEUgJWQsIgorCQkgICAgICAgIiBydW5uaW5nIHBvbGxlZFxuIiwKKwkJICAgICAgIERFVklDRV9OQU1FLCBpbmZvLT5pcnEpOworCQlpbmZvLT5pcnEgPSAwOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlwcmludGsoIiAgVXNpbmcgQUNQSSBHUEUgJWRcbiIsIGluZm8tPmlycSk7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHZvaWQgYWNwaV9ncGVfaXJxX2NsZWFudXAoc3RydWN0IHNtaV9pbmZvICppbmZvKQoreworCWlmICghaW5mby0+aXJxKQorCQlyZXR1cm47CisKKwlhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcihOVUxMLCBpbmZvLT5pcnEsICZpcG1pX2FjcGlfZ3BlKTsKK30KKworLyoKKyAqIERlZmluZWQgYXQKKyAqIGh0dHA6Ly9oMjEwMDcud3d3Mi5ocC5jb20vZHNwcC9maWxlcy91bnByb3RlY3RlZC9kZXZyZXNvdXJjZS9Eb2NzL1RlY2hQYXBlcnMvSUE2NC9ocHNwbWkucGRmCisgKi8KK3N0cnVjdCBTUE1JVGFibGUgeworCXM4CVNpZ25hdHVyZVs0XTsKKwl1MzIJTGVuZ3RoOworCXU4CVJldmlzaW9uOworCXU4CUNoZWNrc3VtOworCXM4CU9FTUlEWzZdOworCXM4CU9FTVRhYmxlSURbOF07CisJczgJT0VNUmV2aXNpb25bNF07CisJczgJQ3JlYXRvcklEWzRdOworCXM4CUNyZWF0b3JSZXZpc2lvbls0XTsKKwl1OAlJbnRlcmZhY2VUeXBlOworCXU4CUlQTUlsZWdhY3k7CisJczE2CVNwZWNpZmljYXRpb25SZXZpc2lvbjsKKworCS8qCisJICogQml0IDAgLSBTQ0kgaW50ZXJydXB0IHN1cHBvcnRlZAorCSAqIEJpdCAxIC0gSS9PIEFQSUMvU0FQSUMKKwkgKi8KKwl1OAlJbnRlcnJ1cHRUeXBlOworCisJLyogSWYgYml0IDAgb2YgSW50ZXJydXB0VHlwZSBpcyBzZXQsIHRoZW4gdGhpcyBpcyB0aGUgU0NJCisgICAgICAgICAgIGludGVycnVwdCBpbiB0aGUgR1BFeF9TVFMgcmVnaXN0ZXIuICovCisJdTgJR1BFOworCisJczE2CVJlc2VydmVkOworCisJLyogSWYgYml0IDEgb2YgSW50ZXJydXB0VHlwZSBpcyBzZXQsIHRoZW4gdGhpcyBpcyB0aGUgSS9PCisgICAgICAgICAgIEFQSUMvU0FQSUMgaW50ZXJydXB0LiAqLworCXUzMglHbG9iYWxTeXN0ZW1JbnRlcnJ1cHQ7CisKKwkvKiBUaGUgYWN0dWFsIHJlZ2lzdGVyIGFkZHJlc3MuICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGFkZHI7CisKKwl1OAlVSURbNF07CisKKwlzOCAgICAgIHNwbWlfaWRbMV07IC8qIEEgJ1wwJyB0ZXJtaW5hdGVkIGFycmF5IHN0YXJ0cyBoZXJlLiAqLworfTsKKworc3RhdGljIGludCB0cnlfaW5pdF9hY3BpKGludCBpbnRmX251bSwgc3RydWN0IHNtaV9pbmZvICoqbmV3X2luZm8pCit7CisJc3RydWN0IHNtaV9pbmZvICAqaW5mbzsKKwlhY3BpX3N0YXR1cyAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgU1BNSVRhYmxlICpzcG1pOworCWNoYXIgICAgICAgICAgICAgKmlvX3R5cGU7CisJdTggCQkgYWRkcl9zcGFjZTsKKworCWlmIChhY3BpX2ZhaWx1cmUpCisJCXJldHVybiAtRU5PREVWOworCisJc3RhdHVzID0gYWNwaV9nZXRfZmlybXdhcmVfdGFibGUoIlNQTUkiLCBpbnRmX251bSsxLAorCQkJCQkgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsCisJCQkJCSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqKSAmc3BtaSk7CisJaWYgKHN0YXR1cyAhPSBBRV9PSykgeworCQlhY3BpX2ZhaWx1cmUgPSAxOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoc3BtaS0+SVBNSWxlZ2FjeSAhPSAxKSB7CisJICAgIHByaW50ayhLRVJOX0lORk8gIklQTUk6IEJhZCBTUE1JIGxlZ2FjeSAlZFxuIiwgc3BtaS0+SVBNSWxlZ2FjeSk7CisgIAkgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHNwbWktPmFkZHIuYWRkcmVzc19zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZKQorCQlhZGRyX3NwYWNlID0gSVBNSV9NRU1fQUREUl9TUEFDRTsKKwllbHNlCisJCWFkZHJfc3BhY2UgPSBJUE1JX0lPX0FERFJfU1BBQ0U7CisJaWYgKCFpc19uZXdfaW50ZXJmYWNlKC0xLCBhZGRyX3NwYWNlLCBzcG1pLT5hZGRyLmFkZHJlc3MpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghc3BtaS0+YWRkci5yZWdpc3Rlcl9iaXRfd2lkdGgpIHsKKwkJYWNwaV9mYWlsdXJlID0gMTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogRmlndXJlIG91dCB0aGUgaW50ZXJmYWNlIHR5cGUuICovCisJc3dpdGNoIChzcG1pLT5JbnRlcmZhY2VUeXBlKQorCXsKKwljYXNlIDE6CS8qIEtDUyAqLworCQlzaV90eXBlW2ludGZfbnVtXSA9ICJrY3MiOworCQlicmVhazsKKworCWNhc2UgMjoJLyogU01JQyAqLworCQlzaV90eXBlW2ludGZfbnVtXSA9ICJzbWljIjsKKwkJYnJlYWs7CisKKwljYXNlIDM6CS8qIEJUICovCisJCXNpX3R5cGVbaW50Zl9udW1dID0gImJ0IjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJpcG1pX3NpOiBVbmtub3duIEFDUEkvU1BNSSBTSSB0eXBlICVkXG4iLAorCQkJc3BtaS0+SW50ZXJmYWNlVHlwZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykgeworCQlwcmludGsoS0VSTl9FUlIgImlwbWlfc2k6IENvdWxkIG5vdCBhbGxvY2F0ZSBTSSBkYXRhICgzKVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisKKwlpZiAoc3BtaS0+SW50ZXJydXB0VHlwZSAmIDEpIHsKKwkJLyogV2UndmUgZ290IGEgR1BFIGludGVycnVwdC4gKi8KKwkJaW5mby0+aXJxID0gc3BtaS0+R1BFOworCQlpbmZvLT5pcnFfc2V0dXAgPSBhY3BpX2dwZV9pcnFfc2V0dXA7CisJCWluZm8tPmlycV9jbGVhbnVwID0gYWNwaV9ncGVfaXJxX2NsZWFudXA7CisJfSBlbHNlIGlmIChzcG1pLT5JbnRlcnJ1cHRUeXBlICYgMikgeworCQkvKiBXZSd2ZSBnb3QgYW4gQVBJQy9TQVBJQyBpbnRlcnJ1cHQuICovCisJCWluZm8tPmlycSA9IHNwbWktPkdsb2JhbFN5c3RlbUludGVycnVwdDsKKwkJaW5mby0+aXJxX3NldHVwID0gc3RkX2lycV9zZXR1cDsKKwkJaW5mby0+aXJxX2NsZWFudXAgPSBzdGRfaXJxX2NsZWFudXA7CisJfSBlbHNlIHsKKwkJLyogVXNlIHRoZSBkZWZhdWx0IGludGVycnVwdCBzZXR0aW5nLiAqLworCQlpbmZvLT5pcnEgPSAwOworCQlpbmZvLT5pcnFfc2V0dXAgPSBOVUxMOworCX0KKworCXJlZ3NwYWNpbmdzW2ludGZfbnVtXSA9IHNwbWktPmFkZHIucmVnaXN0ZXJfYml0X3dpZHRoIC8gODsKKwlpbmZvLT5pby5yZWdzcGFjaW5nID0gc3BtaS0+YWRkci5yZWdpc3Rlcl9iaXRfd2lkdGggLyA4OworCXJlZ3NpemVzW2ludGZfbnVtXSA9IHJlZ3NwYWNpbmdzW2ludGZfbnVtXTsKKwlpbmZvLT5pby5yZWdzaXplID0gcmVnc2l6ZXNbaW50Zl9udW1dOworCXJlZ3NoaWZ0c1tpbnRmX251bV0gPSBzcG1pLT5hZGRyLnJlZ2lzdGVyX2JpdF9vZmZzZXQ7CisJaW5mby0+aW8ucmVnc2hpZnQgPSByZWdzaGlmdHNbaW50Zl9udW1dOworCisJaWYgKHNwbWktPmFkZHIuYWRkcmVzc19zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZKSB7CisJCWlvX3R5cGUgPSAibWVtb3J5IjsKKwkJaW5mby0+aW9fc2V0dXAgPSBtZW1fc2V0dXA7CisJCWFkZHJzW2ludGZfbnVtXSA9IHNwbWktPmFkZHIuYWRkcmVzczsKKwkJaW5mby0+aW8uaW5mbyA9ICYoYWRkcnNbaW50Zl9udW1dKTsKKwl9IGVsc2UgaWYgKHNwbWktPmFkZHIuYWRkcmVzc19zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pIHsKKwkJaW9fdHlwZSA9ICJJL08iOworCQlpbmZvLT5pb19zZXR1cCA9IHBvcnRfc2V0dXA7CisJCXBvcnRzW2ludGZfbnVtXSA9IHNwbWktPmFkZHIuYWRkcmVzczsKKwkJaW5mby0+aW8uaW5mbyA9ICYocG9ydHNbaW50Zl9udW1dKTsKKwl9IGVsc2UgeworCQlrZnJlZShpbmZvKTsKKwkJcHJpbnRrKCJpcG1pX3NpOiBVbmtub3duIEFDUEkgSS9PIEFkZHJlc3MgdHlwZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCSpuZXdfaW5mbyA9IGluZm87CisKKwlwcmludGsoImlwbWlfc2k6IEFDUEkvU1BNSSBzcGVjaWZpZXMgXCIlc1wiICVzIFNJIEAgMHglbHhcbiIsCisJICAgICAgIHNpX3R5cGVbaW50Zl9udW1dLCBpb190eXBlLCAodW5zaWduZWQgbG9uZykgc3BtaS0+YWRkci5hZGRyZXNzKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1g4NgordHlwZWRlZiBzdHJ1Y3QgZG1pX2lwbWlfZGF0YQoreworCXU4ICAgCQl0eXBlOworCXU4ICAgCQlhZGRyX3NwYWNlOworCXVuc2lnbmVkIGxvbmcJYmFzZV9hZGRyOworCXU4ICAgCQlpcnE7CisJdTggICAgICAgICAgICAgIG9mZnNldDsKKwl1OCAgICAgICAgICAgICAgc2xhdmVfYWRkcjsKK30gZG1pX2lwbWlfZGF0YV90OworCitzdGF0aWMgZG1pX2lwbWlfZGF0YV90IGRtaV9kYXRhW1NJX01BWF9EUklWRVJTXTsKK3N0YXRpYyBpbnQgZG1pX2RhdGFfZW50cmllczsKKwordHlwZWRlZiBzdHJ1Y3QgZG1pX2hlYWRlcgoreworCXU4CXR5cGU7CisJdTgJbGVuZ3RoOworCXUxNgloYW5kbGU7Cit9IGRtaV9oZWFkZXJfdDsKKworc3RhdGljIGludCBkZWNvZGVfZG1pKGRtaV9oZWFkZXJfdCAqZG0sIGludCBpbnRmX251bSkKK3sKKwl1OAkJKmRhdGEgPSAodTggKilkbTsKKwl1bnNpZ25lZCBsb25nICAJYmFzZV9hZGRyOworCXU4CQlyZWdfc3BhY2luZzsKKwl1OCAgICAgICAgICAgICAgbGVuID0gZG0tPmxlbmd0aDsKKwlkbWlfaXBtaV9kYXRhX3QgKmlwbWlfZGF0YSA9IGRtaV9kYXRhK2ludGZfbnVtOworCisJaXBtaV9kYXRhLT50eXBlID0gZGF0YVs0XTsKKworCW1lbWNweSgmYmFzZV9hZGRyLCBkYXRhKzgsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJaWYgKGxlbiA+PSAweDExKSB7CisJCWlmIChiYXNlX2FkZHIgJiAxKSB7CisJCQkvKiBJL08gKi8KKwkJCWJhc2VfYWRkciAmPSAweEZGRkU7CisJCQlpcG1pX2RhdGEtPmFkZHJfc3BhY2UgPSBJUE1JX0lPX0FERFJfU1BBQ0U7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBNZW1vcnkgKi8KKwkJCWlwbWlfZGF0YS0+YWRkcl9zcGFjZSA9IElQTUlfTUVNX0FERFJfU1BBQ0U7CisJCX0KKwkJLyogSWYgYml0IDQgb2YgYnl0ZSAweDEwIGlzIHNldCwgdGhlbiB0aGUgbHNiIGZvciB0aGUgYWRkcmVzcworCQkgICBpcyBvZGQuICovCisJCWlwbWlfZGF0YS0+YmFzZV9hZGRyID0gYmFzZV9hZGRyIHwgKChkYXRhWzB4MTBdICYgMHgxMCkgPj4gNCk7CisKKwkJaXBtaV9kYXRhLT5pcnEgPSBkYXRhWzB4MTFdOworCisJCS8qIFRoZSB0b3AgdHdvIGJpdHMgb2YgYnl0ZSAweDEwIGhvbGQgdGhlIHJlZ2lzdGVyIHNwYWNpbmcuICovCisJCXJlZ19zcGFjaW5nID0gKGRhdGFbMHgxMF0gJiAweEMwKSA+PiA2OworCQlzd2l0Y2gocmVnX3NwYWNpbmcpeworCQljYXNlIDB4MDA6IC8qIEJ5dGUgYm91bmRhcmllcyAqLworCQkgICAgaXBtaV9kYXRhLT5vZmZzZXQgPSAxOworCQkgICAgYnJlYWs7CisJCWNhc2UgMHgwMTogLyogMzItYml0IGJvdW5kYXJpZXMgKi8KKwkJICAgIGlwbWlfZGF0YS0+b2Zmc2V0ID0gNDsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4MDI6IC8qIDE2LWJ5dGUgYm91bmRhcmllcyAqLworCQkgICAgaXBtaV9kYXRhLT5vZmZzZXQgPSAxNjsKKwkJICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgICAgLyogU29tZSBvdGhlciBpbnRlcmZhY2UsIGp1c3QgaWdub3JlIGl0LiAqLworCQkgICAgcmV0dXJuIC1FSU87CisJCX0KKwl9IGVsc2UgeworCQkvKiBPbGQgRE1JIHNwZWMuICovCisJCWlwbWlfZGF0YS0+YmFzZV9hZGRyID0gYmFzZV9hZGRyOworCQlpcG1pX2RhdGEtPmFkZHJfc3BhY2UgPSBJUE1JX0lPX0FERFJfU1BBQ0U7CisJCWlwbWlfZGF0YS0+b2Zmc2V0ID0gMTsKKwl9CisKKwlpcG1pX2RhdGEtPnNsYXZlX2FkZHIgPSBkYXRhWzZdOworCisJaWYgKGlzX25ld19pbnRlcmZhY2UoLTEsIGlwbWlfZGF0YS0+YWRkcl9zcGFjZSxpcG1pX2RhdGEtPmJhc2VfYWRkcikpIHsKKwkJZG1pX2RhdGFfZW50cmllcysrOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQoaXBtaV9kYXRhLCAwLCBzaXplb2YoZG1pX2lwbWlfZGF0YV90KSk7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZG1pX3RhYmxlKHUzMiBiYXNlLCBpbnQgbGVuLCBpbnQgbnVtKQoreworCXU4IAkJICAqYnVmOworCXN0cnVjdCBkbWlfaGVhZGVyICpkbTsKKwl1OCAJCSAgKmRhdGE7CisJaW50IAkJICBpPTE7CisJaW50CQkgIHN0YXR1cz0tMTsKKwlpbnQgICAgICAgICAgICAgICBpbnRmX251bSA9IDA7CisKKwlidWYgPSBpb3JlbWFwKGJhc2UsIGxlbik7CisJaWYoYnVmPT1OVUxMKQorCQlyZXR1cm4gLTE7CisKKwlkYXRhID0gYnVmOworCisJd2hpbGUoaTxudW0gJiYgKGRhdGEgLSBidWYpIDwgbGVuKQorCXsKKwkJZG09KGRtaV9oZWFkZXJfdCAqKWRhdGE7CisKKwkJaWYoKGRhdGEtYnVmK2RtLT5sZW5ndGgpID49IGxlbikKKyAgICAgICAgCQlicmVhazsKKworCQlpZiAoZG0tPnR5cGUgPT0gMzgpIHsKKwkJCWlmIChkZWNvZGVfZG1pKGRtLCBpbnRmX251bSkgPT0gMCkgeworCQkJCWludGZfbnVtKys7CisJCQkJaWYgKGludGZfbnVtID49IFNJX01BWF9EUklWRVJTKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJICAgICAgICBkYXRhKz1kbS0+bGVuZ3RoOworCQl3aGlsZSgoZGF0YS1idWYpIDwgbGVuICYmICgqZGF0YSB8fCBkYXRhWzFdKSkKKwkJCWRhdGErKzsKKwkJZGF0YSs9MjsKKwkJaSsrOworCX0KKwlpb3VubWFwKGJ1Zik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbmxpbmUgc3RhdGljIGludCBkbWlfY2hlY2tzdW0odTggKmJ1ZikKK3sKKwl1OCAgIHN1bT0wOworCWludCAgYTsKKworCWZvcihhPTA7IGE8MTU7IGErKykKKwkJc3VtKz1idWZbYV07CisJcmV0dXJuIChzdW09PTApOworfQorCitzdGF0aWMgaW50IGRtaV9kZWNvZGUodm9pZCkKK3sKKwl1OCAgIGJ1ZlsxNV07CisJdTMyICBmcD0weEYwMDAwOworCisjaWZkZWYgQ09ORklHX1NJTU5PVworCXJldHVybiAtMTsKKyNlbmRpZgorCisJd2hpbGUoZnAgPCAweEZGRkZGKQorCXsKKwkJaXNhX21lbWNweV9mcm9taW8oYnVmLCBmcCwgMTUpOworCQlpZihtZW1jbXAoYnVmLCAiX0RNSV8iLCA1KT09MCAmJiBkbWlfY2hlY2tzdW0oYnVmKSkKKwkJeworCQkJdTE2IG51bT1idWZbMTNdPDw4fGJ1ZlsxMl07CisJCQl1MTYgbGVuPWJ1Zls3XTw8OHxidWZbNl07CisJCQl1MzIgYmFzZT1idWZbMTFdPDwyNHxidWZbMTBdPDwxNnxidWZbOV08PDh8YnVmWzhdOworCisJCQlpZihkbWlfdGFibGUoYmFzZSwgbGVuLCBudW0pID09IDApCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJZnArPTE2OworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB0cnlfaW5pdF9zbWJpb3MoaW50IGludGZfbnVtLCBzdHJ1Y3Qgc21pX2luZm8gKipuZXdfaW5mbykKK3sKKwlzdHJ1Y3Qgc21pX2luZm8gICAqaW5mbzsKKwlkbWlfaXBtaV9kYXRhX3QgICAqaXBtaV9kYXRhID0gZG1pX2RhdGEraW50Zl9udW07CisJY2hhciAgICAgICAgICAgICAgKmlvX3R5cGU7CisKKwlpZiAoaW50Zl9udW0gPj0gZG1pX2RhdGFfZW50cmllcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2goaXBtaV9kYXRhLT50eXBlKSB7CisJCWNhc2UgMHgwMTogLyogS0NTICovCisJCQlzaV90eXBlW2ludGZfbnVtXSA9ICJrY3MiOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMjogLyogU01JQyAqLworCQkJc2lfdHlwZVtpbnRmX251bV0gPSAic21pYyI7CisJCQlicmVhazsKKwkJY2FzZSAweDAzOiAvKiBCVCAqLworCQkJc2lfdHlwZVtpbnRmX251bV0gPSAiYnQiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcG1pX3NpOiBDb3VsZCBub3QgYWxsb2NhdGUgU0kgZGF0YSAoNClcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCisJaWYgKGlwbWlfZGF0YS0+YWRkcl9zcGFjZSA9PSAxKSB7CisJCWlvX3R5cGUgPSAibWVtb3J5IjsKKwkJaW5mby0+aW9fc2V0dXAgPSBtZW1fc2V0dXA7CisJCWFkZHJzW2ludGZfbnVtXSA9IGlwbWlfZGF0YS0+YmFzZV9hZGRyOworCQlpbmZvLT5pby5pbmZvID0gJihhZGRyc1tpbnRmX251bV0pOworCX0gZWxzZSBpZiAoaXBtaV9kYXRhLT5hZGRyX3NwYWNlID09IDIpIHsKKwkJaW9fdHlwZSA9ICJJL08iOworCQlpbmZvLT5pb19zZXR1cCA9IHBvcnRfc2V0dXA7CisJCXBvcnRzW2ludGZfbnVtXSA9IGlwbWlfZGF0YS0+YmFzZV9hZGRyOworCQlpbmZvLT5pby5pbmZvID0gJihwb3J0c1tpbnRmX251bV0pOworCX0gZWxzZSB7CisJCWtmcmVlKGluZm8pOworCQlwcmludGsoImlwbWlfc2k6IFVua25vd24gU01CSU9TIEkvTyBBZGRyZXNzIHR5cGUuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmVnc3BhY2luZ3NbaW50Zl9udW1dID0gaXBtaV9kYXRhLT5vZmZzZXQ7CisJaW5mby0+aW8ucmVnc3BhY2luZyA9IHJlZ3NwYWNpbmdzW2ludGZfbnVtXTsKKwlpZiAoIWluZm8tPmlvLnJlZ3NwYWNpbmcpCisJCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSBERUZBVUxUX1JFR1NQQUNJTkc7CisJaW5mby0+aW8ucmVnc2l6ZSA9IERFRkFVTFRfUkVHU1BBQ0lORzsKKwlpbmZvLT5pby5yZWdzaGlmdCA9IHJlZ3NoaWZ0c1tpbnRmX251bV07CisKKwlpbmZvLT5zbGF2ZV9hZGRyID0gaXBtaV9kYXRhLT5zbGF2ZV9hZGRyOworCisJaXJxc1tpbnRmX251bV0gPSBpcG1pX2RhdGEtPmlycTsKKworCSpuZXdfaW5mbyA9IGluZm87CisKKwlwcmludGsoImlwbWlfc2k6IEZvdW5kIFNNQklPUy1zcGVjaWZpZWQgc3RhdGUgbWFjaGluZSBhdCAlcyIKKwkgICAgICAgIiBhZGRyZXNzIDB4JWx4LCBzbGF2ZSBhZGRyZXNzIDB4JXhcbiIsCisJICAgICAgIGlvX3R5cGUsICh1bnNpZ25lZCBsb25nKWlwbWlfZGF0YS0+YmFzZV9hZGRyLAorCSAgICAgICBpcG1pX2RhdGEtPnNsYXZlX2FkZHIpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19YODYgKi8KKworI2lmZGVmIENPTkZJR19QQ0kKKworI2RlZmluZSBQQ0lfRVJNQ19DTEFTU0NPREUgIDB4MEMwNzAwCisjZGVmaW5lIFBDSV9IUF9WRU5ET1JfSUQgICAgMHgxMDNDCisjZGVmaW5lIFBDSV9NTUNfREVWSUNFX0lEICAgMHgxMjFBCisjZGVmaW5lIFBDSV9NTUNfQUREUl9DVyAgICAgMHgxMAorCisvKiBBdm9pZCBtb3JlIHRoYW4gb25lIGF0dGVtcHQgdG8gcHJvYmUgcGNpIHNtaWMuICovCitzdGF0aWMgaW50IHBjaV9zbWljX2NoZWNrZWQgPSAwOworCitzdGF0aWMgaW50IGZpbmRfcGNpX3NtaWMoaW50IGludGZfbnVtLCBzdHJ1Y3Qgc21pX2luZm8gKipuZXdfaW5mbykKK3sKKwlzdHJ1Y3Qgc21pX2luZm8gICppbmZvOworCWludCAgICAgICAgICAgICAgZXJyb3I7CisJc3RydWN0IHBjaV9kZXYgICAqcGNpX2RldiA9IE5VTEw7CisJdTE2ICAgIAkJIGJhc2VfYWRkcjsKKwlpbnQgICAgICAgICAgICAgIGZlX3JtYyA9IDA7CisKKwlpZiAocGNpX3NtaWNfY2hlY2tlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwY2lfc21pY19jaGVja2VkID0gMTsKKworCWlmICgocGNpX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9IUF9WRU5ET1JfSUQsIFBDSV9NTUNfREVWSUNFX0lELAorCQkJCSAgICAgICBOVUxMKSkpCisJCTsKKwllbHNlIGlmICgocGNpX2RldiA9IHBjaV9nZXRfY2xhc3MoUENJX0VSTUNfQ0xBU1NDT0RFLCBOVUxMKSkgJiYKKwkJIHBjaV9kZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX0hQX1ZFTkRPUl9JRCkKKwkJZmVfcm1jID0gMTsKKwllbHNlCisJCXJldHVybiAtRU5PREVWOworCisJZXJyb3IgPSBwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfTU1DX0FERFJfQ1csICZiYXNlX2FkZHIpOworCWlmIChlcnJvcikKKwl7CisJCXBjaV9kZXZfcHV0KHBjaV9kZXYpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpcG1pX3NpOiBwY2lfcmVhZF9jb25maWdfd29yZCgpIGZhaWxlZCAoJWQpLlxuIiwKKwkJICAgICAgIGVycm9yKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogQml0IDA6IDEgc3BlY2lmaWVzIHByb2dyYW1tZWQgSS9PLCAwIHNwZWNpZmllcyBtZW1vcnkgbWFwcGVkIEkvTyAqLworCWlmICghKGJhc2VfYWRkciAmIDB4MDAwMSkpCisJeworCQlwY2lfZGV2X3B1dChwY2lfZGV2KTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaXBtaV9zaTogbWVtb3J5IG1hcHBlZCBJL08gbm90IHN1cHBvcnRlZCBmb3IgUENJIgorCQkgICAgICAgIiBzbWljLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWJhc2VfYWRkciAmPSAweEZGRkU7CisJaWYgKCFmZV9ybWMpCisJCS8qIERhdGEgcmVnaXN0ZXIgc3RhcnRzIGF0IGJhc2UgYWRkcmVzcyArIDEgaW4gZVJNQyAqLworCQkrK2Jhc2VfYWRkcjsKKworCWlmICghaXNfbmV3X2ludGVyZmFjZSgtMSwgSVBNSV9JT19BRERSX1NQQUNFLCBiYXNlX2FkZHIpKSB7CisJCXBjaV9kZXZfcHV0KHBjaV9kZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pIHsKKwkJcGNpX2Rldl9wdXQocGNpX2Rldik7CisJCXByaW50ayhLRVJOX0VSUiAiaXBtaV9zaTogQ291bGQgbm90IGFsbG9jYXRlIFNJIGRhdGEgKDUpXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKworCWluZm8tPmlvX3NldHVwID0gcG9ydF9zZXR1cDsKKwlwb3J0c1tpbnRmX251bV0gPSBiYXNlX2FkZHI7CisJaW5mby0+aW8uaW5mbyA9ICYocG9ydHNbaW50Zl9udW1dKTsKKwlpbmZvLT5pby5yZWdzcGFjaW5nID0gcmVnc3BhY2luZ3NbaW50Zl9udW1dOworCWlmICghaW5mby0+aW8ucmVnc3BhY2luZykKKwkJaW5mby0+aW8ucmVnc3BhY2luZyA9IERFRkFVTFRfUkVHU1BBQ0lORzsKKwlpbmZvLT5pby5yZWdzaXplID0gREVGQVVMVF9SRUdTUEFDSU5HOworCWluZm8tPmlvLnJlZ3NoaWZ0ID0gcmVnc2hpZnRzW2ludGZfbnVtXTsKKworCSpuZXdfaW5mbyA9IGluZm87CisKKwlpcnFzW2ludGZfbnVtXSA9IHBjaV9kZXYtPmlycTsKKwlzaV90eXBlW2ludGZfbnVtXSA9ICJzbWljIjsKKworCXByaW50aygiaXBtaV9zaTogRm91bmQgUENJIFNNSUMgYXQgSS9PIGFkZHJlc3MgMHglbHhcbiIsCisJCShsb25nIHVuc2lnbmVkIGludCkgYmFzZV9hZGRyKTsKKworCXBjaV9kZXZfcHV0KHBjaV9kZXYpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworc3RhdGljIGludCB0cnlfaW5pdF9wbHVnX2FuZF9wbGF5KGludCBpbnRmX251bSwgc3RydWN0IHNtaV9pbmZvICoqbmV3X2luZm8pCit7CisjaWZkZWYgQ09ORklHX1BDSQorCWlmIChmaW5kX3BjaV9zbWljKGludGZfbnVtLCBuZXdfaW5mbyk9PTApCisJCXJldHVybiAwOworI2VuZGlmCisJLyogSW5jbHVkZSBvdGhlciBtZXRob2RzIGhlcmUuICovCisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCitzdGF0aWMgaW50IHRyeV9nZXRfZGV2X2lkKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCit7CisJdW5zaWduZWQgY2hhciAgICAgIG1zZ1syXTsKKwl1bnNpZ25lZCBjaGFyICAgICAgKnJlc3A7CisJdW5zaWduZWQgbG9uZyAgICAgIHJlc3BfbGVuOworCWVudW0gc2lfc21fcmVzdWx0IHNtaV9yZXN1bHQ7CisJaW50ICAgICAgICAgICAgICAgcnYgPSAwOworCisJcmVzcCA9IGttYWxsb2MoSVBNSV9NQVhfTVNHX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIERvIGEgR2V0IERldmljZSBJRCBjb21tYW5kLCBzaW5jZSBpdCBjb21lcyBiYWNrIHdpdGggc29tZQorCSAgIHVzZWZ1bCBpbmZvLiAqLworCW1zZ1swXSA9IElQTUlfTkVURk5fQVBQX1JFUVVFU1QgPDwgMjsKKwltc2dbMV0gPSBJUE1JX0dFVF9ERVZJQ0VfSURfQ01EOworCXNtaV9pbmZvLT5oYW5kbGVycy0+c3RhcnRfdHJhbnNhY3Rpb24oc21pX2luZm8tPnNpX3NtLCBtc2csIDIpOworCisJc21pX3Jlc3VsdCA9IHNtaV9pbmZvLT5oYW5kbGVycy0+ZXZlbnQoc21pX2luZm8tPnNpX3NtLCAwKTsKKwlmb3IgKDs7KQorCXsKKwkJaWYgKHNtaV9yZXN1bHQgPT0gU0lfU01fQ0FMTF9XSVRIX0RFTEFZKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQkJc21pX3Jlc3VsdCA9IHNtaV9pbmZvLT5oYW5kbGVycy0+ZXZlbnQoCisJCQkJc21pX2luZm8tPnNpX3NtLCAxMDApOworCQl9CisJCWVsc2UgaWYgKHNtaV9yZXN1bHQgPT0gU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZKQorCQl7CisJCQlzbWlfcmVzdWx0ID0gc21pX2luZm8tPmhhbmRsZXJzLT5ldmVudCgKKwkJCQlzbWlfaW5mby0+c2lfc20sIDApOworCQl9CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlpZiAoc21pX3Jlc3VsdCA9PSBTSV9TTV9IT1NFRCkgeworCQkvKiBXZSBjb3VsZG4ndCBnZXQgdGhlIHN0YXRlIG1hY2hpbmUgdG8gcnVuLCBzbyB3aGF0ZXZlcidzIGF0CisJCSAgIHRoZSBwb3J0IGlzIHByb2JhYmx5IG5vdCBhbiBJUE1JIFNNSSBpbnRlcmZhY2UuICovCisJCXJ2ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJLyogT3RoZXJ3aXNlLCB3ZSBnb3Qgc29tZSBkYXRhLiAqLworCXJlc3BfbGVuID0gc21pX2luZm8tPmhhbmRsZXJzLT5nZXRfcmVzdWx0KHNtaV9pbmZvLT5zaV9zbSwKKwkJCQkJCSAgcmVzcCwgSVBNSV9NQVhfTVNHX0xFTkdUSCk7CisJaWYgKHJlc3BfbGVuIDwgNikgeworCQkvKiBUaGF0J3Mgb2RkLCBpdCBzaG91bGQgYmUgbG9uZ2VyLiAqLworCQlydiA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgocmVzcFsxXSAhPSBJUE1JX0dFVF9ERVZJQ0VfSURfQ01EKSB8fCAocmVzcFsyXSAhPSAwKSkgeworCQkvKiBUaGF0J3Mgb2RkLCBpdCBzaG91bGRuJ3QgYmUgYWJsZSB0byBmYWlsLiAqLworCQlydiA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFJlY29yZCBpbmZvIGZyb20gdGhlIGdldCBkZXZpY2UgaWQsIGluIGNhc2Ugd2UgbmVlZCBpdC4gKi8KKwlzbWlfaW5mby0+aXBtaV9zaV9kZXZfcmV2ID0gcmVzcFs0XSAmIDB4ZjsKKwlzbWlfaW5mby0+aXBtaV9zaV9md19yZXZfbWFqb3IgPSByZXNwWzVdICYgMHg3ZjsKKwlzbWlfaW5mby0+aXBtaV9zaV9md19yZXZfbWlub3IgPSByZXNwWzZdOworCXNtaV9pbmZvLT5pcG1pX3ZlcnNpb25fbWFqb3IgPSByZXNwWzddICYgMHhmOworCXNtaV9pbmZvLT5pcG1pX3ZlcnNpb25fbWlub3IgPSByZXNwWzddID4+IDQ7CisKKyBvdXQ6CisJa2ZyZWUocmVzcCk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IHR5cGVfZmlsZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICAgICAgICAgICAgKm91dCA9IChjaGFyICopIHBhZ2U7CisJc3RydWN0IHNtaV9pbmZvICpzbWkgPSBkYXRhOworCisJc3dpdGNoIChzbWktPnNpX3R5cGUpIHsKKwkgICAgY2FzZSBTSV9LQ1M6CisJCXJldHVybiBzcHJpbnRmKG91dCwgImtjc1xuIik7CisJICAgIGNhc2UgU0lfU01JQzoKKwkJcmV0dXJuIHNwcmludGYob3V0LCAic21pY1xuIik7CisJICAgIGNhc2UgU0lfQlQ6CisJCXJldHVybiBzcHJpbnRmKG91dCwgImJ0XG4iKTsKKwkgICAgZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IHN0YXRfZmlsZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICAgICAgICAgICAgKm91dCA9IChjaGFyICopIHBhZ2U7CisJc3RydWN0IHNtaV9pbmZvICpzbWkgPSBkYXRhOworCisJb3V0ICs9IHNwcmludGYob3V0LCAiaW50ZXJydXB0c19lbmFibGVkOiAgICAlZFxuIiwKKwkJICAgICAgIHNtaS0+aXJxICYmICFzbWktPmludGVycnVwdF9kaXNhYmxlZCk7CisJb3V0ICs9IHNwcmludGYob3V0LCAic2hvcnRfdGltZW91dHM6ICAgICAgICAlbGRcbiIsCisJCSAgICAgICBzbWktPnNob3J0X3RpbWVvdXRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJsb25nX3RpbWVvdXRzOiAgICAgICAgICVsZFxuIiwKKwkJICAgICAgIHNtaS0+bG9uZ190aW1lb3V0cyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAidGltZW91dF9yZXN0YXJ0czogICAgICAlbGRcbiIsCisJCSAgICAgICBzbWktPnRpbWVvdXRfcmVzdGFydHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImlkbGVzOiAgICAgICAgICAgICAgICAgJWxkXG4iLAorCQkgICAgICAgc21pLT5pZGxlcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiaW50ZXJydXB0czogICAgICAgICAgICAlbGRcbiIsCisJCSAgICAgICBzbWktPmludGVycnVwdHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImF0dGVudGlvbnM6ICAgICAgICAgICAgJWxkXG4iLAorCQkgICAgICAgc21pLT5hdHRlbnRpb25zKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJmbGFnX2ZldGNoZXM6ICAgICAgICAgICVsZFxuIiwKKwkJICAgICAgIHNtaS0+ZmxhZ19mZXRjaGVzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJob3NlZF9jb3VudDogICAgICAgICAgICVsZFxuIiwKKwkJICAgICAgIHNtaS0+aG9zZWRfY291bnQpOworCW91dCArPSBzcHJpbnRmKG91dCwgImNvbXBsZXRlX3RyYW5zYWN0aW9uczogJWxkXG4iLAorCQkgICAgICAgc21pLT5jb21wbGV0ZV90cmFuc2FjdGlvbnMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImV2ZW50czogICAgICAgICAgICAgICAgJWxkXG4iLAorCQkgICAgICAgc21pLT5ldmVudHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgIndhdGNoZG9nX3ByZXRpbWVvdXRzOiAgJWxkXG4iLAorCQkgICAgICAgc21pLT53YXRjaGRvZ19wcmV0aW1lb3V0cyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiaW5jb21pbmdfbWVzc2FnZXM6ICAgICAlbGRcbiIsCisJCSAgICAgICBzbWktPmluY29taW5nX21lc3NhZ2VzKTsKKworCXJldHVybiAob3V0IC0gKChjaGFyICopIHBhZ2UpKTsKK30KKworLyogUmV0dXJucyAwIGlmIGluaXRpYWxpemVkLCBvciBuZWdhdGl2ZSBvbiBhbiBlcnJvci4gKi8KK3N0YXRpYyBpbnQgaW5pdF9vbmVfc21pKGludCBpbnRmX251bSwgc3RydWN0IHNtaV9pbmZvICoqc21pKQoreworCWludAkJcnY7CisJc3RydWN0IHNtaV9pbmZvICpuZXdfc21pOworCisKKwlydiA9IHRyeV9pbml0X21lbShpbnRmX251bSwgJm5ld19zbWkpOworCWlmIChydikKKwkJcnYgPSB0cnlfaW5pdF9wb3J0KGludGZfbnVtLCAmbmV3X3NtaSk7CisjaWZkZWYgQ09ORklHX0FDUElfSU5URVJQUkVURVIKKwlpZiAoKHJ2KSAmJiAoc2lfdHJ5ZGVmYXVsdHMpKSB7CisJCXJ2ID0gdHJ5X2luaXRfYWNwaShpbnRmX251bSwgJm5ld19zbWkpOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19YODYKKwlpZiAoKHJ2KSAmJiAoc2lfdHJ5ZGVmYXVsdHMpKSB7CisJCXJ2ID0gdHJ5X2luaXRfc21iaW9zKGludGZfbnVtLCAmbmV3X3NtaSk7CisgICAgICAgIH0KKyNlbmRpZgorCWlmICgocnYpICYmIChzaV90cnlkZWZhdWx0cykpIHsKKwkJcnYgPSB0cnlfaW5pdF9wbHVnX2FuZF9wbGF5KGludGZfbnVtLCAmbmV3X3NtaSk7CisJfQorCisKKwlpZiAocnYpCisJCXJldHVybiBydjsKKworCS8qIFNvIHdlIGtub3cgbm90IHRvIGZyZWUgaXQgdW5sZXNzIHdlIGhhdmUgYWxsb2NhdGVkIG9uZS4gKi8KKwluZXdfc21pLT5pbnRmID0gTlVMTDsKKwluZXdfc21pLT5zaV9zbSA9IE5VTEw7CisJbmV3X3NtaS0+aGFuZGxlcnMgPSBOVUxMOworCisJaWYgKCFuZXdfc21pLT5pcnFfc2V0dXApIHsKKwkJbmV3X3NtaS0+aXJxID0gaXJxc1tpbnRmX251bV07CisJCW5ld19zbWktPmlycV9zZXR1cCA9IHN0ZF9pcnFfc2V0dXA7CisJCW5ld19zbWktPmlycV9jbGVhbnVwID0gc3RkX2lycV9jbGVhbnVwOworCX0KKworCS8qIERlZmF1bHQgdG8gS0NTIGlmIG5vIHR5cGUgaXMgc3BlY2lmaWVkLiAqLworCWlmIChzaV90eXBlW2ludGZfbnVtXSA9PSBOVUxMKSB7CisJCWlmIChzaV90cnlkZWZhdWx0cykKKwkJCXNpX3R5cGVbaW50Zl9udW1dID0gImtjcyI7CisJCWVsc2UgeworCQkJcnYgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZXJyOworCQl9CisJfQorCisJLyogU2V0IHVwIHRoZSBzdGF0ZSBtYWNoaW5lIHRvIHVzZS4gKi8KKwlpZiAoc3RyY21wKHNpX3R5cGVbaW50Zl9udW1dLCAia2NzIikgPT0gMCkgeworCQluZXdfc21pLT5oYW5kbGVycyA9ICZrY3Nfc21pX2hhbmRsZXJzOworCQluZXdfc21pLT5zaV90eXBlID0gU0lfS0NTOworCX0gZWxzZSBpZiAoc3RyY21wKHNpX3R5cGVbaW50Zl9udW1dLCAic21pYyIpID09IDApIHsKKwkJbmV3X3NtaS0+aGFuZGxlcnMgPSAmc21pY19zbWlfaGFuZGxlcnM7CisJCW5ld19zbWktPnNpX3R5cGUgPSBTSV9TTUlDOworCX0gZWxzZSBpZiAoc3RyY21wKHNpX3R5cGVbaW50Zl9udW1dLCAiYnQiKSA9PSAwKSB7CisJCW5ld19zbWktPmhhbmRsZXJzID0gJmJ0X3NtaV9oYW5kbGVyczsKKwkJbmV3X3NtaS0+c2lfdHlwZSA9IFNJX0JUOworCX0gZWxzZSB7CisJCS8qIE5vIHN1cHBvcnQgZm9yIGFueXRoaW5nIGVsc2UgeWV0LiAqLworCQlydiA9IC1FSU87CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgc3RhdGUgbWFjaGluZSdzIGRhdGEgYW5kIGluaXRpYWxpemUgaXQuICovCisJbmV3X3NtaS0+c2lfc20gPSBrbWFsbG9jKG5ld19zbWktPmhhbmRsZXJzLT5zaXplKCksIEdGUF9LRVJORUwpOworCWlmICghbmV3X3NtaS0+c2lfc20pIHsKKwkJcHJpbnRrKCIgQ291bGQgbm90IGFsbG9jYXRlIHN0YXRlIG1hY2hpbmUgbWVtb3J5XG4iKTsKKwkJcnYgPSAtRU5PTUVNOworCQlnb3RvIG91dF9lcnI7CisJfQorCW5ld19zbWktPmlvX3NpemUgPSBuZXdfc21pLT5oYW5kbGVycy0+aW5pdF9kYXRhKG5ld19zbWktPnNpX3NtLAorCQkJCQkJCSZuZXdfc21pLT5pbyk7CisKKwkvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBJL08gc2l6ZSwgd2UgY2FuIHNldCB1cCB0aGUgSS9PLiAqLworCXJ2ID0gbmV3X3NtaS0+aW9fc2V0dXAobmV3X3NtaSk7CisJaWYgKHJ2KSB7CisJCXByaW50aygiIENvdWxkIG5vdCBzZXQgdXAgSS9PIHNwYWNlXG4iKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCXNwaW5fbG9ja19pbml0KCYobmV3X3NtaS0+c2lfbG9jaykpOworCXNwaW5fbG9ja19pbml0KCYobmV3X3NtaS0+bXNnX2xvY2spKTsKKwlzcGluX2xvY2tfaW5pdCgmKG5ld19zbWktPmNvdW50X2xvY2spKTsKKworCS8qIERvIGxvdy1sZXZlbCBkZXRlY3Rpb24gZmlyc3QuICovCisJaWYgKG5ld19zbWktPmhhbmRsZXJzLT5kZXRlY3QobmV3X3NtaS0+c2lfc20pKSB7CisJCXJ2ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZXJyOworCX0KKworCS8qIEF0dGVtcHQgYSBnZXQgZGV2aWNlIGlkIGNvbW1hbmQuICBJZiBpdCBmYWlscywgd2UgcHJvYmFibHkKKyAgICAgICAgICAgZG9uJ3QgaGF2ZSBhIFNNSSBoZXJlLiAqLworCXJ2ID0gdHJ5X2dldF9kZXZfaWQobmV3X3NtaSk7CisJaWYgKHJ2KQorCQlnb3RvIG91dF9lcnI7CisKKwkvKiBUcnkgdG8gY2xhaW0gYW55IGludGVycnVwdHMuICovCisJbmV3X3NtaS0+aXJxX3NldHVwKG5ld19zbWkpOworCisJSU5JVF9MSVNUX0hFQUQoJihuZXdfc21pLT54bWl0X21zZ3MpKTsKKwlJTklUX0xJU1RfSEVBRCgmKG5ld19zbWktPmhwX3htaXRfbXNncykpOworCW5ld19zbWktPmN1cnJfbXNnID0gTlVMTDsKKwlhdG9taWNfc2V0KCZuZXdfc21pLT5yZXFfZXZlbnRzLCAwKTsKKwluZXdfc21pLT5ydW5fdG9fY29tcGxldGlvbiA9IDA7CisKKwluZXdfc21pLT5pbnRlcnJ1cHRfZGlzYWJsZWQgPSAwOworCW5ld19zbWktPnRpbWVyX3N0b3BwZWQgPSAwOworCW5ld19zbWktPnN0b3Bfb3BlcmF0aW9uID0gMDsKKworCS8qIFN0YXJ0IGNsZWFyaW5nIHRoZSBmbGFncyBiZWZvcmUgd2UgZW5hYmxlIGludGVycnVwdHMgb3IgdGhlCisJICAgdGltZXIgdG8gYXZvaWQgcmFjaW5nIHdpdGggdGhlIHRpbWVyLiAqLworCXN0YXJ0X2NsZWFyX2ZsYWdzKG5ld19zbWkpOworCS8qIElSUSBpcyBkZWZpbmVkIHRvIGJlIHNldCB3aGVuIG5vbi16ZXJvLiAqLworCWlmIChuZXdfc21pLT5pcnEpCisJCW5ld19zbWktPnNpX3N0YXRlID0gU0lfQ0xFQVJJTkdfRkxBR1NfVEhFTl9TRVRfSVJROworCisJLyogVGhlIGlwbWlfcmVnaXN0ZXJfc21pKCkgY29kZSBkb2VzIHNvbWUgb3BlcmF0aW9ucyB0bworCSAgIGRldGVybWluZSB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiwgc28gd2UgbXVzdCBiZSByZWFkeSB0bworCSAgIGhhbmRsZSBvcGVyYXRpb25zIGJlZm9yZSBpdCBpcyBjYWxsZWQuICBUaGlzIG1lYW5zIHdlIGhhdmUKKwkgICB0byBzdG9wIHRoZSB0aW1lciBpZiB3ZSBnZXQgYW4gZXJyb3IgYWZ0ZXIgdGhpcyBwb2ludC4gKi8KKwlpbml0X3RpbWVyKCYobmV3X3NtaS0+c2lfdGltZXIpKTsKKwluZXdfc21pLT5zaV90aW1lci5kYXRhID0gKGxvbmcpIG5ld19zbWk7CisJbmV3X3NtaS0+c2lfdGltZXIuZnVuY3Rpb24gPSBzbWlfdGltZW91dDsKKwluZXdfc21pLT5sYXN0X3RpbWVvdXRfamlmZmllcyA9IGppZmZpZXM7CisJbmV3X3NtaS0+c2lfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBTSV9USU1FT1VUX0pJRkZJRVM7CisJYWRkX3RpbWVyKCYobmV3X3NtaS0+c2lfdGltZXIpKTsKKworCXJ2ID0gaXBtaV9yZWdpc3Rlcl9zbWkoJmhhbmRsZXJzLAorCQkJICAgICAgIG5ld19zbWksCisJCQkgICAgICAgbmV3X3NtaS0+aXBtaV92ZXJzaW9uX21ham9yLAorCQkJICAgICAgIG5ld19zbWktPmlwbWlfdmVyc2lvbl9taW5vciwKKwkJCSAgICAgICBuZXdfc21pLT5zbGF2ZV9hZGRyLAorCQkJICAgICAgICYobmV3X3NtaS0+aW50ZikpOworCWlmIChydikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpcG1pX3NpOiBVbmFibGUgdG8gcmVnaXN0ZXIgZGV2aWNlOiBlcnJvciAlZFxuIiwKKwkJICAgICAgIHJ2KTsKKwkJZ290byBvdXRfZXJyX3N0b3BfdGltZXI7CisJfQorCisJcnYgPSBpcG1pX3NtaV9hZGRfcHJvY19lbnRyeShuZXdfc21pLT5pbnRmLCAidHlwZSIsCisJCQkJICAgICB0eXBlX2ZpbGVfcmVhZF9wcm9jLCBOVUxMLAorCQkJCSAgICAgbmV3X3NtaSwgVEhJU19NT0RVTEUpOworCWlmIChydikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpcG1pX3NpOiBVbmFibGUgdG8gY3JlYXRlIHByb2MgZW50cnk6ICVkXG4iLAorCQkgICAgICAgcnYpOworCQlnb3RvIG91dF9lcnJfc3RvcF90aW1lcjsKKwl9CisKKwlydiA9IGlwbWlfc21pX2FkZF9wcm9jX2VudHJ5KG5ld19zbWktPmludGYsICJzaV9zdGF0cyIsCisJCQkJICAgICBzdGF0X2ZpbGVfcmVhZF9wcm9jLCBOVUxMLAorCQkJCSAgICAgbmV3X3NtaSwgVEhJU19NT0RVTEUpOworCWlmIChydikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpcG1pX3NpOiBVbmFibGUgdG8gY3JlYXRlIHByb2MgZW50cnk6ICVkXG4iLAorCQkgICAgICAgcnYpOworCQlnb3RvIG91dF9lcnJfc3RvcF90aW1lcjsKKwl9CisKKwkqc21pID0gbmV3X3NtaTsKKworCXByaW50aygiIElQTUkgJXMgaW50ZXJmYWNlIGluaXRpYWxpemVkXG4iLCBzaV90eXBlW2ludGZfbnVtXSk7CisKKwlyZXR1cm4gMDsKKworIG91dF9lcnJfc3RvcF90aW1lcjoKKwluZXdfc21pLT5zdG9wX29wZXJhdGlvbiA9IDE7CisKKwkvKiBXYWl0IGZvciB0aGUgdGltZXIgdG8gc3RvcC4gIFRoaXMgYXZvaWRzIHByb2JsZW1zIHdpdGggcmFjZQorCSAgIGNvbmRpdGlvbnMgcmVtb3ZpbmcgdGhlIHRpbWVyIGhlcmUuICovCisJd2hpbGUgKCFuZXdfc21pLT50aW1lcl9zdG9wcGVkKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKyBvdXRfZXJyOgorCWlmIChuZXdfc21pLT5pbnRmKQorCQlpcG1pX3VucmVnaXN0ZXJfc21pKG5ld19zbWktPmludGYpOworCisJbmV3X3NtaS0+aXJxX2NsZWFudXAobmV3X3NtaSk7CisKKwkvKiBXYWl0IHVudGlsIHdlIGtub3cgdGhhdCB3ZSBhcmUgb3V0IG9mIGFueSBpbnRlcnJ1cHQKKwkgICBoYW5kbGVycyBtaWdodCBoYXZlIGJlZW4gcnVubmluZyBiZWZvcmUgd2UgZnJlZWQgdGhlCisJICAgaW50ZXJydXB0LiAqLworCXN5bmNocm9uaXplX2tlcm5lbCgpOworCisJaWYgKG5ld19zbWktPnNpX3NtKSB7CisJCWlmIChuZXdfc21pLT5oYW5kbGVycykKKwkJCW5ld19zbWktPmhhbmRsZXJzLT5jbGVhbnVwKG5ld19zbWktPnNpX3NtKTsKKwkJa2ZyZWUobmV3X3NtaS0+c2lfc20pOworCX0KKwluZXdfc21pLT5pb19jbGVhbnVwKG5ld19zbWkpOworCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgX19pbml0IGludCBpbml0X2lwbWlfc2kodm9pZCkKK3sKKwlpbnQgIHJ2ID0gMDsKKwlpbnQgIHBvcyA9IDA7CisJaW50ICBpOworCWNoYXIgKnN0cjsKKworCWlmIChpbml0aWFsaXplZCkKKwkJcmV0dXJuIDA7CisJaW5pdGlhbGl6ZWQgPSAxOworCisJLyogUGFyc2Ugb3V0IHRoZSBzaV90eXBlIHN0cmluZyBpbnRvIGl0cyBjb21wb25lbnRzLiAqLworCXN0ciA9IHNpX3R5cGVfc3RyOworCWlmICgqc3RyICE9ICdcMCcpIHsKKwkJZm9yIChpPTA7IChpPFNJX01BWF9QQVJNUykgJiYgKCpzdHIgIT0gJ1wwJyk7IGkrKykgeworCQkJc2lfdHlwZVtpXSA9IHN0cjsKKwkJCXN0ciA9IHN0cmNocihzdHIsICcsJyk7CisJCQlpZiAoc3RyKSB7CisJCQkJKnN0ciA9ICdcMCc7CisJCQkJc3RyKys7CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiSVBNSSBTeXN0ZW0gSW50ZXJmYWNlIGRyaXZlciB2ZXJzaW9uICIKKwkgICAgICAgSVBNSV9TSV9WRVJTSU9OKTsKKwlpZiAoa2NzX3NtaV9oYW5kbGVycy52ZXJzaW9uKQorCQlwcmludGsoIiwgS0NTIHZlcnNpb24gJXMiLCBrY3Nfc21pX2hhbmRsZXJzLnZlcnNpb24pOworCWlmIChzbWljX3NtaV9oYW5kbGVycy52ZXJzaW9uKQorCQlwcmludGsoIiwgU01JQyB2ZXJzaW9uICVzIiwgc21pY19zbWlfaGFuZGxlcnMudmVyc2lvbik7CisJaWYgKGJ0X3NtaV9oYW5kbGVycy52ZXJzaW9uKQorICAgCSAgICAgICAgcHJpbnRrKCIsIEJUIHZlcnNpb24gJXMiLCBidF9zbWlfaGFuZGxlcnMudmVyc2lvbik7CisJcHJpbnRrKCJcbiIpOworCisjaWZkZWYgQ09ORklHX1g4NgorCWRtaV9kZWNvZGUoKTsKKyNlbmRpZgorCisJcnYgPSBpbml0X29uZV9zbWkoMCwgJihzbWlfaW5mb3NbcG9zXSkpOworCWlmIChydiAmJiAhcG9ydHNbMF0gJiYgc2lfdHJ5ZGVmYXVsdHMpIHsKKwkJLyogSWYgd2UgYXJlIHRyeWluZyBkZWZhdWx0cyBhbmQgdGhlIGluaXRpYWwgcG9ydCBpcworICAgICAgICAgICAgICAgICAgIG5vdCBzZXQsIHRoZW4gc2V0IGl0LiAqLworCQlzaV90eXBlWzBdID0gImtjcyI7CisJCXBvcnRzWzBdID0gREVGQVVMVF9LQ1NfSU9fUE9SVDsKKwkJcnYgPSBpbml0X29uZV9zbWkoMCwgJihzbWlfaW5mb3NbcG9zXSkpOworCQlpZiAocnYpIHsKKwkJCS8qIE5vIEtDUyAtIHRyeSBTTUlDICovCisJCQlzaV90eXBlWzBdID0gInNtaWMiOworCQkJcG9ydHNbMF0gPSBERUZBVUxUX1NNSUNfSU9fUE9SVDsKKwkJCXJ2ID0gaW5pdF9vbmVfc21pKDAsICYoc21pX2luZm9zW3Bvc10pKTsKKwkJfQorCQlpZiAocnYpIHsKKwkJCS8qIE5vIFNNSUMgLSB0cnkgQlQgKi8KKwkJCXNpX3R5cGVbMF0gPSAiYnQiOworCQkJcG9ydHNbMF0gPSBERUZBVUxUX0JUX0lPX1BPUlQ7CisJCQlydiA9IGluaXRfb25lX3NtaSgwLCAmKHNtaV9pbmZvc1twb3NdKSk7CisJCX0KKwl9CisJaWYgKHJ2ID09IDApCisJCXBvcysrOworCisJZm9yIChpPTE7IGkgPCBTSV9NQVhfUEFSTVM7IGkrKykgeworCQlydiA9IGluaXRfb25lX3NtaShpLCAmKHNtaV9pbmZvc1twb3NdKSk7CisJCWlmIChydiA9PSAwKQorCQkJcG9zKys7CisJfQorCisJaWYgKHNtaV9pbmZvc1swXSA9PSBOVUxMKSB7CisJCXByaW50aygiaXBtaV9zaTogVW5hYmxlIHRvIGZpbmQgYW55IFN5c3RlbSBJbnRlcmZhY2UocylcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGluaXRfaXBtaV9zaSk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX29uZV9zaShzdHJ1Y3Qgc21pX2luZm8gKnRvX2NsZWFuKQoreworCWludCAgICAgICAgICAgcnY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghIHRvX2NsZWFuKQorCQlyZXR1cm47CisKKwkvKiBUZWxsIHRoZSB0aW1lciBhbmQgaW50ZXJydXB0IGhhbmRsZXJzIHRoYXQgd2UgYXJlIHNodXR0aW5nCisJICAgZG93bi4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHRvX2NsZWFuLT5zaV9sb2NrKSwgZmxhZ3MpOworCXNwaW5fbG9jaygmKHRvX2NsZWFuLT5tc2dfbG9jaykpOworCisJdG9fY2xlYW4tPnN0b3Bfb3BlcmF0aW9uID0gMTsKKworCXRvX2NsZWFuLT5pcnFfY2xlYW51cCh0b19jbGVhbik7CisKKwlzcGluX3VubG9jaygmKHRvX2NsZWFuLT5tc2dfbG9jaykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJih0b19jbGVhbi0+c2lfbG9jayksIGZsYWdzKTsKKworCS8qIFdhaXQgdW50aWwgd2Uga25vdyB0aGF0IHdlIGFyZSBvdXQgb2YgYW55IGludGVycnVwdAorCSAgIGhhbmRsZXJzIG1pZ2h0IGhhdmUgYmVlbiBydW5uaW5nIGJlZm9yZSB3ZSBmcmVlZCB0aGUKKwkgICBpbnRlcnJ1cHQuICovCisJc3luY2hyb25pemVfa2VybmVsKCk7CisKKwkvKiBXYWl0IGZvciB0aGUgdGltZXIgdG8gc3RvcC4gIFRoaXMgYXZvaWRzIHByb2JsZW1zIHdpdGggcmFjZQorCSAgIGNvbmRpdGlvbnMgcmVtb3ZpbmcgdGhlIHRpbWVyIGhlcmUuICovCisJd2hpbGUgKCF0b19jbGVhbi0+dGltZXJfc3RvcHBlZCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCisJLyogSW50ZXJydXB0cyBhbmQgdGltZW91dHMgYXJlIHN0b3BwZWQsIG5vdyBtYWtlIHN1cmUgdGhlCisJICAgaW50ZXJmYWNlIGlzIGluIGEgY2xlYW4gc3RhdGUuICovCisJd2hpbGUgKCh0b19jbGVhbi0+Y3Vycl9tc2cpIHx8ICh0b19jbGVhbi0+c2lfc3RhdGUgIT0gU0lfTk9STUFMKSkgeworCQlwb2xsKHRvX2NsZWFuKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCXJ2ID0gaXBtaV91bnJlZ2lzdGVyX3NtaSh0b19jbGVhbi0+aW50Zik7CisJaWYgKHJ2KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImlwbWlfc2k6IFVuYWJsZSB0byB1bnJlZ2lzdGVyIGRldmljZTogZXJybm89JWRcbiIsCisJCSAgICAgICBydik7CisJfQorCisJdG9fY2xlYW4tPmhhbmRsZXJzLT5jbGVhbnVwKHRvX2NsZWFuLT5zaV9zbSk7CisKKwlrZnJlZSh0b19jbGVhbi0+c2lfc20pOworCisJdG9fY2xlYW4tPmlvX2NsZWFudXAodG9fY2xlYW4pOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgY2xlYW51cF9pcG1pX3NpKHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoIWluaXRpYWxpemVkKQorCQlyZXR1cm47CisKKwlmb3IgKGk9MDsgaTxTSV9NQVhfRFJJVkVSUzsgaSsrKSB7CisJCWNsZWFudXBfb25lX3NpKHNtaV9pbmZvc1tpXSk7CisJfQorfQorbW9kdWxlX2V4aXQoY2xlYW51cF9pcG1pX3NpKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9zbS5oIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9zbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMjEyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX3NtLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBpcG1pX3NpX3NtLmgKKyAqCisgKiBTdGF0ZSBtYWNoaW5lIGludGVyZmFjZSBmb3IgbG93LWxldmVsIElQTUkgc3lzdGVtIG1hbmFnZW1lbnQKKyAqIGludGVyZmFjZSBzdGF0ZSBtYWNoaW5lcy4gIFRoaXMgY29kZSBpcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4KKyAqIHRoZSBpcG1pX3NtaSBjb2RlICh0aGF0IGhhbmRsZXMgdGhlIHBvbGljeSBvZiBhIEtDUywgU01JQywgb3IKKyAqIEJUIGludGVyZmFjZSkgYW5kIHRoZSBhY3R1YWwgbG93LWxldmVsIHN0YXRlIG1hY2hpbmUuCisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIENvcmV5IE1pbnlhcmQgPG1pbnlhcmRAbXZpc3RhLmNvbT4KKyAqICAgICAgICAgc291cmNlQG12aXN0YS5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICogIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAqICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiAgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBUaGlzIGlzIGRlZmluZWQgYnkgdGhlIHN0YXRlIG1hY2hpbmVzIHRoZW1zZWx2ZXMsIGl0IGlzIGFuIG9wYXF1ZQorICAgZGF0YSB0eXBlIGZvciB0aGVtIHRvIHVzZS4gKi8KK3N0cnVjdCBzaV9zbV9kYXRhOworCisvKiBUaGUgc3RydWN0dXJlIGZvciBkb2luZyBJL08gaW4gdGhlIHN0YXRlIG1hY2hpbmUuICBUaGUgc3RhdGUKKyAgIG1hY2hpbmUgZG9lc24ndCBoYXZlIHRoZSBhY3R1YWwgSS9PIHJvdXRpbmVzLCB0aGV5IGFyZSBkb25lIHRocm91Z2gKKyAgIHRoaXMgaW50ZXJmYWNlLiAqLworc3RydWN0IHNpX3NtX2lvCit7CisJdW5zaWduZWQgY2hhciAoKmlucHV0Yikoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCk7CisJdm9pZCAoKm91dHB1dGIpKHN0cnVjdCBzaV9zbV9pbyAqaW8sCisJCQl1bnNpZ25lZCBpbnQgIG9mZnNldCwKKwkJCXVuc2lnbmVkIGNoYXIgYik7CisKKwkvKiBHZW5lcmljIGluZm8gdXNlZCBieSB0aGUgYWN0dWFsIGhhbmRsaW5nIHJvdXRpbmVzLCB0aGUKKyAgICAgICAgICAgc3RhdGUgbWFjaGluZSBzaG91bGRuJ3QgdG91Y2ggdGhlc2UuICovCisJdm9pZCAqaW5mbzsKKwl2b2lkICphZGRyOworCWludCAgcmVnc3BhY2luZzsKKwlpbnQgIHJlZ3NpemU7CisJaW50ICByZWdzaGlmdDsKK307CisKKy8qIFJlc3VsdHMgb2YgU01JIGV2ZW50cy4gKi8KK2VudW0gc2lfc21fcmVzdWx0Cit7CisJU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZLCAvKiBDYWxsIHRoZSBkcml2ZXIgYWdhaW4gaW1tZWRpYXRlbHkgKi8KKwlTSV9TTV9DQUxMX1dJVEhfREVMQVksCS8qIERlbGF5IHNvbWUgYmVmb3JlIGNhbGxpbmcgYWdhaW4uICovCisJU0lfU01fVFJBTlNBQ1RJT05fQ09NUExFVEUsIC8qIEEgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQuICovCisJU0lfU01fSURMRSwJCS8qIFRoZSBTTSBpcyBpbiBpZGxlIHN0YXRlLiAqLworCVNJX1NNX0hPU0VELAkJLyogVGhlIGhhcmR3YXJlIHZpb2xhdGVkIHRoZSBzdGF0ZSBtYWNoaW5lLiAqLworCVNJX1NNX0FUVE4JCS8qIFRoZSBoYXJkd2FyZSBpcyBhc3NlcnRpbmcgYXR0biBhbmQgdGhlCisJCQkJICAgc3RhdGUgbWFjaGluZSBpcyBpZGxlLiAqLworfTsKKworLyogSGFuZGxlcnMgZm9yIHRoZSBTTUkgc3RhdGUgbWFjaGluZS4gKi8KK3N0cnVjdCBzaV9zbV9oYW5kbGVycworeworCS8qIFB1dCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHN0YXRlIG1hY2hpbmUgaGVyZSBzbyB0aGUKKyAgICAgICAgICAgdXBwZXIgbGF5ZXIgY2FuIHByaW50IGl0LiAqLworCWNoYXIgKnZlcnNpb247CisKKwkvKiBJbml0aWFsaXplIHRoZSBkYXRhIGFuZCByZXR1cm4gdGhlIGFtb3VudCBvZiBJL08gc3BhY2UgdG8KKyAgICAgICAgICAgcmVzZXJ2ZSBmb3IgdGhlIHNwYWNlLiAqLworCXVuc2lnbmVkIGludCAoKmluaXRfZGF0YSkoc3RydWN0IHNpX3NtX2RhdGEgKnNtaSwKKwkJCQkgIHN0cnVjdCBzaV9zbV9pbyAgICppbyk7CisKKwkvKiBTdGFydCBhIG5ldyB0cmFuc2FjdGlvbiBpbiB0aGUgc3RhdGUgbWFjaGluZS4gIFRoaXMgd2lsbAorCSAgIHJldHVybiAtMiBpZiB0aGUgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgLTEgaWYgdGhlIHNpemUKKwkgICBpcyBpbnZhbGlkICh0byBsYXJnZSBvciB0b28gc21hbGwpLCBvciAwIGlmIHRoZSB0cmFuc2FjdGlvbgorCSAgIGlzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuICovCisJaW50ICgqc3RhcnRfdHJhbnNhY3Rpb24pKHN0cnVjdCBzaV9zbV9kYXRhICpzbWksCisJCQkJIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplKTsKKworCS8qIFJldHVybiB0aGUgcmVzdWx0cyBhZnRlciB0aGUgdHJhbnNhY3Rpb24uICBUaGlzIHdpbGwgcmV0dXJuCisJICAgLTEgaWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwsIHplcm8gaWYgbm8gdHJhbnNhY3Rpb24gaXMKKwkgICBwcmVzZW50LCBvciB0aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgcmVzdWx0IGRhdGEuICovCisJaW50ICgqZ2V0X3Jlc3VsdCkoc3RydWN0IHNpX3NtX2RhdGEgKnNtaSwKKwkJCSAgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGxlbmd0aCk7CisKKwkvKiBDYWxsIHRoaXMgcGVyaW9kaWNhbGx5IChmb3IgYSBwb2xsZWQgaW50ZXJmYWNlKSBvciB1cG9uCisJICAgcmVjZWl2aW5nIGFuIGludGVycnVwdCAoZm9yIGEgaW50ZXJydXB0LWRyaXZlbiBpbnRlcmZhY2UpLgorCSAgIElmIGludGVycnVwdCBkcml2ZW4sIHlvdSBzaG91bGQgcHJvYmFibHkgcG9sbCB0aGlzCisJICAgcGVyaW9kaWNhbGx5IHdoZW4gbm90IGluIGlkbGUgc3RhdGUuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQKKwkgICB3aXRoIHRoZSB0aW1lIHRoYXQgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwsIGlmIGl0IGlzCisJICAgc2lnbmlmaWNhbnQuICBUaW1lIGlzIGluIG1pY3Jvc2Vjb25kcy4gKi8KKwllbnVtIHNpX3NtX3Jlc3VsdCAoKmV2ZW50KShzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pLCBsb25nIHRpbWUpOworCisJLyogQXR0ZW1wdCB0byBkZXRlY3QgYW4gU01JLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3Igbm9uemVybworICAgICAgICAgICBvbiBmYWlsdXJlLiAqLworCWludCAoKmRldGVjdCkoc3RydWN0IHNpX3NtX2RhdGEgKnNtaSk7CisKKwkvKiBUaGUgaW50ZXJmYWNlIGlzIHNodXR0aW5nIGRvd24sIHNvIGNsZWFuIGl0IHVwLiAqLworCXZvaWQgKCpjbGVhbnVwKShzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pKTsKKworCS8qIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgU01JIHN0cnVjdHVyZSBpbiBieXRlcy4gKi8KKwlpbnQgKCpzaXplKSh2b2lkKTsKK307CisKKy8qIEN1cnJlbnQgc3RhdGUgbWFjaGluZXMgdGhhdCB3ZSBjYW4gdXNlLiAqLworZXh0ZXJuIHN0cnVjdCBzaV9zbV9oYW5kbGVycyBrY3Nfc21pX2hhbmRsZXJzOworZXh0ZXJuIHN0cnVjdCBzaV9zbV9oYW5kbGVycyBzbWljX3NtaV9oYW5kbGVyczsKK2V4dGVybiBzdHJ1Y3Qgc2lfc21faGFuZGxlcnMgYnRfc21pX2hhbmRsZXJzOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NtaWNfc20uYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc21pY19zbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMTg3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NtaWNfc20uYwpAQCAtMCwwICsxLDU5OSBAQAorLyoKKyAqIGlwbWlfc21pY19zbS5jCisgKgorICogVGhlIHN0YXRlLW1hY2hpbmUgZHJpdmVyIGZvciBhbiBJUE1JIFNNSUMgZHJpdmVyCisgKgorICogSXQgc3RhcnRlZCBhcyBhIGNvcHkgb2YgQ29yZXkgTWlueWFyZCdzIGRyaXZlciBmb3IgdGhlIEtTQyBpbnRlcmZhY2UKKyAqIGFuZCB0aGUga2VybmVsIHBhdGNoICJtbWNkZXYtcGF0Y2gtMjQ1IiBieSBIUAorICoKKyAqIG1vZGlmaWVkIGJ5OglIYW5uZXMgU2NodWx6IDxzY2h1bHpAc2Nod2Fhci5jb20+CisgKgkJaXBtaUBzY2h3YWFyLmNvbQorICoKKyAqCisgKiBDb3JleSBNaW55YXJkJ3MgZHJpdmVyIGZvciB0aGUgS1NDIGludGVyZmFjZSBoYXMgdGhlIGZvbGxvd2luZworICogY29weXJpZ2h0IG5vdGljZToKKyAqICAgQ29weXJpZ2h0IDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogdGhlIGtlcm5lbCBwYXRjaCAibW1jZGV2LXBhdGNoLTI0NSIgYnkgSFAgaGFzIHRoZSBmb2xsb3dpbmcKKyAqIGNvcHlyaWdodCBub3RpY2U6CisgKiAoYykgQ29weXJpZ2h0IDIwMDEgR3JhbnQgR3J1bmRsZXIgKGMpIENvcHlyaWdodAorICogMjAwMSBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICogIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAqICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiAgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4gLyogRm9yIHByaW50ay4gKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pcG1pX21zZ2RlZnMuaD4JCS8qIGZvciBjb21wbGV0aW9uIGNvZGVzICovCisjaW5jbHVkZSAiaXBtaV9zaV9zbS5oIgorCisjZGVmaW5lIElQTUlfU01JQ19WRVJTSU9OICJ2MzMiCisKKy8qIHNtaWNfZGVidWcgaXMgYSBiaXQtZmllbGQKKyAqCVNNSUNfREVCVUdfRU5BQkxFIC0JdHVybmVkIG9uIGZvciBub3cKKyAqCVNNSUNfREVCVUdfTVNHIC0JY29tbWFuZHMgYW5kIHRoZWlyIHJlc3BvbnNlcworICoJU01JQ19ERUJVR19TVEFURVMgLQlzdGF0ZSBtYWNoaW5lCisqLworI2RlZmluZSBTTUlDX0RFQlVHX1NUQVRFUwk0CisjZGVmaW5lIFNNSUNfREVCVUdfTVNHCQkyCisjZGVmaW5lCVNNSUNfREVCVUdfRU5BQkxFCTEKKworc3RhdGljIGludCBzbWljX2RlYnVnID0gMTsKKworZW51bSBzbWljX3N0YXRlcyB7CisJU01JQ19JRExFLAorCVNNSUNfU1RBUlRfT1AsCisJU01JQ19PUF9PSywKKwlTTUlDX1dSSVRFX1NUQVJULAorCVNNSUNfV1JJVEVfTkVYVCwKKwlTTUlDX1dSSVRFX0VORCwKKwlTTUlDX1dSSVRFMlJFQUQsCisJU01JQ19SRUFEX1NUQVJULAorCVNNSUNfUkVBRF9ORVhULAorCVNNSUNfUkVBRF9FTkQsCisJU01JQ19IT1NFRAorfTsKKworI2RlZmluZSBNQVhfU01JQ19SRUFEX1NJWkUgODAKKyNkZWZpbmUgTUFYX1NNSUNfV1JJVEVfU0laRSA4MAorI2RlZmluZSBTTUlDX01BWF9FUlJPUl9SRVRSSUVTIDMKKworLyogVGltZW91dHMgaW4gbWljcm9zZWNvbmRzLiAqLworI2RlZmluZSBTTUlDX1JFVFJZX1RJTUVPVVQgMTAwMDAwCisKKy8qIFNNSUMgRmxhZ3MgUmVnaXN0ZXIgQml0cyAqLworI2RlZmluZSBTTUlDX1JYX0RBVEFfUkVBRFkJMHg4MAorI2RlZmluZSBTTUlDX1RYX0RBVEFfUkVBRFkJMHg0MAorI2RlZmluZSBTTUlDX1NNSQkJMHgxMAorI2RlZmluZSBTTUlDX0VWTV9EQVRBX0FWQUlMCTB4MDgKKyNkZWZpbmUgU01JQ19TTVNfREFUQV9BVkFJTAkweDA0CisjZGVmaW5lIFNNSUNfRkxBR19CU1kJCTB4MDEKKworLyogU01JQyBFcnJvciBDb2RlcyAqLworI2RlZmluZQlFQ19OT19FUlJPUgkJMHgwMAorI2RlZmluZQlFQ19BQk9SVEVECQkweDAxCisjZGVmaW5lCUVDX0lMTEVHQUxfQ09OVFJPTAkweDAyCisjZGVmaW5lCUVDX05PX1JFU1BPTlNFCQkweDAzCisjZGVmaW5lCUVDX0lMTEVHQUxfQ09NTUFORAkweDA0CisjZGVmaW5lCUVDX0JVRkZFUl9GVUxMCQkweDA1CisKK3N0cnVjdCBzaV9zbV9kYXRhCit7CisJZW51bSBzbWljX3N0YXRlcyBzdGF0ZTsKKwlzdHJ1Y3Qgc2lfc21faW8gKmlvOworICAgICAgICB1bnNpZ25lZCBjaGFyCSB3cml0ZV9kYXRhW01BWF9TTUlDX1dSSVRFX1NJWkVdOworICAgICAgICBpbnQJCSB3cml0ZV9wb3M7CisgICAgICAgIGludAkJIHdyaXRlX2NvdW50OworICAgICAgICBpbnQJCSBvcmlnX3dyaXRlX2NvdW50OworICAgICAgICB1bnNpZ25lZCBjaGFyCSByZWFkX2RhdGFbTUFYX1NNSUNfUkVBRF9TSVpFXTsKKyAgICAgICAgaW50CQkgcmVhZF9wb3M7CisgICAgICAgIGludAkJIHRydW5jYXRlZDsKKyAgICAgICAgdW5zaWduZWQgaW50CSBlcnJvcl9yZXRyaWVzOworICAgICAgICBsb25nCQkgc21pY190aW1lb3V0OworfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBpbml0X3NtaWNfZGF0YSAoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMsCisJCQkJICAgIHN0cnVjdCBzaV9zbV9pbyAqaW8pCit7CisJc21pYy0+c3RhdGUgPSBTTUlDX0lETEU7CisJc21pYy0+aW8gPSBpbzsKKwlzbWljLT53cml0ZV9wb3MgPSAwOworCXNtaWMtPndyaXRlX2NvdW50ID0gMDsKKwlzbWljLT5vcmlnX3dyaXRlX2NvdW50ID0gMDsKKwlzbWljLT5yZWFkX3BvcyA9IDA7CisJc21pYy0+ZXJyb3JfcmV0cmllcyA9IDA7CisJc21pYy0+dHJ1bmNhdGVkID0gMDsKKwlzbWljLT5zbWljX3RpbWVvdXQgPSBTTUlDX1JFVFJZX1RJTUVPVVQ7CisKKwkvKiBXZSB1c2UgMyBieXRlcyBvZiBJL08uICovCisJcmV0dXJuIDM7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRfc21pY190cmFuc2FjdGlvbihzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pYywKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKChzaXplIDwgMikgfHwgKHNpemUgPiBNQVhfU01JQ19XUklURV9TSVpFKSkgeworCQlyZXR1cm4gLTE7CisJfQorCWlmICgoc21pYy0+c3RhdGUgIT0gU01JQ19JRExFKSAmJiAoc21pYy0+c3RhdGUgIT0gU01JQ19IT1NFRCkpIHsKKwkJcmV0dXJuIC0yOworCX0KKwlpZiAoc21pY19kZWJ1ZyAmIFNNSUNfREVCVUdfTVNHKSB7CisJCXByaW50ayhLRVJOX0lORk8gInN0YXJ0X3NtaWNfdHJhbnNhY3Rpb24gLSIpOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgeworCQkJcHJpbnRrICgiICUwMngiLCAodW5zaWduZWQgY2hhcikgKGRhdGEgW2ldKSk7CisJCX0KKwkJcHJpbnRrICgiXG4iKTsKKwl9CisJc21pYy0+ZXJyb3JfcmV0cmllcyA9IDA7CisJbWVtY3B5KHNtaWMtPndyaXRlX2RhdGEsIGRhdGEsIHNpemUpOworCXNtaWMtPndyaXRlX2NvdW50ID0gc2l6ZTsKKwlzbWljLT5vcmlnX3dyaXRlX2NvdW50ID0gc2l6ZTsKKwlzbWljLT53cml0ZV9wb3MgPSAwOworCXNtaWMtPnJlYWRfcG9zID0gMDsKKwlzbWljLT5zdGF0ZSA9IFNNSUNfU1RBUlRfT1A7CisJc21pYy0+c21pY190aW1lb3V0ID0gU01JQ19SRVRSWV9USU1FT1VUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtaWNfZ2V0X3Jlc3VsdChzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pYywKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJaW50IGk7CisKKwlpZiAoc21pY19kZWJ1ZyAmIFNNSUNfREVCVUdfTVNHKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJzbWljX2dldCByZXN1bHQgLSIpOworCQlmb3IgKGkgPSAwOyBpIDwgc21pYy0+cmVhZF9wb3M7IGkgKyspIHsKKwkJCXByaW50ayAoIiAlMDJ4IiwgKHNtaWMtPnJlYWRfZGF0YSBbaV0pKTsKKwkJfQorCQlwcmludGsgKCJcbiIpOworCX0KKwlpZiAobGVuZ3RoIDwgc21pYy0+cmVhZF9wb3MpIHsKKwkJc21pYy0+cmVhZF9wb3MgPSBsZW5ndGg7CisJCXNtaWMtPnRydW5jYXRlZCA9IDE7CisJfQorCW1lbWNweShkYXRhLCBzbWljLT5yZWFkX2RhdGEsIHNtaWMtPnJlYWRfcG9zKTsKKworCWlmICgobGVuZ3RoID49IDMpICYmIChzbWljLT5yZWFkX3BvcyA8IDMpKSB7CisJCWRhdGFbMl0gPSBJUE1JX0VSUl9VTlNQRUNJRklFRDsKKwkJc21pYy0+cmVhZF9wb3MgPSAzOworCX0KKwlpZiAoc21pYy0+dHJ1bmNhdGVkKSB7CisJCWRhdGFbMl0gPSBJUE1JX0VSUl9NU0dfVFJVTkNBVEVEOworCQlzbWljLT50cnVuY2F0ZWQgPSAwOworCX0KKwlyZXR1cm4gc21pYy0+cmVhZF9wb3M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWFkX3NtaWNfZmxhZ3Moc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMpCit7CisJcmV0dXJuIHNtaWMtPmlvLT5pbnB1dGIoc21pYy0+aW8sIDIpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZF9zbWljX3N0YXR1cyhzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pYykKK3sKKwlyZXR1cm4gc21pYy0+aW8tPmlucHV0YihzbWljLT5pbywgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWFkX3NtaWNfZGF0YShzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pYykKK3sKKwlyZXR1cm4gc21pYy0+aW8tPmlucHV0YihzbWljLT5pbywgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9zbWljX2ZsYWdzKHN0cnVjdCBzaV9zbV9kYXRhICpzbWljLAorCQkJCSAgICB1bnNpZ25lZCBjaGFyICAgZmxhZ3MpCit7CisJc21pYy0+aW8tPm91dHB1dGIoc21pYy0+aW8sIDIsIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3NtaWNfY29udHJvbChzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pYywKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyICAgY29udHJvbCkKK3sKKwlzbWljLT5pby0+b3V0cHV0YihzbWljLT5pbywgMSwgY29udHJvbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9zaV9zbV9kYXRhIChzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pYywKKwkJCQkgICB1bnNpZ25lZCBjaGFyICAgZGF0YSkKK3sKKwlzbWljLT5pby0+b3V0cHV0YihzbWljLT5pbywgMCwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9lcnJvcl9yZWNvdmVyeShzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pYywgY2hhciAqcmVhc29uKQoreworCShzbWljLT5lcnJvcl9yZXRyaWVzKSsrOworCWlmIChzbWljLT5lcnJvcl9yZXRyaWVzID4gU01JQ19NQVhfRVJST1JfUkVUUklFUykgeworCQlpZiAoc21pY19kZWJ1ZyAmIFNNSUNfREVCVUdfRU5BQkxFKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImlwbWlfc21pY19kcnY6IHNtaWMgaG9zZWQ6ICVzXG4iLCByZWFzb24pOworCQl9CisJCXNtaWMtPnN0YXRlID0gU01JQ19IT1NFRDsKKwl9IGVsc2UgeworCQlzbWljLT53cml0ZV9jb3VudCA9IHNtaWMtPm9yaWdfd3JpdGVfY291bnQ7CisJCXNtaWMtPndyaXRlX3BvcyA9IDA7CisJCXNtaWMtPnJlYWRfcG9zID0gMDsKKwkJc21pYy0+c3RhdGUgPSBTTUlDX1NUQVJUX09QOworCQlzbWljLT5zbWljX3RpbWVvdXQgPSBTTUlDX1JFVFJZX1RJTUVPVVQ7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbmV4dF9ieXRlKHN0cnVjdCBzaV9zbV9kYXRhICpzbWljKQoreworCXdyaXRlX3NpX3NtX2RhdGEoc21pYywgc21pYy0+d3JpdGVfZGF0YVtzbWljLT53cml0ZV9wb3NdKTsKKwkoc21pYy0+d3JpdGVfcG9zKSsrOworCShzbWljLT53cml0ZV9jb3VudCktLTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlYWRfbmV4dF9ieXRlIChzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pYykKK3sKKwlpZiAoc21pYy0+cmVhZF9wb3MgPj0gTUFYX1NNSUNfUkVBRF9TSVpFKSB7CisJCXJlYWRfc21pY19kYXRhIChzbWljKTsKKwkJc21pYy0+dHJ1bmNhdGVkID0gMTsKKwl9IGVsc2UgeworCQlzbWljLT5yZWFkX2RhdGFbc21pYy0+cmVhZF9wb3NdID0gcmVhZF9zbWljX2RhdGEoc21pYyk7CisJCShzbWljLT5yZWFkX3BvcykrKzsKKwl9Cit9CisKKy8qICBTTUlDIENvbnRyb2wvU3RhdHVzIENvZGUgQ29tcG9uZW50cyAqLworI2RlZmluZQlTTUlDX0dFVF9TVEFUVVMJCTB4MDAJLyogQ29udHJvbCBmb3JtJ3MgbmFtZSAqLworI2RlZmluZQlTTUlDX1JFQURZCQkweDAwCS8qIFN0YXR1cyAgZm9ybSdzIG5hbWUgKi8KKyNkZWZpbmUJU01JQ19XUl9TVEFSVAkJMHgwMQkvKiBVbmlmaWVkIENvbnRyb2wvU3RhdHVzIG5hbWVzLi4uICovCisjZGVmaW5lCVNNSUNfV1JfTkVYVAkJMHgwMgorI2RlZmluZQlTTUlDX1dSX0VORAkJMHgwMworI2RlZmluZQlTTUlDX1JEX1NUQVJUCQkweDA0CisjZGVmaW5lCVNNSUNfUkRfTkVYVAkJMHgwNQorI2RlZmluZQlTTUlDX1JEX0VORAkJMHgwNgorI2RlZmluZQlTTUlDX0NPREVfTUFTSwkJMHgwZgorCisjZGVmaW5lCVNNSUNfQ09OVFJPTAkJMHgwMAorI2RlZmluZQlTTUlDX1NUQVRVUwkJMHg4MAorI2RlZmluZQlTTUlDX0NTX01BU0sJCTB4ODAKKworI2RlZmluZQlTTUlDX1NNUwkJMHg0MAorI2RlZmluZQlTTUlDX1NNTQkJMHg2MAorI2RlZmluZQlTTUlDX1NUUkVBTV9NQVNLCTB4NjAKKworLyogIFNNSUMgQ29udHJvbCBDb2RlcyAqLworI2RlZmluZQlTTUlDX0NDX1NNU19HRVRfU1RBVFVTCShTTUlDX0NPTlRST0x8U01JQ19TTVN8U01JQ19HRVRfU1RBVFVTKQorI2RlZmluZQlTTUlDX0NDX1NNU19XUl9TVEFSVAkoU01JQ19DT05UUk9MfFNNSUNfU01TfFNNSUNfV1JfU1RBUlQpCisjZGVmaW5lCVNNSUNfQ0NfU01TX1dSX05FWFQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNU3xTTUlDX1dSX05FWFQpCisjZGVmaW5lCVNNSUNfQ0NfU01TX1dSX0VORAkoU01JQ19DT05UUk9MfFNNSUNfU01TfFNNSUNfV1JfRU5EKQorI2RlZmluZQlTTUlDX0NDX1NNU19SRF9TVEFSVAkoU01JQ19DT05UUk9MfFNNSUNfU01TfFNNSUNfUkRfU1RBUlQpCisjZGVmaW5lCVNNSUNfQ0NfU01TX1JEX05FWFQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNU3xTTUlDX1JEX05FWFQpCisjZGVmaW5lCVNNSUNfQ0NfU01TX1JEX0VORAkoU01JQ19DT05UUk9MfFNNSUNfU01TfFNNSUNfUkRfRU5EKQorCisjZGVmaW5lCVNNSUNfQ0NfU01NX0dFVF9TVEFUVVMJKFNNSUNfQ09OVFJPTHxTTUlDX1NNTXxTTUlDX0dFVF9TVEFUVVMpCisjZGVmaW5lCVNNSUNfQ0NfU01NX1dSX1NUQVJUCShTTUlDX0NPTlRST0x8U01JQ19TTU18U01JQ19XUl9TVEFSVCkKKyNkZWZpbmUJU01JQ19DQ19TTU1fV1JfTkVYVAkoU01JQ19DT05UUk9MfFNNSUNfU01NfFNNSUNfV1JfTkVYVCkKKyNkZWZpbmUJU01JQ19DQ19TTU1fV1JfRU5ECShTTUlDX0NPTlRST0x8U01JQ19TTU18U01JQ19XUl9FTkQpCisjZGVmaW5lCVNNSUNfQ0NfU01NX1JEX1NUQVJUCShTTUlDX0NPTlRST0x8U01JQ19TTU18U01JQ19SRF9TVEFSVCkKKyNkZWZpbmUJU01JQ19DQ19TTU1fUkRfTkVYVAkoU01JQ19DT05UUk9MfFNNSUNfU01NfFNNSUNfUkRfTkVYVCkKKyNkZWZpbmUJU01JQ19DQ19TTU1fUkRfRU5ECShTTUlDX0NPTlRST0x8U01JQ19TTU18U01JQ19SRF9FTkQpCisKKy8qICBTTUlDIFN0YXR1cyBDb2RlcyAqLworI2RlZmluZQlTTUlDX1NDX1NNU19SRUFEWQkoU01JQ19TVEFUVVN8U01JQ19TTVN8U01JQ19SRUFEWSkKKyNkZWZpbmUJU01JQ19TQ19TTVNfV1JfU1RBUlQJKFNNSUNfU1RBVFVTfFNNSUNfU01TfFNNSUNfV1JfU1RBUlQpCisjZGVmaW5lCVNNSUNfU0NfU01TX1dSX05FWFQJKFNNSUNfU1RBVFVTfFNNSUNfU01TfFNNSUNfV1JfTkVYVCkKKyNkZWZpbmUJU01JQ19TQ19TTVNfV1JfRU5ECShTTUlDX1NUQVRVU3xTTUlDX1NNU3xTTUlDX1dSX0VORCkKKyNkZWZpbmUJU01JQ19TQ19TTVNfUkRfU1RBUlQJKFNNSUNfU1RBVFVTfFNNSUNfU01TfFNNSUNfUkRfU1RBUlQpCisjZGVmaW5lCVNNSUNfU0NfU01TX1JEX05FWFQJKFNNSUNfU1RBVFVTfFNNSUNfU01TfFNNSUNfUkRfTkVYVCkKKyNkZWZpbmUJU01JQ19TQ19TTVNfUkRfRU5ECShTTUlDX1NUQVRVU3xTTUlDX1NNU3xTTUlDX1JEX0VORCkKKworI2RlZmluZQlTTUlDX1NDX1NNTV9SRUFEWQkoU01JQ19TVEFUVVN8U01JQ19TTU18U01JQ19SRUFEWSkKKyNkZWZpbmUJU01JQ19TQ19TTU1fV1JfU1RBUlQJKFNNSUNfU1RBVFVTfFNNSUNfU01NfFNNSUNfV1JfU1RBUlQpCisjZGVmaW5lCVNNSUNfU0NfU01NX1dSX05FWFQJKFNNSUNfU1RBVFVTfFNNSUNfU01NfFNNSUNfV1JfTkVYVCkKKyNkZWZpbmUJU01JQ19TQ19TTU1fV1JfRU5ECShTTUlDX1NUQVRVU3xTTUlDX1NNTXxTTUlDX1dSX0VORCkKKyNkZWZpbmUJU01JQ19TQ19TTU1fUkRfU1RBUlQJKFNNSUNfU1RBVFVTfFNNSUNfU01NfFNNSUNfUkRfU1RBUlQpCisjZGVmaW5lCVNNSUNfU0NfU01NX1JEX05FWFQJKFNNSUNfU1RBVFVTfFNNSUNfU01NfFNNSUNfUkRfTkVYVCkKKyNkZWZpbmUJU01JQ19TQ19TTU1fUkRfRU5ECShTTUlDX1NUQVRVU3xTTUlDX1NNTXxTTUlDX1JEX0VORCkKKworLyogdGhlc2UgYXJlIHRoZSBjb250cm9sL3N0YXR1cyBjb2RlcyB3ZSBhY3R1YWxseSB1c2UKKwlTTUlDX0NDX1NNU19HRVRfU1RBVFVTCTB4NDAKKwlTTUlDX0NDX1NNU19XUl9TVEFSVAkweDQxCisJU01JQ19DQ19TTVNfV1JfTkVYVAkweDQyCisJU01JQ19DQ19TTVNfV1JfRU5ECTB4NDMKKwlTTUlDX0NDX1NNU19SRF9TVEFSVAkweDQ0CisJU01JQ19DQ19TTVNfUkRfTkVYVAkweDQ1CisJU01JQ19DQ19TTVNfUkRfRU5ECTB4NDYKKworCVNNSUNfU0NfU01TX1JFQURZCTB4QzAKKwlTTUlDX1NDX1NNU19XUl9TVEFSVAkweEMxCisJU01JQ19TQ19TTVNfV1JfTkVYVAkweEMyCisJU01JQ19TQ19TTVNfV1JfRU5ECTB4QzMKKwlTTUlDX1NDX1NNU19SRF9TVEFSVAkweEM0CisJU01JQ19TQ19TTVNfUkRfTkVYVAkweEM1CisJU01JQ19TQ19TTVNfUkRfRU5ECTB4QzYKKyovCisKK3N0YXRpYyBlbnVtIHNpX3NtX3Jlc3VsdCBzbWljX2V2ZW50IChzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pYywgbG9uZyB0aW1lKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBkYXRhOworCisJaWYgKHNtaWMtPnN0YXRlID09IFNNSUNfSE9TRUQpIHsKKwkJaW5pdF9zbWljX2RhdGEoc21pYywgc21pYy0+aW8pOworCQlyZXR1cm4gU0lfU01fSE9TRUQ7CisJfQorCWlmIChzbWljLT5zdGF0ZSAhPSBTTUlDX0lETEUpIHsKKwkJaWYgKHNtaWNfZGVidWcgJiBTTUlDX0RFQlVHX1NUQVRFUykgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJzbWljX2V2ZW50IC0gc21pYy0+c21pY190aW1lb3V0ID0gJWxkLCIKKwkJCSAgICAgICAiIHRpbWUgPSAlbGRcbiIsCisJCQkgICAgICAgc21pYy0+c21pY190aW1lb3V0LCB0aW1lKTsKKwkJfQorLyogRklYTUU6IHNtaWNfZXZlbnQgaXMgc29tZXRpbWVzIGNhbGxlZCB3aXRoIHRpbWUgPiBTTUlDX1JFVFJZX1RJTUVPVVQgKi8KKwkJaWYgKHRpbWUgPCBTTUlDX1JFVFJZX1RJTUVPVVQpIHsKKwkJCXNtaWMtPnNtaWNfdGltZW91dCAtPSB0aW1lOworCQkJaWYgKHNtaWMtPnNtaWNfdGltZW91dCA8IDApIHsKKwkJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLCAic21pYyB0aW1lZCBvdXQuIik7CisJCQkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKwkJCX0KKwkJfQorCX0KKwlmbGFncyA9IHJlYWRfc21pY19mbGFncyhzbWljKTsKKwlpZiAoZmxhZ3MgJiBTTUlDX0ZMQUdfQlNZKQorCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCisJc3RhdHVzID0gcmVhZF9zbWljX3N0YXR1cyAoc21pYyk7CisJaWYgKHNtaWNfZGVidWcgJiBTTUlDX0RFQlVHX1NUQVRFUykKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgInNtaWNfZXZlbnQgLSBzdGF0ZSA9ICVkLCBmbGFncyA9IDB4JTAyeCwiCisJCSAgICAgICAiIHN0YXR1cyA9IDB4JTAyeFxuIiwKKwkJICAgICAgIHNtaWMtPnN0YXRlLCBmbGFncywgc3RhdHVzKTsKKworCXN3aXRjaCAoc21pYy0+c3RhdGUpIHsKKwljYXNlIFNNSUNfSURMRToKKwkJLyogaW4gSURMRSB3ZSBjaGVjayBmb3IgYXZhaWxhYmxlIG1lc3NhZ2VzICovCisJCWlmIChmbGFncyAmIChTTUlDX1NNSSB8CisJCQkgICAgIFNNSUNfRVZNX0RBVEFfQVZBSUwgfCBTTUlDX1NNU19EQVRBX0FWQUlMKSkKKwkJeworCQkJcmV0dXJuIFNJX1NNX0FUVE47CisJCX0KKwkJcmV0dXJuIFNJX1NNX0lETEU7CisKKwljYXNlIFNNSUNfU1RBUlRfT1A6CisJCS8qIHNhbml0eSBjaGVjayB3aGV0aGVyIHNtaWMgaXMgcmVhbGx5IGlkbGUgKi8KKwkJd3JpdGVfc21pY19jb250cm9sKHNtaWMsIFNNSUNfQ0NfU01TX0dFVF9TVEFUVVMpOworCQl3cml0ZV9zbWljX2ZsYWdzKHNtaWMsIGZsYWdzIHwgU01JQ19GTEFHX0JTWSk7CisJCXNtaWMtPnN0YXRlID0gU01JQ19PUF9PSzsKKwkJYnJlYWs7CisKKwljYXNlIFNNSUNfT1BfT0s6CisJCWlmIChzdGF0dXMgIT0gU01JQ19TQ19TTVNfUkVBRFkpIHsKKwkJCQkvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuICovCisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLAorCQkJCQkgICAgICJzdGF0ZSA9IFNNSUNfT1BfT0ssIgorCQkJCQkgICAgICIgc3RhdHVzICE9IFNNSUNfU0NfU01TX1JFQURZIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJCS8qIE9LIHNvIGZhcjsgc21pYyBpcyBpZGxlIGxldCB1cyBzdGFydCAuLi4gKi8KKwkJd3JpdGVfc21pY19jb250cm9sKHNtaWMsIFNNSUNfQ0NfU01TX1dSX1NUQVJUKTsKKwkJd3JpdGVfbmV4dF9ieXRlKHNtaWMpOworCQl3cml0ZV9zbWljX2ZsYWdzKHNtaWMsIGZsYWdzIHwgU01JQ19GTEFHX0JTWSk7CisJCXNtaWMtPnN0YXRlID0gU01JQ19XUklURV9TVEFSVDsKKwkJYnJlYWs7CisKKwljYXNlIFNNSUNfV1JJVEVfU1RBUlQ6CisJCWlmIChzdGF0dXMgIT0gU01JQ19TQ19TTVNfV1JfU1RBUlQpIHsKKwkJCXN0YXJ0X2Vycm9yX3JlY292ZXJ5KHNtaWMsCisJCQkJCSAgICAgInN0YXRlID0gU01JQ19XUklURV9TVEFSVCwgIgorCQkJCQkgICAgICJzdGF0dXMgIT0gU01JQ19TQ19TTVNfV1JfU1RBUlQiKTsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0KKwkJLyogd2UgbXVzdCBub3QgaXNzdWUgV1JfKE5FWFR8RU5EKSB1bmxlc3MKKyAgICAgICAgICAgICAgICAgICBUWF9EQVRBX1JFQURZIGlzIHNldCAqLworCQlpZiAoZmxhZ3MgJiBTTUlDX1RYX0RBVEFfUkVBRFkpIHsKKwkJCWlmIChzbWljLT53cml0ZV9jb3VudCA9PSAxKSB7CisJCQkJLyogbGFzdCBieXRlICovCisJCQkJd3JpdGVfc21pY19jb250cm9sKHNtaWMsIFNNSUNfQ0NfU01TX1dSX0VORCk7CisJCQkJc21pYy0+c3RhdGUgPSBTTUlDX1dSSVRFX0VORDsKKwkJCX0gZWxzZSB7CisJCQkJd3JpdGVfc21pY19jb250cm9sKHNtaWMsIFNNSUNfQ0NfU01TX1dSX05FWFQpOworCQkJCXNtaWMtPnN0YXRlID0gU01JQ19XUklURV9ORVhUOworCQkJfQorCQkJd3JpdGVfbmV4dF9ieXRlKHNtaWMpOworCQkJd3JpdGVfc21pY19mbGFncyhzbWljLCBmbGFncyB8IFNNSUNfRkxBR19CU1kpOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU01JQ19XUklURV9ORVhUOgorCQlpZiAoc3RhdHVzICE9IFNNSUNfU0NfU01TX1dSX05FWFQpIHsKKwkJCXN0YXJ0X2Vycm9yX3JlY292ZXJ5KHNtaWMsCisJCQkJCSAgICAgInN0YXRlID0gU01JQ19XUklURV9ORVhULCAiCisJCQkJCSAgICAgInN0YXR1cyAhPSBTTUlDX1NDX1NNU19XUl9ORVhUIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJCS8qIHRoaXMgaXMgdGhlIHNhbWUgY29kZSBhcyBpbiBTTUlDX1dSSVRFX1NUQVJUICovCisJCWlmIChmbGFncyAmIFNNSUNfVFhfREFUQV9SRUFEWSkgeworCQkJaWYgKHNtaWMtPndyaXRlX2NvdW50ID09IDEpIHsKKwkJCQl3cml0ZV9zbWljX2NvbnRyb2woc21pYywgU01JQ19DQ19TTVNfV1JfRU5EKTsKKwkJCQlzbWljLT5zdGF0ZSA9IFNNSUNfV1JJVEVfRU5EOworCQkJfQorCQkJZWxzZSB7CisJCQkJd3JpdGVfc21pY19jb250cm9sKHNtaWMsIFNNSUNfQ0NfU01TX1dSX05FWFQpOworCQkJCXNtaWMtPnN0YXRlID0gU01JQ19XUklURV9ORVhUOworCQkJfQorCQkJd3JpdGVfbmV4dF9ieXRlKHNtaWMpOworCQkJd3JpdGVfc21pY19mbGFncyhzbWljLCBmbGFncyB8IFNNSUNfRkxBR19CU1kpOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU01JQ19XUklURV9FTkQ6CisJCWlmIChzdGF0dXMgIT0gU01JQ19TQ19TTVNfV1JfRU5EKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeSAoc21pYywKKwkJCQkJICAgICAgInN0YXRlID0gU01JQ19XUklURV9FTkQsICIKKwkJCQkJICAgICAgInN0YXR1cyAhPSBTTUlDX1NDX1NNU19XUl9FTkQiKTsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0KKwkJLyogZGF0YSByZWdpc3RlciBob2xkcyBhbiBlcnJvciBjb2RlICovCisJCWRhdGEgPSByZWFkX3NtaWNfZGF0YShzbWljKTsKKwkJaWYgKGRhdGEgIT0gMCkgeworCQkJaWYgKHNtaWNfZGVidWcgJiBTTUlDX0RFQlVHX0VOQUJMRSkgeworCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkgICAgICAgIlNNSUNfV1JJVEVfRU5EOiBkYXRhID0gJTAyeFxuIiwgZGF0YSk7CisJCQl9CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLAorCQkJCQkgICAgICJzdGF0ZSA9IFNNSUNfV1JJVEVfRU5ELCAiCisJCQkJCSAgICAgImRhdGEgIT0gU1VDQ0VTUyIpOworCQkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKwkJfSBlbHNlIHsKKwkJCXNtaWMtPnN0YXRlID0gU01JQ19XUklURTJSRUFEOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTUlDX1dSSVRFMlJFQUQ6CisJCS8qIHdlIG11c3Qgd2FpdCBmb3IgUlhfREFUQV9SRUFEWSB0byBiZSBzZXQgYmVmb3JlIHdlCisgICAgICAgICAgICAgICAgICAgY2FuIGNvbnRpbnVlICovCisJCWlmIChmbGFncyAmIFNNSUNfUlhfREFUQV9SRUFEWSkgeworCQkJd3JpdGVfc21pY19jb250cm9sKHNtaWMsIFNNSUNfQ0NfU01TX1JEX1NUQVJUKTsKKwkJCXdyaXRlX3NtaWNfZmxhZ3Moc21pYywgZmxhZ3MgfCBTTUlDX0ZMQUdfQlNZKTsKKwkJCXNtaWMtPnN0YXRlID0gU01JQ19SRUFEX1NUQVJUOworCQl9IGVsc2UgeworCQkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU01JQ19SRUFEX1NUQVJUOgorCQlpZiAoc3RhdHVzICE9IFNNSUNfU0NfU01TX1JEX1NUQVJUKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLAorCQkJCQkgICAgICJzdGF0ZSA9IFNNSUNfUkVBRF9TVEFSVCwgIgorCQkJCQkgICAgICJzdGF0dXMgIT0gU01JQ19TQ19TTVNfUkRfU1RBUlQiKTsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0KKwkJaWYgKGZsYWdzICYgU01JQ19SWF9EQVRBX1JFQURZKSB7CisJCQlyZWFkX25leHRfYnl0ZShzbWljKTsKKwkJCXdyaXRlX3NtaWNfY29udHJvbChzbWljLCBTTUlDX0NDX1NNU19SRF9ORVhUKTsKKwkJCXdyaXRlX3NtaWNfZmxhZ3Moc21pYywgZmxhZ3MgfCBTTUlDX0ZMQUdfQlNZKTsKKwkJCXNtaWMtPnN0YXRlID0gU01JQ19SRUFEX05FWFQ7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTUlDX1JFQURfTkVYVDoKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJLyogc21pYyB0ZWxscyB1cyB0aGF0IHRoaXMgaXMgdGhlIGxhc3QgYnl0ZSB0byBiZSByZWFkCisgICAgICAgICAgICAgICAgICAgLS0+IGNsZWFuIHVwICovCisJCWNhc2UgU01JQ19TQ19TTVNfUkRfRU5EOgorCQkJcmVhZF9uZXh0X2J5dGUoc21pYyk7CisJCQl3cml0ZV9zbWljX2NvbnRyb2woc21pYywgU01JQ19DQ19TTVNfUkRfRU5EKTsKKwkJCXdyaXRlX3NtaWNfZmxhZ3Moc21pYywgZmxhZ3MgfCBTTUlDX0ZMQUdfQlNZKTsKKwkJCXNtaWMtPnN0YXRlID0gU01JQ19SRUFEX0VORDsKKwkJCWJyZWFrOworCQljYXNlIFNNSUNfU0NfU01TX1JEX05FWFQ6CisJCQlpZiAoZmxhZ3MgJiBTTUlDX1JYX0RBVEFfUkVBRFkpIHsKKwkJCQlyZWFkX25leHRfYnl0ZShzbWljKTsKKwkJCQl3cml0ZV9zbWljX2NvbnRyb2woc21pYywgU01JQ19DQ19TTVNfUkRfTkVYVCk7CisJCQkJd3JpdGVfc21pY19mbGFncyhzbWljLCBmbGFncyB8IFNNSUNfRkxBR19CU1kpOworCQkJCXNtaWMtPnN0YXRlID0gU01JQ19SRUFEX05FWFQ7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN0YXJ0X2Vycm9yX3JlY292ZXJ5KAorCQkJCXNtaWMsCisJCQkJInN0YXRlID0gU01JQ19SRUFEX05FWFQsICIKKwkJCQkic3RhdHVzICE9IFNNSUNfU0NfU01TX1JEXyhORVhUfEVORCkiKTsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNNSUNfUkVBRF9FTkQ6CisJCWlmIChzdGF0dXMgIT0gU01JQ19TQ19TTVNfUkVBRFkpIHsKKwkJCXN0YXJ0X2Vycm9yX3JlY292ZXJ5KHNtaWMsCisJCQkJCSAgICAgInN0YXRlID0gU01JQ19SRUFEX0VORCwgIgorCQkJCQkgICAgICJzdGF0dXMgIT0gU01JQ19TQ19TTVNfUkVBRFkiKTsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0KKwkJZGF0YSA9IHJlYWRfc21pY19kYXRhKHNtaWMpOworCQkvKiBkYXRhIHJlZ2lzdGVyIGhvbGRzIGFuIGVycm9yIGNvZGUgKi8KKwkJaWYgKGRhdGEgIT0gMCkgeworCQkJaWYgKHNtaWNfZGVidWcgJiBTTUlDX0RFQlVHX0VOQUJMRSkgeworCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkgICAgICAgIlNNSUNfUkVBRF9FTkQ6IGRhdGEgPSAlMDJ4XG4iLCBkYXRhKTsKKwkJCX0KKwkJCXN0YXJ0X2Vycm9yX3JlY292ZXJ5KHNtaWMsCisJCQkJCSAgICAgInN0YXRlID0gU01JQ19SRUFEX0VORCwgIgorCQkJCQkgICAgICJkYXRhICE9IFNVQ0NFU1MiKTsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0gZWxzZSB7CisJCQlzbWljLT5zdGF0ZSA9IFNNSUNfSURMRTsKKwkJCXJldHVybiBTSV9TTV9UUkFOU0FDVElPTl9DT01QTEVURTsKKwkJfQorCisJY2FzZSBTTUlDX0hPU0VEOgorCQlpbml0X3NtaWNfZGF0YShzbWljLCBzbWljLT5pbyk7CisJCXJldHVybiBTSV9TTV9IT1NFRDsKKworCWRlZmF1bHQ6CisJCWlmIChzbWljX2RlYnVnICYgU01JQ19ERUJVR19FTkFCTEUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNtaWMtPnN0YXRlID0gJWRcbiIsIHNtaWMtPnN0YXRlKTsKKwkJCXN0YXJ0X2Vycm9yX3JlY292ZXJ5KHNtaWMsICJzdGF0ZSA9IFVOS05PV04iKTsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0KKwl9CisJc21pYy0+c21pY190aW1lb3V0ID0gU01JQ19SRVRSWV9USU1FT1VUOworCXJldHVybiBTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVk7Cit9CisKK3N0YXRpYyBpbnQgc21pY19kZXRlY3Qoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMpCit7CisJLyogSXQncyBpbXBvc3NpYmxlIGZvciB0aGUgU01JQyBmbmFncyByZWdpc3RlciB0byBiZSBhbGwgMSdzLAorCSAgIChhc3N1bWluZyBhIHByb3Blcmx5IGZ1bmN0aW9uaW5nLCBzZWxmLWluaXRpYWxpemVkIEJNQykKKwkgICBidXQgdGhhdCdzIHdoYXQgeW91IGdldCBmcm9tIHJlYWRpbmcgYSBib2d1cyBhZGRyZXNzLCBzbyB3ZQorCSAgIHRlc3QgdGhhdCBmaXJzdC4gKi8KKwlpZiAocmVhZF9zbWljX2ZsYWdzKHNtaWMpID09IDB4ZmYpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNtaWNfY2xlYW51cChzdHJ1Y3Qgc2lfc21fZGF0YSAqa2NzKQoreworfQorCitzdGF0aWMgaW50IHNtaWNfc2l6ZSh2b2lkKQoreworCXJldHVybiBzaXplb2Yoc3RydWN0IHNpX3NtX2RhdGEpOworfQorCitzdHJ1Y3Qgc2lfc21faGFuZGxlcnMgc21pY19zbWlfaGFuZGxlcnMgPQoreworCS52ZXJzaW9uICAgICAgICAgICA9IElQTUlfU01JQ19WRVJTSU9OLAorCS5pbml0X2RhdGEgICAgICAgICA9IGluaXRfc21pY19kYXRhLAorCS5zdGFydF90cmFuc2FjdGlvbiA9IHN0YXJ0X3NtaWNfdHJhbnNhY3Rpb24sCisJLmdldF9yZXN1bHQgICAgICAgID0gc21pY19nZXRfcmVzdWx0LAorCS5ldmVudCAgICAgICAgICAgICA9IHNtaWNfZXZlbnQsCisJLmRldGVjdCAgICAgICAgICAgID0gc21pY19kZXRlY3QsCisJLmNsZWFudXAgICAgICAgICAgID0gc21pY19jbGVhbnVwLAorCS5zaXplICAgICAgICAgICAgICA9IHNtaWNfc2l6ZSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3dhdGNoZG9nLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3dhdGNoZG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3MDkzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfd2F0Y2hkb2cuYwpAQCAtMCwwICsxLDEwNjggQEAKKy8qCisgKiBpcG1pX3dhdGNoZG9nLmMKKyAqCisgKiBBIHdhdGNoZG9nIHRpbWVyIGJhc2VkIHVwb24gdGhlIElQTUkgaW50ZXJmYWNlLgorICoKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICBDb3JleSBNaW55YXJkIDxtaW55YXJkQG12aXN0YS5jb20+CisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaXBtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwbWlfc21pLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvbm1pLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2VuZGlmCisKKyNkZWZpbmUJUEZYICJJUE1JIFdhdGNoZG9nOiAiCisKKyNkZWZpbmUgSVBNSV9XQVRDSERPR19WRVJTSU9OICJ2MzMiCisKKy8qCisgKiBUaGUgSVBNSSBjb21tYW5kL3Jlc3BvbnNlIGluZm9ybWF0aW9uIGZvciB0aGUgd2F0Y2hkb2cgdGltZXIuCisgKi8KKworLyogdmFsdWVzIGZvciBieXRlIDEgb2YgdGhlIHNldCBjb21tYW5kLCBieXRlIDIgb2YgdGhlIGdldCByZXNwb25zZS4gKi8KKyNkZWZpbmUgV0RPR19ET05UX0xPRwkJKDEgPDwgNykKKyNkZWZpbmUgV0RPR19ET05UX1NUT1BfT05fU0VUCSgxIDw8IDYpCisjZGVmaW5lIFdET0dfU0VUX1RJTUVSX1VTRShieXRlLCB1c2UpIFwKKwlieXRlID0gKChieXRlKSAmIDB4ZjgpIHwgKCh1c2UpICYgMHg3KQorI2RlZmluZSBXRE9HX0dFVF9USU1FUl9VU0UoYnl0ZSkgKChieXRlKSAmIDB4NykKKyNkZWZpbmUgV0RPR19USU1FUl9VU0VfQklPU19GUkIyCTEKKyNkZWZpbmUgV0RPR19USU1FUl9VU0VfQklPU19QT1NUCTIKKyNkZWZpbmUgV0RPR19USU1FUl9VU0VfT1NfTE9BRAkJMworI2RlZmluZSBXRE9HX1RJTUVSX1VTRV9TTVNfT1MJCTQKKyNkZWZpbmUgV0RPR19USU1FUl9VU0VfT0VNCQk1CisKKy8qIHZhbHVlcyBmb3IgYnl0ZSAyIG9mIHRoZSBzZXQgY29tbWFuZCwgYnl0ZSAzIG9mIHRoZSBnZXQgcmVzcG9uc2UuICovCisjZGVmaW5lIFdET0dfU0VUX1BSRVRJTUVPVVRfQUNUKGJ5dGUsIHVzZSkgXAorCWJ5dGUgPSAoKGJ5dGUpICYgMHg4ZikgfCAoKCh1c2UpICYgMHg3KSA8PCA0KQorI2RlZmluZSBXRE9HX0dFVF9QUkVUSU1FT1VUX0FDVChieXRlKSAoKChieXRlKSA+PiA0KSAmIDB4NykKKyNkZWZpbmUgV0RPR19QUkVUSU1FT1VUX05PTkUJCTAKKyNkZWZpbmUgV0RPR19QUkVUSU1FT1VUX1NNSQkJMQorI2RlZmluZSBXRE9HX1BSRVRJTUVPVVRfTk1JCQkyCisjZGVmaW5lIFdET0dfUFJFVElNRU9VVF9NU0dfSU5UCQkzCisKKy8qIE9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGEgcHJldGltb3V0LiAqLworI2RlZmluZSBXRE9HX1BSRU9QX05PTkUJCTAKKyNkZWZpbmUgV0RPR19QUkVPUF9QQU5JQwkxCisjZGVmaW5lIFdET0dfUFJFT1BfR0lWRV9EQVRBCTIgLyogQ2F1c2UgZGF0YSB0byBiZSBhdmFpbGFibGUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkLiAgRG9lc24ndCB3b3JrIGluIE5NSQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuICovCisKKy8qIEFjdGlvbnMgdG8gcGVyZm9ybSBvbiBhIGZ1bGwgdGltZW91dC4gKi8KKyNkZWZpbmUgV0RPR19TRVRfVElNRU9VVF9BQ1QoYnl0ZSwgdXNlKSBcCisJYnl0ZSA9ICgoYnl0ZSkgJiAweGY4KSB8ICgodXNlKSAmIDB4NykKKyNkZWZpbmUgV0RPR19HRVRfVElNRU9VVF9BQ1QoYnl0ZSkgKChieXRlKSAmIDB4NykKKyNkZWZpbmUgV0RPR19USU1FT1VUX05PTkUJCTAKKyNkZWZpbmUgV0RPR19USU1FT1VUX1JFU0VUCQkxCisjZGVmaW5lIFdET0dfVElNRU9VVF9QT1dFUl9ET1dOCQkyCisjZGVmaW5lIFdET0dfVElNRU9VVF9QT1dFUl9DWUNMRQkzCisKKy8qIEJ5dGUgMyBvZiB0aGUgZ2V0IGNvbW1hbmQsIGJ5dGUgNCBvZiB0aGUgZ2V0IHJlc3BvbnNlIGlzIHRoZQorICAgcHJlLXRpbWVvdXQgaW4gc2Vjb25kcy4gKi8KKworLyogQml0cyBmb3Igc2V0dGluZyBieXRlIDQgb2YgdGhlIHNldCBjb21tYW5kLCBieXRlIDUgb2YgdGhlIGdldCByZXNwb25zZS4gKi8KKyNkZWZpbmUgV0RPR19FWFBJUkVfQ0xFQVJfQklPU19GUkIyCSgxIDw8IDEpCisjZGVmaW5lIFdET0dfRVhQSVJFX0NMRUFSX0JJT1NfUE9TVAkoMSA8PCAyKQorI2RlZmluZSBXRE9HX0VYUElSRV9DTEVBUl9PU19MT0FECSgxIDw8IDMpCisjZGVmaW5lIFdET0dfRVhQSVJFX0NMRUFSX1NNU19PUwkoMSA8PCA0KQorI2RlZmluZSBXRE9HX0VYUElSRV9DTEVBUl9PRU0JCSgxIDw8IDUpCisKKy8qIFNldHRpbmcvZ2V0dGluZyB0aGUgd2F0Y2hkb2cgdGltZXIgdmFsdWUuICBUaGlzIGlzIGZvciBieXRlcyA1IGFuZAorICAgNiAodGhlIHRpbWVvdXQgdGltZSkgb2YgdGhlIHNldCBjb21tYW5kLCBhbmQgYnl0ZXMgNiBhbmQgNyAodGhlCisgICB0aW1lb3V0IHRpbWUpIGFuZCA4IGFuZCA5ICh0aGUgY3VycmVudCBjb3VudGRvd24gdmFsdWUpIG9mIHRoZQorICAgcmVzcG9uc2UuICBUaGUgdGltZW91dCB2YWx1ZSBpcyBnaXZlbiBpbiBzZWNvbmRzIChpbiB0aGUgY29tbWFuZCBpdAorICAgaXMgMTAwbXMgaW50ZXJ2YWxzKS4gKi8KKyNkZWZpbmUgV0RPR19TRVRfVElNRU9VVChieXRlMSwgYnl0ZTIsIHZhbCkgXAorCShieXRlMSkgPSAoKCh2YWwpICogMTApICYgMHhmZiksIChieXRlMikgPSAoKCh2YWwpICogMTApID4+IDgpCisjZGVmaW5lIFdET0dfR0VUX1RJTUVPVVQoYnl0ZTEsIGJ5dGUyKSBcCisJKCgoYnl0ZTEpIHwgKChieXRlMikgPDwgOCkpIC8gMTApCisKKyNkZWZpbmUgSVBNSV9XRE9HX1JFU0VUX1RJTUVSCQkweDIyCisjZGVmaW5lIElQTUlfV0RPR19TRVRfVElNRVIJCTB4MjQKKyNkZWZpbmUgSVBNSV9XRE9HX0dFVF9USU1FUgkJMHgyNQorCisvKiBUaGVzZSBhcmUgaGVyZSB1bnRpbCB0aGUgcmVhbCBvbmVzIGdldCBpbnRvIHRoZSB3YXRjaGRvZy5oIGludGVyZmFjZS4gKi8KKyNpZm5kZWYgV0RJT0NfR0VUVElNRU9VVAorI2RlZmluZQlXRElPQ19HRVRUSU1FT1VUICAgICAgICBfSU9XKFdBVENIRE9HX0lPQ1RMX0JBU0UsIDIwLCBpbnQpCisjZW5kaWYKKyNpZm5kZWYgV0RJT0NfU0VUX1BSRVRJTUVPVVQKKyNkZWZpbmUJV0RJT0NfU0VUX1BSRVRJTUVPVVQgICAgIF9JT1coV0FUQ0hET0dfSU9DVExfQkFTRSwgMjEsIGludCkKKyNlbmRpZgorI2lmbmRlZiBXRElPQ19HRVRfUFJFVElNRU9VVAorI2RlZmluZQlXRElPQ19HRVRfUFJFVElNRU9VVCAgICAgX0lPVyhXQVRDSERPR19JT0NUTF9CQVNFLCAyMiwgaW50KQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQ7CisjZW5kaWYKKworc3RhdGljIGlwbWlfdXNlcl90IHdhdGNoZG9nX3VzZXIgPSBOVUxMOworCisvKiBEZWZhdWx0IHRoZSB0aW1lb3V0IHRvIDEwIHNlY29uZHMuICovCitzdGF0aWMgaW50IHRpbWVvdXQgPSAxMDsKKworLyogVGhlIHByZS10aW1lb3V0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuICovCitzdGF0aWMgaW50IHByZXRpbWVvdXQgPSAwOworCisvKiBEZWZhdWx0IGFjdGlvbiBpcyB0byByZXNldCB0aGUgYm9hcmQgb24gYSB0aW1lb3V0LiAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWN0aW9uX3ZhbCA9IFdET0dfVElNRU9VVF9SRVNFVDsKKworc3RhdGljIGNoYXIgYWN0aW9uWzE2XSA9ICJyZXNldCI7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHByZWFjdGlvbl92YWwgPSBXRE9HX1BSRVRJTUVPVVRfTk9ORTsKKworc3RhdGljIGNoYXIgcHJlYWN0aW9uWzE2XSA9ICJwcmVfbm9uZSI7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHByZW9wX3ZhbCA9IFdET0dfUFJFT1BfTk9ORTsKKworc3RhdGljIGNoYXIgcHJlb3BbMTZdID0gInByZW9wX25vbmUiOworc3RhdGljIERFRklORV9TUElOTE9DSyhpcG1pX3JlYWRfbG9jayk7CitzdGF0aWMgY2hhciBkYXRhX3RvX3JlYWQgPSAwOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHJlYWRfcSk7CitzdGF0aWMgc3RydWN0IGZhc3luY19zdHJ1Y3QgKmZhc3luY19xID0gTlVMTDsKK3N0YXRpYyBjaGFyIHByZXRpbWVvdXRfc2luY2VfbGFzdF9oZWFydGJlYXQgPSAwOworc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOworCisvKiBJZiB0cnVlLCB0aGUgZHJpdmVyIHdpbGwgc3RhcnQgcnVubmluZyBhcyBzb29uIGFzIGl0IGlzIGNvbmZpZ3VyZWQKKyAgIGFuZCByZWFkeS4gKi8KK3N0YXRpYyBpbnQgc3RhcnRfbm93ID0gMDsKKworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJUaW1lb3V0IHZhbHVlIGluIHNlY29uZHMuIik7Cittb2R1bGVfcGFyYW0ocHJldGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJldGltZW91dCwgIlByZXRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcy4iKTsKK21vZHVsZV9wYXJhbV9zdHJpbmcoYWN0aW9uLCBhY3Rpb24sIHNpemVvZihhY3Rpb24pLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWN0aW9uLCAiVGltZW91dCBhY3Rpb24uIE9uZSBvZjogIgorCQkgInJlc2V0LCBub25lLCBwb3dlcl9jeWNsZSwgcG93ZXJfb2ZmLiIpOworbW9kdWxlX3BhcmFtX3N0cmluZyhwcmVhY3Rpb24sIHByZWFjdGlvbiwgc2l6ZW9mKHByZWFjdGlvbiksIDApOworTU9EVUxFX1BBUk1fREVTQyhwcmVhY3Rpb24sICJQcmV0aW1lb3V0IGFjdGlvbi4gIE9uZSBvZjogIgorCQkgInByZV9ub25lLCBwcmVfc21pLCBwcmVfbm1pLCBwcmVfaW50LiIpOworbW9kdWxlX3BhcmFtX3N0cmluZyhwcmVvcCwgcHJlb3AsIHNpemVvZihwcmVvcCksIDApOworTU9EVUxFX1BBUk1fREVTQyhwcmVvcCwgIlByZXRpbWVvdXQgZHJpdmVyIG9wZXJhdGlvbi4gIE9uZSBvZjogIgorCQkgInByZW9wX25vbmUsIHByZW9wX3BhbmljLCBwcmVvcF9naXZlX2RhdGEuIik7Cittb2R1bGVfcGFyYW0oc3RhcnRfbm93LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzdGFydF9ub3csICJTZXQgdG8gMSB0byBzdGFydCB0aGUgd2F0Y2hkb2cgYXMiCisJCSAic29vbiBhcyB0aGUgZHJpdmVyIGlzIGxvYWRlZC4iKTsKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCisvKiBEZWZhdWx0IHN0YXRlIG9mIHRoZSB0aW1lci4gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlwbWlfd2F0Y2hkb2dfc3RhdGUgPSBXRE9HX1RJTUVPVVRfTk9ORTsKKworLyogSWYgc2h1dHRpbmcgZG93biB2aWEgSVBNSSwgd2UgaWdub3JlIHRoZSBoZWFydGJlYXQuICovCitzdGF0aWMgaW50IGlwbWlfaWdub3JlX2hlYXJ0YmVhdCA9IDA7CisKKy8qIElzIHNvbWVvbmUgdXNpbmcgdGhlIHdhdGNoZG9nPyAgT25seSBvbmUgdXNlciBpcyBhbGxvd2VkLiAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXBtaV93ZG9nX29wZW4gPSAwOworCisvKiBJZiBzZXQgdG8gMSwgdGhlIGhlYXJ0YmVhdCBjb21tYW5kIHdpbGwgc2V0IHRoZSBzdGF0ZSB0byByZXNldCBhbmQKKyAgIHN0YXJ0IHRoZSB0aW1lci4gIFRoZSB0aW1lciBkb2Vzbid0IG5vcm1hbGx5IHJ1biB3aGVuIHRoZSBkcml2ZXIgaXMKKyAgIGZpcnN0IG9wZW5lZCB1bnRpbCB0aGUgaGVhcnRiZWF0IGlzIHNldCB0aGUgZmlyc3QgdGltZSwgdGhpcworICAgdmFyaWFibGUgaXMgdXNlZCB0byBhY2NvbXBsaXNoIHRoaXMuICovCitzdGF0aWMgaW50IGlwbWlfc3RhcnRfdGltZXJfb25faGVhcnRiZWF0ID0gMDsKKworLyogSVBNSSB2ZXJzaW9uIG9mIHRoZSBCTUMuICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBpcG1pX3ZlcnNpb25fbWFqb3I7CitzdGF0aWMgdW5zaWduZWQgY2hhciBpcG1pX3ZlcnNpb25fbWlub3I7CisKKworc3RhdGljIGludCBpcG1pX2hlYXJ0YmVhdCh2b2lkKTsKK3N0YXRpYyB2b2lkIHBhbmljX2hhbHRfaXBtaV9oZWFydGJlYXQodm9pZCk7CisKKworLyogV2UgdXNlIGEgc2VtYXBob3JlIHRvIG1ha2Ugc3VyZSB0aGF0IG9ubHkgb25lIHRoaW5nIGNhbiBzZW5kIGEgc2V0CisgICB0aW1lb3V0IGF0IG9uZSB0aW1lLCBiZWNhdXNlIHdlIG9ubHkgaGF2ZSBvbmUgY29weSBvZiB0aGUgZGF0YS4KKyAgIFRoZSBzZW1hcGhvcmUgaXMgY2xhaW1lZCB3aGVuIHRoZSBzZXRfdGltZW91dCBpcyBzZW50IGFuZCBmcmVlZAorICAgd2hlbiBib3RoIG1lc3NhZ2VzIGFyZSBmcmVlLiAqLworc3RhdGljIGF0b21pY190IHNldF90aW1lb3V0X3RvZnJlZSA9IEFUT01JQ19JTklUKDApOworc3RhdGljIERFQ0xBUkVfTVVURVgoc2V0X3RpbWVvdXRfbG9jayk7CitzdGF0aWMgdm9pZCBzZXRfdGltZW91dF9mcmVlX3NtaShzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7CisgICAgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnNldF90aW1lb3V0X3RvZnJlZSkpCisJICAgIHVwKCZzZXRfdGltZW91dF9sb2NrKTsKK30KK3N0YXRpYyB2b2lkIHNldF90aW1lb3V0X2ZyZWVfcmVjdihzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnKQoreworICAgIGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzZXRfdGltZW91dF90b2ZyZWUpKQorCSAgICB1cCgmc2V0X3RpbWVvdXRfbG9jayk7Cit9CitzdGF0aWMgc3RydWN0IGlwbWlfc21pX21zZyBzZXRfdGltZW91dF9zbWlfbXNnID0KK3sKKwkuZG9uZSA9IHNldF90aW1lb3V0X2ZyZWVfc21pCit9Oworc3RhdGljIHN0cnVjdCBpcG1pX3JlY3ZfbXNnIHNldF90aW1lb3V0X3JlY3ZfbXNnID0KK3sKKwkuZG9uZSA9IHNldF90aW1lb3V0X2ZyZWVfcmVjdgorfTsKKyAKK3N0YXRpYyBpbnQgaV9pcG1pX3NldF90aW1lb3V0KHN0cnVjdCBpcG1pX3NtaV9tc2cgICpzbWlfbXNnLAorCQkJICAgICAgc3RydWN0IGlwbWlfcmVjdl9tc2cgKnJlY3ZfbXNnLAorCQkJICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnNlbmRfaGVhcnRiZWF0X25vdykKK3sKKwlzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICAgICAgICAgICAgbXNnOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgICBkYXRhWzZdOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjsKKwlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgYWRkcjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGJub3cgPSAwOworCisKKwlkYXRhWzBdID0gMDsKKwlXRE9HX1NFVF9USU1FUl9VU0UoZGF0YVswXSwgV0RPR19USU1FUl9VU0VfU01TX09TKTsKKworCWlmICgoaXBtaV92ZXJzaW9uX21ham9yID4gMSkKKwkgICAgfHwgKChpcG1pX3ZlcnNpb25fbWFqb3IgPT0gMSkgJiYgKGlwbWlfdmVyc2lvbl9taW5vciA+PSA1KSkpCisJeworCQkvKiBUaGlzIGlzIGFuIElQTUkgMS41LW9ubHkgZmVhdHVyZS4gKi8KKwkJZGF0YVswXSB8PSBXRE9HX0RPTlRfU1RPUF9PTl9TRVQ7CisJfSBlbHNlIGlmIChpcG1pX3dhdGNoZG9nX3N0YXRlICE9IFdET0dfVElNRU9VVF9OT05FKSB7CisJCS8qIEluIGlwbWkgMS4wLCBzZXR0aW5nIHRoZSB0aW1lciBzdG9wcyB0aGUgd2F0Y2hkb2csIHdlCisJCSAgIG5lZWQgdG8gc3RhcnQgaXQgYmFjayB1cCBhZ2Fpbi4gKi8KKwkJaGJub3cgPSAxOworCX0KKworCWRhdGFbMV0gPSAwOworCVdET0dfU0VUX1RJTUVPVVRfQUNUKGRhdGFbMV0sIGlwbWlfd2F0Y2hkb2dfc3RhdGUpOworCWlmIChwcmV0aW1lb3V0ID4gMCkgeworCSAgICBXRE9HX1NFVF9QUkVUSU1FT1VUX0FDVChkYXRhWzFdLCBwcmVhY3Rpb25fdmFsKTsKKwkgICAgZGF0YVsyXSA9IHByZXRpbWVvdXQ7CisJfSBlbHNlIHsKKwkgICAgV0RPR19TRVRfUFJFVElNRU9VVF9BQ1QoZGF0YVsxXSwgV0RPR19QUkVUSU1FT1VUX05PTkUpOworCSAgICBkYXRhWzJdID0gMDsgLyogTm8gcHJldGltZW91dC4gKi8KKwl9CisJZGF0YVszXSA9IDA7CisJV0RPR19TRVRfVElNRU9VVChkYXRhWzRdLCBkYXRhWzVdLCB0aW1lb3V0KTsKKworCWFkZHIuYWRkcl90eXBlID0gSVBNSV9TWVNURU1fSU5URVJGQUNFX0FERFJfVFlQRTsKKwlhZGRyLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworCWFkZHIubHVuID0gMDsKKworCW1zZy5uZXRmbiA9IDB4MDY7CisJbXNnLmNtZCA9IElQTUlfV0RPR19TRVRfVElNRVI7CisJbXNnLmRhdGEgPSBkYXRhOworCW1zZy5kYXRhX2xlbiA9IHNpemVvZihkYXRhKTsKKwlydiA9IGlwbWlfcmVxdWVzdF9zdXBwbHlfbXNncyh3YXRjaGRvZ191c2VyLAorCQkJCSAgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZhZGRyLAorCQkJCSAgICAgIDAsCisJCQkJICAgICAgJm1zZywKKwkJCQkgICAgICBOVUxMLAorCQkJCSAgICAgIHNtaV9tc2csCisJCQkJICAgICAgcmVjdl9tc2csCisJCQkJICAgICAgMSk7CisJaWYgKHJ2KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJzZXQgdGltZW91dCBlcnJvcjogJWRcbiIsCisJCSAgICAgICBydik7CisJfQorCisJaWYgKHNlbmRfaGVhcnRiZWF0X25vdykKKwkgICAgKnNlbmRfaGVhcnRiZWF0X25vdyA9IGhibm93OworCisJcmV0dXJuIHJ2OworfQorCisvKiBQYXJhbWV0ZXJzIHRvIGlwbWlfc2V0X3RpbWVvdXQgKi8KKyNkZWZpbmUgSVBNSV9TRVRfVElNRU9VVF9OT19IQgkJCTAKKyNkZWZpbmUgSVBNSV9TRVRfVElNRU9VVF9IQl9JRl9ORUNFU1NBUlkJMQorI2RlZmluZSBJUE1JX1NFVF9USU1FT1VUX0ZPUkNFX0hCCQkyCisKK3N0YXRpYyBpbnQgaXBtaV9zZXRfdGltZW91dChpbnQgZG9faGVhcnRiZWF0KQoreworCWludCBzZW5kX2hlYXJ0YmVhdF9ub3c7CisJaW50IHJ2OworCisKKwkvKiBXZSBjYW4gb25seSBzZW5kIG9uZSBvZiB0aGVzZSBhdCBhIHRpbWUuICovCisJZG93bigmc2V0X3RpbWVvdXRfbG9jayk7CisKKwlhdG9taWNfc2V0KCZzZXRfdGltZW91dF90b2ZyZWUsIDIpOworCisJcnYgPSBpX2lwbWlfc2V0X3RpbWVvdXQoJnNldF90aW1lb3V0X3NtaV9tc2csCisJCQkJJnNldF90aW1lb3V0X3JlY3ZfbXNnLAorCQkJCSZzZW5kX2hlYXJ0YmVhdF9ub3cpOworCWlmIChydikgeworCQl1cCgmc2V0X3RpbWVvdXRfbG9jayk7CisJfSBlbHNlIHsKKwkJaWYgKChkb19oZWFydGJlYXQgPT0gSVBNSV9TRVRfVElNRU9VVF9GT1JDRV9IQikKKwkJICAgIHx8ICgoc2VuZF9oZWFydGJlYXRfbm93KQorCQkJJiYgKGRvX2hlYXJ0YmVhdCA9PSBJUE1JX1NFVF9USU1FT1VUX0hCX0lGX05FQ0VTU0FSWSkpKQorCQl7CisJCQlydiA9IGlwbWlfaGVhcnRiZWF0KCk7CisJCX0KKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIGR1bW15X3NtaV9mcmVlKHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKK30KK3N0YXRpYyB2b2lkIGR1bW15X3JlY3ZfZnJlZShzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnKQoreworfQorc3RhdGljIHN0cnVjdCBpcG1pX3NtaV9tc2cgcGFuaWNfaGFsdF9zbWlfbXNnID0KK3sKKwkuZG9uZSA9IGR1bW15X3NtaV9mcmVlCit9Oworc3RhdGljIHN0cnVjdCBpcG1pX3JlY3ZfbXNnIHBhbmljX2hhbHRfcmVjdl9tc2cgPQoreworCS5kb25lID0gZHVtbXlfcmVjdl9mcmVlCit9OworCisvKiBTcGVjaWFsIGNhbGwsIGRvZXNuJ3QgY2xhaW0gYW55IGxvY2tzLiAgVGhpcyBpcyBvbmx5IHRvIGJlIGNhbGxlZAorICAgYXQgcGFuaWMgb3IgaGFsdCB0aW1lLCBpbiBydW4tdG8tY29tcGxldGlvbiBtb2RlLCB3aGVuIHRoZSBjYWxsZXIKKyAgIGlzIHRoZSBvbmx5IENQVSBhbmQgdGhlIG9ubHkgdGhpbmcgdGhhdCB3aWxsIGJlIGdvaW5nIGlzIHRoZXNlIElQTUkKKyAgIGNhbGxzLiAqLworc3RhdGljIHZvaWQgcGFuaWNfaGFsdF9pcG1pX3NldF90aW1lb3V0KHZvaWQpCit7CisJaW50IHNlbmRfaGVhcnRiZWF0X25vdzsKKwlpbnQgcnY7CisKKwlydiA9IGlfaXBtaV9zZXRfdGltZW91dCgmcGFuaWNfaGFsdF9zbWlfbXNnLAorCQkJCSZwYW5pY19oYWx0X3JlY3ZfbXNnLAorCQkJCSZzZW5kX2hlYXJ0YmVhdF9ub3cpOworCWlmICghcnYpIHsKKwkJaWYgKHNlbmRfaGVhcnRiZWF0X25vdykKKwkJCXBhbmljX2hhbHRfaXBtaV9oZWFydGJlYXQoKTsKKwl9Cit9CisKKy8qIFdlIHVzZSBhIHNlbWFwaG9yZSB0byBtYWtlIHN1cmUgdGhhdCBvbmx5IG9uZSB0aGluZyBjYW4gc2VuZCBhCisgICBoZWFydGJlYXQgYXQgb25lIHRpbWUsIGJlY2F1c2Ugd2Ugb25seSBoYXZlIG9uZSBjb3B5IG9mIHRoZSBkYXRhLgorICAgVGhlIHNlbWFwaG9yZSBpcyBjbGFpbWVkIHdoZW4gdGhlIHNldF90aW1lb3V0IGlzIHNlbnQgYW5kIGZyZWVkCisgICB3aGVuIGJvdGggbWVzc2FnZXMgYXJlIGZyZWUuICovCitzdGF0aWMgYXRvbWljX3QgaGVhcnRiZWF0X3RvZnJlZSA9IEFUT01JQ19JTklUKDApOworc3RhdGljIERFQ0xBUkVfTVVURVgoaGVhcnRiZWF0X2xvY2spOworc3RhdGljIERFQ0xBUkVfTVVURVhfTE9DS0VEKGhlYXJ0YmVhdF93YWl0X2xvY2spOworc3RhdGljIHZvaWQgaGVhcnRiZWF0X2ZyZWVfc21pKHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3sKKyAgICBpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaGVhcnRiZWF0X3RvZnJlZSkpCisJICAgIHVwKCZoZWFydGJlYXRfd2FpdF9sb2NrKTsKK30KK3N0YXRpYyB2b2lkIGhlYXJ0YmVhdF9mcmVlX3JlY3Yoc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZykKK3sKKyAgICBpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaGVhcnRiZWF0X3RvZnJlZSkpCisJICAgIHVwKCZoZWFydGJlYXRfd2FpdF9sb2NrKTsKK30KK3N0YXRpYyBzdHJ1Y3QgaXBtaV9zbWlfbXNnIGhlYXJ0YmVhdF9zbWlfbXNnID0KK3sKKwkuZG9uZSA9IGhlYXJ0YmVhdF9mcmVlX3NtaQorfTsKK3N0YXRpYyBzdHJ1Y3QgaXBtaV9yZWN2X21zZyBoZWFydGJlYXRfcmVjdl9tc2cgPQoreworCS5kb25lID0gaGVhcnRiZWF0X2ZyZWVfcmVjdgorfTsKKyAKK3N0YXRpYyBzdHJ1Y3QgaXBtaV9zbWlfbXNnIHBhbmljX2hhbHRfaGVhcnRiZWF0X3NtaV9tc2cgPQoreworCS5kb25lID0gZHVtbXlfc21pX2ZyZWUKK307CitzdGF0aWMgc3RydWN0IGlwbWlfcmVjdl9tc2cgcGFuaWNfaGFsdF9oZWFydGJlYXRfcmVjdl9tc2cgPQoreworCS5kb25lID0gZHVtbXlfcmVjdl9mcmVlCit9OworIAorc3RhdGljIGludCBpcG1pX2hlYXJ0YmVhdCh2b2lkKQoreworCXN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgICAgICAgICAgICBtc2c7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2OworCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciBhZGRyOworCisJaWYgKGlwbWlfaWdub3JlX2hlYXJ0YmVhdCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaXBtaV9zdGFydF90aW1lcl9vbl9oZWFydGJlYXQpIHsKKwkJaXBtaV9zdGFydF90aW1lcl9vbl9oZWFydGJlYXQgPSAwOworCQlpcG1pX3dhdGNoZG9nX3N0YXRlID0gYWN0aW9uX3ZhbDsKKwkJcmV0dXJuIGlwbWlfc2V0X3RpbWVvdXQoSVBNSV9TRVRfVElNRU9VVF9GT1JDRV9IQik7CisJfSBlbHNlIGlmIChwcmV0aW1lb3V0X3NpbmNlX2xhc3RfaGVhcnRiZWF0KSB7CisJCS8qIEEgcHJldGltZW91dCBvY2N1cnJlZCwgbWFrZSBzdXJlIHdlIHNldCB0aGUgdGltZW91dC4KKwkJICAgV2UgZG9uJ3Qgd2FudCB0byBzZXQgdGhlIGFjdGlvbiwgdGhvdWdoLCB3ZSB3YW50IHRvCisJCSAgIGxlYXZlIHRoYXQgYWxvbmUgKHRodXMgaXQgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCB0aGUKKwkJICAgYWJvdmUgb3BlcmF0aW9uLiAqLworCQlwcmV0aW1lb3V0X3NpbmNlX2xhc3RfaGVhcnRiZWF0ID0gMDsKKwkJcmV0dXJuIGlwbWlfc2V0X3RpbWVvdXQoSVBNSV9TRVRfVElNRU9VVF9IQl9JRl9ORUNFU1NBUlkpOworCX0KKworCWRvd24oJmhlYXJ0YmVhdF9sb2NrKTsKKworCWF0b21pY19zZXQoJmhlYXJ0YmVhdF90b2ZyZWUsIDIpOworCisJLyogRG9uJ3QgcmVzZXQgdGhlIHRpbWVyIGlmIHdlIGhhdmUgdGhlIHRpbWVyIHR1cm5lZCBvZmYsIHRoYXQKKyAgICAgICAgICAgcmUtZW5hYmxlcyB0aGUgd2F0Y2hkb2cuICovCisJaWYgKGlwbWlfd2F0Y2hkb2dfc3RhdGUgPT0gV0RPR19USU1FT1VUX05PTkUpIHsKKwkJdXAoJmhlYXJ0YmVhdF9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYWRkci5hZGRyX3R5cGUgPSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFOworCWFkZHIuY2hhbm5lbCA9IElQTUlfQk1DX0NIQU5ORUw7CisJYWRkci5sdW4gPSAwOworCisJbXNnLm5ldGZuID0gMHgwNjsKKwltc2cuY21kID0gSVBNSV9XRE9HX1JFU0VUX1RJTUVSOworCW1zZy5kYXRhID0gTlVMTDsKKwltc2cuZGF0YV9sZW4gPSAwOworCXJ2ID0gaXBtaV9yZXF1ZXN0X3N1cHBseV9tc2dzKHdhdGNoZG9nX3VzZXIsCisJCQkJICAgICAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJmFkZHIsCisJCQkJICAgICAgMCwKKwkJCQkgICAgICAmbXNnLAorCQkJCSAgICAgIE5VTEwsCisJCQkJICAgICAgJmhlYXJ0YmVhdF9zbWlfbXNnLAorCQkJCSAgICAgICZoZWFydGJlYXRfcmVjdl9tc2csCisJCQkJICAgICAgMSk7CisJaWYgKHJ2KSB7CisJCXVwKCZoZWFydGJlYXRfbG9jayk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJoZWFydGJlYXQgZmFpbHVyZTogJWRcbiIsCisJCSAgICAgICBydik7CisJCXJldHVybiBydjsKKwl9CisKKwkvKiBXYWl0IGZvciB0aGUgaGVhcnRiZWF0IHRvIGJlIHNlbnQuICovCisJZG93bigmaGVhcnRiZWF0X3dhaXRfbG9jayk7CisKKwlpZiAoaGVhcnRiZWF0X3JlY3ZfbXNnLm1zZy5kYXRhWzBdICE9IDApIHsKKwkgICAgLyogR290IGFuIGVycm9yIGluIHRoZSBoZWFydGJlYXQgcmVzcG9uc2UuICBJdCB3YXMgYWxyZWFkeQorCSAgICAgICByZXBvcnRlZCBpbiBpcG1pX3dkb2dfbXNnX2hhbmRsZXIsIGJ1dCB3ZSBzaG91bGQgcmV0dXJuCisJICAgICAgIGFuIGVycm9yIGhlcmUuICovCisJICAgIHJ2ID0gLUVJTlZBTDsKKwl9CisKKwl1cCgmaGVhcnRiZWF0X2xvY2spOworCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBwYW5pY19oYWx0X2lwbWlfaGVhcnRiZWF0KHZvaWQpCit7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgICAgICAgICAgICBtc2c7CisJc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyIGFkZHI7CisKKworCS8qIERvbid0IHJlc2V0IHRoZSB0aW1lciBpZiB3ZSBoYXZlIHRoZSB0aW1lciB0dXJuZWQgb2ZmLCB0aGF0CisgICAgICAgICAgIHJlLWVuYWJsZXMgdGhlIHdhdGNoZG9nLiAqLworCWlmIChpcG1pX3dhdGNoZG9nX3N0YXRlID09IFdET0dfVElNRU9VVF9OT05FKQorCQlyZXR1cm47CisKKwlhZGRyLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisJYWRkci5jaGFubmVsID0gSVBNSV9CTUNfQ0hBTk5FTDsKKwlhZGRyLmx1biA9IDA7CisKKwltc2cubmV0Zm4gPSAweDA2OworCW1zZy5jbWQgPSBJUE1JX1dET0dfUkVTRVRfVElNRVI7CisJbXNnLmRhdGEgPSBOVUxMOworCW1zZy5kYXRhX2xlbiA9IDA7CisJaXBtaV9yZXF1ZXN0X3N1cHBseV9tc2dzKHdhdGNoZG9nX3VzZXIsCisJCQkJIChzdHJ1Y3QgaXBtaV9hZGRyICopICZhZGRyLAorCQkJCSAwLAorCQkJCSAmbXNnLAorCQkJCSBOVUxMLAorCQkJCSAmcGFuaWNfaGFsdF9oZWFydGJlYXRfc21pX21zZywKKwkJCQkgJnBhbmljX2hhbHRfaGVhcnRiZWF0X3JlY3ZfbXNnLAorCQkJCSAxKTsKK30KKworc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50PQoreworCS5vcHRpb25zCT0gMCwJLyogV0RJT0ZfU0VUVElNRU9VVCwgKi8KKwkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJLmlkZW50aXR5CT0gIklQTUkiCit9OworCitzdGF0aWMgaW50IGlwbWlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBpOworCWludCB2YWw7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlpID0gY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSk7CisJCXJldHVybiBpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWkgPSBjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSk7CisJCWlmIChpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXRpbWVvdXQgPSB2YWw7CisJCXJldHVybiBpcG1pX3NldF90aW1lb3V0KElQTUlfU0VUX1RJTUVPVVRfSEJfSUZfTkVDRVNTQVJZKTsKKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJaSA9IGNvcHlfdG9fdXNlcihhcmdwLCAmdGltZW91dCwgc2l6ZW9mKHRpbWVvdXQpKTsKKwkJaWYgKGkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFdESU9DX1NFVF9QUkVUSU1FT1VUOgorCQlpID0gY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpOworCQlpZiAoaSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwcmV0aW1lb3V0ID0gdmFsOworCQlyZXR1cm4gaXBtaV9zZXRfdGltZW91dChJUE1JX1NFVF9USU1FT1VUX0hCX0lGX05FQ0VTU0FSWSk7CisKKwljYXNlIFdESU9DX0dFVF9QUkVUSU1FT1VUOgorCQlpID0gY29weV90b191c2VyKGFyZ3AsICZwcmV0aW1lb3V0LCBzaXplb2YocHJldGltZW91dCkpOworCQlpZiAoaSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQlyZXR1cm4gaXBtaV9oZWFydGJlYXQoKTsKKworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJaSA9IGNvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZ3AsIHNpemVvZihpbnQpKTsKKwkJaWYgKGkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAmIFdESU9TX0RJU0FCTEVDQVJEKQorCQl7CisJCQlpcG1pX3dhdGNoZG9nX3N0YXRlID0gV0RPR19USU1FT1VUX05PTkU7CisJCQlpcG1pX3NldF90aW1lb3V0KElQTUlfU0VUX1RJTUVPVVRfTk9fSEIpOworCQkJaXBtaV9zdGFydF90aW1lcl9vbl9oZWFydGJlYXQgPSAwOworCQl9CisKKwkJaWYgKHZhbCAmIFdESU9TX0VOQUJMRUNBUkQpCisJCXsKKwkJCWlwbWlfd2F0Y2hkb2dfc3RhdGUgPSBhY3Rpb25fdmFsOworCQkJaXBtaV9zZXRfdGltZW91dChJUE1JX1NFVF9USU1FT1VUX0ZPUkNFX0hCKTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQl2YWwgPSAwOworCQlpID0gY29weV90b191c2VyKGFyZ3AsICZ2YWwsIHNpemVvZih2YWwpKTsKKwkJaWYgKGkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RhdGljIHNzaXplX3QgaXBtaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgY29uc3QgY2hhciAgX191c2VyICpidWYsCisJCQkgIHNpemVfdCAgICAgIGxlbiwKKwkJCSAgbG9mZl90ICAgICAgKnBwb3MpCit7CisJaW50IHJ2OworCisJaWYgKGxlbikgeworCSAgICAJaWYgKCFub3dheW91dCkgeworCQkgICAgCXNpemVfdCBpOworCisJCQkvKiBJbiBjYXNlIGl0IHdhcyBzZXQgbG9uZyBhZ28gKi8KKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKyAgICAJCQlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCQkJY2hhciBjOworCisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCXJ2ID0gaXBtaV9oZWFydGJlYXQoKTsKKwkJaWYgKHJ2KQorCQkJcmV0dXJuIHJ2OworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGlwbWlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSBjaGFyICAgICAgICBfX3VzZXIgKmJ1ZiwKKwkJCSBzaXplX3QgICAgICBjb3VudCwKKwkJCSBsb2ZmX3QgICAgICAqcHBvcykKK3sKKwlpbnQgICAgICAgICAgcnYgPSAwOworCXdhaXRfcXVldWVfdCB3YWl0OworCisJaWYgKGNvdW50IDw9IDApCisJCXJldHVybiAwOworCisJLyogUmVhZGluZyByZXR1cm5zIGlmIHRoZSBwcmV0aW1lb3V0IGhhcyBnb25lIG9mZiwgYW5kIGl0IG9ubHkgZG9lcworCSAgIGl0IG9uY2UgcGVyIHByZXRpbWVvdXQuICovCisJc3Bpbl9sb2NrKCZpcG1pX3JlYWRfbG9jayk7CisJaWYgKCFkYXRhX3RvX3JlYWQpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlydiA9IC1FQUdBSU47CisJCQlnb3RvIG91dDsKKwkJfQorCQkKKwkJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCQlhZGRfd2FpdF9xdWV1ZSgmcmVhZF9xLCAmd2FpdCk7CisJCXdoaWxlICghZGF0YV90b19yZWFkKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc3Bpbl91bmxvY2soJmlwbWlfcmVhZF9sb2NrKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlzcGluX2xvY2soJmlwbWlfcmVhZF9sb2NrKTsKKwkJfQorCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcmVhZF9xLCAmd2FpdCk7CisJICAgIAorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJ2ID0gLUVSRVNUQVJUU1lTOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJZGF0YV90b19yZWFkID0gMDsKKworIG91dDoKKwlzcGluX3VubG9jaygmaXBtaV9yZWFkX2xvY2spOworCisJaWYgKHJ2ID09IDApIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsICZkYXRhX3RvX3JlYWQsIDEpKQorCQkJcnYgPSAtRUZBVUxUOworCQllbHNlCisJCQlydiA9IDE7CisJfQorCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IGlwbWlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwKQoreworICAgICAgICBzd2l0Y2ggKGltaW5vcihpbm8pKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBXQVRDSERPR19NSU5PUjoKKwkJICAgIGlmKHRlc3RfYW5kX3NldF9iaXQoMCwgJmlwbWlfd2RvZ19vcGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisKKwkJICAgIC8qIERvbid0IHN0YXJ0IHRoZSB0aW1lciBub3csIGxldCBpdCBzdGFydCBvbiB0aGUKKwkJICAgICAgIGZpcnN0IGhlYXJ0YmVhdC4gKi8KKwkJICAgIGlwbWlfc3RhcnRfdGltZXJfb25faGVhcnRiZWF0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vLCBmaWxlcCk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC1FTk9ERVYpOworICAgICAgICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBtaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwkKKwlwb2xsX3dhaXQoZmlsZSwgJnJlYWRfcSwgd2FpdCk7CisKKwlzcGluX2xvY2soJmlwbWlfcmVhZF9sb2NrKTsKKwlpZiAoZGF0YV90b19yZWFkKQorCQltYXNrIHw9IChQT0xMSU4gfCBQT0xMUkROT1JNKTsKKwlzcGluX3VubG9jaygmaXBtaV9yZWFkX2xvY2spOworCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgaXBtaV9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG9uKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJmZhc3luY19xKTsKKworCXJldHVybiAocmVzdWx0KTsKK30KKworc3RhdGljIGludCBpcG1pX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJaWYgKGltaW5vcihpbm8pPT1XQVRDSERPR19NSU5PUikKKwl7CisJCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJCWlwbWlfd2F0Y2hkb2dfc3RhdGUgPSBXRE9HX1RJTUVPVVRfTk9ORTsKKwkJCWlwbWlfc2V0X3RpbWVvdXQoSVBNSV9TRVRfVElNRU9VVF9OT19IQik7CisJCQljbGVhcl9iaXQoMCwgJmlwbWlfd2RvZ19vcGVuKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgUEZYICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJCWlwbWlfaGVhcnRiZWF0KCk7CisJCX0KKwl9CisKKwlpcG1pX2Zhc3luYyAoLTEsIGZpbGVwLCAwKTsKKwlleHBlY3RfY2xvc2UgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlwbWlfd2RvZ19mb3BzID0geworCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJLnJlYWQgICAgPSBpcG1pX3JlYWQsCisJLnBvbGwgICAgPSBpcG1pX3BvbGwsCisJLndyaXRlICAgPSBpcG1pX3dyaXRlLAorCS5pb2N0bCAgID0gaXBtaV9pb2N0bCwKKwkub3BlbiAgICA9IGlwbWlfb3BlbiwKKwkucmVsZWFzZSA9IGlwbWlfY2xvc2UsCisJLmZhc3luYyAgPSBpcG1pX2Zhc3luYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBpcG1pX3dkb2dfbWlzY2RldiA9IHsKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJCT0gIndhdGNoZG9nIiwKKwkuZm9wcwkJPSAmaXBtaV93ZG9nX2ZvcHMKK307CisKK3N0YXRpYyBERUNMQVJFX1JXU0VNKHJlZ2lzdGVyX3NlbSk7CisKK3N0YXRpYyB2b2lkIGlwbWlfd2RvZ19tc2dfaGFuZGxlcihzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnLAorCQkJCSAgdm9pZCAgICAgICAgICAgICAgICAgKmhhbmRsZXJfZGF0YSkKK3sKKwlpZiAobXNnLT5tc2cuZGF0YVswXSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInJlc3BvbnNlOiBFcnJvciAleCBvbiBjbWQgJXhcbiIsCisJCSAgICAgICBtc2ctPm1zZy5kYXRhWzBdLAorCQkgICAgICAgbXNnLT5tc2cuY21kKTsKKwl9CisJCisJaXBtaV9mcmVlX3JlY3ZfbXNnKG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGlwbWlfd2RvZ19wcmV0aW1lb3V0X2hhbmRsZXIodm9pZCAqaGFuZGxlcl9kYXRhKQoreworCWlmIChwcmVhY3Rpb25fdmFsICE9IFdET0dfUFJFVElNRU9VVF9OT05FKSB7CisJCWlmIChwcmVvcF92YWwgPT0gV0RPR19QUkVPUF9QQU5JQykKKwkJCXBhbmljKCJXYXRjaGRvZyBwcmUtdGltZW91dCIpOworCQllbHNlIGlmIChwcmVvcF92YWwgPT0gV0RPR19QUkVPUF9HSVZFX0RBVEEpIHsKKwkJCXNwaW5fbG9jaygmaXBtaV9yZWFkX2xvY2spOworCQkJZGF0YV90b19yZWFkID0gMTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmVhZF9xKTsKKwkJCWtpbGxfZmFzeW5jKCZmYXN5bmNfcSwgU0lHSU8sIFBPTExfSU4pOworCisJCQlzcGluX3VubG9jaygmaXBtaV9yZWFkX2xvY2spOworCQl9CisJfQorCisJLyogT24gc29tZSBtYWNoaW5lcywgdGhlIGhlYXJ0YmVhdCB3aWxsIGdpdmUKKwkgICBhbiBlcnJvciBhbmQgbm90IHdvcmsgdW5sZXNzIHdlIHJlLWVuYWJsZQorCSAgIHRoZSB0aW1lci4gICBTbyBkbyBzby4gKi8KKwlwcmV0aW1lb3V0X3NpbmNlX2xhc3RfaGVhcnRiZWF0ID0gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcG1pX3VzZXJfaG5kbCBpcG1pX2huZGxycyA9Cit7CisJLmlwbWlfcmVjdl9obmRsICAgICAgICAgICA9IGlwbWlfd2RvZ19tc2dfaGFuZGxlciwKKwkuaXBtaV93YXRjaGRvZ19wcmV0aW1lb3V0ID0gaXBtaV93ZG9nX3ByZXRpbWVvdXRfaGFuZGxlcgorfTsKKworc3RhdGljIHZvaWQgaXBtaV9yZWdpc3Rlcl93YXRjaGRvZyhpbnQgaXBtaV9pbnRmKQoreworCWludCBydiA9IC1FQlVTWTsKKworCWRvd25fd3JpdGUoJnJlZ2lzdGVyX3NlbSk7CisJaWYgKHdhdGNoZG9nX3VzZXIpCisJCWdvdG8gb3V0OworCisJcnYgPSBpcG1pX2NyZWF0ZV91c2VyKGlwbWlfaW50ZiwgJmlwbWlfaG5kbHJzLCBOVUxMLCAmd2F0Y2hkb2dfdXNlcik7CisJaWYgKHJ2IDwgMCkgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5hYmxlIHRvIHJlZ2lzdGVyIHdpdGggaXBtaVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlwbWlfZ2V0X3ZlcnNpb24od2F0Y2hkb2dfdXNlciwKKwkJCSAmaXBtaV92ZXJzaW9uX21ham9yLAorCQkJICZpcG1pX3ZlcnNpb25fbWlub3IpOworCisJcnYgPSBtaXNjX3JlZ2lzdGVyKCZpcG1pX3dkb2dfbWlzY2Rldik7CisJaWYgKHJ2IDwgMCkgeworCQlpcG1pX2Rlc3Ryb3lfdXNlcih3YXRjaGRvZ191c2VyKTsKKwkJd2F0Y2hkb2dfdXNlciA9IE5VTEw7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJVbmFibGUgdG8gcmVnaXN0ZXIgbWlzYyBkZXZpY2VcbiIpOworCX0KKworIG91dDoKKwl1cF93cml0ZSgmcmVnaXN0ZXJfc2VtKTsKKworCWlmICgoc3RhcnRfbm93KSAmJiAocnYgPT0gMCkpIHsKKwkJLyogUnVuIGZyb20gc3RhcnR1cCwgc28gc3RhcnQgdGhlIHRpbWVyIG5vdy4gKi8KKwkJc3RhcnRfbm93ID0gMDsgLyogRGlzYWJsZSB0aGlzIGZ1bmN0aW9uIGFmdGVyIGZpcnN0IHN0YXJ0dXAuICovCisJCWlwbWlfd2F0Y2hkb2dfc3RhdGUgPSBhY3Rpb25fdmFsOworCQlpcG1pX3NldF90aW1lb3V0KElQTUlfU0VUX1RJTUVPVVRfRk9SQ0VfSEIpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiU3RhcnRpbmcgbm93IVxuIik7CisJfQorfQorCisjaWZkZWYgSEFWRV9OTUlfSEFORExFUgorc3RhdGljIGludAoraXBtaV9ubWkodm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNwdSwgaW50IGhhbmRsZWQpCit7CisJLyogSWYgbm8gb25lIGVsc2UgaGFuZGxlZCB0aGUgTk1JLCB3ZSBhc3N1bWUgaXQgd2FzIHRoZSBJUE1JCisgICAgICAgICAgIHdhdGNoZG9nLiAqLworCWlmICgoIWhhbmRsZWQpICYmIChwcmVvcF92YWwgPT0gV0RPR19QUkVPUF9QQU5JQykpCisJCXBhbmljKFBGWCAicHJlLXRpbWVvdXQiKTsKKworCS8qIE9uIHNvbWUgbWFjaGluZXMsIHRoZSBoZWFydGJlYXQgd2lsbCBnaXZlCisJICAgYW4gZXJyb3IgYW5kIG5vdCB3b3JrIHVubGVzcyB3ZSByZS1lbmFibGUKKwkgICB0aGUgdGltZXIuICAgU28gZG8gc28uICovCisJcHJldGltZW91dF9zaW5jZV9sYXN0X2hlYXJ0YmVhdCA9IDE7CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm1pX2hhbmRsZXIgaXBtaV9ubWlfaGFuZGxlciA9Cit7CisJLmxpbmsgICAgID0gTElTVF9IRUFEX0lOSVQoaXBtaV9ubWlfaGFuZGxlci5saW5rKSwKKwkuZGV2X25hbWUgPSAiaXBtaV93YXRjaGRvZyIsCisJLmRldl9pZCAgID0gTlVMTCwKKwkuaGFuZGxlciAgPSBpcG1pX25taSwKKwkucHJpb3JpdHkgPSAwLCAvKiBDYWxsIHVzIGxhc3QuICovCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgd2RvZ19yZWJvb3RfaGFuZGxlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgIGNvZGUsCisJCQkgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICp1bnVzZWQpCit7CisJc3RhdGljIGludCByZWJvb3RfZXZlbnRfaGFuZGxlZCA9IDA7CisKKwlpZiAoKHdhdGNoZG9nX3VzZXIpICYmICghcmVib290X2V2ZW50X2hhbmRsZWQpKSB7CisJCS8qIE1ha2Ugc3VyZSB3ZSBvbmx5IGRvIHRoaXMgb25jZS4gKi8KKwkJcmVib290X2V2ZW50X2hhbmRsZWQgPSAxOworCisJCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpIHsKKwkJCS8qIERpc2FibGUgdGhlIFdEVCBpZiB3ZSBhcmUgc2h1dHRpbmcgZG93bi4gKi8KKwkJCWlwbWlfd2F0Y2hkb2dfc3RhdGUgPSBXRE9HX1RJTUVPVVRfTk9ORTsKKwkJCXBhbmljX2hhbHRfaXBtaV9zZXRfdGltZW91dCgpOworCQl9IGVsc2UgeworCQkJLyogU2V0IGEgbG9uZyB0aW1lciB0byBsZXQgdGhlIHJlYm9vdCBoYXBwZW5zLCBidXQKKwkJCSAgIHJlYm9vdCBpZiBpdCBoYW5ncy4gKi8KKwkJCXRpbWVvdXQgPSAxMjA7CisJCQlwcmV0aW1lb3V0ID0gMDsKKwkJCWlwbWlfd2F0Y2hkb2dfc3RhdGUgPSBXRE9HX1RJTUVPVVRfUkVTRVQ7CisJCQlwYW5pY19oYWx0X2lwbWlfc2V0X3RpbWVvdXQoKTsKKwkJfQorCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkb2dfcmVib290X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsCT0gd2RvZ19yZWJvb3RfaGFuZGxlciwKKwkubmV4dAkJPSBOVUxMLAorCS5wcmlvcml0eQk9IDAKK307CisKK3N0YXRpYyBpbnQgd2RvZ19wYW5pY19oYW5kbGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICBldmVudCwKKwkJCSAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqdW51c2VkKQoreworCXN0YXRpYyBpbnQgcGFuaWNfZXZlbnRfaGFuZGxlZCA9IDA7CisKKwkvKiBPbiBhIHBhbmljLCBpZiB3ZSBoYXZlIGEgcGFuaWMgdGltZW91dCwgbWFrZSBzdXJlIHRoYXQgdGhlIHRoaW5nCisJICAgcmVib290cywgZXZlbiBpZiBpdCBoYW5ncyBkdXJpbmcgdGhhdCBwYW5pYy4gKi8KKwlpZiAod2F0Y2hkb2dfdXNlciAmJiAhcGFuaWNfZXZlbnRfaGFuZGxlZCkgeworCQkvKiBNYWtlIHN1cmUgdGhlIHBhbmljIGRvZXNuJ3QgaGFuZywgYW5kIG1ha2Ugc3VyZSB3ZQorCQkgICBkbyB0aGlzIG9ubHkgb25jZS4gKi8KKwkJcGFuaWNfZXZlbnRfaGFuZGxlZCA9IDE7CisJICAgIAorCQl0aW1lb3V0ID0gMjU1OworCQlwcmV0aW1lb3V0ID0gMDsKKwkJaXBtaV93YXRjaGRvZ19zdGF0ZSA9IFdET0dfVElNRU9VVF9SRVNFVDsKKwkJcGFuaWNfaGFsdF9pcG1pX3NldF90aW1lb3V0KCk7CisJfQorCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3ZG9nX3BhbmljX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsCT0gd2RvZ19wYW5pY19oYW5kbGVyLAorCS5uZXh0CQk9IE5VTEwsCisJLnByaW9yaXR5CT0gMTUwCS8qIHByaW9yaXR5OiBJTlRfTUFYID49IHggPj0gMCAqLworfTsKKworCitzdGF0aWMgdm9pZCBpcG1pX25ld19zbWkoaW50IGlmX251bSkKK3sKKwlpcG1pX3JlZ2lzdGVyX3dhdGNoZG9nKGlmX251bSk7Cit9CisKK3N0YXRpYyB2b2lkIGlwbWlfc21pX2dvbmUoaW50IGlmX251bSkKK3sKKwkvKiBUaGlzIGNhbiBuZXZlciBiZSBjYWxsZWQsIGJlY2F1c2Ugb25jZSB0aGUgd2F0Y2hkb2cgaXMKKwkgICByZWdpc3RlcmVkLCB0aGUgaW50ZXJmYWNlIGNhbid0IGdvIGF3YXkgdW50aWwgdGhlIHdhdGNoZG9nCisJICAgaXMgdW5yZWdpc3RlcmVkLiAqLworfQorCitzdGF0aWMgc3RydWN0IGlwbWlfc21pX3dhdGNoZXIgc21pX3dhdGNoZXIgPQoreworCS5vd25lciAgICA9IFRISVNfTU9EVUxFLAorCS5uZXdfc21pICA9IGlwbWlfbmV3X3NtaSwKKwkuc21pX2dvbmUgPSBpcG1pX3NtaV9nb25lCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpcG1pX3dkb2dfaW5pdCh2b2lkKQoreworCWludCBydjsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJkcml2ZXIgdmVyc2lvbiAiCisJICAgICAgIElQTUlfV0FUQ0hET0dfVkVSU0lPTiAiXG4iKTsKKworCWlmIChzdHJjbXAoYWN0aW9uLCAicmVzZXQiKSA9PSAwKSB7CisJCWFjdGlvbl92YWwgPSBXRE9HX1RJTUVPVVRfUkVTRVQ7CisJfSBlbHNlIGlmIChzdHJjbXAoYWN0aW9uLCAibm9uZSIpID09IDApIHsKKwkJYWN0aW9uX3ZhbCA9IFdET0dfVElNRU9VVF9OT05FOworCX0gZWxzZSBpZiAoc3RyY21wKGFjdGlvbiwgInBvd2VyX2N5Y2xlIikgPT0gMCkgeworCQlhY3Rpb25fdmFsID0gV0RPR19USU1FT1VUX1BPV0VSX0NZQ0xFOworCX0gZWxzZSBpZiAoc3RyY21wKGFjdGlvbiwgInBvd2VyX29mZiIpID09IDApIHsKKwkJYWN0aW9uX3ZhbCA9IFdET0dfVElNRU9VVF9QT1dFUl9ET1dOOworCX0gZWxzZSB7CisJCWFjdGlvbl92YWwgPSBXRE9HX1RJTUVPVVRfUkVTRVQ7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJVbmtub3duIGFjdGlvbiAnJXMnLCBkZWZhdWx0aW5nIHRvIgorCQkgICAgICAgIiByZXNldFxuIiwgYWN0aW9uKTsKKwl9CisKKwlpZiAoc3RyY21wKHByZWFjdGlvbiwgInByZV9ub25lIikgPT0gMCkgeworCQlwcmVhY3Rpb25fdmFsID0gV0RPR19QUkVUSU1FT1VUX05PTkU7CisJfSBlbHNlIGlmIChzdHJjbXAocHJlYWN0aW9uLCAicHJlX3NtaSIpID09IDApIHsKKwkJcHJlYWN0aW9uX3ZhbCA9IFdET0dfUFJFVElNRU9VVF9TTUk7CisjaWZkZWYgSEFWRV9OTUlfSEFORExFUgorCX0gZWxzZSBpZiAoc3RyY21wKHByZWFjdGlvbiwgInByZV9ubWkiKSA9PSAwKSB7CisJCXByZWFjdGlvbl92YWwgPSBXRE9HX1BSRVRJTUVPVVRfTk1JOworI2VuZGlmCisJfSBlbHNlIGlmIChzdHJjbXAocHJlYWN0aW9uLCAicHJlX2ludCIpID09IDApIHsKKwkJcHJlYWN0aW9uX3ZhbCA9IFdET0dfUFJFVElNRU9VVF9NU0dfSU5UOworCX0gZWxzZSB7CisJCXByZWFjdGlvbl92YWwgPSBXRE9HX1BSRVRJTUVPVVRfTk9ORTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlVua25vd24gcHJlYWN0aW9uICclcycsIGRlZmF1bHRpbmcgdG8iCisJCSAgICAgICAiIG5vbmVcbiIsIHByZWFjdGlvbik7CisJfQorCisJaWYgKHN0cmNtcChwcmVvcCwgInByZW9wX25vbmUiKSA9PSAwKSB7CisJCXByZW9wX3ZhbCA9IFdET0dfUFJFT1BfTk9ORTsKKwl9IGVsc2UgaWYgKHN0cmNtcChwcmVvcCwgInByZW9wX3BhbmljIikgPT0gMCkgeworCQlwcmVvcF92YWwgPSBXRE9HX1BSRU9QX1BBTklDOworCX0gZWxzZSBpZiAoc3RyY21wKHByZW9wLCAicHJlb3BfZ2l2ZV9kYXRhIikgPT0gMCkgeworCQlwcmVvcF92YWwgPSBXRE9HX1BSRU9QX0dJVkVfREFUQTsKKwl9IGVsc2UgeworCQlwcmVvcF92YWwgPSBXRE9HX1BSRU9QX05PTkU7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJVbmtub3duIHByZW9wICclcycsIGRlZmF1bHRpbmcgdG8iCisJCSAgICAgICAiIG5vbmVcbiIsIHByZW9wKTsKKwl9CisKKyNpZmRlZiBIQVZFX05NSV9IQU5ETEVSCisJaWYgKHByZWFjdGlvbl92YWwgPT0gV0RPR19QUkVUSU1FT1VUX05NSSkgeworCQlpZiAocHJlb3BfdmFsID09IFdET0dfUFJFT1BfR0lWRV9EQVRBKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiUHJldGltZW91dCBvcCBpcyB0byBnaXZlIGRhdGEiCisJCQkgICAgICAgIiBidXQgTk1JIHByZXRpbWVvdXQgaXMgZW5hYmxlZCwgc2V0dGluZyIKKwkJCSAgICAgICAiIHByZXRpbWVvdXQgb3AgdG8gbm9uZVxuIik7CisJCQlwcmVvcF92YWwgPSBXRE9HX1BSRU9QX05PTkU7CisJCX0KKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwkJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfSU9fQVBJQykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIm5taV93YXRjaGRvZyBpcyBzZXQgdG8gSU8gQVBJQyIKKwkJCSAgICAgICAiIG1vZGUgKHZhbHVlIGlzICVkKSwgdGhhdCBpcyBpbmNvbXBhdGlibGUiCisJCQkgICAgICAgIiB3aXRoIHVzaW5nIE5NSSBpbiB0aGUgSVBNSSB3YXRjaGRvZy4iCisJCQkgICAgICAgIiBEaXNhYmxpbmcgSVBNSSBubWkgcHJldGltZW91dC5cbiIsCisJCQkgICAgICAgbm1pX3dhdGNoZG9nKTsKKwkJCXByZWFjdGlvbl92YWwgPSBXRE9HX1BSRVRJTUVPVVRfTk9ORTsKKwkJfSBlbHNlIHsKKyNlbmRpZgorCQlydiA9IHJlcXVlc3Rfbm1pKCZpcG1pX25taV9oYW5kbGVyKTsKKwkJaWYgKHJ2KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiQ2FuJ3QgcmVnaXN0ZXIgbm1pIGhhbmRsZXJcbiIpOworCQkJcmV0dXJuIHJ2OworCQl9CisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJCX0KKyNlbmRpZgorCX0KKyNlbmRpZgorCisJcnYgPSBpcG1pX3NtaV93YXRjaGVyX3JlZ2lzdGVyKCZzbWlfd2F0Y2hlcik7CisJaWYgKHJ2KSB7CisjaWZkZWYgSEFWRV9OTUlfSEFORExFUgorCQlpZiAocHJlYWN0aW9uX3ZhbCA9PSBXRE9HX1BSRVRJTUVPVVRfTk1JKQorCQkJcmVsZWFzZV9ubWkoJmlwbWlfbm1pX2hhbmRsZXIpOworI2VuZGlmCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJjYW4ndCByZWdpc3RlciBzbWkgd2F0Y2hlclxuIik7CisJCXJldHVybiBydjsKKwl9CisKKwlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkb2dfcmVib290X25vdGlmaWVyKTsKKwlub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJndkb2dfcGFuaWNfbm90aWZpZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBpcG1pX3VucmVnaXN0ZXJfd2F0Y2hkb2codm9pZCkKK3sKKwlpbnQgcnY7CisKKwlkb3duX3dyaXRlKCZyZWdpc3Rlcl9zZW0pOworCisjaWZkZWYgSEFWRV9OTUlfSEFORExFUgorCWlmIChwcmVhY3Rpb25fdmFsID09IFdET0dfUFJFVElNRU9VVF9OTUkpCisJCXJlbGVhc2Vfbm1pKCZpcG1pX25taV9oYW5kbGVyKTsKKyNlbmRpZgorCisJbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJndkb2dfcGFuaWNfbm90aWZpZXIpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZG9nX3JlYm9vdF9ub3RpZmllcik7CisKKwlpZiAoISB3YXRjaGRvZ191c2VyKQorCQlnb3RvIG91dDsKKworCS8qIE1ha2Ugc3VyZSBubyBvbmUgY2FuIGNhbGwgdXMgYW55IG1vcmUuICovCisJbWlzY19kZXJlZ2lzdGVyKCZpcG1pX3dkb2dfbWlzY2Rldik7CisKKwkvKiBXYWl0IHRvIG1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBtYWtlcyBpdCBvdXQuICBUaGUgbG93ZXIgbGF5ZXIgaGFzCisJICAgcG9pbnRlcnMgdG8gb3VyIGJ1ZmZlcnMsIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGRvbmUgYmVmb3JlCisJICAgd2UgcmVsZWFzZSBvdXIgbWVtb3J5LiAqLworCXdoaWxlIChhdG9taWNfcmVhZCgmc2V0X3RpbWVvdXRfdG9mcmVlKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCisJLyogRGlzY29ubmVjdCBmcm9tIElQTUkuICovCisJcnYgPSBpcG1pX2Rlc3Ryb3lfdXNlcih3YXRjaGRvZ191c2VyKTsKKwlpZiAocnYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggImVycm9yIHVubGlua2luZyBmcm9tIElQTUk6ICVkXG4iLAorCQkgICAgICAgcnYpOworCX0KKwl3YXRjaGRvZ191c2VyID0gTlVMTDsKKworIG91dDoKKwl1cF93cml0ZSgmcmVnaXN0ZXJfc2VtKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlwbWlfd2RvZ19leGl0KHZvaWQpCit7CisJaXBtaV9zbWlfd2F0Y2hlcl91bnJlZ2lzdGVyKCZzbWlfd2F0Y2hlcik7CisJaXBtaV91bnJlZ2lzdGVyX3dhdGNoZG9nKCk7Cit9Cittb2R1bGVfZXhpdChpcG1pX3dkb2dfZXhpdCk7Cittb2R1bGVfaW5pdChpcG1pX3dkb2dfaW5pdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXNpY29tLmMgYi9kcml2ZXJzL2NoYXIvaXNpY29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxYzdmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pc2ljb20uYwpAQCAtMCwwICsxLDIwNzkgQEAKKy8qCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCU9yaWdpbmFsIGRyaXZlciBjb2RlIHN1cHBsaWVkIGJ5IE11bHRpLVRlY2gKKyAqCisgKglDaGFuZ2VzCisgKgkxLzkvOTgJYWxhbkByZWRoYXQuY29tCQlNZXJnZSB0byAyLjAueCBrZXJuZWwgdHJlZQorICoJCQkJCU9idGFpbiBhbmQgdXNlIG9mZmljaWFsIG1ham9yL21pbm9ycworICoJCQkJCUxvYWRlciBzd2l0Y2hlZCB0byBhIG1pc2MgZGV2aWNlCisgKgkJCQkJKGZpeGVkIHJhbmdlIGNoZWNrIGJ1ZyBhcyBhIHNpZGUgZWZmZWN0KQorICoJCQkJCVByaW50ayBjbGVhbiB1cAorICoJOS8xMi85OAlhbGFuQHJlZGhhdC5jb20JCVJvdWdoIHBvcnQgdG8gMi4xLngKKyAqCisgKgkxMC82Lzk5IHNhbWVlcgkJCU1lcmdlZCB0aGUgSVNBIGFuZCBQQ0kgZHJpdmVycyB0bworICoJCQkJCWEgbmV3IHVuaWZpZWQgZHJpdmVyLgorICoKKyAqCTMvOS85OQlzYW1lZXIJCQlBZGRlZCBzdXBwb3J0IGZvciBJU0k0NjE2IGNhcmRzLgorICoKKyAqCTE2LzkvOTkJc2FtZWVyCQkJV2UgZG8gbm90IGZvcmNlIFJUUyBsb3cgYW55bW9yZS4KKyAqCQkJCQlUaGlzIGlzIHRvIHByZXZlbnQgdGhlIGZpcm13YXJlIAorICoJCQkJCWZyb20gZ2V0dGluZyBjb25mdXNlZC4KKyAqCisgKgkyNi8xMC85OSBzYW1lZXIJCQlDb3NtZXRpYyBjaGFuZ2VzOlRoZSBkcml2ZXIgbm93CisgKgkJCQkJZHVtcHMgdGhlIFBvcnQgQ291bnQgaW5mb3JtYXRpb24KKyAqCQkJCQlhbG9uZyB3aXRoIEkvTyBhZGRyZXNzIGFuZCBJUlEuCisgKgorICoJMTMvMTIvOTkgc2FtZWVyCQkJRml4ZWQgdGhlIHByb2JsZW0gd2l0aCBJUlEgc2hhcmluZy4KKyAqCisgKgkxMC81LzAwICBzYW1lZXIJCQlGaXhlZCBpc2ljb21fc2h1dGRvd25fYm9hcmQoKQorICoJCQkJCXRvIG5vdCBsb3dlciBEVFIgb24gYWxsIHRoZSBwb3J0cworICoJCQkJCXdoZW4gdGhlIGxhc3QgcG9ydCBvbiB0aGUgY2FyZCBpcyAKKyAqCQkJCQljbG9zZWQuCisgKgorICoJMTAvNS8wMCAgc2FtZWVyCQkJU2lnbmFsIG1hc2sgc2V0dXAgY29tbWFuZCBhZGRlZAorICoJCQkJCXRvICBpc2ljb21fc2V0dXBfcG9ydCBhbmQgCisgKgkJCQkJaXNpY29tX3NodXRkb3duX3BvcnQuCisgKgorICoJMjQvNS8wMCAgc2FtZWVyCQkJVGhlIGRyaXZlciBpcyBub3cgU01QIGF3YXJlLgorICoJCQkJCQorICoJCisgKgkyNy8xMS8wMCBWaW5heWFrIFAgUmlzYnVkCUZpeGVkIHRoZSBEcml2ZXIgQ3Jhc2ggUHJvYmxlbQorICoJCisgKgkKKyAqCTAzLzAxLzAxICBhbmlsIC5zCQlBZGRlZCBzdXBwb3J0IGZvciByZXNldHRpbmcgdGhlCisgKgkJCQkJaW50ZXJuYWwgbW9kZW1zIG9uIElTSSBjYXJkcy4KKyAqCisgKgkwOC8wMi8wMSAgYW5pbCAucwkJVXBncmFkZWQgdGhlIGRyaXZlciBmb3Iga2VybmVsCisgKgkJCQkJMi40LngKKyAqCisgKiAgICAgIDExLzA0LzAxICBLZXZpbgkJCUZpeGVkIGZpcm13YXJlIGxvYWQgcHJvYmxlbSB3aXRoCisgKgkJCQkJSVNJSFAtNFggY2FyZAorICoJCisgKgkzMC8wNC8wMSAgYW5pbCAucwkJRml4ZWQgdGhlIHJlbW90ZSBsb2dpbiB0aHJvdWdoCisgKgkJCQkJSVNJIHBvcnQgcHJvYmxlbS4gTm93IHRoZSBsaW5rCisgKgkJCQkJZG9lcyBub3QgZ28gZG93biBiZWZvcmUgcGFzc3dvcmQKKyAqCQkJCQlwcm9tcHQuCisgKgorICoJMDMvMDUvMDEgIGFuaWwgLnMJCUZpeGVkIHRoZSBwcm9ibGVtIHdpdGggSVJRIHNoYXJpbmcKKyAqCQkJCQlhbW9uZyBJU0ktUENJIGNhcmRzLgorICoKKyAqCTAzLzA1LzAxICBhbmlsIC5zCQlBZGRlZCBzdXBwb3J0IHRvIGRpc3BsYXkgdGhlIHZlcnNpb24KKyAqCQkJCQlpbmZvIGR1cmluZyBpbnNtb2QgYXMgd2VsbCBhcyBtb2R1bGUgCisgKgkJCQkJbGlzdGluZyBieSBsc21vZC4KKyAqCQorICoJMTAvMDUvMDEgIGFuaWwgLnMJCURvbmUgdGhlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHNvdXJjZQorICoJCQkJCWZpbGUgYW5kIEluc3RhbGwgc2NyaXB0IHNvIHRoYXQgdGhlCisgKgkJCQkJc2FtZSBpbnN0YWxsYXRpb24gY2FuIGJlIHVzZWQgZm9yCisgKgkJCQkJMi4yLnggYW5kIDIuNC54IGtlcm5lbC4KKyAqCisgKgkwNi8wNi8wMSAgYW5pbCAucwkJTm93IHdlIGRyb3AgYm90aCBkdHIgYW5kIHJ0cyBkdXJpbmcKKyAqCQkJCQlzaHV0ZG93bl9wb3J0IGFzIHdlbGwgYXMgcmFpc2UgdGhlbQorICoJCQkJCWR1cmluZyBpc2ljb21fY29uZmlnX3BvcnQuCisgKiAgCQorICoJMDkvMDYvMDEgYWNtZUBjb25lY3RpdmEuY29tLmJyCXVzZSBjYXBhYmxlLCBub3Qgc3VzZXIsIGRvCisgKgkJCQkJcmVzdG9yZV9mbGFncyBvbiBmYWlsdXJlIGluCisgKgkJCQkJaXNpY29tX3NlbmRfYnJlYWssIHZlcmlmeSBwdXRfdXNlcgorICoJCQkJCXJlc3VsdAorICoKKyAqICAJMTEvMDIvMDMgIHJhbmplZXRoCQlBZGRlZCBzdXBwb3J0IGZvciAyMzAgS2JwcyBhbmQgNDYwIEticHMKKyAqICAJCQkJCUJhdWQgaW5kZXggZXh0ZW5kZWQgdG8gMjEKKyAqICAJCisgKiAgCTIwLzAzLzAzICByYW5qZWV0aAkJTWFkZSB0byB3b3JrIGZvciBMaW51eCBBZHZhbmNlZCBzZXJ2ZXIuCisgKiAgCQkJCQlUYWtlbiBjYXJlIG9mIGxpY2Vuc2Ugd2FybmluZy4JCisgKiAgICAgIAorICoJMTAvMTIvMDMgIFJhdmluZHJhCQlNYWRlIHRvIHdvcmsgZm9yIEZlZG9yYSBDb3JlIDEgb2YgCisgKgkJCQkJUmVkIEhhdCBEaXN0cmlidXRpb24KKyAqCisgKgkwNi8wMS8wNSAgQWxhbiBDb3ggCQlNZXJnZWQgdGhlIElTSSBhbmQgYmFzZSBrZXJuZWwgc3RyYW5kcworICoJCQkJCWludG8gYSBzaW5nbGUgMi42IGRyaXZlcgorICoKKyAqCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJVG8gdXNlIHRoaXMgZHJpdmVyIHlvdSBhbHNvIG5lZWQgdGhlIHN1cHBvcnQgcGFja2FnZS4gWW91IAorICoJY2FuIGZpbmQgdGhpcyBpbiBSUE0gZm9ybWF0IG9uCisgKgkJZnRwOi8vZnRwLmxpbnV4Lm9yZy51ay9wdWIvbGludXgvYWxhbgorICogCQorICoJWW91IGNhbiBmaW5kIHRoZSBvcmlnaW5hbCB0b29scyBmb3IgdGhpcyBkaXJlY3QgZnJvbSBNdWx0aXRlY2gKKyAqCQlmdHA6Ly9mdHAubXVsdGl0ZWNoLmNvbS9JU0ktQ2FyZHMvCisgKgorICoJSGF2aW5nIGluc3RhbGxlZCB0aGUgY2FyZHMgdGhlIG1vZHVsZSBvcHRpb25zICgvZXRjL21vZHByb2JlLmNvbmYpCisgKgorICoJb3B0aW9ucyBpc2ljb20gICBpbz1jYXJkMSxjYXJkMixjYXJkMyxjYXJkNCBpcnE9Y2FyZDEsY2FyZDIsY2FyZDMsY2FyZDQKKyAqCisgKglPbWl0IHRob3NlIGVudHJpZXMgZm9yIGJvYXJkcyB5b3UgZG9uJ3QgaGF2ZSBpbnN0YWxsZWQuCisgKgorICoJVE9ETworICoJCUhvdHBsdWcKKyAqCQlNZXJnZSB0ZXN0aW5nCisgKgkJNjQtYml0IHZlcmlmaWNhdGlvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pc2ljb20uaD4KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlzaWNvbV9wY2lfdGJsW10gPSB7CisJeyBWRU5ET1JfSUQsIDB4MjAyOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgVkVORE9SX0lELCAweDIwNTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFZFTkRPUl9JRCwgMHgyMDUyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBWRU5ET1JfSUQsIDB4MjA1MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgVkVORE9SX0lELCAweDIwNTQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFZFTkRPUl9JRCwgMHgyMDU1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBWRU5ET1JfSUQsIDB4MjA1NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgVkVORE9SX0lELCAweDIwNTcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFZFTkRPUl9JRCwgMHgyMDU4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAwIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXNpY29tX3BjaV90YmwpOworCitzdGF0aWMgaW50IHByZXZfY2FyZCA9IDM7CS8qCXN0YXJ0IHNlcnZpY2luZyBpc2lfY2FyZFswXQkqLworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICppc2ljb21fbm9ybWFsOworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdHg7CitzdGF0aWMgY2hhciByZV9zY2hlZHVsZSA9IDE7CisjaWZkZWYgSVNJQ09NX0RFQlVHCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0eF9jb3VudCA9IDA7CisjZW5kaWYKKworc3RhdGljIGludCBJU0lMb2FkX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCAgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCitzdGF0aWMgdm9pZCBpc2ljb21fdHgodW5zaWduZWQgbG9uZyBfZGF0YSk7CitzdGF0aWMgdm9pZCBpc2ljb21fc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqIHRtcF9idWY7CitzdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CisKKy8qICAgYmF1ZCBpbmRleCBtYXBwaW5ncyBmcm9tIGxpbnV4IGRlZm5zIHRvIGlzaSAqLworCitzdGF0aWMgc2lnbmVkIGNoYXIgbGludXhiX3RvX2lzaWJbXSA9IHsKKwktMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTEsIDEzLCAxNSwgMTYsIDE3LCAgICAgCisJMTgsIDE5Cit9OworCitzdHJ1Y3QJaXNpX2JvYXJkIHsKKwl1bnNpZ25lZCBzaG9ydAkJYmFzZTsKKwl1bnNpZ25lZCBjaGFyCQlpcnE7CisJdW5zaWduZWQgY2hhcgkJcG9ydF9jb3VudDsKKwl1bnNpZ25lZCBzaG9ydAkJc3RhdHVzOworCXVuc2lnbmVkIHNob3J0CQlwb3J0X3N0YXR1czsgLyogZWFjaCBiaXQgcmVwcmVzZW50cyBhIHNpbmdsZSBwb3J0ICovCisJdW5zaWduZWQgc2hvcnQJCXNoaWZ0X2NvdW50OworCXN0cnVjdCBpc2lfcG9ydAkJKiBwb3J0czsKKwlzaWduZWQgY2hhcgkJY291bnQ7CisJdW5zaWduZWQgY2hhcgkJaXNhOworCXNwaW5sb2NrX3QJCWNhcmRfbG9jazsgLyogQ2FyZCB3aWRlIGxvY2sgMTEvNS8wMCAtc2FtZWVyICovCisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7Cit9OworCitzdHJ1Y3QJaXNpX3BvcnQgeworCXVuc2lnbmVkIHNob3J0CQltYWdpYzsKKwl1bnNpZ25lZCBpbnQJCWZsYWdzOworCWludAkJCWNvdW50OworCWludAkJCWJsb2NrZWRfb3BlbjsKKwlpbnQJCQljbG9zZV9kZWxheTsKKwl1bnNpZ25lZCBzaG9ydAkJY2hhbm5lbDsKKwl1bnNpZ25lZCBzaG9ydAkJc3RhdHVzOworCXVuc2lnbmVkIHNob3J0CQljbG9zaW5nX3dhaXQ7CisJc3RydWN0IGlzaV9ib2FyZAkqIGNhcmQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgCSogdHR5OworCXdhaXRfcXVldWVfaGVhZF90CWNsb3NlX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJb3Blbl93YWl0OworCXN0cnVjdCB3b3JrX3N0cnVjdAloYW5ndXBfdHE7CisJc3RydWN0IHdvcmtfc3RydWN0CWJoX3RxdWV1ZTsKKwl1bnNpZ25lZCBjaGFyCQkqIHhtaXRfYnVmOworCWludAkJCXhtaXRfaGVhZDsKKwlpbnQJCQl4bWl0X3RhaWw7CisJaW50CQkJeG1pdF9jbnQ7Cit9OworCitzdGF0aWMgc3RydWN0IGlzaV9ib2FyZCBpc2lfY2FyZFtCT0FSRF9DT1VOVF07CitzdGF0aWMgc3RydWN0IGlzaV9wb3J0ICBpc2lfcG9ydHNbUE9SVF9DT1VOVF07CisKKy8qCisgKglMb2NraW5nIGZ1bmN0aW9ucyBmb3IgY2FyZCBsZXZlbCBsb2NraW5nLiBXZSBuZWVkIHRvIG93biBib3RoCisgKgl0aGUga2VybmVsIGxvY2sgZm9yIHRoZSBjYXJkIGFuZCBoYXZlIHRoZSBjYXJkIGluIGEgcG9zaXRpb24gdGhhdAorICoJaXQgd2FudHMgdG8gdGFsay4KKyAqLworIAorc3RhdGljIGludCBsb2NrX2NhcmQoc3RydWN0IGlzaV9ib2FyZCAqY2FyZCkKK3sKKwljaGFyCQlyZXRyaWVzOworCXVuc2lnbmVkIHNob3J0IGJhc2UgPSBjYXJkLT5iYXNlOworCisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDEwMDsgcmV0cmllcysrKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGNhcmQtPmZsYWdzKTsKKwkJaWYgKGludyhiYXNlICsgMHhlKSAmIDB4MSkgeworCQkJcmV0dXJuIDE7IAorCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7CisJCQl1ZGVsYXkoMTAwMCk7ICAgLyogMW1zICovCisJCX0KKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNJQ09NOiBGYWlsZWQgdG8gbG9jayBDYXJkICgweCV4KVxuIiwgY2FyZC0+YmFzZSk7CisJcmV0dXJuIDA7CS8qIEZhaWxlZCB0byBhcXVpcmUgdGhlIGNhcmQhICovCit9CisKK3N0YXRpYyBpbnQgbG9ja19jYXJkX2F0X2ludGVycnVwdChzdHJ1Y3QgaXNpX2JvYXJkICpjYXJkKQoreworCXVuc2lnbmVkIGNoYXIJCXJldHJpZXM7CisJdW5zaWduZWQgc2hvcnQgCQliYXNlID0gY2FyZC0+YmFzZTsKKworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAyMDA7IHJldHJpZXMrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7CisKKwkJaWYgKGludyhiYXNlICsgMHhlKSAmIDB4MSkKKwkJCXJldHVybiAxOyAKKwkJZWxzZQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7CisJfQorCS8qIEZhaWxpbmcgaW4gaW50ZXJydXB0IGlzIGFuIGFjY2VwdGFibGUgZXZlbnQgKi8KKwlyZXR1cm4gMDsJLyogRmFpbGVkIHRvIGFxdWlyZSB0aGUgY2FyZCEgKi8KK30KKworc3RhdGljIHZvaWQgdW5sb2NrX2NhcmQoc3RydWN0IGlzaV9ib2FyZCAqY2FyZCkKK3sKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGNhcmQtPmZsYWdzKTsKK30KKworLyoKKyAqICBJU0kgQ2FyZCBzcGVjaWZpYyBvcHMgLi4uCisgKi8KKyAKK3N0YXRpYyB2b2lkIHJhaXNlX2R0cihzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQoreworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCisJaWYgKCFsb2NrX2NhcmQoY2FyZCkpCisJCXJldHVybjsKKworCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiAsIGJhc2UpOworCW91dHcoMHgwNTA0LCBiYXNlKTsKKwlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOworCXBvcnQtPnN0YXR1cyB8PSBJU0lfRFRSOworCXVubG9ja19jYXJkKGNhcmQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHJvcF9kdHIoc3RydWN0IGlzaV9wb3J0ICogcG9ydCkKK3sJCisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXVuc2lnbmVkIHNob3J0IGJhc2UgPSBjYXJkLT5iYXNlOworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWw7CisKKwlpZiAoIWxvY2tfY2FyZChjYXJkKSkKKwkJcmV0dXJuOworCisJb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBjYXJkLT5zaGlmdF9jb3VudCkgfCAweDAyICwgYmFzZSk7CisJb3V0dygweDA0MDQsIGJhc2UpOworCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CQorCXBvcnQtPnN0YXR1cyAmPSB+SVNJX0RUUjsKKwl1bmxvY2tfY2FyZChjYXJkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJhaXNlX3J0cyhzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQoreworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCisJaWYgKCFsb2NrX2NhcmQoY2FyZCkpCisJCXJldHVybjsKKworCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiAsIGJhc2UpOworCW91dHcoMHgwYTA0LCBiYXNlKTsKKwlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOwkKKwlwb3J0LT5zdGF0dXMgfD0gSVNJX1JUUzsKKwl1bmxvY2tfY2FyZChjYXJkKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkcm9wX3J0cyhzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQoreworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCisJaWYgKCFsb2NrX2NhcmQoY2FyZCkpCisJCXJldHVybjsKKworCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiAsIGJhc2UpOworCW91dHcoMHgwODA0LCBiYXNlKTsKKwlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOwkKKwlwb3J0LT5zdGF0dXMgJj0gfklTSV9SVFM7CisJdW5sb2NrX2NhcmQoY2FyZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYWlzZV9kdHJfcnRzKHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQpCit7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXVuc2lnbmVkIHNob3J0IGJhc2UgPSBjYXJkLT5iYXNlOworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWw7CisKKwlpZiAoIWxvY2tfY2FyZChjYXJkKSkKKwkJcmV0dXJuOworCisJb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBjYXJkLT5zaGlmdF9jb3VudCkgfCAweDAyICwgYmFzZSk7CisJb3V0dygweDBmMDQsIGJhc2UpOworCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisJcG9ydC0+c3RhdHVzIHw9IChJU0lfRFRSIHwgSVNJX1JUUyk7CisJdW5sb2NrX2NhcmQoY2FyZCk7Cit9CisKK3N0YXRpYyB2b2lkIGRyb3BfZHRyX3J0cyhzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQoreworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCisJaWYgKCFsb2NrX2NhcmQoY2FyZCkpCisJCXJldHVybjsKKworCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiAsIGJhc2UpOworCW91dHcoMHgwYzA0LCBiYXNlKTsKKwlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOwkKKwlwb3J0LT5zdGF0dXMgJj0gfihJU0lfUlRTIHwgSVNJX0RUUik7CisJdW5sb2NrX2NhcmQoY2FyZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBraWxsX3F1ZXVlKHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQsIHNob3J0IHF1ZXVlKQoreworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCisJaWYgKCFsb2NrX2NhcmQoY2FyZCkpCisJCXJldHVybjsKKworCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiAsIGJhc2UpOworCW91dHcoKHF1ZXVlIDw8IDgpIHwgMHgwNiwgYmFzZSk7CisJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsJCisJdW5sb2NrX2NhcmQoY2FyZCk7Cit9CisKKworLyogCisgKiAgRmlybXdhcmUgbG9hZGVyIGRyaXZlciBzcGVjaWZpYyByb3V0aW5lcy4gVGhpcyBuZWVkcyB0byBtb3N0bHkgZGllCisgKiAgYW5kIGJlIHJlcGxhY2VkIHdpdGggcmVxdWVzdF9maXJtd2FyZS4KKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBJU0lMb2FkX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAkJPSBJU0lMb2FkX2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGlzaWxvYWRlcl9kZXZpY2UgPSB7CisJSVNJTE9BRF9NSVNDX01JTk9SLCAiaXNpY3RsIiwgJklTSUxvYWRfZm9wcworfTsKKworIAorc3RhdGljIGlubGluZSBpbnQgV2FpdFRpbGxDYXJkSXNGcmVlKHVuc2lnbmVkIHNob3J0IGJhc2UpCit7CisJdW5zaWduZWQgbG9uZyBjb3VudD0wOworCXdoaWxlKCAoIShpbncoYmFzZSsweGUpICYgMHgxKSkgJiYgKGNvdW50KysgPCA2MDAwMDAwKSk7CisJaWYgKGludyhiYXNlKzB4ZSkmMHgxKSAgCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgSVNJTG9hZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IGNhcmQsIGksIGosIHNpZ25hdHVyZSwgc3RhdHVzLCBwb3J0Y291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgdDsKKwl1bnNpZ25lZCBzaG9ydCB3b3JkX2NvdW50LCBiYXNlOworCWJpbl9mcmFtZSBmcmFtZTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwkvKiBleGVjX3JlY29yZCBleGVjX3JlYzsgKi8KKwkKKwlpZihnZXRfdXNlcihjYXJkLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkJCisJaWYoY2FyZCA8IDAgfHwgY2FyZCA+PSBCT0FSRF9DT1VOVCkKKwkJcmV0dXJuIC1FTlhJTzsKKwkJCisJYmFzZT1pc2lfY2FyZFtjYXJkXS5iYXNlOworCQorCWlmKGJhc2U9PTApCisJCXJldHVybiAtRU5YSU87CS8qIGRpc2FibGVkIG9yIG5vdCB1c2VkICovCisJCisJc3dpdGNoKGNtZCkgeworCQljYXNlIE1JT0NUTF9SRVNFVF9DQVJEOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJTG9hZDpSZXNldHRpbmcgQ2FyZCVkIGF0IDB4JXggIixjYXJkKzEsYmFzZSk7CisJCQkJCQkJCQorCQkJaW53KGJhc2UrMHg4KTsKKwkJCQorCQkJZm9yKHQ9amlmZmllcytIWi8xMDA7dGltZV9iZWZvcmUoamlmZmllcywgdCk7KTsKKwkJCQkKKwkJCW91dHcoMCxiYXNlKzB4OCk7IC8qIFJlc2V0ICovCisJCQkKKwkJCWZvcihqPTE7ajw9MztqKyspIHsKKwkJCQlmb3IodD1qaWZmaWVzK0haO3RpbWVfYmVmb3JlKGppZmZpZXMsIHQpOyk7CisJCQkJcHJpbnRrKCIuIik7CisJCQl9CQorCQkJc2lnbmF0dXJlPShpbncoYmFzZSsweDQpKSAmIDB4ZmY7CQorCQkJaWYgKGlzaV9jYXJkW2NhcmRdLmlzYSkgeworCQkJCQkKKwkJCQlpZiAoIShpbncoYmFzZSsweGUpICYgMHgxKSB8fCAoaW53KGJhc2UrMHgyKSkpIHsKKyNpZmRlZiBJU0lDT01fREVCVUcJCQkJCisJCQkJCXByaW50aygiXG5iYXNlKzB4Mj0weCV4ICwgYmFzZSsweGU9MHgleCIsaW53KGJhc2UrMHgyKSxpbncoYmFzZSsweGUpKTsKKyNlbmRpZgkJCQkKKwkJCQkJcHJpbnRrKCJcbklTSUxvYWQ6SVNBIENhcmQlZCByZXNldCBmYWlsdXJlIChQb3NzaWJsZSBiYWQgSS9PIFBvcnQgQWRkcmVzcyAweCV4KS5cbiIsY2FyZCsxLGJhc2UpOworCQkJCQlyZXR1cm4gLUVJTzsJCQkJCQorCQkJCX0KKwkJCX0JCisJCQllbHNlIHsKKwkJCQlwb3J0Y291bnQgPSBpbncoYmFzZSsweDIpOworCQkJCWlmICghKGludyhiYXNlKzB4ZSkgJiAweDEpIHx8ICgocG9ydGNvdW50IT0wKSAmJiAocG9ydGNvdW50IT00KSAmJiAocG9ydGNvdW50IT04KSkpIHsJCisjaWZkZWYgSVNJQ09NX0RFQlVHCisJCQkJCXByaW50aygiXG5iYXNlKzB4Mj0weCV4ICwgYmFzZSsweGU9MHgleCIsaW53KGJhc2UrMHgyKSxpbncoYmFzZSsweGUpKTsKKyNlbmRpZgorCQkJCQlwcmludGsoIlxuSVNJTG9hZDpQQ0kgQ2FyZCVkIHJlc2V0IGZhaWx1cmUgKFBvc3NpYmxlIGJhZCBJL08gUG9ydCBBZGRyZXNzIDB4JXgpLlxuIixjYXJkKzEsYmFzZSk7CisJCQkJCXJldHVybiAtRUlPOworCQkJCX0KKwkJCX0JCisJCQlzd2l0Y2goc2lnbmF0dXJlKSB7CisJCQljYXNlCTB4YTU6CisJCQljYXNlCTB4YmI6CisJCQljYXNlCTB4ZGQ6CQorCQkJCQlpZiAoaXNpX2NhcmRbY2FyZF0uaXNhKSAKKwkJCQkJCWlzaV9jYXJkW2NhcmRdLnBvcnRfY291bnQgPSA4OworCQkJCQllbHNlIHsKKwkJCQkJCWlmIChwb3J0Y291bnQgPT0gNCkKKwkJCQkJCQlpc2lfY2FyZFtjYXJkXS5wb3J0X2NvdW50ID0gNDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlpc2lfY2FyZFtjYXJkXS5wb3J0X2NvdW50ID0gODsKKwkJCQkJfQkKKwkJCQkgICAgIAlpc2lfY2FyZFtjYXJkXS5zaGlmdF9jb3VudCA9IDEyOworCQkJCSAgICAgCWJyZWFrOworCQkJCSAgICAgICAgCisJCQljYXNlCTB4Y2M6CWlzaV9jYXJkW2NhcmRdLnBvcnRfY291bnQgPSAxNjsKKwkJCQkJaXNpX2NhcmRbY2FyZF0uc2hpZnRfY291bnQgPSAxMTsKKwkJCQkJYnJlYWs7ICAJCQkKKwkJCQkJCisJCQlkZWZhdWx0OiBwcmludGsoIklTSUxvYWQ6Q2FyZCVkIHJlc2V0IGZhaWx1cmUgKFBvc3NpYmxlIGJhZCBJL08gUG9ydCBBZGRyZXNzIDB4JXgpLlxuIixjYXJkKzEsYmFzZSk7CisjaWZkZWYgSVNJQ09NX0RFQlVHCQkJCisJCQkJIHByaW50aygiU2lnPTB4JXhcbiIsc2lnbmF0dXJlKTsKKyNlbmRpZgkJCQkgCisJCQkJIHJldHVybiAtRUlPOworCQkJfQorCQkJcHJpbnRrKCItRG9uZVxuIik7CisJCQlyZXR1cm4gcHV0X3VzZXIoc2lnbmF0dXJlLCh1bnNpZ25lZCBfX3VzZXIgKilhcmdwKTsKKwkJCQkJCQorCWNhc2UJTUlPQ1RMX0xPQURfRklSTVdBUkU6CisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCQkKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZmcmFtZSwgYXJncCwgc2l6ZW9mKGJpbl9mcmFtZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJCisJCQlpZiAoV2FpdFRpbGxDYXJkSXNGcmVlKGJhc2UpKQorCQkJCXJldHVybiAtRUlPOworCQkJCisJCQlvdXR3KDB4ZjAsYmFzZSk7CS8qIHN0YXJ0IHVwbG9hZCBzZXF1ZW5jZSAqLyAKKwkJCW91dHcoMHgwMCxiYXNlKTsKKwkJCW91dHcoKGZyYW1lLmFkZHIpLCBiYXNlKTsvKiAgICAgIGxzYiBvZiBhZGRlcmVzcyAgICAqLworCQkJCisJCQl3b3JkX2NvdW50PShmcmFtZS5jb3VudCA+PiAxKSArIGZyYW1lLmNvdW50ICUgMjsKKwkJCW91dHcod29yZF9jb3VudCwgYmFzZSk7CisJCQlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOworCQkJCisJCQlmb3IoaT0wO2k8PTB4MmY7aSsrKTsJLyogYSB3ZWUgYml0IG9mIGRlbGF5ICovCisJCQkKKwkJCWlmIChXYWl0VGlsbENhcmRJc0ZyZWUoYmFzZSkpIAorCQkJCXJldHVybiAtRUlPOworCQkJCQorCQkJaWYgKChzdGF0dXM9aW53KGJhc2UrMHg0KSkhPTApIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lMb2FkOkNhcmQlZCByZWplY3RlZCBsb2FkIGhlYWRlcjpcbkFkZHJlc3M6MHgleCBcbkNvdW50OjB4JXggXG5TdGF0dXM6MHgleCBcbiIsIAorCQkJCWNhcmQrMSwgZnJhbWUuYWRkciwgZnJhbWUuY291bnQsIHN0YXR1cyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlvdXRzdyhiYXNlLCAodm9pZCAqKSBmcmFtZS5iaW5fZGF0YSwgd29yZF9jb3VudCk7CisJCQkKKwkJCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisJCQkKKwkJCWZvcihpPTA7aTw9MHgwZjtpKyspOwkvKiBhbm90aGVyIHdlZSBiaXQgb2YgZGVsYXkgKi8gCisJCQkKKwkJCWlmIChXYWl0VGlsbENhcmRJc0ZyZWUoYmFzZSkpIAorCQkJCXJldHVybiAtRUlPOworCQkJCQorCQkJaWYgKChzdGF0dXM9aW53KGJhc2UrMHg0KSkhPTApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIklTSUxvYWQ6Q2FyZCVkIGdvdCBvdXQgb2Ygc3luYy5DYXJkIFN0YXR1czoweCV4XG4iLGNhcmQrMSwgc3RhdHVzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0JCisJCQlyZXR1cm4gMDsKKwkJCQkJCQorCWNhc2UJTUlPQ1RMX1JFQURfRklSTVdBUkU6CisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCQkKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZmcmFtZSwgYXJncCwgc2l6ZW9mKGJpbl9oZWFkZXIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQorCQkJaWYgKFdhaXRUaWxsQ2FyZElzRnJlZShiYXNlKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCQorCQkJb3V0dygweGYxLGJhc2UpOwkvKiBzdGFydCBkb3dubG9hZCBzZXF1ZW5jZSAqLyAKKwkJCW91dHcoMHgwMCxiYXNlKTsKKwkJCW91dHcoKGZyYW1lLmFkZHIpLCBiYXNlKTsvKiAgICAgIGxzYiBvZiBhZGRlcmVzcyAgICAqLworCQkJCisJCQl3b3JkX2NvdW50PShmcmFtZS5jb3VudCA+PiAxKSArIGZyYW1lLmNvdW50ICUgMjsKKwkJCW91dHcod29yZF9jb3VudCsxLCBiYXNlKTsKKwkJCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisJCQkKKwkJCWZvcihpPTA7aTw9MHhmO2krKyk7CS8qIGEgd2VlIGJpdCBvZiBkZWxheSAqLworCQkJCisJCQlpZiAoV2FpdFRpbGxDYXJkSXNGcmVlKGJhc2UpKSAKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCQkKKwkJCWlmICgoc3RhdHVzPWludyhiYXNlKzB4NCkpIT0wKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNJTG9hZDpDYXJkJWQgcmVqZWN0ZWQgdmVyaWZ5IGhlYWRlcjpcbkFkZHJlc3M6MHgleCBcbkNvdW50OjB4JXggXG5TdGF0dXM6MHgleCBcbiIsIAorCQkJCWNhcmQrMSwgZnJhbWUuYWRkciwgZnJhbWUuY291bnQsIHN0YXR1cyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQkKKwkJCWludyhiYXNlKTsKKwkJCWluc3coYmFzZSwgZnJhbWUuYmluX2RhdGEsIHdvcmRfY291bnQpOworCQkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKwkJCQorCQkJZm9yKGk9MDtpPD0weDBmO2krKyk7CS8qIGFub3RoZXIgd2VlIGJpdCBvZiBkZWxheSAqLyAKKwkJCQorCQkJaWYgKFdhaXRUaWxsQ2FyZElzRnJlZShiYXNlKSkgCisJCQkJcmV0dXJuIC1FSU87CisJCQkJCisJCQlpZiAoKHN0YXR1cz1pbncoYmFzZSsweDQpKSE9MCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSVNJTG9hZDpDYXJkJWQgdmVyaWZ5IGdvdCBvdXQgb2Ygc3luYy5DYXJkIFN0YXR1czoweCV4XG4iLGNhcmQrMSwgc3RhdHVzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0JCisJCQkKKwkJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCAmZnJhbWUsIHNpemVvZihiaW5fZnJhbWUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQorCWNhc2UJTUlPQ1RMX1hGRVJfQ1RSTDoKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJaWYgKFdhaXRUaWxsQ2FyZElzRnJlZShiYXNlKSkgCisJCQkJcmV0dXJuIC1FSU87CisJCQkJCQorCQkJb3V0dygweGYyLCBiYXNlKTsKKwkJCW91dHcoMHg4MDAsIGJhc2UpOworCQkJb3V0dygweDAsIGJhc2UpOworCQkJb3V0dygweDAsIGJhc2UpOworCQkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKwkJCW91dHcoMHgwLCBiYXNlKzB4NCk7ICAgIC8qIGZvciBJU0k0NjA4IGNhcmRzICovCisJCQkJCQkJCisJCQlpc2lfY2FyZFtjYXJkXS5zdGF0dXMgfD0gRklSTVdBUkVfTE9BREVEOworCQkJcmV0dXJuIDA7CQorCQkJCisJZGVmYXVsdDoKKyNpZmRlZiBJU0lDT01fREVCVUcJCisJCXByaW50ayhLRVJOX0RFQlVHICJJU0lMb2FkOiBSZWNlaXZlZCBJb2N0bCBjbWQgMHgleC5cbiIsIGNtZCk7IAorI2VuZGlmCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCisJfQorCQorfQorCQkgICAgICAgIAkKKworLyoKKyAqCUlTSUNPTSBEcml2ZXIgc3BlY2lmaWMgcm91dGluZXMgLi4uCisgKgorICovCisgCitzdGF0aWMgaW5saW5lIGludCBpc2ljb21fcGFyYW5vaWFfY2hlY2soc3RydWN0IGlzaV9wb3J0IGNvbnN0ICogcG9ydCwgY2hhciAqbmFtZSwgCisJCQkJCWNvbnN0IGNoYXIgKiByb3V0aW5lKQoreworI2lmZGVmIElTSUNPTV9ERUJVRyAKKwlzdGF0aWMgY29uc3QgY2hhciAqIGJhZG1hZ2ljID0gCisJCQlLRVJOX1dBUk5JTkcgIklTSUNPTTogV2FybmluZzogYmFkIGlzaWNvbSBtYWdpYyBmb3IgZGV2ICVzIGluICVzLlxuIjsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGJhZHBvcnQgPSAKKwkJCUtFUk5fV0FSTklORyAiSVNJQ09NOiBXYXJuaW5nOiBOVUxMIGlzaWNvbSBwb3J0IGZvciBkZXYgJXMgaW4gJXMuXG4iOwkJCisJaWYgKCFwb3J0KSB7CisJCXByaW50ayhiYWRwb3J0LCBuYW1lLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChwb3J0LT5tYWdpYyAhPSBJU0lDT01fTUFHSUMpIHsKKwkJcHJpbnRrKGJhZG1hZ2ljLCBuYW1lLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQkKKyNlbmRpZgkKKwlyZXR1cm4gMDsKK30KKwkJCQorLyoKKyAqCVRyYW5zbWl0dGVyLiAKKyAqCisgKglXZSBzaG92ZWwgZGF0YSBpbnRvIHRoZSBjYXJkIGJ1ZmZlcnMgb24gYSByZWd1bGFyIGJhc2lzLiBUaGUgY2FyZAorICoJd2lsbCBkbyB0aGUgcmVzdCBvZiB0aGUgd29yayBmb3IgdXMuCisgKi8KKworc3RhdGljIHZvaWQgaXNpY29tX3R4KHVuc2lnbmVkIGxvbmcgX2RhdGEpCit7CisJc2hvcnQgY291bnQgPSAoQk9BUkRfQ09VTlQtMSksIGNhcmQsIGJhc2U7CisJc2hvcnQgdHhjb3VudCwgd3JkLCByZXNpZHVlLCB3b3JkX2NvdW50LCBjbnQ7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKKwkKKyNpZmRlZiBJU0lDT01fREVCVUcKKwkrK3R4X2NvdW50OworI2VuZGlmCQorCQorCS8qCWZpbmQgbmV4dCBhY3RpdmUgYm9hcmQJKi8KKwljYXJkID0gKHByZXZfY2FyZCArIDEpICYgMHgwMDAzOworCXdoaWxlKGNvdW50LS0gPiAwKSB7CisJCWlmIChpc2lfY2FyZFtjYXJkXS5zdGF0dXMgJiBCT0FSRF9BQ1RJVkUpIAorCQkJYnJlYWs7CisJCWNhcmQgPSAoY2FyZCArIDEpICYgMHgwMDAzOwkKKwl9CisJaWYgKCEoaXNpX2NhcmRbY2FyZF0uc3RhdHVzICYgQk9BUkRfQUNUSVZFKSkKKwkJZ290byBzY2hlZF9hZ2FpbjsKKwkJCisJcHJldl9jYXJkID0gY2FyZDsKKwkKKwljb3VudCA9IGlzaV9jYXJkW2NhcmRdLnBvcnRfY291bnQ7CisJcG9ydCA9IGlzaV9jYXJkW2NhcmRdLnBvcnRzOworCWJhc2UgPSBpc2lfY2FyZFtjYXJkXS5iYXNlOworCWZvciAoO2NvdW50ID4gMDtjb3VudC0tLCBwb3J0KyspIHsKKwkJaWYgKCFsb2NrX2NhcmRfYXRfaW50ZXJydXB0KCZpc2lfY2FyZFtjYXJkXSkpCisJCQljb250aW51ZTsKKwkJLyogcG9ydCBub3QgYWN0aXZlIG9yIHR4IGRpc2FibGVkIHRvIGZvcmNlIGZsb3cgY29udHJvbCAqLworCQlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB8fAorCQkgCSEocG9ydC0+c3RhdHVzICYgSVNJX1RYT0spKQorCQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKKwkJCWNvbnRpbnVlOworCQkKKwkJdHR5ID0gcG9ydC0+dHR5OworCQkKKwkJCisJCWlmKHR0eSA9PSBOVUxMKSB7CisJCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOworCQkJY29udGludWU7CisJCX0KKwkJCisJCXR4Y291bnQgPSBtaW5fdChzaG9ydCwgVFhfU0laRSwgcG9ydC0+eG1pdF9jbnQpOworCQlpZiAodHhjb3VudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQpIHsKKwkJCXVubG9ja19jYXJkKCZpc2lfY2FyZFtjYXJkXSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIShpbncoYmFzZSArIDB4MDIpICYgKDEgPDwgcG9ydC0+Y2hhbm5lbCkpKSB7CisJCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOworCQkJY29udGludWU7CQkKKwkJfQorI2lmZGVmIElTSUNPTV9ERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiB0eGluZyAlZCBieXRlcywgcG9ydCVkLlxuIiwgCisJCQkJdHhjb3VudCwgcG9ydC0+Y2hhbm5lbCsxKTsgCisjZW5kaWYJCisJCW91dHcoKHBvcnQtPmNoYW5uZWwgPDwgaXNpX2NhcmRbY2FyZF0uc2hpZnRfY291bnQpIHwgdHhjb3VudAorCQkJCQksIGJhc2UpOworCQlyZXNpZHVlID0gTk87CisJCXdyZCA9IDA7CQkJCisJCXdoaWxlICgxKSB7CisJCQljbnQgPSBtaW5fdChpbnQsIHR4Y291bnQsIChTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF90YWlsKSk7CisJCQlpZiAocmVzaWR1ZSA9PSBZRVMpIHsKKwkJCQlyZXNpZHVlID0gTk87CisJCQkJaWYgKGNudCA+IDApIHsKKwkJCQkJd3JkIHw9IChwb3J0LT54bWl0X2J1Zltwb3J0LT54bWl0X3RhaWxdIDw8IDgpOworCQkJCQlwb3J0LT54bWl0X3RhaWwgPSAocG9ydC0+eG1pdF90YWlsICsgMSkgJiAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOworCQkJCQlwb3J0LT54bWl0X2NudC0tOworCQkJCQl0eGNvdW50LS07CisJCQkJCWNudC0tOworCQkJCQlvdXR3KHdyZCwgYmFzZSk7CQkJCisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlvdXR3KHdyZCwgYmFzZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0JCQorCQkJaWYgKGNudCA8PSAwKSBicmVhazsKKwkJCXdvcmRfY291bnQgPSBjbnQgPj4gMTsKKwkJCW91dHN3KGJhc2UsIHBvcnQtPnhtaXRfYnVmK3BvcnQtPnhtaXRfdGFpbCwgd29yZF9jb3VudCk7CisJCQlwb3J0LT54bWl0X3RhaWwgPSAocG9ydC0+eG1pdF90YWlsICsgKHdvcmRfY291bnQgPDwgMSkpICYKKwkJCQkJCShTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisJCQl0eGNvdW50IC09ICh3b3JkX2NvdW50IDw8IDEpOworCQkJcG9ydC0+eG1pdF9jbnQgLT0gKHdvcmRfY291bnQgPDwgMSk7CisJCQlpZiAoY250ICYgMHgwMDAxKSB7CisJCQkJcmVzaWR1ZSA9IFlFUzsKKwkJCQl3cmQgPSBwb3J0LT54bWl0X2J1Zltwb3J0LT54bWl0X3RhaWxdOworCQkJCXBvcnQtPnhtaXRfdGFpbCA9IChwb3J0LT54bWl0X3RhaWwgKyAxKSAmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisJCQkJcG9ydC0+eG1pdF9jbnQtLTsKKwkJCQl0eGNvdW50LS07CisJCQl9CisJCX0KKworCQlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOworCQlpZiAocG9ydC0+eG1pdF9jbnQgPD0gMCkKKwkJCXBvcnQtPnN0YXR1cyAmPSB+SVNJX1RYT0s7CisJCWlmIChwb3J0LT54bWl0X2NudCA8PSBXQUtFVVBfQ0hBUlMpCisJCQlzY2hlZHVsZV93b3JrKCZwb3J0LT5iaF90cXVldWUpOworCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOworCX0JCisKKwkvKglzY2hlZHVsZSBhbm90aGVyIHR4IGZvciBob3BlZnVsbHkgaW4gYWJvdXQgMTBtcwkqLwkKK3NjaGVkX2FnYWluOgkKKwlpZiAoIXJlX3NjaGVkdWxlKQkKKwkJcmV0dXJuOworCWluaXRfdGltZXIoJnR4KTsKKwl0eC5leHBpcmVzID0gamlmZmllcyArIEhaLzEwMDsKKwl0eC5kYXRhID0gMDsKKwl0eC5mdW5jdGlvbiA9IGlzaWNvbV90eDsKKwlhZGRfdGltZXIoJnR4KTsKKwkKKwlyZXR1cm47CQorfQkJCisgCisvKiAJSW50ZXJydXB0IGhhbmRsZXJzIAkqLworCisgCitzdGF0aWMgdm9pZCBpc2ljb21fYm90dG9taGFsZih2b2lkICogZGF0YSkKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSBkYXRhOworCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5ID0gcG9ydC0+dHR5OworCQorCWlmICghdHR5KQorCQlyZXR1cm47CisKKwl0dHlfd2FrZXVwKHR0eSk7CQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKK30gCQkKKyAJCQorLyoKKyAqCU1haW4gaW50ZXJydXB0IGhhbmRsZXIgcm91dGluZSAKKyAqLworIAorc3RhdGljIGlycXJldHVybl90IGlzaWNvbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZDsKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5OworCXVuc2lnbmVkIHNob3J0IGJhc2UsIGhlYWRlciwgd29yZF9jb3VudCwgY291bnQ7CisJdW5zaWduZWQgY2hhciBjaGFubmVsOworCXNob3J0IGJ5dGVfY291bnQ7CisJCisJY2FyZCA9IChzdHJ1Y3QgaXNpX2JvYXJkICopIGRldl9pZDsKKworCWlmICghY2FyZCB8fCAhKGNhcmQtPnN0YXR1cyAmIEZJUk1XQVJFX0xPQURFRCkpCisJCXJldHVybiBJUlFfTk9ORTsKKwkKKwliYXNlID0gY2FyZC0+YmFzZTsKKwlzcGluX2xvY2soJmNhcmQtPmNhcmRfbG9jayk7CisJCisJaWYgKGNhcmQtPmlzYSA9PSBOTykgeworCQkvKgorCQkgKiAgICAgIGRpc2FibGUgYW55IGludGVycnVwdHMgZnJvbSB0aGUgUENJIGNhcmQgYW5kIGxvd2VyIHRoZQorCQkgKiAgICAgIGludGVycnVwdCBsaW5lCisJCSAqLworCQlvdXR3KDB4ODAwMCwgYmFzZSsweDA0KTsKKwkJQ2xlYXJJbnRlcnJ1cHQoYmFzZSk7CisJfQorCQorCWludyhiYXNlKTsJCS8qIGdldCB0aGUgZHVtbXkgd29yZCBvdXQgKi8KKwloZWFkZXIgPSBpbncoYmFzZSk7CisJY2hhbm5lbCA9IChoZWFkZXIgJiAweDc4MDApID4+IGNhcmQtPnNoaWZ0X2NvdW50OworCWJ5dGVfY291bnQgPSBoZWFkZXIgJiAweGZmOworCisJaWYgKGNoYW5uZWwgKyAxID4gY2FyZC0+cG9ydF9jb3VudCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lDT006IGlzaWNvbV9pbnRlcnJ1cHQoMHgleCk6ICVkKGNoYW5uZWwpID4gcG9ydF9jb3VudC5cbiIsCisJCQkJYmFzZSwgY2hhbm5lbCsxKTsKKwkJaWYgKGNhcmQtPmlzYSkKKwkJCUNsZWFySW50ZXJydXB0KGJhc2UpOworCQllbHNlCisJCQlvdXR3KDB4MDAwMCwgYmFzZSsweDA0KTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8JCQorCQlzcGluX3VubG9jaygmY2FyZC0+Y2FyZF9sb2NrKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOwkJCQorCX0KKwlwb3J0ID0gY2FyZC0+cG9ydHMgKyBjaGFubmVsOworCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisJCWlmIChjYXJkLT5pc2EpCisJCQlDbGVhckludGVycnVwdChiYXNlKTsKKwkJZWxzZQorCQkJb3V0dygweDAwMDAsIGJhc2UrMHgwNCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CQorCQkKKwl0dHkgPSBwb3J0LT50dHk7CisJaWYgKHR0eSA9PSBOVUxMKSB7CisJCXdvcmRfY291bnQgPSBieXRlX2NvdW50ID4+IDE7CisJCXdoaWxlKGJ5dGVfY291bnQgPiAxKSB7CisJCQlpbncoYmFzZSk7CisJCQlieXRlX2NvdW50IC09IDI7CisJCX0KKwkJaWYgKGJ5dGVfY291bnQgJiAweDAxKQorCQkJaW53KGJhc2UpOworCQlpZiAoY2FyZC0+aXNhID09IFlFUykKKwkJCUNsZWFySW50ZXJydXB0KGJhc2UpOworCQllbHNlCisJCQlvdXR3KDB4MDAwMCwgYmFzZSsweDA0KTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwkJc3Bpbl91bmxvY2soJmNhcmQtPmNhcmRfbG9jayk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJCisJaWYgKGhlYWRlciAmIDB4ODAwMCkgewkJLyogU3RhdHVzIFBhY2tldCAqLworCQloZWFkZXIgPSBpbncoYmFzZSk7CisJCXN3aXRjaChoZWFkZXIgJiAweGZmKSB7CisJCQljYXNlIDA6CS8qIENoYW5nZSBpbiBFSUEgc2lnbmFscyAqLworCQkJCQorCQkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSB7CisJCQkJCWlmIChwb3J0LT5zdGF0dXMgJiBJU0lfRENEKSB7CisJCQkJCQlpZiAoIShoZWFkZXIgJiBJU0lfRENEKSkgeworCQkJCQkJLyogQ2FycmllciBoYXMgYmVlbiBsb3N0ICAqLworI2lmZGVmIElTSUNPTV9ERUJVRwkJCQkJCQorCQkJCQkJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IGludGVycnVwdDogRENELT5sb3cuXG4iKTsKKyNlbmRpZgkJCQkJCQkKKwkJCQkJCQlwb3J0LT5zdGF0dXMgJj0gfklTSV9EQ0Q7CisJCQkJCQkJc2NoZWR1bGVfd29yaygmcG9ydC0+aGFuZ3VwX3RxKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCWlmIChoZWFkZXIgJiBJU0lfRENEKSB7CisJCQkJCQkvKiBDYXJyaWVyIGhhcyBiZWVuIGRldGVjdGVkICovCisjaWZkZWYgSVNJQ09NX0RFQlVHCisJCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogaW50ZXJydXB0OiBEQ0QtPmhpZ2guXG4iKTsKKyNlbmRpZgkJCQkJCQkKKwkJCQkJCQlwb3J0LT5zdGF0dXMgfD0gSVNJX0RDRDsKKwkJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWlmIChoZWFkZXIgJiBJU0lfRENEKSAKKwkJCQkJCXBvcnQtPnN0YXR1cyB8PSBJU0lfRENEOworCQkJCQllbHNlCisJCQkJCQlwb3J0LT5zdGF0dXMgJj0gfklTSV9EQ0Q7CisJCQkJfQkKKwkJCQkKKwkJCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgeworCQkJCQlpZiAocG9ydC0+dHR5LT5od19zdG9wcGVkKSB7CisJCQkJCQlpZiAoaGVhZGVyICYgSVNJX0NUUykgeworCQkJCQkJCXBvcnQtPnR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCQkJCQkJLyogc3RhcnQgdHggaW5nICovCisJCQkJCQkJcG9ydC0+c3RhdHVzIHw9IChJU0lfVFhPSyB8IElTSV9DVFMpOworCQkJCQkJCXNjaGVkdWxlX3dvcmsoJnBvcnQtPmJoX3RxdWV1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQlpZiAoIShoZWFkZXIgJiBJU0lfQ1RTKSkgeworCQkJCQkJCXBvcnQtPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQkJCQkJLyogc3RvcCB0eCBpbmcgKi8KKwkJCQkJCQlwb3J0LT5zdGF0dXMgJj0gfihJU0lfVFhPSyB8IElTSV9DVFMpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlpZiAoaGVhZGVyICYgSVNJX0NUUykgCisJCQkJCQlwb3J0LT5zdGF0dXMgfD0gSVNJX0NUUzsKKwkJCQkJZWxzZQorCQkJCQkJcG9ydC0+c3RhdHVzICY9IH5JU0lfQ1RTOworCQkJCX0KKwkJCQkKKwkJCQlpZiAoaGVhZGVyICYgSVNJX0RTUikgCisJCQkJCXBvcnQtPnN0YXR1cyB8PSBJU0lfRFNSOworCQkJCWVsc2UKKwkJCQkJcG9ydC0+c3RhdHVzICY9IH5JU0lfRFNSOworCQkJCQorCQkJCWlmIChoZWFkZXIgJiBJU0lfUkkpIAorCQkJCQlwb3J0LT5zdGF0dXMgfD0gSVNJX1JJOworCQkJCWVsc2UKKwkJCQkJcG9ydC0+c3RhdHVzICY9IH5JU0lfUkk7CQkJCQkJCisJCQkJCisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIDE6CS8qIFJlY2VpdmVkIEJyZWFrICEhIQkgKi8KKwkJCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpCisJCQkJCWJyZWFrOworCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfQlJFQUs7CisJCQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IDA7CisJCQkJdHR5LT5mbGlwLmNvdW50Kys7CisJCQkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfU0FLKQorCQkJCQlkb19TQUsodHR5KTsKKwkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgMjoJLyogU3RhdGlzdGljcwkJICovCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogaXNpY29tX2ludGVycnVwdDogc3RhdHMhISEuXG4iKTsJCQkKKwkJCQlicmVhazsKKwkJCQkKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNJQ09NOiBJbnRyOiBVbmtub3duIGNvZGUgaW4gc3RhdHVzIHBhY2tldC5cbiIpOworCQkJCWJyZWFrOworCQl9CSAKKwl9CisJZWxzZSB7CQkJCS8qIERhdGEgICBQYWNrZXQgKi8KKwkJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBzaG9ydCwgYnl0ZV9jb3VudCwgKFRUWV9GTElQQlVGX1NJWkUgLSB0dHktPmZsaXAuY291bnQpKTsKKyNpZmRlZiBJU0lDT01fREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogSW50cjogQ2FuIHJ4ICVkIG9mICVkIGJ5dGVzLlxuIiwgCisJCQkJCWNvdW50LCBieXRlX2NvdW50KTsKKyNlbmRpZgkJCQorCQl3b3JkX2NvdW50ID0gY291bnQgPj4gMTsKKwkJaW5zdyhiYXNlLCB0dHktPmZsaXAuY2hhcl9idWZfcHRyLCB3b3JkX2NvdW50KTsKKwkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciArPSAod29yZF9jb3VudCA8PCAxKTsJCQorCQlieXRlX2NvdW50IC09ICh3b3JkX2NvdW50IDw8IDEpOworCQlpZiAoY291bnQgJiAweDAwMDEpIHsKKwkJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAoY2hhcikoaW53KGJhc2UpICYgMHhmZik7CisJCQlieXRlX2NvdW50IC09IDI7CisJCX0JCisJCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBjb3VudCk7CisJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gY291bnQ7CisJCXR0eS0+ZmxpcC5jb3VudCArPSBjb3VudDsKKwkJCisJCWlmIChieXRlX2NvdW50ID4gMCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogSW50cigweCV4OiVkKTogRmxpcCBidWZmZXIgb3ZlcmZsb3chIGRyb3BwaW5nIGJ5dGVzLi4uXG4iLAorCQkJCQliYXNlLCBjaGFubmVsKzEpOworCQkJd2hpbGUoYnl0ZV9jb3VudCA+IDApIHsgLyogZHJhaW4gb3V0IHVucmVhZCB4dHJhIGRhdGEgKi8KKwkJCQlpbncoYmFzZSk7CisJCQkJYnl0ZV9jb3VudCAtPSAyOworCQkJfQorCQl9CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworCX0KKwlpZiAoY2FyZC0+aXNhID09IFlFUykKKwkJQ2xlYXJJbnRlcnJ1cHQoYmFzZSk7CisJZWxzZQorCQlvdXR3KDB4MDAwMCwgYmFzZSsweDA0KTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8JCisJcmV0dXJuIElSUV9IQU5ETEVEOworfSAKKworc3RhdGljIHZvaWQgaXNpY29tX2NvbmZpZ19wb3J0KHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQpCit7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5OworCXVuc2lnbmVkIGxvbmcgYmF1ZDsKKwl1bnNpZ25lZCBzaG9ydCBjaGFubmVsX3NldHVwLCBiYXNlID0gY2FyZC0+YmFzZTsKKwl1bnNpZ25lZCBzaG9ydCBjaGFubmVsID0gcG9ydC0+Y2hhbm5lbCwgc2hpZnRfY291bnQgPSBjYXJkLT5zaGlmdF9jb3VudDsKKwl1bnNpZ25lZCBjaGFyIGZsb3dfY3RybDsKKwkKKwlpZiAoISh0dHkgPSBwb3J0LT50dHkpIHx8ICF0dHktPnRlcm1pb3MpCisJCXJldHVybjsKKwliYXVkID0gQ19CQVVEKHR0eSk7CisJaWYgKGJhdWQgJiBDQkFVREVYKSB7CisJCWJhdWQgJj0gfkNCQVVERVg7CisJCQorCQkvKiAgaWYgQ0JBVURFWCBiaXQgaXMgb24gYW5kIHRoZSBiYXVkIGlzIHNldCB0byBlaXRoZXIgNTAgb3IgNzUKKwkJICogIHRoZW4gdGhlIGNhcmQgaXMgcHJvZ3JhbW1lZCBmb3IgNTcuNkticHMgb3IgMTE1S2JwcworCQkgKiAgcmVzcGVjdGl2ZWx5LgorCQkgKi8gICAKKwkJIAorCQlpZiAoYmF1ZCA8IDEgfHwgYmF1ZCA+IDIpCisJCQlwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNCQVVERVg7CisJCWVsc2UKKwkJCWJhdWQgKz0gMTU7CisJfQkKKwlpZiAoYmF1ZCA9PSAxNSkgeworCQorCQkvKiAgdGhlIEFTWU5DX1NQRF9ISSBhbmQgQVNZTkNfU1BEX1ZISSBvcHRpb25zIGFyZSBzZXQgCisJCSAqICBieSB0aGUgc2V0X3NlcmlhbF9pbmZvIGlvY3RsIC4uLiB0aGlzIGlzIGRvbmUgYnkKKwkJICogIHRoZSAnc2V0c2VyaWFsJyB1dGlsaXR5LgorCQkgKi8gIAorCQkJCisJCWlmICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQorCQkJYmF1ZCsrOyAgICAgLyogIDU3LjYgS2JwcyAqLworCQlpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCisJCQliYXVkICs9MjsgICAvKiAgMTE1ICBLYnBzICovCSAKKwl9CisJaWYgKGxpbnV4Yl90b19pc2liW2JhdWRdID09IC0xKSB7CisJCS8qIGhhbmcgdXAgKi8KKwkgCWRyb3BfZHRyKHBvcnQpOworCSAJcmV0dXJuOworCX0JCisJZWxzZSAgCisJCXJhaXNlX2R0cihwb3J0KTsKKwkJCisJaWYgKGxvY2tfY2FyZChjYXJkKSkgeworCQlvdXR3KDB4ODAwMCB8IChjaGFubmVsIDw8IHNoaWZ0X2NvdW50KSB8MHgwMywgYmFzZSk7CisJCW91dHcobGludXhiX3RvX2lzaWJbYmF1ZF0gPDwgOCB8IDB4MDMsIGJhc2UpOworCQljaGFubmVsX3NldHVwID0gMDsKKwkJc3dpdGNoKENfQ1NJWkUodHR5KSkgeworCQkJY2FzZSBDUzU6CisJCQkJY2hhbm5lbF9zZXR1cCB8PSBJU0lDT01fQ1M1OworCQkJCWJyZWFrOworCQkJY2FzZSBDUzY6CisJCQkJY2hhbm5lbF9zZXR1cCB8PSBJU0lDT01fQ1M2OworCQkJCWJyZWFrOworCQkJY2FzZSBDUzc6CisJCQkJY2hhbm5lbF9zZXR1cCB8PSBJU0lDT01fQ1M3OworCQkJCWJyZWFrOworCQkJY2FzZSBDUzg6CisJCQkJY2hhbm5lbF9zZXR1cCB8PSBJU0lDT01fQ1M4OworCQkJCWJyZWFrOworCQl9CisJCQkKKwkJaWYgKENfQ1NUT1BCKHR0eSkpCisJCQljaGFubmVsX3NldHVwIHw9IElTSUNPTV8yU0I7CisJCWlmIChDX1BBUkVOQih0dHkpKSB7CisJCQljaGFubmVsX3NldHVwIHw9IElTSUNPTV9FVlBBUjsKKwkJCWlmIChDX1BBUk9ERCh0dHkpKQorCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX09EUEFSOwkKKwkJfQorCQlvdXR3KGNoYW5uZWxfc2V0dXAsIGJhc2UpOwkKKwkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKwkJdW5sb2NrX2NhcmQoY2FyZCk7CQorCX0JCisJaWYgKENfQ0xPQ0FMKHR0eSkpCisJCXBvcnQtPmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwllbHNlCisJCXBvcnQtPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOwkKKwkKKwkvKiBmbG93IGNvbnRyb2wgc2V0dGluZ3MgLi4uKi8KKwlmbG93X2N0cmwgPSAwOworCXBvcnQtPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKwlpZiAoQ19DUlRTQ1RTKHR0eSkpIHsKKwkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfQ1RTX0ZMT1c7CisJCWZsb3dfY3RybCB8PSBJU0lDT01fQ1RTUlRTOworCX0JCisJaWYgKElfSVhPTih0dHkpKQkKKwkJZmxvd19jdHJsIHw9IElTSUNPTV9SRVNQT05EX1hPTlhPRkY7CisJaWYgKElfSVhPRkYodHR5KSkKKwkJZmxvd19jdHJsIHw9IElTSUNPTV9JTklUSUFURV9YT05YT0ZGOwkKKwkJCisJaWYgKGxvY2tfY2FyZChjYXJkKSkgeworCQlvdXR3KDB4ODAwMCB8IChjaGFubmVsIDw8IHNoaWZ0X2NvdW50KSB8MHgwNCwgYmFzZSk7CisJCW91dHcoZmxvd19jdHJsIDw8IDggfCAweDA1LCBiYXNlKTsKKwkJb3V0dygoU1RPUF9DSEFSKHR0eSkpIDw8IDggfCAoU1RBUlRfQ0hBUih0dHkpKSwgYmFzZSk7CisJCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisJCXVubG9ja19jYXJkKGNhcmQpOworCX0KKwkKKwkvKglyeCBlbmFibGVkIC0+IGVuYWJsZSBwb3J0IGZvciByeCBvbiB0aGUgY2FyZAkqLworCWlmIChDX0NSRUFEKHR0eSkpIHsKKwkJY2FyZC0+cG9ydF9zdGF0dXMgfD0gKDEgPDwgY2hhbm5lbCk7CisJCW91dHcoY2FyZC0+cG9ydF9zdGF0dXMsIGJhc2UgKyAweDAyKTsKKwl9Cit9CisgCisvKiBvcGVuIGV0IGFsbCAqLyAKKworc3RhdGljIGlubGluZSB2b2lkIGlzaWNvbV9zZXR1cF9ib2FyZChzdHJ1Y3QgaXNpX2JvYXJkICogYnApCit7CisJaW50IGNoYW5uZWw7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKGJwLT5zdGF0dXMgJiBCT0FSRF9BQ1RJVkUpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmNhcmRfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXBvcnQgPSBicC0+cG9ydHM7CisJYnAtPnN0YXR1cyB8PSBCT0FSRF9BQ1RJVkU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmNhcmRfbG9jaywgZmxhZ3MpOworCWZvcihjaGFubmVsID0gMDsgY2hhbm5lbCA8IGJwLT5wb3J0X2NvdW50OyBjaGFubmVsKyssIHBvcnQrKykKKwkJZHJvcF9kdHJfcnRzKHBvcnQpOworCXJldHVybjsKK30KKyAKK3N0YXRpYyBpbnQgaXNpY29tX3NldHVwX3BvcnQoc3RydWN0IGlzaV9wb3J0ICogcG9ydCkKK3sKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFwb3J0LT54bWl0X2J1ZikgeworCQl1bnNpZ25lZCBsb25nIHBhZ2U7CisJCQorCQlpZiAoIShwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQkKKwkJaWYgKHBvcnQtPnhtaXRfYnVmKSB7CisJCQlmcmVlX3BhZ2UocGFnZSk7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJCXBvcnQtPnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsJCisJfQkKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlpZiAocG9ydC0+dHR5KQorCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmcG9ydC0+dHR5LT5mbGFncyk7CisJaWYgKHBvcnQtPmNvdW50ID09IDEpCisJCWNhcmQtPmNvdW50Kys7CisJCQorCXBvcnQtPnhtaXRfY250ID0gcG9ydC0+eG1pdF9oZWFkID0gcG9ydC0+eG1pdF90YWlsID0gMDsKKwkKKwkvKglkaXNjYXJkIGFueSByZXNpZHVhbCBkYXRhCSovCisJa2lsbF9xdWV1ZShwb3J0LCBJU0lDT01fS0lMTFRYIHwgSVNJQ09NX0tJTExSWCk7CisJCisJaXNpY29tX2NvbmZpZ19wb3J0KHBvcnQpOworCXBvcnQtPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQorCXJldHVybiAwOwkJCit9IAorIAorc3RhdGljIGludCBibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCwgc3RydWN0IGlzaV9wb3J0ICogcG9ydCkgCit7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCWludCBkb19jbG9jYWwgPSAwLCByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCS8qIGJsb2NrIGlmIHBvcnQgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY2xvc2VkICovCisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCBwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKKyNpZmRlZiBJU0lDT01fREVCVUcJCisJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IGJsb2NrX3RpbF9yZWFkeTogY2xvc2UgaW4gcHJvZ3Jlc3MuXG4iKTsKKyNlbmRpZgkJCisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnBvcnQtPmNsb3NlX3dhaXQpOworCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWVsc2UKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCQorCS8qIGlmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCAuLi4gKi8KKwkKKwlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fCAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7CisjaWZkZWYgSVNJQ09NX0RFQlVHCQorCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBibG9ja190aWxfcmVhZHk6IG5vbi1ibG9jayBtb2RlLlxuIik7CisjZW5kaWYJCQorCQlwb3J0LT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlyZXR1cm4gMDsJCisJfQkKKwkKKwlpZiAoQ19DTE9DQUwodHR5KSkKKwkJZG9fY2xvY2FsID0gMTsKKwkKKwkvKiBibG9jayB3YWl0aW5nIGZvciBEQ0QgdG8gYmUgYXNzZXJ0ZWQsIGFuZCB3aGlsZSAKKwkJCQkJCWNhbGxvdXQgZGV2IGlzIGJ1c3kgKi8KKwlyZXR2YWwgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCisJCXBvcnQtPmNvdW50LS07CisJcG9ydC0+YmxvY2tlZF9vcGVuKys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCisJd2hpbGUgKDEpIHsKKwkJcmFpc2VfZHRyX3J0cyhwb3J0KTsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCAhKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7IAkKKwkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQkKKwkJaWYgKCEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJgorCQkgICAgKGRvX2Nsb2NhbCB8fCAocG9ydC0+c3RhdHVzICYgSVNJX0RDRCkpKSB7CisJCQlicmVhazsKKwkJfQkKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlzY2hlZHVsZSgpOwkJCisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCisJCXBvcnQtPmNvdW50Kys7CisJcG9ydC0+YmxvY2tlZF9vcGVuLS07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlwb3J0LT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCXJldHVybiAwOworfQorIAorc3RhdGljIGludCBpc2ljb21fb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQ7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQ7CisJdW5zaWduZWQgaW50IGxpbmUsIGJvYXJkOworCWludCBlcnJvcjsKKworCWxpbmUgPSB0dHktPmluZGV4OworCWlmIChsaW5lIDwgMCB8fCBsaW5lID4gUE9SVF9DT1VOVC0xKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlib2FyZCA9IEJPQVJEKGxpbmUpOworCWNhcmQgPSAmaXNpX2NhcmRbYm9hcmRdOworCQorCWlmICghKGNhcmQtPnN0YXR1cyAmIEZJUk1XQVJFX0xPQURFRCkpCisJCXJldHVybiAtRU5PREVWOworCQorCS8qICBvcGVuIG9uIGEgcG9ydCBncmVhdGVyIHRoYW4gdGhlIHBvcnQgY291bnQgZm9yIHRoZSBjYXJkICEhISAqLworCWlmIChsaW5lID4gKChib2FyZCAqIDE2KSArIGNhcmQtPnBvcnRfY291bnQgLSAxKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwb3J0ID0gJmlzaV9wb3J0c1tsaW5lXTsJCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fb3BlbiIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkJCisJaXNpY29tX3NldHVwX2JvYXJkKGNhcmQpOwkJCisJCisJcG9ydC0+Y291bnQrKzsKKwl0dHktPmRyaXZlcl9kYXRhID0gcG9ydDsKKwlwb3J0LT50dHkgPSB0dHk7CisJaWYgKChlcnJvciA9IGlzaWNvbV9zZXR1cF9wb3J0KHBvcnQpKSE9MCkKKwkJcmV0dXJuIGVycm9yOworCWlmICgoZXJyb3IgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBwb3J0KSkhPTApCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiAwOyAgICAgIAkJCit9CisgCisvKiBjbG9zZSBldCBhbGwgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGlzaWNvbV9zaHV0ZG93bl9ib2FyZChzdHJ1Y3QgaXNpX2JvYXJkICogYnApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKGJwLT5zdGF0dXMgJiBCT0FSRF9BQ1RJVkUpIHsKKwkJYnAtPnN0YXR1cyAmPSB+Qk9BUkRfQUNUSVZFOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+Y2FyZF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGlzaWNvbV9zaHV0ZG93bl9wb3J0KHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQpCit7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5OwkKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXR0eSA9IHBvcnQtPnR0eTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsJCisJaWYgKCEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJaWYgKHBvcnQtPnhtaXRfYnVmKSB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcG9ydC0+eG1pdF9idWYpOworCQlwb3J0LT54bWl0X2J1ZiA9IE5VTEw7CisJfQkKKwlwb3J0LT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisJLyogM3JkIE9jdG9iZXIgMjAwMCA6IFZpbmF5YWsgUCBSaXNidWQgKi8KKwlwb3J0LT50dHkgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQorCS8qRml4IGRvbmUgYnkgQW5pbCAuUyBvbiAzMC0wNC0yMDAxCisJcmVtb3RlIGxvZ2luIHRocm91Z2ggaXNpIHBvcnQgaGFzIGR0ciB0b2dnbGUgcHJvYmxlbQorCWR1ZSB0byB3aGljaCB0aGUgY2FycmllciBkcm9wcyBiZWZvcmUgdGhlIHBhc3N3b3JkIHByb21wdAorCWFwcGVhcnMgb24gdGhlIHJlbW90ZSBlbmQuIE5vdyB3ZSBkcm9wIHRoZSBkdHIgb25seSBpZiB0aGUgCisJSFVQQ0woSGFuZ3VwIG9uIGNsb3NlKSBmbGFnIGlzIHNldCBmb3IgdGhlIHR0eSovCisJCisJaWYgKENfSFVQQ0wodHR5KSkgCisJCS8qIGRyb3AgZHRyIG9uIHRoaXMgcG9ydCAqLworCQlkcm9wX2R0cihwb3J0KTsKKwkJCisJLyogYW55IG90aGVyIHBvcnQgdW5pbml0cyAgKi8gCisJaWYgKHR0eSkKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKKwkKKwlpZiAoLS1jYXJkLT5jb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogaXNpY29tX3NodXRkb3duX3BvcnQ6IGJhZCBib2FyZCgweCV4KSBjb3VudCAlZC5cbiIsCisJCQljYXJkLT5iYXNlLCBjYXJkLT5jb3VudCk7CisJCWNhcmQtPmNvdW50ID0gMDsJCisJfQorCQorCS8qIGxhc3QgcG9ydCB3YXMgY2xvc2VkICwgc2h1dGRvd24gdGhhdCBib2FkIHRvbyAqLworCWlmKENfSFVQQ0wodHR5KSkgeworCQlpZiAoIWNhcmQtPmNvdW50KQorCQkJaXNpY29tX3NodXRkb3duX2JvYXJkKGNhcmQpOworCX0KK30KKworc3RhdGljIHZvaWQgaXNpY29tX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoIXBvcnQpCisJCXJldHVybjsKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9jbG9zZSIpKQorCQlyZXR1cm47CisJCisjaWZkZWYgSVNJQ09NX0RFQlVHCQkKKwlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBDbG9zZSBzdGFydCEhIS5cbiIpOworI2VuZGlmCQorCQorCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAodHR5LT5jb3VudCA9PSAxICYmIHBvcnQtPmNvdW50ICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNJQ09NOigweCV4KSBpc2ljb21fY2xvc2U6IGJhZCBwb3J0IGNvdW50IgorCQkJInR0eS0+Y291bnQgPSAxCXBvcnQgY291bnQgPSAlZC5cbiIsCisJCQljYXJkLT5iYXNlLCBwb3J0LT5jb3VudCk7CisJCXBvcnQtPmNvdW50ID0gMTsKKwl9CisJaWYgKC0tcG9ydC0+Y291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTooMHgleCkgaXNpY29tX2Nsb3NlOiBiYWQgcG9ydCBjb3VudCBmb3IiCisJCQkiY2hhbm5lbCVkID0gJWQiLCBjYXJkLT5iYXNlLCBwb3J0LT5jaGFubmVsLCAKKwkJCXBvcnQtPmNvdW50KTsKKwkJcG9ydC0+Y291bnQgPSAwOwkKKwl9CisJCisJaWYgKHBvcnQtPmNvdW50KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfSAJCisJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKwl0dHktPmNsb3NpbmcgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQorCWlmIChwb3J0LT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBwb3J0LT5jbG9zaW5nX3dhaXQpOworCS8qIGluZGljYXRlIHRvIHRoZSBjYXJkIHRoYXQgbm8gbW9yZSBkYXRhIGNhbiBiZSByZWNlaXZlZCAKKwkgICBvbiB0aGlzIHBvcnQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsgICAKKwkJY2FyZC0+cG9ydF9zdGF0dXMgJj0gfigxIDw8IHBvcnQtPmNoYW5uZWwpOworCQlvdXR3KGNhcmQtPnBvcnRfc3RhdHVzLCBjYXJkLT5iYXNlICsgMHgwMik7CisJfQkKKwlpc2ljb21fc2h1dGRvd25fcG9ydChwb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCXR0eS0+Y2xvc2luZyA9IDA7CisKKwlpZiAocG9ydC0+YmxvY2tlZF9vcGVuKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQlpZiAocG9ydC0+Y2xvc2VfZGVsYXkpIHsKKyNpZmRlZiBJU0lDT01fREVCVUcJCQkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IHNjaGVkdWxpbmcgdW50aWwgdGltZSBvdXQuXG4iKTsKKyNlbmRpZgkJCQorCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2Vjcyhwb3J0LT5jbG9zZV9kZWxheSkpOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOworCX0JCisJcG9ydC0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFIHwgQVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5jbG9zZV93YWl0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKK30KKworLyogd3JpdGUgZXQgYWxsICovCitzdGF0aWMgaW50IGlzaWNvbV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjbnQsIHRvdGFsID0gMDsKKworCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3dyaXRlIikpCisJCXJldHVybiAwOworCQorCWlmICghdHR5IHx8ICFwb3J0LT54bWl0X2J1ZiB8fCAhdG1wX2J1ZikKKwkJcmV0dXJuIDA7CisJCQorCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkKKwl3aGlsZSgxKSB7CQorCQljbnQgPSBtaW5fdChpbnQsIGNvdW50LCBtaW4oU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfY250IC0gMSwKKwkJCQkJICAgIFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2hlYWQpKTsKKwkJaWYgKGNudCA8PSAwKSAKKwkJCWJyZWFrOworCQkKKwkJbWVtY3B5KHBvcnQtPnhtaXRfYnVmICsgcG9ydC0+eG1pdF9oZWFkLCBidWYsIGNudCk7CisJCXBvcnQtPnhtaXRfaGVhZCA9IChwb3J0LT54bWl0X2hlYWQgKyBjbnQpICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkJcG9ydC0+eG1pdF9jbnQgKz0gY250OworCQlidWYgKz0gY250OworCQljb3VudCAtPSBjbnQ7CisJCXRvdGFsICs9IGNudDsKKwl9CQkKKwlpZiAocG9ydC0+eG1pdF9jbnQgJiYgIXR0eS0+c3RvcHBlZCAmJiAhdHR5LT5od19zdG9wcGVkKQorCQlwb3J0LT5zdGF0dXMgfD0gSVNJX1RYT0s7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHRvdGFsOwkKK30KKworLyogcHV0X2NoYXIgZXQgYWxsICovCitzdGF0aWMgdm9pZCBpc2ljb21fcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9wdXRfY2hhciIpKQorCQlyZXR1cm47CisJCisJaWYgKCF0dHkgfHwgIXBvcnQtPnhtaXRfYnVmKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKHBvcnQtPnhtaXRfY250ID49IFNFUklBTF9YTUlUX1NJWkUgLSAxKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCQorCXBvcnQtPnhtaXRfYnVmW3BvcnQtPnhtaXRfaGVhZCsrXSA9IGNoOworCXBvcnQtPnhtaXRfaGVhZCAmPSAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOworCXBvcnQtPnhtaXRfY250Kys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Cit9CisKKy8qIGZsdXNoX2NoYXJzIGV0IGFsbCAqLworc3RhdGljIHZvaWQgaXNpY29tX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fZmx1c2hfY2hhcnMiKSkKKwkJcmV0dXJuOworCQorCWlmIChwb3J0LT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQgfHwgIXBvcnQtPnhtaXRfYnVmKQorCQlyZXR1cm47CisJCQorCS8qIHRoaXMgdGVsbHMgdGhlIHRyYW5zbWl0dGVyIHRvIGNvbnNpZGVyIHRoaXMgcG9ydCBmb3IKKwkgICBkYXRhIG91dHB1dCB0byB0aGUgY2FyZCAuLi4gdGhhdCdzIHRoZSBiZXN0IHdlIGNhbiBkby4gKi8KKwlwb3J0LT5zdGF0dXMgfD0gSVNJX1RYT0s7CQorfQorCisvKiB3cml0ZV9yb29tIGV0IGFsbCAqLworc3RhdGljIGludCBpc2ljb21fd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCWludCBmcmVlOworCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fd3JpdGVfcm9vbSIpKQorCQlyZXR1cm4gMDsKKwkKKwlmcmVlID0gU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfY250IC0gMTsKKwlpZiAoZnJlZSA8IDApCisJCWZyZWUgPSAwOworCXJldHVybiBmcmVlOworfQorCisvKiBjaGFyc19pbl9idWZmZXIgZXQgYWxsICovCitzdGF0aWMgaW50IGlzaWNvbV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9jaGFyc19pbl9idWZmZXIiKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHBvcnQtPnhtaXRfY250OworfQorCisvKiBpb2N0bCBldCBhbGwgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2ljb21fc2VuZF9icmVhayhzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0LCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZSA9IGNhcmQtPmJhc2U7CQorCQorCWlmKCFsb2NrX2NhcmQoY2FyZCkpCisJCXJldHVybjsKKwkJCisJb3V0dygweDgwMDAgfCAoKHBvcnQtPmNoYW5uZWwpIDw8IChjYXJkLT5zaGlmdF9jb3VudCkpIHwgMHgzLCBiYXNlKTsKKwlvdXR3KChsZW5ndGggJiAweGZmKSA8PCA4IHwgMHgwMCwgYmFzZSk7CisJb3V0dygobGVuZ3RoICYgMHhmZjAwKSwgYmFzZSk7CisJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKworCXVubG9ja19jYXJkKGNhcmQpOworfQorCitzdGF0aWMgaW50IGlzaWNvbV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCS8qIGp1c3Qgc2VuZCB0aGUgcG9ydCBzdGF0dXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXMgPSBwb3J0LT5zdGF0dXM7CisKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9pb2N0bCIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlyZXR1cm4gICgoc3RhdHVzICYgSVNJX1JUUykgPyBUSU9DTV9SVFMgOiAwKSB8CisJCSgoc3RhdHVzICYgSVNJX0RUUikgPyBUSU9DTV9EVFIgOiAwKSB8CisJCSgoc3RhdHVzICYgSVNJX0RDRCkgPyBUSU9DTV9DQVIgOiAwKSB8CisJCSgoc3RhdHVzICYgSVNJX0RTUikgPyBUSU9DTV9EU1IgOiAwKSB8CisJCSgoc3RhdHVzICYgSVNJX0NUUykgPyBUSU9DTV9DVFMgOiAwKSB8CisJCSgoc3RhdHVzICYgSVNJX1JJICkgPyBUSU9DTV9SSSAgOiAwKTsKK30KKworc3RhdGljIGludCBpc2ljb21fdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwkKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9pb2N0bCIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlyYWlzZV9ydHMocG9ydCk7CisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJcmFpc2VfZHRyKHBvcnQpOworCisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlkcm9wX3J0cyhwb3J0KTsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWRyb3BfZHRyKHBvcnQpOworCisJcmV0dXJuIDA7Cit9CQkJCisKK3N0YXRpYyBpbnQgaXNpY29tX3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0LAorCQkJCQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKmluZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3aW5mbzsKKwlpbnQgcmVjb25maWdfcG9ydDsKKworCWlmKGNvcHlfZnJvbV91c2VyKCZuZXdpbmZvLCBpbmZvLCBzaXplb2YobmV3aW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkJCisJcmVjb25maWdfcG9ydCA9ICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgIT0gCisJCQkgKG5ld2luZm8uZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpOworCQorCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlpZiAoKG5ld2luZm8uY2xvc2VfZGVsYXkgIT0gcG9ydC0+Y2xvc2VfZGVsYXkpIHx8CisJCSAgICAobmV3aW5mby5jbG9zaW5nX3dhaXQgIT0gcG9ydC0+Y2xvc2luZ193YWl0KSB8fAorCQkgICAgKChuZXdpbmZvLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPSAKKwkJICAgICAocG9ydC0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXBvcnQtPmZsYWdzID0gKChwb3J0LT5mbGFncyAmIH4gQVNZTkNfVVNSX01BU0spIHwKKwkJCQkobmV3aW5mby5mbGFncyAmIEFTWU5DX1VTUl9NQVNLKSk7CisJfQkKKwllbHNlIHsKKwkJcG9ydC0+Y2xvc2VfZGVsYXkgPSBuZXdpbmZvLmNsb3NlX2RlbGF5OworCQlwb3J0LT5jbG9zaW5nX3dhaXQgPSBuZXdpbmZvLmNsb3Npbmdfd2FpdDsgCisJCXBvcnQtPmZsYWdzID0gKChwb3J0LT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfCAKKwkJCQkobmV3aW5mby5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CisJfQorCWlmIChyZWNvbmZpZ19wb3J0KSB7CisJCWlzaWNvbV9jb25maWdfcG9ydChwb3J0KTsKKwl9CisJcmV0dXJuIDA7CQkgCit9CQkKKworc3RhdGljIGludCBpc2ljb21fZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQsIAorCQkJCQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKmluZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgb3V0X2luZm87CisJCisJbWVtc2V0KCZvdXRfaW5mbywgMCwgc2l6ZW9mKG91dF9pbmZvKSk7CisvKglvdXRfaW5mby50eXBlID0gPyAqLworCW91dF9pbmZvLmxpbmUgPSBwb3J0IC0gaXNpX3BvcnRzOworCW91dF9pbmZvLnBvcnQgPSBwb3J0LT5jYXJkLT5iYXNlOworCW91dF9pbmZvLmlycSA9IHBvcnQtPmNhcmQtPmlycTsKKwlvdXRfaW5mby5mbGFncyA9IHBvcnQtPmZsYWdzOworLyoJb3V0X2luZm8uYmF1ZF9iYXNlID0gPyAqLworCW91dF9pbmZvLmNsb3NlX2RlbGF5ID0gcG9ydC0+Y2xvc2VfZGVsYXk7CisJb3V0X2luZm8uY2xvc2luZ193YWl0ID0gcG9ydC0+Y2xvc2luZ193YWl0OworCWlmKGNvcHlfdG9fdXNlcihpbmZvLCAmb3V0X2luZm8sIHNpemVvZihvdXRfaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30JCQkJCQorCitzdGF0aWMgaW50IGlzaWNvbV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpIAoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IHJldHZhbDsKKworCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX2lvY3RsIikpCisJCXJldHVybiAtRU5PREVWOworCisJc3dpdGNoKGNtZCkgeworCQljYXNlIFRDU0JSSzoKKwkJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJCWlmICghYXJnKQorCQkJCWlzaWNvbV9zZW5kX2JyZWFrKHBvcnQsIEhaLzQpOworCQkJcmV0dXJuIDA7CisJCQkKKwkJY2FzZSBUQ1NCUktQOgkKKwkJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJCWlzaWNvbV9zZW5kX2JyZWFrKHBvcnQsIGFyZyA/IGFyZyAqIChIWi8xMCkgOiBIWi80KTsKKwkJCXJldHVybiAwOworCQkJCisJCWNhc2UgVElPQ0dTT0ZUQ0FSOgorCQkJcmV0dXJuIHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJncCk7CisJCQkKKwkJY2FzZSBUSU9DU1NPRlRDQVI6CisJCQlpZihnZXRfdXNlcihhcmcsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9CisJCQkJKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8CisJCQkJKGFyZyA/IENMT0NBTCA6IDApKTsKKwkJCXJldHVybiAwOwkKKwkJCQorCQljYXNlIFRJT0NHU0VSSUFMOgorCQkJcmV0dXJuIGlzaWNvbV9nZXRfc2VyaWFsX2luZm8ocG9ydCwgYXJncCk7CisJCQorCQljYXNlIFRJT0NTU0VSSUFMOgorCQkJcmV0dXJuIGlzaWNvbV9zZXRfc2VyaWFsX2luZm8ocG9ydCwgYXJncCk7CisJCQkJCQorCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsJCQkJCQkKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHNldF90ZXJtaW9zIGV0IGFsbCAqLworc3RhdGljIHZvaWQgaXNpY29tX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZF90ZXJtaW9zKQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fc2V0X3Rlcm1pb3MiKSkKKwkJcmV0dXJuOworCQorCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiYKKwkgICAgdHR5LT50ZXJtaW9zLT5jX2lmbGFnID09IG9sZF90ZXJtaW9zLT5jX2lmbGFnKQorCQlyZXR1cm47CisJCQorCWlzaWNvbV9jb25maWdfcG9ydChwb3J0KTsKKwkKKwlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKKwkgICAgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgewkKKwkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJaXNpY29tX3N0YXJ0KHR0eSk7ICAgCisJfSAgICAKK30KKworLyogdGhyb3R0bGUgZXQgYWxsICovCitzdGF0aWMgdm9pZCBpc2ljb21fdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fdGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCQorCS8qIHRlbGwgdGhlIGNhcmQgdGhhdCB0aGlzIHBvcnQgY2Fubm90IGhhbmRsZSBhbnkgbW9yZSBkYXRhIGZvciBub3cgKi8KKwljYXJkLT5wb3J0X3N0YXR1cyAmPSB+KDEgPDwgcG9ydC0+Y2hhbm5lbCk7CisJb3V0dyhjYXJkLT5wb3J0X3N0YXR1cywgY2FyZC0+YmFzZSArIDB4MDIpOworfQorCisvKiB1bnRocm90dGxlIGV0IGFsbCAqLworc3RhdGljIHZvaWQgaXNpY29tX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fdW50aHJvdHRsZSIpKQorCQlyZXR1cm47CisJCisJLyogdGVsbCB0aGUgY2FyZCB0aGF0IHRoaXMgcG9ydCBpcyByZWFkeSB0byBhY2NlcHQgbW9yZSBkYXRhICovCisJY2FyZC0+cG9ydF9zdGF0dXMgfD0gKDEgPDwgcG9ydC0+Y2hhbm5lbCk7CisJb3V0dyhjYXJkLT5wb3J0X3N0YXR1cywgY2FyZC0+YmFzZSArIDB4MDIpOworfQorCisvKiBzdG9wIGV0IGFsbCAqLworc3RhdGljIHZvaWQgaXNpY29tX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3N0b3AiKSkKKwkJcmV0dXJuOworCQorCS8qIHRoaXMgdGVsbHMgdGhlIHRyYW5zbWl0dGVyIG5vdCB0byBjb25zaWRlciB0aGlzIHBvcnQgZm9yCisJICAgZGF0YSBvdXRwdXQgdG8gdGhlIGNhcmQuICovCisJcG9ydC0+c3RhdHVzICY9IH5JU0lfVFhPSzsKK30KKworLyogc3RhcnQgZXQgYWxsICovCitzdGF0aWMgdm9pZCBpc2ljb21fc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwkKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9zdGFydCIpKQorCQlyZXR1cm47CisJCisJLyogdGhpcyB0ZWxscyB0aGUgdHJhbnNtaXR0ZXIgdG8gY29uc2lkZXIgdGhpcyBwb3J0IGZvcgorCSAgIGRhdGEgb3V0cHV0IHRvIHRoZSBjYXJkLiAqLworCXBvcnQtPnN0YXR1cyB8PSBJU0lfVFhPSzsKK30KKworLyogaGFuZ3VwIGV0IGFsbCAqLworc3RhdGljIHZvaWQgZG9faXNpY29tX2hhbmd1cCh2b2lkICogZGF0YSkKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSBkYXRhOworCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5OworCQorCXR0eSA9IHBvcnQtPnR0eTsKKwlpZiAodHR5KQorCQl0dHlfaGFuZ3VwKHR0eSk7Cit9CisKK3N0YXRpYyB2b2lkIGlzaWNvbV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwkKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9oYW5ndXAiKSkKKwkJcmV0dXJuOworCQorCWlzaWNvbV9zaHV0ZG93bl9wb3J0KHBvcnQpOworCXBvcnQtPmNvdW50ID0gMDsKKwlwb3J0LT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwlwb3J0LT50dHkgPSBOVUxMOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3Blbl93YWl0KTsKK30KKworLyogZmx1c2hfYnVmZmVyIGV0IGFsbCAqLworc3RhdGljIHZvaWQgaXNpY29tX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX2ZsdXNoX2J1ZmZlciIpKQorCQlyZXR1cm47CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCXBvcnQtPnhtaXRfY250ID0gcG9ydC0+eG1pdF9oZWFkID0gcG9ydC0+eG1pdF90YWlsID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJdHR5X3dha2V1cCh0dHkpOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX2lvcmVnaW9uKHZvaWQpCit7CisJaW50IGNvdW50LCBkb25lPTA7CisJZm9yIChjb3VudD0wOyBjb3VudCA8IEJPQVJEX0NPVU5UOyBjb3VudCsrICkgeworCQlpZiAoaXNpX2NhcmRbY291bnRdLmJhc2UpCisJCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlzaV9jYXJkW2NvdW50XS5iYXNlLDE2LElTSUNPTV9OQU1FKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IEkvTyBSZWdpb24gMHgleC0weCV4IGlzIGJ1c3kuIENhcmQlZCB3aWxsIGJlIGRpc2FibGVkLlxuIiwKKwkJCQkJaXNpX2NhcmRbY291bnRdLmJhc2UsaXNpX2NhcmRbY291bnRdLmJhc2UrMTUsY291bnQrMSk7CisJCQkJaXNpX2NhcmRbY291bnRdLmJhc2U9MDsKKwkJCQlkb25lKys7CisJCQl9CisJfQorCXJldHVybiBkb25lOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5yZWdpc3Rlcl9pb3JlZ2lvbih2b2lkKQoreworCWludCBjb3VudDsKKwlmb3IgKGNvdW50PTA7IGNvdW50IDwgQk9BUkRfQ09VTlQ7IGNvdW50KysgKSAKKwkJaWYgKGlzaV9jYXJkW2NvdW50XS5iYXNlKSB7CisJCQlyZWxlYXNlX3JlZ2lvbihpc2lfY2FyZFtjb3VudF0uYmFzZSwxNik7CisjaWZkZWYgSVNJQ09NX0RFQlVHCQkJCisJCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBJL08gUmVnaW9uIDB4JXgtMHgleCByZWxlYXNlZCBmb3IgQ2FyZCVkLlxuIixpc2lfY2FyZFtjb3VudF0uYmFzZSxpc2lfY2FyZFtjb3VudF0uYmFzZSsxNSxjb3VudCsxKTsKKyNlbmRpZgkJCQorCQl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgaXNpY29tX29wcyA9IHsKKwkub3Blbgk9IGlzaWNvbV9vcGVuLAorCS5jbG9zZQk9IGlzaWNvbV9jbG9zZSwKKwkud3JpdGUJPSBpc2ljb21fd3JpdGUsCisJLnB1dF9jaGFyCT0gaXNpY29tX3B1dF9jaGFyLAorCS5mbHVzaF9jaGFycwk9IGlzaWNvbV9mbHVzaF9jaGFycywKKwkud3JpdGVfcm9vbQk9IGlzaWNvbV93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIJPSBpc2ljb21fY2hhcnNfaW5fYnVmZmVyLAorCS5pb2N0bAk9IGlzaWNvbV9pb2N0bCwKKwkuc2V0X3Rlcm1pb3MJPSBpc2ljb21fc2V0X3Rlcm1pb3MsCisJLnRocm90dGxlCT0gaXNpY29tX3Rocm90dGxlLAorCS51bnRocm90dGxlCT0gaXNpY29tX3VudGhyb3R0bGUsCisJLnN0b3AJPSBpc2ljb21fc3RvcCwKKwkuc3RhcnQJPSBpc2ljb21fc3RhcnQsCisJLmhhbmd1cAk9IGlzaWNvbV9oYW5ndXAsCisJLmZsdXNoX2J1ZmZlcgk9IGlzaWNvbV9mbHVzaF9idWZmZXIsCisJLnRpb2NtZ2V0CT0gaXNpY29tX3Rpb2NtZ2V0LAorCS50aW9jbXNldAk9IGlzaWNvbV90aW9jbXNldCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX2RyaXZlcnModm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwkvKiB0dHkgZHJpdmVyIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbiAqLworCWlzaWNvbV9ub3JtYWwgPSBhbGxvY190dHlfZHJpdmVyKFBPUlRfQ09VTlQpOworCWlmICghaXNpY29tX25vcm1hbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpc2ljb21fbm9ybWFsLT5vd25lcgk9IFRISVNfTU9EVUxFOworCWlzaWNvbV9ub3JtYWwtPm5hbWUgCT0gInR0eU0iOworCWlzaWNvbV9ub3JtYWwtPmRldmZzX25hbWUgPSAiaXNpY29tLyI7CisJaXNpY29tX25vcm1hbC0+bWFqb3IJPSBJU0lDT01fTk1BSk9SOworCWlzaWNvbV9ub3JtYWwtPm1pbm9yX3N0YXJ0CT0gMDsKKwlpc2ljb21fbm9ybWFsLT50eXBlCT0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlpc2ljb21fbm9ybWFsLT5zdWJ0eXBlCT0gU0VSSUFMX1RZUEVfTk9STUFMOworCWlzaWNvbV9ub3JtYWwtPmluaXRfdGVybWlvcwk9IHR0eV9zdGRfdGVybWlvczsKKwlpc2ljb21fbm9ybWFsLT5pbml0X3Rlcm1pb3MuY19jZmxhZwk9IAorCQkJCUI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8Q0xPQ0FMOworCWlzaWNvbV9ub3JtYWwtPmZsYWdzCT0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoaXNpY29tX25vcm1hbCwgJmlzaWNvbV9vcHMpOworCQorCWlmICgoZXJyb3I9dHR5X3JlZ2lzdGVyX2RyaXZlcihpc2ljb21fbm9ybWFsKSkhPTApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogQ291bGRuJ3QgcmVnaXN0ZXIgdGhlIGRpYWxpbiBkcml2ZXIsIGVycm9yPSVkXG4iLAorCQkJZXJyb3IpOworCQlwdXRfdHR5X2RyaXZlcihpc2ljb21fbm9ybWFsKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVucmVnaXN0ZXJfZHJpdmVycyh2b2lkKQoreworCWludCBlcnJvciA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihpc2ljb21fbm9ybWFsKTsKKwlpZiAoZXJyb3IpCisJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IGNvdWxkbid0IHVucmVnaXN0ZXIgbm9ybWFsIGRyaXZlciBlcnJvcj0lZC5cbiIsZXJyb3IpOworCXB1dF90dHlfZHJpdmVyKGlzaWNvbV9ub3JtYWwpOworfQorCitzdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl9pc3Iodm9pZCkKK3sKKwlpbnQgY291bnQsIGRvbmU9MDsKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCisJZm9yIChjb3VudD0wOyBjb3VudCA8IEJPQVJEX0NPVU5UOyBjb3VudCsrICkgeworCQlpZiAoaXNpX2NhcmRbY291bnRdLmJhc2UpIHsKKwkJCWlycWZsYWdzID0gKGlzaV9jYXJkW2NvdW50XS5pc2EgPT0gWUVTKSA/IAorCQkJCQlTQV9JTlRFUlJVUFQgOiAKKwkJCQkJKFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRKTsKKworCQkJaWYgKHJlcXVlc3RfaXJxKGlzaV9jYXJkW2NvdW50XS5pcnEsIAorCQkJCQlpc2ljb21faW50ZXJydXB0LCAKKwkJCQkJaXJxZmxhZ3MsIAorCQkJCQlJU0lDT01fTkFNRSwgJmlzaV9jYXJkW2NvdW50XSkpIHsKKworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTogQ291bGQgbm90IgorCQkJCQkiIGluc3RhbGwgaGFuZGxlciBhdCBJcnEgJWQuIgorCQkJCQkiIENhcmQlZCB3aWxsIGJlIGRpc2FibGVkLlxuIiwKKwkJCQkJaXNpX2NhcmRbY291bnRdLmlycSwgY291bnQrMSk7CisKKwkJCQlyZWxlYXNlX3JlZ2lvbihpc2lfY2FyZFtjb3VudF0uYmFzZSwxNik7CisJCQkJaXNpX2NhcmRbY291bnRdLmJhc2U9MDsKKwkJCX0KKwkJCWVsc2UKKwkJCQlkb25lKys7CisJCX0JCisJfQorCXJldHVybiBkb25lOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5yZWdpc3Rlcl9pc3Iodm9pZCkKK3sKKwlpbnQgY291bnQ7CisKKwlmb3IgKGNvdW50PTA7IGNvdW50IDwgQk9BUkRfQ09VTlQ7IGNvdW50KysgKSB7CisJCWlmIChpc2lfY2FyZFtjb3VudF0uYmFzZSkKKwkJCWZyZWVfaXJxKGlzaV9jYXJkW2NvdW50XS5pcnEsICZpc2lfY2FyZFtjb3VudF0pOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgaXNpY29tX2luaXQodm9pZCkKK3sKKwlpbnQgY2FyZCwgY2hhbm5lbCwgYmFzZTsKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0OworCXVuc2lnbmVkIGxvbmcgcGFnZTsKKwkKKwlpZiAoIXRtcF9idWYpIHsgCisJCXBhZ2UgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJICAgICAgCWlmICghcGFnZSkgeworI2lmZGVmIElTSUNPTV9ERUJVRwkgICAgICAJCisJICAgICAgCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBDb3VsZG4ndCBhbGxvY2F0ZSBwYWdlIGZvciB0bXBfYnVmLlxuIik7CisjZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSICJJU0lDT006IE5vdCBlbm91Z2ggbWVtb3J5Li4uXG4iKTsKKyNlbmRpZgkgICAgICAKKwkgICAgICAJCXJldHVybiAwOworCSAgICAgIAl9CQorCSAgICAgIAl0bXBfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKKwl9CisJCisJaWYgKCFyZWdpc3Rlcl9pb3JlZ2lvbigpKSAKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiSVNJQ09NOiBBbGwgcmVxdWlyZWQgSS9PIHNwYWNlIGZvdW5kIGJ1c3kuXG4iKTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXRtcF9idWYpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHJlZ2lzdGVyX2RyaXZlcnMoKSkgCisJeworCQl1bnJlZ2lzdGVyX2lvcmVnaW9uKCk7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0bXBfYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghcmVnaXN0ZXJfaXNyKCkpIAorCXsKKwkJdW5yZWdpc3Rlcl9kcml2ZXJzKCk7CisJCS8qICBpb3BvcnRzIGFscmVhZHkgdXJlZ2lzdGVyZWQgaW4gcmVnaXN0ZXJfaXNyICovCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0bXBfYnVmKTsKKwkJcmV0dXJuIDA7CQkKKwl9CisJCisJbWVtc2V0KGlzaV9wb3J0cywgMCwgc2l6ZW9mKGlzaV9wb3J0cykpOworCWZvciAoY2FyZCA9IDA7IGNhcmQgPCBCT0FSRF9DT1VOVDsgY2FyZCsrKSB7CisJCXBvcnQgPSAmaXNpX3BvcnRzW2NhcmQgKiAxNl07CisJCWlzaV9jYXJkW2NhcmRdLnBvcnRzID0gcG9ydDsKKwkJc3Bpbl9sb2NrX2luaXQoJmlzaV9jYXJkW2NhcmRdLmNhcmRfbG9jayk7CisJCWJhc2UgPSBpc2lfY2FyZFtjYXJkXS5iYXNlOworCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgMTY7IGNoYW5uZWwrKywgcG9ydCsrKSB7CisJCQlwb3J0LT5tYWdpYyA9IElTSUNPTV9NQUdJQzsKKwkJCXBvcnQtPmNhcmQgPSAmaXNpX2NhcmRbY2FyZF07CisJCQlwb3J0LT5jaGFubmVsID0gY2hhbm5lbDsKKwkJIAlwb3J0LT5jbG9zZV9kZWxheSA9IDUwICogSFovMTAwOworCQkgCXBvcnQtPmNsb3Npbmdfd2FpdCA9IDMwMDAgKiBIWi8xMDA7CisJCSAJSU5JVF9XT1JLKCZwb3J0LT5oYW5ndXBfdHEsIGRvX2lzaWNvbV9oYW5ndXAsIHBvcnQpOworCQkgCUlOSVRfV09SSygmcG9ydC0+YmhfdHF1ZXVlLCBpc2ljb21fYm90dG9taGFsZiwgcG9ydCk7CisJCSAJcG9ydC0+c3RhdHVzID0gMDsKKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPm9wZW5fd2FpdCk7CSAJCQkJCisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5jbG9zZV93YWl0KTsKKwkJCS8qICAuIC4gLiAgKi8KKyAJCX0KKwl9IAorCQorCXJldHVybiAxOwkKK30KKworLyoKKyAqCUluc21vZCBjYW4gc2V0IHN0YXRpYyBzeW1ib2xzIHNvIGtlZXAgdGhlc2Ugc3RhdGljCisgKi8KKyAKK3N0YXRpYyBpbnQgaW9bNF07CitzdGF0aWMgaW50IGlycVs0XTsKKworTU9EVUxFX0FVVEhPUigiTXVsdGlUZWNoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIElTSSBzZXJpZXMgb2YgY2FyZHMgYnkgTXVsdGlUZWNoIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIHBvcnRzIGZvciB0aGUgY2FyZHMiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIkludGVycnVwdHMgZm9yIHRoZSBjYXJkcyIpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpc2ljb21fc2V0dXAodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwlpbnQgcmV0dmFsLCBjYXJkLCBpZHgsIGNvdW50OworCXVuc2lnbmVkIGNoYXIgcGNpaXJxOworCXVuc2lnbmVkIGludCBpb2FkZHI7CisJICAgICAgICAgICAgICAgIAorCWNhcmQgPSAwOworCWZvcihpZHg9MDsgaWR4IDwgQk9BUkRfQ09VTlQ7IGlkeCsrKSB7CQorCQlpZiAoaW9baWR4XSkgeworCQkJaXNpX2NhcmRbaWR4XS5iYXNlPWlvW2lkeF07CisJCQlpc2lfY2FyZFtpZHhdLmlycT1pcnFbaWR4XTsKKwkJCWlzaV9jYXJkW2lkeF0uaXNhPVlFUzsKKwkJCWNhcmQrKzsKKwkJfQorCQllbHNlIHsKKwkJCWlzaV9jYXJkW2lkeF0uYmFzZSA9IDA7CisJCQlpc2lfY2FyZFtpZHhdLmlycSA9IDA7CisJCX0KKwl9CisJCisJZm9yIChpZHg9MCA7aWR4IDwgY2FyZDsgaWR4KyspIHsKKwkJaWYgKCEoKGlzaV9jYXJkW2lkeF0uaXJxPT0yKXx8KGlzaV9jYXJkW2lkeF0uaXJxPT0zKXx8CisJCSAgICAoaXNpX2NhcmRbaWR4XS5pcnE9PTQpfHwoaXNpX2NhcmRbaWR4XS5pcnE9PTUpfHwKKwkJICAgIChpc2lfY2FyZFtpZHhdLmlycT09Nyl8fChpc2lfY2FyZFtpZHhdLmlycT09MTApfHwKKwkJICAgIChpc2lfY2FyZFtpZHhdLmlycT09MTEpfHwoaXNpX2NhcmRbaWR4XS5pcnE9PTEyKXx8CisJCSAgICAoaXNpX2NhcmRbaWR4XS5pcnE9PTE1KSkpIHsKKwkJCQorCQkJaWYgKGlzaV9jYXJkW2lkeF0uYmFzZSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSVNJQ09NOiBJcnEgJWQgdW5zdXBwb3J0ZWQuIERpc2FibGluZyBDYXJkJWQuLi5cbiIsCisJCQkJCWlzaV9jYXJkW2lkeF0uaXJxLCBpZHgrMSk7CisJCQkJaXNpX2NhcmRbaWR4XS5iYXNlPTA7CisJCQkJY2FyZC0tOworCQkJfQkKKwkJfQorCX0JCisJCisJaWYgKGNhcmQgPCBCT0FSRF9DT1VOVCkgeworCQlmb3IgKGlkeD0wOyBpZHggPCBERVZJRF9DT1VOVDsgaWR4KyspIHsKKwkJCWRldiA9IE5VTEw7CisJCQlmb3IgKDs7KXsKKwkJCQlpZiAoIShkZXYgPSBwY2lfZmluZF9kZXZpY2UoVkVORE9SX0lELCBpc2ljb21fcGNpX3RibFtpZHhdLmRldmljZSwgZGV2KSkpCisJCQkJCWJyZWFrOworCQkJCWlmIChjYXJkID49IEJPQVJEX0NPVU5UKQorCQkJCQlicmVhazsKKwkJCQkJCisJCQkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpCisJCQkJCWJyZWFrOworCisJCQkJLyogZm91bmQgYSBQQ0kgSVNJIGNhcmQhICovCisJCQkJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChkZXYsIDMpOyAvKiBpLmUgYXQgb2Zmc2V0IDB4MWMgaW4gdGhlCisJCQkJCQkJCSAgICAgICAqIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisJCQkJCQkJCSAgICAgICAqIHNwYWNlLgorCQkJCQkJCQkgICAgICAgKi8KKwkJCQlwY2lpcnEgPSBkZXYtPmlycTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJJU0kgUENJIENhcmQoRGV2aWNlIElEIDB4JXgpXG4iLCBpc2ljb21fcGNpX3RibFtpZHhdLmRldmljZSk7CisJCQkJLyoKKwkJCQkgKiBhbGxvdCB0aGUgZmlyc3QgZW1wdHkgc2xvdCBpbiB0aGUgYXJyYXkKKwkJCQkgKi8JCQkJCisJCQkJZm9yIChjb3VudD0wOyBjb3VudCA8IEJPQVJEX0NPVU5UOyBjb3VudCsrKSB7CQkJCQorCQkJCQlpZiAoaXNpX2NhcmRbY291bnRdLmJhc2UgPT0gMCkgeworCQkJCQkJaXNpX2NhcmRbY291bnRdLmJhc2UgPSBpb2FkZHI7CisJCQkJCQlpc2lfY2FyZFtjb3VudF0uaXJxID0gcGNpaXJxOworCQkJCQkJaXNpX2NhcmRbY291bnRdLmlzYSA9IE5POworCQkJCQkJY2FyZCsrOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CQkJCQorCQkJaWYgKGNhcmQgPj0gQk9BUkRfQ09VTlQpIGJyZWFrOworCQl9CisJfQorCQorCWlmICghKGlzaV9jYXJkWzBdLmJhc2UgfHwgaXNpX2NhcmRbMV0uYmFzZSB8fCBpc2lfY2FyZFsyXS5iYXNlIHx8IGlzaV9jYXJkWzNdLmJhc2UpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSVNJQ09NOiBObyB2YWxpZCBjYXJkIGNvbmZpZ3VyYXRpb24uIERyaXZlciBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuLi5cbiIpOyAKKwkJcmV0dXJuIC1FSU87CisJfQkKKworCXJldHZhbCA9IG1pc2NfcmVnaXN0ZXIoJmlzaWxvYWRlcl9kZXZpY2UpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSVNJQ09NOiBVbmFibGUgdG8gcmVnaXN0ZXIgZmlybXdhcmUgbG9hZGVyIGRyaXZlci5cbiIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwkKKwlpZiAoIWlzaWNvbV9pbml0KCkpIHsKKwkJaWYgKG1pc2NfZGVyZWdpc3RlcigmaXNpbG9hZGVyX2RldmljZSkpIAorCQkJcHJpbnRrKEtFUk5fRVJSICJJU0lDT006IFVuYWJsZSB0byB1bnJlZ2lzdGVyIEZpcm13YXJlIExvYWRlciBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJCisJaW5pdF90aW1lcigmdHgpOworCXR4LmV4cGlyZXMgPSBqaWZmaWVzICsgMTsKKwl0eC5kYXRhID0gMDsKKwl0eC5mdW5jdGlvbiA9IGlzaWNvbV90eDsKKwlyZV9zY2hlZHVsZSA9IDE7CisJYWRkX3RpbWVyKCZ0eCk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpc2ljb21fZXhpdCh2b2lkKQoreworCXJlX3NjaGVkdWxlID0gMDsKKwkvKiBGSVhNRSAqLworCW1zbGVlcCgxMDAwKTsKKwl1bnJlZ2lzdGVyX2lzcigpOworCXVucmVnaXN0ZXJfZHJpdmVycygpOworCXVucmVnaXN0ZXJfaW9yZWdpb24oKTsJCisJaWYodG1wX2J1ZikKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXRtcF9idWYpOworCWlmIChtaXNjX2RlcmVnaXN0ZXIoJmlzaWxvYWRlcl9kZXZpY2UpKQorCQlwcmludGsoS0VSTl9FUlIgIklTSUNPTTogVW5hYmxlIHRvIHVucmVnaXN0ZXIgRmlybXdhcmUgTG9hZGVyIGRyaXZlclxuIik7Cit9CisKK21vZHVsZV9pbml0KGlzaWNvbV9zZXR1cCk7Cittb2R1bGVfZXhpdChpc2ljb21fZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhZWQwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYwpAQCAtMCwwICsxLDUyNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCWlzdGFsbGlvbi5jICAtLSBzdGFsbGlvbiBpbnRlbGxpZ2VudCBtdWx0aXBvcnQgc2VyaWFsIGRyaXZlci4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSAgU3RhbGxpb24gVGVjaG5vbG9naWVzCisgKglDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiAgR3JlZyBVbmdlcmVyLgorICoKKyAqCVRoaXMgY29kZSBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZSBMaW51eCBzZXJpYWwgZHJpdmVyLCB3cml0dGVuIGJ5CisgKglMaW51cyBUb3J2YWxkcywgVGhlb2RvcmUgVCdzbyBhbmQgb3RoZXJzLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nkay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXN0YXRzLmg+CisjaW5jbHVkZSA8bGludXgvaXN0YWxsaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIENPTkZJR19QQ0kKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEZWZpbmUgZGlmZmVyZW50IGJvYXJkIHR5cGVzLiBOb3QgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYm9hcmQgdHlwZXMKKyAqCWFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuIEJ1dCBJIHdpbGwgdXNlIHRoZSBzdGFuZGFyZCAiYXNzaWduZWQiCisgKglib2FyZCBudW1iZXJzLiBDdXJyZW50bHkgc3VwcG9ydGVkIGJvYXJkcyBhcmUgYWJicmV2aWF0ZWQgYXM6CisgKglFQ1AgPSBFYXN5Q29ubmVjdGlvbiA4LzY0LCBPTkIgPSBPTmJvYXJkLCBCQlkgPSBCcnVtYnkgYW5kCisgKglTVEFMID0gU3RhbGxpb24uCisgKi8KKyNkZWZpbmUJQlJEX1VOS05PV04JMAorI2RlZmluZQlCUkRfU1RBTExJT04JMQorI2RlZmluZQlCUkRfQlJVTUJZNAkyCisjZGVmaW5lCUJSRF9PTkJPQVJEMgkzCisjZGVmaW5lCUJSRF9PTkJPQVJECTQKKyNkZWZpbmUJQlJEX0JSVU1CWTgJNQorI2RlZmluZQlCUkRfQlJVTUJZMTYJNgorI2RlZmluZQlCUkRfT05CT0FSREUJNworI2RlZmluZQlCUkRfT05CT0FSRDMyCTkKKyNkZWZpbmUJQlJEX09OQk9BUkQyXzMyCTEwCisjZGVmaW5lCUJSRF9PTkJPQVJEUlMJMTEKKyNkZWZpbmUJQlJEX0VBU1lJTwkyMAorI2RlZmluZQlCUkRfRUNICQkyMQorI2RlZmluZQlCUkRfRUNITUMJMjIKKyNkZWZpbmUJQlJEX0VDUAkJMjMKKyNkZWZpbmUgQlJEX0VDUEUJMjQKKyNkZWZpbmUJQlJEX0VDUE1DCTI1CisjZGVmaW5lCUJSRF9FQ0hQQ0kJMjYKKyNkZWZpbmUJQlJEX0VDSDY0UENJCTI3CisjZGVmaW5lCUJSRF9FQVNZSU9QQ0kJMjgKKyNkZWZpbmUJQlJEX0VDUFBDSQkyOQorCisjZGVmaW5lCUJSRF9CUlVNQlkJQlJEX0JSVU1CWTQKKworLyoKKyAqCURlZmluZSBhIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIHRvIGhvbGQgdGhlIGJvYXJkIGNvbmZpZ3VyYXRpb24uCisgKglOZWVkIHRvIHNldCB0aGlzIHVwIGluIHRoZSBjb2RlIChmb3Igbm93KSB3aXRoIHRoZSBib2FyZHMgdGhhdCBhcmUKKyAqCXRvIGJlIGNvbmZpZ3VyZWQgaW50byB0aGUgc3lzdGVtLiBUaGlzIGlzIHdoYXQgbmVlZHMgdG8gYmUgbW9kaWZpZWQKKyAqCXdoZW4gYWRkaW5nL3JlbW92aW5nL21vZGlmeWluZyBib2FyZHMuIEVhY2ggbGluZSBlbnRyeSBpbiB0aGUKKyAqCXN0bGlfYnJkY29uZltdIGFycmF5IGlzIGEgYm9hcmQuIEVhY2ggbGluZSBjb250YWlucyBpby9pcnEvbWVtb3J5CisgKglyYW5nZXMgZm9yIHRoYXQgYm9hcmQgKGFzIHdlbGwgYXMgd2hhdCB0eXBlIG9mIGJvYXJkIGl0IGlzKS4KKyAqCVNvbWUgZXhhbXBsZXM6CisgKgkJeyBCUkRfRUNQLCAweDJhMCwgMCwgMHhjYzAwMCwgMCwgMCB9LAorICoJVGhpcyBsaW5lIHdpbGwgY29uZmlndXJlIGFuIEVhc3lDb25uZWN0aW9uIDgvNjQgYXQgaW8gYWRkcmVzcyAyYTAsCisgKglhbmQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzIG9mIGNjMDAwLiBNdWx0aXBsZSBFYXN5Q29ubmVjdGlvbiA4LzY0CisgKglib2FyZHMgY2FuIHNoYXJlIHRoZSBzYW1lIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBzcGFjZS4gTm8gaW50ZXJydXB0CisgKglpcyByZXF1aXJlZCBmb3IgdGhpcyBib2FyZCB0eXBlLgorICoJQW5vdGhlciBleGFtcGxlOgorICoJCXsgQlJEX0VDUEUsIDB4NTAwMCwgMCwgMHg4MDAwMDAwMCwgMCwgMCB9LAorICoJVGhpcyBsaW5lIHdpbGwgY29uZmlndXJlIGFuIEVhc3lDb25uZWN0aW9uIDgvNjQgRUlTQSBpbiBzbG90IDUgYW5kCisgKglzaGFyZWQgbWVtb3J5IGFkZHJlc3Mgb2YgMHg4MDAwMDAwMCAoMiBHQnl0ZSkuIE11bHRpcGxlCisgKglFYXN5Q29ubmVjdGlvbiA4LzY0IEVJU0EgYm9hcmRzIGNhbiBzaGFyZSB0aGUgc2FtZSBzaGFyZWQgbWVtb3J5CisgKglhZGRyZXNzIHNwYWNlLiBObyBpbnRlcnJ1cHQgaXMgcmVxdWlyZWQgZm9yIHRoaXMgYm9hcmQgdHlwZS4KKyAqCUFub3RoZXIgZXhhbXBsZToKKyAqCQl7IEJSRF9PTkJPQVJELCAweDI0MCwgMCwgMHhkMDAwMCwgMCwgMCB9LAorICoJVGhpcyBsaW5lIHdpbGwgY29uZmlndXJlIGFuIE9OYm9hcmQgKElTQSB0eXBlKSBhdCBpbyBhZGRyZXNzIDI0MCwKKyAqCWFuZCBzaGFyZWQgbWVtb3J5IGFkZHJlc3Mgb2YgZDAwMDAuIE11bHRpcGxlIE9OYm9hcmRzIGNhbiBzaGFyZQorICoJdGhlIHNhbWUgc2hhcmVkIG1lbW9yeSBhZGRyZXNzIHNwYWNlLiBObyBpbnRlcnJ1cHQgcmVxdWlyZWQuCisgKglBbm90aGVyIGV4YW1wbGU6CisgKgkJeyBCUkRfQlJVTUJZNCwgMHgzNjAsIDAsIDB4YzgwMDAsIDAsIDAgfSwKKyAqCVRoaXMgbGluZSB3aWxsIGNvbmZpZ3VyZSBhIEJydW1ieSBib2FyZCAoYW55IG51bWJlciBvZiBwb3J0cyEpIGF0CisgKglpbyBhZGRyZXNzIDM2MCBhbmQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzIG9mIGM4MDAwLiBBbGwgQnJ1bWJ5IGJvYXJkcworICoJY29uZmlndXJlZCBpbnRvIGEgc3lzdGVtIG11c3QgaGF2ZSB0aGVpciBvd24gc2VwYXJhdGUgaW8gYW5kIG1lbW9yeQorICoJYWRkcmVzc2VzLiBObyBpbnRlcnJ1cHQgaXMgcmVxdWlyZWQuCisgKglBbm90aGVyIGV4YW1wbGU6CisgKgkJeyBCUkRfU1RBTExJT04sIDB4MzMwLCAwLCAweGQwMDAwLCAwLCAwIH0sCisgKglUaGlzIGxpbmUgd2lsbCBjb25maWd1cmUgYW4gb3JpZ2luYWwgU3RhbGxpb24gYm9hcmQgYXQgaW8gYWRkcmVzcyAzMzAKKyAqCWFuZCBzaGFyZWQgbWVtb3J5IGFkZHJlc3MgZDAwMDAgKHRoaXMgd291bGQgb25seSBiZSB2YWxpZCBmb3IgYSAiVjQuMCIKKyAqCW9yIFJldi5PIFN0YWxsaW9uIGJvYXJkKS4gQWxsIFN0YWxsaW9uIGJvYXJkcyBjb25maWd1cmVkIGludG8gdGhlCisgKglzeXN0ZW0gbXVzdCBoYXZlIHRoZWlyIG93biBzZXBhcmF0ZSBpbyBhbmQgbWVtb3J5IGFkZHJlc3Nlcy4gTm8KKyAqCWludGVycnVwdCBpcyByZXF1aXJlZC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CQlicmR0eXBlOworCWludAkJaW9hZGRyMTsKKwlpbnQJCWlvYWRkcjI7CisJdW5zaWduZWQgbG9uZwltZW1hZGRyOworCWludAkJaXJxOworCWludAkJaXJxdHlwZTsKK30gc3RsY29uZl90OworCitzdGF0aWMgc3RsY29uZl90CXN0bGlfYnJkY29uZltdID0geworCS8qeyBCUkRfRUNQLCAweDJhMCwgMCwgMHhjYzAwMCwgMCwgMCB9LCovCit9OworCitzdGF0aWMgaW50CXN0bGlfbnJicmRzID0gc2l6ZW9mKHN0bGlfYnJkY29uZikgLyBzaXplb2Yoc3RsY29uZl90KTsKKworLyoKKyAqCVRoZXJlIGlzIHNvbWUgZXhwZXJpbWVudGFsIEVJU0EgYm9hcmQgZGV0ZWN0aW9uIGNvZGUgaW4gdGhpcyBkcml2ZXIuCisgKglCeSBkZWZhdWx0IGl0IGlzIGRpc2FibGVkLCBidXQgZm9yIHRob3NlIHRoYXQgd2FudCB0byB0cnkgaXQgb3V0LAorICoJdGhlbiBzZXQgdGhlIGRlZmluZSBiZWxvdyB0byBiZSAxLgorICovCisjZGVmaW5lCVNUTElfRUlTQVBST0JFCTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGVmaW5lIHNvbWUgaW1wb3J0YW50IGRyaXZlciBjaGFyYWN0ZXJpc3RpY3MuIERldmljZSBtYWpvciBudW1iZXJzCisgKglhbGxvY2F0ZWQgYXMgcGVyIExpbnV4IERldmljZSBSZWdpc3RyeS4KKyAqLworI2lmbmRlZglTVExfU0lPTUVNTUFKT1IKKyNkZWZpbmUJU1RMX1NJT01FTU1BSk9SCQkyOAorI2VuZGlmCisjaWZuZGVmCVNUTF9TRVJJQUxNQUpPUgorI2RlZmluZQlTVExfU0VSSUFMTUFKT1IJCTI0CisjZW5kaWYKKyNpZm5kZWYJU1RMX0NBTExPVVRNQUpPUgorI2RlZmluZQlTVExfQ0FMTE9VVE1BSk9SCTI1CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGVmaW5lIG91ciBsb2NhbCBkcml2ZXIgaWRlbnRpdHkgZmlyc3QuIFNldCB1cCBzdHVmZiB0byBkZWFsIHdpdGgKKyAqCWFsbCB0aGUgbG9jYWwgc3RydWN0dXJlcyByZXF1aXJlZCBieSBhIHNlcmlhbCB0dHkgZHJpdmVyLgorICovCitzdGF0aWMgY2hhcgkqc3RsaV9kcnZ0aXRsZSA9ICJTdGFsbGlvbiBJbnRlbGxpZ2VudCBNdWx0aXBvcnQgU2VyaWFsIERyaXZlciI7CitzdGF0aWMgY2hhcgkqc3RsaV9kcnZuYW1lID0gImlzdGFsbGlvbiI7CitzdGF0aWMgY2hhcgkqc3RsaV9kcnZ2ZXJzaW9uID0gIjUuNi4wIjsKK3N0YXRpYyBjaGFyCSpzdGxpX3NlcmlhbG5hbWUgPSAidHR5RSI7CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlcgkqc3RsaV9zZXJpYWw7CisKKy8qCisgKglXZSB3aWxsIG5lZWQgdG8gYWxsb2NhdGUgYSB0ZW1wb3Jhcnkgd3JpdGUgYnVmZmVyIGZvciBjaGFycyB0aGF0CisgKgljb21lIGRpcmVjdCBmcm9tIHVzZXIgc3BhY2UuIFRoZSBwcm9ibGVtIGlzIHRoYXQgYSBjb3B5IGZyb20gdXNlcgorICoJc3BhY2UgbWlnaHQgY2F1c2UgYSBwYWdlIGZhdWx0ICh0eXBpY2FsbHkgb24gYSBzeXN0ZW0gdGhhdCBpcworICoJc3dhcHBpbmchKS4gQWxsIHBvcnRzIHdpbGwgc2hhcmUgb25lIGJ1ZmZlciAtIHNpbmNlIGlmIHRoZSBzeXN0ZW0KKyAqCWlzIGFscmVhZHkgc3dhcHBpbmcgYSBzaGFyZWQgYnVmZmVyIHdvbid0IG1ha2UgdGhpbmdzIGFueSB3b3JzZS4KKyAqLworc3RhdGljIGNoYXIJCQkqc3RsaV90bXB3cml0ZWJ1ZjsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHN0bGlfdG1wd3JpdGVzZW0pOworCisjZGVmaW5lCVNUTElfVFhCVUZTSVpFCQk0MDk2CisKKy8qCisgKglVc2UgYSBmYXN0IGxvY2FsIGJ1ZmZlciBmb3IgY29va2VkIGNoYXJhY3RlcnMuIFR5cGljYWxseSBhIHdob2xlCisgKglidW5jaCBvZiBjb29rZWQgY2hhcmFjdGVycyBjb21lIGluIGZvciBhIHBvcnQsIDEgYXQgYSB0aW1lLiBTbyB3ZQorICoJc2F2ZSB0aG9zZSB1cCBpbnRvIGEgbG9jYWwgYnVmZmVyLCB0aGVuIHdyaXRlIG91dCB0aGUgd2hvbGUgbG90CisgKgl3aXRoIGEgbGFyZ2UgbWVtY3B5LiBKdXN0IHVzZSAxIGJ1ZmZlciBmb3IgYWxsIHBvcnRzLCBzaW5jZSBpdHMKKyAqCXVzZSBpdCBpcyBvbmx5IG5lZWQgZm9yIHNob3J0IHBlcmlvZHMgb2YgdGltZSBieSBlYWNoIHBvcnQuCisgKi8KK3N0YXRpYyBjaGFyCQkJKnN0bGlfdHhjb29rYnVmOworc3RhdGljIGludAkJCXN0bGlfdHhjb29rc2l6ZTsKK3N0YXRpYyBpbnQJCQlzdGxpX3R4Y29va3JlYWxzaXplOworc3RhdGljIHN0cnVjdCB0dHlfc3RydWN0CSpzdGxpX3R4Y29va3R0eTsKKworLyoKKyAqCURlZmluZSBhIGxvY2FsIGRlZmF1bHQgdGVybWlvcyBzdHJ1Y3QuIEFsbCBwb3J0cyB3aWxsIGJlIGNyZWF0ZWQKKyAqCXdpdGggdGhpcyB0ZXJtaW9zIGluaXRpYWxseS4gQmFzaWNhbGx5IGFsbCBpdCBkZWZpbmVzIGlzIGEgcmF3IHBvcnQKKyAqCWF0IDk2MDAgYmF1ZCwgOCBkYXRhIGJpdHMsIG5vIHBhcml0eSwgMSBzdG9wIGJpdC4KKyAqLworc3RhdGljIHN0cnVjdCB0ZXJtaW9zCQlzdGxpX2RlZnRlcm1pb3MgPSB7CisJLmNfY2ZsYWcJPSAoQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMKSwKKwkuY19jYwkJPSBJTklUX0NfQ0MsCit9OworCisvKgorICoJRGVmaW5lIGdsb2JhbCBzdGF0cyBzdHJ1Y3R1cmVzLiBOb3QgdXNlZCBvZnRlbiwgYW5kIGNhbiBiZQorICoJcmUtdXNlZCBmb3IgZWFjaCBzdGF0cyBjYWxsLgorICovCitzdGF0aWMgY29tc3RhdHNfdAlzdGxpX2NvbXN0YXRzOworc3RhdGljIGNvbWJyZF90CQlzdGxpX2JyZHN0YXRzOworc3RhdGljIGFzeXN0YXRzX3QJc3RsaV9jZGtzdGF0czsKK3N0YXRpYyBzdGxpYnJkX3QJc3RsaV9kdW1teWJyZDsKK3N0YXRpYyBzdGxpcG9ydF90CXN0bGlfZHVtbXlwb3J0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdGxpYnJkX3QJKnN0bGlfYnJkc1tTVExfTUFYQlJEU107CisKK3N0YXRpYyBpbnQJCXN0bGlfc2hhcmVkOworCisvKgorICoJUGVyIGJvYXJkIHN0YXRlIGZsYWdzLiBVc2VkIHdpdGggdGhlIHN0YXRlIGZpZWxkIG9mIHRoZSBib2FyZCBzdHJ1Y3QuCisgKglOb3QgcmVhbGx5IG11Y2ggaGVyZS4uLiBBbGwgd2UgbmVlZCB0byBkbyBpcyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIKKyAqCXRoZSBib2FyZCBoYXMgYmVlbiBkZXRlY3RlZCwgYW5kIHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkgcnVubmluZyBhIHNsYXZlCisgKglvciBub3QuCisgKi8KKyNkZWZpbmUJQlNUX0ZPVU5ECTB4MQorI2RlZmluZQlCU1RfU1RBUlRFRAkweDIKKworLyoKKyAqCURlZmluZSB0aGUgc2V0IG9mIHBvcnQgc3RhdGUgZmxhZ3MuIFRoZXNlIGFyZSBtYXJrZWQgZm9yIGludGVybmFsCisgKglzdGF0ZSBwdXJwb3NlcyBvbmx5LCB1c3VhbGx5IHRvIGRvIHdpdGggdGhlIHN0YXRlIG9mIGNvbW11bmljYXRpb25zCisgKgl3aXRoIHRoZSBzbGF2ZS4gTW9zdCBvZiB0aGVtIG5lZWQgdG8gYmUgdXBkYXRlZCBhdG9taWNhbGx5LCBzbyBhbHdheXMKKyAqCXVzZSB0aGUgYml0IHNldHRpbmcgb3BlcmF0aW9ucyAodW5sZXNzIHByb3RlY3RlZCBieSBjbGkvc3RpKS4KKyAqLworI2RlZmluZQlTVF9JTklUSUFMSVpJTkcJMQorI2RlZmluZQlTVF9PUEVOSU5HCTIKKyNkZWZpbmUJU1RfQ0xPU0lORwkzCisjZGVmaW5lCVNUX0NNRElORwk0CisjZGVmaW5lCVNUX1RYQlVTWQk1CisjZGVmaW5lCVNUX1JYSU5HCTYKKyNkZWZpbmUJU1RfRE9GTFVTSFJYCTcKKyNkZWZpbmUJU1RfRE9GTFVTSFRYCTgKKyNkZWZpbmUJU1RfRE9TSUdTCTkKKyNkZWZpbmUJU1RfUlhTVE9QCTEwCisjZGVmaW5lCVNUX0dFVFNJR1MJMTEKKworLyoKKyAqCURlZmluZSBhbiBhcnJheSBvZiBib2FyZCBuYW1lcyBhcyBwcmludGFibGUgc3RyaW5ncy4gSGFuZHkgZm9yCisgKglyZWZlcmVuY2luZyBib2FyZHMgd2hlbiBwcmludGluZyB0cmFjZSBhbmQgc3R1ZmYuCisgKi8KK3N0YXRpYyBjaGFyCSpzdGxpX2JyZG5hbWVzW10gPSB7CisJIlVua25vd24iLAorCSJTdGFsbGlvbiIsCisJIkJydW1ieSIsCisJIk9OYm9hcmQtTUMiLAorCSJPTmJvYXJkIiwKKwkiQnJ1bWJ5IiwKKwkiQnJ1bWJ5IiwKKwkiT05ib2FyZC1FSSIsCisJKGNoYXIgKikgTlVMTCwKKwkiT05ib2FyZCIsCisJIk9OYm9hcmQtTUMiLAorCSJPTmJvYXJkLU1DIiwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJIkVhc3lJTyIsCisJIkVDOC8zMi1BVCIsCisJIkVDOC8zMi1NQyIsCisJIkVDOC82NC1BVCIsCisJIkVDOC82NC1FSSIsCisJIkVDOC82NC1NQyIsCisJIkVDOC8zMi1QQ0kiLAorCSJFQzgvNjQtUENJIiwKKwkiRWFzeUlPLVBDSSIsCisJIkVDL1JBLVBDSSIsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBNT0RVTEUKKy8qCisgKglEZWZpbmUgc29tZSBzdHJpbmcgbGFiZWxzIGZvciBhcmd1bWVudHMgcGFzc2VkIGZyb20gdGhlIG1vZHVsZQorICoJbG9hZCBsaW5lLiBUaGVzZSBhbGxvdyBmb3IgZWFzeSBib2FyZCBkZWZpbml0aW9ucywgYW5kIGVhc3kKKyAqCW1vZGlmaWNhdGlvbiBvZiB0aGUgaW8sIG1lbW9yeSBhbmQgaXJxIHJlc291Y3Jlcy4KKyAqLworCitzdGF0aWMgY2hhcgkqYm9hcmQwWzhdOworc3RhdGljIGNoYXIJKmJvYXJkMVs4XTsKK3N0YXRpYyBjaGFyCSpib2FyZDJbOF07CitzdGF0aWMgY2hhcgkqYm9hcmQzWzhdOworCitzdGF0aWMgY2hhcgkqKnN0bGlfYnJkc3BbXSA9IHsKKwkoY2hhciAqKikgJmJvYXJkMCwKKwkoY2hhciAqKikgJmJvYXJkMSwKKwkoY2hhciAqKikgJmJvYXJkMiwKKwkoY2hhciAqKikgJmJvYXJkMworfTsKKworLyoKKyAqCURlZmluZSBhIHNldCBvZiBjb21tb24gYm9hcmQgbmFtZXMsIGFuZCB0eXBlcy4gVGhpcyBpcyB1c2VkIHRvCisgKglwYXJzZSBhbnkgbW9kdWxlIGFyZ3VtZW50cy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBzdGxpYnJkdHlwZSB7CisJY2hhcgkqbmFtZTsKKwlpbnQJdHlwZTsKK30gc3RsaWJyZHR5cGVfdDsKKworc3RhdGljIHN0bGlicmR0eXBlX3QJc3RsaV9icmRzdHJbXSA9IHsKKwl7ICJzdGFsbGlvbiIsIEJSRF9TVEFMTElPTiB9LAorCXsgIjEiLCBCUkRfU1RBTExJT04gfSwKKwl7ICJicnVtYnkiLCBCUkRfQlJVTUJZIH0sCisJeyAiYnJ1bWJ5NCIsIEJSRF9CUlVNQlkgfSwKKwl7ICJicnVtYnkvNCIsIEJSRF9CUlVNQlkgfSwKKwl7ICJicnVtYnktNCIsIEJSRF9CUlVNQlkgfSwKKwl7ICJicnVtYnk4IiwgQlJEX0JSVU1CWSB9LAorCXsgImJydW1ieS84IiwgQlJEX0JSVU1CWSB9LAorCXsgImJydW1ieS04IiwgQlJEX0JSVU1CWSB9LAorCXsgImJydW1ieTE2IiwgQlJEX0JSVU1CWSB9LAorCXsgImJydW1ieS8xNiIsIEJSRF9CUlVNQlkgfSwKKwl7ICJicnVtYnktMTYiLCBCUkRfQlJVTUJZIH0sCisJeyAiMiIsIEJSRF9CUlVNQlkgfSwKKwl7ICJvbmJvYXJkMiIsIEJSRF9PTkJPQVJEMiB9LAorCXsgIm9uYm9hcmQtMiIsIEJSRF9PTkJPQVJEMiB9LAorCXsgIm9uYm9hcmQvMiIsIEJSRF9PTkJPQVJEMiB9LAorCXsgIm9uYm9hcmQtbWMiLCBCUkRfT05CT0FSRDIgfSwKKwl7ICJvbmJvYXJkL21jIiwgQlJEX09OQk9BUkQyIH0sCisJeyAib25ib2FyZC1tY2EiLCBCUkRfT05CT0FSRDIgfSwKKwl7ICJvbmJvYXJkL21jYSIsIEJSRF9PTkJPQVJEMiB9LAorCXsgIjMiLCBCUkRfT05CT0FSRDIgfSwKKwl7ICJvbmJvYXJkIiwgQlJEX09OQk9BUkQgfSwKKwl7ICJvbmJvYXJkYXQiLCBCUkRfT05CT0FSRCB9LAorCXsgIjQiLCBCUkRfT05CT0FSRCB9LAorCXsgIm9uYm9hcmRlIiwgQlJEX09OQk9BUkRFIH0sCisJeyAib25ib2FyZC1lIiwgQlJEX09OQk9BUkRFIH0sCisJeyAib25ib2FyZC9lIiwgQlJEX09OQk9BUkRFIH0sCisJeyAib25ib2FyZC1laSIsIEJSRF9PTkJPQVJERSB9LAorCXsgIm9uYm9hcmQvZWkiLCBCUkRfT05CT0FSREUgfSwKKwl7ICI3IiwgQlJEX09OQk9BUkRFIH0sCisJeyAiZWNwIiwgQlJEX0VDUCB9LAorCXsgImVjcGF0IiwgQlJEX0VDUCB9LAorCXsgImVjOC82NCIsIEJSRF9FQ1AgfSwKKwl7ICJlYzgvNjQtYXQiLCBCUkRfRUNQIH0sCisJeyAiZWM4LzY0LWlzYSIsIEJSRF9FQ1AgfSwKKwl7ICIyMyIsIEJSRF9FQ1AgfSwKKwl7ICJlY3BlIiwgQlJEX0VDUEUgfSwKKwl7ICJlY3BlaSIsIEJSRF9FQ1BFIH0sCisJeyAiZWM4LzY0LWUiLCBCUkRfRUNQRSB9LAorCXsgImVjOC82NC1laSIsIEJSRF9FQ1BFIH0sCisJeyAiMjQiLCBCUkRfRUNQRSB9LAorCXsgImVjcG1jIiwgQlJEX0VDUE1DIH0sCisJeyAiZWM4LzY0LW1jIiwgQlJEX0VDUE1DIH0sCisJeyAiZWM4LzY0LW1jYSIsIEJSRF9FQ1BNQyB9LAorCXsgIjI1IiwgQlJEX0VDUE1DIH0sCisJeyAiZWNwcGNpIiwgQlJEX0VDUFBDSSB9LAorCXsgImVjL3JhIiwgQlJEX0VDUFBDSSB9LAorCXsgImVjL3JhLXBjIiwgQlJEX0VDUFBDSSB9LAorCXsgImVjL3JhLXBjaSIsIEJSRF9FQ1BQQ0kgfSwKKwl7ICIyOSIsIEJSRF9FQ1BQQ0kgfSwKK307CisKKy8qCisgKglEZWZpbmUgdGhlIG1vZHVsZSBhZ3J1bWVudHMuCisgKi8KK01PRFVMRV9BVVRIT1IoIkdyZWcgVW5nZXJlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdGFsbGlvbiBJbnRlbGxpZ2VudCBNdWx0aXBvcnQgU2VyaWFsIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK01PRFVMRV9QQVJNKGJvYXJkMCwgIjEtM3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoYm9hcmQwLCAiQm9hcmQgMCBjb25maWcgLT4gbmFtZVssaW9hZGRyWyxtZW1hZGRyXSIpOworTU9EVUxFX1BBUk0oYm9hcmQxLCAiMS0zcyIpOworTU9EVUxFX1BBUk1fREVTQyhib2FyZDEsICJCb2FyZCAxIGNvbmZpZyAtPiBuYW1lWyxpb2FkZHJbLG1lbWFkZHJdIik7CitNT0RVTEVfUEFSTShib2FyZDIsICIxLTNzIik7CitNT0RVTEVfUEFSTV9ERVNDKGJvYXJkMiwgIkJvYXJkIDIgY29uZmlnIC0+IG5hbWVbLGlvYWRkclssbWVtYWRkcl0iKTsKK01PRFVMRV9QQVJNKGJvYXJkMywgIjEtM3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoYm9hcmQzLCAiQm9hcmQgMyBjb25maWcgLT4gbmFtZVssaW9hZGRyWyxtZW1hZGRyXSIpOworCisjZW5kaWYKKworLyoKKyAqCVNldCB1cCBhIGRlZmF1bHQgbWVtb3J5IGFkZHJlc3MgdGFibGUgZm9yIEVJU0EgYm9hcmQgcHJvYmluZy4KKyAqCVRoZSBkZWZhdWx0IGFkZHJlc3NlcyBhcmUgYWxsIGJlbGxvdyAxTWJ5dGUsIHdoaWNoIGhhcyB0byBiZSB0aGUKKyAqCWNhc2UgYW55d2F5LiBUaGV5IHNob3VsZCBiZSBzYWZlLCBzaW5jZSB3ZSBvbmx5IHJlYWQgdmFsdWVzIGZyb20KKyAqCXRoZW0sIGFuZCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCB3aGlsZSB3ZSBkbyBpdC4gSWYgdGhlIGhpZ2hlcgorICoJbWVtb3J5IHN1cHBvcnQgaXMgY29tcGlsZWQgaW4gdGhlbiB3ZSBhbHNvIHRyeSBwcm9iaW5nIGFyb3VuZAorICoJdGhlIDFHYiwgMkdiIGFuZCAzR2IgYXJlYXMgYXMgd2VsbC4uLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZwlzdGxpX2Vpc2FtZW1wcm9iZWFkZHJzW10gPSB7CisJMHhjMDAwMCwgICAgMHhkMDAwMCwgICAgMHhlMDAwMCwgICAgMHhmMDAwMCwKKwkweDgwMDAwMDAwLCAweDgwMDEwMDAwLCAweDgwMDIwMDAwLCAweDgwMDMwMDAwLAorCTB4NDAwMDAwMDAsIDB4NDAwMTAwMDAsIDB4NDAwMjAwMDAsIDB4NDAwMzAwMDAsCisJMHhjMDAwMDAwMCwgMHhjMDAxMDAwMCwgMHhjMDAyMDAwMCwgMHhjMDAzMDAwMCwKKwkweGZmMDAwMDAwLCAweGZmMDEwMDAwLCAweGZmMDIwMDAwLCAweGZmMDMwMDAwLAorfTsKKworc3RhdGljIGludAlzdGxpX2Vpc2FtZW1wc2l6ZSA9IHNpemVvZihzdGxpX2Vpc2FtZW1wcm9iZWFkZHJzKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKTsKK2ludAkJc3RsaV9laXNhcHJvYmUgPSBTVExJX0VJU0FQUk9CRTsKKworLyoKKyAqCURlZmluZSB0aGUgU3RhbGxpb24gUENJIHZlbmRvciBhbmQgZGV2aWNlIElEcy4KKyAqLworI2lmZGVmIENPTkZJR19QQ0kKKyNpZm5kZWYJUENJX1ZFTkRPUl9JRF9TVEFMTElPTgorI2RlZmluZQlQQ0lfVkVORE9SX0lEX1NUQUxMSU9OCQkweDEyNGQKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0VDUkEKKyNkZWZpbmUJUENJX0RFVklDRV9JRF9FQ1JBCQkweDAwMDQKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXN0YWxsaW9uX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfU1RBTExJT04sIFBDSV9ERVZJQ0VfSURfRUNSQSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlzdGFsbGlvbl9wY2lfdGJsKTsKKworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSGFyZHdhcmUgY29uZmlndXJhdGlvbiBpbmZvIGZvciBFQ1AgYm9hcmRzLiBUaGVzZSBkZWZpbmVzIGFwcGx5CisgKgl0byB0aGUgZGlyZWN0bHkgYWNjZXNzaWJsZSBpbyBwb3J0cyBvZiB0aGUgRUNQLiBUaGVyZSBpcyBhIHNldCBvZgorICoJZGVmaW5lcyBmb3IgZWFjaCBFQ1AgYm9hcmQgdHlwZSwgSVNBLCBFSVNBLCBNQ0EgYW5kIFBDSS4KKyAqLworI2RlZmluZQlFQ1BfSU9TSVpFCTQKKworI2RlZmluZQlFQ1BfTUVNU0laRQkoMTI4ICogMTAyNCkKKyNkZWZpbmUJRUNQX1BDSU1FTVNJWkUJKDI1NiAqIDEwMjQpCisKKyNkZWZpbmUJRUNQX0FUUEFHRVNJWkUJKDQgKiAxMDI0KQorI2RlZmluZQlFQ1BfTUNQQUdFU0laRQkoNCAqIDEwMjQpCisjZGVmaW5lCUVDUF9FSVBBR0VTSVpFCSg2NCAqIDEwMjQpCisjZGVmaW5lCUVDUF9QQ0lQQUdFU0laRQkoNjQgKiAxMDI0KQorCisjZGVmaW5lCVNUTF9FSVNBSUQJMHg4YzRlCisKKy8qCisgKglJbXBvcnRhbnQgZGVmaW5lcyBmb3IgdGhlIElTQSBjbGFzcyBvZiBFQ1AgYm9hcmQuCisgKi8KKyNkZWZpbmUJRUNQX0FUSVJFRwkwCisjZGVmaW5lCUVDUF9BVENPTkZSCTEKKyNkZWZpbmUJRUNQX0FUTUVNQVIJMgorI2RlZmluZQlFQ1BfQVRNRU1QUgkzCisjZGVmaW5lCUVDUF9BVFNUT1AJMHgxCisjZGVmaW5lCUVDUF9BVElOVEVOQUIJMHgxMAorI2RlZmluZQlFQ1BfQVRFTkFCTEUJMHgyMAorI2RlZmluZQlFQ1BfQVRESVNBQkxFCTB4MDAKKyNkZWZpbmUJRUNQX0FUQUREUk1BU0sJMHgzZjAwMAorI2RlZmluZQlFQ1BfQVRBRERSU0hGVAkxMgorCisvKgorICoJSW1wb3J0YW50IGRlZmluZXMgZm9yIHRoZSBFSVNBIGNsYXNzIG9mIEVDUCBib2FyZC4KKyAqLworI2RlZmluZQlFQ1BfRUlJUkVHCTAKKyNkZWZpbmUJRUNQX0VJTUVNQVJMCTEKKyNkZWZpbmUJRUNQX0VJQ09ORlIJMgorI2RlZmluZQlFQ1BfRUlNRU1BUkgJMworI2RlZmluZQlFQ1BfRUlFTkFCTEUJMHgxCisjZGVmaW5lCUVDUF9FSURJU0FCTEUJMHgwCisjZGVmaW5lCUVDUF9FSVNUT1AJMHg0CisjZGVmaW5lCUVDUF9FSUVER0UJMHgwMAorI2RlZmluZQlFQ1BfRUlMRVZFTAkweDgwCisjZGVmaW5lCUVDUF9FSUFERFJNQVNLTAkweDAwZmYwMDAwCisjZGVmaW5lCUVDUF9FSUFERFJTSEZUTAkxNgorI2RlZmluZQlFQ1BfRUlBRERSTUFTS0gJMHhmZjAwMDAwMAorI2RlZmluZQlFQ1BfRUlBRERSU0hGVEgJMjQKKyNkZWZpbmUJRUNQX0VJQlJERU5BQgkweGM4NAorCisjZGVmaW5lCUVDUF9FSVNBSUQJMHg0CisKKy8qCisgKglJbXBvcnRhbnQgZGVmaW5lcyBmb3IgdGhlIE1pY3JvLWNoYW5uZWwgY2xhc3Mgb2YgRUNQIGJvYXJkLgorICoJKEl0IGhhcyBhIGxvdCBpbiBjb21tb24gd2l0aCB0aGUgSVNBIGJvYXJkcy4pCisgKi8KKyNkZWZpbmUJRUNQX01DSVJFRwkwCisjZGVmaW5lCUVDUF9NQ0NPTkZSCTEKKyNkZWZpbmUJRUNQX01DU1RPUAkweDIwCisjZGVmaW5lCUVDUF9NQ0VOQUJMRQkweDgwCisjZGVmaW5lCUVDUF9NQ0RJU0FCTEUJMHgwMAorCisvKgorICoJSW1wb3J0YW50IGRlZmluZXMgZm9yIHRoZSBQQ0kgY2xhc3Mgb2YgRUNQIGJvYXJkLgorICoJKEl0IGhhcyBhIGxvdCBpbiBjb21tb24gd2l0aCB0aGUgb3RoZXIgRUNQIGJvYXJkcy4pCisgKi8KKyNkZWZpbmUJRUNQX1BDSUlSRUcJMAorI2RlZmluZQlFQ1BfUENJQ09ORlIJMQorI2RlZmluZQlFQ1BfUENJU1RPUAkweDAxCisKKy8qCisgKglIYXJkd2FyZSBjb25maWd1cmF0aW9uIGluZm8gZm9yIE9OYm9hcmQgYW5kIEJydW1ieSBib2FyZHMuIFRoZXNlCisgKglkZWZpbmVzIGFwcGx5IHRvIHRoZSBkaXJlY3RseSBhY2Nlc3NpYmxlIGlvIHBvcnRzIG9mIHRoZXNlIGJvYXJkcy4KKyAqLworI2RlZmluZQlPTkJfSU9TSVpFCTE2CisjZGVmaW5lCU9OQl9NRU1TSVpFCSg2NCAqIDEwMjQpCisjZGVmaW5lCU9OQl9BVFBBR0VTSVpFCSg2NCAqIDEwMjQpCisjZGVmaW5lCU9OQl9NQ1BBR0VTSVpFCSg2NCAqIDEwMjQpCisjZGVmaW5lCU9OQl9FSU1FTVNJWkUJKDEyOCAqIDEwMjQpCisjZGVmaW5lCU9OQl9FSVBBR0VTSVpFCSg2NCAqIDEwMjQpCisKKy8qCisgKglJbXBvcnRhbnQgZGVmaW5lcyBmb3IgdGhlIElTQSBjbGFzcyBvZiBPTmJvYXJkIGJvYXJkLgorICovCisjZGVmaW5lCU9OQl9BVElSRUcJMAorI2RlZmluZQlPTkJfQVRNRU1BUgkxCisjZGVmaW5lCU9OQl9BVENPTkZSCTIKKyNkZWZpbmUJT05CX0FUU1RPUAkweDQKKyNkZWZpbmUJT05CX0FURU5BQkxFCTB4MDEKKyNkZWZpbmUJT05CX0FURElTQUJMRQkweDAwCisjZGVmaW5lCU9OQl9BVEFERFJNQVNLCTB4ZmYwMDAwCisjZGVmaW5lCU9OQl9BVEFERFJTSEZUCTE2CisKKyNkZWZpbmUJT05CX01FTUVOQUJMTwkwCisjZGVmaW5lCU9OQl9NRU1FTkFCSEkJMHgwMgorCisvKgorICoJSW1wb3J0YW50IGRlZmluZXMgZm9yIHRoZSBFSVNBIGNsYXNzIG9mIE9OYm9hcmQgYm9hcmQuCisgKi8KKyNkZWZpbmUJT05CX0VJSVJFRwkwCisjZGVmaW5lCU9OQl9FSU1FTUFSTAkxCisjZGVmaW5lCU9OQl9FSUNPTkZSCTIKKyNkZWZpbmUJT05CX0VJTUVNQVJICTMKKyNkZWZpbmUJT05CX0VJRU5BQkxFCTB4MQorI2RlZmluZQlPTkJfRUlESVNBQkxFCTB4MAorI2RlZmluZQlPTkJfRUlTVE9QCTB4NAorI2RlZmluZQlPTkJfRUlFREdFCTB4MDAKKyNkZWZpbmUJT05CX0VJTEVWRUwJMHg4MAorI2RlZmluZQlPTkJfRUlBRERSTUFTS0wJMHgwMGZmMDAwMAorI2RlZmluZQlPTkJfRUlBRERSU0hGVEwJMTYKKyNkZWZpbmUJT05CX0VJQUREUk1BU0tICTB4ZmYwMDAwMDAKKyNkZWZpbmUJT05CX0VJQUREUlNIRlRICTI0CisjZGVmaW5lCU9OQl9FSUJSREVOQUIJMHhjODQKKworI2RlZmluZQlPTkJfRUlTQUlECTB4MQorCisvKgorICoJSW1wb3J0YW50IGRlZmluZXMgZm9yIHRoZSBCcnVtYnkgYm9hcmRzLiBUaGV5IGFyZSBwcmV0dHkgc2ltcGxlLAorICoJdGhlcmUgaXMgbm90IG11Y2ggdGhhdCBpcyBwcm9ncmFtbWFibHkgY29uZmlndXJhYmxlLgorICovCisjZGVmaW5lCUJCWV9JT1NJWkUJMTYKKyNkZWZpbmUJQkJZX01FTVNJWkUJKDY0ICogMTAyNCkKKyNkZWZpbmUJQkJZX1BBR0VTSVpFCSgxNiAqIDEwMjQpCisKKyNkZWZpbmUJQkJZX0FUSVJFRwkwCisjZGVmaW5lCUJCWV9BVENPTkZSCTEKKyNkZWZpbmUJQkJZX0FUU1RPUAkweDQKKworLyoKKyAqCUltcG9ydGFudCBkZWZpbmVzIGZvciB0aGUgU3RhbGxpb24gYm9hcmRzLiBUaGV5IGFyZSBwcmV0dHkgc2ltcGxlLAorICoJdGhlcmUgaXMgbm90IG11Y2ggdGhhdCBpcyBwcm9ncmFtbWFibHkgY29uZmlndXJhYmxlLgorICovCisjZGVmaW5lCVNUQUxfSU9TSVpFCTE2CisjZGVmaW5lCVNUQUxfTUVNU0laRQkoNjQgKiAxMDI0KQorI2RlZmluZQlTVEFMX1BBR0VTSVpFCSg2NCAqIDEwMjQpCisKKy8qCisgKglEZWZpbmUgdGhlIHNldCBvZiBzdGF0dXMgcmVnaXN0ZXIgdmFsdWVzIGZvciBFYXN5Q29ubmVjdGlvbiBwYW5lbHMuCisgKglUaGUgc2lnbmF0dXJlIHdpbGwgcmV0dXJuIHdpdGggdGhlIHN0YXR1cyB2YWx1ZSBmb3IgZWFjaCBwYW5lbC4gRnJvbQorICoJdGhpcyB3ZSBjYW4gZGV0ZXJtaW5lIHdoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIGJvYXJkIC0gYmVmb3JlIHdlIGhhdmUKKyAqCWFjdHVhbGx5IGRvd24gbG9hZGVkIGFueSBjb2RlIHRvIGl0LgorICovCisjZGVmaW5lCUVDSF9QTkxTVEFUVVMJMgorI2RlZmluZQlFQ0hfUE5MMTZQT1JUCTB4MjAKKyNkZWZpbmUJRUNIX1BOTElETUFTSwkweDA3CisjZGVmaW5lCUVDSF9QTkxYUElECTB4NDAKKyNkZWZpbmUJRUNIX1BOTElOVFJQRU5ECTB4ODAKKworLyoKKyAqCURlZmluZSBzb21lIG1hY3JvcyB0byBkbyB0aGluZ3MgdG8gdGhlIGJvYXJkLiBFdmVuIHRob3NlIHRoZXNlIGJvYXJkcworICoJYXJlIHNvbWV3aGF0IHJlbGF0ZWQgdGhlcmUgaXMgb2Z0ZW4gc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgd2F5cyBvZgorICoJZG9pbmcgc29tZSBvcGVyYXRpb24gb24gaXQgKGxpa2UgZW5hYmxlLCBwYWdpbmcsIHJlc2V0LCBldGMpLiBTbyBlYWNoCisgKglib2FyZCBjbGFzcyBoYXMgYSBzZXQgb2YgZnVuY3Rpb25zIHdoaWNoIGRvIHRoZSBjb21tb25seSByZXF1aXJlZAorICoJb3BlcmF0aW9ucy4gVGhlIG1hY3JvcyBiZWxvdyBiYXNpY2FsbHkganVzdCBjYWxsIHRoZXNlIGZ1bmN0aW9ucywKKyAqCWdlbmVyYWxseSBjaGVja2luZyBmb3IgYSBOVUxMIGZ1bmN0aW9uIC0gd2hpY2ggbWVhbnMgdGhhdCB0aGUgYm9hcmQKKyAqCW5lZWRzIG5vdGhpbmcgZG9uZSB0byBpdCB0byBhY2hpZXZlIHRoaXMgb3BlcmF0aW9uIQorICovCisjZGVmaW5lCUVCUkRJTklUKGJyZHApCQkJCQkJXAorCWlmIChicmRwLT5pbml0ICE9IE5VTEwpCQkJCQlcCisJCSgqIGJyZHAtPmluaXQpKGJyZHApCisKKyNkZWZpbmUJRUJSREVOQUJMRShicmRwKQkJCQkJXAorCWlmIChicmRwLT5lbmFibGUgIT0gTlVMTCkJCQkJXAorCQkoKiBicmRwLT5lbmFibGUpKGJyZHApOworCisjZGVmaW5lCUVCUkRESVNBQkxFKGJyZHApCQkJCQlcCisJaWYgKGJyZHAtPmRpc2FibGUgIT0gTlVMTCkJCQkJXAorCQkoKiBicmRwLT5kaXNhYmxlKShicmRwKTsKKworI2RlZmluZQlFQlJESU5UUihicmRwKQkJCQkJCVwKKwlpZiAoYnJkcC0+aW50ciAhPSBOVUxMKQkJCQkJXAorCQkoKiBicmRwLT5pbnRyKShicmRwKTsKKworI2RlZmluZQlFQlJEUkVTRVQoYnJkcCkJCQkJCQlcCisJaWYgKGJyZHAtPnJlc2V0ICE9IE5VTEwpCQkJCVwKKwkJKCogYnJkcC0+cmVzZXQpKGJyZHApOworCisjZGVmaW5lCUVCUkRHRVRNRU1QVFIoYnJkcCxvZmZzZXQpCQkJCVwKKwkoKiBicmRwLT5nZXRtZW1wdHIpKGJyZHAsIG9mZnNldCwgX19MSU5FX18pCisKKy8qCisgKglEZWZpbmUgdGhlIG1heGltYWwgYmF1ZCByYXRlLCBhbmQgdGhlIGRlZmF1bHQgYmF1ZCBiYXNlIGZvciBwb3J0cy4KKyAqLworI2RlZmluZQlTVExfTUFYQkFVRAk0NjA4MDAKKyNkZWZpbmUJU1RMX0JBVURCQVNFCTExNTIwMAorI2RlZmluZQlTVExfQ0xPU0VERUxBWQkoNSAqIEhaIC8gMTApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlZmluZSBtYWNyb3MgdG8gZXh0cmFjdCBhIGJyZCBvciBwb3J0IG51bWJlciBmcm9tIGEgbWlub3IgbnVtYmVyLgorICovCisjZGVmaW5lCU1JTk9SMkJSRChtaW4pCQkoKChtaW4pICYgMHhjMCkgPj4gNikKKyNkZWZpbmUJTUlOT1IyUE9SVChtaW4pCQkoKG1pbikgJiAweDNmKQorCisvKgorICoJRGVmaW5lIGEgYmF1ZCByYXRlIHRhYmxlIHRoYXQgY29udmVydHMgdGVybWlvcyBiYXVkIHJhdGUgc2VsZWN0b3IKKyAqCWludG8gdGhlIGFjdHVhbCBiYXVkIHJhdGUgdmFsdWUuIEFsbCBiYXVkIHJhdGUgY2FsY3VsYXRpb25zIGFyZSBiYXNlZAorICoJb24gdGhlIGFjdHVhbCBiYXVkIHJhdGUgcmVxdWlyZWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQJc3RsaV9iYXVkcmF0ZXNbXSA9IHsKKwkwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsCisJOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDAsIDQ2MDgwMCwgOTIxNjAwCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEZWZpbmUgc29tZSBoYW5keSBsb2NhbCBtYWNyb3MuLi4KKyAqLworI3VuZGVmIE1JTgorI2RlZmluZQlNSU4oYSxiKQkoKChhKSA8PSAoYikpID8gKGEpIDogKGIpKQorCisjdW5kZWYJVE9MT1dFUgorI2RlZmluZQlUT0xPV0VSKHgpCSgoKCh4KSA+PSAnQScpICYmICgoeCkgPD0gJ1onKSkgPyAoKHgpICsgMHgyMCkgOiAoeCkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVByb3RvdHlwZSBhbGwgZnVuY3Rpb25zIGluIHRoaXMgZHJpdmVyIQorICovCisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyB2b2lkCXN0bGlfYXJnYnJkcyh2b2lkKTsKK3N0YXRpYyBpbnQJc3RsaV9wYXJzZWJyZChzdGxjb25mX3QgKmNvbmZwLCBjaGFyICoqYXJncCk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCXN0bGlfYXRvbChjaGFyICpzdHIpOworI2VuZGlmCisKK2ludAkJc3RsaV9pbml0KHZvaWQpOworc3RhdGljIGludAlzdGxpX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHZvaWQJc3RsaV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgaW50CXN0bGlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQJc3RsaV9wdXRjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpOworc3RhdGljIHZvaWQJc3RsaV9mbHVzaGNoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludAlzdGxpX3dyaXRlcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQJc3RsaV9jaGFyc2luYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludAlzdGxpX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZAlzdGxpX3NldHRlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZCk7CitzdGF0aWMgdm9pZAlzdGxpX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQJc3RsaV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQJc3RsaV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQJc3RsaV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkCXN0bGlfZmx1c2hidWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZAlzdGxpX2JyZWFrY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBzdGF0ZSk7CitzdGF0aWMgdm9pZAlzdGxpX3dhaXR1bnRpbHNlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOworc3RhdGljIHZvaWQJc3RsaV9zZW5keGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCk7CitzdGF0aWMgdm9pZAlzdGxpX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQJc3RsaV9wb3J0aW5mbyhzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCBpbnQgcG9ydG5yLCBjaGFyICpwb3MpOworCitzdGF0aWMgaW50CXN0bGlfYnJkaW5pdChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIGludAlzdGxpX3N0YXJ0YnJkKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgc3NpemVfdAlzdGxpX21lbXJlYWQoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCk7CitzdGF0aWMgc3NpemVfdAlzdGxpX21lbXdyaXRlKHN0cnVjdCBmaWxlICpmcCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApOworc3RhdGljIGludAlzdGxpX21lbWlvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQJc3RsaV9icmRwb2xsKHN0bGlicmRfdCAqYnJkcCwgdm9sYXRpbGUgY2RraGRyX3QgKmhkcnApOworc3RhdGljIHZvaWQJc3RsaV9wb2xsKHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQJc3RsaV9ob3N0Y21kKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHApOworc3RhdGljIGludAlzdGxpX2luaXRvcGVuKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHApOworc3RhdGljIGludAlzdGxpX3Jhd29wZW4oc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCB3YWl0KTsKK3N0YXRpYyBpbnQJc3RsaV9yYXdjbG9zZShzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IHdhaXQpOworc3RhdGljIGludAlzdGxpX3dhaXRjYXJyaWVyKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkCXN0bGlfZG9oYW5ndXAodm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQJc3RsaV9zZXRwb3J0KHN0bGlwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyBpbnQJc3RsaV9jbWR3YWl0KHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICphcmcsIGludCBzaXplLCBpbnQgY29weWJhY2spOworc3RhdGljIHZvaWQJc3RsaV9zZW5kY21kKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICphcmcsIGludCBzaXplLCBpbnQgY29weWJhY2spOworc3RhdGljIHZvaWQJc3RsaV9kb2RlbGF5Y21kKHN0bGlwb3J0X3QgKnBvcnRwLCB2b2xhdGlsZSBjZGtjdHJsX3QgKmNwKTsKK3N0YXRpYyB2b2lkCXN0bGlfbWthc3lwb3J0KHN0bGlwb3J0X3QgKnBvcnRwLCBhc3lwb3J0X3QgKnBwLCBzdHJ1Y3QgdGVybWlvcyAqdGlvc3ApOworc3RhdGljIHZvaWQJc3RsaV9ta2FzeXNpZ3MoYXN5c2lnc190ICpzcCwgaW50IGR0ciwgaW50IHJ0cyk7CitzdGF0aWMgbG9uZwlzdGxpX21rdGlvY20odW5zaWduZWQgbG9uZyBzaWd2YWx1ZSk7CitzdGF0aWMgdm9pZAlzdGxpX3JlYWQoc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCk7CitzdGF0aWMgaW50CXN0bGlfZ2V0c2VyaWFsKHN0bGlwb3J0X3QgKnBvcnRwLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKTsKK3N0YXRpYyBpbnQJc3RsaV9zZXRzZXJpYWwoc3RsaXBvcnRfdCAqcG9ydHAsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqc3ApOworc3RhdGljIGludAlzdGxpX2dldGJyZHN0YXRzKGNvbWJyZF90IF9fdXNlciAqYnApOworc3RhdGljIGludAlzdGxpX2dldHBvcnRzdGF0cyhzdGxpcG9ydF90ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKTsKK3N0YXRpYyBpbnQJc3RsaV9wb3J0Y21kc3RhdHMoc3RsaXBvcnRfdCAqcG9ydHApOworc3RhdGljIGludAlzdGxpX2NscnBvcnRzdGF0cyhzdGxpcG9ydF90ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKTsKK3N0YXRpYyBpbnQJc3RsaV9nZXRwb3J0c3RydWN0KHN0bGlwb3J0X3QgX191c2VyICphcmcpOworc3RhdGljIGludAlzdGxpX2dldGJyZHN0cnVjdChzdGxpYnJkX3QgX191c2VyICphcmcpOworc3RhdGljIHZvaWQJKnN0bGlfbWVtYWxsb2MoaW50IGxlbik7CitzdGF0aWMgc3RsaWJyZF90ICpzdGxpX2FsbG9jYnJkKHZvaWQpOworCitzdGF0aWMgdm9pZAlzdGxpX2VjcGluaXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfZWNwZW5hYmxlKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcGRpc2FibGUoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBjaGFyCSpzdGxpX2VjcGdldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcHJlc2V0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcGludHIoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfZWNwZWlpbml0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcGVpZW5hYmxlKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcGVpZGlzYWJsZShzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIGNoYXIJKnN0bGlfZWNwZWlnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOworc3RhdGljIHZvaWQJc3RsaV9lY3BlaXJlc2V0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcG1jZW5hYmxlKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcG1jZGlzYWJsZShzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIGNoYXIJKnN0bGlfZWNwbWNnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOworc3RhdGljIHZvaWQJc3RsaV9lY3BtY3Jlc2V0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcHBjaWluaXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBjaGFyCSpzdGxpX2VjcHBjaWdldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcHBjaXJlc2V0KHN0bGlicmRfdCAqYnJkcCk7CisKK3N0YXRpYyB2b2lkCXN0bGlfb25iaW5pdChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9vbmJlbmFibGUoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfb25iZGlzYWJsZShzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIGNoYXIJKnN0bGlfb25iZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKTsKK3N0YXRpYyB2b2lkCXN0bGlfb25icmVzZXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfb25iZWluaXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfb25iZWVuYWJsZShzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9vbmJlZGlzYWJsZShzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIGNoYXIJKnN0bGlfb25iZWdldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSk7CitzdGF0aWMgdm9pZAlzdGxpX29uYmVyZXNldChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9iYnlpbml0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgY2hhcgkqc3RsaV9iYnlnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOworc3RhdGljIHZvaWQJc3RsaV9iYnlyZXNldChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9zdGFsaW5pdChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIGNoYXIJKnN0bGlfc3RhbGdldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSk7CitzdGF0aWMgdm9pZAlzdGxpX3N0YWxyZXNldChzdGxpYnJkX3QgKmJyZHApOworCitzdGF0aWMgc3RsaXBvcnRfdCAqc3RsaV9nZXRwb3J0KGludCBicmRuciwgaW50IHBhbmVsbnIsIGludCBwb3J0bnIpOworCitzdGF0aWMgaW50CXN0bGlfaW5pdGVjcChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIGludAlzdGxpX2luaXRvbmIoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsaV9laXNhbWVtcHJvYmUoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsaV9pbml0cG9ydHMoc3RsaWJyZF90ICpicmRwKTsKKworI2lmZGVmCUNPTkZJR19QQ0kKK3N0YXRpYyBpbnQJc3RsaV9pbml0cGNpYnJkKGludCBicmR0eXBlLCBzdHJ1Y3QgcGNpX2RldiAqZGV2cCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGVmaW5lIHRoZSBkcml2ZXIgaW5mbyBmb3IgYSB1c2VyIGxldmVsIHNoYXJlZCBtZW1vcnkgZGV2aWNlLiBUaGlzCisgKglkZXZpY2Ugd2lsbCB3b3JrIHNvcnQgb2YgbGlrZSB0aGUgL2Rldi9rbWVtIGRldmljZSAtIGV4Y2VwdCB0aGF0IGl0CisgKgl3aWxsIGdpdmUgYWNjZXNzIHRvIHRoZSBzaGFyZWQgbWVtb3J5IG9uIHRoZSBTdGFsbGlvbiBpbnRlbGxpZ2VudAorICoJYm9hcmQuIFRoaXMgaXMgYWxzbyBhIHZlcnkgdXNlZnVsIGRlYnVnZ2luZyB0b29sLgorICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucwlzdGxpX2ZzaW9tZW0gPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IHN0bGlfbWVtcmVhZCwKKwkud3JpdGUJCT0gc3RsaV9tZW13cml0ZSwKKwkuaW9jdGwJCT0gc3RsaV9tZW1pb2N0bCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlZmluZSBhIHRpbWVyX2xpc3QgZW50cnkgZm9yIG91ciBwb2xsIHJvdXRpbmUuIFRoZSBzbGF2ZSBib2FyZAorICoJaXMgcG9sbGVkIGV2ZXJ5IHNvIG9mdGVuIHRvIHNlZSBpZiBhbnl0aGluZyBuZWVkcyBkb2luZy4gVGhpcyBpcworICoJbXVjaCBjaGVhcGVyIG9uIGhvc3QgY3B1IHRoYW4gdXNpbmcgaW50ZXJydXB0cy4gSXQgdHVybnMgb3V0IHRvCisgKglub3QgaW5jcmVhc2UgY2hhcmFjdGVyIGxhdGVuY3kgYnkgbXVjaCBlaXRoZXIuLi4KKyAqLworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHN0bGlfdGltZXJsaXN0ID0gVElNRVJfSU5JVElBTElaRVIoc3RsaV9wb2xsLCAwLCAwKTsKKworc3RhdGljIGludAlzdGxpX3RpbWVyb247CisKKy8qCisgKglEZWZpbmUgdGhlIGNhbGN1bGF0aW9uIGZvciB0aGUgdGltZW91dCByb3V0aW5lLgorICovCisjZGVmaW5lCVNUTElfVElNRU9VVAkoamlmZmllcyArIDEpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKmlzdGFsbGlvbl9jbGFzczsKKworI2lmZGVmIE1PRFVMRQorCisvKgorICoJTG9hZGFibGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIHN0dWZmLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGlzdGFsbGlvbl9tb2R1bGVfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiaW5pdF9tb2R1bGUoKVxuIik7CisjZW5kaWYKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCXN0bGlfaW5pdCgpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpc3RhbGxpb25fbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJc3RsaXBvcnRfdAkqcG9ydHA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQJCWksIGo7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiY2xlYW51cF9tb2R1bGUoKVxuIik7CisjZW5kaWYKKworCXByaW50ayhLRVJOX0lORk8gIlVubG9hZGluZyAlczogdmVyc2lvbiAlc1xuIiwgc3RsaV9kcnZ0aXRsZSwKKwkJc3RsaV9kcnZ2ZXJzaW9uKTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisvKgorICoJRnJlZSB1cCBhbGwgYWxsb2NhdGVkIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBwb3J0cy4gVGhpcyBpbmNsdWRlcworICoJbWVtb3J5IGFuZCBpbnRlcnJ1cHRzLgorICovCisJaWYgKHN0bGlfdGltZXJvbikgeworCQlzdGxpX3RpbWVyb24gPSAwOworCQlkZWxfdGltZXIoJnN0bGlfdGltZXJsaXN0KTsKKwl9CisKKwlpID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHN0bGlfc2VyaWFsKTsKKwlpZiAoaSkgeworCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gdW4tcmVnaXN0ZXIgdHR5IGRyaXZlciwgIgorCQkJImVycm5vPSVkXG4iLCAtaSk7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXB1dF90dHlfZHJpdmVyKHN0bGlfc2VyaWFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWRldmZzX3JlbW92ZSgic3RhbGlvbWVtLyVkIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFNUTF9TSU9NRU1NQUpPUiwgaSkpOworCX0KKwlkZXZmc19yZW1vdmUoInN0YWxpb21lbSIpOworCWNsYXNzX3NpbXBsZV9kZXN0cm95KGlzdGFsbGlvbl9jbGFzcyk7CisJaWYgKChpID0gdW5yZWdpc3Rlcl9jaHJkZXYoU1RMX1NJT01FTU1BSk9SLCAic3RhbGlvbWVtIikpKQorCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gdW4tcmVnaXN0ZXIgc2VyaWFsIG1lbW9yeSBkZXZpY2UsICIKKwkJCSJlcnJubz0lZFxuIiwgLWkpOworCWlmIChzdGxpX3RtcHdyaXRlYnVmICE9IChjaGFyICopIE5VTEwpCisJCWtmcmVlKHN0bGlfdG1wd3JpdGVidWYpOworCWlmIChzdGxpX3R4Y29va2J1ZiAhPSAoY2hhciAqKSBOVUxMKQorCQlrZnJlZShzdGxpX3R4Y29va2J1Zik7CisKKwlmb3IgKGkgPSAwOyAoaSA8IHN0bGlfbnJicmRzKTsgaSsrKSB7CisJCWlmICgoYnJkcCA9IHN0bGlfYnJkc1tpXSkgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQkJY29udGludWU7CisJCWZvciAoaiA9IDA7IChqIDwgU1RMX01BWFBPUlRTKTsgaisrKSB7CisJCQlwb3J0cCA9IGJyZHAtPnBvcnRzW2pdOworCQkJaWYgKHBvcnRwICE9IChzdGxpcG9ydF90ICopIE5VTEwpIHsKKwkJCQlpZiAocG9ydHAtPnR0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJCQkJdHR5X2hhbmd1cChwb3J0cC0+dHR5KTsKKwkJCQlrZnJlZShwb3J0cCk7CisJCQl9CisJCX0KKworCQlpb3VubWFwKGJyZHAtPm1lbWJhc2UpOworCQlpZiAoYnJkcC0+aW9zaXplID4gMCkKKwkJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKKwkJa2ZyZWUoYnJkcCk7CisJCXN0bGlfYnJkc1tpXSA9IChzdGxpYnJkX3QgKikgTlVMTDsKKwl9CisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworbW9kdWxlX2luaXQoaXN0YWxsaW9uX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGlzdGFsbGlvbl9tb2R1bGVfZXhpdCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUNoZWNrIGZvciBhbnkgYXJndW1lbnRzIHBhc3NlZCBpbiBvbiB0aGUgbW9kdWxlIGxvYWQgY29tbWFuZCBsaW5lLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfYXJnYnJkcyh2b2lkKQoreworCXN0bGNvbmZfdAljb25mOworCXN0bGlicmRfdAkqYnJkcDsKKwlpbnQJCW5yYXJncywgaTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX2FyZ2JyZHMoKVxuIik7CisjZW5kaWYKKworCW5yYXJncyA9IHNpemVvZihzdGxpX2JyZHNwKSAvIHNpemVvZihjaGFyICoqKTsKKworCWZvciAoaSA9IHN0bGlfbnJicmRzOyAoaSA8IG5yYXJncyk7IGkrKykgeworCQltZW1zZXQoJmNvbmYsIDAsIHNpemVvZihjb25mKSk7CisJCWlmIChzdGxpX3BhcnNlYnJkKCZjb25mLCBzdGxpX2JyZHNwW2ldKSA9PSAwKQorCQkJY29udGludWU7CisJCWlmICgoYnJkcCA9IHN0bGlfYWxsb2NicmQoKSkgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQkJY29udGludWU7CisJCXN0bGlfbnJicmRzID0gaSArIDE7CisJCWJyZHAtPmJyZG5yID0gaTsKKwkJYnJkcC0+YnJkdHlwZSA9IGNvbmYuYnJkdHlwZTsKKwkJYnJkcC0+aW9iYXNlID0gY29uZi5pb2FkZHIxOworCQlicmRwLT5tZW1hZGRyID0gY29uZi5tZW1hZGRyOworCQlzdGxpX2JyZGluaXQoYnJkcCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglDb252ZXJ0IGFuIGFzY2lpIHN0cmluZyBudW1iZXIgaW50byBhbiB1bnNpZ25lZCBsb25nLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN0bGlfYXRvbChjaGFyICpzdHIpCit7CisJdW5zaWduZWQgbG9uZwl2YWw7CisJaW50CQliYXNlLCBjOworCWNoYXIJCSpzcDsKKworCXZhbCA9IDA7CisJc3AgPSBzdHI7CisJaWYgKCgqc3AgPT0gJzAnKSAmJiAoKihzcCsxKSA9PSAneCcpKSB7CisJCWJhc2UgPSAxNjsKKwkJc3AgKz0gMjsKKwl9IGVsc2UgaWYgKCpzcCA9PSAnMCcpIHsKKwkJYmFzZSA9IDg7CisJCXNwKys7CisJfSBlbHNlIHsKKwkJYmFzZSA9IDEwOworCX0KKworCWZvciAoOyAoKnNwICE9IDApOyBzcCsrKSB7CisJCWMgPSAoKnNwID4gJzknKSA/IChUT0xPV0VSKCpzcCkgLSAnYScgKyAxMCkgOiAoKnNwIC0gJzAnKTsKKwkJaWYgKChjIDwgMCkgfHwgKGMgPj0gYmFzZSkpIHsKKwkJCXByaW50aygiU1RBTExJT046IGludmFsaWQgYXJndW1lbnQgJXNcbiIsIHN0cik7CisJCQl2YWwgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJdmFsID0gKHZhbCAqIGJhc2UpICsgYzsKKwl9CisJcmV0dXJuKHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVBhcnNlIHRoZSBzdXBwbGllZCBhcmd1bWVudCBzdHJpbmcsIGludG8gdGhlIGJvYXJkIGNvbmYgc3RydWN0LgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9wYXJzZWJyZChzdGxjb25mX3QgKmNvbmZwLCBjaGFyICoqYXJncCkKK3sKKwljaGFyCSpzcDsKKwlpbnQJbnJicmRuYW1lcywgaTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX3BhcnNlYnJkKGNvbmZwPSV4LGFyZ3A9JXgpXG4iLCAoaW50KSBjb25mcCwgKGludCkgYXJncCk7CisjZW5kaWYKKworCWlmICgoYXJncFswXSA9PSAoY2hhciAqKSBOVUxMKSB8fCAoKmFyZ3BbMF0gPT0gMCkpCisJCXJldHVybigwKTsKKworCWZvciAoc3AgPSBhcmdwWzBdLCBpID0gMDsgKCgqc3AgIT0gMCkgJiYgKGkgPCAyNSkpOyBzcCsrLCBpKyspCisJCSpzcCA9IFRPTE9XRVIoKnNwKTsKKworCW5yYnJkbmFtZXMgPSBzaXplb2Yoc3RsaV9icmRzdHIpIC8gc2l6ZW9mKHN0bGlicmR0eXBlX3QpOworCWZvciAoaSA9IDA7IChpIDwgbnJicmRuYW1lcyk7IGkrKykgeworCQlpZiAoc3RyY21wKHN0bGlfYnJkc3RyW2ldLm5hbWUsIGFyZ3BbMF0pID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGkgPj0gbnJicmRuYW1lcykgeworCQlwcmludGsoIlNUQUxMSU9OOiB1bmtub3duIGJvYXJkIG5hbWUsICVzP1xuIiwgYXJncFswXSk7CisJCXJldHVybigwKTsKKwl9CisKKwljb25mcC0+YnJkdHlwZSA9IHN0bGlfYnJkc3RyW2ldLnR5cGU7CisJaWYgKChhcmdwWzFdICE9IChjaGFyICopIE5VTEwpICYmICgqYXJncFsxXSAhPSAwKSkKKwkJY29uZnAtPmlvYWRkcjEgPSBzdGxpX2F0b2woYXJncFsxXSk7CisJaWYgKChhcmdwWzJdICE9IChjaGFyICopIE5VTEwpICYmICgqYXJncFsyXSAhPSAwKSkKKwkJY29uZnAtPm1lbWFkZHIgPSBzdGxpX2F0b2woYXJncFsyXSk7CisJcmV0dXJuKDEpOworfQorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJTG9jYWwgZHJpdmVyIGtlcm5lbCBtYWxsb2Mgcm91dGluZS4KKyAqLworCitzdGF0aWMgdm9pZCAqc3RsaV9tZW1hbGxvYyhpbnQgbGVuKQoreworCXJldHVybigodm9pZCAqKSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgc3RsaV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0bGlicmRfdAkqYnJkcDsKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwl1bnNpZ25lZCBpbnQJbWlub3JkZXY7CisJaW50CQlicmRuciwgcG9ydG5yLCByYzsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX29wZW4odHR5PSV4LGZpbHA9JXgpOiBkZXZpY2U9JXNcbiIsIChpbnQpIHR0eSwKKwkJKGludCkgZmlscCwgdHR5LT5uYW1lKTsKKyNlbmRpZgorCisJbWlub3JkZXYgPSB0dHktPmluZGV4OworCWJyZG5yID0gTUlOT1IyQlJEKG1pbm9yZGV2KTsKKwlpZiAoYnJkbnIgPj0gc3RsaV9ucmJyZHMpCisJCXJldHVybigtRU5PREVWKTsKKwlicmRwID0gc3RsaV9icmRzW2JyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwlpZiAoKGJyZHAtPnN0YXRlICYgQlNUX1NUQVJURUQpID09IDApCisJCXJldHVybigtRU5PREVWKTsKKwlwb3J0bnIgPSBNSU5PUjJQT1JUKG1pbm9yZGV2KTsKKwlpZiAoKHBvcnRuciA8IDApIHx8IChwb3J0bnIgPiBicmRwLT5ucnBvcnRzKSkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJcG9ydHAgPSBicmRwLT5wb3J0c1twb3J0bnJdOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKHBvcnRwLT5kZXZuciA8IDEpCisJCXJldHVybigtRU5PREVWKTsKKworCisvKgorICoJQ2hlY2sgaWYgdGhpcyBwb3J0IGlzIGluIHRoZSBtaWRkbGUgb2YgY2xvc2luZy4gSWYgc28gdGhlbiB3YWl0CisgKgl1bnRpbCBpdCBpcyBjbG9zZWQgdGhlbiByZXR1cm4gZXJyb3Igc3RhdHVzIGJhc2VkIG9uIGZsYWcgc2V0dGluZ3MuCisgKglUaGUgc2xlZXAgaGVyZSBkb2VzIG5vdCBuZWVkIGludGVycnVwdCBwcm90ZWN0aW9uIHNpbmNlIHRoZSB3YWtldXAKKyAqCWZvciBpdCBpcyBkb25lIHdpdGggdGhlIHNhbWUgY29udGV4dC4KKyAqLworCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSB7CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnBvcnRwLT5jbG9zZV93YWl0KTsKKwkJaWYgKHBvcnRwLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQlyZXR1cm4oLUVBR0FJTik7CisJCXJldHVybigtRVJFU1RBUlRTWVMpOworCX0KKworLyoKKyAqCU9uIHRoZSBmaXJzdCBvcGVuIG9mIHRoZSBkZXZpY2Ugc2V0dXAgdGhlIHBvcnQgaGFyZHdhcmUsIGFuZAorICoJaW5pdGlhbGl6ZSB0aGUgcGVyIHBvcnQgZGF0YSBzdHJ1Y3R1cmUuIFNpbmNlIGluaXRpYWxpemluZyB0aGUgcG9ydAorICoJcmVxdWlyZXMgc2V2ZXJhbCBjb21tYW5kcyB0byB0aGUgYm9hcmQgd2Ugd2lsbCBuZWVkIHRvIHdhaXQgZm9yIGFueQorICoJb3RoZXIgb3BlbiB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6aW5nIHRoZSBwb3J0LgorICovCisJcG9ydHAtPnR0eSA9IHR0eTsKKwl0dHktPmRyaXZlcl9kYXRhID0gcG9ydHA7CisJcG9ydHAtPnJlZmNvdW50Kys7CisKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocG9ydHAtPnJhd193YWl0LAorCQkJIXRlc3RfYml0KFNUX0lOSVRJQUxJWklORywgJnBvcnRwLT5zdGF0ZSkpOworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuKC1FUkVTVEFSVFNZUyk7CisKKwlpZiAoKHBvcnRwLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSA9PSAwKSB7CisJCXNldF9iaXQoU1RfSU5JVElBTElaSU5HLCAmcG9ydHAtPnN0YXRlKTsKKwkJaWYgKChyYyA9IHN0bGlfaW5pdG9wZW4oYnJkcCwgcG9ydHApKSA+PSAwKSB7CisJCQlwb3J0cC0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CisJCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CisJCX0KKwkJY2xlYXJfYml0KFNUX0lOSVRJQUxJWklORywgJnBvcnRwLT5zdGF0ZSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPnJhd193YWl0KTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybihyYyk7CisJfQorCisvKgorICoJQ2hlY2sgaWYgdGhpcyBwb3J0IGlzIGluIHRoZSBtaWRkbGUgb2YgY2xvc2luZy4gSWYgc28gdGhlbiB3YWl0CisgKgl1bnRpbCBpdCBpcyBjbG9zZWQgdGhlbiByZXR1cm4gZXJyb3Igc3RhdHVzLCBiYXNlZCBvbiBmbGFnIHNldHRpbmdzLgorICoJVGhlIHNsZWVwIGhlcmUgZG9lcyBub3QgbmVlZCBpbnRlcnJ1cHQgcHJvdGVjdGlvbiBzaW5jZSB0aGUgd2FrZXVwCisgKglmb3IgaXQgaXMgZG9uZSB3aXRoIHRoZSBzYW1lIGNvbnRleHQuCisgKi8KKwlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgeworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZwb3J0cC0+Y2xvc2Vfd2FpdCk7CisJCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJcmV0dXJuKC1FQUdBSU4pOworCQlyZXR1cm4oLUVSRVNUQVJUU1lTKTsKKwl9CisKKy8qCisgKglCYXNlZCBvbiB0eXBlIG9mIG9wZW4gYmVpbmcgZG9uZSBjaGVjayBpZiBpdCBjYW4gb3ZlcmxhcCB3aXRoIGFueQorICoJcHJldmlvdXMgb3BlbnMgc3RpbGwgaW4gZWZmZWN0LiBJZiB3ZSBhcmUgYSBub3JtYWwgc2VyaWFsIGRldmljZQorICoJdGhlbiBhbHNvIHdlIG1pZ2h0IGhhdmUgdG8gd2FpdCBmb3IgY2Fycmllci4KKyAqLworCWlmICghKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgeworCQlpZiAoKHJjID0gc3RsaV93YWl0Y2FycmllcihicmRwLCBwb3J0cCwgZmlscCkpICE9IDApCisJCQlyZXR1cm4ocmMpOworCX0KKwlwb3J0cC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJc3RsaXBvcnRfdAkqcG9ydHA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX2Nsb3NlKHR0eT0leCxmaWxwPSV4KVxuIiwgKGludCkgdHR5LCAoaW50KSBmaWxwKTsKKyNlbmRpZgorCisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKHBvcnRwLT5yZWZjb3VudCAhPSAxKSkKKwkJcG9ydHAtPnJlZmNvdW50ID0gMTsKKwlpZiAocG9ydHAtPnJlZmNvdW50LS0gPiAxKSB7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJcG9ydHAtPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisKKy8qCisgKglNYXkgd2FudCB0byB3YWl0IGZvciBkYXRhIHRvIGRyYWluIGJlZm9yZSBjbG9zaW5nLiBUaGUgQlVTWSBmbGFnCisgKglrZWVwcyB0cmFjayBvZiB3aGV0aGVyIHdlIGFyZSBzdGlsbCB0cmFuc21pdHRpbmcgb3Igbm90LiBJdCBpcworICoJdXBkYXRlZCBieSBtZXNzYWdlcyBmcm9tIHRoZSBzbGF2ZSAtIGluZGljYXRpbmcgd2hlbiBhbGwgY2hhcnMKKyAqCXJlYWxseSBoYXZlIGRyYWluZWQuCisgKi8KKwlpZiAodHR5ID09IHN0bGlfdHhjb29rdHR5KQorCQlzdGxpX2ZsdXNoY2hhcnModHR5KTsKKwl0dHktPmNsb3NpbmcgPSAxOworCWlmIChwb3J0cC0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQorCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgcG9ydHAtPmNsb3Npbmdfd2FpdCk7CisKKwlwb3J0cC0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlzdGxpX3Jhd2Nsb3NlKGJyZHAsIHBvcnRwLCAwLCAwKTsKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpIHsKKwkJc3RsaV9ta2FzeXNpZ3MoJnBvcnRwLT5hc2lnLCAwLCAwKTsKKwkJaWYgKHRlc3RfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSkpCisJCQlzZXRfYml0KFNUX0RPU0lHUywgJnBvcnRwLT5zdGF0ZSk7CisJCWVsc2UKKwkJCXN0bGlfc2VuZGNtZChicmRwLCBwb3J0cCwgQV9TRVRTSUdOQUxTLCAmcG9ydHAtPmFzaWcsCisJCQkJc2l6ZW9mKGFzeXNpZ3NfdCksIDApOworCX0KKwljbGVhcl9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKTsKKwljbGVhcl9iaXQoU1RfUlhTVE9QLCAmcG9ydHAtPnN0YXRlKTsKKwlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOworCWlmICh0dHktPmxkaXNjLmZsdXNoX2J1ZmZlcikKKwkJKHR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyKSh0dHkpOworCXNldF9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKTsKKwlzdGxpX2ZsdXNoYnVmZmVyKHR0eSk7CisKKwl0dHktPmNsb3NpbmcgPSAwOworCXBvcnRwLT50dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTDsKKworCWlmIChwb3J0cC0+b3BlbndhaXRjbnQpIHsKKwkJaWYgKHBvcnRwLT5jbG9zZV9kZWxheSkKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MocG9ydHAtPmNsb3NlX2RlbGF5KSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPm9wZW5fd2FpdCk7CisJfQorCisJcG9ydHAtPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRXxBU1lOQ19DTE9TSU5HKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5jbG9zZV93YWl0KTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQ2Fycnkgb3V0IGZpcnN0IG9wZW4gb3BlcmF0aW9ucyBvbiBhIHBvcnQuIFRoaXMgaW52b2x2ZXMgYSBudW1iZXIgb2YKKyAqCWNvbW1hbmRzIHRvIGJlIHNlbnQgdG8gdGhlIHNsYXZlLiBXZSBuZWVkIHRvIG9wZW4gdGhlIHBvcnQsIHNldCB0aGUKKyAqCW5vdGlmaWNhdGlvbiBldmVudHMsIHNldCB0aGUgaW5pdGlhbCBwb3J0IHNldHRpbmdzLCBnZXQgYW5kIHNldCB0aGUKKyAqCWluaXRpYWwgc2lnbmFsIHZhbHVlcy4gV2Ugc2xlZXAgYW5kIHdhaXQgaW4gYmV0d2VlbiBlYWNoIG9uZS4gQnV0CisgKgl0aGlzIHN0aWxsIGFsbCBoYXBwZW5zIHByZXR0eSBxdWlja2x5LgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9pbml0b3BlbihzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwKQoreworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJYXN5bm90aWZ5X3QJCW50OworCWFzeXBvcnRfdAkJYXBvcnQ7CisJaW50CQkJcmM7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9pbml0b3BlbihicmRwPSV4LHBvcnRwPSV4KVxuIiwgKGludCkgYnJkcCwgKGludCkgcG9ydHApOworI2VuZGlmCisKKwlpZiAoKHJjID0gc3RsaV9yYXdvcGVuKGJyZHAsIHBvcnRwLCAwLCAxKSkgPCAwKQorCQlyZXR1cm4ocmMpOworCisJbWVtc2V0KCZudCwgMCwgc2l6ZW9mKGFzeW5vdGlmeV90KSk7CisJbnQuZGF0YSA9IChEVF9UWExPVyB8IERUX1RYRU1QVFkgfCBEVF9SWEJVU1kgfCBEVF9SWEJSRUFLKTsKKwludC5zaWduYWwgPSBTR19EQ0Q7CisJaWYgKChyYyA9IHN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9TRVROT1RJRlksICZudCwKKwkgICAgc2l6ZW9mKGFzeW5vdGlmeV90KSwgMCkpIDwgMCkKKwkJcmV0dXJuKHJjKTsKKworCXR0eSA9IHBvcnRwLT50dHk7CisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCXN0bGlfbWthc3lwb3J0KHBvcnRwLCAmYXBvcnQsIHR0eS0+dGVybWlvcyk7CisJaWYgKChyYyA9IHN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9TRVRQT1JULCAmYXBvcnQsCisJICAgIHNpemVvZihhc3lwb3J0X3QpLCAwKSkgPCAwKQorCQlyZXR1cm4ocmMpOworCisJc2V0X2JpdChTVF9HRVRTSUdTLCAmcG9ydHAtPnN0YXRlKTsKKwlpZiAoKHJjID0gc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX0dFVFNJR05BTFMsICZwb3J0cC0+YXNpZywKKwkgICAgc2l6ZW9mKGFzeXNpZ3NfdCksIDEpKSA8IDApCisJCXJldHVybihyYyk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVF9HRVRTSUdTLCAmcG9ydHAtPnN0YXRlKSkKKwkJcG9ydHAtPnNpZ3MgPSBzdGxpX21rdGlvY20ocG9ydHAtPmFzaWcuc2lndmFsdWUpOworCXN0bGlfbWthc3lzaWdzKCZwb3J0cC0+YXNpZywgMSwgMSk7CisJaWYgKChyYyA9IHN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9TRVRTSUdOQUxTLCAmcG9ydHAtPmFzaWcsCisJICAgIHNpemVvZihhc3lzaWdzX3QpLCAwKSkgPCAwKQorCQlyZXR1cm4ocmMpOworCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTZW5kIGFuIG9wZW4gbWVzc2FnZSB0byB0aGUgc2xhdmUuIFRoaXMgd2lsbCBzbGVlcCB3YWl0aW5nIGZvciB0aGUKKyAqCWFja25vd2xlZGdlbWVudCwgc28gbXVzdCBoYXZlIHVzZXIgY29udGV4dC4gV2UgbmVlZCB0byBjby1vcmRpbmF0ZQorICoJd2l0aCBjbG9zZSBldmVudHMgaGVyZSwgc2luY2Ugd2UgZG9uJ3Qgd2FudCBvcGVuIGFuZCBjbG9zZSBldmVudHMKKyAqCXRvIG92ZXJsYXAuCisgKi8KKworc3RhdGljIGludCBzdGxpX3Jhd29wZW4oc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCB3YWl0KQoreworCXZvbGF0aWxlIGNka2hkcl90CSpoZHJwOworCXZvbGF0aWxlIGNka2N0cmxfdAkqY3A7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqYml0czsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlpbnQJCQlyYzsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX3Jhd29wZW4oYnJkcD0leCxwb3J0cD0leCxhcmc9JXgsd2FpdD0lZClcbiIsCisJCShpbnQpIGJyZHAsIChpbnQpIHBvcnRwLCAoaW50KSBhcmcsIHdhaXQpOworI2VuZGlmCisKKy8qCisgKglTZW5kIGEgbWVzc2FnZSB0byB0aGUgc2xhdmUgdG8gb3BlbiB0aGlzIHBvcnQuCisgKi8KKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworLyoKKyAqCVNsYXZlIGlzIGFscmVhZHkgY2xvc2luZyB0aGlzIHBvcnQuIFRoaXMgY2FuIGhhcHBlbiBpZiBhIGhhbmd1cAorICoJb2NjdXJzIG9uIHRoaXMgcG9ydC4gU28gd2UgbXVzdCB3YWl0IHVudGlsIGl0IGlzIGNvbXBsZXRlLiBUaGUKKyAqCW9yZGVyIG9mIG9wZW5zIGFuZCBjbG9zZXMgbWF5IG5vdCBiZSBwcmVzZXJ2ZWQgYWNyb3NzIHNoYXJlZAorICoJbWVtb3J5LCBzbyB3ZSBtdXN0IHdhaXQgdW50aWwgaXQgaXMgY29tcGxldGUuCisgKi8KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocG9ydHAtPnJhd193YWl0LAorCQkJIXRlc3RfYml0KFNUX0NMT1NJTkcsICZwb3J0cC0+c3RhdGUpKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisvKgorICoJRXZlcnl0aGluZyBpcyByZWFkeSBub3csIHNvIHdyaXRlIHRoZSBvcGVuIG1lc3NhZ2UgaW50byBzaGFyZWQKKyAqCW1lbW9yeS4gT25jZSB0aGUgbWVzc2FnZSBpcyBpbiBzZXQgdGhlIHNlcnZpY2UgYml0cyB0byBzYXkgdGhhdAorICoJdGhpcyBwb3J0IHdhbnRzIHNlcnZpY2UuCisgKi8KKwlFQlJERU5BQkxFKGJyZHApOworCWNwID0gJigodm9sYXRpbGUgY2RrYXN5X3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+YWRkcikpLT5jdHJsOworCWNwLT5vcGVuYXJnID0gYXJnOworCWNwLT5vcGVuID0gMTsKKwloZHJwID0gKHZvbGF0aWxlIGNka2hkcl90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgQ0RLX0NES0FERFIpOworCWJpdHMgPSAoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgaGRycCkgKyBicmRwLT5zbGF2ZW9mZnNldCArCisJCXBvcnRwLT5wb3J0aWR4OworCSpiaXRzIHw9IHBvcnRwLT5wb3J0Yml0OworCUVCUkRESVNBQkxFKGJyZHApOworCisJaWYgKHdhaXQgPT0gMCkgeworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuKDApOworCX0KKworLyoKKyAqCVNsYXZlIGlzIGluIGFjdGlvbiwgc28gbm93IHdlIG11c3Qgd2FpdCBmb3IgdGhlIG9wZW4gYWNrbm93bGVkZ21lbnQKKyAqCXRvIGNvbWUgYmFjay4KKyAqLworCXJjID0gMDsKKwlzZXRfYml0KFNUX09QRU5JTkcsICZwb3J0cC0+c3RhdGUpOworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwb3J0cC0+cmF3X3dhaXQsCisJCQkhdGVzdF9iaXQoU1RfT1BFTklORywgJnBvcnRwLT5zdGF0ZSkpOworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmMgPSAtRVJFU1RBUlRTWVM7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlpZiAoKHJjID09IDApICYmIChwb3J0cC0+cmMgIT0gMCkpCisJCXJjID0gLUVJTzsKKwlyZXR1cm4ocmMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTZW5kIGEgY2xvc2UgbWVzc2FnZSB0byB0aGUgc2xhdmUuIE5vcm1hbGx5IHRoaXMgd2lsbCBzbGVlcCB3YWl0aW5nCisgKglmb3IgdGhlIGFja25vd2xlZGdlbWVudCwgYnV0IGlmIHdhaXQgcGFyYW1ldGVyIGlzIDAgaXQgd2lsbCBub3QuIElmCisgKgl3YWl0IGlzIHRydWUgdGhlbiBtdXN0IGhhdmUgdXNlciBjb250ZXh0ICh0byBzbGVlcCkuCisgKi8KKworc3RhdGljIGludCBzdGxpX3Jhd2Nsb3NlKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgd2FpdCkKK3sKKwl2b2xhdGlsZSBjZGtoZHJfdAkqaGRycDsKKwl2b2xhdGlsZSBjZGtjdHJsX3QJKmNwOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKmJpdHM7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJaW50CQkJcmM7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9yYXdjbG9zZShicmRwPSV4LHBvcnRwPSV4LGFyZz0leCx3YWl0PSVkKVxuIiwKKwkJKGludCkgYnJkcCwgKGludCkgcG9ydHAsIChpbnQpIGFyZywgd2FpdCk7CisjZW5kaWYKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisvKgorICoJU2xhdmUgaXMgYWxyZWFkeSBjbG9zaW5nIHRoaXMgcG9ydC4gVGhpcyBjYW4gaGFwcGVuIGlmIGEgaGFuZ3VwCisgKglvY2N1cnMgb24gdGhpcyBwb3J0LgorICovCisJaWYgKHdhaXQpIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnRwLT5yYXdfd2FpdCwKKwkJCQkhdGVzdF9iaXQoU1RfQ0xPU0lORywgJnBvcnRwLT5zdGF0ZSkpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCX0KKworLyoKKyAqCVdyaXRlIHRoZSBjbG9zZSBjb21tYW5kIGludG8gc2hhcmVkIG1lbW9yeS4KKyAqLworCUVCUkRFTkFCTEUoYnJkcCk7CisJY3AgPSAmKCh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKSktPmN0cmw7CisJY3AtPmNsb3NlYXJnID0gYXJnOworCWNwLT5jbG9zZSA9IDE7CisJaGRycCA9ICh2b2xhdGlsZSBjZGtoZHJfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIENES19DREtBRERSKTsKKwliaXRzID0gKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIGhkcnApICsgYnJkcC0+c2xhdmVvZmZzZXQgKworCQlwb3J0cC0+cG9ydGlkeDsKKwkqYml0cyB8PSBwb3J0cC0+cG9ydGJpdDsKKwlFQlJERElTQUJMRShicmRwKTsKKworCXNldF9iaXQoU1RfQ0xPU0lORywgJnBvcnRwLT5zdGF0ZSk7CisJaWYgKHdhaXQgPT0gMCkgeworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuKDApOworCX0KKworLyoKKyAqCVNsYXZlIGlzIGluIGFjdGlvbiwgc28gbm93IHdlIG11c3Qgd2FpdCBmb3IgdGhlIG9wZW4gYWNrbm93bGVkZ21lbnQKKyAqCXRvIGNvbWUgYmFjay4KKyAqLworCXJjID0gMDsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocG9ydHAtPnJhd193YWl0LAorCQkJIXRlc3RfYml0KFNUX0NMT1NJTkcsICZwb3J0cC0+c3RhdGUpKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJjID0gLUVSRVNUQVJUU1lTOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJaWYgKChyYyA9PSAwKSAmJiAocG9ydHAtPnJjICE9IDApKQorCQlyYyA9IC1FSU87CisJcmV0dXJuKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2VuZCBhIGNvbW1hbmQgdG8gdGhlIHNsYXZlIGFuZCB3YWl0IGZvciB0aGUgcmVzcG9uc2UuIFRoaXMgbXVzdAorICoJaGF2ZSB1c2VyIGNvbnRleHQgKGl0IHNsZWVwcykuIFRoaXMgcm91dGluZSBpcyBnZW5lcmljIGluIHRoYXQgaXQKKyAqCWNhbiBzZW5kIGFueSB0eXBlIG9mIGNvbW1hbmQuIEl0cyBwdXJwb3NlIGlzIHRvIHdhaXQgZm9yIHRoYXQgY29tbWFuZAorICoJdG8gY29tcGxldGUgKGFzIG9wcG9zZWQgdG8gaW5pdGlhdGluZyB0aGUgY29tbWFuZCB0aGVuIHJldHVybmluZykuCisgKi8KKworc3RhdGljIGludCBzdGxpX2NtZHdhaXQoc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKmFyZywgaW50IHNpemUsIGludCBjb3B5YmFjaykKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfY21kd2FpdChicmRwPSV4LHBvcnRwPSV4LGNtZD0leCxhcmc9JXgsc2l6ZT0lZCwiCisJCSJjb3B5YmFjaz0lZClcbiIsIChpbnQpIGJyZHAsIChpbnQpIHBvcnRwLCAoaW50KSBjbWQsCisJCShpbnQpIGFyZywgc2l6ZSwgY29weWJhY2spOworI2VuZGlmCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocG9ydHAtPnJhd193YWl0LAorCQkJIXRlc3RfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSkpOworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisKKwlzdGxpX3NlbmRjbWQoYnJkcCwgcG9ydHAsIGNtZCwgYXJnLCBzaXplLCBjb3B5YmFjayk7CisKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocG9ydHAtPnJhd193YWl0LAorCQkJIXRlc3RfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSkpOworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlpZiAocG9ydHAtPnJjICE9IDApCisJCXJldHVybigtRUlPKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNlbmQgdGhlIHRlcm1pb3Mgc2V0dGluZ3MgZm9yIHRoaXMgcG9ydCB0byB0aGUgc2xhdmUuIFRoaXMgc2xlZXBzCisgKgl3YWl0aW5nIGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAtIHNvIG11c3QgaGF2ZSB1c2VyIGNvbnRleHQuCisgKi8KKworc3RhdGljIGludCBzdGxpX3NldHBvcnQoc3RsaXBvcnRfdCAqcG9ydHApCit7CisJc3RsaWJyZF90CSpicmRwOworCWFzeXBvcnRfdAlhcG9ydDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX3NldHBvcnQocG9ydHA9JXgpXG4iLCAoaW50KSBwb3J0cCk7CisjZW5kaWYKKworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKHBvcnRwLT50dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwlpZiAoKHBvcnRwLT5icmRuciA8IDApICYmIChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpKQorCQlyZXR1cm4oLUVOT0RFVik7CisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJc3RsaV9ta2FzeXBvcnQocG9ydHAsICZhcG9ydCwgcG9ydHAtPnR0eS0+dGVybWlvcyk7CisJcmV0dXJuKHN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9TRVRQT1JULCAmYXBvcnQsIHNpemVvZihhc3lwb3J0X3QpLCAwKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVBvc3NpYmx5IG5lZWQgdG8gd2FpdCBmb3IgY2FycmllciAoRENEIHNpZ25hbCkgdG8gY29tZSBoaWdoLiBTYXkKKyAqCW1heWJlIGJlY2F1c2UgaWYgd2UgYXJlIGNsb2NhbCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gd2FpdC4uLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV93YWl0Y2FycmllcihzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludAkJcmMsIGRvY2xvY2FsOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfd2FpdGNhcnJpZXIoYnJkcD0leCxwb3J0cD0leCxmaWxwPSV4KVxuIiwKKwkJKGludCkgYnJkcCwgKGludCkgcG9ydHAsIChpbnQpIGZpbHApOworI2VuZGlmCisKKwlyYyA9IDA7CisJZG9jbG9jYWwgPSAwOworCisJaWYgKHBvcnRwLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCisJCWRvY2xvY2FsKys7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlwb3J0cC0+b3BlbndhaXRjbnQrKzsKKwlpZiAoISB0dHlfaHVuZ191cF9wKGZpbHApKQorCQlwb3J0cC0+cmVmY291bnQtLTsKKworCWZvciAoOzspIHsKKwkJc3RsaV9ta2FzeXNpZ3MoJnBvcnRwLT5hc2lnLCAxLCAxKTsKKwkJaWYgKChyYyA9IHN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9TRVRTSUdOQUxTLAorCQkgICAgJnBvcnRwLT5hc2lnLCBzaXplb2YoYXN5c2lnc190KSwgMCkpIDwgMCkKKwkJCWJyZWFrOworCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fAorCQkgICAgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgPT0gMCkpIHsKKwkJCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJCXJjID0gLUVCVVNZOworCQkJZWxzZQorCQkJCXJjID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCgocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgPT0gMCkgJiYKKwkJICAgIChkb2Nsb2NhbCB8fCAocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkpKSB7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJjID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydHAtPm9wZW5fd2FpdCk7CisJfQorCisJaWYgKCEgdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcG9ydHAtPnJlZmNvdW50Kys7CisJcG9ydHAtPm9wZW53YWl0Y250LS07CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlyZXR1cm4ocmMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglXcml0ZSByb3V0aW5lLiBUYWtlIHRoZSBkYXRhIGFuZCBwdXQgaXQgaW4gdGhlIHNoYXJlZCBtZW1vcnkgcmluZworICoJcXVldWUuIElmIHBvcnQgaXMgbm90IGFscmVhZHkgc2VuZGluZyBjaGFycyB0aGVuIG5lZWQgdG8gbWFyayB0aGUKKyAqCXNlcnZpY2UgYml0cyBmb3IgdGhpcyBwb3J0LgorICovCisKK3N0YXRpYyBpbnQgc3RsaV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwl2b2xhdGlsZSBjZGthc3lfdAkqYXA7CisJdm9sYXRpbGUgY2RraGRyX3QJKmhkcnA7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqYml0czsKKwl1bnNpZ25lZCBjaGFyCQkqc2hidWYsICpjaGJ1ZjsKKwlzdGxpcG9ydF90CQkqcG9ydHA7CisJc3RsaWJyZF90CQkqYnJkcDsKKwl1bnNpZ25lZCBpbnQJCWxlbiwgc3RsZW4sIGhlYWQsIHRhaWwsIHNpemU7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV93cml0ZSh0dHk9JXgsYnVmPSV4LGNvdW50PSVkKVxuIiwKKwkJKGludCkgdHR5LCAoaW50KSBidWYsIGNvdW50KTsKKyNlbmRpZgorCisJaWYgKCh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpIHx8CisJICAgIChzdGxpX3RtcHdyaXRlYnVmID09IChjaGFyICopIE5VTEwpKQorCQlyZXR1cm4oMCk7CisJaWYgKHR0eSA9PSBzdGxpX3R4Y29va3R0eSkKKwkJc3RsaV9mbHVzaGNoYXJzKHR0eSk7CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuKDApOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybigwKTsKKwljaGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZjsKKworLyoKKyAqCUFsbCBkYXRhIGlzIG5vdyBsb2NhbCwgc2hvdmUgYXMgbXVjaCBhcyBwb3NzaWJsZSBpbnRvIHNoYXJlZCBtZW1vcnkuCisgKi8KKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlFQlJERU5BQkxFKGJyZHApOworCWFwID0gKHZvbGF0aWxlIGNka2FzeV90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPmFkZHIpOworCWhlYWQgPSAodW5zaWduZWQgaW50KSBhcC0+dHhxLmhlYWQ7CisJdGFpbCA9ICh1bnNpZ25lZCBpbnQpIGFwLT50eHEudGFpbDsKKwlpZiAodGFpbCAhPSAoKHVuc2lnbmVkIGludCkgYXAtPnR4cS50YWlsKSkKKwkJdGFpbCA9ICh1bnNpZ25lZCBpbnQpIGFwLT50eHEudGFpbDsKKwlzaXplID0gcG9ydHAtPnR4c2l6ZTsKKwlpZiAoaGVhZCA+PSB0YWlsKSB7CisJCWxlbiA9IHNpemUgLSAoaGVhZCAtIHRhaWwpIC0gMTsKKwkJc3RsZW4gPSBzaXplIC0gaGVhZDsKKwl9IGVsc2UgeworCQlsZW4gPSB0YWlsIC0gaGVhZCAtIDE7CisJCXN0bGVuID0gbGVuOworCX0KKworCWxlbiA9IE1JTihsZW4sIGNvdW50KTsKKwljb3VudCA9IDA7CisJc2hidWYgPSAoY2hhciAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT50eG9mZnNldCk7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQlzdGxlbiA9IE1JTihsZW4sIHN0bGVuKTsKKwkJbWVtY3B5KChzaGJ1ZiArIGhlYWQpLCBjaGJ1Ziwgc3RsZW4pOworCQljaGJ1ZiArPSBzdGxlbjsKKwkJbGVuIC09IHN0bGVuOworCQljb3VudCArPSBzdGxlbjsKKwkJaGVhZCArPSBzdGxlbjsKKwkJaWYgKGhlYWQgPj0gc2l6ZSkgeworCQkJaGVhZCA9IDA7CisJCQlzdGxlbiA9IHRhaWw7CisJCX0KKwl9CisKKwlhcCA9ICh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKTsKKwlhcC0+dHhxLmhlYWQgPSBoZWFkOworCWlmICh0ZXN0X2JpdChTVF9UWEJVU1ksICZwb3J0cC0+c3RhdGUpKSB7CisJCWlmIChhcC0+Y2hhbmdlZC5kYXRhICYgRFRfVFhFTVBUWSkKKwkJCWFwLT5jaGFuZ2VkLmRhdGEgJj0gfkRUX1RYRU1QVFk7CisJfQorCWhkcnAgPSAodm9sYXRpbGUgY2RraGRyX3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBDREtfQ0RLQUREUik7CisJYml0cyA9ICgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBoZHJwKSArIGJyZHAtPnNsYXZlb2Zmc2V0ICsKKwkJcG9ydHAtPnBvcnRpZHg7CisJKmJpdHMgfD0gcG9ydHAtPnBvcnRiaXQ7CisJc2V0X2JpdChTVF9UWEJVU1ksICZwb3J0cC0+c3RhdGUpOworCUVCUkRESVNBQkxFKGJyZHApOworCisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlyZXR1cm4oY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglPdXRwdXQgYSBzaW5nbGUgY2hhcmFjdGVyLiBXZSBwdXQgaXQgaW50byBhIHRlbXBvcmFyeSBsb2NhbCBidWZmZXIKKyAqCShmb3Igc3BlZWQpIHRoZW4gd3JpdGUgb3V0IHRoYXQgYnVmZmVyIHdoZW4gdGhlIGZsdXNoY2hhcnMgcm91dGluZQorICoJaXMgY2FsbGVkLiBUaGVyZSBpcyBhIHNhZmV0eSBjYXRjaCBoZXJlIHNvIHRoYXQgaWYgc29tZSBvdGhlciBwb3J0CisgKgl3cml0ZXMgY2hhcnMgYmVmb3JlIHRoZSBjdXJyZW50IGJ1ZmZlciBoYXMgYmVlbiwgdGhlbiB3ZSB3cml0ZSB0aGVtCisgKglmaXJzdCB0aGVtIGRvIHRoZSBuZXcgcG9ydHMuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9wdXRjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfcHV0Y2hhcih0dHk9JXgsY2g9JXgpXG4iLCAoaW50KSB0dHksIChpbnQpIGNoKTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmICh0dHkgIT0gc3RsaV90eGNvb2t0dHkpIHsKKwkJaWYgKHN0bGlfdHhjb29rdHR5ICE9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQkJc3RsaV9mbHVzaGNoYXJzKHN0bGlfdHhjb29rdHR5KTsKKwkJc3RsaV90eGNvb2t0dHkgPSB0dHk7CisJfQorCisJc3RsaV90eGNvb2tidWZbc3RsaV90eGNvb2tzaXplKytdID0gY2g7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVRyYW5zZmVyIGNoYXJhY3RlcnMgZnJvbSB0aGUgbG9jYWwgVFggY29va2luZyBidWZmZXIgdG8gdGhlIGJvYXJkLgorICoJV2Ugc29ydCBvZiBpZ25vcmUgdGhlIHR0eSB0aGF0IGdldHMgcGFzc2VkIGluIGhlcmUuIFdlIHJlbHkgb24gdGhlCisgKglpbmZvIHN0b3JlZCB3aXRoIHRoZSBUWCBjb29rIGJ1ZmZlciB0byB0ZWxsIHVzIHdoaWNoIHBvcnQgdG8gZmx1c2gKKyAqCXRoZSBkYXRhIG9uLiBJbiBhbnkgY2FzZSB3ZSBjbGVhbiBvdXQgdGhlIFRYIGNvb2sgYnVmZmVyLCBmb3IgcmUtdXNlCisgKglieSBzb21lb25lIGVsc2UuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9mbHVzaGNoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdm9sYXRpbGUgY2RraGRyX3QJKmhkcnA7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqYml0czsKKwl2b2xhdGlsZSBjZGthc3lfdAkqYXA7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKmNvb2t0dHk7CisJc3RsaXBvcnRfdAkJKnBvcnRwOworCXN0bGlicmRfdAkJKmJyZHA7CisJdW5zaWduZWQgaW50CQlsZW4sIHN0bGVuLCBoZWFkLCB0YWlsLCBzaXplLCBjb3VudCwgY29va3NpemU7CisJdW5zaWduZWQgY2hhcgkJKmJ1ZiwgKnNoYnVmOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfZmx1c2hjaGFycyh0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwljb29rc2l6ZSA9IHN0bGlfdHhjb29rc2l6ZTsKKwljb29rdHR5ID0gc3RsaV90eGNvb2t0dHk7CisJc3RsaV90eGNvb2tzaXplID0gMDsKKwlzdGxpX3R4Y29va3JlYWxzaXplID0gMDsKKwlzdGxpX3R4Y29va3R0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMOworCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmIChjb29rdHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJaWYgKHR0eSAhPSBjb29rdHR5KQorCQl0dHkgPSBjb29rdHR5OworCWlmIChjb29rc2l6ZSA9PSAwKQorCQlyZXR1cm47CisKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwlpZiAoKHBvcnRwLT5icmRuciA8IDApIHx8IChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpKQorCQlyZXR1cm47CisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJRUJSREVOQUJMRShicmRwKTsKKworCWFwID0gKHZvbGF0aWxlIGNka2FzeV90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPmFkZHIpOworCWhlYWQgPSAodW5zaWduZWQgaW50KSBhcC0+dHhxLmhlYWQ7CisJdGFpbCA9ICh1bnNpZ25lZCBpbnQpIGFwLT50eHEudGFpbDsKKwlpZiAodGFpbCAhPSAoKHVuc2lnbmVkIGludCkgYXAtPnR4cS50YWlsKSkKKwkJdGFpbCA9ICh1bnNpZ25lZCBpbnQpIGFwLT50eHEudGFpbDsKKwlzaXplID0gcG9ydHAtPnR4c2l6ZTsKKwlpZiAoaGVhZCA+PSB0YWlsKSB7CisJCWxlbiA9IHNpemUgLSAoaGVhZCAtIHRhaWwpIC0gMTsKKwkJc3RsZW4gPSBzaXplIC0gaGVhZDsKKwl9IGVsc2UgeworCQlsZW4gPSB0YWlsIC0gaGVhZCAtIDE7CisJCXN0bGVuID0gbGVuOworCX0KKworCWxlbiA9IE1JTihsZW4sIGNvb2tzaXplKTsKKwljb3VudCA9IDA7CisJc2hidWYgPSAoY2hhciAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT50eG9mZnNldCk7CisJYnVmID0gc3RsaV90eGNvb2tidWY7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQlzdGxlbiA9IE1JTihsZW4sIHN0bGVuKTsKKwkJbWVtY3B5KChzaGJ1ZiArIGhlYWQpLCBidWYsIHN0bGVuKTsKKwkJYnVmICs9IHN0bGVuOworCQlsZW4gLT0gc3RsZW47CisJCWNvdW50ICs9IHN0bGVuOworCQloZWFkICs9IHN0bGVuOworCQlpZiAoaGVhZCA+PSBzaXplKSB7CisJCQloZWFkID0gMDsKKwkJCXN0bGVuID0gdGFpbDsKKwkJfQorCX0KKworCWFwID0gKHZvbGF0aWxlIGNka2FzeV90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPmFkZHIpOworCWFwLT50eHEuaGVhZCA9IGhlYWQ7CisKKwlpZiAodGVzdF9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKSkgeworCQlpZiAoYXAtPmNoYW5nZWQuZGF0YSAmIERUX1RYRU1QVFkpCisJCQlhcC0+Y2hhbmdlZC5kYXRhICY9IH5EVF9UWEVNUFRZOworCX0KKwloZHJwID0gKHZvbGF0aWxlIGNka2hkcl90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgQ0RLX0NES0FERFIpOworCWJpdHMgPSAoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgaGRycCkgKyBicmRwLT5zbGF2ZW9mZnNldCArCisJCXBvcnRwLT5wb3J0aWR4OworCSpiaXRzIHw9IHBvcnRwLT5wb3J0Yml0OworCXNldF9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKTsKKworCUVCUkRESVNBQkxFKGJyZHApOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgc3RsaV93cml0ZXJvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwl2b2xhdGlsZSBjZGthc3lycV90CSpycDsKKwlzdGxpcG9ydF90CQkqcG9ydHA7CisJc3RsaWJyZF90CQkqYnJkcDsKKwl1bnNpZ25lZCBpbnQJCWhlYWQsIHRhaWwsIGxlbjsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX3dyaXRlcm9vbSh0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJaWYgKHR0eSA9PSBzdGxpX3R4Y29va3R0eSkgeworCQlpZiAoc3RsaV90eGNvb2tyZWFsc2l6ZSAhPSAwKSB7CisJCQlsZW4gPSBzdGxpX3R4Y29va3JlYWxzaXplIC0gc3RsaV90eGNvb2tzaXplOworCQkJcmV0dXJuKGxlbik7CisJCX0KKwl9CisKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCXJldHVybigwKTsKKwlpZiAoKHBvcnRwLT5icmRuciA8IDApIHx8IChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpKQorCQlyZXR1cm4oMCk7CisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJRUJSREVOQUJMRShicmRwKTsKKwlycCA9ICYoKHZvbGF0aWxlIGNka2FzeV90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPmFkZHIpKS0+dHhxOworCWhlYWQgPSAodW5zaWduZWQgaW50KSBycC0+aGVhZDsKKwl0YWlsID0gKHVuc2lnbmVkIGludCkgcnAtPnRhaWw7CisJaWYgKHRhaWwgIT0gKCh1bnNpZ25lZCBpbnQpIHJwLT50YWlsKSkKKwkJdGFpbCA9ICh1bnNpZ25lZCBpbnQpIHJwLT50YWlsOworCWxlbiA9IChoZWFkID49IHRhaWwpID8gKHBvcnRwLT50eHNpemUgLSAoaGVhZCAtIHRhaWwpKSA6ICh0YWlsIC0gaGVhZCk7CisJbGVuLS07CisJRUJSRERJU0FCTEUoYnJkcCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlpZiAodHR5ID09IHN0bGlfdHhjb29rdHR5KSB7CisJCXN0bGlfdHhjb29rcmVhbHNpemUgPSBsZW47CisJCWxlbiAtPSBzdGxpX3R4Y29va3NpemU7CisJfQorCXJldHVybihsZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSB0cmFuc21pdCBidWZmZXIuIE5vcm1hbGx5IHdlCisgKgl3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBzaGFyZWQgbWVtb3J5IHJpbmcgcXVldWUuCisgKglXZSBuZWVkIHRvIGtsdWRnZSBhcm91bmQgdGhlIGNhc2Ugd2hlcmUgdGhlIHNoYXJlZCBtZW1vcnkgYnVmZmVyIGlzCisgKgllbXB0eSBidXQgbm90IGFsbCBjaGFyYWN0ZXJzIGhhdmUgZHJhaW5lZCB5ZXQsIGZvciB0aGlzIGNhc2UganVzdAorICoJcmV0dXJuIHRoYXQgdGhlcmUgaXMgMSBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciEKKyAqLworCitzdGF0aWMgaW50IHN0bGlfY2hhcnNpbmJ1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXZvbGF0aWxlIGNka2FzeXJxX3QJKnJwOworCXN0bGlwb3J0X3QJCSpwb3J0cDsKKwlzdGxpYnJkX3QJCSpicmRwOworCXVuc2lnbmVkIGludAkJaGVhZCwgdGFpbCwgbGVuOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfY2hhcnNpbmJ1ZmZlcih0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJaWYgKHR0eSA9PSBzdGxpX3R4Y29va3R0eSkKKwkJc3RsaV9mbHVzaGNoYXJzKHR0eSk7CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuKDApOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybigwKTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUVCUkRFTkFCTEUoYnJkcCk7CisJcnAgPSAmKCh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKSktPnR4cTsKKwloZWFkID0gKHVuc2lnbmVkIGludCkgcnAtPmhlYWQ7CisJdGFpbCA9ICh1bnNpZ25lZCBpbnQpIHJwLT50YWlsOworCWlmICh0YWlsICE9ICgodW5zaWduZWQgaW50KSBycC0+dGFpbCkpCisJCXRhaWwgPSAodW5zaWduZWQgaW50KSBycC0+dGFpbDsKKwlsZW4gPSAoaGVhZCA+PSB0YWlsKSA/IChoZWFkIC0gdGFpbCkgOiAocG9ydHAtPnR4c2l6ZSAtICh0YWlsIC0gaGVhZCkpOworCWlmICgobGVuID09IDApICYmIHRlc3RfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSkpCisJCWxlbiA9IDE7CisJRUJSRERJU0FCTEUoYnJkcCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlyZXR1cm4obGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJR2VuZXJhdGUgdGhlIHNlcmlhbCBzdHJ1Y3QgaW5mby4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfZ2V0c2VyaWFsKHN0bGlwb3J0X3QgKnBvcnRwLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0CXNpbzsKKwlzdGxpYnJkX3QJCSpicmRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfZ2V0c2VyaWFsKHBvcnRwPSV4LHNwPSV4KVxuIiwgKGludCkgcG9ydHAsIChpbnQpIHNwKTsKKyNlbmRpZgorCisJbWVtc2V0KCZzaW8sIDAsIHNpemVvZihzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkpOworCXNpby50eXBlID0gUE9SVF9VTktOT1dOOworCXNpby5saW5lID0gcG9ydHAtPnBvcnRucjsKKwlzaW8uaXJxID0gMDsKKwlzaW8uZmxhZ3MgPSBwb3J0cC0+ZmxhZ3M7CisJc2lvLmJhdWRfYmFzZSA9IHBvcnRwLT5iYXVkX2Jhc2U7CisJc2lvLmNsb3NlX2RlbGF5ID0gcG9ydHAtPmNsb3NlX2RlbGF5OworCXNpby5jbG9zaW5nX3dhaXQgPSBwb3J0cC0+Y2xvc2luZ193YWl0OworCXNpby5jdXN0b21fZGl2aXNvciA9IHBvcnRwLT5jdXN0b21fZGl2aXNvcjsKKwlzaW8ueG1pdF9maWZvX3NpemUgPSAwOworCXNpby5odWI2ID0gMDsKKworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCAhPSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXNpby5wb3J0ID0gYnJkcC0+aW9iYXNlOworCQkKKwlyZXR1cm4gY29weV90b191c2VyKHNwLCAmc2lvLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSA/CisJCQktRUZBVUxUIDogMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2V0IHBvcnQgYWNjb3JkaW5nIHRvIHRoZSBzZXJpYWwgc3RydWN0IGluZm8uCisgKglBdCB0aGlzIHBvaW50IHdlIGRvIG5vdCBkbyBhbnkgYXV0by1jb25maWd1cmUgc3R1ZmYsIHNvIHdlIHdpbGwKKyAqCWp1c3QgcXVpZXRseSBpZ25vcmUgYW55IHJlcXVlc3RzIHRvIGNoYW5nZSBpcnEsIGV0Yy4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfc2V0c2VyaWFsKHN0bGlwb3J0X3QgKnBvcnRwLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0CXNpbzsKKwlpbnQJCQlyYzsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX3NldHNlcmlhbChwb3J0cD0lcCxzcD0lcClcbiIsIHBvcnRwLCBzcCk7CisjZW5kaWYKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc2lvLCBzcCwgc2l6ZW9mKHN0cnVjdCBzZXJpYWxfc3RydWN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlpZiAoKHNpby5iYXVkX2Jhc2UgIT0gcG9ydHAtPmJhdWRfYmFzZSkgfHwKKwkJICAgIChzaW8uY2xvc2VfZGVsYXkgIT0gcG9ydHAtPmNsb3NlX2RlbGF5KSB8fAorCQkgICAgKChzaW8uZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spICE9CisJCSAgICAocG9ydHAtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCisJCQlyZXR1cm4oLUVQRVJNKTsKKwl9IAorCisJcG9ydHAtPmZsYWdzID0gKHBvcnRwLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAorCQkoc2lvLmZsYWdzICYgQVNZTkNfVVNSX01BU0spOworCXBvcnRwLT5iYXVkX2Jhc2UgPSBzaW8uYmF1ZF9iYXNlOworCXBvcnRwLT5jbG9zZV9kZWxheSA9IHNpby5jbG9zZV9kZWxheTsKKwlwb3J0cC0+Y2xvc2luZ193YWl0ID0gc2lvLmNsb3Npbmdfd2FpdDsKKwlwb3J0cC0+Y3VzdG9tX2Rpdmlzb3IgPSBzaW8uY3VzdG9tX2Rpdmlzb3I7CisKKwlpZiAoKHJjID0gc3RsaV9zZXRwb3J0KHBvcnRwKSkgPCAwKQorCQlyZXR1cm4ocmMpOworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHN0bGlfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RsaXBvcnRfdCAqcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCXN0bGlicmRfdCAqYnJkcDsKKwlpbnQgcmM7CisKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybigwKTsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQlyZXR1cm4oLUVJTyk7CisKKwlpZiAoKHJjID0gc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX0dFVFNJR05BTFMsCisJCQkgICAgICAgJnBvcnRwLT5hc2lnLCBzaXplb2YoYXN5c2lnc190KSwgMSkpIDwgMCkKKwkJcmV0dXJuKHJjKTsKKworCXJldHVybiBzdGxpX21rdGlvY20ocG9ydHAtPmFzaWcuc2lndmFsdWUpOworfQorCitzdGF0aWMgaW50IHN0bGlfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0bGlwb3J0X3QgKnBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdGxpYnJkX3QgKmJyZHA7CisJaW50IHJ0cyA9IC0xLCBkdHIgPSAtMTsKKworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuKDApOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybigwKTsKKwlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCXJldHVybigtRUlPKTsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCXJ0cyA9IDE7CisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJZHRyID0gMTsKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCXJ0cyA9IDA7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlkdHIgPSAwOworCisJc3RsaV9ta2FzeXNpZ3MoJnBvcnRwLT5hc2lnLCBkdHIsIHJ0cyk7CisKKwlyZXR1cm4gc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX1NFVFNJR05BTFMsICZwb3J0cC0+YXNpZywKKwkJCSAgICBzaXplb2YoYXN5c2lnc190KSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgc3RsaV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RsaXBvcnRfdAkqcG9ydHA7CisJc3RsaWJyZF90CSpicmRwOworCXVuc2lnbmVkIGludAlpdmFsOworCWludAkJcmM7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9pb2N0bCh0dHk9JXgsZmlsZT0leCxjbWQ9JXgsYXJnPSV4KVxuIiwKKwkJKGludCkgdHR5LCAoaW50KSBmaWxlLCBjbWQsIChpbnQpIGFyZyk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwlpZiAoKHBvcnRwLT5icmRuciA8IDApIHx8IChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpKQorCQlyZXR1cm4oMCk7CisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCisJaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCisgCSAgICAoY21kICE9IENPTV9HRVRQT1JUU1RBVFMpICYmIChjbWQgIT0gQ09NX0NMUlBPUlRTVEFUUykpIHsKKwkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQkJcmV0dXJuKC1FSU8pOworCX0KKworCXJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DR1NPRlRDQVI6CisJCXJjID0gcHV0X3VzZXIoKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpID8gMSA6IDApLAorCQkJKHVuc2lnbmVkIF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKwljYXNlIFRJT0NTU09GVENBUjoKKwkJaWYgKChyYyA9IGdldF91c2VyKGl2YWwsICh1bnNpZ25lZCBfX3VzZXIgKikgYXJnKSkgPT0gMCkKKwkJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9CisJCQkJKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpIHwKKwkJCQkoaXZhbCA/IENMT0NBTCA6IDApOworCQlicmVhazsKKwljYXNlIFRJT0NHU0VSSUFMOgorCQlyYyA9IHN0bGlfZ2V0c2VyaWFsKHBvcnRwLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DU1NFUklBTDoKKwkJcmMgPSBzdGxpX3NldHNlcmlhbChwb3J0cCwgYXJncCk7CisJCWJyZWFrOworCWNhc2UgU1RMX0dFVFBGTEFHOgorCQlyYyA9IHB1dF91c2VyKHBvcnRwLT5wZmxhZywgKHVuc2lnbmVkIF9fdXNlciAqKWFyZ3ApOworCQlicmVhazsKKwljYXNlIFNUTF9TRVRQRkxBRzoKKwkJaWYgKChyYyA9IGdldF91c2VyKHBvcnRwLT5wZmxhZywgKHVuc2lnbmVkIF9fdXNlciAqKWFyZ3ApKSA9PSAwKQorCQkJc3RsaV9zZXRwb3J0KHBvcnRwKTsKKwkJYnJlYWs7CisJY2FzZSBDT01fR0VUUE9SVFNUQVRTOgorCQlyYyA9IHN0bGlfZ2V0cG9ydHN0YXRzKHBvcnRwLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBDT01fQ0xSUE9SVFNUQVRTOgorCQlyYyA9IHN0bGlfY2xycG9ydHN0YXRzKHBvcnRwLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DU0VSQ09ORklHOgorCWNhc2UgVElPQ1NFUkdXSUxEOgorCWNhc2UgVElPQ1NFUlNXSUxEOgorCWNhc2UgVElPQ1NFUkdFVExTUjoKKwljYXNlIFRJT0NTRVJHU1RSVUNUOgorCWNhc2UgVElPQ1NFUkdFVE1VTFRJOgorCWNhc2UgVElPQ1NFUlNFVE1VTFRJOgorCWRlZmF1bHQ6CisJCXJjID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4ocmMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IHdlIGhhdmUgdXNlciBjb250ZXh0IGFuZCBjYW4gc2xlZXAuCisgKglMb29rcyBsaWtlIGl0IGlzIHRydWUgZm9yIHRoZSBjdXJyZW50IHR0eXMgaW1wbGVtZW50YXRpb24uLiEhCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9zZXR0ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGQpCit7CisJc3RsaXBvcnRfdAkqcG9ydHA7CisJc3RsaWJyZF90CSpicmRwOworCXN0cnVjdCB0ZXJtaW9zCSp0aW9zcDsKKwlhc3lwb3J0X3QJYXBvcnQ7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9zZXR0ZXJtaW9zKHR0eT0leCxvbGQ9JXgpXG4iLCAoaW50KSB0dHksIChpbnQpIG9sZCk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwlpZiAoKHBvcnRwLT5icmRuciA8IDApIHx8IChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpKQorCQlyZXR1cm47CisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJdGlvc3AgPSB0dHktPnRlcm1pb3M7CisJaWYgKCh0aW9zcC0+Y19jZmxhZyA9PSBvbGQtPmNfY2ZsYWcpICYmCisJICAgICh0aW9zcC0+Y19pZmxhZyA9PSBvbGQtPmNfaWZsYWcpKQorCQlyZXR1cm47CisKKwlzdGxpX21rYXN5cG9ydChwb3J0cCwgJmFwb3J0LCB0aW9zcCk7CisJc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX1NFVFBPUlQsICZhcG9ydCwgc2l6ZW9mKGFzeXBvcnRfdCksIDApOworCXN0bGlfbWthc3lzaWdzKCZwb3J0cC0+YXNpZywgKCh0aW9zcC0+Y19jZmxhZyAmIENCQVVEKSA/IDEgOiAwKSwgLTEpOworCXN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9TRVRTSUdOQUxTLCAmcG9ydHAtPmFzaWcsCisJCXNpemVvZihhc3lzaWdzX3QpLCAwKTsKKwlpZiAoKG9sZC0+Y19jZmxhZyAmIENSVFNDVFMpICYmICgodGlvc3AtPmNfY2ZsYWcgJiBDUlRTQ1RTKSA9PSAwKSkKKwkJdHR5LT5od19zdG9wcGVkID0gMDsKKwlpZiAoKChvbGQtPmNfY2ZsYWcgJiBDTE9DQUwpID09IDApICYmICh0aW9zcC0+Y19jZmxhZyAmIENMT0NBTCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPm9wZW5fd2FpdCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUF0dGVtcHQgdG8gZmxvdyBjb250cm9sIHdobyBldmVyIGlzIHNlbmRpbmcgdXMgZGF0YS4gV2Ugd29uJ3QgcmVhbGx5CisgKglkbyBhbnkgZmxvdyBjb250cm9sIGFjdGlvbiBoZXJlLiBXZSBjYW4ndCBkaXJlY3RseSwgYW5kIGV2ZW4gaWYgd2UKKyAqCXdhbnRlZCB0byB3ZSB3b3VsZCBoYXZlIHRvIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBzbGF2ZS4gVGhlIHNsYXZlCisgKglrbm93cyBob3cgdG8gZmxvdyBjb250cm9sLCBhbmQgd2lsbCBkbyBzbyB3aGVuIGl0cyBidWZmZXJzIHJlYWNoIGl0cworICoJaW50ZXJuYWwgaGlnaCB3YXRlciBtYXJrcy4gU28gd2hhdCB3ZSB3aWxsIGRvIGlzIHNldCBhIGxvY2FsIHN0YXRlCisgKgliaXQgdGhhdCB3aWxsIHN0b3AgdXMgc2VuZGluZyBhbnkgUlggZGF0YSB1cCBmcm9tIHRoZSBwb2xsIHJvdXRpbmUKKyAqCSh3aGljaCBpcyB0aGUgcGxhY2Ugd2hlcmUgUlggZGF0YSBmcm9tIHRoZSBzbGF2ZSBpcyBoYW5kbGVkKS4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RsaXBvcnRfdAkqcG9ydHA7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV90aHJvdHRsZSh0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlzZXRfYml0KFNUX1JYU1RPUCwgJnBvcnRwLT5zdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVVuZmxvdyBjb250cm9sIHRoZSBkZXZpY2Ugc2VuZGluZyB1cyBkYXRhLi4uIFRoYXQgbWVhbnMgdGhhdCBhbGwKKyAqCXdlIGhhdmUgdG8gZG8gaXMgY2xlYXIgdGhlIFJYU1RPUCBzdGF0ZSBiaXQuIFRoZSBuZXh0IHBvbGwgY2FsbAorICoJd2lsbCB0aGVuIGJlIGFibGUgdG8gcGFzcyB0aGUgUlggZGF0YSBiYWNrIHVwLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfdW50aHJvdHRsZSh0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwljbGVhcl9iaXQoU1RfUlhTVE9QLCAmcG9ydHAtPnN0YXRlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU3RvcCB0aGUgdHJhbnNtaXR0ZXIuIEJhc2ljYWxseSB0byBkbyB0aGlzIHdlIHdpbGwganVzdCB0dXJuIFRYCisgKglpbnRlcnJ1cHRzIG9mZi4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJc3RsaXBvcnRfdAkqcG9ydHA7CisJYXN5Y3RybF90CWFjdHJsOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfc3RvcCh0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybjsKKworCW1lbXNldCgmYWN0cmwsIDAsIHNpemVvZihhc3ljdHJsX3QpKTsKKwlhY3RybC50eGN0cmwgPSBDVF9TVE9QRkxPVzsKKyNpZiAwCisJc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX1BPUlRDVFJMLCAmYWN0cmwsIHNpemVvZihhc3ljdHJsX3QpLCAwKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTdGFydCB0aGUgdHJhbnNtaXR0ZXIgYWdhaW4uIEp1c3QgdHVybiBUWCBpbnRlcnJ1cHRzIGJhY2sgb24uCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCXN0bGlicmRfdAkqYnJkcDsKKwlhc3ljdHJsX3QJYWN0cmw7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9zdGFydCh0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybjsKKworCW1lbXNldCgmYWN0cmwsIDAsIHNpemVvZihhc3ljdHJsX3QpKTsKKwlhY3RybC50eGN0cmwgPSBDVF9TVEFSVEZMT1c7CisjaWYgMAorCXN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9QT1JUQ1RSTCwgJmFjdHJsLCBzaXplb2YoYXN5Y3RybF90KSwgMCk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2NoZWR1bGVyIGNhbGxlZCBoYW5nIHVwIHJvdXRpbmUuIFRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIHNjaGVkdWxlciwKKyAqCW5vdCBkaXJlY3QgZnJvbSB0aGUgZHJpdmVyICJwb2xsIiByb3V0aW5lLiBXZSBjYW4ndCBjYWxsIGl0IHRoZXJlCisgKglzaW5jZSB0aGUgcmVhbCBsb2NhbCBoYW5ndXAgY29kZSB3aWxsIGVuYWJsZS9kaXNhYmxlIHRoZSBib2FyZCBhbmQKKyAqCW90aGVyIHRoaW5ncyB0aGF0IHdlIGNhbid0IGRvIHdoaWxlIGhhbmRsaW5nIHRoZSBwb2xsLiBNdWNoIGVhc2llcgorICoJdG8gZGVhbCB3aXRoIGl0IHNvbWUgdGltZSBsYXRlciAoZG9uJ3QgcmVhbGx5IGNhcmUgd2hlbiwgaGFuZ3VwcworICoJYXJlbid0IHRoYXQgdGltZSBjcml0aWNhbCkuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9kb2hhbmd1cCh2b2lkICphcmcpCit7CisJc3RsaXBvcnRfdAkqcG9ydHA7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2RvaGFuZ3VwKHBvcnRwPSV4KVxuIiwgKGludCkgYXJnKTsKKyNlbmRpZgorCisJLyoKKwkgKiBGSVhNRTogVGhlcmUncyBhIG1vZHVsZSByZW1vdmFsIHJhY2UgaGVyZTogdHR5X2hhbmd1cAorCSAqIGNhbGxzIHNjaGVkdWxlX3dvcmsgd2hpY2ggd2lsbCBjYWxsIGludG8gdGhpcworCSAqIGRyaXZlciBsYXRlci4KKwkgKi8KKwlwb3J0cCA9IChzdGxpcG9ydF90ICopIGFyZzsKKwlpZiAocG9ydHAgIT0gKHN0bGlwb3J0X3QgKikgTlVMTCkgeworCQlpZiAocG9ydHAtPnR0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkgeworCQkJdHR5X2hhbmd1cChwb3J0cC0+dHR5KTsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSGFuZ3VwIHRoaXMgcG9ydC4gVGhpcyBpcyBwcmV0dHkgbXVjaCBsaWtlIGNsb3NpbmcgdGhlIHBvcnQsIG9ubHkKKyAqCWEgbGl0dGxlIG1vcmUgYnJ1dGFsLiBObyB3YWl0aW5nIGZvciBkYXRhIHRvIGRyYWluLiBTaHV0ZG93biB0aGUKKyAqCXBvcnQgYW5kIG1heWJlIGRyb3Agc2lnbmFscy4gVGhpcyBpcyByYXRoZXIgdHJpY2t5IHJlYWxseS4gV2Ugd2FudAorICoJdG8gY2xvc2UgdGhlIHBvcnQgYXMgd2VsbC4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCXN0bGlicmRfdAkqYnJkcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9oYW5ndXAodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybjsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlwb3J0cC0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJaWYgKCEgdGVzdF9iaXQoU1RfQ0xPU0lORywgJnBvcnRwLT5zdGF0ZSkpCisJCXN0bGlfcmF3Y2xvc2UoYnJkcCwgcG9ydHAsIDAsIDApOworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkgeworCQlzdGxpX21rYXN5c2lncygmcG9ydHAtPmFzaWcsIDAsIDApOworCQlpZiAodGVzdF9iaXQoU1RfQ01ESU5HLCAmcG9ydHAtPnN0YXRlKSkgeworCQkJc2V0X2JpdChTVF9ET1NJR1MsICZwb3J0cC0+c3RhdGUpOworCQkJc2V0X2JpdChTVF9ET0ZMVVNIVFgsICZwb3J0cC0+c3RhdGUpOworCQkJc2V0X2JpdChTVF9ET0ZMVVNIUlgsICZwb3J0cC0+c3RhdGUpOworCQl9IGVsc2UgeworCQkJc3RsaV9zZW5kY21kKGJyZHAsIHBvcnRwLCBBX1NFVFNJR05BTFNGLAorCQkJCSZwb3J0cC0+YXNpZywgc2l6ZW9mKGFzeXNpZ3NfdCksIDApOworCQl9CisJfQorCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJY2xlYXJfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSk7CisJY2xlYXJfYml0KFNUX1JYU1RPUCwgJnBvcnRwLT5zdGF0ZSk7CisJc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKKwlwb3J0cC0+dHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEw7CisJcG9ydHAtPmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOworCXBvcnRwLT5yZWZjb3VudCA9IDA7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+b3Blbl93YWl0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRmx1c2ggY2hhcmFjdGVycyBmcm9tIHRoZSBsb3dlciBidWZmZXIuIFdlIG1heSBub3QgaGF2ZSB1c2VyIGNvbnRleHQKKyAqCXNvIHdlIGNhbm5vdCBzbGVlcCB3YWl0aW5nIGZvciBpdCB0byBjb21wbGV0ZS4gQWxzbyB3ZSBuZWVkIHRvIGNoZWNrCisgKglpZiB0aGVyZSBpcyBjaGFycyBmb3IgdGhpcyBwb3J0IGluIHRoZSBUWCBjb29rIGJ1ZmZlciwgYW5kIGZsdXNoIHRoZW0KKyAqCWFzIHdlbGwuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9mbHVzaGJ1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCXN0bGlicmRfdAkqYnJkcDsKKwl1bnNpZ25lZCBsb25nCWZ0eXBlLCBmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZmx1c2hidWZmZXIodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybjsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlpZiAodHR5ID09IHN0bGlfdHhjb29rdHR5KSB7CisJCXN0bGlfdHhjb29rdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEw7CisJCXN0bGlfdHhjb29rc2l6ZSA9IDA7CisJCXN0bGlfdHhjb29rcmVhbHNpemUgPSAwOworCX0KKwlpZiAodGVzdF9iaXQoU1RfQ01ESU5HLCAmcG9ydHAtPnN0YXRlKSkgeworCQlzZXRfYml0KFNUX0RPRkxVU0hUWCwgJnBvcnRwLT5zdGF0ZSk7CisJfSBlbHNlIHsKKwkJZnR5cGUgPSBGTFVTSFRYOworCQlpZiAodGVzdF9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKSkgeworCQkJZnR5cGUgfD0gRkxVU0hSWDsKKwkJCWNsZWFyX2JpdChTVF9ET0ZMVVNIUlgsICZwb3J0cC0+c3RhdGUpOworCQl9CisJCXN0bGlfc2VuZGNtZChicmRwLCBwb3J0cCwgQV9GTFVTSCwgJmZ0eXBlLAorCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwKTsKKwl9CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJaWYgKCh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpICYmCisJICAgIHR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKQorCQkodHR5LT5sZGlzYy53cml0ZV93YWtldXApKHR0eSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9icmVha2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgc3RhdGUpCit7CisJc3RsaWJyZF90CSpicmRwOworCXN0bGlwb3J0X3QJKnBvcnRwOworCWxvbmcJCWFyZzsKKwkvKiBsb25nIHNhdmVzdGF0ZSwgc2F2ZXRpbWU7ICovCisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2JyZWFrY3RsKHR0eT0leCxzdGF0ZT0lZClcbiIsIChpbnQpIHR0eSwgc3RhdGUpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybjsKKworLyoKKyAqCUR1ZSB0byBhIGJ1ZyBpbiB0aGUgdHR5IHNlbmRfYnJlYWsoKSBjb2RlIHdlIG5lZWQgdG8gcHJlc2VydmUKKyAqCXRoZSBjdXJyZW50IHByb2Nlc3Mgc3RhdGUgYW5kIHRpbWVvdXQuLi4KKwlzYXZldGltZSA9IGN1cnJlbnQtPnRpbWVvdXQ7CisJc2F2ZXN0YXRlID0gY3VycmVudC0+c3RhdGU7CisgKi8KKworCWFyZyA9IChzdGF0ZSA9PSAtMSkgPyBCUkVBS09OIDogQlJFQUtPRkY7CisJc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX0JSRUFLLCAmYXJnLCBzaXplb2YobG9uZyksIDApOworCisvKgorICoKKwljdXJyZW50LT50aW1lb3V0ID0gc2F2ZXRpbWU7CisJY3VycmVudC0+c3RhdGUgPSBzYXZlc3RhdGU7CisgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX3dhaXR1bnRpbHNlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCit7CisJc3RsaXBvcnRfdAkqcG9ydHA7CisJdW5zaWduZWQgbG9uZwl0ZW5kOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV93YWl0dW50aWxzZW50KHR0eT0leCx0aW1lb3V0PSV4KVxuIiwgKGludCkgdHR5LCB0aW1lb3V0KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHRpbWVvdXQgPT0gMCkKKwkJdGltZW91dCA9IEhaOworCXRlbmQgPSBqaWZmaWVzICsgdGltZW91dDsKKworCXdoaWxlICh0ZXN0X2JpdChTVF9UWEJVU1ksICZwb3J0cC0+c3RhdGUpKSB7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgyMCk7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRlbmQpKQorCQkJYnJlYWs7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfc2VuZHhjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpCit7CisJc3RsaWJyZF90CSpicmRwOworCXN0bGlwb3J0X3QJKnBvcnRwOworCWFzeWN0cmxfdAlhY3RybDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfc2VuZHhjaGFyKHR0eT0leCxjaD0leClcbiIsIChpbnQpIHR0eSwgY2gpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybjsKKworCW1lbXNldCgmYWN0cmwsIDAsIHNpemVvZihhc3ljdHJsX3QpKTsKKwlpZiAoY2ggPT0gU1RPUF9DSEFSKHR0eSkpIHsKKwkJYWN0cmwucnhjdHJsID0gQ1RfU1RPUEZMT1c7CisJfSBlbHNlIGlmIChjaCA9PSBTVEFSVF9DSEFSKHR0eSkpIHsKKwkJYWN0cmwucnhjdHJsID0gQ1RfU1RBUlRGTE9XOworCX0gZWxzZSB7CisJCWFjdHJsLnR4Y3RybCA9IENUX1NFTkRDSFI7CisJCWFjdHJsLnR4aW1kY2ggPSBjaDsKKwl9CisKKwlzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfUE9SVENUUkwsICZhY3RybCwgc2l6ZW9mKGFzeWN0cmxfdCksIDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUJTUFYTElORQkJODAKKworLyoKKyAqCUZvcm1hdCBpbmZvIGZvciBhIHNwZWNpZmllZCBwb3J0LiBUaGUgbGluZSBpcyBkZWxpYmVyYXRlbHkgbGltaXRlZAorICoJdG8gODAgY2hhcmFjdGVycy4gKElmIGl0IGlzIHRvbyBsb25nIGl0IHdpbGwgYmUgdHJ1bmNhdGVkLCBpZiB0b28KKyAqCXNob3J0IHRoZW4gcGFkZGVkIHdpdGggc3BhY2VzKS4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfcG9ydGluZm8oc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgaW50IHBvcnRuciwgY2hhciAqcG9zKQoreworCWNoYXIJKnNwLCAqdWFydDsKKwlpbnQJcmMsIGNudDsKKworCXJjID0gc3RsaV9wb3J0Y21kc3RhdHMocG9ydHApOworCisJdWFydCA9ICJVTktOT1dOIjsKKwlpZiAoYnJkcC0+c3RhdGUgJiBCU1RfU1RBUlRFRCkgeworCQlzd2l0Y2ggKHN0bGlfY29tc3RhdHMuaHdpZCkgeworCQljYXNlIDA6CQl1YXJ0ID0gIjI2ODEiOyBicmVhazsKKwkJY2FzZSAxOgkJdWFydCA9ICJTQzI2MTk4IjsgYnJlYWs7CisJCWRlZmF1bHQ6CXVhcnQgPSAiQ0QxNDAwIjsgYnJlYWs7CisJCX0KKwl9CisKKwlzcCA9IHBvczsKKwlzcCArPSBzcHJpbnRmKHNwLCAiJWQ6IHVhcnQ6JXMgIiwgcG9ydG5yLCB1YXJ0KTsKKworCWlmICgoYnJkcC0+c3RhdGUgJiBCU1RfU1RBUlRFRCkgJiYgKHJjID49IDApKSB7CisJCXNwICs9IHNwcmludGYoc3AsICJ0eDolZCByeDolZCIsIChpbnQpIHN0bGlfY29tc3RhdHMudHh0b3RhbCwKKwkJCShpbnQpIHN0bGlfY29tc3RhdHMucnh0b3RhbCk7CisKKwkJaWYgKHN0bGlfY29tc3RhdHMucnhmcmFtaW5nKQorCQkJc3AgKz0gc3ByaW50ZihzcCwgIiBmZTolZCIsCisJCQkJKGludCkgc3RsaV9jb21zdGF0cy5yeGZyYW1pbmcpOworCQlpZiAoc3RsaV9jb21zdGF0cy5yeHBhcml0eSkKKwkJCXNwICs9IHNwcmludGYoc3AsICIgcGU6JWQiLAorCQkJCShpbnQpIHN0bGlfY29tc3RhdHMucnhwYXJpdHkpOworCQlpZiAoc3RsaV9jb21zdGF0cy5yeGJyZWFrcykKKwkJCXNwICs9IHNwcmludGYoc3AsICIgYnJrOiVkIiwKKwkJCQkoaW50KSBzdGxpX2NvbXN0YXRzLnJ4YnJlYWtzKTsKKwkJaWYgKHN0bGlfY29tc3RhdHMucnhvdmVycnVuKQorCQkJc3AgKz0gc3ByaW50ZihzcCwgIiBvZTolZCIsCisJCQkJKGludCkgc3RsaV9jb21zdGF0cy5yeG92ZXJydW4pOworCisJCWNudCA9IHNwcmludGYoc3AsICIlcyVzJXMlcyVzICIsCisJCQkoc3RsaV9jb21zdGF0cy5zaWduYWxzICYgVElPQ01fUlRTKSA/ICJ8UlRTIiA6ICIiLAorCQkJKHN0bGlfY29tc3RhdHMuc2lnbmFscyAmIFRJT0NNX0NUUykgPyAifENUUyIgOiAiIiwKKwkJCShzdGxpX2NvbXN0YXRzLnNpZ25hbHMgJiBUSU9DTV9EVFIpID8gInxEVFIiIDogIiIsCisJCQkoc3RsaV9jb21zdGF0cy5zaWduYWxzICYgVElPQ01fQ0QpID8gInxEQ0QiIDogIiIsCisJCQkoc3RsaV9jb21zdGF0cy5zaWduYWxzICYgVElPQ01fRFNSKSA/ICJ8RFNSIiA6ICIiKTsKKwkJKnNwID0gJyAnOworCQlzcCArPSBjbnQ7CisJfQorCisJZm9yIChjbnQgPSAoc3AgLSBwb3MpOyAoY250IDwgKE1BWExJTkUgLSAxKSk7IGNudCsrKQorCQkqc3ArKyA9ICcgJzsKKwlpZiAoY250ID49IE1BWExJTkUpCisJCXBvc1soTUFYTElORSAtIDIpXSA9ICcrJzsKKwlwb3NbKE1BWExJTkUgLSAxKV0gPSAnXG4nOworCisJcmV0dXJuKE1BWExJTkUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglQb3J0IGluZm8sIHJlYWQgZnJvbSB0aGUgL3Byb2MgZmlsZSBzeXN0ZW0uCisgKi8KKworc3RhdGljIGludCBzdGxpX3JlYWRwcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0bGlicmRfdAkqYnJkcDsKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwlpbnQJCWJyZG5yLCBwb3J0bnIsIHRvdGFscG9ydDsKKwlpbnQJCWN1cm9mZiwgbWF4b2ZmOworCWNoYXIJCSpwb3M7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX3JlYWRwcm9jKHBhZ2U9JXgsc3RhcnQ9JXgsb2ZmPSV4LGNvdW50PSVkLGVvZj0leCwiCisJCSJkYXRhPSV4XG4iLCAoaW50KSBwYWdlLCAoaW50KSBzdGFydCwgKGludCkgb2ZmLCBjb3VudCwKKwkJKGludCkgZW9mLCAoaW50KSBkYXRhKTsKKyNlbmRpZgorCisJcG9zID0gcGFnZTsKKwl0b3RhbHBvcnQgPSAwOworCWN1cm9mZiA9IDA7CisKKwlpZiAob2ZmID09IDApIHsKKwkJcG9zICs9IHNwcmludGYocG9zLCAiJXM6IHZlcnNpb24gJXMiLCBzdGxpX2RydnRpdGxlLAorCQkJc3RsaV9kcnZ2ZXJzaW9uKTsKKwkJd2hpbGUgKHBvcyA8IChwYWdlICsgTUFYTElORSAtIDEpKQorCQkJKnBvcysrID0gJyAnOworCQkqcG9zKysgPSAnXG4nOworCX0KKwljdXJvZmYgPSAgTUFYTElORTsKKworLyoKKyAqCVdlIHNjYW4gdGhyb3VnaCBmb3IgZWFjaCBib2FyZCwgcGFuZWwgYW5kIHBvcnQuIFRoZSBvZmZzZXQgaXMKKyAqCWNhbGN1bGF0ZWQgb24gdGhlIGZseSwgYW5kIGlycmVsZXZhbnQgcG9ydHMgYXJlIHNraXBwZWQuCisgKi8KKwlmb3IgKGJyZG5yID0gMDsgKGJyZG5yIDwgc3RsaV9ucmJyZHMpOyBicmRucisrKSB7CisJCWJyZHAgPSBzdGxpX2JyZHNbYnJkbnJdOworCQlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKGJyZHAtPnN0YXRlID09IDApCisJCQljb250aW51ZTsKKworCQltYXhvZmYgPSBjdXJvZmYgKyAoYnJkcC0+bnJwb3J0cyAqIE1BWExJTkUpOworCQlpZiAob2ZmID49IG1heG9mZikgeworCQkJY3Vyb2ZmID0gbWF4b2ZmOworCQkJY29udGludWU7CisJCX0KKworCQl0b3RhbHBvcnQgPSBicmRuciAqIFNUTF9NQVhQT1JUUzsKKwkJZm9yIChwb3J0bnIgPSAwOyAocG9ydG5yIDwgYnJkcC0+bnJwb3J0cyk7IHBvcnRucisrLAorCQkgICAgdG90YWxwb3J0KyspIHsKKwkJCXBvcnRwID0gYnJkcC0+cG9ydHNbcG9ydG5yXTsKKwkJCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG9mZiA+PSAoY3Vyb2ZmICs9IE1BWExJTkUpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKChwb3MgLSBwYWdlICsgTUFYTElORSkgPiBjb3VudCkKKwkJCQlnb3RvIHN0bGlfcmVhZGRvbmU7CisJCQlwb3MgKz0gc3RsaV9wb3J0aW5mbyhicmRwLCBwb3J0cCwgdG90YWxwb3J0LCBwb3MpOworCQl9CisJfQorCisJKmVvZiA9IDE7CisKK3N0bGlfcmVhZGRvbmU6CisJKnN0YXJ0ID0gcGFnZTsKKwlyZXR1cm4ocG9zIC0gcGFnZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUdlbmVyaWMgc2VuZCBjb21tYW5kIHJvdXRpbmUuIFRoaXMgd2lsbCBzZW5kIGEgbWVzc2FnZSB0byB0aGUgc2xhdmUsCisgKglvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LiBNdXN0IGJlIHZlcnkKKyAqCWNhcmVmdWwgb2YgZGF0YSB0aGF0IHdpbGwgYmUgY29waWVkIG91dCBmcm9tIHNoYXJlZCBtZW1vcnkgLQorICoJY29udGFpbmluZyBjb21tYW5kIHJlc3VsdHMuIFRoZSBjb21tYW5kIGNvbXBsZXRpb24gaXMgYWxsIGRvbmUgZnJvbQorICoJYSBwb2xsIHJvdXRpbmUgdGhhdCBkb2VzIG5vdCBoYXZlIHVzZXIgY29udGV4dC4gVGhlcmVmb3JlIHlvdSBjYW5ub3QKKyAqCWNvcHkgYmFjayBkaXJlY3RseSBpbnRvIHVzZXIgc3BhY2UsIG9yIHRvIHRoZSBrZXJuZWwgc3RhY2sgb2YgYQorICoJcHJvY2Vzcy4gVGhpcyByb3V0aW5lIGRvZXMgbm90IHNsZWVwLCBzbyBjYW4gYmUgY2FsbGVkIGZyb20gYW55d2hlcmUuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9zZW5kY21kKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICphcmcsIGludCBzaXplLCBpbnQgY29weWJhY2spCit7CisJdm9sYXRpbGUgY2RraGRyX3QJKmhkcnA7CisJdm9sYXRpbGUgY2RrY3RybF90CSpjcDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSpiaXRzOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9zZW5kY21kKGJyZHA9JXgscG9ydHA9JXgsY21kPSV4LGFyZz0leCxzaXplPSVkLCIKKwkJImNvcHliYWNrPSVkKVxuIiwgKGludCkgYnJkcCwgKGludCkgcG9ydHAsIChpbnQpIGNtZCwKKwkJKGludCkgYXJnLCBzaXplLCBjb3B5YmFjayk7CisjZW5kaWYKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisJaWYgKHRlc3RfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogY29tbWFuZCBhbHJlYWR5IGJ1c3ksIGNtZD0leCFcbiIsCisJCQkJKGludCkgY21kKTsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlFQlJERU5BQkxFKGJyZHApOworCWNwID0gJigodm9sYXRpbGUgY2RrYXN5X3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+YWRkcikpLT5jdHJsOworCWlmIChzaXplID4gMCkgeworCQltZW1jcHkoKHZvaWQgKikgJihjcC0+YXJnc1swXSksIGFyZywgc2l6ZSk7CisJCWlmIChjb3B5YmFjaykgeworCQkJcG9ydHAtPmFyZ3AgPSBhcmc7CisJCQlwb3J0cC0+YXJnc2l6ZSA9IHNpemU7CisJCX0KKwl9CisJY3AtPnN0YXR1cyA9IDA7CisJY3AtPmNtZCA9IGNtZDsKKwloZHJwID0gKHZvbGF0aWxlIGNka2hkcl90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgQ0RLX0NES0FERFIpOworCWJpdHMgPSAoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgaGRycCkgKyBicmRwLT5zbGF2ZW9mZnNldCArCisJCXBvcnRwLT5wb3J0aWR4OworCSpiaXRzIHw9IHBvcnRwLT5wb3J0Yml0OworCXNldF9iaXQoU1RfQ01ESU5HLCAmcG9ydHAtPnN0YXRlKTsKKwlFQlJERElTQUJMRShicmRwKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmVhZCBkYXRhIGZyb20gc2hhcmVkIG1lbW9yeS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHNoYXJlZCBtZW1vcnkKKyAqCWlzIGVuYWJsZWQgYW5kIHRoYXQgaW50ZXJydXB0cyBhcmUgb2ZmLiBCYXNpY2FsbHkgd2UganVzdCBlbXB0eSBvdXQKKyAqCXRoZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciBpbnRvIHRoZSB0dHkgYnVmZmVyLiBNdXN0IGJlIGNhcmVmdWwgdG8KKyAqCWhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBmaWxsIHVwIHRoZSB0dHkgYnVmZmVyLCBidXQgc3RpbGwgaGF2ZQorICoJbW9yZSBjaGFycyB0byB1bmxvYWQuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9yZWFkKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHApCit7CisJdm9sYXRpbGUgY2RrYXN5cnFfdAkqcnA7CisJdm9sYXRpbGUgY2hhcgkJKnNoYnVmOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJdW5zaWduZWQgaW50CQloZWFkLCB0YWlsLCBzaXplOworCXVuc2lnbmVkIGludAkJbGVuLCBzdGxlbjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfcmVhZChicmRwPSV4LHBvcnRwPSVkKVxuIiwKKwkJCShpbnQpIGJyZHAsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCisJaWYgKHRlc3RfYml0KFNUX1JYU1RPUCwgJnBvcnRwLT5zdGF0ZSkpCisJCXJldHVybjsKKwl0dHkgPSBwb3J0cC0+dHR5OworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKworCXJwID0gJigodm9sYXRpbGUgY2RrYXN5X3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+YWRkcikpLT5yeHE7CisJaGVhZCA9ICh1bnNpZ25lZCBpbnQpIHJwLT5oZWFkOworCWlmIChoZWFkICE9ICgodW5zaWduZWQgaW50KSBycC0+aGVhZCkpCisJCWhlYWQgPSAodW5zaWduZWQgaW50KSBycC0+aGVhZDsKKwl0YWlsID0gKHVuc2lnbmVkIGludCkgcnAtPnRhaWw7CisJc2l6ZSA9IHBvcnRwLT5yeHNpemU7CisJaWYgKGhlYWQgPj0gdGFpbCkgeworCQlsZW4gPSBoZWFkIC0gdGFpbDsKKwkJc3RsZW4gPSBsZW47CisJfSBlbHNlIHsKKwkJbGVuID0gc2l6ZSAtICh0YWlsIC0gaGVhZCk7CisJCXN0bGVuID0gc2l6ZSAtIHRhaWw7CisJfQorCisJbGVuID0gTUlOKGxlbiwgKFRUWV9GTElQQlVGX1NJWkUgLSB0dHktPmZsaXAuY291bnQpKTsKKwlzaGJ1ZiA9ICh2b2xhdGlsZSBjaGFyICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPnJ4b2Zmc2V0KTsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCXN0bGVuID0gTUlOKGxlbiwgc3RsZW4pOworCQltZW1jcHkodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgKGNoYXIgKikgKHNoYnVmICsgdGFpbCksIHN0bGVuKTsKKwkJbWVtc2V0KHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsIDAsIHN0bGVuKTsKKwkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciArPSBzdGxlbjsKKwkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBzdGxlbjsKKwkJdHR5LT5mbGlwLmNvdW50ICs9IHN0bGVuOworCisJCWxlbiAtPSBzdGxlbjsKKwkJdGFpbCArPSBzdGxlbjsKKwkJaWYgKHRhaWwgPj0gc2l6ZSkgeworCQkJdGFpbCA9IDA7CisJCQlzdGxlbiA9IGhlYWQ7CisJCX0KKwl9CisJcnAgPSAmKCh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKSktPnJ4cTsKKwlycC0+dGFpbCA9IHRhaWw7CisKKwlpZiAoaGVhZCAhPSB0YWlsKQorCQlzZXRfYml0KFNUX1JYSU5HLCAmcG9ydHAtPnN0YXRlKTsKKworCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNldCB1cCBhbmQgY2Fycnkgb3V0IGFueSBkZWxheWVkIGNvbW1hbmRzLiBUaGVyZSBpcyBvbmx5IGEgc21hbGwgc2V0CisgKglvZiBzbGF2ZSBjb21tYW5kcyB0aGF0IGNhbiBiZSBkb25lICJvZmYtbGV2ZWwiLiBTbyBpdCBpcyBub3QgdG9vCisgKglkaWZmaWN1bHQgdG8gZGVhbCB3aXRoIHRoZW0gaGVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX2RvZGVsYXljbWQoc3RsaXBvcnRfdCAqcG9ydHAsIHZvbGF0aWxlIGNka2N0cmxfdCAqY3ApCit7CisJaW50CWNtZDsKKworCWlmICh0ZXN0X2JpdChTVF9ET1NJR1MsICZwb3J0cC0+c3RhdGUpKSB7CisJCWlmICh0ZXN0X2JpdChTVF9ET0ZMVVNIVFgsICZwb3J0cC0+c3RhdGUpICYmCisJCSAgICB0ZXN0X2JpdChTVF9ET0ZMVVNIUlgsICZwb3J0cC0+c3RhdGUpKQorCQkJY21kID0gQV9TRVRTSUdOQUxTRjsKKwkJZWxzZSBpZiAodGVzdF9iaXQoU1RfRE9GTFVTSFRYLCAmcG9ydHAtPnN0YXRlKSkKKwkJCWNtZCA9IEFfU0VUU0lHTkFMU0ZUWDsKKwkJZWxzZSBpZiAodGVzdF9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKSkKKwkJCWNtZCA9IEFfU0VUU0lHTkFMU0ZSWDsKKwkJZWxzZQorCQkJY21kID0gQV9TRVRTSUdOQUxTOworCQljbGVhcl9iaXQoU1RfRE9GTFVTSFRYLCAmcG9ydHAtPnN0YXRlKTsKKwkJY2xlYXJfYml0KFNUX0RPRkxVU0hSWCwgJnBvcnRwLT5zdGF0ZSk7CisJCWNsZWFyX2JpdChTVF9ET1NJR1MsICZwb3J0cC0+c3RhdGUpOworCQltZW1jcHkoKHZvaWQgKikgJihjcC0+YXJnc1swXSksICh2b2lkICopICZwb3J0cC0+YXNpZywKKwkJCXNpemVvZihhc3lzaWdzX3QpKTsKKwkJY3AtPnN0YXR1cyA9IDA7CisJCWNwLT5jbWQgPSBjbWQ7CisJCXNldF9iaXQoU1RfQ01ESU5HLCAmcG9ydHAtPnN0YXRlKTsKKwl9IGVsc2UgaWYgKHRlc3RfYml0KFNUX0RPRkxVU0hUWCwgJnBvcnRwLT5zdGF0ZSkgfHwKKwkgICAgdGVzdF9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKSkgeworCQljbWQgPSAoKHRlc3RfYml0KFNUX0RPRkxVU0hUWCwgJnBvcnRwLT5zdGF0ZSkpID8gRkxVU0hUWCA6IDApOworCQljbWQgfD0gKCh0ZXN0X2JpdChTVF9ET0ZMVVNIUlgsICZwb3J0cC0+c3RhdGUpKSA/IEZMVVNIUlggOiAwKTsKKwkJY2xlYXJfYml0KFNUX0RPRkxVU0hUWCwgJnBvcnRwLT5zdGF0ZSk7CisJCWNsZWFyX2JpdChTVF9ET0ZMVVNIUlgsICZwb3J0cC0+c3RhdGUpOworCQltZW1jcHkoKHZvaWQgKikgJihjcC0+YXJnc1swXSksICh2b2lkICopICZjbWQsIHNpemVvZihpbnQpKTsKKwkJY3AtPnN0YXR1cyA9IDA7CisJCWNwLT5jbWQgPSBBX0ZMVVNIOworCQlzZXRfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglIb3N0IGNvbW1hbmQgc2VydmljZSBjaGVja2luZy4gVGhpcyBoYW5kbGVzIGNvbW1hbmRzIG9yIG1lc3NhZ2VzCisgKgljb21pbmcgZnJvbSB0aGUgc2xhdmUgdG8gdGhlIGhvc3QuIE11c3QgaGF2ZSBib2FyZCBzaGFyZWQgbWVtb3J5CisgKgllbmFibGVkIGFuZCBpbnRlcnJ1cHRzIG9mZiB3aGVuIGNhbGxlZC4gTm90aWNlIHRoYXQgYnkgc2VydmljaW5nIHRoZQorICoJcmVhZCBkYXRhIGxhc3Qgd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlIHNoYXJlZCBtZW1vcnkgcG9pbnRlcgorICoJZHVyaW5nIHByb2Nlc3NpbmcgKHdoaWNoIGlzIGEgc2xvdyBJTyBvcGVyYXRpb24pLgorICoJUmV0dXJuIHZhbHVlIGluZGljYXRlcyBpZiB0aGlzIHBvcnQgaXMgc3RpbGwgYXdhaXRpbmcgYWN0aW9ucyBmcm9tCisgKgl0aGUgc2xhdmUgKGxpa2Ugb3BlbiwgY29tbWFuZCwgb3IgZXZlbiBUWCBkYXRhIGJlaW5nIHNlbnQpLiBJZiAwCisgKgl0aGVuIHBvcnQgaXMgc3RpbGwgYnVzeSwgb3RoZXJ3aXNlIG5vIGxvbmdlciBidXN5LgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9ob3N0Y21kKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHApCit7CisJdm9sYXRpbGUgY2RrYXN5X3QJKmFwOworCXZvbGF0aWxlIGNka2N0cmxfdAkqY3A7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwlhc3lub3RpZnlfdAkJbnQ7CisJdW5zaWduZWQgbG9uZwkJb2xkc2lnczsKKwlpbnQJCQlyYywgZG9uZXJ4OworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9ob3N0Y21kKGJyZHA9JXgsY2hhbm5yPSVkKVxuIiwKKwkJCShpbnQpIGJyZHAsIGNoYW5ucik7CisjZW5kaWYKKworCWFwID0gKHZvbGF0aWxlIGNka2FzeV90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPmFkZHIpOworCWNwID0gJmFwLT5jdHJsOworCisvKgorICoJQ2hlY2sgaWYgd2UgYXJlIHdhaXRpbmcgZm9yIGFuIG9wZW4gY29tcGxldGlvbiBtZXNzYWdlLgorICovCisJaWYgKHRlc3RfYml0KFNUX09QRU5JTkcsICZwb3J0cC0+c3RhdGUpKSB7CisJCXJjID0gKGludCkgY3AtPm9wZW5hcmc7CisJCWlmICgoY3AtPm9wZW4gPT0gMCkgJiYgKHJjICE9IDApKSB7CisJCQlpZiAocmMgPiAwKQorCQkJCXJjLS07CisJCQljcC0+b3BlbmFyZyA9IDA7CisJCQlwb3J0cC0+cmMgPSByYzsKKwkJCWNsZWFyX2JpdChTVF9PUEVOSU5HLCAmcG9ydHAtPnN0YXRlKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPnJhd193YWl0KTsKKwkJfQorCX0KKworLyoKKyAqCUNoZWNrIGlmIHdlIGFyZSB3YWl0aW5nIGZvciBhIGNsb3NlIGNvbXBsZXRpb24gbWVzc2FnZS4KKyAqLworCWlmICh0ZXN0X2JpdChTVF9DTE9TSU5HLCAmcG9ydHAtPnN0YXRlKSkgeworCQlyYyA9IChpbnQpIGNwLT5jbG9zZWFyZzsKKwkJaWYgKChjcC0+Y2xvc2UgPT0gMCkgJiYgKHJjICE9IDApKSB7CisJCQlpZiAocmMgPiAwKQorCQkJCXJjLS07CisJCQljcC0+Y2xvc2VhcmcgPSAwOworCQkJcG9ydHAtPnJjID0gcmM7CisJCQljbGVhcl9iaXQoU1RfQ0xPU0lORywgJnBvcnRwLT5zdGF0ZSk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5yYXdfd2FpdCk7CisJCX0KKwl9CisKKy8qCisgKglDaGVjayBpZiB3ZSBhcmUgd2FpdGluZyBmb3IgYSBjb21tYW5kIGNvbXBsZXRpb24gbWVzc2FnZS4gV2UgbWF5CisgKgluZWVkIHRvIGNvcHkgb3V0IHRoZSBjb21tYW5kIHJlc3VsdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tbWFuZC4KKyAqLworCWlmICh0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKSB7CisJCXJjID0gY3AtPnN0YXR1czsKKwkJaWYgKChjcC0+Y21kID09IDApICYmIChyYyAhPSAwKSkgeworCQkJaWYgKHJjID4gMCkKKwkJCQlyYy0tOworCQkJaWYgKHBvcnRwLT5hcmdwICE9ICh2b2lkICopIE5VTEwpIHsKKwkJCQltZW1jcHkocG9ydHAtPmFyZ3AsICh2b2lkICopICYoY3AtPmFyZ3NbMF0pLAorCQkJCQlwb3J0cC0+YXJnc2l6ZSk7CisJCQkJcG9ydHAtPmFyZ3AgPSAodm9pZCAqKSBOVUxMOworCQkJfQorCQkJY3AtPnN0YXR1cyA9IDA7CisJCQlwb3J0cC0+cmMgPSByYzsKKwkJCWNsZWFyX2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpOworCQkJc3RsaV9kb2RlbGF5Y21kKHBvcnRwLCBjcCk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5yYXdfd2FpdCk7CisJCX0KKwl9CisKKy8qCisgKglDaGVjayBmb3IgYW55IG5vdGlmaWNhdGlvbiBtZXNzYWdlcyByZWFkeS4gVGhpcyBpbmNsdWRlcyBsb3RzIG9mCisgKglkaWZmZXJlbnQgdHlwZXMgb2YgZXZlbnRzIC0gUlggY2hhcnMgcmVhZHksIFJYIGJyZWFrIHJlY2VpdmVkLAorICoJVFggZGF0YSBsb3cgb3IgZW1wdHkgaW4gdGhlIHNsYXZlLCBtb2RlbSBzaWduYWxzIGNoYW5nZWQgc3RhdGUuCisgKi8KKwlkb25lcnggPSAwOworCisJaWYgKGFwLT5ub3RpZnkpIHsKKwkJbnQgPSBhcC0+Y2hhbmdlZDsKKwkJYXAtPm5vdGlmeSA9IDA7CisJCXR0eSA9IHBvcnRwLT50dHk7CisKKwkJaWYgKG50LnNpZ25hbCAmIFNHX0RDRCkgeworCQkJb2xkc2lncyA9IHBvcnRwLT5zaWdzOworCQkJcG9ydHAtPnNpZ3MgPSBzdGxpX21rdGlvY20obnQuc2lndmFsdWUpOworCQkJY2xlYXJfYml0KFNUX0dFVFNJR1MsICZwb3J0cC0+c3RhdGUpOworCQkJaWYgKChwb3J0cC0+c2lncyAmIFRJT0NNX0NEKSAmJgorCQkJICAgICgob2xkc2lncyAmIFRJT0NNX0NEKSA9PSAwKSkKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5vcGVuX3dhaXQpOworCQkJaWYgKChvbGRzaWdzICYgVElPQ01fQ0QpICYmCisJCQkgICAgKChwb3J0cC0+c2lncyAmIFRJT0NNX0NEKSA9PSAwKSkgeworCQkJCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgeworCQkJCQlpZiAodHR5KQorCQkJCQkJc2NoZWR1bGVfd29yaygmcG9ydHAtPnRxaGFuZ3VwKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAobnQuZGF0YSAmIERUX1RYRU1QVFkpCisJCQljbGVhcl9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKTsKKwkJaWYgKG50LmRhdGEgJiAoRFRfVFhFTVBUWSB8IERUX1RYTE9XKSkgeworCQkJaWYgKHR0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkgeworCQkJCWlmICgodHR5LT5mbGFncyAmICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApKSAmJgorCQkJCSAgICB0dHktPmxkaXNjLndyaXRlX3dha2V1cCkgeworCQkJCQkodHR5LT5sZGlzYy53cml0ZV93YWtldXApKHR0eSk7CisJCQkJCUVCUkRFTkFCTEUoYnJkcCk7CisJCQkJfQorCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwkJCX0KKwkJfQorCisJCWlmICgobnQuZGF0YSAmIERUX1JYQlJFQUspICYmIChwb3J0cC0+cnhtYXJrbXNrICYgQlJLSU5UKSkgeworCQkJaWYgKHR0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkgeworCQkJCWlmICh0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7CisJCQkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0JSRUFLOworCQkJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKKwkJCQkJaWYgKHBvcnRwLT5mbGFncyAmIEFTWU5DX1NBSykgeworCQkJCQkJZG9fU0FLKHR0eSk7CisJCQkJCQlFQlJERU5BQkxFKGJyZHApOworCQkJCQl9CisJCQkJCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG50LmRhdGEgJiBEVF9SWEJVU1kpIHsKKwkJCWRvbmVyeCsrOworCQkJc3RsaV9yZWFkKGJyZHAsIHBvcnRwKTsKKwkJfQorCX0KKworLyoKKyAqCUl0IG1pZ2h0IHNlZW0gb2RkIHRoYXQgd2UgYXJlIGNoZWNraW5nIGZvciBtb3JlIFJYIGNoYXJzIGhlcmUuCisgKglCdXQsIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSB0dHkgYnVmZmVyIHdhcyBwcmV2aW91c2x5CisgKglmaWxsZWQsIGJ1dCB3ZSBoYWQgbW9yZSBjaGFyYWN0ZXJzIHRvIHBhc3MgdXAuIFRoZSBzbGF2ZSB3aWxsIG5vdAorICoJc2VuZCBhbnkgbW9yZSBSWCBub3RpZnkgbWVzc2FnZXMgdW50aWwgdGhlIFJYIGJ1ZmZlciBoYXMgYmVlbiBlbXB0aWVkLgorICoJQnV0IGl0IHdpbGwgbGVhdmUgdGhlIHNlcnZpY2UgYml0cyBvbiAoc2luY2UgdGhlIGJ1ZmZlciBpcyBub3QgZW1wdHkpLgorICoJU28gZnJvbSBoZXJlIHdlIGNhbiB0cnkgdG8gcHJvY2VzcyBtb3JlIFJYIGNoYXJzLgorICovCisJaWYgKCghZG9uZXJ4KSAmJiB0ZXN0X2JpdChTVF9SWElORywgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJY2xlYXJfYml0KFNUX1JYSU5HLCAmcG9ydHAtPnN0YXRlKTsKKwkJc3RsaV9yZWFkKGJyZHAsIHBvcnRwKTsKKwl9CisKKwlyZXR1cm4oKHRlc3RfYml0KFNUX09QRU5JTkcsICZwb3J0cC0+c3RhdGUpIHx8CisJCXRlc3RfYml0KFNUX0NMT1NJTkcsICZwb3J0cC0+c3RhdGUpIHx8CisJCXRlc3RfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSkgfHwKKwkJdGVzdF9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKSB8fAorCQl0ZXN0X2JpdChTVF9SWElORywgJnBvcnRwLT5zdGF0ZSkpID8gMCA6IDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTZXJ2aWNlIGFsbCBwb3J0cyBvbiBhIHBhcnRpY3VsYXIgYm9hcmQuIEFzc3VtZXMgdGhhdCB0aGUgYm9hcmRzCisgKglzaGFyZWQgbWVtb3J5IGlzIGVuYWJsZWQsIGFuZCB0aGF0IHRoZSBwYWdlIHBvaW50ZXIgaXMgcG9pbnRlZAorICoJYXQgdGhlIGNkayBoZWFkZXIgc3RydWN0dXJlLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfYnJkcG9sbChzdGxpYnJkX3QgKmJyZHAsIHZvbGF0aWxlIGNka2hkcl90ICpoZHJwKQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCXVuc2lnbmVkIGNoYXIJaG9zdGJpdHNbKFNUTF9NQVhDSEFOUyAvIDgpICsgMV07CisJdW5zaWduZWQgY2hhcglzbGF2ZWJpdHNbKFNUTF9NQVhDSEFOUyAvIDgpICsgMV07CisJdW5zaWduZWQgY2hhcgkqc2xhdmVwOworCWludAkJYml0cG9zLCBiaXRhdCwgYml0c2l6ZTsKKwlpbnQgCQljaGFubnIsIG5yZGV2cywgc2xhdmViaXRjaGFuZ2U7CisKKwliaXRzaXplID0gYnJkcC0+Yml0c2l6ZTsKKwlucmRldnMgPSBicmRwLT5ucmRldnM7CisKKy8qCisgKglDaGVjayBpZiBzbGF2ZSB3YW50cyBhbnkgc2VydmljZS4gQmFzaWNhbGx5IHdlIHRyeSB0byBkbyBhcworICoJbGl0dGxlIHdvcmsgYXMgcG9zc2libGUgaGVyZS4gVGhlcmUgYXJlIDIgbGV2ZWxzIG9mIHNlcnZpY2UKKyAqCWJpdHMuIFNvIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gd2UgYmFpbCBlYXJseS4gV2UgY2hlY2sKKyAqCTggc2VydmljZSBiaXRzIGF0IGEgdGltZSBpbiB0aGUgaW5uZXIgbG9vcCwgc28gd2UgY2FuIGJ5cGFzcworICoJdGhlIGxvdCBpZiBub25lIG9mIHRoZW0gd2FudCBzZXJ2aWNlLgorICovCisJbWVtY3B5KCZob3N0Yml0c1swXSwgKCgodW5zaWduZWQgY2hhciAqKSBoZHJwKSArIGJyZHAtPmhvc3RvZmZzZXQpLAorCQliaXRzaXplKTsKKworCW1lbXNldCgmc2xhdmViaXRzWzBdLCAwLCBiaXRzaXplKTsKKwlzbGF2ZWJpdGNoYW5nZSA9IDA7CisKKwlmb3IgKGJpdHBvcyA9IDA7IChiaXRwb3MgPCBiaXRzaXplKTsgYml0cG9zKyspIHsKKwkJaWYgKGhvc3RiaXRzW2JpdHBvc10gPT0gMCkKKwkJCWNvbnRpbnVlOworCQljaGFubnIgPSBiaXRwb3MgKiA4OworCQlmb3IgKGJpdGF0ID0gMHgxOyAoY2hhbm5yIDwgbnJkZXZzKTsgY2hhbm5yKyssIGJpdGF0IDw8PSAxKSB7CisJCQlpZiAoaG9zdGJpdHNbYml0cG9zXSAmIGJpdGF0KSB7CisJCQkJcG9ydHAgPSBicmRwLT5wb3J0c1soY2hhbm5yIC0gMSldOworCQkJCWlmIChzdGxpX2hvc3RjbWQoYnJkcCwgcG9ydHApKSB7CisJCQkJCXNsYXZlYml0Y2hhbmdlKys7CisJCQkJCXNsYXZlYml0c1tiaXRwb3NdIHw9IGJpdGF0OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworLyoKKyAqCUlmIGFueSBvZiB0aGUgcG9ydHMgYXJlIG5vIGxvbmdlciBidXN5IHRoZW4gdXBkYXRlIHRoZW0gaW4gdGhlCisgKglzbGF2ZSByZXF1ZXN0IGJpdHMuIFdlIG5lZWQgdG8gZG8gdGhpcyBhZnRlciwgc2luY2UgYSBob3N0IHBvcnQKKyAqCXNlcnZpY2UgbWF5IGluaXRpYXRlIG1vcmUgc2xhdmUgcmVxdWVzdHMuCisgKi8KKwlpZiAoc2xhdmViaXRjaGFuZ2UpIHsKKwkJaGRycCA9ICh2b2xhdGlsZSBjZGtoZHJfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIENES19DREtBRERSKTsKKwkJc2xhdmVwID0gKCh1bnNpZ25lZCBjaGFyICopIGhkcnApICsgYnJkcC0+c2xhdmVvZmZzZXQ7CisJCWZvciAoYml0cG9zID0gMDsgKGJpdHBvcyA8IGJpdHNpemUpOyBiaXRwb3MrKykgeworCQkJaWYgKHNsYXZlYml0c1tiaXRwb3NdKQorCQkJCXNsYXZlcFtiaXRwb3NdICY9IH5zbGF2ZWJpdHNbYml0cG9zXTsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRHJpdmVyIHBvbGwgcm91dGluZS4gVGhpcyByb3V0aW5lIHBvbGxzIHRoZSBib2FyZHMgaW4gdXNlIGFuZCBwYXNzZXMKKyAqCW1lc3NhZ2VzIGJhY2sgdXAgdG8gaG9zdCB3aGVuIG5lY2Vzc2FyeS4gVGhpcyBpcyBhY3R1YWxseSB2ZXJ5CisgKglDUFUgZWZmaWNpZW50LCBzaW5jZSB3ZSB3aWxsIGFsd2F5cyBoYXZlIHRoZSBrZXJuZWwgcG9sbCBjbG9jaywgaXQKKyAqCWFkZHMgb25seSBhIGZldyBjeWNsZXMgd2hlbiBpZGxlIChzaW5jZSBib2FyZCBzZXJ2aWNlIGNhbiBiZQorICoJZGV0ZXJtaW5lZCB2ZXJ5IGVhc2lseSksIGJ1dCB3aGVuIGxvYWRlZCBnZW5lcmF0ZXMgbm8gaW50ZXJydXB0cworICoJKHdpdGggdGhlaXIgZXhwZW5zaXZlIGFzc29jaWF0ZWQgY29udGV4dCBjaGFuZ2UpLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfcG9sbCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2xhdGlsZSBjZGtoZHJfdAkqaGRycDsKKwlzdGxpYnJkX3QJCSpicmRwOworCWludCAJCQlicmRucjsKKworCXN0bGlfdGltZXJsaXN0LmV4cGlyZXMgPSBTVExJX1RJTUVPVVQ7CisJYWRkX3RpbWVyKCZzdGxpX3RpbWVybGlzdCk7CisKKy8qCisgKglDaGVjayBlYWNoIGJvYXJkIGFuZCBkbyBhbnkgc2VydmljaW5nIHJlcXVpcmVkLgorICovCisJZm9yIChicmRuciA9IDA7IChicmRuciA8IHN0bGlfbnJicmRzKTsgYnJkbnIrKykgeworCQlicmRwID0gc3RsaV9icmRzW2JyZG5yXTsKKwkJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQkJY29udGludWU7CisJCWlmICgoYnJkcC0+c3RhdGUgJiBCU1RfU1RBUlRFRCkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCUVCUkRFTkFCTEUoYnJkcCk7CisJCWhkcnAgPSAodm9sYXRpbGUgY2RraGRyX3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBDREtfQ0RLQUREUik7CisJCWlmIChoZHJwLT5ob3N0cmVxKQorCQkJc3RsaV9icmRwb2xsKGJyZHAsIGhkcnApOworCQlFQlJERElTQUJMRShicmRwKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVRyYW5zbGF0ZSB0aGUgdGVybWlvcyBzZXR0aW5ncyBpbnRvIHRoZSBwb3J0IHNldHRpbmcgc3RydWN0dXJlIG9mCisgKgl0aGUgc2xhdmUuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9ta2FzeXBvcnQoc3RsaXBvcnRfdCAqcG9ydHAsIGFzeXBvcnRfdCAqcHAsIHN0cnVjdCB0ZXJtaW9zICp0aW9zcCkKK3sKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX21rYXN5cG9ydChwb3J0cD0leCxwcD0leCx0aW9zcD0lZClcbiIsCisJCShpbnQpIHBvcnRwLCAoaW50KSBwcCwgKGludCkgdGlvc3ApOworI2VuZGlmCisKKwltZW1zZXQocHAsIDAsIHNpemVvZihhc3lwb3J0X3QpKTsKKworLyoKKyAqCVN0YXJ0IG9mIGJ5IHNldHRpbmcgdGhlIGJhdWQsIGNoYXIgc2l6ZSwgcGFyaXR5IGFuZCBzdG9wIGJpdCBpbmZvLgorICovCisJcHAtPmJhdWRvdXQgPSB0aW9zcC0+Y19jZmxhZyAmIENCQVVEOworCWlmIChwcC0+YmF1ZG91dCAmIENCQVVERVgpIHsKKwkJcHAtPmJhdWRvdXQgJj0gfkNCQVVERVg7CisJCWlmICgocHAtPmJhdWRvdXQgPCAxKSB8fCAocHAtPmJhdWRvdXQgPiA0KSkKKwkJCXRpb3NwLT5jX2NmbGFnICY9IH5DQkFVREVYOworCQllbHNlCisJCQlwcC0+YmF1ZG91dCArPSAxNTsKKwl9CisJcHAtPmJhdWRvdXQgPSBzdGxpX2JhdWRyYXRlc1twcC0+YmF1ZG91dF07CisJaWYgKCh0aW9zcC0+Y19jZmxhZyAmIENCQVVEKSA9PSBCMzg0MDApIHsKKwkJaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQorCQkJcHAtPmJhdWRvdXQgPSA1NzYwMDsKKwkJZWxzZSBpZiAoKHBvcnRwLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJcHAtPmJhdWRvdXQgPSAxMTUyMDA7CisJCWVsc2UgaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKKwkJCXBwLT5iYXVkb3V0ID0gMjMwNDAwOworCQllbHNlIGlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQorCQkJcHAtPmJhdWRvdXQgPSA0NjA4MDA7CisJCWVsc2UgaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QpCisJCQlwcC0+YmF1ZG91dCA9IChwb3J0cC0+YmF1ZF9iYXNlIC8gcG9ydHAtPmN1c3RvbV9kaXZpc29yKTsKKwl9CisJaWYgKHBwLT5iYXVkb3V0ID4gU1RMX01BWEJBVUQpCisJCXBwLT5iYXVkb3V0ID0gU1RMX01BWEJBVUQ7CisJcHAtPmJhdWRpbiA9IHBwLT5iYXVkb3V0OworCisJc3dpdGNoICh0aW9zcC0+Y19jZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJCXBwLT5jc2l6ZSA9IDU7CisJCWJyZWFrOworCWNhc2UgQ1M2OgorCQlwcC0+Y3NpemUgPSA2OworCQlicmVhazsKKwljYXNlIENTNzoKKwkJcHAtPmNzaXplID0gNzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHAtPmNzaXplID0gODsKKwkJYnJlYWs7CisJfQorCisJaWYgKHRpb3NwLT5jX2NmbGFnICYgQ1NUT1BCKQorCQlwcC0+c3RvcGJzID0gUFRfU1RPUDI7CisJZWxzZQorCQlwcC0+c3RvcGJzID0gUFRfU1RPUDE7CisKKwlpZiAodGlvc3AtPmNfY2ZsYWcgJiBQQVJFTkIpIHsKKwkJaWYgKHRpb3NwLT5jX2NmbGFnICYgUEFST0REKQorCQkJcHAtPnBhcml0eSA9IFBUX09ERFBBUklUWTsKKwkJZWxzZQorCQkJcHAtPnBhcml0eSA9IFBUX0VWRU5QQVJJVFk7CisJfSBlbHNlIHsKKwkJcHAtPnBhcml0eSA9IFBUX05PUEFSSVRZOworCX0KKworLyoKKyAqCVNldCB1cCBhbnkgZmxvdyBjb250cm9sIG9wdGlvbnMgZW5hYmxlZC4KKyAqLworCWlmICh0aW9zcC0+Y19pZmxhZyAmIElYT04pIHsKKwkJcHAtPmZsb3cgfD0gRl9JWE9OOworCQlpZiAodGlvc3AtPmNfaWZsYWcgJiBJWEFOWSkKKwkJCXBwLT5mbG93IHw9IEZfSVhBTlk7CisJfQorCWlmICh0aW9zcC0+Y19jZmxhZyAmIENSVFNDVFMpCisJCXBwLT5mbG93IHw9IChGX1JUU0ZMT1cgfCBGX0NUU0ZMT1cpOworCisJcHAtPnN0YXJ0aW4gPSB0aW9zcC0+Y19jY1tWU1RBUlRdOworCXBwLT5zdG9waW4gPSB0aW9zcC0+Y19jY1tWU1RPUF07CisJcHAtPnN0YXJ0b3V0ID0gdGlvc3AtPmNfY2NbVlNUQVJUXTsKKwlwcC0+c3RvcG91dCA9IHRpb3NwLT5jX2NjW1ZTVE9QXTsKKworLyoKKyAqCVNldCB1cCB0aGUgUlggY2hhciBtYXJraW5nIG1hc2sgd2l0aCB0aG9zZSBSWCBlcnJvciB0eXBlcyB3ZSBtdXN0CisgKgljYXRjaC4gV2UgY2FuIGdldCB0aGUgc2xhdmUgdG8gaGVscCB1cyBvdXQgYSBsaXR0bGUgaGVyZSwgaXQgd2lsbAorICoJaWdub3JlIHBhcml0eSBlcnJvcnMgYW5kIGJyZWFrcyBmb3IgdXMsIGFuZCBtYXJrIHBhcml0eSBlcnJvcnMgaW4KKyAqCXRoZSBkYXRhIHN0cmVhbS4KKyAqLworCWlmICh0aW9zcC0+Y19pZmxhZyAmIElHTlBBUikKKwkJcHAtPmlmbGFnIHw9IEZJX0lHTlJYRVJSUzsKKwlpZiAodGlvc3AtPmNfaWZsYWcgJiBJR05CUkspCisJCXBwLT5pZmxhZyB8PSBGSV9JR05CUkVBSzsKKworCXBvcnRwLT5yeG1hcmttc2sgPSAwOworCWlmICh0aW9zcC0+Y19pZmxhZyAmIChJTlBDSyB8IFBBUk1SSykpCisJCXBwLT5pZmxhZyB8PSBGSV8xTUFSS1JYRVJSUzsKKwlpZiAodGlvc3AtPmNfaWZsYWcgJiBCUktJTlQpCisJCXBvcnRwLT5yeG1hcmttc2sgfD0gQlJLSU5UOworCisvKgorICoJU2V0IHVwIGNsb2NhbCBwcm9jZXNzaW5nIGFzIHJlcXVpcmVkLgorICovCisJaWYgKHRpb3NwLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQlwb3J0cC0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworCWVsc2UKKwkJcG9ydHAtPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCisvKgorICoJVHJhbnNmZXIgYW55IHBlcnNpc3RlbnQgZmxhZ3MgaW50byB0aGUgYXN5cG9ydCBzdHJ1Y3R1cmUuCisgKi8KKwlwcC0+cGZsYWcgPSAocG9ydHAtPnBmbGFnICYgMHhmZmZmKTsKKwlwcC0+dm1pbiA9IChwb3J0cC0+cGZsYWcgJiBQX1JYSU1JTikgPyAxIDogMDsKKwlwcC0+dnRpbWUgPSAocG9ydHAtPnBmbGFnICYgUF9SWElUSU1FKSA/IDEgOiAwOworCXBwLT5jY1sxXSA9IChwb3J0cC0+cGZsYWcgJiBQX1JYVEhPTEQpID8gMSA6IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUNvbnN0cnVjdCBhIHNsYXZlIHNpZ25hbHMgc3RydWN0dXJlIGZvciBzZXR0aW5nIHRoZSBEVFIgYW5kIFJUUworICoJc2lnbmFscyBhcyBzcGVjaWZpZWQuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9ta2FzeXNpZ3MoYXN5c2lnc190ICpzcCwgaW50IGR0ciwgaW50IHJ0cykKK3sKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX21rYXN5c2lncyhzcD0leCxkdHI9JWQscnRzPSVkKVxuIiwKKwkJCShpbnQpIHNwLCBkdHIsIHJ0cyk7CisjZW5kaWYKKworCW1lbXNldChzcCwgMCwgc2l6ZW9mKGFzeXNpZ3NfdCkpOworCWlmIChkdHIgPj0gMCkgeworCQlzcC0+c2lnbmFsIHw9IFNHX0RUUjsKKwkJc3AtPnNpZ3ZhbHVlIHw9ICgoZHRyID4gMCkgPyBTR19EVFIgOiAwKTsKKwl9CisJaWYgKHJ0cyA+PSAwKSB7CisJCXNwLT5zaWduYWwgfD0gU0dfUlRTOworCQlzcC0+c2lndmFsdWUgfD0gKChydHMgPiAwKSA/IFNHX1JUUyA6IDApOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQ29udmVydCB0aGUgc2lnbmFscyByZXR1cm5lZCBmcm9tIHRoZSBzbGF2ZSBpbnRvIGEgbG9jYWwgVElPQ00gdHlwZQorICoJc2lnbmFscyB2YWx1ZS4gV2Uga2VlcCB0aGVtIGxvY2FsbHkgaW4gVElPQ00gZm9ybWF0LgorICovCisKK3N0YXRpYyBsb25nIHN0bGlfbWt0aW9jbSh1bnNpZ25lZCBsb25nIHNpZ3ZhbHVlKQoreworCWxvbmcJdGlvY207CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX21rdGlvY20oc2lndmFsdWU9JXgpXG4iLCAoaW50KSBzaWd2YWx1ZSk7CisjZW5kaWYKKworCXRpb2NtID0gMDsKKwl0aW9jbSB8PSAoKHNpZ3ZhbHVlICYgU0dfRENEKSA/IFRJT0NNX0NEIDogMCk7CisJdGlvY20gfD0gKChzaWd2YWx1ZSAmIFNHX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKKwl0aW9jbSB8PSAoKHNpZ3ZhbHVlICYgU0dfUkkpID8gVElPQ01fUkkgOiAwKTsKKwl0aW9jbSB8PSAoKHNpZ3ZhbHVlICYgU0dfRFNSKSA/IFRJT0NNX0RTUiA6IDApOworCXRpb2NtIHw9ICgoc2lndmFsdWUgJiBTR19EVFIpID8gVElPQ01fRFRSIDogMCk7CisJdGlvY20gfD0gKChzaWd2YWx1ZSAmIFNHX1JUUykgPyBUSU9DTV9SVFMgOiAwKTsKKwlyZXR1cm4odGlvY20pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglBbGwgcGFuZWxzIGFuZCBwb3J0cyBhY3R1YWxseSBhdHRhY2hlZCBoYXZlIGJlZW4gd29ya2VkIG91dC4gQWxsCisgKgl3ZSBuZWVkIHRvIGRvIGhlcmUgaXMgc2V0IHVwIHRoZSBhcHByb3ByaWF0ZSBwZXIgcG9ydCBkYXRhIHN0cnVjdHVyZXMuCisgKi8KKworc3RhdGljIGludCBzdGxpX2luaXRwb3J0cyhzdGxpYnJkX3QgKmJyZHApCit7CisJc3RsaXBvcnRfdAkqcG9ydHA7CisJaW50CQlpLCBwYW5lbG5yLCBwYW5lbHBvcnQ7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2luaXRwb3J0cyhicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCWZvciAoaSA9IDAsIHBhbmVsbnIgPSAwLCBwYW5lbHBvcnQgPSAwOyAoaSA8IGJyZHAtPm5ycG9ydHMpOyBpKyspIHsKKwkJcG9ydHAgPSAoc3RsaXBvcnRfdCAqKSBzdGxpX21lbWFsbG9jKHNpemVvZihzdGxpcG9ydF90KSk7CisJCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKSB7CisJCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gYWxsb2NhdGUgcG9ydCBzdHJ1Y3R1cmVcbiIpOworCQkJY29udGludWU7CisJCX0KKworCQltZW1zZXQocG9ydHAsIDAsIHNpemVvZihzdGxpcG9ydF90KSk7CisJCXBvcnRwLT5tYWdpYyA9IFNUTElfUE9SVE1BR0lDOworCQlwb3J0cC0+cG9ydG5yID0gaTsKKwkJcG9ydHAtPmJyZG5yID0gYnJkcC0+YnJkbnI7CisJCXBvcnRwLT5wYW5lbG5yID0gcGFuZWxucjsKKwkJcG9ydHAtPmJhdWRfYmFzZSA9IFNUTF9CQVVEQkFTRTsKKwkJcG9ydHAtPmNsb3NlX2RlbGF5ID0gU1RMX0NMT1NFREVMQVk7CisJCXBvcnRwLT5jbG9zaW5nX3dhaXQgPSAzMCAqIEhaOworCQlJTklUX1dPUksoJnBvcnRwLT50cWhhbmd1cCwgc3RsaV9kb2hhbmd1cCwgcG9ydHApOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0cC0+b3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydHAtPmNsb3NlX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0cC0+cmF3X3dhaXQpOworCQlwYW5lbHBvcnQrKzsKKwkJaWYgKHBhbmVscG9ydCA+PSBicmRwLT5wYW5lbHNbcGFuZWxucl0pIHsKKwkJCXBhbmVscG9ydCA9IDA7CisJCQlwYW5lbG5yKys7CisJCX0KKwkJYnJkcC0+cG9ydHNbaV0gPSBwb3J0cDsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUFsbCB0aGUgZm9sbG93aW5nIHJvdXRpbmVzIGFyZSBib2FyZCBzcGVjaWZpYyBoYXJkd2FyZSBvcGVyYXRpb25zLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfZWNwaW5pdChzdGxpYnJkX3QgKmJyZHApCit7CisJdW5zaWduZWQgbG9uZwltZW1jb25mOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9lY3Bpbml0KGJyZHA9JWQpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJb3V0YihFQ1BfQVRTVE9QLCAoYnJkcC0+aW9iYXNlICsgRUNQX0FUQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoRUNQX0FURElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVENPTkZSKSk7CisJdWRlbGF5KDEwMCk7CisKKwltZW1jb25mID0gKGJyZHAtPm1lbWFkZHIgJiBFQ1BfQVRBRERSTUFTSykgPj4gRUNQX0FUQUREUlNIRlQ7CisJb3V0YihtZW1jb25mLCAoYnJkcC0+aW9iYXNlICsgRUNQX0FUTUVNQVIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcGVuYWJsZShzdGxpYnJkX3QgKmJyZHApCit7CQorI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZWNwZW5hYmxlKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCW91dGIoRUNQX0FURU5BQkxFLCAoYnJkcC0+aW9iYXNlICsgRUNQX0FUQ09ORlIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcGRpc2FibGUoc3RsaWJyZF90ICpicmRwKQorewkKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2VjcGRpc2FibGUoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisJb3V0YihFQ1BfQVRESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgRUNQX0FUQ09ORlIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqc3RsaV9lY3BnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpCit7CQorCXZvaWQJCSpwdHI7CisJdW5zaWduZWQgY2hhcgl2YWw7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2VjcGdldG1lbXB0cihicmRwPSV4LG9mZnNldD0leClcbiIsIChpbnQpIGJyZHAsCisJCShpbnQpIG9mZnNldCk7CisjZW5kaWYKKworCWlmIChvZmZzZXQgPiBicmRwLT5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IHNoYXJlZCBtZW1vcnkgcG9pbnRlcj0leCBvdXQgb2YgIgorCQkJCSJyYW5nZSBhdCBsaW5lPSVkKCVkKSwgYnJkPSVkXG4iLAorCQkJKGludCkgb2Zmc2V0LCBsaW5lLCBfX0xJTkVfXywgYnJkcC0+YnJkbnIpOworCQlwdHIgPSBOVUxMOworCQl2YWwgPSAwOworCX0gZWxzZSB7CisJCXB0ciA9IGJyZHAtPm1lbWJhc2UgKyAob2Zmc2V0ICUgRUNQX0FUUEFHRVNJWkUpOworCQl2YWwgPSAodW5zaWduZWQgY2hhcikgKG9mZnNldCAvIEVDUF9BVFBBR0VTSVpFKTsKKwl9CisJb3V0Yih2YWwsIChicmRwLT5pb2Jhc2UgKyBFQ1BfQVRNRU1QUikpOworCXJldHVybihwdHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfZWNwcmVzZXQoc3RsaWJyZF90ICpicmRwKQorewkKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2VjcHJlc2V0KGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJb3V0YihFQ1BfQVRTVE9QLCAoYnJkcC0+aW9iYXNlICsgRUNQX0FUQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoRUNQX0FURElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVENPTkZSKSk7CisJdWRlbGF5KDUwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BpbnRyKHN0bGlicmRfdCAqYnJkcCkKK3sJCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9lY3BpbnRyKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCW91dGIoMHgxLCBicmRwLT5pb2Jhc2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUaGUgZm9sbG93aW5nIHNldCBvZiBmdW5jdGlvbnMgYWN0IG9uIEVDUCBFSVNBIGJvYXJkcy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcGVpaW5pdChzdGxpYnJkX3QgKmJyZHApCit7CisJdW5zaWduZWQgbG9uZwltZW1jb25mOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9lY3BlaWluaXQoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlvdXRiKDB4MSwgKGJyZHAtPmlvYmFzZSArIEVDUF9FSUJSREVOQUIpKTsKKwlvdXRiKEVDUF9FSVNUT1AsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlDT05GUikpOworCXVkZWxheSgxMCk7CisJb3V0YihFQ1BfRUlESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQ09ORlIpKTsKKwl1ZGVsYXkoNTAwKTsKKworCW1lbWNvbmYgPSAoYnJkcC0+bWVtYWRkciAmIEVDUF9FSUFERFJNQVNLTCkgPj4gRUNQX0VJQUREUlNIRlRMOworCW91dGIobWVtY29uZiwgKGJyZHAtPmlvYmFzZSArIEVDUF9FSU1FTUFSTCkpOworCW1lbWNvbmYgPSAoYnJkcC0+bWVtYWRkciAmIEVDUF9FSUFERFJNQVNLSCkgPj4gRUNQX0VJQUREUlNIRlRIOworCW91dGIobWVtY29uZiwgKGJyZHAtPmlvYmFzZSArIEVDUF9FSU1FTUFSSCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfZWNwZWllbmFibGUoc3RsaWJyZF90ICpicmRwKQorewkKKwlvdXRiKEVDUF9FSUVOQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9FSUNPTkZSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BlaWRpc2FibGUoc3RsaWJyZF90ICpicmRwKQorewkKKwlvdXRiKEVDUF9FSURJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlDT05GUikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjaGFyICpzdGxpX2VjcGVpZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKQorewkKKwl2b2lkCQkqcHRyOworCXVuc2lnbmVkIGNoYXIJdmFsOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9lY3BlaWdldG1lbXB0cihicmRwPSV4LG9mZnNldD0leCxsaW5lPSVkKVxuIiwKKwkJKGludCkgYnJkcCwgKGludCkgb2Zmc2V0LCBsaW5lKTsKKyNlbmRpZgorCisJaWYgKG9mZnNldCA+IGJyZHAtPm1lbXNpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogc2hhcmVkIG1lbW9yeSBwb2ludGVyPSV4IG91dCBvZiAiCisJCQkJInJhbmdlIGF0IGxpbmU9JWQoJWQpLCBicmQ9JWRcbiIsCisJCQkoaW50KSBvZmZzZXQsIGxpbmUsIF9fTElORV9fLCBicmRwLT5icmRucik7CisJCXB0ciA9IE5VTEw7CisJCXZhbCA9IDA7CisJfSBlbHNlIHsKKwkJcHRyID0gYnJkcC0+bWVtYmFzZSArIChvZmZzZXQgJSBFQ1BfRUlQQUdFU0laRSk7CisJCWlmIChvZmZzZXQgPCBFQ1BfRUlQQUdFU0laRSkKKwkJCXZhbCA9IEVDUF9FSUVOQUJMRTsKKwkJZWxzZQorCQkJdmFsID0gRUNQX0VJRU5BQkxFIHwgMHg0MDsKKwl9CisJb3V0Yih2YWwsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlDT05GUikpOworCXJldHVybihwdHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfZWNwZWlyZXNldChzdGxpYnJkX3QgKmJyZHApCit7CQorCW91dGIoRUNQX0VJU1RPUCwgKGJyZHAtPmlvYmFzZSArIEVDUF9FSUNPTkZSKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKEVDUF9FSURJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlDT05GUikpOworCXVkZWxheSg1MDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUaGUgZm9sbG93aW5nIHNldCBvZiBmdW5jdGlvbnMgYWN0IG9uIEVDUCBNQ0EgYm9hcmRzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfZWNwbWNlbmFibGUoc3RsaWJyZF90ICpicmRwKQorewkKKwlvdXRiKEVDUF9NQ0VOQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9NQ0NPTkZSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BtY2Rpc2FibGUoc3RsaWJyZF90ICpicmRwKQorewkKKwlvdXRiKEVDUF9NQ0RJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBFQ1BfTUNDT05GUikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjaGFyICpzdGxpX2VjcG1jZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKQorewkKKwl2b2lkCQkqcHRyOworCXVuc2lnbmVkIGNoYXIJdmFsOworCisJaWYgKG9mZnNldCA+IGJyZHAtPm1lbXNpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogc2hhcmVkIG1lbW9yeSBwb2ludGVyPSV4IG91dCBvZiAiCisJCQkJInJhbmdlIGF0IGxpbmU9JWQoJWQpLCBicmQ9JWRcbiIsCisJCQkoaW50KSBvZmZzZXQsIGxpbmUsIF9fTElORV9fLCBicmRwLT5icmRucik7CisJCXB0ciA9IE5VTEw7CisJCXZhbCA9IDA7CisJfSBlbHNlIHsKKwkJcHRyID0gYnJkcC0+bWVtYmFzZSArIChvZmZzZXQgJSBFQ1BfTUNQQUdFU0laRSk7CisJCXZhbCA9ICgodW5zaWduZWQgY2hhcikgKG9mZnNldCAvIEVDUF9NQ1BBR0VTSVpFKSkgfCBFQ1BfTUNFTkFCTEU7CisJfQorCW91dGIodmFsLCAoYnJkcC0+aW9iYXNlICsgRUNQX01DQ09ORlIpKTsKKwlyZXR1cm4ocHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcG1jcmVzZXQoc3RsaWJyZF90ICpicmRwKQorewkKKwlvdXRiKEVDUF9NQ1NUT1AsIChicmRwLT5pb2Jhc2UgKyBFQ1BfTUNDT05GUikpOworCXVkZWxheSgxMCk7CisJb3V0YihFQ1BfTUNESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgRUNQX01DQ09ORlIpKTsKKwl1ZGVsYXkoNTAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlIGZvbGxvd2luZyBzZXQgb2YgZnVuY3Rpb25zIGFjdCBvbiBFQ1AgUENJIGJvYXJkcy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcHBjaWluaXQoc3RsaWJyZF90ICpicmRwKQoreworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZWNwcGNpaW5pdChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCW91dGIoRUNQX1BDSVNUT1AsIChicmRwLT5pb2Jhc2UgKyBFQ1BfUENJQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoMCwgKGJyZHAtPmlvYmFzZSArIEVDUF9QQ0lDT05GUikpOworCXVkZWxheSg1MDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjaGFyICpzdGxpX2VjcHBjaWdldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKK3sJCisJdm9pZAkJKnB0cjsKKwl1bnNpZ25lZCBjaGFyCXZhbDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZWNwcGNpZ2V0bWVtcHRyKGJyZHA9JXgsb2Zmc2V0PSV4LGxpbmU9JWQpXG4iLAorCQkoaW50KSBicmRwLCAoaW50KSBvZmZzZXQsIGxpbmUpOworI2VuZGlmCisKKwlpZiAob2Zmc2V0ID4gYnJkcC0+bWVtc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBzaGFyZWQgbWVtb3J5IHBvaW50ZXI9JXggb3V0IG9mICIKKwkJCQkicmFuZ2UgYXQgbGluZT0lZCglZCksIGJvYXJkPSVkXG4iLAorCQkJCShpbnQpIG9mZnNldCwgbGluZSwgX19MSU5FX18sIGJyZHAtPmJyZG5yKTsKKwkJcHRyID0gTlVMTDsKKwkJdmFsID0gMDsKKwl9IGVsc2UgeworCQlwdHIgPSBicmRwLT5tZW1iYXNlICsgKG9mZnNldCAlIEVDUF9QQ0lQQUdFU0laRSk7CisJCXZhbCA9IChvZmZzZXQgLyBFQ1BfUENJUEFHRVNJWkUpIDw8IDE7CisJfQorCW91dGIodmFsLCAoYnJkcC0+aW9iYXNlICsgRUNQX1BDSUNPTkZSKSk7CisJcmV0dXJuKHB0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BwY2lyZXNldChzdGxpYnJkX3QgKmJyZHApCit7CQorCW91dGIoRUNQX1BDSVNUT1AsIChicmRwLT5pb2Jhc2UgKyBFQ1BfUENJQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoMCwgKGJyZHAtPmlvYmFzZSArIEVDUF9QQ0lDT05GUikpOworCXVkZWxheSg1MDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFjdCBvbiBPTmJvYXJkcy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX29uYmluaXQoc3RsaWJyZF90ICpicmRwKQoreworCXVuc2lnbmVkIGxvbmcJbWVtY29uZjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfb25iaW5pdChicmRwPSVkKVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCW91dGIoT05CX0FUU1RPUCwgKGJyZHAtPmlvYmFzZSArIE9OQl9BVENPTkZSKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKE9OQl9BVERJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBPTkJfQVRDT05GUikpOworCW1kZWxheSgxMDAwKTsKKworCW1lbWNvbmYgPSAoYnJkcC0+bWVtYWRkciAmIE9OQl9BVEFERFJNQVNLKSA+PiBPTkJfQVRBRERSU0hGVDsKKwlvdXRiKG1lbWNvbmYsIChicmRwLT5pb2Jhc2UgKyBPTkJfQVRNRU1BUikpOworCW91dGIoMHgxLCBicmRwLT5pb2Jhc2UpOworCW1kZWxheSgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX29uYmVuYWJsZShzdGxpYnJkX3QgKmJyZHApCit7CQorI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfb25iZW5hYmxlKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCW91dGIoKGJyZHAtPmVuYWJ2YWwgfCBPTkJfQVRFTkFCTEUpLCAoYnJkcC0+aW9iYXNlICsgT05CX0FUQ09ORlIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX29uYmRpc2FibGUoc3RsaWJyZF90ICpicmRwKQorewkKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX29uYmRpc2FibGUoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisJb3V0YigoYnJkcC0+ZW5hYnZhbCB8IE9OQl9BVERJU0FCTEUpLCAoYnJkcC0+aW9iYXNlICsgT05CX0FUQ09ORlIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqc3RsaV9vbmJnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpCit7CQorCXZvaWQJKnB0cjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfb25iZ2V0bWVtcHRyKGJyZHA9JXgsb2Zmc2V0PSV4KVxuIiwgKGludCkgYnJkcCwKKwkJKGludCkgb2Zmc2V0KTsKKyNlbmRpZgorCisJaWYgKG9mZnNldCA+IGJyZHAtPm1lbXNpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogc2hhcmVkIG1lbW9yeSBwb2ludGVyPSV4IG91dCBvZiAiCisJCQkJInJhbmdlIGF0IGxpbmU9JWQoJWQpLCBicmQ9JWRcbiIsCisJCQkJKGludCkgb2Zmc2V0LCBsaW5lLCBfX0xJTkVfXywgYnJkcC0+YnJkbnIpOworCQlwdHIgPSBOVUxMOworCX0gZWxzZSB7CisJCXB0ciA9IGJyZHAtPm1lbWJhc2UgKyAob2Zmc2V0ICUgT05CX0FUUEFHRVNJWkUpOworCX0KKwlyZXR1cm4ocHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX29uYnJlc2V0KHN0bGlicmRfdCAqYnJkcCkKK3sJCisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX29uYnJlc2V0KGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJb3V0YihPTkJfQVRTVE9QLCAoYnJkcC0+aW9iYXNlICsgT05CX0FUQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoT05CX0FURElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIE9OQl9BVENPTkZSKSk7CisJbWRlbGF5KDEwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFjdCBvbiBPTmJvYXJkIEVJU0EuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9vbmJlaW5pdChzdGxpYnJkX3QgKmJyZHApCit7CisJdW5zaWduZWQgbG9uZwltZW1jb25mOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9vbmJlaW5pdChicmRwPSVkKVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCW91dGIoMHgxLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQlJERU5BQikpOworCW91dGIoT05CX0VJU1RPUCwgKGJyZHAtPmlvYmFzZSArIE9OQl9FSUNPTkZSKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKE9OQl9FSURJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlDT05GUikpOworCW1kZWxheSgxMDAwKTsKKworCW1lbWNvbmYgPSAoYnJkcC0+bWVtYWRkciAmIE9OQl9FSUFERFJNQVNLTCkgPj4gT05CX0VJQUREUlNIRlRMOworCW91dGIobWVtY29uZiwgKGJyZHAtPmlvYmFzZSArIE9OQl9FSU1FTUFSTCkpOworCW1lbWNvbmYgPSAoYnJkcC0+bWVtYWRkciAmIE9OQl9FSUFERFJNQVNLSCkgPj4gT05CX0VJQUREUlNIRlRIOworCW91dGIobWVtY29uZiwgKGJyZHAtPmlvYmFzZSArIE9OQl9FSU1FTUFSSCkpOworCW91dGIoMHgxLCBicmRwLT5pb2Jhc2UpOworCW1kZWxheSgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX29uYmVlbmFibGUoc3RsaWJyZF90ICpicmRwKQorewkKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX29uYmVlbmFibGUoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisJb3V0YihPTkJfRUlFTkFCTEUsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlDT05GUikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfb25iZWRpc2FibGUoc3RsaWJyZF90ICpicmRwKQorewkKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX29uYmVkaXNhYmxlKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCW91dGIoT05CX0VJRElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIE9OQl9FSUNPTkZSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNoYXIgKnN0bGlfb25iZWdldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKK3sJCisJdm9pZAkJKnB0cjsKKwl1bnNpZ25lZCBjaGFyCXZhbDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfb25iZWdldG1lbXB0cihicmRwPSV4LG9mZnNldD0leCxsaW5lPSVkKVxuIiwKKwkJKGludCkgYnJkcCwgKGludCkgb2Zmc2V0LCBsaW5lKTsKKyNlbmRpZgorCisJaWYgKG9mZnNldCA+IGJyZHAtPm1lbXNpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogc2hhcmVkIG1lbW9yeSBwb2ludGVyPSV4IG91dCBvZiAiCisJCQkJInJhbmdlIGF0IGxpbmU9JWQoJWQpLCBicmQ9JWRcbiIsCisJCQkoaW50KSBvZmZzZXQsIGxpbmUsIF9fTElORV9fLCBicmRwLT5icmRucik7CisJCXB0ciA9IE5VTEw7CisJCXZhbCA9IDA7CisJfSBlbHNlIHsKKwkJcHRyID0gYnJkcC0+bWVtYmFzZSArIChvZmZzZXQgJSBPTkJfRUlQQUdFU0laRSk7CisJCWlmIChvZmZzZXQgPCBPTkJfRUlQQUdFU0laRSkKKwkJCXZhbCA9IE9OQl9FSUVOQUJMRTsKKwkJZWxzZQorCQkJdmFsID0gT05CX0VJRU5BQkxFIHwgMHg0MDsKKwl9CisJb3V0Yih2YWwsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlDT05GUikpOworCXJldHVybihwdHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfb25iZXJlc2V0KHN0bGlicmRfdCAqYnJkcCkKK3sJCisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0VSUiAic3RsaV9vbmJlcmVzZXQoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlvdXRiKE9OQl9FSVNUT1AsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlDT05GUikpOworCXVkZWxheSgxMCk7CisJb3V0YihPTkJfRUlESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKKwltZGVsYXkoMTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVRoZSBmb2xsb3dpbmcgcm91dGluZXMgYWN0IG9uIEJydW1ieSBib2FyZHMuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9iYnlpbml0KHN0bGlicmRfdCAqYnJkcCkKK3sKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fRVJSICJzdGxpX2JieWluaXQoYnJkcD0lZClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlvdXRiKEJCWV9BVFNUT1AsIChicmRwLT5pb2Jhc2UgKyBCQllfQVRDT05GUikpOworCXVkZWxheSgxMCk7CisJb3V0YigwLCAoYnJkcC0+aW9iYXNlICsgQkJZX0FUQ09ORlIpKTsKKwltZGVsYXkoMTAwMCk7CisJb3V0YigweDEsIGJyZHAtPmlvYmFzZSk7CisJbWRlbGF5KDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjaGFyICpzdGxpX2JieWdldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKK3sJCisJdm9pZAkJKnB0cjsKKwl1bnNpZ25lZCBjaGFyCXZhbDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fRVJSICJzdGxpX2JieWdldG1lbXB0cihicmRwPSV4LG9mZnNldD0leClcbiIsIChpbnQpIGJyZHAsCisJCShpbnQpIG9mZnNldCk7CisjZW5kaWYKKworCWlmIChvZmZzZXQgPiBicmRwLT5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IHNoYXJlZCBtZW1vcnkgcG9pbnRlcj0leCBvdXQgb2YgIgorCQkJCSJyYW5nZSBhdCBsaW5lPSVkKCVkKSwgYnJkPSVkXG4iLAorCQkJCShpbnQpIG9mZnNldCwgbGluZSwgX19MSU5FX18sIGJyZHAtPmJyZG5yKTsKKwkJcHRyID0gTlVMTDsKKwkJdmFsID0gMDsKKwl9IGVsc2UgeworCQlwdHIgPSBicmRwLT5tZW1iYXNlICsgKG9mZnNldCAlIEJCWV9QQUdFU0laRSk7CisJCXZhbCA9ICh1bnNpZ25lZCBjaGFyKSAob2Zmc2V0IC8gQkJZX1BBR0VTSVpFKTsKKwl9CisJb3V0Yih2YWwsIChicmRwLT5pb2Jhc2UgKyBCQllfQVRDT05GUikpOworCXJldHVybihwdHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfYmJ5cmVzZXQoc3RsaWJyZF90ICpicmRwKQorewkKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfYmJ5cmVzZXQoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlvdXRiKEJCWV9BVFNUT1AsIChicmRwLT5pb2Jhc2UgKyBCQllfQVRDT05GUikpOworCXVkZWxheSgxMCk7CisJb3V0YigwLCAoYnJkcC0+aW9iYXNlICsgQkJZX0FUQ09ORlIpKTsKKwltZGVsYXkoMTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVRoZSBmb2xsb3dpbmcgcm91dGluZXMgYWN0IG9uIG9yaWdpbmFsIG9sZCBTdGFsbGlvbiBib2FyZHMuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9zdGFsaW5pdChzdGxpYnJkX3QgKmJyZHApCit7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX3N0YWxpbml0KGJyZHA9JWQpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJb3V0YigweDEsIGJyZHAtPmlvYmFzZSk7CisJbWRlbGF5KDEwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjaGFyICpzdGxpX3N0YWxnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpCit7CQorCXZvaWQJKnB0cjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfc3RhbGdldG1lbXB0cihicmRwPSV4LG9mZnNldD0leClcbiIsIChpbnQpIGJyZHAsCisJCShpbnQpIG9mZnNldCk7CisjZW5kaWYKKworCWlmIChvZmZzZXQgPiBicmRwLT5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IHNoYXJlZCBtZW1vcnkgcG9pbnRlcj0leCBvdXQgb2YgIgorCQkJCSJyYW5nZSBhdCBsaW5lPSVkKCVkKSwgYnJkPSVkXG4iLAorCQkJCShpbnQpIG9mZnNldCwgbGluZSwgX19MSU5FX18sIGJyZHAtPmJyZG5yKTsKKwkJcHRyID0gTlVMTDsKKwl9IGVsc2UgeworCQlwdHIgPSBicmRwLT5tZW1iYXNlICsgKG9mZnNldCAlIFNUQUxfUEFHRVNJWkUpOworCX0KKwlyZXR1cm4ocHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX3N0YWxyZXNldChzdGxpYnJkX3QgKmJyZHApCit7CQorCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcJKnZlY3A7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX3N0YWxyZXNldChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCXZlY3AgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoYnJkcC0+bWVtYmFzZSArIDB4MzApOworCSp2ZWNwID0gMHhmZmZmMDAwMDsKKwlvdXRiKDAsIGJyZHAtPmlvYmFzZSk7CisJbWRlbGF5KDEwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUcnkgdG8gZmluZCBhbiBFQ1AgYm9hcmQgYW5kIGluaXRpYWxpemUgaXQuIFRoaXMgaGFuZGxlcyBvbmx5IEVDUAorICoJYm9hcmQgdHlwZXMuCisgKi8KKworc3RhdGljIGludCBzdGxpX2luaXRlY3Aoc3RsaWJyZF90ICpicmRwKQoreworCWNka2VjcHNpZ190CXNpZzsKKwljZGtlY3BzaWdfdAkqc2lnc3A7CisJdW5zaWduZWQgaW50CXN0YXR1cywgbnh0aWQ7CisJY2hhcgkJKm5hbWU7CisJaW50CQlwYW5lbG5yLCBucnBvcnRzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9pbml0ZWNwKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSwgImlzdGFsbGlvbiIpKQorCQlyZXR1cm4gLUVJTzsKKwkKKwlpZiAoKGJyZHAtPmlvYmFzZSA9PSAwKSB8fCAoYnJkcC0+bWVtYWRkciA9PSAwKSkKKwl7CisJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKKwkJcmV0dXJuKC1FTk9ERVYpOworCX0KKworCWJyZHAtPmlvc2l6ZSA9IEVDUF9JT1NJWkU7CisKKy8qCisgKglCYXNlZCBvbiB0aGUgc3BlY2lmaWMgYm9hcmQgdHlwZSBzZXR1cCB0aGUgY29tbW9uIHZhcnMgdG8gYWNjZXNzCisgKglhbmQgZW5hYmxlIHNoYXJlZCBtZW1vcnkuIFNldCBhbGwgYm9hcmQgc3BlY2lmaWMgaW5mb3JtYXRpb24gbm93CisgKglhcyB3ZWxsLgorICovCisJc3dpdGNoIChicmRwLT5icmR0eXBlKSB7CisJY2FzZSBCUkRfRUNQOgorCQlicmRwLT5tZW1iYXNlID0gKHZvaWQgKikgYnJkcC0+bWVtYWRkcjsKKwkJYnJkcC0+bWVtc2l6ZSA9IEVDUF9NRU1TSVpFOworCQlicmRwLT5wYWdlc2l6ZSA9IEVDUF9BVFBBR0VTSVpFOworCQlicmRwLT5pbml0ID0gc3RsaV9lY3Bpbml0OworCQlicmRwLT5lbmFibGUgPSBzdGxpX2VjcGVuYWJsZTsKKwkJYnJkcC0+cmVlbmFibGUgPSBzdGxpX2VjcGVuYWJsZTsKKwkJYnJkcC0+ZGlzYWJsZSA9IHN0bGlfZWNwZGlzYWJsZTsKKwkJYnJkcC0+Z2V0bWVtcHRyID0gc3RsaV9lY3BnZXRtZW1wdHI7CisJCWJyZHAtPmludHIgPSBzdGxpX2VjcGludHI7CisJCWJyZHAtPnJlc2V0ID0gc3RsaV9lY3ByZXNldDsKKwkJbmFtZSA9ICJzZXJpYWwoRUM4LzY0KSI7CisJCWJyZWFrOworCisJY2FzZSBCUkRfRUNQRToKKwkJYnJkcC0+bWVtYmFzZSA9ICh2b2lkICopIGJyZHAtPm1lbWFkZHI7CisJCWJyZHAtPm1lbXNpemUgPSBFQ1BfTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBFQ1BfRUlQQUdFU0laRTsKKwkJYnJkcC0+aW5pdCA9IHN0bGlfZWNwZWlpbml0OworCQlicmRwLT5lbmFibGUgPSBzdGxpX2VjcGVpZW5hYmxlOworCQlicmRwLT5yZWVuYWJsZSA9IHN0bGlfZWNwZWllbmFibGU7CisJCWJyZHAtPmRpc2FibGUgPSBzdGxpX2VjcGVpZGlzYWJsZTsKKwkJYnJkcC0+Z2V0bWVtcHRyID0gc3RsaV9lY3BlaWdldG1lbXB0cjsKKwkJYnJkcC0+aW50ciA9IHN0bGlfZWNwaW50cjsKKwkJYnJkcC0+cmVzZXQgPSBzdGxpX2VjcGVpcmVzZXQ7CisJCW5hbWUgPSAic2VyaWFsKEVDOC82NC1FSSkiOworCQlicmVhazsKKworCWNhc2UgQlJEX0VDUE1DOgorCQlicmRwLT5tZW1iYXNlID0gKHZvaWQgKikgYnJkcC0+bWVtYWRkcjsKKwkJYnJkcC0+bWVtc2l6ZSA9IEVDUF9NRU1TSVpFOworCQlicmRwLT5wYWdlc2l6ZSA9IEVDUF9NQ1BBR0VTSVpFOworCQlicmRwLT5pbml0ID0gTlVMTDsKKwkJYnJkcC0+ZW5hYmxlID0gc3RsaV9lY3BtY2VuYWJsZTsKKwkJYnJkcC0+cmVlbmFibGUgPSBzdGxpX2VjcG1jZW5hYmxlOworCQlicmRwLT5kaXNhYmxlID0gc3RsaV9lY3BtY2Rpc2FibGU7CisJCWJyZHAtPmdldG1lbXB0ciA9IHN0bGlfZWNwbWNnZXRtZW1wdHI7CisJCWJyZHAtPmludHIgPSBzdGxpX2VjcGludHI7CisJCWJyZHAtPnJlc2V0ID0gc3RsaV9lY3BtY3Jlc2V0OworCQluYW1lID0gInNlcmlhbChFQzgvNjQtTUNBKSI7CisJCWJyZWFrOworCisJY2FzZSBCUkRfRUNQUENJOgorCQlicmRwLT5tZW1iYXNlID0gKHZvaWQgKikgYnJkcC0+bWVtYWRkcjsKKwkJYnJkcC0+bWVtc2l6ZSA9IEVDUF9QQ0lNRU1TSVpFOworCQlicmRwLT5wYWdlc2l6ZSA9IEVDUF9QQ0lQQUdFU0laRTsKKwkJYnJkcC0+aW5pdCA9IHN0bGlfZWNwcGNpaW5pdDsKKwkJYnJkcC0+ZW5hYmxlID0gTlVMTDsKKwkJYnJkcC0+cmVlbmFibGUgPSBOVUxMOworCQlicmRwLT5kaXNhYmxlID0gTlVMTDsKKwkJYnJkcC0+Z2V0bWVtcHRyID0gc3RsaV9lY3BwY2lnZXRtZW1wdHI7CisJCWJyZHAtPmludHIgPSBzdGxpX2VjcGludHI7CisJCWJyZHAtPnJlc2V0ID0gc3RsaV9lY3BwY2lyZXNldDsKKwkJbmFtZSA9ICJzZXJpYWwoRUMvUkEtUENJKSI7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUpOworCQlyZXR1cm4oLUVJTlZBTCk7CisJfQorCisvKgorICoJVGhlIHBlci1ib2FyZCBvcGVyYXRpb25zIHN0cnVjdHVyZSBpcyBhbGwgc2V0IHVwLCBzbyBub3cgbGV0J3MgZ28KKyAqCWFuZCBnZXQgdGhlIGJvYXJkIG9wZXJhdGlvbmFsLiBGaXJzdGx5IGluaXRpYWxpemUgYm9hcmQgY29uZmlndXJhdGlvbgorICoJcmVnaXN0ZXJzLiBTZXQgdGhlIG1lbW9yeSBtYXBwaW5nIGluZm8gc28gd2UgY2FuIGdldCBhdCB0aGUgYm9hcmRzCisgKglzaGFyZWQgbWVtb3J5LgorICovCisJRUJSRElOSVQoYnJkcCk7CisKKwlicmRwLT5tZW1iYXNlID0gaW9yZW1hcChicmRwLT5tZW1hZGRyLCBicmRwLT5tZW1zaXplKTsKKwlpZiAoYnJkcC0+bWVtYmFzZSA9PSAodm9pZCAqKSBOVUxMKQorCXsKKwkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUpOworCQlyZXR1cm4oLUVOT01FTSk7CisJfQorCisvKgorICoJTm93IHRoYXQgYWxsIHNwZWNpZmljIGNvZGUgaXMgc2V0IHVwLCBlbmFibGUgdGhlIHNoYXJlZCBtZW1vcnkgYW5kCisgKglsb29rIGZvciB0aGUgYSBzaWduYXR1cmUgYXJlYSB0aGF0IHdpbGwgdGVsbCB1cyBleGFjdGx5IHdoYXQgYm9hcmQKKyAqCXRoaXMgaXMsIGFuZCB3aGF0IGl0IGlzIGNvbm5lY3RlZCB0byBpdC4KKyAqLworCUVCUkRFTkFCTEUoYnJkcCk7CisJc2lnc3AgPSAoY2RrZWNwc2lnX3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBDREtfU0lHQUREUik7CisJbWVtY3B5KCZzaWcsIHNpZ3NwLCBzaXplb2YoY2RrZWNwc2lnX3QpKTsKKwlFQlJERElTQUJMRShicmRwKTsKKworI2lmIDAKKwlwcmludGsoIiVzKCVkKTogc2lnLT4gbWFnaWM9JXggcm9tPSV4IHBhbmVsPSV4LCV4LCV4LCV4LCV4LCV4LCV4LCV4XG4iLAorCQlfX0ZJTEVfXywgX19MSU5FX18sIChpbnQpIHNpZy5tYWdpYywgc2lnLnJvbXZlciwgc2lnLnBhbmVsaWRbMF0sCisJCShpbnQpIHNpZy5wYW5lbGlkWzFdLCAoaW50KSBzaWcucGFuZWxpZFsyXSwKKwkJKGludCkgc2lnLnBhbmVsaWRbM10sIChpbnQpIHNpZy5wYW5lbGlkWzRdLAorCQkoaW50KSBzaWcucGFuZWxpZFs1XSwgKGludCkgc2lnLnBhbmVsaWRbNl0sCisJCShpbnQpIHNpZy5wYW5lbGlkWzddKTsKKyNlbmRpZgorCisJaWYgKHNpZy5tYWdpYyAhPSBFQ1BfTUFHSUMpCisJeworCQlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSk7CisJCXJldHVybigtRU5PREVWKTsKKwl9CisKKy8qCisgKglTY2FuIHRocm91Z2ggdGhlIHNpZ25hdHVyZSBsb29raW5nIGF0IHRoZSBwYW5lbHMgY29ubmVjdGVkIHRvIHRoZQorICoJYm9hcmQuIENhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHBvcnRzIGFzIHdlIGdvLgorICovCisJZm9yIChwYW5lbG5yID0gMCwgbnh0aWQgPSAwOyAocGFuZWxuciA8IFNUTF9NQVhQQU5FTFMpOyBwYW5lbG5yKyspIHsKKwkJc3RhdHVzID0gc2lnLnBhbmVsaWRbbnh0aWRdOworCQlpZiAoKHN0YXR1cyAmIEVDSF9QTkxJRE1BU0spICE9IG54dGlkKQorCQkJYnJlYWs7CisKKwkJYnJkcC0+cGFuZWxpZHNbcGFuZWxucl0gPSBzdGF0dXM7CisJCW5ycG9ydHMgPSAoc3RhdHVzICYgRUNIX1BOTDE2UE9SVCkgPyAxNiA6IDg7CisJCWlmICgobnJwb3J0cyA9PSAxNikgJiYgKChzdGF0dXMgJiBFQ0hfUE5MWFBJRCkgPT0gMCkpCisJCQlueHRpZCsrOworCQlicmRwLT5wYW5lbHNbcGFuZWxucl0gPSBucnBvcnRzOworCQlicmRwLT5ucnBvcnRzICs9IG5ycG9ydHM7CisJCW54dGlkKys7CisJCWJyZHAtPm5ycGFuZWxzKys7CisJfQorCisKKwlicmRwLT5zdGF0ZSB8PSBCU1RfRk9VTkQ7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUcnkgdG8gZmluZCBhbiBPTmJvYXJkLCBCcnVtYnkgb3IgU3RhbGxpb24gYm9hcmQgYW5kIGluaXRpYWxpemUgaXQuCisgKglUaGlzIGhhbmRsZXMgb25seSB0aGVzZSBib2FyZCB0eXBlcy4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfaW5pdG9uYihzdGxpYnJkX3QgKmJyZHApCit7CisJY2Rrb25ic2lnX3QJc2lnOworCWNka29uYnNpZ190CSpzaWdzcDsKKwljaGFyCQkqbmFtZTsKKwlpbnQJCWk7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2luaXRvbmIoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKy8qCisgKglEbyBhIGJhc2ljIHNhbml0eSBjaGVjayBvbiB0aGUgSU8gYW5kIG1lbW9yeSBhZGRyZXNzZXMuCisgKi8KKwlpZiAoKGJyZHAtPmlvYmFzZSA9PSAwKSB8fCAoYnJkcC0+bWVtYWRkciA9PSAwKSkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJYnJkcC0+aW9zaXplID0gT05CX0lPU0laRTsKKwkKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplLCAiaXN0YWxsaW9uIikpCisJCXJldHVybiAtRUlPOworCisvKgorICoJQmFzZWQgb24gdGhlIHNwZWNpZmljIGJvYXJkIHR5cGUgc2V0dXAgdGhlIGNvbW1vbiB2YXJzIHRvIGFjY2VzcworICoJYW5kIGVuYWJsZSBzaGFyZWQgbWVtb3J5LiBTZXQgYWxsIGJvYXJkIHNwZWNpZmljIGluZm9ybWF0aW9uIG5vdworICoJYXMgd2VsbC4KKyAqLworCXN3aXRjaCAoYnJkcC0+YnJkdHlwZSkgeworCWNhc2UgQlJEX09OQk9BUkQ6CisJY2FzZSBCUkRfT05CT0FSRDMyOgorCWNhc2UgQlJEX09OQk9BUkQyOgorCWNhc2UgQlJEX09OQk9BUkQyXzMyOgorCWNhc2UgQlJEX09OQk9BUkRSUzoKKwkJYnJkcC0+bWVtYmFzZSA9ICh2b2lkICopIGJyZHAtPm1lbWFkZHI7CisJCWJyZHAtPm1lbXNpemUgPSBPTkJfTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBPTkJfQVRQQUdFU0laRTsKKwkJYnJkcC0+aW5pdCA9IHN0bGlfb25iaW5pdDsKKwkJYnJkcC0+ZW5hYmxlID0gc3RsaV9vbmJlbmFibGU7CisJCWJyZHAtPnJlZW5hYmxlID0gc3RsaV9vbmJlbmFibGU7CisJCWJyZHAtPmRpc2FibGUgPSBzdGxpX29uYmRpc2FibGU7CisJCWJyZHAtPmdldG1lbXB0ciA9IHN0bGlfb25iZ2V0bWVtcHRyOworCQlicmRwLT5pbnRyID0gc3RsaV9lY3BpbnRyOworCQlicmRwLT5yZXNldCA9IHN0bGlfb25icmVzZXQ7CisJCWlmIChicmRwLT5tZW1hZGRyID4gMHgxMDAwMDApCisJCQlicmRwLT5lbmFidmFsID0gT05CX01FTUVOQUJISTsKKwkJZWxzZQorCQkJYnJkcC0+ZW5hYnZhbCA9IE9OQl9NRU1FTkFCTE87CisJCW5hbWUgPSAic2VyaWFsKE9OQm9hcmQpIjsKKwkJYnJlYWs7CisKKwljYXNlIEJSRF9PTkJPQVJERToKKwkJYnJkcC0+bWVtYmFzZSA9ICh2b2lkICopIGJyZHAtPm1lbWFkZHI7CisJCWJyZHAtPm1lbXNpemUgPSBPTkJfRUlNRU1TSVpFOworCQlicmRwLT5wYWdlc2l6ZSA9IE9OQl9FSVBBR0VTSVpFOworCQlicmRwLT5pbml0ID0gc3RsaV9vbmJlaW5pdDsKKwkJYnJkcC0+ZW5hYmxlID0gc3RsaV9vbmJlZW5hYmxlOworCQlicmRwLT5yZWVuYWJsZSA9IHN0bGlfb25iZWVuYWJsZTsKKwkJYnJkcC0+ZGlzYWJsZSA9IHN0bGlfb25iZWRpc2FibGU7CisJCWJyZHAtPmdldG1lbXB0ciA9IHN0bGlfb25iZWdldG1lbXB0cjsKKwkJYnJkcC0+aW50ciA9IHN0bGlfZWNwaW50cjsKKwkJYnJkcC0+cmVzZXQgPSBzdGxpX29uYmVyZXNldDsKKwkJbmFtZSA9ICJzZXJpYWwoT05Cb2FyZC9FKSI7CisJCWJyZWFrOworCisJY2FzZSBCUkRfQlJVTUJZNDoKKwljYXNlIEJSRF9CUlVNQlk4OgorCWNhc2UgQlJEX0JSVU1CWTE2OgorCQlicmRwLT5tZW1iYXNlID0gKHZvaWQgKikgYnJkcC0+bWVtYWRkcjsKKwkJYnJkcC0+bWVtc2l6ZSA9IEJCWV9NRU1TSVpFOworCQlicmRwLT5wYWdlc2l6ZSA9IEJCWV9QQUdFU0laRTsKKwkJYnJkcC0+aW5pdCA9IHN0bGlfYmJ5aW5pdDsKKwkJYnJkcC0+ZW5hYmxlID0gTlVMTDsKKwkJYnJkcC0+cmVlbmFibGUgPSBOVUxMOworCQlicmRwLT5kaXNhYmxlID0gTlVMTDsKKwkJYnJkcC0+Z2V0bWVtcHRyID0gc3RsaV9iYnlnZXRtZW1wdHI7CisJCWJyZHAtPmludHIgPSBzdGxpX2VjcGludHI7CisJCWJyZHAtPnJlc2V0ID0gc3RsaV9iYnlyZXNldDsKKwkJbmFtZSA9ICJzZXJpYWwoQnJ1bWJ5KSI7CisJCWJyZWFrOworCisJY2FzZSBCUkRfU1RBTExJT046CisJCWJyZHAtPm1lbWJhc2UgPSAodm9pZCAqKSBicmRwLT5tZW1hZGRyOworCQlicmRwLT5tZW1zaXplID0gU1RBTF9NRU1TSVpFOworCQlicmRwLT5wYWdlc2l6ZSA9IFNUQUxfUEFHRVNJWkU7CisJCWJyZHAtPmluaXQgPSBzdGxpX3N0YWxpbml0OworCQlicmRwLT5lbmFibGUgPSBOVUxMOworCQlicmRwLT5yZWVuYWJsZSA9IE5VTEw7CisJCWJyZHAtPmRpc2FibGUgPSBOVUxMOworCQlicmRwLT5nZXRtZW1wdHIgPSBzdGxpX3N0YWxnZXRtZW1wdHI7CisJCWJyZHAtPmludHIgPSBzdGxpX2VjcGludHI7CisJCWJyZHAtPnJlc2V0ID0gc3RsaV9zdGFscmVzZXQ7CisJCW5hbWUgPSAic2VyaWFsKFN0YWxsaW9uKSI7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUpOworCQlyZXR1cm4oLUVJTlZBTCk7CisJfQorCisvKgorICoJVGhlIHBlci1ib2FyZCBvcGVyYXRpb25zIHN0cnVjdHVyZSBpcyBhbGwgc2V0IHVwLCBzbyBub3cgbGV0J3MgZ28KKyAqCWFuZCBnZXQgdGhlIGJvYXJkIG9wZXJhdGlvbmFsLiBGaXJzdGx5IGluaXRpYWxpemUgYm9hcmQgY29uZmlndXJhdGlvbgorICoJcmVnaXN0ZXJzLiBTZXQgdGhlIG1lbW9yeSBtYXBwaW5nIGluZm8gc28gd2UgY2FuIGdldCBhdCB0aGUgYm9hcmRzCisgKglzaGFyZWQgbWVtb3J5LgorICovCisJRUJSRElOSVQoYnJkcCk7CisKKwlicmRwLT5tZW1iYXNlID0gaW9yZW1hcChicmRwLT5tZW1hZGRyLCBicmRwLT5tZW1zaXplKTsKKwlpZiAoYnJkcC0+bWVtYmFzZSA9PSAodm9pZCAqKSBOVUxMKQorCXsKKwkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUpOworCQlyZXR1cm4oLUVOT01FTSk7CisJfQorCisvKgorICoJTm93IHRoYXQgYWxsIHNwZWNpZmljIGNvZGUgaXMgc2V0IHVwLCBlbmFibGUgdGhlIHNoYXJlZCBtZW1vcnkgYW5kCisgKglsb29rIGZvciB0aGUgYSBzaWduYXR1cmUgYXJlYSB0aGF0IHdpbGwgdGVsbCB1cyBleGFjdGx5IHdoYXQgYm9hcmQKKyAqCXRoaXMgaXMsIGFuZCBob3cgbWFueSBwb3J0cy4KKyAqLworCUVCUkRFTkFCTEUoYnJkcCk7CisJc2lnc3AgPSAoY2Rrb25ic2lnX3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBDREtfU0lHQUREUik7CisJbWVtY3B5KCZzaWcsIHNpZ3NwLCBzaXplb2YoY2Rrb25ic2lnX3QpKTsKKwlFQlJERElTQUJMRShicmRwKTsKKworI2lmIDAKKwlwcmludGsoIiVzKCVkKTogc2lnLT4gbWFnaWM9JXg6JXg6JXg6JXggcm9tdmVyPSV4IGFtYXNrPSV4OiV4OiV4XG4iLAorCQlfX0ZJTEVfXywgX19MSU5FX18sIHNpZy5tYWdpYzAsIHNpZy5tYWdpYzEsIHNpZy5tYWdpYzIsCisJCXNpZy5tYWdpYzMsIHNpZy5yb212ZXIsIHNpZy5hbWFzazAsIHNpZy5hbWFzazEsIHNpZy5hbWFzazIpOworI2VuZGlmCisKKwlpZiAoKHNpZy5tYWdpYzAgIT0gT05CX01BR0lDMCkgfHwgKHNpZy5tYWdpYzEgIT0gT05CX01BR0lDMSkgfHwKKwkgICAgKHNpZy5tYWdpYzIgIT0gT05CX01BR0lDMikgfHwgKHNpZy5tYWdpYzMgIT0gT05CX01BR0lDMykpCisJeworCQlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSk7CisJCXJldHVybigtRU5PREVWKTsKKwl9CisKKy8qCisgKglTY2FuIHRocm91Z2ggdGhlIHNpZ25hdHVyZSBhbGl2ZSBtYXNrIGFuZCBjYWxjdWxhdGUgaG93IG1hbnkgcG9ydHMKKyAqCXRoZXJlIGFyZSBvbiB0aGlzIGJvYXJkLgorICovCisJYnJkcC0+bnJwYW5lbHMgPSAxOworCWlmIChzaWcuYW1hc2sxKSB7CisJCWJyZHAtPm5ycG9ydHMgPSAzMjsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyAoaSA8IDE2KTsgaSsrKSB7CisJCQlpZiAoKChzaWcuYW1hc2swIDw8IGkpICYgMHg4MDAwKSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWJyZHAtPm5ycG9ydHMgPSBpOworCX0KKwlicmRwLT5wYW5lbHNbMF0gPSBicmRwLT5ucnBvcnRzOworCisKKwlicmRwLT5zdGF0ZSB8PSBCU1RfRk9VTkQ7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTdGFydCB1cCBhIHJ1bm5pbmcgYm9hcmQuIFRoaXMgcm91dGluZSBpcyBvbmx5IGNhbGxlZCBhZnRlciB0aGUKKyAqCWNvZGUgaGFzIGJlZW4gZG93biBsb2FkZWQgdG8gdGhlIGJvYXJkIGFuZCBpcyBvcGVyYXRpb25hbC4gSXQgd2lsbAorICoJcmVhZCBpbiB0aGUgbWVtb3J5IG1hcCwgYW5kIGdldCB0aGUgc2hvdyBvbiB0aGUgcm9hZC4uLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9zdGFydGJyZChzdGxpYnJkX3QgKmJyZHApCit7CisJdm9sYXRpbGUgY2RraGRyX3QJKmhkcnA7CisJdm9sYXRpbGUgY2RrbWVtX3QJKm1lbXA7CisJdm9sYXRpbGUgY2RrYXN5X3QJKmFwOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCXN0bGlwb3J0X3QJCSpwb3J0cDsKKwlpbnQJCQlwb3J0bnIsIG5yZGV2cywgaSwgcmM7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX3N0YXJ0YnJkKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJcmMgPSAwOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJRUJSREVOQUJMRShicmRwKTsKKwloZHJwID0gKHZvbGF0aWxlIGNka2hkcl90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgQ0RLX0NES0FERFIpOworCW5yZGV2cyA9IGhkcnAtPm5yZGV2czsKKworI2lmIDAKKwlwcmludGsoIiVzKCVkKTogQ0RLIHZlcnNpb24gJWQuJWQuJWQgLS0+ICIKKwkJIm5yZGV2cz0lZCBtZW1wPSV4IGhvc3RwPSV4IHNsYXZlcD0leFxuIiwKKwkJIF9fRklMRV9fLCBfX0xJTkVfXywgaGRycC0+dmVyX3JlbGVhc2UsIGhkcnAtPnZlcl9tb2RpZmljYXRpb24sCisJCSBoZHJwLT52ZXJfZml4LCBucmRldnMsIChpbnQpIGhkcnAtPm1lbXAsIChpbnQpIGhkcnAtPmhvc3RwLAorCQkgKGludCkgaGRycC0+c2xhdmVwKTsKKyNlbmRpZgorCisJaWYgKG5yZGV2cyA8IChicmRwLT5ucnBvcnRzICsgMSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogc2xhdmUgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgIgorCQkJCSJhbGwgZGV2aWNlcywgZGV2aWNlcz0lZFxuIiwgbnJkZXZzKTsKKwkJYnJkcC0+bnJwb3J0cyA9IG5yZGV2cyAtIDE7CisJfQorCWJyZHAtPm5yZGV2cyA9IG5yZGV2czsKKwlicmRwLT5ob3N0b2Zmc2V0ID0gaGRycC0+aG9zdHAgLSBDREtfQ0RLQUREUjsKKwlicmRwLT5zbGF2ZW9mZnNldCA9IGhkcnAtPnNsYXZlcCAtIENES19DREtBRERSOworCWJyZHAtPmJpdHNpemUgPSAobnJkZXZzICsgNykgLyA4OworCW1lbXAgPSAodm9sYXRpbGUgY2RrbWVtX3QgKikgaGRycC0+bWVtcDsKKwlpZiAoKCh1bnNpZ25lZCBsb25nKSBtZW1wKSA+IGJyZHAtPm1lbXNpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogY29ycnVwdGVkIHNoYXJlZCBtZW1vcnkgcmVnaW9uP1xuIik7CisJCXJjID0gLUVJTzsKKwkJZ290byBzdGxpX2RvbmVzdGFydHVwOworCX0KKwltZW1wID0gKHZvbGF0aWxlIGNka21lbV90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgKHVuc2lnbmVkIGxvbmcpIG1lbXApOworCWlmIChtZW1wLT5kdHlwZSAhPSBUWVBfQVNZTkNUUkwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogbm8gc2xhdmUgY29udHJvbCBkZXZpY2UgZm91bmRcbiIpOworCQlnb3RvIHN0bGlfZG9uZXN0YXJ0dXA7CisJfQorCW1lbXArKzsKKworLyoKKyAqCUN5Y2xlIHRocm91Z2ggbWVtb3J5IGFsbG9jYXRpb24gb2YgZWFjaCBwb3J0LiBXZSBhcmUgZ3VhcmFudGVlZCB0bworICoJaGF2ZSBhbGwgcG9ydHMgaW5zaWRlIHRoZSBmaXJzdCBwYWdlIG9mIHNsYXZlIHdpbmRvdywgc28gbm8gbmVlZCB0bworICoJY2hhbmdlIHBhZ2VzIHdoaWxlIHJlYWRpbmcgbWVtb3J5IG1hcC4KKyAqLworCWZvciAoaSA9IDEsIHBvcnRuciA9IDA7IChpIDwgbnJkZXZzKTsgaSsrLCBwb3J0bnIrKywgbWVtcCsrKSB7CisJCWlmIChtZW1wLT5kdHlwZSAhPSBUWVBfQVNZTkMpCisJCQlicmVhazsKKwkJcG9ydHAgPSBicmRwLT5wb3J0c1twb3J0bnJdOworCQlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJCWJyZWFrOworCQlwb3J0cC0+ZGV2bnIgPSBpOworCQlwb3J0cC0+YWRkciA9IG1lbXAtPm9mZnNldDsKKwkJcG9ydHAtPnJlcWJpdCA9ICh1bnNpZ25lZCBjaGFyKSAoMHgxIDw8IChpICogOCAvIG5yZGV2cykpOworCQlwb3J0cC0+cG9ydGlkeCA9ICh1bnNpZ25lZCBjaGFyKSAoaSAvIDgpOworCQlwb3J0cC0+cG9ydGJpdCA9ICh1bnNpZ25lZCBjaGFyKSAoMHgxIDw8IChpICUgOCkpOworCX0KKworCWhkcnAtPnNsYXZlcmVxID0gMHhmZjsKKworLyoKKyAqCUZvciBlYWNoIHBvcnQgc2V0dXAgYSBsb2NhbCBjb3B5IG9mIHRoZSBSWCBhbmQgVFggYnVmZmVyIG9mZnNldHMKKyAqCWFuZCBzaXplcy4gV2UgZG8gdGhpcyBzZXBhcmF0ZSBmcm9tIHRoZSBhYm92ZSwgYmVjYXVzZSB3ZSBuZWVkIHRvCisgKgltb3ZlIHRoZSBzaGFyZWQgbWVtb3J5IHBhZ2UuLi4KKyAqLworCWZvciAoaSA9IDEsIHBvcnRuciA9IDA7IChpIDwgbnJkZXZzKTsgaSsrLCBwb3J0bnIrKykgeworCQlwb3J0cCA9IGJyZHAtPnBvcnRzW3BvcnRucl07CisJCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQkJYnJlYWs7CisJCWlmIChwb3J0cC0+YWRkciA9PSAwKQorCQkJYnJlYWs7CisJCWFwID0gKHZvbGF0aWxlIGNka2FzeV90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPmFkZHIpOworCQlpZiAoYXAgIT0gKHZvbGF0aWxlIGNka2FzeV90ICopIE5VTEwpIHsKKwkJCXBvcnRwLT5yeHNpemUgPSBhcC0+cnhxLnNpemU7CisJCQlwb3J0cC0+dHhzaXplID0gYXAtPnR4cS5zaXplOworCQkJcG9ydHAtPnJ4b2Zmc2V0ID0gYXAtPnJ4cS5vZmZzZXQ7CisJCQlwb3J0cC0+dHhvZmZzZXQgPSBhcC0+dHhxLm9mZnNldDsKKwkJfQorCX0KKworc3RsaV9kb25lc3RhcnR1cDoKKwlFQlJERElTQUJMRShicmRwKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCWlmIChyYyA9PSAwKQorCQlicmRwLT5zdGF0ZSB8PSBCU1RfU1RBUlRFRDsKKworCWlmICghIHN0bGlfdGltZXJvbikgeworCQlzdGxpX3RpbWVyb24rKzsKKwkJc3RsaV90aW1lcmxpc3QuZXhwaXJlcyA9IFNUTElfVElNRU9VVDsKKwkJYWRkX3RpbWVyKCZzdGxpX3RpbWVybGlzdCk7CisJfQorCisJcmV0dXJuKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUHJvYmUgYW5kIGluaXRpYWxpemUgdGhlIHNwZWNpZmllZCBib2FyZC4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBzdGxpX2JyZGluaXQoc3RsaWJyZF90ICpicmRwKQoreworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfYnJkaW5pdChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCXN0bGlfYnJkc1ticmRwLT5icmRucl0gPSBicmRwOworCisJc3dpdGNoIChicmRwLT5icmR0eXBlKSB7CisJY2FzZSBCUkRfRUNQOgorCWNhc2UgQlJEX0VDUEU6CisJY2FzZSBCUkRfRUNQTUM6CisJY2FzZSBCUkRfRUNQUENJOgorCQlzdGxpX2luaXRlY3AoYnJkcCk7CisJCWJyZWFrOworCWNhc2UgQlJEX09OQk9BUkQ6CisJY2FzZSBCUkRfT05CT0FSREU6CisJY2FzZSBCUkRfT05CT0FSRDI6CisJY2FzZSBCUkRfT05CT0FSRDMyOgorCWNhc2UgQlJEX09OQk9BUkQyXzMyOgorCWNhc2UgQlJEX09OQk9BUkRSUzoKKwljYXNlIEJSRF9CUlVNQlk0OgorCWNhc2UgQlJEX0JSVU1CWTg6CisJY2FzZSBCUkRfQlJVTUJZMTY6CisJY2FzZSBCUkRfU1RBTExJT046CisJCXN0bGlfaW5pdG9uYihicmRwKTsKKwkJYnJlYWs7CisJY2FzZSBCUkRfRUFTWUlPOgorCWNhc2UgQlJEX0VDSDoKKwljYXNlIEJSRF9FQ0hNQzoKKwljYXNlIEJSRF9FQ0hQQ0k6CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046ICVzIGJvYXJkIHR5cGUgbm90IHN1cHBvcnRlZCBpbiAiCisJCQkJInRoaXMgZHJpdmVyXG4iLCBzdGxpX2JyZG5hbWVzW2JyZHAtPmJyZHR5cGVdKTsKKwkJcmV0dXJuKEVOT0RFVik7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogYm9hcmQ9JWQgaXMgdW5rbm93biBib2FyZCAiCisJCQkJInR5cGU9JWRcbiIsIGJyZHAtPmJyZG5yLCBicmRwLT5icmR0eXBlKTsKKwkJcmV0dXJuKEVOT0RFVik7CisJfQorCisJaWYgKChicmRwLT5zdGF0ZSAmIEJTVF9GT1VORCkgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiAlcyBib2FyZCBub3QgZm91bmQsIGJvYXJkPSVkICIKKwkJCQkiaW89JXggbWVtPSV4XG4iLAorCQkJc3RsaV9icmRuYW1lc1ticmRwLT5icmR0eXBlXSwgYnJkcC0+YnJkbnIsCisJCQlicmRwLT5pb2Jhc2UsIChpbnQpIGJyZHAtPm1lbWFkZHIpOworCQlyZXR1cm4oRU5PREVWKTsKKwl9CisKKwlzdGxpX2luaXRwb3J0cyhicmRwKTsKKwlwcmludGsoS0VSTl9JTkZPICJTVEFMTElPTjogJXMgZm91bmQsIGJvYXJkPSVkIGlvPSV4IG1lbT0leCAiCisJCSJucnBhbmVscz0lZCBucnBvcnRzPSVkXG4iLCBzdGxpX2JyZG5hbWVzW2JyZHAtPmJyZHR5cGVdLAorCQlicmRwLT5icmRuciwgYnJkcC0+aW9iYXNlLCAoaW50KSBicmRwLT5tZW1hZGRyLAorCQlicmRwLT5ucnBhbmVscywgYnJkcC0+bnJwb3J0cyk7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglQcm9iZSBhcm91bmQgdHJ5aW5nIHRvIGZpbmQgd2hlcmUgdGhlIEVJU0EgYm9hcmRzIHNoYXJlZCBtZW1vcnkKKyAqCW1pZ2h0IGJlLiBUaGlzIGlzIGEgYml0IGlmIGhhY2ssIGJ1dCBpdCBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8uCisgKi8KKworc3RhdGljIGludCBzdGxpX2Vpc2FtZW1wcm9iZShzdGxpYnJkX3QgKmJyZHApCit7CisJY2RrZWNwc2lnX3QJZWNwc2lnLCAqZWNwc2lncDsKKwljZGtvbmJzaWdfdAlvbmJzaWcsICpvbmJzaWdwOworCWludAkJaSwgZm91bmRpdDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZWlzYW1lbXByb2JlKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisvKgorICoJRmlyc3QgdXAgd2UgcmVzZXQgdGhlIGJvYXJkLCB0byBnZXQgaXQgaW50byBhIGtub3duIHN0YXRlLiBUaGVyZQorICoJaXMgb25seSAyIGJvYXJkIHR5cGVzIGhlcmUgd2UgbmVlZCB0byB3b3JyeSBhYm91dC4gRG9uO3QgdXNlIHRoZQorICoJc3RhbmRhcmQgYm9hcmQgaW5pdCByb3V0aW5lIGhlcmUsIGl0IHByb2dyYW1zIHVwIHRoZSBzaGFyZWQKKyAqCW1lbW9yeSBhZGRyZXNzLCBhbmQgd2UgZG9uJ3Qga25vdyBpdCB5ZXQuLi4KKyAqLworCWlmIChicmRwLT5icmR0eXBlID09IEJSRF9FQ1BFKSB7CisJCW91dGIoMHgxLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQlJERU5BQikpOworCQlvdXRiKEVDUF9FSVNUT1AsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlDT05GUikpOworCQl1ZGVsYXkoMTApOworCQlvdXRiKEVDUF9FSURJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlDT05GUikpOworCQl1ZGVsYXkoNTAwKTsKKwkJc3RsaV9lY3BlaWVuYWJsZShicmRwKTsKKwl9IGVsc2UgaWYgKGJyZHAtPmJyZHR5cGUgPT0gQlJEX09OQk9BUkRFKSB7CisJCW91dGIoMHgxLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQlJERU5BQikpOworCQlvdXRiKE9OQl9FSVNUT1AsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlDT05GUikpOworCQl1ZGVsYXkoMTApOworCQlvdXRiKE9OQl9FSURJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlDT05GUikpOworCQltZGVsYXkoMTAwKTsKKwkJb3V0YigweDEsIGJyZHAtPmlvYmFzZSk7CisJCW1kZWxheSgxKTsKKwkJc3RsaV9vbmJlZW5hYmxlKGJyZHApOworCX0gZWxzZSB7CisJCXJldHVybigtRU5PREVWKTsKKwl9CisKKwlmb3VuZGl0ID0gMDsKKwlicmRwLT5tZW1zaXplID0gRUNQX01FTVNJWkU7CisKKy8qCisgKglCb2FyZCBzaGFyZWQgbWVtb3J5IGlzIGVuYWJsZWQsIHNvIG5vdyB3ZSBoYXZlIGEgcG9rZSBhcm91bmQgYW5kCisgKglzZWUgaWYgd2UgY2FuIGZpbmQgaXQuCisgKi8KKwlmb3IgKGkgPSAwOyAoaSA8IHN0bGlfZWlzYW1lbXBzaXplKTsgaSsrKSB7CisJCWJyZHAtPm1lbWFkZHIgPSBzdGxpX2Vpc2FtZW1wcm9iZWFkZHJzW2ldOworCQlicmRwLT5tZW1iYXNlID0gKHZvaWQgKikgYnJkcC0+bWVtYWRkcjsKKwkJYnJkcC0+bWVtYmFzZSA9IGlvcmVtYXAoYnJkcC0+bWVtYWRkciwgYnJkcC0+bWVtc2l6ZSk7CisJCWlmIChicmRwLT5tZW1iYXNlID09ICh2b2lkICopIE5VTEwpCisJCQljb250aW51ZTsKKworCQlpZiAoYnJkcC0+YnJkdHlwZSA9PSBCUkRfRUNQRSkgeworCQkJZWNwc2lncCA9IChjZGtlY3BzaWdfdCAqKSBzdGxpX2VjcGVpZ2V0bWVtcHRyKGJyZHAsCisJCQkJQ0RLX1NJR0FERFIsIF9fTElORV9fKTsKKwkJCW1lbWNweSgmZWNwc2lnLCBlY3BzaWdwLCBzaXplb2YoY2RrZWNwc2lnX3QpKTsKKwkJCWlmIChlY3BzaWcubWFnaWMgPT0gRUNQX01BR0lDKQorCQkJCWZvdW5kaXQgPSAxOworCQl9IGVsc2UgeworCQkJb25ic2lncCA9IChjZGtvbmJzaWdfdCAqKSBzdGxpX29uYmVnZXRtZW1wdHIoYnJkcCwKKwkJCQlDREtfU0lHQUREUiwgX19MSU5FX18pOworCQkJbWVtY3B5KCZvbmJzaWcsIG9uYnNpZ3AsIHNpemVvZihjZGtvbmJzaWdfdCkpOworCQkJaWYgKChvbmJzaWcubWFnaWMwID09IE9OQl9NQUdJQzApICYmCisJCQkgICAgKG9uYnNpZy5tYWdpYzEgPT0gT05CX01BR0lDMSkgJiYKKwkJCSAgICAob25ic2lnLm1hZ2ljMiA9PSBPTkJfTUFHSUMyKSAmJgorCQkJICAgIChvbmJzaWcubWFnaWMzID09IE9OQl9NQUdJQzMpKQorCQkJCWZvdW5kaXQgPSAxOworCQl9CisKKwkJaW91bm1hcChicmRwLT5tZW1iYXNlKTsKKwkJaWYgKGZvdW5kaXQpCisJCQlicmVhazsKKwl9CisKKy8qCisgKglSZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgZm91bmQgdGhlIHNoYXJlZCBtZW1vcnkgb3Igbm90IHdlIG11c3QKKyAqCWRpc2FibGUgdGhlIHJlZ2lvbi4gQWZ0ZXIgdGhhdCByZXR1cm4gc3VjY2VzcyBvciBmYWlsdXJlLgorICovCisJaWYgKGJyZHAtPmJyZHR5cGUgPT0gQlJEX0VDUEUpCisJCXN0bGlfZWNwZWlkaXNhYmxlKGJyZHApOworCWVsc2UKKwkJc3RsaV9vbmJlZGlzYWJsZShicmRwKTsKKworCWlmICghIGZvdW5kaXQpIHsKKwkJYnJkcC0+bWVtYWRkciA9IDA7CisJCWJyZHAtPm1lbWJhc2UgPSBOVUxMOworCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBmYWlsZWQgdG8gcHJvYmUgc2hhcmVkIG1lbW9yeSAiCisJCQkJInJlZ2lvbiBmb3IgJXMgaW4gRUlTQSBzbG90PSVkXG4iLAorCQkJc3RsaV9icmRuYW1lc1ticmRwLT5icmR0eXBlXSwgKGJyZHAtPmlvYmFzZSA+PiAxMikpOworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBzdGxpX2dldGJyZG5yKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1RMX01BWEJSRFM7IGkrKykgeworCQlpZiAoIXN0bGlfYnJkc1tpXSkgeworCQkJaWYgKGkgPj0gc3RsaV9ucmJyZHMpCisJCQkJc3RsaV9ucmJyZHMgPSBpICsgMTsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUHJvYmUgYXJvdW5kIGFuZCB0cnkgdG8gZmluZCBhbnkgRUlTQSBib2FyZHMgaW4gc3lzdGVtLiBUaGUgYmlnZ2VzdAorICoJcHJvYmxlbSBoZXJlIGlzIGZpbmRpbmcgb3V0IHdoYXQgbWVtb3J5IGFkZHJlc3MgaXMgYXNzb2NpYXRlZCB3aXRoCisgKglhbiBFSVNBIGJvYXJkIGFmdGVyIGl0IGlzIGZvdW5kLiBUaGUgcmVnaXN0ZXJzIG9mIHRoZSBFQ1BFIGFuZAorICoJT05ib2FyZEUgYXJlIG5vdCByZWFkYWJsZSAtIHNvIHdlIGNhbid0IHJlYWQgdGhlbSBmcm9tIHRoZXJlLiBXZQorICoJZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIEVJU0EgQ01PUyAob3IgRUlTQSBCSU9TKSBzbyB3ZSBkb24ndAorICoJYWN0dWFsbHkgaGF2ZSBhbnkgd2F5IHRvIGZpbmQgb3V0IHRoZSByZWFsIHZhbHVlLiBUaGUgYmVzdCB3ZSBjYW4KKyAqCWRvIGlzIGdvIHByb2JpbmcgYXJvdW5kIGluIHRoZSB1c3VhbCBwbGFjZXMgaG9waW5nIHdlIGNhbiBmaW5kIGl0LgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9maW5kZWlzYWJyZHModm9pZCkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJdW5zaWduZWQgaW50CWlvYmFzZSwgZWlkOworCWludAkJaTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZmluZGVpc2FicmRzKClcbiIpOworI2VuZGlmCisKKy8qCisgKglGaXJzdGx5IGNoZWNrIGlmIHRoaXMgaXMgYW4gRUlTQSBzeXN0ZW0uIERvIHRoaXMgYnkgcHJvYmluZyBmb3IKKyAqCXRoZSBzeXN0ZW0gYm9hcmQgRUlTQSBJRC4gSWYgdGhpcyBpcyBub3QgYW4gRUlTQSBzeXN0ZW0gdGhlbgorICoJZG9uJ3QgYm90aGVyIGdvaW5nIGFueSBmdXJ0aGVyIQorICovCisJb3V0YigweGZmLCAweGM4MCk7CisJaWYgKGluYigweGM4MCkgPT0gMHhmZikKKwkJcmV0dXJuKDApOworCisvKgorICoJTG9va3MgbGlrZSBhbiBFSVNBIHN5c3RlbSwgc28gZ28gc2VhcmNoaW5nIGZvciBFSVNBIGJvYXJkcy4KKyAqLworCWZvciAoaW9iYXNlID0gMHgxMDAwOyAoaW9iYXNlIDw9IDB4YzAwMCk7IGlvYmFzZSArPSAweDEwMDApIHsKKwkJb3V0YigweGZmLCAoaW9iYXNlICsgMHhjODApKTsKKwkJZWlkID0gaW5iKGlvYmFzZSArIDB4YzgwKTsKKwkJZWlkIHw9IGluYihpb2Jhc2UgKyAweGM4MSkgPDwgODsKKwkJaWYgKGVpZCAhPSBTVExfRUlTQUlEKQorCQkJY29udGludWU7CisKKy8qCisgKgkJV2UgaGF2ZSBmb3VuZCBhIGJvYXJkLiBOZWVkIHRvIGNoZWNrIGlmIHRoaXMgYm9hcmQgd2FzCisgKgkJc3RhdGljYWxseSBjb25maWd1cmVkIGFscmVhZHkgKGp1c3QgaW4gY2FzZSEpLgorICovCisJCWZvciAoaSA9IDA7IChpIDwgU1RMX01BWEJSRFMpOyBpKyspIHsKKwkJCWJyZHAgPSBzdGxpX2JyZHNbaV07CisJCQlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCQkJY29udGludWU7CisJCQlpZiAoYnJkcC0+aW9iYXNlID09IGlvYmFzZSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA8IFNUTF9NQVhCUkRTKQorCQkJY29udGludWU7CisKKy8qCisgKgkJV2UgaGF2ZSBmb3VuZCBhIFN0YWxsaW9uIGJvYXJkIGFuZCBpdCBpcyBub3QgY29uZmlndXJlZCBhbHJlYWR5LgorICoJCUFsbG9jYXRlIGEgYm9hcmQgc3RydWN0dXJlIGFuZCBpbml0aWFsaXplIGl0LgorICovCisJCWlmICgoYnJkcCA9IHN0bGlfYWxsb2NicmQoKSkgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQkJcmV0dXJuKC1FTk9NRU0pOworCQlpZiAoKGJyZHAtPmJyZG5yID0gc3RsaV9nZXRicmRucigpKSA8IDApCisJCQlyZXR1cm4oLUVOT01FTSk7CisJCWVpZCA9IGluYihpb2Jhc2UgKyAweGM4Mik7CisJCWlmIChlaWQgPT0gRUNQX0VJU0FJRCkKKwkJCWJyZHAtPmJyZHR5cGUgPSBCUkRfRUNQRTsKKwkJZWxzZSBpZiAoZWlkID09IE9OQl9FSVNBSUQpCisJCQlicmRwLT5icmR0eXBlID0gQlJEX09OQk9BUkRFOworCQllbHNlCisJCQlicmRwLT5icmR0eXBlID0gQlJEX1VOS05PV047CisJCWJyZHAtPmlvYmFzZSA9IGlvYmFzZTsKKwkJb3V0YigweDEsIChpb2Jhc2UgKyAweGM4NCkpOworCQlpZiAoc3RsaV9laXNhbWVtcHJvYmUoYnJkcCkpCisJCQlvdXRiKDAsIChpb2Jhc2UgKyAweGM4NCkpOworCQlzdGxpX2JyZGluaXQoYnJkcCk7CisJfQorCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglGaW5kIHRoZSBuZXh0IGF2YWlsYWJsZSBib2FyZCBudW1iZXIgdGhhdCBpcyBmcmVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmCUNPTkZJR19QQ0kKKworLyoKKyAqCVdlIGhhdmUgYSBTdGFsbGlvbiBib2FyZC4gQWxsb2NhdGUgYSBib2FyZCBzdHJ1Y3R1cmUgYW5kCisgKglpbml0aWFsaXplIGl0LiBSZWFkIGl0cyBJTyBhbmQgTUVNT1JZIHJlc291cmNlcyBmcm9tIFBDSQorICoJY29uZmlndXJhdGlvbiBzcGFjZS4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfaW5pdHBjaWJyZChpbnQgYnJkdHlwZSwgc3RydWN0IHBjaV9kZXYgKmRldnApCit7CisJc3RsaWJyZF90CSpicmRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9pbml0cGNpYnJkKGJyZHR5cGU9JWQsYnVzbnI9JXgsZGV2bnI9JXgpXG4iLAorCQlicmR0eXBlLCBkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuKTsKKyNlbmRpZgorCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldnApKQorCQlyZXR1cm4oLUVJTyk7CisJaWYgKChicmRwID0gc3RsaV9hbGxvY2JyZCgpKSA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybigtRU5PTUVNKTsKKwlpZiAoKGJyZHAtPmJyZG5yID0gc3RsaV9nZXRicmRucigpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU1RBTExJT046IHRvbyBtYW55IGJvYXJkcyBmb3VuZCwgIgorCQkJIm1heGltdW0gc3VwcG9ydGVkICVkXG4iLCBTVExfTUFYQlJEUyk7CisJCXJldHVybigwKTsKKwl9CisJYnJkcC0+YnJkdHlwZSA9IGJyZHR5cGU7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICIlcyglZCk6IEJBUltdPSVseCwlbHgsJWx4LCVseFxuIiwgX19GSUxFX18sIF9fTElORV9fLAorCQlwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMCksCisJCXBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAxKSwKKwkJcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDIpLAorCQlwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMykpOworI2VuZGlmCisKKy8qCisgKglXZSBoYXZlIGFsbCByZXNvdXJjZXMgZnJvbSB0aGUgYm9hcmQsIHNvIGxldHMgc2V0dXAgdGhlIGFjdHVhbAorICoJYm9hcmQgc3RydWN0dXJlIG5vdy4KKyAqLworCWJyZHAtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAzKTsKKwlicmRwLT5tZW1hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDIpOworCXN0bGlfYnJkaW5pdChicmRwKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRmluZCBhbGwgU3RhbGxpb24gUENJIGJvYXJkcyB0aGF0IG1pZ2h0IGJlIGluc3RhbGxlZC4gSW5pdGlhbGl6ZSBlYWNoCisgKglvbmUgYXMgaXQgaXMgZm91bmQuCisgKi8KKworc3RhdGljIGludCBzdGxpX2ZpbmRwY2licmRzKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYJKmRldiA9IE5VTEw7CisJaW50CQlyYzsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX2ZpbmRwY2licmRzKClcbiIpOworI2VuZGlmCisKKwl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1NUQUxMSU9OLAorCSAgICBQQ0lfREVWSUNFX0lEX0VDUkEsIGRldikpKSB7CisJCWlmICgocmMgPSBzdGxpX2luaXRwY2licmQoQlJEX0VDUFBDSSwgZGV2KSkpCisJCQlyZXR1cm4ocmMpOworCX0KKworCXJldHVybigwKTsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUFsbG9jYXRlIGEgbmV3IGJvYXJkIHN0cnVjdHVyZS4gRmlsbCBvdXQgdGhlIGJhc2ljIGluZm8gaW4gaXQuCisgKi8KKworc3RhdGljIHN0bGlicmRfdCAqc3RsaV9hbGxvY2JyZCh2b2lkKQoreworCXN0bGlicmRfdAkqYnJkcDsKKworCWJyZHAgPSAoc3RsaWJyZF90ICopIHN0bGlfbWVtYWxsb2Moc2l6ZW9mKHN0bGlicmRfdCkpOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ICIKKwkJCQkiKHNpemU9JWQpXG4iLCBzaXplb2Yoc3RsaWJyZF90KSk7CisJCXJldHVybigoc3RsaWJyZF90ICopIE5VTEwpOworCX0KKworCW1lbXNldChicmRwLCAwLCBzaXplb2Yoc3RsaWJyZF90KSk7CisJYnJkcC0+bWFnaWMgPSBTVExJX0JPQVJETUFHSUM7CisJcmV0dXJuKGJyZHApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTY2FuIHRocm91Z2ggYWxsIHRoZSBib2FyZHMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHNlZSB3aGF0IHdlCisgKgljYW4gZmluZC4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfaW5pdGJyZHModm9pZCkKK3sKKwlzdGxpYnJkX3QJKmJyZHAsICpueHRicmRwOworCXN0bGNvbmZfdAkqY29uZnA7CisJaW50CQlpLCBqOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9pbml0YnJkcygpXG4iKTsKKyNlbmRpZgorCisJaWYgKHN0bGlfbnJicmRzID4gU1RMX01BWEJSRFMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU1RBTExJT046IHRvbyBtYW55IGJvYXJkcyBpbiBjb25maWd1cmF0aW9uICIKKwkJCSJ0YWJsZSwgdHJ1bmNhdGluZyB0byAlZFxuIiwgU1RMX01BWEJSRFMpOworCQlzdGxpX25yYnJkcyA9IFNUTF9NQVhCUkRTOworCX0KKworLyoKKyAqCUZpcnN0bHkgc2NhbiB0aGUgbGlzdCBvZiBzdGF0aWMgYm9hcmRzIGNvbmZpZ3VyZWQuIEFsbG9jYXRlCisgKglyZXNvdXJjZXMgYW5kIGluaXRpYWxpemUgdGhlIGJvYXJkcyBhcyBmb3VuZC4gSWYgdGhpcyBpcyBhCisgKgltb2R1bGUgdGhlbiBsZXQgdGhlIG1vZHVsZSBhcmdzIG92ZXJyaWRlIHN0YXRpYyBjb25maWd1cmF0aW9uLgorICovCisJZm9yIChpID0gMDsgKGkgPCBzdGxpX25yYnJkcyk7IGkrKykgeworCQljb25mcCA9ICZzdGxpX2JyZGNvbmZbaV07CisjaWZkZWYgTU9EVUxFCisJCXN0bGlfcGFyc2VicmQoY29uZnAsIHN0bGlfYnJkc3BbaV0pOworI2VuZGlmCisJCWlmICgoYnJkcCA9IHN0bGlfYWxsb2NicmQoKSkgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQkJcmV0dXJuKC1FTk9NRU0pOworCQlicmRwLT5icmRuciA9IGk7CisJCWJyZHAtPmJyZHR5cGUgPSBjb25mcC0+YnJkdHlwZTsKKwkJYnJkcC0+aW9iYXNlID0gY29uZnAtPmlvYWRkcjE7CisJCWJyZHAtPm1lbWFkZHIgPSBjb25mcC0+bWVtYWRkcjsKKwkJc3RsaV9icmRpbml0KGJyZHApOworCX0KKworLyoKKyAqCVN0YXRpYyBjb25maWd1cmF0aW9uIHRhYmxlIGRvbmUsIHNvIG5vdyB1c2UgZHluYW1pYyBtZXRob2RzIHRvCisgKglzZWUgaWYgYW55IG1vcmUgYm9hcmRzIHNob3VsZCBiZSBjb25maWd1cmVkLgorICovCisjaWZkZWYgTU9EVUxFCisJc3RsaV9hcmdicmRzKCk7CisjZW5kaWYKKwlpZiAoc3RsaV9laXNhcHJvYmUpCisJCXN0bGlfZmluZGVpc2FicmRzKCk7CisjaWZkZWYgQ09ORklHX1BDSQorCXN0bGlfZmluZHBjaWJyZHMoKTsKKyNlbmRpZgorCisvKgorICoJQWxsIGZvdW5kIGJvYXJkcyBhcmUgaW5pdGlhbGl6ZWQuIE5vdyBmb3IgYSBsaXR0bGUgb3B0aW1pemF0aW9uLCBpZgorICoJbm8gYm9hcmRzIGFyZSBzaGFyaW5nIHRoZSAic2hhcmVkIG1lbW9yeSIgcmVnaW9ucyB0aGVuIHdlIGNhbiBqdXN0CisgKglsZWF2ZSB0aGVtIGFsbCBlbmFibGVkLiBUaGlzIGlzIGluIGZhY3QgdGhlIHVzdWFsIGNhc2UuCisgKi8KKwlzdGxpX3NoYXJlZCA9IDA7CisJaWYgKHN0bGlfbnJicmRzID4gMSkgeworCQlmb3IgKGkgPSAwOyAoaSA8IHN0bGlfbnJicmRzKTsgaSsrKSB7CisJCQlicmRwID0gc3RsaV9icmRzW2ldOworCQkJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChqID0gaSArIDE7IChqIDwgc3RsaV9ucmJyZHMpOyBqKyspIHsKKwkJCQlueHRicmRwID0gc3RsaV9icmRzW2pdOworCQkJCWlmIChueHRicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKChicmRwLT5tZW1iYXNlID49IG54dGJyZHAtPm1lbWJhc2UpICYmCisJCQkJICAgIChicmRwLT5tZW1iYXNlIDw9IChueHRicmRwLT5tZW1iYXNlICsKKwkJCQkgICAgbnh0YnJkcC0+bWVtc2l6ZSAtIDEpKSkgeworCQkJCQlzdGxpX3NoYXJlZCsrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAoc3RsaV9zaGFyZWQgPT0gMCkgeworCQlmb3IgKGkgPSAwOyAoaSA8IHN0bGlfbnJicmRzKTsgaSsrKSB7CisJCQlicmRwID0gc3RsaV9icmRzW2ldOworCQkJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGJyZHAtPnN0YXRlICYgQlNUX0ZPVU5EKSB7CisJCQkJRUJSREVOQUJMRShicmRwKTsKKwkJCQlicmRwLT5lbmFibGUgPSBOVUxMOworCQkJCWJyZHAtPmRpc2FibGUgPSBOVUxMOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglDb2RlIHRvIGhhbmRsZSBhbiAic3RhbGlvbWVtIiByZWFkIG9wZXJhdGlvbi4gVGhpcyBkZXZpY2UgaXMgdGhlIAorICoJY29udGVudHMgb2YgdGhlIGJvYXJkIHNoYXJlZCBtZW1vcnkuIEl0IGlzIHVzZWQgZm9yIGRvd24gbG9hZGluZworICoJdGhlIHNsYXZlIGltYWdlIChhbmQgZGVidWdnaW5nIDotKQorICovCisKK3N0YXRpYyBzc2l6ZV90IHN0bGlfbWVtcmVhZChzdHJ1Y3QgZmlsZSAqZnAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZwKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdm9pZAkJKm1lbXB0cjsKKwlzdGxpYnJkX3QJKmJyZHA7CisJaW50CQlicmRuciwgc2l6ZSwgbjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfbWVtcmVhZChmcD0leCxidWY9JXgsY291bnQ9JXgsb2ZmcD0leClcbiIsCisJCQkoaW50KSBmcCwgKGludCkgYnVmLCBjb3VudCwgKGludCkgb2ZmcCk7CisjZW5kaWYKKworCWJyZG5yID0gaW1pbm9yKGZwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaWYgKGJyZG5yID49IHN0bGlfbnJicmRzKQorCQlyZXR1cm4oLUVOT0RFVik7CisJYnJkcCA9IHN0bGlfYnJkc1ticmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKGJyZHAtPnN0YXRlID09IDApCisJCXJldHVybigtRU5PREVWKTsKKwlpZiAoZnAtPmZfcG9zID49IGJyZHAtPm1lbXNpemUpCisJCXJldHVybigwKTsKKworCXNpemUgPSBNSU4oY291bnQsIChicmRwLT5tZW1zaXplIC0gZnAtPmZfcG9zKSk7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlFQlJERU5BQkxFKGJyZHApOworCXdoaWxlIChzaXplID4gMCkgeworCQltZW1wdHIgPSAodm9pZCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIGZwLT5mX3Bvcyk7CisJCW4gPSBNSU4oc2l6ZSwgKGJyZHAtPnBhZ2VzaXplIC0gKCgodW5zaWduZWQgbG9uZykgZnAtPmZfcG9zKSAlIGJyZHAtPnBhZ2VzaXplKSkpOworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgbWVtcHRyLCBuKSkgeworCQkJY291bnQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJZnAtPmZfcG9zICs9IG47CisJCWJ1ZiArPSBuOworCQlzaXplIC09IG47CisJfQorb3V0OgorCUVCUkRESVNBQkxFKGJyZHApOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuKGNvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQ29kZSB0byBoYW5kbGUgYW4gInN0YWxpb21lbSIgd3JpdGUgb3BlcmF0aW9uLiBUaGlzIGRldmljZSBpcyB0aGUgCisgKgljb250ZW50cyBvZiB0aGUgYm9hcmQgc2hhcmVkIG1lbW9yeS4gSXQgaXMgdXNlZCBmb3IgZG93biBsb2FkaW5nCisgKgl0aGUgc2xhdmUgaW1hZ2UgKGFuZCBkZWJ1Z2dpbmcgOi0pCisgKi8KKworc3RhdGljIHNzaXplX3Qgc3RsaV9tZW13cml0ZShzdHJ1Y3QgZmlsZSAqZnAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZwKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdm9pZAkJKm1lbXB0cjsKKwlzdGxpYnJkX3QJKmJyZHA7CisJY2hhcgkJX191c2VyICpjaGJ1ZjsKKwlpbnQJCWJyZG5yLCBzaXplLCBuOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9tZW13cml0ZShmcD0leCxidWY9JXgsY291bnQ9JXgsb2ZmcD0leClcbiIsCisJCQkoaW50KSBmcCwgKGludCkgYnVmLCBjb3VudCwgKGludCkgb2ZmcCk7CisjZW5kaWYKKworCWJyZG5yID0gaW1pbm9yKGZwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaWYgKGJyZG5yID49IHN0bGlfbnJicmRzKQorCQlyZXR1cm4oLUVOT0RFVik7CisJYnJkcCA9IHN0bGlfYnJkc1ticmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKGJyZHAtPnN0YXRlID09IDApCisJCXJldHVybigtRU5PREVWKTsKKwlpZiAoZnAtPmZfcG9zID49IGJyZHAtPm1lbXNpemUpCisJCXJldHVybigwKTsKKworCWNoYnVmID0gKGNoYXIgX191c2VyICopIGJ1ZjsKKwlzaXplID0gTUlOKGNvdW50LCAoYnJkcC0+bWVtc2l6ZSAtIGZwLT5mX3BvcykpOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJRUJSREVOQUJMRShicmRwKTsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJbWVtcHRyID0gKHZvaWQgKikgRUJSREdFVE1FTVBUUihicmRwLCBmcC0+Zl9wb3MpOworCQluID0gTUlOKHNpemUsIChicmRwLT5wYWdlc2l6ZSAtICgoKHVuc2lnbmVkIGxvbmcpIGZwLT5mX3BvcykgJSBicmRwLT5wYWdlc2l6ZSkpKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKG1lbXB0ciwgY2hidWYsIG4pKSB7CisJCQljb3VudCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlmcC0+Zl9wb3MgKz0gbjsKKwkJY2hidWYgKz0gbjsKKwkJc2l6ZSAtPSBuOworCX0KK291dDoKKwlFQlJERElTQUJMRShicmRwKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybihjb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJldHVybiB0aGUgYm9hcmQgc3RhdHMgc3RydWN0dXJlIHRvIHVzZXIgYXBwLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9nZXRicmRzdGF0cyhjb21icmRfdCBfX3VzZXIgKmJwKQoreworCXN0bGlicmRfdAkqYnJkcDsKKwlpbnQJCWk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnN0bGlfYnJkc3RhdHMsIGJwLCBzaXplb2YoY29tYnJkX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHN0bGlfYnJkc3RhdHMuYnJkID49IFNUTF9NQVhCUkRTKQorCQlyZXR1cm4oLUVOT0RFVik7CisJYnJkcCA9IHN0bGlfYnJkc1tzdGxpX2JyZHN0YXRzLmJyZF07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisKKwltZW1zZXQoJnN0bGlfYnJkc3RhdHMsIDAsIHNpemVvZihjb21icmRfdCkpOworCXN0bGlfYnJkc3RhdHMuYnJkID0gYnJkcC0+YnJkbnI7CisJc3RsaV9icmRzdGF0cy50eXBlID0gYnJkcC0+YnJkdHlwZTsKKwlzdGxpX2JyZHN0YXRzLmh3aWQgPSAwOworCXN0bGlfYnJkc3RhdHMuc3RhdGUgPSBicmRwLT5zdGF0ZTsKKwlzdGxpX2JyZHN0YXRzLmlvYWRkciA9IGJyZHAtPmlvYmFzZTsKKwlzdGxpX2JyZHN0YXRzLm1lbWFkZHIgPSBicmRwLT5tZW1hZGRyOworCXN0bGlfYnJkc3RhdHMubnJwYW5lbHMgPSBicmRwLT5ucnBhbmVsczsKKwlzdGxpX2JyZHN0YXRzLm5ycG9ydHMgPSBicmRwLT5ucnBvcnRzOworCWZvciAoaSA9IDA7IChpIDwgYnJkcC0+bnJwYW5lbHMpOyBpKyspIHsKKwkJc3RsaV9icmRzdGF0cy5wYW5lbHNbaV0ucGFuZWwgPSBpOworCQlzdGxpX2JyZHN0YXRzLnBhbmVsc1tpXS5od2lkID0gYnJkcC0+cGFuZWxpZHNbaV07CisJCXN0bGlfYnJkc3RhdHMucGFuZWxzW2ldLm5ycG9ydHMgPSBicmRwLT5wYW5lbHNbaV07CisJfQorCisJaWYgKGNvcHlfdG9fdXNlcihicCwgJnN0bGlfYnJkc3RhdHMsIHNpemVvZihjb21icmRfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJlc29sdmUgdGhlIHJlZmVyZW5jZWQgcG9ydCBudW1iZXIgaW50byBhIHBvcnQgc3RydWN0IHBvaW50ZXIuCisgKi8KKworc3RhdGljIHN0bGlwb3J0X3QgKnN0bGlfZ2V0cG9ydChpbnQgYnJkbnIsIGludCBwYW5lbG5yLCBpbnQgcG9ydG5yKQoreworCXN0bGlicmRfdAkqYnJkcDsKKwlpbnQJCWk7CisKKwlpZiAoKGJyZG5yIDwgMCkgfHwgKGJyZG5yID49IFNUTF9NQVhCUkRTKSkKKwkJcmV0dXJuKChzdGxpcG9ydF90ICopIE5VTEwpOworCWJyZHAgPSBzdGxpX2JyZHNbYnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKChzdGxpcG9ydF90ICopIE5VTEwpOworCWZvciAoaSA9IDA7IChpIDwgcGFuZWxucik7IGkrKykKKwkJcG9ydG5yICs9IGJyZHAtPnBhbmVsc1tpXTsKKwlpZiAoKHBvcnRuciA8IDApIHx8IChwb3J0bnIgPj0gYnJkcC0+bnJwb3J0cykpCisJCXJldHVybigoc3RsaXBvcnRfdCAqKSBOVUxMKTsKKwlyZXR1cm4oYnJkcC0+cG9ydHNbcG9ydG5yXSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJldHVybiB0aGUgcG9ydCBzdGF0cyBzdHJ1Y3R1cmUgdG8gdXNlciBhcHAuIEEgTlVMTCBwb3J0IHN0cnVjdAorICoJcG9pbnRlciBwYXNzZWQgaW4gbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGZpbmQgb3V0IGZyb20gdGhlIGFwcAorICoJd2hhdCBwb3J0IHRvIGdldCBzdGF0cyBmb3IgKHVzZWQgdGhyb3VnaCBib2FyZCBjb250cm9sIGRldmljZSkuCisgKi8KKworc3RhdGljIGludCBzdGxpX3BvcnRjbWRzdGF0cyhzdGxpcG9ydF90ICpwb3J0cCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXN0bGlicmRfdAkqYnJkcDsKKwlpbnQJCXJjOworCisJbWVtc2V0KCZzdGxpX2NvbXN0YXRzLCAwLCBzaXplb2YoY29tc3RhdHNfdCkpOworCisJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisKKwlpZiAoYnJkcC0+c3RhdGUgJiBCU1RfU1RBUlRFRCkgeworCQlpZiAoKHJjID0gc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX0dFVFNUQVRTLAorCQkgICAgJnN0bGlfY2Rrc3RhdHMsIHNpemVvZihhc3lzdGF0c190KSwgMSkpIDwgMCkKKwkJCXJldHVybihyYyk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KCZzdGxpX2Nka3N0YXRzLCAwLCBzaXplb2YoYXN5c3RhdHNfdCkpOworCX0KKworCXN0bGlfY29tc3RhdHMuYnJkID0gcG9ydHAtPmJyZG5yOworCXN0bGlfY29tc3RhdHMucGFuZWwgPSBwb3J0cC0+cGFuZWxucjsKKwlzdGxpX2NvbXN0YXRzLnBvcnQgPSBwb3J0cC0+cG9ydG5yOworCXN0bGlfY29tc3RhdHMuc3RhdGUgPSBwb3J0cC0+c3RhdGU7CisJc3RsaV9jb21zdGF0cy5mbGFncyA9IHBvcnRwLT5mbGFnczsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWlmIChwb3J0cC0+dHR5ICE9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKSB7CisJCWlmIChwb3J0cC0+dHR5LT5kcml2ZXJfZGF0YSA9PSBwb3J0cCkgeworCQkJc3RsaV9jb21zdGF0cy50dHlzdGF0ZSA9IHBvcnRwLT50dHktPmZsYWdzOworCQkJc3RsaV9jb21zdGF0cy5yeGJ1ZmZlcmVkID0gcG9ydHAtPnR0eS0+ZmxpcC5jb3VudDsKKwkJCWlmIChwb3J0cC0+dHR5LT50ZXJtaW9zICE9IChzdHJ1Y3QgdGVybWlvcyAqKSBOVUxMKSB7CisJCQkJc3RsaV9jb21zdGF0cy5jZmxhZ3MgPSBwb3J0cC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCQkJCXN0bGlfY29tc3RhdHMuaWZsYWdzID0gcG9ydHAtPnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKKwkJCQlzdGxpX2NvbXN0YXRzLm9mbGFncyA9IHBvcnRwLT50dHktPnRlcm1pb3MtPmNfb2ZsYWc7CisJCQkJc3RsaV9jb21zdGF0cy5sZmxhZ3MgPSBwb3J0cC0+dHR5LT50ZXJtaW9zLT5jX2xmbGFnOworCQkJfQorCQl9CisJfQorCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJc3RsaV9jb21zdGF0cy50eHRvdGFsID0gc3RsaV9jZGtzdGF0cy50eGNoYXJzOworCXN0bGlfY29tc3RhdHMucnh0b3RhbCA9IHN0bGlfY2Rrc3RhdHMucnhjaGFycyArIHN0bGlfY2Rrc3RhdHMucmluZ292ZXI7CisJc3RsaV9jb21zdGF0cy50eGJ1ZmZlcmVkID0gc3RsaV9jZGtzdGF0cy50eHJpbmdxOworCXN0bGlfY29tc3RhdHMucnhidWZmZXJlZCArPSBzdGxpX2Nka3N0YXRzLnJ4cmluZ3E7CisJc3RsaV9jb21zdGF0cy5yeG92ZXJydW4gPSBzdGxpX2Nka3N0YXRzLm92ZXJydW5zOworCXN0bGlfY29tc3RhdHMucnhwYXJpdHkgPSBzdGxpX2Nka3N0YXRzLnBhcml0eTsKKwlzdGxpX2NvbXN0YXRzLnJ4ZnJhbWluZyA9IHN0bGlfY2Rrc3RhdHMuZnJhbWluZzsKKwlzdGxpX2NvbXN0YXRzLnJ4bG9zdCA9IHN0bGlfY2Rrc3RhdHMucmluZ292ZXI7CisJc3RsaV9jb21zdGF0cy5yeGJyZWFrcyA9IHN0bGlfY2Rrc3RhdHMucnhicmVha3M7CisJc3RsaV9jb21zdGF0cy50eGJyZWFrcyA9IHN0bGlfY2Rrc3RhdHMudHhicmVha3M7CisJc3RsaV9jb21zdGF0cy50eHhvbiA9IHN0bGlfY2Rrc3RhdHMudHhzdGFydDsKKwlzdGxpX2NvbXN0YXRzLnR4eG9mZiA9IHN0bGlfY2Rrc3RhdHMudHhzdG9wOworCXN0bGlfY29tc3RhdHMucnh4b24gPSBzdGxpX2Nka3N0YXRzLnJ4c3RhcnQ7CisJc3RsaV9jb21zdGF0cy5yeHhvZmYgPSBzdGxpX2Nka3N0YXRzLnJ4c3RvcDsKKwlzdGxpX2NvbXN0YXRzLnJ4cnRzb2ZmID0gc3RsaV9jZGtzdGF0cy5ydHNjbnQgLyAyOworCXN0bGlfY29tc3RhdHMucnhydHNvbiA9IHN0bGlfY2Rrc3RhdHMucnRzY250IC0gc3RsaV9jb21zdGF0cy5yeHJ0c29mZjsKKwlzdGxpX2NvbXN0YXRzLm1vZGVtID0gc3RsaV9jZGtzdGF0cy5kY2RjbnQ7CisJc3RsaV9jb21zdGF0cy5od2lkID0gc3RsaV9jZGtzdGF0cy5od2lkOworCXN0bGlfY29tc3RhdHMuc2lnbmFscyA9IHN0bGlfbWt0aW9jbShzdGxpX2Nka3N0YXRzLnNpZ25hbHMpOworCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gdGhlIHBvcnQgc3RhdHMgc3RydWN0dXJlIHRvIHVzZXIgYXBwLiBBIE5VTEwgcG9ydCBzdHJ1Y3QKKyAqCXBvaW50ZXIgcGFzc2VkIGluIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBmaW5kIG91dCBmcm9tIHRoZSBhcHAKKyAqCXdoYXQgcG9ydCB0byBnZXQgc3RhdHMgZm9yICh1c2VkIHRocm91Z2ggYm9hcmQgY29udHJvbCBkZXZpY2UpLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9nZXRwb3J0c3RhdHMoc3RsaXBvcnRfdCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJaW50CQlyYzsKKworCWlmICghcG9ydHApIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzdGxpX2NvbXN0YXRzLCBjcCwgc2l6ZW9mKGNvbXN0YXRzX3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwb3J0cCA9IHN0bGlfZ2V0cG9ydChzdGxpX2NvbXN0YXRzLmJyZCwgc3RsaV9jb21zdGF0cy5wYW5lbCwKKwkJCXN0bGlfY29tc3RhdHMucG9ydCk7CisJCWlmICghcG9ydHApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKCFicmRwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgocmMgPSBzdGxpX3BvcnRjbWRzdGF0cyhwb3J0cCkpIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcihjcCwgJnN0bGlfY29tc3RhdHMsIHNpemVvZihjb21zdGF0c190KSkgPworCQkJLUVGQVVMVCA6IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUNsZWFyIHRoZSBwb3J0IHN0YXRzIHN0cnVjdHVyZS4gV2UgYWxzbyByZXR1cm4gaXQgemVyb2VkIG91dC4uLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9jbHJwb3J0c3RhdHMoc3RsaXBvcnRfdCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJaW50CQlyYzsKKworCWlmICghcG9ydHApIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzdGxpX2NvbXN0YXRzLCBjcCwgc2l6ZW9mKGNvbXN0YXRzX3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwb3J0cCA9IHN0bGlfZ2V0cG9ydChzdGxpX2NvbXN0YXRzLmJyZCwgc3RsaV9jb21zdGF0cy5wYW5lbCwKKwkJCXN0bGlfY29tc3RhdHMucG9ydCk7CisJCWlmICghcG9ydHApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKCFicmRwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChicmRwLT5zdGF0ZSAmIEJTVF9TVEFSVEVEKSB7CisJCWlmICgocmMgPSBzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfQ0xFQVJTVEFUUywgTlVMTCwgMCwgMCkpIDwgMCkKKwkJCXJldHVybiByYzsKKwl9CisKKwltZW1zZXQoJnN0bGlfY29tc3RhdHMsIDAsIHNpemVvZihjb21zdGF0c190KSk7CisJc3RsaV9jb21zdGF0cy5icmQgPSBwb3J0cC0+YnJkbnI7CisJc3RsaV9jb21zdGF0cy5wYW5lbCA9IHBvcnRwLT5wYW5lbG5yOworCXN0bGlfY29tc3RhdHMucG9ydCA9IHBvcnRwLT5wb3J0bnI7CisKKwlpZiAoY29weV90b191c2VyKGNwLCAmc3RsaV9jb21zdGF0cywgc2l6ZW9mKGNvbXN0YXRzX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJldHVybiB0aGUgZW50aXJlIGRyaXZlciBwb3J0cyBzdHJ1Y3R1cmUgdG8gYSB1c2VyIGFwcC4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfZ2V0cG9ydHN0cnVjdChzdGxpcG9ydF90IF9fdXNlciAqYXJnKQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzdGxpX2R1bW15cG9ydCwgYXJnLCBzaXplb2Yoc3RsaXBvcnRfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlwb3J0cCA9IHN0bGlfZ2V0cG9ydChzdGxpX2R1bW15cG9ydC5icmRuciwgc3RsaV9kdW1teXBvcnQucGFuZWxuciwKKwkJIHN0bGlfZHVtbXlwb3J0LnBvcnRucik7CisJaWYgKCFwb3J0cCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGNvcHlfdG9fdXNlcihhcmcsIHBvcnRwLCBzaXplb2Yoc3RsaXBvcnRfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmV0dXJuIHRoZSBlbnRpcmUgZHJpdmVyIGJvYXJkIHN0cnVjdHVyZSB0byBhIHVzZXIgYXBwLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9nZXRicmRzdHJ1Y3Qoc3RsaWJyZF90IF9fdXNlciAqYXJnKQoreworCXN0bGlicmRfdAkqYnJkcDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsaV9kdW1teWJyZCwgYXJnLCBzaXplb2Yoc3RsaWJyZF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICgoc3RsaV9kdW1teWJyZC5icmRuciA8IDApIHx8IChzdGxpX2R1bW15YnJkLmJyZG5yID49IFNUTF9NQVhCUkRTKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJYnJkcCA9IHN0bGlfYnJkc1tzdGxpX2R1bW15YnJkLmJyZG5yXTsKKwlpZiAoIWJyZHApCisJCXJldHVybiAtRU5PREVWOworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBicmRwLCBzaXplb2Yoc3RsaWJyZF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUaGUgInN0YWxpb21lbSIgZGV2aWNlIGlzIGFsc28gcmVxdWlyZWQgdG8gZG8gc29tZSBzcGVjaWFsIG9wZXJhdGlvbnMgb24KKyAqCXRoZSBib2FyZC4gV2UgbmVlZCB0byBiZSBhYmxlIHRvIHNlbmQgYW4gaW50ZXJydXB0IHRvIHRoZSBib2FyZCwKKyAqCXJlc2V0IGl0LCBhbmQgc3RhcnQvc3RvcCBpdC4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfbWVtaW9jdGwoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJaW50CQlicmRuciwgcmMsIGRvbmU7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX21lbWlvY3RsKGlwPSV4LGZwPSV4LGNtZD0leCxhcmc9JXgpXG4iLAorCQkJKGludCkgaXAsIChpbnQpIGZwLCBjbWQsIChpbnQpIGFyZyk7CisjZW5kaWYKKworLyoKKyAqCUZpcnN0IHVwIGhhbmRsZSB0aGUgYm9hcmQgaW5kZXBlbmRlbnQgaW9jdGxzLgorICovCisJZG9uZSA9IDA7CisJcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIENPTV9HRVRQT1JUU1RBVFM6CisJCXJjID0gc3RsaV9nZXRwb3J0c3RhdHMoTlVMTCwgYXJncCk7CisJCWRvbmUrKzsKKwkJYnJlYWs7CisJY2FzZSBDT01fQ0xSUE9SVFNUQVRTOgorCQlyYyA9IHN0bGlfY2xycG9ydHN0YXRzKE5VTEwsIGFyZ3ApOworCQlkb25lKys7CisJCWJyZWFrOworCWNhc2UgQ09NX0dFVEJSRFNUQVRTOgorCQlyYyA9IHN0bGlfZ2V0YnJkc3RhdHMoYXJncCk7CisJCWRvbmUrKzsKKwkJYnJlYWs7CisJY2FzZSBDT01fUkVBRFBPUlQ6CisJCXJjID0gc3RsaV9nZXRwb3J0c3RydWN0KGFyZ3ApOworCQlkb25lKys7CisJCWJyZWFrOworCWNhc2UgQ09NX1JFQURCT0FSRDoKKwkJcmMgPSBzdGxpX2dldGJyZHN0cnVjdChhcmdwKTsKKwkJZG9uZSsrOworCQlicmVhazsKKwl9CisKKwlpZiAoZG9uZSkKKwkJcmV0dXJuKHJjKTsKKworLyoKKyAqCU5vdyBoYW5kbGUgdGhlIGJvYXJkIHNwZWNpZmljIGlvY3Rscy4gVGhlc2UgYWxsIGRlcGVuZCBvbiB0aGUKKyAqCW1pbm9yIG51bWJlciBvZiB0aGUgZGV2aWNlIHRoZXkgd2VyZSBjYWxsZWQgZnJvbS4KKyAqLworCWJyZG5yID0gaW1pbm9yKGlwKTsKKwlpZiAoYnJkbnIgPj0gU1RMX01BWEJSRFMpCisJCXJldHVybigtRU5PREVWKTsKKwlicmRwID0gc3RsaV9icmRzW2JyZG5yXTsKKwlpZiAoIWJyZHApCisJCXJldHVybigtRU5PREVWKTsKKwlpZiAoYnJkcC0+c3RhdGUgPT0gMCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNUTF9CSU5UUjoKKwkJRUJSRElOVFIoYnJkcCk7CisJCWJyZWFrOworCWNhc2UgU1RMX0JTVEFSVDoKKwkJcmMgPSBzdGxpX3N0YXJ0YnJkKGJyZHApOworCQlicmVhazsKKwljYXNlIFNUTF9CU1RPUDoKKwkJYnJkcC0+c3RhdGUgJj0gfkJTVF9TVEFSVEVEOworCQlicmVhazsKKwljYXNlIFNUTF9CUkVTRVQ6CisJCWJyZHAtPnN0YXRlICY9IH5CU1RfU1RBUlRFRDsKKwkJRUJSRFJFU0VUKGJyZHApOworCQlpZiAoc3RsaV9zaGFyZWQgPT0gMCkgeworCQkJaWYgKGJyZHAtPnJlZW5hYmxlICE9IE5VTEwpCisJCQkJKCogYnJkcC0+cmVlbmFibGUpKGJyZHApOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4ocmMpOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHN0bGlfb3BzID0geworCS5vcGVuID0gc3RsaV9vcGVuLAorCS5jbG9zZSA9IHN0bGlfY2xvc2UsCisJLndyaXRlID0gc3RsaV93cml0ZSwKKwkucHV0X2NoYXIgPSBzdGxpX3B1dGNoYXIsCisJLmZsdXNoX2NoYXJzID0gc3RsaV9mbHVzaGNoYXJzLAorCS53cml0ZV9yb29tID0gc3RsaV93cml0ZXJvb20sCisJLmNoYXJzX2luX2J1ZmZlciA9IHN0bGlfY2hhcnNpbmJ1ZmZlciwKKwkuaW9jdGwgPSBzdGxpX2lvY3RsLAorCS5zZXRfdGVybWlvcyA9IHN0bGlfc2V0dGVybWlvcywKKwkudGhyb3R0bGUgPSBzdGxpX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gc3RsaV91bnRocm90dGxlLAorCS5zdG9wID0gc3RsaV9zdG9wLAorCS5zdGFydCA9IHN0bGlfc3RhcnQsCisJLmhhbmd1cCA9IHN0bGlfaGFuZ3VwLAorCS5mbHVzaF9idWZmZXIgPSBzdGxpX2ZsdXNoYnVmZmVyLAorCS5icmVha19jdGwgPSBzdGxpX2JyZWFrY3RsLAorCS53YWl0X3VudGlsX3NlbnQgPSBzdGxpX3dhaXR1bnRpbHNlbnQsCisJLnNlbmRfeGNoYXIgPSBzdGxpX3NlbmR4Y2hhciwKKwkucmVhZF9wcm9jID0gc3RsaV9yZWFkcHJvYywKKwkudGlvY21nZXQgPSBzdGxpX3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9IHN0bGlfdGlvY21zZXQsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBfX2luaXQgc3RsaV9pbml0KHZvaWQpCit7CisJaW50IGk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHZlcnNpb24gJXNcbiIsIHN0bGlfZHJ2dGl0bGUsIHN0bGlfZHJ2dmVyc2lvbik7CisKKwlzdGxpX2luaXRicmRzKCk7CisKKwlzdGxpX3NlcmlhbCA9IGFsbG9jX3R0eV9kcml2ZXIoU1RMX01BWEJSRFMgKiBTVExfTUFYUE9SVFMpOworCWlmICghc3RsaV9zZXJpYWwpCisJCXJldHVybiAtRU5PTUVNOworCisvKgorICoJQWxsb2NhdGUgYSB0ZW1wb3Jhcnkgd3JpdGUgYnVmZmVyLgorICovCisJc3RsaV90bXB3cml0ZWJ1ZiA9IChjaGFyICopIHN0bGlfbWVtYWxsb2MoU1RMSV9UWEJVRlNJWkUpOworCWlmIChzdGxpX3RtcHdyaXRlYnVmID09IChjaGFyICopIE5VTEwpCisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgIgorCQkJCSIoc2l6ZT0lZClcbiIsIFNUTElfVFhCVUZTSVpFKTsKKwlzdGxpX3R4Y29va2J1ZiA9IHN0bGlfbWVtYWxsb2MoU1RMSV9UWEJVRlNJWkUpOworCWlmIChzdGxpX3R4Y29va2J1ZiA9PSAoY2hhciAqKSBOVUxMKQorCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ICIKKwkJCQkiKHNpemU9JWQpXG4iLCBTVExJX1RYQlVGU0laRSk7CisKKy8qCisgKglTZXQgdXAgYSBjaGFyYWN0ZXIgZHJpdmVyIGZvciB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24uIFdlIG5lZWQgdGhpcworICoJdG8gZG93biBsb2FkIHRoZSBzbGF2ZSBjb2RlIGltYWdlLiBBbHNvIGl0IGlzIGEgdXNlZnVsIGRlYnVnZ2luZyB0b29sLgorICovCisJaWYgKHJlZ2lzdGVyX2NocmRldihTVExfU0lPTUVNTUFKT1IsICJzdGFsaW9tZW0iLCAmc3RsaV9mc2lvbWVtKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogZmFpbGVkIHRvIHJlZ2lzdGVyIHNlcmlhbCBtZW1vcnkgIgorCQkJCSJkZXZpY2VcbiIpOworCisJZGV2ZnNfbWtfZGlyKCJzdGFsaW9tZW0iKTsKKwlpc3RhbGxpb25fY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAic3RhbGlvbWVtIik7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlkZXZmc19ta19jZGV2KE1LREVWKFNUTF9TSU9NRU1NQUpPUiwgaSksCisJCQkgICAgICAgU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJICAgICAgICJzdGFsaW9tZW0vJWQiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoaXN0YWxsaW9uX2NsYXNzLCBNS0RFVihTVExfU0lPTUVNTUFKT1IsIGkpLCAKKwkJCQlOVUxMLCAic3RhbGlvbWVtJWQiLCBpKTsKKwl9CisKKy8qCisgKglTZXQgdXAgdGhlIHR0eSBkcml2ZXIgc3RydWN0dXJlIGFuZCByZWdpc3RlciB1cyBhcyBhIGRyaXZlci4KKyAqLworCXN0bGlfc2VyaWFsLT5vd25lciA9IFRISVNfTU9EVUxFOworCXN0bGlfc2VyaWFsLT5kcml2ZXJfbmFtZSA9IHN0bGlfZHJ2bmFtZTsKKwlzdGxpX3NlcmlhbC0+bmFtZSA9IHN0bGlfc2VyaWFsbmFtZTsKKwlzdGxpX3NlcmlhbC0+bWFqb3IgPSBTVExfU0VSSUFMTUFKT1I7CisJc3RsaV9zZXJpYWwtPm1pbm9yX3N0YXJ0ID0gMDsKKwlzdGxpX3NlcmlhbC0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJc3RsaV9zZXJpYWwtPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJc3RsaV9zZXJpYWwtPmluaXRfdGVybWlvcyA9IHN0bGlfZGVmdGVybWlvczsKKwlzdGxpX3NlcmlhbC0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhzdGxpX3NlcmlhbCwgJnN0bGlfb3BzKTsKKworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHN0bGlfc2VyaWFsKSkgeworCQlwdXRfdHR5X2RyaXZlcihzdGxpX3NlcmlhbCk7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGZhaWxlZCB0byByZWdpc3RlciBzZXJpYWwgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXRlX2dwaW8uYyBiL2RyaXZlcnMvY2hhci9pdGVfZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZWQ2YWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXRlX2dwaW8uYwpAQCAtMCwwICsxLDQxOSBAQAorLyoKKyAqIEZJTEUgTkFNRSBpdGVfZ3Bpby5jCisgKgorICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCisgKiAgQVBJIGZvciBJVEUgR1BJTyBkZXZpY2UuCisgKiAgRHJpdmVyIGZvciBJVEUgR1BJTyBkZXZpY2UuCisgKgorICogIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAgPHNvdXJjZUBtdmlzdGEuY29tPgorICogICAgICAgICAgSGFpLVBhbyBGYW4gPGhhaXBhb0BtdmlzdGEuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFCUxJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNpbmNsdWRlIDxhc20vaXQ4MTcyL2l0ODE3Ml9pbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2l0ZV9ncGlvLmg+CisKKyNkZWZpbmUgaXRlX2dwaW9fYmFzZSAweDE0MDEzODAwCisKKyNkZWZpbmUJSVRFX0dQQURSCSgqKHZvbGF0aWxlIF9fdTggKikoMHgxNDAxMzgwMCArIEtTRUcxKSkKKyNkZWZpbmUJSVRFX0dQQkRSCSgqKHZvbGF0aWxlIF9fdTggKikoMHgxNDAxMzgwOCArIEtTRUcxKSkKKyNkZWZpbmUJSVRFX0dQQ0RSCSgqKHZvbGF0aWxlIF9fdTggKikoMHgxNDAxMzgxMCArIEtTRUcxKSkKKyNkZWZpbmUJSVRFX0dQQUNSCSgqKHZvbGF0aWxlIF9fdTE2ICopKDB4MTQwMTM4MDIgKyBLU0VHMSkpCisjZGVmaW5lCUlURV9HUEJDUgkoKih2b2xhdGlsZSBfX3UxNiAqKSgweDE0MDEzODBhICsgS1NFRzEpKQorI2RlZmluZQlJVEVfR1BDQ1IJKCoodm9sYXRpbGUgX191MTYgKikoMHgxNDAxMzgxMiArIEtTRUcxKSkKKyNkZWZpbmUgSVRFX0dQQUlDUgkoKih2b2xhdGlsZSBfX3UxNiAqKSgweDE0MDEzODA0ICsgS1NFRzEpKQorI2RlZmluZQlJVEVfR1BCSUNSCSgqKHZvbGF0aWxlIF9fdTE2ICopKDB4MTQwMTM4MGMgKyBLU0VHMSkpCisjZGVmaW5lCUlURV9HUENJQ1IJKCoodm9sYXRpbGUgX191MTYgKikoMHgxNDAxMzgxNCArIEtTRUcxKSkKKyNkZWZpbmUJSVRFX0dQQUlTUgkoKih2b2xhdGlsZSBfX3U4ICopKDB4MTQwMTM4MDYgKyBLU0VHMSkpCisjZGVmaW5lCUlURV9HUEJJU1IJKCoodm9sYXRpbGUgX191OCAqKSgweDE0MDEzODBlICsgS1NFRzEpKQorI2RlZmluZQlJVEVfR1BDSVNSCSgqKHZvbGF0aWxlIF9fdTggKikoMHgxNDAxMzgxNiArIEtTRUcxKSkKKyNkZWZpbmUJSVRFX0dDUgkJKCoodm9sYXRpbGUgX191OCAqKSgweDE0MDEzODE4ICsgS1NFRzEpKQorCisjZGVmaW5lIE1BWF9HUElPX0xJTkUJCTIxCitzdGF0aWMgaW50IGl0ZV9ncGlvX2lycT1JVDgxNzJfR1BJT19JUlE7CisKK3N0YXRpYyBsb25nIGl0ZV9pcnFfY291bnRlcltNQVhfR1BJT19MSU5FXTsKK3dhaXRfcXVldWVfaGVhZF90IGl0ZV9ncGlvX3dhaXRbTUFYX0dQSU9fTElORV07CitzdGF0aWMgaW50IGl0ZV9ncGlvX2lycV9wZW5kaW5nW01BWF9HUElPX0xJTkVdOworCitzdGF0aWMgaW50IGl0ZV9ncGlvX2RlYnVnPTA7CisjZGVmaW5lIERFQih4KSAgaWYgKGl0ZV9ncGlvX2RlYnVnPj0xKSB4CisKK2ludCBpdGVfZ3Bpb19pbihfX3UzMiBkZXZpY2UsIF9fdTMyIG1hc2ssIHZvbGF0aWxlIF9fdTMyICpkYXRhKQoreworCURFQihwcmludGsoIml0ZV9ncGlvX2luIG1hc2s9MHgleFxuIixtYXNrKSk7IAorCisJc3dpdGNoIChkZXZpY2UpIHsKKwljYXNlIElURV9HUElPX1BPUlRBOgorCQlJVEVfR1BBQ1IgPSAoX191MTYpbWFzazsJLyogMHhmZmZmICovCisJCSpkYXRhID0gSVRFX0dQQURSOworCQlicmVhazsKKwljYXNlIElURV9HUElPX1BPUlRCOgorCQlJVEVfR1BCQ1IgPSAoX191MTYpbWFzazsJLyogMHhmZmZmICovCisJCSpkYXRhID0gSVRFX0dQQkRSOworCQlicmVhazsKKwljYXNlIElURV9HUElPX1BPUlRDOgorCQlJVEVfR1BDQ1IgPSAoX191MTYpbWFzazsJLyogMHgwM2ZmICovCisJCSpkYXRhID0gSVRFX0dQQ0RSOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgaXRlX2dwaW9fb3V0KF9fdTMyIGRldmljZSwgX191MzIgbWFzaywgX191MzIgZGF0YSkKK3sKKwlzd2l0Y2ggKGRldmljZSkgeworCWNhc2UgSVRFX0dQSU9fUE9SVEE6CisJCUlURV9HUEFDUiA9IChfX3UxNiltYXNrOwkvKiAweDU1NTUgKi8KKwkJSVRFX0dQQURSID0gKF9fdTgpZGF0YTsKKwkJYnJlYWs7CisJY2FzZSBJVEVfR1BJT19QT1JUQjoKKwkJSVRFX0dQQkNSID0gKF9fdTE2KW1hc2s7CS8qIDB4NTU1NSAqLworCQlJVEVfR1BCRFIgPSAoX191OClkYXRhOworCQlicmVhazsKKwljYXNlIElURV9HUElPX1BPUlRDOgorCQlJVEVfR1BDQ1IgPSAoX191MTYpbWFzazsJLyogMHgwMTU1ICovCisJCUlURV9HUENEUiA9IChfX3U4KWRhdGE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgaXRlX2dwaW9faW50X2N0cmwoX191MzIgZGV2aWNlLCBfX3UzMiBtYXNrLCBfX3UzMiBkYXRhKQoreworCXN3aXRjaCAoZGV2aWNlKSB7CisJY2FzZSBJVEVfR1BJT19QT1JUQToKKwkJSVRFX0dQQUlDUiA9IChJVEVfR1BBSUNSICYgfm1hc2spIHwgKGRhdGEgJiBtYXNrKTsKKwkJYnJlYWs7CisJY2FzZSBJVEVfR1BJT19QT1JUQjoKKwkJSVRFX0dQQklDUiA9IChJVEVfR1BCSUNSICYgfm1hc2spIHwgKGRhdGEgJiBtYXNrKTsKKwkJYnJlYWs7CisJY2FzZSBJVEVfR1BJT19QT1JUQzoKKwkJSVRFX0dQQ0lDUiA9IChJVEVfR1BDSUNSICYgfm1hc2spIHwgKGRhdGEgJiBtYXNrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBpdGVfZ3Bpb19pbl9zdGF0dXMoX191MzIgZGV2aWNlLCBfX3UzMiBtYXNrLCB2b2xhdGlsZSBfX3UzMiAqZGF0YSkKK3sKKwlpbnQgcmV0PS0xOworCisJaWYgKChNQVhfR1BJT19MSU5FID4gKmRhdGEpICYmICgqZGF0YSA+PSAwKSkgCisJCXJldD1pdGVfZ3Bpb19pcnFfcGVuZGluZ1sqZGF0YV07CisgCisJREVCKHByaW50aygiaXRlX2dwaW9faW5fc3RhdHVzICVkIHJldD0lZFxuIiwqZGF0YSwgcmV0KSk7CisKKwlzd2l0Y2ggKGRldmljZSkgeworCWNhc2UgSVRFX0dQSU9fUE9SVEE6CisJCSpkYXRhID0gSVRFX0dQQUlTUiAmIG1hc2s7CisJCWJyZWFrOworCWNhc2UgSVRFX0dQSU9fUE9SVEI6CisJCSpkYXRhID0gSVRFX0dQQklTUiAmIG1hc2s7CisJCWJyZWFrOworCWNhc2UgSVRFX0dQSU9fUE9SVEM6CisJCSpkYXRhID0gSVRFX0dQQ0lTUiAmIG1hc2s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBpdGVfZ3Bpb19vdXRfc3RhdHVzKF9fdTMyIGRldmljZSwgX191MzIgbWFzaywgX191MzIgZGF0YSkKK3sKKwlzd2l0Y2ggKGRldmljZSkgeworCWNhc2UgSVRFX0dQSU9fUE9SVEE6CisJCUlURV9HUEFJU1IgPSAoSVRFX0dQQUlTUiAmIH5tYXNrKSB8IChkYXRhICYgbWFzayk7CisJCWJyZWFrOworCWNhc2UgSVRFX0dQSU9fUE9SVEI6CisJCUlURV9HUEJJU1IgPSAoSVRFX0dQQklTUiAmIH5tYXNrKSB8IChkYXRhICYgbWFzayk7CisJCWJyZWFrOworCWNhc2UgSVRFX0dQSU9fUE9SVEM6CisJCUlURV9HUENJU1IgPSAoSVRFX0dQQ0lTUiAmIH5tYXNrKSB8IChkYXRhICYgbWFzayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgaXRlX2dwaW9fZ2VuX2N0cmwoX191MzIgZGV2aWNlLCBfX3UzMiBtYXNrLCBfX3UzMiBkYXRhKQoreworCUlURV9HQ1IgPSAoSVRFX0dDUiAmIH5tYXNrKSB8IChkYXRhICYgbWFzayk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGl0ZV9ncGlvX2ludF93YWl0IChfX3UzMiBkZXZpY2UsIF9fdTMyIG1hc2ssIF9fdTMyIGRhdGEpCit7CisJaW50IGksbGluZT0wLCByZXQ9MDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoIChkZXZpY2UpIHsKKwljYXNlIElURV9HUElPX1BPUlRBOgorCQlsaW5lID0gZGF0YSAmIG1hc2s7CisJCWJyZWFrOworCWNhc2UgSVRFX0dQSU9fUE9SVEI6CisJCWxpbmUgPSAoZGF0YSAmIG1hc2spIDw8ODsKKwkJYnJlYWs7CisJY2FzZSBJVEVfR1BJT19QT1JUQzoKKwkJbGluZSA9IChkYXRhICYgbWFzaykgPDwxNjsKKwkJYnJlYWs7CisJfQorCWZvciAoaT1NQVhfR1BJT19MSU5FLTE7IGkgPj0gMDsgaS0tKSB7CisJCWlmICggKGxpbmUpICYgKDEgPDwgaSkpCisJCQlicmVhazsKKwl9CisKKwlERUIocHJpbnRrKCJ3YWl0IGRldmljZT0weCVkIG1hc2s9MHgleCBkYXRhPTB4JXggaW5kZXggJWRcbiIsIAorCQlkZXZpY2UsIG1hc2ssIGRhdGEsIGkpKTsKKworCWlmIChsaW5lICYgfigxPDxpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoaXRlX2dwaW9faXJxX3BlbmRpbmdbaV09PTEpCisJCXJldHVybiAtRUZBVUxUOworCisJc2F2ZV9mbGFncyAoZmxhZ3MpOworCWNsaSgpOworCWl0ZV9ncGlvX2lycV9wZW5kaW5nW2ldID0gMTsKKwlyZXQgPSBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJml0ZV9ncGlvX3dhaXRbaV0sIDMqSFopOworCXJlc3RvcmVfZmxhZ3MgKGZsYWdzKTsKKwlpdGVfZ3Bpb19pcnFfcGVuZGluZ1tpXSA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCitFWFBPUlRfU1lNQk9MKGl0ZV9ncGlvX2luKTsKK0VYUE9SVF9TWU1CT0woaXRlX2dwaW9fb3V0KTsKK0VYUE9SVF9TWU1CT0woaXRlX2dwaW9faW50X2N0cmwpOworRVhQT1JUX1NZTUJPTChpdGVfZ3Bpb19pbl9zdGF0dXMpOworRVhQT1JUX1NZTUJPTChpdGVfZ3Bpb19vdXRfc3RhdHVzKTsKK0VYUE9SVF9TWU1CT0woaXRlX2dwaW9fZ2VuX2N0cmwpOworRVhQT1JUX1NZTUJPTChpdGVfZ3Bpb19pbnRfd2FpdCk7CisKK3N0YXRpYyBpbnQgaXRlX2dwaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGl0ZV9ncGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpdGVfZ3Bpb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdGF0aWMgc3RydWN0IGl0ZV9ncGlvX2lvY3RsX2RhdGEgaW9jdGxfZGF0YTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaW9jdGxfZGF0YSwgKHN0cnVjdCBpdGVfZ3Bpb19pb2N0bF9kYXRhICopYXJnLAorCQkJc2l6ZW9mKGlvY3RsX2RhdGEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKChpb2N0bF9kYXRhLmRldmljZSA8IElURV9HUElPX1BPUlRBKSB8fAorCQkJKGlvY3RsX2RhdGEuZGV2aWNlID4gSVRFX0dQSU9fUE9SVEMpICkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBJVEVfR1BJT19JTjoKKwkJCWlmIChpdGVfZ3Bpb19pbihpb2N0bF9kYXRhLmRldmljZSwgaW9jdGxfZGF0YS5tYXNrLAorCQkJCQkgICAmaW9jdGxfZGF0YS5kYXRhKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGl0ZV9ncGlvX2lvY3RsX2RhdGEgKilhcmcsCisJCQkJCSAmaW9jdGxfZGF0YSwgc2l6ZW9mKGlvY3RsX2RhdGEpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVRFX0dQSU9fT1VUOgorCQkJcmV0dXJuIGl0ZV9ncGlvX291dChpb2N0bF9kYXRhLmRldmljZSwKKwkJCQkJaW9jdGxfZGF0YS5tYXNrLCBpb2N0bF9kYXRhLmRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJVEVfR1BJT19JTlRfQ1RSTDoKKwkJCXJldHVybiBpdGVfZ3Bpb19pbnRfY3RybChpb2N0bF9kYXRhLmRldmljZSwKKwkJCQkJaW9jdGxfZGF0YS5tYXNrLCBpb2N0bF9kYXRhLmRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJVEVfR1BJT19JTl9TVEFUVVM6CisJCQlpZiAoaXRlX2dwaW9faW5fc3RhdHVzKGlvY3RsX2RhdGEuZGV2aWNlLCBpb2N0bF9kYXRhLm1hc2ssCisJCQkJCSZpb2N0bF9kYXRhLmRhdGEpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGl0ZV9ncGlvX2lvY3RsX2RhdGEgKilhcmcsCisJCQkJCSZpb2N0bF9kYXRhLCBzaXplb2YoaW9jdGxfZGF0YSkpKSAKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVRFX0dQSU9fT1VUX1NUQVRVUzoKKwkJCXJldHVybiBpdGVfZ3Bpb19vdXRfc3RhdHVzKGlvY3RsX2RhdGEuZGV2aWNlLAorCQkJCQlpb2N0bF9kYXRhLm1hc2ssIGlvY3RsX2RhdGEuZGF0YSk7CisJCQlicmVhazsKKworCQljYXNlIElURV9HUElPX0dFTl9DVFJMOgorCQkJcmV0dXJuIGl0ZV9ncGlvX2dlbl9jdHJsKGlvY3RsX2RhdGEuZGV2aWNlLAorCQkJCQlpb2N0bF9kYXRhLm1hc2ssIGlvY3RsX2RhdGEuZGF0YSk7CisJCQlicmVhazsKKworCQljYXNlIElURV9HUElPX0lOVF9XQUlUOgorCQkJcmV0dXJuIGl0ZV9ncGlvX2ludF93YWl0KGlvY3RsX2RhdGEuZGV2aWNlLAorCQkJCQlpb2N0bF9kYXRhLm1hc2ssIGlvY3RsX2RhdGEuZGF0YSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpdGVfZ3Bpb19pcnFfaGFuZGxlcihpbnQgdGhpc19pcnEsIHZvaWQgKmRldl9pZCwKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaSxsaW5lOworCisJbGluZSA9IElURV9HUENJU1IgJiAweDFmOworCWZvciAoaT00OyBpID49MDsgaS0tKSB7CisJCWlmICggbGluZSAmICgxIDw8IGkpKSB7IAorCQkJKytpdGVfaXJxX2NvdW50ZXJbaSsxNl07CisJCQlpdGVfZ3Bpb19pcnFfcGVuZGluZ1tpKzE2XSA9IDI7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJml0ZV9ncGlvX3dhaXRbaSsxNl0pOworCitERUIocHJpbnRrKCJpbnRlcnJ1cHQgMHgleCAlZFxuIiwgJml0ZV9ncGlvX3dhaXRbaSsxNl0sIGkrMTYpKTsKKworCQkJSVRFX0dQQ0lTUiA9IElURV9HUENJU1IgJiAoMTw8aSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbGluZSA9IElURV9HUEJJU1I7CisJZm9yIChpPTc7IGkgPj0gMDsgaS0tKSB7CisJCWlmICggbGluZSAmICgxIDw8IGkpKSB7CisJCQkrK2l0ZV9pcnFfY291bnRlcltpKzhdOworCQkJaXRlX2dwaW9faXJxX3BlbmRpbmdbaSs4XSA9IDI7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJml0ZV9ncGlvX3dhaXRbaSs4XSk7CisKK0RFQihwcmludGsoImludGVycnVwdCAweCV4ICVkXG4iLElURV9HUEJJU1IsIGkrOCkpOworCisJCQlJVEVfR1BCSVNSID0gSVRFX0dQQklTUiAmICgxPDxpKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlsaW5lID0gSVRFX0dQQUlTUjsKKwlmb3IgKGk9NzsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKCBsaW5lICYgKDEgPDwgaSkpIHsKKwkJCSsraXRlX2lycV9jb3VudGVyW2ldOworCQkJaXRlX2dwaW9faXJxX3BlbmRpbmdbaV0gPSAyOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpdGVfZ3Bpb193YWl0W2ldKTsKKworREVCKHByaW50aygiaW50ZXJydXB0IDB4JXggJWRcbiIsSVRFX0dQQUlTUiwgaSkpOworCisJCQlJVEVfR1BBSVNSID0gSVRFX0dQQUlTUiAmICgxPDxpKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXRlX2dwaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCQk9IGl0ZV9ncGlvX2lvY3RsLAorCS5vcGVuCQk9IGl0ZV9ncGlvX29wZW4sCisJLnJlbGVhc2UJPSBpdGVfZ3Bpb19yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGl0ZV9ncGlvX21pc2NkZXYgPSB7CisJTUlTQ19EWU5BTUlDX01JTk9SLAorCSJpdGVfZ3BpbyIsCisJJml0ZV9ncGlvX2ZvcHMKK307CisKK2ludCBfX2luaXQgaXRlX2dwaW9faW5pdCh2b2lkKQoreworCWludCBpOworCisJaWYgKG1pc2NfcmVnaXN0ZXIoJml0ZV9ncGlvX21pc2NkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaXRlX2dwaW9fYmFzZSwgMHgxYywgIklURSBHUElPIikpCisJeworCQltaXNjX2RlcmVnaXN0ZXIoJml0ZV9ncGlvX21pc2NkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBpbml0aWFsaXplIHJlZ2lzdGVycyAqLworICAgICAgICBJVEVfR1BBQ1IgPSAweGZmZmY7CisgICAgICAgIElURV9HUEJDUiA9IDB4ZmZmZjsKKyAgICAgICAgSVRFX0dQQ0NSID0gMHhmZmZmOworICAgICAgICBJVEVfR1BBSUNSID0gMHgwMGZmOworICAgICAgICBJVEVfR1BCSUNSID0gMHgwMGZmOworICAgICAgICBJVEVfR1BDSUNSID0gMHgwMGZmOworICAgICAgICBJVEVfR0NSID0gMDsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0dQSU9fTElORTsgaSsrKSB7CisJCWl0ZV9ncGlvX2lycV9wZW5kaW5nW2ldPTA7CQorCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpdGVfZ3Bpb193YWl0W2ldKTsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEoaXRlX2dwaW9faXJxLCBpdGVfZ3Bpb19pcnFfaGFuZGxlciwgU0FfU0hJUlEsICJncGlvIiwgMCkgPCAwKSB7CisJCW1pc2NfZGVyZWdpc3RlcigmaXRlX2dwaW9fbWlzY2Rldik7CisJCXJlbGVhc2VfcmVnaW9uKGl0ZV9ncGlvX2Jhc2UsIDB4MWMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoIkdQSU8gYXQgMHgleCAoaXJxID0gJWQpXG4iLCBpdGVfZ3Bpb19iYXNlLCBpdGVfZ3Bpb19pcnEpOworCisJcmV0dXJuIDA7Cit9CQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXRlX2dwaW9fZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmaXRlX2dwaW9fbWlzY2Rldik7Cit9CisKK21vZHVsZV9pbml0KGl0ZV9ncGlvX2luaXQpOworbW9kdWxlX2V4aXQoaXRlX2dwaW9fZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlNTFjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jCkBAIC0wLDAgKzEsMTI1NCBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvY2hhci9rZXlib2FyZC5jCisgKgorICogV3JpdHRlbiBmb3IgbGludXggYnkgSm9oYW4gTXlyZWVuIGFzIGEgdHJhbnNsYXRpb24gZnJvbQorICogdGhlIGFzc2VtYmx5IHZlcnNpb24gYnkgTGludXMgKHdpdGggZGlhY3JpdGljYWxzIGFkZGVkKQorICoKKyAqIFNvbWUgYWRkaXRpb25hbCBmZWF0dXJlcyBhZGRlZCBieSBDaHJpc3RvcGggTmllbWFubiAoQ2hOKSwgTWFyY2ggMTk5MworICoKKyAqIExvYWRhYmxlIGtleW1hcHMgYnkgUmlzdG8gS2Fua2t1bmVuLCBNYXkgMTk5MworICoKKyAqIERpYWNyaXRpY2FscyByZWRvbmUgJiBvdGhlciBzbWFsbCBjaGFuZ2VzLCBhZWJAY3dpLm5sLCBKdW5lIDE5OTMKKyAqIEFkZGVkIGRlY3IvaW5jcl9jb25zb2xlLCBkeW5hbWljIGtleW1hcHMsIFVuaWNvZGUgc3VwcG9ydCwKKyAqIGR5bmFtaWMgZnVuY3Rpb24vc3RyaW5nIGtleXMsIGxlZCBzZXR0aW5nLCAgU2VwdCAxOTk0CisgKiBgU3RpY2t5JyBtb2RpZmllciBrZXlzLCA5NTEwMDYuCisgKgorICogMTEtMTEtOTY6IFNBSyBzaG91bGQgbm93IHdvcmsgaW4gdGhlIHJhdyBtb2RlIChNYXJ0aW4gTWFyZXMpCisgKiAKKyAqIE1vZGlmaWVkIHRvIHByb3ZpZGUgJ2dlbmVyaWMnIGtleWJvYXJkIHN1cHBvcnQgYnkgSGFtaXNoIE1hY2RvbmFsZAorICogTWVyZ2Ugd2l0aCB0aGUgbTY4ayBrZXlib2FyZCBkcml2ZXIgYW5kIHNwbGl0LW9mZiBvZiB0aGUgUEMgbG93LWxldmVsCisgKiBwYXJ0cyBieSBHZWVydCBVeXR0ZXJob2V2ZW4sIE1heSAxOTk3CisgKgorICogMjctMDUtOTc6IEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBNYWdpYyBTeXNScSBLZXkgKE1hcnRpbiBNYXJlcykKKyAqIDMwLTA3LTk4OiBEZWFkIGtleXMgcmVkb25lLCBhZWJAY3dpLm5sLgorICogMjEtMDgtMDI6IENvbnZlcnRlZCB0byBpbnB1dCBBUEksIG1ham9yIGNsZWFudXAuIChWb2p0ZWNoIFBhdmxpaykKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tiZF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgva2JkX2RpYWNyLmg+CisjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworc3RhdGljIHZvaWQga2JkX2Rpc2Nvbm5lY3Qoc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlKTsKK2V4dGVybiB2b2lkIGN0cmxfYWx0X2RlbCh2b2lkKTsKKworLyoKKyAqIEV4cG9ydGVkIGZ1bmN0aW9ucy92YXJpYWJsZXMKKyAqLworCisjZGVmaW5lIEtCRF9ERUZNT0RFICgoMSA8PCBWQ19SRVBFQVQpIHwgKDEgPDwgVkNfTUVUQSkpCisKKy8qCisgKiBTb21lIGxhcHRvcHMgdGFrZSB0aGUgNzg5dWlvamtsbSwuIGtleXMgYXMgbnVtYmVyIHBhZCB3aGVuIE51bUxvY2sgaXMgb24uCisgKiBUaGlzIHNlZW1zIGEgZ29vZCByZWFzb24gdG8gc3RhcnQgd2l0aCBOdW1Mb2NrIG9mZi4gT24gSElMIGtleWJvYXJkcworICogb2YgUEFSSVNDIG1hY2hpbmVzIGhvd2V2ZXIgdGhlcmUgaXMgbm8gTnVtTG9jayBrZXkgYW5kIGV2ZXJ5b25lIGV4cGVjdHMgdGhlIGtleXBhZCAKKyAqIHRvIGJlIHVzZWQgZm9yIG51bWJlcnMuCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1BBUklTQykgJiYgKGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0hJTCkgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfSElMX09MRCkpCisjZGVmaW5lIEtCRF9ERUZMRURTICgxIDw8IFZDX05VTUxPQ0spCisjZWxzZQorI2RlZmluZSBLQkRfREVGTEVEUyAwCisjZW5kaWYKKworI2RlZmluZSBLQkRfREVGTE9DSyAwCisKK3ZvaWQgY29tcHV0ZV9zaGlmdHN0YXRlKHZvaWQpOworCisvKgorICogSGFuZGxlciBUYWJsZXMuCisgKi8KKworI2RlZmluZSBLX0hBTkRMRVJTXAorCWtfc2VsZiwJCWtfZm4sCQlrX3NwZWMsCQlrX3BhZCxcCisJa19kZWFkLAkJa19jb25zLAkJa19jdXIsCQlrX3NoaWZ0LFwKKwlrX21ldGEsCQlrX2FzY2lpLAlrX2xvY2ssCQlrX2xvd2VyY2FzZSxcCisJa19zbG9jaywJa19kZWFkMiwJa19pZ25vcmUsCWtfaWdub3JlCisKK3R5cGVkZWYgdm9pZCAoa19oYW5kbGVyX2ZuKShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIAorCQkJICAgIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGtfaGFuZGxlcl9mbiBLX0hBTkRMRVJTOworc3RhdGljIGtfaGFuZGxlcl9mbiAqa19oYW5kbGVyWzE2XSA9IHsgS19IQU5ETEVSUyB9OworCisjZGVmaW5lIEZOX0hBTkRMRVJTXAorCWZuX251bGwsIAlmbl9lbnRlciwJZm5fc2hvd19wdHJlZ3MsCWZuX3Nob3dfbWVtLFwKKwlmbl9zaG93X3N0YXRlLAlmbl9zZW5kX2ludHIsIAlmbl9sYXN0Y29ucywgCWZuX2NhcHNfdG9nZ2xlLFwKKwlmbl9udW0sCQlmbl9ob2xkLCAJZm5fc2Nyb2xsX2ZvcncsCWZuX3Njcm9sbF9iYWNrLFwKKwlmbl9ib290X2l0LCAJZm5fY2Fwc19vbiwgCWZuX2NvbXBvc2UsCWZuX1NBSyxcCisJZm5fZGVjX2NvbnNvbGUsIGZuX2luY19jb25zb2xlLCBmbl9zcGF3bl9jb24sIAlmbl9iYXJlX251bQorCit0eXBlZGVmIHZvaWQgKGZuX2hhbmRsZXJfZm4pKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGZuX2hhbmRsZXJfZm4gRk5fSEFORExFUlM7CitzdGF0aWMgZm5faGFuZGxlcl9mbiAqZm5faGFuZGxlcltdID0geyBGTl9IQU5ETEVSUyB9OworCisvKgorICogVmFyaWFibGVzIGV4cG9ydGVkIGZvciB2dF9pb2N0bC5jCisgKi8KKworLyogbWF4aW11bSB2YWx1ZXMgZWFjaCBrZXlfaGFuZGxlciBjYW4gaGFuZGxlICovCitjb25zdCBpbnQgbWF4X3ZhbHNbXSA9IHsKKwkyNTUsIEFSUkFZX1NJWkUoZnVuY190YWJsZSkgLSAxLCBBUlJBWV9TSVpFKGZuX2hhbmRsZXIpIC0gMSwgTlJfUEFEIC0gMSwKKwlOUl9ERUFEIC0gMSwgMjU1LCAzLCBOUl9TSElGVCAtIDEsIDI1NSwgTlJfQVNDSUkgLSAxLCBOUl9MT0NLIC0gMSwKKwkyNTUsIE5SX0xPQ0sgLSAxLCAyNTUKK307CisKK2NvbnN0IGludCBOUl9UWVBFUyA9IEFSUkFZX1NJWkUobWF4X3ZhbHMpOworCitzdHJ1Y3Qga2JkX3N0cnVjdCBrYmRfdGFibGVbTUFYX05SX0NPTlNPTEVTXTsKK3N0YXRpYyBzdHJ1Y3Qga2JkX3N0cnVjdCAqa2JkID0ga2JkX3RhYmxlOworc3RhdGljIHN0cnVjdCBrYmRfc3RydWN0IGtiZDA7CisKK2ludCBzcGF3bnBpZCwgc3Bhd25zaWc7CisKKy8qCisgKiBWYXJpYWJsZXMgZXhwb3J0ZWQgZm9yIHZ0LmMKKyAqLworCitpbnQgc2hpZnRfc3RhdGUgPSAwOworCisvKgorICogSW50ZXJuYWwgRGF0YS4KKyAqLworCitzdGF0aWMgc3RydWN0IGlucHV0X2hhbmRsZXIga2JkX2hhbmRsZXI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBrZXlfZG93bltOQklUUyhLRVlfTUFYKV07CQkvKiBrZXlib2FyZCBrZXkgYml0bWFwICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBzaGlmdF9kb3duW05SX1NISUZUXTsJCS8qIHNoaWZ0IHN0YXRlIGNvdW50ZXJzLi4gKi8KK3N0YXRpYyBpbnQgZGVhZF9rZXlfbmV4dDsKK3N0YXRpYyBpbnQgbnBhZGNoID0gLTE7CQkJCQkvKiAtMSBvciBudW1iZXIgYXNzZW1ibGVkIG9uIHBhZCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgZGlhY3I7CitzdGF0aWMgY2hhciByZXA7CQkJCQkvKiBmbGFnIHRlbGxpbmcgY2hhcmFjdGVyIHJlcGVhdCAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBsZWRzdGF0ZSA9IDB4ZmY7CQkJLyogdW5kZWZpbmVkICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBsZWRpb2N0bDsKKworc3RhdGljIHN0cnVjdCBsZWRwdHIgeworCXVuc2lnbmVkIGludCAqYWRkcjsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwl1bnNpZ25lZCBjaGFyIHZhbGlkOjE7Cit9IGxlZHB0cnNbM107CisKKy8qIFNpbXBsZSB0cmFuc2xhdGlvbiB0YWJsZSBmb3IgdGhlIFN5c1JxIGtleXMgKi8KKworI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQordW5zaWduZWQgY2hhciBrYmRfc3lzcnFfeGxhdGVbS0VZX01BWCArIDFdID0KKyAgICAgICAgIlwwMDBcMDMzMTIzNDU2Nzg5MC09XDE3N1x0IiAgICAgICAgICAgICAgICAgICAgLyogMHgwMCAtIDB4MGYgKi8KKyAgICAgICAgInF3ZXJ0eXVpb3BbXVxyXDAwMGFzIiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgxMCAtIDB4MWYgKi8KKyAgICAgICAgImRmZ2hqa2w7J2BcMDAwXFx6eGN2IiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgyMCAtIDB4MmYgKi8KKyAgICAgICAgImJubSwuL1wwMDAqXDAwMCBcMDAwXDIwMVwyMDJcMjAzXDIwNFwyMDUiICAgICAgLyogMHgzMCAtIDB4M2YgKi8KKyAgICAgICAgIlwyMDZcMjA3XDIxMFwyMTFcMjEyXDAwMFwwMDA3ODktNDU2KzEiICAgICAgICAgLyogMHg0MCAtIDB4NGYgKi8KKyAgICAgICAgIjIzMFwxNzdcMDAwXDAwMFwyMTNcMjE0XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIgLyogMHg1MCAtIDB4NWYgKi8KKyAgICAgICAgIlxyXDAwMC8iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg2MCAtIDB4NmYgKi8KK3N0YXRpYyBpbnQgc3lzcnFfZG93bjsKKyNlbmRpZgorc3RhdGljIGludCBzeXNycV9hbHQ7CisKKy8qCisgKiBUcmFuc2xhdGlvbiBvZiBzY2FuY29kZXMgdG8ga2V5Y29kZXMuIFdlIHNldCB0aGVtIG9uIG9ubHkgdGhlIGZpcnN0IGF0dGFjaGVkCisgKiBrZXlib2FyZCAtIGZvciBwZXIta2V5Ym9hcmQgc2V0dGluZywgL2Rldi9pbnB1dC9ldmVudCBpcyBtb3JlIHVzZWZ1bC4KKyAqLworaW50IGdldGtleWNvZGUodW5zaWduZWQgaW50IHNjYW5jb2RlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlOworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoKG5vZGUsJmtiZF9oYW5kbGVyLmhfbGlzdCkgeworCQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICogaGFuZGxlID0gdG9faGFuZGxlX2gobm9kZSk7CisJCWlmIChoYW5kbGUtPmRldi0+a2V5Y29kZXNpemUpIHsgCisJCQlkZXYgPSBoYW5kbGUtPmRldjsgCisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzY2FuY29kZSA+PSBkZXYtPmtleWNvZGVtYXgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIElOUFVUX0tFWUNPREUoZGV2LCBzY2FuY29kZSk7Cit9CisKK2ludCBzZXRrZXljb2RlKHVuc2lnbmVkIGludCBzY2FuY29kZSwgdW5zaWduZWQgaW50IGtleWNvZGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqIG5vZGU7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgaSwgb2xka2V5OworCisJbGlzdF9mb3JfZWFjaChub2RlLCZrYmRfaGFuZGxlci5oX2xpc3QpIHsKKwkJc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlID0gdG9faGFuZGxlX2gobm9kZSk7CisJCWlmIChoYW5kbGUtPmRldi0+a2V5Y29kZXNpemUpIHsgCisJCQlkZXYgPSBoYW5kbGUtPmRldjsgCisJCQlicmVhazsgCisJCX0KKwl9CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoc2NhbmNvZGUgPj0gZGV2LT5rZXljb2RlbWF4KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa2V5Y29kZSA+IEtFWV9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrZXljb2RlIDwgMCB8fCBrZXljb2RlID4gS0VZX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvbGRrZXkgPSBTRVRfSU5QVVRfS0VZQ09ERShkZXYsIHNjYW5jb2RlLCBrZXljb2RlKTsKKworCWNsZWFyX2JpdChvbGRrZXksIGRldi0+a2V5Yml0KTsKKwlzZXRfYml0KGtleWNvZGUsIGRldi0+a2V5Yml0KTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmtleWNvZGVtYXg7IGkrKykKKwkJaWYgKElOUFVUX0tFWUNPREUoZGV2LGkpID09IG9sZGtleSkKKwkJCXNldF9iaXQob2xka2V5LCBkZXYtPmtleWJpdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE1ha2luZyBiZWVwcyBhbmQgYmVsbHMuIAorICovCitzdGF0aWMgdm9pZCBrZF9ub3NvdW5kKHVuc2lnbmVkIGxvbmcgaWdub3JlZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZTsKKworCWxpc3RfZm9yX2VhY2gobm9kZSwma2JkX2hhbmRsZXIuaF9saXN0KSB7CisJCXN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSA9IHRvX2hhbmRsZV9oKG5vZGUpOworCQlpZiAodGVzdF9iaXQoRVZfU05ELCBoYW5kbGUtPmRldi0+ZXZiaXQpKSB7CisJCQlpZiAodGVzdF9iaXQoU05EX1RPTkUsIGhhbmRsZS0+ZGV2LT5zbmRiaXQpKQorCQkJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9TTkQsIFNORF9UT05FLCAwKTsKKwkJCWlmICh0ZXN0X2JpdChTTkRfQkVMTCwgaGFuZGxlLT5kZXYtPnNuZGJpdCkpCisJCQkJaW5wdXRfZXZlbnQoaGFuZGxlLT5kZXYsIEVWX1NORCwgU05EX0JFTEwsIDApOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qga2RfbWtzb3VuZF90aW1lciA9CisJCVRJTUVSX0lOSVRJQUxJWkVSKGtkX25vc291bmQsIDAsIDApOworCit2b2lkIGtkX21rc291bmQodW5zaWduZWQgaW50IGh6LCB1bnNpZ25lZCBpbnQgdGlja3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqIG5vZGU7CisKKwlkZWxfdGltZXIoJmtkX21rc291bmRfdGltZXIpOworCisJaWYgKGh6KSB7CisJCWxpc3RfZm9yX2VhY2hfcHJldihub2RlLCZrYmRfaGFuZGxlci5oX2xpc3QpIHsKKwkJCXN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSA9IHRvX2hhbmRsZV9oKG5vZGUpOworCQkJaWYgKHRlc3RfYml0KEVWX1NORCwgaGFuZGxlLT5kZXYtPmV2Yml0KSkgeworCQkJCWlmICh0ZXN0X2JpdChTTkRfVE9ORSwgaGFuZGxlLT5kZXYtPnNuZGJpdCkpIHsKKwkJCQkJaW5wdXRfZXZlbnQoaGFuZGxlLT5kZXYsIEVWX1NORCwgU05EX1RPTkUsIGh6KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICh0ZXN0X2JpdChTTkRfQkVMTCwgaGFuZGxlLT5kZXYtPnNuZGJpdCkpIHsKKwkJCQkJaW5wdXRfZXZlbnQoaGFuZGxlLT5kZXYsIEVWX1NORCwgU05EX0JFTEwsIDEpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHRpY2tzKQorCQkJbW9kX3RpbWVyKCZrZF9ta3NvdW5kX3RpbWVyLCBqaWZmaWVzICsgdGlja3MpOworCX0gZWxzZQorCQlrZF9ub3NvdW5kKDApOworfQorCisvKgorICogU2V0dGluZyB0aGUga2V5Ym9hcmQgcmF0ZS4KKyAqLworCitpbnQga2JkX3JhdGUoc3RydWN0IGtiZF9yZXBlYXQgKnJlcCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlOworCXVuc2lnbmVkIGludCBkID0gMDsKKwl1bnNpZ25lZCBpbnQgcCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoKG5vZGUsJmtiZF9oYW5kbGVyLmhfbGlzdCkgeworCQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUgPSB0b19oYW5kbGVfaChub2RlKTsKKwkJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gaGFuZGxlLT5kZXY7CisKKwkJaWYgKHRlc3RfYml0KEVWX1JFUCwgZGV2LT5ldmJpdCkpIHsKKwkJCWlmIChyZXAtPmRlbGF5ID4gMCkKKwkJCQlpbnB1dF9ldmVudChkZXYsIEVWX1JFUCwgUkVQX0RFTEFZLCByZXAtPmRlbGF5KTsKKwkJCWlmIChyZXAtPnBlcmlvZCA+IDApCisJCQkJaW5wdXRfZXZlbnQoZGV2LCBFVl9SRVAsIFJFUF9QRVJJT0QsIHJlcC0+cGVyaW9kKTsKKwkJCWQgPSBkZXYtPnJlcFtSRVBfREVMQVldOworCQkJcCA9IGRldi0+cmVwW1JFUF9QRVJJT0RdOworCQl9CisJfQorCXJlcC0+ZGVsYXkgID0gZDsKKwlyZXAtPnBlcmlvZCA9IHA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBIZWxwZXIgRnVuY3Rpb25zLgorICovCitzdGF0aWMgdm9pZCBwdXRfcXVldWUoc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgY2gpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHZjLT52Y190dHk7CisKKwlpZiAodHR5KSB7CisJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIDApOworCQljb25fc2NoZWR1bGVfZmxpcCh0dHkpOworCX0KK30KKworc3RhdGljIHZvaWQgcHV0c19xdWV1ZShzdHJ1Y3QgdmNfZGF0YSAqdmMsIGNoYXIgKmNwKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB2Yy0+dmNfdHR5OworCisJaWYgKCF0dHkpCisJCXJldHVybjsKKworCXdoaWxlICgqY3ApIHsKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAqY3AsIDApOworCQljcCsrOworCX0KKwljb25fc2NoZWR1bGVfZmxpcCh0dHkpOworfQorCitzdGF0aWMgdm9pZCBhcHBsa2V5KHN0cnVjdCB2Y19kYXRhICp2YywgaW50IGtleSwgY2hhciBtb2RlKQoreworCXN0YXRpYyBjaGFyIGJ1ZltdID0geyAweDFiLCAnTycsIDB4MDAsIDB4MDAgfTsKKworCWJ1ZlsxXSA9IChtb2RlID8gJ08nIDogJ1snKTsKKwlidWZbMl0gPSBrZXk7CisJcHV0c19xdWV1ZSh2YywgYnVmKTsKK30KKworLyoKKyAqIE1hbnkgb3RoZXIgcm91dGluZXMgZG8gcHV0X3F1ZXVlLCBidXQgSSB0aGluayBlaXRoZXIKKyAqIHRoZXkgcHJvZHVjZSBBU0NJSSwgb3IgdGhleSBwcm9kdWNlIHNvbWUgdXNlci1hc3NpZ25lZAorICogc3RyaW5nLCBhbmQgaW4gYm90aCBjYXNlcyB3ZSBtaWdodCBhc3N1bWUgdGhhdCBpdCBpcworICogaW4gdXRmLTggYWxyZWFkeS4gVVRGLTggaXMgZGVmaW5lZCBmb3Igd29yZHMgb2YgdXAgdG8gMzEgYml0cywKKyAqIGJ1dCB3ZSBuZWVkIG9ubHkgMTYgYml0cyBoZXJlCisgKi8KK3N0YXRpYyB2b2lkIHRvX3V0Zjgoc3RydWN0IHZjX2RhdGEgKnZjLCB1c2hvcnQgYykKK3sKKwlpZiAoYyA8IDB4ODApCisJCS8qICAwKioqKioqKiAqLworCQlwdXRfcXVldWUodmMsIGMpOworICAgIAllbHNlIGlmIChjIDwgMHg4MDApIHsKKwkJLyogMTEwKioqKiogMTAqKioqKiogKi8KKwkJcHV0X3F1ZXVlKHZjLCAweGMwIHwgKGMgPj4gNikpOyAKKwkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKGMgJiAweDNmKSk7CisgICAgCX0gZWxzZSB7CisJCS8qIDExMTAqKioqIDEwKioqKioqIDEwKioqKioqICovCisJCXB1dF9xdWV1ZSh2YywgMHhlMCB8IChjID4+IDEyKSk7CisJCXB1dF9xdWV1ZSh2YywgMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpKTsKKwkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKGMgJiAweDNmKSk7CisgICAgCX0KK30KKworLyogCisgKiBDYWxsZWQgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gUkFXIG1vZGUgb3Igd2hlbiBjaGFuZ2luZyBjb25zb2xlcyAtIHJlY29tcHV0ZQorICogc2hpZnRfZG93bltdIGFuZCBzaGlmdF9zdGF0ZSBmcm9tIGtleV9kb3duW10gbWF5YmUgY2FsbGVkIHdoZW4ga2V5bWFwIGlzCisgKiB1bmRlZmluZWQsIHNvIHRoYXQgc2hpZnRrZXkgcmVsZWFzZSBpcyBzZWVuCisgKi8KK3ZvaWQgY29tcHV0ZV9zaGlmdHN0YXRlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGksIGosIGssIHN5bSwgdmFsOworCisJc2hpZnRfc3RhdGUgPSAwOworCW1lbXNldChzaGlmdF9kb3duLCAwLCBzaXplb2Yoc2hpZnRfZG93bikpOworCQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtleV9kb3duKTsgaSsrKSB7CisKKwkJaWYgKCFrZXlfZG93bltpXSkKKwkJCWNvbnRpbnVlOworCisJCWsgPSBpICogQklUU19QRVJfTE9ORzsKKworCQlmb3IgKGogPSAwOyBqIDwgQklUU19QRVJfTE9ORzsgaisrLCBrKyspIHsKKworCQkJaWYgKCF0ZXN0X2JpdChrLCBrZXlfZG93bikpCisJCQkJY29udGludWU7CisKKwkJCXN5bSA9IFUoa2V5X21hcHNbMF1ba10pOworCQkJaWYgKEtUWVAoc3ltKSAhPSBLVF9TSElGVCAmJiBLVFlQKHN5bSkgIT0gS1RfU0xPQ0spCisJCQkJY29udGludWU7CisKKwkJCXZhbCA9IEtWQUwoc3ltKTsKKwkJCWlmICh2YWwgPT0gS1ZBTChLX0NBUFNTSElGVCkpCisJCQkJdmFsID0gS1ZBTChLX1NISUZUKTsKKworCQkJc2hpZnRfZG93blt2YWxdKys7CisJCQlzaGlmdF9zdGF0ZSB8PSAoMSA8PCB2YWwpOworCQl9CisJfQorfQorCisvKgorICogV2UgaGF2ZSBhIGNvbWJpbmluZyBjaGFyYWN0ZXIgRElBQ1IgaGVyZSwgZm9sbG93ZWQgYnkgdGhlIGNoYXJhY3RlciBDSC4KKyAqIElmIHRoZSBjb21iaW5hdGlvbiBvY2N1cnMgaW4gdGhlIHRhYmxlLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuCisgKiBPdGhlcndpc2UsIGlmIENIIGlzIGEgc3BhY2Ugb3IgZXF1YWxzIERJQUNSLCByZXR1cm4gRElBQ1IuCisgKiBPdGhlcndpc2UsIGNvbmNsdWRlIHRoYXQgRElBQ1Igd2FzIG5vdCBjb21iaW5pbmcgYWZ0ZXIgYWxsLAorICogcXVldWUgaXQgYW5kIHJldHVybiBDSC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGFuZGxlX2RpYWNyKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlpbnQgZCA9IGRpYWNyOworCXVuc2lnbmVkIGludCBpOworCisJZGlhY3IgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGFjY2VudF90YWJsZV9zaXplOyBpKyspIHsKKwkJaWYgKGFjY2VudF90YWJsZVtpXS5kaWFjciA9PSBkICYmIGFjY2VudF90YWJsZVtpXS5iYXNlID09IGNoKQorCQkJcmV0dXJuIGFjY2VudF90YWJsZVtpXS5yZXN1bHQ7CisJfQorCisJaWYgKGNoID09ICcgJyB8fCBjaCA9PSBkKQorCQlyZXR1cm4gZDsKKworCXB1dF9xdWV1ZSh2YywgZCk7CisJcmV0dXJuIGNoOworfQorCisvKgorICogU3BlY2lhbCBmdW5jdGlvbiBoYW5kbGVycworICovCitzdGF0aWMgdm9pZCBmbl9lbnRlcihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChkaWFjcikgeworCQlwdXRfcXVldWUodmMsIGRpYWNyKTsKKwkJZGlhY3IgPSAwOworCX0KKwlwdXRfcXVldWUodmMsIDEzKTsKKwlpZiAodmNfa2JkX21vZGUoa2JkLCBWQ19DUkxGKSkKKwkJcHV0X3F1ZXVlKHZjLCAxMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZuX2NhcHNfdG9nZ2xlKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHJlcCkKKwkJcmV0dXJuOworCWNoZ192Y19rYmRfbGVkKGtiZCwgVkNfQ0FQU0xPQ0spOworfQorCitzdGF0aWMgdm9pZCBmbl9jYXBzX29uKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHJlcCkKKwkJcmV0dXJuOworCXNldF92Y19rYmRfbGVkKGtiZCwgVkNfQ0FQU0xPQ0spOworfQorCitzdGF0aWMgdm9pZCBmbl9zaG93X3B0cmVncyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChyZWdzKQorCQlzaG93X3JlZ3MocmVncyk7Cit9CisKK3N0YXRpYyB2b2lkIGZuX2hvbGQoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdmMtPnZjX3R0eTsKKworCWlmIChyZXAgfHwgIXR0eSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBOb3RlOiBTQ1JPTExPQ0sgd2lsbCBiZSBzZXQgKGNsZWFyZWQpIGJ5IHN0b3BfdHR5IChzdGFydF90dHkpOworCSAqIHRoZXNlIHJvdXRpbmVzIGFyZSBhbHNvIGFjdGl2YXRlZCBieSBeUy9eUS4KKwkgKiAoQW5kIFNDUk9MTE9DSyBjYW4gYWxzbyBiZSBzZXQgYnkgdGhlIGlvY3RsIEtEU0tCTEVELikKKwkgKi8KKwlpZiAodHR5LT5zdG9wcGVkKQorCQlzdGFydF90dHkodHR5KTsKKwllbHNlCisJCXN0b3BfdHR5KHR0eSk7Cit9CisKK3N0YXRpYyB2b2lkIGZuX251bShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICh2Y19rYmRfbW9kZShrYmQsVkNfQVBQTElDKSkKKwkJYXBwbGtleSh2YywgJ1AnLCAxKTsKKwllbHNlCisJCWZuX2JhcmVfbnVtKHZjLCByZWdzKTsKK30KKworLyoKKyAqIEJpbmQgdGhpcyB0byBTaGlmdC1OdW1Mb2NrIGlmIHlvdSB3b3JrIGluIGFwcGxpY2F0aW9uIGtleXBhZCBtb2RlCisgKiBidXQgd2FudCB0byBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgTnVtTG9jayBmbGFnLgorICogQmluZCB0aGlzIHRvIE51bUxvY2sgaWYgeW91IHByZWZlciB0aGF0IHRoZSBOdW1Mb2NrIGtleSBhbHdheXMKKyAqIGNoYW5nZXMgdGhlIE51bUxvY2sgZmxhZy4KKyAqLworc3RhdGljIHZvaWQgZm5fYmFyZV9udW0oc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoIXJlcCkKKwkJY2hnX3ZjX2tiZF9sZWQoa2JkLCBWQ19OVU1MT0NLKTsKK30KKworc3RhdGljIHZvaWQgZm5fbGFzdGNvbnMoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKiBzd2l0Y2ggdG8gdGhlIGxhc3QgdXNlZCBjb25zb2xlLCBDaE4gKi8KKwlzZXRfY29uc29sZShsYXN0X2NvbnNvbGUpOworfQorCitzdGF0aWMgdm9pZCBmbl9kZWNfY29uc29sZShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpLCBjdXIgPSBmZ19jb25zb2xlOworCisJLyogQ3VycmVudGx5IHN3aXRjaGluZz8gIFF1ZXVlIHRoaXMgbmV4dCBzd2l0Y2ggcmVsYXRpdmUgdG8gdGhhdC4gKi8KKwlpZiAod2FudF9jb25zb2xlICE9IC0xKQorCQljdXIgPSB3YW50X2NvbnNvbGU7CisKKwlmb3IgKGkgPSBjdXItMTsgaSAhPSBjdXI7IGktLSkgeworCQlpZiAoaSA9PSAtMSkKKwkJCWkgPSBNQVhfTlJfQ09OU09MRVMtMTsKKwkJaWYgKHZjX2NvbnNfYWxsb2NhdGVkKGkpKQorCQkJYnJlYWs7CisJfQorCXNldF9jb25zb2xlKGkpOworfQorCitzdGF0aWMgdm9pZCBmbl9pbmNfY29uc29sZShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpLCBjdXIgPSBmZ19jb25zb2xlOworCisJLyogQ3VycmVudGx5IHN3aXRjaGluZz8gIFF1ZXVlIHRoaXMgbmV4dCBzd2l0Y2ggcmVsYXRpdmUgdG8gdGhhdC4gKi8KKwlpZiAod2FudF9jb25zb2xlICE9IC0xKQorCQljdXIgPSB3YW50X2NvbnNvbGU7CisKKwlmb3IgKGkgPSBjdXIrMTsgaSAhPSBjdXI7IGkrKykgeworCQlpZiAoaSA9PSBNQVhfTlJfQ09OU09MRVMpCisJCQlpID0gMDsKKwkJaWYgKHZjX2NvbnNfYWxsb2NhdGVkKGkpKQorCQkJYnJlYWs7CisJfQorCXNldF9jb25zb2xlKGkpOworfQorCitzdGF0aWMgdm9pZCBmbl9zZW5kX2ludHIoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdmMtPnZjX3R0eTsKKworCWlmICghdHR5KQorCQlyZXR1cm47CisJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfQlJFQUspOworCWNvbl9zY2hlZHVsZV9mbGlwKHR0eSk7Cit9CisKK3N0YXRpYyB2b2lkIGZuX3Njcm9sbF9mb3J3KHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2Nyb2xsZnJvbnQodmMsIDApOworfQorCitzdGF0aWMgdm9pZCBmbl9zY3JvbGxfYmFjayhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNjcm9sbGJhY2sodmMsIDApOworfQorCitzdGF0aWMgdm9pZCBmbl9zaG93X21lbShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNob3dfbWVtKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZuX3Nob3dfc3RhdGUoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzaG93X3N0YXRlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZuX2Jvb3RfaXQoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwljdHJsX2FsdF9kZWwoKTsKK30KKworc3RhdGljIHZvaWQgZm5fY29tcG9zZShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWRlYWRfa2V5X25leHQgPSAxOworfQorCitzdGF0aWMgdm9pZCBmbl9zcGF3bl9jb24oc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgaWYgKHNwYXducGlkKQorCSAgIGlmKGtpbGxfcHJvYyhzcGF3bnBpZCwgc3Bhd25zaWcsIDEpKQorCSAgICAgc3Bhd25waWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBmbl9TQUsoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdmMtPnZjX3R0eTsKKworCS8qCisJICogU0FLIHNob3VsZCBhbHNvIHdvcmsgaW4gYWxsIHJhdyBtb2RlcyBhbmQgcmVzZXQKKwkgKiB0aGVtIHByb3Blcmx5LgorCSAqLworCWlmICh0dHkpCisJCWRvX1NBSyh0dHkpOworCXJlc2V0X3ZjKHZjKTsKK30KKworc3RhdGljIHZvaWQgZm5fbnVsbChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNvbXB1dGVfc2hpZnRzdGF0ZSgpOworfQorCisvKgorICogU3BlY2lhbCBrZXkgaGFuZGxlcnMKKyAqLworc3RhdGljIHZvaWQga19pZ25vcmUoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworfQorCitzdGF0aWMgdm9pZCBrX3NwZWMoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICh1cF9mbGFnKQorCQlyZXR1cm47CisJaWYgKHZhbHVlID49IEFSUkFZX1NJWkUoZm5faGFuZGxlcikpCisJCXJldHVybjsKKwlpZiAoKGtiZC0+a2JkbW9kZSA9PSBWQ19SQVcgfHwgCisJICAgICBrYmQtPmtiZG1vZGUgPT0gVkNfTUVESVVNUkFXKSAmJiAKKwkgICAgIHZhbHVlICE9IEtWQUwoS19TQUspKQorCQlyZXR1cm47CQkvKiBTQUsgaXMgYWxsb3dlZCBldmVuIGluIHJhdyBtb2RlICovCisJZm5faGFuZGxlclt2YWx1ZV0odmMsIHJlZ3MpOworfQorCitzdGF0aWMgdm9pZCBrX2xvd2VyY2FzZShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcHJpbnRrKEtFUk5fRVJSICJrZXlib2FyZC5jOiBrX2xvd2VyY2FzZSB3YXMgY2FsbGVkIC0gaW1wb3NzaWJsZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGtfc2VsZihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHVwX2ZsYWcpCisJCXJldHVybjsJCS8qIG5vIGFjdGlvbiwgaWYgdGhpcyBpcyBhIGtleSByZWxlYXNlICovCisKKwlpZiAoZGlhY3IpCisJCXZhbHVlID0gaGFuZGxlX2RpYWNyKHZjLCB2YWx1ZSk7CisKKwlpZiAoZGVhZF9rZXlfbmV4dCkgeworCQlkZWFkX2tleV9uZXh0ID0gMDsKKwkJZGlhY3IgPSB2YWx1ZTsKKwkJcmV0dXJuOworCX0KKwlwdXRfcXVldWUodmMsIHZhbHVlKTsKK30KKworLyoKKyAqIEhhbmRsZSBkZWFkIGtleS4gTm90ZSB0aGF0IHdlIG5vdyBtYXkgaGF2ZSBzZXZlcmFsCisgKiBkZWFkIGtleXMgbW9kaWZ5aW5nIHRoZSBzYW1lIGNoYXJhY3Rlci4gVmVyeSB1c2VmdWwKKyAqIGZvciBWaWV0bmFtZXNlLgorICovCitzdGF0aWMgdm9pZCBrX2RlYWQyKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAodXBfZmxhZykKKwkJcmV0dXJuOworCWRpYWNyID0gKGRpYWNyID8gaGFuZGxlX2RpYWNyKHZjLCB2YWx1ZSkgOiB2YWx1ZSk7Cit9CisKKy8qCisgKiBPYnNvbGV0ZSAtIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5CisgKi8KK3N0YXRpYyB2b2lkIGtfZGVhZChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmV0X2RpYWNyW05SX0RFQURdID0geydgJywgJ1wnJywgJ14nLCAnficsICciJywgJywnIH07CisJdmFsdWUgPSByZXRfZGlhY3JbdmFsdWVdOworCWtfZGVhZDIodmMsIHZhbHVlLCB1cF9mbGFnLCByZWdzKTsKK30KKworc3RhdGljIHZvaWQga19jb25zKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAodXBfZmxhZykKKwkJcmV0dXJuOworCXNldF9jb25zb2xlKHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQga19mbihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgdjsKKworCWlmICh1cF9mbGFnKQorCQlyZXR1cm47CisJdiA9IHZhbHVlOworCWlmICh2IDwgQVJSQVlfU0laRShmdW5jX3RhYmxlKSkgeworCQlpZiAoZnVuY190YWJsZVt2YWx1ZV0pCisJCQlwdXRzX3F1ZXVlKHZjLCBmdW5jX3RhYmxlW3ZhbHVlXSk7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiAia19mbiBjYWxsZWQgd2l0aCB2YWx1ZT0lZFxuIiwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBrX2N1cihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmN1cl9jaGFycyA9ICJCRENBIjsKKworCWlmICh1cF9mbGFnKQorCQlyZXR1cm47CisJYXBwbGtleSh2YywgY3VyX2NoYXJzW3ZhbHVlXSwgdmNfa2JkX21vZGUoa2JkLCBWQ19DS01PREUpKTsKK30KKworc3RhdGljIHZvaWQga19wYWQoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpwYWRfY2hhcnMgPSAiMDEyMzQ1Njc4OSstKi9cMDE1LC4/KCkjIjsKKwlzdGF0aWMgY29uc3QgY2hhciAqYXBwX21hcCA9ICJwcXJzdHV2d3h5bFNSUU1ubm1QUVMiOworCisJaWYgKHVwX2ZsYWcpCisJCXJldHVybjsJCS8qIG5vIGFjdGlvbiwgaWYgdGhpcyBpcyBhIGtleSByZWxlYXNlICovCisKKwkvKiBrbHVkZ2UuLi4gc2hpZnQgZm9yY2VzIGN1cnNvci9udW1iZXIga2V5cyAqLworCWlmICh2Y19rYmRfbW9kZShrYmQsIFZDX0FQUExJQykgJiYgIXNoaWZ0X2Rvd25bS0dfU0hJRlRdKSB7CisJCWFwcGxrZXkodmMsIGFwcF9tYXBbdmFsdWVdLCAxKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghdmNfa2JkX2xlZChrYmQsIFZDX05VTUxPQ0spKQorCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIEtWQUwoS19QQ09NTUEpOgorCQkJY2FzZSBLVkFMKEtfUERPVCk6CisJCQkJa19mbih2YywgS1ZBTChLX1JFTU9WRSksIDAsIHJlZ3MpOworCQkJCXJldHVybjsKKwkJCWNhc2UgS1ZBTChLX1AwKToKKwkJCQlrX2ZuKHZjLCBLVkFMKEtfSU5TRVJUKSwgMCwgcmVncyk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBLVkFMKEtfUDEpOgorCQkJCWtfZm4odmMsIEtWQUwoS19TRUxFQ1QpLCAwLCByZWdzKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEtWQUwoS19QMik6CisJCQkJa19jdXIodmMsIEtWQUwoS19ET1dOKSwgMCwgcmVncyk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBLVkFMKEtfUDMpOgorCQkJCWtfZm4odmMsIEtWQUwoS19QR0ROKSwgMCwgcmVncyk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBLVkFMKEtfUDQpOgorCQkJCWtfY3VyKHZjLCBLVkFMKEtfTEVGVCksIDAsIHJlZ3MpOworCQkJCXJldHVybjsKKwkJCWNhc2UgS1ZBTChLX1A2KToKKwkJCQlrX2N1cih2YywgS1ZBTChLX1JJR0hUKSwgMCwgcmVncyk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBLVkFMKEtfUDcpOgorCQkJCWtfZm4odmMsIEtWQUwoS19GSU5EKSwgMCwgcmVncyk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBLVkFMKEtfUDgpOgorCQkJCWtfY3VyKHZjLCBLVkFMKEtfVVApLCAwLCByZWdzKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEtWQUwoS19QOSk6CisJCQkJa19mbih2YywgS1ZBTChLX1BHVVApLCAwLCByZWdzKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEtWQUwoS19QNSk6CisJCQkJYXBwbGtleSh2YywgJ0cnLCB2Y19rYmRfbW9kZShrYmQsIFZDX0FQUExJQykpOworCQkJCXJldHVybjsKKwkJfQorCisJcHV0X3F1ZXVlKHZjLCBwYWRfY2hhcnNbdmFsdWVdKTsKKwlpZiAodmFsdWUgPT0gS1ZBTChLX1BFTlRFUikgJiYgdmNfa2JkX21vZGUoa2JkLCBWQ19DUkxGKSkKKwkJcHV0X3F1ZXVlKHZjLCAxMCk7Cit9CisKK3N0YXRpYyB2b2lkIGtfc2hpZnQoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBvbGRfc3RhdGUgPSBzaGlmdF9zdGF0ZTsKKworCWlmIChyZXApCisJCXJldHVybjsKKwkvKgorCSAqIE1pbWljIHR5cGV3cml0ZXI6CisJICogYSBDYXBzU2hpZnQga2V5IGFjdHMgbGlrZSBTaGlmdCBidXQgdW5kb2VzIENhcHNMb2NrCisJICovCisJaWYgKHZhbHVlID09IEtWQUwoS19DQVBTU0hJRlQpKSB7CisJCXZhbHVlID0gS1ZBTChLX1NISUZUKTsKKwkJaWYgKCF1cF9mbGFnKQorCQkJY2xyX3ZjX2tiZF9sZWQoa2JkLCBWQ19DQVBTTE9DSyk7CisJfQorCisJaWYgKHVwX2ZsYWcpIHsKKwkJLyoKKwkJICogaGFuZGxlIHRoZSBjYXNlIHRoYXQgdHdvIHNoaWZ0IG9yIGNvbnRyb2wKKwkJICoga2V5cyBhcmUgZGVwcmVzc2VkIHNpbXVsdGFuZW91c2x5CisJCSAqLworCQlpZiAoc2hpZnRfZG93blt2YWx1ZV0pCisJCQlzaGlmdF9kb3duW3ZhbHVlXS0tOworCX0gZWxzZQorCQlzaGlmdF9kb3duW3ZhbHVlXSsrOworCisJaWYgKHNoaWZ0X2Rvd25bdmFsdWVdKQorCQlzaGlmdF9zdGF0ZSB8PSAoMSA8PCB2YWx1ZSk7CisJZWxzZQorCQlzaGlmdF9zdGF0ZSAmPSB+KDEgPDwgdmFsdWUpOworCisJLyoga2x1ZGdlICovCisJaWYgKHVwX2ZsYWcgJiYgc2hpZnRfc3RhdGUgIT0gb2xkX3N0YXRlICYmIG5wYWRjaCAhPSAtMSkgeworCQlpZiAoa2JkLT5rYmRtb2RlID09IFZDX1VOSUNPREUpCisJCQl0b191dGY4KHZjLCBucGFkY2ggJiAweGZmZmYpOworCQllbHNlCisJCQlwdXRfcXVldWUodmMsIG5wYWRjaCAmIDB4ZmYpOworCQlucGFkY2ggPSAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGtfbWV0YShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHVwX2ZsYWcpCisJCXJldHVybjsKKworCWlmICh2Y19rYmRfbW9kZShrYmQsIFZDX01FVEEpKSB7CisJCXB1dF9xdWV1ZSh2YywgJ1wwMzMnKTsKKwkJcHV0X3F1ZXVlKHZjLCB2YWx1ZSk7CisJfSBlbHNlCisJCXB1dF9xdWV1ZSh2YywgdmFsdWUgfCAweDgwKTsKK30KKworc3RhdGljIHZvaWQga19hc2NpaShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGJhc2U7CisKKwlpZiAodXBfZmxhZykKKwkJcmV0dXJuOworCisJaWYgKHZhbHVlIDwgMTApIHsKKwkJLyogZGVjaW1hbCBpbnB1dCBvZiBjb2RlLCB3aGlsZSBBbHQgZGVwcmVzc2VkICovCisJCWJhc2UgPSAxMDsKKwl9IGVsc2UgeworCQkvKiBoZXhhZGVjaW1hbCBpbnB1dCBvZiBjb2RlLCB3aGlsZSBBbHRHciBkZXByZXNzZWQgKi8KKwkJdmFsdWUgLT0gMTA7CisJCWJhc2UgPSAxNjsKKwl9CisKKwlpZiAobnBhZGNoID09IC0xKQorCQlucGFkY2ggPSB2YWx1ZTsKKwllbHNlCisJCW5wYWRjaCA9IG5wYWRjaCAqIGJhc2UgKyB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQga19sb2NrKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAodXBfZmxhZyB8fCByZXApCisJCXJldHVybjsKKwljaGdfdmNfa2JkX2xvY2soa2JkLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGtfc2xvY2soc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtfc2hpZnQodmMsIHZhbHVlLCB1cF9mbGFnLCByZWdzKTsKKwlpZiAodXBfZmxhZyB8fCByZXApCisJCXJldHVybjsKKwljaGdfdmNfa2JkX3Nsb2NrKGtiZCwgdmFsdWUpOworCS8qIHRyeSB0byBtYWtlIEFsdCwgb29wcywgQWx0R3IgYW5kIHN1Y2ggd29yayAqLworCWlmICgha2V5X21hcHNba2JkLT5sb2Nrc3RhdGUgXiBrYmQtPnNsb2Nrc3RhdGVdKSB7CisJCWtiZC0+c2xvY2tzdGF0ZSA9IDA7CisJCWNoZ192Y19rYmRfc2xvY2soa2JkLCB2YWx1ZSk7CisJfQorfQorCisvKgorICogVGhlIGxlZHMgZGlzcGxheSBlaXRoZXIgKGkpIHRoZSBzdGF0dXMgb2YgTnVtTG9jaywgQ2Fwc0xvY2ssIFNjcm9sbExvY2ssCisgKiBvciAoaWkpIHdoYXRldmVyIHBhdHRlcm4gb2YgbGlnaHRzIHBlb3BsZSB3YW50IHRvIHNob3cgdXNpbmcgS0RTRVRMRUQsCisgKiBvciAoaWlpKSBzcGVjaWZpZWQgYml0cyBvZiBzcGVjaWZpZWQgd29yZHMgaW4ga2VybmVsIG1lbW9yeS4KKyAqLwordW5zaWduZWQgY2hhciBnZXRsZWRzdGF0ZSh2b2lkKQoreworCXJldHVybiBsZWRzdGF0ZTsKK30KKwordm9pZCBzZXRsZWRzdGF0ZShzdHJ1Y3Qga2JkX3N0cnVjdCAqa2JkLCB1bnNpZ25lZCBpbnQgbGVkKQoreworCWlmICghKGxlZCAmIH43KSkgeworCQlsZWRpb2N0bCA9IGxlZDsKKwkJa2JkLT5sZWRtb2RlID0gTEVEX1NIT1dfSU9DVEw7CisJfSBlbHNlCisJCWtiZC0+bGVkbW9kZSA9IExFRF9TSE9XX0ZMQUdTOworCXNldF9sZWRzKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBnZXRsZWRzKHZvaWQpCit7CisJc3RydWN0IGtiZF9zdHJ1Y3QgKmtiZCA9IGtiZF90YWJsZSArIGZnX2NvbnNvbGU7CisJdW5zaWduZWQgY2hhciBsZWRzOworCWludCBpOworCisJaWYgKGtiZC0+bGVkbW9kZSA9PSBMRURfU0hPV19JT0NUTCkKKwkJcmV0dXJuIGxlZGlvY3RsOworCisJbGVkcyA9IGtiZC0+bGVkZmxhZ3N0YXRlOworCisJaWYgKGtiZC0+bGVkbW9kZSA9PSBMRURfU0hPV19NRU0pIHsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCWlmIChsZWRwdHJzW2ldLnZhbGlkKSB7CisJCQkJaWYgKCpsZWRwdHJzW2ldLmFkZHIgJiBsZWRwdHJzW2ldLm1hc2spCisJCQkJCWxlZHMgfD0gKDEgPDwgaSk7CisJCQkJZWxzZQorCQkJCQlsZWRzICY9IH4oMSA8PCBpKTsKKwkJCX0KKwl9CisJcmV0dXJuIGxlZHM7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSBrZXlib2FyZCBpbnRlcnJ1cHQKKyAqIHJvdXRpbmUsIGFuZCBydW5zIHdpdGggYWxsIGludGVycnVwdHMgZW5hYmxlZC4gSXQgZG9lcworICogY29uc29sZSBjaGFuZ2luZywgbGVkIHNldHRpbmcgYW5kIGNvcHlfdG9fY29va2VkLCB3aGljaCBjYW4KKyAqIHRha2UgYSByZWFzb25hYmx5IGxvbmcgdGltZS4KKyAqCisgKiBBc2lkZSBmcm9tIHRpbWluZyAod2hpY2ggaXNuJ3QgcmVhbGx5IHRoYXQgaW1wb3J0YW50IGZvcgorICoga2V5Ym9hcmQgaW50ZXJydXB0cyBhcyB0aGV5IGhhcHBlbiBvZnRlbiksIHVzaW5nIHRoZSBzb2Z0d2FyZQorICogaW50ZXJydXB0IHJvdXRpbmVzIGZvciB0aGlzIHRoaW5nIGFsbG93cyB1cyB0byBlYXNpbHkgbWFzaworICogdGhpcyB3aGVuIHdlIGRvbid0IHdhbnQgYW55IG9mIHRoZSBhYm92ZSB0byBoYXBwZW4uCisgKiBUaGlzIGFsbG93cyBmb3IgZWFzeSBhbmQgZWZmaWNpZW50IHJhY2UtY29uZGl0aW9uIHByZXZlbnRpb24KKyAqIGZvciBrYmRfcmVmcmVzaF9sZWRzID0+IGlucHV0X2V2ZW50KGRldiwgRVZfTEVELCAuLi4pID0+IC4uLgorICovCisKK3N0YXRpYyB2b2lkIGtiZF9iaCh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlOworCXVuc2lnbmVkIGNoYXIgbGVkcyA9IGdldGxlZHMoKTsKKworCWlmIChsZWRzICE9IGxlZHN0YXRlKSB7CisJCWxpc3RfZm9yX2VhY2gobm9kZSwma2JkX2hhbmRsZXIuaF9saXN0KSB7CisJCQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICogaGFuZGxlID0gdG9faGFuZGxlX2gobm9kZSk7CisJCQlpbnB1dF9ldmVudChoYW5kbGUtPmRldiwgRVZfTEVELCBMRURfU0NST0xMTCwgISEobGVkcyAmIDB4MDEpKTsKKwkJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9MRUQsIExFRF9OVU1MLCAgICAhIShsZWRzICYgMHgwMikpOworCQkJaW5wdXRfZXZlbnQoaGFuZGxlLT5kZXYsIEVWX0xFRCwgTEVEX0NBUFNMLCAgICEhKGxlZHMgJiAweDA0KSk7CisJCQlpbnB1dF9zeW5jKGhhbmRsZS0+ZGV2KTsKKwkJfQorCX0KKworCWxlZHN0YXRlID0gbGVkczsKK30KKworREVDTEFSRV9UQVNLTEVUX0RJU0FCTEVEKGtleWJvYXJkX3Rhc2tsZXQsIGtiZF9iaCwgMCk7CisKKy8qCisgKiBUaGlzIGFsbG93cyBhIG5ld2x5IHBsdWdnZWQga2V5Ym9hcmQgdG8gcGljayB0aGUgTEVEIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBrYmRfcmVmcmVzaF9sZWRzKHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGxlZHMgPSBsZWRzdGF0ZTsKKworCXRhc2tsZXRfZGlzYWJsZSgma2V5Ym9hcmRfdGFza2xldCk7CisJaWYgKGxlZHMgIT0gMHhmZikgeworCQlpbnB1dF9ldmVudChoYW5kbGUtPmRldiwgRVZfTEVELCBMRURfU0NST0xMTCwgISEobGVkcyAmIDB4MDEpKTsKKwkJaW5wdXRfZXZlbnQoaGFuZGxlLT5kZXYsIEVWX0xFRCwgTEVEX05VTUwsICAgICEhKGxlZHMgJiAweDAyKSk7CisJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9MRUQsIExFRF9DQVBTTCwgICAhIShsZWRzICYgMHgwNCkpOworCQlpbnB1dF9zeW5jKGhhbmRsZS0+ZGV2KTsKKwl9CisJdGFza2xldF9lbmFibGUoJmtleWJvYXJkX3Rhc2tsZXQpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2KSB8fCBkZWZpbmVkKENPTkZJR19JQTY0KSB8fCBkZWZpbmVkKENPTkZJR19BTFBIQSkgfHxcCisgICAgZGVmaW5lZChDT05GSUdfTUlQUykgfHwgZGVmaW5lZChDT05GSUdfUFBDKSB8fCBkZWZpbmVkKENPTkZJR19TUEFSQzMyKSB8fFwKKyAgICBkZWZpbmVkKENPTkZJR19TUEFSQzY0KSB8fCBkZWZpbmVkKENPTkZJR19QQVJJU0MpIHx8IGRlZmluZWQoQ09ORklHX1NVUEVSSCkgfHxcCisgICAgKGRlZmluZWQoQ09ORklHX0FSTSkgJiYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfQVRLQkQpICYmICFkZWZpbmVkKENPTkZJR19BUkNIX1JQQykpCisKKyNkZWZpbmUgSFdfUkFXKGRldikgKHRlc3RfYml0KEVWX01TQywgZGV2LT5ldmJpdCkgJiYgdGVzdF9iaXQoTVNDX1JBVywgZGV2LT5tc2NiaXQpICYmXAorCQkJKChkZXYpLT5pZC5idXN0eXBlID09IEJVU19JODA0MikgJiYgKChkZXYpLT5pZC52ZW5kb3IgPT0gMHgwMDAxKSAmJiAoKGRldiktPmlkLnByb2R1Y3QgPT0gMHgwMDAxKSkKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHg4Nl9rZXljb2Rlc1syNTZdID0KKwl7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisJIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAorCSAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKKwkgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsCisJIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LAorCSA4MCwgODEsIDgyLCA4MywgODQsMTE4LCA4NiwgODcsIDg4LDExNSwxMjAsMTE5LDEyMSwxMTIsMTIzLCA5MiwKKwkyODQsMjg1LDMwOSwyOTgsMzEyLCA5MSwzMjcsMzI4LDMyOSwzMzEsMzMzLDMzNSwzMzYsMzM3LDMzOCwzMzksCisJMzY3LDI4OCwzMDIsMzA0LDM1MCwgODksMzM0LDMyNiwyNjcsMTI2LDI2OCwyNjksMTI1LDM0NywzNDgsMzQ5LAorCTM2MCwyNjEsMjYyLDI2MywyNjgsMzc2LDEwMCwxMDEsMzIxLDMxNiwzNzMsMjg2LDI4OSwxMDIsMzUxLDM1NSwKKwkxMDMsMTA0LDEwNSwyNzUsMjg3LDI3OSwzMDYsMTA2LDI3NCwxMDcsMjk0LDM2NCwzNTgsMzYzLDM2MiwzNjEsCisJMjkxLDEwOCwzODEsMjgxLDI5MCwyNzIsMjkyLDMwNSwyODAsIDk5LDExMiwyNTcsMjU4LDM1OSwxMTMsMTE0LAorCTI2NCwxMTcsMjcxLDM3NCwzNzksMjY1LDI2NiwgOTMsIDk0LCA5NSwgODUsMjU5LDM3NSwyNjAsIDkwLDExNiwKKwkzNzcsMTA5LDExMSwyNzcsMjc4LDI4MiwyODMsMjk1LDI5NiwyOTcsMjk5LDMwMCwzMDEsMjkzLDMwMywzMDcsCisJMzA4LDMxMCwzMTMsMzE0LDMxNSwzMTcsMzE4LDMxOSwzMjAsMzU3LDMyMiwzMjMsMzI0LDMyNSwyNzYsMzMwLAorCTMzMiwzNDAsMzY1LDM0MiwzNDMsMzQ0LDM0NSwzNDYsMzU2LDI3MCwzNDEsMzY4LDM2OSwzNzAsMzcxLDM3MiB9OworCisjaWZkZWYgQ09ORklHX01BQ19FTVVNT1VTRUJUTgorZXh0ZXJuIGludCBtYWNfaGlkX21vdXNlX2VtdWxhdGVfYnV0dG9ucyhpbnQsIGludCwgaW50KTsKKyNlbmRpZiAvKiBDT05GSUdfTUFDX0VNVU1PVVNFQlROICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUEFSQzMyKSB8fCBkZWZpbmVkKENPTkZJR19TUEFSQzY0KQorc3RhdGljIGludCBzcGFyY19sMV9hX3N0YXRlID0gMDsKK2V4dGVybiB2b2lkIHN1bl9kb19icmVhayh2b2lkKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGVtdWxhdGVfcmF3KHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IGtleWNvZGUsIAorCQkgICAgICAgdW5zaWduZWQgY2hhciB1cF9mbGFnKQoreworCWlmIChrZXljb2RlID4gMjU1IHx8ICF4ODZfa2V5Y29kZXNba2V5Y29kZV0pCisJCXJldHVybiAtMTsgCisKKwlzd2l0Y2ggKGtleWNvZGUpIHsKKwkJY2FzZSBLRVlfUEFVU0U6CisJCQlwdXRfcXVldWUodmMsIDB4ZTEpOworCQkJcHV0X3F1ZXVlKHZjLCAweDFkIHwgdXBfZmxhZyk7CisJCQlwdXRfcXVldWUodmMsIDB4NDUgfCB1cF9mbGFnKTsKKwkJCXJldHVybiAwOworCQljYXNlIEtFWV9IQU5HVUVMOgorCQkJaWYgKCF1cF9mbGFnKSBwdXRfcXVldWUodmMsIDB4ZjEpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgS0VZX0hBTkpBOgorCQkJaWYgKCF1cF9mbGFnKSBwdXRfcXVldWUodmMsIDB4ZjIpOworCQkJcmV0dXJuIDA7CisJfSAKKworCWlmIChrZXljb2RlID09IEtFWV9TWVNSUSAmJiBzeXNycV9hbHQpIHsKKwkJcHV0X3F1ZXVlKHZjLCAweDU0IHwgdXBfZmxhZyk7CisJCXJldHVybiAwOworCX0KKworCWlmICh4ODZfa2V5Y29kZXNba2V5Y29kZV0gJiAweDEwMCkKKwkJcHV0X3F1ZXVlKHZjLCAweGUwKTsKKworCXB1dF9xdWV1ZSh2YywgKHg4Nl9rZXljb2Rlc1trZXljb2RlXSAmIDB4N2YpIHwgdXBfZmxhZyk7CisKKwlpZiAoa2V5Y29kZSA9PSBLRVlfU1lTUlEpIHsKKwkJcHV0X3F1ZXVlKHZjLCAweGUwKTsKKwkJcHV0X3F1ZXVlKHZjLCAweDM3IHwgdXBfZmxhZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgSFdfUkFXKGRldikJMAorCisjd2FybmluZyAiQ2Fubm90IGdlbmVyYXRlIHJhd21vZGUga2V5Ym9hcmQgZm9yIHlvdXIgYXJjaGl0ZWN0dXJlIHlldC4iCisKK3N0YXRpYyBpbnQgZW11bGF0ZV9yYXcoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBpbnQga2V5Y29kZSwgdW5zaWduZWQgY2hhciB1cF9mbGFnKQoreworCWlmIChrZXljb2RlID4gMTI3KQorCQlyZXR1cm4gLTE7CisKKwlwdXRfcXVldWUodmMsIGtleWNvZGUgfCB1cF9mbGFnKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBrYmRfcmF3Y29kZSh1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJc3RydWN0IHZjX2RhdGEgKnZjID0gdmNfY29uc1tmZ19jb25zb2xlXS5kOworCWtiZCA9IGtiZF90YWJsZSArIGZnX2NvbnNvbGU7CisJaWYgKGtiZC0+a2JkbW9kZSA9PSBWQ19SQVcpCisJCXB1dF9xdWV1ZSh2YywgZGF0YSk7Cit9CisKK3ZvaWQga2JkX2tleWNvZGUodW5zaWduZWQgaW50IGtleWNvZGUsIGludCBkb3duLCBpbnQgaHdfcmF3LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdmNfZGF0YSAqdmMgPSB2Y19jb25zW2ZnX2NvbnNvbGVdLmQ7CisJdW5zaWduZWQgc2hvcnQga2V5c3ltLCAqa2V5X21hcDsKKwl1bnNpZ25lZCBjaGFyIHR5cGUsIHJhd19tb2RlOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IHNoaWZ0X2ZpbmFsOworCisJdHR5ID0gdmMtPnZjX3R0eTsKKworCWlmICh0dHkgJiYgKCF0dHktPmRyaXZlcl9kYXRhKSkgeworCQkvKiBObyBkcml2ZXIgZGF0YT8gU3RyYW5nZS4gT2theSB3ZSBmaXggaXQgdGhlbi4gKi8KKwkJdHR5LT5kcml2ZXJfZGF0YSA9IHZjOworCX0KKworCWtiZCA9IGtiZF90YWJsZSArIGZnX2NvbnNvbGU7CisKKwlpZiAoa2V5Y29kZSA9PSBLRVlfTEVGVEFMVCB8fCBrZXljb2RlID09IEtFWV9SSUdIVEFMVCkKKwkJc3lzcnFfYWx0ID0gZG93bjsKKyNpZiBkZWZpbmVkKENPTkZJR19TUEFSQzMyKSB8fCBkZWZpbmVkKENPTkZJR19TUEFSQzY0KQorCWlmIChrZXljb2RlID09IEtFWV9TVE9QKQorCQlzcGFyY19sMV9hX3N0YXRlID0gZG93bjsKKyNlbmRpZgorCisJcmVwID0gKGRvd24gPT0gMik7CisKKyNpZmRlZiBDT05GSUdfTUFDX0VNVU1PVVNFQlROCisJaWYgKG1hY19oaWRfbW91c2VfZW11bGF0ZV9idXR0b25zKDEsIGtleWNvZGUsIGRvd24pKQorCQlyZXR1cm47CisjZW5kaWYgLyogQ09ORklHX01BQ19FTVVNT1VTRUJUTiAqLworCisJaWYgKChyYXdfbW9kZSA9IChrYmQtPmtiZG1vZGUgPT0gVkNfUkFXKSkgJiYgIWh3X3JhdykKKwkJaWYgKGVtdWxhdGVfcmF3KHZjLCBrZXljb2RlLCAhZG93biA8PCA3KSkKKwkJCWlmIChrZXljb2RlIDwgQlROX01JU0MpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAia2V5Ym9hcmQuYzogY2FuJ3QgZW11bGF0ZSByYXdtb2RlIGZvciBrZXljb2RlICVkXG4iLCBrZXljb2RlKTsKKworI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQkgICAgICAgLyogSGFuZGxlIHRoZSBTeXNScSBIYWNrICovCisJaWYgKGtleWNvZGUgPT0gS0VZX1NZU1JRICYmIChzeXNycV9kb3duIHx8IChkb3duID09IDEgJiYgc3lzcnFfYWx0KSkpIHsKKwkJc3lzcnFfZG93biA9IGRvd247CisJCXJldHVybjsKKwl9CisJaWYgKHN5c3JxX2Rvd24gJiYgZG93biAmJiAhcmVwKSB7CisJCWhhbmRsZV9zeXNycShrYmRfc3lzcnFfeGxhdGVba2V5Y29kZV0sIHJlZ3MsIHR0eSk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUEFSQzMyKSB8fCBkZWZpbmVkKENPTkZJR19TUEFSQzY0KQorCWlmIChrZXljb2RlID09IEtFWV9BICYmIHNwYXJjX2wxX2Ffc3RhdGUpIHsKKwkJc3BhcmNfbDFfYV9zdGF0ZSA9IDA7CisJCXN1bl9kb19icmVhaygpOworCX0KKyNlbmRpZgorCisJaWYgKGtiZC0+a2JkbW9kZSA9PSBWQ19NRURJVU1SQVcpIHsKKwkJLyoKKwkJICogVGhpcyBpcyBleHRlbmRlZCBtZWRpdW0gcmF3IG1vZGUsIHdpdGgga2V5cyBhYm92ZSAxMjcKKwkJICogZW5jb2RlZCBhcyAwLCBoaWdoIDcgYml0cywgbG93IDcgYml0cywgd2l0aCB0aGUgMCBiZWFyaW5nCisJCSAqIHRoZSAndXAnIGZsYWcgaWYgbmVlZGVkLiAwIGlzIHJlc2VydmVkLCBzbyB0aGlzIHNob3VsZG4ndAorCQkgKiBpbnRlcmZlcmUgd2l0aCBhbnl0aGluZyBlbHNlLiBUaGUgdHdvIGJ5dGVzIGFmdGVyIDAgd2lsbAorCQkgKiBhbHdheXMgaGF2ZSB0aGUgdXAgZmxhZyBzZXQgbm90IHRvIGludGVyZmVyZSB3aXRoIG9sZGVyCisJCSAqIGFwcGxpY2F0aW9ucy4gVGhpcyBhbGxvd3MgZm9yIDE2Mzg0IGRpZmZlcmVudCBrZXljb2RlcywKKwkJICogd2hpY2ggc2hvdWxkIGJlIGVub3VnaC4KKwkJICovCisJCWlmIChrZXljb2RlIDwgMTI4KSB7CisJCQlwdXRfcXVldWUodmMsIGtleWNvZGUgfCAoIWRvd24gPDwgNykpOworCQl9IGVsc2UgeworCQkJcHV0X3F1ZXVlKHZjLCAhZG93biA8PCA3KTsKKwkJCXB1dF9xdWV1ZSh2YywgKGtleWNvZGUgPj4gNykgfCAweDgwKTsKKwkJCXB1dF9xdWV1ZSh2Yywga2V5Y29kZSB8IDB4ODApOworCQl9CisJCXJhd19tb2RlID0gMTsKKwl9CisKKwlpZiAoZG93bikKKwkJc2V0X2JpdChrZXljb2RlLCBrZXlfZG93bik7CisJZWxzZQorCQljbGVhcl9iaXQoa2V5Y29kZSwga2V5X2Rvd24pOworCisJaWYgKHJlcCAmJiAoIXZjX2tiZF9tb2RlKGtiZCwgVkNfUkVQRUFUKSB8fCAodHR5ICYmIAorCQkoIUxfRUNITyh0dHkpICYmIHR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIodHR5KSkpKSkgeworCQkvKgorCQkgKiBEb24ndCByZXBlYXQgYSBrZXkgaWYgdGhlIGlucHV0IGJ1ZmZlcnMgYXJlIG5vdCBlbXB0eSBhbmQgdGhlCisJCSAqIGNoYXJhY3RlcnMgZ2V0IGFyZW4ndCBlY2hvZWQgbG9jYWxseS4gVGhpcyBtYWtlcyBrZXkgcmVwZWF0IAorCQkgKiB1c2FibGUgd2l0aCBzbG93IGFwcGxpY2F0aW9ucyBhbmQgdW5kZXIgaGVhdnkgbG9hZHMuCisJCSAqLworCQlyZXR1cm47CisJfQorCisJc2hpZnRfZmluYWwgPSAoc2hpZnRfc3RhdGUgfCBrYmQtPnNsb2Nrc3RhdGUpIF4ga2JkLT5sb2Nrc3RhdGU7CisJa2V5X21hcCA9IGtleV9tYXBzW3NoaWZ0X2ZpbmFsXTsKKworCWlmICgha2V5X21hcCkgeworCQljb21wdXRlX3NoaWZ0c3RhdGUoKTsKKwkJa2JkLT5zbG9ja3N0YXRlID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmIChrZXljb2RlID4gTlJfS0VZUykKKwkJcmV0dXJuOworCisJa2V5c3ltID0ga2V5X21hcFtrZXljb2RlXTsKKwl0eXBlID0gS1RZUChrZXlzeW0pOworCisJaWYgKHR5cGUgPCAweGYwKSB7CisJCWlmIChkb3duICYmICFyYXdfbW9kZSkgdG9fdXRmOCh2Yywga2V5c3ltKTsKKwkJcmV0dXJuOworCX0KKworCXR5cGUgLT0gMHhmMDsKKworCWlmIChyYXdfbW9kZSAmJiB0eXBlICE9IEtUX1NQRUMgJiYgdHlwZSAhPSBLVF9TSElGVCkKKwkJcmV0dXJuOworCisJaWYgKHR5cGUgPT0gS1RfTEVUVEVSKSB7CisJCXR5cGUgPSBLVF9MQVRJTjsKKwkJaWYgKHZjX2tiZF9sZWQoa2JkLCBWQ19DQVBTTE9DSykpIHsKKwkJCWtleV9tYXAgPSBrZXlfbWFwc1tzaGlmdF9maW5hbCBeICgxIDw8IEtHX1NISUZUKV07CisJCQlpZiAoa2V5X21hcCkKKwkJCQlrZXlzeW0gPSBrZXlfbWFwW2tleWNvZGVdOworCQl9CisJfQorCisJKCprX2hhbmRsZXJbdHlwZV0pKHZjLCBrZXlzeW0gJiAweGZmLCAhZG93biwgcmVncyk7CisKKwlpZiAodHlwZSAhPSBLVF9TTE9DSykKKwkJa2JkLT5zbG9ja3N0YXRlID0gMDsKK30KKworc3RhdGljIHZvaWQga2JkX2V2ZW50KHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSwgdW5zaWduZWQgaW50IGV2ZW50X3R5cGUsIAorCQkgICAgICB1bnNpZ25lZCBpbnQgZXZlbnRfY29kZSwgaW50IHZhbHVlKQoreworCWlmIChldmVudF90eXBlID09IEVWX01TQyAmJiBldmVudF9jb2RlID09IE1TQ19SQVcgJiYgSFdfUkFXKGhhbmRsZS0+ZGV2KSkKKwkJa2JkX3Jhd2NvZGUodmFsdWUpOworCWlmIChldmVudF90eXBlID09IEVWX0tFWSkKKwkJa2JkX2tleWNvZGUoZXZlbnRfY29kZSwgdmFsdWUsIEhXX1JBVyhoYW5kbGUtPmRldiksIGhhbmRsZS0+ZGV2LT5yZWdzKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZrZXlib2FyZF90YXNrbGV0KTsKKwlkb19wb2tlX2JsYW5rZWRfY29uc29sZSA9IDE7CisJc2NoZWR1bGVfY29uc29sZV9jYWxsYmFjaygpOworfQorCitzdGF0aWMgY2hhciBrYmRfbmFtZVtdID0gImtiZCI7CisKKy8qCisgKiBXaGVuIGEga2V5Ym9hcmQgKG9yIG90aGVyIGlucHV0IGRldmljZSkgaXMgZm91bmQsIHRoZSBrYmRfY29ubmVjdAorICogZnVuY3Rpb24gaXMgY2FsbGVkLiBUaGUgZnVuY3Rpb24gdGhlbiBsb29rcyBhdCB0aGUgZGV2aWNlLCBhbmQgaWYgaXQKKyAqIGxpa2VzIGl0LCBpdCBjYW4gb3BlbiBpdCBhbmQgZ2V0IGV2ZW50cyBmcm9tIGl0LiBJbiB0aGlzIChrYmRfY29ubmVjdCkKKyAqIGZ1bmN0aW9uLCB3ZSBzaG91bGQgZGVjaWRlIHdoaWNoIFZUIHRvIGJpbmQgdGhhdCBrZXlib2FyZCB0byBpbml0aWFsbHkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5wdXRfaGFuZGxlICprYmRfY29ubmVjdChzdHJ1Y3QgaW5wdXRfaGFuZGxlciAqaGFuZGxlciwgCisJCQkJCXN0cnVjdCBpbnB1dF9kZXYgKmRldiwKKwkJCQkJc3RydWN0IGlucHV0X2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlOworCWludCBpOworCisJZm9yIChpID0gS0VZX1JFU0VSVkVEOyBpIDwgQlROX01JU0M7IGkrKykKKwkJaWYgKHRlc3RfYml0KGksIGRldi0+a2V5Yml0KSkgYnJlYWs7CisKKwlpZiAoKGkgPT0gQlROX01JU0MpICYmICF0ZXN0X2JpdChFVl9TTkQsIGRldi0+ZXZiaXQpKSAKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIShoYW5kbGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5wdXRfaGFuZGxlKSwgR0ZQX0tFUk5FTCkpKSAKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGhhbmRsZSwgMCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9oYW5kbGUpKTsKKworCWhhbmRsZS0+ZGV2ID0gZGV2OworCWhhbmRsZS0+aGFuZGxlciA9IGhhbmRsZXI7CisJaGFuZGxlLT5uYW1lID0ga2JkX25hbWU7CisKKwlpbnB1dF9vcGVuX2RldmljZShoYW5kbGUpOworCWtiZF9yZWZyZXNoX2xlZHMoaGFuZGxlKTsKKworCXJldHVybiBoYW5kbGU7Cit9CisKK3N0YXRpYyB2b2lkIGtiZF9kaXNjb25uZWN0KHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSkKK3sKKwlpbnB1dF9jbG9zZV9kZXZpY2UoaGFuZGxlKTsKKwlrZnJlZShoYW5kbGUpOworfQorCitzdGF0aWMgc3RydWN0IGlucHV0X2RldmljZV9pZCBrYmRfaWRzW10gPSB7CisJeworICAgICAgICAgICAgICAgIC5mbGFncyA9IElOUFVUX0RFVklDRV9JRF9NQVRDSF9FVkJJVCwKKyAgICAgICAgICAgICAgICAuZXZiaXQgPSB7IEJJVChFVl9LRVkpIH0sCisgICAgICAgIH0sCisJCisJeworICAgICAgICAgICAgICAgIC5mbGFncyA9IElOUFVUX0RFVklDRV9JRF9NQVRDSF9FVkJJVCwKKyAgICAgICAgICAgICAgICAuZXZiaXQgPSB7IEJJVChFVl9TTkQpIH0sCisgICAgICAgIH0sCQorCisJeyB9LCAgICAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpbnB1dCwga2JkX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaW5wdXRfaGFuZGxlciBrYmRfaGFuZGxlciA9IHsKKwkuZXZlbnQJCT0ga2JkX2V2ZW50LAorCS5jb25uZWN0CT0ga2JkX2Nvbm5lY3QsCisJLmRpc2Nvbm5lY3QJPSBrYmRfZGlzY29ubmVjdCwKKwkubmFtZQkJPSAia2JkIiwKKwkuaWRfdGFibGUJPSBrYmRfaWRzLAorfTsKKworaW50IF9faW5pdCBrYmRfaW5pdCh2b2lkKQoreworCWludCBpOworCisgICAgICAgIGtiZDAubGVkZmxhZ3N0YXRlID0ga2JkMC5kZWZhdWx0X2xlZGZsYWdzdGF0ZSA9IEtCRF9ERUZMRURTOworICAgICAgICBrYmQwLmxlZG1vZGUgPSBMRURfU0hPV19GTEFHUzsKKyAgICAgICAga2JkMC5sb2Nrc3RhdGUgPSBLQkRfREVGTE9DSzsKKyAgICAgICAga2JkMC5zbG9ja3N0YXRlID0gMDsKKyAgICAgICAga2JkMC5tb2RlZmxhZ3MgPSBLQkRfREVGTU9ERTsKKyAgICAgICAga2JkMC5rYmRtb2RlID0gVkNfWExBVEU7CisKKyAgICAgICAgZm9yIChpID0gMCA7IGkgPCBNQVhfTlJfQ09OU09MRVMgOyBpKyspCisgICAgICAgICAgICAgICAga2JkX3RhYmxlW2ldID0ga2JkMDsKKworCWlucHV0X3JlZ2lzdGVyX2hhbmRsZXIoJmtiZF9oYW5kbGVyKTsKKworCXRhc2tsZXRfZW5hYmxlKCZrZXlib2FyZF90YXNrbGV0KTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZrZXlib2FyZF90YXNrbGV0KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2xjZC5jIGIvZHJpdmVycy9jaGFyL2xjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDFhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbGNkLmMKQEAgLTAsMCArMSw2ODMgQEAKKy8qCisgKiBMQ0QsIExFRCBhbmQgQnV0dG9uIGludGVyZmFjZSBmb3IgQ29iYWx0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IGJ5IEFuZHJldyBCb3NlCisgKgorICogTGludXgga2VybmVsIHZlcnNpb24gaGlzdG9yeToKKyAqICAgICAgIE1hcmNoIDIwMDE6IFBvcnRlZCBmcm9tIDIuMC4zNCAgYnkgTGlhbSBEYXZpZXMKKyAqCisgKi8KKworI2RlZmluZSBSVENfSU9fRVhURU5UCTB4MTAJLypPbmx5IHJlYWxseSB0d28gcG9ydHMsIGJ1dC4uLiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJsY2QuaCIKKworc3RhdGljIERFRklORV9TUElOTE9DSyhsY2RfbG9jayk7CisKK3N0YXRpYyBpbnQgbGNkX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBsY2RfcHJlc2VudCA9IDE7CisKKy8qIHVzZWQgaW4gYXJjaC9taXBzL2NvYmFsdC9yZXNldC5jICovCitpbnQgbGVkX3N0YXRlID0gMDsKKworI2lmIGRlZmluZWQoQ09ORklHX1RVTElQKSAmJiAwCisKKyNkZWZpbmUgTUFYX0lOVEVSRkFDRVMJOAorc3RhdGljIGxpbmtjaGVja19mdW5jX3QgbGlua2NoZWNrX2NhbGxiYWNrc1tNQVhfSU5URVJGQUNFU107CitzdGF0aWMgdm9pZCAqbGlua2NoZWNrX2Nvb2tpZXNbTUFYX0lOVEVSRkFDRVNdOworCitpbnQgbGNkX3JlZ2lzdGVyX2xpbmtjaGVja19mdW5jKGludCBpZmFjZV9udW0sIHZvaWQgKmZ1bmMsIHZvaWQgKmNvb2tpZSkKK3sKKwlpZiAoaWZhY2VfbnVtIDwgMCB8fAorCSAgICBpZmFjZV9udW0gPj0gTUFYX0lOVEVSRkFDRVMgfHwKKwkgICAgbGlua2NoZWNrX2NhbGxiYWNrc1tpZmFjZV9udW1dICE9IE5VTEwpCisJCXJldHVybiAtMTsKKwlsaW5rY2hlY2tfY2FsbGJhY2tzW2lmYWNlX251bV0gPSAobGlua2NoZWNrX2Z1bmNfdCkgZnVuYzsKKwlsaW5rY2hlY2tfY29va2llc1tpZmFjZV9udW1dID0gY29va2llOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbGNkX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBsY2RfZGlzcGxheSBidXR0b25fZGlzcGxheTsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGE7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTENEX09uOgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDBGKTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9PZmY6CisJCXVkZWxheSgxNTApOworCQlCdXN5Q2hlY2soKTsKKwkJTENEV3JpdGVJbnN0KDB4MDgpOworCQlicmVhazsKKworCWNhc2UgTENEX1Jlc2V0OgorCQl1ZGVsYXkoMTUwKTsKKwkJTENEV3JpdGVJbnN0KDB4M0YpOworCQl1ZGVsYXkoMTUwKTsKKwkJTENEV3JpdGVJbnN0KDB4M0YpOworCQl1ZGVsYXkoMTUwKTsKKwkJTENEV3JpdGVJbnN0KDB4M0YpOworCQl1ZGVsYXkoMTUwKTsKKwkJTENEV3JpdGVJbnN0KDB4M0YpOworCQl1ZGVsYXkoMTUwKTsKKwkJTENEV3JpdGVJbnN0KDB4MDEpOworCQl1ZGVsYXkoMTUwKTsKKwkJTENEV3JpdGVJbnN0KDB4MDYpOworCQlicmVhazsKKworCWNhc2UgTENEX0NsZWFyOgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDAxKTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9DdXJzb3JfTGVmdDoKKwkJdWRlbGF5KDE1MCk7CisJCUJ1c3lDaGVjaygpOworCQlMQ0RXcml0ZUluc3QoMHgxMCk7CisJCWJyZWFrOworCisJY2FzZSBMQ0RfQ3Vyc29yX1JpZ2h0OgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDE0KTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9DdXJzb3JfT2ZmOgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDBDKTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9DdXJzb3JfT246CisJCXVkZWxheSgxNTApOworCQlCdXN5Q2hlY2soKTsKKwkJTENEV3JpdGVJbnN0KDB4MEYpOworCQlicmVhazsKKworCWNhc2UgTENEX0JsaW5rX09mZjoKKwkJdWRlbGF5KDE1MCk7CisJCUJ1c3lDaGVjaygpOworCQlMQ0RXcml0ZUluc3QoMHgwRSk7CisJCWJyZWFrOworCisJY2FzZSBMQ0RfR2V0X0N1cnNvcl9Qb3M6eworCQkJc3RydWN0IGxjZF9kaXNwbGF5IGRpc3BsYXk7CisKKwkJCXVkZWxheSgxNTApOworCQkJQnVzeUNoZWNrKCk7CisJCQlkaXNwbGF5LmN1cnNvcl9hZGRyZXNzID0gKExDRFJlYWRJbnN0KTsKKwkJCWRpc3BsYXkuY3Vyc29yX2FkZHJlc3MgPQorCQkJICAgIChkaXNwbGF5LmN1cnNvcl9hZGRyZXNzICYgMHgwN0YpOworCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJICAgICgoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywgJmRpc3BsYXksCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJYnJlYWs7CisJCX0KKworCisJY2FzZSBMQ0RfU2V0X0N1cnNvcl9Qb3M6eworCQkJc3RydWN0IGxjZF9kaXNwbGF5IGRpc3BsYXk7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgICgmZGlzcGxheSwgKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJYSA9IChkaXNwbGF5LmN1cnNvcl9hZGRyZXNzIHwga0xDRF9BZGRyKTsKKworCQkJdWRlbGF5KDE1MCk7CisJCQlCdXN5Q2hlY2soKTsKKwkJCUxDRFdyaXRlSW5zdChhKTsKKworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgTENEX0dldF9DdXJzb3I6eworCQkJc3RydWN0IGxjZF9kaXNwbGF5IGRpc3BsYXk7CisKKwkJCXVkZWxheSgxNTApOworCQkJQnVzeUNoZWNrKCk7CisJCQlkaXNwbGF5LmNoYXJhY3RlciA9IExDRFJlYWREYXRhOworCisJCQlpZiAoY29weV90b191c2VyCisJCQkgICAgKChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLCAmZGlzcGxheSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsY2RfZGlzcGxheSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdWRlbGF5KDE1MCk7CisJCQlCdXN5Q2hlY2soKTsKKwkJCUxDRFdyaXRlSW5zdCgweDEwKTsKKworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgTENEX1NldF9DdXJzb3I6eworCQkJc3RydWN0IGxjZF9kaXNwbGF5IGRpc3BsYXk7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgICgmZGlzcGxheSwgKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJdWRlbGF5KDE1MCk7CisJCQlCdXN5Q2hlY2soKTsKKwkJCUxDRFdyaXRlRGF0YShkaXNwbGF5LmNoYXJhY3Rlcik7CisJCQl1ZGVsYXkoMTUwKTsKKwkJCUJ1c3lDaGVjaygpOworCQkJTENEV3JpdGVJbnN0KDB4MTApOworCisJCQlicmVhazsKKwkJfQorCisKKwljYXNlIExDRF9EaXNwX0xlZnQ6CisJCXVkZWxheSgxNTApOworCQlCdXN5Q2hlY2soKTsKKwkJTENEV3JpdGVJbnN0KDB4MTgpOworCQlicmVhazsKKworCWNhc2UgTENEX0Rpc3BfUmlnaHQ6CisJCXVkZWxheSgxNTApOworCQlCdXN5Q2hlY2soKTsKKwkJTENEV3JpdGVJbnN0KDB4MUMpOworCQlicmVhazsKKworCWNhc2UgTENEX0hvbWU6CisJCXVkZWxheSgxNTApOworCQlCdXN5Q2hlY2soKTsKKwkJTENEV3JpdGVJbnN0KDB4MDIpOworCQlicmVhazsKKworCWNhc2UgTENEX1dyaXRlOnsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBkaXNwbGF5OworCQkJdW5zaWduZWQgaW50IGluZGV4OworCisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgICgmZGlzcGxheSwgKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJdWRlbGF5KDE1MCk7CisJCQlCdXN5Q2hlY2soKTsKKwkJCUxDRFdyaXRlSW5zdCgweDgwKTsKKwkJCXVkZWxheSgxNTApOworCQkJQnVzeUNoZWNrKCk7CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IChkaXNwbGF5LnNpemUxKTsgaW5kZXgrKykgeworCQkJCXVkZWxheSgxNTApOworCQkJCUJ1c3lDaGVjaygpOworCQkJCUxDRFdyaXRlRGF0YShkaXNwbGF5LmxpbmUxW2luZGV4XSk7CisJCQkJQnVzeUNoZWNrKCk7CisJCQl9CisKKwkJCXVkZWxheSgxNTApOworCQkJQnVzeUNoZWNrKCk7CisJCQlMQ0RXcml0ZUluc3QoMHhDMCk7CisJCQl1ZGVsYXkoMTUwKTsKKwkJCUJ1c3lDaGVjaygpOworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgKGRpc3BsYXkuc2l6ZTIpOyBpbmRleCsrKSB7CisJCQkJdWRlbGF5KDE1MCk7CisJCQkJQnVzeUNoZWNrKCk7CisJCQkJTENEV3JpdGVEYXRhKGRpc3BsYXkubGluZTJbaW5kZXhdKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgTENEX1JlYWQ6eworCQkJc3RydWN0IGxjZF9kaXNwbGF5IGRpc3BsYXk7CisKKwkJCUJ1c3lDaGVjaygpOworCQkJZm9yIChhZGRyZXNzID0ga0REX1IwMDsgYWRkcmVzcyA8PSBrRERfUjAxOworCQkJICAgICBhZGRyZXNzKyspIHsKKwkJCQlhID0gKGFkZHJlc3MgfCBrTENEX0FkZHIpOworCisJCQkJdWRlbGF5KDE1MCk7CisJCQkJQnVzeUNoZWNrKCk7CisJCQkJTENEV3JpdGVJbnN0KGEpOworCQkJCXVkZWxheSgxNTApOworCQkJCUJ1c3lDaGVjaygpOworCQkJCWRpc3BsYXkubGluZTFbYWRkcmVzc10gPSBMQ0RSZWFkRGF0YTsKKwkJCX0KKworCQkJZGlzcGxheS5saW5lMVsweDI3XSA9ICdcMCc7CisKKwkJCWZvciAoYWRkcmVzcyA9IGtERF9SMTA7IGFkZHJlc3MgPD0ga0REX1IxMTsKKwkJCSAgICAgYWRkcmVzcysrKSB7CisJCQkJYSA9IChhZGRyZXNzIHwga0xDRF9BZGRyKTsKKworCQkJCXVkZWxheSgxNTApOworCQkJCUJ1c3lDaGVjaygpOworCQkJCUxDRFdyaXRlSW5zdChhKTsKKworCQkJCXVkZWxheSgxNTApOworCQkJCUJ1c3lDaGVjaygpOworCQkJCWRpc3BsYXkubGluZTJbYWRkcmVzcyAtIDB4NDBdID0KKwkJCQkgICAgTENEUmVhZERhdGE7CisJCQl9CisKKwkJCWRpc3BsYXkubGluZTJbMHgyN10gPSAnXDAnOworCisJCQlpZiAoY29weV90b191c2VyCisJCQkgICAgKChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLCAmZGlzcGxheSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsY2RfZGlzcGxheSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworLy8gIHNldCBhbGwgR1BJTyBsZWRzIHRvIGxlZF9kaXNwbGF5LmxlZHMKKworCWNhc2UgTEVEX1NldDp7CisJCQlzdHJ1Y3QgbGNkX2Rpc3BsYXkgbGVkX2Rpc3BsYXk7CisKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkgICAgKCZsZWRfZGlzcGxheSwgKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJbGVkX3N0YXRlID0gbGVkX2Rpc3BsYXkubGVkczsKKwkJCUxFRFNldChsZWRfc3RhdGUpOworCisJCQlicmVhazsKKwkJfQorCisKKy8vICBzZXQgb25seSBiaXQgbGVkX2Rpc3BsYXkubGVkcworCisJY2FzZSBMRURfQml0X1NldDp7CisJCQl1bnNpZ25lZCBpbnQgaTsKKwkJCWludCBiaXQgPSAxOworCQkJc3RydWN0IGxjZF9kaXNwbGF5IGxlZF9kaXNwbGF5OworCisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgICgmbGVkX2Rpc3BsYXksIChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWZvciAoaSA9IDA7IGkgPCAoaW50KSBsZWRfZGlzcGxheS5sZWRzOyBpKyspIHsKKwkJCQliaXQgPSAyICogYml0OworCQkJfQorCisJCQlsZWRfc3RhdGUgPSBsZWRfc3RhdGUgfCBiaXQ7CisJCQlMRURTZXQobGVkX3N0YXRlKTsKKwkJCWJyZWFrOworCQl9CisKKy8vICBjbGVhciBvbmx5IGJpdCBsZWRfZGlzcGxheS5sZWRzCisKKwljYXNlIExFRF9CaXRfQ2xlYXI6eworCQkJdW5zaWduZWQgaW50IGk7CisJCQlpbnQgYml0ID0gMTsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBsZWRfZGlzcGxheTsKKworCisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJmxlZF9kaXNwbGF5LCAoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsY2RfZGlzcGxheSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlmb3IgKGkgPSAwOyBpIDwgKGludCkgbGVkX2Rpc3BsYXkubGVkczsgaSsrKSB7CisJCQkJYml0ID0gMiAqIGJpdDsKKwkJCX0KKworCQkJbGVkX3N0YXRlID0gbGVkX3N0YXRlICYgfmJpdDsKKwkJCUxFRFNldChsZWRfc3RhdGUpOworCQkJYnJlYWs7CisJCX0KKworCisJY2FzZSBCVVRUT05fUmVhZDp7CisJCQlidXR0b25fZGlzcGxheS5idXR0b25zID0gR1BJUmVhZDsKKwkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCSAgICAoKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsICZidXR0b25fZGlzcGxheSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsY2RfZGlzcGxheSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgTElOS19DaGVjazp7CisJCQlidXR0b25fZGlzcGxheS5idXR0b25zID0KKwkJCSAgICAqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopICgweEIwMTAwMDYwKSk7CisJCQlpZiAoY29weV90b191c2VyCisJCQkgICAgKChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLCAmYnV0dG9uX2Rpc3BsYXksCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIExJTktfQ2hlY2tfMjp7CisJCQlpbnQgaWZhY2VfbnVtOworCisJCQkvKiBwYW5lbC11dGlscyBzaG91bGQgcGFzcyBpbiB0aGUgZGVzaXJlZCBpbnRlcmZhY2Ugc3RhdHVzIGlzIHdhbnRlZCBmb3IKKwkJCSAqIGluICJidXR0b25zIiBvZiB0aGUgc3RydWN0dXJlLiAgV2Ugd2lsbCBzZXQgdGhpcyB0byBub24temVybyBpZiB0aGUKKwkJCSAqIGxpbmsgaXMgaW4gZmFjdCB1cCBmb3IgdGhlIHJlcXVlc3RlZCBpbnRlcmZhY2UuICAtLURhdmVNCisJCQkgKi8KKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgICgmYnV0dG9uX2Rpc3BsYXksIChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLAorCQkJICAgICBzaXplb2YoYnV0dG9uX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmYWNlX251bSA9IGJ1dHRvbl9kaXNwbGF5LmJ1dHRvbnM7CisjaWYgZGVmaW5lZChDT05GSUdfVFVMSVApICYmIDAKKwkJCWlmIChpZmFjZV9udW0gPj0gMCAmJgorCQkJICAgIGlmYWNlX251bSA8IE1BWF9JTlRFUkZBQ0VTICYmCisJCQkgICAgbGlua2NoZWNrX2NhbGxiYWNrc1tpZmFjZV9udW1dICE9IE5VTEwpIHsKKwkJCQlidXR0b25fZGlzcGxheS5idXR0b25zID0KKwkJCQkgICAgbGlua2NoZWNrX2NhbGxiYWNrc1tpZmFjZV9udW1dCisJCQkJICAgIChsaW5rY2hlY2tfY29va2llc1tpZmFjZV9udW1dKTsKKwkJCX0gZWxzZQorI2VuZGlmCisJCQkJYnV0dG9uX2Rpc3BsYXkuYnV0dG9ucyA9IDA7CisKKwkJCWlmIChfX2NvcHlfdG9fdXNlcgorCQkJICAgICgoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywgJmJ1dHRvbl9kaXNwbGF5LAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisvLyAgRXJhc2UgdGhlIGZsYXNoCisKKwljYXNlIEZMQVNIX0VyYXNlOnsKKworCQkJaW50IGN0ciA9IDA7CisKKwkJCWlmICggIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgKSByZXR1cm4gLUVQRVJNOworCisJCQlwcl9pbmZvKExDRCAiRXJhc2luZyBGbGFzaFxuIik7CisKKwkJCS8vIENoaXAgRXJhc2UgU2VxdWVuY2UKKwkJCVdSSVRFX0ZMQVNIKGtGbGFzaF9BZGRyMSwga0ZsYXNoX0RhdGExKTsKKwkJCVdSSVRFX0ZMQVNIKGtGbGFzaF9BZGRyMiwga0ZsYXNoX0RhdGEyKTsKKwkJCVdSSVRFX0ZMQVNIKGtGbGFzaF9BZGRyMSwga0ZsYXNoX0VyYXNlMyk7CisJCQlXUklURV9GTEFTSChrRmxhc2hfQWRkcjEsIGtGbGFzaF9EYXRhMSk7CisJCQlXUklURV9GTEFTSChrRmxhc2hfQWRkcjIsIGtGbGFzaF9EYXRhMik7CisJCQlXUklURV9GTEFTSChrRmxhc2hfQWRkcjEsIGtGbGFzaF9FcmFzZTYpOworCisJCQl3aGlsZSAoKCFkcXBvbGwoMHgwMDAwMDAwMCwgMHhGRikpCisJCQkgICAgICAgJiYgKCF0aW1lb3V0KDB4MDAwMDAwMDApKSkgeworCQkJCWN0cisrOworCQkJfQorCisJCQlpZiAoUkVBRF9GTEFTSCgweDA3RkZGMCkgPT0gMHhGRikgeworCQkJCXByX2luZm8oTENEICJFcmFzZSBTdWNjZXNzZnVsXG4iKTsKKwkJCX0gZWxzZSBpZiAodGltZW91dCkgeworCQkJCXByX2luZm8oTENEICJFcmFzZSBUaW1lZCBPdXRcbiIpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisvLyBidXJuIHRoZSBmbGFzaAorCisJY2FzZSBGTEFTSF9CdXJuOnsKKworCQkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBidXJuX2FkZHI7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJdW5zaWduZWQgaW50IGksIGluZGV4OworCQkJdW5zaWduZWQgY2hhciAqcm9tOworCisKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBkaXNwbGF5OworCisJCQlpZiAoICFjYXBhYmxlKENBUF9TWVNfQURNSU4pICkgcmV0dXJuIC1FUEVSTTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkgICAgKCZkaXNwbGF5LCAoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsY2RfZGlzcGxheSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcm9tID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYygoMTI4KSwgR0ZQX0FUT01JQyk7CisJCQlpZiAocm9tID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgTENEICJrbWFsbG9jKCkgZmFpbGVkIGluICVzXG4iLAorCQkJCQkJX19GVU5DVElPTl9fKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKworCQkJcHJfaW5mbyhMQ0QgIlN0YXJ0aW5nIEZsYXNoIGJ1cm5cbiIpOworCQkJZm9yIChpID0gMDsgaSA8IEZMQVNIX1NJWkU7IGkgPSBpICsgMTI4KSB7CisKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCQkgICAgKHJvbSwgZGlzcGxheS5Sb21JbWFnZSArIGksIDEyOCkpIHsKKwkJCQkJa2ZyZWUocm9tKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWJ1cm5fYWRkciA9IGtGbGFzaEJhc2UgKyBpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZsY2RfbG9jaywgZmxhZ3MpOworCQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8ICgxMjgpOyBpbmRleCsrKSB7CisKKwkJCQkJV1JJVEVfRkxBU0goa0ZsYXNoX0FkZHIxLAorCQkJCQkJICAgIGtGbGFzaF9EYXRhMSk7CisJCQkJCVdSSVRFX0ZMQVNIKGtGbGFzaF9BZGRyMiwKKwkJCQkJCSAgICBrRmxhc2hfRGF0YTIpOworCQkJCQlXUklURV9GTEFTSChrRmxhc2hfQWRkcjEsCisJCQkJCQkgICAga0ZsYXNoX1Byb2cpOworCQkJCQkqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopYnVybl9hZGRyKSA9CisJCQkJCSAgKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIpIHJvbVtpbmRleF07CisKKwkJCQkJd2hpbGUgKCghZHFwb2xsIChidXJuX2FkZHIsCisJCQkJCQkodm9sYXRpbGUgdW5zaWduZWQgY2hhcikKKwkJCQkJCXJvbVtpbmRleF0pKSAmJgorCQkJCQkJKCF0aW1lb3V0KGJ1cm5fYWRkcikpKSB7IH0KKwkJCQkJYnVybl9hZGRyKys7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxjZF9sb2NrLCBmbGFncyk7CisJCQkJaWYgKCogKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopCisJCQkJCShidXJuX2FkZHIgLSAxKSkgPT0KKwkJCQkJKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIpCisJCQkJCXJvbVtpbmRleCAtIDFdKSB7CisJCQkJfSBlbHNlIGlmICh0aW1lb3V0KSB7CisJCQkJCXByX2luZm8oTENEICJGbGFzaCBidXJuIHRpbWVkIG91dFxuIik7CisJCQkJfQorCisKKwkJCX0KKwkJCWtmcmVlKHJvbSk7CisKKwkJCXByX2luZm8oTENEICJGbGFzaCBzdWNjZXNzZnVsbHkgYnVybmVkXG4iKTsKKworCQkJYnJlYWs7CisJCX0KKworLy8gIHJlYWQgdGhlIGZsYXNoIGFsbCBhdCBvbmNlCisKKwljYXNlIEZMQVNIX1JlYWQ6eworCisJCQl1bnNpZ25lZCBjaGFyICp1c2VyX2J5dGVzOworCQkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyByZWFkX2FkZHI7CisJCQl1bnNpZ25lZCBpbnQgaTsKKworCQkJdXNlcl9ieXRlcyA9CisJCQkgICAgJigoKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcpLT5Sb21JbWFnZVswXSk7CisKKwkJCWlmICghYWNjZXNzX29rCisJCQkgICAgKFZFUklGWV9XUklURSwgdXNlcl9ieXRlcywgRkxBU0hfU0laRSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXByX2luZm8oTENEICJSZWFkaW5nIEZsYXNoIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgRkxBU0hfU0laRTsgaSsrKSB7CisJCQkJdW5zaWduZWQgY2hhciB0bXBfYnl0ZTsKKwkJCQlyZWFkX2FkZHIgPSBrRmxhc2hCYXNlICsgaTsKKwkJCQl0bXBfYnl0ZSA9CisJCQkJICAgICooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikKKwkJCQkgICAgICByZWFkX2FkZHIpOworCQkJCWlmIChfX3B1dF91c2VyKHRtcF9ieXRlLCAmdXNlcl9ieXRlc1tpXSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCisKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgbGNkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKCFsY2RfcHJlc2VudCkKKwkJcmV0dXJuIC1FTlhJTzsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKiBPbmx5IFJFU0VUIG9yIE5FWFQgY291bnRzIGFzIGJ1dHRvbiBwcmVzc2VkICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGJ1dHRvbl9wcmVzc2VkKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBidXR0b25zID0gR1BJUmVhZDsKKworCWlmICgoYnV0dG9ucyA9PSBCVVRUT05fTmV4dCkgfHwgKGJ1dHRvbnMgPT0gQlVUVE9OX05leHRfQikKKwkgICAgfHwgKGJ1dHRvbnMgPT0gQlVUVE9OX1Jlc2V0X0IpKQorCQlyZXR1cm4gYnV0dG9uczsKKwlyZXR1cm4gMDsKK30KKworLyogTEVEIGRhZW1vbiBzaXRzIG9uIHRoaXMgYW5kIHdlIHdha2UgaGltIHVwIG9uY2UgYSBrZXkgaXMgcHJlc3NlZC4gKi8KKworc3RhdGljIGludCBsY2Rfd2FpdGVycyA9IDA7CisKK3N0YXRpYyBsb25nIGxjZF9yZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsCisJCSAgICAgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlsb25nIGJ1dHRvbnNfbm93OworCisJaWYgKGxjZF93YWl0ZXJzID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsY2Rfd2FpdGVycysrOworCXdoaWxlICgoKGJ1dHRvbnNfbm93ID0gKGxvbmcpIGJ1dHRvbl9wcmVzc2VkKCkpID09IDApICYmCisJICAgICAgICEoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpKSB7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDIwMDApOworCX0KKwlsY2Rfd2FpdGVycy0tOworCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCXJldHVybiBidXR0b25zX25vdzsKK30KKworLyoKKyAqCVRoZSB2YXJpb3VzIGZpbGUgb3BlcmF0aW9ucyB3ZSBzdXBwb3J0LgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxjZF9mb3BzID0geworCS5yZWFkID0gbGNkX3JlYWQsCisJLmlvY3RsID0gbGNkX2lvY3RsLAorCS5vcGVuID0gbGNkX29wZW4sCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgbGNkX2RldiA9IHsKKwlNSVNDX0RZTkFNSUNfTUlOT1IsCisJImxjZCIsCisJJmxjZF9mb3BzCit9OworCitzdGF0aWMgaW50IGxjZF9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCisJcHJfaW5mbygiJXNcbiIsIExDRF9EUklWRVIpOworCW1pc2NfcmVnaXN0ZXIoJmxjZF9kZXYpOworCisJLyogQ2hlY2sgcmVnaW9uPyBOYWFhaCEgSnVzdCBzbmFyZiBpdCB1cC4gKi8KKy8qCXJlcXVlc3RfcmVnaW9uKFJUQ19QT1JUKDApLCBSVENfSU9fRVhURU5ULCAibGNkIik7Ki8KKworCXVkZWxheSgxNTApOworCWRhdGEgPSBMQ0RSZWFkRGF0YTsKKwlpZiAoKGRhdGEgJiAweDAwMDAwMEZGKSA9PSAoMHgwMCkpIHsKKwkJbGNkX3ByZXNlbnQgPSAwOworCQlwcl9pbmZvKExDRCAiTENEIE5vdCBQcmVzZW50XG4iKTsKKwl9IGVsc2UgeworCQlsY2RfcHJlc2VudCA9IDE7CisJCVdSSVRFX0dBTChrR2FsX0RldkJhbmsyUFJlZywga0dhbF9EZXZCYW5rMkNmZyk7CisJCVdSSVRFX0dBTChrR2FsX0RldkJhbmszUFJlZywga0dhbF9EZXZCYW5rM0NmZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsY2RfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmbGNkX2Rldik7Cit9CisKKy8vCisvLyBGdW5jdGlvbjogZHFwb2xsCisvLworLy8gRGVzY3JpcHRpb246ICBQb2xscyB0aGUgZGF0YSBsaW5lcyB0byBzZWUgaWYgdGhlIGZsYXNoIGlzIGJ1c3kKKy8vCisvLyBJbjogYWRkcmVzcywgYnl0ZSBkYXRhCisvLworLy8gT3V0OiAwID0gYnVzeSwgMSA9IHdyaXRlIG9yIGVyYXNlIGNvbXBsZXRlCisvLworLy8KKworc3RhdGljIGludCBkcXBvbGwodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkcTc7CisKKwlkcTcgPSBkYXRhICYgMHg4MDsKKworCXJldHVybiAoKFJFQURfRkxBU0goYWRkcmVzcykgJiAweDgwKSA9PSBkcTcpOworfQorCisvLworLy8gRnVuY3Rpb246IHRpbWVvdXQKKy8vCisvLyBEZXNjcmlwdGlvbjogQ2hlY2tzIHRvIHNlZSBpZiBlcmFzZSBvciB3cml0ZSBoYXMgdGltZWQgb3V0CisvLyAgICAgICAgICAgICAgQnkgcG9sbGluZyBkcTUKKy8vCisvLyBJbjogYWRkcmVzcworLy8KKy8vCisvLyBPdXQ6IDAgPSBub3QgdGltZWQgb3V0LCAxID0gdGltZWQgb3V0CisKK3N0YXRpYyBpbnQgdGltZW91dCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJcmV0dXJuIChSRUFEX0ZMQVNIKGFkZHJlc3MpICYgMHgyMCkgPT0gMHgyMDsKK30KKworbW9kdWxlX2luaXQobGNkX2luaXQpOworbW9kdWxlX2V4aXQobGNkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbmRyZXcgQm9zZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2xjZC5oIGIvZHJpdmVycy9jaGFyL2xjZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OGE5NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbGNkLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBMRUQsIExDRCBhbmQgQnV0dG9uIHBhbmVsIGRyaXZlciBmb3IgQ29iYWx0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IGJ5IEFuZHJldyBCb3NlCisgKgorICogTGludXgga2VybmVsIHZlcnNpb24gaGlzdG9yeToKKyAqICAgICAgIE1hcmNoIDIwMDE6IFBvcnRlZCBmcm9tIDIuMC4zNCAgYnkgTGlhbSBEYXZpZXMKKyAqCisgKi8KKworLy8gZnVuY3Rpb24gaGVhZGVycworCitzdGF0aWMgaW50IGRxcG9sbCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nLCB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICk7CitzdGF0aWMgaW50IHRpbWVvdXQodm9sYXRpbGUgdW5zaWduZWQgbG9uZyk7CisKKyNkZWZpbmUgTENEX0NIQVJTX1BFUl9MSU5FIDQwCisjZGVmaW5lIEZMQVNIX1NJWkUgNTI0Mjg4CisjZGVmaW5lIE1BWF9JRExFX1RJTUUgMTIwCisKK3N0cnVjdCBsY2RfZGlzcGxheSB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgYnV0dG9uczsKKyAgICAgICAgaW50IHNpemUxOworICAgICAgICBpbnQgc2l6ZTI7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgbGluZTFbTENEX0NIQVJTX1BFUl9MSU5FXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBsaW5lMltMQ0RfQ0hBUlNfUEVSX0xJTkVdOworICAgICAgICB1bnNpZ25lZCBjaGFyIGN1cnNvcl9hZGRyZXNzOworICAgICAgICB1bnNpZ25lZCBjaGFyIGNoYXJhY3RlcjsKKyAgICAgICAgdW5zaWduZWQgY2hhciBsZWRzOworICAgICAgICB1bnNpZ25lZCBjaGFyICpSb21JbWFnZTsKK307CisKKworCisjZGVmaW5lIExDRF9EUklWRVIJIkNvYmFsdCBMQ0QgRHJpdmVyIHYyLjEwIgorCisjZGVmaW5lIExDRAkJImxjZDogIgorCisjZGVmaW5lIGtMQ0RfSVIJCTB4MEYwMDAwMDAKKyNkZWZpbmUga0xDRF9EUgkJMHgwRjAwMDAxMAorI2RlZmluZSBrR1BJCQkweDBEMDAwMDAwCisjZGVmaW5lIGtMRUQJCTB4MEMwMDAwMDAKKworI2RlZmluZSBrRERfUjAwICAgICAgICAgMHgwMAorI2RlZmluZSBrRERfUjAxICAgICAgICAgMHgyNworI2RlZmluZSBrRERfUjEwICAgICAgICAgMHg0MAorI2RlZmluZSBrRERfUjExICAgICAgICAgMHg2NworCisjZGVmaW5lIGtMQ0RfQWRkciAgICAgICAweDAwMDAwMDgwCisKKyNkZWZpbmUgTENEVGltZW91dFZhbHVlCTB4ZmZmCisKKworLy8gRmxhc2ggZGVmaW5pdGlvbnMgQU1EIDI5RjA0MAorI2RlZmluZSBrRmxhc2hCYXNlCTB4MEZDMDAwMDAKKworI2RlZmluZSBrRmxhc2hfQWRkcjEgICAgMHg1NTU1CisjZGVmaW5lIGtGbGFzaF9BZGRyMiAgICAweDJBQUEKKyNkZWZpbmUga0ZsYXNoX0RhdGExICAgIDB4QUEKKyNkZWZpbmUga0ZsYXNoX0RhdGEyICAgIDB4NTUKKyNkZWZpbmUga0ZsYXNoX1Byb2cgICAgIDB4QTAKKyNkZWZpbmUga0ZsYXNoX0VyYXNlMyAgIDB4ODAKKyNkZWZpbmUga0ZsYXNoX0VyYXNlNiAgIDB4MTAKKyNkZWZpbmUga0ZsYXNoX1JlYWQgICAgIDB4RjAKKworI2RlZmluZSBrRmxhc2hfSUQgICAgICAgMHg5MAorI2RlZmluZSBrRmxhc2hfVmVuQWRkciAgMHgwMAorI2RlZmluZSBrRmxhc2hfRGV2QWRkciAgMHgwMQorI2RlZmluZSBrRmxhc2hfVmVuSUQgICAgMHgwMQorI2RlZmluZSBrRmxhc2hfRGV2SUQgICAgMHhBNCAgICAvLyAyOUYwNDAKKy8vI2RlZmluZSBrRmxhc2hfRGV2SUQgIDB4QUQgICAgLy8gMjlGMDE2CisKKworLy8gTWFjcm9zCisKKyNkZWZpbmUgTENEV3JpdGVEYXRhKHgpCW91dGwoKHggPDwgMjQpLCBrTENEX0RSKQorI2RlZmluZSBMQ0RXcml0ZUluc3QoeCkJb3V0bCgoeCA8PCAyNCksIGtMQ0RfSVIpCisKKyNkZWZpbmUgTENEUmVhZERhdGEJKGlubChrTENEX0RSKSA+PiAyNCkKKyNkZWZpbmUgTENEUmVhZEluc3QJKGlubChrTENEX0lSKSA+PiAyNCkKKworI2RlZmluZSBHUElSZWFkCQkoaW5sKGtHUEkpID4+IDI0KQorCisjZGVmaW5lIExFRFNldCh4KQlvdXRiKChjaGFyKXgsIGtMRUQpCisKKyNkZWZpbmUgV1JJVEVfR0FMKHgseSkJb3V0bCh5LCAweDA0MDAwMDAwIHwgKHgpKQorI2RlZmluZSBCdXN5Q2hlY2soKQl3aGlsZSAoKExDRFJlYWRJbnN0ICYgMHg4MCkgPT0gMHg4MCkKKworI2RlZmluZSBXUklURV9GTEFTSCh4LHkpIG91dGIoKGNoYXIpeSwga0ZsYXNoQmFzZSB8ICh4KSkKKyNkZWZpbmUgUkVBRF9GTEFTSCh4KQkoaW5iKGtGbGFzaEJhc2UgfCAoeCkpKQorCisKKworLyoKKyAqIEZ1bmN0aW9uIGNvbW1hbmQgY29kZXMgZm9yIGlvX2N0bC4KKyAqLworI2RlZmluZSBMQ0RfT24JCQkxCisjZGVmaW5lIExDRF9PZmYJCQkyCisjZGVmaW5lIExDRF9DbGVhcgkJMworI2RlZmluZSBMQ0RfUmVzZXQJCTQKKyNkZWZpbmUgTENEX0N1cnNvcl9MZWZ0CQk1CisjZGVmaW5lIExDRF9DdXJzb3JfUmlnaHQJNgorI2RlZmluZSBMQ0RfRGlzcF9MZWZ0CQk3CisjZGVmaW5lIExDRF9EaXNwX1JpZ2h0CQk4CisjZGVmaW5lIExDRF9HZXRfQ3Vyc29yCQk5CisjZGVmaW5lIExDRF9TZXRfQ3Vyc29yCQkxMAorI2RlZmluZSBMQ0RfSG9tZQkJMTEKKyNkZWZpbmUgTENEX1JlYWQJCTEyCisjZGVmaW5lIExDRF9Xcml0ZQkJMTMKKyNkZWZpbmUgTENEX0N1cnNvcl9PZmYJCTE0CisjZGVmaW5lIExDRF9DdXJzb3JfT24JCTE1CisjZGVmaW5lIExDRF9HZXRfQ3Vyc29yX1BvcwkxNgorI2RlZmluZSBMQ0RfU2V0X0N1cnNvcl9Qb3MJMTcKKyNkZWZpbmUgTENEX0JsaW5rX09mZiAgICAgICAgICAgMTgKKworI2RlZmluZSBMRURfU2V0CQkJNDAKKyNkZWZpbmUgTEVEX0JpdF9TZXQJCTQxCisjZGVmaW5lIExFRF9CaXRfQ2xlYXIJCTQyCisKKworLy8gIEJ1dHRvbiBkZWZzCisjZGVmaW5lIEJVVFRPTl9SZWFkICAgICAgICAgICAgIDUwCisKKy8vICBGbGFzaCBjb21tYW5kIGNvZGVzCisjZGVmaW5lIEZMQVNIX0VyYXNlCQk2MAorI2RlZmluZSBGTEFTSF9CdXJuCQk2MQorI2RlZmluZSBGTEFTSF9SZWFkCQk2MgorCisKKy8vIEV0aGVybmV0IExJTksgY2hlY2sgaGFja2Fyb28KKyNkZWZpbmUgTElOS19DaGVjayAgICAgICAgICAgICAgOTAKKyNkZWZpbmUgTElOS19DaGVja18yCQk5MQorCisvLyAgQnV0dG9uIHBhdHRlcm5zICBfQiAtIHNpbmdsZSBsYXllciBsY2QgYm9hcmRzCisKKyNkZWZpbmUgQlVUVE9OX05PTkUgICAgICAgICAgICAgICAweDNGCisjZGVmaW5lIEJVVFRPTl9OT05FX0IgICAgICAgICAgICAgMHhGRQorCisjZGVmaW5lIEJVVFRPTl9MZWZ0ICAgICAgICAgICAgICAgMHgzQgorI2RlZmluZSBCVVRUT05fTGVmdF9CICAgICAgICAgICAgIDB4RkEKKworI2RlZmluZSBCVVRUT05fUmlnaHQgICAgICAgICAgICAgIDB4MzcKKyNkZWZpbmUgQlVUVE9OX1JpZ2h0X0IgICAgICAgICAgICAweERFCisKKyNkZWZpbmUgQlVUVE9OX1VwICAgICAgICAgICAgICAgICAweDJGCisjZGVmaW5lIEJVVFRPTl9VcF9CICAgICAgICAgICAgICAgMHhGNgorCisjZGVmaW5lIEJVVFRPTl9Eb3duICAgICAgICAgICAgICAgMHgxRgorI2RlZmluZSBCVVRUT05fRG93bl9CICAgICAgICAgICAgIDB4RUUKKworI2RlZmluZSBCVVRUT05fTmV4dCAgICAgICAgICAgICAgIDB4M0QKKyNkZWZpbmUgQlVUVE9OX05leHRfQiAgICAgICAgICAgICAweDdFCisKKyNkZWZpbmUgQlVUVE9OX0VudGVyICAgICAgICAgICAgICAweDNFCisjZGVmaW5lIEJVVFRPTl9FbnRlcl9CICAgICAgICAgICAgMHhCRQorCisjZGVmaW5lIEJVVFRPTl9SZXNldF9CICAgICAgICAgICAgMHhGQworCisKKy8vIGRlYm91bmNlIGNvbnN0YW50cworCisjZGVmaW5lIEJVVFRPTl9TRU5TRSAgICAgICAgICAgIDE2MDAwMAorI2RlZmluZSBCVVRUT05fREVCT1VOQ0UJCTUwMDAKKworCisvLyAgR2FsaWxlbyByZWdpc3RlciBzdHVmZgorCisjZGVmaW5lIGtHYWxfRGV2QmFuazJDZmcgICAgICAgIDB4MTQ2NkRCMzMKKyNkZWZpbmUga0dhbF9EZXZCYW5rMlBSZWcgICAgICAgMHg0NjQKKyNkZWZpbmUga0dhbF9EZXZCYW5rM0NmZyAgICAgICAgMHgxNDZGREZGQgorI2RlZmluZSBrR2FsX0RldkJhbmszUFJlZyAgICAgICAweDQ2OAorCisvLyBOZXR3b3JrCisKKyNkZWZpbmUga0lQQUREUgkJCTEKKyNkZWZpbmUga05FVE1BU0sJCTIKKyNkZWZpbmUga0dBVEVXQVkJCTMKKyNkZWZpbmUga0ROUwkJCTQKKworI2RlZmluZSBrQ2xhc3NBCQkJNQorI2RlZmluZSBrQ2xhc3NCCQkJNgorI2RlZmluZSBrQ2xhc3NDCQkJNworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbHAuYyBiL2RyaXZlcnMvY2hhci9scC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZWU5NDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbHAuYwpAQCAtMCwwICsxLDk5NSBAQAorLyoKKyAqIEdlbmVyaWMgcGFyYWxsZWwgcHJpbnRlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIgYnkgSmltIFdlaWdhbmQgYW5kIExpbnVzIFRvcnZhbGRzCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MyBieSBNaWNoYWVsIEsuIEpvaG5zb24KKyAqIC0gVGhhbmtzIG11Y2ggdG8gR3VudGVyIFdpbmRhdSBmb3IgcG9pbnRpbmcgb3V0IHRvIG1lIHdoZXJlIHRoZSBlcnJvcgorICogICBjaGVja2luZyBvdWdodCB0byBiZS4KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBOaWdlbCBHYW1ibGUgKGFkZGVkIGludGVycnVwdCBjb2RlKQorICogQ29weXJpZ2h0IChDKSAxOTk0IGJ5IEFsYW4gQ294IChNb2R1bGFyaXNlZCBpdCkKKyAqIExQQ0FSRUZVTCwgTFBBQk9SVCwgTFBHRVRTVEFUVVMgYWRkZWQgYnkgQ2hyaXMgTWV0Y2FsZiwgbWV0Y2FsZkBsY3MubWl0LmVkdQorICogU3RhdGlzdGljcyBhbmQgc3VwcG9ydCBmb3Igc2xvdyBwcmludGVycyBieSBSb2IgSmFuc3Nlbiwgcm9iQGtub3dhcmUubmwKKyAqICJscD0iIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFkZGVkIGJ5IEdyYW50IEd1ZW50aGVyLCBncmFudEB0b3JxdWUubmV0CisgKiBscF9yZWFkIChTdGF0dXMgcmVhZGJhY2spIHN1cHBvcnQgYWRkZWQgYnkgQ2Fyc3RlbiBHcm9zcywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fyc3RlbkBzb2wud29obmhlaW0udW5pLXVsbS5kZQorICogU3VwcG9ydCBmb3IgcGFycG9ydCBieSBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKiBQYXJwb3J0IHNoYXJpbmcgaGFja2luZyBieSBBbmRyZWEgQXJjYW5nZWxpCisgKiBGaXhlZCBrZXJuZWxfKHRvL2Zyb20pX3VzZXIgbWVtb3J5IGNvcHkgdG8gY2hlY2sgZm9yIGVycm9ycworICogCQkJCWJ5IFJpY2NhcmRvIEZhY2NoZXR0aSA8Zml6YmFuQHRpbi5pdD4KKyAqIDIyLUpBTi0xOTk4ICBBZGRlZCBzdXBwb3J0IGZvciBkZXZmcyAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgKiBSZWRlc2lnbmVkIGludGVycnVwdCBoYW5kbGluZyBmb3IgaGFuZGxlIHByaW50ZXJzIHdpdGggYnVnZ3kgaGFuZHNoYWtlCisgKgkJCQlieSBBbmRyZWEgQXJjYW5nZWxpLCAxMSBNYXkgMTk5OAorICogRnVsbCBlZmZpY2llbnQgaGFuZGxpbmcgb2YgcHJpbnRlciB3aXRoIGJ1Z2d5IGlycSBoYW5kc2hha2UgKG5vdyBJIGhhdmUKKyAqIHVuZGVyc3Rvb2QgdGhlIG1lYW5pbmcgb2YgdGhlIHN0cmFuZ2UgaGFuZHNoYWtlKS4gVGhpcyBpcyBkb25lIHNlbmRpbmcgbmV3CisgKiBjaGFyYWN0ZXJzIGlmIHRoZSBpbnRlcnJ1cHQgaXMganVzdCBoYXBwZW5lZCwgZXZlbiBpZiB0aGUgcHJpbnRlciBzYXkgdG8KKyAqIGJlIHN0aWxsIEJVU1kuIFRoaXMgaXMgbmVlZGVkIGF0IGxlYXN0IHdpdGggRXBzb24gU3R5bHVzIENvbG9yLiBUbyBlbmFibGUKKyAqIHRoZSBuZXcgVFJVU1RfSVJRIG1vZGUgcmVhZCB0aGUgYExQIE9QVElNSVpBVElPTicgc2VjdGlvbiBiZWxvdy4uLgorICogRml4ZWQgdGhlIGlycSBvbiB0aGUgcmlzaW5nIGVkZ2Ugb2YgdGhlIHN0cm9iZSBjYXNlLgorICogT2Jzb2xldGVkIHRoZSBDQVJFRlVMIGZsYWcgc2luY2UgYSBwcmludGVyIHRoYXQgZG9lc24nIHQgd29yayB3aXRoCisgKiBDQVJFRlVMIHdpbGwgYmxvY2sgYSBiaXQgYWZ0ZXIgaW4gbHBfY2hlY2tfc3RhdHVzKCkuCisgKgkJCQlBbmRyZWEgQXJjYW5nZWxpLCAxNSBPY3QgMTk5OAorICogT2Jzb2xldGVkIGFuZCByZW1vdmVkIGFsbCB0aGUgbG93bGV2ZWwgc3R1ZmYgaW1wbGVtZW50ZWQgaW4gdGhlIGxhc3QKKyAqIG1vbnRoIHRvIHVzZSB0aGUgSUVFRTEyODQgZnVuY3Rpb25zICh0aGF0IGhhbmRsZSB0aGUgX25ld18gY29tcGF0aWJpbHR5CisgKiBtb2RlIGZpbmUpLgorICovCisKKy8qIFRoaXMgZHJpdmVyIHNob3VsZCwgaW4gdGhlb3J5LCB3b3JrIHdpdGggYW55IHBhcmFsbGVsIHBvcnQgdGhhdCBoYXMgYW4KKyAqIGFwcHJvcHJpYXRlIGxvdy1sZXZlbCBkcml2ZXI7IGFsbCBJL08gaXMgZG9uZSB0aHJvdWdoIHRoZSBwYXJwb3J0CisgKiBhYnN0cmFjdGlvbiBsYXllci4KKyAqCisgKiBJZiB0aGlzIGRyaXZlciBpcyBidWlsdCBpbnRvIHRoZSBrZXJuZWwsIHlvdSBjYW4gY29uZmlndXJlIGl0IHVzaW5nIHRoZQorICoga2VybmVsIGNvbW1hbmQtbGluZS4gIEZvciBleGFtcGxlOgorICoKKyAqCWxwPXBhcnBvcnQxLG5vbmUscGFycG9ydDIJKGJpbmQgbHAwIHRvIHBhcnBvcnQxLCBkaXNhYmxlIGxwMSBhbmQKKyAqCQkJCQkgYmluZCBscDIgdG8gcGFycG9ydDIpCisgKgorICoJbHA9YXV0bwkJCQkoYXNzaWduIGxwIGRldmljZXMgdG8gYWxsIHBvcnRzIHRoYXQKKyAqCQkJCSAgICAgICAgIGhhdmUgcHJpbnRlcnMgYXR0YWNoZWQsIGFzIGRldGVybWluZWQKKyAqCQkJCQkgYnkgdGhlIElFRUUtMTI4NCBhdXRvcHJvYmUpCisgKiAKKyAqCWxwPXJlc2V0CQkJKHJlc2V0IHRoZSBwcmludGVyIGR1cmluZyAKKyAqCQkJCQkgaW5pdGlhbGlzYXRpb24pCisgKgorICoJbHA9b2ZmCQkJCShkaXNhYmxlIHRoZSBwcmludGVyIGRyaXZlciBlbnRpcmVseSkKKyAqCisgKiBJZiB0aGUgZHJpdmVyIGlzIGxvYWRlZCBhcyBhIG1vZHVsZSwgc2ltaWxhciBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZQorICogdXNpbmcgbW9kdWxlIHBhcmFtZXRlcnMuICBUaGUgZXF1aXZhbGVudCBvZiB0aGUgYWJvdmUgY29tbWFuZHMgd291bGQgYmU6CisgKgorICoJIyBpbnNtb2QgbHAubyBwYXJwb3J0PTEsbm9uZSwyCisgKgorICoJIyBpbnNtb2QgbHAubyBwYXJwb3J0PWF1dG8KKyAqCisgKgkjIGluc21vZCBscC5vIHJlc2V0PTEKKyAqLworCisvKiBDT01QQVRJQklMSVRZIFdJVEggT0xEIEtFUk5FTFMKKyAqCisgKiBVbmRlciBMaW51eCAyLjAgYW5kIHByZXZpb3VzIHZlcnNpb25zLCBscCBkZXZpY2VzIHdlcmUgYm91bmQgdG8gcG9ydHMgYXQKKyAqIHBhcnRpY3VsYXIgSS9PIGFkZHJlc3NlcywgYXMgZm9sbG93czoKKyAqCisgKglscDAJCTB4M2JjCisgKglscDEJCTB4Mzc4CisgKglscDIJCTB4Mjc4CisgKgorICogVGhlIG5ldyBkcml2ZXIsIGJ5IGRlZmF1bHQsIGJpbmRzIGxwIGRldmljZXMgdG8gcGFycG9ydCBkZXZpY2VzIGFzIGl0CisgKiBmaW5kcyB0aGVtLiAgVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBvbmx5IGhhdmUgb25lIHBvcnQsIGl0IHdpbGwgYmUgYm91bmQKKyAqIHRvIGxwMCByZWdhcmRsZXNzIG9mIGl0cyBJL08gYWRkcmVzcy4gIElmIHlvdSBuZWVkIHRoZSBvbGQgYmVoYXZpb3VyLCB5b3UKKyAqIGNhbiBmb3JjZSBpdCB1c2luZyB0aGUgcGFyYW1ldGVycyBkZXNjcmliZWQgYWJvdmUuCisgKi8KKworLyoKKyAqIFRoZSBuZXcgaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUgdGFrZSBjYXJlIG9mIHRoZSBidWdneSBoYW5kc2hha2UKKyAqIG9mIHNvbWUgSFAgYW5kIEVwc29uIHByaW50ZXI6CisgKiBfX18KKyAqIEFDSyAgICBfX19fX19fX19fX19fX18gICAgX19fX19fX19fX18KKyAqICAgICAgICAgICAgICAgICAgICAgICB8X198CisgKiBfX19fCisgKiBCVVNZICAgX19fX19fX19fICAgICAgICAgICAgICBfX19fX19fCisgKiAgICAgICAgICAgICAgICAgfF9fX19fX19fX19fX3wKKyAqCisgKiBJIGRpc2NvdmVyZWQgdGhpcyB1c2luZyB0aGUgcHJpbnRlciBzY2FubmVyIHRoYXQgeW91IGNhbiBmaW5kIGF0OgorICoKKyAqCWZ0cDovL2UtbWluZC5jb20vcHViL2xpbnV4L3BzY2FuLworICoKKyAqCQkJCQkxMSBNYXkgOTgsIEFuZHJlYSBBcmNhbmdlbGkKKyAqCisgKiBNeSBwcmludGVyIHNjYW5uZXIgcnVuIG9uIGFuIEVwc29uIFN0eWx1cyBDb2xvciBzaG93IHRoYXQgc3VjaCBwcmludGVyCisgKiBnZW5lcmF0ZXMgdGhlIGlycSBvbiB0aGUgX3Jpc2luZ18gZWRnZSBvZiB0aGUgU1RST0JFLiBOb3cgbHAgaGFuZGxlCisgKiB0aGlzIGNhc2UgZmluZSB0b28uCisgKgorICoJCQkJCTE1IE9jdCAxOTk4LCBBbmRyZWEgQXJjYW5nZWxpCisgKgorICogVGhlIHNvIGNhbGxlZCBgYnVnZ3knIGhhbmRzaGFrZSBpcyByZWFsbHkgdGhlIHdlbGwgZG9jdW1lbnRlZAorICogY29tcGF0aWJpbGl0eSBtb2RlIElFRUUxMjg0IGhhbmRzaGFrZS4gVGhleSBjaGFuZ2VkIHRoZSB3ZWxsIGtub3duCisgKiBDZW50cm9uaWNzIGhhbmRzaGFrZSBhY2tpbmcgaW4gdGhlIG1pZGRsZSBvZiBidXN5IGV4cGVjdGluZyB0byBub3QKKyAqIGJyZWFrIGRyaXZlcnMgb3IgbGVnYWN5IGFwcGxpY2F0aW9uLCB3aGlsZSB0aGV5IGJyb2tlbiBsaW51eCBscAorICogdW50aWwgSSBmaXhlZCBpdCByZXZlcnNlIGVuZ2luZWVyaW5nIHRoZSBwcm90b2NvbCBieSBoYW5kIHNvbWUKKyAqIG1vbnRoIGFnby4uLgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0IERlYyAxOTk4LCBBbmRyZWEgQXJjYW5nZWxpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIGJ5IFRpbSBXYXVnaCAoYWRkZWQgTFBTRVRUSU1FT1VUIGlvY3RsKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisjdW5kZWYgTFBfU1RBVFMKKyNpbmNsdWRlIDxsaW51eC9scC5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKiBpZiB5b3UgaGF2ZSBtb3JlIHRoYW4gOCBwcmludGVycywgcmVtZW1iZXIgdG8gaW5jcmVhc2UgTFBfTk8gKi8KKyNkZWZpbmUgTFBfTk8gOAorCisvKiBST1VORF9VUCBtYWNybyBmcm9tIGZzL3NlbGVjdC5jICovCisjZGVmaW5lIFJPVU5EX1VQKHgseSkgKCgoeCkrKHkpLTEpLyh5KSkKKworc3RhdGljIHN0cnVjdCBscF9zdHJ1Y3QgbHBfdGFibGVbTFBfTk9dOworCitzdGF0aWMgdW5zaWduZWQgaW50IGxwX2NvdW50ID0gMDsKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICpscF9jbGFzczsKKworI2lmZGVmIENPTkZJR19MUF9DT05TT0xFCitzdGF0aWMgc3RydWN0IHBhcnBvcnQgKmNvbnNvbGVfcmVnaXN0ZXJlZDsgLy8gaW5pdGlhbGx5IE5VTEwKKyNlbmRpZiAvKiBDT05GSUdfTFBfQ09OU09MRSAqLworCisjdW5kZWYgTFBfREVCVUcKKworLyogQml0cyB1c2VkIHRvIG1hbmFnZSBjbGFpbWluZyB0aGUgcGFycG9ydCBkZXZpY2UgKi8KKyNkZWZpbmUgTFBfUFJFRU1QVF9SRVFVRVNUIDEKKyNkZWZpbmUgTFBfUEFSUE9SVF9DTEFJTUVEIDIKKworLyogLS0tIGxvdy1sZXZlbCBwb3J0IGFjY2VzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIHJfZHRyKHgpCShwYXJwb3J0X3JlYWRfZGF0YShscF90YWJsZVsoeCldLmRldi0+cG9ydCkpCisjZGVmaW5lIHJfc3RyKHgpCShwYXJwb3J0X3JlYWRfc3RhdHVzKGxwX3RhYmxlWyh4KV0uZGV2LT5wb3J0KSkKKyNkZWZpbmUgd19jdHIoeCx5KQlkbyB7IHBhcnBvcnRfd3JpdGVfY29udHJvbChscF90YWJsZVsoeCldLmRldi0+cG9ydCwgKHkpKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgd19kdHIoeCx5KQlkbyB7IHBhcnBvcnRfd3JpdGVfZGF0YShscF90YWJsZVsoeCldLmRldi0+cG9ydCwgKHkpKTsgfSB3aGlsZSAoMCkKKworLyogQ2xhaW0gdGhlIHBhcnBvcnQgb3IgYmxvY2sgdHJ5aW5nIHVubGVzcyB3ZSd2ZSBhbHJlYWR5IGNsYWltZWQgaXQgKi8KK3N0YXRpYyB2b2lkIGxwX2NsYWltX3BhcnBvcnRfb3JfYmxvY2soc3RydWN0IGxwX3N0cnVjdCAqdGhpc19scCkKK3sKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTFBfUEFSUE9SVF9DTEFJTUVELCAmdGhpc19scC0+Yml0cykpIHsKKwkJcGFycG9ydF9jbGFpbV9vcl9ibG9jayAodGhpc19scC0+ZGV2KTsKKwl9Cit9CisKKy8qIENsYWltIHRoZSBwYXJwb3J0IG9yIGJsb2NrIHRyeWluZyB1bmxlc3Mgd2UndmUgYWxyZWFkeSBjbGFpbWVkIGl0ICovCitzdGF0aWMgdm9pZCBscF9yZWxlYXNlX3BhcnBvcnQoc3RydWN0IGxwX3N0cnVjdCAqdGhpc19scCkKK3sKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KExQX1BBUlBPUlRfQ0xBSU1FRCwgJnRoaXNfbHAtPmJpdHMpKSB7CisJCXBhcnBvcnRfcmVsZWFzZSAodGhpc19scC0+ZGV2KTsKKwl9Cit9CisKKworCitzdGF0aWMgaW50IGxwX3ByZWVtcHQodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBscF9zdHJ1Y3QgKnRoaXNfbHAgPSAoc3RydWN0IGxwX3N0cnVjdCAqKWhhbmRsZTsKKwlzZXRfYml0KExQX1BSRUVNUFRfUkVRVUVTVCwgJnRoaXNfbHAtPmJpdHMpOworCXJldHVybiAoMSk7Cit9CisKKworLyogCisgKiBUcnkgdG8gbmVnb3RpYXRlIHRvIGEgbmV3IG1vZGU7IGlmIHVuc3VjY2Vzc2Z1bCBuZWdvdGlhdGUgdG8KKyAqIGNvbXBhdGliaWxpdHkgbW9kZS4gIFJldHVybiB0aGUgbW9kZSB3ZSBlbmRlZCB1cCBpbi4KKyAqLworc3RhdGljIGludCBscF9uZWdvdGlhdGUoc3RydWN0IHBhcnBvcnQgKiBwb3J0LCBpbnQgbW9kZSkKK3sKKwlpZiAocGFycG9ydF9uZWdvdGlhdGUgKHBvcnQsIG1vZGUpICE9IDApIHsKKwkJbW9kZSA9IElFRUUxMjg0X01PREVfQ09NUEFUOworCQlwYXJwb3J0X25lZ290aWF0ZSAocG9ydCwgbW9kZSk7CisJfQorCisJcmV0dXJuIChtb2RlKTsKK30KKworc3RhdGljIGludCBscF9yZXNldChpbnQgbWlub3IpCit7CisJaW50IHJldHZhbDsKKwlscF9jbGFpbV9wYXJwb3J0X29yX2Jsb2NrICgmbHBfdGFibGVbbWlub3JdKTsKKwl3X2N0cihtaW5vciwgTFBfUFNFTEVDUCk7CisJdWRlbGF5IChMUF9ERUxBWSk7CisJd19jdHIobWlub3IsIExQX1BTRUxFQ1AgfCBMUF9QSU5JVFApOworCXJldHZhbCA9IHJfc3RyKG1pbm9yKTsKKwlscF9yZWxlYXNlX3BhcnBvcnQgKCZscF90YWJsZVttaW5vcl0pOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGxwX2Vycm9yIChpbnQgbWlub3IpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisJaW50IHBvbGxpbmc7CisKKwlpZiAoTFBfRihtaW5vcikgJiBMUF9BQk9SVCkKKwkJcmV0dXJuOworCisJcG9sbGluZyA9IGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQtPmlycSA9PSBQQVJQT1JUX0lSUV9OT05FOworCWlmIChwb2xsaW5nKSBscF9yZWxlYXNlX3BhcnBvcnQgKCZscF90YWJsZVttaW5vcl0pOworCXByZXBhcmVfdG9fd2FpdCgmbHBfdGFibGVbbWlub3JdLndhaXRxLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KExQX1RJTUVPVVRfUE9MTEVEKTsKKwlmaW5pc2hfd2FpdCgmbHBfdGFibGVbbWlub3JdLndhaXRxLCAmd2FpdCk7CisJaWYgKHBvbGxpbmcpIGxwX2NsYWltX3BhcnBvcnRfb3JfYmxvY2sgKCZscF90YWJsZVttaW5vcl0pOworCWVsc2UgcGFycG9ydF95aWVsZF9ibG9ja2luZyAobHBfdGFibGVbbWlub3JdLmRldik7Cit9CisKK3N0YXRpYyBpbnQgbHBfY2hlY2tfc3RhdHVzKGludCBtaW5vcikKK3sKKwlpbnQgZXJyb3IgPSAwOworCXVuc2lnbmVkIGludCBsYXN0ID0gbHBfdGFibGVbbWlub3JdLmxhc3RfZXJyb3I7CisJdW5zaWduZWQgY2hhciBzdGF0dXMgPSByX3N0cihtaW5vcik7CisJaWYgKChzdGF0dXMgJiBMUF9QRVJST1JQKSAmJiAhKExQX0YobWlub3IpICYgTFBfQ0FSRUZVTCkpCisJCS8qIE5vIGVycm9yLiAqLworCQlsYXN0ID0gMDsKKwllbHNlIGlmICgoc3RhdHVzICYgTFBfUE9VVFBBKSkgeworCQlpZiAobGFzdCAhPSBMUF9QT1VUUEEpIHsKKwkJCWxhc3QgPSBMUF9QT1VUUEE7CisJCQlwcmludGsoS0VSTl9JTkZPICJscCVkIG91dCBvZiBwYXBlclxuIiwgbWlub3IpOworCQl9CisJCWVycm9yID0gLUVOT1NQQzsKKwl9IGVsc2UgaWYgKCEoc3RhdHVzICYgTFBfUFNFTEVDRCkpIHsKKwkJaWYgKGxhc3QgIT0gTFBfUFNFTEVDRCkgeworCQkJbGFzdCA9IExQX1BTRUxFQ0Q7CisJCQlwcmludGsoS0VSTl9JTkZPICJscCVkIG9mZi1saW5lXG4iLCBtaW5vcik7CisJCX0KKwkJZXJyb3IgPSAtRUlPOworCX0gZWxzZSBpZiAoIShzdGF0dXMgJiBMUF9QRVJST1JQKSkgeworCQlpZiAobGFzdCAhPSBMUF9QRVJST1JQKSB7CisJCQlsYXN0ID0gTFBfUEVSUk9SUDsKKwkJCXByaW50ayhLRVJOX0lORk8gImxwJWQgb24gZmlyZVxuIiwgbWlub3IpOworCQl9CisJCWVycm9yID0gLUVJTzsKKwl9IGVsc2UgeworCQlsYXN0ID0gMDsgLyogQ29tZSBoZXJlIGlmIExQX0NBUkVGVUwgaXMgc2V0IGFuZCBubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMgYXJlIHJlcG9ydGVkLiAqLworCX0KKworCWxwX3RhYmxlW21pbm9yXS5sYXN0X2Vycm9yID0gbGFzdDsKKworCWlmIChsYXN0ICE9IDApCisJCWxwX2Vycm9yKG1pbm9yKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBscF93YWl0X3JlYWR5KGludCBtaW5vciwgaW50IG5vbmJsb2NrKQoreworCWludCBlcnJvciA9IDA7CisKKwkvKiBJZiB3ZSdyZSBub3QgaW4gY29tcGF0aWJpbGl0eSBtb2RlLCB3ZSdyZSByZWFkeSBub3chICovCisJaWYgKGxwX3RhYmxlW21pbm9yXS5jdXJyZW50X21vZGUgIT0gSUVFRTEyODRfTU9ERV9DT01QQVQpIHsKKwkgIHJldHVybiAoMCk7CisJfQorCisJZG8geworCQllcnJvciA9IGxwX2NoZWNrX3N0YXR1cyAobWlub3IpOworCQlpZiAoZXJyb3IgJiYgKG5vbmJsb2NrIHx8IChMUF9GKG1pbm9yKSAmIExQX0FCT1JUKSkpCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJZXJyb3IgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKGVycm9yKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxwX3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCisJCSAgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9IGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQ7CisJY2hhciAqa2J1ZiA9IGxwX3RhYmxlW21pbm9yXS5scF9idWZmZXI7CisJc3NpemVfdCByZXR2ID0gMDsKKwlzc2l6ZV90IHdyaXR0ZW47CisJc2l6ZV90IGNvcHlfc2l6ZSA9IGNvdW50OworCWludCBub25ibG9jayA9ICgoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8CisJCQkoTFBfRihtaW5vcikgJiBMUF9BQk9SVCkpOworCisjaWZkZWYgTFBfU1RBVFMKKwlpZiAoamlmZmllcy1scF90YWJsZVttaW5vcl0ubGFzdGNhbGwgPiBMUF9USU1FKG1pbm9yKSkKKwkJbHBfdGFibGVbbWlub3JdLnJ1bmNoYXJzID0gMDsKKworCWxwX3RhYmxlW21pbm9yXS5sYXN0Y2FsbCA9IGppZmZpZXM7CisjZW5kaWYKKworCS8qIE5lZWQgdG8gY29weSB0aGUgZGF0YSBmcm9tIHVzZXItc3BhY2UuICovCisJaWYgKGNvcHlfc2l6ZSA+IExQX0JVRkZFUl9TSVpFKQorCQljb3B5X3NpemUgPSBMUF9CVUZGRVJfU0laRTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZscF90YWJsZVttaW5vcl0ucG9ydF9tdXRleCkpCisJCXJldHVybiAtRUlOVFI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIgKGtidWYsIGJ1ZiwgY29weV9zaXplKSkgeworCQlyZXR2ID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworIAkvKiBDbGFpbSBQYXJwb3J0IG9yIHNsZWVwIHVudGlsIGl0IGJlY29tZXMgYXZhaWxhYmxlCisgCSAqLworCWxwX2NsYWltX3BhcnBvcnRfb3JfYmxvY2sgKCZscF90YWJsZVttaW5vcl0pOworCS8qIEdvIHRvIHRoZSBwcm9wZXIgbW9kZS4gKi8KKwlscF90YWJsZVttaW5vcl0uY3VycmVudF9tb2RlID0gbHBfbmVnb3RpYXRlIChwb3J0LCAKKwkJCQkJCSAgICAgbHBfdGFibGVbbWlub3JdLmJlc3RfbW9kZSk7CisKKwlwYXJwb3J0X3NldF90aW1lb3V0IChscF90YWJsZVttaW5vcl0uZGV2LAorCQkJICAgICAobm9uYmxvY2sgPyBQQVJQT1JUX0lOQUNUSVZJVFlfT19OT05CTE9DSworCQkJICAgICAgOiBscF90YWJsZVttaW5vcl0udGltZW91dCkpOworCisJaWYgKChyZXR2ID0gbHBfd2FpdF9yZWFkeSAobWlub3IsIG5vbmJsb2NrKSkgPT0gMCkKKwlkbyB7CisJCS8qIFdyaXRlIHRoZSBkYXRhLiAqLworCQl3cml0dGVuID0gcGFycG9ydF93cml0ZSAocG9ydCwga2J1ZiwgY29weV9zaXplKTsKKwkJaWYgKHdyaXR0ZW4gPiAwKSB7CisJCQljb3B5X3NpemUgLT0gd3JpdHRlbjsKKwkJCWNvdW50IC09IHdyaXR0ZW47CisJCQlidWYgICs9IHdyaXR0ZW47CisJCQlyZXR2ICs9IHdyaXR0ZW47CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKSB7CisJCQlpZiAocmV0diA9PSAwKQorCQkJCXJldHYgPSAtRUlOVFI7CisKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNvcHlfc2l6ZSA+IDApIHsKKwkJCS8qIGluY29tcGxldGUgd3JpdGUgLT4gY2hlY2sgZXJyb3IgISAqLworCQkJaW50IGVycm9yOworCisJCQlwYXJwb3J0X25lZ290aWF0ZSAobHBfdGFibGVbbWlub3JdLmRldi0+cG9ydCwgCisJCQkJCSAgIElFRUUxMjg0X01PREVfQ09NUEFUKTsKKwkJCWxwX3RhYmxlW21pbm9yXS5jdXJyZW50X21vZGUgPSBJRUVFMTI4NF9NT0RFX0NPTVBBVDsKKworCQkJZXJyb3IgPSBscF93YWl0X3JlYWR5IChtaW5vciwgbm9uYmxvY2spOworCisJCQlpZiAoZXJyb3IpIHsKKwkJCQlpZiAocmV0diA9PSAwKQorCQkJCQlyZXR2ID0gZXJyb3I7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKG5vbmJsb2NrKSB7CisJCQkJaWYgKHJldHYgPT0gMCkKKwkJCQkJcmV0diA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBhcnBvcnRfeWllbGRfYmxvY2tpbmcgKGxwX3RhYmxlW21pbm9yXS5kZXYpOworCQkJbHBfdGFibGVbbWlub3JdLmN1cnJlbnRfbW9kZSAKKwkJCSAgPSBscF9uZWdvdGlhdGUgKHBvcnQsIAorCQkJCQkgIGxwX3RhYmxlW21pbm9yXS5iZXN0X21vZGUpOworCisJCX0gZWxzZSBpZiAobmVlZF9yZXNjaGVkKCkpCisJCQlzY2hlZHVsZSAoKTsKKworCQlpZiAoY291bnQpIHsKKwkJCWNvcHlfc2l6ZSA9IGNvdW50OworCQkJaWYgKGNvcHlfc2l6ZSA+IExQX0JVRkZFUl9TSVpFKQorCQkJCWNvcHlfc2l6ZSA9IExQX0JVRkZFUl9TSVpFOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoa2J1ZiwgYnVmLCBjb3B5X3NpemUpKSB7CisJCQkJaWYgKHJldHYgPT0gMCkKKwkJCQkJcmV0diA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0JCisJfSB3aGlsZSAoY291bnQgPiAwKTsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTFBfUFJFRU1QVF9SRVFVRVNULCAKKwkJCSAgICAgICAmbHBfdGFibGVbbWlub3JdLmJpdHMpKSB7CisJCXByaW50ayhLRVJOX0lORk8gImxwJWQgcmVsZWFzaW5nIHBhcnBvcnRcbiIsIG1pbm9yKTsKKwkJcGFycG9ydF9uZWdvdGlhdGUgKGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQsIAorCQkJCSAgIElFRUUxMjg0X01PREVfQ09NUEFUKTsKKwkJbHBfdGFibGVbbWlub3JdLmN1cnJlbnRfbW9kZSA9IElFRUUxMjg0X01PREVfQ09NUEFUOworCQlscF9yZWxlYXNlX3BhcnBvcnQgKCZscF90YWJsZVttaW5vcl0pOworCX0KK291dF91bmxvY2s6CisJdXAgKCZscF90YWJsZVttaW5vcl0ucG9ydF9tdXRleCk7CisKKyAJcmV0dXJuIHJldHY7Cit9CisKKyNpZmRlZiBDT05GSUdfUEFSUE9SVF8xMjg0CisKKy8qIFN0YXR1cyByZWFkYmFjayBjb25mb3JtaW5nIHRvIGllZWUxMjg0ICovCitzdGF0aWMgc3NpemVfdCBscF9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwl1bnNpZ25lZCBpbnQgbWlub3I9aW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9IGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQ7CisJc3NpemVfdCByZXR2YWwgPSAwOworCWNoYXIgKmtidWYgPSBscF90YWJsZVttaW5vcl0ubHBfYnVmZmVyOworCWludCBub25ibG9jayA9ICgoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8CisJCQkoTFBfRihtaW5vcikgJiBMUF9BQk9SVCkpOworCisJaWYgKGNvdW50ID4gTFBfQlVGRkVSX1NJWkUpCisJCWNvdW50ID0gTFBfQlVGRkVSX1NJWkU7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmbHBfdGFibGVbbWlub3JdLnBvcnRfbXV0ZXgpKQorCQlyZXR1cm4gLUVJTlRSOworCisJbHBfY2xhaW1fcGFycG9ydF9vcl9ibG9jayAoJmxwX3RhYmxlW21pbm9yXSk7CisKKwlwYXJwb3J0X3NldF90aW1lb3V0IChscF90YWJsZVttaW5vcl0uZGV2LAorCQkJICAgICAobm9uYmxvY2sgPyBQQVJQT1JUX0lOQUNUSVZJVFlfT19OT05CTE9DSworCQkJICAgICAgOiBscF90YWJsZVttaW5vcl0udGltZW91dCkpOworCisJcGFycG9ydF9uZWdvdGlhdGUgKGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQsIElFRUUxMjg0X01PREVfQ09NUEFUKTsKKwlpZiAocGFycG9ydF9uZWdvdGlhdGUgKGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQsCisJCQkgICAgICAgSUVFRTEyODRfTU9ERV9OSUJCTEUpKSB7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlIChyZXR2YWwgPT0gMCkgeworCQlyZXR2YWwgPSBwYXJwb3J0X3JlYWQgKHBvcnQsIGtidWYsIGNvdW50KTsKKworCQlpZiAocmV0dmFsID4gMCkKKwkJCWJyZWFrOworCisJCWlmIChub25ibG9jaykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogV2FpdCBmb3IgZGF0YS4gKi8KKworCQlpZiAobHBfdGFibGVbbWlub3JdLmRldi0+cG9ydC0+aXJxID09IFBBUlBPUlRfSVJRX05PTkUpIHsKKwkJCXBhcnBvcnRfbmVnb3RpYXRlIChscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LAorCQkJCQkgICBJRUVFMTI4NF9NT0RFX0NPTVBBVCk7CisJCQlscF9lcnJvciAobWlub3IpOworCQkJaWYgKHBhcnBvcnRfbmVnb3RpYXRlIChscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LAorCQkJCQkgICAgICAgSUVFRTEyODRfTU9ERV9OSUJCTEUpKSB7CisJCQkJcmV0dmFsID0gLUVJTzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByZXBhcmVfdG9fd2FpdCgmbHBfdGFibGVbbWlub3JdLndhaXRxLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoTFBfVElNRU9VVF9QT0xMRUQpOworCQkJZmluaXNoX3dhaXQoJmxwX3RhYmxlW21pbm9yXS53YWl0cSwgJndhaXQpOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKworCQljb25kX3Jlc2NoZWQgKCk7CisJfQorCXBhcnBvcnRfbmVnb3RpYXRlIChscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LCBJRUVFMTI4NF9NT0RFX0NPTVBBVCk7Cisgb3V0OgorCWxwX3JlbGVhc2VfcGFycG9ydCAoJmxwX3RhYmxlW21pbm9yXSk7CisKKwlpZiAocmV0dmFsID4gMCAmJiBjb3B5X3RvX3VzZXIgKGJ1Ziwga2J1ZiwgcmV0dmFsKSkKKwkJcmV0dmFsID0gLUVGQVVMVDsKKworCXVwICgmbHBfdGFibGVbbWlub3JdLnBvcnRfbXV0ZXgpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmIC8qIElFRUUgMTI4NCBzdXBwb3J0ICovCisKK3N0YXRpYyBpbnQgbHBfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisKKwlpZiAobWlub3IgPj0gTFBfTk8pCisJCXJldHVybiAtRU5YSU87CisJaWYgKChMUF9GKG1pbm9yKSAmIExQX0VYSVNUKSA9PSAwKQorCQlyZXR1cm4gLUVOWElPOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KExQX0JVU1lfQklUX1BPUywgJkxQX0YobWlub3IpKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIElmIEFCT1JUT1BFTiBpcyBzZXQgYW5kIHRoZSBwcmludGVyIGlzIG9mZmxpbmUgb3Igb3V0IG9mIHBhcGVyLAorCSAgIHdlIG1heSBzdGlsbCB3YW50IHRvIG9wZW4gaXQgdG8gcGVyZm9ybSBpb2N0bCgpcy4gIFRoZXJlZm9yZSB3ZQorCSAgIGhhdmUgY29tbWFuZGVlcmVkIE9fTk9OQkxPQ0ssIGV2ZW4gdGhvdWdoIGl0IGlzIGJlaW5nIHVzZWQgaW4KKwkgICBhIG5vbi1zdGFuZGFyZCBtYW5uZXIuICBUaGlzIGlzIHN0cmljdGx5IGEgTGludXggaGFjaywgYW5kCisJICAgc2hvdWxkIG1vc3QgbGlrZWx5IG9ubHkgZXZlciBiZSB1c2VkIGJ5IHRoZSB0dW5lbHAgYXBwbGljYXRpb24uICovCisJaWYgKChMUF9GKG1pbm9yKSAmIExQX0FCT1JUT1BFTikgJiYgIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKKwkJaW50IHN0YXR1czsKKwkJbHBfY2xhaW1fcGFycG9ydF9vcl9ibG9jayAoJmxwX3RhYmxlW21pbm9yXSk7CisJCXN0YXR1cyA9IHJfc3RyKG1pbm9yKTsKKwkJbHBfcmVsZWFzZV9wYXJwb3J0ICgmbHBfdGFibGVbbWlub3JdKTsKKwkJaWYgKHN0YXR1cyAmIExQX1BPVVRQQSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAibHAlZCBvdXQgb2YgcGFwZXJcbiIsIG1pbm9yKTsKKwkJCUxQX0YobWlub3IpICY9IH5MUF9CVVNZOworCQkJcmV0dXJuIC1FTk9TUEM7CisJCX0gZWxzZSBpZiAoIShzdGF0dXMgJiBMUF9QU0VMRUNEKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAibHAlZCBvZmYtbGluZVxuIiwgbWlub3IpOworCQkJTFBfRihtaW5vcikgJj0gfkxQX0JVU1k7CisJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlIGlmICghKHN0YXR1cyAmIExQX1BFUlJPUlApKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImxwJWQgcHJpbnRlciBlcnJvclxuIiwgbWlub3IpOworCQkJTFBfRihtaW5vcikgJj0gfkxQX0JVU1k7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwlscF90YWJsZVttaW5vcl0ubHBfYnVmZmVyID0gKGNoYXIgKikga21hbGxvYyhMUF9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFscF90YWJsZVttaW5vcl0ubHBfYnVmZmVyKSB7CisJCUxQX0YobWlub3IpICY9IH5MUF9CVVNZOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogRGV0ZXJtaW5lIGlmIHRoZSBwZXJpcGhlcmFsIHN1cHBvcnRzIEVDUCBtb2RlICovCisJbHBfY2xhaW1fcGFycG9ydF9vcl9ibG9jayAoJmxwX3RhYmxlW21pbm9yXSk7CisJaWYgKCAobHBfdGFibGVbbWlub3JdLmRldi0+cG9ydC0+bW9kZXMgJiBQQVJQT1JUX01PREVfRUNQKSAmJgorICAgICAgICAgICAgICFwYXJwb3J0X25lZ290aWF0ZSAobHBfdGFibGVbbWlub3JdLmRldi0+cG9ydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFMTI4NF9NT0RFX0VDUCkpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gImxwJWQ6IEVDUCBtb2RlXG4iLCBtaW5vcik7CisJCWxwX3RhYmxlW21pbm9yXS5iZXN0X21vZGUgPSBJRUVFMTI4NF9NT0RFX0VDUDsKKwl9IGVsc2UgeworCQlscF90YWJsZVttaW5vcl0uYmVzdF9tb2RlID0gSUVFRTEyODRfTU9ERV9DT01QQVQ7CisJfQorCS8qIExlYXZlIHBlcmlwaGVyYWwgaW4gY29tcGF0aWJpbGl0eSBtb2RlICovCisJcGFycG9ydF9uZWdvdGlhdGUgKGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQsIElFRUUxMjg0X01PREVfQ09NUEFUKTsKKwlscF9yZWxlYXNlX3BhcnBvcnQgKCZscF90YWJsZVttaW5vcl0pOworCWxwX3RhYmxlW21pbm9yXS5jdXJyZW50X21vZGUgPSBJRUVFMTI4NF9NT0RFX0NPTVBBVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKworCWxwX2NsYWltX3BhcnBvcnRfb3JfYmxvY2sgKCZscF90YWJsZVttaW5vcl0pOworCXBhcnBvcnRfbmVnb3RpYXRlIChscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LCBJRUVFMTI4NF9NT0RFX0NPTVBBVCk7CisJbHBfdGFibGVbbWlub3JdLmN1cnJlbnRfbW9kZSA9IElFRUUxMjg0X01PREVfQ09NUEFUOworCWxwX3JlbGVhc2VfcGFycG9ydCAoJmxwX3RhYmxlW21pbm9yXSk7CisJa2ZyZWUobHBfdGFibGVbbWlub3JdLmxwX2J1ZmZlcik7CisJbHBfdGFibGVbbWlub3JdLmxwX2J1ZmZlciA9IE5VTEw7CisJTFBfRihtaW5vcikgJj0gfkxQX0JVU1k7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludCBzdGF0dXM7CisJaW50IHJldHZhbCA9IDA7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKyNpZmRlZiBMUF9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJscCVkIGlvY3RsLCBjbWQ6IDB4JXgsIGFyZzogMHglbHhcbiIsIG1pbm9yLCBjbWQsIGFyZyk7CisjZW5kaWYKKwlpZiAobWlub3IgPj0gTFBfTk8pCisJCXJldHVybiAtRU5PREVWOworCWlmICgoTFBfRihtaW5vcikgJiBMUF9FWElTVCkgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJc3dpdGNoICggY21kICkgeworCQlzdHJ1Y3QgdGltZXZhbCBwYXJfdGltZW91dDsKKwkJbG9uZyB0b19qaWZmaWVzOworCisJCWNhc2UgTFBUSU1FOgorCQkJTFBfVElNRShtaW5vcikgPSBhcmcgKiBIWi8xMDA7CisJCQlicmVhazsKKwkJY2FzZSBMUENIQVI6CisJCQlMUF9DSEFSKG1pbm9yKSA9IGFyZzsKKwkJCWJyZWFrOworCQljYXNlIExQQUJPUlQ6CisJCQlpZiAoYXJnKQorCQkJCUxQX0YobWlub3IpIHw9IExQX0FCT1JUOworCQkJZWxzZQorCQkJCUxQX0YobWlub3IpICY9IH5MUF9BQk9SVDsKKwkJCWJyZWFrOworCQljYXNlIExQQUJPUlRPUEVOOgorCQkJaWYgKGFyZykKKwkJCQlMUF9GKG1pbm9yKSB8PSBMUF9BQk9SVE9QRU47CisJCQllbHNlCisJCQkJTFBfRihtaW5vcikgJj0gfkxQX0FCT1JUT1BFTjsKKwkJCWJyZWFrOworCQljYXNlIExQQ0FSRUZVTDoKKwkJCWlmIChhcmcpCisJCQkJTFBfRihtaW5vcikgfD0gTFBfQ0FSRUZVTDsKKwkJCWVsc2UKKwkJCQlMUF9GKG1pbm9yKSAmPSB+TFBfQ0FSRUZVTDsKKwkJCWJyZWFrOworCQljYXNlIExQV0FJVDoKKwkJCUxQX1dBSVQobWlub3IpID0gYXJnOworCQkJYnJlYWs7CisJCWNhc2UgTFBTRVRJUlE6IAorCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBMUEdFVElSUToKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJkxQX0lSUShtaW5vciksCisJCQkJCXNpemVvZihpbnQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQljYXNlIExQR0VUU1RBVFVTOgorCQkJbHBfY2xhaW1fcGFycG9ydF9vcl9ibG9jayAoJmxwX3RhYmxlW21pbm9yXSk7CisJCQlzdGF0dXMgPSByX3N0cihtaW5vcik7CisJCQlscF9yZWxlYXNlX3BhcnBvcnQgKCZscF90YWJsZVttaW5vcl0pOworCisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZzdGF0dXMsIHNpemVvZihpbnQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQljYXNlIExQUkVTRVQ6CisJCQlscF9yZXNldChtaW5vcik7CisJCQlicmVhazsKKyNpZmRlZiBMUF9TVEFUUworCQljYXNlIExQR0VUU1RBVFM6CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZMUF9TVEFUKG1pbm9yKSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBscF9zdGF0cykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKGNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQkJbWVtc2V0KCZMUF9TVEFUKG1pbm9yKSwgMCwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgbHBfc3RhdHMpKTsKKwkJCWJyZWFrOworI2VuZGlmCisgCQljYXNlIExQR0VURkxBR1M6CisgCQkJc3RhdHVzID0gTFBfRihtaW5vcik7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZzdGF0dXMsIHNpemVvZihpbnQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgTFBTRVRUSU1FT1VUOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyICgmcGFyX3RpbWVvdXQsIGFyZ3AsCisJCQkJCSAgICBzaXplb2YgKHN0cnVjdCB0aW1ldmFsKSkpIHsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCS8qIENvbnZlcnQgdG8gamlmZmllcywgcGxhY2UgaW4gbHBfdGFibGUgKi8KKwkJCWlmICgocGFyX3RpbWVvdXQudHZfc2VjIDwgMCkgfHwKKwkJCSAgICAocGFyX3RpbWVvdXQudHZfdXNlYyA8IDApKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQl0b19qaWZmaWVzID0gUk9VTkRfVVAocGFyX3RpbWVvdXQudHZfdXNlYywgMTAwMDAwMC9IWik7CisJCQl0b19qaWZmaWVzICs9IHBhcl90aW1lb3V0LnR2X3NlYyAqIChsb25nKSBIWjsKKwkJCWlmICh0b19qaWZmaWVzIDw9IDApIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWxwX3RhYmxlW21pbm9yXS50aW1lb3V0ID0gdG9famlmZmllczsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR2YWwgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBscF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkud3JpdGUJCT0gbHBfd3JpdGUsCisJLmlvY3RsCQk9IGxwX2lvY3RsLAorCS5vcGVuCQk9IGxwX29wZW4sCisJLnJlbGVhc2UJPSBscF9yZWxlYXNlLAorI2lmZGVmIENPTkZJR19QQVJQT1JUXzEyODQKKwkucmVhZAkJPSBscF9yZWFkLAorI2VuZGlmCit9OworCisvKiAtLS0gc3VwcG9ydCBmb3IgY29uc29sZSBvbiB0aGUgbGluZSBwcmludGVyIC0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBDT05GSUdfTFBfQ09OU09MRQorCisjZGVmaW5lIENPTlNPTEVfTFAgMAorCisvKiBJZiB0aGUgcHJpbnRlciBpcyBvdXQgb2YgcGFwZXIsIHdlIGNhbiBlaXRoZXIgbG9zZSB0aGUgbWVzc2FnZXMgb3IKKyAqIHN0YWxsIHVudGlsIHRoZSBwcmludGVyIGlzIGhhcHB5IGFnYWluLiAgRGVmaW5lIENPTlNPTEVfTFBfU1RSSUNUCisgKiBub24temVybyB0byBnZXQgdGhlIGxhdHRlciBiZWhhdmlvdXIuICovCisjZGVmaW5lIENPTlNPTEVfTFBfU1RSSUNUIDEKKworLyogVGhlIGNvbnNvbGUgbXVzdCBiZSBsb2NrZWQgd2hlbiB3ZSBnZXQgaGVyZS4gKi8KKworc3RhdGljIHZvaWQgbHBfY29uc29sZV93cml0ZSAoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpzLAorCQkJICAgICAgdW5zaWduZWQgY291bnQpCit7CisJc3RydWN0IHBhcmRldmljZSAqZGV2ID0gbHBfdGFibGVbQ09OU09MRV9MUF0uZGV2OworCXN0cnVjdCBwYXJwb3J0ICpwb3J0ID0gZGV2LT5wb3J0OworCXNzaXplX3Qgd3JpdHRlbjsKKworCWlmIChwYXJwb3J0X2NsYWltIChkZXYpKQorCQkvKiBOb3RoaW5nIHdlIGNhbiBkby4gKi8KKwkJcmV0dXJuOworCisJcGFycG9ydF9zZXRfdGltZW91dCAoZGV2LCAwKTsKKworCS8qIEdvIHRvIGNvbXBhdGliaWxpdHkgbW9kZS4gKi8KKwlwYXJwb3J0X25lZ290aWF0ZSAocG9ydCwgSUVFRTEyODRfTU9ERV9DT01QQVQpOworCisJZG8geworCQkvKiBXcml0ZSB0aGUgZGF0YSwgY29udmVydGluZyBMRi0+Q1JMRiBhcyB3ZSBnby4gKi8KKwkJc3NpemVfdCBjYW53cml0ZSA9IGNvdW50OworCQljaGFyICpsZiA9IG1lbWNociAocywgJ1xuJywgY291bnQpOworCQlpZiAobGYpCisJCQljYW53cml0ZSA9IGxmIC0gczsKKworCQlpZiAoY2Fud3JpdGUgPiAwKSB7CisJCQl3cml0dGVuID0gcGFycG9ydF93cml0ZSAocG9ydCwgcywgY2Fud3JpdGUpOworCisJCQlpZiAod3JpdHRlbiA8PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlzICs9IHdyaXR0ZW47CisJCQljb3VudCAtPSB3cml0dGVuOworCQkJY2Fud3JpdGUgLT0gd3JpdHRlbjsKKwkJfQorCisJCWlmIChsZiAmJiBjYW53cml0ZSA8PSAwKSB7CisJCQljb25zdCBjaGFyICpjcmxmID0gIlxyXG4iOworCQkJaW50IGkgPSAyOworCisJCQkvKiBEb2RnZSB0aGUgb3JpZ2luYWwgJ1xuJywgYW5kIHB1dCAnXHJcbicgaW5zdGVhZC4gKi8KKwkJCXMrKzsKKwkJCWNvdW50LS07CisJCQlkbyB7CisJCQkJd3JpdHRlbiA9IHBhcnBvcnRfd3JpdGUgKHBvcnQsIGNybGYsIGkpOworCQkJCWlmICh3cml0dGVuID4gMCkKKwkJCQkJaSAtPSB3cml0dGVuLCBjcmxmICs9IHdyaXR0ZW47CisJCQl9IHdoaWxlIChpID4gMCAmJiAoQ09OU09MRV9MUF9TVFJJQ1QgfHwgd3JpdHRlbiA+IDApKTsKKwkJfQorCX0gd2hpbGUgKGNvdW50ID4gMCAmJiAoQ09OU09MRV9MUF9TVFJJQ1QgfHwgd3JpdHRlbiA+IDApKTsKKworCXBhcnBvcnRfcmVsZWFzZSAoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBjb25zb2xlIGxwY29ucyA9IHsKKwkubmFtZQkJPSAibHAiLAorCS53cml0ZQkJPSBscF9jb25zb2xlX3dyaXRlLAorCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCit9OworCisjZW5kaWYgLyogY29uc29sZSBvbiBsaW5lIHByaW50ZXIgKi8KKworLyogLS0tIGluaXRpYWxpc2F0aW9uIGNvZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHBhcnBvcnRfbnJbTFBfTk9dID0geyBbMCAuLi4gTFBfTk8tMV0gPSBMUF9QQVJQT1JUX1VOU1BFQyB9Oworc3RhdGljIGNoYXIgKnBhcnBvcnRbTFBfTk9dID0geyBOVUxMLCAgfTsKK3N0YXRpYyBpbnQgcmVzZXQgPSAwOworCittb2R1bGVfcGFyYW1fYXJyYXkocGFycG9ydCwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKHJlc2V0LCBib29sLCAwKTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IGxwX3NldHVwIChjaGFyICpzdHIpCit7CisJc3RhdGljIGludCBwYXJwb3J0X3B0cjsgLy8gaW5pdGlhbGx5IHplcm8KKwlpbnQgeDsKKworCWlmIChnZXRfb3B0aW9uICgmc3RyLCAmeCkpIHsKKwkJaWYgKHggPT0gMCkgeworCQkJLyogZGlzYWJsZSBkcml2ZXIgb24gImxwPSIgb3IgImxwPTAiICovCisJCQlwYXJwb3J0X25yWzBdID0gTFBfUEFSUE9SVF9PRkY7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXJuaW5nOiAnbHA9MHgleCcgaXMgZGVwcmVjYXRlZCwgaWdub3JlZFxuIiwgeCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAicGFycG9ydCIsIDcpKSB7CisJCWludCBuID0gc2ltcGxlX3N0cnRvdWwoc3RyKzcsIE5VTEwsIDEwKTsKKwkJaWYgKHBhcnBvcnRfcHRyIDwgTFBfTk8pCisJCQlwYXJwb3J0X25yW3BhcnBvcnRfcHRyKytdID0gbjsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAibHA6IHRvbyBtYW55IHBvcnRzLCAlcyBpZ25vcmVkLlxuIiwKKwkJCSAgICAgICBzdHIpOworCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJhdXRvIikpIHsKKwkJcGFycG9ydF9uclswXSA9IExQX1BBUlBPUlRfQVVUTzsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAibm9uZSIpKSB7CisJCXBhcnBvcnRfbnJbcGFycG9ydF9wdHIrK10gPSBMUF9QQVJQT1JUX05PTkU7CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgInJlc2V0IikpIHsKKwkJcmVzZXQgPSAxOworCX0KKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGxwX3JlZ2lzdGVyKGludCBuciwgc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJbHBfdGFibGVbbnJdLmRldiA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKHBvcnQsICJscCIsIAorCQkJCQkJICAgbHBfcHJlZW1wdCwgTlVMTCwgTlVMTCwgMCwKKwkJCQkJCSAgICh2b2lkICopICZscF90YWJsZVtucl0pOworCWlmIChscF90YWJsZVtucl0uZGV2ID09IE5VTEwpCisJCXJldHVybiAxOworCWxwX3RhYmxlW25yXS5mbGFncyB8PSBMUF9FWElTVDsKKworCWlmIChyZXNldCkKKwkJbHBfcmVzZXQobnIpOworCisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQobHBfY2xhc3MsIE1LREVWKExQX01BSk9SLCBuciksIE5VTEwsCisJCQkJImxwJWQiLCBucik7CisJZGV2ZnNfbWtfY2RldihNS0RFVihMUF9NQUpPUiwgbnIpLCBTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sCisJCQkicHJpbnRlcnMvJWQiLCBucik7CisKKwlwcmludGsoS0VSTl9JTkZPICJscCVkOiB1c2luZyAlcyAoJXMpLlxuIiwgbnIsIHBvcnQtPm5hbWUsIAorCSAgICAgICAocG9ydC0+aXJxID09IFBBUlBPUlRfSVJRX05PTkUpPyJwb2xsaW5nIjoiaW50ZXJydXB0LWRyaXZlbiIpOworCisjaWZkZWYgQ09ORklHX0xQX0NPTlNPTEUKKwlpZiAoIW5yKSB7CisJCWlmIChwb3J0LT5tb2RlcyAmIFBBUlBPUlRfTU9ERV9TQUZFSU5JTlQpIHsKKwkJCXJlZ2lzdGVyX2NvbnNvbGUgKCZscGNvbnMpOworCQkJY29uc29sZV9yZWdpc3RlcmVkID0gcG9ydDsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJscCVkOiBjb25zb2xlIHJlYWR5XG4iLCBDT05TT0xFX0xQKTsKKwkJfSBlbHNlCisJCQlwcmludGsgKEtFUk5fRVJSICJscCVkOiBjYW5ub3QgcnVuIGNvbnNvbGUgb24gJXNcbiIsCisJCQkJQ09OU09MRV9MUCwgcG9ydC0+bmFtZSk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbHBfYXR0YWNoIChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXN3aXRjaCAocGFycG9ydF9uclswXSkKKwl7CisJY2FzZSBMUF9QQVJQT1JUX1VOU1BFQzoKKwljYXNlIExQX1BBUlBPUlRfQVVUTzoKKwkJaWYgKHBhcnBvcnRfbnJbMF0gPT0gTFBfUEFSUE9SVF9BVVRPICYmCisJCSAgICBwb3J0LT5wcm9iZV9pbmZvWzBdLmNsYXNzICE9IFBBUlBPUlRfQ0xBU1NfUFJJTlRFUikKKwkJCXJldHVybjsKKwkJaWYgKGxwX2NvdW50ID09IExQX05PKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJscDogaWdub3JpbmcgcGFyYWxsZWwgcG9ydCAobWF4LiAlZClcbiIsTFBfTk8pOworCQkJcmV0dXJuOworCQl9CisJCWlmICghbHBfcmVnaXN0ZXIobHBfY291bnQsIHBvcnQpKQorCQkJbHBfY291bnQrKzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlmb3IgKGkgPSAwOyBpIDwgTFBfTk87IGkrKykgeworCQkJaWYgKHBvcnQtPm51bWJlciA9PSBwYXJwb3J0X25yW2ldKSB7CisJCQkJaWYgKCFscF9yZWdpc3RlcihpLCBwb3J0KSkKKwkJCQkJbHBfY291bnQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxwX2RldGFjaCAoc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJLyogV3JpdGUgdGhpcyBzb21lIGRheS4gKi8KKyNpZmRlZiBDT05GSUdfTFBfQ09OU09MRQorCWlmIChjb25zb2xlX3JlZ2lzdGVyZWQgPT0gcG9ydCkgeworCQl1bnJlZ2lzdGVyX2NvbnNvbGUgKCZscGNvbnMpOworCQljb25zb2xlX3JlZ2lzdGVyZWQgPSBOVUxMOworCX0KKyNlbmRpZiAvKiBDT05GSUdfTFBfQ09OU09MRSAqLworfQorCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIGxwX2RyaXZlciA9IHsKKwkubmFtZSA9ICJscCIsCisJLmF0dGFjaCA9IGxwX2F0dGFjaCwKKwkuZGV0YWNoID0gbHBfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbHBfaW5pdCAodm9pZCkKK3sKKwlpbnQgaSwgZXJyID0gMDsKKworCWlmIChwYXJwb3J0X25yWzBdID09IExQX1BBUlBPUlRfT0ZGKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBMUF9OTzsgaSsrKSB7CisJCWxwX3RhYmxlW2ldLmRldiA9IE5VTEw7CisJCWxwX3RhYmxlW2ldLmZsYWdzID0gMDsKKwkJbHBfdGFibGVbaV0uY2hhcnMgPSBMUF9JTklUX0NIQVI7CisJCWxwX3RhYmxlW2ldLnRpbWUgPSBMUF9JTklUX1RJTUU7CisJCWxwX3RhYmxlW2ldLndhaXQgPSBMUF9JTklUX1dBSVQ7CisJCWxwX3RhYmxlW2ldLmxwX2J1ZmZlciA9IE5VTEw7CisjaWZkZWYgTFBfU1RBVFMKKwkJbHBfdGFibGVbaV0ubGFzdGNhbGwgPSAwOworCQlscF90YWJsZVtpXS5ydW5jaGFycyA9IDA7CisJCW1lbXNldCAoJmxwX3RhYmxlW2ldLnN0YXRzLCAwLCBzaXplb2YgKHN0cnVjdCBscF9zdGF0cykpOworI2VuZGlmCisJCWxwX3RhYmxlW2ldLmxhc3RfZXJyb3IgPSAwOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkICgmbHBfdGFibGVbaV0ud2FpdHEpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkICgmbHBfdGFibGVbaV0uZGF0YXEpOworCQlpbml0X01VVEVYICgmbHBfdGFibGVbaV0ucG9ydF9tdXRleCk7CisJCWxwX3RhYmxlW2ldLnRpbWVvdXQgPSAxMCAqIEhaOworCX0KKworCWlmIChyZWdpc3Rlcl9jaHJkZXYgKExQX01BSk9SLCAibHAiLCAmbHBfZm9wcykpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAibHA6IHVuYWJsZSB0byBnZXQgbWFqb3IgJWRcbiIsIExQX01BSk9SKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZGV2ZnNfbWtfZGlyKCJwcmludGVycyIpOworCWxwX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgInByaW50ZXIiKTsKKwlpZiAoSVNfRVJSKGxwX2NsYXNzKSkgeworCQllcnIgPSBQVFJfRVJSKGxwX2NsYXNzKTsKKwkJZ290byBvdXRfZGV2ZnM7CisJfQorCisJaWYgKHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyICgmbHBfZHJpdmVyKSkgeworCQlwcmludGsgKEtFUk5fRVJSICJscDogdW5hYmxlIHRvIHJlZ2lzdGVyIHdpdGggcGFycG9ydFxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X2NsYXNzOworCX0KKworCWlmICghbHBfY291bnQpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gImxwOiBkcml2ZXIgbG9hZGVkIGJ1dCBubyBkZXZpY2VzIGZvdW5kXG4iKTsKKyNpZm5kZWYgQ09ORklHX1BBUlBPUlRfMTI4NAorCQlpZiAocGFycG9ydF9uclswXSA9PSBMUF9QQVJQT1JUX0FVVE8pCisJCQlwcmludGsgKEtFUk5fSU5GTyAibHA6IChpcyBJRUVFIDEyODQgc3VwcG9ydCBlbmFibGVkPylcbiIpOworI2VuZGlmCisJfQorCisJcmV0dXJuIDA7CisKK291dF9jbGFzczoKKwljbGFzc19zaW1wbGVfZGVzdHJveShscF9jbGFzcyk7CitvdXRfZGV2ZnM6CisJZGV2ZnNfcmVtb3ZlKCJwcmludGVycyIpOworCXVucmVnaXN0ZXJfY2hyZGV2KExQX01BSk9SLCAibHAiKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBscF9pbml0X21vZHVsZSAodm9pZCkKK3sKKwlpZiAocGFycG9ydFswXSkgeworCQkvKiBUaGUgdXNlciBnYXZlIHNvbWUgcGFyYW1ldGVycy4gIExldCdzIHNlZSB3aGF0IHRoZXkgd2VyZS4gICovCisJCWlmICghc3RybmNtcChwYXJwb3J0WzBdLCAiYXV0byIsIDQpKQorCQkJcGFycG9ydF9uclswXSA9IExQX1BBUlBPUlRfQVVUTzsKKwkJZWxzZSB7CisJCQlpbnQgbjsKKwkJCWZvciAobiA9IDA7IG4gPCBMUF9OTyAmJiBwYXJwb3J0W25dOyBuKyspIHsKKwkJCQlpZiAoIXN0cm5jbXAocGFycG9ydFtuXSwgIm5vbmUiLCA0KSkKKwkJCQkJcGFycG9ydF9ucltuXSA9IExQX1BBUlBPUlRfTk9ORTsKKwkJCQllbHNlIHsKKwkJCQkJY2hhciAqZXA7CisJCQkJCXVuc2lnbmVkIGxvbmcgciA9IHNpbXBsZV9zdHJ0b3VsKHBhcnBvcnRbbl0sICZlcCwgMCk7CisJCQkJCWlmIChlcCAhPSBwYXJwb3J0W25dKSAKKwkJCQkJCXBhcnBvcnRfbnJbbl0gPSByOworCQkJCQllbHNlIHsKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAibHA6IGJhZCBwb3J0IHNwZWNpZmllciBgJXMnXG4iLCBwYXJwb3J0W25dKTsKKwkJCQkJCXJldHVybiAtRU5PREVWOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGxwX2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgbHBfY2xlYW51cF9tb2R1bGUgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIgKCZscF9kcml2ZXIpOworCisjaWZkZWYgQ09ORklHX0xQX0NPTlNPTEUKKwl1bnJlZ2lzdGVyX2NvbnNvbGUgKCZscGNvbnMpOworI2VuZGlmCisKKwl1bnJlZ2lzdGVyX2NocmRldihMUF9NQUpPUiwgImxwIik7CisJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBMUF9OTzsgb2Zmc2V0KyspIHsKKwkJaWYgKGxwX3RhYmxlW29mZnNldF0uZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShscF90YWJsZVtvZmZzZXRdLmRldik7CisJCWRldmZzX3JlbW92ZSgicHJpbnRlcnMvJWQiLCBvZmZzZXQpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihMUF9NQUpPUiwgb2Zmc2V0KSk7CisJfQorCWRldmZzX3JlbW92ZSgicHJpbnRlcnMiKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShscF9jbGFzcyk7Cit9CisKK19fc2V0dXAoImxwPSIsIGxwX3NldHVwKTsKK21vZHVsZV9pbml0KGxwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGxwX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FMSUFTX0NIQVJERVZfTUFKT1IoTFBfTUFKT1IpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21lbS5jIGIvZHJpdmVycy9jaGFyL21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0N2NiM2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbWVtLmMKQEAgLTAsMCArMSw4ODAgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9jaGFyL21lbS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgQWRkZWQgZGV2ZnMgc3VwcG9ydC4gCisgKiAgICBKYW4tMTEtMTk5OCwgQy4gU2NvdHQgQW5hbmlhbiA8Y2FuYW5pYW5AYWx1bW5pLnByaW5jZXRvbi5lZHU+CisgKiAgU2hhcmVkIC9kZXYvemVybyBtbWFwaW5nIHN1cHBvcnQsIEZlYiAyMDAwLCBLYW5vaiBTYXJjYXIgPGthbm9qQHNnaS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXcuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2lmZGVmIENPTkZJR19JQTY0CisjIGluY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TMzkwX1RBUEUpICYmIGRlZmluZWQoQ09ORklHX1MzOTBfVEFQRV9DSEFSKQorZXh0ZXJuIHZvaWQgdGFwZWNoYXJfaW5pdCh2b2lkKTsKKyNlbmRpZgorCisvKgorICogQXJjaGl0ZWN0dXJlcyB2YXJ5IGluIGhvdyB0aGV5IGhhbmRsZSBjYWNoaW5nIGZvciBhZGRyZXNzZXMKKyAqIG91dHNpZGUgb2YgbWFpbiBtZW1vcnkuCisgKgorICovCitzdGF0aWMgaW5saW5lIGludCB1bmNhY2hlZF9hY2Nlc3Moc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorCS8qCisJICogT24gdGhlIFBQcm8gYW5kIHN1Y2Nlc3NvcnMsIHRoZSBNVFJScyBhcmUgdXNlZCB0byBzZXQKKwkgKiBtZW1vcnkgdHlwZXMgZm9yIHBoeXNpY2FsIGFkZHJlc3NlcyBvdXRzaWRlIG1haW4gbWVtb3J5LAorCSAqIHNvIGJsaW5kbHkgc2V0dGluZyBQQ0Qgb3IgUFdUIG9uIHRob3NlIHBhZ2VzIGlzIHdyb25nLgorCSAqIEZvciBQZW50aXVtcyBhbmQgZWFybGllciwgdGhlIHN1cnJvdW5kIGxvZ2ljIHNob3VsZCBkaXNhYmxlCisJICogY2FjaGluZyBmb3IgdGhlIGhpZ2ggYWRkcmVzc2VzIHRocm91Z2ggdGhlIEtFTiBwaW4sIGJ1dAorCSAqIHdlIG1haW50YWluIHRoZSB0cmFkaXRpb24gb2YgcGFyYW5vaWEgaW4gdGhpcyBjb2RlLgorCSAqLworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKQorCQlyZXR1cm4gMTsKKyAJcmV0dXJuICEoIHRlc3RfYml0KFg4Nl9GRUFUVVJFX01UUlIsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpIHx8CisJCSAgdGVzdF9iaXQoWDg2X0ZFQVRVUkVfSzZfTVRSUiwgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSkgfHwKKwkJICB0ZXN0X2JpdChYODZfRkVBVFVSRV9DWVJJWF9BUlIsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpIHx8CisJCSAgdGVzdF9iaXQoWDg2X0ZFQVRVUkVfQ0VOVEFVUl9NQ1IsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpICkKKwkgICYmIGFkZHIgPj0gX19wYShoaWdoX21lbW9yeSk7CisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCisJLyogCisJICogVGhpcyBpcyBicm9rZW4gYmVjYXVzZSBpdCBjYW4gZ2VuZXJhdGUgbWVtb3J5IHR5cGUgYWxpYXNlcywKKwkgKiB3aGljaCBjYW4gY2F1c2UgY2FjaGUgY29ycnVwdGlvbnMKKwkgKiBCdXQgaXQgaXMgb25seSBhdmFpbGFibGUgZm9yIHJvb3QgYW5kIHdlIGhhdmUgdG8gYmUgYnVnLXRvLWJ1ZworCSAqIGNvbXBhdGlibGUgd2l0aCBpMzg2LgorCSAqLworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKQorCQlyZXR1cm4gMTsKKwkvKiBzYW1lIGJlaGF2aW91ciBhcyBpMzg2LiBQQVQgYWx3YXlzIHNldCB0byBjYWNoZWQgYW5kIE1UUlJzIGNvbnRyb2wgdGhlCisJICAgY2FjaGluZyBiZWhhdmlvdXIuIAorCSAgIEhvcGVmdWxseSBhIGZ1bGwgUEFUIGltcGxlbWVudGF0aW9uIHdpbGwgZml4IHRoYXQgc29vbi4gKi8JICAgCisJcmV0dXJuIDA7CisjZWxpZiBkZWZpbmVkKENPTkZJR19JQTY0KQorCS8qCisJICogT24gaWE2NCwgd2UgaWdub3JlIE9fU1lOQyBiZWNhdXNlIHdlIGNhbm5vdCB0b2xlcmF0ZSBtZW1vcnkgYXR0cmlidXRlIGFsaWFzZXMuCisJICovCisJcmV0dXJuICEoZWZpX21lbV9hdHRyaWJ1dGVzKGFkZHIpICYgRUZJX01FTU9SWV9XQik7CisjZWxzZQorCS8qCisJICogQWNjZXNzaW5nIG1lbW9yeSBhYm92ZSB0aGUgdG9wIHRoZSBrZXJuZWwga25vd3MgYWJvdXQgb3IgdGhyb3VnaCBhIGZpbGUgcG9pbnRlcgorCSAqIHRoYXQgd2FzIG1hcmtlZCBPX1NZTkMgd2lsbCBiZSBkb25lIG5vbi1jYWNoZWQuCisJICovCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpCisJCXJldHVybiAxOworCXJldHVybiBhZGRyID49IF9fcGEoaGlnaF9tZW1vcnkpOworI2VuZGlmCit9CisKKyNpZm5kZWYgQVJDSF9IQVNfVkFMSURfUEhZU19BRERSX1JBTkdFCitzdGF0aWMgaW5saW5lIGludCB2YWxpZF9waHlzX2FkZHJfcmFuZ2UodW5zaWduZWQgbG9uZyBhZGRyLCBzaXplX3QgKmNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZW5kX21lbTsKKworCWVuZF9tZW0gPSBfX3BhKGhpZ2hfbWVtb3J5KTsKKwlpZiAoYWRkciA+PSBlbmRfbWVtKQorCQlyZXR1cm4gMDsKKworCWlmICgqY291bnQgPiBlbmRfbWVtIC0gYWRkcikKKwkJKmNvdW50ID0gZW5kX21lbSAtIGFkZHI7CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCisvKgorICogVGhpcyBmdW5jaW9uIHJlYWRzIHRoZSAqcGh5c2ljYWwqIG1lbW9yeS4gVGhlIGZfcG9zIHBvaW50cyBkaXJlY3RseSB0byB0aGUgCisgKiBtZW1vcnkgbG9jYXRpb24uIAorICovCitzdGF0aWMgc3NpemVfdCByZWFkX21lbShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbG9uZyBwID0gKnBwb3M7CisJc3NpemVfdCByZWFkLCBzejsKKwljaGFyICpwdHI7CisKKwlpZiAoIXZhbGlkX3BoeXNfYWRkcl9yYW5nZShwLCAmY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZWFkID0gMDsKKyNpZmRlZiBfX0FSQ0hfSEFTX05PX1BBR0VfWkVST19NQVBQRUQKKwkvKiB3ZSBkb24ndCBoYXZlIHBhZ2UgMCBtYXBwZWQgb24gc3BhcmMgYW5kIG02OGsuLiAqLworCWlmIChwIDwgUEFHRV9TSVpFKSB7CisJCXN6ID0gUEFHRV9TSVpFIC0gcDsKKwkJaWYgKHN6ID4gY291bnQpIAorCQkJc3ogPSBjb3VudDsgCisJCWlmIChzeiA+IDApIHsKKwkJCWlmIChjbGVhcl91c2VyKGJ1Ziwgc3opKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnVmICs9IHN6OyAKKwkJCXAgKz0gc3o7IAorCQkJY291bnQgLT0gc3o7IAorCQkJcmVhZCArPSBzejsgCisJCX0KKwl9CisjZW5kaWYKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJLyoKKwkJICogSGFuZGxlIGZpcnN0IHBhZ2UgaW4gY2FzZSBpdCdzIG5vdCBhbGlnbmVkCisJCSAqLworCQlpZiAoLXAgJiAoUEFHRV9TSVpFIC0gMSkpCisJCQlzeiA9IC1wICYgKFBBR0VfU0laRSAtIDEpOworCQllbHNlCisJCQlzeiA9IFBBR0VfU0laRTsKKworCQlzeiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHN6LCBjb3VudCk7CisKKwkJLyoKKwkJICogT24gaWE2NCBpZiBhIHBhZ2UgaGFzIGJlZW4gbWFwcGVkIHNvbWV3aGVyZSBhcworCQkgKiB1bmNhY2hlZCwgdGhlbiBpdCBtdXN0IGFsc28gYmUgYWNjZXNzZWQgdW5jYWNoZWQKKwkJICogYnkgdGhlIGtlcm5lbCBvciBkYXRhIGNvcnJ1cHRpb24gbWF5IG9jY3VyCisJCSAqLworCQlwdHIgPSB4bGF0ZV9kZXZfbWVtX3B0cihwKTsKKworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgcHRyLCBzeikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnVmICs9IHN6OworCQlwICs9IHN6OworCQljb3VudCAtPSBzejsKKwkJcmVhZCArPSBzejsKKwl9CisKKwkqcHBvcyArPSByZWFkOworCXJldHVybiByZWFkOworfQorCitzdGF0aWMgc3NpemVfdCB3cml0ZV9tZW0oc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwgCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbG9uZyBwID0gKnBwb3M7CisJc3NpemVfdCB3cml0dGVuLCBzejsKKwl1bnNpZ25lZCBsb25nIGNvcGllZDsKKwl2b2lkICpwdHI7CisKKwlpZiAoIXZhbGlkX3BoeXNfYWRkcl9yYW5nZShwLCAmY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXdyaXR0ZW4gPSAwOworCisjaWZkZWYgX19BUkNIX0hBU19OT19QQUdFX1pFUk9fTUFQUEVECisJLyogd2UgZG9uJ3QgaGF2ZSBwYWdlIDAgbWFwcGVkIG9uIHNwYXJjIGFuZCBtNjhrLi4gKi8KKwlpZiAocCA8IFBBR0VfU0laRSkgeworCQl1bnNpZ25lZCBsb25nIHN6ID0gUEFHRV9TSVpFIC0gcDsKKwkJaWYgKHN6ID4gY291bnQpCisJCQlzeiA9IGNvdW50OworCQkvKiBIbW0uIERvIHNvbWV0aGluZz8gKi8KKwkJYnVmICs9IHN6OworCQlwICs9IHN6OworCQljb3VudCAtPSBzejsKKwkJd3JpdHRlbiArPSBzejsKKwl9CisjZW5kaWYKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJLyoKKwkJICogSGFuZGxlIGZpcnN0IHBhZ2UgaW4gY2FzZSBpdCdzIG5vdCBhbGlnbmVkCisJCSAqLworCQlpZiAoLXAgJiAoUEFHRV9TSVpFIC0gMSkpCisJCQlzeiA9IC1wICYgKFBBR0VfU0laRSAtIDEpOworCQllbHNlCisJCQlzeiA9IFBBR0VfU0laRTsKKworCQlzeiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHN6LCBjb3VudCk7CisKKwkJLyoKKwkJICogT24gaWE2NCBpZiBhIHBhZ2UgaGFzIGJlZW4gbWFwcGVkIHNvbWV3aGVyZSBhcworCQkgKiB1bmNhY2hlZCwgdGhlbiBpdCBtdXN0IGFsc28gYmUgYWNjZXNzZWQgdW5jYWNoZWQKKwkJICogYnkgdGhlIGtlcm5lbCBvciBkYXRhIGNvcnJ1cHRpb24gbWF5IG9jY3VyCisJCSAqLworCQlwdHIgPSB4bGF0ZV9kZXZfbWVtX3B0cihwKTsKKworCQljb3BpZWQgPSBjb3B5X2Zyb21fdXNlcihwdHIsIGJ1Ziwgc3opOworCQlpZiAoY29waWVkKSB7CisJCQlzc2l6ZV90IHJldDsKKworCQkJcmV0ID0gd3JpdHRlbiArIChzeiAtIGNvcGllZCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlidWYgKz0gc3o7CisJCXAgKz0gc3o7CisJCWNvdW50IC09IHN6OworCQl3cml0dGVuICs9IHN6OworCX0KKworCSpwcG9zICs9IHdyaXR0ZW47CisJcmV0dXJuIHdyaXR0ZW47Cit9CisKK3N0YXRpYyBpbnQgbW1hcF9tZW0oc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCit7CisjaWYgZGVmaW5lZChfX0hBVkVfUEhZU19NRU1fQUNDRVNTX1BST1QpCisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7CisKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBoeXNfbWVtX2FjY2Vzc19wcm90KGZpbGUsIG9mZnNldCwKKwkJCQkJCSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkJCQkgdm1hLT52bV9wYWdlX3Byb3QpOworI2VsaWYgZGVmaW5lZChwZ3Byb3Rfbm9uY2FjaGVkKQorCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCWludCB1bmNhY2hlZDsKKworCXVuY2FjaGVkID0gdW5jYWNoZWRfYWNjZXNzKGZpbGUsIG9mZnNldCk7CisJaWYgKHVuY2FjaGVkKQorCQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOworI2VuZGlmCisKKwkvKiBSZW1hcC1wZm4tcmFuZ2Ugd2lsbCBtYXJrIHRoZSByYW5nZSBWTV9JTyBhbmQgVk1fUkVTRVJWRUQgKi8KKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwKKwkJCSAgICB2bWEtPnZtX3N0YXJ0LAorCQkJICAgIHZtYS0+dm1fcGdvZmYsCisJCQkgICAgdm1hLT52bV9lbmQtdm1hLT52bV9zdGFydCwKKwkJCSAgICB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJCXJldHVybiAtRUFHQUlOOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1tYXBfa21lbShzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKwkvKgorCSAqIFJFRC1QRU46IG9uIHNvbWUgYXJjaGl0ZWN0dXJlcyB0aGVyZSBpcyBtb3JlIG1hcHBlZCBtZW1vcnkKKwkgKiB0aGFuIGF2YWlsYWJsZSBpbiBtZW1fbWFwIHdoaWNoIHBmbl92YWxpZCBjaGVja3MKKwkgKiBmb3IuIFBlcmhhcHMgc2hvdWxkIGFkZCBhIG5ldyBtYWNybyBoZXJlLgorCSAqCisJICogUkVELVBFTjogdm1hbGxvYyBpcyBub3Qgc3VwcG9ydGVkIHJpZ2h0IG5vdy4KKwkgKi8KKwlpZiAoIXBmbl92YWxpZCh2bWEtPnZtX3Bnb2ZmKSkKKwkJcmV0dXJuIC1FSU87CisJdmFsID0gKHU2NCl2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7CisJdm1hLT52bV9wZ29mZiA9IF9fcGEodmFsKSA+PiBQQUdFX1NISUZUOworCXJldHVybiBtbWFwX21lbShmaWxlLCB2bWEpOworfQorCitleHRlcm4gbG9uZyB2cmVhZChjaGFyICpidWYsIGNoYXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOworZXh0ZXJuIGxvbmcgdndyaXRlKGNoYXIgKmJ1ZiwgY2hhciAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSAqdmlydHVhbCogbWVtb3J5IGFzIHNlZW4gYnkgdGhlIGtlcm5lbC4KKyAqLworc3RhdGljIHNzaXplX3QgcmVhZF9rbWVtKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCAKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBsb25nIHAgPSAqcHBvczsKKwlzc2l6ZV90IGxvd19jb3VudCwgcmVhZCwgc3o7CisJY2hhciAqIGtidWY7IC8qIGstYWRkciBiZWNhdXNlIHZyZWFkKCkgdGFrZXMgdm1saXN0X2xvY2sgcndsb2NrICovCisKKwlyZWFkID0gMDsKKwlpZiAocCA8ICh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSkgeworCQlsb3dfY291bnQgPSBjb3VudDsKKwkJaWYgKGNvdW50ID4gKHVuc2lnbmVkIGxvbmcpIGhpZ2hfbWVtb3J5IC0gcCkKKwkJCWxvd19jb3VudCA9ICh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSAtIHA7CisKKyNpZmRlZiBfX0FSQ0hfSEFTX05PX1BBR0VfWkVST19NQVBQRUQKKwkJLyogd2UgZG9uJ3QgaGF2ZSBwYWdlIDAgbWFwcGVkIG9uIHNwYXJjIGFuZCBtNjhrLi4gKi8KKwkJaWYgKHAgPCBQQUdFX1NJWkUgJiYgbG93X2NvdW50ID4gMCkgeworCQkJc2l6ZV90IHRtcCA9IFBBR0VfU0laRSAtIHA7CisJCQlpZiAodG1wID4gbG93X2NvdW50KSB0bXAgPSBsb3dfY291bnQ7CisJCQlpZiAoY2xlYXJfdXNlcihidWYsIHRtcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlidWYgKz0gdG1wOworCQkJcCArPSB0bXA7CisJCQlyZWFkICs9IHRtcDsKKwkJCWxvd19jb3VudCAtPSB0bXA7CisJCQljb3VudCAtPSB0bXA7CisJCX0KKyNlbmRpZgorCQl3aGlsZSAobG93X2NvdW50ID4gMCkgeworCQkJLyoKKwkJCSAqIEhhbmRsZSBmaXJzdCBwYWdlIGluIGNhc2UgaXQncyBub3QgYWxpZ25lZAorCQkJICovCisJCQlpZiAoLXAgJiAoUEFHRV9TSVpFIC0gMSkpCisJCQkJc3ogPSAtcCAmIChQQUdFX1NJWkUgLSAxKTsKKwkJCWVsc2UKKwkJCQlzeiA9IFBBR0VfU0laRTsKKworCQkJc3ogPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBzeiwgbG93X2NvdW50KTsKKworCQkJLyoKKwkJCSAqIE9uIGlhNjQgaWYgYSBwYWdlIGhhcyBiZWVuIG1hcHBlZCBzb21ld2hlcmUgYXMKKwkJCSAqIHVuY2FjaGVkLCB0aGVuIGl0IG11c3QgYWxzbyBiZSBhY2Nlc3NlZCB1bmNhY2hlZAorCQkJICogYnkgdGhlIGtlcm5lbCBvciBkYXRhIGNvcnJ1cHRpb24gbWF5IG9jY3VyCisJCQkgKi8KKwkJCWtidWYgPSB4bGF0ZV9kZXZfa21lbV9wdHIoKGNoYXIgKilwKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGtidWYsIHN6KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJ1ZiArPSBzejsKKwkJCXAgKz0gc3o7CisJCQlyZWFkICs9IHN6OworCQkJbG93X2NvdW50IC09IHN6OworCQkJY291bnQgLT0gc3o7CisJCX0KKwl9CisKKwlpZiAoY291bnQgPiAwKSB7CisJCWtidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFrYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCWludCBsZW4gPSBjb3VudDsKKworCQkJaWYgKGxlbiA+IFBBR0VfU0laRSkKKwkJCQlsZW4gPSBQQUdFX1NJWkU7CisJCQlsZW4gPSB2cmVhZChrYnVmLCAoY2hhciAqKXAsIGxlbik7CisJCQlpZiAoIWxlbikKKwkJCQlicmVhazsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBrYnVmLCBsZW4pKSB7CisJCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWtidWYpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJY291bnQgLT0gbGVuOworCQkJYnVmICs9IGxlbjsKKwkJCXJlYWQgKz0gbGVuOworCQkJcCArPSBsZW47CisJCX0KKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWtidWYpOworCX0KKyAJKnBwb3MgPSBwOworIAlyZXR1cm4gcmVhZDsKK30KKworCitzdGF0aWMgaW5saW5lIHNzaXplX3QKK2RvX3dyaXRlX2ttZW0odm9pZCAqcCwgdW5zaWduZWQgbG9uZyByZWFscCwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCisJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCB3cml0dGVuLCBzejsKKwl1bnNpZ25lZCBsb25nIGNvcGllZDsKKworCXdyaXR0ZW4gPSAwOworI2lmZGVmIF9fQVJDSF9IQVNfTk9fUEFHRV9aRVJPX01BUFBFRAorCS8qIHdlIGRvbid0IGhhdmUgcGFnZSAwIG1hcHBlZCBvbiBzcGFyYyBhbmQgbTY4ay4uICovCisJaWYgKHJlYWxwIDwgUEFHRV9TSVpFKSB7CisJCXVuc2lnbmVkIGxvbmcgc3ogPSBQQUdFX1NJWkUgLSByZWFscDsKKwkJaWYgKHN6ID4gY291bnQpCisJCQlzeiA9IGNvdW50OworCQkvKiBIbW0uIERvIHNvbWV0aGluZz8gKi8KKwkJYnVmICs9IHN6OworCQlwICs9IHN6OworCQlyZWFscCArPSBzejsKKwkJY291bnQgLT0gc3o7CisJCXdyaXR0ZW4gKz0gc3o7CisJfQorI2VuZGlmCisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCWNoYXIgKnB0cjsKKwkJLyoKKwkJICogSGFuZGxlIGZpcnN0IHBhZ2UgaW4gY2FzZSBpdCdzIG5vdCBhbGlnbmVkCisJCSAqLworCQlpZiAoLXJlYWxwICYgKFBBR0VfU0laRSAtIDEpKQorCQkJc3ogPSAtcmVhbHAgJiAoUEFHRV9TSVpFIC0gMSk7CisJCWVsc2UKKwkJCXN6ID0gUEFHRV9TSVpFOworCisJCXN6ID0gbWluX3QodW5zaWduZWQgbG9uZywgc3osIGNvdW50KTsKKworCQkvKgorCQkgKiBPbiBpYTY0IGlmIGEgcGFnZSBoYXMgYmVlbiBtYXBwZWQgc29tZXdoZXJlIGFzCisJCSAqIHVuY2FjaGVkLCB0aGVuIGl0IG11c3QgYWxzbyBiZSBhY2Nlc3NlZCB1bmNhY2hlZAorCQkgKiBieSB0aGUga2VybmVsIG9yIGRhdGEgY29ycnVwdGlvbiBtYXkgb2NjdXIKKwkJICovCisJCXB0ciA9IHhsYXRlX2Rldl9rbWVtX3B0cihwKTsKKworCQljb3BpZWQgPSBjb3B5X2Zyb21fdXNlcihwdHIsIGJ1Ziwgc3opOworCQlpZiAoY29waWVkKSB7CisJCQlzc2l6ZV90IHJldDsKKworCQkJcmV0ID0gd3JpdHRlbiArIChzeiAtIGNvcGllZCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlidWYgKz0gc3o7CisJCXAgKz0gc3o7CisJCXJlYWxwICs9IHN6OworCQljb3VudCAtPSBzejsKKwkJd3JpdHRlbiArPSBzejsKKwl9CisKKwkqcHBvcyArPSB3cml0dGVuOworCXJldHVybiB3cml0dGVuOworfQorCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0byB0aGUgKnZpcnR1YWwqIG1lbW9yeSBhcyBzZWVuIGJ5IHRoZSBrZXJuZWwuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2ttZW0oc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwgCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgcCA9ICpwcG9zOworCXNzaXplX3Qgd3JvdGUgPSAwOworCXNzaXplX3QgdmlydHIgPSAwOworCXNzaXplX3Qgd3JpdHRlbjsKKwljaGFyICoga2J1ZjsgLyogay1hZGRyIGJlY2F1c2UgdndyaXRlKCkgdGFrZXMgdm1saXN0X2xvY2sgcndsb2NrICovCisKKwlpZiAocCA8ICh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSkgeworCisJCXdyb3RlID0gY291bnQ7CisJCWlmIChjb3VudCA+ICh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSAtIHApCisJCQl3cm90ZSA9ICh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSAtIHA7CisKKwkJd3JpdHRlbiA9IGRvX3dyaXRlX2ttZW0oKHZvaWQqKXAsIHAsIGJ1Ziwgd3JvdGUsIHBwb3MpOworCQlpZiAod3JpdHRlbiAhPSB3cm90ZSkKKwkJCXJldHVybiB3cml0dGVuOworCQl3cm90ZSA9IHdyaXR0ZW47CisJCXAgKz0gd3JvdGU7CisJCWJ1ZiArPSB3cm90ZTsKKwkJY291bnQgLT0gd3JvdGU7CisJfQorCisJaWYgKGNvdW50ID4gMCkgeworCQlrYnVmID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICgha2J1ZikKKwkJCXJldHVybiB3cm90ZSA/IHdyb3RlIDogLUVOT01FTTsKKwkJd2hpbGUgKGNvdW50ID4gMCkgeworCQkJaW50IGxlbiA9IGNvdW50OworCisJCQlpZiAobGVuID4gUEFHRV9TSVpFKQorCQkJCWxlbiA9IFBBR0VfU0laRTsKKwkJCWlmIChsZW4pIHsKKwkJCQl3cml0dGVuID0gY29weV9mcm9tX3VzZXIoa2J1ZiwgYnVmLCBsZW4pOworCQkJCWlmICh3cml0dGVuKSB7CisJCQkJCXNzaXplX3QgcmV0OworCisJCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylrYnVmKTsKKwkJCQkJcmV0ID0gd3JvdGUgKyB2aXJ0ciArIChsZW4gLSB3cml0dGVuKTsKKwkJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7CisJCQkJfQorCQkJfQorCQkJbGVuID0gdndyaXRlKGtidWYsIChjaGFyICopcCwgbGVuKTsKKwkJCWNvdW50IC09IGxlbjsKKwkJCWJ1ZiArPSBsZW47CisJCQl2aXJ0ciArPSBsZW47CisJCQlwICs9IGxlbjsKKwkJfQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpa2J1Zik7CisJfQorCisgCSpwcG9zID0gcDsKKyAJcmV0dXJuIHZpcnRyICsgd3JvdGU7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19JU0EpIHx8ICFkZWZpbmVkKF9fbWM2ODAwMF9fKQorc3RhdGljIHNzaXplX3QgcmVhZF9wb3J0KHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbG9uZyBpID0gKnBwb3M7CisJY2hhciBfX3VzZXIgKnRtcCA9IGJ1ZjsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOyAKKwl3aGlsZSAoY291bnQtLSA+IDAgJiYgaSA8IDY1NTM2KSB7CisJCWlmIChfX3B1dF91c2VyKGluYihpKSx0bXApIDwgMCkgCisJCQlyZXR1cm4gLUVGQVVMVDsgIAorCQlpKys7CisJCXRtcCsrOworCX0KKwkqcHBvcyA9IGk7CisJcmV0dXJuIHRtcC1idWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX3BvcnQoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbG9uZyBpID0gKnBwb3M7CisJY29uc3QgY2hhciBfX3VzZXIgKiB0bXAgPSBidWY7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCxidWYsY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwl3aGlsZSAoY291bnQtLSA+IDAgJiYgaSA8IDY1NTM2KSB7CisJCWNoYXIgYzsKKwkJaWYgKF9fZ2V0X3VzZXIoYywgdG1wKSkgCisJCQlyZXR1cm4gLUVGQVVMVDsgCisJCW91dGIoYyxpKTsKKwkJaSsrOworCQl0bXArKzsKKwl9CisJKnBwb3MgPSBpOworCXJldHVybiB0bXAtYnVmOworfQorI2VuZGlmCisKK3N0YXRpYyBzc2l6ZV90IHJlYWRfbnVsbChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCB3cml0ZV9udWxsKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiBjb3VudDsKK30KKworI2lmZGVmIENPTkZJR19NTVUKKy8qCisgKiBGb3IgZnVuLCB3ZSBhcmUgdXNpbmcgdGhlIE1NVSBmb3IgdGhpcy4KKyAqLworc3RhdGljIGlubGluZSBzaXplX3QgcmVhZF96ZXJvX3BhZ2VhbGlnbmVkKGNoYXIgX191c2VyICogYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWE7CisJdW5zaWduZWQgbG9uZyBhZGRyPSh1bnNpZ25lZCBsb25nKWJ1ZjsKKworCW1tID0gY3VycmVudC0+bW07CisJLyogT29wcywgdGhpcyB3YXMgZm9yZ290dGVuIGJlZm9yZS4gLWJlbiAqLworCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKworCS8qIEZvciBwcml2YXRlIG1hcHBpbmdzLCBqdXN0IG1hcCBpbiB6ZXJvIHBhZ2VzLiAqLworCWZvciAodm1hID0gZmluZF92bWEobW0sIGFkZHIpOyB2bWE7IHZtYSA9IHZtYS0+dm1fbmV4dCkgeworCQl1bnNpZ25lZCBsb25nIGNvdW50OworCisJCWlmICh2bWEtPnZtX3N0YXJ0ID4gYWRkciB8fCAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSA9PSAwKQorCQkJZ290byBvdXRfdXA7CisJCWlmICh2bWEtPnZtX2ZsYWdzICYgKFZNX1NIQVJFRCB8IFZNX0hVR0VUTEIpKQorCQkJYnJlYWs7CisJCWNvdW50ID0gdm1hLT52bV9lbmQgLSBhZGRyOworCQlpZiAoY291bnQgPiBzaXplKQorCQkJY291bnQgPSBzaXplOworCisJCXphcF9wYWdlX3JhbmdlKHZtYSwgYWRkciwgY291bnQsIE5VTEwpOworICAgICAgICAJemVyb21hcF9wYWdlX3JhbmdlKHZtYSwgYWRkciwgY291bnQsIFBBR0VfQ09QWSk7CisKKwkJc2l6ZSAtPSBjb3VudDsKKwkJYnVmICs9IGNvdW50OworCQlhZGRyICs9IGNvdW50OworCQlpZiAoc2l6ZSA9PSAwKQorCQkJZ290byBvdXRfdXA7CisJfQorCisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwkKKwkvKiBUaGUgc2hhcmVkIGNhc2UgaXMgaGFyZC4gTGV0J3MgZG8gdGhlIGNvbnZlbnRpb25hbCB6ZXJvaW5nLiAqLyAKKwlkbyB7CisJCXVuc2lnbmVkIGxvbmcgdW53cml0dGVuID0gY2xlYXJfdXNlcihidWYsIFBBR0VfU0laRSk7CisJCWlmICh1bndyaXR0ZW4pCisJCQlyZXR1cm4gc2l6ZSArIHVud3JpdHRlbiAtIFBBR0VfU0laRTsKKwkJY29uZF9yZXNjaGVkKCk7CisJCWJ1ZiArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0gd2hpbGUgKHNpemUpOworCisJcmV0dXJuIHNpemU7CitvdXRfdXA6CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgcmVhZF96ZXJvKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsIAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgbGVmdCwgdW53cml0dGVuLCB3cml0dGVuID0gMDsKKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsZWZ0ID0gY291bnQ7CisKKwkvKiBkbyB3ZSB3YW50IHRvIGJlIGNsZXZlcj8gQXJiaXRyYXJ5IGN1dC1vZmYgKi8KKwlpZiAoY291bnQgPj0gUEFHRV9TSVpFKjQpIHsKKwkJdW5zaWduZWQgbG9uZyBwYXJ0aWFsOworCisJCS8qIEhvdyBtdWNoIGxlZnQgb2YgdGhlIHBhZ2U/ICovCisJCXBhcnRpYWwgPSAoUEFHRV9TSVpFLTEpICYgLSh1bnNpZ25lZCBsb25nKSBidWY7CisJCXVud3JpdHRlbiA9IGNsZWFyX3VzZXIoYnVmLCBwYXJ0aWFsKTsKKwkJd3JpdHRlbiA9IHBhcnRpYWwgLSB1bndyaXR0ZW47CisJCWlmICh1bndyaXR0ZW4pCisJCQlnb3RvIG91dDsKKwkJbGVmdCAtPSBwYXJ0aWFsOworCQlidWYgKz0gcGFydGlhbDsKKwkJdW53cml0dGVuID0gcmVhZF96ZXJvX3BhZ2VhbGlnbmVkKGJ1ZiwgbGVmdCAmIFBBR0VfTUFTSyk7CisJCXdyaXR0ZW4gKz0gKGxlZnQgJiBQQUdFX01BU0spIC0gdW53cml0dGVuOworCQlpZiAodW53cml0dGVuKQorCQkJZ290byBvdXQ7CisJCWJ1ZiArPSBsZWZ0ICYgUEFHRV9NQVNLOworCQlsZWZ0ICY9IH5QQUdFX01BU0s7CisJfQorCXVud3JpdHRlbiA9IGNsZWFyX3VzZXIoYnVmLCBsZWZ0KTsKKwl3cml0dGVuICs9IGxlZnQgLSB1bndyaXR0ZW47CitvdXQ6CisJcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogLUVGQVVMVDsKK30KKworc3RhdGljIGludCBtbWFwX3plcm8oc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCit7CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9TSEFSRUQpCisJCXJldHVybiBzaG1lbV96ZXJvX3NldHVwKHZtYSk7CisJaWYgKHplcm9tYXBfcGFnZV9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlyZXR1cm4gMDsKK30KKyNlbHNlIC8qIENPTkZJR19NTVUgKi8KK3N0YXRpYyBzc2l6ZV90IHJlYWRfemVybyhzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgKiBidWYsIAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXNpemVfdCB0b2RvID0gY291bnQ7CisKKwl3aGlsZSAodG9kbykgeworCQlzaXplX3QgY2h1bmsgPSB0b2RvOworCisJCWlmIChjaHVuayA+IDQwOTYpCisJCQljaHVuayA9IDQwOTY7CS8qIEp1c3QgZm9yIGxhdGVuY3kgcmVhc29ucyAqLworCQlpZiAoY2xlYXJfdXNlcihidWYsIGNodW5rKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlidWYgKz0gY2h1bms7CisJCXRvZG8gLT0gY2h1bms7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgbW1hcF96ZXJvKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQoreworCXJldHVybiAtRU5PU1lTOworfQorI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfZnVsbChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gLUVOT1NQQzsKK30KKworLyoKKyAqIFNwZWNpYWwgbHNlZWsoKSBmdW5jdGlvbiBmb3IgL2Rldi9udWxsIGFuZCAvZGV2L3plcm8uICBNb3N0IG5vdGFibHksIHlvdQorICogY2FuIGZvcGVuKCkgYm90aCBkZXZpY2VzIHdpdGggImEiIG5vdy4gIFRoaXMgd2FzIHByZXZpb3VzbHkgaW1wb3NzaWJsZS4KKyAqIC0tIFNSQi4KKyAqLworCitzdGF0aWMgbG9mZl90IG51bGxfbHNlZWsoc3RydWN0IGZpbGUgKiBmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZykKK3sKKwlyZXR1cm4gZmlsZS0+Zl9wb3MgPSAwOworfQorCisvKgorICogVGhlIG1lbW9yeSBkZXZpY2VzIHVzZSB0aGUgZnVsbCAzMi82NCBiaXRzIG9mIHRoZSBvZmZzZXQsIGFuZCBzbyB3ZSBjYW5ub3QKKyAqIGNoZWNrIGFnYWluc3QgbmVnYXRpdmUgYWRkcmVzc2VzOiB0aGV5IGFyZSBvay4gVGhlIHJldHVybiB2YWx1ZSBpcyB3ZWlyZCwKKyAqIHRob3VnaCwgaW4gdGhhdCBjYXNlICgwKS4KKyAqCisgKiBhbHNvIG5vdGUgdGhhdCBzZWVraW5nIHJlbGF0aXZlIHRvIHRoZSAiZW5kIG9mIGZpbGUiIGlzbid0IHN1cHBvcnRlZDoKKyAqIGl0IGhhcyBubyBtZWFuaW5nLCBzbyBpdCByZXR1cm5zIC1FSU5WQUwuCisgKi8KK3N0YXRpYyBsb2ZmX3QgbWVtb3J5X2xzZWVrKHN0cnVjdCBmaWxlICogZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJbG9mZl90IHJldDsKKworCWRvd24oJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJc3dpdGNoIChvcmlnKSB7CisJCWNhc2UgMDoKKwkJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCQkJcmV0ID0gZmlsZS0+Zl9wb3M7CisJCQlmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZmlsZS0+Zl9wb3MgKz0gb2Zmc2V0OworCQkJcmV0ID0gZmlsZS0+Zl9wb3M7CisJCQlmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJfQorCXVwKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9wb3J0KHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJcmV0dXJuIGNhcGFibGUoQ0FQX1NZU19SQVdJTykgPyAwIDogLUVQRVJNOworfQorCisjZGVmaW5lIHplcm9fbHNlZWsJbnVsbF9sc2VlaworI2RlZmluZSBmdWxsX2xzZWVrICAgICAgbnVsbF9sc2VlaworI2RlZmluZSB3cml0ZV96ZXJvCXdyaXRlX251bGwKKyNkZWZpbmUgcmVhZF9mdWxsICAgICAgIHJlYWRfemVybworI2RlZmluZSBvcGVuX21lbQlvcGVuX3BvcnQKKyNkZWZpbmUgb3Blbl9rbWVtCW9wZW5fbWVtCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1lbV9mb3BzID0geworCS5sbHNlZWsJCT0gbWVtb3J5X2xzZWVrLAorCS5yZWFkCQk9IHJlYWRfbWVtLAorCS53cml0ZQkJPSB3cml0ZV9tZW0sCisJLm1tYXAJCT0gbW1hcF9tZW0sCisJLm9wZW4JCT0gb3Blbl9tZW0sCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBrbWVtX2ZvcHMgPSB7CisJLmxsc2VlawkJPSBtZW1vcnlfbHNlZWssCisJLnJlYWQJCT0gcmVhZF9rbWVtLAorCS53cml0ZQkJPSB3cml0ZV9rbWVtLAorCS5tbWFwCQk9IG1tYXBfa21lbSwKKwkub3BlbgkJPSBvcGVuX2ttZW0sCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBudWxsX2ZvcHMgPSB7CisJLmxsc2VlawkJPSBudWxsX2xzZWVrLAorCS5yZWFkCQk9IHJlYWRfbnVsbCwKKwkud3JpdGUJCT0gd3JpdGVfbnVsbCwKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19JU0EpIHx8ICFkZWZpbmVkKF9fbWM2ODAwMF9fKQorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcG9ydF9mb3BzID0geworCS5sbHNlZWsJCT0gbWVtb3J5X2xzZWVrLAorCS5yZWFkCQk9IHJlYWRfcG9ydCwKKwkud3JpdGUJCT0gd3JpdGVfcG9ydCwKKwkub3BlbgkJPSBvcGVuX3BvcnQsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHplcm9fZm9wcyA9IHsKKwkubGxzZWVrCQk9IHplcm9fbHNlZWssCisJLnJlYWQJCT0gcmVhZF96ZXJvLAorCS53cml0ZQkJPSB3cml0ZV96ZXJvLAorCS5tbWFwCQk9IG1tYXBfemVybywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyB6ZXJvX2JkaSA9IHsKKwkuY2FwYWJpbGl0aWVzCT0gQkRJX0NBUF9NQVBfQ09QWSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1bGxfZm9wcyA9IHsKKwkubGxzZWVrCQk9IGZ1bGxfbHNlZWssCisJLnJlYWQJCT0gcmVhZF9mdWxsLAorCS53cml0ZQkJPSB3cml0ZV9mdWxsLAorfTsKKworc3RhdGljIHNzaXplX3Qga21zZ193cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICp0bXA7CisJaW50IHJldDsKKworCXRtcCA9IGttYWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAodG1wID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldCA9IC1FRkFVTFQ7CisJaWYgKCFjb3B5X2Zyb21fdXNlcih0bXAsIGJ1ZiwgY291bnQpKSB7CisJCXRtcFtjb3VudF0gPSAwOworCQlyZXQgPSBwcmludGsoIiVzIiwgdG1wKTsKKwl9CisJa2ZyZWUodG1wKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBrbXNnX2ZvcHMgPSB7CisJLndyaXRlID0Ja21zZ193cml0ZSwKK307CisKK3N0YXRpYyBpbnQgbWVtb3J5X29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzd2l0Y2ggKGltaW5vcihpbm9kZSkpIHsKKwkJY2FzZSAxOgorCQkJZmlscC0+Zl9vcCA9ICZtZW1fZm9wczsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlmaWxwLT5mX29wID0gJmttZW1fZm9wczsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlmaWxwLT5mX29wID0gJm51bGxfZm9wczsKKwkJCWJyZWFrOworI2lmIGRlZmluZWQoQ09ORklHX0lTQSkgfHwgIWRlZmluZWQoX19tYzY4MDAwX18pCisJCWNhc2UgNDoKKwkJCWZpbHAtPmZfb3AgPSAmcG9ydF9mb3BzOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSA1OgorCQkJZmlscC0+Zl9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJnplcm9fYmRpOworCQkJZmlscC0+Zl9vcCA9ICZ6ZXJvX2ZvcHM7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJZmlscC0+Zl9vcCA9ICZmdWxsX2ZvcHM7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJZmlscC0+Zl9vcCA9ICZyYW5kb21fZm9wczsKKwkJCWJyZWFrOworCQljYXNlIDk6CisJCQlmaWxwLT5mX29wID0gJnVyYW5kb21fZm9wczsKKwkJCWJyZWFrOworCQljYXNlIDExOgorCQkJZmlscC0+Zl9vcCA9ICZrbXNnX2ZvcHM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5YSU87CisJfQorCWlmIChmaWxwLT5mX29wICYmIGZpbHAtPmZfb3AtPm9wZW4pCisJCXJldHVybiBmaWxwLT5mX29wLT5vcGVuKGlub2RlLGZpbHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtZW1vcnlfZm9wcyA9IHsKKwkub3BlbgkJPSBtZW1vcnlfb3BlbiwJLyoganVzdCBhIHNlbGVjdG9yIGZvciB0aGUgcmVhbCBvcGVuICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQJCW1pbm9yOworCWNoYXIJCQkqbmFtZTsKKwl1bW9kZV90CQkJbW9kZTsKKwlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCSpmb3BzOworfSBkZXZsaXN0W10gPSB7IC8qIGxpc3Qgb2YgbWlub3IgZGV2aWNlcyAqLworCXsxLCAibWVtIiwgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCwgJm1lbV9mb3BzfSwKKwl7MiwgImttZW0iLCAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAsICZrbWVtX2ZvcHN9LAorCXszLCAibnVsbCIsICAgIFNfSVJVR08gfCBTX0lXVUdPLCAgICAgICAgICAgJm51bGxfZm9wc30sCisjaWYgZGVmaW5lZChDT05GSUdfSVNBKSB8fCAhZGVmaW5lZChfX21jNjgwMDBfXykKKwl7NCwgInBvcnQiLCAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAsICZwb3J0X2ZvcHN9LAorI2VuZGlmCisJezUsICJ6ZXJvIiwgICAgU19JUlVHTyB8IFNfSVdVR08sICAgICAgICAgICAmemVyb19mb3BzfSwKKwl7NywgImZ1bGwiLCAgICBTX0lSVUdPIHwgU19JV1VHTywgICAgICAgICAgICZmdWxsX2ZvcHN9LAorCXs4LCAicmFuZG9tIiwgIFNfSVJVR08gfCBTX0lXVVNSLCAgICAgICAgICAgJnJhbmRvbV9mb3BzfSwKKwl7OSwgInVyYW5kb20iLCBTX0lSVUdPIHwgU19JV1VTUiwgICAgICAgICAgICZ1cmFuZG9tX2ZvcHN9LAorCXsxMSwia21zZyIsICAgIFNfSVJVR08gfCBTX0lXVVNSLCAgICAgICAgICAgJmttc2dfZm9wc30sCit9OworCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqbWVtX2NsYXNzOworCitzdGF0aWMgaW50IF9faW5pdCBjaHJfZGV2X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmIChyZWdpc3Rlcl9jaHJkZXYoTUVNX01BSk9SLCJtZW0iLCZtZW1vcnlfZm9wcykpCisJCXByaW50aygidW5hYmxlIHRvIGdldCBtYWpvciAlZCBmb3IgbWVtb3J5IGRldnNcbiIsIE1FTV9NQUpPUik7CisKKwltZW1fY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAibWVtIik7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2bGlzdCk7IGkrKykgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZChtZW1fY2xhc3MsCisJCQkJCU1LREVWKE1FTV9NQUpPUiwgZGV2bGlzdFtpXS5taW5vciksCisJCQkJCU5VTEwsIGRldmxpc3RbaV0ubmFtZSk7CisJCWRldmZzX21rX2NkZXYoTUtERVYoTUVNX01BSk9SLCBkZXZsaXN0W2ldLm1pbm9yKSwKKwkJCQlTX0lGQ0hSIHwgZGV2bGlzdFtpXS5tb2RlLCBkZXZsaXN0W2ldLm5hbWUpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworZnNfaW5pdGNhbGwoY2hyX2Rldl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9taXNjLmMgYi9kcml2ZXJzL2NoYXIvbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Mzc1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbWlzYy5jCkBAIC0wLDAgKzEsMzMxIEBACisvKgorICogbGludXgvZHJpdmVycy9jaGFyL21pc2MuYworICoKKyAqIEdlbmVyaWMgbWlzYyBvcGVuIHJvdXRpbmUgYnkgSm9oYW4gTXlyZWVuCisgKgorICogQmFzZWQgb24gY29kZSBmcm9tIExpbnVzCisgKgorICogVGVlbXUgUmFudGFuZW4ncyBNaWNyb3NvZnQgQnVzbW91c2Ugc3VwcG9ydCBhbmQgRGVycmljayBDb2xlJ3MKKyAqICAgY2hhbmdlcyBpbmNvcnBvcmF0ZWQgaW50byAwLjk3cGw0CisgKiAgIGJ5IFBldGVyIENlcnZhc2lvIChwZXRlJXExMDZmbS51dWNwQHd1cG9zdC53dXN0bC5lZHUpICgwOFNFUDkyKQorICogICBTZWUgYnVzbW91c2UuYyBmb3IgcGFydGljdWxhcnMuCisgKgorICogTWFkZSB0aGluZ3MgYSBsb3QgbW9kZSBtb2R1bGFyIC0gZWFzeSB0byBjb21waWxlIGluIGp1c3Qgb25lIG9yIHR3bworICogb2YgdGhlIG1pc2MgZHJpdmVycywgYXMgdGhleSBhcmUgbm93IGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQuIExpbnVzLgorICoKKyAqIFN1cHBvcnQgZm9yIGxvYWRhYmxlIG1vZHVsZXMuIDgtU2VwLTk1IFBoaWxpcCBCbHVuZGVsbCA8cGpiMjdAY2FtLmFjLnVrPgorICoKKyAqIEZpeGVkIGEgZmFpbGluZyBzeW1ib2wgcmVnaXN0ZXIgdG8gZnJlZSB0aGUgZGV2aWNlIHJlZ2lzdHJhdGlvbgorICoJCUFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+IDIxLUphbi05NgorICoKKyAqIER5bmFtaWMgbWlub3JzIGFuZCAvcHJvYy9taWNlIGJ5IEFsZXNzYW5kcm8gUnViaW5pLiAyNi1NYXItOTYKKyAqCisgKiBSZW5hbWVkIHRvIG1pc2MgYW5kIG1pc2NkZXZpY2UgdG8gYmUgbW9yZSBhY2N1cmF0ZS4gQWxhbiBDb3ggMjYtTWFyLTk2CisgKgorICogSGFuZGxpbmcgb2YgbW91c2UgbWlub3IgbnVtYmVycyBmb3Iga2VybmVsZDoKKyAqICBJZGVhIGJ5IEphY3F1ZXMgR2VsaW5hcyA8amFja0Bzb2x1Y29ycC5xYy5jYT4sCisgKiAgYWRhcHRlZCBieSBCam9ybiBFa3dhbGwgPGJqMHJuQGJsb3guc2U+CisgKiAgY29ycmVjdGVkIGJ5IEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CisgKgorICogQ2hhbmdlcyBmb3Iga21vZCAoZnJvbSBrZXJuZWxkKToKKyAqCUN5cnVzIER1cmdpbiA8Y2lkZXJAc3BlYWtlYXN5Lm9yZz4KKyAqCisgKiBBZGRlZCBkZXZmcyBzdXBwb3J0LiBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4gIDEwLUphbi0xOTk4CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKworLyoKKyAqIEhlYWQgZW50cnkgZm9yIHRoZSBkb3VibHkgbGlua2VkIG1pc2NkZXZpY2UgbGlzdAorICovCitzdGF0aWMgTElTVF9IRUFEKG1pc2NfbGlzdCk7CitzdGF0aWMgREVDTEFSRV9NVVRFWChtaXNjX3NlbSk7CisKKy8qCisgKiBBc3NpZ25lZCBudW1iZXJzLCB1c2VkIGZvciBkeW5hbWljIG1pbm9ycworICovCisjZGVmaW5lIERZTkFNSUNfTUlOT1JTIDY0IC8qIGxpa2UgZHluYW1pYyBtYWpvcnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1pc2NfbWlub3JzW0RZTkFNSUNfTUlOT1JTIC8gOF07CisKK2V4dGVybiBpbnQgcnRjX0RQODU3MEFfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgcnRjX01LNDhUMDhfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgcG11X2RldmljZV9pbml0KHZvaWQpOworZXh0ZXJuIGludCB0b3NoX2luaXQodm9pZCk7CitleHRlcm4gaW50IGk4a19pbml0KHZvaWQpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyB2b2lkICptaXNjX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IG1pc2NkZXZpY2UgKnA7CisJbG9mZl90IG9mZiA9IDA7CisKKwlkb3duKCZtaXNjX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmbWlzY19saXN0LCBsaXN0KSB7CisJCWlmICgqcG9zID09IG9mZisrKSAKKwkJCXJldHVybiBwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKm1pc2Nfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm4gPSAoKHN0cnVjdCBtaXNjZGV2aWNlICopdiktPmxpc3QubmV4dDsKKworCSsrKnBvczsKKworCXJldHVybiAobiAhPSAmbWlzY19saXN0KSA/IGxpc3RfZW50cnkobiwgc3RydWN0IG1pc2NkZXZpY2UsIGxpc3QpCisJCSA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG1pc2Nfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJdXAoJm1pc2Nfc2VtKTsKK30KKworc3RhdGljIGludCBtaXNjX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWNvbnN0IHN0cnVjdCBtaXNjZGV2aWNlICpwID0gdjsKKworCXNlcV9wcmludGYoc2VxLCAiJTNpICVzXG4iLCBwLT5taW5vciwgcC0+bmFtZSA/IHAtPm5hbWUgOiAiIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBtaXNjX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gbWlzY19zZXFfc3RhcnQsCisJLm5leHQgID0gbWlzY19zZXFfbmV4dCwKKwkuc3RvcCAgPSBtaXNjX3NlcV9zdG9wLAorCS5zaG93ICA9IG1pc2Nfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IG1pc2Nfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZtaXNjX3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtaXNjX3Byb2NfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBtaXNjX3NlcV9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisjZW5kaWYKKworc3RhdGljIGludCBtaXNjX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBtaXNjZGV2aWNlICpjOworCWludCBlcnIgPSAtRU5PREVWOworCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKm9sZF9mb3BzLCAqbmV3X2ZvcHMgPSBOVUxMOworCQorCWRvd24oJm1pc2Nfc2VtKTsKKwkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZtaXNjX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGMtPm1pbm9yID09IG1pbm9yKSB7CisJCQluZXdfZm9wcyA9IGZvcHNfZ2V0KGMtPmZvcHMpOwkJCisJCQlicmVhazsKKwkJfQorCX0KKwkJCisJaWYgKCFuZXdfZm9wcykgeworCQl1cCgmbWlzY19zZW0pOworCQlyZXF1ZXN0X21vZHVsZSgiY2hhci1tYWpvci0lZC0lZCIsIE1JU0NfTUFKT1IsIG1pbm9yKTsKKwkJZG93bigmbWlzY19zZW0pOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJm1pc2NfbGlzdCwgbGlzdCkgeworCQkJaWYgKGMtPm1pbm9yID09IG1pbm9yKSB7CisJCQkJbmV3X2ZvcHMgPSBmb3BzX2dldChjLT5mb3BzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIW5ld19mb3BzKQorCQkJZ290byBmYWlsOworCX0KKworCWVyciA9IDA7CisJb2xkX2ZvcHMgPSBmaWxlLT5mX29wOworCWZpbGUtPmZfb3AgPSBuZXdfZm9wczsKKwlpZiAoZmlsZS0+Zl9vcC0+b3BlbikgeworCQllcnI9ZmlsZS0+Zl9vcC0+b3Blbihpbm9kZSxmaWxlKTsKKwkJaWYgKGVycikgeworCQkJZm9wc19wdXQoZmlsZS0+Zl9vcCk7CisJCQlmaWxlLT5mX29wID0gZm9wc19nZXQob2xkX2ZvcHMpOworCQl9CisJfQorCWZvcHNfcHV0KG9sZF9mb3BzKTsKK2ZhaWw6CisJdXAoJm1pc2Nfc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAKKyAqIFRPRE8gZm9yIDIuNzoKKyAqICAtIGFkZCBhIHN0cnVjdCBjbGFzc19kZXZpY2UgdG8gc3RydWN0IG1pc2NkZXZpY2UgYW5kIG1ha2UgYWxsIHVzYWdlcyBvZgorICogICAgdGhlbSBkeW5hbWljLgorICovCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqbWlzY19jbGFzczsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWlzY19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBtaXNjX29wZW4sCit9OworCisKKy8qKgorICoJbWlzY19yZWdpc3RlcgktCXJlZ2lzdGVyIGEgbWlzY2VsbGFuZW91cyBkZXZpY2UKKyAqCUBtaXNjOiBkZXZpY2Ugc3RydWN0dXJlCisgKgkKKyAqCVJlZ2lzdGVyIGEgbWlzY2VsbGFuZW91cyBkZXZpY2Ugd2l0aCB0aGUga2VybmVsLiBJZiB0aGUgbWlub3IKKyAqCW51bWJlciBpcyBzZXQgdG8gJU1JU0NfRFlOQU1JQ19NSU5PUiBhIG1pbm9yIG51bWJlciBpcyBhc3NpZ25lZAorICoJYW5kIHBsYWNlZCBpbiB0aGUgbWlub3IgZmllbGQgb2YgdGhlIHN0cnVjdHVyZS4gRm9yIG90aGVyIGNhc2VzCisgKgl0aGUgbWlub3IgbnVtYmVyIHJlcXVlc3RlZCBpcyB1c2VkLgorICoKKyAqCVRoZSBzdHJ1Y3R1cmUgcGFzc2VkIGlzIGxpbmtlZCBpbnRvIHRoZSBrZXJuZWwgYW5kIG1heSBub3QgYmUKKyAqCWRlc3Ryb3llZCB1bnRpbCBpdCBoYXMgYmVlbiB1bnJlZ2lzdGVyZWQuCisgKgorICoJQSB6ZXJvIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJybm8gY29kZSBmb3IKKyAqCWZhaWx1cmUuCisgKi8KKyAKK2ludCBtaXNjX3JlZ2lzdGVyKHN0cnVjdCBtaXNjZGV2aWNlICogbWlzYykKK3sKKwlzdHJ1Y3QgbWlzY2RldmljZSAqYzsKKwlkZXZfdCBkZXY7CisJaW50IGVycjsKKworCWRvd24oJm1pc2Nfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZtaXNjX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGMtPm1pbm9yID09IG1pc2MtPm1pbm9yKSB7CisJCQl1cCgmbWlzY19zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCWlmIChtaXNjLT5taW5vciA9PSBNSVNDX0RZTkFNSUNfTUlOT1IpIHsKKwkJaW50IGkgPSBEWU5BTUlDX01JTk9SUzsKKwkJd2hpbGUgKC0taSA+PSAwKQorCQkJaWYgKCAobWlzY19taW5vcnNbaT4+M10gJiAoMSA8PCAoaSY3KSkpID09IDApCisJCQkJYnJlYWs7CisJCWlmIChpPDApIHsKKwkJCXVwKCZtaXNjX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCW1pc2MtPm1pbm9yID0gaTsKKwl9CisKKwlpZiAobWlzYy0+bWlub3IgPCBEWU5BTUlDX01JTk9SUykKKwkJbWlzY19taW5vcnNbbWlzYy0+bWlub3IgPj4gM10gfD0gMSA8PCAobWlzYy0+bWlub3IgJiA3KTsKKwlpZiAobWlzYy0+ZGV2ZnNfbmFtZVswXSA9PSAnXDAnKSB7CisJCXNucHJpbnRmKG1pc2MtPmRldmZzX25hbWUsIHNpemVvZihtaXNjLT5kZXZmc19uYW1lKSwKKwkJCQkibWlzYy8lcyIsIG1pc2MtPm5hbWUpOworCX0KKwlkZXYgPSBNS0RFVihNSVNDX01BSk9SLCBtaXNjLT5taW5vcik7CisKKwltaXNjLT5jbGFzcyA9IGNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKG1pc2NfY2xhc3MsIGRldiwKKwkJCQkJICAgICAgbWlzYy0+ZGV2LCBtaXNjLT5uYW1lKTsKKwlpZiAoSVNfRVJSKG1pc2MtPmNsYXNzKSkgeworCQllcnIgPSBQVFJfRVJSKG1pc2MtPmNsYXNzKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gZGV2ZnNfbWtfY2RldihkZXYsIFNfSUZDSFJ8U19JUlVTUnxTX0lXVVNSfFNfSVJHUlAsIAorCQkJICAgIG1pc2MtPmRldmZzX25hbWUpOworCWlmIChlcnIpIHsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBBZGQgaXQgdG8gdGhlIGZyb250LCBzbyB0aGF0IGxhdGVyIGRldmljZXMgY2FuICJvdmVycmlkZSIKKwkgKiBlYXJsaWVyIGRlZmF1bHRzCisJICovCisJbGlzdF9hZGQoJm1pc2MtPmxpc3QsICZtaXNjX2xpc3QpOworIG91dDoKKwl1cCgmbWlzY19zZW0pOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICoJbWlzY19kZXJlZ2lzdGVyIC0gdW5yZWdpc3RlciBhIG1pc2NlbGxhbmVvdXMgZGV2aWNlCisgKglAbWlzYzogZGV2aWNlIHRvIHVucmVnaXN0ZXIKKyAqCisgKglVbnJlZ2lzdGVyIGEgbWlzY2VsbGFuZW91cyBkZXZpY2UgdGhhdCB3YXMgcHJldmlvdXNseQorICoJc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgd2l0aCBtaXNjX3JlZ2lzdGVyKCkuIFN1Y2Nlc3MKKyAqCWlzIGluZGljYXRlZCBieSBhIHplcm8gcmV0dXJuLCBhIG5lZ2F0aXZlIGVycm5vIGNvZGUKKyAqCWluZGljYXRlcyBhbiBlcnJvci4KKyAqLworCitpbnQgbWlzY19kZXJlZ2lzdGVyKHN0cnVjdCBtaXNjZGV2aWNlICogbWlzYykKK3sKKwlpbnQgaSA9IG1pc2MtPm1pbm9yOworCisJaWYgKGxpc3RfZW1wdHkoJm1pc2MtPmxpc3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJm1pc2Nfc2VtKTsKKwlsaXN0X2RlbCgmbWlzYy0+bGlzdCk7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoTUlTQ19NQUpPUiwgbWlzYy0+bWlub3IpKTsKKwlkZXZmc19yZW1vdmUobWlzYy0+ZGV2ZnNfbmFtZSk7CisJaWYgKGkgPCBEWU5BTUlDX01JTk9SUyAmJiBpPjApIHsKKwkJbWlzY19taW5vcnNbaT4+M10gJj0gfigxIDw8IChtaXNjLT5taW5vciAmIDcpKTsKKwl9CisJdXAoJm1pc2Nfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChtaXNjX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wobWlzY19kZXJlZ2lzdGVyKTsKKworc3RhdGljIGludCBfX2luaXQgbWlzY19pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKKworCWVudCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJtaXNjIiwgMCwgTlVMTCk7CisJaWYgKGVudCkKKwkJZW50LT5wcm9jX2ZvcHMgPSAmbWlzY19wcm9jX2ZvcHM7CisjZW5kaWYKKwltaXNjX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgIm1pc2MiKTsKKwlpZiAoSVNfRVJSKG1pc2NfY2xhc3MpKQorCQlyZXR1cm4gUFRSX0VSUihtaXNjX2NsYXNzKTsKKyNpZmRlZiBDT05GSUdfTVZNRTE2eAorCXJ0Y19NSzQ4VDA4X2luaXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CVk1FNjAwMAorCXJ0Y19EUDg1NzBBX2luaXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisJcG11X2RldmljZV9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVE9TSElCQQorCXRvc2hfaW5pdCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0k4SworCWk4a19pbml0KCk7CisjZW5kaWYKKwlpZiAocmVnaXN0ZXJfY2hyZGV2KE1JU0NfTUFKT1IsIm1pc2MiLCZtaXNjX2ZvcHMpKSB7CisJCXByaW50aygidW5hYmxlIHRvIGdldCBtYWpvciAlZCBmb3IgbWlzYyBkZXZpY2VzXG4iLAorCQkgICAgICAgTUlTQ19NQUpPUik7CisJCWNsYXNzX3NpbXBsZV9kZXN0cm95KG1pc2NfY2xhc3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CitzdWJzeXNfaW5pdGNhbGwobWlzY19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tbXRpbWVyLmMgYi9kcml2ZXJzL2NoYXIvbW10aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZWRkZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbW10aW1lci5jCkBAIC0wLDAgKzEsNzI1IEBACisvKgorICogSW50ZWwgTXVsdGltZWRpYSBUaW1lciBkZXZpY2UgaW1wbGVtZW50YXRpb24gZm9yIFNHSSBTTiBwbGF0Zm9ybXMuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGRyaXZlciBleHBvcnRzIGFuIEFQSSB0aGF0IHNob3VsZCBiZSBzdXBwb3J0YWJsZSBieSBhbnkgSFBFVCBvciBJQS1QQworICogbXVsdGltZWRpYSB0aW1lci4gIFRoZSBjb2RlIGJlbG93IGlzIGN1cnJlbnRseSBzcGVjaWZpYyB0byB0aGUgU0dJIEFsdGl4CisgKiBTSHViIFJUQywgaG93ZXZlci4KKyAqCisgKiAxMS8wMS8wMSAtIGpiYXJuZXMgLSBpbml0aWFsIHJldmlzaW9uCisgKiA5LzEwLzA0IC0gQ2hyaXN0b3BoIExhbWV0ZXIgLSByZW1vdmUgaW50ZXJydXB0IHN1cHBvcnQgZm9yIGtlcm5lbCBpbmNsdXNpb24KKyAqIDEwLzEvMDQgLSBDaHJpc3RvcGggTGFtZXRlciAtIHByb3ZpZGUgcG9zaXggY2xvY2sgQ0xPQ0tfU0dJX0NZQ0xFCisgKiAxMC8xMy8wNCAtIENocmlzdG9waCBMYW1ldGVyLCBEaW1pdHJpIFNpdmFuaWNoIC0gcHJvdmlkZSB0aW1lciBpbnRlcnJ1cHQKKyAqCQlzdXBwb3J0IHZpYSB0aGUgcG9zaXggdGltZXIgaW50ZXJmYWNlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXgtdGltZXJzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zbi9pbnRyLmg+CisjaW5jbHVkZSA8YXNtL3NuL3NodWJfbW1yLmg+CisjaW5jbHVkZSA8YXNtL3NuL25vZGVwZGEuaD4KKyNpbmNsdWRlIDxhc20vc24vc2h1YmlvLmg+CisKK01PRFVMRV9BVVRIT1IoIkplc3NlIEJhcm5lcyA8amJhcm5lc0BzZ2kuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTR0kgQWx0aXggUlRDIFRpbWVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIG5hbWUgb2YgdGhlIGRldmljZSwgdXN1YWxseSBpbiAvZGV2ICovCisjZGVmaW5lIE1NVElNRVJfTkFNRSAibW10aW1lciIKKyNkZWZpbmUgTU1USU1FUl9ERVNDICJTR0kgQWx0aXggUlRDIFRpbWVyIgorI2RlZmluZSBNTVRJTUVSX1ZFUlNJT04gIjIuMCIKKworI2RlZmluZSBSVENfQklUUyA1NSAvKiA1NSBiaXRzIGZvciB0aGlzIGltcGxlbWVudGF0aW9uICovCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZDsKKworI2RlZmluZSBSVENfQ09VTlRFUl9BRERSICAgICAgICAoKGxvbmcgKilMT0NBTF9NTVJfQUREUihTSF9SVEMpKQorCisjZGVmaW5lIHJ0Y190aW1lKCkgICAgICAgICAgICAgICgqUlRDX0NPVU5URVJfQUREUikKKworc3RhdGljIGludCBtbXRpbWVyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgbW10aW1lcl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisKKy8qCisgKiBQZXJpb2QgaW4gZmVtdG9zZWNvbmRzICgxMF4tMTUgcykKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbW10aW1lcl9mZW10b3BlcmlvZCA9IDA7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1tdGltZXJfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubW1hcCA9CQltbXRpbWVyX21tYXAsCisJLmlvY3RsID0JbW10aW1lcl9pb2N0bCwKK307CisKKy8qCisgKiBXZSBvbmx5IGhhdmUgY29tcGFyaXNvbiByZWdpc3RlcnMgUlRDMS00IGN1cnJlbnRseSBhdmFpbGFibGUgcGVyCisgKiBub2RlLiAgUlRDMCBpcyB1c2VkIGJ5IFNBTC4KKyAqLworI2RlZmluZSBOVU1fQ09NUEFSQVRPUlMgMworLyogQ2hlY2sgZm9yIGFuIFJUQyBpbnRlcnJ1cHQgcGVuZGluZyAqLworc3RhdGljIGludCBpbmxpbmUgbW10aW1lcl9pbnRfcGVuZGluZyhpbnQgY29tcGFyYXRvcikKK3sKKwlpZiAoSFVCX0woKHVuc2lnbmVkIGxvbmcgKilMT0NBTF9NTVJfQUREUihTSF9FVkVOVF9PQ0NVUlJFRCkpICYKKwkJCVNIX0VWRU5UX09DQ1VSUkVEX1JUQzFfSU5UX01BU0sgPDwgY29tcGFyYXRvcikKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKy8qIENsZWFyIHRoZSBSVEMgaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCitzdGF0aWMgdm9pZCBpbmxpbmUgbW10aW1lcl9jbHJfaW50X3BlbmRpbmcoaW50IGNvbXBhcmF0b3IpCit7CisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX0VWRU5UX09DQ1VSUkVEX0FMSUFTKSwKKwkJU0hfRVZFTlRfT0NDVVJSRURfUlRDMV9JTlRfTUFTSyA8PCBjb21wYXJhdG9yKTsKK30KKworLyogU2V0dXAgdGltZXIgb24gY29tcGFyYXRvciBSVEMxICovCitzdGF0aWMgdm9pZCBpbmxpbmUgbW10aW1lcl9zZXR1cF9pbnRfMCh1NjQgZXhwaXJlcykKK3sKKwl1NjQgdmFsOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfUlRDMV9JTlRfRU5BQkxFKSwgMFVMKTsKKworCS8qIEluaXRpYWxpemUgY29tcGFyYXRvciB2YWx1ZSAqLworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9JTlRfQ01QQiksIC0xTCk7CisKKwkvKiBDbGVhciBwZW5kaW5nIGJpdCAqLworCW1tdGltZXJfY2xyX2ludF9wZW5kaW5nKDApOworCisJdmFsID0gKCh1NjQpU0dJX01NVElNRVJfVkVDVE9SIDw8IFNIX1JUQzFfSU5UX0NPTkZJR19JRFhfU0hGVCkgfAorCQkoKHU2NCljcHVfcGh5c2ljYWxfaWQoc21wX3Byb2Nlc3Nvcl9pZCgpKSA8PAorCQkJU0hfUlRDMV9JTlRfQ09ORklHX1BJRF9TSEZUKTsKKworCS8qIFNldCBjb25maWd1cmF0aW9uICovCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzFfSU5UX0NPTkZJRyksIHZhbCk7CisKKwkvKiBFbmFibGUgUlRDIGludGVycnVwdHMgKi8KKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfUlRDMV9JTlRfRU5BQkxFKSwgMVVMKTsKKworCS8qIEluaXRpYWxpemUgY29tcGFyYXRvciB2YWx1ZSAqLworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9JTlRfQ01QQiksIGV4cGlyZXMpOworCisKK30KKworLyogU2V0dXAgdGltZXIgb24gY29tcGFyYXRvciBSVEMyICovCitzdGF0aWMgdm9pZCBpbmxpbmUgbW10aW1lcl9zZXR1cF9pbnRfMSh1NjQgZXhwaXJlcykKK3sKKwl1NjQgdmFsOworCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzJfSU5UX0VOQUJMRSksIDBVTCk7CisKKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfSU5UX0NNUEMpLCAtMUwpOworCisJbW10aW1lcl9jbHJfaW50X3BlbmRpbmcoMSk7CisKKwl2YWwgPSAoKHU2NClTR0lfTU1USU1FUl9WRUNUT1IgPDwgU0hfUlRDMl9JTlRfQ09ORklHX0lEWF9TSEZUKSB8CisJCSgodTY0KWNwdV9waHlzaWNhbF9pZChzbXBfcHJvY2Vzc29yX2lkKCkpIDw8CisJCQlTSF9SVEMyX0lOVF9DT05GSUdfUElEX1NIRlQpOworCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzJfSU5UX0NPTkZJRyksIHZhbCk7CisKKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfUlRDMl9JTlRfRU5BQkxFKSwgMVVMKTsKKworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9JTlRfQ01QQyksIGV4cGlyZXMpOworfQorCisvKiBTZXR1cCB0aW1lciBvbiBjb21wYXJhdG9yIFJUQzMgKi8KK3N0YXRpYyB2b2lkIGlubGluZSBtbXRpbWVyX3NldHVwX2ludF8yKHU2NCBleHBpcmVzKQoreworCXU2NCB2YWw7CisKKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfUlRDM19JTlRfRU5BQkxFKSwgMFVMKTsKKworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9JTlRfQ01QRCksIC0xTCk7CisKKwltbXRpbWVyX2Nscl9pbnRfcGVuZGluZygyKTsKKworCXZhbCA9ICgodTY0KVNHSV9NTVRJTUVSX1ZFQ1RPUiA8PCBTSF9SVEMzX0lOVF9DT05GSUdfSURYX1NIRlQpIHwKKwkJKCh1NjQpY3B1X3BoeXNpY2FsX2lkKHNtcF9wcm9jZXNzb3JfaWQoKSkgPDwKKwkJCVNIX1JUQzNfSU5UX0NPTkZJR19QSURfU0hGVCk7CisKKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfUlRDM19JTlRfQ09ORklHKSwgdmFsKTsKKworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9SVEMzX0lOVF9FTkFCTEUpLCAxVUwpOworCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX0lOVF9DTVBEKSwgZXhwaXJlcyk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCBhbmQgcHJlZW1wdGlvbiBvZmYKKyAqIGluIG9yZGVyIHRvIGluc3VyZSB0aGF0IHRoZSBzZXR1cCBzdWNjZWVkcyBpbiBhIGRldGVybWluaXN0aWMgdGltZSBmcmFtZS4KKyAqIEl0IHdpbGwgY2hlY2sgaWYgdGhlIGludGVycnVwdCBzZXR1cCBzdWNjZWVkZWQuCisgKi8KK3N0YXRpYyBpbnQgaW5saW5lIG1tdGltZXJfc2V0dXAoaW50IGNvbXBhcmF0b3IsIHVuc2lnbmVkIGxvbmcgZXhwaXJlcykKK3sKKworCXN3aXRjaCAoY29tcGFyYXRvcikgeworCWNhc2UgMDoKKwkJbW10aW1lcl9zZXR1cF9pbnRfMChleHBpcmVzKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltbXRpbWVyX3NldHVwX2ludF8xKGV4cGlyZXMpOworCQlicmVhazsKKwljYXNlIDI6CisJCW1tdGltZXJfc2V0dXBfaW50XzIoZXhwaXJlcyk7CisJCWJyZWFrOworCX0KKwkvKiBXZSBtaWdodCd2ZSBtaXNzZWQgb3VyIGV4cGlyYXRpb24gdGltZSAqLworCWlmIChydGNfdGltZSgpIDwgZXhwaXJlcykKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIElmIGFuIGludGVycnVwdCBpcyBhbHJlYWR5IHBlbmRpbmcgdGhlbiBpdHMgb2theQorCSAqIGlmIG5vdCB0aGVuIHdlIGZhaWxlZAorCSAqLworCXJldHVybiBtbXRpbWVyX2ludF9wZW5kaW5nKGNvbXBhcmF0b3IpOworfQorCitzdGF0aWMgaW50IGlubGluZSBtbXRpbWVyX2Rpc2FibGVfaW50KGxvbmcgbmFzaWQsIGludCBjb21wYXJhdG9yKQoreworCXN3aXRjaCAoY29tcGFyYXRvcikgeworCWNhc2UgMDoKKwkJbmFzaWQgPT0gLTEgPyBIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfUlRDMV9JTlRfRU5BQkxFKSwKKwkJCTBVTCkgOiBSRU1PVEVfSFVCX1MobmFzaWQsIFNIX1JUQzFfSU5UX0VOQUJMRSwgMFVMKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQluYXNpZCA9PSAtMSA/IEhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9SVEMyX0lOVF9FTkFCTEUpLAorCQkJMFVMKSA6IFJFTU9URV9IVUJfUyhuYXNpZCwgU0hfUlRDMl9JTlRfRU5BQkxFLCAwVUwpOworCQlicmVhazsKKwljYXNlIDI6CisJCW5hc2lkID09IC0xID8gSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzNfSU5UX0VOQUJMRSksCisJCQkwVUwpIDogUkVNT1RFX0hVQl9TKG5hc2lkLCBTSF9SVEMzX0lOVF9FTkFCTEUsIDBVTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBUSU1FUl9PRkYgMHhiYWRjYWJMTAorCisvKiBUaGVyZSBpcyBvbmUgb2YgdGhlc2UgZm9yIGVhY2ggY29tcGFyYXRvciAqLwordHlwZWRlZiBzdHJ1Y3QgbW10aW1lciB7CisJc3BpbmxvY2tfdCBsb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwlzdHJ1Y3Qga19pdGltZXIgKnRpbWVyOworCWludCBpOworCWludCBjcHU7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7Cit9IG1tdGltZXJfdDsKKworLyoKKyAqIFRvdGFsIG51bWJlciBvZiBjb21wYXJhdG9ycyBpcyBjb21wYXJhdG9ycy9ub2RlICogTUFYIG5vZGVzL3J1bm5pbmcga2VybmVsCisgKi8KK3N0YXRpYyBtbXRpbWVyX3QgdGltZXJzW05VTV9DT01QQVJBVE9SUypNQVhfQ09NUEFDVF9OT0RFU107CisKKy8qKgorICogbW10aW1lcl9pb2N0bCAtIGlvY3RsIGludGVyZmFjZSBmb3IgL2Rldi9tbXRpbWVyCisgKiBAaW5vZGU6IGlub2RlIG9mIHRoZSBkZXZpY2UKKyAqIEBmaWxlOiBmaWxlIHN0cnVjdHVyZSBmb3IgdGhlIGRldmljZQorICogQGNtZDogY29tbWFuZCB0byBleGVjdXRlCisgKiBAYXJnOiBvcHRpb25hbCBhcmd1bWVudCB0byBjb21tYW5kCisgKgorICogRXhlY3V0ZXMgdGhlIGNvbW1hbmQgc3BlY2lmaWVkIGJ5IEBjbWQuICBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIDwgMCBmb3IKKyAqIGZhaWx1cmUuCisgKgorICogVmFsaWQgY29tbWFuZHM6CisgKgorICogJU1NVElNRVJfR0VUT0ZGU0VUIC0gU2hvdWxkIHJldHVybiB0aGUgb2Zmc2V0IChyZWxhdGl2ZSB0byB0aGUgc3RhcnQKKyAqIG9mIHRoZSBwYWdlIHdoZXJlIHRoZSByZWdpc3RlcnMgYXJlIG1hcHBlZCkgZm9yIHRoZSBjb3VudGVyIGluIHF1ZXN0aW9uLgorICoKKyAqICVNTVRJTUVSX0dFVFJFUyAtIFJldHVybnMgdGhlIHJlc29sdXRpb24gb2YgdGhlIGNsb2NrIGluIGZlbXRvICgxMF4tMTUpCisgKiBzZWNvbmRzCisgKgorICogJU1NVElNRVJfR0VURlJFUSAtIENvcGllcyB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjbG9jayBpbiBIeiB0byB0aGUgYWRkcmVzcworICogc3BlY2lmaWVkIGJ5IEBhcmcKKyAqCisgKiAlTU1USU1FUl9HRVRCSVRTIC0gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNsb2NrJ3MgY291bnRlcgorICoKKyAqICVNTVRJTUVSX01NQVBBVkFJTCAtIFJldHVybnMgMSBpZiB0aGUgcmVnaXN0ZXJzIGNhbiBiZSBtbWFwJ2QgaW50byB1c2Vyc3BhY2UKKyAqCisgKiAlTU1USU1FUl9HRVRDT1VOVEVSIC0gR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgY291bnRlciBhbmQgcGxhY2VzIGl0CisgKiBpbiB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgYnkgQGFyZy4KKyAqLworc3RhdGljIGludCBtbXRpbWVyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE1NVElNRVJfR0VUT0ZGU0VUOgkvKiBvZmZzZXQgb2YgdGhlIGNvdW50ZXIgKi8KKwkJLyoKKwkJICogU04gUlRDIHJlZ2lzdGVycyBhcmUgb24gdGhlaXIgb3duIDY0ayBwYWdlCisJCSAqLworCQlpZihQQUdFX1NJWkUgPD0gKDEgPDwgMTYpKQorCQkJcmV0ID0gKCgobG9uZylSVENfQ09VTlRFUl9BRERSKSAmIChQQUdFX1NJWkUtMSkpIC8gODsKKwkJZWxzZQorCQkJcmV0ID0gLUVOT1NZUzsKKwkJYnJlYWs7CisKKwljYXNlIE1NVElNRVJfR0VUUkVTOiAvKiByZXNvbHV0aW9uIG9mIHRoZSBjbG9jayBpbiAxMF4tMTUgcyAqLworCQlpZihjb3B5X3RvX3VzZXIoKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnLAorCQkJCSZtbXRpbWVyX2ZlbXRvcGVyaW9kLCBzaXplb2YodW5zaWduZWQgbG9uZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBNTVRJTUVSX0dFVEZSRVE6IC8qIGZyZXF1ZW5jeSBpbiBIeiAqLworCQlpZihjb3B5X3RvX3VzZXIoKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnLAorCQkJCSZzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQsCisJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXQgPSAwOworCQlicmVhazsKKworCWNhc2UgTU1USU1FUl9HRVRCSVRTOiAvKiBudW1iZXIgb2YgYml0cyBpbiB0aGUgY2xvY2sgKi8KKwkJcmV0ID0gUlRDX0JJVFM7CisJCWJyZWFrOworCisJY2FzZSBNTVRJTUVSX01NQVBBVkFJTDogLyogY2FuIHdlIG1tYXAgdGhlIGNsb2NrIGludG8gdXNlcnNwYWNlPyAqLworCQlyZXQgPSAoUEFHRV9TSVpFIDw9ICgxIDw8IDE2KSkgPyAxIDogMDsKKwkJYnJlYWs7CisKKwljYXNlIE1NVElNRVJfR0VUQ09VTlRFUjoKKwkJaWYoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZywKKwkJCQlSVENfQ09VTlRFUl9BRERSLCBzaXplb2YodW5zaWduZWQgbG9uZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbW10aW1lcl9tbWFwIC0gbWFwcyB0aGUgY2xvY2sncyByZWdpc3RlcnMgaW50byB1c2Vyc3BhY2UKKyAqIEBmaWxlOiBmaWxlIHN0cnVjdHVyZSBmb3IgdGhlIGRldmljZQorICogQHZtYTogVk1BIHRvIG1hcCB0aGUgcmVnaXN0ZXJzIGludG8KKyAqCisgKiBDYWxscyByZW1hcF9wZm5fcmFuZ2UoKSB0byBtYXAgdGhlIGNsb2NrJ3MgcmVnaXN0ZXJzIGludG8KKyAqIHRoZSBjYWxsaW5nIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgbW10aW1lcl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl1bnNpZ25lZCBsb25nIG1tdGltZXJfYWRkcjsKKworCWlmICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQgIT0gUEFHRV9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoUEFHRV9TSVpFID4gKDEgPDwgMTYpKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCXZtYS0+dm1fZmxhZ3MgfD0gKFZNX0lPIHwgVk1fU0hNIHwgVk1fTE9DS0VEICk7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKworCW1tdGltZXJfYWRkciA9IF9fcGEoUlRDX0NPVU5URVJfQUREUik7CisJbW10aW1lcl9hZGRyICY9IH4oUEFHRV9TSVpFIC0gMSk7CisJbW10aW1lcl9hZGRyICY9IDB4ZmZmZmZmZmZmZmZmZmZmVUw7CisKKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgbW10aW1lcl9hZGRyID4+IFBBR0VfU0hJRlQsCisJCQkJCVBBR0VfU0laRSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmVtYXBfcGZuX3JhbmdlIGZhaWxlZCBpbiBtbXRpbWVyLmNcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIG1tdGltZXJfbWlzY2RldiA9IHsKKwlTR0lfTU1USU1FUiwKKwlNTVRJTUVSX05BTUUsCisJJm1tdGltZXJfZm9wcworfTsKKworc3RhdGljIHN0cnVjdCB0aW1lc3BlYyBzZ2lfY2xvY2tfb2Zmc2V0Oworc3RhdGljIGludCBzZ2lfY2xvY2tfcGVyaW9kOworCisvKgorICogUG9zaXggVGltZXIgSW50ZXJmYWNlCisgKi8KKworc3RhdGljIHN0cnVjdCB0aW1lc3BlYyBzZ2lfY2xvY2tfb2Zmc2V0Oworc3RhdGljIGludCBzZ2lfY2xvY2tfcGVyaW9kOworCitzdGF0aWMgaW50IHNnaV9jbG9ja19nZXQoY2xvY2tpZF90IGNsb2NraWQsIHN0cnVjdCB0aW1lc3BlYyAqdHApCit7CisJdTY0IG5zZWM7CisKKwluc2VjID0gcnRjX3RpbWUoKSAqIHNnaV9jbG9ja19wZXJpb2QKKwkJCSsgc2dpX2Nsb2NrX29mZnNldC50dl9uc2VjOworCXRwLT50dl9zZWMgPSBkaXZfbG9uZ19sb25nX3JlbShuc2VjLCBOU0VDX1BFUl9TRUMsICZ0cC0+dHZfbnNlYykKKwkJCSsgc2dpX2Nsb2NrX29mZnNldC50dl9zZWM7CisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgaW50IHNnaV9jbG9ja19zZXQoY2xvY2tpZF90IGNsb2NraWQsIHN0cnVjdCB0aW1lc3BlYyAqdHApCit7CisKKwl1NjQgbnNlYzsKKwl1NjQgcmVtOworCisJbnNlYyA9IHJ0Y190aW1lKCkgKiBzZ2lfY2xvY2tfcGVyaW9kOworCisJc2dpX2Nsb2NrX29mZnNldC50dl9zZWMgPSB0cC0+dHZfc2VjIC0gZGl2X2xvbmdfbG9uZ19yZW0obnNlYywgTlNFQ19QRVJfU0VDLCAmcmVtKTsKKworCWlmIChyZW0gPD0gdHAtPnR2X25zZWMpCisJCXNnaV9jbG9ja19vZmZzZXQudHZfbnNlYyA9IHRwLT50dl9zZWMgLSByZW07CisJZWxzZSB7CisJCXNnaV9jbG9ja19vZmZzZXQudHZfbnNlYyA9IHRwLT50dl9zZWMgKyBOU0VDX1BFUl9TRUMgLSByZW07CisJCXNnaV9jbG9ja19vZmZzZXQudHZfc2VjLS07CisJfQorCXJldHVybiAwOworfQorCisvKgorICogU2NoZWR1bGUgdGhlIG5leHQgcGVyaW9kaWMgaW50ZXJydXB0LiBUaGlzIGZ1bmN0aW9uIHdpbGwgYXR0ZW1wdAorICogdG8gc2NoZWR1bGUgYSBwZXJpb2RpYyBpbnRlcnJ1cHQgbGF0ZXIgaWYgbmVjZXNzYXJ5LiBJZiB0aGUgc2NoZWR1bGluZworICogb2YgYW4gaW50ZXJydXB0IGZhaWxzIHRoZW4gdGhlIHRpbWUgdG8gc2tpcCBpcyBsZW5ndGhlbmVkCisgKiBleHBvbmVudGlhbGx5IGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBuZXh0IGludGVycnVwdAorICogY2FuIGJlIHByb3Blcmx5IHNjaGVkdWxlZC4uCisgKi8KK3N0YXRpYyBpbnQgaW5saW5lIHJlc2NoZWR1bGVfcGVyaW9kaWNfdGltZXIobW10aW1lcl90ICp4KQoreworCWludCBuOworCXN0cnVjdCBrX2l0aW1lciAqdCA9IHgtPnRpbWVyOworCisJdC0+aXQubW10aW1lci5jbG9jayA9IHgtPmk7CisJdC0+aXRfb3ZlcnJ1bi0tOworCisJbiA9IDA7CisJZG8geworCisJCXQtPml0Lm1tdGltZXIuZXhwaXJlcyArPSB0LT5pdC5tbXRpbWVyLmluY3IgPDwgbjsKKwkJdC0+aXRfb3ZlcnJ1biArPSAxIDw8IG47CisJCW4rKzsKKwkJaWYgKG4gPiAyMCkKKwkJCXJldHVybiAxOworCisJfSB3aGlsZSAoIW1tdGltZXJfc2V0dXAoeC0+aSwgdC0+aXQubW10aW1lci5leHBpcmVzKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtbXRpbWVyX2ludGVycnVwdCAtIHRpbWVyIGludGVycnVwdCBoYW5kbGVyCisgKiBAaXJxOiBpcnEgcmVjZWl2ZWQKKyAqIEBkZXZfaWQ6IGRldmljZSB0aGUgaXJxIGNhbWUgZnJvbQorICogQHJlZ3M6IHJlZ2lzdGVyIHN0YXRlIHVwb24gcmVjZWlwdCBvZiB0aGUgaW50ZXJydXB0CisgKgorICogQ2FsbGVkIHdoZW4gb25lIG9mIHRoZSBjb21hcmF0b3JzIG1hdGNoZXMgdGhlIGNvdW50ZXIsIFRoaXMKKyAqIHJvdXRpbmUgd2lsbCBzZW5kIHNpZ25hbHMgdG8gcHJvY2Vzc2VzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQKKyAqIHRoZW0uCisgKgorICogVGhpcyBpbnRlcnJ1cHQgaXMgcnVuIGluIGFuIGludGVycnVwdCBjb250ZXh0CisgKiBieSB0aGUgU0hVQi4gSXQgaXMgdGhlcmVmb3JlIHNhZmUgdG8gbG9jYWxseSBhY2Nlc3MgU0h1YgorICogcmVnaXN0ZXJzLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK21tdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGk7CisJbW10aW1lcl90ICpiYXNlID0gdGltZXJzICsgY3B1aWRfdG9fY25vZGVpZChzbXBfcHJvY2Vzc29yX2lkKCkpICoKKwkJCQkJCU5VTV9DT01QQVJBVE9SUzsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZXMgPSAwOworCWludCByZXN1bHQgPSBJUlFfTk9ORTsKKworCS8qCisJICogRG8gdGhpcyBvbmNlIGZvciBlYWNoIGNvbXBhcmlzb24gcmVnaXN0ZXIKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPTVBBUkFUT1JTOyBpKyspIHsKKwkJLyogTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBnZXQgcmV1c2VkIGJlZm9yZSB0YXNrbGV0X3NjaGVkICovCisJCXNwaW5fbG9jaygmYmFzZVtpXS5sb2NrKTsKKwkJaWYgKGJhc2VbaV0uY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkgeworCQkJaWYgKGJhc2VbaV0udGltZXIpCisJCQkJZXhwaXJlcyA9IGJhc2VbaV0udGltZXItPml0Lm1tdGltZXIuZXhwaXJlczsKKwkJCS8qIGV4cGlyZXMgdGVzdCB3b24ndCB3b3JrIHdpdGggc2hhcmVkIGlycXMgKi8KKwkJCWlmICgobW10aW1lcl9pbnRfcGVuZGluZyhpKSA+IDApIHx8CisJCQkJKGV4cGlyZXMgJiYgKGV4cGlyZXMgPCBydGNfdGltZSgpKSkpIHsKKwkJCQltbXRpbWVyX2Nscl9pbnRfcGVuZGluZyhpKTsKKwkJCQl0YXNrbGV0X3NjaGVkdWxlKCZiYXNlW2ldLnRhc2tsZXQpOworCQkJCXJlc3VsdCA9IElSUV9IQU5ETEVEOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZiYXNlW2ldLmxvY2spOworCQlleHBpcmVzID0gMDsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBtbXRpbWVyX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKSB7CisJbW10aW1lcl90ICp4ID0gKG1tdGltZXJfdCAqKWRhdGE7CisJc3RydWN0IGtfaXRpbWVyICp0ID0geC0+dGltZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh0ID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIFNlbmQgc2lnbmFsIGFuZCBkZWFsIHdpdGggcGVyaW9kaWMgc2lnbmFscyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ0LT5pdF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZ4LT5sb2NrKTsKKwkvKiBJZiB0aW1lciB3YXMgZGVsZXRlZCBiZXR3ZWVuIGludGVycnVwdCBhbmQgaGVyZSwgbGVhdmUgKi8KKwlpZiAodCAhPSB4LT50aW1lcikKKwkJZ290byBvdXQ7CisJdC0+aXRfb3ZlcnJ1biA9IDA7CisKKwlpZiAodGFza2xpc3RfbG9jay53cml0ZV9sb2NrIHx8IHBvc2l4X3RpbWVyX2V2ZW50KHQsIDApICE9IDApIHsKKworCQkvLyBwcmludGsoS0VSTl9XQVJOSU5HICJtbXRpbWVyOiBjYW5ub3QgZGVsaXZlciBzaWduYWwuXG4iKTsKKworCQl0LT5pdF9vdmVycnVuKys7CisJfQorCWlmKHQtPml0Lm1tdGltZXIuaW5jcikgeworCQkvKiBQZXJpb2RpYyB0aW1lciAqLworCQlpZiAocmVzY2hlZHVsZV9wZXJpb2RpY190aW1lcih4KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibW10aW1lcjogdW5hYmxlIHRvIHJlc2NoZWR1bGVcbiIpOworCQkJeC0+dGltZXIgPSBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJLyogRW5zdXJlIHdlIGRvbid0IGZhbHNlIHRyaWdnZXIgaW4gbW10aW1lcl9pbnRlcnJ1cHQgKi8KKwkJdC0+aXQubW10aW1lci5leHBpcmVzID0gMDsKKwl9CisJdC0+aXRfb3ZlcnJ1bl9sYXN0ID0gdC0+aXRfb3ZlcnJ1bjsKK291dDoKKwlzcGluX3VubG9jaygmeC0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+aXRfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHNnaV90aW1lcl9jcmVhdGUoc3RydWN0IGtfaXRpbWVyICp0aW1lcikKK3sKKwkvKiBJbnN1cmUgdGhhdCBhIG5ld2x5IGNyZWF0ZWQgdGltZXIgaXMgb2ZmICovCisJdGltZXItPml0Lm1tdGltZXIuY2xvY2sgPSBUSU1FUl9PRkY7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZG9lcyBub3QgcmVhbGx5IGRlbGV0ZSBhIHRpbWVyLiBJdCBqdXN0IGluc3VyZXMKKyAqIHRoYXQgdGhlIHRpbWVyIGlzIG5vdCBhY3RpdmUKKyAqCisgKiBBc3N1bXB0aW9uOiBpdF9sb2NrIGlzIGFscmVhZHkgaGVsZCB3aXRoIGlycSdzIGRpc2FibGVkCisgKi8KK3N0YXRpYyBpbnQgc2dpX3RpbWVyX2RlbChzdHJ1Y3Qga19pdGltZXIgKnRpbXIpCit7CisJaW50IGkgPSB0aW1yLT5pdC5tbXRpbWVyLmNsb2NrOworCWNub2RlaWRfdCBub2RlaWQgPSB0aW1yLT5pdC5tbXRpbWVyLm5vZGU7CisJbW10aW1lcl90ICp0ID0gdGltZXJzICsgbm9kZWlkICogTlVNX0NPTVBBUkFUT1JTICtpOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKKwlpZiAoaSAhPSBUSU1FUl9PRkYpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnQtPmxvY2ssIGlycWZsYWdzKTsKKwkJbW10aW1lcl9kaXNhYmxlX2ludChjbm9kZWlkX3RvX25hc2lkKG5vZGVpZCksaSk7CisJCXQtPnRpbWVyID0gTlVMTDsKKwkJdGltci0+aXQubW10aW1lci5jbG9jayA9IFRJTUVSX09GRjsKKwkJdGltci0+aXQubW10aW1lci5leHBpcmVzID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+bG9jaywgaXJxZmxhZ3MpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSB0aW1lc3BlY190b19ucyh4KSAoKHgpLnR2X25zZWMgKyAoeCkudHZfc2VjICogTlNFQ19QRVJfU0VDKQorI2RlZmluZSBuc190b190aW1lc3BlYyh0cywgbnNlYykgKHRzKS50dl9zZWMgPSBkaXZfbG9uZ19sb25nX3JlbShuc2VjLCBOU0VDX1BFUl9TRUMsICYodHMpLnR2X25zZWMpCisKKy8qIEFzc3VtcHRpb246IGl0X2xvY2sgaXMgYWxyZWFkeSBoZWxkIHdpdGggaXJxJ3MgZGlzYWJsZWQgKi8KK3N0YXRpYyB2b2lkIHNnaV90aW1lcl9nZXQoc3RydWN0IGtfaXRpbWVyICp0aW1yLCBzdHJ1Y3QgaXRpbWVyc3BlYyAqY3VyX3NldHRpbmcpCit7CisKKwlpZiAodGltci0+aXQubW10aW1lci5jbG9jayA9PSBUSU1FUl9PRkYpIHsKKwkJY3VyX3NldHRpbmctPml0X2ludGVydmFsLnR2X25zZWMgPSAwOworCQljdXJfc2V0dGluZy0+aXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKKwkJY3VyX3NldHRpbmctPml0X3ZhbHVlLnR2X25zZWMgPSAwOworCQljdXJfc2V0dGluZy0+aXRfdmFsdWUudHZfc2VjID0wOworCQlyZXR1cm47CisJfQorCisJbnNfdG9fdGltZXNwZWMoY3VyX3NldHRpbmctPml0X2ludGVydmFsLCB0aW1yLT5pdC5tbXRpbWVyLmluY3IgKiBzZ2lfY2xvY2tfcGVyaW9kKTsKKwluc190b190aW1lc3BlYyhjdXJfc2V0dGluZy0+aXRfdmFsdWUsICh0aW1yLT5pdC5tbXRpbWVyLmV4cGlyZXMgLSBydGNfdGltZSgpKSogc2dpX2Nsb2NrX3BlcmlvZCk7CisJcmV0dXJuOworfQorCisKK3N0YXRpYyBpbnQgc2dpX3RpbWVyX3NldChzdHJ1Y3Qga19pdGltZXIgKnRpbXIsIGludCBmbGFncywKKwlzdHJ1Y3QgaXRpbWVyc3BlYyAqIG5ld19zZXR0aW5nLAorCXN0cnVjdCBpdGltZXJzcGVjICogb2xkX3NldHRpbmcpCit7CisKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHdoZW4sIHBlcmlvZCwgaXJxZmxhZ3M7CisJaW50IGVyciA9IDA7CisJY25vZGVpZF90IG5vZGVpZDsKKwltbXRpbWVyX3QgKmJhc2U7CisKKwlpZiAob2xkX3NldHRpbmcpCisJCXNnaV90aW1lcl9nZXQodGltciwgb2xkX3NldHRpbmcpOworCisJc2dpX3RpbWVyX2RlbCh0aW1yKTsKKwl3aGVuID0gdGltZXNwZWNfdG9fbnMobmV3X3NldHRpbmctPml0X3ZhbHVlKTsKKwlwZXJpb2QgPSB0aW1lc3BlY190b19ucyhuZXdfc2V0dGluZy0+aXRfaW50ZXJ2YWwpOworCisJaWYgKHdoZW4gPT0gMCkKKwkJLyogQ2xlYXIgdGltZXIgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAoZmxhZ3MgJiBUSU1FUl9BQlNUSU1FKSB7CisJCXN0cnVjdCB0aW1lc3BlYyBuOworCQl1bnNpZ25lZCBsb25nIG5vdzsKKworCQlnZXRuc3RpbWVvZmRheSgmbik7CisJCW5vdyA9IHRpbWVzcGVjX3RvX25zKG4pOworCQlpZiAod2hlbiA+IG5vdykKKwkJCXdoZW4gLT0gbm93OworCQllbHNlCisJCQkvKiBGaXJlIHRoZSB0aW1lciBpbW1lZGlhdGVseSAqLworCQkJd2hlbiA9IDA7CisJfQorCisJLyoKKwkgKiBDb252ZXJ0IHRvIHNnaSBjbG9jayBwZXJpb2QuIE5lZWQgdG8ga2VlcCBydGNfdGltZSgpIGFzIG5lYXIgYXMgcG9zc2libGUKKwkgKiB0byBnZXRuc3RpbWVvZmRheSgpIGluIG9yZGVyIHRvIGJlIGFzIGZhaXRoZnVsIGFzIHBvc3NpYmxlIHRvIHRoZSB0aW1lCisJICogc3BlY2lmaWVkLgorCSAqLworCXdoZW4gPSAod2hlbiArIHNnaV9jbG9ja19wZXJpb2QgLSAxKSAvIHNnaV9jbG9ja19wZXJpb2QgKyBydGNfdGltZSgpOworCXBlcmlvZCA9IChwZXJpb2QgKyBzZ2lfY2xvY2tfcGVyaW9kIC0gMSkgIC8gc2dpX2Nsb2NrX3BlcmlvZDsKKworCS8qCisJICogV2UgYXJlIGFsbG9jYXRpbmcgYSBsb2NhbCBTSHViIGNvbXBhcmF0b3IuIElmIHdlIHdvdWxkIGJlIG1vdmVkIHRvIGFub3RoZXIKKwkgKiBjcHUgdGhlbiBhbm90aGVyIFNIdWIgbWF5IGJlIGxvY2FsIHRvIHVzLiBQcm9oaWJpdCB0aGF0IGJ5IHN3aXRjaGluZyBvZmYKKwkgKiBwcmVlbXB0aW9uLgorCSAqLworCXByZWVtcHRfZGlzYWJsZSgpOworCisJbm9kZWlkID0gIGNwdWlkX3RvX2Nub2RlaWQoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwliYXNlID0gdGltZXJzICsgbm9kZWlkICogTlVNX0NPTVBBUkFUT1JTOworcmV0cnk6CisJLyogRG9uJ3QgdXNlIGFuIGFsbG9jYXRlZCB0aW1lciwgb3IgYSBkZWxldGVkIG9uZSB0aGF0J3MgcGVuZGluZyAqLworCWZvcihpID0gMDsgaTwgTlVNX0NPTVBBUkFUT1JTOyBpKyspIHsKKwkJaWYgKCFiYXNlW2ldLnRpbWVyICYmICFiYXNlW2ldLnRhc2tsZXQuc3RhdGUpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPT0gTlVNX0NPTVBBUkFUT1JTKSB7CisJCXByZWVtcHRfZW5hYmxlKCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2VbaV0ubG9jaywgaXJxZmxhZ3MpOworCisJaWYgKGJhc2VbaV0udGltZXIgfHwgYmFzZVtpXS50YXNrbGV0LnN0YXRlICE9IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFzZVtpXS5sb2NrLCBpcnFmbGFncyk7CisJCWdvdG8gcmV0cnk7CisJfQorCWJhc2VbaV0udGltZXIgPSB0aW1yOworCWJhc2VbaV0uY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJdGltci0+aXQubW10aW1lci5jbG9jayA9IGk7CisJdGltci0+aXQubW10aW1lci5ub2RlID0gbm9kZWlkOworCXRpbXItPml0Lm1tdGltZXIuaW5jciA9IHBlcmlvZDsKKwl0aW1yLT5pdC5tbXRpbWVyLmV4cGlyZXMgPSB3aGVuOworCisJaWYgKHBlcmlvZCA9PSAwKSB7CisJCWlmICghbW10aW1lcl9zZXR1cChpLCB3aGVuKSkgeworCQkJbW10aW1lcl9kaXNhYmxlX2ludCgtMSwgaSk7CisJCQlwb3NpeF90aW1lcl9ldmVudCh0aW1yLCAwKTsKKwkJCXRpbXItPml0Lm1tdGltZXIuZXhwaXJlcyA9IDA7CisJCX0KKwl9IGVsc2UgeworCQl0aW1yLT5pdC5tbXRpbWVyLmV4cGlyZXMgLT0gcGVyaW9kOworCQlpZiAocmVzY2hlZHVsZV9wZXJpb2RpY190aW1lcihiYXNlK2kpKQorCQkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXNlW2ldLmxvY2ssIGlycWZsYWdzKTsKKworCXByZWVtcHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGtfY2xvY2sgc2dpX2Nsb2NrID0geworCS5yZXMgPSAwLAorCS5jbG9ja19zZXQgPSBzZ2lfY2xvY2tfc2V0LAorCS5jbG9ja19nZXQgPSBzZ2lfY2xvY2tfZ2V0LAorCS50aW1lcl9jcmVhdGUgPSBzZ2lfdGltZXJfY3JlYXRlLAorCS5uc2xlZXAgPSBkb19wb3NpeF9jbG9ja19ub25hbm9zbGVlcCwKKwkudGltZXJfc2V0ID0gc2dpX3RpbWVyX3NldCwKKwkudGltZXJfZGVsID0gc2dpX3RpbWVyX2RlbCwKKwkudGltZXJfZ2V0ID0gc2dpX3RpbWVyX2dldAorfTsKKworLyoqCisgKiBtbXRpbWVyX2luaXQgLSBkZXZpY2UgaW5pdGlhbGl6YXRpb24gcm91dGluZQorICoKKyAqIERvZXMgaW5pdGlhbCBzZXR1cCBmb3IgdGhlIG1tdGltZXIgZGV2aWNlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBtbXRpbWVyX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpOworCisJaWYgKCFpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBTYW5pdHkgY2hlY2sgdGhlIGN5Y2xlcy9zZWMgdmFyaWFibGUKKwkgKi8KKwlpZiAoc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kIDwgMTAwMDAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBkZXRlcm1pbmUgY2xvY2sgZnJlcXVlbmN5XG4iLAorCQkgICAgICAgTU1USU1FUl9OQU1FKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1tdGltZXJfZmVtdG9wZXJpb2QgPSAoKHVuc2lnbmVkIGxvbmcpMUUxNSArIHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCAvCisJCQkgICAgICAgMikgLyBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQ7CisKKwlmb3IgKGk9MDsgaTwgTlVNX0NPTVBBUkFUT1JTKk1BWF9DT01QQUNUX05PREVTOyBpKyspIHsKKwkJc3Bpbl9sb2NrX2luaXQoJnRpbWVyc1tpXS5sb2NrKTsKKwkJdGltZXJzW2ldLnRpbWVyID0gTlVMTDsKKwkJdGltZXJzW2ldLmNwdSA9IDA7CisJCXRpbWVyc1tpXS5pID0gaSAlIE5VTV9DT01QQVJBVE9SUzsKKwkJdGFza2xldF9pbml0KCZ0aW1lcnNbaV0udGFza2xldCwgbW10aW1lcl90YXNrbGV0LCAodW5zaWduZWQgbG9uZykgKHRpbWVycytpKSk7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKFNHSV9NTVRJTUVSX1ZFQ1RPUiwgbW10aW1lcl9pbnRlcnJ1cHQsIFNBX1BFUkNQVV9JUlEsIE1NVElNRVJfTkFNRSwgTlVMTCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBpbnRlcnJ1cHQuIiwKKwkJCU1NVElNRVJfTkFNRSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdHJjcHkobW10aW1lcl9taXNjZGV2LmRldmZzX25hbWUsIE1NVElNRVJfTkFNRSk7CisJaWYgKG1pc2NfcmVnaXN0ZXIoJm1tdGltZXJfbWlzY2RldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZVxuIiwKKwkJICAgICAgIE1NVElNRVJfTkFNRSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlzZ2lfY2xvY2tfcGVyaW9kID0gc2dpX2Nsb2NrLnJlcyA9IE5TRUNfUEVSX1NFQyAvIHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZDsKKwlyZWdpc3Rlcl9wb3NpeF9jbG9jayhDTE9DS19TR0lfQ1lDTEUsICZzZ2lfY2xvY2spOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHYlcywgJWxkIE1IelxuIiwgTU1USU1FUl9ERVNDLCBNTVRJTUVSX1ZFUlNJT04sCisJICAgICAgIHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZC8odW5zaWduZWQgbG9uZykxRTYpOworCisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KG1tdGltZXJfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tb3hhLmMgYi9kcml2ZXJzL2NoYXIvbW94YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMjRmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbW94YS5jCkBAIC0wLDAgKzEsMzI0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICAgICAgICAgICBtb3hhLmMgIC0tIE1PWEEgSW50ZWxsaW8gZmFtaWx5IG11bHRpcG9ydCBzZXJpYWwgZHJpdmVyLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDAgIE1veGEgVGVjaG5vbG9naWVzIChzdXBwb3J0QG1veGEuY29tLnR3KS4KKyAqCisgKiAgICAgIFRoaXMgY29kZSBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZSBMaW51eCBzZXJpYWwgZHJpdmVyLCB3cml0dGVuIGJ5CisgKiAgICAgIExpbnVzIFRvcnZhbGRzLCBUaGVvZG9yZSBUJ3NvIGFuZCBvdGhlcnMuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qCisgKiAgICBNT1hBIEludGVsbGlvIFNlcmllcyBEcml2ZXIKKyAqICAgICAgZm9yICAgICAgICAgICAgIDogTElOVVgKKyAqICAgICAgZGF0ZSAgICAgICAgICAgIDogMTk5OS8xLzcKKyAqICAgICAgdmVyc2lvbiAgICAgICAgIDogNS4xCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZQkJTU9YQV9WRVJTSU9OCQkiNS4xayIKKworI2RlZmluZSBNT1hBTUFKT1IgICAgICAgMTcyCisjZGVmaW5lIE1PWEFDVU1BSk9SICAgICAxNzMKKworI2RlZmluZSBwdXRfdG9fdXNlcihhcmcxLCBhcmcyKSBwdXRfdXNlcihhcmcxLCAodW5zaWduZWQgbG9uZyAqKWFyZzIpCisjZGVmaW5lIGdldF9mcm9tX3VzZXIoYXJnMSwgYXJnMikgZ2V0X3VzZXIoYXJnMSwgKHVuc2lnbmVkIGludCAqKWFyZzIpCisKKyNkZWZpbmUgTUFYX0JPQVJEUyAJCTQJLyogRG9uJ3QgY2hhbmdlIHRoaXMgdmFsdWUgKi8KKyNkZWZpbmUgTUFYX1BPUlRTX1BFUl9CT0FSRAkzMgkvKiBEb24ndCBjaGFuZ2UgdGhpcyB2YWx1ZSAqLworI2RlZmluZSBNQVhfUE9SVFMgCQkxMjgJLyogRG9uJ3QgY2hhbmdlIHRoaXMgdmFsdWUgKi8KKworLyoKKyAqICAgIERlZmluZSB0aGUgTW94YSBQQ0kgdmVuZG9yIGFuZCBkZXZpY2UgSURzLgorICovCisjZGVmaW5lIE1PWEFfQlVTX1RZUEVfSVNBCQkwCisjZGVmaW5lIE1PWEFfQlVTX1RZUEVfUENJCQkxCisKKyNpZm5kZWYJUENJX1ZFTkRPUl9JRF9NT1hBCisjZGVmaW5lCVBDSV9WRU5ET1JfSURfTU9YQQkweDEzOTMKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NQMjA0SgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NQMjA0SgkweDIwNDAKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0MyMTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DMjE4CTB4MjE4MAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfQzMyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0MzMjAJMHgzMjAwCisjZW5kaWYKKworZW51bSB7CisJTU9YQV9CT0FSRF9DMjE4X1BDSSA9IDEsCisJTU9YQV9CT0FSRF9DMjE4X0lTQSwKKwlNT1hBX0JPQVJEX0MzMjBfUENJLAorCU1PWEFfQk9BUkRfQzMyMF9JU0EsCisJTU9YQV9CT0FSRF9DUDIwNEosCit9OworCitzdGF0aWMgY2hhciAqbW94YV9icmRuYW1lW10gPQoreworCSJDMjE4IFR1cmJvIFBDSSBzZXJpZXMiLAorCSJDMjE4IFR1cmJvIElTQSBzZXJpZXMiLAorCSJDMzIwIFR1cmJvIFBDSSBzZXJpZXMiLAorCSJDMzIwIFR1cmJvIElTQSBzZXJpZXMiLAorCSJDUC0yMDRKIHNlcmllcyIsCit9OworCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1veGFfcGNpYnJkc1tdID0geworCXsgUENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX0MyMTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIAorCSAgMCwgMCwgTU9YQV9CT0FSRF9DMjE4X1BDSSB9LAorCXsgUENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX0MzMjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIAorCSAgMCwgMCwgTU9YQV9CT0FSRF9DMzIwX1BDSSB9LAorCXsgUENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX0NQMjA0SiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgCisJICAwLCAwLCBNT1hBX0JPQVJEX0NQMjA0SiB9LAorCXsgMCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1veGFfcGNpYnJkcyk7CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCit0eXBlZGVmIHN0cnVjdCBfbW94YV9pc2FfYm9hcmRfY29uZiB7CisJaW50IGJvYXJkVHlwZTsKKwlpbnQgbnVtUG9ydHM7CisJdW5zaWduZWQgbG9uZyBiYXNlQWRkcjsKK30gbW94YV9pc2FfYm9hcmRfY29uZjsKKworc3RhdGljIG1veGFfaXNhX2JvYXJkX2NvbmYgbW94YV9pc2FfYm9hcmRzW10gPQoreworLyogICAgICAge01PWEFfQk9BUkRfQzIxOF9JU0EsOCwweERDMDAwfSwgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IF9tb3hhX3BjaV9kZXZpbmZvIHsKKwl1c2hvcnQgYnVzTnVtOworCXVzaG9ydCBkZXZOdW07Cit9IG1veGFfcGNpX2RldmluZm87CisKK3R5cGVkZWYgc3RydWN0IF9tb3hhX2JvYXJkX2NvbmYgeworCWludCBib2FyZFR5cGU7CisJaW50IG51bVBvcnRzOworCXVuc2lnbmVkIGxvbmcgYmFzZUFkZHI7CisJaW50IGJ1c1R5cGU7CisJbW94YV9wY2lfZGV2aW5mbyBwY2lJbmZvOworfSBtb3hhX2JvYXJkX2NvbmY7CisKK3N0YXRpYyBtb3hhX2JvYXJkX2NvbmYgbW94YV9ib2FyZHNbTUFYX0JPQVJEU107CitzdGF0aWMgdm9pZCBfX2lvbWVtICptb3hhQmFzZUFkZHJbTUFYX0JPQVJEU107CisKK3N0cnVjdCBtb3hhX3N0ciB7CisJaW50IHR5cGU7CisJaW50IHBvcnQ7CisJaW50IGNsb3NlX2RlbGF5OworCXVuc2lnbmVkIHNob3J0IGNsb3Npbmdfd2FpdDsKKwlpbnQgY291bnQ7CisJaW50IGJsb2NrZWRfb3BlbjsKKwlsb25nIGV2ZW50OyAvKiBsb25nIHJlcSdkIGZvciBzZXRfYml0IC0tUlIgKi8KKwlpbnQgYXN5bmNmbGFnczsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c2ZsYWdzOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IGNmbGFnOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBjbG9zZV93YWl0OworCXN0cnVjdCB3b3JrX3N0cnVjdCB0cXVldWU7Cit9OworCitzdHJ1Y3QgbXhzZXJfbXN0YXR1cyB7CisJdGNmbGFnX3QgY2ZsYWc7CisJaW50IGN0czsKKwlpbnQgZHNyOworCWludCByaTsKKwlpbnQgZGNkOworfTsKKworc3RhdGljIHN0cnVjdCBteHNlcl9tc3RhdHVzIEdNU3RhdHVzW01BWF9QT1JUU107CisKKy8qIHN0YXR1c2ZsYWdzICovCisjZGVmaW5lIFRYU1RPUFBFRAkweDEKKyNkZWZpbmUgTE9XV0FJVCAJMHgyCisjZGVmaW5lIEVNUFRZV0FJVAkweDQKKyNkZWZpbmUgVEhST1RUTEUJMHg4CisKKy8qIGV2ZW50ICovCisjZGVmaW5lIE1PWEFfRVZFTlRfSEFOR1VQCTEKKworI2RlZmluZSBTRVJJQUxfRE9fUkVTVEFSVAorCisKKyNkZWZpbmUgU0VSSUFMX1RZUEVfTk9STUFMCTEKKworI2RlZmluZSBXQUtFVVBfQ0hBUlMJCTI1NgorCisjZGVmaW5lIFBPUlROTyh4KQkJKCh4KS0+aW5kZXgpCisKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CitzdGF0aWMgaW50IHR0eW1ham9yID0gTU9YQU1BSk9SOworLyogVmFyaWFibGVzIGZvciBpbnNtb2QgKi8KKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgYmFzZWFkZHJbXSAJPSAJezAsIDAsIDAsIDB9Oworc3RhdGljIGludCB0eXBlW10JPQl7MCwgMCwgMCwgMH07CitzdGF0aWMgaW50IG51bXBvcnRzW10gCT0JezAsIDAsIDAsIDB9OworI2VuZGlmCisKK01PRFVMRV9BVVRIT1IoIldpbGxpYW0gQ2hlbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNT1hBIEludGVsbGlvIEZhbWlseSBNdWx0aXBvcnQgQm9hcmQgRGV2aWNlIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2lmZGVmIE1PRFVMRQorbW9kdWxlX3BhcmFtX2FycmF5KHR5cGUsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoYmFzZWFkZHIsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobnVtcG9ydHMsIGludCwgTlVMTCwgMCk7CisjZW5kaWYKK21vZHVsZV9wYXJhbSh0dHltYWpvciwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh2ZXJib3NlLCBib29sLCAwNjQ0KTsKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICptb3hhRHJpdmVyOworc3RhdGljIHN0cnVjdCBtb3hhX3N0ciBtb3hhQ2hhbm5lbHNbTUFYX1BPUlRTXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICptb3hhWG1pdEJ1ZmY7CitzdGF0aWMgaW50IG1veGFUaW1lcl9vbjsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBtb3hhVGltZXI7CitzdGF0aWMgaW50IG1veGFFbXB0eVRpbWVyX29uW01BWF9QT1JUU107CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgbW94YUVtcHR5VGltZXJbTUFYX1BPUlRTXTsKK3N0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIG1veGFCdWZmU2VtOworCisvKgorICogc3RhdGljIGZ1bmN0aW9uczoKKyAqLworc3RhdGljIHZvaWQgZG9fbW94YV9zb2Z0aW50KHZvaWQgKik7CitzdGF0aWMgaW50IG1veGFfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyB2b2lkIG1veGFfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50IG1veGFfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBtb3hhX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBtb3hhX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgbW94YV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBtb3hhX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbW94YV9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqLCB1bnNpZ25lZCBjaGFyKTsKK3N0YXRpYyBpbnQgbW94YV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgbW94YV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG1veGFfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG1veGFfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IHRlcm1pb3MgKik7CitzdGF0aWMgdm9pZCBtb3hhX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBtb3hhX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbW94YV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IG1veGFfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBtb3hhX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7CitzdGF0aWMgdm9pZCBtb3hhX3BvbGwodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBzZXRfdHR5X3BhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIGludCBibG9ja190aWxsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosCisJCQkgICAgc3RydWN0IG1veGFfc3RyICopOworc3RhdGljIHZvaWQgc2V0dXBfZW1wdHlfZXZlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBjaGVja194bWl0X2VtcHR5KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgc2h1dF9kb3duKHN0cnVjdCBtb3hhX3N0ciAqKTsKK3N0YXRpYyB2b2lkIHJlY2VpdmVfZGF0YShzdHJ1Y3QgbW94YV9zdHIgKik7CisvKgorICogbW94YSBib2FyZCBpbnRlcmZhY2UgZnVuY3Rpb25zOgorICovCitzdGF0aWMgdm9pZCBNb3hhRHJpdmVySW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQgTW94YURyaXZlcklvY3RsKHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZywgaW50KTsKK3N0YXRpYyBpbnQgTW94YURyaXZlclBvbGwodm9pZCk7CitzdGF0aWMgaW50IE1veGFQb3J0c09mQ2FyZChpbnQpOworc3RhdGljIGludCBNb3hhUG9ydElzVmFsaWQoaW50KTsKK3N0YXRpYyB2b2lkIE1veGFQb3J0RW5hYmxlKGludCk7CitzdGF0aWMgdm9pZCBNb3hhUG9ydERpc2FibGUoaW50KTsKK3N0YXRpYyBsb25nIE1veGFQb3J0R2V0TWF4QmF1ZChpbnQpOworc3RhdGljIGxvbmcgTW94YVBvcnRTZXRCYXVkKGludCwgbG9uZyk7CitzdGF0aWMgaW50IE1veGFQb3J0U2V0VGVybWlvKGludCwgc3RydWN0IHRlcm1pb3MgKik7CitzdGF0aWMgaW50IE1veGFQb3J0R2V0TGluZU91dChpbnQsIGludCAqLCBpbnQgKik7CitzdGF0aWMgdm9pZCBNb3hhUG9ydExpbmVDdHJsKGludCwgaW50LCBpbnQpOworc3RhdGljIHZvaWQgTW94YVBvcnRGbG93Q3RybChpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KTsKK3N0YXRpYyBpbnQgTW94YVBvcnRMaW5lU3RhdHVzKGludCk7CitzdGF0aWMgaW50IE1veGFQb3J0RENEQ2hhbmdlKGludCk7CitzdGF0aWMgaW50IE1veGFQb3J0RENET04oaW50KTsKK3N0YXRpYyB2b2lkIE1veGFQb3J0Rmx1c2hEYXRhKGludCwgaW50KTsKK3N0YXRpYyBpbnQgTW94YVBvcnRXcml0ZURhdGEoaW50LCB1bnNpZ25lZCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IE1veGFQb3J0UmVhZERhdGEoaW50LCB1bnNpZ25lZCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IE1veGFQb3J0VHhRdWV1ZShpbnQpOworc3RhdGljIGludCBNb3hhUG9ydFJ4UXVldWUoaW50KTsKK3N0YXRpYyBpbnQgTW94YVBvcnRUeEZyZWUoaW50KTsKK3N0YXRpYyB2b2lkIE1veGFQb3J0VHhEaXNhYmxlKGludCk7CitzdGF0aWMgdm9pZCBNb3hhUG9ydFR4RW5hYmxlKGludCk7CitzdGF0aWMgaW50IE1veGFQb3J0UmVzZXRCcmtDbnQoaW50KTsKK3N0YXRpYyB2b2lkIE1veGFQb3J0U2VuZEJyZWFrKGludCwgaW50KTsKK3N0YXRpYyBpbnQgbW94YV9nZXRfc2VyaWFsX2luZm8oc3RydWN0IG1veGFfc3RyICosIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKTsKK3N0YXRpYyBpbnQgbW94YV9zZXRfc2VyaWFsX2luZm8oc3RydWN0IG1veGFfc3RyICosIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKTsKK3N0YXRpYyB2b2lkIE1veGFTZXRGaWZvKGludCBwb3J0LCBpbnQgZW5hYmxlKTsKKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBtb3hhX29wcyA9IHsKKwkub3BlbiA9IG1veGFfb3BlbiwKKwkuY2xvc2UgPSBtb3hhX2Nsb3NlLAorCS53cml0ZSA9IG1veGFfd3JpdGUsCisJLndyaXRlX3Jvb20gPSBtb3hhX3dyaXRlX3Jvb20sCisJLmZsdXNoX2J1ZmZlciA9IG1veGFfZmx1c2hfYnVmZmVyLAorCS5jaGFyc19pbl9idWZmZXIgPSBtb3hhX2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfY2hhcnMgPSBtb3hhX2ZsdXNoX2NoYXJzLAorCS5wdXRfY2hhciA9IG1veGFfcHV0X2NoYXIsCisJLmlvY3RsID0gbW94YV9pb2N0bCwKKwkudGhyb3R0bGUgPSBtb3hhX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gbW94YV91bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IG1veGFfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSBtb3hhX3N0b3AsCisJLnN0YXJ0ID0gbW94YV9zdGFydCwKKwkuaGFuZ3VwID0gbW94YV9oYW5ndXAsCisJLnRpb2NtZ2V0ID0gbW94YV90aW9jbWdldCwKKwkudGlvY21zZXQgPSBtb3hhX3Rpb2Ntc2V0LAorfTsKKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbnQgbW94YV9nZXRfUENJX2NvbmYoc3RydWN0IHBjaV9kZXYgKnAsIGludCBib2FyZF90eXBlLCBtb3hhX2JvYXJkX2NvbmYgKiBib2FyZCkKK3sKKwlib2FyZC0+YmFzZUFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHAsIDIpOworCWJvYXJkLT5ib2FyZFR5cGUgPSBib2FyZF90eXBlOworCXN3aXRjaCAoYm9hcmRfdHlwZSkgeworCWNhc2UgTU9YQV9CT0FSRF9DMjE4X0lTQToKKwljYXNlIE1PWEFfQk9BUkRfQzIxOF9QQ0k6CisJCWJvYXJkLT5udW1Qb3J0cyA9IDg7CisJCWJyZWFrOworCisJY2FzZSBNT1hBX0JPQVJEX0NQMjA0SjoKKwkJYm9hcmQtPm51bVBvcnRzID0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYm9hcmQtPm51bVBvcnRzID0gMDsKKwkJYnJlYWs7CisJfQorCWJvYXJkLT5idXNUeXBlID0gTU9YQV9CVVNfVFlQRV9QQ0k7CisJYm9hcmQtPnBjaUluZm8uYnVzTnVtID0gcC0+YnVzLT5udW1iZXI7CisJYm9hcmQtPnBjaUluZm8uZGV2TnVtID0gcC0+ZGV2Zm4gPj4gMzsKKworCXJldHVybiAoMCk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCitzdGF0aWMgaW50IF9faW5pdCBtb3hhX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgbnVtQm9hcmRzOworCXN0cnVjdCBtb3hhX3N0ciAqY2g7CisKKwlwcmludGsoS0VSTl9JTkZPICJNT1hBIEludGVsbGlvIGZhbWlseSBkcml2ZXIgdmVyc2lvbiAlc1xuIiwgTU9YQV9WRVJTSU9OKTsKKwltb3hhRHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihNQVhfUE9SVFMgKyAxKTsKKwlpZiAoIW1veGFEcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5pdF9NVVRFWCgmbW94YUJ1ZmZTZW0pOworCW1veGFEcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJbW94YURyaXZlci0+bmFtZSA9ICJ0dHlhIjsKKwltb3hhRHJpdmVyLT5kZXZmc19uYW1lID0gInR0cy9hIjsKKwltb3hhRHJpdmVyLT5tYWpvciA9IHR0eW1ham9yOworCW1veGFEcml2ZXItPm1pbm9yX3N0YXJ0ID0gMDsKKwltb3hhRHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwltb3hhRHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCW1veGFEcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwltb3hhRHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pZmxhZyA9IDA7CisJbW94YURyaXZlci0+aW5pdF90ZXJtaW9zLmNfb2ZsYWcgPSAwOworCW1veGFEcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IENMT0NBTCB8IEhVUENMOworCW1veGFEcml2ZXItPmluaXRfdGVybWlvcy5jX2xmbGFnID0gMDsKKwltb3hhRHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKG1veGFEcml2ZXIsICZtb3hhX29wcyk7CisKKwltb3hhWG1pdEJ1ZmYgPSBOVUxMOworCisJZm9yIChpID0gMCwgY2ggPSBtb3hhQ2hhbm5lbHM7IGkgPCBNQVhfUE9SVFM7IGkrKywgY2grKykgeworCQljaC0+dHlwZSA9IFBPUlRfMTY1NTBBOworCQljaC0+cG9ydCA9IGk7CisJCUlOSVRfV09SSygmY2gtPnRxdWV1ZSwgZG9fbW94YV9zb2Z0aW50LCBjaCk7CisJCWNoLT50dHkgPSBOVUxMOworCQljaC0+Y2xvc2VfZGVsYXkgPSA1ICogSFogLyAxMDsKKwkJY2gtPmNsb3Npbmdfd2FpdCA9IDMwICogSFo7CisJCWNoLT5jb3VudCA9IDA7CisJCWNoLT5ibG9ja2VkX29wZW4gPSAwOworCQljaC0+Y2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgQ0xPQ0FMIHwgSFVQQ0w7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoLT5vcGVuX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+Y2xvc2Vfd2FpdCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9CT0FSRFM7IGkrKykgeworCQltb3hhX2JvYXJkc1tpXS5ib2FyZFR5cGUgPSAwOworCQltb3hhX2JvYXJkc1tpXS5udW1Qb3J0cyA9IDA7CisJCW1veGFfYm9hcmRzW2ldLmJhc2VBZGRyID0gMDsKKwkJbW94YV9ib2FyZHNbaV0uYnVzVHlwZSA9IDA7CisJCW1veGFfYm9hcmRzW2ldLnBjaUluZm8uYnVzTnVtID0gMDsKKwkJbW94YV9ib2FyZHNbaV0ucGNpSW5mby5kZXZOdW0gPSAwOworCX0KKwlNb3hhRHJpdmVySW5pdCgpOworCXByaW50aygiVHR5IGRldmljZXMgbWFqb3IgbnVtYmVyID0gJWRcbiIsIHR0eW1ham9yKTsKKworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKG1veGFEcml2ZXIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgaW5zdGFsbCBNT1hBIFNtYXJ0aW8gZmFtaWx5IGRyaXZlciAhXG4iKTsKKwkJcHV0X3R0eV9kcml2ZXIobW94YURyaXZlcik7CisJCXJldHVybiAtMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9QT1JUUzsgaSsrKSB7CisJCWluaXRfdGltZXIoJm1veGFFbXB0eVRpbWVyW2ldKTsKKwkJbW94YUVtcHR5VGltZXJbaV0uZnVuY3Rpb24gPSBjaGVja194bWl0X2VtcHR5OworCQltb3hhRW1wdHlUaW1lcltpXS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpICYgbW94YUNoYW5uZWxzW2ldOworCQltb3hhRW1wdHlUaW1lcl9vbltpXSA9IDA7CisJfQorCisJaW5pdF90aW1lcigmbW94YVRpbWVyKTsKKwltb3hhVGltZXIuZnVuY3Rpb24gPSBtb3hhX3BvbGw7CisJbW94YVRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gNTApOworCW1veGFUaW1lcl9vbiA9IDE7CisJYWRkX3RpbWVyKCZtb3hhVGltZXIpOworCisJLyogRmluZCB0aGUgYm9hcmRzIGRlZmluZWQgaW4gc291cmNlIGNvZGUgKi8KKwludW1Cb2FyZHMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBNQVhfQk9BUkRTOyBpKyspIHsKKwkJaWYgKChtb3hhX2lzYV9ib2FyZHNbaV0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzIxOF9JU0EpIHx8CisJCSAobW94YV9pc2FfYm9hcmRzW2ldLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MzMjBfSVNBKSkgeworCQkJbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5ib2FyZFR5cGUgPSBtb3hhX2lzYV9ib2FyZHNbaV0uYm9hcmRUeXBlOworCQkJaWYgKG1veGFfaXNhX2JvYXJkc1tpXS5ib2FyZFR5cGUgPT0gTU9YQV9CT0FSRF9DMjE4X0lTQSkKKwkJCQltb3hhX2JvYXJkc1tudW1Cb2FyZHNdLm51bVBvcnRzID0gODsKKwkJCWVsc2UKKwkJCQltb3hhX2JvYXJkc1tudW1Cb2FyZHNdLm51bVBvcnRzID0gbW94YV9pc2FfYm9hcmRzW2ldLm51bVBvcnRzOworCQkJbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5idXNUeXBlID0gTU9YQV9CVVNfVFlQRV9JU0E7CisJCQltb3hhX2JvYXJkc1tudW1Cb2FyZHNdLmJhc2VBZGRyID0gbW94YV9pc2FfYm9hcmRzW2ldLmJhc2VBZGRyOworCQkJaWYgKHZlcmJvc2UpCisJCQkJcHJpbnRrKCJCb2FyZCAlMmQ6ICVzIGJvYXJkKGJhc2VBZGRyPSVseClcbiIsCisJCQkJICAgICAgIG51bUJvYXJkcyArIDEsCisJCQkJICAgICAgIG1veGFfYnJkbmFtZVttb3hhX2JvYXJkc1tudW1Cb2FyZHNdLmJvYXJkVHlwZSAtIDFdLAorCQkJCSAgICAgICBtb3hhX2JvYXJkc1tudW1Cb2FyZHNdLmJhc2VBZGRyKTsKKwkJCW51bUJvYXJkcysrOworCQl9CisJfQorCS8qIEZpbmQgdGhlIGJvYXJkcyBkZWZpbmVkIGZvcm0gbW9kdWxlIGFyZ3MuICovCisjaWZkZWYgTU9EVUxFCisJZm9yIChpID0gMDsgaSA8IE1BWF9CT0FSRFM7IGkrKykgeworCQlpZiAoKHR5cGVbaV0gPT0gTU9YQV9CT0FSRF9DMjE4X0lTQSkgfHwKKwkJICAgICh0eXBlW2ldID09IE1PWEFfQk9BUkRfQzMyMF9JU0EpKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcmludGsoIkJvYXJkICUyZDogJXMgYm9hcmQoYmFzZUFkZHI9JWx4KVxuIiwKKwkJCQkgICAgICAgbnVtQm9hcmRzICsgMSwKKwkJCQkgICAgICAgbW94YV9icmRuYW1lW3R5cGVbaV0gLSAxXSwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGJhc2VhZGRyW2ldKTsKKwkJCWlmIChudW1Cb2FyZHMgPj0gTUFYX0JPQVJEUykgeworCQkJCWlmICh2ZXJib3NlKQorCQkJCQlwcmludGsoIk1vcmUgdGhhbiAlZCBNT1hBIEludGVsbGlvIGZhbWlseSBib2FyZHMgZm91bmQuIEJvYXJkIGlzIGlnbm9yZWQuIiwgTUFYX0JPQVJEUyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQltb3hhX2JvYXJkc1tudW1Cb2FyZHNdLmJvYXJkVHlwZSA9IHR5cGVbaV07CisJCQlpZiAobW94YV9pc2FfYm9hcmRzW2ldLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MyMThfSVNBKQorCQkJCW1veGFfYm9hcmRzW251bUJvYXJkc10ubnVtUG9ydHMgPSA4OworCQkJZWxzZQorCQkJCW1veGFfYm9hcmRzW251bUJvYXJkc10ubnVtUG9ydHMgPSBudW1wb3J0c1tpXTsKKwkJCW1veGFfYm9hcmRzW251bUJvYXJkc10uYnVzVHlwZSA9IE1PWEFfQlVTX1RZUEVfSVNBOworCQkJbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5iYXNlQWRkciA9IGJhc2VhZGRyW2ldOworCQkJbnVtQm9hcmRzKys7CisJCX0KKwl9CisjZW5kaWYKKwkvKiBGaW5kIFBDSSBib2FyZHMgaGVyZSAqLworI2lmZGVmIENPTkZJR19QQ0kKKwl7CisJCXN0cnVjdCBwY2lfZGV2ICpwID0gTlVMTDsKKwkJaW50IG4gPSAoc2l6ZW9mKG1veGFfcGNpYnJkcykgLyBzaXplb2YobW94YV9wY2licmRzWzBdKSkgLSAxOworCQlpID0gMDsKKwkJd2hpbGUgKGkgPCBuKSB7CisJCQl3aGlsZSAoKHAgPSBwY2lfZmluZF9kZXZpY2UobW94YV9wY2licmRzW2ldLnZlbmRvciwgbW94YV9wY2licmRzW2ldLmRldmljZSwgcCkpIT1OVUxMKQorCQkJeworCQkJCWlmIChwY2lfZW5hYmxlX2RldmljZShwKSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKG51bUJvYXJkcyA+PSBNQVhfQk9BUkRTKSB7CisJCQkJCWlmICh2ZXJib3NlKQorCQkJCQkJcHJpbnRrKCJNb3JlIHRoYW4gJWQgTU9YQSBJbnRlbGxpbyBmYW1pbHkgYm9hcmRzIGZvdW5kLiBCb2FyZCBpcyBpZ25vcmVkLiIsIE1BWF9CT0FSRFMpOworCQkJCX0gZWxzZSB7CisJCQkJCW1veGFfZ2V0X1BDSV9jb25mKHAsIG1veGFfcGNpYnJkc1tpXS5kcml2ZXJfZGF0YSwKKwkJCQkJCSZtb3hhX2JvYXJkc1tudW1Cb2FyZHNdKTsKKwkJCQkJbnVtQm9hcmRzKys7CisJCQkJfQorCQkJfQorCQkJaSsrOworCQl9CisJfQorI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IG51bUJvYXJkczsgaSsrKSB7CisJCW1veGFCYXNlQWRkcltpXSA9IGlvcmVtYXAoKHVuc2lnbmVkIGxvbmcpIG1veGFfYm9hcmRzW2ldLmJhc2VBZGRyLCAweDQwMDApOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtb3hhX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICh2ZXJib3NlKQorCQlwcmludGsoIlVubG9hZGluZyBtb2R1bGUgbW94YSAuLi5cbiIpOworCisJaWYgKG1veGFUaW1lcl9vbikKKwkJZGVsX3RpbWVyKCZtb3hhVGltZXIpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9QT1JUUzsgaSsrKQorCQlpZiAobW94YUVtcHR5VGltZXJfb25baV0pCisJCQlkZWxfdGltZXIoJm1veGFFbXB0eVRpbWVyW2ldKTsKKworCWlmICh0dHlfdW5yZWdpc3Rlcl9kcml2ZXIobW94YURyaXZlcikpCisJCXByaW50aygiQ291bGRuJ3QgdW5yZWdpc3RlciBNT1hBIEludGVsbGlvIGZhbWlseSBzZXJpYWwgZHJpdmVyXG4iKTsKKwlwdXRfdHR5X2RyaXZlcihtb3hhRHJpdmVyKTsKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRrKCJEb25lXG4iKTsKK30KKworbW9kdWxlX2luaXQobW94YV9pbml0KTsKK21vZHVsZV9leGl0KG1veGFfZXhpdCk7CisKK3N0YXRpYyB2b2lkIGRvX21veGFfc29mdGludCh2b2lkICpwcml2YXRlXykKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSBwcml2YXRlXzsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCisJaWYgKGNoICYmICh0dHkgPSBjaC0+dHR5KSkgeworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE1PWEFfRVZFTlRfSEFOR1VQLCAmY2gtPmV2ZW50KSkgeworCQkJdHR5X2hhbmd1cCh0dHkpOwkvKiBGSVhNRTogbW9kdWxlIHJlbW92YWwgcmFjZSBoZXJlIC0gQUtQTSAqLworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKKwkJCWNoLT5hc3luY2ZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IG1veGFfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoOworCWludCBwb3J0OworCWludCByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBwYWdlOworCisJcG9ydCA9IFBPUlROTyh0dHkpOworCWlmIChwb3J0ID09IE1BWF9QT1JUUykgeworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoIU1veGFQb3J0SXNWYWxpZChwb3J0KSkgeworCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9CisJZG93bigmbW94YUJ1ZmZTZW0pOworCWlmICghbW94YVhtaXRCdWZmKSB7CisJCXBhZ2UgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICghcGFnZSkgeworCQkJdXAoJm1veGFCdWZmU2VtKTsKKwkJCXJldHVybiAoLUVOT01FTSk7CisJCX0KKwkJLyogVGhpcyB0ZXN0IGlzIGd1YXJkZWQgYnkgdGhlIEJ1ZmZTZW0gc28gbm8gbG9uZ2VyIG5lZWRlZAorCQkgICBkZWxldGUgbWUgaW4gMi41ICovCisJCWlmIChtb3hhWG1pdEJ1ZmYpCisJCQlmcmVlX3BhZ2UocGFnZSk7CisJCWVsc2UKKwkJCW1veGFYbWl0QnVmZiA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2U7CisJfQorCXVwKCZtb3hhQnVmZlNlbSk7CisKKwljaCA9ICZtb3hhQ2hhbm5lbHNbcG9ydF07CisJY2gtPmNvdW50Kys7CisJdHR5LT5kcml2ZXJfZGF0YSA9IGNoOworCWNoLT50dHkgPSB0dHk7CisJaWYgKCEoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKwkJY2gtPnN0YXR1c2ZsYWdzID0gMDsKKwkJc2V0X3R0eV9wYXJhbSh0dHkpOworCQlNb3hhUG9ydExpbmVDdHJsKGNoLT5wb3J0LCAxLCAxKTsKKwkJTW94YVBvcnRFbmFibGUoY2gtPnBvcnQpOworCQljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwl9CisJcmV0dmFsID0gYmxvY2tfdGlsbF9yZWFkeSh0dHksIGZpbHAsIGNoKTsKKworCW1veGFfdW50aHJvdHRsZSh0dHkpOworCisJaWYgKGNoLT50eXBlID09IFBPUlRfMTY1NTBBKSB7CisJCU1veGFTZXRGaWZvKGNoLT5wb3J0LCAxKTsKKwl9IGVsc2UgeworCQlNb3hhU2V0RmlmbyhjaC0+cG9ydCwgMCk7CisJfQorCisJcmV0dXJuIChyZXR2YWwpOworfQorCitzdGF0aWMgdm9pZCBtb3hhX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2g7CisJaW50IHBvcnQ7CisKKwlwb3J0ID0gUE9SVE5PKHR0eSk7CisJaWYgKHBvcnQgPT0gTUFYX1BPUlRTKSB7CisJCXJldHVybjsKKwl9CisJaWYgKCFNb3hhUG9ydElzVmFsaWQocG9ydCkpIHsKKyNpZmRlZiBTRVJJQUxfREVCVUdfQ0xPU0UKKwkJcHJpbnRrKCJJbnZhbGlkIHBvcnRubyBpbiBtb3hhX2Nsb3NlXG4iKTsKKyNlbmRpZgorCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKwlpZiAodHR5LT5kcml2ZXJfZGF0YSA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJcmV0dXJuOworCX0KKwljaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICgodHR5LT5jb3VudCA9PSAxKSAmJiAoY2gtPmNvdW50ICE9IDEpKSB7CisJCXByaW50aygibW94YV9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50OyB0dHktPmNvdW50IGlzIDEsICIKKwkJICAgICAgICJjaC0+Y291bnQgaXMgJWRcbiIsIGNoLT5jb3VudCk7CisJCWNoLT5jb3VudCA9IDE7CisJfQorCWlmICgtLWNoLT5jb3VudCA8IDApIHsKKwkJcHJpbnRrKCJtb3hhX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQsIGRldmljZT0lc1xuIiwKKwkJICAgICAgIHR0eS0+bmFtZSk7CisJCWNoLT5jb3VudCA9IDA7CisJfQorCWlmIChjaC0+Y291bnQpIHsKKwkJcmV0dXJuOworCX0KKwljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19DTE9TSU5HOworCisJY2gtPmNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCWlmIChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSk7CisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAzMCAqIEhaKTsJLyogMzAgc2Vjb25kcyB0aW1lb3V0ICovCisJCW1veGFFbXB0eVRpbWVyX29uW2NoLT5wb3J0XSA9IDA7CisJCWRlbF90aW1lcigmbW94YUVtcHR5VGltZXJbY2gtPnBvcnRdKTsKKwl9CisJc2h1dF9kb3duKGNoKTsKKwlNb3hhUG9ydEZsdXNoRGF0YShwb3J0LCAyKTsKKworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisJCQkKKwl0dHktPmNsb3NpbmcgPSAwOworCWNoLT5ldmVudCA9IDA7CisJY2gtPnR0eSA9IE5VTEw7CisJaWYgKGNoLT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKGNoLT5jbG9zZV9kZWxheSkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaC0+Y2xvc2VfZGVsYXkpKTsKKwkJfQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5vcGVuX3dhaXQpOworCX0KKwljaC0+YXN5bmNmbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkUgfCBBU1lOQ19DTE9TSU5HKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jbG9zZV93YWl0KTsKK30KKworc3RhdGljIGludCBtb3hhX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2g7CisJaW50IGxlbiwgcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKGNoID09IE5VTEwpCisJCXJldHVybiAoMCk7CisJcG9ydCA9IGNoLT5wb3J0OworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWxlbiA9IE1veGFQb3J0V3JpdGVEYXRhKHBvcnQsICh1bnNpZ25lZCBjaGFyICopIGJ1ZiwgY291bnQpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCWlmICggIShjaC0+c3RhdHVzZmxhZ3MgJiBMT1dXQUlUKSAmJgorCSAgICAgKChsZW4gIT0gY291bnQpIHx8IChNb3hhUG9ydFR4RnJlZShwb3J0KSA8PSAxMDApKSApCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWNoLT5zdGF0dXNmbGFncyB8PSBMT1dXQUlUOworCXJldHVybiAobGVuKTsKK30KKworc3RhdGljIGludCBtb3hhX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoOworCisJaWYgKHR0eS0+c3RvcHBlZCkKKwkJcmV0dXJuICgwKTsKKwljaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoY2ggPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKwlyZXR1cm4gKE1veGFQb3J0VHhGcmVlKGNoLT5wb3J0KSk7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmIChjaCA9PSBOVUxMKQorCQlyZXR1cm47CisJTW94YVBvcnRGbHVzaERhdGEoY2gtPnBvcnQsIDEpOworCXR0eV93YWtldXAodHR5KTsKK30KKworc3RhdGljIGludCBtb3hhX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludCBjaGFyczsKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJLyoKKwkgKiBTaWdoLi4uSSBoYXZlIHRvIGNoZWNrIGlmIGRyaXZlcl9kYXRhIGlzIE5VTEwgaGVyZSwgYmVjYXVzZQorCSAqIGlmIGFuIG9wZW4oKSBmYWlscywgdGhlIFRUWSBzdWJzeXN0ZW0gZXZlbnR1YWxseSBjYWxscworCSAqIHR0eV93YWl0X3VudGlsX3NlbnQoKSwgd2hpY2ggY2FsbHMgdGhlIGRyaXZlcidzIGNoYXJzX2luX2J1ZmZlcigpCisJICogcm91dGluZS4gIEFuZCBzaW5jZSB0aGUgb3BlbigpIGZhaWxlZCwgd2UgcmV0dXJuIDAgaGVyZS4gIFRESgorCSAqLworCWlmIChjaCA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCWNoYXJzID0gTW94YVBvcnRUeFF1ZXVlKGNoLT5wb3J0KTsKKwlpZiAoY2hhcnMpIHsKKwkJLyoKKwkJICogTWFrZSBpdCBwb3NzaWJsZSB0byB3YWtldXAgYW55dGhpbmcgd2FpdGluZyBmb3Igb3V0cHV0CisJCSAqIGluIHR0eV9pb2N0bC5jLCBldGMuCisJCSAqLworCQlpZiAoIShjaC0+c3RhdHVzZmxhZ3MgJiBFTVBUWVdBSVQpKQorCQkJc2V0dXBfZW1wdHlfZXZlbnQodHR5KTsKKwl9CisJcmV0dXJuIChjaGFycyk7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwkvKgorCSAqIERvbid0IHRoaW5rIEkgbmVlZCB0aGlzLCBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkIHRvIGVtcHR5IHRoZSBUWAorCSAqIGJ1ZmZlciBmb3IgdGhlIDE2NDUwLCAxNjU1MCwgZXRjLgorCSAqLworfQorCitzdGF0aWMgdm9pZCBtb3hhX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgYykKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoOworCWludCBwb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoY2ggPT0gTlVMTCkKKwkJcmV0dXJuOworCXBvcnQgPSBjaC0+cG9ydDsKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwltb3hhWG1pdEJ1ZmZbMF0gPSBjOworCU1veGFQb3J0V3JpdGVEYXRhKHBvcnQsIG1veGFYbWl0QnVmZiwgMSk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCWlmICggIShjaC0+c3RhdHVzZmxhZ3MgJiBMT1dXQUlUKSAmJiAoTW94YVBvcnRUeEZyZWUocG9ydCkgPD0gMTAwKSApCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwljaC0+c3RhdHVzZmxhZ3MgfD0gTE9XV0FJVDsKK30KKworc3RhdGljIGludCBtb3hhX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IHBvcnQ7CisJaW50IGZsYWcgPSAwLCBkdHIsIHJ0czsKKworCXBvcnQgPSBQT1JUTk8odHR5KTsKKwlpZiAoKHBvcnQgIT0gTUFYX1BPUlRTKSAmJiAoIWNoKSkKKwkJcmV0dXJuICgtRUlOVkFMKTsKKworCU1veGFQb3J0R2V0TGluZU91dChjaC0+cG9ydCwgJmR0ciwgJnJ0cyk7CisJaWYgKGR0cikKKwkJZmxhZyB8PSBUSU9DTV9EVFI7CisJaWYgKHJ0cykKKwkJZmxhZyB8PSBUSU9DTV9SVFM7CisJZHRyID0gTW94YVBvcnRMaW5lU3RhdHVzKGNoLT5wb3J0KTsKKwlpZiAoZHRyICYgMSkKKwkJZmxhZyB8PSBUSU9DTV9DVFM7CisJaWYgKGR0ciAmIDIpCisJCWZsYWcgfD0gVElPQ01fRFNSOworCWlmIChkdHIgJiA0KQorCQlmbGFnIHw9IFRJT0NNX0NEOworCXJldHVybiBmbGFnOworfQorCitzdGF0aWMgaW50IG1veGFfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IHBvcnQ7CisJaW50IGR0ciwgcnRzOworCisJcG9ydCA9IFBPUlROTyh0dHkpOworCWlmICgocG9ydCAhPSBNQVhfUE9SVFMpICYmICghY2gpKQorCQlyZXR1cm4gKC1FSU5WQUwpOworCisJTW94YVBvcnRHZXRMaW5lT3V0KGNoLT5wb3J0LCAmZHRyLCAmcnRzKTsKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlydHMgPSAxOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWR0ciA9IDE7CisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlydHMgPSAwOworCWlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJZHRyID0gMDsKKwlNb3hhUG9ydExpbmVDdHJsKGNoLT5wb3J0LCBkdHIsIHJ0cyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW94YV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlyZWdpc3RlciBpbnQgcG9ydDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgcmV0dmFsOworCisJcG9ydCA9IFBPUlROTyh0dHkpOworCWlmICgocG9ydCAhPSBNQVhfUE9SVFMpICYmICghY2gpKQorCQlyZXR1cm4gKC1FSU5WQUwpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRDU0JSSzoJCS8qIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhayAqLworCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gKHJldHZhbCk7CisJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSk7CisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJaWYgKCFhcmcpCisJCQlNb3hhUG9ydFNlbmRCcmVhayhjaC0+cG9ydCwgMCk7CisJCXJldHVybiAoMCk7CisJY2FzZSBUQ1NCUktQOgkJLyogc3VwcG9ydCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKSAqLworCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gKHJldHZhbCk7CisJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSk7CisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJTW94YVBvcnRTZW5kQnJlYWsoY2gtPnBvcnQsIGFyZyk7CisJCXJldHVybiAoMCk7CisJY2FzZSBUSU9DR1NPRlRDQVI6CisJCXJldHVybiBwdXRfdXNlcihDX0NMT0NBTCh0dHkpID8gMSA6IDAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKTsKKwljYXNlIFRJT0NTU09GVENBUjoKKwkJaWYoZ2V0X3VzZXIocmV0dmFsLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYXJnID0gcmV0dmFsOworCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpIHwKKwkJCQkJIChhcmcgPyBDTE9DQUwgOiAwKSk7CisJCWlmIChDX0NMT0NBTCh0dHkpKQorCQkJY2gtPmFzeW5jZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworCQllbHNlCisJCQljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKwkJcmV0dXJuICgwKTsKKwljYXNlIFRJT0NHU0VSSUFMOgorCQlyZXR1cm4gbW94YV9nZXRfc2VyaWFsX2luZm8oY2gsIGFyZ3ApOworCisJY2FzZSBUSU9DU1NFUklBTDoKKwkJcmV0dXJuIG1veGFfc2V0X3NlcmlhbF9pbmZvKGNoLCBhcmdwKTsKKwlkZWZhdWx0OgorCQlyZXR2YWwgPSBNb3hhRHJpdmVySW9jdGwoY21kLCBhcmcsIHBvcnQpOworCX0KKwlyZXR1cm4gKHJldHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJY2gtPnN0YXR1c2ZsYWdzIHw9IFRIUk9UVExFOworfQorCitzdGF0aWMgdm9pZCBtb3hhX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJY2gtPnN0YXR1c2ZsYWdzICY9IH5USFJPVFRMRTsKK30KKworc3RhdGljIHZvaWQgbW94YV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmIChjaCA9PSBOVUxMKQorCQlyZXR1cm47CisJc2V0X3R0eV9wYXJhbSh0dHkpOworCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAmJgorCSAgICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKK30KKworc3RhdGljIHZvaWQgbW94YV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmIChjaCA9PSBOVUxMKQorCQlyZXR1cm47CisJTW94YVBvcnRUeERpc2FibGUoY2gtPnBvcnQpOworCWNoLT5zdGF0dXNmbGFncyB8PSBUWFNUT1BQRUQ7Cit9CisKKworc3RhdGljIHZvaWQgbW94YV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoY2ggPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKCEoY2gtPnN0YXR1c2ZsYWdzICYgVFhTVE9QUEVEKSkKKwkJcmV0dXJuOworCisJTW94YVBvcnRUeEVuYWJsZShjaC0+cG9ydCk7CisJY2gtPnN0YXR1c2ZsYWdzICY9IH5UWFNUT1BQRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCW1veGFfZmx1c2hfYnVmZmVyKHR0eSk7CisJc2h1dF9kb3duKGNoKTsKKwljaC0+ZXZlbnQgPSAwOworCWNoLT5jb3VudCA9IDA7CisJY2gtPmFzeW5jZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJY2gtPnR0eSA9IE5VTEw7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKK30KKworc3RhdGljIHZvaWQgbW94YV9wb2xsKHVuc2lnbmVkIGxvbmcgaWdub3JlZCkKK3sKKwlyZWdpc3RlciBpbnQgY2FyZDsKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoOworCXN0cnVjdCB0dHlfc3RydWN0ICp0cDsKKwlpbnQgaSwgcG9ydHM7CisKKwltb3hhVGltZXJfb24gPSAwOworCWRlbF90aW1lcigmbW94YVRpbWVyKTsKKworCWlmIChNb3hhRHJpdmVyUG9sbCgpIDwgMCkgeworCQltb3hhVGltZXIuZnVuY3Rpb24gPSBtb3hhX3BvbGw7CisJCW1veGFUaW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDUwKTsKKwkJbW94YVRpbWVyX29uID0gMTsKKwkJYWRkX3RpbWVyKCZtb3hhVGltZXIpOworCQlyZXR1cm47CisJfQorCWZvciAoY2FyZCA9IDA7IGNhcmQgPCBNQVhfQk9BUkRTOyBjYXJkKyspIHsKKwkJaWYgKChwb3J0cyA9IE1veGFQb3J0c09mQ2FyZChjYXJkKSkgPD0gMCkKKwkJCWNvbnRpbnVlOworCQljaCA9ICZtb3hhQ2hhbm5lbHNbY2FyZCAqIE1BWF9QT1JUU19QRVJfQk9BUkRdOworCQlmb3IgKGkgPSAwOyBpIDwgcG9ydHM7IGkrKywgY2grKykgeworCQkJaWYgKChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCEoY2gtPnN0YXR1c2ZsYWdzICYgVEhST1RUTEUpICYmCisJCQkgICAgKE1veGFQb3J0UnhRdWV1ZShjaC0+cG9ydCkgPiAwKSkKKwkJCQlyZWNlaXZlX2RhdGEoY2gpOworCQkJaWYgKCh0cCA9IGNoLT50dHkpID09IDApCisJCQkJY29udGludWU7CisJCQlpZiAoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgeworCQkJCWlmIChNb3hhUG9ydFR4UXVldWUoY2gtPnBvcnQpIDw9IFdBS0VVUF9DSEFSUykgeworCQkJCQlpZiAoIXRwLT5zdG9wcGVkKSB7CisJCQkJCQljaC0+c3RhdHVzZmxhZ3MgJj0gfkxPV1dBSVQ7CisJCQkJCQl0dHlfd2FrZXVwKHRwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICghSV9JR05CUksodHApICYmIChNb3hhUG9ydFJlc2V0QnJrQ250KGNoLT5wb3J0KSA+IDApKSB7CisJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHAsIDAsIFRUWV9CUkVBSyk7CisJCQkJdHR5X3NjaGVkdWxlX2ZsaXAodHApOworCQkJfQorCQkJaWYgKE1veGFQb3J0RENEQ2hhbmdlKGNoLT5wb3J0KSkgeworCQkJCWlmIChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0NIRUNLX0NEKSB7CisJCQkJCWlmIChNb3hhUG9ydERDRE9OKGNoLT5wb3J0KSkKKwkJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7CisJCQkJCWVsc2UgeworCQkJCQkJc2V0X2JpdChNT1hBX0VWRU5UX0hBTkdVUCwgJmNoLT5ldmVudCk7CisJCQkJCQlzY2hlZHVsZV93b3JrKCZjaC0+dHF1ZXVlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCW1veGFUaW1lci5mdW5jdGlvbiA9IG1veGFfcG9sbDsKKwltb3hhVGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyA1MCk7CisJbW94YVRpbWVyX29uID0gMTsKKwlhZGRfdGltZXIoJm1veGFUaW1lcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHNldF90dHlfcGFyYW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgdGVybWlvcyAqdHM7CisJc3RydWN0IG1veGFfc3RyICpjaDsKKwlpbnQgcnRzLCBjdHMsIHR4ZmxvdywgcnhmbG93LCB4YW55OworCisJY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdHMgPSB0dHktPnRlcm1pb3M7CisJaWYgKHRzLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQljaC0+YXN5bmNmbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJZWxzZQorCQljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKwlydHMgPSBjdHMgPSB0eGZsb3cgPSByeGZsb3cgPSB4YW55ID0gMDsKKwlpZiAodHMtPmNfY2ZsYWcgJiBDUlRTQ1RTKQorCQlydHMgPSBjdHMgPSAxOworCWlmICh0cy0+Y19pZmxhZyAmIElYT04pCisJCXR4ZmxvdyA9IDE7CisJaWYgKHRzLT5jX2lmbGFnICYgSVhPRkYpCisJCXJ4ZmxvdyA9IDE7CisJaWYgKHRzLT5jX2lmbGFnICYgSVhBTlkpCisJCXhhbnkgPSAxOworCU1veGFQb3J0Rmxvd0N0cmwoY2gtPnBvcnQsIHJ0cywgY3RzLCB0eGZsb3csIHJ4ZmxvdywgeGFueSk7CisJTW94YVBvcnRTZXRUZXJtaW8oY2gtPnBvcnQsIHRzKTsKK30KKworc3RhdGljIGludCBibG9ja190aWxsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgIHN0cnVjdCBtb3hhX3N0ciAqY2gpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCxjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXR2YWw7CisJaW50IGRvX2Nsb2NhbCA9IENfQ0xPQ0FMKHR0eSk7CisKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyBjbG9zZWQsIHRoZW4gYmxvY2sKKwkgKiB1bnRpbCBpdCdzIGRvbmUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4KKwkgKi8KKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSkgeworCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKQorCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmY2gtPmNsb3NlX3dhaXQpOworI2lmZGVmIFNFUklBTF9ET19SRVNUQVJUCisJCWlmIChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQlyZXR1cm4gKC1FQUdBSU4pOworCQllbHNlCisJCQlyZXR1cm4gKC1FUkVTVEFSVFNZUyk7CisjZWxzZQorCQlyZXR1cm4gKC1FQUdBSU4pOworI2VuZGlmCisJfQorCS8qCisJICogSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250CisJICogYW5kIHRoZW4gZXhpdC4KKwkgKi8KKwlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJcmV0dXJuICgwKTsKKwl9CisJLyoKKwkgKiBCbG9jayB3YWl0aW5nIGZvciB0aGUgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZSBmcmVlCisJICovCisJcmV0dmFsID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmY2gtPm9wZW5fd2FpdCwgJndhaXQpOworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisJcHJpbnRrKCJibG9ja190aWxfcmVhZHkgYmVmb3JlIGJsb2NrOiB0dHlzJWQsIGNvdW50ID0gJWRcbiIsCisJICAgICAgIGNoLT5saW5lLCBjaC0+Y291bnQpOworI2VuZGlmCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCQljaC0+Y291bnQtLTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwljaC0+YmxvY2tlZF9vcGVuKys7CisJd2hpbGUgKDEpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkJICAgICEoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKyNpZmRlZiBTRVJJQUxfRE9fUkVTVEFSVAorCQkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZWxzZQorCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKyNlbHNlCisJCQlyZXR2YWwgPSAtRUFHQUlOOworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCQlpZiAoIShjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmIChkb19jbG9jYWwgfHwKKwkJCQkJCU1veGFQb3J0RENET04oY2gtPnBvcnQpKSkKKwkJCWJyZWFrOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2gtPm9wZW5fd2FpdCwgJndhaXQpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJY2gtPmNvdW50Kys7CisJY2gtPmJsb2NrZWRfb3Blbi0tOworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisJcHJpbnRrKCJibG9ja190aWxfcmVhZHkgYWZ0ZXIgYmxvY2tpbmc6IHR0eXMlZCwgY291bnQgPSAlZFxuIiwKKwkgICAgICAgY2gtPmxpbmUsIGNoLT5jb3VudCk7CisjZW5kaWYKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gKHJldHZhbCk7CisJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9lbXB0eV9ldmVudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwljaC0+c3RhdHVzZmxhZ3MgfD0gRU1QVFlXQUlUOworCW1veGFFbXB0eVRpbWVyX29uW2NoLT5wb3J0XSA9IDA7CisJZGVsX3RpbWVyKCZtb3hhRW1wdHlUaW1lcltjaC0+cG9ydF0pOworCW1veGFFbXB0eVRpbWVyW2NoLT5wb3J0XS5leHBpcmVzID0gamlmZmllcyArIEhaOworCW1veGFFbXB0eVRpbWVyX29uW2NoLT5wb3J0XSA9IDE7CisJYWRkX3RpbWVyKCZtb3hhRW1wdHlUaW1lcltjaC0+cG9ydF0pOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBjaGVja194bWl0X2VtcHR5KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoOworCisJY2ggPSAoc3RydWN0IG1veGFfc3RyICopIGRhdGE7CisJbW94YUVtcHR5VGltZXJfb25bY2gtPnBvcnRdID0gMDsKKwlkZWxfdGltZXIoJm1veGFFbXB0eVRpbWVyW2NoLT5wb3J0XSk7CisJaWYgKGNoLT50dHkgJiYgKGNoLT5zdGF0dXNmbGFncyAmIEVNUFRZV0FJVCkpIHsKKwkJaWYgKE1veGFQb3J0VHhRdWV1ZShjaC0+cG9ydCkgPT0gMCkgeworCQkJY2gtPnN0YXR1c2ZsYWdzICY9IH5FTVBUWVdBSVQ7CisJCQl0dHlfd2FrZXVwKGNoLT50dHkpOworCQkJcmV0dXJuOworCQl9CisJCW1veGFFbXB0eVRpbWVyW2NoLT5wb3J0XS5leHBpcmVzID0gamlmZmllcyArIEhaOworCQltb3hhRW1wdHlUaW1lcl9vbltjaC0+cG9ydF0gPSAxOworCQlhZGRfdGltZXIoJm1veGFFbXB0eVRpbWVyW2NoLT5wb3J0XSk7CisJfSBlbHNlCisJCWNoLT5zdGF0dXNmbGFncyAmPSB+RU1QVFlXQUlUOworfQorCitzdGF0aWMgdm9pZCBzaHV0X2Rvd24oc3RydWN0IG1veGFfc3RyICpjaCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHA7CisKKwlpZiAoIShjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJcmV0dXJuOworCisJdHAgPSBjaC0+dHR5OworCisJTW94YVBvcnREaXNhYmxlKGNoLT5wb3J0KTsKKworCS8qCisJICogSWYgd2UncmUgYSBtb2RlbSBjb250cm9sIGRldmljZSBhbmQgSFVQQ0wgaXMgb24sIGRyb3AgUlRTICYgRFRSLgorCSAqLworCWlmICh0cC0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKQorCQlNb3hhUG9ydExpbmVDdHJsKGNoLT5wb3J0LCAwLCAwKTsKKworCWNoLT5hc3luY2ZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKK30KKworc3RhdGljIHZvaWQgcmVjZWl2ZV9kYXRhKHN0cnVjdCBtb3hhX3N0ciAqY2gpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnRwOworCXN0cnVjdCB0ZXJtaW9zICp0czsKKwlpbnQgaSwgY291bnQsIHJjLCBzcGFjZTsKKwl1bnNpZ25lZCBjaGFyICpjaGFycHRyLCAqZmxhZ3B0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHMgPSBOVUxMOworCXRwID0gY2gtPnR0eTsKKwlpZiAodHApCisJCXRzID0gdHAtPnRlcm1pb3M7CisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJaWYgKCAhdHAgfHwgIXRzIHx8ICEodHMtPmNfY2ZsYWcgJiBDUkVBRCkgKSB7CisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJaWYgKCF0cCB8fCAhdHMpIHsKKwkJTW94YVBvcnRGbHVzaERhdGEoY2gtPnBvcnQsIDApOworCQlyZXR1cm47CisJfQorCXNwYWNlID0gVFRZX0ZMSVBCVUZfU0laRSAtIHRwLT5mbGlwLmNvdW50OworCWlmIChzcGFjZSA8PSAwKQorCQlyZXR1cm47CisJY2hhcnB0ciA9IHRwLT5mbGlwLmNoYXJfYnVmX3B0cjsKKwlmbGFncHRyID0gdHAtPmZsaXAuZmxhZ19idWZfcHRyOworCXJjID0gdHAtPmZsaXAuY291bnQ7CisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJY291bnQgPSBNb3hhUG9ydFJlYWREYXRhKGNoLT5wb3J0LCBjaGFycHRyLCBzcGFjZSk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCSpmbGFncHRyKysgPSAwOworCWNoYXJwdHIgKz0gY291bnQ7CisJcmMgKz0gY291bnQ7CisJdHAtPmZsaXAuY291bnQgPSByYzsKKwl0cC0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBjaGFycHRyOworCXRwLT5mbGlwLmZsYWdfYnVmX3B0ciA9IGZsYWdwdHI7CisJdHR5X3NjaGVkdWxlX2ZsaXAoY2gtPnR0eSk7Cit9CisKKyNkZWZpbmUgTWFnaWNfY29kZQkweDQwNAorCisvKgorICogICAgU3lzdGVtIENvbmZpZ3VyYXRpb24KKyAqLworLyoKKyAqICAgIGZvciBDMjE4IEJJT1MgaW5pdGlhbGl6YXRpb24KKyAqLworI2RlZmluZSBDMjE4X0NvbmZCYXNlCTB4ODAwCisjZGVmaW5lIEMyMThfc3RhdHVzCShDMjE4X0NvbmZCYXNlICsgMCkJLyogQklPUyBydW5uaW5nIHN0YXR1cyAgICAqLworI2RlZmluZSBDMjE4X2RpYWcJKEMyMThfQ29uZkJhc2UgKyAyKQkvKiBkaWFnbm9zdGljIHN0YXR1cyAgICAgICovCisjZGVmaW5lIEMyMThfa2V5CShDMjE4X0NvbmZCYXNlICsgNCkJLyogV09SRCAoMHgyMTggZm9yIEMyMTgpICovCisjZGVmaW5lIEMyMThETG9hZF9sZW4JKEMyMThfQ29uZkJhc2UgKyA2KQkvKiBXT1JEICAgICAgICAgICAqLworI2RlZmluZSBDMjE4Y2hlY2tfc3VtCShDMjE4X0NvbmZCYXNlICsgOCkJLyogQllURSAgICAgICAgICAgKi8KKyNkZWZpbmUgQzIxOGNoa3N1bV9vawkoQzIxOF9Db25mQmFzZSArIDB4MGEpCS8qIEJZVEUgKDE6b2spICAgICAgICAgICAgKi8KKyNkZWZpbmUgQzIxOF9UZXN0UngJKEMyMThfQ29uZkJhc2UgKyAweDEwKQkvKiA4IGJ5dGVzIGZvciA4IHBvcnRzICAgICovCisjZGVmaW5lIEMyMThfVGVzdFR4CShDMjE4X0NvbmZCYXNlICsgMHgxOCkJLyogOCBieXRlcyBmb3IgOCBwb3J0cyAgICAqLworI2RlZmluZSBDMjE4X1JYZXJyCShDMjE4X0NvbmZCYXNlICsgMHgyMCkJLyogOCBieXRlcyBmb3IgOCBwb3J0cyAgICAqLworI2RlZmluZSBDMjE4X0VyckZsYWcJKEMyMThfQ29uZkJhc2UgKyAweDI4KQkvKiA4IGJ5dGVzIGZvciA4IHBvcnRzICAgICovCisKKyNkZWZpbmUgQzIxOF9Mb2FkQnVmCTB4MEYwMAorI2RlZmluZSBDMjE4X0tleUNvZGUJMHgyMTgKKyNkZWZpbmUgQ1AyMDRKX0tleUNvZGUJMHgyMDQKKworLyoKKyAqICAgIGZvciBDMzIwIEJJT1MgaW5pdGlhbGl6YXRpb24KKyAqLworI2RlZmluZSBDMzIwX0NvbmZCYXNlCTB4ODAwCisjZGVmaW5lIEMzMjBfTG9hZEJ1ZgkweDBmMDAKKyNkZWZpbmUgU1RTX2luaXQJMHgwNQkvKiBmb3IgQzMyMF9zdGF0dXMgICAgICAgICovCisKKyNkZWZpbmUgQzMyMF9zdGF0dXMJQzMyMF9Db25mQmFzZSArIDAJLyogQklPUyBydW5uaW5nIHN0YXR1cyAgICAqLworI2RlZmluZSBDMzIwX2RpYWcJQzMyMF9Db25mQmFzZSArIDIJLyogZGlhZ25vc3RpYyBzdGF0dXMgICAgICAqLworI2RlZmluZSBDMzIwX2tleQlDMzIwX0NvbmZCYXNlICsgNAkvKiBXT1JEICgwMzIwSCBmb3IgQzMyMCkgKi8KKyNkZWZpbmUgQzMyMERMb2FkX2xlbglDMzIwX0NvbmZCYXNlICsgNgkvKiBXT1JEICAgICAgICAgICAqLworI2RlZmluZSBDMzIwY2hlY2tfc3VtCUMzMjBfQ29uZkJhc2UgKyA4CS8qIFdPUkQgICAgICAgICAgICovCisjZGVmaW5lIEMzMjBjaGtzdW1fb2sJQzMyMF9Db25mQmFzZSArIDB4MGEJLyogV09SRCAoMTpvaykgICAgICAgICAgICAqLworI2RlZmluZSBDMzIwYmFwaV9sZW4JQzMyMF9Db25mQmFzZSArIDB4MGMJLyogV09SRCAgICAgICAgICAgKi8KKyNkZWZpbmUgQzMyMFVBUlRfbm8JQzMyMF9Db25mQmFzZSArIDB4MGUJLyogV09SRCAgICAgICAgICAgKi8KKworI2RlZmluZSBDMzIwX0tleUNvZGUJMHgzMjAKKworI2RlZmluZSBGaXhQYWdlX2FkZHIJMHgwMDAwCS8qIHN0YXJ0aW5nIGFkZHIgb2Ygc3RhdGljIHBhZ2UgICovCisjZGVmaW5lIER5blBhZ2VfYWRkcgkweDIwMDAJLyogc3RhcnRpbmcgYWRkciBvZiBkeW5hbWljIHBhZ2UgKi8KKyNkZWZpbmUgQzIxOF9zdGFydAkweDMwMDAJLyogc3RhcnRpbmcgYWRkciBvZiBDMjE4IEJJT1MgcHJnICovCisjZGVmaW5lIENvbnRyb2xfcmVnCTB4MWZmMAkvKiBzZWxlY3QgcGFnZSBhbmQgcmVzZXQgY29udHJvbCAqLworI2RlZmluZSBIV19yZXNldAkweDgwCisKKy8qCisgKiAgICBGdW5jdGlvbiBDb2RlcworICovCisjZGVmaW5lIEZDX0NhcmRSZXNldAkweDgwCisjZGVmaW5lIEZDX0NoYW5uZWxSZXNldCAxCS8qIEMzMjAgZmlybXdhcmUgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBGQ19FbmFibGVDSAkyCisjZGVmaW5lIEZDX0Rpc2FibGVDSAkzCisjZGVmaW5lIEZDX1NldFBhcmFtCTQKKyNkZWZpbmUgRkNfU2V0TW9kZQk1CisjZGVmaW5lIEZDX1NldFJhdGUJNgorI2RlZmluZSBGQ19MaW5lQ29udHJvbAk3CisjZGVmaW5lIEZDX0xpbmVTdGF0dXMJOAorI2RlZmluZSBGQ19YbWl0Q29udHJvbAk5CisjZGVmaW5lIEZDX0ZsdXNoUXVldWUJMTAKKyNkZWZpbmUgRkNfU2VuZEJyZWFrCTExCisjZGVmaW5lIEZDX1N0b3BCcmVhawkxMgorI2RlZmluZSBGQ19Mb29wYmFja09OCTEzCisjZGVmaW5lIEZDX0xvb3BiYWNrT0ZGCTE0CisjZGVmaW5lIEZDX0NscklycVRhYmxlCTE1CisjZGVmaW5lIEZDX1NlbmRYb24JMTYKKyNkZWZpbmUgRkNfU2V0VGVybUlycQkxNwkvKiBDMzIwIGZpcm13YXJlIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRkNfU2V0Q250SXJxCTE4CS8qIEMzMjAgZmlybXdhcmUgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBGQ19TZXRCcmVha0lycQkxOQorI2RlZmluZSBGQ19TZXRMaW5lSXJxCTIwCisjZGVmaW5lIEZDX1NldEZsb3dDdGwJMjEKKyNkZWZpbmUgRkNfR2VuSXJxCTIyCisjZGVmaW5lIEZDX0luQ0QxODAJMjMKKyNkZWZpbmUgRkNfT3V0Q0QxODAJMjQKKyNkZWZpbmUgRkNfSW5VQVJUcmVnCTIzCisjZGVmaW5lIEZDX091dFVBUlRyZWcJMjQKKyNkZWZpbmUgRkNfU2V0WG9uWG9mZgkyNQorI2RlZmluZSBGQ19PdXRDRDE4MENDUgkyNgorI2RlZmluZSBGQ19FeHRJUXVldWUJMjcKKyNkZWZpbmUgRkNfRXh0T1F1ZXVlCTI4CisjZGVmaW5lIEZDX0NsckxpbmVJcnEJMjkKKyNkZWZpbmUgRkNfSFdGbG93Q3RsCTMwCisjZGVmaW5lIEZDX0dldENsb2NrUmF0ZSAzNQorI2RlZmluZSBGQ19TZXRCYXVkCTM2CisjZGVmaW5lIEZDX1NldERhdGFNb2RlICA0MQorI2RlZmluZSBGQ19HZXRDQ1NSICAgICAgNDMKKyNkZWZpbmUgRkNfR2V0RGF0YUVycm9yIDQ1CisjZGVmaW5lIEZDX1J4Q29udHJvbAk1MAorI2RlZmluZSBGQ19JbW1TZW5kCTUxCisjZGVmaW5lIEZDX1NldFhvblN0YXRlCTUyCisjZGVmaW5lIEZDX1NldFhvZmZTdGF0ZQk1MworI2RlZmluZSBGQ19TZXRSeEZJRk9UcmlnIDU0CisjZGVmaW5lIEZDX1NldFR4RklGT0NudCA1NQorI2RlZmluZSBGQ19Vbml4UmF0ZQk1NgorI2RlZmluZSBGQ19Vbml4UmVzZXRUaW1lciA1NworCisjZGVmaW5lCVJ4RklGT1RyaWcxCTAKKyNkZWZpbmUJUnhGSUZPVHJpZzQJMQorI2RlZmluZQlSeEZJRk9UcmlnOAkyCisjZGVmaW5lCVJ4RklGT1RyaWcxNAkzCisKKy8qCisgKiAgICBEdWFsLVBvcnRlZCBSQU0KKyAqLworI2RlZmluZSBEUkFNX2dsb2JhbAkwCisjZGVmaW5lIElOVF9kYXRhCShEUkFNX2dsb2JhbCArIDApCisjZGVmaW5lIENvbmZpZ19iYXNlCShEUkFNX2dsb2JhbCArIDB4MTA4KQorCisjZGVmaW5lIElSUWluZGV4CShJTlRfZGF0YSArIDApCisjZGVmaW5lIElSUXBlbmRpbmcJKElOVF9kYXRhICsgNCkKKyNkZWZpbmUgSVJRdGFibGUJKElOVF9kYXRhICsgOCkKKworLyoKKyAqICAgIEludGVycnVwdCBTdGF0dXMKKyAqLworI2RlZmluZSBJbnRyUngJCTB4MDEJLyogcmVjZWl2ZXIgZGF0YSBPLksuICAgICAgICAgICAgICovCisjZGVmaW5lIEludHJUeAkJMHgwMgkvKiB0cmFuc21pdCBidWZmZXIgZW1wdHkgICovCisjZGVmaW5lIEludHJGdW5jCTB4MDQJLyogZnVuY3Rpb24gY29tcGxldGUgICAgICAgICAgICAgICovCisjZGVmaW5lIEludHJCcmVhawkweDA4CS8qIHJlY2VpdmVkIGJyZWFrICAgICAgICAgKi8KKyNkZWZpbmUgSW50ckxpbmUJMHgxMAkvKiBsaW5lIHN0YXR1cyBjaGFuZ2UKKwkJCQkgICBmb3IgdHJhbnNtaXR0ZXIgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSW50ckludHIJMHgyMAkvKiByZWNlaXZlZCBJTlRSIGNvZGUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSW50clF1aXQJMHg0MAkvKiByZWNlaXZlZCBRVUlUIGNvZGUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSW50ckVPRiAJMHg4MAkvKiByZWNlaXZlZCBFT0YgY29kZSAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBJbnRyUnhUcmlnZ2VyIAkweDEwMAkvKiByeCBkYXRhIGNvdW50IHJlYWNoIHRpZ2dlciB2YWx1ZSAqLworI2RlZmluZSBJbnRyVHhUcmlnZ2VyIAkweDIwMAkvKiB0eCBkYXRhIGNvdW50IGJlbG93IHRyaWdnZXIgdmFsdWUgKi8KKworI2RlZmluZSBNYWdpY19ubwkoQ29uZmlnX2Jhc2UgKyAwKQorI2RlZmluZSBDYXJkX21vZGVsX25vCShDb25maWdfYmFzZSArIDIpCisjZGVmaW5lIFRvdGFsX3BvcnRzCShDb25maWdfYmFzZSArIDQpCisjZGVmaW5lIE1vZHVsZV9jbnQJKENvbmZpZ19iYXNlICsgOCkKKyNkZWZpbmUgTW9kdWxlX25vCShDb25maWdfYmFzZSArIDEwKQorI2RlZmluZSBUaW1lcl8xMG1zCShDb25maWdfYmFzZSArIDE0KQorI2RlZmluZSBEaXNhYmxlX0lSUQkoQ29uZmlnX2Jhc2UgKyAyMCkKKyNkZWZpbmUgVE1TMzIwX1BPUlQxCShDb25maWdfYmFzZSArIDIyKQorI2RlZmluZSBUTVMzMjBfUE9SVDIJKENvbmZpZ19iYXNlICsgMjQpCisjZGVmaW5lIFRNUzMyMF9DTE9DSwkoQ29uZmlnX2Jhc2UgKyAyNikKKworLyoKKyAqICAgIERBVEEgQlVGRkVSIGluIERSQU0KKyAqLworI2RlZmluZSBFeHRlcm5fdGFibGUJMHg0MDAJLyogQmFzZSBhZGRyZXNzIG9mIHRoZSBleHRlcm5hbCB0YWJsZQorCQkJCSAgICgyNCB3b3JkcyAqICAgIDY0KSB0b3RhbCAzSyBieXRlcworCQkJCSAgICgyNCB3b3JkcyAqIDEyOCkgdG90YWwgNksgYnl0ZXMgKi8KKyNkZWZpbmUgRXh0ZXJuX3NpemUJMHg2MAkvKiA5NiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlhycHRyCQkweDAwCS8qIHJlYWQgcG9pbnRlciBmb3IgUlggYnVmZmVyICAgICAqLworI2RlZmluZSBSWHdwdHIJCTB4MDIJLyogd3JpdGUgcG9pbnRlciBmb3IgUlggYnVmZmVyICAgICovCisjZGVmaW5lIFRYcnB0cgkJMHgwNAkvKiByZWFkIHBvaW50ZXIgZm9yIFRYIGJ1ZmZlciAgICAgKi8KKyNkZWZpbmUgVFh3cHRyCQkweDA2CS8qIHdyaXRlIHBvaW50ZXIgZm9yIFRYIGJ1ZmZlciAgICAqLworI2RlZmluZSBIb3N0U3RhdAkweDA4CS8qIElSUSBmbGFnIGFuZCBnZW5lcmFsIGZsYWcgICAgICAqLworI2RlZmluZSBGbGFnU3RhdAkweDBBCisjZGVmaW5lIEZsb3dDb250cm9sCTB4MEMJLyogQjcgQjYgQjUgQjQgQjMgQjIgQjEgQjAgICAgICAgICAgICAgICovCisJCQkJCS8qICB4ICB4ICB4ICB4ICB8ICB8ICB8ICB8ICAgICAgICAgICAgKi8KKwkJCQkJLyogICAgICAgICAgICAgIHwgIHwgIHwgICsgQ1RTIGZsb3cgICAqLworCQkJCQkvKiAgICAgICAgICAgICAgfCAgfCAgKy0tLSBSVFMgZmxvdyAgICovCisJCQkJCS8qICAgICAgICAgICAgICB8ICArLS0tLS0tIFRYIFhvbi9Yb2ZmICovCisJCQkJCS8qICAgICAgICAgICAgICArLS0tLS0tLS0tIFJYIFhvbi9Yb2ZmICovCisjZGVmaW5lIEJyZWFrX2NudAkweDBFCS8qIHJlY2VpdmVkIGJyZWFrIGNvdW50ICAgKi8KKyNkZWZpbmUgQ0QxODBUWGlycQkweDEwCS8qIGlmIG5vbi0wOiBlbmFibGUgVFggaXJxICAgICAgICAqLworI2RlZmluZSBSWF9tYXNrIAkweDEyCisjZGVmaW5lIFRYX21hc2sgCTB4MTQKKyNkZWZpbmUgT2ZzX3J4YiAJMHgxNgorI2RlZmluZSBPZnNfdHhiIAkweDE4CisjZGVmaW5lIFBhZ2VfcnhiCTB4MUEKKyNkZWZpbmUgUGFnZV90eGIJMHgxQworI2RlZmluZSBFbmRQYWdlX3J4YgkweDFFCisjZGVmaW5lIEVuZFBhZ2VfdHhiCTB4MjAKKyNkZWZpbmUgRGF0YV9lcnJvcgkweDIyCisjZGVmaW5lIFJ4VHJpZ2dlcgkweDI4CisjZGVmaW5lIFR4VHJpZ2dlcgkweDJhCisKKyNkZWZpbmUgclJYd3B0ciAJMHgzNAorI2RlZmluZSBMb3dfd2F0ZXIJMHgzNgorCisjZGVmaW5lIEZ1bmNDb2RlCTB4NDAKKyNkZWZpbmUgRnVuY0FyZyAJMHg0MgorI2RlZmluZSBGdW5jQXJnMQkweDQ0CisKKyNkZWZpbmUgQzIxOHJ4X3NpemUJMHgyMDAwCS8qIDhLIGJ5dGVzICovCisjZGVmaW5lIEMyMTh0eF9zaXplCTB4ODAwMAkvKiAzMksgYnl0ZXMgKi8KKworI2RlZmluZSBDMjE4cnhfbWFzawkoQzIxOHJ4X3NpemUgLSAxKQorI2RlZmluZSBDMjE4dHhfbWFzawkoQzIxOHR4X3NpemUgLSAxKQorCisjZGVmaW5lIEMzMjBwOHJ4X3NpemUJMHgyMDAwCisjZGVmaW5lIEMzMjBwOHR4X3NpemUJMHg4MDAwCisjZGVmaW5lIEMzMjBwOHJ4X21hc2sJKEMzMjBwOHJ4X3NpemUgLSAxKQorI2RlZmluZSBDMzIwcDh0eF9tYXNrCShDMzIwcDh0eF9zaXplIC0gMSkKKworI2RlZmluZSBDMzIwcDE2cnhfc2l6ZQkweDIwMDAKKyNkZWZpbmUgQzMyMHAxNnR4X3NpemUJMHg0MDAwCisjZGVmaW5lIEMzMjBwMTZyeF9tYXNrCShDMzIwcDE2cnhfc2l6ZSAtIDEpCisjZGVmaW5lIEMzMjBwMTZ0eF9tYXNrCShDMzIwcDE2dHhfc2l6ZSAtIDEpCisKKyNkZWZpbmUgQzMyMHAyNHJ4X3NpemUJMHgyMDAwCisjZGVmaW5lIEMzMjBwMjR0eF9zaXplCTB4MjAwMAorI2RlZmluZSBDMzIwcDI0cnhfbWFzawkoQzMyMHAyNHJ4X3NpemUgLSAxKQorI2RlZmluZSBDMzIwcDI0dHhfbWFzawkoQzMyMHAyNHR4X3NpemUgLSAxKQorCisjZGVmaW5lIEMzMjBwMzJyeF9zaXplCTB4MTAwMAorI2RlZmluZSBDMzIwcDMydHhfc2l6ZQkweDEwMDAKKyNkZWZpbmUgQzMyMHAzMnJ4X21hc2sJKEMzMjBwMzJyeF9zaXplIC0gMSkKKyNkZWZpbmUgQzMyMHAzMnR4X21hc2sJKEMzMjBwMzJ0eF9zaXplIC0gMSkKKworI2RlZmluZSBQYWdlX3NpemUJMHgyMDAwCisjZGVmaW5lIFBhZ2VfbWFzawkoUGFnZV9zaXplIC0gMSkKKyNkZWZpbmUgQzIxOHJ4X3NwYWdlCTMKKyNkZWZpbmUgQzIxOHR4X3NwYWdlCTQKKyNkZWZpbmUgQzIxOHJ4X3BhZ2VubwkxCisjZGVmaW5lIEMyMTh0eF9wYWdlbm8JNAorI2RlZmluZSBDMjE4YnVmX3BhZ2Vubwk1CisKKyNkZWZpbmUgQzMyMHA4cnhfc3BhZ2UJMworI2RlZmluZSBDMzIwcDh0eF9zcGFnZQk0CisjZGVmaW5lIEMzMjBwOHJ4X3Bnbm8JMQorI2RlZmluZSBDMzIwcDh0eF9wZ25vCTQKKyNkZWZpbmUgQzMyMHA4YnVmX3Bnbm8JNQorCisjZGVmaW5lIEMzMjBwMTZyeF9zcGFnZSAzCisjZGVmaW5lIEMzMjBwMTZ0eF9zcGFnZSA0CisjZGVmaW5lIEMzMjBwMTZyeF9wZ25vCTEKKyNkZWZpbmUgQzMyMHAxNnR4X3Bnbm8JMgorI2RlZmluZSBDMzIwcDE2YnVmX3Bnbm8gMworCisjZGVmaW5lIEMzMjBwMjRyeF9zcGFnZSAzCisjZGVmaW5lIEMzMjBwMjR0eF9zcGFnZSA0CisjZGVmaW5lIEMzMjBwMjRyeF9wZ25vCTEKKyNkZWZpbmUgQzMyMHAyNHR4X3Bnbm8JMQorI2RlZmluZSBDMzIwcDI0YnVmX3Bnbm8gMgorCisjZGVmaW5lIEMzMjBwMzJyeF9zcGFnZSAzCisjZGVmaW5lIEMzMjBwMzJ0eF9vZnMJQzMyMHAzMnJ4X3NpemUKKyNkZWZpbmUgQzMyMHAzMnR4X3NwYWdlIDMKKyNkZWZpbmUgQzMyMHAzMmJ1Zl9wZ25vIDEKKworLyoKKyAqICAgIEhvc3QgU3RhdHVzCisgKi8KKyNkZWZpbmUgV2FrZXVwUngJMHgwMQorI2RlZmluZSBXYWtldXBUeAkweDAyCisjZGVmaW5lIFdha2V1cEJyZWFrCTB4MDgKKyNkZWZpbmUgV2FrZXVwTGluZQkweDEwCisjZGVmaW5lIFdha2V1cEludHIJMHgyMAorI2RlZmluZSBXYWtldXBRdWl0CTB4NDAKKyNkZWZpbmUgV2FrZXVwRU9GCTB4ODAJLyogdXNlZCBpbiBWVElNRSBjb250cm9sICovCisjZGVmaW5lIFdha2V1cFJ4VHJpZ2dlcgkweDEwMAorI2RlZmluZSBXYWtldXBUeFRyaWdnZXIJMHgyMDAKKy8qCisgKiAgICBGbGFnIHN0YXR1cworICovCisjZGVmaW5lIFJ4X292ZXIJCTB4MDEKKyNkZWZpbmUgWG9mZl9zdGF0ZQkweDAyCisjZGVmaW5lIFR4X2Zsb3dPZmYJMHgwNAorI2RlZmluZSBUeF9lbmFibGUJMHgwOAorI2RlZmluZSBDVFNfc3RhdGUJMHgxMAorI2RlZmluZSBEU1Jfc3RhdGUJMHgyMAorI2RlZmluZSBEQ0Rfc3RhdGUJMHg4MAorLyoKKyAqICAgIEZsb3dDb250cm9sCisgKi8KKyNkZWZpbmUgQ1RTX0Zsb3dDdGwJMQorI2RlZmluZSBSVFNfRmxvd0N0bAkyCisjZGVmaW5lIFR4X0Zsb3dDdGwJNAorI2RlZmluZSBSeF9GbG93Q3RsCTgKKyNkZWZpbmUgSVhNX0lYQU5ZCTB4MTAKKworI2RlZmluZSBMb3dXYXRlcgkxMjgKKworI2RlZmluZSBEVFJfT04JCTEKKyNkZWZpbmUgUlRTX09OCQkyCisjZGVmaW5lIENUU19PTgkJMQorI2RlZmluZSBEU1JfT04JCTIKKyNkZWZpbmUgRENEX09OCQk4CisKKy8qIG1vZGUgZGVmaW5pdGlvbiAqLworI2RlZmluZQlNWF9DUzgJCTB4MDMKKyNkZWZpbmUJTVhfQ1M3CQkweDAyCisjZGVmaW5lCU1YX0NTNgkJMHgwMQorI2RlZmluZQlNWF9DUzUJCTB4MDAKKworI2RlZmluZQlNWF9TVE9QMQkweDAwCisjZGVmaW5lCU1YX1NUT1AxNQkweDA0CisjZGVmaW5lCU1YX1NUT1AyCTB4MDgKKworI2RlZmluZQlNWF9QQVJOT05FCTB4MDAKKyNkZWZpbmUJTVhfUEFSRVZFTgkweDQwCisjZGVmaW5lCU1YX1BBUk9ERAkweEMwCisKKy8qCisgKiAgICBRdWVyeQorICovCisjZGVmaW5lIFF1ZXJ5UG9ydAlNQVhfUE9SVFMKKworCisKK3N0cnVjdCBtb25fc3RyIHsKKwlpbnQgdGljazsKKwlpbnQgcnhjbnRbTUFYX1BPUlRTXTsKKwlpbnQgdHhjbnRbTUFYX1BPUlRTXTsKK307Cit0eXBlZGVmIHN0cnVjdCBtb25fc3RyIG1vbl9zdDsKKworI2RlZmluZSAJRENEX2NoYW5nZWQJMHgwMQorI2RlZmluZSAJRENEX29sZHN0YXRlCTB4ODAKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbW94YUJ1ZmZbMTAyNDBdOworc3RhdGljIHZvaWQgX19pb21lbSAqbW94YUludE5keFtNQVhfQk9BUkRTXTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1veGFJbnRQZW5kW01BWF9CT0FSRFNdOworc3RhdGljIHZvaWQgX19pb21lbSAqbW94YUludFRhYmxlW01BWF9CT0FSRFNdOworc3RhdGljIGNoYXIgbW94YUNoa1BvcnRbTUFYX1BPUlRTXTsKK3N0YXRpYyBjaGFyIG1veGFMaW5lQ3RybFtNQVhfUE9SVFNdOworc3RhdGljIHZvaWQgX19pb21lbSAqbW94YVRhYmxlQWRkcltNQVhfUE9SVFNdOworc3RhdGljIGxvbmcgbW94YUN1ckJhdWRbTUFYX1BPUlRTXTsKK3N0YXRpYyBjaGFyIG1veGFEQ0RTdGF0ZVtNQVhfUE9SVFNdOworc3RhdGljIGNoYXIgbW94YUxvd0Noa0ZsYWdbTUFYX1BPUlRTXTsKK3N0YXRpYyBpbnQgbW94YUxvd1dhdGVyQ2hrOworc3RhdGljIGludCBtb3hhQ2FyZDsKK3N0YXRpYyBtb25fc3QgbW94YUxvZzsKK3N0YXRpYyBpbnQgbW94YUZ1bmNUb3V0Oworc3RhdGljIHVzaG9ydCBtb3hhQnJlYWtDbnRbTUFYX1BPUlRTXTsKKworc3RhdGljIHZvaWQgbW94YWRlbGF5KGludCk7CitzdGF0aWMgdm9pZCBtb3hhZnVuYyh2b2lkIF9faW9tZW0gKiwgaW50LCB1c2hvcnQpOworc3RhdGljIHZvaWQgd2FpdF9maW5pc2godm9pZCBfX2lvbWVtICopOworc3RhdGljIHZvaWQgbG93X3dhdGVyX2NoZWNrKHZvaWQgX19pb21lbSAqKTsKK3N0YXRpYyBpbnQgbW94YWxvYWRiaW9zKGludCwgdW5zaWduZWQgY2hhciBfX3VzZXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgbW94YWZpbmRjYXJkKGludCk7CitzdGF0aWMgaW50IG1veGFsb2FkMzIwYihpbnQsIHVuc2lnbmVkIGNoYXIgX191c2VyICosIGludCk7CitzdGF0aWMgaW50IG1veGFsb2FkY29kZShpbnQsIHVuc2lnbmVkIGNoYXIgX191c2VyICosIGludCk7CitzdGF0aWMgaW50IG1veGFsb2FkYzIxOChpbnQsIHZvaWQgX19pb21lbSAqLCBpbnQpOworc3RhdGljIGludCBtb3hhbG9hZGMzMjAoaW50LCB2b2lkIF9faW9tZW0gKiwgaW50LCBpbnQgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJRHJpdmVyIGxldmVsIGZ1bmN0aW9uczogCQkJCQkgICAgICoKKyAqCTEuIE1veGFEcml2ZXJJbml0KHZvaWQpOwkJCQkJICAgICAqCisgKgkyLiBNb3hhRHJpdmVySW9jdGwodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCBwb3J0KTsgICAqCisgKgkzLiBNb3hhRHJpdmVyUG9sbCh2b2lkKTsJCQkJCSAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBNb3hhRHJpdmVySW5pdCh2b2lkKQoreworCWludCBpOworCisJbW94YUZ1bmNUb3V0ID0gSFogLyAyOwkvKiA1MDAgbWluaS1zZWNvbmRzICovCisJbW94YUNhcmQgPSAwOworCW1veGFMb2cudGljayA9IDA7CisJbW94YUxvd1dhdGVyQ2hrID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1BPUlRTOyBpKyspIHsKKwkJbW94YUNoa1BvcnRbaV0gPSAwOworCQltb3hhTG93Q2hrRmxhZ1tpXSA9IDA7CisJCW1veGFMaW5lQ3RybFtpXSA9IDA7CisJCW1veGFMb2cucnhjbnRbaV0gPSAwOworCQltb3hhTG9nLnR4Y250W2ldID0gMDsKKwl9Cit9CisKKyNkZWZpbmUJTU9YQQkJMHg0MDAKKyNkZWZpbmUgTU9YQV9HRVRfSVFVRVVFIAkoTU9YQSArIDEpCS8qIGdldCBpbnB1dCBidWZmZXJlZCBjb3VudCAqLworI2RlZmluZSBNT1hBX0dFVF9PUVVFVUUgCShNT1hBICsgMikJLyogZ2V0IG91dHB1dCBidWZmZXJlZCBjb3VudCAqLworI2RlZmluZSBNT1hBX0lOSVRfRFJJVkVSCShNT1hBICsgNikJLyogbW94YUNhcmQ9MCAqLworI2RlZmluZSBNT1hBX0xPQURfQklPUwkJKE1PWEEgKyA5KQkvKiBkb3dubG9hZCBCSU9TICovCisjZGVmaW5lIE1PWEFfRklORF9CT0FSRAkJKE1PWEEgKyAxMCkJLyogQ2hlY2sgaWYgTU9YQSBjYXJkIGV4aXN0PyAqLworI2RlZmluZSBNT1hBX0xPQURfQzMyMEIJCShNT1hBICsgMTEpCS8qIGRvd25sb2FkIDMyMEIgZmlybXdhcmUgKi8KKyNkZWZpbmUgTU9YQV9MT0FEX0NPREUJCShNT1hBICsgMTIpCS8qIGRvd25sb2FkIGZpcm13YXJlICovCisjZGVmaW5lIE1PWEFfR0VUREFUQUNPVU5UICAgICAgIChNT1hBICsgMjMpCisjZGVmaW5lIE1PWEFfR0VUX0lPUVVFVUUJKE1PWEEgKyAyNykKKyNkZWZpbmUgTU9YQV9GTFVTSF9RVUVVRQkoTU9YQSArIDI4KQorI2RlZmluZSBNT1hBX0dFVF9DT05GCQkoTU9YQSArIDM1KQkvKiBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE1PWEFfR0VUX01BSk9SICAgICAgICAgIChNT1hBICsgNjMpCisjZGVmaW5lIE1PWEFfR0VUX0NVTUFKT1IgICAgICAgIChNT1hBICsgNjQpCisjZGVmaW5lIE1PWEFfR0VUTVNUQVRVUyAgICAgICAgIChNT1hBICsgNjUpCisKKworc3RydWN0IG1veGFxX3N0ciB7CisJaW50IGlucTsKKwlpbnQgb3V0cTsKK307CisKK3N0cnVjdCBkbF9zdHIgeworCWNoYXIgX191c2VyICpidWY7CisJaW50IGxlbjsKKwlpbnQgY2FyZG5vOworfTsKKworc3RhdGljIHN0cnVjdCBtb3hhcV9zdHIgdGVtcF9xdWV1ZVtNQVhfUE9SVFNdOworc3RhdGljIHN0cnVjdCBkbF9zdHIgZGx0bXA7CisKK3ZvaWQgTW94YVBvcnRGbHVzaERhdGEoaW50IHBvcnQsIGludCBtb2RlKQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwlpZiAoKG1vZGUgPCAwKSB8fCAobW9kZSA+IDIpKQorCQlyZXR1cm47CisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJbW94YWZ1bmMob2ZzQWRkciwgRkNfRmx1c2hRdWV1ZSwgbW9kZSk7CisJaWYgKG1vZGUgIT0gMSkgeworCQltb3hhTG93Q2hrRmxhZ1twb3J0XSA9IDA7CisJCWxvd193YXRlcl9jaGVjayhvZnNBZGRyKTsKKwl9Cit9CisKK2ludCBNb3hhRHJpdmVySW9jdGwodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCBwb3J0KQoreworCWludCBpOworCWludCBzdGF0dXM7CisJaW50IE1veGFQb3J0VHhRdWV1ZShpbnQpLCBNb3hhUG9ydFJ4UXVldWUoaW50KTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmIChwb3J0ID09IFF1ZXJ5UG9ydCkgeworCQlpZiAoKGNtZCAhPSBNT1hBX0dFVF9DT05GKSAmJiAoY21kICE9IE1PWEFfSU5JVF9EUklWRVIpICYmCisJCSAgICAoY21kICE9IE1PWEFfTE9BRF9CSU9TKSAmJiAoY21kICE9IE1PWEFfRklORF9CT0FSRCkgJiYgKGNtZCAhPSBNT1hBX0xPQURfQzMyMEIpICYmCisJCSAoY21kICE9IE1PWEFfTE9BRF9DT0RFKSAmJiAoY21kICE9IE1PWEFfR0VUREFUQUNPVU5UKSAmJgorCQkgIChjbWQgIT0gTU9YQV9HRVRfSU9RVUVVRSkgJiYgKGNtZCAhPSBNT1hBX0dFVF9NQUpPUikgJiYKKwkJICAgIChjbWQgIT0gTU9YQV9HRVRfQ1VNQUpPUikgJiYgKGNtZCAhPSBNT1hBX0dFVE1TVEFUVVMpKQorCQkJcmV0dXJuICgtRUlOVkFMKTsKKwl9CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE1PWEFfR0VUX0NPTkY6CisJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCAmbW94YV9ib2FyZHMsIE1BWF9CT0FSRFMgKiBzaXplb2YobW94YV9ib2FyZF9jb25mKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuICgwKTsKKwljYXNlIE1PWEFfSU5JVF9EUklWRVI6CisJCWlmICgoaW50KSBhcmcgPT0gMHg0MDQpCisJCQlNb3hhRHJpdmVySW5pdCgpOworCQlyZXR1cm4gKDApOworCWNhc2UgTU9YQV9HRVREQVRBQ09VTlQ6CisJCW1veGFMb2cudGljayA9IGppZmZpZXM7CisJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCAmbW94YUxvZywgc2l6ZW9mKG1vbl9zdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAoMCk7CisJY2FzZSBNT1hBX0ZMVVNIX1FVRVVFOgorCQlNb3hhUG9ydEZsdXNoRGF0YShwb3J0LCBhcmcpOworCQlyZXR1cm4gKDApOworCWNhc2UgTU9YQV9HRVRfSU9RVUVVRToKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9QT1JUUzsgaSsrKSB7CisJCQlpZiAobW94YUNoa1BvcnRbaV0pIHsKKwkJCQl0ZW1wX3F1ZXVlW2ldLmlucSA9IE1veGFQb3J0UnhRdWV1ZShpKTsKKwkJCQl0ZW1wX3F1ZXVlW2ldLm91dHEgPSBNb3hhUG9ydFR4UXVldWUoaSk7CisJCQl9CisJCX0KKwkJaWYoY29weV90b191c2VyKGFyZ3AsIHRlbXBfcXVldWUsIHNpemVvZihzdHJ1Y3QgbW94YXFfc3RyKSAqIE1BWF9QT1JUUykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuICgwKTsKKwljYXNlIE1PWEFfR0VUX09RVUVVRToKKwkJaSA9IE1veGFQb3J0VHhRdWV1ZShwb3J0KTsKKwkJcmV0dXJuIHB1dF91c2VyKGksICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApOworCWNhc2UgTU9YQV9HRVRfSVFVRVVFOgorCQlpID0gTW94YVBvcnRSeFF1ZXVlKHBvcnQpOworCQlyZXR1cm4gcHV0X3VzZXIoaSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJncCk7CisJY2FzZSBNT1hBX0dFVF9NQUpPUjoKKwkJaWYoY29weV90b191c2VyKGFyZ3AsICZ0dHltYWpvciwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgTU9YQV9HRVRfQ1VNQUpPUjoKKwkJaSA9IDA7CisJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCAmaSwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgTU9YQV9HRVRNU1RBVFVTOgorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1BPUlRTOyBpKyspIHsKKwkJCUdNU3RhdHVzW2ldLnJpID0gMDsKKwkJCUdNU3RhdHVzW2ldLmRjZCA9IDA7CisJCQlHTVN0YXR1c1tpXS5kc3IgPSAwOworCQkJR01TdGF0dXNbaV0uY3RzID0gMDsKKwkJCWlmICghbW94YUNoa1BvcnRbaV0pIHsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdHVzID0gTW94YVBvcnRMaW5lU3RhdHVzKG1veGFDaGFubmVsc1tpXS5wb3J0KTsKKwkJCQlpZiAoc3RhdHVzICYgMSkKKwkJCQkJR01TdGF0dXNbaV0uY3RzID0gMTsKKwkJCQlpZiAoc3RhdHVzICYgMikKKwkJCQkJR01TdGF0dXNbaV0uZHNyID0gMTsKKwkJCQlpZiAoc3RhdHVzICYgNCkKKwkJCQkJR01TdGF0dXNbaV0uZGNkID0gMTsKKwkJCX0KKworCQkJaWYgKCFtb3hhQ2hhbm5lbHNbaV0udHR5IHx8ICFtb3hhQ2hhbm5lbHNbaV0udHR5LT50ZXJtaW9zKQorCQkJCUdNU3RhdHVzW2ldLmNmbGFnID0gbW94YUNoYW5uZWxzW2ldLmNmbGFnOworCQkJZWxzZQorCQkJCUdNU3RhdHVzW2ldLmNmbGFnID0gbW94YUNoYW5uZWxzW2ldLnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwkJfQorCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgR01TdGF0dXMsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbXN0YXR1cykgKiBNQVhfUE9SVFMpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAoLUVOT0lPQ1RMQ01EKTsKKwljYXNlIE1PWEFfTE9BRF9CSU9TOgorCWNhc2UgTU9YQV9GSU5EX0JPQVJEOgorCWNhc2UgTU9YQV9MT0FEX0MzMjBCOgorCWNhc2UgTU9YQV9MT0FEX0NPREU6CisJCWJyZWFrOworCX0KKworCWlmKGNvcHlfZnJvbV91c2VyKCZkbHRtcCwgYXJncCwgc2l6ZW9mKHN0cnVjdCBkbF9zdHIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYoZGx0bXAuY2FyZG5vIDwgMCB8fCBkbHRtcC5jYXJkbm8gPj0gTUFYX0JPQVJEUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2goY21kKQorCXsKKwljYXNlIE1PWEFfTE9BRF9CSU9TOgorCQlpID0gbW94YWxvYWRiaW9zKGRsdG1wLmNhcmRubywgZGx0bXAuYnVmLCBkbHRtcC5sZW4pOworCQlyZXR1cm4gKGkpOworCWNhc2UgTU9YQV9GSU5EX0JPQVJEOgorCQlyZXR1cm4gbW94YWZpbmRjYXJkKGRsdG1wLmNhcmRubyk7CisJY2FzZSBNT1hBX0xPQURfQzMyMEI6CisJCW1veGFsb2FkMzIwYihkbHRtcC5jYXJkbm8sIGRsdG1wLmJ1ZiwgZGx0bXAubGVuKTsKKwlkZWZhdWx0OiAvKiB0byBrZWVwIGdjYyBoYXBweSAqLworCQlyZXR1cm4gKDApOworCWNhc2UgTU9YQV9MT0FEX0NPREU6CisJCWkgPSBtb3hhbG9hZGNvZGUoZGx0bXAuY2FyZG5vLCBkbHRtcC5idWYsIGRsdG1wLmxlbik7CisJCWlmIChpID09IC0xKQorCQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJcmV0dXJuIChpKTsKKworCX0KK30KKworaW50IE1veGFEcml2ZXJQb2xsKHZvaWQpCit7CisJcmVnaXN0ZXIgdXNob3J0IHRlbXA7CisJcmVnaXN0ZXIgaW50IGNhcmQ7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCXZvaWQgX19pb21lbSAqaXA7CisJaW50IHBvcnQsIHAsIHBvcnRzOworCisJaWYgKG1veGFDYXJkID09IDApCisJCXJldHVybiAoLTEpOworCWZvciAoY2FyZCA9IDA7IGNhcmQgPCBNQVhfQk9BUkRTOyBjYXJkKyspIHsKKwkJaWYgKChwb3J0cyA9IG1veGFfYm9hcmRzW2NhcmRdLm51bVBvcnRzKSA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChyZWFkYihtb3hhSW50UGVuZFtjYXJkXSkgPT0gMHhmZikgeworCQkJaXAgPSBtb3hhSW50VGFibGVbY2FyZF0gKyByZWFkYihtb3hhSW50TmR4W2NhcmRdKTsKKwkJCXAgPSBjYXJkICogTUFYX1BPUlRTX1BFUl9CT0FSRDsKKwkJCXBvcnRzIDw8PSAxOworCQkJZm9yIChwb3J0ID0gMDsgcG9ydCA8IHBvcnRzOyBwb3J0ICs9IDIsIHArKykgeworCQkJCWlmICgodGVtcCA9IHJlYWR3KGlwICsgcG9ydCkpICE9IDApIHsKKwkJCQkJd3JpdGV3KDAsIGlwICsgcG9ydCk7CisJCQkJCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BdOworCQkJCQlpZiAodGVtcCAmIEludHJUeCkKKwkJCQkJCXdyaXRldyhyZWFkdyhvZnNBZGRyICsgSG9zdFN0YXQpICYgfldha2V1cFR4LCBvZnNBZGRyICsgSG9zdFN0YXQpOworCQkJCQlpZiAodGVtcCAmIEludHJCcmVhaykgeworCQkJCQkJbW94YUJyZWFrQ250W3BdKys7CisJCQkJCX0KKwkJCQkJaWYgKHRlbXAgJiBJbnRyTGluZSkgeworCQkJCQkJaWYgKHJlYWRiKG9mc0FkZHIgKyBGbGFnU3RhdCkgJiBEQ0Rfc3RhdGUpIHsKKwkJCQkJCQlpZiAoKG1veGFEQ0RTdGF0ZVtwXSAmIERDRF9vbGRzdGF0ZSkgPT0gMCkKKwkJCQkJCQkJbW94YURDRFN0YXRlW3BdID0gKERDRF9vbGRzdGF0ZSB8CisJCQkJCQkJCQkJICAgRENEX2NoYW5nZWQpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAobW94YURDRFN0YXRlW3BdICYgRENEX29sZHN0YXRlKQorCQkJCQkJCQltb3hhRENEU3RhdGVbcF0gPSBEQ0RfY2hhbmdlZDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXdyaXRlYigwLCBtb3hhSW50UGVuZFtjYXJkXSk7CisJCX0KKwkJaWYgKG1veGFMb3dXYXRlckNoaykgeworCQkJcCA9IGNhcmQgKiBNQVhfUE9SVFNfUEVSX0JPQVJEOworCQkJZm9yIChwb3J0ID0gMDsgcG9ydCA8IHBvcnRzOyBwb3J0KyssIHArKykgeworCQkJCWlmIChtb3hhTG93Q2hrRmxhZ1twXSkgeworCQkJCQltb3hhTG93Q2hrRmxhZ1twXSA9IDA7CisJCQkJCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BdOworCQkJCQlsb3dfd2F0ZXJfY2hlY2sob2ZzQWRkcik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCW1veGFMb3dXYXRlckNoayA9IDA7CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglDYXJkIGxldmVsIGZ1bmN0aW9uOgkJCQkJCSAgICAgKgorICoJMS4gTW94YVBvcnRzT2ZDYXJkKGludCBjYXJkbm8pOyAJCQkJICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgTW94YVBvcnRzT2ZDYXJkKGludCBjYXJkbm8pCit7CisKKwlpZiAobW94YV9ib2FyZHNbY2FyZG5vXS5ib2FyZFR5cGUgPT0gMCkKKwkJcmV0dXJuICgwKTsKKwlyZXR1cm4gKG1veGFfYm9hcmRzW2NhcmRub10ubnVtUG9ydHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCVBvcnQgbGV2ZWwgZnVuY3Rpb25zOgkJCQkJCSAgICAgKgorICoJMS4gIE1veGFQb3J0SXNWYWxpZChpbnQgcG9ydCk7CQkJCQkgICAgICoKKyAqCTIuICBNb3hhUG9ydEVuYWJsZShpbnQgcG9ydCk7CQkJCQkgICAgICoKKyAqCTMuICBNb3hhUG9ydERpc2FibGUoaW50IHBvcnQpOwkJCQkJICAgICAqCisgKgk0LiAgTW94YVBvcnRHZXRNYXhCYXVkKGludCBwb3J0KTsJCQkJICAgICAqCisgKgk1LiAgTW94YVBvcnRHZXRDdXJCYXVkKGludCBwb3J0KTsJCQkJICAgICAqCisgKgk2LiAgTW94YVBvcnRTZXRCYXVkKGludCBwb3J0LCBsb25nIGJhdWQpOwkJCSAgICAgKgorICoJNy4gIE1veGFQb3J0U2V0TW9kZShpbnQgcG9ydCwgaW50IGRhdGFiaXQsIGludCBzdG9wYml0LCBpbnQgcGFyaXR5KTsgKgorICoJOC4gIE1veGFQb3J0U2V0VGVybWlvKGludCBwb3J0LCB1bnNpZ25lZCBjaGFyICp0ZXJtaW8pOyAJICAgICAqCisgKgk5LiAgTW94YVBvcnRHZXRMaW5lT3V0KGludCBwb3J0LCBpbnQgKmR0clN0YXRlLCBpbnQgKnJ0c1N0YXRlKTsgICAgICAqCisgKgkxMC4gTW94YVBvcnRMaW5lQ3RybChpbnQgcG9ydCwgaW50IGR0clN0YXRlLCBpbnQgcnRzU3RhdGUpOwkgICAgICoKKyAqCTExLiBNb3hhUG9ydEZsb3dDdHJsKGludCBwb3J0LCBpbnQgcnRzLCBpbnQgY3RzLCBpbnQgcngsIGludCB0eCxpbnQgeGFueSk7ICAgICoKKyAqCTEyLiBNb3hhUG9ydExpbmVTdGF0dXMoaW50IHBvcnQpOwkJCQkgICAgICoKKyAqCTEzLiBNb3hhUG9ydERDRENoYW5nZShpbnQgcG9ydCk7CQkJCSAgICAgKgorICoJMTQuIE1veGFQb3J0RENET04oaW50IHBvcnQpOwkJCQkJICAgICAqCisgKgkxNS4gTW94YVBvcnRGbHVzaERhdGEoaW50IHBvcnQsIGludCBtb2RlKTsJICAgICAgICAgICAgICAgICAgICAgKgorICoJMTYuIE1veGFQb3J0V3JpdGVEYXRhKGludCBwb3J0LCB1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBpbnQgbGVuZ3RoKTsgKgorICoJMTcuIE1veGFQb3J0UmVhZERhdGEoaW50IHBvcnQsIHVuc2lnbmVkIGNoYXIgKiBidWZmZXIsIGludCBsZW5ndGgpOyAgKgorICoJMTguIE1veGFQb3J0VHhCdWZTaXplKGludCBwb3J0KTsJCQkJICAgICAqCisgKgkxOS4gTW94YVBvcnRSeEJ1ZlNpemUoaW50IHBvcnQpOwkJCQkgICAgICoKKyAqCTIwLiBNb3hhUG9ydFR4UXVldWUoaW50IHBvcnQpOwkJCQkJICAgICAqCisgKgkyMS4gTW94YVBvcnRUeEZyZWUoaW50IHBvcnQpOwkJCQkJICAgICAqCisgKgkyMi4gTW94YVBvcnRSeFF1ZXVlKGludCBwb3J0KTsJCQkJCSAgICAgKgorICoJMjMuIE1veGFQb3J0UnhGcmVlKGludCBwb3J0KTsJCQkJCSAgICAgKgorICoJMjQuIE1veGFQb3J0VHhEaXNhYmxlKGludCBwb3J0KTsJCQkJICAgICAqCisgKgkyNS4gTW94YVBvcnRUeEVuYWJsZShpbnQgcG9ydCk7IAkJCQkgICAgICoKKyAqCTI2LiBNb3hhUG9ydEdldEJya0NudChpbnQgcG9ydCk7CQkJCSAgICAgKgorICoJMjcuIE1veGFQb3J0UmVzZXRCcmtDbnQoaW50IHBvcnQpOwkJCQkgICAgICoKKyAqCTI4LiBNb3hhUG9ydFNldFhvblhvZmYoaW50IHBvcnQsIGludCB4b25WYWx1ZSwgaW50IHhvZmZWYWx1ZSk7CSAgICAgKgorICoJMjkuIE1veGFQb3J0SXNUeEhvbGQoaW50IHBvcnQpOyAJCQkJICAgICAqCisgKgkzMC4gTW94YVBvcnRTZW5kQnJlYWsoaW50IHBvcnQsIGludCB0aWNrcyk7CQkJICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogICAgTW94YSBQb3J0IE51bWJlciBEZXNjcmlwdGlvbjoKKyAqCisgKiAgICAgIE1PWEEgc2VyaWFsIGRyaXZlciBzdXBwb3J0cyB1cCB0byA0IE1PWEEtQzIxOC9DMzIwIGJvYXJkcy4gQW5kLAorICogICAgICB0aGUgcG9ydCBudW1iZXIgdXNpbmcgaW4gTU9YQSBkcml2ZXIgZnVuY3Rpb25zIHdpbGwgYmUgMCB0byAzMSBmb3IKKyAqICAgICAgZmlyc3QgTU9YQSBib2FyZCwgMzIgdG8gNjMgZm9yIHNlY29uZCwgNjQgdG8gOTUgZm9yIHRoaXJkIGFuZCA5NgorICogICAgICB0byAxMjcgZm9yIGZvdXJ0aC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBzZXR1cCB0aHJlZSBNT1hBIGJvYXJkcywKKyAqICAgICAgZmlyc3QgYm9hcmQgaXMgQzIxOCwgc2Vjb25kIGJvYXJkIGlzIEMzMjAtMTYgYW5kIHRoaXJkIGJvYXJkIGlzCisgKiAgICAgIEMzMjAtMzIuIFRoZSBwb3J0IG51bWJlciBvZiBmaXJzdCBib2FyZCAoQzIxOCAtIDggcG9ydHMpIGlzIGZyb20KKyAqICAgICAgMCB0byA3LiBUaGUgcG9ydCBudW1iZXIgb2Ygc2Vjb25kIGJvYXJkIChDMzIwIC0gMTYgcG9ydHMpIGlzIGZvcm0KKyAqICAgICAgMzIgdG8gNDcuIFRoZSBwb3J0IG51bWJlciBvZiB0aGlyZCBib2FyZCAoQzMyMCAtIDMyIHBvcnRzKSBpcyBmcm9tCisgKiAgICAgIDY0IHRvIDk1LiBBbmQgdGhvc2UgcG9ydCBudW1iZXJzIGZvcm0gOCB0byAzMSwgNDggdG8gNjMgYW5kIDk2IHRvCisgKiAgICAgIDEyNyB3aWxsIGJlIGludmFsaWQuCisgKgorICoKKyAqICAgICAgTW94YSBGdW5jdGlvbnMgRGVzY3JpcHRpb246CisgKgorICogICAgICBGdW5jdGlvbiAxOiAgICAgRHJpdmVyIGluaXRpYWxpemF0aW9uIHJvdXRpbmUsIHRoaXMgcm91dGluZSBtdXN0IGJlCisgKiAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgd2hlbiBpbml0aWFsaXplZCBkcml2ZXIuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgdm9pZCBNb3hhRHJpdmVySW5pdCgpOworICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDI6ICAgICBNb3hhIGRyaXZlciBwcml2YXRlIElPQ1RMIGNvbW1hbmQgcHJvY2Vzc2luZy4KKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFEcml2ZXJJb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IHBvcnQpOworICoKKyAqICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kICAgOiBJT0NUTCBjb21tYW5kCisgKiAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmcgIDogSU9DVEwgYXJndW1lbnQKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwICAoT0spCisgKiAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMCisgKiAgICAgICAgICAgICAgICAgICAgICAtRU5PSU9DVExDTUQKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAzOiAgICAgTW94YSBkcml2ZXIgcG9sbGluZyBwcm9jZXNzIHJvdXRpbmUuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhRHJpdmVyUG9sbCh2b2lkKTsKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwICAgICAgIDsgcG9sbGluZyBPLksuCisgKiAgICAgICAgICAgICAgICAgICAgICAtMSAgICAgIDogbm8gYW55IE1veGEgY2FyZC4gICAgICAgICAgICAgCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gNDogICAgIEdldCB0aGUgcG9ydHMgb2YgdGhpcyBjYXJkLgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRzT2ZDYXJkKGludCBjYXJkbm8pOworICoKKyAqICAgICAgICAgICBpbnQgY2FyZG5vICAgICAgICAgOiBjYXJkIG51bWJlciAoMCAtIDMpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAgICAgICA6IHRoaXMgY2FyZCBpcyBpbnZhbGlkCisgKiAgICAgICAgICAgICAgICAgICAgICA4LzE2LzI0LzMyCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gNTogICAgIENoZWNrIHRoaXMgcG9ydCBpcyB2YWxpZCBvciBpbnZhbGlkCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydElzVmFsaWQoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3LCByZWYgcG9ydCBkZXNjcmlwdGlvbikKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwICAgICAgIDogdGhpcyBwb3J0IGlzIGludmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgOiB0aGlzIHBvcnQgaXMgdmFsaWQKKyAqCisgKgorICogICAgICBGdW5jdGlvbiA2OiAgICAgRW5hYmxlIHRoaXMgcG9ydCB0byBzdGFydCBUeC9SeCBkYXRhLgorICogICAgICBTeW50YXg6CisgKiAgICAgIHZvaWQgTW94YVBvcnRFbmFibGUoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDc6ICAgICBEaXNhYmxlIHRoaXMgcG9ydAorICogICAgICBTeW50YXg6CisgKiAgICAgIHZvaWQgTW94YVBvcnREaXNhYmxlKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKgorICogICAgICBGdW5jdGlvbiA4OiAgICAgR2V0IHRoZSBtYXhpbXVuIGF2YWlsYWJsZSBiYXVkIHJhdGUgb2YgdGhpcyBwb3J0LgorICogICAgICBTeW50YXg6CisgKiAgICAgIGxvbmcgTW94YVBvcnRHZXRNYXhCYXVkKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwICAgICAgIDogdGhpcyBwb3J0IGlzIGludmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgIDM4NDAwLzU3NjAwLzExNTIwMCBicHMKKyAqCisgKgorICogICAgICBGdW5jdGlvbiA5OiAgICAgR2V0IHRoZSBjdXJyZW50IGJhdWQgcmF0ZSBvZiB0aGlzIHBvcnQuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgbG9uZyBNb3hhUG9ydEdldEN1ckJhdWQoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIDAgICAgICAgOiB0aGlzIHBvcnQgaXMgaW52YWxpZAorICogICAgICAgICAgICAgICAgICAgICAgNTAgLSAxMTUyMDAgYnBzCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMTA6ICAgIFNldHRpbmcgYmF1ZCByYXRlIG9mIHRoaXMgcG9ydC4KKyAqICAgICAgU3ludGF4OgorICogICAgICBsb25nIE1veGFQb3J0U2V0QmF1ZChpbnQgcG9ydCwgbG9uZyBiYXVkKTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBsb25nIGJhdWQgICAgICAgICAgOiBiYXVkIHJhdGUgKDUwIC0gMTE1MjAwKQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIDAgICAgICAgOiB0aGlzIHBvcnQgaXMgaW52YWxpZCBvciBiYXVkIDwgNTAKKyAqICAgICAgICAgICAgICAgICAgICAgIDUwIC0gMTE1MjAwIDogdGhlIHJlYWwgYmF1ZCByYXRlIHNldCB0byB0aGUgcG9ydCwgaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFyZ3VtZW50IGJhdWQgaXMgbGFyZ2UgdGhhbiBtYXhpbXVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBiYXVkIHJhdGUsIHRoZSByZWFsIHNldHRpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF1ZCByYXRlIHdpbGwgYmUgdGhlIG1heGltdW4gYmF1ZCByYXRlLgorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDExOiAgICBTZXR0aW5nIHRoZSBkYXRhLWJpdHMvc3RvcC1iaXRzL3Bhcml0eSBvZiB0aGlzIHBvcnQKKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0U2V0TW9kZShpbnQgcG9ydCwgaW50IGRhdGFiaXRzLCBpbnQgc3RvcGJpdHMsIGludCBwYXJpdHkpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICogICAgICAgICAgIGludCBkYXRhYml0cyAgICAgICA6IGRhdGEgYml0cyAoOC83LzYvNSkKKyAqICAgICAgICAgICBpbnQgc3RvcGJpdHMgICAgICAgOiBzdG9wIGJpdHMgKDIvMS8wLCAwIHNob3cgMS41IHN0b3AgYml0cykKKyBpbnQgcGFyaXR5ICAgICA6IHBhcml0eSAoMDpOb25lLDE6T2RkLDI6RXZlbiwzOk1hcmssNDpTcGFjZSkKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAtMSAgICAgIDogaW52YWxpZCBwYXJhbWV0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgOiBzZXR0aW5nIE8uSy4KKyAqCisgKgorICogICAgICBGdW5jdGlvbiAxMjogICAgQ29uZmlndXJlIHRoZSBwb3J0LgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRTZXRUZXJtaW8oaW50IHBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW8pOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICogICAgICAgICAgIHN0cnVjdCB0ZXJtaW9zICogdGVybWlvIDogdGVybWlvIHN0cnVjdHVyZSBwb2ludGVyCisgKgorICogICAgICAgICAgIHJldHVybjogICAgLTEgICAgICA6IHRoaXMgcG9ydCBpcyBpbnZhbGlkIG9yIHRlcm1pbyA9PSBOVUxMCisgKiAgICAgICAgICAgICAgICAgICAgICAwICAgICAgIDogc2V0dGluZyBPLksuCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMTM6ICAgIEdldCB0aGUgRFRSL1JUUyBzdGF0ZSBvZiB0aGlzIHBvcnQuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydEdldExpbmVPdXQoaW50IHBvcnQsIGludCAqZHRyU3RhdGUsIGludCAqcnRzU3RhdGUpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICogICAgICAgICAgIGludCAqIGR0clN0YXRlICAgICA6IHBvaW50ZXIgdG8gSU5UIHRvIHJlY2VpdmUgdGhlIGN1cnJlbnQgRFRSCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuIChpZiBOVUxMLCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgdG8gdGhpcyBhZGRyZXNzKQorICogICAgICAgICAgIGludCAqIHJ0c1N0YXRlICAgICA6IHBvaW50ZXIgdG8gSU5UIHRvIHJlY2VpdmUgdGhlIGN1cnJlbnQgUlRTCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuIChpZiBOVUxMLCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgdG8gdGhpcyBhZGRyZXNzKQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIC0xICAgICAgOiB0aGlzIHBvcnQgaXMgaW52YWxpZAorICogICAgICAgICAgICAgICAgICAgICAgMCAgICAgICA6IE8uSy4KKyAqCisgKgorICogICAgICBGdW5jdGlvbiAxNDogICAgU2V0dGluZyB0aGUgRFRSL1JUUyBvdXRwdXQgc3RhdGUgb2YgdGhpcyBwb3J0LgorICogICAgICBTeW50YXg6CisgKiAgICAgIHZvaWQgTW94YVBvcnRMaW5lQ3RybChpbnQgcG9ydCwgaW50IGR0clN0YXRlLCBpbnQgcnRzU3RhdGUpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICogICAgICAgICAgIGludCBkdHJTdGF0ZSAgICAgICA6IERUUiBvdXRwdXQgc3RhdGUgKDA6IG9mZiwgMTogb24pCisgKiAgICAgICAgICAgaW50IHJ0c1N0YXRlICAgICAgIDogUlRTIG91dHB1dCBzdGF0ZSAoMDogb2ZmLCAxOiBvbikKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAxNTogICAgU2V0dGluZyB0aGUgZmxvdyBjb250cm9sIG9mIHRoaXMgcG9ydC4KKyAqICAgICAgU3ludGF4OgorICogICAgICB2b2lkIE1veGFQb3J0Rmxvd0N0cmwoaW50IHBvcnQsIGludCBydHNGbG93LCBpbnQgY3RzRmxvdywgaW50IHJ4RmxvdywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eEZsb3csaW50IHhhbnkpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICogICAgICAgICAgIGludCBydHNGbG93ICAgICAgICA6IEgvVyBSVFMgZmxvdyBjb250cm9sICgwOiBubywgMTogeWVzKQorICogICAgICAgICAgIGludCBjdHNGbG93ICAgICAgICA6IEgvVyBDVFMgZmxvdyBjb250cm9sICgwOiBubywgMTogeWVzKQorICogICAgICAgICAgIGludCByeEZsb3cgICAgICAgICA6IFMvVyBSeCBYT04vWE9GRiBmbG93IGNvbnRyb2wgKDA6IG5vLCAxOiB5ZXMpCisgKiAgICAgICAgICAgaW50IHR4RmxvdyAgICAgICAgIDogUy9XIFR4IFhPTi9YT0ZGIGZsb3cgY29udHJvbCAoMDogbm8sIDE6IHllcykKKyAqICAgICAgICAgICBpbnQgeGFueSAgICAgICAgICAgOiBTL1cgWEFOWSBmbG93IGNvbnRyb2wgKDA6IG5vLCAxOiB5ZXMpCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMTY6ICAgIEdldCB0aHMgbGluZSBzdGF0dXMgb2YgdGhpcyBwb3J0CisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydExpbmVTdGF0dXMoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIEJpdCAwIC0gQ1RTIHN0YXRlICgwOiBvZmYsIDE6IG9uKQorICogICAgICAgICAgICAgICAgICAgICAgQml0IDEgLSBEU1Igc3RhdGUgKDA6IG9mZiwgMTogb24pCisgKiAgICAgICAgICAgICAgICAgICAgICBCaXQgMiAtIERDRCBzdGF0ZSAoMDogb2ZmLCAxOiBvbikKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAxNzogICAgQ2hlY2sgdGhlIERDRCBzdGF0ZSBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCByZWFkCisgKiAgICAgICAgICAgICAgICAgICAgICBvZiB0aGlzIGZ1bmN0aW9uLgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnREQ0RDaGFuZ2UoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIDAgICAgICAgOiBubyBjaGFuZ2VkCisgKiAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIDogRENEIGhhcyBjaGFuZ2VkCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMTg6ICAgIENoZWNrIHRocyBjdXJyZW50IERDRCBzdGF0ZSBpcyBPTiBvciBub3QuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydERDRE9OKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwICAgICAgIDogRENEIG9mZgorICogICAgICAgICAgICAgICAgICAgICAgMSAgICAgICA6IERDRCBvbgorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDE5OiAgICBGbHVzaCB0aGUgUngvVHggYnVmZmVyIGRhdGEgb2YgdGhpcyBwb3J0LgorICogICAgICBTeW50YXg6CisgKiAgICAgIHZvaWQgTW94YVBvcnRGbHVzaERhdGEoaW50IHBvcnQsIGludCBtb2RlKTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBpbnQgbW9kZSAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgOiBmbHVzaCB0aGUgUnggYnVmZmVyIAorICogICAgICAgICAgICAgICAgICAgICAgMSAgICAgICA6IGZsdXNoIHRoZSBUeCBidWZmZXIgCisgKiAgICAgICAgICAgICAgICAgICAgICAyICAgICAgIDogZmx1c2ggdGhlIFJ4IGFuZCBUeCBidWZmZXIgCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMjA6ICAgIFdyaXRlIGRhdGEuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydFdyaXRlRGF0YShpbnQgcG9ydCwgdW5zaWduZWQgY2hhciAqIGJ1ZmZlciwgaW50IGxlbmd0aCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKiAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIGJ1ZmZlciAgICAgOiBwb2ludGVyIHRvIHdyaXRlIGRhdGEgYnVmZmVyLgorICogICAgICAgICAgIGludCBsZW5ndGggICAgICAgICA6IHdyaXRlIGRhdGEgbGVuZ3RoCisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAtIGxlbmd0aCAgICAgIDogcmVhbCB3cml0ZSBkYXRhIGxlbmd0aAorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDIxOiAgICBSZWFkIGRhdGEuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydFJlYWREYXRhKGludCBwb3J0LCB1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBpbnQgbGVuZ3RoKTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogYnVmZmVyICAgICA6IHBvaW50ZXIgdG8gcmVhZCBkYXRhIGJ1ZmZlci4KKyAqICAgICAgICAgICBpbnQgbGVuZ3RoICAgICAgICAgOiByZWFkIGRhdGEgYnVmZmVyIGxlbmd0aAorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIDAgLSBsZW5ndGggICAgICA6IHJlYWwgcmVhZCBkYXRhIGxlbmd0aAorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDIyOiAgICBHZXQgdGhlIFR4IGJ1ZmZlciBzaXplIG9mIHRoaXMgcG9ydAorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRUeEJ1ZlNpemUoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIC4uICAgICAgOiBUeCBidWZmZXIgc2l6ZQorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDIzOiAgICBHZXQgdGhlIFJ4IGJ1ZmZlciBzaXplIG9mIHRoaXMgcG9ydAorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRSeEJ1ZlNpemUoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIC4uICAgICAgOiBSeCBidWZmZXIgc2l6ZQorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDI0OiAgICBHZXQgdGhlIFR4IGJ1ZmZlciBjdXJyZW50IHF1ZXVlZCBkYXRhIGJ5dGVzCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydFR4UXVldWUoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIC4uICAgICAgOiBUeCBidWZmZXIgY3VycmVudCBxdWV1ZWQgZGF0YSBieXRlcworICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDI1OiAgICBHZXQgdGhlIFR4IGJ1ZmZlciBjdXJyZW50IGZyZWUgc3BhY2UKKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0VHhGcmVlKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAuLiAgICAgIDogVHggYnVmZmVyIGN1cnJlbnQgZnJlZSBzcGFjZQorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDI2OiAgICBHZXQgdGhlIFJ4IGJ1ZmZlciBjdXJyZW50IHF1ZXVlZCBkYXRhIGJ5dGVzCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydFJ4UXVldWUoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIC4uICAgICAgOiBSeCBidWZmZXIgY3VycmVudCBxdWV1ZWQgZGF0YSBieXRlcworICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDI3OiAgICBHZXQgdGhlIFJ4IGJ1ZmZlciBjdXJyZW50IGZyZWUgc3BhY2UKKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0UnhGcmVlKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAuLiAgICAgIDogUnggYnVmZmVyIGN1cnJlbnQgZnJlZSBzcGFjZQorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDI4OiAgICBEaXNhYmxlIHBvcnQgZGF0YSB0cmFuc21pc3Npb24uCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgdm9pZCBNb3hhUG9ydFR4RGlzYWJsZShpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMjk6ICAgIEVuYWJsZSBwb3J0IGRhdGEgdHJhbnNtaXNzaW9uLgorICogICAgICBTeW50YXg6CisgKiAgICAgIHZvaWQgTW94YVBvcnRUeEVuYWJsZShpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMzA6ICAgIEdldCB0aGUgcmVjZWl2ZWQgQlJFQUsgc2lnbmFsIGNvdW50LgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRHZXRCcmtDbnQoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIDAgLSAuLiAgOiBCUkVBSyBzaWduYWwgY291bnQKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAzMTogICAgR2V0IHRoZSByZWNlaXZlZCBCUkVBSyBzaWduYWwgY291bnQgYW5kIHJlc2V0IGl0LgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRSZXNldEJya0NudChpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAtIC4uICA6IEJSRUFLIHNpZ25hbCBjb3VudAorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDMyOiAgICBTZXQgdGhlIFMvVyBmbG93IGNvbnRyb2wgbmV3IFhPTi9YT0ZGIHZhbHVlLCBkZWZhdWx0CisgKiAgICAgICAgICAgICAgICAgICAgICBYT04gaXMgMHgxMSAmIFhPRkYgaXMgMHgxMy4KKyAqICAgICAgU3ludGF4OgorICogICAgICB2b2lkIE1veGFQb3J0U2V0WG9uWG9mZihpbnQgcG9ydCwgaW50IHhvblZhbHVlLCBpbnQgeG9mZlZhbHVlKTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBpbnQgeG9uVmFsdWUgICAgICAgOiBuZXcgWE9OIHZhbHVlICgwIC0gMjU1KQorICogICAgICAgICAgIGludCB4b2ZmVmFsdWUgICAgICA6IG5ldyBYT0ZGIHZhbHVlICgwIC0gMjU1KQorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDMzOiAgICBDaGVjayB0aGlzIHBvcnQncyB0cmFuc21pc3Npb24gaXMgaG9sZCBieSByZW1vdGUgc2l0ZQorICogICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgZmxvdyBjb250cm9sLgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRJc1R4SG9sZChpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAgICAgICA6IG5vcm1hbAorICogICAgICAgICAgICAgICAgICAgICAgMSAgICAgICA6IGhvbGQgYnkgcmVtb3RlIHNpdGUKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAzNDogICAgU2VuZCBvdXQgYSBCUkVBSyBzaWduYWwuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgdm9pZCBNb3hhUG9ydFNlbmRCcmVhayhpbnQgcG9ydCwgaW50IG1zMTAwKTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBpbnQgbXMxMDAgICAgICAgICAgOiBicmVhayBzaWduYWwgdGltZSBpbnRlcnZhbC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0OiAxMDAgbWluaS1zZWNvbmQuIGlmIG1zMTAwID09IDAsIGl0IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kIG91dCBhIGFib3V0IDI1MCBtcyBCUkVBSyBzaWduYWwuCisgKgorICovCitpbnQgTW94YVBvcnRJc1ZhbGlkKGludCBwb3J0KQoreworCisJaWYgKG1veGFDYXJkID09IDApCisJCXJldHVybiAoMCk7CisJaWYgKG1veGFDaGtQb3J0W3BvcnRdID09IDApCisJCXJldHVybiAoMCk7CisJcmV0dXJuICgxKTsKK30KKwordm9pZCBNb3hhUG9ydEVuYWJsZShpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJaW50IE1veGFQb3J0TGluZVN0YXR1cyhpbnQpOworCXNob3J0IGxvd3dhdGVyID0gNTEyOworCisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJd3JpdGV3KGxvd3dhdGVyLCBvZnNBZGRyICsgTG93X3dhdGVyKTsKKwltb3hhQnJlYWtDbnRbcG9ydF0gPSAwOworCWlmICgobW94YV9ib2FyZHNbcG9ydCAvIE1BWF9QT1JUU19QRVJfQk9BUkRdLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MzMjBfSVNBKSB8fAorCSAgICAobW94YV9ib2FyZHNbcG9ydCAvIE1BWF9QT1JUU19QRVJfQk9BUkRdLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MzMjBfUENJKSkgeworCQltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXRCcmVha0lycSwgMCk7CisJfSBlbHNlIHsKKwkJd3JpdGV3KHJlYWR3KG9mc0FkZHIgKyBIb3N0U3RhdCkgfCBXYWtldXBCcmVhaywgb2ZzQWRkciArIEhvc3RTdGF0KTsKKwl9CisKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXRMaW5lSXJxLCBNYWdpY19jb2RlKTsKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19GbHVzaFF1ZXVlLCAyKTsKKworCW1veGFmdW5jKG9mc0FkZHIsIEZDX0VuYWJsZUNILCBNYWdpY19jb2RlKTsKKwlNb3hhUG9ydExpbmVTdGF0dXMocG9ydCk7Cit9CisKK3ZvaWQgTW94YVBvcnREaXNhYmxlKGludCBwb3J0KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXRGbG93Q3RsLCAwKTsJLyogZGlzYWJsZSBmbG93IGNvbnRyb2wgKi8KKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19DbHJMaW5lSXJxLCBNYWdpY19jb2RlKTsKKwl3cml0ZXcoMCwgb2ZzQWRkciArIEhvc3RTdGF0KTsKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19EaXNhYmxlQ0gsIE1hZ2ljX2NvZGUpOworfQorCitsb25nIE1veGFQb3J0R2V0TWF4QmF1ZChpbnQgcG9ydCkKK3sKKwlpZiAoKG1veGFfYm9hcmRzW3BvcnQgLyBNQVhfUE9SVFNfUEVSX0JPQVJEXS5ib2FyZFR5cGUgPT0gTU9YQV9CT0FSRF9DMzIwX0lTQSkgfHwKKwkgICAgKG1veGFfYm9hcmRzW3BvcnQgLyBNQVhfUE9SVFNfUEVSX0JPQVJEXS5ib2FyZFR5cGUgPT0gTU9YQV9CT0FSRF9DMzIwX1BDSSkpCisJCXJldHVybiAoNDYwODAwTCk7CisJZWxzZQorCQlyZXR1cm4gKDkyMTYwMEwpOworfQorCisKK2xvbmcgTW94YVBvcnRTZXRCYXVkKGludCBwb3J0LCBsb25nIGJhdWQpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCWxvbmcgbWF4LCBjbG9jazsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKChiYXVkIDwgNTBMKSB8fCAoKG1heCA9IE1veGFQb3J0R2V0TWF4QmF1ZChwb3J0KSkgPT0gMCkpCisJCXJldHVybiAoMCk7CisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJaWYgKGJhdWQgPiBtYXgpCisJCWJhdWQgPSBtYXg7CisJaWYgKG1heCA9PSAzODQwMEwpCisJCWNsb2NrID0gNjE0NDAwTDsJLyogZm9yIDkuODMwNCBNaHogOiBtYXguIDM4NDAwIGJwcyAqLworCWVsc2UgaWYgKG1heCA9PSA1NzYwMEwpCisJCWNsb2NrID0gNjkxMjAwTDsJLyogZm9yIDExLjA1OTIgTWh6IDogbWF4LiA1NzYwMCBicHMgKi8KKwllbHNlCisJCWNsb2NrID0gOTIxNjAwTDsJLyogZm9yIDE0Ljc0NTYgTWh6IDogbWF4LiAxMTUyMDAgYnBzICovCisJdmFsID0gY2xvY2sgLyBiYXVkOworCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NldEJhdWQsIHZhbCk7CisJYmF1ZCA9IGNsb2NrIC8gdmFsOworCW1veGFDdXJCYXVkW3BvcnRdID0gYmF1ZDsKKwlyZXR1cm4gKGJhdWQpOworfQorCitpbnQgTW94YVBvcnRTZXRUZXJtaW8oaW50IHBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW8pCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCXRjZmxhZ190IGNmbGFnOworCWxvbmcgYmF1ZDsKKwl0Y2ZsYWdfdCBtb2RlID0gMDsKKworCWlmIChtb3hhQ2hrUG9ydFtwb3J0XSA9PSAwIHx8IHRlcm1pbyA9PSAwKQorCQlyZXR1cm4gKC0xKTsKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwljZmxhZyA9IHRlcm1pby0+Y19jZmxhZzsJLyogdGVybWlvLT5jX2NmbGFnICovCisKKwltb2RlID0gdGVybWlvLT5jX2NmbGFnICYgQ1NJWkU7CisJaWYgKG1vZGUgPT0gQ1M1KQorCQltb2RlID0gTVhfQ1M1OworCWVsc2UgaWYgKG1vZGUgPT0gQ1M2KQorCQltb2RlID0gTVhfQ1M2OworCWVsc2UgaWYgKG1vZGUgPT0gQ1M3KQorCQltb2RlID0gTVhfQ1M3OworCWVsc2UgaWYgKG1vZGUgPT0gQ1M4KQorCQltb2RlID0gTVhfQ1M4OworCisJaWYgKHRlcm1pby0+Y19jZmxhZyAmIENTVE9QQikgeworCQlpZiAobW9kZSA9PSBNWF9DUzUpCisJCQltb2RlIHw9IE1YX1NUT1AxNTsKKwkJZWxzZQorCQkJbW9kZSB8PSBNWF9TVE9QMjsKKwl9IGVsc2UKKwkJbW9kZSB8PSBNWF9TVE9QMTsKKworCWlmICh0ZXJtaW8tPmNfY2ZsYWcgJiBQQVJFTkIpIHsKKwkJaWYgKHRlcm1pby0+Y19jZmxhZyAmIFBBUk9ERCkKKwkJCW1vZGUgfD0gTVhfUEFST0REOworCQllbHNlCisJCQltb2RlIHw9IE1YX1BBUkVWRU47CisJfSBlbHNlCisJCW1vZGUgfD0gTVhfUEFSTk9ORTsKKworCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NldERhdGFNb2RlLCAodXNob3J0KSBtb2RlKTsKKworCWNmbGFnICY9IChDQkFVRCB8IENCQVVERVgpOworI2lmbmRlZiBCOTIxNjAwCisjZGVmaW5lCUI5MjE2MDAJKEI0NjA4MDArMSkKKyNlbmRpZgorCXN3aXRjaCAoY2ZsYWcpIHsKKwljYXNlIEI5MjE2MDA6CisJCWJhdWQgPSA5MjE2MDBMOworCQlicmVhazsKKwljYXNlIEI0NjA4MDA6CisJCWJhdWQgPSA0NjA4MDBMOworCQlicmVhazsKKwljYXNlIEIyMzA0MDA6CisJCWJhdWQgPSAyMzA0MDBMOworCQlicmVhazsKKwljYXNlIEIxMTUyMDA6CisJCWJhdWQgPSAxMTUyMDBMOworCQlicmVhazsKKwljYXNlIEI1NzYwMDoKKwkJYmF1ZCA9IDU3NjAwTDsKKwkJYnJlYWs7CisJY2FzZSBCMzg0MDA6CisJCWJhdWQgPSAzODQwMEw7CisJCWJyZWFrOworCWNhc2UgQjE5MjAwOgorCQliYXVkID0gMTkyMDBMOworCQlicmVhazsKKwljYXNlIEI5NjAwOgorCQliYXVkID0gOTYwMEw7CisJCWJyZWFrOworCWNhc2UgQjQ4MDA6CisJCWJhdWQgPSA0ODAwTDsKKwkJYnJlYWs7CisJY2FzZSBCMjQwMDoKKwkJYmF1ZCA9IDI0MDBMOworCQlicmVhazsKKwljYXNlIEIxODAwOgorCQliYXVkID0gMTgwMEw7CisJCWJyZWFrOworCWNhc2UgQjEyMDA6CisJCWJhdWQgPSAxMjAwTDsKKwkJYnJlYWs7CisJY2FzZSBCNjAwOgorCQliYXVkID0gNjAwTDsKKwkJYnJlYWs7CisJY2FzZSBCMzAwOgorCQliYXVkID0gMzAwTDsKKwkJYnJlYWs7CisJY2FzZSBCMjAwOgorCQliYXVkID0gMjAwTDsKKwkJYnJlYWs7CisJY2FzZSBCMTUwOgorCQliYXVkID0gMTUwTDsKKwkJYnJlYWs7CisJY2FzZSBCMTM0OgorCQliYXVkID0gMTM0TDsKKwkJYnJlYWs7CisJY2FzZSBCMTEwOgorCQliYXVkID0gMTEwTDsKKwkJYnJlYWs7CisJY2FzZSBCNzU6CisJCWJhdWQgPSA3NUw7CisJCWJyZWFrOworCWNhc2UgQjUwOgorCQliYXVkID0gNTBMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliYXVkID0gMDsKKwl9CisJaWYgKChtb3hhX2JvYXJkc1twb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzMyMF9JU0EpIHx8CisJICAgIChtb3hhX2JvYXJkc1twb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzMyMF9QQ0kpKSB7CisJCWlmIChiYXVkID09IDkyMTYwMEwpCisJCQlyZXR1cm4gKC0xKTsKKwl9CisJTW94YVBvcnRTZXRCYXVkKHBvcnQsIGJhdWQpOworCisJaWYgKHRlcm1pby0+Y19pZmxhZyAmIChJWE9OIHwgSVhPRkYgfCBJWEFOWSkpIHsKKwkJd3JpdGViKHRlcm1pby0+Y19jY1tWU1RBUlRdLCBvZnNBZGRyICsgRnVuY0FyZyk7CisJCXdyaXRlYih0ZXJtaW8tPmNfY2NbVlNUT1BdLCBvZnNBZGRyICsgRnVuY0FyZzEpOworCQl3cml0ZWIoRkNfU2V0WG9uWG9mZiwgb2ZzQWRkciArIEZ1bmNDb2RlKTsKKwkJd2FpdF9maW5pc2gob2ZzQWRkcik7CisKKwl9CisJcmV0dXJuICgwKTsKK30KKworaW50IE1veGFQb3J0R2V0TGluZU91dChpbnQgcG9ydCwgaW50ICpkdHJTdGF0ZSwgaW50ICpydHNTdGF0ZSkKK3sKKworCWlmICghTW94YVBvcnRJc1ZhbGlkKHBvcnQpKQorCQlyZXR1cm4gKC0xKTsKKwlpZiAoZHRyU3RhdGUpIHsKKwkJaWYgKG1veGFMaW5lQ3RybFtwb3J0XSAmIERUUl9PTikKKwkJCSpkdHJTdGF0ZSA9IDE7CisJCWVsc2UKKwkJCSpkdHJTdGF0ZSA9IDA7CisJfQorCWlmIChydHNTdGF0ZSkgeworCQlpZiAobW94YUxpbmVDdHJsW3BvcnRdICYgUlRTX09OKQorCQkJKnJ0c1N0YXRlID0gMTsKKwkJZWxzZQorCQkJKnJ0c1N0YXRlID0gMDsKKwl9CisJcmV0dXJuICgwKTsKK30KKwordm9pZCBNb3hhUG9ydExpbmVDdHJsKGludCBwb3J0LCBpbnQgZHRyLCBpbnQgcnRzKQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwlpbnQgbW9kZTsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCW1vZGUgPSAwOworCWlmIChkdHIpCisJCW1vZGUgfD0gRFRSX09OOworCWlmIChydHMpCisJCW1vZGUgfD0gUlRTX09OOworCW1veGFMaW5lQ3RybFtwb3J0XSA9IG1vZGU7CisJbW94YWZ1bmMob2ZzQWRkciwgRkNfTGluZUNvbnRyb2wsIG1vZGUpOworfQorCit2b2lkIE1veGFQb3J0Rmxvd0N0cmwoaW50IHBvcnQsIGludCBydHMsIGludCBjdHMsIGludCB0eGZsb3csIGludCByeGZsb3csIGludCB0eGFueSkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJaW50IG1vZGU7CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwltb2RlID0gMDsKKwlpZiAocnRzKQorCQltb2RlIHw9IFJUU19GbG93Q3RsOworCWlmIChjdHMpCisJCW1vZGUgfD0gQ1RTX0Zsb3dDdGw7CisJaWYgKHR4ZmxvdykKKwkJbW9kZSB8PSBUeF9GbG93Q3RsOworCWlmIChyeGZsb3cpCisJCW1vZGUgfD0gUnhfRmxvd0N0bDsKKwlpZiAodHhhbnkpCisJCW1vZGUgfD0gSVhNX0lYQU5ZOworCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NldEZsb3dDdGwsIG1vZGUpOworfQorCitpbnQgTW94YVBvcnRMaW5lU3RhdHVzKGludCBwb3J0KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwlpbnQgdmFsOworCisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJaWYgKChtb3hhX2JvYXJkc1twb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzMyMF9JU0EpIHx8CisJICAgIChtb3hhX2JvYXJkc1twb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzMyMF9QQ0kpKSB7CisJCW1veGFmdW5jKG9mc0FkZHIsIEZDX0xpbmVTdGF0dXMsIDApOworCQl2YWwgPSByZWFkdyhvZnNBZGRyICsgRnVuY0FyZyk7CisJfSBlbHNlIHsKKwkJdmFsID0gcmVhZHcob2ZzQWRkciArIEZsYWdTdGF0KSA+PiA0OworCX0KKwl2YWwgJj0gMHgwQjsKKwlpZiAodmFsICYgOCkgeworCQl2YWwgfD0gNDsKKwkJaWYgKChtb3hhRENEU3RhdGVbcG9ydF0gJiBEQ0Rfb2xkc3RhdGUpID09IDApCisJCQltb3hhRENEU3RhdGVbcG9ydF0gPSAoRENEX29sZHN0YXRlIHwgRENEX2NoYW5nZWQpOworCX0gZWxzZSB7CisJCWlmIChtb3hhRENEU3RhdGVbcG9ydF0gJiBEQ0Rfb2xkc3RhdGUpCisJCQltb3hhRENEU3RhdGVbcG9ydF0gPSBEQ0RfY2hhbmdlZDsKKwl9CisJdmFsICY9IDc7CisJcmV0dXJuICh2YWwpOworfQorCitpbnQgTW94YVBvcnREQ0RDaGFuZ2UoaW50IHBvcnQpCit7CisJaW50IG47CisKKwlpZiAobW94YUNoa1BvcnRbcG9ydF0gPT0gMCkKKwkJcmV0dXJuICgwKTsKKwluID0gbW94YURDRFN0YXRlW3BvcnRdOworCW1veGFEQ0RTdGF0ZVtwb3J0XSAmPSB+RENEX2NoYW5nZWQ7CisJbiAmPSBEQ0RfY2hhbmdlZDsKKwlyZXR1cm4gKG4pOworfQorCitpbnQgTW94YVBvcnREQ0RPTihpbnQgcG9ydCkKK3sKKwlpbnQgbjsKKworCWlmIChtb3hhQ2hrUG9ydFtwb3J0XSA9PSAwKQorCQlyZXR1cm4gKDApOworCWlmIChtb3hhRENEU3RhdGVbcG9ydF0gJiBEQ0Rfb2xkc3RhdGUpCisJCW4gPSAxOworCWVsc2UKKwkJbiA9IDA7CisJcmV0dXJuIChuKTsKK30KKworCisvKgorICAgaW50IE1veGFEdW1wTWVtKGludCBwb3J0LCB1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBpbnQgbGVuKQorICAgeworICAgaW50ICAgICAgICAgIGk7CisgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGJhc2VBZGRyLG9mc0FkZHIsb2ZzOworCisgICBiYXNlQWRkciA9IG1veGFCYXNlQWRkcltwb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF07CisgICBvZnMgPSBiYXNlQWRkciArIER5blBhZ2VfYWRkciArIHBhZ2VvZnM7CisgICBpZiAobGVuID4gMHgyMDAwTCkKKyAgIGxlbiA9IDB4MjAwMEw7CisgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICBidWZmZXJbaV0gPSByZWFkYihvZnMraSk7CisgICB9CisgKi8KKworCitpbnQgTW94YVBvcnRXcml0ZURhdGEoaW50IHBvcnQsIHVuc2lnbmVkIGNoYXIgKiBidWZmZXIsIGludCBsZW4pCit7CisJaW50IGMsIHRvdGFsLCBpOworCXVzaG9ydCB0YWlsOworCWludCBjbnQ7CisJdXNob3J0IGhlYWQsIHR4X21hc2ssIHNwYWdlLCBlcGFnZTsKKwl1c2hvcnQgcGFnZW5vLCBwYWdlb2ZzLCBidWZoZWFkOworCXZvaWQgX19pb21lbSAqYmFzZUFkZHIsICpvZnNBZGRyLCAqb2ZzOworCisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJYmFzZUFkZHIgPSBtb3hhQmFzZUFkZHJbcG9ydCAvIE1BWF9QT1JUU19QRVJfQk9BUkRdOworCXR4X21hc2sgPSByZWFkdyhvZnNBZGRyICsgVFhfbWFzayk7CisJc3BhZ2UgPSByZWFkdyhvZnNBZGRyICsgUGFnZV90eGIpOworCWVwYWdlID0gcmVhZHcob2ZzQWRkciArIEVuZFBhZ2VfdHhiKTsKKwl0YWlsID0gcmVhZHcob2ZzQWRkciArIFRYd3B0cik7CisJaGVhZCA9IHJlYWR3KG9mc0FkZHIgKyBUWHJwdHIpOworCWMgPSAoaGVhZCA+IHRhaWwpID8gKGhlYWQgLSB0YWlsIC0gMSkKKwkgICAgOiAoaGVhZCAtIHRhaWwgKyB0eF9tYXNrKTsKKwlpZiAoYyA+IGxlbikKKwkJYyA9IGxlbjsKKwltb3hhTG9nLnR4Y250W3BvcnRdICs9IGM7CisJdG90YWwgPSBjOworCWlmIChzcGFnZSA9PSBlcGFnZSkgeworCQlidWZoZWFkID0gcmVhZHcob2ZzQWRkciArIE9mc190eGIpOworCQl3cml0ZXcoc3BhZ2UsIGJhc2VBZGRyICsgQ29udHJvbF9yZWcpOworCQl3aGlsZSAoYyA+IDApIHsKKwkJCWlmIChoZWFkID4gdGFpbCkKKwkJCQlsZW4gPSBoZWFkIC0gdGFpbCAtIDE7CisJCQllbHNlCisJCQkJbGVuID0gdHhfbWFzayArIDEgLSB0YWlsOworCQkJbGVuID0gKGMgPiBsZW4pID8gbGVuIDogYzsKKwkJCW9mcyA9IGJhc2VBZGRyICsgRHluUGFnZV9hZGRyICsgYnVmaGVhZCArIHRhaWw7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJd3JpdGViKCpidWZmZXIrKywgb2ZzICsgaSk7CisJCQl0YWlsID0gKHRhaWwgKyBsZW4pICYgdHhfbWFzazsKKwkJCWMgLT0gbGVuOworCQl9CisJCXdyaXRldyh0YWlsLCBvZnNBZGRyICsgVFh3cHRyKTsKKwl9IGVsc2UgeworCQlsZW4gPSBjOworCQlwYWdlbm8gPSBzcGFnZSArICh0YWlsID4+IDEzKTsKKwkJcGFnZW9mcyA9IHRhaWwgJiBQYWdlX21hc2s7CisJCWRvIHsKKwkJCWNudCA9IFBhZ2Vfc2l6ZSAtIHBhZ2VvZnM7CisJCQlpZiAoY250ID4gYykKKwkJCQljbnQgPSBjOworCQkJYyAtPSBjbnQ7CisJCQl3cml0ZWIocGFnZW5vLCBiYXNlQWRkciArIENvbnRyb2xfcmVnKTsKKwkJCW9mcyA9IGJhc2VBZGRyICsgRHluUGFnZV9hZGRyICsgcGFnZW9mczsKKwkJCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykKKwkJCQl3cml0ZWIoKmJ1ZmZlcisrLCBvZnMgKyBpKTsKKwkJCWlmIChjID09IDApIHsKKwkJCQl3cml0ZXcoKHRhaWwgKyBsZW4pICYgdHhfbWFzaywgb2ZzQWRkciArIFRYd3B0cik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoKytwYWdlbm8gPT0gZXBhZ2UpCisJCQkJcGFnZW5vID0gc3BhZ2U7CisJCQlwYWdlb2ZzID0gMDsKKwkJfSB3aGlsZSAoMSk7CisJfQorCXdyaXRlYigxLCBvZnNBZGRyICsgQ0QxODBUWGlycSk7CS8qIHN0YXJ0IHRvIHNlbmQgKi8KKwlyZXR1cm4gKHRvdGFsKTsKK30KKworaW50IE1veGFQb3J0UmVhZERhdGEoaW50IHBvcnQsIHVuc2lnbmVkIGNoYXIgKiBidWZmZXIsIGludCBzcGFjZSkKK3sKKwlyZWdpc3RlciB1c2hvcnQgaGVhZCwgcGFnZW9mczsKKwlpbnQgaSwgY291bnQsIGNudCwgbGVuLCB0b3RhbCwgcmVtYWluOworCXVzaG9ydCB0YWlsLCByeF9tYXNrLCBzcGFnZSwgZXBhZ2U7CisJdXNob3J0IHBhZ2VubywgYnVmaGVhZDsKKwl2b2lkIF9faW9tZW0gKmJhc2VBZGRyLCAqb2ZzQWRkciwgKm9mczsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCWJhc2VBZGRyID0gbW94YUJhc2VBZGRyW3BvcnQgLyBNQVhfUE9SVFNfUEVSX0JPQVJEXTsKKwloZWFkID0gcmVhZHcob2ZzQWRkciArIFJYcnB0cik7CisJdGFpbCA9IHJlYWR3KG9mc0FkZHIgKyBSWHdwdHIpOworCXJ4X21hc2sgPSByZWFkdyhvZnNBZGRyICsgUlhfbWFzayk7CisJc3BhZ2UgPSByZWFkdyhvZnNBZGRyICsgUGFnZV9yeGIpOworCWVwYWdlID0gcmVhZHcob2ZzQWRkciArIEVuZFBhZ2VfcnhiKTsKKwljb3VudCA9ICh0YWlsID49IGhlYWQpID8gKHRhaWwgLSBoZWFkKQorCSAgICA6ICh0YWlsIC0gaGVhZCArIHJ4X21hc2sgKyAxKTsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuICgwKTsKKworCXRvdGFsID0gKHNwYWNlID4gY291bnQpID8gY291bnQgOiBzcGFjZTsKKwlyZW1haW4gPSBjb3VudCAtIHRvdGFsOworCW1veGFMb2cucnhjbnRbcG9ydF0gKz0gdG90YWw7CisJY291bnQgPSB0b3RhbDsKKwlpZiAoc3BhZ2UgPT0gZXBhZ2UpIHsKKwkJYnVmaGVhZCA9IHJlYWR3KG9mc0FkZHIgKyBPZnNfcnhiKTsKKwkJd3JpdGV3KHNwYWdlLCBiYXNlQWRkciArIENvbnRyb2xfcmVnKTsKKwkJd2hpbGUgKGNvdW50ID4gMCkgeworCQkJaWYgKHRhaWwgPj0gaGVhZCkKKwkJCQlsZW4gPSB0YWlsIC0gaGVhZDsKKwkJCWVsc2UKKwkJCQlsZW4gPSByeF9tYXNrICsgMSAtIGhlYWQ7CisJCQlsZW4gPSAoY291bnQgPiBsZW4pID8gbGVuIDogY291bnQ7CisJCQlvZnMgPSBiYXNlQWRkciArIER5blBhZ2VfYWRkciArIGJ1ZmhlYWQgKyBoZWFkOworCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJCSpidWZmZXIrKyA9IHJlYWRiKG9mcyArIGkpOworCQkJaGVhZCA9IChoZWFkICsgbGVuKSAmIHJ4X21hc2s7CisJCQljb3VudCAtPSBsZW47CisJCX0KKwkJd3JpdGV3KGhlYWQsIG9mc0FkZHIgKyBSWHJwdHIpOworCX0gZWxzZSB7CisJCWxlbiA9IGNvdW50OworCQlwYWdlbm8gPSBzcGFnZSArIChoZWFkID4+IDEzKTsKKwkJcGFnZW9mcyA9IGhlYWQgJiBQYWdlX21hc2s7CisJCWRvIHsKKwkJCWNudCA9IFBhZ2Vfc2l6ZSAtIHBhZ2VvZnM7CisJCQlpZiAoY250ID4gY291bnQpCisJCQkJY250ID0gY291bnQ7CisJCQljb3VudCAtPSBjbnQ7CisJCQl3cml0ZXcocGFnZW5vLCBiYXNlQWRkciArIENvbnRyb2xfcmVnKTsKKwkJCW9mcyA9IGJhc2VBZGRyICsgRHluUGFnZV9hZGRyICsgcGFnZW9mczsKKwkJCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykKKwkJCQkqYnVmZmVyKysgPSByZWFkYihvZnMgKyBpKTsKKwkJCWlmIChjb3VudCA9PSAwKSB7CisJCQkJd3JpdGV3KChoZWFkICsgbGVuKSAmIHJ4X21hc2ssIG9mc0FkZHIgKyBSWHJwdHIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCsrcGFnZW5vID09IGVwYWdlKQorCQkJCXBhZ2VubyA9IHNwYWdlOworCQkJcGFnZW9mcyA9IDA7CisJCX0gd2hpbGUgKDEpOworCX0KKwlpZiAoKHJlYWRiKG9mc0FkZHIgKyBGbGFnU3RhdCkgJiBYb2ZmX3N0YXRlKSAmJiAocmVtYWluIDwgTG93V2F0ZXIpKSB7CisJCW1veGFMb3dXYXRlckNoayA9IDE7CisJCW1veGFMb3dDaGtGbGFnW3BvcnRdID0gMTsKKwl9CisJcmV0dXJuICh0b3RhbCk7Cit9CisKKworaW50IE1veGFQb3J0VHhRdWV1ZShpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJdXNob3J0IHJwdHIsIHdwdHIsIG1hc2s7CisJaW50IGxlbjsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCXJwdHIgPSByZWFkdyhvZnNBZGRyICsgVFhycHRyKTsKKwl3cHRyID0gcmVhZHcob2ZzQWRkciArIFRYd3B0cik7CisJbWFzayA9IHJlYWR3KG9mc0FkZHIgKyBUWF9tYXNrKTsKKwlsZW4gPSAod3B0ciAtIHJwdHIpICYgbWFzazsKKwlyZXR1cm4gKGxlbik7Cit9CisKK2ludCBNb3hhUG9ydFR4RnJlZShpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJdXNob3J0IHJwdHIsIHdwdHIsIG1hc2s7CisJaW50IGxlbjsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCXJwdHIgPSByZWFkdyhvZnNBZGRyICsgVFhycHRyKTsKKwl3cHRyID0gcmVhZHcob2ZzQWRkciArIFRYd3B0cik7CisJbWFzayA9IHJlYWR3KG9mc0FkZHIgKyBUWF9tYXNrKTsKKwlsZW4gPSBtYXNrIC0gKCh3cHRyIC0gcnB0cikgJiBtYXNrKTsKKwlyZXR1cm4gKGxlbik7Cit9CisKK2ludCBNb3hhUG9ydFJ4UXVldWUoaW50IHBvcnQpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCXVzaG9ydCBycHRyLCB3cHRyLCBtYXNrOworCWludCBsZW47CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwlycHRyID0gcmVhZHcob2ZzQWRkciArIFJYcnB0cik7CisJd3B0ciA9IHJlYWR3KG9mc0FkZHIgKyBSWHdwdHIpOworCW1hc2sgPSByZWFkdyhvZnNBZGRyICsgUlhfbWFzayk7CisJbGVuID0gKHdwdHIgLSBycHRyKSAmIG1hc2s7CisJcmV0dXJuIChsZW4pOworfQorCisKK3ZvaWQgTW94YVBvcnRUeERpc2FibGUoaW50IHBvcnQpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2V0WG9mZlN0YXRlLCBNYWdpY19jb2RlKTsKK30KKwordm9pZCBNb3hhUG9ydFR4RW5hYmxlKGludCBwb3J0KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NldFhvblN0YXRlLCBNYWdpY19jb2RlKTsKK30KKworCitpbnQgTW94YVBvcnRSZXNldEJya0NudChpbnQgcG9ydCkKK3sKKwl1c2hvcnQgY250OworCWNudCA9IG1veGFCcmVha0NudFtwb3J0XTsKKwltb3hhQnJlYWtDbnRbcG9ydF0gPSAwOworCXJldHVybiAoY250KTsKK30KKworCit2b2lkIE1veGFQb3J0U2VuZEJyZWFrKGludCBwb3J0LCBpbnQgbXMxMDApCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJaWYgKG1zMTAwKSB7CisJCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NlbmRCcmVhaywgTWFnaWNfY29kZSk7CisJCW1veGFkZWxheShtczEwMCAqIChIWiAvIDEwKSk7CisJfSBlbHNlIHsKKwkJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2VuZEJyZWFrLCBNYWdpY19jb2RlKTsKKwkJbW94YWRlbGF5KEhaIC8gNCk7CS8qIDI1MCBtcyAqLworCX0KKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19TdG9wQnJlYWssIE1hZ2ljX2NvZGUpOworfQorCitzdGF0aWMgaW50IG1veGFfZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBtb3hhX3N0ciAqaW5mbywKKwkJCQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOworCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAudHlwZSA9IGluZm8tPnR5cGU7CisJdG1wLmxpbmUgPSBpbmZvLT5wb3J0OworCXRtcC5wb3J0ID0gMDsKKwl0bXAuaXJxID0gMDsKKwl0bXAuZmxhZ3MgPSBpbmZvLT5hc3luY2ZsYWdzOworCXRtcC5iYXVkX2Jhc2UgPSA5MjE2MDA7CisJdG1wLmNsb3NlX2RlbGF5ID0gaW5mby0+Y2xvc2VfZGVsYXk7CisJdG1wLmNsb3Npbmdfd2FpdCA9IGluZm8tPmNsb3Npbmdfd2FpdDsKKwl0bXAuY3VzdG9tX2Rpdmlzb3IgPSAwOworCXRtcC5odWI2ID0gMDsKKwlpZihjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAoMCk7Cit9CisKKworc3RhdGljIGludCBtb3hhX3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbW94YV9zdHIgKmluZm8sCisJCQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpuZXdfaW5mbykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOworCisJaWYoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsIG5ld19pbmZvLCBzaXplb2YobmV3X3NlcmlhbCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgobmV3X3NlcmlhbC5pcnEgIT0gMCkgfHwKKwkgICAgKG5ld19zZXJpYWwucG9ydCAhPSAwKSB8fAorLy8gICAgICAgICAgIChuZXdfc2VyaWFsLnR5cGUgIT0gaW5mby0+dHlwZSkgfHwKKwkgICAgKG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3IgIT0gMCkgfHwKKwkgICAgKG5ld19zZXJpYWwuYmF1ZF9iYXNlICE9IDkyMTYwMCkpCisJCXJldHVybiAoLUVQRVJNKTsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlpZiAoKChuZXdfc2VyaWFsLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPQorCQkgICAgIChpbmZvLT5hc3luY2ZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCisJCQlyZXR1cm4gKC1FUEVSTSk7CisJfSBlbHNlIHsKKwkJaW5mby0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICogSFogLyAxMDA7CisJCWluZm8tPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFogLyAxMDA7CisJfQorCisJbmV3X3NlcmlhbC5mbGFncyA9IChuZXdfc2VyaWFsLmZsYWdzICYgfkFTWU5DX0ZMQUdTKTsKKwluZXdfc2VyaWFsLmZsYWdzIHw9IChpbmZvLT5hc3luY2ZsYWdzICYgQVNZTkNfRkxBR1MpOworCisJaWYgKG5ld19zZXJpYWwudHlwZSA9PSBQT1JUXzE2NTUwQSkgeworCQlNb3hhU2V0RmlmbyhpbmZvLT5wb3J0LCAxKTsKKwl9IGVsc2UgeworCQlNb3hhU2V0RmlmbyhpbmZvLT5wb3J0LCAwKTsKKwl9CisKKwlpbmZvLT50eXBlID0gbmV3X3NlcmlhbC50eXBlOworCXJldHVybiAoMCk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCVN0YXRpYyBsb2NhbCBmdW5jdGlvbnM6IAkJCQkJICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbW94YWRlbGF5IC0gZGVsYXlzIGEgc3BlY2lmaWVkIG51bWJlciB0aWNrcworICovCitzdGF0aWMgdm9pZCBtb3hhZGVsYXkoaW50IHRpY2spCit7CisJdW5zaWduZWQgbG9uZyBzdCwgZXQ7CisKKwlzdCA9IGppZmZpZXM7CisJZXQgPSBzdCArIHRpY2s7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGV0KSk7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFmdW5jKHZvaWQgX19pb21lbSAqb2ZzQWRkciwgaW50IGNtZCwgdXNob3J0IGFyZykKK3sKKworCXdyaXRldyhhcmcsIG9mc0FkZHIgKyBGdW5jQXJnKTsKKwl3cml0ZXcoY21kLCBvZnNBZGRyICsgRnVuY0NvZGUpOworCXdhaXRfZmluaXNoKG9mc0FkZHIpOworfQorCitzdGF0aWMgdm9pZCB3YWl0X2ZpbmlzaCh2b2lkIF9faW9tZW0gKm9mc0FkZHIpCit7CisJdW5zaWduZWQgbG9uZyBpLCBqOworCisJaSA9IGppZmZpZXM7CisJd2hpbGUgKHJlYWR3KG9mc0FkZHIgKyBGdW5jQ29kZSkgIT0gMCkgeworCQlqID0gamlmZmllczsKKwkJaWYgKChqIC0gaSkgPiBtb3hhRnVuY1RvdXQpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgbG93X3dhdGVyX2NoZWNrKHZvaWQgX19pb21lbSAqb2ZzQWRkcikKK3sKKwlpbnQgbGVuOworCXVzaG9ydCBycHRyLCB3cHRyLCBtYXNrOworCisJaWYgKHJlYWRiKG9mc0FkZHIgKyBGbGFnU3RhdCkgJiBYb2ZmX3N0YXRlKSB7CisJCXJwdHIgPSByZWFkdyhvZnNBZGRyICsgUlhycHRyKTsKKwkJd3B0ciA9IHJlYWR3KG9mc0FkZHIgKyBSWHdwdHIpOworCQltYXNrID0gcmVhZHcob2ZzQWRkciArIFJYX21hc2spOworCQlsZW4gPSAod3B0ciAtIHJwdHIpICYgbWFzazsKKwkJaWYgKGxlbiA8PSBMb3dfd2F0ZXIpCisJCQltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZW5kWG9uLCAwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbW94YWxvYWRiaW9zKGludCBjYXJkbm8sIHVuc2lnbmVkIGNoYXIgX191c2VyICp0bXAsIGludCBsZW4pCit7CisJdm9pZCBfX2lvbWVtICpiYXNlQWRkcjsKKwlpbnQgaTsKKworCWlmKGNvcHlfZnJvbV91c2VyKG1veGFCdWZmLCB0bXAsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWJhc2VBZGRyID0gbW94YUJhc2VBZGRyW2NhcmRub107CisJd3JpdGViKEhXX3Jlc2V0LCBiYXNlQWRkciArIENvbnRyb2xfcmVnKTsJLyogcmVzZXQgKi8KKwltb3hhZGVsYXkoMSk7CQkvKiBkZWxheSAxMCBtcyAqLworCWZvciAoaSA9IDA7IGkgPCA0MDk2OyBpKyspCisJCXdyaXRlYigwLCBiYXNlQWRkciArIGkpOwkvKiBjbGVhciBmaXggcGFnZSAqLworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJd3JpdGViKG1veGFCdWZmW2ldLCBiYXNlQWRkciArIGkpOwkvKiBkb3dubG9hZCBCSU9TICovCisJd3JpdGViKDAsIGJhc2VBZGRyICsgQ29udHJvbF9yZWcpOwkvKiByZXN0YXJ0ICovCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBtb3hhZmluZGNhcmQoaW50IGNhcmRubykKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2VBZGRyOworCXVzaG9ydCB0bXA7CisKKwliYXNlQWRkciA9IG1veGFCYXNlQWRkcltjYXJkbm9dOworCXN3aXRjaCAobW94YV9ib2FyZHNbY2FyZG5vXS5ib2FyZFR5cGUpIHsKKwljYXNlIE1PWEFfQk9BUkRfQzIxOF9JU0E6CisJY2FzZSBNT1hBX0JPQVJEX0MyMThfUENJOgorCQlpZiAoKHRtcCA9IHJlYWR3KGJhc2VBZGRyICsgQzIxOF9rZXkpKSAhPSBDMjE4X0tleUNvZGUpIHsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCWJyZWFrOworCWNhc2UgTU9YQV9CT0FSRF9DUDIwNEo6CisJCWlmICgodG1wID0gcmVhZHcoYmFzZUFkZHIgKyBDMjE4X2tleSkpICE9IENQMjA0Sl9LZXlDb2RlKSB7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoKHRtcCA9IHJlYWR3KGJhc2VBZGRyICsgQzMyMF9rZXkpKSAhPSBDMzIwX0tleUNvZGUpIHsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCWlmICgodG1wID0gcmVhZHcoYmFzZUFkZHIgKyBDMzIwX3N0YXR1cykpICE9IFNUU19pbml0KSB7CisJCQlyZXR1cm4gKC0yKTsKKwkJfQorCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IG1veGFsb2FkMzIwYihpbnQgY2FyZG5vLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqdG1wLCBpbnQgbGVuKQoreworCXZvaWQgX19pb21lbSAqYmFzZUFkZHI7CisJaW50IGk7CisKKwlpZihsZW4gPiBzaXplb2YobW94YUJ1ZmYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZihjb3B5X2Zyb21fdXNlcihtb3hhQnVmZiwgdG1wLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwliYXNlQWRkciA9IG1veGFCYXNlQWRkcltjYXJkbm9dOworCXdyaXRldyhsZW4gLSA3MTY4IC0gMiwgYmFzZUFkZHIgKyBDMzIwYmFwaV9sZW4pOworCXdyaXRlYigxLCBiYXNlQWRkciArIENvbnRyb2xfcmVnKTsJLyogU2VsZWN0IFBhZ2UgMSAqLworCWZvciAoaSA9IDA7IGkgPCA3MTY4OyBpKyspCisJCXdyaXRlYihtb3hhQnVmZltpXSwgYmFzZUFkZHIgKyBEeW5QYWdlX2FkZHIgKyBpKTsKKwl3cml0ZWIoMiwgYmFzZUFkZHIgKyBDb250cm9sX3JlZyk7CS8qIFNlbGVjdCBQYWdlIDIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKGxlbiAtIDcxNjgpOyBpKyspCisJCXdyaXRlYihtb3hhQnVmZltpICsgNzE2OF0sIGJhc2VBZGRyICsgRHluUGFnZV9hZGRyICsgaSk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBtb3hhbG9hZGNvZGUoaW50IGNhcmRubywgdW5zaWduZWQgY2hhciBfX3VzZXIgKnRtcCwgaW50IGxlbikKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2VBZGRyLCAqb2ZzQWRkcjsKKwlpbnQgcmV0dmFsLCBwb3J0LCBpOworCisJaWYoY29weV9mcm9tX3VzZXIobW94YUJ1ZmYsIHRtcCwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYmFzZUFkZHIgPSBtb3hhQmFzZUFkZHJbY2FyZG5vXTsKKwlzd2l0Y2ggKG1veGFfYm9hcmRzW2NhcmRub10uYm9hcmRUeXBlKSB7CisJY2FzZSBNT1hBX0JPQVJEX0MyMThfSVNBOgorCWNhc2UgTU9YQV9CT0FSRF9DMjE4X1BDSToKKwljYXNlIE1PWEFfQk9BUkRfQ1AyMDRKOgorCQlyZXR2YWwgPSBtb3hhbG9hZGMyMTgoY2FyZG5vLCBiYXNlQWRkciwgbGVuKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiAocmV0dmFsKTsKKwkJcG9ydCA9IGNhcmRubyAqIE1BWF9QT1JUU19QRVJfQk9BUkQ7CisJCWZvciAoaSA9IDA7IGkgPCBtb3hhX2JvYXJkc1tjYXJkbm9dLm51bVBvcnRzOyBpKyssIHBvcnQrKykgeworCQkJbW94YUNoa1BvcnRbcG9ydF0gPSAxOworCQkJbW94YUN1ckJhdWRbcG9ydF0gPSA5NjAwTDsKKwkJCW1veGFEQ0RTdGF0ZVtwb3J0XSA9IDA7CisJCQltb3hhVGFibGVBZGRyW3BvcnRdID0gYmFzZUFkZHIgKyBFeHRlcm5fdGFibGUgKyBFeHRlcm5fc2l6ZSAqIGk7CisJCQlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwkJCXdyaXRldyhDMjE4cnhfbWFzaywgb2ZzQWRkciArIFJYX21hc2spOworCQkJd3JpdGV3KEMyMTh0eF9tYXNrLCBvZnNBZGRyICsgVFhfbWFzayk7CisJCQl3cml0ZXcoQzIxOHJ4X3NwYWdlICsgaSAqIEMyMThidWZfcGFnZW5vLCBvZnNBZGRyICsgUGFnZV9yeGIpOworCQkJd3JpdGV3KHJlYWR3KG9mc0FkZHIgKyBQYWdlX3J4YikgKyBDMjE4cnhfcGFnZW5vLCBvZnNBZGRyICsgRW5kUGFnZV9yeGIpOworCisJCQl3cml0ZXcoQzIxOHR4X3NwYWdlICsgaSAqIEMyMThidWZfcGFnZW5vLCBvZnNBZGRyICsgUGFnZV90eGIpOworCQkJd3JpdGV3KHJlYWR3KG9mc0FkZHIgKyBQYWdlX3R4YikgKyBDMjE4dHhfcGFnZW5vLCBvZnNBZGRyICsgRW5kUGFnZV90eGIpOworCisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gbW94YWxvYWRjMzIwKGNhcmRubywgYmFzZUFkZHIsIGxlbiwKKwkJCQkgICAgICAmbW94YV9ib2FyZHNbY2FyZG5vXS5udW1Qb3J0cyk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gKHJldHZhbCk7CisJCXBvcnQgPSBjYXJkbm8gKiBNQVhfUE9SVFNfUEVSX0JPQVJEOworCQlmb3IgKGkgPSAwOyBpIDwgbW94YV9ib2FyZHNbY2FyZG5vXS5udW1Qb3J0czsgaSsrLCBwb3J0KyspIHsKKwkJCW1veGFDaGtQb3J0W3BvcnRdID0gMTsKKwkJCW1veGFDdXJCYXVkW3BvcnRdID0gOTYwMEw7CisJCQltb3hhRENEU3RhdGVbcG9ydF0gPSAwOworCQkJbW94YVRhYmxlQWRkcltwb3J0XSA9IGJhc2VBZGRyICsgRXh0ZXJuX3RhYmxlICsgRXh0ZXJuX3NpemUgKiBpOworCQkJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJCQlpZiAobW94YV9ib2FyZHNbY2FyZG5vXS5udW1Qb3J0cyA9PSA4KSB7CisJCQkJd3JpdGV3KEMzMjBwOHJ4X21hc2ssIG9mc0FkZHIgKyBSWF9tYXNrKTsKKwkJCQl3cml0ZXcoQzMyMHA4dHhfbWFzaywgb2ZzQWRkciArIFRYX21hc2spOworCQkJCXdyaXRldyhDMzIwcDhyeF9zcGFnZSArIGkgKiBDMzIwcDhidWZfcGdubywgb2ZzQWRkciArIFBhZ2VfcnhiKTsKKwkJCQl3cml0ZXcocmVhZHcob2ZzQWRkciArIFBhZ2VfcnhiKSArIEMzMjBwOHJ4X3Bnbm8sIG9mc0FkZHIgKyBFbmRQYWdlX3J4Yik7CisJCQkJd3JpdGV3KEMzMjBwOHR4X3NwYWdlICsgaSAqIEMzMjBwOGJ1Zl9wZ25vLCBvZnNBZGRyICsgUGFnZV90eGIpOworCQkJCXdyaXRldyhyZWFkdyhvZnNBZGRyICsgUGFnZV90eGIpICsgQzMyMHA4dHhfcGdubywgb2ZzQWRkciArIEVuZFBhZ2VfdHhiKTsKKworCQkJfSBlbHNlIGlmIChtb3hhX2JvYXJkc1tjYXJkbm9dLm51bVBvcnRzID09IDE2KSB7CisJCQkJd3JpdGV3KEMzMjBwMTZyeF9tYXNrLCBvZnNBZGRyICsgUlhfbWFzayk7CisJCQkJd3JpdGV3KEMzMjBwMTZ0eF9tYXNrLCBvZnNBZGRyICsgVFhfbWFzayk7CisJCQkJd3JpdGV3KEMzMjBwMTZyeF9zcGFnZSArIGkgKiBDMzIwcDE2YnVmX3Bnbm8sIG9mc0FkZHIgKyBQYWdlX3J4Yik7CisJCQkJd3JpdGV3KHJlYWR3KG9mc0FkZHIgKyBQYWdlX3J4YikgKyBDMzIwcDE2cnhfcGdubywgb2ZzQWRkciArIEVuZFBhZ2VfcnhiKTsKKwkJCQl3cml0ZXcoQzMyMHAxNnR4X3NwYWdlICsgaSAqIEMzMjBwMTZidWZfcGdubywgb2ZzQWRkciArIFBhZ2VfdHhiKTsKKwkJCQl3cml0ZXcocmVhZHcob2ZzQWRkciArIFBhZ2VfdHhiKSArIEMzMjBwMTZ0eF9wZ25vLCBvZnNBZGRyICsgRW5kUGFnZV90eGIpOworCisJCQl9IGVsc2UgaWYgKG1veGFfYm9hcmRzW2NhcmRub10ubnVtUG9ydHMgPT0gMjQpIHsKKwkJCQl3cml0ZXcoQzMyMHAyNHJ4X21hc2ssIG9mc0FkZHIgKyBSWF9tYXNrKTsKKwkJCQl3cml0ZXcoQzMyMHAyNHR4X21hc2ssIG9mc0FkZHIgKyBUWF9tYXNrKTsKKwkJCQl3cml0ZXcoQzMyMHAyNHJ4X3NwYWdlICsgaSAqIEMzMjBwMjRidWZfcGdubywgb2ZzQWRkciArIFBhZ2VfcnhiKTsKKwkJCQl3cml0ZXcocmVhZHcob2ZzQWRkciArIFBhZ2VfcnhiKSArIEMzMjBwMjRyeF9wZ25vLCBvZnNBZGRyICsgRW5kUGFnZV9yeGIpOworCQkJCXdyaXRldyhDMzIwcDI0dHhfc3BhZ2UgKyBpICogQzMyMHAyNGJ1Zl9wZ25vLCBvZnNBZGRyICsgUGFnZV90eGIpOworCQkJCXdyaXRldyhyZWFkdyhvZnNBZGRyICsgUGFnZV90eGIpLCBvZnNBZGRyICsgRW5kUGFnZV90eGIpOworCQkJfSBlbHNlIGlmIChtb3hhX2JvYXJkc1tjYXJkbm9dLm51bVBvcnRzID09IDMyKSB7CisJCQkJd3JpdGV3KEMzMjBwMzJyeF9tYXNrLCBvZnNBZGRyICsgUlhfbWFzayk7CisJCQkJd3JpdGV3KEMzMjBwMzJ0eF9tYXNrLCBvZnNBZGRyICsgVFhfbWFzayk7CisJCQkJd3JpdGV3KEMzMjBwMzJ0eF9vZnMsIG9mc0FkZHIgKyBPZnNfdHhiKTsKKwkJCQl3cml0ZXcoQzMyMHAzMnJ4X3NwYWdlICsgaSAqIEMzMjBwMzJidWZfcGdubywgb2ZzQWRkciArIFBhZ2VfcnhiKTsKKwkJCQl3cml0ZXcocmVhZGIob2ZzQWRkciArIFBhZ2VfcnhiKSwgb2ZzQWRkciArIEVuZFBhZ2VfcnhiKTsKKwkJCQl3cml0ZXcoQzMyMHAzMnR4X3NwYWdlICsgaSAqIEMzMjBwMzJidWZfcGdubywgb2ZzQWRkciArIFBhZ2VfdHhiKTsKKwkJCQl3cml0ZXcocmVhZHcob2ZzQWRkciArIFBhZ2VfdHhiKSwgb2ZzQWRkciArIEVuZFBhZ2VfdHhiKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBtb3hhbG9hZGMyMTgoaW50IGNhcmRubywgdm9pZCBfX2lvbWVtICpiYXNlQWRkciwgaW50IGxlbikKK3sKKwljaGFyIHJldHJ5OworCWludCBpLCBqLCBsZW4xLCBsZW4yOworCXVzaG9ydCB1c3VtLCAqcHRyLCBrZXljb2RlOworCisJaWYgKG1veGFfYm9hcmRzW2NhcmRub10uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQ1AyMDRKKQorCQlrZXljb2RlID0gQ1AyMDRKX0tleUNvZGU7CisJZWxzZQorCQlrZXljb2RlID0gQzIxOF9LZXlDb2RlOworCXVzdW0gPSAwOworCWxlbjEgPSBsZW4gPj4gMTsKKwlwdHIgPSAodXNob3J0ICopIG1veGFCdWZmOworCWZvciAoaSA9IDA7IGkgPCBsZW4xOyBpKyspCisJCXVzdW0gKz0gKihwdHIgKyBpKTsKKwlyZXRyeSA9IDA7CisJZG8geworCQlsZW4xID0gbGVuID4+IDE7CisJCWogPSAwOworCQl3aGlsZSAobGVuMSkgeworCQkJbGVuMiA9IChsZW4xID4gMjA0OCkgPyAyMDQ4IDogbGVuMTsKKwkJCWxlbjEgLT0gbGVuMjsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW4yIDw8IDE7IGkrKykKKwkJCQl3cml0ZWIobW94YUJ1ZmZbaSArIGpdLCBiYXNlQWRkciArIEMyMThfTG9hZEJ1ZiArIGkpOworCQkJaiArPSBpOworCisJCQl3cml0ZXcobGVuMiwgYmFzZUFkZHIgKyBDMjE4RExvYWRfbGVuKTsKKwkJCXdyaXRldygwLCBiYXNlQWRkciArIEMyMThfa2V5KTsKKwkJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMyMThfa2V5KSA9PSBrZXljb2RlKQorCQkJCQlicmVhazsKKwkJCQltb3hhZGVsYXkoMSk7CS8qIGRlbGF5IDEwIG1zICovCisJCQl9CisJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMjE4X2tleSkgIT0ga2V5Y29kZSkgeworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQl9CisJCXdyaXRldygwLCBiYXNlQWRkciArIEMyMThETG9hZF9sZW4pOworCQl3cml0ZXcodXN1bSwgYmFzZUFkZHIgKyBDMjE4Y2hlY2tfc3VtKTsKKwkJd3JpdGV3KDAsIGJhc2VBZGRyICsgQzIxOF9rZXkpOworCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMyMThfa2V5KSA9PSBrZXljb2RlKQorCQkJCWJyZWFrOworCQkJbW94YWRlbGF5KDEpOwkvKiBkZWxheSAxMCBtcyAqLworCQl9CisJCXJldHJ5Kys7CisJfSB3aGlsZSAoKHJlYWRiKGJhc2VBZGRyICsgQzIxOGNoa3N1bV9vaykgIT0gMSkgJiYgKHJldHJ5IDwgMykpOworCWlmIChyZWFkYihiYXNlQWRkciArIEMyMThjaGtzdW1fb2spICE9IDEpIHsKKwkJcmV0dXJuICgtMSk7CisJfQorCXdyaXRldygwLCBiYXNlQWRkciArIEMyMThfa2V5KTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pID09IE1hZ2ljX2NvZGUpCisJCQlicmVhazsKKwkJbW94YWRlbGF5KDEpOwkvKiBkZWxheSAxMCBtcyAqLworCX0KKwlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgIT0gTWFnaWNfY29kZSkgeworCQlyZXR1cm4gKC0xKTsKKwl9CisJd3JpdGV3KDEsIGJhc2VBZGRyICsgRGlzYWJsZV9JUlEpOworCXdyaXRldygwLCBiYXNlQWRkciArIE1hZ2ljX25vKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pID09IE1hZ2ljX2NvZGUpCisJCQlicmVhazsKKwkJbW94YWRlbGF5KDEpOwkvKiBkZWxheSAxMCBtcyAqLworCX0KKwlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgIT0gTWFnaWNfY29kZSkgeworCQlyZXR1cm4gKC0xKTsKKwl9CisJbW94YUNhcmQgPSAxOworCW1veGFJbnROZHhbY2FyZG5vXSA9IGJhc2VBZGRyICsgSVJRaW5kZXg7CisJbW94YUludFBlbmRbY2FyZG5vXSA9IGJhc2VBZGRyICsgSVJRcGVuZGluZzsKKwltb3hhSW50VGFibGVbY2FyZG5vXSA9IGJhc2VBZGRyICsgSVJRdGFibGU7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBtb3hhbG9hZGMzMjAoaW50IGNhcmRubywgdm9pZCBfX2lvbWVtICpiYXNlQWRkciwgaW50IGxlbiwgaW50ICpudW1Qb3J0cykKK3sKKwl1c2hvcnQgdXN1bTsKKwlpbnQgaSwgaiwgd2xlbiwgbGVuMiwgcmV0cnk7CisJdXNob3J0ICp1cHRyOworCisJdXN1bSA9IDA7CisJd2xlbiA9IGxlbiA+PiAxOworCXVwdHIgPSAodXNob3J0ICopIG1veGFCdWZmOworCWZvciAoaSA9IDA7IGkgPCB3bGVuOyBpKyspCisJCXVzdW0gKz0gdXB0cltpXTsKKwlyZXRyeSA9IDA7CisJaiA9IDA7CisJZG8geworCQl3aGlsZSAod2xlbikgeworCQkJaWYgKHdsZW4gPiAyMDQ4KQorCQkJCWxlbjIgPSAyMDQ4OworCQkJZWxzZQorCQkJCWxlbjIgPSB3bGVuOworCQkJd2xlbiAtPSBsZW4yOworCQkJbGVuMiA8PD0gMTsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW4yOyBpKyspCisJCQkJd3JpdGViKG1veGFCdWZmW2ogKyBpXSwgYmFzZUFkZHIgKyBDMzIwX0xvYWRCdWYgKyBpKTsKKwkJCWxlbjIgPj49IDE7CisJCQlqICs9IGk7CisJCQl3cml0ZXcobGVuMiwgYmFzZUFkZHIgKyBDMzIwRExvYWRfbGVuKTsKKwkJCXdyaXRldygwLCBiYXNlQWRkciArIEMzMjBfa2V5KTsKKwkJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQkJaWYgKHJlYWR3KGJhc2VBZGRyICsgQzMyMF9rZXkpID09IEMzMjBfS2V5Q29kZSkKKwkJCQkJYnJlYWs7CisJCQkJbW94YWRlbGF5KDEpOworCQkJfQorCQkJaWYgKHJlYWR3KGJhc2VBZGRyICsgQzMyMF9rZXkpICE9IEMzMjBfS2V5Q29kZSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQl3cml0ZXcoMCwgYmFzZUFkZHIgKyBDMzIwRExvYWRfbGVuKTsKKwkJd3JpdGV3KHVzdW0sIGJhc2VBZGRyICsgQzMyMGNoZWNrX3N1bSk7CisJCXdyaXRldygwLCBiYXNlQWRkciArIEMzMjBfa2V5KTsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMzMjBfa2V5KSA9PSBDMzIwX0tleUNvZGUpCisJCQkJYnJlYWs7CisJCQltb3hhZGVsYXkoMSk7CisJCX0KKwkJcmV0cnkrKzsKKwl9IHdoaWxlICgocmVhZGIoYmFzZUFkZHIgKyBDMzIwY2hrc3VtX29rKSAhPSAxKSAmJiAocmV0cnkgPCAzKSk7CisJaWYgKHJlYWRiKGJhc2VBZGRyICsgQzMyMGNoa3N1bV9vaykgIT0gMSkKKwkJcmV0dXJuICgtMSk7CisJd3JpdGV3KDAsIGJhc2VBZGRyICsgQzMyMF9rZXkpOworCWZvciAoaSA9IDA7IGkgPCA2MDA7IGkrKykgeworCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgPT0gTWFnaWNfY29kZSkKKwkJCWJyZWFrOworCQltb3hhZGVsYXkoMSk7CisJfQorCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSAhPSBNYWdpY19jb2RlKQorCQlyZXR1cm4gKC0xMDApOworCisJaWYgKG1veGFfYm9hcmRzW2NhcmRub10uYnVzVHlwZSA9PSBNT1hBX0JVU19UWVBFX1BDSSkgewkJLyogQVNJQyBib2FyZCAqLworCQl3cml0ZXcoMHgzODAwLCBiYXNlQWRkciArIFRNUzMyMF9QT1JUMSk7CisJCXdyaXRldygweDM5MDAsIGJhc2VBZGRyICsgVE1TMzIwX1BPUlQyKTsKKwkJd3JpdGV3KDI4NDk5LCBiYXNlQWRkciArIFRNUzMyMF9DTE9DSyk7CisJfSBlbHNlIHsKKwkJd3JpdGV3KDB4MzIwMCwgYmFzZUFkZHIgKyBUTVMzMjBfUE9SVDEpOworCQl3cml0ZXcoMHgzNDAwLCBiYXNlQWRkciArIFRNUzMyMF9QT1JUMik7CisJCXdyaXRldygxOTk5OSwgYmFzZUFkZHIgKyBUTVMzMjBfQ0xPQ0spOworCX0KKwl3cml0ZXcoMSwgYmFzZUFkZHIgKyBEaXNhYmxlX0lSUSk7CisJd3JpdGV3KDAsIGJhc2VBZGRyICsgTWFnaWNfbm8pOworCWZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykgeworCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgPT0gTWFnaWNfY29kZSkKKwkJCWJyZWFrOworCQltb3hhZGVsYXkoMSk7CisJfQorCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSAhPSBNYWdpY19jb2RlKQorCQlyZXR1cm4gKC0xMDIpOworCisJaiA9IHJlYWR3KGJhc2VBZGRyICsgTW9kdWxlX2NudCk7CisJaWYgKGogPD0gMCkKKwkJcmV0dXJuICgtMTAxKTsKKwkqbnVtUG9ydHMgPSBqICogODsKKwl3cml0ZXcoaiwgYmFzZUFkZHIgKyBNb2R1bGVfbm8pOworCXdyaXRldygwLCBiYXNlQWRkciArIE1hZ2ljX25vKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjAwOyBpKyspIHsKKwkJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pID09IE1hZ2ljX2NvZGUpCisJCQlicmVhazsKKwkJbW94YWRlbGF5KDEpOworCX0KKwlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgIT0gTWFnaWNfY29kZSkKKwkJcmV0dXJuICgtMTAyKTsKKwltb3hhQ2FyZCA9IDE7CisJbW94YUludE5keFtjYXJkbm9dID0gYmFzZUFkZHIgKyBJUlFpbmRleDsKKwltb3hhSW50UGVuZFtjYXJkbm9dID0gYmFzZUFkZHIgKyBJUlFwZW5kaW5nOworCW1veGFJbnRUYWJsZVtjYXJkbm9dID0gYmFzZUFkZHIgKyBJUlF0YWJsZTsKKwlyZXR1cm4gKDApOworfQorCisjaWYgMAorbG9uZyBNb3hhUG9ydEdldEN1ckJhdWQoaW50IHBvcnQpCit7CisKKwlpZiAobW94YUNoa1BvcnRbcG9ydF0gPT0gMCkKKwkJcmV0dXJuICgwKTsKKwlyZXR1cm4gKG1veGFDdXJCYXVkW3BvcnRdKTsKK30KKyNlbmRpZiAgLyogIDAgICovCisKK3N0YXRpYyB2b2lkIE1veGFTZXRGaWZvKGludCBwb3J0LCBpbnQgZW5hYmxlKQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisKKwlpZiAoIWVuYWJsZSkgeworCQltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXRSeEZJRk9UcmlnLCAwKTsKKwkJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2V0VHhGSUZPQ250LCAxKTsKKwl9IGVsc2UgeworCQltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXRSeEZJRk9UcmlnLCAzKTsKKwkJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2V0VHhGSUZPQ250LCAxNik7CisJfQorfQorCisjaWYgMAoraW50IE1veGFQb3J0U2V0TW9kZShpbnQgcG9ydCwgaW50IGRhdGFiaXRzLCBpbnQgc3RvcGJpdHMsIGludCBwYXJpdHkpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCWludCB2YWw7CisKKwl2YWwgPSAwOworCXN3aXRjaCAoZGF0YWJpdHMpIHsKKwljYXNlIDU6CisJCXZhbCB8PSAwOworCQlicmVhazsKKwljYXNlIDY6CisJCXZhbCB8PSAxOworCQlicmVhazsKKwljYXNlIDc6CisJCXZhbCB8PSAyOworCQlicmVhazsKKwljYXNlIDg6CisJCXZhbCB8PSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKC0xKTsKKwl9CisJc3dpdGNoIChzdG9wYml0cykgeworCWNhc2UgMDoKKwkJdmFsIHw9IDA7CisJCWJyZWFrOwkJLyogc3RvcCBiaXRzIDEuNSAqLworCWNhc2UgMToKKwkJdmFsIHw9IDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdmFsIHw9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAoLTEpOworCX0KKwlzd2l0Y2ggKHBhcml0eSkgeworCWNhc2UgMDoKKwkJdmFsIHw9IDB4MDA7CisJCWJyZWFrOwkJLyogTm9uZSAgKi8KKwljYXNlIDE6CisJCXZhbCB8PSAweDA4OworCQlicmVhazsJCS8qIE9kZCAgICovCisJY2FzZSAyOgorCQl2YWwgfD0gMHgxODsKKwkJYnJlYWs7CQkvKiBFdmVuICAqLworCWNhc2UgMzoKKwkJdmFsIHw9IDB4Mjg7CisJCWJyZWFrOwkJLyogTWFyayAgKi8KKwljYXNlIDQ6CisJCXZhbCB8PSAweDM4OworCQlicmVhazsJCS8qIFNwYWNlICovCisJZGVmYXVsdDoKKwkJcmV0dXJuICgtMSk7CisJfQorCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NldE1vZGUsIHZhbCk7CisJcmV0dXJuICgwKTsKK30KKworaW50IE1veGFQb3J0VHhCdWZTaXplKGludCBwb3J0KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwlpbnQgc2l6ZTsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCXNpemUgPSByZWFkdyhvZnNBZGRyICsgVFhfbWFzayk7CisJcmV0dXJuIChzaXplKTsKK30KKworaW50IE1veGFQb3J0UnhCdWZTaXplKGludCBwb3J0KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwlpbnQgc2l6ZTsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCXNpemUgPSByZWFkdyhvZnNBZGRyICsgUlhfbWFzayk7CisJcmV0dXJuIChzaXplKTsKK30KKworaW50IE1veGFQb3J0UnhGcmVlKGludCBwb3J0KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwl1c2hvcnQgcnB0ciwgd3B0ciwgbWFzazsKKwlpbnQgbGVuOworCisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJcnB0ciA9IHJlYWR3KG9mc0FkZHIgKyBSWHJwdHIpOworCXdwdHIgPSByZWFkdyhvZnNBZGRyICsgUlh3cHRyKTsKKwltYXNrID0gcmVhZHcob2ZzQWRkciArIFJYX21hc2spOworCWxlbiA9IG1hc2sgLSAoKHdwdHIgLSBycHRyKSAmIG1hc2spOworCXJldHVybiAobGVuKTsKK30KK2ludCBNb3hhUG9ydEdldEJya0NudChpbnQgcG9ydCkKK3sKKwlyZXR1cm4gKG1veGFCcmVha0NudFtwb3J0XSk7Cit9CisKK3ZvaWQgTW94YVBvcnRTZXRYb25Yb2ZmKGludCBwb3J0LCBpbnQgeG9uVmFsdWUsIGludCB4b2ZmVmFsdWUpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJd3JpdGV3KHhvblZhbHVlLCBvZnNBZGRyICsgRnVuY0FyZyk7CisJd3JpdGV3KHhvZmZWYWx1ZSwgb2ZzQWRkciArIEZ1bmNBcmcxKTsKKwl3cml0ZXcoRkNfU2V0WG9uWG9mZiwgb2ZzQWRkciArIEZ1bmNDb2RlKTsKKwl3YWl0X2ZpbmlzaChvZnNBZGRyKTsKK30KKworaW50IE1veGFQb3J0SXNUeEhvbGQoaW50IHBvcnQpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCWludCB2YWw7CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwlpZiAoKG1veGFfYm9hcmRzW3BvcnQgLyBNQVhfUE9SVFNfUEVSX0JPQVJEXS5ib2FyZFR5cGUgPT0gTU9YQV9CT0FSRF9DMzIwX0lTQSkgfHwKKwkgICAgKG1veGFfYm9hcmRzW3BvcnQgLyBNQVhfUE9SVFNfUEVSX0JPQVJEXS5ib2FyZFR5cGUgPT0gTU9YQV9CT0FSRF9DMzIwX1BDSSkpIHsKKwkJbW94YWZ1bmMob2ZzQWRkciwgRkNfR2V0Q0NTUiwgMCk7CisJCXZhbCA9IHJlYWR3KG9mc0FkZHIgKyBGdW5jQXJnKTsKKwkJaWYgKHZhbCAmIDB4MDQpCisJCQlyZXR1cm4gKDEpOworCX0gZWxzZSB7CisJCWlmIChyZWFkdyhvZnNBZGRyICsgRmxhZ1N0YXQpICYgVHhfZmxvd09mZikKKwkJCXJldHVybiAoMSk7CisJfQorCXJldHVybiAoMCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwMGY1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCkBAIC0wLDAgKzEsNzI3IEBACisvKgorKgorKiAzNzgwaS5jIC0tIGhlbHBlciByb3V0aW5lcyBmb3IgdGhlIDM3ODBpIERTUAorKgorKgorKiBXcml0dGVuIEJ5OiBNaWtlIFN1bGxpdmFuIElCTSBDb3Jwb3JhdGlvbgorKgorKiBDb3B5cmlnaHQgKEMpIDE5OTkgSUJNIENvcnBvcmF0aW9uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIE5PIFdBUlJBTlRZCisqIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgorKiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorKiBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisqIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyogZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCisqIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworKiB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorKiBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKyoKKyogRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKyogTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisqIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisqIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorKiBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyoKKyoKKyogMTAvMjMvMjAwMCAtIEFscGhhIFJlbGVhc2UKKyoJRmlyc3QgcmVsZWFzZSB0byB0aGUgcHVibGljCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgInNtYXBpLmgiCisjaW5jbHVkZSAibXdhdmVkZC5oIgorI2luY2x1ZGUgIjM3ODBpLmgiCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZHNwX2xvY2spOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworc3RhdGljIHZvaWQgUGFjZU1zYUFjY2Vzcyh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTykKK3sKKwljb25kX3Jlc2NoZWQoKTsKKwl1ZGVsYXkoMTAwKTsKKwljb25kX3Jlc2NoZWQoKTsKK30KKwordW5zaWduZWQgc2hvcnQgZHNwMzc4MElfUmVhZE1zYUNmZyh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1bE1zYUFkZHIpCit7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisJUFJJTlRLXzMoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MElfUmVhZE1zYUNmZyBlbnRyeSB1c0RzcEJhc2VJTyAleCB1bE1zYUFkZHIgJWx4XG4iLAorCQl1c0RzcEJhc2VJTywgdWxNc2FBZGRyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJMb3csICh1bnNpZ25lZCBzaG9ydCkgdWxNc2FBZGRyKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRySGlnaCwgKHVuc2lnbmVkIHNob3J0KSAodWxNc2FBZGRyID4+IDE2KSk7CisJdmFsID0gSW5Xb3JkRHNwKERTUF9Nc2FEYXRhRFNJU0hpZ2gpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwgIjM3ODBpOjpkc3AzNzgwSV9SZWFkTXNhQ2ZnIGV4aXQgdmFsICV4XG4iLCB2YWwpOworCisJcmV0dXJuIHZhbDsKK30KKwordm9pZCBkc3AzNzgwSV9Xcml0ZU1zYUNmZyh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1bE1zYUFkZHIsIHVuc2lnbmVkIHNob3J0IHVzVmFsdWUpCit7CisKKwlQUklOVEtfNChUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9Xcml0ZU1zYUNmZyBlbnRyeSB1c0RzcEJhc2VJTyAleCB1bE1zYUFkZHIgJWx4IHVzVmFsdWUgJXhcbiIsCisJCXVzRHNwQmFzZUlPLCB1bE1zYUFkZHIsIHVzVmFsdWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJT3V0V29yZERzcChEU1BfTXNhQWRkckxvdywgKHVuc2lnbmVkIHNob3J0KSB1bE1zYUFkZHIpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJIaWdoLCAodW5zaWduZWQgc2hvcnQpICh1bE1zYUFkZHIgPj4gMTYpKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FEYXRhRFNJU0hpZ2gsIHVzVmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgZHNwMzc4MElfV3JpdGVHZW5DZmcodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sIHVuc2lnbmVkIHVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB1Y1ZhbHVlKQoreworCURTUF9JU0FfU0xBVkVfQ09OVFJPTCByU2xhdmVDb250cm9sOworCURTUF9JU0FfU0xBVkVfQ09OVFJPTCByU2xhdmVDb250cm9sX1NhdmU7CisKKworCVBSSU5US180KFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBpX1dyaXRlR2VuQ2ZnIGVudHJ5IHVzRHNwQmFzZUlPICV4IHVJbmRleCAleCB1Y1ZhbHVlICV4XG4iLAorCQl1c0RzcEJhc2VJTywgdUluZGV4LCB1Y1ZhbHVlKTsKKworCU1LQllURShyU2xhdmVDb250cm9sKSA9IEluQnl0ZURzcChEU1BfSXNhU2xhdmVDb250cm9sKTsKKworCVBSSU5US18yKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBpX1dyaXRlR2VuQ2ZnIHJTbGF2ZUNvbnRyb2wgJXhcbiIsCisJCU1LQllURShyU2xhdmVDb250cm9sKSk7CisKKwlyU2xhdmVDb250cm9sX1NhdmUgPSByU2xhdmVDb250cm9sOworCXJTbGF2ZUNvbnRyb2wuQ29uZmlnTW9kZSA9IFRSVUU7CisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9Xcml0ZUdlbkNmZyBlbnRyeSByU2xhdmVDb250cm9sK0NvbmZpZ01vZGUgJXhcbiIsCisJCU1LQllURShyU2xhdmVDb250cm9sKSk7CisKKwlPdXRCeXRlRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wsIE1LQllURShyU2xhdmVDb250cm9sKSk7CisJT3V0Qnl0ZURzcChEU1BfQ29uZmlnQWRkcmVzcywgKHVuc2lnbmVkIGNoYXIpIHVJbmRleCk7CisJT3V0Qnl0ZURzcChEU1BfQ29uZmlnRGF0YSwgdWNWYWx1ZSk7CisJT3V0Qnl0ZURzcChEU1BfSXNhU2xhdmVDb250cm9sLCBNS0JZVEUoclNsYXZlQ29udHJvbF9TYXZlKSk7CisKKwlQUklOVEtfMShUUkFDRV8zNzgwSSwgIjM3ODBpOjpkc3AzNzgwaV9Xcml0ZUdlbkNmZyBleGl0XG4iKTsKKworCit9CisKK3Vuc2lnbmVkIGNoYXIgZHNwMzc4MElfUmVhZEdlbkNmZyh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1SW5kZXgpCit7CisJRFNQX0lTQV9TTEFWRV9DT05UUk9MIHJTbGF2ZUNvbnRyb2w7CisJRFNQX0lTQV9TTEFWRV9DT05UUk9MIHJTbGF2ZUNvbnRyb2xfU2F2ZTsKKwl1bnNpZ25lZCBjaGFyIHVjVmFsdWU7CisKKworCVBSSU5US18zKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBpX1JlYWRHZW5DZmcgZW50cnkgdXNEc3BCYXNlSU8gJXggdUluZGV4ICV4XG4iLAorCQl1c0RzcEJhc2VJTywgdUluZGV4KTsKKworCU1LQllURShyU2xhdmVDb250cm9sKSA9IEluQnl0ZURzcChEU1BfSXNhU2xhdmVDb250cm9sKTsKKwlyU2xhdmVDb250cm9sX1NhdmUgPSByU2xhdmVDb250cm9sOworCXJTbGF2ZUNvbnRyb2wuQ29uZmlnTW9kZSA9IFRSVUU7CisJT3V0Qnl0ZURzcChEU1BfSXNhU2xhdmVDb250cm9sLCBNS0JZVEUoclNsYXZlQ29udHJvbCkpOworCU91dEJ5dGVEc3AoRFNQX0NvbmZpZ0FkZHJlc3MsICh1bnNpZ25lZCBjaGFyKSB1SW5kZXgpOworCXVjVmFsdWUgPSBJbkJ5dGVEc3AoRFNQX0NvbmZpZ0RhdGEpOworCU91dEJ5dGVEc3AoRFNQX0lzYVNsYXZlQ29udHJvbCwgTUtCWVRFKHJTbGF2ZUNvbnRyb2xfU2F2ZSkpOworCisJUFJJTlRLXzIoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MGlfUmVhZEdlbkNmZyBleGl0IHVjVmFsdWUgJXhcbiIsIHVjVmFsdWUpOworCisKKwlyZXR1cm4gdWNWYWx1ZTsKK30KKworaW50IGRzcDM3ODBJX0VuYWJsZURTUChEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICogcFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqcElycU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKnBEbWFNYXApCit7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8gPSBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPOworCWludCBpOworCURTUF9VQVJUX0NGR18xIHJVYXJ0Q2ZnMTsKKwlEU1BfVUFSVF9DRkdfMiByVWFydENmZzI7CisJRFNQX0hCUklER0VfQ0ZHXzEgckhCcmlkZ2VDZmcxOworCURTUF9IQlJJREdFX0NGR18yIHJIQnJpZGdlQ2ZnMjsKKwlEU1BfQlVTTUFTVEVSX0NGR18xIHJCdXNtYXN0ZXJDZmcxOworCURTUF9CVVNNQVNURVJfQ0ZHXzIgckJ1c21hc3RlckNmZzI7CisJRFNQX0lTQV9QUk9UX0NGRyBySXNhUHJvdENmZzsKKwlEU1BfUE9XRVJfTUdNVF9DRkcgclBvd2VyTWdtdENmZzsKKwlEU1BfSEJVU19USU1FUl9DRkcgckhCdXNUaW1lckNmZzsKKwlEU1BfTEJVU19USU1FT1VUX0RJU0FCTEUgckxCdXNUaW1lb3V0RGlzYWJsZTsKKwlEU1BfQ0hJUF9SRVNFVCByQ2hpcFJlc2V0OworCURTUF9DTE9DS19DT05UUk9MXzEgckNsb2NrQ29udHJvbDE7CisJRFNQX0NMT0NLX0NPTlRST0xfMiByQ2xvY2tDb250cm9sMjsKKwlEU1BfSVNBX1NMQVZFX0NPTlRST0wgclNsYXZlQ29udHJvbDsKKwlEU1BfSEJSSURHRV9DT05UUk9MIHJIQnJpZGdlQ29udHJvbDsKKwl1bnNpZ25lZCBzaG9ydCBDaGlwSUQgPSAwOworCXVuc2lnbmVkIHNob3J0IHR2YWw7CisKKworCVBSSU5US18yKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBJX0VuYWJsZURTUCBlbnRyeSBwU2V0dGluZ3MtPmJEU1BFbmFibGVkICV4XG4iLAorCQlwU2V0dGluZ3MtPmJEU1BFbmFibGVkKTsKKworCisJaWYgKCFwU2V0dGluZ3MtPmJEU1BFbmFibGVkKSB7CisJCVBSSU5US19FUlJPUiggS0VSTl9FUlIgIjM3ODBpOjpkc3AzNzgwSV9FbmFibGVEU1A6IEVycm9yOiBEU1Agbm90IGVuYWJsZWQuIEFib3J0aW5nLlxuIiApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKworCVBSSU5US18yKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBpX0VuYWJsZURTUCBlbnRyeSBwU2V0dGluZ3MtPmJNb2RlbUVuYWJsZWQgJXhcbiIsCisJCXBTZXR0aW5ncy0+Yk1vZGVtRW5hYmxlZCk7CisKKwlpZiAocFNldHRpbmdzLT5iTW9kZW1FbmFibGVkKSB7CisJCXJVYXJ0Q2ZnMS5SZXNlcnZlZCA9IHJVYXJ0Q2ZnMi5SZXNlcnZlZCA9IDA7CisJCXJVYXJ0Q2ZnMS5JcnFBY3RpdmVMb3cgPSBwU2V0dGluZ3MtPmJVYXJ0SXJxQWN0aXZlTG93OworCQlyVWFydENmZzEuSXJxUHVsc2UgPSBwU2V0dGluZ3MtPmJVYXJ0SXJxUHVsc2U7CisJCXJVYXJ0Q2ZnMS5JcnEgPQorCQkJKHVuc2lnbmVkIGNoYXIpIHBJcnFNYXBbcFNldHRpbmdzLT51c1VhcnRJcnFdOworCQlzd2l0Y2ggKHBTZXR0aW5ncy0+dXNVYXJ0QmFzZUlPKSB7CisJCWNhc2UgMHgwM0Y4OgorCQkJclVhcnRDZmcxLkJhc2VJTyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAweDAyRjg6CisJCQlyVWFydENmZzEuQmFzZUlPID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDNFODoKKwkJCXJVYXJ0Q2ZnMS5CYXNlSU8gPSAyOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMkU4OgorCQkJclVhcnRDZmcxLkJhc2VJTyA9IDM7CisJCQlicmVhazsKKwkJfQorCQlyVWFydENmZzIuRW5hYmxlID0gVFJVRTsKKwl9CisKKwlySEJyaWRnZUNmZzEuUmVzZXJ2ZWQgPSBySEJyaWRnZUNmZzIuUmVzZXJ2ZWQgPSAwOworCXJIQnJpZGdlQ2ZnMS5JcnFBY3RpdmVMb3cgPSBwU2V0dGluZ3MtPmJEc3BJcnFBY3RpdmVMb3c7CisJckhCcmlkZ2VDZmcxLklycVB1bHNlID0gcFNldHRpbmdzLT5iRHNwSXJxUHVsc2U7CisJckhCcmlkZ2VDZmcxLklycSA9ICh1bnNpZ25lZCBjaGFyKSBwSXJxTWFwW3BTZXR0aW5ncy0+dXNEc3BJcnFdOworCXJIQnJpZGdlQ2ZnMS5BY2Nlc3NNb2RlID0gMTsKKwlySEJyaWRnZUNmZzIuRW5hYmxlID0gVFJVRTsKKworCisJckJ1c21hc3RlckNmZzIuUmVzZXJ2ZWQgPSAwOworCXJCdXNtYXN0ZXJDZmcxLkRtYSA9ICh1bnNpZ25lZCBjaGFyKSBwRG1hTWFwW3BTZXR0aW5ncy0+dXNEc3BEbWFdOworCXJCdXNtYXN0ZXJDZmcxLk51bVRyYW5zZmVycyA9CisJCSh1bnNpZ25lZCBjaGFyKSBwU2V0dGluZ3MtPnVzTnVtVHJhbnNmZXJzOworCXJCdXNtYXN0ZXJDZmcxLlJlUmVxdWVzdCA9ICh1bnNpZ25lZCBjaGFyKSBwU2V0dGluZ3MtPnVzUmVSZXF1ZXN0OworCXJCdXNtYXN0ZXJDZmcxLk1FTUNTMTYgPSBwU2V0dGluZ3MtPmJFbmFibGVNRU1DUzE2OworCXJCdXNtYXN0ZXJDZmcyLklzYU1lbUNtZFdpZHRoID0KKwkJKHVuc2lnbmVkIGNoYXIpIHBTZXR0aW5ncy0+dXNJc2FNZW1DbWRXaWR0aDsKKworCisJcklzYVByb3RDZmcuUmVzZXJ2ZWQgPSAwOworCXJJc2FQcm90Q2ZnLkdhdGVJT0NIUkRZID0gcFNldHRpbmdzLT5iR2F0ZUlPQ0hSRFk7CisKKwlyUG93ZXJNZ210Q2ZnLlJlc2VydmVkID0gMDsKKwlyUG93ZXJNZ210Q2ZnLkVuYWJsZSA9IHBTZXR0aW5ncy0+YkVuYWJsZVB3ck1nbXQ7CisKKwlySEJ1c1RpbWVyQ2ZnLkxvYWRWYWx1ZSA9CisJCSh1bnNpZ25lZCBjaGFyKSBwU2V0dGluZ3MtPnVzSEJ1c1RpbWVyTG9hZFZhbHVlOworCisJckxCdXNUaW1lb3V0RGlzYWJsZS5SZXNlcnZlZCA9IDA7CisJckxCdXNUaW1lb3V0RGlzYWJsZS5EaXNhYmxlVGltZW91dCA9CisJCXBTZXR0aW5ncy0+YkRpc2FibGVMQnVzVGltZW91dDsKKworCU1LV09SRChyQ2hpcFJlc2V0KSA9IH5wU2V0dGluZ3MtPnVzQ2hpcGxldEVuYWJsZTsKKworCXJDbG9ja0NvbnRyb2wxLlJlc2VydmVkMSA9IHJDbG9ja0NvbnRyb2wxLlJlc2VydmVkMiA9IDA7CisJckNsb2NrQ29udHJvbDEuTl9EaXZpc29yID0gcFNldHRpbmdzLT51c05fRGl2aXNvcjsKKwlyQ2xvY2tDb250cm9sMS5NX011bHRpcGxpZXIgPSBwU2V0dGluZ3MtPnVzTV9NdWx0aXBsaWVyOworCisJckNsb2NrQ29udHJvbDIuUmVzZXJ2ZWQgPSAwOworCXJDbG9ja0NvbnRyb2wyLlBsbEJ5cGFzcyA9IHBTZXR0aW5ncy0+YlBsbEJ5cGFzczsKKworCS8qIElzc3VlIGEgc29mdCByZXNldCB0byB0aGUgY2hpcCAqLworCS8qIE5vdGU6IFNpbmNlIHdlIG1heSBiZSBjb21pbmcgaW4gd2l0aCAzNzgwaSBjbG9ja3Mgc3VzcGVuZGVkLCB3ZSBtdXN0IGtlZXAKKwkqIHNvZnQtcmVzZXQgYWN0aXZlIGZvciAxMG1zLgorCSovCisJclNsYXZlQ29udHJvbC5DbG9ja0NvbnRyb2wgPSAwOworCXJTbGF2ZUNvbnRyb2wuU29mdFJlc2V0ID0gVFJVRTsKKwlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSBGQUxTRTsKKwlyU2xhdmVDb250cm9sLlJlc2VydmVkID0gMDsKKworCVBSSU5US180KFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBpX0VuYWJsZURTUCB1c0RzcEJhc2VJTyAleCBpbmRleCAleCB0YWRkciAleFxuIiwKKwkJdXNEc3BCYXNlSU8sIERTUF9Jc2FTbGF2ZUNvbnRyb2wsCisJCXVzRHNwQmFzZUlPICsgRFNQX0lzYVNsYXZlQ29udHJvbCk7CisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9FbmFibGVEU1AgclNsYXZlQ29udHJsICV4XG4iLAorCQlNS1dPUkQoclNsYXZlQ29udHJvbCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJT3V0V29yZERzcChEU1BfSXNhU2xhdmVDb250cm9sLCBNS1dPUkQoclNsYXZlQ29udHJvbCkpOworCU1LV09SRCh0dmFsKSA9IEluV29yZERzcChEU1BfSXNhU2xhdmVDb250cm9sKTsKKworCVBSSU5US18yKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBpX0VuYWJsZURTUCByU2xhdmVDb250cm9sIDIgJXhcbiIsIHR2YWwpOworCisKKwlmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykKKwkJdWRlbGF5KDIwMDApOworCisJclNsYXZlQ29udHJvbC5Tb2Z0UmVzZXQgPSBGQUxTRTsKKwlPdXRXb3JkRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wsIE1LV09SRChyU2xhdmVDb250cm9sKSk7CisKKwlNS1dPUkQodHZhbCkgPSBJbldvcmREc3AoRFNQX0lzYVNsYXZlQ29udHJvbCk7CisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9FbmFibGVEU1AgclNsYXZlQ29udHJvbCAzICV4XG4iLCB0dmFsKTsKKworCisJLyogUHJvZ3JhbSBvdXIgZ2VuZXJhbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCVdyaXRlR2VuQ2ZnKERTUF9IQnJpZGdlQ2ZnMUluZGV4LCBNS0JZVEUockhCcmlkZ2VDZmcxKSk7CisJV3JpdGVHZW5DZmcoRFNQX0hCcmlkZ2VDZmcySW5kZXgsIE1LQllURShySEJyaWRnZUNmZzIpKTsKKwlXcml0ZUdlbkNmZyhEU1BfQnVzTWFzdGVyQ2ZnMUluZGV4LCBNS0JZVEUockJ1c21hc3RlckNmZzEpKTsKKwlXcml0ZUdlbkNmZyhEU1BfQnVzTWFzdGVyQ2ZnMkluZGV4LCBNS0JZVEUockJ1c21hc3RlckNmZzIpKTsKKwlXcml0ZUdlbkNmZyhEU1BfSXNhUHJvdENmZ0luZGV4LCBNS0JZVEUocklzYVByb3RDZmcpKTsKKwlXcml0ZUdlbkNmZyhEU1BfUG93ZXJNZ0NmZ0luZGV4LCBNS0JZVEUoclBvd2VyTWdtdENmZykpOworCVdyaXRlR2VuQ2ZnKERTUF9IQnVzVGltZXJDZmdJbmRleCwgTUtCWVRFKHJIQnVzVGltZXJDZmcpKTsKKworCWlmIChwU2V0dGluZ3MtPmJNb2RlbUVuYWJsZWQpIHsKKwkJV3JpdGVHZW5DZmcoRFNQX1VhcnRDZmcxSW5kZXgsIE1LQllURShyVWFydENmZzEpKTsKKwkJV3JpdGVHZW5DZmcoRFNQX1VhcnRDZmcySW5kZXgsIE1LQllURShyVWFydENmZzIpKTsKKwl9CisKKworCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSBGQUxTRTsKKwlySEJyaWRnZUNvbnRyb2wuTWVtQXV0b0luYyA9IFRSVUU7CisJckhCcmlkZ2VDb250cm9sLklvQXV0b0luYyA9IEZBTFNFOworCXJIQnJpZGdlQ29udHJvbC5EaWFnbm9zdGljTW9kZSA9IEZBTFNFOworCisJUFJJTlRLXzMoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MGlfRW5hYmxlRFNQIERTUF9IQnJpZGdlQ29udHJvbCAleCBySEJyaWRnZUNvbnRyb2wgJXhcbiIsCisJCURTUF9IQnJpZGdlQ29udHJvbCwgTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkpOworCisJT3V0V29yZERzcChEU1BfSEJyaWRnZUNvbnRyb2wsIE1LV09SRChySEJyaWRnZUNvbnRyb2wpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCVdyaXRlTXNhQ2ZnKERTUF9MQnVzVGltZW91dERpc2FibGUsIE1LV09SRChyTEJ1c1RpbWVvdXREaXNhYmxlKSk7CisJV3JpdGVNc2FDZmcoRFNQX0Nsb2NrQ29udHJvbF8xLCBNS1dPUkQockNsb2NrQ29udHJvbDEpKTsKKwlXcml0ZU1zYUNmZyhEU1BfQ2xvY2tDb250cm9sXzIsIE1LV09SRChyQ2xvY2tDb250cm9sMikpOworCVdyaXRlTXNhQ2ZnKERTUF9DaGlwUmVzZXQsIE1LV09SRChyQ2hpcFJlc2V0KSk7CisKKwlDaGlwSUQgPSBSZWFkTXNhQ2ZnKERTUF9DaGlwSUQpOworCisJUFJJTlRLXzIoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MElfRW5hYmxlRFNQIGV4aXRpbmcgYlJDPVRSVUUsIENoaXBJRCAleFxuIiwKKwkJQ2hpcElEKTsKKworCXJldHVybiAwOworfQorCitpbnQgZHNwMzc4MElfRGlzYWJsZURTUChEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICogcFNldHRpbmdzKQoreworCXVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPID0gcFNldHRpbmdzLT51c0RzcEJhc2VJTzsKKwlEU1BfSVNBX1NMQVZFX0NPTlRST0wgclNsYXZlQ29udHJvbDsKKworCisJUFJJTlRLXzEoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfRGlzYWJsZURTUCBlbnRyeVxuIik7CisKKwlyU2xhdmVDb250cm9sLkNsb2NrQ29udHJvbCA9IDA7CisJclNsYXZlQ29udHJvbC5Tb2Z0UmVzZXQgPSBUUlVFOworCXJTbGF2ZUNvbnRyb2wuQ29uZmlnTW9kZSA9IEZBTFNFOworCXJTbGF2ZUNvbnRyb2wuUmVzZXJ2ZWQgPSAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX0lzYVNsYXZlQ29udHJvbCwgTUtXT1JEKHJTbGF2ZUNvbnRyb2wpKTsKKworCXVkZWxheSg1KTsKKworCXJTbGF2ZUNvbnRyb2wuQ2xvY2tDb250cm9sID0gMTsKKwlPdXRXb3JkRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wsIE1LV09SRChyU2xhdmVDb250cm9sKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKworCXVkZWxheSg1KTsKKworCisJUFJJTlRLXzEoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfRGlzYWJsZURTUCBleGl0XG4iKTsKKworCXJldHVybiAwOworfQorCitpbnQgZHNwMzc4MElfUmVzZXQoRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqIHBTZXR0aW5ncykKK3sKKwl1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTyA9IHBTZXR0aW5ncy0+dXNEc3BCYXNlSU87CisJRFNQX0JPT1RfRE9NQUlOIHJCb290RG9tYWluOworCURTUF9IQlJJREdFX0NPTlRST0wgckhCcmlkZ2VDb250cm9sOworCisKKwlQUklOVEtfMShUUkFDRV8zNzgwSSwgIjM3ODBpOjpkc3AzNzgwaV9SZXNldCBlbnRyeVxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwkvKiBNYXNrIERTUCB0byBQQyBpbnRlcnJ1cHQgKi8KKwlNS1dPUkQockhCcmlkZ2VDb250cm9sKSA9IEluV29yZERzcChEU1BfSEJyaWRnZUNvbnRyb2wpOworCisJUFJJTlRLXzIoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUmVzZXQgckhCcmlkZ2VDb250cm9sICV4XG4iLAorCQlNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CisKKwlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gRkFMU0U7CisJT3V0V29yZERzcChEU1BfSEJyaWRnZUNvbnRyb2wsIE1LV09SRChySEJyaWRnZUNvbnRyb2wpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCisJLyogUmVzZXQgdGhlIGNvcmUgdmlhIHRoZSBib290IGRvbWFpbiByZWdpc3RlciAqLworCXJCb290RG9tYWluLlJlc2V0Q29yZSA9IFRSVUU7CisJckJvb3REb21haW4uSGFsdCA9IFRSVUU7CisJckJvb3REb21haW4uTk1JID0gVFJVRTsKKwlyQm9vdERvbWFpbi5SZXNlcnZlZCA9IDA7CisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwgIjM3ODBpOjpkc3AzNzgwaV9SZXNldCByQm9vdERvbWFpbiAleFxuIiwKKwkJTUtXT1JEKHJCb290RG9tYWluKSk7CisKKwlXcml0ZU1zYUNmZyhEU1BfTXNwQm9vdERvbWFpbiwgTUtXT1JEKHJCb290RG9tYWluKSk7CisKKwkvKiBSZXNldCBhbGwgdGhlIGNoaXBsZXRzIGFuZCB0aGVuIHJlYWN0aXZhdGUgdGhlbSAqLworCVdyaXRlTXNhQ2ZnKERTUF9DaGlwUmVzZXQsIDB4RkZGRik7CisJdWRlbGF5KDUpOworCVdyaXRlTXNhQ2ZnKERTUF9DaGlwUmVzZXQsCisJCQkodW5zaWduZWQgc2hvcnQpICh+cFNldHRpbmdzLT51c0NoaXBsZXRFbmFibGUpKTsKKworCisJUFJJTlRLXzEoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUmVzZXQgZXhpdCBiUkM9MFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgZHNwMzc4MElfUnVuKERTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKiBwU2V0dGluZ3MpCit7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8gPSBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPOworCURTUF9CT09UX0RPTUFJTiByQm9vdERvbWFpbjsKKwlEU1BfSEJSSURHRV9DT05UUk9MIHJIQnJpZGdlQ29udHJvbDsKKworCisJUFJJTlRLXzEoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUnVuIGVudHJ5XG4iKTsKKworCisJLyogVHJhbnNpdGlvbiB0aGUgY29yZSB0byBhIHJ1bm5pbmcgc3RhdGUgKi8KKwlyQm9vdERvbWFpbi5SZXNldENvcmUgPSBUUlVFOworCXJCb290RG9tYWluLkhhbHQgPSBGQUxTRTsKKwlyQm9vdERvbWFpbi5OTUkgPSBUUlVFOworCXJCb290RG9tYWluLlJlc2VydmVkID0gMDsKKwlXcml0ZU1zYUNmZyhEU1BfTXNwQm9vdERvbWFpbiwgTUtXT1JEKHJCb290RG9tYWluKSk7CisKKwl1ZGVsYXkoNSk7CisKKwlyQm9vdERvbWFpbi5SZXNldENvcmUgPSBGQUxTRTsKKwlXcml0ZU1zYUNmZyhEU1BfTXNwQm9vdERvbWFpbiwgTUtXT1JEKHJCb290RG9tYWluKSk7CisJdWRlbGF5KDUpOworCisJckJvb3REb21haW4uTk1JID0gRkFMU0U7CisJV3JpdGVNc2FDZmcoRFNQX01zcEJvb3REb21haW4sIE1LV09SRChyQm9vdERvbWFpbikpOworCXVkZWxheSg1KTsKKworCS8qIEVuYWJsZSBEU1AgdG8gUEMgaW50ZXJydXB0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkgPSBJbldvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sKTsKKwlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gVFJVRTsKKworCVBSSU5US18yKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1J1biBySEJyaWRnZUNvbnRyb2wgJXhcbiIsCisJCU1LV09SRChySEJyaWRnZUNvbnRyb2wpKTsKKworCU91dFdvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sLCBNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKworCisJUFJJTlRLXzEoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUnVuIGV4aXQgYlJDPVRSVUVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IGRzcDM3ODBJX1JlYWREU3RvcmUodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sIHZvaWQgX191c2VyICpwdkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVDb3VudCwgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpCit7CisJdW5zaWduZWQgc2hvcnQgX191c2VyICpwdXNCdWZmZXIgPSBwdkJ1ZmZlcjsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKworCVBSSU5US181KFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBJX1JlYWREU3RvcmUgZW50cnkgdXNEc3BCYXNlSU8gJXgsIHB1c0J1ZmZlciAlcCwgdUNvdW50ICV4LCB1bERTUEFkZHIgJWx4XG4iLAorCQl1c0RzcEJhc2VJTywgcHVzQnVmZmVyLCB1Q291bnQsIHVsRFNQQWRkcik7CisKKworCS8qIFNldCB0aGUgaW5pdGlhbCBNU0EgYWRkcmVzcy4gTm8gYWRqdXN0bWVudHMgbmVlZCB0byBiZSBtYWRlIHRvIGRhdGEgc3RvcmUgYWRkcmVzc2VzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJT3V0V29yZERzcChEU1BfTXNhQWRkckxvdywgKHVuc2lnbmVkIHNob3J0KSB1bERTUEFkZHIpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJIaWdoLCAodW5zaWduZWQgc2hvcnQpICh1bERTUEFkZHIgPj4gMTYpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCisJLyogVHJhbnNmZXIgdGhlIG1lbW9yeSBibG9jayAqLworCXdoaWxlICh1Q291bnQtLSAhPSAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCQl2YWwgPSBJbldvcmREc3AoRFNQX01zYURhdGFEU0lTSGlnaCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisJCWlmKHB1dF91c2VyKHZhbCwgcHVzQnVmZmVyKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJUFJJTlRLXzMoVFJBQ0VfMzc4MEksCisJCQkiMzc4MEk6OmRzcDM3ODBJX1JlYWREU3RvcmUgdUNvdW50ICV4IHZhbCAleFxuIiwKKwkJCXVDb3VudCwgdmFsKTsKKworCQlQYWNlTXNhQWNjZXNzKHVzRHNwQmFzZUlPKTsKKwl9CisKKworCVBSSU5US18xKFRSQUNFXzM3ODBJLAorCQkiMzc4MEk6OmRzcDM3ODBJX1JlYWREU3RvcmUgZXhpdCBiUkM9VFJVRVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRzcDM3ODBJX1JlYWRBbmRDbGVhckRTdG9yZSh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKnB2QnVmZmVyLCB1bnNpZ25lZCB1Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKQoreworCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gcHZCdWZmZXI7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisKKwlQUklOVEtfNShUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwSV9SZWFkQW5kRFN0b3JlIGVudHJ5IHVzRHNwQmFzZUlPICV4LCBwdXNCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKKwkJdXNEc3BCYXNlSU8sIHB1c0J1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCisKKwkvKiBTZXQgdGhlIGluaXRpYWwgTVNBIGFkZHJlc3MuIE5vIGFkanVzdG1lbnRzIG5lZWQgdG8gYmUgbWFkZSB0byBkYXRhIHN0b3JlIGFkZHJlc3NlcyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJMb3csICh1bnNpZ25lZCBzaG9ydCkgdWxEU1BBZGRyKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRySGlnaCwgKHVuc2lnbmVkIHNob3J0KSAodWxEU1BBZGRyID4+IDE2KSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKworCS8qIFRyYW5zZmVyIHRoZSBtZW1vcnkgYmxvY2sgKi8KKwl3aGlsZSAodUNvdW50LS0gIT0gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwkJdmFsID0gSW5Xb3JkRHNwKERTUF9SZWFkQW5kQ2xlYXIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCQlpZihwdXRfdXNlcih2YWwsIHB1c0J1ZmZlcisrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCVBSSU5US18zKFRSQUNFXzM3ODBJLAorCQkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkQW5kQ2xlYW5EU3RvcmUgdUNvdW50ICV4IHZhbCAleFxuIiwKKwkJCXVDb3VudCwgdmFsKTsKKworCQlQYWNlTXNhQWNjZXNzKHVzRHNwQmFzZUlPKTsKKwl9CisKKworCVBSSU5US18xKFRSQUNFXzM3ODBJLAorCQkiMzc4MEk6OmRzcDM3ODBJX1JlYWRBbmRDbGVhckRTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBkc3AzNzgwSV9Xcml0ZURTdG9yZSh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywgdm9pZCBfX3VzZXIgKnB2QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVDb3VudCwgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpCit7CisJdW5zaWduZWQgc2hvcnQgX191c2VyICpwdXNCdWZmZXIgPSBwdkJ1ZmZlcjsKKworCisJUFJJTlRLXzUoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MERfV3JpdGVEU3RvcmUgZW50cnkgdXNEc3BCYXNlSU8gJXgsIHB1c0J1ZmZlciAlcCwgdUNvdW50ICV4LCB1bERTUEFkZHIgJWx4XG4iLAorCQl1c0RzcEJhc2VJTywgcHVzQnVmZmVyLCB1Q291bnQsIHVsRFNQQWRkcik7CisKKworCS8qIFNldCB0aGUgaW5pdGlhbCBNU0EgYWRkcmVzcy4gTm8gYWRqdXN0bWVudHMgbmVlZCB0byBiZSBtYWRlIHRvIGRhdGEgc3RvcmUgYWRkcmVzc2VzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJT3V0V29yZERzcChEU1BfTXNhQWRkckxvdywgKHVuc2lnbmVkIHNob3J0KSB1bERTUEFkZHIpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJIaWdoLCAodW5zaWduZWQgc2hvcnQpICh1bERTUEFkZHIgPj4gMTYpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCisJLyogVHJhbnNmZXIgdGhlIG1lbW9yeSBibG9jayAqLworCXdoaWxlICh1Q291bnQtLSAhPSAwKSB7CisJCXVuc2lnbmVkIHNob3J0IHZhbDsKKwkJaWYoZ2V0X3VzZXIodmFsLCBwdXNCdWZmZXIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJCU91dFdvcmREc3AoRFNQX01zYURhdGFEU0lTSGlnaCwgdmFsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKworCQlQUklOVEtfMyhUUkFDRV8zNzgwSSwKKwkJCSIzNzgwSTo6ZHNwMzc4MElfV3JpdGVEU3RvcmUgdUNvdW50ICV4IHZhbCAleFxuIiwKKwkJCXVDb3VudCwgdmFsKTsKKworCQlQYWNlTXNhQWNjZXNzKHVzRHNwQmFzZUlPKTsKKwl9CisKKworCVBSSU5US18xKFRSQUNFXzM3ODBJLAorCQkiMzc4MEk6OmRzcDM3ODBEX1dyaXRlRFN0b3JlIGV4aXQgYlJDPVRSVUVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IGRzcDM3ODBJX1JlYWRJU3RvcmUodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sIHZvaWQgX191c2VyICpwdkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVDb3VudCwgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpCit7CisJdW5zaWduZWQgc2hvcnQgX191c2VyICpwdXNCdWZmZXIgPSBwdkJ1ZmZlcjsKKworCVBSSU5US181KFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBJX1JlYWRJU3RvcmUgZW50cnkgdXNEc3BCYXNlSU8gJXgsIHB1c0J1ZmZlciAlcCwgdUNvdW50ICV4LCB1bERTUEFkZHIgJWx4XG4iLAorCQl1c0RzcEJhc2VJTywgcHVzQnVmZmVyLCB1Q291bnQsIHVsRFNQQWRkcik7CisKKwkvKgorCSogU2V0IHRoZSBpbml0aWFsIE1TQSBhZGRyZXNzLiBUbyBjb252ZXJ0IGZyb20gYW4gaW5zdHJ1Y3Rpb24gc3RvcmUKKwkqIGFkZHJlc3MgdG8gYW4gTVNBIGFkZHJlc3MKKwkqIHNoaWZ0IHRoZSBhZGRyZXNzIHR3byBiaXRzIHRvIHRoZSBsZWZ0IGFuZCBzZXQgYml0IDIyCisJKi8KKwl1bERTUEFkZHIgPSAodWxEU1BBZGRyIDw8IDIpIHwgKDEgPDwgMjIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJMb3csICh1bnNpZ25lZCBzaG9ydCkgdWxEU1BBZGRyKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRySGlnaCwgKHVuc2lnbmVkIHNob3J0KSAodWxEU1BBZGRyID4+IDE2KSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKworCS8qIFRyYW5zZmVyIHRoZSBtZW1vcnkgYmxvY2sgKi8KKwl3aGlsZSAodUNvdW50LS0gIT0gMCkgeworCQl1bnNpZ25lZCBzaG9ydCB2YWxfbG8sIHZhbF9oaTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJCXZhbF9sbyA9IEluV29yZERzcChEU1BfTXNhRGF0YUlTTG93KTsKKwkJdmFsX2hpID0gSW5Xb3JkRHNwKERTUF9Nc2FEYXRhRFNJU0hpZ2gpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCQlpZihwdXRfdXNlcih2YWxfbG8sIHB1c0J1ZmZlcisrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZihwdXRfdXNlcih2YWxfaGksIHB1c0J1ZmZlcisrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCVBSSU5US180KFRSQUNFXzM3ODBJLAorCQkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkSVN0b3JlIHVDb3VudCAleCB2YWxfbG8gJXggdmFsX2hpICV4XG4iLAorCQkJdUNvdW50LCB2YWxfbG8sIHZhbF9oaSk7CisKKwkJUGFjZU1zYUFjY2Vzcyh1c0RzcEJhc2VJTyk7CisKKwl9CisKKwlQUklOVEtfMShUUkFDRV8zNzgwSSwKKwkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkSVN0b3JlIGV4aXQgYlJDPVRSVUVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IGRzcDM3ODBJX1dyaXRlSVN0b3JlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB2b2lkIF9fdXNlciAqcHZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdUNvdW50LCB1bnNpZ25lZCBsb25nIHVsRFNQQWRkcikKK3sKKwl1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKnB1c0J1ZmZlciA9IHB2QnVmZmVyOworCisJUFJJTlRLXzUoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MElfV3JpdGVJU3RvcmUgZW50cnkgdXNEc3BCYXNlSU8gJXgsIHB1c0J1ZmZlciAlcCwgdUNvdW50ICV4LCB1bERTUEFkZHIgJWx4XG4iLAorCQl1c0RzcEJhc2VJTywgcHVzQnVmZmVyLCB1Q291bnQsIHVsRFNQQWRkcik7CisKKworCS8qCisJKiBTZXQgdGhlIGluaXRpYWwgTVNBIGFkZHJlc3MuIFRvIGNvbnZlcnQgZnJvbSBhbiBpbnN0cnVjdGlvbiBzdG9yZQorCSogYWRkcmVzcyB0byBhbiBNU0EgYWRkcmVzcworCSogc2hpZnQgdGhlIGFkZHJlc3MgdHdvIGJpdHMgdG8gdGhlIGxlZnQgYW5kIHNldCBiaXQgMjIKKwkqLworCXVsRFNQQWRkciA9ICh1bERTUEFkZHIgPDwgMikgfCAoMSA8PCAyMik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJT3V0V29yZERzcChEU1BfTXNhQWRkckxvdywgKHVuc2lnbmVkIHNob3J0KSB1bERTUEFkZHIpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJIaWdoLCAodW5zaWduZWQgc2hvcnQpICh1bERTUEFkZHIgPj4gMTYpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCisJLyogVHJhbnNmZXIgdGhlIG1lbW9yeSBibG9jayAqLworCXdoaWxlICh1Q291bnQtLSAhPSAwKSB7CisJCXVuc2lnbmVkIHNob3J0IHZhbF9sbywgdmFsX2hpOworCQlpZihnZXRfdXNlcih2YWxfbG8sIHB1c0J1ZmZlcisrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZihnZXRfdXNlcih2YWxfaGksIHB1c0J1ZmZlcisrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwkJT3V0V29yZERzcChEU1BfTXNhRGF0YUlTTG93LCB2YWxfbG8pOworCQlPdXRXb3JkRHNwKERTUF9Nc2FEYXRhRFNJU0hpZ2gsIHZhbF9oaSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisKKwkJUFJJTlRLXzQoVFJBQ0VfMzc4MEksCisJCQkiMzc4MEk6OmRzcDM3ODBJX1dyaXRlSVN0b3JlIHVDb3VudCAleCB2YWxfbG8gJXggdmFsX2hpICV4XG4iLAorCQkJdUNvdW50LCB2YWxfbG8sIHZhbF9oaSk7CisKKwkJUGFjZU1zYUFjY2Vzcyh1c0RzcEJhc2VJTyk7CisKKwl9CisKKwlQUklOVEtfMShUUkFDRV8zNzgwSSwKKwkJIjM3ODBJOjpkc3AzNzgwSV9Xcml0ZUlTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBkc3AzNzgwSV9HZXRJUENTb3VyY2UodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpwdXNJUENTb3VyY2UpCit7CisJRFNQX0hCUklER0VfQ09OVFJPTCBySEJyaWRnZUNvbnRyb2w7CisJdW5zaWduZWQgc2hvcnQgdGVtcDsKKworCisJUFJJTlRLXzMoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MElfR2V0SVBDU291cmNlIGVudHJ5IHVzRHNwQmFzZUlPICV4IHB1c0lQQ1NvdXJjZSAlcFxuIiwKKwkJdXNEc3BCYXNlSU8sIHB1c0lQQ1NvdXJjZSk7CisKKwkvKgorCSogRGlzYWJsZSBEU1AgdG8gUEMgaW50ZXJydXB0cywgcmVhZCB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyLAorCSogY2xlYXIgdGhlIHBlbmRpbmcgSVBDIGJpdHMsIGFuZCByZWVuYWJsZSBEU1AgdG8gUEMgaW50ZXJydXB0cworCSovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkgPSBJbldvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sKTsKKwlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gRkFMU0U7CisJT3V0V29yZERzcChEU1BfSEJyaWRnZUNvbnRyb2wsIE1LV09SRChySEJyaWRnZUNvbnRyb2wpKTsKKworCSpwdXNJUENTb3VyY2UgPSBJbldvcmREc3AoRFNQX0ludGVycnVwdCk7CisJdGVtcCA9ICh1bnNpZ25lZCBzaG9ydCkgfigqcHVzSVBDU291cmNlKTsKKworCVBSSU5US18zKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBJX0dldElQQ1NvdXJjZSwgdXNJUENTb3VyY2UgJXggfiAleFxuIiwKKwkJKnB1c0lQQ1NvdXJjZSwgdGVtcCk7CisKKwlPdXRXb3JkRHNwKERTUF9JbnRlcnJ1cHQsICh1bnNpZ25lZCBzaG9ydCkgfigqcHVzSVBDU291cmNlKSk7CisKKwlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gVFJVRTsKKwlPdXRXb3JkRHNwKERTUF9IQnJpZGdlQ29udHJvbCwgTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisKKworCVBSSU5US18yKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBJX0dldElQQ1NvdXJjZSBleGl0IHVzSVBDU291cmNlICV4XG4iLAorCQkqcHVzSVBDU291cmNlKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmggYi9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTdkMDIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmgKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisqCisqIDM3ODBpLmggLS0gZGVjbGFyYXRpb25zIGZvciAzNzgwaS5jCisqCisqCisqIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4gSUJNIENvcnBvcmF0aW9uCisqCisqIENvcHlyaWdodCAoQykgMTk5OSBJQk0gQ29ycG9yYXRpb24KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogTk8gV0FSUkFOVFkKKyogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyogc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisqIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorKgorKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyogREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyogVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisqIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKgorKgorKiAxMC8yMy8yMDAwIC0gQWxwaGEgUmVsZWFzZQorKglGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyovCisKKyNpZm5kZWYgX0xJTlVYXzM3ODBJX0gKKyNkZWZpbmUgX0xJTlVYXzM3ODBJX0gKKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiBEU1AgSS9PIHBvcnQgb2Zmc2V0cyBhbmQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRFNQX0lzYVNsYXZlQ29udHJvbCAgICAgICAgMHgwMDAwCS8qIElTQSBzbGF2ZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIERTUF9Jc2FTbGF2ZVN0YXR1cyAgICAgICAgIDB4MDAwMQkvKiBJU0Egc2xhdmUgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIERTUF9Db25maWdBZGRyZXNzICAgICAgICAgIDB4MDAwMgkvKiBHZW5lcmFsIGNvbmZpZyBhZGRyZXNzIHJlZ2lzdGVyICovCisjZGVmaW5lIERTUF9Db25maWdEYXRhICAgICAgICAgICAgIDB4MDAwMwkvKiBHZW5lcmFsIGNvbmZpZyBkYXRhIHJlZ2lzdGVyICovCisjZGVmaW5lIERTUF9IQnJpZGdlQ29udHJvbCAgICAgICAgIDB4MDAwMgkvKiBIQnJpZGdlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRFNQX01zYUFkZHJMb3cgICAgICAgICAgICAgMHgwMDA0CS8qIE1TUCBTeXN0ZW0gQWRkcmVzcywgbG93IHdvcmQgKi8KKyNkZWZpbmUgRFNQX01zYUFkZHJIaWdoICAgICAgICAgICAgMHgwMDA2CS8qIE1TUCBTeXN0ZW0gQWRkcmVzcywgaGlnaCB3b3JkICovCisjZGVmaW5lIERTUF9Nc2FEYXRhRFNJU0hpZ2ggICAgICAgIDB4MDAwOAkvKiBNU0EgZGF0YSByZWdpc3RlcjogZC1zdG9yZSB3b3JkIG9yIGhpZ2ggYnl0ZSBvZiBpLXN0b3JlICovCisjZGVmaW5lIERTUF9Nc2FEYXRhSVNMb3cgICAgICAgICAgIDB4MDAwQQkvKiBNU0EgZGF0YSByZWdpc3RlcjogbG93IHdvcmQgb2YgaS1zdG9yZSAqLworI2RlZmluZSBEU1BfUmVhZEFuZENsZWFyICAgICAgICAgICAweDAwMEMJLyogTVNBIHJlYWQgYW5kIGNsZWFyIGRhdGEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRFNQX0ludGVycnVwdCAgICAgICAgICAgICAgMHgwMDBFCS8qIEludGVycnVwdCByZWdpc3RlciAoSVBDIHNvdXJjZSkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgQ2xvY2tDb250cm9sOjE7CS8qIFJXOiBDbG9jayBjb250cm9sOiAwPW5vcm1hbCwgMT1zdG9wIDM3ODBpIGNsb2NrcyAqLworCXVuc2lnbmVkIGNoYXIgU29mdFJlc2V0OjE7CS8qIFJXOiBTb2Z0IHJlc2V0IDA9bm9ybWFsLCAxPXNvZnQgcmVzZXQgYWN0aXZlICovCisJdW5zaWduZWQgY2hhciBDb25maWdNb2RlOjE7CS8qIFJXOiBDb25maWd1cmF0aW9uIG1vZGUsIDA9bm9ybWFsLCAxPWNvbmZpZyBtb2RlICovCisJdW5zaWduZWQgY2hhciBSZXNlcnZlZDo1OwkvKiAwOiBSZXNlcnZlZCAqLworfSBEU1BfSVNBX1NMQVZFX0NPTlRST0w7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IEVuYWJsZURzcEludDoxOwkvKiBSVzogRW5hYmxlIERTUCB0byBYODYgSVNBIGludGVycnVwdCAwPW1hc2sgaXQsIDE9ZW5hYmxlIGl0ICovCisJdW5zaWduZWQgc2hvcnQgTWVtQXV0b0luYzoxOwkvKiBSVzogTWVtb3J5IGFkZHJlc3MgYXV0byBpbmNyZW1lbnQsIDA9ZGlzYWJsZSwgMT1lbmFibGUgKi8KKwl1bnNpZ25lZCBzaG9ydCBJb0F1dG9JbmM6MTsJLyogUlc6IEkvTyBhZGRyZXNzIGF1dG8gaW5jcmVtZW50LCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCisJdW5zaWduZWQgc2hvcnQgRGlhZ25vc3RpY01vZGU6MTsJLyogUlc6IERpc2dub3N0aWMgbW9kZSAwPW5yb21hbCwgMT1kaWFnbm9zdGljIG1vZGUgKi8KKwl1bnNpZ25lZCBzaG9ydCBJc2FQYWNpbmdUaW1lcjoxMjsJLyogUjogSVNBIGFjY2VzcyBwYWNpbmcgdGltZXI6IGNvdW50IG9mIGNvcmUgY3ljbGVzIHN0b2xlbiAqLworfSBEU1BfSEJSSURHRV9DT05UUk9MOworCisKKy8qIERTUCByZWdpc3RlciBpbmRleGVzIHVzZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlciBhZGRyZXNzIChpbmRleCkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRFNQX1VhcnRDZmcxSW5kZXggICAgICAgICAgMHgwMDAzCS8qIFVBUlQgY29uZmlnIHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRFNQX1VhcnRDZmcySW5kZXggICAgICAgICAgMHgwMDA0CS8qIFVBUlQgY29uZmlnIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRFNQX0hCcmlkZ2VDZmcxSW5kZXggICAgICAgMHgwMDA3CS8qIEhCcmlkZ2UgY29uZmlnIHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRFNQX0hCcmlkZ2VDZmcySW5kZXggICAgICAgMHgwMDA4CS8qIEhCcmlkZ2UgY29uZmlnIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRFNQX0J1c01hc3RlckNmZzFJbmRleCAgICAgMHgwMDA5CS8qIElTQSBidXMgbWFzdGVyIGNvbmZpZyByZWdpc3RlciAxICovCisjZGVmaW5lIERTUF9CdXNNYXN0ZXJDZmcySW5kZXggICAgIDB4MDAwQQkvKiBJU0EgYnVzIG1hc3RlciBjb25maWcgcmVnaXN0ZXIgMiAqLworI2RlZmluZSBEU1BfSXNhUHJvdENmZ0luZGV4ICAgICAgICAweDAwMEYJLyogSVNBIHByb3RvY29sIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRFNQX1Bvd2VyTWdDZmdJbmRleCAgICAgICAgMHgwMDEwCS8qIExvdyBwb3NlciBzdXNwZW5kL3Jlc3VtZSBlbmFibGUgKi8KKyNkZWZpbmUgRFNQX0hCdXNUaW1lckNmZ0luZGV4ICAgICAgMHgwMDExCS8qIEhCVVMgdGltZXIgbG9hZCB2YWx1ZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBJcnFBY3RpdmVMb3c6MTsJLyogUlc6IElSUSBhY3RpdmUgaGlnaCBvciBsb3c6IDA9aGlnaCwgMT1sb3cgKi8KKwl1bnNpZ25lZCBjaGFyIElycVB1bHNlOjE7CS8qIFJXOiBJUlEgcHVsc2Ugb3IgbGV2ZWw6IDA9bGV2ZWwsIDE9cHVsc2UgICovCisJdW5zaWduZWQgY2hhciBJcnE6MzsJLyogUlc6IElSUSBzZWxlY3Rpb24gKi8KKwl1bnNpZ25lZCBjaGFyIEJhc2VJTzoyOwkvKiBSVzogQmFzZSBJL08gc2VsZWN0aW9uICovCisJdW5zaWduZWQgY2hhciBSZXNlcnZlZDoxOwkvKiAwOiBSZXNlcnZlZCAqLworfSBEU1BfVUFSVF9DRkdfMTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgRW5hYmxlOjE7CS8qIFJXOiBFbmFibGUgSS9PIGFuZCBJUlE6IDA9RkFMU0UsIDE9VFJVRSAqLworCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6NzsJLyogMDogUmVzZXJ2ZWQgKi8KK30gRFNQX1VBUlRfQ0ZHXzI7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIElycUFjdGl2ZUxvdzoxOwkvKiBSVzogSVJRIGFjdGl2ZSBoaWdoPTAgb3IgbG93PTEgKi8KKwl1bnNpZ25lZCBjaGFyIElycVB1bHNlOjE7CS8qIFJXOiBJUlEgcHVsc2U9MSBvciBsZXZlbD0wICovCisJdW5zaWduZWQgY2hhciBJcnE6MzsJLyogUlc6IElSUSBzZWxlY3Rpb24gKi8KKwl1bnNpZ25lZCBjaGFyIEFjY2Vzc01vZGU6MTsJLyogUlc6IDE2LWJpdCByZWdpc3RlciBhY2Nlc3MgbWV0aG9kIDA9Ynl0ZSwgMT13b3JkICovCisJdW5zaWduZWQgY2hhciBSZXNlcnZlZDoyOwkvKiAwOiBSZXNlcnZlZCAqLworfSBEU1BfSEJSSURHRV9DRkdfMTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgRW5hYmxlOjE7CS8qIFJXOiBlbmFibGUgSS9PIGFuZCBJUlE6IDA9RkFMU0UsIDE9VFJVRSAqLworCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6NzsJLyogMDogUmVzZXJ2ZWQgKi8KK30gRFNQX0hCUklER0VfQ0ZHXzI7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgRG1hOjM7CS8qIFJXOiBETUEgY2hhbm5lbCBzZWxlY3Rpb24gKi8KKwl1bnNpZ25lZCBjaGFyIE51bVRyYW5zZmVyczoyOwkvKiBSVzogTWF4aW11bSAjIG9mIHRyYW5zZmVycyBvbmNlIGJlaW5nIGdyYW50ZWQgdGhlIElTQSBidXMgKi8KKwl1bnNpZ25lZCBjaGFyIFJlUmVxdWVzdDoyOwkvKiBSVzogTWludW11bSBkZWxheSBiZXR3ZWVuIHJlbGVhc2luZyB0aGUgSVNBIGJ1cyBhbmQgcmVxdWVzdGluZyBpdCBhZ2FpbiAqLworCXVuc2lnbmVkIGNoYXIgTUVNQ1MxNjoxOwkvKiBSVzogSVNBIHNpZ25hbCBNRU1DUzE2OiAwPWRpc2FibGVkLCAxPWVuYWJsZWQgKi8KK30gRFNQX0JVU01BU1RFUl9DRkdfMTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgSXNhTWVtQ21kV2lkdGg6MjsJLyogUlc6IElTQSBtZW1vcnkgY29tbWFuZCB3aWR0aCAqLworCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6NjsJLyogMDogUmVzZXJ2ZWQgKi8KK30gRFNQX0JVU01BU1RFUl9DRkdfMjsKKworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBHYXRlSU9DSFJEWToxOwkvKiBSVzogRW5hYmxlIElPQ0hSRFkgZ2F0aW5nOiAwPUZBTFNFLCAxPVRSVUUgKi8KKwl1bnNpZ25lZCBjaGFyIFJlc2VydmVkOjc7CS8qIDA6IFJlc2VydmVkICovCit9IERTUF9JU0FfUFJPVF9DRkc7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIEVuYWJsZToxOwkvKiBSVzogRW5hYmxlIGxvdyBwb3dlciBzdXNwZW5kL3Jlc3VtZSAwPUZBTFNFLCAxPVRSVUUgKi8KKwl1bnNpZ25lZCBjaGFyIFJlc2VydmVkOjc7CS8qIDA6IFJlc2VydmVkICovCit9IERTUF9QT1dFUl9NR01UX0NGRzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgTG9hZFZhbHVlOjg7CS8qIFJXOiBIQlVTIHRpbWVyIGxvYWQgdmFsdWUgKi8KK30gRFNQX0hCVVNfVElNRVJfQ0ZHOworCisKKworLyogRFNQIHJlZ2lzdGVycyB0aGF0IGV4aXN0IGluIE1TQSBJL08gc3BhY2UgKi8KKyNkZWZpbmUgRFNQX0NoaXBJRCAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBEU1BfTXNwQm9vdERvbWFpbiAgICAgICAgICAweDgwMDAwNTgwCisjZGVmaW5lIERTUF9MQnVzVGltZW91dERpc2FibGUgICAgIDB4ODAwMDA1ODAKKyNkZWZpbmUgRFNQX0Nsb2NrQ29udHJvbF8xICAgICAgICAgMHg4MDAwMDU4QQorI2RlZmluZSBEU1BfQ2xvY2tDb250cm9sXzIgICAgICAgICAweDgwMDAwNThDCisjZGVmaW5lIERTUF9DaGlwUmVzZXQgICAgICAgICAgICAgIDB4ODAwMDA1ODgKKyNkZWZpbmUgRFNQX0dwaW9Nb2RlQ29udHJvbF8xNV84ICAgMHg4MDAwMDA4MgorI2RlZmluZSBEU1BfR3Bpb0RyaXZlckVuYWJsZV8xNV84ICAweDgwMDAwMDc2CisjZGVmaW5lIERTUF9HcGlvT3V0cHV0RGF0YV8xNV84ICAgIDB4ODAwMDAwNzIKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IE5NSToxOwkvKiBSVzogbm9uIG1hc2thYmxlIGludGVycnVwdCAqLworCXVuc2lnbmVkIHNob3J0IEhhbHQ6MTsJLyogUlc6IEhhbHQgTVNQIGNsb2NrICovCisJdW5zaWduZWQgc2hvcnQgUmVzZXRDb3JlOjE7CS8qIFJXOiBSZXNldCBNU1AgY29yZSBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBSZXNlcnZlZDoxMzsJLyogMDogUmVzZXJ2ZWQgKi8KK30gRFNQX0JPT1RfRE9NQUlOOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgRGlzYWJsZVRpbWVvdXQ6MTsJLyogUlc6IERpc2FibGUgTEJ1cyB0aW1lb3V0ICovCisJdW5zaWduZWQgc2hvcnQgUmVzZXJ2ZWQ6MTU7CS8qIDA6IFJlc2VydmVkICovCit9IERTUF9MQlVTX1RJTUVPVVRfRElTQUJMRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IE1lbW9yeToxOwkvKiBSVzogUmVzZXQgbWVtb3J5IGludGVyZmFjZSAqLworCXVuc2lnbmVkIHNob3J0IFNlcmlhbFBvcnQxOjE7CS8qIFJXOiBSZXNldCBzZXJpYWwgcG9ydCAxIGludGVyZmFjZSAqLworCXVuc2lnbmVkIHNob3J0IFNlcmlhbFBvcnQyOjE7CS8qIFJXOiBSZXNldCBzZXJpYWwgcG9ydCAyIGludGVyZmFjZSAqLworCXVuc2lnbmVkIHNob3J0IFNlcmlhbFBvcnQzOjE7CS8qIFJXOiBSZXNldCBzZXJpYWwgcG9ydCAzIGludGVyZmFjZSAqLworCXVuc2lnbmVkIHNob3J0IEdwaW86MTsJLyogUlc6IFJlc2V0IEdQSU8gaW50ZXJmYWNlICovCisJdW5zaWduZWQgc2hvcnQgRG1hOjE7CS8qIFJXOiBSZXNldCBETUEgaW50ZXJmYWNlICovCisJdW5zaWduZWQgc2hvcnQgU291bmRCbGFzdGVyOjE7CS8qIFJXOiBSZXNldCBzb3VuZGJsYXN0ZXIgaW50ZXJmYWNlICovCisJdW5zaWduZWQgc2hvcnQgVWFydDoxOwkvKiBSVzogUmVzZXQgVUFSVCBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBNaWRpOjE7CS8qIFJXOiBSZXNldCBNSURJIGludGVyZmFjZSAqLworCXVuc2lnbmVkIHNob3J0IElzYU1hc3RlcjoxOwkvKiBSVzogUmVzZXQgSVNBIG1hc3RlciBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBSZXNlcnZlZDo2OwkvKiAwOiBSZXNlcnZlZCAqLworfSBEU1BfQ0hJUF9SRVNFVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IE5fRGl2aXNvcjo2OwkvKiBSVzogKE4pIFBMTCBvdXRwdXQgY2xvY2sgZGl2aXNvciAqLworCXVuc2lnbmVkIHNob3J0IFJlc2VydmVkMToyOwkvKiAwOiByZXNlcnZlZCAqLworCXVuc2lnbmVkIHNob3J0IE1fTXVsdGlwbGllcjo2OwkvKiBSVzogKE0pIFBMTCBmZWVkYmFjayBjbG9jayBtdWx0aXBsaWVyICovCisJdW5zaWduZWQgc2hvcnQgUmVzZXJ2ZWQyOjI7CS8qIDA6IHJlc2VydmVkICovCit9IERTUF9DTE9DS19DT05UUk9MXzE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBQbGxCeXBhc3M6MTsJLyogUlc6IFBMTCBCeXBhc3MgKi8KKwl1bnNpZ25lZCBzaG9ydCBSZXNlcnZlZDoxNTsJLyogMDogUmVzZXJ2ZWQgKi8KK30gRFNQX0NMT0NLX0NPTlRST0xfMjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IExhdGNoODoxOworCXVuc2lnbmVkIHNob3J0IExhdGNoOToxOworCXVuc2lnbmVkIHNob3J0IExhdGNoMTA6MTsKKwl1bnNpZ25lZCBzaG9ydCBMYXRjaDExOjE7CisJdW5zaWduZWQgc2hvcnQgTGF0Y2gxMjoxOworCXVuc2lnbmVkIHNob3J0IExhdGNoMTM6MTsKKwl1bnNpZ25lZCBzaG9ydCBMYXRjaDE0OjE7CisJdW5zaWduZWQgc2hvcnQgTGF0Y2gxNToxOworCXVuc2lnbmVkIHNob3J0IE1hc2s4OjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazk6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTA6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTE6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTI6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTM6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTQ6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTU6MTsKK30gRFNQX0dQSU9fT1VUUFVUX0RBVEFfMTVfODsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IEVuYWJsZTg6MTsKKwl1bnNpZ25lZCBzaG9ydCBFbmFibGU5OjE7CisJdW5zaWduZWQgc2hvcnQgRW5hYmxlMTA6MTsKKwl1bnNpZ25lZCBzaG9ydCBFbmFibGUxMToxOworCXVuc2lnbmVkIHNob3J0IEVuYWJsZTEyOjE7CisJdW5zaWduZWQgc2hvcnQgRW5hYmxlMTM6MTsKKwl1bnNpZ25lZCBzaG9ydCBFbmFibGUxNDoxOworCXVuc2lnbmVkIHNob3J0IEVuYWJsZTE1OjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazg6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrOToxOworCXVuc2lnbmVkIHNob3J0IE1hc2sxMDoxOworCXVuc2lnbmVkIHNob3J0IE1hc2sxMToxOworCXVuc2lnbmVkIHNob3J0IE1hc2sxMjoxOworCXVuc2lnbmVkIHNob3J0IE1hc2sxMzoxOworCXVuc2lnbmVkIHNob3J0IE1hc2sxNDoxOworCXVuc2lnbmVkIHNob3J0IE1hc2sxNToxOworfSBEU1BfR1BJT19EUklWRVJfRU5BQkxFXzE1Xzg7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBHcGlvTW9kZTg6MjsKKwl1bnNpZ25lZCBzaG9ydCBHcGlvTW9kZTk6MjsKKwl1bnNpZ25lZCBzaG9ydCBHcGlvTW9kZTEwOjI7CisJdW5zaWduZWQgc2hvcnQgR3Bpb01vZGUxMToyOworCXVuc2lnbmVkIHNob3J0IEdwaW9Nb2RlMTI6MjsKKwl1bnNpZ25lZCBzaG9ydCBHcGlvTW9kZTEzOjI7CisJdW5zaWduZWQgc2hvcnQgR3Bpb01vZGUxNDoyOworCXVuc2lnbmVkIHNob3J0IEdwaW9Nb2RlMTU6MjsKK30gRFNQX0dQSU9fTU9ERV8xNV84OworCisvKiBDb21wb25lbnQgbWFza3MgdGhhdCBhcmUgZGVmaW5lZCBpbiBkc3BtZ3IuaCAqLworI2RlZmluZSBNV19BRENfTUFTSyAgICAweDAwMDEKKyNkZWZpbmUgTVdfQUlDMl9NQVNLICAgMHgwMDA2CisjZGVmaW5lIE1XX01JRElfTUFTSyAgIDB4MDAwOAorI2RlZmluZSBNV19DRERBQ19NQVNLICAweDgwMDEKKyNkZWZpbmUgTVdfQUlDMV9NQVNLICAgMHhFMDA2CisjZGVmaW5lIE1XX1VBUlRfTUFTSyAgIDB4RTAwQQorI2RlZmluZSBNV19BQ0lfTUFTSyAgICAweEUwMEIKKworLyoKKyogRGVmaW5pdGlvbiBvZiAzNzgwaSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZS4gIFVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLAorKiB0aGVzZSB2YWx1ZXMgYXJlIHByb3ZpZGVkIGFzIGlucHV0IHRvIHRoZSAzNzgwaSBzdXBwb3J0IGxheWVyLiAgQXQgcHJlc2VudCwKKyogdGhlIG9ubHkgdmFsdWVzIG1haW50YWluZWQgYnkgdGhlIDM3ODBpIHN1cHBvcnQgbGF5ZXIgYXJlIHRoZSBzYXZlZCBVQVJUCisqIHJlZ2lzdGVycy4KKyovCit0eXBlZGVmIHN0cnVjdCBfRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyB7CisKKwkvKiBMb2NhdGlvbiBvZiBiYXNlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCB1c0Jhc2VDb25maWdJTzsKKworCS8qIEVuYWJsZXMgZm9yIHZhcmlvdXMgRFNQIGNvbXBvbmVudHMgKi8KKwlpbnQgYkRTUEVuYWJsZWQ7CisJaW50IGJNb2RlbUVuYWJsZWQ7CisJaW50IGJJbnRlcnJ1cHRDbGFpbWVkOworCisJLyogSVJRLCBETUEsIGFuZCBCYXNlIEkvTyBhZGRyZXNzZXMgZm9yIHZhcmlvdXMgRFNQIGNvbXBvbmVudHMgKi8KKwl1bnNpZ25lZCBzaG9ydCB1c0RzcElycTsKKwl1bnNpZ25lZCBzaG9ydCB1c0RzcERtYTsKKwl1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTzsKKwl1bnNpZ25lZCBzaG9ydCB1c1VhcnRJcnE7CisJdW5zaWduZWQgc2hvcnQgdXNVYXJ0QmFzZUlPOworCisJLyogSVJRIG1vZGVzIGZvciB2YXJpb3VzIERTUCBjb21wb25lbnRzICovCisJaW50IGJEc3BJcnFBY3RpdmVMb3c7CisJaW50IGJVYXJ0SXJxQWN0aXZlTG93OworCWludCBiRHNwSXJxUHVsc2U7CisJaW50IGJVYXJ0SXJxUHVsc2U7CisKKwkvKiBDYXJkIGFiaWxpdGllcyAqLworCXVuc2lnbmVkIHVJcHM7CisJdW5zaWduZWQgdURTdG9yZVNpemU7CisJdW5zaWduZWQgdUlTdG9yZVNpemU7CisJdW5zaWduZWQgdURtYUJhbmR3aWR0aDsKKworCS8qIEFkYXB0ZXIgc3BlY2lmaWMgMzc4MGkgc2V0dGluZ3MgKi8KKwl1bnNpZ25lZCBzaG9ydCB1c051bVRyYW5zZmVyczsKKwl1bnNpZ25lZCBzaG9ydCB1c1JlUmVxdWVzdDsKKwlpbnQgYkVuYWJsZU1FTUNTMTY7CisJdW5zaWduZWQgc2hvcnQgdXNJc2FNZW1DbWRXaWR0aDsKKwlpbnQgYkdhdGVJT0NIUkRZOworCWludCBiRW5hYmxlUHdyTWdtdDsKKwl1bnNpZ25lZCBzaG9ydCB1c0hCdXNUaW1lckxvYWRWYWx1ZTsKKwlpbnQgYkRpc2FibGVMQnVzVGltZW91dDsKKwl1bnNpZ25lZCBzaG9ydCB1c05fRGl2aXNvcjsKKwl1bnNpZ25lZCBzaG9ydCB1c01fTXVsdGlwbGllcjsKKwlpbnQgYlBsbEJ5cGFzczsKKwl1bnNpZ25lZCBzaG9ydCB1c0NoaXBsZXRFbmFibGU7CS8qIFVzZWQgd2l0aCB0aGUgY2hpcCByZXNldCByZWdpc3RlciB0byBlbmFibGUgc3BlY2lmaWMgY2hpcGxldHMgKi8KKworCS8qIFNhdmVkIFVBUlQgcmVnaXN0ZXJzLiBUaGVzZSBhcmUgbWFpbnRhaW5lZCBieSB0aGUgMzc4MGkgc3VwcG9ydCBsYXllci4gKi8KKwlpbnQgYlVhcnRTYXZlZDsJCS8qIFRydWUgYWZ0ZXIgYSBzdWNjZXNzZnVsIHNhdmUgb2YgdGhlIFVBUlQgcmVnaXN0ZXJzICovCisJdW5zaWduZWQgY2hhciB1Y0lFUjsJLyogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworCXVuc2lnbmVkIGNoYXIgdWNGQ1I7CS8qIEZJRk8gY29udHJvbCByZWdpc3RlciAqLworCXVuc2lnbmVkIGNoYXIgdWNMQ1I7CS8qIExpbmUgY29udHJvbCByZWdpc3RlciAqLworCXVuc2lnbmVkIGNoYXIgdWNNQ1I7CS8qIE1vZGVtIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHVjU0NSOwkvKiBTY3JhdGNoIHJlZ2lzdGVyICovCisJdW5zaWduZWQgY2hhciB1Y0RMTDsJLyogRGl2aXNvciBsYXRjaCwgbG93IGJ5dGUgKi8KKwl1bnNpZ25lZCBjaGFyIHVjRExNOwkvKiBEaXZpc29yIGxhdGNoLCBoaWdoIGJ5dGUgKi8KK30gRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUzsKKworCisvKiAzNzgwaSBzdXBwb3J0IGZ1bmN0aW9ucyAqLworaW50IGRzcDM3ODBJX0VuYWJsZURTUChEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICogcFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqcElycU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKnBEbWFNYXApOworaW50IGRzcDM3ODBJX0Rpc2FibGVEU1AoRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqIHBTZXR0aW5ncyk7CitpbnQgZHNwMzc4MElfUmVzZXQoRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqIHBTZXR0aW5ncyk7CitpbnQgZHNwMzc4MElfUnVuKERTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKiBwU2V0dGluZ3MpOworaW50IGRzcDM3ODBJX1JlYWREU3RvcmUodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sIHZvaWQgX191c2VyICpwdkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVDb3VudCwgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpOworaW50IGRzcDM3ODBJX1JlYWRBbmRDbGVhckRTdG9yZSh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKnB2QnVmZmVyLCB1bnNpZ25lZCB1Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKTsKK2ludCBkc3AzNzgwSV9Xcml0ZURTdG9yZSh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywgdm9pZCBfX3VzZXIgKnB2QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVDb3VudCwgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpOworaW50IGRzcDM3ODBJX1JlYWRJU3RvcmUodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sIHZvaWQgX191c2VyICpwdkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVDb3VudCwgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpOworaW50IGRzcDM3ODBJX1dyaXRlSVN0b3JlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB2b2lkIF9fdXNlciAqcHZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdUNvdW50LCB1bnNpZ25lZCBsb25nIHVsRFNQQWRkcik7Cit1bnNpZ25lZCBzaG9ydCBkc3AzNzgwSV9SZWFkTXNhQ2ZnKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHVsTXNhQWRkcik7Cit2b2lkIGRzcDM3ODBJX1dyaXRlTXNhQ2ZnKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHVsTXNhQWRkciwgdW5zaWduZWQgc2hvcnQgdXNWYWx1ZSk7Cit2b2lkIGRzcDM3ODBJX1dyaXRlR2VuQ2ZnKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB1bnNpZ25lZCB1SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdWNWYWx1ZSk7Cit1bnNpZ25lZCBjaGFyIGRzcDM3ODBJX1JlYWRHZW5DZmcodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdUluZGV4KTsKK2ludCBkc3AzNzgwSV9HZXRJUENTb3VyY2UodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpwdXNJUENTb3VyY2UpOworCisvKiBJL08gcG9ydCBhY2Nlc3MgbWFjcm9zICovCisjZGVmaW5lIE1LV09SRCh2YXIpICgqKCh1bnNpZ25lZCBzaG9ydCAqKSgmdmFyKSkpCisjZGVmaW5lIE1LQllURSh2YXIpICgqKCh1bnNpZ25lZCBjaGFyICopKCZ2YXIpKSkKKworI2RlZmluZSBXcml0ZU1zYUNmZyhhZGRyLHZhbHVlKSBkc3AzNzgwSV9Xcml0ZU1zYUNmZyh1c0RzcEJhc2VJTyxhZGRyLHZhbHVlKQorI2RlZmluZSBSZWFkTXNhQ2ZnKGFkZHIpIGRzcDM3ODBJX1JlYWRNc2FDZmcodXNEc3BCYXNlSU8sYWRkcikKKyNkZWZpbmUgV3JpdGVHZW5DZmcoaW5kZXgsdmFsdWUpIGRzcDM3ODBJX1dyaXRlR2VuQ2ZnKHVzRHNwQmFzZUlPLGluZGV4LHZhbHVlKQorI2RlZmluZSBSZWFkR2VuQ2ZnKGluZGV4KSBkc3AzNzgwSV9SZWFkR2VuQ2ZnKHVzRHNwQmFzZUlPLGluZGV4KQorCisjZGVmaW5lIEluV29yZERzcChpbmRleCkgICAgICAgICAgaW53KHVzRHNwQmFzZUlPK2luZGV4KQorI2RlZmluZSBJbkJ5dGVEc3AoaW5kZXgpICAgICAgICAgIGluYih1c0RzcEJhc2VJTytpbmRleCkKKyNkZWZpbmUgT3V0V29yZERzcChpbmRleCx2YWx1ZSkgICBvdXR3KHZhbHVlLHVzRHNwQmFzZUlPK2luZGV4KQorI2RlZmluZSBPdXRCeXRlRHNwKGluZGV4LHZhbHVlKSAgIG91dGIodmFsdWUsdXNEc3BCYXNlSU8raW5kZXgpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL213YXZlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NGM5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIworIyBNYWtlZmlsZSBmb3IgQUNQIE1vZGVtIChNd2F2ZSkuCisjCisjIFNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIG1vcmUgaW5mby4gPHBhdWxzY2hAdXMuaWJtLmNvbT4KKyMKKworb2JqLSQoQ09ORklHX01XQVZFKSArPSBtd2F2ZS5vCisKK213YXZlLW9ianMgOj0gbXdhdmVkZC5vIHNtYXBpLm8gdHAzNzgwaS5vIDM3ODBpLm8KKworIyBUbyBoYXZlIHRoZSBtd2F2ZSBkcml2ZXIgZGlzYWJsZSBvdGhlciB1YXJ0cyBpZiBuZWNlc3NhcnkKKyMgRVhUUkFfQ0ZMQUdTICs9IC1ETVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKworIyBUbyBjb21waWxlIGluIGxvdHMgKH4yMCBLaUIpIG9mIHJ1bi10aW1lIGVuYWJsYWJsZSBwcmludGsoKXMgZm9yIGRlYnVnZ2luZzoKK0VYVFJBX0NGTEFHUyArPSAtRE1XX1RSQUNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvUkVBRE1FIGIvZHJpdmVycy9jaGFyL213YXZlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGY4ZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL1JFQURNRQpAQCAtMCwwICsxLDUwIEBACitNb2R1bGUgb3B0aW9ucworLS0tLS0tLS0tLS0tLS0KKworVGhlIG13YXZlIG1vZHVsZSB0YWtlcyB0aGUgZm9sbG93aW5nIG9wdGlvbnMuICBOb3RlIHRoYXQgdGhlc2Ugb3B0aW9ucworYXJlIG5vdCBzYXZlZCBieSB0aGUgQklPUyBhbmQgc28gZG8gbm90IHBlcnNpc3QgYWZ0ZXIgdW5sb2FkIGFuZCByZWxvYWQuCisKKyAgbXdhdmVfZGVidWc9dmFsdWUsIHdoZXJlIHZhbHVlIGlzIGJpdHdpc2UgT1Igb2YgdHJhY2UgZmxhZ3M6CisJMHgwMDAxIG13YXZlZGQgYXBpIHRyYWNpbmcKKwkweDAwMDIgc21hcGkgYXBpIHRyYWNpbmcKKwkweDAwMDQgMzc4MGkgdHJhY2luZworCTB4MDAwOCB0cDM3ODBpIHRyYWNpbmcKKworICAgICAgICBUcmFjaW5nIG9ubHkgb2NjdXJzIGlmIHRoZSBkcml2ZXIgaGFzIGJlZW4gY29tcGlsZWQgd2l0aCB0aGUKKyAgICAgICAgTVdfVFJBQ0UgbWFjcm8gI2RlZmluZWQgIChpLmUuIGxldCBFWFRSQV9DRkxBR1MgKz0gLURNV19UUkFDRQorICAgICAgICBpbiB0aGUgTWFrZWZpbGUpLgorCisgIG13YXZlXzM3ODBpX2lycT01LzcvMTAvMTEvMTUKKwlJZiB0aGUgZHNwIGlycSBoYXMgbm90IGJlZW4gc2V0dXAgYW5kIHN0b3JlZCBpbiBiaW9zIGJ5IHRoZSAKKwl0aGlua3BhZCBjb25maWd1cmF0aW9uIHV0aWxpdHkgdGhlbiB0aGlzIHBhcmFtZXRlciBhbGxvd3MgdGhlCisJaXJxIHVzZWQgYnkgdGhlIGRzcCB0byBiZSBjb25maWd1cmVkLgorCisgIG13YXZlXzM3ODBpX2lvPTB4MTMwLzB4MzUwLzB4MDA3MC8weERCMAorCUlmIHRoZSBkc3AgaW8gcmFuZ2UgaGFzIG5vdCBiZWVuIHNldHVwIGFuZCBzdG9yZWQgaW4gYmlvcyBieSB0aGUgCisJdGhpbmtwYWQgY29uZmlndXJhdGlvbiB1dGlsaXR5IHRoZW4gdGhpcyBwYXJhbWV0ZXIgYWxsb3dzIHRoZQorCWlvIHJhbmdlIHVzZWQgYnkgdGhlIGRzcCB0byBiZSBjb25maWd1cmVkLgorCisgIG13YXZlX3VhcnRfaXJxPTMvNAorCUlmIHRoZSBtd2F2ZSdzIHVhcnQgaXJxIGhhcyBub3QgYmVlbiBzZXR1cCBhbmQgc3RvcmVkIGluIGJpb3MgYnkgdGhlIAorCXRoaW5rcGFkIGNvbmZpZ3VyYXRpb24gdXRpbGl0eSB0aGVuIHRoaXMgcGFyYW1ldGVyIGFsbG93cyB0aGUKKwlpcnEgdXNlZCBieSB0aGUgbXdhdmUgdWFydCB0byBiZSBjb25maWd1cmVkLgorCisgIG13YXZlX3VhcnRfaW89MHgzZjgvMHgyZjgvMHgzRTgvMHgyRTgKKwlJZiB0aGUgdWFydCBpbyByYW5nZSBoYXMgbm90IGJlZW4gc2V0dXAgYW5kIHN0b3JlZCBpbiBiaW9zIGJ5IHRoZSAKKwl0aGlua3BhZCBjb25maWd1cmF0aW9uIHV0aWxpdHkgdGhlbiB0aGlzIHBhcmFtZXRlciBhbGxvd3MgdGhlCisJaW8gcmFuZ2UgdXNlZCBieSB0aGUgbXdhdmUgdWFydCB0byBiZSBjb25maWd1cmVkLgorCitFeGFtcGxlIHRvIGVuYWJsZSB0aGUgMzc4MGkgRFNQIHVzaW5nIHR0eVMxIHJlc291cmNlczoKKwkKKyAgaW5zbW9kIG13YXZlIG13YXZlXzM3ODBpX2lycT0xMCBtd2F2ZV8zNzgwaV9pbz0weDAxMzAgbXdhdmVfdWFydF9pcnE9MyBtd2F2ZV91YXJ0X2lvPTB4MmY4CisKK0FjY2Vzc2luZyB0aGUgZHJpdmVyCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgbXVzdCBhbHNvIGNyZWF0ZSBhIG5vZGUgZm9yIHRoZSBkcml2ZXIuICBXaXRob3V0IGRldmZzOgorICBta2RpciAtcCAvZGV2L21vZGVtcworICBta25vZCAtLW1vZGU9NjYwIC9kZXYvbW9kZW1zL213YXZlIGMgMTAgMjE5CitXaXRoIGRldmZzOgorICBta2RpciAtcCAvZGV2L21vZGVtcworICBsbiAtcyAuLi9taXNjL213YXZlIC9kZXYvbW9kZW1zL213YXZlCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmMgYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNzYyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jCkBAIC0wLDAgKzEsNjc0IEBACisvKgorKgorKiBtd2F2ZWRkLmMgLS0gbXdhdmUgZGV2aWNlIGRyaXZlcgorKgorKgorKiBXcml0dGVuIEJ5OiBNaWtlIFN1bGxpdmFuIElCTSBDb3Jwb3JhdGlvbgorKgorKiBDb3B5cmlnaHQgKEMpIDE5OTkgSUJNIENvcnBvcmF0aW9uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIE5PIFdBUlJBTlRZCisqIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgorKiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorKiBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisqIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyogZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCisqIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworKiB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorKiBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKyoKKyogRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKyogTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisqIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisqIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorKiBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyoKKyoKKyogMTAvMjMvMjAwMCAtIEFscGhhIFJlbGVhc2UKKyoJRmlyc3QgcmVsZWFzZSB0byB0aGUgcHVibGljCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAic21hcGkuaCIKKyNpbmNsdWRlICJtd2F2ZWRkLmgiCisjaW5jbHVkZSAiMzc4MGkuaCIKKyNpbmNsdWRlICJ0cDM3ODBpLmgiCisKK01PRFVMRV9ERVNDUklQVElPTigiMzc4MGkgQWR2YW5jZWQgQ29tbXVuaWNhdGlvbnMgUHJvY2Vzc29yIChNd2F2ZSkgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNaWtlIFN1bGxpdmFuIGFuZCBQYXVsIFNjaHJvZWRlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorKiBUaGVzZSBwYXJhbWV0ZXJzIHN1cHBvcnQgdGhlIHNldHRpbmcgb2YgTVdhdmUgcmVzb3VyY2VzLiBOb3RlIHRoYXQgbm8KKyogY2hlY2tzIGFyZSBtYWRlIGFnYWluc3Qgb3RoZXIgZGV2aWNlcyAoaWUuIHN1cGVyaW8pIGZvciBjb25mbGljdHMuCisqIFdlJ2xsIGRlcGVuZCBvbiB1c2VycyB1c2luZyB0aGUgdHBjdGwgdXRpbGl0eSB0byBkbyB0aGF0IGZvciBub3cKKyovCitpbnQgbXdhdmVfZGVidWcgPSAwOworaW50IG13YXZlXzM3ODBpX2lycSA9IDA7CitpbnQgbXdhdmVfMzc4MGlfaW8gPSAwOworaW50IG13YXZlX3VhcnRfaXJxID0gMDsKK2ludCBtd2F2ZV91YXJ0X2lvID0gMDsKK21vZHVsZV9wYXJhbShtd2F2ZV9kZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtd2F2ZV8zNzgwaV9pcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXdhdmVfMzc4MGlfaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXdhdmVfdWFydF9pcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXdhdmVfdWFydF9pbywgaW50LCAwKTsKKworc3RhdGljIGludCBtd2F2ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgbXdhdmVfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBtd2F2ZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlvY21kLCB1bnNpZ25lZCBsb25nIGlvYXJnKTsKKworTVdBVkVfREVWSUNFX0RBVEEgbXdhdmVfc19tZGQ7CisKK3N0YXRpYyBpbnQgbXdhdmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmV0dmFsID0gMDsKKworCVBSSU5US18zKFRSQUNFX01XQVZFLAorCQkibXdhdmVkZDo6bXdhdmVfb3BlbiwgZW50cnkgaW5vZGUgJXAgZmlsZSAlcFxuIiwKKwkJIGlub2RlLCBmaWxlKTsKKwlQUklOVEtfMihUUkFDRV9NV0FWRSwKKwkJIm13YXZlZGQ6Om13YXZlX29wZW4sIGV4aXQgcmV0dXJuIHJldHZhbCAleFxuIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgbXdhdmVfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IHJldHZhbCA9IDA7CisKKwlQUklOVEtfMyhUUkFDRV9NV0FWRSwKKwkJIm13YXZlZGQ6Om13YXZlX2Nsb3NlLCBlbnRyeSBpbm9kZSAlcCBmaWxlICVwXG4iLAorCQkgaW5vZGUsICBmaWxlKTsKKworCVBSSU5US18yKFRSQUNFX01XQVZFLCAibXdhdmVkZDo6bXdhdmVfY2xvc2UsIGV4aXQgcmV0dmFsICV4XG4iLAorCQlyZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBtd2F2ZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlvY21kLCB1bnNpZ25lZCBsb25nIGlvYXJnKQoreworCXVuc2lnbmVkIGludCByZXR2YWwgPSAwOworCXBNV0FWRV9ERVZJQ0VfREFUQSBwRHJ2RGF0YSA9ICZtd2F2ZV9zX21kZDsKKwl2b2lkIF9fdXNlciAqYXJnID0gKHZvaWQgX191c2VyICopaW9hcmc7CisKKwlQUklOVEtfNShUUkFDRV9NV0FWRSwKKwkJIm13YXZlZGQ6Om13YXZlX2lvY3RsLCBlbnRyeSBpbm9kZSAlcCBmaWxlICVwIGNtZCAleCBhcmcgJXhcbiIsCisJCSBpbm9kZSwgIGZpbGUsIGlvY21kLCAoaW50KSBpb2FyZyk7CisKKwlzd2l0Y2ggKGlvY21kKSB7CisKKwkJY2FzZSBJT0NUTF9NV19SRVNFVDoKKwkJCVBSSU5US18xKFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCwgSU9DVExfTVdfUkVTRVQiCisJCQkJIiBjYWxsaW5nIHRwMzc4MElfUmVzZXREU1BcbiIpOworCQkJcmV0dmFsID0gdHAzNzgwSV9SZXNldERTUCgmcERydkRhdGEtPnJCRERhdGEpOworCQkJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsLCBJT0NUTF9NV19SRVNFVCIKKwkJCQkiIHJldHZhbCAleCBmcm9tIHRwMzc4MElfUmVzZXREU1BcbiIsCisJCQkJcmV0dmFsKTsKKwkJCWJyZWFrOworCQorCQljYXNlIElPQ1RMX01XX1JVTjoKKwkJCVBSSU5US18xKFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCwgSU9DVExfTVdfUlVOIgorCQkJCSIgY2FsbGluZyB0cDM3ODBJX1N0YXJ0RFNQXG4iKTsKKwkJCXJldHZhbCA9IHRwMzc4MElfU3RhcnREU1AoJnBEcnZEYXRhLT5yQkREYXRhKTsKKwkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCwgSU9DVExfTVdfUlVOIgorCQkJCSIgcmV0dmFsICV4IGZyb20gdHAzNzgwSV9TdGFydERTUFxuIiwKKwkJCQlyZXR2YWwpOworCQkJYnJlYWs7CisJCisJCWNhc2UgSU9DVExfTVdfRFNQX0FCSUxJVElFUzogeworCQkJTVdfQUJJTElUSUVTIHJBYmlsaXRpZXM7CisJCisJCQlQUklOVEtfMShUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwsIgorCQkJCSIgSU9DVExfTVdfRFNQX0FCSUxJVElFUyBjYWxsaW5nIgorCQkJCSIgdHAzNzgwSV9RdWVyeUFiaWxpdGllc1xuIik7CisJCQlyZXR2YWwgPSB0cDM3ODBJX1F1ZXJ5QWJpbGl0aWVzKCZwRHJ2RGF0YS0+ckJERGF0YSwKKwkJCQkJJnJBYmlsaXRpZXMpOworCQkJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsLCBJT0NUTF9NV19EU1BfQUJJTElUSUVTIgorCQkJCSIgcmV0dmFsICV4IGZyb20gdHAzNzgwSV9RdWVyeUFiaWxpdGllc1xuIiwKKwkJCQlyZXR2YWwpOworCQkJaWYgKHJldHZhbCA9PSAwKSB7CisJCQkJaWYoIGNvcHlfdG9fdXNlcihhcmcsICZyQWJpbGl0aWVzLAorCQkJCQkJCXNpemVvZihNV19BQklMSVRJRVMpKSApCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsLCBJT0NUTF9NV19EU1BfQUJJTElUSUVTIgorCQkJCSIgZXhpdCByZXR2YWwgJXhcbiIsCisJCQkJcmV0dmFsKTsKKwkJfQorCQkJYnJlYWs7CisJCisJCWNhc2UgSU9DVExfTVdfUkVBRF9EQVRBOgorCQljYXNlIElPQ1RMX01XX1JFQURDTEVBUl9EQVRBOiB7CisJCQlNV19SRUFEV1JJVEUgclJlYWREYXRhOworCQkJdW5zaWduZWQgc2hvcnQgX191c2VyICpwdXNCdWZmZXIgPSBOVUxMOworCQorCQkJaWYoIGNvcHlfZnJvbV91c2VyKCZyUmVhZERhdGEsIGFyZywKKwkJCQkJCXNpemVvZihNV19SRUFEV1JJVEUpKSApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdXNCdWZmZXIgPSAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChyUmVhZERhdGEucEJ1Zik7CisJCisJCQlQUklOVEtfNChUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfUkVBRF9EQVRBLCIKKwkJCQkiIHNpemUgJWx4LCBpb2FyZyAlbHggcHVzQnVmZmVyICVwXG4iLAorCQkJCXJSZWFkRGF0YS51bERhdGFMZW5ndGgsIGlvYXJnLCBwdXNCdWZmZXIpOworCQkJcmV0dmFsID0gdHAzNzgwSV9SZWFkV3JpdGVEc3BEU3RvcmUoJnBEcnZEYXRhLT5yQkREYXRhLAorCQkJCQlpb2NtZCwKKwkJCQkJcHVzQnVmZmVyLAorCQkJCQlyUmVhZERhdGEudWxEYXRhTGVuZ3RoLAorCQkJCQlyUmVhZERhdGEudXNEc3BBZGRyZXNzKTsKKwkJfQorCQkJYnJlYWs7CisJCisJCWNhc2UgSU9DVExfTVdfUkVBRF9JTlNUOiB7CisJCQlNV19SRUFEV1JJVEUgclJlYWREYXRhOworCQkJdW5zaWduZWQgc2hvcnQgX191c2VyICpwdXNCdWZmZXIgPSBOVUxMOworCQorCQkJaWYoIGNvcHlfZnJvbV91c2VyKCZyUmVhZERhdGEsIGFyZywKKwkJCQkJCXNpemVvZihNV19SRUFEV1JJVEUpKSApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdXNCdWZmZXIgPSAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChyUmVhZERhdGEucEJ1Zik7CisJCisJCQlQUklOVEtfNChUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfUkVBRF9JTlNULCIKKwkJCQkiIHNpemUgJWx4LCBpb2FyZyAlbHggcHVzQnVmZmVyICVwXG4iLAorCQkJCXJSZWFkRGF0YS51bERhdGFMZW5ndGggLyAyLCBpb2FyZywKKwkJCQlwdXNCdWZmZXIpOworCQkJcmV0dmFsID0gdHAzNzgwSV9SZWFkV3JpdGVEc3BEU3RvcmUoJnBEcnZEYXRhLT5yQkREYXRhLAorCQkJCWlvY21kLCBwdXNCdWZmZXIsCisJCQkJclJlYWREYXRhLnVsRGF0YUxlbmd0aCAvIDIsCisJCQkJclJlYWREYXRhLnVzRHNwQWRkcmVzcyk7CisJCX0KKwkJCWJyZWFrOworCQorCQljYXNlIElPQ1RMX01XX1dSSVRFX0RBVEE6IHsKKwkJCU1XX1JFQURXUklURSByV3JpdGVEYXRhOworCQkJdW5zaWduZWQgc2hvcnQgX191c2VyICpwdXNCdWZmZXIgPSBOVUxMOworCQorCQkJaWYoIGNvcHlfZnJvbV91c2VyKCZyV3JpdGVEYXRhLCBhcmcsCisJCQkJCQlzaXplb2YoTVdfUkVBRFdSSVRFKSkgKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHVzQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAocldyaXRlRGF0YS5wQnVmKTsKKwkKKwkJCVBSSU5US180KFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCBJT0NUTF9NV19XUklURV9EQVRBLCIKKwkJCQkiIHNpemUgJWx4LCBpb2FyZyAlbHggcHVzQnVmZmVyICVwXG4iLAorCQkJCXJXcml0ZURhdGEudWxEYXRhTGVuZ3RoLCBpb2FyZywKKwkJCQlwdXNCdWZmZXIpOworCQkJcmV0dmFsID0gdHAzNzgwSV9SZWFkV3JpdGVEc3BEU3RvcmUoJnBEcnZEYXRhLT5yQkREYXRhLAorCQkJCQlpb2NtZCwgcHVzQnVmZmVyLAorCQkJCQlyV3JpdGVEYXRhLnVsRGF0YUxlbmd0aCwKKwkJCQkJcldyaXRlRGF0YS51c0RzcEFkZHJlc3MpOworCQl9CisJCQlicmVhazsKKwkKKwkJY2FzZSBJT0NUTF9NV19XUklURV9JTlNUOiB7CisJCQlNV19SRUFEV1JJVEUgcldyaXRlRGF0YTsKKwkJCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gTlVMTDsKKwkKKwkJCWlmKCBjb3B5X2Zyb21fdXNlcigmcldyaXRlRGF0YSwgYXJnLAorCQkJCQkJc2l6ZW9mKE1XX1JFQURXUklURSkpICkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB1c0J1ZmZlciA9ICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikocldyaXRlRGF0YS5wQnVmKTsKKwkKKwkJCVBSSU5US180KFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCBJT0NUTF9NV19XUklURV9JTlNULCIKKwkJCQkiIHNpemUgJWx4LCBpb2FyZyAlbHggcHVzQnVmZmVyICVwXG4iLAorCQkJCXJXcml0ZURhdGEudWxEYXRhTGVuZ3RoLCBpb2FyZywKKwkJCQlwdXNCdWZmZXIpOworCQkJcmV0dmFsID0gdHAzNzgwSV9SZWFkV3JpdGVEc3BJU3RvcmUoJnBEcnZEYXRhLT5yQkREYXRhLAorCQkJCQlpb2NtZCwgcHVzQnVmZmVyLAorCQkJCQlyV3JpdGVEYXRhLnVsRGF0YUxlbmd0aCwKKwkJCQkJcldyaXRlRGF0YS51c0RzcEFkZHJlc3MpOworCQl9CisJCQlicmVhazsKKwkKKwkJY2FzZSBJT0NUTF9NV19SRUdJU1RFUl9JUEM6IHsKKwkJCXVuc2lnbmVkIGludCBpcGNudW0gPSAodW5zaWduZWQgaW50KSBpb2FyZzsKKwkKKwkJCVBSSU5US18zKFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCBJT0NUTF9NV19SRUdJU1RFUl9JUEMiCisJCQkJIiBpcGNudW0gJXggZW50cnkgdXNJbnRDb3VudCAleFxuIiwKKwkJCQlpcGNudW0sCisJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS51c0ludENvdW50KTsKKwkKKwkJCWlmIChpcGNudW0gPiBBUlJBWV9TSVpFKHBEcnZEYXRhLT5JUENzKSkgeworCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsOiIKKwkJCQkJCSIgSU9DVExfTVdfUkVHSVNURVJfSVBDOiIKKwkJCQkJCSIgRXJyb3I6IEludmFsaWQgaXBjbnVtICV4XG4iLAorCQkJCQkJaXBjbnVtKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzSGVyZSA9IEZBTFNFOworCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID0gVFJVRTsKKwkKKwkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCBJT0NUTF9NV19SRUdJU1RFUl9JUEMiCisJCQkJIiBpcGNudW0gJXggZXhpdFxuIiwKKwkJCQlpcGNudW0pOworCQl9CisJCQlicmVhazsKKwkKKwkJY2FzZSBJT0NUTF9NV19HRVRfSVBDOiB7CisJCQl1bnNpZ25lZCBpbnQgaXBjbnVtID0gKHVuc2lnbmVkIGludCkgaW9hcmc7CisJCisJCQlQUklOVEtfMyhUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfR0VUX0lQQyIKKwkJCQkiIGlwY251bSAleCwgdXNJbnRDb3VudCAleFxuIiwKKwkJCQlpcGNudW0sCisJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS51c0ludENvdW50KTsKKwkJCWlmIChpcGNudW0gPiBBUlJBWV9TSVpFKHBEcnZEYXRhLT5JUENzKSkgeworCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsOiIKKwkJCQkJCSIgSU9DVExfTVdfR0VUX0lQQzogRXJyb3I6IgorCQkJCQkJIiBJbnZhbGlkIGlwY251bSAleFxuIiwgaXBjbnVtKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkKKwkJCWlmIChwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0VuYWJsZWQgPT0gVFJVRSkgeworCQkJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJCQkJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCwgdGhyZWFkIGZvciIKKwkJCQkJIiBpcGMgJXggZ29pbmcgdG8gc2xlZXBcbiIsCisJCQkJCWlwY251bSk7CisJCQkJYWRkX3dhaXRfcXVldWUoJnBEcnZEYXRhLT5JUENzW2lwY251bV0uaXBjX3dhaXRfcXVldWUsICZ3YWl0KTsKKwkJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0hlcmUgPSBUUlVFOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJLyogY2hlY2sgd2hldGhlciBhbiBldmVudCB3YXMgc2lnbmFsbGVkIGJ5ICovCisJCQkJLyogdGhlIGludGVycnVwdCBoYW5kbGVyIHdoaWxlIHdlIHdlcmUgZ29uZSAqLworCQkJCWlmIChwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLnVzSW50Q291bnQgPT0gMSkgewkvKiBmaXJzdCBpbnQgaGFzIG9jY3VycmVkIChyYWNlIGNvbmRpdGlvbikgKi8KKwkJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS51c0ludENvdW50ID0gMjsJLyogZmlyc3QgaW50IGhhcyBiZWVuIGhhbmRsZWQgKi8KKwkJCQkJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCQkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwiCisJCQkJCQkiIElPQ1RMX01XX0dFVF9JUEMgaXBjbnVtICV4IgorCQkJCQkJIiBoYW5kbGluZyBmaXJzdCBpbnRcbiIsCisJCQkJCQlpcGNudW0pOworCQkJCX0gZWxzZSB7CS8qIGVpdGhlciAxc3QgaW50IGhhcyBub3QgeWV0IG9jY3VycmVkLCBvciB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZCB0aGUgZmlyc3QgaW50ICovCisJCQkJCXNjaGVkdWxlKCk7CisJCQkJCWlmIChwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLnVzSW50Q291bnQgPT0gMSkgeworCQkJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS51c0ludENvdW50ID0gMjsKKwkJCQkJfQorCQkJCQlQUklOVEtfMihUUkFDRV9NV0FWRSwKKwkJCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCIKKwkJCQkJCSIgSU9DVExfTVdfR0VUX0lQQyBpcGNudW0gJXgiCisJCQkJCQkiIHdva2UgdXAgYW5kIHJldHVybmluZyB0byIKKwkJCQkJCSIgYXBwbGljYXRpb25cbiIsCisJCQkJCQlpcGNudW0pOworCQkJCX0KKwkJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0hlcmUgPSBGQUxTRTsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcERydkRhdGEtPklQQ3NbaXBjbnVtXS5pcGNfd2FpdF9xdWV1ZSwgJndhaXQpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQkJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCBJT0NUTF9NV19HRVRfSVBDLCIKKwkJCQkJIiByZXR1cm5pbmcgdGhyZWFkIGZvciBpcGMgJXgiCisJCQkJCSIgcHJvY2Vzc2luZ1xuIiwKKwkJCQkJaXBjbnVtKTsKKwkJCX0KKwkJfQorCQkJYnJlYWs7CisJCisJCWNhc2UgSU9DVExfTVdfVU5SRUdJU1RFUl9JUEM6IHsKKwkJCXVuc2lnbmVkIGludCBpcGNudW0gPSAodW5zaWduZWQgaW50KSBpb2FyZzsKKwkKKwkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCBJT0NUTF9NV19VTlJFR0lTVEVSX0lQQyIKKwkJCQkiIGlwY251bSAleFxuIiwKKwkJCQlpcGNudW0pOworCQkJaWYgKGlwY251bSA+IEFSUkFZX1NJWkUocERydkRhdGEtPklQQ3MpKSB7CisJCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGw6IgorCQkJCQkJIiBJT0NUTF9NV19VTlJFR0lTVEVSX0lQQzoiCisJCQkJCQkiIEVycm9yOiBJbnZhbGlkIGlwY251bSAleFxuIiwKKwkJCQkJCWlwY251bSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID09IFRSVUUpIHsKKwkJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0VuYWJsZWQgPSBGQUxTRTsKKwkJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID09IFRSVUUpIHsKKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmlwY193YWl0X3F1ZXVlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCWJyZWFrOworCQorCQlkZWZhdWx0OgorCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJtd2F2ZWRkOjptd2F2ZV9pb2N0bDoiCisJCQkJCSIgRXJyb3I6IFVucmVjb2duaXplZCBpb2NtZCAleFxuIiwKKwkJCQkJaW9jbWQpOworCQkJcmV0dXJuIC1FTk9UVFk7CisJCQlicmVhazsKKwl9IC8qIHN3aXRjaCAqLworCisJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsICJtd2F2ZWRkOjptd2F2ZV9pb2N0bCwgZXhpdCByZXR2YWwgJXhcbiIsIHJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyBzc2l6ZV90IG13YXZlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90ICogcHBvcykKK3sKKwlQUklOVEtfNShUUkFDRV9NV0FWRSwKKwkJIm13YXZlZGQ6Om13YXZlX3JlYWQgZW50cnkgZmlsZSAlcCwgYnVmICVwLCBjb3VudCAlenggcHBvcyAlcFxuIiwKKwkJZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCitzdGF0aWMgc3NpemVfdCBtd2F2ZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlQUklOVEtfNShUUkFDRV9NV0FWRSwKKwkJIm13YXZlZGQ6Om13YXZlX3dyaXRlIGVudHJ5IGZpbGUgJXAsIGJ1ZiAlcCwiCisJCSIgY291bnQgJXp4IHBwb3MgJXBcbiIsCisJCWZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworc3RhdGljIGludCByZWdpc3Rlcl9zZXJpYWxfcG9ydGFuZGlycSh1bnNpZ25lZCBpbnQgcG9ydCwgaW50IGlycSkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBzZXJpYWw7CisKKwlzd2l0Y2ggKCBwb3J0ICkgeworCQljYXNlIDB4M2Y4OgorCQljYXNlIDB4MmY4OgorCQljYXNlIDB4M2U4OgorCQljYXNlIDB4MmU4OgorCQkJLyogT0sgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJCSJtd2F2ZWRkOjpyZWdpc3Rlcl9zZXJpYWxfcG9ydGFuZGlycToiCisJCQkJCSIgRXJyb3I6IElsbGVnYWwgcG9ydCAleFxuIiwgcG9ydCApOworCQkJcmV0dXJuIC0xOworCX0gLyogc3dpdGNoICovCisJLyogcG9ydCBpcyBva2F5ICovCisKKwlzd2l0Y2ggKCBpcnEgKSB7CisJCWNhc2UgMzoKKwkJY2FzZSA0OgorCQljYXNlIDU6CisJCWNhc2UgNzoKKwkJCS8qIE9LICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkibXdhdmVkZDo6cmVnaXN0ZXJfc2VyaWFsX3BvcnRhbmRpcnE6IgorCQkJCQkiIEVycm9yOiBJbGxlZ2FsIGlycSAleFxuIiwgaXJxICk7CisJCQlyZXR1cm4gLTE7CisJfSAvKiBzd2l0Y2ggKi8KKwkvKiBpcnEgaXMgb2theSAqLworCisJbWVtc2V0KCZzZXJpYWwsIDAsIHNpemVvZihzZXJpYWwpKTsKKwlzZXJpYWwucG9ydCA9IHBvcnQ7CisJc2VyaWFsLmlycSA9IGlycTsKKwlzZXJpYWwuZmxhZ3MgPSBBU1lOQ19TSEFSRV9JUlE7CisKKwlyZXR1cm4gcmVnaXN0ZXJfc2VyaWFsKCZzZXJpYWwpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG13YXZlX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IG13YXZlX3JlYWQsCisJLndyaXRlCQk9IG13YXZlX3dyaXRlLAorCS5pb2N0bAkJPSBtd2F2ZV9pb2N0bCwKKwkub3BlbgkJPSBtd2F2ZV9vcGVuLAorCS5yZWxlYXNlCT0gbXdhdmVfY2xvc2UKK307CisKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIG13YXZlX21pc2NfZGV2ID0geyBNV0FWRV9NSU5PUiwgIm13YXZlIiwgJm13YXZlX2ZvcHMgfTsKKworI2lmIDAgLyogdG90YWxseSBiMHJrZWQgKi8KKy8qCisgKiBzeXNmcyBzdXBwb3J0IDxwYXVsc2NoQHVzLmlibS5jb20+CisgKi8KKworc3RydWN0IGRldmljZSBtd2F2ZV9kZXZpY2U7CisKKy8qIFByZXZlbnQgY29kZSByZWR1bmRhbmN5LCBjcmVhdGUgYSBtYWNybyBmb3IgbXdhdmVfc2hvd18qIGZ1bmN0aW9ucy4gKi8KKyNkZWZpbmUgbXdhdmVfc2hvd19mdW5jdGlvbihhdHRyX25hbWUsIGZvcm1hdF9zdHJpbmcsIGZpZWxkKQkJXAorc3RhdGljIHNzaXplX3QgbXdhdmVfc2hvd18jI2F0dHJfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPQkJCQlcCisJCSZtd2F2ZV9zX21kZC5yQkREYXRhLnJEc3BTZXR0aW5nczsJCQlcCisgICAgICAgIHJldHVybiBzcHJpbnRmKGJ1ZiwgZm9ybWF0X3N0cmluZywgcFNldHRpbmdzLT5maWVsZCk7CQlcCit9CisKKy8qIEFsbCBvZiBvdXIgYXR0cmlidXRlcyBhcmUgcmVhZCBhdHRyaWJ1dGVzLiAqLworI2RlZmluZSBtd2F2ZV9kZXZfcmRfYXR0cihhdHRyX25hbWUsIGZvcm1hdF9zdHJpbmcsIGZpZWxkKQkJXAorCW13YXZlX3Nob3dfZnVuY3Rpb24oYXR0cl9uYW1lLCBmb3JtYXRfc3RyaW5nLCBmaWVsZCkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihhdHRyX25hbWUsIFNfSVJVR08sIG13YXZlX3Nob3dfIyNhdHRyX25hbWUsIE5VTEwpCisKK213YXZlX2Rldl9yZF9hdHRyICgzNzgwaV9kbWEsICIlaVxuIiwgdXNEc3BEbWEpOworbXdhdmVfZGV2X3JkX2F0dHIgKDM3ODBpX2lycSwgIiVpXG4iLCB1c0RzcElycSk7Cittd2F2ZV9kZXZfcmRfYXR0ciAoMzc4MGlfaW8sICIlIy40eFxuIiwgdXNEc3BCYXNlSU8pOworbXdhdmVfZGV2X3JkX2F0dHIgKHVhcnRfaXJxLCAiJWlcbiIsIHVzVWFydElycSk7Cittd2F2ZV9kZXZfcmRfYXR0ciAodWFydF9pbywgIiUjLjR4XG4iLCB1c1VhcnRCYXNlSU8pOworCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiBjb25zdCBtd2F2ZV9kZXZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfMzc4MGlfZG1hLAorCSZkZXZfYXR0cl8zNzgwaV9pcnEsCisJJmRldl9hdHRyXzM3ODBpX2lvLAorCSZkZXZfYXR0cl91YXJ0X2lycSwKKwkmZGV2X2F0dHJfdWFydF9pbywKK307CisjZW5kaWYKKworLyoKKyogbXdhdmVfaW5pdCBpcyBjYWxsZWQgb24gbW9kdWxlIGxvYWQKKyoKKyogbXdhdmVfZXhpdCBpcyBjYWxsZWQgb24gbW9kdWxlIHVubG9hZAorKiBtd2F2ZV9leGl0IGlzIGFsc28gdXNlZCB0byBjbGVhbiB1cCBhZnRlciBhbiBhYm9ydGVkIG13YXZlX2luaXQKKyovCitzdGF0aWMgdm9pZCBtd2F2ZV9leGl0KHZvaWQpCit7CisJcE1XQVZFX0RFVklDRV9EQVRBIHBEcnZEYXRhID0gJm13YXZlX3NfbWRkOworCisJUFJJTlRLXzEoVFJBQ0VfTVdBVkUsICJtd2F2ZWRkOjptd2F2ZV9leGl0IGVudHJ5XG4iKTsKKworI2lmIDAKKwlmb3IgKGkgPSAwOyBpIDwgcERydkRhdGEtPm5yX3JlZ2lzdGVyZWRfYXR0cnM7IGkrKykKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZtd2F2ZV9kZXZpY2UsIG13YXZlX2Rldl9hdHRyc1tpXSk7CisJcERydkRhdGEtPm5yX3JlZ2lzdGVyZWRfYXR0cnMgPSAwOworCisJaWYgKHBEcnZEYXRhLT5kZXZpY2VfcmVnaXN0ZXJlZCkgeworCQlkZXZpY2VfdW5yZWdpc3RlcigmbXdhdmVfZGV2aWNlKTsKKwkJcERydkRhdGEtPmRldmljZV9yZWdpc3RlcmVkID0gRkFMU0U7CisJfQorI2VuZGlmCisKKwlpZiAoIHBEcnZEYXRhLT5zTGluZSA+PSAwICkgeworCQl1bnJlZ2lzdGVyX3NlcmlhbChwRHJ2RGF0YS0+c0xpbmUpOworCX0KKwlpZiAocERydkRhdGEtPmJNd2F2ZURldlJlZ2lzdGVyZWQpIHsKKwkJbWlzY19kZXJlZ2lzdGVyKCZtd2F2ZV9taXNjX2Rldik7CisJfQorCWlmIChwRHJ2RGF0YS0+YkRTUEVuYWJsZWQpIHsKKwkJdHAzNzgwSV9EaXNhYmxlRFNQKCZwRHJ2RGF0YS0+ckJERGF0YSk7CisJfQorCWlmIChwRHJ2RGF0YS0+YlJlc291cmNlc0NsYWltZWQpIHsKKwkJdHAzNzgwSV9SZWxlYXNlUmVzb3VyY2VzKCZwRHJ2RGF0YS0+ckJERGF0YSk7CisJfQorCWlmIChwRHJ2RGF0YS0+YkJESW5pdGlhbGl6ZWQpIHsKKwkJdHAzNzgwSV9DbGVhbnVwKCZwRHJ2RGF0YS0+ckJERGF0YSk7CisJfQorCisJUFJJTlRLXzEoVFJBQ0VfTVdBVkUsICJtd2F2ZWRkOjptd2F2ZV9leGl0IGV4aXRcbiIpOworfQorCittb2R1bGVfZXhpdChtd2F2ZV9leGl0KTsKKworc3RhdGljIGludCBfX2luaXQgbXdhdmVfaW5pdCh2b2lkKQoreworCWludCBpOworCWludCByZXR2YWwgPSAwOworCXBNV0FWRV9ERVZJQ0VfREFUQSBwRHJ2RGF0YSA9ICZtd2F2ZV9zX21kZDsKKworCVBSSU5US18xKFRSQUNFX01XQVZFLCAibXdhdmVkZDo6bXdhdmVfaW5pdCBlbnRyeVxuIik7CisKKwltZW1zZXQoJm13YXZlX3NfbWRkLCAwLCBzaXplb2YoTVdBVkVfREVWSUNFX0RBVEEpKTsKKworCXBEcnZEYXRhLT5iQkRJbml0aWFsaXplZCA9IEZBTFNFOworCXBEcnZEYXRhLT5iUmVzb3VyY2VzQ2xhaW1lZCA9IEZBTFNFOworCXBEcnZEYXRhLT5iRFNQRW5hYmxlZCA9IEZBTFNFOworCXBEcnZEYXRhLT5iRFNQUmVzZXQgPSBGQUxTRTsKKwlwRHJ2RGF0YS0+Yk13YXZlRGV2UmVnaXN0ZXJlZCA9IEZBTFNFOworCXBEcnZEYXRhLT5zTGluZSA9IC0xOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocERydkRhdGEtPklQQ3MpOyBpKyspIHsKKwkJcERydkRhdGEtPklQQ3NbaV0uYklzRW5hYmxlZCA9IEZBTFNFOworCQlwRHJ2RGF0YS0+SVBDc1tpXS5iSXNIZXJlID0gRkFMU0U7CisJCXBEcnZEYXRhLT5JUENzW2ldLnVzSW50Q291bnQgPSAwOwkvKiBubyBpbnRzIHJlY2VpdmVkIHlldCAqLworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwRHJ2RGF0YS0+SVBDc1tpXS5pcGNfd2FpdF9xdWV1ZSk7CisJfQorCisJcmV0dmFsID0gdHAzNzgwSV9Jbml0aWFsaXplQm9hcmREYXRhKCZwRHJ2RGF0YS0+ckJERGF0YSk7CisJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV9pbml0LCByZXR1cm4gZnJvbSB0cDM3ODBJX0luaXRpYWxpemVCb2FyZERhdGEiCisJCSIgcmV0dmFsICV4XG4iLAorCQlyZXR2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJIm13YXZlZGQ6Om13YXZlX2luaXQ6IEVycm9yOiIKKwkJCQkiIEZhaWxlZCB0byBpbml0aWFsaXplIGJvYXJkIGRhdGFcbiIpOworCQlnb3RvIGNsZWFudXBfZXJyb3I7CisJfQorCXBEcnZEYXRhLT5iQkRJbml0aWFsaXplZCA9IFRSVUU7CisKKwlyZXR2YWwgPSB0cDM3ODBJX0NhbGNSZXNvdXJjZXMoJnBEcnZEYXRhLT5yQkREYXRhKTsKKwlQUklOVEtfMihUUkFDRV9NV0FWRSwKKwkJIm13YXZlZGQ6Om13YXZlX2luaXQsIHJldHVybiBmcm9tIHRwMzc4MElfQ2FsY1Jlc291cmNlcyIKKwkJIiByZXR2YWwgJXhcbiIsCisJCXJldHZhbCk7CisJaWYgKHJldHZhbCkgeworCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkibXdhdmVkZDptd2F2ZV9pbml0OiBFcnJvcjoiCisJCQkJIiBGYWlsZWQgdG8gY2FsY3VsYXRlIHJlc291cmNlc1xuIik7CisJCWdvdG8gY2xlYW51cF9lcnJvcjsKKwl9CisKKwlyZXR2YWwgPSB0cDM3ODBJX0NsYWltUmVzb3VyY2VzKCZwRHJ2RGF0YS0+ckJERGF0YSk7CisJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV9pbml0LCByZXR1cm4gZnJvbSB0cDM3ODBJX0NsYWltUmVzb3VyY2VzIgorCQkiIHJldHZhbCAleFxuIiwKKwkJcmV0dmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCSJtd2F2ZWRkOm13YXZlX2luaXQ6IEVycm9yOiIKKwkJCQkiIEZhaWxlZCB0byBjbGFpbSByZXNvdXJjZXNcbiIpOworCQlnb3RvIGNsZWFudXBfZXJyb3I7CisJfQorCXBEcnZEYXRhLT5iUmVzb3VyY2VzQ2xhaW1lZCA9IFRSVUU7CisKKwlyZXR2YWwgPSB0cDM3ODBJX0VuYWJsZURTUCgmcERydkRhdGEtPnJCRERhdGEpOworCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkibXdhdmVkZDo6bXdhdmVfaW5pdCwgcmV0dXJuIGZyb20gdHAzNzgwSV9FbmFibGVEU1AiCisJCSIgcmV0dmFsICV4XG4iLAorCQlyZXR2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJIm13YXZlZGQ6bXdhdmVfaW5pdDogRXJyb3I6IgorCQkJCSIgRmFpbGVkIHRvIGVuYWJsZSBEU1BcbiIpOworCQlnb3RvIGNsZWFudXBfZXJyb3I7CisJfQorCXBEcnZEYXRhLT5iRFNQRW5hYmxlZCA9IFRSVUU7CisKKwlpZiAobWlzY19yZWdpc3RlcigmbXdhdmVfbWlzY19kZXYpIDwgMCkgeworCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkibXdhdmVkZDptd2F2ZV9pbml0OiBFcnJvcjoiCisJCQkJIiBGYWlsZWQgdG8gcmVnaXN0ZXIgbWlzYyBkZXZpY2VcbiIpOworCQlnb3RvIGNsZWFudXBfZXJyb3I7CisJfQorCXBEcnZEYXRhLT5iTXdhdmVEZXZSZWdpc3RlcmVkID0gVFJVRTsKKworCXBEcnZEYXRhLT5zTGluZSA9IHJlZ2lzdGVyX3NlcmlhbF9wb3J0YW5kaXJxKAorCQlwRHJ2RGF0YS0+ckJERGF0YS5yRHNwU2V0dGluZ3MudXNVYXJ0QmFzZUlPLAorCQlwRHJ2RGF0YS0+ckJERGF0YS5yRHNwU2V0dGluZ3MudXNVYXJ0SXJxCisJKTsKKwlpZiAocERydkRhdGEtPnNMaW5lIDwgMCkgeworCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkibXdhdmVkZDptd2F2ZV9pbml0OiBFcnJvcjoiCisJCQkJIiBGYWlsZWQgdG8gcmVnaXN0ZXIgc2VyaWFsIGRyaXZlclxuIik7CisJCWdvdG8gY2xlYW51cF9lcnJvcjsKKwl9CisJLyogdWFydCBpcyByZWdpc3RlcmVkICovCisKKyNpZiAwCisJLyogc3lzZnMgKi8KKwltZW1zZXQoJm13YXZlX2RldmljZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgZGV2aWNlKSk7CisJc25wcmludGYobXdhdmVfZGV2aWNlLmJ1c19pZCwgQlVTX0lEX1NJWkUsICJtd2F2ZSIpOworCisJaWYgKGRldmljZV9yZWdpc3RlcigmbXdhdmVfZGV2aWNlKSkKKwkJZ290byBjbGVhbnVwX2Vycm9yOworCXBEcnZEYXRhLT5kZXZpY2VfcmVnaXN0ZXJlZCA9IFRSVUU7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXdhdmVfZGV2X2F0dHJzKTsgaSsrKSB7CisJCWlmKGRldmljZV9jcmVhdGVfZmlsZSgmbXdhdmVfZGV2aWNlLCBtd2F2ZV9kZXZfYXR0cnNbaV0pKSB7CisJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkJIm13YXZlZGQ6bXdhdmVfaW5pdDogRXJyb3I6IgorCQkJCQkiIEZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZmlsZSAlc1xuIiwKKwkJCQkJbXdhdmVfZGV2X2F0dHJzW2ldLT5hdHRyLm5hbWUpOworCQkJZ290byBjbGVhbnVwX2Vycm9yOworCQl9CisJCXBEcnZEYXRhLT5ucl9yZWdpc3RlcmVkX2F0dHJzKys7CisJfQorI2VuZGlmCisKKwkvKiBTVUNDRVNTISAqLworCXJldHVybiAwOworCitjbGVhbnVwX2Vycm9yOgorCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJIm13YXZlZGQ6Om13YXZlX2luaXQ6IEVycm9yOiIKKwkJCSIgRmFpbGVkIHRvIGluaXRpYWxpemVcbiIpOworCW13YXZlX2V4aXQoKTsgLyogY2xlYW4gdXAgKi8KKworCXJldHVybiAtRUlPOworfQorCittb2R1bGVfaW5pdChtd2F2ZV9pbml0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuaCBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjYTYxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisqCisqIG13YXZlZGQuaCAtLSBkZWNsYXJhdGlvbnMgZm9yIG13YXZlIGRldmljZSBkcml2ZXIKKyoKKyoKKyogV3JpdHRlbiBCeTogTWlrZSBTdWxsaXZhbiBJQk0gQ29ycG9yYXRpb24KKyoKKyogQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBOTyBXQVJSQU5UWQorKiBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKKyogQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQKKyogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisqIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworKiBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyogdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKKyogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisqCisqIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisqIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUworKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqCisqCisqIDEwLzIzLzIwMDAgLSBBbHBoYSBSZWxlYXNlCisqCUZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworKi8KKworI2lmbmRlZiBfTElOVVhfTVdBVkVERF9ICisjZGVmaW5lIF9MSU5VWF9NV0FWRUREX0gKKyNpbmNsdWRlICIzNzgwaS5oIgorI2luY2x1ZGUgInRwMzc4MGkuaCIKKyNpbmNsdWRlICJzbWFwaS5oIgorI2luY2x1ZGUgIm13YXZlcHViLmgiCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworZXh0ZXJuIGludCBtd2F2ZV9kZWJ1ZzsKK2V4dGVybiBpbnQgbXdhdmVfMzc4MGlfaXJxOworZXh0ZXJuIGludCBtd2F2ZV8zNzgwaV9pbzsKK2V4dGVybiBpbnQgbXdhdmVfdWFydF9pcnE7CitleHRlcm4gaW50IG13YXZlX3VhcnRfaW87CisKKyNkZWZpbmUgUFJJTlRLX0VSUk9SIHByaW50aworI2RlZmluZSBLRVJOX0VSUl9NV0FWRSBLRVJOX0VSUiAibXdhdmU6ICIKKworI2RlZmluZSBUUkFDRV9NV0FWRSAgICAgMHgwMDAxCisjZGVmaW5lIFRSQUNFX1NNQVBJICAgICAweDAwMDIKKyNkZWZpbmUgVFJBQ0VfMzc4MEkgICAgIDB4MDAwNAorI2RlZmluZSBUUkFDRV9UUDM3ODBJICAgMHgwMDA4CisKKyNpZmRlZiBNV19UUkFDRQorI2RlZmluZSBQUklOVEtfMShmLHMpICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChmICYgKG13YXZlX2RlYnVnKSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgUFJJTlRLXzIoZixzLHYxKSAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZiAmIChtd2F2ZV9kZWJ1ZykpIHsgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKHMsdjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIFBSSU5US18zKGYscyx2MSx2MikgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGYgJiAobXdhdmVfZGVidWcpKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50ayhzLHYxLHYyKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBQUklOVEtfNChmLHMsdjEsdjIsdjMpICAgICAgICAgICAgICBcCisgIGlmIChmICYgKG13YXZlX2RlYnVnKSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsocyx2MSx2Mix2Myk7ICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgUFJJTlRLXzUoZixzLHYxLHYyLHYzLHY0KSAgICAgICAgICAgXAorICBpZiAoZiAmIChtd2F2ZV9kZWJ1ZykpIHsgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKHMsdjEsdjIsdjMsdjQpOyAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIFBSSU5US182KGYscyx2MSx2Mix2Myx2NCx2NSkgICAgICAgIFwKKyAgaWYgKGYgJiAobXdhdmVfZGVidWcpKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50ayhzLHYxLHYyLHYzLHY0LHY1KTsgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBQUklOVEtfNyhmLHMsdjEsdjIsdjMsdjQsdjUsdjYpICAgICBcCisgIGlmIChmICYgKG13YXZlX2RlYnVnKSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsocyx2MSx2Mix2Myx2NCx2NSx2Nik7ICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgUFJJTlRLXzgoZixzLHYxLHYyLHYzLHY0LHY1LHY2LHY3KSAgXAorICBpZiAoZiAmIChtd2F2ZV9kZWJ1ZykpIHsgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKHMsdjEsdjIsdjMsdjQsdjUsdjYsdjcpOyAgICAgICAgIFwKKyAgfQorCisjZWxzZQorI2RlZmluZSBQUklOVEtfMShmLHMpCisjZGVmaW5lIFBSSU5US18yKGYscyx2MSkKKyNkZWZpbmUgUFJJTlRLXzMoZixzLHYxLHYyKQorI2RlZmluZSBQUklOVEtfNChmLHMsdjEsdjIsdjMpCisjZGVmaW5lIFBSSU5US181KGYscyx2MSx2Mix2Myx2NCkKKyNkZWZpbmUgUFJJTlRLXzYoZixzLHYxLHYyLHYzLHY0LHY1KQorI2RlZmluZSBQUklOVEtfNyhmLHMsdjEsdjIsdjMsdjQsdjUsdjYpCisjZGVmaW5lIFBSSU5US184KGYscyx2MSx2Mix2Myx2NCx2NSx2Nix2NykKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IF9NV0FWRV9JUEMgeworCXVuc2lnbmVkIHNob3J0IHVzSW50Q291bnQ7CS8qIDA9bm9uZSwgMT1maXJzdCwgMj1ncmVhdGVyIHRoYW4gMXN0ICovCisJQk9PTEVBTiBiSXNFbmFibGVkOworCUJPT0xFQU4gYklzSGVyZTsKKwkvKiBlbnRyeSBzcGluIGxvY2sgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBpcGNfd2FpdF9xdWV1ZTsKK30gTVdBVkVfSVBDOworCit0eXBlZGVmIHN0cnVjdCBfTVdBVkVfREVWSUNFX0RBVEEgeworCVRISU5LUEFEX0JEX0RBVEEgckJERGF0YTsJLyogYm9hcmQgZHJpdmVyJ3MgZGF0YSBhcmVhICovCisJdW5zaWduZWQgbG9uZyB1bElQQ1NvdXJjZV9JU1I7CS8qIElQQyBzb3VyY2UgYml0cyBmb3IgcmVjZW50bHkgcHJvY2Vzc2VkIGludHIsIHNldCBkdXJpbmcgSVNSIHByb2Nlc3NpbmcgKi8KKwl1bnNpZ25lZCBsb25nIHVsSVBDU291cmNlX0RQQzsJLyogSVBDIHNvdXJjZSBiaXRzIGZvciByZWNlbnRseSBwcm9jZXNzZWQgaW50ciwgc2V0IGR1cmluZyBEUEMgcHJvY2Vzc2luZyAqLworCUJPT0xFQU4gYkJESW5pdGlhbGl6ZWQ7CisJQk9PTEVBTiBiUmVzb3VyY2VzQ2xhaW1lZDsKKwlCT09MRUFOIGJEU1BFbmFibGVkOworCUJPT0xFQU4gYkRTUFJlc2V0OworCU1XQVZFX0lQQyBJUENzWzE2XTsKKwlCT09MRUFOIGJNd2F2ZURldlJlZ2lzdGVyZWQ7CisJc2hvcnQgc0xpbmU7CisJaW50IG5yX3JlZ2lzdGVyZWRfYXR0cnM7CisJaW50IGRldmljZV9yZWdpc3RlcmVkOworCit9IE1XQVZFX0RFVklDRV9EQVRBLCAqcE1XQVZFX0RFVklDRV9EQVRBOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZXB1Yi5oIGIvZHJpdmVycy9jaGFyL213YXZlL213YXZlcHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmOWRhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZXB1Yi5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisqCisqIG13YXZlcHViLmggLS0gUFVCTElDIGRlY2xhcmF0aW9ucyBmb3IgdGhlIG13YXZlIGRyaXZlcgorKiAgICAgICAgICAgICAgIGFuZCBhcHBsaWNhdGlvbnMgdXNpbmcgaXQKKyoKKyoKKyogV3JpdHRlbiBCeTogTWlrZSBTdWxsaXZhbiBJQk0gQ29ycG9yYXRpb24KKyoKKyogQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBOTyBXQVJSQU5UWQorKiBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKKyogQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQKKyogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisqIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworKiBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyogdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKKyogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisqCisqIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisqIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUworKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqCisqCisqIDEwLzIzLzIwMDAgLSBBbHBoYSBSZWxlYXNlCisqCUZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworKi8KKworI2lmbmRlZiBfTElOVVhfTVdBVkVQVUJfSAorI2RlZmluZSBfTElOVVhfTVdBVkVQVUJfSAorCisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorCisKK3R5cGVkZWYgc3RydWN0IF9NV19BQklMSVRJRVMgeworCXVuc2lnbmVkIGxvbmcgaW5zdHJfcGVyX3NlYzsKKwl1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGluc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGJ1c19kbWFfYnc7CisJdW5zaWduZWQgc2hvcnQgdWFydF9lbmFibGU7CisJc2hvcnQgY29tcG9uZW50X2NvdW50OworCXVuc2lnbmVkIGxvbmcgY29tcG9uZW50X2xpc3RbN107CisJY2hhciBtd2F2ZV9vc19uYW1lWzE2XTsKKwljaGFyIGJpb3NfdGFza19uYW1lWzE2XTsKK30gTVdfQUJJTElUSUVTLCAqcE1XX0FCSUxJVElFUzsKKworCit0eXBlZGVmIHN0cnVjdCBfTVdfUkVBRFdSSVRFIHsKKwl1bnNpZ25lZCBzaG9ydCB1c0RzcEFkZHJlc3M7CS8qIFRoZSBkc3AgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcgdWxEYXRhTGVuZ3RoOwkvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZGF0YSBvciB1c2VyIGJ1ZmZlciAqLworCXZvaWQgKnBCdWY7CQkvKiBJbnB1dDp2YXJpYWJsZSBzaXplZCBidWZmZXIgKi8KK30gTVdfUkVBRFdSSVRFLCAqcE1XX1JFQURXUklURTsKKworI2RlZmluZSBJT0NUTF9NV19SRVNFVCAgICAgICAgICAgX0lPKE1XQVZFX01JTk9SLDEpCisjZGVmaW5lIElPQ1RMX01XX1JVTiAgICAgICAgICAgICBfSU8oTVdBVkVfTUlOT1IsMikKKyNkZWZpbmUgSU9DVExfTVdfRFNQX0FCSUxJVElFUyAgIF9JT1IoTVdBVkVfTUlOT1IsMyxNV19BQklMSVRJRVMpCisjZGVmaW5lIElPQ1RMX01XX1JFQURfREFUQSAgICAgICBfSU9SKE1XQVZFX01JTk9SLDQsTVdfUkVBRFdSSVRFKQorI2RlZmluZSBJT0NUTF9NV19SRUFEQ0xFQVJfREFUQSAgX0lPUihNV0FWRV9NSU5PUiw1LE1XX1JFQURXUklURSkKKyNkZWZpbmUgSU9DVExfTVdfUkVBRF9JTlNUICAgICAgIF9JT1IoTVdBVkVfTUlOT1IsNixNV19SRUFEV1JJVEUpCisjZGVmaW5lIElPQ1RMX01XX1dSSVRFX0RBVEEgICAgICBfSU9XKE1XQVZFX01JTk9SLDcsTVdfUkVBRFdSSVRFKQorI2RlZmluZSBJT0NUTF9NV19XUklURV9JTlNUICAgICAgX0lPVyhNV0FWRV9NSU5PUiw4LE1XX1JFQURXUklURSkKKyNkZWZpbmUgSU9DVExfTVdfUkVHSVNURVJfSVBDICAgIF9JT1coTVdBVkVfTUlOT1IsOSxpbnQpCisjZGVmaW5lIElPQ1RMX01XX1VOUkVHSVNURVJfSVBDICBfSU9XKE1XQVZFX01JTk9SLDEwLGludCkKKyNkZWZpbmUgSU9DVExfTVdfR0VUX0lQQyAgICAgICAgIF9JT1coTVdBVkVfTUlOT1IsMTEsaW50KQorI2RlZmluZSBJT0NUTF9NV19UUkFDRSAgICAgICAgICAgX0lPUihNV0FWRV9NSU5PUiwxMixNV19SRUFEV1JJVEUpCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODdmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuYwpAQCAtMCwwICsxLDU3MCBAQAorLyoKKyoKKyogc21hcGkuYyAtLSBTTUFQSSBpbnRlcmZhY2Ugcm91dGluZXMKKyoKKyoKKyogV3JpdHRlbiBCeTogTWlrZSBTdWxsaXZhbiBJQk0gQ29ycG9yYXRpb24KKyoKKyogQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBOTyBXQVJSQU5UWQorKiBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKKyogQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQKKyogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisqIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworKiBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyogdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKKyogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisqCisqIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisqIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUworKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqCisqCisqIDEwLzIzLzIwMDAgLSBBbHBoYSBSZWxlYXNlCisqCUZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CS8qIENNT1MgZGVmaW5lcyAqLworI2luY2x1ZGUgInNtYXBpLmgiCisjaW5jbHVkZSAibXdhdmVkZC5oIgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZ191c1NtYXBpUG9ydCA9IDA7CisKKworc3RhdGljIGludCBzbWFwaV9yZXF1ZXN0KHVuc2lnbmVkIHNob3J0IGluQlgsIHVuc2lnbmVkIHNob3J0IGluQ1gsCisJCQkgdW5zaWduZWQgc2hvcnQgaW5ESSwgdW5zaWduZWQgc2hvcnQgaW5TSSwKKwkJCSB1bnNpZ25lZCBzaG9ydCAqb3V0QVgsIHVuc2lnbmVkIHNob3J0ICpvdXRCWCwKKwkJCSB1bnNpZ25lZCBzaG9ydCAqb3V0Q1gsIHVuc2lnbmVkIHNob3J0ICpvdXREWCwKKwkJCSB1bnNpZ25lZCBzaG9ydCAqb3V0REksIHVuc2lnbmVkIHNob3J0ICpvdXRTSSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBteW91dEFYID0gMiwgKnBteW91dEFYID0gJm15b3V0QVg7CisJdW5zaWduZWQgc2hvcnQgbXlvdXRCWCA9IDMsICpwbXlvdXRCWCA9ICZteW91dEJYOworCXVuc2lnbmVkIHNob3J0IG15b3V0Q1ggPSA0LCAqcG15b3V0Q1ggPSAmbXlvdXRDWDsKKwl1bnNpZ25lZCBzaG9ydCBteW91dERYID0gNSwgKnBteW91dERYID0gJm15b3V0RFg7CisJdW5zaWduZWQgc2hvcnQgbXlvdXRESSA9IDYsICpwbXlvdXRESSA9ICZteW91dERJOworCXVuc2lnbmVkIHNob3J0IG15b3V0U0kgPSA3LCAqcG15b3V0U0kgPSAmbXlvdXRTSTsKKwl1bnNpZ25lZCBzaG9ydCB1c1NtYXBpT0sgPSAtRUlPLCAqcHVzU21hcGlPSyA9ICZ1c1NtYXBpT0s7CisJdW5zaWduZWQgaW50IGluQlhDWCA9IChpbkJYIDw8IDE2KSB8IGluQ1g7CisJdW5zaWduZWQgaW50IGluRElTSSA9IChpbkRJIDw8IDE2KSB8IGluU0k7CisJaW50IHJldHZhbCA9IDA7CisKKwlQUklOVEtfNShUUkFDRV9TTUFQSSwgImluQlggJXggaW5DWCAleCBpbkRJICV4IGluU0kgJXhcbiIsCisJCWluQlgsIGluQ1gsIGluREksIGluU0kpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdncgICQweDUzODAsJSVheFxuXHQiCisJCQkgICAgIm1vdmwgICU3LCUlZWJ4XG5cdCIKKwkJCSAgICAic2hybCAgJDE2LCAlJWVieFxuXHQiCisJCQkgICAgIm1vdncgICU3LCUlY3hcblx0IgorCQkJICAgICJtb3ZsICAlOCwlJWVkaVxuXHQiCisJCQkgICAgInNocmwgICQxNiwlJWVkaVxuXHQiCisJCQkgICAgIm1vdncgICU4LCUlc2lcblx0IgorCQkJICAgICJtb3Z3ICAlOSwlJWR4XG5cdCIKKwkJCSAgICAib3V0ICAgJSVhbCwlJWR4XG5cdCIKKwkJCSAgICAib3V0ICAgJSVhbCwkMHg0RlxuXHQiCisJCQkgICAgImNtcGIgICQweDUzLCUlYWhcblx0IgorCQkJICAgICJqZSAgICAyZlxuXHQiCisJCQkgICAgIjE6XG5cdCIKKwkJCSAgICAib3JiICAgJSVhaCwlJWFoXG5cdCIKKwkJCSAgICAiam56ICAgMmZcblx0IgorCQkJICAgICJtb3Z3ICAlJWF4LCUwXG5cdCIKKwkJCSAgICAibW92dyAgJSVieCwlMVxuXHQiCisJCQkgICAgIm1vdncgICUlY3gsJTJcblx0IgorCQkJICAgICJtb3Z3ICAlJWR4LCUzXG5cdCIKKwkJCSAgICAibW92dyAgJSVkaSwlNFxuXHQiCisJCQkgICAgIm1vdncgICUlc2ksJTVcblx0IgorCQkJICAgICJtb3Z3ICAkMSwlNlxuXHQiCisJCQkgICAgIjI6XG5cdCI6Ij1tIigqKHVuc2lnbmVkIHNob3J0ICopIHBteW91dEFYKSwKKwkJCSAgICAiPW0iKCoodW5zaWduZWQgc2hvcnQgKikgcG15b3V0QlgpLAorCQkJICAgICI9bSIoKih1bnNpZ25lZCBzaG9ydCAqKSBwbXlvdXRDWCksCisJCQkgICAgIj1tIigqKHVuc2lnbmVkIHNob3J0ICopIHBteW91dERYKSwKKwkJCSAgICAiPW0iKCoodW5zaWduZWQgc2hvcnQgKikgcG15b3V0REkpLAorCQkJICAgICI9bSIoKih1bnNpZ25lZCBzaG9ydCAqKSBwbXlvdXRTSSksCisJCQkgICAgIj1tIigqKHVuc2lnbmVkIHNob3J0ICopIHB1c1NtYXBpT0spCisJCQkgICAgOiJtIihpbkJYQ1gpLCAibSIoaW5ESVNJKSwgIm0iKGdfdXNTbWFwaVBvcnQpCisJCQkgICAgOiIlZWF4IiwgIiVlYngiLCAiJWVjeCIsICIlZWR4IiwgIiVlZGkiLAorCQkJICAgICIlZXNpIik7CisKKwlQUklOVEtfOChUUkFDRV9TTUFQSSwKKwkJIm15b3V0QVggJXggbXlvdXRCWCAleCBteW91dENYICV4IG15b3V0RFggJXggbXlvdXRESSAleCBteW91dFNJICV4IHVzU21hcGlPSyAleFxuIiwKKwkJbXlvdXRBWCwgbXlvdXRCWCwgbXlvdXRDWCwgbXlvdXREWCwgbXlvdXRESSwgbXlvdXRTSSwKKwkJdXNTbWFwaU9LKTsKKwkqb3V0QVggPSBteW91dEFYOworCSpvdXRCWCA9IG15b3V0Qlg7CisJKm91dENYID0gbXlvdXRDWDsKKwkqb3V0RFggPSBteW91dERYOworCSpvdXRESSA9IG15b3V0REk7CisJKm91dFNJID0gbXlvdXRTSTsKKworCXJldHZhbCA9ICh1c1NtYXBpT0sgPT0gMSkgPyAwIDogLUVJTzsKKwlQUklOVEtfMihUUkFDRV9TTUFQSSwgInNtYXBpOjpzbWFwaV9yZXF1ZXN0IGV4aXQgcmV0dmFsICV4XG4iLCByZXR2YWwpOworCXJldHVybiByZXR2YWw7Cit9CisKKworaW50IHNtYXBpX3F1ZXJ5X0RTUF9jZmcoU01BUElfRFNQX1NFVFRJTkdTICogcFNldHRpbmdzKQoreworCWludCBiUkMgPSAtRUlPOworCXVuc2lnbmVkIHNob3J0IHVzQVgsIHVzQlgsIHVzQ1gsIHVzRFgsIHVzREksIHVzU0k7CisJdW5zaWduZWQgc2hvcnQgYXVzRHNwQmFzZXNbXSA9IHsgMHgwMDMwLCAweDRFMzAsIDB4OEUzMCwgMHhDRTMwLCAweDAxMzAsIDB4MDM1MCwgMHgwMDcwLCAweDBEQjAgfTsKKwl1bnNpZ25lZCBzaG9ydCBhdXNVYXJ0QmFzZXNbXSA9IHsgMHgwM0Y4LCAweDAyRjgsIDB4MDNFOCwgMHgwMkU4IH07CisJdW5zaWduZWQgc2hvcnQgbnVtRHNwQmFzZXMgPSA4OworCXVuc2lnbmVkIHNob3J0IG51bVVhcnRCYXNlcyA9IDQ7CisKKwlQUklOVEtfMShUUkFDRV9TTUFQSSwgInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnIGVudHJ5XG4iKTsKKworCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxODAyLCAweDAwMDAsIDAsIDAsCisJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCWlmIChiUkMpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZzogRXJyb3I6IENvdWxkIG5vdCBnZXQgRFNQIFNldHRpbmdzLiBBYm9ydGluZy5cbiIpOworCQlyZXR1cm4gYlJDOworCX0KKworCVBSSU5US18xKFRSQUNFX1NNQVBJLCAic21hcGk6OnNtYXBpX3F1ZXJ5X0RTUF9jZmcsIHNtYXBpX3JlcXVlc3QgT0tcbiIpOworCisJcFNldHRpbmdzLT5iRFNQUHJlc2VudCA9ICgodXNCWCAmIDB4MDEwMCkgIT0gMCk7CisJcFNldHRpbmdzLT5iRFNQRW5hYmxlZCA9ICgodXNDWCAmIDB4MDAwMSkgIT0gMCk7CisJcFNldHRpbmdzLT51c0RzcElSUSA9IHVzU0kgJiAweDAwRkY7CisJcFNldHRpbmdzLT51c0RzcERNQSA9ICh1c1NJICYgMHhGRjAwKSA+PiA4OworCWlmICgodXNESSAmIDB4MDBGRikgPCBudW1Ec3BCYXNlcykgeworCQlwU2V0dGluZ3MtPnVzRHNwQmFzZUlPID0gYXVzRHNwQmFzZXNbdXNESSAmIDB4MDBGRl07CisJfSBlbHNlIHsKKwkJcFNldHRpbmdzLT51c0RzcEJhc2VJTyA9IDA7CisJfQorCVBSSU5US182KFRSQUNFX1NNQVBJLAorCQkic21hcGk6OnNtYXBpX3F1ZXJ5X0RTUF9jZmcgZ2V0IERTUCBTZXR0aW5ncyBiRFNQUHJlc2VudCAleCBiRFNQRW5hYmxlZCAleCB1c0RzcElSUSAleCB1c0RzcERNQSAleCB1c0RzcEJhc2VJTyAleFxuIiwKKwkJcFNldHRpbmdzLT5iRFNQUHJlc2VudCwgcFNldHRpbmdzLT5iRFNQRW5hYmxlZCwKKwkJcFNldHRpbmdzLT51c0RzcElSUSwgcFNldHRpbmdzLT51c0RzcERNQSwKKwkJcFNldHRpbmdzLT51c0RzcEJhc2VJTyk7CisKKwkvKiBjaGVjayBmb3IgaWxsZWdhbCB2YWx1ZXMgKi8KKwlpZiAoIHBTZXR0aW5ncy0+dXNEc3BCYXNlSU8gPT0gMCApIAorCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnOiBXb3JyeTogRFNQIGJhc2UgSS9PIGFkZHJlc3MgaXMgMFxuIik7CisJaWYgKCBwU2V0dGluZ3MtPnVzRHNwSVJRID09IDAgKQorCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnOiBXb3JyeTogRFNQIElSUSBsaW5lIGlzIDBcbiIpOworCisJYlJDID0gc21hcGlfcmVxdWVzdCgweDE4MDQsIDB4MDAwMCwgMCwgMCwKKwkgICAJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJaWYgKGJSQykgeworCQlQUklOVEtfRVJST1IoInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnOiBFcnJvcjogQ291bGQgbm90IGdldCBEU1AgbW9kZW0gc2V0dGluZ3MuIEFib3J0aW5nLlxuIik7CisJCXJldHVybiBiUkM7CisJfSAKKworCVBSSU5US18xKFRSQUNFX1NNQVBJLCAic21hcGk6OnNtYXBpX3F1ZXJ5X0RTUF9jZmcsIHNtYXBpX3JlcXVlc3QgT0tcbiIpOworCisJcFNldHRpbmdzLT5iTW9kZW1FbmFibGVkID0gKCh1c0NYICYgMHgwMDAxKSAhPSAwKTsKKwlwU2V0dGluZ3MtPnVzVWFydElSUSA9IHVzU0kgJiAweDAwMEY7CisJaWYgKCgodXNTSSAmIDB4RkYwMCkgPj4gOCkgPCBudW1VYXJ0QmFzZXMpIHsKKwkJcFNldHRpbmdzLT51c1VhcnRCYXNlSU8gPSBhdXNVYXJ0QmFzZXNbKHVzU0kgJiAweEZGMDApID4+IDhdOworCX0gZWxzZSB7CisJCXBTZXR0aW5ncy0+dXNVYXJ0QmFzZUlPID0gMDsKKwl9CisKKwlQUklOVEtfNChUUkFDRV9TTUFQSSwKKwkJInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnIGdldCBEU1AgbW9kZW0gc2V0dGluZ3MgYk1vZGVtRW5hYmxlZCAleCB1c1VhcnRJUlEgJXggdXNVYXJ0QmFzZUlPICV4XG4iLAorCQlwU2V0dGluZ3MtPmJNb2RlbUVuYWJsZWQsCisJCXBTZXR0aW5ncy0+dXNVYXJ0SVJRLAorCQlwU2V0dGluZ3MtPnVzVWFydEJhc2VJTyk7CisKKwkvKiBjaGVjayBmb3IgaWxsZWdhbCB2YWx1ZXMgKi8KKwlpZiAoIHBTZXR0aW5ncy0+dXNVYXJ0QmFzZUlPID09IDAgKSAKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZzogV29ycnk6IFVBUlQgYmFzZSBJL08gYWRkcmVzcyBpcyAwXG4iKTsKKwlpZiAoIHBTZXR0aW5ncy0+dXNVYXJ0SVJRID09IDAgKQorCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnOiBXb3JyeTogVUFSVCBJUlEgbGluZSBpcyAwXG4iKTsKKworCVBSSU5US18yKFRSQUNFX1NNQVBJLCAic21hcGk6OnNtYXBpX3F1ZXJ5X0RTUF9jZmcgZXhpdCBiUkMgJXhcbiIsIGJSQyk7CisKKwlyZXR1cm4gYlJDOworfQorCisKK2ludCBzbWFwaV9zZXRfRFNQX2NmZyh2b2lkKQoreworCWludCBiUkMgPSAtRUlPOworCWludCBpOworCXVuc2lnbmVkIHNob3J0IHVzQVgsIHVzQlgsIHVzQ1gsIHVzRFgsIHVzREksIHVzU0k7CisJdW5zaWduZWQgc2hvcnQgYXVzRHNwQmFzZXNbXSA9IHsgMHgwMDMwLCAweDRFMzAsIDB4OEUzMCwgMHhDRTMwLCAweDAxMzAsIDB4MDM1MCwgMHgwMDcwLCAweDBEQjAgfTsKKwl1bnNpZ25lZCBzaG9ydCBhdXNVYXJ0QmFzZXNbXSA9IHsgMHgwM0Y4LCAweDAyRjgsIDB4MDNFOCwgMHgwMkU4IH07CisJdW5zaWduZWQgc2hvcnQgYXVzRHNwSXJxc1tdID0geyA1LCA3LCAxMCwgMTEsIDE1IH07CisJdW5zaWduZWQgc2hvcnQgYXVzVWFydElycXNbXSA9IHsgMywgNCB9OworCisJdW5zaWduZWQgc2hvcnQgbnVtRHNwQmFzZXMgPSA4OworCXVuc2lnbmVkIHNob3J0IG51bVVhcnRCYXNlcyA9IDQ7CisJdW5zaWduZWQgc2hvcnQgbnVtRHNwSXJxcyA9IDU7CisJdW5zaWduZWQgc2hvcnQgbnVtVWFydElycXMgPSAyOworCXVuc2lnbmVkIHNob3J0IGRzcGlvX2luZGV4ID0gMCwgdWFydGlvX2luZGV4ID0gMDsKKworCVBSSU5US181KFRSQUNFX1NNQVBJLAorCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnIGVudHJ5IG13YXZlXzM3ODBpX2lycSAleCBtd2F2ZV8zNzgwaV9pbyAleCBtd2F2ZV91YXJ0X2lycSAleCBtd2F2ZV91YXJ0X2lvICV4XG4iLAorCQltd2F2ZV8zNzgwaV9pcnEsIG13YXZlXzM3ODBpX2lvLCBtd2F2ZV91YXJ0X2lycSwgbXdhdmVfdWFydF9pbyk7CisKKwlpZiAobXdhdmVfMzc4MGlfaW8pIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bURzcEJhc2VzOyBpKyspIHsKKwkJCWlmIChtd2F2ZV8zNzgwaV9pbyA9PSBhdXNEc3BCYXNlc1tpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSBudW1Ec3BCYXNlcykgeworCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IEVycm9yOiBJbnZhbGlkIG13YXZlXzM3ODBpX2lvIGFkZHJlc3MgJXguIEFib3J0aW5nLlxuIiwgbXdhdmVfMzc4MGlfaW8pOworCQkJcmV0dXJuIGJSQzsKKwkJfQorCQlkc3Bpb19pbmRleCA9IGk7CisJfQorCisJaWYgKG13YXZlXzM3ODBpX2lycSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtRHNwSXJxczsgaSsrKSB7CisJCQlpZiAobXdhdmVfMzc4MGlfaXJxID09IGF1c0RzcElycXNbaV0pCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gbnVtRHNwSXJxcykgeworCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IEVycm9yOiBJbnZhbGlkIG13YXZlXzM3ODBpX2lycSAleC4gQWJvcnRpbmcuXG4iLCBtd2F2ZV8zNzgwaV9pcnEpOworCQkJcmV0dXJuIGJSQzsKKwkJfQorCX0KKworCWlmIChtd2F2ZV91YXJ0X2lvKSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1VYXJ0QmFzZXM7IGkrKykgeworCQkJaWYgKG13YXZlX3VhcnRfaW8gPT0gYXVzVWFydEJhc2VzW2ldKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpID09IG51bVVhcnRCYXNlcykgeworCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IEVycm9yOiBJbnZhbGlkIG13YXZlX3VhcnRfaW8gYWRkcmVzcyAleC4gQWJvcnRpbmcuXG4iLCBtd2F2ZV91YXJ0X2lvKTsKKwkJCXJldHVybiBiUkM7CisJCX0KKwkJdWFydGlvX2luZGV4ID0gaTsKKwl9CisKKworCWlmIChtd2F2ZV91YXJ0X2lycSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtVWFydElycXM7IGkrKykgeworCQkJaWYgKG13YXZlX3VhcnRfaXJxID09IGF1c1VhcnRJcnFzW2ldKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpID09IG51bVVhcnRJcnFzKSB7CisJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZzogRXJyb3I6IEludmFsaWQgbXdhdmVfdWFydF9pcnEgJXguIEFib3J0aW5nLlxuIiwgbXdhdmVfdWFydF9pcnEpOworCQkJcmV0dXJuIGJSQzsKKwkJfQorCX0KKworCWlmIChtd2F2ZV91YXJ0X2lycSB8fCBtd2F2ZV91YXJ0X2lvKSB7CisKKwkJLyogQ2hlY2sgc2VyaWFsIHBvcnQgQSAqLworCQliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTQwMiwgMHgwMDAwLCAwLCAwLAorCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCQkvKiBiUkMgPT0gMCAqLworCQlpZiAodXNCWCAmIDB4MDEwMCkgewkvKiBzZXJpYWwgcG9ydCBBIGlzIHByZXNlbnQgKi8KKwkJCWlmICh1c0NYICYgMSkgewkvKiBzZXJpYWwgcG9ydCBpcyBlbmFibGVkICovCisJCQkJaWYgKCh1c1NJICYgMHhGRikgPT0gbXdhdmVfdWFydF9pcnEpIHsKKyNpZm5kZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBTZXJpYWwgcG9ydCBBIGlycSAleCBjb25mbGljdHMgd2l0aCBtd2F2ZV91YXJ0X2lycSAleFxuIiwgdXNTSSAmIDB4RkYsIG13YXZlX3VhcnRfaXJxKTsKKyNlbHNlCisJCQkJCVBSSU5US18zKFRSQUNFX1NNQVBJLAorCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZzogU2VyaWFsIHBvcnQgQSBpcnEgJXggY29uZmxpY3RzIHdpdGggbXdhdmVfdWFydF9pcnEgJXhcbiIsIHVzU0kgJiAweEZGLCBtd2F2ZV91YXJ0X2lycSk7CisjZW5kaWYKKyNpZmRlZiBNV0FWRV9GVVRaX1dJVEhfT1RIRVJfREVWSUNFUworCQkJCQlQUklOVEtfMShUUkFDRV9TTUFQSSwKKwkJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmcgRGlzYWJsaW5nIGNvbmZsaWN0aW5nIHNlcmlhbCBwb3J0XG4iKTsKKwkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE0MDMsIDB4MDEwMCwgMCwgdXNTSSwKKwkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKwkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE0MDIsIDB4MDAwMCwgMCwgMCwKKwkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKyNlbHNlCisJCQkJCWdvdG8gZXhpdF9jb25mbGljdDsKKyNlbmRpZgorCQkJCX0gZWxzZSB7CisJCQkJCWlmICgodXNTSSA+PiA4KSA9PSB1YXJ0aW9faW5kZXgpIHsKKyNpZm5kZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IFNlcmlhbCBwb3J0IEEgYmFzZSBJL08gYWRkcmVzcyAleCBjb25mbGljdHMgd2l0aCBtd2F2ZSB1YXJ0IEkvTyAleFxuIiwgYXVzVWFydEJhc2VzW3VzU0kgPj4gOF0sIGF1c1VhcnRCYXNlc1t1YXJ0aW9faW5kZXhdKTsKKyNlbHNlCisJCQkJCQlQUklOVEtfMyhUUkFDRV9TTUFQSSwKKwkJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBTZXJpYWwgcG9ydCBBIGJhc2UgSS9PIGFkZHJlc3MgJXggY29uZmxpY3RzIHdpdGggbXdhdmUgdWFydCBJL08gJXhcbiIsIGF1c1VhcnRCYXNlc1t1c1NJID4+IDhdLCBhdXNVYXJ0QmFzZXNbdWFydGlvX2luZGV4XSk7CisjZW5kaWYKKyNpZmRlZiBNV0FWRV9GVVRaX1dJVEhfT1RIRVJfREVWSUNFUworCQkJCQkJUFJJTlRLXzEoVFJBQ0VfU01BUEksCisJCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZyBEaXNhYmxpbmcgY29uZmxpY3Rpbmcgc2VyaWFsIHBvcnQgQVxuIik7CisJCQkJCQliUkMgPSBzbWFwaV9yZXF1ZXN0ICgweDE0MDMsIDB4MDEwMCwgMCwgdXNTSSwKKwkJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCQkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCAoMHgxNDAyLCAweDAwMDAsIDAsIDAsCisJCQkJCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCQkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKyNlbHNlCisJCQkJCQlnb3RvIGV4aXRfY29uZmxpY3Q7CisjZW5kaWYKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIENoZWNrIHNlcmlhbCBwb3J0IEIgKi8KKwkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE0MDQsIDB4MDAwMCwgMCwgMCwKKwkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKwkJLyogYlJDID09IDAgKi8KKwkJaWYgKHVzQlggJiAweDAxMDApIHsJLyogc2VyaWFsIHBvcnQgQiBpcyBwcmVzZW50ICovCisJCQlpZiAodXNDWCAmIDEpIHsJLyogc2VyaWFsIHBvcnQgaXMgZW5hYmxlZCAqLworCQkJCWlmICgodXNTSSAmIDB4RkYpID09IG13YXZlX3VhcnRfaXJxKSB7CisjaWZuZGVmIE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisJCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZzogU2VyaWFsIHBvcnQgQiBpcnEgJXggY29uZmxpY3RzIHdpdGggbXdhdmVfdWFydF9pcnEgJXhcbiIsIHVzU0kgJiAweEZGLCBtd2F2ZV91YXJ0X2lycSk7CisjZWxzZQorCQkJCQlQUklOVEtfMyhUUkFDRV9TTUFQSSwKKwkJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IFNlcmlhbCBwb3J0IEIgaXJxICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlX3VhcnRfaXJxICV4XG4iLCB1c1NJICYgMHhGRiwgbXdhdmVfdWFydF9pcnEpOworI2VuZGlmCisjaWZkZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQkJUFJJTlRLXzEoVFJBQ0VfU01BUEksCisJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnIERpc2FibGluZyBjb25mbGljdGluZyBzZXJpYWwgcG9ydCBCXG4iKTsKKwkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE0MDUsIDB4MDEwMCwgMCwgdXNTSSwKKwkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKwkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE0MDQsIDB4MDAwMCwgMCwgMCwKKwkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKyNlbHNlCisJCQkJCWdvdG8gZXhpdF9jb25mbGljdDsKKyNlbmRpZgorCQkJCX0gZWxzZSB7CisJCQkJCWlmICgodXNTSSA+PiA4KSA9PSB1YXJ0aW9faW5kZXgpIHsKKyNpZm5kZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IFNlcmlhbCBwb3J0IEIgYmFzZSBJL08gYWRkcmVzcyAleCBjb25mbGljdHMgd2l0aCBtd2F2ZSB1YXJ0IEkvTyAleFxuIiwgYXVzVWFydEJhc2VzW3VzU0kgPj4gOF0sIGF1c1VhcnRCYXNlc1t1YXJ0aW9faW5kZXhdKTsKKyNlbHNlCisJCQkJCQlQUklOVEtfMyhUUkFDRV9TTUFQSSwKKwkJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBTZXJpYWwgcG9ydCBCIGJhc2UgSS9PIGFkZHJlc3MgJXggY29uZmxpY3RzIHdpdGggbXdhdmUgdWFydCBJL08gJXhcbiIsIGF1c1VhcnRCYXNlc1t1c1NJID4+IDhdLCBhdXNVYXJ0QmFzZXNbdWFydGlvX2luZGV4XSk7CisjZW5kaWYKKyNpZmRlZiBNV0FWRV9GVVRaX1dJVEhfT1RIRVJfREVWSUNFUworCQkJCQkJUFJJTlRLXzEgKFRSQUNFX1NNQVBJLAorCQkJCQkJICAgICJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmcgRGlzYWJsaW5nIGNvbmZsaWN0aW5nIHNlcmlhbCBwb3J0IEJcbiIpOworCQkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCAoMHgxNDA1LCAweDAxMDAsIDAsIHVzU0ksCisJCQkJCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCQkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKwkJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QgKDB4MTQwNCwgMHgwMDAwLCAwLCAwLAorCQkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisjZWxzZQorCQkJCQkJZ290byBleGl0X2NvbmZsaWN0OworI2VuZGlmCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBDaGVjayBJUiBwb3J0ICovCisJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNzAwLCAweDAwMDAsIDAsIDAsCisJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNzA0LCAweDAwMDAsIDAsIDAsCisJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCS8qIGJSQyA9PSAwICovCisJCWlmICgodXNDWCAmIDB4ZmYpICE9IDB4ZmYpIHsgLyogSVIgcG9ydCBub3QgZGlzYWJsZWQgKi8KKwkJCWlmICgodXNDWCAmIDB4ZmYpID09IG13YXZlX3VhcnRfaXJxKSB7CisjaWZuZGVmIE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisJCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IElSIHBvcnQgaXJxICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlX3VhcnRfaXJxICV4XG4iLCB1c0NYICYgMHhmZiwgbXdhdmVfdWFydF9pcnEpOworI2Vsc2UKKwkJCQlQUklOVEtfMyhUUkFDRV9TTUFQSSwKKwkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZzogSVIgcG9ydCBpcnEgJXggY29uZmxpY3RzIHdpdGggbXdhdmVfdWFydF9pcnEgJXhcbiIsIHVzQ1ggJiAweGZmLCBtd2F2ZV91YXJ0X2lycSk7CisjZW5kaWYKKyNpZmRlZiBNV0FWRV9GVVRaX1dJVEhfT1RIRVJfREVWSUNFUworCQkJCVBSSU5US18xKFRSQUNFX1NNQVBJLAorCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnIERpc2FibGluZyBjb25mbGljdGluZyBJUiBwb3J0XG4iKTsKKwkJCQliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTcwMSwgMHgwMTAwLCAwLCAwLAorCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKwkJCQliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTcwMCwgMCwgMCwgMCwKKwkJCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE3MDUsIDB4MDFmZiwgMCwgdXNTSSwKKwkJCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE3MDQsIDB4MDAwMCwgMCwgMCwKKwkJCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisjZWxzZQorCQkJCWdvdG8gZXhpdF9jb25mbGljdDsKKyNlbmRpZgorCQkJfSBlbHNlIHsKKwkJCQlpZiAoKHVzU0kgJiAweGZmKSA9PSB1YXJ0aW9faW5kZXgpIHsKKyNpZm5kZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBJUiBwb3J0IGJhc2UgSS9PIGFkZHJlc3MgJXggY29uZmxpY3RzIHdpdGggbXdhdmUgdWFydCBJL08gJXhcbiIsIGF1c1VhcnRCYXNlc1t1c1NJICYgMHhmZl0sIGF1c1VhcnRCYXNlc1t1YXJ0aW9faW5kZXhdKTsKKyNlbHNlCisJCQkJCVBSSU5US18zKFRSQUNFX1NNQVBJLAorCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZzogSVIgcG9ydCBiYXNlIEkvTyBhZGRyZXNzICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlIHVhcnQgSS9PICV4XG4iLCBhdXNVYXJ0QmFzZXNbdXNTSSAmIDB4ZmZdLCBhdXNVYXJ0QmFzZXNbdWFydGlvX2luZGV4XSk7CisjZW5kaWYKKyNpZmRlZiBNV0FWRV9GVVRaX1dJVEhfT1RIRVJfREVWSUNFUworCQkJCQlQUklOVEtfMShUUkFDRV9TTUFQSSwKKwkJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmcgRGlzYWJsaW5nIGNvbmZsaWN0aW5nIElSIHBvcnRcbiIpOworCQkJCQliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTcwMSwgMHgwMTAwLCAwLCAwLAorCQkJCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCQkJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCQkJCQliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTcwMCwgMCwgMCwgMCwKKwkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKwkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE3MDUsIDB4MDFmZiwgMCwgdXNTSSwKKwkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKwkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE3MDQsIDB4MDAwMCwgMCwgMCwKKwkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKyNlbHNlCisJCQkJCWdvdG8gZXhpdF9jb25mbGljdDsKKyNlbmRpZgorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxODAyLCAweDAwMDAsIDAsIDAsCisJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCisJaWYgKG13YXZlXzM3ODBpX2lvKSB7CisJCXVzREkgPSBkc3Bpb19pbmRleDsKKwl9CisJaWYgKG13YXZlXzM3ODBpX2lycSkgeworCQl1c1NJID0gKHVzU0kgJiAweGZmMDApIHwgbXdhdmVfMzc4MGlfaXJxOworCX0KKworCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxODAzLCAweDAxMDEsIHVzREksIHVzU0ksCisJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCisJYlJDID0gc21hcGlfcmVxdWVzdCgweDE4MDQsIDB4MDAwMCwgMCwgMCwKKwkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisKKwlpZiAobXdhdmVfdWFydF9pbykgeworCQl1c1NJID0gKHVzU0kgJiAweDAwZmYpIHwgKHVhcnRpb19pbmRleCA8PCA4KTsKKwl9CisJaWYgKG13YXZlX3VhcnRfaXJxKSB7CisJCXVzU0kgPSAodXNTSSAmIDB4ZmYwMCkgfCBtd2F2ZV91YXJ0X2lycTsKKwl9CisJYlJDID0gc21hcGlfcmVxdWVzdCgweDE4MDUsIDB4MDEwMSwgMCwgdXNTSSwKKwkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisKKwliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTgwMiwgMHgwMDAwLCAwLCAwLAorCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKworCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxODA0LCAweDAwMDAsIDAsIDAsCisJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCisvKiBub3JtYWwgZXhpdDogKi8KKwlQUklOVEtfMShUUkFDRV9TTUFQSSwgInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZyBleGl0XG4iKTsKKwlyZXR1cm4gMDsKKworZXhpdF9jb25mbGljdDoKKwkvKiBNZXNzYWdlIGhhcyBhbHJlYWR5IGJlZW4gcHJpbnRlZCAqLworCXJldHVybiAtRUlPOworCitleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I6CisJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmcgZXhpdCBvbiBzbWFwaV9yZXF1ZXN0IGVycm9yIGJSQyAleFxuIiwgYlJDKTsKKwlyZXR1cm4gYlJDOworfQorCisKK2ludCBzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKEJPT0xFQU4gYk9uKQoreworCWludCBiUkMgPSAtRUlPOworCXVuc2lnbmVkIHNob3J0IHVzQVgsIHVzQlgsIHVzQ1gsIHVzRFgsIHVzREksIHVzU0k7CisJdW5zaWduZWQgc2hvcnQgdXNQb3dlckZ1bmN0aW9uOworCisJUFJJTlRLXzIoVFJBQ0VfU01BUEksICJzbWFwaTo6c21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZSBlbnRyeSBiT24gJXhcbiIsIGJPbik7CisKKwl1c1Bvd2VyRnVuY3Rpb24gPSAoYk9uKSA/IDEgOiAwOworCisJYlJDID0gc21hcGlfcmVxdWVzdCgweDQ5MDEsIDB4MDAwMCwgMCwgdXNQb3dlckZ1bmN0aW9uLAorCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKworCVBSSU5US18yKFRSQUNFX1NNQVBJLCAic21hcGk6OnNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUgZXhpdCBiUkMgJXhcbiIsIGJSQyk7CisKKwlyZXR1cm4gYlJDOworfQorCisjaWYgMAorc3RhdGljIGludCBTbWFwaVF1ZXJ5U3lzdGVtSUQodm9pZCkKK3sKKwlpbnQgYlJDID0gLUVJTzsKKwl1bnNpZ25lZCBzaG9ydCB1c0FYID0gMHhmZmZmLCB1c0JYID0gMHhmZmZmLCB1c0NYID0gMHhmZmZmLAorCQl1c0RYID0gMHhmZmZmLCB1c0RJID0gMHhmZmZmLCB1c1NJID0gMHhmZmZmOworCisJcHJpbnRrKCJzbWFwaTo6U21hcGlRVWVyeVN5c3RlbUlEIGVudHJ5XG4iKTsKKwliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MDAwMCwgMCwgMCwgMCwKKwkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisKKwlpZiAoYlJDID09IDApIHsKKwkJcHJpbnRrKCJBWD0leCwgQlg9JXgsIENYPSV4LCBEWD0leCwgREk9JXgsIFNJPSV4XG4iLAorCQkJdXNBWCwgdXNCWCwgdXNDWCwgdXNEWCwgdXNESSwgdXNTSSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJzbWFwaTo6U21hcGlRdWVyeVN5c3RlbUlEIHNtYXBpX3JlcXVlc3QgZXJyb3JcbiIpOworCX0KKworCXJldHVybiBiUkM7Cit9CisjZW5kaWYgIC8qICAwICAqLworCitpbnQgc21hcGlfaW5pdCh2b2lkKQoreworCWludCByZXR2YWwgPSAtRUlPOworCXVuc2lnbmVkIHNob3J0IHVzU21hcGlJRCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCVBSSU5US18xKFRSQUNFX1NNQVBJLCAic21hcGk6OnNtYXBpX2luaXQgZW50cnlcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJdXNTbWFwaUlEID0gQ01PU19SRUFEKDB4N0MpOworCXVzU21hcGlJRCB8PSAoQ01PU19SRUFEKDB4N0QpIDw8IDgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJUFJJTlRLXzIoVFJBQ0VfU01BUEksICJzbWFwaTo6c21hcGlfaW5pdCB1c1NtYXBpSUQgJXhcbiIsIHVzU21hcGlJRCk7CisKKwlpZiAodXNTbWFwaUlEID09IDB4NTM0OSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwkJZ191c1NtYXBpUG9ydCA9IENNT1NfUkVBRCgweDdFKTsKKwkJZ191c1NtYXBpUG9ydCB8PSAoQ01PU19SRUFEKDB4N0YpIDw8IDgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworCQlpZiAoZ191c1NtYXBpUG9ydCA9PSAwKSB7CisJCQlQUklOVEtfRVJST1IoInNtYXBpOjpzbWFwaV9pbml0LCBFUlJPUiB1bmFibGUgdG8gcmVhZCBmcm9tIFNNQVBJIHBvcnRcbiIpOworCQl9IGVsc2UgeworCQkJUFJJTlRLXzIoVFJBQ0VfU01BUEksCisJCQkJInNtYXBpOjpzbWFwaV9pbml0LCBleGl0IFRSVUUgZ191c1NtYXBpUG9ydCAleFxuIiwKKwkJCQlnX3VzU21hcGlQb3J0KTsKKwkJCXJldHZhbCA9IDA7CisJCQkvL1NtYXBpUXVlcnlTeXN0ZW1JRCgpOworCQl9CisJfSBlbHNlIHsKKwkJUFJJTlRLX0VSUk9SKCJzbWFwaTo6c21hcGlfaW5pdCwgRVJST1IgaW52YWxpZCB1c1NtYXBpSURcbiIpOworCQlyZXR2YWwgPSAtRU5YSU87CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5oIGIvZHJpdmVycy9jaGFyL213YXZlL3NtYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiMmVjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisqCisqIHNtYXBpLmggLS0gZGVjbGFyYXRpb25zIGZvciBTTUFQSSBpbnRlcmZhY2Ugcm91dGluZXMKKyoKKyoKKyogV3JpdHRlbiBCeTogTWlrZSBTdWxsaXZhbiBJQk0gQ29ycG9yYXRpb24KKyoKKyogQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBOTyBXQVJSQU5UWQorKiBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKKyogQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQKKyogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisqIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworKiBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyogdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKKyogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisqCisqIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisqIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUworKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqCisqCisqIDEwLzIzLzIwMDAgLSBBbHBoYSBSZWxlYXNlCisqCUZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworKi8KKworI2lmbmRlZiBfTElOVVhfU01BUElfSAorI2RlZmluZSBfTElOVVhfU01BUElfSAorCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIEJPT0xFQU4gaW50CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgYkRTUFByZXNlbnQ7CisJaW50IGJEU1BFbmFibGVkOworCWludCBiTW9kZW1FbmFibGVkOworCWludCBiTUlESUVuYWJsZWQ7CisJaW50IGJTYmxzdEVuYWJsZWQ7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BJUlE7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BETUE7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU87CisJdW5zaWduZWQgc2hvcnQgdXNVYXJ0SVJROworCXVuc2lnbmVkIHNob3J0IHVzVWFydEJhc2VJTzsKKwl1bnNpZ25lZCBzaG9ydCB1c01pZGlJUlE7CisJdW5zaWduZWQgc2hvcnQgdXNNaWRpQmFzZUlPOworCXVuc2lnbmVkIHNob3J0IHVzU25kYmxzdElSUTsKKwl1bnNpZ25lZCBzaG9ydCB1c1NuZGJsc3RETUE7CisJdW5zaWduZWQgc2hvcnQgdXNTbmRibHN0QmFzZUlPOworfSBTTUFQSV9EU1BfU0VUVElOR1M7CisKK2ludCBzbWFwaV9pbml0KHZvaWQpOworaW50IHNtYXBpX3F1ZXJ5X0RTUF9jZmcoU01BUElfRFNQX1NFVFRJTkdTICogcFNldHRpbmdzKTsKK2ludCBzbWFwaV9zZXRfRFNQX2NmZyh2b2lkKTsKK2ludCBzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKEJPT0xFQU4gYk9uKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS90cDM3ODBpLmMgYi9kcml2ZXJzL2NoYXIvbXdhdmUvdHAzNzgwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNjUwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvdHAzNzgwaS5jCkBAIC0wLDAgKzEsNTkyIEBACisvKgorKgorKiB0cDM3ODBpLmMgLS0gYm9hcmQgZHJpdmVyIGZvciAzNzgwaSBvbiBUaGlua1BhZHMKKyoKKyoKKyogV3JpdHRlbiBCeTogTWlrZSBTdWxsaXZhbiBJQk0gQ29ycG9yYXRpb24KKyoKKyogQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBOTyBXQVJSQU5UWQorKiBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKKyogQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQKKyogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisqIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworKiBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyogdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKKyogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisqCisqIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisqIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUworKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqCisqCisqIDEwLzIzLzIwMDAgLSBBbHBoYSBSZWxlYXNlCisqCUZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJzbWFwaS5oIgorI2luY2x1ZGUgIm13YXZlZGQuaCIKKyNpbmNsdWRlICJ0cDM3ODBpLmgiCisjaW5jbHVkZSAiMzc4MGkuaCIKKyNpbmNsdWRlICJtd2F2ZXB1Yi5oIgorCitleHRlcm4gTVdBVkVfREVWSUNFX0RBVEEgbXdhdmVfc19tZGQ7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzX2F1c1RoaW5rcGFkSXJxVG9GaWVsZFsxNl0gPQorCXsgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywgMHhGRkZGLCAweDAwMDQsCisJMHhGRkZGLCAweEZGRkYsIDB4MDAwNSwgMHgwMDA2LCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDcgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzX2F1c1RoaW5rcGFkRG1hVG9GaWVsZFs4XSA9CisJeyAweDAwMDEsIDB4MDAwMiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDMsIDB4MDAwNCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNfbnVtSXJxcyA9IDE2LCBzX251bURtYXMgPSA4OworCisKK3N0YXRpYyB2b2lkIEVuYWJsZVNSQU0oVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpCit7CisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0gJnBCRERhdGEtPnJEc3BTZXR0aW5nczsKKwl1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTyA9IHBTZXR0aW5ncy0+dXNEc3BCYXNlSU87CisJRFNQX0dQSU9fT1VUUFVUX0RBVEFfMTVfOCByR3Bpb091dHB1dERhdGE7CisJRFNQX0dQSU9fRFJJVkVSX0VOQUJMRV8xNV84IHJHcGlvRHJpdmVyRW5hYmxlOworCURTUF9HUElPX01PREVfMTVfOCByR3Bpb01vZGU7CisKKwlQUklOVEtfMShUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6RW5hYmxlU1JBTSwgZW50cnlcbiIpOworCisJTUtXT1JEKHJHcGlvTW9kZSkgPSBSZWFkTXNhQ2ZnKERTUF9HcGlvTW9kZUNvbnRyb2xfMTVfOCk7CisJckdwaW9Nb2RlLkdwaW9Nb2RlMTAgPSAwOworCVdyaXRlTXNhQ2ZnKERTUF9HcGlvTW9kZUNvbnRyb2xfMTVfOCwgTUtXT1JEKHJHcGlvTW9kZSkpOworCisJTUtXT1JEKHJHcGlvRHJpdmVyRW5hYmxlKSA9IDA7CisJckdwaW9Ecml2ZXJFbmFibGUuRW5hYmxlMTAgPSBUUlVFOworCXJHcGlvRHJpdmVyRW5hYmxlLk1hc2sxMCA9IFRSVUU7CisJV3JpdGVNc2FDZmcoRFNQX0dwaW9Ecml2ZXJFbmFibGVfMTVfOCwgTUtXT1JEKHJHcGlvRHJpdmVyRW5hYmxlKSk7CisKKwlNS1dPUkQockdwaW9PdXRwdXREYXRhKSA9IDA7CisJckdwaW9PdXRwdXREYXRhLkxhdGNoMTAgPSAwOworCXJHcGlvT3V0cHV0RGF0YS5NYXNrMTAgPSBUUlVFOworCVdyaXRlTXNhQ2ZnKERTUF9HcGlvT3V0cHV0RGF0YV8xNV84LCBNS1dPUkQockdwaW9PdXRwdXREYXRhKSk7CisKKwlQUklOVEtfMShUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6RW5hYmxlU1JBTSBleGl0XG4iKTsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgVWFydEludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCVBSSU5US18zKFRSQUNFX1RQMzc4MEksCisJCSJ0cDM3ODBpOjpVYXJ0SW50ZXJydXB0IGVudHJ5IGlycSAleCBkZXZfaWQgJXBcbiIsIGlycSwgZGV2X2lkKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBEc3BJbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwTVdBVkVfREVWSUNFX0RBVEEgcERydkRhdGEgPSAmbXdhdmVfc19tZGQ7CisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0gJnBEcnZEYXRhLT5yQkREYXRhLnJEc3BTZXR0aW5nczsKKwl1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTyA9IHBTZXR0aW5ncy0+dXNEc3BCYXNlSU87CisJdW5zaWduZWQgc2hvcnQgdXNJUENTb3VyY2UgPSAwLCB1c0lzb2xhdGlvbk1hc2ssIHVzUENOdW07CisKKwlQUklOVEtfMyhUUkFDRV9UUDM3ODBJLAorCQkidHAzNzgwaTo6RHNwSW50ZXJydXB0IGVudHJ5IGlycSAleCBkZXZfaWQgJXBcbiIsIGlycSwgZGV2X2lkKTsKKworCWlmIChkc3AzNzgwSV9HZXRJUENTb3VyY2UodXNEc3BCYXNlSU8sICZ1c0lQQ1NvdXJjZSkgPT0gMCkgeworCQlQUklOVEtfMihUUkFDRV9UUDM3ODBJLAorCQkJInRwMzc4MGk6OkRzcEludGVycnVwdCwgcmV0dXJuIGZyb20gZHNwMzc4MGlfR2V0SVBDU291cmNlLCB1c0lQQ1NvdXJjZSAleFxuIiwKKwkJCXVzSVBDU291cmNlKTsKKwkJdXNJc29sYXRpb25NYXNrID0gMTsKKwkJZm9yICh1c1BDTnVtID0gMTsgdXNQQ051bSA8PSAxNjsgdXNQQ051bSsrKSB7CisJCQlpZiAodXNJUENTb3VyY2UgJiB1c0lzb2xhdGlvbk1hc2spIHsKKwkJCQl1c0lQQ1NvdXJjZSAmPSB+dXNJc29sYXRpb25NYXNrOworCQkJCVBSSU5US18zKFRSQUNFX1RQMzc4MEksCisJCQkJCSJ0cDM3ODBpOjpEc3BJbnRlcnJ1cHQgdXNQQ051bSAleCB1c0lQQ1NvdXJjZSAleFxuIiwKKwkJCQkJdXNQQ051bSwgdXNJUENTb3VyY2UpOworCQkJCWlmIChwRHJ2RGF0YS0+SVBDc1t1c1BDTnVtIC0gMV0udXNJbnRDb3VudCA9PSAwKSB7CisJCQkJCXBEcnZEYXRhLT5JUENzW3VzUENOdW0gLSAxXS51c0ludENvdW50ID0gMTsKKwkJCQl9CisJCQkJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKKwkJCQkJInRwMzc4MGk6OkRzcEludGVycnVwdCB1c0ludENvdW50ICV4XG4iLAorCQkJCQlwRHJ2RGF0YS0+SVBDc1t1c1BDTnVtIC0gMV0udXNJbnRDb3VudCk7CisJCQkJaWYgKHBEcnZEYXRhLT5JUENzW3VzUENOdW0gLSAxXS5iSXNFbmFibGVkID09IFRSVUUpIHsKKwkJCQkJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKKwkJCQkJCSJ0cDM3ODBpOjpEc3BJbnRlcnJ1cHQsIHdha2luZyB1cCB1c1BDTnVtICV4XG4iLAorCQkJCQkJdXNQQ051bSAtIDEpOworCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBEcnZEYXRhLT5JUENzW3VzUENOdW0gLSAxXS5pcGNfd2FpdF9xdWV1ZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKKwkJCQkJCSJ0cDM3ODBpOjpEc3BJbnRlcnJ1cHQsIG5vIG9uZSB3YWl0aW5nIGZvciBJUEMgJXhcbiIsCisJCQkJCQl1c1BDTnVtIC0gMSk7CisJCQkJfQorCQkJfQorCQkJaWYgKHVzSVBDU291cmNlID09IDApCisJCQkJYnJlYWs7CisJCQkvKiB0cnkgbmV4dCBJUEMgKi8KKwkJCXVzSXNvbGF0aW9uTWFzayA9IHVzSXNvbGF0aW9uTWFzayA8PCAxOworCQl9CisJfSBlbHNlIHsKKwkJUFJJTlRLXzEoVFJBQ0VfVFAzNzgwSSwKKwkJCSJ0cDM3ODBpOjpEc3BJbnRlcnJ1cHQsIHJldHVybiBmYWxzZSBmcm9tIGRzcDM3ODBpX0dldElQQ1NvdXJjZVxuIik7CisJfQorCVBSSU5US18xKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjpEc3BJbnRlcnJ1cHQgZXhpdFxuIik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK2ludCB0cDM3ODBJX0luaXRpYWxpemVCb2FyZERhdGEoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpCit7CisJaW50IHJldHZhbCA9IDA7CisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0gJnBCRERhdGEtPnJEc3BTZXR0aW5nczsKKworCisJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfSW5pdGlhbGl6ZUJvYXJkRGF0YSBlbnRyeSBwQkREYXRhICVwXG4iLCBwQkREYXRhKTsKKworCXBCRERhdGEtPmJEU1BFbmFibGVkID0gRkFMU0U7CisJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IEZBTFNFOworCisJcmV0dmFsID0gc21hcGlfaW5pdCgpOworCWlmIChyZXR2YWwpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0luaXRpYWxpemVCb2FyZERhdGE6IEVycm9yOiBTTUFQSSBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgbWFjaGluZVxuIik7CisJfSBlbHNlIHsKKwkJaWYgKG13YXZlXzM3ODBpX2lycSB8fCBtd2F2ZV8zNzgwaV9pbyB8fCBtd2F2ZV91YXJ0X2lycSB8fCBtd2F2ZV91YXJ0X2lvKSB7CisJCQlyZXR2YWwgPSBzbWFwaV9zZXRfRFNQX2NmZygpOworCQl9CisJfQorCisJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfSW5pdGlhbGl6ZUJvYXJkRGF0YSBleGl0IHJldHZhbCAleFxuIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCB0cDM3ODBJX0NsZWFudXAoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLAorCQkidHAzNzgwaTo6dHAzNzgwSV9DbGVhbnVwIGVudHJ5IGFuZCBleGl0IHBCRERhdGEgJXBcbiIsIHBCRERhdGEpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IHRwMzc4MElfQ2FsY1Jlc291cmNlcyhUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSkKK3sKKwlTTUFQSV9EU1BfU0VUVElOR1MgclNtYXBpSW5mbzsKKwlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOworCisJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKKwkJInRwMzc4MGk6OnRwMzc4MElfQ2FsY1Jlc291cmNlcyBlbnRyeSBwQkREYXRhICVwXG4iLCBwQkREYXRhKTsKKworCWlmIChzbWFwaV9xdWVyeV9EU1BfY2ZnKCZyU21hcGlJbmZvKSkgeworCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInRwMzc4MGk6OnRwMzc4MElfQ2FsY1Jlc291cmNlczogRXJyb3I6IENvdWxkIG5vdCBxdWVyeSBEU1AgY29uZmlnLiBBYm9ydGluZy5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoCisJCSggclNtYXBpSW5mby51c0RzcElSUSA9PSAwICkKKwkJfHwgKCByU21hcGlJbmZvLnVzRHNwQmFzZUlPID09ICAwICkKKwkJfHwgKCByU21hcGlJbmZvLnVzVWFydElSUSA9PSAgMCApCisJCXx8ICggclNtYXBpSW5mby51c1VhcnRCYXNlSU8gPT0gIDAgKQorCSkgeworCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInRwMzc4MGk6OnRwMzc4MElfQ2FsY1Jlc291cmNlczogRXJyb3I6IElsbGVnYWwgcmVzb3VyY2Ugc2V0dGluZy4gQWJvcnRpbmcuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcFNldHRpbmdzLT5iRFNQRW5hYmxlZCA9IChyU21hcGlJbmZvLmJEU1BFbmFibGVkICYmIHJTbWFwaUluZm8uYkRTUFByZXNlbnQpOworCXBTZXR0aW5ncy0+Yk1vZGVtRW5hYmxlZCA9IHJTbWFwaUluZm8uYk1vZGVtRW5hYmxlZDsKKwlwU2V0dGluZ3MtPnVzRHNwSXJxID0gclNtYXBpSW5mby51c0RzcElSUTsKKwlwU2V0dGluZ3MtPnVzRHNwRG1hID0gclNtYXBpSW5mby51c0RzcERNQTsKKwlwU2V0dGluZ3MtPnVzRHNwQmFzZUlPID0gclNtYXBpSW5mby51c0RzcEJhc2VJTzsKKwlwU2V0dGluZ3MtPnVzVWFydElycSA9IHJTbWFwaUluZm8udXNVYXJ0SVJROworCXBTZXR0aW5ncy0+dXNVYXJ0QmFzZUlPID0gclNtYXBpSW5mby51c1VhcnRCYXNlSU87CisKKwlwU2V0dGluZ3MtPnVEU3RvcmVTaXplID0gVFBfQUJJTElUSUVTX0RBVEFfU0laRTsKKwlwU2V0dGluZ3MtPnVJU3RvcmVTaXplID0gVFBfQUJJTElUSUVTX0lOU1RfU0laRTsKKwlwU2V0dGluZ3MtPnVJcHMgPSBUUF9BQklMSVRJRVNfSU5UU19QRVJfU0VDOworCisJaWYgKHBTZXR0aW5ncy0+YkRTUEVuYWJsZWQgJiYgcFNldHRpbmdzLT5iTW9kZW1FbmFibGVkICYmIHBTZXR0aW5ncy0+dXNEc3BJcnEgPT0gcFNldHRpbmdzLT51c1VhcnRJcnEpIHsKKwkJcEJERGF0YS0+YlNoYXJlRHNwSXJxID0gcEJERGF0YS0+YlNoYXJlVWFydElycSA9IDE7CisJfSBlbHNlIHsKKwkJcEJERGF0YS0+YlNoYXJlRHNwSXJxID0gcEJERGF0YS0+YlNoYXJlVWFydElycSA9IDA7CisJfQorCisJUFJJTlRLXzEoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfQ2FsY1Jlc291cmNlcyBleGl0XG4iKTsKKworCXJldHVybiAwOworfQorCisKK2ludCB0cDM3ODBJX0NsYWltUmVzb3VyY2VzKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKQoreworCWludCByZXR2YWwgPSAwOworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwwKQorCXN0cnVjdCByZXNvdXJjZSAqcHJlczsKKyNlbmRpZgorCisJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKKwkJInRwMzc4MGk6OnRwMzc4MElfQ2xhaW1SZXNvdXJjZXMgZW50cnkgcEJERGF0YSAlcFxuIiwgcEJERGF0YSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApCisJcHJlcyA9IHJlcXVlc3RfcmVnaW9uKHBTZXR0aW5ncy0+dXNEc3BCYXNlSU8sIDE2LCAibXdhdmVfMzc4MGkiKTsKKwlpZiAoIHByZXMgPT0gTlVMTCApIHJldHZhbCA9IC1FSU87CisjZWxzZQorCXJldHZhbCA9IGNoZWNrX3JlZ2lvbihwU2V0dGluZ3MtPnVzRHNwQmFzZUlPLCAxNik7CisJaWYgKCFyZXR2YWwpIHJlcXVlc3RfcmVnaW9uKHBTZXR0aW5ncy0+dXNEc3BCYXNlSU8sIDE2LCAibXdhdmVfMzc4MGkiKTsKKyNlbmRpZgorCWlmIChyZXR2YWwpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0NsYWltUmVzb3VyY2VzOiBFcnJvcjogQ291bGQgbm90IGNsYWltIEkvTyByZWdpb24gc3RhcnRpbmcgYXQgJXhcbiIsIHBTZXR0aW5ncy0+dXNEc3BCYXNlSU8pOworCQlyZXR2YWwgPSAtRUlPOworCX0KKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0NsYWltUmVzb3VyY2VzIGV4aXQgcmV0dmFsICV4XG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IHRwMzc4MElfUmVsZWFzZVJlc291cmNlcyhUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOworCisJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKKwkJInRwMzc4MGk6OnRwMzc4MElfUmVsZWFzZVJlc291cmNlcyBlbnRyeSBwQkREYXRhICVwXG4iLCBwQkREYXRhKTsKKworCXJlbGVhc2VfcmVnaW9uKHBTZXR0aW5ncy0+dXNEc3BCYXNlSU8gJiAofjMpLCAxNik7CisKKwlpZiAocFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCkgeworCQlmcmVlX2lycShwU2V0dGluZ3MtPnVzRHNwSXJxLCBOVUxMKTsKKwkJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IEZBTFNFOworCX0KKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCSJ0cDM3ODBpOjp0cDM3ODBJX1JlbGVhc2VSZXNvdXJjZXMgZXhpdCByZXR2YWwgJXhcbiIsIHJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKworaW50IHRwMzc4MElfRW5hYmxlRFNQKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKQoreworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CisJQk9PTEVBTiBiRFNQUG93ZXJlZFVwID0gRkFMU0UsIGJEU1BFbmFibGVkID0gRkFMU0UsIGJJbnRlcnJ1cHRBbGxvY2F0ZWQgPSBGQUxTRTsKKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUCBlbnRyeSBwQkREYXRhICVwXG4iLCBwQkREYXRhKTsKKworCWlmIChwQkREYXRhLT5iRFNQRW5hYmxlZCkgeworCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQOiBFcnJvcjogRFNQIGFscmVhZHkgZW5hYmxlZCFcbiIpOworCQlnb3RvIGV4aXRfY2xlYW51cDsKKwl9CisKKwlpZiAoIXBTZXR0aW5ncy0+YkRTUEVuYWJsZWQpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODA6OnRwMzc4MElfRW5hYmxlRFNQOiBFcnJvcjogcFNldHRpbmdzLT5iRFNQRW5hYmxlZCBub3Qgc2V0XG4iKTsKKwkJZ290byBleGl0X2NsZWFudXA7CisJfQorCisJaWYgKAorCQkocFNldHRpbmdzLT51c0RzcElycSA+PSBzX251bUlycXMpCisJCXx8IChwU2V0dGluZ3MtPnVzRHNwRG1hID49IHNfbnVtRG1hcykKKwkJfHwgKHNfYXVzVGhpbmtwYWRJcnFUb0ZpZWxkW3BTZXR0aW5ncy0+dXNEc3BJcnFdID09IDB4RkZGRikKKwkJfHwgKHNfYXVzVGhpbmtwYWREbWFUb0ZpZWxkW3BTZXR0aW5ncy0+dXNEc3BEbWFdID09IDB4RkZGRikKKwkpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IGludmFsaWQgaXJxICV4XG4iLCBwU2V0dGluZ3MtPnVzRHNwSXJxKTsKKwkJZ290byBleGl0X2NsZWFudXA7CisJfQorCisJaWYgKAorCQkoKHBTZXR0aW5ncy0+dXNEc3BCYXNlSU8gJiAweEYwMEYpICE9IDApCisJCXx8IChwU2V0dGluZ3MtPnVzRHNwQmFzZUlPICYgMHgwRkYwKSA9PSAwCisJKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1A6IEVycm9yOiBJbnZhbGlkIERTUCBiYXNlIEkvTyBhZGRyZXNzICV4XG4iLCBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPKTsKKwkJZ290byBleGl0X2NsZWFudXA7CisJfQorCisJaWYgKHBTZXR0aW5ncy0+Yk1vZGVtRW5hYmxlZCkgeworCQlpZiAoCisJCQlwU2V0dGluZ3MtPnVzVWFydElycSA+PSBzX251bUlycXMKKwkJCXx8IHNfYXVzVGhpbmtwYWRJcnFUb0ZpZWxkW3BTZXR0aW5ncy0+dXNVYXJ0SXJxXSA9PSAweEZGRkYKKwkJKSB7CisJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQOiBFcnJvcjogSW52YWxpZCBVQVJUIElSUSAleFxuIiwgcFNldHRpbmdzLT51c1VhcnRJcnEpOworCQkJZ290byBleGl0X2NsZWFudXA7CisJCX0KKwkJc3dpdGNoIChwU2V0dGluZ3MtPnVzVWFydEJhc2VJTykgeworCQkJY2FzZSAweDAzRjg6CisJCQljYXNlIDB4MDJGODoKKwkJCWNhc2UgMHgwM0U4OgorCQkJY2FzZSAweDAyRTg6CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJUFJJTlRLX0VSUk9SKCJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IEludmFsaWQgVUFSVCBiYXNlIEkvTyBhZGRyZXNzICV4XG4iLCBwU2V0dGluZ3MtPnVzVWFydEJhc2VJTyk7CisJCQkJZ290byBleGl0X2NsZWFudXA7CisJCX0KKwl9CisKKwlwU2V0dGluZ3MtPmJEc3BJcnFBY3RpdmVMb3cgPSBwU2V0dGluZ3MtPmJEc3BJcnFQdWxzZSA9IFRSVUU7CisJcFNldHRpbmdzLT5iVWFydElycUFjdGl2ZUxvdyA9IHBTZXR0aW5ncy0+YlVhcnRJcnFQdWxzZSA9IFRSVUU7CisKKwlpZiAocEJERGF0YS0+YlNoYXJlRHNwSXJxKSB7CisJCXBTZXR0aW5ncy0+YkRzcElycUFjdGl2ZUxvdyA9IEZBTFNFOworCX0KKwlpZiAocEJERGF0YS0+YlNoYXJlVWFydElycSkgeworCQlwU2V0dGluZ3MtPmJVYXJ0SXJxQWN0aXZlTG93ID0gRkFMU0U7CisJfQorCisJcFNldHRpbmdzLT51c051bVRyYW5zZmVycyA9IFRQX0NGR19OdW1UcmFuc2ZlcnM7CisJcFNldHRpbmdzLT51c1JlUmVxdWVzdCA9IFRQX0NGR19SZXJlcXVlc3RUaW1lcjsKKwlwU2V0dGluZ3MtPmJFbmFibGVNRU1DUzE2ID0gVFBfQ0ZHX01FTUNTMTY7CisJcFNldHRpbmdzLT51c0lzYU1lbUNtZFdpZHRoID0gVFBfQ0ZHX0lzYU1lbUNtZFdpZHRoOworCXBTZXR0aW5ncy0+YkdhdGVJT0NIUkRZID0gVFBfQ0ZHX0dhdGVJT0NIUkRZOworCXBTZXR0aW5ncy0+YkVuYWJsZVB3ck1nbXQgPSBUUF9DRkdfRW5hYmxlUHdyTWdtdDsKKwlwU2V0dGluZ3MtPnVzSEJ1c1RpbWVyTG9hZFZhbHVlID0gVFBfQ0ZHX0hCdXNUaW1lclZhbHVlOworCXBTZXR0aW5ncy0+YkRpc2FibGVMQnVzVGltZW91dCA9IFRQX0NGR19EaXNhYmxlTEJ1c1RpbWVvdXQ7CisJcFNldHRpbmdzLT51c05fRGl2aXNvciA9IFRQX0NGR19OX0Rpdmlzb3I7CisJcFNldHRpbmdzLT51c01fTXVsdGlwbGllciA9IFRQX0NGR19NX011bHRpcGxpZXI7CisJcFNldHRpbmdzLT5iUGxsQnlwYXNzID0gVFBfQ0ZHX1BsbEJ5cGFzczsKKwlwU2V0dGluZ3MtPnVzQ2hpcGxldEVuYWJsZSA9IFRQX0NGR19DaGlwbGV0RW5hYmxlOworCisJaWYgKHJlcXVlc3RfaXJxKHBTZXR0aW5ncy0+dXNVYXJ0SXJxLCAmVWFydEludGVycnVwdCwgMCwgIm13YXZlX3VhcnQiLCBOVUxMKSkgeworCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQOiBFcnJvcjogQ291bGQgbm90IGdldCBVQVJUIElSUSAleFxuIiwgcFNldHRpbmdzLT51c1VhcnRJcnEpOworCQlnb3RvIGV4aXRfY2xlYW51cDsKKwl9IGVsc2UgewkJLyogbm8gY29uZmxpY3QganVzdCByZWxlYXNlICovCisJCWZyZWVfaXJxKHBTZXR0aW5ncy0+dXNVYXJ0SXJxLCBOVUxMKTsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEocFNldHRpbmdzLT51c0RzcElycSwgJkRzcEludGVycnVwdCwgMCwgIm13YXZlXzM3ODBpIiwgTlVMTCkpIHsKKwkJUFJJTlRLX0VSUk9SKCJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IENvdWxkIG5vdCBnZXQgMzc4MGkgSVJRICV4XG4iLCBwU2V0dGluZ3MtPnVzRHNwSXJxKTsKKwkJZ290byBleGl0X2NsZWFudXA7CisJfSBlbHNlIHsKKwkJUFJJTlRLXzMoVFJBQ0VfVFAzNzgwSSwKKwkJCSJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUCwgZ290IGludGVycnVwdCAleCBiU2hhcmVEc3BJcnEgJXhcbiIsCisJCQlwU2V0dGluZ3MtPnVzRHNwSXJxLCBwQkREYXRhLT5iU2hhcmVEc3BJcnEpOworCQliSW50ZXJydXB0QWxsb2NhdGVkID0gVFJVRTsKKwkJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IFRSVUU7CisJfQorCisJc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShGQUxTRSk7CisJaWYgKHNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoVFJVRSkpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IHNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoVFJVRSkgZmFpbGVkXG4iKTsKKwkJZ290byBleGl0X2NsZWFudXA7CisJfSBlbHNlIHsKKwkJYkRTUFBvd2VyZWRVcCA9IFRSVUU7CisJfQorCisJaWYgKGRzcDM3ODBJX0VuYWJsZURTUChwU2V0dGluZ3MsIHNfYXVzVGhpbmtwYWRJcnFUb0ZpZWxkLCBzX2F1c1RoaW5rcGFkRG1hVG9GaWVsZCkpIHsKKwkJUFJJTlRLX0VSUk9SKCJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IGRzcDc4ODBJX0VuYWJsZURTUCgpIGZhaWxlZFxuIik7CisJCWdvdG8gZXhpdF9jbGVhbnVwOworCX0gZWxzZSB7CisJCWJEU1BFbmFibGVkID0gVFJVRTsKKwl9CisKKwlFbmFibGVTUkFNKHBCRERhdGEpOworCisJcEJERGF0YS0+YkRTUEVuYWJsZWQgPSBUUlVFOworCisJUFJJTlRLXzEoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQIGV4aXRcbiIpOworCisJcmV0dXJuIDA7CisKK2V4aXRfY2xlYW51cDoKKwlQUklOVEtfRVJST1IoInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQOiBDbGVhbmluZyB1cFxuIik7CisJaWYgKGJEU1BFbmFibGVkKQorCQlkc3AzNzgwSV9EaXNhYmxlRFNQKHBTZXR0aW5ncyk7CisJaWYgKGJEU1BQb3dlcmVkVXApCisJCXNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoRkFMU0UpOworCWlmIChiSW50ZXJydXB0QWxsb2NhdGVkKSB7CisJCWZyZWVfaXJxKHBTZXR0aW5ncy0+dXNEc3BJcnEsIE5VTEwpOworCQlwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkID0gRkFMU0U7CisJfQorCXJldHVybiAtRUlPOworfQorCisKK2ludCB0cDM3ODBJX0Rpc2FibGVEU1AoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpCit7CisJaW50IHJldHZhbCA9IDA7CisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0gJnBCRERhdGEtPnJEc3BTZXR0aW5nczsKKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0Rpc2FibGVEU1AgZW50cnkgcEJERGF0YSAlcFxuIiwgcEJERGF0YSk7CisKKwlpZiAocEJERGF0YS0+YkRTUEVuYWJsZWQpIHsKKwkJZHNwMzc4MElfRGlzYWJsZURTUCgmcEJERGF0YS0+ckRzcFNldHRpbmdzKTsKKwkJaWYgKHBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQpIHsKKwkJCWZyZWVfaXJxKHBTZXR0aW5ncy0+dXNEc3BJcnEsIE5VTEwpOworCQkJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IEZBTFNFOworCQl9CisJCXNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoRkFMU0UpOworCQlwQkREYXRhLT5iRFNQRW5hYmxlZCA9IEZBTFNFOworCX0KKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0Rpc2FibGVEU1AgZXhpdCByZXR2YWwgJXhcbiIsIHJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK2ludCB0cDM3ODBJX1Jlc2V0RFNQKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKQoreworCWludCByZXR2YWwgPSAwOworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9SZXNldERTUCBlbnRyeSBwQkREYXRhICVwXG4iLAorCQlwQkREYXRhKTsKKworCWlmIChkc3AzNzgwSV9SZXNldChwU2V0dGluZ3MpID09IDApIHsKKwkJRW5hYmxlU1JBTShwQkREYXRhKTsKKwl9IGVsc2UgeworCQlyZXR2YWwgPSAtRUlPOworCX0KKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX1Jlc2V0RFNQIGV4aXQgcmV0dmFsICV4XG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCitpbnQgdHAzNzgwSV9TdGFydERTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOworCisJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfU3RhcnREU1AgZW50cnkgcEJERGF0YSAlcFxuIiwgcEJERGF0YSk7CisKKwlpZiAoZHNwMzc4MElfUnVuKHBTZXR0aW5ncykgPT0gMCkgeworCQkvLyBAQlVHIEBUQkQgRW5hYmxlU1JBTShwQkREYXRhKTsKKwl9IGVsc2UgeworCQlyZXR2YWwgPSAtRUlPOworCX0KKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX1N0YXJ0RFNQIGV4aXQgcmV0dmFsICV4XG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCitpbnQgdHAzNzgwSV9RdWVyeUFiaWxpdGllcyhUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSwgTVdfQUJJTElUSUVTICogcEFiaWxpdGllcykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCSJ0cDM3ODBpOjp0cDM3ODBJX1F1ZXJ5QWJpbGl0aWVzIGVudHJ5IHBCRERhdGEgJXBcbiIsIHBCRERhdGEpOworCisJLyogZmlsbCBvdXQgc3RhbmRhcmQgY29uc3RhbnQgZmllbGRzICovCisJcEFiaWxpdGllcy0+aW5zdHJfcGVyX3NlYyA9IHBCRERhdGEtPnJEc3BTZXR0aW5ncy51SXBzOworCXBBYmlsaXRpZXMtPmRhdGFfc2l6ZSA9IHBCRERhdGEtPnJEc3BTZXR0aW5ncy51RFN0b3JlU2l6ZTsKKwlwQWJpbGl0aWVzLT5pbnN0X3NpemUgPSBwQkREYXRhLT5yRHNwU2V0dGluZ3MudUlTdG9yZVNpemU7CisJcEFiaWxpdGllcy0+YnVzX2RtYV9idyA9IHBCRERhdGEtPnJEc3BTZXR0aW5ncy51RG1hQmFuZHdpZHRoOworCisJLyogZmlsbCBvdXQgZHluYW1pY2FsbHkgZGV0ZXJtaW5lZCBmaWVsZHMgKi8KKwlwQWJpbGl0aWVzLT5jb21wb25lbnRfbGlzdFswXSA9IDB4MDAwMTAwMDAgfCBNV19BRENfTUFTSzsKKwlwQWJpbGl0aWVzLT5jb21wb25lbnRfbGlzdFsxXSA9IDB4MDAwMTAwMDAgfCBNV19BQ0lfTUFTSzsKKwlwQWJpbGl0aWVzLT5jb21wb25lbnRfbGlzdFsyXSA9IDB4MDAwMTAwMDAgfCBNV19BSUMxX01BU0s7CisJcEFiaWxpdGllcy0+Y29tcG9uZW50X2xpc3RbM10gPSAweDAwMDEwMDAwIHwgTVdfQUlDMl9NQVNLOworCXBBYmlsaXRpZXMtPmNvbXBvbmVudF9saXN0WzRdID0gMHgwMDAxMDAwMCB8IE1XX0NEREFDX01BU0s7CisJcEFiaWxpdGllcy0+Y29tcG9uZW50X2xpc3RbNV0gPSAweDAwMDEwMDAwIHwgTVdfTUlESV9NQVNLOworCXBBYmlsaXRpZXMtPmNvbXBvbmVudF9saXN0WzZdID0gMHgwMDAxMDAwMCB8IE1XX1VBUlRfTUFTSzsKKwlwQWJpbGl0aWVzLT5jb21wb25lbnRfY291bnQgPSA3OworCisJLyogRmlsbCBvdXQgTXdhdmUgT1MgYW5kIEJJT1MgdGFzayBuYW1lcyAqLworCisJbWVtY3B5KHBBYmlsaXRpZXMtPm13YXZlX29zX25hbWUsIFRQX0FCSUxJVElFU19NV0FWRU9TX05BTUUsCisJCXNpemVvZihUUF9BQklMSVRJRVNfTVdBVkVPU19OQU1FKSk7CisJbWVtY3B5KHBBYmlsaXRpZXMtPmJpb3NfdGFza19uYW1lLCBUUF9BQklMSVRJRVNfQklPU1RBU0tfTkFNRSwKKwkJc2l6ZW9mKFRQX0FCSUxJVElFU19CSU9TVEFTS19OQU1FKSk7CisKKwlQUklOVEtfMShUUkFDRV9UUDM3ODBJLAorCQkidHAzNzgwaTo6dHAzNzgwSV9RdWVyeUFiaWxpdGllcyBleGl0IHJldHZhbD1TVUNDRVNTRlVMXG4iKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCB0cDM3ODBJX1JlYWRXcml0ZURzcERTdG9yZShUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSwgdW5zaWduZWQgaW50IHVPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKnB2QnVmZmVyLCB1bnNpZ25lZCBpbnQgdUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKQoreworCWludCByZXR2YWwgPSAwOworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8gPSBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPOworCUJPT0xFQU4gYlJDID0gMDsKKworCVBSSU5US182KFRSQUNFX1RQMzc4MEksCisJCSJ0cDM3ODBpOjp0cDM3ODBJX1JlYWRXcml0ZURzcERTdG9yZSBlbnRyeSBwQkREYXRhICVwLCB1T3Bjb2RlICV4LCBwdkJ1ZmZlciAlcCwgdUNvdW50ICV4LCB1bERTUEFkZHIgJWx4XG4iLAorCQlwQkREYXRhLCB1T3Bjb2RlLCBwdkJ1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCisJaWYgKHBCRERhdGEtPmJEU1BFbmFibGVkKSB7CisJCXN3aXRjaCAodU9wY29kZSkgeworCQljYXNlIElPQ1RMX01XX1JFQURfREFUQToKKwkJCWJSQyA9IGRzcDM3ODBJX1JlYWREU3RvcmUodXNEc3BCYXNlSU8sIHB2QnVmZmVyLCB1Q291bnQsIHVsRFNQQWRkcik7CisJCQlicmVhazsKKworCQljYXNlIElPQ1RMX01XX1JFQURDTEVBUl9EQVRBOgorCQkJYlJDID0gZHNwMzc4MElfUmVhZEFuZENsZWFyRFN0b3JlKHVzRHNwQmFzZUlPLCBwdkJ1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJT0NUTF9NV19XUklURV9EQVRBOgorCQkJYlJDID0gZHNwMzc4MElfV3JpdGVEU3RvcmUodXNEc3BCYXNlSU8sIHB2QnVmZmVyLCB1Q291bnQsIHVsRFNQQWRkcik7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHZhbCA9IChiUkMpID8gLUVJTyA6IDA7CisJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfUmVhZFdyaXRlRHNwRFN0b3JlIGV4aXQgcmV0dmFsICV4XG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCitpbnQgdHAzNzgwSV9SZWFkV3JpdGVEc3BJU3RvcmUoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEsIHVuc2lnbmVkIGludCB1T3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgX191c2VyICpwdkJ1ZmZlciwgdW5zaWduZWQgaW50IHVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHVsRFNQQWRkcikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOworCXVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPID0gcFNldHRpbmdzLT51c0RzcEJhc2VJTzsKKwlCT09MRUFOIGJSQyA9IDA7CisKKwlQUklOVEtfNihUUkFDRV9UUDM3ODBJLAorCQkidHAzNzgwaTo6dHAzNzgwSV9SZWFkV3JpdGVEc3BJU3RvcmUgZW50cnkgcEJERGF0YSAlcCwgdU9wY29kZSAleCwgcHZCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKKwkJcEJERGF0YSwgdU9wY29kZSwgcHZCdWZmZXIsIHVDb3VudCwgdWxEU1BBZGRyKTsKKworCWlmIChwQkREYXRhLT5iRFNQRW5hYmxlZCkgeworCQlzd2l0Y2ggKHVPcGNvZGUpIHsKKwkJY2FzZSBJT0NUTF9NV19SRUFEX0lOU1Q6CisJCQliUkMgPSBkc3AzNzgwSV9SZWFkSVN0b3JlKHVzRHNwQmFzZUlPLCBwdkJ1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJT0NUTF9NV19XUklURV9JTlNUOgorCQkJYlJDID0gZHNwMzc4MElfV3JpdGVJU3RvcmUodXNEc3BCYXNlSU8sIHB2QnVmZmVyLCB1Q291bnQsIHVsRFNQQWRkcik7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHZhbCA9IChiUkMpID8gLUVJTyA6IDA7CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLAorCQkidHAzNzgwaTo6dHAzNzgwSV9SZWFkV3JpdGVEc3BJU3RvcmUgZXhpdCByZXR2YWwgJXhcbiIsIHJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvdHAzNzgwaS5oIGIvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzY4NWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyoKKyogdHAzNzgwaS5oIC0tIGRlY2xhcmF0aW9ucyBmb3IgdHAzNzgwaS5jCisqCisqCisqIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4gSUJNIENvcnBvcmF0aW9uCisqCisqIENvcHlyaWdodCAoQykgMTk5OSBJQk0gQ29ycG9yYXRpb24KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogTk8gV0FSUkFOVFkKKyogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyogc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisqIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorKgorKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyogREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyogVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisqIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKgorKgorKiAxMC8yMy8yMDAwIC0gQWxwaGEgUmVsZWFzZQorKglGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyovCisKKyNpZm5kZWYgX0xJTlVYX1RQMzc4MElfSAorI2RlZmluZSBfTElOVVhfVFAzNzgwSV9ICisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJtd2F2ZXB1Yi5oIgorCisKKy8qIERTUCBhYmlsaXRpZXMgY29uc3RhbnRzIGZvciAzNzgwaSBiYXNlZCBUaGlua3BhZHMgKi8KKyNkZWZpbmUgVFBfQUJJTElUSUVTX0lOVFNfUEVSX1NFQyAgICAgICAzOTE2MDgwMAorI2RlZmluZSBUUF9BQklMSVRJRVNfREFUQV9TSVpFICAgICAgICAgIDMyNzY4CisjZGVmaW5lIFRQX0FCSUxJVElFU19JTlNUX1NJWkUgICAgICAgICAgMzI3NjgKKyNkZWZpbmUgVFBfQUJJTElUSUVTX01XQVZFT1NfTkFNRSAgICAgICAibXdhdmVvczA3MDAuZHNwIgorI2RlZmluZSBUUF9BQklMSVRJRVNfQklPU1RBU0tfTkFNRSAgICAgICJtd2JpbzcwMS5kc3AiCisKKworLyogRFNQIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGZvciAzNzgwaSBiYXNlZCBUaGlua3BhZHMgKi8KKyNkZWZpbmUgVFBfQ0ZHX051bVRyYW5zZmVycyAgICAgMwkvKiAxNiB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgVFBfQ0ZHX1JlcmVxdWVzdFRpbWVyICAgMQkvKiAyIHVzZWMgKi8KKyNkZWZpbmUgVFBfQ0ZHX01FTUNTMTYgICAgICAgICAgMAkvKiBEaXNhYmxlZCwgMTYtYml0IG1lbW9yeSBhc3N1bWVkICovCisjZGVmaW5lIFRQX0NGR19Jc2FNZW1DbWRXaWR0aCAgIDMJLyogMjk1IG5zZWMgKDE2LWJpdCkgKi8KKyNkZWZpbmUgVFBfQ0ZHX0dhdGVJT0NIUkRZICAgICAgMAkvKiBObyBJT0NIUkRZIGdhdGluZyAqLworI2RlZmluZSBUUF9DRkdfRW5hYmxlUHdyTWdtdCAgICAxCS8qIEVuYWJsZSBsb3cgcG9zZXIgc3VzcGVuZC9yZXN1bWUgKi8KKyNkZWZpbmUgVFBfQ0ZHX0hCdXNUaW1lclZhbHVlIDI1NQkvKiBIQnVzIHRpbWVyIGxvYWQgdmFsdWUgKi8KKyNkZWZpbmUgVFBfQ0ZHX0Rpc2FibGVMQnVzVGltZW91dCAwCS8qIEVuYWJsZSBMQnVzIHRpbWVvdXQgKi8KKyNkZWZpbmUgVFBfQ0ZHX05fRGl2aXNvciAgICAgICAzMgkvKiBDbG9jayA9IDM5LjE2MDggTWh6ICovCisjZGVmaW5lIFRQX0NGR19NX011bHRpcGxpZXIgICAgMzcJLyogIiAqLworI2RlZmluZSBUUF9DRkdfUGxsQnlwYXNzICAgICAgICAwCS8qIGRvbid0IGJ5cGFzcyAqLworI2RlZmluZSBUUF9DRkdfQ2hpcGxldEVuYWJsZSAweEZGRkYJLyogRW5hYmxlIGFsbCBjaGlwbGV0cyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGJEU1BFbmFibGVkOworCWludCBiU2hhcmVEc3BJcnE7CisJaW50IGJTaGFyZVVhcnRJcnE7CisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyByRHNwU2V0dGluZ3M7Cit9IFRISU5LUEFEX0JEX0RBVEE7CisKK2ludCB0cDM3ODBJX0luaXRpYWxpemVCb2FyZERhdGEoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpOworaW50IHRwMzc4MElfQ2FsY1Jlc291cmNlcyhUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSk7CitpbnQgdHAzNzgwSV9DbGFpbVJlc291cmNlcyhUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSk7CitpbnQgdHAzNzgwSV9SZWxlYXNlUmVzb3VyY2VzKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKTsKK2ludCB0cDM3ODBJX0VuYWJsZURTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSk7CitpbnQgdHAzNzgwSV9EaXNhYmxlRFNQKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKTsKK2ludCB0cDM3ODBJX1Jlc2V0RFNQKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKTsKK2ludCB0cDM3ODBJX1N0YXJ0RFNQKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKTsKK2ludCB0cDM3ODBJX1F1ZXJ5QWJpbGl0aWVzKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhLCBNV19BQklMSVRJRVMgKiBwQWJpbGl0aWVzKTsKK2ludCB0cDM3ODBJX0NsZWFudXAoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpOworaW50IHRwMzc4MElfUmVhZFdyaXRlRHNwRFN0b3JlKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhLCB1bnNpZ25lZCBpbnQgdU9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIF9fdXNlciAqcHZCdWZmZXIsIHVuc2lnbmVkIGludCB1Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpOworaW50IHRwMzc4MElfUmVhZFdyaXRlRHNwSVN0b3JlKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhLCB1bnNpZ25lZCBpbnQgdU9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIF9fdXNlciAqcHZCdWZmZXIsIHVuc2lnbmVkIGludCB1Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL214c2VyLmMgYi9kcml2ZXJzL2NoYXIvbXhzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTI0NTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL214c2VyLmMKQEAgLTAsMCArMSwzMTcwIEBACisvKgorICogICAgICAgICAgbXhzZXIuYyAgLS0gTU9YQSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSBtdWx0aXBvcnQgc2VyaWFsIGRyaXZlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBNb3hhIFRlY2hub2xvZ2llcyAoc3VwcG9ydEBtb3hhLmNvbS50dykuCisgKgorICogICAgICBUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUgTGludXggc2VyaWFsIGRyaXZlciwgd3JpdHRlbiBieQorICogICAgICBMaW51cyBUb3J2YWxkcywgVGhlb2RvcmUgVCdzbyBhbmQgb3RoZXJzLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqCU9yaWdpbmFsIHJlbGVhc2UJMTAvMjYvMDAKKyAqCisgKgkwMi8wNi8wMQlTdXBwb3J0IE1PWEEgSW5kdXN0aW8gZmFtaWx5IGJvYXJkcy4KKyAqCTAyLzA2LzAxCVN1cHBvcnQgVElPQ0dJQ09VTlQuCisgKgkwMi8wNi8wMQlGaXggdGhlIHByb2JsZW0gZm9yIGNvbm5lY3RpbmcgdG8gc2VyaWFsIG1vdXNlLgorICoJMDIvMDYvMDEJRml4IHRoZSBwcm9ibGVtIGZvciBIL1cgZmxvdyBjb250cm9sLgorICoJMDIvMDYvMDEJRml4IHRoZSBjb21wbGluZyB3YXJuaW5nIHdoZW4gQ09ORklHX1BDSQorICoJCQlkb24ndCBiZSBkZWZpbmVkLgorICoKKyAqCUZlZCB0aHJvdWdoIGEgY2xlYW51cCwgaW5kZW50IGFuZCByZW1vdmUgb2Ygbm9uIDIuNiBjb2RlIGJ5IEFsYW4gQ294CisgKgk8YWxhbkByZWRoYXQuY29tPi4gVGhlIG9yaWdpbmFsIDEuOCBjb2RlIGlzIGF2YWlsYWJsZSBvbiB3d3cubW94YS5jb20uCisgKgktIEZpeGVkIHg4Nl82NCBjbGVhbm5lc3MKKyAqCS0gRml4ZWQgc2xlZXAgd2l0aCBzcGlubG9jayBoZWxkIGluIG14c2VyX3NlbmRfYnJlYWsKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvYXV0b2NvbmYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJteHNlci5oIgorCisjZGVmaW5lCU1YU0VSX1ZFUlNJT04JIjEuOCIKKyNkZWZpbmUJTVhTRVJNQUpPUgkgMTc0CisjZGVmaW5lCU1YU0VSQ1VNQUpPUgkgMTc1CisKKyNkZWZpbmUJTVhTRVJfRVZFTlRfVFhMT1cJIDEKKyNkZWZpbmUJTVhTRVJfRVZFTlRfSEFOR1VQCSAyCisKKyNkZWZpbmUgTVhTRVJfQk9BUkRTCQk0CS8qIE1heC4gYm9hcmRzICovCisjZGVmaW5lIE1YU0VSX1BPUlRTCQkzMgkvKiBNYXguIHBvcnRzICovCisjZGVmaW5lIE1YU0VSX1BPUlRTX1BFUl9CT0FSRAk4CS8qIE1heC4gcG9ydHMgcGVyIGJvYXJkICovCisjZGVmaW5lIE1YU0VSX0lTUl9QQVNTX0xJTUlUCTI1NgorCisjZGVmaW5lCU1YU0VSX0VSUl9JT0FERFIJLTEKKyNkZWZpbmUJTVhTRVJfRVJSX0lSUQkJLTIKKyNkZWZpbmUJTVhTRVJfRVJSX0lSUV9DT05GTElUCS0zCisjZGVmaW5lCU1YU0VSX0VSUl9WRUNUT1IJLTQKKworI2RlZmluZSBTRVJJQUxfVFlQRV9OT1JNQUwJMQorI2RlZmluZSBTRVJJQUxfVFlQRV9DQUxMT1VUCTIKKworI2RlZmluZSBXQUtFVVBfQ0hBUlMJCTI1NgorCisjZGVmaW5lIFVBUlRfTUNSX0FGRQkJMHgyMAorI2RlZmluZSBVQVJUX0xTUl9TUEVDSUFMCTB4MUUKKworI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykJKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDS3xJWE9OfElYT0ZGKSkKKworI2RlZmluZSBJUlFfVChpbmZvKSAoKGluZm8tPmZsYWdzICYgQVNZTkNfU0hBUkVfSVJRKSA/IFNBX1NISVJRIDogU0FfSU5URVJSVVBUKQorCisjZGVmaW5lIEMxNjhfQVNJQ19JRCAgICAxCisjZGVmaW5lIEMxMDRfQVNJQ19JRCAgICAyCisjZGVmaW5lIEMxMDJfQVNJQ19JRAkweEIKKyNkZWZpbmUgQ0kxMzJfQVNJQ19JRAk0CisjZGVmaW5lIENJMTM0X0FTSUNfSUQJMworI2RlZmluZSBDSTEwNEpfQVNJQ19JRCAgNQorCitlbnVtIHsKKwlNWFNFUl9CT0FSRF9DMTY4X0lTQSA9IDEsCisJTVhTRVJfQk9BUkRfQzEwNF9JU0EsCisJTVhTRVJfQk9BUkRfQ0kxMDRKLAorCU1YU0VSX0JPQVJEX0MxNjhfUENJLAorCU1YU0VSX0JPQVJEX0MxMDRfUENJLAorCU1YU0VSX0JPQVJEX0MxMDJfSVNBLAorCU1YU0VSX0JPQVJEX0NJMTMyLAorCU1YU0VSX0JPQVJEX0NJMTM0LAorCU1YU0VSX0JPQVJEX0NQMTMyLAorCU1YU0VSX0JPQVJEX0NQMTE0LAorCU1YU0VSX0JPQVJEX0NUMTE0LAorCU1YU0VSX0JPQVJEX0NQMTAyLAorCU1YU0VSX0JPQVJEX0NQMTA0VSwKKwlNWFNFUl9CT0FSRF9DUDE2OFUsCisJTVhTRVJfQk9BUkRfQ1AxMzJVLAorCU1YU0VSX0JPQVJEX0NQMTM0VSwKKwlNWFNFUl9CT0FSRF9DUDEwNEpVLAorCU1YU0VSX0JPQVJEX1JDNzAwMCwKKwlNWFNFUl9CT0FSRF9DUDExOFUsCisJTVhTRVJfQk9BUkRfQ1AxMDJVTCwKKwlNWFNFUl9CT0FSRF9DUDEwMlUsCit9OworCitzdGF0aWMgY2hhciAqbXhzZXJfYnJkbmFtZVtdID0geworCSJDMTY4IHNlcmllcyIsCisJIkMxMDQgc2VyaWVzIiwKKwkiQ0ktMTA0SiBzZXJpZXMiLAorCSJDMTY4SC9QQ0kgc2VyaWVzIiwKKwkiQzEwNEgvUENJIHNlcmllcyIsCisJIkMxMDIgc2VyaWVzIiwKKwkiQ0ktMTMyIHNlcmllcyIsCisJIkNJLTEzNCBzZXJpZXMiLAorCSJDUC0xMzIgc2VyaWVzIiwKKwkiQ1AtMTE0IHNlcmllcyIsCisJIkNULTExNCBzZXJpZXMiLAorCSJDUC0xMDIgc2VyaWVzIiwKKwkiQ1AtMTA0VSBzZXJpZXMiLAorCSJDUC0xNjhVIHNlcmllcyIsCisJIkNQLTEzMlUgc2VyaWVzIiwKKwkiQ1AtMTM0VSBzZXJpZXMiLAorCSJDUC0xMDRKVSBzZXJpZXMiLAorCSJNb3hhIFVDNzAwMCBTZXJpYWwiLAorCSJDUC0xMThVIHNlcmllcyIsCisJIkNQLTEwMlVMIHNlcmllcyIsCisJIkNQLTEwMlUgc2VyaWVzIiwKK307CisKK3N0YXRpYyBpbnQgbXhzZXJfbnVtcG9ydHNbXSA9IHsKKwk4LAkJCS8vIEMxNjgtSVNBCisJNCwJCQkvLyBDMTA0LUlTQQorCTQsCQkJLy8gQ0kxMDRKCisJOCwJCQkvLyBDMTY4LVBDSQorCTQsCQkJLy8gQzEwNC1QQ0kKKwkyLAkJCS8vIEMxMDItSVNBCisJMiwJCQkvLyBDSTEzMgorCTQsCQkJLy8gQ0kxMzQKKwkyLAkJCS8vIENQMTMyCisJNCwJCQkvLyBDUDExNAorCTQsCQkJLy8gQ1QxMTQKKwkyLAkJCS8vIENQMTAyCisJNCwJCQkvLyBDUDEwNFUKKwk4LAkJCS8vIENQMTY4VQorCTIsCQkJLy8gQ1AxMzJVCisJNCwJCQkvLyBDUDEzNFUKKwk0LAkJCS8vIENQMTA0SlUKKwk4LAkJCS8vIFJDNzAwMAorCTgsCQkJLy8gQ1AxMThVIAorCTIsCQkJLy8gQ1AxMDJVTCAKKwkyLAkJCS8vIENQMTAyVQorfTsKKworI2RlZmluZSBVQVJUX1RZUEVfTlVNCTIKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBHbW94YV91YXJ0X2lkW1VBUlRfVFlQRV9OVU1dID0geworCU1PWEFfTVVTVF9NVTE1MF9IV0lELAorCU1PWEFfTVVTVF9NVTg2MF9IV0lECit9OworCisvLyBUaGlzIGlzIG9ubHkgZm9yIFBDSQorI2RlZmluZSBVQVJUX0lORk9fTlVNCTMKK3N0cnVjdCBteHBjaXVhcnRfaW5mbyB7CisJaW50IHR5cGU7CisJaW50IHR4X2ZpZm87CisJaW50IHJ4X2ZpZm87CisJaW50IHhtaXRfZmlmb19zaXplOworCWludCByeF9oaWdoX3dhdGVyOworCWludCByeF90cmlnZ2VyOworCWludCByeF9sb3dfd2F0ZXI7CisJbG9uZyBtYXhfYmF1ZDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhwY2l1YXJ0X2luZm8gR3BjaV91YXJ0X2luZm9bVUFSVF9JTkZPX05VTV0gPSB7CisJe01PWEFfT1RIRVJfVUFSVCwgMTYsIDE2LCAxNiwgMTQsIDE0LCAxLCA5MjE2MDBMfSwKKwl7TU9YQV9NVVNUX01VMTUwX0hXSUQsIDY0LCA2NCwgNjQsIDQ4LCA0OCwgMTYsIDIzMDQwMEx9LAorCXtNT1hBX01VU1RfTVU4NjBfSFdJRCwgMTI4LCAxMjgsIDEyOCwgOTYsIDk2LCAzMiwgOTIxNjAwTH0KK307CisKKworI2lmZGVmIENPTkZJR19QQ0kKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG14c2VyX3BjaWJyZHNbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQzE2OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQzE2OF9QQ0l9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DMTA0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DMTA0X1BDSX0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTMyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDEzMn0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTE0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDExNH0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NUMTE0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DVDExNH0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDEwMn0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTA0VSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMDRVfSwKKwl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxNjhVLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDE2OFV9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEzMlUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YU0VSX0JPQVJEX0NQMTMyVX0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTM0VSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMzRVfSwKKwl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMDRKVSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMDRKVX0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX1JDNzAwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfUkM3MDAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMThVLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDExOFV9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwMlVMLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDEwMlVMfSwKKwl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMDJVLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDEwMlV9LAorCXswfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG14c2VyX3BjaWJyZHMpOworCisKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfbW94YV9wY2lfaW5mbyB7CisJdW5zaWduZWQgc2hvcnQgYnVzTnVtOworCXVuc2lnbmVkIHNob3J0IGRldk51bTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDYtMjMtMjAwMworfSBtb3hhX3BjaV9pbmZvOworCitzdGF0aWMgaW50IGlvYWRkcltNWFNFUl9CT0FSRFNdID0geyAwLCAwLCAwLCAwIH07CitzdGF0aWMgaW50IHR0eW1ham9yID0gTVhTRVJNQUpPUjsKK3N0YXRpYyBpbnQgY2FsbG91dG1ham9yID0gTVhTRVJDVU1BSk9SOworc3RhdGljIGludCB2ZXJib3NlID0gMDsKKworLyogVmFyaWFibGVzIGZvciBpbnNtb2QgKi8KKworTU9EVUxFX0FVVEhPUigiQ2FzcGVyIFlhbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiTU9YQSBTbWFydGlvL0luZHVzdGlvIEZhbWlseSBNdWx0aXBvcnQgQm9hcmQgRGV2aWNlIERyaXZlciIpOworTU9EVUxFX1BBUk0oaW9hZGRyLCAiMS00aSIpOworTU9EVUxFX1BBUk0odHR5bWFqb3IsICJpIik7CitNT0RVTEVfUEFSTShjYWxsb3V0bWFqb3IsICJpIik7CitNT0RVTEVfUEFSTSh2ZXJib3NlLCAiaSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgbXhzZXJfbG9nIHsKKwlpbnQgdGljazsKKwl1bnNpZ25lZCBsb25nIHJ4Y250W01YU0VSX1BPUlRTXTsKKwl1bnNpZ25lZCBsb25nIHR4Y250W01YU0VSX1BPUlRTXTsKK307CisKKworc3RydWN0IG14c2VyX21vbiB7CisJdW5zaWduZWQgbG9uZyByeGNudDsKKwl1bnNpZ25lZCBsb25nIHR4Y250OworCXVuc2lnbmVkIGxvbmcgdXBfcnhjbnQ7CisJdW5zaWduZWQgbG9uZyB1cF90eGNudDsKKwlpbnQgbW9kZW1fc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgaG9sZF9yZWFzb247Cit9OworCitzdHJ1Y3QgbXhzZXJfbW9uX2V4dCB7CisJdW5zaWduZWQgbG9uZyByeF9jbnRbMzJdOworCXVuc2lnbmVkIGxvbmcgdHhfY250WzMyXTsKKwl1bnNpZ25lZCBsb25nIHVwX3J4Y250WzMyXTsKKwl1bnNpZ25lZCBsb25nIHVwX3R4Y250WzMyXTsKKwlpbnQgbW9kZW1fc3RhdHVzWzMyXTsKKworCWxvbmcgYmF1ZHJhdGVbMzJdOworCWludCBkYXRhYml0c1szMl07CisJaW50IHN0b3BiaXRzWzMyXTsKKwlpbnQgcGFyaXR5WzMyXTsKKwlpbnQgZmxvd2N0cmxbMzJdOworCWludCBmaWZvWzMyXTsKKwlpbnQgaWZ0eXBlWzMyXTsKK307CitzdHJ1Y3QgbXhzZXJfaHdjb25mIHsKKwlpbnQgYm9hcmRfdHlwZTsKKwlpbnQgcG9ydHM7CisJaW50IGlycTsKKwlpbnQgdmVjdG9yOworCWludCB2ZWN0b3JfbWFzazsKKwlpbnQgdWFydF90eXBlOworCWludCBpb2FkZHJbTVhTRVJfUE9SVFNfUEVSX0JPQVJEXTsKKwlpbnQgYmF1ZF9iYXNlW01YU0VSX1BPUlRTX1BFUl9CT0FSRF07CisJbW94YV9wY2lfaW5mbyBwY2lJbmZvOworCWludCBJc01veGFNdXN0Q2hpcEZsYWc7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwlpbnQgTWF4Q2FuU2V0QmF1ZFJhdGVbTVhTRVJfUE9SVFNfUEVSX0JPQVJEXTsJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDktMDQtMjAwMgorCWludCBvcG1vZGVfaW9hZGRyW01YU0VSX1BPUlRTX1BFUl9CT0FSRF07CS8vIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQKK307CisKK3N0cnVjdCBteHNlcl9zdHJ1Y3QgeworCWludCBwb3J0OworCWludCBiYXNlOwkJLyogcG9ydCBiYXNlIGFkZHJlc3MgKi8KKwlpbnQgaXJxOwkJLyogcG9ydCB1c2luZyBpcnEgbm8uICovCisJaW50IHZlY3RvcjsJCS8qIHBvcnQgaXJxIHZlY3RvciAqLworCWludCB2ZWN0b3JtYXNrOwkJLyogcG9ydCB2ZWN0b3IgbWFzayAqLworCWludCByeF9oaWdoX3dhdGVyOworCWludCByeF90cmlnZ2VyOwkJLyogUnggZmlmbyB0cmlnZ2VyIGxldmVsICovCisJaW50IHJ4X2xvd193YXRlcjsKKwlpbnQgYmF1ZF9iYXNlOwkJLyogbWF4LiBzcGVlZCAqLworCWludCBmbGFnczsJCS8qIGRlZmluZWQgaW4gdHR5LmggKi8KKwlpbnQgdHlwZTsJCS8qIFVBUlQgdHlwZSAqLworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IHJlYWRfc3RhdHVzX21hc2s7CisJaW50IGlnbm9yZV9zdGF0dXNfbWFzazsKKwlpbnQgeG1pdF9maWZvX3NpemU7CisJaW50IGN1c3RvbV9kaXZpc29yOworCWludCB4X2NoYXI7CQkvKiB4b24veG9mZiBjaGFyYWN0ZXIgKi8KKwlpbnQgY2xvc2VfZGVsYXk7CisJdW5zaWduZWQgc2hvcnQgY2xvc2luZ193YWl0OworCWludCBJRVI7CQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisJaW50IE1DUjsJCS8qIE1vZGVtIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBsb25nIGV2ZW50OworCWludCBjb3VudDsJCS8qICMgb2YgZmQgb24gZGV2aWNlICovCisJaW50IGJsb2NrZWRfb3BlbjsJLyogIyBvZiBibG9ja2VkIG9wZW5zICovCisJbG9uZyBzZXNzaW9uOwkJLyogU2Vzc2lvbiBvZiBvcGVuaW5nIHByb2Nlc3MgKi8KKwlsb25nIHBncnA7CQkvKiBwZ3JwIG9mIG9wZW5pbmcgcHJvY2VzcyAqLworCXVuc2lnbmVkIGNoYXIgKnhtaXRfYnVmOworCWludCB4bWl0X2hlYWQ7CisJaW50IHhtaXRfdGFpbDsKKwlpbnQgeG1pdF9jbnQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHRxdWV1ZTsKKwlzdHJ1Y3QgdGVybWlvcyBub3JtYWxfdGVybWlvczsKKwlzdHJ1Y3QgdGVybWlvcyBjYWxsb3V0X3Rlcm1pb3M7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IGNsb3NlX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgZGVsdGFfbXNyX3dhaXQ7CisJc3RydWN0IGFzeW5jX2ljb3VudCBpY291bnQ7CS8qIGtlcm5lbCBjb3VudGVycyBmb3IgdGhlIDQgaW5wdXQgaW50ZXJydXB0cyAqLworCWludCB0aW1lb3V0OworCWludCBJc01veGFNdXN0Q2hpcEZsYWc7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwlpbnQgTWF4Q2FuU2V0QmF1ZFJhdGU7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTA0LTIwMDIKKwlpbnQgb3Btb2RlX2lvYWRkcjsJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDEtMDUtMjAwNAorCXVuc2lnbmVkIGNoYXIgc3RvcF9yeDsKKwl1bnNpZ25lZCBjaGFyIGxkaXNjX3N0b3Bfcng7CisJbG9uZyByZWFsYmF1ZDsKKwlzdHJ1Y3QgbXhzZXJfbW9uIG1vbl9kYXRhOworCXVuc2lnbmVkIGNoYXIgZXJyX3NoYWRvdzsKKwlzcGlubG9ja190IHNsb2NrOworfTsKKworCitzdHJ1Y3QgbXhzZXJfbXN0YXR1cyB7CisJdGNmbGFnX3QgY2ZsYWc7CisJaW50IGN0czsKKwlpbnQgZHNyOworCWludCByaTsKKwlpbnQgZGNkOworfTsKKworc3RhdGljIHN0cnVjdCBteHNlcl9tc3RhdHVzIEdNU3RhdHVzW01YU0VSX1BPUlRTXTsKKworc3RhdGljIGludCBteHNlckJvYXJkQ0FQW01YU0VSX0JPQVJEU10gPSB7CisJMCwgMCwgMCwgMAorCSAgICAvKiAgMHgxODAsIDB4MjgwLCAweDIwMCwgMHgzMjAgICAqLworfTsKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpteHZhcl9zZHJpdmVyOworc3RhdGljIHN0cnVjdCBteHNlcl9zdHJ1Y3QgbXh2YXJfdGFibGVbTVhTRVJfUE9SVFNdOworc3RhdGljIHN0cnVjdCB0dHlfc3RydWN0ICpteHZhcl90dHlbTVhTRVJfUE9SVFMgKyAxXTsKK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcyAqbXh2YXJfdGVybWlvc1tNWFNFUl9QT1JUUyArIDFdOworc3RhdGljIHN0cnVjdCB0ZXJtaW9zICpteHZhcl90ZXJtaW9zX2xvY2tlZFtNWFNFUl9QT1JUUyArIDFdOworc3RhdGljIHN0cnVjdCBteHNlcl9sb2cgbXh2YXJfbG9nOworc3RhdGljIGludCBteHZhcl9kaWFnZmxhZzsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG14c2VyX21zcltNWFNFUl9QT1JUUyArIDFdOworc3RhdGljIHN0cnVjdCBteHNlcl9tb25fZXh0IG1vbl9kYXRhX2V4dDsKK3N0YXRpYyBpbnQgbXhzZXJfc2V0X2JhdWRfbWV0aG9kW01YU0VSX1BPUlRTICsgMV07CitzdGF0aWMgc3BpbmxvY2tfdCBnbV9sb2NrOworCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGZpZ3VyZSBvdXQgdGhlIGRpdmlzb3Igc3BlZWRzIGFuZCB0aGUgdGltZW91dHMKKyAqLworCitzdGF0aWMgc3RydWN0IG14c2VyX2h3Y29uZiBteHNlcmNmZ1tNWFNFUl9CT0FSRFNdOworCisvKgorICogc3RhdGljIGZ1bmN0aW9uczoKKyAqLworCitzdGF0aWMgdm9pZCBteHNlcl9nZXRjZmcoaW50IGJvYXJkLCBzdHJ1Y3QgbXhzZXJfaHdjb25mICpod2NvbmYpOworc3RhdGljIGludCBteHNlcl9pbml0KHZvaWQpOworCisvL3N0YXRpYyB2b2lkICAgbXhzZXJfcG9sbCh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBpbnQgbXhzZXJfZ2V0X0lTQV9jb25mKGludCwgc3RydWN0IG14c2VyX2h3Y29uZiAqKTsKK3N0YXRpYyBpbnQgbXhzZXJfZ2V0X1BDSV9jb25mKGludCwgaW50LCBpbnQsIHN0cnVjdCBteHNlcl9od2NvbmYgKik7CitzdGF0aWMgdm9pZCBteHNlcl9kb19zb2Z0aW50KHZvaWQgKik7CitzdGF0aWMgaW50IG14c2VyX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgdm9pZCBteHNlcl9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgbXhzZXJfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBteHNlcl93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbXhzZXJfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIGludCBteHNlcl9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBteHNlcl9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICosIHVuc2lnbmVkIGNoYXIpOworc3RhdGljIGludCBteHNlcl9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLCB1aW50LCB1bG9uZyk7CitzdGF0aWMgaW50IG14c2VyX2lvY3RsX3NwZWNpYWwodW5zaWduZWQgaW50LCB2b2lkIF9fdXNlciAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbXhzZXJfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCB0ZXJtaW9zICopOworc3RhdGljIHZvaWQgbXhzZXJfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbXhzZXJfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbXhzZXJfcnNfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgaW50KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBteHNlcl9pbnRlcnJ1cHQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIHZvaWQgbXhzZXJfcmVjZWl2ZV9jaGFycyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICosIGludCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3RyYW5zbWl0X2NoYXJzKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBteHNlcl9jaGVja19tb2RlbV9zdGF0dXMoc3RydWN0IG14c2VyX3N0cnVjdCAqLCBpbnQpOworc3RhdGljIGludCBteHNlcl9ibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwgc3RydWN0IG14c2VyX3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgbXhzZXJfc3RhcnR1cChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopOworc3RhdGljIHZvaWQgbXhzZXJfc2h1dGRvd24oc3RydWN0IG14c2VyX3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgbXhzZXJfY2hhbmdlX3NwZWVkKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKiwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKTsKK3N0YXRpYyBpbnQgbXhzZXJfZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKiwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopOworc3RhdGljIGludCBteHNlcl9zZXRfc2VyaWFsX2luZm8oc3RydWN0IG14c2VyX3N0cnVjdCAqLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKik7CitzdGF0aWMgaW50IG14c2VyX2dldF9sc3JfaW5mbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICosIHVuc2lnbmVkIGludCBfX3VzZXIgKik7CitzdGF0aWMgdm9pZCBteHNlcl9zZW5kX2JyZWFrKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKiwgaW50KTsKK3N0YXRpYyBpbnQgbXhzZXJfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50IG14c2VyX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyBpbnQgbXhzZXJfc2V0X2JhdWQoc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbywgbG9uZyBuZXdzcGQpOworc3RhdGljIHZvaWQgbXhzZXJfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKKworc3RhdGljIHZvaWQgbXhzZXJfc3RhcnRyeChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIG14c2VyX3N0b3ByeChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKKworCitzdGF0aWMgaW50IENoZWNrSXNNb3hhTXVzdChpbnQgaW8pCit7CisJdTggb2xkbWNyLCBod2lkOworCWludCBpOworCisJb3V0YigwLCBpbyArIFVBUlRfTENSKTsKKwlESVNBQkxFX01PWEFfTVVTVF9FTkNIQU5DRV9NT0RFKGlvKTsKKwlvbGRtY3IgPSBpbmIoaW8gKyBVQVJUX01DUik7CisJb3V0YigwLCBpbyArIFVBUlRfTUNSKTsKKwlTRVRfTU9YQV9NVVNUX1hPTjFfVkFMVUUoaW8sIDB4MTEpOworCWlmICgoaHdpZCA9IGluYihpbyArIFVBUlRfTUNSKSkgIT0gMCkgeworCQlvdXRiKG9sZG1jciwgaW8gKyBVQVJUX01DUik7CisJCXJldHVybiAoTU9YQV9PVEhFUl9VQVJUKTsKKwl9CisKKwlHRVRfTU9YQV9NVVNUX0hBUkRXQVJFX0lEKGlvLCAmaHdpZCk7CisJZm9yIChpID0gMDsgaSA8IFVBUlRfVFlQRV9OVU07IGkrKykgeworCQlpZiAoaHdpZCA9PSBHbW94YV91YXJ0X2lkW2ldKQorCQkJcmV0dXJuIChpbnQpIGh3aWQ7CisJfQorCXJldHVybiBNT1hBX09USEVSX1VBUlQ7Cit9CisKKy8vIGFib3ZlIGlzIG1vZGlmaWVkIGJ5IFZpY3RvciBZdS4gMDgtMTUtMjAwMgorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIG14c2VyX29wcyA9IHsKKwkub3BlbiA9IG14c2VyX29wZW4sCisJLmNsb3NlID0gbXhzZXJfY2xvc2UsCisJLndyaXRlID0gbXhzZXJfd3JpdGUsCisJLnB1dF9jaGFyID0gbXhzZXJfcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gbXhzZXJfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSBteHNlcl93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBteHNlcl9jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciA9IG14c2VyX2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSBteHNlcl9pb2N0bCwKKwkudGhyb3R0bGUgPSBteHNlcl90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IG14c2VyX3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zID0gbXhzZXJfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSBteHNlcl9zdG9wLAorCS5zdGFydCA9IG14c2VyX3N0YXJ0LAorCS5oYW5ndXAgPSBteHNlcl9oYW5ndXAsCisJLnRpb2NtZ2V0ID0gbXhzZXJfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gbXhzZXJfdGlvY21zZXQsCit9OworCisvKgorICogVGhlIE1PWEEgU21hcnRpby9JbmR1c3RpbyBzZXJpYWwgZHJpdmVyIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBjb2RlIQorICovCisKK3N0YXRpYyBpbnQgX19pbml0IG14c2VyX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICh2ZXJib3NlKQorCQlwcmludGsoS0VSTl9ERUJVRyAiTG9hZGluZyBtb2R1bGUgbXhzZXIgLi4uXG4iKTsKKwlyZXQgPSBteHNlcl9pbml0KCk7CisJaWYgKHZlcmJvc2UpCisJCXByaW50ayhLRVJOX0RFQlVHICJEb25lLlxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG14c2VyX21vZHVsZV9leGl0KHZvaWQpCit7CisJaW50IGksIGVyciA9IDA7CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVubG9hZGluZyBtb2R1bGUgbXhzZXIgLi4uXG4iKTsKKworCWlmICgoZXJyIHw9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihteHZhcl9zZHJpdmVyKSkpCisJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgdW5yZWdpc3RlciBNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gZmFtaWx5IHNlcmlhbCBkcml2ZXJcbiIpOworCisJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKSB7CisJCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJCWlmIChteHNlcmNmZ1tpXS5ib2FyZF90eXBlID09IC0xKQorCQkJY29udGludWU7CisJCWVsc2UgeworCQkJcGRldiA9IG14c2VyY2ZnW2ldLnBjaUluZm8ucGRldjsKKwkJCWZyZWVfaXJxKG14c2VyY2ZnW2ldLmlycSwgJm14dmFyX3RhYmxlW2kgKiBNWFNFUl9QT1JUU19QRVJfQk9BUkRdKTsKKwkJCWlmIChwZGV2ICE9IE5VTEwpIHsJLy9QQ0kKKwkJCQlyZWxlYXNlX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpOworCQkJCXJlbGVhc2VfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAzKSk7CisJCQl9IGVsc2UgeworCQkJCXJlbGVhc2VfcmVnaW9uKG14c2VyY2ZnW2ldLmlvYWRkclswXSwgOCAqIG14c2VyY2ZnW2ldLnBvcnRzKTsKKwkJCQlyZWxlYXNlX3JlZ2lvbihteHNlcmNmZ1tpXS52ZWN0b3IsIDEpOworCQkJfQorCQl9CisJfQorCWlmICh2ZXJib3NlKQorCQlwcmludGsoS0VSTl9ERUJVRyAiRG9uZS5cbiIpOworCit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfdHhyeF9maWZvKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8pCit7CisJaW50IGk7CisKKwlpZiAoKGluZm8tPnR5cGUgPT0gUE9SVF8xNjQ1MCkgfHwgKGluZm8tPnR5cGUgPT0gUE9SVF84MjUwKSkgeworCQlpbmZvLT5yeF90cmlnZ2VyID0gMTsKKwkJaW5mby0+cnhfaGlnaF93YXRlciA9IDE7CisJCWluZm8tPnJ4X2xvd193YXRlciA9IDE7CisJCWluZm8tPnhtaXRfZmlmb19zaXplID0gMTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgVUFSVF9JTkZPX05VTTsgaSsrKSB7CisJCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnID09IEdwY2lfdWFydF9pbmZvW2ldLnR5cGUpIHsKKwkJCQlpbmZvLT5yeF90cmlnZ2VyID0gR3BjaV91YXJ0X2luZm9baV0ucnhfdHJpZ2dlcjsKKwkJCQlpbmZvLT5yeF9sb3dfd2F0ZXIgPSBHcGNpX3VhcnRfaW5mb1tpXS5yeF9sb3dfd2F0ZXI7CisJCQkJaW5mby0+cnhfaGlnaF93YXRlciA9IEdwY2lfdWFydF9pbmZvW2ldLnJ4X2hpZ2hfd2F0ZXI7CisJCQkJaW5mby0+eG1pdF9maWZvX3NpemUgPSBHcGNpX3VhcnRfaW5mb1tpXS54bWl0X2ZpZm9fc2l6ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCBteHNlcl9pbml0YnJkKGludCBib2FyZCwgc3RydWN0IG14c2VyX2h3Y29uZiAqaHdjb25mKQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm87CisJaW50IHJldHZhbDsKKwlpbnQgaSwgbjsKKworCW4gPSBib2FyZCAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRDsKKwlpbmZvID0gJm14dmFyX3RhYmxlW25dOworCS8qaWYgKHZlcmJvc2UpICovICB7CisJCXByaW50ayhLRVJOX0RFQlVHICIgICAgICAgIHR0eU0lZCAtIHR0eU0lZCAiLCBuLCBuICsgaHdjb25mLT5wb3J0cyAtIDEpOworCQlwcmludGsoIiBtYXguIGJhdWQgcmF0ZSA9ICVkIGJwcy5cbiIsIGh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbMF0pOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBod2NvbmYtPnBvcnRzOyBpKyssIG4rKywgaW5mbysrKSB7CisJCWluZm8tPnBvcnQgPSBuOworCQlpbmZvLT5iYXNlID0gaHdjb25mLT5pb2FkZHJbaV07CisJCWluZm8tPmlycSA9IGh3Y29uZi0+aXJxOworCQlpbmZvLT52ZWN0b3IgPSBod2NvbmYtPnZlY3RvcjsKKwkJaW5mby0+dmVjdG9ybWFzayA9IGh3Y29uZi0+dmVjdG9yX21hc2s7CisJCWluZm8tPm9wbW9kZV9pb2FkZHIgPSBod2NvbmYtPm9wbW9kZV9pb2FkZHJbaV07CS8vIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQKKwkJaW5mby0+c3RvcF9yeCA9IDA7CisJCWluZm8tPmxkaXNjX3N0b3BfcnggPSAwOworCisJCWluZm8tPklzTW94YU11c3RDaGlwRmxhZyA9IGh3Y29uZi0+SXNNb3hhTXVzdENoaXBGbGFnOworCQkvL0VuaGFuY2UgbW9kZSBlbmFibGVkIGhlcmUKKwkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZyAhPSBNT1hBX09USEVSX1VBUlQpIHsKKwkJCUVOQUJMRV9NT1hBX01VU1RfRU5DSEFOQ0VfTU9ERShpbmZvLT5iYXNlKTsKKwkJfQorCisJCWluZm8tPmZsYWdzID0gQVNZTkNfU0hBUkVfSVJROworCQlpbmZvLT50eXBlID0gaHdjb25mLT51YXJ0X3R5cGU7CisJCWluZm8tPmJhdWRfYmFzZSA9IGh3Y29uZi0+YmF1ZF9iYXNlW2ldOworCisJCWluZm8tPk1heENhblNldEJhdWRSYXRlID0gaHdjb25mLT5NYXhDYW5TZXRCYXVkUmF0ZVtpXTsKKworCQlwcm9jZXNzX3R4cnhfZmlmbyhpbmZvKTsKKworCisJCWluZm8tPmN1c3RvbV9kaXZpc29yID0gaHdjb25mLT5iYXVkX2Jhc2VbaV0gKiAxNjsKKwkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1ICogSFogLyAxMDsKKwkJaW5mby0+Y2xvc2luZ193YWl0ID0gMzAgKiBIWjsKKwkJSU5JVF9XT1JLKCZpbmZvLT50cXVldWUsIG14c2VyX2RvX3NvZnRpbnQsIGluZm8pOworCQlpbmZvLT5ub3JtYWxfdGVybWlvcyA9IG14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvczsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+b3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKwkJbWVtc2V0KCZpbmZvLT5tb25fZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBteHNlcl9tb24pKTsKKwkJaW5mby0+ZXJyX3NoYWRvdyA9IDA7CisJCXNwaW5fbG9ja19pbml0KCZpbmZvLT5zbG9jayk7CisJfQorCS8qCisJICogQWxsb2NhdGUgdGhlIElSUSBpZiBuZWNlc3NhcnkKKwkgKi8KKworCisJLyogYmVmb3JlIHNldCBJTlQgSVNSLCBkaXNhYmxlIGFsbCBpbnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaHdjb25mLT5wb3J0czsgaSsrKSB7CisJCW91dGIoaW5iKGh3Y29uZi0+aW9hZGRyW2ldICsgVUFSVF9JRVIpICYgMHhmMCwgaHdjb25mLT5pb2FkZHJbaV0gKyBVQVJUX0lFUik7CisJfQorCisJbiA9IGJvYXJkICogTVhTRVJfUE9SVFNfUEVSX0JPQVJEOworCWluZm8gPSAmbXh2YXJfdGFibGVbbl07CisKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShod2NvbmYtPmlycSwgbXhzZXJfaW50ZXJydXB0LCBJUlFfVChpbmZvKSwgIm14c2VyIiwgaW5mbyk7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgIkJvYXJkICVkOiAlcyIsIGJvYXJkLCBteHNlcl9icmRuYW1lW2h3Y29uZi0+Ym9hcmRfdHlwZSAtIDFdKTsKKwkJcHJpbnRrKCIgIFJlcXVlc3QgaXJxIGZhaWwsSVJRICglZCkgbWF5IGJlIGNvbmZsaXQgd2l0aCBhbm90aGVyIGRldmljZS5cbiIsIGluZm8tPmlycSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIG14c2VyX2dldGNmZyhpbnQgYm9hcmQsIHN0cnVjdCBteHNlcl9od2NvbmYgKmh3Y29uZikKK3sKKwlteHNlcmNmZ1tib2FyZF0gPSAqaHdjb25mOworfQorCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGludCBteHNlcl9nZXRfUENJX2NvbmYoaW50IGJ1c251bSwgaW50IGRldm51bSwgaW50IGJvYXJkX3R5cGUsIHN0cnVjdCBteHNlcl9od2NvbmYgKmh3Y29uZikKK3sKKwlpbnQgaSwgajsKKy8vICAgICAgdW5zaWduZWQgaW50ICAgIHZhbDsKKwl1bnNpZ25lZCBpbnQgaW9hZGRyZXNzOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaHdjb25mLT5wY2lJbmZvLnBkZXY7CisKKwkvL2lvIGFkZHJlc3MKKwlod2NvbmYtPmJvYXJkX3R5cGUgPSBib2FyZF90eXBlOworCWh3Y29uZi0+cG9ydHMgPSBteHNlcl9udW1wb3J0c1tib2FyZF90eXBlIC0gMV07CisJaW9hZGRyZXNzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOworCXJlcXVlc3RfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSwgIm14c2VyKElPKSIpOworCisJZm9yIChpID0gMDsgaSA8IGh3Y29uZi0+cG9ydHM7IGkrKykgeworCQlod2NvbmYtPmlvYWRkcltpXSA9IGlvYWRkcmVzcyArIDggKiBpOworCX0KKworCS8vdmVjdG9yCisJaW9hZGRyZXNzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpOworCXJlcXVlc3RfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAzKSwgIm14c2VyKHZlY3RvcikiKTsKKwlod2NvbmYtPnZlY3RvciA9IGlvYWRkcmVzczsKKworCS8vaXJxCisJaHdjb25mLT5pcnEgPSBod2NvbmYtPnBjaUluZm8ucGRldi0+aXJxOworCisJaHdjb25mLT5Jc01veGFNdXN0Q2hpcEZsYWcgPSBDaGVja0lzTW94YU11c3QoaHdjb25mLT5pb2FkZHJbMF0pOworCWh3Y29uZi0+dWFydF90eXBlID0gUE9SVF8xNjU1MEE7CisJaHdjb25mLT52ZWN0b3JfbWFzayA9IDA7CisKKworCWZvciAoaSA9IDA7IGkgPCBod2NvbmYtPnBvcnRzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IFVBUlRfSU5GT19OVU07IGorKykgeworCQkJaWYgKEdwY2lfdWFydF9pbmZvW2pdLnR5cGUgPT0gaHdjb25mLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKKwkJCQlod2NvbmYtPk1heENhblNldEJhdWRSYXRlW2ldID0gR3BjaV91YXJ0X2luZm9bal0ubWF4X2JhdWQ7CisKKwkJCQkvL2V4Y2VwdGlvbi4uLi5DUC0xMDIKKwkJCQlpZiAoYm9hcmRfdHlwZSA9PSBNWFNFUl9CT0FSRF9DUDEwMikKKwkJCQkJaHdjb25mLT5NYXhDYW5TZXRCYXVkUmF0ZVtpXSA9IDkyMTYwMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChod2NvbmYtPklzTW94YU11c3RDaGlwRmxhZyA9PSBNT1hBX01VU1RfTVU4NjBfSFdJRCkgeworCQlmb3IgKGkgPSAwOyBpIDwgaHdjb25mLT5wb3J0czsgaSsrKSB7CisJCQlpZiAoaSA8IDQpCisJCQkJaHdjb25mLT5vcG1vZGVfaW9hZGRyW2ldID0gaW9hZGRyZXNzICsgNDsKKwkJCWVsc2UKKwkJCQlod2NvbmYtPm9wbW9kZV9pb2FkZHJbaV0gPSBpb2FkZHJlc3MgKyAweDBjOworCQl9CisJCW91dGIoMCwgaW9hZGRyZXNzICsgNCk7CS8vIGRlZmF1bHQgc2V0IHRvIFJTMjMyIG1vZGUKKwkJb3V0YigwLCBpb2FkZHJlc3MgKyAweDBjKTsJLy9kZWZhdWx0IHNldCB0byBSUzIzMiBtb2RlCisJfQorCisJZm9yIChpID0gMDsgaSA8IGh3Y29uZi0+cG9ydHM7IGkrKykgeworCQlod2NvbmYtPnZlY3Rvcl9tYXNrIHw9ICgxIDw8IGkpOworCQlod2NvbmYtPmJhdWRfYmFzZVtpXSA9IDkyMTYwMDsKKwl9CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG14c2VyX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgbSwgcmV0dmFsLCBiLCBuOworCWludCByZXQxOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwlpbnQgaW5kZXg7CisJdW5zaWduZWQgY2hhciBidXNudW0sIGRldm51bTsKKwlzdHJ1Y3QgbXhzZXJfaHdjb25mIGh3Y29uZjsKKworCW14dmFyX3Nkcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE1YU0VSX1BPUlRTICsgMSk7CisJaWYgKCFteHZhcl9zZHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzcGluX2xvY2tfaW5pdCgmZ21fbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfQk9BUkRTOyBpKyspIHsKKwkJbXhzZXJjZmdbaV0uYm9hcmRfdHlwZSA9IC0xOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIk1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgZHJpdmVyIHZlcnNpb24gJXNcbiIsIE1YU0VSX1ZFUlNJT04pOworCisJLyogSW5pdGlhbGl6ZSB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQobXh2YXJfc2RyaXZlciwgMCwgc2l6ZW9mKHN0cnVjdCB0dHlfZHJpdmVyKSk7CisJbXh2YXJfc2RyaXZlci0+bWFnaWMgPSBUVFlfRFJJVkVSX01BR0lDOworCW14dmFyX3Nkcml2ZXItPm5hbWUgPSAidHR5TSI7CisJbXh2YXJfc2RyaXZlci0+bWFqb3IgPSB0dHltYWpvcjsKKwlteHZhcl9zZHJpdmVyLT5taW5vcl9zdGFydCA9IDA7CisJbXh2YXJfc2RyaXZlci0+bnVtID0gTVhTRVJfUE9SVFMgKyAxOworCW14dmFyX3Nkcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCW14dmFyX3Nkcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJbXh2YXJfc2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCW14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCW14dmFyX3Nkcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMobXh2YXJfc2RyaXZlciwgJm14c2VyX29wcyk7CisJbXh2YXJfc2RyaXZlci0+dHR5cyA9IG14dmFyX3R0eTsKKwlteHZhcl9zZHJpdmVyLT50ZXJtaW9zID0gbXh2YXJfdGVybWlvczsKKwlteHZhcl9zZHJpdmVyLT50ZXJtaW9zX2xvY2tlZCA9IG14dmFyX3Rlcm1pb3NfbG9ja2VkOworCisJbXh2YXJfc2RyaXZlci0+b3BlbiA9IG14c2VyX29wZW47CisJbXh2YXJfc2RyaXZlci0+Y2xvc2UgPSBteHNlcl9jbG9zZTsKKwlteHZhcl9zZHJpdmVyLT53cml0ZSA9IG14c2VyX3dyaXRlOworCW14dmFyX3Nkcml2ZXItPnB1dF9jaGFyID0gbXhzZXJfcHV0X2NoYXI7CisJbXh2YXJfc2RyaXZlci0+Zmx1c2hfY2hhcnMgPSBteHNlcl9mbHVzaF9jaGFyczsKKwlteHZhcl9zZHJpdmVyLT53cml0ZV9yb29tID0gbXhzZXJfd3JpdGVfcm9vbTsKKwlteHZhcl9zZHJpdmVyLT5jaGFyc19pbl9idWZmZXIgPSBteHNlcl9jaGFyc19pbl9idWZmZXI7CisJbXh2YXJfc2RyaXZlci0+Zmx1c2hfYnVmZmVyID0gbXhzZXJfZmx1c2hfYnVmZmVyOworCW14dmFyX3Nkcml2ZXItPmlvY3RsID0gbXhzZXJfaW9jdGw7CisJbXh2YXJfc2RyaXZlci0+dGhyb3R0bGUgPSBteHNlcl90aHJvdHRsZTsKKwlteHZhcl9zZHJpdmVyLT51bnRocm90dGxlID0gbXhzZXJfdW50aHJvdHRsZTsKKwlteHZhcl9zZHJpdmVyLT5zZXRfdGVybWlvcyA9IG14c2VyX3NldF90ZXJtaW9zOworCW14dmFyX3Nkcml2ZXItPnN0b3AgPSBteHNlcl9zdG9wOworCW14dmFyX3Nkcml2ZXItPnN0YXJ0ID0gbXhzZXJfc3RhcnQ7CisJbXh2YXJfc2RyaXZlci0+aGFuZ3VwID0gbXhzZXJfaGFuZ3VwOworCW14dmFyX3Nkcml2ZXItPmJyZWFrX2N0bCA9IG14c2VyX3JzX2JyZWFrOworCW14dmFyX3Nkcml2ZXItPndhaXRfdW50aWxfc2VudCA9IG14c2VyX3dhaXRfdW50aWxfc2VudDsKKworCW14dmFyX2RpYWdmbGFnID0gMDsKKwltZW1zZXQobXh2YXJfdGFibGUsIDAsIE1YU0VSX1BPUlRTICogc2l6ZW9mKHN0cnVjdCBteHNlcl9zdHJ1Y3QpKTsKKwltZW1zZXQoJm14dmFyX2xvZywgMCwgc2l6ZW9mKHN0cnVjdCBteHNlcl9sb2cpKTsKKworCW1lbXNldCgmbXhzZXJfbXNyLCAwLCBzaXplb2YodW5zaWduZWQgY2hhcikgKiAoTVhTRVJfUE9SVFMgKyAxKSk7CisJbWVtc2V0KCZtb25fZGF0YV9leHQsIDAsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbW9uX2V4dCkpOworCW1lbXNldCgmbXhzZXJfc2V0X2JhdWRfbWV0aG9kLCAwLCBzaXplb2YoaW50KSAqIChNWFNFUl9QT1JUUyArIDEpKTsKKwltZW1zZXQoJmh3Y29uZiwgMCwgc2l6ZW9mKHN0cnVjdCBteHNlcl9od2NvbmYpKTsKKworCW0gPSAwOworCS8qIFN0YXJ0IGZpbmRpbmcgSVNBIGJvYXJkcyBoZXJlICovCisJZm9yIChiID0gMDsgYiA8IE1YU0VSX0JPQVJEUyAmJiBtIDwgTVhTRVJfQk9BUkRTOyBiKyspIHsKKwkJaW50IGNhcDsKKwkJaWYgKCEoY2FwID0gbXhzZXJCb2FyZENBUFtiXSkpCisJCQljb250aW51ZTsKKworCQlyZXR2YWwgPSBteHNlcl9nZXRfSVNBX2NvbmYoY2FwLCAmaHdjb25mKTsKKworCQlpZiAocmV0dmFsICE9IDApCisJCQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNT1hBICVzIGJvYXJkIChDQVA9MHgleClcbiIsIG14c2VyX2JyZG5hbWVbaHdjb25mLmJvYXJkX3R5cGUgLSAxXSwgaW9hZGRyW2JdKTsKKworCQlpZiAocmV0dmFsIDw9IDApIHsKKwkJCWlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lSUSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lSUV9DT05GTElUKQorCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfVkVDVE9SKQorCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgdmVjdG9yLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSU9BRERSKQorCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBJL08gYWRkcmVzcyxib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaHdjb25mLnBjaUluZm8uYnVzTnVtID0gMDsKKwkJaHdjb25mLnBjaUluZm8uZGV2TnVtID0gMDsKKwkJaHdjb25mLnBjaUluZm8ucGRldiA9IE5VTEw7CisKKwkJbXhzZXJfZ2V0Y2ZnKG0sICZod2NvbmYpOworCQkvL2luaXQgbXhzZXJjZmcgZmlyc3QsIG9yIG14c2VyY2ZnIGRhdGEgaXMgbm90IGNvcnJlY3Qgb24gSVNSLgorCQkvL214c2VyX2luaXRicmQgd2lsbCBob29rIElTUi4KKwkJaWYgKG14c2VyX2luaXRicmQobSwgJmh3Y29uZikgPCAwKQorCQkJY29udGludWU7CisKKworCQltKys7CisJfQorCisJLyogU3RhcnQgZmluZGluZyBJU0EgYm9hcmRzIGZyb20gbW9kdWxlIGFyZyAqLworCWZvciAoYiA9IDA7IGIgPCBNWFNFUl9CT0FSRFMgJiYgbSA8IE1YU0VSX0JPQVJEUzsgYisrKSB7CisJCWludCBjYXA7CisJCWlmICghKGNhcCA9IGlvYWRkcltiXSkpCisJCQljb250aW51ZTsKKworCQlyZXR2YWwgPSBteHNlcl9nZXRfSVNBX2NvbmYoY2FwLCAmaHdjb25mKTsKKworCQlpZiAocmV0dmFsICE9IDApCisJCQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNT1hBICVzIGJvYXJkIChDQVA9MHgleClcbiIsIG14c2VyX2JyZG5hbWVbaHdjb25mLmJvYXJkX3R5cGUgLSAxXSwgaW9hZGRyW2JdKTsKKworCQlpZiAocmV0dmFsIDw9IDApIHsKKwkJCWlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lSUSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lSUV9DT05GTElUKQorCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfVkVDVE9SKQorCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgdmVjdG9yLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSU9BRERSKQorCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBJL08gYWRkcmVzcyxib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaHdjb25mLnBjaUluZm8uYnVzTnVtID0gMDsKKwkJaHdjb25mLnBjaUluZm8uZGV2TnVtID0gMDsKKwkJaHdjb25mLnBjaUluZm8ucGRldiA9IE5VTEw7CisKKwkJbXhzZXJfZ2V0Y2ZnKG0sICZod2NvbmYpOworCQkvL2luaXQgbXhzZXJjZmcgZmlyc3QsIG9yIG14c2VyY2ZnIGRhdGEgaXMgbm90IGNvcnJlY3Qgb24gSVNSLgorCQkvL214c2VyX2luaXRicmQgd2lsbCBob29rIElTUi4KKwkJaWYgKG14c2VyX2luaXRicmQobSwgJmh3Y29uZikgPCAwKQorCQkJY29udGludWU7CisKKwkJbSsrOworCX0KKworCS8qIHN0YXJ0IGZpbmRpbmcgUENJIGJvYXJkIGhlcmUgKi8KKyNpZmRlZiBDT05GSUdfUENJCisJbiA9IChzaXplb2YobXhzZXJfcGNpYnJkcykgLyBzaXplb2YobXhzZXJfcGNpYnJkc1swXSkpIC0gMTsKKwlpbmRleCA9IDA7CisJYiA9IDA7CisJd2hpbGUgKGIgPCBuKSB7CisJCXBkZXYgPSBwY2lfZmluZF9kZXZpY2UobXhzZXJfcGNpYnJkc1tiXS52ZW5kb3IsIG14c2VyX3BjaWJyZHNbYl0uZGV2aWNlLCBwZGV2KTsKKwkJCWlmIChwZGV2ID09IE5VTEwpIHsKKwkJCWIrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWh3Y29uZi5wY2lJbmZvLmJ1c051bSA9IGJ1c251bSA9IHBkZXYtPmJ1cy0+bnVtYmVyOworCQlod2NvbmYucGNpSW5mby5kZXZOdW0gPSBkZXZudW0gPSBQQ0lfU0xPVChwZGV2LT5kZXZmbikgPDwgMzsKKwkJaHdjb25mLnBjaUluZm8ucGRldiA9IHBkZXY7CisJCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE1PWEEgJXMgYm9hcmQoQnVzTm89JWQsRGV2Tm89JWQpXG4iLCBteHNlcl9icmRuYW1lWyhpbnQpIChteHNlcl9wY2licmRzW2JdLmRyaXZlcl9kYXRhKSAtIDFdLCBidXNudW0sIGRldm51bSA+PiAzKTsKKwkJaW5kZXgrKzsKKwkJaWYgKG0gPj0gTVhTRVJfQk9BUkRTKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlRvbyBtYW55IFNtYXJ0aW8vSW5kdXN0aW8gZmFtaWx5IGJvYXJkcyBmaW5kIChtYXhpbXVtICVkKSxib2FyZCBub3QgY29uZmlndXJlZFxuIiwgTVhTRVJfQk9BUkRTKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiTW94YSBTbWFydEkvTyBQQ0kgZW5hYmxlIGZhaWwgIVxuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXR2YWwgPSBteHNlcl9nZXRfUENJX2NvbmYoYnVzbnVtLCBkZXZudW0sIChpbnQpIG14c2VyX3BjaWJyZHNbYl0uZHJpdmVyX2RhdGEsICZod2NvbmYpOworCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQlpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlEpCisJCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lSUV9DT05GTElUKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9WRUNUT1IpCisJCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgdmVjdG9yLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lPQUREUikKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIEkvTyBhZGRyZXNzLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW14c2VyX2dldGNmZyhtLCAmaHdjb25mKTsKKwkJCS8vaW5pdCBteHNlcmNmZyBmaXJzdCwgb3IgbXhzZXJjZmcgZGF0YSBpcyBub3QgY29ycmVjdCBvbiBJU1IuCisJCQkvL214c2VyX2luaXRicmQgd2lsbCBob29rIElTUi4KKwkJCWlmIChteHNlcl9pbml0YnJkKG0sICZod2NvbmYpIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCW0rKzsKKwkJfQorCX0KKyNlbmRpZgorCisJcmV0MSA9IDA7CisJaWYgKCEocmV0MSA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIobXh2YXJfc2RyaXZlcikpKSB7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGluc3RhbGwgTU9YQSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSBkcml2ZXIgIVxuIik7CisKKworCWlmIChyZXQxKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykgeworCQkJaWYgKG14c2VyY2ZnW2ldLmJvYXJkX3R5cGUgPT0gLTEpCisJCQkJY29udGludWU7CisJCQllbHNlIHsKKwkJCQlmcmVlX2lycShteHNlcmNmZ1tpXS5pcnEsICZteHZhcl90YWJsZVtpICogTVhTRVJfUE9SVFNfUEVSX0JPQVJEXSk7CisJCQkJLy90b2RvOiByZWxlYXNlIGlvLCB2ZWN0b3IKKwkJCX0KKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgcHJpdmF0ZV87CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCXR0eSA9IGluZm8tPnR0eTsKKworCWlmICh0dHkpIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChNWFNFUl9FVkVOVF9UWExPVywgJmluZm8tPmV2ZW50KSkKKwkJCXR0eV93YWtldXAodHR5KTsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChNWFNFUl9FVkVOVF9IQU5HVVAsICZpbmZvLT5ldmVudCkpCisJCQl0dHlfaGFuZ3VwKHR0eSk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBteHNlcl9nZXRfbXNyKGludCBiYXNlYWRkciwgaW50IG1vZGUsIGludCBwb3J0LCBzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzID0gMDsKKworCXN0YXR1cyA9IGluYihiYXNlYWRkciArIFVBUlRfTVNSKTsKKworCW14c2VyX21zcltwb3J0XSAmPSAweDBGOworCW14c2VyX21zcltwb3J0XSB8PSBzdGF0dXM7CisJc3RhdHVzID0gbXhzZXJfbXNyW3BvcnRdOworCWlmIChtb2RlKQorCQlteHNlcl9tc3JbcG9ydF0gPSAwOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBzZXJpYWwgcG9ydCBpcyBvcGVuZWQuICBJdAorICogZW5hYmxlcyBpbnRlcnJ1cHRzIGZvciBhIHNlcmlhbCBwb3J0LCBsaW5raW5nIGluIGl0cyBhc3luYyBzdHJ1Y3R1cmUgaW50bworICogdGhlIElSUSBjaGFpbi4gICBJdCBhbHNvIHBlcmZvcm1zIHRoZSBzZXJpYWwtc3BlY2lmaWMKKyAqIGluaXRpYWxpemF0aW9uIGZvciB0aGUgdHR5IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGludCBteHNlcl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm87CisJaW50IHJldHZhbCwgbGluZTsKKworCWxpbmUgPSB0dHktPmluZGV4OworCWlmIChsaW5lID09IE1YU0VSX1BPUlRTKQorCQlyZXR1cm4gMDsKKwlpZiAobGluZSA8IDAgfHwgbGluZSA+IE1YU0VSX1BPUlRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpbmZvID0gbXh2YXJfdGFibGUgKyBsaW5lOworCWlmICghaW5mby0+YmFzZSkKKwkJcmV0dXJuICgtRU5PREVWKTsKKworCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOworCWluZm8tPnR0eSA9IHR0eTsKKwkvKgorCSAqIFN0YXJ0IHVwIHNlcmlhbCBwb3J0CisJICovCisJcmV0dmFsID0gbXhzZXJfc3RhcnR1cChpbmZvKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gKHJldHZhbCk7CisKKwlyZXR2YWwgPSBteHNlcl9ibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBpbmZvKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gKHJldHZhbCk7CisKKwlpbmZvLT5jb3VudCsrOworCisJaWYgKChpbmZvLT5jb3VudCA9PSAxKSAmJiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUExJVF9URVJNSU9TKSkgeworCQlpZiAodHR5LT5kcml2ZXItPnN1YnR5cGUgPT0gU0VSSUFMX1RZUEVfTk9STUFMKQorCQkJKnR0eS0+dGVybWlvcyA9IGluZm8tPm5vcm1hbF90ZXJtaW9zOworCQllbHNlCisJCQkqdHR5LT50ZXJtaW9zID0gaW5mby0+Y2FsbG91dF90ZXJtaW9zOworCQlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgTlVMTCk7CisJfQorCisJaW5mby0+c2Vzc2lvbiA9IGN1cnJlbnQtPnNpZ25hbC0+c2Vzc2lvbjsKKwlpbmZvLT5wZ3JwID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKKwljbGVhcl9iaXQoVFRZX0RPTlRfRkxJUCwgJnR0eS0+ZmxhZ3MpOworCisJLy9zdGF0dXMgPSBteHNlcl9nZXRfbXNyKGluZm8tPmJhc2UsIDAsIGluZm8tPnBvcnQpOworCS8vbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8sIHN0YXR1cyk7CisKKy8qIHVubWFyayBoZXJlIGZvciB2ZXJ5IGhpZ2ggYmF1ZCByYXRlIChleC4gOTIxNjAwIGJwcykgdXNlZAorKi8KKwl0dHktPmxvd19sYXRlbmN5ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUgc2VyaWFsIHBvcnQgZ2V0cyBjbG9zZWQuICBGaXJzdCwgd2UKKyAqIHdhaXQgZm9yIHRoZSBsYXN0IHJlbWFpbmluZyBkYXRhIHRvIGJlIHNlbnQuICBUaGVuLCB3ZSB1bmxpbmsgaXRzCisgKiBhc3luYyBzdHJ1Y3R1cmUgZnJvbSB0aGUgaW50ZXJydXB0IGNoYWluIGlmIG5lY2Vzc2FyeSwgYW5kIHdlIGZyZWUKKyAqIHRoYXQgSVJRIGlmIG5vdGhpbmcgaXMgbGVmdCBpbiB0aGUgY2hhaW4uCisgKi8KK3N0YXRpYyB2b2lkIG14c2VyX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisKKwlpZiAodHR5LT5pbmRleCA9PSBNWFNFUl9QT1JUUykKKwkJcmV0dXJuOworCWlmICghaW5mbykKKwkJQlVHKCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChpbmZvLT5jb3VudCAhPSAxKSkgeworCQkvKgorCQkgKiBVaCwgb2guICB0dHktPmNvdW50IGlzIDEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHR0eQorCQkgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4gIEluZm8tPmNvdW50IHNob3VsZCBhbHdheXMKKwkJICogYmUgb25lIGluIHRoZXNlIGNvbmRpdGlvbnMuICBJZiBpdCdzIGdyZWF0ZXIgdGhhbgorCQkgKiBvbmUsIHdlJ3ZlIGdvdCByZWFsIHByb2JsZW1zLCBzaW5jZSBpdCBtZWFucyB0aGUKKwkJICogc2VyaWFsIHBvcnQgd29uJ3QgYmUgc2h1dGRvd24uCisJCSAqLworCQlwcmludGsoS0VSTl9FUlIgIm14c2VyX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQ7IHR0eS0+Y291bnQgaXMgMSwgIiAiaW5mby0+Y291bnQgaXMgJWRcbiIsIGluZm8tPmNvdW50KTsKKwkJaW5mby0+Y291bnQgPSAxOworCX0KKwlpZiAoLS1pbmZvLT5jb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJteHNlcl9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50IGZvciB0dHlzJWQ6ICVkXG4iLCBpbmZvLT5wb3J0LCBpbmZvLT5jb3VudCk7CisJCWluZm8tPmNvdW50ID0gMDsKKwl9CisJaWYgKGluZm8tPmNvdW50KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCS8qCisJICogU2F2ZSB0aGUgdGVybWlvcyBzdHJ1Y3R1cmUsIHNpbmNlIHRoaXMgcG9ydCBtYXkgaGF2ZQorCSAqIHNlcGFyYXRlIHRlcm1pb3MgZm9yIGNhbGxvdXQgYW5kIGRpYWxpbi4KKwkgKi8KKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19OT1JNQUxfQUNUSVZFKQorCQlpbmZvLT5ub3JtYWxfdGVybWlvcyA9ICp0dHktPnRlcm1pb3M7CisJLyoKKwkgKiBOb3cgd2Ugd2FpdCBmb3IgdGhlIHRyYW5zbWl0IGJ1ZmZlciB0byBjbGVhcjsgYW5kIHdlIG5vdGlmeQorCSAqIHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gb25seSBwcm9jZXNzIFhPTi9YT0ZGIGNoYXJhY3RlcnMuCisJICovCisJdHR5LT5jbG9zaW5nID0gMTsKKwlpZiAoaW5mby0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQorCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+Y2xvc2luZ193YWl0KTsKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgd2Ugc3RvcCBhY2NlcHRpbmcgaW5wdXQuICBUbyBkbyB0aGlzLCB3ZQorCSAqIGRpc2FibGUgdGhlIHJlY2VpdmUgbGluZSBzdGF0dXMgaW50ZXJydXB0cywgYW5kIHRlbGwgdGhlCisJICogaW50ZXJydXB0IGRyaXZlciB0byBzdG9wIGNoZWNraW5nIHRoZSBkYXRhIHJlYWR5IGJpdCBpbiB0aGUKKwkgKiBsaW5lIHN0YXR1cyByZWdpc3Rlci4KKwkgKi8KKwlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1JMU0k7CisJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykKKwkJaW5mby0+SUVSICY9IH5NT1hBX01VU1RfUkVDVl9JU1I7CisvKiBieSBXaWxsaWFtCisJaW5mby0+cmVhZF9zdGF0dXNfbWFzayAmPSB+VUFSVF9MU1JfRFI7CisqLworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkvKgorCQkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgorCQkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkOyB0aGlzIGlzIGVzcGVjaWFsbHkKKwkJICogaW1wb3J0YW50IGlmIHRoZXJlIGlzIGEgdHJhbnNtaXQgRklGTyEKKwkJICovCisJCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJCXdoaWxlICghKGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVCkpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDUpOworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJbXhzZXJfc2h1dGRvd24oaW5mbyk7CisKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCQkKKwlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwlpZiAobGQpIHsKKwkJaWYobGQtPmZsdXNoX2J1ZmZlcikKKwkJCWxkLT5mbHVzaF9idWZmZXIodHR5KTsKKwkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwl9CisJCQorCXR0eS0+Y2xvc2luZyA9IDA7CisJaW5mby0+ZXZlbnQgPSAwOworCWluZm8tPnR0eSA9IE5VTEw7CisJaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgeworCQlpZiAoaW5mby0+Y2xvc2VfZGVsYXkpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KGluZm8tPmNsb3NlX2RlbGF5KTsKKwkJfQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJfQorCisJaW5mby0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFIHwgQVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5jbG9zZV93YWl0KTsKKworfQorCitzdGF0aWMgaW50IG14c2VyX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBjLCB0b3RhbCA9IDA7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZikKKwkJcmV0dXJuICgwKTsKKworCXdoaWxlICgxKSB7CisJCWMgPSBtaW5fdChpbnQsIGNvdW50LCBtaW4oU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMSwgU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfaGVhZCkpOworCQlpZiAoYyA8PSAwKQorCQkJYnJlYWs7CisKKwkJbWVtY3B5KGluZm8tPnhtaXRfYnVmICsgaW5mby0+eG1pdF9oZWFkLCBidWYsIGMpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJaW5mby0+eG1pdF9oZWFkID0gKGluZm8tPnhtaXRfaGVhZCArIGMpICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkJaW5mby0+eG1pdF9jbnQgKz0gYzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKwkJdG90YWwgKz0gYzsKKworCX0KKworCWlmIChpbmZvLT54bWl0X2NudCAmJiAhdHR5LT5zdG9wcGVkICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKKwkJaWYgKCF0dHktPmh3X3N0b3BwZWQgfHwgKGluZm8tPnR5cGUgPT0gUE9SVF8xNjU1MEEpIHx8IChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQl9CisJfQorCXJldHVybiB0b3RhbDsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCF0dHkgfHwgIWluZm8tPnhtaXRfYnVmKQorCQlyZXR1cm47CisKKwlpZiAoaW5mby0+eG1pdF9jbnQgPj0gU0VSSUFMX1hNSVRfU0laRSAtIDEpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfaGVhZCsrXSA9IGNoOworCWluZm8tPnhtaXRfaGVhZCAmPSBTRVJJQUxfWE1JVF9TSVpFIC0gMTsKKwlpbmZvLT54bWl0X2NudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJaWYgKCF0dHktPnN0b3BwZWQgJiYgIShpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSkgeworCQlpZiAoIXR0eS0+aHdfc3RvcHBlZCB8fCAoaW5mby0+dHlwZSA9PSBQT1JUXzE2NTUwQSkgfHwgaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIG14c2VyX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpbmZvLT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCAhaW5mby0+eG1pdF9idWYgfHwgKHR0eS0+aHdfc3RvcHBlZCAmJiAoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYgKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxOworCWlmIChyZXQgPCAwKQorCQlyZXQgPSAwOworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIGludCBteHNlcl9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlyZXR1cm4gaW5mby0+eG1pdF9jbnQ7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCWNoYXIgZmNyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKworCS8qIGJlbG93IGFkZGVkIGJ5IHNoaW5oYXkgKi8KKwlmY3IgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKKwlvdXRiKChmY3IgfCBVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCksIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CisJb3V0YihmY3IsIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCS8qIGFib3ZlIGFkZGVkIGJ5IHNoaW5oYXkgKi8KKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwlpZiAoKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSkgJiYgdHR5LT5sZGlzYy53cml0ZV93YWtldXApCisJCSh0dHktPmxkaXNjLndyaXRlX3dha2V1cCkgKHR0eSk7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCWludCByZXR2YWw7CisJc3RydWN0IGFzeW5jX2ljb3VudCBjcHJldiwgY25vdzsJLyoga2VybmVsIGNvdW50ZXIgdGVtcHMgKi8KKwlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBfX3VzZXIgKnBfY3VzZXI7CisJdW5zaWduZWQgbG9uZyB0ZW1wbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKHR0eS0+aW5kZXggPT0gTVhTRVJfUE9SVFMpCisJCXJldHVybiAobXhzZXJfaW9jdGxfc3BlY2lhbChjbWQsIGFyZ3ApKTsKKworCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0CisJaWYgKGNtZCA9PSBNT1hBX1NFVF9PUF9NT0RFIHx8IGNtZCA9PSBNT1hBX0dFVF9PUF9NT0RFKSB7CisJCWludCBvcG1vZGUsIHA7CisJCXN0YXRpYyB1bnNpZ25lZCBjaGFyIE1vZGVNYXNrW10gPSB7IDB4ZmMsIDB4ZjMsIDB4Y2YsIDB4M2YgfTsKKwkJaW50IHNoaWZ0Yml0OworCQl1bnNpZ25lZCBjaGFyIHZhbCwgbWFzazsKKworCQlwID0gaW5mby0+cG9ydCAlIDQ7CisJCWlmIChjbWQgPT0gTU9YQV9TRVRfT1BfTU9ERSkgeworCQkJaWYgKGdldF91c2VyKG9wbW9kZSwgKGludCBfX3VzZXIgKikgYXJncCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAob3Btb2RlICE9IFJTMjMyX01PREUgJiYgb3Btb2RlICE9IFJTNDg1XzJXSVJFX01PREUgJiYgb3Btb2RlICE9IFJTNDIyX01PREUgJiYgb3Btb2RlICE9IFJTNDg1XzRXSVJFX01PREUpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQltYXNrID0gTW9kZU1hc2tbcF07CisJCQlzaGlmdGJpdCA9IHAgKiAyOworCQkJdmFsID0gaW5iKGluZm8tPm9wbW9kZV9pb2FkZHIpOworCQkJdmFsICY9IG1hc2s7CisJCQl2YWwgfD0gKG9wbW9kZSA8PCBzaGlmdGJpdCk7CisJCQlvdXRiKHZhbCwgaW5mby0+b3Btb2RlX2lvYWRkcik7CisJCX0gZWxzZSB7CisJCQlzaGlmdGJpdCA9IHAgKiAyOworCQkJb3Btb2RlID0gaW5iKGluZm8tPm9wbW9kZV9pb2FkZHIpID4+IHNoaWZ0Yml0OworCQkJb3Btb2RlICY9IE9QX01PREVfTUFTSzsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm9wbW9kZSwgc2l6ZW9mKGludCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiAwOworCX0KKwkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0CisKKwlpZiAoKGNtZCAhPSBUSU9DR1NFUklBTCkgJiYgKGNtZCAhPSBUSU9DTUlXQUlUKSAmJiAoY21kICE9IFRJT0NHSUNPVU5UKSkgeworCQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCQlyZXR1cm4gKC1FSU8pOworCX0KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVENTQlJLOgkJLyogU1ZJRCB2ZXJzaW9uOiBub24temVybyBhcmcgLS0+IG5vIGJyZWFrICovCisJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiAocmV0dmFsKTsKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOworCQlpZiAoIWFyZykKKwkJCW14c2VyX3NlbmRfYnJlYWsoaW5mbywgSFogLyA0KTsJLyogMS80IHNlY29uZCAqLworCQlyZXR1cm4gKDApOworCWNhc2UgVENTQlJLUDoJCS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KKwkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIChyZXR2YWwpOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCW14c2VyX3NlbmRfYnJlYWsoaW5mbywgYXJnID8gYXJnICogKEhaIC8gMTApIDogSFogLyA0KTsKKwkJcmV0dXJuICgwKTsKKwljYXNlIFRJT0NHU09GVENBUjoKKwkJcmV0dXJuIHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApOworCWNhc2UgVElPQ1NTT0ZUQ0FSOgorCQlpZiAoZ2V0X3VzZXIodGVtcGwsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlhcmcgPSB0ZW1wbDsKKwkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8IChhcmcgPyBDTE9DQUwgOiAwKSk7CisJCXJldHVybiAoMCk7CisJY2FzZSBUSU9DR1NFUklBTDoKKwkJcmV0dXJuIG14c2VyX2dldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKKwljYXNlIFRJT0NTU0VSSUFMOgorCQlyZXR1cm4gbXhzZXJfc2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOworCWNhc2UgVElPQ1NFUkdFVExTUjoJLyogR2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCisJCXJldHVybiBteHNlcl9nZXRfbHNyX2luZm8oaW5mbywgYXJncCk7CisJCS8qCisJCSAqIFdhaXQgZm9yIGFueSBvZiB0aGUgNCBtb2RlbSBpbnB1dHMgKERDRCxSSSxEU1IsQ1RTKSB0byBjaGFuZ2UKKwkJICogLSBtYXNrIHBhc3NlZCBpbiBhcmcgZm9yIGxpbmVzIG9mIGludGVyZXN0CisJCSAqICAgKHVzZSB8J2VkIFRJT0NNX1JORy9EU1IvQ0QvQ1RTIGZvciBtYXNraW5nKQorCQkgKiBDYWxsZXIgc2hvdWxkIHVzZSBUSU9DR0lDT1VOVCB0byBzZWUgd2hpY2ggb25lIGl0IHdhcworCQkgKi8KKwljYXNlIFRJT0NNSVdBSVQ6eworCQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJCQlpbnQgcmV0OworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCQljcHJldiA9IGluZm8tPmljb3VudDsJLyogbm90ZSB0aGUgY291bnRlcnMgb24gZW50cnkgKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwkJCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCwgJndhaXQpOworCQkJd2hpbGUgKDEpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJCQljbm93ID0gaW5mby0+aWNvdW50OwkvKiBhdG9taWMgY29weSAqLworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCWlmICgoKGFyZyAmIFRJT0NNX1JORykgJiYgKGNub3cucm5nICE9IGNwcmV2LnJuZykpIHx8ICgoYXJnICYgVElPQ01fRFNSKSAmJiAoY25vdy5kc3IgIT0gY3ByZXYuZHNyKSkgfHwgKChhcmcgJiBUSU9DTV9DRCkgJiYgKGNub3cuZGNkICE9IGNwcmV2LmRjZCkpIHx8ICgoYXJnICYgVElPQ01fQ1RTKSAmJiAoY25vdy5jdHMgIT0gY3ByZXYuY3RzKSkpIHsKKwkJCQkJcmV0ID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIHNlZSBpZiBhIHNpZ25hbCBkaWQgaXQgKi8KKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY3ByZXYgPSBjbm93OworCQkJfQorCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+ZGVsdGFfbXNyX3dhaXQsICZ3YWl0KTsKKwkJCWJyZWFrOworCQl9CisJCS8qIE5PVFJFQUNIRUQgKi8KKwkJLyoKKwkJICogR2V0IGNvdW50ZXIgb2YgaW5wdXQgc2VyaWFsIGxpbmUgaW50ZXJydXB0cyAoRENELFJJLERTUixDVFMpCisJCSAqIFJldHVybjogd3JpdGUgY291bnRlcnMgdG8gdGhlIHVzZXIgcGFzc2VkIGNvdW50ZXIgc3RydWN0CisJCSAqIE5COiBib3RoIDEtPjAgYW5kIDAtPjEgdHJhbnNpdGlvbnMgYXJlIGNvdW50ZWQgZXhjZXB0IGZvcgorCQkgKiAgICAgUkkgd2hlcmUgb25seSAwLT4xIGlzIGNvdW50ZWQuCisJCSAqLworCWNhc2UgVElPQ0dJQ09VTlQ6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQljbm93ID0gaW5mby0+aWNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlwX2N1c2VyID0gYXJncDsKKwkJLyogbW9kaWZpZWQgYnkgY2FzcGVyIDEvMTEvMjAwMCAqLworCQlpZiAocHV0X3VzZXIoY25vdy5mcmFtZSwgJnBfY3VzZXItPmZyYW1lKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoY25vdy5icmssICZwX2N1c2VyLT5icmspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChwdXRfdXNlcihjbm93Lm92ZXJydW4sICZwX2N1c2VyLT5vdmVycnVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoY25vdy5idWZfb3ZlcnJ1biwgJnBfY3VzZXItPmJ1Zl9vdmVycnVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoY25vdy5wYXJpdHksICZwX2N1c2VyLT5wYXJpdHkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChwdXRfdXNlcihjbm93LnJ4LCAmcF9jdXNlci0+cngpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChwdXRfdXNlcihjbm93LnR4LCAmcF9jdXNlci0+dHgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB1dF91c2VyKGNub3cuY3RzLCAmcF9jdXNlci0+Y3RzKTsKKwkJcHV0X3VzZXIoY25vdy5kc3IsICZwX2N1c2VyLT5kc3IpOworCQlwdXRfdXNlcihjbm93LnJuZywgJnBfY3VzZXItPnJuZyk7CisJCXB1dF91c2VyKGNub3cuZGNkLCAmcF9jdXNlci0+ZGNkKTsKKworLyogKi8KKwkJcmV0dXJuIDA7CisJY2FzZSBNT1hBX0hpZ2hTcGVlZE9uOgorCQlyZXR1cm4gcHV0X3VzZXIoaW5mby0+YmF1ZF9iYXNlICE9IDExNTIwMCA/IDEgOiAwLCAoaW50IF9fdXNlciAqKSBhcmdwKTsKKworCWNhc2UgTU9YQV9TRFNfUlNUSUNPVU5URVI6eworCQkJaW5mby0+bW9uX2RhdGEucnhjbnQgPSAwOworCQkJaW5mby0+bW9uX2RhdGEudHhjbnQgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKy8vIChhYm92ZSkgYWRkZWQgYnkgSmFtZXMuCisJY2FzZSBNT1hBX0FTUFBfU0VUQkFVRDp7CisJCQlsb25nIGJhdWQ7CisJCQlpZiAoZ2V0X3VzZXIoYmF1ZCwgKGxvbmcgX191c2VyICopIGFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJbXhzZXJfc2V0X2JhdWQoaW5mbywgYmF1ZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgTU9YQV9BU1BQX0dFVEJBVUQ6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8tPnJlYWxiYXVkLCBzaXplb2YobG9uZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIE1PWEFfQVNQUF9PUVVFVUU6eworCQkJaW50IGxlbiwgbHNyOworCisJCQlsZW4gPSBteHNlcl9jaGFyc19pbl9idWZmZXIodHR5KTsKKworCQkJbHNyID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UOworCisJCQlsZW4gKz0gKGxzciA/IDAgOiAxKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbGVuLCBzaXplb2YoaW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBNT1hBX0FTUFBfTU9OOnsKKwkJCWludCBtY3IsIHN0YXR1czsKKy8vICAgICAgaW5mby0+bW9uX2RhdGEuc2VyX3BhcmFtID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJCQlzdGF0dXMgPSBteHNlcl9nZXRfbXNyKGluZm8tPmJhc2UsIDEsIGluZm8tPnBvcnQsIGluZm8pOworCQkJbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8sIHN0YXR1cyk7CisKKwkJCW1jciA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOworCQkJaWYgKG1jciAmIE1PWEFfTVVTVF9NQ1JfWE9OX0ZMQUcpCisJCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gJj0gfk5QUElfTk9USUZZX1hPRkZIT0xEOworCQkJZWxzZQorCQkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uIHw9IE5QUElfTk9USUZZX1hPRkZIT0xEOworCisJCQlpZiAobWNyICYgTU9YQV9NVVNUX01DUl9UWF9YT04pCisJCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gJj0gfk5QUElfTk9USUZZX1hPRkZYRU5UOworCQkJZWxzZQorCQkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uIHw9IE5QUElfTk9USUZZX1hPRkZYRU5UOworCisJCQlpZiAoaW5mby0+dHR5LT5od19zdG9wcGVkKQorCQkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uIHw9IE5QUElfTk9USUZZX0NUU0hPTEQ7CisJCQllbHNlCisJCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gJj0gfk5QUElfTk9USUZZX0NUU0hPTEQ7CisKKworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mby0+bW9uX2RhdGEsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbW9uKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldHVybiAwOworCisJCX0KKworCWNhc2UgTU9YQV9BU1BQX0xTVEFUVVM6eworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mby0+ZXJyX3NoYWRvdywgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaW5mby0+ZXJyX3NoYWRvdyA9IDA7CisJCQlyZXR1cm4gMDsKKworCQl9CisJY2FzZSBNT1hBX1NFVF9CQVVEX01FVEhPRDp7CisJCQlpbnQgbWV0aG9kOworCQkJaWYgKGdldF91c2VyKG1ldGhvZCwgKGludCBfX3VzZXIgKikgYXJncCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlteHNlcl9zZXRfYmF1ZF9tZXRob2RbaW5mby0+cG9ydF0gPSBtZXRob2Q7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZtZXRob2QsIHNpemVvZihpbnQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0dXJuIDA7CisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmbmRlZiBDTVNQQVIKKyNkZWZpbmUJQ01TUEFSIDAxMDAwMDAwMDAwMAorI2VuZGlmCisKK3N0YXRpYyBpbnQgbXhzZXJfaW9jdGxfc3BlY2lhbCh1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJncCkKK3sKKwlpbnQgaSwgcmVzdWx0LCBzdGF0dXM7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTU9YQV9HRVRfQ09ORjoKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBteHNlcmNmZywgc2l6ZW9mKHN0cnVjdCBteHNlcl9od2NvbmYpICogNCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBNT1hBX0dFVF9NQUpPUjoKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdHR5bWFqb3IsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgTU9YQV9HRVRfQ1VNQUpPUjoKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2FsbG91dG1ham9yLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIE1PWEFfQ0hLUE9SVEVOQUJMRToKKwkJcmVzdWx0ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IE1YU0VSX1BPUlRTOyBpKyspIHsKKwkJCWlmIChteHZhcl90YWJsZVtpXS5iYXNlKQorCQkJCXJlc3VsdCB8PSAoMSA8PCBpKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIocmVzdWx0LCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCk7CisJY2FzZSBNT1hBX0dFVERBVEFDT1VOVDoKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbXh2YXJfbG9nLCBzaXplb2YobXh2YXJfbG9nKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuICgwKTsKKwljYXNlIE1PWEFfR0VUTVNUQVRVUzoKKwkJZm9yIChpID0gMDsgaSA8IE1YU0VSX1BPUlRTOyBpKyspIHsKKwkJCUdNU3RhdHVzW2ldLnJpID0gMDsKKwkJCWlmICghbXh2YXJfdGFibGVbaV0uYmFzZSkgeworCQkJCUdNU3RhdHVzW2ldLmRjZCA9IDA7CisJCQkJR01TdGF0dXNbaV0uZHNyID0gMDsKKwkJCQlHTVN0YXR1c1tpXS5jdHMgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIW14dmFyX3RhYmxlW2ldLnR0eSB8fCAhbXh2YXJfdGFibGVbaV0udHR5LT50ZXJtaW9zKQorCQkJCUdNU3RhdHVzW2ldLmNmbGFnID0gbXh2YXJfdGFibGVbaV0ubm9ybWFsX3Rlcm1pb3MuY19jZmxhZzsKKwkJCWVsc2UKKwkJCQlHTVN0YXR1c1tpXS5jZmxhZyA9IG14dmFyX3RhYmxlW2ldLnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCQkJc3RhdHVzID0gaW5iKG14dmFyX3RhYmxlW2ldLmJhc2UgKyBVQVJUX01TUik7CisJCQlpZiAoc3RhdHVzICYgMHg4MCAvKlVBUlRfTVNSX0RDRCAqLyApCisJCQkJR01TdGF0dXNbaV0uZGNkID0gMTsKKwkJCWVsc2UKKwkJCQlHTVN0YXR1c1tpXS5kY2QgPSAwOworCisJCQlpZiAoc3RhdHVzICYgMHgyMCAvKlVBUlRfTVNSX0RTUiAqLyApCisJCQkJR01TdGF0dXNbaV0uZHNyID0gMTsKKwkJCWVsc2UKKwkJCQlHTVN0YXR1c1tpXS5kc3IgPSAwOworCisKKwkJCWlmIChzdGF0dXMgJiAweDEwIC8qVUFSVF9NU1JfQ1RTICovICkKKwkJCQlHTVN0YXR1c1tpXS5jdHMgPSAxOworCQkJZWxzZQorCQkJCUdNU3RhdHVzW2ldLmN0cyA9IDA7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBHTVN0YXR1cywgc2l6ZW9mKHN0cnVjdCBteHNlcl9tc3RhdHVzKSAqIE1YU0VSX1BPUlRTKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIE1PWEFfQVNQUF9NT05fRVhUOnsKKwkJCWludCBzdGF0dXM7CisJCQlpbnQgb3Btb2RlLCBwOworCQkJaW50IHNoaWZ0Yml0OworCQkJdW5zaWduZWQgY2ZsYWcsIGlmbGFnOworCisJCQlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfUE9SVFM7IGkrKykgeworCisJCQkJaWYgKCFteHZhcl90YWJsZVtpXS5iYXNlKQorCQkJCQljb250aW51ZTsKKworCQkJCXN0YXR1cyA9IG14c2VyX2dldF9tc3IobXh2YXJfdGFibGVbaV0uYmFzZSwgMCwgaSwgJihteHZhcl90YWJsZVtpXSkpOworLy8gICAgICAgICAgICAgICAgICAgICAgbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKCZteHZhcl90YWJsZVtpXSwgc3RhdHVzKTsKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfVEVSSSkKKwkJCQkJbXh2YXJfdGFibGVbaV0uaWNvdW50LnJuZysrOworCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERFNSKQorCQkJCQlteHZhcl90YWJsZVtpXS5pY291bnQuZHNyKys7CisJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REQ0QpCisJCQkJCW14dmFyX3RhYmxlW2ldLmljb3VudC5kY2QrKzsKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENUUykKKwkJCQkJbXh2YXJfdGFibGVbaV0uaWNvdW50LmN0cysrOworCisJCQkJbXh2YXJfdGFibGVbaV0ubW9uX2RhdGEubW9kZW1fc3RhdHVzID0gc3RhdHVzOworCQkJCW1vbl9kYXRhX2V4dC5yeF9jbnRbaV0gPSBteHZhcl90YWJsZVtpXS5tb25fZGF0YS5yeGNudDsKKwkJCQltb25fZGF0YV9leHQudHhfY250W2ldID0gbXh2YXJfdGFibGVbaV0ubW9uX2RhdGEudHhjbnQ7CisJCQkJbW9uX2RhdGFfZXh0LnVwX3J4Y250W2ldID0gbXh2YXJfdGFibGVbaV0ubW9uX2RhdGEudXBfcnhjbnQ7CisJCQkJbW9uX2RhdGFfZXh0LnVwX3R4Y250W2ldID0gbXh2YXJfdGFibGVbaV0ubW9uX2RhdGEudXBfdHhjbnQ7CisJCQkJbW9uX2RhdGFfZXh0Lm1vZGVtX3N0YXR1c1tpXSA9IG14dmFyX3RhYmxlW2ldLm1vbl9kYXRhLm1vZGVtX3N0YXR1czsKKwkJCQltb25fZGF0YV9leHQuYmF1ZHJhdGVbaV0gPSBteHZhcl90YWJsZVtpXS5yZWFsYmF1ZDsKKworCQkJCWlmICghbXh2YXJfdGFibGVbaV0udHR5IHx8ICFteHZhcl90YWJsZVtpXS50dHktPnRlcm1pb3MpIHsKKwkJCQkJY2ZsYWcgPSBteHZhcl90YWJsZVtpXS5ub3JtYWxfdGVybWlvcy5jX2NmbGFnOworCQkJCQlpZmxhZyA9IG14dmFyX3RhYmxlW2ldLm5vcm1hbF90ZXJtaW9zLmNfaWZsYWc7CisJCQkJfSBlbHNlIHsKKwkJCQkJY2ZsYWcgPSBteHZhcl90YWJsZVtpXS50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisJCQkJCWlmbGFnID0gbXh2YXJfdGFibGVbaV0udHR5LT50ZXJtaW9zLT5jX2lmbGFnOworCQkJCX0KKworCQkJCW1vbl9kYXRhX2V4dC5kYXRhYml0c1tpXSA9IGNmbGFnICYgQ1NJWkU7CisKKwkJCQltb25fZGF0YV9leHQuc3RvcGJpdHNbaV0gPSBjZmxhZyAmIENTVE9QQjsKKworCQkJCW1vbl9kYXRhX2V4dC5wYXJpdHlbaV0gPSBjZmxhZyAmIChQQVJFTkIgfCBQQVJPREQgfCBDTVNQQVIpOworCisJCQkJbW9uX2RhdGFfZXh0LmZsb3djdHJsW2ldID0gMHgwMDsKKworCQkJCWlmIChjZmxhZyAmIENSVFNDVFMpCisJCQkJCW1vbl9kYXRhX2V4dC5mbG93Y3RybFtpXSB8PSAweDAzOworCisJCQkJaWYgKGlmbGFnICYgKElYT04gfCBJWE9GRikpCisJCQkJCW1vbl9kYXRhX2V4dC5mbG93Y3RybFtpXSB8PSAweDBDOworCisJCQkJaWYgKG14dmFyX3RhYmxlW2ldLnR5cGUgPT0gUE9SVF8xNjU1MEEpCisJCQkJCW1vbl9kYXRhX2V4dC5maWZvW2ldID0gMTsKKwkJCQllbHNlCisJCQkJCW1vbl9kYXRhX2V4dC5maWZvW2ldID0gMDsKKworCQkJCXAgPSBpICUgNDsKKwkJCQlzaGlmdGJpdCA9IHAgKiAyOworCQkJCW9wbW9kZSA9IGluYihteHZhcl90YWJsZVtpXS5vcG1vZGVfaW9hZGRyKSA+PiBzaGlmdGJpdDsKKwkJCQlvcG1vZGUgJj0gT1BfTU9ERV9NQVNLOworCisJCQkJbW9uX2RhdGFfZXh0LmlmdHlwZVtpXSA9IG9wbW9kZTsKKworCQkJfQorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbW9uX2RhdGFfZXh0LCBzaXplb2Yoc3RydWN0IG14c2VyX21vbl9leHQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0dXJuIDA7CisKKwkJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIG14c2VyX3N0b3ByeChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKworCisJaW5mby0+bGRpc2Nfc3RvcF9yeCA9IDE7CisJaWYgKElfSVhPRkYodHR5KSkgeworCisJCS8vTVhfTE9DSygmaW5mby0+c2xvY2spOworCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJCQlpbmZvLT5JRVIgJj0gfk1PWEFfTVVTVF9SRUNWX0lTUjsKKwkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQl9IGVsc2UgeworCQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCisJCQlpbmZvLT54X2NoYXIgPSBTVE9QX0NIQVIodHR5KTsKKwkJCS8vICAgICAgb3V0YihpbmZvLT5JRVIsIDApOyAvLyBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkJb3V0YigwLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsJLyogZm9yY2UgVHggaW50ZXJydXB0ICovCisJCX0JCS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJLy9NWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsKKwl9CisKKwlpZiAoaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQkvL01YX0xPQ0soJmluZm8tPnNsb2NrKTsKKwkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9SVFM7CisJCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOworCQkvL01YX1VOTE9DSygmaW5mby0+c2xvY2spOworCX0KK30KKworc3RhdGljIHZvaWQgbXhzZXJfc3RhcnRyeChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWluZm8tPmxkaXNjX3N0b3BfcnggPSAwOworCWlmIChJX0lYT0ZGKHR0eSkpIHsKKwkJaWYgKGluZm8tPnhfY2hhcikKKwkJCWluZm8tPnhfY2hhciA9IDA7CisJCWVsc2UgeworCQkJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisKKwkJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJCQkJaW5mby0+SUVSIHw9IE1PWEFfTVVTVF9SRUNWX0lTUjsKKwkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCisJCQkJaW5mby0+eF9jaGFyID0gU1RBUlRfQ0hBUih0dHkpOworCQkJCS8vICAgICAgICAgIG91dGIoaW5mby0+SUVSLCAwKTsgLy8gbWFzayBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJCQlvdXRiKDAsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsJLyogZm9yY2UgVHggaW50ZXJydXB0ICovCisJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQl9CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJCS8vTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7CisJCX0KKwl9CisKKwlpZiAoaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQkvL01YX0xPQ0soJmluZm8tPnNsb2NrKTsKKwkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX1JUUzsKKwkJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7CisJCS8vTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7CisJfQorfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgdXBwZXItbGF5ZXIgdHR5IGxheWVyIHRvIHNpZ25hbCB0aGF0CisgKiBpbmNvbWluZyBjaGFyYWN0ZXJzIHNob3VsZCBiZSB0aHJvdHRsZWQuCisgKi8KK3N0YXRpYyB2b2lkIG14c2VyX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJLy9zdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvL01YX0xPQ0soJmluZm8tPnNsb2NrKTsKKwlteHNlcl9zdG9wcngodHR5KTsKKwkvL01YX1VOTE9DSygmaW5mby0+c2xvY2spOworfQorCitzdGF0aWMgdm9pZCBteHNlcl91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJLy9zdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvL01YX0xPQ0soJmluZm8tPnNsb2NrKTsKKwlteHNlcl9zdGFydHJ4KHR0eSk7CisJLy9NWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19jZmxhZykgfHwgKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgIT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkgeworCisJCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBvbGRfdGVybWlvcyk7CisKKwkJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCQlteHNlcl9zdGFydCh0dHkpOworCQl9CisJfQorCisvKiBIYW5kbGUgc3cgc3RvcHBlZCAqLworCWlmICgob2xkX3Rlcm1pb3MtPmNfaWZsYWcgJiBJWE9OKSAmJiAhKHR0eS0+dGVybWlvcy0+Y19pZmxhZyAmIElYT04pKSB7CisJCXR0eS0+c3RvcHBlZCA9IDA7CisKKwkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCQlESVNBQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQl9CisJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKworCQlteHNlcl9zdGFydCh0dHkpOworCX0KK30KKworLyoKKyAqIG14c2VyX3N0b3AoKSBhbmQgbXhzZXJfc3RhcnQoKQorICoKKyAqIFRoaXMgcm91dGluZXMgYXJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyBvciByZXNldHRpbmcgdHR5LT5zdG9wcGVkLgorICogVGhleSBlbmFibGUgb3IgZGlzYWJsZSB0cmFuc21pdHRlciBpbnRlcnJ1cHRzLCBhcyBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyB2b2lkIG14c2VyX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJaWYgKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpIHsKKwkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJaWYgKGluZm8tPnhtaXRfY250ICYmIGluZm8tPnhtaXRfYnVmICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKKwkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworfQorCisvKgorICogbXhzZXJfd2FpdF91bnRpbF9zZW50KCkgLS0tIHdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5CisgKi8KK3N0YXRpYyB2b2lkIG14c2VyX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIG9yaWdfamlmZmllcywgY2hhcl90aW1lOworCWludCBsc3I7CisKKwlpZiAoaW5mby0+dHlwZSA9PSBQT1JUX1VOS05PV04pCisJCXJldHVybjsKKworCWlmIChpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9PSAwKQorCQlyZXR1cm47CQkvKiBKdXN0IGluIGNhc2UuLi4uICovCisKKwlvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworCS8qCisJICogU2V0IHRoZSBjaGVjayBpbnRlcnZhbCB0byBiZSAxLzUgb2YgdGhlIGVzdGltYXRlZCB0aW1lIHRvCisJICogc2VuZCBhIHNpbmdsZSBjaGFyYWN0ZXIsIGFuZCBtYWtlIGl0IGF0IGxlYXN0IDEuICBUaGUgY2hlY2sKKwkgKiBpbnRlcnZhbCBzaG91bGQgYWxzbyBiZSBsZXNzIHRoYW4gdGhlIHRpbWVvdXQuCisJICoKKwkgKiBOb3RlOiB3ZSBoYXZlIHRvIHVzZSBwcmV0dHkgdGlnaHQgdGltaW5ncyBoZXJlIHRvIHNhdGlzZnkKKwkgKiB0aGUgTklTVC1QQ1RTLgorCSAqLworCWNoYXJfdGltZSA9IChpbmZvLT50aW1lb3V0IC0gSFogLyA1MCkgLyBpbmZvLT54bWl0X2ZpZm9fc2l6ZTsKKwljaGFyX3RpbWUgPSBjaGFyX3RpbWUgLyA1OworCWlmIChjaGFyX3RpbWUgPT0gMCkKKwkJY2hhcl90aW1lID0gMTsKKwlpZiAodGltZW91dCAmJiB0aW1lb3V0IDwgY2hhcl90aW1lKQorCQljaGFyX3RpbWUgPSB0aW1lb3V0OworCS8qCisJICogSWYgdGhlIHRyYW5zbWl0dGVyIGhhc24ndCBjbGVhcmVkIGluIHR3aWNlIHRoZSBhcHByb3hpbWF0ZQorCSAqIGFtb3VudCBvZiB0aW1lIHRvIHNlbmQgdGhlIGVudGlyZSBGSUZPLCBpdCBwcm9iYWJseSB3b24ndAorCSAqIGV2ZXIgY2xlYXIuICBUaGlzIGFzc3VtZXMgdGhlIFVBUlQgaXNuJ3QgZG9pbmcgZmxvdworCSAqIGNvbnRyb2wsIHdoaWNoIGlzIGN1cnJlbnRseSB0aGUgY2FzZS4gIEhlbmNlLCBpZiBpdCBldmVyCisJICogdGFrZXMgbG9uZ2VyIHRoYW4gaW5mby0+dGltZW91dCwgdGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gYQorCSAqIFVBUlQgYnVnIG9mIHNvbWUga2luZC4gIFNvLCB3ZSBjbGFtcCB0aGUgdGltZW91dCBwYXJhbWV0ZXIgYXQKKwkgKiAyKmluZm8tPnRpbWVvdXQuCisJICovCisJaWYgKCF0aW1lb3V0IHx8IHRpbWVvdXQgPiAyICogaW5mby0+dGltZW91dCkKKwkJdGltZW91dCA9IDIgKiBpbmZvLT50aW1lb3V0OworI2lmZGVmIFNFUklBTF9ERUJVR19SU19XQUlUX1VOVElMX1NFTlQKKwlwcmludGsoS0VSTl9ERUJVRyAiSW4gcnNfd2FpdF91bnRpbF9zZW50KCVkKSBjaGVjaz0lbHUuLi4iLCB0aW1lb3V0LCBjaGFyX3RpbWUpOworCXByaW50aygiamlmZj0lbHUuLi4iLCBqaWZmaWVzKTsKKyNlbmRpZgorCXdoaWxlICghKChsc3IgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKSkgJiBVQVJUX0xTUl9URU1UKSkgeworI2lmZGVmIFNFUklBTF9ERUJVR19SU19XQUlUX1VOVElMX1NFTlQKKwkJcHJpbnRrKCJsc3IgPSAlZCAoamlmZj0lbHUpLi4uIiwgbHNyLCBqaWZmaWVzKTsKKyNlbmRpZgorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KGNoYXJfdGltZSk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlpZiAodGltZW91dCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArIHRpbWVvdXQpKQorCQkJYnJlYWs7CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfUlNfV0FJVF9VTlRJTF9TRU5UCisJcHJpbnRrKCJsc3IgPSAlZCAoamlmZj0lbHUpLi4uZG9uZVxuIiwgbHNyLCBqaWZmaWVzKTsKKyNlbmRpZgorfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgorICovCit2b2lkIG14c2VyX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJbXhzZXJfZmx1c2hfYnVmZmVyKHR0eSk7CisJbXhzZXJfc2h1dGRvd24oaW5mbyk7CisJaW5mby0+ZXZlbnQgPSAwOworCWluZm8tPmNvdW50ID0gMDsKKwlpbmZvLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwlpbmZvLT50dHkgPSBOVUxMOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKK30KKworCisvLyBhZGRlZCBieSBKYW1lcyAwMy0xMi0yMDA0LgorLyoKKyAqIG14c2VyX3JzX2JyZWFrKCkgLS0tIHJvdXRpbmUgd2hpY2ggdHVybnMgdGhlIGJyZWFrIGhhbmRsaW5nIG9uIG9yIG9mZgorICovCitzdGF0aWMgdm9pZCBteHNlcl9yc19icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWlmIChicmVha19zdGF0ZSA9PSAtMSkKKwkJb3V0YihpbmIoaW5mby0+YmFzZSArIFVBUlRfTENSKSB8IFVBUlRfTENSX1NCQywgaW5mby0+YmFzZSArIFVBUlRfTENSKTsKKwllbHNlCisJCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xDUikgJiB+VUFSVF9MQ1JfU0JDLCBpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Cit9CisKKy8vIChhYm92ZSkgYWRkZWQgYnkgSmFtZXMuCisKKworLyoKKyAqIFRoaXMgaXMgdGhlIHNlcmlhbCBkcml2ZXIncyBnZW5lcmljIGludGVycnVwdCByb3V0aW5lCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBteHNlcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgc3RhdHVzLCBpaXIsIGk7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbzsKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICpwb3J0OworCWludCBtYXgsIGlycWJpdHMsIGJpdHMsIG1zcjsKKwlpbnQgcGFzc19jb3VudGVyID0gMDsKKwlpbnQgaGFuZGxlZCA9IElSUV9OT05FOworCisJcG9ydCA9IE5VTEw7CisJLy9zcGluX2xvY2soJmdtX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKSB7CisJCWlmIChkZXZfaWQgPT0gJihteHZhcl90YWJsZVtpICogTVhTRVJfUE9SVFNfUEVSX0JPQVJEXSkpIHsKKwkJCXBvcnQgPSBkZXZfaWQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IE1YU0VSX0JPQVJEUykgeworCQlnb3RvIGlycV9zdG9wOworCX0KKwlpZiAocG9ydCA9PSAwKSB7CisJCWdvdG8gaXJxX3N0b3A7CisJfQorCW1heCA9IG14c2VyX251bXBvcnRzW214c2VyY2ZnW2ldLmJvYXJkX3R5cGUgLSAxXTsKKwl3aGlsZSAoMSkgeworCQlpcnFiaXRzID0gaW5iKHBvcnQtPnZlY3RvcikgJiBwb3J0LT52ZWN0b3JtYXNrOworCQlpZiAoaXJxYml0cyA9PSBwb3J0LT52ZWN0b3JtYXNrKSB7CisJCQlicmVhazsKKwkJfQorCisJCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKKwkJZm9yIChpID0gMCwgYml0cyA9IDE7IGkgPCBtYXg7IGkrKywgaXJxYml0cyB8PSBiaXRzLCBiaXRzIDw8PSAxKSB7CisJCQlpZiAoaXJxYml0cyA9PSBwb3J0LT52ZWN0b3JtYXNrKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYml0cyAmIGlycWJpdHMpCisJCQkJY29udGludWU7CisJCQlpbmZvID0gcG9ydCArIGk7CisKKwkJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0xMy0yMDAyCisJCQlpaXIgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfSUlSKTsKKwkJCWlmIChpaXIgJiBVQVJUX0lJUl9OT19JTlQpCisJCQkJY29udGludWU7CisJCQlpaXIgJj0gTU9YQV9NVVNUX0lJUl9NQVNLOworCQkJaWYgKCFpbmZvLT50dHkpIHsKKwkJCQlzdGF0dXMgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKTsKKwkJCQlvdXRiKDB4MjcsIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CisJCQkJaW5iKGluZm8tPmJhc2UgKyBVQVJUX01TUik7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0xMy0yMDAyCisJCQkvKgorCQkJICAgaWYgKCBpbmZvLT50dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFLzQgKXsKKwkJCSAgIGluZm8tPklFUiB8PSBNT1hBX01VU1RfUkVDVl9JU1I7CisJCQkgICBvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJCSAgIH0KKwkJCSAqLworCisKKwkJCS8qIG1hc2sgYnkgVmljdG9yIFl1LiAwOS0xMy0yMDAyCisJCQkgICBpZiAoICFpbmZvLT50dHkgfHwKKwkJCSAgIChpbmIoaW5mby0+YmFzZSArIFVBUlRfSUlSKSAmIFVBUlRfSUlSX05PX0lOVCkgKQorCQkJICAgY29udGludWU7CisJCQkgKi8KKwkJCS8qIG1hc2sgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQkgICBzdGF0dXMgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKSAmIGluZm8tPnJlYWRfc3RhdHVzX21hc2s7CisJCQkgKi8KKworCQkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJCXN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpOworCisJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfUEUpIHsKKwkJCQlpbmZvLT5lcnJfc2hhZG93IHw9IE5QUElfTk9USUZZX1BBUklUWTsKKwkJCX0KKwkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9GRSkgeworCQkJCWluZm8tPmVycl9zaGFkb3cgfD0gTlBQSV9OT1RJRllfRlJBTUlORzsKKwkJCX0KKwkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9PRSkgeworCQkJCWluZm8tPmVycl9zaGFkb3cgfD0gTlBQSV9OT1RJRllfSFdfT1ZFUlJVTjsKKwkJCX0KKwkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9CSSkKKwkJCQlpbmZvLT5lcnJfc2hhZG93IHw9IE5QUElfTk9USUZZX0JSRUFLOworCisJCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJCQkJLyoKKwkJCQkgICBpZiAoIChzdGF0dXMgJiAweDAyKSAmJiAhKHN0YXR1cyAmIDB4MDEpICkgeworCQkJCSAgIG91dGIoaW5mby0+YmFzZStVQVJUX0ZDUiwgIDB4MjMpOworCQkJCSAgIGNvbnRpbnVlOworCQkJCSAgIH0KKwkJCQkgKi8KKwkJCQlpZiAoaWlyID09IE1PWEFfTVVTVF9JSVJfR0RBIHx8IGlpciA9PSBNT1hBX01VU1RfSUlSX1JEQSB8fCBpaXIgPT0gTU9YQV9NVVNUX0lJUl9SVE8gfHwgaWlyID09IE1PWEFfTVVTVF9JSVJfTFNSKQorCQkJCQlteHNlcl9yZWNlaXZlX2NoYXJzKGluZm8sICZzdGF0dXMpOworCisJCQl9IGVsc2UgeworCQkJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKworCQkJCXN0YXR1cyAmPSBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOworCQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9EUikKKwkJCQkJbXhzZXJfcmVjZWl2ZV9jaGFycyhpbmZvLCAmc3RhdHVzKTsKKwkJCX0KKwkJCW1zciA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOworCQkJaWYgKG1zciAmIFVBUlRfTVNSX0FOWV9ERUxUQSkgeworCQkJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBtc3IpOworCQkJfQorCQkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTEzLTIwMDIKKwkJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKKwkJCQlpZiAoKGlpciA9PSAweDAyKSAmJiAoc3RhdHVzICYgVUFSVF9MU1JfVEhSRSkpIHsKKwkJCQkJbXhzZXJfdHJhbnNtaXRfY2hhcnMoaW5mbyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0xMy0yMDAyCisKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfVEhSRSkgeworLyogOC0yLTk5IGJ5IFdpbGxpYW0KKwkJCSAgICBpZiAoIGluZm8tPnhfY2hhciB8fCAoaW5mby0+eG1pdF9jbnQgPiAwKSApCisqLworCQkJCQlteHNlcl90cmFuc21pdF9jaGFycyhpbmZvKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHBhc3NfY291bnRlcisrID4gTVhTRVJfSVNSX1BBU1NfTElNSVQpIHsKKwkJCWJyZWFrOwkvKiBQcmV2ZW50IGluZmluaXRlIGxvb3BzICovCisJCX0KKwl9CisKKyAgICAgIGlycV9zdG9wOgorCS8vc3Bpbl91bmxvY2soJmdtX2xvY2spOworCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgdm9pZCBteHNlcl9yZWNlaXZlX2NoYXJzKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8sIGludCAqc3RhdHVzKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CisJdW5zaWduZWQgY2hhciBjaCwgZ2RsOworCWludCBpZ25vcmVkID0gMDsKKwlpbnQgY250ID0gMDsKKwl1bnNpZ25lZCBjaGFyICpjcDsKKwljaGFyICpmcDsKKwlpbnQgY291bnQ7CisJaW50IHJlY3Zfcm9vbTsKKwlpbnQgbWF4ID0gMjU2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCXJlY3Zfcm9vbSA9IHR0eS0+bGRpc2MucmVjZWl2ZV9yb29tKHR0eSk7CisJaWYgKChyZWN2X3Jvb20gPT0gMCkgJiYgKCFpbmZvLT5sZGlzY19zdG9wX3J4KSkgeworCQkvL214c2VyX3Rocm90dGxlKHR0eSk7CisJCW14c2VyX3N0b3ByeCh0dHkpOworCQkvL3JldHVybjsKKwl9CisKKwljcCA9IHR0eS0+ZmxpcC5jaGFyX2J1ZjsKKwlmcCA9IHR0eS0+ZmxpcC5mbGFnX2J1ZjsKKwljb3VudCA9IDA7CisKKwkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgIT0gTU9YQV9PVEhFUl9VQVJUKSB7CisKKwkJaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9TUEVDSUFMKSB7CisJCQlnb3RvIGludHJfb2xkOworCQl9CisJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwMi0xMS0yMDA0CisJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgPT0gTU9YQV9NVVNUX01VODYwX0hXSUQgJiYgKCpzdGF0dXMgJiBNT1hBX01VU1RfTFNSX1JFUlIpKQorCQkJZ290byBpbnRyX29sZDsKKwkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDItMTQtMjAwNAorCQlpZiAoKnN0YXR1cyAmIE1PWEFfTVVTVF9MU1JfUkVSUikKKwkJCWdvdG8gaW50cl9vbGQ7CisKKwkJZ2RsID0gaW5iKGluZm8tPmJhc2UgKyBNT1hBX01VU1RfR0RMX1JFR0lTVEVSKTsKKworCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnID09IE1PWEFfTVVTVF9NVTE1MF9IV0lEKQkvLyBhZGQgYnkgVmljdG9yIFl1LiAwMi0xMS0yMDA0CisJCQlnZGwgJj0gTU9YQV9NVVNUX0dETF9NQVNLOworCQlpZiAoZ2RsID49IHJlY3Zfcm9vbSkgeworCQkJaWYgKCFpbmZvLT5sZGlzY19zdG9wX3J4KSB7CisJCQkJLy9teHNlcl90aHJvdHRsZSh0dHkpOworCQkJCW14c2VyX3N0b3ByeCh0dHkpOworCQkJfQorCQkJLy9yZXR1cm47CisJCX0KKwkJd2hpbGUgKGdkbC0tKSB7CisJCQljaCA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9SWCk7CisJCQljb3VudCsrOworCQkJKmNwKysgPSBjaDsKKwkJCSpmcCsrID0gMDsKKwkJCWNudCsrOworCQkJLyoKKwkJCSAgIGlmKChjb3VudD49SElfV0FURVIpICYmIChpbmZvLT5zdG9wX3J4PT0wKSl7CisJCQkgICBteHNlcl9zdG9wcngodHR5KTsKKwkJCSAgIGluZm8tPnN0b3Bfcng9MTsKKwkJCSAgIGJyZWFrOworCQkJICAgfSAqLworCQl9CisJCWdvdG8gZW5kX2ludHI7CisJfQoraW50cl9vbGQ6CisJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCisJZG8geworCQlpZiAobWF4LS0gPCAwKQorCQkJYnJlYWs7CisJCS8qCisJCSAgIGlmKChjb3VudD49SElfV0FURVIpICYmIChpbmZvLT5zdG9wX3J4PT0wKSl7CisJCSAgIG14c2VyX3N0b3ByeCh0dHkpOworCQkgICBpbmZvLT5zdG9wX3J4PTE7CisJCSAgIGJyZWFrOworCQkgICB9CisJCSAqLworCisJCWNoID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX1JYKTsKKwkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZyAmJiAoKnN0YXR1cyAmIFVBUlRfTFNSX09FKSAvKiYmICEoKnN0YXR1cyZVQVJUX0xTUl9EUikgKi8gKQorCQkJb3V0YigweDIzLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCQkqc3RhdHVzICY9IGluZm8tPnJlYWRfc3RhdHVzX21hc2s7CisJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJaWYgKCpzdGF0dXMgJiBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2spIHsKKwkJCWlmICgrK2lnbm9yZWQgPiAxMDApCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQljb3VudCsrOworCQkJaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9TUEVDSUFMKSB7CisJCQkJaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9CSSkgeworCQkJCQkqZnArKyA9IFRUWV9CUkVBSzsKKy8qIGFkZGVkIGJ5IGNhc3BlciAxLzExLzIwMDAgKi8KKwkJCQkJaW5mby0+aWNvdW50LmJyaysrOworCisvKiAqLworCQkJCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQkJCQlkb19TQUsodHR5KTsKKwkJCQl9IGVsc2UgaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9QRSkgeworCQkJCQkqZnArKyA9IFRUWV9QQVJJVFk7CisvKiBhZGRlZCBieSBjYXNwZXIgMS8xMS8yMDAwICovCisJCQkJCWluZm8tPmljb3VudC5wYXJpdHkrKzsKKy8qICovCisJCQkJfSBlbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfRkUpIHsKKwkJCQkJKmZwKysgPSBUVFlfRlJBTUU7CisvKiBhZGRlZCBieSBjYXNwZXIgMS8xMS8yMDAwICovCisJCQkJCWluZm8tPmljb3VudC5mcmFtZSsrOworLyogKi8KKwkJCQl9IGVsc2UgaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9PRSkgeworCQkJCQkqZnArKyA9IFRUWV9PVkVSUlVOOworLyogYWRkZWQgYnkgY2FzcGVyIDEvMTEvMjAwMCAqLworCQkJCQlpbmZvLT5pY291bnQub3ZlcnJ1bisrOworLyogKi8KKwkJCQl9IGVsc2UKKwkJCQkJKmZwKysgPSAwOworCQkJfSBlbHNlCisJCQkJKmZwKysgPSAwOworCQkJKmNwKysgPSBjaDsKKwkJCWNudCsrOworCQkJaWYgKGNudCA+PSByZWN2X3Jvb20pIHsKKwkJCQlpZiAoIWluZm8tPmxkaXNjX3N0b3BfcngpIHsKKwkJCQkJLy9teHNlcl90aHJvdHRsZSh0dHkpOworCQkJCQlteHNlcl9zdG9wcngodHR5KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJfQorCisJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpCisJCQlicmVhazsKKwkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCisJCS8qIG1hc2sgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCSAqc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUikgJiBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOworCQkgKi8KKwkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJKnN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpOworCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJfSB3aGlsZSAoKnN0YXR1cyAmIFVBUlRfTFNSX0RSKTsKKworICAgICAgZW5kX2ludHI6CQkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisKKwlteHZhcl9sb2cucnhjbnRbaW5mby0+cG9ydF0gKz0gY250OworCWluZm8tPm1vbl9kYXRhLnJ4Y250ICs9IGNudDsKKwlpbmZvLT5tb25fZGF0YS51cF9yeGNudCArPSBjbnQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkKKwl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworfQorCitzdGF0aWMgdm9pZCBteHNlcl90cmFuc21pdF9jaGFycyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvKQoreworCWludCBjb3VudCwgY250OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCWlmIChpbmZvLT54X2NoYXIpIHsKKwkJb3V0YihpbmZvLT54X2NoYXIsIGluZm8tPmJhc2UgKyBVQVJUX1RYKTsKKwkJaW5mby0+eF9jaGFyID0gMDsKKwkJbXh2YXJfbG9nLnR4Y250W2luZm8tPnBvcnRdKys7CisJCWluZm8tPm1vbl9kYXRhLnR4Y250Kys7CisJCWluZm8tPm1vbl9kYXRhLnVwX3R4Y250Kys7CisKKy8qIGFkZGVkIGJ5IGNhc3BlciAxLzExLzIwMDAgKi8KKwkJaW5mby0+aWNvdW50LnR4Kys7CisvKiAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJaWYgKGluZm8tPnhtaXRfYnVmID09IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoaW5mby0+eG1pdF9jbnQgPD0gMCkgfHwgaW5mby0+dHR5LT5zdG9wcGVkIHx8IChpbmZvLT50dHktPmh3X3N0b3BwZWQgJiYgKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkpIHsKKwkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWNudCA9IGluZm8tPnhtaXRfY250OworCWNvdW50ID0gaW5mby0+eG1pdF9maWZvX3NpemU7CisJZG8geworCQlvdXRiKGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbCsrXSwgaW5mby0+YmFzZSArIFVBUlRfVFgpOworCQlpbmZvLT54bWl0X3RhaWwgPSBpbmZvLT54bWl0X3RhaWwgJiAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOworCQlpZiAoLS1pbmZvLT54bWl0X2NudCA8PSAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoLS1jb3VudCA+IDApOworCW14dmFyX2xvZy50eGNudFtpbmZvLT5wb3J0XSArPSAoY250IC0gaW5mby0+eG1pdF9jbnQpOworCisvLyBhZGRlZCBieSBKYW1lcyAwMy0xMi0yMDA0LgorCWluZm8tPm1vbl9kYXRhLnR4Y250ICs9IChjbnQgLSBpbmZvLT54bWl0X2NudCk7CisJaW5mby0+bW9uX2RhdGEudXBfdHhjbnQgKz0gKGNudCAtIGluZm8tPnhtaXRfY250KTsKKy8vIChhYm92ZSkgYWRkZWQgYnkgSmFtZXMuCisKKy8qIGFkZGVkIGJ5IGNhc3BlciAxLzExLzIwMDAgKi8KKwlpbmZvLT5pY291bnQudHggKz0gKGNudCAtIGluZm8tPnhtaXRfY250KTsKKy8qICovCisKKwlpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpIHsKKwkJc2V0X2JpdChNWFNFUl9FVkVOVF9UWExPVywgJmluZm8tPmV2ZW50KTsKKwkJc2NoZWR1bGVfd29yaygmaW5mby0+dHF1ZXVlKTsKKwl9CisJaWYgKGluZm8tPnhtaXRfY250IDw9IDApIHsKKwkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8sIGludCBzdGF0dXMpCit7CisJLyogdXBkYXRlIGlucHV0IGxpbmUgY291bnRlcnMgKi8KKwlpZiAoc3RhdHVzICYgVUFSVF9NU1JfVEVSSSkKKwkJaW5mby0+aWNvdW50LnJuZysrOworCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERFNSKQorCQlpbmZvLT5pY291bnQuZHNyKys7CisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REQ0QpCisJCWluZm8tPmljb3VudC5kY2QrKzsKKwlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENUUykKKwkJaW5mby0+aWNvdW50LmN0cysrOworCWluZm8tPm1vbl9kYXRhLm1vZGVtX3N0YXR1cyA9IHN0YXR1czsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKworCisJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAmJiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkpIHsKKwkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKwkJc2NoZWR1bGVfd29yaygmaW5mby0+dHF1ZXVlKTsKKwl9CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgeworCQlpZiAoaW5mby0+dHR5LT5od19zdG9wcGVkKSB7CisJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSB7CisJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMDsKKworCQkJCWlmICgoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYgKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSB7CisJCQkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCQkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJCQl9CisJCQkJc2V0X2JpdChNWFNFUl9FVkVOVF9UWExPVywgJmluZm8tPmV2ZW50KTsKKwkJCQlzY2hlZHVsZV93b3JrKCZpbmZvLT50cXVldWUpOwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykpIHsKKwkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAxOworCQkJCWlmICgoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYgKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSB7CisJCQkJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IG14c2VyX2Jsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQgcmV0dmFsOworCWludCBkb19jbG9jYWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIElmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCwgb3IgdGhlIHBvcnQgaXMgbm90IGVuYWJsZWQsCisJICogdGhlbiBtYWtlIHRoZSBjaGVjayB1cCBmcm9udCBhbmQgdGhlbiBleGl0LgorCSAqLworCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8ICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKKwkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQlkb19jbG9jYWwgPSAxOworCisJLyoKKwkgKiBCbG9jayB3YWl0aW5nIGZvciB0aGUgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZQorCSAqIGZyZWUgKGkuZS4sIG5vdCBpbiB1c2UgYnkgdGhlIGNhbGxvdXQpLiAgV2hpbGUgd2UgYXJlIGluCisJICogdGhpcyBsb29wLCBpbmZvLT5jb3VudCBpcyBkcm9wcGVkIGJ5IG9uZSwgc28gdGhhdAorCSAqIG14c2VyX2Nsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIFdlIHJlc3RvcmUgaXQgdXBvbgorCSAqIGV4aXQsIGVpdGhlciBub3JtYWwgb3IgYWJub3JtYWwuCisJICovCisJcmV0dmFsID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCisJCWluZm8tPmNvdW50LS07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpbmZvLT5ibG9ja2VkX29wZW4rKzsKKwl3aGlsZSAoMSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJb3V0YihpbmIoaW5mby0+YmFzZSArIFVBUlRfTUNSKSB8IFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUywgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgeworCQkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZWxzZQorCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYgKGRvX2Nsb2NhbCB8fCAoaW5iKGluZm8tPmJhc2UgKyBVQVJUX01TUikgJiBVQVJUX01TUl9EQ0QpKSkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJaW5mby0+Y291bnQrKzsKKwlpbmZvLT5ibG9ja2VkX29wZW4tLTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gKHJldHZhbCk7CisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IG14c2VyX3N0YXJ0dXAoc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbykKK3sKKworCXVuc2lnbmVkIGxvbmcgcGFnZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAoLUVOT01FTSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCWZyZWVfcGFnZShwYWdlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlpZiAoIWluZm8tPmJhc2UgfHwgIWluZm8tPnR5cGUpIHsKKwkJaWYgKGluZm8tPnR0eSkKKwkJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJCWZyZWVfcGFnZShwYWdlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKGluZm8tPnhtaXRfYnVmKQorCQlmcmVlX3BhZ2UocGFnZSk7CisJZWxzZQorCQlpbmZvLT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2U7CisKKwkvKgorCSAqIENsZWFyIHRoZSBGSUZPIGJ1ZmZlcnMgYW5kIGRpc2FibGUgdGhlbQorCSAqICh0aGV5IHdpbGwgYmUgcmVlbmFibGVkIGluIG14c2VyX2NoYW5nZV9zcGVlZCgpKQorCSAqLworCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpCisJCW91dGIoKFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUIHwgTU9YQV9NVVNUX0ZDUl9HREFfTU9ERV9FTkFCTEUpLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCWVsc2UKKwkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHRoZXJlJ3Mgbm8gd2F5IHRoZSBMU1IgY291bGQgc3RpbGwgYmUgMHhGRjsKKwkgKiBpZiBpdCBpcywgdGhlbiBiYWlsIG91dCwgYmVjYXVzZSB0aGVyZSdzIGxpa2VseSBubyBVQVJUCisJICogaGVyZS4KKwkgKi8KKwlpZiAoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUikgPT0gMHhmZikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQkJaWYgKGluZm8tPnR0eSkKKwkJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQkJcmV0dXJuICgwKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gKC1FTk9ERVYpOworCX0KKworCS8qCisJICogQ2xlYXIgdGhlIGludGVycnVwdCByZWdpc3RlcnMuCisJICovCisJKHZvaWQpIGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpOworCSh2b2lkKSBpbmIoaW5mby0+YmFzZSArIFVBUlRfUlgpOworCSh2b2lkKSBpbmIoaW5mby0+YmFzZSArIFVBUlRfSUlSKTsKKwkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX01TUik7CisKKwkvKgorCSAqIE5vdywgaW5pdGlhbGl6ZSB0aGUgVUFSVAorCSAqLworCW91dGIoVUFSVF9MQ1JfV0xFTjgsIGluZm8tPmJhc2UgKyBVQVJUX0xDUik7CS8qIHJlc2V0IERMQUIgKi8KKwlpbmZvLT5NQ1IgPSBVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFM7CisJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7CisKKwkvKgorCSAqIEZpbmFsbHksIGVuYWJsZSBpbnRlcnJ1cHRzCisJICovCisJaW5mby0+SUVSID0gVUFSVF9JRVJfTVNJIHwgVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESTsKKy8vICAgICAgaW5mby0+SUVSID0gVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESTsKKworCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyCisJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykKKwkJaW5mby0+SUVSIHw9IE1PWEFfTVVTVF9JRVJfRUdEQUk7CisJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMgorCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCisJLyoKKwkgKiBBbmQgY2xlYXIgdGhlIGludGVycnVwdCByZWdpc3RlcnMgYWdhaW4gZm9yIGx1Y2suCisJICovCisJKHZvaWQpIGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpOworCSh2b2lkKSBpbmIoaW5mby0+YmFzZSArIFVBUlRfUlgpOworCSh2b2lkKSBpbmIoaW5mby0+YmFzZSArIFVBUlRfSUlSKTsKKwkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX01TUik7CisKKwlpZiAoaW5mby0+dHR5KQorCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOworCisJLyoKKwkgKiBhbmQgc2V0IHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQKKwkgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBOVUxMKTsKKworCWluZm8tPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBzaHV0ZG93biBhIHNlcmlhbCBwb3J0OyBpbnRlcnJ1cHRzIG1heWJlIGRpc2FibGVkLCBhbmQKKyAqIERUUiBpcyBkcm9wcGVkIGlmIHRoZSBoYW5ndXAgb24gY2xvc2UgdGVybWlvIGZsYWcgaXMgb24uCisgKi8KK3N0YXRpYyB2b2lkIG14c2VyX3NodXRkb3duKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogY2xlYXIgZGVsdGFfbXNyX3dhaXQgcXVldWUgdG8gYXZvaWQgbWVtIGxlYWtzOiB3ZSBtYXkgZnJlZSB0aGUgaXJxCisJICogaGVyZSBzbyB0aGUgcXVldWUgbWlnaHQgbmV2ZXIgYmUgd2FrZW4gdXAKKwkgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKworCS8qCisJICogRnJlZSB0aGUgSVJRLCBpZiBuZWNlc3NhcnkKKwkgKi8KKwlpZiAoaW5mby0+eG1pdF9idWYpIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT54bWl0X2J1Zik7CisJCWluZm8tPnhtaXRfYnVmID0gTlVMTDsKKwl9CisKKwlpbmZvLT5JRVIgPSAwOworCW91dGIoMHgwMCwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKworCWlmICghaW5mby0+dHR5IHx8IChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkpCisJCWluZm8tPk1DUiAmPSB+KFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyk7CisJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7CisKKwkvKiBjbGVhciBSeC9UeCBGSUZPJ3MgKi8KKwkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMgorCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpCisJCW91dGIoKFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUIHwgTU9YQV9NVVNUX0ZDUl9HREFfTU9ERV9FTkFCTEUpLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCWVsc2UKKwkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMgorCQlvdXRiKChVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCksIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CisKKwkvKiByZWFkIGRhdGEgcG9ydCB0byByZXNldCB0aGluZ3MgKi8KKwkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX1JYKTsKKworCWlmIChpbmZvLT50dHkpCisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisKKwlpbmZvLT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisKKwkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMjMtMjAwMgorCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKKwkJU0VUX01PWEFfTVVTVF9OT19TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7CisJfQorCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTIzLTIwMDIKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHNldCB0aGUgVUFSVCBkaXZpc29yIHJlZ2lzdGVycyB0byBtYXRjaAorICogdGhlIHNwZWNpZmllZCBiYXVkIHJhdGUgZm9yIGEgc2VyaWFsIHBvcnQuCisgKi8KK3N0YXRpYyBpbnQgbXhzZXJfY2hhbmdlX3NwZWVkKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8sIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwl1bnNpZ25lZCBjZmxhZywgY3ZhbCwgZmNyOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCWxvbmcgYmF1ZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlpZiAoIWluZm8tPnR0eSB8fCAhaW5mby0+dHR5LT50ZXJtaW9zKQorCQlyZXR1cm4gcmV0OworCWNmbGFnID0gaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCWlmICghKGluZm8tPmJhc2UpKQorCQlyZXR1cm4gcmV0OworCisKKyNpZm5kZWYgQjkyMTYwMAorI2RlZmluZSBCOTIxNjAwIChCNDYwODAwICsxKQorI2VuZGlmCisJaWYgKG14c2VyX3NldF9iYXVkX21ldGhvZFtpbmZvLT5wb3J0XSA9PSAwKSB7CisJCXN3aXRjaCAoY2ZsYWcgJiAoQ0JBVUQgfCBDQkFVREVYKSkgeworCQljYXNlIEI5MjE2MDA6CisJCQliYXVkID0gOTIxNjAwOworCQkJYnJlYWs7CisJCWNhc2UgQjQ2MDgwMDoKKwkJCWJhdWQgPSA0NjA4MDA7CisJCQlicmVhazsKKwkJY2FzZSBCMjMwNDAwOgorCQkJYmF1ZCA9IDIzMDQwMDsKKwkJCWJyZWFrOworCQljYXNlIEIxMTUyMDA6CisJCQliYXVkID0gMTE1MjAwOworCQkJYnJlYWs7CisJCWNhc2UgQjU3NjAwOgorCQkJYmF1ZCA9IDU3NjAwOworCQkJYnJlYWs7CisJCWNhc2UgQjM4NDAwOgorCQkJYmF1ZCA9IDM4NDAwOworCQkJYnJlYWs7CisJCWNhc2UgQjE5MjAwOgorCQkJYmF1ZCA9IDE5MjAwOworCQkJYnJlYWs7CisJCWNhc2UgQjk2MDA6CisJCQliYXVkID0gOTYwMDsKKwkJCWJyZWFrOworCQljYXNlIEI0ODAwOgorCQkJYmF1ZCA9IDQ4MDA7CisJCQlicmVhazsKKwkJY2FzZSBCMjQwMDoKKwkJCWJhdWQgPSAyNDAwOworCQkJYnJlYWs7CisJCWNhc2UgQjE4MDA6CisJCQliYXVkID0gMTgwMDsKKwkJCWJyZWFrOworCQljYXNlIEIxMjAwOgorCQkJYmF1ZCA9IDEyMDA7CisJCQlicmVhazsKKwkJY2FzZSBCNjAwOgorCQkJYmF1ZCA9IDYwMDsKKwkJCWJyZWFrOworCQljYXNlIEIzMDA6CisJCQliYXVkID0gMzAwOworCQkJYnJlYWs7CisJCWNhc2UgQjIwMDoKKwkJCWJhdWQgPSAyMDA7CisJCQlicmVhazsKKwkJY2FzZSBCMTUwOgorCQkJYmF1ZCA9IDE1MDsKKwkJCWJyZWFrOworCQljYXNlIEIxMzQ6CisJCQliYXVkID0gMTM0OworCQkJYnJlYWs7CisJCWNhc2UgQjExMDoKKwkJCWJhdWQgPSAxMTA7CisJCQlicmVhazsKKwkJY2FzZSBCNzU6CisJCQliYXVkID0gNzU7CisJCQlicmVhazsKKwkJY2FzZSBCNTA6CisJCQliYXVkID0gNTA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJhdWQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJbXhzZXJfc2V0X2JhdWQoaW5mbywgYmF1ZCk7CisJfQorCisJLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KKwlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKKwljYXNlIENTNToKKwkJY3ZhbCA9IDB4MDA7CisJCWJyZWFrOworCWNhc2UgQ1M2OgorCQljdmFsID0gMHgwMTsKKwkJYnJlYWs7CisJY2FzZSBDUzc6CisJCWN2YWwgPSAweDAyOworCQlicmVhazsKKwljYXNlIENTODoKKwkJY3ZhbCA9IDB4MDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWN2YWwgPSAweDAwOworCQlicmVhazsJCS8qIHRvbyBrZWVwIEdDQyBzaHV0Li4uICovCisJfQorCWlmIChjZmxhZyAmIENTVE9QQikKKwkJY3ZhbCB8PSAweDA0OworCWlmIChjZmxhZyAmIFBBUkVOQikKKwkJY3ZhbCB8PSBVQVJUX0xDUl9QQVJJVFk7CisJaWYgKCEoY2ZsYWcgJiBQQVJPREQpKSB7CisJCWN2YWwgfD0gVUFSVF9MQ1JfRVBBUjsKKwl9CisJaWYgKGNmbGFnICYgQ01TUEFSKQorCQljdmFsIHw9IFVBUlRfTENSX1NQQVI7CisKKwlpZiAoKGluZm8tPnR5cGUgPT0gUE9SVF84MjUwKSB8fCAoaW5mby0+dHlwZSA9PSBQT1JUXzE2NDUwKSkgeworCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJCQlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTzsKKwkJCWZjciB8PSBNT1hBX01VU1RfRkNSX0dEQV9NT0RFX0VOQUJMRTsKKwkJCVNFVF9NT1hBX01VU1RfRklGT19WQUxVRShpbmZvKTsKKwkJfSBlbHNlCisJCQlmY3IgPSAwOworCX0gZWxzZSB7CisJCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPOworCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMgorCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJCQlmY3IgfD0gTU9YQV9NVVNUX0ZDUl9HREFfTU9ERV9FTkFCTEU7CisJCQlTRVRfTU9YQV9NVVNUX0ZJRk9fVkFMVUUoaW5mbyk7CisJCX0gZWxzZSB7CisJCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyCisKKwkJCXN3aXRjaCAoaW5mby0+cnhfdHJpZ2dlcikgeworCQkJY2FzZSAxOgorCQkJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzE7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgODoKKwkJCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl84OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xNDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIENUUyBmbG93IGNvbnRyb2wgZmxhZyBhbmQgbW9kZW0gc3RhdHVzIGludGVycnVwdHMgKi8KKwlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX01TSTsKKwlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX0FGRTsKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfTVNJOworCQlpZiAoKGluZm8tPnR5cGUgPT0gUE9SVF8xNjU1MEEpIHx8IChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSB7CisJCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfQUZFOworCQkJLy9zdGF0dXMgPSBteHNlcl9nZXRfbXNyKGluZm8tPmJhc2UsIDAsIGluZm8tPnBvcnQpOworLyoJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJc3RhdHVzID0gaW5iKGJhc2VhZGRyICsgVUFSVF9NU1IpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOyovCisJCQkvL214c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOworCQl9IGVsc2UgeworCQkJLy9zdGF0dXMgPSBteHNlcl9nZXRfbXNyKGluZm8tPmJhc2UsIDAsIGluZm8tPnBvcnQpOworCisJCQkvL01YX0xPQ0soJmluZm8tPnNsb2NrKTsKKwkJCXN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOworCQkJLy9NWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsKKwkJCWlmIChpbmZvLT50dHktPmh3X3N0b3BwZWQpIHsKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSB7CisJCQkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCQkJCWlmICgoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYgKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSB7CisJCQkJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJCQl9CisJCQkJCXNldF9iaXQoTVhTRVJfRVZFTlRfVFhMT1csICZpbmZvLT5ldmVudCk7CisJCQkJCXNjaGVkdWxlX3dvcmsoJmluZm8tPnRxdWV1ZSk7CQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKCEoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSkgeworCQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAxOworCQkJCQlpZiAoKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQkJCQkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQkJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ1RTX0ZMT1c7CisJfQorCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOworCWlmIChjZmxhZyAmIENMT0NBTCkgeworCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJfSBlbHNlIHsKKwkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9NU0k7CisJfQorCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCisJLyoKKwkgKiBTZXQgdXAgcGFyaXR5IGNoZWNrIGZsYWcKKwkgKi8KKwlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gVUFSVF9MU1JfT0UgfCBVQVJUX0xTUl9USFJFIHwgVUFSVF9MU1JfRFI7CisJaWYgKElfSU5QQ0soaW5mby0+dHR5KSkKKwkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFOworCWlmIChJX0JSS0lOVChpbmZvLT50dHkpIHx8IElfUEFSTVJLKGluZm8tPnR0eSkpCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7CisKKwlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgPSAwOworCisJaWYgKElfSUdOQlJLKGluZm8tPnR0eSkpIHsKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCQkvKgorCQkgKiBJZiB3ZSdyZSBpZ25vcmUgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLCBpZ25vcmUKKwkJICogb3ZlcnJ1bnMgdG9vLiAgKEZvciByZWFsIHJhdyBzdXBwb3J0KS4KKwkJICovCisJCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKSB7CisJCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfT0UgfCBVQVJUX0xTUl9QRSB8IFVBUlRfTFNSX0ZFOworCQkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9PRSB8IFVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7CisJCX0KKwl9CisJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlTRVRfTU9YQV9NVVNUX1hPTjFfVkFMVUUoaW5mby0+YmFzZSwgU1RBUlRfQ0hBUihpbmZvLT50dHkpKTsKKwkJU0VUX01PWEFfTVVTVF9YT0ZGMV9WQUxVRShpbmZvLT5iYXNlLCBTVE9QX0NIQVIoaW5mby0+dHR5KSk7CisJCWlmIChJX0lYT04oaW5mby0+dHR5KSkgeworCQkJRU5BQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7CisJCX0gZWxzZSB7CisJCQlESVNBQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7CisJCX0KKwkJaWYgKElfSVhPRkYoaW5mby0+dHR5KSkgeworCQkJRU5BQkxFX01PWEFfTVVTVF9UWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7CisJCX0gZWxzZSB7CisJCQlESVNBQkxFX01PWEFfTVVTVF9UWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7CisJCX0KKwkJLyoKKwkJICAgaWYgKCBJX0lYQU5ZKGluZm8tPnR0eSkgKSB7CisJCSAgIGluZm8tPk1DUiB8PSBNT1hBX01VU1RfTUNSX1hPTl9BTlk7CisJCSAgIEVOQUJMRV9NT1hBX01VU1RfWE9OX0FOWV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7CisJCSAgIH0gZWxzZSB7CisJCSAgIGluZm8tPk1DUiAmPSB+TU9YQV9NVVNUX01DUl9YT05fQU5ZOworCQkgICBESVNBQkxFX01PWEFfTVVTVF9YT05fQU5ZX0ZMT1dfQ09OVFJPTChpbmZvLT5iYXNlKTsKKwkJICAgfQorCQkgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwl9CisJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCisKKwlvdXRiKGZjciwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsJLyogc2V0IGZjciAqLworCW91dGIoY3ZhbCwgaW5mby0+YmFzZSArIFVBUlRfTENSKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBteHNlcl9zZXRfYmF1ZChzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBsb25nIG5ld3NwZCkKK3sKKwlpbnQgcXVvdCA9IDA7CisJdW5zaWduZWQgY2hhciBjdmFsOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWluZm8tPnR0eSB8fCAhaW5mby0+dHR5LT50ZXJtaW9zKQorCQlyZXR1cm4gcmV0OworCisJaWYgKCEoaW5mby0+YmFzZSkpCisJCXJldHVybiByZXQ7CisKKwlpZiAobmV3c3BkID4gaW5mby0+TWF4Q2FuU2V0QmF1ZFJhdGUpCisJCXJldHVybiAwOworCisJaW5mby0+cmVhbGJhdWQgPSBuZXdzcGQ7CisJaWYgKG5ld3NwZCA9PSAxMzQpIHsKKwkJcXVvdCA9ICgyICogaW5mby0+YmF1ZF9iYXNlIC8gMjY5KTsKKwl9IGVsc2UgaWYgKG5ld3NwZCkgeworCQlxdW90ID0gaW5mby0+YmF1ZF9iYXNlIC8gbmV3c3BkOworCisJCWlmIChxdW90ID09IDApCisJCQlxdW90ID0gMTsKKworCX0gZWxzZSB7CisJCXF1b3QgPSAwOworCX0KKworCWluZm8tPnRpbWVvdXQgPSAoKGluZm8tPnhtaXRfZmlmb19zaXplICogSFogKiAxMCAqIHF1b3QpIC8gaW5mby0+YmF1ZF9iYXNlKTsKKwlpbmZvLT50aW1lb3V0ICs9IEhaIC8gNTA7CS8qIEFkZCAuMDIgc2Vjb25kcyBvZiBzbG9wICovCisKKwlpZiAocXVvdCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0RUUjsKKwkJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfRFRSOworCQlvdXRiKGluZm8tPk1DUiwgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljdmFsID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xDUik7CisKKwlvdXRiKGN2YWwgfCBVQVJUX0xDUl9ETEFCLCBpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOwkvKiBzZXQgRExBQiAqLworCisJb3V0YihxdW90ICYgMHhmZiwgaW5mby0+YmFzZSArIFVBUlRfRExMKTsJLyogTFMgb2YgZGl2aXNvciAqLworCW91dGIocXVvdCA+PiA4LCBpbmZvLT5iYXNlICsgVUFSVF9ETE0pOwkvKiBNUyBvZiBkaXZpc29yICovCisJb3V0YihjdmFsLCBpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOwkvKiByZXNldCBETEFCICovCisKKworCXJldHVybiByZXQ7Cit9CisKKworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmcmllbmRzIG9mIG14c2VyX2lvY3RsKCkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IG14c2VyX2dldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOworCisJaWYgKCFyZXRpbmZvKQorCQlyZXR1cm4gKC1FRkFVTFQpOworCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisJdG1wLnR5cGUgPSBpbmZvLT50eXBlOworCXRtcC5saW5lID0gaW5mby0+cG9ydDsKKwl0bXAucG9ydCA9IGluZm8tPmJhc2U7CisJdG1wLmlycSA9IGluZm8tPmlycTsKKwl0bXAuZmxhZ3MgPSBpbmZvLT5mbGFnczsKKwl0bXAuYmF1ZF9iYXNlID0gaW5mby0+YmF1ZF9iYXNlOworCXRtcC5jbG9zZV9kZWxheSA9IGluZm8tPmNsb3NlX2RlbGF5OworCXRtcC5jbG9zaW5nX3dhaXQgPSBpbmZvLT5jbG9zaW5nX3dhaXQ7CisJdG1wLmN1c3RvbV9kaXZpc29yID0gaW5mby0+Y3VzdG9tX2Rpdmlzb3I7CisJdG1wLmh1YjYgPSAwOworCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8sIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqbmV3X2luZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoIW5ld19pbmZvIHx8ICFpbmZvLT5iYXNlKQorCQlyZXR1cm4gKC1FRkFVTFQpOworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NlcmlhbCwgbmV3X2luZm8sIHNpemVvZihuZXdfc2VyaWFsKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChuZXdfc2VyaWFsLmlycSAhPSBpbmZvLT5pcnEpIHx8IChuZXdfc2VyaWFsLnBvcnQgIT0gaW5mby0+YmFzZSkgfHwgKG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3IgIT0gaW5mby0+Y3VzdG9tX2Rpdmlzb3IpIHx8IChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkX2Jhc2UpKQorCQlyZXR1cm4gKC1FUEVSTSk7CisKKwlmbGFncyA9IGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0s7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkX2Jhc2UpIHx8IChuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICE9IGluZm8tPmNsb3NlX2RlbGF5KSB8fCAoKG5ld19zZXJpYWwuZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spICE9IChpbmZvLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQorCQkJcmV0dXJuICgtRVBFUk0pOworCQlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE9LLCBwYXN0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3IgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZS4KKwkJICogQXQgdGhpcyBwb2ludCwgd2Ugc3RhcnQgbWFraW5nIGNoYW5nZXMuLi4uLgorCQkgKi8KKwkJaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8IChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKKwkJaW5mby0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICogSFogLyAxMDA7CisJCWluZm8tPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFogLyAxMDA7CisJCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKwkJaW5mby0+dHR5LT5sb3dfbGF0ZW5jeSA9IDA7CS8vKGluZm8tPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CisJfQorCisJLyogYWRkZWQgYnkgY2FzcGVyLCAzLzE3LzIwMDAsIGZvciBtb3VzZSAqLworCWluZm8tPnR5cGUgPSBuZXdfc2VyaWFsLnR5cGU7CisKKwlwcm9jZXNzX3R4cnhfZmlmbyhpbmZvKTsKKworCS8qICovCisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKKwkJaWYgKGZsYWdzICE9IChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSkgeworCQkJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIE5VTEwpOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gbXhzZXJfc3RhcnR1cChpbmZvKTsKKwl9CisJcmV0dXJuIChyZXR2YWwpOworfQorCisvKgorICogbXhzZXJfZ2V0X2xzcl9pbmZvIC0gZ2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyIGluZm8KKyAqCisgKiBQdXJwb3NlOiBMZXQgdXNlciBjYWxsIGlvY3RsKCkgdG8gZ2V0IGluZm8gd2hlbiB0aGUgVUFSVCBwaHlzaWNhbGx5CisgKgkgICAgaXMgZW1wdGllZC4gIE9uIGJ1cyB0eXBlcyBsaWtlIFJTNDg1LCB0aGUgdHJhbnNtaXR0ZXIgbXVzdAorICoJICAgIHJlbGVhc2UgdGhlIGJ1cyBhZnRlciB0cmFuc21pdHRpbmcuIFRoaXMgbXVzdCBiZSBkb25lIHdoZW4KKyAqCSAgICB0aGUgdHJhbnNtaXQgc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHksIG5vdCBiZSBkb25lIHdoZW4gdGhlCisgKgkgICAgdHJhbnNtaXQgaG9sZGluZyByZWdpc3RlciBpcyBlbXB0eS4gIFRoaXMgZnVuY3Rpb25hbGl0eQorICoJICAgIGFsbG93cyBhbiBSUzQ4NSBkcml2ZXIgdG8gYmUgd3JpdHRlbiBpbiB1c2VyIHNwYWNlLgorICovCitzdGF0aWMgaW50IG14c2VyX2dldF9sc3JfaW5mbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCXJlc3VsdCA9ICgoc3RhdHVzICYgVUFSVF9MU1JfVEVNVCkgPyBUSU9DU0VSX1RFTVQgOiAwKTsKKwlyZXR1cm4gcHV0X3VzZXIocmVzdWx0LCB2YWx1ZSk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgc2VuZHMgYSBicmVhayBjaGFyYWN0ZXIgb3V0IHRoZSBzZXJpYWwgcG9ydC4KKyAqLworc3RhdGljIHZvaWQgbXhzZXJfc2VuZF9icmVhayhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBpbnQgZHVyYXRpb24pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaW5mby0+YmFzZSkKKwkJcmV0dXJuOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJb3V0YihpbmIoaW5mby0+YmFzZSArIFVBUlRfTENSKSB8IFVBUlRfTENSX1NCQywgaW5mby0+YmFzZSArIFVBUlRfTENSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCXNjaGVkdWxlX3RpbWVvdXQoZHVyYXRpb24pOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xDUikgJiB+VUFSVF9MQ1JfU0JDLCBpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgY2hhciBjb250cm9sLCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCisJaWYgKHR0eS0+aW5kZXggPT0gTVhTRVJfUE9SVFMpCisJCXJldHVybiAoLUVOT0lPQ1RMQ01EKTsKKwlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCXJldHVybiAoLUVJTyk7CisKKwljb250cm9sID0gaW5mby0+TUNSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX01TUik7CisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0FOWV9ERUxUQSkKKwkJbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8sIHN0YXR1cyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gKChjb250cm9sICYgVUFSVF9NQ1JfUlRTKSA/IFRJT0NNX1JUUyA6IDApIHwKKwkgICAgKChjb250cm9sICYgVUFSVF9NQ1JfRFRSKSA/IFRJT0NNX0RUUiA6IDApIHwgKChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpID8gVElPQ01fQ0FSIDogMCkgfCAoKHN0YXR1cyAmIFVBUlRfTVNSX1JJKSA/IFRJT0NNX1JORyA6IDApIHwgKChzdGF0dXMgJiBVQVJUX01TUl9EU1IpID8gVElPQ01fRFNSIDogMCkgfCAoKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKK30KKworc3RhdGljIGludCBteHNlcl90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCWlmICh0dHktPmluZGV4ID09IE1YU0VSX1BPUlRTKQorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9SVFM7CisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0RUUjsKKworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9SVFM7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX0RUUjsKKworCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBteHNlcl9yZWFkX3JlZ2lzdGVyKGludCwgdW5zaWduZWQgc2hvcnQgKik7CitzdGF0aWMgaW50IG14c2VyX3Byb2dyYW1fbW9kZShpbnQpOworc3RhdGljIHZvaWQgbXhzZXJfbm9ybWFsX21vZGUoaW50KTsKKworc3RhdGljIGludCBteHNlcl9nZXRfSVNBX2NvbmYoaW50IGNhcCwgc3RydWN0IG14c2VyX2h3Y29uZiAqaHdjb25mKQoreworCWludCBpZCwgaSwgYml0czsKKwl1bnNpZ25lZCBzaG9ydCByZWdzWzE2XSwgaXJxOworCXVuc2lnbmVkIGNoYXIgc2NyYXRjaCwgc2NyYXRjaDI7CisKKwlod2NvbmYtPklzTW94YU11c3RDaGlwRmxhZyA9IE1PWEFfT1RIRVJfVUFSVDsKKworCWlkID0gbXhzZXJfcmVhZF9yZWdpc3RlcihjYXAsIHJlZ3MpOworCWlmIChpZCA9PSBDMTY4X0FTSUNfSUQpIHsKKwkJaHdjb25mLT5ib2FyZF90eXBlID0gTVhTRVJfQk9BUkRfQzE2OF9JU0E7CisJCWh3Y29uZi0+cG9ydHMgPSA4OworCX0gZWxzZSBpZiAoaWQgPT0gQzEwNF9BU0lDX0lEKSB7CisJCWh3Y29uZi0+Ym9hcmRfdHlwZSA9IE1YU0VSX0JPQVJEX0MxMDRfSVNBOworCQlod2NvbmYtPnBvcnRzID0gNDsKKwl9IGVsc2UgaWYgKGlkID09IEMxMDJfQVNJQ19JRCkgeworCQlod2NvbmYtPmJvYXJkX3R5cGUgPSBNWFNFUl9CT0FSRF9DMTAyX0lTQTsKKwkJaHdjb25mLT5wb3J0cyA9IDI7CisJfSBlbHNlIGlmIChpZCA9PSBDSTEzMl9BU0lDX0lEKSB7CisJCWh3Y29uZi0+Ym9hcmRfdHlwZSA9IE1YU0VSX0JPQVJEX0NJMTMyOworCQlod2NvbmYtPnBvcnRzID0gMjsKKwl9IGVsc2UgaWYgKGlkID09IENJMTM0X0FTSUNfSUQpIHsKKwkJaHdjb25mLT5ib2FyZF90eXBlID0gTVhTRVJfQk9BUkRfQ0kxMzQ7CisJCWh3Y29uZi0+cG9ydHMgPSA0OworCX0gZWxzZSBpZiAoaWQgPT0gQ0kxMDRKX0FTSUNfSUQpIHsKKwkJaHdjb25mLT5ib2FyZF90eXBlID0gTVhTRVJfQk9BUkRfQ0kxMDRKOworCQlod2NvbmYtPnBvcnRzID0gNDsKKwl9IGVsc2UKKwkJcmV0dXJuICgwKTsKKworCWlycSA9IDA7CisJaWYgKGh3Y29uZi0+cG9ydHMgPT0gMikgeworCQlpcnEgPSByZWdzWzldICYgMHhGMDAwOworCQlpcnEgPSBpcnEgfCAoaXJxID4+IDQpOworCQlpZiAoaXJxICE9IChyZWdzWzldICYgMHhGRjAwKSkKKwkJCXJldHVybiAoTVhTRVJfRVJSX0lSUV9DT05GTElUKTsKKwl9IGVsc2UgaWYgKGh3Y29uZi0+cG9ydHMgPT0gNCkgeworCQlpcnEgPSByZWdzWzldICYgMHhGMDAwOworCQlpcnEgPSBpcnEgfCAoaXJxID4+IDQpOworCQlpcnEgPSBpcnEgfCAoaXJxID4+IDgpOworCQlpZiAoaXJxICE9IHJlZ3NbOV0pCisJCQlyZXR1cm4gKE1YU0VSX0VSUl9JUlFfQ09ORkxJVCk7CisJfSBlbHNlIGlmIChod2NvbmYtPnBvcnRzID09IDgpIHsKKwkJaXJxID0gcmVnc1s5XSAmIDB4RjAwMDsKKwkJaXJxID0gaXJxIHwgKGlycSA+PiA0KTsKKwkJaXJxID0gaXJxIHwgKGlycSA+PiA4KTsKKwkJaWYgKChpcnEgIT0gcmVnc1s5XSkgfHwgKGlycSAhPSByZWdzWzEwXSkpCisJCQlyZXR1cm4gKE1YU0VSX0VSUl9JUlFfQ09ORkxJVCk7CisJfQorCisJaWYgKCFpcnEpIHsKKwkJcmV0dXJuIChNWFNFUl9FUlJfSVJRKTsKKwl9CisJaHdjb25mLT5pcnEgPSAoKGludCkgKGlycSAmIDB4RjAwMCkgPj4gMTIpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWh3Y29uZi0+aW9hZGRyW2ldID0gKGludCkgcmVnc1tpICsgMV0gJiAweEZGRjg7CisJaWYgKChyZWdzWzEyXSAmIDB4ODApID09IDApIHsKKwkJcmV0dXJuIChNWFNFUl9FUlJfVkVDVE9SKTsKKwl9CisJaHdjb25mLT52ZWN0b3IgPSAoaW50KSByZWdzWzExXTsJLyogaW50ZXJydXB0IHZlY3RvciAqLworCWlmIChpZCA9PSAxKQorCQlod2NvbmYtPnZlY3Rvcl9tYXNrID0gMHgwMEZGOworCWVsc2UKKwkJaHdjb25mLT52ZWN0b3JfbWFzayA9IDB4MDAwRjsKKwlmb3IgKGkgPSA3LCBiaXRzID0gMHgwMTAwOyBpID49IDA7IGktLSwgYml0cyA8PD0gMSkgeworCQlpZiAocmVnc1sxMl0gJiBiaXRzKSB7CisJCQlod2NvbmYtPmJhdWRfYmFzZVtpXSA9IDkyMTYwMDsKKwkJCWh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbaV0gPSA5MjE2MDA7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTA0LTIwMDIKKwkJfSBlbHNlIHsKKwkJCWh3Y29uZi0+YmF1ZF9iYXNlW2ldID0gMTE1MjAwOworCQkJaHdjb25mLT5NYXhDYW5TZXRCYXVkUmF0ZVtpXSA9IDExNTIwMDsJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDktMDQtMjAwMgorCQl9CisJfQorCXNjcmF0Y2gyID0gaW5iKGNhcCArIFVBUlRfTENSKSAmICh+VUFSVF9MQ1JfRExBQik7CisJb3V0YihzY3JhdGNoMiB8IFVBUlRfTENSX0RMQUIsIGNhcCArIFVBUlRfTENSKTsKKwlvdXRiKDAsIGNhcCArIFVBUlRfRUZSKTsJLyogRUZSIGlzIHRoZSBzYW1lIGFzIEZDUiAqLworCW91dGIoc2NyYXRjaDIsIGNhcCArIFVBUlRfTENSKTsKKwlvdXRiKFVBUlRfRkNSX0VOQUJMRV9GSUZPLCBjYXAgKyBVQVJUX0ZDUik7CisJc2NyYXRjaCA9IGluYihjYXAgKyBVQVJUX0lJUik7CisKKwlpZiAoc2NyYXRjaCAmIDB4QzApCisJCWh3Y29uZi0+dWFydF90eXBlID0gUE9SVF8xNjU1MEE7CisJZWxzZQorCQlod2NvbmYtPnVhcnRfdHlwZSA9IFBPUlRfMTY0NTA7CisJaWYgKGlkID09IDEpCisJCWh3Y29uZi0+cG9ydHMgPSA4OworCWVsc2UKKwkJaHdjb25mLT5wb3J0cyA9IDQ7CisJcmVxdWVzdF9yZWdpb24oaHdjb25mLT5pb2FkZHJbMF0sIDggKiBod2NvbmYtPnBvcnRzLCAibXhzZXIoSU8pIik7CisJcmVxdWVzdF9yZWdpb24oaHdjb25mLT52ZWN0b3IsIDEsICJteHNlcih2ZWN0b3IpIik7CisJcmV0dXJuIChod2NvbmYtPnBvcnRzKTsKK30KKworI2RlZmluZSBDSElQX1NLIAkweDAxCS8qIFNlcmlhbCBEYXRhIENsb2NrICBpbiBFcHJvbSAqLworI2RlZmluZSBDSElQX0RPIAkweDAyCS8qIFNlcmlhbCBEYXRhIE91dHB1dCBpbiBFcHJvbSAqLworI2RlZmluZSBDSElQX0NTIAkweDA0CS8qIFNlcmlhbCBDaGlwIFNlbGVjdCBpbiBFcHJvbSAqLworI2RlZmluZSBDSElQX0RJIAkweDA4CS8qIFNlcmlhbCBEYXRhIElucHV0ICBpbiBFcHJvbSAqLworI2RlZmluZSBFTl9DQ01EIAkweDAwMAkvKiBDaGlwJ3MgY29tbWFuZCByZWdpc3RlciAgICAgKi8KKyNkZWZpbmUgRU4wX1JTQVJMTwkweDAwOAkvKiBSZW1vdGUgc3RhcnQgYWRkcmVzcyByZWcgMCAgKi8KKyNkZWZpbmUgRU4wX1JTQVJISQkweDAwOQkvKiBSZW1vdGUgc3RhcnQgYWRkcmVzcyByZWcgMSAgKi8KKyNkZWZpbmUgRU4wX1JDTlRMTwkweDAwQQkvKiBSZW1vdGUgYnl0ZSBjb3VudCByZWcgV1IgICAgKi8KKyNkZWZpbmUgRU4wX1JDTlRISQkweDAwQgkvKiBSZW1vdGUgYnl0ZSBjb3VudCByZWcgV1IgICAgKi8KKyNkZWZpbmUgRU4wX0RDRkcJMHgwMEUJLyogRGF0YSBjb25maWd1cmF0aW9uIHJlZyBXUiAgICovCisjZGVmaW5lIEVOMF9QT1JUCTB4MDEwCS8qIFJjdiBtaXNzZWQgZnJhbWUgZXJyb3IgY291bnRlciBSRCAqLworI2RlZmluZSBFTkNfUEFHRTAJMHgwMDAJLyogU2VsZWN0IHBhZ2UgMCBvZiBjaGlwIHJlZ2lzdGVycyAgICovCisjZGVmaW5lIEVOQ19QQUdFMwkweDBDMAkvKiBTZWxlY3QgcGFnZSAzIG9mIGNoaXAgcmVnaXN0ZXJzICAgKi8KK3N0YXRpYyBpbnQgbXhzZXJfcmVhZF9yZWdpc3RlcihpbnQgcG9ydCwgdW5zaWduZWQgc2hvcnQgKnJlZ3MpCit7CisJaW50IGksIGssIHZhbHVlLCBpZDsKKwl1bnNpZ25lZCBpbnQgajsKKworCWlkID0gbXhzZXJfcHJvZ3JhbV9tb2RlKHBvcnQpOworCWlmIChpZCA8IDApCisJCXJldHVybiAoaWQpOworCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKSB7CisJCWsgPSAoaSAmIDB4M0YpIHwgMHgxODA7CisJCWZvciAoaiA9IDB4MTAwOyBqID4gMDsgaiA+Pj0gMSkgeworCQkJb3V0YihDSElQX0NTLCBwb3J0KTsKKwkJCWlmIChrICYgaikgeworCQkJCW91dGIoQ0hJUF9DUyB8IENISVBfRE8sIHBvcnQpOworCQkJCW91dGIoQ0hJUF9DUyB8IENISVBfRE8gfCBDSElQX1NLLCBwb3J0KTsJLyogQT8gYml0IG9mIHJlYWQgKi8KKwkJCX0gZWxzZSB7CisJCQkJb3V0YihDSElQX0NTLCBwb3J0KTsKKwkJCQlvdXRiKENISVBfQ1MgfCBDSElQX1NLLCBwb3J0KTsJLyogQT8gYml0IG9mIHJlYWQgKi8KKwkJCX0KKwkJfQorCQkodm9pZCkgaW5iKHBvcnQpOworCQl2YWx1ZSA9IDA7CisJCWZvciAoayA9IDAsIGogPSAweDgwMDA7IGsgPCAxNjsgaysrLCBqID4+PSAxKSB7CisJCQlvdXRiKENISVBfQ1MsIHBvcnQpOworCQkJb3V0YihDSElQX0NTIHwgQ0hJUF9TSywgcG9ydCk7CisJCQlpZiAoaW5iKHBvcnQpICYgQ0hJUF9ESSkKKwkJCQl2YWx1ZSB8PSBqOworCQl9CisJCXJlZ3NbaV0gPSB2YWx1ZTsKKwkJb3V0YigwLCBwb3J0KTsKKwl9CisJbXhzZXJfbm9ybWFsX21vZGUocG9ydCk7CisJcmV0dXJuIChpZCk7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfcHJvZ3JhbV9tb2RlKGludCBwb3J0KQoreworCWludCBpZCwgaSwgaiwgbjsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2soJmdtX2xvY2spOworCW91dGIoMCwgcG9ydCk7CisJb3V0YigwLCBwb3J0KTsKKwlvdXRiKDAsIHBvcnQpOworCSh2b2lkKSBpbmIocG9ydCk7CisJKHZvaWQpIGluYihwb3J0KTsKKwlvdXRiKDAsIHBvcnQpOworCSh2b2lkKSBpbmIocG9ydCk7CisJLy9yZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlzcGluX3VubG9jaygmZ21fbG9jayk7CisKKwlpZCA9IGluYihwb3J0ICsgMSkgJiAweDFGOworCWlmICgoaWQgIT0gQzE2OF9BU0lDX0lEKSAmJiAoaWQgIT0gQzEwNF9BU0lDX0lEKSAmJiAoaWQgIT0gQzEwMl9BU0lDX0lEKSAmJiAoaWQgIT0gQ0kxMzJfQVNJQ19JRCkgJiYgKGlkICE9IENJMTM0X0FTSUNfSUQpICYmIChpZCAhPSBDSTEwNEpfQVNJQ19JRCkpCisJCXJldHVybiAoLTEpOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgNDsgaSsrKSB7CisJCW4gPSBpbmIocG9ydCArIDIpOworCQlpZiAobiA9PSAnTScpIHsKKwkJCWogPSAxOworCQl9IGVsc2UgaWYgKChqID09IDEpICYmIChuID09IDEpKSB7CisJCQlqID0gMjsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCWogPSAwOworCX0KKwlpZiAoaiAhPSAyKQorCQlpZCA9IC0yOworCXJldHVybiAoaWQpOworfQorCitzdGF0aWMgdm9pZCBteHNlcl9ub3JtYWxfbW9kZShpbnQgcG9ydCkKK3sKKwlpbnQgaSwgbjsKKworCW91dGIoMHhBNSwgcG9ydCArIDEpOworCW91dGIoMHg4MCwgcG9ydCArIDMpOworCW91dGIoMTIsIHBvcnQgKyAwKTsJLyogOTYwMCBicHMgKi8KKwlvdXRiKDAsIHBvcnQgKyAxKTsKKwlvdXRiKDB4MDMsIHBvcnQgKyAzKTsJLyogOCBkYXRhIGJpdHMgKi8KKwlvdXRiKDB4MTMsIHBvcnQgKyA0KTsJLyogbG9vcCBiYWNrIG1vZGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQluID0gaW5iKHBvcnQgKyA1KTsKKwkJaWYgKChuICYgMHg2MSkgPT0gMHg2MCkKKwkJCWJyZWFrOworCQlpZiAoKG4gJiAxKSA9PSAxKQorCQkJKHZvaWQpIGluYihwb3J0KTsKKwl9CisJb3V0YigweDAwLCBwb3J0ICsgNCk7Cit9CisKK21vZHVsZV9pbml0KG14c2VyX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KG14c2VyX21vZHVsZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9teHNlci5oIGIvZHJpdmVycy9jaGFyL214c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmZDBiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9teHNlci5oCkBAIC0wLDAgKzEsNDUwIEBACisjaWZuZGVmIF9NWFNFUl9ICisjZGVmaW5lIF9NWFNFUl9ICisKKy8qCisgKglTZW1pLXB1YmxpYyBjb250cm9sIGludGVyZmFjZXMKKyAqLworIAorLyoKKyAqCU1PWEEgaW9jdGxzCisgKi8KKworI2RlZmluZSBNT1hBCQkJMHg0MDAKKyNkZWZpbmUgTU9YQV9HRVREQVRBQ09VTlQJKE1PWEEgKyAyMykKKyNkZWZpbmUJTU9YQV9HRVRfQ09ORgkJKE1PWEEgKyAzNSkKKyNkZWZpbmUgTU9YQV9ESUFHTk9TRQkJKE1PWEEgKyA1MCkKKyNkZWZpbmUgTU9YQV9DSEtQT1JURU5BQkxFCShNT1hBICsgNjApCisjZGVmaW5lIE1PWEFfSGlnaFNwZWVkT24JKE1PWEEgKyA2MSkKKyNkZWZpbmUgTU9YQV9HRVRfTUFKT1IJCShNT1hBICsgNjMpCisjZGVmaW5lIE1PWEFfR0VUX0NVTUFKT1IJKE1PWEEgKyA2NCkKKyNkZWZpbmUgTU9YQV9HRVRNU1RBVFVTCQkoTU9YQSArIDY1KQorI2RlZmluZSBNT1hBX1NFVF9PUF9NT0RFCShNT1hBICsgNjYpCisjZGVmaW5lIE1PWEFfR0VUX09QX01PREUJKE1PWEEgKyA2NykKKworI2RlZmluZSBSUzIzMl9NT0RFCQkwCisjZGVmaW5lIFJTNDg1XzJXSVJFX01PREUJMQorI2RlZmluZSBSUzQyMl9NT0RFCQkyCisjZGVmaW5lIFJTNDg1XzRXSVJFX01PREUJMworI2RlZmluZSBPUF9NT0RFX01BU0sJCTMKKy8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQKKworI2RlZmluZSBUVFlfVEhSRVNIT0xEX1RIUk9UVExFICAxMjgKKworI2RlZmluZSBMT19XQVRFUgkgCShUVFlfRkxJUEJVRl9TSVpFKQorI2RlZmluZSBISV9XQVRFUgkJKFRUWV9GTElQQlVGX1NJWkUqMiozLzQpCisKKy8vIGFkZGVkIGJ5IEphbWVzLiAwMy0xMS0yMDA0LgorI2RlZmluZSBNT1hBX1NEU19HRVRJQ09VTlRFUiAgCShNT1hBICsgNjgpCisjZGVmaW5lIE1PWEFfU0RTX1JTVElDT1VOVEVSICAJKE1PWEEgKyA2OSkKKy8vIChhYm92ZSkgYWRkZWQgYnkgSmFtZXMuCisKKyNkZWZpbmUgTU9YQV9BU1BQX09RVUVVRSAgCShNT1hBICsgNzApCisjZGVmaW5lIE1PWEFfQVNQUF9TRVRCQVVEIAkoTU9YQSArIDcxKQorI2RlZmluZSBNT1hBX0FTUFBfR0VUQkFVRCAJKE1PWEEgKyA3MikKKyNkZWZpbmUgTU9YQV9BU1BQX01PTiAgICAgCShNT1hBICsgNzMpCisjZGVmaW5lIE1PWEFfQVNQUF9MU1RBVFVTIAkoTU9YQSArIDc0KQorI2RlZmluZSBNT1hBX0FTUFBfTU9OX0VYVCAJKE1PWEEgKyA3NSkKKyNkZWZpbmUgTU9YQV9TRVRfQkFVRF9NRVRIT0QJKE1PWEEgKyA3NikKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBOUFBJX05PVElGWV9QQVJJVFkJMHgwMQorI2RlZmluZSBOUFBJX05PVElGWV9GUkFNSU5HCTB4MDIKKyNkZWZpbmUgTlBQSV9OT1RJRllfSFdfT1ZFUlJVTgkweDA0CisjZGVmaW5lIE5QUElfTk9USUZZX1NXX09WRVJSVU4JMHgwOAorI2RlZmluZSBOUFBJX05PVElGWV9CUkVBSwkweDEwCisKKyNkZWZpbmUgTlBQSV9OT1RJRllfQ1RTSE9MRCAgICAgICAgIDB4MDEJLy8gVHggaG9sZCBieSBDVFMgbG93CisjZGVmaW5lIE5QUElfTk9USUZZX0RTUkhPTEQgICAgICAgICAweDAyCS8vIFR4IGhvbGQgYnkgRFNSIGxvdworI2RlZmluZSBOUFBJX05PVElGWV9YT0ZGSE9MRCAgICAgICAgMHgwOAkvLyBUeCBob2xkIGJ5IFhvZmYgcmVjZWl2ZWQKKyNkZWZpbmUgTlBQSV9OT1RJRllfWE9GRlhFTlQgICAgICAgIDB4MTAJLy8gWG9mZiBTZW50CisKKy8vQ2hlY2tJc01veGFNdXN0IHJldHVybiB2YWx1ZQorI2RlZmluZSBNT1hBX09USEVSX1VBUlQJCQkweDAwCisjZGVmaW5lIE1PWEFfTVVTVF9NVTE1MF9IV0lECQkweDAxCisjZGVmaW5lIE1PWEFfTVVTVF9NVTg2MF9IV0lECQkweDAyCisKKy8vIGZvbGxvdyBqdXN0IGZvciBNb3hhIE11c3QgY2hpcCBkZWZpbmUuCisvLworLy8gd2hlbiBMQ1IgcmVnaXN0ZXIgKG9mZnNldCAweDAzKSB3cml0ZSBmb2xsb3dpbmcgdmFsdWUsCisvLyB0aGUgTXVzdCBjaGlwIHdpbGwgZW50ZXIgZW5jaGFuY2UgbW9kZS4gQW5kIHdyaXRlIHZhbHVlCisvLyBvbiBFRlIgKG9mZnNldCAweDAyKSBiaXQgNiw3IHRvIGNoYW5nZSBiYW5rLgorI2RlZmluZSBNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UJMHhCRgorCisvLyB3aGVuIGVuaGFuY2UgbW9kZSBlbmFibGUsIGFjY2VzcyBvbiBnZW5lcmFsIGJhbmsgcmVnaXN0ZXIKKyNkZWZpbmUgTU9YQV9NVVNUX0dETF9SRUdJU1RFUgkJMHgwNworI2RlZmluZSBNT1hBX01VU1RfR0RMX01BU0sJCTB4N0YKKyNkZWZpbmUgTU9YQV9NVVNUX0dETF9IQVNfQkFEX0RBVEEJMHg4MAorCisjZGVmaW5lIE1PWEFfTVVTVF9MU1JfUkVSUgkJMHg4MAkvLyBlcnJvciBpbiByZWNlaXZlIEZJRk8KKy8vIGVuY2hhbmNlIHJlZ2lzdGVyIGJhbmsgc2VsZWN0IGFuZCBlbmNoYW5jZSBtb2RlIHNldHRpbmcgcmVnaXN0ZXIKKy8vIHdoZW4gTENSIHJlZ2lzdGVyIGVxdWFsIHRvIDB4QkYKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9SRUdJU1RFUgkJMHgwMgorLy8gZW5jaGFuY2UgbW9kZSBlbmFibGUKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9FRlJCX0VOQUJMRQkweDEwCisvLyBlbmNoYW5jZSByZWlzdGVyIGJhbmsgc2V0IDAsIDEsIDIKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9CQU5LMAkJMHgwMAorI2RlZmluZSBNT1hBX01VU1RfRUZSX0JBTksxCQkweDQwCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfQkFOSzIJCTB4ODAKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9CQU5LMwkJMHhDMAorI2RlZmluZSBNT1hBX01VU1RfRUZSX0JBTktfTUFTSwkJMHhDMAorCisvLyBzZXQgWE9OMSB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswCisjZGVmaW5lIE1PWEFfTVVTVF9YT04xX1JFR0lTVEVSCQkweDA0CisKKy8vIHNldCBYT04yIHZhbHVlIHJlZ2lzdGVyLCB3aGVuIExDUj0weEJGIGFuZCBjaGFuZ2UgdG8gYmFuazAKKyNkZWZpbmUgTU9YQV9NVVNUX1hPTjJfUkVHSVNURVIJCTB4MDUKKworLy8gc2V0IFhPRkYxIHZhbHVlIHJlZ2lzdGVyLCB3aGVuIExDUj0weEJGIGFuZCBjaGFuZ2UgdG8gYmFuazAKKyNkZWZpbmUgTU9YQV9NVVNUX1hPRkYxX1JFR0lTVEVSCTB4MDYKKworLy8gc2V0IFhPRkYyIHZhbHVlIHJlZ2lzdGVyLCB3aGVuIExDUj0weEJGIGFuZCBjaGFuZ2UgdG8gYmFuazAKKyNkZWZpbmUgTU9YQV9NVVNUX1hPRkYyX1JFR0lTVEVSCTB4MDcKKworI2RlZmluZSBNT1hBX01VU1RfUkJSVExfUkVHSVNURVIJMHgwNAorI2RlZmluZSBNT1hBX01VU1RfUkJSVEhfUkVHSVNURVIJMHgwNQorI2RlZmluZSBNT1hBX01VU1RfUkJSVElfUkVHSVNURVIJMHgwNgorI2RlZmluZSBNT1hBX01VU1RfVEhSVExfUkVHSVNURVIJMHgwNworI2RlZmluZSBNT1hBX01VU1RfRU5VTV9SRUdJU1RFUgkJMHgwNAorI2RlZmluZSBNT1hBX01VU1RfSFdJRF9SRUdJU1RFUgkJMHgwNQorI2RlZmluZSBNT1hBX01VU1RfRUNSX1JFR0lTVEVSCQkweDA2CisjZGVmaW5lIE1PWEFfTVVTVF9DU1JfUkVHSVNURVIJCTB4MDcKKworLy8gZ29vZCBkYXRhIG1vZGUgZW5hYmxlCisjZGVmaW5lIE1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFCTB4MjAKKy8vIG9ubHkgZ29vZCBkYXRhIHB1dCBpbnRvIFJ4RklGTworI2RlZmluZSBNT1hBX01VU1RfRkNSX0dEQV9PTkxZX0VOQUJMRQkweDEwCisKKy8vIGVuYWJsZSBDVFMgaW50ZXJydXB0CisjZGVmaW5lIE1PWEFfTVVTVF9JRVJfRUNUU0kJCTB4ODAKKy8vIGVhbmJsZSBSVFMgaW50ZXJydXB0CisjZGVmaW5lIE1PWEFfTVVTVF9JRVJfRVJUU0kJCTB4NDAKKy8vIGVuYWJsZSBYb24vWG9mZiBpbnRlcnJ1cHQKKyNkZWZpbmUgTU9YQV9NVVNUX0lFUl9YSU5UCQkweDIwCisvLyBlbmFibGUgR0RBIGludGVycnVwdAorI2RlZmluZSBNT1hBX01VU1RfSUVSX0VHREFJCQkweDEwCisKKyNkZWZpbmUgTU9YQV9NVVNUX1JFQ1ZfSVNSCQkoVUFSVF9JRVJfUkRJIHwgTU9YQV9NVVNUX0lFUl9FR0RBSSkKKworLy8gR0RBIGludGVycnVwdCBwZW5kaW5nCisjZGVmaW5lIE1PWEFfTVVTVF9JSVJfR0RBCQkweDFDCisjZGVmaW5lIE1PWEFfTVVTVF9JSVJfUkRBCQkweDA0CisjZGVmaW5lIE1PWEFfTVVTVF9JSVJfUlRPCQkweDBDCisjZGVmaW5lIE1PWEFfTVVTVF9JSVJfTFNSCQkweDA2CisKKy8vIHJlY2lldmVkIFhvbi9Yb2ZmIG9yIHNwZWNpY2FsIGludGVycnVwdCBwZW5kaW5nCisjZGVmaW5lIE1PWEFfTVVTVF9JSVJfWFNDCQkweDEwCisKKy8vIFJUUy9DVFMgY2hhbmdlIHN0YXRlIGludGVycnVwdCBwZW5kaW5nCisjZGVmaW5lIE1PWEFfTVVTVF9JSVJfUlRTQ1RTCQkweDIwCisjZGVmaW5lIE1PWEFfTVVTVF9JSVJfTUFTSwkJMHgzRQorCisjZGVmaW5lIE1PWEFfTVVTVF9NQ1JfWE9OX0ZMQUcJCTB4NDAKKyNkZWZpbmUgTU9YQV9NVVNUX01DUl9YT05fQU5ZCQkweDgwCisjZGVmaW5lIE1PWEFfTVVTVF9NQ1JfVFhfWE9OCQkweDA4CisKKworLy8gc29mdHdhcmUgZmxvdyBjb250cm9sIG9uIGNoaXAgbWFzayB2YWx1ZQorI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX01BU0sJCTB4MEYKKy8vIHNlbmQgWG9uMS9Yb2ZmMQorI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1RYMQkJMHgwOAorLy8gc2VuZCBYb24yL1hvZmYyCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfVFgyCQkweDA0CisvLyBzZW5kIFhvbjEsWG9uMi9Yb2ZmMSxYb2ZmMgorI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1RYMTIJCTB4MEMKKy8vIGRvbid0IHNlbmQgWG9uL1hvZmYKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9UWF9OTwkJMHgwMAorLy8gVHggc29mdHdhcmUgZmxvdyBjb250cm9sIG1hc2sKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9UWF9NQVNLCTB4MEMKKy8vIGRvbid0IHJlY2VpdmUgWG9uL1hvZmYKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9SWF9OTwkJMHgwMAorLy8gcmVjZWl2ZSBYb24xL1hvZmYxCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfUlgxCQkweDAyCisvLyByZWNlaXZlIFhvbjIvWG9mZjIKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9SWDIJCTB4MDEKKy8vIHJlY2VpdmUgWG9uMSxYb24yL1hvZmYxLFhvZmYyCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfUlgxMgkJMHgwMworLy8gUnggc29mdHdhcmUgZmxvdyBjb250cm9sIG1hc2sKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9SWF9NQVNLCTB4MDMKKworLy8jZGVmaW5lIE1PWEFfTVVTVF9NSU5fWE9GRkxJTUlUICAgICAgICAgICAgICAgNjYKKy8vI2RlZmluZSBNT1hBX01VU1RfTUlOX1hPTkxJTUlUICAgICAgICAgICAgICAgIDIwCisvLyNkZWZpbmUgSUQxX1JYX1RSSUcgICAgICAgICAgICAgICAgICAgMTIwCisKKworI2RlZmluZSBDSEVDS19NT1hBX01VU1RfWE9GRkxJTUlUKGluZm8pIHsgCVwKKwlpZiAoIChpbmZvKS0+SXNNb3hhTXVzdENoaXBGbGFnICYmIAlcCisJIChpbmZvKS0+SGFuZEZsb3cuWG9mZkxpbWl0IDwgTU9YQV9NVVNUX01JTl9YT0ZGTElNSVQgKSB7CVwKKwkJKGluZm8pLT5IYW5kRmxvdy5Yb2ZmTGltaXQgPSBNT1hBX01VU1RfTUlOX1hPRkZMSU1JVDsJXAorCQkoaW5mbyktPkhhbmRGbG93LlhvbkxpbWl0ID0gTU9YQV9NVVNUX01JTl9YT05MSU1JVDsJXAorCX0JXAorfQorCisjZGVmaW5lIEVOQUJMRV9NT1hBX01VU1RfRU5DSEFOQ0VfTU9ERShiYXNlaW8pIHsgXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfRUZSQl9FTkFCTEU7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIERJU0FCTEVfTU9YQV9NVVNUX0VOQ0hBTkNFX01PREUoYmFzZWlvKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9FRlJCX0VOQUJMRTsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9YT04xX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzA7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9YT04xX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIFNFVF9NT1hBX01VU1RfWE9OMl9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTkswOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfWE9OMl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX1hPRkYxX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzA7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9YT0ZGMV9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX1hPRkYyX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzA7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9YT0ZGMl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX1JCUlRMX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzE7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9SQlJUTF9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX1JCUlRIX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzE7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9SQlJUSF9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX1JCUlRJX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzE7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9SQlJUSV9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX1RIUlRMX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzE7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9USFJUTF9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworLy8jZGVmaW5lIE1PWEFfTVVTVF9SQlJMX1ZBTFVFICA0CisjZGVmaW5lIFNFVF9NT1hBX01VU1RfRklGT19WQUxVRShpbmZvKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoaW5mbyktPmJhc2UrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChpbmZvKS0+YmFzZStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoaW5mbyktPmJhc2UrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCisJb3V0YihfX2VmciwgKGluZm8pLT5iYXNlK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YigodTgpKChpbmZvKS0+cnhfaGlnaF93YXRlciksIChpbmZvKS0+YmFzZStNT1hBX01VU1RfUkJSVEhfUkVHSVNURVIpOwlcCisJb3V0YigodTgpKChpbmZvKS0+cnhfdHJpZ2dlciksIChpbmZvKS0+YmFzZStNT1hBX01VU1RfUkJSVElfUkVHSVNURVIpOwlcCisJb3V0YigodTgpKChpbmZvKS0+cnhfbG93X3dhdGVyKSwgKGluZm8pLT5iYXNlK01PWEFfTVVTVF9SQlJUTF9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoaW5mbyktPmJhc2UrVUFSVF9MQ1IpOwlcCit9CisKKworCisjZGVmaW5lIFNFVF9NT1hBX01VU1RfRU5VTV9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksyOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfRU5VTV9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBHRVRfTU9YQV9NVVNUX0hBUkRXQVJFX0lEKGJhc2VpbywgcElkKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksyOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwkqcElkID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9IV0lEX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIFNFVF9NT1hBX01VU1RfTk9fU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfTUFTSzsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9KVVNUX1RYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX1NGX1RYMTsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgRU5BQkxFX01PWEFfTVVTVF9UWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9UWF9NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9TRl9UWDE7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIERJU0FCTEVfTU9YQV9NVVNUX1RYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX1RYX01BU0s7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIFNFVF9NT1hBX01VU1RfSlVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9TRl9SWDE7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIEVOQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfUlhfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfU0ZfUlgxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBESVNBQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9SWF9NQVNLOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBFTkFCTEVfTU9YQV9NVVNUX1RYX1JYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX01BU0s7CVwKKwlfX2VmciB8PSAoTU9YQV9NVVNUX0VGUl9TRl9SWDF8TU9YQV9NVVNUX0VGUl9TRl9UWDEpOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBFTkFCTEVfTU9YQV9NVVNUX1hPTl9BTllfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCisJdTgJX19vbGRtY3I7CVwKKwlfX29sZG1jciA9IGluYigoYmFzZWlvKStVQVJUX01DUik7CVwKKwlfX29sZG1jciB8PSBNT1hBX01VU1RfTUNSX1hPTl9BTlk7CVwKKwlvdXRiKF9fb2xkbWNyLCAoYmFzZWlvKStVQVJUX01DUik7CVwKK30KKworI2RlZmluZSBESVNBQkxFX01PWEFfTVVTVF9YT05fQU5ZX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAorCXU4CV9fb2xkbWNyOwlcCisJX19vbGRtY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9NQ1IpOwlcCisJX19vbGRtY3IgJj0gfk1PWEFfTVVTVF9NQ1JfWE9OX0FOWTsJXAorCW91dGIoX19vbGRtY3IsIChiYXNlaW8pK1VBUlRfTUNSKTsJXAorfQorCisjZGVmaW5lIFJFQURfTU9YQV9NVVNUX0dETChiYXNlaW8pCWluYigoYmFzZWlvKStNT1hBX01VU1RfR0RMX1JFR0lTVEVSKQorCisKKyNpZm5kZWYgSU5JVF9XT1JLCisjZGVmaW5lIElOSVRfV09SSyhfd29yaywgX2Z1bmMsIF9kYXRhKXsJXAorCV9kYXRhLT50cXVldWUucm91dGluZSA9IF9mdW5jO1wKKwlfZGF0YS0+dHF1ZXVlLmRhdGEgPSBfZGF0YTtcCisJfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL25faGRsYy5jIGIvZHJpdmVycy9jaGFyL25faGRsYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZGJmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbl9oZGxjLmMKQEAgLTAsMCArMSw5NzggQEAKKy8qIGdlbmVyaWMgSERMQyBsaW5lIGRpc2NpcGxpbmUgZm9yIExpbnV4CisgKgorICogV3JpdHRlbiBieSBQYXVsIEZ1bGdodW0gcGF1bGtmQG1pY3JvZ2F0ZS5jb20KKyAqIGZvciBNaWNyb2dhdGUgQ29ycG9yYXRpb24KKyAqCisgKiBNaWNyb2dhdGUgYW5kIFN5bmNMaW5rIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgTWljcm9nYXRlIENvcnBvcmF0aW9uCisgKgorICogQWRhcHRlZCBmcm9tIHBwcC5jLCB3cml0dGVuIGJ5IE1pY2hhZWwgQ2FsbGFoYW4gPGNhbGxhaGFuQG1hdGhzLm94LmFjLnVrPiwKKyAqCUFsIExvbmd5ZWFyIDxsb25neWVhckBuZXRjb20uY29tPiwKKyAqCVBhdWwgTWFja2VycmFzIDxQYXVsLk1hY2tlcnJhc0Bjcy5hbnUuZWR1LmF1PgorICoKKyAqIE9yaWdpbmFsIHJlbGVhc2UgMDEvMTEvOTkKKyAqICRJZDogbl9oZGxjLmMsdiA0LjggMjAwMy8wNS8wNiAyMToxODo1MSBwYXVsa2YgRXhwICQKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpCisgKgorICogVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgdHR5IGxpbmUgZGlzY2lwbGluZSBOX0hETEMgZm9yIHVzZSB3aXRoCisgKiB0dHkgZGV2aWNlIGRyaXZlcnMgdGhhdCBzdXBwb3J0IGJpdC1zeW5jaHJvbm91cyBIRExDIGNvbW11bmljYXRpb25zLgorICoKKyAqIEFsbCBIRExDIGRhdGEgaXMgZnJhbWUgb3JpZW50ZWQgd2hpY2ggbWVhbnM6CisgKgorICogMS4gdHR5IHdyaXRlIGNhbGxzIHJlcHJlc2VudCBvbmUgY29tcGxldGUgdHJhbnNtaXQgZnJhbWUgb2YgZGF0YQorICogICAgVGhlIGRldmljZSBkcml2ZXIgc2hvdWxkIGFjY2VwdCB0aGUgY29tcGxldGUgZnJhbWUgb3Igbm9uZSBvZiAKKyAqICAgIHRoZSBmcmFtZSAoYnVzeSkgaW4gdGhlIHdyaXRlIG1ldGhvZC4gRWFjaCB3cml0ZSBjYWxsIHNob3VsZCBoYXZlCisgKiAgICBhIGJ5dGUgY291bnQgaW4gdGhlIHJhbmdlIG9mIDItNjU1MzUgYnl0ZXMgKDIgaXMgbWluIEhETEMgZnJhbWUKKyAqICAgIHdpdGggMSBhZGRyIGJ5dGUgYW5kIDEgY3RybCBieXRlKS4gVGhlIG1heCBieXRlIGNvdW50IG9mIDY1NTM1CisgKiAgICBzaG91bGQgaW5jbHVkZSBhbnkgY3JjIGJ5dGVzIHJlcXVpcmVkLiBGb3IgZXhhbXBsZSwgd2hlbiB1c2luZworICogICAgQ0NJVFQgQ1JDMzIsIDQgY3JjIGJ5dGVzIGFyZSByZXF1aXJlZCwgc28gdGhlIG1heGltdW0gc2l6ZSBmcmFtZQorICogICAgdGhlIGFwcGxpY2F0aW9uIG1heSB0cmFuc21pdCBpcyBsaW1pdGVkIHRvIDY1NTMxIGJ5dGVzLiBGb3IgQ0NJVFQKKyAqICAgIENSQzE2LCB0aGUgbWF4aW11bSBhcHBsaWNhdGlvbiBmcmFtZSBzaXplIHdvdWxkIGJlIDY1NTMzLgorICoKKyAqCisgKiAyLiByZWNlaXZlIGNhbGxiYWNrcyBmcm9tIHRoZSBkZXZpY2UgZHJpdmVyIHJlcHJlc2VudHMKKyAqICAgIG9uZSByZWNlaXZlZCBmcmFtZS4gVGhlIGRldmljZSBkcml2ZXIgc2hvdWxkIGJ5cGFzcworICogICAgdGhlIHR0eSBmbGlwIGJ1ZmZlciBhbmQgY2FsbCB0aGUgbGluZSBkaXNjaXBsaW5lIHJlY2VpdmUKKyAqICAgIGNhbGxiYWNrIGRpcmVjdGx5IHRvIGF2b2lkIGZyYWdtZW50aW5nIG9yIGNvbmNhdGVuYXRpbmcKKyAqICAgIG11bHRpcGxlIGZyYW1lcyBpbnRvIGEgc2luZ2xlIHJlY2VpdmUgY2FsbGJhY2suCisgKgorICogICAgVGhlIEhETEMgbGluZSBkaXNjaXBsaW5lIHF1ZXVlcyB0aGUgcmVjZWl2ZSBmcmFtZXMgaW4gc2VwYXJhdGUKKyAqICAgIGJ1ZmZlcnMgc28gY29tcGxldGUgcmVjZWl2ZSBmcmFtZXMgY2FuIGJlIHJldHVybmVkIGJ5IHRoZQorICogICAgdHR5IHJlYWQgY2FsbHMuCisgKgorICogMy4gdHR5IHJlYWQgY2FsbHMgcmV0dXJucyBhbiBlbnRpcmUgZnJhbWUgb2YgZGF0YSBvciBub3RoaW5nLgorICogICAgCisgKiA0LiBhbGwgc2VuZCBhbmQgcmVjZWl2ZSBkYXRhIGlzIGNvbnNpZGVyZWQgcmF3LiBObyBwcm9jZXNzaW5nCisgKiAgICBvciB0cmFuc2xhdGlvbiBpcyBwZXJmb3JtZWQgYnkgdGhlIGxpbmUgZGlzY2lwbGluZSwgcmVnYXJkbGVzcworICogICAgb2YgdGhlIHR0eSBmbGFncworICoKKyAqIDUuIFdoZW4gbGluZSBkaXNjaXBsaW5lIGlzIHF1ZXJpZWQgZm9yIHRoZSBhbW91bnQgb2YgcmVjZWl2ZQorICogICAgZGF0YSBhdmFpbGFibGUgKEZJT0MpLCAwIGlzIHJldHVybmVkIGlmIG5vIGRhdGEgYXZhaWxhYmxlLAorICogICAgb3RoZXJ3aXNlIHRoZSBjb3VudCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgZnJhbWUgaXMgcmV0dXJuZWQuCisgKiAgICAoaW5zdGVhZCBvZiB0aGUgc3VtIG9mIGFsbCByZWNlaXZlZCBmcmFtZSBjb3VudHMpLgorICoKKyAqIFRoZXNlIGNvbnZlbnRpb25zIGFsbG93IHRoZSBzdGFuZGFyZCB0dHkgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlCisgKiB0byBiZSB1c2VkIGZvciBzeW5jaHJvbm91cyBIRExDIGFwcGxpY2F0aW9ucyB3aGVuIHVzZWQgd2l0aAorICogdGhpcyBsaW5lIGRpc2NpcGxpbmUgKG9yIGFub3RoZXIgbGluZSBkaXNjaXBsaW5lIHRoYXQgaXMgZnJhbWUKKyAqIG9yaWVudGVkIHN1Y2ggYXMgTl9QUFApLgorICoKKyAqIFRoZSBTeW5jTGluayBkcml2ZXIgKHN5bmNsaW5rLmMpIGltcGxlbWVudHMgYm90aCBhc3luY2hyb25vdXMKKyAqICh1c2luZyBzdGFuZGFyZCBsaW5lIGRpc2NpcGxpbmUgTl9UVFkpIGFuZCBzeW5jaHJvbm91cyBIRExDCisgKiAodXNpbmcgTl9IRExDKSBjb21tdW5pY2F0aW9ucywgd2l0aCB0aGUgbGF0dGVyIHVzaW5nIHRoZSBhYm92ZQorICogY29udmVudGlvbnMuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IGJhc2ljIGFuZCBkb2VzIG5vdCBtYWludGFpbgorICogYW55IHN0YXRpc3RpY3MuIFRoZSBtYWluIHBvaW50IGlzIHRvIGVuZm9yY2UgdGhlIHJhdyBkYXRhCisgKiBhbmQgZnJhbWUgb3JpZW50YXRpb24gb2YgSERMQyBjb21tdW5pY2F0aW9ucy4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2RlZmluZSBIRExDX01BR0lDIDB4MjM5ZQorI2RlZmluZSBIRExDX1ZFUlNJT04gIiRSZXZpc2lvbjogNC44ICQiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisKKyN1bmRlZiBWRVJTSU9OCisjZGVmaW5lIFZFUlNJT04obWFqb3IsbWlub3IscGF0Y2gpICgoKCgobWFqb3IpPDw4KSsobWlub3IpKTw8OCkrKHBhdGNoKSkKKworI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIHVzZWQgaW4gbmV3IHR0eSBkcml2ZXJzICovCisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CS8qIHVzZWQgaW4gbmV3IHR0eSBkcml2ZXJzICovCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdGVybWlvcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qCisgKiBCdWZmZXJzIGZvciBpbmRpdmlkdWFsIEhETEMgZnJhbWVzCisgKi8KKyNkZWZpbmUgTUFYX0hETENfRlJBTUVfU0laRSA2NTUzNSAKKyNkZWZpbmUgREVGQVVMVF9SWF9CVUZfQ09VTlQgMTAKKyNkZWZpbmUgTUFYX1JYX0JVRl9DT1VOVCA2MAorI2RlZmluZSBERUZBVUxUX1RYX0JVRl9DT1VOVCAxCisKK3N0cnVjdCBuX2hkbGNfYnVmIHsKKwlzdHJ1Y3Qgbl9oZGxjX2J1ZiAqbGluazsKKwlpbnQJCSAgY291bnQ7CisJY2hhcgkJICBidWZbMV07Cit9OworCisjZGVmaW5lCU5fSERMQ19CVUZfU0laRQkoc2l6ZW9mKHN0cnVjdCBuX2hkbGNfYnVmKSArIG1heGZyYW1lKQorCitzdHJ1Y3Qgbl9oZGxjX2J1Zl9saXN0IHsKKwlzdHJ1Y3Qgbl9oZGxjX2J1ZiAqaGVhZDsKKwlzdHJ1Y3Qgbl9oZGxjX2J1ZiAqdGFpbDsKKwlpbnQJCSAgY291bnQ7CisJc3BpbmxvY2tfdAkgIHNwaW5sb2NrOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgbl9oZGxjIC0gcGVyIGRldmljZSBpbnN0YW5jZSBkYXRhIHN0cnVjdHVyZQorICogQG1hZ2ljIC0gbWFnaWMgdmFsdWUgZm9yIHN0cnVjdHVyZQorICogQGZsYWdzIC0gbWlzY2VsbGFuZW91cyBjb250cm9sIGZsYWdzCisgKiBAdHR5IC0gcHRyIHRvIFRUWSBzdHJ1Y3R1cmUKKyAqIEBiYWNrdXBfdHR5IC0gVFRZIHRvIHVzZSBpZiB0dHkgZ2V0cyBjbG9zZWQKKyAqIEB0YnVzeSAtIHJlZW50cmFuY3kgZmxhZyBmb3IgdHggd2FrZXVwIGNvZGUKKyAqIEB3b2tlX3VwIC0gRklYTUU6IGRlc2NyaWJlIHRoaXMgZmllbGQKKyAqIEB0YnVmIC0gY3VycmVudGx5IHRyYW5zbWl0dGluZyB0eCBidWZmZXIKKyAqIEB0eF9idWZfbGlzdCAtIGxpc3Qgb2YgcGVuZGluZyB0cmFuc21pdCBmcmFtZSBidWZmZXJzCisgKiBAcnhfYnVmX2xpc3QgLSBsaXN0IG9mIHJlY2VpdmVkIGZyYW1lIGJ1ZmZlcnMKKyAqIEB0eF9mcmVlX2J1Zl9saXN0IC0gbGlzdCB1bnVzZWQgdHJhbnNtaXQgZnJhbWUgYnVmZmVycworICogQHJ4X2ZyZWVfYnVmX2xpc3QgLSBsaXN0IHVudXNlZCByZWNlaXZlZCBmcmFtZSBidWZmZXJzCisgKi8KK3N0cnVjdCBuX2hkbGMgeworCWludAkJCW1hZ2ljOworCV9fdTMyCQkJZmxhZ3M7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqYmFja3VwX3R0eTsKKwlpbnQJCQl0YnVzeTsKKwlpbnQJCQl3b2tlX3VwOworCXN0cnVjdCBuX2hkbGNfYnVmCSp0YnVmOworCXN0cnVjdCBuX2hkbGNfYnVmX2xpc3QJdHhfYnVmX2xpc3Q7CisJc3RydWN0IG5faGRsY19idWZfbGlzdAlyeF9idWZfbGlzdDsKKwlzdHJ1Y3Qgbl9oZGxjX2J1Zl9saXN0CXR4X2ZyZWVfYnVmX2xpc3Q7CisJc3RydWN0IG5faGRsY19idWZfbGlzdAlyeF9mcmVlX2J1Zl9saXN0OworfTsKKworLyoKKyAqIEhETEMgYnVmZmVyIGxpc3QgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZCBuX2hkbGNfYnVmX2xpc3RfaW5pdChzdHJ1Y3Qgbl9oZGxjX2J1Zl9saXN0ICpsaXN0KTsKK3N0YXRpYyB2b2lkIG5faGRsY19idWZfcHV0KHN0cnVjdCBuX2hkbGNfYnVmX2xpc3QgKmxpc3QsCisJCQkgICBzdHJ1Y3Qgbl9oZGxjX2J1ZiAqYnVmKTsKK3N0YXRpYyBzdHJ1Y3Qgbl9oZGxjX2J1ZiAqbl9oZGxjX2J1Zl9nZXQoc3RydWN0IG5faGRsY19idWZfbGlzdCAqbGlzdCk7CisKKy8qIExvY2FsIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgc3RydWN0IG5faGRsYyAqbl9oZGxjX2FsbG9jICh2b2lkKTsKKworLyogZGVidWcgbGV2ZWwgY2FuIGJlIHNldCBieSBpbnNtb2QgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyAqLworI2RlZmluZSBERUJVR19MRVZFTF9JTkZPCTEKK3N0YXRpYyBpbnQgZGVidWdsZXZlbDsKKworLyogbWF4IGZyYW1lIHNpemUgZm9yIG1lbW9yeSBhbGxvY2F0aW9ucyAqLworc3RhdGljIGludCBtYXhmcmFtZSA9IDQwOTY7CisKKy8qIFRUWSBjYWxsYmFja3MgKi8KKworc3RhdGljIHNzaXplX3Qgbl9oZGxjX3R0eV9yZWFkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgX191OCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5yKTsKK3N0YXRpYyBzc2l6ZV90IG5faGRsY190dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbnIpOworc3RhdGljIGludCBuX2hkbGNfdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbl9oZGxjX3R0eV9wb2xsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICBwb2xsX3RhYmxlICp3YWl0KTsKK3N0YXRpYyBpbnQgbl9oZGxjX3R0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgbl9oZGxjX3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQgbl9oZGxjX3R0eV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgbl9oZGxjX3R0eV9yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IF9fdTggKmNwLAorCQkJICAgICAgIGNoYXIgKmZwLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgbl9oZGxjX3R0eV93YWtldXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CisKKyNkZWZpbmUgYnNldChwLGIpCSgocClbKGIpID4+IDVdIHw9ICgxIDw8ICgoYikgJiAweDFmKSkpCisKKyNkZWZpbmUgdHR5Mm5faGRsYyh0dHkpCSgoc3RydWN0IG5faGRsYyAqKSAoKHR0eSktPmRpc2NfZGF0YSkpCisjZGVmaW5lIG5faGRsYzJ0dHkobl9oZGxjKQkoKG5faGRsYyktPnR0eSkKKworc3RhdGljIHN0cnVjdCB0dHlfbGRpc2Mgbl9oZGxjX2xkaXNjID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubWFnaWMJCT0gVFRZX0xESVNDX01BR0lDLAorCS5uYW1lCQk9ICJoZGxjIiwKKwkub3BlbgkJPSBuX2hkbGNfdHR5X29wZW4sCisJLmNsb3NlCQk9IG5faGRsY190dHlfY2xvc2UsCisJLnJlYWQJCT0gbl9oZGxjX3R0eV9yZWFkLAorCS53cml0ZQkJPSBuX2hkbGNfdHR5X3dyaXRlLAorCS5pb2N0bAkJPSBuX2hkbGNfdHR5X2lvY3RsLAorCS5wb2xsCQk9IG5faGRsY190dHlfcG9sbCwKKwkucmVjZWl2ZV9idWYJPSBuX2hkbGNfdHR5X3JlY2VpdmUsCisJLnJlY2VpdmVfcm9vbQk9IG5faGRsY190dHlfcm9vbSwKKwkud3JpdGVfd2FrZXVwCT0gbl9oZGxjX3R0eV93YWtldXAsCit9OworCisvKioKKyAqIG5faGRsY19yZWxlYXNlIC0gcmVsZWFzZSBhbiBuX2hkbGMgcGVyIGRldmljZSBsaW5lIGRpc2NpcGxpbmUgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBuX2hkbGMgLSBwZXIgZGV2aWNlIGxpbmUgZGlzY2lwbGluZSBpbmZvIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBuX2hkbGNfcmVsZWFzZShzdHJ1Y3Qgbl9oZGxjICpuX2hkbGMpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IG5faGRsYzJ0dHkgKG5faGRsYyk7CisJc3RydWN0IG5faGRsY19idWYgKmJ1ZjsKKwkKKwlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJcHJpbnRrKCIlcyglZCluX2hkbGNfcmVsZWFzZSgpIGNhbGxlZFxuIixfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCQorCS8qIEVuc3VyZSB0aGF0IHRoZSBuX2hkbGNkIHByb2Nlc3MgaXMgbm90IGhhbmdpbmcgb24gc2VsZWN0KCkvcG9sbCgpICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICgmdHR5LT5yZWFkX3dhaXQpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJnR0eS0+d3JpdGVfd2FpdCk7CisKKwlpZiAodHR5ICE9IE5VTEwgJiYgdHR5LT5kaXNjX2RhdGEgPT0gbl9oZGxjKQorCQl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CS8qIEJyZWFrIHRoZSB0dHktPm5faGRsYyBsaW5rICovCisKKwkvKiBSZWxlYXNlIHRyYW5zbWl0IGFuZCByZWNlaXZlIGJ1ZmZlcnMgKi8KKwlmb3IoOzspIHsKKwkJYnVmID0gbl9oZGxjX2J1Zl9nZXQoJm5faGRsYy0+cnhfZnJlZV9idWZfbGlzdCk7CisJCWlmIChidWYpIHsKKwkJCWtmcmVlKGJ1Zik7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCWZvcig7OykgeworCQlidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT50eF9mcmVlX2J1Zl9saXN0KTsKKwkJaWYgKGJ1ZikgeworCQkJa2ZyZWUoYnVmKTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJZm9yKDs7KSB7CisJCWJ1ZiA9IG5faGRsY19idWZfZ2V0KCZuX2hkbGMtPnJ4X2J1Zl9saXN0KTsKKwkJaWYgKGJ1ZikgeworCQkJa2ZyZWUoYnVmKTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJZm9yKDs7KSB7CisJCWJ1ZiA9IG5faGRsY19idWZfZ2V0KCZuX2hkbGMtPnR4X2J1Zl9saXN0KTsKKwkJaWYgKGJ1ZikgeworCQkJa2ZyZWUoYnVmKTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJaWYgKG5faGRsYy0+dGJ1ZikKKwkJa2ZyZWUobl9oZGxjLT50YnVmKTsKKwlrZnJlZShuX2hkbGMpOworCQorfQkvKiBlbmQgb2Ygbl9oZGxjX3JlbGVhc2UoKSAqLworCisvKioKKyAqIG5faGRsY190dHlfY2xvc2UgLSBsaW5lIGRpc2NpcGxpbmUgY2xvc2UKKyAqIEB0dHkgLSBwb2ludGVyIHRvIHR0eSBpbmZvIHN0cnVjdHVyZQorICoKKyAqIENhbGxlZCB3aGVuIHRoZSBsaW5lIGRpc2NpcGxpbmUgaXMgY2hhbmdlZCB0byBzb21ldGhpbmcKKyAqIGVsc2UsIHRoZSB0dHkgaXMgY2xvc2VkLCBvciB0aGUgdHR5IGRldGVjdHMgYSBoYW5ndXAuCisgKi8KK3N0YXRpYyB2b2lkIG5faGRsY190dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgbl9oZGxjICpuX2hkbGMgPSB0dHkybl9oZGxjICh0dHkpOworCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3R0eV9jbG9zZSgpIGNhbGxlZFxuIixfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCQorCWlmIChuX2hkbGMgIT0gTlVMTCkgeworCQlpZiAobl9oZGxjLT5tYWdpYyAhPSBIRExDX01BR0lDKSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyJuX2hkbGM6IHRyeWluZyB0byBjbG9zZSB1bm9wZW5lZCB0dHkhXG4iKTsKKwkJCXJldHVybjsKKwkJfQorI2lmIGRlZmluZWQoVFRZX05PX1dSSVRFX1NQTElUKQorCQljbGVhcl9iaXQoVFRZX05PX1dSSVRFX1NQTElULCZ0dHktPmZsYWdzKTsKKyNlbmRpZgorCQl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CisJCWlmICh0dHkgPT0gbl9oZGxjLT5iYWNrdXBfdHR5KQorCQkJbl9oZGxjLT5iYWNrdXBfdHR5ID0gTlVMTDsKKwkJaWYgKHR0eSAhPSBuX2hkbGMtPnR0eSkKKwkJCXJldHVybjsKKwkJaWYgKG5faGRsYy0+YmFja3VwX3R0eSkgeworCQkJbl9oZGxjLT50dHkgPSBuX2hkbGMtPmJhY2t1cF90dHk7CisJCX0gZWxzZSB7CisJCQluX2hkbGNfcmVsZWFzZSAobl9oZGxjKTsKKwkJfQorCX0KKwkKKwlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJcHJpbnRrKCIlcyglZCluX2hkbGNfdHR5X2Nsb3NlKCkgc3VjY2Vzc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCQorfQkvKiBlbmQgb2Ygbl9oZGxjX3R0eV9jbG9zZSgpICovCisKKy8qKgorICogbl9oZGxjX3R0eV9vcGVuIC0gY2FsbGVkIHdoZW4gbGluZSBkaXNjaXBsaW5lIGNoYW5nZWQgdG8gbl9oZGxjCisgKiBAdHR5IC0gcG9pbnRlciB0byB0dHkgaW5mbyBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBuX2hkbGNfdHR5X29wZW4gKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG5faGRsYyAqbl9oZGxjID0gdHR5Mm5faGRsYyAodHR5KTsKKworCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQlwcmludGsoIiVzKCVkKW5faGRsY190dHlfb3BlbigpIGNhbGxlZCAoZGV2aWNlPSVzKVxuIiwKKwkJX19GSUxFX18sX19MSU5FX18sCisJCXR0eS0+bmFtZSk7CisJCQorCS8qIFRoZXJlIHNob3VsZCBub3QgYmUgYW4gZXhpc3RpbmcgdGFibGUgZm9yIHRoaXMgc2xvdC4gKi8KKwlpZiAobl9oZGxjKSB7CisJCXByaW50ayAoS0VSTl9FUlIibl9oZGxjX3R0eV9vcGVuOnR0eSBhbHJlYWR5IGFzc29jaWF0ZWQhXG4iICk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKwkKKwluX2hkbGMgPSBuX2hkbGNfYWxsb2MoKTsKKwlpZiAoIW5faGRsYykgeworCQlwcmludGsgKEtFUk5fRVJSICJuX2hkbGNfYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTkZJTEU7CisJfQorCQkKKwl0dHktPmRpc2NfZGF0YSA9IG5faGRsYzsKKwluX2hkbGMtPnR0eSAgICA9IHR0eTsKKwkKKyNpZiBkZWZpbmVkKFRUWV9OT19XUklURV9TUExJVCkKKwkvKiBjaGFuZ2UgdHR5X2lvIHdyaXRlKCkgdG8gbm90IHNwbGl0IGxhcmdlIHdyaXRlcyBpbnRvIDhLIGNodW5rcyAqLworCXNldF9iaXQoVFRZX05PX1dSSVRFX1NQTElULCZ0dHktPmZsYWdzKTsKKyNlbmRpZgorCQorCS8qIEZsdXNoIGFueSBwZW5kaW5nIGNoYXJhY3RlcnMgaW4gdGhlIGRyaXZlciBhbmQgZGlzY2lwbGluZS4gKi8KKwkKKwlpZiAodHR5LT5sZGlzYy5mbHVzaF9idWZmZXIpCisJCXR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyICh0dHkpOworCisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIgKHR0eSk7CisJCQorCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQlwcmludGsoIiVzKCVkKW5faGRsY190dHlfb3BlbigpIHN1Y2Nlc3NcbiIsX19GSUxFX18sX19MSU5FX18pOworCQkKKwlyZXR1cm4gMDsKKwkKK30JLyogZW5kIG9mIG5fdHR5X2hkbGNfb3BlbigpICovCisKKy8qKgorICogbl9oZGxjX3NlbmRfZnJhbWVzIC0gc2VuZCBmcmFtZXMgb24gcGVuZGluZyBzZW5kIGJ1ZmZlciBsaXN0CisgKiBAbl9oZGxjIC0gcG9pbnRlciB0byBsZGlzYyBpbnN0YW5jZSBkYXRhCisgKiBAdHR5IC0gcG9pbnRlciB0byB0dHkgaW5zdGFuY2UgZGF0YQorICoKKyAqIFNlbmQgZnJhbWVzIG9uIHBlbmRpbmcgc2VuZCBidWZmZXIgbGlzdCB1bnRpbCB0aGUgZHJpdmVyIGRvZXMgbm90IGFjY2VwdCBhCisgKiBmcmFtZSAoYnVzeSkgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYWRkaW5nIGEgZnJhbWUgdG8gdGhlIHNlbmQgYnVmZmVyCisgKiBsaXN0IGFuZCBieSB0aGUgdHR5IHdha2V1cCBjYWxsYmFjay4KKyAqLworc3RhdGljIHZvaWQgbl9oZGxjX3NlbmRfZnJhbWVzKHN0cnVjdCBuX2hkbGMgKm5faGRsYywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZWdpc3RlciBpbnQgYWN0dWFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5faGRsY19idWYgKnRidWY7CisKKwlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJcHJpbnRrKCIlcyglZCluX2hkbGNfc2VuZF9mcmFtZXMoKSBjYWxsZWRcbiIsX19GSUxFX18sX19MSU5FX18pOworIGNoZWNrX2FnYWluOgorCQkKKyAJc3Bpbl9sb2NrX2lycXNhdmUoJm5faGRsYy0+dHhfYnVmX2xpc3Quc3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAobl9oZGxjLT50YnVzeSkgeworCQluX2hkbGMtPndva2VfdXAgPSAxOworIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbl9oZGxjLT50eF9idWZfbGlzdC5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCW5faGRsYy0+dGJ1c3kgPSAxOworCW5faGRsYy0+d29rZV91cCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbl9oZGxjLT50eF9idWZfbGlzdC5zcGlubG9jaywgZmxhZ3MpOworCisJLyogZ2V0IGN1cnJlbnQgdHJhbnNtaXQgYnVmZmVyIG9yIGdldCBuZXcgdHJhbnNtaXQgKi8KKwkvKiBidWZmZXIgZnJvbSBsaXN0IG9mIHBlbmRpbmcgdHJhbnNtaXQgYnVmZmVycyAqLworCQkKKwl0YnVmID0gbl9oZGxjLT50YnVmOworCWlmICghdGJ1ZikKKwkJdGJ1ZiA9IG5faGRsY19idWZfZ2V0KCZuX2hkbGMtPnR4X2J1Zl9saXN0KTsKKwkJCisJd2hpbGUgKHRidWYpIHsKKwkJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCQlwcmludGsoIiVzKCVkKXNlbmRpbmcgZnJhbWUgJXAsIGNvdW50PSVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLHRidWYsdGJ1Zi0+Y291bnQpOworCQkJCisJCS8qIFNlbmQgdGhlIG5leHQgYmxvY2sgb2YgZGF0YSB0byBkZXZpY2UgKi8KKwkJdHR5LT5mbGFncyB8PSAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwkJYWN0dWFsID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgdGJ1Zi0+YnVmLCB0YnVmLT5jb3VudCk7CisJCSAgICAKKwkJLyogaWYgdHJhbnNtaXQgZXJyb3IsIHRocm93IGZyYW1lIGF3YXkgYnkgKi8KKwkJLyogcHJldGVuZGluZyBpdCB3YXMgYWNjZXB0ZWQgYnkgZHJpdmVyICovCisJCWlmIChhY3R1YWwgPCAwKQorCQkJYWN0dWFsID0gdGJ1Zi0+Y291bnQ7CisJCQorCQlpZiAoYWN0dWFsID09IHRidWYtPmNvdW50KSB7CisJCQlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJCQlwcmludGsoIiVzKCVkKWZyYW1lICVwIGNvbXBsZXRlZFxuIiwKKwkJCQkJX19GSUxFX18sX19MSU5FX18sdGJ1Zik7CisJCQkJCQorCQkJLyogZnJlZSBjdXJyZW50IHRyYW5zbWl0IGJ1ZmZlciAqLworCQkJbl9oZGxjX2J1Zl9wdXQoJm5faGRsYy0+dHhfZnJlZV9idWZfbGlzdCwgdGJ1Zik7CisJCQkKKwkJCS8qIHRoaXMgdHggYnVmZmVyIGlzIGRvbmUgKi8KKwkJCW5faGRsYy0+dGJ1ZiA9IE5VTEw7CisJCQkKKwkJCS8qIHdhaXQgdXAgc2xlZXBpbmcgd3JpdGVycyAqLworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCQorCQkJLyogZ2V0IG5leHQgcGVuZGluZyB0cmFuc21pdCBidWZmZXIgKi8KKwkJCXRidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT50eF9idWZfbGlzdCk7CisJCX0gZWxzZSB7CisJCQlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJCQlwcmludGsoIiVzKCVkKWZyYW1lICVwIHBlbmRpbmdcbiIsCisJCQkJCV9fRklMRV9fLF9fTElORV9fLHRidWYpOworCQkJCQkKKwkJCS8qIGJ1ZmZlciBub3QgYWNjZXB0ZWQgYnkgZHJpdmVyICovCisJCQkvKiBzZXQgdGhpcyBidWZmZXIgYXMgcGVuZGluZyBidWZmZXIgKi8KKwkJCW5faGRsYy0+dGJ1ZiA9IHRidWY7CisJCQlicmVhazsKKwkJfQorCX0KKwkKKwlpZiAoIXRidWYpCisJCXR0eS0+ZmxhZ3MgICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwkKKwkvKiBDbGVhciB0aGUgcmUtZW50cnkgZmxhZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZuX2hkbGMtPnR4X2J1Zl9saXN0LnNwaW5sb2NrLCBmbGFncyk7CisJbl9oZGxjLT50YnVzeSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbl9oZGxjLT50eF9idWZfbGlzdC5zcGlubG9jaywgZmxhZ3MpOyAKKwkKKyAgICAgICAgaWYgKG5faGRsYy0+d29rZV91cCkKKwkgIGdvdG8gY2hlY2tfYWdhaW47CisKKwlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJcHJpbnRrKCIlcyglZCluX2hkbGNfc2VuZF9mcmFtZXMoKSBleGl0XG4iLF9fRklMRV9fLF9fTElORV9fKTsKKwkJCit9CS8qIGVuZCBvZiBuX2hkbGNfc2VuZF9mcmFtZXMoKSAqLworCisvKioKKyAqIG5faGRsY190dHlfd2FrZXVwIC0gQ2FsbGJhY2sgZm9yIHRyYW5zbWl0IHdha2V1cAorICogQHR0eQktIHBvaW50ZXIgdG8gYXNzb2NpYXRlZCB0dHkgaW5zdGFuY2UgZGF0YQorICoKKyAqIENhbGxlZCB3aGVuIGxvdyBsZXZlbCBkZXZpY2UgZHJpdmVyIGNhbiBhY2NlcHQgbW9yZSBzZW5kIGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIG5faGRsY190dHlfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG5faGRsYyAqbl9oZGxjID0gdHR5Mm5faGRsYyh0dHkpOworCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3R0eV93YWtldXAoKSBjYWxsZWRcbiIsX19GSUxFX18sX19MSU5FX18pOworCQkKKwlpZiAoIW5faGRsYykKKwkJcmV0dXJuOworCisJaWYgKHR0eSAhPSBuX2hkbGMtPnR0eSkgeworCQl0dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwkJcmV0dXJuOworCX0KKworCW5faGRsY19zZW5kX2ZyYW1lcyAobl9oZGxjLCB0dHkpOworCQkKK30JLyogZW5kIG9mIG5faGRsY190dHlfd2FrZXVwKCkgKi8KKworLyoqCisgKiBuX2hkbGNfdHR5X3Jvb20gLSBSZXR1cm4gdGhlIGFtb3VudCBvZiBzcGFjZSBsZWZ0IGluIHRoZSByZWNlaXZlcidzIGJ1ZmZlcgorICogQHR0eQktIHBvaW50ZXIgdG8gYXNzb2NpYXRlZCB0dHkgaW5zdGFuY2UgZGF0YQorICoKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIGZyb20gdHR5IGRyaXZlci4gUmV0dXJuIHRoZSBhbW91bnQgb2Ygc3BhY2UgbGVmdCBpbiB0aGUKKyAqIHJlY2VpdmVyJ3MgYnVmZmVyIHRvIGRlY2lkZSBpZiByZW1vdGUgdHJhbnNtaXR0ZXIgaXMgdG8gYmUgdGhyb3R0bGVkLgorICovCitzdGF0aWMgaW50IG5faGRsY190dHlfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQlwcmludGsoIiVzKCVkKW5faGRsY190dHlfcm9vbSgpIGNhbGxlZFxuIixfX0ZJTEVfXyxfX0xJTkVfXyk7CisJLyogYWx3YXlzIHJldHVybiBhIGxhcmdlciBudW1iZXIgdG8gcHJldmVudCAqLworCS8qIHRocm90dGxpbmcgb2YgcmVtb3RlIHRyYW5zbWl0dGVyLiAqLworCXJldHVybiA2NTUzNjsKK30JLyogZW5kIG9mIG5faGRsY190dHlfcm9vdCgpICovCisKKy8qKgorICogbl9oZGxjX3R0eV9yZWNlaXZlIC0gQ2FsbGVkIGJ5IHR0eSBkcml2ZXIgd2hlbiByZWNlaXZlIGRhdGEgaXMgYXZhaWxhYmxlCisgKiBAdHR5CS0gcG9pbnRlciB0byB0dHkgaW5zdGFuY2UgZGF0YQorICogQGRhdGEgLSBwb2ludGVyIHRvIHJlY2VpdmVkIGRhdGEKKyAqIEBmbGFncyAtIHBvaW50ZXIgdG8gZmxhZ3MgZm9yIGRhdGEKKyAqIEBjb3VudCAtIGNvdW50IG9mIHJlY2VpdmVkIGRhdGEgaW4gYnl0ZXMKKyAqCisgKiBDYWxsZWQgYnkgdHR5IGxvdyBsZXZlbCBkcml2ZXIgd2hlbiByZWNlaXZlIGRhdGEgaXMgYXZhaWxhYmxlLiBEYXRhIGlzCisgKiBpbnRlcnByZXRlZCBhcyBvbmUgSERMQyBmcmFtZS4KKyAqLworc3RhdGljIHZvaWQgbl9oZGxjX3R0eV9yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IF9fdTggKmRhdGEsCisJCQkgICAgICAgY2hhciAqZmxhZ3MsIGludCBjb3VudCkKK3sKKwlyZWdpc3RlciBzdHJ1Y3Qgbl9oZGxjICpuX2hkbGMgPSB0dHkybl9oZGxjICh0dHkpOworCXJlZ2lzdGVyIHN0cnVjdCBuX2hkbGNfYnVmICpidWY7CisKKwlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJcHJpbnRrKCIlcyglZCluX2hkbGNfdHR5X3JlY2VpdmUoKSBjYWxsZWQgY291bnQ9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXywgY291bnQpOworCQkKKwkvKiBUaGlzIGNhbiBoYXBwZW4gaWYgc3R1ZmYgY29tZXMgaW4gb24gdGhlIGJhY2t1cCB0dHkgKi8KKwlpZiAobl9oZGxjID09IDAgfHwgdHR5ICE9IG5faGRsYy0+dHR5KQorCQlyZXR1cm47CisJCQorCS8qIHZlcmlmeSBsaW5lIGlzIHVzaW5nIEhETEMgZGlzY2lwbGluZSAqLworCWlmIChuX2hkbGMtPm1hZ2ljICE9IEhETENfTUFHSUMpIHsKKwkJcHJpbnRrKCIlcyglZCkgbGluZSBub3QgdXNpbmcgSERMQyBkaXNjaXBsaW5lXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCQorCWlmICggY291bnQ+bWF4ZnJhbWUgKSB7CisJCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQkJcHJpbnRrKCIlcyglZCkgcnggY291bnQ+bWF4ZnJhbWVzaXplLCBkYXRhIGRpc2NhcmRlZFxuIiwKKwkJCSAgICAgICBfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBnZXQgYSBmcmVlIEhETEMgYnVmZmVyICovCQorCWJ1ZiA9IG5faGRsY19idWZfZ2V0KCZuX2hkbGMtPnJ4X2ZyZWVfYnVmX2xpc3QpOworCWlmICghYnVmKSB7CisJCS8qIG5vIGJ1ZmZlcnMgaW4gZnJlZSBsaXN0LCBhdHRlbXB0IHRvIGFsbG9jYXRlIGFub3RoZXIgcnggYnVmZmVyICovCisJCS8qIHVubGVzcyB0aGUgbWF4aW11bSBjb3VudCBoYXMgYmVlbiByZWFjaGVkICovCisJCWlmIChuX2hkbGMtPnJ4X2J1Zl9saXN0LmNvdW50IDwgTUFYX1JYX0JVRl9DT1VOVCkKKwkJCWJ1ZiA9IGttYWxsb2MoTl9IRExDX0JVRl9TSVpFLCBHRlBfQVRPTUlDKTsKKwl9CisJCisJaWYgKCFidWYpIHsKKwkJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCQlwcmludGsoIiVzKCVkKSBubyBtb3JlIHJ4IGJ1ZmZlcnMsIGRhdGEgZGlzY2FyZGVkXG4iLAorCQkJICAgICAgIF9fRklMRV9fLF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKwkJCisJLyogY29weSByZWNlaXZlZCBkYXRhIHRvIEhETEMgYnVmZmVyICovCisJbWVtY3B5KGJ1Zi0+YnVmLGRhdGEsY291bnQpOworCWJ1Zi0+Y291bnQ9Y291bnQ7CisKKwkvKiBhZGQgSERMQyBidWZmZXIgdG8gbGlzdCBvZiByZWNlaXZlZCBmcmFtZXMgKi8KKwluX2hkbGNfYnVmX3B1dCgmbl9oZGxjLT5yeF9idWZfbGlzdCwgYnVmKTsKKwkKKwkvKiB3YWtlIHVwIGFueSBibG9ja2VkIHJlYWRzIGFuZCBwZXJmb3JtIGFzeW5jIHNpZ25hbGxpbmcgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUgKCZ0dHktPnJlYWRfd2FpdCk7CisJaWYgKG5faGRsYy0+dHR5LT5mYXN5bmMgIT0gTlVMTCkKKwkJa2lsbF9mYXN5bmMgKCZuX2hkbGMtPnR0eS0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CisKK30JLyogZW5kIG9mIG5faGRsY190dHlfcmVjZWl2ZSgpICovCisKKy8qKgorICogbl9oZGxjX3R0eV9yZWFkIC0gQ2FsbGVkIHRvIHJldHJlaXZlIG9uZSBmcmFtZSBvZiBkYXRhIChpZiBhdmFpbGFibGUpCisgKiBAdHR5IC0gcG9pbnRlciB0byB0dHkgaW5zdGFuY2UgZGF0YQorICogQGZpbGUgLSBwb2ludGVyIHRvIG9wZW4gZmlsZSBvYmplY3QKKyAqIEBidWYgLSBwb2ludGVyIHRvIHJldHVybmVkIGRhdGEgYnVmZmVyCisgKiBAbnIgLSBzaXplIG9mIHJldHVybmVkIGRhdGEgYnVmZmVyCisgKiAJCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmV0dXJuZWQgb3IgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIHNzaXplX3Qgbl9oZGxjX3R0eV9yZWFkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgX191OCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5yKQoreworCXN0cnVjdCBuX2hkbGMgKm5faGRsYyA9IHR0eTJuX2hkbGModHR5KTsKKwlpbnQgcmV0OworCXN0cnVjdCBuX2hkbGNfYnVmICpyYnVmOworCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3R0eV9yZWFkKCkgY2FsbGVkXG4iLF9fRklMRV9fLF9fTElORV9fKTsKKwkJCisJLyogVmFsaWRhdGUgdGhlIHBvaW50ZXJzICovCisJaWYgKCFuX2hkbGMpCisJCXJldHVybiAtRUlPOworCisJLyogdmVyaWZ5IHVzZXIgYWNjZXNzIHRvIGJ1ZmZlciAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBucikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoJWQpIG5faGRsY190dHlfcmVhZCgpIGNhbid0IHZlcmlmeSB1c2VyICIKKwkJImJ1ZmZlclxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZm9yICg7OykgeworCQlpZiAodGVzdF9iaXQoVFRZX09USEVSX0NMT1NFRCwgJnR0eS0+ZmxhZ3MpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJbl9oZGxjID0gdHR5Mm5faGRsYyAodHR5KTsKKwkJaWYgKCFuX2hkbGMgfHwgbl9oZGxjLT5tYWdpYyAhPSBIRExDX01BR0lDIHx8CisJCQkgdHR5ICE9IG5faGRsYy0+dHR5KQorCQkJcmV0dXJuIDA7CisKKwkJcmJ1ZiA9IG5faGRsY19idWZfZ2V0KCZuX2hkbGMtPnJ4X2J1Zl9saXN0KTsKKwkJaWYgKHJidWYpCisJCQlicmVhazsKKwkJCQorCQkvKiBubyBkYXRhICovCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCXJldHVybiAtRUFHQUlOOworCQkJCisJCWludGVycnVwdGlibGVfc2xlZXBfb24gKCZ0dHktPnJlYWRfd2FpdCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRUlOVFI7CisJfQorCQkKKwlpZiAocmJ1Zi0+Y291bnQgPiBucikKKwkJLyogZnJhbWUgdG9vIGxhcmdlIGZvciBjYWxsZXIncyBidWZmZXIgKGRpc2NhcmQgZnJhbWUpICovCisJCXJldCA9IC1FT1ZFUkZMT1c7CisJZWxzZSB7CisJCS8qIENvcHkgdGhlIGRhdGEgdG8gdGhlIGNhbGxlcidzIGJ1ZmZlciAqLworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgcmJ1Zi0+YnVmLCByYnVmLT5jb3VudCkpCisJCQlyZXQgPSAtRUZBVUxUOworCQllbHNlCisJCQlyZXQgPSByYnVmLT5jb3VudDsKKwl9CisJCisJLyogcmV0dXJuIEhETEMgYnVmZmVyIHRvIGZyZWUgbGlzdCB1bmxlc3MgdGhlIGZyZWUgbGlzdCAqLworCS8qIGNvdW50IGhhcyBleGNlZWRlZCB0aGUgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2ggY2FzZSB0aGUgKi8KKwkvKiBidWZmZXIgaXMgZnJlZWQgYmFjayB0byB0aGUgT1MgdG8gY29uc2VydmUgbWVtb3J5ICovCisJaWYgKG5faGRsYy0+cnhfZnJlZV9idWZfbGlzdC5jb3VudCA+IERFRkFVTFRfUlhfQlVGX0NPVU5UKQorCQlrZnJlZShyYnVmKTsKKwllbHNlCQorCQluX2hkbGNfYnVmX3B1dCgmbl9oZGxjLT5yeF9mcmVlX2J1Zl9saXN0LHJidWYpOworCQorCXJldHVybiByZXQ7CisJCit9CS8qIGVuZCBvZiBuX2hkbGNfdHR5X3JlYWQoKSAqLworCisvKioKKyAqIG5faGRsY190dHlfd3JpdGUgLSB3cml0ZSBhIHNpbmdsZSBmcmFtZSBvZiBkYXRhIHRvIGRldmljZQorICogQHR0eQktIHBvaW50ZXIgdG8gYXNzb2NpYXRlZCB0dHkgZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIEBmaWxlIC0gcG9pbnRlciB0byBmaWxlIG9iamVjdCBkYXRhCisgKiBAZGF0YSAtIHBvaW50ZXIgdG8gdHJhbnNtaXQgZGF0YSAob25lIGZyYW1lKQorICogQGNvdW50IC0gc2l6ZSBvZiB0cmFuc21pdCBmcmFtZSBpbiBieXRlcworICogCQkKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIChvciBlcnJvciBjb2RlKS4KKyAqLworc3RhdGljIHNzaXplX3Qgbl9oZGxjX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IG5faGRsYyAqbl9oZGxjID0gdHR5Mm5faGRsYyAodHR5KTsKKwlpbnQgZXJyb3IgPSAwOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBuX2hkbGNfYnVmICp0YnVmOworCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3R0eV93cml0ZSgpIGNhbGxlZCBjb3VudD0lWmRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxjb3VudCk7CisJCQorCS8qIFZlcmlmeSBwb2ludGVycyAqLworCWlmICghbl9oZGxjKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChuX2hkbGMtPm1hZ2ljICE9IEhETENfTUFHSUMpCisJCXJldHVybiAtRUlPOworCisJLyogdmVyaWZ5IGZyYW1lIHNpemUgKi8KKwlpZiAoY291bnQgPiBtYXhmcmFtZSApIHsKKwkJaWYgKGRlYnVnbGV2ZWwgJiBERUJVR19MRVZFTF9JTkZPKQorCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcKKwkJCQkibl9oZGxjX3R0eV93cml0ZTogdHJ1bmNhdGluZyB1c2VyIHBhY2tldCAiCisJCQkJImZyb20gJWx1IHRvICVkXG4iLCAodW5zaWduZWQgbG9uZykgY291bnQsCisJCQkJbWF4ZnJhbWUgKTsKKwkJY291bnQgPSBtYXhmcmFtZTsKKwl9CisJCisJYWRkX3dhaXRfcXVldWUoJnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCisJLyogQWxsb2NhdGUgdHJhbnNtaXQgYnVmZmVyICovCisJLyogc2xlZXAgdW50aWwgdHJhbnNtaXQgYnVmZmVyIGF2YWlsYWJsZSAqLwkJCisJd2hpbGUgKCEodGJ1ZiA9IG5faGRsY19idWZfZ2V0KCZuX2hkbGMtPnR4X2ZyZWVfYnVmX2xpc3QpKSkgeworCQlzY2hlZHVsZSgpOworCQkJCisJCW5faGRsYyA9IHR0eTJuX2hkbGMgKHR0eSk7CisJCWlmICghbl9oZGxjIHx8IG5faGRsYy0+bWFnaWMgIT0gSERMQ19NQUdJQyB8fCAKKwkJICAgIHR0eSAhPSBuX2hkbGMtPnR0eSkgeworCQkJcHJpbnRrKCJuX2hkbGNfdHR5X3dyaXRlOiAlcCBpbnZhbGlkIGFmdGVyIHdhaXQhXG4iLCBuX2hkbGMpOworCQkJZXJyb3IgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJCQorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCWVycm9yID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZ0dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKKworCWlmICghZXJyb3IpIHsJCQorCQkvKiBSZXRyaWV2ZSB0aGUgdXNlcidzIGJ1ZmZlciAqLworCQltZW1jcHkodGJ1Zi0+YnVmLCBkYXRhLCBjb3VudCk7CisKKwkJLyogU2VuZCB0aGUgZGF0YSAqLworCQl0YnVmLT5jb3VudCA9IGVycm9yID0gY291bnQ7CisJCW5faGRsY19idWZfcHV0KCZuX2hkbGMtPnR4X2J1Zl9saXN0LHRidWYpOworCQluX2hkbGNfc2VuZF9mcmFtZXMobl9oZGxjLHR0eSk7CisJfQorCisJcmV0dXJuIGVycm9yOworCQorfQkvKiBlbmQgb2Ygbl9oZGxjX3R0eV93cml0ZSgpICovCisKKy8qKgorICogbl9oZGxjX3R0eV9pb2N0bCAtIHByb2Nlc3MgSU9DVEwgc3lzdGVtIGNhbGwgZm9yIHRoZSB0dHkgZGV2aWNlLgorICogQHR0eSAtIHBvaW50ZXIgdG8gdHR5IGluc3RhbmNlIGRhdGEKKyAqIEBmaWxlIC0gcG9pbnRlciB0byBvcGVuIGZpbGUgb2JqZWN0IGZvciBkZXZpY2UKKyAqIEBjbWQgLSBJT0NUTCBjb21tYW5kIGNvZGUKKyAqIEBhcmcgLSBhcmd1bWVudCBmb3IgSU9DVEwgY2FsbCAoY21kIGRlcGVuZGVudCkKKyAqCisgKiBSZXR1cm5zIGNvbW1hbmQgZGVwZW5kZW50IHJlc3VsdC4KKyAqLworc3RhdGljIGludCBuX2hkbGNfdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuX2hkbGMgKm5faGRsYyA9IHR0eTJuX2hkbGMgKHR0eSk7CisJaW50IGVycm9yID0gMDsKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJcHJpbnRrKCIlcyglZCluX2hkbGNfdHR5X2lvY3RsKCkgY2FsbGVkICVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sY21kKTsKKwkJCisJLyogVmVyaWZ5IHRoZSBzdGF0dXMgb2YgdGhlIGRldmljZSAqLworCWlmICghbl9oZGxjIHx8IG5faGRsYy0+bWFnaWMgIT0gSERMQ19NQUdJQykKKwkJcmV0dXJuIC1FQkFERjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBGSU9OUkVBRDoKKwkJLyogcmVwb3J0IGNvdW50IG9mIHJlYWQgZGF0YSBhdmFpbGFibGUgKi8KKwkJLyogaW4gbmV4dCBhdmFpbGFibGUgZnJhbWUgKGlmIGFueSkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm5faGRsYy0+cnhfYnVmX2xpc3Quc3BpbmxvY2ssZmxhZ3MpOworCQlpZiAobl9oZGxjLT5yeF9idWZfbGlzdC5oZWFkKQorCQkJY291bnQgPSBuX2hkbGMtPnJ4X2J1Zl9saXN0LmhlYWQtPmNvdW50OworCQllbHNlCisJCQljb3VudCA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5faGRsYy0+cnhfYnVmX2xpc3Quc3BpbmxvY2ssZmxhZ3MpOworCQllcnJvciA9IHB1dF91c2VyKGNvdW50LCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBUSU9DT1VUUToKKwkJLyogZ2V0IHRoZSBwZW5kaW5nIHR4IGJ5dGUgY291bnQgaW4gdGhlIGRyaXZlciAqLworCQljb3VudCA9IHR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIgPworCQkJCXR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIodHR5KSA6IDA7CisJCS8qIGFkZCBzaXplIG9mIG5leHQgb3V0cHV0IGZyYW1lIGluIHF1ZXVlICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZuX2hkbGMtPnR4X2J1Zl9saXN0LnNwaW5sb2NrLGZsYWdzKTsKKwkJaWYgKG5faGRsYy0+dHhfYnVmX2xpc3QuaGVhZCkKKwkJCWNvdW50ICs9IG5faGRsYy0+dHhfYnVmX2xpc3QuaGVhZC0+Y291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5faGRsYy0+dHhfYnVmX2xpc3Quc3BpbmxvY2ssZmxhZ3MpOworCQllcnJvciA9IHB1dF91c2VyKGNvdW50LCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyb3IgPSBuX3R0eV9pb2N0bCAodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyb3I7CisJCit9CS8qIGVuZCBvZiBuX2hkbGNfdHR5X2lvY3RsKCkgKi8KKworLyoqCisgKiBuX2hkbGNfdHR5X3BvbGwgLSBUVFkgY2FsbGJhY2sgZm9yIHBvbGwgc3lzdGVtIGNhbGwKKyAqIEB0dHkgLSBwb2ludGVyIHRvIHR0eSBpbnN0YW5jZSBkYXRhCisgKiBAZmlscCAtIHBvaW50ZXIgdG8gb3BlbiBmaWxlIG9iamVjdCBmb3IgZGV2aWNlCisgKiBAcG9sbF90YWJsZSAtIHdhaXQgcXVldWUgZm9yIG9wZXJhdGlvbnMKKyAqIAorICogRGV0ZXJtaW5lIHdoaWNoIG9wZXJhdGlvbnMgKHJlYWQvd3JpdGUpIHdpbGwgbm90IGJsb2NrIGFuZCByZXR1cm4gaW5mbworICogdG8gY2FsbGVyLgorICogUmV0dXJucyBhIGJpdCBtYXNrIGNvbnRhaW5pbmcgaW5mbyBvbiB3aGljaCBvcHMgd2lsbCBub3QgYmxvY2suCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbl9oZGxjX3R0eV9wb2xsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBuX2hkbGMgKm5faGRsYyA9IHR0eTJuX2hkbGMgKHR0eSk7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3R0eV9wb2xsKCkgY2FsbGVkXG4iLF9fRklMRV9fLF9fTElORV9fKTsKKwkJCisJaWYgKG5faGRsYyAmJiBuX2hkbGMtPm1hZ2ljID09IEhETENfTUFHSUMgJiYgdHR5ID09IG5faGRsYy0+dHR5KSB7CisJCS8qIHF1ZXVlIGN1cnJlbnQgcHJvY2VzcyBpbnRvIGFueSB3YWl0IHF1ZXVlIHRoYXQgKi8KKwkJLyogbWF5IGF3YWtlbiBpbiB0aGUgZnV0dXJlIChyZWFkIGFuZCB3cml0ZSkgKi8KKworCQlwb2xsX3dhaXQoZmlscCwgJnR0eS0+cmVhZF93YWl0LCB3YWl0KTsKKwkJcG9sbF93YWl0KGZpbHAsICZ0dHktPndyaXRlX3dhaXQsIHdhaXQpOworCisJCS8qIHNldCBiaXRzIGZvciBvcGVyYXRpb25zIHRoYXQgd29uJ3QgYmxvY2sgKi8KKwkJaWYobl9oZGxjLT5yeF9idWZfbGlzdC5oZWFkKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwkvKiByZWFkYWJsZSAqLworCQlpZiAodGVzdF9iaXQoVFRZX09USEVSX0NMT1NFRCwgJnR0eS0+ZmxhZ3MpKQorCQkJbWFzayB8PSBQT0xMSFVQOworCQlpZih0dHlfaHVuZ191cF9wKGZpbHApKQorCQkJbWFzayB8PSBQT0xMSFVQOworCQlpZihuX2hkbGMtPnR4X2ZyZWVfYnVmX2xpc3QuaGVhZCkKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CS8qIHdyaXRhYmxlICovCisJfQorCXJldHVybiBtYXNrOworfQkvKiBlbmQgb2Ygbl9oZGxjX3R0eV9wb2xsKCkgKi8KKworLyoqCisgKiBuX2hkbGNfYWxsb2MgLSBhbGxvY2F0ZSBhbiBuX2hkbGMgaW5zdGFuY2UgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBuZXdseSBjcmVhdGVkIHN0cnVjdHVyZSBpZiBzdWNjZXNzLCBvdGhlcndpc2UgJU5VTEwKKyAqLworc3RhdGljIHN0cnVjdCBuX2hkbGMgKm5faGRsY19hbGxvYyh2b2lkKQoreworCXN0cnVjdCBuX2hkbGNfYnVmICpidWY7CisJaW50IGk7CisJc3RydWN0IG5faGRsYyAqbl9oZGxjID0ga21hbGxvYyhzaXplb2YoKm5faGRsYyksIEdGUF9LRVJORUwpOworCisJaWYgKCFuX2hkbGMpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KG5faGRsYywgMCwgc2l6ZW9mKCpuX2hkbGMpKTsKKworCW5faGRsY19idWZfbGlzdF9pbml0KCZuX2hkbGMtPnJ4X2ZyZWVfYnVmX2xpc3QpOworCW5faGRsY19idWZfbGlzdF9pbml0KCZuX2hkbGMtPnR4X2ZyZWVfYnVmX2xpc3QpOworCW5faGRsY19idWZfbGlzdF9pbml0KCZuX2hkbGMtPnJ4X2J1Zl9saXN0KTsKKwluX2hkbGNfYnVmX2xpc3RfaW5pdCgmbl9oZGxjLT50eF9idWZfbGlzdCk7CisJCisJLyogYWxsb2NhdGUgZnJlZSByeCBidWZmZXIgbGlzdCAqLworCWZvcihpPTA7aTxERUZBVUxUX1JYX0JVRl9DT1VOVDtpKyspIHsKKwkJYnVmID0ga21hbGxvYyhOX0hETENfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoYnVmKQorCQkJbl9oZGxjX2J1Zl9wdXQoJm5faGRsYy0+cnhfZnJlZV9idWZfbGlzdCxidWYpOworCQllbHNlIGlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQkJcHJpbnRrKCIlcyglZCluX2hkbGNfYWxsb2MoKSwga2FsbG9jKCkgZmFpbGVkIGZvciByeCBidWZmZXIgJWRcbiIsX19GSUxFX18sX19MSU5FX18sIGkpOworCX0KKwkKKwkvKiBhbGxvY2F0ZSBmcmVlIHR4IGJ1ZmZlciBsaXN0ICovCisJZm9yKGk9MDtpPERFRkFVTFRfVFhfQlVGX0NPVU5UO2krKykgeworCQlidWYgPSBrbWFsbG9jKE5fSERMQ19CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYpCisJCQluX2hkbGNfYnVmX3B1dCgmbl9oZGxjLT50eF9mcmVlX2J1Zl9saXN0LGJ1Zik7CisJCWVsc2UgaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCQlwcmludGsoIiVzKCVkKW5faGRsY19hbGxvYygpLCBrYWxsb2MoKSBmYWlsZWQgZm9yIHR4IGJ1ZmZlciAlZFxuIixfX0ZJTEVfXyxfX0xJTkVfXywgaSk7CisJfQorCQorCS8qIEluaXRpYWxpemUgdGhlIGNvbnRyb2wgYmxvY2sgKi8KKwluX2hkbGMtPm1hZ2ljICA9IEhETENfTUFHSUM7CisJbl9oZGxjLT5mbGFncyAgPSAwOworCQorCXJldHVybiBuX2hkbGM7CisJCit9CS8qIGVuZCBvZiBuX2hkbGNfYWxsb2MoKSAqLworCisvKioKKyAqIG5faGRsY19idWZfbGlzdF9pbml0IC0gaW5pdGlhbGl6ZSBzcGVjaWZpZWQgSERMQyBidWZmZXIgbGlzdAorICogQGxpc3QgLSBwb2ludGVyIHRvIGJ1ZmZlciBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIG5faGRsY19idWZfbGlzdF9pbml0KHN0cnVjdCBuX2hkbGNfYnVmX2xpc3QgKmxpc3QpCit7CisJbWVtc2V0KGxpc3QsIDAsIHNpemVvZigqbGlzdCkpOworCXNwaW5fbG9ja19pbml0KCZsaXN0LT5zcGlubG9jayk7Cit9CS8qIGVuZCBvZiBuX2hkbGNfYnVmX2xpc3RfaW5pdCgpICovCisKKy8qKgorICogbl9oZGxjX2J1Zl9wdXQgLSBhZGQgc3BlY2lmaWVkIEhETEMgYnVmZmVyIHRvIHRhaWwgb2Ygc3BlY2lmaWVkIGxpc3QKKyAqIEBsaXN0IC0gcG9pbnRlciB0byBidWZmZXIgbGlzdAorICogQGJ1ZgktIHBvaW50ZXIgdG8gYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIG5faGRsY19idWZfcHV0KHN0cnVjdCBuX2hkbGNfYnVmX2xpc3QgKmxpc3QsCisJCQkgICBzdHJ1Y3Qgbl9oZGxjX2J1ZiAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3QtPnNwaW5sb2NrLGZsYWdzKTsKKwkKKwlidWYtPmxpbms9TlVMTDsKKwlpZihsaXN0LT50YWlsKQorCQlsaXN0LT50YWlsLT5saW5rID0gYnVmOworCWVsc2UKKwkJbGlzdC0+aGVhZCA9IGJ1ZjsKKwlsaXN0LT50YWlsID0gYnVmOworCShsaXN0LT5jb3VudCkrKzsKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0LT5zcGlubG9jayxmbGFncyk7CisJCit9CS8qIGVuZCBvZiBuX2hkbGNfYnVmX3B1dCgpICovCisKKy8qKgorICogbl9oZGxjX2J1Zl9nZXQgLSByZW1vdmUgYW5kIHJldHVybiBhbiBIRExDIGJ1ZmZlciBmcm9tIGxpc3QKKyAqIEBsaXN0IC0gcG9pbnRlciB0byBIRExDIGJ1ZmZlciBsaXN0CisgKiAKKyAqIFJlbW92ZSBhbmQgcmV0dXJuIGFuIEhETEMgYnVmZmVyIGZyb20gdGhlIGhlYWQgb2YgdGhlIHNwZWNpZmllZCBIRExDIGJ1ZmZlcgorICogbGlzdC4KKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIEhETEMgYnVmZmVyIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlICVOVUxMLgorICovCitzdGF0aWMgc3RydWN0IG5faGRsY19idWYqIG5faGRsY19idWZfZ2V0KHN0cnVjdCBuX2hkbGNfYnVmX2xpc3QgKmxpc3QpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgbl9oZGxjX2J1ZiAqYnVmOworCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0LT5zcGlubG9jayxmbGFncyk7CisJCisJYnVmID0gbGlzdC0+aGVhZDsKKwlpZiAoYnVmKSB7CisJCWxpc3QtPmhlYWQgPSBidWYtPmxpbms7CisJCShsaXN0LT5jb3VudCktLTsKKwl9CisJaWYgKCFsaXN0LT5oZWFkKQorCQlsaXN0LT50YWlsID0gTlVMTDsKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0LT5zcGlubG9jayxmbGFncyk7CisJcmV0dXJuIGJ1ZjsKKwkKK30JLyogZW5kIG9mIG5faGRsY19idWZfZ2V0KCkgKi8KKworc3RhdGljIGNoYXIgaGRsY19iYW5uZXJbXSBfX2luaXRkYXRhID0KKwlLRVJOX0lORk8gIkhETEMgbGluZSBkaXNjaXBsaW5lOiB2ZXJzaW9uICIgSERMQ19WRVJTSU9OCisJIiwgbWF4ZnJhbWU9JXVcbiI7CitzdGF0aWMgY2hhciBoZGxjX3JlZ2lzdGVyX29rW10gX19pbml0ZGF0YSA9CisJS0VSTl9JTkZPICJOX0hETEMgbGluZSBkaXNjaXBsaW5lIHJlZ2lzdGVyZWQuXG4iOworc3RhdGljIGNoYXIgaGRsY19yZWdpc3Rlcl9mYWlsW10gX19pbml0ZGF0YSA9CisJS0VSTl9FUlIgImVycm9yIHJlZ2lzdGVyaW5nIGxpbmUgZGlzY2lwbGluZTogJWRcbiI7CitzdGF0aWMgY2hhciBoZGxjX2luaXRfZmFpbFtdIF9faW5pdGRhdGEgPQorCUtFUk5fSU5GTyAiTl9IRExDOiBpbml0IGZhaWx1cmUgJWRcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IG5faGRsY19pbml0KHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCS8qIHJhbmdlIGNoZWNrIG1heGZyYW1lIGFyZyAqLworCWlmIChtYXhmcmFtZSA8IDQwOTYpCisJCW1heGZyYW1lID0gNDA5NjsKKwllbHNlIGlmIChtYXhmcmFtZSA+IDY1NTM1KQorCQltYXhmcmFtZSA9IDY1NTM1OworCisJcHJpbnRrKGhkbGNfYmFubmVyLCBtYXhmcmFtZSk7CisKKwlzdGF0dXMgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9IRExDLCAmbl9oZGxjX2xkaXNjKTsKKwlpZiAoIXN0YXR1cykKKwkJcHJpbnRrKGhkbGNfcmVnaXN0ZXJfb2spOworCWVsc2UKKwkJcHJpbnRrKGhkbGNfcmVnaXN0ZXJfZmFpbCwgc3RhdHVzKTsKKworCWlmIChzdGF0dXMpCisJCXByaW50ayhoZGxjX2luaXRfZmFpbCwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworCQorfQkvKiBlbmQgb2YgaW5pdF9tb2R1bGUoKSAqLworCitzdGF0aWMgY2hhciBoZGxjX3VucmVnaXN0ZXJfb2tbXSBfX2V4aXRkYXRhID0KKwlLRVJOX0lORk8gIk5fSERMQzogbGluZSBkaXNjaXBsaW5lIHVucmVnaXN0ZXJlZFxuIjsKK3N0YXRpYyBjaGFyIGhkbGNfdW5yZWdpc3Rlcl9mYWlsW10gX19leGl0ZGF0YSA9CisJS0VSTl9FUlIgIk5fSERMQzogY2FuJ3QgdW5yZWdpc3RlciBsaW5lIGRpc2NpcGxpbmUgKGVyciA9ICVkKVxuIjsKKworc3RhdGljIHZvaWQgX19leGl0IG5faGRsY19leGl0KHZvaWQpCit7CisJLyogUmVsZWFzZSB0dHkgcmVnaXN0cmF0aW9uIG9mIGxpbmUgZGlzY2lwbGluZSAqLworCWludCBzdGF0dXMgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9IRExDLCBOVUxMKTsKKworCWlmIChzdGF0dXMpCisJCXByaW50ayhoZGxjX3VucmVnaXN0ZXJfZmFpbCwgc3RhdHVzKTsKKwllbHNlCisJCXByaW50ayhoZGxjX3VucmVnaXN0ZXJfb2spOworfQorCittb2R1bGVfaW5pdChuX2hkbGNfaW5pdCk7Cittb2R1bGVfZXhpdChuX2hkbGNfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlBhdWwgRnVsZ2h1bSBwYXVsa2ZAbWljcm9nYXRlLmNvbSIpOworbW9kdWxlX3BhcmFtKGRlYnVnbGV2ZWwsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWF4ZnJhbWUsIGludCwgMCk7CitNT0RVTEVfQUxJQVNfTERJU0MoTl9IRExDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMgYi9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODMwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jCkBAIC0wLDAgKzEsMTQxNiBAQAorLyogcjM5NjQgbGluZWRpc2NpcGxpbmUgZm9yIGxpbnV4CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCBieSAKKyAqIFBoaWxpcHMgQXV0b21hdGlvbiBQcm9qZWN0cworICogS2Fzc2VsIChHZXJtYW55KQorICogaHR0cDovL3d3dy5wYXAtcGhpbGlwcy5kZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogQXV0aG9yOgorICogTC4gSGFhZworICoKKyAqICRMb2c6IG5fcjM5NjQuYyx2ICQKKyAqIFJldmlzaW9uIDEuMTAgIDIwMDEvMDMvMTggMTM6MDI6MjQgIGR3bXcyCisgKiBGaXggdGltZXIgdXNhZ2UsIHVzZSBzcGlubG9ja3MgcHJvcGVybHkuCisgKgorICogUmV2aXNpb24gMS45ICAyMDAxLzAzLzE4IDEyOjUyOjE0ICBkd213MgorICogTWVyZ2UgY2hhbmdlcyBpbiAyLjQuMgorICoKKyAqIFJldmlzaW9uIDEuOCAgMjAwMC8wMy8yMyAxNDoxNDo1NCAgZHdtdzIKKyAqIEZpeCByYWNlIGluIHNsZWVwaW5nIGluIHIzOTY0X3JlYWQoKQorICoKKyAqIFJldmlzaW9uIDEuNyAgMTk5OS8yOC8wOCAxMTo0MTo1MCAgZHdtdzIKKyAqIFBvcnQgdG8gMi4zIGtlcm5lbAorICoKKyAqIFJldmlzaW9uIDEuNiAgMTk5OC8wOS8zMCAwMDo0MDo0MCAgZHdtdzIKKyAqIEZpeGVkIGNvbXBpbGF0aW9uIG9uIDIuMC54IGtlcm5lbHMKKyAqIFVwZGF0ZWQgdG8gbmV3bHkgcmVnaXN0ZXJlZCB0dHktbGRpc2MgbnVtYmVyIDkKKyAqCisgKiBSZXZpc2lvbiAxLjUgIDE5OTgvMDkvMDQgMjE6NTc6MzYgIGR3bXcyCisgKiBTaWduYWwgaGFuZGxpbmcgYnVnIGZpeGVzLCBwb3J0IHRvIDIuMS54LgorICoKKyAqIFJldmlzaW9uIDEuNCAgMTk5OC8wNC8wMiAyMDoyNjo1OSAgbGhhYWcKKyAqIHNlbGVjdCwgYmxvY2tpbmcsIC4uLgorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5OC8wMi8xMiAxODo1ODo0MyAgcm9vdAorICogZml4ZWQgc29tZSBtZW1vcnkgbGVha3MKKyAqIGNhbGN1bGF0aW9uIG9mIGNoZWNrc3VtIGNoYXJhY3RlcnMKKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTgvMDIvMDcgMTM6MDM6MzQgIHJvb3QKKyAqIGlvY3RsIHJlYWRfdGVsZWdyYW0KKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTgvMDIvMDYgMTk6MjE6MDMgIHJvb3QKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAgIC8qIHVzZWQgaW4gbmV3IHR0eSBkcml2ZXJzICovCisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+ICAgLyogdXNlZCBpbiBuZXcgdHR5IGRyaXZlcnMgKi8KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L25fcjM5NjQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKworLy8jZGVmaW5lIERFQlVHX1FVRVVFCisKKy8qIExvZyBzdWNjZXNzZnVsIGhhbmRzaGFrZSBhbmQgcHJvdG9jb2wgb3BlcmF0aW9ucyAgKi8KKy8vI2RlZmluZSBERUJVR19QUk9UT19TCisKKy8qIExvZyBoYW5kc2hha2UgYW5kIHByb3RvY29sIGVycm9yczogKi8KKy8vI2RlZmluZSBERUJVR19QUk9UT19FCisKKy8qIExvZyBMaW5lZGlzY2lwbGluZSBvcGVyYXRpb25zIChvcGVuLCBjbG9zZSwgcmVhZCwgd3JpdGUuLi4pOiAqLworLy8jZGVmaW5lIERFQlVHX0xESVNDCisKKy8qIExvZyBtb2R1bGUgYW5kIG1lbW9yeSBvcGVyYXRpb25zIChpbml0LCBjbGVhbnVwOyBrbWFsbG9jLCBrZnJlZSk6ICovCisvLyNkZWZpbmUgREVCVUdfTU9EVUwKKworLyogTWFjcm8gaGVscGVycyBmb3IgZGVidWcgb3V0cHV0OiAqLworI2RlZmluZSBUUkFDRShmb3JtYXQsIGFyZ3MuLi4pIHByaW50aygicjM5NjQ6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmdzKTsKKworI2lmZGVmIERFQlVHX01PRFVMCisjZGVmaW5lIFRSQUNFX00oZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoInIzOTY0OiAiIGZvcm1hdCAiXG4iICwgIyMgYXJncyk7CisjZWxzZQorI2RlZmluZSBUUkFDRV9NKGZtdCwgYXJnLi4uKSAvKiovCisjZW5kaWYKKworI2lmZGVmIERFQlVHX1BST1RPX1MKKyNkZWZpbmUgVFJBQ0VfUFMoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoInIzOTY0OiAiIGZvcm1hdCAiXG4iICwgIyMgYXJncyk7CisjZWxzZQorI2RlZmluZSBUUkFDRV9QUyhmbXQsIGFyZy4uLikgLyoqLworI2VuZGlmCisKKyNpZmRlZiBERUJVR19QUk9UT19FCisjZGVmaW5lIFRSQUNFX1BFKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKCJyMzk2NDogIiBmb3JtYXQgIlxuIiAsICMjIGFyZ3MpOworI2Vsc2UKKyNkZWZpbmUgVFJBQ0VfUEUoZm10LCBhcmcuLi4pIC8qKi8KKyNlbmRpZgorCisjaWZkZWYgREVCVUdfTERJU0MKKyNkZWZpbmUgVFJBQ0VfTChmb3JtYXQsIGFyZ3MuLi4pIHByaW50aygicjM5NjQ6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmdzKTsKKyNlbHNlCisjZGVmaW5lIFRSQUNFX0woZm10LCBhcmcuLi4pIC8qKi8KKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUVVFVUUKKyNkZWZpbmUgVFJBQ0VfUShmb3JtYXQsIGFyZ3MuLi4pIHByaW50aygicjM5NjQ6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmdzKTsKKyNlbHNlCisjZGVmaW5lIFRSQUNFX1EoZm10LCBhcmcuLi4pIC8qKi8KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhZGRfdHhfcXVldWUoc3RydWN0IHIzOTY0X2luZm8gKiwgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqKTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9mcm9tX3R4X3F1ZXVlKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgaW50IGVycm9yX2NvZGUpOworc3RhdGljIHZvaWQgcHV0X2NoYXIoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCB1bnNpZ25lZCBjaGFyIGNoKTsKK3N0YXRpYyB2b2lkIHRyaWdnZXJfdHJhbnNtaXQoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvKTsKK3N0YXRpYyB2b2lkIHJldHJ5X3RyYW5zbWl0KHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbyk7CitzdGF0aWMgdm9pZCB0cmFuc21pdF9ibG9jayhzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8pOworc3RhdGljIHZvaWQgcmVjZWl2ZV9jaGFyKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgY29uc3QgdW5zaWduZWQgY2hhciBjKTsKK3N0YXRpYyB2b2lkIHJlY2VpdmVfZXJyb3Ioc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBjb25zdCBjaGFyIGZsYWcpOworc3RhdGljIHZvaWQgb25fdGltZW91dCh1bnNpZ25lZCBsb25nIHByaXYpOworc3RhdGljIGludCBlbmFibGVfc2lnbmFscyhzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIHBpZF90IHBpZCwgaW50IGFyZyk7CitzdGF0aWMgaW50IHJlYWRfdGVsZWdyYW0oc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBwaWRfdCBwaWQsIHVuc2lnbmVkIGNoYXIgX191c2VyICpidWYpOworc3RhdGljIHZvaWQgYWRkX21zZyhzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQsIGludCBtc2dfaWQsIGludCBhcmcsCisgICAgICAgICAgICAgaW50IGVycm9yX2NvZGUsIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBCbG9jayk7CitzdGF0aWMgc3RydWN0IHIzOTY0X21lc3NhZ2UqIHJlbW92ZV9tc2coc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCAKKyAgICAgICAgICAgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQpOworc3RhdGljIHZvaWQgcmVtb3ZlX2NsaWVudF9ibG9jayhzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIAorICAgICAgICAgICAgICAgIHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudCk7CisKK3N0YXRpYyBpbnQgIHIzOTY0X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCByMzk2NF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBzc2l6ZV90IHIzOTY0X3JlYWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbnIpOworc3RhdGljIHNzaXplX3QgcjM5NjRfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmLCBzaXplX3QgbnIpOworc3RhdGljIGludCByMzk2NF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZCByMzk2NF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCk7CitzdGF0aWMgdW5zaWduZWQgaW50IHIzOTY0X3BvbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKwkJICAgICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICAqd2FpdCk7CitzdGF0aWMgdm9pZCByMzk2NF9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZwLCBpbnQgY291bnQpOworc3RhdGljIGludCAgcjM5NjRfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworCitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYyB0dHlfbGRpc2NfTl9SMzk2NCA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm1hZ2ljCT0gVFRZX0xESVNDX01BR0lDLCAKKwkubmFtZQk9ICJSMzk2NCIsCisJLm9wZW4JPSByMzk2NF9vcGVuLAorCS5jbG9zZQk9IHIzOTY0X2Nsb3NlLAorCS5yZWFkCT0gcjM5NjRfcmVhZCwKKwkud3JpdGUJPSByMzk2NF93cml0ZSwKKwkuaW9jdGwJPSByMzk2NF9pb2N0bCwKKwkuc2V0X3Rlcm1pb3MgPSByMzk2NF9zZXRfdGVybWlvcywKKwkucG9sbAk9IHIzOTY0X3BvbGwsICAgICAgICAgICAgCisJLnJlY2VpdmVfYnVmID0gcjM5NjRfcmVjZWl2ZV9idWYsCisJLnJlY2VpdmVfcm9vbSA9IHIzOTY0X3JlY2VpdmVfcm9vbSwKK307CisKKworCitzdGF0aWMgdm9pZCBkdW1wX2Jsb2NrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsb2NrLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworICAgdW5zaWduZWQgaW50IGksajsKKyAgIGNoYXIgbGluZWJ1ZlsxNiozKzFdOworICAgCisgICBmb3IoaT0wO2k8bGVuZ3RoO2krPTE2KQorICAgeworICAgICAgZm9yKGo9MDsoajwxNikgJiYgKGoraTxsZW5ndGgpO2orKykKKyAgICAgIHsKKyAgICAgICAgIHNwcmludGYobGluZWJ1ZiszKmosIiUwMnggIixibG9ja1tpK2pdKTsKKyAgICAgIH0KKyAgICAgIGxpbmVidWZbMypqXT0nXDAnOworICAgICAgVFJBQ0VfUFMoIiVzIixsaW5lYnVmKTsKKyAgIH0KK30KKworICAgICAgICAgCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERyaXZlciBpbml0aWFsaXNhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1vZHVsZSBzdXBwb3J0IHJvdXRpbmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgX19leGl0IHIzOTY0X2V4aXQodm9pZCkKK3sKKyAgIGludCBzdGF0dXM7CisgICAKKyAgIFRSQUNFX00gKCJjbGVhbnVwX21vZHVsZSgpIik7CisKKyAgIHN0YXR1cz10dHlfcmVnaXN0ZXJfbGRpc2MoTl9SMzk2NCwgTlVMTCk7CisgICAKKyAgIGlmKHN0YXR1cyE9MCkKKyAgIHsKKyAgICAgIHByaW50ayhLRVJOX0VSUiAicjM5NjQ6IGVycm9yIHVucmVnaXN0ZXJpbmcgbGluZWRpc2NpcGxpbmU6ICVkXG4iLCBzdGF0dXMpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgVFJBQ0VfTCgibGluZWRpc2NpcGxpbmUgc3VjY2Vzc2Z1bGx5IHVucmVnaXN0ZXJlZCIpOworICAgfQorICAgCit9CisKK3N0YXRpYyBpbnQgX19pbml0IHIzOTY0X2luaXQodm9pZCkKK3sKKyAgIGludCBzdGF0dXM7CisgICAKKyAgIHByaW50ayAoInIzOTY0OiBQaGlsaXBzIHIzOTY0IERyaXZlciAkUmV2aXNpb246IDEuMTAgJFxuIik7CisKKyAgIC8qCisgICAgKiBSZWdpc3RlciB0aGUgdHR5IGxpbmUgZGlzY2lwbGluZQorICAgICovCisgICAKKyAgIHN0YXR1cyA9IHR0eV9yZWdpc3Rlcl9sZGlzYyAoTl9SMzk2NCwgJnR0eV9sZGlzY19OX1IzOTY0KTsKKyAgIGlmIChzdGF0dXMgPT0gMCkKKyAgICAgeworICAgICAgIFRSQUNFX0woImxpbmUgZGlzY2lwbGluZSAlZCByZWdpc3RlcmVkIiwgTl9SMzk2NCk7CisgICAgICAgVFJBQ0VfTCgiZmxhZ3M9JXggbnVtPSV4IiwgdHR5X2xkaXNjX05fUjM5NjQuZmxhZ3MsIAorICAgICAgICAgICAgICAgdHR5X2xkaXNjX05fUjM5NjQubnVtKTsKKyAgICAgICBUUkFDRV9MKCJvcGVuPSV4IiwgKGludCl0dHlfbGRpc2NfTl9SMzk2NC5vcGVuKTsKKyAgICAgICBUUkFDRV9MKCJ0dHlfbGRpc2NfTl9SMzk2NCA9ICV4IiwgKGludCkmdHR5X2xkaXNjX05fUjM5NjQpOworICAgICB9CisgICBlbHNlCisgICAgIHsKKyAgICAgICBwcmludGsgKEtFUk5fRVJSICJyMzk2NDogZXJyb3IgcmVnaXN0ZXJpbmcgbGluZSBkaXNjaXBsaW5lOiAlZFxuIiwgc3RhdHVzKTsKKyAgICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKworbW9kdWxlX2luaXQocjM5NjRfaW5pdCk7Cittb2R1bGVfZXhpdChyMzk2NF9leGl0KTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gcm91dGluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBhZGRfdHhfcXVldWUoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICpwSGVhZGVyKQoreworICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgIAorICAgc3Bpbl9sb2NrX2lycXNhdmUoJnBJbmZvLT5sb2NrLCBmbGFncyk7CisKKyAgIHBIZWFkZXItPm5leHQgPSBOVUxMOworCisgICBpZihwSW5mby0+dHhfbGFzdCA9PSBOVUxMKQorICAgeworICAgICAgcEluZm8tPnR4X2ZpcnN0ID0gcEluZm8tPnR4X2xhc3QgPSBwSGVhZGVyOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcEluZm8tPnR4X2xhc3QtPm5leHQgPSBwSGVhZGVyOworICAgICAgcEluZm8tPnR4X2xhc3QgPSBwSGVhZGVyOworICAgfQorICAgCisgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworCisgICBUUkFDRV9RKCJhZGRfdHhfcXVldWUgJXgsIGxlbmd0aCAlZCwgdHhfZmlyc3QgPSAleCIsIAorICAgICAgICAgIChpbnQpcEhlYWRlciwgcEhlYWRlci0+bGVuZ3RoLCAoaW50KXBJbmZvLT50eF9maXJzdCApOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfZnJvbV90eF9xdWV1ZShzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIGludCBlcnJvcl9jb2RlKQoreworICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqcEhlYWRlcjsKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgREVCVUdfUVVFVUUKKyAgIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBEdW1wOworI2VuZGlmCisgICAKKyAgIHBIZWFkZXIgPSBwSW5mby0+dHhfZmlyc3Q7CisKKyAgIGlmKHBIZWFkZXI9PU5VTEwpCisgICAgICByZXR1cm47CisKKyNpZmRlZiBERUJVR19RVUVVRQorICAgcHJpbnRrKCJyMzk2NDogcmVtb3ZlX2Zyb21fdHhfcXVldWU6ICV4LCBsZW5ndGggJWQgLSAiLAorICAgICAgICAgIChpbnQpcEhlYWRlciwgKGludClwSGVhZGVyLT5sZW5ndGggKTsKKyAgIGZvcihwRHVtcD1wSGVhZGVyO3BEdW1wO3BEdW1wPXBEdW1wLT5uZXh0KQorCSBwcmludGsoIiV4ICIsIChpbnQpcER1bXApOworICAgcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKworICAgaWYocEhlYWRlci0+b3duZXIpCisgICB7CisgICAgICBpZihlcnJvcl9jb2RlKQorICAgICAgeworICAgICAgICAgIGFkZF9tc2cocEhlYWRlci0+b3duZXIsIFIzOTY0X01TR19BQ0ssIDAsIAorICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSwgTlVMTCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAgYWRkX21zZyhwSGVhZGVyLT5vd25lciwgUjM5NjRfTVNHX0FDSywgcEhlYWRlci0+bGVuZ3RoLCAKKyAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUsIE5VTEwpOworICAgICAgfQorICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlICgmcEluZm8tPnJlYWRfd2FpdCk7CisgICB9CisKKyAgIHNwaW5fbG9ja19pcnFzYXZlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworCisgICBwSW5mby0+dHhfZmlyc3QgPSBwSGVhZGVyLT5uZXh0OworICAgaWYocEluZm8tPnR4X2ZpcnN0PT1OVUxMKQorICAgeworICAgICAgcEluZm8tPnR4X2xhc3QgPSBOVUxMOworICAgfQorCisgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworCisgICBrZnJlZShwSGVhZGVyKTsKKyAgIFRSQUNFX00oInJlbW92ZV9mcm9tX3R4X3F1ZXVlIC0ga2ZyZWUgJXgiLChpbnQpcEhlYWRlcik7CisKKyAgIFRSQUNFX1EoInJlbW92ZV9mcm9tX3R4X3F1ZXVlOiB0eF9maXJzdCA9ICV4LCB0eF9sYXN0ID0gJXgiLAorICAgICAgICAgIChpbnQpcEluZm8tPnR4X2ZpcnN0LCAoaW50KXBJbmZvLT50eF9sYXN0ICk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9yeF9xdWV1ZShzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBIZWFkZXIpCit7CisgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgCisgICBzcGluX2xvY2tfaXJxc2F2ZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAgcEhlYWRlci0+bmV4dCA9IE5VTEw7CisKKyAgIGlmKHBJbmZvLT5yeF9sYXN0ID09IE5VTEwpCisgICB7CisgICAgICBwSW5mby0+cnhfZmlyc3QgPSBwSW5mby0+cnhfbGFzdCA9IHBIZWFkZXI7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwSW5mby0+cnhfbGFzdC0+bmV4dCA9IHBIZWFkZXI7CisgICAgICBwSW5mby0+cnhfbGFzdCA9IHBIZWFkZXI7CisgICB9CisgICBwSW5mby0+YmxvY2tzX2luX3J4X3F1ZXVlKys7CisgICAKKyAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBJbmZvLT5sb2NrLCBmbGFncyk7CisKKyAgIFRSQUNFX1EoImFkZF9yeF9xdWV1ZTogJXgsIGxlbmd0aCA9ICVkLCByeF9maXJzdCA9ICV4LCBjb3VudCA9ICVkIiwKKyAgICAgICAgICAoaW50KXBIZWFkZXIsIHBIZWFkZXItPmxlbmd0aCwKKyAgICAgICAgICAoaW50KXBJbmZvLT5yeF9maXJzdCwgcEluZm8tPmJsb2Nrc19pbl9yeF9xdWV1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9mcm9tX3J4X3F1ZXVlKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywKKyAgICAgICAgICAgICAgICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqcEhlYWRlcikKK3sKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICpwRmluZDsKKyAgIAorICAgaWYocEhlYWRlcj09TlVMTCkKKyAgICAgIHJldHVybjsKKworICAgVFJBQ0VfUSgicmVtb3ZlX2Zyb21fcnhfcXVldWU6IHJ4X2ZpcnN0ID0gJXgsIHJ4X2xhc3QgPSAleCwgY291bnQgPSAlZCIsCisgICAgICAgICAgKGludClwSW5mby0+cnhfZmlyc3QsIChpbnQpcEluZm8tPnJ4X2xhc3QsIHBJbmZvLT5ibG9ja3NfaW5fcnhfcXVldWUgKTsKKyAgIFRSQUNFX1EoInJlbW92ZV9mcm9tX3J4X3F1ZXVlOiAleCwgbGVuZ3RoICVkIiwKKyAgICAgICAgICAoaW50KXBIZWFkZXIsIChpbnQpcEhlYWRlci0+bGVuZ3RoICk7CisKKyAgIHNwaW5fbG9ja19pcnFzYXZlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworCisgICBpZihwSW5mby0+cnhfZmlyc3QgPT0gcEhlYWRlcikKKyAgIHsKKyAgICAgIC8qIFJlbW92ZSB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIGxpbmtlZCBsaXN0OiAqLworICAgICAgcEluZm8tPnJ4X2ZpcnN0ID0gcEhlYWRlci0+bmV4dDsKKyAgICAgIAorICAgICAgaWYocEluZm8tPnJ4X2ZpcnN0PT1OVUxMKQorICAgICAgeworICAgICAgICAgcEluZm8tPnJ4X2xhc3QgPSBOVUxMOworICAgICAgfQorICAgICAgcEluZm8tPmJsb2Nrc19pbl9yeF9xdWV1ZS0tOworICAgfQorICAgZWxzZSAKKyAgIHsKKyAgICAgIC8qIEZpbmQgYmxvY2sgdG8gcmVtb3ZlOiAqLworICAgICAgZm9yKHBGaW5kPXBJbmZvLT5yeF9maXJzdDsgcEZpbmQ7IHBGaW5kPXBGaW5kLT5uZXh0KQorICAgICAgeworICAgICAgICAgaWYocEZpbmQtPm5leHQgPT0gcEhlYWRlcikgCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBHb3QgaXQuICovCisgICAgICAgICAgICBwRmluZC0+bmV4dCA9IHBIZWFkZXItPm5leHQ7CisgICAgICAgICAgICBwSW5mby0+YmxvY2tzX2luX3J4X3F1ZXVlLS07CisgICAgICAgICAgICBpZihwRmluZC0+bmV4dD09TlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIE9oLCByZW1vdmVkIHRoZSBsYXN0IG9uZSEgKi8KKyAgICAgICAgICAgICAgIHBJbmZvLT5yeF9sYXN0ID0gcEZpbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAga2ZyZWUocEhlYWRlcik7CisgICBUUkFDRV9NKCJyZW1vdmVfZnJvbV9yeF9xdWV1ZSAtIGtmcmVlICV4IiwoaW50KXBIZWFkZXIpOworCisgICBUUkFDRV9RKCJyZW1vdmVfZnJvbV9yeF9xdWV1ZTogcnhfZmlyc3QgPSAleCwgcnhfbGFzdCA9ICV4LCBjb3VudCA9ICVkIiwKKyAgICAgICAgICAoaW50KXBJbmZvLT5yeF9maXJzdCwgKGludClwSW5mby0+cnhfbGFzdCwgcEluZm8tPmJsb2Nrc19pbl9yeF9xdWV1ZSApOworfQorCitzdGF0aWMgdm9pZCBwdXRfY2hhcihzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIHVuc2lnbmVkIGNoYXIgY2gpCit7CisgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcEluZm8tPnR0eTsKKworICAgaWYodHR5PT1OVUxMKQorICAgICAgcmV0dXJuOworCisgICBpZih0dHktPmRyaXZlci0+cHV0X2NoYXIpCisgICB7CisgICAgICB0dHktPmRyaXZlci0+cHV0X2NoYXIodHR5LCBjaCk7CisgICB9CisgICBwSW5mby0+YmNjIF49IGNoOworfQorCitzdGF0aWMgdm9pZCBmbHVzaChzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8pCit7CisgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcEluZm8tPnR0eTsKKworICAgaWYodHR5PT1OVUxMKQorICAgICAgcmV0dXJuOworCisgICBpZih0dHktPmRyaXZlci0+Zmx1c2hfY2hhcnMpCisgICB7CisgICAgICB0dHktPmRyaXZlci0+Zmx1c2hfY2hhcnModHR5KTsKKyAgIH0KK30KKworc3RhdGljIHZvaWQgdHJpZ2dlcl90cmFuc21pdChzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8pCit7CisgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgCisKKyAgIHNwaW5fbG9ja19pcnFzYXZlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworCisgICBpZigocEluZm8tPnN0YXRlID09IFIzOTY0X0lETEUpICYmIChwSW5mby0+dHhfZmlyc3QhPU5VTEwpKQorICAgeworICAgICAgcEluZm8tPnN0YXRlID0gUjM5NjRfVFhfUkVRVUVTVDsKKyAgICAgIHBJbmZvLT5uUmV0cnk9MDsKKyAgICAgIHBJbmZvLT5mbGFncyAmPSB+UjM5NjRfRVJST1I7CisgICAgICBtb2RfdGltZXIoJnBJbmZvLT50bXIsIGppZmZpZXMgKyBSMzk2NF9UT19RVlopOworCisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworCisgICAgICBUUkFDRV9QUygidHJpZ2dlcl90cmFuc21pdCAtIHNlbnQgU1RYIik7CisKKyAgICAgIHB1dF9jaGFyKHBJbmZvLCBTVFgpOworICAgICAgZmx1c2gocEluZm8pOworCisgICAgICBwSW5mby0+YmNjID0gMDsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBJbmZvLT5sb2NrLCBmbGFncyk7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJldHJ5X3RyYW5zbWl0KHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbykKK3sKKyAgIGlmKHBJbmZvLT5uUmV0cnk8UjM5NjRfTUFYX1JFVFJJRVMpCisgICB7CisgICAgICBUUkFDRV9QRSgidHJhbnNtaXNzaW9uIGZhaWxlZC4gUmV0cnkgIyVkIiwgCisgICAgICAgICAgICAgcEluZm8tPm5SZXRyeSk7CisgICAgICBwSW5mby0+YmNjID0gMDsKKyAgICAgIHB1dF9jaGFyKHBJbmZvLCBTVFgpOworICAgICAgZmx1c2gocEluZm8pOworICAgICAgcEluZm8tPnN0YXRlID0gUjM5NjRfVFhfUkVRVUVTVDsKKyAgICAgIHBJbmZvLT5uUmV0cnkrKzsKKyAgICAgIG1vZF90aW1lcigmcEluZm8tPnRtciwgamlmZmllcyArIFIzOTY0X1RPX1FWWik7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBUUkFDRV9QRSgidHJhbnNtaXNzaW9uIGZhaWxlZCBhZnRlciAlZCByZXRyaWVzIiwgCisgICAgICAgICAgICAgUjM5NjRfTUFYX1JFVFJJRVMpOworCisgICAgICByZW1vdmVfZnJvbV90eF9xdWV1ZShwSW5mbywgUjM5NjRfVFhfRkFJTCk7CisgICAgICAKKyAgICAgIHB1dF9jaGFyKHBJbmZvLCBOQUspOworICAgICAgZmx1c2gocEluZm8pOworICAgICAgcEluZm8tPnN0YXRlID0gUjM5NjRfSURMRTsKKworICAgICAgdHJpZ2dlcl90cmFuc21pdChwSW5mbyk7CisgICB9Cit9CisKKworc3RhdGljIHZvaWQgdHJhbnNtaXRfYmxvY2soc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvKQoreworICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBJbmZvLT50dHk7CisgICBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICpwQmxvY2sgPSBwSW5mby0+dHhfZmlyc3Q7CisgICBpbnQgcm9vbT0wOworCisgICBpZigodHR5PT1OVUxMKSB8fCAocEJsb2NrPT1OVUxMKSkKKyAgIHsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYodHR5LT5kcml2ZXItPndyaXRlX3Jvb20pCisgICAgICByb29tPXR0eS0+ZHJpdmVyLT53cml0ZV9yb29tKHR0eSk7CisKKyAgIFRSQUNFX1BTKCJ0cmFuc21pdF9ibG9jayAleCwgcm9vbSAlZCwgbGVuZ3RoICVkIiwgCisgICAgICAgICAgKGludClwQmxvY2ssIHJvb20sIHBCbG9jay0+bGVuZ3RoKTsKKyAgIAorICAgd2hpbGUocEluZm8tPnR4X3Bvc2l0aW9uIDwgcEJsb2NrLT5sZW5ndGgpCisgICB7CisgICAgICBpZihyb29tPDIpCisgICAgICAgICBicmVhazsKKyAKKyAgICAgIGlmKHBCbG9jay0+ZGF0YVtwSW5mby0+dHhfcG9zaXRpb25dPT1ETEUpCisgICAgICB7CisgICAgICAgICAvKiBzZW5kIGFkZGl0aW9uYWwgRExFIGNoYXI6ICovCisgICAgICAgICBwdXRfY2hhcihwSW5mbywgRExFKTsKKyAgICAgIH0KKyAgICAgIHB1dF9jaGFyKHBJbmZvLCBwQmxvY2stPmRhdGFbcEluZm8tPnR4X3Bvc2l0aW9uKytdKTsKKyAgICAgIAorICAgICAgcm9vbS0tOworICAgfQorCisgICBpZigocEluZm8tPnR4X3Bvc2l0aW9uID09IHBCbG9jay0+bGVuZ3RoKSAmJiAocm9vbT49MykpCisgICB7CisgICAgICBwdXRfY2hhcihwSW5mbywgRExFKTsKKyAgICAgIHB1dF9jaGFyKHBJbmZvLCBFVFgpOworICAgICAgaWYocEluZm8tPmZsYWdzICYgUjM5NjRfQkNDKQorICAgICAgeworICAgICAgICAgcHV0X2NoYXIocEluZm8sIHBJbmZvLT5iY2MpOworICAgICAgfQorICAgICAgcEluZm8tPnN0YXRlID0gUjM5NjRfV0FJVF9GT1JfVFhfQUNLOworICAgICAgbW9kX3RpbWVyKCZwSW5mby0+dG1yLCBqaWZmaWVzICsgUjM5NjRfVE9fUVZaKTsKKyAgIH0KKyAgIGZsdXNoKHBJbmZvKTsKK30KKworc3RhdGljIHZvaWQgb25fcmVjZWl2ZV9ibG9jayhzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8pCit7CisgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50OworICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqcEJsb2NrOworICAgCisgICBsZW5ndGg9cEluZm8tPnJ4X3Bvc2l0aW9uOworCisgICAvKiBjb21wYXJlIGJ5dGUgY2hlY2tzdW0gY2hhcmFjdGVyczogKi8KKyAgIGlmKHBJbmZvLT5mbGFncyAmIFIzOTY0X0JDQykKKyAgIHsKKyAgICAgIGlmKHBJbmZvLT5iY2MhPXBJbmZvLT5sYXN0X3J4KQorICAgICAgeworICAgICAgICAgVFJBQ0VfUEUoImNoZWNrc3VtIGVycm9yIC0gZ290ICV4IGJ1dCBleHBlY3RlZCAleCIsCisgICAgICAgICAgICAgICAgcEluZm8tPmxhc3RfcngsIHBJbmZvLT5iY2MpOworICAgICAgICAgcEluZm8tPmZsYWdzIHw9IFIzOTY0X0NIRUNLU1VNOworICAgICAgfQorICAgfQorCisgICAvKiBjaGVjayBmb3IgZXJyb3JzIChwYXJpdHksIG92ZXJydW4sLi4uKTogKi8KKyAgIGlmKHBJbmZvLT5mbGFncyAmIFIzOTY0X0VSUk9SKQorICAgeworICAgICAgVFJBQ0VfUEUoIm9uX3JlY2VpdmVfYmxvY2sgLSB0cmFuc21pc3Npb24gZmFpbGVkIGVycm9yICV4IiwKKyAgICAgICAgICAgICBwSW5mby0+ZmxhZ3MgJiBSMzk2NF9FUlJPUik7CisgICAgICAKKyAgICAgIHB1dF9jaGFyKHBJbmZvLCBOQUspOworICAgICAgZmx1c2gocEluZm8pOworICAgICAgaWYocEluZm8tPm5SZXRyeTxSMzk2NF9NQVhfUkVUUklFUykKKyAgICAgIHsKKyAgICAgICAgIHBJbmZvLT5zdGF0ZT1SMzk2NF9XQUlUX0ZPUl9SWF9SRVBFQVQ7CisgICAgICAgICBwSW5mby0+blJldHJ5Kys7CisJIG1vZF90aW1lcigmcEluZm8tPnRtciwgamlmZmllcyArIFIzOTY0X1RPX1JYX1BBTklDKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFRSQUNFX1BFKCJvbl9yZWNlaXZlX2Jsb2NrIC0gZmFpbGVkIGFmdGVyIG1heCByZXRyaWVzIik7CisgICAgICAgICBwSW5mby0+c3RhdGU9UjM5NjRfSURMRTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgCisgICAvKiByZWNlaXZlZCBibG9jazsgc3VibWl0IERMRTogKi8KKyAgIHB1dF9jaGFyKHBJbmZvLCBETEUpOworICAgZmx1c2gocEluZm8pOworICAgZGVsX3RpbWVyX3N5bmMoJnBJbmZvLT50bXIpOworICAgVFJBQ0VfUFMoIiByeCBzdWNjZXNzOiBnb3QgJWQgY2hhcnMiLCBsZW5ndGgpOworCisgICAvKiBwcmVwYXJlIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXI6ICovCisgICBwQmxvY2sgPSBrbWFsbG9jKGxlbmd0aCtzaXplb2Yoc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciksIEdGUF9LRVJORUwpOworICAgVFJBQ0VfTSgib25fcmVjZWl2ZV9ibG9jayAtIGttYWxsb2MgJXgiLChpbnQpcEJsb2NrKTsKKworICAgaWYocEJsb2NrPT1OVUxMKQorICAgICAgcmV0dXJuOworCisgICBwQmxvY2stPmxlbmd0aCA9IGxlbmd0aDsKKyAgIHBCbG9jay0+ZGF0YSAgID0gKCh1bnNpZ25lZCBjaGFyKilwQmxvY2spK3NpemVvZihzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyKTsKKyAgIHBCbG9jay0+bG9ja3MgID0gMDsKKyAgIHBCbG9jay0+bmV4dCAgID0gTlVMTDsKKyAgIHBCbG9jay0+b3duZXIgID0gTlVMTDsKKworICAgbWVtY3B5KHBCbG9jay0+ZGF0YSwgcEluZm8tPnJ4X2J1ZiwgbGVuZ3RoKTsKKworICAgLyogcXVldWUgYmxvY2sgaW50byByeF9xdWV1ZTogKi8KKyAgIGFkZF9yeF9xdWV1ZShwSW5mbywgcEJsb2NrKTsKKworICAgLyogbm90aWZ5IGF0dGFjaGVkIGNsaWVudCBwcm9jZXNzZXM6ICovCisgICBmb3IocENsaWVudD1wSW5mby0+Zmlyc3RDbGllbnQ7IHBDbGllbnQ7IHBDbGllbnQ9cENsaWVudC0+bmV4dCkKKyAgIHsKKyAgICAgIGlmKHBDbGllbnQtPnNpZ19mbGFncyAmIFIzOTY0X1NJR19EQVRBKQorICAgICAgeworICAgICAgICAgYWRkX21zZyhwQ2xpZW50LCBSMzk2NF9NU0dfREFUQSwgbGVuZ3RoLCBSMzk2NF9PSywgcEJsb2NrKTsKKyAgICAgIH0KKyAgIH0KKyAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSAoJnBJbmZvLT5yZWFkX3dhaXQpOworICAgCisgICBwSW5mby0+c3RhdGUgPSBSMzk2NF9JRExFOworCisgICB0cmlnZ2VyX3RyYW5zbWl0KHBJbmZvKTsKK30KKworCitzdGF0aWMgdm9pZCByZWNlaXZlX2NoYXIoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBjb25zdCB1bnNpZ25lZCBjaGFyIGMpCit7CisgICBzd2l0Y2gocEluZm8tPnN0YXRlKQorICAgeworICAgICAgY2FzZSBSMzk2NF9UWF9SRVFVRVNUOgorICAgICAgICAgaWYoYz09RExFKQorICAgICAgICAgeworICAgICAgICAgICAgVFJBQ0VfUFMoIlRYX1JFUVVFU1QgLSBnb3QgRExFIik7CisKKyAgICAgICAgICAgIHBJbmZvLT5zdGF0ZSA9IFIzOTY0X1RSQU5TTUlUVElORzsKKyAgICAgICAgICAgIHBJbmZvLT50eF9wb3NpdGlvbiA9IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHRyYW5zbWl0X2Jsb2NrKHBJbmZvKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYoYz09U1RYKQorICAgICAgICAgeworICAgICAgICAgICAgaWYocEluZm8tPm5SZXRyeT09MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRSQUNFX1BFKCJUWF9SRVFVRVNUIC0gaW5pdCBjb25mbGljdCIpOworICAgICAgICAgICAgICAgaWYocEluZm8tPnByaW9yaXR5ID09IFIzOTY0X1NMQVZFKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZ290byBzdGFydF9yZWNlaXZpbmc7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IAorICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRSQUNFX1BFKCJUWF9SRVFVRVNUIC0gc2Vjb25kYXJ5IGluaXQgY29uZmxpY3QhPyIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgU3dpdGNoaW5nIHRvIFNMQVZFIG1vZGUgZm9yIG5leHQgcnguIik7CisgICAgICAgICAgICAgICBnb3RvIHN0YXJ0X3JlY2VpdmluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFRSQUNFX1BFKCJUWF9SRVFVRVNUIC0gY2hhciAhPSBETEU6ICV4IiwgYyk7CisgICAgICAgICAgICByZXRyeV90cmFuc21pdChwSW5mbyk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUjM5NjRfVFJBTlNNSVRUSU5HOgorICAgICAgICAgaWYoYz09TkFLKQorICAgICAgICAgeworICAgICAgICAgICAgVFJBQ0VfUEUoIlRSQU5TTUlUVElORyAtIGdvdCBOQUsiKTsKKyAgICAgICAgICAgIHJldHJ5X3RyYW5zbWl0KHBJbmZvKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFRSQUNFX1BFKCJUUkFOU01JVFRJTkcgLSBnb3QgaW52YWxpZCBjaGFyIik7CisgCisgICAgICAgICAgICBwSW5mby0+c3RhdGUgPSBSMzk2NF9XQUlUX1pWWl9CRUZPUkVfVFhfUkVUUlk7CisJICAgIG1vZF90aW1lcigmcEluZm8tPnRtciwgamlmZmllcyArIFIzOTY0X1RPX1pWWik7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUjM5NjRfV0FJVF9GT1JfVFhfQUNLOgorICAgICAgICAgaWYoYz09RExFKQorICAgICAgICAgeworICAgICAgICAgICAgVFJBQ0VfUFMoIldBSVRfRk9SX1RYX0FDSyAtIGdvdCBETEUiKTsKKyAgICAgICAgICAgIHJlbW92ZV9mcm9tX3R4X3F1ZXVlKHBJbmZvLCBSMzk2NF9PSyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBJbmZvLT5zdGF0ZSA9IFIzOTY0X0lETEU7CisgICAgICAgICAgICB0cmlnZ2VyX3RyYW5zbWl0KHBJbmZvKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHJ5X3RyYW5zbWl0KHBJbmZvKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSMzk2NF9XQUlUX0ZPUl9SWF9SRVBFQVQ6CisgICAgICAgICAvKiBGQUxMVFJPVUdIICovCisgICAgICBjYXNlIFIzOTY0X0lETEU6CisgICAgICAgICBpZihjPT1TVFgpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBQcmV2ZW50IHJ4X3F1ZXVlIGZyb20gb3ZlcmZsb3c6ICovCisgICAgICAgICAgICBpZihwSW5mby0+YmxvY2tzX2luX3J4X3F1ZXVlID49IFIzOTY0X01BWF9CTE9DS1NfSU5fUlhfUVVFVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUUkFDRV9QRSgiSURMRSAtIGdvdCBTVFggYnV0IG5vIHNwYWNlIGluIHJ4X3F1ZXVlISIpOworICAgICAgICAgICAgICAgcEluZm8tPnN0YXRlPVIzOTY0X1dBSVRfRk9SX1JYX0JVRjsKKwkgICAgICAgbW9kX3RpbWVyKCZwSW5mby0+dG1yLCBSMzk2NF9UT19OT19CVUYpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CitzdGFydF9yZWNlaXZpbmc6CisgICAgICAgICAgICAvKiBPaywgc3RhcnQgcmVjZWl2aW5nOiAqLworICAgICAgICAgICAgVFJBQ0VfUFMoIklETEUgLSBnb3QgU1RYIik7CisgICAgICAgICAgICBwSW5mby0+cnhfcG9zaXRpb24gPSAwOworICAgICAgICAgICAgcEluZm8tPmxhc3RfcnggPSAwOworICAgICAgICAgICAgcEluZm8tPmZsYWdzICY9IH5SMzk2NF9FUlJPUjsKKyAgICAgICAgICAgIHBJbmZvLT5zdGF0ZT1SMzk2NF9SRUNFSVZJTkc7CisJICAgIG1vZF90aW1lcigmcEluZm8tPnRtciwgUjM5NjRfVE9fWlZaKTsKKwkgICAgcEluZm8tPm5SZXRyeSA9IDA7CisgICAgICAgICAgICBwdXRfY2hhcihwSW5mbywgRExFKTsKKyAgICAgICAgICAgIGZsdXNoKHBJbmZvKTsKKyAgICAgICAgICAgIHBJbmZvLT5iY2MgPSAwOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFIzOTY0X1JFQ0VJVklORzoKKyAgICAgICAgIGlmKHBJbmZvLT5yeF9wb3NpdGlvbiA8IFJYX0JVRl9TSVpFKQorICAgICAgICAgeworICAgICAgICAgICAgcEluZm8tPmJjYyBePSBjOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZihjPT1ETEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZihwSW5mby0+bGFzdF9yeD09RExFKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcEluZm8tPmxhc3RfcnggPSAwOworICAgICAgICAgICAgICAgICAgZ290byBjaGFyX3RvX2J1ZjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHBJbmZvLT5sYXN0X3J4ID0gRExFOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IAorICAgICAgICAgICAgZWxzZSBpZigoYz09RVRYKSAmJiAocEluZm8tPmxhc3Rfcng9PURMRSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZihwSW5mby0+ZmxhZ3MgJiBSMzk2NF9CQ0MpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwSW5mby0+c3RhdGUgPSBSMzk2NF9XQUlUX0ZPUl9CQ0M7CisJCSAgbW9kX3RpbWVyKCZwSW5mby0+dG1yLCBSMzk2NF9UT19aVlopOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG9uX3JlY2VpdmVfYmxvY2socEluZm8pOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcEluZm8tPmxhc3RfcnggPSBjOworY2hhcl90b19idWY6CisgICAgICAgICAgICAgICBwSW5mby0+cnhfYnVmW3BJbmZvLT5yeF9wb3NpdGlvbisrXSA9IGM7CisJICAgICAgIG1vZF90aW1lcigmcEluZm8tPnRtciwgUjM5NjRfVE9fWlZaKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgLyogZWxzZTogb3ZlcmZsb3ctbXNnPyBCVUZfU0laRT5NVFU7IHNob3VsZCBub3QgaGFwcGVuPyAqLyAKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSMzk2NF9XQUlUX0ZPUl9CQ0M6CisgICAgICAgICBwSW5mby0+bGFzdF9yeCA9IGM7CisgICAgICAgICBvbl9yZWNlaXZlX2Jsb2NrKHBJbmZvKTsKKyAgICAgICAgIGJyZWFrOworICAgfQorfQorCitzdGF0aWMgdm9pZCByZWNlaXZlX2Vycm9yKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgY29uc3QgY2hhciBmbGFnKQoreworICAgIHN3aXRjaCAoZmxhZykgCisgICAgeworICAgIGNhc2UgVFRZX05PUk1BTDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUVFlfQlJFQUs6CisgICAgICAgIFRSQUNFX1BFKCJyZWNlaXZlZCBicmVhayIpCisgICAgICAgIHBJbmZvLT5mbGFncyB8PSBSMzk2NF9CUkVBSzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUVFlfUEFSSVRZOgorICAgICAgICBUUkFDRV9QRSgicGFyaXR5IGVycm9yIikKKyAgICAgICAgcEluZm8tPmZsYWdzIHw9IFIzOTY0X1BBUklUWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUVFlfRlJBTUU6CisgICAgICAgIFRSQUNFX1BFKCJmcmFtZSBlcnJvciIpCisgICAgICAgIHBJbmZvLT5mbGFncyB8PSBSMzk2NF9GUkFNRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUVFlfT1ZFUlJVTjoKKyAgICAgICAgVFJBQ0VfUEUoImZyYW1lIG92ZXJydW4iKQorICAgICAgICBwSW5mby0+ZmxhZ3MgfD0gUjM5NjRfT1ZFUlJVTjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgVFJBQ0VfUEUoInJlY2VpdmVfZXJyb3IgLSB1bmtub3duIGZsYWcgJWQiLCBmbGFnKTsKKyAgICAgICAgcEluZm8tPmZsYWdzIHw9IFIzOTY0X1VOS05PV047CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgb25fdGltZW91dCh1bnNpZ25lZCBsb25nIHByaXYpCit7CisgICBzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8gPSAodm9pZCAqKXByaXY7CisKKyAgIHN3aXRjaChwSW5mby0+c3RhdGUpCisgICB7CisgICAgICBjYXNlIFIzOTY0X1RYX1JFUVVFU1Q6CisgICAgICAgICBUUkFDRV9QRSgiVFhfUkVRVUVTVCAtIHRpbWVvdXQiKTsKKyAgICAgICAgIHJldHJ5X3RyYW5zbWl0KHBJbmZvKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSMzk2NF9XQUlUX1pWWl9CRUZPUkVfVFhfUkVUUlk6CisgICAgICAgICBwdXRfY2hhcihwSW5mbywgTkFLKTsKKyAgICAgICAgIGZsdXNoKHBJbmZvKTsKKyAgICAgICAgIHJldHJ5X3RyYW5zbWl0KHBJbmZvKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSMzk2NF9XQUlUX0ZPUl9UWF9BQ0s6CisgICAgICAgICBUUkFDRV9QRSgiV0FJVF9GT1JfVFhfQUNLIC0gdGltZW91dCIpOworICAgICAgICAgcmV0cnlfdHJhbnNtaXQocEluZm8pOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFIzOTY0X1dBSVRfRk9SX1JYX0JVRjoKKyAgICAgICAgIFRSQUNFX1BFKCJXQUlUX0ZPUl9SWF9CVUYgLSB0aW1lb3V0Iik7CisgICAgICAgICBwdXRfY2hhcihwSW5mbywgTkFLKTsKKyAgICAgICAgIGZsdXNoKHBJbmZvKTsKKyAgICAgICAgIHBJbmZvLT5zdGF0ZT1SMzk2NF9JRExFOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFIzOTY0X1JFQ0VJVklORzoKKyAgICAgICAgIFRSQUNFX1BFKCJSRUNFSVZJTkcgLSB0aW1lb3V0IGFmdGVyICVkIGNoYXJzIiwgCisgICAgICAgICAgICAgICAgICBwSW5mby0+cnhfcG9zaXRpb24pOworICAgICAgICAgcHV0X2NoYXIocEluZm8sIE5BSyk7CisgICAgICAgICBmbHVzaChwSW5mbyk7CisgICAgICAgICBwSW5mby0+c3RhdGU9UjM5NjRfSURMRTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSMzk2NF9XQUlUX0ZPUl9SWF9SRVBFQVQ6CisgICAgICAgICBUUkFDRV9QRSgiV0FJVF9GT1JfUlhfUkVQRUFUIC0gdGltZW91dCIpOworICAgICAgICAgcEluZm8tPnN0YXRlPVIzOTY0X0lETEU7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUjM5NjRfV0FJVF9GT1JfQkNDOgorICAgICAgICAgVFJBQ0VfUEUoIldBSVRfRk9SX0JDQyAtIHRpbWVvdXQiKTsKKyAgICAgICAgIHB1dF9jaGFyKHBJbmZvLCBOQUspOworICAgICAgICAgZmx1c2gocEluZm8pOworICAgICAgICAgcEluZm8tPnN0YXRlPVIzOTY0X0lETEU7CisgICAgICAgICBicmVhazsKKyAgIH0KK30KKworc3RhdGljIHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqZmluZENsaWVudCgKKyAgc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBwaWRfdCBwaWQpCit7CisgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQ7CisgICAKKyAgIGZvcihwQ2xpZW50PXBJbmZvLT5maXJzdENsaWVudDsgcENsaWVudDsgcENsaWVudD1wQ2xpZW50LT5uZXh0KQorICAgeworICAgICAgaWYocENsaWVudC0+cGlkID09IHBpZCkKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiBwQ2xpZW50OworICAgICAgfQorICAgfQorICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZW5hYmxlX3NpZ25hbHMoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBwaWRfdCBwaWQsIGludCBhcmcpCit7CisgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQ7CisgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKipwcENsaWVudDsKKyAgIHN0cnVjdCByMzk2NF9tZXNzYWdlICpwTXNnOworICAgCisgICBpZigoYXJnICYgUjM5NjRfU0lHX0FMTCk9PTApCisgICB7CisgICAgICAvKiBSZW1vdmUgY2xpZW50IGZyb20gY2xpZW50IGxpc3QgKi8KKyAgICAgIGZvcihwcENsaWVudD0mcEluZm8tPmZpcnN0Q2xpZW50OyAqcHBDbGllbnQ7IHBwQ2xpZW50PSYoKnBwQ2xpZW50KS0+bmV4dCkKKyAgICAgIHsKKyAgICAgICAgIHBDbGllbnQgPSAqcHBDbGllbnQ7CisgICAgICAgICAKKyAgICAgICAgIGlmKHBDbGllbnQtPnBpZCA9PSBwaWQpCisgICAgICAgICB7CisgICAgICAgICAgICBUUkFDRV9QUygicmVtb3ZpbmcgY2xpZW50ICVkIGZyb20gY2xpZW50IGxpc3QiLCBwaWQpOworICAgICAgICAgICAgKnBwQ2xpZW50ID0gcENsaWVudC0+bmV4dDsKKyAgICAgICAgICAgIHdoaWxlKHBDbGllbnQtPm1zZ19jb3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBNc2c9cmVtb3ZlX21zZyhwSW5mbywgcENsaWVudCk7CisgICAgICAgICAgICAgICBpZihwTXNnKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAga2ZyZWUocE1zZyk7CisgICAgICAgICAgICAgICAgICBUUkFDRV9NKCJlbmFibGVfc2lnbmFscyAtIG1zZyBrZnJlZSAleCIsKGludClwTXNnKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBDbGllbnQpOworICAgICAgICAgICAgVFJBQ0VfTSgiZW5hYmxlX3NpZ25hbHMgLSBrZnJlZSAleCIsKGludClwQ2xpZW50KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwQ2xpZW50PWZpbmRDbGllbnQocEluZm8sIHBpZCk7CisgICAgICBpZihwQ2xpZW50KQorICAgICAgeworICAgICAgICAgLyogdXBkYXRlIHNpZ25hbCBvcHRpb25zICovCisgICAgICAgICBwQ2xpZW50LT5zaWdfZmxhZ3M9YXJnOworICAgICAgfSAKKyAgICAgIGVsc2UgCisgICAgICB7CisgICAgICAgICAvKiBhZGQgY2xpZW50IHRvIGNsaWVudCBsaXN0ICovCisgICAgICAgICBwQ2xpZW50PWttYWxsb2Moc2l6ZW9mKHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyksIEdGUF9LRVJORUwpOworICAgICAgICAgVFJBQ0VfTSgiZW5hYmxlX3NpZ25hbHMgLSBrbWFsbG9jICV4IiwoaW50KXBDbGllbnQpOworICAgICAgICAgaWYocENsaWVudD09TlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgICAgICBUUkFDRV9QUygiYWRkIGNsaWVudCAlZCB0byBjbGllbnQgbGlzdCIsIHBpZCk7CisJIHNwaW5fbG9ja19pbml0KCZwQ2xpZW50LT5sb2NrKTsKKyAgICAgICAgIHBDbGllbnQtPnNpZ19mbGFncz1hcmc7CisgICAgICAgICBwQ2xpZW50LT5waWQgPSBwaWQ7CisgICAgICAgICBwQ2xpZW50LT5uZXh0PXBJbmZvLT5maXJzdENsaWVudDsKKyAgICAgICAgIHBDbGllbnQtPmZpcnN0X21zZyA9IE5VTEw7CisgICAgICAgICBwQ2xpZW50LT5sYXN0X21zZyA9IE5VTEw7CisgICAgICAgICBwQ2xpZW50LT5uZXh0X2Jsb2NrX3RvX3JlYWQgPSBOVUxMOworICAgICAgICAgcENsaWVudC0+bXNnX2NvdW50ID0gMDsKKyAgICAgICAgIHBJbmZvLT5maXJzdENsaWVudD1wQ2xpZW50OworICAgICAgfQorICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3RlbGVncmFtKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgcGlkX3QgcGlkLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmKQoreworICAgIHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudDsKKyAgICBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICpibG9jazsKKworICAgIGlmKCFidWYpCisgICAgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBwQ2xpZW50PWZpbmRDbGllbnQocEluZm8scGlkKTsKKyAgICBpZihwQ2xpZW50PT1OVUxMKQorICAgIHsKKyAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgCisgICAgYmxvY2s9cENsaWVudC0+bmV4dF9ibG9ja190b19yZWFkOworICAgIGlmKCFibG9jaykKKyAgICB7CisgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoY29weV90b191c2VyIChidWYsIGJsb2NrLT5kYXRhLCBibG9jay0+bGVuZ3RoKSkKKwlyZXR1cm4gLUVGQVVMVDsKKworICAgICAgIHJlbW92ZV9jbGllbnRfYmxvY2socEluZm8sIHBDbGllbnQpOworICAgICAgIHJldHVybiBibG9jay0+bGVuZ3RoOworICAgIH0KKworICAgIHJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCBhZGRfbXNnKHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudCwgaW50IG1zZ19pZCwgaW50IGFyZywKKyAgICAgICAgICAgICBpbnQgZXJyb3JfY29kZSwgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqcEJsb2NrKQoreworICAgc3RydWN0IHIzOTY0X21lc3NhZ2UgKnBNc2c7CisgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgCisgICBpZihwQ2xpZW50LT5tc2dfY291bnQ8UjM5NjRfTUFYX01TR19DT1VOVC0xKQorICAgeworcXVldWVfdGhlX21lc3NhZ2U6CisKKyAgICAgIHBNc2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcjM5NjRfbWVzc2FnZSksIEdGUF9LRVJORUwpOworICAgICAgVFJBQ0VfTSgiYWRkX21zZyAtIGttYWxsb2MgJXgiLChpbnQpcE1zZyk7CisgICAgICBpZihwTXNnPT1OVUxMKSB7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwQ2xpZW50LT5sb2NrLCBmbGFncyk7CisKKyAgICAgIHBNc2ctPm1zZ19pZCA9IG1zZ19pZDsKKyAgICAgIHBNc2ctPmFyZyAgICA9IGFyZzsKKyAgICAgIHBNc2ctPmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworICAgICAgcE1zZy0+YmxvY2sgID0gcEJsb2NrOworICAgICAgcE1zZy0+bmV4dCAgID0gTlVMTDsKKyAgICAgIAorICAgICAgaWYocENsaWVudC0+bGFzdF9tc2c9PU5VTEwpCisgICAgICB7CisgICAgICAgICBwQ2xpZW50LT5maXJzdF9tc2c9cENsaWVudC0+bGFzdF9tc2c9cE1zZzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBDbGllbnQtPmxhc3RfbXNnLT5uZXh0ID0gcE1zZzsKKyAgICAgICAgIHBDbGllbnQtPmxhc3RfbXNnPXBNc2c7CisgICAgICB9CisKKyAgICAgIHBDbGllbnQtPm1zZ19jb3VudCsrOworCisgICAgICBpZihwQmxvY2shPU5VTEwpCisgICAgICB7CisgICAgICAgICBwQmxvY2stPmxvY2tzKys7CisgICAgICB9CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQ2xpZW50LT5sb2NrLCBmbGFncyk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBpZigocENsaWVudC0+bGFzdF9tc2ctPm1zZ19pZCA9PSBSMzk2NF9NU0dfQUNLKQorCQkgJiYgKHBDbGllbnQtPmxhc3RfbXNnLT5lcnJvcl9jb2RlPT1SMzk2NF9PVkVSRkxPVykpCisgICAgICB7CisgICAgICAgICBwQ2xpZW50LT5sYXN0X21zZy0+YXJnKys7CisJCSBUUkFDRV9QRSgiYWRkX21zZyAtIGluYyBwcmV2IE9WRVJGTE9XLW1zZyIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgbXNnX2lkID0gUjM5NjRfTVNHX0FDSzsKKyAgICAgICAgIGFyZyA9IDA7CisJCSBlcnJvcl9jb2RlID0gUjM5NjRfT1ZFUkZMT1c7CisgICAgICAgICBwQmxvY2sgPSBOVUxMOworCQkgVFJBQ0VfUEUoImFkZF9tc2cgLSBxdWV1ZSBPVkVSRkxPVy1tc2ciKTsKKyAgICAgICAgIGdvdG8gcXVldWVfdGhlX21lc3NhZ2U7CisgICAgICB9CisgICB9CisgICAvKiBTZW5kIFNJR0lPIHNpZ25hbCB0byBjbGllbnQgcHJvY2VzczogKi8KKyAgIGlmKHBDbGllbnQtPnNpZ19mbGFncyAmIFIzOTY0X1VTRV9TSUdJTykKKyAgIHsKKyAgICAgIGtpbGxfcHJvYyhwQ2xpZW50LT5waWQsIFNJR0lPLCAxKTsKKyAgIH0KK30KKworc3RhdGljIHN0cnVjdCByMzk2NF9tZXNzYWdlICpyZW1vdmVfbXNnKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50KQoreworICAgc3RydWN0IHIzOTY0X21lc3NhZ2UgKnBNc2c9TlVMTDsKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgIGlmKHBDbGllbnQtPmZpcnN0X21zZykKKyAgIHsKKyAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwQ2xpZW50LT5sb2NrLCBmbGFncyk7CisKKyAgICAgIHBNc2cgPSBwQ2xpZW50LT5maXJzdF9tc2c7CisgICAgICBwQ2xpZW50LT5maXJzdF9tc2cgPSBwTXNnLT5uZXh0OworICAgICAgaWYocENsaWVudC0+Zmlyc3RfbXNnPT1OVUxMKQorICAgICAgeworICAgICAgICAgcENsaWVudC0+bGFzdF9tc2cgPSBOVUxMOworICAgICAgfQorICAgICAgCisgICAgICBwQ2xpZW50LT5tc2dfY291bnQtLTsKKyAgICAgIGlmKHBNc2ctPmJsb2NrKQorICAgICAgeworICAgICAgICByZW1vdmVfY2xpZW50X2Jsb2NrKHBJbmZvLCBwQ2xpZW50KTsKKyAgICAgICAgcENsaWVudC0+bmV4dF9ibG9ja190b19yZWFkID0gcE1zZy0+YmxvY2s7CisgICAgICB9CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQ2xpZW50LT5sb2NrLCBmbGFncyk7CisgICB9CisgICByZXR1cm4gcE1zZzsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2NsaWVudF9ibG9jayhzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIAorICAgICAgICAgICAgICAgIHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudCkKK3sKKyAgICBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICpibG9jazsKKworICAgIFRSQUNFX1BTKCJyZW1vdmVfY2xpZW50X2Jsb2NrIFBJRCAlZCIsIHBDbGllbnQtPnBpZCk7CisKKyAgICBibG9jaz1wQ2xpZW50LT5uZXh0X2Jsb2NrX3RvX3JlYWQ7CisgICAgaWYoYmxvY2spCisgICAgeworICAgICAgICBibG9jay0+bG9ja3MtLTsKKyAgICAgICAgaWYoYmxvY2stPmxvY2tzPT0wKQorICAgICAgICB7CisgICAgICAgICAgICByZW1vdmVfZnJvbV9yeF9xdWV1ZShwSW5mbywgYmxvY2spOworICAgICAgICB9CisgICAgfQorICAgIHBDbGllbnQtPm5leHRfYmxvY2tfdG9fcmVhZCA9IE5VTEw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpbmUgZGlzY2lwbGluZSByb3V0aW5lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgcjM5NjRfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworICAgc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvOworICAgCisgICBUUkFDRV9MKCJvcGVuIik7CisgICBUUkFDRV9MKCJ0dHk9JXgsIFBJRD0lZCwgZGlzY19kYXRhPSV4IiwgCisgICAgICAgICAgKGludCl0dHksIGN1cnJlbnQtPnBpZCwgKGludCl0dHktPmRpc2NfZGF0YSk7CisgICAKKyAgIHBJbmZvPWttYWxsb2Moc2l6ZW9mKHN0cnVjdCByMzk2NF9pbmZvKSwgR0ZQX0tFUk5FTCk7IAorICAgVFJBQ0VfTSgicjM5NjRfb3BlbiAtIGluZm8ga21hbGxvYyAleCIsKGludClwSW5mbyk7CisKKyAgIGlmKCFwSW5mbykKKyAgIHsKKyAgICAgIHByaW50ayhLRVJOX0VSUiAicjM5NjQ6IGZhaWxlZCB0byBhbGxvYyBpbmZvIHN0cnVjdHVyZVxuIik7CisgICAgICByZXR1cm4gLUVOT01FTTsKKyAgIH0KKworICAgcEluZm8tPnJ4X2J1ZiA9IGttYWxsb2MoUlhfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworICAgVFJBQ0VfTSgicjM5NjRfb3BlbiAtIHJ4X2J1ZiBrbWFsbG9jICV4IiwoaW50KXBJbmZvLT5yeF9idWYpOworCisgICBpZighcEluZm8tPnJ4X2J1ZikKKyAgIHsKKyAgICAgIHByaW50ayhLRVJOX0VSUiAicjM5NjQ6IGZhaWxlZCB0byBhbGxvYyByZWNlaXZlIGJ1ZmZlclxuIik7CisgICAgICBrZnJlZShwSW5mbyk7CisgICAgICBUUkFDRV9NKCJyMzk2NF9vcGVuIC0gaW5mbyBrZnJlZSAleCIsKGludClwSW5mbyk7CisgICAgICByZXR1cm4gLUVOT01FTTsKKyAgIH0KKyAgIAorICAgcEluZm8tPnR4X2J1ZiA9IGttYWxsb2MoVFhfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworICAgVFJBQ0VfTSgicjM5NjRfb3BlbiAtIHR4X2J1ZiBrbWFsbG9jICV4IiwoaW50KXBJbmZvLT50eF9idWYpOworCisgICBpZighcEluZm8tPnR4X2J1ZikKKyAgIHsKKyAgICAgIHByaW50ayhLRVJOX0VSUiAicjM5NjQ6IGZhaWxlZCB0byBhbGxvYyB0cmFuc21pdCBidWZmZXJcbiIpOworICAgICAga2ZyZWUocEluZm8tPnJ4X2J1Zik7CisgICAgICBUUkFDRV9NKCJyMzk2NF9vcGVuIC0gcnhfYnVmIGtmcmVlICV4IiwoaW50KXBJbmZvLT5yeF9idWYpOworICAgICAga2ZyZWUocEluZm8pOworICAgICAgVFJBQ0VfTSgicjM5NjRfb3BlbiAtIGluZm8ga2ZyZWUgJXgiLChpbnQpcEluZm8pOworICAgICAgcmV0dXJuIC1FTk9NRU07CisgICB9CisKKyAgIHNwaW5fbG9ja19pbml0KCZwSW5mby0+bG9jayk7CisgICBwSW5mby0+dHR5ID0gdHR5OworICAgaW5pdF93YWl0cXVldWVfaGVhZCAoJnBJbmZvLT5yZWFkX3dhaXQpOworICAgcEluZm8tPnByaW9yaXR5ID0gUjM5NjRfTUFTVEVSOworICAgcEluZm8tPnJ4X2ZpcnN0ID0gcEluZm8tPnJ4X2xhc3QgPSBOVUxMOworICAgcEluZm8tPnR4X2ZpcnN0ID0gcEluZm8tPnR4X2xhc3QgPSBOVUxMOworICAgcEluZm8tPnJ4X3Bvc2l0aW9uID0gMDsKKyAgIHBJbmZvLT50eF9wb3NpdGlvbiA9IDA7CisgICBwSW5mby0+bGFzdF9yeCA9IDA7CisgICBwSW5mby0+YmxvY2tzX2luX3J4X3F1ZXVlID0gMDsKKyAgIHBJbmZvLT5maXJzdENsaWVudD1OVUxMOworICAgcEluZm8tPnN0YXRlPVIzOTY0X0lETEU7CisgICBwSW5mby0+ZmxhZ3MgPSBSMzk2NF9ERUJVRzsKKyAgIHBJbmZvLT5uUmV0cnkgPSAwOworICAgCisgICB0dHktPmRpc2NfZGF0YSA9IHBJbmZvOworCisgICBpbml0X3RpbWVyKCZwSW5mby0+dG1yKTsKKyAgIHBJbmZvLT50bXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBJbmZvOworICAgcEluZm8tPnRtci5mdW5jdGlvbiA9IG9uX3RpbWVvdXQ7CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByMzk2NF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworICAgc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvPShzdHJ1Y3QgcjM5NjRfaW5mbyopdHR5LT5kaXNjX2RhdGE7CisgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQsICpwTmV4dDsKKyAgIHN0cnVjdCByMzk2NF9tZXNzYWdlICpwTXNnOworICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqcEhlYWRlciwgKnBOZXh0SGVhZGVyOworICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgVFJBQ0VfTCgiY2xvc2UiKTsKKworICAgIC8qCisgICAgICogTWFrZSBzdXJlIHRoYXQgb3VyIHRhc2sgcXVldWUgaXNuJ3QgYWN0aXZhdGVkLiAgSWYgaXQKKyAgICAgKiBpcywgdGFrZSBpdCBvdXQgb2YgdGhlIGxpbmtlZCBsaXN0LgorICAgICAqLworICAgIGRlbF90aW1lcl9zeW5jKCZwSW5mby0+dG1yKTsKKworICAgLyogUmVtb3ZlIGNsaWVudC1zdHJ1Y3RzIGFuZCBtZXNzYWdlIHF1ZXVlczogKi8KKyAgICBwQ2xpZW50PXBJbmZvLT5maXJzdENsaWVudDsKKyAgICB3aGlsZShwQ2xpZW50KQorICAgIHsKKyAgICAgICBwTmV4dD1wQ2xpZW50LT5uZXh0OworICAgICAgIHdoaWxlKHBDbGllbnQtPm1zZ19jb3VudCkKKyAgICAgICB7CisgICAgICAgICAgcE1zZz1yZW1vdmVfbXNnKHBJbmZvLCBwQ2xpZW50KTsKKyAgICAgICAgICBpZihwTXNnKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBrZnJlZShwTXNnKTsKKyAgICAgICAgICAgICBUUkFDRV9NKCJyMzk2NF9jbG9zZSAtIG1zZyBrZnJlZSAleCIsKGludClwTXNnKTsKKyAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIGtmcmVlKHBDbGllbnQpOworICAgICAgIFRSQUNFX00oInIzOTY0X2Nsb3NlIC0gY2xpZW50IGtmcmVlICV4IiwoaW50KXBDbGllbnQpOworICAgICAgIHBDbGllbnQ9cE5leHQ7CisgICAgfQorICAgIC8qIFJlbW92ZSBqb2JzIGZyb20gdHhfcXVldWU6ICovCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworCXBIZWFkZXI9cEluZm8tPnR4X2ZpcnN0OworCXBJbmZvLT50eF9maXJzdD1wSW5mby0+dHhfbGFzdD1OVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBJbmZvLT5sb2NrLCBmbGFncyk7CisJCisgICAgd2hpbGUocEhlYWRlcikKKwl7CisJICAgcE5leHRIZWFkZXI9cEhlYWRlci0+bmV4dDsKKwkgICBrZnJlZShwSGVhZGVyKTsKKwkgICBwSGVhZGVyPXBOZXh0SGVhZGVyOworCX0KKworICAgIC8qIEZyZWUgYnVmZmVyczogKi8KKyAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJnBJbmZvLT5yZWFkX3dhaXQpOworICAgIGtmcmVlKHBJbmZvLT5yeF9idWYpOworICAgIFRSQUNFX00oInIzOTY0X2Nsb3NlIC0gcnhfYnVmIGtmcmVlICV4IiwoaW50KXBJbmZvLT5yeF9idWYpOworICAgIGtmcmVlKHBJbmZvLT50eF9idWYpOworICAgIFRSQUNFX00oInIzOTY0X2Nsb3NlIC0gdHhfYnVmIGtmcmVlICV4IiwoaW50KXBJbmZvLT50eF9idWYpOworICAgIGtmcmVlKHBJbmZvKTsKKyAgICBUUkFDRV9NKCJyMzk2NF9jbG9zZSAtIGluZm8ga2ZyZWUgJXgiLChpbnQpcEluZm8pOworfQorCitzdGF0aWMgc3NpemVfdCByMzk2NF9yZWFkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICB1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbnIpCit7CisgICBzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm89KHN0cnVjdCByMzk2NF9pbmZvKil0dHktPmRpc2NfZGF0YTsKKyAgIHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudDsKKyAgIHN0cnVjdCByMzk2NF9tZXNzYWdlICpwTXNnOworICAgc3RydWN0IHIzOTY0X2NsaWVudF9tZXNzYWdlIHRoZU1zZzsKKyAgIERFQ0xBUkVfV0FJVFFVRVVFICh3YWl0LCBjdXJyZW50KTsKKyAgIAorICAgaW50IHBpZCA9IGN1cnJlbnQtPnBpZDsKKyAgIGludCBjb3VudDsKKyAgIAorICAgVFJBQ0VfTCgicmVhZCgpIik7CisgCisgICBwQ2xpZW50PWZpbmRDbGllbnQocEluZm8sIHBpZCk7CisgICBpZihwQ2xpZW50KQorICAgeworICAgICAgcE1zZyA9IHJlbW92ZV9tc2cocEluZm8sIHBDbGllbnQpOworICAgICAgaWYocE1zZz09TlVMTCkKKyAgICAgIHsKKwkJIC8qIG5vIG1lc3NhZ2VzIGF2YWlsYWJsZS4gKi8KKyAgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJIHsKKyAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworCQkgfQorICAgICAgICAgLyogYmxvY2sgdW50aWwgdGhlcmUgaXMgYSBtZXNzYWdlOiAqLworICAgICAgICAgYWRkX3dhaXRfcXVldWUoJnBJbmZvLT5yZWFkX3dhaXQsICZ3YWl0KTsKK3JlcGVhdDoKKyAgICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworICAgICAgICAgcE1zZyA9IHJlbW92ZV9tc2cocEluZm8sIHBDbGllbnQpOworCSBpZiAoIXBNc2cgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkgeworICAgICAgICAgICAgc2NoZWR1bGUoKTsKKyAgICAgICAgICAgIGdvdG8gcmVwZWF0OworICAgICAgICAgfQorICAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisgICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcEluZm8tPnJlYWRfd2FpdCwgJndhaXQpOworICAgICAgfQorICAgICAgCisgICAgICAvKiBJZiB3ZSBzdGlsbCBoYXZlbid0IGdvdCBhIG1lc3NhZ2UsIHdlIG11c3QgaGF2ZSBiZWVuIHNpZ25hbGxlZCAqLworCisgICAgICBpZiAoIXBNc2cpIHJldHVybiAtRUlOVFI7CisKKyAgICAgIC8qIGRlbGl2ZXIgbXNnIHRvIGNsaWVudCBwcm9jZXNzOiAqLworICAgICAgdGhlTXNnLm1zZ19pZCA9IHBNc2ctPm1zZ19pZDsKKyAgICAgIHRoZU1zZy5hcmcgICAgPSBwTXNnLT5hcmc7CisgICAgICB0aGVNc2cuZXJyb3JfY29kZSA9IHBNc2ctPmVycm9yX2NvZGU7CisgICAgICBjb3VudCA9IHNpemVvZihzdHJ1Y3QgcjM5NjRfY2xpZW50X21lc3NhZ2UpOworCisgICAgICBrZnJlZShwTXNnKTsKKyAgICAgIFRSQUNFX00oInIzOTY0X3JlYWQgLSBtc2cga2ZyZWUgJXgiLChpbnQpcE1zZyk7CisKKyAgICAgIGlmIChjb3B5X3RvX3VzZXIoYnVmLCZ0aGVNc2csIGNvdW50KSkKKwlyZXR1cm4gLUVGQVVMVDsKKworICAgICAgVFJBQ0VfUFMoInJlYWQgLSByZXR1cm4gJWQiLCBjb3VudCk7CisgICAgICByZXR1cm4gY291bnQ7CisgICB9CisgICByZXR1cm4gLUVQRVJNOworfQorCitzdGF0aWMgc3NpemVfdCByMzk2NF93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50KQoreworICAgc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvPShzdHJ1Y3QgcjM5NjRfaW5mbyopdHR5LT5kaXNjX2RhdGE7CisgICBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICpwSGVhZGVyOworICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50OworICAgdW5zaWduZWQgY2hhciAqbmV3X2RhdGE7CisgICBpbnQgcGlkOworICAgCisgICBUUkFDRV9MKCJ3cml0ZSByZXF1ZXN0LCAlZCBjaGFyYWN0ZXJzIiwgY291bnQpOworLyogCisgKiBWZXJpZnkgdGhlIHBvaW50ZXJzIAorICovCisKKyAgIGlmKCFwSW5mbykKKyAgICAgIHJldHVybiAtRUlPOworCisvKgorICogRW5zdXJlIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdCB3aXNoIHRvIHNlbmQgdG9vIG11Y2guCisgKi8KKyAgIGlmIChjb3VudCA+IFIzOTY0X01UVSkgCisgICB7CisgICAgICBpZiAocEluZm8tPmZsYWdzICYgUjM5NjRfREVCVUcpCisgICAgICB7CisgICAgICAgICBUUkFDRV9MIChLRVJOX1dBUk5JTkcKKyAgICAgICAgICAgICAgICAgInIzOTY0X3dyaXRlOiB0cnVuY2F0aW5nIHVzZXIgcGFja2V0ICIKKyAgICAgICAgICAgICAgICAgImZyb20gJXUgdG8gbXR1ICVkIiwgY291bnQsIFIzOTY0X01UVSk7CisgICAgICB9CisgICAgICBjb3VudCA9IFIzOTY0X01UVTsKKyAgIH0KKy8qCisgKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGRhdGEgYW5kIGNvcHkgaXQgZnJvbSB0aGUgYnVmZmVyIHdpdGggaGVhZGVyIHByZXBlbmRlZAorICovCisgICBuZXdfZGF0YSA9IGttYWxsb2MgKGNvdW50K3NpemVvZihzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyKSwgR0ZQX0tFUk5FTCk7CisgICBUUkFDRV9NKCJyMzk2NF93cml0ZSAtIGttYWxsb2MgJXgiLChpbnQpbmV3X2RhdGEpOworICAgaWYgKG5ld19kYXRhID09IE5VTEwpIHsKKyAgICAgIGlmIChwSW5mby0+ZmxhZ3MgJiBSMzk2NF9ERUJVRykKKyAgICAgIHsKKyAgICAgICAgIHByaW50ayAoS0VSTl9FUlIKKyAgICAgICAgICAgICAgICJyMzk2NF93cml0ZTogbm8gbWVtb3J5XG4iKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAtRU5PU1BDOworICAgfQorICAgCisgICBwSGVhZGVyID0gKHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKiluZXdfZGF0YTsKKyAgIHBIZWFkZXItPmRhdGEgPSBuZXdfZGF0YSArIHNpemVvZihzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyKTsKKyAgIHBIZWFkZXItPmxlbmd0aCA9IGNvdW50OworICAgcEhlYWRlci0+bG9ja3MgPSAwOworICAgcEhlYWRlci0+b3duZXIgPSBOVUxMOworICAgCisgICBwaWQ9Y3VycmVudC0+cGlkOworICAgCisgICBwQ2xpZW50PWZpbmRDbGllbnQocEluZm8sIHBpZCk7CisgICBpZihwQ2xpZW50KQorICAgeworICAgICAgcEhlYWRlci0+b3duZXIgPSBwQ2xpZW50OworICAgfQorCisgICBtZW1jcHkocEhlYWRlci0+ZGF0YSwgZGF0YSwgY291bnQpOyAvKiBXZSBhbHJlYWR5IHZlcmlmaWVkIHRoaXMgKi8KKworICAgaWYocEluZm8tPmZsYWdzICYgUjM5NjRfREVCVUcpCisgICB7CisgICAgICBkdW1wX2Jsb2NrKHBIZWFkZXItPmRhdGEsIGNvdW50KTsKKyAgIH0KKworLyoKKyAqIEFkZCBidWZmZXIgdG8gdHJhbnNtaXQtcXVldWU6CisgKi8KKyAgIGFkZF90eF9xdWV1ZShwSW5mbywgcEhlYWRlcik7CisgICB0cmlnZ2VyX3RyYW5zbWl0KHBJbmZvKTsKKyAgIAorICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjM5NjRfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvPShzdHJ1Y3QgcjM5NjRfaW5mbyopdHR5LT5kaXNjX2RhdGE7CisgICBpZihwSW5mbz09TlVMTCkKKyAgICAgIHJldHVybiAtRUlOVkFMOworICAgc3dpdGNoKGNtZCkKKyAgIHsKKyAgICAgIGNhc2UgUjM5NjRfRU5BQkxFX1NJR05BTFM6CisgICAgICAgICByZXR1cm4gZW5hYmxlX3NpZ25hbHMocEluZm8sIGN1cnJlbnQtPnBpZCwgYXJnKTsKKyAgICAgIGNhc2UgUjM5NjRfU0VUUFJJT1JJVFk6CisgICAgICAgICBpZihhcmc8UjM5NjRfTUFTVEVSIHx8IGFyZz5SMzk2NF9TTEFWRSkKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgcEluZm8tPnByaW9yaXR5ID0gYXJnICYgMHhmZjsKKyAgICAgICAgIHJldHVybiAwOworICAgICAgY2FzZSBSMzk2NF9VU0VfQkNDOgorICAgICAgICAgICAgIGlmKGFyZykKKyAgICAgICAgICAgIHBJbmZvLT5mbGFncyB8PSBSMzk2NF9CQ0M7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBwSW5mby0+ZmxhZ3MgJj0gflIzOTY0X0JDQzsKKyAgICAgICAgIHJldHVybiAwOworICAgICAgY2FzZSBSMzk2NF9SRUFEX1RFTEVHUkFNOgorICAgICAgICAgcmV0dXJuIHJlYWRfdGVsZWdyYW0ocEluZm8sIGN1cnJlbnQtPnBpZCwgKHVuc2lnbmVkIGNoYXIgX191c2VyICopYXJnKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICByZXR1cm4gLUVOT0lPQ1RMQ01EOworICAgfQorfQorCitzdGF0aWMgdm9pZCByMzk2NF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCkKK3sKKyAgIFRSQUNFX0woInNldF90ZXJtaW9zIik7Cit9CisKKy8qIENhbGxlZCB3aXRob3V0IHRoZSBrZXJuZWwgbG9jayBoZWxkIC0gZmluZSAqLworc3RhdGljIHVuc2lnbmVkIGludCByMzk2NF9wb2xsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCSAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKyAgIHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbz0oc3RydWN0IHIzOTY0X2luZm8qKXR0eS0+ZGlzY19kYXRhOworICAgaW50IHBpZD1jdXJyZW50LT5waWQ7CisgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQ7CisgICBzdHJ1Y3QgcjM5NjRfbWVzc2FnZSAqcE1zZz1OVUxMOworICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgIGludCByZXN1bHQgPSBQT0xMT1VUOworCisgICBUUkFDRV9MKCJQT0xMIik7CisKKyAgIHBDbGllbnQ9ZmluZENsaWVudChwSW5mbyxwaWQpOworICAgaWYocENsaWVudCkKKyAgICAgeworICAgICAgIHBvbGxfd2FpdChmaWxlLCAmcEluZm8tPnJlYWRfd2FpdCwgd2FpdCk7CisgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnBJbmZvLT5sb2NrLCBmbGFncyk7CisgICAgICAgcE1zZz1wQ2xpZW50LT5maXJzdF9tc2c7CisgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKyAgICAgICBpZihwTXNnKQorCSAgIHJlc3VsdCB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworICAgICB9CisgICBlbHNlCisgICAgIHsKKyAgICAgICByZXN1bHQgPSAtRUlOVkFMOworICAgICB9CisgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCByMzk2NF9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZwLCBpbnQgY291bnQpCit7CisgICBzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm89KHN0cnVjdCByMzk2NF9pbmZvKil0dHktPmRpc2NfZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICAgIGNoYXIgKmYsIGZsYWdzID0gMDsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaT1jb3VudCwgcCA9IGNwLCBmID0gZnA7IGk7IGktLSwgcCsrKSB7CisgICAgICAgIGlmIChmKQorICAgICAgICAgICAgZmxhZ3MgPSAqZisrOworICAgICAgICBpZihmbGFncz09VFRZX05PUk1BTCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVjZWl2ZV9jaGFyKHBJbmZvLCAqcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZWNlaXZlX2Vycm9yKHBJbmZvLCBmbGFncyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorfQorCitzdGF0aWMgaW50IHIzOTY0X3JlY2VpdmVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworICAgVFJBQ0VfTCgicmVjZWl2ZV9yb29tIik7CisgICByZXR1cm4gLTE7Cit9CisKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX0xESVNDKE5fUjM5NjQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL25fdHR5LmMgYi9kcml2ZXJzL2NoYXIvbl90dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGJhNWEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKQEAgLTAsMCArMSwxNTYyIEBACisvKgorICogbl90dHkuYyAtLS0gaW1wbGVtZW50cyB0aGUgTl9UVFkgbGluZSBkaXNjaXBsaW5lLgorICogCisgKiBUaGlzIGNvZGUgdXNlZCB0byBiZSBpbiB0dHlfaW8uYywgYnV0IHRoaW5ncyBhcmUgZ2V0dGluZyBoYWlyeQorICogZW5vdWdoIHRoYXQgaXQgbWFkZSBzZW5zZSB0byBzcGxpdCB0aGluZ3Mgb2ZmLiAgKFRoZSBOX1RUWQorICogcHJvY2Vzc2luZyBoYXMgY2hhbmdlZCBzbyBtdWNoIHRoYXQgaXQncyBoYXJkbHkgcmVjb2duaXphYmxlLAorICogYW55d2F5Li4uKQorICoKKyAqIE5vdGUgdGhhdCB0aGUgb3BlbiByb3V0aW5lIGZvciBOX1RUWSBpcyBndWFyYW50ZWVkIG5ldmVyIHRvIHJldHVybgorICogYW4gZXJyb3IuICBUaGlzIGlzIGJlY2F1c2UgTGludXggd2lsbCBmYWxsIGJhY2sgdG8gc2V0dGluZyBhIGxpbmUKKyAqIHRvIE5fVFRZIGlmIGl0IGNhbiBub3Qgc3dpdGNoIHRvIGFueSBvdGhlciBsaW5lIGRpc2NpcGxpbmUuICAKKyAqCisgKiBXcml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIENvcHlyaWdodCAxOTk0LgorICogCisgKiBUaGlzIGZpbGUgYWxzbyBjb250YWlucyBjb2RlIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcywKKyAqIENvcHlyaWdodCAxOTkxLCAxOTkyLCAxOTkzLCBhbmQgYnkgSnVsaWFuIENvd2xleSwgQ29weXJpZ2h0IDE5OTQuCisgKiAKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4KKyAqCisgKiBSZWR1Y2VkIG1lbW9yeSB1c2FnZSBmb3Igb2xkZXIgQVJNIHN5c3RlbXMgIC0gUnVzc2VsbCBLaW5nLgorICoKKyAqIDIwMDAvMDEvMjAgICBGaXhlZCBTTVAgbG9ja2luZyBvbiBwdXRfdHR5X3F1ZXVlIHVzaW5nIGJpdHMgb2YgCisgKgkJdGhlIHBhdGNoIGJ5IEFuZHJldyBKLiBLcm9sbCA8YWc3ODRAZnJlZW5ldC5idWZmYWxvLmVkdT4KKyAqCQl3aG8gYWN0dWFsbHkgZmluYWxseSBwcm92ZWQgdGhlcmUgcmVhbGx5IHdhcyBhIHJhY2UuCisgKgorICogMjAwMi8wMy8xOCAgIEltcGxlbWVudGVkIG5fdHR5X3dha2V1cCB0byBzZW5kIFNJR0lPIFBPTExfT1VUcyB0bworICoJCXdhaXRpbmcgd3JpdGluZyBwcm9jZXNzZXMtU2FwYW4gQmhhdGlhIDxzYXBhbkBjb3Jld2Fycy5vcmc+LgorICoJCUFsc28gZml4ZWQgYSBidWcgaW4gQkxPQ0tJTkcgbW9kZSB3aGVyZSB3cml0ZV9jaGFuIHJldHVybnMKKyAqCQlFQUdBSU4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgbGVmdCBpbiB4bWl0IGJ1ZmZlciBiZWZvcmUgc2VsZWN0IGhhcyB3ZSBoYXZlIHJvb20gKi8KKyNkZWZpbmUgV0FLRVVQX0NIQVJTIDI1NgorCisvKgorICogVGhpcyBkZWZpbmVzIHRoZSBsb3ctIGFuZCBoaWdoLXdhdGVybWFya3MgZm9yIHRocm90dGxpbmcgYW5kCisgKiB1bnRocm90dGxpbmcgdGhlIFRUWSBkcml2ZXIuICBUaGVzZSB3YXRlcm1hcmtzIGFyZSB1c2VkIGZvcgorICogY29udHJvbGxpbmcgdGhlIHNwYWNlIGluIHRoZSByZWFkIGJ1ZmZlci4KKyAqLworI2RlZmluZSBUVFlfVEhSRVNIT0xEX1RIUk9UVExFCQkxMjggLyogbm93IGJhc2VkIG9uIHJlbWFpbmluZyByb29tICovCisjZGVmaW5lIFRUWV9USFJFU0hPTERfVU5USFJPVFRMRSAJMTI4CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqYWxsb2NfYnVmKHZvaWQpCit7CisJaW50IHByaW8gPSBpbl9pbnRlcnJ1cHQoKSA/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMOworCisJaWYgKFBBR0VfU0laRSAhPSBOX1RUWV9CVUZfU0laRSkKKwkJcmV0dXJuIGttYWxsb2MoTl9UVFlfQlVGX1NJWkUsIHByaW8pOworCWVsc2UKKwkJcmV0dXJuICh1bnNpZ25lZCBjaGFyICopX19nZXRfZnJlZV9wYWdlKHByaW8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9idWYodW5zaWduZWQgY2hhciAqYnVmKQoreworCWlmIChQQUdFX1NJWkUgIT0gTl9UVFlfQlVGX1NJWkUpCisJCWtmcmVlKGJ1Zik7CisJZWxzZQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdHR5X3F1ZXVlX25vbG9jayh1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaWYgKHR0eS0+cmVhZF9jbnQgPCBOX1RUWV9CVUZfU0laRSkgeworCQl0dHktPnJlYWRfYnVmW3R0eS0+cmVhZF9oZWFkXSA9IGM7CisJCXR0eS0+cmVhZF9oZWFkID0gKHR0eS0+cmVhZF9oZWFkICsgMSkgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CisJCXR0eS0+cmVhZF9jbnQrKzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdHR5X3F1ZXVlKHVuc2lnbmVkIGNoYXIgYywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qCisJICoJVGhlIHByb2JsZW0gb2Ygc3RvbXBpbmcgb24gdGhlIGJ1ZmZlcnMgZW5kcyBoZXJlLgorCSAqCVdoeSBkaWRuJ3QgYW55b25lIHNlZSB0aGlzIG9uZSBjb21pbmc/IC0tQUpLCisJKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwlwdXRfdHR5X3F1ZXVlX25vbG9jayhjLCB0dHkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICoJY2hlY2tfdW50aHJvdHRsZQktCWFsbG93IG5ldyByZWNlaXZlIGRhdGEKKyAqCUB0dHk7IHR0eSBkZXZpY2UKKyAqCisgKglDaGVjayB3aGV0aGVyIHRvIGNhbGwgdGhlIGRyaXZlci51bnRocm90dGxlIGZ1bmN0aW9uLgorICoJV2UgdGVzdCB0aGUgVFRZX1RIUk9UVExFRCBiaXQgZmlyc3Qgc28gdGhhdCBpdCBhbHdheXMKKyAqCWluZGljYXRlcyB0aGUgY3VycmVudCBzdGF0ZS4gVGhlIGRlY2lzaW9uIGFib3V0IHdoZXRoZXIKKyAqCWl0IGlzIHdvcnRoIGFsbG93aW5nIG1vcmUgaW5wdXQgaGFzIGJlZW4gdGFrZW4gYnkgdGhlIGNhbGxlci4KKyAqCUNhbiBzbGVlcCwgbWF5IGJlIGNhbGxlZCB1bmRlciB0aGUgYXRvbWljX3JlYWQgc2VtYXBob3JlIGJ1dAorICoJdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4KKyAqLworIAorc3RhdGljIHZvaWQgY2hlY2tfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlpZiAodHR5LT5jb3VudCAmJgorCSAgICB0ZXN0X2FuZF9jbGVhcl9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpICYmIAorCSAgICB0dHktPmRyaXZlci0+dW50aHJvdHRsZSkKKwkJdHR5LT5kcml2ZXItPnVudGhyb3R0bGUodHR5KTsKK30KKworLyoqCisgKglyZXNldF9idWZmZXJfZmxhZ3MJLQlyZXNldCBidWZmZXIgc3RhdGUKKyAqCUB0dHk6IHRlcm1pbmFsIHRvIHJlc2V0CisgKgorICoJUmVzZXQgdGhlIHJlYWQgYnVmZmVyIGNvdW50ZXJzLCBjbGVhciB0aGUgZmxhZ3MsIAorICoJYW5kIG1ha2Ugc3VyZSB0aGUgZHJpdmVyIGlzIHVudGhyb3R0bGVkLiBDYWxsZWQKKyAqCWZyb20gbl90dHlfb3BlbigpIGFuZCBuX3R0eV9mbHVzaF9idWZmZXIoKS4KKyAqLworc3RhdGljIHZvaWQgcmVzZXRfYnVmZmVyX2ZsYWdzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCXR0eS0+cmVhZF9oZWFkID0gdHR5LT5yZWFkX3RhaWwgPSB0dHktPnJlYWRfY250ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCXR0eS0+Y2Fub25faGVhZCA9IHR0eS0+Y2Fub25fZGF0YSA9IHR0eS0+ZXJhc2luZyA9IDA7CisJbWVtc2V0KCZ0dHktPnJlYWRfZmxhZ3MsIDAsIHNpemVvZiB0dHktPnJlYWRfZmxhZ3MpOworCWNoZWNrX3VudGhyb3R0bGUodHR5KTsKK30KKworLyoqCisgKgluX3R0eV9mbHVzaF9idWZmZXIJLQljbGVhbiBpbnB1dCBxdWV1ZQorICoJQHR0eToJdGVybWluYWwgZGV2aWNlCisgKgorICoJRmx1c2ggdGhlIGlucHV0IGJ1ZmZlci4gQ2FsbGVkIHdoZW4gdGhlIGxpbmUgZGlzY2lwbGluZSBpcworICoJYmVpbmcgY2xvc2VkLCB3aGVuIHRoZSB0dHkgbGF5ZXIgd2FudHMgdGhlIGJ1ZmZlciBmbHVzaGVkIChlZworICoJYXQgaGFuZ3VwKSBvciB3aGVuIHRoZSBOX1RUWSBsaW5lIGRpc2NpcGxpbmUgaW50ZXJuYWxseSBoYXMgdG8KKyAqCWNsZWFuIHRoZSBwZW5kaW5nIHF1ZXVlIChmb3IgZXhhbXBsZSBzb21lIHNpZ25hbHMpLgorICoKKyAqCUZJWE1FOiB0dHktPmN0cmxfc3RhdHVzIGlzIG5vdCBzcGlubG9ja2VkIGFuZCByZWxpZXMgb24KKyAqCWxvY2tfa2VybmVsKCkgc3RpbGwuCisgKi8KKyAKK3N0YXRpYyB2b2lkIG5fdHR5X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwkvKiBjbGVhciBldmVyeXRoaW5nIGFuZCB1bnRocm90dGxlIHRoZSBkcml2ZXIgKi8KKwlyZXNldF9idWZmZXJfZmxhZ3ModHR5KTsKKwkKKwlpZiAoIXR0eS0+bGluaykKKwkJcmV0dXJuOworCisJaWYgKHR0eS0+bGluay0+cGFja2V0KSB7CisJCXR0eS0+Y3RybF9zdGF0dXMgfD0gVElPQ1BLVF9GTFVTSFJFQUQ7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5saW5rLT5yZWFkX3dhaXQpOworCX0KK30KKworLyoqCisgKgluX3R0eV9jaGFyc19pbl9idWZmZXIJLQlyZXBvcnQgYXZhaWxhYmxlIGJ5dGVzCisgKglAdHR5OiB0dHkgZGV2aWNlCisgKgorICoJUmVwb3J0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBidWZmZXJlZCB0byBiZSBkZWxpdmVyZWQgdG8gdXNlcgorICoJYXQgdGhpcyBpbnN0YW50IGluIHRpbWUuIAorICovCisgCitzdGF0aWMgc3NpemVfdCBuX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNzaXplX3QgbiA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoIXR0eS0+aWNhbm9uKSB7CisJCW4gPSB0dHktPnJlYWRfY250OworCX0gZWxzZSBpZiAodHR5LT5jYW5vbl9kYXRhKSB7CisJCW4gPSAodHR5LT5jYW5vbl9oZWFkID4gdHR5LT5yZWFkX3RhaWwpID8KKwkJCXR0eS0+Y2Fub25faGVhZCAtIHR0eS0+cmVhZF90YWlsIDoKKwkJCXR0eS0+Y2Fub25faGVhZCArIChOX1RUWV9CVUZfU0laRSAtIHR0eS0+cmVhZF90YWlsKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbjsKK30KKworLyoqCisgKglpc191dGY4X2NvbnRpbnVhdGlvbgktCXV0ZjggbXVsdGlieXRlIGNoZWNrCisgKglAYzogYnl0ZSB0byBjaGVjaworICoKKyAqCVJldHVybnMgdHJ1ZSBpZiB0aGUgdXRmOCBjaGFyYWN0ZXIgJ2MnIGlzIGEgbXVsdGlieXRlIGNvbnRpbnVhdGlvbgorICoJY2hhcmFjdGVyLiBXZSB1c2UgdGhpcyB0byBjb3JyZWN0bHkgY29tcHV0ZSB0aGUgb24gc2NyZWVuIHNpemUKKyAqCW9mIHRoZSBjaGFyYWN0ZXIgd2hlbiBwcmludGluZworICovCisgCitzdGF0aWMgaW5saW5lIGludCBpc191dGY4X2NvbnRpbnVhdGlvbih1bnNpZ25lZCBjaGFyIGMpCit7CisJcmV0dXJuIChjICYgMHhjMCkgPT0gMHg4MDsKK30KKworLyoqCisgKglpc19jb250aW51YXRpb24JCS0JbXVsdGlieXRlIGNoZWNrCisgKglAYzogYnl0ZSB0byBjaGVjaworICoKKyAqCVJldHVybnMgdHJ1ZSBpZiB0aGUgdXRmOCBjaGFyYWN0ZXIgJ2MnIGlzIGEgbXVsdGlieXRlIGNvbnRpbnVhdGlvbgorICoJY2hhcmFjdGVyIGFuZCB0aGUgdGVybWluYWwgaXMgaW4gdW5pY29kZSBtb2RlLgorICovCisgCitzdGF0aWMgaW5saW5lIGludCBpc19jb250aW51YXRpb24odW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybiBJX0lVVEY4KHR0eSkgJiYgaXNfdXRmOF9jb250aW51YXRpb24oYyk7Cit9CisKKy8qKgorICoJb3Bvc3QJCQktCW91dHB1dCBwb3N0IHByb2Nlc3NvcgorICoJQGM6IGNoYXJhY3RlciAob3IgcGFydGlhbCB1bmljb2RlIHN5bWJvbCkKKyAqCUB0dHk6IHRlcm1pbmFsIGRldmljZQorICoKKyAqCVBlcmZvcm0gT1BPU1QgcHJvY2Vzc2luZy4gIFJldHVybnMgLTEgd2hlbiB0aGUgb3V0cHV0IGRldmljZSBpcworICoJZnVsbCBhbmQgdGhlIGNoYXJhY3RlciBtdXN0IGJlIHJldHJpZWQuIE5vdGUgdGhhdCBMaW51eCBjdXJyZW50bHkKKyAqCWlnbm9yZXMgVEFCRExZLCBDUkRMWSwgVlRETFksIEZGRExZIGFuZCBOTERMWS4gVGhleSBzaW1wbHkgYXJlbid0CisgKglyZWxldmFudCBpbiB0aGUgd29ybGQgdG9kYXkuIElmIHlvdSBldmVyIG5lZWQgdGhlbSwgYWRkIHRoZW0gaGVyZS4KKyAqCisgKglDYWxsZWQgZnJvbSBib3RoIHRoZSByZWNlaXZlIGFuZCB0cmFuc21pdCBzaWRlcyBhbmQgY2FuIGJlIGNhbGxlZAorICoJcmUtZW50cmFudGx5LiBSZWxpZXMgb24gbG9ja19rZXJuZWwoKSBzdGlsbC4KKyAqLworIAorc3RhdGljIGludCBvcG9zdCh1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaW50CXNwYWNlLCBzcGFjZXM7CisKKwlzcGFjZSA9IHR0eS0+ZHJpdmVyLT53cml0ZV9yb29tKHR0eSk7CisJaWYgKCFzcGFjZSkKKwkJcmV0dXJuIC0xOworCisJaWYgKE9fT1BPU1QodHR5KSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnXG4nOgorCQkJaWYgKE9fT05MUkVUKHR0eSkpCisJCQkJdHR5LT5jb2x1bW4gPSAwOworCQkJaWYgKE9fT05MQ1IodHR5KSkgeworCQkJCWlmIChzcGFjZSA8IDIpCisJCQkJCXJldHVybiAtMTsKKwkJCQl0dHktPmRyaXZlci0+cHV0X2NoYXIodHR5LCAnXHInKTsKKwkJCQl0dHktPmNvbHVtbiA9IDA7CisJCQl9CisJCQl0dHktPmNhbm9uX2NvbHVtbiA9IHR0eS0+Y29sdW1uOworCQkJYnJlYWs7CisJCWNhc2UgJ1xyJzoKKwkJCWlmIChPX09OT0NSKHR0eSkgJiYgdHR5LT5jb2x1bW4gPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChPX09DUk5MKHR0eSkpIHsKKwkJCQljID0gJ1xuJzsKKwkJCQlpZiAoT19PTkxSRVQodHR5KSkKKwkJCQkJdHR5LT5jYW5vbl9jb2x1bW4gPSB0dHktPmNvbHVtbiA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0dHktPmNhbm9uX2NvbHVtbiA9IHR0eS0+Y29sdW1uID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdcdCc6CisJCQlzcGFjZXMgPSA4IC0gKHR0eS0+Y29sdW1uICYgNyk7CisJCQlpZiAoT19UQUJETFkodHR5KSA9PSBYVEFCUykgeworCQkJCWlmIChzcGFjZSA8IHNwYWNlcykKKwkJCQkJcmV0dXJuIC0xOworCQkJCXR0eS0+Y29sdW1uICs9IHNwYWNlczsKKwkJCQl0dHktPmRyaXZlci0+d3JpdGUodHR5LCAiICAgICAgICAiLCBzcGFjZXMpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJdHR5LT5jb2x1bW4gKz0gc3BhY2VzOworCQkJYnJlYWs7CisJCWNhc2UgJ1xiJzoKKwkJCWlmICh0dHktPmNvbHVtbiA+IDApCisJCQkJdHR5LT5jb2x1bW4tLTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKE9fT0xDVUModHR5KSkKKwkJCQljID0gdG91cHBlcihjKTsKKwkJCWlmICghaXNjbnRybChjKSAmJiAhaXNfY29udGludWF0aW9uKGMsIHR0eSkpCisJCQkJdHR5LT5jb2x1bW4rKzsKKwkJCWJyZWFrOworCQl9CisJfQorCXR0eS0+ZHJpdmVyLT5wdXRfY2hhcih0dHksIGMpOworCXJldHVybiAwOworfQorCisvKioKKyAqCW9wb3N0X2Jsb2NrCQktCWJsb2NrIHBvc3Rwcm9jZXNzCisgKglAdHR5OiB0ZXJtaW5hbCBkZXZpY2UKKyAqCUBpbmJ1ZjogdXNlciBidWZmZXIKKyAqCUBucjogbnVtYmVyIG9mIGJ5dGVzCisgKgorICoJVGhpcyBwYXRoIGlzIHVzZWQgdG8gc3BlZWQgdXAgYmxvY2sgY29uc29sZSB3cml0ZXMsIGFtb25nIG90aGVyCisgKgl0aGluZ3Mgd2hlbiBwcm9jZXNzaW5nIGJsb2NrcyBvZiBvdXRwdXQgZGF0YS4gSXQgaGFuZGxlcyBvbmx5CisgKgl0aGUgc2ltcGxlIGNhc2VzIG5vcm1hbGx5IGZvdW5kIGFuZCBoZWxwcyB0byBnZW5lcmF0ZSBibG9ja3Mgb2YKKyAqCXN5bWJvbHMgZm9yIHRoZSBjb25zb2xlIGRyaXZlciBhbmQgdGh1cyBpbXByb3ZlIHBlcmZvcm1hbmNlLgorICoKKyAqCUNhbGxlZCBmcm9tIHdyaXRlX2NoYW4gdW5kZXIgdGhlIHR0eSBsYXllciB3cml0ZSBsb2NrLgorICovCisgCitzdGF0aWMgc3NpemVfdCBvcG9zdF9ibG9jayhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWYsIHVuc2lnbmVkIGludCBucikKK3sKKwlpbnQJc3BhY2U7CisJaW50IAlpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwOworCisJc3BhY2UgPSB0dHktPmRyaXZlci0+d3JpdGVfcm9vbSh0dHkpOworCWlmICghc3BhY2UpCisJCXJldHVybiAwOworCWlmIChuciA+IHNwYWNlKQorCQluciA9IHNwYWNlOworCisJZm9yIChpID0gMCwgY3AgPSBidWY7IGkgPCBucjsgaSsrLCBjcCsrKSB7CisJCXN3aXRjaCAoKmNwKSB7CisJCWNhc2UgJ1xuJzoKKwkJCWlmIChPX09OTFJFVCh0dHkpKQorCQkJCXR0eS0+Y29sdW1uID0gMDsKKwkJCWlmIChPX09OTENSKHR0eSkpCisJCQkJZ290byBicmVha19vdXQ7CisJCQl0dHktPmNhbm9uX2NvbHVtbiA9IHR0eS0+Y29sdW1uOworCQkJYnJlYWs7CisJCWNhc2UgJ1xyJzoKKwkJCWlmIChPX09OT0NSKHR0eSkgJiYgdHR5LT5jb2x1bW4gPT0gMCkKKwkJCQlnb3RvIGJyZWFrX291dDsKKwkJCWlmIChPX09DUk5MKHR0eSkpCisJCQkJZ290byBicmVha19vdXQ7CisJCQl0dHktPmNhbm9uX2NvbHVtbiA9IHR0eS0+Y29sdW1uID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdcdCc6CisJCQlnb3RvIGJyZWFrX291dDsKKwkJY2FzZSAnXGInOgorCQkJaWYgKHR0eS0+Y29sdW1uID4gMCkKKwkJCQl0dHktPmNvbHVtbi0tOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoT19PTENVQyh0dHkpKQorCQkJCWdvdG8gYnJlYWtfb3V0OworCQkJaWYgKCFpc2NudHJsKCpjcCkpCisJCQkJdHR5LT5jb2x1bW4rKzsKKwkJCWJyZWFrOworCQl9CisJfQorYnJlYWtfb3V0OgorCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfY2hhcnMpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9jaGFycyh0dHkpOworCWkgPSB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBidWYsIGkpOwkKKwlyZXR1cm4gaTsKK30KKworCisvKioKKyAqCXB1dF9jaGFyCS0Jd3JpdGUgY2hhcmFjdGVyIHRvIGRyaXZlcgorICoJQGM6IGNoYXJhY3RlciAob3IgcGFydCBvZiB1bmljb2RlIHN5bWJvbCkKKyAqCUB0dHk6IHRlcm1pbmFsIGRldmljZQorICoKKyAqCVF1ZXVlIGEgYnl0ZSB0byB0aGUgZHJpdmVyIGxheWVyIGZvciBvdXRwdXQKKyAqLworIAorc3RhdGljIGlubGluZSB2b2lkIHB1dF9jaGFyKHVuc2lnbmVkIGNoYXIgYywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwl0dHktPmRyaXZlci0+cHV0X2NoYXIodHR5LCBjKTsKK30KKworLyoqCisgKgllY2hvX2NoYXIJLQllY2hvIGNoYXJhY3RlcnMKKyAqCUBjOiB1bmljb2RlIGJ5dGUgdG8gZWNobworICoJQHR0eTogdGVybWluYWwgZGV2aWNlCisgKgorICoJRWNobyB1c2VyIGlucHV0IGJhY2sgb250byB0aGUgc2NyZWVuLiBUaGlzIG11c3QgYmUgY2FsbGVkIG9ubHkgd2hlbiAKKyAqCUxfRUNITyh0dHkpIGlzIHRydWUuIENhbGxlZCBmcm9tIHRoZSBkcml2ZXIgcmVjZWl2ZV9idWYgcGF0aC4KKyAqLworCitzdGF0aWMgdm9pZCBlY2hvX2NoYXIodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmIChMX0VDSE9DVEwodHR5KSAmJiBpc2NudHJsKGMpICYmIGMgIT0gJ1x0JykgeworCQlwdXRfY2hhcignXicsIHR0eSk7CisJCXB1dF9jaGFyKGMgXiAwMTAwLCB0dHkpOworCQl0dHktPmNvbHVtbiArPSAyOworCX0gZWxzZQorCQlvcG9zdChjLCB0dHkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmluaXNoX2VyYXNpbmcoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAodHR5LT5lcmFzaW5nKSB7CisJCXB1dF9jaGFyKCcvJywgdHR5KTsKKwkJdHR5LT5jb2x1bW4rKzsKKwkJdHR5LT5lcmFzaW5nID0gMDsKKwl9Cit9CisKKy8qKgorICoJZXJhc2VyCQktCWhhbmRsZSBlcmFzZSBmdW5jdGlvbgorICoJQGM6IGNoYXJhY3RlciBpbnB1dAorICoJQHR0eTogdGVybWluYWwgZGV2aWNlCisgKgorICoJUGVyZm9ybSBlcmFzZSBhbmQgbmVjY2Vzc2FyeSBvdXRwdXQgd2hlbiBhbiBlcmFzZSBjaGFyYWN0ZXIgaXMKKyAqCXByZXNlbnQgaW4gdGhlIHN0cmVhbSBmcm9tIHRoZSBkcml2ZXIgbGF5ZXIuIEhhbmRsZXMgdGhlIGNvbXBsZXhpdGllcworICoJb2YgVVRGLTggbXVsdGlieXRlIHN5bWJvbHMuCisgKi8KKyAKK3N0YXRpYyB2b2lkIGVyYXNlcih1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJZW51bSB7IEVSQVNFLCBXRVJBU0UsIEtJTEwgfSBraWxsX3R5cGU7CisJaW50IGhlYWQsIHNlZW5fYWxudW1zLCBjbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh0dHktPnJlYWRfaGVhZCA9PSB0dHktPmNhbm9uX2hlYWQpIHsKKwkJLyogb3Bvc3QoJ1xhJywgdHR5KTsgKi8JCS8qIHdoYXQgZG8geW91IHRoaW5rPyAqLworCQlyZXR1cm47CisJfQorCWlmIChjID09IEVSQVNFX0NIQVIodHR5KSkKKwkJa2lsbF90eXBlID0gRVJBU0U7CisJZWxzZSBpZiAoYyA9PSBXRVJBU0VfQ0hBUih0dHkpKQorCQlraWxsX3R5cGUgPSBXRVJBU0U7CisJZWxzZSB7CisJCWlmICghTF9FQ0hPKHR0eSkpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCQkJdHR5LT5yZWFkX2NudCAtPSAoKHR0eS0+cmVhZF9oZWFkIC0gdHR5LT5jYW5vbl9oZWFkKSAmCisJCQkJCSAgKE5fVFRZX0JVRl9TSVpFIC0gMSkpOworCQkJdHR5LT5yZWFkX2hlYWQgPSB0dHktPmNhbm9uX2hlYWQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJCWlmICghTF9FQ0hPSyh0dHkpIHx8ICFMX0VDSE9LRSh0dHkpIHx8ICFMX0VDSE9FKHR0eSkpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCQkJdHR5LT5yZWFkX2NudCAtPSAoKHR0eS0+cmVhZF9oZWFkIC0gdHR5LT5jYW5vbl9oZWFkKSAmCisJCQkJCSAgKE5fVFRZX0JVRl9TSVpFIC0gMSkpOworCQkJdHR5LT5yZWFkX2hlYWQgPSB0dHktPmNhbm9uX2hlYWQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCQkJZmluaXNoX2VyYXNpbmcodHR5KTsKKwkJCWVjaG9fY2hhcihLSUxMX0NIQVIodHR5KSwgdHR5KTsKKwkJCS8qIEFkZCBhIG5ld2xpbmUgaWYgRUNIT0sgaXMgb24gYW5kIEVDSE9LRSBpcyBvZmYuICovCisJCQlpZiAoTF9FQ0hPSyh0dHkpKQorCQkJCW9wb3N0KCdcbicsIHR0eSk7CisJCQlyZXR1cm47CisJCX0KKwkJa2lsbF90eXBlID0gS0lMTDsKKwl9CisKKwlzZWVuX2FsbnVtcyA9IDA7CisJd2hpbGUgKHR0eS0+cmVhZF9oZWFkICE9IHR0eS0+Y2Fub25faGVhZCkgeworCQloZWFkID0gdHR5LT5yZWFkX2hlYWQ7CisKKwkJLyogZXJhc2UgYSBzaW5nbGUgcG9zc2libHkgbXVsdGlieXRlIGNoYXJhY3RlciAqLworCQlkbyB7CisJCQloZWFkID0gKGhlYWQgLSAxKSAmIChOX1RUWV9CVUZfU0laRS0xKTsKKwkJCWMgPSB0dHktPnJlYWRfYnVmW2hlYWRdOworCQl9IHdoaWxlIChpc19jb250aW51YXRpb24oYywgdHR5KSAmJiBoZWFkICE9IHR0eS0+Y2Fub25faGVhZCk7CisKKwkJLyogZG8gbm90IHBhcnRpYWxseSBlcmFzZSAqLworCQlpZiAoaXNfY29udGludWF0aW9uKGMsIHR0eSkpCisJCQlicmVhazsKKworCQlpZiAoa2lsbF90eXBlID09IFdFUkFTRSkgeworCQkJLyogRXF1aXZhbGVudCB0byBCU0QncyBBTFRXRVJBU0UuICovCisJCQlpZiAoaXNhbG51bShjKSB8fCBjID09ICdfJykKKwkJCQlzZWVuX2FsbnVtcysrOworCQkJZWxzZSBpZiAoc2Vlbl9hbG51bXMpCisJCQkJYnJlYWs7CisJCX0KKwkJY250ID0gKHR0eS0+cmVhZF9oZWFkIC0gaGVhZCkgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCQl0dHktPnJlYWRfaGVhZCA9IGhlYWQ7CisJCXR0eS0+cmVhZF9jbnQgLT0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCQlpZiAoTF9FQ0hPKHR0eSkpIHsKKwkJCWlmIChMX0VDSE9QUlQodHR5KSkgeworCQkJCWlmICghdHR5LT5lcmFzaW5nKSB7CisJCQkJCXB1dF9jaGFyKCdcXCcsIHR0eSk7CisJCQkJCXR0eS0+Y29sdW1uKys7CisJCQkJCXR0eS0+ZXJhc2luZyA9IDE7CisJCQkJfQorCQkJCS8qIGlmIGNudCA+IDEsIG91dHB1dCBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyICovCisJCQkJZWNob19jaGFyKGMsIHR0eSk7CisJCQkJd2hpbGUgKC0tY250ID4gMCkgeworCQkJCQloZWFkID0gKGhlYWQrMSkgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CisJCQkJCXB1dF9jaGFyKHR0eS0+cmVhZF9idWZbaGVhZF0sIHR0eSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChraWxsX3R5cGUgPT0gRVJBU0UgJiYgIUxfRUNIT0UodHR5KSkgeworCQkJCWVjaG9fY2hhcihFUkFTRV9DSEFSKHR0eSksIHR0eSk7CisJCQl9IGVsc2UgaWYgKGMgPT0gJ1x0JykgeworCQkJCXVuc2lnbmVkIGludCBjb2wgPSB0dHktPmNhbm9uX2NvbHVtbjsKKwkJCQl1bnNpZ25lZCBsb25nIHRhaWwgPSB0dHktPmNhbm9uX2hlYWQ7CisKKwkJCQkvKiBGaW5kIHRoZSBjb2x1bW4gb2YgdGhlIGxhc3QgY2hhci4gKi8KKwkJCQl3aGlsZSAodGFpbCAhPSB0dHktPnJlYWRfaGVhZCkgeworCQkJCQljID0gdHR5LT5yZWFkX2J1Zlt0YWlsXTsKKwkJCQkJaWYgKGMgPT0gJ1x0JykKKwkJCQkJCWNvbCA9IChjb2wgfCA3KSArIDE7CisJCQkJCWVsc2UgaWYgKGlzY250cmwoYykpIHsKKwkJCQkJCWlmIChMX0VDSE9DVEwodHR5KSkKKwkJCQkJCQljb2wgKz0gMjsKKwkJCQkJfSBlbHNlIGlmICghaXNfY29udGludWF0aW9uKGMsIHR0eSkpCisJCQkJCQljb2wrKzsKKwkJCQkJdGFpbCA9ICh0YWlsKzEpICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCQkJCX0KKworCQkJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCQlpZiAodHR5LT5jb2x1bW4gPiAweDgwMDAwMDAwKQorCQkJCQl0dHktPmNvbHVtbiA9IDA7IAorCisJCQkJLyogTm93IGJhY2t1cCB0byB0aGF0IGNvbHVtbi4gKi8KKwkJCQl3aGlsZSAodHR5LT5jb2x1bW4gPiBjb2wpIHsKKwkJCQkJLyogQ2FuJ3QgdXNlIG9wb3N0IGhlcmUuICovCisJCQkJCXB1dF9jaGFyKCdcYicsIHR0eSk7CisJCQkJCWlmICh0dHktPmNvbHVtbiA+IDApCisJCQkJCQl0dHktPmNvbHVtbi0tOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGlzY250cmwoYykgJiYgTF9FQ0hPQ1RMKHR0eSkpIHsKKwkJCQkJcHV0X2NoYXIoJ1xiJywgdHR5KTsKKwkJCQkJcHV0X2NoYXIoJyAnLCB0dHkpOworCQkJCQlwdXRfY2hhcignXGInLCB0dHkpOworCQkJCQlpZiAodHR5LT5jb2x1bW4gPiAwKQorCQkJCQkJdHR5LT5jb2x1bW4tLTsKKwkJCQl9CisJCQkJaWYgKCFpc2NudHJsKGMpIHx8IExfRUNIT0NUTCh0dHkpKSB7CisJCQkJCXB1dF9jaGFyKCdcYicsIHR0eSk7CisJCQkJCXB1dF9jaGFyKCcgJywgdHR5KTsKKwkJCQkJcHV0X2NoYXIoJ1xiJywgdHR5KTsKKwkJCQkJaWYgKHR0eS0+Y29sdW1uID4gMCkKKwkJCQkJCXR0eS0+Y29sdW1uLS07CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChraWxsX3R5cGUgPT0gRVJBU0UpCisJCQlicmVhazsKKwl9CisJaWYgKHR0eS0+cmVhZF9oZWFkID09IHR0eS0+Y2Fub25faGVhZCkKKwkJZmluaXNoX2VyYXNpbmcodHR5KTsKK30KKworLyoqCisgKglpc2lnCQktCWhhbmRsZSB0aGUgSVNJRyBvcHRpbworICoJQHNpZzogc2lnbmFsCisgKglAdHR5OiB0ZXJtaW5hbAorICoJQGZsdXNoOiBmb3JjZSBmbHVzaAorICoKKyAqCUNhbGxlZCB3aGVuIGEgc2lnbmFsIGlzIGJlaW5nIHNlbnQgZHVlIHRvIHRlcm1pbmFsIGlucHV0LiBUaGlzCisgKgltYXkgY2F1cyB0ZXJtaW5hbCBmbHVzaGluZyB0byB0YWtlIHBsYWNlIGFjY29yZGluZyB0byB0aGUgdGVybWlvcworICoJc2V0dGluZ3MgYW5kIGNoYXJhY3RlciB1c2VkLiBDYWxsZWQgZnJvbSB0aGUgZHJpdmVyIHJlY2VpdmVfYnVmCisgKglwYXRoIHNvIHNlcmlhbGl6ZWQuCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2lnKGludCBzaWcsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBmbHVzaCkKK3sKKwlpZiAodHR5LT5wZ3JwID4gMCkKKwkJa2lsbF9wZyh0dHktPnBncnAsIHNpZywgMSk7CisJaWYgKGZsdXNoIHx8ICFMX05PRkxTSCh0dHkpKSB7CisJCW5fdHR5X2ZsdXNoX2J1ZmZlcih0dHkpOworCQlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwl9Cit9CisKKy8qKgorICoJbl90dHlfcmVjZWl2ZV9icmVhawktCWhhbmRsZSBicmVhaworICoJQHR0eTogdGVybWluYWwKKyAqCisgKglBbiBSUzIzMiBicmVhayBldmVudCBoYXMgYmVlbiBoaXQgaW4gdGhlIGluY29taW5nIGJpdHN0cmVhbS4gVGhpcworICoJY2FuIGNhdXNlIGEgdmFyaWV0eSBvZiBldmVudHMgZGVwZW5kaW5nIHVwb24gdGhlIHRlcm1pb3Mgc2V0dGluZ3MuCisgKgorICoJQ2FsbGVkIGZyb20gdGhlIHJlY2VpdmVfYnVmIHBhdGggc28gc2luZ2xlIHRocmVhZGVkLgorICovCisgCitzdGF0aWMgaW5saW5lIHZvaWQgbl90dHlfcmVjZWl2ZV9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmIChJX0lHTkJSSyh0dHkpKQorCQlyZXR1cm47CisJaWYgKElfQlJLSU5UKHR0eSkpIHsKKwkJaXNpZyhTSUdJTlQsIHR0eSwgMSk7CisJCXJldHVybjsKKwl9CisJaWYgKElfUEFSTVJLKHR0eSkpIHsKKwkJcHV0X3R0eV9xdWV1ZSgnXDM3NycsIHR0eSk7CisJCXB1dF90dHlfcXVldWUoJ1wwJywgdHR5KTsKKwl9CisJcHV0X3R0eV9xdWV1ZSgnXDAnLCB0dHkpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5yZWFkX3dhaXQpOworfQorCisvKioKKyAqCW5fdHR5X3JlY2VpdmVfb3ZlcnJ1bgktCWhhbmRsZSBvdmVycnVuIHJlcG9ydGluZworICoJQHR0eTogdGVybWluYWwKKyAqCisgKglEYXRhIGFycml2ZWQgZmFzdGVyIHRoYW4gd2UgY291bGQgcHJvY2VzcyBpdC4gV2hpbGUgdGhlIHR0eQorICoJZHJpdmVyIGhhcyBmbGFnZ2VkIHRoaXMgdGhlIGJpdHMgdGhhdCB3ZXJlIG1pc3NlZCBhcmUgZ29uZQorICoJZm9yZXZlci4KKyAqCisgKglDYWxsZWQgZnJvbSB0aGUgcmVjZWl2ZV9idWYgcGF0aCBzbyBzaW5nbGUgdGhyZWFkZWQuIERvZXMgbm90CisgKgluZWVkIGxvY2tpbmcgYXMgbnVtX292ZXJydW4gYW5kIG92ZXJydW5fdGltZSBhcmUgZnVuY3Rpb24KKyAqCXByaXZhdGUuCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgdm9pZCBuX3R0eV9yZWNlaXZlX292ZXJydW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwljaGFyIGJ1Zls2NF07CisKKwl0dHktPm51bV9vdmVycnVuKys7CisJaWYgKHRpbWVfYmVmb3JlKHR0eS0+b3ZlcnJ1bl90aW1lLCBqaWZmaWVzIC0gSFopIHx8CisJCQl0aW1lX2FmdGVyKHR0eS0+b3ZlcnJ1bl90aW1lLCBqaWZmaWVzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJWQgaW5wdXQgb3ZlcnJ1bihzKVxuIiwKKwkJCXR0eV9uYW1lKHR0eSwgYnVmKSwKKwkJCXR0eS0+bnVtX292ZXJydW4pOworCQl0dHktPm92ZXJydW5fdGltZSA9IGppZmZpZXM7CisJCXR0eS0+bnVtX292ZXJydW4gPSAwOworCX0KK30KKworLyoqCisgKgluX3R0eV9yZWNlaXZlX3Bhcml0eV9lcnJvcgktCWVycm9yIG5vdGlmaWVyCisgKglAdHR5OiB0ZXJtaW5hbCBkZXZpY2UKKyAqCUBjOiBjaGFyYWN0ZXIKKyAqCisgKglQcm9jZXNzIGEgcGFyaXR5IGVycm9yIGFuZCBxdWV1ZSB0aGUgcmlnaHQgZGF0YSB0byBpbmRpY2F0ZQorICoJdGhlIGVycm9yIGNhc2UgaWYgbmVjY2Vzc2FyeS4gTG9ja2luZyBhcyBwZXIgbl90dHlfcmVjZWl2ZV9idWYuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuX3R0eV9yZWNlaXZlX3Bhcml0eV9lcnJvcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCQkgICAgICB1bnNpZ25lZCBjaGFyIGMpCit7CisJaWYgKElfSUdOUEFSKHR0eSkpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoSV9QQVJNUksodHR5KSkgeworCQlwdXRfdHR5X3F1ZXVlKCdcMzc3JywgdHR5KTsKKwkJcHV0X3R0eV9xdWV1ZSgnXDAnLCB0dHkpOworCQlwdXRfdHR5X3F1ZXVlKGMsIHR0eSk7CisJfSBlbHNlCWlmIChJX0lOUENLKHR0eSkpCisJCXB1dF90dHlfcXVldWUoJ1wwJywgdHR5KTsKKwllbHNlCisJCXB1dF90dHlfcXVldWUoYywgdHR5KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cmVhZF93YWl0KTsKK30KKworLyoqCisgKgluX3R0eV9yZWNlaXZlX2NoYXIJLQlwZXJmb3JtIHByb2Nlc3NpbmcKKyAqCUB0dHk6IHRlcm1pbmFsIGRldmljZQorICoJQGM6IGNoYXJhY3RlcgorICoKKyAqCVByb2Nlc3MgYW4gaW5kaXZpZHVhbCBjaGFyYWN0ZXIgb2YgaW5wdXQgcmVjZWl2ZWQgZnJvbSB0aGUgZHJpdmVyLgorICoJVGhpcyBpcyBzZXJpYWxpemVkIHdpdGggcmVzcGVjdCB0byBpdHNlbGYgYnkgdGhlIHJ1bGVzIGZvciB0aGUgCisgKglkcml2ZXIgYWJvdmUuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIG5fdHR5X3JlY2VpdmVfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh0dHktPnJhdykgeworCQlwdXRfdHR5X3F1ZXVlKGMsIHR0eSk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKHR0eS0+c3RvcHBlZCAmJiAhdHR5LT5mbG93X3N0b3BwZWQgJiYKKwkgICAgSV9JWE9OKHR0eSkgJiYgSV9JWEFOWSh0dHkpKSB7CisJCXN0YXJ0X3R0eSh0dHkpOworCQlyZXR1cm47CisJfQorCQorCWlmIChJX0lTVFJJUCh0dHkpKQorCQljICY9IDB4N2Y7CisJaWYgKElfSVVDTEModHR5KSAmJiBMX0lFWFRFTih0dHkpKQorCQljPXRvbG93ZXIoYyk7CisKKwlpZiAodHR5LT5jbG9zaW5nKSB7CisJCWlmIChJX0lYT04odHR5KSkgeworCQkJaWYgKGMgPT0gU1RBUlRfQ0hBUih0dHkpKQorCQkJCXN0YXJ0X3R0eSh0dHkpOworCQkJZWxzZSBpZiAoYyA9PSBTVE9QX0NIQVIodHR5KSkKKwkJCQlzdG9wX3R0eSh0dHkpOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgd2FzIExORVhULCBvciB3ZSBrbm93IHRoYXQgdGhpcworCSAqIGNoYXJhY3RlciBpcyBub3Qgb25lIG9mIHRoZSBjaGFyYWN0ZXJzIHRoYXQgd2UnbGwgaGF2ZSB0bworCSAqIGhhbmRsZSBzcGVjaWFsbHksIGRvIHNob3J0Y3V0IHByb2Nlc3NpbmcgdG8gc3BlZWQgdGhpbmdzCisJICogdXAuCisJICovCisJaWYgKCF0ZXN0X2JpdChjLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApIHx8IHR0eS0+bG5leHQpIHsKKwkJZmluaXNoX2VyYXNpbmcodHR5KTsKKwkJdHR5LT5sbmV4dCA9IDA7CisJCWlmIChMX0VDSE8odHR5KSkgeworCQkJaWYgKHR0eS0+cmVhZF9jbnQgPj0gTl9UVFlfQlVGX1NJWkUtMSkgeworCQkJCXB1dF9jaGFyKCdcYScsIHR0eSk7IC8qIGJlZXAgaWYgbm8gc3BhY2UgKi8KKwkJCQlyZXR1cm47CisJCQl9CisJCQkvKiBSZWNvcmQgdGhlIGNvbHVtbiBvZiBmaXJzdCBjYW5vbiBjaGFyLiAqLworCQkJaWYgKHR0eS0+Y2Fub25faGVhZCA9PSB0dHktPnJlYWRfaGVhZCkKKwkJCQl0dHktPmNhbm9uX2NvbHVtbiA9IHR0eS0+Y29sdW1uOworCQkJZWNob19jaGFyKGMsIHR0eSk7CisJCX0KKwkJaWYgKElfUEFSTVJLKHR0eSkgJiYgYyA9PSAodW5zaWduZWQgY2hhcikgJ1wzNzcnKQorCQkJcHV0X3R0eV9xdWV1ZShjLCB0dHkpOworCQlwdXRfdHR5X3F1ZXVlKGMsIHR0eSk7CisJCXJldHVybjsKKwl9CisJCQorCWlmIChjID09ICdccicpIHsKKwkJaWYgKElfSUdOQ1IodHR5KSkKKwkJCXJldHVybjsKKwkJaWYgKElfSUNSTkwodHR5KSkKKwkJCWMgPSAnXG4nOworCX0gZWxzZSBpZiAoYyA9PSAnXG4nICYmIElfSU5MQ1IodHR5KSkKKwkJYyA9ICdccic7CisJaWYgKElfSVhPTih0dHkpKSB7CisJCWlmIChjID09IFNUQVJUX0NIQVIodHR5KSkgeworCQkJc3RhcnRfdHR5KHR0eSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGMgPT0gU1RPUF9DSEFSKHR0eSkpIHsKKwkJCXN0b3BfdHR5KHR0eSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKExfSVNJRyh0dHkpKSB7CisJCWludCBzaWduYWw7CisJCXNpZ25hbCA9IFNJR0lOVDsKKwkJaWYgKGMgPT0gSU5UUl9DSEFSKHR0eSkpCisJCQlnb3RvIHNlbmRfc2lnbmFsOworCQlzaWduYWwgPSBTSUdRVUlUOworCQlpZiAoYyA9PSBRVUlUX0NIQVIodHR5KSkKKwkJCWdvdG8gc2VuZF9zaWduYWw7CisJCXNpZ25hbCA9IFNJR1RTVFA7CisJCWlmIChjID09IFNVU1BfQ0hBUih0dHkpKSB7CitzZW5kX3NpZ25hbDoKKwkJCWlzaWcoc2lnbmFsLCB0dHksIDApOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmICh0dHktPmljYW5vbikgeworCQlpZiAoYyA9PSBFUkFTRV9DSEFSKHR0eSkgfHwgYyA9PSBLSUxMX0NIQVIodHR5KSB8fAorCQkgICAgKGMgPT0gV0VSQVNFX0NIQVIodHR5KSAmJiBMX0lFWFRFTih0dHkpKSkgeworCQkJZXJhc2VyKGMsIHR0eSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGMgPT0gTE5FWFRfQ0hBUih0dHkpICYmIExfSUVYVEVOKHR0eSkpIHsKKwkJCXR0eS0+bG5leHQgPSAxOworCQkJaWYgKExfRUNITyh0dHkpKSB7CisJCQkJZmluaXNoX2VyYXNpbmcodHR5KTsKKwkJCQlpZiAoTF9FQ0hPQ1RMKHR0eSkpIHsKKwkJCQkJcHV0X2NoYXIoJ14nLCB0dHkpOworCQkJCQlwdXRfY2hhcignXGInLCB0dHkpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQlpZiAoYyA9PSBSRVBSSU5UX0NIQVIodHR5KSAmJiBMX0VDSE8odHR5KSAmJgorCQkgICAgTF9JRVhURU4odHR5KSkgeworCQkJdW5zaWduZWQgbG9uZyB0YWlsID0gdHR5LT5jYW5vbl9oZWFkOworCisJCQlmaW5pc2hfZXJhc2luZyh0dHkpOworCQkJZWNob19jaGFyKGMsIHR0eSk7CisJCQlvcG9zdCgnXG4nLCB0dHkpOworCQkJd2hpbGUgKHRhaWwgIT0gdHR5LT5yZWFkX2hlYWQpIHsKKwkJCQllY2hvX2NoYXIodHR5LT5yZWFkX2J1Zlt0YWlsXSwgdHR5KTsKKwkJCQl0YWlsID0gKHRhaWwrMSkgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGMgPT0gJ1xuJykgeworCQkJaWYgKExfRUNITyh0dHkpIHx8IExfRUNIT05MKHR0eSkpIHsKKwkJCQlpZiAodHR5LT5yZWFkX2NudCA+PSBOX1RUWV9CVUZfU0laRS0xKSB7CisJCQkJCXB1dF9jaGFyKCdcYScsIHR0eSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJb3Bvc3QoJ1xuJywgdHR5KTsKKwkJCX0KKwkJCWdvdG8gaGFuZGxlX25ld2xpbmU7CisJCX0KKwkJaWYgKGMgPT0gRU9GX0NIQVIodHR5KSkgeworCQkgICAgICAgIGlmICh0dHktPmNhbm9uX2hlYWQgIT0gdHR5LT5yZWFkX2hlYWQpCisJCQkgICAgICAgIHNldF9iaXQoVFRZX1BVU0gsICZ0dHktPmZsYWdzKTsKKwkJCWMgPSBfX0RJU0FCTEVEX0NIQVI7CisJCQlnb3RvIGhhbmRsZV9uZXdsaW5lOworCQl9CisJCWlmICgoYyA9PSBFT0xfQ0hBUih0dHkpKSB8fAorCQkgICAgKGMgPT0gRU9MMl9DSEFSKHR0eSkgJiYgTF9JRVhURU4odHR5KSkpIHsKKwkJCS8qCisJCQkgKiBYWFggYXJlIEVPTF9DSEFSIGFuZCBFT0wyX0NIQVIgZWNob2VkPyE/CisJCQkgKi8KKwkJCWlmIChMX0VDSE8odHR5KSkgeworCQkJCWlmICh0dHktPnJlYWRfY250ID49IE5fVFRZX0JVRl9TSVpFLTEpIHsKKwkJCQkJcHV0X2NoYXIoJ1xhJywgdHR5KTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQkvKiBSZWNvcmQgdGhlIGNvbHVtbiBvZiBmaXJzdCBjYW5vbiBjaGFyLiAqLworCQkJCWlmICh0dHktPmNhbm9uX2hlYWQgPT0gdHR5LT5yZWFkX2hlYWQpCisJCQkJCXR0eS0+Y2Fub25fY29sdW1uID0gdHR5LT5jb2x1bW47CisJCQkJZWNob19jaGFyKGMsIHR0eSk7CisJCQl9CisJCQkvKgorCQkJICogWFhYIGRvZXMgUEFSTVJLIGRvdWJsaW5nIGhhcHBlbiBmb3IKKwkJCSAqIEVPTF9DSEFSIGFuZCBFT0wyX0NIQVI/CisJCQkgKi8KKwkJCWlmIChJX1BBUk1SSyh0dHkpICYmIGMgPT0gKHVuc2lnbmVkIGNoYXIpICdcMzc3JykKKwkJCQlwdXRfdHR5X3F1ZXVlKGMsIHR0eSk7CisKKwkJaGFuZGxlX25ld2xpbmU6CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJCXNldF9iaXQodHR5LT5yZWFkX2hlYWQsIHR0eS0+cmVhZF9mbGFncyk7CisJCQlwdXRfdHR5X3F1ZXVlX25vbG9jayhjLCB0dHkpOworCQkJdHR5LT5jYW5vbl9oZWFkID0gdHR5LT5yZWFkX2hlYWQ7CisJCQl0dHktPmNhbm9uX2RhdGErKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJCQlraWxsX2Zhc3luYygmdHR5LT5mYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKKwkJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ0dHktPnJlYWRfd2FpdCkpCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnJlYWRfd2FpdCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJCisJZmluaXNoX2VyYXNpbmcodHR5KTsKKwlpZiAoTF9FQ0hPKHR0eSkpIHsKKwkJaWYgKHR0eS0+cmVhZF9jbnQgPj0gTl9UVFlfQlVGX1NJWkUtMSkgeworCQkJcHV0X2NoYXIoJ1xhJywgdHR5KTsgLyogYmVlcCBpZiBubyBzcGFjZSAqLworCQkJcmV0dXJuOworCQl9CisJCWlmIChjID09ICdcbicpCisJCQlvcG9zdCgnXG4nLCB0dHkpOworCQllbHNlIHsKKwkJCS8qIFJlY29yZCB0aGUgY29sdW1uIG9mIGZpcnN0IGNhbm9uIGNoYXIuICovCisJCQlpZiAodHR5LT5jYW5vbl9oZWFkID09IHR0eS0+cmVhZF9oZWFkKQorCQkJCXR0eS0+Y2Fub25fY29sdW1uID0gdHR5LT5jb2x1bW47CisJCQllY2hvX2NoYXIoYywgdHR5KTsKKwkJfQorCX0KKworCWlmIChJX1BBUk1SSyh0dHkpICYmIGMgPT0gKHVuc2lnbmVkIGNoYXIpICdcMzc3JykKKwkJcHV0X3R0eV9xdWV1ZShjLCB0dHkpOworCisJcHV0X3R0eV9xdWV1ZShjLCB0dHkpOworfQkKKworLyoqCisgKgluX3R0eV9yZWNlaXZlX3Jvb20JLQlyZWNlaXZlIHNwYWNlCisgKglAdHR5OiB0ZXJtaW5hbAorICoKKyAqCUNhbGxlZCBieSB0aGUgZHJpdmVyIHRvIGZpbmQgb3V0IGhvdyBtdWNoIGRhdGEgaXQgaXMKKyAqCXBlcm1pdHRlZCB0byBmZWVkIHRvIHRoZSBsaW5lIGRpc2NpcGxpbmUgd2l0aG91dCBhbnkgYmVpbmcgbG9zdAorICoJYW5kIHRodXMgdG8gbWFuYWdlIGZsb3cgY29udHJvbC4gTm90IHNlcmlhbGl6ZWQuIEFuc3dlcnMgZm9yIHRoZQorICoJImluc3RhbnQiLgorICovCisgCitzdGF0aWMgaW50IG5fdHR5X3JlY2VpdmVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludAlsZWZ0ID0gTl9UVFlfQlVGX1NJWkUgLSB0dHktPnJlYWRfY250IC0gMTsKKworCS8qCisJICogSWYgd2UgYXJlIGRvaW5nIGlucHV0IGNhbm9uaWNhbGl6YXRpb24sIGFuZCB0aGVyZSBhcmUgbm8KKwkgKiBwZW5kaW5nIG5ld2xpbmVzLCBsZXQgY2hhcmFjdGVycyB0aHJvdWdoIHdpdGhvdXQgbGltaXQsIHNvCisJICogdGhhdCBlcmFzZSBjaGFyYWN0ZXJzIHdpbGwgYmUgaGFuZGxlZC4gIE90aGVyIGV4Y2VzcworCSAqIGNoYXJhY3RlcnMgd2lsbCBiZSBiZWVwZWQuCisJICovCisJaWYgKHR0eS0+aWNhbm9uICYmICF0dHktPmNhbm9uX2RhdGEpCisJCXJldHVybiBOX1RUWV9CVUZfU0laRTsKKworCWlmIChsZWZ0ID4gMCkKKwkJcmV0dXJuIGxlZnQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJbl90dHlfd3JpdGVfd2FrZXVwCS0JYXN5bmNocm9ub3VzIEkvTyBub3RpZmllcgorICoJQHR0eTogdHR5IGRldmljZQorICoKKyAqCVJlcXVpcmVkIGZvciB0aGUgcHR5cywgc2VyaWFsIGRyaXZlciBldGMuIHNpbmNlIHByb2Nlc3NlcworICoJdGhhdCBhdHRhY2ggdGhlbXNlbHZlcyB0byB0aGUgbWFzdGVyIGFuZCByZWx5IG9uIEFTWU5DCisgKglJTyBtdXN0IGJlIHdva2VuIHVwCisgKi8KKworc3RhdGljIHZvaWQgbl90dHlfd3JpdGVfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaWYgKHR0eS0+ZmFzeW5jKQorCXsKKyAJCXNldF9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnR0eS0+ZmxhZ3MpOworCQlraWxsX2Zhc3luYygmdHR5LT5mYXN5bmMsIFNJR0lPLCBQT0xMX09VVCk7CisJfQorCXJldHVybjsKK30KKworLyoqCisgKgluX3R0eV9yZWNlaXZlX2J1ZgktCWRhdGEgcmVjZWl2ZQorICoJQHR0eTogdGVybWluYWwgZGV2aWNlCisgKglAY3A6IGJ1ZmZlcgorICoJQGZwOiBmbGFnIGJ1ZmZlcgorICoJQGNvdW50OiBjaGFyYWN0ZXJzCisgKgorICoJQ2FsbGVkIGJ5IHRoZSB0ZXJtaW5hbCBkcml2ZXIgd2hlbiBhIGJsb2NrIG9mIGNoYXJhY3RlcnMgaGFzCisgKgliZWVuIHJlY2VpdmVkLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGZyb20gc29mdCBjb250ZXh0cworICoJbm90IGZyb20gaW50ZXJydXB0IGNvbnRleHQuIFRoZSBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZworICoJY2FsbHMgb25lIGF0IGEgdGltZSBhbmQgaW4gb3JkZXIgKG9yIHVzaW5nIGZsdXNoX3RvX2xkaXNjKQorICovCisgCitzdGF0aWMgdm9pZCBuX3R0eV9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwKKwkJCSAgICAgIGNoYXIgKmZwLCBpbnQgY291bnQpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwljaGFyICpmLCBmbGFncyA9IFRUWV9OT1JNQUw7CisJaW50CWk7CisJY2hhcglidWZbNjRdOworCXVuc2lnbmVkIGxvbmcgY3B1ZmxhZ3M7CisKKwlpZiAoIXR0eS0+cmVhZF9idWYpCisJCXJldHVybjsKKworCWlmICh0dHktPnJlYWxfcmF3KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPnJlYWRfbG9jaywgY3B1ZmxhZ3MpOworCQlpID0gbWluKE5fVFRZX0JVRl9TSVpFIC0gdHR5LT5yZWFkX2NudCwKKwkJCU5fVFRZX0JVRl9TSVpFIC0gdHR5LT5yZWFkX2hlYWQpOworCQlpID0gbWluKGNvdW50LCBpKTsKKwkJbWVtY3B5KHR0eS0+cmVhZF9idWYgKyB0dHktPnJlYWRfaGVhZCwgY3AsIGkpOworCQl0dHktPnJlYWRfaGVhZCA9ICh0dHktPnJlYWRfaGVhZCArIGkpICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCQl0dHktPnJlYWRfY250ICs9IGk7CisJCWNwICs9IGk7CisJCWNvdW50IC09IGk7CisKKwkJaSA9IG1pbihOX1RUWV9CVUZfU0laRSAtIHR0eS0+cmVhZF9jbnQsCisJCQlOX1RUWV9CVUZfU0laRSAtIHR0eS0+cmVhZF9oZWFkKTsKKwkJaSA9IG1pbihjb3VudCwgaSk7CisJCW1lbWNweSh0dHktPnJlYWRfYnVmICsgdHR5LT5yZWFkX2hlYWQsIGNwLCBpKTsKKwkJdHR5LT5yZWFkX2hlYWQgPSAodHR5LT5yZWFkX2hlYWQgKyBpKSAmIChOX1RUWV9CVUZfU0laRS0xKTsKKwkJdHR5LT5yZWFkX2NudCArPSBpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgY3B1ZmxhZ3MpOworCX0gZWxzZSB7CisJCWZvciAoaT1jb3VudCwgcCA9IGNwLCBmID0gZnA7IGk7IGktLSwgcCsrKSB7CisJCQlpZiAoZikKKwkJCQlmbGFncyA9ICpmKys7CisJCQlzd2l0Y2ggKGZsYWdzKSB7CisJCQljYXNlIFRUWV9OT1JNQUw6CisJCQkJbl90dHlfcmVjZWl2ZV9jaGFyKHR0eSwgKnApOworCQkJCWJyZWFrOworCQkJY2FzZSBUVFlfQlJFQUs6CisJCQkJbl90dHlfcmVjZWl2ZV9icmVhayh0dHkpOworCQkJCWJyZWFrOworCQkJY2FzZSBUVFlfUEFSSVRZOgorCQkJY2FzZSBUVFlfRlJBTUU6CisJCQkJbl90dHlfcmVjZWl2ZV9wYXJpdHlfZXJyb3IodHR5LCAqcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRUWV9PVkVSUlVOOgorCQkJCW5fdHR5X3JlY2VpdmVfb3ZlcnJ1bih0dHkpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoIiVzOiB1bmtub3duIGZsYWcgJWRcbiIsCisJCQkJICAgICAgIHR0eV9uYW1lKHR0eSwgYnVmKSwgZmxhZ3MpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfY2hhcnMpCisJCQl0dHktPmRyaXZlci0+Zmx1c2hfY2hhcnModHR5KTsKKwl9CisKKwlpZiAoIXR0eS0+aWNhbm9uICYmICh0dHktPnJlYWRfY250ID49IHR0eS0+bWluaW11bV90b193YWtlKSkgeworCQlraWxsX2Zhc3luYygmdHR5LT5mYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnR0eS0+cmVhZF93YWl0KSkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5yZWFkX3dhaXQpOworCX0KKworCS8qCisJICogQ2hlY2sgdGhlIHJlbWFpbmluZyByb29tIGZvciB0aGUgaW5wdXQgY2Fub25pY2FsaXphdGlvbgorCSAqIG1vZGUuICBXZSBkb24ndCB3YW50IHRvIHRocm90dGxlIHRoZSBkcml2ZXIgaWYgd2UncmUgaW4KKwkgKiBjYW5vbmljYWwgbW9kZSBhbmQgZG9uJ3QgaGF2ZSBhIG5ld2xpbmUgeWV0IQorCSAqLworCWlmIChuX3R0eV9yZWNlaXZlX3Jvb20odHR5KSA8IFRUWV9USFJFU0hPTERfVEhST1RUTEUpIHsKKwkJLyogY2hlY2sgVFRZX1RIUk9UVExFRCBmaXJzdCBzbyBpdCBpbmRpY2F0ZXMgb3VyIHN0YXRlICovCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykgJiYKKwkJICAgIHR0eS0+ZHJpdmVyLT50aHJvdHRsZSkKKwkJCXR0eS0+ZHJpdmVyLT50aHJvdHRsZSh0dHkpOworCX0KK30KKworaW50IGlzX2lnbm9yZWQoaW50IHNpZykKK3sKKwlyZXR1cm4gKHNpZ2lzbWVtYmVyKCZjdXJyZW50LT5ibG9ja2VkLCBzaWcpIHx8CisJICAgICAgICBjdXJyZW50LT5zaWdoYW5kLT5hY3Rpb25bc2lnLTFdLnNhLnNhX2hhbmRsZXIgPT0gU0lHX0lHTik7Cit9CisKKy8qKgorICoJbl90dHlfc2V0X3Rlcm1pb3MJLQl0ZXJtaW9zIGRhdGEgY2hhbmdlZAorICoJQHR0eTogdGVybWluYWwKKyAqCUBvbGQ6IHByZXZpb3VzIGRhdGEKKyAqCisgKglDYWxsZWQgYnkgdGhlIHR0eSBsYXllciB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgdGVybWlvcyBmbGFncyBzbworICoJdGhhdCB0aGUgbGluZSBkaXNjaXBsaW5lIGNhbiBwbGFuIGFoZWFkLiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBzbGVlcAorICoJYW5kIGlzIHByb3RlY3RlZCBmcm9tIHJlLWVudHJ5IGJ5IHRoZSB0dHkgbGF5ZXIuIFRoZSB1c2VyIGlzIAorICoJZ3VhcmFudGVlZCB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYmUgcmUtZW50ZXJlZCBvciBpbiBwcm9ncmVzcworICoJd2hlbiB0aGUgbGRpc2MgaXMgY2xvc2VkLgorICovCisgCitzdGF0aWMgdm9pZCBuX3R0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCkKK3sKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCQorCXR0eS0+aWNhbm9uID0gKExfSUNBTk9OKHR0eSkgIT0gMCk7CisJaWYgKHRlc3RfYml0KFRUWV9IV19DT09LX0lOLCAmdHR5LT5mbGFncykpIHsKKwkJdHR5LT5yYXcgPSAxOworCQl0dHktPnJlYWxfcmF3ID0gMTsKKwkJcmV0dXJuOworCX0KKwlpZiAoSV9JU1RSSVAodHR5KSB8fCBJX0lVQ0xDKHR0eSkgfHwgSV9JR05DUih0dHkpIHx8CisJICAgIElfSUNSTkwodHR5KSB8fCBJX0lOTENSKHR0eSkgfHwgTF9JQ0FOT04odHR5KSB8fAorCSAgICBJX0lYT04odHR5KSB8fCBMX0lTSUcodHR5KSB8fCBMX0VDSE8odHR5KSB8fAorCSAgICBJX1BBUk1SSyh0dHkpKSB7CisJCW1lbXNldCh0dHktPnByb2Nlc3NfY2hhcl9tYXAsIDAsIDI1Ni84KTsKKworCQlpZiAoSV9JR05DUih0dHkpIHx8IElfSUNSTkwodHR5KSkKKwkJCXNldF9iaXQoJ1xyJywgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJaWYgKElfSU5MQ1IodHR5KSkKKwkJCXNldF9iaXQoJ1xuJywgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKworCQlpZiAoTF9JQ0FOT04odHR5KSkgeworCQkJc2V0X2JpdChFUkFTRV9DSEFSKHR0eSksIHR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisJCQlzZXRfYml0KEtJTExfQ0hBUih0dHkpLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJc2V0X2JpdChFT0ZfQ0hBUih0dHkpLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJc2V0X2JpdCgnXG4nLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJc2V0X2JpdChFT0xfQ0hBUih0dHkpLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJaWYgKExfSUVYVEVOKHR0eSkpIHsKKwkJCQlzZXRfYml0KFdFUkFTRV9DSEFSKHR0eSksCisJCQkJCXR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisJCQkJc2V0X2JpdChMTkVYVF9DSEFSKHR0eSksCisJCQkJCXR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisJCQkJc2V0X2JpdChFT0wyX0NIQVIodHR5KSwKKwkJCQkJdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJCQlpZiAoTF9FQ0hPKHR0eSkpCisJCQkJCXNldF9iaXQoUkVQUklOVF9DSEFSKHR0eSksCisJCQkJCQl0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJfQorCQl9CisJCWlmIChJX0lYT04odHR5KSkgeworCQkJc2V0X2JpdChTVEFSVF9DSEFSKHR0eSksIHR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisJCQlzZXRfYml0KFNUT1BfQ0hBUih0dHkpLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQl9CisJCWlmIChMX0lTSUcodHR5KSkgeworCQkJc2V0X2JpdChJTlRSX0NIQVIodHR5KSwgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJCXNldF9iaXQoUVVJVF9DSEFSKHR0eSksIHR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisJCQlzZXRfYml0KFNVU1BfQ0hBUih0dHkpLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQl9CisJCWNsZWFyX2JpdChfX0RJU0FCTEVEX0NIQVIsIHR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisJCXR0eS0+cmF3ID0gMDsKKwkJdHR5LT5yZWFsX3JhdyA9IDA7CisJfSBlbHNlIHsKKwkJdHR5LT5yYXcgPSAxOworCQlpZiAoKElfSUdOQlJLKHR0eSkgfHwgKCFJX0JSS0lOVCh0dHkpICYmICFJX1BBUk1SSyh0dHkpKSkgJiYKKwkJICAgIChJX0lHTlBBUih0dHkpIHx8ICFJX0lOUENLKHR0eSkpICYmCisJCSAgICAodHR5LT5kcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9SRUFMX1JBVykpCisJCQl0dHktPnJlYWxfcmF3ID0gMTsKKwkJZWxzZQorCQkJdHR5LT5yZWFsX3JhdyA9IDA7CisJfQorfQorCisvKioKKyAqCW5fdHR5X2Nsb3NlCQktCWNsb3NlIHRoZSBsZGlzYyBmb3IgdGhpcyB0dHkKKyAqCUB0dHk6IGRldmljZQorICoKKyAqCUNhbGxlZCBmcm9tIHRoZSB0ZXJtaW5hbCBsYXllciB3aGVuIHRoaXMgbGluZSBkaXNjaXBsaW5lIGlzIAorICoJYmVpbmcgc2h1dCBkb3duLCBlaXRoZXIgYmVjYXVzZSBvZiBhIGNsb3NlIG9yIGJlY3N1c2Ugb2YgYSAKKyAqCWRpc2NpcGxpbmUgY2hhbmdlLiBUaGUgZnVuY3Rpb24gd2lsbCBub3QgYmUgY2FsbGVkIHdoaWxlIG90aGVyCisgKglsZGlzYyBtZXRob2RzIGFyZSBpbiBwcm9ncmVzcy4KKyAqLworIAorc3RhdGljIHZvaWQgbl90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwluX3R0eV9mbHVzaF9idWZmZXIodHR5KTsKKwlpZiAodHR5LT5yZWFkX2J1ZikgeworCQlmcmVlX2J1Zih0dHktPnJlYWRfYnVmKTsKKwkJdHR5LT5yZWFkX2J1ZiA9IE5VTEw7CisJfQorfQorCisvKioKKyAqCW5fdHR5X29wZW4JCS0Jb3BlbiBhbiBsZGlzYworICoJQHR0eTogdGVybWluYWwgdG8gb3BlbgorICoKKyAqCUNhbGxlZCB3aGVuIHRoaXMgbGluZSBkaXNjaXBsaW5lIGlzIGJlaW5nIGF0dGFjaGVkIHRvIHRoZSAKKyAqCXRlcm1pbmFsIGRldmljZS4gQ2FuIHNsZWVwLiBDYWxsZWQgc2VyaWFsaXplZCBzbyB0aGF0IG5vCisgKglvdGhlciBldmVudHMgd2lsbCBvY2N1ciBpbiBwYXJhbGxlbC4gTm8gZnVydGhlciBvcGVuIHdpbGwgb2NjdXIKKyAqCXVudGlsIGEgY2xvc2UuCisgKi8KKworc3RhdGljIGludCBuX3R0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaWYgKCF0dHkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGhpcyBvbmUgaXMgdWdseS4gQ3VycmVudGx5IGEgbWFsbG9jIGZhaWx1cmUgaGVyZSBjYW4gcGFuaWMgKi8KKwlpZiAoIXR0eS0+cmVhZF9idWYpIHsKKwkJdHR5LT5yZWFkX2J1ZiA9IGFsbG9jX2J1ZigpOworCQlpZiAoIXR0eS0+cmVhZF9idWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHR0eS0+cmVhZF9idWYsIDAsIE5fVFRZX0JVRl9TSVpFKTsKKwlyZXNldF9idWZmZXJfZmxhZ3ModHR5KTsKKwl0dHktPmNvbHVtbiA9IDA7CisJbl90dHlfc2V0X3Rlcm1pb3ModHR5LCBOVUxMKTsKKwl0dHktPm1pbmltdW1fdG9fd2FrZSA9IDE7CisJdHR5LT5jbG9zaW5nID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW5wdXRfYXZhaWxhYmxlX3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGFtdCkKK3sKKwlpZiAodHR5LT5pY2Fub24pIHsKKwkJaWYgKHR0eS0+Y2Fub25fZGF0YSkKKwkJCXJldHVybiAxOworCX0gZWxzZSBpZiAodHR5LT5yZWFkX2NudCA+PSAoYW10ID8gYW10IDogMSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogCWNvcHlfZnJvbV9yZWFkX2J1ZgktCWNvcHkgcmVhZCBkYXRhIGRpcmVjdGx5CisgKglAdHR5OiB0ZXJtaW5hbCBkZXZpY2UKKyAqCUBiOiB1c2VyIGRhdGEKKyAqCUBucjogc2l6ZSBvZiBkYXRhCisgKgorICoJSGVscGVyIGZ1bmN0aW9uIHRvIHNwZWVkIHVwIHJlYWRfY2hhbi4gIEl0IGlzIG9ubHkgY2FsbGVkIHdoZW4KKyAqCUlDQU5PTiBpcyBvZmY7IGl0IGNvcGllcyBjaGFyYWN0ZXJzIHN0cmFpZ2h0IGZyb20gdGhlIHR0eSBxdWV1ZSB0bworICoJdXNlciBzcGFjZSBkaXJlY3RseS4gIEl0IGNhbiBiZSBwcm9maXRhYmx5IGNhbGxlZCB0d2ljZTsgb25jZSB0bworICoJZHJhaW4gdGhlIHNwYWNlIGZyb20gdGhlIHRhaWwgcG9pbnRlciB0byB0aGUgKHBoeXNpY2FsKSBlbmQgb2YgdGhlCisgKglidWZmZXIsIGFuZCBvbmNlIHRvIGRyYWluIHRoZSBzcGFjZSBmcm9tIHRoZSAocGh5c2ljYWwpIGJlZ2lubmluZyBvZgorICoJdGhlIGJ1ZmZlciB0byBoZWFkIHBvaW50ZXIuCisgKgorICoJQ2FsbGVkIHVuZGVyIHRoZSB0dHktPmF0b21pY19yZWFkIHNlbSBhbmQgd2l0aCBUVFlfRE9OVF9GTElQIHNldAorICoKKyAqLworIAorc3RhdGljIGlubGluZSBpbnQgY29weV9mcm9tX3JlYWRfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJICAgICAgdW5zaWduZWQgY2hhciBfX3VzZXIgKipiLAorCQkJCSAgICAgIHNpemVfdCAqbnIpCisKK3sKKwlpbnQgcmV0dmFsOworCXNpemVfdCBuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyZXR2YWwgPSAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCW4gPSBtaW4odHR5LT5yZWFkX2NudCwgTl9UVFlfQlVGX1NJWkUgLSB0dHktPnJlYWRfdGFpbCk7CisJbiA9IG1pbigqbnIsIG4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJaWYgKG4pIHsKKwkJbWIoKTsKKwkJcmV0dmFsID0gY29weV90b191c2VyKCpiLCAmdHR5LT5yZWFkX2J1Zlt0dHktPnJlYWRfdGFpbF0sIG4pOworCQluIC09IHJldHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJCXR0eS0+cmVhZF90YWlsID0gKHR0eS0+cmVhZF90YWlsICsgbikgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CisJCXR0eS0+cmVhZF9jbnQgLT0gbjsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJKmIgKz0gbjsKKwkJKm5yIC09IG47CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2V4dGVybiBzc2l6ZV90IHJlZGlyZWN0ZWRfdHR5X3dyaXRlKHN0cnVjdCBmaWxlICosY29uc3QgY2hhciAqLHNpemVfdCxsb2ZmX3QgKik7CisKKy8qKgorICoJam9iX2NvbnRyb2wJCS0JY2hlY2sgam9iIGNvbnRyb2wKKyAqCUB0dHk6IHR0eQorICoJQGZpbGU6IGZpbGUgaGFuZGxlCisgKgorICoJUGVyZm9ybSBqb2IgY29udHJvbCBtYW5hZ2VtZW50IGNoZWNrcyBvbiB0aGlzIGZpbGUvdHR5IGRlc2NyaXB0b3IKKyAqCWFuZCBpZiBhcHByb3ByaWF0ZSBzZW5kIGFueSBuZWVkZWQgc2lnbmFscyBhbmQgcmV0dXJuIGEgbmVnYXRpdmUgCisgKgllcnJvciBjb2RlIGlmIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4uCisgKi8KKyAKK3N0YXRpYyBpbnQgam9iX2NvbnRyb2woc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogSm9iIGNvbnRyb2wgY2hlY2sgLS0gbXVzdCBiZSBkb25lIGF0IHN0YXJ0IGFuZCBhZnRlcgorCSAgIGV2ZXJ5IHNsZWVwIChQT1NJWC4xIDcuMS4xLjQpLiAqLworCS8qIE5PVEU6IG5vdCB5ZXQgZG9uZSBhZnRlciBldmVyeSBzbGVlcCBwZW5kaW5nIGEgdGhvcm91Z2gKKwkgICBjaGVjayBvZiB0aGUgbG9naWMgb2YgdGhpcyBjaGFuZ2UuIC0tIGpsYyAqLworCS8qIGRvbid0IHN0b3Agb24gL2Rldi9jb25zb2xlICovCisJaWYgKGZpbGUtPmZfb3AtPndyaXRlICE9IHJlZGlyZWN0ZWRfdHR5X3dyaXRlICYmCisJICAgIGN1cnJlbnQtPnNpZ25hbC0+dHR5ID09IHR0eSkgeworCQlpZiAodHR5LT5wZ3JwIDw9IDApCisJCQlwcmludGsoInJlYWRfY2hhbjogdHR5LT5wZ3JwIDw9IDAhXG4iKTsKKwkJZWxzZSBpZiAocHJvY2Vzc19ncm91cChjdXJyZW50KSAhPSB0dHktPnBncnApIHsKKwkJCWlmIChpc19pZ25vcmVkKFNJR1RUSU4pIHx8CisJCQkgICAgaXNfb3JwaGFuZWRfcGdycChwcm9jZXNzX2dyb3VwKGN1cnJlbnQpKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWtpbGxfcGcocHJvY2Vzc19ncm91cChjdXJyZW50KSwgU0lHVFRJTiwgMSk7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJfQorCXJldHVybiAwOworfQorIAorCisvKioKKyAqCXJlYWRfY2hhbgkJLQlyZWFkIGZ1bmN0aW9uIGZvciB0dHkKKyAqCUB0dHk6IHR0eSBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIG9iamVjdAorICoJQGJ1ZjogdXNlcnNwYWNlIGJ1ZmZlciBwb2ludGVyCisgKglAbnI6IHNpemUgb2YgSS9PCisgKgorICoJUGVyZm9ybSByZWFkcyBmb3IgdGhlIGxpbmUgZGlzY2lwbGluZS4gV2UgYXJlIGd1YXJhbnRlZWQgdGhhdCB0aGUKKyAqCWxpbmUgZGlzY2lwbGluZSB3aWxsIG5vdCBiZSBjbG9zZWQgdW5kZXIgdXMgYnV0IHdlIG1heSBnZXQgbXVsdGlwbGUKKyAqCXBhcmFsbGVsIHJlYWRlcnMgYW5kIG11c3QgaGFuZGxlIHRoaXMgb3Vyc2VsdmVzLiBXZSBtYXkgYWxzbyBnZXQKKyAqCWEgaGFuZ3VwLiBBbHdheXMgY2FsbGVkIGluIHVzZXIgY29udGV4dCwgbWF5IHNsZWVwLgorICoKKyAqCVRoaXMgY29kZSBtdXN0IGJlIHN1cmUgbmV2ZXIgdG8gc2xlZXAgdGhyb3VnaCBhIGhhbmd1cC4KKyAqLworIAorc3RhdGljIHNzaXplX3QgcmVhZF9jaGFuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBucikKK3sKKwl1bnNpZ25lZCBjaGFyIF9fdXNlciAqYiA9IGJ1ZjsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQgYzsKKwlpbnQgbWluaW11bSwgdGltZTsKKwlzc2l6ZV90IHJldHZhbCA9IDA7CisJc3NpemVfdCBzaXplOworCWxvbmcgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCitkb19pdF9hZ2FpbjoKKworCWlmICghdHR5LT5yZWFkX2J1ZikgeworCQlwcmludGsoIm5fdHR5X3JlYWRfY2hhbjogY2FsbGVkIHdpdGggcmVhZF9idWYgPT0gTlVMTD8hP1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWMgPSBqb2JfY29udHJvbCh0dHksIGZpbGUpOworCWlmKGMgPCAwKQorCQlyZXR1cm4gYzsKKwkKKwltaW5pbXVtID0gdGltZSA9IDA7CisJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCWlmICghdHR5LT5pY2Fub24pIHsKKwkJdGltZSA9IChIWiAvIDEwKSAqIFRJTUVfQ0hBUih0dHkpOworCQltaW5pbXVtID0gTUlOX0NIQVIodHR5KTsKKwkJaWYgKG1pbmltdW0pIHsKKwkJCWlmICh0aW1lKQorCQkJCXR0eS0+bWluaW11bV90b193YWtlID0gMTsKKwkJCWVsc2UgaWYgKCF3YWl0cXVldWVfYWN0aXZlKCZ0dHktPnJlYWRfd2FpdCkgfHwKKwkJCQkgKHR0eS0+bWluaW11bV90b193YWtlID4gbWluaW11bSkpCisJCQkJdHR5LT5taW5pbXVtX3RvX3dha2UgPSBtaW5pbXVtOworCQl9IGVsc2UgeworCQkJdGltZW91dCA9IDA7CisJCQlpZiAodGltZSkgeworCQkJCXRpbWVvdXQgPSB0aW1lOworCQkJCXRpbWUgPSAwOworCQkJfQorCQkJdHR5LT5taW5pbXVtX3RvX3dha2UgPSBtaW5pbXVtID0gMTsKKwkJfQorCX0KKworCS8qCisJICoJSW50ZXJuYWwgc2VyaWFsaXphdGlvbiBvZiByZWFkcy4KKwkgKi8KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJaWYgKGRvd25fdHJ5bG9jaygmdHR5LT5hdG9taWNfcmVhZCkpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJZWxzZSB7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJnR0eS0+YXRvbWljX3JlYWQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisKKwlhZGRfd2FpdF9xdWV1ZSgmdHR5LT5yZWFkX3dhaXQsICZ3YWl0KTsKKwlzZXRfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKTsKKwl3aGlsZSAobnIpIHsKKwkJLyogRmlyc3QgdGVzdCBmb3Igc3RhdHVzIGNoYW5nZS4gKi8KKwkJaWYgKHR0eS0+cGFja2V0ICYmIHR0eS0+bGluay0+Y3RybF9zdGF0dXMpIHsKKwkJCXVuc2lnbmVkIGNoYXIgY3M7CisJCQlpZiAoYiAhPSBidWYpCisJCQkJYnJlYWs7CisJCQljcyA9IHR0eS0+bGluay0+Y3RybF9zdGF0dXM7CisJCQl0dHktPmxpbmstPmN0cmxfc3RhdHVzID0gMDsKKwkJCWlmIChwdXRfdXNlcihjcywgYisrKSkgeworCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQkJYi0tOworCQkJCWJyZWFrOworCQkJfQorCQkJbnItLTsKKwkJCWJyZWFrOworCQl9CisJCS8qIFRoaXMgc3RhdGVtZW50IG11c3QgYmUgZmlyc3QgYmVmb3JlIGNoZWNraW5nIGZvciBpbnB1dAorCQkgICBzbyB0aGF0IGFueSBpbnRlcnJ1cHQgd2lsbCBzZXQgdGhlIHN0YXRlIGJhY2sgdG8KKwkJICAgVEFTS19SVU5OSU5HLiAqLworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkKKwkJaWYgKCgobWluaW11bSAtIChiIC0gYnVmKSkgPCB0dHktPm1pbmltdW1fdG9fd2FrZSkgJiYKKwkJICAgICgobWluaW11bSAtIChiIC0gYnVmKSkgPj0gMSkpCisJCQl0dHktPm1pbmltdW1fdG9fd2FrZSA9IChtaW5pbXVtIC0gKGIgLSBidWYpKTsKKwkJCisJCWlmICghaW5wdXRfYXZhaWxhYmxlX3AodHR5LCAwKSkgeworCQkJaWYgKHRlc3RfYml0KFRUWV9PVEhFUl9DTE9TRUQsICZ0dHktPmZsYWdzKSkgeworCQkJCXJldHZhbCA9IC1FSU87CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAodHR5X2h1bmdfdXBfcChmaWxlKSkKKwkJCQlicmVhazsKKwkJCWlmICghdGltZW91dCkKKwkJCQlicmVhazsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljbGVhcl9iaXQoVFRZX0RPTlRfRkxJUCwgJnR0eS0+ZmxhZ3MpOworCQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJCQlzZXRfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCQkvKiBEZWFsIHdpdGggcGFja2V0IG1vZGUuICovCisJCWlmICh0dHktPnBhY2tldCAmJiBiID09IGJ1ZikgeworCQkJaWYgKHB1dF91c2VyKFRJT0NQS1RfREFUQSwgYisrKSkgeworCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQkJYi0tOworCQkJCWJyZWFrOworCQkJfQorCQkJbnItLTsKKwkJfQorCisJCWlmICh0dHktPmljYW5vbikgeworCQkJLyogTi5CLiBhdm9pZCBvdmVycnVuIGlmIG5yID09IDAgKi8KKwkJCXdoaWxlIChuciAmJiB0dHktPnJlYWRfY250KSB7CisgCQkJCWludCBlb2w7CisKKwkJCQllb2wgPSB0ZXN0X2FuZF9jbGVhcl9iaXQodHR5LT5yZWFkX3RhaWwsCisJCQkJCQl0dHktPnJlYWRfZmxhZ3MpOworCQkJCWMgPSB0dHktPnJlYWRfYnVmW3R0eS0+cmVhZF90YWlsXTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJCQl0dHktPnJlYWRfdGFpbCA9ICgodHR5LT5yZWFkX3RhaWwrMSkgJgorCQkJCQkJICAoTl9UVFlfQlVGX1NJWkUtMSkpOworCQkJCXR0eS0+cmVhZF9jbnQtLTsKKwkJCQlpZiAoZW9sKSB7CisJCQkJCS8qIHRoaXMgdGVzdCBzaG91bGQgYmUgcmVkdW5kYW50OgorCQkJCQkgKiB3ZSBzaG91bGRuJ3QgYmUgcmVhZGluZyBkYXRhIGlmCisJCQkJCSAqIGNhbm9uX2RhdGEgaXMgMAorCQkJCQkgKi8KKwkJCQkJaWYgKC0tdHR5LT5jYW5vbl9kYXRhIDwgMCkKKwkJCQkJCXR0eS0+Y2Fub25fZGF0YSA9IDA7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisKKwkJCQlpZiAoIWVvbCB8fCAoYyAhPSBfX0RJU0FCTEVEX0NIQVIpKSB7CisJCQkJCWlmIChwdXRfdXNlcihjLCBiKyspKSB7CisJCQkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCQkJYi0tOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJbnItLTsKKwkJCQl9CisJCQkJaWYgKGVvbCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocmV0dmFsKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJaW50IHVuY29waWVkOworCQkJdW5jb3BpZWQgPSBjb3B5X2Zyb21fcmVhZF9idWYodHR5LCAmYiwgJm5yKTsKKwkJCXVuY29waWVkICs9IGNvcHlfZnJvbV9yZWFkX2J1Zih0dHksICZiLCAmbnIpOworCQkJaWYgKHVuY29waWVkKSB7CisJCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIElmIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBpbiB0aGUgcmVhZCBidWZmZXIgbm93LCBsZXQgdGhlCisJCSAqIGxvdy1sZXZlbCBkcml2ZXIga25vdy4gV2UgdXNlIG5fdHR5X2NoYXJzX2luX2J1ZmZlcigpIHRvCisJCSAqIGNoZWNrIHRoZSBidWZmZXIsIGFzIGl0IG5vdyBrbm93cyBhYm91dCBjYW5vbmljYWwgbW9kZS4KKwkJICogT3RoZXJ3aXNlLCBpZiB0aGUgZHJpdmVyIGlzIHRocm90dGxlZCBhbmQgdGhlIGxpbmUgaXMKKwkJICogbG9uZ2VyIHRoYW4gVFRZX1RIUkVTSE9MRF9VTlRIUk9UVExFIGluIGNhbm9uaWNhbCBtb2RlLAorCQkgKiB3ZSB3b24ndCBnZXQgYW55IG1vcmUgY2hhcmFjdGVycy4KKwkJICovCisJCWlmIChuX3R0eV9jaGFyc19pbl9idWZmZXIodHR5KSA8PSBUVFlfVEhSRVNIT0xEX1VOVEhST1RUTEUpCisJCQljaGVja191bnRocm90dGxlKHR0eSk7CisKKwkJaWYgKGIgLSBidWYgPj0gbWluaW11bSkKKwkJCWJyZWFrOworCQlpZiAodGltZSkKKwkJCXRpbWVvdXQgPSB0aW1lOworCX0KKwljbGVhcl9iaXQoVFRZX0RPTlRfRkxJUCwgJnR0eS0+ZmxhZ3MpOworCXVwKCZ0dHktPmF0b21pY19yZWFkKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdHR5LT5yZWFkX3dhaXQsICZ3YWl0KTsKKworCWlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmdHR5LT5yZWFkX3dhaXQpKQorCQl0dHktPm1pbmltdW1fdG9fd2FrZSA9IG1pbmltdW07CisKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJc2l6ZSA9IGIgLSBidWY7CisJaWYgKHNpemUpIHsKKwkJcmV0dmFsID0gc2l6ZTsKKwkJaWYgKG5yKQorCSAgICAgICAJCWNsZWFyX2JpdChUVFlfUFVTSCwgJnR0eS0+ZmxhZ3MpOworCX0gZWxzZSBpZiAodGVzdF9hbmRfY2xlYXJfYml0KFRUWV9QVVNILCAmdHR5LT5mbGFncykpCisJCSBnb3RvIGRvX2l0X2FnYWluOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl3cml0ZV9jaGFuCQktCXdyaXRlIGZ1bmN0aW9uIGZvciB0dHkKKyAqCUB0dHk6IHR0eSBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIG9iamVjdAorICoJQGJ1ZjogdXNlcnNwYWNlIGJ1ZmZlciBwb2ludGVyCisgKglAbnI6IHNpemUgb2YgSS9PCisgKgorICoJV3JpdGUgZnVuY3Rpb24gb2YgdGhlIHRlcm1pbmFsIGRldmljZS4gVGhpcyBpcyBzZXJpYWxpemVkIHdpdGgKKyAqCXJlc3BlY3QgdG8gb3RoZXIgd3JpdGUgY2FsbGVycyBidXQgbm90IHRvIHRlcm1pb3MgY2hhbmdlcywgcmVhZHMKKyAqCWFuZCBvdGhlciBzdWNoIGV2ZW50cy4gV2UgbXVzdCBiZSBjYXJlZnVsIHdpdGggTl9UVFkgYXMgdGhlIHJlY2VpdmUKKyAqCWNvZGUgd2lsbCBlY2hvIGNoYXJhY3RlcnMsIHRodXMgY2FsbGluZyBkcml2ZXIgd3JpdGUgbWV0aG9kcy4KKyAqCisgKglUaGlzIGNvZGUgbXVzdCBiZSBzdXJlIG5ldmVyIHRvIHNsZWVwIHRocm91Z2ggYSBoYW5ndXAuCisgKi8KKyAKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2NoYW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1Ziwgc2l6ZV90IG5yKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmIgPSBidWY7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IGM7CisJc3NpemVfdCByZXR2YWwgPSAwOworCisJLyogSm9iIGNvbnRyb2wgY2hlY2sgLS0gbXVzdCBiZSBkb25lIGF0IHN0YXJ0IChQT1NJWC4xIDcuMS4xLjQpLiAqLworCWlmIChMX1RPU1RPUCh0dHkpICYmIGZpbGUtPmZfb3AtPndyaXRlICE9IHJlZGlyZWN0ZWRfdHR5X3dyaXRlKSB7CisJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJYWRkX3dhaXRfcXVldWUoJnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlsZSkgfHwgKHR0eS0+bGluayAmJiAhdHR5LT5saW5rLT5jb3VudCkpIHsKKwkJCXJldHZhbCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlpZiAoT19PUE9TVCh0dHkpICYmICEodGVzdF9iaXQoVFRZX0hXX0NPT0tfT1VULCAmdHR5LT5mbGFncykpKSB7CisJCQl3aGlsZSAobnIgPiAwKSB7CisJCQkJc3NpemVfdCBudW0gPSBvcG9zdF9ibG9jayh0dHksIGIsIG5yKTsKKwkJCQlpZiAobnVtIDwgMCkgeworCQkJCQlpZiAobnVtID09IC1FQUdBSU4pCisJCQkJCQlicmVhazsKKwkJCQkJcmV0dmFsID0gbnVtOworCQkJCQlnb3RvIGJyZWFrX291dDsKKwkJCQl9CisJCQkJYiArPSBudW07CisJCQkJbnIgLT0gbnVtOworCQkJCWlmIChuciA9PSAwKQorCQkJCQlicmVhazsKKwkJCQljID0gKmI7CisJCQkJaWYgKG9wb3N0KGMsIHR0eSkgPCAwKQorCQkJCQlicmVhazsKKwkJCQliKys7IG5yLS07CisJCQl9CisJCQlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2NoYXJzKQorCQkJCXR0eS0+ZHJpdmVyLT5mbHVzaF9jaGFycyh0dHkpOworCQl9IGVsc2UgeworCQkJYyA9IHR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIGIsIG5yKTsKKwkJCWlmIChjIDwgMCkgeworCQkJCXJldHZhbCA9IGM7CisJCQkJZ290byBicmVha19vdXQ7CisJCQl9CisJCQliICs9IGM7CisJCQluciAtPSBjOworCQl9CisJCWlmICghbnIpCisJCQlicmVhazsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKwkJc2NoZWR1bGUoKTsKKwl9CiticmVha19vdXQ6CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZ0dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKKwlyZXR1cm4gKGIgLSBidWYpID8gYiAtIGJ1ZiA6IHJldHZhbDsKK30KKworLyoqCisgKglub3JtYWxfcG9sbAkJLQlwb2xsIG1ldGhvZCBmb3IgTl9UVFkKKyAqCUB0dHk6IHRlcm1pbmFsIGRldmljZQorICoJQGZpbGU6IGZpbGUgYWNjZXNzaW5nIGl0CisgKglAd2FpdDogcG9sbCB0YWJsZQorICoKKyAqCUNhbGxlZCB3aGVuIHRoZSBsaW5lIGRpc2NpcGxpbmUgaXMgYXNrZWQgdG8gcG9sbCgpIGZvciBkYXRhIG9yCisgKglmb3Igc3BlY2lhbCBldmVudHMuIFRoaXMgY29kZSBpcyBub3Qgc2VyaWFsaXplZCB3aXRoIHJlc3BlY3QgdG8KKyAqCW90aGVyIGV2ZW50cyBzYXZlIG9wZW4vY2xvc2UuCisgKgorICoJVGhpcyBjb2RlIG11c3QgYmUgc3VyZSBuZXZlciB0byBzbGVlcCB0aHJvdWdoIGEgaGFuZ3VwLgorICoJQ2FsbGVkIHdpdGhvdXQgdGhlIGtlcm5lbCBsb2NrIGhlbGQgLSBmaW5lCisgKgorICoJRklYTUU6IGlmIHNvbWVvbmUgY2hhbmdlcyB0aGUgVk1JTiBvciBkaXNjaXBsaW5lIHNldHRpbmdzIGZvciB0aGUKKyAqCXRlcm1pbmFsIHdoaWxlIGFub3RoZXIgcHJvY2VzcyBpcyBpbiBwb2xsKCkgdGhlIHBvbGwgZG9lcyBub3QKKyAqCXJlY29tcHV0ZSB0aGUgbmV3IGxpbWl0cy4gUG9zc2libHkgc2V0X3Rlcm1pb3Mgc2hvdWxkIGlzc3VlCisgKglhIHJlYWQgd2FrZXVwIHRvIGZpeCB0aGlzIGJ1Zy4KKyAqLworIAorc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfcG9sbChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCXBvbGxfd2FpdChmaWxlLCAmdHR5LT5yZWFkX3dhaXQsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmdHR5LT53cml0ZV93YWl0LCB3YWl0KTsKKwlpZiAoaW5wdXRfYXZhaWxhYmxlX3AodHR5LCBUSU1FX0NIQVIodHR5KSA/IDAgOiBNSU5fQ0hBUih0dHkpKSkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCWlmICh0dHktPnBhY2tldCAmJiB0dHktPmxpbmstPmN0cmxfc3RhdHVzKQorCQltYXNrIHw9IFBPTExQUkkgfCBQT0xMSU4gfCBQT0xMUkROT1JNOworCWlmICh0ZXN0X2JpdChUVFlfT1RIRVJfQ0xPU0VELCAmdHR5LT5mbGFncykpCisJCW1hc2sgfD0gUE9MTEhVUDsKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxlKSkKKwkJbWFzayB8PSBQT0xMSFVQOworCWlmICghKG1hc2sgJiAoUE9MTEhVUCB8IFBPTExJTiB8IFBPTExSRE5PUk0pKSkgeworCQlpZiAoTUlOX0NIQVIodHR5KSAmJiAhVElNRV9DSEFSKHR0eSkpCisJCQl0dHktPm1pbmltdW1fdG9fd2FrZSA9IE1JTl9DSEFSKHR0eSk7CisJCWVsc2UKKwkJCXR0eS0+bWluaW11bV90b193YWtlID0gMTsKKwl9CisJaWYgKHR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIodHR5KSA8IFdBS0VVUF9DSEFSUyAmJgorCQkJdHR5LT5kcml2ZXItPndyaXRlX3Jvb20odHR5KSA+IDApCisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0cnVjdCB0dHlfbGRpc2MgdHR5X2xkaXNjX05fVFRZID0geworCVRUWV9MRElTQ19NQUdJQywJLyogbWFnaWMgKi8KKwkibl90dHkiLAkJLyogbmFtZSAqLworCTAsCQkJLyogbnVtICovCisJMCwJCQkvKiBmbGFncyAqLworCW5fdHR5X29wZW4sCQkvKiBvcGVuICovCisJbl90dHlfY2xvc2UsCQkvKiBjbG9zZSAqLworCW5fdHR5X2ZsdXNoX2J1ZmZlciwJLyogZmx1c2hfYnVmZmVyICovCisJbl90dHlfY2hhcnNfaW5fYnVmZmVyLAkvKiBjaGFyc19pbl9idWZmZXIgKi8KKwlyZWFkX2NoYW4sCQkvKiByZWFkICovCisJd3JpdGVfY2hhbiwJCS8qIHdyaXRlICovCisJbl90dHlfaW9jdGwsCQkvKiBpb2N0bCAqLworCW5fdHR5X3NldF90ZXJtaW9zLAkvKiBzZXRfdGVybWlvcyAqLworCW5vcm1hbF9wb2xsLAkJLyogcG9sbCAqLworCU5VTEwsCQkJLyogaGFuZ3VwICovCisJbl90dHlfcmVjZWl2ZV9idWYsCS8qIHJlY2VpdmVfYnVmICovCisJbl90dHlfcmVjZWl2ZV9yb29tLAkvKiByZWNlaXZlX3Jvb20gKi8KKwluX3R0eV93cml0ZV93YWtldXAJLyogd3JpdGVfd2FrZXVwICovCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbnZyYW0uYyBiL2RyaXZlcnMvY2hhci9udnJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2M2EzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbnZyYW0uYwpAQCAtMCwwICsxLDkyNiBAQAorLyoKKyAqIENNT1MvTlYtUkFNIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgUm9tYW4gSG9kZWsgPFJvbWFuLkhvZGVrQGluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorICogaWRlYSBieSBhbmQgd2l0aCBoZWxwIGZyb20gUmljaGFyZCBKZWxpbmVrIDxyakBzdXNlLmRlPgorICogUG9ydGlvbnMgY29weXJpZ2h0IChjKSAyMDAxLDIwMDIgU3VuIE1pY3Jvc3lzdGVtcyAodGhvY2tpbkBzdW4uY29tKQorICoKKyAqIFRoaXMgZHJpdmVyIGFsbG93cyB5b3UgdG8gYWNjZXNzIHRoZSBjb250ZW50cyBvZiB0aGUgbm9uLXZvbGF0aWxlIG1lbW9yeSBpbgorICogdGhlIG1jMTQ2ODE4cnRjLmggcmVhbC10aW1lIGNsb2NrLiBUaGlzIGNoaXAgaXMgYnVpbHQgaW50byBhbGwgUENzIGFuZCBpbnRvCisgKiBtYW55IEF0YXJpIG1hY2hpbmVzLiBJbiB0aGUgZm9ybWVyIGl0J3MgY2FsbGVkICJDTU9TLVJBTSIsIGluIHRoZSBsYXR0ZXIKKyAqICJOVlJBTSIgKE5WIHN0YW5kcyBmb3Igbm9uLXZvbGF0aWxlKS4KKyAqCisgKiBUaGUgZGF0YSBhcmUgc3VwcGxpZWQgYXMgYSAoc2Vla2FibGUpIGNoYXJhY3RlciBkZXZpY2UsIC9kZXYvbnZyYW0uIFRoZQorICogc2l6ZSBvZiB0aGlzIGZpbGUgaXMgZGVwZW5kZW50IG9uIHRoZSBjb250cm9sbGVyLiAgVGhlIHVzdWFsIHNpemUgaXMgMTE0LAorICogdGhlIG51bWJlciBvZiBmcmVlbHkgYXZhaWxhYmxlIGJ5dGVzIGluIHRoZSBtZW1vcnkgKGkuZS4sIG5vdCB1c2VkIGJ5IHRoZQorICogUlRDIGl0c2VsZikuCisgKgorICogQ2hlY2tzdW1zIG92ZXIgdGhlIE5WUkFNIGNvbnRlbnRzIGFyZSBtYW5hZ2VkIGJ5IHRoaXMgZHJpdmVyLiBJbiBjYXNlIG9mIGEKKyAqIGJhZCBjaGVja3N1bSwgcmVhZHMgYW5kIHdyaXRlcyByZXR1cm4gLUVJTy4gVGhlIGNoZWNrc3VtIGNhbiBiZSBpbml0aWFsaXplZAorICogdG8gYSBzYW5lIHN0YXRlIGVpdGhlciBieSBpb2N0bChOVlJBTV9JTklUKSAoY2xlYXIgd2hvbGUgTlZSQU0pIG9yCisgKiBpb2N0bChOVlJBTV9TRVRDS1MpIChkb2Vzbid0IGNoYW5nZSBjb250ZW50cywganVzdCBtYWtlcyBjaGVja3N1bSB2YWxpZAorICogYWdhaW47IHVzZSB3aXRoIGNhcmUhKQorICoKKyAqIFRoaXMgZmlsZSBhbHNvIHByb3ZpZGVzIHNvbWUgZnVuY3Rpb25zIGZvciBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsIHRoYXQKKyAqIHdhbnQgdG8gYWNjZXNzIHRoZSBOVlJBTTogbnZyYW1fe3JlYWQsd3JpdGUsY2hlY2tfY2hlY2tzdW0sc2V0X2NoZWNrc3VtfS4KKyAqIE9idmlvdXNseSB0aGlzIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhpcyBkcml2ZXIgaXMgYWx3YXlzIGNvbmZpZ3VyZWQgaW50bworICogdGhlIGtlcm5lbCBhbmQgaXMgbm90IGEgbW9kdWxlLiBTaW5jZSB0aGUgZnVuY3Rpb25zIGFyZSB1c2VkIGJ5IHNvbWUgQXRhcmkKKyAqIGRyaXZlcnMsIHRoaXMgaXMgdGhlIGNhc2Ugb24gdGhlIEF0YXJpLgorICoKKyAqCisgKiAJMS4xCUNlc2FyIEJhcnJvczogU01QIGxvY2tpbmcgZml4ZXMKKyAqIAkJYWRkZWQgY2hhbmdlbG9nCisgKiAJMS4yCUVyaWsgR2lsbGluZzogQ29iYWx0IE5ldHdvcmtzIHN1cHBvcnQKKyAqIAkJVGltIEhvY2tpbjogZ2VuZXJhbCBjbGVhbnVwLCBDb2JhbHQgc3VwcG9ydAorICovCisKKyNkZWZpbmUgTlZSQU1fVkVSU0lPTgkiMS4yIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L252cmFtLmg+CisKKyNkZWZpbmUgUEMJCTEKKyNkZWZpbmUgQVRBUkkJCTIKKyNkZWZpbmUgQ09CQUxUCQkzCisKKy8qIHNlbGVjdCBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19BVEFSSSkKKyMgIGRlZmluZSBNQUNIIEFUQVJJCisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19hcm1fXykgIC8qIGFuZCBvdGhlcnM/PyAqLworI2RlZmluZSBNQUNIIFBDCisjICBpZiBkZWZpbmVkKENPTkZJR19DT0JBTFQpCisjICAgIGluY2x1ZGUgPGxpbnV4L2NvYmFsdC1udnJhbS5oPgorIyAgICBkZWZpbmUgTUFDSCBDT0JBTFQKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE1BQ0ggUEMKKyMgIGVuZGlmCisjZWxzZQorIyAgZXJyb3IgQ2Fubm90IGJ1aWxkIG52cmFtIGRyaXZlciBmb3IgdGhpcyBtYWNoaW5lIGNvbmZpZ3VyYXRpb24uCisjZW5kaWYKKworI2lmIE1BQ0ggPT0gUEMKKworLyogUlRDIGluIGEgUEMgKi8KKyNkZWZpbmUgQ0hFQ0tfRFJJVkVSX0lOSVQoKQkxCisKKy8qIE9uIFBDcywgdGhlIGNoZWNrc3VtIGlzIGJ1aWx0IG9ubHkgb3ZlciBieXRlcyAyLi4zMSAqLworI2RlZmluZSBQQ19DS1NfUkFOR0VfU1RBUlQJMgorI2RlZmluZSBQQ19DS1NfUkFOR0VfRU5ECTMxCisjZGVmaW5lIFBDX0NLU19MT0MJCTMyCisjZGVmaW5lIE5WUkFNX0JZVEVTCQkoMTI4LU5WUkFNX0ZJUlNUX0JZVEUpCisKKyNkZWZpbmUgbWFjaF9jaGVja19jaGVja3N1bQlwY19jaGVja19jaGVja3N1bQorI2RlZmluZSBtYWNoX3NldF9jaGVja3N1bQlwY19zZXRfY2hlY2tzdW0KKyNkZWZpbmUgbWFjaF9wcm9jX2luZm9zCQlwY19wcm9jX2luZm9zCisKKyNlbmRpZgorCisjaWYgTUFDSCA9PSBDT0JBTFQKKworI2RlZmluZSBDSEVDS19EUklWRVJfSU5JVCgpICAgICAxCisKKyNkZWZpbmUgTlZSQU1fQllURVMJCSgxMjgtTlZSQU1fRklSU1RfQllURSkKKworI2RlZmluZSBtYWNoX2NoZWNrX2NoZWNrc3VtCWNvYmFsdF9jaGVja19jaGVja3N1bQorI2RlZmluZSBtYWNoX3NldF9jaGVja3N1bQljb2JhbHRfc2V0X2NoZWNrc3VtCisjZGVmaW5lIG1hY2hfcHJvY19pbmZvcwkJY29iYWx0X3Byb2NfaW5mb3MKKworI2VuZGlmCisKKyNpZiBNQUNIID09IEFUQVJJCisKKy8qIFNwZWNpYWwgcGFyYW1ldGVycyBmb3IgUlRDIGluIEF0YXJpIG1hY2hpbmVzICovCisjaW5jbHVkZSA8YXNtL2F0YXJpaHcuaD4KKyNpbmNsdWRlIDxhc20vYXRhcmlpbnRzLmg+CisjZGVmaW5lIFJUQ19QT1JUKHgpCQkoVFRfUlRDX0JBUyArIDIqKHgpKQorI2RlZmluZSBDSEVDS19EUklWRVJfSU5JVCgpCShNQUNIX0lTX0FUQVJJICYmIEFUQVJJSFdfUFJFU0VOVChUVF9DTEspKQorCisjZGVmaW5lIE5WUkFNX0JZVEVTCQk1MAorCisvKiBPbiBBdGFyaXMsIHRoZSBjaGVja3N1bSBpcyBvdmVyIGFsbCBieXRlcyBleGNlcHQgdGhlIGNoZWNrc3VtIGJ5dGVzCisgKiB0aGVtc2VsdmVzOyB0aGVzZSBhcmUgYXQgdGhlIHZlcnkgZW5kICovCisjZGVmaW5lIEFUQVJJX0NLU19SQU5HRV9TVEFSVAkwCisjZGVmaW5lIEFUQVJJX0NLU19SQU5HRV9FTkQJNDcKKyNkZWZpbmUgQVRBUklfQ0tTX0xPQwkJNDgKKworI2RlZmluZSBtYWNoX2NoZWNrX2NoZWNrc3VtCWF0YXJpX2NoZWNrX2NoZWNrc3VtCisjZGVmaW5lIG1hY2hfc2V0X2NoZWNrc3VtCWF0YXJpX3NldF9jaGVja3N1bQorI2RlZmluZSBtYWNoX3Byb2NfaW5mb3MJCWF0YXJpX3Byb2NfaW5mb3MKKworI2VuZGlmCisKKy8qIE5vdGUgdGhhdCAqYWxsKiBjYWxscyB0byBDTU9TX1JFQUQgYW5kIENNT1NfV1JJVEUgbXVzdCBiZSBkb25lIHdpdGgKKyAqIHJ0Y19sb2NrIGhlbGQuIER1ZSB0byB0aGUgaW5kZXgtcG9ydC9kYXRhLXBvcnQgZGVzaWduIG9mIHRoZSBSVEMsIHdlCisgKiBkb24ndCB3YW50IHR3byBkaWZmZXJlbnQgdGhpbmdzIHRyeWluZyB0byBnZXQgdG8gaXQgYXQgb25jZS4gKGUuZy4gdGhlCisgKiBwZXJpb2RpYyAxMSBtaW4gc3luYyBmcm9tIHRpbWUuYyB2cy4gdGhpcyBkcml2ZXIuKQorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobnZyYW1fc3RhdGVfbG9jayk7CitzdGF0aWMgaW50IG52cmFtX29wZW5fY250OwkvKiAjdGltZXMgb3BlbmVkICovCitzdGF0aWMgaW50IG52cmFtX29wZW5fbW9kZTsJLyogc3BlY2lhbCBvcGVuIG1vZGVzICovCisjZGVmaW5lIE5WUkFNX1dSSVRFCQkxIC8qIG9wZW5lZCBmb3Igd3JpdGluZyAoZXhjbHVzaXZlKSAqLworI2RlZmluZSBOVlJBTV9FWENMCQkyIC8qIG9wZW5lZCB3aXRoIE9fRVhDTCAqLworCitzdGF0aWMgaW50IG1hY2hfY2hlY2tfY2hlY2tzdW0odm9pZCk7CitzdGF0aWMgdm9pZCBtYWNoX3NldF9jaGVja3N1bSh2b2lkKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50IG1hY2hfcHJvY19pbmZvcyh1bnNpZ25lZCBjaGFyICpjb250ZW50cywgY2hhciAqYnVmZmVyLCBpbnQgKmxlbiwKKyAgICBvZmZfdCAqYmVnaW4sIG9mZl90IG9mZnNldCwgaW50IHNpemUpOworI2VuZGlmCisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIHRvIGJlIGNhbGxlZCBpbnRlcm5hbGx5IG9yIGJ5IG90aGVyIHBhcnRzIG9mCisgKiB0aGUga2VybmVsLiBJdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZW5zdXJlIGNvcnJlY3QgY2hlY2tzdW0gYmVmb3JlIHJlYWRpbmcKKyAqIG9yIGFmdGVyIHdyaXRpbmcgKG5lZWRzIHRvIGJlIGRvbmUgb25seSBvbmNlKS4KKyAqCisgKiBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYWxsIGFjY2VzcyBieXRlcyBvZiBnZW5lcmFsCisgKiBwdXJwb3NlIG1lbW9yeSBpbiB0aGUgTlZSQU0gLSB0aGF0IGlzIHRvIHNheSwgdGhleSBhbGwgYWRkIHRoZQorICogTlZSQU1fRklSU1RfQllURSBvZmZzZXQuICBQYXNzIHRoZW0gb2Zmc2V0cyBpbnRvIE5WUkFNIGFzIGlmIHlvdSBkaWQgbm90IAorICoga25vdyBhYm91dCB0aGUgUlRDIGNydWZ0LgorICovCisKK3Vuc2lnbmVkIGNoYXIKK19fbnZyYW1fcmVhZF9ieXRlKGludCBpKQoreworCXJldHVybiBDTU9TX1JFQUQoTlZSQU1fRklSU1RfQllURSArIGkpOworfQorCit1bnNpZ25lZCBjaGFyCitudnJhbV9yZWFkX2J5dGUoaW50IGkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwljID0gX19udnJhbV9yZWFkX2J5dGUoaSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gYzsKK30KKworLyogVGhpcyByYWNlcyBuaWNlbHkgd2l0aCB0cnlpbmcgdG8gcmVhZCB3aXRoIGNoZWNrc3VtIGNoZWNraW5nIChudnJhbV9yZWFkKSAqLwordm9pZAorX19udnJhbV93cml0ZV9ieXRlKHVuc2lnbmVkIGNoYXIgYywgaW50IGkpCit7CisJQ01PU19XUklURShjLCBOVlJBTV9GSVJTVF9CWVRFICsgaSk7Cit9CisKK3ZvaWQKK252cmFtX3dyaXRlX2J5dGUodW5zaWduZWQgY2hhciBjLCBpbnQgaSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJX19udnJhbV93cml0ZV9ieXRlKGMsIGkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7Cit9CisKK2ludAorX19udnJhbV9jaGVja19jaGVja3N1bSh2b2lkKQoreworCXJldHVybiBtYWNoX2NoZWNrX2NoZWNrc3VtKCk7Cit9CisKK2ludAorbnZyYW1fY2hlY2tfY2hlY2tzdW0odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBydjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCXJ2ID0gX19udnJhbV9jaGVja19jaGVja3N1bSgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJ2OworfQorCit2b2lkCitfX252cmFtX3NldF9jaGVja3N1bSh2b2lkKQoreworCW1hY2hfc2V0X2NoZWNrc3VtKCk7Cit9CisKK3ZvaWQKK252cmFtX3NldF9jaGVja3N1bSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwlfX252cmFtX3NldF9jaGVja3N1bSgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBUaGUgYXJlIHRoZSBmaWxlIG9wZXJhdGlvbiBmdW5jdGlvbiBmb3IgdXNlciBhY2Nlc3MgdG8gL2Rldi9udnJhbQorICovCisKK3N0YXRpYyBsb2ZmX3QgbnZyYW1fbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4gKQoreworCWxvY2tfa2VybmVsKCk7CisJc3dpdGNoIChvcmlnaW4pIHsKKwljYXNlIDA6CisJCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwkJYnJlYWs7CisJY2FzZSAxOgorCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJb2Zmc2V0ICs9IE5WUkFNX0JZVEVTOworCQlicmVhazsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAob2Zmc2V0ID49IDApID8gKGZpbGUtPmZfcG9zID0gb2Zmc2V0KSA6IC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitudnJhbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBjaGFyIGNvbnRlbnRzW05WUkFNX0JZVEVTXTsKKwl1bnNpZ25lZCBpID0gKnBwb3M7CisJdW5zaWduZWQgY2hhciAqdG1wOworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCisJaWYgKCFfX252cmFtX2NoZWNrX2NoZWNrc3VtKCkpCisJCWdvdG8gY2hlY2tzdW1fZXJyOworCisJZm9yICh0bXAgPSBjb250ZW50czsgY291bnQtLSA+IDAgJiYgaSA8IE5WUkFNX0JZVEVTOyArK2ksICsrdG1wKQorCQkqdG1wID0gX19udnJhbV9yZWFkX2J5dGUoaSk7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBjb250ZW50cywgdG1wIC0gY29udGVudHMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCSpwcG9zID0gaTsKKworCXJldHVybiB0bXAgLSBjb250ZW50czsKKworICAgICAgY2hlY2tzdW1fZXJyOgorCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgc3NpemVfdAorbnZyYW1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGNoYXIgY29udGVudHNbTlZSQU1fQllURVNdOworCXVuc2lnbmVkIGkgPSAqcHBvczsKKwl1bnNpZ25lZCBjaGFyICp0bXA7CisJaW50IGxlbjsKKworCWxlbiA9IChOVlJBTV9CWVRFUyAtIGkpIDwgY291bnQgPyAoTlZSQU1fQllURVMgLSBpKSA6IGNvdW50OworCWlmIChjb3B5X2Zyb21fdXNlcihjb250ZW50cywgYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWlmICghX19udnJhbV9jaGVja19jaGVja3N1bSgpKQorCQlnb3RvIGNoZWNrc3VtX2VycjsKKworCWZvciAodG1wID0gY29udGVudHM7IGNvdW50LS0gPiAwICYmIGkgPCBOVlJBTV9CWVRFUzsgKytpLCArK3RtcCkKKwkJX19udnJhbV93cml0ZV9ieXRlKCp0bXAsIGkpOworCisJX19udnJhbV9zZXRfY2hlY2tzdW0oKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJKnBwb3MgPSBpOworCisJcmV0dXJuIHRtcCAtIGNvbnRlbnRzOworCisgICAgICBjaGVja3N1bV9lcnI6CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQKK252cmFtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBpOworCisJc3dpdGNoIChjbWQpIHsKKworCWNhc2UgTlZSQU1fSU5JVDoKKwkJLyogaW5pdGlhbGl6ZSBOVlJBTSBjb250ZW50cyBhbmQgY2hlY2tzdW0gKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCisJCWZvciAoaSA9IDA7IGkgPCBOVlJBTV9CWVRFUzsgKytpKQorCQkJX19udnJhbV93cml0ZV9ieXRlKDAsIGkpOworCQlfX252cmFtX3NldF9jaGVja3N1bSgpOworCisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm4gMDsKKworCWNhc2UgTlZSQU1fU0VUQ0tTOgorCQkvKiBqdXN0IHNldCBjaGVja3N1bSwgY29udGVudHMgdW5jaGFuZ2VkIChtYXliZSB1c2VmdWwgYWZ0ZXIgCisJCSAqIGNoZWNrc3VtIGdhcmJhZ2VkIHNvbWVob3cuLi4pICovCisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJX19udnJhbV9zZXRfY2hlY2tzdW0oKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQorCitzdGF0aWMgaW50CitudnJhbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXNwaW5fbG9jaygmbnZyYW1fc3RhdGVfbG9jayk7CisKKwlpZiAoKG52cmFtX29wZW5fY250ICYmIChmaWxlLT5mX2ZsYWdzICYgT19FWENMKSkgfHwKKwkgICAgKG52cmFtX29wZW5fbW9kZSAmIE5WUkFNX0VYQ0wpIHx8CisJICAgICgoZmlsZS0+Zl9tb2RlICYgMikgJiYgKG52cmFtX29wZW5fbW9kZSAmIE5WUkFNX1dSSVRFKSkpIHsKKwkJc3Bpbl91bmxvY2soJm52cmFtX3N0YXRlX2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19FWENMKQorCQludnJhbV9vcGVuX21vZGUgfD0gTlZSQU1fRVhDTDsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgMikKKwkJbnZyYW1fb3Blbl9tb2RlIHw9IE5WUkFNX1dSSVRFOworCW52cmFtX29wZW5fY250Kys7CisKKwlzcGluX3VubG9jaygmbnZyYW1fc3RhdGVfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnZyYW1fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzcGluX2xvY2soJm52cmFtX3N0YXRlX2xvY2spOworCisJbnZyYW1fb3Blbl9jbnQtLTsKKworCS8qIGlmIG9ubHkgb25lIGluc3RhbmNlIGlzIG9wZW4sIGNsZWFyIHRoZSBFWENMIGJpdCAqLworCWlmIChudnJhbV9vcGVuX21vZGUgJiBOVlJBTV9FWENMKQorCQludnJhbV9vcGVuX21vZGUgJj0gfk5WUkFNX0VYQ0w7CisJaWYgKGZpbGUtPmZfbW9kZSAmIDIpCisJCW52cmFtX29wZW5fbW9kZSAmPSB+TlZSQU1fV1JJVEU7CisKKwlzcGluX3VubG9jaygmbnZyYW1fc3RhdGVfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmbmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGludAorbnZyYW1fcmVhZF9wcm9jKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisgICAgaW50IHNpemUsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXJldHVybiAwOworfQorI2Vsc2UKKworc3RhdGljIGludAorbnZyYW1fcmVhZF9wcm9jKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisgICAgaW50IHNpemUsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGNoYXIgY29udGVudHNbTlZSQU1fQllURVNdOworCWludCBpLCBsZW4gPSAwOworCW9mZl90IGJlZ2luID0gMDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlZSQU1fQllURVM7ICsraSkKKwkJY29udGVudHNbaV0gPSBfX252cmFtX3JlYWRfYnl0ZShpKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCSplb2YgPSBtYWNoX3Byb2NfaW5mb3MoY29udGVudHMsIGJ1ZmZlciwgJmxlbiwgJmJlZ2luLCBvZmZzZXQsIHNpemUpOworCisJaWYgKG9mZnNldCA+PSBiZWdpbiArIGxlbikKKwkJcmV0dXJuIDA7CisJKnN0YXJ0ID0gYnVmZmVyICsgKG9mZnNldCAtIGJlZ2luKTsKKwlyZXR1cm4gKHNpemUgPCBiZWdpbiArIGxlbiAtIG9mZnNldCkgPyBzaXplIDogYmVnaW4gKyBsZW4gLSBvZmZzZXQ7CisKK30KKworLyogVGhpcyBtYWNybyBmcmVlcyB0aGUgbWFjaGluZSBzcGVjaWZpYyBmdW5jdGlvbiBmcm9tIGJvdW5kcyBjaGVja2luZyBhbmQKKyAqIHRoaXMgbGlrZSB0aGF0Li4uICovCisjZGVmaW5lIFBSSU5UX1BST0MoZm10LGFyZ3MuLi4pCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCSpsZW4gKz0gc3ByaW50ZihidWZmZXIrKmxlbiwgZm10LCAjI2FyZ3MpOwlcCisJCWlmICgqYmVnaW4gKyAqbGVuID4gb2Zmc2V0ICsgc2l6ZSkJCVwKKwkJCXJldHVybiAwOwkJCQlcCisJCWlmICgqYmVnaW4gKyAqbGVuIDwgb2Zmc2V0KSB7CQkJXAorCQkJKmJlZ2luICs9ICpsZW47CQkJCVwKKwkJCSpsZW4gPSAwOwkJCQlcCisJCX0JCQkJCQlcCisJfSB3aGlsZSgwKQorCisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbnZyYW1fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBudnJhbV9sbHNlZWssCisJLnJlYWQJCT0gbnZyYW1fcmVhZCwKKwkud3JpdGUJCT0gbnZyYW1fd3JpdGUsCisJLmlvY3RsCQk9IG52cmFtX2lvY3RsLAorCS5vcGVuCQk9IG52cmFtX29wZW4sCisJLnJlbGVhc2UJPSBudnJhbV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIG52cmFtX2RldiA9IHsKKwlOVlJBTV9NSU5PUiwKKwkibnZyYW0iLAorCSZudnJhbV9mb3BzCit9OworCitzdGF0aWMgaW50IF9faW5pdAorbnZyYW1faW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwkvKiBGaXJzdCB0ZXN0IHdoZXRoZXIgdGhlIGRyaXZlciBzaG91bGQgaW5pdCBhdCBhbGwgKi8KKwlpZiAoIUNIRUNLX0RSSVZFUl9JTklUKCkpCisJCXJldHVybiAtRU5YSU87CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZudnJhbV9kZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJudnJhbTogY2FuJ3QgbWlzY19yZWdpc3RlciBvbiBtaW5vcj0lZFxuIiwKKwkJICAgIE5WUkFNX01JTk9SKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICghY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZHJpdmVyL252cmFtIiwgMCwgTlVMTCwgbnZyYW1fcmVhZF9wcm9jLAorCQlOVUxMKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm52cmFtOiBjYW4ndCBjcmVhdGUgL3Byb2MvZHJpdmVyL252cmFtXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRtaXNjOworCX0KKwlyZXQgPSAwOworCXByaW50ayhLRVJOX0lORk8gIk5vbi12b2xhdGlsZSBtZW1vcnkgZHJpdmVyIHYiIE5WUkFNX1ZFUlNJT04gIlxuIik7CisgICAgICBvdXQ6CisJcmV0dXJuIHJldDsKKyAgICAgIG91dG1pc2M6CisJbWlzY19kZXJlZ2lzdGVyKCZudnJhbV9kZXYpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK252cmFtX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9udnJhbSIsIE5VTEwpOworCW1pc2NfZGVyZWdpc3RlcigmbnZyYW1fZGV2KTsKK30KKworbW9kdWxlX2luaXQobnZyYW1faW5pdCk7Cittb2R1bGVfZXhpdChudnJhbV9jbGVhbnVwX21vZHVsZSk7CisKKy8qCisgKiBNYWNoaW5lIHNwZWNpZmljIGZ1bmN0aW9ucworICovCisKKyNpZiBNQUNIID09IFBDCisKK3N0YXRpYyBpbnQKK3BjX2NoZWNrX2NoZWNrc3VtKHZvaWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgc3VtID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBleHBlY3Q7CisKKwlmb3IgKGkgPSBQQ19DS1NfUkFOR0VfU1RBUlQ7IGkgPD0gUENfQ0tTX1JBTkdFX0VORDsgKytpKQorCQlzdW0gKz0gX19udnJhbV9yZWFkX2J5dGUoaSk7CisJZXhwZWN0ID0gX19udnJhbV9yZWFkX2J5dGUoUENfQ0tTX0xPQyk8PDggfAorCSAgICBfX252cmFtX3JlYWRfYnl0ZShQQ19DS1NfTE9DKzEpOworCXJldHVybiAoKHN1bSAmIDB4ZmZmZikgPT0gZXhwZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3BjX3NldF9jaGVja3N1bSh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0IHN1bSA9IDA7CisKKwlmb3IgKGkgPSBQQ19DS1NfUkFOR0VfU1RBUlQ7IGkgPD0gUENfQ0tTX1JBTkdFX0VORDsgKytpKQorCQlzdW0gKz0gX19udnJhbV9yZWFkX2J5dGUoaSk7CisJX19udnJhbV93cml0ZV9ieXRlKHN1bSA+PiA4LCBQQ19DS1NfTE9DKTsKKwlfX252cmFtX3dyaXRlX2J5dGUoc3VtICYgMHhmZiwgUENfQ0tTX0xPQyArIDEpOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIGNoYXIgKmZsb3BweV90eXBlc1tdID0geworCSJub25lIiwgIjUuMjUnJyAzNjBrIiwgIjUuMjUnJyAxLjJNIiwgIjMuNScnIDcyMGsiLCAiMy41JycgMS40NE0iLAorCSIzLjUnJyAyLjg4TSIsICIzLjUnJyAyLjg4TSIKK307CisKK3N0YXRpYyBjaGFyICpnZnhfdHlwZXNbXSA9IHsKKwkiRUdBLCBWR0EsIC4uLiAod2l0aCBCSU9TKSIsCisJIkNHQSAoNDAgY29scykiLAorCSJDR0EgKDgwIGNvbHMpIiwKKwkibW9ub2Nocm9tZSIsCit9OworCitzdGF0aWMgaW50CitwY19wcm9jX2luZm9zKHVuc2lnbmVkIGNoYXIgKm52cmFtLCBjaGFyICpidWZmZXIsIGludCAqbGVuLAorICAgIG9mZl90ICpiZWdpbiwgb2ZmX3Qgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwlpbnQgY2hlY2tzdW07CisJaW50IHR5cGU7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJY2hlY2tzdW0gPSBfX252cmFtX2NoZWNrX2NoZWNrc3VtKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlQUklOVF9QUk9DKCJDaGVja3N1bSBzdGF0dXM6ICVzdmFsaWRcbiIsIGNoZWNrc3VtID8gIiIgOiAibm90ICIpOworCisJUFJJTlRfUFJPQygiIyBmbG9wcGllcyAgICAgOiAlZFxuIiwKKwkgICAgKG52cmFtWzZdICYgMSkgPyAobnZyYW1bNl0gPj4gNikgKyAxIDogMCk7CisJUFJJTlRfUFJPQygiRmxvcHB5IDAgdHlwZSAgOiAiKTsKKwl0eXBlID0gbnZyYW1bMl0gPj4gNDsKKwlpZiAodHlwZSA8IHNpemVvZiAoZmxvcHB5X3R5cGVzKSAvIHNpemVvZiAoKmZsb3BweV90eXBlcykpCisJCVBSSU5UX1BST0MoIiVzXG4iLCBmbG9wcHlfdHlwZXNbdHlwZV0pOworCWVsc2UKKwkJUFJJTlRfUFJPQygiJWQgKHVua25vd24pXG4iLCB0eXBlKTsKKwlQUklOVF9QUk9DKCJGbG9wcHkgMSB0eXBlICA6ICIpOworCXR5cGUgPSBudnJhbVsyXSAmIDB4MGY7CisJaWYgKHR5cGUgPCBzaXplb2YgKGZsb3BweV90eXBlcykgLyBzaXplb2YgKCpmbG9wcHlfdHlwZXMpKQorCQlQUklOVF9QUk9DKCIlc1xuIiwgZmxvcHB5X3R5cGVzW3R5cGVdKTsKKwllbHNlCisJCVBSSU5UX1BST0MoIiVkICh1bmtub3duKVxuIiwgdHlwZSk7CisKKwlQUklOVF9QUk9DKCJIRCAwIHR5cGUgICAgICA6ICIpOworCXR5cGUgPSBudnJhbVs0XSA+PiA0OworCWlmICh0eXBlKQorCQlQUklOVF9QUk9DKCIlMDJ4XG4iLCB0eXBlID09IDB4MGYgPyBudnJhbVsxMV0gOiB0eXBlKTsKKwllbHNlCisJCVBSSU5UX1BST0MoIm5vbmVcbiIpOworCisJUFJJTlRfUFJPQygiSEQgMSB0eXBlICAgICAgOiAiKTsKKwl0eXBlID0gbnZyYW1bNF0gJiAweDBmOworCWlmICh0eXBlKQorCQlQUklOVF9QUk9DKCIlMDJ4XG4iLCB0eXBlID09IDB4MGYgPyBudnJhbVsxMl0gOiB0eXBlKTsKKwllbHNlCisJCVBSSU5UX1BST0MoIm5vbmVcbiIpOworCisJUFJJTlRfUFJPQygiSEQgdHlwZSA0OCBkYXRhOiAlZC8lZC8lZCBDL0gvUywgcHJlY29tcCAlZCwgbHogJWRcbiIsCisJICAgIG52cmFtWzE4XSB8IChudnJhbVsxOV0gPDwgOCksCisJICAgIG52cmFtWzIwXSwgbnZyYW1bMjVdLAorCSAgICBudnJhbVsyMV0gfCAobnZyYW1bMjJdIDw8IDgpLCBudnJhbVsyM10gfCAobnZyYW1bMjRdIDw8IDgpKTsKKwlQUklOVF9QUk9DKCJIRCB0eXBlIDQ5IGRhdGE6ICVkLyVkLyVkIEMvSC9TLCBwcmVjb21wICVkLCBseiAlZFxuIiwKKwkgICAgbnZyYW1bMzldIHwgKG52cmFtWzQwXSA8PCA4KSwKKwkgICAgbnZyYW1bNDFdLCBudnJhbVs0Nl0sCisJICAgIG52cmFtWzQyXSB8IChudnJhbVs0M10gPDwgOCksIG52cmFtWzQ0XSB8IChudnJhbVs0NV0gPDwgOCkpOworCisJUFJJTlRfUFJPQygiRE9TIGJhc2UgbWVtb3J5OiAlZCBrQlxuIiwgbnZyYW1bN10gfCAobnZyYW1bOF0gPDwgOCkpOworCVBSSU5UX1BST0MoIkV4dGVuZGVkIG1lbW9yeTogJWQga0IgKGNvbmZpZ3VyZWQpLCAlZCBrQiAodGVzdGVkKVxuIiwKKwkgICAgbnZyYW1bOV0gfCAobnZyYW1bMTBdIDw8IDgpLCBudnJhbVszNF0gfCAobnZyYW1bMzVdIDw8IDgpKTsKKworCVBSSU5UX1BST0MoIkdmeCBhZGFwdGVyICAgIDogJXNcbiIsIGdmeF90eXBlc1sobnZyYW1bNl0gPj4gNCkgJiAzXSk7CisKKwlQUklOVF9QUk9DKCJGUFUgICAgICAgICAgICA6ICVzaW5zdGFsbGVkXG4iLAorCSAgICAobnZyYW1bNl0gJiAyKSA/ICIiIDogIm5vdCAiKTsKKworCXJldHVybiAxOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBNQUNIID09IFBDICovCisKKyNpZiBNQUNIID09IENPQkFMVAorCisvKiB0aGUgY29iYWx0IENNT1MgaGFzIGEgd2lkZXIgcmFuZ2Ugb2YgaXRzIGNoZWNrc3VtICovCitzdGF0aWMgaW50IGNvYmFsdF9jaGVja19jaGVja3N1bSh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0IHN1bSA9IDA7CisJdW5zaWduZWQgc2hvcnQgZXhwZWN0OworCisJZm9yIChpID0gQ09CVF9DTU9TX0NLU19TVEFSVDsgaSA8PSBDT0JUX0NNT1NfQ0tTX0VORDsgKytpKSB7CisJCWlmICgoaSA9PSBDT0JUX0NNT1NfQ0hFQ0tTVU0pIHx8IChpID09IChDT0JUX0NNT1NfQ0hFQ0tTVU0rMSkpKQorCQkJY29udGludWU7CisKKwkJc3VtICs9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOworCX0KKwlleHBlY3QgPSBfX252cmFtX3JlYWRfYnl0ZShDT0JUX0NNT1NfQ0hFQ0tTVU0pIDw8IDggfAorCSAgICBfX252cmFtX3JlYWRfYnl0ZShDT0JUX0NNT1NfQ0hFQ0tTVU0rMSk7CisJcmV0dXJuICgoc3VtICYgMHhmZmZmKSA9PSBleHBlY3QpOworfQorCitzdGF0aWMgdm9pZCBjb2JhbHRfc2V0X2NoZWNrc3VtKHZvaWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgc3VtID0gMDsKKworCWZvciAoaSA9IENPQlRfQ01PU19DS1NfU1RBUlQ7IGkgPD0gQ09CVF9DTU9TX0NLU19FTkQ7ICsraSkgeworCQlpZiAoKGkgPT0gQ09CVF9DTU9TX0NIRUNLU1VNKSB8fCAoaSA9PSAoQ09CVF9DTU9TX0NIRUNLU1VNKzEpKSkKKwkJCWNvbnRpbnVlOworCisJCXN1bSArPSBfX252cmFtX3JlYWRfYnl0ZShpKTsKKwl9CisKKwlfX252cmFtX3dyaXRlX2J5dGUoc3VtID4+IDgsIENPQlRfQ01PU19DSEVDS1NVTSk7CisJX19udnJhbV93cml0ZV9ieXRlKHN1bSAmIDB4ZmYsIENPQlRfQ01PU19DSEVDS1NVTSsxKTsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyBpbnQgY29iYWx0X3Byb2NfaW5mb3ModW5zaWduZWQgY2hhciAqbnZyYW0sIGNoYXIgKmJ1ZmZlciwgaW50ICpsZW4sCisJb2ZmX3QgKmJlZ2luLCBvZmZfdCBvZmZzZXQsIGludCBzaXplKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBjaGVja3N1bTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJY2hhciBzZXJudW1bMTRdOworCWNoYXIgKmtleSA9ICJjTm9FYlRhV2xPdFIhIjsKKwl1bnNpZ25lZCBjaGFyIGJ0b19jc3VtOworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCWNoZWNrc3VtID0gX19udnJhbV9jaGVja19jaGVja3N1bSgpOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJUFJJTlRfUFJPQygiQ2hlY2tzdW0gc3RhdHVzOiAlc3ZhbGlkXG4iLCBjaGVja3N1bSA/ICIiIDogIm5vdCAiKTsKKworCWZsYWdzID0gbnZyYW1bQ09CVF9DTU9TX0ZMQUdfQllURV8wXSA8PCA4IAorCSAgICB8IG52cmFtW0NPQlRfQ01PU19GTEFHX0JZVEVfMV07CisKKwlQUklOVF9QUk9DKCJDb25zb2xlOiAlc1xuIiwKKwkJZmxhZ3MgJiBDT0JUX0NNT1NfQ09OU09MRV9GTEFHID8gICJvbiI6ICJvZmYiKTsKKworCVBSSU5UX1BST0MoIkZpcm13YXJlIERlYnVnIE1lc3NhZ2VzOiAlc1xuIiwKKwkJZmxhZ3MgJiBDT0JUX0NNT1NfREVCVUdfRkxBRyA/ICJvbiI6ICJvZmYiKTsKKworCVBSSU5UX1BST0MoIkF1dG8gUHJvbXB0OiAlc1xuIiwKKwkJZmxhZ3MgJiBDT0JUX0NNT1NfQVVUT19QUk9NUFRfRkxBRyA/ICJvbiI6ICJvZmYiKTsKKworCVBSSU5UX1BST0MoIlNodXRkb3duIFN0YXR1czogJXNcbiIsCisJCWZsYWdzICYgQ09CVF9DTU9TX0NMRUFOX0JPT1RfRkxBRyA/ICJjbGVhbiI6ICJkaXJ0eSIpOworCisJUFJJTlRfUFJPQygiSGFyZHdhcmUgUHJvYmU6ICVzXG4iLAorCQlmbGFncyAmIENPQlRfQ01PU19IV19OT1BST0JFX0ZMQUcgPyAicGFydGlhbCI6ICJmdWxsIik7CisKKwlQUklOVF9QUk9DKCJTeXN0ZW0gRmF1bHQ6ICVzZGV0ZWN0ZWRcbiIsCisJCWZsYWdzICYgQ09CVF9DTU9TX1NZU0ZBVUxUX0ZMQUcgPyAiIjogIm5vdCAiKTsKKworCVBSSU5UX1BST0MoIlBhbmljIG9uIE9PUFM6ICVzXG4iLAorCQlmbGFncyAmIENPQlRfQ01PU19PT1BTUEFOSUNfRkxBRyA/ICJ5ZXMiOiAibm8iKTsKKworCVBSSU5UX1BST0MoIkRlbGF5ZWQgQ2FjaGUgSW5pdGlhbGl6YXRpb246ICVzXG4iLAorCQlmbGFncyAmIENPQlRfQ01PU19ERUxBWV9DQUNIRV9GTEFHID8gInllcyI6ICJubyIpOworCisJUFJJTlRfUFJPQygiU2hvdyBMb2dvIGF0IEJvb3Q6ICVzXG4iLAorCQlmbGFncyAmIENPQlRfQ01PU19OT0xPR09fRkxBRyA/ICJubyI6ICJ5ZXMiKTsKKworCVBSSU5UX1BST0MoIkJvb3QgTWV0aG9kOiAiKTsKKwlzd2l0Y2ggKG52cmFtW0NPQlRfQ01PU19CT09UX01FVEhPRF0pIHsKKwljYXNlIENPQlRfQ01PU19CT09UX01FVEhPRF9ESVNLOgorCQlQUklOVF9QUk9DKCJkaXNrXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIENPQlRfQ01PU19CT09UX01FVEhPRF9ST006CisJCVBSSU5UX1BST0MoInJvbVxuIik7CisJCWJyZWFrOworCisJY2FzZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfTkVUOgorCQlQUklOVF9QUk9DKCJuZXRcbiIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBSSU5UX1BST0MoInVua25vd25cbiIpOworCQlicmVhazsKKwl9CisKKwlQUklOVF9QUk9DKCJQcmltYXJ5IEJvb3QgRGV2aWNlOiAlZDolZFxuIiwKKwkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMF9NQUpdLAorCQludnJhbVtDT0JUX0NNT1NfQk9PVF9ERVYwX01JTl0gKTsKKwlQUklOVF9QUk9DKCJTZWNvbmRhcnkgQm9vdCBEZXZpY2U6ICVkOiVkXG4iLAorCQludnJhbVtDT0JUX0NNT1NfQk9PVF9ERVYxX01BSl0sCisJCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjFfTUlOXSApOworCVBSSU5UX1BST0MoIlRlcnRpYXJ5IEJvb3QgRGV2aWNlOiAlZDolZFxuIiwKKwkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMl9NQUpdLAorCQludnJhbVtDT0JUX0NNT1NfQk9PVF9ERVYyX01JTl0gKTsKKworCVBSSU5UX1BST0MoIlVwdGltZTogJWRcbiIsCisJCW52cmFtW0NPQlRfQ01PU19VUFRJTUVfMF0gPDwgMjQgfAorCQludnJhbVtDT0JUX0NNT1NfVVBUSU1FXzFdIDw8IDE2IHwKKwkJbnZyYW1bQ09CVF9DTU9TX1VQVElNRV8yXSA8PCA4ICB8CisJCW52cmFtW0NPQlRfQ01PU19VUFRJTUVfM10pOworCisJUFJJTlRfUFJPQygiQm9vdCBDb3VudDogJWRcbiIsCisJCW52cmFtW0NPQlRfQ01PU19CT09UQ09VTlRfMF0gPDwgMjQgfAorCQludnJhbVtDT0JUX0NNT1NfQk9PVENPVU5UXzFdIDw8IDE2IHwKKwkJbnZyYW1bQ09CVF9DTU9TX0JPT1RDT1VOVF8yXSA8PCA4ICB8CisJCW52cmFtW0NPQlRfQ01PU19CT09UQ09VTlRfM10pOworCisJLyogMTMgYnl0ZXMgb2Ygc2VyaWFsIG51bSAqLworCWZvciAoaT0wIDsgaTwxMyA7IGkrKykgeworCQlzZXJudW1baV0gPSBudnJhbVtDT0JUX0NNT1NfU1lTX1NFUk5VTV8wICsgaV07CisJfQorCXNlcm51bVsxM10gPSAnXDAnOworCisJY2hlY2tzdW0gPSAwOworCWZvciAoaT0wIDsgaTwxMyA7IGkrKykgeworCQljaGVja3N1bSArPSBzZXJudW1baV0gXiBrZXlbaV07CisJfQorCWNoZWNrc3VtID0gKChjaGVja3N1bSAmIDB4N2YpIF4gKDB4ZDYpKSAmIDB4ZmY7CisKKwlQUklOVF9QUk9DKCJTZXJpYWwgTnVtYmVyOiAlcyIsIHNlcm51bSk7CisJaWYgKGNoZWNrc3VtICE9IG52cmFtW0NPQlRfQ01PU19TWVNfU0VSTlVNX0NTVU1dKSB7CisJCVBSSU5UX1BST0MoIiAoaW52YWxpZCBjaGVja3N1bSkiKTsKKwl9CisJUFJJTlRfUFJPQygiXG4iKTsKKworCVBSSU5UX1BST0MoIlJvbSBSZXZpc29uOiAlZC4lZC4lZFxuIiwgbnZyYW1bQ09CVF9DTU9TX1JPTV9SRVZfTUFKXSwKKwkJbnZyYW1bQ09CVF9DTU9TX1JPTV9SRVZfTUlOXSwgbnZyYW1bQ09CVF9DTU9TX1JPTV9SRVZfUkVWXSk7CisKKwlQUklOVF9QUk9DKCJCVE8gU2VydmVyOiAlZC4lZC4lZC4lZCIsIG52cmFtW0NPQlRfQ01PU19CVE9fSVBfMF0sCisJCW52cmFtW0NPQlRfQ01PU19CVE9fSVBfMV0sIG52cmFtW0NPQlRfQ01PU19CVE9fSVBfMl0sCisJCW52cmFtW0NPQlRfQ01PU19CVE9fSVBfM10pOworCWJ0b19jc3VtID0gbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8wXSArIG52cmFtW0NPQlRfQ01PU19CVE9fSVBfMV0KKwkJKyBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzJdICsgbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8zXTsKKwlpZiAoYnRvX2NzdW0gIT0gbnZyYW1bQ09CVF9DTU9TX0JUT19JUF9DU1VNXSkgeworCQlQUklOVF9QUk9DKCIgKGludmFsaWQgY2hlY2tzdW0pIik7CisJfQorCVBSSU5UX1BST0MoIlxuIik7CisKKwlpZiAoZmxhZ3MgJiBDT0JUX0NNT1NfVkVSU0lPTl9GTEFHCisJICYmIG52cmFtW0NPQlRfQ01PU19WRVJTSU9OXSA+PSBDT0JUX0NNT1NfVkVSX0JUT0NPREUpIHsKKwkJUFJJTlRfUFJPQygiQlRPIENvZGU6IDB4JXhcbiIsCisJCQludnJhbVtDT0JUX0NNT1NfQlRPX0NPREVfMF0gPDwgMjQgfAorCQkJbnZyYW1bQ09CVF9DTU9TX0JUT19DT0RFXzFdIDw8IDE2IHwKKwkJCW52cmFtW0NPQlRfQ01PU19CVE9fQ09ERV8yXSA8PCA4IHwKKwkJCW52cmFtW0NPQlRfQ01PU19CVE9fQ09ERV8zXSk7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworI2VuZGlmIC8qIE1BQ0ggPT0gQ09CQUxUICovCisKKyNpZiBNQUNIID09IEFUQVJJCisKK3N0YXRpYyBpbnQKK2F0YXJpX2NoZWNrX2NoZWNrc3VtKHZvaWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBzdW0gPSAwOworCisJZm9yIChpID0gQVRBUklfQ0tTX1JBTkdFX1NUQVJUOyBpIDw9IEFUQVJJX0NLU19SQU5HRV9FTkQ7ICsraSkKKwkJc3VtICs9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOworCXJldHVybiAoX19udnJhbV9yZWFkX2J5dGUoQVRBUklfQ0tTX0xPQykgPT0gKH5zdW0gJiAweGZmKSAmJgorCSAgICBfX252cmFtX3JlYWRfYnl0ZShBVEFSSV9DS1NfTE9DICsgMSkgPT0gKHN1bSAmIDB4ZmYpKTsKK30KKworc3RhdGljIHZvaWQKK2F0YXJpX3NldF9jaGVja3N1bSh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgc3VtID0gMDsKKworCWZvciAoaSA9IEFUQVJJX0NLU19SQU5HRV9TVEFSVDsgaSA8PSBBVEFSSV9DS1NfUkFOR0VfRU5EOyArK2kpCisJCXN1bSArPSBfX252cmFtX3JlYWRfYnl0ZShpKTsKKwlfX252cmFtX3dyaXRlX2J5dGUofnN1bSwgQVRBUklfQ0tTX0xPQyk7CisJX19udnJhbV93cml0ZV9ieXRlKHN1bSwgQVRBUklfQ0tTX0xPQyArIDEpOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciB2YWw7CisJY2hhciAqbmFtZTsKK30gYm9vdF9wcmVmc1tdID0geworCXsgMHg4MCwgIlRPUyIgfSwKKwl7IDB4NDAsICJBU1YiIH0sCisJeyAweDIwLCAiTmV0QlNEICg/KSIgfSwKKwl7IDB4MTAsICJMaW51eCIgfSwKKwl7IDB4MDAsICJ1bnNwZWNpZmllZCIgfQorfTsKKworc3RhdGljIGNoYXIgKmxhbmd1YWdlc1tdID0geworCSJFbmdsaXNoIChVUykiLAorCSJHZXJtYW4iLAorCSJGcmVuY2giLAorCSJFbmdsaXNoIChVSykiLAorCSJTcGFuaXNoIiwKKwkiSXRhbGlhbiIsCisJIjYgKHVuZGVmaW5lZCkiLAorCSJTd2lzcyAoRnJlbmNoKSIsCisJIlN3aXNzIChHZXJtYW4pIgorfTsKKworc3RhdGljIGNoYXIgKmRhdGVmb3JtYXRbXSA9IHsKKwkiTU0lY0REJWNZWSIsCisJIkREJWNNTSVjWVkiLAorCSJZWSVjTU0lY0REIiwKKwkiWVklY0REJWNNTSIsCisJIjQgKHVuZGVmaW5lZCkiLAorCSI1ICh1bmRlZmluZWQpIiwKKwkiNiAodW5kZWZpbmVkKSIsCisJIjcgKHVuZGVmaW5lZCkiCit9OworCitzdGF0aWMgY2hhciAqY29sb3JzW10gPSB7CisJIjIiLCAiNCIsICIxNiIsICIyNTYiLCAiNjU1MzYiLCAiPz8iLCAiPz8iLCAiPz8iCit9OworCisjZGVmaW5lIGZpZWxkc2l6ZShhKQkoc2l6ZW9mKGEpL3NpemVvZigqYSkpCisKK3N0YXRpYyBpbnQKK2F0YXJpX3Byb2NfaW5mb3ModW5zaWduZWQgY2hhciAqbnZyYW0sIGNoYXIgKmJ1ZmZlciwgaW50ICpsZW4sCisgICAgb2ZmX3QgKmJlZ2luLCBvZmZfdCBvZmZzZXQsIGludCBzaXplKQoreworCWludCBjaGVja3N1bSA9IG52cmFtX2NoZWNrX2NoZWNrc3VtKCk7CisJaW50IGk7CisJdW5zaWduZWQgdm1vZGU7CisKKwlQUklOVF9QUk9DKCJDaGVja3N1bSBzdGF0dXMgIDogJXN2YWxpZFxuIiwgY2hlY2tzdW0gPyAiIiA6ICJub3QgIik7CisKKwlQUklOVF9QUk9DKCJCb290IHByZWZlcmVuY2UgIDogIik7CisJZm9yIChpID0gZmllbGRzaXplKGJvb3RfcHJlZnMpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKwkJaWYgKG52cmFtWzFdID09IGJvb3RfcHJlZnNbaV0udmFsKSB7CisJCQlQUklOVF9QUk9DKCIlc1xuIiwgYm9vdF9wcmVmc1tpXS5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpIDwgMCkKKwkJUFJJTlRfUFJPQygiMHglMDJ4ICh1bmRlZmluZWQpXG4iLCBudnJhbVsxXSk7CisKKwlQUklOVF9QUk9DKCJTQ1NJIGFyYml0cmF0aW9uIDogJXNcbiIsCisJICAgIChudnJhbVsxNl0gJiAweDgwKSA/ICJvbiIgOiAib2ZmIik7CisJUFJJTlRfUFJPQygiU0NTSSBob3N0IElEICAgICA6ICIpOworCWlmIChudnJhbVsxNl0gJiAweDgwKQorCQlQUklOVF9QUk9DKCIlZFxuIiwgbnZyYW1bMTZdICYgNyk7CisJZWxzZQorCQlQUklOVF9QUk9DKCJuL2FcbiIpOworCisJLyogdGhlIGZvbGxvd2luZyBlbnRyaWVzIGFyZSBkZWZpbmVkIG9ubHkgZm9yIHRoZSBGYWxjb24gKi8KKwlpZiAoKGF0YXJpX21jaF9jb29raWUgPj4gMTYpICE9IEFUQVJJX01DSF9GQUxDT04pCisJCXJldHVybiAxOworCisJUFJJTlRfUFJPQygiT1MgbGFuZ3VhZ2UgICAgICA6ICIpOworCWlmIChudnJhbVs2XSA8IGZpZWxkc2l6ZShsYW5ndWFnZXMpKQorCQlQUklOVF9QUk9DKCIlc1xuIiwgbGFuZ3VhZ2VzW252cmFtWzZdXSk7CisJZWxzZQorCQlQUklOVF9QUk9DKCIldSAodW5kZWZpbmVkKVxuIiwgbnZyYW1bNl0pOworCVBSSU5UX1BST0MoIktleWJvYXJkIGxhbmd1YWdlOiAiKTsKKwlpZiAobnZyYW1bN10gPCBmaWVsZHNpemUobGFuZ3VhZ2VzKSkKKwkJUFJJTlRfUFJPQygiJXNcbiIsIGxhbmd1YWdlc1tudnJhbVs3XV0pOworCWVsc2UKKwkJUFJJTlRfUFJPQygiJXUgKHVuZGVmaW5lZClcbiIsIG52cmFtWzddKTsKKwlQUklOVF9QUk9DKCJEYXRlIGZvcm1hdCAgICAgIDogIik7CisJUFJJTlRfUFJPQyhkYXRlZm9ybWF0W252cmFtWzhdICYgN10sCisJICAgIG52cmFtWzldID8gbnZyYW1bOV0gOiAnLycsIG52cmFtWzldID8gbnZyYW1bOV0gOiAnLycpOworCVBSSU5UX1BST0MoIiwgJWRoIGNsb2NrXG4iLCBudnJhbVs4XSAmIDE2ID8gMjQgOiAxMik7CisJUFJJTlRfUFJPQygiQm9vdCBkZWxheSAgICAgICA6ICIpOworCWlmIChudnJhbVsxMF0gPT0gMCkKKwkJUFJJTlRfUFJPQygiZGVmYXVsdCIpOworCWVsc2UKKwkJUFJJTlRfUFJPQygiJWRzJXNcbiIsIG52cmFtWzEwXSwKKwkJICAgIG52cmFtWzEwXSA8IDggPyAiLCBubyBtZW1vcnkgdGVzdCIgOiAiIik7CisKKwl2bW9kZSA9IChudnJhbVsxNF0gPDwgOCkgfHwgbnZyYW1bMTVdOworCVBSSU5UX1BST0MoIlZpZGVvIG1vZGUgICAgICAgOiAlcyBjb2xvcnMsICVkIGNvbHVtbnMsICVzICVzIG1vbml0b3JcbiIsCisJICAgIGNvbG9yc1t2bW9kZSAmIDddLAorCSAgICB2bW9kZSAmIDggPyA4MCA6IDQwLAorCSAgICB2bW9kZSAmIDE2ID8gIlZHQSIgOiAiVFYiLCB2bW9kZSAmIDMyID8gIlBBTCIgOiAiTlRTQyIpOworCVBSSU5UX1BST0MoIiAgICAgICAgICAgICAgICAgICAlc292ZXJzY2FuLCBjb21wYXQuIG1vZGUgJXMlc1xuIiwKKwkgICAgdm1vZGUgJiA2NCA/ICIiIDogIm5vICIsCisJICAgIHZtb2RlICYgMTI4ID8gIm9uIiA6ICJvZmYiLAorCSAgICB2bW9kZSAmIDI1NiA/CisJICAgICh2bW9kZSAmIDE2ID8gIiwgbGluZSBkb3VibGluZyIgOiAiLCBoYWxmIHNjcmVlbiIpIDogIiIpOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIE1BQ0ggPT0gQVRBUkkgKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitFWFBPUlRfU1lNQk9MKF9fbnZyYW1fcmVhZF9ieXRlKTsKK0VYUE9SVF9TWU1CT0wobnZyYW1fcmVhZF9ieXRlKTsKK0VYUE9SVF9TWU1CT0woX19udnJhbV93cml0ZV9ieXRlKTsKK0VYUE9SVF9TWU1CT0wobnZyYW1fd3JpdGVfYnl0ZSk7CitFWFBPUlRfU1lNQk9MKF9fbnZyYW1fY2hlY2tfY2hlY2tzdW0pOworRVhQT1JUX1NZTUJPTChudnJhbV9jaGVja19jaGVja3N1bSk7CitFWFBPUlRfU1lNQk9MKF9fbnZyYW1fc2V0X2NoZWNrc3VtKTsKK0VYUE9SVF9TWU1CT0wobnZyYW1fc2V0X2NoZWNrc3VtKTsKK01PRFVMRV9BTElBU19NSVNDREVWKE5WUkFNX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ud2J1dHRvbi5jIGIvZHJpdmVycy9jaGFyL253YnV0dG9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4M2I3OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9ud2J1dHRvbi5jCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogCU5ldFdpbmRlciBCdXR0b24gRHJpdmVyLQorICoJQ29weXJpZ2h0IChDKSBBbGV4IEhvbGRlbiA8YWxleEBsaW51eGhhY2tlci5vcmc+IDE5OTgsIDE5OTkuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2RlZmluZSBfX05XQlVUVE9OX0MJCS8qIFRlbGwgdGhlIGhlYWRlciBmaWxlIHdobyB3ZSBhcmUgKi8KKyNpbmNsdWRlICJud2J1dHRvbi5oIgorCitzdGF0aWMgaW50IGJ1dHRvbl9wcmVzc19jb3VudDsJCS8qIFRoZSBjb3VudCBvZiBidXR0b24gcHJlc3NlcyAqLworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGJ1dHRvbl90aW1lcjsJLyogVGltZXMgZm9yIHRoZSBlbmQgb2YgYSBzZXF1ZW5jZSAqLyAKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChidXR0b25fd2FpdF9xdWV1ZSk7IC8qIFVzZWQgZm9yIGJsb2NraW5nIHJlYWQgKi8KK3N0YXRpYyBjaGFyIGJ1dHRvbl9vdXRwdXRfYnVmZmVyWzMyXTsJLyogU3RvcmVzIGRhdGEgdG8gd3JpdGUgb3V0IG9mIGRldmljZSAqLworc3RhdGljIGludCBiY291bnQ7CQkJLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyICovCitzdGF0aWMgaW50IGJkZWxheSA9IEJVVFRPTl9ERUxBWTsJLyogVGhlIGRlbGF5LCBpbiBqaWZmaWVzICovCitzdGF0aWMgc3RydWN0IGJ1dHRvbl9jYWxsYmFjayBidXR0b25fY2FsbGJhY2tfbGlzdFszMl07IC8qIFRoZSBjYWxsYmFjayBsaXN0ICovCitzdGF0aWMgaW50IGNhbGxiYWNrX2NvdW50OwkJLyogVGhlIG51bWJlciBvZiBjYWxsYmFja3MgcmVnaXN0ZXJlZCAqLworc3RhdGljIGludCByZWJvb3RfY291bnQgPSBOVU1fUFJFU1NFU19SRUJPT1Q7IC8qIE51bWJlciBvZiBwcmVzc2VzIHRvIHJlYm9vdCAqLworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgb3RoZXIgZHJpdmVycyB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiB0byBiZSBjYWxsZWQgd2hlbiBhIHBhcnRpY3VsYXIgbnVtYmVyIG9mIGJ1dHRvbiBwcmVzc2VzIG9jY3Vycy4KKyAqIFRoZSBjYWxsYmFjayBsaXN0IGlzIGEgc3RhdGljIGFycmF5IG9mIDMyIGVudHJpZXMgKEkgc29tZWhvdyBkb3VidCBtYW55CisgKiBwZW9wbGUgYXJlIGV2ZXIgZ29pbmcgdG8gd2FudCB0byByZWdpc3RlciBtb3JlIHRoYW4gMzIgZGlmZmVyZW50IGFjdGlvbnMKKyAqIHRvIGJlIHBlcmZvcm1lZCBieSB0aGUga2VybmVsIG9uIGRpZmZlcmVudCBudW1iZXJzIG9mIGJ1dHRvbiBwcmVzc2VzIDspLgorICogSG93ZXZlciwgaWYgYW4gYXR0ZW1wdCB0byByZWdpc3RlciBhIDMzcmQgZW50cnkgKHBlcmhhcHMgYSBzdHVjayBsb29wCisgKiBzb21ld2hlcmUgcmVnaXN0ZXJpbmcgdGhlIHNhbWUgZW50cnkgb3ZlciBhbmQgb3Zlcj8pIGl0IHdpbGwgZmFpbCB0bworICogZG8gc28gYW5kIHJldHVybiAtRU5PTUVNLiBJZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVnaXN0ZXIgYSBudWxsIHBvaW50ZXIsCisgKiBpdCB3aWxsIGZhaWwgdG8gZG8gc28gYW5kIHJldHVybiAtRUlOVkFMLgorICogQmVjYXVzZSBjYWxsYmFja3MgY2FuIGJlIHVucmVnaXN0ZXJlZCBhdCByYW5kb20gdGhlIGxpc3QgY2FuIGJlY29tZQorICogZnJhZ21lbnRlZCwgc28gd2UgbmVlZCB0byBzZWFyY2ggdGhyb3VnaCB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIHRoZSBmaXJzdAorICogZnJlZSBlbnRyeS4KKyAqCisgKiBGSVhNRTogSGFzIGFueW9uZSBzcG90dGVkIGFueSBsb2NraW5nIGZ1bmN0aW9ucyBpbnQgaGlzIGNvZGUgcmVjZW50bHkgPz8KKyAqLworCitpbnQgYnV0dG9uX2FkZF9jYWxsYmFjayAodm9pZCAoKmNhbGxiYWNrKSAodm9pZCksIGludCBjb3VudCkKK3sKKwlpbnQgbHAgPSAwOworCWlmIChjYWxsYmFja19jb3VudCA9PSAzMikgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKCFjYWxsYmFjaykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY2FsbGJhY2tfY291bnQrKzsKKwlmb3IgKDsgKGJ1dHRvbl9jYWxsYmFja19saXN0IFtscF0uY2FsbGJhY2spOyBscCsrKTsKKwlidXR0b25fY2FsbGJhY2tfbGlzdCBbbHBdLmNhbGxiYWNrID0gY2FsbGJhY2s7CisJYnV0dG9uX2NhbGxiYWNrX2xpc3QgW2xwXS5jb3VudCA9IGNvdW50OworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgb3RoZXIgZHJpdmVycyB0byBkZXJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24uCisgKiBJZiB5b3UgYXR0ZW1wdCB0byB1bnJlZ2lzdGVyIGEgY2FsbGJhY2sgd2hpY2ggZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgZmFpbAorICogd2l0aCAtRUlOVkFMLiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGVudHJ5IHdpdGggdGhlIHNhbWUgYWRkcmVzcywKKyAqIGJlY2F1c2UgaXQgc2VhcmNoZXMgdGhlIGxpc3QgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLCBpdCB3aWxsIHVucmVnaXN0ZXIgdGhlCisgKiBsYXN0IG9uZSB0byBiZSByZWdpc3RlcmVkIGZpcnN0IChGSUxPLSBGaXJzdCBJbiBMYXN0IE91dCkuCisgKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgbmVjY2Vzc2FyaWx5IHRydWUgaWYgdGhlIGVudHJpZXMgYXJlIG5vdCBzdWJtaXR0ZWQKKyAqIGF0IHRoZSBzYW1lIHRpbWUsIGJlY2F1c2UgYW5vdGhlciBkcml2ZXIgY291bGQgaGF2ZSB1bnJlZ2lzdGVyZWQgYSBjYWxsYmFjaworICogYmV0d2VlbiB0aGUgc3VibWlzc2lvbnMgY3JlYXRpbmcgYSBnYXAgZWFybGllciBpbiB0aGUgbGlzdCwgd2hpY2ggd291bGQKKyAqIGJlIGZpbGxlZCBmaXJzdCBhdCBzdWJtaXNzaW9uIHRpbWUuCisgKi8KKworaW50IGJ1dHRvbl9kZWxfY2FsbGJhY2sgKHZvaWQgKCpjYWxsYmFjaykgKHZvaWQpKQoreworCWludCBscCA9IDMxOworCWlmICghY2FsbGJhY2spIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXdoaWxlIChscCA+PSAwKSB7CisJCWlmICgoYnV0dG9uX2NhbGxiYWNrX2xpc3QgW2xwXS5jYWxsYmFjaykgPT0gY2FsbGJhY2spIHsKKwkJCWJ1dHRvbl9jYWxsYmFja19saXN0IFtscF0uY2FsbGJhY2sgPSBOVUxMOworCQkJYnV0dG9uX2NhbGxiYWNrX2xpc3QgW2xwXS5jb3VudCA9IDA7CisJCQljYWxsYmFja19jb3VudC0tOworCQkJcmV0dXJuIDA7CisJCX07CisJCWxwLS07CisJfTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGJ1dHRvbl9zZXF1ZW5jZV9maW5pc2hlZCB0byBzZWFyY2ggdGhyb3VnaCB0aGUKKyAqIGxpc3Qgb2YgY2FsbGJhY2sgZnVuY3Rpb25zLCBhbmQgY2FsbCBhbnkgb2YgdGhlbSB3aG9zZSBjb3VudCBhcmd1bWVudAorICogbWF0Y2hlcyB0aGUgY3VycmVudCBjb3VudCBvZiBidXR0b24gcHJlc3Nlcy4gSXQgc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcKKyAqIG9mIHRoZSBsaXN0IGFuZCB3b3JrcyB1cCB0byB0aGUgZW5kLiBJdCB3aWxsIHJlZnVzZSB0byBmb2xsb3cgYSBudWxsCisgKiBwb2ludGVyICh3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuIGFueXdheSkuCisgKi8KKworc3RhdGljIHZvaWQgYnV0dG9uX2NvbnN1bWVfY2FsbGJhY2tzIChpbnQgYnBjb3VudCkKK3sKKwlpbnQgbHAgPSAwOworCWZvciAoOyBscCA8PSAzMTsgbHArKykgeworCQlpZiAoKGJ1dHRvbl9jYWxsYmFja19saXN0IFtscF0uY291bnQpID09IGJwY291bnQpIHsKKwkJCWlmIChidXR0b25fY2FsbGJhY2tfbGlzdCBbbHBdLmNhbGxiYWNrKSB7CisJCQkJYnV0dG9uX2NhbGxiYWNrX2xpc3RbbHBdLmNhbGxiYWNrKCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIAorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYnV0dG9uX3RpbWVyIHRpbWVzIG91dC4KKyAqIGllLiBXaGVuIHlvdSBkb24ndCBwcmVzcyB0aGUgYnV0dG9uIGZvciBiZGVsYXkgamlmZmllcywgdGhpcyBpcyB0YWtlbiB0bworICogbWVhbiB5b3UgaGF2ZSBlbmRlZCB0aGUgc2VxdWVuY2Ugb2Yga2V5IHByZXNzZXMsIGFuZCB0aGlzIGZ1bmN0aW9uIGlzCisgKiBjYWxsZWQgdG8gd2luZCB0aGluZ3MgdXAgKHdyaXRlIHRoZSBwcmVzc19jb3VudCBvdXQgdG8gL2Rldi9idXR0b24sIGNhbGwKKyAqIGFueSBtYXRjaGluZyByZWdpc3RlcmVkIGZ1bmN0aW9uIGNhbGxiYWNrcywgaW5pdGlhdGUgcmVib290LCBldGMuKS4KKyAqLworCitzdGF0aWMgdm9pZCBidXR0b25fc2VxdWVuY2VfZmluaXNoZWQgKHVuc2lnbmVkIGxvbmcgcGFyYW1ldGVycykKK3sKKyNpZmRlZiBDT05GSUdfTldCVVRUT05fUkVCT09UCQkvKiBSZWJvb3QgdXNpbmcgYnV0dG9uIGlzIGVuYWJsZWQgKi8KKwlpZiAoYnV0dG9uX3ByZXNzX2NvdW50ID09IHJlYm9vdF9jb3VudCkgeworCQlraWxsX3Byb2MgKDEsIFNJR0lOVCwgMSk7CS8qIEFzayBpbml0IHRvIHJlYm9vdCB1cyAqLworCX0KKyNlbmRpZiAvKiBDT05GSUdfTldCVVRUT05fUkVCT09UICovCisJYnV0dG9uX2NvbnN1bWVfY2FsbGJhY2tzIChidXR0b25fcHJlc3NfY291bnQpOworCWJjb3VudCA9IHNwcmludGYgKGJ1dHRvbl9vdXRwdXRfYnVmZmVyLCAiJWRcbiIsIGJ1dHRvbl9wcmVzc19jb3VudCk7CisJYnV0dG9uX3ByZXNzX2NvdW50ID0gMDsJCS8qIFJlc2V0IHRoZSBidXR0b24gcHJlc3MgY291bnRlciAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJmJ1dHRvbl93YWl0X3F1ZXVlKTsKK30KKworLyogCisgKiAgVGhpcyBoYW5kbGVyIGlzIGNhbGxlZCB3aGVuIHRoZSBvcmFuZ2UgYnV0dG9uIGlzIHByZXNzZWQgKEdQSU8gMTAgb2YgdGhlCisgKiAgU3VwZXJJTyBjaGlwLCB3aGljaCBtYXBzIHRvIGxvZ2ljYWwgSVJRIDI2KS4gSWYgdGhlIHByZXNzX2NvdW50IGlzIDAsCisgKiAgdGhpcyBpcyB0aGUgZmlyc3QgcHJlc3MsIHNvIGl0IHN0YXJ0cyBhIHRpbWVyIGFuZCBpbmNyZW1lbnRzIHRoZSBjb3VudGVyLgorICogIElmIGl0IGlzIGhpZ2hlciB0aGFuIDAsIGl0IGRlbGV0ZXMgdGhlIG9sZCB0aW1lciwgc3RhcnRzIGEgbmV3IG9uZSwgYW5kCisgKiAgaW5jcmVtZW50cyB0aGUgY291bnRlci4KKyAqLyAKKworc3RhdGljIGlycXJldHVybl90IGJ1dHRvbl9oYW5kbGVyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChidXR0b25fcHJlc3NfY291bnQpIHsKKwkJZGVsX3RpbWVyICgmYnV0dG9uX3RpbWVyKTsKKwl9CisJYnV0dG9uX3ByZXNzX2NvdW50Kys7CisJaW5pdF90aW1lciAoJmJ1dHRvbl90aW1lcik7CisJYnV0dG9uX3RpbWVyLmZ1bmN0aW9uID0gYnV0dG9uX3NlcXVlbmNlX2ZpbmlzaGVkOworCWJ1dHRvbl90aW1lci5leHBpcmVzID0gKGppZmZpZXMgKyBiZGVsYXkpOworCWFkZF90aW1lciAoJmJ1dHRvbl90aW1lcik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgdXNlciBzcGFjZSBwcm9ncmFtIGF0dGVtcHRzIHRvIHJlYWQKKyAqIC9kZXYvbndidXR0b24uIEl0IHB1dHMgdGhlIGRldmljZSB0byBzbGVlcCBvbiB0aGUgd2FpdCBxdWV1ZSB1bnRpbAorICogYnV0dG9uX3NlcXVlbmNlX2ZpbmlzaGVkIHdyaXRlcyBzb21lIGRhdGEgdG8gdGhlIGJ1ZmZlciBhbmQgZmx1c2hlcworICogdGhlIHF1ZXVlLCBhdCB3aGljaCBwb2ludCBpdCB3cml0ZXMgdGhlIGRhdGEgb3V0IHRvIHRoZSBkZXZpY2UgYW5kCisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpdCBoYXMgd3JpdHRlbi4gVGhpcyBmdW5jdGlvbiBpcworICogcmVlbnRyYW50LCBzbyB0aGF0IG1hbnkgcHJvY2Vzc2VzIGNhbiBiZSBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSB0aGUKKyAqIGRldmljZSBhdCBhbnkgb25lIHRpbWUuCisgKi8KKworc3RhdGljIGludCBidXR0b25fcmVhZCAoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uICgmYnV0dG9uX3dhaXRfcXVldWUpOworCXJldHVybiAoY29weV90b191c2VyIChidWZmZXIsICZidXR0b25fb3V0cHV0X2J1ZmZlciwgYmNvdW50KSkKKwkJID8gLUVGQVVMVCA6IGJjb3VudDsKK30KKworLyogCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgZmlsZSBvcGVyYXRpb25zIHN0cnVjdHVyZSwgd2hpY2ggc3BlY2lmaWVzIHdoYXQKKyAqIGNhbGxiYWNrcyBmdW5jdGlvbnMgdGhlIGtlcm5lbCBzaG91bGQgY2FsbCB3aGVuIGEgdXNlciBtb2RlIHByb2Nlc3MKKyAqIGF0dGVtcHRzIHRvIHBlcmZvcm0gdGhlc2Ugb3BlcmF0aW9ucyBvbiB0aGUgZGV2aWNlLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJ1dHRvbl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBidXR0b25fcmVhZCwKK307CisKKy8qIAorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIG1pc2MgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggc3BlY2lmaWVzIHRoZSBtaW5vcgorICogZGV2aWNlIG51bWJlciAoMTU4IGluIHRoaXMgY2FzZSksIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgKGZvciAvcHJvYy9taXNjKSwKKyAqIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgYWJvdmUgZmlsZSBvcGVyYXRpb25zIHN0cnVjdHVyZS4KKyAqLworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYnV0dG9uX21pc2NfZGV2aWNlID0geworCUJVVFRPTl9NSU5PUiwKKwkibndidXR0b24iLAorCSZidXR0b25fZm9wcywKK307CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBpbml0aWFsaXNlIHRoZSBkcml2ZXIsIGVpdGhlciBmcm9tIG1pc2MuYyBhdAorICogYm9vdHVwIGlmIHRoZSBkcml2ZXIgaXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLCBvciBmcm9tIGluaXRfbW9kdWxlCisgKiBiZWxvdyBhdCBtb2R1bGUgaW5zZXJ0IHRpbWUuIEl0IGF0dGVtcHRzIHRvIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm9kZQorICogYW5kIHRoZSBJUlEgYW5kIGZhaWxzIHdpdGggYSB3YXJuaW5nIG1lc3NhZ2UgaWYgZWl0aGVyIGZhaWxzLCB0aG91Z2gKKyAqIG5laXRoZXIgZXZlciBzaG91bGQgYmVjYXVzZSB0aGUgZGV2aWNlIG51bWJlciBhbmQgSVJRIGFyZSB1bmlxdWUgdG8KKyAqIHRoaXMgZHJpdmVyLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IG53YnV0dG9uX2luaXQodm9pZCkKK3sKKwlpZiAoIW1hY2hpbmVfaXNfbmV0d2luZGVyKCkpCisJCXJldHVybiAtRU5PREVWOworCisJcHJpbnRrIChLRVJOX0lORk8gIk5ldFdpbmRlciBCdXR0b24gRHJpdmVyIFZlcnNpb24gJXMgKEMpIEFsZXggSG9sZGVuICIKKwkJCSI8YWxleEBsaW51eGhhY2tlci5vcmc+IDE5OTguXG4iLCBWRVJTSU9OKTsKKworCWlmIChtaXNjX3JlZ2lzdGVyICgmYnV0dG9uX21pc2NfZGV2aWNlKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAibndidXR0b246IENvdWxkbid0IHJlZ2lzdGVyIGRldmljZSAxMCwgIgorCQkJCSIlZC5cbiIsIEJVVFRPTl9NSU5PUik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxIChJUlFfTkVUV0lOREVSX0JVVFRPTiwgYnV0dG9uX2hhbmRsZXIsIFNBX0lOVEVSUlVQVCwKKwkJCSJud2J1dHRvbiIsIE5VTEwpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJud2J1dHRvbjogSVJRICVkIGlzIG5vdCBmcmVlLlxuIiwKKwkJCQlJUlFfTkVUV0lOREVSX0JVVFRPTik7CisJCW1pc2NfZGVyZWdpc3RlciAoJmJ1dHRvbl9taXNjX2RldmljZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG53YnV0dG9uX2V4aXQgKHZvaWQpIAoreworCWZyZWVfaXJxIChJUlFfTkVUV0lOREVSX0JVVFRPTiwgTlVMTCk7CisJbWlzY19kZXJlZ2lzdGVyICgmYnV0dG9uX21pc2NfZGV2aWNlKTsKK30KKworCitNT0RVTEVfQVVUSE9SKCJBbGV4IEhvbGRlbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChud2J1dHRvbl9pbml0KTsKK21vZHVsZV9leGl0KG53YnV0dG9uX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL253YnV0dG9uLmggYi9kcml2ZXJzL2NoYXIvbndidXR0b24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGI3YjkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL253YnV0dG9uLmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBfX05XQlVUVE9OX0gKKyNkZWZpbmUgX19OV0JVVFRPTl9ICisKKy8qCisgKiAJTmV0V2luZGVyIEJ1dHRvbiBEcml2ZXItCisgKglDb3B5cmlnaHQgKEMpIEFsZXggSG9sZGVuIDxhbGV4QGxpbnV4aGFja2VyLm9yZz4gMTk5OCwgMTk5OS4KKyAqLworCisjaWZkZWYgX19OV0JVVFRPTl9DCS8qIEFjdHVhbGx5IGNvbXBpbGluZyB0aGUgZHJpdmVyIGl0c2VsZiAqLworCisvKiBWYXJpb3VzIGRlZmluZXM6ICovCisKKyNkZWZpbmUgTlVNX1BSRVNTRVNfUkVCT09UIDIJLyogSG93IG1hbnkgcHJlc3NlcyB0byBhY3RpdmF0ZSBzaHV0ZG93biAqLworI2RlZmluZSBCVVRUT05fREVMQVkgMzAgCS8qIEhvdyBtYW55IGppZmZpZXMgZm9yIHNlcXVlbmNlIHRvIGVuZCAqLworI2RlZmluZSBWRVJTSU9OICIwLjMiCQkvKiBEcml2ZXIgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgQlVUVE9OX01JTk9SIDE1OAkvKiBNYWpvciAxMCwgTWlub3IgMTU4LCAvZGV2L253YnV0dG9uICovCisKKy8qIFN0cnVjdHVyZSBkZWZpbml0aW9uczogKi8KKworc3RydWN0IGJ1dHRvbl9jYWxsYmFjayB7CisJdm9pZCAoKmNhbGxiYWNrKSAodm9pZCk7CisJaW50IGNvdW50OworfTsKKworLyogRnVuY3Rpb24gcHJvdG90eXBlczogKi8KKworc3RhdGljIHZvaWQgYnV0dG9uX3NlcXVlbmNlX2ZpbmlzaGVkICh1bnNpZ25lZCBsb25nIHBhcmFtZXRlcnMpOworc3RhdGljIGlycXJldHVybl90IGJ1dHRvbl9oYW5kbGVyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2ludCBidXR0b25faW5pdCAodm9pZCk7CitpbnQgYnV0dG9uX2FkZF9jYWxsYmFjayAodm9pZCAoKmNhbGxiYWNrKSAodm9pZCksIGludCBjb3VudCk7CitpbnQgYnV0dG9uX2RlbF9jYWxsYmFjayAodm9pZCAoKmNhbGxiYWNrKSAodm9pZCkpOworc3RhdGljIHZvaWQgYnV0dG9uX2NvbnN1bWVfY2FsbGJhY2tzIChpbnQgYnBjb3VudCk7CisKKyNlbHNlIC8qIE5vdCBjb21waWxpbmcgdGhlIGRyaXZlciBpdHNlbGYgKi8KKworZXh0ZXJuIGludCBidXR0b25fYWRkX2NhbGxiYWNrICh2b2lkICgqY2FsbGJhY2spICh2b2lkKSwgaW50IGNvdW50KTsKK2V4dGVybiBpbnQgYnV0dG9uX2RlbF9jYWxsYmFjayAodm9pZCAoKmNhbGxiYWNrKSAodm9pZCkpOworCisjZW5kaWYgLyogX19OV0JVVFRPTl9DICovCisjZW5kaWYgLyogX19OV0JVVFRPTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbndmbGFzaC5jIGIvZHJpdmVycy9jaGFyL253Zmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTQxZDYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL253Zmxhc2guYwpAQCAtMCwwICsxLDcwMiBAQAorLyoKKyAqIEZsYXNoIG1lbW9yeSBpbnRlcmZhY2UgcmV2LjUgZHJpdmVyIGZvciB0aGUgSW50ZWwKKyAqIEZsYXNoIGNoaXBzIHVzZWQgb24gdGhlIE5ldFdpbmRlci4KKyAqCisgKiAyMC8wOC8yMDAwCVJNSwl1c2UgX19pb3JlbWFwIHRvIG1hcCBmbGFzaCBpbnRvIHZpcnR1YWwgbWVtb3J5CisgKgkJCW1ha2UgYSBmZXcgbW9yZSBwbGFjZXMgdXNlICJ2b2xhdGlsZSIKKyAqIDIyLzA1LzIwMDEJUk1LCS0gTG9jayByZWFkIGFnYWluc3Qgd3JpdGUKKyAqCQkJLSBtZXJnZSBwcmludGsgbGV2ZWwgY2hhbmdlcyAod2l0aCBtb2RzKSBmcm9tIEFsYW4gQ294LgorICoJCQktIHVzZSAqcHBvcyBhcyB0aGUgZmlsZSBwb3NpdGlvbiwgbm90IGZpbGUtPmZfcG9zLgorICoJCQktIGZpeCBjaGVjayBmb3Igb3V0IG9mIHJhbmdlIHBvcyBhbmQgci93IHNpemUKKyAqCisgKiBQbGVhc2Ugbm90ZSB0aGF0IHdlIGFyZSB0YW1wZXJpbmcgd2l0aCB0aGUgb25seSBmbGFzaCBjaGlwIGluIHRoZQorICogbWFjaGluZSwgd2hpY2ggY29udGFpbnMgdGhlIGJvb3R1cCBjb2RlLiAgV2UgdGhlcmVmb3JlIGhhdmUgdGhlCisgKiBwb3dlciB0byBjb252ZXJ0IHRoZXNlIG1hY2hpbmVzIGludG8gZG9vcnN0b3BzLi4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8YXNtL253Zmxhc2guaD4KKworI2RlZmluZQlOV0ZMQVNIX1ZFUlNJT04gIjYuNCIKKworc3RhdGljIHZvaWQga2lja19vcGVuKHZvaWQpOworc3RhdGljIGludCBnZXRfZmxhc2hfaWQodm9pZCk7CitzdGF0aWMgaW50IGVyYXNlX2Jsb2NrKGludCBuQmxvY2spOworc3RhdGljIGludCB3cml0ZV9ibG9jayh1bnNpZ25lZCBsb25nIHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCk7CisKKyNkZWZpbmUgS0ZMQVNIX1NJWkUJMTAyNCoxMDI0CS8vMSBNZWcKKyNkZWZpbmUgS0ZMQVNIX1NJWkU0CTQqMTAyNCoxMDI0CS8vNCBNZWcKKyNkZWZpbmUgS0ZMQVNIX0lECTB4ODlBNgkJLy9JbnRlbCBmbGFzaAorI2RlZmluZSBLRkxBU0hfSUQ0CTB4QjBENAkJLy9JbnRlbCBmbGFzaCA0TWVnCisKK3N0YXRpYyBpbnQgZmxhc2hkZWJ1ZzsJCS8vaWYgc2V0IC0gd2Ugd2lsbCBkaXNwbGF5IHByb2dyZXNzIG1zZ3MKKworc3RhdGljIGludCBnYldyaXRlRW5hYmxlOworc3RhdGljIGludCBnYldyaXRlQmFzZTY0RW5hYmxlOworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKkZMQVNIX0JBU0U7CitzdGF0aWMgaW50IGdiRmxhc2hTaXplID0gS0ZMQVNIX1NJWkU7CitzdGF0aWMgREVDTEFSRV9NVVRFWChud2ZsYXNoX3NlbSk7CisKK2V4dGVybiBzcGlubG9ja190IGdwaW9fbG9jazsKKworc3RhdGljIGludCBnZXRfZmxhc2hfaWQodm9pZCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgYzEsIGMyOworCisJLyoKKwkgKiB0cnkgdG8gZ2V0IGZsYXNoIGNoaXAgSUQKKwkgKi8KKwlraWNrX29wZW4oKTsKKwljMiA9IGluYigweDgwKTsKKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEZMQVNIX0JBU0UgKyAweDgwMDApID0gMHg5MDsKKwl1ZGVsYXkoMTUpOworCWMxID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIEZMQVNIX0JBU0U7CisJYzIgPSBpbmIoMHg4MCk7CisKKwkvKgorCSAqIG9uIDQgTWVnIGZsYXNoIHRoZSBzZWNvbmQgYnl0ZSBpcyBhY3R1YWxseSBhdCBvZmZzZXQgMi4uLgorCSAqLworCWlmIChjMSA9PSAweEIwKQorCQljMiA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoRkxBU0hfQkFTRSArIDIpOworCWVsc2UKKwkJYzIgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEZMQVNIX0JBU0UgKyAxKTsKKworCWMyICs9IChjMSA8PCA4KTsKKworCS8qCisJICogc2V0IGl0IGJhY2sgdG8gcmVhZCBtb2RlCisJICovCisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHg4MDAwKSA9IDB4RkY7CisKKwlpZiAoYzIgPT0gS0ZMQVNIX0lENCkKKwkJZ2JGbGFzaFNpemUgPSBLRkxBU0hfU0laRTQ7CisKKwlyZXR1cm4gYzI7Cit9CisKK3N0YXRpYyBpbnQgZmxhc2hfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZXAsIHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIENNRF9XUklURV9ESVNBQkxFOgorCQlnYldyaXRlQmFzZTY0RW5hYmxlID0gMDsKKwkJZ2JXcml0ZUVuYWJsZSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBDTURfV1JJVEVfRU5BQkxFOgorCQlnYldyaXRlRW5hYmxlID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIENNRF9XUklURV9CQVNFNjRLX0VOQUJMRToKKwkJZ2JXcml0ZUJhc2U2NEVuYWJsZSA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZ2JXcml0ZUJhc2U2NEVuYWJsZSA9IDA7CisJCWdiV3JpdGVFbmFibGUgPSAwOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZsYXNoX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBzaXplLAorCQkJICBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbG9uZyBwID0gKnBwb3M7CisJdW5zaWduZWQgaW50IGNvdW50ID0gc2l6ZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChmbGFzaGRlYnVnKQorCQlwcmludGsoS0VSTl9ERUJVRyAiZmxhc2hfcmVhZDogZmxhc2hfcmVhZDogb2Zmc2V0PTB4JWxYLCAiCisJCSAgICAgICAiYnVmZmVyPSVwLCBjb3VudD0weCVYLlxuIiwgcCwgYnVmLCBjb3VudCk7CisKKwlpZiAoY291bnQpCisJCXJldCA9IC1FTlhJTzsKKworCWlmIChwIDwgZ2JGbGFzaFNpemUpIHsKKwkJaWYgKGNvdW50ID4gZ2JGbGFzaFNpemUgLSBwKQorCQkJY291bnQgPSBnYkZsYXNoU2l6ZSAtIHA7CisKKwkJLyoKKwkJICogV2Ugbm93IGxvY2sgYWdhaW5zdCByZWFkcyBhbmQgd3JpdGVzLiAtLXJtaworCQkgKi8KKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbndmbGFzaF9zZW0pKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCQlyZXQgPSBjb3B5X3RvX3VzZXIoYnVmLCAodm9pZCAqKShGTEFTSF9CQVNFICsgcCksIGNvdW50KTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlyZXQgPSBjb3VudDsKKwkJCSpwcG9zICs9IGNvdW50OworCQl9IGVsc2UKKwkJCXJldCA9IC1FRkFVTFQ7CisJCXVwKCZud2ZsYXNoX3NlbSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZsYXNoX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgc2l6ZV90IHNpemUsIGxvZmZfdCAqIHBwb3MpCit7CisJdW5zaWduZWQgbG9uZyBwID0gKnBwb3M7CisJdW5zaWduZWQgaW50IGNvdW50ID0gc2l6ZTsKKwlpbnQgd3JpdHRlbjsKKwlpbnQgbkJsb2NrLCB0ZW1wLCByYzsKKwlpbnQgaSwgajsKKworCWlmIChmbGFzaGRlYnVnKQorCQlwcmludGsoImZsYXNoX3dyaXRlOiBvZmZzZXQ9MHglbFgsIGJ1ZmZlcj0weCVwLCBjb3VudD0weCVYLlxuIiwKKwkJICAgICAgIHAsIGJ1ZiwgY291bnQpOworCisJaWYgKCFnYldyaXRlRW5hYmxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwIDwgNjQgKiAxMDI0ICYmICghZ2JXcml0ZUJhc2U2NEVuYWJsZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBjaGVjayBmb3Igb3V0IG9mIHJhbmdlIHBvcyBvciBjb3VudAorCSAqLworCWlmIChwID49IGdiRmxhc2hTaXplKQorCQlyZXR1cm4gY291bnQgPyAtRU5YSU8gOiAwOworCisJaWYgKGNvdW50ID4gZ2JGbGFzaFNpemUgLSBwKQorCQljb3VudCA9IGdiRmxhc2hTaXplIC0gcDsKKwkJCQorCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKgorCSAqIFdlIG5vdyBsb2NrIGFnYWluc3QgcmVhZHMgYW5kIHdyaXRlcy4gLS1ybWsKKwkgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZud2ZsYXNoX3NlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwl3cml0dGVuID0gMDsKKworCWxlZHNfZXZlbnQobGVkX2NsYWltKTsKKwlsZWRzX2V2ZW50KGxlZF9ncmVlbl9vbik7CisKKwluQmxvY2sgPSAoaW50KSBwID4+IDE2OwkvL2Jsb2NrICMgb2YgNjRLIGJ5dGVzCisKKwkvKgorCSAqICMgb2YgNjRLIGJsb2NrcyB0byBlcmFzZSBhbmQgd3JpdGUKKwkgKi8KKwl0ZW1wID0gKChpbnQpIChwICsgY291bnQpID4+IDE2KSAtIG5CbG9jayArIDE7CisKKwkvKgorCSAqIHdyaXRlIGVuZHMgYXQgZXhhY3RseSA2NGsgYm91bmRhcnk/CisJICovCisJaWYgKCgoaW50KSAocCArIGNvdW50KSAmIDB4RkZGRikgPT0gMCkKKwkJdGVtcCAtPSAxOworCisJaWYgKGZsYXNoZGVidWcpCisJCXByaW50ayhLRVJOX0RFQlVHICJmbGFzaF93cml0ZTogd3JpdGluZyAlZCBibG9jayhzKSAiCisJCQkic3RhcnRpbmcgYXQgJWQuXG4iLCB0ZW1wLCBuQmxvY2spOworCisJZm9yICg7IHRlbXA7IHRlbXAtLSwgbkJsb2NrKyspIHsKKwkJaWYgKGZsYXNoZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiZmxhc2hfd3JpdGU6IGVyYXNpbmcgYmxvY2sgJWQuXG4iLCBuQmxvY2spOworCisJCS8qCisJCSAqIGZpcnN0IHdlIGhhdmUgdG8gZXJhc2UgdGhlIGJsb2NrKHMpLCB3aGVyZSB3ZSB3aWxsIHdyaXRlLi4uCisJCSAqLworCQlpID0gMDsKKwkJaiA9IDA7CisJICBSZXRyeUJsb2NrOgorCQlkbyB7CisJCQlyYyA9IGVyYXNlX2Jsb2NrKG5CbG9jayk7CisJCQlpKys7CisJCX0gd2hpbGUgKHJjICYmIGkgPCAxMCk7CisKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImZsYXNoX3dyaXRlOiBlcmFzZSBlcnJvciAleFxuIiwgcmMpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGZsYXNoZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiZmxhc2hfd3JpdGU6IHdyaXRpbmcgb2Zmc2V0ICVsWCwgIgorCQkJICAgICAgICJmcm9tIGJ1ZiAlcCwgYnl0ZXMgbGVmdCAlWC5cbiIsIHAsIGJ1ZiwKKwkJCSAgICAgICBjb3VudCAtIHdyaXR0ZW4pOworCisJCS8qCisJCSAqIHdyaXRlX2Jsb2NrIHdpbGwgbGltaXQgd3JpdGUgdG8gc3BhY2UgbGVmdCBpbiB0aGlzIGJsb2NrCisJCSAqLworCQlyYyA9IHdyaXRlX2Jsb2NrKHAsIGJ1ZiwgY291bnQgLSB3cml0dGVuKTsKKwkJaisrOworCisJCS8qCisJCSAqIGlmIHNvbWVob3cgd3JpdGUgdmVyaWZ5IGZhaWxlZD8gQ2FuJ3QgaGFwcGVuPz8KKwkJICovCisJCWlmICghcmMpIHsKKwkJCS8qCisJCQkgKiByZXRyeSB1cCB0byAxMCB0aW1lcworCQkJICovCisJCQlpZiAoaiA8IDEwKQorCQkJCWdvdG8gUmV0cnlCbG9jazsKKwkJCWVsc2UKKwkJCQkvKgorCQkJCSAqIGVsc2UgcXVpdCB3aXRoIGVycm9yLi4uCisJCQkJICovCisJCQkJcmMgPSAtMTsKKworCQl9CisJCWlmIChyYyA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZmxhc2hfd3JpdGU6IHdyaXRlIGVycm9yICVYXG4iLCByYyk7CisJCQlicmVhazsKKwkJfQorCQlwICs9IHJjOworCQlidWYgKz0gcmM7CisJCXdyaXR0ZW4gKz0gcmM7CisJCSpwcG9zICs9IHJjOworCisJCWlmIChmbGFzaGRlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImZsYXNoX3dyaXRlOiB3cml0dGVuIDB4JVggYnl0ZXMgT0suXG4iLCB3cml0dGVuKTsKKwl9CisKKwkvKgorCSAqIHJlc3RvcmUgcmVnIG9uIGV4aXQKKwkgKi8KKwlsZWRzX2V2ZW50KGxlZF9yZWxlYXNlKTsKKworCXVwKCZud2ZsYXNoX3NlbSk7CisKKwlyZXR1cm4gd3JpdHRlbjsKK30KKworCisvKgorICogVGhlIG1lbW9yeSBkZXZpY2VzIHVzZSB0aGUgZnVsbCAzMi82NCBiaXRzIG9mIHRoZSBvZmZzZXQsIGFuZCBzbyB3ZSBjYW5ub3QKKyAqIGNoZWNrIGFnYWluc3QgbmVnYXRpdmUgYWRkcmVzc2VzOiB0aGV5IGFyZSBvay4gVGhlIHJldHVybiB2YWx1ZSBpcyB3ZWlyZCwKKyAqIHRob3VnaCwgaW4gdGhhdCBjYXNlICgwKS4KKyAqCisgKiBhbHNvIG5vdGUgdGhhdCBzZWVraW5nIHJlbGF0aXZlIHRvIHRoZSAiZW5kIG9mIGZpbGUiIGlzbid0IHN1cHBvcnRlZDoKKyAqIGl0IGhhcyBubyBtZWFuaW5nLCBzbyBpdCByZXR1cm5zIC1FSU5WQUwuCisgKi8KK3N0YXRpYyBsb2ZmX3QgZmxhc2hfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZykKK3sKKwlsb2ZmX3QgcmV0OworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoZmxhc2hkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcgImZsYXNoX2xsc2Vlazogb2Zmc2V0PTB4JVgsIG9yaWc9MHglWC5cbiIsCisJCSAgICAgICAodW5zaWduZWQgaW50KSBvZmZzZXQsIG9yaWcpOworCisJc3dpdGNoIChvcmlnKSB7CisJY2FzZSAwOgorCQlpZiAob2Zmc2V0IDwgMCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCh1bnNpZ25lZCBpbnQpIG9mZnNldCA+IGdiRmxhc2hTaXplKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlmaWxlLT5mX3BvcyA9ICh1bnNpZ25lZCBpbnQpIG9mZnNldDsKKwkJcmV0ID0gZmlsZS0+Zl9wb3M7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKChmaWxlLT5mX3BvcyArIG9mZnNldCkgPiBnYkZsYXNoU2l6ZSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmICgoZmlsZS0+Zl9wb3MgKyBvZmZzZXQpIDwgMCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWZpbGUtPmZfcG9zICs9IG9mZnNldDsKKwkJcmV0ID0gZmlsZS0+Zl9wb3M7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBhc3N1bWUgdGhhdCBtYWluIFdyaXRlIHJvdXRpbmUgZGlkIHRoZSBwYXJhbWV0ZXIgY2hlY2tpbmcuLi4KKyAqIHNvIGp1c3QgZ28gYWhlYWQgYW5kIGVyYXNlLCB3aGF0IHJlcXVlc3RlZCEKKyAqLworCitzdGF0aWMgaW50IGVyYXNlX2Jsb2NrKGludCBuQmxvY2spCit7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGMxOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnBXcml0ZVB0cjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJaW50IHRlbXAsIHRlbXAxOworCisJLyoKKwkgKiBvcmFuZ2UgTEVEID09IGVyYXNlCisJICovCisJbGVkc19ldmVudChsZWRfYW1iZXJfb24pOworCisJLyoKKwkgKiByZXNldCBmb290YnJpZGdlIHRvIHRoZSBjb3JyZWN0IG9mZnNldCAwICguLi4wLi4zKQorCSAqLworCSpDU1JfUk9NV1JJVEVSRUcgPSAwOworCisJLyoKKwkgKiBkdW1teSBST00gcmVhZAorCSAqLworCWMxID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHg4MDAwKTsKKworCWtpY2tfb3BlbigpOworCS8qCisJICogcmVzZXQgc3RhdHVzIGlmIG9sZCBlcnJvcnMKKwkgKi8KKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEZMQVNIX0JBU0UgKyAweDgwMDApID0gMHg1MDsKKworCS8qCisJICogZXJhc2UgYSBibG9jay4uLgorCSAqIGFpbSBhdCB0aGUgbWlkZGxlIG9mIGEgY3VycmVudCBibG9jay4uLgorCSAqLworCXBXcml0ZVB0ciA9ICh1bnNpZ25lZCBjaGFyICopICgodW5zaWduZWQgaW50KSAoRkxBU0hfQkFTRSArIDB4ODAwMCArIChuQmxvY2sgPDwgMTYpKSk7CisJLyoKKwkgKiBkdW1teSByZWFkCisJICovCisJYzEgPSAqcFdyaXRlUHRyOworCisJa2lja19vcGVuKCk7CisJLyoKKwkgKiBlcmFzZQorCSAqLworCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBwV3JpdGVQdHIgPSAweDIwOworCisJLyoKKwkgKiBjb25maXJtCisJICovCisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIHBXcml0ZVB0ciA9IDB4RDA7CisKKwkvKgorCSAqIHdhaXQgMTAgbXMKKwkgKi8KKwltc2xlZXAoMTApOworCisJLyoKKwkgKiB3YWl0IHdoaWxlIGVyYXNpbmcgaW4gcHJvY2VzcyAodXAgdG8gMTAgc2VjKQorCSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgMTAgKiBIWjsKKwljMSA9IDA7CisJd2hpbGUgKCEoYzEgJiAweDgwKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQltc2xlZXAoMTApOworCQkvKgorCQkgKiByZWFkIGFueSBhZGRyZXNzCisJCSAqLworCQljMSA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAocFdyaXRlUHRyKTsKKwkJLy8gICAgICAgICAgICAgIHByaW50aygiRmxhc2hfZXJhc2U6IHN0YXR1cz0lWC5cbiIsYzEpOworCX0KKworCS8qCisJICogc2V0IGZsYXNoIGZvciBub3JtYWwgcmVhZCBhY2Nlc3MKKwkgKi8KKwlraWNrX29wZW4oKTsKKy8vICAgICAgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKikoRkxBU0hfQkFTRSsweDgwMDApID0gMHhGRjsKKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgcFdyaXRlUHRyID0gMHhGRjsJLy9iYWNrIHRvIG5vcm1hbCBvcGVyYXRpb24KKworCS8qCisJICogY2hlY2sgaWYgZXJhc2UgZXJyb3JzIHdlcmUgcmVwb3J0ZWQKKwkgKi8KKwlpZiAoYzEgJiAweDIwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmxhc2hfZXJhc2U6IGVyciBhdCAlcFxuIiwgcFdyaXRlUHRyKTsKKworCQkvKgorCQkgKiByZXNldCBlcnJvcgorCQkgKi8KKwkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHg4MDAwKSA9IDB4NTA7CisJCXJldHVybiAtMjsKKwl9CisKKwkvKgorCSAqIGp1c3QgdG8gbWFrZSBzdXJlIC0gdmVyaWZ5IGlmIGVyYXNlZCBPSy4uLgorCSAqLworCW1zbGVlcCgxMCk7CisKKwlwV3JpdGVQdHIgPSAodW5zaWduZWQgY2hhciAqKSAoKHVuc2lnbmVkIGludCkgKEZMQVNIX0JBU0UgKyAobkJsb2NrIDw8IDE2KSkpOworCisJZm9yICh0ZW1wID0gMDsgdGVtcCA8IDE2ICogMTAyNDsgdGVtcCsrLCBwV3JpdGVQdHIgKz0gNCkgeworCQlpZiAoKHRlbXAxID0gKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgcFdyaXRlUHRyKSAhPSAweEZGRkZGRkZGKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImZsYXNoX2VyYXNlOiB2ZXJpZnkgZXJyIGF0ICVwID0gJVhcbiIsCisJCQkgICAgICAgcFdyaXRlUHRyLCB0ZW1wMSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworfQorCisvKgorICogd3JpdGVfYmxvY2sgd2lsbCBsaW1pdCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUgc3BhY2UgaW4gdGhpcyBibG9jaworICovCitzdGF0aWMgaW50IHdyaXRlX2Jsb2NrKHVuc2lnbmVkIGxvbmcgcCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBjMTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgYzI7CisJdW5zaWduZWQgY2hhciAqcFdyaXRlUHRyOworCXVuc2lnbmVkIGludCB1QWRkcmVzczsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQxOworCisJLyoKKwkgKiByZWQgTEVEID09IHdyaXRlCisJICovCisJbGVkc19ldmVudChsZWRfYW1iZXJfb2ZmKTsKKwlsZWRzX2V2ZW50KGxlZF9yZWRfb24pOworCisJcFdyaXRlUHRyID0gKHVuc2lnbmVkIGNoYXIgKikgKCh1bnNpZ25lZCBpbnQpIChGTEFTSF9CQVNFICsgcCkpOworCisJLyoKKwkgKiBjaGVjayBpZiB3cml0ZSB3aWxsIGVuZCBpbiB0aGlzIGJsb2NrLi4uLgorCSAqLworCW9mZnNldCA9IHAgJiAweEZGRkY7CisKKwlpZiAob2Zmc2V0ICsgY291bnQgPiAweDEwMDAwKQorCQljb3VudCA9IDB4MTAwMDAgLSBvZmZzZXQ7CisKKwkvKgorCSAqIHdhaXQgdXAgdG8gMzAgc2VjIGZvciB0aGlzIGJsb2NrCisJICovCisJdGltZW91dCA9IGppZmZpZXMgKyAzMCAqIEhaOworCisJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBjb3VudDsgb2Zmc2V0KyssIHBXcml0ZVB0cisrKSB7CisJCXVBZGRyZXNzID0gKHVuc2lnbmVkIGludCkgcFdyaXRlUHRyOworCQl1QWRkcmVzcyAmPSAweEZGRkZGRkZDOworCQlpZiAoX19nZXRfdXNlcihjMiwgYnVmICsgb2Zmc2V0KSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJICBXcml0ZVJldHJ5OgorCSAgCS8qCisJICAJICogZHVtbXkgcmVhZAorCSAgCSAqLworCQljMSA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoRkxBU0hfQkFTRSArIDB4ODAwMCk7CisKKwkJLyoKKwkJICoga2ljayBvcGVuIHRoZSB3cml0ZSBnYXRlCisJCSAqLworCQlraWNrX29wZW4oKTsKKworCQkvKgorCQkgKiBwcm9ncmFtIGZvb3RicmlkZ2UgdG8gdGhlIGNvcnJlY3Qgb2Zmc2V0Li4uMC4uMworCQkgKi8KKwkJKkNTUl9ST01XUklURVJFRyA9ICh1bnNpZ25lZCBpbnQpIHBXcml0ZVB0ciAmIDM7CisKKwkJLyoKKwkJICogd3JpdGUgY21kCisJCSAqLworCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKHVBZGRyZXNzKSA9IDB4NDA7CisKKwkJLyoKKwkJICogZGF0YSB0byB3cml0ZQorCQkgKi8KKwkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopICh1QWRkcmVzcykgPSBjMjsKKworCQkvKgorCQkgKiBnZXQgc3RhdHVzCisJCSAqLworCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEZMQVNIX0JBU0UgKyAweDEwMDAwKSA9IDB4NzA7CisKKwkJYzEgPSAwOworCisJCS8qCisJCSAqIHdhaXQgdXAgdG8gMSBzZWMgZm9yIHRoaXMgYnl0ZQorCQkgKi8KKwkJdGltZW91dDEgPSBqaWZmaWVzICsgMSAqIEhaOworCisJCS8qCisJCSAqIHdoaWxlIG5vdCByZWFkeS4uLgorCQkgKi8KKwkJd2hpbGUgKCEoYzEgJiAweDgwKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0MSkpCisJCQljMSA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoRkxBU0hfQkFTRSArIDB4ODAwMCk7CisKKwkJLyoKKwkJICogaWYgdGltZW91dCBnZXR0aW5nIHN0YXR1cworCQkgKi8KKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dDEpKSB7CisJCQlraWNrX29wZW4oKTsKKwkJCS8qCisJCQkgKiByZXNldCBlcnIKKwkJCSAqLworCQkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHg4MDAwKSA9IDB4NTA7CisKKwkJCWdvdG8gV3JpdGVSZXRyeTsKKwkJfQorCQkvKgorCQkgKiBzd2l0Y2ggb24gcmVhZCBhY2Nlc3MsIGFzIGEgZGVmYXVsdCBmbGFzaCBvcGVyYXRpb24gbW9kZQorCQkgKi8KKwkJa2lja19vcGVuKCk7CisJCS8qCisJCSAqIHJlYWQgYWNjZXNzCisJCSAqLworCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEZMQVNIX0JBU0UgKyAweDgwMDApID0gMHhGRjsKKworCQkvKgorCQkgKiBpZiBoYXJkd2FyZSByZXBvcnRzIGFuIGVycm9yIHdyaXRpbmcsIGFuZCBub3QgdGltZW91dCAtIAorCQkgKiByZXNldCB0aGUgY2hpcCBhbmQgcmV0cnkKKwkJICovCisJCWlmIChjMSAmIDB4MTApIHsKKwkJCWtpY2tfb3BlbigpOworCQkJLyoKKwkJCSAqIHJlc2V0IGVycgorCQkJICovCisJCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEZMQVNIX0JBU0UgKyAweDgwMDApID0gMHg1MDsKKworCQkJLyoKKwkJCSAqIGJlZm9yZSB0aW1lb3V0PworCQkJICovCisJCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJCQlpZiAoZmxhc2hkZWJ1ZykKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIndyaXRlX2Jsb2NrOiBSZXRyeWluZyB3cml0ZSBhdCAweCVYKW4iLAorCQkJCQkgICAgICAgcFdyaXRlUHRyIC0gRkxBU0hfQkFTRSk7CisKKwkJCQkvKgorCQkJCSAqIG5vIExFRCA9PSB3YWl0aW5nCisJCQkJICovCisJCQkJbGVkc19ldmVudChsZWRfYW1iZXJfb2ZmKTsKKwkJCQkvKgorCQkJCSAqIHdhaXQgY291cGxlIG1zCisJCQkJICovCisJCQkJbXNsZWVwKDEwKTsKKwkJCQkvKgorCQkJCSAqIHJlZCBMRUQgPT0gd3JpdGUKKwkJCQkgKi8KKwkJCQlsZWRzX2V2ZW50KGxlZF9yZWRfb24pOworCisJCQkJZ290byBXcml0ZVJldHJ5OworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIndyaXRlX2Jsb2NrOiB0aW1lb3V0IGF0IDB4JVhcbiIsCisJCQkJICAgICAgIHBXcml0ZVB0ciAtIEZMQVNIX0JBU0UpOworCQkJCS8qCisJCQkJICogcmV0dXJuIGVycm9yIC0yCisJCQkJICovCisJCQkJcmV0dXJuIC0yOworCisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIGdyZWVuIExFRCA9PSByZWFkL3ZlcmlmeQorCSAqLworCWxlZHNfZXZlbnQobGVkX2FtYmVyX29mZik7CisJbGVkc19ldmVudChsZWRfZ3JlZW5fb24pOworCisJbXNsZWVwKDEwKTsKKworCXBXcml0ZVB0ciA9ICh1bnNpZ25lZCBjaGFyICopICgodW5zaWduZWQgaW50KSAoRkxBU0hfQkFTRSArIHApKTsKKworCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgY291bnQ7IG9mZnNldCsrKSB7CisJCWNoYXIgYywgYzE7CisJCWlmIChfX2dldF91c2VyKGMsIGJ1ZikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnVmKys7CisJCWlmICgoYzEgPSAqcFdyaXRlUHRyKyspICE9IGMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAid3JpdGVfYmxvY2s6IHZlcmlmeSBlcnJvciBhdCAweCVYICglMDJYIT0lMDJYKVxuIiwKKwkJCSAgICAgICBwV3JpdGVQdHIgLSBGTEFTSF9CQVNFLCBjMSwgYyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiBjb3VudDsKK30KKworCitzdGF0aWMgdm9pZCBraWNrX29wZW4odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiB3ZSB3YW50IHRvIHdyaXRlIGEgYml0IHBhdHRlcm4gWFhYMSB0byBYaWxpbnggdG8gZW5hYmxlCisJICogdGhlIHdyaXRlIGdhdGUsIHdoaWNoIHdpbGwgYmUgb3BlbiBmb3IgYWJvdXQgdGhlIG5leHQgMm1zLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKwljcGxkX21vZGlmeSgxLCAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogbGV0IHRoZSBJU0EgYnVzIHRvIGNhdGNoIG9uLi4uCisJICovCisJdWRlbGF5KDI1KTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmxhc2hfZm9wcyA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gZmxhc2hfbGxzZWVrLAorCS5yZWFkCQk9IGZsYXNoX3JlYWQsCisJLndyaXRlCQk9IGZsYXNoX3dyaXRlLAorCS5pb2N0bAkJPSBmbGFzaF9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBmbGFzaF9taXNjZGV2ID0KK3sKKwlGTEFTSF9NSU5PUiwKKwkibndmbGFzaCIsCisJJmZsYXNoX2ZvcHMKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG53Zmxhc2hfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAtRU5PREVWOworCisJaWYgKG1hY2hpbmVfaXNfbmV0d2luZGVyKCkpIHsKKwkJaW50IGlkOworCisJCUZMQVNIX0JBU0UgPSBpb3JlbWFwKERDMjEyODVfRkxBU0gsIEtGTEFTSF9TSVpFNCk7CisJCWlmICghRkxBU0hfQkFTRSkKKwkJCWdvdG8gb3V0OworCisJCWlkID0gZ2V0X2ZsYXNoX2lkKCk7CisJCWlmICgoaWQgIT0gS0ZMQVNIX0lEKSAmJiAoaWQgIT0gS0ZMQVNIX0lENCkpIHsKKwkJCXJldCA9IC1FTlhJTzsKKwkJCWlvdW5tYXAoKHZvaWQgKilGTEFTSF9CQVNFKTsKKwkJCXByaW50aygiRmxhc2g6IGluY29ycmVjdCBJRCAweCUwNFguXG4iLCBpZCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXByaW50aygiRmxhc2ggUk9NIGRyaXZlciB2LiVzLCBmbGFzaCBkZXZpY2UgSUQgMHglMDRYLCBzaXplICVkIE1iLlxuIiwKKwkJICAgICAgIE5XRkxBU0hfVkVSU0lPTiwgaWQsIGdiRmxhc2hTaXplIC8gKDEwMjQgKiAxMDI0KSk7CisKKwkJcmV0ID0gbWlzY19yZWdpc3RlcigmZmxhc2hfbWlzY2Rldik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpb3VubWFwKCh2b2lkICopRkxBU0hfQkFTRSk7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG53Zmxhc2hfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmZmxhc2hfbWlzY2Rldik7CisJaW91bm1hcCgodm9pZCAqKUZMQVNIX0JBU0UpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShmbGFzaGRlYnVnLCBib29sLCAwNjQ0KTsKKworbW9kdWxlX2luaXQobndmbGFzaF9pbml0KTsKK21vZHVsZV9leGl0KG53Zmxhc2hfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyYmZkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvS2NvbmZpZwpAQCAtMCwwICsxLDIyIEBACisjCisjIFBDTUNJQSBjaGFyYWN0ZXIgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiUENNQ0lBIGNoYXJhY3RlciBkZXZpY2VzIgorCWRlcGVuZHMgb24gSE9UUExVRyAmJiBQQ01DSUEhPW4KKworY29uZmlnIFNZTkNMSU5LX0NTCisJdHJpc3RhdGUgIlN5bmNMaW5rIFBDIENhcmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDTUNJQQorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgU3luY0xpbmsgUEMgQ2FyZCBzZXJpYWwgYWRhcHRlciwgcnVubmluZworCSAgYXN5bmNocm9ub3VzIGFuZCBIRExDIGNvbW11bmljYXRpb25zIHVwIHRvIDUxMkticHMuIFRoZSBwb3J0IGlzCisJICBzZWxlY3RhYmxlIGZvciBSUy0yMzIsIFYuMzUsIFJTLTQ0OSwgUlMtNTMwLCBhbmQgWC4yMQorCisJICBUaGlzIGRyaXZlciBtYXkgYmUgYnVpbHQgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlCisJICBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCkuCisJICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHN5bmNsaW5rbXAuICBJZiB5b3Ugd2FudCB0byBkbyB0aGF0LCBzYXkgTQorCSAgaGVyZS4KKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmNkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgZHJpdmVycy9jaGFyL3BjbWNpYS9NYWtlZmlsZQorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IFBDTUNJQSBjaGFyIGRldmljZSBkcml2ZXJzLgorIworCitvYmotJChDT05GSUdfU1lOQ0xJTktfQ1MpICs9IHN5bmNsaW5rX2NzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzhkODY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jCkBAIC0wLDAgKzEsNDYxMSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYworICoKKyAqICRJZDogc3luY2xpbmtfY3MuYyx2IDQuMjYgMjAwNC8wOC8xMSAxOTozMDowMiBwYXVsa2YgRXhwICQKKyAqCisgKiBEZXZpY2UgZHJpdmVyIGZvciBNaWNyb2dhdGUgU3luY0xpbmsgUEMgQ2FyZAorICogbXVsdGlwcm90b2NvbCBzZXJpYWwgYWRhcHRlci4KKyAqCisgKiB3cml0dGVuIGJ5IFBhdWwgRnVsZ2h1bSBmb3IgTWljcm9nYXRlIENvcnBvcmF0aW9uCisgKiBwYXVsa2ZAbWljcm9nYXRlLmNvbQorICoKKyAqIE1pY3JvZ2F0ZSBhbmQgU3luY0xpbmsgYXJlIHRyYWRlbWFya3Mgb2YgTWljcm9nYXRlIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKQorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjZGVmaW5lIFZFUlNJT04odmVyLHJlbCxzZXEpICgoKHZlcik8PDE2KSB8ICgocmVsKTw8OCkgfCAoc2VxKSkKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorIyAgZGVmaW5lIEJSRUFLUE9JTlQoKSBhc20oIiAgIGludCAkMyIpOworI2Vsc2UKKyMgIGRlZmluZSBCUkVBS1BPSU5UKCkgeyB9CisjZW5kaWYKKworI2RlZmluZSBNQVhfREVWSUNFX0NPVU5UIDQKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2lmZGVmIENPTkZJR19IRExDX01PRFVMRQorI2RlZmluZSBDT05GSUdfSERMQyAxCisjZW5kaWYKKworI2RlZmluZSBHRVRfVVNFUihlcnJvcix2YWx1ZSxhZGRyKSBlcnJvciA9IGdldF91c2VyKHZhbHVlLGFkZHIpCisjZGVmaW5lIENPUFlfRlJPTV9VU0VSKGVycm9yLGRlc3Qsc3JjLHNpemUpIGVycm9yID0gY29weV9mcm9tX3VzZXIoZGVzdCxzcmMsc2l6ZSkgPyAtRUZBVUxUIDogMAorI2RlZmluZSBQVVRfVVNFUihlcnJvcix2YWx1ZSxhZGRyKSBlcnJvciA9IHB1dF91c2VyKHZhbHVlLGFkZHIpCisjZGVmaW5lIENPUFlfVE9fVVNFUihlcnJvcixkZXN0LHNyYyxzaXplKSBlcnJvciA9IGNvcHlfdG9fdXNlcihkZXN0LHNyYyxzaXplKSA/IC1FRkFVTFQgOiAwCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAibGludXgvc3luY2xpbmsuaCIKKworc3RhdGljIE1HU0xfUEFSQU1TIGRlZmF1bHRfcGFyYW1zID0geworCU1HU0xfTU9ERV9IRExDLAkJCS8qIHVuc2lnbmVkIGxvbmcgbW9kZSAqLworCTAsCQkJCS8qIHVuc2lnbmVkIGNoYXIgbG9vcGJhY2s7ICovCisJSERMQ19GTEFHX1VOREVSUlVOX0FCT1JUMTUsCS8qIHVuc2lnbmVkIHNob3J0IGZsYWdzOyAqLworCUhETENfRU5DT0RJTkdfTlJaSV9TUEFDRSwJLyogdW5zaWduZWQgY2hhciBlbmNvZGluZzsgKi8KKwkwLAkJCQkvKiB1bnNpZ25lZCBsb25nIGNsb2NrX3NwZWVkOyAqLworCTB4ZmYsCQkJCS8qIHVuc2lnbmVkIGNoYXIgYWRkcl9maWx0ZXI7ICovCisJSERMQ19DUkNfMTZfQ0NJVFQsCQkvKiB1bnNpZ25lZCBzaG9ydCBjcmNfdHlwZTsgKi8KKwlIRExDX1BSRUFNQkxFX0xFTkdUSF84QklUUywJLyogdW5zaWduZWQgY2hhciBwcmVhbWJsZV9sZW5ndGg7ICovCisJSERMQ19QUkVBTUJMRV9QQVRURVJOX05PTkUsCS8qIHVuc2lnbmVkIGNoYXIgcHJlYW1ibGU7ICovCisJOTYwMCwJCQkJLyogdW5zaWduZWQgbG9uZyBkYXRhX3JhdGU7ICovCisJOCwJCQkJLyogdW5zaWduZWQgY2hhciBkYXRhX2JpdHM7ICovCisJMSwJCQkJLyogdW5zaWduZWQgY2hhciBzdG9wX2JpdHM7ICovCisJQVNZTkNfUEFSSVRZX05PTkUJCS8qIHVuc2lnbmVkIGNoYXIgcGFyaXR5OyAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJY2hhciBkYXRhWzFdOworfSBSWEJVRjsKKworLyogVGhlIHF1ZXVlIG9mIEJIIGFjdGlvbnMgdG8gYmUgcGVyZm9ybWVkICovCisKKyNkZWZpbmUgQkhfUkVDRUlWRSAgMQorI2RlZmluZSBCSF9UUkFOU01JVCAyCisjZGVmaW5lIEJIX1NUQVRVUyAgIDQKKworI2RlZmluZSBJT19QSU5fU0hVVERPV05fTElNSVQgMTAwCisKKyNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQorCitzdHJ1Y3QgX2lucHV0X3NpZ25hbF9ldmVudHMgeworCWludAlyaV91cDsJCisJaW50CXJpX2Rvd247CisJaW50CWRzcl91cDsKKwlpbnQJZHNyX2Rvd247CisJaW50CWRjZF91cDsKKwlpbnQJZGNkX2Rvd247CisJaW50CWN0c191cDsKKwlpbnQJY3RzX2Rvd247Cit9OworCisKKy8qCisgKiBEZXZpY2UgaW5zdGFuY2UgZGF0YSBzdHJ1Y3R1cmUKKyAqLworIAordHlwZWRlZiBzdHJ1Y3QgX21nc2xwY19pbmZvIHsKKwl2b2lkICppZl9wdHI7CS8qIEdlbmVyYWwgcHVycG9zZSBwb2ludGVyICh1c2VkIGJ5IFNQUFApICovCisJaW50CQkJbWFnaWM7CisJaW50CQkJZmxhZ3M7CisJaW50CQkJY291bnQ7CQkvKiBjb3VudCBvZiBvcGVucyAqLworCWludAkJCWxpbmU7CisJdW5zaWduZWQgc2hvcnQJCWNsb3NlX2RlbGF5OworCXVuc2lnbmVkIHNob3J0CQljbG9zaW5nX3dhaXQ7CS8qIHRpbWUgdG8gd2FpdCBiZWZvcmUgY2xvc2luZyAqLworCQorCXN0cnVjdCBtZ3NsX2ljb3VudAlpY291bnQ7CisJCisJc3RydWN0IHR0eV9zdHJ1Y3QgCSp0dHk7CisJaW50CQkJdGltZW91dDsKKwlpbnQJCQl4X2NoYXI7CQkvKiB4b24veG9mZiBjaGFyYWN0ZXIgKi8KKwlpbnQJCQlibG9ja2VkX29wZW47CS8qICMgb2YgYmxvY2tlZCBvcGVucyAqLworCXVuc2lnbmVkIGNoYXIJCXJlYWRfc3RhdHVzX21hc2s7CisJdW5zaWduZWQgY2hhcgkJaWdub3JlX3N0YXR1c19tYXNrOwkKKworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZjsKKwlpbnQgICAgICAgICAgICB0eF9wdXQ7CisJaW50ICAgICAgICAgICAgdHhfZ2V0OworCWludCAgICAgICAgICAgIHR4X2NvdW50OworCisJLyogY2lyY3VsYXIgbGlzdCBvZiBmaXhlZCBsZW5ndGggcnggYnVmZmVycyAqLworCisJdW5zaWduZWQgY2hhciAgKnJ4X2J1ZjsgICAgICAgIC8qIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGFsbCByeCBidWZmZXJzICovCisJaW50ICAgICAgICAgICAgcnhfYnVmX3RvdGFsX3NpemU7IC8qIHNpemUgb2YgbWVtb3J5IGFsbG9jYXRlZCBmb3IgcnggYnVmZmVycyAqLworCWludCAgICAgICAgICAgIHJ4X3B1dDsgICAgICAgICAvKiBpbmRleCBvZiBuZXh0IGVtcHR5IHJ4IGJ1ZmZlciAqLworCWludCAgICAgICAgICAgIHJ4X2dldDsgICAgICAgICAvKiBpbmRleCBvZiBuZXh0IGZ1bGwgcnggYnVmZmVyICovCisJaW50ICAgICAgICAgICAgcnhfYnVmX3NpemU7ICAgIC8qIHNpemUgaW4gYnl0ZXMgb2Ygc2luZ2xlIHJ4IGJ1ZmZlciAqLworCWludCAgICAgICAgICAgIHJ4X2J1Zl9jb3VudDsgICAvKiB0b3RhbCBudW1iZXIgb2YgcnggYnVmZmVycyAqLworCWludCAgICAgICAgICAgIHJ4X2ZyYW1lX2NvdW50OyAvKiBudW1iZXIgb2YgZnVsbCByeCBidWZmZXJzICovCisJCisJd2FpdF9xdWV1ZV9oZWFkX3QJb3Blbl93YWl0OworCXdhaXRfcXVldWVfaGVhZF90CWNsb3NlX3dhaXQ7CisJCisJd2FpdF9xdWV1ZV9oZWFkX3QJc3RhdHVzX2V2ZW50X3dhaXRfcTsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlldmVudF93YWl0X3E7CisJc3RydWN0IHRpbWVyX2xpc3QJdHhfdGltZXI7CS8qIEhETEMgdHJhbnNtaXQgdGltZW91dCB0aW1lciAqLworCXN0cnVjdCBfbWdzbHBjX2luZm8JKm5leHRfZGV2aWNlOwkvKiBkZXZpY2UgbGlzdCBsaW5rICovCisKKwl1bnNpZ25lZCBzaG9ydCBpbXJhX3ZhbHVlOworCXVuc2lnbmVkIHNob3J0IGltcmJfdmFsdWU7CisJdW5zaWduZWQgY2hhciAgcGltX3ZhbHVlOworCisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0YXNrOwkJLyogdGFzayBzdHJ1Y3R1cmUgZm9yIHNjaGVkdWxpbmcgYmggKi8KKworCXUzMiBtYXhfZnJhbWVfc2l6ZTsKKworCXUzMiBwZW5kaW5nX2JoOworCisJaW50IGJoX3J1bm5pbmc7CisJaW50IGJoX3JlcXVlc3RlZDsKKwkKKwlpbnQgZGNkX2Noa2NvdW50OyAvKiBjaGVjayBjb3VudHMgdG8gcHJldmVudCAqLworCWludCBjdHNfY2hrY291bnQ7IC8qIHRvbyBtYW55IElSUXMgaWYgYSBzaWduYWwgKi8KKwlpbnQgZHNyX2Noa2NvdW50OyAvKiBpcyBmbG9hdGluZyAqLworCWludCByaV9jaGtjb3VudDsKKworCWludCByeF9lbmFibGVkOworCWludCByeF9vdmVyZmxvdzsKKworCWludCB0eF9lbmFibGVkOworCWludCB0eF9hY3RpdmU7CisJaW50IHR4X2Fib3J0aW5nOworCXUzMiBpZGxlX21vZGU7CisKKwlpbnQgaWZfbW9kZTsgLyogc2VyaWFsIGludGVyZmFjZSBzZWxlY3Rpb24gKFJTLTIzMiwgdi4zNSBldGMpICovCisKKwljaGFyIGRldmljZV9uYW1lWzI1XTsJCS8qIGRldmljZSBpbnN0YW5jZSBuYW1lICovCisKKwl1bnNpZ25lZCBpbnQgaW9fYmFzZTsJLyogYmFzZSBJL08gYWRkcmVzcyBvZiBhZGFwdGVyICovCisJdW5zaWduZWQgaW50IGlycV9sZXZlbDsKKwkKKwlNR1NMX1BBUkFNUyBwYXJhbXM7CQkvKiBjb21tdW5pY2F0aW9ucyBwYXJhbWV0ZXJzICovCisKKwl1bnNpZ25lZCBjaGFyIHNlcmlhbF9zaWduYWxzOwkvKiBjdXJyZW50IHNlcmlhbCBzaWduYWwgc3RhdGVzICovCisKKwljaGFyIGlycV9vY2N1cnJlZDsJCS8qIGZvciBkaWFnbm9zdGljcyB1c2UgKi8KKwljaGFyIHRlc3RpbmdfaXJxOworCXVuc2lnbmVkIGludCBpbml0X2Vycm9yOwkvKiBzdGFydHVwIGVycm9yIChESUFHUykJKi8KKworCWNoYXIgZmxhZ19idWZbTUFYX0FTWU5DX0JVRkZFUl9TSVpFXTsKKwlCT09MRUFOIGRyb3BfcnRzX29uX3R4X2RvbmU7CisKKwlzdHJ1Y3QJX2lucHV0X3NpZ25hbF9ldmVudHMJaW5wdXRfc2lnbmFsX2V2ZW50czsKKworCS8qIFBDTUNJQSBzdXBwb3J0ICovCisJZGV2X2xpbmtfdAkgICAgICBsaW5rOworCWRldl9ub2RlX3QJICAgICAgbm9kZTsKKwlpbnQJCSAgICAgIHN0b3A7CisKKwkvKiBTUFBQL0Npc2NvIEhETEMgZGV2aWNlIHBhcnRzICovCisJaW50IG5ldGNvdW50OworCWludCBkb3N5bmNwcHA7CisJc3BpbmxvY2tfdCBuZXRsb2NrOworCisjaWZkZWYgQ09ORklHX0hETEMKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworI2VuZGlmCisKK30gTUdTTFBDX0lORk87CisKKyNkZWZpbmUgTUdTTFBDX01BR0lDIDB4NTQwMgorCisvKgorICogVGhlIHNpemUgb2YgdGhlIHNlcmlhbCB4bWl0IGJ1ZmZlciBpcyAxIHBhZ2UsIG9yIDQwOTYgYnl0ZXMKKyAqLworI2RlZmluZSBUWEJVRlNJWkUgNDA5NgorCisgICAgCisjZGVmaW5lIENIQSAgICAgMHgwMCAgIC8qIGNoYW5uZWwgQSBvZmZzZXQgKi8KKyNkZWZpbmUgQ0hCICAgICAweDQwICAgLyogY2hhbm5lbCBCIG9mZnNldCAqLworCisvKgorICogIEZJWE1FOiBQUEMgaGFzIFBWUiBkZWZpbmVkIGluIGFzbS9yZWcuaC4gIEZvciBub3cgd2UganVzdCB1bmRlZiBpdC4KKyAqLworI3VuZGVmIFBWUgorCisjZGVmaW5lIFJYRklGTyAgMAorI2RlZmluZSBUWEZJRk8gIDAKKyNkZWZpbmUgU1RBUiAgICAweDIwCisjZGVmaW5lIENNRFIgICAgMHgyMAorI2RlZmluZSBSU1RBICAgIDB4MjEKKyNkZWZpbmUgUFJFICAgICAweDIxCisjZGVmaW5lIE1PREUgICAgMHgyMgorI2RlZmluZSBUSU1SICAgIDB4MjMKKyNkZWZpbmUgWEFEMSAgICAweDI0CisjZGVmaW5lIFhBRDIgICAgMHgyNQorI2RlZmluZSBSQUgxICAgIDB4MjYKKyNkZWZpbmUgUkFIMiAgICAweDI3CisjZGVmaW5lIERBRk8gICAgMHgyNworI2RlZmluZSBSQUwxICAgIDB4MjgKKyNkZWZpbmUgUkZDICAgICAweDI4CisjZGVmaW5lIFJIQ1IgICAgMHgyOQorI2RlZmluZSBSQUwyICAgIDB4MjkKKyNkZWZpbmUgUkJDTCAgICAweDJhCisjZGVmaW5lIFhCQ0wgICAgMHgyYQorI2RlZmluZSBSQkNIICAgIDB4MmIKKyNkZWZpbmUgWEJDSCAgICAweDJiCisjZGVmaW5lIENDUjAgICAgMHgyYworI2RlZmluZSBDQ1IxICAgIDB4MmQKKyNkZWZpbmUgQ0NSMiAgICAweDJlCisjZGVmaW5lIENDUjMgICAgMHgyZgorI2RlZmluZSBWU1RSICAgIDB4MzQKKyNkZWZpbmUgQkdSICAgICAweDM0CisjZGVmaW5lIFJMQ1IgICAgMHgzNQorI2RlZmluZSBBTUwgICAgIDB4MzYKKyNkZWZpbmUgQU1IICAgICAweDM3CisjZGVmaW5lIEdJUyAgICAgMHgzOAorI2RlZmluZSBJVkEgICAgIDB4MzgKKyNkZWZpbmUgSVBDICAgICAweDM5CisjZGVmaW5lIElTUiAgICAgMHgzYQorI2RlZmluZSBJTVIgICAgIDB4M2EKKyNkZWZpbmUgUFZSICAgICAweDNjCisjZGVmaW5lIFBJUyAgICAgMHgzZAorI2RlZmluZSBQSU0gICAgIDB4M2QKKyNkZWZpbmUgUENSICAgICAweDNlCisjZGVmaW5lIENDUjQgICAgMHgzZgorICAgIAorLy8gSU1SL0lTUgorICAgIAorI2RlZmluZSBJUlFfQlJFQUtfT04gICAgQklUMTUgICAvLyByeCBicmVhayBkZXRlY3RlZAorI2RlZmluZSBJUlFfREFUQU9WRVJSVU4gQklUMTQJLy8gcmVjZWl2ZSBkYXRhIG92ZXJmbG93CisjZGVmaW5lIElSUV9BTExTRU5UICAgICBCSVQxMwkvLyBhbGwgc2VudAorI2RlZmluZSBJUlFfVU5ERVJSVU4gICAgQklUMTIJLy8gdHJhbnNtaXQgZGF0YSB1bmRlcnJ1bgorI2RlZmluZSBJUlFfVElNRVIgICAgICAgQklUMTEJLy8gdGltZXIgaW50ZXJydXB0CisjZGVmaW5lIElSUV9DVFMgICAgICAgICBCSVQxMAkvLyBDVFMgc3RhdHVzIGNoYW5nZQorI2RlZmluZSBJUlFfVFhSRVBFQVQgICAgQklUOQkvLyB0eCBtZXNzYWdlIHJlcGVhdAorI2RlZmluZSBJUlFfVFhGSUZPICAgICAgQklUOAkvLyB0cmFuc21pdCBwb29sIHJlYWR5CisjZGVmaW5lIElSUV9SWEVPTSAgICAgICBCSVQ3CS8vIHJlY2VpdmUgbWVzc2FnZSBlbmQKKyNkZWZpbmUgSVJRX0VYSVRIVU5UICAgIEJJVDYJLy8gcmVjZWl2ZSBmcmFtZSBzdGFydAorI2RlZmluZSBJUlFfUlhUSU1FICAgICAgQklUNiAgICAvLyByeCBjaGFyIHRpbWVvdXQKKyNkZWZpbmUgSVJRX0RDRCAgICAgICAgIEJJVDIJLy8gY2FycmllciBkZXRlY3Qgc3RhdHVzIGNoYW5nZQorI2RlZmluZSBJUlFfT1ZFUlJVTiAgICAgQklUMQkvLyByZWNlaXZlIGZyYW1lIG92ZXJmbG93CisjZGVmaW5lIElSUV9SWEZJRk8gICAgICBCSVQwCS8vIHJlY2VpdmUgcG9vbCBmdWxsCisgICAgCisvLyBTVEFSCisgICAgCisjZGVmaW5lIFhGVyAgIEJJVDYJCS8vIHRyYW5zbWl0IEZJRk8gd3JpdGUgZW5hYmxlCisjZGVmaW5lIENFQyAgIEJJVDIJCS8vIGNvbW1hbmQgZXhlY3V0aW5nCisjZGVmaW5lIENUUyAgIEJJVDEJCS8vIENUUyBzdGF0ZQorICAgIAorI2RlZmluZSBQVlJfRFRSICAgICAgQklUMAorI2RlZmluZSBQVlJfRFNSICAgICAgQklUMQorI2RlZmluZSBQVlJfUkkgICAgICAgQklUMgorI2RlZmluZSBQVlJfQVVUT0NUUyAgQklUMworI2RlZmluZSBQVlJfUlMyMzIgICAgMHgyMCAgIC8qIDAwMTBiICovCisjZGVmaW5lIFBWUl9WMzUgICAgICAweGUwICAgLyogMTExMGIgKi8KKyNkZWZpbmUgUFZSX1JTNDIyICAgIDB4NDAgICAvKiAwMTAwYiAqLworICAgIAorLyogUmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucyAqLyAKKyAgICAKKyNkZWZpbmUgd3JpdGVfcmVnKGluZm8sIHJlZywgdmFsKSBvdXRiKCh2YWwpLChpbmZvKS0+aW9fYmFzZSArIChyZWcpKQorI2RlZmluZSByZWFkX3JlZyhpbmZvLCByZWcpIGluYigoaW5mbyktPmlvX2Jhc2UgKyAocmVnKSkKKworI2RlZmluZSByZWFkX3JlZzE2KGluZm8sIHJlZykgaW53KChpbmZvKS0+aW9fYmFzZSArIChyZWcpKSAgCisjZGVmaW5lIHdyaXRlX3JlZzE2KGluZm8sIHJlZywgdmFsKSBvdXR3KCh2YWwpLCAoaW5mbyktPmlvX2Jhc2UgKyAocmVnKSkKKyAgICAKKyNkZWZpbmUgc2V0X3JlZ19iaXRzKGluZm8sIHJlZywgbWFzaykgXAorICAgIHdyaXRlX3JlZyhpbmZvLCAocmVnKSwgXAorCQkgKHVuc2lnbmVkIGNoYXIpIChyZWFkX3JlZyhpbmZvLCAocmVnKSkgfCAobWFzaykpKSAgCisjZGVmaW5lIGNsZWFyX3JlZ19iaXRzKGluZm8sIHJlZywgbWFzaykgXAorICAgIHdyaXRlX3JlZyhpbmZvLCAocmVnKSwgXAorCQkgKHVuc2lnbmVkIGNoYXIpIChyZWFkX3JlZyhpbmZvLCAocmVnKSkgJiB+KG1hc2spKSkgIAorLyoKKyAqIGludGVycnVwdCBlbmFibGUvZGlzYWJsZSByb3V0aW5lcworICovIAorc3RhdGljIHZvaWQgaXJxX2Rpc2FibGUoTUdTTFBDX0lORk8gKmluZm8sIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCwgdW5zaWduZWQgc2hvcnQgbWFzaykgCit7CisJaWYgKGNoYW5uZWwgPT0gQ0hBKSB7CisJCWluZm8tPmltcmFfdmFsdWUgfD0gbWFzazsKKwkJd3JpdGVfcmVnMTYoaW5mbywgQ0hBICsgSU1SLCBpbmZvLT5pbXJhX3ZhbHVlKTsKKwl9IGVsc2UgeworCQlpbmZvLT5pbXJiX3ZhbHVlIHw9IG1hc2s7CisJCXdyaXRlX3JlZzE2KGluZm8sIENIQiArIElNUiwgaW5mby0+aW1yYl92YWx1ZSk7CisJfQorfQorc3RhdGljIHZvaWQgaXJxX2VuYWJsZShNR1NMUENfSU5GTyAqaW5mbywgdW5zaWduZWQgY2hhciBjaGFubmVsLCB1bnNpZ25lZCBzaG9ydCBtYXNrKSAKK3sKKwlpZiAoY2hhbm5lbCA9PSBDSEEpIHsKKwkJaW5mby0+aW1yYV92YWx1ZSAmPSB+bWFzazsKKwkJd3JpdGVfcmVnMTYoaW5mbywgQ0hBICsgSU1SLCBpbmZvLT5pbXJhX3ZhbHVlKTsKKwl9IGVsc2UgeworCQlpbmZvLT5pbXJiX3ZhbHVlICY9IH5tYXNrOworCQl3cml0ZV9yZWcxNihpbmZvLCBDSEIgKyBJTVIsIGluZm8tPmltcmJfdmFsdWUpOworCX0KK30KKworI2RlZmluZSBwb3J0X2lycV9kaXNhYmxlKGluZm8sIG1hc2spIFwKKyAgeyBpbmZvLT5waW1fdmFsdWUgfD0gKG1hc2spOyB3cml0ZV9yZWcoaW5mbywgUElNLCBpbmZvLT5waW1fdmFsdWUpOyB9CisKKyNkZWZpbmUgcG9ydF9pcnFfZW5hYmxlKGluZm8sIG1hc2spIFwKKyAgeyBpbmZvLT5waW1fdmFsdWUgJj0gfihtYXNrKTsgd3JpdGVfcmVnKGluZm8sIFBJTSwgaW5mby0+cGltX3ZhbHVlKTsgfQorCitzdGF0aWMgdm9pZCByeF9zdGFydChNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCByeF9zdG9wKE1HU0xQQ19JTkZPICppbmZvKTsKKworc3RhdGljIHZvaWQgdHhfc3RhcnQoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgdHhfc3RvcChNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCB0eF9zZXRfaWRsZShNR1NMUENfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyB2b2lkIGdldF9zaWduYWxzKE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIHNldF9zaWduYWxzKE1HU0xQQ19JTkZPICppbmZvKTsKKworc3RhdGljIHZvaWQgcmVzZXRfZGV2aWNlKE1HU0xQQ19JTkZPICppbmZvKTsKKworc3RhdGljIHZvaWQgaGRsY19tb2RlKE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGFzeW5jX21vZGUoTUdTTFBDX0lORk8gKmluZm8pOworCitzdGF0aWMgdm9pZCB0eF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgY29udGV4dCk7CisKK3N0YXRpYyBpbnQgaW9jdGxfY29tbW9uKE1HU0xQQ19JTkZPICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKKyNpZmRlZiBDT05GSUdfSERMQworI2RlZmluZSBkZXZfdG9fcG9ydChEKSAoZGV2X3RvX2hkbGMoRCktPnByaXYpCitzdGF0aWMgdm9pZCBoZGxjZGV2X3R4X2RvbmUoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgaGRsY2Rldl9yeChNR1NMUENfSU5GTyAqaW5mbywgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50ICBoZGxjZGV2X2luaXQoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgaGRsY2Rldl9leGl0KE1HU0xQQ19JTkZPICppbmZvKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0cmFjZV9ibG9jayhNR1NMUENfSU5GTyAqaW5mbyxjb25zdCBjaGFyKiBkYXRhLCBpbnQgY291bnQsIGludCB4bWl0KTsKKworc3RhdGljIEJPT0xFQU4gcmVnaXN0ZXJfdGVzdChNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgQk9PTEVBTiBpcnFfdGVzdChNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgaW50IGFkYXB0ZXJfdGVzdChNR1NMUENfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyBpbnQgY2xhaW1fcmVzb3VyY2VzKE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfcmVzb3VyY2VzKE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xwY19hZGRfZGV2aWNlKE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xwY19yZW1vdmVfZGV2aWNlKE1HU0xQQ19JTkZPICppbmZvKTsKKworc3RhdGljIGludCAgcnhfZ2V0X2ZyYW1lKE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIHJ4X3Jlc2V0X2J1ZmZlcnMoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIGludCAgcnhfYWxsb2NfYnVmZmVycyhNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCByeF9mcmVlX2J1ZmZlcnMoTUdTTFBDX0lORk8gKmluZm8pOworCitzdGF0aWMgaXJxcmV0dXJuX3QgbWdzbHBjX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CisKKy8qCisgKiBCb3R0b20gaGFsZiBpbnRlcnJ1cHQgaGFuZGxlcnMKKyAqLworc3RhdGljIHZvaWQgYmhfaGFuZGxlcih2b2lkKiBDb250ZXh0KTsKK3N0YXRpYyB2b2lkIGJoX3RyYW5zbWl0KE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGJoX3N0YXR1cyhNR1NMUENfSU5GTyAqaW5mbyk7CisKKy8qCisgKiBpb2N0bCBoYW5kbGVycworICovCitzdGF0aWMgaW50IHRpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpOworc3RhdGljIGludCBnZXRfc3RhdHMoTUdTTFBDX0lORk8gKmluZm8sIHN0cnVjdCBtZ3NsX2ljb3VudCBfX3VzZXIgKnVzZXJfaWNvdW50KTsKK3N0YXRpYyBpbnQgZ2V0X3BhcmFtcyhNR1NMUENfSU5GTyAqaW5mbywgTUdTTF9QQVJBTVMgX191c2VyICp1c2VyX3BhcmFtcyk7CitzdGF0aWMgaW50IHNldF9wYXJhbXMoTUdTTFBDX0lORk8gKmluZm8sIE1HU0xfUEFSQU1TIF9fdXNlciAqbmV3X3BhcmFtcyk7CitzdGF0aWMgaW50IGdldF90eGlkbGUoTUdTTFBDX0lORk8gKmluZm8sIGludCBfX3VzZXIgKmlkbGVfbW9kZSk7CitzdGF0aWMgaW50IHNldF90eGlkbGUoTUdTTFBDX0lORk8gKmluZm8sIGludCBpZGxlX21vZGUpOworc3RhdGljIGludCBzZXRfdHhlbmFibGUoTUdTTFBDX0lORk8gKmluZm8sIGludCBlbmFibGUpOworc3RhdGljIGludCB0eF9hYm9ydChNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgaW50IHNldF9yeGVuYWJsZShNR1NMUENfSU5GTyAqaW5mbywgaW50IGVuYWJsZSk7CitzdGF0aWMgaW50IHdhaXRfZXZlbnRzKE1HU0xQQ19JTkZPICppbmZvLCBpbnQgX191c2VyICptYXNrKTsKKworc3RhdGljIE1HU0xQQ19JTkZPICptZ3NscGNfZGV2aWNlX2xpc3QgPSBOVUxMOworc3RhdGljIGludCBtZ3NscGNfZGV2aWNlX2NvdW50ID0gMDsKKworLyoKKyAqIFNldCB0aGlzIHBhcmFtIHRvIG5vbi16ZXJvIHRvIGxvYWQgZWF4IHdpdGggdGhlCisgKiAudGV4dCBzZWN0aW9uIGFkZHJlc3MgYW5kIGJyZWFrcG9pbnQgb24gbW9kdWxlIGxvYWQuCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgdXNlIHdpdGggZ2RiIGFuZCBhZGQtc3ltYm9sLWZpbGUgY29tbWFuZC4KKyAqLworc3RhdGljIGludCBicmVha19vbl9sb2FkPTA7CisKKy8qCisgKiBEcml2ZXIgbWFqb3IgbnVtYmVyLCBkZWZhdWx0cyB0byB6ZXJvIHRvIGdldCBhdXRvCisgKiBhc3NpZ25lZCBtYWpvciBudW1iZXIuIE1heSBiZSBmb3JjZWQgYXMgbW9kdWxlIHBhcmFtZXRlci4KKyAqLworc3RhdGljIGludCB0dHltYWpvcj0wOworCitzdGF0aWMgaW50IGRlYnVnX2xldmVsID0gMDsKK3N0YXRpYyBpbnQgbWF4ZnJhbWVbTUFYX0RFVklDRV9DT1VOVF0gPSB7MCx9Oworc3RhdGljIGludCBkb3N5bmNwcHBbTUFYX0RFVklDRV9DT1VOVF0gPSB7MSwxLDEsMX07CisKK21vZHVsZV9wYXJhbShicmVha19vbl9sb2FkLCBib29sLCAwKTsKK21vZHVsZV9wYXJhbSh0dHltYWpvciwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1Z19sZXZlbCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShtYXhmcmFtZSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShkb3N5bmNwcHAsIGludCwgTlVMTCwgMCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGNoYXIgKmRyaXZlcl9uYW1lID0gIlN5bmNMaW5rIFBDIENhcmQgZHJpdmVyIjsKK3N0YXRpYyBjaGFyICpkcml2ZXJfdmVyc2lvbiA9ICIkUmV2aXNpb246IDQuMjYgJCI7CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKKworLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgbGVmdCBpbiB4bWl0IGJ1ZmZlciBiZWZvcmUgd2UgYXNrIGZvciBtb3JlICovCisjZGVmaW5lIFdBS0VVUF9DSEFSUyAyNTYKKworc3RhdGljIHZvaWQgbWdzbHBjX2NoYW5nZV9wYXJhbXMoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgbWdzbHBjX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCk7CisKKy8qIFBDTUNJQSBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkIG1nc2xwY19jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCBtZ3NscGNfcmVsZWFzZSh1X2xvbmcgYXJnKTsKK3N0YXRpYyBpbnQgIG1nc2xwY19ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQkgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKK3N0YXRpYyBkZXZfbGlua190ICptZ3NscGNfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgbWdzbHBjX2RldGFjaChkZXZfbGlua190ICopOworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJzeW5jbGlua19jcyI7CitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3QgPSBOVUxMOworCisvKgorICogMXN0IGZ1bmN0aW9uIGRlZmluZWQgaW4gLnRleHQgc2VjdGlvbi4gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGluCisgKiBpbml0X21vZHVsZSgpIGZvbGxvd2VkIGJ5IGEgYnJlYWtwb2ludCBhbGxvd3MgYSByZW1vdGUgZGVidWdnZXIKKyAqIChnZGIpIHRvIGdldCB0aGUgLnRleHQgYWRkcmVzcyBmb3IgdGhlIGFkZC1zeW1ib2wtZmlsZSBjb21tYW5kLgorICogVGhpcyBhbGxvd3MgcmVtb3RlIGRlYnVnZ2luZyBvZiBkeW5hbWljYWxseSBsb2FkYWJsZSBtb2R1bGVzLgorICovCitzdGF0aWMgdm9pZCogbWdzbHBjX2dldF90ZXh0X3B0cih2b2lkKQoreworCXJldHVybiBtZ3NscGNfZ2V0X3RleHRfcHRyOworfQorCisvKioKKyAqIGxpbmUgZGlzY2lwbGluZSBjYWxsYmFjayB3cmFwcGVycworICoKKyAqIFRoZSB3cmFwcGVycyBtYWludGFpbiBsaW5lIGRpc2NpcGxpbmUgcmVmZXJlbmNlcworICogd2hpbGUgY2FsbGluZyBpbnRvIHRoZSBsaW5lIGRpc2NpcGxpbmUuCisgKgorICogbGRpc2NfZmx1c2hfYnVmZmVyIC0gZmx1c2ggbGluZSBkaXNjaXBsaW5lIHJlY2VpdmUgYnVmZmVycworICogbGRpc2NfcmVjZWl2ZV9idWYgIC0gcGFzcyByZWNlaXZlIGRhdGEgdG8gbGluZSBkaXNjaXBsaW5lCisgKi8KKworc3RhdGljIHZvaWQgbGRpc2NfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaWYgKGxkKSB7CisJCWlmIChsZC0+Zmx1c2hfYnVmZmVyKQorCQkJbGQtPmZsdXNoX2J1ZmZlcih0dHkpOworCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCX0KK30KKworc3RhdGljIHZvaWQgbGRpc2NfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCSAgICAgIGNvbnN0IF9fdTggKmRhdGEsIGNoYXIgKmZsYWdzLCBpbnQgY291bnQpCit7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisJaWYgKCF0dHkpCisJCXJldHVybjsKKwlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwlpZiAobGQpIHsKKwkJaWYgKGxkLT5yZWNlaXZlX2J1ZikKKwkJCWxkLT5yZWNlaXZlX2J1Zih0dHksIGRhdGEsIGZsYWdzLCBjb3VudCk7CisJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJfQorfQorCitzdGF0aWMgZGV2X2xpbmtfdCAqbWdzbHBjX2F0dGFjaCh2b2lkKQoreworICAgIE1HU0xQQ19JTkZPICppbmZvOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisgICAgaW50IHJldDsKKyAgICAKKyAgICBpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkgICAgcHJpbnRrKCJtZ3NscGNfYXR0YWNoXG4iKTsKKwkKKyAgICBpbmZvID0gKE1HU0xQQ19JTkZPICopa21hbGxvYyhzaXplb2YoTUdTTFBDX0lORk8pLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWluZm8pIHsKKwkgICAgcHJpbnRrKCJFcnJvciBjYW4ndCBhbGxvY2F0ZSBkZXZpY2UgaW5zdGFuY2UgZGF0YVxuIik7CisJICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1lbXNldChpbmZvLCAwLCBzaXplb2YoTUdTTFBDX0lORk8pKTsKKyAgICBpbmZvLT5tYWdpYyA9IE1HU0xQQ19NQUdJQzsKKyAgICBJTklUX1dPUksoJmluZm8tPnRhc2ssIGJoX2hhbmRsZXIsIGluZm8pOworICAgIGluZm8tPm1heF9mcmFtZV9zaXplID0gNDA5NjsKKyAgICBpbmZvLT5jbG9zZV9kZWxheSA9IDUqSFovMTA7CisgICAgaW5mby0+Y2xvc2luZ193YWl0ID0gMzAqSFo7CisgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+b3Blbl93YWl0KTsKKyAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5jbG9zZV93YWl0KTsKKyAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKyAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5ldmVudF93YWl0X3EpOworICAgIHNwaW5fbG9ja19pbml0KCZpbmZvLT5sb2NrKTsKKyAgICBzcGluX2xvY2tfaW5pdCgmaW5mby0+bmV0bG9jayk7CisgICAgbWVtY3B5KCZpbmZvLT5wYXJhbXMsJmRlZmF1bHRfcGFyYW1zLHNpemVvZihNR1NMX1BBUkFNUykpOworICAgIGluZm8tPmlkbGVfbW9kZSA9IEhETENfVFhJRExFX0ZMQUdTOwkJCisgICAgaW5mby0+aW1yYV92YWx1ZSA9IDB4ZmZmZjsKKyAgICBpbmZvLT5pbXJiX3ZhbHVlID0gMHhmZmZmOworICAgIGluZm8tPnBpbV92YWx1ZSA9IDB4ZmY7CisKKyAgICBsaW5rID0gJmluZm8tPmxpbms7CisgICAgbGluay0+cHJpdiA9IGluZm87CisgICAgCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKi8KKworICAgIC8qIEludGVycnVwdCBzZXR1cCAqLworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFOworICAgIGxpbmstPmlycS5JUlFJbmZvMSAgID0gSVJRX0lORk8yX1ZBTElEIHwgSVJRX0xFVkVMX0lEOworICAgIGxpbmstPmlycS5IYW5kbGVyID0gTlVMTDsKKyAgICAKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSAwOworICAgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworCisgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKyAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9CisJICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwkgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwkgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmbWdzbHBjX2V2ZW50OworICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJICAgIG1nc2xwY19kZXRhY2gobGluayk7CisJICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1nc2xwY19hZGRfZGV2aWNlKGluZm8pOworCisgICAgcmV0dXJuIGxpbms7Cit9CisKKy8qIENhcmQgaGFzIGJlZW4gaW5zZXJ0ZWQuCisgKi8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBtZ3NscGNfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICBNR1NMUENfSU5GTyAqaW5mbyA9IGxpbmstPnByaXY7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIGludCBsYXN0X2ZuLCBsYXN0X3JldDsKKyAgICB1X2NoYXIgYnVmWzY0XTsKKyAgICBjb25maWdfaW5mb190IGNvbmY7CisgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0ID0geyAwIH07CisgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnOworICAgIAorICAgIGlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCSAgICBwcmludGsoIm1nc2xwY19jb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgLyogcmVhZCBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisgICAgCisgICAgLyogQ29uZmlndXJlIGNhcmQgKi8KKyAgICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisgICAgLyogTG9vayB1cCB0aGUgY3VycmVudCBWY2MgKi8KKyAgICBDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8oaGFuZGxlLCAmY29uZikpOworICAgIGxpbmstPmNvbmYuVmNjID0gY29uZi5WY2M7CisKKyAgICAvKiBnZXQgQ0lTIGNvbmZpZ3VyYXRpb24gZW50cnkgKi8KKworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKworICAgIGNmZyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeSk7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCisgICAgaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9ERUZBVUxUKSBkZmx0ID0gKmNmZzsKKyAgICBpZiAoY2ZnLT5pbmRleCA9PSAwKQorCSAgICBnb3RvIGNzX2ZhaWxlZDsKKworICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisJCisgICAgLyogSU8gd2luZG93IHNldHRpbmdzICovCisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMDsKKyAgICBpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LmlvLm53aW4gPiAwKSkgeworCSAgICBjaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQuaW87CisJICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJICAgIGlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKKwkJICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCSAgICBpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwkgICAgbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOworCSAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkgICAgQ1NfQ0hFQ0soUmVxdWVzdElPLCBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykpOworICAgIH0KKworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSA4OworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworICAgIAorICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzIHw9IElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pcnEuSGFuZGxlciAgICAgPSBtZ3NscGNfaXNyOworICAgIGxpbmstPmlycS5JbnN0YW5jZSAgICA9IGluZm87CisgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworCisgICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOworCisgICAgaW5mby0+aW9fYmFzZSA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICBpbmZvLT5pcnFfbGV2ZWwgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisKKyAgICAvKiBhZGQgdG8gbGlua2VkIGxpc3Qgb2YgZGV2aWNlcyAqLworICAgIHNwcmludGYoaW5mby0+bm9kZS5kZXZfbmFtZSwgIm1nc2xwYzAiKTsKKyAgICBpbmZvLT5ub2RlLm1ham9yID0gaW5mby0+bm9kZS5taW5vciA9IDA7CisgICAgbGluay0+ZGV2ID0gJmluZm8tPm5vZGU7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogaW5kZXggMHglMDJ4OiIsCisJICAgaW5mby0+bm9kZS5kZXZfbmFtZSwgbGluay0+Y29uZi5Db25maWdJbmRleCk7CisgICAgaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKKwkgICAgcHJpbnRrKCIsIGlycSAlZCIsIGxpbmstPmlycS5Bc3NpZ25lZElSUSk7CisgICAgaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkgICAgcHJpbnRrKCIsIGlvIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDEsCisJCSAgIGxpbmstPmlvLkJhc2VQb3J0MStsaW5rLT5pby5OdW1Qb3J0czEtMSk7CisgICAgcHJpbnRrKCJcbiIpOworICAgIAorICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgcmV0dXJuOworCitjc19mYWlsZWQ6CisgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CisgICAgbWdzbHBjX3JlbGVhc2UoKHVfbG9uZylsaW5rKTsKK30KKworLyogQ2FyZCBoYXMgYmVlbiByZW1vdmVkLgorICogVW5yZWdpc3RlciBkZXZpY2UgYW5kIHJlbGVhc2UgUENNQ0lBIGNvbmZpZ3VyYXRpb24uCisgKiBJZiBkZXZpY2UgaXMgb3BlbiwgcG9zdHBvbmUgdW50aWwgaXQgaXMgY2xvc2VkLgorICovCitzdGF0aWMgdm9pZCBtZ3NscGNfcmVsZWFzZSh1X2xvbmcgYXJnKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSAoZGV2X2xpbmtfdCAqKWFyZzsKKworICAgIGlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCSAgICBwcmludGsoIm1nc2xwY19yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qIFVubGluayB0aGUgZGV2aWNlIGNoYWluICovCisgICAgbGluay0+ZGV2ID0gTlVMTDsKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKKworICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICBpZiAobGluay0+aW8uTnVtUG9ydHMxKQorCSAgICBwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgaWYgKGxpbmstPmlycS5Bc3NpZ25lZElSUSkKKwkgICAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX1NUQUxFX0xJTkspCisJICAgIG1nc2xwY19kZXRhY2gobGluayk7Cit9CisKK3N0YXRpYyB2b2lkIG1nc2xwY19kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBkZXZfbGlua190ICoqbGlua3A7CisKKyAgICBpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkgICAgcHJpbnRrKCJtZ3NscGNfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKyAgICAKKyAgICAvKiBmaW5kIGRldmljZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJICAgIGlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKyAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIC8qIGRldmljZSBpcyBjb25maWd1cmVkL2FjdGl2ZSwgbWFyayBpdCBzbyB3aGVuCisJICAgICAqIHJlbGVhc2UoKSBpcyBjYWxsZWQgYSBwcm9wZXIgZGV0YWNoKCkgb2NjdXJzLgorCSAgICAgKi8KKwkgICAgaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCSAgICBwcmludGsoS0VSTl9ERUJVRyAic3luY2xpbmtwYzogZGV0YWNoIHBvc3Rwb25lZCwgJyVzJyAiCisJCQkgICAic3RpbGwgbG9ja2VkXG4iLCBsaW5rLT5kZXYtPmRldl9uYW1lKTsKKwkgICAgbGluay0+c3RhdGUgfD0gREVWX1NUQUxFX0xJTks7CisJICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBpZiAobGluay0+aGFuZGxlKQorCSAgICBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKyAgICAKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgYW5kIGZyZWUgaXQgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIG1nc2xwY19yZW1vdmVfZGV2aWNlKChNR1NMUENfSU5GTyAqKWxpbmstPnByaXYpOworfQorCitzdGF0aWMgaW50IG1nc2xwY19ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQlldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIE1HU0xQQ19JTkZPICppbmZvID0gbGluay0+cHJpdjsKKyAgICAKKyAgICBpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkgICAgcHJpbnRrKCJtZ3NscGNfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworICAgIAorICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwkgICAgbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCSAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCSAgICAoKE1HU0xQQ19JTkZPICopbGluay0+cHJpdiktPnN0b3AgPSAxOworCQkgICAgbWdzbHBjX3JlbGVhc2UoKHVfbG9uZylsaW5rKTsKKwkgICAgfQorCSAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCSAgICBsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwkgICAgbWdzbHBjX2NvbmZpZyhsaW5rKTsKKwkgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCSAgICBsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkgICAgLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwkgICAgLyogTWFyayB0aGUgZGV2aWNlIGFzIHN0b3BwZWQsIHRvIGJsb2NrIElPIHVudGlsIGxhdGVyICovCisJICAgIGluZm8tPnN0b3AgPSAxOworCSAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCQkgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCSAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwkgICAgbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCSAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCSAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCSAgICBpbmZvLT5zdG9wID0gMDsKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBtZ3NscGNfcGFyYW5vaWFfY2hlY2soTUdTTFBDX0lORk8gKmluZm8sCisJCQkJCWNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCit7CisjaWZkZWYgTUdTTFBDX1BBUkFOT0lBX0NIRUNLCisJc3RhdGljIGNvbnN0IGNoYXIgKmJhZG1hZ2ljID0KKwkJIldhcm5pbmc6IGJhZCBtYWdpYyBudW1iZXIgZm9yIG1nc2wgc3RydWN0ICglcykgaW4gJXNcbiI7CisJc3RhdGljIGNvbnN0IGNoYXIgKmJhZGluZm8gPQorCQkiV2FybmluZzogbnVsbCBtZ3NscGNfaW5mbyBmb3IgKCVzKSBpbiAlc1xuIjsKKworCWlmICghaW5mbykgeworCQlwcmludGsoYmFkaW5mbywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoaW5mby0+bWFnaWMgIT0gTUdTTFBDX01BR0lDKSB7CisJCXByaW50ayhiYWRtYWdpYywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKyNlbHNlCisJaWYgKCFpbmZvKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisKKyNkZWZpbmUgQ01EX1JYRklGTyAgICAgIEJJVDcJLy8gcmVsZWFzZSBjdXJyZW50IHJ4IEZJRk8KKyNkZWZpbmUgQ01EX1JYUkVTRVQgICAgIEJJVDYJLy8gcmVjZWl2ZXIgcmVzZXQKKyNkZWZpbmUgQ01EX1JYRklGT19SRUFEIEJJVDUKKyNkZWZpbmUgQ01EX1NUQVJUX1RJTUVSIEJJVDQKKyNkZWZpbmUgQ01EX1RYRklGTyAgICAgIEJJVDMJLy8gcmVsZWFzZSBjdXJyZW50IHR4IEZJRk8KKyNkZWZpbmUgQ01EX1RYRU9NICAgICAgIEJJVDEJLy8gdHJhbnNtaXQgZW5kIG1lc3NhZ2UKKyNkZWZpbmUgQ01EX1RYUkVTRVQgICAgIEJJVDAJLy8gdHJhbnNtaXQgcmVzZXQKKworc3RhdGljIEJPT0xFQU4gd2FpdF9jb21tYW5kX2NvbXBsZXRlKE1HU0xQQ19JTkZPICppbmZvLCB1bnNpZ25lZCBjaGFyIGNoYW5uZWwpIAoreworCWludCBpID0gMDsKKwkvKiB3YWl0IGZvciBjb21tYW5kIGNvbXBsZXRpb24gKi8gCisJd2hpbGUgKHJlYWRfcmVnKGluZm8sICh1bnNpZ25lZCBjaGFyKShjaGFubmVsK1NUQVIpKSAmIEJJVDIpIHsKKwkJdWRlbGF5KDEpOworCQlpZiAoaSsrID09IDEwMDApCisJCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBpc3N1ZV9jb21tYW5kKE1HU0xQQ19JTkZPICppbmZvLCB1bnNpZ25lZCBjaGFyIGNoYW5uZWwsIHVuc2lnbmVkIGNoYXIgY21kKSAKK3sKKwl3YWl0X2NvbW1hbmRfY29tcGxldGUoaW5mbywgY2hhbm5lbCk7CisJd3JpdGVfcmVnKGluZm8sICh1bnNpZ25lZCBjaGFyKSAoY2hhbm5lbCArIENNRFIpLCBjbWQpOworfQorCitzdGF0aWMgdm9pZCB0eF9wYXVzZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAidHhfcGF1c2UiKSkKKwkJcmV0dXJuOworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoInR4X3BhdXNlKCVzKVxuIixpbmZvLT5kZXZpY2VfbmFtZSk7CQorCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaWYgKGluZm8tPnR4X2VuYWJsZWQpCisJIAl0eF9zdG9wKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB0eF9yZWxlYXNlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKG1nc2xwY19wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJ0eF9yZWxlYXNlIikpCisJCXJldHVybjsKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJ0eF9yZWxlYXNlKCVzKVxuIixpbmZvLT5kZXZpY2VfbmFtZSk7CQorCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaWYgKCFpbmZvLT50eF9lbmFibGVkKQorCSAJdHhfc3RhcnQoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7Cit9CisKKy8qIFJldHVybiBuZXh0IGJvdHRvbSBoYWxmIGFjdGlvbiB0byBwZXJmb3JtLgorICogb3IgMCBpZiBub3RoaW5nIHRvIGRvLgorICovCitzdGF0aWMgaW50IGJoX2FjdGlvbihNR1NMUENfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IDA7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJaWYgKGluZm8tPnBlbmRpbmdfYmggJiBCSF9SRUNFSVZFKSB7CisJCWluZm8tPnBlbmRpbmdfYmggJj0gfkJIX1JFQ0VJVkU7CisJCXJjID0gQkhfUkVDRUlWRTsKKwl9IGVsc2UgaWYgKGluZm8tPnBlbmRpbmdfYmggJiBCSF9UUkFOU01JVCkgeworCQlpbmZvLT5wZW5kaW5nX2JoICY9IH5CSF9UUkFOU01JVDsKKwkJcmMgPSBCSF9UUkFOU01JVDsKKwl9IGVsc2UgaWYgKGluZm8tPnBlbmRpbmdfYmggJiBCSF9TVEFUVVMpIHsKKwkJaW5mby0+cGVuZGluZ19iaCAmPSB+QkhfU1RBVFVTOworCQlyYyA9IEJIX1NUQVRVUzsKKwl9CisKKwlpZiAoIXJjKSB7CisJCS8qIE1hcmsgQkggcm91dGluZSBhcyBjb21wbGV0ZSAqLworCQlpbmZvLT5iaF9ydW5uaW5nICAgPSAwOworCQlpbmZvLT5iaF9yZXF1ZXN0ZWQgPSAwOworCX0KKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgYmhfaGFuZGxlcih2b2lkKiBDb250ZXh0KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPKilDb250ZXh0OworCWludCBhY3Rpb247CisKKwlpZiAoIWluZm8pCisJCXJldHVybjsKKwkJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0JIKQorCQlwcmludGsoICIlcyglZCk6YmhfaGFuZGxlciglcykgZW50cnlcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCisJaW5mby0+YmhfcnVubmluZyA9IDE7CisKKwl3aGlsZSgoYWN0aW9uID0gYmhfYWN0aW9uKGluZm8pKSAhPSAwKSB7CisJCisJCS8qIFByb2Nlc3Mgd29yayBpdGVtICovCisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkggKQorCQkJcHJpbnRrKCAiJXMoJWQpOmJoX2hhbmRsZXIoKSB3b3JrIGl0ZW0gYWN0aW9uPSVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGFjdGlvbik7CisKKwkJc3dpdGNoIChhY3Rpb24pIHsKKwkJCisJCWNhc2UgQkhfUkVDRUlWRToKKwkJCXdoaWxlKHJ4X2dldF9mcmFtZShpbmZvKSk7CisJCQlicmVhazsKKwkJY2FzZSBCSF9UUkFOU01JVDoKKwkJCWJoX3RyYW5zbWl0KGluZm8pOworCQkJYnJlYWs7CisJCWNhc2UgQkhfU1RBVFVTOgorCQkJYmhfc3RhdHVzKGluZm8pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiB1bmtub3duIHdvcmsgaXRlbSBJRCAqLworCQkJcHJpbnRrKCJVbmtub3duIHdvcmsgaXRlbSBJRD0lMDhYIVxuIiwgYWN0aW9uKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0JIKQorCQlwcmludGsoICIlcyglZCk6YmhfaGFuZGxlciglcykgZXhpdFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKK30KKwordm9pZCBiaF90cmFuc21pdChNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCkKKwkJcHJpbnRrKCJiaF90cmFuc21pdCgpIGVudHJ5IG9uICVzXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwlpZiAodHR5KSB7CisJCXR0eV93YWtldXAodHR5KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCX0KK30KKwordm9pZCBiaF9zdGF0dXMoTUdTTFBDX0lORk8gKmluZm8pCit7CisJaW5mby0+cmlfY2hrY291bnQgPSAwOworCWluZm8tPmRzcl9jaGtjb3VudCA9IDA7CisJaW5mby0+ZGNkX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5jdHNfY2hrY291bnQgPSAwOworfQorCisvKiBlb206IG5vbi16ZXJvID0gZW5kIG9mIGZyYW1lICovIAorc3RhdGljIHZvaWQgcnhfcmVhZHlfaGRsYyhNR1NMUENfSU5GTyAqaW5mbywgaW50IGVvbSkKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMl07CisJdW5zaWduZWQgY2hhciBmaWZvX2NvdW50LCByZWFkX2NvdW50LCBpOworCVJYQlVGICpidWYgPSAoUlhCVUYqKShpbmZvLT5yeF9idWYgKyAoaW5mby0+cnhfcHV0ICogaW5mby0+cnhfYnVmX3NpemUpKTsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCXByaW50aygiJXMoJWQpOnJ4X3JlYWR5X2hkbGMoZW9tPSVkKVxuIixfX0ZJTEVfXyxfX0xJTkVfXyxlb20pOworCQorCWlmICghaW5mby0+cnhfZW5hYmxlZCkKKwkJcmV0dXJuOworCisJaWYgKGluZm8tPnJ4X2ZyYW1lX2NvdW50ID49IGluZm8tPnJ4X2J1Zl9jb3VudCkgeworCQkvKiBubyBtb3JlIGZyZWUgYnVmZmVycyAqLworCQlpc3N1ZV9jb21tYW5kKGluZm8sIENIQSwgQ01EX1JYUkVTRVQpOworCQlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1JFQ0VJVkU7CisJCWluZm8tPnJ4X292ZXJmbG93ID0gMTsKKwkJaW5mby0+aWNvdW50LmJ1Zl9vdmVycnVuKys7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZW9tKSB7CisJCS8qIGVuZCBvZiBmcmFtZSwgZ2V0IEZJRk8gY291bnQgZnJvbSBSQkNMIHJlZ2lzdGVyICovIAorCQlpZiAoIShmaWZvX2NvdW50ID0gKHVuc2lnbmVkIGNoYXIpKHJlYWRfcmVnKGluZm8sIENIQStSQkNMKSAmIDB4MWYpKSkKKwkJCWZpZm9fY291bnQgPSAzMjsKKwl9IGVsc2UKKwkJZmlmb19jb3VudCA9IDMyOworCQorCWRvIHsKKwkJaWYgKGZpZm9fY291bnQgPT0gMSkgeworCQkJcmVhZF9jb3VudCA9IDE7CisJCQlkYXRhWzBdID0gcmVhZF9yZWcoaW5mbywgQ0hBICsgUlhGSUZPKTsKKwkJfSBlbHNlIHsKKwkJCXJlYWRfY291bnQgPSAyOworCQkJKigodW5zaWduZWQgc2hvcnQgKikgZGF0YSkgPSByZWFkX3JlZzE2KGluZm8sIENIQSArIFJYRklGTyk7CisJCX0KKwkJZmlmb19jb3VudCAtPSByZWFkX2NvdW50OworCQlpZiAoIWZpZm9fY291bnQgJiYgZW9tKQorCQkJYnVmLT5zdGF0dXMgPSBkYXRhWy0tcmVhZF9jb3VudF07CisKKwkJZm9yIChpID0gMDsgaSA8IHJlYWRfY291bnQ7IGkrKykgeworCQkJaWYgKGJ1Zi0+Y291bnQgPj0gaW5mby0+bWF4X2ZyYW1lX3NpemUpIHsKKwkJCQkvKiBmcmFtZSB0b28gbGFyZ2UsIHJlc2V0IHJlY2VpdmVyIGFuZCByZXNldCBjdXJyZW50IGJ1ZmZlciAqLworCQkJCWlzc3VlX2NvbW1hbmQoaW5mbywgQ0hBLCBDTURfUlhSRVNFVCk7CisJCQkJYnVmLT5jb3VudCA9IDA7CisJCQkJcmV0dXJuOworCQkJfQorCQkJKihidWYtPmRhdGEgKyBidWYtPmNvdW50KSA9IGRhdGFbaV07CisJCQlidWYtPmNvdW50Kys7CisJCX0KKwl9IHdoaWxlIChmaWZvX2NvdW50KTsKKworCWlmIChlb20pIHsKKwkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9SRUNFSVZFOworCQlpbmZvLT5yeF9mcmFtZV9jb3VudCsrOworCQlpbmZvLT5yeF9wdXQrKzsKKwkJaWYgKGluZm8tPnJ4X3B1dCA+PSBpbmZvLT5yeF9idWZfY291bnQpCisJCQlpbmZvLT5yeF9wdXQgPSAwOworCX0KKwlpc3N1ZV9jb21tYW5kKGluZm8sIENIQSwgQ01EX1JYRklGTyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ4X3JlYWR5X2FzeW5jKE1HU0xQQ19JTkZPICppbmZvLCBpbnQgdGNkKQoreworCXVuc2lnbmVkIGNoYXIgZGF0YSwgc3RhdHVzOworCWludCBmaWZvX2NvdW50OworIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworIAlzdHJ1Y3QgbWdzbF9pY291bnQgKmljb3VudCA9ICZpbmZvLT5pY291bnQ7CisKKwlpZiAodGNkKSB7CisJCS8qIGVhcmx5IHRlcm1pbmF0aW9uLCBnZXQgRklGTyBjb3VudCBmcm9tIFJCQ0wgcmVnaXN0ZXIgKi8gCisJCWZpZm9fY291bnQgPSAodW5zaWduZWQgY2hhcikocmVhZF9yZWcoaW5mbywgQ0hBK1JCQ0wpICYgMHgxZik7CisKKwkJLyogWmVybyBmaWZvIGNvdW50IGNvdWxkIG1lYW4gMCBvciAzMiBieXRlcyBhdmFpbGFibGUuCisJCSAqIElmIEJJVDUgb2YgU1RBUiBpcyBzZXQgdGhlbiBhdCBsZWFzdCAxIGJ5dGUgaXMgYXZhaWxhYmxlLgorCQkgKi8KKwkJaWYgKCFmaWZvX2NvdW50ICYmIChyZWFkX3JlZyhpbmZvLENIQStTVEFSKSAmIEJJVDUpKQorCQkJZmlmb19jb3VudCA9IDMyOworCX0gZWxzZQorCQlmaWZvX2NvdW50ID0gMzI7CisJCisJLyogRmx1c2ggcmVjZWl2ZWQgYXN5bmMgZGF0YSB0byByZWNlaXZlIGRhdGEgYnVmZmVyLiAqLyAKKwl3aGlsZSAoZmlmb19jb3VudCkgeworCQlkYXRhICAgPSByZWFkX3JlZyhpbmZvLCBDSEEgKyBSWEZJRk8pOworCQlzdGF0dXMgPSByZWFkX3JlZyhpbmZvLCBDSEEgKyBSWEZJRk8pOworCQlmaWZvX2NvdW50IC09IDI7CisKKwkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQorCQkJYnJlYWs7CisJCQkKKwkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBkYXRhOworCQlpY291bnQtPnJ4Kys7CisJCQorCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IDA7CisKKwkJLy8gaWYgbm8gZnJhbWVpbmcvY3JjIGVycm9yIHRoZW4gc2F2ZSBkYXRhCisJCS8vIEJJVDc6cGFyaXR5IGVycm9yCisJCS8vIEJJVDY6ZnJhbWluZyBlcnJvcgorCisJCWlmIChzdGF0dXMgJiAoQklUNyArIEJJVDYpKSB7CisJCQlpZiAoc3RhdHVzICYgQklUNykgCisJCQkJaWNvdW50LT5wYXJpdHkrKzsKKwkJCWVsc2UKKwkJCQlpY291bnQtPmZyYW1lKys7CisKKwkJCS8qIGRpc2NhcmQgY2hhciBpZiB0dHkgY29udHJvbCBmbGFncyBzYXkgc28gKi8KKwkJCWlmIChzdGF0dXMgJiBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2spCisJCQkJY29udGludWU7CisJCQkJCisJCQlzdGF0dXMgJj0gaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKKworCQkJaWYgKHN0YXR1cyAmIEJJVDcpCisJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfUEFSSVRZOworCQkJZWxzZSBpZiAoc3RhdHVzICYgQklUNikKKwkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9GUkFNRTsKKwkJfQorCQkKKwkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOworCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7CisJCXR0eS0+ZmxpcC5jb3VudCsrOworCX0KKwlpc3N1ZV9jb21tYW5kKGluZm8sIENIQSwgQ01EX1JYRklGTyk7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKSB7CisJCXByaW50aygiJXMoJWQpOnJ4X3JlYWR5X2FzeW5jIGNvdW50PSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sdHR5LT5mbGlwLmNvdW50KTsKKwkJcHJpbnRrKCIlcyglZCk6cng9JWQgYnJrPSVkIHBhcml0eT0lZCBmcmFtZT0lZCBvdmVycnVuPSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saWNvdW50LT5yeCxpY291bnQtPmJyaywKKwkJCWljb3VudC0+cGFyaXR5LGljb3VudC0+ZnJhbWUsaWNvdW50LT5vdmVycnVuKTsKKwl9CisJCQkKKwlpZiAodHR5LT5mbGlwLmNvdW50KQorCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworfQorCisKK3N0YXRpYyB2b2lkIHR4X2RvbmUoTUdTTFBDX0lORk8gKmluZm8pCit7CisJaWYgKCFpbmZvLT50eF9hY3RpdmUpCisJCXJldHVybjsKKwkJCQorCWluZm8tPnR4X2FjdGl2ZSA9IDA7CisJaW5mby0+dHhfYWJvcnRpbmcgPSAwOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9BU1lOQykKKwkJcmV0dXJuOworCisJaW5mby0+dHhfY291bnQgPSBpbmZvLT50eF9wdXQgPSBpbmZvLT50eF9nZXQgPSAwOworCWRlbF90aW1lcigmaW5mby0+dHhfdGltZXIpOwkKKwkKKwlpZiAoaW5mby0+ZHJvcF9ydHNfb25fdHhfZG9uZSkgeworCQlnZXRfc2lnbmFscyhpbmZvKTsKKwkJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykgeworCQkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gflNlcmlhbFNpZ25hbF9SVFM7CisJCQlzZXRfc2lnbmFscyhpbmZvKTsKKwkJfQorCQlpbmZvLT5kcm9wX3J0c19vbl90eF9kb25lID0gMDsKKwl9CisKKyNpZmRlZiBDT05GSUdfSERMQworCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJaGRsY2Rldl90eF9kb25lKGluZm8pOworCWVsc2UgCisjZW5kaWYKKwl7CisJCWlmIChpbmZvLT50dHktPnN0b3BwZWQgfHwgaW5mby0+dHR5LT5od19zdG9wcGVkKSB7CisJCQl0eF9zdG9wKGluZm8pOworCQkJcmV0dXJuOworCQl9CisJCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfVFJBTlNNSVQ7CisJfQorfQorCitzdGF0aWMgdm9pZCB0eF9yZWFkeShNR1NMUENfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIGZpZm9fY291bnQgPSAzMjsKKwlpbnQgYzsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCXByaW50aygiJXMoJWQpOnR4X3JlYWR5KCVzKVxuIiwgX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCWlmICghaW5mby0+dHhfYWN0aXZlKQorCQkJcmV0dXJuOworCX0gZWxzZSB7CisJCWlmIChpbmZvLT50dHktPnN0b3BwZWQgfHwgaW5mby0+dHR5LT5od19zdG9wcGVkKSB7CisJCQl0eF9zdG9wKGluZm8pOworCQkJcmV0dXJuOworCQl9CisJCWlmICghaW5mby0+dHhfY291bnQpCisJCQlpbmZvLT50eF9hY3RpdmUgPSAwOworCX0KKworCWlmICghaW5mby0+dHhfY291bnQpCisJCXJldHVybjsKKworCXdoaWxlIChpbmZvLT50eF9jb3VudCAmJiBmaWZvX2NvdW50KSB7CisJCWMgPSBtaW4oMiwgbWluX3QoaW50LCBmaWZvX2NvdW50LCBtaW4oaW5mby0+dHhfY291bnQsIFRYQlVGU0laRSAtIGluZm8tPnR4X2dldCkpKTsKKwkJCisJCWlmIChjID09IDEpIHsKKwkJCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBUWEZJRk8sICooaW5mby0+dHhfYnVmICsgaW5mby0+dHhfZ2V0KSk7CisJCX0gZWxzZSB7CisJCQl3cml0ZV9yZWcxNihpbmZvLCBDSEEgKyBUWEZJRk8sCisJCQkJCSAgKigodW5zaWduZWQgc2hvcnQqKShpbmZvLT50eF9idWYgKyBpbmZvLT50eF9nZXQpKSk7CisJCX0KKwkJaW5mby0+dHhfY291bnQgLT0gYzsKKwkJaW5mby0+dHhfZ2V0ID0gKGluZm8tPnR4X2dldCArIGMpICYgKFRYQlVGU0laRSAtIDEpOworCQlmaWZvX2NvdW50IC09IGM7CisJfQorCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9BU1lOQykgeworCQlpZiAoaW5mby0+dHhfY291bnQgPCBXQUtFVVBfQ0hBUlMpCisJCQlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1RSQU5TTUlUOworCQlpc3N1ZV9jb21tYW5kKGluZm8sIENIQSwgQ01EX1RYRklGTyk7CisJfSBlbHNlIHsKKwkJaWYgKGluZm8tPnR4X2NvdW50KQorCQkJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9UWEZJRk8pOworCQllbHNlCisJCQlpc3N1ZV9jb21tYW5kKGluZm8sIENIQSwgQ01EX1RYRklGTyArIENNRF9UWEVPTSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjdHNfY2hhbmdlKE1HU0xQQ19JTkZPICppbmZvKQoreworCWdldF9zaWduYWxzKGluZm8pOworCWlmICgoaW5mby0+Y3RzX2Noa2NvdW50KSsrID49IElPX1BJTl9TSFVURE9XTl9MSU1JVCkKKwkJaXJxX2Rpc2FibGUoaW5mbywgQ0hCLCBJUlFfQ1RTKTsKKwlpbmZvLT5pY291bnQuY3RzKys7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0NUUykKKwkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5jdHNfdXArKzsKKwllbHNlCisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuY3RzX2Rvd24rKzsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NUU19GTE9XKSB7CisJCWlmIChpbmZvLT50dHktPmh3X3N0b3BwZWQpIHsKKwkJCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9DVFMpIHsKKwkJCQlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQkJCQlwcmludGsoIkNUUyB0eCBzdGFydC4uLiIpOworCQkJCWlmIChpbmZvLT50dHkpCisJCQkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCQkJdHhfc3RhcnQoaW5mbyk7CisJCQkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9UUkFOU01JVDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIShpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9DVFMpKSB7CisJCQkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKKwkJCQkJcHJpbnRrKCJDVFMgdHggc3RvcC4uLiIpOworCQkJCWlmIChpbmZvLT50dHkpCisJCQkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQkJdHhfc3RvcChpbmZvKTsKKwkJCX0KKwkJfQorCX0KKwlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1NUQVRVUzsKK30KKworc3RhdGljIHZvaWQgZGNkX2NoYW5nZShNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlnZXRfc2lnbmFscyhpbmZvKTsKKwlpZiAoKGluZm8tPmRjZF9jaGtjb3VudCkrKyA+PSBJT19QSU5fU0hVVERPV05fTElNSVQpCisJCWlycV9kaXNhYmxlKGluZm8sIENIQiwgSVJRX0RDRCk7CisJaW5mby0+aWNvdW50LmRjZCsrOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpIHsKKwkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kY2RfdXArKzsKKwl9CisJZWxzZQorCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmRjZF9kb3duKys7CisjaWZkZWYgQ09ORklHX0hETEMKKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCWhkbGNfc2V0X2NhcnJpZXIoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENELCBpbmZvLT5uZXRkZXYpOworI2VuZGlmCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgeworCQlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQkJcHJpbnRrKCIlcyBDRCBub3cgJXMuLi4iLCBpbmZvLT5kZXZpY2VfbmFtZSwKKwkJCSAgICAgICAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKSA/ICJvbiIgOiAib2ZmIik7CisJCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJCWVsc2UgeworCQkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKKwkJCQlwcmludGsoImRvaW5nIHNlcmlhbCBoYW5ndXAuLi4iKTsKKwkJCWlmIChpbmZvLT50dHkpCisJCQkJdHR5X2hhbmd1cChpbmZvLT50dHkpOworCQl9CisJfQorCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfU1RBVFVTOworfQorCitzdGF0aWMgdm9pZCBkc3JfY2hhbmdlKE1HU0xQQ19JTkZPICppbmZvKQoreworCWdldF9zaWduYWxzKGluZm8pOworCWlmICgoaW5mby0+ZHNyX2Noa2NvdW50KSsrID49IElPX1BJTl9TSFVURE9XTl9MSU1JVCkKKwkJcG9ydF9pcnFfZGlzYWJsZShpbmZvLCBQVlJfRFNSKTsKKwlpbmZvLT5pY291bnQuZHNyKys7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RTUikKKwkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kc3JfdXArKzsKKwllbHNlCisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuZHNyX2Rvd24rKzsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKwlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1NUQVRVUzsKK30KKworc3RhdGljIHZvaWQgcmlfY2hhbmdlKE1HU0xQQ19JTkZPICppbmZvKQoreworCWdldF9zaWduYWxzKGluZm8pOworCWlmICgoaW5mby0+cmlfY2hrY291bnQpKysgPj0gSU9fUElOX1NIVVRET1dOX0xJTUlUKQorCQlwb3J0X2lycV9kaXNhYmxlKGluZm8sIFBWUl9SSSk7CisJaW5mby0+aWNvdW50LnJuZysrOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SSSkKKwkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5yaV91cCsrOworCWVsc2UKKwkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5yaV9kb3duKys7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9TVEFUVVM7Cit9CisKKy8qIEludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZW50cnkgcG9pbnQuCisgKiAJCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIGlycSAgICAgaW50ZXJydXB0IG51bWJlciB0aGF0IGNhdXNlZCBpbnRlcnJ1cHQKKyAqIGRldl9pZCAgZGV2aWNlIElEIHN1cHBsaWVkIGR1cmluZyBpbnRlcnJ1cHQgcmVnaXN0cmF0aW9uCisgKiByZWdzICAgIGludGVycnVwdGVkIHByb2Nlc3NvciBjb250ZXh0CisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBtZ3NscGNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCU1HU0xQQ19JTkZPICogaW5mbyA9IChNR1NMUENfSU5GTyAqKWRldl9pZDsKKwl1bnNpZ25lZCBzaG9ydCBpc3I7CisJdW5zaWduZWQgY2hhciBnaXMsIHBpczsKKwlpbnQgY291bnQ9MDsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCQorCQlwcmludGsoIm1nc2xwY19pc3IoJWQpIGVudHJ5LlxuIiwgaXJxKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiBJUlFfTk9ORTsKKwkJCisJaWYgKCEoaW5mby0+bGluay5zdGF0ZSAmIERFVl9DT05GSUcpKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlzcGluX2xvY2soJmluZm8tPmxvY2spOworCisJd2hpbGUgKChnaXMgPSByZWFkX3JlZyhpbmZvLCBDSEEgKyBHSVMpKSkgeworCQlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQkKKwkJCXByaW50aygibWdzbHBjX2lzciAlcyBnaXM9JTA0WFxuIiwgaW5mby0+ZGV2aWNlX25hbWUsZ2lzKTsKKworCQlpZiAoKGdpcyAmIDB4NzApIHx8IGNvdW50ID4gMTAwMCkgeworCQkJcHJpbnRrKCJzeW5jbGlua19jczpoYXJkd2FyZSBmYWlsZWQgb3IgZWplY3RlZFxuIik7CisJCQlicmVhazsKKwkJfQorCQljb3VudCsrOworCisJCWlmIChnaXMgJiAoQklUMSArIEJJVDApKSB7CisJCQlpc3IgPSByZWFkX3JlZzE2KGluZm8sIENIQiArIElTUik7CisJCQlpZiAoaXNyICYgSVJRX0RDRCkKKwkJCQlkY2RfY2hhbmdlKGluZm8pOworCQkJaWYgKGlzciAmIElSUV9DVFMpCisJCQkJY3RzX2NoYW5nZShpbmZvKTsKKwkJfQorCQlpZiAoZ2lzICYgKEJJVDMgKyBCSVQyKSkKKwkJeworCQkJaXNyID0gcmVhZF9yZWcxNihpbmZvLCBDSEEgKyBJU1IpOworCQkJaWYgKGlzciAmIElSUV9USU1FUikgeworCQkJCWluZm8tPmlycV9vY2N1cnJlZCA9IDE7CisJCQkJaXJxX2Rpc2FibGUoaW5mbywgQ0hBLCBJUlFfVElNRVIpOworCQkJfQorCisJCQkvKiByZWNlaXZlIElSUXMgKi8gCisJCQlpZiAoaXNyICYgSVJRX0VYSVRIVU5UKSB7CisJCQkJaW5mby0+aWNvdW50LmV4aXRodW50Kys7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5ldmVudF93YWl0X3EpOworCQkJfQorCQkJaWYgKGlzciAmIElSUV9CUkVBS19PTikgeworCQkJCWluZm8tPmljb3VudC5icmsrKzsKKwkJCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQkJCWRvX1NBSyhpbmZvLT50dHkpOworCQkJfQorCQkJaWYgKGlzciAmIElSUV9SWFRJTUUpIHsKKwkJCQlpc3N1ZV9jb21tYW5kKGluZm8sIENIQSwgQ01EX1JYRklGT19SRUFEKTsKKwkJCX0KKwkJCWlmIChpc3IgJiAoSVJRX1JYRU9NICsgSVJRX1JYRklGTykpIHsKKwkJCQlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpCisJCQkJCXJ4X3JlYWR5X2hkbGMoaW5mbywgaXNyICYgSVJRX1JYRU9NKTsgCisJCQkJZWxzZQorCQkJCQlyeF9yZWFkeV9hc3luYyhpbmZvLCBpc3IgJiBJUlFfUlhFT00pOworCQkJfQorCisJCQkvKiB0cmFuc21pdCBJUlFzICovIAorCQkJaWYgKGlzciAmIElSUV9VTkRFUlJVTikgeworCQkJCWlmIChpbmZvLT50eF9hYm9ydGluZykKKwkJCQkJaW5mby0+aWNvdW50LnR4YWJvcnQrKzsKKwkJCQllbHNlCisJCQkJCWluZm8tPmljb3VudC50eHVuZGVyKys7CisJCQkJdHhfZG9uZShpbmZvKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGlzciAmIElSUV9BTExTRU5UKSB7CisJCQkJaW5mby0+aWNvdW50LnR4b2srKzsKKwkJCQl0eF9kb25lKGluZm8pOworCQkJfQorCQkJZWxzZSBpZiAoaXNyICYgSVJRX1RYRklGTykKKwkJCQl0eF9yZWFkeShpbmZvKTsKKwkJfQorCQlpZiAoZ2lzICYgQklUNykgeworCQkJcGlzID0gcmVhZF9yZWcoaW5mbywgQ0hBICsgUElTKTsKKwkJCWlmIChwaXMgJiBCSVQxKQorCQkJCWRzcl9jaGFuZ2UoaW5mbyk7CisJCQlpZiAocGlzICYgQklUMikKKwkJCQlyaV9jaGFuZ2UoaW5mbyk7CisJCX0KKwl9CisJCisJLyogUmVxdWVzdCBib3R0b20gaGFsZiBwcm9jZXNzaW5nIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIAorCSAqIGZvciBpdCB0byBkbyBhbmQgdGhlIGJoIGlzIG5vdCBhbHJlYWR5IHJ1bm5pbmcKKwkgKi8KKworCWlmIChpbmZvLT5wZW5kaW5nX2JoICYmICFpbmZvLT5iaF9ydW5uaW5nICYmICFpbmZvLT5iaF9yZXF1ZXN0ZWQpIHsKKwkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQkKKwkJCXByaW50aygiJXMoJWQpOiVzIHF1ZXVlaW5nIGJoIHRhc2suXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJc2NoZWR1bGVfd29yaygmaW5mby0+dGFzayk7CisJCWluZm8tPmJoX3JlcXVlc3RlZCA9IDE7CisJfQorCisJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfaXNyKCVkKWV4aXQuXG4iLAorCQkgICAgICAgX19GSUxFX18sX19MSU5FX18saXJxKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogSW5pdGlhbGl6ZSBhbmQgc3RhcnQgZGV2aWNlLgorICovCitzdGF0aWMgaW50IHN0YXJ0dXAoTUdTTFBDX0lORk8gKiBpbmZvKQoreworCWludCByZXR2YWwgPSAwOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTpzdGFydHVwKCVzKVxuIixfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCQorCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKQorCQlyZXR1cm4gMDsKKwkKKwlpZiAoIWluZm8tPnR4X2J1ZikgeworCQkvKiBhbGxvY2F0ZSBhIHBhZ2Ugb2YgbWVtb3J5IGZvciBhIHRyYW5zbWl0IGJ1ZmZlciAqLworCQlpbmZvLT50eF9idWYgPSAodW5zaWduZWQgY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFpbmZvLT50eF9idWYpIHsKKwkJCXByaW50ayhLRVJOX0VSUiIlcyglZCk6JXMgY2FuJ3QgYWxsb2NhdGUgdHJhbnNtaXQgYnVmZmVyXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJaW5mby0+cGVuZGluZ19iaCA9IDA7CisJCisJaW5pdF90aW1lcigmaW5mby0+dHhfdGltZXIpOworCWluZm8tPnR4X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbmZvOworCWluZm8tPnR4X3RpbWVyLmZ1bmN0aW9uID0gdHhfdGltZW91dDsKKworCS8qIEFsbG9jYXRlIGFuZCBjbGFpbSBhZGFwdGVyIHJlc291cmNlcyAqLworCXJldHZhbCA9IGNsYWltX3Jlc291cmNlcyhpbmZvKTsKKwkKKwkvKiBwZXJmb3JtIGV4aXN0YW5jZSBjaGVjayBhbmQgZGlhZ25vc3RpY3MgKi8KKwlpZiAoICFyZXR2YWwgKQorCQlyZXR2YWwgPSBhZGFwdGVyX3Rlc3QoaW5mbyk7CisJCQorCWlmICggcmV0dmFsICkgeworICAJCWlmIChjYXBhYmxlKENBUF9TWVNfQURNSU4pICYmIGluZm8tPnR0eSkKKwkJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJCXJlbGVhc2VfcmVzb3VyY2VzKGluZm8pOworICAJCXJldHVybiByZXR2YWw7CisgIAl9CisKKwkvKiBwcm9ncmFtIGhhcmR3YXJlIGZvciBjdXJyZW50IHBhcmFtZXRlcnMgKi8KKwltZ3NscGNfY2hhbmdlX3BhcmFtcyhpbmZvKTsKKwkKKwlpZiAoaW5mby0+dHR5KQorCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIGJ5IG1nc2xwY19jbG9zZSgpIGFuZCBtZ3NscGNfaGFuZ3VwKCkgdG8gc2h1dGRvd24gaGFyZHdhcmUKKyAqLworc3RhdGljIHZvaWQgc2h1dGRvd24oTUdTTFBDX0lORk8gKiBpbmZvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCXJldHVybjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfc2h1dGRvd24oJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCisJLyogY2xlYXIgc3RhdHVzIHdhaXQgcXVldWUgYmVjYXVzZSBzdGF0dXMgY2hhbmdlcyAqLworCS8qIGNhbid0IGhhcHBlbiBhZnRlciBzaHV0dGluZyBkb3duIHRoZSBoYXJkd2FyZSAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5ldmVudF93YWl0X3EpOworCisJZGVsX3RpbWVyKCZpbmZvLT50eF90aW1lcik7CQorCisJaWYgKGluZm8tPnR4X2J1ZikgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGluZm8tPnR4X2J1Zik7CisJCWluZm8tPnR4X2J1ZiA9IE5VTEw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJcnhfc3RvcChpbmZvKTsKKwl0eF9zdG9wKGluZm8pOworCisJLyogVE9ETzpkaXNhYmxlIGludGVycnVwdHMgaW5zdGVhZCBvZiByZXNldCB0byBwcmVzZXJ2ZSBzaWduYWwgc3RhdGVzICovCisJcmVzZXRfZGV2aWNlKGluZm8pOworCQorIAlpZiAoIWluZm8tPnR0eSB8fCBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkgeworIAkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gfihTZXJpYWxTaWduYWxfRFRSICsgU2VyaWFsU2lnbmFsX1JUUyk7CisJCXNldF9zaWduYWxzKGluZm8pOworCX0KKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXJlbGVhc2VfcmVzb3VyY2VzKGluZm8pOwkKKwkKKwlpZiAoaW5mby0+dHR5KQorCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworfQorCitzdGF0aWMgdm9pZCBtZ3NscGNfcHJvZ3JhbV9odyhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQorCXJ4X3N0b3AoaW5mbyk7CisJdHhfc3RvcChpbmZvKTsKKwlpbmZvLT50eF9jb3VudCA9IGluZm8tPnR4X3B1dCA9IGluZm8tPnR4X2dldCA9IDA7CisJCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDIHx8IGluZm8tPm5ldGNvdW50KQorCQloZGxjX21vZGUoaW5mbyk7CisJZWxzZQorCQlhc3luY19tb2RlKGluZm8pOworCQkKKwlzZXRfc2lnbmFscyhpbmZvKTsKKwkKKwlpbmZvLT5kY2RfY2hrY291bnQgPSAwOworCWluZm8tPmN0c19jaGtjb3VudCA9IDA7CisJaW5mby0+cmlfY2hrY291bnQgPSAwOworCWluZm8tPmRzcl9jaGtjb3VudCA9IDA7CisKKwlpcnFfZW5hYmxlKGluZm8sIENIQiwgSVJRX0RDRCB8IElSUV9DVFMpOworCXBvcnRfaXJxX2VuYWJsZShpbmZvLCAodW5zaWduZWQgY2hhcikgUFZSX0RTUiB8IFBWUl9SSSk7CisJZ2V0X3NpZ25hbHMoaW5mbyk7CisJCQorCWlmIChpbmZvLT5uZXRjb3VudCB8fCBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUkVBRCkKKwkJcnhfc3RhcnQoaW5mbyk7CisJCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworfQorCisvKiBSZWNvbmZpZ3VyZSBhZGFwdGVyIGJhc2VkIG9uIG5ldyBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xwY19jaGFuZ2VfcGFyYW1zKE1HU0xQQ19JTkZPICppbmZvKQoreworCXVuc2lnbmVkIGNmbGFnOworCWludCBiaXRzX3Blcl9jaGFyOworCisJaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKKwkJcmV0dXJuOworCQkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX2NoYW5nZV9wYXJhbXMoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJIAorCWNmbGFnID0gaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJLyogaWYgQjAgcmF0ZSAoaGFuZ3VwKSBzcGVjaWZpZWQgdGhlbiBuZWdhdGUgRFRSIGFuZCBSVFMgKi8KKwkvKiBvdGhlcndpc2UgYXNzZXJ0IERUUiBhbmQgUlRTICovCisgCWlmIChjZmxhZyAmIENCQVVEKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTICsgU2VyaWFsU2lnbmFsX0RUUjsKKwllbHNlCisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH4oU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFIpOworCQorCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisJCisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA1OyBicmVhazsKKwljYXNlIENTNjogaW5mby0+cGFyYW1zLmRhdGFfYml0cyA9IDY7IGJyZWFrOworCWNhc2UgQ1M3OiBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzID0gNzsgYnJlYWs7CisJY2FzZSBDUzg6IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA4OyBicmVhazsKKwlkZWZhdWx0OiAgaW5mby0+cGFyYW1zLmRhdGFfYml0cyA9IDc7IGJyZWFrOworCX0KKwkgICAgICAKKwlpZiAoY2ZsYWcgJiBDU1RPUEIpCisJCWluZm8tPnBhcmFtcy5zdG9wX2JpdHMgPSAyOworCWVsc2UKKwkJaW5mby0+cGFyYW1zLnN0b3BfYml0cyA9IDE7CisKKwlpbmZvLT5wYXJhbXMucGFyaXR5ID0gQVNZTkNfUEFSSVRZX05PTkU7CisJaWYgKGNmbGFnICYgUEFSRU5CKSB7CisJCWlmIChjZmxhZyAmIFBBUk9ERCkKKwkJCWluZm8tPnBhcmFtcy5wYXJpdHkgPSBBU1lOQ19QQVJJVFlfT0REOworCQllbHNlCisJCQlpbmZvLT5wYXJhbXMucGFyaXR5ID0gQVNZTkNfUEFSSVRZX0VWRU47CisjaWZkZWYgQ01TUEFSCisJCWlmIChjZmxhZyAmIENNU1BBUikKKwkJCWluZm8tPnBhcmFtcy5wYXJpdHkgPSBBU1lOQ19QQVJJVFlfU1BBQ0U7CisjZW5kaWYKKwl9CisKKwkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGppZmZpZXMgdG8gdHJhbnNtaXQgYSBmdWxsCisJICogRklGTyAoMzIgYnl0ZXMpIGF0IHNwZWNpZmllZCBkYXRhIHJhdGUKKwkgKi8KKwliaXRzX3Blcl9jaGFyID0gaW5mby0+cGFyYW1zLmRhdGFfYml0cyArIAorCQkJaW5mby0+cGFyYW1zLnN0b3BfYml0cyArIDE7CisKKwkvKiBpZiBwb3J0IGRhdGEgcmF0ZSBpcyBzZXQgdG8gNDYwODAwIG9yIGxlc3MgdGhlbgorCSAqIGFsbG93IHR0eSBzZXR0aW5ncyB0byBvdmVycmlkZSwgb3RoZXJ3aXNlIGtlZXAgdGhlCisJICogY3VycmVudCBkYXRhIHJhdGUuCisJICovCisJaWYgKGluZm8tPnBhcmFtcy5kYXRhX3JhdGUgPD0gNDYwODAwKSB7CisJCWluZm8tPnBhcmFtcy5kYXRhX3JhdGUgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpOworCX0KKwkKKwlpZiAoIGluZm8tPnBhcmFtcy5kYXRhX3JhdGUgKSB7CisJCWluZm8tPnRpbWVvdXQgPSAoMzIqSFoqYml0c19wZXJfY2hhcikgLyAKKwkJCQlpbmZvLT5wYXJhbXMuZGF0YV9yYXRlOworCX0KKwlpbmZvLT50aW1lb3V0ICs9IEhaLzUwOwkJLyogQWRkIC4wMiBzZWNvbmRzIG9mIHNsb3AgKi8KKworCWlmIChjZmxhZyAmIENSVFNDVFMpCisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCWVsc2UKKwkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NUU19GTE9XOworCQkKKwlpZiAoY2ZsYWcgJiBDTE9DQUwpCisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwllbHNlCisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCisJLyogcHJvY2VzcyB0dHkgaW5wdXQgY29udHJvbCBmbGFncyAqLworCQorCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSAwOworCWlmIChJX0lOUENLKGluZm8tPnR0eSkpCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gQklUNyB8IEJJVDY7CisJaWYgKElfSUdOUEFSKGluZm8tPnR0eSkpCisJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBCSVQ3IHwgQklUNjsKKworCW1nc2xwY19wcm9ncmFtX2h3KGluZm8pOworfQorCisvKiBBZGQgYSBjaGFyYWN0ZXIgdG8gdGhlIHRyYW5zbWl0IGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBtZ3NscGNfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlNR1NMUENfSU5GTyAqaW5mbyA9IChNR1NMUENfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKSB7CisJCXByaW50ayggIiVzKCVkKTptZ3NscGNfcHV0X2NoYXIoJWQpIG9uICVzXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sY2gsaW5mby0+ZGV2aWNlX25hbWUpOworCX0KKworCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX3B1dF9jaGFyIikpCisJCXJldHVybjsKKworCWlmICghdHR5IHx8ICFpbmZvLT50eF9idWYpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0FTWU5DIHx8ICFpbmZvLT50eF9hY3RpdmUpIHsKKwkJaWYgKGluZm8tPnR4X2NvdW50IDwgVFhCVUZTSVpFIC0gMSkgeworCQkJaW5mby0+dHhfYnVmW2luZm8tPnR4X3B1dCsrXSA9IGNoOworCQkJaW5mby0+dHhfcHV0ICY9IFRYQlVGU0laRS0xOworCQkJaW5mby0+dHhfY291bnQrKzsKKwkJfQorCX0KKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKK30KKworLyogRW5hYmxlIHRyYW5zbWl0dGVyIHNvIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGluIHRoZQorICogdHJhbnNtaXQgYnVmZmVyIGFyZSBzZW50LgorICovCitzdGF0aWMgdm9pZCBtZ3NscGNfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlNR1NMUENfSU5GTyAqaW5mbyA9IChNR1NMUENfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCAiJXMoJWQpOm1nc2xwY19mbHVzaF9jaGFycygpIGVudHJ5IG9uICVzIHR4X2NvdW50PSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsaW5mby0+dHhfY291bnQpOworCQorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX2ZsdXNoX2NoYXJzIikpCisJCXJldHVybjsKKworCWlmIChpbmZvLT50eF9jb3VudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fAorCSAgICB0dHktPmh3X3N0b3BwZWQgfHwgIWluZm8tPnR4X2J1ZikKKwkJcmV0dXJuOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50ayggIiVzKCVkKTptZ3NscGNfZmx1c2hfY2hhcnMoKSBlbnRyeSBvbiAlcyBzdGFydGluZyB0cmFuc21pdHRlclxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoIWluZm8tPnR4X2FjdGl2ZSkKKwkgCXR4X3N0YXJ0KGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworfQorCisvKiBTZW5kIGEgYmxvY2sgb2YgZGF0YQorICogCQorICogQXJndW1lbnRzOgorICogCisgKiB0dHkgICAgICAgIHBvaW50ZXIgdG8gdHR5IGluZm9ybWF0aW9uIHN0cnVjdHVyZQorICogYnVmCSAgICAgIHBvaW50ZXIgdG8gYnVmZmVyIGNvbnRhaW5pbmcgc2VuZCBkYXRhCisgKiBjb3VudCAgICAgIHNpemUgb2Ygc2VuZCBkYXRhIGluIGJ5dGVzCisgKiAJCisgKiBSZXR1cm5zOiBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuCisgKi8KK3N0YXRpYyBpbnQgbWdzbHBjX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50IGMsIHJldCA9IDA7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50ayggIiVzKCVkKTptZ3NscGNfd3JpdGUoJXMpIGNvdW50PSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsY291bnQpOworCQorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX3dyaXRlIikgfHwKKwkgICAgIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpIHsKKwkJaWYgKGNvdW50ID4gVFhCVUZTSVpFKSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCWlmIChpbmZvLT50eF9hY3RpdmUpCisJCQlnb3RvIGNsZWFudXA7CisJCWVsc2UgaWYgKGluZm8tPnR4X2NvdW50KQorCQkJZ290byBzdGFydDsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWMgPSBtaW4oY291bnQsCisJCQltaW4oVFhCVUZTSVpFIC0gaW5mby0+dHhfY291bnQgLSAxLAorCQkJICAgIFRYQlVGU0laRSAtIGluZm8tPnR4X3B1dCkpOworCQlpZiAoYyA8PSAwKQorCQkJYnJlYWs7CisJCQkKKwkJbWVtY3B5KGluZm8tPnR4X2J1ZiArIGluZm8tPnR4X3B1dCwgYnVmLCBjKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWluZm8tPnR4X3B1dCA9IChpbmZvLT50eF9wdXQgKyBjKSAmIChUWEJVRlNJWkUtMSk7CisJCWluZm8tPnR4X2NvdW50ICs9IGM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJCWJ1ZiArPSBjOworCQljb3VudCAtPSBjOworCQlyZXQgKz0gYzsKKwl9CitzdGFydDoKKyAJaWYgKGluZm8tPnR4X2NvdW50ICYmICF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWlmICghaW5mby0+dHhfYWN0aXZlKQorCQkgCXR4X3N0YXJ0KGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKyAJfQorY2xlYW51cDoJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50ayggIiVzKCVkKTptZ3NscGNfd3JpdGUoJXMpIHJldHVybmluZz0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyogUmV0dXJuIHRoZSBjb3VudCBvZiBmcmVlIGJ5dGVzIGluIHRyYW5zbWl0IGJ1ZmZlcgorICovCitzdGF0aWMgaW50IG1nc2xwY193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCWludCByZXQ7CisJCQkJCisJaWYgKG1nc2xwY19wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NscGNfd3JpdGVfcm9vbSIpKQorCQlyZXR1cm4gMDsKKworCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykgeworCQkvKiBIRExDIChmcmFtZSBvcmllbnRlZCkgbW9kZSAqLworCQlpZiAoaW5mby0+dHhfYWN0aXZlKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiBIRExDX01BWF9GUkFNRV9TSVpFOworCX0gZWxzZSB7CisJCXJldCA9IFRYQlVGU0laRSAtIGluZm8tPnR4X2NvdW50IC0gMTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXQgPSAwOworCX0KKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX3dyaXRlX3Jvb20oJXMpPSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZXR1cm4gdGhlIGNvdW50IG9mIGJ5dGVzIGluIHRyYW5zbWl0IGJ1ZmZlcgorICovCitzdGF0aWMgaW50IG1nc2xwY19jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlNR1NMUENfSU5GTyAqaW5mbyA9IChNR1NMUENfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IHJjOworCQkgCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19jaGFyc19pbl9idWZmZXIoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJIAorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX2NoYXJzX2luX2J1ZmZlciIpKQorCQlyZXR1cm4gMDsKKwkJCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKQorCQlyYyA9IGluZm8tPnR4X2FjdGl2ZSA/IGluZm8tPm1heF9mcmFtZV9zaXplIDogMDsKKwllbHNlCisJCXJjID0gaW5mby0+dHhfY291bnQ7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX2NoYXJzX2luX2J1ZmZlciglcyk9JWRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCByYyk7CisJCQkgCisJcmV0dXJuIHJjOworfQorCisvKiBEaXNjYXJkIGFsbCBkYXRhIGluIHRoZSBzZW5kIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBtZ3NscGNfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19mbHVzaF9idWZmZXIoJXMpIGVudHJ5XG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX2ZsdXNoX2J1ZmZlciIpKQorCQlyZXR1cm47CisJCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsgCisJaW5mby0+dHhfY291bnQgPSBpbmZvLT50eF9wdXQgPSBpbmZvLT50eF9nZXQgPSAwOworCWRlbF90aW1lcigmaW5mby0+dHhfdGltZXIpOwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl0dHlfd2FrZXVwKHR0eSk7Cit9CisKKy8qIFNlbmQgYSBoaWdoLXByaW9yaXR5IFhPTi9YT0ZGIGNoYXJhY3RlcgorICovCitzdGF0aWMgdm9pZCBtZ3NscGNfc2VuZF94Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19zZW5kX3hjaGFyKCVzLCVkKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIGNoICk7CisJCQkgCisJaWYgKG1nc2xwY19wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NscGNfc2VuZF94Y2hhciIpKQorCQlyZXR1cm47CisKKwlpbmZvLT54X2NoYXIgPSBjaDsKKwlpZiAoY2gpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlpZiAoIWluZm8tPnR4X2VuYWJsZWQpCisJCSAJdHhfc3RhcnQoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KK30KKworLyogU2lnbmFsIHJlbW90ZSBkZXZpY2UgdG8gdGhyb3R0bGUgc2VuZCBkYXRhIChvdXIgcmVjZWl2ZSBkYXRhKQorICovCitzdGF0aWMgdm9pZCBtZ3NscGNfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY190aHJvdHRsZSglcykgZW50cnlcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY190aHJvdHRsZSIpKQorCQlyZXR1cm47CisJCisJaWYgKElfSVhPRkYodHR5KSkKKwkJbWdzbHBjX3NlbmRfeGNoYXIodHR5LCBTVE9QX0NIQVIodHR5KSk7CisgCisgCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gflNlcmlhbFNpZ25hbF9SVFM7CisJIAlzZXRfc2lnbmFscyhpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJfQorfQorCisvKiBTaWduYWwgcmVtb3RlIGRldmljZSB0byBzdG9wIHRocm90dGxpbmcgc2VuZCBkYXRhIChvdXIgcmVjZWl2ZSBkYXRhKQorICovCitzdGF0aWMgdm9pZCBtZ3NscGNfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlNR1NMUENfSU5GTyAqaW5mbyA9IChNR1NMUENfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX3VudGhyb3R0bGUoJXMpIGVudHJ5XG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCisJaWYgKG1nc2xwY19wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NscGNfdW50aHJvdHRsZSIpKQorCQlyZXR1cm47CisJCisJaWYgKElfSVhPRkYodHR5KSkgeworCQlpZiAoaW5mby0+eF9jaGFyKQorCQkJaW5mby0+eF9jaGFyID0gMDsKKwkJZWxzZQorCQkJbWdzbHBjX3NlbmRfeGNoYXIodHR5LCBTVEFSVF9DSEFSKHR0eSkpOworCX0KKwkKKyAJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTOworCSAJc2V0X3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KK30KKworLyogZ2V0IHRoZSBjdXJyZW50IHNlcmlhbCBzdGF0aXN0aWNzCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3N0YXRzKE1HU0xQQ19JTkZPICogaW5mbywgc3RydWN0IG1nc2xfaWNvdW50IF9fdXNlciAqdXNlcl9pY291bnQpCit7CisJaW50IGVycjsKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJnZXRfcGFyYW1zKCVzKVxuIiwgaW5mby0+ZGV2aWNlX25hbWUpOworCUNPUFlfVE9fVVNFUihlcnIsdXNlcl9pY291bnQsICZpbmZvLT5pY291bnQsIHNpemVvZihzdHJ1Y3QgbWdzbF9pY291bnQpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyogZ2V0IHRoZSBjdXJyZW50IHNlcmlhbCBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3BhcmFtcyhNR1NMUENfSU5GTyAqIGluZm8sIE1HU0xfUEFSQU1TIF9fdXNlciAqdXNlcl9wYXJhbXMpCit7CisJaW50IGVycjsKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJnZXRfcGFyYW1zKCVzKVxuIiwgaW5mby0+ZGV2aWNlX25hbWUpOworCUNPUFlfVE9fVVNFUihlcnIsdXNlcl9wYXJhbXMsICZpbmZvLT5wYXJhbXMsIHNpemVvZihNR1NMX1BBUkFNUykpOworCWlmIChlcnIpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKiBzZXQgdGhlIHNlcmlhbCBwYXJhbWV0ZXJzCisgKiAJCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIAlpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJbmV3X3BhcmFtcwl1c2VyIGJ1ZmZlciBjb250YWluaW5nIG5ldyBzZXJpYWwgcGFyYW1zCisgKgorICogUmV0dXJuczoJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IHNldF9wYXJhbXMoTUdTTFBDX0lORk8gKiBpbmZvLCBNR1NMX1BBUkFNUyBfX3VzZXIgKm5ld19wYXJhbXMpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTUdTTF9QQVJBTVMgdG1wX3BhcmFtczsKKwlpbnQgZXJyOworIAorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTpzZXRfcGFyYW1zICVzXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKKwkJCWluZm8tPmRldmljZV9uYW1lICk7CisJQ09QWV9GUk9NX1VTRVIoZXJyLCZ0bXBfcGFyYW1zLCBuZXdfcGFyYW1zLCBzaXplb2YoTUdTTF9QQVJBTVMpKTsKKwlpZiAoZXJyKSB7CisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCQlwcmludGsoICIlcyglZCk6c2V0X3BhcmFtcyglcykgdXNlciBidWZmZXIgY29weSBmYWlsZWRcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCW1lbWNweSgmaW5mby0+cGFyYW1zLCZ0bXBfcGFyYW1zLHNpemVvZihNR1NMX1BBUkFNUykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQorIAltZ3NscGNfY2hhbmdlX3BhcmFtcyhpbmZvKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfdHhpZGxlKE1HU0xQQ19JTkZPICogaW5mbywgaW50IF9fdXNlciAqaWRsZV9tb2RlKQoreworCWludCBlcnI7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiZ2V0X3R4aWRsZSglcyk9JWRcbiIsIGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pZGxlX21vZGUpOworCUNPUFlfVE9fVVNFUihlcnIsaWRsZV9tb2RlLCAmaW5mby0+aWRsZV9tb2RlLCBzaXplb2YoaW50KSk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3R4aWRsZShNR1NMUENfSU5GTyAqIGluZm8sIGludCBpZGxlX21vZGUpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygic2V0X3R4aWRsZSglcywlZClcbiIsIGluZm8tPmRldmljZV9uYW1lLCBpZGxlX21vZGUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpbmZvLT5pZGxlX21vZGUgPSBpZGxlX21vZGU7CisJdHhfc2V0X2lkbGUoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ludGVyZmFjZShNR1NMUENfSU5GTyAqIGluZm8sIGludCBfX3VzZXIgKmlmX21vZGUpCit7CisJaW50IGVycjsKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJnZXRfaW50ZXJmYWNlKCVzKT0lZFxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPmlmX21vZGUpOworCUNPUFlfVE9fVVNFUihlcnIsaWZfbW9kZSwgJmluZm8tPmlmX21vZGUsIHNpemVvZihpbnQpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfaW50ZXJmYWNlKE1HU0xQQ19JTkZPICogaW5mbywgaW50IGlmX21vZGUpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB2YWw7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygic2V0X2ludGVyZmFjZSglcywlZClcbiIsIGluZm8tPmRldmljZV9uYW1lLCBpZl9tb2RlKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaW5mby0+aWZfbW9kZSA9IGlmX21vZGU7CisKKwl2YWwgPSByZWFkX3JlZyhpbmZvLCBQVlIpICYgMHgwZjsKKwlzd2l0Y2ggKGluZm8tPmlmX21vZGUpCisJeworCWNhc2UgTUdTTF9JTlRFUkZBQ0VfUlMyMzI6IHZhbCB8PSBQVlJfUlMyMzI7IGJyZWFrOworCWNhc2UgTUdTTF9JTlRFUkZBQ0VfVjM1OiAgIHZhbCB8PSBQVlJfVjM1OyAgIGJyZWFrOworCWNhc2UgTUdTTF9JTlRFUkZBQ0VfUlM0MjI6IHZhbCB8PSBQVlJfUlM0MjI7IGJyZWFrOworCX0KKwl3cml0ZV9yZWcoaW5mbywgUFZSLCB2YWwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3R4ZW5hYmxlKE1HU0xQQ19JTkZPICogaW5mbywgaW50IGVuYWJsZSkKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJzZXRfdHhlbmFibGUoJXMsJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgZW5hYmxlKTsKKwkJCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoZW5hYmxlKSB7CisJCWlmICghaW5mby0+dHhfZW5hYmxlZCkKKwkJCXR4X3N0YXJ0KGluZm8pOworCX0gZWxzZSB7CisJCWlmIChpbmZvLT50eF9lbmFibGVkKQorCQkJdHhfc3RvcChpbmZvKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHhfYWJvcnQoTUdTTFBDX0lORk8gKiBpbmZvKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworIAorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoInR4X2Fib3J0KCVzKVxuIiwgaW5mby0+ZGV2aWNlX25hbWUpOworCQkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmIChpbmZvLT50eF9hY3RpdmUgJiYgaW5mby0+dHhfY291bnQgJiYKKwkgICAgaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpIHsKKwkJLyogY2xlYXIgZGF0YSBjb3VudCBzbyBGSUZPIGlzIG5vdCBmaWxsZWQgb24gbmV4dCBJUlEuCisJCSAqIFRoaXMgcmVzdWx0cyBpbiB1bmRlcnJ1biBhbmQgYWJvcnQgdHJhbnNtaXNzaW9uLgorCQkgKi8KKwkJaW5mby0+dHhfY291bnQgPSBpbmZvLT50eF9wdXQgPSBpbmZvLT50eF9nZXQgPSAwOworCQlpbmZvLT50eF9hYm9ydGluZyA9IFRSVUU7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9yeGVuYWJsZShNR1NMUENfSU5GTyAqIGluZm8sIGludCBlbmFibGUpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygic2V0X3J4ZW5hYmxlKCVzLCVkKVxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIGVuYWJsZSk7CisJCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaWYgKGVuYWJsZSkgeworCQlpZiAoIWluZm8tPnJ4X2VuYWJsZWQpCisJCQlyeF9zdGFydChpbmZvKTsKKwl9IGVsc2UgeworCQlpZiAoaW5mby0+cnhfZW5hYmxlZCkKKwkJCXJ4X3N0b3AoaW5mbyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKiB3YWl0IGZvciBzcGVjaWZpZWQgZXZlbnQgdG8gb2NjdXIKKyAqIAkKKyAqIEFyZ3VtZW50czoJIAlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIAkJCW1hc2sJcG9pbnRlciB0byBiaXRtYXNrIG9mIGV2ZW50cyB0byB3YWl0IGZvcgorICogUmV0dXJuIFZhbHVlOgkwIAlpZiBzdWNjZXNzZnVsIGFuZCBiaXQgbWFzayB1cGRhdGVkIHdpdGgKKyAqCQkJCW9mIGV2ZW50cyB0cmlnZ2VycmVkLAorICogCQkJb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCB3YWl0X2V2ZW50cyhNR1NMUENfSU5GTyAqIGluZm8sIGludCBfX3VzZXIgKm1hc2tfcHRyKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzOworCWludCByYz0wOworCXN0cnVjdCBtZ3NsX2ljb3VudCBjcHJldiwgY25vdzsKKwlpbnQgZXZlbnRzOworCWludCBtYXNrOworCXN0cnVjdAlfaW5wdXRfc2lnbmFsX2V2ZW50cyBvbGRzaWdzLCBuZXdzaWdzOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJQ09QWV9GUk9NX1VTRVIocmMsJm1hc2ssIG1hc2tfcHRyLCBzaXplb2YoaW50KSk7CisJaWYgKHJjKQorCQlyZXR1cm4gIC1FRkFVTFQ7CisJCSAKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJ3YWl0X2V2ZW50cyglcywlZClcbiIsIGluZm8tPmRldmljZV9uYW1lLCBtYXNrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCS8qIHJldHVybiBpbW1lZGlhdGVseSBpZiBzdGF0ZSBtYXRjaGVzIHJlcXVlc3RlZCBldmVudHMgKi8KKwlnZXRfc2lnbmFscyhpbmZvKTsKKwlzID0gaW5mby0+c2VyaWFsX3NpZ25hbHM7CisJZXZlbnRzID0gbWFzayAmCisJCSggKChzICYgU2VyaWFsU2lnbmFsX0RTUikgPyBNZ3NsRXZlbnRfRHNyQWN0aXZlOk1nc2xFdmVudF9Ec3JJbmFjdGl2ZSkgKworIAkJICAoKHMgJiBTZXJpYWxTaWduYWxfRENEKSA/IE1nc2xFdmVudF9EY2RBY3RpdmU6TWdzbEV2ZW50X0RjZEluYWN0aXZlKSArCisJCSAgKChzICYgU2VyaWFsU2lnbmFsX0NUUykgPyBNZ3NsRXZlbnRfQ3RzQWN0aXZlOk1nc2xFdmVudF9DdHNJbmFjdGl2ZSkgKworCQkgICgocyAmIFNlcmlhbFNpZ25hbF9SSSkgID8gTWdzbEV2ZW50X1JpQWN0aXZlIDpNZ3NsRXZlbnRfUmlJbmFjdGl2ZSkgKTsKKwlpZiAoZXZlbnRzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogc2F2ZSBjdXJyZW50IGlycSBjb3VudHMgKi8KKwljcHJldiA9IGluZm8tPmljb3VudDsKKwlvbGRzaWdzID0gaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50czsKKwkKKwlpZiAoKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSAmJgorCSAgICAobWFzayAmIE1nc2xFdmVudF9FeGl0SHVudE1vZGUpKQorCQlpcnFfZW5hYmxlKGluZm8sIENIQSwgSVJRX0VYSVRIVU5UKTsKKwkKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5ldmVudF93YWl0X3EsICZ3YWl0KTsKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkKKwkKKwlmb3IoOzspIHsKKwkJc2NoZWR1bGUoKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCQkKKwkJLyogZ2V0IGN1cnJlbnQgaXJxIGNvdW50cyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCW5ld3NpZ3MgPSBpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCQkvKiBpZiBubyBjaGFuZ2UsIHdhaXQgYWJvcnRlZCBmb3Igc29tZSByZWFzb24gKi8KKwkJaWYgKG5ld3NpZ3MuZHNyX3VwICAgPT0gb2xkc2lncy5kc3JfdXAgICAmJgorCQkgICAgbmV3c2lncy5kc3JfZG93biA9PSBvbGRzaWdzLmRzcl9kb3duICYmCisJCSAgICBuZXdzaWdzLmRjZF91cCAgID09IG9sZHNpZ3MuZGNkX3VwICAgJiYKKwkJICAgIG5ld3NpZ3MuZGNkX2Rvd24gPT0gb2xkc2lncy5kY2RfZG93biAmJgorCQkgICAgbmV3c2lncy5jdHNfdXAgICA9PSBvbGRzaWdzLmN0c191cCAgICYmCisJCSAgICBuZXdzaWdzLmN0c19kb3duID09IG9sZHNpZ3MuY3RzX2Rvd24gJiYKKwkJICAgIG5ld3NpZ3MucmlfdXAgICAgPT0gb2xkc2lncy5yaV91cCAgICAmJgorCQkgICAgbmV3c2lncy5yaV9kb3duICA9PSBvbGRzaWdzLnJpX2Rvd24gICYmCisJCSAgICBjbm93LmV4aXRodW50ICAgID09IGNwcmV2LmV4aXRodW50ICAgJiYKKwkJICAgIGNub3cucnhpZGxlICAgICAgPT0gY3ByZXYucnhpZGxlKSB7CisJCQlyYyA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCisJCWV2ZW50cyA9IG1hc2sgJgorCQkJKCAobmV3c2lncy5kc3JfdXAgICAhPSBvbGRzaWdzLmRzcl91cCAgID8gTWdzbEV2ZW50X0RzckFjdGl2ZTowKSAgICsKKwkJCSAgKG5ld3NpZ3MuZHNyX2Rvd24gIT0gb2xkc2lncy5kc3JfZG93biA/IE1nc2xFdmVudF9Ec3JJbmFjdGl2ZTowKSArCisJCQkgIChuZXdzaWdzLmRjZF91cCAgICE9IG9sZHNpZ3MuZGNkX3VwICAgPyBNZ3NsRXZlbnRfRGNkQWN0aXZlOjApICAgKworCQkJICAobmV3c2lncy5kY2RfZG93biAhPSBvbGRzaWdzLmRjZF9kb3duID8gTWdzbEV2ZW50X0RjZEluYWN0aXZlOjApICsKKwkJCSAgKG5ld3NpZ3MuY3RzX3VwICAgIT0gb2xkc2lncy5jdHNfdXAgICA/IE1nc2xFdmVudF9DdHNBY3RpdmU6MCkgICArCisJCQkgIChuZXdzaWdzLmN0c19kb3duICE9IG9sZHNpZ3MuY3RzX2Rvd24gPyBNZ3NsRXZlbnRfQ3RzSW5hY3RpdmU6MCkgKworCQkJICAobmV3c2lncy5yaV91cCAgICAhPSBvbGRzaWdzLnJpX3VwICAgID8gTWdzbEV2ZW50X1JpQWN0aXZlOjApICAgICsKKwkJCSAgKG5ld3NpZ3MucmlfZG93biAgIT0gb2xkc2lncy5yaV9kb3duICA/IE1nc2xFdmVudF9SaUluYWN0aXZlOjApICArCisJCQkgIChjbm93LmV4aXRodW50ICAgICE9IGNwcmV2LmV4aXRodW50ICAgPyBNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlOjApICsKKwkJCSAgKGNub3cucnhpZGxlICAgICAgIT0gY3ByZXYucnhpZGxlICAgICA/IE1nc2xFdmVudF9JZGxlUmVjZWl2ZWQ6MCkgKTsKKwkJaWYgKGV2ZW50cykKKwkJCWJyZWFrOworCQkKKwkJY3ByZXYgPSBjbm93OworCQlvbGRzaWdzID0gbmV3c2lnczsKKwl9CisJCisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPmV2ZW50X3dhaXRfcSwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwlpZiAobWFzayAmIE1nc2xFdmVudF9FeGl0SHVudE1vZGUpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlpZiAoIXdhaXRxdWV1ZV9hY3RpdmUoJmluZm8tPmV2ZW50X3dhaXRfcSkpCisJCQlpcnFfZGlzYWJsZShpbmZvLCBDSEEsIElSUV9FWElUSFVOVCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KK2V4aXQ6CisJaWYgKHJjID09IDApCisJCVBVVF9VU0VSKHJjLCBldmVudHMsIG1hc2tfcHRyKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbW9kZW1faW5wdXRfd2FpdChNR1NMUENfSU5GTyAqaW5mbyxpbnQgYXJnKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKwlzdHJ1Y3QgbWdzbF9pY291bnQgY3ByZXYsIGNub3c7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwkvKiBzYXZlIGN1cnJlbnQgaXJxIGNvdW50cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwljcHJldiA9IGluZm8tPmljb3VudDsKKwlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlmb3IoOzspIHsKKwkJc2NoZWR1bGUoKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogZ2V0IG5ldyBpcnEgY291bnRzICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJY25vdyA9IGluZm8tPmljb3VudDsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwkJLyogaWYgbm8gY2hhbmdlLCB3YWl0IGFib3J0ZWQgZm9yIHNvbWUgcmVhc29uICovCisJCWlmIChjbm93LnJuZyA9PSBjcHJldi5ybmcgJiYgY25vdy5kc3IgPT0gY3ByZXYuZHNyICYmCisJCSAgICBjbm93LmRjZCA9PSBjcHJldi5kY2QgJiYgY25vdy5jdHMgPT0gY3ByZXYuY3RzKSB7CisJCQlyYyA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCisJCS8qIGNoZWNrIGZvciBjaGFuZ2UgaW4gY2FsbGVyIHNwZWNpZmllZCBtb2RlbSBpbnB1dCAqLworCQlpZiAoKGFyZyAmIFRJT0NNX1JORyAmJiBjbm93LnJuZyAhPSBjcHJldi5ybmcpIHx8CisJCSAgICAoYXJnICYgVElPQ01fRFNSICYmIGNub3cuZHNyICE9IGNwcmV2LmRzcikgfHwKKwkJICAgIChhcmcgJiBUSU9DTV9DRCAgJiYgY25vdy5kY2QgIT0gY3ByZXYuZGNkKSB8fAorCQkgICAgKGFyZyAmIFRJT0NNX0NUUyAmJiBjbm93LmN0cyAhPSBjcHJldi5jdHMpKSB7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWNwcmV2ID0gY25vdzsKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByYzsKK30KKworLyogcmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgc2VyaWFsIGNvbnRyb2wgYW5kIHN0YXR1cyBzaWduYWxzCisgKi8KK3N0YXRpYyBpbnQgdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGludCByZXN1bHQ7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisgCWdldF9zaWduYWxzKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJcmVzdWx0ID0gKChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpID8gVElPQ01fUlRTOjApICsKKwkJKChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EVFIpID8gVElPQ01fRFRSOjApICsKKwkJKChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpID8gVElPQ01fQ0FSOjApICsKKwkJKChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SSSkgID8gVElPQ01fUk5HOjApICsKKwkJKChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EU1IpID8gVElPQ01fRFNSOjApICsKKwkJKChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9DVFMpID8gVElPQ01fQ1RTOjApOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHRpb2NtZ2V0KCkgdmFsdWU9JTA4WFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIHJlc3VsdCApOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIHNldCBtb2RlbSBjb250cm9sIHNpZ25hbHMgKERUUi9SVFMpCisgKi8KK3N0YXRpYyBpbnQgdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHRpb2Ntc2V0KCV4LCV4KVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBzZXQsIGNsZWFyKTsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFM7CisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RUUjsKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfUlRTOworCWlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gflNlcmlhbFNpZ25hbF9EVFI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisgCXNldF9zaWduYWxzKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBvciBjbGVhciB0cmFuc21pdCBicmVhayBjb25kaXRpb24KKyAqCisgKiBBcmd1bWVudHM6CQl0dHkJCXBvaW50ZXIgdG8gdHR5IGluc3RhbmNlIGRhdGEKKyAqCQkJYnJlYWtfc3RhdGUJLTE9c2V0IGJyZWFrIGNvbmRpdGlvbiwgMD1jbGVhcgorICovCitzdGF0aWMgdm9pZCBtZ3NscGNfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCU1HU0xQQ19JTkZPICogaW5mbyA9IChNR1NMUENfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX2JyZWFrKCVzLCVkKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIGJyZWFrX3N0YXRlKTsKKwkJCSAKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19icmVhayIpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisgCWlmIChicmVha19zdGF0ZSA9PSAtMSkKKwkJc2V0X3JlZ19iaXRzKGluZm8sIENIQStEQUZPLCBCSVQ2KTsKKwllbHNlIAorCQljbGVhcl9yZWdfYml0cyhpbmZvLCBDSEErREFGTywgQklUNik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7Cit9CisKKy8qIFNlcnZpY2UgYW4gSU9DVEwgcmVxdWVzdAorICogCQorICogQXJndW1lbnRzOgorICogCisgKiAJdHR5CXBvaW50ZXIgdG8gdHR5IGluc3RhbmNlIGRhdGEKKyAqIAlmaWxlCXBvaW50ZXIgdG8gYXNzb2NpYXRlZCBmaWxlIG9iamVjdCBmb3IgZGV2aWNlCisgKiAJY21kCUlPQ1RMIGNvbW1hbmQgY29kZQorICogCWFyZwljb21tYW5kIGFyZ3VtZW50L2NvbnRleHQKKyAqIAkKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IG1nc2xwY19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlNR1NMUENfSU5GTyAqIGluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfaW9jdGwgJXMgY21kPSUwOFhcbiIsIF9fRklMRV9fLF9fTElORV9fLAorCQkJaW5mby0+ZGV2aWNlX25hbWUsIGNtZCApOworCQorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX2lvY3RsIikpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCisJICAgIChjbWQgIT0gVElPQ01JV0FJVCkgJiYgKGNtZCAhPSBUSU9DR0lDT1VOVCkpIHsKKwkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQkgICAgcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIGlvY3RsX2NvbW1vbihpbmZvLCBjbWQsIGFyZyk7Cit9CisKK2ludCBpb2N0bF9jb21tb24oTUdTTFBDX0lORk8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbWdzbF9pY291bnQgY25vdzsJLyoga2VybmVsIGNvdW50ZXIgdGVtcHMgKi8KKwlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBfX3VzZXIgKnBfY3VzZXI7CS8qIHVzZXIgc3BhY2UgKi8KKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNR1NMX0lPQ0dQQVJBTVM6CisJCXJldHVybiBnZXRfcGFyYW1zKGluZm8sIGFyZ3ApOworCWNhc2UgTUdTTF9JT0NTUEFSQU1TOgorCQlyZXR1cm4gc2V0X3BhcmFtcyhpbmZvLCBhcmdwKTsKKwljYXNlIE1HU0xfSU9DR1RYSURMRToKKwkJcmV0dXJuIGdldF90eGlkbGUoaW5mbywgYXJncCk7CisJY2FzZSBNR1NMX0lPQ1NUWElETEU6CisJCXJldHVybiBzZXRfdHhpZGxlKGluZm8sIChpbnQpYXJnKTsKKwljYXNlIE1HU0xfSU9DR0lGOgorCQlyZXR1cm4gZ2V0X2ludGVyZmFjZShpbmZvLCBhcmdwKTsKKwljYXNlIE1HU0xfSU9DU0lGOgorCQlyZXR1cm4gc2V0X2ludGVyZmFjZShpbmZvLChpbnQpYXJnKTsKKwljYXNlIE1HU0xfSU9DVFhFTkFCTEU6CisJCXJldHVybiBzZXRfdHhlbmFibGUoaW5mbywoaW50KWFyZyk7CisJY2FzZSBNR1NMX0lPQ1JYRU5BQkxFOgorCQlyZXR1cm4gc2V0X3J4ZW5hYmxlKGluZm8sKGludClhcmcpOworCWNhc2UgTUdTTF9JT0NUWEFCT1JUOgorCQlyZXR1cm4gdHhfYWJvcnQoaW5mbyk7CisJY2FzZSBNR1NMX0lPQ0dTVEFUUzoKKwkJcmV0dXJuIGdldF9zdGF0cyhpbmZvLCBhcmdwKTsKKwljYXNlIE1HU0xfSU9DV0FJVEVWRU5UOgorCQlyZXR1cm4gd2FpdF9ldmVudHMoaW5mbywgYXJncCk7CisJY2FzZSBUSU9DTUlXQUlUOgorCQlyZXR1cm4gbW9kZW1faW5wdXRfd2FpdChpbmZvLChpbnQpYXJnKTsKKwljYXNlIFRJT0NHSUNPVU5UOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlwX2N1c2VyID0gYXJncDsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5jdHMsICZwX2N1c2VyLT5jdHMpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5kc3IsICZwX2N1c2VyLT5kc3IpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5ybmcsICZwX2N1c2VyLT5ybmcpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5kY2QsICZwX2N1c2VyLT5kY2QpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5yeCwgJnBfY3VzZXItPnJ4KTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cudHgsICZwX2N1c2VyLT50eCk7CisJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQlQVVRfVVNFUihlcnJvcixjbm93LmZyYW1lLCAmcF9jdXNlci0+ZnJhbWUpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5vdmVycnVuLCAmcF9jdXNlci0+b3ZlcnJ1bik7CisJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQlQVVRfVVNFUihlcnJvcixjbm93LnBhcml0eSwgJnBfY3VzZXItPnBhcml0eSk7CisJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQlQVVRfVVNFUihlcnJvcixjbm93LmJyaywgJnBfY3VzZXItPmJyayk7CisJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQlQVVRfVVNFUihlcnJvcixjbm93LmJ1Zl9vdmVycnVuLCAmcF9jdXNlci0+YnVmX292ZXJydW4pOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBuZXcgdGVybWlvcyBzZXR0aW5ncworICogCQorICogQXJndW1lbnRzOgorICogCisgKiAJdHR5CQlwb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUKKyAqIAl0ZXJtaW9zCQlwb2ludGVyIHRvIGJ1ZmZlciB0byBob2xkIHJldHVybmVkIG9sZCB0ZXJtaW9zCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xwY19zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19zZXRfdGVybWlvcyAlc1xuIiwgX19GSUxFX18sX19MSU5FX18sCisJCQl0dHktPmRyaXZlci0+bmFtZSApOworCQorCS8qIGp1c3QgcmV0dXJuIGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQgKi8KKwlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKKwkgICAgJiYgKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgCisJCT09IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpCisJICByZXR1cm47CisKKwltZ3NscGNfY2hhbmdlX3BhcmFtcyhpbmZvKTsKKworCS8qIEhhbmRsZSB0cmFuc2l0aW9uIHRvIEIwIHN0YXR1cyAqLworCWlmIChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEICYmCisJICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKSB7CisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH4oU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFIpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJIAlzZXRfc2lnbmFscyhpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJfQorCQorCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGF3YXkgZnJvbSBCMCBzdGF0dXMgKi8KKwlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJgorCSAgICB0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgeworCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfRFRSOworIAkJaWYgKCEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgfHwgCisgCQkgICAgIXRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSkgeworCQkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUzsKKyAJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCSAJc2V0X3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KKwkKKwkvKiBIYW5kbGUgdHVybmluZyBvZmYgQ1JUU0NUUyAqLworCWlmIChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMgJiYKKwkgICAgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQl0eF9yZWxlYXNlKHR0eSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBtZ3NscGNfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCU1HU0xQQ19JTkZPICogaW5mbyA9IChNR1NMUENfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19jbG9zZSIpKQorCQlyZXR1cm47CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19jbG9zZSglcykgZW50cnksIGNvdW50PSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+Y291bnQpOworCQkJIAorCWlmICghaW5mby0+Y291bnQpCisJCXJldHVybjsKKworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQorCQlnb3RvIGNsZWFudXA7CisJCQkKKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKGluZm8tPmNvdW50ICE9IDEpKSB7CisJCS8qCisJCSAqIHR0eS0+Y291bnQgaXMgMSBhbmQgdGhlIHR0eSBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4KKwkJICogaW5mby0+Y291bnQgc2hvdWxkIGJlIG9uZSBpbiB0aGlzIGNhc2UuCisJCSAqIGlmIGl0J3Mgbm90LCBjb3JyZWN0IGl0IHNvIHRoYXQgdGhlIHBvcnQgaXMgc2h1dGRvd24uCisJCSAqLworCQlwcmludGsoIm1nc2xwY19jbG9zZTogYmFkIHJlZmNvdW50OyB0dHktPmNvdW50IGlzIDEsICIKKwkJICAgICAgICJpbmZvLT5jb3VudCBpcyAlZFxuIiwgaW5mby0+Y291bnQpOworCQlpbmZvLT5jb3VudCA9IDE7CisJfQorCQorCWluZm8tPmNvdW50LS07CisJCisJLyogaWYgYXQgbGVhc3Qgb25lIG9wZW4gcmVtYWluaW5nLCBsZWF2ZSBoYXJkd2FyZSBhY3RpdmUgKi8KKwlpZiAoaW5mby0+Y291bnQpCisJCWdvdG8gY2xlYW51cDsKKwkKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19DTE9TSU5HOworCQorCS8qIHNldCB0dHktPmNsb3NpbmcgdG8gbm90aWZ5IGxpbmUgZGlzY2lwbGluZSB0byAKKwkgKiBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycy4gT25seSB0aGUgTl9UVFkKKwkgKiBkaXNjaXBsaW5lIGFwcGVhcnMgdG8gdXNlIHRoaXMgKHBwcCBkb2VzIG5vdCkuCisJICovCisJdHR5LT5jbG9zaW5nID0gMTsKKwkKKwkvKiB3YWl0IGZvciB0cmFuc21pdCBkYXRhIHRvIGNsZWFyIGFsbCBsYXllcnMgKi8KKwkKKwlpZiAoaW5mby0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKSB7CisJCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX2Nsb3NlKCVzKSBjYWxsaW5nIHR0eV93YWl0X3VudGlsX3NlbnRcbiIsCisJCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+Y2xvc2luZ193YWl0KTsKKwl9CisJCQorIAlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkKKyAJCW1nc2xwY193YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT50aW1lb3V0KTsKKworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisKKwlsZGlzY19mbHVzaF9idWZmZXIodHR5KTsKKwkJCisJc2h1dGRvd24oaW5mbyk7CisJCisJdHR5LT5jbG9zaW5nID0gMDsKKwlpbmZvLT50dHkgPSBOVUxMOworCQorCWlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKGluZm8tPmNsb3NlX2RlbGF5KSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCX0KKwkKKwlpbmZvLT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7CisJCQkgCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5jbG9zZV93YWl0KTsKKwkKK2NsZWFudXA6CQkJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19jbG9zZSglcykgZXhpdCwgY291bnQ9JWRcbiIsIF9fRklMRV9fLF9fTElORV9fLAorCQkJdHR5LT5kcml2ZXItPm5hbWUsIGluZm8tPmNvdW50KTsKK30KKworLyogV2FpdCB1bnRpbCB0aGUgdHJhbnNtaXR0ZXIgaXMgZW1wdHkuCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xwY193YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCit7CisJTUdTTFBDX0lORk8gKiBpbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIG9yaWdfamlmZmllcywgY2hhcl90aW1lOworCisJaWYgKCFpbmZvICkKKwkJcmV0dXJuOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY193YWl0X3VudGlsX3NlbnQoJXMpIGVudHJ5XG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworICAgICAgCisJaWYgKG1nc2xwY19wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NscGNfd2FpdF91bnRpbF9zZW50IikpCisJCXJldHVybjsKKworCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQorCQlnb3RvIGV4aXQ7CisJIAorCW9yaWdfamlmZmllcyA9IGppZmZpZXM7CisgICAgICAKKwkvKiBTZXQgY2hlY2sgaW50ZXJ2YWwgdG8gMS81IG9mIGVzdGltYXRlZCB0aW1lIHRvCisJICogc2VuZCBhIGNoYXJhY3RlciwgYW5kIG1ha2UgaXQgYXQgbGVhc3QgMS4gVGhlIGNoZWNrCisJICogaW50ZXJ2YWwgc2hvdWxkIGFsc28gYmUgbGVzcyB0aGFuIHRoZSB0aW1lb3V0LgorCSAqIE5vdGU6IHVzZSB0aWdodCB0aW1pbmdzIGhlcmUgdG8gc2F0aXNmeSB0aGUgTklTVC1QQ1RTLgorCSAqLyAKKyAgICAgICAKKwlpZiAoIGluZm8tPnBhcmFtcy5kYXRhX3JhdGUgKSB7CisJICAgICAgIAljaGFyX3RpbWUgPSBpbmZvLT50aW1lb3V0LygzMiAqIDUpOworCQlpZiAoIWNoYXJfdGltZSkKKwkJCWNoYXJfdGltZSsrOworCX0gZWxzZQorCQljaGFyX3RpbWUgPSAxOworCQkKKwlpZiAodGltZW91dCkKKwkJY2hhcl90aW1lID0gbWluX3QodW5zaWduZWQgbG9uZywgY2hhcl90aW1lLCB0aW1lb3V0KTsKKwkJCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCXdoaWxlIChpbmZvLT50eF9hY3RpdmUpIHsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hhcl90aW1lKSk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJYnJlYWs7CisJCQlpZiAodGltZW91dCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArIHRpbWVvdXQpKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKChpbmZvLT50eF9jb3VudCB8fCBpbmZvLT50eF9hY3RpdmUpICYmCisJCQlpbmZvLT50eF9lbmFibGVkKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGNoYXJfdGltZSkpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWJyZWFrOworCQkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCQlicmVhazsKKwkJfQorCX0KKyAgICAgIAorZXhpdDoKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX3dhaXRfdW50aWxfc2VudCglcykgZXhpdFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKK30KKworLyogQ2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgorICogVGhpcyBpcyB0aGUgc2FtZSBhcyBjbG9zaW5nIGFsbCBvcGVuIGZpbGVzIGZvciB0aGUgcG9ydC4KKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCU1HU0xQQ19JTkZPICogaW5mbyA9IChNR1NMUENfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19oYW5ndXAoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJIAorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX2hhbmd1cCIpKQorCQlyZXR1cm47CisKKwltZ3NscGNfZmx1c2hfYnVmZmVyKHR0eSk7CisJc2h1dGRvd24oaW5mbyk7CisJCisJaW5mby0+Y291bnQgPSAwOwkKKwlpbmZvLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwlpbmZvLT50dHkgPSBOVUxMOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworfQorCisvKiBCbG9jayB0aGUgY3VycmVudCBwcm9jZXNzIHVudGlsIHRoZSBzcGVjaWZpZWQgcG9ydAorICogaXMgcmVhZHkgdG8gYmUgb3BlbmVkLgorICovCitzdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgIE1HU0xQQ19JTkZPICppbmZvKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludAkJcmV0dmFsOworCWludAkJZG9fY2xvY2FsID0gMCwgZXh0cmFfY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOmJsb2NrX3RpbF9yZWFkeSBvbiAlc1xuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgdHR5LT5kcml2ZXItPm5hbWUgKTsKKworCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyB8fCB0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSl7CisJCS8qIG5vbmJsb2NrIG1vZGUgaXMgc2V0IG9yIHBvcnQgaXMgbm90IGVuYWJsZWQgKi8KKwkJLyoganVzdCB2ZXJpZnkgdGhhdCBjYWxsb3V0IGRldmljZSBpcyBub3QgYWN0aXZlICovCisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCXJldHVybiAwOworCX0KKworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCisJCWRvX2Nsb2NhbCA9IDE7CisKKwkvKiBXYWl0IGZvciBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCisJICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KKwkgKiB0aGlzIGxvb3AsIGluZm8tPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0CisJICogbWdzbHBjX2Nsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIFdlIHJlc3RvcmUgaXQgdXBvbgorCSAqIGV4aXQsIGVpdGhlciBub3JtYWwgb3IgYWJub3JtYWwuCisJICovCisJIAorCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTpibG9ja190aWxfcmVhZHkgYmVmb3JlIGJsb2NrIG9uICVzIGNvdW50PSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCB0dHktPmRyaXZlci0+bmFtZSwgaW5mby0+Y291bnQgKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCWV4dHJhX2NvdW50ID0gMTsKKwkJaW5mby0+Y291bnQtLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWluZm8tPmJsb2NrZWRfb3BlbisrOworCQorCXdoaWxlICgxKSB7CisJCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTICsgU2VyaWFsU2lnbmFsX0RUUjsKKwkJIAlzZXRfc2lnbmFscyhpbmZvKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQl9CisJCQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSl7CisJCQlyZXR2YWwgPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSA/CisJCQkJCS1FQUdBSU4gOiAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCSAJZ2V0X3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQkKKyAJCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKKyAJCSAgICAoZG9fY2xvY2FsIHx8IChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpKSApIHsKKyAJCQlicmVhazsKKwkJfQorCQkJCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJCisJCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQkJcHJpbnRrKCIlcyglZCk6YmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nIG9uICVzIGNvdW50PSVkXG4iLAorCQkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgdHR5LT5kcml2ZXItPm5hbWUsIGluZm8tPmNvdW50ICk7CisJCQkJIAorCQlzY2hlZHVsZSgpOworCX0KKwkKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkKKwlpZiAoZXh0cmFfY291bnQpCisJCWluZm8tPmNvdW50Kys7CisJaW5mby0+YmxvY2tlZF9vcGVuLS07CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOmJsb2NrX3RpbF9yZWFkeSBhZnRlciBibG9ja2luZyBvbiAlcyBjb3VudD0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgdHR5LT5kcml2ZXItPm5hbWUsIGluZm8tPmNvdW50ICk7CisJCQkgCisJaWYgKCFyZXR2YWwpCisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgbWdzbHBjX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCU1HU0xQQ19JTkZPCSppbmZvOworCWludCAJCQlyZXR2YWwsIGxpbmU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIHZlcmlmeSByYW5nZSBvZiBzcGVjaWZpZWQgbGluZSBudW1iZXIgKi8JCisJbGluZSA9IHR0eS0+aW5kZXg7CisJaWYgKChsaW5lIDwgMCkgfHwgKGxpbmUgPj0gbWdzbHBjX2RldmljZV9jb3VudCkpIHsKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX29wZW4gd2l0aCBpbnZhbGlkIGxpbmUgIyVkLlxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGxpbmUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBmaW5kIHRoZSBpbmZvIHN0cnVjdHVyZSBmb3IgdGhlIHNwZWNpZmllZCBsaW5lICovCisJaW5mbyA9IG1nc2xwY19kZXZpY2VfbGlzdDsKKwl3aGlsZShpbmZvICYmIGluZm8tPmxpbmUgIT0gbGluZSkKKwkJaW5mbyA9IGluZm8tPm5leHRfZGV2aWNlOworCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX29wZW4iKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJdHR5LT5kcml2ZXJfZGF0YSA9IGluZm87CisJaW5mby0+dHR5ID0gdHR5OworCQkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX29wZW4oJXMpLCBvbGQgcmVmIGNvdW50ID0gJWRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sdHR5LT5kcml2ZXItPm5hbWUsIGluZm8tPmNvdW50KTsKKworCS8qIElmIHBvcnQgaXMgY2xvc2luZywgc2lnbmFsIGNhbGxlciB0byB0cnkgYWdhaW4gKi8KKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCBpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpeworCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKQorCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCXJldHZhbCA9ICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSA/CisJCQktRUFHQUlOIDogLUVSRVNUQVJUU1lTKTsKKwkJZ290byBjbGVhbnVwOworCX0KKwkKKwlpbmZvLT50dHktPmxvd19sYXRlbmN5ID0gKGluZm8tPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT5uZXRjb3VudCkgeworCQlyZXR2YWwgPSAtRUJVU1k7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwkJZ290byBjbGVhbnVwOworCX0KKwlpbmZvLT5jb3VudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKworCWlmIChpbmZvLT5jb3VudCA9PSAxKSB7CisJCS8qIDFzdCBvcGVuIG9uIHRoaXMgZGV2aWNlLCBpbml0IGhhcmR3YXJlICovCisJCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJZ290byBjbGVhbnVwOworCX0KKworCXJldHZhbCA9IGJsb2NrX3RpbF9yZWFkeSh0dHksIGZpbHAsIGluZm8pOworCWlmIChyZXR2YWwpIHsKKwkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCQlwcmludGsoIiVzKCVkKTpibG9ja190aWxfcmVhZHkoJXMpIHJldHVybmVkICVkXG4iLAorCQkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIHJldHZhbCk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX29wZW4oJXMpIHN1Y2Nlc3NcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lKTsKKwlyZXR2YWwgPSAwOworCQorY2xlYW51cDoJCQkKKwlpZiAocmV0dmFsKSB7CisJCWlmICh0dHktPmNvdW50ID09IDEpCisJCQlpbmZvLT50dHkgPSBOVUxMOyAvKiB0dHkgbGF5ZXIgd2lsbCByZWxlYXNlIHR0eSBzdHJ1Y3QgKi8KKwkJaWYoaW5mby0+Y291bnQpCisJCQlpbmZvLT5jb3VudC0tOworCX0KKwkKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogL3Byb2MgZnMgcm91dGluZXMuLi4uCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgbGluZV9pbmZvKGNoYXIgKmJ1ZiwgTUdTTFBDX0lORk8gKmluZm8pCit7CisJY2hhcglzdGF0X2J1ZlszMF07CisJaW50CXJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmV0ID0gc3ByaW50ZihidWYsICIlczppbzolMDRYIGlycTolZCIsCisJCSAgICAgIGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pb19iYXNlLCBpbmZvLT5pcnFfbGV2ZWwpOworCisJLyogb3V0cHV0IGN1cnJlbnQgc2VyaWFsIHNpZ25hbCBzdGF0ZXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisgCWdldF9zaWduYWxzKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQorCXN0YXRfYnVmWzBdID0gMDsKKwlzdGF0X2J1ZlsxXSA9IDA7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykKKwkJc3RyY2F0KHN0YXRfYnVmLCAifFJUUyIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9DVFMpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxDVFMiKTsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFRSKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8RFRSIik7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RTUikKKwkJc3RyY2F0KHN0YXRfYnVmLCAifERTUiIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxDRCIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SSSkKKwkJc3RyY2F0KHN0YXRfYnVmLCAifFJJIik7CisKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpIHsKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBIRExDIHR4b2s6JWQgcnhvazolZCIsCisJCQkgICAgICBpbmZvLT5pY291bnQudHhvaywgaW5mby0+aWNvdW50LnJ4b2spOworCQlpZiAoaW5mby0+aWNvdW50LnR4dW5kZXIpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHR4dW5kZXI6JWQiLCBpbmZvLT5pY291bnQudHh1bmRlcik7CisJCWlmIChpbmZvLT5pY291bnQudHhhYm9ydCkKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgdHhhYm9ydDolZCIsIGluZm8tPmljb3VudC50eGFib3J0KTsKKwkJaWYgKGluZm8tPmljb3VudC5yeHNob3J0KQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiByeHNob3J0OiVkIiwgaW5mby0+aWNvdW50LnJ4c2hvcnQpOwkKKwkJaWYgKGluZm8tPmljb3VudC5yeGxvbmcpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHJ4bG9uZzolZCIsIGluZm8tPmljb3VudC5yeGxvbmcpOworCQlpZiAoaW5mby0+aWNvdW50LnJ4b3ZlcikKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgcnhvdmVyOiVkIiwgaW5mby0+aWNvdW50LnJ4b3Zlcik7CisJCWlmIChpbmZvLT5pY291bnQucnhjcmMpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHJ4Y3JjOiVkIiwgaW5mby0+aWNvdW50LnJ4Y3JjKTsKKwl9IGVsc2UgeworCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIEFTWU5DIHR4OiVkIHJ4OiVkIiwKKwkJCSAgICAgIGluZm8tPmljb3VudC50eCwgaW5mby0+aWNvdW50LnJ4KTsKKwkJaWYgKGluZm8tPmljb3VudC5mcmFtZSkKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgZmU6JWQiLCBpbmZvLT5pY291bnQuZnJhbWUpOworCQlpZiAoaW5mby0+aWNvdW50LnBhcml0eSkKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgcGU6JWQiLCBpbmZvLT5pY291bnQucGFyaXR5KTsKKwkJaWYgKGluZm8tPmljb3VudC5icmspCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIGJyazolZCIsIGluZm8tPmljb3VudC5icmspOwkKKwkJaWYgKGluZm8tPmljb3VudC5vdmVycnVuKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBvZTolZCIsIGluZm8tPmljb3VudC5vdmVycnVuKTsKKwl9CisJCisJLyogQXBwZW5kIHNlcmlhbCBzaWduYWwgc3RhdHVzIHRvIGVuZCAqLworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgJXNcbiIsIHN0YXRfYnVmKzEpOworCQorCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJ0eGFjdGl2ZT0lZCBiaF9yZXE9JWQgYmhfcnVuPSVkIHBlbmRpbmdfYmg9JXhcbiIsCisJCSAgICAgICBpbmZvLT50eF9hY3RpdmUsaW5mby0+YmhfcmVxdWVzdGVkLGluZm8tPmJoX3J1bm5pbmcsCisJCSAgICAgICBpbmZvLT5wZW5kaW5nX2JoKTsKKwkKKwlyZXR1cm4gcmV0OworfQorCisvKiBDYWxsZWQgdG8gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgZGV2aWNlcworICovCitzdGF0aWMgaW50IG1nc2xwY19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwKKwkJIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSAwLCBsOworCW9mZl90CWJlZ2luID0gMDsKKwlNR1NMUENfSU5GTyAqaW5mbzsKKwkKKwlsZW4gKz0gc3ByaW50ZihwYWdlLCAic3luY2xpbmsgZHJpdmVyOiVzXG4iLCBkcml2ZXJfdmVyc2lvbik7CisJCisJaW5mbyA9IG1nc2xwY19kZXZpY2VfbGlzdDsKKwl3aGlsZSggaW5mbyApIHsKKwkJbCA9IGxpbmVfaW5mbyhwYWdlICsgbGVuLCBpbmZvKTsKKwkJbGVuICs9IGw7CisJCWlmIChsZW4rYmVnaW4gPiBvZmYrY291bnQpCisJCQlnb3RvIGRvbmU7CisJCWlmIChsZW4rYmVnaW4gPCBvZmYpIHsKKwkJCWJlZ2luICs9IGxlbjsKKwkJCWxlbiA9IDA7CisJCX0KKwkJaW5mbyA9IGluZm8tPm5leHRfZGV2aWNlOworCX0KKworCSplb2YgPSAxOworZG9uZToKKwlpZiAob2ZmID49IGxlbitiZWdpbikKKwkJcmV0dXJuIDA7CisJKnN0YXJ0ID0gcGFnZSArIChvZmYtYmVnaW4pOworCXJldHVybiAoKGNvdW50IDwgYmVnaW4rbGVuLW9mZikgPyBjb3VudCA6IGJlZ2luK2xlbi1vZmYpOworfQorCitpbnQgcnhfYWxsb2NfYnVmZmVycyhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwkvKiBlYWNoIGJ1ZmZlciBoYXMgaGVhZGVyIGFuZCBkYXRhICovCisJaW5mby0+cnhfYnVmX3NpemUgPSBzaXplb2YoUlhCVUYpICsgaW5mby0+bWF4X2ZyYW1lX3NpemU7CisKKwkvKiBjYWxjdWxhdGUgdG90YWwgYWxsb2NhdGlvbiBzaXplIGZvciA4IGJ1ZmZlcnMgKi8KKwlpbmZvLT5yeF9idWZfdG90YWxfc2l6ZSA9IGluZm8tPnJ4X2J1Zl9zaXplICogODsKKworCS8qIGxpbWl0IHRvdGFsIGFsbG9jYXRlZCBtZW1vcnkgKi8KKwlpZiAoaW5mby0+cnhfYnVmX3RvdGFsX3NpemUgPiAweDEwMDAwKQorCQlpbmZvLT5yeF9idWZfdG90YWxfc2l6ZSA9IDB4MTAwMDA7CisKKwkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGJ1ZmZlcnMgKi8KKwlpbmZvLT5yeF9idWZfY291bnQgPSBpbmZvLT5yeF9idWZfdG90YWxfc2l6ZSAvIGluZm8tPnJ4X2J1Zl9zaXplOworCisJaW5mby0+cnhfYnVmID0ga21hbGxvYyhpbmZvLT5yeF9idWZfdG90YWxfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8tPnJ4X2J1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJ4X3Jlc2V0X2J1ZmZlcnMoaW5mbyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcnhfZnJlZV9idWZmZXJzKE1HU0xQQ19JTkZPICppbmZvKQoreworCWlmIChpbmZvLT5yeF9idWYpCisJCWtmcmVlKGluZm8tPnJ4X2J1Zik7CisJaW5mby0+cnhfYnVmID0gTlVMTDsKK30KKworaW50IGNsYWltX3Jlc291cmNlcyhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlpZiAocnhfYWxsb2NfYnVmZmVycyhpbmZvKSA8IDAgKSB7CisJCXByaW50ayggIkNhbnQgYWxsb2NhdGUgcnggYnVmZmVyICVzXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSk7CisJCXJlbGVhc2VfcmVzb3VyY2VzKGluZm8pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CQorCXJldHVybiAwOworfQorCit2b2lkIHJlbGVhc2VfcmVzb3VyY2VzKE1HU0xQQ19JTkZPICppbmZvKQoreworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoInJlbGVhc2VfcmVzb3VyY2VzKCVzKVxuIiwgaW5mby0+ZGV2aWNlX25hbWUpOworCXJ4X2ZyZWVfYnVmZmVycyhpbmZvKTsKK30KKworLyogQWRkIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlIHRvIHRoZQorICogZ2xvYmFsIGxpbmtlZCBsaXN0IG9mIGRldmljZXMgYW5kIGluY3JlbWVudCB0aGUgZGV2aWNlIGNvdW50LgorICogCQorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKi8KK3ZvaWQgbWdzbHBjX2FkZF9kZXZpY2UoTUdTTFBDX0lORk8gKmluZm8pCit7CisJaW5mby0+bmV4dF9kZXZpY2UgPSBOVUxMOworCWluZm8tPmxpbmUgPSBtZ3NscGNfZGV2aWNlX2NvdW50OworCXNwcmludGYoaW5mby0+ZGV2aWNlX25hbWUsInR0eVNMUCVkIixpbmZvLT5saW5lKTsKKwkKKwlpZiAoaW5mby0+bGluZSA8IE1BWF9ERVZJQ0VfQ09VTlQpIHsKKwkJaWYgKG1heGZyYW1lW2luZm8tPmxpbmVdKQorCQkJaW5mby0+bWF4X2ZyYW1lX3NpemUgPSBtYXhmcmFtZVtpbmZvLT5saW5lXTsKKwkJaW5mby0+ZG9zeW5jcHBwID0gZG9zeW5jcHBwW2luZm8tPmxpbmVdOworCX0KKworCW1nc2xwY19kZXZpY2VfY291bnQrKzsKKwkKKwlpZiAoIW1nc2xwY19kZXZpY2VfbGlzdCkKKwkJbWdzbHBjX2RldmljZV9saXN0ID0gaW5mbzsKKwllbHNlIHsJCisJCU1HU0xQQ19JTkZPICpjdXJyZW50X2RldiA9IG1nc2xwY19kZXZpY2VfbGlzdDsKKwkJd2hpbGUoIGN1cnJlbnRfZGV2LT5uZXh0X2RldmljZSApCisJCQljdXJyZW50X2RldiA9IGN1cnJlbnRfZGV2LT5uZXh0X2RldmljZTsKKwkJY3VycmVudF9kZXYtPm5leHRfZGV2aWNlID0gaW5mbzsKKwl9CisJCisJaWYgKGluZm8tPm1heF9mcmFtZV9zaXplIDwgNDA5NikKKwkJaW5mby0+bWF4X2ZyYW1lX3NpemUgPSA0MDk2OworCWVsc2UgaWYgKGluZm8tPm1heF9mcmFtZV9zaXplID4gNjU1MzUpCisJCWluZm8tPm1heF9mcmFtZV9zaXplID0gNjU1MzU7CisJCisJcHJpbnRrKCAiU3luY0xpbmsgUEMgQ2FyZCAlczpJTz0lMDRYIElSUT0lZFxuIiwKKwkJaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPmlvX2Jhc2UsIGluZm8tPmlycV9sZXZlbCk7CisKKyNpZmRlZiBDT05GSUdfSERMQworCWhkbGNkZXZfaW5pdChpbmZvKTsKKyNlbmRpZgorfQorCit2b2lkIG1nc2xwY19yZW1vdmVfZGV2aWNlKE1HU0xQQ19JTkZPICpyZW1vdmVfaW5mbykKK3sKKwlNR1NMUENfSU5GTyAqaW5mbyA9IG1nc2xwY19kZXZpY2VfbGlzdDsKKwlNR1NMUENfSU5GTyAqbGFzdCA9IE5VTEw7CisKKwl3aGlsZShpbmZvKSB7CisJCWlmIChpbmZvID09IHJlbW92ZV9pbmZvKSB7CisJCQlpZiAobGFzdCkKKwkJCQlsYXN0LT5uZXh0X2RldmljZSA9IGluZm8tPm5leHRfZGV2aWNlOworCQkJZWxzZQorCQkJCW1nc2xwY19kZXZpY2VfbGlzdCA9IGluZm8tPm5leHRfZGV2aWNlOworI2lmZGVmIENPTkZJR19IRExDCisJCQloZGxjZGV2X2V4aXQoaW5mbyk7CisjZW5kaWYKKwkJCXJlbGVhc2VfcmVzb3VyY2VzKGluZm8pOworCQkJa2ZyZWUoaW5mbyk7CisJCQltZ3NscGNfZGV2aWNlX2NvdW50LS07CisJCQlyZXR1cm47CisJCX0KKwkJbGFzdCA9IGluZm87CisJCWluZm8gPSBpbmZvLT5uZXh0X2RldmljZTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBtZ3NscGNfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAic3luY2xpbmtfY3MiLAorCX0sCisJLmF0dGFjaAkJPSBtZ3NscGNfYXR0YWNoLAorCS5kZXRhY2gJCT0gbWdzbHBjX2RldGFjaCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgbWdzbHBjX29wcyA9IHsKKwkub3BlbiA9IG1nc2xwY19vcGVuLAorCS5jbG9zZSA9IG1nc2xwY19jbG9zZSwKKwkud3JpdGUgPSBtZ3NscGNfd3JpdGUsCisJLnB1dF9jaGFyID0gbWdzbHBjX3B1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IG1nc2xwY19mbHVzaF9jaGFycywKKwkud3JpdGVfcm9vbSA9IG1nc2xwY193cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBtZ3NscGNfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSBtZ3NscGNfZmx1c2hfYnVmZmVyLAorCS5pb2N0bCA9IG1nc2xwY19pb2N0bCwKKwkudGhyb3R0bGUgPSBtZ3NscGNfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSBtZ3NscGNfdW50aHJvdHRsZSwKKwkuc2VuZF94Y2hhciA9IG1nc2xwY19zZW5kX3hjaGFyLAorCS5icmVha19jdGwgPSBtZ3NscGNfYnJlYWssCisJLndhaXRfdW50aWxfc2VudCA9IG1nc2xwY193YWl0X3VudGlsX3NlbnQsCisJLnJlYWRfcHJvYyA9IG1nc2xwY19yZWFkX3Byb2MsCisJLnNldF90ZXJtaW9zID0gbWdzbHBjX3NldF90ZXJtaW9zLAorCS5zdG9wID0gdHhfcGF1c2UsCisJLnN0YXJ0ID0gdHhfcmVsZWFzZSwKKwkuaGFuZ3VwID0gbWdzbHBjX2hhbmd1cCwKKwkudGlvY21nZXQgPSB0aW9jbWdldCwKKwkudGlvY21zZXQgPSB0aW9jbXNldCwKK307CisKK3N0YXRpYyB2b2lkIHN5bmNsaW5rX2NzX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlwcmludGsoIlVubG9hZGluZyAlczogdmVyc2lvbiAlc1xuIiwgZHJpdmVyX25hbWUsIGRyaXZlcl92ZXJzaW9uKTsKKworCXdoaWxlKG1nc2xwY19kZXZpY2VfbGlzdCkKKwkJbWdzbHBjX3JlbW92ZV9kZXZpY2UobWdzbHBjX2RldmljZV9saXN0KTsKKworCWlmIChzZXJpYWxfZHJpdmVyKSB7CisJCWlmICgocmMgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcikpKQorCQkJcHJpbnRrKCIlcyglZCkgZmFpbGVkIHRvIHVucmVnaXN0ZXIgdHR5IGRyaXZlciBlcnI9JWRcbiIsCisJCQkgICAgICAgX19GSUxFX18sX19MSU5FX18scmMpOworCQlwdXRfdHR5X2RyaXZlcihzZXJpYWxfZHJpdmVyKTsKKwl9CisKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJm1nc2xwY19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworc3RhdGljIGludCBfX2luaXQgc3luY2xpbmtfY3NfaW5pdCh2b2lkKQoreworICAgIGludCByYzsKKworICAgIGlmIChicmVha19vbl9sb2FkKSB7CisJICAgIG1nc2xwY19nZXRfdGV4dF9wdHIoKTsKKwkgICAgQlJFQUtQT0lOVCgpOworICAgIH0KKworICAgIHByaW50aygiJXMgJXNcbiIsIGRyaXZlcl9uYW1lLCBkcml2ZXJfdmVyc2lvbik7CisKKyAgICBpZiAoKHJjID0gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmbWdzbHBjX2RyaXZlcikpIDwgMCkKKwkgICAgcmV0dXJuIHJjOworCisgICAgc2VyaWFsX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYX0RFVklDRV9DT1VOVCk7CisgICAgaWYgKCFzZXJpYWxfZHJpdmVyKSB7CisJICAgIHJjID0gLUVOT01FTTsKKwkgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSB0dHlfZHJpdmVyIHN0cnVjdHVyZSAqLworCQorICAgIHNlcmlhbF9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisgICAgc2VyaWFsX2RyaXZlci0+ZHJpdmVyX25hbWUgPSAic3luY2xpbmtfY3MiOworICAgIHNlcmlhbF9kcml2ZXItPm5hbWUgPSAidHR5U0xQIjsKKyAgICBzZXJpYWxfZHJpdmVyLT5tYWpvciA9IHR0eW1ham9yOworICAgIHNlcmlhbF9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gNjQ7CisgICAgc2VyaWFsX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisgICAgc2VyaWFsX2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKyAgICBzZXJpYWxfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisgICAgc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQorCSAgICBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisgICAgc2VyaWFsX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworICAgIHR0eV9zZXRfb3BlcmF0aW9ucyhzZXJpYWxfZHJpdmVyLCAmbWdzbHBjX29wcyk7CisKKyAgICBpZiAoKHJjID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihzZXJpYWxfZHJpdmVyKSkgPCAwKSB7CisJICAgIHByaW50aygiJXMoJWQpOkNvdWxkbid0IHJlZ2lzdGVyIHNlcmlhbCBkcml2ZXJcbiIsCisJCSAgIF9fRklMRV9fLF9fTElORV9fKTsKKwkgICAgcHV0X3R0eV9kcml2ZXIoc2VyaWFsX2RyaXZlcik7CisJICAgIHNlcmlhbF9kcml2ZXIgPSBOVUxMOworCSAgICBnb3RvIGVycm9yOworICAgIH0KKwkJCQorICAgIHByaW50aygiJXMgJXMsIHR0eSBtYWpvciMlZFxuIiwKKwkgICBkcml2ZXJfbmFtZSwgZHJpdmVyX3ZlcnNpb24sCisJICAgc2VyaWFsX2RyaXZlci0+bWFqb3IpOworCQorICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICBzeW5jbGlua19jc19jbGVhbnVwKCk7CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3luY2xpbmtfY3NfZXhpdCh2b2lkKSAKK3sKKwlzeW5jbGlua19jc19jbGVhbnVwKCk7Cit9CisKK21vZHVsZV9pbml0KHN5bmNsaW5rX2NzX2luaXQpOworbW9kdWxlX2V4aXQoc3luY2xpbmtfY3NfZXhpdCk7CisKK3N0YXRpYyB2b2lkIG1nc2xwY19zZXRfcmF0ZShNR1NMUENfSU5GTyAqaW5mbywgdW5zaWduZWQgY2hhciBjaGFubmVsLCB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgTSwgTjsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKworCS8qIG5vdGU6c3RhbmRhcmQgQlJHIG1vZGUgaXMgYnJva2VuIGluIFYzLjIgY2hpcCAKKwkgKiBzbyBlbmhhbmNlZCBtb2RlIGlzIGFsd2F5cyB1c2VkIAorCSAqLworCisJaWYgKHJhdGUpIHsKKwkJTiA9IDM2ODY0MDAgLyByYXRlOworCQlpZiAoIU4pCisJCQlOID0gMTsKKwkJTiA+Pj0gMTsKKwkJZm9yIChNID0gMTsgTiA+IDY0ICYmIE0gPCAxNjsgTSsrKQorCQkJTiA+Pj0gMTsKKwkJTi0tOworCisJCS8qIEJHUls1Li4wXSA9IE4KKwkJICogQkdSWzkuLjZdID0gTQorCQkgKiBCR1JbNy4uMF0gY29udGFpbmVkIGluIEJHUiByZWdpc3RlcgorCQkgKiBCR1JbOS4uOF0gY29udGFpbmVkIGluIENDUjJbNy4uNl0KKwkJICogZGl2aXNvciA9IChOKzEpKjJeTQorCQkgKgorCQkgKiBOb3RlOiBNICptdXN0KiBub3QgYmUgemVybyAoY2F1c2VzIGFzeW1ldHJpYyBkdXR5IGN5Y2xlKQorCQkgKi8gCisJCXdyaXRlX3JlZyhpbmZvLCAodW5zaWduZWQgY2hhcikgKGNoYW5uZWwgKyBCR1IpLAorCQkJCSAgKHVuc2lnbmVkIGNoYXIpICgoTSA8PCA2KSArIE4pKTsKKwkJdmFsID0gcmVhZF9yZWcoaW5mbywgKHVuc2lnbmVkIGNoYXIpIChjaGFubmVsICsgQ0NSMikpICYgMHgzZjsKKwkJdmFsIHw9ICgoTSA8PCA0KSAmIDB4YzApOworCQl3cml0ZV9yZWcoaW5mbywgKHVuc2lnbmVkIGNoYXIpIChjaGFubmVsICsgQ0NSMiksIHZhbCk7CisJfQorfQorCisvKiBFbmFibGVkIHRoZSBBVVggY2xvY2sgb3V0cHV0IGF0IHRoZSBzcGVjaWZpZWQgZnJlcXVlbmN5LgorICovCitzdGF0aWMgdm9pZCBlbmFibGVfYXV4Y2xrKE1HU0xQQ19JTkZPICppbmZvKQoreworCXVuc2lnbmVkIGNoYXIgdmFsOworCQorCS8qIE1PREUKKwkgKgorCSAqIDA3Li4wNiAgTURTWzEuLjBdIDEwID0gdHJhbnNwYXJlbnQgSERMQyBtb2RlCisJICogMDUgICAgICBBRE0gQWRkcmVzcyBNb2RlLCAwID0gbm8gYWRkciByZWNvZ25pdGlvbgorCSAqIDA0ICAgICAgVE1EIFRpbWVyIE1vZGUsIDAgPSBleHRlcm5hbAorCSAqIDAzICAgICAgUkFDIFJlY2VpdmVyIEFjdGl2ZSwgMCA9IGluYWN0aXZlCisJICogMDIgICAgICBSVFMgMD1SVFMgYWN0aXZlIGR1cmluZyB4bWl0LCAxPVJUUyBhbHdheXMgYWN0aXZlCisJICogMDEgICAgICBUUlMgVGltZXIgUmVzb2x1dGlvbiwgMT01MTIKKwkgKiAwMCAgICAgIFRMUCBUZXN0IExvb3AsIDAgPSBubyBsb29wCisJICoKKwkgKiAxMDAwIDAwMTAKKwkgKi8gCisJdmFsID0gMHg4MjsKKwkKKwkvKiBjaGFubmVsIEIgUlRTIGlzIHVzZWQgdG8gZW5hYmxlIEFVWENMSyBkcml2ZXIgb24gU1A1MDUgKi8gCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDICYmIGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCkKKwkJdmFsIHw9IEJJVDI7CisJd3JpdGVfcmVnKGluZm8sIENIQiArIE1PREUsIHZhbCk7CisJCisJLyogQ0NSMAorCSAqCisJICogMDcgICAgICBQVSBQb3dlciBVcCwgMT1hY3RpdmUsIDA9cG93ZXIgZG93bgorCSAqIDA2ICAgICAgTUNFIE1hc3RlciBDbG9jayBFbmFibGUsIDE9ZW5hYmxlZAorCSAqIDA1ICAgICAgUmVzZXJ2ZWQsIDAKKwkgKiAwNC4uMDIgIFNDWzIuLjBdIEVuY29kaW5nCisJICogMDEuLjAwICBTTVsxLi4wXSBTZXJpYWwgTW9kZSwgMDA9SERMQworCSAqCisJICogMTEwMDAwMDAKKwkgKi8gCisJd3JpdGVfcmVnKGluZm8sIENIQiArIENDUjAsIDB4YzApOworCQorCS8qIENDUjEKKwkgKgorCSAqIDA3ICAgICAgU0ZMRyBTaGFyZWQgRmxhZywgMCA9IGRpc2FibGUgc2hhcmVkIGZsYWdzCisJICogMDYgICAgICBHQUxQIEdvIEFjdGl2ZSBPbiBMb29wLCAwID0gbm90IHVzZWQKKwkgKiAwNSAgICAgIEdMUCBHbyBPbiBMb29wLCAwID0gbm90IHVzZWQKKwkgKiAwNCAgICAgIE9EUyBPdXRwdXQgRHJpdmVyIFNlbGVjdCwgMT1UeEQgaXMgcHVzaC1wdWxsIG91dHB1dAorCSAqIDAzICAgICAgSVRGIEludGVyZnJhbWUgVGltZSBGaWxsLCAwPW1hcmssIDE9ZmxhZworCSAqIDAyLi4wMCAgQ01bMi4uMF0gQ2xvY2sgTW9kZQorCSAqCisJICogMDAwMSAwMTExCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEIgKyBDQ1IxLCAweDE3KTsKKwkKKwkvKiBDQ1IyIChDaGFubmVsIEIpCisJICoKKwkgKiAwNy4uMDYgIEJHUls5Li44XSBCYXVkIHJhdGUgYml0cyA5Li44CisJICogMDUgICAgICBCREYgQmF1ZCByYXRlIGRpdmlzb3IgZmFjdG9yLCAwPTEsIDE9QkdSIHZhbHVlCisJICogMDQgICAgICBTU0VMIENsb2NrIHNvdXJjZSBzZWxlY3QsIDE9c3VibW9kZSBiCisJICogMDMgICAgICBUT0UgMD1UeENMSyBpcyBpbnB1dCwgMT1UeENMSyBpcyBvdXRwdXQKKwkgKiAwMiAgICAgIFJXWCBSZWFkL1dyaXRlIEV4Y2hhbmdlIDA9ZGlzYWJsZWQKKwkgKiAwMSAgICAgIEMzMiwgQ1JDIHNlbGVjdCwgMD1DUkMtMTYsIDE9Q1JDLTMyCisJICogMDAgICAgICBESVYsIGRhdGEgaW52ZXJzaW9uIDA9ZGlzYWJsZWQsIDE9ZW5hYmxlZAorCSAqCisJICogMDAxMSAxMDAwCisJICovIAorCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyAmJiBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpCisJCXdyaXRlX3JlZyhpbmZvLCBDSEIgKyBDQ1IyLCAweDM4KTsKKwllbHNlCisJCXdyaXRlX3JlZyhpbmZvLCBDSEIgKyBDQ1IyLCAweDMwKTsKKwkKKwkvKiBDQ1I0CisJICoKKwkgKiAwNyAgICAgIE1DSzQgTWFzdGVyIENsb2NrIERpdmlkZSBieSA0LCAxPWVuYWJsZWQKKwkgKiAwNiAgICAgIEVCUkcgRW5oYW5jZWQgQmF1ZCBSYXRlIEdlbmVyYXRvciBNb2RlLCAxPWVuYWJsZWQKKwkgKiAwNSAgICAgIFRTVDEgVGVzdCBQaW4sIDA9bm9ybWFsIG9wZXJhdGlvbgorCSAqIDA0ICAgICAgSUNEIEl2ZXJ0IENhcnJpZXIgRGV0ZWN0LCAxPWVuYWJsZWQgKGFjdGl2ZSBsb3cpCisJICogMDMuLjAyICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICogMDEuLjAwICBSRlRbMS4uMF0gUnhGSUZPIFRocmVzaG9sZCAwMD0zMiBieXRlcworCSAqCisJICogMDEwMSAwMDAwCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEIgKyBDQ1I0LCAweDUwKTsKKwkKKwkvKiBpZiBhdXhjbGsgbm90IGVuYWJsZWQsIHNldCBpbnRlcm5hbCBCUkcgc28KKwkgKiBDVFMgdHJhbnNpdGlvbnMgY2FuIGJlIGRldGVjdGVkIChyZXF1aXJlcyBUeEMpCisJICovIAorCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyAmJiBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpCisJCW1nc2xwY19zZXRfcmF0ZShpbmZvLCBDSEIsIGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCk7CisJZWxzZQorCQltZ3NscGNfc2V0X3JhdGUoaW5mbywgQ0hCLCA5MjE2MDApOworfQorCitzdGF0aWMgdm9pZCBsb29wYmFja19lbmFibGUoTUdTTFBDX0lORk8gKmluZm8pIAoreworCXVuc2lnbmVkIGNoYXIgdmFsOworCQorCS8qIENDUjE6MDIuLjAwICBDTVsyLi4wXSBDbG9jayBNb2RlID0gMTExIChjbG9jayBtb2RlIDcpICovIAorCXZhbCA9IHJlYWRfcmVnKGluZm8sIENIQSArIENDUjEpIHwgKEJJVDIgKyBCSVQxICsgQklUMCk7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIENDUjEsIHZhbCk7CisJCisJLyogQ0NSMjowNCBTU0VMIENsb2NrIHNvdXJjZSBzZWxlY3QsIDE9c3VibW9kZSBiICovIAorCXZhbCA9IHJlYWRfcmVnKGluZm8sIENIQSArIENDUjIpIHwgKEJJVDQgKyBCSVQ1KTsKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgQ0NSMiwgdmFsKTsKKwkKKwkvKiBzZXQgTGlua1NwZWVkIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gMk1icHMgKi8gCisJaWYgKGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCkKKwkJbWdzbHBjX3NldF9yYXRlKGluZm8sIENIQSwgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKTsKKwllbHNlCisJCW1nc2xwY19zZXRfcmF0ZShpbmZvLCBDSEEsIDE4NDMyMDApOworCQorCS8qIE1PREU6MDAgVExQIFRlc3QgTG9vcCwgMT1sb29wYmFjayBlbmFibGVkICovIAorCXZhbCA9IHJlYWRfcmVnKGluZm8sIENIQSArIE1PREUpIHwgQklUMDsKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgTU9ERSwgdmFsKTsKK30KKwordm9pZCBoZGxjX21vZGUoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisJdW5zaWduZWQgY2hhciBjbGttb2RlLCBjbGtzdWJtb2RlOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLyAKKwlpcnFfZGlzYWJsZShpbmZvLCBDSEEsIDB4ZmZmZik7CisJaXJxX2Rpc2FibGUoaW5mbywgQ0hCLCAweGZmZmYpOworCXBvcnRfaXJxX2Rpc2FibGUoaW5mbywgMHhmZik7CisJCisJLyogYXNzdW1lIGNsb2NrIG1vZGUgMGEsIHJjdj1SeEMgeG10PVR4QyAqLyAKKwljbGttb2RlID0gY2xrc3VibW9kZSA9IDA7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19SWENfRFBMTAorCSAgICAmJiBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfVFhDX0RQTEwpIHsKKwkJLyogY2xvY2sgbW9kZSA3YSwgcmN2ID0gRFBMTCwgeG10ID0gRFBMTCAqLyAKKwkJY2xrbW9kZSA9IDc7CisJfSBlbHNlIGlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfUlhDX0JSRworCQkgJiYgaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1RYQ19CUkcpIHsKKwkJLyogY2xvY2sgbW9kZSA3YiwgcmN2ID0gQlJHLCB4bXQgPSBCUkcgKi8gCisJCWNsa21vZGUgPSA3OworCQljbGtzdWJtb2RlID0gMTsKKwl9IGVsc2UgaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19SWENfRFBMTCkgeworCQlpZiAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1RYQ19CUkcpIHsKKwkJCS8qIGNsb2NrIG1vZGUgNmIsIHJjdiA9IERQTEwsIHhtdCA9IEJSRy8xNiAqLyAKKwkJCWNsa21vZGUgPSA2OworCQkJY2xrc3VibW9kZSA9IDE7CisJCX0gZWxzZSB7CisJCQkvKiBjbG9jayBtb2RlIDZhLCByY3YgPSBEUExMLCB4bXQgPSBUeEMgKi8gCisJCQljbGttb2RlID0gNjsKKwkJfQorCX0gZWxzZSBpZiAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1RYQ19CUkcpIHsKKwkJLyogY2xvY2sgbW9kZSAwYiwgcmN2ID0gUnhDLCB4bXQgPSBCUkcgKi8gCisJCWNsa3N1Ym1vZGUgPSAxOworCX0KKwkKKwkvKiBNT0RFCisJICoKKwkgKiAwNy4uMDYgIE1EU1sxLi4wXSAxMCA9IHRyYW5zcGFyZW50IEhETEMgbW9kZQorCSAqIDA1ICAgICAgQURNIEFkZHJlc3MgTW9kZSwgMCA9IG5vIGFkZHIgcmVjb2duaXRpb24KKwkgKiAwNCAgICAgIFRNRCBUaW1lciBNb2RlLCAwID0gZXh0ZXJuYWwKKwkgKiAwMyAgICAgIFJBQyBSZWNlaXZlciBBY3RpdmUsIDAgPSBpbmFjdGl2ZQorCSAqIDAyICAgICAgUlRTIDA9UlRTIGFjdGl2ZSBkdXJpbmcgeG1pdCwgMT1SVFMgYWx3YXlzIGFjdGl2ZQorCSAqIDAxICAgICAgVFJTIFRpbWVyIFJlc29sdXRpb24sIDE9NTEyCisJICogMDAgICAgICBUTFAgVGVzdCBMb29wLCAwID0gbm8gbG9vcAorCSAqCisJICogMTAwMCAwMDEwCisJICovIAorCXZhbCA9IDB4ODI7CisJaWYgKGluZm8tPnBhcmFtcy5sb29wYmFjaykKKwkJdmFsIHw9IEJJVDA7CisJCisJLyogcHJlc2VydmUgUlRTIHN0YXRlICovIAorCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpCisJCXZhbCB8PSBCSVQyOworCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBNT0RFLCB2YWwpOworCQorCS8qIENDUjAKKwkgKgorCSAqIDA3ICAgICAgUFUgUG93ZXIgVXAsIDE9YWN0aXZlLCAwPXBvd2VyIGRvd24KKwkgKiAwNiAgICAgIE1DRSBNYXN0ZXIgQ2xvY2sgRW5hYmxlLCAxPWVuYWJsZWQKKwkgKiAwNSAgICAgIFJlc2VydmVkLCAwCisJICogMDQuLjAyICBTQ1syLi4wXSBFbmNvZGluZworCSAqIDAxLi4wMCAgU01bMS4uMF0gU2VyaWFsIE1vZGUsIDAwPUhETEMKKwkgKgorCSAqIDExMDAwMDAwCisJICovIAorCXZhbCA9IDB4YzA7CisJc3dpdGNoIChpbmZvLT5wYXJhbXMuZW5jb2RpbmcpCisJeworCWNhc2UgSERMQ19FTkNPRElOR19OUlpJOgorCQl2YWwgfD0gQklUMzsKKwkJYnJlYWs7CisJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfU1BBQ0U6CisJCXZhbCB8PSBCSVQ0OworCQlicmVhazsJCS8vIEZNMAorCWNhc2UgSERMQ19FTkNPRElOR19CSVBIQVNFX01BUks6CisJCXZhbCB8PSBCSVQ0ICsgQklUMjsKKwkJYnJlYWs7CQkvLyBGTTEKKwljYXNlIEhETENfRU5DT0RJTkdfQklQSEFTRV9MRVZFTDoKKwkJdmFsIHw9IEJJVDQgKyBCSVQzOworCQlicmVhazsJCS8vIE1hbmNoZXN0ZXIKKwl9CisJd3JpdGVfcmVnKGluZm8sIENIQSArIENDUjAsIHZhbCk7CisJCisJLyogQ0NSMQorCSAqCisJICogMDcgICAgICBTRkxHIFNoYXJlZCBGbGFnLCAwID0gZGlzYWJsZSBzaGFyZWQgZmxhZ3MKKwkgKiAwNiAgICAgIEdBTFAgR28gQWN0aXZlIE9uIExvb3AsIDAgPSBub3QgdXNlZAorCSAqIDA1ICAgICAgR0xQIEdvIE9uIExvb3AsIDAgPSBub3QgdXNlZAorCSAqIDA0ICAgICAgT0RTIE91dHB1dCBEcml2ZXIgU2VsZWN0LCAxPVR4RCBpcyBwdXNoLXB1bGwgb3V0cHV0CisJICogMDMgICAgICBJVEYgSW50ZXJmcmFtZSBUaW1lIEZpbGwsIDA9bWFyaywgMT1mbGFnCisJICogMDIuLjAwICBDTVsyLi4wXSBDbG9jayBNb2RlCisJICoKKwkgKiAwMDAxIDAwMDAKKwkgKi8gCisJdmFsID0gMHgxMCArIGNsa21vZGU7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIENDUjEsIHZhbCk7CisJCisJLyogQ0NSMgorCSAqCisJICogMDcuLjA2ICBCR1JbOS4uOF0gQmF1ZCByYXRlIGJpdHMgOS4uOAorCSAqIDA1ICAgICAgQkRGIEJhdWQgcmF0ZSBkaXZpc29yIGZhY3RvciwgMD0xLCAxPUJHUiB2YWx1ZQorCSAqIDA0ICAgICAgU1NFTCBDbG9jayBzb3VyY2Ugc2VsZWN0LCAxPXN1Ym1vZGUgYgorCSAqIDAzICAgICAgVE9FIDA9VHhDTEsgaXMgaW5wdXQsIDA9VHhDTEsgaXMgaW5wdXQKKwkgKiAwMiAgICAgIFJXWCBSZWFkL1dyaXRlIEV4Y2hhbmdlIDA9ZGlzYWJsZWQKKwkgKiAwMSAgICAgIEMzMiwgQ1JDIHNlbGVjdCwgMD1DUkMtMTYsIDE9Q1JDLTMyCisJICogMDAgICAgICBESVYsIGRhdGEgaW52ZXJzaW9uIDA9ZGlzYWJsZWQsIDE9ZW5hYmxlZAorCSAqCisJICogMDAwMCAwMDAwCisJICovIAorCXZhbCA9IDB4MDA7CisJaWYgKGNsa21vZGUgPT0gMiB8fCBjbGttb2RlID09IDMgfHwgY2xrbW9kZSA9PSA2CisJICAgIHx8IGNsa21vZGUgPT0gNyB8fCAoY2xrbW9kZSA9PSAwICYmIGNsa3N1Ym1vZGUgPT0gMSkpCisJCXZhbCB8PSBCSVQ1OworCWlmIChjbGtzdWJtb2RlKQorCQl2YWwgfD0gQklUNDsKKwlpZiAoaW5mby0+cGFyYW1zLmNyY190eXBlID09IEhETENfQ1JDXzMyX0NDSVRUKQorCQl2YWwgfD0gQklUMTsKKwlpZiAoaW5mby0+cGFyYW1zLmVuY29kaW5nID09IEhETENfRU5DT0RJTkdfTlJaQikKKwkJdmFsIHw9IEJJVDA7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIENDUjIsIHZhbCk7CisJCisJLyogQ0NSMworCSAqCisJICogMDcuLjA2ICBQUkVbMS4uMF0gUHJlYW1ibGUgY291bnQgMDA9MSwgMDE9MiwgMTA9NCwgMTE9OAorCSAqIDA1ICAgICAgRVBUIEVuYWJsZSBwcmVhbWJsZSB0cmFuc21pc3Npb24sIDE9ZW5hYmxlZAorCSAqIDA0ICAgICAgUkFERCBSZWNlaXZlIGFkZHJlc3MgcHVzaGVkIHRvIEZJRk8sIDA9ZGlzYWJsZWQKKwkgKiAwMyAgICAgIENSTCBDUkMgUmVzZXQgTGV2ZWwsIDA9RkZGRgorCSAqIDAyICAgICAgUkNSQyBSeCBDUkMgMD1PbiAxPU9mZgorCSAqIDAxICAgICAgVENSQyBUeCBDUkMgMD1PbiAxPU9mZgorCSAqIDAwICAgICAgUFNEIERQTEwgUGhhc2UgU2hpZnQgRGlzYWJsZQorCSAqCisJICogMDAwMCAwMDAwCisJICovIAorCXZhbCA9IDB4MDA7CisJaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSA9PSBIRExDX0NSQ19OT05FKQorCQl2YWwgfD0gQklUMiArIEJJVDE7CisJaWYgKGluZm8tPnBhcmFtcy5wcmVhbWJsZSAhPSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fTk9ORSkKKwkJdmFsIHw9IEJJVDU7CisJc3dpdGNoIChpbmZvLT5wYXJhbXMucHJlYW1ibGVfbGVuZ3RoKQorCXsKKwljYXNlIEhETENfUFJFQU1CTEVfTEVOR1RIXzE2QklUUzoKKwkJdmFsIHw9IEJJVDY7CisJCWJyZWFrOworCWNhc2UgSERMQ19QUkVBTUJMRV9MRU5HVEhfMzJCSVRTOgorCQl2YWwgfD0gQklUNjsKKwkJYnJlYWs7CisJY2FzZSBIRExDX1BSRUFNQkxFX0xFTkdUSF82NEJJVFM6CisJCXZhbCB8PSBCSVQ3ICsgQklUNjsKKwkJYnJlYWs7CisJfQorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IzLCB2YWwpOworCQorCS8qIFBSRSAtIFByZWFtYmxlIHBhdHRlcm4gKi8gCisJdmFsID0gMDsKKwlzd2l0Y2ggKGluZm8tPnBhcmFtcy5wcmVhbWJsZSkKKwl7CisJY2FzZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fRkxBR1M6IHZhbCA9IDB4N2U7IGJyZWFrOworCWNhc2UgSERMQ19QUkVBTUJMRV9QQVRURVJOXzEwOiAgICB2YWwgPSAweGFhOyBicmVhazsKKwljYXNlIEhETENfUFJFQU1CTEVfUEFUVEVSTl8wMTogICAgdmFsID0gMHg1NTsgYnJlYWs7CisJY2FzZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fT05FUzogIHZhbCA9IDB4ZmY7IGJyZWFrOworCX0KKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgUFJFLCB2YWwpOworCQorCS8qIENDUjQKKwkgKgorCSAqIDA3ICAgICAgTUNLNCBNYXN0ZXIgQ2xvY2sgRGl2aWRlIGJ5IDQsIDE9ZW5hYmxlZAorCSAqIDA2ICAgICAgRUJSRyBFbmhhbmNlZCBCYXVkIFJhdGUgR2VuZXJhdG9yIE1vZGUsIDE9ZW5hYmxlZAorCSAqIDA1ICAgICAgVFNUMSBUZXN0IFBpbiwgMD1ub3JtYWwgb3BlcmF0aW9uCisJICogMDQgICAgICBJQ0QgSXZlcnQgQ2FycmllciBEZXRlY3QsIDE9ZW5hYmxlZCAoYWN0aXZlIGxvdykKKwkgKiAwMy4uMDIgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwMS4uMDAgIFJGVFsxLi4wXSBSeEZJRk8gVGhyZXNob2xkIDAwPTMyIGJ5dGVzCisJICoKKwkgKiAwMTAxIDAwMDAKKwkgKi8gCisJdmFsID0gMHg1MDsKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgQ0NSNCwgdmFsKTsKKwlpZiAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1JYQ19EUExMKQorCQltZ3NscGNfc2V0X3JhdGUoaW5mbywgQ0hBLCBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQgKiAxNik7CisJZWxzZQorCQltZ3NscGNfc2V0X3JhdGUoaW5mbywgQ0hBLCBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpOworCQorCS8qIFJMQ1IgUmVjZWl2ZSBsZW5ndGggY2hlY2sgcmVnaXN0ZXIKKwkgKgorCSAqIDcgICAgIDE9ZW5hYmxlIHJlY2VpdmUgbGVuZ3RoIGNoZWNrCisJICogNi4uMCAgTWF4IGZyYW1lIGxlbmd0aCA9IChSTCArIDEpICogMzIKKwkgKi8gCisJd3JpdGVfcmVnKGluZm8sIENIQSArIFJMQ1IsIDApOworCQorCS8qIFhCQ0ggVHJhbnNtaXQgQnl0ZSBDb3VudCBIaWdoCisJICoKKwkgKiAwNyAgICAgIERNQSBtb2RlLCAwID0gaW50ZXJydXB0IGRyaXZlbgorCSAqIDA2ICAgICAgTlJNLCAwPUFCTSAoaWdub3JlZCkKKwkgKiAwNSAgICAgIENBUyBDYXJyaWVyIEF1dG8gU3RhcnQKKwkgKiAwNCAgICAgIFhDIFRyYW5zbWl0IENvbnRpbnVvdXNseSAoaWdub3JlZCkKKwkgKiAwMy4uMDAgIFhCQ1sxMC4uOF0gVHJhbnNtaXQgYnl0ZSBjb3VudCBiaXRzIDEwLi44CisJICoKKwkgKiAwMDAwIDAwMDAKKwkgKi8gCisJdmFsID0gMHgwMDsKKwlpZiAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0FVVE9fRENEKQorCQl2YWwgfD0gQklUNTsKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgWEJDSCwgdmFsKTsKKwllbmFibGVfYXV4Y2xrKGluZm8pOworCWlmIChpbmZvLT5wYXJhbXMubG9vcGJhY2sgfHwgaW5mby0+dGVzdGluZ19pcnEpCisJCWxvb3BiYWNrX2VuYWJsZShpbmZvKTsKKwlpZiAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0FVVE9fQ1RTKQorCXsKKwkJaXJxX2VuYWJsZShpbmZvLCBDSEIsIElSUV9DVFMpOworCQkvKiBQVlJbM10gMT1BVVRPIENUUyBhY3RpdmUgKi8gCisJCXNldF9yZWdfYml0cyhpbmZvLCBDSEEgKyBQVlIsIEJJVDMpOworCX0gZWxzZQorCQljbGVhcl9yZWdfYml0cyhpbmZvLCBDSEEgKyBQVlIsIEJJVDMpOworCisJaXJxX2VuYWJsZShpbmZvLCBDSEEsCisJCQkgSVJRX1JYRU9NICsgSVJRX1JYRklGTyArIElSUV9BTExTRU5UICsKKwkJCSBJUlFfVU5ERVJSVU4gKyBJUlFfVFhGSUZPKTsKKwlpc3N1ZV9jb21tYW5kKGluZm8sIENIQSwgQ01EX1RYUkVTRVQgKyBDTURfUlhSRVNFVCk7CisJd2FpdF9jb21tYW5kX2NvbXBsZXRlKGluZm8sIENIQSk7CisJcmVhZF9yZWcxNihpbmZvLCBDSEEgKyBJU1IpOwkvKiBjbGVhciBwZW5kaW5nIElSUXMgKi8KKwkKKwkvKiBNYXN0ZXIgY2xvY2sgbW9kZSBlbmFibGVkIGFib3ZlIHRvIGFsbG93IHJlc2V0IGNvbW1hbmRzCisJICogdG8gY29tcGxldGUgZXZlbiBpZiBubyBkYXRhIGNsb2NrcyBhcmUgcHJlc2VudC4KKwkgKgorCSAqIERpc2FibGUgbWFzdGVyIGNsb2NrIG1vZGUgZm9yIG5vcm1hbCBjb21tdW5pY2F0aW9ucyBiZWNhdXNlCisJICogVjMuMiBvZiB0aGUgRVNDQzIgaGFzIGEgYnVnIHRoYXQgcHJldmVudHMgdGhlIHRyYW5zbWl0IGFsbCBzZW50CisJICogSVJRIHdoZW4gaW4gbWFzdGVyIGNsb2NrIG1vZGUuCisJICoKKwkgKiBMZWF2ZSBtYXN0ZXIgY2xvY2sgbW9kZSBlbmFibGVkIGZvciBJUlEgdGVzdCBiZWNhdXNlIHRoZQorCSAqIHRpbWVyIElSUSB1c2VkIGJ5IHRoZSB0ZXN0IGNhbiBvbmx5IGhhcHBlbiBpbiBtYXN0ZXIgY2xvY2sgbW9kZS4KKwkgKi8gCisJaWYgKCFpbmZvLT50ZXN0aW5nX2lycSkKKwkJY2xlYXJfcmVnX2JpdHMoaW5mbywgQ0hBICsgQ0NSMCwgQklUNik7CisKKwl0eF9zZXRfaWRsZShpbmZvKTsKKworCXR4X3N0b3AoaW5mbyk7CisJcnhfc3RvcChpbmZvKTsKK30KKwordm9pZCByeF9zdG9wKE1HU0xQQ19JTkZPICppbmZvKQoreworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCXByaW50aygiJXMoJWQpOnJ4X3N0b3AoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJIAorCS8qIE1PREU6MDMgUkFDIFJlY2VpdmVyIEFjdGl2ZSwgMD1pbmFjdGl2ZSAqLyAKKwljbGVhcl9yZWdfYml0cyhpbmZvLCBDSEEgKyBNT0RFLCBCSVQzKTsKKworCWluZm8tPnJ4X2VuYWJsZWQgPSAwOworCWluZm8tPnJ4X292ZXJmbG93ID0gMDsKK30KKwordm9pZCByeF9zdGFydChNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTpyeF9zdGFydCglcylcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwlyeF9yZXNldF9idWZmZXJzKGluZm8pOworCWluZm8tPnJ4X2VuYWJsZWQgPSAwOworCWluZm8tPnJ4X292ZXJmbG93ID0gMDsKKworCS8qIE1PREU6MDMgUkFDIFJlY2VpdmVyIEFjdGl2ZSwgMT1hY3RpdmUgKi8gCisJc2V0X3JlZ19iaXRzKGluZm8sIENIQSArIE1PREUsIEJJVDMpOworCisJaW5mby0+cnhfZW5hYmxlZCA9IDE7Cit9CisKK3ZvaWQgdHhfc3RhcnQoTUdTTFBDX0lORk8gKmluZm8pCit7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKKwkJcHJpbnRrKCIlcyglZCk6dHhfc3RhcnQoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJIAorCWlmIChpbmZvLT50eF9jb3VudCkgeworCQkvKiBJZiBhdXRvIFJUUyBlbmFibGVkIGFuZCBSVFMgaXMgaW5hY3RpdmUsIHRoZW4gYXNzZXJ0ICovCisJCS8qIFJUUyBhbmQgc2V0IGEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRyaXZlciBzaG91bGQgKi8KKwkJLyogbmVnYXRlIFJUUyB3aGVuIHRoZSB0cmFuc21pc3Npb24gY29tcGxldGVzLiAqLworCQlpbmZvLT5kcm9wX3J0c19vbl90eF9kb25lID0gMDsKKworCQlpZiAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0FVVE9fUlRTKSB7CisJCQlnZXRfc2lnbmFscyhpbmZvKTsKKwkJCWlmICghKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykpIHsKKwkJCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTOworCQkJCXNldF9zaWduYWxzKGluZm8pOworCQkJCWluZm8tPmRyb3BfcnRzX29uX3R4X2RvbmUgPSAxOworCQkJfQorCQl9CisKKwkJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9BU1lOQykgeworCQkJaWYgKCFpbmZvLT50eF9hY3RpdmUpIHsKKwkJCQlpbmZvLT50eF9hY3RpdmUgPSAxOworCQkJCXR4X3JlYWR5KGluZm8pOworCQkJfQorCQl9IGVsc2UgeworCQkJaW5mby0+dHhfYWN0aXZlID0gMTsKKwkJCXR4X3JlYWR5KGluZm8pOworCQkJaW5mby0+dHhfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMDApOworCQkJYWRkX3RpbWVyKCZpbmZvLT50eF90aW1lcik7CQorCQl9CisJfQorCisJaWYgKCFpbmZvLT50eF9lbmFibGVkKQorCQlpbmZvLT50eF9lbmFibGVkID0gMTsKK30KKwordm9pZCB0eF9zdG9wKE1HU0xQQ19JTkZPICppbmZvKQoreworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCXByaW50aygiJXMoJWQpOnR4X3N0b3AoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJIAorCWRlbF90aW1lcigmaW5mby0+dHhfdGltZXIpOwkKKworCWluZm8tPnR4X2VuYWJsZWQgPSAwOworCWluZm8tPnR4X2FjdGl2ZSAgPSAwOworfQorCisvKiBSZXNldCB0aGUgYWRhcHRlciB0byBhIGtub3duIHN0YXRlIGFuZCBwcmVwYXJlIGl0IGZvciBmdXJ0aGVyIHVzZS4KKyAqLwordm9pZCByZXNldF9kZXZpY2UoTUdTTFBDX0lORk8gKmluZm8pCit7CisJLyogcG93ZXIgdXAgYm90aCBjaGFubmVscyAoc2V0IEJJVDcpICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IwLCAweDgwKTsKKwl3cml0ZV9yZWcoaW5mbywgQ0hCICsgQ0NSMCwgMHg4MCk7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIE1PREUsIDApOworCXdyaXRlX3JlZyhpbmZvLCBDSEIgKyBNT0RFLCAwKTsKKwkKKwkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovIAorCWlycV9kaXNhYmxlKGluZm8sIENIQSwgMHhmZmZmKTsKKwlpcnFfZGlzYWJsZShpbmZvLCBDSEIsIDB4ZmZmZik7CisJcG9ydF9pcnFfZGlzYWJsZShpbmZvLCAweGZmKTsKKwkKKwkvKiBQQ1IgUG9ydCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisJICoKKwkgKiAwNy4uMDQgIERFQ1szLi4wXSBTZXJpYWwgSS9GIHNlbGVjdCBvdXRwdXRzCisJICogMDMgICAgICBvdXRwdXQsIDE9QVVUTyBDVFMgY29udHJvbCBlbmFibGVkCisJICogMDIgICAgICBSSSBSaW5nIEluZGljYXRvciBpbnB1dCAwPWFjdGl2ZQorCSAqIDAxICAgICAgRFNSIGlucHV0IDA9YWN0aXZlCisJICogMDAgICAgICBEVFIgb3V0cHV0IDA9YWN0aXZlCisJICoKKwkgKiAwMDAwIDAxMTAKKwkgKi8gCisJd3JpdGVfcmVnKGluZm8sIFBDUiwgMHgwNik7CisJCisJLyogUFZSIFBvcnQgVmFsdWUgUmVnaXN0ZXIKKwkgKgorCSAqIDA3Li4wNCAgREVDWzMuLjBdIFNlcmlhbCBJL0Ygc2VsZWN0ICgwMDAwPWRpc2FibGVkKQorCSAqIDAzICAgICAgQVVUTyBDVFMgb3V0cHV0IDE9ZW5hYmxlZAorCSAqIDAyICAgICAgUkkgUmluZyBJbmRpY2F0b3IgaW5wdXQKKwkgKiAwMSAgICAgIERTUiBpbnB1dAorCSAqIDAwICAgICAgRFRSIG91dHB1dCAoMT1pbmFjdGl2ZSkKKwkgKgorCSAqIDAwMDAgMDAwMQorCSAqLworLy8Jd3JpdGVfcmVnKGluZm8sIFBWUiwgUFZSX0RUUik7CisJCisJLyogSVBDIEludGVycnVwdCBQb3J0IENvbmZpZ3VyYXRpb24KKwkgKgorCSAqIDA3ICAgICAgVklTIDE9TWFza2VkIGludGVycnVwdHMgdmlzaWJsZQorCSAqIDA2Li4wNSAgUmVzZXJ2ZWQsIDAKKwkgKiAwNC4uMDMgIFNMQSBTbGF2ZSBhZGRyZXNzLCAwMCBpZ25vcmVkCisJICogMDIgICAgICBDQVNNIENhc2NhZGluZyBNb2RlLCAxPWRhaXN5IGNoYWluCisJICogMDEuLjAwICBJQ1sxLi4wXSBJbnRlcnJ1cHQgQ29uZmlnLCAwMT1wdXNoLXB1bGwgb3V0cHV0LCBhY3RpdmUgbG93CisJICoKKwkgKiAwMDAwIDAxMDEKKwkgKi8gCisJd3JpdGVfcmVnKGluZm8sIElQQywgMHgwNSk7Cit9CisKK3ZvaWQgYXN5bmNfbW9kZShNR1NMUENfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKworCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8gCisJaXJxX2Rpc2FibGUoaW5mbywgQ0hBLCAweGZmZmYpOworCWlycV9kaXNhYmxlKGluZm8sIENIQiwgMHhmZmZmKTsKKwlwb3J0X2lycV9kaXNhYmxlKGluZm8sIDB4ZmYpOworCQorCS8qIE1PREUKKwkgKgorCSAqIDA3ICAgICAgUmVzZXJ2ZWQsIDAKKwkgKiAwNiAgICAgIEZSVFMgUlRTIFN0YXRlLCAwPWFjdGl2ZQorCSAqIDA1ICAgICAgRkNUUyBGbG93IENvbnRyb2wgb24gQ1RTCisJICogMDQgICAgICBGTE9OIEZsb3cgQ29udHJvbCBFbmFibGUKKwkgKiAwMyAgICAgIFJBQyBSZWNlaXZlciBBY3RpdmUsIDAgPSBpbmFjdGl2ZQorCSAqIDAyICAgICAgUlRTIDA9QXV0byBSVFMsIDE9bWFudWFsIFJUUworCSAqIDAxICAgICAgVFJTIFRpbWVyIFJlc29sdXRpb24sIDE9NTEyCisJICogMDAgICAgICBUTFAgVGVzdCBMb29wLCAwID0gbm8gbG9vcAorCSAqCisJICogMDAwMCAwMTEwCisJICovIAorCXZhbCA9IDB4MDY7CisJaWYgKGluZm8tPnBhcmFtcy5sb29wYmFjaykKKwkJdmFsIHw9IEJJVDA7CisJCisJLyogcHJlc2VydmUgUlRTIHN0YXRlICovIAorCWlmICghKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykpCisJCXZhbCB8PSBCSVQ2OworCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBNT0RFLCB2YWwpOworCQorCS8qIENDUjAKKwkgKgorCSAqIDA3ICAgICAgUFUgUG93ZXIgVXAsIDE9YWN0aXZlLCAwPXBvd2VyIGRvd24KKwkgKiAwNiAgICAgIE1DRSBNYXN0ZXIgQ2xvY2sgRW5hYmxlLCAxPWVuYWJsZWQKKwkgKiAwNSAgICAgIFJlc2VydmVkLCAwCisJICogMDQuLjAyICBTQ1syLi4wXSBFbmNvZGluZywgMDAwPU5SWgorCSAqIDAxLi4wMCAgU01bMS4uMF0gU2VyaWFsIE1vZGUsIDExPUFzeW5jCisJICoKKwkgKiAxMDAwIDAwMTEKKwkgKi8gCisJd3JpdGVfcmVnKGluZm8sIENIQSArIENDUjAsIDB4ODMpOworCQorCS8qIENDUjEKKwkgKgorCSAqIDA3Li4wNSAgUmVzZXJ2ZWQsIDAKKwkgKiAwNCAgICAgIE9EUyBPdXRwdXQgRHJpdmVyIFNlbGVjdCwgMT1UeEQgaXMgcHVzaC1wdWxsIG91dHB1dAorCSAqIDAzICAgICAgQkNSIEJpdCBDbG9jayBSYXRlLCAxPTE2eAorCSAqIDAyLi4wMCAgQ01bMi4uMF0gQ2xvY2sgTW9kZSwgMTExPUJSRworCSAqCisJICogMDAwMSAxMTExCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IxLCAweDFmKTsKKwkKKwkvKiBDQ1IyIChjaGFubmVsIEEpCisJICoKKwkgKiAwNy4uMDYgIEJHUls5Li44XSBCYXVkIHJhdGUgYml0cyA5Li44CisJICogMDUgICAgICBCREYgQmF1ZCByYXRlIGRpdmlzb3IgZmFjdG9yLCAwPTEsIDE9QkdSIHZhbHVlCisJICogMDQgICAgICBTU0VMIENsb2NrIHNvdXJjZSBzZWxlY3QsIDE9c3VibW9kZSBiCisJICogMDMgICAgICBUT0UgMD1UeENMSyBpcyBpbnB1dCwgMD1UeENMSyBpcyBpbnB1dAorCSAqIDAyICAgICAgUldYIFJlYWQvV3JpdGUgRXhjaGFuZ2UgMD1kaXNhYmxlZAorCSAqIDAxICAgICAgUmVzZXJ2ZWQsIDAKKwkgKiAwMCAgICAgIERJViwgZGF0YSBpbnZlcnNpb24gMD1kaXNhYmxlZCwgMT1lbmFibGVkCisJICoKKwkgKiAwMDAxIDAwMDAKKwkgKi8gCisJd3JpdGVfcmVnKGluZm8sIENIQSArIENDUjIsIDB4MTApOworCQorCS8qIENDUjMKKwkgKgorCSAqIDA3Li4wMSAgUmVzZXJ2ZWQsIDAKKwkgKiAwMCAgICAgIFBTRCBEUExMIFBoYXNlIFNoaWZ0IERpc2FibGUKKwkgKgorCSAqIDAwMDAgMDAwMAorCSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgQ0NSMywgMCk7CisJCisJLyogQ0NSNAorCSAqCisJICogMDcgICAgICBNQ0s0IE1hc3RlciBDbG9jayBEaXZpZGUgYnkgNCwgMT1lbmFibGVkCisJICogMDYgICAgICBFQlJHIEVuaGFuY2VkIEJhdWQgUmF0ZSBHZW5lcmF0b3IgTW9kZSwgMT1lbmFibGVkCisJICogMDUgICAgICBUU1QxIFRlc3QgUGluLCAwPW5vcm1hbCBvcGVyYXRpb24KKwkgKiAwNCAgICAgIElDRCBJdmVydCBDYXJyaWVyIERldGVjdCwgMT1lbmFibGVkIChhY3RpdmUgbG93KQorCSAqIDAzLi4wMCAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqCisJICogMDEwMSAwMDAwCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1I0LCAweDUwKTsKKwltZ3NscGNfc2V0X3JhdGUoaW5mbywgQ0hBLCBpbmZvLT5wYXJhbXMuZGF0YV9yYXRlICogMTYpOworCQorCS8qIERBRk8gRGF0YSBGb3JtYXQKKwkgKgorCSAqIDA3ICAgICAgUmVzZXJ2ZWQsIDAKKwkgKiAwNiAgICAgIFhCUksgdHJhbnNtaXQgYnJlYWssIDA9bm9ybWFsIG9wZXJhdGlvbgorCSAqIDA1ICAgICAgU3RvcCBiaXRzICgwPTEsIDE9MikKKwkgKiAwNC4uMDMgIFBBUlsxLi4wXSBQYXJpdHkgKDAxPW9kZCwgMTA9ZXZlbikKKwkgKiAwMiAgICAgIFBBUkVOIFBhcml0eSBFbmFibGUKKwkgKiAwMS4uMDAgIENITFsxLi4wXSBDaGFyYWN0ZXIgTGVuZ3RoICgwMD04LCAwMT03KQorCSAqCisJICovIAorCXZhbCA9IDB4MDA7CisJaWYgKGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgIT0gOCkKKwkJdmFsIHw9IEJJVDA7CS8qIDcgYml0cyAqLworCWlmIChpbmZvLT5wYXJhbXMuc3RvcF9iaXRzICE9IDEpCisJCXZhbCB8PSBCSVQ1OworCWlmIChpbmZvLT5wYXJhbXMucGFyaXR5ICE9IEFTWU5DX1BBUklUWV9OT05FKQorCXsKKwkJdmFsIHw9IEJJVDI7CS8qIFBhcml0eSBlbmFibGUgKi8KKwkJaWYgKGluZm8tPnBhcmFtcy5wYXJpdHkgPT0gQVNZTkNfUEFSSVRZX09ERCkKKwkJCXZhbCB8PSBCSVQzOworCQllbHNlCisJCQl2YWwgfD0gQklUNDsKKwl9CisJd3JpdGVfcmVnKGluZm8sIENIQSArIERBRk8sIHZhbCk7CisJCisJLyogUkZDIFJ4IEZJRk8gQ29udHJvbAorCSAqCisJICogMDcgICAgICBSZXNlcnZlZCwgMAorCSAqIDA2ICAgICAgRFBTLCAxPXBhcml0eSBiaXQgbm90IHN0b3JlZCBpbiBkYXRhIGJ5dGUKKwkgKiAwNSAgICAgIERYUywgMD1hbGwgZGF0YSBzdG9yZWQgaW4gRklGTyAoaW5jbHVkaW5nIFhPTi9YT0ZGKQorCSAqIDA0ICAgICAgUkZERiBSeCBGSUZPIERhdGEgRm9ybWF0LCAxPXN0YXR1cyBieXRlIHN0b3JlZCBpbiBGSUZPCisJICogMDMuLjAyICBSRlRIWzEuLjBdLCByeCB0aHJlc2hvbGQsIDExPTE2IHN0YXR1cyArIDE2IGRhdGEgYnl0ZQorCSAqIDAxICAgICAgUmVzZXJ2ZWQsIDAKKwkgKiAwMCAgICAgIFRDREUgVGVybWluYXRlIENoYXIgRGV0ZWN0IEVuYWJsZSwgMD1kaXNhYmxlZAorCSAqCisJICogMDEwMSAxMTAwCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBSRkMsIDB4NWMpOworCQorCS8qIFJMQ1IgUmVjZWl2ZSBsZW5ndGggY2hlY2sgcmVnaXN0ZXIKKwkgKgorCSAqIE1heCBmcmFtZSBsZW5ndGggPSAoUkwgKyAxKSAqIDMyCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBSTENSLCAwKTsKKwkKKwkvKiBYQkNIIFRyYW5zbWl0IEJ5dGUgQ291bnQgSGlnaAorCSAqCisJICogMDcgICAgICBETUEgbW9kZSwgMCA9IGludGVycnVwdCBkcml2ZW4KKwkgKiAwNiAgICAgIE5STSwgMD1BQk0gKGlnbm9yZWQpCisJICogMDUgICAgICBDQVMgQ2FycmllciBBdXRvIFN0YXJ0CisJICogMDQgICAgICBYQyBUcmFuc21pdCBDb250aW51b3VzbHkgKGlnbm9yZWQpCisJICogMDMuLjAwICBYQkNbMTAuLjhdIFRyYW5zbWl0IGJ5dGUgY291bnQgYml0cyAxMC4uOAorCSAqCisJICogMDAwMCAwMDAwCisJICovIAorCXZhbCA9IDB4MDA7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX0RDRCkKKwkJdmFsIHw9IEJJVDU7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIFhCQ0gsIHZhbCk7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX0NUUykKKwkJaXJxX2VuYWJsZShpbmZvLCBDSEEsIElSUV9DVFMpOworCQorCS8qIE1PREU6MDMgUkFDIFJlY2VpdmVyIEFjdGl2ZSwgMT1hY3RpdmUgKi8gCisJc2V0X3JlZ19iaXRzKGluZm8sIENIQSArIE1PREUsIEJJVDMpOworCWVuYWJsZV9hdXhjbGsoaW5mbyk7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX0NUUykgeworCQlpcnFfZW5hYmxlKGluZm8sIENIQiwgSVJRX0NUUyk7CisJCS8qIFBWUlszXSAxPUFVVE8gQ1RTIGFjdGl2ZSAqLyAKKwkJc2V0X3JlZ19iaXRzKGluZm8sIENIQSArIFBWUiwgQklUMyk7CisJfSBlbHNlCisJCWNsZWFyX3JlZ19iaXRzKGluZm8sIENIQSArIFBWUiwgQklUMyk7CisJaXJxX2VuYWJsZShpbmZvLCBDSEEsCisJCQkgIElSUV9SWEVPTSArIElSUV9SWEZJRk8gKyBJUlFfQlJFQUtfT04gKyBJUlFfUlhUSU1FICsKKwkJCSAgSVJRX0FMTFNFTlQgKyBJUlFfVFhGSUZPKTsKKwlpc3N1ZV9jb21tYW5kKGluZm8sIENIQSwgQ01EX1RYUkVTRVQgKyBDTURfUlhSRVNFVCk7CisJd2FpdF9jb21tYW5kX2NvbXBsZXRlKGluZm8sIENIQSk7CisJcmVhZF9yZWcxNihpbmZvLCBDSEEgKyBJU1IpOwkvKiBjbGVhciBwZW5kaW5nIElSUXMgKi8KK30KKworLyogU2V0IHRoZSBIRExDIGlkbGUgbW9kZSBmb3IgdGhlIHRyYW5zbWl0dGVyLgorICovCit2b2lkIHR4X3NldF9pZGxlKE1HU0xQQ19JTkZPICppbmZvKQoreworCS8qIE5vdGU6IEVTQ0MyIG9ubHkgc3VwcG9ydHMgZmxhZ3MgYW5kIG9uZSBpZGxlIG1vZGVzICovIAorCWlmIChpbmZvLT5pZGxlX21vZGUgPT0gSERMQ19UWElETEVfRkxBR1MpCisJCXNldF9yZWdfYml0cyhpbmZvLCBDSEEgKyBDQ1IxLCBCSVQzKTsKKwllbHNlCisJCWNsZWFyX3JlZ19iaXRzKGluZm8sIENIQSArIENDUjEsIEJJVDMpOworfQorCisvKiBnZXQgc3RhdGUgb2YgdGhlIFYyNCBzdGF0dXMgKGlucHV0KSBzaWduYWxzLgorICovCit2b2lkIGdldF9zaWduYWxzKE1HU0xQQ19JTkZPICppbmZvKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzID0gMDsKKwkKKwkvKiBwcmVzZXJ2ZSBEVFIgYW5kIFJUUyAqLyAKKwlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSBTZXJpYWxTaWduYWxfRFRSICsgU2VyaWFsU2lnbmFsX1JUUzsKKworCWlmIChyZWFkX3JlZyhpbmZvLCBDSEIgKyBWU1RSKSAmIEJJVDcpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9EQ0Q7CisJaWYgKHJlYWRfcmVnKGluZm8sIENIQiArIFNUQVIpICYgQklUMSkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0NUUzsKKworCXN0YXR1cyA9IHJlYWRfcmVnKGluZm8sIENIQSArIFBWUik7CisJaWYgKCEoc3RhdHVzICYgUFZSX1JJKSkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JJOworCWlmICghKHN0YXR1cyAmIFBWUl9EU1IpKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfRFNSOworfQorCisvKiBTZXQgdGhlIHN0YXRlIG9mIERUUiBhbmQgUlRTIGJhc2VkIG9uIGNvbnRlbnRzIG9mCisgKiBzZXJpYWxfc2lnbmFscyBtZW1iZXIgb2YgZGV2aWNlIGV4dGVuc2lvbi4KKyAqLwordm9pZCBzZXRfc2lnbmFscyhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKworCXZhbCA9IHJlYWRfcmVnKGluZm8sIENIQSArIE1PREUpOworCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfQVNZTkMpIHsKKwkJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykKKwkJCXZhbCAmPSB+QklUNjsKKwkJZWxzZQorCQkJdmFsIHw9IEJJVDY7CisJfSBlbHNlIHsKKwkJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykKKwkJCXZhbCB8PSBCSVQyOworCQllbHNlCisJCQl2YWwgJj0gfkJJVDI7CisJfQorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBNT0RFLCB2YWwpOworCisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RUUikKKwkJY2xlYXJfcmVnX2JpdHMoaW5mbywgQ0hBICsgUFZSLCBQVlJfRFRSKTsKKwllbHNlCisJCXNldF9yZWdfYml0cyhpbmZvLCBDSEEgKyBQVlIsIFBWUl9EVFIpOworfQorCit2b2lkIHJ4X3Jlc2V0X2J1ZmZlcnMoTUdTTFBDX0lORk8gKmluZm8pCit7CisJUlhCVUYgKmJ1ZjsKKwlpbnQgaTsKKworCWluZm8tPnJ4X3B1dCA9IDA7CisJaW5mby0+cnhfZ2V0ID0gMDsKKwlpbmZvLT5yeF9mcmFtZV9jb3VudCA9IDA7CisJZm9yIChpPTAgOyBpIDwgaW5mby0+cnhfYnVmX2NvdW50IDsgaSsrKSB7CisJCWJ1ZiA9IChSWEJVRiopKGluZm8tPnJ4X2J1ZiArIChpICogaW5mby0+cnhfYnVmX3NpemUpKTsKKwkJYnVmLT5zdGF0dXMgPSBidWYtPmNvdW50ID0gMDsKKwl9Cit9CisKKy8qIEF0dGVtcHQgdG8gcmV0dXJuIGEgcmVjZWl2ZWQgSERMQyBmcmFtZQorICogT25seSBmcmFtZXMgcmVjZWl2ZWQgd2l0aG91dCBlcnJvcnMgYXJlIHJldHVybmVkLgorICoKKyAqIFJldHVybnMgMSBpZiBmcmFtZSByZXR1cm5lZCwgb3RoZXJ3aXNlIDAKKyAqLworaW50IHJ4X2dldF9mcmFtZShNR1NMUENfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJUlhCVUYgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgZnJhbWVzaXplID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CisJaW50IHJldHVybl9mcmFtZSA9IDA7CisJCisJaWYgKGluZm8tPnJ4X2ZyYW1lX2NvdW50ID09IDApCisJCXJldHVybiAwOworCisJYnVmID0gKFJYQlVGKikoaW5mby0+cnhfYnVmICsgKGluZm8tPnJ4X2dldCAqIGluZm8tPnJ4X2J1Zl9zaXplKSk7CisKKwlzdGF0dXMgPSBidWYtPnN0YXR1czsKKworCS8qIDA3ICBWRlIgIDE9dmFsaWQgZnJhbWUKKwkgKiAwNiAgUkRPICAxPWRhdGEgb3ZlcnJ1bgorCSAqIDA1ICBDUkMgIDE9T0ssIDA9ZXJyb3IKKwkgKiAwNCAgUkFCICAxPWZyYW1lIGFib3J0ZWQKKwkgKi8KKwlpZiAoKHN0YXR1cyAmIDB4ZjApICE9IDB4QTApIHsKKwkJaWYgKCEoc3RhdHVzICYgQklUNykgfHwgKHN0YXR1cyAmIEJJVDQpKQorCQkJaW5mby0+aWNvdW50LnJ4YWJvcnQrKzsKKwkJZWxzZSBpZiAoc3RhdHVzICYgQklUNikKKwkJCWluZm8tPmljb3VudC5yeG92ZXIrKzsKKwkJZWxzZSBpZiAoIShzdGF0dXMgJiBCSVQ1KSkgeworCQkJaW5mby0+aWNvdW50LnJ4Y3JjKys7CisJCQlpZiAoaW5mby0+cGFyYW1zLmNyY190eXBlICYgSERMQ19DUkNfUkVUVVJOX0VYKQorCQkJCXJldHVybl9mcmFtZSA9IDE7CisJCX0KKwkJZnJhbWVzaXplID0gMDsKKyNpZmRlZiBDT05GSUdfSERMQworCQl7CisJCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGluZm8tPm5ldGRldik7CisJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7CisJCX0KKyNlbmRpZgorCX0gZWxzZQorCQlyZXR1cm5fZnJhbWUgPSAxOworCisJaWYgKHJldHVybl9mcmFtZSkKKwkJZnJhbWVzaXplID0gYnVmLT5jb3VudDsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCkKKwkJcHJpbnRrKCIlcyglZCk6cnhfZ2V0X2ZyYW1lKCVzKSBzdGF0dXM9JTA0WCBzaXplPSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsc3RhdHVzLGZyYW1lc2l6ZSk7CisJCQkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfREFUQSkKKwkJdHJhY2VfYmxvY2soaW5mbywgYnVmLT5kYXRhLCBmcmFtZXNpemUsIDApOwkKKwkJCisJaWYgKGZyYW1lc2l6ZSkgeworCQlpZiAoKGluZm8tPnBhcmFtcy5jcmNfdHlwZSAmIEhETENfQ1JDX1JFVFVSTl9FWCAmJgorCQkgICAgICBmcmFtZXNpemUrMSA+IGluZm8tPm1heF9mcmFtZV9zaXplKSB8fAorCQkgICAgZnJhbWVzaXplID4gaW5mby0+bWF4X2ZyYW1lX3NpemUpCisJCQlpbmZvLT5pY291bnQucnhsb25nKys7CisJCWVsc2UgeworCQkJaWYgKHN0YXR1cyAmIEJJVDUpCisJCQkJaW5mby0+aWNvdW50LnJ4b2srKzsKKworCQkJaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSAmIEhETENfQ1JDX1JFVFVSTl9FWCkgeworCQkJCSooYnVmLT5kYXRhICsgZnJhbWVzaXplKSA9IHN0YXR1cyAmIEJJVDUgPyBSWF9PSzpSWF9DUkNfRVJST1I7CisJCQkJKytmcmFtZXNpemU7CisJCQl9CisKKyNpZmRlZiBDT05GSUdfSERMQworCQkJaWYgKGluZm8tPm5ldGNvdW50KQorCQkJCWhkbGNkZXZfcngoaW5mbywgYnVmLT5kYXRhLCBmcmFtZXNpemUpOworCQkJZWxzZQorI2VuZGlmCisJCQkJbGRpc2NfcmVjZWl2ZV9idWYodHR5LCBidWYtPmRhdGEsIGluZm8tPmZsYWdfYnVmLCBmcmFtZXNpemUpOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWJ1Zi0+c3RhdHVzID0gYnVmLT5jb3VudCA9IDA7CisJaW5mby0+cnhfZnJhbWVfY291bnQtLTsKKwlpbmZvLT5yeF9nZXQrKzsKKwlpZiAoaW5mby0+cnhfZ2V0ID49IGluZm8tPnJ4X2J1Zl9jb3VudCkKKwkJaW5mby0+cnhfZ2V0ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXJldHVybiAxOworfQorCitCT09MRUFOIHJlZ2lzdGVyX3Rlc3QoTUdTTFBDX0lORk8gKmluZm8pCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgcGF0dGVybnNbXSA9IAorCSAgICB7IDB4MDAsIDB4ZmYsIDB4YWEsIDB4NTUsIDB4NjksIDB4OTYsIDB4MGYgfTsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGNvdW50ID0gc2l6ZW9mKHBhdHRlcm5zKSAvIHNpemVvZihwYXR0ZXJuc1swXSk7CisJdW5zaWduZWQgaW50IGk7CisJQk9PTEVBTiByYyA9IFRSVUU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXNldF9kZXZpY2UoaW5mbyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl3cml0ZV9yZWcoaW5mbywgWEFEMSwgcGF0dGVybnNbaV0pOworCQl3cml0ZV9yZWcoaW5mbywgWEFEMiwgcGF0dGVybnNbKGkgKyAxKSAlIGNvdW50XSk7CisJCWlmICgocmVhZF9yZWcoaW5mbywgWEFEMSkgIT0gcGF0dGVybnNbaV0pIHx8IAorCQkgICAgKHJlYWRfcmVnKGluZm8sIFhBRDIpICE9IHBhdHRlcm5zWyhpICsgMSkgJSBjb3VudF0pKSB7CisJCQlyYyA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK0JPT0xFQU4gaXJxX3Rlc3QoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBlbmRfdGltZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJlc2V0X2RldmljZShpbmZvKTsKKworCWluZm8tPnRlc3RpbmdfaXJxID0gVFJVRTsKKwloZGxjX21vZGUoaW5mbyk7CisKKwlpbmZvLT5pcnFfb2NjdXJyZWQgPSBGQUxTRTsKKworCS8qIGluaXQgaGRsYyBtb2RlICovCisKKwlpcnFfZW5hYmxlKGluZm8sIENIQSwgSVJRX1RJTUVSKTsKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgVElNUiwgMCk7CS8qIDUxMiBjeWNsZXMgKi8KKwlpc3N1ZV9jb21tYW5kKGluZm8sIENIQSwgQ01EX1NUQVJUX1RJTUVSKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJZW5kX3RpbWU9MTAwOworCXdoaWxlKGVuZF90aW1lLS0gJiYgIWluZm8tPmlycV9vY2N1cnJlZCkgeworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMCk7CisJfQorCQorCWluZm8tPnRlc3RpbmdfaXJxID0gRkFMU0U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmVzZXRfZGV2aWNlKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQorCXJldHVybiBpbmZvLT5pcnFfb2NjdXJyZWQgPyBUUlVFIDogRkFMU0U7Cit9CisKK2ludCBhZGFwdGVyX3Rlc3QoTUdTTFBDX0lORk8gKmluZm8pCit7CisJaWYgKCFyZWdpc3Rlcl90ZXN0KGluZm8pKSB7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0FkZHJlc3NGYWlsdXJlOworCQlwcmludGsoICIlcyglZCk6UmVnaXN0ZXIgdGVzdCBmYWlsdXJlIGZvciBkZXZpY2UgJXMgQWRkcj0lMDRYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsICh1bnNpZ25lZCBzaG9ydCkoaW5mby0+aW9fYmFzZSkgKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFpcnFfdGVzdChpbmZvKSkgeworCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19JcnFGYWlsdXJlOworCQlwcmludGsoICIlcyglZCk6SW50ZXJydXB0IHRlc3QgZmFpbHVyZSBmb3IgZGV2aWNlICVzIElSUT0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCAodW5zaWduZWQgc2hvcnQpKGluZm8tPmlycV9sZXZlbCkgKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOmRldmljZSAlcyBwYXNzZWQgZGlhZ25vc3RpY3NcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdHJhY2VfYmxvY2soTUdTTFBDX0lORk8gKmluZm8sY29uc3QgY2hhciogZGF0YSwgaW50IGNvdW50LCBpbnQgeG1pdCkKK3sKKwlpbnQgaTsKKwlpbnQgbGluZWNvdW50OworCWlmICh4bWl0KQorCQlwcmludGsoIiVzIHR4IGRhdGE6XG4iLGluZm8tPmRldmljZV9uYW1lKTsKKwllbHNlCisJCXByaW50aygiJXMgcnggZGF0YTpcbiIsaW5mby0+ZGV2aWNlX25hbWUpOworCQkKKwl3aGlsZShjb3VudCkgeworCQlpZiAoY291bnQgPiAxNikKKwkJCWxpbmVjb3VudCA9IDE2OworCQllbHNlCisJCQlsaW5lY291bnQgPSBjb3VudDsKKwkJCQorCQlmb3IoaT0wO2k8bGluZWNvdW50O2krKykKKwkJCXByaW50aygiJTAyWCAiLCh1bnNpZ25lZCBjaGFyKWRhdGFbaV0pOworCQlmb3IoO2k8MTc7aSsrKQorCQkJcHJpbnRrKCIgICAiKTsKKwkJZm9yKGk9MDtpPGxpbmVjb3VudDtpKyspIHsKKwkJCWlmIChkYXRhW2ldPj0wNDAgJiYgZGF0YVtpXTw9MDE3NikKKwkJCQlwcmludGsoIiVjIixkYXRhW2ldKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIi4iKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisJCQorCQlkYXRhICArPSBsaW5lY291bnQ7CisJCWNvdW50IC09IGxpbmVjb3VudDsKKwl9Cit9CisKKy8qIEhETEMgZnJhbWUgdGltZSBvdXQKKyAqIHVwZGF0ZSBzdGF0cyBhbmQgZG8gdHggY29tcGxldGlvbiBwcm9jZXNzaW5nCisgKi8KK3ZvaWQgdHhfdGltZW91dCh1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8qKWNvbnRleHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoICIlcyglZCk6dHhfdGltZW91dCglcylcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJaWYoaW5mby0+dHhfYWN0aXZlICYmCisJICAgaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpIHsKKwkJaW5mby0+aWNvdW50LnR4dGltZW91dCsrOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaW5mby0+dHhfYWN0aXZlID0gMDsKKwlpbmZvLT50eF9jb3VudCA9IGluZm8tPnR4X3B1dCA9IGluZm8tPnR4X2dldCA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkKKyNpZmRlZiBDT05GSUdfSERMQworCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJaGRsY2Rldl90eF9kb25lKGluZm8pOworCWVsc2UKKyNlbmRpZgorCQliaF90cmFuc21pdChpbmZvKTsKK30KKworI2lmZGVmIENPTkZJR19IRExDCisKKy8qKgorICogY2FsbGVkIGJ5IGdlbmVyaWMgSERMQyBsYXllciB3aGVuIHByb3RvY29sIHNlbGVjdGVkIChQUFAsIGZyYW1lIHJlbGF5LCBldGMuKQorICogc2V0IGVuY29kaW5nIGFuZCBmcmFtZSBjaGVjayBzZXF1ZW5jZSAoRkNTKSBvcHRpb25zCisgKgorICogZGV2ICAgICAgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKiBlbmNvZGluZyAgc2VyaWFsIGVuY29kaW5nIHNldHRpbmcKKyAqIHBhcml0eSAgICBGQ1Mgc2V0dGluZworICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IGVuY29kaW5nLAorCQkJICB1bnNpZ25lZCBzaG9ydCBwYXJpdHkpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXVuc2lnbmVkIGNoYXIgIG5ld19lbmNvZGluZzsKKwl1bnNpZ25lZCBzaG9ydCBuZXdfY3JjdHlwZTsKKworCS8qIHJldHVybiBlcnJvciBpZiBUVFkgaW50ZXJmYWNlIG9wZW4gKi8KKwlpZiAoaW5mby0+Y291bnQpCisJCXJldHVybiAtRUJVU1k7CisKKwlzd2l0Y2ggKGVuY29kaW5nKQorCXsKKwljYXNlIEVOQ09ESU5HX05SWjogICAgICAgIG5ld19lbmNvZGluZyA9IEhETENfRU5DT0RJTkdfTlJaOyBicmVhazsKKwljYXNlIEVOQ09ESU5HX05SWkk6ICAgICAgIG5ld19lbmNvZGluZyA9IEhETENfRU5DT0RJTkdfTlJaSV9TUEFDRTsgYnJlYWs7CisJY2FzZSBFTkNPRElOR19GTV9NQVJLOiAgICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTUFSSzsgYnJlYWs7CisJY2FzZSBFTkNPRElOR19GTV9TUEFDRTogICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfU1BBQ0U7IGJyZWFrOworCWNhc2UgRU5DT0RJTkdfTUFOQ0hFU1RFUjogbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19CSVBIQVNFX0xFVkVMOyBicmVhazsKKwlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHBhcml0eSkKKwl7CisJY2FzZSBQQVJJVFlfTk9ORTogICAgICAgICAgICBuZXdfY3JjdHlwZSA9IEhETENfQ1JDX05PTkU7IGJyZWFrOworCWNhc2UgUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVDogbmV3X2NyY3R5cGUgPSBIRExDX0NSQ18xNl9DQ0lUVDsgYnJlYWs7CisJY2FzZSBQQVJJVFlfQ1JDMzJfUFIxX0NDSVRUOiBuZXdfY3JjdHlwZSA9IEhETENfQ1JDXzMyX0NDSVRUOyBicmVhazsKKwlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbmZvLT5wYXJhbXMuZW5jb2RpbmcgPSBuZXdfZW5jb2Rpbmc7CisJaW5mby0+cGFyYW1zLmNyY190eXBlID0gbmV3X2NyY3R5cGU7OworCisJLyogaWYgbmV0d29yayBpbnRlcmZhY2UgdXAsIHJlcHJvZ3JhbSBoYXJkd2FyZSAqLworCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJbWdzbHBjX3Byb2dyYW1faHcoaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZ2VuZXJpYyBIRExDIGxheWVyIHRvIHNlbmQgZnJhbWUKKyAqCisgKiBza2IgIHNvY2tldCBidWZmZXIgY29udGFpbmluZyBIRExDIGZyYW1lCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50ayhLRVJOX0lORk8gIiVzOmhkbGNfeG1pdCglcylcbiIsX19GSUxFX18sZGV2LT5uYW1lKTsKKworCS8qIHN0b3Agc2VuZGluZyB1bnRpbCB0aGlzIGZyYW1lIGNvbXBsZXRlcyAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIGNvcHkgZGF0YSB0byBkZXZpY2UgYnVmZmVycyAqLworCW1lbWNweShpbmZvLT50eF9idWYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCWluZm8tPnR4X2dldCA9IDA7CisJaW5mby0+dHhfcHV0ID0gaW5mby0+dHhfY291bnQgPSBza2ItPmxlbjsKKworCS8qIHVwZGF0ZSBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwlzdGF0cy0+dHhfcGFja2V0cysrOworCXN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCS8qIGRvbmUgd2l0aCBzb2NrZXQgYnVmZmVyLCBzbyBmcmVlIGl0ICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJLyogc2F2ZSBzdGFydCB0aW1lIGZvciB0cmFuc21pdCB0aW1lb3V0IGRldGVjdGlvbiAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogc3RhcnQgaGFyZHdhcmUgdHJhbnNtaXR0ZXIgaWYgbmVjZXNzYXJ5ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmICghaW5mby0+dHhfYWN0aXZlKQorCSAJdHhfc3RhcnQoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgbmV0d29yayBsYXllciB3aGVuIGludGVyZmFjZSBlbmFibGVkCisgKiBjbGFpbSByZXNvdXJjZXMgYW5kIGluaXRpYWxpemUgaGFyZHdhcmUKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXM6aGRsY2Rldl9vcGVuKCVzKVxuIixfX0ZJTEVfXyxkZXYtPm5hbWUpOworCisJLyogZ2VuZXJpYyBIRExDIGxheWVyIG9wZW4gcHJvY2Vzc2luZyAqLworCWlmICgocmMgPSBoZGxjX29wZW4oZGV2KSkpCisJCXJldHVybiByYzsKKworCS8qIGFyYml0cmF0ZSBiZXR3ZWVuIG5ldHdvcmsgYW5kIHR0eSBvcGVucyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJaWYgKGluZm8tPmNvdW50ICE9IDAgfHwgaW5mby0+bmV0Y291bnQgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaGRsY19vcGVuIHJldHVybmluZyBidXN5XG4iLCBkZXYtPm5hbWUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWluZm8tPm5ldGNvdW50PTE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCisJLyogY2xhaW0gcmVzb3VyY2VzIGFuZCBpbml0IGFkYXB0ZXIgKi8KKwlpZiAoKHJjID0gc3RhcnR1cChpbmZvKSkgIT0gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlpbmZvLT5uZXRjb3VudD0wOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBhc3NlcnQgRFRSIGFuZCBSVFMsIGFwcGx5IGhhcmR3YXJlIHNldHRpbmdzICovCisJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CisJbWdzbHBjX3Byb2dyYW1faHcoaW5mbyk7CisKKwkvKiBlbmFibGUgbmV0d29yayBsYXllciB0cmFuc21pdCAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkvKiBpbmZvcm0gZ2VuZXJpYyBIRExDIGxheWVyIG9mIGN1cnJlbnQgRENEIHN0YXR1cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJZ2V0X3NpZ25hbHMoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWhkbGNfc2V0X2NhcnJpZXIoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENELCBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IG5ldHdvcmsgbGF5ZXIgd2hlbiBpbnRlcmZhY2UgaXMgZGlzYWJsZWQKKyAqIHNodXRkb3duIGhhcmR3YXJlIGFuZCByZWxlYXNlIHJlc291cmNlcworICoKKyAqIGRldiAgcG9pbnRlciB0byBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBoZGxjZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlczpoZGxjZGV2X2Nsb3NlKCVzKVxuIixfX0ZJTEVfXyxkZXYtPm5hbWUpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogc2h1dGRvd24gYWRhcHRlciBhbmQgcmVsZWFzZSByZXNvdXJjZXMgKi8KKwlzaHV0ZG93bihpbmZvKTsKKworCWhkbGNfY2xvc2UoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJaW5mby0+bmV0Y291bnQ9MDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgbmV0d29yayBsYXllciB0byBwcm9jZXNzIElPQ1RMIGNhbGwgdG8gbmV0d29yayBkZXZpY2UKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKiBpZnIgIHBvaW50ZXIgdG8gbmV0d29yayBpbnRlcmZhY2UgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqIGNtZCAgSU9DVEwgY29tbWFuZCBjb2RlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihzeW5jX3NlcmlhbF9zZXR0aW5ncyk7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgbmV3X2xpbmU7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgX191c2VyICpsaW5lID0gaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYzsKKwlNR1NMUENfSU5GTyAqaW5mbyA9IGRldl90b19wb3J0KGRldik7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXM6aGRsY2Rldl9pb2N0bCglcylcbiIsX19GSUxFX18sZGV2LT5uYW1lKTsKKworCS8qIHJldHVybiBlcnJvciBpZiBUVFkgaW50ZXJmYWNlIG9wZW4gKi8KKwlpZiAoaW5mby0+Y291bnQpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoY21kICE9IFNJT0NXQU5ERVYpCisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCisJc3dpdGNoKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0dFVF9JRkFDRTogLyogcmV0dXJuIGN1cnJlbnQgc3luY19zZXJpYWxfc2V0dGluZ3MgKi8KKworCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfU1lOQ19TRVJJQUw7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCisJCWZsYWdzID0gaW5mby0+cGFyYW1zLmZsYWdzICYgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1JYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfUlhDX1RYQ1BJTiB8CisJCQkJCSAgICAgIEhETENfRkxBR19UWENfVFhDUElOIHwgSERMQ19GTEFHX1RYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik7CisKKwkJc3dpdGNoIChmbGFncyl7CisJCWNhc2UgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19UWENQSU4pOiBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfRVhUOyBicmVhazsKKwkJY2FzZSAoSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX0JSRyk6ICAgIG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19JTlQ7IGJyZWFrOworCQljYXNlIChIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19UWENfQlJHKTogICAgbmV3X2xpbmUuY2xvY2tfdHlwZSA9IENMT0NLX1RYSU5UOyBicmVhazsKKwkJY2FzZSAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik6IG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19UWEZST01SWDsgYnJlYWs7CisJCWRlZmF1bHQ6IG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19ERUZBVUxUOworCQl9CisKKwkJbmV3X2xpbmUuY2xvY2tfcmF0ZSA9IGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZDsKKwkJbmV3X2xpbmUubG9vcGJhY2sgICA9IGluZm8tPnBhcmFtcy5sb29wYmFjayA/IDE6MDsKKworCQlpZiAoY29weV90b191c2VyKGxpbmUsICZuZXdfbGluZSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX0lGQUNFX1NZTkNfU0VSSUFMOiAvKiBzZXQgc3luY19zZXJpYWxfc2V0dGluZ3MgKi8KKworCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X2xpbmUsIGxpbmUsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJc3dpdGNoIChuZXdfbGluZS5jbG9ja190eXBlKQorCQl7CisJCWNhc2UgQ0xPQ0tfRVhUOiAgICAgIGZsYWdzID0gSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1RYQ1BJTjsgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfVFhGUk9NUlg6IGZsYWdzID0gSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTjsgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfSU5UOiAgICAgIGZsYWdzID0gSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX0JSRzsgICAgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfVFhJTlQ6ICAgIGZsYWdzID0gSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX0JSRzsgICAgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfREVGQVVMVDogIGZsYWdzID0gaW5mby0+cGFyYW1zLmZsYWdzICYKKwkJCQkJICAgICAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfUlhDX0RQTEwgfAorCQkJCQkgICAgICBIRExDX0ZMQUdfUlhDX0JSRyAgICB8IEhETENfRkxBR19SWENfVFhDUElOIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19UWENQSU4gfCBIRExDX0ZMQUdfVFhDX0RQTEwgfAorCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX0JSRyAgICB8IEhETENfRkxBR19UWENfUlhDUElOKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKG5ld19saW5lLmxvb3BiYWNrICE9IDAgJiYgbmV3X2xpbmUubG9vcGJhY2sgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWluZm8tPnBhcmFtcy5mbGFncyAmPSB+KEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1JYQ19EUExMIHwKKwkJCQkJSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfUlhDX1RYQ1BJTiB8CisJCQkJCUhETENfRkxBR19UWENfVFhDUElOIHwgSERMQ19GTEFHX1RYQ19EUExMIHwKKwkJCQkJSERMQ19GTEFHX1RYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik7CisJCWluZm8tPnBhcmFtcy5mbGFncyB8PSBmbGFnczsKKworCQlpbmZvLT5wYXJhbXMubG9vcGJhY2sgPSBuZXdfbGluZS5sb29wYmFjazsKKworCQlpZiAoZmxhZ3MgJiAoSERMQ19GTEFHX1JYQ19CUkcgfCBIRExDX0ZMQUdfVFhDX0JSRykpCisJCQlpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQgPSBuZXdfbGluZS5jbG9ja19yYXRlOworCQllbHNlCisJCQlpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQgPSAwOworCisJCS8qIGlmIG5ldHdvcmsgaW50ZXJmYWNlIHVwLCByZXByb2dyYW0gaGFyZHdhcmUgKi8KKwkJaWYgKGluZm8tPm5ldGNvdW50KQorCQkJbWdzbHBjX3Byb2dyYW1faHcoaW5mbyk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJfQorfQorCisvKioKKyAqIGNhbGxlZCBieSBuZXR3b3JrIGxheWVyIHdoZW4gdHJhbnNtaXQgdGltZW91dCBpcyBkZXRlY3RlZAorICoKKyAqIGRldiAgcG9pbnRlciB0byBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgaGRsY2Rldl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiaGRsY2Rldl90eF90aW1lb3V0KCVzKVxuIixkZXYtPm5hbWUpOworCisJc3RhdHMtPnR4X2Vycm9ycysrOworCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycysrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXR4X3N0b3AoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGRldmljZSBkcml2ZXIgd2hlbiB0cmFuc21pdCBjb21wbGV0ZXMKKyAqIHJlZW5hYmxlIG5ldHdvcmsgbGF5ZXIgdHJhbnNtaXQgaWYgc3RvcHBlZAorICoKKyAqIGluZm8gIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGhkbGNkZXZfdHhfZG9uZShNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChpbmZvLT5uZXRkZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKGluZm8tPm5ldGRldik7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGRldmljZSBkcml2ZXIgd2hlbiBmcmFtZSByZWNlaXZlZAorICogcGFzcyBmcmFtZSB0byBuZXR3b3JrIGxheWVyCisgKgorICogaW5mbyAgcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgaW5mb3JtYXRpb24KKyAqIGJ1ZiAgIHBvaW50ZXIgdG8gYnVmZmVyIGNvbnRpYW5pbmcgZnJhbWUgZGF0YQorICogc2l6ZSAgY291bnQgb2YgZGF0YSBieXRlcyBpbiBidWYKKyAqLworc3RhdGljIHZvaWQgaGRsY2Rldl9yeChNR1NMUENfSU5GTyAqaW5mbywgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+bmV0ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoImhkbGNkZXZfcngoJXMpXG4iLGRldi0+bmFtZSk7CisKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogY2FuJ3QgYWxsb2Mgc2tiLCBkcm9wcGluZyBwYWNrZXRcbiIsIGRldi0+bmFtZSk7CisJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisKKwltZW1jcHkoc2tiX3B1dChza2IsIHNpemUpLGJ1ZixzaXplKTsKKworCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBpbmZvLT5uZXRkZXYpOworCisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gc2l6ZTsKKworCW5ldGlmX3J4KHNrYik7CisKKwlpbmZvLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworfQorCisvKioKKyAqIGNhbGxlZCBieSBkZXZpY2UgZHJpdmVyIHdoZW4gYWRkaW5nIGRldmljZSBpbnN0YW5jZQorICogZG8gZ2VuZXJpYyBIRExDIGluaXRpYWxpemF0aW9uCisgKgorICogaW5mbyAgcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgaW5mb3JtYXRpb24KKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBoZGxjZGV2X2luaXQoTUdTTFBDX0lORk8gKmluZm8pCit7CisJaW50IHJjOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaGRsY19kZXZpY2UgKmhkbGM7CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBuZXR3b3JrIGFuZCBIRExDIGxheWVyIG9iamVjdHMgKi8KKworCWlmICghKGRldiA9IGFsbG9jX2hkbGNkZXYoaW5mbykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6aGRsYyBkZXZpY2UgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLF9fRklMRV9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogZm9yIG5ldHdvcmsgbGF5ZXIgcmVwb3J0aW5nIHB1cnBvc2VzIG9ubHkgKi8KKwlkZXYtPmJhc2VfYWRkciA9IGluZm8tPmlvX2Jhc2U7CisJZGV2LT5pcnEgICAgICAgPSBpbmZvLT5pcnFfbGV2ZWw7CisKKwkvKiBuZXR3b3JrIGxheWVyIGNhbGxiYWNrcyBhbmQgc2V0dGluZ3MgKi8KKwlkZXYtPmRvX2lvY3RsICAgICAgID0gaGRsY2Rldl9pb2N0bDsKKwlkZXYtPm9wZW4gICAgICAgICAgID0gaGRsY2Rldl9vcGVuOworCWRldi0+c3RvcCAgICAgICAgICAgPSBoZGxjZGV2X2Nsb3NlOworCWRldi0+dHhfdGltZW91dCAgICAgPSBoZGxjZGV2X3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IDEwKkhaOworCWRldi0+dHhfcXVldWVfbGVuICAgPSA1MDsKKworCS8qIGdlbmVyaWMgSERMQyBsYXllciBjYWxsYmFja3MgYW5kIHNldHRpbmdzICovCisJaGRsYyAgICAgICAgID0gZGV2X3RvX2hkbGMoZGV2KTsKKwloZGxjLT5hdHRhY2ggPSBoZGxjZGV2X2F0dGFjaDsKKwloZGxjLT54bWl0ICAgPSBoZGxjZGV2X3htaXQ7CisKKwkvKiByZWdpc3RlciBvYmplY3RzIHdpdGggSERMQyBsYXllciAqLworCWlmICgocmMgPSByZWdpc3Rlcl9oZGxjX2RldmljZShkZXYpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczp1bmFibGUgdG8gcmVnaXN0ZXIgaGRsYyBkZXZpY2VcbiIsX19GSUxFX18pOworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gcmM7CisJfQorCisJaW5mby0+bmV0ZGV2ID0gZGV2OworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGxlZCBieSBkZXZpY2UgZHJpdmVyIHdoZW4gcmVtb3ZpbmcgZGV2aWNlIGluc3RhbmNlCisgKiBkbyBnZW5lcmljIEhETEMgY2xlYW51cAorICoKKyAqIGluZm8gIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGhkbGNkZXZfZXhpdChNR1NMUENfSU5GTyAqaW5mbykKK3sKKwl1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKGluZm8tPm5ldGRldik7CisJZnJlZV9uZXRkZXYoaW5mby0+bmV0ZGV2KTsKKwlpbmZvLT5uZXRkZXYgPSBOVUxMOworfQorCisjZW5kaWYgLyogQ09ORklHX0hETEMgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BwZGV2LmMgYi9kcml2ZXJzL2NoYXIvcHBkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWRhMDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3BwZGV2LmMKQEAgLTAsMCArMSw4MjQgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2NoYXIvcHBkZXYuYworICoKKyAqIFRoaXMgaXMgdGhlIGNvZGUgYmVoaW5kIC9kZXYvcGFycG9ydCogLS0gaXQgYWxsb3dzIGEgdXNlci1zcGFjZQorICogYXBwbGljYXRpb24gdG8gdXNlIHRoZSBwYXJwb3J0IHN1YnN5c3RlbS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCwgMjAwMiBUaW0gV2F1Z2ggPHRpbUBjeWJlcmVsay5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBIC9kZXYvcGFycG9ydHggZGV2aWNlIG5vZGUgcmVwcmVzZW50cyBhbiBhcmJpdHJhcnkgZGV2aWNlCisgKiBvbiBwb3J0ICd4Jy4gIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUgcG9zc2libGU6CisgKgorICogb3BlbgkJZG8gbm90aGluZywgc2V0IHVwIGRlZmF1bHQgSUVFRSAxMjg0IHByb3RvY29sIHRvIGJlIENPTVBBVAorICogY2xvc2UJcmVsZWFzZSBwb3J0IGFuZCB1bnJlZ2lzdGVyIGRldmljZSAoaWYgbmVjZXNzYXJ5KQorICogaW9jdGwKKyAqICAgRVhDTAlyZWdpc3RlciBkZXZpY2UgZXhjbHVzaXZlbHkgKG1heSBmYWlsKQorICogICBDTEFJTQkocmVnaXN0ZXIgZGV2aWNlIGZpcnN0IHRpbWUpIHBhcnBvcnRfY2xhaW1fb3JfYmxvY2sKKyAqICAgUkVMRUFTRQlwYXJwb3J0X3JlbGVhc2UKKyAqICAgU0VUTU9ERQlzZXQgdGhlIElFRUUgMTI4NCBwcm90b2NvbCB0byB1c2UgZm9yIHJlYWQvd3JpdGUKKyAqICAgU0VUUEhBU0UJc2V0IHRoZSBJRUVFIDEyODQgcGhhc2Ugb2YgYSBwYXJ0aWN1bGFyIG1vZGUuICBOb3QgdG8gYmUKKyAqICAgICAgICAgICAgICBjb25mdXNlZCB3aXRoIGlvY3RsKGZkLCBTRVRQSEFTRVIsICZzdHVuKS4gOy0pCisgKiAgIERBVEFESVIJZGF0YV9mb3J3YXJkIC8gZGF0YV9yZXZlcnNlCisgKiAgIFdEQVRBCXdyaXRlX2RhdGEKKyAqICAgUkRBVEEJcmVhZF9kYXRhCisgKiAgIFdDT05UUk9MCXdyaXRlX2NvbnRyb2wKKyAqICAgUkNPTlRST0wJcmVhZF9jb250cm9sCisgKiAgIEZDT05UUk9MCWZyb2JfY29udHJvbAorICogICBSU1RBVFVTCXJlYWRfc3RhdHVzCisgKiAgIE5FR09UCXBhcnBvcnRfbmVnb3RpYXRlCisgKiAgIFlJRUxECXBhcnBvcnRfeWllbGRfYmxvY2tpbmcKKyAqICAgV0NUTE9OSVJRCW9uIGludGVycnVwdCwgc2V0IGNvbnRyb2wgbGluZXMKKyAqICAgQ0xSSVJRCWNsZWFyIChhbmQgcmV0dXJuKSBpbnRlcnJ1cHQgY291bnQKKyAqICAgU0VUVElNRQlzZXRzIGRldmljZSB0aW1lb3V0IChzdHJ1Y3QgdGltZXZhbCkKKyAqICAgR0VUVElNRQlnZXRzIGRldmljZSB0aW1lb3V0IChzdHJ1Y3QgdGltZXZhbCkKKyAqICAgR0VUTU9ERVMJZ2V0cyBoYXJkd2FyZSBzdXBwb3J0ZWQgbW9kZXMgKHVuc2lnbmVkIGludCkKKyAqICAgR0VUTU9ERQlnZXRzIHRoZSBjdXJyZW50IElFRUUxMjg0IG1vZGUKKyAqICAgR0VUUEhBU0UgICBnZXRzIHRoZSBjdXJyZW50IElFRUUxMjg0IHBoYXNlCisgKiAgIEdFVEZMQUdTICAgZ2V0cyBjdXJyZW50ICh1c2VyLXZpc2libGUpIGZsYWdzCisgKiAgIFNFVEZMQUdTICAgc2V0cyBjdXJyZW50ICh1c2VyLXZpc2libGUpIGZsYWdzCisgKiByZWFkL3dyaXRlCXJlYWQgb3Igd3JpdGUgaW4gY3VycmVudCBJRUVFIDEyODQgcHJvdG9jb2wKKyAqIHNlbGVjdAl3YWl0IGZvciBpbnRlcnJ1cHQgKGluIHJlYWRmZHMpCisgKgorICogQ2hhbmdlczoKKyAqIEFkZGVkIFNFVFRJTUUvR0VUVElNRSBpb2N0bCwgRnJlZCBCYXJuZXMsIDE5OTkuCisgKgorICogQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+IDIwMDAvMDgvMjUKKyAqIC0gT24gZXJyb3IsIGNvcHlfZnJvbV91c2VyIGFuZCBjb3B5X3RvX3VzZXIgZG8gbm90IHJldHVybiAtRUZBVUxULAorICogICBUaGV5IHJldHVybiB0aGUgcG9zaXRpdmUgbnVtYmVyIG9mIGJ5dGVzICpub3QqIGNvcGllZCBkdWUgdG8gYWRkcmVzcworICogICBzcGFjZSBlcnJvcnMuCisgKgorICogQWRkZWQgR0VUTU9ERVMvR0VUTU9ERS9HRVRQSEFTRSBpb2N0bHMsIEZyZWQgQmFybmVzIDxmcm1iMkB1a2MuYWMudWs+LCAwMy8wMS8yMDAxLgorICogQWRkZWQgR0VURkxBR1MvU0VURkxBR1MgaW9jdGxzLCBGcmVkIEJhcm5lcywgMDQvMjAwMQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BwZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2RlZmluZSBQUF9WRVJTSU9OICJwcGRldjogdXNlci1zcGFjZSBwYXJhbGxlbCBwb3J0IGRyaXZlciIKKyNkZWZpbmUgQ0hSREVWICJwcGRldiIKKworc3RydWN0IHBwX3N0cnVjdCB7CisJc3RydWN0IHBhcmRldmljZSAqIHBkZXY7CisJd2FpdF9xdWV1ZV9oZWFkX3QgaXJxX3dhaXQ7CisJYXRvbWljX3QgaXJxYzsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJaW50IGlycXJlc3BvbnNlOworCXVuc2lnbmVkIGNoYXIgaXJxY3RsOworCXN0cnVjdCBpZWVlMTI4NF9pbmZvIHN0YXRlOworCXN0cnVjdCBpZWVlMTI4NF9pbmZvIHNhdmVkX3N0YXRlOworCWxvbmcgZGVmYXVsdF9pbmFjdGl2aXR5OworfTsKKworLyogcHBfc3RydWN0LmZsYWdzIGJpdGZpZWxkcyAqLworI2RlZmluZSBQUF9DTEFJTUVEICAgICgxPDwwKQorI2RlZmluZSBQUF9FWENMICAgICAgICgxPDwxKQorCisvKiBPdGhlciBjb25zdGFudHMgKi8KKyNkZWZpbmUgUFBfSU5URVJSVVBUX1RJTUVPVVQgKDEwICogSFopIC8qIDEwcyAqLworI2RlZmluZSBQUF9CVUZGRVJfU0laRSAxMDI0CisjZGVmaW5lIFBBUkRFVklDRV9NQVggOAorCisvKiBST1VORF9VUCBtYWNybyBmcm9tIGZzL3NlbGVjdC5jICovCisjZGVmaW5lIFJPVU5EX1VQKHgseSkgKCgoeCkrKHkpLTEpLyh5KSkKKworc3RhdGljIGlubGluZSB2b2lkIHBwX2VuYWJsZV9pcnEgKHN0cnVjdCBwcF9zdHJ1Y3QgKnBwKQoreworCXN0cnVjdCBwYXJwb3J0ICpwb3J0ID0gcHAtPnBkZXYtPnBvcnQ7CisJcG9ydC0+b3BzLT5lbmFibGVfaXJxIChwb3J0KTsKK30KKworc3RhdGljIHNzaXplX3QgcHBfcmVhZCAoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJbG9mZl90ICogcHBvcykKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBwcF9zdHJ1Y3QgKnBwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKiBrYnVmZmVyOworCXNzaXplX3QgYnl0ZXNfcmVhZCA9IDA7CisJc3RydWN0IHBhcnBvcnQgKnBwb3J0OworCWludCBtb2RlOworCisJaWYgKCEocHAtPmZsYWdzICYgUFBfQ0xBSU1FRCkpIHsKKwkJLyogRG9uJ3QgaGF2ZSB0aGUgcG9ydCBjbGFpbWVkICovCisJCXByaW50ayAoS0VSTl9ERUJVRyBDSFJERVYgIiV4OiBjbGFpbSB0aGUgcG9ydCBmaXJzdFxuIiwKKwkJCW1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVHJpdmlhbCBjYXNlLiAqLworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWtidWZmZXIgPSBrbWFsbG9jKG1pbl90KHNpemVfdCwgY291bnQsIFBQX0JVRkZFUl9TSVpFKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrYnVmZmVyKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwcG9ydCA9IHBwLT5wZGV2LT5wb3J0OworCW1vZGUgPSBwcG9ydC0+aWVlZTEyODQubW9kZSAmIH4oSUVFRTEyODRfREVWSUNFSUQgfCBJRUVFMTI4NF9BRERSKTsKKworCXBhcnBvcnRfc2V0X3RpbWVvdXQgKHBwLT5wZGV2LAorCQkJICAgICAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spID8KKwkJCSAgICAgUEFSUE9SVF9JTkFDVElWSVRZX09fTk9OQkxPQ0sgOgorCQkJICAgICBwcC0+ZGVmYXVsdF9pbmFjdGl2aXR5KTsKKworCXdoaWxlIChieXRlc19yZWFkID09IDApIHsKKwkJc3NpemVfdCBuZWVkID0gbWluX3QodW5zaWduZWQgbG9uZywgY291bnQsIFBQX0JVRkZFUl9TSVpFKTsKKworCQlpZiAobW9kZSA9PSBJRUVFMTI4NF9NT0RFX0VQUCkgeworCQkJLyogdmFyaW91cyBzcGVjaWFscyBmb3IgRVBQIG1vZGUgKi8KKwkJCWludCBmbGFncyA9IDA7CisJCQlzaXplX3QgKCpmbikoc3RydWN0IHBhcnBvcnQgKiwgdm9pZCAqLCBzaXplX3QsIGludCk7CisKKwkJCWlmIChwcC0+ZmxhZ3MgJiBQUF9XOTEyODRQSUMpIHsKKwkJCQlmbGFncyB8PSBQQVJQT1JUX1c5MTI4NFBJQzsKKwkJCX0KKwkJCWlmIChwcC0+ZmxhZ3MgJiBQUF9GQVNUUkVBRCkgeworCQkJCWZsYWdzIHw9IFBBUlBPUlRfRVBQX0ZBU1Q7CisJCQl9CisJCQlpZiAocHBvcnQtPmllZWUxMjg0Lm1vZGUgJiBJRUVFMTI4NF9BRERSKSB7CisJCQkJZm4gPSBwcG9ydC0+b3BzLT5lcHBfcmVhZF9hZGRyOworCQkJfSBlbHNlIHsKKwkJCQlmbiA9IHBwb3J0LT5vcHMtPmVwcF9yZWFkX2RhdGE7CisJCQl9CisJCQlieXRlc19yZWFkID0gKCpmbikocHBvcnQsIGtidWZmZXIsIG5lZWQsIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCWJ5dGVzX3JlYWQgPSBwYXJwb3J0X3JlYWQgKHBwb3J0LCBrYnVmZmVyLCBuZWVkKTsKKwkJfQorCisJCWlmIChieXRlc19yZWFkICE9IDApCisJCQlicmVhazsKKworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCWJ5dGVzX3JlYWQgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKSB7CisJCQlieXRlc19yZWFkID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisKKwlwYXJwb3J0X3NldF90aW1lb3V0IChwcC0+cGRldiwgcHAtPmRlZmF1bHRfaW5hY3Rpdml0eSk7CisKKwlpZiAoYnl0ZXNfcmVhZCA+IDAgJiYgY29weV90b191c2VyIChidWYsIGtidWZmZXIsIGJ5dGVzX3JlYWQpKQorCQlieXRlc19yZWFkID0gLUVGQVVMVDsKKworCWtmcmVlIChrYnVmZmVyKTsKKwlwcF9lbmFibGVfaXJxIChwcCk7CisJcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBwX3dyaXRlIChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBwcF9zdHJ1Y3QgKnBwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKiBrYnVmZmVyOworCXNzaXplX3QgYnl0ZXNfd3JpdHRlbiA9IDA7CisJc3NpemVfdCB3cm90ZTsKKwlpbnQgbW9kZTsKKwlzdHJ1Y3QgcGFycG9ydCAqcHBvcnQ7CisKKwlpZiAoIShwcC0+ZmxhZ3MgJiBQUF9DTEFJTUVEKSkgeworCQkvKiBEb24ndCBoYXZlIHRoZSBwb3J0IGNsYWltZWQgKi8KKwkJcHJpbnRrIChLRVJOX0RFQlVHIENIUkRFViAiJXg6IGNsYWltIHRoZSBwb3J0IGZpcnN0XG4iLAorCQkJbWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlrYnVmZmVyID0ga21hbGxvYyhtaW5fdChzaXplX3QsIGNvdW50LCBQUF9CVUZGRVJfU0laRSksIEdGUF9LRVJORUwpOworCWlmICgha2J1ZmZlcikgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcHBvcnQgPSBwcC0+cGRldi0+cG9ydDsKKwltb2RlID0gcHBvcnQtPmllZWUxMjg0Lm1vZGUgJiB+KElFRUUxMjg0X0RFVklDRUlEIHwgSUVFRTEyODRfQUREUik7CisKKwlwYXJwb3J0X3NldF90aW1lb3V0IChwcC0+cGRldiwKKwkJCSAgICAgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSA/CisJCQkgICAgIFBBUlBPUlRfSU5BQ1RJVklUWV9PX05PTkJMT0NLIDoKKwkJCSAgICAgcHAtPmRlZmF1bHRfaW5hY3Rpdml0eSk7CisKKwl3aGlsZSAoYnl0ZXNfd3JpdHRlbiA8IGNvdW50KSB7CisJCXNzaXplX3QgbiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNvdW50IC0gYnl0ZXNfd3JpdHRlbiwgUFBfQlVGRkVSX1NJWkUpOworCisJCWlmIChjb3B5X2Zyb21fdXNlciAoa2J1ZmZlciwgYnVmICsgYnl0ZXNfd3JpdHRlbiwgbikpIHsKKwkJCWJ5dGVzX3dyaXR0ZW4gPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHBwLT5mbGFncyAmIFBQX0ZBU1RXUklURSkgJiYgKG1vZGUgPT0gSUVFRTEyODRfTU9ERV9FUFApKSB7CisJCQkvKiBkbyBhIGZhc3QgRVBQIHdyaXRlICovCisJCQlpZiAocHBvcnQtPmllZWUxMjg0Lm1vZGUgJiBJRUVFMTI4NF9BRERSKSB7CisJCQkJd3JvdGUgPSBwcG9ydC0+b3BzLT5lcHBfd3JpdGVfYWRkciAocHBvcnQsCisJCQkJCWtidWZmZXIsIG4sIFBBUlBPUlRfRVBQX0ZBU1QpOworCQkJfSBlbHNlIHsKKwkJCQl3cm90ZSA9IHBwb3J0LT5vcHMtPmVwcF93cml0ZV9kYXRhIChwcG9ydCwKKwkJCQkJa2J1ZmZlciwgbiwgUEFSUE9SVF9FUFBfRkFTVCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl3cm90ZSA9IHBhcnBvcnRfd3JpdGUgKHBwLT5wZGV2LT5wb3J0LCBrYnVmZmVyLCBuKTsKKwkJfQorCisJCWlmICh3cm90ZSA8PSAwKSB7CisJCQlpZiAoIWJ5dGVzX3dyaXR0ZW4pIHsKKwkJCQlieXRlc193cml0dGVuID0gd3JvdGU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWJ5dGVzX3dyaXR0ZW4gKz0gd3JvdGU7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlpZiAoIWJ5dGVzX3dyaXR0ZW4pCisJCQkJYnl0ZXNfd3JpdHRlbiA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpIHsKKwkJCWlmICghYnl0ZXNfd3JpdHRlbikgeworCQkJCWJ5dGVzX3dyaXR0ZW4gPSAtRUlOVFI7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWNvbmRfcmVzY2hlZCgpOworCX0KKworCXBhcnBvcnRfc2V0X3RpbWVvdXQgKHBwLT5wZGV2LCBwcC0+ZGVmYXVsdF9pbmFjdGl2aXR5KTsKKworCWtmcmVlIChrYnVmZmVyKTsKKwlwcF9lbmFibGVfaXJxIChwcCk7CisJcmV0dXJuIGJ5dGVzX3dyaXR0ZW47Cit9CisKK3N0YXRpYyB2b2lkIHBwX2lycSAoaW50IGlycSwgdm9pZCAqIHByaXZhdGUsIHN0cnVjdCBwdF9yZWdzICogdW51c2VkKQoreworCXN0cnVjdCBwcF9zdHJ1Y3QgKiBwcCA9IChzdHJ1Y3QgcHBfc3RydWN0ICopIHByaXZhdGU7CisKKwlpZiAocHAtPmlycXJlc3BvbnNlKSB7CisJCXBhcnBvcnRfd3JpdGVfY29udHJvbCAocHAtPnBkZXYtPnBvcnQsIHBwLT5pcnFjdGwpOworCQlwcC0+aXJxcmVzcG9uc2UgPSAwOworCX0KKworCWF0b21pY19pbmMgKCZwcC0+aXJxYyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICgmcHAtPmlycV93YWl0KTsKK30KKworc3RhdGljIGludCByZWdpc3Rlcl9kZXZpY2UgKGludCBtaW5vciwgc3RydWN0IHBwX3N0cnVjdCAqcHApCit7CisJc3RydWN0IHBhcnBvcnQgKnBvcnQ7CisJc3RydWN0IHBhcmRldmljZSAqIHBkZXYgPSBOVUxMOworCWNoYXIgKm5hbWU7CisJaW50IGZsOworCisJbmFtZSA9IGttYWxsb2MgKHN0cmxlbiAoQ0hSREVWKSArIDMsIEdGUF9LRVJORUwpOworCWlmIChuYW1lID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc3ByaW50ZiAobmFtZSwgQ0hSREVWICIleCIsIG1pbm9yKTsKKworCXBvcnQgPSBwYXJwb3J0X2ZpbmRfbnVtYmVyIChtaW5vcik7CisJaWYgKCFwb3J0KSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogbm8gYXNzb2NpYXRlZCBwb3J0IVxuIiwgbmFtZSk7CisJCWtmcmVlIChuYW1lKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlmbCA9IChwcC0+ZmxhZ3MgJiBQUF9FWENMKSA/IFBBUlBPUlRfRkxBR19FWENMIDogMDsKKwlwZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UgKHBvcnQsIG5hbWUsIE5VTEwsCisJCQkJCU5VTEwsIHBwX2lycSwgZmwsIHBwKTsKKwlwYXJwb3J0X3B1dF9wb3J0IChwb3J0KTsKKworCWlmICghcGRldikgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UhXG4iLCBuYW1lKTsKKwkJa2ZyZWUgKG5hbWUpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXBwLT5wZGV2ID0gcGRldjsKKwlwcmludGsgKEtFUk5fREVCVUcgIiVzOiByZWdpc3RlcmVkIHBhcmRldmljZVxuIiwgbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIGllZWUxMjg0X3BoYXNlIGluaXRfcGhhc2UgKGludCBtb2RlKQoreworCXN3aXRjaCAobW9kZSAmIH4oSUVFRTEyODRfREVWSUNFSUQKKwkJCSB8IElFRUUxMjg0X0FERFIpKSB7CisJY2FzZSBJRUVFMTI4NF9NT0RFX05JQkJMRToKKwljYXNlIElFRUUxMjg0X01PREVfQllURToKKwkJcmV0dXJuIElFRUUxMjg0X1BIX1JFVl9JRExFOworCX0KKwlyZXR1cm4gSUVFRTEyODRfUEhfRldEX0lETEU7Cit9CisKK3N0YXRpYyBpbnQgcHBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBwcF9zdHJ1Y3QgKnBwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwYXJwb3J0ICogcG9ydDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCS8qIEZpcnN0IGhhbmRsZSB0aGUgY2FzZXMgdGhhdCBkb24ndCB0YWtlIGFyZ3VtZW50cy4gKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBDTEFJTToKKwkgICAgeworCQlzdHJ1Y3QgaWVlZTEyODRfaW5mbyAqaW5mbzsKKwkJaW50IHJldDsKKworCQlpZiAocHAtPmZsYWdzICYgUFBfQ0xBSU1FRCkgeworCQkJcHJpbnRrIChLRVJOX0RFQlVHIENIUkRFVgorCQkJCSIleDogeW91J3ZlIGFscmVhZHkgZ290IGl0IVxuIiwgbWlub3IpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBEZWZlcnJlZCBkZXZpY2UgcmVnaXN0cmF0aW9uLiAqLworCQlpZiAoIXBwLT5wZGV2KSB7CisJCQlpbnQgZXJyID0gcmVnaXN0ZXJfZGV2aWNlIChtaW5vciwgcHApOworCQkJaWYgKGVycikgeworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKworCQlyZXQgPSBwYXJwb3J0X2NsYWltX29yX2Jsb2NrIChwcC0+cGRldik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlwcC0+ZmxhZ3MgfD0gUFBfQ0xBSU1FRDsKKworCQkvKiBGb3IgaW50ZXJydXB0LXJlcG9ydGluZyB0byB3b3JrLCB3ZSBuZWVkIHRvIGJlCisJCSAqIGluZm9ybWVkIG9mIGVhY2ggaW50ZXJydXB0LiAqLworCQlwcF9lbmFibGVfaXJxIChwcCk7CisKKwkJLyogV2UgbWF5IG5lZWQgdG8gZml4IHVwIHRoZSBzdGF0ZSBtYWNoaW5lLiAqLworCQlpbmZvID0gJnBwLT5wZGV2LT5wb3J0LT5pZWVlMTI4NDsKKwkJcHAtPnNhdmVkX3N0YXRlLm1vZGUgPSBpbmZvLT5tb2RlOworCQlwcC0+c2F2ZWRfc3RhdGUucGhhc2UgPSBpbmZvLT5waGFzZTsKKwkJaW5mby0+bW9kZSA9IHBwLT5zdGF0ZS5tb2RlOworCQlpbmZvLT5waGFzZSA9IHBwLT5zdGF0ZS5waGFzZTsKKwkJcHAtPmRlZmF1bHRfaW5hY3Rpdml0eSA9IHBhcnBvcnRfc2V0X3RpbWVvdXQgKHBwLT5wZGV2LCAwKTsKKwkJcGFycG9ydF9zZXRfdGltZW91dCAocHAtPnBkZXYsIHBwLT5kZWZhdWx0X2luYWN0aXZpdHkpOworCisJCXJldHVybiAwOworCSAgICB9CisJY2FzZSBQUEVYQ0w6CisJCWlmIChwcC0+cGRldikgeworCQkJcHJpbnRrIChLRVJOX0RFQlVHIENIUkRFViAiJXg6IHRvbyBsYXRlIGZvciBQUEVYQ0w7ICIKKwkJCQkiYWxyZWFkeSByZWdpc3RlcmVkXG4iLCBtaW5vcik7CisJCQlpZiAocHAtPmZsYWdzICYgUFBfRVhDTCkKKwkJCQkvKiBCdXQgaXQncyBub3QgcmVhbGx5IGFuIGVycm9yLiAqLworCQkJCXJldHVybiAwOworCQkJLyogVGhlcmUncyBubyBjaGFuY2Ugb2YgbWFraW5nIHRoZSBkcml2ZXIgaGFwcHkuICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIEp1c3QgcmVtZW1iZXIgdG8gcmVnaXN0ZXIgdGhlIGRldmljZSBleGNsdXNpdmVseQorCQkgKiB3aGVuIHdlIGZpbmFsbHkgZG8gdGhlIHJlZ2lzdHJhdGlvbi4gKi8KKwkJcHAtPmZsYWdzIHw9IFBQX0VYQ0w7CisJCXJldHVybiAwOworCWNhc2UgUFBTRVRNT0RFOgorCSAgICB7CisJCWludCBtb2RlOworCQlpZiAoY29weV9mcm9tX3VzZXIgKCZtb2RlLCBhcmdwLCBzaXplb2YgKG1vZGUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQkvKiBGSVhNRTogdmFsaWRhdGUgbW9kZSAqLworCQlwcC0+c3RhdGUubW9kZSA9IG1vZGU7CisJCXBwLT5zdGF0ZS5waGFzZSA9IGluaXRfcGhhc2UgKG1vZGUpOworCisJCWlmIChwcC0+ZmxhZ3MgJiBQUF9DTEFJTUVEKSB7CisJCQlwcC0+cGRldi0+cG9ydC0+aWVlZTEyODQubW9kZSA9IG1vZGU7CisJCQlwcC0+cGRldi0+cG9ydC0+aWVlZTEyODQucGhhc2UgPSBwcC0+c3RhdGUucGhhc2U7CisJCX0KKworCQlyZXR1cm4gMDsKKwkgICAgfQorCWNhc2UgUFBHRVRNT0RFOgorCSAgICB7CisJCWludCBtb2RlOworCisJCWlmIChwcC0+ZmxhZ3MgJiBQUF9DTEFJTUVEKSB7CisJCQltb2RlID0gcHAtPnBkZXYtPnBvcnQtPmllZWUxMjg0Lm1vZGU7CisJCX0gZWxzZSB7CisJCQltb2RlID0gcHAtPnN0YXRlLm1vZGU7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJm1vZGUsIHNpemVvZiAobW9kZSkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gMDsKKwkgICAgfQorCWNhc2UgUFBTRVRQSEFTRToKKwkgICAgeworCQlpbnQgcGhhc2U7CisJCWlmIChjb3B5X2Zyb21fdXNlciAoJnBoYXNlLCBhcmdwLCBzaXplb2YgKHBoYXNlKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCS8qIEZJWE1FOiB2YWxpZGF0ZSBwaGFzZSAqLworCQlwcC0+c3RhdGUucGhhc2UgPSBwaGFzZTsKKworCQlpZiAocHAtPmZsYWdzICYgUFBfQ0xBSU1FRCkgeworCQkJcHAtPnBkZXYtPnBvcnQtPmllZWUxMjg0LnBoYXNlID0gcGhhc2U7CisJCX0KKworCQlyZXR1cm4gMDsKKwkgICAgfQorCWNhc2UgUFBHRVRQSEFTRToKKwkgICAgeworCQlpbnQgcGhhc2U7CisKKwkJaWYgKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpIHsKKwkJCXBoYXNlID0gcHAtPnBkZXYtPnBvcnQtPmllZWUxMjg0LnBoYXNlOworCQl9IGVsc2UgeworCQkJcGhhc2UgPSBwcC0+c3RhdGUucGhhc2U7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJnBoYXNlLCBzaXplb2YgKHBoYXNlKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiAwOworCSAgICB9CisJY2FzZSBQUEdFVE1PREVTOgorCSAgICB7CisJCXVuc2lnbmVkIGludCBtb2RlczsKKworCQlwb3J0ID0gcGFycG9ydF9maW5kX251bWJlciAobWlub3IpOworCQlpZiAoIXBvcnQpCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQltb2RlcyA9IHBvcnQtPm1vZGVzOworCQlpZiAoY29weV90b191c2VyIChhcmdwLCAmbW9kZXMsIHNpemVvZiAobW9kZXMpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIDA7CisJICAgIH0KKwljYXNlIFBQU0VURkxBR1M6CisJICAgIHsKKwkJaW50IHVmbGFnczsKKworCQlpZiAoY29weV9mcm9tX3VzZXIgKCZ1ZmxhZ3MsIGFyZ3AsIHNpemVvZiAodWZsYWdzKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXBwLT5mbGFncyAmPSB+UFBfRkxBR01BU0s7CisJCXBwLT5mbGFncyB8PSAodWZsYWdzICYgUFBfRkxBR01BU0spOworCQlyZXR1cm4gMDsKKwkgICAgfQorCWNhc2UgUFBHRVRGTEFHUzoKKwkgICAgeworCQlpbnQgdWZsYWdzOworCisJCXVmbGFncyA9IHBwLT5mbGFncyAmIFBQX0ZMQUdNQVNLOworCQlpZiAoY29weV90b191c2VyIChhcmdwLCAmdWZsYWdzLCBzaXplb2YgKHVmbGFncykpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gMDsKKwkgICAgfQorCX0JLyogZW5kIHN3aXRjaCgpICovCisKKwkvKiBFdmVyeXRoaW5nIGVsc2UgcmVxdWlyZXMgdGhlIHBvcnQgdG8gYmUgY2xhaW1lZCwgc28gY2hlY2sKKwkgKiB0aGF0IG5vdy4gKi8KKwlpZiAoKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpID09IDApIHsKKwkJcHJpbnRrIChLRVJOX0RFQlVHIENIUkRFViAiJXg6IGNsYWltIHRoZSBwb3J0IGZpcnN0XG4iLAorCQkJbWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwb3J0ID0gcHAtPnBkZXYtPnBvcnQ7CisJc3dpdGNoIChjbWQpIHsKKwkJc3RydWN0IGllZWUxMjg0X2luZm8gKmluZm87CisJCXVuc2lnbmVkIGNoYXIgcmVnOworCQl1bnNpZ25lZCBjaGFyIG1hc2s7CisJCWludCBtb2RlOworCQlpbnQgcmV0OworCQlzdHJ1Y3QgdGltZXZhbCBwYXJfdGltZW91dDsKKwkJbG9uZyB0b19qaWZmaWVzOworCisJY2FzZSBQUFJTVEFUVVM6CisJCXJlZyA9IHBhcnBvcnRfcmVhZF9zdGF0dXMgKHBvcnQpOworCQlpZiAoY29weV90b191c2VyIChhcmdwLCAmcmVnLCBzaXplb2YgKHJlZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgUFBSREFUQToKKwkJcmVnID0gcGFycG9ydF9yZWFkX2RhdGEgKHBvcnQpOworCQlpZiAoY29weV90b191c2VyIChhcmdwLCAmcmVnLCBzaXplb2YgKHJlZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgUFBSQ09OVFJPTDoKKwkJcmVnID0gcGFycG9ydF9yZWFkX2NvbnRyb2wgKHBvcnQpOworCQlpZiAoY29weV90b191c2VyIChhcmdwLCAmcmVnLCBzaXplb2YgKHJlZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgUFBZSUVMRDoKKwkJcGFycG9ydF95aWVsZF9ibG9ja2luZyAocHAtPnBkZXYpOworCQlyZXR1cm4gMDsKKworCWNhc2UgUFBSRUxFQVNFOgorCQkvKiBTYXZlIHRoZSBzdGF0ZSBtYWNoaW5lJ3Mgc3RhdGUuICovCisJCWluZm8gPSAmcHAtPnBkZXYtPnBvcnQtPmllZWUxMjg0OworCQlwcC0+c3RhdGUubW9kZSA9IGluZm8tPm1vZGU7CisJCXBwLT5zdGF0ZS5waGFzZSA9IGluZm8tPnBoYXNlOworCQlpbmZvLT5tb2RlID0gcHAtPnNhdmVkX3N0YXRlLm1vZGU7CisJCWluZm8tPnBoYXNlID0gcHAtPnNhdmVkX3N0YXRlLnBoYXNlOworCQlwYXJwb3J0X3JlbGVhc2UgKHBwLT5wZGV2KTsKKwkJcHAtPmZsYWdzICY9IH5QUF9DTEFJTUVEOworCQlyZXR1cm4gMDsKKworCWNhc2UgUFBXQ09OVFJPTDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmcmVnLCBhcmdwLCBzaXplb2YgKHJlZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXBhcnBvcnRfd3JpdGVfY29udHJvbCAocG9ydCwgcmVnKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBQV0RBVEE6CisJCWlmIChjb3B5X2Zyb21fdXNlciAoJnJlZywgYXJncCwgc2l6ZW9mIChyZWcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwYXJwb3J0X3dyaXRlX2RhdGEgKHBvcnQsIHJlZyk7CisJCXJldHVybiAwOworCisJY2FzZSBQUEZDT05UUk9MOgorCQlpZiAoY29weV9mcm9tX3VzZXIgKCZtYXNrLCBhcmdwLAorCQkJCSAgICBzaXplb2YgKG1hc2spKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIgKCZyZWcsIDEgKyAodW5zaWduZWQgY2hhciBfX3VzZXIgKikgYXJnLAorCQkJCSAgICBzaXplb2YgKHJlZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXBhcnBvcnRfZnJvYl9jb250cm9sIChwb3J0LCBtYXNrLCByZWcpOworCQlyZXR1cm4gMDsKKworCWNhc2UgUFBEQVRBRElSOgorCQlpZiAoY29weV9mcm9tX3VzZXIgKCZtb2RlLCBhcmdwLCBzaXplb2YgKG1vZGUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAobW9kZSkKKwkJCXBvcnQtPm9wcy0+ZGF0YV9yZXZlcnNlIChwb3J0KTsKKwkJZWxzZQorCQkJcG9ydC0+b3BzLT5kYXRhX2ZvcndhcmQgKHBvcnQpOworCQlyZXR1cm4gMDsKKworCWNhc2UgUFBORUdPVDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmbW9kZSwgYXJncCwgc2l6ZW9mIChtb2RlKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc3dpdGNoICgocmV0ID0gcGFycG9ydF9uZWdvdGlhdGUgKHBvcnQsIG1vZGUpKSkgeworCQljYXNlIDA6IGJyZWFrOworCQljYXNlIC0xOiAvKiBoYW5kc2hha2UgZmFpbGVkLCBwZXJpcGhlcmFsIG5vdCBJRUVFIDEyODQgKi8KKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJY2FzZSAxOiAgLyogaGFuZHNoYWtlIHN1Y2NlZWRlZCwgcGVyaXBoZXJhbCByZWplY3RlZCBtb2RlICovCisJCQlyZXQgPSAtRU5YSU87CisJCQlicmVhazsKKwkJfQorCQlwcF9lbmFibGVfaXJxIChwcCk7CisJCXJldHVybiByZXQ7CisKKwljYXNlIFBQV0NUTE9OSVJROgorCQlpZiAoY29weV9mcm9tX3VzZXIgKCZyZWcsIGFyZ3AsIHNpemVvZiAocmVnKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBSZW1lbWJlciB3aGF0IHRvIHNldCB0aGUgY29udHJvbCBsaW5lcyB0bywgZm9yIG5leHQKKwkJICogdGltZSB3ZSBnZXQgYW4gaW50ZXJydXB0LiAqLworCQlwcC0+aXJxY3RsID0gcmVnOworCQlwcC0+aXJxcmVzcG9uc2UgPSAxOworCQlyZXR1cm4gMDsKKworCWNhc2UgUFBDTFJJUlE6CisJCXJldCA9IGF0b21pY19yZWFkICgmcHAtPmlycWMpOworCQlpZiAoY29weV90b191c2VyIChhcmdwLCAmcmV0LCBzaXplb2YgKHJldCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWF0b21pY19zdWIgKHJldCwgJnBwLT5pcnFjKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBQU0VUVElNRToKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmcGFyX3RpbWVvdXQsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQkvKiBDb252ZXJ0IHRvIGppZmZpZXMsIHBsYWNlIGluIHBwLT5wZGV2LT50aW1lb3V0ICovCisJCWlmICgocGFyX3RpbWVvdXQudHZfc2VjIDwgMCkgfHwgKHBhcl90aW1lb3V0LnR2X3VzZWMgPCAwKSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJdG9famlmZmllcyA9IFJPVU5EX1VQKHBhcl90aW1lb3V0LnR2X3VzZWMsIDEwMDAwMDAvSFopOworCQl0b19qaWZmaWVzICs9IHBhcl90aW1lb3V0LnR2X3NlYyAqIChsb25nKUhaOworCQlpZiAodG9famlmZmllcyA8PSAwKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlwcC0+cGRldi0+dGltZW91dCA9IHRvX2ppZmZpZXM7CisJCXJldHVybiAwOworCisJY2FzZSBQUEdFVFRJTUU6CisJCXRvX2ppZmZpZXMgPSBwcC0+cGRldi0+dGltZW91dDsKKwkJcGFyX3RpbWVvdXQudHZfc2VjID0gdG9famlmZmllcyAvIEhaOworCQlwYXJfdGltZW91dC50dl91c2VjID0gKHRvX2ppZmZpZXMgJSAobG9uZylIWikgKiAoMTAwMDAwMC9IWik7CisJCWlmIChjb3B5X3RvX3VzZXIgKGFyZ3AsICZwYXJfdGltZW91dCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlwcmludGsgKEtFUk5fREVCVUcgQ0hSREVWICIleDogV2hhdD8gKGNtZD0weCV4KVxuIiwgbWlub3IsCisJCQljbWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBLZWVwIHRoZSBjb21waWxlciBoYXBweSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBwX29wZW4gKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgcHBfc3RydWN0ICpwcDsKKworCWlmIChtaW5vciA+PSBQQVJQT1JUX01BWCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXBwID0ga21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcHBfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcC0+c3RhdGUubW9kZSA9IElFRUUxMjg0X01PREVfQ09NUEFUOworCXBwLT5zdGF0ZS5waGFzZSA9IGluaXRfcGhhc2UgKHBwLT5zdGF0ZS5tb2RlKTsKKwlwcC0+ZmxhZ3MgPSAwOworCXBwLT5pcnFyZXNwb25zZSA9IDA7CisJYXRvbWljX3NldCAoJnBwLT5pcnFjLCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkICgmcHAtPmlycV93YWl0KTsKKworCS8qIERlZmVyIHRoZSBhY3R1YWwgZGV2aWNlIHJlZ2lzdHJhdGlvbiB1bnRpbCB0aGUgZmlyc3QgY2xhaW0uCisJICogVGhhdCB3YXksIHdlIGtub3cgd2hldGhlciBvciBub3QgdGhlIGRyaXZlciB3YW50cyB0byBoYXZlCisJICogZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgcG9ydCAoUFBFWENMKS4KKwkgKi8KKwlwcC0+cGRldiA9IE5VTEw7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcHA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcF9yZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IHBwX3N0cnVjdCAqcHAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IGNvbXBhdF9uZWdvdDsKKworCWNvbXBhdF9uZWdvdCA9IDA7CisJaWYgKCEocHAtPmZsYWdzICYgUFBfQ0xBSU1FRCkgJiYgcHAtPnBkZXYgJiYKKwkgICAgKHBwLT5zdGF0ZS5tb2RlICE9IElFRUUxMjg0X01PREVfQ09NUEFUKSkgeworCSAgICAJc3RydWN0IGllZWUxMjg0X2luZm8gKmluZm87CisKKwkJLyogcGFycG9ydCByZWxlYXNlZCwgYnV0IG5vdCBpbiBjb21wYXRpYmlsaXR5IG1vZGUgKi8KKwkJcGFycG9ydF9jbGFpbV9vcl9ibG9jayAocHAtPnBkZXYpOworCQlwcC0+ZmxhZ3MgfD0gUFBfQ0xBSU1FRDsKKwkJaW5mbyA9ICZwcC0+cGRldi0+cG9ydC0+aWVlZTEyODQ7CisJCXBwLT5zYXZlZF9zdGF0ZS5tb2RlID0gaW5mby0+bW9kZTsKKwkJcHAtPnNhdmVkX3N0YXRlLnBoYXNlID0gaW5mby0+cGhhc2U7CisJCWluZm8tPm1vZGUgPSBwcC0+c3RhdGUubW9kZTsKKwkJaW5mby0+cGhhc2UgPSBwcC0+c3RhdGUucGhhc2U7CisJCWNvbXBhdF9uZWdvdCA9IDE7CisJfSBlbHNlIGlmICgocHAtPmZsYWdzICYgUFBfQ0xBSU1FRCkgJiYgcHAtPnBkZXYgJiYKKwkgICAgKHBwLT5wZGV2LT5wb3J0LT5pZWVlMTI4NC5tb2RlICE9IElFRUUxMjg0X01PREVfQ09NUEFUKSkgeworCQljb21wYXRfbmVnb3QgPSAyOworCX0KKwlpZiAoY29tcGF0X25lZ290KSB7CisJCXBhcnBvcnRfbmVnb3RpYXRlIChwcC0+cGRldi0+cG9ydCwgSUVFRTEyODRfTU9ERV9DT01QQVQpOworCQlwcmludGsgKEtFUk5fREVCVUcgQ0hSREVWCisJCQkiJXg6IG5lZ290aWF0ZWQgYmFjayB0byBjb21wYXRpYmlsaXR5IG1vZGUgYmVjYXVzZSAiCisJCQkidXNlci1zcGFjZSBmb3Jnb3RcbiIsIG1pbm9yKTsKKwl9CisKKwlpZiAocHAtPmZsYWdzICYgUFBfQ0xBSU1FRCkgeworCQlzdHJ1Y3QgaWVlZTEyODRfaW5mbyAqaW5mbzsKKworCQlpbmZvID0gJnBwLT5wZGV2LT5wb3J0LT5pZWVlMTI4NDsKKwkJcHAtPnN0YXRlLm1vZGUgPSBpbmZvLT5tb2RlOworCQlwcC0+c3RhdGUucGhhc2UgPSBpbmZvLT5waGFzZTsKKwkJaW5mby0+bW9kZSA9IHBwLT5zYXZlZF9zdGF0ZS5tb2RlOworCQlpbmZvLT5waGFzZSA9IHBwLT5zYXZlZF9zdGF0ZS5waGFzZTsKKwkJcGFycG9ydF9yZWxlYXNlIChwcC0+cGRldik7CisJCWlmIChjb21wYXRfbmVnb3QgIT0gMSkgeworCQkJcHJpbnRrIChLRVJOX0RFQlVHIENIUkRFViAiJXg6IHJlbGVhc2VkIHBhcmRldmljZSAiCisJCQkJImJlY2F1c2UgdXNlci1zcGFjZSBmb3Jnb3RcbiIsIG1pbm9yKTsKKwkJfQorCX0KKworCWlmIChwcC0+cGRldikgeworCQljb25zdCBjaGFyICpuYW1lID0gcHAtPnBkZXYtPm5hbWU7CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UgKHBwLT5wZGV2KTsKKwkJa2ZyZWUgKG5hbWUpOworCQlwcC0+cGRldiA9IE5VTEw7CisJCXByaW50ayAoS0VSTl9ERUJVRyBDSFJERVYgIiV4OiB1bnJlZ2lzdGVyZWQgcGFyZGV2aWNlXG4iLAorCQkJbWlub3IpOworCX0KKworCWtmcmVlIChwcCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgaGVsZCAtIGZpbmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHBfcG9sbCAoc3RydWN0IGZpbGUgKiBmaWxlLCBwb2xsX3RhYmxlICogd2FpdCkKK3sKKwlzdHJ1Y3QgcHBfc3RydWN0ICpwcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlwb2xsX3dhaXQgKGZpbGUsICZwcC0+aXJxX3dhaXQsIHdhaXQpOworCWlmIChhdG9taWNfcmVhZCAoJnBwLT5pcnFjKSkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICpwcGRldl9jbGFzczsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHBfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gcHBfcmVhZCwKKwkud3JpdGUJCT0gcHBfd3JpdGUsCisJLnBvbGwJCT0gcHBfcG9sbCwKKwkuaW9jdGwJCT0gcHBfaW9jdGwsCisJLm9wZW4JCT0gcHBfb3BlbiwKKwkucmVsZWFzZQk9IHBwX3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCBwcF9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQocHBkZXZfY2xhc3MsIE1LREVWKFBQX01BSk9SLCBwb3J0LT5udW1iZXIpLAorCQkJTlVMTCwgInBhcnBvcnQlZCIsIHBvcnQtPm51bWJlcik7Cit9CisKK3N0YXRpYyB2b2lkIHBwX2RldGFjaChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihQUF9NQUpPUiwgcG9ydC0+bnVtYmVyKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFycG9ydF9kcml2ZXIgcHBfZHJpdmVyID0geworCS5uYW1lCQk9IENIUkRFViwKKwkuYXR0YWNoCQk9IHBwX2F0dGFjaCwKKwkuZGV0YWNoCQk9IHBwX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBwZGV2X2luaXQgKHZvaWQpCit7CisJaW50IGksIGVyciA9IDA7CisKKwlpZiAocmVnaXN0ZXJfY2hyZGV2IChQUF9NQUpPUiwgQ0hSREVWLCAmcHBfZm9wcykpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgQ0hSREVWICI6IHVuYWJsZSB0byBnZXQgbWFqb3IgJWRcbiIsCisJCQlQUF9NQUpPUik7CisJCXJldHVybiAtRUlPOworCX0KKwlwcGRldl9jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsIENIUkRFVik7CisJaWYgKElTX0VSUihwcGRldl9jbGFzcykpIHsKKwkJZXJyID0gUFRSX0VSUihwcGRldl9jbGFzcyk7CisJCWdvdG8gb3V0X2NocmRldjsKKwl9CisJZGV2ZnNfbWtfZGlyKCJwYXJwb3J0cyIpOworCWZvciAoaSA9IDA7IGkgPCBQQVJQT1JUX01BWDsgaSsrKSB7CisJCWRldmZzX21rX2NkZXYoTUtERVYoUFBfTUFKT1IsIGkpLAorCQkJCVNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VHTywgInBhcnBvcnRzLyVkIiwgaSk7CisJfQorCWlmIChwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlcigmcHBfZHJpdmVyKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBDSFJERVYgIjogdW5hYmxlIHRvIHJlZ2lzdGVyIHdpdGggcGFycG9ydFxuIik7CisJCWdvdG8gb3V0X2NsYXNzOworCX0KKworCXByaW50ayAoS0VSTl9JTkZPIFBQX1ZFUlNJT04gIlxuIik7CisJZ290byBvdXQ7CisKK291dF9jbGFzczoKKwlmb3IgKGkgPSAwOyBpIDwgUEFSUE9SVF9NQVg7IGkrKykKKwkJZGV2ZnNfcmVtb3ZlKCJwYXJwb3J0cy8lZCIsIGkpOworCWRldmZzX3JlbW92ZSgicGFycG9ydHMiKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShwcGRldl9jbGFzcyk7CitvdXRfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2KFBQX01BSk9SLCBDSFJERVYpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwcGRldl9jbGVhbnVwICh2b2lkKQoreworCWludCBpOworCS8qIENsZWFuIHVwIGFsbCBwYXJwb3J0IHN0dWZmICovCisJZm9yIChpID0gMDsgaSA8IFBBUlBPUlRfTUFYOyBpKyspCisJCWRldmZzX3JlbW92ZSgicGFycG9ydHMvJWQiLCBpKTsKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKCZwcF9kcml2ZXIpOworCWRldmZzX3JlbW92ZSgicGFycG9ydHMiKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShwcGRldl9jbGFzcyk7CisJdW5yZWdpc3Rlcl9jaHJkZXYgKFBQX01BSk9SLCBDSFJERVYpOworfQorCittb2R1bGVfaW5pdChwcGRldl9pbml0KTsKK21vZHVsZV9leGl0KHBwZGV2X2NsZWFudXApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfQ0hBUkRFVl9NQUpPUihQUF9NQUpPUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcHR5LmMgYi9kcml2ZXJzL2NoYXIvcHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzMjg4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9wdHkuYwpAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2NoYXIvcHR5LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBBZGRlZCBzdXBwb3J0IGZvciBhIFVuaXg5OC1zdHlsZSBwdG14IGRldmljZS4KKyAqICAgIC0tIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PiwgMTQtSmFuLTE5OTgKKyAqICBBZGRlZCBUVFlfRE9fV1JJVEVfV0FLRVVQIHRvIGVuYWJsZSBuX3R0eSB0byBzZW5kIFBPTExfT1VUIHRvCisgKiAgICAgIHdhaXRpbmcgd3JpdGVycyAtLSBTYXBhbiBCaGF0aWEgPHNhcGFuQGNvcmV3YXJzLm9yZz4KKyAqCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogRm9yIEVYUE9SVF9TWU1CT0wgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldnB0c19mcy5oPgorCisvKiBUaGVzZSBhcmUgZ2xvYmFsIGJlY2F1c2UgdGhleSBhcmUgYWNjZXNzZWQgaW4gdHR5X2lvLmMgKi8KKyNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKK3N0cnVjdCB0dHlfZHJpdmVyICpwdG1fZHJpdmVyOworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpwdHNfZHJpdmVyOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHB0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCWlmICghdHR5KQorCQlyZXR1cm47CisJaWYgKHR0eS0+ZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUikgeworCQlpZiAodHR5LT5jb3VudCA+IDEpCisJCQlwcmludGsoIm1hc3RlciBwdHlfY2xvc2U6IGNvdW50ID0gJWQhIVxuIiwgdHR5LT5jb3VudCk7CisJfSBlbHNlIHsKKwkJaWYgKHR0eS0+Y291bnQgPiAyKQorCQkJcmV0dXJuOworCX0KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cmVhZF93YWl0KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJdHR5LT5wYWNrZXQgPSAwOworCWlmICghdHR5LT5saW5rKQorCQlyZXR1cm47CisJdHR5LT5saW5rLT5wYWNrZXQgPSAwOworCXNldF9iaXQoVFRZX09USEVSX0NMT1NFRCwgJnR0eS0+bGluay0+ZmxhZ3MpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5saW5rLT5yZWFkX3dhaXQpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5saW5rLT53cml0ZV93YWl0KTsKKwlpZiAodHR5LT5kcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSKSB7CisJCXNldF9iaXQoVFRZX09USEVSX0NMT1NFRCwgJnR0eS0+ZmxhZ3MpOworI2lmZGVmIENPTkZJR19VTklYOThfUFRZUworCQlpZiAodHR5LT5kcml2ZXIgPT0gcHRtX2RyaXZlcikKKwkJCWRldnB0c19wdHlfa2lsbCh0dHktPmluZGV4KTsKKyNlbmRpZgorCQl0dHlfdmhhbmd1cCh0dHktPmxpbmspOworCX0KK30KKworLyoKKyAqIFRoZSB1bnRocm90dGxlIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gc2lnbmFsCisgKiB0aGF0IGl0IGNhbiByZWNlaXZlIG1vcmUgY2hhcmFjdGVycy4gIEZvciBQVFkncywgdGhlIFRUWV9USFJPVFRMRUQKKyAqIGZsYWcgaXMgYWx3YXlzIHNldCwgdG8gZm9yY2UgdGhlIGxpbmUgZGlzY2lwbGluZSB0byBhbHdheXMgY2FsbCB0aGUKKyAqIHVudGhyb3R0bGUgcm91dGluZSB3aGVuIHRoZXJlIGFyZSBmZXdlciB0aGFuIFRUWV9USFJFU0hPTERfVU5USFJPVFRMRSAKKyAqIGNoYXJhY3RlcnMgaW4gdGhlIHF1ZXVlLiAgVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgZWFjaCB0aW1lIHRoaXMKKyAqIGhhcHBlbnMsIHdlIG5lZWQgdG8gd2FrZSB1cCBhbnkgc2xlZXBpbmcgcHJvY2Vzc2VzIHRoYXQgY291bGQgYmUKKyAqICgxKSB0cnlpbmcgdG8gc2VuZCBkYXRhIHRvIHRoZSBwdHksIG9yICgyKSB3YWl0aW5nIGluIHdhaXRfdW50aWxfc2VudCgpCisgKiBmb3IgdGhlIHB0eSBidWZmZXIgdG8gYmUgZHJhaW5lZC4KKyAqLworc3RhdGljIHZvaWQgcHR5X3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKm9fdHR5ID0gdHR5LT5saW5rOworCisJaWYgKCFvX3R0eSkKKwkJcmV0dXJuOworCisJdHR5X3dha2V1cChvX3R0eSk7CisJc2V0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncyk7Cit9CisKKy8qCisgKiBXU0ggMDUvMjQvOTc6IG1vZGlmaWVkIHRvIAorICogICAoMSkgdXNlIHNwYWNlIGluIHR0eS0+ZmxpcCBpbnN0ZWFkIG9mIGEgc2hhcmVkIHRlbXAgYnVmZmVyCisgKgkgVGhlIGZsaXAgYnVmZmVycyBhcmVuJ3QgYmVpbmcgdXNlZCBmb3IgYSBwdHksIHNvIHRoZXJlJ3MgbG90cworICoJIG9mIHNwYWNlIGF2YWlsYWJsZS4gIFRoZSBidWZmZXIgaXMgcHJvdGVjdGVkIGJ5IGEgcGVyLXB0eQorICoJIHNlbWFwaG9yZSB0aGF0IHNob3VsZCBhbG1vc3QgbmV2ZXIgY29tZSB1bmRlciBjb250ZW50aW9uLgorICogICAoMikgYXZvaWQgcmVkdW5kYW50IGNvcHlpbmcgZm9yIGNhc2VzIHdoZXJlIGNvdW50ID4+IHJlY2VpdmVfcm9vbQorICogTi5CLiBDYWxscyBmcm9tIHVzZXIgc3BhY2UgbWF5IG5vdyByZXR1cm4gYW4gZXJyb3IgY29kZSBpbnN0ZWFkIG9mCisgKiBhIGNvdW50LgorICoKKyAqIEZJWE1FOiBPdXIgcHR5X3dyaXRlIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBvdXIgbGRpc2MgbG9jayBoZWxkIGJ1dAorICogbm90IG91ciBwYXJ0bmVycy4gV2UgY2FuJ3QganVzdCB0YWtlIHRoZSBvdGhlciBvbmUgYmxpbmRseSB3aXRob3V0CisgKiByaXNraW5nIGRlYWRsb2Nrcy4gIFRoZXJlIGlzIGFsc28gdGhlIHNtYWxsIG1hdHRlciBvZiBUVFlfRE9OVF9GTElQCisgKi8KK3N0YXRpYyBpbnQgcHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdG8gPSB0dHktPmxpbms7CisJaW50CWM7CisKKwlpZiAoIXRvIHx8IHR0eS0+c3RvcHBlZCkKKwkJcmV0dXJuIDA7CisKKwljID0gdG8tPmxkaXNjLnJlY2VpdmVfcm9vbSh0byk7CisJaWYgKGMgPiBjb3VudCkKKwkJYyA9IGNvdW50OworCXRvLT5sZGlzYy5yZWNlaXZlX2J1Zih0bywgYnVmLCBOVUxMLCBjKTsKKwkKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIGludCBwdHlfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0byA9IHR0eS0+bGluazsKKworCWlmICghdG8gfHwgdHR5LT5zdG9wcGVkKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB0by0+bGRpc2MucmVjZWl2ZV9yb29tKHRvKTsKK30KKworLyoKKyAqCVdTSCAwNS8yNC85NzogIE1vZGlmaWVkIGZvciBhc3ltbWV0cmljIE1BU1RFUi9TTEFWRSBiZWhhdmlvcgorICoJVGhlIGNoYXJzX2luX2J1ZmZlcigpIHZhbHVlIGlzIHVzZWQgYnkgdGhlIGxkaXNjIHNlbGVjdCgpIGZ1bmN0aW9uIAorICoJdG8gaG9sZCBvZmYgd3JpdGluZyB3aGVuIGNoYXJzX2luX2J1ZmZlciA+IFdBS0VVUF9DSEFSUyAoPT0gMjU2KS4KKyAqCVRoZSBwdHkgZHJpdmVyIGNoYXJzX2luX2J1ZmZlcigpIE1hc3Rlci9TbGF2ZSBtdXN0IGJlaGF2ZSBkaWZmZXJlbnRseToKKyAqCisgKiAgICAgIFRoZSBNYXN0ZXIgc2lkZSBuZWVkcyB0byBhbGxvdyB0eXBlZC1haGVhZCBjb21tYW5kcyB0byBhY2N1bXVsYXRlCisgKiAgICAgIHdoaWxlIGJlaW5nIGNhbm9uaWNhbGl6ZWQsIHNvIHdlIHJlcG9ydCAib3VyIGJ1ZmZlciIgYXMgZW1wdHkgdW50aWwKKyAqCXNvbWUgdGhyZXNob2xkIGlzIHJlYWNoZWQsIGFuZCB0aGVuIHJlcG9ydCB0aGUgY291bnQuIChBbnkgY291bnQgPgorICoJV0FLRVVQX0NIQVJTIGlzIHJlZ2FyZGVkIGJ5IHNlbGVjdCgpIGFzICJmdWxsIi4pICBUbyBhdm9pZCBkZWFkbG9jayAKKyAqCXRoZSBjb3VudCByZXR1cm5lZCBtdXN0IGJlIDAgaWYgbm8gY2Fub25pY2FsIGRhdGEgaXMgYXZhaWxhYmxlIHRvIGJlIAorICoJcmVhZC4gKFRoZSBOX1RUWSBsZGlzYy5jaGFyc19pbl9idWZmZXIgbm93IGtub3dzIHRoaXMuKQorICogIAorICoJVGhlIFNsYXZlIHNpZGUgcGFzc2VzIGFsbCBjaGFyYWN0ZXJzIGluIHJhdyBtb2RlIHRvIHRoZSBNYXN0ZXIgc2lkZSdzCisgKglidWZmZXIgd2hlcmUgdGhleSBjYW4gYmUgcmVhZCBpbW1lZGlhdGVseSwgc28gaW4gdGhpcyBjYXNlIHdlIGNhbgorICoJcmV0dXJuIHRoZSB0cnVlIGNvdW50IGluIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgcHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0byA9IHR0eS0+bGluazsKKwlzc2l6ZV90ICgqY2hhcnNfaW5fYnVmZmVyKShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKKwlpbnQgY291bnQ7CisKKwkvKiBXZSBzaG91bGQgZ2V0IHRoZSBsaW5lIGRpc2NpcGxpbmUgbG9jayBmb3IgInR0eS0+bGluayIgKi8KKwlpZiAoIXRvIHx8ICEoY2hhcnNfaW5fYnVmZmVyID0gdG8tPmxkaXNjLmNoYXJzX2luX2J1ZmZlcikpCisJCXJldHVybiAwOworCisJLyogVGhlIGxkaXNjIG11c3QgcmVwb3J0IDAgaWYgbm8gY2hhcmFjdGVycyBhdmFpbGFibGUgdG8gYmUgcmVhZCAqLworCWNvdW50ID0gY2hhcnNfaW5fYnVmZmVyKHRvKTsKKworCWlmICh0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9TTEFWRSkgcmV0dXJuIGNvdW50OworCisJLyogTWFzdGVyIHNpZGUgZHJpdmVyIC4uLiBpZiB0aGUgb3RoZXIgc2lkZSdzIHJlYWQgYnVmZmVyIGlzIGxlc3MgdGhhbiAKKwkgKiBoYWxmIGZ1bGwsIHJldHVybiAwIHRvIGFsbG93IHdyaXRlcnMgdG8gcHJvY2VlZDsgb3RoZXJ3aXNlIHJldHVybgorCSAqIHRoZSBjb3VudC4gIFRoaXMgbGVhdmVzIGEgY29tZm9ydGFibGUgbWFyZ2luIHRvIGF2b2lkIG92ZXJmbG93LCAKKwkgKiBhbmQgc3RpbGwgYWxsb3dzIGhhbGYgYSBidWZmZXIncyB3b3J0aCBvZiB0eXBlZC1haGVhZCBjb21tYW5kcy4KKwkgKi8KKwlyZXR1cm4gKChjb3VudCA8IE5fVFRZX0JVRl9TSVpFLzIpID8gMCA6IGNvdW50KTsKK30KKworLyogU2V0IHRoZSBsb2NrIGZsYWcgb24gYSBwdHkgKi8KK3N0YXRpYyBpbnQgcHR5X3NldF9sb2NrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKiBhcmcpCit7CisJaW50IHZhbDsKKwlpZiAoZ2V0X3VzZXIodmFsLGFyZykpCisJCXJldHVybiAtRUZBVUxUOworCWlmICh2YWwpCisJCXNldF9iaXQoVFRZX1BUWV9MT0NLLCAmdHR5LT5mbGFncyk7CisJZWxzZQorCQljbGVhcl9iaXQoVFRZX1BUWV9MT0NLLCAmdHR5LT5mbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdG8gPSB0dHktPmxpbms7CisJCisJaWYgKCF0bykKKwkJcmV0dXJuOworCQorCWlmICh0by0+bGRpc2MuZmx1c2hfYnVmZmVyKQorCQl0by0+bGRpc2MuZmx1c2hfYnVmZmVyKHRvKTsKKwkKKwlpZiAodG8tPnBhY2tldCkgeworCQl0dHktPmN0cmxfc3RhdHVzIHw9IFRJT0NQS1RfRkxVU0hXUklURTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0by0+cmVhZF93YWl0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCWludAlyZXR2YWwgPSAtRU5PREVWOworCisJaWYgKCF0dHkgfHwgIXR0eS0+bGluaykKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSAtRUlPOworCWlmICh0ZXN0X2JpdChUVFlfT1RIRVJfQ0xPU0VELCAmdHR5LT5mbGFncykpCisJCWdvdG8gb3V0OworCWlmICh0ZXN0X2JpdChUVFlfUFRZX0xPQ0ssICZ0dHktPmxpbmstPmZsYWdzKSkKKwkJZ290byBvdXQ7CisJaWYgKHR0eS0+bGluay0+Y291bnQgIT0gMSkKKwkJZ290byBvdXQ7CisKKwljbGVhcl9iaXQoVFRZX09USEVSX0NMT1NFRCwgJnR0eS0+bGluay0+ZmxhZ3MpOworCXNldF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpOworCXNldF9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnR0eS0+ZmxhZ3MpOworCXJldHZhbCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgcHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKyAgICAgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH4oQ1NJWkUgfCBQQVJFTkIpOworICAgICAgICB0dHktPnRlcm1pb3MtPmNfY2ZsYWcgfD0gKENTOCB8IENSRUFEKTsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBwdHlfb3BzID0geworCS5vcGVuID0gcHR5X29wZW4sCisJLmNsb3NlID0gcHR5X2Nsb3NlLAorCS53cml0ZSA9IHB0eV93cml0ZSwKKwkud3JpdGVfcm9vbSA9IHB0eV93cml0ZV9yb29tLAorCS5mbHVzaF9idWZmZXIgPSBwdHlfZmx1c2hfYnVmZmVyLAorCS5jaGFyc19pbl9idWZmZXIgPSBwdHlfY2hhcnNfaW5fYnVmZmVyLAorCS51bnRocm90dGxlID0gcHR5X3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zID0gcHR5X3NldF90ZXJtaW9zLAorfTsKKworLyogVHJhZGl0aW9uYWwgQlNEIGRldmljZXMgKi8KKyNpZmRlZiBDT05GSUdfTEVHQUNZX1BUWVMKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcHR5X2RyaXZlciwgKnB0eV9zbGF2ZV9kcml2ZXI7CisKK3N0YXRpYyBpbnQgcHR5X2JzZF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElPQ1NQVExDSzogLyogU2V0IFBUIExvY2sgKGRpc2FsbG93IHNsYXZlIG9wZW4pICovCisJCXJldHVybiBwdHlfc2V0X2xvY2sodHR5LCAoaW50IF9fdXNlciAqKSBhcmcpOworCX0KKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbGVnYWN5X3B0eV9pbml0KHZvaWQpCit7CisKKwlwdHlfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihOUl9QVFlTKTsKKwlpZiAoIXB0eV9kcml2ZXIpCisJCXBhbmljKCJDb3VsZG4ndCBhbGxvY2F0ZSBwdHkgZHJpdmVyIik7CisKKwlwdHlfc2xhdmVfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihOUl9QVFlTKTsKKwlpZiAoIXB0eV9zbGF2ZV9kcml2ZXIpCisJCXBhbmljKCJDb3VsZG4ndCBhbGxvY2F0ZSBwdHkgc2xhdmUgZHJpdmVyIik7CisKKwlwdHlfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXB0eV9kcml2ZXItPmRyaXZlcl9uYW1lID0gInB0eV9tYXN0ZXIiOworCXB0eV9kcml2ZXItPm5hbWUgPSAicHR5IjsKKwlwdHlfZHJpdmVyLT5kZXZmc19uYW1lID0gInB0eS9tIjsKKwlwdHlfZHJpdmVyLT5tYWpvciA9IFBUWV9NQVNURVJfTUFKT1I7CisJcHR5X2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCXB0eV9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfUFRZOworCXB0eV9kcml2ZXItPnN1YnR5cGUgPSBQVFlfVFlQRV9NQVNURVI7CisJcHR5X2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXB0eV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2lmbGFnID0gMDsKKwlwdHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vZmxhZyA9IDA7CisJcHR5X2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCMzg0MDAgfCBDUzggfCBDUkVBRDsKKwlwdHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19sZmxhZyA9IDA7CisJcHR5X2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFU0VUX1RFUk1JT1MgfCBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXB0eV9kcml2ZXItPm90aGVyID0gcHR5X3NsYXZlX2RyaXZlcjsKKwl0dHlfc2V0X29wZXJhdGlvbnMocHR5X2RyaXZlciwgJnB0eV9vcHMpOworCXB0eV9kcml2ZXItPmlvY3RsID0gcHR5X2JzZF9pb2N0bDsKKworCXB0eV9zbGF2ZV9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJcHR5X3NsYXZlX2RyaXZlci0+ZHJpdmVyX25hbWUgPSAicHR5X3NsYXZlIjsKKwlwdHlfc2xhdmVfZHJpdmVyLT5uYW1lID0gInR0eXAiOworCXB0eV9zbGF2ZV9kcml2ZXItPmRldmZzX25hbWUgPSAicHR5L3MiOworCXB0eV9zbGF2ZV9kcml2ZXItPm1ham9yID0gUFRZX1NMQVZFX01BSk9SOworCXB0eV9zbGF2ZV9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gMDsKKwlwdHlfc2xhdmVfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1BUWTsKKwlwdHlfc2xhdmVfZHJpdmVyLT5zdWJ0eXBlID0gUFRZX1RZUEVfU0xBVkU7CisJcHR5X3NsYXZlX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXB0eV9zbGF2ZV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjM4NDAwIHwgQ1M4IHwgQ1JFQUQ7CisJcHR5X3NsYXZlX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFU0VUX1RFUk1JT1MgfAorCQkJCQlUVFlfRFJJVkVSX1JFQUxfUkFXOworCXB0eV9zbGF2ZV9kcml2ZXItPm90aGVyID0gcHR5X2RyaXZlcjsKKwl0dHlfc2V0X29wZXJhdGlvbnMocHR5X3NsYXZlX2RyaXZlciwgJnB0eV9vcHMpOworCisJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIocHR5X2RyaXZlcikpCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBwdHkgZHJpdmVyIik7CisJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIocHR5X3NsYXZlX2RyaXZlcikpCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBwdHkgc2xhdmUgZHJpdmVyIik7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGxlZ2FjeV9wdHlfaW5pdCh2b2lkKSB7IH0KKyNlbmRpZgorCisvKiBVbml4OTggZGV2aWNlcyAqLworI2lmZGVmIENPTkZJR19VTklYOThfUFRZUworLyoKKyAqIHN5c2N0bCBzdXBwb3J0IGZvciBzZXR0aW5nIGxpbWl0cyBvbiB0aGUgbnVtYmVyIG9mIFVuaXg5OCBwdHlzIGFsbG9jYXRlZC4KKyAqIE90aGVyd2lzZSBvbmUgY2FuIGVhdCB1cCBhbGwga2VybmVsIG1lbW9yeSBieSBvcGVuaW5nIC9kZXYvcHRteCByZXBlYXRlZGx5LgorICovCitpbnQgcHR5X2xpbWl0ID0gTlJfVU5JWDk4X1BUWV9ERUZBVUxUOworc3RhdGljIGludCBwdHlfbGltaXRfbWluID0gMDsKK3N0YXRpYyBpbnQgcHR5X2xpbWl0X21heCA9IE5SX1VOSVg5OF9QVFlfTUFYOworCitjdGxfdGFibGUgcHR5X3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBQVFlfTUFYLAorCQkucHJvY25hbWUJPSAibWF4IiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLmRhdGEJCT0gJnB0eV9saW1pdCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJnB0eV9saW1pdF9taW4sCisJCS5leHRyYTIJCT0gJnB0eV9saW1pdF9tYXgsCisJfSwgeworCQkuY3RsX25hbWUJPSBQVFlfTlIsCisJCS5wcm9jbmFtZQk9ICJuciIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LCB7CisJCS5jdGxfbmFtZQk9IDAKKwl9Cit9OworCitzdGF0aWMgaW50IHB0eV91bml4OThfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NTUFRMQ0s6IC8qIFNldCBQVCBMb2NrIChkaXNhbGxvdyBzbGF2ZSBvcGVuKSAqLworCQlyZXR1cm4gcHR5X3NldF9sb2NrKHR0eSwgKGludCBfX3VzZXIgKilhcmcpOworCWNhc2UgVElPQ0dQVE46IC8qIEdldCBQVCBOdW1iZXIgKi8KKwkJcmV0dXJuIHB1dF91c2VyKHR0eS0+aW5kZXgsICh1bnNpZ25lZCBpbnQgX191c2VyICopYXJnKTsKKwl9CisKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdW5peDk4X3B0eV9pbml0KHZvaWQpCit7CisJZGV2ZnNfbWtfZGlyKCJwdHMiKTsKKwlwdG1fZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihOUl9VTklYOThfUFRZX01BWCk7CisJaWYgKCFwdG1fZHJpdmVyKQorCQlwYW5pYygiQ291bGRuJ3QgYWxsb2NhdGUgVW5peDk4IHB0bSBkcml2ZXIiKTsKKwlwdHNfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihOUl9VTklYOThfUFRZX01BWCk7CisJaWYgKCFwdHNfZHJpdmVyKQorCQlwYW5pYygiQ291bGRuJ3QgYWxsb2NhdGUgVW5peDk4IHB0cyBkcml2ZXIiKTsKKworCXB0bV9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJcHRtX2RyaXZlci0+ZHJpdmVyX25hbWUgPSAicHR5X21hc3RlciI7CisJcHRtX2RyaXZlci0+bmFtZSA9ICJwdG0iOworCXB0bV9kcml2ZXItPm1ham9yID0gVU5JWDk4X1BUWV9NQVNURVJfTUFKT1I7CisJcHRtX2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCXB0bV9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfUFRZOworCXB0bV9kcml2ZXItPnN1YnR5cGUgPSBQVFlfVFlQRV9NQVNURVI7CisJcHRtX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXB0bV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2lmbGFnID0gMDsKKwlwdG1fZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vZmxhZyA9IDA7CisJcHRtX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCMzg0MDAgfCBDUzggfCBDUkVBRDsKKwlwdG1fZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19sZmxhZyA9IDA7CisJcHRtX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFU0VUX1RFUk1JT1MgfCBUVFlfRFJJVkVSX1JFQUxfUkFXIHwKKwkJVFRZX0RSSVZFUl9OT19ERVZGUyB8IFRUWV9EUklWRVJfREVWUFRTX01FTTsKKwlwdG1fZHJpdmVyLT5vdGhlciA9IHB0c19kcml2ZXI7CisJdHR5X3NldF9vcGVyYXRpb25zKHB0bV9kcml2ZXIsICZwdHlfb3BzKTsKKwlwdG1fZHJpdmVyLT5pb2N0bCA9IHB0eV91bml4OThfaW9jdGw7CisKKwlwdHNfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXB0c19kcml2ZXItPmRyaXZlcl9uYW1lID0gInB0eV9zbGF2ZSI7CisJcHRzX2RyaXZlci0+bmFtZSA9ICJwdHMiOworCXB0c19kcml2ZXItPm1ham9yID0gVU5JWDk4X1BUWV9TTEFWRV9NQUpPUjsKKwlwdHNfZHJpdmVyLT5taW5vcl9zdGFydCA9IDA7CisJcHRzX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9QVFk7CisJcHRzX2RyaXZlci0+c3VidHlwZSA9IFBUWV9UWVBFX1NMQVZFOworCXB0c19kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlwdHNfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEIzODQwMCB8IENTOCB8IENSRUFEOworCXB0c19kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRVNFVF9URVJNSU9TIHwgVFRZX0RSSVZFUl9SRUFMX1JBVyB8CisJCVRUWV9EUklWRVJfTk9fREVWRlMgfCBUVFlfRFJJVkVSX0RFVlBUU19NRU07CisJcHRzX2RyaXZlci0+b3RoZXIgPSBwdG1fZHJpdmVyOworCXR0eV9zZXRfb3BlcmF0aW9ucyhwdHNfZHJpdmVyLCAmcHR5X29wcyk7CisJCisJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIocHRtX2RyaXZlcikpCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBVbml4OTggcHRtIGRyaXZlciIpOworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHB0c19kcml2ZXIpKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgVW5peDk4IHB0cyBkcml2ZXIiKTsKKworCXB0eV90YWJsZVsxXS5kYXRhID0gJnB0bV9kcml2ZXItPnJlZmNvdW50OworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bml4OThfcHR5X2luaXQodm9pZCkgeyB9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgcHR5X2luaXQodm9pZCkKK3sKKwlsZWdhY3lfcHR5X2luaXQoKTsKKwl1bml4OThfcHR5X2luaXQoKTsKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KHB0eV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9xdHJvbml4LmMgYi9kcml2ZXJzL2NoYXIvcXRyb25peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYTNjZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcXRyb25peC5jCkBAIC0wLDAgKzEsNjAxIEBACisvKgorICoKKyAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgorICoJUXRyb25peCA5OTBQIGluZnJhcmVkIGtleWJvYXJkIGRyaXZlci4KKyAqCisgKgorICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgCXBwb3BvdkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICoKKyAqICBUaGUgYm90dG9tIHBvcnRpb24gb2YgdGhpcyBkcml2ZXIgd2FzIHRha2UgZnJvbSAKKyAqICBwY19rZXliLmMgIFBsZWFzZSBzZWUgdGhhdCBmaWxlIGZvciBjb3B5cmlnaHRzLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qIAorICogTk9URTogIAorICoKKyAqCVRoaXMgZHJpdmVyIGhhcyBvbmx5IGJlZW4gdGVzdGVkIHdpdGggdGhlIENvbnN1bWVyIElSCisgKglwb3J0IG9mIHRoZSBJVEUgODE3MiBzeXN0ZW0gY29udHJvbGxlci4KKyAqCisgKglZb3UgZG8gbm90IG5lZWQgdGhpcyBkcml2ZXIgaWYgeW91IGFyZSB1c2luZyB0aGUgcHMvMiBvcgorICoJVVNCIGFkYXB0ZXIgdGhhdCB0aGUga2V5Ym9hcmQgc2hpcHMgd2l0aC4gIFlvdSBvbmx5IG5lZWQgCisgKgl0aGlzIGRyaXZlciBpZiB5b3VyIGJvYXJkIGhhcyBhIElSIHBvcnQgYW5kIHRoZSBrZXlib2FyZAorICoJZGF0YSBpcyBiZWluZyBzZW50IGRpcmVjdGx5IHRvIHRoZSBJUi4gIEluIHRoYXQgY2FzZSwKKyAqCXlvdSBhbHNvIG5lZWQgc29tZSBsb3ctbGV2ZWwgSVIgc3VwcG9ydC4gU2VlIGl0ODE3Ml9jaXIuYy4KKyAqCQorICovCisKKyNpZmRlZiBDT05GSUdfUVRST05JWF9LRVlCT0FSRAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGFzbS9pdDgxNzIvaXQ4MTcyLmg+CisjaW5jbHVkZSA8YXNtL2l0ODE3Mi9pdDgxNzJfaW50Lmg+CisjaW5jbHVkZSA8YXNtL2l0ODE3Mi9pdDgxNzJfY2lyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2JkX2xsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rYmRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGNfa2V5Yi5oPgorCisjaW5jbHVkZSA8YXNtL2tleWJvYXJkLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIGxlYWRpbmcxIDAKKyNkZWZpbmUgbGVhZGluZzIgMHhGCisKKyNkZWZpbmUgS0JEX0NJUl9QT1JUIDAKKyNkZWZpbmUgQVVYX1JFQ09OTkVDVCAxNzAgLyogc2NhbmNvZGUgd2hlbiBwczIgZGV2aWNlIGlzIHBsdWdnZWQgKGJhY2spIGluICovCisKK3N0YXRpYyBpbnQgZGF0YV9pbmRleDsKK3N0cnVjdCBjaXJfcG9ydCAqY2lyOworc3RhdGljIHVuc2lnbmVkIGNoYXIga2JkYnl0ZXNbNV07CitzdGF0aWMgdW5zaWduZWQgY2hhciBjaXJfZGF0YVszMl07IC8qIHdlIG9ubHkgbmVlZCAxNiBjaGFycyAqLworCitzdGF0aWMgdm9pZCBrYmRfaW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IGhhbmRsZV9kYXRhKHVuc2lnbmVkIGNoYXIgKnBfZGF0YSk7CitzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX21vdXNlX2V2ZW50KHVuc2lnbmVkIGNoYXIgc2NhbmNvZGUpOworc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9rZXlib2FyZF9ldmVudCh1bnNpZ25lZCBjaGFyIHNjYW5jb2RlLCBpbnQgZG93bik7CitzdGF0aWMgaW50IF9faW5pdCBwc2F1eF9pbml0KHZvaWQpOworCitzdGF0aWMgc3RydWN0IGF1eF9xdWV1ZSAqcXVldWU7CS8qIE1vdXNlIGRhdGEgYnVmZmVyLiAqLworc3RhdGljIGludCBhdXhfY291bnQgPSAwOworCisvKgorICogS2V5cyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAnRm4nIGtleQorICogVGhlIEZuIGtleSBkb2VzIG5vdCBwcm9kdWNlIGEga2V5LXVwIHNlcXVlbmNlLiBTbywgdGhlIGZpcnN0CisgKiB0aW1lIHRoZSB1c2VyIHByZXNzZXMgaXQsIGl0IHdpbGwgYmUga2V5LWRvd24gZXZlbnQuIFRoZSBrZXkKKyAqIHN0YXlzIGRvd24gdW50aWwgdGhlIHVzZXIgcHJlc3NlcyBpdCBhZ2Fpbi4KKyAqLworI2RlZmluZSBOVU1fRk5fS0VZUyA1Ngorc3RhdGljIHVuc2lnbmVkIGNoYXIgZm5fa2V5c1tOVU1fRk5fS0VZU10gPSB7CisJMCwwLDAsMCwwLDAsMCwwLCAgICAgICAgLyogMCA3ICAgKi8KKwk4LDksMTAsOTMsMCwwLDAsMCwgICAgICAvKiA4IDE1ICAqLworCTAsMCwwLDAsMCwwLDAsNSwgICAgICAgIC8qIDE2IDIzICovCisJNiw3LDkxLDAsMCwwLDAsMCwgICAgICAgLyogMjQgMzEgKi8KKwkwLDAsMCwwLDAsMiwzLDQsICAgICAgICAvKiAzMiAzOSAqLworCTkyLDAsMCwwLDAsMCwwLDAsICAgICAgIC8qIDQwIDQ3ICovCisJMCwwLDAsMCwxMSwwLDk0LDk1ICAgICAgICAvKiA0OCA1NSAqLworCit9OworCit2b2lkIF9faW5pdCBpbml0X3F0cm9uaXhfOTkwUF9rYmQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJY2lyID0gKHN0cnVjdCBjaXJfcG9ydCAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjaXJfcG9ydCksIEdGUF9LRVJORUwpOworCWlmICghY2lyKSB7CisJCXByaW50aygiVW5hYmxlIHRvIGluaXRpYWxpemUgUXRyb25peCBrZXlib2FyZFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiAKKwkgKiByZXZpc2l0CisJICogdGhpcyBzaG91bGQgYmUgcHJvZ3JhbW1hYmxlLCBzb21laG93IGJ5IHRoZSwgYnkgdGhlIHVzZXIuCisJICovCisJY2lyLT5wb3J0ID0gS0JEX0NJUl9QT1JUOworCWNpci0+YmF1ZF9yYXRlID0gMHgxZDsKKwljaXItPnJkd29zID0gMDsKKwljaXItPnJ4ZGNyID0gMHgzOworCWNpci0+aGNmcyA9IDA7CisJY2lyLT5maWZvX3RsID0gMDsKKwljaXItPmNmcSA9IDB4MWQ7CisJY2lyX3BvcnRfaW5pdChjaXIpOworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEoSVQ4MTcyX0NJUjBfSVJRLCBrYmRfaW50X2hhbmRsZXIsIAorCQkJKHVuc2lnbmVkIGxvbmcgKShTQV9JTlRFUlJVUFR8U0FfU0hJUlEpLCAKKwkJCShjb25zdCBjaGFyICopIlF0cm9uaXggSVIgS2V5Ym9hcmQiLCAodm9pZCAqKWNpcik7CisKKwlpZiAocmV0dmFsKSB7CisJCXByaW50aygidW5hYmxlIHRvIGFsbG9jYXRlIGNpciAlZCBpcnEgJWRcbiIsIAorCQkJCWNpci0+cG9ydCwgSVQ4MTcyX0NJUjBfSVJRKTsKKwl9CisjaWZkZWYgQ09ORklHX1BTTU9VU0UKKwlwc2F1eF9pbml0KCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIEJpdFJldmVyc2UodW5zaWduZWQgc2hvcnQga2V5KQoreworCXVuc2lnbmVkIGNoYXIgcmtleSA9IDA7CisJcmtleSB8PSAoa2V5ICYgMHgxKSA8PCA3OworCXJrZXkgfD0gKGtleSAmIDB4MikgPDwgNTsKKwlya2V5IHw9IChrZXkgJiAweDQpIDw8IDM7CisJcmtleSB8PSAoa2V5ICYgMHg4KSA8PCAxOworCXJrZXkgfD0gKGtleSAmIDB4MTApID4+IDE7CisJcmtleSB8PSAoa2V5ICYgMHgyMCkgPj4gMzsKKwlya2V5IHw9IChrZXkgJiAweDQwKSA+PiA1OworCXJrZXkgfD0gKGtleSAmIDB4ODApID4+IDc7CisJcmV0dXJuIHJrZXk7CisKK30KKworCitzdGF0aWMgaW5saW5lIHVfaW50OF90IFVwcGVyQnl0ZSh1X2ludDhfdCBkYXRhKQoreworCXJldHVybiAoZGF0YSA+PiA0KTsKK30KKworCitzdGF0aWMgaW5saW5lIHVfaW50OF90IExvd2VyQnl0ZSh1X2ludDhfdCBkYXRhKQoreworCXJldHVybiAoZGF0YSAmIDB4Rik7Cit9CisKKworaW50IENoZWNrU3VtT2sodV9pbnQ4X3QgYnl0ZTEsIHVfaW50OF90IGJ5dGUyLCAKKwkJdV9pbnQ4X3QgYnl0ZTMsIHVfaW50OF90IGJ5dGU0LCB1X2ludDhfdCBieXRlNSkKK3sKKwl1X2ludDhfdCBDaGVja1N1bTsKKworCUNoZWNrU3VtID0gKGJ5dGUxICYgMHgwRikgKyBieXRlMiArIGJ5dGUzICsgYnl0ZTQgKyBieXRlNTsKKwlpZiAoIExvd2VyQnl0ZShVcHBlckJ5dGUoQ2hlY2tTdW0pICsgTG93ZXJCeXRlKENoZWNrU3VtKSkgIT0gVXBwZXJCeXRlKGJ5dGUxKSApCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQga2JkX2ludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGNpcl9wb3J0ICpjaXI7CisJaW50IGo7CisJdW5zaWduZWQgY2hhciBpbnRfc3RhdHVzOworCisJY2lyID0gKHN0cnVjdCBjaXJfcG9ydCAqKWRldl9pZDsKKwlpbnRfc3RhdHVzID0gZ2V0X2ludF9zdGF0dXMoY2lyKTsKKwlpZiAoaW50X3N0YXR1cyAmIDB4NCkgeworCQljbGVhcl9maWZvKGNpcik7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoY2lyX2dldF9yeF9jb3VudChjaXIpKSB7CisKKwkJY2lyX2RhdGFbZGF0YV9pbmRleF0gPSBjaXJfcmVhZF9kYXRhKGNpcik7CisKKwkJaWYgKGRhdGFfaW5kZXggPT0gMCkgey8qIGV4cGVjdGluZyBmaXJzdCBieXRlICovCisJCQlpZiAoY2lyX2RhdGFbZGF0YV9pbmRleF0gIT0gbGVhZGluZzEpIHsKKwkJCQkvL3ByaW50aygiIWxlYWRpbmcgYnl0ZSAleFxuIiwgY2lyX2RhdGFbZGF0YV9pbmRleF0pOworCQkJCXNldF9yeF9hY3RpdmUoY2lyKTsKKwkJCQljbGVhcl9maWZvKGNpcik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKGRhdGFfaW5kZXggPT0gMSkgeworCQkJaWYgKChjaXJfZGF0YVtkYXRhX2luZGV4XSAmIDB4ZikgIT0gbGVhZGluZzIpIHsKKwkJCQlzZXRfcnhfYWN0aXZlKGNpcik7CisJCQkJZGF0YV9pbmRleCA9IDA7IC8qIHN0YXJ0IG92ZXIgKi8KKwkJCQljbGVhcl9maWZvKGNpcik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlpZiAoIChjaXJfZGF0YVtkYXRhX2luZGV4XSA9PSAweGZmKSkgeyAvKiBsYXN0IGJ5dGUgKi8KKwkJCS8vcHJpbnRrKCJkYXRhX2luZGV4ICVkXG4iLCBkYXRhX2luZGV4KTsKKwkJCXNldF9yeF9hY3RpdmUoY2lyKTsKKyNpZiAwCisJCQlmb3IgKGo9MDsgajw9ZGF0YV9pbmRleDsgaisrKSB7CisJCQkJcHJpbnRrKCJyeF9kYXRhICVkOiAgJXhcbiIsIGosIGNpcl9kYXRhW2pdKTsKKwkJCX0KKyNlbmRpZgorCQkJZGF0YV9pbmRleCA9IDA7CisJCQloYW5kbGVfZGF0YShjaXJfZGF0YSk7CisJCQlyZXR1cm47CisJCX0KKwkJZWxzZSBpZiAoZGF0YV9pbmRleD4xNikgeworCQkJc2V0X3J4X2FjdGl2ZShjaXIpOworI2lmIDAKKwkJCXByaW50aygid2FybmluZzogZGF0YV9pbmRleCAlZFxuIiwgZGF0YV9pbmRleCk7CisJCQlmb3IgKGo9MDsgajw9ZGF0YV9pbmRleDsgaisrKSB7CisJCQkJcHJpbnRrKCJyeF9kYXRhICVkOiAgJXhcbiIsIGosIGNpcl9kYXRhW2pdKTsKKwkJCX0KKyNlbmRpZgorCQkJZGF0YV9pbmRleCA9IDA7CisJCQljbGVhcl9maWZvKGNpcik7CisJCQlyZXR1cm47CisJCX0KKwkJZGF0YV9pbmRleCsrOworCX0KK30KKworCisjZGVmaW5lIE5VTV9LQkRfQllURVMgNQorc3RhdGljIGludCBoYW5kbGVfZGF0YSh1bnNpZ25lZCBjaGFyICpwX2RhdGEpCit7CisJdV9pbnQzMl90IGJpdF9idWNrZXQ7CisJdV9pbnQzMl90IGksIGo7CisJdV9pbnQzMl90IGdvdF9iaXRzLCBuZXh0X2J5dGU7CisJaW50IGRvd24gPSAwOworCisJLyogUmVvcmdhbml6ZSB0aGUgYml0IHN0cmVhbSAqLworCWZvciAoaT0wOyBpPDE2OyBpKyspCisJCXBfZGF0YVtpXSA9IEJpdFJldmVyc2UofnBfZGF0YVtpXSk7CisKKwkvKiAKKwkgKiBXZSd2ZSBhbHJlYWR5IHByZXZpb3VzbHkgY2hlY2tlZCB0aGF0IHBfZGF0YVswXQorCSAqIGlzIGVxdWFsIHRvIGxlYWRpbmcxIGFuZCB0aGF0IChwX2RhdGFbMV0gJiAweGYpCisJICogaXMgZXF1YWwgdG8gbGVhZGluZzIuIFRoZXNlIHR3ZWx2ZSBiaXRzIGFyZSB0aGUKKwkgKiBsZWFkZXIgY29kZS4gIFdlIGNhbiBub3cgdGhyb3cgdGhlbSBhd2F5ICh0aGUgMTIKKwkgKiBiaXRzKSBhbmQgY29udGludWUgcGFyc2luZyB0aGUgc3RyZWFtLgorCSAqLworCWJpdF9idWNrZXQgPSBwX2RhdGFbMV0gPDwgMTI7CisJZ290X2JpdHMgPSA0OworCW5leHRfYnl0ZSA9IDI7CisKKwkvKiAKKwkgKiBQcm9jZXNzIGZvdXIgYml0cyBhdCBhIHRpbWUKKwkgKi8KKwlmb3IgKGk9MDsgaTxOVU1fS0JEX0JZVEVTOyBpKyspIHsKKworCQlrYmRieXRlc1tpXT0wOworCisJCWZvciAoaj0wOyBqPDg7IGorKykgLyogOCBiaXRzIHBlciBieXRlICovCisJCXsKKwkJCWlmIChnb3RfYml0cyA8IDQpIHsKKwkJCQliaXRfYnVja2V0IHw9IChwX2RhdGFbbmV4dF9ieXRlKytdIDw8ICg4IC0gZ290X2JpdHMpKTsKKwkJCQlnb3RfYml0cyArPSA4OworCQkJfQorCisJCQlpZiAoKGJpdF9idWNrZXQgJiAweEYwMDApID09IDB4ODAwMCkgeyAKKwkJCQkvKiBDb252ZXJ0IDEwMDBiIHRvIDEgKi8KKwkJCQlrYmRieXRlc1tpXSA9IDB4ODAgfCAoa2JkYnl0ZXNbaV0gPj4gMSk7CisJCQkJZ290X2JpdHMgLT0gNDsKKwkJCQliaXRfYnVja2V0ID0gYml0X2J1Y2tldCA8PCA0OworCQkJfQorCQkJZWxzZSBpZiAoKGJpdF9idWNrZXQgJiAweEMwMDApID09IDB4ODAwMCkgeworCQkJCS8qIENvbnZlcnQgMTBiIHRvIDAgKi8KKwkJCQlrYmRieXRlc1tpXSA9ICBrYmRieXRlc1tpXSA+PiAxOworCQkJCWdvdF9iaXRzIC09IDI7CisJCQkJYml0X2J1Y2tldCA9IGJpdF9idWNrZXQgPDwgMjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qIGJhZCBzZXJpYWwgc3RyZWFtICovCisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCWlmIChuZXh0X2J5dGUgPiAxNikgeworCQkJCS8vcHJpbnRrKCJlcnJvcjogdG9vIG1hbnkgYnl0ZXNcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisKKwlpZiAoIUNoZWNrU3VtT2soa2JkYnl0ZXNbMF0sIGtiZGJ5dGVzWzFdLCAKKwkJCQlrYmRieXRlc1syXSwga2JkYnl0ZXNbM10sIGtiZGJ5dGVzWzRdKSkgeworCQkvL3ByaW50aygiY2hlY2tzdW0gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGtiZGJ5dGVzWzFdICYgMHgwOCkgeworCQkvL3ByaW50aygibTogJXggJXggJXhcbiIsIGtiZGJ5dGVzWzFdLCBrYmRieXRlc1syXSwga2JkYnl0ZXNbM10pOworCQloYW5kbGVfbW91c2VfZXZlbnQoa2JkYnl0ZXNbMV0pOworCQloYW5kbGVfbW91c2VfZXZlbnQoa2JkYnl0ZXNbMl0pOworCQloYW5kbGVfbW91c2VfZXZlbnQoa2JkYnl0ZXNbM10pOworCX0KKwllbHNlIHsKKwkJaWYgKGtiZGJ5dGVzWzJdID09IDApIGRvd24gPSAxOworI2lmIDAKKwkJaWYgKGRvd24pCisJCQlwcmludGsoImRvd24gJWRcbiIsIGtiZGJ5dGVzWzNdKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJ1cCAlZFxuIiwga2JkYnl0ZXNbM10pOworI2VuZGlmCisJCWhhbmRsZV9rZXlib2FyZF9ldmVudChrYmRieXRlc1szXSwgZG93bik7CisJfQorCXJldHVybiAwOworfQorCisKK0RFRklORV9TUElOTE9DSyhrYmRfY29udHJvbGxlcl9sb2NrKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhhbmRsZV9rYmRfZXZlbnQodm9pZCk7CisKKworaW50IGtiZF9zZXRrZXljb2RlKHVuc2lnbmVkIGludCBzY2FuY29kZSwgdW5zaWduZWQgaW50IGtleWNvZGUpCit7CisJcHJpbnRrKCJrYmRfc2V0a2V5Y29kZSBzY2FuY29kZSAleCBrZXljb2RlICV4XG4iLCBzY2FuY29kZSwga2V5Y29kZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBrYmRfZ2V0a2V5Y29kZSh1bnNpZ25lZCBpbnQgc2NhbmNvZGUpCit7CisJcmV0dXJuIHNjYW5jb2RlOworfQorCisKK2ludCBrYmRfdHJhbnNsYXRlKHVuc2lnbmVkIGNoYXIgc2NhbmNvZGUsIHVuc2lnbmVkIGNoYXIgKmtleWNvZGUsCisJCSAgICBjaGFyIHJhd19tb2RlKQoreworCXN0YXRpYyBpbnQgcHJldl9zY2FuY29kZSA9IDA7CisKKwlpZiAoc2NhbmNvZGUgPT0gMHgwMCB8fCBzY2FuY29kZSA9PSAweGZmKSB7CisJCXByZXZfc2NhbmNvZGUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0b2RvICovCisJaWYgKCFwcmV2X3NjYW5jb2RlICYmIHNjYW5jb2RlID09IDE2MCkgeyAvKiBGbiBrZXkgZG93biAqLworCQkvL3ByaW50aygiRm4ga2V5IGRvd25cbiIpOworCQlwcmV2X3NjYW5jb2RlID0gMTYwOworCQlyZXR1cm4gMDsKKwl9CisJZWxzZSBpZiAocHJldl9zY2FuY29kZSAmJiBzY2FuY29kZSA9PSAxNjApIHsgLyogRm4ga2V5IHVwICovCisJCS8vcHJpbnRrKCJGbiBrZXkgdXBcbiIpOworCQlwcmV2X3NjYW5jb2RlID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogdG9kbyAqLworCWlmIChwcmV2X3NjYW5jb2RlID09IDE2MCkgeworCQlpZiAoc2NhbmNvZGUgPD0gTlVNX0ZOX0tFWVMpIHsKKwkJCSprZXljb2RlID0gZm5fa2V5c1tzY2FuY29kZV07CisJCQkvL3ByaW50aygiZm4ga2V5Y29kZSAlZFxuIiwgKmtleWNvZGUpOworCQl9CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0gCisJZWxzZSBpZiAoc2NhbmNvZGUgPD0gMTI3KSB7CisJCSprZXljb2RlID0gc2NhbmNvZGU7CisJfQorCWVsc2UKKwkJcmV0dXJuIDA7CisKKworIAlyZXR1cm4gMTsKK30KKworY2hhciBrYmRfdW5leHBlY3RlZF91cCh1bnNpZ25lZCBjaGFyIGtleWNvZGUpCit7CisJLy9wcmludGsoImtiZF91bmV4cGVjdGVkX3VwXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIga2JkX2V4aXN0cyA9IDE7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfa2V5Ym9hcmRfZXZlbnQodW5zaWduZWQgY2hhciBzY2FuY29kZSwgaW50IGRvd24pCit7CisJa2JkX2V4aXN0cyA9IDE7CisJaGFuZGxlX3NjYW5jb2RlKHNjYW5jb2RlLCBkb3duKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZrZXlib2FyZF90YXNrbGV0KTsKK30JCisKKwordm9pZCBrYmRfbGVkcyh1bnNpZ25lZCBjaGFyIGxlZHMpCit7Cit9CisKKy8qIGR1bW15ICovCit2b2lkIGtiZF9pbml0X2h3KHZvaWQpCit7Cit9CisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX21vdXNlX2V2ZW50KHVuc2lnbmVkIGNoYXIgc2NhbmNvZGUpCit7CisJaWYoc2NhbmNvZGUgPT0gQVVYX1JFQ09OTkVDVCl7CisJCXF1ZXVlLT5oZWFkID0gcXVldWUtPnRhaWwgPSAwOyAgLyogRmx1c2ggaW5wdXQgcXVldWUgKi8KKwkvLwlfX2F1eF93cml0ZV9hY2soQVVYX0VOQUJMRV9ERVYpOyAgLyogcGluZyB0aGUgbW91c2UgOikgKi8KKwkJcmV0dXJuOworCX0KKworCWlmIChhdXhfY291bnQpIHsKKwkJaW50IGhlYWQgPSBxdWV1ZS0+aGVhZDsKKworCQlxdWV1ZS0+YnVmW2hlYWRdID0gc2NhbmNvZGU7CisJCWhlYWQgPSAoaGVhZCArIDEpICYgKEFVWF9CVUZfU0laRS0xKTsKKwkJaWYgKGhlYWQgIT0gcXVldWUtPnRhaWwpIHsKKwkJCXF1ZXVlLT5oZWFkID0gaGVhZDsKKwkJCWtpbGxfZmFzeW5jKCZxdWV1ZS0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnF1ZXVlLT5wcm9jX2xpc3QpOworCQl9CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBnZXRfZnJvbV9xdWV1ZSh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgma2JkX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOworCXJlc3VsdCA9IHF1ZXVlLT5idWZbcXVldWUtPnRhaWxdOworCXF1ZXVlLT50YWlsID0gKHF1ZXVlLT50YWlsICsgMSkgJiAoQVVYX0JVRl9TSVpFLTEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtiZF9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHF1ZXVlX2VtcHR5KHZvaWQpCit7CisJcmV0dXJuIHF1ZXVlLT5oZWFkID09IHF1ZXVlLT50YWlsOworfQorCitzdGF0aWMgaW50IGZhc3luY19hdXgoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQoreworCWludCByZXR2YWw7CisKKwkvL3ByaW50aygiZmFzeW5jX2F1eFxuIik7CisJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sICZxdWV1ZS0+ZmFzeW5jKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogUmFuZG9tIG1hZ2ljIGNvb2tpZSBmb3IgdGhlIGF1eCBkZXZpY2UKKyAqLworI2RlZmluZSBBVVhfREVWICgodm9pZCAqKXF1ZXVlKQorCitzdGF0aWMgaW50IHJlbGVhc2VfYXV4KHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJZmFzeW5jX2F1eCgtMSwgZmlsZSwgMCk7CisJYXV4X2NvdW50LS07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9hdXgoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlpZiAoYXV4X2NvdW50KyspIHsKKwkJcmV0dXJuIDA7CisJfQorCXF1ZXVlLT5oZWFkID0gcXVldWUtPnRhaWwgPSAwOwkJLyogRmx1c2ggaW5wdXQgcXVldWUgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFB1dCBieXRlcyBmcm9tIGlucHV0IHF1ZXVlIHRvIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgc3NpemVfdCByZWFkX2F1eChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgKiBidWZmZXIsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IGkgPSBjb3VudDsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlpZiAocXVldWVfZW1wdHkoKSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJYWRkX3dhaXRfcXVldWUoJnF1ZXVlLT5wcm9jX2xpc3QsICZ3YWl0KTsKK3JlcGVhdDoKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHF1ZXVlX2VtcHR5KCkgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlzY2hlZHVsZSgpOworCQkJZ290byByZXBlYXQ7CisJCX0KKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZxdWV1ZS0+cHJvY19saXN0LCAmd2FpdCk7CisJfQorCXdoaWxlIChpID4gMCAmJiAhcXVldWVfZW1wdHkoKSkgeworCQljID0gZ2V0X2Zyb21fcXVldWUoKTsKKwkJcHV0X3VzZXIoYywgYnVmZmVyKyspOworCQlpLS07CisJfQorCWlmIChjb3VudC1pKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJaW5vZGUtPmlfYXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCQlyZXR1cm4gY291bnQtaTsKKwl9CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCXJldHVybiAwOworfQorCisvKgorICogV3JpdGUgdG8gdGhlIGF1eCBkZXZpY2UuCisgKi8KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfYXV4KHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciAqIGJ1ZmZlciwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwkvKgorCSAqIFRoZSBJVEUgYm9hcmRzIHRoaXMgd2FzIHRlc3RlZCBvbiBkaWQgbm90IGhhdmUgdGhlCisJICogdHJhbnNtaXQgd2lyZXMgY29ubmVjdGVkLgorCSAqLworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhdXhfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCit7CisJcG9sbF93YWl0KGZpbGUsICZxdWV1ZS0+cHJvY19saXN0LCB3YWl0KTsKKwlpZiAoIXF1ZXVlX2VtcHR5KCkpCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBzYXV4X2ZvcHMgPSB7CisJLnJlYWQJCT0gcmVhZF9hdXgsCisJLndyaXRlCQk9IHdyaXRlX2F1eCwKKwkucG9sbAkJPSBhdXhfcG9sbCwKKwkub3BlbgkJPSBvcGVuX2F1eCwKKwkucmVsZWFzZQk9IHJlbGVhc2VfYXV4LAorCS5mYXN5bmMJCT0gZmFzeW5jX2F1eCwKK307CisKKy8qCisgKiBJbml0aWFsaXplIGRyaXZlci4KKyAqLworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHBzYXV4X21vdXNlID0geworCVBTTU9VU0VfTUlOT1IsICJwc2F1eCIsICZwc2F1eF9mb3BzCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwc2F1eF9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IG1pc2NfcmVnaXN0ZXIoJnBzYXV4X21vdXNlKTsKKwlpZihyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJcXVldWUgPSAoc3RydWN0IGF1eF9xdWV1ZSAqKSBrbWFsbG9jKHNpemVvZigqcXVldWUpLCBHRlBfS0VSTkVMKTsKKwltZW1zZXQocXVldWUsIDAsIHNpemVvZigqcXVldWUpKTsKKwlxdWV1ZS0+aGVhZCA9IHF1ZXVlLT50YWlsID0gMDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxdWV1ZS0+cHJvY19saXN0KTsKKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoaW5pdF9xdHJvbml4Xzk5MFBfa2JkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3F0cm9uaXhtYXAuY19zaGlwcGVkIGIvZHJpdmVycy9jaGFyL3F0cm9uaXhtYXAuY19zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmI5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcXRyb25peG1hcC5jX3NoaXBwZWQKQEAgLTAsMCArMSwyNjUgQEAKKworLyogRG8gbm90IGVkaXQgdGhpcyBmaWxlISBJdCB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgICAqLworLyogICAgbG9hZGtleXMgLS1ta3RhYmxlIGRlZmtleW1hcC5tYXAgPiBkZWZrZXltYXAuYyAgICAgICAgICAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXlib2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tkLmg+CisKK3Vfc2hvcnQgcGxhaW5fbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMDYwLAkweGYwMzEsCTB4ZjAzMiwJMHhmMDMzLAkweGYwMzQsCTB4ZjAzNSwJMHhmMDM2LAorCTB4ZjAzNywJMHhmMDM4LAkweGYwMzksCTB4ZjAzMCwJMHhmMDJkLAkweGYwM2QsCTB4ZjIwMCwJMHhmMDdmLAorCTB4ZjAwOSwJMHhmYjcxLAkweGZiNzcsCTB4ZmI2NSwJMHhmYjcyLAkweGZiNzQsCTB4ZmI3OSwJMHhmYjc1LAorCTB4ZmI2OSwJMHhmYjZmLAkweGZiNzAsCTB4ZjA1YiwJMHhmMDVkLAkweGYwNWMsCTB4ZjIwNywJMHhmYjYxLAorCTB4ZmI3MywJMHhmYjY0LAkweGZiNjYsCTB4ZmI2NywJMHhmYjY4LAkweGZiNmEsCTB4ZmI2YiwJMHhmYjZjLAorCTB4ZjAzYiwJMHhmMDI3LAkweGYwNjAsCTB4ZjIwMSwJMHhmNzAwLAkweGYyMDAsCTB4ZmI3YSwJMHhmYjc4LAorCTB4ZmI2MywJMHhmYjc2LAkweGZiNjIsCTB4ZmI2ZSwJMHhmYjZkLAkweGYwMmMsCTB4ZjAyZSwJMHhmMDJmLAorCTB4ZjIwMCwJMHhmNzAwLAkweGY3MDIsCTB4ZjIwMCwJMHhmNzAzLAkweGYwMjAsCTB4ZjcwMywJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNSwJMHhmMDdmLAkweGYyMDAsCTB4ZjIwMCwJMHhmNjAxLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMywJMHhmNjAwLAkweGYxMTgsCTB4ZjExOSwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNjAyLAkweGYyMDgsCTB4ZjAyZCwJMHhmMDJiLAkweGYzMGMsCTB4ZjAyZSwJMHhmMzBkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNywJMHhmNjAwLAkweGYyMDAsCTB4ZjAxYiwJMHhmMjAwLAorCTB4ZjEwMCwJMHhmMTAxLAkweGYxMDIsCTB4ZjEwMywJMHhmMTA0LAkweGYxMDUsCTB4ZjEwNiwJMHhmMTA3LAorCTB4ZjEwOCwJMHhmMTA5LAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExZCwJMHhmMjAwLAorfTsKKwordV9zaG9ydCBzaGlmdF9tYXBbTlJfS0VZU10gPSB7CisJMHhmMjAwLAkweGYwN2UsCTB4ZjAyMSwJMHhmMDQwLAkweGYwMjMsCTB4ZjAyNCwJMHhmMDI1LAkweGYwNWUsCisJMHhmMDI2LAkweGYwMmEsCTB4ZjAyOCwJMHhmMDI5LAkweGYwNWYsCTB4ZjAyYiwJMHhmMjAwLAkweGYwN2YsCisJMHhmMDA5LAkweGZiNTEsCTB4ZmI1NywJMHhmYjQ1LAkweGZiNTIsCTB4ZmI1NCwJMHhmYjU5LAkweGZiNTUsCisJMHhmYjQ5LAkweGZiNGYsCTB4ZmI1MCwJMHhmMDdiLAkweGYwN2QsCTB4ZjA3YywJMHhmMjA3LAkweGZiNDEsCisJMHhmYjUzLAkweGZiNDQsCTB4ZmI0NiwJMHhmYjQ3LAkweGZiNDgsCTB4ZmI0YSwJMHhmYjRiLAkweGZiNGMsCisJMHhmMDNhLAkweGYwMjIsCTB4ZjA3ZSwJMHhmMjAxLAkweGY3MDAsCTB4ZjIwMCwJMHhmYjVhLAkweGZiNTgsCisJMHhmYjQzLAkweGZiNTYsCTB4ZmI0MiwJMHhmYjRlLAkweGZiNGQsCTB4ZjAzYywJMHhmMDNlLAkweGYwM2YsCisJMHhmMjAwLAkweGY3MDAsCTB4ZjcwMiwJMHhmMjAwLAkweGY3MDMsCTB4ZjAyMCwJMHhmNzAzLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTE1LAkweGYwN2YsCTB4ZjIwMCwJMHhmMjAwLAkweGY2MDEsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmNjAzLAkweGY2MDAsCTB4ZjIwYiwJMHhmMjBhLAkweGYyMDAsCisJMHhmMjAwLAkweGY2MDIsCTB4ZjIxMywJMHhmMDJkLAkweGYwMmIsCTB4ZjMwYywJMHhmMDJlLAkweGYzMGQsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTE3LAkweGY2MDAsCTB4ZjIwMCwJMHhmMDFiLAkweGYyMDAsCisJMHhmMTBhLAkweGYxMGIsCTB4ZjEwYywJMHhmMTBkLAkweGYxMGUsCTB4ZjEwZiwJMHhmMTEwLAkweGYxMTEsCisJMHhmMTEyLAkweGYxMTMsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTFkLAkweGYyMDAsCit9OworCit1X3Nob3J0IGFsdGdyX21hcFtOUl9LRVlTXSA9IHsKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYwNDAsCTB4ZjIwMCwJMHhmMDI0LAkweGYyMDAsCTB4ZjIwMCwKKwkweGYwN2IsCTB4ZjA1YiwJMHhmMDVkLAkweGYwN2QsCTB4ZjA1YywJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZmI3MSwJMHhmYjc3LAkweGZiNjUsCTB4ZmI3MiwJMHhmYjc0LAkweGZiNzksCTB4ZmI3NSwKKwkweGZiNjksCTB4ZmI2ZiwJMHhmYjcwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDcsCTB4ZmI2MSwKKwkweGZiNzMsCTB4ZmI2NCwJMHhmYjY2LAkweGZiNjcsCTB4ZmI2OCwJMHhmYjZhLAkweGZiNmIsCTB4ZmI2YywKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDEsCTB4ZjcwMCwJMHhmMjAwLAkweGZiN2EsCTB4ZmI3OCwKKwkweGZiNjMsCTB4ZmI3NiwJMHhmYjYyLAkweGZiNmUsCTB4ZmI2ZCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjcwMCwJMHhmNzAyLAkweGYyMDAsCTB4ZjcwMywJMHhmMjAwLAkweGY3MDMsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTUsCTB4ZjA3ZiwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMSwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGY2MDMsCTB4ZjYwMCwJMHhmMTE4LAkweGYxMTksCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjYwMiwJMHhmMjA4LAkweGYwMmQsCTB4ZjAyYiwJMHhmMzBjLAkweGYwMmUsCTB4ZjMwZCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTcsCTB4ZjYwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGY1MGMsCTB4ZjUwZCwJMHhmNTBlLAkweGY1MGYsCTB4ZjUxMCwJMHhmNTExLAkweGY1MTIsCTB4ZjUxMywKKwkweGY1MTQsCTB4ZjUxNSwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMWQsCTB4ZjIwMCwKK307CisKK3Vfc2hvcnQgY3RybF9tYXBbTlJfS0VZU10gPSB7CisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMDAwLAkweGYwMWIsCTB4ZjAxYywJMHhmMDFkLAkweGYwMWUsCisJMHhmMDFmLAkweGYwN2YsCTB4ZjIwMCwJMHhmMjAwLAkweGYwMWYsCTB4ZjIwMCwJMHhmMjAwLAkweGYwMDgsCisJMHhmMjAwLAkweGYwMTEsCTB4ZjAxNywJMHhmMDA1LAkweGYwMTIsCTB4ZjAxNCwJMHhmMDE5LAkweGYwMTUsCisJMHhmMDA5LAkweGYwMGYsCTB4ZjAxMCwJMHhmMDFiLAkweGYwMWQsCTB4ZjAxYywJMHhmMjA3LAkweGYwMDEsCisJMHhmMDEzLAkweGYwMDQsCTB4ZjAwNiwJMHhmMDA3LAkweGYwMDgsCTB4ZjAwYSwJMHhmMDBiLAkweGYwMGMsCisJMHhmMDA3LAkweGYwMDAsCTB4ZjIwMCwJMHhmMjAxLAkweGY3MDAsCTB4ZjIwMCwJMHhmMDFhLAkweGYwMTgsCisJMHhmMDAzLAkweGYwMTYsCTB4ZjAwMiwJMHhmMDBlLAkweGYyMGUsCTB4ZjA3ZiwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGY3MDAsCTB4ZjcwMiwJMHhmMjAwLAkweGY3MDMsCTB4ZjAwMCwJMHhmNzAzLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTE1LAkweGYwN2YsCTB4ZjIwMCwJMHhmMjAwLAkweGY2MDEsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmNjAzLAkweGY2MDAsCTB4ZjExOCwJMHhmMTE5LAkweGYyMDAsCisJMHhmMjAwLAkweGY2MDIsCTB4ZjIwOCwJMHhmMDJkLAkweGYwMmIsCTB4ZjMwYywJMHhmMDJlLAkweGYzMGQsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTE3LAkweGY2MDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMTAwLAkweGYxMDEsCTB4ZjEwMiwJMHhmMTAzLAkweGYxMDQsCTB4ZjEwNSwJMHhmMTA2LAkweGYxMDcsCisJMHhmMTA4LAkweGYxMDksCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTFkLAkweGYyMDAsCit9OworCit1X3Nob3J0IHNoaWZ0X2N0cmxfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjAwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMDFmLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMDExLAkweGYwMTcsCTB4ZjAwNSwJMHhmMDEyLAkweGYwMTQsCTB4ZjAxOSwJMHhmMDE1LAorCTB4ZjAwOSwJMHhmMDBmLAkweGYwMTAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwNywJMHhmMDAxLAorCTB4ZjAxMywJMHhmMDA0LAkweGYwMDYsCTB4ZjAwNywJMHhmMDA4LAkweGYwMGEsCTB4ZjAwYiwJMHhmMDBjLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMSwJMHhmNzAwLAkweGYyMDAsCTB4ZjAxYSwJMHhmMDE4LAorCTB4ZjAwMywJMHhmMDE2LAkweGYwMDIsCTB4ZjAwZSwJMHhmMDBkLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNzAwLAkweGY3MDIsCTB4ZjIwMCwJMHhmNzAzLAkweGYyMDAsCTB4ZjcwMywJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNSwJMHhmMDdmLAkweGYyMDAsCTB4ZjIwMCwJMHhmNjAxLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMywJMHhmNjAwLAkweGYxMTgsCTB4ZjExOSwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNjAyLAkweGYyMDgsCTB4ZjAyZCwJMHhmMDJiLAkweGYzMGMsCTB4ZjAyZSwJMHhmMzBkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNywJMHhmNjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExZCwJMHhmMjAwLAorfTsKKwordV9zaG9ydCBhbHRfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmODFiLAkweGY4MzEsCTB4ZjgzMiwJMHhmODMzLAkweGY4MzQsCTB4ZjgzNSwJMHhmODM2LAorCTB4ZjgzNywJMHhmODM4LAkweGY4MzksCTB4ZjgzMCwJMHhmODJkLAkweGY4M2QsCTB4ZjIwMCwJMHhmODdmLAorCTB4ZjgwOSwJMHhmODcxLAkweGY4NzcsCTB4Zjg2NSwJMHhmODcyLAkweGY4NzQsCTB4Zjg3OSwJMHhmODc1LAorCTB4Zjg2OSwJMHhmODZmLAkweGY4NzAsCTB4Zjg1YiwJMHhmODVkLAkweGY4NWMsCTB4ZjIwNywJMHhmODYxLAorCTB4Zjg3MywJMHhmODY0LAkweGY4NjYsCTB4Zjg2NywJMHhmODY4LAkweGY4NmEsCTB4Zjg2YiwJMHhmODNiLAorCTB4ZjgyNywJMHhmODYwLAkweGYyMDAsCTB4ZjgwZCwJMHhmNzAwLAkweGYyMDAsCTB4Zjg3YSwJMHhmODc4LAorCTB4Zjg2MywJMHhmODc2LAkweGY4NjIsCTB4ZjgyYywJMHhmODJlLAkweGY4MmYsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNzAwLAkweGY3MDIsCTB4ZjIwMCwJMHhmNzAzLAkweGY4MjAsCTB4ZjcwMywJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNSwJMHhmMDdmLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjEwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMywJMHhmNjAwLAkweGYxMTgsCTB4ZjExOSwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjExLAkweGYyMDgsCTB4ZjAyZCwJMHhmMDJiLAkweGYzMGMsCTB4ZjAyZSwJMHhmMzBkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNywJMHhmNjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjUwMCwJMHhmNTAxLAkweGY1MDIsCTB4ZjUwMywJMHhmNTA0LAkweGY1MDUsCTB4ZjUwNiwJMHhmNTA3LAorCTB4ZjUwOCwJMHhmNTA5LAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExZCwJMHhmMjAwLAorfTsKKwordV9zaG9ydCBjdHJsX2FsdF9tYXBbTlJfS0VZU10gPSB7CisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGY4MTEsCTB4ZjgxNywJMHhmODA1LAkweGY4MTIsCTB4ZjgxNCwJMHhmODE5LAkweGY4MTUsCisJMHhmODA5LAkweGY4MGYsCTB4ZjgxMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjA3LAkweGY4MDEsCisJMHhmODEzLAkweGY4MDQsCTB4ZjgwNiwJMHhmODA3LAkweGY4MDgsCTB4ZjgwYSwJMHhmODBiLAkweGY4MGMsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAxLAkweGY3MDAsCTB4ZjIwMCwJMHhmODFhLAkweGY4MTgsCisJMHhmODAzLAkweGY4MTYsCTB4ZjgwMiwJMHhmODBlLAkweGY4MGQsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGY3MDAsCTB4ZjcwMiwJMHhmMjAwLAkweGY3MDMsCTB4ZjIwMCwJMHhmNzAzLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTE1LAkweGYwN2YsCTB4ZjIwMCwJMHhmMjAwLAkweGY2MDEsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmNjAzLAkweGY2MDAsCTB4ZjExOCwJMHhmMTE5LAkweGYyMDAsCisJMHhmMjAwLAkweGY2MDIsCTB4ZjIwOCwJMHhmMDJkLAkweGYwMmIsCTB4ZjMwYywJMHhmMDJlLAkweGYzMGQsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTE3LAkweGY2MDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmNTAwLAkweGY1MDEsCTB4ZjUwMiwJMHhmNTAzLAkweGY1MDQsCTB4ZjUwNSwJMHhmNTA2LAkweGY1MDcsCisJMHhmNTA4LAkweGY1MDksCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTFkLAkweGYyMDAsCit9OworCit1c2hvcnQgKmtleV9tYXBzW01BWF9OUl9LRVlNQVBTXSA9IHsKKwlwbGFpbl9tYXAsIHNoaWZ0X21hcCwgYWx0Z3JfbWFwLCAwLAorCWN0cmxfbWFwLCBzaGlmdF9jdHJsX21hcCwgMCwgMCwKKwlhbHRfbWFwLCAwLCAwLCAwLAorCWN0cmxfYWx0X21hcCwJMAorfTsKKwordW5zaWduZWQgaW50IGtleW1hcF9jb3VudCA9IDc7CisKKworLyoKKyAqIFBoaWxvc29waHk6IG1vc3QgcGVvcGxlIGRvIG5vdCBkZWZpbmUgbW9yZSBzdHJpbmdzLCBidXQgdGhleSB3aG8gZG8KKyAqIG9mdGVuIHdhbnQgcXVpdGUgYSBsb3Qgb2Ygc3RyaW5nIHNwYWNlLiBTbywgd2Ugc3RhdGljYWxseSBhbGxvY2F0ZQorICogdGhlIGRlZmF1bHQgYW5kIGFsbG9jYXRlIGR5bmFtaWNhbGx5IGluIGNodW5rcyBvZiA1MTIgYnl0ZXMuCisgKi8KKworY2hhciBmdW5jX2J1ZltdID0geworCSdcMDMzJywgJ1snLCAnWycsICdBJywgMCwgCisJJ1wwMzMnLCAnWycsICdbJywgJ0InLCAwLCAKKwknXDAzMycsICdbJywgJ1snLCAnQycsIDAsIAorCSdcMDMzJywgJ1snLCAnWycsICdEJywgMCwgCisJJ1wwMzMnLCAnWycsICdbJywgJ0UnLCAwLCAKKwknXDAzMycsICdbJywgJzEnLCAnNycsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcxJywgJzgnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMScsICc5JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnMCcsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJzEnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICczJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnNCcsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJzUnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICc2JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnOCcsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJzknLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMycsICcxJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzMnLCAnMicsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICczJywgJzMnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMycsICc0JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzEnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICczJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzQnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnNScsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICc2JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJ00nLCAwLCAKKwknXDAzMycsICdbJywgJ1AnLCAwLCAKK307CisKKworY2hhciAqZnVuY2J1ZnB0ciA9IGZ1bmNfYnVmOworaW50IGZ1bmNidWZzaXplID0gc2l6ZW9mKGZ1bmNfYnVmKTsKK2ludCBmdW5jYnVmbGVmdCA9IDA7ICAgICAgICAgIC8qIHNwYWNlIGxlZnQgKi8KKworY2hhciAqZnVuY190YWJsZVtNQVhfTlJfRlVOQ10gPSB7CisJZnVuY19idWYgKyAwLAorCWZ1bmNfYnVmICsgNSwKKwlmdW5jX2J1ZiArIDEwLAorCWZ1bmNfYnVmICsgMTUsCisJZnVuY19idWYgKyAyMCwKKwlmdW5jX2J1ZiArIDI1LAorCWZ1bmNfYnVmICsgMzEsCisJZnVuY19idWYgKyAzNywKKwlmdW5jX2J1ZiArIDQzLAorCWZ1bmNfYnVmICsgNDksCisJZnVuY19idWYgKyA1NSwKKwlmdW5jX2J1ZiArIDYxLAorCWZ1bmNfYnVmICsgNjcsCisJZnVuY19idWYgKyA3MywKKwlmdW5jX2J1ZiArIDc5LAorCWZ1bmNfYnVmICsgODUsCisJZnVuY19idWYgKyA5MSwKKwlmdW5jX2J1ZiArIDk3LAorCWZ1bmNfYnVmICsgMTAzLAorCWZ1bmNfYnVmICsgMTA5LAorCWZ1bmNfYnVmICsgMTE1LAorCWZ1bmNfYnVmICsgMTIwLAorCWZ1bmNfYnVmICsgMTI1LAorCWZ1bmNfYnVmICsgMTMwLAorCWZ1bmNfYnVmICsgMTM1LAorCWZ1bmNfYnVmICsgMTQwLAorCWZ1bmNfYnVmICsgMTQ1LAorCTAsCisJMCwKKwlmdW5jX2J1ZiArIDE0OSwKKwkwLAorfTsKKworc3RydWN0IGtiZGlhY3IgYWNjZW50X3RhYmxlW01BWF9ESUFDUl0gPSB7CisJeydgJywgJ0EnLCAnwCd9LAl7J2AnLCAnYScsICfgJ30sCisJeydcJycsICdBJywgJ8EnfSwJeydcJycsICdhJywgJ+EnfSwKKwl7J14nLCAnQScsICfCJ30sCXsnXicsICdhJywgJ+InfSwKKwl7J34nLCAnQScsICfDJ30sCXsnficsICdhJywgJ+MnfSwKKwl7JyInLCAnQScsICfEJ30sCXsnIicsICdhJywgJ+QnfSwKKwl7J08nLCAnQScsICfFJ30sCXsnbycsICdhJywgJ+UnfSwKKwl7JzAnLCAnQScsICfFJ30sCXsnMCcsICdhJywgJ+UnfSwKKwl7J0EnLCAnQScsICfFJ30sCXsnYScsICdhJywgJ+UnfSwKKwl7J0EnLCAnRScsICfGJ30sCXsnYScsICdlJywgJ+YnfSwKKwl7JywnLCAnQycsICfHJ30sCXsnLCcsICdjJywgJ+cnfSwKKwl7J2AnLCAnRScsICfIJ30sCXsnYCcsICdlJywgJ+gnfSwKKwl7J1wnJywgJ0UnLCAnySd9LAl7J1wnJywgJ2UnLCAn6Sd9LAorCXsnXicsICdFJywgJ8onfSwJeydeJywgJ2UnLCAn6id9LAorCXsnIicsICdFJywgJ8snfSwJeyciJywgJ2UnLCAn6yd9LAorCXsnYCcsICdJJywgJ8wnfSwJeydgJywgJ2knLCAn7Cd9LAorCXsnXCcnLCAnSScsICfNJ30sCXsnXCcnLCAnaScsICftJ30sCisJeydeJywgJ0knLCAnzid9LAl7J14nLCAnaScsICfuJ30sCisJeyciJywgJ0knLCAnzyd9LAl7JyInLCAnaScsICfvJ30sCisJeyctJywgJ0QnLCAn0Cd9LAl7Jy0nLCAnZCcsICfwJ30sCisJeyd+JywgJ04nLCAn0Sd9LAl7J34nLCAnbicsICfxJ30sCisJeydgJywgJ08nLCAn0id9LAl7J2AnLCAnbycsICfyJ30sCisJeydcJycsICdPJywgJ9MnfSwJeydcJycsICdvJywgJ/MnfSwKKwl7J14nLCAnTycsICfUJ30sCXsnXicsICdvJywgJ/QnfSwKKwl7J34nLCAnTycsICfVJ30sCXsnficsICdvJywgJ/UnfSwKKwl7JyInLCAnTycsICfWJ30sCXsnIicsICdvJywgJ/YnfSwKKwl7Jy8nLCAnTycsICfYJ30sCXsnLycsICdvJywgJ/gnfSwKKwl7J2AnLCAnVScsICfZJ30sCXsnYCcsICd1JywgJ/knfSwKKwl7J1wnJywgJ1UnLCAn2id9LAl7J1wnJywgJ3UnLCAn+id9LAorCXsnXicsICdVJywgJ9snfSwJeydeJywgJ3UnLCAn+yd9LAorCXsnIicsICdVJywgJ9wnfSwJeyciJywgJ3UnLCAn/Cd9LAorCXsnXCcnLCAnWScsICfdJ30sCXsnXCcnLCAneScsICf9J30sCisJeydUJywgJ0gnLCAn3id9LAl7J3QnLCAnaCcsICf+J30sCisJeydzJywgJ3MnLCAn3yd9LAl7JyInLCAneScsICf/J30sCisJeydzJywgJ3onLCAn3yd9LAl7J2knLCAnaicsICf/J30sCit9OworCit1bnNpZ25lZCBpbnQgYWNjZW50X3RhYmxlX3NpemUgPSA2ODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9xdHJvbml4bWFwLm1hcCBiL2RyaXZlcnMvY2hhci9xdHJvbml4bWFwLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDFmZjVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3F0cm9uaXhtYXAubWFwCkBAIC0wLDAgKzEsMjg3IEBACisjIERlZmF1bHQga2VybmVsIGtleW1hcC4gVGhpcyB1c2VzIDcgbW9kaWZpZXIgY29tYmluYXRpb25zLgora2V5bWFwcyAwLTIsNC01LDgsMTIKKyMgQ2hhbmdlIHRoZSBhYm92ZSBsaW5lIGludG8KKyMJa2V5bWFwcyAwLTIsNC02LDgsMTIKKyMgaW4gY2FzZSB5b3Ugd2FudCB0aGUgZW50cmllcworIwlhbHRnciAgIGNvbnRyb2wga2V5Y29kZSAgODMgPSBCb290ICAgICAgICAgICAgCisjCWFsdGdyICAgY29udHJvbCBrZXljb2RlIDExMSA9IEJvb3QgICAgICAgICAgICAKKyMgYmVsb3cuCisjCisjIEluIGZhY3QgQWx0R3IgaXMgdXNlZCB2ZXJ5IGxpdHRsZSwgYW5kIG9uZSBtb3JlIGtleW1hcCBjYW4KKyMgYmUgc2F2ZWQgYnkgbWFwcGluZyBBbHRHciB0byBBbHQgKGFuZCBhZGFwdGluZyBhIGZldyBlbnRyaWVzKToKKyMga2V5Y29kZSAxMDAgPSBBbHQKKyMKK2tleWNvZGUgICAxID0gZ3JhdmUgICAgICAgIGFzY2lpdGlsZGUKKwlhbHQgICAgIGtleWNvZGUgICAxID0gTWV0YV9Fc2NhcGUgICAgIAora2V5Y29kZSAgIDIgPSBvbmUgICAgICAgICAgICAgIGV4Y2xhbSAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgICAyID0gTWV0YV9vbmUgICAgICAgIAora2V5Y29kZSAgIDMgPSB0d28gICAgICAgICAgICAgIGF0ICAgICAgICAgICAgICAgYXQgICAgICAgICAgICAgIAorCWNvbnRyb2wJa2V5Y29kZSAgIDMgPSBudWwgICAgICAgICAgICAgCisJc2hpZnQJY29udHJvbAlrZXljb2RlICAgMyA9IG51bCAgICAgICAgICAgICAKKwlhbHQJa2V5Y29kZSAgIDMgPSBNZXRhX3R3byAgICAgICAgCitrZXljb2RlICAgNCA9IHRocmVlICAgICAgICAgICAgbnVtYmVyc2lnbiAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgIDQgPSBFc2NhcGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAgNCA9IE1ldGFfdGhyZWUgICAgICAKK2tleWNvZGUgICA1ID0gZm91ciAgICAgICAgICAgICBkb2xsYXIgICAgICAgICAgIGRvbGxhciAgICAgICAgICAKKwljb250cm9sIGtleWNvZGUgICA1ID0gQ29udHJvbF9iYWNrc2xhc2gKKwlhbHQgICAgIGtleWNvZGUgICA1ID0gTWV0YV9mb3VyICAgICAgIAora2V5Y29kZSAgIDYgPSBmaXZlICAgICAgICAgICAgIHBlcmNlbnQgICAgICAgICAKKwljb250cm9sIGtleWNvZGUgICA2ID0gQ29udHJvbF9icmFja2V0cmlnaHQKKwlhbHQgICAgIGtleWNvZGUgICA2ID0gTWV0YV9maXZlICAgICAgIAora2V5Y29kZSAgIDcgPSBzaXggICAgICAgICAgICAgIGFzY2lpY2lyY3VtICAgICAKKwljb250cm9sIGtleWNvZGUgICA3ID0gQ29udHJvbF9hc2NpaWNpcmN1bQorCWFsdCAgICAga2V5Y29kZSAgIDcgPSBNZXRhX3NpeCAgICAgICAgCitrZXljb2RlICAgOCA9IHNldmVuICAgICAgICAgICAgYW1wZXJzYW5kICAgICAgICBicmFjZWxlZnQgICAgICAgCisJY29udHJvbCBrZXljb2RlICAgOCA9IENvbnRyb2xfdW5kZXJzY29yZQorCWFsdCAgICAga2V5Y29kZSAgIDggPSBNZXRhX3NldmVuICAgICAgCitrZXljb2RlICAgOSA9IGVpZ2h0ICAgICAgICAgICAgYXN0ZXJpc2sgICAgICAgICBicmFja2V0bGVmdCAgICAgCisJY29udHJvbCBrZXljb2RlICAgOSA9IERlbGV0ZSAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgICA5ID0gTWV0YV9laWdodCAgICAgIAora2V5Y29kZSAgMTAgPSBuaW5lICAgICAgICAgICAgIHBhcmVubGVmdCAgICAgICAgYnJhY2tldHJpZ2h0ICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTAgPSBNZXRhX25pbmUgICAgICAgCitrZXljb2RlICAxMSA9IHplcm8gICAgICAgICAgICAgcGFyZW5yaWdodCAgICAgICBicmFjZXJpZ2h0ICAgICAgCisJYWx0ICAgICBrZXljb2RlICAxMSA9IE1ldGFfemVybyAgICAgICAKK2tleWNvZGUgIDEyID0gbWludXMgICAgICAgICAgICB1bmRlcnNjb3JlICAgICAgIGJhY2tzbGFzaCAgICAgICAKKwljb250cm9sCWtleWNvZGUgIDEyID0gQ29udHJvbF91bmRlcnNjb3JlCisJc2hpZnQJY29udHJvbAlrZXljb2RlICAxMiA9IENvbnRyb2xfdW5kZXJzY29yZQorCWFsdAlrZXljb2RlICAxMiA9IE1ldGFfbWludXMgICAgICAKK2tleWNvZGUgIDEzID0gZXF1YWwgICAgICAgICAgICBwbHVzICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAxMyA9IE1ldGFfZXF1YWwgICAgICAKK2tleWNvZGUgIDE1ID0gRGVsZXRlICAgICAgICAgICBEZWxldGUgICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICAxNSA9IEJhY2tTcGFjZQorCWFsdCAgICAga2V5Y29kZSAgMTUgPSBNZXRhX0RlbGV0ZSAgICAgCitrZXljb2RlICAxNiA9IFRhYiAgICAgICAgICAgICAgVGFiICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTYgPSBNZXRhX1RhYiAgICAgICAgCitrZXljb2RlICAxNyA9IHEgICAgICAgICAgICAgICAKK2tleWNvZGUgIDE4ID0gdyAgICAgICAgICAgICAgIAora2V5Y29kZSAgMTkgPSBlCitrZXljb2RlICAyMCA9IHIgICAgICAgICAgICAgICAKK2tleWNvZGUgIDIxID0gdCAgICAgICAgICAgICAgIAora2V5Y29kZSAgMjIgPSB5ICAgICAgICAgICAgICAgCitrZXljb2RlICAyMyA9IHUJIAora2V5Y29kZSAgMjQgPSBpICAgICAgICAgICAgICAgCitrZXljb2RlICAyNSA9IG8gICAgICAgICAgICAgICAKK2tleWNvZGUgIDI2ID0gcCAgICAgICAgICAgICAgIAora2V5Y29kZSAgMjcgPSBicmFja2V0bGVmdCAgICAgIGJyYWNlbGVmdCAgICAgICAKKwljb250cm9sIGtleWNvZGUgIDI3ID0gRXNjYXBlICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMjcgPSBNZXRhX2JyYWNrZXRsZWZ0CitrZXljb2RlICAyOCA9IGJyYWNrZXRyaWdodCAgICAgYnJhY2VyaWdodAorCWNvbnRyb2wga2V5Y29kZSAgMjggPSBDb250cm9sX2JyYWNrZXRyaWdodAorCWFsdCAgICAga2V5Y29kZSAgMjggPSBNZXRhX2JyYWNrZXRyaWdodAora2V5Y29kZSAgMjkgPSBiYWNrc2xhc2ggICAgICAgIGJhciAgICAgICAgICAgICAKKwljb250cm9sIGtleWNvZGUgIDI5ID0gQ29udHJvbF9iYWNrc2xhc2gKKwlhbHQgICAgIGtleWNvZGUgIDI5ID0gTWV0YV9iYWNrc2xhc2ggIAora2V5Y29kZSAgMzAgPSBDYXBzX0xvY2sKK2tleWNvZGUgIDMxID0gYSAgICAgICAgICAgICAgIAora2V5Y29kZSAgMzIgPSBzCitrZXljb2RlICAzMyA9IGQKK2tleWNvZGUgIDM0ID0gZiAgICAgICAgICAgICAgIAora2V5Y29kZSAgMzUgPSBnICAgICAgICAgICAgICAgCitrZXljb2RlICAzNiA9IGggICAgICAgICAgICAgICAKK2tleWNvZGUgIDM3ID0gaiAgICAgICAgICAgICAgIAora2V5Y29kZSAgMzggPSBrICAgICAgICAgICAgICAgCitrZXljb2RlICAzOSA9IGwgICAgICAgICAgICAgICAKK2tleWNvZGUgIDQwID0gc2VtaWNvbG9uICAgICAgICBjb2xvbiAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAzOSA9IE1ldGFfc2VtaWNvbG9uICAKK2tleWNvZGUgIDQxID0gYXBvc3Ryb3BoZSAgICAgICBxdW90ZWRibCAgICAgICAgCisJY29udHJvbCBrZXljb2RlICA0MCA9IENvbnRyb2xfZyAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDQwID0gTWV0YV9hcG9zdHJvcGhlIAora2V5Y29kZSAgNDIgPSBncmF2ZSAgICAgICAgICAgIGFzY2lpdGlsZGUgICAgICAKKwljb250cm9sIGtleWNvZGUgIDQxID0gbnVsICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNDEgPSBNZXRhX2dyYXZlICAgICAgCitrZXljb2RlICA0MyA9IFJldHVybiAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDQzID0gTWV0YV9Db250cm9sX20gIAora2V5Y29kZSAgNDQgPSBTaGlmdCAgICAgICAgICAgICAgIAora2V5Y29kZSAgNDYgPSB6CitrZXljb2RlICA0NyA9IHggICAgICAgICAgICAgICAKK2tleWNvZGUgIDQ4ID0gYwora2V5Y29kZSAgNDkgPSB2ICAgICAgICAgICAgICAgCitrZXljb2RlICA1MCA9IGIgICAgICAgICAgICAgICAKK2tleWNvZGUgIDUxID0gbgora2V5Y29kZSAgNTIgPSBtCitrZXljb2RlICA1MyA9IGNvbW1hICAgICAgICAgICAgbGVzcyAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNTEgPSBNZXRhX2NvbW1hICAgICAgCitrZXljb2RlICA1NCA9IHBlcmlvZCAgICAgICAgICAgZ3JlYXRlciAgICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgNTIgPSBDb21wb3NlICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA1MiA9IE1ldGFfcGVyaW9kICAgICAKK2tleWNvZGUgIDU1ID0gc2xhc2ggICAgICAgICAgICBxdWVzdGlvbiAgICAgICAgCisJY29udHJvbCBrZXljb2RlICA1MyA9IERlbGV0ZSAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDUzID0gTWV0YV9zbGFzaCAgICAgIAora2V5Y29kZSAgNTcgPSBTaGlmdAora2V5Y29kZSAgNTggPSBDb250cm9sCitrZXljb2RlICA2MCA9IEFsdAora2V5Y29kZSAgNjEgPSBzcGFjZSAgICAgICAgICAgIHNwYWNlICAgICAgICAgICAKKwljb250cm9sIGtleWNvZGUgIDYxID0gbnVsICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNjEgPSBNZXRhX3NwYWNlICAgICAgCitrZXljb2RlICA2MiA9IEFsdAorCitrZXljb2RlIDc1ID0gSW5zZXJ0ICAgICAgICAgIAora2V5Y29kZSA3NiA9IERlbGV0ZSAgICAgICAgICAKKwora2V5Y29kZSA4MyA9IFVwICAgICAgICAgICAgICAKK2tleWNvZGUgODQgPSBEb3duICAgICAgICAgICAgICAKKwora2V5Y29kZSA4NSA9IFByaW9yICAgICAgICAgICAKKwlzaGlmdCAgIGtleWNvZGUgODUgPSBTY3JvbGxfQmFja3dhcmQgCitrZXljb2RlIDg2ID0gTmV4dCAgICAgICAgICAgIAorCXNoaWZ0ICAga2V5Y29kZSA4NiA9IFNjcm9sbF9Gb3J3YXJkICAKK2tleWNvZGUgODkgPSBSaWdodCAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlIDg5ID0gSW5jcl9Db25zb2xlCitrZXljb2RlIDc5ID0gTGVmdCAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSA3OSA9IERlY3JfQ29uc29sZQorCitrZXljb2RlICA5MCA9IE51bV9Mb2NrCisJc2hpZnQgICBrZXljb2RlICA5MCA9IEJhcmVfTnVtX0xvY2sKKwora2V5Y29kZSA5MSA9IG1pbnVzCitrZXljb2RlIDkyID0gcGx1cwora2V5Y29kZSA5MyA9IEtQX011bHRpcGx5CitrZXljb2RlIDk0ID0gcGVyaW9kCitrZXljb2RlIDk1ID0gS1BfRGl2aWRlCisKK2tleWNvZGUgMTA3ID0gU2VsZWN0ICAgICAgICAgIAora2V5Y29kZSAxMDggPSBEb3duICAgICAgICAgICAgCisKK2tleWNvZGUgMTEwID0gRXNjYXBlICAgICAgICAgICBFc2NhcGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAgMSA9IE1ldGFfRXNjYXBlICAgICAKKwora2V5Y29kZSAgMTEyID0gRjEgICAgICAgICAgICAgIEYxMSAgICAgICAgICAgICAgQ29uc29sZV8xMyAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTEyID0gRjEgICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTEyID0gQ29uc29sZV8xICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICAxMTIgPSBDb25zb2xlXzEgICAgICAgCitrZXljb2RlICAxMTMgPSBGMiAgICAgICAgICAgICAgRjEyICAgICAgICAgICAgICBDb25zb2xlXzE0ICAgICAgCisJY29udHJvbCBrZXljb2RlICAxMTMgPSBGMiAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAxMTMgPSBDb25zb2xlXzIgICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDExMyA9IENvbnNvbGVfMiAgICAgICAKK2tleWNvZGUgIDExNCA9IEYzICAgICAgICAgICAgICBGMTMgICAgICAgICAgICAgIENvbnNvbGVfMTUgICAgICAKKwljb250cm9sIGtleWNvZGUgIDExNCA9IEYzICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDExNCA9IENvbnNvbGVfMyAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgMTE0ID0gQ29uc29sZV8zICAgICAgIAora2V5Y29kZSAgMTE1ID0gRjQgICAgICAgICAgICAgIEYxNCAgICAgICAgICAgICAgQ29uc29sZV8xNiAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTE1ID0gRjQgICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTE1ID0gQ29uc29sZV80ICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICAxMTUgPSBDb25zb2xlXzQgICAgICAgCitrZXljb2RlICAxMTYgPSBGNSAgICAgICAgICAgICAgRjE1ICAgICAgICAgICAgICBDb25zb2xlXzE3ICAgICAgCisJY29udHJvbCBrZXljb2RlICAxMTYgPSBGNSAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAxMTYgPSBDb25zb2xlXzUgICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDExNiA9IENvbnNvbGVfNSAgICAgICAKK2tleWNvZGUgIDExNyA9IEY2ICAgICAgICAgICAgICBGMTYgICAgICAgICAgICAgIENvbnNvbGVfMTggICAgICAKKwljb250cm9sIGtleWNvZGUgIDExNyA9IEY2ICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDExNyA9IENvbnNvbGVfNiAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgMTE3ID0gQ29uc29sZV82ICAgICAgIAora2V5Y29kZSAgMTE4ID0gRjcgICAgICAgICAgICAgIEYxNyAgICAgICAgICAgICAgQ29uc29sZV8xOSAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTE4ID0gRjcgICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTE4ID0gQ29uc29sZV83ICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICAxMTggPSBDb25zb2xlXzcgICAgICAgCitrZXljb2RlICAxMTkgPSBGOCAgICAgICAgICAgICAgRjE4ICAgICAgICAgICAgICBDb25zb2xlXzIwICAgICAgCisJY29udHJvbCBrZXljb2RlICAxMTkgPSBGOCAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAxMTkgPSBDb25zb2xlXzggICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDExOSA9IENvbnNvbGVfOCAgICAgICAKK2tleWNvZGUgIDEyMCA9IEY5ICAgICAgICAgICAgICBGMTkgICAgICAgICAgICAgIENvbnNvbGVfMjEgICAgICAKKwljb250cm9sIGtleWNvZGUgIDEyMCA9IEY5ICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDEyMCA9IENvbnNvbGVfOSAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgMTIwID0gQ29uc29sZV85ICAgICAgIAora2V5Y29kZSAgMTIxID0gRjEwICAgICAgICAgICAgIEYyMCAgICAgICAgICAgICAgQ29uc29sZV8yMiAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTIxID0gRjEwICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTIxID0gQ29uc29sZV8xMCAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICAxMjEgPSBDb25zb2xlXzEwICAgICAgCisJCitrZXljb2RlIDEyNiA9IFBhdXNlICAgICAgICAgICAKKworCitzdHJpbmcgRjEgPSAiXDAzM1tbQSIKK3N0cmluZyBGMiA9ICJcMDMzW1tCIgorc3RyaW5nIEYzID0gIlwwMzNbW0MiCitzdHJpbmcgRjQgPSAiXDAzM1tbRCIKK3N0cmluZyBGNSA9ICJcMDMzW1tFIgorc3RyaW5nIEY2ID0gIlwwMzNbMTd+Igorc3RyaW5nIEY3ID0gIlwwMzNbMTh+Igorc3RyaW5nIEY4ID0gIlwwMzNbMTl+Igorc3RyaW5nIEY5ID0gIlwwMzNbMjB+Igorc3RyaW5nIEYxMCA9ICJcMDMzWzIxfiIKK3N0cmluZyBGMTEgPSAiXDAzM1syM34iCitzdHJpbmcgRjEyID0gIlwwMzNbMjR+Igorc3RyaW5nIEYxMyA9ICJcMDMzWzI1fiIKK3N0cmluZyBGMTQgPSAiXDAzM1syNn4iCitzdHJpbmcgRjE1ID0gIlwwMzNbMjh+Igorc3RyaW5nIEYxNiA9ICJcMDMzWzI5fiIKK3N0cmluZyBGMTcgPSAiXDAzM1szMX4iCitzdHJpbmcgRjE4ID0gIlwwMzNbMzJ+Igorc3RyaW5nIEYxOSA9ICJcMDMzWzMzfiIKK3N0cmluZyBGMjAgPSAiXDAzM1szNH4iCitzdHJpbmcgRmluZCA9ICJcMDMzWzF+Igorc3RyaW5nIEluc2VydCA9ICJcMDMzWzJ+Igorc3RyaW5nIFJlbW92ZSA9ICJcMDMzWzN+Igorc3RyaW5nIFNlbGVjdCA9ICJcMDMzWzR+Igorc3RyaW5nIFByaW9yID0gIlwwMzNbNX4iCitzdHJpbmcgTmV4dCA9ICJcMDMzWzZ+Igorc3RyaW5nIE1hY3JvID0gIlwwMzNbTSIKK3N0cmluZyBQYXVzZSA9ICJcMDMzW1AiCitjb21wb3NlICdgJyAnQScgdG8gJ8AnCitjb21wb3NlICdgJyAnYScgdG8gJ+AnCitjb21wb3NlICdcJycgJ0EnIHRvICfBJworY29tcG9zZSAnXCcnICdhJyB0byAn4ScKK2NvbXBvc2UgJ14nICdBJyB0byAnwicKK2NvbXBvc2UgJ14nICdhJyB0byAn4icKK2NvbXBvc2UgJ34nICdBJyB0byAnwycKK2NvbXBvc2UgJ34nICdhJyB0byAn4ycKK2NvbXBvc2UgJyInICdBJyB0byAnxCcKK2NvbXBvc2UgJyInICdhJyB0byAn5CcKK2NvbXBvc2UgJ08nICdBJyB0byAnxScKK2NvbXBvc2UgJ28nICdhJyB0byAn5ScKK2NvbXBvc2UgJzAnICdBJyB0byAnxScKK2NvbXBvc2UgJzAnICdhJyB0byAn5ScKK2NvbXBvc2UgJ0EnICdBJyB0byAnxScKK2NvbXBvc2UgJ2EnICdhJyB0byAn5ScKK2NvbXBvc2UgJ0EnICdFJyB0byAnxicKK2NvbXBvc2UgJ2EnICdlJyB0byAn5icKK2NvbXBvc2UgJywnICdDJyB0byAnxycKK2NvbXBvc2UgJywnICdjJyB0byAn5ycKK2NvbXBvc2UgJ2AnICdFJyB0byAnyCcKK2NvbXBvc2UgJ2AnICdlJyB0byAn6CcKK2NvbXBvc2UgJ1wnJyAnRScgdG8gJ8knCitjb21wb3NlICdcJycgJ2UnIHRvICfpJworY29tcG9zZSAnXicgJ0UnIHRvICfKJworY29tcG9zZSAnXicgJ2UnIHRvICfqJworY29tcG9zZSAnIicgJ0UnIHRvICfLJworY29tcG9zZSAnIicgJ2UnIHRvICfrJworY29tcG9zZSAnYCcgJ0knIHRvICfMJworY29tcG9zZSAnYCcgJ2knIHRvICfsJworY29tcG9zZSAnXCcnICdJJyB0byAnzScKK2NvbXBvc2UgJ1wnJyAnaScgdG8gJ+0nCitjb21wb3NlICdeJyAnSScgdG8gJ84nCitjb21wb3NlICdeJyAnaScgdG8gJ+4nCitjb21wb3NlICciJyAnSScgdG8gJ88nCitjb21wb3NlICciJyAnaScgdG8gJ+8nCitjb21wb3NlICctJyAnRCcgdG8gJ9AnCitjb21wb3NlICctJyAnZCcgdG8gJ/AnCitjb21wb3NlICd+JyAnTicgdG8gJ9EnCitjb21wb3NlICd+JyAnbicgdG8gJ/EnCitjb21wb3NlICdgJyAnTycgdG8gJ9InCitjb21wb3NlICdgJyAnbycgdG8gJ/InCitjb21wb3NlICdcJycgJ08nIHRvICfTJworY29tcG9zZSAnXCcnICdvJyB0byAn8ycKK2NvbXBvc2UgJ14nICdPJyB0byAn1CcKK2NvbXBvc2UgJ14nICdvJyB0byAn9CcKK2NvbXBvc2UgJ34nICdPJyB0byAn1ScKK2NvbXBvc2UgJ34nICdvJyB0byAn9ScKK2NvbXBvc2UgJyInICdPJyB0byAn1icKK2NvbXBvc2UgJyInICdvJyB0byAn9icKK2NvbXBvc2UgJy8nICdPJyB0byAn2CcKK2NvbXBvc2UgJy8nICdvJyB0byAn+CcKK2NvbXBvc2UgJ2AnICdVJyB0byAn2ScKK2NvbXBvc2UgJ2AnICd1JyB0byAn+ScKK2NvbXBvc2UgJ1wnJyAnVScgdG8gJ9onCitjb21wb3NlICdcJycgJ3UnIHRvICf6JworY29tcG9zZSAnXicgJ1UnIHRvICfbJworY29tcG9zZSAnXicgJ3UnIHRvICf7JworY29tcG9zZSAnIicgJ1UnIHRvICfcJworY29tcG9zZSAnIicgJ3UnIHRvICf8JworY29tcG9zZSAnXCcnICdZJyB0byAn3ScKK2NvbXBvc2UgJ1wnJyAneScgdG8gJ/0nCitjb21wb3NlICdUJyAnSCcgdG8gJ94nCitjb21wb3NlICd0JyAnaCcgdG8gJ/4nCitjb21wb3NlICdzJyAncycgdG8gJ98nCitjb21wb3NlICciJyAneScgdG8gJ/8nCitjb21wb3NlICdzJyAneicgdG8gJ98nCitjb21wb3NlICdpJyAnaicgdG8gJ/8nCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ5YjUyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwpAQCAtMCwwICsxLDE2MjkgQEAKKy8qCisgKiByYW5kb20uYyAtLSBBIHN0cm9uZyByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICoKKyAqIFZlcnNpb24gMS44OSwgbGFzdCBtb2RpZmllZCAxOS1TZXAtOTkKKyAqCisgKiBDb3B5cmlnaHQgVGhlb2RvcmUgVHMnbywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OS4gIEFsbAorICogcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgYW5kIHRoZSBlbnRpcmUgcGVybWlzc2lvbiBub3RpY2UgaW4gaXRzIGVudGlyZXR5LAorICogICAgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnRpZXMuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgcHJvZHVjdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUKKyAqIHJlcXVpcmVkIElOU1RFQUQgT0YgdGhlIGFib3ZlIHJlc3RyaWN0aW9ucy4gIChUaGlzIGNsYXVzZSBpcworICogbmVjZXNzYXJ5IGR1ZSB0byBhIHBvdGVudGlhbCBiYWQgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgR1BMIGFuZAorICogdGhlIHJlc3RyaWN0aW9ucyBjb250YWluZWQgaW4gYSBCU0Qtc3R5bGUgY29weXJpZ2h0LikKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorICogV0hJQ0ggQVJFIEhFUkVCWSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqLworCisvKgorICogKG5vdywgd2l0aCBsZWdhbCBCLlMuIG91dCBvZiB0aGUgd2F5Li4uLi4pCisgKgorICogVGhpcyByb3V0aW5lIGdhdGhlcnMgZW52aXJvbm1lbnRhbCBub2lzZSBmcm9tIGRldmljZSBkcml2ZXJzLCBldGMuLAorICogYW5kIHJldHVybnMgZ29vZCByYW5kb20gbnVtYmVycywgc3VpdGFibGUgZm9yIGNyeXB0b2dyYXBoaWMgdXNlLgorICogQmVzaWRlcyB0aGUgb2J2aW91cyBjcnlwdG9ncmFwaGljIHVzZXMsIHRoZXNlIG51bWJlcnMgYXJlIGFsc28gZ29vZAorICogZm9yIHNlZWRpbmcgVENQIHNlcXVlbmNlIG51bWJlcnMsIGFuZCBvdGhlciBwbGFjZXMgd2hlcmUgaXQgaXMKKyAqIGRlc2lyYWJsZSB0byBoYXZlIG51bWJlcnMgd2hpY2ggYXJlIG5vdCBvbmx5IHJhbmRvbSwgYnV0IGhhcmQgdG8KKyAqIHByZWRpY3QgYnkgYW4gYXR0YWNrZXIuCisgKgorICogVGhlb3J5IG9mIG9wZXJhdGlvbgorICogPT09PT09PT09PT09PT09PT09PQorICoKKyAqIENvbXB1dGVycyBhcmUgdmVyeSBwcmVkaWN0YWJsZSBkZXZpY2VzLiAgSGVuY2UgaXQgaXMgZXh0cmVtZWx5IGhhcmQKKyAqIHRvIHByb2R1Y2UgdHJ1bHkgcmFuZG9tIG51bWJlcnMgb24gYSBjb21wdXRlciAtLS0gYXMgb3Bwb3NlZCB0bworICogcHNldWRvLXJhbmRvbSBudW1iZXJzLCB3aGljaCBjYW4gZWFzaWx5IGdlbmVyYXRlZCBieSB1c2luZyBhCisgKiBhbGdvcml0aG0uICBVbmZvcnR1bmF0ZWx5LCBpdCBpcyB2ZXJ5IGVhc3kgZm9yIGF0dGFja2VycyB0byBndWVzcworICogdGhlIHNlcXVlbmNlIG9mIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMsIGFuZCBmb3Igc29tZQorICogYXBwbGljYXRpb25zIHRoaXMgaXMgbm90IGFjY2VwdGFibGUuICBTbyBpbnN0ZWFkLCB3ZSBtdXN0IHRyeSB0bworICogZ2F0aGVyICJlbnZpcm9ubWVudGFsIG5vaXNlIiBmcm9tIHRoZSBjb21wdXRlcidzIGVudmlyb25tZW50LCB3aGljaAorICogbXVzdCBiZSBoYXJkIGZvciBvdXRzaWRlIGF0dGFja2VycyB0byBvYnNlcnZlLCBhbmQgdXNlIHRoYXQgdG8KKyAqIGdlbmVyYXRlIHJhbmRvbSBudW1iZXJzLiAgSW4gYSBVbml4IGVudmlyb25tZW50LCB0aGlzIGlzIGJlc3QgZG9uZQorICogZnJvbSBpbnNpZGUgdGhlIGtlcm5lbC4KKyAqCisgKiBTb3VyY2VzIG9mIHJhbmRvbW5lc3MgZnJvbSB0aGUgZW52aXJvbm1lbnQgaW5jbHVkZSBpbnRlci1rZXlib2FyZAorICogdGltaW5ncywgaW50ZXItaW50ZXJydXB0IHRpbWluZ3MgZnJvbSBzb21lIGludGVycnVwdHMsIGFuZCBvdGhlcgorICogZXZlbnRzIHdoaWNoIGFyZSBib3RoIChhKSBub24tZGV0ZXJtaW5pc3RpYyBhbmQgKGIpIGhhcmQgZm9yIGFuCisgKiBvdXRzaWRlIG9ic2VydmVyIHRvIG1lYXN1cmUuICBSYW5kb21uZXNzIGZyb20gdGhlc2Ugc291cmNlcyBhcmUKKyAqIGFkZGVkIHRvIGFuICJlbnRyb3B5IHBvb2wiLCB3aGljaCBpcyBtaXhlZCB1c2luZyBhIENSQy1saWtlIGZ1bmN0aW9uLgorICogVGhpcyBpcyBub3QgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nLCBidXQgaXQgaXMgYWRlcXVhdGUgYXNzdW1pbmcKKyAqIHRoZSByYW5kb21uZXNzIGlzIG5vdCBjaG9zZW4gbWFsaWNpb3VzbHksIGFuZCBpdCBpcyBmYXN0IGVub3VnaCB0aGF0CisgKiB0aGUgb3ZlcmhlYWQgb2YgZG9pbmcgaXQgb24gZXZlcnkgaW50ZXJydXB0IGlzIHZlcnkgcmVhc29uYWJsZS4KKyAqIEFzIHJhbmRvbSBieXRlcyBhcmUgbWl4ZWQgaW50byB0aGUgZW50cm9weSBwb29sLCB0aGUgcm91dGluZXMga2VlcAorICogYW4gKmVzdGltYXRlKiBvZiBob3cgbWFueSBiaXRzIG9mIHJhbmRvbW5lc3MgaGF2ZSBiZWVuIHN0b3JlZCBpbnRvCisgKiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IncyBpbnRlcm5hbCBzdGF0ZS4KKyAqCisgKiBXaGVuIHJhbmRvbSBieXRlcyBhcmUgZGVzaXJlZCwgdGhleSBhcmUgb2J0YWluZWQgYnkgdGFraW5nIHRoZSBTSEEKKyAqIGhhc2ggb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSAiZW50cm9weSBwb29sIi4gIFRoZSBTSEEgaGFzaCBhdm9pZHMKKyAqIGV4cG9zaW5nIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgZW50cm9weSBwb29sLiAgSXQgaXMgYmVsaWV2ZWQgdG8KKyAqIGJlIGNvbXB1dGF0aW9uYWxseSBpbmZlYXNpYmxlIHRvIGRlcml2ZSBhbnkgdXNlZnVsIGluZm9ybWF0aW9uCisgKiBhYm91dCB0aGUgaW5wdXQgb2YgU0hBIGZyb20gaXRzIG91dHB1dC4gIEV2ZW4gaWYgaXQgaXMgcG9zc2libGUgdG8KKyAqIGFuYWx5emUgU0hBIGluIHNvbWUgY2xldmVyIHdheSwgYXMgbG9uZyBhcyB0aGUgYW1vdW50IG9mIGRhdGEKKyAqIHJldHVybmVkIGZyb20gdGhlIGdlbmVyYXRvciBpcyBsZXNzIHRoYW4gdGhlIGluaGVyZW50IGVudHJvcHkgaW4KKyAqIHRoZSBwb29sLCB0aGUgb3V0cHV0IGRhdGEgaXMgdG90YWxseSB1bnByZWRpY3RhYmxlLiAgRm9yIHRoaXMKKyAqIHJlYXNvbiwgdGhlIHJvdXRpbmUgZGVjcmVhc2VzIGl0cyBpbnRlcm5hbCBlc3RpbWF0ZSBvZiBob3cgbWFueQorICogYml0cyBvZiAidHJ1ZSByYW5kb21uZXNzIiBhcmUgY29udGFpbmVkIGluIHRoZSBlbnRyb3B5IHBvb2wgYXMgaXQKKyAqIG91dHB1dHMgcmFuZG9tIG51bWJlcnMuCisgKgorICogSWYgdGhpcyBlc3RpbWF0ZSBnb2VzIHRvIHplcm8sIHRoZSByb3V0aW5lIGNhbiBzdGlsbCBnZW5lcmF0ZQorICogcmFuZG9tIG51bWJlcnM7IGhvd2V2ZXIsIGFuIGF0dGFja2VyIG1heSAoYXQgbGVhc3QgaW4gdGhlb3J5KSBiZQorICogYWJsZSB0byBpbmZlciB0aGUgZnV0dXJlIG91dHB1dCBvZiB0aGUgZ2VuZXJhdG9yIGZyb20gcHJpb3IKKyAqIG91dHB1dHMuICBUaGlzIHJlcXVpcmVzIHN1Y2Nlc3NmdWwgY3J5cHRhbmFseXNpcyBvZiBTSEEsIHdoaWNoIGlzCisgKiBub3QgYmVsaWV2ZWQgdG8gYmUgZmVhc2libGUsIGJ1dCB0aGVyZSBpcyBhIHJlbW90ZSBwb3NzaWJpbGl0eS4KKyAqIE5vbmV0aGVsZXNzLCB0aGVzZSBudW1iZXJzIHNob3VsZCBiZSB1c2VmdWwgZm9yIHRoZSB2YXN0IG1ham9yaXR5CisgKiBvZiBwdXJwb3Nlcy4KKyAqCisgKiBFeHBvcnRlZCBpbnRlcmZhY2VzIC0tLS0gb3V0cHV0CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhlcmUgYXJlIHRocmVlIGV4cG9ydGVkIGludGVyZmFjZXM7IHRoZSBmaXJzdCBpcyBvbmUgZGVzaWduZWQgdG8KKyAqIGJlIHVzZWQgZnJvbSB3aXRoaW4gdGhlIGtlcm5lbDoKKyAqCisgKiAJdm9pZCBnZXRfcmFuZG9tX2J5dGVzKHZvaWQgKmJ1ZiwgaW50IG5ieXRlcyk7CisgKgorICogVGhpcyBpbnRlcmZhY2Ugd2lsbCByZXR1cm4gdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzLAorICogYW5kIHBsYWNlIGl0IGluIHRoZSByZXF1ZXN0ZWQgYnVmZmVyLgorICoKKyAqIFRoZSB0d28gb3RoZXIgaW50ZXJmYWNlcyBhcmUgdHdvIGNoYXJhY3RlciBkZXZpY2VzIC9kZXYvcmFuZG9tIGFuZAorICogL2Rldi91cmFuZG9tLiAgL2Rldi9yYW5kb20gaXMgc3VpdGFibGUgZm9yIHVzZSB3aGVuIHZlcnkgaGlnaAorICogcXVhbGl0eSByYW5kb21uZXNzIGlzIGRlc2lyZWQgKGZvciBleGFtcGxlLCBmb3Iga2V5IGdlbmVyYXRpb24gb3IKKyAqIG9uZS10aW1lIHBhZHMpLCBhcyBpdCB3aWxsIG9ubHkgcmV0dXJuIGEgbWF4aW11bSBvZiB0aGUgbnVtYmVyIG9mCisgKiBiaXRzIG9mIHJhbmRvbW5lc3MgKGFzIGVzdGltYXRlZCBieSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IpCisgKiBjb250YWluZWQgaW4gdGhlIGVudHJvcHkgcG9vbC4KKyAqCisgKiBUaGUgL2Rldi91cmFuZG9tIGRldmljZSBkb2VzIG5vdCBoYXZlIHRoaXMgbGltaXQsIGFuZCB3aWxsIHJldHVybgorICogYXMgbWFueSBieXRlcyBhcyBhcmUgcmVxdWVzdGVkLiAgQXMgbW9yZSBhbmQgbW9yZSByYW5kb20gYnl0ZXMgYXJlCisgKiByZXF1ZXN0ZWQgd2l0aG91dCBnaXZpbmcgdGltZSBmb3IgdGhlIGVudHJvcHkgcG9vbCB0byByZWNoYXJnZSwKKyAqIHRoaXMgd2lsbCByZXN1bHQgaW4gcmFuZG9tIG51bWJlcnMgdGhhdCBhcmUgbWVyZWx5IGNyeXB0b2dyYXBoaWNhbGx5CisgKiBzdHJvbmcuICBGb3IgbWFueSBhcHBsaWNhdGlvbnMsIGhvd2V2ZXIsIHRoaXMgaXMgYWNjZXB0YWJsZS4KKyAqCisgKiBFeHBvcnRlZCBpbnRlcmZhY2VzIC0tLS0gaW5wdXQKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoZSBjdXJyZW50IGV4cG9ydGVkIGludGVyZmFjZXMgZm9yIGdhdGhlcmluZyBlbnZpcm9ubWVudGFsIG5vaXNlCisgKiBmcm9tIHRoZSBkZXZpY2VzIGFyZToKKyAqCisgKiAJdm9pZCBhZGRfaW5wdXRfcmFuZG9tbmVzcyh1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbHVlKTsKKyAqIAl2b2lkIGFkZF9pbnRlcnJ1cHRfcmFuZG9tbmVzcyhpbnQgaXJxKTsKKyAqCisgKiBhZGRfaW5wdXRfcmFuZG9tbmVzcygpIHVzZXMgdGhlIGlucHV0IGxheWVyIGludGVycnVwdCB0aW1pbmcsIGFzIHdlbGwgYXMKKyAqIHRoZSBldmVudCB0eXBlIGluZm9ybWF0aW9uIGZyb20gdGhlIGhhcmR3YXJlLgorICoKKyAqIGFkZF9pbnRlcnJ1cHRfcmFuZG9tbmVzcygpIHVzZXMgdGhlIGludGVyLWludGVycnVwdCB0aW1pbmcgYXMgcmFuZG9tCisgKiBpbnB1dHMgdG8gdGhlIGVudHJvcHkgcG9vbC4gIE5vdGUgdGhhdCBub3QgYWxsIGludGVycnVwdHMgYXJlIGdvb2QKKyAqIHNvdXJjZXMgb2YgcmFuZG9tbmVzcyEgIEZvciBleGFtcGxlLCB0aGUgdGltZXIgaW50ZXJydXB0cyBpcyBub3QgYQorICogZ29vZCBjaG9pY2UsIGJlY2F1c2UgdGhlIHBlcmlvZGljaXR5IG9mIHRoZSBpbnRlcnJ1cHRzIGlzIHRvbworICogcmVndWxhciwgYW5kIGhlbmNlIHByZWRpY3RhYmxlIHRvIGFuIGF0dGFja2VyLiAgRGlzayBpbnRlcnJ1cHRzIGFyZQorICogYSBiZXR0ZXIgbWVhc3VyZSwgc2luY2UgdGhlIHRpbWluZyBvZiB0aGUgZGlzayBpbnRlcnJ1cHRzIGFyZSBtb3JlCisgKiB1bnByZWRpY3RhYmxlLgorICoKKyAqIEFsbCBvZiB0aGVzZSByb3V0aW5lcyB0cnkgdG8gZXN0aW1hdGUgaG93IG1hbnkgYml0cyBvZiByYW5kb21uZXNzIGEKKyAqIHBhcnRpY3VsYXIgcmFuZG9tbmVzcyBzb3VyY2UuICBUaGV5IGRvIHRoaXMgYnkga2VlcGluZyB0cmFjayBvZiB0aGUKKyAqIGZpcnN0IGFuZCBzZWNvbmQgb3JkZXIgZGVsdGFzIG9mIHRoZSBldmVudCB0aW1pbmdzLgorICoKKyAqIEVuc3VyaW5nIHVucHJlZGljdGFiaWxpdHkgYXQgc3lzdGVtIHN0YXJ0dXAKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogV2hlbiBhbnkgb3BlcmF0aW5nIHN5c3RlbSBzdGFydHMgdXAsIGl0IHdpbGwgZ28gdGhyb3VnaCBhIHNlcXVlbmNlCisgKiBvZiBhY3Rpb25zIHRoYXQgYXJlIGZhaXJseSBwcmVkaWN0YWJsZSBieSBhbiBhZHZlcnNhcnksIGVzcGVjaWFsbHkKKyAqIGlmIHRoZSBzdGFydC11cCBkb2VzIG5vdCBpbnZvbHZlIGludGVyYWN0aW9uIHdpdGggYSBodW1hbiBvcGVyYXRvci4KKyAqIFRoaXMgcmVkdWNlcyB0aGUgYWN0dWFsIG51bWJlciBvZiBiaXRzIG9mIHVucHJlZGljdGFiaWxpdHkgaW4gdGhlCisgKiBlbnRyb3B5IHBvb2wgYmVsb3cgdGhlIHZhbHVlIGluIGVudHJvcHlfY291bnQuICBJbiBvcmRlciB0bworICogY291bnRlcmFjdCB0aGlzIGVmZmVjdCwgaXQgaGVscHMgdG8gY2FycnkgaW5mb3JtYXRpb24gaW4gdGhlCisgKiBlbnRyb3B5IHBvb2wgYWNyb3NzIHNodXQtZG93bnMgYW5kIHN0YXJ0LXVwcy4gIFRvIGRvIHRoaXMsIHB1dCB0aGUKKyAqIGZvbGxvd2luZyBsaW5lcyBhbiBhcHByb3ByaWF0ZSBzY3JpcHQgd2hpY2ggaXMgcnVuIGR1cmluZyB0aGUgYm9vdAorICogc2VxdWVuY2U6CisgKgorICoJZWNobyAiSW5pdGlhbGl6aW5nIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLi4uIgorICoJcmFuZG9tX3NlZWQ9L3Zhci9ydW4vcmFuZG9tLXNlZWQKKyAqCSMgQ2FycnkgYSByYW5kb20gc2VlZCBmcm9tIHN0YXJ0LXVwIHRvIHN0YXJ0LXVwCisgKgkjIExvYWQgYW5kIHRoZW4gc2F2ZSB0aGUgd2hvbGUgZW50cm9weSBwb29sCisgKglpZiBbIC1mICRyYW5kb21fc2VlZCBdOyB0aGVuCisgKgkJY2F0ICRyYW5kb21fc2VlZCA+L2Rldi91cmFuZG9tCisgKgllbHNlCisgKgkJdG91Y2ggJHJhbmRvbV9zZWVkCisgKglmaQorICoJY2htb2QgNjAwICRyYW5kb21fc2VlZAorICoJZGQgaWY9L2Rldi91cmFuZG9tIG9mPSRyYW5kb21fc2VlZCBjb3VudD0xIGJzPTUxMgorICoKKyAqIGFuZCB0aGUgZm9sbG93aW5nIGxpbmVzIGluIGFuIGFwcHJvcHJpYXRlIHNjcmlwdCB3aGljaCBpcyBydW4gYXMKKyAqIHRoZSBzeXN0ZW0gaXMgc2h1dGRvd246CisgKgorICoJIyBDYXJyeSBhIHJhbmRvbSBzZWVkIGZyb20gc2h1dC1kb3duIHRvIHN0YXJ0LXVwCisgKgkjIFNhdmUgdGhlIHdob2xlIGVudHJvcHkgcG9vbAorICoJZWNobyAiU2F2aW5nIHJhbmRvbSBzZWVkLi4uIgorICoJcmFuZG9tX3NlZWQ9L3Zhci9ydW4vcmFuZG9tLXNlZWQKKyAqCXRvdWNoICRyYW5kb21fc2VlZAorICoJY2htb2QgNjAwICRyYW5kb21fc2VlZAorICoJZGQgaWY9L2Rldi91cmFuZG9tIG9mPSRyYW5kb21fc2VlZCBjb3VudD0xIGJzPTUxMgorICoKKyAqIEZvciBleGFtcGxlLCBvbiBtb3N0IG1vZGVybiBzeXN0ZW1zIHVzaW5nIHRoZSBTeXN0ZW0gViBpbml0CisgKiBzY3JpcHRzLCBzdWNoIGNvZGUgZnJhZ21lbnRzIHdvdWxkIGJlIGZvdW5kIGluCisgKiAvZXRjL3JjLmQvaW5pdC5kL3JhbmRvbS4gIE9uIG9sZGVyIExpbnV4IHN5c3RlbXMsIHRoZSBjb3JyZWN0IHNjcmlwdAorICogbG9jYXRpb24gbWlnaHQgYmUgaW4gL2V0Yy9yY2IuZC9yYy5sb2NhbCBvciAvZXRjL3JjLmQvcmMuMC4KKyAqCisgKiBFZmZlY3RpdmVseSwgdGhlc2UgY29tbWFuZHMgY2F1c2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnRyb3B5IHBvb2wKKyAqIHRvIGJlIHNhdmVkIGF0IHNodXQtZG93biB0aW1lIGFuZCByZWxvYWRlZCBpbnRvIHRoZSBlbnRyb3B5IHBvb2wgYXQKKyAqIHN0YXJ0LXVwLiAgKFRoZSAnZGQnIGluIHRoZSBhZGRpdGlvbiB0byB0aGUgYm9vdHVwIHNjcmlwdCBpcyB0bworICogbWFrZSBzdXJlIHRoYXQgL2V0Yy9yYW5kb20tc2VlZCBpcyBkaWZmZXJlbnQgZm9yIGV2ZXJ5IHN0YXJ0LXVwLAorICogZXZlbiBpZiB0aGUgc3lzdGVtIGNyYXNoZXMgd2l0aG91dCBleGVjdXRpbmcgcmMuMC4pICBFdmVuIHdpdGgKKyAqIGNvbXBsZXRlIGtub3dsZWRnZSBvZiB0aGUgc3RhcnQtdXAgYWN0aXZpdGllcywgcHJlZGljdGluZyB0aGUgc3RhdGUKKyAqIG9mIHRoZSBlbnRyb3B5IHBvb2wgcmVxdWlyZXMga25vd2xlZGdlIG9mIHRoZSBwcmV2aW91cyBoaXN0b3J5IG9mCisgKiB0aGUgc3lzdGVtLgorICoKKyAqIENvbmZpZ3VyaW5nIHRoZSAvZGV2L3JhbmRvbSBkcml2ZXIgdW5kZXIgTGludXgKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGUgL2Rldi9yYW5kb20gZHJpdmVyIHVuZGVyIExpbnV4IHVzZXMgbWlub3IgbnVtYmVycyA4IGFuZCA5IG9mCisgKiB0aGUgL2Rldi9tZW0gbWFqb3IgbnVtYmVyICgjMSkuICBTbyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBoYXZlCisgKiAvZGV2L3JhbmRvbSBhbmQgL2Rldi91cmFuZG9tIGNyZWF0ZWQgYWxyZWFkeSwgdGhleSBjYW4gYmUgY3JlYXRlZAorICogYnkgdXNpbmcgdGhlIGNvbW1hbmRzOgorICoKKyAqIAlta25vZCAvZGV2L3JhbmRvbSBjIDEgOAorICogCW1rbm9kIC9kZXYvdXJhbmRvbSBjIDEgOQorICoKKyAqIEFja25vd2xlZGdlbWVudHM6CisgKiA9PT09PT09PT09PT09PT09PQorICoKKyAqIElkZWFzIGZvciBjb25zdHJ1Y3RpbmcgdGhpcyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB3ZXJlIGRlcml2ZWQKKyAqIGZyb20gUHJldHR5IEdvb2QgUHJpdmFjeSdzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLCBhbmQgZnJvbSBwcml2YXRlCisgKiBkaXNjdXNzaW9ucyB3aXRoIFBoaWwgS2Fybi4gIENvbGluIFBsdW1iIHByb3ZpZGVkIGEgZmFzdGVyIHJhbmRvbQorICogbnVtYmVyIGdlbmVyYXRvciwgd2hpY2ggc3BlZWQgdXAgdGhlIG1peGluZyBmdW5jdGlvbiBvZiB0aGUgZW50cm9weQorICogcG9vbCwgdGFrZW4gZnJvbSBQR1Bmb25lLiAgRGFsZSBXb3JsZXkgaGFzIGFsc28gY29udHJpYnV0ZWQgbWFueQorICogdXNlZnVsIGlkZWFzIGFuZCBzdWdnZXN0aW9ucyB0byBpbXByb3ZlIHRoaXMgZHJpdmVyLgorICoKKyAqIEFueSBmbGF3cyBpbiB0aGUgZGVzaWduIGFyZSBzb2xlbHkgbXkgcmVzcG9uc2liaWxpdHksIGFuZCBzaG91bGQKKyAqIG5vdCBiZSBhdHRyaWJ1dGVkIHRvIHRoZSBQaGlsLCBDb2xpbiwgb3IgYW55IG9mIGF1dGhvcnMgb2YgUEdQLgorICoKKyAqIEZ1cnRoZXIgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBvbiB0aGlzIHRvcGljIG1heSBiZSBvYnRhaW5lZCBmcm9tCisgKiBSRkMgMTc1MCwgIlJhbmRvbW5lc3MgUmVjb21tZW5kYXRpb25zIGZvciBTZWN1cml0eSIsIGJ5IERvbmFsZAorICogRWFzdGxha2UsIFN0ZXZlIENyb2NrZXIsIGFuZCBKZWZmIFNjaGlsbGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b2hhc2guaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyoKKyAqIENvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKyAqLworI2RlZmluZSBJTlBVVF9QT09MX1dPUkRTIDEyOAorI2RlZmluZSBPVVRQVVRfUE9PTF9XT1JEUyAzMgorI2RlZmluZSBTRUNfWEZFUl9TSVpFIDUxMgorCisvKgorICogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgb2YgZW50cm9weSBiZWZvcmUgd2Ugd2FrZSB1cCBhIHJlYWQgb24KKyAqIC9kZXYvcmFuZG9tLiAgU2hvdWxkIGJlIGVub3VnaCB0byBkbyBhIHNpZ25pZmljYW50IHJlc2VlZC4KKyAqLworc3RhdGljIGludCByYW5kb21fcmVhZF93YWtldXBfdGhyZXNoID0gNjQ7CisKKy8qCisgKiBJZiB0aGUgZW50cm9weSBjb3VudCBmYWxscyB1bmRlciB0aGlzIG51bWJlciBvZiBiaXRzLCB0aGVuIHdlCisgKiBzaG91bGQgd2FrZSB1cCBwcm9jZXNzZXMgd2hpY2ggYXJlIHNlbGVjdGluZyBvciBwb2xsaW5nIG9uIHdyaXRlCisgKiBhY2Nlc3MgdG8gL2Rldi9yYW5kb20uCisgKi8KK3N0YXRpYyBpbnQgcmFuZG9tX3dyaXRlX3dha2V1cF90aHJlc2ggPSAxMjg7CisKKy8qCisgKiBXaGVuIHRoZSBpbnB1dCBwb29sIGdvZXMgb3ZlciB0cmlja2xlX3RocmVzaCwgc3RhcnQgZHJvcHBpbmcgbW9zdAorICogc2FtcGxlcyB0byBhdm9pZCB3YXN0aW5nIENQVSB0aW1lIGFuZCByZWR1Y2UgbG9jayBjb250ZW50aW9uLgorICovCisKK3N0YXRpYyBpbnQgdHJpY2tsZV90aHJlc2ggPSBJTlBVVF9QT09MX1dPUkRTICogMjg7CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHRyaWNrbGVfY291bnQpID0gMDsKKworLyoKKyAqIEEgcG9vbCBvZiBzaXplIC5wb29sd29yZHMgaXMgc3RpcnJlZCB3aXRoIGEgcHJpbWl0aXZlIHBvbHlub21pYWwKKyAqIG9mIGRlZ3JlZSAucG9vbHdvcmRzIG92ZXIgR0YoMikuICBUaGUgdGFwcyBmb3IgdmFyaW91cyBzaXplcyBhcmUKKyAqIGRlZmluZWQgYmVsb3cuICBUaGV5IGFyZSBjaG9zZW4gdG8gYmUgZXZlbmx5IHNwYWNlZCAobWluaW11bSBSTVMKKyAqIGRpc3RhbmNlIGZyb20gZXZlbmx5IHNwYWNlZDsgdGhlIG51bWJlcnMgaW4gdGhlIGNvbW1lbnRzIGFyZSBhCisgKiBzY2FsZWQgc3F1YXJlZCBlcnJvciBzdW0pIGV4Y2VwdCBmb3IgdGhlIGxhc3QgdGFwLCB3aGljaCBpcyAxIHRvCisgKiBnZXQgdGhlIHR3aXN0aW5nIGhhcHBlbmluZyBhcyBmYXN0IGFzIHBvc3NpYmxlLgorICovCitzdGF0aWMgc3RydWN0IHBvb2xpbmZvIHsKKwlpbnQgcG9vbHdvcmRzOworCWludCB0YXAxLCB0YXAyLCB0YXAzLCB0YXA0LCB0YXA1OworfSBwb29saW5mb190YWJsZVtdID0geworCS8qIHheMTI4ICsgeF4xMDMgKyB4Xjc2ICsgeF41MSAreF4yNSArIHggKyAxIC0tIDEwNSAqLworCXsgMTI4LAkxMDMsCTc2LAk1MSwJMjUsCTEgfSwKKwkvKiB4XjMyICsgeF4yNiArIHheMjAgKyB4XjE0ICsgeF43ICsgeCArIDEgLS0gMTUgKi8KKwl7IDMyLAkyNiwJMjAsCTE0LAk3LAkxIH0sCisjaWYgMAorCS8qIHheMjA0OCArIHheMTYzOCArIHheMTIzMSArIHheODE5ICsgeF40MTEgKyB4ICsgMSAgLS0gMTE1ICovCisJeyAyMDQ4LAkxNjM4LAkxMjMxLAk4MTksCTQxMSwJMSB9LAorCisJLyogeF4xMDI0ICsgeF44MTcgKyB4XjYxNSArIHheNDEyICsgeF4yMDQgKyB4ICsgMSAtLSAyOTAgKi8KKwl7IDEwMjQsCTgxNywJNjE1LAk0MTIsCTIwNCwJMSB9LAorCisJLyogeF4xMDI0ICsgeF44MTkgKyB4XjYxNiArIHheNDEwICsgeF4yMDcgKyB4XjIgKyAxIC0tIDExNSAqLworCXsgMTAyNCwJODE5LAk2MTYsCTQxMCwJMjA3LAkyIH0sCisKKwkvKiB4XjUxMiArIHheNDExICsgeF4zMDggKyB4XjIwOCArIHheMTA0ICsgeCArIDEgLS0gMjI1ICovCisJeyA1MTIsCTQxMSwJMzA4LAkyMDgsCTEwNCwJMSB9LAorCisJLyogeF41MTIgKyB4XjQwOSArIHheMzA3ICsgeF4yMDYgKyB4XjEwMiArIHheMiArIDEgLS0gOTUgKi8KKwl7IDUxMiwJNDA5LAkzMDcsCTIwNiwJMTAyLAkyIH0sCisJLyogeF41MTIgKyB4XjQwOSArIHheMzA5ICsgeF4yMDUgKyB4XjEwMyArIHheMiArIDEgLS0gOTUgKi8KKwl7IDUxMiwJNDA5LAkzMDksCTIwNSwJMTAzLAkyIH0sCisKKwkvKiB4XjI1NiArIHheMjA1ICsgeF4xNTUgKyB4XjEwMSArIHheNTIgKyB4ICsgMSAtLSAxMjUgKi8KKwl7IDI1NiwJMjA1LAkxNTUsCTEwMSwJNTIsCTEgfSwKKworCS8qIHheMTI4ICsgeF4xMDMgKyB4Xjc4ICsgeF41MSArIHheMjcgKyB4XjIgKyAxIC0tIDcwICovCisJeyAxMjgsCTEwMywJNzgsCTUxLAkyNywJMiB9LAorCisJLyogeF42NCArIHheNTIgKyB4XjM5ICsgeF4yNiArIHheMTQgKyB4ICsgMSAtLSAxNSAqLworCXsgNjQsCTUyLAkzOSwJMjYsCTE0LAkxIH0sCisjZW5kaWYKK307CisKKyNkZWZpbmUgUE9PTEJJVFMJcG9vbHdvcmRzKjMyCisjZGVmaW5lIFBPT0xCWVRFUwlwb29sd29yZHMqNAorCisvKgorICogRm9yIHRoZSBwdXJwb3NlcyBvZiBiZXR0ZXIgbWl4aW5nLCB3ZSB1c2UgdGhlIENSQy0zMiBwb2x5bm9taWFsIGFzCisgKiB3ZWxsIHRvIG1ha2UgYSB0d2lzdGVkIEdlbmVyYWxpemVkIEZlZWRiYWNrIFNoaWZ0IFJlaWdzdGVyCisgKgorICogKFNlZSBNLiBNYXRzdW1vdG8gJiBZLiBLdXJpdGEsIDE5OTIuICBUd2lzdGVkIEdGU1IgZ2VuZXJhdG9ycy4gIEFDTQorICogVHJhbnNhY3Rpb25zIG9uIE1vZGVsaW5nIGFuZCBDb21wdXRlciBTaW11bGF0aW9uIDIoMyk6MTc5LTE5NC4KKyAqIEFsc28gc2VlIE0uIE1hdHN1bW90byAmIFkuIEt1cml0YSwgMTk5NC4gIFR3aXN0ZWQgR0ZTUiBnZW5lcmF0b3JzCisgKiBJSS4gIEFDTSBUcmFuc2FjdGlvbnMgb24gTWRlbGluZyBhbmQgQ29tcHV0ZXIgU2ltdWxhdGlvbiA0OjI1NC0yNjYpCisgKgorICogVGhhbmtzIHRvIENvbGluIFBsdW1iIGZvciBzdWdnZXN0aW5nIHRoaXMuCisgKgorICogV2UgaGF2ZSBub3QgYW5hbHl6ZWQgdGhlIHJlc3VsdGFudCBwb2x5bm9taWFsIHRvIHByb3ZlIGl0IHByaW1pdGl2ZTsKKyAqIGluIGZhY3QgaXQgYWxtb3N0IGNlcnRhaW5seSBpc24ndC4gIE5vbmV0aGVsZXNzLCB0aGUgaXJyZWR1Y2libGUgZmFjdG9ycworICogb2YgYSByYW5kb20gbGFyZ2UtZGVncmVlIHBvbHlub21pYWwgb3ZlciBHRigyKSBhcmUgbW9yZSB0aGFuIGxhcmdlIGVub3VnaAorICogdGhhdCBwZXJpb2RpY2l0eSBpcyBub3QgYSBjb25jZXJuLgorICoKKyAqIFRoZSBpbnB1dCBoYXNoIGlzIG11Y2ggbGVzcyBzZW5zaXRpdmUgdGhhbiB0aGUgb3V0cHV0IGhhc2guICBBbGwKKyAqIHRoYXQgd2Ugd2FudCBvZiBpdCBpcyB0aGF0IGl0IGJlIGEgZ29vZCBub24tY3J5cHRvZ3JhcGhpYyBoYXNoOworICogaS5lLiBpdCBub3QgcHJvZHVjZSBjb2xsaXNpb25zIHdoZW4gZmVkICJyYW5kb20iIGRhdGEgb2YgdGhlIHNvcnQKKyAqIHdlIGV4cGVjdCB0byBzZWUuICBBcyBsb25nIGFzIHRoZSBwb29sIHN0YXRlIGRpZmZlcnMgZm9yIGRpZmZlcmVudAorICogaW5wdXRzLCB3ZSBoYXZlIHByZXNlcnZlZCB0aGUgaW5wdXQgZW50cm9weSBhbmQgZG9uZSBhIGdvb2Qgam9iLgorICogVGhlIGZhY3QgdGhhdCBhbiBpbnRlbGxpZ2VudCBhdHRhY2tlciBjYW4gY29uc3RydWN0IGlucHV0cyB0aGF0CisgKiB3aWxsIHByb2R1Y2UgY29udHJvbGxlZCBhbHRlcmF0aW9ucyB0byB0aGUgcG9vbCdzIHN0YXRlIGlzIG5vdAorICogaW1wb3J0YW50IGJlY2F1c2Ugd2UgZG9uJ3QgY29uc2lkZXIgc3VjaCBpbnB1dHMgdG8gY29udHJpYnV0ZSBhbnkKKyAqIHJhbmRvbW5lc3MuICBUaGUgb25seSBwcm9wZXJ0eSB3ZSBuZWVkIHdpdGggcmVzcGVjdCB0byB0aGVtIGlzIHRoYXQKKyAqIHRoZSBhdHRhY2tlciBjYW4ndCBpbmNyZWFzZSBoaXMvaGVyIGtub3dsZWRnZSBvZiB0aGUgcG9vbCdzIHN0YXRlLgorICogU2luY2UgYWxsIGFkZGl0aW9ucyBhcmUgcmV2ZXJzaWJsZSAoa25vd2luZyB0aGUgZmluYWwgc3RhdGUgYW5kIHRoZQorICogaW5wdXQsIHlvdSBjYW4gcmVjb25zdHJ1Y3QgdGhlIGluaXRpYWwgc3RhdGUpLCBpZiBhbiBhdHRhY2tlciBoYXMKKyAqIGFueSB1bmNlcnRhaW50eSBhYm91dCB0aGUgaW5pdGlhbCBzdGF0ZSwgaGUvc2hlIGNhbiBvbmx5IHNodWZmbGUKKyAqIHRoYXQgdW5jZXJ0YWludHkgYWJvdXQsIGJ1dCBuZXZlciBjYXVzZSBhbnkgY29sbGlzaW9ucyAod2hpY2ggd291bGQKKyAqIGRlY3JlYXNlIHRoZSB1bmNlcnRhaW50eSkuCisgKgorICogVGhlIGNob3NlbiBzeXN0ZW0gbGV0cyB0aGUgc3RhdGUgb2YgdGhlIHBvb2wgYmUgKGVzc2VudGlhbGx5KSB0aGUgaW5wdXQKKyAqIG1vZHVsbyB0aGUgZ2VuZXJhdG9yIHBvbHltbm9taWFsLiAgTm93LCBmb3IgcmFuZG9tIHByaW1pdGl2ZSBwb2x5bm9taWFscywKKyAqIHRoaXMgaXMgYSB1bml2ZXJzYWwgY2xhc3Mgb2YgaGFzaCBmdW5jdGlvbnMsIG1lYW5pbmcgdGhhdCB0aGUgY2hhbmNlCisgKiBvZiBhIGNvbGxpc2lvbiBpcyBsaW1pdGVkIGJ5IHRoZSBhdHRhY2tlcidzIGtub3dsZWRnZSBvZiB0aGUgZ2VuZXJhdG9yCisgKiBwb2x5bm9tYWlsLCBzbyBpZiBpdCBpcyBjaG9zZW4gYXQgcmFuZG9tLCBhbiBhdHRhY2tlciBjYW4gbmV2ZXIgZm9yY2UKKyAqIGEgY29sbGlzaW9uLiAgSGVyZSwgd2UgdXNlIGEgZml4ZWQgcG9seW5vbWlhbCwgYnV0IHdlICpjYW4qIGFzc3VtZSB0aGF0CisgKiAjIyMtLT4gaXQgaXMgdW5rbm93biB0byB0aGUgcHJvY2Vzc2VzIGdlbmVyYXRpbmcgdGhlIGlucHV0IGVudHJvcHkuIDwtIyMjCisgKiBCZWNhdXNlIG9mIHRoaXMgaW1wb3J0YW50IHByb3BlcnR5LCB0aGlzIGlzIGEgZ29vZCwgY29sbGlzaW9uLXJlc2lzdGFudAorICogaGFzaDsgaGFzaCBjb2xsaXNpb25zIHdpbGwgb2NjdXIgbm8gbW9yZSBvZnRlbiB0aGFuIGNoYW5jZS4KKyAqLworCisvKgorICogU3RhdGljIGdsb2JhbCB2YXJpYWJsZXMKKyAqLworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHJhbmRvbV9yZWFkX3dhaXQpOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHJhbmRvbV93cml0ZV93YWl0KTsKKworI2lmIDAKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGRlYnVnLCBib29sLCAwNjQ0KTsKKyNkZWZpbmUgREVCVUdfRU5UKGZtdCwgYXJnLi4uKSBkbyB7IGlmIChkZWJ1ZykgXAorCXByaW50ayhLRVJOX0RFQlVHICJyYW5kb20gJTA0ZCAlMDRkICUwNGQ6ICIgXAorCWZtdCxcCisJaW5wdXRfcG9vbC5lbnRyb3B5X2NvdW50LFwKKwlibG9ja2luZ19wb29sLmVudHJvcHlfY291bnQsXAorCW5vbmJsb2NraW5nX3Bvb2wuZW50cm9weV9jb3VudCxcCisJIyMgYXJnKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0VOVChmbXQsIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBPUyBpbmRlcGVuZGVudCBlbnRyb3B5IHN0b3JlLiAgIEhlcmUgYXJlIHRoZSBmdW5jdGlvbnMgd2hpY2ggaGFuZGxlCisgKiBzdG9yaW5nIGVudHJvcHkgaW4gYW4gZW50cm9weSBwb29sLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZW50cm9weV9zdG9yZTsKK3N0cnVjdCBlbnRyb3B5X3N0b3JlIHsKKwkvKiBtb3N0bHktcmVhZCBkYXRhOiAqLworCXN0cnVjdCBwb29saW5mbyAqcG9vbGluZm87CisJX191MzIgKnBvb2w7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbGltaXQ7CisJc3RydWN0IGVudHJvcHlfc3RvcmUgKnB1bGw7CisKKwkvKiByZWFkLXdyaXRlIGRhdGE6ICovCisJc3BpbmxvY2tfdCBsb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisJdW5zaWduZWQgYWRkX3B0cjsKKwlpbnQgZW50cm9weV9jb3VudDsKKwlpbnQgaW5wdXRfcm90YXRlOworfTsKKworc3RhdGljIF9fdTMyIGlucHV0X3Bvb2xfZGF0YVtJTlBVVF9QT09MX1dPUkRTXTsKK3N0YXRpYyBfX3UzMiBibG9ja2luZ19wb29sX2RhdGFbT1VUUFVUX1BPT0xfV09SRFNdOworc3RhdGljIF9fdTMyIG5vbmJsb2NraW5nX3Bvb2xfZGF0YVtPVVRQVVRfUE9PTF9XT1JEU107CisKK3N0YXRpYyBzdHJ1Y3QgZW50cm9weV9zdG9yZSBpbnB1dF9wb29sID0geworCS5wb29saW5mbyA9ICZwb29saW5mb190YWJsZVswXSwKKwkubmFtZSA9ICJpbnB1dCIsCisJLmxpbWl0ID0gMSwKKwkubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkucG9vbCA9IGlucHV0X3Bvb2xfZGF0YQorfTsKKworc3RhdGljIHN0cnVjdCBlbnRyb3B5X3N0b3JlIGJsb2NraW5nX3Bvb2wgPSB7CisJLnBvb2xpbmZvID0gJnBvb2xpbmZvX3RhYmxlWzFdLAorCS5uYW1lID0gImJsb2NraW5nIiwKKwkubGltaXQgPSAxLAorCS5wdWxsID0gJmlucHV0X3Bvb2wsCisJLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLnBvb2wgPSBibG9ja2luZ19wb29sX2RhdGEKK307CisKK3N0YXRpYyBzdHJ1Y3QgZW50cm9weV9zdG9yZSBub25ibG9ja2luZ19wb29sID0geworCS5wb29saW5mbyA9ICZwb29saW5mb190YWJsZVsxXSwKKwkubmFtZSA9ICJub25ibG9ja2luZyIsCisJLnB1bGwgPSAmaW5wdXRfcG9vbCwKKwkubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkucG9vbCA9IG5vbmJsb2NraW5nX3Bvb2xfZGF0YQorfTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhIGJ5dGUgaW50byB0aGUgZW50cm9weSAicG9vbCIuICBJdCBkb2VzIG5vdAorICogdXBkYXRlIHRoZSBlbnRyb3B5IGVzdGltYXRlLiAgVGhlIGNhbGxlciBzaG91bGQgY2FsbAorICogY3JlZGl0X2VudHJvcHlfc3RvcmUgaWYgdGhpcyBpcyBhcHByb3ByaWF0ZS4KKyAqCisgKiBUaGUgcG9vbCBpcyBzdGlycmVkIHdpdGggYSBwcmltaXRpdmUgcG9seW5vbWlhbCBvZiB0aGUgYXBwcm9wcmlhdGUKKyAqIGRlZ3JlZSwgYW5kIHRoZW4gdHdpc3RlZC4gIFdlIHR3aXN0IGJ5IHRocmVlIGJpdHMgYXQgYSB0aW1lIGJlY2F1c2UKKyAqIGl0J3MgY2hlYXAgdG8gZG8gc28gYW5kIGhlbHBzIHNsaWdodGx5IGluIHRoZSBleHBlY3RlZCBjYXNlIHdoZXJlCisgKiB0aGUgZW50cm9weSBpcyBjb25jZW50cmF0ZWQgaW4gdGhlIGxvdy1vcmRlciBiaXRzLgorICovCitzdGF0aWMgdm9pZCBfX2FkZF9lbnRyb3B5X3dvcmRzKHN0cnVjdCBlbnRyb3B5X3N0b3JlICpyLCBjb25zdCBfX3UzMiAqaW4sCisJCQkJaW50IG53b3JkcywgX191MzIgb3V0WzE2XSkKK3sKKwlzdGF0aWMgX191MzIgY29uc3QgdHdpc3RfdGFibGVbOF0gPSB7CisJCTB4MDAwMDAwMDAsIDB4M2I2ZTIwYzgsIDB4NzZkYzQxOTAsIDB4NGRiMjYxNTgsCisJCTB4ZWRiODgzMjAsIDB4ZDZkNmEzZTgsIDB4OWI2NGMyYjAsIDB4YTAwYWUyNzggfTsKKwl1bnNpZ25lZCBsb25nIGksIGFkZF9wdHIsIHRhcDEsIHRhcDIsIHRhcDMsIHRhcDQsIHRhcDU7CisJaW50IG5ld19yb3RhdGUsIGlucHV0X3JvdGF0ZTsKKwlpbnQgd29yZG1hc2sgPSByLT5wb29saW5mby0+cG9vbHdvcmRzIC0gMTsKKwlfX3UzMiB3LCBuZXh0X3c7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFRhcHMgYXJlIGNvbnN0YW50LCBzbyB3ZSBjYW4gbG9hZCB0aGVtIHdpdGhvdXQgaG9sZGluZyByLT5sb2NrLiAgKi8KKwl0YXAxID0gci0+cG9vbGluZm8tPnRhcDE7CisJdGFwMiA9IHItPnBvb2xpbmZvLT50YXAyOworCXRhcDMgPSByLT5wb29saW5mby0+dGFwMzsKKwl0YXA0ID0gci0+cG9vbGluZm8tPnRhcDQ7CisJdGFwNSA9IHItPnBvb2xpbmZvLT50YXA1OworCW5leHRfdyA9ICppbisrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnItPmxvY2ssIGZsYWdzKTsKKwlwcmVmZXRjaF9yYW5nZShyLT5wb29sLCB3b3JkbWFzayk7CisJaW5wdXRfcm90YXRlID0gci0+aW5wdXRfcm90YXRlOworCWFkZF9wdHIgPSByLT5hZGRfcHRyOworCisJd2hpbGUgKG53b3Jkcy0tKSB7CisJCXcgPSByb2wzMihuZXh0X3csIGlucHV0X3JvdGF0ZSk7CisJCWlmIChud29yZHMgPiAwKQorCQkJbmV4dF93ID0gKmluKys7CisJCWkgPSBhZGRfcHRyID0gKGFkZF9wdHIgLSAxKSAmIHdvcmRtYXNrOworCQkvKgorCQkgKiBOb3JtYWxseSwgd2UgYWRkIDcgYml0cyBvZiByb3RhdGlvbiB0byB0aGUgcG9vbC4KKwkJICogQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcG9vbCwgYWRkIGFuIGV4dHJhIDcgYml0cworCQkgKiByb3RhdGlvbiwgc28gdGhhdCBzdWNjZXNzaXZlIHBhc3NlcyBzcHJlYWQgdGhlCisJCSAqIGlucHV0IGJpdHMgYWNyb3NzIHRoZSBwb29sIGV2ZW5seS4KKwkJICovCisJCW5ld19yb3RhdGUgPSBpbnB1dF9yb3RhdGUgKyAxNDsKKwkJaWYgKGkpCisJCQluZXdfcm90YXRlID0gaW5wdXRfcm90YXRlICsgNzsKKwkJaW5wdXRfcm90YXRlID0gbmV3X3JvdGF0ZSAmIDMxOworCisJCS8qIFhPUiBpbiB0aGUgdmFyaW91cyB0YXBzICovCisJCXcgXj0gci0+cG9vbFsoaSArIHRhcDEpICYgd29yZG1hc2tdOworCQl3IF49IHItPnBvb2xbKGkgKyB0YXAyKSAmIHdvcmRtYXNrXTsKKwkJdyBePSByLT5wb29sWyhpICsgdGFwMykgJiB3b3JkbWFza107CisJCXcgXj0gci0+cG9vbFsoaSArIHRhcDQpICYgd29yZG1hc2tdOworCQl3IF49IHItPnBvb2xbKGkgKyB0YXA1KSAmIHdvcmRtYXNrXTsKKwkJdyBePSByLT5wb29sW2ldOworCQlyLT5wb29sW2ldID0gKHcgPj4gMykgXiB0d2lzdF90YWJsZVt3ICYgN107CisJfQorCisJci0+aW5wdXRfcm90YXRlID0gaW5wdXRfcm90YXRlOworCXItPmFkZF9wdHIgPSBhZGRfcHRyOworCisJaWYgKG91dCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJb3V0W2ldID0gci0+cG9vbFthZGRfcHRyXTsKKwkJCWFkZF9wdHIgPSAoYWRkX3B0ciAtIDEpICYgd29yZG1hc2s7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfZW50cm9weV93b3JkcyhzdHJ1Y3QgZW50cm9weV9zdG9yZSAqciwgY29uc3QgX191MzIgKmluLAorCQkJCSAgICAgaW50IG53b3JkcykKK3sKKwlfX2FkZF9lbnRyb3B5X3dvcmRzKHIsIGluLCBud29yZHMsIE5VTEwpOworfQorCisvKgorICogQ3JlZGl0IChvciBkZWJpdCkgdGhlIGVudHJvcHkgc3RvcmUgd2l0aCBuIGJpdHMgb2YgZW50cm9weQorICovCitzdGF0aWMgdm9pZCBjcmVkaXRfZW50cm9weV9zdG9yZShzdHJ1Y3QgZW50cm9weV9zdG9yZSAqciwgaW50IG5iaXRzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmci0+bG9jaywgZmxhZ3MpOworCisJaWYgKHItPmVudHJvcHlfY291bnQgKyBuYml0cyA8IDApIHsKKwkJREVCVUdfRU5UKCJuZWdhdGl2ZSBlbnRyb3B5L292ZXJmbG93ICglZCslZClcbiIsCisJCQkgIHItPmVudHJvcHlfY291bnQsIG5iaXRzKTsKKwkJci0+ZW50cm9weV9jb3VudCA9IDA7CisJfSBlbHNlIGlmIChyLT5lbnRyb3B5X2NvdW50ICsgbmJpdHMgPiByLT5wb29saW5mby0+UE9PTEJJVFMpIHsKKwkJci0+ZW50cm9weV9jb3VudCA9IHItPnBvb2xpbmZvLT5QT09MQklUUzsKKwl9IGVsc2UgeworCQlyLT5lbnRyb3B5X2NvdW50ICs9IG5iaXRzOworCQlpZiAobmJpdHMpCisJCQlERUJVR19FTlQoImFkZGVkICVkIGVudHJvcHkgY3JlZGl0cyB0byAlc1xuIiwKKwkJCQkgIG5iaXRzLCByLT5uYW1lKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBFbnRyb3B5IGlucHV0IG1hbmFnZW1lbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGVyZSBpcyBvbmUgb2YgdGhlc2UgcGVyIGVudHJvcHkgc291cmNlICovCitzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSB7CisJY3ljbGVzX3QgbGFzdF90aW1lOworCWxvbmcgbGFzdF9kZWx0YSxsYXN0X2RlbHRhMjsKKwl1bnNpZ25lZCBkb250X2NvdW50X2VudHJvcHk6MTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSBpbnB1dF90aW1lcl9zdGF0ZTsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSAqaXJxX3RpbWVyX3N0YXRlW05SX0lSUVNdOworCisvKgorICogVGhpcyBmdW5jdGlvbiBhZGRzIGVudHJvcHkgdG8gdGhlIGVudHJvcHkgInBvb2wiIGJ5IHVzaW5nIHRpbWluZworICogZGVsYXlzLiAgSXQgdXNlcyB0aGUgdGltZXJfcmFuZF9zdGF0ZSBzdHJ1Y3R1cmUgdG8gbWFrZSBhbiBlc3RpbWF0ZQorICogb2YgaG93IG1hbnkgYml0cyBvZiBlbnRyb3B5IHRoaXMgY2FsbCBoYXMgYWRkZWQgdG8gdGhlIHBvb2wuCisgKgorICogVGhlIG51bWJlciAibnVtIiBpcyBhbHNvIGFkZGVkIHRvIHRoZSBwb29sIC0gaXQgc2hvdWxkIHNvbWVob3cgZGVzY3JpYmUKKyAqIHRoZSB0eXBlIG9mIGV2ZW50IHdoaWNoIGp1c3QgaGFwcGVuZWQuICBUaGlzIGlzIGN1cnJlbnRseSAwLTI1NSBmb3IKKyAqIGtleWJvYXJkIHNjYW4gY29kZXMsIGFuZCAyNTYgdXB3YXJkcyBmb3IgaW50ZXJydXB0cy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGFkZF90aW1lcl9yYW5kb21uZXNzKHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgbnVtKQoreworCXN0cnVjdCB7CisJCWN5Y2xlc190IGN5Y2xlczsKKwkJbG9uZyBqaWZmaWVzOworCQl1bnNpZ25lZCBudW07CisJfSBzYW1wbGU7CisJbG9uZyBkZWx0YSwgZGVsdGEyLCBkZWx0YTM7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwkvKiBpZiBvdmVyIHRoZSB0cmlja2xlIHRocmVzaG9sZCwgdXNlIG9ubHkgMSBpbiA0MDk2IHNhbXBsZXMgKi8KKwlpZiAoaW5wdXRfcG9vbC5lbnRyb3B5X2NvdW50ID4gdHJpY2tsZV90aHJlc2ggJiYKKwkgICAgKF9fZ2V0X2NwdV92YXIodHJpY2tsZV9jb3VudCkrKyAmIDB4ZmZmKSkKKwkJZ290byBvdXQ7CisKKwlzYW1wbGUuamlmZmllcyA9IGppZmZpZXM7CisJc2FtcGxlLmN5Y2xlcyA9IGdldF9jeWNsZXMoKTsKKwlzYW1wbGUubnVtID0gbnVtOworCWFkZF9lbnRyb3B5X3dvcmRzKCZpbnB1dF9wb29sLCAodTMyICopJnNhbXBsZSwgc2l6ZW9mKHNhbXBsZSkvNCk7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBudW1iZXIgb2YgYml0cyBvZiByYW5kb21uZXNzIHdlIHByb2JhYmx5IGFkZGVkLgorCSAqIFdlIHRha2UgaW50byBhY2NvdW50IHRoZSBmaXJzdCwgc2Vjb25kIGFuZCB0aGlyZC1vcmRlciBkZWx0YXMKKwkgKiBpbiBvcmRlciB0byBtYWtlIG91ciBlc3RpbWF0ZS4KKwkgKi8KKworCWlmICghc3RhdGUtPmRvbnRfY291bnRfZW50cm9weSkgeworCQlkZWx0YSA9IHNhbXBsZS5qaWZmaWVzIC0gc3RhdGUtPmxhc3RfdGltZTsKKwkJc3RhdGUtPmxhc3RfdGltZSA9IHNhbXBsZS5qaWZmaWVzOworCisJCWRlbHRhMiA9IGRlbHRhIC0gc3RhdGUtPmxhc3RfZGVsdGE7CisJCXN0YXRlLT5sYXN0X2RlbHRhID0gZGVsdGE7CisKKwkJZGVsdGEzID0gZGVsdGEyIC0gc3RhdGUtPmxhc3RfZGVsdGEyOworCQlzdGF0ZS0+bGFzdF9kZWx0YTIgPSBkZWx0YTI7CisKKwkJaWYgKGRlbHRhIDwgMCkKKwkJCWRlbHRhID0gLWRlbHRhOworCQlpZiAoZGVsdGEyIDwgMCkKKwkJCWRlbHRhMiA9IC1kZWx0YTI7CisJCWlmIChkZWx0YTMgPCAwKQorCQkJZGVsdGEzID0gLWRlbHRhMzsKKwkJaWYgKGRlbHRhID4gZGVsdGEyKQorCQkJZGVsdGEgPSBkZWx0YTI7CisJCWlmIChkZWx0YSA+IGRlbHRhMykKKwkJCWRlbHRhID0gZGVsdGEzOworCisJCS8qCisJCSAqIGRlbHRhIGlzIG5vdyBtaW5pbXVtIGFic29sdXRlIGRlbHRhLgorCQkgKiBSb3VuZCBkb3duIGJ5IDEgYml0IG9uIGdlbmVyYWwgcHJpbmNpcGxlcywKKwkJICogYW5kIGxpbWl0IGVudHJvcHkgZW50aW1hdGUgdG8gMTIgYml0cy4KKwkJICovCisJCWNyZWRpdF9lbnRyb3B5X3N0b3JlKCZpbnB1dF9wb29sLAorCQkJCSAgICAgbWluX3QoaW50LCBmbHMoZGVsdGE+PjEpLCAxMSkpOworCX0KKworCWlmKGlucHV0X3Bvb2wuZW50cm9weV9jb3VudCA+PSByYW5kb21fcmVhZF93YWtldXBfdGhyZXNoKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJhbmRvbV9yZWFkX3dhaXQpOworCitvdXQ6CisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworZXh0ZXJuIHZvaWQgYWRkX2lucHV0X3JhbmRvbW5lc3ModW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLAorCQkJCSB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGFzdF92YWx1ZTsKKworCS8qIGlnbm9yZSBhdXRvcmVwZWF0IGFuZCB0aGUgbGlrZSAqLworCWlmICh2YWx1ZSA9PSBsYXN0X3ZhbHVlKQorCQlyZXR1cm47CisKKwlERUJVR19FTlQoImlucHV0IGV2ZW50XG4iKTsKKwlsYXN0X3ZhbHVlID0gdmFsdWU7CisJYWRkX3RpbWVyX3JhbmRvbW5lc3MoJmlucHV0X3RpbWVyX3N0YXRlLAorCQkJICAgICAodHlwZSA8PCA0KSBeIGNvZGUgXiAoY29kZSA+PiA0KSBeIHZhbHVlKTsKK30KKwordm9pZCBhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoaW50IGlycSkKK3sKKwlpZiAoaXJxID49IE5SX0lSUVMgfHwgaXJxX3RpbWVyX3N0YXRlW2lycV0gPT0gMCkKKwkJcmV0dXJuOworCisJREVCVUdfRU5UKCJpcnEgZXZlbnQgJWRcbiIsIGlycSk7CisJYWRkX3RpbWVyX3JhbmRvbW5lc3MoaXJxX3RpbWVyX3N0YXRlW2lycV0sIDB4MTAwICsgaXJxKTsKK30KKwordm9pZCBhZGRfZGlza19yYW5kb21uZXNzKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCWlmICghZGlzayB8fCAhZGlzay0+cmFuZG9tKQorCQlyZXR1cm47CisJLyogZmlyc3QgbWFqb3IgaXMgMSwgc28gd2UgZ2V0ID49IDB4MjAwIGhlcmUgKi8KKwlERUJVR19FTlQoImRpc2sgZXZlbnQgJWQ6JWRcbiIsIGRpc2stPm1ham9yLCBkaXNrLT5maXJzdF9taW5vcik7CisKKwlhZGRfdGltZXJfcmFuZG9tbmVzcyhkaXNrLT5yYW5kb20sCisJCQkgICAgIDB4MTAwICsgTUtERVYoZGlzay0+bWFqb3IsIGRpc2stPmZpcnN0X21pbm9yKSk7Cit9CisKK0VYUE9SVF9TWU1CT0woYWRkX2Rpc2tfcmFuZG9tbmVzcyk7CisKKyNkZWZpbmUgRVhUUkFDVF9TSVpFIDEwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBFbnRyb3B5IGV4dHJhY3Rpb24gcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3NpemVfdCBleHRyYWN0X2VudHJvcHkoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIHZvaWQgKiBidWYsCisJCQkgICAgICAgc2l6ZV90IG5ieXRlcywgaW50IG1pbiwgaW50IHJzdmQpOworCisvKgorICogVGhpcyB1dGlsaXR5IGlubGluZSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdHJhbnNmZXJpbmcgZW50cm9weQorICogZnJvbSB0aGUgcHJpbWFyeSBwb29sIHRvIHRoZSBzZWNvbmRhcnkgZXh0cmFjdGlvbiBwb29sLiBXZSBtYWtlCisgKiBzdXJlIHdlIHB1bGwgZW5vdWdoIGZvciBhICdjYXRhc3Ryb3BoaWMgcmVzZWVkJy4KKyAqLworc3RhdGljIHZvaWQgeGZlcl9zZWNvbmRhcnlfcG9vbChzdHJ1Y3QgZW50cm9weV9zdG9yZSAqciwgc2l6ZV90IG5ieXRlcykKK3sKKwlfX3UzMiB0bXBbT1VUUFVUX1BPT0xfV09SRFNdOworCisJaWYgKHItPnB1bGwgJiYgci0+ZW50cm9weV9jb3VudCA8IG5ieXRlcyAqIDggJiYKKwkgICAgci0+ZW50cm9weV9jb3VudCA8IHItPnBvb2xpbmZvLT5QT09MQklUUykgeworCQlpbnQgYnl0ZXMgPSBtYXhfdChpbnQsIHJhbmRvbV9yZWFkX3dha2V1cF90aHJlc2ggLyA4LAorCQkJCW1pbl90KGludCwgbmJ5dGVzLCBzaXplb2YodG1wKSkpOworCQlpbnQgcnN2ZCA9IHItPmxpbWl0ID8gMCA6IHJhbmRvbV9yZWFkX3dha2V1cF90aHJlc2gvNDsKKworCQlERUJVR19FTlQoImdvaW5nIHRvIHJlc2VlZCAlcyB3aXRoICVkIGJpdHMgIgorCQkJICAiKCVkIG9mICVkIHJlcXVlc3RlZClcbiIsCisJCQkgIHItPm5hbWUsIGJ5dGVzICogOCwgbmJ5dGVzICogOCwgci0+ZW50cm9weV9jb3VudCk7CisKKwkJYnl0ZXM9ZXh0cmFjdF9lbnRyb3B5KHItPnB1bGwsIHRtcCwgYnl0ZXMsCisJCQkJICAgICAgcmFuZG9tX3JlYWRfd2FrZXVwX3RocmVzaCAvIDgsIHJzdmQpOworCQlhZGRfZW50cm9weV93b3JkcyhyLCB0bXAsIChieXRlcyArIDMpIC8gNCk7CisJCWNyZWRpdF9lbnRyb3B5X3N0b3JlKHIsIGJ5dGVzKjgpOworCX0KK30KKworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBleHRyYWN0cyByYW5kb21uZXNzIGZyb20gdGhlICJlbnRyb3B5IHBvb2wiLCBhbmQKKyAqIHJldHVybnMgaXQgaW4gYSBidWZmZXIuCisgKgorICogVGhlIG1pbiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBtaW5pbXVtIGFtb3VudCB3ZSBjYW4gcHVsbCBiZWZvcmUKKyAqIGZhaWxpbmcgdG8gYXZvaWQgcmFjZXMgdGhhdCBkZWZlYXQgY2F0YXN0cm9waGljIHJlc2VlZGluZyB3aGlsZSB0aGUKKyAqIHJlc2VydmVkIHBhcmFtZXRlciBpbmRpY2F0ZXMgaG93IG11Y2ggZW50cm9weSB3ZSBtdXN0IGxlYXZlIGluIHRoZQorICogcG9vbCBhZnRlciBlYWNoIHB1bGwgdG8gYXZvaWQgc3RhcnZpbmcgb3RoZXIgcmVhZGVycy4KKyAqCisgKiBOb3RlOiBleHRyYWN0X2VudHJvcHkoKSBhc3N1bWVzIHRoYXQgLnBvb2x3b3JkcyBpcyBhIG11bHRpcGxlIG9mIDE2IHdvcmRzLgorICovCisKK3N0YXRpYyBzaXplX3QgYWNjb3VudChzdHJ1Y3QgZW50cm9weV9zdG9yZSAqciwgc2l6ZV90IG5ieXRlcywgaW50IG1pbiwKKwkJICAgICAgaW50IHJlc2VydmVkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlCVUdfT04oci0+ZW50cm9weV9jb3VudCA+IHItPnBvb2xpbmZvLT5QT09MQklUUyk7CisKKwkvKiBIb2xkIGxvY2sgd2hpbGUgYWNjb3VudGluZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZyLT5sb2NrLCBmbGFncyk7CisKKwlERUJVR19FTlQoInRyeWluZyB0byBleHRyYWN0ICVkIGJpdHMgZnJvbSAlc1xuIiwKKwkJICBuYnl0ZXMgKiA4LCByLT5uYW1lKTsKKworCS8qIENhbiB3ZSBwdWxsIGVub3VnaD8gKi8KKwlpZiAoci0+ZW50cm9weV9jb3VudCAvIDggPCBtaW4gKyByZXNlcnZlZCkgeworCQluYnl0ZXMgPSAwOworCX0gZWxzZSB7CisJCS8qIElmIGxpbWl0ZWQsIG5ldmVyIHB1bGwgbW9yZSB0aGFuIGF2YWlsYWJsZSAqLworCQlpZiAoci0+bGltaXQgJiYgbmJ5dGVzICsgcmVzZXJ2ZWQgPj0gci0+ZW50cm9weV9jb3VudCAvIDgpCisJCQluYnl0ZXMgPSByLT5lbnRyb3B5X2NvdW50LzggLSByZXNlcnZlZDsKKworCQlpZihyLT5lbnRyb3B5X2NvdW50IC8gOCA+PSBuYnl0ZXMgKyByZXNlcnZlZCkKKwkJCXItPmVudHJvcHlfY291bnQgLT0gbmJ5dGVzKjg7CisJCWVsc2UKKwkJCXItPmVudHJvcHlfY291bnQgPSByZXNlcnZlZDsKKworCQlpZiAoci0+ZW50cm9weV9jb3VudCA8IHJhbmRvbV93cml0ZV93YWtldXBfdGhyZXNoKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyYW5kb21fd3JpdGVfd2FpdCk7CisJfQorCisJREVCVUdfRU5UKCJkZWJpdGluZyAlZCBlbnRyb3B5IGNyZWRpdHMgZnJvbSAlcyVzXG4iLAorCQkgIG5ieXRlcyAqIDgsIHItPm5hbWUsIHItPmxpbWl0ID8gIiIgOiAiICh1bmxpbWl0ZWQpIik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgdm9pZCBleHRyYWN0X2J1ZihzdHJ1Y3QgZW50cm9weV9zdG9yZSAqciwgX191OCAqb3V0KQoreworCWludCBpLCB4OworCV9fdTMyIGRhdGFbMTZdLCBidWZbNSArIFNIQV9XT1JLU1BBQ0VfV09SRFNdOworCisJc2hhX2luaXQoYnVmKTsKKwkvKgorCSAqIEFzIHdlIGhhc2ggdGhlIHBvb2wsIHdlIG1peCBpbnRlcm1lZGlhdGUgdmFsdWVzIG9mCisJICogdGhlIGhhc2ggYmFjayBpbnRvIHRoZSBwb29sLiAgVGhpcyBlbGltaW5hdGVzCisJICogYmFja3RyYWNraW5nIGF0dGFja3MgKHdoZXJlIHRoZSBhdHRhY2tlciBrbm93cworCSAqIHRoZSBzdGF0ZSBvZiB0aGUgcG9vbCBwbHVzIHRoZSBjdXJyZW50IG91dHB1dHMsIGFuZAorCSAqIGF0dGVtcHRzIHRvIGZpbmQgcHJldmlvdXMgb3VwdXRzKSwgdW5sZXNzIHRoZSBoYXNoCisJICogZnVuY3Rpb24gY2FuIGJlIGludmVydGVkLgorCSAqLworCWZvciAoaSA9IDAsIHggPSAwOyBpIDwgci0+cG9vbGluZm8tPnBvb2x3b3JkczsgaSArPSAxNiwgeCs9MikgeworCQlzaGFfdHJhbnNmb3JtKGJ1ZiwgKF9fdTggKilyLT5wb29sK2ksIGJ1ZiArIDUpOworCQlhZGRfZW50cm9weV93b3JkcyhyLCAmYnVmW3ggJSA1XSwgMSk7CisJfQorCisJLyoKKwkgKiBUbyBhdm9pZCBkdXBsaWNhdGVzLCB3ZSBhdG9taWNhbGx5IGV4dHJhY3QgYQorCSAqIHBvcnRpb24gb2YgdGhlIHBvb2wgd2hpbGUgbWl4aW5nLCBhbmQgaGFzaCBvbmUKKwkgKiBmaW5hbCB0aW1lLgorCSAqLworCV9fYWRkX2VudHJvcHlfd29yZHMociwgJmJ1Zlt4ICUgNV0sIDEsIGRhdGEpOworCXNoYV90cmFuc2Zvcm0oYnVmLCAoX191OCAqKWRhdGEsIGJ1ZiArIDUpOworCisJLyoKKwkgKiBJbiBjYXNlIHRoZSBoYXNoIGZ1bmN0aW9uIGhhcyBzb21lIHJlY29nbml6YWJsZQorCSAqIG91dHB1dCBwYXR0ZXJuLCB3ZSBmb2xkIGl0IGluIGhhbGYuCisJICovCisKKwlidWZbMF0gXj0gYnVmWzNdOworCWJ1ZlsxXSBePSBidWZbNF07CisJYnVmWzBdIF49IHJvbDMyKGJ1ZlszXSwgMTYpOworCW1lbWNweShvdXQsIGJ1ZiwgRVhUUkFDVF9TSVpFKTsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGV4dHJhY3RfZW50cm9weShzdHJ1Y3QgZW50cm9weV9zdG9yZSAqciwgdm9pZCAqIGJ1ZiwKKwkJCSAgICAgICBzaXplX3QgbmJ5dGVzLCBpbnQgbWluLCBpbnQgcmVzZXJ2ZWQpCit7CisJc3NpemVfdCByZXQgPSAwLCBpOworCV9fdTggdG1wW0VYVFJBQ1RfU0laRV07CisKKwl4ZmVyX3NlY29uZGFyeV9wb29sKHIsIG5ieXRlcyk7CisJbmJ5dGVzID0gYWNjb3VudChyLCBuYnl0ZXMsIG1pbiwgcmVzZXJ2ZWQpOworCisJd2hpbGUgKG5ieXRlcykgeworCQlleHRyYWN0X2J1ZihyLCB0bXApOworCQlpID0gbWluX3QoaW50LCBuYnl0ZXMsIEVYVFJBQ1RfU0laRSk7CisJCW1lbWNweShidWYsIHRtcCwgaSk7CisJCW5ieXRlcyAtPSBpOworCQlidWYgKz0gaTsKKwkJcmV0ICs9IGk7CisJfQorCisJLyogV2lwZSBkYXRhIGp1c3QgcmV0dXJuZWQgZnJvbSBtZW1vcnkgKi8KKwltZW1zZXQodG1wLCAwLCBzaXplb2YodG1wKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBleHRyYWN0X2VudHJvcHlfdXNlcihzdHJ1Y3QgZW50cm9weV9zdG9yZSAqciwgdm9pZCBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgc2l6ZV90IG5ieXRlcykKK3sKKwlzc2l6ZV90IHJldCA9IDAsIGk7CisJX191OCB0bXBbRVhUUkFDVF9TSVpFXTsKKworCXhmZXJfc2Vjb25kYXJ5X3Bvb2wociwgbmJ5dGVzKTsKKwluYnl0ZXMgPSBhY2NvdW50KHIsIG5ieXRlcywgMCwgMCk7CisKKwl3aGlsZSAobmJ5dGVzKSB7CisJCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKHJldCA9PSAwKQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQl9CisKKwkJZXh0cmFjdF9idWYociwgdG1wKTsKKwkJaSA9IG1pbl90KGludCwgbmJ5dGVzLCBFWFRSQUNUX1NJWkUpOworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgdG1wLCBpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJbmJ5dGVzIC09IGk7CisJCWJ1ZiArPSBpOworCQlyZXQgKz0gaTsKKwl9CisKKwkvKiBXaXBlIGRhdGEganVzdCByZXR1cm5lZCBmcm9tIG1lbW9yeSAqLworCW1lbXNldCh0bXAsIDAsIHNpemVvZih0bXApKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBleHBvcnRlZCBrZXJuZWwgaW50ZXJmYWNlLiAgSXQgcmV0dXJucyBzb21lCisgKiBudW1iZXIgb2YgZ29vZCByYW5kb20gbnVtYmVycywgc3VpdGFibGUgZm9yIHNlZWRpbmcgVENQIHNlcXVlbmNlCisgKiBudW1iZXJzLCBldGMuCisgKi8KK3ZvaWQgZ2V0X3JhbmRvbV9ieXRlcyh2b2lkICpidWYsIGludCBuYnl0ZXMpCit7CisJZXh0cmFjdF9lbnRyb3B5KCZub25ibG9ja2luZ19wb29sLCBidWYsIG5ieXRlcywgMCwgMCk7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2V0X3JhbmRvbV9ieXRlcyk7CisKKy8qCisgKiBpbml0X3N0ZF9kYXRhIC0gaW5pdGlhbGl6ZSBwb29sIHdpdGggc3lzdGVtIGRhdGEKKyAqCisgKiBAcjogcG9vbCB0byBpbml0aWFsaXplCisgKgorICogVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIHBvb2wncyBlbnRyb3B5IGNvdW50IGFuZCBtaXhlcyBzb21lIHN5c3RlbQorICogZGF0YSBpbnRvIHRoZSBwb29sIHRvIHByZXBhcmUgaXQgZm9yIHVzZS4gVGhlIHBvb2wgaXMgbm90IGNsZWFyZWQKKyAqIGFzIHRoYXQgY2FuIG9ubHkgZGVjcmVhc2UgdGhlIGVudHJvcHkgaW4gdGhlIHBvb2wuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfc3RkX2RhdGEoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyLT5sb2NrLCBmbGFncyk7CisJci0+ZW50cm9weV9jb3VudCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+bG9jaywgZmxhZ3MpOworCisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJYWRkX2VudHJvcHlfd29yZHMociwgKF9fdTMyICopJnR2LCBzaXplb2YodHYpLzQpOworCWFkZF9lbnRyb3B5X3dvcmRzKHIsIChfX3UzMiAqKSZzeXN0ZW1fdXRzbmFtZSwKKwkJCSAgc2l6ZW9mKHN5c3RlbV91dHNuYW1lKS80KTsKK30KKworc3RhdGljIGludCBfX2luaXQgcmFuZF9pbml0aWFsaXplKHZvaWQpCit7CisJaW5pdF9zdGRfZGF0YSgmaW5wdXRfcG9vbCk7CisJaW5pdF9zdGRfZGF0YSgmYmxvY2tpbmdfcG9vbCk7CisJaW5pdF9zdGRfZGF0YSgmbm9uYmxvY2tpbmdfcG9vbCk7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChyYW5kX2luaXRpYWxpemUpOworCit2b2lkIHJhbmRfaW5pdGlhbGl6ZV9pcnEoaW50IGlycSkKK3sKKwlzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSAqc3RhdGU7CisKKwlpZiAoaXJxID49IE5SX0lSUVMgfHwgaXJxX3RpbWVyX3N0YXRlW2lycV0pCisJCXJldHVybjsKKworCS8qCisJICogSWYga21hbGxvYyByZXR1cm5zIG51bGwsIHdlIGp1c3Qgd29uJ3QgdXNlIHRoYXQgZW50cm9weQorCSAqIHNvdXJjZS4KKwkgKi8KKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlKSB7CisJCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlKSk7CisJCWlycV90aW1lcl9zdGF0ZVtpcnFdID0gc3RhdGU7CisJfQorfQorCit2b2lkIHJhbmRfaW5pdGlhbGl6ZV9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlICpzdGF0ZTsKKworCS8qCisJICogSWYga21hbGxvYyByZXR1cm5zIG51bGwsIHdlIGp1c3Qgd29uJ3QgdXNlIHRoYXQgZW50cm9weQorCSAqIHNvdXJjZS4KKwkgKi8KKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlKSB7CisJCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlKSk7CisJCWRpc2stPnJhbmRvbSA9IHN0YXRlOworCX0KK30KKworc3RhdGljIHNzaXplX3QKK3JhbmRvbV9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90IG4sIHJldHZhbCA9IDAsIGNvdW50ID0gMDsKKworCWlmIChuYnl0ZXMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAobmJ5dGVzID4gMCkgeworCQluID0gbmJ5dGVzOworCQlpZiAobiA+IFNFQ19YRkVSX1NJWkUpCisJCQluID0gU0VDX1hGRVJfU0laRTsKKworCQlERUJVR19FTlQoInJlYWRpbmcgJWQgYml0c1xuIiwgbio4KTsKKworCQluID0gZXh0cmFjdF9lbnRyb3B5X3VzZXIoJmJsb2NraW5nX3Bvb2wsIGJ1Ziwgbik7CisKKwkJREVCVUdfRU5UKCJyZWFkIGdvdCAlZCBiaXRzICglZCBzdGlsbCBuZWVkZWQpXG4iLAorCQkJICBuKjgsIChuYnl0ZXMtbikqOCk7CisKKwkJaWYgKG4gPT0gMCkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJREVCVUdfRU5UKCJzbGVlcGluZz9cbiIpOworCisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocmFuZG9tX3JlYWRfd2FpdCwKKwkJCQlpbnB1dF9wb29sLmVudHJvcHlfY291bnQgPj0KKwkJCQkJCSByYW5kb21fcmVhZF93YWtldXBfdGhyZXNoKTsKKworCQkJREVCVUdfRU5UKCJhd2FrZVxuIik7CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobiA8IDApIHsKKwkJCXJldHZhbCA9IG47CisJCQlicmVhazsKKwkJfQorCQljb3VudCArPSBuOworCQlidWYgKz0gbjsKKwkJbmJ5dGVzIC09IG47CisJCWJyZWFrOwkJLyogVGhpcyBicmVhayBtYWtlcyB0aGUgZGV2aWNlIHdvcmsgKi8KKwkJCQkvKiBsaWtlIGEgbmFtZWQgcGlwZSAqLworCX0KKworCS8qCisJICogSWYgd2UgZ2F2ZSB0aGUgdXNlciBzb21lIGJ5dGVzLCB1cGRhdGUgdGhlIGFjY2VzcyB0aW1lLgorCSAqLworCWlmIChjb3VudCkKKwkJZmlsZV9hY2Nlc3NlZChmaWxlKTsKKworCXJldHVybiAoY291bnQgPyBjb3VudCA6IHJldHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit1cmFuZG9tX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJICAgICAgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQoreworCXJldHVybiBleHRyYWN0X2VudHJvcHlfdXNlcigmbm9uYmxvY2tpbmdfcG9vbCwgYnVmLCBuYnl0ZXMpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CityYW5kb21fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCit7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwlwb2xsX3dhaXQoZmlsZSwgJnJhbmRvbV9yZWFkX3dhaXQsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmcmFuZG9tX3dyaXRlX3dhaXQsIHdhaXQpOworCW1hc2sgPSAwOworCWlmIChpbnB1dF9wb29sLmVudHJvcHlfY291bnQgPj0gcmFuZG9tX3JlYWRfd2FrZXVwX3RocmVzaCkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCWlmIChpbnB1dF9wb29sLmVudHJvcHlfY291bnQgPCByYW5kb21fd3JpdGVfd2FrZXVwX3RocmVzaCkKKwkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIHNzaXplX3QKK3JhbmRvbV93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHJldCA9IDA7CisJc2l6ZV90IGJ5dGVzOworCV9fdTMyIGJ1ZlsxNl07CisJY29uc3QgY2hhciBfX3VzZXIgKnAgPSBidWZmZXI7CisJc2l6ZV90IGMgPSBjb3VudDsKKworCXdoaWxlIChjID4gMCkgeworCQlieXRlcyA9IG1pbihjLCBzaXplb2YoYnVmKSk7CisKKwkJYnl0ZXMgLT0gY29weV9mcm9tX3VzZXIoJmJ1ZiwgcCwgYnl0ZXMpOworCQlpZiAoIWJ5dGVzKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYyAtPSBieXRlczsKKwkJcCArPSBieXRlczsKKworCQlhZGRfZW50cm9weV93b3JkcygmaW5wdXRfcG9vbCwgYnVmLCAoYnl0ZXMgKyAzKSAvIDQpOworCX0KKwlpZiAocCA9PSBidWZmZXIpIHsKKwkJcmV0dXJuIChzc2l6ZV90KXJldDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJICAgICAgICBpbm9kZS0+aV9tdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlyZXR1cm4gKHNzaXplX3QpKHAgLSBidWZmZXIpOworCX0KK30KKworc3RhdGljIGludAorcmFuZG9tX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgc2l6ZSwgZW50X2NvdW50OworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKwlpbnQgcmV0dmFsOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJOREdFVEVOVENOVDoKKwkJZW50X2NvdW50ID0gaW5wdXRfcG9vbC5lbnRyb3B5X2NvdW50OworCQlpZiAocHV0X3VzZXIoZW50X2NvdW50LCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIFJOREFERFRPRU5UQ05UOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZ2V0X3VzZXIoZW50X2NvdW50LCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQljcmVkaXRfZW50cm9weV9zdG9yZSgmaW5wdXRfcG9vbCwgZW50X2NvdW50KTsKKwkJLyoKKwkJICogV2FrZSB1cCB3YWl0aW5nIHByb2Nlc3NlcyBpZiB3ZSBoYXZlIGVub3VnaAorCQkgKiBlbnRyb3B5LgorCQkgKi8KKwkJaWYgKGlucHV0X3Bvb2wuZW50cm9weV9jb3VudCA+PSByYW5kb21fcmVhZF93YWtldXBfdGhyZXNoKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyYW5kb21fcmVhZF93YWl0KTsKKwkJcmV0dXJuIDA7CisJY2FzZSBSTkRBRERFTlRST1BZOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZ2V0X3VzZXIoZW50X2NvdW50LCBwKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChlbnRfY291bnQgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChnZXRfdXNlcihzaXplLCBwKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHZhbCA9IHJhbmRvbV93cml0ZShmaWxlLCAoY29uc3QgY2hhciBfX3VzZXIgKikgcCwKKwkJCQkgICAgICBzaXplLCAmZmlsZS0+Zl9wb3MpOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCXJldHVybiByZXR2YWw7CisJCWNyZWRpdF9lbnRyb3B5X3N0b3JlKCZpbnB1dF9wb29sLCBlbnRfY291bnQpOworCQkvKgorCQkgKiBXYWtlIHVwIHdhaXRpbmcgcHJvY2Vzc2VzIGlmIHdlIGhhdmUgZW5vdWdoCisJCSAqIGVudHJvcHkuCisJCSAqLworCQlpZiAoaW5wdXRfcG9vbC5lbnRyb3B5X2NvdW50ID49IHJhbmRvbV9yZWFkX3dha2V1cF90aHJlc2gpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJhbmRvbV9yZWFkX3dhaXQpOworCQlyZXR1cm4gMDsKKwljYXNlIFJORFpBUEVOVENOVDoKKwljYXNlIFJORENMRUFSUE9PTDoKKwkJLyogQ2xlYXIgdGhlIGVudHJvcHkgcG9vbCBjb3VudGVycy4gKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaW5pdF9zdGRfZGF0YSgmaW5wdXRfcG9vbCk7CisJCWluaXRfc3RkX2RhdGEoJmJsb2NraW5nX3Bvb2wpOworCQlpbml0X3N0ZF9kYXRhKCZub25ibG9ja2luZ19wb29sKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhbmRvbV9mb3BzID0geworCS5yZWFkICA9IHJhbmRvbV9yZWFkLAorCS53cml0ZSA9IHJhbmRvbV93cml0ZSwKKwkucG9sbCAgPSByYW5kb21fcG9sbCwKKwkuaW9jdGwgPSByYW5kb21faW9jdGwsCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVyYW5kb21fZm9wcyA9IHsKKwkucmVhZCAgPSB1cmFuZG9tX3JlYWQsCisJLndyaXRlID0gcmFuZG9tX3dyaXRlLAorCS5pb2N0bCA9IHJhbmRvbV9pb2N0bCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbmRvbSBVVUlEIGludGVyZmFjZQorICoKKyAqIFVzZWQgaGVyZSBmb3IgYSBCb290IElELCBidXQgY2FuIGJlIHVzZWZ1bCBmb3Igb3RoZXIga2VybmVsCisgKiBkcml2ZXJzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEdlbmVyYXRlIHJhbmRvbSBVVUlECisgKi8KK3ZvaWQgZ2VuZXJhdGVfcmFuZG9tX3V1aWQodW5zaWduZWQgY2hhciB1dWlkX291dFsxNl0pCit7CisJZ2V0X3JhbmRvbV9ieXRlcyh1dWlkX291dCwgMTYpOworCS8qIFNldCBVVUlEIHZlcnNpb24gdG8gNCAtLS0gdHJ1ZWx5IHJhbmRvbSBnZW5lcmF0aW9uICovCisJdXVpZF9vdXRbNl0gPSAodXVpZF9vdXRbNl0gJiAweDBGKSB8IDB4NDA7CisJLyogU2V0IHRoZSBVVUlEIHZhcmlhbnQgdG8gRENFICovCisJdXVpZF9vdXRbOF0gPSAodXVpZF9vdXRbOF0gJiAweDNGKSB8IDB4ODA7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2VuZXJhdGVfcmFuZG9tX3V1aWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTeXNjdGwgaW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKK3N0YXRpYyBpbnQgbWluX3JlYWRfdGhyZXNoID0gOCwgbWluX3dyaXRlX3RocmVzaDsKK3N0YXRpYyBpbnQgbWF4X3JlYWRfdGhyZXNoID0gSU5QVVRfUE9PTF9XT1JEUyAqIDMyOworc3RhdGljIGludCBtYXhfd3JpdGVfdGhyZXNoID0gSU5QVVRfUE9PTF9XT1JEUyAqIDMyOworc3RhdGljIGNoYXIgc3lzY3RsX2Jvb3RpZFsxNl07CisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgaXMgdXNlZCB0byByZXR1cm4gYm90aCB0aGUgYm9vdGlkIFVVSUQsIGFuZCByYW5kb20KKyAqIFVVSUQuICBUaGUgZGlmZmVyZW5jZSBpcyBpbiB3aGV0aGVyIHRhYmxlLT5kYXRhIGlzIE5VTEw7IGlmIGl0IGlzLAorICogdGhlbiBhIG5ldyBVVUlEIGlzIGdlbmVyYXRlZCBhbmQgcmV0dXJuZWQgdG8gdGhlIHVzZXIuCisgKgorICogSWYgdGhlIHVzZXIgYWNjZXNzZXMgdGhpcyB2aWEgdGhlIHByb2MgaW50ZXJmYWNlLCBpdCB3aWxsIGJlIHJldHVybmVkCisgKiBhcyBhbiBBU0NJSSBzdHJpbmcgaW4gdGhlIHN0YW5kYXJkIFVVSUQgZm9ybWF0LiAgSWYgYWNjZXNzZXMgdmlhIHRoZQorICogc3lzY3RsIHN5c3RlbSBjYWxsLCBpdCBpcyByZXR1cm5lZCBhcyAxNiBieXRlcyBvZiBiaW5hcnkgZGF0YS4KKyAqLworc3RhdGljIGludCBwcm9jX2RvX3V1aWQoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCWN0bF90YWJsZSBmYWtlX3RhYmxlOworCXVuc2lnbmVkIGNoYXIgYnVmWzY0XSwgdG1wX3V1aWRbMTZdLCAqdXVpZDsKKworCXV1aWQgPSB0YWJsZS0+ZGF0YTsKKwlpZiAoIXV1aWQpIHsKKwkJdXVpZCA9IHRtcF91dWlkOworCQl1dWlkWzhdID0gMDsKKwl9CisJaWYgKHV1aWRbOF0gPT0gMCkKKwkJZ2VuZXJhdGVfcmFuZG9tX3V1aWQodXVpZCk7CisKKwlzcHJpbnRmKGJ1ZiwgIiUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtIgorCQkiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKwkJdXVpZFswXSwgIHV1aWRbMV0sICB1dWlkWzJdLCAgdXVpZFszXSwKKwkJdXVpZFs0XSwgIHV1aWRbNV0sICB1dWlkWzZdLCAgdXVpZFs3XSwKKwkJdXVpZFs4XSwgIHV1aWRbOV0sICB1dWlkWzEwXSwgdXVpZFsxMV0sCisJCXV1aWRbMTJdLCB1dWlkWzEzXSwgdXVpZFsxNF0sIHV1aWRbMTVdKTsKKwlmYWtlX3RhYmxlLmRhdGEgPSBidWY7CisJZmFrZV90YWJsZS5tYXhsZW4gPSBzaXplb2YoYnVmKTsKKworCXJldHVybiBwcm9jX2Rvc3RyaW5nKCZmYWtlX3RhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKK30KKworc3RhdGljIGludCB1dWlkX3N0cmF0ZWd5KGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAorCQkJIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCisJCQkgdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwgdm9pZCAqKmNvbnRleHQpCit7CisJdW5zaWduZWQgY2hhciB0bXBfdXVpZFsxNl0sICp1dWlkOworCXVuc2lnbmVkIGludCBsZW47CisKKwlpZiAoIW9sZHZhbCB8fCAhb2xkbGVucCkKKwkJcmV0dXJuIDE7CisKKwl1dWlkID0gdGFibGUtPmRhdGE7CisJaWYgKCF1dWlkKSB7CisJCXV1aWQgPSB0bXBfdXVpZDsKKwkJdXVpZFs4XSA9IDA7CisJfQorCWlmICh1dWlkWzhdID09IDApCisJCWdlbmVyYXRlX3JhbmRvbV91dWlkKHV1aWQpOworCisJaWYgKGdldF91c2VyKGxlbiwgb2xkbGVucCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChsZW4pIHsKKwkJaWYgKGxlbiA+IDE2KQorCQkJbGVuID0gMTY7CisJCWlmIChjb3B5X3RvX3VzZXIob2xkdmFsLCB1dWlkLCBsZW4pIHx8CisJCSAgICBwdXRfdXNlcihsZW4sIG9sZGxlbnApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHN5c2N0bF9wb29sc2l6ZSA9IElOUFVUX1BPT0xfV09SRFMgKiAzMjsKK2N0bF90YWJsZSByYW5kb21fdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZSAJPSBSQU5ET01fUE9PTFNJWkUsCisJCS5wcm9jbmFtZQk9ICJwb29sc2l6ZSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfcG9vbHNpemUsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gUkFORE9NX0VOVFJPUFlfQ09VTlQsCisJCS5wcm9jbmFtZQk9ICJlbnRyb3B5X2F2YWlsIiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCQkuZGF0YQkJPSAmaW5wdXRfcG9vbC5lbnRyb3B5X2NvdW50LAorCX0sCisJeworCQkuY3RsX25hbWUJPSBSQU5ET01fUkVBRF9USFJFU0gsCisJCS5wcm9jbmFtZQk9ICJyZWFkX3dha2V1cF90aHJlc2hvbGQiLAorCQkuZGF0YQkJPSAmcmFuZG9tX3JlYWRfd2FrZXVwX3RocmVzaCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9yZWFkX3RocmVzaCwKKwkJLmV4dHJhMgkJPSAmbWF4X3JlYWRfdGhyZXNoLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBSQU5ET01fV1JJVEVfVEhSRVNILAorCQkucHJvY25hbWUJPSAid3JpdGVfd2FrZXVwX3RocmVzaG9sZCIsCisJCS5kYXRhCQk9ICZyYW5kb21fd3JpdGVfd2FrZXVwX3RocmVzaCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl93cml0ZV90aHJlc2gsCisJCS5leHRyYTIJCT0gJm1heF93cml0ZV90aHJlc2gsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IFJBTkRPTV9CT09UX0lELAorCQkucHJvY25hbWUJPSAiYm9vdF9pZCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfYm9vdGlkLAorCQkubWF4bGVuCQk9IDE2LAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9fdXVpZCwKKwkJLnN0cmF0ZWd5CT0gJnV1aWRfc3RyYXRlZ3ksCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IFJBTkRPTV9VVUlELAorCQkucHJvY25hbWUJPSAidXVpZCIsCisJCS5tYXhsZW4JCT0gMTYsCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb191dWlkLAorCQkuc3RyYXRlZ3kJPSAmdXVpZF9zdHJhdGVneSwKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworI2VuZGlmIAkvKiBDT05GSUdfU1lTQ1RMICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJhbmRvbSBmdW50aW9ucyBmb3IgbmV0d29ya2luZworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRDUCBpbml0aWFsIHNlcXVlbmNlIG51bWJlciBwaWNraW5nLiAgVGhpcyB1c2VzIHRoZSByYW5kb20gbnVtYmVyCisgKiBnZW5lcmF0b3IgdG8gcGljayBhbiBpbml0aWFsIHNlY3JldCB2YWx1ZS4gIFRoaXMgdmFsdWUgaXMgaGFzaGVkCisgKiBhbG9uZyB3aXRoIHRoZSBUQ1AgZW5kcG9pbnQgaW5mb3JtYXRpb24gdG8gcHJvdmlkZSBhIHVuaXF1ZQorICogc3RhcnRpbmcgcG9pbnQgZm9yIGVhY2ggcGFpciBvZiBUQ1AgZW5kcG9pbnRzLiAgVGhpcyBkZWZlYXRzCisgKiBhdHRhY2tzIHdoaWNoIHJlbHkgb24gZ3Vlc3NpbmcgdGhlIGluaXRpYWwgVENQIHNlcXVlbmNlIG51bWJlci4KKyAqIFRoaXMgYWxnb3JpdGhtIHdhcyBzdWdnZXN0ZWQgYnkgU3RldmUgQmVsbG92aW4uCisgKgorICogVXNpbmcgYSB2ZXJ5IHN0cm9uZyBoYXNoIHdhcyB0YWtpbmcgYW4gYXBwcmVjaWFibGUgYW1vdW50IG9mIHRoZSB0b3RhbAorICogVENQIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCB0aW1lLCBzbyB0aGlzIGlzIGEgd2Vha2VyIGhhc2gsCisgKiBjb21wZW5zYXRlZCBmb3IgYnkgY2hhbmdpbmcgdGhlIHNlY3JldCBwZXJpb2RpY2FsbHkuCisgKi8KKworLyogRiwgRyBhbmQgSCBhcmUgYmFzaWMgTUQ0IGZ1bmN0aW9uczogc2VsZWN0aW9uLCBtYWpvcml0eSwgcGFyaXR5ICovCisjZGVmaW5lIEYoeCwgeSwgeikgKCh6KSBeICgoeCkgJiAoKHkpIF4gKHopKSkpCisjZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeSkpICsgKCgoeCkgXiAoeSkpICYgKHopKSkKKyNkZWZpbmUgSCh4LCB5LCB6KSAoKHgpIF4gKHkpIF4gKHopKQorCisvKgorICogVGhlIGdlbmVyaWMgcm91bmQgZnVuY3Rpb24uICBUaGUgYXBwbGljYXRpb24gaXMgc28gc3BlY2lmaWMgdGhhdAorICogd2UgZG9uJ3QgYm90aGVyIHByb3RlY3RpbmcgYWxsIHRoZSBhcmd1bWVudHMgd2l0aCBwYXJlbnMsIGFzIGlzIGdlbmVyYWxseQorICogZ29vZCBtYWNybyBwcmFjdGljZSwgaW4gZmF2b3Igb2YgZXh0cmEgbGVnaWJpbGl0eS4KKyAqIFJvdGF0aW9uIGlzIHNlcGFyYXRlIGZyb20gYWRkaXRpb24gdG8gcHJldmVudCByZWNvbXB1dGF0aW9uCisgKi8KKyNkZWZpbmUgUk9VTkQoZiwgYSwgYiwgYywgZCwgeCwgcykJXAorCShhICs9IGYoYiwgYywgZCkgKyB4LCBhID0gKGEgPDwgcykgfCAoYSA+PiAoMzIgLSBzKSkpCisjZGVmaW5lIEsxIDAKKyNkZWZpbmUgSzIgMDEzMjQwNDc0NjMxVUwKKyNkZWZpbmUgSzMgMDE1NjY2MzY1NjQxVUwKKworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCitzdGF0aWMgX191MzIgdHdvdGhpcmRzTUQ0VHJhbnNmb3JtIChfX3UzMiBjb25zdCBidWZbNF0sIF9fdTMyIGNvbnN0IGluWzEyXSkKK3sKKwlfX3UzMiBhID0gYnVmWzBdLCBiID0gYnVmWzFdLCBjID0gYnVmWzJdLCBkID0gYnVmWzNdOworCisJLyogUm91bmQgMSAqLworCVJPVU5EKEYsIGEsIGIsIGMsIGQsIGluWyAwXSArIEsxLCAgMyk7CisJUk9VTkQoRiwgZCwgYSwgYiwgYywgaW5bIDFdICsgSzEsICA3KTsKKwlST1VORChGLCBjLCBkLCBhLCBiLCBpblsgMl0gKyBLMSwgMTEpOworCVJPVU5EKEYsIGIsIGMsIGQsIGEsIGluWyAzXSArIEsxLCAxOSk7CisJUk9VTkQoRiwgYSwgYiwgYywgZCwgaW5bIDRdICsgSzEsICAzKTsKKwlST1VORChGLCBkLCBhLCBiLCBjLCBpblsgNV0gKyBLMSwgIDcpOworCVJPVU5EKEYsIGMsIGQsIGEsIGIsIGluWyA2XSArIEsxLCAxMSk7CisJUk9VTkQoRiwgYiwgYywgZCwgYSwgaW5bIDddICsgSzEsIDE5KTsKKwlST1VORChGLCBhLCBiLCBjLCBkLCBpblsgOF0gKyBLMSwgIDMpOworCVJPVU5EKEYsIGQsIGEsIGIsIGMsIGluWyA5XSArIEsxLCAgNyk7CisJUk9VTkQoRiwgYywgZCwgYSwgYiwgaW5bMTBdICsgSzEsIDExKTsKKwlST1VORChGLCBiLCBjLCBkLCBhLCBpblsxMV0gKyBLMSwgMTkpOworCisJLyogUm91bmQgMiAqLworCVJPVU5EKEcsIGEsIGIsIGMsIGQsIGluWyAxXSArIEsyLCAgMyk7CisJUk9VTkQoRywgZCwgYSwgYiwgYywgaW5bIDNdICsgSzIsICA1KTsKKwlST1VORChHLCBjLCBkLCBhLCBiLCBpblsgNV0gKyBLMiwgIDkpOworCVJPVU5EKEcsIGIsIGMsIGQsIGEsIGluWyA3XSArIEsyLCAxMyk7CisJUk9VTkQoRywgYSwgYiwgYywgZCwgaW5bIDldICsgSzIsICAzKTsKKwlST1VORChHLCBkLCBhLCBiLCBjLCBpblsxMV0gKyBLMiwgIDUpOworCVJPVU5EKEcsIGMsIGQsIGEsIGIsIGluWyAwXSArIEsyLCAgOSk7CisJUk9VTkQoRywgYiwgYywgZCwgYSwgaW5bIDJdICsgSzIsIDEzKTsKKwlST1VORChHLCBhLCBiLCBjLCBkLCBpblsgNF0gKyBLMiwgIDMpOworCVJPVU5EKEcsIGQsIGEsIGIsIGMsIGluWyA2XSArIEsyLCAgNSk7CisJUk9VTkQoRywgYywgZCwgYSwgYiwgaW5bIDhdICsgSzIsICA5KTsKKwlST1VORChHLCBiLCBjLCBkLCBhLCBpblsxMF0gKyBLMiwgMTMpOworCisJLyogUm91bmQgMyAqLworCVJPVU5EKEgsIGEsIGIsIGMsIGQsIGluWyAzXSArIEszLCAgMyk7CisJUk9VTkQoSCwgZCwgYSwgYiwgYywgaW5bIDddICsgSzMsICA5KTsKKwlST1VORChILCBjLCBkLCBhLCBiLCBpblsxMV0gKyBLMywgMTEpOworCVJPVU5EKEgsIGIsIGMsIGQsIGEsIGluWyAyXSArIEszLCAxNSk7CisJUk9VTkQoSCwgYSwgYiwgYywgZCwgaW5bIDZdICsgSzMsICAzKTsKKwlST1VORChILCBkLCBhLCBiLCBjLCBpblsxMF0gKyBLMywgIDkpOworCVJPVU5EKEgsIGMsIGQsIGEsIGIsIGluWyAxXSArIEszLCAxMSk7CisJUk9VTkQoSCwgYiwgYywgZCwgYSwgaW5bIDVdICsgSzMsIDE1KTsKKwlST1VORChILCBhLCBiLCBjLCBkLCBpblsgOV0gKyBLMywgIDMpOworCVJPVU5EKEgsIGQsIGEsIGIsIGMsIGluWyAwXSArIEszLCAgOSk7CisJUk9VTkQoSCwgYywgZCwgYSwgYiwgaW5bIDRdICsgSzMsIDExKTsKKwlST1VORChILCBiLCBjLCBkLCBhLCBpblsgOF0gKyBLMywgMTUpOworCisJcmV0dXJuIGJ1ZlsxXSArIGI7IC8qICJtb3N0IGhhc2hlZCIgd29yZCAqLworCS8qIEFsdGVybmF0aXZlOiByZXR1cm4gc3VtIG9mIGFsbCB3b3Jkcz8gKi8KK30KKyNlbmRpZgorCisjdW5kZWYgUk9VTkQKKyN1bmRlZiBGCisjdW5kZWYgRworI3VuZGVmIEgKKyN1bmRlZiBLMQorI3VuZGVmIEsyCisjdW5kZWYgSzMKKworLyogVGhpcyBzaG91bGQgbm90IGJlIGRlY3JlYXNlZCBzbyBsb3cgdGhhdCBJU05zIHdyYXAgdG9vIGZhc3QuICovCisjZGVmaW5lIFJFS0VZX0lOVEVSVkFMICgzMDAgKiBIWikKKy8qCisgKiBCaXQgbGF5b3V0IG9mIHRoZSB0Y3Agc2VxdWVuY2UgbnVtYmVycyAoYmVmb3JlIGFkZGluZyBjdXJyZW50IHRpbWUpOgorICogYml0IDI0LTMxOiBpbmNyZWFzZWQgYWZ0ZXIgZXZlcnkga2V5IGV4Y2hhbmdlCisgKiBiaXQgMC0yMzogaGFzaChzb3VyY2UsZGVzdCkKKyAqCisgKiBUaGUgaW1wbGVtZW50YXRpb24gaXMgc2ltaWxhciB0byB0aGUgYWxnb3JpdGhtIGRlc2NyaWJlZAorICogaW4gdGhlIEFwcGVuZGl4IG9mIFJGQyAxMTg1LCBleGNlcHQgdGhhdAorICogLSBpdCB1c2VzIGEgMSBNSHogY2xvY2sgaW5zdGVhZCBvZiBhIDI1MCBrSHogY2xvY2sKKyAqIC0gaXQgcGVyZm9ybXMgYSByZWtleSBldmVyeSA1IG1pbnV0ZXMsIHdoaWNoIGlzIGVxdWl2YWxlbnQKKyAqIAl0byBhIChzb3VyY2UsZGVzdCkgdHVscGxlIGRlcGVuZGVudCBmb3J3YXJkIGp1bXAgb2YgdGhlCisgKiAJY2xvY2sgYnkgMC4uMl4oSEFTSF9CSVRTKzEpCisgKgorICogVGh1cyB0aGUgYXZlcmFnZSBJU04gd3JhcGFyb3VuZCB0aW1lIGlzIDY4IG1pbnV0ZXMgaW5zdGVhZCBvZgorICogNC41NSBob3Vycy4KKyAqCisgKiBTTVAgY2xlYW51cCBhbmQgbG9jayBhdm9pZGFuY2Ugd2l0aCBwb29yIG1hbidzIFJDVS4KKyAqIAkJCU1hbmZyZWQgU3ByYXVsIDxtYW5mcmVkQGNvbG9yZnVsbGlmZS5jb20+CisgKgorICovCisjZGVmaW5lIENPVU5UX0JJVFMgOAorI2RlZmluZSBDT1VOVF9NQVNLICgoMSA8PCBDT1VOVF9CSVRTKSAtIDEpCisjZGVmaW5lIEhBU0hfQklUUyAyNAorI2RlZmluZSBIQVNIX01BU0sgKCgxIDw8IEhBU0hfQklUUykgLSAxKQorCitzdGF0aWMgc3RydWN0IGtleWRhdGEgeworCV9fdTMyIGNvdW50OyAvKiBhbHJlYWR5IHNoaWZ0ZWQgdG8gdGhlIGZpbmFsIHBvc2l0aW9uICovCisJX191MzIgc2VjcmV0WzEyXTsKK30gX19fX2NhY2hlbGluZV9hbGlnbmVkIGlwX2tleWRhdGFbMl07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY250OworCitzdGF0aWMgdm9pZCByZWtleV9zZXFfZ2VuZXJhdG9yKHZvaWQgKnByaXZhdGVfKTsKKworc3RhdGljIERFQ0xBUkVfV09SSyhyZWtleV93b3JrLCByZWtleV9zZXFfZ2VuZXJhdG9yLCBOVUxMKTsKKworLyoKKyAqIExvY2sgYXZvaWRhbmNlOgorICogVGhlIElTTiBnZW5lcmF0aW9uIHJ1bnMgbG9ja2xlc3MgLSBpdCdzIGp1c3QgYSBoYXNoIG92ZXIgcmFuZG9tIGRhdGEuCisgKiBTdGF0ZSBjaGFuZ2VzIGhhcHBlbiBldmVyeSA1IG1pbnV0ZXMgd2hlbiB0aGUgcmFuZG9tIGtleSBpcyByZXBsYWNlZC4KKyAqIFN5bmNocm9uaXphdGlvbiBpcyBwZXJmb3JtZWQgYnkgaGF2aW5nIHR3byBjb3BpZXMgb2YgdGhlIGhhc2ggZnVuY3Rpb24KKyAqIHN0YXRlIGFuZCByZWtleV9zZXFfZ2VuZXJhdG9yIGFsd2F5cyB1cGRhdGVzIHRoZSBpbmFjdGl2ZSBjb3B5LgorICogVGhlIGNvcHkgaXMgdGhlbiBhY3RpdmF0ZWQgYnkgdXBkYXRpbmcgaXBfY250LgorICogVGhlIGltcGxlbWVudGF0aW9uIGJyZWFrcyBkb3duIGlmIHNvbWVvbmUgYmxvY2tzIHRoZSB0aHJlYWQKKyAqIHRoYXQgcHJvY2Vzc2VzIFNZTiByZXF1ZXN0cyBmb3IgbW9yZSB0aGFuIDUgbWludXRlcy4gU2hvdWxkIG5ldmVyCisgKiBoYXBwZW4sIGFuZCBldmVuIGlmIHRoYXQgaGFwcGVucyBvbmx5IGEgbm90IHBlcmZlY3RseSBjb21wbGlhbnQKKyAqIElTTiBpcyBnZW5lcmF0ZWQsIG5vdGhpbmcgZmF0YWwuCisgKi8KK3N0YXRpYyB2b2lkIHJla2V5X3NlcV9nZW5lcmF0b3Iodm9pZCAqcHJpdmF0ZV8pCit7CisJc3RydWN0IGtleWRhdGEgKmtleXB0ciA9ICZpcF9rZXlkYXRhWzEgXiAoaXBfY250ICYgMSldOworCisJZ2V0X3JhbmRvbV9ieXRlcyhrZXlwdHItPnNlY3JldCwgc2l6ZW9mKGtleXB0ci0+c2VjcmV0KSk7CisJa2V5cHRyLT5jb3VudCA9IChpcF9jbnQgJiBDT1VOVF9NQVNLKSA8PCBIQVNIX0JJVFM7CisJc21wX3dtYigpOworCWlwX2NudCsrOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmVrZXlfd29yaywgUkVLRVlfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBrZXlkYXRhICpnZXRfa2V5cHRyKHZvaWQpCit7CisJc3RydWN0IGtleWRhdGEgKmtleXB0ciA9ICZpcF9rZXlkYXRhW2lwX2NudCAmIDFdOworCisJc21wX3JtYigpOworCisJcmV0dXJuIGtleXB0cjsKK30KKworc3RhdGljIF9faW5pdCBpbnQgc2VxZ2VuX2luaXQodm9pZCkKK3sKKwlyZWtleV9zZXFfZ2VuZXJhdG9yKE5VTEwpOworCXJldHVybiAwOworfQorbGF0ZV9pbml0Y2FsbChzZXFnZW5faW5pdCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKK19fdTMyIHNlY3VyZV90Y3B2Nl9zZXF1ZW5jZV9udW1iZXIoX191MzIgKnNhZGRyLCBfX3UzMiAqZGFkZHIsCisJCQkJICAgX191MTYgc3BvcnQsIF9fdTE2IGRwb3J0KQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCV9fdTMyIHNlcTsKKwlfX3UzMiBoYXNoWzEyXTsKKwlzdHJ1Y3Qga2V5ZGF0YSAqa2V5cHRyID0gZ2V0X2tleXB0cigpOworCisJLyogVGhlIHByb2NlZHVyZSBpcyB0aGUgc2FtZSBhcyBmb3IgSVB2NCwgYnV0IGFkZHJlc3NlcyBhcmUgbG9uZ2VyLgorCSAqIFRodXMgd2UgbXVzdCB1c2UgdHdvdGhpcmRzTUQ0VHJhbnNmb3JtLgorCSAqLworCisJbWVtY3B5KGhhc2gsIHNhZGRyLCAxNik7CisJaGFzaFs0XT0oc3BvcnQgPDwgMTYpICsgZHBvcnQ7CisJbWVtY3B5KCZoYXNoWzVdLGtleXB0ci0+c2VjcmV0LHNpemVvZihfX3UzMikgKiA3KTsKKworCXNlcSA9IHR3b3RoaXJkc01ENFRyYW5zZm9ybShkYWRkciwgaGFzaCkgJiBIQVNIX01BU0s7CisJc2VxICs9IGtleXB0ci0+Y291bnQ7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwlzZXEgKz0gdHYudHZfdXNlYyArIHR2LnR2X3NlYyAqIDEwMDAwMDA7CisKKwlyZXR1cm4gc2VxOworfQorRVhQT1JUX1NZTUJPTChzZWN1cmVfdGNwdjZfc2VxdWVuY2VfbnVtYmVyKTsKKyNlbmRpZgorCisvKiAgVGhlIGNvZGUgYmVsb3cgaXMgc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIoKS4KKyAqICBBbGwgYmxhbWVzIHRvIEFuZHJleSBWLiBTYXZvY2hraW4gPHNhd0Btc3UucnU+LgorICovCitfX3UzMiBzZWN1cmVfaXBfaWQoX191MzIgZGFkZHIpCit7CisJc3RydWN0IGtleWRhdGEgKmtleXB0cjsKKwlfX3UzMiBoYXNoWzRdOworCisJa2V5cHRyID0gZ2V0X2tleXB0cigpOworCisJLyoKKwkgKiAgUGljayBhIHVuaXF1ZSBzdGFydGluZyBvZmZzZXQgZm9yIGVhY2ggSVAgZGVzdGluYXRpb24uCisJICogIFRoZSBkZXN0IGlwIGFkZHJlc3MgaXMgcGxhY2VkIGluIHRoZSBzdGFydGluZyB2ZWN0b3IsCisJICogIHdoaWNoIGlzIHRoZW4gaGFzaGVkIHdpdGggcmFuZG9tIGRhdGEuCisJICovCisJaGFzaFswXSA9IGRhZGRyOworCWhhc2hbMV0gPSBrZXlwdHItPnNlY3JldFs5XTsKKwloYXNoWzJdID0ga2V5cHRyLT5zZWNyZXRbMTBdOworCWhhc2hbM10gPSBrZXlwdHItPnNlY3JldFsxMV07CisKKwlyZXR1cm4gaGFsZl9tZDRfdHJhbnNmb3JtKGhhc2gsIGtleXB0ci0+c2VjcmV0KTsKK30KKworI2lmZGVmIENPTkZJR19JTkVUCisKK19fdTMyIHNlY3VyZV90Y3Bfc2VxdWVuY2VfbnVtYmVyKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwKKwkJCQkgX191MTYgc3BvcnQsIF9fdTE2IGRwb3J0KQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCV9fdTMyIHNlcTsKKwlfX3UzMiBoYXNoWzRdOworCXN0cnVjdCBrZXlkYXRhICprZXlwdHIgPSBnZXRfa2V5cHRyKCk7CisKKwkvKgorCSAqICBQaWNrIGEgdW5pcXVlIHN0YXJ0aW5nIG9mZnNldCBmb3IgZWFjaCBUQ1AgY29ubmVjdGlvbiBlbmRwb2ludHMKKwkgKiAgKHNhZGRyLCBkYWRkciwgc3BvcnQsIGRwb3J0KS4KKwkgKiAgTm90ZSB0aGF0IHRoZSB3b3JkcyBhcmUgcGxhY2VkIGludG8gdGhlIHN0YXJ0aW5nIHZlY3Rvciwgd2hpY2ggaXMKKwkgKiAgdGhlbiBtaXhlZCB3aXRoIGEgcGFydGlhbCBNRDQgb3ZlciByYW5kb20gZGF0YS4KKwkgKi8KKwloYXNoWzBdPXNhZGRyOworCWhhc2hbMV09ZGFkZHI7CisJaGFzaFsyXT0oc3BvcnQgPDwgMTYpICsgZHBvcnQ7CisJaGFzaFszXT1rZXlwdHItPnNlY3JldFsxMV07CisKKwlzZXEgPSBoYWxmX21kNF90cmFuc2Zvcm0oaGFzaCwga2V5cHRyLT5zZWNyZXQpICYgSEFTSF9NQVNLOworCXNlcSArPSBrZXlwdHItPmNvdW50OworCS8qCisJICoJQXMgY2xvc2UgYXMgcG9zc2libGUgdG8gUkZDIDc5Mywgd2hpY2gKKwkgKglzdWdnZXN0cyB1c2luZyBhIDI1MCBrSHogY2xvY2suCisJICoJRnVydGhlciByZWFkaW5nIHNob3dzIHRoaXMgYXNzdW1lcyAyIE1iL3MgbmV0d29ya3MuCisJICoJRm9yIDEwIE1iL3MgRXRoZXJuZXQsIGEgMSBNSHogY2xvY2sgaXMgYXBwcm9wcmlhdGUuCisJICoJVGhhdCdzIGZ1bm55LCBMaW51eCBoYXMgb25lIGJ1aWx0IGluISAgVXNlIGl0IQorCSAqCShOZXR3b3JrcyBhcmUgZmFzdGVyIG5vdyAtIHNob3VsZCB0aGlzIGJlIGluY3JlYXNlZD8pCisJICovCisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJc2VxICs9IHR2LnR2X3VzZWMgKyB0di50dl9zZWMgKiAxMDAwMDAwOworI2lmIDAKKwlwcmludGsoImluaXRfc2VxKCVseCwgJWx4LCAlZCwgJWQpID0gJWRcbiIsCisJICAgICAgIHNhZGRyLCBkYWRkciwgc3BvcnQsIGRwb3J0LCBzZXEpOworI2VuZGlmCisJcmV0dXJuIHNlcTsKK30KKworRVhQT1JUX1NZTUJPTChzZWN1cmVfdGNwX3NlcXVlbmNlX251bWJlcik7CisKKworCisvKiBHZW5lcmF0ZSBzZWN1cmUgc3RhcnRpbmcgcG9pbnQgZm9yIGVwaGVtZXJhbCBUQ1AgcG9ydCBzZWFyY2ggKi8KK3UzMiBzZWN1cmVfdGNwX3BvcnRfZXBoZW1lcmFsKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwgX191MTYgZHBvcnQpCit7CisJc3RydWN0IGtleWRhdGEgKmtleXB0ciA9IGdldF9rZXlwdHIoKTsKKwl1MzIgaGFzaFs0XTsKKworCS8qCisJICogIFBpY2sgYSB1bmlxdWUgc3RhcnRpbmcgb2Zmc2V0IGZvciBlYWNoIGVwaGVtZXJhbCBwb3J0IHNlYXJjaAorCSAqICAoc2FkZHIsIGRhZGRyLCBkcG9ydCkgYW5kIDQ4Yml0cyBvZiByYW5kb20gZGF0YS4KKwkgKi8KKwloYXNoWzBdID0gc2FkZHI7CisJaGFzaFsxXSA9IGRhZGRyOworCWhhc2hbMl0gPSBkcG9ydCBeIGtleXB0ci0+c2VjcmV0WzEwXTsKKwloYXNoWzNdID0ga2V5cHRyLT5zZWNyZXRbMTFdOworCisJcmV0dXJuIGhhbGZfbWQ0X3RyYW5zZm9ybShoYXNoLCBrZXlwdHItPnNlY3JldCk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKK3UzMiBzZWN1cmVfdGNwdjZfcG9ydF9lcGhlbWVyYWwoY29uc3QgX191MzIgKnNhZGRyLCBjb25zdCBfX3UzMiAqZGFkZHIsIF9fdTE2IGRwb3J0KQoreworCXN0cnVjdCBrZXlkYXRhICprZXlwdHIgPSBnZXRfa2V5cHRyKCk7CisJdTMyIGhhc2hbMTJdOworCisJbWVtY3B5KGhhc2gsIHNhZGRyLCAxNik7CisJaGFzaFs0XSA9IGRwb3J0OworCW1lbWNweSgmaGFzaFs1XSxrZXlwdHItPnNlY3JldCxzaXplb2YoX191MzIpICogNyk7CisKKwlyZXR1cm4gdHdvdGhpcmRzTUQ0VHJhbnNmb3JtKGRhZGRyLCBoYXNoKTsKK30KK0VYUE9SVF9TWU1CT0woc2VjdXJlX3RjcHY2X3BvcnRfZXBoZW1lcmFsKTsKKyNlbmRpZgorCisjZW5kaWYgLyogQ09ORklHX0lORVQgKi8KKworCisvKgorICogR2V0IGEgcmFuZG9tIHdvcmQgZm9yIGludGVybmFsIGtlcm5lbCB1c2Ugb25seS4gU2ltaWxhciB0byB1cmFuZG9tIGJ1dAorICogd2l0aCB0aGUgZ29hbCBvZiBtaW5pbWFsIGVudHJvcHkgcG9vbCBkZXBsZXRpb24uIEFzIGEgcmVzdWx0LCB0aGUgcmFuZG9tCisgKiB2YWx1ZSBpcyBub3QgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIGJ1dCBmb3Igc2V2ZXJhbCB1c2VzIHRoZSBjb3N0IG9mCisgKiBkZXBsZXRpbmcgZW50cm9weSBpcyB0b28gaGlnaAorICovCit1bnNpZ25lZCBpbnQgZ2V0X3JhbmRvbV9pbnQodm9pZCkKK3sKKwkvKgorCSAqIFVzZSBJUCdzIFJORy4gSXQgc3VpdHMgb3VyIHB1cnBvc2UgcGVyZmVjdGx5OiBpdCByZS1rZXlzIGl0c2VsZgorCSAqIGV2ZXJ5IHNlY29uZCwgZnJvbSB0aGUgZW50cm9weSBwb29sIChhbmQgdGh1cyBjcmVhdGVzIGEgbGltaXRlZAorCSAqIGRyYWluIG9uIGl0KSwgYW5kIHVzZXMgaGFsZk1ENFRyYW5zZm9ybSB3aXRoaW4gdGhlIHNlY29uZC4gV2UKKwkgKiBhbHNvIG1peCBpdCB3aXRoIGppZmZpZXMgYW5kIHRoZSBQSUQ6CisJICovCisJcmV0dXJuIHNlY3VyZV9pcF9pZChjdXJyZW50LT5waWQgKyBqaWZmaWVzKTsKK30KKworLyoKKyAqIHJhbmRvbWl6ZV9yYW5nZSgpIHJldHVybnMgYSBzdGFydCBhZGRyZXNzIHN1Y2ggdGhhdAorICoKKyAqICAgIFsuLi4uLi4gPHJhbmdlPiAuLi4uLl0KKyAqICBzdGFydCAgICAgICAgICAgICAgICAgIGVuZAorICoKKyAqIGEgPHJhbmdlPiB3aXRoIHNpemUgImxlbiIgc3RhcnRpbmcgYXQgdGhlIHJldHVybiB2YWx1ZSBpcyBpbnNpZGUgaW4gdGhlCisgKiBhcmVhIGRlZmluZWQgYnkgW3N0YXJ0LCBlbmRdLCBidXQgaXMgb3RoZXJ3aXNlIHJhbmRvbWl6ZWQuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK3JhbmRvbWl6ZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJdW5zaWduZWQgbG9uZyByYW5nZSA9IGVuZCAtIGxlbiAtIHN0YXJ0OworCisJaWYgKGVuZCA8PSBzdGFydCArIGxlbikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIFBBR0VfQUxJR04oZ2V0X3JhbmRvbV9pbnQoKSAlIHJhbmdlICsgc3RhcnQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jhdy5jIGIvZHJpdmVycy9jaGFyL3Jhdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTMzZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmF3LmMKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2NoYXIvcmF3LmMKKyAqCisgKiBGcm9udC1lbmQgcmF3IGNoYXJhY3RlciBkZXZpY2VzLiAgVGhlc2UgY2FuIGJlIGJvdW5kIHRvIGFueSBibG9jaworICogZGV2aWNlcyB0byBwcm92aWRlIGdlbnVpbmUgVW5peCByYXcgY2hhcmFjdGVyIGRldmljZSBzZW1hbnRpY3MuCisgKgorICogV2UgcmVzZXJ2ZSBtaW5vciBudW1iZXIgMCBmb3IgYSBjb250cm9sIGludGVyZmFjZS4gIGlvY3RsKClzIG9uIHRoaXMKKyAqIGRldmljZSBhcmUgdXNlZCB0byBiaW5kIHRoZSBvdGhlciBtaW5vciBudW1iZXJzIHRvIGJsb2NrIGRldmljZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmF3Lmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0cnVjdCByYXdfZGV2aWNlX2RhdGEgeworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJpbmRpbmc7CisJaW50IGludXNlOworfTsKKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKnJhd19jbGFzczsKK3N0YXRpYyBzdHJ1Y3QgcmF3X2RldmljZV9kYXRhIHJhd19kZXZpY2VzW01BWF9SQVdfTUlOT1JTXTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHJhd19tdXRleCk7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYXdfY3RsX2ZvcHM7CSAgICAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworCisvKgorICogT3Blbi9jbG9zZSBjb2RlIGZvciByYXcgSU8uCisgKgorICogV2UganVzdCByZXdyaXRlIHRoZSBpX21hcHBpbmcgZm9yIHRoZSAvZGV2L3Jhdy9yYXdOIGZpbGUgZGVzY3JpcHRvciB0bworICogcG9pbnQgYXQgdGhlIGJsb2NrZGV2J3MgYWRkcmVzc19zcGFjZSBhbmQgc2V0IHRoZSBmaWxlIGhhbmRsZSB0byB1c2UKKyAqIE9fRElSRUNULgorICoKKyAqIFNldCB0aGUgZGV2aWNlJ3Mgc29mdCBibG9ja3NpemUgdG8gdGhlIG1pbmltdW0gcG9zc2libGUuICBUaGlzIGdpdmVzIHRoZQorICogZmluZXN0IHBvc3NpYmxlIGFsaWdubWVudCBhbmQgaGFzIG5vIGFkdmVyc2UgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLgorICovCitzdGF0aWMgaW50IHJhd19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWNvbnN0IGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlpbnQgZXJyOworCisJaWYgKG1pbm9yID09IDApIHsJLyogSXQgaXMgdGhlIGNvbnRyb2wgZGV2aWNlICovCisJCWZpbHAtPmZfb3AgPSAmcmF3X2N0bF9mb3BzOworCQlyZXR1cm4gMDsKKwl9CisKKwlkb3duKCZyYXdfbXV0ZXgpOworCisJLyoKKwkgKiBBbGwgd2UgbmVlZCB0byBkbyBvbiBvcGVuIGlzIGNoZWNrIHRoYXQgdGhlIGRldmljZSBpcyBib3VuZC4KKwkgKi8KKwliZGV2ID0gcmF3X2RldmljZXNbbWlub3JdLmJpbmRpbmc7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIWJkZXYpCisJCWdvdG8gb3V0OworCWlncmFiKGJkZXYtPmJkX2lub2RlKTsKKwllcnIgPSBibGtkZXZfZ2V0KGJkZXYsIGZpbHAtPmZfbW9kZSwgMCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gYmRfY2xhaW0oYmRldiwgcmF3X29wZW4pOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwllcnIgPSBzZXRfYmxvY2tzaXplKGJkZXYsIGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KSk7CisJaWYgKGVycikKKwkJZ290byBvdXQyOworCWZpbHAtPmZfZmxhZ3MgfD0gT19ESVJFQ1Q7CisJZmlscC0+Zl9tYXBwaW5nID0gYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZzsKKwlpZiAoKytyYXdfZGV2aWNlc1ttaW5vcl0uaW51c2UgPT0gMSkKKwkJZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyA9CisJCQliZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGJkZXY7CisJdXAoJnJhd19tdXRleCk7CisJcmV0dXJuIDA7CisKK291dDI6CisJYmRfcmVsZWFzZShiZGV2KTsKK291dDE6CisJYmxrZGV2X3B1dChiZGV2KTsKK291dDoKKwl1cCgmcmF3X211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogV2hlbiB0aGUgZmluYWwgZmQgd2hpY2ggcmVmZXJzIHRvIHRoaXMgY2hhcmFjdGVyLXNwZWNpYWwgbm9kZSBpcyBjbG9zZWQsIHdlCisgKiBtYWtlIGl0cyAtPm1hcHBpbmcgcG9pbnQgYmFjayBhdCBpdHMgb3duIGlfZGF0YS4KKyAqLworc3RhdGljIGludCByYXdfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwljb25zdCBpbnQgbWlub3I9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKworCWRvd24oJnJhd19tdXRleCk7CisJYmRldiA9IHJhd19kZXZpY2VzW21pbm9yXS5iaW5kaW5nOworCWlmICgtLXJhd19kZXZpY2VzW21pbm9yXS5pbnVzZSA9PSAwKSB7CisJCS8qIEhlcmUgIGlub2RlLT5pX21hcHBpbmcgPT0gYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZyAgKi8KKwkJaW5vZGUtPmlfbWFwcGluZyA9ICZpbm9kZS0+aV9kYXRhOworCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJmRlZmF1bHRfYmFja2luZ19kZXZfaW5mbzsKKwl9CisJdXAoJnJhd19tdXRleCk7CisKKwliZF9yZWxlYXNlKGJkZXYpOworCWJsa2Rldl9wdXQoYmRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGb3J3YXJkIGlvY3RscyB0byB0aGUgdW5kZXJseWluZyBibG9jayBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQKK3Jhd19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY29tbWFuZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiBpb2N0bF9ieV9iZGV2KGJkZXYsIGNvbW1hbmQsIGFyZyk7Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRfZGV2aWNlKHN0cnVjdCByYXdfY29uZmlnX3JlcXVlc3QgKnJxKQoreworCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFJBV19NQUpPUiwgcnEtPnJhd19taW5vcikpOworCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHJhd19jbGFzcywgTUtERVYoUkFXX01BSk9SLCBycS0+cmF3X21pbm9yKSwKKwkJCQkgICAgICBOVUxMLCAicmF3JWQiLCBycS0+cmF3X21pbm9yKTsKK30KKworLyoKKyAqIERlYWwgd2l0aCBpb2N0bHMgYWdhaW5zdCB0aGUgcmF3LWRldmljZSBjb250cm9sIGludGVyZmFjZSwgdG8gYmluZAorICogYW5kIHVuYmluZCBvdGhlciByYXcgZGV2aWNlcy4KKyAqLworc3RhdGljIGludCByYXdfY3RsX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJdW5zaWduZWQgaW50IGNvbW1hbmQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCByYXdfY29uZmlnX3JlcXVlc3QgcnE7CisJc3RydWN0IHJhd19kZXZpY2VfZGF0YSAqcmF3ZGV2OworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBSQVdfU0VUQklORDoKKwljYXNlIFJBV19HRVRCSU5EOgorCisJCS8qIEZpcnN0LCBmaW5kIG91dCB3aGljaCByYXcgbWlub3Igd2Ugd2FudCAqLworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmcnEsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihycSkpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAocnEucmF3X21pbm9yIDwgMCB8fCBycS5yYXdfbWlub3IgPj0gTUFYX1JBV19NSU5PUlMpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyYXdkZXYgPSAmcmF3X2RldmljZXNbcnEucmF3X21pbm9yXTsKKworCQlpZiAoY29tbWFuZCA9PSBSQVdfU0VUQklORCkgeworCQkJZGV2X3QgZGV2OworCisJCQkvKgorCQkJICogVGhpcyBpcyBsaWtlIG1ha2luZyBibG9jayBkZXZpY2VzLCBzbyBkZW1hbmQgdGhlCisJCQkgKiBzYW1lIGNhcGFiaWxpdHkKKwkJCSAqLworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCQkJZXJyID0gLUVQRVJNOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQkvKgorCQkJICogRm9yIG5vdywgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGF0IHRoZSB1bmRlcmx5aW5nCisJCQkgKiBibG9jayBkZXZpY2UgaXMgcHJlc2VudCBvciBub3Q6IHdlIGNhbiBkbyB0aGF0IHdoZW4KKwkJCSAqIHRoZSByYXcgZGV2aWNlIGlzIG9wZW5lZC4gIEp1c3QgY2hlY2sgdGhhdCB0aGUKKwkJCSAqIG1ham9yL21pbm9yIG51bWJlcnMgbWFrZSBzZW5zZS4KKwkJCSAqLworCisJCQlkZXYgPSBNS0RFVihycS5ibG9ja19tYWpvciwgcnEuYmxvY2tfbWlub3IpOworCQkJaWYgKChycS5ibG9ja19tYWpvciA9PSAwICYmIHJxLmJsb2NrX21pbm9yICE9IDApIHx8CisJCQkJCU1BSk9SKGRldikgIT0gcnEuYmxvY2tfbWFqb3IgfHwKKwkJCQkJTUlOT1IoZGV2KSAhPSBycS5ibG9ja19taW5vcikgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWRvd24oJnJhd19tdXRleCk7CisJCQlpZiAocmF3ZGV2LT5pbnVzZSkgeworCQkJCXVwKCZyYXdfbXV0ZXgpOworCQkJCWVyciA9IC1FQlVTWTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChyYXdkZXYtPmJpbmRpbmcpIHsKKwkJCQliZHB1dChyYXdkZXYtPmJpbmRpbmcpOworCQkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQkJfQorCQkJaWYgKHJxLmJsb2NrX21ham9yID09IDAgJiYgcnEuYmxvY2tfbWlub3IgPT0gMCkgeworCQkJCS8qIHVuYmluZCAqLworCQkJCXJhd2Rldi0+YmluZGluZyA9IE5VTEw7CisJCQkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoUkFXX01BSk9SLAorCQkJCQkJCQlycS5yYXdfbWlub3IpKTsKKwkJCX0gZWxzZSB7CisJCQkJcmF3ZGV2LT5iaW5kaW5nID0gYmRnZXQoZGV2KTsKKwkJCQlpZiAocmF3ZGV2LT5iaW5kaW5nID09IE5VTEwpCisJCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZWxzZSB7CisJCQkJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJCQkJCWJpbmRfZGV2aWNlKCZycSk7CisJCQkJfQorCQkJfQorCQkJdXAoJnJhd19tdXRleCk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCisJCQlkb3duKCZyYXdfbXV0ZXgpOworCQkJYmRldiA9IHJhd2Rldi0+YmluZGluZzsKKwkJCWlmIChiZGV2KSB7CisJCQkJcnEuYmxvY2tfbWFqb3IgPSBNQUpPUihiZGV2LT5iZF9kZXYpOworCQkJCXJxLmJsb2NrX21pbm9yID0gTUlOT1IoYmRldi0+YmRfZGV2KTsKKwkJCX0gZWxzZSB7CisJCQkJcnEuYmxvY2tfbWFqb3IgPSBycS5ibG9ja19taW5vciA9IDA7CisJCQl9CisJCQl1cCgmcmF3X211dGV4KTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcnEsIHNpemVvZihycSkpKSB7CisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHNzaXplX3QgcmF3X2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlvdmVjIGxvY2FsX2lvdiA9IHsKKwkJLmlvdl9iYXNlID0gKGNoYXIgX191c2VyICopYnVmLAorCQkuaW92X2xlbiA9IGNvdW50CisJfTsKKworCXJldHVybiBnZW5lcmljX2ZpbGVfd3JpdGVfbm9sb2NrKGZpbGUsICZsb2NhbF9pb3YsIDEsIHBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdCByYXdfZmlsZV9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGlvdmVjIGxvY2FsX2lvdiA9IHsKKwkJLmlvdl9iYXNlID0gKGNoYXIgX191c2VyICopYnVmLAorCQkuaW92X2xlbiA9IGNvdW50CisJfTsKKworCXJldHVybiBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlX25vbG9jayhpb2NiLCAmbG9jYWxfaW92LCAxLCAmaW9jYi0+a2lfcG9zKTsKK30KKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYXdfZm9wcyA9IHsKKwkucmVhZAk9CWdlbmVyaWNfZmlsZV9yZWFkLAorCS5haW9fcmVhZCA9IAlnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCisJLndyaXRlCT0JcmF3X2ZpbGVfd3JpdGUsCisJLmFpb193cml0ZSA9IAlyYXdfZmlsZV9haW9fd3JpdGUsCisJLm9wZW4JPQlyYXdfb3BlbiwKKwkucmVsZWFzZT0JcmF3X3JlbGVhc2UsCisJLmlvY3RsCT0JcmF3X2lvY3RsLAorCS5yZWFkdgk9IAlnZW5lcmljX2ZpbGVfcmVhZHYsCisJLndyaXRldgk9IAlnZW5lcmljX2ZpbGVfd3JpdGV2LAorCS5vd25lcgk9CVRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmF3X2N0bF9mb3BzID0geworCS5pb2N0bAk9CXJhd19jdGxfaW9jdGwsCisJLm9wZW4JPQlyYXdfb3BlbiwKKwkub3duZXIJPQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2RldiByYXdfY2RldiA9IHsKKwkua29iagk9CXsubmFtZSA9ICJyYXciLCB9LAorCS5vd25lcgk9CVRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcmF3X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlkZXZfdCBkZXYgPSBNS0RFVihSQVdfTUFKT1IsIDApOworCisJaWYgKHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBNQVhfUkFXX01JTk9SUywgInJhdyIpKQorCQlnb3RvIGVycm9yOworCisJY2Rldl9pbml0KCZyYXdfY2RldiwgJnJhd19mb3BzKTsKKwlpZiAoY2Rldl9hZGQoJnJhd19jZGV2LCBkZXYsIE1BWF9SQVdfTUlOT1JTKSkgeworCQlrb2JqZWN0X3B1dCgmcmF3X2NkZXYua29iaik7CisJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXYsIE1BWF9SQVdfTUlOT1JTKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyYXdfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAicmF3Iik7CisJaWYgKElTX0VSUihyYXdfY2xhc3MpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgY3JlYXRpbmcgcmF3IGNsYXNzLlxuIik7CisJCWNkZXZfZGVsKCZyYXdfY2Rldik7CisJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXYsIE1BWF9SQVdfTUlOT1JTKTsKKwkJZ290byBlcnJvcjsKKwl9CisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQocmF3X2NsYXNzLCBNS0RFVihSQVdfTUFKT1IsIDApLCBOVUxMLCAicmF3Y3RsIik7CisKKwlkZXZmc19ta19jZGV2KE1LREVWKFJBV19NQUpPUiwgMCksCisJCSAgICAgIFNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VHTywKKwkJICAgICAgInJhdy9yYXdjdGwiKTsKKwlmb3IgKGkgPSAxOyBpIDwgTUFYX1JBV19NSU5PUlM7IGkrKykKKwkJZGV2ZnNfbWtfY2RldihNS0RFVihSQVdfTUFKT1IsIGkpLAorCQkJICAgICAgU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLAorCQkJICAgICAgInJhdy9yYXclZCIsIGkpOworCXJldHVybiAwOworCitlcnJvcjoKKwlwcmludGsoS0VSTl9FUlIgImVycm9yIHJlZ2lzdGVyIHJhdyBkZXZpY2VcbiIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcmF3X2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBNQVhfUkFXX01JTk9SUzsgaSsrKQorCQlkZXZmc19yZW1vdmUoInJhdy9yYXclZCIsIGkpOworCWRldmZzX3JlbW92ZSgicmF3L3Jhd2N0bCIpOworCWRldmZzX3JlbW92ZSgicmF3Iik7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoUkFXX01BSk9SLCAwKSk7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kocmF3X2NsYXNzKTsKKwljZGV2X2RlbCgmcmF3X2NkZXYpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihSQVdfTUFKT1IsIDApLCBNQVhfUkFXX01JTk9SUyk7Cit9CisKK21vZHVsZV9pbml0KHJhd19pbml0KTsKK21vZHVsZV9leGl0KHJhd19leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvcmlvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZTJiZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCByaW8tc3Vic3lzdGVtLgorIworIyAoQykgUi5FLldvbGZmQEJpdFdpemFyZC5ubCAKKyMgCisjIFRoaXMgZmlsZSBpcyBHUEwuIFNlZSBvdGhlciBmaWxlcyBmb3IgdGhlIGZ1bGwgQmx1cmIuIEknbSBsYXp5IHRvZGF5LiAKKyMKKworb2JqLSQoQ09ORklHX1JJTykgKz0gcmlvLm8KKworcmlvLW9ianMgOj0gcmlvX2xpbnV4Lm8gcmlvaW5pdC5vIHJpb2Jvb3QubyByaW9jbWQubyByaW9jdHJsLm8gcmlvaW50ci5vIFwKKyAgICAgICAgICAgIHJpb3BhcmFtLm8gcmlvcGNpY29weS5vIHJpb3JvdXRlLm8gcmlvdGFibGUubyByaW90dHkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9ib2FyZC5oIGIvZHJpdmVycy9jaGFyL3Jpby9ib2FyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzk3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2JvYXJkLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLiAKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBib2FyZC5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDowNworKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMAorKioKKyoqICBpZGVudCBAKCMpYm9hcmQuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZglfX3Jpb19ib2FyZF9oX18KKyNkZWZpbmUJX19yaW9fYm9hcmRfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9ib2FyZF9oX3NjY3NfID0gIkAoIylib2FyZC5oCTEuMiI7CisjZW5kaWYKKworLyoKKyoqIGJvYXJkLmggY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgKmhhcmR3YXJlKiBvZiB0aGUgaG9zdCBjYXJkcy4KKyoqIEl0IGRlc2NyaWJlcyB0aGUgbWVtb3J5IG92ZXJsYXkgZm9yIHRoZSBkdWFsIHBvcnQgUkFNIGFyZWEuCisqLworCisjZGVmaW5lCURQX1NSQU0xX1NJWkUJMHg3QzAwCisjZGVmaW5lCURQX1NSQU0yX1NJWkUJMHgwMjAwCisjZGVmaW5lCURQX1NSQU0zX1NJWkUJMHg3MDAwCisjZGVmaW5lCURQX1NDUkFUQ0hfU0laRQkweDEwMDAKKyNkZWZpbmUJRFBfUEFSTU1BUF9BRERSCTB4MDFGRQkvKiBvZmZzZXQgaW50byBTUkFNMiAqLworI2RlZmluZQlEUF9TVEFSVFVQX0FERFIJMHgwMUY4CS8qIG9mZnNldCBpbnRvIFNSQU0yICovCisKKy8qCisqKglUaGUgc2hhcGUgb2YgdGhlIEhvc3QgQ29udHJvbCBhcmVhLCBhdCBvZmZzZXQgMHg3QzAwLCBXcml0ZSBPbmx5CisqLworc3RydWN0IHNfQ3RybAoreworCUJZVEUJRHBDdGw7CQkJCS8qIDdDMDAgKi8KKwlCWVRFCURwX1VudXNlZDJfWzEyN107CisJQllURQlEcEludFNldDsJCQkvKiA3QzgwICovCisJQllURQlEcF9VbnVzZWQzX1sxMjddOworCUJZVEUJRHBUcHVSZXNldDsJCQkvKiA3RDAwICovCisJQllURQlEcF9VbnVzZWQ0X1sxMjddOworCUJZVEUJRHBJbnRSZXNldDsJCQkvKiA3RDgwICovCisJQllURQlEcF9VbnVzZWQ1X1sxMjddOworfTsKKworLyoKKyoqIFRoZSBQUk9NIGRhdGEgYXJlYSBvbiB0aGUgaG9zdCAoMHg3QzAwKSwgUmVhZCBPbmx5CisqLworc3RydWN0IHNfUHJvbQoreworCVdPUkQJRHBTbHhDb2RlWzJdOworCVdPUkQJRHBSZXY7CisJV09SRAlEcF9VbnVzZWQ2XzsKKwlXT1JECURwVW5pcVs0XTsKKwlXT1JECURwSmFocmU7CisJV09SRAlEcFdvY2hlOworCVdPUkQJRHBId0ZlYXR1cmVbNV07CisJV09SRAlEcE9lbUlkOworCVdPUkQJRHBTaWdneVsxNl07Cit9OworCisvKgorKiogVW5pb24gb2YgdGhlIEN0cmwgYW5kIFByb20gYXJlYXMKKyovCit1bmlvbiB1X0N0cmxQcm9tCS8qIFRoaXMgaXMgdGhlIGNvbnRyb2wvUFJPTSBhcmVhICgweDdDMDApICovCit7CisJc3RydWN0IHNfQ3RybAlEcEN0cmw7CisJc3RydWN0IHNfUHJvbQlEcFByb207Cit9OworCisvKgorKiogVGhlIHRvcCBlbmQgb2YgbWVtb3J5IQorKi8KK3N0cnVjdCBzX1Bhcm1NYXBTCQkvKiBBcmVhIGNvbnRhaW5pbmcgUGFybSBNYXAgUG9pbnRlciAqLworeworCUJZVEUJRHBfVW51c2VkOF9bRFBfUEFSTU1BUF9BRERSXTsKKwlXT1JECURwUGFybU1hcEFkOworfTsKKworc3RydWN0IHNfU3RhcnRVcFMKK3sKKwlCWVRFICAgIERwX1VudXNlZDlfW0RQX1NUQVJUVVBfQUREUl07CisJQllURQlEcF9Mb25nSnVtcFsweDRdOworCUJZVEUJRHBfVW51c2VkMTBfWzJdOworCUJZVEUJRHBfU2hvcnRKdW1wWzB4Ml07Cit9OworCit1bmlvbiB1X1NyYW0yUGFybU1hcAkvKiBUaGlzIGlzIHRoZSB0b3Agb2YgbWVtb3J5ICgweDdFMDAtMHg3RkZGKSAqLworeworCUJZVEUJRHBTcmFtTWVtW0RQX1NSQU0yX1NJWkVdOworCXN0cnVjdCBzX1Bhcm1NYXBTIERwUGFybU1hcFM7CisJc3RydWN0IHNfU3RhcnRVcFMgRHBTdGFydFVwUzsKK307CisKKy8qCisqKglUaGlzIGlzIHRoZSBEUCBSQU0gb3ZlcmxheS4KKyovCitzdHJ1Y3QgRHBSYW0KK3sKKyAgICBCWVRFIAkJIERwU3JhbTFbRFBfU1JBTTFfU0laRV07ICAgICAvKiAwMDAwIC0gN0JGRiAqLworICAgIHVuaW9uIHVfQ3RybFByb20gICAgIERwQ3RybFByb207ICAgICAgICAgICAgICAgICAvKiA3QzAwIC0gN0RGRiAqLworICAgIHVuaW9uIHVfU3JhbTJQYXJtTWFwIERwU3JhbTJQYXJtTWFwOyAgICAgICAgICAgICAvKiA3RTAwIC0gN0ZGRiAqLworICAgIEJZVEUJCSBEcFNjcmF0Y2hbRFBfU0NSQVRDSF9TSVpFXTsgLyogODAwMCAtIDhGRkYgKi8KKyAgICBCWVRFCQkgRHBTcmFtM1tEUF9TUkFNM19TSVpFXTsgICAgIC8qIDkwMDAgLSBGRkZGICovCit9OworCisjZGVmaW5lCURwQ29udHJvbAlEcEN0cmxQcm9tLkRwQ3RybC5EcEN0bAorI2RlZmluZQlEcFNldEludAlEcEN0cmxQcm9tLkRwQ3RybC5EcEludFNldAorI2RlZmluZQlEcFJlc2V0VHB1CURwQ3RybFByb20uRHBDdHJsLkRwVHB1UmVzZXQKKyNkZWZpbmUJRHBSZXNldEludAlEcEN0cmxQcm9tLkRwQ3RybC5EcEludFJlc2V0CisKKyNkZWZpbmUJRHBTbHgJCURwQ3RybFByb20uRHBQcm9tLkRwU2x4Q29kZQorI2RlZmluZQlEcFJldmlzaW9uCURwQ3RybFByb20uRHBQcm9tLkRwUmV2CisjZGVmaW5lCURwVW5pcXVlCURwQ3RybFByb20uRHBQcm9tLkRwVW5pcQorI2RlZmluZQlEcFllYXIJCURwQ3RybFByb20uRHBQcm9tLkRwSmFocmUKKyNkZWZpbmUJRHBXZWVrCQlEcEN0cmxQcm9tLkRwUHJvbS5EcFdvY2hlCisjZGVmaW5lCURwU2lnbmF0dXJlCURwQ3RybFByb20uRHBQcm9tLkRwU2lnZ3kKKworI2RlZmluZQlEcFBhcm1NYXBSCURwU3JhbTJQYXJtTWFwLkRwUGFybU1hcFMuRHBQYXJtTWFwQWQKKyNkZWZpbmUJRHBTcmFtMgkJRHBTcmFtMlBhcm1NYXAuRHBTcmFtTWVtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9ib290cGt0LmggYi9kcml2ZXJzL2NoYXIvcmlvL2Jvb3Rwa3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzI5YWViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9ib290cGt0LmgKQEAgLTAsMCArMSw2MiBAQAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgIEIgTyBPIFQgICAgUCBBIEMgSyBFIFQgICBIIEUgQSBEIEUgUiAgIEYgSSBMIEUKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3BrdF9oCisjZGVmaW5lIF9wa3RfaCAxCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1MKK3N0YXRpYyBjaGFyICpfcmlvX2Jvb3Rwa3RfaF9zY2NzID0gIkAoIylib290cGt0LmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBPdmVybGF5ZWQgb250byB0aGUgRGF0YSBmaWVsZHMgb2YgYSByZWd1bGFyCisgICAgICogUGFja2V0CisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IEJPT1RfUEtUIEJPT1RfUEtUIDsKK3N0cnVjdCBCT09UX1BLVCB7CisgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgICBzZXFfbnVtIDsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgIGRhdGFbMTBdIDsKKyAgICAgICAgICAgICAgICB9IDsKKworCisjZW5kaWYKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2JyYXRlcy5oIGIvZHJpdmVycy9jaGFyL3Jpby9icmF0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDRmYzg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9icmF0ZXMuaApAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKgkJQlJBVEVTLkgJCQkJICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6IDEgTm92IDE5OTAKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfYnJhdGVzX2gKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKiBfYnJhdGVzX2hfc2NjcyA9ICJAKCMpYnJhdGVzLmgJMS40IjsgKi8KKyNlbmRpZgorI2RlZmluZSBfYnJhdGVzX2ggMQorLyogTGlzdCBvZiBiYXVkIHJhdGUgZGVmaW5lcy4gTW9zdCBhcmUgYm9ycm93ZWQgZnJvbSAvdXNyL2luY2x1ZGUvc3lzL3Rlcm1pby5oCisqLworI2lmbmRlZiBJTktFUk5FTAorCisjZGVmaW5lCUIwCTB4MDAKKyNkZWZpbmUJQjUwCTB4MDEKKyNkZWZpbmUJQjc1CTB4MDIKKyNkZWZpbmUJQjExMAkweDAzCisjZGVmaW5lCUIxMzQJMHgwNAorI2RlZmluZQlCMTUwCTB4MDUKKyNkZWZpbmUJQjIwMAkweDA2CisjZGVmaW5lCUIzMDAJMHgwNworI2RlZmluZQlCNjAwCTB4MDgKKyNkZWZpbmUJQjEyMDAJMHgwOQorI2RlZmluZQlCMTgwMAkweDBhCisjZGVmaW5lCUIyNDAwCTB4MGIKKyNkZWZpbmUJQjQ4MDAJMHgwYworI2RlZmluZQlCOTYwMAkweDBkCisjZGVmaW5lCUIxOTIwMAkweDBlCisjZGVmaW5lCUIzODQwMAkweDBmCisKKyNlbmRpZgorCisvKgorKiogVGhlIGZvbGxvd2luZyBiYXVkcmF0ZXMgbWF5IG9yIG1heSBub3QgYmUgZGVmaW5lZAorKiogb24gdmFyaW91cyBVTklYIHN5c3RlbXMuCisqKiBJZiB0aGV5IGFyZSBub3QgdGhlbiB3ZSBkZWZpbmUgdGhlbS4KKyoqIElmIHRoZXkgYXJlIHRoZW4gd2UgZG8gbm90IGRlZmluZSB0aGVtIDstKQorKioKKyoqIFRoaXMgaXMgYXBwYWxsaW5nIHRoYXQgd2UgdXNlIHNhbWUgZGVmaW5pdGlvbnMgYXMgVU5JWAorKiogZm9yIG91ciBvd24gZG93bmxvYWQgY29kZSBhcyB0aGVyZSBpcyBubyBnYXJ1bnRlZSB0aGF0CisqKiBCNTc2MDAgd2lsbCBiZSBkZWZpbmVkIGFzIDB4MTEgYnkgYSBVTklYIHN5c3RlbS4uLi4KKyoqIEFyZ2hoaGhoISEhISEhISEhISEhISEKKyovCisjaWYgIWRlZmluZWQoQjU2MDAwKQorI2RlZmluZQlCNTYwMDAJMHgxMAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChCNTc2MDApCisjZGVmaW5lCUI1NzYwMAkweDExCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEI2NDAwMCkKKyNkZWZpbmUJQjY0MDAwCTB4MTIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQjExNTIwMCkKKyNkZWZpbmUJQjExNTIwMAkweDEzCisjZW5kaWYKKworCisjaWYgIWRlZmluZWQoQjIwMDApCisjZGVmaW5lIEIyMDAwCTB4MTQKKyNlbmRpZgorCisKKyNkZWZpbmUgTUFYX1JBVEUgQjIwMDAKKworc3RydWN0ICAgIGJhdWRfcmF0ZSAgICAgICAgICAgIC8qIFRhZyBmb3IgYmF1ZCByYXRlcyAqLworeworICAgICAvKiBzaG9ydCAgICBob3N0X3JhdGUsKi8gICAgICAgIC8qIEFzIHBhc3NlZCBieSB0aGUgZHJpdmVyICovCisgICAgIHNob3J0ICAgIGRpdmlzb3IsICAgICAgICAgIC8qIFRoZSBkaXZpc29yICovCisgICAgICAgICAgICAgIHByZXNjYWxlcjsgICAgICAgIC8qIFRoZSBwcmUtc2NhbGVyICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vY2hhbi5oIGIvZHJpdmVycy9jaGFyL3Jpby9jaGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzMDY1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vY2hhbi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisjaWZuZGVmIF9jaGFuX2gKKyNkZWZpbmUgX2NoYW5faAorCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTCitzdGF0aWMgY2hhciAqX3Jpb19jaGFuX2hfc2NjcyA9ICJAKCMpY2hhbi5oCTEuMSIgOworI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBMaW5rMCAgIDAKKyNkZWZpbmUgTGluazEgICAxCisjZGVmaW5lIExpbmsyICAgMgorI2RlZmluZSBMaW5rMyAgIDMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2NpcnJ1cy5oIGIvZHJpdmVycy9jaGFyL3Jpby9jaXJydXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjA1NmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9jaXJydXMuaApAQCAtMCwwICsxLDQ2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKgkJQ0lSUlVTLkgJCQkJICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6IDMgQXVnIDE5OTAKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfY2lycnVzX2gKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIqIF9jaXJydXNfaF9zY2NzID0gIkAoIyljaXJydXMuaAkxLjE2IjsgKi8KKyNlbmRpZgorI2RlZmluZSBfY2lycnVzX2ggMQorCisjaWZkZWYgUlRBCisjZGVmaW5lCVRPX1VBUlQJUlgKKyNkZWZpbmUgVE9fRFJJVkVSIFRYCisjZW5kaWYKKworI2lmZGVmIEhPU1QKKyNkZWZpbmUJVE9fVUFSVAlUWAorI2RlZmluZSBUT19EUklWRVIgUlgKKyNlbmRpZgorI2lmZGVmIFJUQQorLyogTWlzY2VsbGFuZW91cyBkZWZpbmVzIGZvciBDSVJSVVMgYWRkcmVzc2VzIGFuZCByZWxhdGVkIGxvZ2ljIGZvcgorICAgaW50ZXJydXB0cyBldGMuCisqLworI2RlZmluZQlNQVAoYSkJCSgoc2hvcnQgKikoY2lycnVzX2Jhc2UgKyAoYSkpKQorI2RlZmluZSBvdXRwKGEsYikJKCpNQVAgKGEpID0oYikpCisjZGVmaW5lIGlucChhKQkJKCgqTUFQIChhKSkgJiAweGZmKQorI2RlZmluZQlDSVJSVVNfRklSU1QJKHNob3J0KikweDczMDAKKyNkZWZpbmUJQ0lSUlVTX1NFQ09ORAkoc2hvcnQqKTB4NzIwMAorI2RlZmluZQlDSVJSVVNfVEhJUkQJKHNob3J0KikweDcxMDAKKyNkZWZpbmUJQ0lSUlVTX0ZPVVJUSAkoc2hvcnQqKTB4NzAwMAorI2RlZmluZQlQT1JUU19PTl9DSVJSVVMJNAorI2RlZmluZQlDSVJSVVNfRklGT19TSVpFCTEyCisjZGVmaW5lCVNQQUNFCQkweDIwCisjZGVmaW5lCVRBQgkJMHgwOQorI2RlZmluZQlMSU5FX0ZFRUQJMHgwYQorI2RlZmluZQlDQVJSSUFHRV9SRVRVUk4JMHgwZAorI2RlZmluZQlCQUNLU1BBQ0UJMHgwOAorI2RlZmluZQlTUEFDRVNfSU5fVEFCUwk4CisjZGVmaW5lCVNFTkRfRVNDQVBFCTB4MDAKKyNkZWZpbmUgU1RBUlRfQlJFQUsJMHg4MQorI2RlZmluZQlUSU1FUl9USUNLCTB4ODIKKyNkZWZpbmUgU1RPUF9CUkVBSwkweDgzCisjZGVmaW5lIEJBU0UoYSkgKChhKSA8IDQgPyAoc2hvcnQqKUNJUlJVU19GSVJTVCA6ICgoYSkgPCA4ID8gKHNob3J0ICopQ0lSUlVTX1NFQ09ORCA6ICgoYSkgPCAxMiA/IChzaG9ydCopQ0lSUlVTX1RISVJEIDogKHNob3J0ICopQ0lSUlVTX0ZPVVJUSCkpKQorI2RlZmluZSB0eGFjazEJKChzaG9ydCAqKTB4NzEwNCkgCisjZGVmaW5lIHJ4YWNrMQkoKHNob3J0ICopMHg3MTAyKSAKKyNkZWZpbmUgbWRhY2sxICAoKHNob3J0ICopMHg3MTA2KQorI2RlZmluZSB0eGFjazIgICgoc2hvcnQgKikweDcwMDYpIAorI2RlZmluZSByeGFjazIJKChzaG9ydCAqKTB4NzAwNCkgCisjZGVmaW5lIG1kYWNrMiAgKChzaG9ydCAqKTB4NzEwMCkgCisjZGVmaW5lIGludF9sYXRjaCAgICAgICAoKHNob3J0ICopIDB4NzgwMCkKKyNkZWZpbmUgaW50X3N0YXR1cyAgICAgICgoc2hvcnQgKikgMHg3YzAwKSAKKyNkZWZpbmUgdHgxX3BlbmRpbmcgICAgIDB4MjAgCisjZGVmaW5lIHJ4MV9wZW5kaW5nICAgICAweDEwIAorI2RlZmluZSBtZDFfcGVuZGluZyAgICAgMHg0MCAKKyNkZWZpbmUgdHgyX3BlbmRpbmcgICAgIDB4MDIgCisjZGVmaW5lIHJ4Ml9wZW5kaW5nICAgICAweDAxIAorI2RlZmluZSBtZDJfcGVuZGluZyAgICAgMHg0MCAKKyNkZWZpbmUgbW9kdWxlMV9iaXRzCTB4MDcKKyNkZWZpbmUgbW9kdWxlMV9tb2Rlcm4JMHgwOAorI2RlZmluZSBtb2R1bGUyX2JpdHMJMHg3MAorI2RlZmluZSBtb2R1bGUyX21vZGVybgkweDgwCisjZGVmaW5lIG1vZHVsZV9ibGFuawkweGYKKyNkZWZpbmUgcnMyMzJfZDI1CTB4MAorI2RlZmluZQlyczIzMl9yajQ1CTB4MQorI2RlZmluZSByczQyMl9kMjUJMHgzCisjZGVmaW5lIHBhcmFsbGVsCTB4NQorCisjZGVmaW5lCUNMSzAJMHgwMAorI2RlZmluZSBDTEsxCTB4MDEKKyNkZWZpbmUgQ0xLMgkweDAyCisjZGVmaW5lIENMSzMJMHgwMworI2RlZmluZSBDTEs0CTB4MDQKKworI2RlZmluZSBDSVJSVVNfUkVWQyAgICAweDQyCisjZGVmaW5lIENJUlJVU19SRVZFICAgIDB4NDQKKworI2RlZmluZQlUVVJOT04JMQorI2RlZmluZSBUVVJOT0ZGIDAKKworLyogVGhlIGxpc3Qgb2YgQ0lSUlVTIHJlZ2lzdGVycy4gCisgICBOQi4gVGhlc2UgcmVnaXN0ZXJzIGFyZSByZWxhdGl2ZSB2YWx1ZXMgb24gOCBiaXQgYm91bmRhcmllcyB3aGVyZWFzCisgICBvbiB0aGUgUlRBJ3MgdGhlIENJUlJVUyByZWdpc3RlcnMgYXJlIG9uIHdvcmQgYm91bmRhcmllcy4gVXNlIHBvaW50ZXIKKyAgIGFyaXRobWV0aWMgKHNob3J0ICopIHRvIG9idGFpbiB0aGUgcmVhbCBhZGRyZXNzZXMgcmVxdWlyZWQgKi8KKyNkZWZpbmUgY2NyCTB4MDUJLyogQ2hhbm5lbCBDb21tYW5kIFJlZ2lzdGVyICAgICAqLworI2RlZmluZSBpZXIJMHgwNgkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICAgICovCisjZGVmaW5lIGNvcjEJMHgwOAkvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAxICAgICovCisjZGVmaW5lIGNvcjIJMHgwOQkvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAyICAgICovCisjZGVmaW5lIGNvcjMJMHgwYQkvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAzICAgICovCisjZGVmaW5lIGNvcjQJMHgxZQkvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciA0ICAgICovCisjZGVmaW5lCWNvcjUJMHgxZgkvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciA1CSovCisKKyNkZWZpbmUgY2NzcgkweDBiCS8qIENoYW5uZWwgQ29udHJvbCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgcmRjcgkweDBlCS8qIFJlY2VpdmUgRGF0YSBDb3VudCBSZWdpc3RlciAgKi8KKyNkZWZpbmUgdGRjcgkweDEyCS8qIFRyYW5zbWl0IERhdGEgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgbWNvcjEJMHgxNQkvKiBNb2RlbSBDaGFuZ2UgT3B0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgbWNvcjIJMHgxNgkvKiBNb2RlbSBDaGFuZ2UgT3B0aW9uIFJlZ3NpdGVyIDIgKi8KKworI2RlZmluZSBsaXZyCTB4MTgJLyogTG9jYWwgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAqLworI2RlZmluZSBzY2hyMQkweDFhCS8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgc2NocjIJMHgxYgkvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciAyICovCisjZGVmaW5lIHNjaHIzCTB4MWMJLyogU3BlY2lhbCBDaGFyYWN0ZXIgUmVnaXN0ZXIgMyAqLworI2RlZmluZSBzY2hyNAkweDFkCS8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDQgKi8KKworI2RlZmluZSBydHIJMHgyMCAgICAvKiBSZWNlaXZlIFRpbWVyIFJlZ2lzdGVyICovCisjZGVmaW5lIHJ0cHIJMHgyMQkvKiBSZWNlaXZlIFRpbWVvdXQgUGVyaW9kIFJlZ2lzdGVyICovCisjZGVmaW5lIGxuYwkweDI0CS8qIExuZXh0IGNoYXJhY3RlciAqLworCisjZGVmaW5lIHJpdnIJMHg0MwkvKiBSZWNlaXZlIEludGVycnVwdCBWZWN0b3IgUmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgdGl2cgkweDQyCS8qIFRyYW5zbWl0IEludGVycnVwdCBWZWN0b3IgUmVnaXN0ZXIgICAqLworI2RlZmluZSBtaXZyCTB4NDEJLyogTW9kZW0gSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAgICAgICovCisjZGVmaW5lIGdmcmNyCTB4NDAJLyogR2xvYmFsIEZpcm13YXJlIFJldmlzaW9uIGNvZGUgUmVnICAgICovCisjZGVmaW5lIHJpY3IJMHg0NAkvKiBSZWNlaXZlIEludGVycnVwdGluZyBDaGFubmVsIFJlZyAgICAgKi8KKyNkZWZpbmUgdGljcgkweDQ1CS8qIFRyYW5zbWl0IEludGVycnVwdGluZyBDaGFubmVsIFJlZyAgICAqLworI2RlZmluZSBtaWNyCTB4NDYJLyogTW9kZW0gSW50ZXJydXB0aW5nIENoYW5uZWwgUmVnaXN0ZXIgICovCisKKyNkZWZpbmUgZ2NyCTB4NGIJLyogR2xvYmFsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIqLworI2RlZmluZSBtaXNyICAgIDB4NGMgICAgLyogTW9kZW0gaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworCisjZGVmaW5lIHJidXNyCTB4NTkKKyNkZWZpbmUgdGJ1c3IJMHg1YQorI2RlZmluZSBtYnVzcgkweDViCisKKyNkZWZpbmUgZW9pcgkweDYwCS8qIEVuZCBPZiBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgcmRzcgkweDYyCS8qIFJlY2VpdmUgRGF0YSAvIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSB0ZHIJMHg2MwkvKiBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIHN2cnIJMHg2NwkvKiBTZXJ2aWNlIFJlcXVlc3QgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBjYXIJMHg2OAkvKiBDaGFubmVsIEFjY2VzcyBSZWdpc3RlciAqLworI2RlZmluZSBtaXIJMHg2OQkvKiBNb2RlbSBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgdGlyCTB4NmEJLyogVHJhbnNtaXQgSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lIHJpcgkweDZiCS8qIFJlY2VpdmUgSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lIG1zdnIxCTB4NmMJLyogTW9kZW0gU2lnbmFsIFZhbHVlIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgbXN2cjIJMHg2ZAkvKiBNb2RlbSBTaWduYWwgVmFsdWUgUmVnaXN0ZXIgMiovCisjZGVmaW5lIHBzdnIJMHg2ZgkvKiBQcmludGVyIFNpZ25hbCBWYWx1ZSBSZWdpc3RlciovCisKKyNkZWZpbmUgdGJwcgkweDcyCS8qIFRyYW5zbWl0IEJhdWQgUmF0ZSBQZXJpb2QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgdGNvcgkweDc2CS8qIFRyYW5zbWl0IENsb2NrIE9wdGlvbiBSZWdpc3RlciAqLworCisjZGVmaW5lIHJicHIJMHg3OAkvKiBSZWNlaXZlIEJhdWQgUmF0ZSBQZXJpb2QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgcmJlcgkweDdhCS8qIFJlY2VpdmUgQmF1ZCBSYXRlIEV4dGVuc2lvbiBSZWdpc3RlciAqLworI2RlZmluZSByY29yCTB4N2MJLyogUmVjZWl2ZSBDbG9jayBPcHRpb24gUmVnaXN0ZXIqLworI2RlZmluZSBwcHIJMHg3ZQkvKiBQcmVzY2FsYXIgUGVyaW9kIFJlZ2lzdGVyICAgICovCisKKy8qIE1pc2MgcmVnaXN0ZXJzIHVzZWQgZm9yIGZvcmNpbmcgdGhlIDE0MDAgb3V0IG9mIGl0cyByZXNldCB3b2VzICovCisjZGVmaW5lIGFpcmwJMHg2ZAorI2RlZmluZSBhaXJtCTB4NmUKKyNkZWZpbmUgYWlyaAkweDZmCisjZGVmaW5lIGJ0Y3IJMHg2NgorI2RlZmluZSBtdGNyCTB4NmMKKyNkZWZpbmUgdGJlcgkweDc0CisKKyNlbmRpZgkJCQkvKiAjaWZkZWYgUlRBICovCisKKworLyogQml0IGZpZWxkcyBmb3IgcGFydGljdWxhciByZWdpc3RlcnMgKi8KKworLyogR0NSICovCisjZGVmaW5lIEdDUl9TRVJJQUwJMHgwMAkvKiBDb25maWd1cmUgYXMgc2VyaWFsIGNoYW5uZWwgKi8KKyNkZWZpbmUgR0NSX1BBUkFMTEVMCTB4ODAJLyogQ29uZmlndXJlIGFzIHBhcmFsbGVsIGNoYW5uZWwgKi8KKworLyogUkRTUiAtIHdoZW4gc3RhdHVzIHJlYWQgZnJvbSBGSUZPICovCisjZGVmaW5lCVJEU1JfQlJFQUsJCTB4MDgJLyogQnJlYWsgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgUkRTUl9USU1FT1VUICAgIAkweDgwICAgIC8qIE5vIG5ldyBkYXRhIHRpbWVvdXQgKi8KKyNkZWZpbmUgUkRTUl9TQzEgIAkgIAkweDEwICAgIC8qIFNwZWNpYWwgY2hhciAxICh0eCBYT04pIG1hdGNoZWQgKi8KKyNkZWZpbmUgUkRTUl9TQzIgIAkgIAkweDIwICAgIC8qIFNwZWNpYWwgY2hhciAyICh0eCBYT0ZGKSBtYXRjaGVkICovCisjZGVmaW5lIFJEU1JfU0MxMl9NQVNLCSAgCTB4MzAgICAgLyogTWFzayBmb3Igc3BlY2lhbCBjaGFycyAxIGFuZCAyICovCisKKy8qIFBQUiAqLworI2RlZmluZSBQUFJfREVGQVVMVAkweDMxCS8qIERlZmF1bHQgdmFsdWUgLSBmb3IgYSAyNU1oeiBjbG9jayBnaXZlcworCQkJCSAgIGEgdGltZW91dCBwZXJpb2Qgb2YgMW1zICovCisKKy8qIExJVlIgKi8KKyNkZWZpbmUJTElWUl9FWENFUFRJT04JMHgwNwkvKiBSZWNlaXZlIGV4Y2VwdGlvbiBpbnRlcnJ1cHQgKi8KKworLyogQ0NSICovCisjZGVmaW5lCUNDUl9SRVNFVAkweDgwCS8qIFJlc2V0IGNoYW5uZWwgKi8KKyNkZWZpbmUJQ0NSX0NIQU5HRQkweDRlCS8qIENPUidzIGhhdmUgY2hhbmdlZCAtIE5CIGFsd2F5cyBjaGFuZ2UgYWxsCisJCQkJICAgQ09SJ3MgKi8KKyNkZWZpbmUJQ0NSX1dGTFVTSAkweDgyCS8qIEZsdXNoIHRyYW5zbWl0IEZJRk8gYW5kIFRTUiAvIFRIUiAqLworCisjZGVmaW5lCUNDUl9TRU5EU0MxCTB4MjEJLyogU2VuZCBzcGVjaWFsIGNoYXJhY3RlciBvbmUgKi8KKyNkZWZpbmUgQ0NSX1NFTkRTQzIJMHgyMgkvKiBTZW5kIHNwZWNpYWwgY2hhcmFjdGVyIHR3byAqLworI2RlZmluZSBDQ1JfU0VORFNDMwkweDIzCS8qIFNlbmQgc3BlY2lhbCBjaGFyYWN0ZXIgdGhyZWUgKi8KKyNkZWZpbmUgQ0NSX1NFTkRTQzQJMHgyNAkvKiBTZW5kIHNwZWNpYWwgY2hhcmFjdGVyIGZvdXIgKi8KKworI2RlZmluZSBDQ1JfVEVOQUJMRQkweDE4CS8qIEVuYWJsZSB0cmFuc21pdHRlciAqLworI2RlZmluZQlDQ1JfVERJU0FCTEUJMHgxNAkvKiBEaXNhYmxlIHRyYW5zbWl0dGVyICovCisjZGVmaW5lIENDUl9SRU5BQkxFCTB4MTIJLyogRW5hYmxlIHJlY2VpdmVyICovCisjZGVmaW5lIENDUl9SRElTQUJMRQkweDExCS8qIERpc2FibGUgcmVjZWl2ZXIgKi8KKworI2RlZmluZQlDQ1JfUkVBRFkJMHgwMAkvKiBDQ1IgaXMgcmVhZHkgZm9yIGFub3RoZXIgY29tbWFuZCAqLworCisvKiBDQ1NSICovCisjZGVmaW5lIENDU1JfVFhFTkFCTEUJMHgwOAkvKiBUcmFuc21pdHRlciBlbmFibGUgKi8KKyNkZWZpbmUgQ0NTUl9SWEVOQUJMRQkweDgwCS8qIFJlY2VpdmVyIGVuYWJsZSAqLworI2RlZmluZSBDQ1NSX1RYRkxPV09GRgkweDA0CS8qIFRyYW5zbWl0IGZsb3cgb2ZmICovCisjZGVmaW5lIENDU1JfVFhGTE9XT04JMHgwMgkvKiBUcmFuc21pdCBmbG93IG9uICovCisKKy8qIFNWUlIgKi8KKyNkZWZpbmUJU1ZSUl9SRUNFSVZFCTB4MDEJLyogUmVjZWl2ZSBpbnRlcnJ1cHQgcGVuZGluZyAqLworI2RlZmluZQlTVlJSX1RSQU5TTUlUCTB4MDIJLyogVHJhbnNtaXQgaW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUJU1ZSUl9NT0RFTQkweDA0CS8qIE1vZGVtIGludGVycnVwdCBwZW5kaW5nICovCisKKy8qIENBUiAqLworI2RlZmluZSBDQVJfUE9SVFMJMHgwMwkvKiBCaXQgZmllbGRzIGZvciBwb3J0cyAqLworCisvKiBJRVIgKi8KKyNkZWZpbmUJSUVSX01PREVNCTB4ODAJLyogQ2hhbmdlIGluIG1vZGVtIHN0YXR1cyAqLworI2RlZmluZQlJRVJfUkVDRUlWRQkweDEwCS8qIEdvb2QgZGF0YSAvIGRhdGEgZXhjZXB0aW9uICovCisjZGVmaW5lIElFUl9UUkFOU01JVFIJMHgwNAkvKiBUcmFuc21pdCByZWFkeSAoRklGTyBlbXB0eSkgKi8KKyNkZWZpbmUJSUVSX1RSQU5TTUlURQkweDAyCS8qIFRyYW5zbWl0IGVtcHR5ICovCisjZGVmaW5lIElFUl9USU1FT1VUCTB4MDEJLyogVGltZW91dCBvbiBubyBkYXRhICovCisKKyNkZWZpbmUJSUVSX0RFRkFVTFQJMHg5NAkvKiBEZWZhdWx0IHZhbHVlcyAqLworI2RlZmluZSBJRVJfUEFSQUxMRUwgICAgMHg4NCAgICAvKiBEZWZhdWx0IGZvciBQYXJhbGxlbCAqLworI2RlZmluZQlJRVJfRU1QVFkJMHg5MgkvKiBUcmFuc21pdHRlciBlbXB0eSByYXRoZXIgdGhhbiByZWFkeSAqLworCisvKiBDT1IxIC0gRHJpdmVyIG9ubHkgKi8KKyNkZWZpbmUJQ09SMV9JTlBDSwkweDEwCS8qIENoZWNrIHBhcml0eSBvZiByZWNlaXZlZCBjaGFyYWN0ZXJzICovCisKKy8qIENPUjEgLSBkcml2ZXIgYW5kIFJUQSAqLworI2RlZmluZQlDT1IxX09ERAkweDgwCS8qIE9kZCBwYXJpdHkgKi8KKyNkZWZpbmUgQ09SMV9FVkVOCTB4MDAJLyogRXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUJQ09SMV9OT1AJMHgwMAkvKiBObyBwYXJpdHkgKi8KKyNkZWZpbmUJQ09SMV9GT1JDRQkweDIwCS8qIEZvcmNlIHBhcml0eSAqLworI2RlZmluZQlDT1IxX05PUk1BTAkweDQwCS8qIFdpdGggcGFyaXR5ICovCisjZGVmaW5lCUNPUjFfMVNUT1AJMHgwMAkvKiAxIHN0b3AgYml0ICovCisjZGVmaW5lCUNPUjFfMTVTVE9QCTB4MDQJLyogMS41IHN0b3AgYml0cyAqLworI2RlZmluZQlDT1IxXzJTVE9QCTB4MDgJLyogMiBzdG9wIGJpdHMgKi8KKyNkZWZpbmUJQ09SMV81QklUUwkweDAwCS8qIDUgZGF0YSBiaXRzICovCisjZGVmaW5lCUNPUjFfNkJJVFMJMHgwMQkvKiA2IGRhdGEgYml0cyAqLworI2RlZmluZQlDT1IxXzdCSVRTCTB4MDIJLyogNyBkYXRhIGJpdHMgKi8KKyNkZWZpbmUJQ09SMV84QklUUwkweDAzCS8qIDggZGF0YSBiaXRzICovCisKKyNkZWZpbmUgQ09SMV9IT1NUICAgICAgIDB4ZWYgICAgLyogU2FmZSBob3N0IGJpdHMgKi8KKworLyogUlRBIG9ubHkgKi8KKyNkZWZpbmUgQ09SMV9DSU5QQ0sgICAgIDB4MDAgICAgLyogQ2hlY2sgcGFyaXR5IG9mIHJlY2VpdmVkIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUgQ09SMV9DTklOUENLICAgIDB4MTAgICAgLyogRG9uJ3QgY2hlY2sgcGFyaXR5ICovCisKKy8qIENPUjIgYml0cyBmb3IgYm90aCBSVEEgYW5kIGRyaXZlciB1c2UgKi8KKyNkZWZpbmUJQ09SMl9JWEFOWQkweDgwCS8qIElYQU5ZIC0gYW55IGNoYXJhY3RlciBpcyBYT04gKi8KKyNkZWZpbmUJQ09SMl9JWE9OCTB4NDAJLyogSVhPTiAtIGVuYWJsZSB0eCBzb2Z0IGZsb3djb250cm9sICovCisjZGVmaW5lCUNPUjJfUlRTRkxPVwkweDAyCS8qIEVuYWJsZSB0eCBoYXJkd2FyZSBmbG93IGNvbnRyb2wgKi8KKworLyogQWRkaXRpb25hbCBkcml2ZXIgYml0cyAqLworI2RlZmluZQlDT1IyX0hVUENMCTB4MjAJLyogSGFuZyB1cCBvbiBjbG9zZSAqLworI2RlZmluZQlDT1IyX0NUU0ZMT1cJMHgwNAkvKiBFbmFibGUgcnggaGFyZHdhcmUgZmxvdyBjb250cm9sICovCisjZGVmaW5lCUNPUjJfSVhPRkYJMHgwMQkvKiBFbmFibGUgcnggc29mdHdhcmUgZmxvdyBjb250cm9sICovCisjZGVmaW5lIENPUjJfRFRSRkxPVwkweDA4CS8qIEVuYWJsZSB0eCBoYXJkd2FyZSBmbG93IGNvbnRyb2wgKi8KKworLyogUlRBIHVzZSBvbmx5ICovCisjZGVmaW5lIENPUjJfRVRDCTB4MjAJLyogRW1iZWRkZWQgdHJhbnNtaXQgb3B0aW9ucyAqLworI2RlZmluZQlDT1IyX0xPQ0FMCTB4MTAJLyogTG9jYWwgbG9vcGJhY2sgbW9kZSAqLworI2RlZmluZQlDT1IyX1JFTU9URQkweDA4CS8qIFJlbW90ZSBsb29wYmFjayBtb2RlICovCisjZGVmaW5lCUNPUjJfSE9TVAkweGMyCS8qIFNhZmUgaG9zdCBiaXRzICovCisKKy8qIENPUjMgLSBSVEEgdXNlIG9ubHkgKi8KKyNkZWZpbmUJQ09SM19TQ0RSTkcJMHg4MAkvKiBFbmFibGUgc3BlY2lhbCBjaGFyIGRldGVjdCBmb3IgcmFuZ2UgKi8KKyNkZWZpbmUJQ09SM19TQ0QzNAkweDQwCS8qIFNwZWNpYWwgY2hhcmFjdGVyIGRldGVjdCBmb3IgU0NIUidzIDMgKyA0ICovCisjZGVmaW5lCUNPUjNfRkNUCTB4MjAJLyogRmxvdyBjb250cm9sIHRyYW5zcGFyZW5jeSAqLworI2RlZmluZQlDT1IzX1NDRDEyCTB4MTAJLyogU3BlY2lhbCBjaGFyYWN0ZXIgZGV0ZWN0IGZvciBTQ0hSJ3MgMSArIDIgKi8KKyNkZWZpbmUJQ09SM19GSUZPMTIJMHgwYwkvKiAxMiBjaGFycyBmb3IgcmVjZWl2ZSBGSUZPIHRocmVzaG9sZCAqLworI2RlZmluZSBDT1IzX0ZJRk8xMCAgICAgMHgwYSAgICAvKiAxMCBjaGFycyBmb3IgcmVjZWl2ZSBGSUZPIHRocmVzaG9sZCAqLworI2RlZmluZSBDT1IzX0ZJRk84ICAgICAgMHgwOCAgICAvKiA4IGNoYXJzIGZvciByZWNlaXZlIEZJRk8gdGhyZXNob2xkICovCisjZGVmaW5lIENPUjNfRklGTzYgICAgICAweDA2ICAgIC8qIDYgY2hhcnMgZm9yIHJlY2VpdmUgRklGTyB0aHJlc2hvbGQgKi8KKworI2RlZmluZSBDT1IzX1RIUkVTSE9MRCAgQ09SM19GSUZPOAkvKiBNVVNUIEJFIExFU1MgVEhBTiBNQ09SX1RIUkVTSE9MRCAqLworCisjZGVmaW5lCUNPUjNfREVGQVVMVAkoQ09SM19GQ1QgfCBDT1IzX1RIUkVTSE9MRCkKKwkJCQkvKiBEZWZhdWx0IGJpdHMgZm9yIENPUjMgKi8KKworLyogQ09SNCBkcml2ZXIgYW5kIFJUQSB1c2UgKi8KKyNkZWZpbmUJQ09SNF9JR05DUgkweDgwCS8qIFRocm93IGF3YXkgQ1IncyBvbiBpbnB1dCAqLworI2RlZmluZQlDT1I0X0lDUk5MCTB4NDAJLyogTWFwIENSIC0+IE5MIG9uIGlucHV0ICovCisjZGVmaW5lCUNPUjRfSU5MQ1IJMHgyMAkvKiBNYXAgTkwgLT4gQ1Igb24gaW5wdXQgKi8KKyNkZWZpbmUJQ09SNF9JR05CUksJMHgxMAkvKiBJZ25vcmUgQnJlYWsgKi8KKyNkZWZpbmUJQ09SNF9OQlJLSU5UCTB4MDgJLyogTm8gaW50ZXJydXB0IG9uIGJyZWFrICgtQlJLSU5UKSAqLworI2RlZmluZSBDT1I0X1JBSVNFTU9ECTB4MDEJLyogUmFpc2UgbW9kZW0gb3V0cHV0IGxpbmVzIG9uIG5vbi16ZXJvIGJhdWQgKi8KKworCisvKiBDT1I0IGRyaXZlciBvbmx5ICovCisjZGVmaW5lIENPUjRfSUdOUEFSCTB4MDQJLyogSUdOUEFSIChpZ25vcmUgY2hhcmFjdGVycyB3aXRoIGVycm9ycykgKi8KKyNkZWZpbmUgQ09SNF9QQVJNUksJMHgwMgkvKiBQQVJNUksgKi8KKworI2RlZmluZSBDT1I0X0hPU1QJMHhmOAkvKiBTYWZlIGhvc3QgYml0cyAqLworCisvKiBDT1I0IFJUQSBvbmx5ICovCisjZGVmaW5lIENPUjRfQ0lHTlBBUgkweDAyCS8qIFRocm93biBhd2F5IGJhZCBjaGFyYWN0ZXJzICovCisjZGVmaW5lIENPUjRfQ1BBUk1SSwkweDA0CS8qIFBBUk1SSyBjaGFyYWN0ZXJzICovCisjZGVmaW5lIENPUjRfQ05QQVJNUksJMHgwMwkvKiBEb24ndCBQQVJNUksgKi8KKworLyogQ09SNSBkcml2ZXIgYW5kIFJUQSB1c2UgKi8KKyNkZWZpbmUJQ09SNV9JU1RSSVAJMHg4MAkvKiBTdHJpcCBpbnB1dCBjaGFycyB0byA3IGJpdHMgKi8KKyNkZWZpbmUJQ09SNV9MTkUJMHg0MAkvKiBFbmFibGUgTE5FWFQgcHJvY2Vzc2luZyAqLworI2RlZmluZQlDT1I1X0NNT0UJMHgyMAkvKiBNYXRjaCBnb29kIGFuZCBlcnJvcmVkIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUJQ09SNV9PTkxDUgkweDAyCS8qIE5MIC0+IENSIE5MIG9uIG91dHB1dCAqLworI2RlZmluZQlDT1I1X09DUk5MCTB4MDEJLyogQ1IgLT4gTkwgb24gb3V0cHV0ICovCisKKy8qCisqKiBTcGFyZSBiaXRzIC0gdGhlc2UgYXJlIG5vdCB1c2VkIGluIHRoZSBDSVJSVVMgcmVnaXN0ZXJzLCBzbyB3ZSB1c2UKKyoqIHRoZW0gdG8gc2V0IHZhcmlvdXMgb3RoZXIgZmVhdHVyZXMuCisqLworLyoKKyoqIHRzdG9wIGFuZCB0YnVzeSBpbmRpY2F0aW9uCisqLworI2RlZmluZQlDT1I1X1RTVEFURV9PTgkweDA4CS8qIFR1cm4gb24gbW9uaXRvcmluZyBvZiB0YnVzeSBhbmQgdHN0b3AgKi8KKyNkZWZpbmUJQ09SNV9UU1RBVEVfT0ZGCTB4MDQJLyogVHVybiBvZmYgbW9uaXRvcmluZyBvZiB0YnVzeSBhbmQgdHN0b3AgKi8KKy8qCisqKiBUQUIzCisqLworI2RlZmluZQlDT1I1X1RBQjMJMHgxMAkvKiBUQUIzIG1vZGUgKi8KKworI2RlZmluZQlDT1I1X0hPU1QJMHhjMwkvKiBTYWZlIGhvc3QgYml0cyAqLworCisvKiBDQ1NSICovCisjZGVmaW5lCUNDU1JfVFhGTE9GRgkweDA0CS8qIFR4IGlzIHhvZmZlZCAqLworCisvKiBNU1ZSMSAqLworLyogTkIuIERUUiAvIENEIHN3YXBwZWQgZnJvbSBDaXJydXMgc3BlYyBhcyB0aGUgcGlucyBhcmUgYWxzbyByZXZlcnNlZCBvbiB0aGUKKyAgIFJUQS4gVGhpcyBpcyBiZWNhdXNlIG90aGVyd2lzZSBEQ0Qgd291bGQgZ2V0IGxvc3Qgb24gdGhlIDEgcGFyYWxsZWwgLyAzCisgICBzZXJpYWwgb3B0aW9uLgorKi8KKyNkZWZpbmUJTVNWUjFfQ0QJMHg4MAkvKiBDRCAoRFNSIG9uIENpcnJ1cykgKi8KKyNkZWZpbmUJTVNWUjFfUlRTCTB4NDAJLyogUlRTIChDVFMgb24gQ2lycnVzKSAqLworI2RlZmluZQlNU1ZSMV9SSQkweDIwCS8qIFJJICovCisjZGVmaW5lCU1TVlIxX0RUUgkweDEwCS8qIERUUiAoQ0Qgb24gQ2lycnVzKSAqLworI2RlZmluZQlNU1ZSMV9DVFMJMHgwMQkvKiBDVFMgb3V0cHV0IHBpbiAoUlRTIG9uIENpcnJ1cykgKi8KKy8qIE5leHQgdHdvIHVzZWQgdG8gaW5kaWNhdGUgc3RhdGUgb2YgdGJ1c3kgYW5kIHRzdG9wIHRvIGRyaXZlciAqLworI2RlZmluZQlNU1ZSMV9UU1RPUAkweDA4CS8qIFNldCBpZiBwb3J0IGZsb3cgY29udHJvbGxlZCAqLworI2RlZmluZQlNU1ZSMV9URU1QVFkJMHgwNAkvKiBTZXQgaWYgcG9ydCB0eCBidWZmZXIgZW1wdHkgKi8KKworI2RlZmluZQlNU1ZSMV9IT1NUCTB4ZjMJLyogVGhlIGJpdHMgdGhlIGhvc3Qgd2FudHMgKi8KKworLyogTVNWUjIgKi8KKyNkZWZpbmUJTVNWUjJfRFNSCTB4MDIJLyogRFNSIG91dHB1dCBwaW4gKERUUiBvbiBDaXJydXMpICovCisKKy8qIE1DT1IgKi8KKyNkZWZpbmUJTUNPUl9DRAkgICAgICAgIDB4ODAJLyogQ0QgKERTUiBvbiBDaXJydXMpICovCisjZGVmaW5lCU1DT1JfUlRTCTB4NDAJLyogUlRTIChDVFMgb24gQ2lycnVzKSAqLworI2RlZmluZQlNQ09SX1JJCSAgICAgICAgMHgyMAkvKiBSSSAqLworI2RlZmluZQlNQ09SX0RUUgkweDEwCS8qIERUUiAoQ0Qgb24gQ2lycnVzKSAqLworCisjZGVmaW5lIE1DT1JfREVGQVVMVCAgICAoTUNPUl9DRCB8IE1DT1JfUlRTIHwgTUNPUl9SSSB8IE1DT1JfRFRSKQorI2RlZmluZSBNQ09SX0ZVTExNT0RFTSAgTUNPUl9ERUZBVUxUCisjZGVmaW5lIE1DT1JfUko0NSAgICAgICAoTUNPUl9DRCB8IE1DT1JfUlRTIHwgTUNPUl9EVFIpCisjZGVmaW5lIE1DT1JfUkVTVFJJQ1RFRCAoTUNPUl9DRCB8IE1DT1JfUlRTKQorCisvKiBNb3JlIE1DT1IgLSBIL1cgSGFuZHNoYWtlIChmbG93Y29udHJvbCkgc3R1ZmYgKi8KKyNkZWZpbmUJTUNPUl9USFJFU0g4CTB4MDgJLyogZWlnaHQgY2hhcmFjdGVycyB0aGVuIHdlIHN0b3AgKi8KKyNkZWZpbmUJTUNPUl9USFJFU0g5CTB4MDkJLyogbmluZSBjaGFyYWN0ZXJzIHRoZW4gd2Ugc3RvcCAqLworI2RlZmluZQlNQ09SX1RIUkVTSDEwCTB4MEEJLyogdGVuIGNoYXJhY3RlcnMgdGhlbiB3ZSBzdG9wICovCisjZGVmaW5lCU1DT1JfVEhSRVNIMTEJMHgwQgkvKiBlbGV2ZW4gY2hhcmFjdGVycyB0aGVuIHdlIHN0b3AgKi8KKworI2RlZmluZQlNQ09SX1RIUkVTSEJJVFMgMHgwRgkvKiBtYXNrIGZvciBBTkRpbmcgb3V0IHRoZSBhYm92ZSAqLworCisjZGVmaW5lCU1DT1JfVEhSRVNIT0xECU1DT1JfVEhSRVNIOSAvKiBNVVNUIEJFIEdSRUFURVIgVEhBTiBDT1IzX1RIUkVTSE9MRCAqLworCisKKy8qIFJUUFIgKi8KKyNkZWZpbmUgUlRQUl9ERUZBVUxUCTB4MDIJLyogRGVmYXVsdCAqLworCisKKy8qIERlZmluZXMgZm9yIHRoZSBzdWJzY3JpcHRzIG9mIGEgQ09ORklHIHBhY2tldCAqLworI2RlZmluZQlDT05GSUdfQ09SMQkxCS8qIE9wdGlvbiByZWdpc3RlciAxICovCisjZGVmaW5lCUNPTkZJR19DT1IyCTIJLyogT3B0aW9uIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJQ09ORklHX0NPUjQJMwkvKiBPcHRpb24gcmVnaXN0ZXIgNCAqLworI2RlZmluZQlDT05GSUdfQ09SNQk0CS8qIE9wdGlvbiByZWdpc3RlciA1ICovCisjZGVmaW5lCUNPTkZJR19UWFhPTgk1CS8qIFR4IFhPTiBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUJQ09ORklHX1RYWE9GRgk2CS8qIFR4IFhPRkYgY2hhcmFjdGVyICovCisjZGVmaW5lCUNPTkZJR19SWFhPTgk3CS8qIFJ4IFhPTiBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUJQ09ORklHX1JYWE9GRgk4CS8qIFJ4IFhPRkYgY2hhcmFjdGVyICovCisjZGVmaW5lIENPTkZJR19MTkVYVAk5CS8qIExORVhUIGNoYXJhY3RlciAqLworI2RlZmluZQlDT05GSUdfVFhCQVVECTEwCS8qIFR4IGJhdWQgcmF0ZSAqLworI2RlZmluZQlDT05GSUdfUlhCQVVECTExCS8qIFJ4IGJhdWQgcmF0ZSAqLworCisvKiBQb3J0IHN0YXR1cyBzdHVmZiAqLworI2RlZmluZQlJRExFX0NMT1NFRAkwCS8qIENsb3NlZCAqLworI2RlZmluZSBJRExFX09QRU4JMQkvKiBJZGxlIG9wZW4gKi8KKyNkZWZpbmUgSURMRV9CUkVBSwkyCS8qIElkbGUgb24gYnJlYWsgKi8KKworLyogU3Vic2NyaXB0IG9mIE1PREVNIFNUQVRVUyBwYWNrZXQgKi8KKyNkZWZpbmUJTU9ERU1fVkFMVUUJMwkvKiBDdXJyZW50IHZhbHVlcyBvZiBoYW5kc2hha2UgcGlucyAqLworLyogU3Vic2NyaXB0IG9mIFNCUkVBSyBwYWNrZXQgKi8KKyNkZWZpbmUgQlJFQUtfTEVOR1RICTEJLyogTGVuZ3RoIG9mIGEgYnJlYWsgaW4gc2xpY2VzIG9mIDAuMDEgc2Vjb25kcworCQkJCSAgIDAgPSBzdGF5IG9uIGJyZWFrIHVudGlsIGFuIEVCUkVBSyBjb21tYW5kCisJCQkJICAgaXMgc2VudCAqLworCisKKyNkZWZpbmUJUFJFX0VNUFRJVkUJMHg4MAkvKiBQcmUtZW1wdGl2ZSBiaXQgaW4gY29tbWFuZCBmaWVsZCAqLworCisvKiBQYWNrZXQgdHlwZXMgZ29pbmcgZnJvbSBIb3N0IHRvIHJlbW90ZSAtIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBPUEVOLCBNT1BFTiwKKyAgIENPTkZJRywgU0JSRUFLIGFuZCBNRU1EVU1QIHRoZSByZW1haW5pbmcgYnl0ZXMgb2YgdGhlIGRhdGEgYXJyYXkgd2lsbCBub3QKKyAgIGJlIHVzZWQgCisqLworI2RlZmluZQlPUEVOCQkweDAwCS8qIE9wZW4gYSBwb3J0ICovCisjZGVmaW5lIENPTkZJRwkJMHgwMQkvKiBDb25maWd1cmUgYSBwb3J0ICovCisjZGVmaW5lCU1PUEVOCQkweDAyCS8qIE1vZGVtIG9wZW4gKGJsb2NrIGZvciBEQ0QpICovCisjZGVmaW5lCUNMT1NFCQkweDAzCS8qIENsb3NlIGEgcG9ydCAqLworI2RlZmluZQlXRkxVU0gJCSgweDA0IHwgUFJFX0VNUFRJVkUpIC8qIFdyaXRlIGZsdXNoICovCisjZGVmaW5lCVJGTFVTSAkJKDB4MDUgfCBQUkVfRU1QVElWRSkgLyogUmVhZCBmbHVzaCAqLworI2RlZmluZQlSRVNVTUUJCSgweDA2IHwgUFJFX0VNUFRJVkUpIC8qIFJlc3VtZSBpZiB4b2ZmZWQgKi8KKyNkZWZpbmUJU0JSRUFLCQkweDA3IAkvKiBTdGFydCBicmVhayAqLworI2RlZmluZQlFQlJFQUsJCTB4MDgJLyogRW5kIGJyZWFrICovCisjZGVmaW5lCVNVU1BFTkQJCSgweDA5IHwgUFJFX0VNUFRJVkUpIC8qIFN1c3Agb3AgKGJlaGF2ZSBhcyB0aG8geG9mZmVkKSAqLworI2RlZmluZSBGQ0xPU0UgICAgICAgICAgKDB4MGEgfCBQUkVfRU1QVElWRSkgLyogRm9yY2UgY2xvc2UgKi8KKyNkZWZpbmUgWFBSSU5UICAgICAgICAgIDB4MGIgICAgLyogWHByaW50IHBhY2tldCAqLworI2RlZmluZSBNQklTCQkoMHgwYyB8IFBSRV9FTVBUSVZFKSAvKiBTZXQgbW9kZW0gbGluZXMgKi8KKyNkZWZpbmUgTUJJQwkJKDB4MGQgfCBQUkVfRU1QVElWRSkgLyogQ2xlYXIgbW9kZW0gbGluZXMgKi8KKyNkZWZpbmUgTVNFVAkJKDB4MGUgfCBQUkVfRU1QVElWRSkgLyogU2V0IG1vZGVtIGxpbmVzICovCisjZGVmaW5lIFBDTE9TRQkJMHgwZgkvKiBQc2V1ZG8gY2xvc2UgLSBMZWF2ZXMgcngvdHggZW5hYmxlZCAqLworI2RlZmluZSBNR0VUCQkoMHgxMCB8IFBSRV9FTVBUSVZFKSAvKiBGb3JjZSB1cGRhdGUgb2YgbW9kZW0gc3RhdHVzICovCisjZGVmaW5lIE1FTURVTVAJCSgweDExIHwgUFJFX0VNUFRJVkUpIC8qIFNlbmQgYmFjayBtZW0gZnJvbSBhZGRyIHN1cHBsaWVkICovCisjZGVmaW5lCVJFQURfUkVHSVNURVIJKDB4MTIgfCBQUkVfRU1QVElWRSkgLyogUmVhZCBDRDE0MDAgcmVnaXN0ZXIgKGRlYnVnKSAqLworCisvKiAiQ29tbWFuZCIgcGFja2V0cyBnb2luZyBmcm9tIHJlbW90ZSB0byBob3N0IENPTVBMRVRFIGFuZCBNT0RFTV9TVEFUVVMKKyAgIHVzZSBkYXRhWzRdIC8gZGF0YVszXSB0byBpbmRpY2F0ZSBjdXJyZW50IHN0YXRlIGFuZCBtb2RlbSBzdGF0dXMgcmVzcGVjdGl2ZWx5CisqLyAKKworI2RlZmluZQlDT01QTEVURQkoMHgyMCB8IFBSRV9FTVBUSVZFKQorCQkJCS8qIENvbW1hbmQgY29tcGxldGUgKi8KKyNkZWZpbmUgQlJFQUtfUkVDRUlWRUQJKDB4MjEgfCBQUkVfRU1QVElWRSkKKwkJCQkvKiBCcmVhayByZWNlaXZlZCAqLworI2RlZmluZSBNT0RFTV9TVEFUVVMJKDB4MjIgfCBQUkVfRU1QVElWRSkKKwkJCQkvKiBDaGFuZ2UgaW4gbW9kZW0gc3RhdHVzICovCisKKy8qICJDb21tYW5kIiBwYWNrZXQgdGhhdCBjb3VsZCBnbyBlaXRoZXIgd2F5IC0gaGFuZHNoYWtlIHdha2UtdXAgKi8KKyNkZWZpbmUgSEFORFNIQUtFCSgweDIzIHwgUFJFX0VNUFRJVkUpCisJCQkJLyogV2FrZS11cCB0byBIT1NUIC8gUlRBICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9jbWQuaCBiL2RyaXZlcnMvY2hhci9yaW8vY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM2OWVkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vY21kLmgKQEAgLTAsMCArMSw4NCBAQAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgIEMgTyBNIE0gQSBOIEQgICBQIEEgQyBLIEUgVCAgIEggRSBBIEQgRSBSIFMKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfY21kX2gKKyNkZWZpbmUgX2NtZF9oCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1MKK3N0YXRpYyBjaGFyICpfcmlvX2NtZF9oX3NjY3MgPSAiQCgjKWNtZC5oCTEuMSIgOworI2VuZGlmCisjZW5kaWYKKworCisjZGVmaW5lIFBSRV9FTVBUSVZFX0NNRCAgICAgICAgIDB4ODAKKyNkZWZpbmUgSU5MSU5FX0NNRCAgICAgICAgICAgICAgflBSRV9FTVBUSVZFX0NNRAorCisjZGVmaW5lIENNRF9JR05PUkVfUEtUICAgICAgICAgICggKHVzaG9ydCkgMCkKKyNkZWZpbmUgQ01EX1NUQVRVU19SRVEgICAgICAgICAgKCAodXNob3J0KSAxKQorI2RlZmluZSBDTURfVU5JVF9TVEFUVVNfUkVRICAgICAoICh1c2hvcnQpIDIpICAgICAvKiBJcyB0aGlzIG5lZWRlZCA/Pz8gKi8KKyNkZWZpbmUgQ01EX0NPTkZfUE9SVCAgICAgICAgICAgKCAodXNob3J0KSAzKQorI2RlZmluZSBDTURfQ09ORl9VTklUICAgICAgICAgICAoICh1c2hvcnQpIDQpCisjZGVmaW5lIENNRF9ST1VURV9NQVBfUkVRICAgICAgICggKHVzaG9ydCkgNSkKKyNkZWZpbmUgQ01EX0ZMVVNIX1RYICAgICAgICAgICAgKCAodXNob3J0KSA2KQorI2RlZmluZSBDTURfRkxVU0hfUlggICAgICAgICAgICAoICh1c2hvcnQpIDcpCisjZGVmaW5lIENNRF9QQVJUSU9OX1BPUlQgICAgICAgICggKHVzaG9ydCkgOCkKKyNkZWZpbmUgQ01EX1JFU0VUX1BPUlQgICAgICAgICAgKCAodXNob3J0KSAweDBhKQorI2RlZmluZSBDTURfQk9PVF9VTklUICAgICAgICAgICAoICh1c2hvcnQpIDB4MGIpCisjZGVmaW5lIENNRF9GT1VORF9VTklUICAgICAgICAgICggKHVzaG9ydCkgMHgwYykKKyNkZWZpbmUgQ01EX0FUVEFDSEVEX1JUQV8yICAgICAgKCAodXNob3J0KSAweDBkKQorI2RlZmluZSBDTURfUFJPVklERV9CT09UICAgICAgICAoICh1c2hvcnQpIDB4MGUpCisjZGVmaW5lIENNRF9DSVJSVVMgICAgICAgICAgICAgICggKHVzaG9ydCkgMHgwZikKKworI2RlZmluZSBGT1JNX1NUQVRVU19QS1QgICAgICAgICAoICh1c2hvcnQpIDEgKQorI2RlZmluZSBGT1JNX1BPTExfUEtUICAgICAgICAgICAoICh1c2hvcnQpIDIgKQorI2RlZmluZSBGT1JNX0xJTktfU1RBVFVTX1BLVCAgICAoICh1c2hvcnQpIDMgKQorCisKKyNkZWZpbmUgQ01EX0RBVEFfUE9SVCAgICAgICAgICAgKCAodXNob3J0KSAxICkKKyNkZWZpbmUgQ01EX0RBVEEgICAgICAgICAgICAgICAgKCAodXNob3J0KSAyICkKKworI2RlZmluZSBDTURfVFhfUEFSVCAgICAgICAgICAgICAoICh1c2hvcnQpIDIgKQorI2RlZmluZSBDTURfUlhfUEFSVCAgICAgICAgICAgICAoICh1c2hvcnQpIDMgKQorI2RlZmluZSBDTURfUlhfTElNSVQgICAgICAgICAgICAoICh1c2hvcnQpIDQgKQorCisjZW5kaWYKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2NtZGJsay5oIGIvZHJpdmVycy9jaGFyL3Jpby9jbWRibGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjhlZmJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9jbWRibGsuaApAQCAtMCwwICsxLDYwIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBjbWRibGsuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MDkKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjAKKyoqCisqKiAgaWRlbnQgQCgjKWNtZGJsay5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvX2NtZGJsa19oX18KKyNkZWZpbmUgX19yaW9fY21kYmxrX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgKl9jbWRibGtfaF9zY2NzXyA9ICJAKCMpY21kYmxrLmgJMS4yIjsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisqKiB0aGUgc3RydWN0dXJlIG9mIGEgY29tbWFuZCBibG9jaywgdXNlZCB0byBxdWV1ZSBjb21tYW5kcyBkZXN0aW5lZCBmb3IKKyoqIGEgcnVwLgorKi8KKworc3RydWN0IENtZEJsaworeworIHN0cnVjdCBDbWRCbGsgKk5leHRQOyAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgY29tbWFuZCBibG9jayAqLworIHN0cnVjdAlQS1QgICAgIFBhY2tldDsgICAgICAgICAvKiBBIHBhY2tldCwgdG8gY29weSB0byB0aGUgcnVwICovCisgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmdW5jIHRvIGNhbGwgdG8gY2hlY2sgaWYgT0sgKi8KKyAgICAJaW50ICAgICAoKlByZUZ1bmNQKShpbnQsIHN0cnVjdCBDbWRCbGsgKik7CisgICAgCWludCAgICAgUHJlQXJnOyAgICAgICAgIC8qIFRoZSBhcmcgZm9yIHRoZSBmdW5jICovCisgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmdW5jIHRvIGNhbGwgd2hlbiBjb21wbGV0ZWQgKi8KKyAgICAJaW50ICAgICAoKlBvc3RGdW5jUCkoaW50LCBzdHJ1Y3QgQ21kQmxrICopOworICAgIAlpbnQgICAgIFBvc3RBcmc7ICAgICAgICAvKiBUaGUgYXJnIGZvciB0aGUgZnVuYyAqLworfTsKKworI2RlZmluZSBOVU1fUklPX0NNRF9CTEtTICgzICogKE1BWF9SVVAgKiA0ICsgTElOS1NfUEVSX1VOSVQgKiA0KSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9jbWRwa3QuaCBiL2RyaXZlcnMvY2hhci9yaW8vY21kcGt0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiZWZkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vY21kcGt0LmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IGNtZHBrdC5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDowOQorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMAorKioKKyoqICBpZGVudCBAKCMpY21kcGt0LmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWZuZGVmIF9fcmlvX2NtZHBrdF9oX18KKyNkZWZpbmUgX19yaW9fY21kcGt0X2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgKl9jbWRwa3RfaF9zY2NzXyA9ICJAKCMpY21kcGt0LmgJMS4yIjsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisqKiBvdmVybGF5cyBmb3IgdGhlIGRhdGEgYXJlYSBvZiBhIHBhY2tldC4gVXNlZCBpbiBib3RoIGRpcmVjdGlvbnMKKyoqICh0byBidWlsZCBhIHBhY2tldCB0byBzZW5kLCBhbmQgdG8gaW50ZXJwcmV0IGEgcGFja2V0IHRoYXQgYXJyaXZlcykKKyoqIGFuZCBpcyB2ZXJ5IGluY29udmVuaWVudCBmb3IgTUlQUywgc28gdGhleSBhcHBlYXIgYXMgdHdvIHNlcGFyYXRlCisqKiBzdHJ1Y3R1cmVzIC0gdGhvc2UgdXNlZCBmb3IgbW9kaWZ5aW5nL3JlYWRpbmcgcGFja2V0cyBvbiB0aGUgY2FyZAorKiogYW5kIHRob3NlIGZvciBtb2RpZnlpbmcvcmVhZGluZyBwYWNrZXRzIGluIHJlYWwgbWVtb3J5LCB3aGljaCBoYXZlIGFuIF9NCisqKiBzdWZmaXguCisqLworCisjZGVmaW5lCVJUQV9CT09UX0RBVEFfU0laRSAoUEtUX01BWF9EQVRBX0xFTi0yKQorCisvKgorKiogVGhlIGJvb3QgaW5mb3JtYXRpb24gcGFja2V0IGxvb2tzIGxpa2UgdGhpczoKKyoqIFRoaXMgc3RydWN0dXJlIG92ZXJsYXlzIGEgUGt0Q21kLT5DbWREYXRhIHN0cnVjdHVyZSwgYW5kIHNvIHN0YXJ0cworKiogYXQgRGF0YVsyXSBpbiB0aGUgYWN0dWFsIHBrdCEKKyovCitzdHJ1Y3QgQm9vdFNlcXVlbmNlCit7CisgICAgV09SRAlOdW1QYWNrZXRzOworICAgIFdPUkQJTG9hZEJhc2U7CisgICAgV09SRAlDb2RlU2l6ZTsKK307CisKKyNkZWZpbmUJQk9PVF9TRVFVRU5DRV9MRU4JOAorCitzdHJ1Y3QgU2FtVG9wCit7CisgICAgQllURSBVbml0OworICAgIEJZVEUgTGluazsKK307CisKK3N0cnVjdCBDbWRIZHIKK3sKKyAgICBCWVRFIFBjQ29tbWFuZDsKKyAgICB1bmlvbgorICAgIHsKKyAgICBCWVRFIFBjUGhiTnVtOworICAgIEJZVEUgUGNMaW5rTnVtOworICAgIEJZVEUgUGNJRE51bTsKKyAgICB9IFUwOworfTsKKworCitzdHJ1Y3QgUGt0Q21kCit7CisgICAgdW5pb24KKyAgICB7CisJc3RydWN0IAorCXsKKwkgICAgc3RydWN0IENtZEhkciBDbWRIZHI7CisJICAgIHN0cnVjdCBCb290U2VxdWVuY2UgUGNCb290U2VxdWVuY2U7CisJfSBTMTsKKwlzdHJ1Y3QKKwl7CisJICAgIFdPUkQgUGNTZXF1ZW5jZTsKKwkgICAgQllURSBQY0Jvb3REYXRhW1JUQV9CT09UX0RBVEFfU0laRV07CisJfSBTMjsKKwlzdHJ1Y3QKKwl7CisJICAgIFdPUkQgIF9fY3J1ZF9fOworCSAgICBCWVRFICBQY1VuaXFOdW1bNF07CSAgICAgICAgLyogdGhpcyBpcyByZWFsbHkgYSB1aW50LiAqLworCSAgICBCWVRFICBQY01vZHVsZVR5cGVzOyAgCS8qIHdoYXQgbW9kdWxlcyBhcmUgZml0dGVkICovCisJfSBTMzsKKwlzdHJ1Y3QKKwl7CisJICAgIHN0cnVjdCBDbWRIZHIgQ21kSGRyOworCSAgICBCWVRFICAgX191bmRlZmluZWRfXzsKKwkgICAgQllURSAgIFBjTW9kZW1TdGF0dXM7CisJICAgIEJZVEUgICBQY1BvcnRTdGF0dXM7CisJICAgIEJZVEUgICBQY1N1YkNvbW1hbmQ7CS8qIGNvbW1hbmRzIGxpa2UgbWVtIG9yIHJlZ2lzdGVyIGR1bXAgKi8KKwkgICAgV09SRCAgIFBjU3ViQWRkcjsJCS8qIEFkZHJlc3MgZm9yIGNvbW1hbmQgKi8KKwkgICAgQllURSAgIFBjU3ViRGF0YVs2NF07CS8qIERhdGUgYXJlYSBmb3IgY29tbWFuZCAqLworCX0gUzQ7CisJc3RydWN0CisJeworCSAgICBzdHJ1Y3QgQ21kSGRyIENtZEhkcjsKKwkgICAgQllURSAgIFBjQ29tbWFuZFRleHRbMV07CisJICAgIEJZVEUgICBfX2NydWRfX1syMF07CisJICAgIEJZVEUgICBQY0lETnVtMjsJCS8qIEl0IGhhZCB0byBnbyBzb21ld2hlcmUhICovCisJfSBTNTsKKwlzdHJ1Y3QKKwl7CisJICAgIHN0cnVjdCBDbWRIZHIgQ21kSGRyOworCSAgICBzdHJ1Y3QgU2FtVG9wICAgIFRvcG9sb2d5W0xJTktTX1BFUl9VTklUXTsKKwl9IFM2OworICAgIH0gVTE7Cit9OworCitzdHJ1Y3QgUGt0Q21kX00KK3sKKyAgICB1bmlvbgorICAgIHsKKwlzdHJ1Y3QgCisJeworCSAgICBzdHJ1Y3QKKwkgICAgeworICAgIAkJdWNoYXIgUGNDb21tYW5kOworICAgIAkJdW5pb24KKyAgICAJCXsKKyAgICAJCSAgICB1Y2hhciBQY1BoYk51bTsKKyAgICAJCSAgICB1Y2hhciBQY0xpbmtOdW07CisgICAgCQkgICAgdWNoYXIgUGNJRE51bTsKKyAgICAJCX0gVTA7CisJICAgIH0gQ21kSGRyOworCSAgICBzdHJ1Y3QKKwkgICAgeworICAgICAgICAgICAgICAgIHVzaG9ydAlOdW1QYWNrZXRzOworICAgICAgICAgICAgICAgIHVzaG9ydAlMb2FkQmFzZTsKKyAgICAgICAgICAgICAgICB1c2hvcnQJQ29kZVNpemU7CisgICAgICAgICAgICB9IFBjQm9vdFNlcXVlbmNlOworCX0gUzE7CisJc3RydWN0CisJeworCSAgICB1c2hvcnQgUGNTZXF1ZW5jZTsKKwkgICAgdWNoYXIgUGNCb290RGF0YVtSVEFfQk9PVF9EQVRBX1NJWkVdOworCX0gUzI7CisJc3RydWN0CisJeworCSAgICB1c2hvcnQgIF9fY3J1ZF9fOworCSAgICB1Y2hhciAgUGNVbmlxTnVtWzRdOwkgICAgICAgIC8qIHRoaXMgaXMgcmVhbGx5IGEgdWludC4gKi8KKwkgICAgdWNoYXIgIFBjTW9kdWxlVHlwZXM7ICAJLyogd2hhdCBtb2R1bGVzIGFyZSBmaXR0ZWQgKi8KKwl9IFMzOworCXN0cnVjdAorCXsKKwkgICAgdXNob3J0ICBfX2NtZF9oZHJfXzsKKwkgICAgdWNoYXIgICBfX3VuZGVmaW5lZF9fOworCSAgICB1Y2hhciAgIFBjTW9kZW1TdGF0dXM7CisJICAgIHVjaGFyICAgUGNQb3J0U3RhdHVzOworCSAgICB1Y2hhciAgIFBjU3ViQ29tbWFuZDsKKwkgICAgdXNob3J0ICBQY1N1YkFkZHI7CisJICAgIHVjaGFyICAgUGNTdWJEYXRhWzY0XTsKKwl9IFM0OworCXN0cnVjdAorCXsKKwkgICAgdXNob3J0ICBfX2NtZF9oZHJfXzsKKwkgICAgdWNoYXIgICBQY0NvbW1hbmRUZXh0WzFdOworCSAgICB1Y2hhciAgIF9fY3J1ZF9fWzIwXTsKKwkgICAgdWNoYXIgICBQY0lETnVtMjsJCS8qIFRhY2tlZCBvbiBlbmQgKi8KKwl9IFM1OworCXN0cnVjdAorCXsKKwkgICAgdXNob3J0ICBfX2NtZF9oZHJfXzsKKwkgICAgc3RydWN0IFRvcCBUb3BvbG9neVtMSU5LU19QRVJfVU5JVF07CisJfSBTNjsKKyAgICB9IFUxOworfTsKKworI2RlZmluZSBDb21tYW5kCQlVMS5TMS5DbWRIZHIuUGNDb21tYW5kCisjZGVmaW5lIFBoYk51bQkJVTEuUzEuQ21kSGRyLlUwLlBjUGhiTnVtCisjZGVmaW5lIElETnVtCQlVMS5TMS5DbWRIZHIuVTAuUGNJRE51bQorI2RlZmluZSBJRE51bTIJCVUxLlM1LlBjSUROdW0yCisjZGVmaW5lIExpbmtOdW0JCVUxLlMxLkNtZEhkci5VMC5QY0xpbmtOdW0KKyNkZWZpbmUgU2VxdWVuY2UJVTEuUzIuUGNTZXF1ZW5jZQorI2RlZmluZSBCb290RGF0YQlVMS5TMi5QY0Jvb3REYXRhCisjZGVmaW5lIEJvb3RTZXF1ZW5jZQlVMS5TMS5QY0Jvb3RTZXF1ZW5jZQorI2RlZmluZSBVbmlxTnVtCQlVMS5TMy5QY1VuaXFOdW0KKyNkZWZpbmUgTW9kZW1TdGF0dXMJVTEuUzQuUGNNb2RlbVN0YXR1cworI2RlZmluZSBQb3J0U3RhdHVzCVUxLlM0LlBjUG9ydFN0YXR1cworI2RlZmluZSBTdWJDb21tYW5kCVUxLlM0LlBjU3ViQ29tbWFuZAorI2RlZmluZSBTdWJBZGRyCQlVMS5TNC5QY1N1YkFkZHIKKyNkZWZpbmUgU3ViRGF0YQkJVTEuUzQuUGNTdWJEYXRhCisjZGVmaW5lIENvbW1hbmRUZXh0CVUxLlM1LlBjQ29tbWFuZFRleHQKKyNkZWZpbmUgUm91dGVUb3BvbG9neQlVMS5TNi5Ub3BvbG9neQorI2RlZmluZSBNb2R1bGVUeXBlcwlVMS5TMy5QY01vZHVsZVR5cGVzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9jb250cm9sLmggYi9kcml2ZXJzL2NoYXIvcmlvL2NvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzEyZjYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9jb250cm9sLmgKQEAgLTAsMCArMSw2MiBAQAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgIEMgTyBOIFQgUiBPIEwgICBQIEEgQyBLIEUgVCAgIEggRSBBIEQgRSBSIFMKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IEpvbiBCcmF3bgorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX2NvbnRyb2xfaAorI2RlZmluZSBfY29udHJvbF9oCisKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKl9yaW9fY29udHJvbF9oX3NjY3MgPSAiQCgjKWNvbnRyb2wuaAkxLjQiOyAqLworI2VuZGlmCisKKyNkZWZpbmUJQ09OVFJPTAkJJ14nCisjZGVmaW5lIElGT0FECQkoIENPTlRST0wgKyAxICkKKyNkZWZpbmUJSURFTlRJRlkJKCBDT05UUk9MICsgMiApCisjZGVmaW5lCVpPTUJJRQkJKCBDT05UUk9MICsgMyApCisjZGVmaW5lCVVGT0FECQkoIENPTlRST0wgKyA0ICkKKyNkZWZpbmUgSVdBSVQJCSggQ09OVFJPTCArIDUgKQorCisjZGVmaW5lCUlGT0FEX01BR0lDCTB4RjBBRAkJLyogb2YgY291cnNlICovCisjZGVmaW5lCVpPTUJJRV9NQUdJQwkofjB4REVBRCkJLyogbm90IGRlYWQgLT4gem9tYmllICovCisjZGVmaW5lCVVGT0FEX01BR0lDCTB4RDFFCQkvKiBraWxsLXlvdXItbmVpZ2hib3VyICovCisjZGVmaW5lCUlXQUlUX01BR0lDCTB4QjFERQkJLyogQmlkZSB5b3VyIHRpbWUgKi8KKworI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9kYWVtb24uaCBiL2RyaXZlcnMvY2hhci9yaW8vZGFlbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkYmEwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vZGFlbW9uLmgKQEAgLTAsMCArMSwzMzQgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IGRhZW1vbi5oCisqKglTSUQJCTogMS4zCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDowOQorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMQorKioKKyoqICBpZGVudCBAKCMpZGFlbW9uLmgJMS4zCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYJX19yaW9fZGFlbW9uX2hfXworI2RlZmluZQlfX3Jpb19kYWVtb25faF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciAqX2RhZW1vbl9oX3NjY3NfID0gIkAoIylkYWVtb24uaAkxLjMiOworI2VuZGlmCisjZW5kaWYKKworCisvKgorKiogc3RydWN0dXJlcyB1c2VkIG9uIC9kZXYvcmlvCisqLworCitzdHJ1Y3QgRXJyb3IKK3sKKwl1aW50CUVycm9yOworCXVpbnQJRW50cnk7CisJdWludAlPdGhlcjsKK307CisKK3N0cnVjdCBEb3duTG9hZAoreworCWNoYXIJKkRhdGFQOworCXVpbnQJQ291bnQ7CisJdWludAlQcm9kdWN0Q29kZTsKK307CisKKy8qCisqKiBBIGZldyBjb25zdGFudHMuLi4uCisqLworI2lmbmRlZiBNQVhfVkVSU0lPTl9MRU4KKyNkZWZpbmUJTUFYX1ZFUlNJT05fTEVOCTI1NgorI2VuZGlmCisKKyNpZm5kZWYgTUFYX1hQX0NUUkxfTEVOCisjZGVmaW5lCU1BWF9YUF9DVFJMX0xFTiAxNgkJLyogQUxTTyBJTiBQT1JULkggKi8KKyNlbmRpZgorCitzdHJ1Y3QJUG9ydFNldHVwCit7CisJdWludAlGcm9tOwkvKiBTZXQvQ2xlYXIgWFAgJiBJWEFOWSBDb250cm9sIGZyb20gdGhpcyBwb3J0Li4uLiAqLworCXVpbnQJVG87CS8qIC4uLi4gdG8gdGhpcyBwb3J0ICovCisJdWludAlYcENwczsJCQkvKiBhdCB0aGlzIHNwZWVkICovCisJY2hhcglYcE9uW01BWF9YUF9DVFJMX0xFTl07CS8qIHRoaXMgaXMgdGhlIHN0YXJ0IHN0cmluZyAqLworCWNoYXIJWHBPZmZbTUFYX1hQX0NUUkxfTEVOXTsJLyogdGhpcyBpcyB0aGUgc3RvcCBzdHJpbmcgKi8KKwl1Y2hhcglJeEFueTsJCQkvKiBlbmFibGUvZGlzYWJsZSBJWEFOWSAqLworCXVjaGFyCUl4T247CQkJLyogZW5hYmxlL2Rpc2FibGUgSVhPTiAqLworCXVjaGFyCUxvY2s7CQkJLyogbG9jayBwb3J0IHBhcmFtcyAqLworCXVjaGFyCVN0b3JlOwkJCS8qIHN0b3JlIHBhcmFtcyBhY3Jvc3MgY2xvc2VzICovCisJdWNoYXIJRHJhaW47CQkJLyogY2xvc2Ugb25seSB3aGVuIGRyYWluZWQgKi8KK307CisKK3N0cnVjdAlMcGJSZXEKK3sKKwl1aW50CUhvc3Q7CisJdWludAlMaW5rOworCXN0cnVjdCAgTFBCICAgICAqTHBiUDsKK307CisKK3N0cnVjdAlSdXBSZXEKK3sKKwl1aW50CUhvc3ROdW07CisJdWludAlSdXBOdW07CisJc3RydWN0ICBSVVAgCSpSdXBQOworfTsKKworc3RydWN0CVBvcnRSZXEKK3sKKwl1aW50CVN5c1BvcnQ7CisJc3RydWN0ICBQb3J0IAkqUG9ydFA7Cit9OworCitzdHJ1Y3QgIFN0cmVhbUluZm8KK3sKKwl1aW50CVN5c1BvcnQ7CisjaWYgMAorCXF1ZXVlX3QgUlF1ZXVlOworCXF1ZXVlX3QgV1F1ZXVlOworI2Vsc2UKKwlpbnQgUlF1ZXVlOworCWludCBXUXVldWU7CisjZW5kaWYKK307CisKK3N0cnVjdAlIb3N0UmVxCit7CisJdWludAlIb3N0TnVtOworCXN0cnVjdCAgSG9zdCAJKkhvc3RQOworfTsKKworc3RydWN0CUhvc3REcFJhbQoreworCXVpbnQJSG9zdE51bTsKKwlzdHJ1Y3QJRHBSYW0JKkRwUmFtUDsKK307CisKK3N0cnVjdAlEZWJ1Z0N0cmwKK3sKKwl1aW50CVN5c1BvcnQ7CisJdWludAlEZWJ1ZzsKKwl1aW50CVdhaXQ7Cit9OworCitzdHJ1Y3QJTWFwSW5mbworeworCXVpbnQJRmlyc3RQb3J0OwkvKiA4IHBvcnRzLCBzdGFydGluZyBmcm9tIHRoaXMgKHR0eSkgbnVtYmVyICovCisJdWludAlSdGFVbmlxdWU7CS8qIHJlc2lkZSBvbiB0aGlzIFJUQSAodW5pcXVlIG51bWJlcikgKi8KK307CisKK3N0cnVjdAlNYXBJbgoreworCXVpbnQJTnVtRW50cmllczsJCS8qIEhvdyBtYW55IHBvcnQgc2V0cyBhcmUgd2UgbWFwcGluZz8gKi8KKwlzdHJ1Y3QgIE1hcEluZm8JKk1hcEluZm9QOwkvKiBQb2ludGVyIHRvICh1c2VyIHNwYWNlKSBpbmZvICovCit9OworCitzdHJ1Y3QgIFNlbmRQYWNrCit7CisgICAgICAgIHVuc2lnbmVkIGludAlQb3J0TnVtOworCXVuc2lnbmVkIGNoYXIJTGVuOworCXVuc2lnbmVkIGNoYXIJRGF0YVtQS1RfTUFYX0RBVEFfTEVOXTsKK307CisKK3N0cnVjdCBTcGVjaWFsUnVwQ21kCit7CisJc3RydWN0CVBLVAkJUGFja2V0OworCXVuc2lnbmVkIHNob3J0CUhvc3Q7CisJdW5zaWduZWQgc2hvcnQJUnVwTnVtOworfTsKKworc3RydWN0CUlkZW50aWZ5UnRhCit7CisJdWxvbmcJUnRhVW5pcXVlOworCXVjaGFyCUlEOworfTsKKworc3RydWN0CUtpbGxOZWlnaGJvdXIKK3sKKwl1bG9uZwlVbmlxdWVOdW07CisJdWNoYXIJTGluazsKK307CisKK3N0cnVjdCByaW9WZXJzaW9uIHsKKyAgICBjaGFyICAgICAgICB2ZXJzaW9uW01BWF9WRVJTSU9OX0xFTl07CisgICAgY2hhciAgICAgICAgcmVsaWRbTUFYX1ZFUlNJT05fTEVOXTsKKyAgICBpbnQgICAgICAgICBidWlsZExldmVsOworICAgIGNoYXIgICAgICAgIGJ1aWxkRGF0ZVtNQVhfVkVSU0lPTl9MRU5dOworfTsKKworCisvKgorKioJUklPQyBjb21tYW5kcyBhcmUgZm9yIHRoZSBkYWVtb24gdHlwZSBvcGVyYXRpb25zCisqKgorKiogMDkuMTIuMTk5OCBBUkcgLSBFU0lMIDA3NzYgcGFydCBmaXgKKyoqIERlZmluaXRpb24gZm9yICdSSU9DJyBhbHNvIGFwcGVhcnMgaW4gcmlvaW9jdGwuaCwgc28gd2UnZCBiZXR0ZXIgZG8gYQorKiogI2lmbmRlZiBoZXJlIGZpcnN0LgorKiogcmlvaW9jdGwuaCBhbHNvIG5vdyBoYXMgI2RlZmluZSAnUklPX1FVSUNLX0NIRUNLJyBhcyB0aGlzIGlvY3RsIGlzIG5vdworKiogYWxsb3dlZCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4KKyovCisjaWZuZGVmIFJJT0MKKyNkZWZpbmUJUklPQwkoJ1InPDw4KXwoJ2knPDwxNil8KCdvJzw8MjQpCisjZW5kaWYKKworLyoKKyoqIEJvb3Qgc3R1ZmYKKyovCisjZGVmaW5lCVJJT19HRVRfVEFCTEUgICAgIChSSU9DIHwgMTAwKQorI2RlZmluZSBSSU9fUFVUX1RBQkxFICAgICAoUklPQyB8IDEwMSkKKyNkZWZpbmUgUklPX0FTU0lHTl9SVEEgICAgKFJJT0MgfCAxMDIpCisjZGVmaW5lIFJJT19ERUxFVEVfUlRBICAgIChSSU9DIHwgMTAzKQorI2RlZmluZQlSSU9fSE9TVF9GT0FECSAgKFJJT0MgfCAxMDQpCisjZGVmaW5lCVJJT19RVUlDS19DSEVDSwkgIChSSU9DIHwgMTA1KQorI2RlZmluZSBSSU9fU0lHTkFMU19PTiAgICAoUklPQyB8IDEwNikKKyNkZWZpbmUgUklPX1NJR05BTFNfT0ZGICAgKFJJT0MgfCAxMDcpCisjZGVmaW5lCVJJT19DSEFOR0VfTkFNRSAgIChSSU9DIHwgMTA4KQorI2RlZmluZSBSSU9fRE9XTkxPQUQgICAgICAoUklPQyB8IDEwOSkKKyNkZWZpbmUJUklPX0dFVF9MT0cJICAoUklPQyB8IDExMCkKKyNkZWZpbmUJUklPX1NFVFVQX1BPUlRTICAgKFJJT0MgfCAxMTEpCisjZGVmaW5lIFJJT19BTExfTU9ERU0gICAgIChSSU9DIHwgMTEyKQorCisvKgorKiogY2FyZCBzdGF0ZSwgZGVidWcgc3R1ZmYKKyovCisjZGVmaW5lCVJJT19OVU1fSE9TVFMJICAoUklPQyB8IDEyMCkKKyNkZWZpbmUJUklPX0hPU1RfTFBCCSAgKFJJT0MgfCAxMjEpCisjZGVmaW5lCVJJT19IT1NUX1JVUAkgIChSSU9DIHwgMTIyKQorI2RlZmluZQlSSU9fSE9TVF9QT1JUCSAgKFJJT0MgfCAxMjMpCisjZGVmaW5lCVJJT19QQVJNUyAJICAoUklPQyB8IDEyNCkKKyNkZWZpbmUgUklPX0hPU1RfUkVRCSAgKFJJT0MgfCAxMjUpCisjZGVmaW5lCVJJT19SRUFEX0NPTkZJRwkgIChSSU9DIHwgMTI2KQorI2RlZmluZQlSSU9fU0VUX0NPTkZJRwkgIChSSU9DIHwgMTI3KQorI2RlZmluZQlSSU9fVkVSU0lECSAgKFJJT0MgfCAxMjgpCisjZGVmaW5lCVJJT19GTEFHUwkgIChSSU9DIHwgMTI5KQorI2RlZmluZQlSSU9fU0VUREVCVUcJICAoUklPQyB8IDEzMCkKKyNkZWZpbmUJUklPX0dFVERFQlVHCSAgKFJJT0MgfCAxMzEpCisjZGVmaW5lCVJJT19SRUFEX0xFVkVMUyAgIChSSU9DIHwgMTMyKQorI2RlZmluZQlSSU9fU0VUX0ZBU1RfQlVTICAoUklPQyB8IDEzMykKKyNkZWZpbmUJUklPX1NFVF9TTE9XX0JVUyAgKFJJT0MgfCAxMzQpCisjZGVmaW5lCVJJT19TRVRfQllURV9NT0RFIChSSU9DIHwgMTM1KQorI2RlZmluZQlSSU9fU0VUX1dPUkRfTU9ERSAoUklPQyB8IDEzNikKKyNkZWZpbmUgUklPX1NUUkVBTV9JTkZPICAgKFJJT0MgfCAxMzcpCisjZGVmaW5lCVJJT19TVEFSVF9QT0xMRVIgIChSSU9DIHwgMTM4KQorI2RlZmluZQlSSU9fU1RPUF9QT0xMRVIgICAoUklPQyB8IDEzOSkKKyNkZWZpbmUJUklPX0xBU1RfRVJST1IgICAgKFJJT0MgfCAxNDApCisjZGVmaW5lCVJJT19USUNLCSAgKFJJT0MgfCAxNDEpCisjZGVmaW5lCVJJT19UT0NLCSAgKFJJT0MgfCAyNDEpCS8qIEkgZGlkIHRoaXMgb24gcHVycG9zZSwgeW91IGtub3cuICovCisjZGVmaW5lCVJJT19TRU5EX1BBQ0tFVCAgIChSSU9DIHwgMTQyKQorI2RlZmluZQlSSU9fU0VUX0JVU1kJICAoUklPQyB8IDE0MykKKyNkZWZpbmUJU1BFQ0lBTF9SVVBfQ01EICAgKFJJT0MgfCAxNDQpCisjZGVmaW5lCVJJT19GT0FEX1JUQSAgICAgIChSSU9DIHwgMTQ1KQorI2RlZmluZQlSSU9fWk9NQklFX1JUQSAgICAoUklPQyB8IDE0NikKKyNkZWZpbmUgUklPX0lERU5USUZZX1JUQSAgKFJJT0MgfCAxNDcpCisjZGVmaW5lIFJJT19LSUxMX05FSUdIQk9VUiAoUklPQyB8IDE0OCkKKyNkZWZpbmUgUklPX0RFQlVHX01FTSAgICAgKFJJT0MgfCAxNDkpCisvKgorKiogMTUwIC0gMTY3IHVzZWQuLi4uLiAgIFNlZSBiZWxvdworKi8KKyNkZWZpbmUgUklPX0dFVF9QT1JUX1NFVFVQIChSSU9DIHwgMTY4KQorI2RlZmluZSBSSU9fUkVTVU1FICAgICAgICAoUklPQyB8IDE2OSkKKyNkZWZpbmUJUklPX01FU0cJKFJJT0MgfCAxNzApCisjZGVmaW5lCVJJT19OT19NRVNHCShSSU9DIHwgMTcxKQorI2RlZmluZQlSSU9fV0hBVF9NRVNHCShSSU9DIHwgMTcyKQorI2RlZmluZSBSSU9fSE9TVF9EUFJBTQkoUklPQyB8IDE3MykKKyNkZWZpbmUgUklPX01BUF9CNTBfVE9fNTAJKFJJT0MgfCAxNzQpCisjZGVmaW5lIFJJT19NQVBfQjUwX1RPXzU3NjAwCShSSU9DIHwgMTc1KQorI2RlZmluZSBSSU9fTUFQX0IxMTBfVE9fMTEwCShSSU9DIHwgMTc2KQorI2RlZmluZSBSSU9fTUFQX0IxMTBfVE9fMTE1MjAwCShSSU9DIHwgMTc3KQorI2RlZmluZSBSSU9fR0VUX1BPUlRfUEFSQU1TCShSSU9DIHwgMTc4KQorI2RlZmluZSBSSU9fU0VUX1BPUlRfUEFSQU1TCShSSU9DIHwgMTc5KQorI2RlZmluZSBSSU9fR0VUX1BPUlRfVFRZCShSSU9DIHwgMTgwKQorI2RlZmluZSBSSU9fU0VUX1BPUlRfVFRZCShSSU9DIHwgMTgxKQorI2RlZmluZSBSSU9fU1lTTE9HX09OTFkJKFJJT0MgfCAxODIpCisjZGVmaW5lIFJJT19TWVNMT0dfQ09OUwkoUklPQyB8IDE4MykKKyNkZWZpbmUgUklPX0NPTlNfT05MWQkoUklPQyB8IDE4NCkKKyNkZWZpbmUgUklPX0JMT0NLX09QRU5TCShSSU9DIHwgMTg1KQorCisvKgorKiogMDIuMDMuMTk5OSBBUkcgLSBFU0lMIDA4MjAgZml4IDoKKyoqIFJJT0Jvb3RNb2RlIGlzIG5vIGxvbmdlciB1c2UgYnkgdGhlIGRyaXZlciwgc28gdGhlc2UgaW9jdGxzCisqKiBhcmUgbm93IG9ic29sZXRlIDoKKyoqCisjZGVmaW5lIFJJT19HRVRfQk9PVF9NT0RFCShSSU9DIHwgMTg2KQorI2RlZmluZSBSSU9fU0VUX0JPT1RfTU9ERQkoUklPQyB8IDE4NykKKyoqCisqLworCisjZGVmaW5lIFJJT19NRU1fRFVNUAkoUklPQyB8IDE4OSkKKyNkZWZpbmUgUklPX1JFQURfUkVHSVNURVIJKFJJT0MgfCAxOTApCisjZGVmaW5lIFJJT19HRVRfTU9EVFlQRQkoUklPQyB8IDE5MSkKKyNkZWZpbmUgUklPX1NFVF9USU1FUgkoUklPQyB8IDE5MikKKyNkZWZpbmUgUklPX1JFQURfQ0hFQ0sJKFJJT0MgfCAxOTYpCisjZGVmaW5lIFJJT19XQUlUSU5HX0ZPUl9SRVNUQVJUCShSSU9DIHwgMTk3KQorI2RlZmluZSBSSU9fQklORF9SVEEJKFJJT0MgfCAxOTgpCisjZGVmaW5lIFJJT19HRVRfQklORElOR1MJKFJJT0MgfCAxOTkpCisjZGVmaW5lIFJJT19QVVRfQklORElOR1MJKFJJT0MgfCAyMDApCisKKyNkZWZpbmUJUklPX01BS0VfREVWCQkoUklPQyB8IDIwMSkKKyNkZWZpbmUJUklPX01JTk9SCQkoUklPQyB8IDIwMikKKworI2RlZmluZQlSSU9fSURFTlRJRllfRFJJVkVSCShSSU9DIHwgMjAzKQorI2RlZmluZQlSSU9fRElTUExBWV9IT1NUX0NGRwkoUklPQyB8IDIwNCkKKworCisvKgorKiogTUFLRV9ERVYgLyBNSU5PUiBzdHVmZgorKi8KKyNkZWZpbmUJUklPX0RFVl9ESVJFQ1QJCTB4MDAwMAorI2RlZmluZQlSSU9fREVWX01PREVNCQkweDAyMDAKKyNkZWZpbmUJUklPX0RFVl9YUFJJTlQJCTB4MDQwMAorI2RlZmluZQlSSU9fREVWX01BU0sJCTB4MDYwMAorCisvKgorKiogcG9ydCBtYW5hZ2VtZW50LCB4cHJpbnQgc3R1ZmYKKyovCisjZGVmaW5lCXJJT0NOKE4pCShSSU9DfChOKSkKKyNkZWZpbmUJcklPQ1IoTixUKQkoUklPQ3woTikpCisjZGVmaW5lCXJJT0NXKE4sVCkJKFJJT0N8KE4pKQorCisjZGVmaW5lCVJJT19HRVRfWFBfT04gICAgIHJJT0NSKDE1MCxjaGFyWzE2XSkJLyogc3RhcnQgeHByaW50IHN0cmluZyAqLworI2RlZmluZQlSSU9fU0VUX1hQX09OICAgICBySU9DVygxNTEsY2hhclsxNl0pCisjZGVmaW5lCVJJT19HRVRfWFBfT0ZGICAgIHJJT0NSKDE1MixjaGFyWzE2XSkJLyogZmluaXNoIHhwcmludCBzdHJpbmcgKi8KKyNkZWZpbmUJUklPX1NFVF9YUF9PRkYgICAgcklPQ1coMTUzLGNoYXJbMTZdKQorI2RlZmluZQlSSU9fR0VUX1hQX0NQUyAgICBySU9DUigxNTQsaW50KQkvKiB4cHJpbnQgQ1BTICovCisjZGVmaW5lCVJJT19TRVRfWFBfQ1BTICAgIHJJT0NXKDE1NSxpbnQpCisjZGVmaW5lIFJJT19HRVRfSVhBTlkgICAgIHJJT0NSKDE1NixpbnQpCS8qIGl4YW55IGFsbG93ZWQ/ICovCisjZGVmaW5lIFJJT19TRVRfSVhBTlkgICAgIHJJT0NXKDE1NyxpbnQpCisjZGVmaW5lIFJJT19TRVRfSVhBTllfT04gIHJJT0NOKDE1OCkJCS8qIGFsbG93IGl4YW55ICovCisjZGVmaW5lIFJJT19TRVRfSVhBTllfT0ZGIHJJT0NOKDE1OSkJCS8qIGRpc2FsbG93IGl4YW55ICovCisjZGVmaW5lIFJJT19HRVRfTU9ERU0gICAgIHJJT0NSKDE2MCxpbnQpCS8qIHBvcnQgaXMgbW9kZW0vZGlyZWN0IGxpbmU/ICovCisjZGVmaW5lIFJJT19TRVRfTU9ERU0gICAgIHJJT0NXKDE2MSxpbnQpCisjZGVmaW5lIFJJT19TRVRfTU9ERU1fT04gIHJJT0NOKDE2MikJCS8qIHBvcnQgaXMgYSBtb2RlbSAqLworI2RlZmluZSBSSU9fU0VUX01PREVNX09GRiBySU9DTigxNjMpCQkvKiBwb3J0IGlzIGRpcmVjdCAqLworI2RlZmluZSBSSU9fR0VUX0lYT04gICAgICBySU9DUigxNjQsaW50KQkvKiBpeG9uIGFsbG93ZWQ/ICovCisjZGVmaW5lIFJJT19TRVRfSVhPTiAgICAgIHJJT0NXKDE2NSxpbnQpCisjZGVmaW5lIFJJT19TRVRfSVhPTl9PTiAgIHJJT0NOKDE2NikJCS8qIGFsbG93IGl4b24gKi8KKyNkZWZpbmUgUklPX1NFVF9JWE9OX09GRiAgcklPQ04oMTY3KQkJLyogZGlzYWxsb3cgaXhvbiAqLworCisjZGVmaW5lIFJJT19HRVRfU0lWSUVXCSAgKCgoJ3MnKTw8OCkgfCAxMDYpCS8qIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggU0kgKi8KKworI2RlZmluZQlSSU9fSU9DVExfVU5LTk9XTgktMgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZGF0YS5oIGIvZHJpdmVycy9jaGFyL3Jpby9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiYzJkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vZGF0YS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IGRhdGEuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MDkKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKKyoqCisqKiAgaWRlbnQgQCgjKWRhdGEuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb19kYXRhZGV4X18KKyNkZWZpbmUgX19yaW9fZGF0YWRleF9fCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgKl9kYXRhX2hfc2Njc18gPSAiQCgjKWRhdGEuaAkxLjIiOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9kZWJ1Zy5oIGIvZHJpdmVycy9jaGFyL3Jpby9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZTBkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2RlYnVnLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyoqIEZpbGU6CQlkZWJ1Zy5oCisqKgorKiogQXV0aG9yOgkJRGF2aWQgRGl4CisqKgorKiogQ3JlYXRlZDoJCTEydGggTWFyY2ggMTk5MworKioKKyoqIExhc3QgbW9kaWZpZWQ6CTkzLzA0LzI3CisqKgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaWZuZGVmIF9kZWJ1Z19oXworI2RlZmluZSBfZGVidWdfaF8KKworCisjaWYgZGVmaW5lZChEQ0lSUlVTKQorI2RlZmluZQlEQlBBQ0tFVChwa3QsIG9wdCwgc3RyLCBjaG4pIAlkZWJ1Z19wYWNrZXQoKHBrdCksIChvcHQpLCAoc3RyKSwgKGNobikpCisjZWxzZQorI2RlZmluZQlEQlBBQ0tFVChwa3QsIG9wdCwgc3RyLCBjKQorI2VuZGlmCS8qIERDSVJSVVMgKi8KKworCisjZW5kaWYJLyogX2RlYnVnX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2RlZmF1bHRzLmggYi9kcml2ZXJzL2NoYXIvcmlvL2RlZmF1bHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3MzA5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vZGVmYXVsdHMuaApAQCAtMCwwICsxLDU5IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICBEIEUgRiBBIFUgTCBUIFMKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1MKK3N0YXRpYyBjaGFyICpfcmlvX2RlZmF1bHRzX2hfc2NjcyA9ICJAKCMpZGVmYXVsdHMuaAkxLjEiIDsKKyNlbmRpZgorI2VuZGlmCisKKworI2RlZmluZSBNSUxMSVNFQ09ORCAgICAgICAgICAgKGludCkgKDEwMDAvNjQpICAgLyogMTUuNjI1IGxvdyB0aWNrcyAqLworI2RlZmluZSBTRUNPTkQgICAgICAgICAgICAgICAgKGludCkgMTU2MjUgICAgICAgLyogTG93IHByaW9yaXR5IHRpY2tzICovCisKKyNpZmRlZiBSVEEKKyNkZWZpbmUgUlhfTElNSVQgICAgICAgKHVzaG9ydCkgMworI2VuZGlmCisjaWZkZWYgSE9TVAorI2RlZmluZSBSWF9MSU1JVCAgICAgICAodXNob3J0KSAxCisjZW5kaWYKKworI2RlZmluZSBMSU5LX1RJTUVPVVQgICAgICAgICAgKGludCkgKFBPTExfUEVSSU9EIC8gMikKKworCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZWlzYS5oIGIvZHJpdmVycy9jaGFyL3Jpby9laXNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzNzFiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vZWlzYS5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IGVpc2EuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTAKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKKyoqCisqKiAgaWRlbnQgQCgjKWVpc2EuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb19laXNhX2hfXworI2RlZmluZSBfX3Jpb19laXNhX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgKl9laXNhX2hfc2Njc18gPSAiQCgjKWVpc2EuaAkxLjIiOworI2VuZGlmCisjZW5kaWYKKworLyoKKyoqIHRoaW5ncyB0byBkbyB3aXRoIHRoZSBFSVNBIGJ1cworKi8KKworI2RlZmluZSBSSU9fRUlTQV9TVFJJTkdfQUREUkVTUyAJMHhmZmZkOQkvKiB3aGVyZSBFSVNBIGlzIHN0b3JlZCAqLworCisjZGVmaW5lCVJJT19NQVhfRUlTQV9TTE9UUwkJMTYJLyogaG93IG1hbnkgRUlTQSBzbG90cz8gKi8KKworI2RlZmluZQlSSU9fRUlTQV9JREVOVAkJCTB4OTg0RAkvKiBTcGVjaWFsaXggKi8KKyNkZWZpbmUJUklPX0VJU0FfUFJPRFVDVF9DT0RFCQkweDE0CS8qIENvZGUgMTQgKi8KKyNkZWZpbmUJUklPX0VJU0FfRU5BQkxFX0JJVAkJMHgwMQkvKiBUbyBlbmFibGUgY2FyZCAqLworCisjZGVmaW5lCUVJU0FfTUVNT1JZX0JBU0VfTE8JCTB4QzAwCS8qIEExNi1BMjMgKi8KKyNkZWZpbmUJRUlTQV9NRU1PUllfQkFTRV9ISQkJMHhDMDEJLyogQTI0LUEzMSAqLworI2RlZmluZQlFSVNBX0lOVEVSUlVQVF9WRUMJCTB4QzAyCS8qIHNlZSBiZWxvdyAqLworI2RlZmluZQlFSVNBX0NPTlRST0xfUE9SVAkJMHhDMDIJLyogc2VlIGJlbG93ICovCisjZGVmaW5lCUVJU0FfSU5URVJSVVBUX1JFU0VUCQkweEMwMwkvKiByZWFkIHRvIGNsZWFyIElSUSAqLworCisjZGVmaW5lCUVJU0FfUFJPRFVDVF9JREVOVF9MTwkJMHhDODAJLyogd2hlcmUgUklPX0VJU0FfSURFTlQgaXMgKi8KKyNkZWZpbmUJRUlTQV9QUk9EVUNUX0lERU5UX0hJCQkweEM4MQorI2RlZmluZQlFSVNBX1BST0RVQ1RfTlVNQkVSCQkweEM4MiAgIC8qIHdoZXJlIFBST0RfQ09ERSBpcyAqLworI2RlZmluZQlFSVNBX1JFVklTSU9OX05VTUJFUgkJMHhDODMJLyogcmV2aXNpb24gKDFkcCkgKi8KKyNkZWZpbmUJRUlTQV9FTkFCTEUJCQkweEM4NAkvKiBzZXQgTFNCIHRvIGVuYWJsZSBjYXJkICovCisjZGVmaW5lCUVJU0FfVU5JUVVFX05VTV8wCQkweEM4OAkvKiB2b21pdCAqLworI2RlZmluZQlFSVNBX1VOSVFVRV9OVU1fMQkJMHhDOEEKKyNkZWZpbmUJRUlTQV9VTklRVUVfTlVNXzIJCTB4QzkwCS8qIGJpdCBzdHJhbmdlbHkgYXJyYW5nZWQgKi8KKyNkZWZpbmUJRUlTQV9VTklRVUVfTlVNXzMJCTB4QzkyCisjZGVmaW5lCUVJU0FfTUFOVUZfWUVBUgkJCTB4Qzk4CS8qIHdoZW4gKi8KKyNkZWZpbmUJRUlTQV9NQU5VRl9XRUVLCQkJMHhDOUEJLyogbW9yZSB3aGVuICovCisKKyNkZWZpbmUJRUlTQV9UUF9CT09UX0ZST01fUkFNCTB4MDEKKyNkZWZpbmUJRUlTQV9UUF9CT09UX0ZST01fTElOSwkweDAwCisjZGVmaW5lCUVJU0FfVFBfRkFTVF9MSU5LUwkweDAyCisjZGVmaW5lCUVJU0FfVFBfU0xPV19MSU5LUwkweDAwCisjZGVmaW5lCUVJU0FfVFBfQlVTX0VOQUJMRQkweDA0CisjZGVmaW5lCUVJU0FfVFBfQlVTX0RJU0FCTEUJMHgwMAorI2RlZmluZQlFSVNBX1RQX1JVTgkJMHgwOAorI2RlZmluZQlFSVNBX1RQX1JFU0VUCQkweDAwCisjZGVmaW5lCUVJU0FfUE9MTEVECQkweDAwCisjZGVmaW5lCUVJU0FfSVJRXzMJCTB4MzAKKyNkZWZpbmUJRUlTQV9JUlFfNAkJMHg0MAorI2RlZmluZQlFSVNBX0lSUV81CQkweDUwCisjZGVmaW5lCUVJU0FfSVJRXzYJCTB4NjAKKyNkZWZpbmUJRUlTQV9JUlFfNwkJMHg3MAorI2RlZmluZQlFSVNBX0lSUV85CQkweDkwCisjZGVmaW5lCUVJU0FfSVJRXzEwCQkweEEwCisjZGVmaW5lCUVJU0FfSVJRXzExCQkweEIwCisjZGVmaW5lCUVJU0FfSVJRXzEyCQkweEMwCisjZGVmaW5lCUVJU0FfSVJRXzE0CQkweEUwCisjZGVmaW5lCUVJU0FfSVJRXzE1CQkweEYwCisKKyNkZWZpbmUJRUlTQV9JTlRFUlJVUFRfTUFTSwkweEYwCisjZGVmaW5lCUVJU0FfQ09OVFJPTF9NQVNLCTB4MEYKKworI2RlZmluZQlSSU9fRUlTQV9ERUZBVUxUX01PREUJRUlTQV9UUF9TTE9XX0xJTktTCisKKyNkZWZpbmUJUklPRWlzYVRvSXZlYyhYKQkodWNoYXIgKSgodWNoYXIpKChYKSAmIEVJU0FfSU5URVJSVVBUX01BU0spPj40KQorCisjZGVmaW5lCUlOQlooeix4KQlpbmIoKCh6KTw8MTIpIHwgKHgpKQorI2RlZmluZQlPVVRCWih6LHgseSkJb3V0YigoKCh6KTw8MTIpIHwgKHgpKSwgeSkKKworI2VuZGlmIC8qIF9fcmlvX2Vpc2FfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2VuYWJsZS5oIGIvZHJpdmVycy9jaGFyL3Jpby9lbmFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTlhNDE5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vZW5hYmxlLmgKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgIEUgTiBBIEIgTCBFICAgSCBFIEEgRCBFIFIgUworICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDUworc3RhdGljIGNoYXIgKl9yaW9fZW5hYmxlX2hfc2NjcyA9ICJAKCMpZW5hYmxlLmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisKKyNkZWZpbmUgRU5BQkxFX0xUVCAgVFJVRQorI2RlZmluZSBFTkFCTEVfTFJUICBUUlVFCisKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZXJyb3IuaCBiL2RyaXZlcnMvY2hhci9yaW8vZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk0MzhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9lcnJvci5oCkBAIC0wLDAgKzEsODUgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgRSBSIFIgTyBSICBIIEUgQSBEIEUgUiAgIEYgSSBMIEUKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKl9yaW9fZXJyb3JfaF9zY2NzID0gIkAoIyllcnJvci5oCTEuMyI7ICovCisjZW5kaWYKKworI2RlZmluZSBFX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMCkKKyNkZWZpbmUgRV9QUk9DRVNTX05PVF9JTklUICAgICAgICAgICAgICAgKCh1c2hvcnQpIDEpCisjZGVmaW5lIEVfTElOS19USU1FT1VUICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAyKQorI2RlZmluZSBFX05PX1JPVVRFICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMykKKyNkZWZpbmUgRV9DT05GVVNFRCAgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDQpCisjZGVmaW5lIEVfSE9NRSAgICAgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSA1KQorI2RlZmluZSBFX0NTVU1fRkFJTCAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgNikKKyNkZWZpbmUgRV9ESVNDT05ORUNURUQgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDcpCisjZGVmaW5lIEVfQkFEX1JVUCAgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSA4KQorI2RlZmluZSBFX05PX1ZJUkdJTiAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgOSkKKyNkZWZpbmUgRV9CT09UX1JVUF9CVVNZICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDEwKQorCisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogUGFyc2VkIHRvIG1lbV9oYWx0KCkKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBFX0NIQU5BTExPQyAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4MCkKKyNkZWZpbmUgRV9QT0xMX0FMTE9DICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4ODEpCisjZGVmaW5lIEVfTFRUV0FLRSAgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDgyKQorI2RlZmluZSBFX0xUVF9BTExPQyAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4MykKKyNkZWZpbmUgRV9MUlRfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4ODQpCisjZGVmaW5lIEVfQ0lSUlVTICAgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDg1KQorI2RlZmluZSBFX01PTklUT1IgICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4NikKKyNkZWZpbmUgRV9QSEJfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4ODcpCisjZGVmaW5lIEVfQVJSQVlfQUxMT0MgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDg4KQorI2RlZmluZSBFX1FCVUZfQUxMT0MgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4OSkKKyNkZWZpbmUgRV9QS1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4OGEpCisjZGVmaW5lIEVfR0VUX1RYX1FfQlVGICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDhiKQorI2RlZmluZSBFX0dFVF9SWF9RX0JVRiAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4YykKKyNkZWZpbmUgRV9NRU1fT1VUICAgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4OGQpCisjZGVmaW5lIEVfTU1VX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDhlKQorI2RlZmluZSBFX0xUVF9JTklUICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4ZikKKyNkZWZpbmUgRV9MUlRfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4OTApCisjZGVmaW5lIEVfTElOS19SVU4gICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDkxKQorI2RlZmluZSBFX01PTklUT1JfQUxMT0MgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg5MikKKyNkZWZpbmUgRV9NT05JVE9SX0lOSVQgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4OTMpCisjZGVmaW5lIEVfUE9MTF9JTklUICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDk0KQorCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZXJyb3JzLmggYi9kcml2ZXJzL2NoYXIvcmlvL2Vycm9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjBiOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2Vycm9ycy5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBlcnJvcnMuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTAKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKKyoqCisqKiAgaWRlbnQgQCgjKWVycm9ycy5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9fcmlvX2Vycm9yc19oX18KKyNkZWZpbmUJX19yaW9fZXJyb3JzX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgKl9lcnJvcnNfaF9zY2NzXyA9ICJAKCMpZXJyb3JzLmgJMS4yIjsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisqKiBlcnJvciBjb2RlcworKi8KKworI2RlZmluZQlOT1RISU5HX1dST05HX0FUX0FMTAkJMAorI2RlZmluZQlCQURfQ0hBUkFDVEVSX0lOX05BTUUJCTEKKyNkZWZpbmUJVEFCTEVfRU5UUllfSVNOVF9QUk9QRVJMWV9OVUxMCTIKKyNkZWZpbmUJVU5LTk9XTl9IT1NUX05VTUJFUgkJMworI2RlZmluZQlaRVJPX1JUQV9JRAkJCTQKKyNkZWZpbmUJQkFEX1JUQV9JRAkJCTUKKyNkZWZpbmUJRFVQTElDQVRFRF9SVEFfSUQJCTYKKyNkZWZpbmUJRFVQTElDQVRFX1VOSVFVRV9OVU1CRVIJCTcKKyNkZWZpbmUJQkFEX1RUWV9OVU1CRVIJCQk4CisjZGVmaW5lCVRUWV9OVU1CRVJfSU5fVVNFCQk5CisjZGVmaW5lCU5BTUVfVVNFRF9UV0lDRQkJCTEwCisjZGVmaW5lCUhPU1RfSURfTk9UX1pFUk8JCTExCisjZGVmaW5lCUJPT1RfSU5fUFJPR1JFU1MJCTEyCisjZGVmaW5lCUNPUFlJTl9GQUlMRUQJCQkxMworI2RlZmluZQlIT1NUX0ZJTEVfVE9PX0xBUkdFCQkxNAorI2RlZmluZQlDT1BZT1VUX0ZBSUxFRAkJCTE1CisjZGVmaW5lCU5PVF9TVVBFUl9VU0VSCQkJMTYKKyNkZWZpbmUJUklPX0FMUkVBRFlfUE9MTElORwkJMTcKKworI2RlZmluZQlJRF9OVU1CRVJfT1VUX09GX1JBTkdFCQkxOAorI2RlZmluZSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0UJMTkKKyNkZWZpbmUJSE9TVF9OVU1CRVJfT1VUX09GX1JBTkdFCTIwCisjZGVmaW5lCVJVUF9OVU1CRVJfT1VUX09GX1JBTkdFCQkyMQorI2RlZmluZQlUVFlfTlVNQkVSX09VVF9PRl9SQU5HRQkJMjIKKyNkZWZpbmUJTElOS19OVU1CRVJfT1VUX09GX1JBTkdFCTIzCisKKyNkZWZpbmUJSE9TVF9OT1RfUlVOTklORwkJMjQKKyNkZWZpbmUJSU9DVExfQ09NTUFORF9VTktOT1dOCQkyNQorI2RlZmluZQlSSU9fU1lTVEVNX0hBTFRFRAkJMjYKKyNkZWZpbmUJV0FJVF9GT1JfRFJBSU5fQlJPS0VOCQkyNworI2RlZmluZQlQT1JUX05PVF9NQVBQRURfSU5UT19TWVNURU0JMjgKKyNkZWZpbmUJRVhDTFVTSVZFX1VTRV9TRVQJCTI5CisjZGVmaW5lCVdBSVRfRk9SX05PVF9DTE9TSU5HX0JST0tFTgkzMAorI2RlZmluZQlXQUlUX0ZPUl9QT1JUX1RPX09QRU5fQlJPS0VOCTMxCisjZGVmaW5lCVdBSVRfRk9SX0NBUlJJRVJfQlJPS0VOCQkzMgorI2RlZmluZQlXQUlUX0ZPUl9OT1RfSU5fVVNFX0JST0tFTgkzMworI2RlZmluZQlXQUlUX0ZPUl9DQU5fQUREX0NPTU1BTkRfQlJPS0VOCTM0CisjZGVmaW5lCVdBSVRfRk9SX0FERF9DT01NQU5EX0JST0tFTgkzNQorI2RlZmluZQlXQUlUX0ZPUl9OT1RfUEFSQU1fQlJPS0VOCTM2CisjZGVmaW5lCVdBSVRfRk9SX1JFVFJZX0JST0tFTgkJMzcKKyNkZWZpbmUJSE9TVF9IQVNfQUxSRUFEWV9CRUVOX0JPT1RFRAkzOAorI2RlZmluZQlVTklUX0lTX0lOX1VTRQkJCTM5CisjZGVmaW5lCUNPVUxETlRfRklORF9FTlRSWQkJNDAKKyNkZWZpbmUJUlRBX1VOSVFVRV9OVU1CRVJfWkVSTwkJNDEKKyNkZWZpbmUJQ0xPU0VfQ09NTUFORF9GQUlMRUQJCTQyCisjZGVmaW5lCVdBSVRfRk9SX0NMT1NFX0JST0tFTgkJNDMKKyNkZWZpbmUJQ1BTX1ZBTFVFX09VVF9PRl9SQU5HRQkJNDQKKyNkZWZpbmUJSURfQUxSRUFEWV9JTl9VU0UJCTQ1CisjZGVmaW5lCVNJR05BTFNfQUxSRUFEWV9TRVQJCTQ2CisjZGVmaW5lCU5PVF9SRUNFSVZJTkdfUFJPQ0VTUwkJNDcKKyNkZWZpbmUJUlRBX05VTUJFUl9XUk9ORwkJNDgKKyNkZWZpbmUgTk9fU1VDSF9QUk9EVUNUCQkJNDkKKyNkZWZpbmUJSE9TVF9TWVNQT1JUX0JBRAkJNTAKKyNkZWZpbmUJSURfTk9UX1RFTlRBVElWRQkJNTEKKyNkZWZpbmUgWFBSSU5UX0NQU19PVVRfT0ZfUkFOR0UJCTUyCisjZGVmaW5lCU5PVF9FTk9VR0hfQ09SRV9GT1JfUENJX0NPUFkJNTMKKworCisjZW5kaWYgLyogX19yaW9fZXJyb3JzX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9mb3JtcGt0LmggYi9kcml2ZXJzL2NoYXIvcmlvL2Zvcm1wa3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGI2NWFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9mb3JtcGt0LmgKQEAgLTAsMCArMSwxNTQgQEAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgRiBPIFIgTSAgIFAgQSBDIEsgRSBUICAgSCBFIEEgRCBFIFIgICBGIEkgTCBFCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9mb3JtcGt0X2gKKyNkZWZpbmUgX2Zvcm1wa3RfaCAxCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1MKK3N0YXRpYyBjaGFyICpfcmlvX2Zvcm1wa3RfaF9zY2NzID0gIkAoIylmb3JtcGt0LmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBGT1JNX0JPT1RfUEtUXzEgRk9STV9CT09UX1BLVF8xIDsKK3N0cnVjdCBGT1JNX0JPT1RfUEtUXzEgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHBrdF9udW1iZXIgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHBrdF90b3RhbCA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgYm9vdF90b3AgOworICAgICAgICAgICAgICAgICAgICAgICB9IDsKKwordHlwZWRlZiBzdHJ1Y3QgRk9STV9CT09UX1BLVF8yIEZPUk1fQk9PVF9QS1RfMiA7CitzdHJ1Y3QgRk9STV9CT09UX1BLVF8yIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBwa3RfbnVtYmVyIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBib290X2RhdGFbMTBdIDsKKyAgICAgICAgICAgICAgICAgICAgICAgfSA7CisKKwordHlwZWRlZiBzdHJ1Y3QgRk9STV9BVFRBQ0hfUlRBICAgRk9STV9BVFRBQ0hfUlRBIDsKK3N0cnVjdCBGT1JNX0FUVEFDSF9SVEEgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBjbWRfY29kZSA7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgYm9vdGVyX3NlcmlhbFs0XSA7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgYm9vdGVyX2xpbmsgOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGJvb3RlZV9zZXJpYWxbNF0gOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGJvb3RlZV9saW5rIDsKKyAgICAgICAgICAgICAgICAgICB9IDsKKworCit0eXBlZGVmIHN0cnVjdCBGT1JNX0JPT1RfSUQgICBGT1JNX0JPT1RfSUQgOworc3RydWN0IEZPUk1fQk9PVF9JRCAgeworICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGNtZF9jb2RlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBib290ZWVfc2VyaWFsWzRdIDsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBib290ZWVfcHJvZF9pZCA7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgYm9vdGVlX2xpbmsgOworICAgICAgICAgICAgICAgICAgIH0gOworCisKKwordHlwZWRlZiBzdHJ1Y3QgRk9STV9ST1VURV8xICAgRk9STV9ST1VURV8xIDsKK3N0cnVjdCBGT1JNX1JPVVRFXzEgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgY21kX2NvZGUgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgcGt0X251bWJlciA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICB0b3RhbF9pbl9zZXF1ZW5jZSA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICB1bml0X2lkIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgIGhvc3RfdW5pdF9pZCA7CisgICAgICAgICAgICAgICAgICAgIH0gOworCit0eXBlZGVmIHN0cnVjdCBGT1JNX1JPVVRFXzIgICBGT1JNX1JPVVRFXzIgOworc3RydWN0IEZPUk1fUk9VVEVfMiB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgY21kX2NvZGUgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHBrdF9udW1iZXIgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHRvdGFsX2luX3NlcXVlbmNlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICByb3V0ZV9kYXRhWzldIDsKKyAgICAgICAgICAgICAgICAgICAgfSA7CisKK3R5cGVkZWYgc3RydWN0IEZPUk1fUk9VVEVfUkVRICAgRk9STV9ST1VURV9SRVEgOworc3RydWN0IEZPUk1fUk9VVEVfUkVRIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIGNtZF9jb2RlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHBrdF9udW1iZXIgOworICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgdG90YWxfaW5fc2VxdWVuY2UgOworICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgcm91dGVfZGF0YVsxMF0gOworICAgICAgICAgICAgICAgICAgICAgIH0gOworCisKK3R5cGVkZWYgc3RydWN0IEZPUk1fRVJST1IgICBGT1JNX0VSUk9SIDsKK3N0cnVjdCBGT1JNX0VSUk9SIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBjbWRfY29kZSA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgZXJyb3JfY29kZSA7CisKKyAgICAgICAgICAgICAgICAgICAgfSA7CisKK3R5cGVkZWYgc3RydWN0IEZPUk1fU1RBVFVTICAgRk9STV9TVEFUVVMgOworc3RydWN0IEZPUk1fU1RBVFVTIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBjbWRfY29kZSA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgc3RhdHVzX2NvZGUgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIGxhc3RfcGFja2V0X3ZhbGlkIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICB0eF9idWZmZXIgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHJ4X2J1ZmZlciA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgcG9ydF9zdGF0dXMgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHBoYl9zdGF0dXMgOworICAgICAgICAgICAgICAgICAgICB9IDsKKworCit0eXBlZGVmIHN0cnVjdCBGT1JNX0xJTktfU1RBVFVTICAgRk9STV9MSU5LX1NUQVRVUyA7CitzdHJ1Y3QgRk9STV9MSU5LX1NUQVRVUyB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGNtZF9jb2RlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgc3RhdHVzX2NvZGUgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBsaW5rX251bWJlciA7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgIHJ4X2Vycm9ycyA7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgIHR4X2Vycm9ycyA7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgIGNzdW1fZXJyb3JzIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCAgZGlzY29ubmVjdHMgOworICAgICAgICAgICAgICAgICAgICB9IDsKKworCisKK3R5cGVkZWYgc3RydWN0IEZPUk1fUEFSVElUSU9OIEZPUk1fUEFSVElUSU9OIDsKK3N0cnVjdCBGT1JNX1BBUlRJVElPTiB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGNtZF9jb2RlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgc3RhdHVzX2NvZGUgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBwb3J0X251bWJlciA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIHR4X21heCA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIHJ4X21heCA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIHJ4X2xpbWl0IDsKKyAgICAgICAgICAgICAgICAgICAgICB9IDsKKworCisjZW5kaWYKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2Z1bmMuaCBiL2RyaXZlcnMvY2hhci9yaW8vZnVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZjM4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2Z1bmMuaApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogZnVuYy5oCisqKglTSUQJCTogMS4zCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxMAorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMQorKioKKyoqICBpZGVudCBAKCMpZnVuYy5oCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fZnVuY19oX2RlZgorI2RlZmluZSBfX2Z1bmNfaF9kZWYKKworI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgKl9mdW5jX2hfc2Njc18gPSAiQCgjKWZ1bmMuaAkxLjMiOworI2VuZGlmCisjZW5kaWYKKworLyogcmlvYm9vdC5jICovCitpbnQgUklPQm9vdENvZGVSVEEoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBEb3duTG9hZCAqKTsKK2ludCBSSU9Cb290Q29kZUhPU1Qoc3RydWN0IHJpb19pbmZvICosIHJlZ2lzdGVyIHN0cnVjdCBEb3duTG9hZCAqKTsKK2ludCBSSU9Cb290Q29kZVVOS05PV04oc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBEb3duTG9hZCAqKTsKK3ZvaWQgbXNlY190aW1lb3V0KHN0cnVjdCBIb3N0ICopOworaW50IFJJT0Jvb3RSdXAoc3RydWN0IHJpb19pbmZvICosIHVpbnQsIHN0cnVjdCBIb3N0ICosIHN0cnVjdCBQS1QgKik7CitpbnQgUklPQm9vdE9rKHN0cnVjdCByaW9faW5mbyAqLHN0cnVjdCBIb3N0ICosIHVsb25nKTsKK2ludCBSSU9SdGFCb3VuZChzdHJ1Y3QgcmlvX2luZm8gKiwgdWludCk7IAordm9pZCBGaWxsU2xvdChpbnQsIGludCwgdWludCwgc3RydWN0IEhvc3QgKik7CisKKy8qIHJpb2NtZC5jICovCitpbnQgUklPRm9hZFJ0YShzdHJ1Y3QgSG9zdCAqLCBzdHJ1Y3QgTWFwICopOworaW50IFJJT1pvbWJpZVJ0YShzdHJ1Y3QgSG9zdCAqLCBzdHJ1Y3QgTWFwICopOworaW50IFJJT0NvbW1hbmRSdGEoc3RydWN0IHJpb19pbmZvICosIHVpbnQsIGludCAoKiBmdW5jKSggc3RydWN0IEhvc3QgKiwgCisJCQkJCQkJCXN0cnVjdCBNYXAgKikpOworaW50IFJJT0lkZW50aWZ5UnRhKHN0cnVjdCByaW9faW5mbyAqLCBjYWRkcl90KTsgCitpbnQgUklPS2lsbE5laWdoYm91cihzdHJ1Y3QgcmlvX2luZm8gKiwgY2FkZHJfdCk7CitpbnQgUklPU3VzcGVuZEJvb3RSdGEoc3RydWN0IEhvc3QgKiwgaW50LCBpbnQpOworaW50IFJJT0ZvYWRXYWtldXAoc3RydWN0IHJpb19pbmZvICopOworc3RydWN0IENtZEJsayAqIFJJT0dldENtZEJsayh2b2lkKTsKK3ZvaWQgUklPRnJlZUNtZEJsayhzdHJ1Y3QgQ21kQmxrICopOworaW50IFJJT1F1ZXVlQ21kQmxrKHN0cnVjdCBIb3N0ICosIHVpbnQsIHN0cnVjdCBDbWRCbGsgKik7Cit2b2lkIFJJT1BvbGxIb3N0Q29tbWFuZHMoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBIb3N0ICopOworaW50IFJJT1dGbHVzaE1hcmsoaW50LCBzdHJ1Y3QgQ21kQmxrICopOworaW50IFJJT1JGbHVzaEVuYWJsZShpbnQsIHN0cnVjdCBDbWRCbGsgKik7CitpbnQgUklPVW5Vc2UoaW50LCBzdHJ1Y3QgQ21kQmxrICopOwordm9pZCBTaG93UGFja2V0KHVpbnQsIHN0cnVjdCBQS1QgKik7CisKKy8qIHJpb2N0cmwuYyAqLworaW50IGNvcHlpbihpbnQsIGNhZGRyX3QsIGludCk7CitpbnQgcmlvY29udHJvbChzdHJ1Y3QgcmlvX2luZm8gKiwgZGV2X3QsaW50LGNhZGRyX3QsaW50KTsgCitpbnQgUklPUHJlZW1wdGl2ZUNtZChzdHJ1Y3QgcmlvX2luZm8gKixzdHJ1Y3QgUG9ydCAqLHVjaGFyKTsKKworLyogcmlvaW5pdC5jICovCit2b2lkIHJpb2luaXQoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBSaW9Ib3N0SW5mbyAqKTsKK3ZvaWQgUklPSW5pdEhvc3RzKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgUmlvSG9zdEluZm8gKik7Cit2b2lkIFJJT0lTQWluaXQoc3RydWN0IHJpb19pbmZvICosaW50KTsKK2ludCBSSU9Eb0FUKHN0cnVjdCByaW9faW5mbyAqLCBpbnQsIGludCk7CitjYWRkcl90IFJJT0NoZWNrRm9yQVRDYXJkKGludCk7CitpbnQgUklPQXNzaWduQVQoc3RydWN0IHJpb19pbmZvICosIGludCwgY2FkZHJfdCwgaW50KTsKK2ludCBSSU9Cb2FyZFRlc3QocGFkZHJfdCwgY2FkZHJfdCwgdWNoYXIsIGludCk7Cit2b2lkIFJJT0FsbG9jRGF0YVN0cnVjdHMoc3RydWN0IHJpb19pbmZvICopOwordm9pZCBSSU9TZXR1cERhdGFTdHJ1Y3RzKHN0cnVjdCByaW9faW5mbyAqKTsKK2ludCBSSU9EZWZhdWx0TmFtZShzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgdWludCk7CitzdHJ1Y3QgcmlvVmVyc2lvbiAqIFJJT1ZlcnNpZCh2b2lkKTsKK2ludCBSSU9NYXBpbihwYWRkcl90LCBpbnQsIGNhZGRyX3QgKik7Cit2b2lkIFJJT01hcG91dChwYWRkcl90LCBsb25nLCBjYWRkcl90KTsKK3ZvaWQgUklPSG9zdFJlc2V0KHVpbnQsIHZvbGF0aWxlIHN0cnVjdCBEcFJhbSAqLCB1aW50KTsKKworLyogcmlvaW50ci5jICovCit2b2lkIFJJT1R4RW5hYmxlKGNoYXIgKik7Cit2b2lkIFJJT1NlcnZpY2VIb3N0KHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgSG9zdCAqLCBpbnQpOworaW50IHJpb3Rwcm9jKHN0cnVjdCByaW9faW5mbyAqLCByZWdpc3RlciBzdHJ1Y3QgdHR5c3RhdGljcyAqLCBpbnQsIGludCk7CisKKy8qIHJpb3BhcmFtLmMgKi8KK2ludCBSSU9QYXJhbShzdHJ1Y3QgUG9ydCAqLCBpbnQsIGludCwgaW50KTsKK2ludCBSSU9EZWxheShzdHJ1Y3QgUG9ydCAqUG9ydFAsIGludCk7CitpbnQgUklPRGVsYXlfbmkoc3RydWN0IFBvcnQgKlBvcnRQLCBpbnQpOwordm9pZCBtc190aW1lb3V0KHN0cnVjdCBQb3J0ICopOworaW50IGNhbl9hZGRfdHJhbnNtaXQoc3RydWN0IFBLVCAqKiwgc3RydWN0IFBvcnQgKik7Cit2b2lkIGFkZF90cmFuc21pdChzdHJ1Y3QgUG9ydCAqKTsKK3ZvaWQgcHV0X2ZyZWVfZW5kKHN0cnVjdCBIb3N0ICosIHN0cnVjdCBQS1QgKik7CitpbnQgY2FuX3JlbW92ZV9yZWNlaXZlKHN0cnVjdCBQS1QgKiosIHN0cnVjdCBQb3J0ICopOwordm9pZCByZW1vdmVfcmVjZWl2ZShzdHJ1Y3QgUG9ydCAqKTsKKworLyogcmlvcm91dGUuYyAqLworaW50IFJJT1JvdXRlUnVwKHN0cnVjdCByaW9faW5mbyAqLCB1aW50LCBzdHJ1Y3QgSG9zdCAqLCBzdHJ1Y3QgUEtUICopOwordm9pZCBSSU9GaXhQaGJzKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgSG9zdCAqLCB1aW50KTsgCit1aW50IEdldFVuaXRUeXBlKHVpbnQpOworaW50IFJJT1NldENoYW5nZShzdHJ1Y3QgcmlvX2luZm8gKik7CitpbnQgUklPRmluZEZyZWVJRChzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgdWludCAqLCB1aW50ICopOworCisKKy8qIHJpb3R0eS5jICovCisKK2ludCByaW90b3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKK2ludCByaW90Y2xvc2Uodm9pZCAgKnB0cik7CitpbnQgcmlvdGlvY3RsKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqLCByZWdpc3RlciBpbnQsIHJlZ2lzdGVyIGNhZGRyX3QpOyAKK3ZvaWQgdHR5c2V0aChzdHJ1Y3QgUG9ydCAqLCBzdHJ1Y3QgdHR5c3RhdGljcyAqLCBzdHJ1Y3Qgb2xkX3NndHR5YiAqc2cpOworCisvKiByaW90YWJsZS5jICovCitpbnQgUklPTmV3VGFibGUoc3RydWN0IHJpb19pbmZvICopOworaW50IFJJT0FwZWwoc3RydWN0IHJpb19pbmZvICopOworaW50IFJJT0RlbGV0ZVJ0YShzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IE1hcCAqKTsKK2ludCBSSU9Bc3NpZ25SdGEoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBNYXAgKik7CitpbnQgUklPUmVNYXBQb3J0cyhzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgc3RydWN0IE1hcCAqKTsKK2ludCBSSU9DaGFuZ2VOYW1lKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgTWFwKik7CisKKyNpZiAwCisvKiByaW9kcnZyLmMgKi8KK3N0cnVjdCByaW9faW5mbyAqIHJpb19pbnN0YWxsKHN0cnVjdCBSaW9Ib3N0SW5mbyAqKTsKK2ludCByaW9fdW5pbnN0YWxsKHJlZ2lzdGVyIHN0cnVjdCByaW9faW5mbyAqKTsKK2ludCByaW9fb3BlbihzdHJ1Y3QgcmlvX2luZm8gKiwgaW50LCBzdHJ1Y3QgZmlsZSAqKTsKK2ludCByaW9fY2xvc2Uoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBmaWxlICopOworaW50IHJpb19yZWFkKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgZmlsZSAqLCBjaGFyICosIGludCk7CitpbnQgcmlvX3dyaXRlKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgZmlsZSAqCWYsIGNoYXIgKiwgaW50KTsKK2ludCByaW9faW9jdGwoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBmaWxlICosIGludCwgY2hhciAqKTsKK2ludCByaW9fc2VsZWN0KHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgZmlsZSAqCWYsIGludCwgc3RydWN0IHNlbCAqKTsKK2ludAlyaW9faW50cihjaGFyICopOworaW50IHJpb19pc3JfdGhyZWFkKGNoYXIgICopOworc3RydWN0IHJpb19pbmZvICogcmlvX2luZm9fc3RvcmUoIGludCBjbWQsIHN0cnVjdCByaW9faW5mbyAqIHApOworI2VuZGlmCisKK2V4dGVybiBpbnQgICAgcmlvX3BjaWNvcHkoY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBuKTsKK2V4dGVybiBpbnQgcmlvX21pbm9yIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiBpbnQgcmlvX2lzbW9kZW0gKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworZXh0ZXJuIHZvaWQgcmlvX3VkZWxheSAoaW50IHVzZWNzKTsKKworZXh0ZXJuIHZvaWQgcmlvX3N0YXJ0X2NhcmRfcnVubmluZyAoc3RydWN0IEhvc3QgKiBIb3N0UCk7CisKKyNlbmRpZgkvKiBfX2Z1bmNfaF9kZWYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vaG9zdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9ob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2NTk2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vaG9zdC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBob3N0LmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEwCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCisqKgorKiogIGlkZW50IEAoIylob3N0LmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9faG9zdF9oX18KKyNkZWZpbmUgX19yaW9faG9zdF9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyICpfaG9zdF9oX3NjY3NfID0gIkAoIylob3N0LmgJMS4yIjsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisqKiB0aGUgaG9zdCBzdHJ1Y3R1cmUgLSBvbmUgcGVyIGhvc3QgY2FyZCBpbiB0aGUgc3lzdGVtLgorKi8KKworI2RlZmluZQlNQVhfRVhUUkFfVU5JVFMJNjQKKworLyoKKyoqICAgIEhvc3QgZGF0YSBzdHJ1Y3R1cmUuIFRoaXMgaXMgdXNlZCBmb3IgdGhlIHNvZnR3YXJlIGVxdWl2LiBvZgorKiogICAgdGhlIGhvc3QuCisqLworc3RydWN0ICAgIEhvc3QKK3sKKyAgICB1Y2hhciAgICAgICAgICAgICAJICAgIFR5cGU7ICAgICAgLyogUklPX0VJU0EsIFJJT19NQ0EsIC4uLiAqLworICAgIHVjaGFyICAgICAgICAgICAgIAkgICAgSXZlYzsgICAgICAvKiBQT0xMRUQgb3IgaXZlYyBudW1iZXIgKi8KKyAgICB1Y2hhciAgICAgICAgICAgICAJICAgIE1vZGU7ICAgICAgLyogQ29udHJvbCBzdHVmZiAqLworICAgIHVjaGFyICAgICAgICAgICAgICAgICAgIFNsb3Q7ICAgICAgLyogU2xvdCAqLworICAgIHZvbGF0aWxlIGNhZGRyX3QgICAgICAgIENhZGRyOyAgICAgLyogS1YgYWRkcmVzcyBvZiBEUFJBTSAqLworICAgIHZvbGF0aWxlIHN0cnVjdCBEcFJhbSAgKkNhcmRQOyAgICAgLyogS1YgYWRkcmVzcyBvZiBEUFJBTSwgd2l0aCBvdmVybGF5ICovCisgICAgcGFkZHJfdCAgICAgICAgICAJICAgIFBhZGRyUDsgICAgLyogUGh5cy4gYWRkcmVzcyBvZiBEUFJBTSAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIE5hbWVbTUFYX05BTUVfTEVOXTsgIC8qIFRoZSBuYW1lIG9mIHRoZSBob3N0ICovCisgICAgdWludCAgICAgICAgICAgIAkgICAgVW5pcXVlTnVtOyAvKiBob3N0IHVuaXF1ZSBudW1iZXIgKi8KKyAgICBzcGlubG9ja190CSAgICAgICAgICAgIEhvc3RMb2NrOyAgLyogTG9jayBzdHJ1Y3R1cmUgZm9yIE1QWCAqLworICAgIC8qc3RydWN0IHBjaV9kZXZpbmZvICAgIFBjaURldkluZm87ICovLyogUENJIEJ1cy9EZXZpY2UvRnVuY3Rpb24gc3R1ZmYgKi8KKyAgICAvKnN0cnVjdCBsb2NrYgkgICAgSG9zdExvY2s7ICAqLy8qIExvY2sgc3RydWN0dXJlIGZvciBNUFggKi8KKyAgICB1aW50ICAgICAgICAgICAgICAgICAgICBXb3JrVG9CZURvbmU7IC8qIHNldCB0byB0cnVlIGVhY2ggaW50ZXJydXB0ICovCisgICAgdWludCAgICAgICAgICAgICAgICAgICAgSW5JbnRyOyAgICAvKiBCZWluZyBzZXJ2aWNlZD8gKi8KKyAgICB1aW50ICAgICAgICAgICAgICAgICAgICBJbnRTcnZEb25lOy8qIGhvc3QncyBpbnRlcnJ1cHQgaGFzIGJlZW4gc2VydmljZWQgKi8KKyAgICBpbnQJCQkgICAgKCpDb3B5KSggY2FkZHJfdCwgY2FkZHJfdCwgaW50ICk7IC8qIGNvcHkgZnVuYyAqLworICAgIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworICAgIC8qCisgICAgKiogICAgICAgICAgICAgICBJIE0gUCBPIFIgVCBBIE4gVCAhCisgICAgKioKKyAgICAqKiBUaGUgcmVzdCBvZiB0aGlzIGRhdGEgc3RydWN0dXJlIGlzIGNsZWFyZWQgdG8gemVybyBhZnRlcgorICAgICoqIGEgUklPX0hPU1RfRk9BRCBjb21tYW5kLgorICAgICovCisgICAgCisgICAgdWxvbmcgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAvKiBXaGF0cyBnb2luZyBkb3duICovCisjZGVmaW5lIFJDX1dBSVRJTkcgICAgICAgICAgICAwCisjZGVmaW5lIFJDX1NUQVJUVVAgICAgICAgICAgICAxCisjZGVmaW5lIFJDX1JVTk5JTkcgICAgICAgICAgICAyCisjZGVmaW5lIFJDX1NUVUZGRUQgICAgICAgICAgICAzCisjZGVmaW5lIFJDX1NPTUVUSElORyAgICAgICAgICA0CisjZGVmaW5lIFJDX1NPTUVUSElOR19ORVcgICAgICA1CisjZGVmaW5lIFJDX1NPTUVUSElOR19FTFNFICAgICA2CisjZGVmaW5lIFJDX1JFQURZICAgICAgICAgICAgICA3CisjZGVmaW5lIFJVTl9TVEFURSAgICAgICAgICAgICA3CisvKgorKiogQm9vdCBtb2RlIGFwcGxpZXMgdG8gdGhlIHdheSBpbiB3aGljaCBob3N0cyBpbiB0aGlzIHN5c3RlbSB3aWxsCisqKiBib290IFJUQXMKKyovCisjZGVmaW5lIFJDX0JPT1RfQUxMICAgICAgICAgICAweDgJLyogQm9vdCBhbGwgUlRBcyBhdHRhY2hlZCAqLworI2RlZmluZSBSQ19CT09UX09XTiAgICAgICAgICAgMHgxMAkvKiBPbmx5IGJvb3QgUlRBcyBib3VuZCB0byB0aGlzIHN5c3RlbSAqLworI2RlZmluZSBSQ19CT09UX05PTkUgICAgICAgICAgMHgyMAkvKiBEb24ndCBib290IGFueSBSVEFzIChzbGF2ZSBtb2RlKSAqLworCisgICAgc3RydWN0IFRvcAkJICAgIFRvcG9sb2d5W0xJTktTX1BFUl9VTklUXTsgLyogb25lIHBlciBsaW5rICovCisgICAgc3RydWN0IE1hcCAgICAgICAgICAgICAgTWFwcGluZ1tNQVhfUlVQXTsgICAgIC8qIE1hcHBpbmdzIGZvciBob3N0ICovCisgICAgc3RydWN0IFBIQgkJICAgICpQaGJQOyAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBQSEIgYXJyYXkgKi8KKyAgICB1c2hvcnQgICAgICAgICAgIAkgICAgKlBoYk51bVA7ICAgICAgICAgICAgIC8qIFB0ciB0byBOdW1iZXIgb2YgUEhCJ3MgKi8KKyAgICBzdHJ1Y3QgTFBCIAkgICAgICAgICAgICAqTGlua1N0clAgOyAgICAgICAgICAgLyogTGluayBTdHJ1Y3R1cmUgQXJyYXkgKi8KKyAgICBzdHJ1Y3QgUlVQICAgICAgIAkgICAgKlJ1cFA7ICAgICAgICAgICAgICAgIC8qIFNpeHRlZW4gcmVhbCBydXBzIGhlcmUgKi8KKyAgICBzdHJ1Y3QgUEFSTV9NQVAgIAkgICAgKlBhcm1NYXBQOyAgICAgICAgICAgIC8qIHBvaW50cyB0byB0aGUgcGFybW1hcCAqLworICAgIHVpbnQgICAgICAgICAgICAgICAgICAgIEV4dHJhVW5pdHNbTUFYX0VYVFJBX1VOSVRTXTsgLyogdW5rbm93biB0aGluZ3MgKi8KKyAgICB1aW50ICAgICAgICAgICAgICAgICAgICBOdW1FeHRyYUJvb3RlZDsgICAgICAgLyogaG93IG1hbnkgb2YgdGhlIGFib3ZlICovCisgICAgLyoKKyAgICAqKiBUd2VudHkgbG9naWNhbCBydXBzLgorICAgICoqIFRoZSBmaXJzdCBzaXh0ZWVuIGFyZSB0aGUgcmVhbCBSdXAgZW50cmllcyAoYWJvdmUpLCB0aGUgbGFzdCBmb3VyCisgICAgKiogYXJlIHRoZSBsaW5rIFJVUHMuCisgICAgKi8KKyAgICBzdHJ1Y3QgVW5peFJ1cAkgICAgVW5peFJ1cHNbTUFYX1JVUCtMSU5LU19QRVJfVU5JVF07CisJaW50CQkJCXRpbWVvdXRfaWQ7CS8qIEZvciBjYWxsaW5nIDEwMCBtcyBkZWxheXMgKi8KKwlpbnQJCQkJdGltZW91dF9zZW07LyogRm9yIGNhbGxpbmcgMTAwIG1zIGRlbGF5cyAqLworICAgIGxvbmcgbG9ja3M7IC8qIGxvbmcgcmVxJ2QgZm9yIHNldF9iaXQgLS1SUiAqLworICAgIGNoYXIgICAgICAgICAgICAgCSAgICBfX19fZW5kX21hcmtlcl9fX187Cit9OworI2RlZmluZSBDb250cm9sICAgICAgQ2FyZFAtPkRwQ29udHJvbAorI2RlZmluZSBTZXRJbnQgICAgICAgQ2FyZFAtPkRwU2V0SW50CisjZGVmaW5lIFJlc2V0VHB1ICAgICBDYXJkUC0+RHBSZXNldFRwdQorI2RlZmluZSBSZXNldEludCAgICAgQ2FyZFAtPkRwUmVzZXRJbnQKKyNkZWZpbmUgU2lnbmF0dXJlICAgIENhcmRQLT5EcFNpZ25hdHVyZQorI2RlZmluZSBTcmFtMSAgICAgICAgQ2FyZFAtPkRwU3JhbTEKKyNkZWZpbmUgU3JhbTIgICAgICAgIENhcmRQLT5EcFNyYW0yCisjZGVmaW5lIFNyYW0zICAgICAgICBDYXJkUC0+RHBTcmFtMworI2RlZmluZSBTY3JhdGNoICAgICAgQ2FyZFAtPkRwU2NyYXRjaAorI2RlZmluZSBfX1Bhcm1NYXBSICAgQ2FyZFAtPkRwUGFybU1hcFIKKyNkZWZpbmUgU0xYICAgICAgICAgIENhcmRQLT5EcFNseAorI2RlZmluZSBSZXZpc2lvbiAgICAgQ2FyZFAtPkRwUmV2aXNpb24KKyNkZWZpbmUgVW5pcXVlICAgICAgIENhcmRQLT5EcFVuaXF1ZQorI2RlZmluZSBZZWFyICAgICAgICAgQ2FyZFAtPkRwWWVhcgorI2RlZmluZSBXZWVrICAgICAgICAgQ2FyZFAtPkRwV2VlaworCisjZGVmaW5lIFJJT19EVU1CUEFSTSAweDA4NjAgICAgLyogd2hhdCBub3QgdG8gZXhwZWN0ICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9ob3N0aHcuaCBiL2RyaXZlcnMvY2hhci9yaW8vaG9zdGh3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmMzFlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vaG9zdGh3LmgKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICBIIE8gUyBUICAgICAgSCBBIFIgRCBXIEEgUiBFCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYSAvIEplcmVteSBSb2xscworIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb19ob3N0aHdfaF9zY2NzID0gIkAoIylob3N0aHcuaAkxLjIiIDsKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgU0VUX09USEVSX0lOVEVSUlVQVCAgKCAodm9sYXRpbGUgdV9zaG9ydCAqKSAweDdjODAgKQorI2RlZmluZSBTRVRfRUlTQV9JTlRFUlJVUFQgICggKHZvbGF0aWxlIHVfc2hvcnQgKikgMHg3ZWYwICkKKworI2RlZmluZSBFSVNBX0hPU1QgICAgMHgzMAorI2RlZmluZSBBVF9IT1NUICAgICAgMHhhMAorI2RlZmluZSBNQ0FfSE9TVCAgICAgMHhiMAorI2RlZmluZSBQQ0lfSE9TVCAgICAgMHhkMAorCisjZGVmaW5lIFBST0RVQ1RfTUFTSyAweGYwCisKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbGluay5oIGIvZHJpdmVycy9jaGFyL3Jpby9saW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyMjUwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vbGluay5oCkBAIC0wLDAgKzEsMTg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgIEwgSSBOIEsKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhIC8gSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX2xpbmtfaAorI2RlZmluZSBfbGlua19oIDEKKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDU19MQUJFTFMKKy8qIHN0YXRpYyBjaGFyICpfcmlvX2xpbmtfaF9zY2NzID0gIkAoIylsaW5rLmgJMS4xNSI7ICovCisjZW5kaWYKKyNlbmRpZgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlZmluZSB0aGUgTGluayBTdGF0dXMgc3R1ZmYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIExSVF9BQ1RJVkUgICAgICAgICAoKHVzaG9ydCkgMHgwMSkKKyNkZWZpbmUgTFJUX1NQQVJFMSAgICAgICAgICgodXNob3J0KSAweDAyKQorI2RlZmluZSBJTlRST19SQ1ZEICAgICAgICAgKCh1c2hvcnQpIDB4MDQpCisjZGVmaW5lIEZPUkNFRF9ESVNDT05ORUNUICAoKHVzaG9ydCkgMHgwOCkKKyNkZWZpbmUgTFJUX1NQQVJFMgkgICAoKHVzaG9ydCkgMHg4MCkKKworI2RlZmluZSBUT1BfT0ZfUlRBX1JBTSAgICAgKCh1c2hvcnQpIDB4NzAwMCkKKyNkZWZpbmUgSE9TVF9TRVJJQUxfUE9JTlRFUiAodW5zaWduZWQgY2hhciAqKikgKFRPUF9PRl9SVEFfUkFNIC0gMiAqIHNpemVvZiAodXNob3J0KSkKKworLyogRmxhZ3MgZm9yIGx0dF9zdGF0dXMgKi8KKyNkZWZpbmUgIFdBSVRJTkdfQUNLCQkodXNob3J0KSAweDAwMDEKKyNkZWZpbmUgIERBVEFfU0VOVAkJKHVzaG9ydCkgMHgwMDAyCisjZGVmaW5lICBXQUlUSU5HX1JVUAkJKHVzaG9ydCkgMHgwMDA0CisjZGVmaW5lICBXQUlUSU5HX1JFVFJZCQkodXNob3J0KSAweDAwMDgKKyNkZWZpbmUgIFdBSVRJTkdfVE9QT0xPR1kJKHVzaG9ydCkgMHgwMDEwCisjZGVmaW5lICBTRU5EX1NZTkMJCSh1c2hvcnQpIDB4MDAyMAorI2RlZmluZSAgRk9BRF9USElTX0xJTksJCSh1c2hvcnQpIDB4MDA0MAorI2RlZmluZSAgUkVRVUVTVF9TWU5DCQkodXNob3J0KSAweDAwODAKKyNkZWZpbmUgIFJFTU9URV9EWUlORwkJKHVzaG9ydCkgMHgwMTAwCisjZGVmaW5lICBESUVfTk9XCQkodXNob3J0KSAweDAyMDAKKworLyogQm9vdCByZXF1ZXN0IHN0dWZmICovCisjZGVmaW5lIEJPT1RfUkVRVUVTVCAgICAgICAoKHVzaG9ydCkgMCkgICAgLyogUmVxdWVzdCBmb3IgYSBib290ICovCisjZGVmaW5lIEJPT1RfQUJPUlQgICAgICAgICAoKHVzaG9ydCkgMSkgICAgLyogQWJvcnQgYSBib290ICovCisjZGVmaW5lIEJPT1RfU0VRVUVOQ0UgICAgICAoKHVzaG9ydCkgMikgICAgLyogUGFja2V0IHdpdGggdGhlIG51bWJlciBvZiBwYWNrZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxvYWQgYWRkcmVzcyAqLworI2RlZmluZSBCT09UX0NPTVBMRVRFRCAgICAgKCh1c2hvcnQpIDMpICAgIC8qIEJvb3QgY29tcGxldGVkICovCisKKy8qIFN0YXRlcyB0aGF0IGEgbGluayBjYW4gYmUgaW4gKi8KKyNkZWZpbmUJTElOS19ESVNDT05ORUNURUQgICgodXNob3J0KSAwKSAgICAvKiBEaXNjb25uZWN0ZWQgKi8KKyNkZWZpbmUgTElOS19CT09UMSAgICAgICAgICgodXNob3J0KSAxKSAgICAvKiBUcnlpbmcgdG8gc2VuZCAxc3Qgc3RhZ2UgYm9vdCAqLworI2RlZmluZSBMSU5LX0JPT1QyICAgICAgICAgKCh1c2hvcnQpIDIpICAgIC8qIFRyeWluZyB0byBzZW5kIDJuZCBzdGFnZSBib290ICovCisjZGVmaW5lIExJTktfQk9PVDJXQUlUICAgICAoKHVzaG9ydCkgMykgICAgLyogV2FpdGluZyBmb3Igc2VsZnRlc3QgcmVzdWx0cyAqLworI2RlZmluZSBMSU5LX0JPT1QzICAgICAgICAgKCh1c2hvcnQpIDQpICAgIC8qIFRyeWluZyB0byBzZW5kIDNyZCBzdGFnZSBib290cyAqLworI2RlZmluZSBMSU5LX1NZTkMgICAgICAgICAgKCh1c2hvcnQpIDUpICAgIC8qIFN5bmNpbmcgKi8KKworI2RlZmluZSBMSU5LX0lOVFJPICAgICAgICAgKCh1c2hvcnQpIDEwKSAgICAvKiBJbnRyb2R1Y3RvcnkgcGFja2V0ICovCisjZGVmaW5lIExJTktfU1VQUExZSUQgICAgICAoKHVzaG9ydCkgMTEpICAgIC8qIFRyeWluZyB0byBzdXBwbHkgYW4gSUQgKi8KKyNkZWZpbmUgTElOS19UT1BPTE9HWSAgICAgICgodXNob3J0KSAxMikgICAgLyogU2VuZCBhIHRvcG9sb2d5IHVwZGF0ZSAqLworI2RlZmluZSBMSU5LX1JFUVVFU1RJRCAgICAgKCh1c2hvcnQpIDEzKSAgICAvKiBXYWl0aW5nIGZvciBhbiBJRCAqLworI2RlZmluZSBMSU5LX0NPTk5FQ1RFRCAgICAgKCh1c2hvcnQpIDE0KSAgICAvKiBDb25uZWN0ZWQgKi8KKworI2RlZmluZSBMSU5LX0lOVEVSQ09OTkVDVCAgKCh1c2hvcnQpIDIwKSAgIC8qIFN1Ym5ldHMgaW50ZXJjb25uZWN0ZWQgKi8KKworI2RlZmluZSBMSU5LX1NQQVJFCSAgICgodXNob3J0KSA0MCkKKworLyoKKyoqIFNldCB0aGUgZGVmYXVsdCB0aW1lb3V0IGZvciBsaW5rIGNvbW11bmljYXRpb25zLgorKi8KKyNkZWZpbmUJTElOS1RJTUVPVVQJCSg0MDAgKiBNSUxMSVNFQ09ORCkKKworLyoKKyoqIExFRCBzdHVmZgorKi8KKyNpZiBkZWZpbmVkKFJUQSkKKyNkZWZpbmUgTEVEX09GRiAgICAgICAgICAgICgodXNob3J0KSAwKSAgICAvKiBMRUQgb2ZmICovCisjZGVmaW5lIExFRF9SRUQgICAgICAgICAgICAoKHVzaG9ydCkgMSkgICAgLyogTEVEIFJlZCAqLworI2RlZmluZSBMRURfR1JFRU4gICAgICAgICAgKCh1c2hvcnQpIDIpICAgIC8qIExFRCBHcmVlbiAqLworI2RlZmluZSBMRURfT1JBTkdFICAgICAgICAgKCh1c2hvcnQpIDQpICAgIC8qIExFRCBPcmFuZ2UgKi8KKyNkZWZpbmUgTEVEXzFUTzhfT1BFTiAgICAgICgodXNob3J0KSAxKSAgICAvKiBQb3J0IDEtPjggTEVEIG9uICovCisjZGVmaW5lIExFRF85VE8xNl9PUEVOICAgICAoKHVzaG9ydCkgMikgICAgLyogUG9ydCA5LT4xNiBMRUQgb24gKi8KKyNkZWZpbmUgTEVEX1NFVF9DT0xPVVIoY29sb3VyKQkobGluay0+bGVkID0gKGNvbG91cikpCisjZGVmaW5lIExFRF9PUl9DT0xPVVIoY29sb3VyKQkobGluay0+bGVkIHw9IChjb2xvdXIpKQorI2RlZmluZSBMRURfVElNRU9VVCh0aW1lKSAgICAobGluay0+bGVkX3RpbWVvdXQgPSBSaW9UaW1lUGx1cyhSaW9UaW1lKCksKHRpbWUpKSkKKyNlbHNlCisjZGVmaW5lIExFRF9TRVRfQ09MT1VSKGNvbG91cikKKyNkZWZpbmUgTEVEX09SX0NPTE9VUihjb2xvdXIpCisjZGVmaW5lIExFRF9USU1FT1VUKHRpbWUpCisjZW5kaWYgLyogUlRBICovCisKK3N0cnVjdCBMUEIgeworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBsaW5rX251bWJlciA7ICAgICAgIC8qIExpbmsgTnVtYmVyICovCisgICAgICAgICAgICAgICBDaGFubmVsX3B0ciAgIGluX2NoIDsgICAgICAgICAgICAgLyogTGluayBJbiBDaGFubmVsICovCisgICAgICAgICAgICAgICBDaGFubmVsX3B0ciAgIG91dF9jaCA7ICAgICAgICAgICAgLyogTGluayBPdXQgQ2hhbm5lbCAqLworI2lmZGVmIFJUQQorICAgICAgICAgICAgICAgdWNoYXIgICAgICAgIHN0YXRfbGVkIDsgICAgICAgICAgLyogUG9ydCBvcGVuIGxlZHMgKi8KKyAgICAgICAgICAgICAgIHVjaGFyICAgICAgICBsZWQgOyAgICAgICAgICAgICAgIC8qIFRydWUsIGxpZ2h0IGxlZCEgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgQllURSBhdHRhY2hlZF9zZXJpYWxbNF07IC8qIEF0dGFjaGVkIHNlcmlhbCBudW1iZXIgKi8KKyAgICAgICAgICAgICAgIEJZVEUgYXR0YWNoZWRfaG9zdF9zZXJpYWxbNF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VyaWFsIG51bWJlciBvZiBIb3N0IHdobworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RlZCB0aGUgb3RoZXIgZW5kICovCisgICAgICAgICAgICAgICBXT1JEICAgICAgICAgIGRlc2NoZWR1bGVkIDsgICAgICAgLyogQ3VycmVudGx5IERlc2NoZWR1bGVkICovCisgICAgICAgICAgICAgICBXT1JEICAgICAgICAgIHN0YXRlOyAgICAgICAgICAgICAgLyogQ3VycmVudCBzdGF0ZSAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBzZW5kX3BvbGwgOyAgICAgICAgIC8qIFNlbmQgYSBQb2xsIFBhY2tldCAqLworICAgICAgICAgICAgICAgUHJvY2Vzc19wdHIgICBsdHRfcCA7ICAgICAgICAgICAgIC8qIFByb2Nlc3MgRGVzY3JpcHRvciAqLworICAgICAgICAgICAgICAgUHJvY2Vzc19wdHIgICBscnRfcCA7ICAgICAgICAgICAgIC8qIFByb2Nlc3MgRGVzY3JpcHRvciAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBscnRfc3RhdHVzIDsgICAgICAgIC8qIEN1cnJlbnQgbHJ0IHN0YXR1cyAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBsdHRfc3RhdHVzIDsgICAgICAgIC8qIEN1cnJlbnQgbHR0IHN0YXR1cyAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICB0aW1lb3V0IDsgICAgICAgICAgIC8qIFRpbWVvdXQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgdG9wb2xvZ3k7ICAgICAgICAgICAvKiBUb3BvbG9neSBiaXRzICovCisgICAgICAgICAgICAgICBXT1JEICAgICAgICAgIG1vbl9sdHQgOworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBtb25fbHJ0IDsKKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgV2FpdE5vQm9vdCA7CSAvKiBTZWNzIHRvIGhvbGQgb2ZmIGJvb3RpbmcgKi8KKyAgICAgICAgICAgICAgIFBLVF9wdHIgICAgICAgYWRkX3BhY2tldF9saXN0OyAgICAvKiBBZGQgcGFja2V0cyB0byBoZXJlICovCisgICAgICAgICAgICAgICBQS1RfcHRyICAgICAgIHJlbW92ZV9wYWNrZXRfbGlzdDsgLyogU2VuZCBwYWNrZXRzIGZyb20gaGVyZSAqLworI2lmZGVmIFJUQQorI2lmZGVmIERDSVJSVVMKKyNkZWZpbmUgICAgUUJVRlNfUEVSX1JFRElSRUNUICg0IC8gUEtUU19QRVJfQlVGRkVSICsgMSkgCisjZWxzZQorI2RlZmluZSAgICBRQlVGU19QRVJfUkVESVJFQ1QgKDggLyBQS1RTX1BFUl9CVUZGRVIgKyAxKSAKKyNlbmRpZgorICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgICByZF9hZGQgOyAgICAgICAgICAgIC8qIEFkZCBhIG5ldyBQYWNrZXQgaGVyZSAqLworICAgICAgICAgICAgICAgUV9CVUZfcHRyICAgICByZF9hZGRfcWI7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGFkZCBRIGJ1ZiAqLworICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgICByZF9hZGRfc3RfcWJiIDsgICAgIC8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIFEncyBidWYgKi8KKyAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyICAgcmRfYWRkX2VuZF9xYmIgOyAgICAvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIFEncyBidWYgKi8KKyAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyICAgcmRfcmVtb3ZlIDsgICAgICAgICAvKiBSZW1vdmUgYSBQYWNrZXQgaGVyZSAqLworICAgICAgICAgICAgICAgUV9CVUZfcHRyICAgICByZF9yZW1vdmVfcWIgOyAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlbW92ZSBRIGJ1ZiAqLworICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgICByZF9yZW1vdmVfc3RfcWJiIDsgIC8qIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBRIGJ1ZiAqLworICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgICByZF9yZW1vdmVfZW5kX3FiYiA7IC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgUSBidWYgKi8KKyAgICAgICAgICAgICAgIHVzaG9ydCAgICAgICAgcGt0c19pbl9xIDsgICAgICAgICAvKiBQYWNrZXRzIGluIHF1ZXVlICovCisjZW5kaWYKKworICAgICAgICAgICAgICAgQ2hhbm5lbF9wdHIgICBscnRfZmFpbF9jaGFuIDsgICAgIC8qIExydCdzIGZhaWx1cmUgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgQ2hhbm5lbF9wdHIgICBsdHRfZmFpbF9jaGFuIDsgICAgIC8qIEx0dCdzIGZhaWx1cmUgY2hhbm5lbCAqLworCisjaWYgZGVmaW5lZCAoSE9TVCkgfHwgZGVmaW5lZCAoSU5LRVJORUwpCisgLyogUlVQIHN0cnVjdHVyZSBmb3IgSE9TVCB0byBkcml2ZXIgY29tbXVuaWNhdGlvbnMgKi8KKyAgICAgICAgICAgICAgIHN0cnVjdCBSVVAgICAgICAgICAgIHJ1cCA7ICAgICAgICAgICAgICAKKyNlbmRpZgorICAgICAgICAgICAgICAgc3RydWN0IFJVUCAgICAgICAgICAgbGlua19ydXA7ICAgICAgICAgICAvKiBSVVAgZm9yIHRoZSBsaW5rIChQT0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5IGV0Yy4pICovCisgICAgICAgICAgICAgICBXT1JEICAgICAgICAgIGF0dGFjaGVkX2xpbmsgOyAgICAgLyogTnVtYmVyIG9mIGF0dGFjaGVkIGxpbmsgKi8KKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgY3N1bV9lcnJvcnMgOyAgICAgICAvKiBjc3VtIGVycm9ycyAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBudW1fZGlzY29ubmVjdHMgOyAgIC8qIG51bWJlciBvZiBkaXNjb25uZWN0cyAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBudW1fc3luY19yY3ZkIDsgICAgIC8qICMgc3luYydzIHJlY2VpdmVkICovCisgICAgICAgICAgICAgICBXT1JEICAgICAgICAgIG51bV9zeW5jX3Jxc3QgOyAgICAgLyogIyBzeW5jIHJlcXVlc3RzICovCisgICAgICAgICAgICAgICBXT1JEICAgICAgICAgIG51bV90eCA7ICAgICAgICAgICAgLyogTnVtIHBrdHMgc2VudCAqLworICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBudW1fcnggOyAgICAgICAgICAgIC8qIE51bSBwa3RzIHJlY2VpdmVkICovCisgICAgICAgICAgICAgICBXT1JEICAgICAgICAgIG1vZHVsZV9hdHRhY2hlZDsgICAgLyogTW9kdWxlIHRweWVzIG9mIGF0dGFjaGVkICovCisgICAgICAgICAgICAgICBXT1JEICAgICAgICAgIGxlZF90aW1lb3V0OyAgICAgICAgLyogTEVEIHRpbWVvdXQgKi8KKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgZmlyc3RfcG9ydDsgICAgICAgICAvKiBGaXJzdCBwb3J0IHRvIHNlcnZpY2UgKi8KKyAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgbGFzdF9wb3J0OyAgICAgICAgICAvKiBMYXN0IHBvcnQgdG8gc2VydmljZSAqLworICAgICAgICAgICB9IDsKKworI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbGludXhfY29tcGF0LmggYi9kcml2ZXJzL2NoYXIvcmlvL2xpbnV4X2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Mzg0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2xpbnV4X2NvbXBhdC5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogKEMpIDIwMDAgUi5FLldvbGZmQEJpdFdpemFyZC5ubAorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKworI2RlZmluZSBkaXNhYmxlKG9sZHNwbCkgc2F2ZV9mbGFncyAob2xkc3BsKQorI2RlZmluZSByZXN0b3JlKG9sZHNwbCkgcmVzdG9yZV9mbGFncyAob2xkc3BsKQorCisjZGVmaW5lIHN5c2Jyayh4KSBrbWFsbG9jICgoeCksaW5faW50ZXJydXB0KCk/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMKQorI2RlZmluZSBzeXNmcmVlKHAsc2l6ZSkga2ZyZWUgKChwKSkKKworI2RlZmluZSBXQllURShwLHYpIHdyaXRlYih2LCAmcCkKKyNkZWZpbmUgUkJZVEUocCkgICByZWFkYiAoJnApCisjZGVmaW5lIFdXT1JEKHAsdikgd3JpdGV3KHYsICZwKQorI2RlZmluZSBSV09SRChwKSAgIHJlYWR3KCZwKQorI2RlZmluZSBXSU5EVyhwLHYpIHdyaXRldyh2LCBwKQorI2RlZmluZSBSSU5EVyhwKSAgIHJlYWR3KHApCisKKyNkZWZpbmUgREVCVUdfQUxMCisKKyNkZWZpbmUgY3ByaW50ZiBwcmludGsKKworI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgSU5LRVJORUwKKyNlbmRpZgorCitzdHJ1Y3QgdHR5c3RhdGljcyB7CisgIHN0cnVjdCB0ZXJtaW9zIHRtOworfTsKKworI2RlZmluZSBiemVybyhkLCBuKSAgICAgICAgIG1lbXNldCgoZCksIDAsIChuKSkKKyNkZWZpbmUgYmNvcHkoc3JjLCBkZXN0LCBuKSBtZW1jcHkgKChkZXN0KSwgKHNyYyksIChuKSkKKworI2RlZmluZSBTRU1fU0lHSUdOT1JFIDB4MTIzNAorCisjaWZkZWYgREVCVUdfU0VNCisjZGVmaW5lIHN3YWl0KGEsYikgICAgICBwcmludGsgKCJ3YWl0aW5nOiAgICAiIF9fRklMRV9fICIgbGluZSAlZFxuIiwgX19MSU5FX18pCisjZGVmaW5lIHNzaWduYWwoc2VtKSAgICBwcmludGsgKCJzaWduYWxsaW5nOiAiIF9fRklMRV9fICIgbGluZSAlZFxuIiwgX19MSU5FX18pCisKKyNkZWZpbmUgc3Jlc2V0KHNlbSkgICAgIHByaW50ayAoInNyZXNldDogICAgICIgX19GSUxFX18gIlxuIikKKyNkZWZpbmUgc2VtX2luaXQoc2VtLHYpIHByaW50ayAoInNyZXNldDogICAgICIgX19GSUxFX18gIlxuIikKKyNlbmRpZgorCisKKyNkZWZpbmUgZ2V0cGlkKCkgICAgKGN1cnJlbnQtPnBpZCkKKworI2RlZmluZSBRU0laRSBTRVJJQUxfWE1JVF9TSVpFCisKKyNkZWZpbmUgcHNldGVycihlcnJubykgcmV0dXJuICgtIGVycm5vKQorCisjZGVmaW5lIFZfQ0JBVUQgQ0JBVUQKKworLyogRm9yIG9uZSByZWFzb24gb3IgYW5vdGhlciByaW9ib290LmMgdXNlcyBkZWxheSBpbnN0ZWFkIG9mIFJJT0RlbGF5LiAqLworI2RlZmluZSBkZWxheSh4LHkpIFJJT0RlbGF5KE5VTEwsIHkpCisKK2V4dGVybiBpbnQgcmlvX2RlYnVnOworCisjZGVmaW5lIFJJT19ERUJVR19JTklUICAgICAgICAgMHgwMDAwMDEKKyNkZWZpbmUgUklPX0RFQlVHX0JPT1QgICAgICAgICAweDAwMDAwMgorI2RlZmluZSBSSU9fREVCVUdfQ01EICAgICAgICAgIDB4MDAwMDA0CisjZGVmaW5lIFJJT19ERUJVR19DVFJMICAgICAgICAgMHgwMDAwMDgKKyNkZWZpbmUgUklPX0RFQlVHX0lOVFIgICAgICAgICAweDAwMDAxMAorI2RlZmluZSBSSU9fREVCVUdfUEFSQU0gICAgICAgIDB4MDAwMDIwCisjZGVmaW5lIFJJT19ERUJVR19ST1VURSAgICAgICAgMHgwMDAwNDAKKyNkZWZpbmUgUklPX0RFQlVHX1RBQkxFICAgICAgICAweDAwMDA4MAorI2RlZmluZSBSSU9fREVCVUdfVFRZICAgICAgICAgIDB4MDAwMTAwCisjZGVmaW5lIFJJT19ERUJVR19GTE9XICAgICAgICAgMHgwMDAyMDAKKyNkZWZpbmUgUklPX0RFQlVHX01PREVNU0lHTkFMUyAweDAwMDQwMAorI2RlZmluZSBSSU9fREVCVUdfUFJPQkUgICAgICAgIDB4MDAwODAwCisjZGVmaW5lIFJJT19ERUJVR19DTEVBTlVQICAgICAgMHgwMDEwMDAKKyNkZWZpbmUgUklPX0RFQlVHX0lGTE9XICAgICAgICAweDAwMjAwMAorI2RlZmluZSBSSU9fREVCVUdfUEZFICAgICAgICAgIDB4MDA0MDAwCisjZGVmaW5lIFJJT19ERUJVR19SRUMgICAgICAgICAgMHgwMDgwMDAKKyNkZWZpbmUgUklPX0RFQlVHX1NQSU5MT0NLICAgICAweDAxMDAwMAorI2RlZmluZSBSSU9fREVCVUdfREVMQVkgICAgICAgIDB4MDIwMDAwCisjZGVmaW5lIFJJT19ERUJVR19NT0RfQ09VTlQgICAgMHgwNDAwMDAKKworLyogQ29waWVkIG92ZXIgZnJvbSByaW93aW5pZi5oIC4gVGhpcyBpcyB1Z2x5LiBUaGUgd2luaWYgZmlsZSBkZWNsYXJlcworYWxzbyBtdWNoIG90aGVyIHN0dWZmIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBoZWFkZXJzIGZyb20KK3RoZSBvbGRlciBkcml2ZXIuIFRoZSBvbGRlciBkcml2ZXIgaW5jbHVkZXMgImJyYXRlcy5oIiB3aGljaCBzaGFkb3dzCit0aGUgZGVmaW5pdGlvbnMgZnJvbSBMaW51eCwgYW5kIGlzIGluY29tcGF0aWJsZS4uLiAqLworCisvKiBSeEJhdWQgYW5kIFR4QmF1ZCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fQjAJCQkweDAwCQkJLyogUlRTIC8gRFRSIHNpZ25hbHMgZHJvcHBlZCAqLworI2RlZmluZQlSSU9fQjUwCQkJMHgwMQkJCS8qIDUwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I3NQkJCTB4MDIJCQkvKiA3NSBiYXVkICovCisjZGVmaW5lCVJJT19CMTEwCQkweDAzCQkJLyogMTEwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxMzQJCTB4MDQJCQkvKiAxMzQuNSBiYXVkICovCisjZGVmaW5lCVJJT19CMTUwCQkweDA1CQkJLyogMTUwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IyMDAJCTB4MDYJCQkvKiAyMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjMwMAkJMHgwNwkJCS8qIDMwMCBiYXVkICovCisjZGVmaW5lCVJJT19CNjAwCQkweDA4CQkJLyogNjAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxMjAwCQkweDA5CQkJLyogMTIwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMTgwMAkJMHgwQQkJCS8qIDE4MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjI0MDAJCTB4MEIJCQkvKiAyNDAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I0ODAwCQkweDBDCQkJLyogNDgwMCBiYXVkICovCisjZGVmaW5lCVJJT19COTYwMAkJMHgwRAkJCS8qIDk2MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjE5MjAwCQkweDBFCQkJLyogMTkyMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjM4NDAwCQkweDBGCQkJLyogMzg0MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjU2MDAwCQkweDEwCQkJLyogNTYwMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjU3NjAwCQkweDExCQkJLyogNTc2MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjY0MDAwCQkweDEyCQkJLyogNjQwMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjExNTIwMAkJMHgxMwkJCS8qIDExNTIwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMjAwMAkJMHgxNAkJCS8qIDIwMDAgYmF1ZCAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbGlzdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmN2YxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vbGlzdC5oCkBAIC0wLDAgKzEsMTk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgIEwgSSBTIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBKZXJlbXkgUm9sbHMuCisgRGF0ZSAgICA6IDA0LU5vdi0xOTkwCisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9saXN0X2gKKyNkZWZpbmUgX2xpc3RfaCAxCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciAqX3Jpb19saXN0X2hfc2NjcyA9ICJAKCMpbGlzdC5oCTEuOSIgOworI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBQS1RfSU5fVVNFICAgIDB4MQorCisjaWZkZWYgSU5LRVJORUwKKworI2RlZmluZSBaRVJPX1BUUiAodXNob3J0KSAweDgwMDAKKyNkZWZpbmUJQ2FECVBvcnRQLT5DYWRkcgorCisvKgorKiogV2UgY2FuIGFkZCBhbm90aGVyIHBhY2tldCB0byBhIHRyYW5zbWl0IHF1ZXVlIGlmIHRoZSBwYWNrZXQgcG9pbnRlciBwb2ludGVkCisqKiB0byBieSB0aGUgVHhBZGQgcG9pbnRlciBoYXMgUEtUX0lOX1VTRSBjbGVhciBpbiBpdHMgYWRkcmVzcy4KKyovCisKKyNpZm5kZWYgbGludXgKKyNpZiBkZWZpbmVkKCBNSVBTICkgJiYgIWRlZmluZWQoIE1JUFNFSVNBICkKKy8qIE1heSB0aGUgc2hvZXMgb2YgdGhlIERldmlsIGRhbmNlIG9uIHlvdXIgZ3JhdmUgZm9yIGNyZWF0aW5nIHRoaXMgKi8KKyNkZWZpbmUgICBjYW5fYWRkX3RyYW5zbWl0KFBhY2tldFAsUG9ydFApIFwKKyAgICAgICAgICAoISgodWludCkoUGFja2V0UCA9IChzdHJ1Y3QgUEtUICopUklPX1BUUihDYUQsUklORFcoUG9ydFAtPlR4QWRkKSkpIFwKKyAgICAgICAgICAmIChQS1RfSU5fVVNFPDwyKSkpCisKKyNlbGlmICBkZWZpbmVkKE1JUFNFSVNBKSB8fCBkZWZpbmVkKG54NjAwMCkgfHwgXAorICAgICAgIGRlZmluZWQoZHJzNjAwMCkgIHx8IGRlZmluZWQoVVdzcGFyYykKKworI2RlZmluZSAgIGNhbl9hZGRfdHJhbnNtaXQoUGFja2V0UCxQb3J0UCkgXAorICAgICAgICAgICghKCh1aW50KShQYWNrZXRQID0gKHN0cnVjdCBQS1QgKilSSU9fUFRSKENhRCxSSU5EVyhQb3J0UC0+VHhBZGQpKSkgXAorCSAgJiBQS1RfSU5fVVNFKSkKKworI2Vsc2UKKyNkZWZpbmUgICBjYW5fYWRkX3RyYW5zbWl0KFBhY2tldFAsUG9ydFApIFwKKyAgICAgICAgICAoISgodWludCkoUGFja2V0UCA9IChzdHJ1Y3QgUEtUICopUklPX1BUUihDYUQsKlBvcnRQLT5UeEFkZCkpIFwKKwkgICYgUEtUX0lOX1VTRSkpCisjZW5kaWYKKworLyoKKyoqIFRvIGFkZCBhIHBhY2tldCB0byB0aGUgcXVldWUsIHlvdSBzZXQgdGhlIFBLVF9JTl9VU0UgYml0IGluIHRoZSBhZGRyZXNzLAorKiogYW5kIHRoZW4gbW92ZSB0aGUgVHhBZGQgcG9pbnRlciBhbG9uZyBvbmUgcG9zaXRpb24gdG8gcG9pbnQgdG8gdGhlIG5leHQKKyoqIHBhY2tldCBwb2ludGVyLiBZb3UgbXVzdCB3cmFwIHRoZSBwb2ludGVyIGZyb20gdGhlIGVuZCBiYWNrIHRvIHRoZSBzdGFydC4KKyovCisjaWYgZGVmaW5lZChNSVBTKSB8fCBkZWZpbmVkKG54NjAwMCkgfHwgZGVmaW5lZChkcnM2MDAwKSB8fCBkZWZpbmVkKFVXc3BhcmMpCisjICAgZGVmaW5lIGFkZF90cmFuc21pdChQb3J0UCkgIFwKKwlXSU5EVyhQb3J0UC0+VHhBZGQsUklORFcoUG9ydFAtPlR4QWRkKSB8IFBLVF9JTl9VU0UpO1wKKwlpZiAoUG9ydFAtPlR4QWRkID09IFBvcnRQLT5UeEVuZClcCisJICAgIFBvcnRQLT5UeEFkZCA9IFBvcnRQLT5UeFN0YXJ0O1wKKwllbHNlXAorCSAgICBQb3J0UC0+VHhBZGQrKztcCisJV1dPUkQoUG9ydFAtPlBoYlAtPnR4X2FkZCAsIFJJT19PRkYoQ2FELFBvcnRQLT5UeEFkZCkpOworI2VsaWYgZGVmaW5lZChBSVgpCisjICAgZGVmaW5lIGFkZF90cmFuc21pdChQb3J0UCkgIFwKKwl7XAorCSAgICByZWdpc3RlciB1c2hvcnQgKlR4QWRkUCA9ICh1c2hvcnQgKilSSU9fUFRSKENhZCxQb3J0UC0+VHhBZGRPKTtcCisJICAgIFdJTkRXKCBUeEFkZFAsIFJJTkRXKCBUeEFkZFAgKSB8IFBLVF9JTl9VU0UgKTtcCisJICAgIGlmIChQb3J0UC0+VHhBZGRPID09IFBvcnRQLT5UeEVuZE8gKVwKKwkJUG9ydFAtPlR4QWRkTyA9IFBvcnRQLT5UeFN0YXJ0TztcCisJICAgIGVsc2VcCisJCVBvcnRQLT5UeEFkZE8gKz0gc2l6ZW9mKHVzaG9ydCk7XAorCSAgICBXV09SRCgoKFBIQiAqKVJJT19QVFIoQ2FkLFBvcnRQLT5QaGJPKSktPnR4X2FkZCAsIFBvcnRQLT5UeEFkZE8gKTtcCisJfQorI2Vsc2UKKyMgICBkZWZpbmUgYWRkX3RyYW5zbWl0KFBvcnRQKSAgXAorCSpQb3J0UC0+VHhBZGQgfD0gUEtUX0lOX1VTRTtcCisJaWYgKFBvcnRQLT5UeEFkZCA9PSBQb3J0UC0+VHhFbmQpXAorCSAgICBQb3J0UC0+VHhBZGQgPSBQb3J0UC0+VHhTdGFydDtcCisJZWxzZVwKKwkgICAgUG9ydFAtPlR4QWRkKys7XAorCVBvcnRQLT5QaGJQLT50eF9hZGQgPSBSSU9fT0ZGKENhRCxQb3J0UC0+VHhBZGQpOworI2VuZGlmCisKKy8qCisqKiBjYW5fcmVtb3ZlX3JlY2VpdmUoIFBhY2tldFAsIFBvcnRQICkgcmV0dXJucyBub24temVybyBpZiBQS1RfSU5fVVNFIGlzIHNldAorKiogZm9yIHRoZSBuZXh0IHBhY2tldCBvbiB0aGUgcXVldWUuIEl0IHdpbGwgYWxzbyBzZXQgUGFja2V0UCB0byBwb2ludCB0byB0aGUKKyoqIHJlbGV2YW50IHBhY2tldCwgW2hhdmluZyBjbGVhcmVkIHRoZSBQS1RfSU5fVVNFIGJpdF0uIElmIFBLVF9JTl9VU0UgaXMgY2xlYXIsCisqKiB0aGVuIGNhbl9yZW1vdmVfcmVjZWl2ZSgpIHJldHVybnMgMC4KKyovCisjaWYgZGVmaW5lZChNSVBTKSB8fCBkZWZpbmVkKG54NjAwMCkgfHwgZGVmaW5lZChkcnM2MDAwKSB8fCBkZWZpbmVkKFVXc3BhcmMpCisjICAgZGVmaW5lIGNhbl9yZW1vdmVfcmVjZWl2ZShQYWNrZXRQLFBvcnRQKSBcCisJKChSSU5EVyhQb3J0UC0+UnhSZW1vdmUpICYgUEtUX0lOX1VTRSkgPyBcCisJKFBhY2tldFA9KHN0cnVjdCBQS1QgKilSSU9fUFRSKENhRCwoUklORFcoUG9ydFAtPlJ4UmVtb3ZlKSAmIH5QS1RfSU5fVVNFKSkpOjApCisjZWxpZiBkZWZpbmVkKEFJWCkKKyMgICBkZWZpbmUgY2FuX3JlbW92ZV9yZWNlaXZlKFBhY2tldFAsUG9ydFApIFwKKwkoKFJJTkRXKCh1c2hvcnQgKilSSU9fUFRSKENhZCxQb3J0UC0+UnhSZW1vdmVPKSkgJiBQS1RfSU5fVVNFKSA/IFwKKwkoUGFja2V0UD0oc3RydWN0IFBLVCAqKVJJT19QVFIoQ2FkLFJJTkRXKCh1c2hvcnQgKilSSU9fUFRSKENhZCxQb3J0UC0+UnhSZW1vdmVPKSkgJiB+UEtUX0lOX1VTRSkpOjApCisjZWxzZQorIyAgIGRlZmluZSBjYW5fcmVtb3ZlX3JlY2VpdmUoUGFja2V0UCxQb3J0UCkgXAorCSgoKlBvcnRQLT5SeFJlbW92ZSAmIFBLVF9JTl9VU0UpID8gXAorCShQYWNrZXRQPShzdHJ1Y3QgUEtUICopUklPX1BUUihDYUQsKCpQb3J0UC0+UnhSZW1vdmUgJiB+UEtUX0lOX1VTRSkpKTowKQorI2VuZGlmCisKKworLyoKKyoqIFdpbGwgR29kIHNlZSBpdCB3aXRoaW4gaGlzIGhlYXJ0IHRvIGZvcmdpdmUgdXMgZm9yIHRoaXMgdGhpbmcgdGhhdAorKiogd2UgaGF2ZSBjcmVhdGVkPyBUbyByZW1vdmUgYSBwYWNrZXQgZnJvbSB0aGUgcmVjZWl2ZSBxdWV1ZSB5b3UgY2xlYXIKKyoqIGl0cyBQS1RfSU5fVVNFIGJpdCwgYW5kIHRoZW4gYnVtcCB0aGUgcG9pbnRlcnMuIE9uY2UgdGhlIHBvaW50ZXJzCisqKiBnZXQgdG8gdGhlIGVuZCwgdGhleSBtdXN0IGJlIHdyYXBwZWQgYmFjayB0byB0aGUgc3RhcnQuCisqLworI2lmIGRlZmluZWQoTUlQUykgfHwgZGVmaW5lZChueDYwMDApIHx8IGRlZmluZWQoZHJzNjAwMCkgfHwgZGVmaW5lZChVV3NwYXJjKQorIyAgIGRlZmluZSByZW1vdmVfcmVjZWl2ZShQb3J0UCkgXAorCVdJTkRXKFBvcnRQLT5SeFJlbW92ZSwgKFJJTkRXKFBvcnRQLT5SeFJlbW92ZSkgJiB+UEtUX0lOX1VTRSkpO1wKKwlpZiAoUG9ydFAtPlJ4UmVtb3ZlID09IFBvcnRQLT5SeEVuZClcCisJICAgIFBvcnRQLT5SeFJlbW92ZSA9IFBvcnRQLT5SeFN0YXJ0O1wKKwllbHNlXAorCSAgICBQb3J0UC0+UnhSZW1vdmUrKztcCisJV1dPUkQoUG9ydFAtPlBoYlAtPnJ4X3JlbW92ZSAsIFJJT19PRkYoQ2FELFBvcnRQLT5SeFJlbW92ZSkpOworI2VsaWYgZGVmaW5lZChBSVgpCisjICAgZGVmaW5lIHJlbW92ZV9yZWNlaXZlKFBvcnRQKSBcCisgICAge1wKKyAgICAgICAgcmVnaXN0ZXIgdXNob3J0ICpSeFJlbW92ZVAgPSAodXNob3J0ICopUklPX1BUUihDYWQsUG9ydFAtPlJ4UmVtb3ZlTyk7XAorICAgICAgICBXSU5EVyggUnhSZW1vdmVQLCBSSU5EVyggUnhSZW1vdmVQICkgJiB+UEtUX0lOX1VTRSApO1wKKyAgICAgICAgaWYgKFBvcnRQLT5SeFJlbW92ZU8gPT0gUG9ydFAtPlJ4RW5kTylcCisgICAgICAgICAgICBQb3J0UC0+UnhSZW1vdmVPID0gUG9ydFAtPlJ4U3RhcnRPO1wKKyAgICAgICAgZWxzZVwKKyAgICAgICAgICAgIFBvcnRQLT5SeFJlbW92ZU8gKz0gc2l6ZW9mKHVzaG9ydCk7XAorICAgICAgICBXV09SRCgoKFBIQiAqKVJJT19QVFIoQ2FkLFBvcnRQLT5QaGJPKSktPnJ4X3JlbW92ZSwgUG9ydFAtPlJ4UmVtb3ZlTyApO1wKKyAgICB9CisjZWxzZQorIyAgIGRlZmluZSByZW1vdmVfcmVjZWl2ZShQb3J0UCkgXAorCSpQb3J0UC0+UnhSZW1vdmUgJj0gflBLVF9JTl9VU0U7XAorCWlmIChQb3J0UC0+UnhSZW1vdmUgPT0gUG9ydFAtPlJ4RW5kKVwKKwkgICAgUG9ydFAtPlJ4UmVtb3ZlID0gUG9ydFAtPlJ4U3RhcnQ7XAorCWVsc2VcCisJICAgIFBvcnRQLT5SeFJlbW92ZSsrO1wKKwlQb3J0UC0+UGhiUC0+cnhfcmVtb3ZlID0gUklPX09GRihDYUQsUG9ydFAtPlJ4UmVtb3ZlKTsKKyNlbmRpZgorI2VuZGlmCisKKworI2Vsc2UgLyogIUlOX0tFUk5FTCAqLworCisjZGVmaW5lIFpFUk9fUFRSIE5VTEwKKworCisjaWZkZWYgSE9TVAorLyogI2RlZmluZSBjYW5fcmVtb3ZlX3RyYW5zbWl0KHBrdCxwaGIpICgoKChjaGFyKilwa3QgPSAoKihjaGFyKiopKHBoYi0+dHhfcmVtb3ZlKSktMSkgfHwgMSkpICYmICgqcGhiLT51My5zMi50eF9yZW1vdmVfcHRyICYgUEtUX0lOX1VTRSkpICAgKi8KKyNkZWZpbmUgcmVtb3ZlX3RyYW5zbWl0KHBoYikgKnBoYi0+dTMuczIudHhfcmVtb3ZlX3B0ciAmPSB+KHVzaG9ydClQS1RfSU5fVVNFO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBoYi0+dHhfcmVtb3ZlID09IHBoYi0+dHhfZW5kKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhiLT50eF9yZW1vdmUgPSBwaGItPnR4X3N0YXJ0O1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhiLT50eF9yZW1vdmUrKzsKKyNkZWZpbmUgY2FuX2FkZF9yZWNlaXZlKHBoYikgISgqcGhiLT51NC5zMi5yeF9hZGRfcHRyICYgUEtUX0lOX1VTRSkKKyNkZWZpbmUgYWRkX3JlY2VpdmUocGt0LHBoYikgKnBoYi0+cnhfYWRkID0gcGt0O1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBoYi0+dTQuczIucnhfYWRkX3B0ciB8PSBQS1RfSU5fVVNFO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBoYi0+cnhfYWRkID09IHBoYi0+cnhfZW5kKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhiLT5yeF9hZGQgPSBwaGItPnJ4X3N0YXJ0O1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhiLT5yeF9hZGQrKzsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBSVEEKKyNkZWZpbmUgc3BseChvbGRzcGwpICAgIGlmICgob2xkc3BsKSA9PSAwKSBzcGwwKCkKKyNlbmRpZgorCisjZW5kaWYgLyogaWZuZGVmIF9saXN0LmggKi8KKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbHJ0LmggYi9kcml2ZXJzL2NoYXIvcmlvL2xydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYWM4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2xydC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgTCBSIFQKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhIC8gSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb19scnRfaF9zY2NzID0gIkAoIylscnQuaAkxLjEiIDsKKyNlbmRpZgorI2VuZGlmCisKKworI2lmZGVmIERDSVJSVVMKKyNkZWZpbmUgTFJUX1NUQUNLICAgICAgICh1bnNpZ25lZCBzaG9ydCkgNjAwCisjZWxzZQorI2RlZmluZSBMUlRfU1RBQ0sgICAgICAgICh1c2hvcnQpIDIwMAorI2VuZGlmCisKKworCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2x0dC5oIGIvZHJpdmVycy9jaGFyL3Jpby9sdHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjdkY2VjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9sdHQuaApAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgIEwgVCBUCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYSAvIEplcmVteSBSb2xscworIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9fbHR0X2hfc2NjcyA9ICJAKCMpbHR0LmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRENJUlJVUworI2RlZmluZSBMVFRfU1RBQ0sgICAgICAgKHVuc2lnbmVkIHNob3J0KSAgNjAwCisjZWxzZQorI2RlZmluZSBMVFRfU1RBQ0sgICAgICAgKHVzaG9ydCkgMjAwCisjZW5kaWYKKyAKKworCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbHR0d2FrZS5oIGIvZHJpdmVycy9jaGFyL3Jpby9sdHR3YWtlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxN2QwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vbHR0d2FrZS5oCkBAIC0wLDAgKzEsNTMgQEAKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICBMIFQgVCAgICBXIEEgSyBFIFUgUCAgICBIIEUgQSBEIEUgUgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvX2x0dHdha2VfaF9zY2NzID0gIkAoIylsdHR3YWtlLmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIExUVF9XQUtFVVBfU1RBQ0sgICAgICAgICAgNTAwCisjZGVmaW5lIExUVF9XQUtFVVBfSU5URVJWQUwgICAgICAgKGludCkgKDUwMCAqIE1JTExJU0VDT05EKQorCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbWFwLmggYi9kcml2ZXJzL2NoYXIvcmlvL21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMDY0NWExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9tYXAuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogbWFwLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjExCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCisqKgorKiogIGlkZW50IEAoIyltYXAuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb19tYXBfaF9fCisjZGVmaW5lIF9fcmlvX21hcF9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX21hcF9oX3NjY3NfID0gIkAoIyltYXAuaAkxLjIiOworI2VuZGlmCisKKy8qCisqKiBtYXBwaW5nIHN0cnVjdHVyZSBwYXNzZWQgdG8gYW5kIGZyb20gdGhlIGNvbmZpZy5yaW8gcHJvZ3JhbSB0bworKiogZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHRvcG9sb2d5IG9mIHRoZSB3b3JsZAorKi8KKworI2RlZmluZSBNQVhfTUFQX0VOVFJZIDE3CisjZGVmaW5lCVRPVEFMX01BUF9FTlRSSUVTIChNQVhfTUFQX0VOVFJZKlJJT19TTE9UUykKKyNkZWZpbmUJTUFYX05BTUVfTEVOIDMyCisKK3N0cnVjdCBNYXAKK3sKKwl1aW50CUhvc3RVbmlxdWVOdW07CSAgICAgICAgLyogU3VwcG9ydGluZyBob3N0cyB1bmlxdWUgbnVtYmVyICovCisJdWludAlSdGFVbmlxdWVOdW07CSAgICAgICAgLyogVW5pcXVlIG51bWJlciAqLworCS8qCisJKiogVGhlIG5leHQgdHdvIElEcyBtdXN0IGJlIHN3YXBwZWQgb24gYmlnLWVuZGlhbiBhcmNoaXRlY3R1cmVzCisJKiogd2hlbiB1c2luZyBhIHYyLjA0IC9ldGMvcmlvL2NvbmZpZyB3aXRoIGEgdjMuMDAgZHJpdmVyICh3aGVuCisJKiogdXBncmFkaW5nIGZvciBleGFtcGxlKS4KKwkqLworCXVzaG9ydAlJRDsJCQkvKiBJRCB1c2VkIGluIHRoZSBzdWJuZXQgKi8KKwl1c2hvcnQJSUQyOwkJCS8qIElEIG9mIDJuZCBibG9jayBvZiA4IGZvciAxNiBwb3J0ICovCisJdWxvbmcJRmxhZ3M7CQkJLyogQm9vdGVkLCBJRCBHaXZlbiwgRGlzY29ubmVjdGVkICovCisJdWxvbmcJU3lzUG9ydDsJCS8qIEZpcnN0IHR0eSBtYXBwZWQgdG8gdGhpcyBwb3J0ICovCisJc3RydWN0IFRvcCAgIFRvcG9sb2d5W0xJTktTX1BFUl9VTklUXTsJLyogSUQgY29ubmVjdGVkIHRvIGVhY2ggbGluayAqLworCWNoYXIJTmFtZVtNQVhfTkFNRV9MRU5dOyAgICAgICAgLyogQ3V0ZSBuYW1lIGJ5IHdoaWNoIFJUQSBpcyBrbm93biAqLworfTsKKworLyoKKyoqIEZsYWcgdmFsdWVzOgorKi8KKyNkZWZpbmUJUlRBX0JPT1RFRAkJMHgwMDAwMDAwMQorI2RlZmluZSBSVEFfTkVXQk9PVAkJMHgwMDAwMDAxMAorI2RlZmluZQlNU0dfRE9ORQkJMHgwMDAwMDAyMAorI2RlZmluZQlSVEFfSU5URVJDT05ORUNUCTB4MDAwMDAwNDAKKyNkZWZpbmUJUlRBMTZfU0VDT05EX1NMT1QJMHgwMDAwMDA4MAorI2RlZmluZQlCRUVOX0hFUkUJCTB4MDAwMDAxMDAKKyNkZWZpbmUgU0xPVF9URU5UQVRJVkUJCTB4NDAwMDAwMDAKKyNkZWZpbmUgU0xPVF9JTl9VU0UJCTB4ODAwMDAwMDAKKworLyoKKyoqIEhvc3RVbmlxdWVOdW0gaXMgdGhlIHVuaXF1ZSBudW1iZXIgZnJvbSB0aGUgaG9zdCBjYXJkIHRoYXQgdGhpcyBSVEEKKyoqIGlzIHRvIGJlIGNvbm5lY3RlZCB0by4KKyoqIFJ0YVVuaXF1ZU51bSBpcyB0aGUgdW5pcXVlIG51bWJlciBvZiB0aGUgUlRBIGNvbmNlcm5lZC4gSXQgd2lsbCBiZSBaRVJPCisqKiBpZiB0aGUgc2xvdCBpbiB0aGUgdGFibGUgaXMgdW51c2VkLiBJZiBpdCBpcyB0aGUgc2FtZSBhcyB0aGUgSG9zdFVuaXF1ZU51bQorKiogdGhlbiB0aGlzIHNsb3QgcmVwcmVzZW50cyBhIGhvc3QgY2FyZC4KKyoqIEZsYWdzIGNvbnRhaW5zIGN1cnJlbnQgYm9vdC9yb3V0ZSBzdGF0ZSBpbmZvCisqKiBTeXNQb3J0IGlzIGEgdmFsdWUgaW4gdGhlIHJhbmdlIDAtNTA0LCBiZWluZyB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCB0dHkKKyoqIG9uIHRoaXMgUlRBLiBFYWNoIFJUQSBzdXBwb3J0cyA4IHBvcnRzLiBUaGUgU3lzUG9ydCB2YWx1ZSBtdXN0IGJlIG1vZHVsbyA4LgorKiogU3lzUG9ydCAwLTEyNyBjb3JyZXNwb25kIHRvIC9kZXYvdHR5cjAwMSB0byAvZGV2L3R0eXIxMjgsIHdpdGggbWlub3IKKyoqIG51bWJlcnMgMC0xMjcuIFN5c1BvcnQgMTI4LTI1NSBjb3JyZXNwb25kIHRvIC9kZXYvdHR5cjEyOSB0byAvZGV2L3R0eXIyNTYsCisqKiBhZ2FpbiB3aXRoIG1pbm9yIG51bWJlcnMgMC0xMjcsIGFuZCBzbyBvbiBmb3IgU3lzUG9ydHMgMjU2LTM4MyBhbmQgMzg0LTUxMQorKiogSUQgd2lsbCBiZSBpbiB0aGUgcmFuZ2UgMC0xNiBmb3IgYSBga25vd24nIFJUQS4gSUQgd2lsbCBiZSAweEZGRkYgZm9yIGFuCisqKiB1bnVzZWQgc2xvdC91bmtub3duIElEIGV0Yy4KKyoqIFRoZSBUb3BvbG9neSBhcnJheSBjb250YWlucyB0aGUgSUQgb2YgdGhlIHVuaXQgY29ubmVjdGVkIHRvIGVhY2ggb2YgdGhlCisqKiBmb3VyIGxpbmtzIG9uIHRoaXMgdW5pdC4gVGhlIGVudHJ5IHdpbGwgYmUgMHhGRkZGIGlmIE5PVEhJTkcgaXMgY29ubmVjdGVkCisqKiB0byB0aGUgbGluaywgb3Igd2lsbCBiZSAweEZGMDAgaWYgYW4gVU5LTk9XTiB1bml0IGlzIGNvbm5lY3RlZCB0byB0aGUgbGluay4KKyoqIFRoZSBOYW1lIGZpZWxkIGlzIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZywgdXB0byAzMSBjaGFyYWN0ZXJzLCBjb250YWluaW5nCisqKiB0aGUgJ2N1dGUnIG5hbWUgdGhhdCB0aGUgc3lzYWRtaW4vdXNlcnMga25vdyB0aGUgUlRBIGJ5LiBJdCBpcyBwZXJtaXNzaWJsZQorKiogZm9yIHRoaXMgc3RyaW5nIHRvIGNvbnRhaW4gYW55IGNoYXJhY3RlciBpbiB0aGUgcmFuZ2UgXDA0MCB0byBcMTc2IGluY2x1c2l2ZS4KKyoqIEluIHBhcnRpY3VsYXIsIGN0cmwgc2VxdWVuY2VzIGFuZCBERUwgKDB4N0YsIFwxNzcpIGFyZSBub3QgYWxsb3dlZC4gVGhlCisqKiBzcGVjaWFsIGNoYXJhY3RlciAnJScgSVMgYWxsb3dhYmxlLCBhbmQgbmVlZHMgbm8gc3BlY2lhbCBhY3Rpb24uCisqKgorKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL21jYS5oIGIvZHJpdmVycy9jaGFyL3Jpby9tY2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGEzMjdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9tY2EuaApAQCAtMCwwICsxLDczIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBtY2EuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTEKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKKyoqCisqKiAgaWRlbnQgQCgjKW1jYS5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvX21jYV9oX18KKyNkZWZpbmUJX19yaW9fbWNhX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfbWNhX2hfc2Njc18gPSAiQCgjKW1jYS5oCTEuMiI7CisjZW5kaWYKKworLyoKKyoqIE1pY3JvIENoYW5uZWwgc3R1ZmYKKyovCisKKyNkZWZpbmUJTWNhTWF4U2xvdHMJOAorI2RlZmluZSBNY2FTbG90U2VsZWN0CTB4OTYKKyNkZWZpbmUJTWNhU2xvdEVuYWJsZQkweDA4CisjZGVmaW5lCU1jYUlkTG93CTB4MTAwCisjZGVmaW5lCU1jYUlkSGlnaAkweDEwMQorI2RlZmluZQlNY2FJcnFFbmFibGUJMHgxMDIKKyNkZWZpbmUJTWNhTWVtb3J5CTB4MTAzCisjZGVmaW5lIE1jYVJJT0lkCTB4NmE1YworI2RlZmluZQlNY2FJcnE5CQkweDAwCisjZGVmaW5lCU1jYUlycTMJCTB4MDIKKyNkZWZpbmUJTWNhSXJxNAkJMHgwNAorI2RlZmluZQlNY2FJcnE3CQkweDA2CisjZGVmaW5lCU1jYUlycTEwCTB4MDgKKyNkZWZpbmUJTWNhSXJxMTEJMHgwQQorI2RlZmluZQlNY2FJcnExMgkweDBDCisjZGVmaW5lCU1jYUlycTE1CTB4MEUKKyNkZWZpbmUgTWNhSXJxTWFzawkweDBFCisjZGVmaW5lCU1jYUNhcmRFbmFibGUJMHgwMQorI2RlZmluZQlNY2FBZGRyZXNzKFgpCSgoKFgpJjB4RkYpPDwxNikKKworI2RlZmluZQlNY2FUcEZhc3RMaW5rcwkgICAgICAgIDB4NDAKKyNkZWZpbmUJTWNhVHBTbG93TGlua3MJICAgICAgICAweDAwCisjZGVmaW5lCU1jYVRwQm9vdEZyb21SYW0JMHgwMQorI2RlZmluZQlNY2FUcEJvb3RGcm9tTGluawkweDAwCisjZGVmaW5lCU1jYVRwQnVzRW5hYmxlCQkweDAyCisjZGVmaW5lCU1jYVRwQnVzRGlzYWJsZQkJMHgwMAorCisjZGVmaW5lCVJJT19NQ0FfREVGQVVMVF9NT0RFCVNMT1dfTElOS1MKKworI2VuZGlmCS8qIF9fcmlvX21jYV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbWVzZy5oIGIvZHJpdmVycy9jaGFyL3Jpby9tZXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmNmMwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vbWVzZy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IG1lc2cuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTIKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKKyoqCisqKiAgaWRlbnQgQCgjKW1lc2cuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb19tZXNnX2hfXworI2RlZmluZQlfX3Jpb19tZXNnX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfbWVzZ19oX3NjY3NfID0gIkAoIyltZXNnLmgJMS4yIjsKKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfX3Jpb19tZXNnX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9wYXJhbS5oIGIvZHJpdmVycy9jaGFyL3Jpby9wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzMwYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3BhcmFtLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcGFyYW0uaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTIKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKKyoqCisqKiAgaWRlbnQgQCgjKXBhcmFtLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fcGFyYW1faF9fCisjZGVmaW5lIF9fcmlvX3BhcmFtX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcGFyYW1faF9zY2NzXyA9ICJAKCMpcGFyYW0uaAkxLjIiOworI2VuZGlmCisKKworLyoKKyoqIHRoZSBwYXJhbSBjb21tYW5kIGJsb2NrLCBhcyB1c2VkIGluIE9QRU4gYW5kIFBBUkFNIGNhbGxzLgorKi8KKworc3RydWN0IHBoYl9wYXJhbQoreworICAgIEJZVEUgICAgQ21kOyAgICAgICAgLyogSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGVzZSBsaW5lIHVwICovCisgICAgQllURSAgICBDb3IxOyAgICAgICAvKiB3aXRoIHdoYXQgaXMgZXhwZWN0ZWQgYXQgdGhlIG90aGVyIGVuZC4gKi8KKyAgICBCWVRFICAgIENvcjI7ICAgICAgIC8qIHRvIGNvbmZpcm0gdGhhdCB5b3UndmUgZ290IGl0IHJpZ2h0LCAgICAqLworICAgIEJZVEUgICAgQ29yNDsgICAgICAgLyogY2hlY2sgd2l0aCBjaXJydXMvY2lycnVzLmggICAgICAgICAgICAgICovCisgICAgQllURSAgICBDb3I1OworICAgIEJZVEUgICAgVHhYb247CS8qIFRyYW5zbWl0IFgtT24gY2hhcmFjdGVyICovCisgICAgQllURSAgICBUeFhvZmY7CS8qIFRyYW5zbWl0IFgtT2ZmIGNoYXJhY3RlciAqLworICAgIEJZVEUgICAgUnhYb247CS8qIFJlY2VpdmUgWC1PbiBjaGFyYWN0ZXIgKi8KKyAgICBCWVRFICAgIFJ4WG9mZjsJLyogUmVjZWl2ZSBYLU9mZiBjaGFyYWN0ZXIgKi8KKyAgICBCWVRFICAgIExOZXh0OwkvKiBMaXRlcmFsLW5leHQgY2hhcmFjdGVyICovCisgICAgQllURSAgICBUeEJhdWQ7CS8qIFRyYW5zbWl0IGJhdWRyYXRlICovCisgICAgQllURSAgICBSeEJhdWQ7CS8qIFJlY2VpdmUgYmF1ZHJhdGUgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9wYXJtbWFwLmggYi9kcml2ZXJzL2NoYXIvcmlvL3Bhcm1tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmY5OWRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wYXJtbWFwLmgKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgIEggTyBTIFQgICBNIEUgTSBPIFIgWSAgTSBBIFAKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhIC8gSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis2LzQvMTk5MSAgIGpvbmIJCSAgICAgTWFkZSBjaGFuZ2VzIHRvIGFjY29tbW9kYXRlIE1pcHMgUjMyMzAgYnVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9wYXJtYXBfaAorI2RlZmluZSBfcGFybWFwX2gKKworCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKl9yaW9fcGFybW1hcF9oX3NjY3MgPSAiQCgjKXBhcm1tYXAuaAkxLjQiOyAqLworI2VuZGlmCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgUEFSTV9NQVAgUEFSTV9NQVAgOworCitzdHJ1Y3QgUEFSTV9NQVAKK3sKK1BIQl9wdHIgICAgICAgICAgIHBoYl9wdHIgOyAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgUEhCIGFycmF5ICovCitXT1JEX3B0ciAgICAgICAgICBwaGJfbnVtX3B0ciA7ICAgICAgICAgIC8qIFB0ciB0byBOdW1iZXIgb2YgUEhCJ3MgKi8KK0ZSRUVfTElTVF9wdHIgICAgIGZyZWVfbGlzdDsgICAgICAgICAgICAgLyogRnJlZSBMaXN0IHBvaW50ZXIgKi8KK0ZSRUVfTElTVF9wdHIgICAgIGZyZWVfbGlzdF9lbmQ7ICAgICAgICAgLyogRnJlZSBMaXN0IEVuZCBwb2ludGVyICovCitRX0JVRl9wdHJfcHRyICAgICBxX2ZyZWVfbGlzdF9wdHIgOyAgICAgIC8qIFB0ciB0byBRX0JVRiB2YXJpYWJsZSAqLworQllURV9wdHIgICAgICAgICAgdW5pdF9pZF9wdHIgOyAgICAgICAgICAvKiBVbml0IElkICovCitMUEJfcHRyICAgICAgICAgICBsaW5rX3N0cl9wdHIgOyAgICAgICAgIC8qIExpbmsgU3RydWN0dXJlIEFycmF5ICovCitCWVRFX3B0ciAgICAgICAgICBib290bG9hZGVyXzEgOyAgICAgICAgIC8qIDFzdCBTdGFnZSBCb290IExvYWRlciAqLworQllURV9wdHIgICAgICAgICAgYm9vdGxvYWRlcl8yIDsgICAgICAgICAvKiAybmQgU3RhZ2UgQm9vdCBMb2FkZXIgKi8KK1dPUkRfcHRyICAgICAgICAgIHBvcnRfcm91dGVfbWFwX3B0ciA7ICAgLyogUG9ydCBSb3V0ZSBNYXAgKi8KK1JPVVRFX1NUUl9wdHIgICAgIHJvdXRlX3B0ciA7ICAgICAgICAgICAgLyogVW5pdCBSb3V0ZSBNYXAgKi8KK05VTUJFUl9wdHIgICAgICAgIG1hcF9wcmVzZW50IDsgICAgICAgICAgLyogUm91dGUgTWFwIHByZXNlbnQgKi8KK05VTUJFUiAgICAgICAgICAgIHBrdF9udW0gOyAgICAgICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBwYWNrZXRzICovCitOVU1CRVIgICAgICAgICAgICBxX251bSA7ICAgICAgICAgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgUSBwYWNrZXRzICovCitXT1JEICAgICAgICAgICAgICBidWZmZXJzX3Blcl9wb3J0IDsgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyBwZXIgcG9ydCAqLworV09SRCAgICAgICAgICAgICAgaGVhcF9zaXplIDsgICAgICAgICAgICAgLyogSW5pdGlhbCBzaXplIG9mIGhlYXAgKi8KK1dPUkQgICAgICAgICAgICAgIGhlYXBfbGVmdCA7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgSGVhcCBsZWZ0ICovCitXT1JEICAgICAgICAgICAgICBlcnJvciA7ICAgICAgICAgICAgICAgICAvKiBFcnJvciBjb2RlICovCitXT1JEICAgICAgICAgICAgICB0eF9tYXg7ICAgICAgICAgICAgICAgICAvKiBNYXggbnVtYmVyIG9mIHR4IHBrdHMgcGVyIHBoYiAqLworV09SRCAgICAgICAgICAgICAgcnhfbWF4OyAgICAgICAgICAgICAgICAgLyogTWF4IG51bWJlciBvZiByeCBwa3RzIHBlciBwaGIgKi8KK1dPUkQgICAgICAgICAgICAgIHJ4X2xpbWl0OyAgICAgICAgICAgICAgIC8qIEZvciBoaWdoIC8gbG93IHdhdGVybWFya3MgKi8KK05VTUJFUiAgICAgICAgICAgIGxpbmtzIDsgICAgICAgICAgICAgICAgIC8qIExpbmtzIHRvIHVzZSAqLworTlVNQkVSICAgICAgICAgICAgdGltZXIgOyAgICAgICAgICAgICAgICAgLyogSW50ZXJydXB0cyBwZXIgc2Vjb25kICovCitSVVBfcHRyICAgICAgICAgICBydXBzIDsgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIFJVUHMgKi8KK1dPUkQgICAgICAgICAgICAgIG1heF9waGIgOyAgICAgICAgICAgICAgLyogTW9zdGx5IGZvciBkZWJ1Z2dpbmcgKi8KK1dPUkQgICAgICAgICAgICAgIGxpdmluZyA7ICAgICAgICAgICAgICAgLyogSnVzdCBpbmNyZW1lbnRzISEgKi8KK1dPUkQgICAgICAgICAgICAgIGluaXRfZG9uZSA7ICAgICAgICAgICAgLyogSW5pdGlhbGlzYXRpb24gb3ZlciAqLworV09SRCAgICAgICAgICAgICAgYm9vdGluZ19saW5rIDsKK1dPUkQgICAgICAgICAgICAgIGlkbGVfY291bnQgOyAgICAgICAgICAgLyogSWRsZSB0aW1lIGNvdW50ZXIgKi8KK1dPUkQgICAgICAgICAgICAgIGJ1c3lfY291bnQgOyAgICAgICAgICAgLyogQnVzeSBjb3VudGVyICovCitXT1JEICAgICAgICAgICAgICBpZGxlX2NvbnRyb2wgOyAgICAgICAgIC8qIENvbnRyb2wgSWRsZSBQcm9jZXNzICovCisjaWYgZGVmaW5lZChIT1NUKSB8fCBkZWZpbmVkKElOS0VSTkVMKQorV09SRCAgICAgICAgICAgICAgdHhfaW50cjsgICAgICAgICAgICAgICAvKiBUWCBpbnRlcnJ1cHQgcGVuZGluZyAqLworV09SRCAgICAgICAgICAgICAgcnhfaW50cjsgICAgICAgICAgICAgICAvKiBSWCBpbnRlcnJ1cHQgcGVuZGluZyAqLworV09SRCAgICAgICAgICAgICAgcnVwX2ludHI7ICAgICAgICAgICAgICAvKiBSVVAgaW50ZXJydXB0IHBlbmRpbmcgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoUlRBKQorV09SRAkJICBkeWluZ19jb3VudDsJCS8qIENvdW50IG9mIHByb2Nlc3NlcyBkZWFkICovCisjZW5kaWYKK30gOworCisjZW5kaWYKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcGNpLmggYi9kcml2ZXJzL2NoYXIvcmlvL3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjM1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3BjaS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHBjaS5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxMgorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMQorKioKKyoqICBpZGVudCBAKCMpcGNpLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fcGNpX2hfXworI2RlZmluZQlfX3Jpb19wY2lfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9wY2lfaF9zY2NzXyA9ICJAKCMpcGNpLmgJMS4yIjsKKyNlbmRpZgorCisvKgorKiogUENJIHN0dWZmCisqLworCisjZGVmaW5lCVBDSVRwRmFzdENsb2NrCQkweDgwCisjZGVmaW5lCVBDSVRwU2xvd0Nsb2NrCQkweDAwCisjZGVmaW5lCVBDSVRwRmFzdExpbmtzCSAgICAgICAgMHg0MAorI2RlZmluZQlQQ0lUcFNsb3dMaW5rcwkgICAgICAgIDB4MDAKKyNkZWZpbmUJUENJVHBJbnRFbmFibGUJCTB4MDQKKyNkZWZpbmUJUENJVHBJbnREaXNhYmxlCQkweDAwCisjZGVmaW5lCVBDSVRwQnVzRW5hYmxlCQkweDAyCisjZGVmaW5lCVBDSVRwQnVzRGlzYWJsZQkJMHgwMAorI2RlZmluZQlQQ0lUcEJvb3RGcm9tUmFtCTB4MDEKKyNkZWZpbmUJUENJVHBCb290RnJvbUxpbmsJMHgwMAorCisjZGVmaW5lCVJJT19QQ0lfVkVORE9SCQkweDExQ0IKKyNkZWZpbmUJUklPX1BDSV9ERVZJQ0UJCTB4ODAwMAorI2RlZmluZQlSSU9fUENJX0JBU0VfQ0xBU1MJMHgwMgorI2RlZmluZQlSSU9fUENJX1NVQl9DTEFTUwkweDgwCisjZGVmaW5lCVJJT19QQ0lfUFJPR19JRkFDRQkweDAwCisKKyNkZWZpbmUgUklPX1BDSV9SSUQJCTB4MDAwOAorI2RlZmluZSBSSU9fUENJX0JBRFIwCQkweDAwMTAKKyNkZWZpbmUgUklPX1BDSV9JTlRMTgkJMHgwMDNDCisjZGVmaW5lIFJJT19QQ0lfSU5UUElOCQkweDAwM0QKKworI2RlZmluZQlSSU9fUENJX01FTV9TSVpFCTY1NTM2CisKKyNkZWZpbmUJUklPX1BDSV9UVVJCT19UUAkweDgwCisjZGVmaW5lCVJJT19QQ0lfRkFTVF9MSU5LUwkweDQwCisjZGVmaW5lCVJJT19QQ0lfSU5UX0VOQUJMRQkweDA0CisjZGVmaW5lCVJJT19QQ0lfVFBfQlVTX0VOQUJMRQkweDAyCisjZGVmaW5lCVJJT19QQ0lfQk9PVF9GUk9NX1JBTQkweDAxCisKKyNkZWZpbmUJUklPX1BDSV9ERUZBVUxUX01PREUJMHgwNQorCisjZW5kaWYJLyogX19yaW9fcGNpX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9waGIuaCBiL2RyaXZlcnMvY2hhci9yaW8vcGhiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0ODNhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcGhiLmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgIFAgSCBCICAgICBIIEUgQSBEIEUgUiAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhLCBKZXJlbXkgUm9sbHMKKyBEYXRlICAgIDogCisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3BoYl9oCisjZGVmaW5lIF9waGJfaCAxCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CisvKiBzdGF0aWMgY2hhciAqX3Jpb19waGJfaF9zY2NzID0gIkAoIylwaGIuaAkxLjEyIjsgKi8KKyNlbmRpZgorI2VuZGlmCisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogU2V0IHRoZSBMSU1JVCB2YWx1ZXMuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBSVEEKKyNkZWZpbmUgUlhfTElNSVQgICAgICAgKHVzaG9ydCkgMworI2VuZGlmCisjaWZkZWYgSE9TVAorI2RlZmluZSBSWF9MSU1JVCAgICAgICAodXNob3J0KSAxCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGFuZHNoYWtlIGFzc2VydGVkLiBEZWFzc2VydGVkIGJ5IHRoZSBMVFQocykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBIQl9IQU5EU0hBS0VfU0VUICAgICAgKCh1c2hvcnQpIDB4MDAxKSAvKiBTZXQgYnkgTFJUICovCisKKyNkZWZpbmUgUEhCX0hBTkRTSEFLRV9SRVNFVCAgICAgKCh1c2hvcnQpIDB4MDAyKSAvKiBTZXQgYnkgSVNSIC8gZHJpdmVyICovCisKKyNkZWZpbmUgUEhCX0hBTkRTSEFLRV9GTEFHUyAgICAgKFBIQl9IQU5EU0hBS0VfUkVTRVQgfCBQSEJfSEFORFNIQUtFX1NFVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IGJ5IGx0dCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXhpbXVtIG51bWJlciBvZiBQSEIncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkIChIT1NUKSB8fCBkZWZpbmVkIChJTktFUk5FTCkKKyNkZWZpbmUgTUFYX1BIQiAgICAgICAgICAgICAgICgodXNob3J0KSAxMjgpICAvKiByYW5nZSAwLTEyNyAqLworI2Vsc2UKKyNkZWZpbmUgTUFYX1BIQiAgICAgICAgICAgICAgICgodXNob3J0KSA4KSAgICAvKiByYW5nZSAwLTcgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5lcyBmb3IgdGhlIG1vZGUgZmllbGRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBUWFBLVF9JTkNPTVBMRVRFICAgICAgICAweDAwMDEgIC8qIFByZXZpb3VzIHR4IHBhY2tldCBub3QgY29tcGxldGVkICovCisjZGVmaW5lIFRYSU5UUl9FTkFCTEVEICAgICAgICAgIDB4MDAwMiAgLyogVHggaW50ZXJydXB0IGlzIGVuYWJsZWQgKi8KKyNkZWZpbmUgVFhfVEFCMyAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBUQUIzIG1vZGUgKi8KKyNkZWZpbmUgVFhfT0NSTkwgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBPQ1JOTCBtb2RlICovCisjZGVmaW5lIFRYX09OTENSICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogT05MQ1IgbW9kZSAqLworI2RlZmluZSBUWF9TRU5EU1BBQ0VTICAgICAgICAgICAweDAwMjAgIC8qIFNlbmQgbiBzcGFjZXMgY29tbWFuZCBuZWVkcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW5nICovCisjZGVmaW5lIFRYX1NFTkROVUxMICAgICAgICAgICAgIDB4MDA0MCAgLyogRXNjYXBpbmcgTlVMTCBuZWVkcyBjb21wbGV0aW5nICovCisjZGVmaW5lIFRYX1NFTkRMRiAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTEYgLT4gQ1IgTEYgbmVlZHMgY29tcGxldGluZyAqLworI2RlZmluZSBUWF9QQVJBTExFTEJVRyAgICAgICAgICAweDAxMDAgIC8qIENEMTQwMCBMRiAtPiBDUiBMRiBidWcgb24gcGFyYWxsZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0ICovCisjZGVmaW5lIFRYX0hBTkdPVkVSICAgICAgICAgICAgIChUWF9TRU5EU1BBQ0VTIHwgVFhfU0VORExGIHwgVFhfU0VORE5VTEwpCisjZGVmaW5lIFRYX0RUUkZMT1cJCTB4MDIwMAkvKiBEVFIgdHggZmxvdyBjb250cm9sICovCisjZGVmaW5lCVRYX0RUUkZMT1dFRAkJMHgwNDAwCS8qIERUUiBpcyBsb3cgLSBkb24ndCBhbGxvdyBtb3JlIGRhdGEKKwkJCQkJICAgaW50byB0aGUgRklGTyAqLworI2RlZmluZQlUWF9EQVRBSU5GSUZPCQkweDA4MDAJLyogVGhlcmUgaXMgZGF0YSBpbiB0aGUgRklGTyAqLworI2RlZmluZQlUWF9CVVNZCQkJMHgxMDAwCS8qIERhdGEgaW4gRklGTywgc2hpZnQgb3IgaG9sZGluZyByZWdzICovCisKKyNkZWZpbmUgUlhfU1BBUkUJICAgICAgICAweDAwMDEgICAvKiBTUEFSRSAqLworI2RlZmluZSBSWElOVFJfRU5BQkxFRCAgICAgICAgICAweDAwMDIgICAvKiBSeCBpbnRlcnJ1cHQgZW5hYmxlZCAqLworI2RlZmluZSBSWF9JQ1JOTCAgICAgICAgICAgICAgICAweDAwMDggICAvKiBJQ1JOTCBtb2RlICovCisjZGVmaW5lIFJYX0lOTENSICAgICAgICAgICAgICAgIDB4MDAxMCAgIC8qIElOTENSIG1vZGUgKi8KKyNkZWZpbmUgUlhfSUdOQ1IgICAgICAgICAgICAgICAgMHgwMDIwICAgLyogSUdOQ1IgbW9kZSAqLworI2RlZmluZSBSWF9DVFNGTE9XICAgICAgICAgICAgICAweDAwNDAgICAvKiBDVFNGTE9XIGVuYWJsZWQgKi8KKyNkZWZpbmUgUlhfSVhPRkYgICAgICAgICAgICAgICAgMHgwMDgwICAgLyogSVhPRkYgZW5hYmxlZCAqLworI2RlZmluZSBSWF9DVFNGTE9XRUQgICAgICAgICAgICAweDAxMDAgICAvKiBDVFNGTE9XIGFuZCBDVFMgZHJvcHBlZCAqLworI2RlZmluZSBSWF9JWE9GRkVEICAgICAgICAgICAgICAweDAyMDAgICAvKiBJWE9GRiBhbmQgeG9mZiBzZW50ICovCisjZGVmaW5lIFJYX0JVRkZFUkVECQkweDA0MDAJIC8qIFRyeSBhbmQgcGFzcyBvbiBjb21wbGV0ZSBwYWNrZXRzICovCisKKyNkZWZpbmUgUE9SVF9JU09QRU4gICAgICAgICAgICAgMHgwMDAxICAvKiBQb3J0IG9wZW4/ICovCisjZGVmaW5lIFBPUlRfSFVQQ0wgICAgICAgICAgICAgIDB4MDAwMiAgLyogSGFuZ3VwIG9uIGNsb3NlPyAqLworI2RlZmluZSBQT1JUX01PUEVOUEVORCAgICAgICAgICAweDAwMDQgIC8qIE1vZGVtIG9wZW4gcGVuZGluZyAqLworI2RlZmluZSBQT1JUX0lTUEFSQUxMRUwgICAgICAgICAweDAwMDggIC8qIFBhcmFsbGVsIHBvcnQgKi8KKyNkZWZpbmUgUE9SVF9CUkVBSyAgICAgICAgICAgICAgMHgwMDEwICAvKiBQb3J0IG9uIGJyZWFrICovCisjZGVmaW5lIFBPUlRfU1RBVFVTUEVORAkJMHgwMDIwICAvKiBTdGF0dXMgcGFja2V0IHBlbmRpbmcgKi8KKyNkZWZpbmUgUE9SVF9CUkVBS1BFTkQgICAgICAgICAgMHgwMDQwICAvKiBCcmVhayBwYWNrZXQgcGVuZGluZyAqLworI2RlZmluZSBQT1JUX01PREVNUEVORCAgICAgICAgICAweDAwODAgIC8qIE1vZGVtIHN0YXR1cyBwYWNrZXQgcGVuZGluZyAqLworI2RlZmluZSBQT1JUX1BBUkFMTEVMQlVHICAgICAgICAweDAxMDAgIC8qIENEMTQwMCBMRiAtPiBDUiBMRiBidWcgb24gcGFyYWxsZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0ICovCisjZGVmaW5lIFBPUlRfRlVMTE1PREVNICAgICAgICAgIDB4MDIwMCAgLyogRnVsbCBtb2RlbSBzaWduYWxzICovCisjZGVmaW5lIFBPUlRfUko0NSAgICAgICAgICAgICAgIDB4MDQwMCAgLyogUko0NSBjb25uZWN0b3IgLSBubyBSSSBzaWduYWwgKi8KKyNkZWZpbmUgUE9SVF9SRVNUUklDVEVEICAgICAgICAgMHgwNjAwICAvKiBSZXN0cmljdGVkIGNvbm5lY3RvciAtIG5vIFJJIC8gRFRSICovCisKKyNkZWZpbmUgUE9SVF9NT0RFTUJJVFMgICAgICAgICAgMHgwNjAwICAvKiBNYXNrIGZvciBtb2RlbSBmaWVsZHMgKi8KKworI2RlZmluZSBQT1JUX1dDTE9TRSAgICAgICAgICAgICAweDA4MDAgIC8qIFdhaXRpbmcgZm9yIGNsb3NlICovCisjZGVmaW5lCVBPUlRfSEFORFNIQUtFRklYCTB4MTAwMAkvKiBQb3J0IGhhcyBIL1cgZmxvdyBjb250cm9sIGZpeCAqLworI2RlZmluZQlQT1JUX1dBU1BDTE9TRUQJCTB4MjAwMAkvKiBQb3J0IGNsb3NlZCB3aXRoIFBDTE9TRSAqLworI2RlZmluZQlEVU1QTU9ERQkJMHg0MDAwCS8qIER1bXAgUlRBIG1lbSAqLworI2RlZmluZQlSRUFEX1JFRwkJMHg4MDAwCS8qIFJlYWQgQ0QxNDAwIHJlZ2lzdGVyICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBIQiBTdHJ1Y3R1cmUKKyAqIEEgIGZldyB3b3Jkcy4KKyAqCisgKiBOb3JtYWxseSBQYWNrZXRzIGFyZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGFuZCByZW1vdmVkIGZyb20KKyAqIHRoZSBzdGFydC4gVGhlIHBvaW50ZXIgdHhfYWRkIHBvaW50cyB0byBhIFNQQUNFIHRvIHB1dCBhIFBhY2tldC4KKyAqIFRoZSBwb2ludGVyIHR4X3JlbW92ZSBwb2ludHMgdG8gdGhlIG5leHQgUGFja2V0IHRvIHJlbW92ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIElOS0VSTkVMCisjZGVmaW5lIHNyY191bml0ICAgICB1Mi5zMi51bml0CisjZGVmaW5lIHNyY19wb3J0ICAgICB1Mi5zMi5wb3J0CisjZGVmaW5lIGRlc3RfdW5pdCAgICB1MS5zMS51bml0CisjZGVmaW5lIGRlc3RfcG9ydCAgICB1MS5zMS5wb3J0CisjZW5kaWYKKyNpZmRlZiBIT1NUCisjZGVmaW5lIHR4X3N0YXJ0ICAgICB1My5zMS50eF9zdGFydF9wdHJfcHRyCisjZGVmaW5lIHR4X2FkZCAgICAgICB1My5zMS50eF9hZGRfcHRyX3B0cgorI2RlZmluZSB0eF9lbmQgICAgICAgdTMuczEudHhfZW5kX3B0cl9wdHIKKyNkZWZpbmUgdHhfcmVtb3ZlICAgIHUzLnMxLnR4X3JlbW92ZV9wdHJfcHRyCisjZGVmaW5lIHJ4X3N0YXJ0ICAgICB1NC5zMS5yeF9zdGFydF9wdHJfcHRyCisjZGVmaW5lIHJ4X2FkZCAgICAgICB1NC5zMS5yeF9hZGRfcHRyX3B0cgorI2RlZmluZSByeF9lbmQgICAgICAgdTQuczEucnhfZW5kX3B0cl9wdHIKKyNkZWZpbmUgcnhfcmVtb3ZlICAgIHU0LnMxLnJ4X3JlbW92ZV9wdHJfcHRyCisjZW5kaWYKK3R5cGVkZWYgc3RydWN0IFBIQiBQSEIgOworc3RydWN0IFBIQiB7CisjaWZkZWYgUlRBCisgICAgICAgIHVzaG9ydCAgICAgIHBvcnQ7CisjZW5kaWYKKyNpZmRlZiBJTktFUk5FTAorICAgICAgICBXT1JEICAgICAgc291cmNlOworI2Vsc2UKKyAgICAgICAgdW5pb24gICAgICAgCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaG9ydCBzb3VyY2U7ICAgICAgICAgICAgICAvKiBDb21wbGV0ZSBzb3VyY2UgKi8KKyAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdW5pdDsgICAgIC8qIFNvdXJjZSB1bml0ICovCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBwb3J0OyAgICAgLyogU291cmNlIHBvcnQgKi8KKyAgICAgICAgICAgIH0gczI7CisgICAgICAgIH0gdTI7CisjZW5kaWYKKyAgICAgICAgV09SRCAgICAgIGhhbmRzaGFrZSA7CisgICAgICAgIFdPUkQgICAgICBzdGF0dXMgOworICAgICAgICBOVU1CRVIgICAgICAgdGltZW91dCA7ICAgICAgICAgICAvKiBNYXhpbXVtIG9mIDEuOSBzZWNvbmRzICovCisgICAgICAgIFdPUkQgICAgICBsaW5rIDsgICAgICAgICAgICAgIC8qIFNlbmQgZG93biB0aGlzIGxpbmsgKi8KKyNpZmRlZiBJTktFUk5FTAorICAgICAgICBXT1JEICAgICAgZGVzdGluYXRpb247CisjZWxzZQorICAgICAgICB1bmlvbiAgICAgICAKKyAgICAgICAgeworICAgICAgICAgICAgdXNob3J0IGRlc3RpbmF0aW9uOyAgICAgICAgIC8qIENvbXBsZXRlIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHVuaXQ7ICAgICAvKiBEZXN0aW5hdGlvbiB1bml0ICovCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBwb3J0OyAgICAgLyogRGVzdGluYXRpb24gcG9ydCAqLworICAgICAgICAgICAgfSBzMTsKKyAgICAgICAgfSB1MTsKKyNlbmRpZgorI2lmZGVmIFJUQQorICAgICAgICB1c2hvcnQgICAgICB0eF9wa3RzX2FkZGVkOworICAgICAgICB1c2hvcnQgICAgICB0eF9wa3RzX3JlbW92ZWQ7CisgICAgICAgIFFfQlVGX3B0ciAgIHR4X3Ffc3RhcnQgOyAgICAgICAgLyogU3RhcnQgb2YgdGhlIFEgbGlzdCBjaGFpbiAqLworICAgICAgICBzaG9ydCAgICAgICBudW1fdHhfcV9idWZzIDsgICAgIC8qIE51bWJlciBvZiBRIGJ1ZmZlcnMgaW4gdGhlIGNoYWluICovCisgICAgICAgIFBLVF9wdHJfcHRyIHR4X2FkZCA7ICAgICAgICAgICAgLyogQWRkIGEgbmV3IFBhY2tldCBoZXJlICovCisgICAgICAgIFFfQlVGX3B0ciAgIHR4X2FkZF9xYjsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgYWRkIFEgYnVmICovCisgICAgICAgIFBLVF9wdHJfcHRyIHR4X2FkZF9zdF9xYmIgOyAgICAgLyogUG9pbnRlciB0byBzdGFydCBvZiB0aGUgUSdzIGJ1ZiAqLworICAgICAgICBQS1RfcHRyX3B0ciB0eF9hZGRfZW5kX3FiYiA7ICAgIC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgUSdzIGJ1ZiAqLworICAgICAgICBQS1RfcHRyX3B0ciB0eF9yZW1vdmUgOyAgICAgICAgIC8qIFJlbW92ZSBhIFBhY2tldCBoZXJlICovCisgICAgICAgIFFfQlVGX3B0ciAgIHR4X3JlbW92ZV9xYiA7ICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVtb3ZlIFEgYnVmICovCisgICAgICAgIFBLVF9wdHJfcHRyIHR4X3JlbW92ZV9zdF9xYmIgOyAgLyogUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIFEgYnVmICovCisgICAgICAgIFBLVF9wdHJfcHRyIHR4X3JlbW92ZV9lbmRfcWJiIDsgLyogUG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBRIGJ1ZiAqLworI2VuZGlmCisjaWZkZWYgSU5LRVJORUwKKyAgICAgICAgUEtUX3B0cl9wdHIgdHhfc3RhcnQgOworICAgICAgICBQS1RfcHRyX3B0ciB0eF9lbmQgOworICAgICAgICBQS1RfcHRyX3B0ciB0eF9hZGQgOworICAgICAgICBQS1RfcHRyX3B0ciB0eF9yZW1vdmUgOworI2VuZGlmCisjaWZkZWYgSE9TVAorICAgICAgICB1bmlvbgorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciB0eF9zdGFydF9wdHJfcHRyOworICAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyIHR4X2VuZF9wdHJfcHRyOworICAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyIHR4X2FkZF9wdHJfcHRyOworICAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyIHR4X3JlbW92ZV9wdHJfcHRyOworICAgICAgICAgICAgfSBzMTsKKyAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaG9ydCAqIHR4X3N0YXJ0X3B0cjsKKyAgICAgICAgICAgICAgICB1c2hvcnQgKiB0eF9lbmRfcHRyOworICAgICAgICAgICAgICAgIHVzaG9ydCAqIHR4X2FkZF9wdHI7CisgICAgICAgICAgICAgICAgdXNob3J0ICogdHhfcmVtb3ZlX3B0cjsKKyAgICAgICAgICAgIH0gczI7CisgICAgICAgIH0gdTM7CisjZW5kaWYKKworI2lmZGVmICBSVEEKKyAgICAgICAgdXNob3J0ICAgICAgcnhfcGt0c19hZGRlZDsKKyAgICAgICAgdXNob3J0ICAgICAgcnhfcGt0c19yZW1vdmVkOworICAgICAgICBRX0JVRl9wdHIgICByeF9xX3N0YXJ0IDsgICAgICAgIC8qIFN0YXJ0IG9mIHRoZSBRIGxpc3QgY2hhaW4gKi8KKyAgICAgICAgc2hvcnQgICAgICAgbnVtX3J4X3FfYnVmcyA7ICAgICAvKiBOdW1iZXIgb2YgUSBidWZmZXJzIGluIHRoZSBjaGFpbiAqLworICAgICAgICBQS1RfcHRyX3B0ciByeF9hZGQgOyAgICAgICAgICAgIC8qIEFkZCBhIG5ldyBQYWNrZXQgaGVyZSAqLworICAgICAgICBRX0JVRl9wdHIgICByeF9hZGRfcWIgOyAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGFkZCBRIGJ1ZiAqLworICAgICAgICBQS1RfcHRyX3B0ciByeF9hZGRfc3RfcWJiIDsgICAgIC8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIFEncyBidWYgKi8KKyAgICAgICAgUEtUX3B0cl9wdHIgcnhfYWRkX2VuZF9xYmIgOyAgICAvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIFEncyBidWYgKi8KKyAgICAgICAgUEtUX3B0cl9wdHIgcnhfcmVtb3ZlIDsgICAgICAgICAvKiBSZW1vdmUgYSBQYWNrZXQgaGVyZSAqLworICAgICAgICBRX0JVRl9wdHIgICByeF9yZW1vdmVfcWIgOyAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlbW92ZSBRIGJ1ZiAqLworICAgICAgICBQS1RfcHRyX3B0ciByeF9yZW1vdmVfc3RfcWJiIDsgIC8qIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBRIGJ1ZiAqLworICAgICAgICBQS1RfcHRyX3B0ciByeF9yZW1vdmVfZW5kX3FiYiA7IC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgUSBidWYgKi8KKyNlbmRpZgorI2lmZGVmIElOS0VSTkVMCisgICAgICAgIFBLVF9wdHJfcHRyIHJ4X3N0YXJ0IDsKKyAgICAgICAgUEtUX3B0cl9wdHIgcnhfZW5kIDsKKyAgICAgICAgUEtUX3B0cl9wdHIgcnhfYWRkIDsKKyAgICAgICAgUEtUX3B0cl9wdHIgcnhfcmVtb3ZlIDsKKyNlbmRpZgorI2lmZGVmIEhPU1QKKyAgICAgICAgdW5pb24KKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgcnhfc3RhcnRfcHRyX3B0cjsKKyAgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciByeF9lbmRfcHRyX3B0cjsKKyAgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciByeF9hZGRfcHRyX3B0cjsKKyAgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciByeF9yZW1vdmVfcHRyX3B0cjsKKyAgICAgICAgICAgIH0gczE7CisgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2hvcnQgKiByeF9zdGFydF9wdHI7CisgICAgICAgICAgICAgICAgdXNob3J0ICogcnhfZW5kX3B0cjsKKyAgICAgICAgICAgICAgICB1c2hvcnQgKiByeF9hZGRfcHRyOworICAgICAgICAgICAgICAgIHVzaG9ydCAqIHJ4X3JlbW92ZV9wdHI7CisgICAgICAgICAgICB9IHMyOworICAgICAgICB9IHU0OworI2VuZGlmCisKKyNpZmRlZiBSVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb21lIGZpZWxkcyBmb3IgdGhlIHJlbW90ZXMgKi8KKyAgICAgICAgdXNob3J0ICAgICBmbHVzaF9jb3VudDsJCS8qIENvdW50IG9mIHdyaXRlIGZsdXNoZXMgKi8KKyAgICAgICAgdXNob3J0ICAgICB0eG1vZGU7CQkvKiBNb2RlcyBmb3IgdHggKi8KKyAgICAgICAgdXNob3J0ICAgICByeG1vZGU7CQkvKiBNb2RlcyBmb3IgcnggKi8KKyAgICAgICAgdXNob3J0ICAgICBwb3J0bW9kZTsJCS8qIEdlbmVyaWMgbW9kZXMgKi8KKyAgICAgICAgdXNob3J0ICAgICBjb2x1bW47CQkvKiBUQUIzIGNvbHVtbiBjb3VudCAqLworICAgICAgICB1c2hvcnQgICAgIHR4X3N1YnNjcmlwdDsJLyogKFRYKSBTdWJzY3JpcHQgaW50byBkYXRhIGZpZWxkICovCisgICAgICAgIHVzaG9ydCAgICAgcnhfc3Vic2NyaXB0OwkvKiAoUlgpIFN1YnNjcmlwdCBpbnRvIGRhdGEgZmllbGQgKi8KKyAgICAgICAgUEtUX3B0ciAgICByeF9pbmNvbXBsZXRlOwkvKiBIb2xkIGFuIGluY29tcGxldGUgcGFja2V0IGhlcmUgKi8KKyAgICAgICAgdXNob3J0ICAgICBtb2RlbV9iaXRzOwkJLyogTW9kZW0gYml0cyB0byBtYXNrICovCisJdXNob3J0CSAgIGxhc3RNb2RlbTsJCS8qIE1vZGVtIGNvbnRyb2wgbGluZXMuICovCisgICAgICAgIHVzaG9ydCAgICAgYWRkcjsJCS8qIEFkZHJlc3MgZm9yIHN1YiBjb21tYW5kcyAqLworICAgICAgICB1c2hvcnQgICAgIE1vbml0b3JUc3RhdGU7CS8qIFRSVUUgaWYgbW9uaXRvcmluZyB0c3RvcCAqLworI2VuZGlmCisKKyAgICAgICAgfSA7CisKKyNlbmRpZgorCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcGt0LmggYi9kcml2ZXJzL2NoYXIvcmlvL3BrdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YmIyZmYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wa3QuaApAQCAtMCwwICsxLDEyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgIFAgQSBDIEsgRSBUICAgSCBFIEEgRCBFIFIgICBGIEkgTCBFCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYSAvIEplcmVteSBSb2xscworIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9wa3RfaAorI2RlZmluZSBfcGt0X2ggMQorCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CisvKiBzdGF0aWMgY2hhciAqX3Jpb19wa3RfaF9zY2NzID0gIkAoIylwa3QuaAkxLjgiOyAqLworI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBNQVhfVFRMICAgICAgICAgMHhmCisjZGVmaW5lIFBLVF9DTURfQklUICAgICAoKHVzaG9ydCkgMHgwODApCisjZGVmaW5lIFBLVF9DTURfREFUQSAgICAoKHVzaG9ydCkgMHgwODApCisKKyNkZWZpbmUgUEtUX0FDSyAgICAgICAgICgodXNob3J0KSAweDA0MCkKKworI2RlZmluZSBQS1RfVEdMICAgICAgICAgKCh1c2hvcnQpIDB4MDIwKQorCisjZGVmaW5lIFBLVF9MRU5fTUFTSyAgICAoKHVzaG9ydCkgMHgwN2YpCisKKyNkZWZpbmUgREFUQV9XTkRXICAgICAgICgodXNob3J0KSAweDEwKQorI2RlZmluZSBQS1RfVFRMX01BU0sgICAgKCh1c2hvcnQpIDB4MGYpCisKKyNkZWZpbmUgUEtUX01BWF9EQVRBX0xFTiAgIDcyCisKKyNkZWZpbmUgUEtUX0xFTkdUSCAgICAgICAgIHNpemVvZihzdHJ1Y3QgUEtUKQorI2RlZmluZSBTWU5DX1BLVF9MRU5HVEggICAgKFBLVF9MRU5HVEggKyA0KQorCisjZGVmaW5lIENPTlRST0xfUEtUX0xFTl9NQVNLIFBLVF9MRU5fTUFTSworI2RlZmluZSBDT05UUk9MX1BLVF9DTURfQklUICBQS1RfQ01EX0JJVAorI2RlZmluZSBDT05UUk9MX1BLVF9BQ0sgKFBLVF9BQ0sgPDwgOCkKKyNkZWZpbmUgQ09OVFJPTF9QS1RfVEdMIChQS1RfVEdMIDw8IDgpCisjZGVmaW5lIENPTlRST0xfUEtUX1RUTF9NQVNLIChQS1RfVFRMX01BU0sgPDwgOCkKKyNkZWZpbmUgQ09OVFJPTF9EQVRBX1dORFcgIChEQVRBX1dORFcgPDwgOCkKKworc3RydWN0IFBLVCAgICB7CisjaWZkZWYgSU5LRVJORUwKKyAgICAgICAgICAgICAgICAgICBCWVRFICAgIGRlc3RfdW5pdCA7ICAgIC8qIERlc3RpbmF0aW9uIFVuaXQgSWQgKi8KKyAgICAgICAgICAgICAgICAgICBCWVRFICAgIGRlc3RfcG9ydCA7ICAgIC8qIERlc3RpbmF0aW9uIFBPcnQgKi8KKyAgICAgICAgICAgICAgICAgICBCWVRFICAgIHNyY191bml0IDsgICAgIC8qIFNvdXJjZSBVbml0IElkICovCisgICAgICAgICAgICAgICAgICAgQllURSAgICBzcmNfcG9ydCA7ICAgICAvKiBTb3VyY2UgUE9ydCAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICB1bmlvbiAgICAgICAKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBkZXN0aW5hdGlvbjsgICAgICAgICAvKiBDb21wbGV0ZSBkZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB1bml0OyAgICAgLyogRGVzdGluYXRpb24gdW5pdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBwb3J0OyAgICAgLyogRGVzdGluYXRpb24gcG9ydCAqLworICAgICAgICAgICAgICAgICAgICAgICB9IHMxOworICAgICAgICAgICAgICAgICAgIH0gdTE7CisgICAgICAgICAgICAgICAgICAgdW5pb24gICAgICAgCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgc291cmNlOyAgICAgICAgICAgICAgLyogQ29tcGxldGUgc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHVuaXQ7ICAgICAvKiBTb3VyY2UgdW5pdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBwb3J0OyAgICAgLyogU291cmNlIHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgfSBzMjsKKyAgICAgICAgICAgICAgICAgICB9IHUyOworI2VuZGlmCisjaWZkZWYgSU5LRVJORUwKKyAgICAgICAgICAgICAgICAgICBCWVRFIGxlbiA7CisgICAgICAgICAgICAgICAgICAgQllURSBjb250cm9sOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICB1bmlvbgorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCAgICAgIGNvbnRyb2w7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNvbnRyb2w7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHMzOworICAgICAgICAgICAgICAgICAgICB9IHUzOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgQllURSAgICBkYXRhW1BLVF9NQVhfREFUQV9MRU5dIDsgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIGRhdGEgOi0pICovCisgICAgICAgICAgICAgICAgICAgV09SRCAgY3N1bSA7ICAgICAgICAgICAgICAgICAgLyogQy1TVU0gKi8KKyAgICAgICAgICAgICAgIH0gOworI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3BvbGwuaCBiL2RyaXZlcnMvY2hhci9yaW8vcG9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjhlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3BvbGwuaApAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgIFAgTyBMIEwKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhIC8gSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3BvbGxfaAorI2RlZmluZSBfcG9sbF9oCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb19wb2xsX2hfc2NjcyA9ICJAKCMpcG9sbC5oCTEuMiIgOworI2VuZGlmCisjZW5kaWYKKworCisjaWZkZWYgSE9TVAorI2RlZmluZSBQT0xMX1NUQUNLICAgICAgICAgICAgMTAwCisjZW5kaWYKKyNpZmRlZiBSVEEKKyNkZWZpbmUgUE9MTF9TVEFDSyAgICAgICAgICAgIDIwMAorI2VuZGlmCisKKyNkZWZpbmUgUE9MTF9QRVJJT0QgICAgICAgICAgIChpbnQpIFNFQ09ORAorCisvKiBUaGUgdmFyaW91cyBwb2xsIGNvbW1hbmRzICovCisjZGVmaW5lIFBPTExfUE9MTCAgICAgICAgICAgICAwICAgICAgICAgICAgLyogV2UgYXJlIGNvbm5lY3RlZCBhbmQgaGFwcHkuLiAqLworI2RlZmluZSBQT0xMX0lOVFJPICAgICAgICAgICAgMSAgICAgICAgICAgIC8qIEludHJvZHVjdGlvbiBwYWNrZXQgKi8KKyNkZWZpbmUgUE9MTF9UT1BPTE9HWSAgICAgICAgIDIgICAgICAgICAgICAvKiBUb3BvbG9neSB1cGRhdGUgKi8KKyNkZWZpbmUgUE9MTF9BU1NJR04gICAgICAgICAgIDMgICAgICAgICAgICAvKiBJRCBhc3NpZ24gKi8KKyNkZWZpbmUgUE9MTF9GT0FEICAgICAgICAgICAgIDQgICAgICAgICAgICAvKiBGKioqIE9mZiBBbmQgRGllICovCisjZGVmaW5lIFBPTExfTE1ECSAgICAgIDUJCSAgIC8qIExldCBNZSBEaWUgKi8KKyNkZWZpbmUgUE9MTF9EWUIJICAgICAgNgkJICAgLyogRGllIFlvdSBCYSoqKioqICovCisKKy8qIFRoZSB3YXkgZGF0YSBmaWVsZHMgYXJlIHNwbGl0IHVwIGZvciBQT0xMIHBhY2tldHMgKi8KKyNkZWZpbmUgUE9MTF9IT1NUX1NFUklBTCAgICAgIDIgICAgICAgICAgICAvKiBIb3N0IHdobyBib290ZWQgbWUgKi8KKyNkZWZpbmUgUE9MTF9NWV9TRVJJQUwgICAgICAgIDYgICAgICAgICAgICAvKiBNeSBzZXJpYWwgbnVtYmVyICovCisjZGVmaW5lIFBPTExfWU9VUl9JRCAgICAgICAgICAxICAgICAgICAgICAgLyogWW91ciBJRCBudW1iZXIgKi8KKyNkZWZpbmUgUE9MTF9UT1BPTE9HWV9GSUVMRFMgIDIgICAgICAgICAgICAvKiBUb3BvbG9neSBtYXBzICovCisKKyNlbmRpZgorCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3BvcnQuaCBiL2RyaXZlcnMvY2hhci9yaW8vcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDZhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3BvcnQuaApAQCAtMCwwICsxLDI0NSBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcG9ydC5oCisqKglTSUQJCTogMS4zCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxMgorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMQorKioKKyoqICBpZGVudCBAKCMpcG9ydC5oCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9fcmlvX3BvcnRfaF9fCisjZGVmaW5lCV9fcmlvX3BvcnRfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9wb3J0X2hfc2Njc18gPSAiQCgjKXBvcnQuaAkxLjMiOworI2VuZGlmCisKKworI3VuZGVmIFZQSVgKKworCisvKgorKiogdGhlIHBvcnQgZGF0YSBzdHJ1Y3R1cmUgLSBvbmUgcGVyIHBvcnQgaW4gdGhlIHN5c3RlbQorKi8KKworI2lmZGVmIFNUQVRTCitzdHJ1Y3QgUklPU3RhdHMKK3sKKwkvKgorCSoqIGludGVycnVwdCBzdGF0aXN0aWNzCisJKi8KKwl1aW50CUJyZWFrSW50Q250OworCXVpbnQJTW9kZW1PZmZDbnQ7CisJdWludAlNb2RlbU9uQ250OworCXVpbnQJUnhJbnRDbnQ7CisJdWludAlUeEludENudDsKKwkvKgorCSoqIHRocm91Z2hwdXQgc3RhdGlzdGljcworCSovCisJdWludAlSeENoYXJDbnQ7CisJdWludAlSeFBrdENudDsKKwl1aW50CVJ4U2F2ZUNudDsKKwl1aW50CVR4Q2hhckNudDsKKwl1aW50CVR4UGt0Q250OworCS8qCisJKiogZHJpdmVyIGVudHJ5IHN0YXRpc3RpY3MKKwkqLworCXVpbnQJQ2xvc2VDbnQ7CisJdWludAlJb2N0bENudDsKKwl1aW50CU9wZW5DbnQ7CisJdWludAlSZWFkQ250OworCXVpbnQJV3JpdGVDbnQ7CisJLyoKKwkqKiBwcm9jIHN0YXRpc3RpY3MKKwkqLworCXVpbnQJQmxvY2tDbnQ7CisJdWludAlPdXRwdXRDbnQ7CisJdWludAlSZXN1bWVDbnQ7CisJdWludAlSZmx1c2hDbnQ7CisJdWludAlTdXNwZW5kQ250OworCXVpbnQJVGJyZWFrQ250OworCXVpbnQJVGltZW91dENudDsKKwl1aW50CVVuYmxvY2tDbnQ7CisJdWludAlXZmx1c2hDbnQ7CisJdWludAlXRkJvZGdlQ250OworfTsKKyNlbmRpZgorCisvKgorKioJUG9ydCBkYXRhIHN0cnVjdHVyZQorKi8KK3N0cnVjdAlQb3J0Cit7CisgIHN0cnVjdCBnc19wb3J0IGdzOyAKKyAgaW50CQkJCVBvcnROdW07CS8qIFJJTyBwb3J0IG5vLiwgMC01MTEgKi8KKyAgc3RydWN0IEhvc3QJKkhvc3RQOworICB2b2xhdGlsZSBjYWRkcl90CQlDYWRkcjsKKyAgdXNob3J0CQkJSG9zdFBvcnQ7ICAvKiBQb3J0IG51bWJlciBvbiBob3N0IGNhcmQgKi8KKyAgdWNoYXIJCQlSdXBOdW07CS8qIE51bWJlciBvZiBSVVAgZm9yIHBvcnQgKi8KKyAgdWNoYXIJCQlJRDI7CS8qIFNlY29uZCBJRCBvZiBSVEEgZm9yIHBvcnQgKi8KKyAgdWxvbmcJCQlTdGF0ZTsJLyogRkxBR1MgZm9yIG9wZW4gJiB4b3BlbiAqLworI2RlZmluZQlSSU9fTE9QRU4JMHgwMDAwMQkJLyogTG9jYWwgb3BlbiAqLworI2RlZmluZQlSSU9fTU9QRU4JMHgwMDAwMgkJLyogTW9kZW0gb3BlbiAqLworI2RlZmluZQlSSU9fV09QRU4JMHgwMDAwNAkJLyogV2FpdGluZyBmb3Igb3BlbiAqLworI2RlZmluZQlSSU9fQ0xPU0lORwkweDAwMDA4CQkvKiBUaGUgcG9ydCBpcyBiZWluZyBjbG9zZSAqLworI2RlZmluZQlSSU9fWFBCVVNZCTB4MDAwMTAJCS8qIFRyYW5zcGFyZW50IHByaW50ZXIgYnVzeSAqLworI2RlZmluZQlSSU9fQlJFQUtJTkcJMHgwMDAyMAkJLyogQnJlYWsgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJUklPX0RJUkVDVAkweDAwMDQwCQkvKiBEb2luZyBEaXJlY3Qgb3V0cHV0ICovCisjZGVmaW5lCVJJT19FWENMVVNJVkUJMHgwMDA4MAkJLyogU3RyZWFtIG9wZW4gZm9yIGV4Y2x1c2l2ZSB1c2UgKi8KKyNkZWZpbmUJUklPX05ERUxBWQkweDAwMTAwCQkvKiBTdHJlYW0gaXMgb3BlbiBGTkRFTEFZICovCisjZGVmaW5lCVJJT19DQVJSX09OCTB4MDAyMDAJCS8qIFN0cmVhbSBoYXMgY2FycmllciBwcmVzZW50ICovCisjZGVmaW5lCVJJT19YUFdBTlRSCTB4MDA0MDAJCS8qIFN0cmVhbSB3YW50ZWQgYnkgWHByaW50ICovCisjZGVmaW5lCVJJT19SQkxLCTB4MDA4MDAJCS8qIFN0cmVhbSBpcyByZWFkLWJsb2NrZWQgKi8KKyNkZWZpbmUJUklPX0JVU1kJMHgwMTAwMAkJLyogU3RyZWFtIGlzIEJVU1kgZm9yIHdyaXRlICovCisjZGVmaW5lCVJJT19USU1FT1VUCTB4MDIwMDAJCS8qIFN0cmVhbSB0aW1lb3V0IGluIHByb2dyZXNzICovCisjZGVmaW5lCVJJT19UWFNUT1AJMHgwNDAwMAkJLyogU3RyZWFtIG91dHB1dCBpcyBzdG9wcGVkICovCisjZGVmaW5lCVJJT19XQUlURkxVU0gJMHgwODAwMAkJLyogU3RyZWFtIHdhaXRpbmcgZm9yIGZsdXNoICovCisjZGVmaW5lCVJJT19EWU5PUk9ECTB4MTAwMDAJCS8qIERyYWluIGZhaWxlZCAqLworI2RlZmluZQlSSU9fREVMRVRFRAkweDIwMDAwCQkvKiBSVEEgaGFzIGJlZW4gZGVsZXRlZCAqLworI2RlZmluZSBSSU9fSVNTQ0FOQ09ERQkweDQwMDAwCQkvKiBUaGlzIGxpbmUgaXMgaW4gc2NhbmNvZGUgbW9kZSAqLworI2RlZmluZQlSSU9fVVNJTkdfRVVDCTB4MTAwMDAwCS8qIFVzaW5nIGV4dGVuZGVkIFVuaXggY2hhcnMgKi8KKyNkZWZpbmUJUklPX0NBTl9DT09LCTB4MjAwMDAwCS8qIFRoaXMgbGluZSBjYW4gZG8gY29va2luZyAqLworI2RlZmluZSBSSU9fVFJJQURfTU9ERSAgMHg0MDAwMDAgICAgICAgIC8qIEVuYWJsZSBUUklBRCBzcGVjaWFsIG9wcy4gKi8KKyNkZWZpbmUgUklPX1RSSUFEX0JMT0NLIDB4ODAwMDAwICAgICAgICAvKiBOZXh0IHJlYWQgd2lsbCBibG9jayAqLworI2RlZmluZSBSSU9fVFJJQURfRlVOQyAgMHgxMDAwMDAwICAgICAgIC8qIFNlZW4gYSBmdW5jdGlvbiBrZXkgY29taW5nIGluICovCisjZGVmaW5lIFJJT19USFJPVFRMRV9SWCAweDIwMDAwMDAgICAgICAgLyogUlggbmVlZHMgdG8gYmUgdGhyb3R0bGVkLiAqLworCisgICAgdWxvbmcJCQlDb25maWc7CS8qIEZMQUdTIGZvciBOT1JFQUQuLi4uICovCisjZGVmaW5lCVJJT19OT1JFQUQJMHgwMDAxCQkvKiBBcmUgbm90IGFsbG93ZWQgdG8gcmVhZCBwb3J0ICovCisjZGVmaW5lCVJJT19OT1dSSVRFCTB4MDAwMgkJLyogQXJlIG5vdCBhbGxvd2VkIHRvIHdyaXRlIHBvcnQgKi8KKyNkZWZpbmUJUklPX05PWFBSSU5UCTB4MDAwNAkJLyogQXJlIG5vdCBhbGxvd2VkIHRvIHhwcmludCBwb3J0ICovCisjZGVmaW5lCVJJT19OT01BU0sJMHgwMDA3CQkvKiBBbGwgbm90IGFsbG93ZWQgdGhpbmdzICovCisjZGVmaW5lIFJJT19JWEFOWQkweDAwMDggICAgICAgICAgLyogUG9ydCBpcyBhbGxvd2VkIGl4YW55ICovCisjZGVmaW5lCVJJT19NT0RFTQkweDAwMTAJCS8qIFN0cmVhbSBpcyBhIG1vZGVtIGRldmljZSAqLworI2RlZmluZQlSSU9fSVhPTgkweDAwMjAJCS8qIFBvcnQgaXMgYWxsb3dlZCBpeG9uICovCisjZGVmaW5lIFJJT19XQUlURFJBSU4JMHgwMDQwCQkvKiBXYWl0IGZvciBwb3J0IHRvIGNvbXBsZXRlbHkgZHJhaW4gKi8KKyNkZWZpbmUgUklPX01BUF81MF9UT181MAkweDAwODAJLyogTWFwIDUwIGJhdWQgdG8gNTAgYmF1ZCAqLworI2RlZmluZSBSSU9fTUFQXzExMF9UT18xMTAJMHgwMTAwCS8qIE1hcCAxMTAgYmF1ZCB0byAxMTAgYmF1ZCAqLworCisvKgorKiogMTUuMTAuMTk5OCBBUkcgLSBFU0lMIDA3NjEgcHJ0IGZpeAorKiogQXMgTHlueE9TIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IEhhcmR3YXJlIEZsb3cgQ29udHJvbCAuLi4uLgorKiogRGVmaW5lIG91ciBvd24gZmxvdyBjb250cm9sIGZsYWdzIGluICdDb25maWcnLgorKi8KKyNkZWZpbmUgUklPX0NUU0ZMT1cJMHgwMjAwCQkvKiBSSU8ncyBvd24gQ1RTRkxPVyBmbGFnICovCisjZGVmaW5lIFJJT19SVFNGTE9XCTB4MDQwMAkJLyogUklPJ3Mgb3duIFJUU0ZMT1cgZmxhZyAqLworCisKKyAgICBzdHJ1Y3QgUEhCCQkJKlBoYlA7CSAgLyogcG9pbnRlciB0byBQSEIgZm9yIHBvcnQgKi8KKyAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgKlR4QWRkOyAgIC8qIEFkZCBwYWNrZXRzIGhlcmUgKi8KKyAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgKlR4U3RhcnQ7IC8qIFN0YXJ0IG9mIGFkZCBhcnJheSAqLworICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAqVHhFbmQ7ICAgICAgICAgLyogRW5kIG9mIGFkZCBhcnJheSAqLworICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAqUnhSZW1vdmU7ICAgICAgLyogUmVtb3ZlIHBhY2tldHMgaGVyZSAqLworICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAqUnhTdGFydDsgICAgICAgLyogU3RhcnQgb2YgcmVtb3ZlIGFycmF5ICovCisgICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICpSeEVuZDsgICAgICAgICAvKiBFbmQgb2YgcmVtb3ZlIGFycmF5ICovCisgICAgdWludAkJCVJ0YVVuaXF1ZU51bTsJLyogVW5pcXVlIG51bWJlciBvZiBSVEEgKi8KKyAgICB1c2hvcnQJCQlQb3J0U3RhdGU7CS8qIHN0YXR1cyBvZiBwb3J0ICovCisgICAgdXNob3J0CQkJTW9kZW1TdGF0ZTsJLyogc3RhdHVzIG9mIG1vZGVtIGxpbmVzICovCisgICAgdWxvbmcJCQlNb2RlbUxpbmVzOwkvKiBNb2RlbSBiaXRzIHNlbnQgdG8gUlRBICovCisgICAgdWNoYXIJCQlDb29rTW9kZTsJLyogd2hvIGV4cGFuZHMgQ1IvTEY/ICovCisgICAgdWNoYXIJCQlQYXJhbVNlbTsJLyogUHJldmVudCB3cml0ZSBkdXJpbmcgcGFyYW0gKi8KKyAgICB1Y2hhcgkJCU1hcHBlZDsJCS8qIGlmIHBvcnQgbWFwcGVkIG9udG8gaG9zdCAqLworICAgIHVjaGFyCQkJU2Vjb25kQmxvY2s7CS8qIGlmIHBvcnQgYmVsb25ncyB0byAybmQgYmxvY2sKKwkJCQkJCSAgIG9mIDE2IHBvcnQgUlRBICovCisgICAgdWNoYXIJCQlJblVzZTsJCS8qIGhvdyBtYW55IHByZS1lbXB0aXZlIGNtZHMgKi8KKyAgICB1Y2hhcgkJCUxvY2s7CQkvKiBpZiBwYXJhbXMgbG9ja2VkICovCisgICAgdWNoYXIJCQlTdG9yZTsJLyogaWYgcGFyYW1zIHN0b3JlZCBhY3Jvc3MgY2xvc2VzICovCisgICAgdWNoYXIJCQlGaXJzdE9wZW47IC8qIFRSVUUgaWYgZmlyc3QgdGltZSBwb3J0IG9wZW5lZCAqLworICAgIHVjaGFyCQkJRmx1c2hDbWRCb2RnZTsJLyogaWYgZG9pbmcgYSAobm9uKWZsdXNoICovCisgICAgdWNoYXIJCQlNYWdpY0ZsYWdzOwkvKiByZXF1aXJlIGludHIgcHJvY2Vzc2luZyAqLworI2RlZmluZQlNQUdJQ19GTFVTSAkweDAxCS8qIG1pcnJvciBvZiBXZmx1c2hGbGFnICovCisjZGVmaW5lCU1BR0lDX1JFQk9PVAkweDAyCS8qIFJUQSByZS1ib290ZWQsIHJlLW9wZW4gcG9ydHMgKi8KKyNkZWZpbmUJTU9SRV9PVVRQVVRfRVlHT1IgMHgwNAkvKiByaW90cHJvYyBmYWlsZWQgdG8gZW1wdHkgY2xpc3RzICovCisgICAgdWNoYXIJCQlXZmx1c2hGbGFnOwkvKiAxIEhvdyBtYW55IFdGTFVTSHMgYWN0aXZlICovCisvKgorKiogVHJhbnNwYXJlbnQgcHJpbnQgc3R1ZmYKKyovCisgICAgc3RydWN0IFhwcmludAorICAgIHsKKyNpZm5kZWYgTUFYX1hQX0NUUkxfTEVOCisjZGVmaW5lIE1BWF9YUF9DVFJMX0xFTgkJMTYJCS8qIEFMU08gSU4gREFFTU9OLkggKi8KKyNlbmRpZgorCXVpbnQJCQlYcENwczsKKwljaGFyCQkJWHBPbltNQVhfWFBfQ1RSTF9MRU5dOworCWNoYXIJCQlYcE9mZltNQVhfWFBfQ1RSTF9MRU5dOworCXVzaG9ydAkJCVhwTGVuOwkJLyogc3RybGVuKFhwT24pK3N0cmxlbihYcE9mZikgKi8KKwl1Y2hhcgkJCVhwQWN0aXZlOworCXVjaGFyCQkJWHBMYXN0VGlja09rOwkvKiBUUlVFIGlmIHdlIGNhbiBwcm9jZXNzICovCisjZGVmaW5lCVhQX09QRU4JCTAwMDAxCisjZGVmaW5lCVhQX1JVTkFCTEUJMDAwMDIKKwlzdHJ1Y3QgdHR5c3RhdGljcyAJCSpYdHR5UDsKKyAgICB9IFhwcmludDsKKyNpZmRlZiBWUElYCisgICAgdjg2X3QJCQkqU3Rhc2hQOworICAgIHVpbnQJCQlJbnRNYXNrOworICAgIHN0cnVjdCB0ZXJtc3MgCQlWcGl4U3M7CisgICAgdWNoYXIJCQlNb2RlbVN0YXR1c1JlZzsJLyogTW9kZW0gc3RhdHVzIHJlZ2lzdGVyICovCisjZW5kaWYKKyAgICB1Y2hhcgkJCVJ4RGF0YVN0YXJ0OworICAgIHVjaGFyCQkJQ29yMkNvcHk7CS8qIGNvcHkgb2YgQ09SMiAqLworICAgIGNoYXIJCQkqTmFtZTsJCS8qIHBvaW50cyB0byB0aGUgUnRhJ3MgbmFtZSAqLworI2lmZGVmIFNUQVRTCisgICAgc3RydWN0IFJJT1N0YXRzIAkJU3RhdDsJCS8qIHBvcnRzIHN0YXRpc3RpY3MgKi8KKyNlbmRpZgorICAgIGNoYXIJCQkqVHhSaW5nQnVmZmVyOworICAgIHVzaG9ydAkJCVR4QnVmZmVySW47CS8qIE5ldyBkYXRhIGFycml2ZXMgaGVyZSAqLworICAgIHVzaG9ydAkJCVR4QnVmZmVyT3V0OwkvKiBJbnRyIHJlbW92ZXMgZGF0YSBoZXJlICovCisgICAgdXNob3J0CQkJT2xkVHhCdWZmZXJPdXQ7CS8qIEluZGljYXRlcyBpZiBkcmFpbmluZyAqLworICAgIGludAkJCQlUaW1lb3V0SWQ7CS8qIFRpbWVvdXQgSUQgKi8KKyAgICB1aW50CQkJRGVidWc7CisgICAgdWNoYXIJCQlXYWl0VW50aWxCb290ZWQ7IC8qIFRydWUgaWYgb3BlbiBzaG91bGQgYmxvY2sgKi8KKyAgICB1aW50CQkJc3RhdHNHYXRoZXI7CS8qIFRydWUgaWYgZ2F0aGVyaW5nIHN0YXRzICovCisgICAgdWxvbmcJCQl0eGNoYXJzOwkvKiBDaGFycyB0cmFuc21pdHRlZCAqLworICAgIHVsb25nCQkJcnhjaGFyczsJLyogQ2hhcnMgcmVjZWl2ZWQgKi8KKyAgICB1bG9uZwkJCW9wZW5zOwkJLyogcG9ydCBvcGVuIGNvdW50ICovCisgICAgdWxvbmcJCQljbG9zZXM7CQkvKiBwb3J0IGNsb3NlIGNvdW50ICovCisgICAgdWxvbmcJCQlpb2N0bHM7CQkvKiBpb2N0bCBjb3VudCAqLworICAgIHVjaGFyCQkJTGFzdFJ4VGdsOwkvKiBMYXN0IHN0YXRlIG9mIHJ4IHRvZ2dsZSBiaXQgKi8KKyAgc3BpbmxvY2tfdAkJCQlwb3J0U2VtOwkvKiBMb2NrIHVzaW5nIHRoaXMgc2VtICovCisJaW50CQkJCU1vbml0b3JUc3RhdGU7CS8qIE1vbml0b3JpbmcgPyAqLworCWludAkJCQl0aW1lb3V0X2lkOwkvKiBGb3IgY2FsbGluZyAxMDAgbXMgZGVsYXlzICovCisJaW50CQkJCXRpbWVvdXRfc2VtOy8qIEZvciBjYWxsaW5nIDEwMCBtcyBkZWxheXMgKi8KKwlpbnQJCQkJZmlyc3RPcGVuOwkvKiBGaXJzdCB0aW1lIG9wZW4gPyAqLworCWNoYXIgKgkJCXA7CQkJLyogc2F2ZSB0aGUgZ2xvYmFsIHN0cnVjIGhlcmUgLi4gKi8KK307CisKK3N0cnVjdCBNb2R1bGVJbmZvCit7CisJY2hhcgkqTmFtZTsKKwl1aW50CUZsYWdzWzRdOwkvKiBvbmUgcGVyIHBvcnQgb24gYSBtb2R1bGUgKi8KK307CisjZW5kaWYKKworLyoKKyoqIFRoaXMgc3RydWN0IGlzIHJlcXVpcmVkIGJlY2F1c2UgdHJ5aW5nIHRvIGdyYWIgYW4gZW50aXJlIFBvcnQgc3RydWN0dXJlCisqKiBydW5zIGludG8gcHJvYmxlbXMgd2l0aCBkaWZmZXJpbmcgc3RydWN0IHNpemVzIGJldHdlZW4gZHJpdmVyIGFuZCBjb25maWcuCisqLworc3RydWN0IFBvcnRQYXJhbXMgeworCXVpbnQJUG9ydDsKKwl1bG9uZwlDb25maWc7CisJdWxvbmcJU3RhdGU7CisJc3RydWN0IHR0eXN0YXRpY3MJKlR0eVA7Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9wcm90by5oIGIvZHJpdmVycy9jaGFyL3Jpby9wcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmYwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Byb3RvLmgKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2lmbmRlZglfcHJvdG90eXBlc19oCisjZGVmaW5lIF9wcm90b3R5cGVzX2gKKworCisvKgorKiogYm9vdC5jCisqLwordm9pZCBpbml0X2Jvb3QoIGNoYXIgKnAsIHNob3J0IHN0YWdlKTsKKworLyoKKyoqIGRpc2NvbmN0LmMKKyovCit2b2lkIGtpbGxfYm9vdCAoIExQQiAqbGluayApOwordm9pZCBkaXNjb25uZWN0ZWQoIExQQiAqbGluayApOworc2hvcnQgYm9vdF8zKCBMUEIgKmxpbmssIFBLVCAqcGt0ICk7CitzaG9ydCBzZW5kXzNfcGt0KCBMUEIgKmxpbmssIFBLVCAqcGt0KTsKKworLyoKKyoqIGVycm9yLmMKKyovCit2b2lkIGR1X2Vycm9yKHZvaWQpOworCisvKgorKiogZm9ybXBrdC5jCisqLwordXNob3J0IHN1bV9pdCggUEtUICpwa3QgKSA7Cit2b2lkIGZvcm1fcnVwX3BrdCggUlVQICpmb3JtX3J1cCwgUEtUICpwa3QgKTsKK3ZvaWQgZm9ybV9wb2xsX3BrdCAoIGludCB0eXBlLCBMUEIgKmxpbmssIGludCBub2RlICk7Cit2b2lkIGZvcm1fcm91dGVfcGt0ICggaW50IHR5cGUsIFBLVCAqcGt0LCBMUEIgKmxpbmsgKTsKKworLyoKKyoqIGlkbGUuYworKi8KK3ZvaWQgaWRsZSggUHJvY2VzcyAqaWRsZV9wICk7CisKKy8qCisqKiBpbml0LmMKKyovCit2b2lkIGdlbmVyYWxfaW5pdCh2b2lkKTsKK3ZvaWQgbWVtX2hhbHQoIGludCBlcnJvcik7CisKKy8qCisqKiBsaW5raW5pdC5jCisqLwordm9pZCBpbml0bGluayggdV9zaG9ydCBudW1iZXIsIExQQiAqbGluayk7Cit2b2lkIHJ1bmxpbmsoIExQQiAqbGluayk7CisKKy8qCisqKiBsaXN0LmMKKyovCitQS1QgKmdldF9mcmVlX3N0YXJ0KHZvaWQpOwordm9pZCBwdXRfZnJlZV9zdGFydCggUEtUICpwa3QpOworCisjaWZkZWYgSE9TVAoraW50IGNhbl9yZW1vdmVfdHJhbnNtaXQgKCBQS1QgKipwa3QsIFBLVCAqcG9pbnRlciApOworI2VuZGlmCisKKyNpZmRlZiBSVEEKK2ludCBzcGw3ICggdm9pZCApOworaW50IHNwbDAgKCB2b2lkICk7CitRX0JVRiAqZ2V0X2ZyZWVfcSggdm9pZCApOworUEtUICpnZXRfZnJlZV9lbmQodm9pZCk7CitpbnQgYWRkX2VuZCggUEtUICpwa3QsIFBIQiAqcGhiLCBpbnQgdHlwZSk7Cit1bnNpZ25lZCBzaG9ydCBmcmVlX3BhY2tldHMoIFBIQiAqcGhiLCBpbnQgdHlwZSk7CitpbnQgY2FuX3JlbW92ZV9zdGFydCggUEtUICoqcGt0LCBQSEIgKnBoYiwgaW50IHR5cGUpOworaW50IGNhbl9hZGRfc3RhcnQoIFBIQiAqcGhiLCBpbnQgdHlwZSk7CitpbnQgY2FuX2FkZF9lbmQoIFBIQiAqcGhiLCBpbnQgdHlwZSk7Cit2b2lkIHB1dF9mcmVlX2VuZCggUEtUICpwa3QpOworaW50IHJlbW92ZV9zdGFydCggUEtUICoqcGt0LCBQSEIgKnBoYiwgaW50IHR5cGUpOworI2VuZGlmCisKKy8qCisqKiBMcnQuYworKi8KK3ZvaWQgbHJ0KCBQcm9jZXNzICpscnRfcCwgTFBCICpsaW5rICk7CisKKyNpZmRlZiBSVEEKK3ZvaWQgc2V0X2xlZF9yZWQgKCBMUEIgKmxpbmsgKTsKKyNlbmRpZgorCisvKgorKiogbHR0LmMKKyovCit2b2lkIGx0dCggUHJvY2VzcyAqbHR0X3AsIExQQiAqbGluaywgUEhCICpwaGJfcHRyW10gKTsKK3ZvaWQgc2VuZF9wb2xsICggTFBCICpsaW5rICk7Cit2b2lkIHJlcXVlc3RfaWQgKCBMUEIgKmxpbmsgKTsKK3ZvaWQgc2VuZF90b3BvbG9neV91cGRhdGUgKCBMUEIgKmxpbmsgKTsKK3ZvaWQgc2VuZF90b3BvbG9neSAoIExQQiAqbGluayApOwordm9pZCBzdXBwbHlfaWQgKCBMUEIgKmxpbmsgKTsKKworI2lmZGVmIFJUQQordm9pZCByZWRpcmVjdF9xdWV1ZSAoIExQQiAqbGluaywgdXNob3J0IGZsdXNoICk7CitpbnQgb2J0YWluX3J1cCAoIGludCBydXBfbnVtYmVyLCBQS1QgKipwa3RfYWRkcmVzcywgTFBCICpsaW5rICk7CisjZW5kaWYKKworI2lmZGVmIFRFU1RJTkdfUEVSRgoraW50IGNvbnN1bWVfY3B1KCB2b2lkICk7CisjZW5kaWYKKworLyoKKyoqIGx0dHdha2UuYworKi8KKyNpZmRlZiBIT1NUCit2b2lkIGx0dF93YWtldXAoIFByb2Nlc3MgKmx0dF93YWtldXBfcCApOworI2VuZGlmCisKKy8qCisqKiBtYXBnZW4uYworKi8KK3ZvaWQgZ2VuZXJhdGVfaWRfbWFwKCBzaG9ydCBtYXBwaW5nLCBST1VURV9TVFIgcm91dGVbXSApOwordm9pZCBnZW5fbWFwKCBpbnQgbWFwcGluZywgaW50IGxvb2tpbmdfYXQsIGludCBjb21lX2Zyb20sIFJPVVRFX1NUUiByb3V0ZVtdLCBpbnQgbGluaywgaW50ICp0dGwgKTsKK3ZvaWQgYWRqdXN0X3R0bCggaW50IG1hcHBpbmcsIGludCBsb29raW5nX2F0LCBpbnQgY29tZV9mcm9tLCBST1VURV9TVFIgcm91dGVbXSwgaW50IGxpbmssIGludCAqdHRsKTsKK3ZvaWQgaW5pdF9zeXNfbWFwKHZvaWQpOworCisvKgorKiogbW11LmMKKyovCitjaGFyICpyaW9fbWFsbG9jKCB1bnNpZ25lZCBpbnQgYW1vdW50KTsKK2NoYXIgKnJpb19jYWxsb2MoIHVuc2lnbmVkIGludCBudW0sIHVuc2lnbmVkIGludCBzaXplKTsKK0VSUk9SIHJpb19tbXVfaW5pdCggdWludCB0b3RhbF9tZW0gKTsKKworLyoKKyoqIHBhcnRuLmMKKyovCit2b2lkIHBhcnRpdGlvbl90eCggc3RydWN0IFBIQiAqcGhiLCB1X3Nob3J0IHR4X3NpemUsIHVfc2hvcnQgcnhfc2l6ZSwgdV9zaG9ydCByeF9saW1pdCk7CisKKy8qCisqKiBwb2xsLmMKKyovCit2b2lkIHR4X3BvbGwoIFByb2Nlc3MgKnR4X3BvbGxfcCk7CisKKy8qCisqKiBwcm9jZXNzLmMKKyovCitpbnQgIGdldF9wcm9jX3NwYWNlKCBQcm9jZXNzICoqcGQsIGludCAqKnB3cywgaW50IHdzc2l6ZSk7CisKKy8qCisqKiByZWFkcm9tLmMKKyovCit2b2lkIHJlYWRfc2VyaWFsX251bWJlcihjaGFyICpidWYpOworCisvKgorKiogcmlvLmMKKyovCitpbnQgbWFpbiggdm9pZCApOworCisvKgorKiogcm91dGUuYworKi8KK3ZvaWQgcm91dGVfdXBkYXRlICggUEtUICpwa3QsIExQQiAqbGluayk7CisKKy8qCisqKiBydGFpbml0LmMKKyovCisjaWYgZGVmaW5lZChSVEEpCit2b2lkIHJ0YV9pbml0KHVzaG9ydCBSdGFUeXBlKTsKKyNlbmRpZiAvKiBkZWZpbmVkKFJUQSkgKi8KKworLyoKKyoqIHJ1cGJvb3QuYworKi8KK3ZvaWQgcnVwX2Jvb3QoIFBLVCAqcGt0LCBSVVAgKnRoaXNfcnVwLCBMUEIgKmxpbmspOworCisjaWZkZWYgUlRBCit2b2lkIGtpbGxfeW91cl9uZWlnaGJvdXIoIGludCBsaW5rX3RvX2tpbGwgKTsKKyNlbmRpZgorCisvKgorKiogcnVwY21kLmMKKyovCit2b2lkIHJ1cF9jb21tYW5kKCBQS1QgKnBrdCwgc3RydWN0IFJVUCAqdGhpc19ydXAsIExQQiAqbGluayk7CisKKy8qCisqKiBydXBlcnIuYworKi8KK3ZvaWQgcnVwX2Vycm9yKCBQS1QgKnBrdCwgUlVQICp0aGlzX3J1cCwgTFBCICpsaW5rICk7Cit2b2lkIGlsbGVnYWxfY21kKCBQS1QgKnNyY19wa3QgKTsKKworLyoKKyoqIHJ1cHBvbGwuYworKi8KK3ZvaWQgcnVwX3BvbGwoIFBLVCAqcGt0LCBSVVAgKnRoaXNfcnVwLCBMUEIgKmxpbmsgKTsKKworLyoKKyoqIHJ1cHBvd2VyLmMKKyovCit2b2lkIHJ1cF9wb3dlciggUEtUICpwa3QsIFJVUCAqdGhpc19ydXAsIExQQiAqbGluayApOworCisvKgorKiogcnVwcm0uYworKi8KK3ZvaWQgcnVwX3JvdXRlX21hcCggUEtUICpwa3QsIFJVUCAqdGhpc19ydXAsIExQQiAqbGluayk7CisKKy8qCisqKiBydXBzdGF0LmMKKyovCit2b2lkIHJ1cF9zdGF0dXMoIFBLVCAqcGt0LCBSVVAgKnRoaXNfcnVwLCBMUEIgKmxpbmspOworCisvKgorKiogcnVwc3luYy5jCisqLwordm9pZCBydXBfc3luYyggUEtUICpwa3QpOworCisvKgorKiogcnhwa3QuYworKi8KK0VSUk9SICByeF9wa3QoIFBLVF9wdHJfcHRyIHBrdF9hZGRyZXNzLCBMUEIgKmxpbmspOworCisvKgorKiogc2VuZHN0cy5jCisqLwordm9pZCBzZW5kX3N0YXR1cyggUEtUICpyZXF1ZXN0aW5nX3BrdCwgUlVQICp0aGlzX3J1cCk7CisKKy8qCisqKiBzZXJpYWwuYworKi8KK3ZvaWQgYXNzaWduX3NlcmlhbCAoIGNoYXIgKnNlcl9pbiwgY2hhciAqc2VyX291dCk7CitpbnQgY21wX3NlcmlhbCAoIGNoYXIgKnNlcl8xLCBjaGFyICpzZXJfMik7CisKKy8qCisqKiB0eHBrdC5jCisqLworRVJST1IgIHR4X3BrdCggUEtUICpwa3QsIExQQiAqbGluayk7CitzaG9ydCBzZW5kX3N5bmMoIExQQiAqbGluayk7CisKKyNlbmRpZgkvKiBfcHJvdG90eXBlc19oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Byb3RzdHMuaCBiL2RyaXZlcnMvY2hhci9yaW8vcHJvdHN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ODExMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Byb3RzdHMuaApAQCAtMCwwICsxLDExOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgIFAgUiBPIFQgTyBDIE8gTCAgICBTIFQgQSBUIFUgUyAgIFMgVCBSIFUgQyBUIFUgUiBFICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEgLyBKZXJlbXkgUm9sbHMKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfcHJvdHN0c19oCisjZGVmaW5lIF9wcm90c3RzX2ggMQorCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CisvKiBzdGF0aWMgY2hhciAqX3Jpb19wcm90c3RzX2hfc2NjcyA9ICJAKCMpcHJvdHN0cy5oCTEuNCI7ICovCisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQUNLIGJpdC4gTGFzdCBQYWNrZXQgcmVjZWl2ZWQgT0suIFNldCBieQorICogcnhwa3QgdG8gaW5kaWNhdGUgdGhhdCB0aGUgUGFja2V0IGhhcyBiZWVuCisgKiByZWNlaXZlZCBPSyBhbmQgdGhhdCB0aGUgTFRUIG11c3Qgc2V0IHRoZSBBQ0sKKyAqIGJpdCBpbiB0aGUgbmV4dCBvdXR3YXJkIGJvdW5kIFBhY2tldAorICogYW5kIHJlLXNldCBieSBMVFQncyBhZnRlciB4bWl0LgorICoKKyAqIEdldHMgc2hvdmVkIGludG8gcnhfc3RhdHVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSEJfUlhfTEFTVF9QS1RfQUNLRUQgICAgKCh1c2hvcnQpIDB4MDgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIFJ4IFRPR0dMRSBiaXQuCisgKiBTdHVmZmVkIGludG8gcnhfc3RhdHVzIGJ5IFJYUEtUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSEJfUlhfREFUQV9XTkRXICAgICAgICAgKCh1c2hvcnQpIDB4MDQwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIFJ4IFRPR0dMRSBiaXQuIE1hdGNoZXMgdGhlIHNldHRpbmcgaW4gUEtULkgKKyAqIFN0dWZmZWQgaW50byByeF9zdGF0dXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBIQl9SWF9UR0wgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHgyMDAwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGJpdCBpcyBzZXQgYnkgdGhlIExSVCB0byBpbmRpY2F0ZSB0aGF0CisgKiBhbiBBQ0sgKHBhY2tldCkgbXVzdCBiZSByZXR1cm5lZC4KKyAqCisgKiBHZXRzIHNob3ZlZCBpbnRvIHR4X3N0YXR1cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUEhCX1RYX1NFTkRfUEtUX0FDSyAgICAgICgodXNob3J0KSAweDA4KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0IGJ5IExUVCB0byBpbmRpY2F0ZSB0aGF0IGFuIEFDSyBpcyByZXF1aXJlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBIQl9UWF9BQ0tfUlFSRCAgICAgICAgICgodXNob3J0KSAweDAxKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgVHggVE9HR0xFIGJpdC4KKyAqIFN0dWZmZWQgaW50byB0eF9zdGF0dXMgYnkgUlhQS1QgZnJvbSB0aGUgUEtUIFduZFcKKyAqIGZpZWxkLiBMb29rZWQgYnkgdGhlIExUVCB3aGVuIHRoZSBORVhUIFBhY2tldAorICogaXMgZ29pbmcgdG8gYmUgc2VudC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBIQl9UWF9EQVRBX1dORFcgICAgICAgICAoKHVzaG9ydCkgMHgwNCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIFR4IFRPR0dMRSBiaXQuIE1hdGNoZXMgdGhlIHNldHRpbmcgaW4gUEtULkgKKyAqIFN0dWZmZWQgaW50byB0eF9zdGF0dXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBIQl9UWF9UR0wgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHgwMikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlcXVlc3QgaW50ciBiaXQuIFNldCB3aGVuIHRoZSBxdWV1ZSBoYXMgZ29uZSBxdWlldAorICogYW5kIHRoZSBQSEIgaGFzIHJlcXVlc3RlZCBhbiBpbnRlcnJ1cHQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSEJfVFhfSU5UUiAgICAgICAgICAgICAoKHVzaG9ydCkgMHgxMDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTRVQgaWYgdGhlIFBIQiBjYW5ub3Qgc2VuZCBhbnkgbW9yZSBkYXRhIGRvd24gdGhlCisgKiBMaW5rCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSEJfVFhfSEFORFNIQUtFICAgICAgICAgKCh1c2hvcnQpIDB4MDEwKQorCisKKyNkZWZpbmUgUlVQX1NFTkRfV05EVwkJICgodXNob3J0KSAweDA4KSA7CisKKyNlbmRpZgorCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9xYnVmLmggYi9kcml2ZXJzL2NoYXIvcmlvL3FidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmNlMDJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9xYnVmLmgKQEAgLTAsMCArMSw2NyBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgIFEgVSBFIFUgRSAgICBCIFUgRiBGIEUgUiAgIFMgVCBSIFUgQyBUIFUgUiBFIFMKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhIC8gSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3FidWZfaAorI2RlZmluZSBfcWJ1Zl9oIDEKKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvX3FidWZfaF9zY2NzID0gIkAoIylxYnVmLmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisKKworI2lmZGVmIEhPU1QKKyNkZWZpbmUgUEtUU19QRVJfQlVGRkVSICAgIDEKKyNlbHNlCisjZGVmaW5lIFBLVFNfUEVSX0JVRkZFUiAgICAoMjIwIC8gUEtUX0xFTkdUSCkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBRX0JVRiBRX0JVRiA7CitzdHJ1Y3QgUV9CVUYgIHsKKyAgICAgICAgICAgICAgICAgIFFfQlVGX3B0ciBuZXh0IDsKKyAgICAgICAgICAgICAgICAgIFFfQlVGX3B0ciBwcmV2IDsKKyAgICAgICAgICAgICAgICAgIFBLVF9wdHIgYnVmW1BLVFNfUEVSX0JVRkZFUl0gOworICAgICAgICAgICAgICB9IDsKKworCisjZW5kaWYKKworCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvLmggYi9kcml2ZXJzL2NoYXIvcmlvL3Jpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTk5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpby5oCkBAIC0wLDAgKzEsMjk0IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAxOTk4IFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW8uaAorKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTMKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjIKKyoqCisqKiAgaWRlbnQgQCgjKXJpby5oCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9fcmlvX3Jpb19oX18KKyNkZWZpbmUJX19yaW9fcmlvX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvX2hfc2Njc18gPSAiQCgjKXJpby5oCTEuMyI7CisjZW5kaWYKKworLyoKKyoqIDMwLjA5LjE5OTggQVJHIC0KKyoqIEludHJvZHVjZWQgZHJpdmVyIHZlcnNpb24gYW5kIGhvc3QgY2FyZCB0eXBlIHN0cmluZ3MKKyovCisjZGVmaW5lIFJJT19EUlZfU1RSICJTcGVjaWFsaXggUklPIERyaXZlciIKKyNkZWZpbmUgUklPX0FUX0hPU1RfU1RSICJJU0EiCisjZGVmaW5lIFJJT19QQ0lfSE9TVF9TVFIgIlBDSSIKKworCisvKgorKiogcmlvX2luZm9fc3RvcmUoKSBjb21tYW5kcyAoYXJiaXRhcnkgdmFsdWVzKSA6CisqLworI2RlZmluZSBSSU9fSU5GT19QVVQJMHhBNEIzQzJEMQorI2RlZmluZSBSSU9fSU5GT19HRVQJMHhGMUUyRDNDNAorCisKKy8qCisqKiBhbnl0aGluZyB0aGF0IEkgY291bGRuJ3QgY3JhbSBpbiBzb21ld2hlcmUgZWxzZQorKi8KKy8qCisjaWZuZGVmIFJJT0RFQlVHCisjZGVmaW5lIGRlYnVnCisjZWxzZQorI2RlZmluZSBkZWJ1ZyByaW9wcmludAorI2VuZGlmCisqLworCisKKy8qCisqKglNYXhpbXVtIG51bWJlcnMgb2YgdGhpbmdzCisqLworI2RlZmluZQlSSU9fU0xPVFMJNAkvKiBudW1iZXIgb2YgY29uZmlndXJhdGlvbiBzbG90cyAqLworI2RlZmluZQlSSU9fSE9TVFMJNAkvKiBudW1iZXIgb2YgaG9zdHMgdGhhdCBjYW4gYmUgZm91bmQgKi8KKyNkZWZpbmUJUE9SVFNfUEVSX0hPU1QJMTI4CS8qIG51bWJlciBvZiBwb3J0cyBwZXIgaG9zdCAqLworI2RlZmluZQlMSU5LU19QRVJfVU5JVAk0CS8qIG51bWJlciBvZiBsaW5rcyBmcm9tIGEgaG9zdCAqLworI2RlZmluZQlSSU9fUE9SVFMJKFBPUlRTX1BFUl9IT1NUICogUklPX0hPU1RTKSAvKiBtYXguIG5vLiBvZiBwb3J0cyAqLworI2RlZmluZQlSVEFTX1BFUl9IT1NUCShNQVhfUlVQKSAvKiBudW1iZXIgb2YgUlRBcyBwZXIgaG9zdCAqLworI2RlZmluZQlQT1JUU19QRVJfUlRBCShQT1JUU19QRVJfSE9TVC9SVEFTX1BFUl9IT1NUKQkvKiBwb3J0cyBvbiBhIHJ0YSAqLworI2RlZmluZQlQT1JUU19QRVJfTU9EVUxFIDQJLyogbnVtYmVyIG9mIHBvcnRzIG9uIGEgcGx1Zy1pbiBtb2R1bGUgKi8KKwkJCQkvKiBudW1iZXIgb2YgbW9kdWxlcyBvbiBhbiBSVEEgKi8KKyNkZWZpbmUJTU9EVUxFU19QRVJfUlRBCSAoUE9SVFNfUEVSX1JUQS9QT1JUU19QRVJfTU9EVUxFKQorI2RlZmluZSBNQVhfUFJPRFVDVAkxNgkvKiBudW1iciBvZiBkaWZmZXJlbnQgcHJvZHVjdCBjb2RlcyAqLworI2RlZmluZSBNQVhfTU9EVUxFX1RZUEVTIDE2CS8qIG51bWJlciBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgbW9kdWxlICovCisKKyNkZWZpbmUgUklPX0NPTlRST0xfREVWCTEyOAkvKiBtaW5vciBudW1iZXIgb2YgaG9zdC9jb250cm9sIGRldmljZSAqLworI2RlZmluZSBSSU9fSU5WQUxJRF9NQUpPUiAwCS8qIHRlc3QgZmlyc3QgaG9zdCBjYXJkJ3MgbWFqb3Igbm8gZm9yIHZhbGlkaXR5ICovCisKKy8qCisqKiBudW1iZXIgb2YgUlRBcyB0aGF0IGNhbiBiZSBib3VuZCB0byBhIG1hc3RlcgorKi8KKyNkZWZpbmUgTUFYX1JUQV9CSU5ESU5HUyAoTUFYX1JVUCAqIFJJT19IT1NUUykKKworLyoKKyoqCVVuaXQgdHlwZXMKKyovCisjZGVmaW5lIFBDX1JUQTE2CTB4OTAwMDAwMDAKKyNkZWZpbmUgUENfUlRBOAkJMHhlMDAwMDAwMAorI2RlZmluZSBUWVBFX0hPU1QJMAorI2RlZmluZSBUWVBFX1JUQTgJMQorI2RlZmluZSBUWVBFX1JUQTE2CTIKKworLyoKKyoqCUZsYWcgdmFsdWVzIHJldHVybmVkIGJ5IGZ1bmN0aW9ucworKi8KKyNkZWZpbmUJUklPX0ZBSUwJLTEKKyNkZWZpbmUJUklPX1NVQ0NFU1MJMAorI2RlZmluZQlDT1BZRkFJTAktMQkvKiBjb3B5W2lufG91dF0gZmFpbGVkICovCisKKy8qCisqKiBTeXNQb3J0IHZhbHVlIGZvciBzb21ldGhpbmcgdGhhdCBoYXNuJ3QgYW55IHBvcnRzCisqLworI2RlZmluZQlOT19QT1JUCTB4RkZGRkZGRkYKKworLyoKKyoqIFVuaXQgSUQgT2YgYWxsIGhvc3RzCisqLworI2RlZmluZQlIT1NUX0lECTAKKworLyoKKyoqIEJyZWFrIGJ5dGVzIGludG8gbnlibGVzCisqLworI2RlZmluZQlMT05ZQkxFKFgpCSgoWCkgJiAweEYpCisjZGVmaW5lCUhJTllCTEUoWCkJKCgoWCk+PjQpICYgMHhGKQorCisvKgorKiogRmxhZyB2YWx1ZXMgcGFzc2VkIGludG8gc29tZSBmdW5jdGlvbnMKKyovCisjZGVmaW5lCURPTlRfU0xFRVAJMAorI2RlZmluZQlPS19UT19TTEVFUAkxCisKKyNkZWZpbmUJRE9OVF9QUklOVAkxCisjZGVmaW5lCURPX1BSSU5UCTAKKworI2RlZmluZSBQUklOVF9UT19MT0dfQ09OUwkwCisjZGVmaW5lIFBSSU5UX1RPX0NPTlMJMQorI2RlZmluZSBQUklOVF9UT19MT0cJMgorCisvKgorKiogVGltZW91dCBoYXMgdHJvdWJsZSB3aXRoIHRpbWVzIG9mIGxlc3MgdGhhbiAzIHRpY2tzLi4uCisqLworI2RlZmluZQlNSU5fVElNRU9VVAkzCisKKy8qCisqKglHZW5lcmFsbHkgdXNlZnVsIGNvbnN0YW50cworKi8KKyNkZWZpbmUJSEFMRl9BX1NFQ09ORAkJKChIWik+PjEpCisjZGVmaW5lCUFfU0VDT05ECQkoSFopCisjZGVmaW5lCUhVTkRSRURfSFoJCSgoSFovMTAwKT8oSFovMTAwKToxKQorI2RlZmluZQlGSUZUWV9IWgkJKChIWi81MCk/KEhaLzUwKToxKQorI2RlZmluZQlUV0VOVFlfSFoJCSgoSFovMjApPyhIWi8yMCk6MSkKKyNkZWZpbmUJVEVOX0haCQkJKChIWi8xMCk/KEhaLzEwKToxKQorI2RlZmluZQlGSVZFX0haCQkJKChIWi81KT8oSFovNSk6MSkKKyNkZWZpbmUJSFVORFJFRF9NUwkJVEVOX0haCisjZGVmaW5lCUZJRlRZX01TCQlUV0VOVFlfSFoKKyNkZWZpbmUJVFdFTlRZX01TCQlGSUZUWV9IWgorI2RlZmluZQlURU5fTVMJCQlIVU5EUkVEX0haCisjZGVmaW5lCVRXT19TRUNPTkRTCQkoKEFfU0VDT05EKSoyKQorI2RlZmluZQlGSVZFX1NFQ09ORFMJCSgoQV9TRUNPTkQpKjUpCisjZGVmaW5lCVRFTl9TRUNPTkRTCQkoKEFfU0VDT05EKSoxMCkKKyNkZWZpbmUJRklGVEVFTl9TRUNPTkRTCQkoKEFfU0VDT05EKSoxNSkKKyNkZWZpbmUJVFdFTlRZX1NFQ09ORFMJCSgoQV9TRUNPTkQpKjIwKQorI2RlZmluZQlIQUxGX0FfTUlOVVRFCQkoQV9NSU5VVEU+PjEpCisjZGVmaW5lCUFfTUlOVVRFCQkoQV9TRUNPTkQqNjApCisjZGVmaW5lCUZJVkVfTUlOVVRFUwkJKEFfTUlOVVRFKjUpCisjZGVmaW5lCVFVQVJURVJfSE9VUgkJKEFfTUlOVVRFKjE1KQorI2RlZmluZQlIQUxGX0hPVVIJCShBX01JTlVURSozMCkKKyNkZWZpbmUJSE9VUgkJCShBX01JTlVURSo2MCkKKworI2RlZmluZQlTSVhURUVOX01FRwkJMHgxMDAwMDAwCisjZGVmaW5lCU9ORV9NRUcJCQkweDEwMDAwMAorI2RlZmluZQlTSVhUWV9GT1VSX0sJCTB4MTAwMDAKKworI2RlZmluZQlSSU9fQVRfTUVNX1NJWkUJCVNJWFRZX0ZPVVJfSworI2RlZmluZQlSSU9fRUlTQV9NRU1fU0laRQlTSVhUWV9GT1VSX0sKKyNkZWZpbmUJUklPX01DQV9NRU1fU0laRQlTSVhUWV9GT1VSX0sKKworI2RlZmluZQlQT0xMX1ZFQ1RPUgkJMHgxMDAKKworI2RlZmluZQlDT09LX1dFTEwJCTAKKyNkZWZpbmUJQ09PS19NRURJVU0JCTEKKyNkZWZpbmUJQ09PS19SQVcJCTIKKworLyoKKyoqCVBvaW50ZXIgbWFuaXB1bGF0aW9uIHN0dWZmCisqKglSSU9fUFRSIHRha2VzIGhvc3RwLT5DYWRkciBhbmQgdGhlIG9mZnNldCBpbnRvIHRoZSBEUCBSQU0gYXJlYQorKioJYW5kIHByb2R1Y2VzIGEgVU5JWCBjYWRkcl90IChwb2ludGVyKSB0byB0aGUgb2JqZWN0CisqKglSSU9fT0JKIHRha2VzIGhvc3RwLT5DYWRkciBhbmQgYSBVTklYIHBvaW50ZXIgdG8gYW4gb2JqZWN0IGFuZAorKioJcmV0dXJucyB0aGUgb2Zmc2V0IGludG8gdGhlIERQIFJBTSBhcmVhLgorKi8KKyNkZWZpbmUJUklPX1BUUihDLE8pICgoKGNhZGRyX3QpKEMpKSsoMHhGRkZGJihPKSkpCisjZGVmaW5lCVJJT19PRkYoQyxPKSAoKGludCkoTyktKGludCkoQykpCisKKy8qCisqKglIb3cgdG8gY29udmVydCBmcm9tIHZhcmlvdXMgZGlmZmVyZW50IGRldmljZSBudW1iZXIgZm9ybWF0czoKKyoqCURFViBpcyBhIGRldiBudW1iZXIsIGFzIHBhc3NlZCB0byBvcGVuLCBjbG9zZSBldGMgLSBOT1QgYSBtaW5vcgorKioJbnVtYmVyIQorKioKKyoqCU5vdGU6CUx5bnhPUyBvbmx5IGdpdmVzIHVzIDggYml0cyBmb3IgdGhlIGRldmljZSBtaW5vciBudW1iZXIsCisqKgkJc28gYWxsIHRoaXMgY3JhcCBoZXJlIHRvIGRlYWwgd2l0aCAnbW9kZW0nIGJpdHMgZXRjLiBpcworKioJCWp1c3QgYSBsb2FkIG9mIGlycmVsZXZhbnQgb2xkIGJ1bmt1bSEKKyoqCQlUaGlzIGhvd2V2ZXIgZG9lcyBub3Qgc3RvcCB1cyBuZWVkaW5nIHRvIGRlZmluZSBhIHZhbHVlCisqKgkJZm9yIFJJT19NT0RFTU9GRlNFVCB3aGljaCBpcyByZXF1aXJlZCBieSB0aGUgJ3Jpb21rZGV2JworKioJCXV0aWxpdHkgaW4gdGhlIE5ldyBDb25maWcgVXRpbGl0aWVzIHN1aXRlLgorKi8KKy8qIDAtNTExOiBkaXJlY3QgNTEyLTEwMjM6IG1vZGVtICovCisjZGVmaW5lCVJJT19NT0RFTU9GRlNFVAkJMHgyMDAJLyogZG9lc24ndCBtZWFuIGFueXRoaW5nICovCisjZGVmaW5lCVJJT19NT0RFTV9NQVNLCQkweDFGRgorI2RlZmluZQlSSU9fTU9ERU1fQklUCQkweDIwMAorI2RlZmluZQlSSU9fVU5NT0RFTShERVYpCShNSU5PUihERVYpICYgUklPX01PREVNX01BU0spCisjZGVmaW5lCVJJT19JU01PREVNKERFVikJKE1JTk9SKERFVikgJiBSSU9fTU9ERU1fQklUKQorI2RlZmluZSBSSU9fUE9SVChERVYsRklSU1RfTUFKKQkoIChNQUpPUihERVYpIC0gRklSU1RfTUFKKSAqIFBPUlRTX1BFUl9IT1NUKSBcCisJCQkJCSsgTUlOT1IoREVWKQorCisjZGVmaW5lCXNwbHJpbwlzcGx0dHkKKworI2RlZmluZQlSSU9fSVBMCTUKKyNkZWZpbmUJUklPX1BSSQkoUFpFUk8rMTApCisjZGVmaW5lIFJJT19DTE9TRV9QUkkJUFpFUk8tMQkvKiB1bmludGVycnVwdGlibGUgc2xlZXBzIGZvciBjbG9zZSAqLworCit0eXBlZGVmIHN0cnVjdCBEYkluZgoreworCXVpbnQJRmxhZzsKKwljaGFyCU5hbWVbOF07Cit9IERiSW5mOworCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUJVFJVRSAoMT09MSkKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQorI2RlZmluZQlGQUxTRQkoIVRSVUUpCisjZW5kaWYKKworI2RlZmluZSBDU1VNKHBrdF9wdHIpICAoKCh1c2hvcnQgKikocGt0X3B0cikpWzBdICsgKCh1c2hvcnQgKikocGt0X3B0cikpWzFdICsgXAorCQkJKCh1c2hvcnQgKikocGt0X3B0cikpWzJdICsgKCh1c2hvcnQgKikocGt0X3B0cikpWzNdICsgXAorCQkJKCh1c2hvcnQgKikocGt0X3B0cikpWzRdICsgKCh1c2hvcnQgKikocGt0X3B0cikpWzVdICsgXAorCQkJKCh1c2hvcnQgKikocGt0X3B0cikpWzZdICsgKCh1c2hvcnQgKikocGt0X3B0cikpWzddICsgXAorCQkJKCh1c2hvcnQgKikocGt0X3B0cikpWzhdICsgKCh1c2hvcnQgKikocGt0X3B0cikpWzldICkKKworLyoKKyoqIFRoaXMgaGFwcHkgbGl0dGxlIG1hY3JvIGNvcGllcyBTSVpFIGJ5dGVzIG9mIGRhdGEgZnJvbSBGUk9NIHRvIFRPCisqKiBxdWl0ZSB3ZWxsLiBTSVpFIG11c3QgYmUgYSBjb25zdGFudC4KKyovCisjZGVmaW5lIENDT1BZKCBGUk9NLCBUTywgU0laRSApIHsgKihzdHJ1Y3QgcyB7IGNoYXIgZGF0YVtTSVpFXTsgfSAqKShUTykgPSAqKHN0cnVjdCBzICopKEZST00pOyB9CisKKy8qCisqKiBpbmNyZW1lbnQgYSBidWZmZXIgcG9pbnRlciBtb2R1bG8gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4uLgorKi8KKyNkZWZpbmUJQlVNUCggUCwgSSApCSgoUCkgPSAoKChQKSsoSSkpICYgUklPQnVmZmVyTWFzaykpCisKKyNkZWZpbmUgSU5JVF9QQUNLRVQoIFBLLCBQUCApIFwKK3sgXAorCSooKHVpbnQgKilQSykgICAgPSBQUC0+UGFja2V0SW5mbzsgXAorfQorCisjZGVmaW5lCVJJT19MSU5LX0VOQUJMRQkweDgwRkYgLyogRkYgaXMgYSBoYWNrLCBtYWlubHkgZm9yIE1pcHMsIHRvICAgICAgICAqLworCQkJICAgICAgIC8qIHByZXZlbnQgYSByZWFsbHkgc3R1cGlkIHJhY2UgY29uZGl0aW9uLiAgKi8KKworI2RlZmluZQlOT1RfSU5JVElBTElTRUQJMAorI2RlZmluZQlJTklUSUFMSVNFRAkxCisKKyNkZWZpbmUJTk9UX1BPTExJTkcJMAorI2RlZmluZQlQT0xMSU5HCQkxCisKKyNkZWZpbmUJTk9UX0NIQU5HRUQJMAorI2RlZmluZQlDSEFOR0VECQkxCisKKyNkZWZpbmUJTk9UX0lOVVNFCTAKKworI2RlZmluZQlESVNDT05ORUNUCTAKKyNkZWZpbmUJQ09OTkVDVAkJMQorCisKKy8qCisqKiBNYWNoaW5lIHR5cGVzIC0gdGhlc2UgbXVzdCBOT1Qgb3ZlcmxhcCB3aXRoIHByb2R1Y3QgY29kZXMgMC0xNQorKi8KKyNkZWZpbmUJUklPX01JUFNfUjMyMzAJMzEKKyNkZWZpbmUJUklPX01JUFNfUjQwMzAJMzIKKworI2RlZmluZQlSSU9fSU9fVU5LTk9XTgktMgorCisjdW5kZWYJTU9ERVJOCisjZGVmaW5lCUVSUk9SKCBFICkJZG8geyB1LnVfZXJyb3IgPSBFOyByZXR1cm4gT1BFTkZBSUwgfSB3aGlsZSAoIDAgKQorCisvKiBEZWZpbmVzIGZvciBNUFggbGluZSBkaXNjaXBsaW5lIHJvdXRpbmVzICovCisKKyNkZWZpbmUgRElTVF9MSU5FU1dfT1BFTgkweDAxCisjZGVmaW5lIERJU1RfTElORVNXX0NMT1NFCTB4MDIKKyNkZWZpbmUgRElTVF9MSU5FU1dfUkVBRAkweDA0CisjZGVmaW5lIERJU1RfTElORVNXX1dSSVRFCTB4MDgKKyNkZWZpbmUgRElTVF9MSU5FU1dfSU9DVEwJMHgxMAorI2RlZmluZSBESVNUX0xJTkVTV19JTlBVVAkweDIwCisjZGVmaW5lIERJU1RfTElORVNXX09VVFBVVAkweDQwCisjZGVmaW5lIERJU1RfTElORVNXX01ETUlOVAkweDgwCisKKyNlbmRpZiAvKiBfX3Jpb19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvX2xpbnV4LmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWFlMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5jCkBAIC0wLDAgKzEsMTM4MCBAQAorCisvKiByaW9fbGludXguYyAtLSBMaW51eCBkcml2ZXIgZm9yIHRoZSBTcGVjaWFsaXggUklPIHNlcmllcyBjYXJkcy4gCisgKgorICoKKyAqICAgKEMpIDE5OTkgUi5FLldvbGZmQEJpdFdpemFyZC5ubAorICoKKyAqIFNwZWNpYWxpeCBwYXlzIGZvciB0aGUgZGV2ZWxvcG1lbnQgYW5kIHN1cHBvcnQgb2YgdGhpcyBkcml2ZXIuCisgKiBQbGVhc2UgRE8gY29udGFjdCBzdXBwb3J0QHNwZWNpYWxpeC5jby51ayBpZiB5b3UgcmVxdWlyZQorICogc3VwcG9ydC4gQnV0IHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIChyaW8udHh0KSBmaXJzdC4KKyAqCisgKgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqICAgICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiAgICAgIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgIFVTQS4KKyAqCisgKiBSZXZpc2lvbiBoaXN0b3J5OgorICogJExvZzogcmlvLmMsdiAkCisgKiBSZXZpc2lvbiAxLjEgIDE5OTkvMDcvMTEgMTA6MTM6NTQgIHdvbGZmCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICogKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAKKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWYgQklUU19QRVJfTE9ORyAhPSAzMgorIyAgZXJyb3IgRklYTUU6IHRoaXMgZHJpdmVyIG9ubHkgd29ya3Mgb24gMzItYml0IHBsYXRmb3JtcworI2VuZGlmCisKKyNpbmNsdWRlICJsaW51eF9jb21wYXQuaCIKKyNpbmNsdWRlICJ0eXBkZWYuaCIKKyNpbmNsdWRlICJwa3QuaCIKKyNpbmNsdWRlICJkYWVtb24uaCIKKyNpbmNsdWRlICJyaW8uaCIKKyNpbmNsdWRlICJyaW9zcGFjZS5oIgorI2luY2x1ZGUgInRvcC5oIgorI2luY2x1ZGUgImNtZHBrdC5oIgorI2luY2x1ZGUgIm1hcC5oIgorI2luY2x1ZGUgInJpb3R5cGVzLmgiCisjaW5jbHVkZSAicnVwLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgInJpb2RydnIuaCIKKyNpbmNsdWRlICJyaW9pbmZvLmgiCisjaW5jbHVkZSAiZnVuYy5oIgorI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgInBjaS5oIgorCisjaW5jbHVkZSAicGFybW1hcC5oIgorI2luY2x1ZGUgInVuaXhydXAuaCIKKyNpbmNsdWRlICJib2FyZC5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgInBoYi5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJjbWRibGsuaCIKKyNpbmNsdWRlICJyb3V0ZS5oIgorI2luY2x1ZGUgImNvbnRyb2wuaCIKKyNpbmNsdWRlICJjaXJydXMuaCIKKyNpbmNsdWRlICJyaW9pb2N0bC5oIgorI2luY2x1ZGUgInBhcmFtLmgiCisjaW5jbHVkZSAibGlzdC5oIgorI2luY2x1ZGUgInNhbS5oIgorI2luY2x1ZGUgInByb3RzdHMuaCIKKyNpbmNsdWRlICJyaW9ib2FyZC5oIgorCisKKyNpbmNsdWRlICJyaW9fbGludXguaCIKKworLyogSSBkb24ndCB0aGluayB0aGF0IHRoaXMgZHJpdmVyIGNhbiBoYW5kbGUgbW9yZSB0aGFuIDUxMiBwb3J0cyBvbgorb25lIG1hY2hpbmUuICBTcGVjaWFsaXggc3BlY2lmaWVzIG1heCA0IGJvYXJkcyBpbiBvbmUgbWFjaGluZS4gSSBkb24ndAora25vdyB3aHkuIElmIHlvdSB3YW50IHRvIHRyeSBhbnl3YXkgeW91J2xsIGhhdmUgdG8gaW5jcmVhc2UgdGhlIG51bWJlcgorb2YgYm9hcmRzIGluIHJpby5oLiAgWW91J2xsIGhhdmUgdG8gYWxsb2NhdGUgbW9yZSBtYWpvcnMgaWYgeW91IG5lZWQKK21vcmUgdGhhbiA1MTIgcG9ydHMuLi4uICovCisKKyNpZm5kZWYgUklPX05PUk1BTF9NQUpPUjAKKy8qIFRoaXMgYWxsb3dzIG92ZXJyaWRpbmcgb24gdGhlIGNvbXBpbGVyIGNvbW1hbmRsaW5lLCBvciBpbiBhICJtYWpvci5oIiAKKyAgIGluY2x1ZGUgb3Igc29tZXRoaW5nIGxpa2UgdGhhdCAqLworI2RlZmluZSBSSU9fTk9STUFMX01BSk9SMCAgMTU0CisjZGVmaW5lIFJJT19OT1JNQUxfTUFKT1IxICAxNTYKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1NYX1hJT19JTzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfU1hfWElPX0lPOCAweDIwMDAKKyNlbmRpZgorCisjaWZuZGVmIFJJT19XSU5ET1dfTEVOIAorI2RlZmluZSBSSU9fV0lORE9XX0xFTiAweDEwMDAwCisjZW5kaWYKKworCisvKiBDb25maWd1cmFibGUgb3B0aW9uczogCisgICAoRG9uJ3QgYmUgdG9vIHN1cmUgdGhhdCBpdCdsbCB3b3JrIGlmIHlvdSB0b2dnbGUgdGhlbSkgKi8KKworLyogQW0gSSBwYXJhbm9pZCBvciBub3QgPyA7LSkgKi8KKyN1bmRlZiBSSU9fUEFSQU5PSUFfQ0hFQ0sKKworCisvKiAyMCAtPiAyMDAwIHBlciBzZWNvbmQuIFRoZSBjYXJkIHNob3VsZCByYXRlLWxpbWl0IGludGVycnVwdHMgYXQgMTAwMAorICAgSHosIGJ1dCBpdCBpcyB1c2VyIGNvbmZpZ3VyYWJsZS4gSSBkb24ndCByZWNvbW1lbmQgZ29pbmcgYWJvdmUgMTAwMAorICAgSHouIFRoZSBpbnRlcnJ1cHQgcmF0ZWxpbWl0IG1pZ2h0IHRyaWdnZXIgaWYgdGhlIGludGVycnVwdCBpcworICAgc2hhcmVkIHdpdGggYSB2ZXJ5IGFjdGl2ZSBvdGhlciBkZXZpY2UuIAorICAgdW5kZWYgdGhpcyBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSBjaGVjay4uLi4KKyovCisjZGVmaW5lIElSUV9SQVRFX0xJTUlUIDIwMAorCisjaWYgMAorLyogTm90IGltcGxlbWVudGVkICovCisvKiAKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBCdXQgaWYgeW91IG5lZWQKKyAqIHNvbWUgbmljZSByZXBvcnRpbmcgaW4geW91ciBzeXNsb2csIHlvdSBjYW4gZGVmaW5lIHRoZW0gYWxzby4KKyAqLworI2RlZmluZSBSSU9fUkVQT1JUX0ZJRk8KKyNkZWZpbmUgUklPX1JFUE9SVF9PVkVSUlVOCisjZW5kaWYgCisKKworLyogVGhlc2UgY29uc3RhbnRzIGFyZSBkZXJpdmVkIGZyb20gU0NPIFNvdXJjZSAqLworc3RhdGljIHN0cnVjdCBDb25mCitSSU9Db25mID0KK3sKKyAgLyogbG9jYXRvciAqLyAgICAgICAgICJSSU8gQ29uZmlnIGhlcmUiLAorICAvKiBzdGFydHVwdGltZSAqLyAgICAgSFoqMiwgICAgICAgICAgIC8qIGhvdyBsb25nIHRvIHdhaXQgZm9yIGNhcmQgdG8gcnVuICovCisgIC8qIHNsb3djb29rICovICAgICAgICAwLCAgICAgICAgICAgICAgLyogVFJVRSAtPiBhbHdheXMgdXNlIGxpbmUgZGlzYy4gKi8KKyAgLyogaW50cnBvbGx0aW1lICovICAgIDEsICAgICAgICAgICAgICAvKiBUaGUgZnJlcXVlbmN5IG9mIE9VUiBwb2xscyAqLworICAvKiBicmVha2ludGVydmFsICovICAgMjUsICAgICAgICAgICAgIC8qIHgxMCBtUyBYWFg6IHVuaXRzIHNlZW0gdG8gYmUgMW1zIG5vdCAxMCEgLS0gUkVXKi8KKyAgLyogdGltZXIgKi8gICAgICAgICAgIDEwLCAgICAgICAgICAgICAvKiBtUyAqLworICAvKiBSdGFMb2FkQmFzZSAqLyAgICAgMHg3MDAwLAorICAvKiBIb3N0TG9hZEJhc2UgKi8gICAgMHg3QzAwLAorICAvKiBYcEh6ICovICAgICAgICAgICAgNSwgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBYcHJpbnQgaGl0cyBwZXIgc2Vjb25kICovCisgIC8qIFhwQ3BzICovICAgICAgICAgICAxMjAsICAgICAgICAgICAgLyogWHByaW50IGNoYXJhY3RlcnMgcGVyIHNlY29uZCAqLworICAvKiBYcE9uICovICAgICAgICAgICAgIlwwMzNkIyIsICAgICAgIC8qIHN0YXJ0IFhwcmludCBmb3IgYSB3eXNlIDYwICovCisgIC8qIFhwT2ZmICovICAgICAgICAgICAiXDAyNCIsICAgICAgICAgLyogZW5kIFhwcmludCBmb3IgYSB3eXNlIDYwICovCisgIC8qIE1heFhwQ3BzICovICAgICAgICAyMDAwLCAgICAgICAgICAgLyogaGlnaGVzdCBYcHJpbnQgc3BlZWQgKi8KKyAgLyogTWluWHBDcHMgKi8gICAgICAgIDEwLCAgICAgICAgICAgICAvKiBzbG93ZXN0IFhwcmludCBzcGVlZCAqLworICAvKiBTcGluQ21kcyAqLyAgICAgICAgMSwgICAgICAgICAgICAgIC8qIG5vbi16ZXJvIGZvciBtZWdhIGZhc3QgYm9vdHMgKi8KKyAgLyogRmlyc3QgQWRkciAqLyAgICAgIDB4MEEwMDAwLCAgICAgICAvKiBGaXJzdCBhZGRyZXNzIHRvIGxvb2sgYXQgKi8KKyAgLyogTGFzdCBBZGRyICovICAgICAgIDB4RkYwMDAwLCAgICAgICAvKiBMYXN0IGFkZHJlc3MgbG9va2VkIGF0ICovCisgIC8qIEJ1ZmZlclNpemUgKi8gICAgICAxMDI0LCAgICAgICAgICAgLyogQnl0ZXMgcGVyIHBvcnQgb2YgYnVmZmVyaW5nICovCisgIC8qIExvd1dhdGVyICovICAgICAgICAyNTYsICAgICAgICAgICAgLyogaG93IG11Y2ggZGF0YSBsZWZ0IGJlZm9yZSB3YWtldXAgKi8KKyAgLyogTGluZUxlbmd0aCAqLyAgICAgIDgwLCAgICAgICAgICAgICAvKiBob3cgd2lkZSBpcyB0aGUgY29uc29sZT8gKi8KKyAgLyogQ21kVGltZW91dCAqLyAgICAgIEhaLCAgICAgICAgICAgICAvKiBob3cgbG9uZyBhIGNsb3NlIGNvbW1hbmQgbWF5IHRha2UgKi8KK307CisKKworCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQgcmlvX2Rpc2FibGVfdHhfaW50ZXJydXB0cyAodm9pZCAqIHB0cik7IAorc3RhdGljIHZvaWQgcmlvX2VuYWJsZV90eF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKTsgCitzdGF0aWMgdm9pZCByaW9fZGlzYWJsZV9yeF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKTsgCitzdGF0aWMgdm9pZCByaW9fZW5hYmxlX3J4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpOyAKK3N0YXRpYyBpbnQgIHJpb19nZXRfQ0QgKHZvaWQgKiBwdHIpOyAKK3N0YXRpYyB2b2lkIHJpb19zaHV0ZG93bl9wb3J0ICh2b2lkICogcHRyKTsKK3N0YXRpYyBpbnQgIHJpb19zZXRfcmVhbF90ZXJtaW9zICh2b2lkICAqcHRyKTsKK3N0YXRpYyB2b2lkIHJpb19odW5ndXAgKHZvaWQgICpwdHIpOworc3RhdGljIHZvaWQgcmlvX2Nsb3NlICh2b2lkICAqcHRyKTsKK3N0YXRpYyBpbnQgcmlvX2NoYXJzX2luX2J1ZmZlciAodm9pZCAqIHB0cik7CitzdGF0aWMgaW50IHJpb19md19pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgcmlvX2luaXRfZHJpdmVycyh2b2lkKTsKKworc3RhdGljIHZvaWQgbXlfaGQgKHZvaWQgKmFkZHIsIGludCBsZW4pOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnJpb19kcml2ZXIsICpyaW9fZHJpdmVyMjsKKworLyogVGhlIG5hbWUgInAiIGlzIGEgYml0IG5vbi1kZXNjcmlwdC4gQnV0IHRoYXQncyB3aGF0IHRoZSByaW8tbHlueG9zCitzb3VyY2VzIHVzZSBhbGwgb3ZlciB0aGUgcGxhY2UuICovCitzdHJ1Y3QgcmlvX2luZm8gKnA7CisKK2ludCByaW9fZGVidWc7CisKKworLyogWW91IGNhbiBoYXZlIHRoZSBkcml2ZXIgcG9sbCB5b3VyIGNhcmQuIAorICAgIC0gU2V0IHJpb19wb2xsIHRvIDEgdG8gcG9sbCBldmVyeSB0aW1lciB0aWNrICgxMG1zIG9uIEludGVsKS4gCisgICAgICBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgY2FyZCBjYW5ub3QgdXNlIGFuIGludGVycnVwdCBmb3Igc29tZSByZWFzb24uCisqLworc3RhdGljIGludCByaW9fcG9sbCA9IDE7CisKKworLyogVGhlc2UgYXJlIHRoZSBvbmx5IG9wZW4gc3BhY2VzIGluIG15IGNvbXB1dGVyLiBZb3VycyBtYXkgaGF2ZSBtb3JlCisgICBvciBsZXNzLi4uLiAqLworc3RhdGljIGludCByaW9fcHJvYmVfYWRkcnNbXT0gezB4YzAwMDAsIDB4ZDAwMDAsIDB4ZTAwMDB9OworCisjZGVmaW5lIE5SX1JJT19BRERSUyAoc2l6ZW9mKHJpb19wcm9iZV9hZGRycykvc2l6ZW9mIChpbnQpKQorCisKKy8qIFNldCB0aGUgbWFzayB0byBhbGwtb25lcy4gVGhpcyBhbGFzLCBvbmx5IHN1cHBvcnRzIDMyIGludGVycnVwdHMuIAorICAgU29tZSBhcmNoaXRlY3R1cmVzIG1heSBuZWVkIG1vcmUuIC0tIENoYW5nZWQgdG8gTE9ORyB0bworICAgc3VwcG9ydCB1cCB0byA2NCBiaXRzIG9uIDY0Yml0IGFyY2hpdGVjdHVyZXMuIC0tIFJFVyAyMC8wNi85OSAqLworbG9uZyByaW9faXJxbWFzayA9IC0xOworCitNT0RVTEVfQVVUSE9SKCJSb2dpZXIgV29sZmYgPFIuRS5Xb2xmZkBiaXR3aXphcmQubmw+LCBQYXRyaWNrIHZhbiBkZSBMYWdld2VnIDxwYXRyaWNrQGJpdHdpemFyZC5ubD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUklPIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKHJpb19wb2xsLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJpb19kZWJ1ZywgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShyaW9faXJxbWFzaywgbG9uZywgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVhbF9kcml2ZXIgcmlvX3JlYWxfZHJpdmVyID0geworICByaW9fZGlzYWJsZV90eF9pbnRlcnJ1cHRzLAorICByaW9fZW5hYmxlX3R4X2ludGVycnVwdHMsCisgIHJpb19kaXNhYmxlX3J4X2ludGVycnVwdHMsCisgIHJpb19lbmFibGVfcnhfaW50ZXJydXB0cywKKyAgcmlvX2dldF9DRCwKKyAgcmlvX3NodXRkb3duX3BvcnQsIAorICByaW9fc2V0X3JlYWxfdGVybWlvcywgCisgIHJpb19jaGFyc19pbl9idWZmZXIsCisgIHJpb19jbG9zZSwKKyAgcmlvX2h1bmd1cCwKKyAgTlVMTAorfTsKKworLyogCisgKiAgRmlybXdhcmUgbG9hZGVyIGRyaXZlciBzcGVjaWZpYyByb3V0aW5lcworICoKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByaW9fZndfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCQk9IHJpb19md19pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSByaW9fZndfZGV2aWNlID0geworCVJJT0NUTF9NSVNDX01JTk9SLCAicmlvY3RsIiwgJnJpb19md19mb3BzCit9OworCisKKworCisKKyNpZmRlZiBSSU9fUEFSQU5PSUFfQ0hFQ0sKKworLyogVGhpcyBkb2Vzbid0IHdvcmsuIFdobydzIHBhcmFub2lkIGFyb3VuZCBoZXJlPyBOb3QgbWUhICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHJpb19wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgcmlvX3BvcnQgY29uc3QgKiBwb3J0LAorCQkJCSAgICBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworCisgIHN0YXRpYyBjb25zdCBjaGFyICpiYWRtYWdpYyA9CisgICAgS0VSTl9FUlIgInJpbzogV2FybmluZzogYmFkIHJpbyBwb3J0IG1hZ2ljIG51bWJlciBmb3IgZGV2aWNlICVzIGluICVzXG4iOworICBzdGF0aWMgY29uc3QgY2hhciAqYmFkaW5mbyA9CisgICAgS0VSTl9FUlIgInJpbzogV2FybmluZzogbnVsbCByaW8gcG9ydCBmb3IgZGV2aWNlICVzIGluICVzXG4iOworIAorICBpZiAoIXBvcnQpIHsKKyAgICBwcmludGsgKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChwb3J0LT5tYWdpYyAhPSBSSU9fTUFHSUMpIHsKKyAgICBwcmludGsgKGJhZG1hZ2ljLCBuYW1lLCByb3V0aW5lKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgcmlvX3BhcmFub2lhX2NoZWNrKGEsYixjKSAwCisjZW5kaWYKKworCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIG15X2hkICh2b2lkICphZCwgaW50IGxlbikKK3sKKyAgaW50IGksIGosIGNoOworICB1bnNpZ25lZCBjaGFyICphZGRyID0gYWQ7CisgIAorICBmb3IgKGk9MDtpPGxlbjtpKz0xNikgeworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICIlMDh4ICIsIChpbnQpIGFkZHIraSk7CisgICAgZm9yIChqPTA7ajwxNjtqKyspIHsKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICIlMDJ4ICVzIiwgYWRkcltqK2ldLCAoaj09Nyk/IiAiOiIiKTsKKyAgICB9CisgICAgZm9yIChqPTA7ajwxNjtqKyspIHsKKyAgICAgIGNoID0gYWRkcltqK2ldOworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIiVjIiwgKGNoIDwgMHgyMCk/Jy4nOigoY2ggPiAweDdmKT8nLic6Y2gpKTsKKyAgICB9CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlxuIik7CisgIH0KK30KKyNlbHNlCisjZGVmaW5lIG15X2hkKGFkLGxlbikgZG97Lyogbm90aGluZyovIH0gd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBEZWxheSBhIG51bWJlciBvZiBqaWZmaWVzLCBhbGxvd2luZyBhIHNpZ25hbCB0byBpbnRlcnJ1cHQgKi8gCitpbnQgUklPRGVsYXkgKHN0cnVjdCBQb3J0ICpQb3J0UCwgaW50IG5qaWZmaWVzKQoreworICBmdW5jX2VudGVyICgpOworCisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfREVMQVksICJkZWxheWluZyAlZCBqaWZmaWVzXG4iLCBuamlmZmllcyk7ICAKKyAgbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhuamlmZmllcykpOworICBmdW5jX2V4aXQoKTsKKworICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgcmV0dXJuIFJJT19GQUlMOworICBlbHNlCisgICAgcmV0dXJuICFSSU9fRkFJTDsKK30KKworCisvKiBEZWxheSBhIG51bWJlciBvZiBqaWZmaWVzLCBkaXNhbGxvd2luZyBhIHNpZ25hbCB0byBpbnRlcnJ1cHQgKi8gCitpbnQgUklPRGVsYXlfbmkgKHN0cnVjdCBQb3J0ICpQb3J0UCwgaW50IG5qaWZmaWVzKQoreworICBmdW5jX2VudGVyICgpOworCisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfREVMQVksICJkZWxheWluZyAlZCBqaWZmaWVzIChuaSlcbiIsIG5qaWZmaWVzKTsgIAorICBtc2xlZXAoamlmZmllc190b19tc2VjcyhuamlmZmllcykpOworICBmdW5jX2V4aXQoKTsKKyAgcmV0dXJuICFSSU9fRkFJTDsKK30KKworCitpbnQgcmlvX21pbm9yKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIHR0eS0+aW5kZXggKyAodHR5LT5kcml2ZXIgPT0gcmlvX2RyaXZlcikgPyAwIDogMjU2OworfQorCisKK2ludCByaW9faXNtb2RlbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybiAxOworfQorCisKK3ZvaWQgcmlvX3VkZWxheSAoaW50IHVzZWNzKQoreworICB1ZGVsYXkgKHVzZWNzKTsKK30KKworc3RhdGljIGludCByaW9fc2V0X3JlYWxfdGVybWlvcyAodm9pZCAqcHRyKQoreworICBpbnQgcnYsIG1vZGVtOworICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworICBmdW5jX2VudGVyKCk7CisKKyAgdHR5ID0gKChzdHJ1Y3QgUG9ydCAqKXB0ciktPmdzLnR0eTsKKworICBtb2RlbSA9IHJpb19pc21vZGVtKHR0eSk7CisKKyAgcnYgPSBSSU9QYXJhbSggKHN0cnVjdCBQb3J0ICopIHB0ciwgQ09ORklHLCBtb2RlbSwgMSk7CisKKyAgZnVuY19leGl0ICgpOworCisgIHJldHVybiBydjsKK30KKworCitzdGF0aWMgdm9pZCByaW9fcmVzZXRfaW50ZXJydXB0IChzdHJ1Y3QgSG9zdCAqSG9zdFApCit7CisgIGZ1bmNfZW50ZXIoKTsKKworICBzd2l0Y2goIEhvc3RQLT5UeXBlICkgeworICBjYXNlIFJJT19BVDoKKyAgY2FzZSBSSU9fTUNBOgorICBjYXNlIFJJT19QQ0k6CisgICAgV0JZVEUoSG9zdFAtPlJlc2V0SW50ICwgMHhmZik7CisgIH0KKworICBmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgcmlvX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqcHRyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgc3RydWN0IEhvc3QgKkhvc3RQOworICBmdW5jX2VudGVyICgpOworCisgIEhvc3RQID0gKHN0cnVjdCBIb3N0KilwdHI7IC8qICZwLT5SSU9Ib3N0c1sobG9uZylwdHJdOyAqLworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lGTE9XLCAicmlvOiBlbnRlciByaW9faW50ZXJydXB0ICglZC8lZClcbiIsIAorICAgICAgICAgICAgICAgaXJxLCBIb3N0UC0+SXZlYyk7IAorCisgIC8qIEFBYXJnaCEgVGhlIG9yZGVyIGluIHdoaWNoIHRvIGRvIHRoZXNlIHRoaW5ncyBpcyBlc3NlbnRpYWwgYW5kCisgICAgIG5vdCB0cml2aWFsLiAKKyAgICAgCisgICAgIC0gUmF0ZSBsaW1pdCBnb2VzIGJlZm9yZSAicmVjdXJzaXZlIi4gT3RoZXJ3aXNlIGEgc2VyaWVzIG9mCisgICAgICAgcmVjdXJzaXZlIGNhbGxzIHdpbGwgaGFuZyB0aGUgbWFjaGluZSBpbiB0aGUgaW50ZXJydXB0IHJvdXRpbmUuIAorCisgICAgIC0gaGFyZHdhcmUgdHdpZGRsaW5nIGdvZXMgYmVmb3JlICJyZWN1cnNpdmUiLiBPdGhlcndpc2Ugd2hlbiB3ZQorICAgICAgIHBvbGwgdGhlIGNhcmQsIGFuZCBhIHJlY3Vyc2l2ZSBpbnRlcnJ1cHQgaGFwcGVucywgd2Ugd29uJ3QKKyAgICAgICBhY2sgdGhlIGNhcmQsIHNvIGl0IG1pZ2h0IGtlZXAgb24gaW50ZXJydXB0aW5nIHVzLiAoZXNwZWNpYWxseQorICAgICAgIGxldmVsIHNlbnNpdGl2ZSBpbnRlcnJ1cHQgc3lzdGVtcyBsaWtlIFBDSSkuCisKKyAgICAgLSBSYXRlIGxpbWl0IGdvZXMgYmVmb3JlIGhhcmR3YXJlIHR3aWRkbGluZy4gT3RoZXJ3aXNlIHdlIHdvbid0CisgICAgICAgY2F0Y2ggYSBjYXJkIHRoYXQgaGFzIGdvbmUgYm9ua2Vycy4KKworICAgICAtIFRoZSAiaW5pdGlhbGl6ZWQiIHRlc3QgZ29lcyBhZnRlciB0aGUgaGFyZHdhcmUgdHdpZGRsaW5nLiBPdGhlcndpc2UKKyAgICAgICB0aGUgY2FyZCB3aWxsIHN0aWNrIHVzIGluIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBhZ2Fpbi4KKworICAgICAtIFRoZSBpbml0aWFsaXplZCB0ZXN0IGdvZXMgYmVmb3JlIHJlY3Vyc2l2ZS4gCisgICovCisKKworCisjaWZkZWYgSVJRX1JBVEVfTElNSVQKKyAgLyogQWFhcmdoISBJJ20gYXNoYW1lZC4gVGhpcyBjb3N0cyBtb3JlIGxpbmVzLW9mLWNvZGUgdGhhbiB0aGUKKyAgICAgYWN0dWFsIGludGVycnVwdCByb3V0aW5lIS4gKFdlbGwsIHVzZWQgdG8gd2hlbiBJIHdyb3RlIHRoYXQgY29tbWVudCkgKi8KKyAgeworICAgIHN0YXRpYyBpbnQgbGFzdGppZjsKKyAgICBzdGF0aWMgaW50IG5pbnRyPTA7CisKKyAgICBpZiAobGFzdGppZiA9PSBqaWZmaWVzKSB7CisgICAgICBpZiAoKytuaW50ciA+IElSUV9SQVRFX0xJTUlUKSB7CisgICAgICAgIGZyZWVfaXJxIChIb3N0UC0+SXZlYywgcHRyKTsKKyAgICAgICAgcHJpbnRrIChLRVJOX0VSUiAicmlvOiBUb28gbWFueSBpbnRlcnJ1cHRzLiBUdXJuaW5nIG9mZiBpbnRlcnJ1cHQgJWQuXG4iLCAKKyAgICAgICAgICAgICAgICBIb3N0UC0+SXZlYyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGxhc3RqaWYgPSBqaWZmaWVzOworICAgICAgbmludHIgPSAwOworICAgIH0KKyAgfQorI2VuZGlmCisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSUZMT1csICJyaW86IFdlJ3ZlIGhhdmUgbm90aWNlZCB0aGUgaW50ZXJydXB0XG4iKTsgCisgIGlmIChIb3N0UC0+SXZlYyA9PSBpcnEpIHsKKyAgICAvKiBUZWxsIHRoZSBjYXJkIHdlJ3ZlIG5vdGljZWQgdGhlIGludGVycnVwdC4gKi8KKyAgICByaW9fcmVzZXRfaW50ZXJydXB0IChIb3N0UCk7CisgIH0KKworICBpZiAoKEhvc3RQLT5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORykKKyAgCXJldHVybiBJUlFfSEFORExFRDsKKworICBpZiAodGVzdF9hbmRfc2V0X2JpdCAoUklPX0JPQVJEX0lOVFJfTE9DSywgJkhvc3RQLT5sb2NrcykpIHsKKyAgICBwcmludGsgKEtFUk5fRVJSICJSZWN1cnNpdmUgaW50ZXJydXB0ISAoaG9zdCAlZC9pcnElZClcbiIsIAorICAgICAgICAgICAgKGludCkgcHRyLCBIb3N0UC0+SXZlYyk7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworICB9CisKKyAgUklPU2VydmljZUhvc3QocCwgSG9zdFAsIGlycSk7CisKKyAgcmlvX2RwcmludGsgKCBSSU9fREVCVUdfSUZMT1csICJyaW9pbnRyKCkgZG9pbmcgaG9zdCAlZCB0eXBlICVkXG4iLCAKKyAgICAgICAgICAgICAgICAoaW50KSBwdHIsIEhvc3RQLT5UeXBlKTsKKworICBjbGVhcl9iaXQgKFJJT19CT0FSRF9JTlRSX0xPQ0ssICZIb3N0UC0+bG9ja3MpOworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lGTE9XLCAicmlvOiBleGl0IHJpb19pbnRlcnJ1cHQgKCVkLyVkKVxuIiwgCisgICAgICAgICAgICAgICBpcnEsIEhvc3RQLT5JdmVjKTsgCisgIGZ1bmNfZXhpdCAoKTsKKyAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyB2b2lkIHJpb19wb2xsZnVuYyAodW5zaWduZWQgbG9uZyBkYXRhKQoreworICBmdW5jX2VudGVyICgpOworCisgIHJpb19pbnRlcnJ1cHQgKDAsICZwLT5SSU9Ib3N0c1tkYXRhXSwgTlVMTCk7CisgIHAtPlJJT0hvc3RzW2RhdGFdLnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcmlvX3BvbGw7CisgIGFkZF90aW1lciAoJnAtPlJJT0hvc3RzW2RhdGFdLnRpbWVyKTsKKworICBmdW5jX2V4aXQgKCk7Cit9CisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCisgKiAgICAgICAgICAgICAgICBIZXJlIGFyZSB0aGUgcm91dGluZXMgdGhhdCBhY3R1YWxseSAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICBpbnRlcmZhY2Ugd2l0aCB0aGUgZ2VuZXJpY19zZXJpYWwgZHJpdmVyICAgICAgICAgICAgICAgICAgKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBFaGhtLiBJIGRvbid0IGtub3cgaG93IHRvIGZpZGRsZSB3aXRoIGludGVycnVwdHMgb24gdGhlIFNwZWNpYWxpeCAKKyAgIGNhcmRzLiAuLi4uICAgSG1tLiBPayBJIGZpZ3VyZWQgaXQgb3V0LiBZb3UgZG9uJ3QuICAtLSBSRVcgKi8KKworc3RhdGljIHZvaWQgcmlvX2Rpc2FibGVfdHhfaW50ZXJydXB0cyAodm9pZCAqIHB0cikgCit7CisgIGZ1bmNfZW50ZXIoKTsKKworICAvKiAgcG9ydC0+Z3MuZmxhZ3MgJj0gfkdTX1RYX0lOVEVOOyAqLworCisgIGZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyB2b2lkIHJpb19lbmFibGVfdHhfaW50ZXJydXB0cyAodm9pZCAqIHB0cikgCit7CisgIHN0cnVjdCBQb3J0ICpQb3J0UCA9IHB0cjsKKyAgLyogaW50IGhuOyAqLworCisgIGZ1bmNfZW50ZXIoKTsKKworICAvKiBobiA9IFBvcnRQLT5Ib3N0UCAtIHAtPlJJT0hvc3RzOworCisgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUHVzaGluZyBob3N0ICVkXG4iLCBobik7CisgICAgIHJpb19pbnRlcnJ1cHQgKC0xLCh2b2lkICopIGhuLCBOVUxMKTsgKi8KKworICBSSU9UeEVuYWJsZSgoY2hhciAqKSBQb3J0UCk7CisKKyAgLyogCisgICAqIEluIGdlbmVyYWwgd2UgY2Fubm90IGNvdW50IG9uICJ0eCBlbXB0eSIgaW50ZXJydXB0cywgYWx0aG91Z2gKKyAgICogdGhlIGludGVycnVwdCByb3V0aW5lIHNlZW1zIHRvIGJlIGFibGUgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZS4gCisgICAqLworICBQb3J0UC0+Z3MuZmxhZ3MgJj0gfkdTX1RYX0lOVEVOOworCisgIGZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyB2b2lkIHJpb19kaXNhYmxlX3J4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAoreworICBmdW5jX2VudGVyKCk7CisgIGZ1bmNfZXhpdCgpOworfQorCitzdGF0aWMgdm9pZCByaW9fZW5hYmxlX3J4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAoreworICAvKiAgc3RydWN0IHJpb19wb3J0ICpwb3J0ID0gcHRyOyAqLworICBmdW5jX2VudGVyKCk7CisgIGZ1bmNfZXhpdCgpOworfQorCisKKy8qIEplZXouIElzbid0IHRoaXMgc2ltcGxlPyAgKi8KK3N0YXRpYyBpbnQgcmlvX2dldF9DRCAodm9pZCAqIHB0cikgCit7CisgIHN0cnVjdCBQb3J0ICpQb3J0UCA9IHB0cjsKKyAgaW50IHJ2OworCisgIGZ1bmNfZW50ZXIoKTsKKyAgcnYgPSAoUG9ydFAtPk1vZGVtU3RhdGUgJiBNU1ZSMV9DRCkgIT0gMDsKKworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJHZXR0aW5nIENEIHN0YXR1czogJWRcbiIsIHJ2KTsKKyAgCisgIGZ1bmNfZXhpdCgpOyAgCisgIHJldHVybiBydjsKK30KKworCisvKiBKZWV6LiBJc24ndCB0aGlzIHNpbXBsZT8gQWN0dWFsbHksIHdlIGNhbiBzeW5jIHdpdGggdGhlIGFjdHVhbCBwb3J0CisgICBieSBqdXN0IHB1c2hpbmcgc3R1ZmYgaW50byB0aGUgcXVldWUgZ29pbmcgdG8gdGhlIHBvcnQuLi4gKi8KK3N0YXRpYyBpbnQgcmlvX2NoYXJzX2luX2J1ZmZlciAodm9pZCAqIHB0cikgCit7CisgIGZ1bmNfZW50ZXIoKTsKKworICBmdW5jX2V4aXQoKTsgIAorICByZXR1cm4gMDsKK30KKworCisvKiBOb3RoaW5nIHNwZWNpYWwgaGVyZS4uLiAqLworc3RhdGljIHZvaWQgcmlvX3NodXRkb3duX3BvcnQgKHZvaWQgKiBwdHIpIAoreworICBzdHJ1Y3QgUG9ydCAqUG9ydFA7CisKKyAgZnVuY19lbnRlcigpOworCisgIFBvcnRQID0gKHN0cnVjdCBQb3J0ICopcHRyOworICBQb3J0UC0+Z3MudHR5ID0gTlVMTDsKKyNpZiAwCisgIHBvcnQtPmdzLmZsYWdzICY9IH4gR1NfQUNUSVZFOworICBpZiAoIXBvcnQtPmdzLnR0eSkgeworICAgIHJpb19kcHJpbnRrIChSSU9fREJVR19UVFksICJObyB0dHkuXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwb3J0LT5ncy50dHktPnRlcm1pb3MpIHsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIk5vIHRlcm1pb3MuXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSB7CisgICAgcmlvX3NldHNpZ25hbHMgKHBvcnQsIDAsIDApOworICB9CisjZW5kaWYKKworICBmdW5jX2V4aXQoKTsKK30KKworCisvKiBJIGhhdmVuJ3QgdGhlIGZvZ2dpZXN0IHdoeSB0aGUgZGVjcmVtZW50IHVzZSBjb3VudCBoYXMgdG8gaGFwcGVuCisgICBoZXJlLiBUaGUgd2hvbGUgbGludXggc2VyaWFsIGRyaXZlcnMgc3R1ZmYgbmVlZHMgdG8gYmUgcmVkZXNpZ25lZC4KKyAgIE15IGd1ZXNzIGlzIHRoYXQgdGhpcyBpcyBhIGhhY2sgdG8gbWluaW1pemUgdGhlIGltcGFjdCBvZiBhIGJ1ZworICAgZWxzZXdoZXJlLiBUaGlua2luZyBhYm91dCBpdCBzb21lIG1vcmUuICh0cnkgaXQgc29tZXRpbWUpIFRyeQorICAgcnVubmluZyBtaW5pY29tIG9uIGEgc2VyaWFsIHBvcnQgdGhhdCBpcyBkcml2ZW4gYnkgYSBtb2R1bGFyaXplZAorICAgZHJpdmVyLiBIYXZlIHRoZSBtb2RlbSBoYW5ndXAuIFRoZW4gcmVtb3ZlIHRoZSBkcml2ZXIgbW9kdWxlLiBUaGVuCisgICBleGl0IG1pbmljb20uICBJIGV4cGVjdCBhbiAib29wcyIuICAtLSBSRVcgKi8KK3N0YXRpYyB2b2lkIHJpb19odW5ndXAgKHZvaWQgKnB0cikKK3sKKyAgc3RydWN0IFBvcnQgKlBvcnRQOworCisgIGZ1bmNfZW50ZXIoKTsKKyAgCisgIFBvcnRQID0gKHN0cnVjdCBQb3J0ICopcHRyOworICBQb3J0UC0+Z3MudHR5ID0gTlVMTDsKKworICBmdW5jX2V4aXQgKCk7Cit9CisKKworLyogVGhlIHN0YW5kYXJkIHNlcmlhbF9jbG9zZSB3b3VsZCBiZWNvbWUgc2hvcnRlciBpZiB5b3UnZCB3cmFwIGl0IGxpa2UKKyAgIHRoaXMuIAorICAgcnNfY2xvc2UgKC4uLil7c2F2ZV9mbGFncztjbGk7cmVhbF9jbG9zZSgpO2RlY191c2VfY291bnQ7cmVzdG9yZV9mbGFnczt9CisgKi8KK3N0YXRpYyB2b2lkIHJpb19jbG9zZSAodm9pZCAqcHRyKQoreworICBzdHJ1Y3QgUG9ydCAqUG9ydFA7CisKKyAgZnVuY19lbnRlciAoKTsKKworICBQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKXB0cjsKKworICByaW90Y2xvc2UgKHB0cik7CisKKyAgaWYoUG9ydFAtPmdzLmNvdW50KSB7CisgICAgcHJpbnRrIChLRVJOX0VSUiAiV0FSTklORyBwb3J0IGNvdW50OiVkXG4iLCBQb3J0UC0+Z3MuY291bnQpOworICAgIFBvcnRQLT5ncy5jb3VudCA9IDA7IAorICB9ICAgICAgICAgICAgICAgIAorCisgIFBvcnRQLT5ncy50dHkgPSBOVUxMOworICBmdW5jX2V4aXQgKCk7Cit9CisKKworCitzdGF0aWMgaW50IHJpb19md19pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICBpbnQgcmMgPSAwOworICBmdW5jX2VudGVyKCk7CisKKyAgLyogVGhlICJkZXYiIGFyZ3VtZW50IGlzbid0IHVzZWQuICovCisgIHJjID0gcmlvY29udHJvbCAocCwgMCwgY21kLCAodm9pZCAqKWFyZywgY2FwYWJsZShDQVBfU1lTX0FETUlOKSk7CisKKyAgZnVuY19leGl0ICgpOworICByZXR1cm4gcmM7Cit9CisKK2V4dGVybiBpbnQgUklPU2hvcnRDb21tYW5kKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IFBvcnQgKlBvcnRQLAorICAgICAgICAgICAgICAgaW50IGNvbW1hbmQsIGludCBsZW4sIGludCBhcmcpOworCitzdGF0aWMgaW50IHJpb19pb2N0bCAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCwgCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgaW50IHJjOworICBzdHJ1Y3QgUG9ydCAqUG9ydFA7CisgIGludCBpdmFsOworCisgIGZ1bmNfZW50ZXIoKTsKKworICBQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKyAgcmMgID0gMDsKKyAgc3dpdGNoIChjbWQpIHsKKyNpZiAwCisgIGNhc2UgVElPQ0dTT0ZUQ0FSOgorICAgIHJjID0gcHV0X3VzZXIoKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpID8gMSA6IDApLAorICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCAqKSBhcmcpOworICAgIGJyZWFrOworI2VuZGlmCisgIGNhc2UgVElPQ1NTT0ZUQ0FSOgorICAgIGlmICgocmMgPSBnZXRfdXNlcihpdmFsLCAodW5zaWduZWQgaW50ICopIGFyZykpID09IDApIHsKKyAgICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9CisgICAgICAgICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8CisgICAgICAgIChpdmFsID8gQ0xPQ0FMIDogMCk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFRJT0NHU0VSSUFMOgorICAgIHJjID0gLUVGQVVMVDsKKyAgICBpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgKikgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSkKKyAgICAgIHJjID0gZ3NfZ2V0c2VyaWFsKCZQb3J0UC0+Z3MsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOworICAgIGJyZWFrOworICBjYXNlIFRDU0JSSzoKKyAgICBpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJCUkVBSyBvbiBkZWxldGVkIFJUQVxuIik7CisgICAgICByYyA9IC1FSU87ICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChSSU9TaG9ydENvbW1hbmQocCwgUG9ydFAsIFNCUkVBSywgMiwgMjUwKSA9PSBSSU9fRkFJTCkgeworICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiU0JSRUFLIFJJT1Nob3J0Q29tbWFuZCBmYWlsZWRcbiIpOworICAgICAgICAgcmMgPSAtRUlPOworICAgICAgfSAgICAgICAgICAKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVENTQlJLUDoKKyAgICBpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJCUkVBSyBvbiBkZWxldGVkIFJUQVxuIik7CisgICAgICByYyA9IC1FSU87ICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIGludCBsOworICAgICAgbCA9IGFyZz9hcmcqMTAwOjI1MDsKKyAgICAgIGlmIChsID4gMjU1KSBsID0gMjU1OworICAgICAgaWYgKFJJT1Nob3J0Q29tbWFuZChwLCBQb3J0UCwgU0JSRUFLLCAyLCBhcmc/YXJnKjEwMDoyNTApID09IFJJT19GQUlMKSB7CisgICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJTQlJFQUsgUklPU2hvcnRDb21tYW5kIGZhaWxlZFxuIik7CisgICAgICAgICByYyA9IC1FSU87CisgICAgICB9ICAgICAgICAgIAorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBUSU9DU1NFUklBTDoKKyAgICByYyA9IC1FRkFVTFQ7CisgICAgaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgKHZvaWQgKikgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSkKKyAgICAgIHJjID0gZ3Nfc2V0c2VyaWFsKCZQb3J0UC0+Z3MsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOworICAgIGJyZWFrOworI2lmIDAKKyAgLyoKKyAgICogbm90ZTogdGhlc2UgSU9DVExzIG5vIGxvbmdlciByZWFjaCBoZXJlLiAgVXNlCisgICAqIHRpb2Ntc2V0L3Rpb2NtZ2V0IGRyaXZlciBtZXRob2RzIGluc3RlYWQuICBUaGUKKyAgICogI2lmIDAgZGlzYWJsZW1lbnQgcHJlZGF0ZXMgdGhpcyBjb21tZW50LgorICAgKi8KKyAgY2FzZSBUSU9DTUdFVDoKKyAgICByYyA9IC1FRkFVTFQ7CisgICAgaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkICopIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGludCkpKSB7CisgICAgICByYyA9IDA7CisgICAgICBpdmFsID0gcmlvX2dldHNpZ25hbHMocG9ydCk7CisgICAgICBwdXRfdXNlcihpdmFsLCAodW5zaWduZWQgaW50ICopIGFyZyk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFRJT0NNQklTOgorICAgIGlmICgocmMgPSBnZXRfdXNlcihpdmFsLCAodW5zaWduZWQgaW50ICopIGFyZykpID09IDApIHsKKyAgICAgIHJpb19zZXRzaWduYWxzKHBvcnQsICgoaXZhbCAmIFRJT0NNX0RUUikgPyAxIDogLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpdmFsICYgVElPQ01fUlRTKSA/IDEgOiAtMSkpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBUSU9DTUJJQzoKKyAgICBpZiAoKHJjID0gZ2V0X3VzZXIoaXZhbCwgKHVuc2lnbmVkIGludCAqKSBhcmcpKSA9PSAwKSB7CisgICAgICByaW9fc2V0c2lnbmFscyhwb3J0LCAoKGl2YWwgJiBUSU9DTV9EVFIpID8gMCA6IC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaXZhbCAmIFRJT0NNX1JUUykgPyAwIDogLTEpKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVElPQ01TRVQ6CisgICAgaWYgKChyYyA9IGdldF91c2VyKGl2YWwsICh1bnNpZ25lZCBpbnQgKikgYXJnKSkgPT0gMCkgeworICAgICAgcmlvX3NldHNpZ25hbHMocG9ydCwgKChpdmFsICYgVElPQ01fRFRSKSA/IDEgOiAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaXZhbCAmIFRJT0NNX1JUUykgPyAxIDogMCkpOworICAgIH0KKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIHJjID0gLUVOT0lPQ1RMQ01EOworICAgIGJyZWFrOworICB9CisgIGZ1bmNfZXhpdCgpOworICByZXR1cm4gcmM7Cit9CisKKworLyogVGhlIHRocm90dGxlL3VudGhyb3R0bGUgc2NoZW1lIGZvciB0aGUgU3BlY2lhbGl4IGNhcmQgaXMgZGlmZmVyZW50CisgKiBmcm9tIG90aGVyIGRyaXZlcnMgYW5kIGRlc2VydmVzIHNvbWUgZXhwbGFuYXRpb24uIAorICogVGhlIFNwZWNpYWxpeCBoYXJkd2FyZSB0YWtlcyBjYXJlIG9mIFhPTi9YT0ZGCisgKiBhbmQgQ1RTL1JUUyBmbG93IGNvbnRyb2wgaXRzZWxmLiAgVGhpcyBtZWFucyB0aGF0IGFsbCB3ZSBoYXZlIHRvCisgKiBkbyB3aGVuIHNpZ25hbGxlZCBieSB0aGUgdXBwZXIgdHR5IGxheWVyIHRvIHRocm90dGxlL3VudGhyb3R0bGUgaXMKKyAqIHRvIG1ha2UgYSBub3RlIG9mIGl0IGhlcmUuICBXaGVuIHdlIGNvbWUgdG8gcmVhZCBjaGFyYWN0ZXJzIGZyb20gdGhlCisgKiByeCBidWZmZXJzIG9uIHRoZSBjYXJkIChyaW9fcmVjZWl2ZV9jaGFycygpKSB3ZSBsb29rIHRvIHNlZSBpZiB0aGUKKyAqIHVwcGVyIGxheWVyIGNhbiBhY2NlcHQgbW9yZSAoYXMgbm90ZWQgaGVyZSBpbiByaW9fcnhfdGhyb3RbXSkuIAorICogSWYgaXQgY2FuJ3Qgd2Ugc2ltcGx5IGRvbid0IHJlbW92ZSBjaGFycyBmcm9tIHRoZSBjYXJkcyBidWZmZXIuIAorICogV2hlbiB0aGUgdHR5IGxheWVyIGNhbiBhY2NlcHQgY2hhcnMsIHdlIGFnYWluIG5vdGUgdGhhdCBoZXJlIGFuZCB3aGVuCisgKiByaW9fcmVjZWl2ZV9jaGFycygpIGlzIGNhbGxlZCBpdCB3aWxsIHJlbW92ZSB0aGVtIGZyb20gdGhlIGNhcmRzIGJ1ZmZlci4KKyAqIFRoZSBjYXJkIHdpbGwgbm90aWNlIHRoYXQgYSBwb3J0cyBidWZmZXIgaGFzIGRyYWluZWQgYmVsb3cgc29tZSBsb3cKKyAqIHdhdGVyIG1hcmsgYW5kIHdpbGwgdW5mbG93IGNvbnRyb2wgdGhlIGxpbmUgaXRzZWxmLCB1c2luZyB3aGF0ZXZlcgorICogZmxvdyBjb250cm9sIHNjaGVtZSBpcyBpbiB1c2UgZm9yIHRoYXQgcG9ydC4gLS0gU2ltb24gQWxsZW4KKyAqLworCitzdGF0aWMgdm9pZCByaW9fdGhyb3R0bGUgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworICBzdHJ1Y3QgUG9ydCAqcG9ydCA9IChzdHJ1Y3QgUG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIAorICBmdW5jX2VudGVyKCk7CisgIC8qIElmIHRoZSBwb3J0IGlzIHVzaW5nIGFueSB0eXBlIG9mIGlucHV0IGZsb3cKKyAgICogY29udHJvbCB0aGVuIHRocm90dGxlIHRoZSBwb3J0LgorICAgKi8KKworICBpZigodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgfHwgKElfSVhPRkYodHR5KSkgKSB7CisgICAgcG9ydC0+U3RhdGUgfD0gUklPX1RIUk9UVExFX1JYOworICB9CisKKyAgZnVuY19leGl0KCk7Cit9CisKKworc3RhdGljIHZvaWQgcmlvX3VudGhyb3R0bGUgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworICBzdHJ1Y3QgUG9ydCAqcG9ydCA9IChzdHJ1Y3QgUG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKyAgZnVuY19lbnRlcigpOworICAvKiBBbHdheXMgdW50aHJvdHRsZSBldmVuIGlmIGZsb3cgY29udHJvbCBpcyBub3QgZW5hYmxlZCBvbgorICAgKiB0aGlzIHBvcnQgaW4gY2FzZSB3ZSBkaXNhYmxlZCBmbG93IGNvbnRyb2wgd2hpbGUgdGhlIHBvcnQKKyAgICogd2FzIHRocm90dGxlZAorICAgKi8KKworICBwb3J0LT5TdGF0ZSAmPSB+UklPX1RIUk9UVExFX1JYOworCisgIGZ1bmNfZXhpdCgpOworICByZXR1cm47Cit9CisKKworCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCisgKiAgICAgICAgICAgICAgICAgICAgSGVyZSBhcmUgdGhlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzLiAgICAgICAgICAgICAgICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworCitzdGF0aWMgc3RydWN0IHZwZF9wcm9tICpnZXRfVlBEX1BST00gKHN0cnVjdCBIb3N0ICpocCkKK3sKKyAgc3RhdGljIHN0cnVjdCB2cGRfcHJvbSB2cGRwOworICBjaGFyICpwOworICBpbnQgaTsKKworICBmdW5jX2VudGVyKCk7CisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJHb2luZyB0byB2ZXJpZnkgdnBkIHByb20gYXQgJXAuXG4iLCAKKyAgICAgICAgICAgICAgaHAtPkNhZGRyICsgUklPX1ZQRF9ST00pOworCisgIHAgPSAoY2hhciAqKSAmdnBkcDsKKyAgZm9yIChpPTA7aTwgc2l6ZW9mIChzdHJ1Y3QgdnBkX3Byb20pO2krKykKKyAgICAqcCsrID0gcmVhZGIgKGhwLT5DYWRkcitSSU9fVlBEX1JPTSArIGkqMik7CisgICAgICAvKiByZWFkX3Jpb19ieXRlIChocCwgUklPX1ZQRF9ST00gKyBpKjIpOyAqLworCisgIC8qIFRlcm1pbmF0ZSB0aGUgaWRlbnRpZmllciBzdHJpbmcuIAorICAgICAqKiogcmVxdWlyZXMgb25lIGV4dHJhIGJ5dGUgaW4gc3RydWN0IHZwZF9wcm9tICoqKiAqLworICAqcCsrPTA7IAorCisgIGlmIChyaW9fZGVidWcgJiBSSU9fREVCVUdfUFJPQkUpCisgICAgbXlfaGQgKChjaGFyICopJnZwZHAsIDB4MjApOworICAKKyAgZnVuY19leGl0KCk7CisKKyAgcmV0dXJuICZ2cGRwOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHJpb19vcHMgPSB7CisJLm9wZW4gID0gcmlvdG9wZW4sCisJLmNsb3NlID0gZ3NfY2xvc2UsCisJLndyaXRlID0gZ3Nfd3JpdGUsCisJLnB1dF9jaGFyID0gZ3NfcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gZ3NfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSBnc193cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBnc19jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciA9IGdzX2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSByaW9faW9jdGwsCisJLnRocm90dGxlID0gcmlvX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gcmlvX3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zID0gZ3Nfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSBnc19zdG9wLAorCS5zdGFydCA9IGdzX3N0YXJ0LAorCS5oYW5ndXAgPSBnc19oYW5ndXAsCit9OworCitzdGF0aWMgaW50IHJpb19pbml0X2RyaXZlcnModm9pZCkKK3sKKwlpbnQgZXJyb3IgPSAtRU5PTUVNOworCisJcmlvX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoMjU2KTsKKwlpZiAoIXJpb19kcml2ZXIpCisJCWdvdG8gb3V0OworCXJpb19kcml2ZXIyID0gYWxsb2NfdHR5X2RyaXZlcigyNTYpOworCWlmICghcmlvX2RyaXZlcjIpCisJCWdvdG8gb3V0MTsKKworCWZ1bmNfZW50ZXIoKTsKKworCXJpb19kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJcmlvX2RyaXZlci0+ZHJpdmVyX25hbWUgPSAic3BlY2lhbGl4X3JpbyI7CisJcmlvX2RyaXZlci0+bmFtZSA9ICJ0dHlTUiI7CisJcmlvX2RyaXZlci0+bWFqb3IgPSBSSU9fTk9STUFMX01BSk9SMDsKKwlyaW9fZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlyaW9fZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCXJpb19kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlyaW9fZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlyaW9fZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKHJpb19kcml2ZXIsICZyaW9fb3BzKTsKKworCXJpb19kcml2ZXIyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXJpb19kcml2ZXIyLT5kcml2ZXJfbmFtZSA9ICJzcGVjaWFsaXhfcmlvIjsKKwlyaW9fZHJpdmVyMi0+bmFtZSA9ICJ0dHlTUiI7CisJcmlvX2RyaXZlcjItPm1ham9yID0gUklPX05PUk1BTF9NQUpPUjE7CisJcmlvX2RyaXZlcjItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXJpb19kcml2ZXIyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCXJpb19kcml2ZXIyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJcmlvX2RyaXZlcjItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCXJpb19kcml2ZXIyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKHJpb19kcml2ZXIyLCAmcmlvX29wcyk7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJzZXRfdGVybWlvcyA9ICVwXG4iLCBnc19zZXRfdGVybWlvcyk7CisKKwlpZiAoKGVycm9yID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihyaW9fZHJpdmVyKSkpCisJCWdvdG8gb3V0MjsKKwlpZiAoKGVycm9yID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihyaW9fZHJpdmVyMikpKQorCQlnb3RvIG91dDM7CisJZnVuY19leGl0KCk7CisJcmV0dXJuIDA7CitvdXQzOgorCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihyaW9fZHJpdmVyKTsKK291dDI6CisJcHV0X3R0eV9kcml2ZXIocmlvX2RyaXZlcjIpOworb3V0MToKKwlwdXRfdHR5X2RyaXZlcihyaW9fZHJpdmVyKTsKK291dDoKKwlwcmludGsoS0VSTl9FUlIgInJpbzogQ291bGRuJ3QgcmVnaXN0ZXIgYSByaW8gZHJpdmVyLCBlcnJvciA9ICVkXG4iLAorCSAgICAgZXJyb3IpOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkICogY2ttYWxsb2MgKGludCBzaXplKQoreworICB2b2lkICpwOworCisgIHAgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworICBpZiAocCkgCisgICAgbWVtc2V0KHAsIDAsIHNpemUpOworICByZXR1cm4gcDsKK30KKworCisKK3N0YXRpYyBpbnQgcmlvX2luaXRfZGF0YXN0cnVjdHVyZXMgKHZvaWQpCit7CisgIGludCBpOworICBzdHJ1Y3QgUG9ydCAqcG9ydDsKKyAgZnVuY19lbnRlcigpOworCisgIC8qIE1hbnkgZHJpdmVycyBzdGF0aWNhbGx5IGFsbG9jYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3J0cworICAgICBUaGVyZSBpcyBubyByZWFzb24gbm90IHRvIGFsbG9jYXRlIHRoZW0gZHluYW1pY2FsbHkuIElzIHRoZXJlPyAtLSBSRVcgKi8KKyAgLyogSG93ZXZlciwgdGhlIFJJTyBkcml2ZXIgYWxsb3dzIHVzZXJzIHRvIGNvbmZpZ3VyZSB0aGVpciBmaXJzdAorICAgICBSVEEgYXMgdGhlIHBvcnRzIG51bWJlcmVkIDUwNC01MTEuIFdlIHRoZXJlZm9yZSBuZWVkIHRvIGFsbG9jYXRlIAorICAgICB0aGUgd2hvbGUgcmFuZ2UuIDotKCAgIC0tIFJFVyAqLworICAKKyNkZWZpbmUgUklfU1ogICBzaXplb2Yoc3RydWN0IHJpb19pbmZvKQorI2RlZmluZSBIT1NUX1NaIHNpemVvZihzdHJ1Y3QgSG9zdCkKKyNkZWZpbmUgUE9SVF9TWiBzaXplb2Yoc3RydWN0IFBvcnQgKikKKyNkZWZpbmUgVE1JT19TWiBzaXplb2Yoc3RydWN0IHRlcm1pb3MgKikKKyAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiZ2V0dGluZyA6ICVkICVkICVkICVkICVkIGJ5dGVzXG4iLCAKKyAgICAgICAgICAgICAgIFJJX1NaLCAKKyAgICAgICAgICAgICAgIFJJT19IT1NUUyAqIEhPU1RfU1osCisgICAgICAgICAgICAgICBSSU9fUE9SVFMgKiBQT1JUX1NaLAorICAgICAgICAgICAgICAgUklPX1BPUlRTICogVE1JT19TWiwKKyAgICAgICAgICAgICAgIFJJT19QT1JUUyAqIFRNSU9fU1opOworICAKKyAgaWYgKCEocCAgICAgICAgICAgICAgICAgID0gY2ttYWxsb2MgKCAgICAgICAgICAgICAgUklfU1opKSkgZ290byBmcmVlMDsKKyAgaWYgKCEocC0+UklPSG9zdHMgICAgICAgID0gY2ttYWxsb2MgKFJJT19IT1NUUyAqIEhPU1RfU1opKSkgZ290byBmcmVlMTsKKyAgaWYgKCEocC0+UklPUG9ydHAgICAgICAgID0gY2ttYWxsb2MgKFJJT19QT1JUUyAqIFBPUlRfU1opKSkgZ290byBmcmVlMjsKKyAgcC0+UklPQ29uZiA9IFJJT0NvbmY7CisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkdvdCA6ICVwICVwICVwXG4iLCAKKyAgICAgICAgICAgICAgIHAsIHAtPlJJT0hvc3RzLCBwLT5SSU9Qb3J0cCk7CisKKyNpZiAxCisgIGZvciAoaSA9IDA7IGkgPCBSSU9fUE9SVFM7IGkrKykgeworICAgIHBvcnQgPSBwLT5SSU9Qb3J0cFtpXSA9IGNrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBQb3J0KSk7CisgICAgaWYgKCFwb3J0KSB7CisgICAgICBnb3RvIGZyZWU2OworICAgIH0KKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJpbml0aW5nIHBvcnQgJWQgKCVkKVxuIiwgaSwgcG9ydC0+TWFwcGVkKTsKKyAgICBwb3J0LT5Qb3J0TnVtID0gaTsKKyAgICBwb3J0LT5ncy5tYWdpYyA9IFJJT19NQUdJQzsKKyAgICBwb3J0LT5ncy5jbG9zZV9kZWxheSA9IEhaLzI7CisgICAgcG9ydC0+Z3MuY2xvc2luZ193YWl0ID0gMzAgKiBIWjsKKyAgICBwb3J0LT5ncy5yZCA9ICZyaW9fcmVhbF9kcml2ZXI7CisgICAgc3Bpbl9sb2NrX2luaXQoJnBvcnQtPnBvcnRTZW0pOworICAgIC8qCisgICAgICogSW5pdGlhbGl6aW5nIHdhaXQgcXVldWUKKyAgICAgKi8KKyAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5ncy5vcGVuX3dhaXQpOworICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPmdzLmNsb3NlX3dhaXQpOworICB9CisjZWxzZQorICAvKiBXZSBjb3VsZCBwb3N0cG9uZSBpbml0aWFsaXppbmcgdGhlbSB0byB3aGVuIHRoZXkgYXJlIGNvbmZpZ3VyZWQuICovCisjZW5kaWYKKworCisgIAorICBpZiAocmlvX2RlYnVnICYgUklPX0RFQlVHX0lOSVQpIHsKKyAgICBteV9oZCAoJnJpb19yZWFsX2RyaXZlciwgc2l6ZW9mIChyaW9fcmVhbF9kcml2ZXIpKTsKKyAgfQorCisgIAorICBmdW5jX2V4aXQoKTsKKyAgcmV0dXJuIDA7CisKKyBmcmVlNjpmb3IgKGktLTtpPj0wO2ktLSkKKyAgICAgICAga2ZyZWUgKHAtPlJJT1BvcnRwW2ldKTsKKy8qZnJlZTU6CisgZnJlZTQ6CisgZnJlZTM6Ki9rZnJlZSAocC0+UklPUG9ydHApOworIGZyZWUyOmtmcmVlIChwLT5SSU9Ib3N0cyk7CisgZnJlZTE6CisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIk5vdCBlbm91Z2ggbWVtb3J5ISAlcCAlcCAlcFxuIiwgCisgICAgICAgIAkgICAgICAgcCwgcC0+UklPSG9zdHMsIHAtPlJJT1BvcnRwKTsKKyAga2ZyZWUocCk7ICAgICAgICAJICAgICAgCisgZnJlZTA6CisgIHJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCAgX19leGl0IHJpb19yZWxlYXNlX2RyaXZlcnModm9pZCkKK3sKKyAgZnVuY19lbnRlcigpOworICB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocmlvX2RyaXZlcjIpOworICB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocmlvX2RyaXZlcik7CisgIHB1dF90dHlfZHJpdmVyKHJpb19kcml2ZXIyKTsKKyAgcHV0X3R0eV9kcml2ZXIocmlvX2RyaXZlcik7CisgIGZ1bmNfZXhpdCgpOworfQorCisKKyNpZmRlZiBDT05GSUdfUENJCisgLyogVGhpcyB3YXMgd3JpdHRlbiBmb3IgU1gsIGJ1dCBhcHBsaWVzIHRvIFJJTyB0b28uLi4KKyAgICAoaW5jbHVkaW5nIGJ1Z3MuLi4uKQorCisgICAgVGhlcmUgaXMgYW5vdGhlciBiaXQgYmVzaWRlcyBCaXQgMTcuIFR1cm5pbmcgdGhhdCBiaXQgb2ZmCisgICAgKG9uIGJvYXJkcyBzaGlwcGVkIHdpdGggdGhlIGZpeCBpbiB0aGUgZWVwcm9tKSByZXN1bHRzIGluIGEgCisgICAgaGFuZyBvbiB0aGUgbmV4dCBhY2Nlc3MgdG8gdGhlIGNhcmQuIAorICovCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBTZXR0aW5nIGJpdCAxNyBpbiB0aGUgQ05UUkwgcmVnaXN0ZXIgb2YgdGhlIFBMWCA5MDUwICAqIAorICogY2hpcCBmb3JjZXMgYSByZXRyeSBvbiB3cml0ZXMgd2hpbGUgYSByZWFkIGlzIHBlbmRpbmcuKgorICogVGhpcyBpcyB0byBwcmV2ZW50IHRoZSBjYXJkIGxvY2tpbmcgdXAgb24gSW50ZWwgWGVvbiAgKgorICogbXVsdGlwcm9jZXNzb3Igc3lzdGVtcyB3aXRoIHRoZSBOWCBjaGlwc2V0LiAgICAtLSBOViAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBOZXdlciBjYXJkcyBhcmUgcHJvZHVjZWQgd2l0aCB0aGlzIGJpdCBzZXQgZnJvbSB0aGUgY29uZmlndXJhdGlvbgorICAgRUVwcm9tLiAgQXMgdGhlIGJpdCBpcyByZWFkL3dyaXRlIGZvciB0aGUgQ1BVLCB3ZSBjYW4gZml4IGl0IGhlcmUsCisgICBpZiB3ZSBkZXRlY3QgdGhhdCBpdCBpc24ndCBzZXQgY29ycmVjdGx5LiAtLSBSRVcgKi8KKworc3RhdGljIHZvaWQgZml4X3Jpb19wY2kgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworICB1bnNpZ25lZCBpbnQgaHdiYXNlOworICB1bnNpZ25lZCBsb25nIHJlYmFzZTsKKyAgdW5zaWduZWQgaW50IHQ7CisKKyNkZWZpbmUgQ05UUkxfUkVHX09GRlNFVCAgICAgICAgMHg1MAorI2RlZmluZSBDTlRSTF9SRUdfR09PRFZBTFVFICAgICAweDE4MjYwMDAwCisKKyAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJmh3YmFzZSk7CisgIGh3YmFzZSAmPSBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworICByZWJhc2UgPSAgKHVsb25nKSBpb3JlbWFwKGh3YmFzZSwgMHg4MCk7CisgIHQgPSByZWFkbCAocmViYXNlICsgQ05UUkxfUkVHX09GRlNFVCk7CisgIGlmICh0ICE9IENOVFJMX1JFR19HT09EVkFMVUUpIHsKKyAgICBwcmludGsgKEtFUk5fREVCVUcgInJpbzogcGVyZm9ybWluZyBjbnRybCByZWcgZml4OiAlMDh4IC0+ICUwOHhcbiIsIAorICAgICAgICAgICAgdCwgQ05UUkxfUkVHX0dPT0RWQUxVRSk7IAorICAgIHdyaXRlbCAoQ05UUkxfUkVHX0dPT0RWQUxVRSwgcmViYXNlICsgQ05UUkxfUkVHX09GRlNFVCk7ICAKKyAgfQorICBpb3VubWFwKChjaGFyKikgcmViYXNlKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgX19pbml0IHJpb19pbml0KHZvaWQpIAoreworICBpbnQgZm91bmQgPSAwOworICBpbnQgaTsKKyAgc3RydWN0IEhvc3QgKmhwOworICBpbnQgcmV0dmFsOworICBzdHJ1Y3QgdnBkX3Byb20gKnZwZHA7CisgIGludCBva2JvYXJkOworCisjaWZkZWYgQ09ORklHX1BDSQorICBzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisgIHVuc2lnbmVkIGludCB0aW50OworICB1bnNpZ25lZCBzaG9ydCB0c2hvcnQ7CisjZW5kaWYKKworICBmdW5jX2VudGVyKCk7CisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkluaXRpbmcgcmlvIG1vZHVsZS4uLiAocmlvX2RlYnVnPSVkKVxuIiwgCisJICAgICAgIHJpb19kZWJ1Zyk7CisKKyAgaWYgKGFicyAoKGxvbmcpICgmcmlvX2RlYnVnKSAtIHJpb19kZWJ1ZykgPCAweDEwMDAwKSB7CisgICAgcHJpbnRrIChLRVJOX1dBUk5JTkcgInJpbzogcmlvX2RlYnVnIGlzIGFuIGFkZHJlc3MsIGluc3RlYWQgb2YgYSB2YWx1ZS4gIgorICAgICAgICAgICAgIkFzc3VtaW5nIC0xLiBXYXMgJXgvJXAuXG4iLCByaW9fZGVidWcsICZyaW9fZGVidWcpOworICAgIHJpb19kZWJ1Zz0tMTsKKyAgfQorCisgIGlmIChtaXNjX3JlZ2lzdGVyKCZyaW9fZndfZGV2aWNlKSA8IDApIHsKKyAgICBwcmludGsoS0VSTl9FUlIgIlJJTzogVW5hYmxlIHRvIHJlZ2lzdGVyIGZpcm13YXJlIGxvYWRlciBkcml2ZXIuXG4iKTsKKyAgICByZXR1cm4gLUVJTzsKKyAgfQorCisgIHJldHZhbCA9IHJpb19pbml0X2RhdGFzdHJ1Y3R1cmVzICgpOworICBpZiAocmV0dmFsIDwgMCkgeworICAgIG1pc2NfZGVyZWdpc3RlcigmcmlvX2Z3X2RldmljZSk7CisgICAgcmV0dXJuIHJldHZhbDsKKyAgfQorCisjaWZkZWYgQ09ORklHX1BDSQorICAgIC8qIEZpcnN0IGxvb2sgZm9yIHRoZSBKRVQgZGV2aWNlczogKi8KKyAgICB3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UgKFBDSV9WRU5ET1JfSURfU1BFQ0lBTElYLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1NYX1hJT19JTzgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRldikpKSB7CisgICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSBjb250aW51ZTsKKworICAgICAgLyogU3BlY2lhbGl4IGhhcyBhIHdob2xlIGJ1bmNoIG9mIGNhcmRzIHdpdGgKKyAgICAgICAgIDB4MjAwMCBhcyB0aGUgZGV2aWNlIElELiBUaGV5IHNheSBpdHMgYmVjYXVzZQorICAgICAgICAgdGhlIHN0YW5kYXJkIHJlcXVpcmVzIGl0LiBTdHVwaWQgc3RhbmRhcmQuICovCisgICAgICAvKiBJdCBzZWVtcyB0aGF0IHJlYWRpbmcgYSB3b3JkIGRvZXNuJ3Qgd29yayByZWxpYWJseSBvbiAyLjAuCisgICAgICAgICBBbHNvLCByZWFkaW5nIGEgbm9uLWFsaWduZWQgZHdvcmQgZG9lc24ndCB3b3JrLiBTbyB3ZSByZWFkIHRoZQorICAgICAgICAgd2hvbGUgZHdvcmQgYXQgMHgyYyBhbmQgZXh0cmFjdCB0aGUgd29yZCBhdCAweDJlIChTVUJTWVNURU1fSUQpCisgICAgICAgICBvdXJzZWx2ZXMgKi8KKyAgICAgIC8qIEkgZG9uJ3Qga25vdyB3aHkgdGhlIGRlZmluZSBkb2Vzbid0IHdvcmssIGNvbnN0YW50IDB4MmMgZG9lcyAtLVJFVyAqLyAKKyAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZCAocGRldiwgMHgyYywgJnRpbnQpOworICAgICAgdHNob3J0ID0gKHRpbnQgPj4gMTYpICYgMHhmZmZmOworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkdvdCBhIHNwZWNpYWxpeCBjYXJkOiAleC5cbiIsIHRpbnQpOworICAgICAgaWYgKHRzaG9ydCAhPSAweDAxMDApIHsKKyAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkJ1dCBpdCdzIG5vdCBhIFJJTyBjYXJkICglZCkuLi5cbiIsIAorICAgICAgICAgICAgICAgICAgICB0c2hvcnQpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJjcDFcbiIpOworCisgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18yLCAmdGludCk7CisKKyAgICAgIGhwID0gJnAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXTsKKyAgICAgIGhwLT5QYWRkclAgPSAgdGludCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisgICAgICBocC0+SXZlYyA9IHBkZXYtPmlycTsKKyAgICAgIGlmICgoKDEgPDwgaHAtPkl2ZWMpICYgcmlvX2lycW1hc2spID09IDApCisgICAgICAgICAgICAgIGhwLT5JdmVjID0gMDsKKyAgICAgIGhwLT5DYWRkciA9IGlvcmVtYXAocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwgUklPX1dJTkRPV19MRU4pOworICAgICAgaHAtPkNhcmRQCT0gKHN0cnVjdCBEcFJhbSAqKSBocC0+Q2FkZHI7CisgICAgICBocC0+VHlwZSAgPSBSSU9fUENJOworICAgICAgaHAtPkNvcHkgID0gcmlvX3BjaWNvcHk7IAorICAgICAgaHAtPk1vZGUgID0gUklPX1BDSV9CT09UX0ZST01fUkFNOworICAgICAgc3Bpbl9sb2NrX2luaXQoJmhwLT5Ib3N0TG9jayk7CisgICAgICByaW9fcmVzZXRfaW50ZXJydXB0IChocCk7CisgICAgICByaW9fc3RhcnRfY2FyZF9ydW5uaW5nIChocCk7CisKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJHb2luZyB0byB0ZXN0IGl0ICglcC8lcCkuXG4iLAorICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwKKyAgICAgICAgICAgICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIpOworICAgICAgaWYgKFJJT0JvYXJkVGVzdCggcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICBSSU9fUENJLCAwICkgPT0gUklPX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRG9uZSBSSU9Cb2FyZFRlc3RcbiIpOworICAgICAgICAgICAgICBXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUmVzZXRJbnQsIDB4ZmYpOworICAgICAgICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtICA9CisgICAgICAgICAgICAgICAgICAgICAgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzBdKSAmMHhGRik8PCAwKXwKKyAgICAgICAgICAgICAgICAgICAgICAoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMV0pICYweEZGKTw8IDgpfAorICAgICAgICAgICAgICAgICAgICAgICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVsyXSkgJjB4RkYpPDwxNil8CisgICAgICAgICAgICAgICAgICAgICAgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzNdKSAmMHhGRik8PDI0KTsKKyAgICAgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkhtbSBUZXN0ZWQgb2ssIHVuaXFpZCA9ICV4LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZml4X3Jpb19wY2kgKHBkZXYpOworICAgICAgICAgICAgICBwLT5SSU9MYXN0UENJU2VhcmNoID0gUklPX1NVQ0NFU1M7CisgICAgICAgICAgICAgIHAtPlJJT051bUhvc3RzKys7CisgICAgICAgICAgICAgIGZvdW5kKys7CisgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpb3VubWFwKChjaGFyKikgKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkcikpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBUaGVuIGxvb2sgZm9yIHRoZSBvbGRlciBQQ0kgY2FyZC4uLi4gOiAqLworCisgIC8qIFRoZXNlIG9sZGVyIFBDSSBjYXJkcyBoYXZlIHByb2JsZW1zIChvbmx5IGJ5dGUtbW9kZSBhY2Nlc3MgaXMKKyAgICAgc3VwcG9ydGVkKSwgd2hpY2ggbWFrZXMgdGhlbSBhIGJpdCBhd2t3YXJkIHRvIHN1cHBvcnQuIAorICAgICBUaGV5IGFsc28gaGF2ZSBwcm9ibGVtcyBzaGFyaW5nIGludGVycnVwdHMuIEJlIGNhcmVmdWwuIAorICAgICAoVGhlIGRyaXZlciBub3cgcmVmdXNlcyB0byBzaGFyZSBpbnRlcnJ1cHRzIGZvciB0aGVzZQorICAgICBjYXJkcy4gVGhpcyBzaG91bGQgYmUgc3VmZmljaWVudCkuCisgICovCisKKyAgICAvKiBUaGVuIGxvb2sgZm9yIHRoZSBvbGRlciBSSU8vUENJIGRldmljZXM6ICovCisgICAgd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlIChQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9SSU8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRldikpKSB7CisgICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSBjb250aW51ZTsKKworI2lmZGVmIENPTkZJR19SSU9fT0xEUENJCisgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18wLCAmdGludCk7CisKKyAgICAgIGhwID0gJnAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXTsKKyAgICAgIGhwLT5QYWRkclAgPSAgdGludCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisgICAgICBocC0+SXZlYyA9IHBkZXYtPmlycTsKKyAgICAgIGlmICgoKDEgPDwgaHAtPkl2ZWMpICYgcmlvX2lycW1hc2spID09IDApIAorICAgICAgCWhwLT5JdmVjID0gMDsKKyAgICAgIGhwLT5JdmVjIHw9IDB4ODAwMDsgLyogTWFyayBhcyBub24tc2hhcmFibGUgKi8KKyAgICAgIGhwLT5DYWRkciA9IGlvcmVtYXAocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwgUklPX1dJTkRPV19MRU4pOworICAgICAgaHAtPkNhcmRQCT0gKHN0cnVjdCBEcFJhbSAqKSBocC0+Q2FkZHI7CisgICAgICBocC0+VHlwZSAgPSBSSU9fUENJOworICAgICAgaHAtPkNvcHkgID0gcmlvX3BjaWNvcHk7CisgICAgICBocC0+TW9kZSAgPSBSSU9fUENJX0JPT1RfRlJPTV9SQU07CisgICAgICBzcGluX2xvY2tfaW5pdCgmaHAtPkhvc3RMb2NrKTsKKworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkl2ZWM6ICV4XG4iLCBocC0+SXZlYyk7CisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BST0JFLCAiTW9kZTogJXhcbiIsIGhwLT5Nb2RlKTsKKworICAgICAgcmlvX3Jlc2V0X2ludGVycnVwdCAoaHApOworICAgICAgcmlvX3N0YXJ0X2NhcmRfcnVubmluZyAoaHApOworICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJHb2luZyB0byB0ZXN0IGl0ICglcC8lcCkuXG4iLAorICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwKKyAgICAgICAgICAgICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIpOworICAgICAgaWYgKFJJT0JvYXJkVGVzdCggcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICBSSU9fUENJLCAwICkgPT0gUklPX1NVQ0NFU1MpIHsKKyAgICAgICAgV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlJlc2V0SW50LCAweGZmKTsKKyAgICAgICAgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZU51bSAgPQorICAgICAgICAgICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVswXSkgJjB4RkYpPDwgMCl8CisgICAgICAgICAgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzFdKSAmMHhGRik8PCA4KXwKKyAgICAgICAgICAoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMl0pICYweEZGKTw8MTYpfAorICAgICAgICAgICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVszXSkgJjB4RkYpPDwyNCk7CisgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJIbW0gVGVzdGVkIG9rLCB1bmlxaWQgPSAleC5cbiIsCisgICAgICAgICAgICAgICAgICAgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZU51bSk7CisKKyAgICAgICAgcC0+UklPTGFzdFBDSVNlYXJjaCA9IFJJT19TVUNDRVNTOworICAgICAgICBwLT5SSU9OdW1Ib3N0cysrOworICAgICAgICBmb3VuZCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW91bm1hcCgoY2hhciopIChwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIpKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICBwcmludGsgKEtFUk5fRVJSICJGb3VuZCBhbiBvbGRlciBSSU8gUENJIGNhcmQsIGJ1dCB0aGUgZHJpdmVyIGlzIG5vdCAiCisgICAgICAgICAgICAgICJjb21waWxlZCB0byBzdXBwb3J0IGl0LlxuIik7CisjZW5kaWYKKyAgICB9CisjZW5kaWYgLyogUENJICovCisKKyAgLyogTm93IHByb2JlIGZvciBJU0EgY2FyZHMuLi4gKi8KKyAgZm9yIChpPTA7aTxOUl9SSU9fQUREUlM7aSsrKSB7CisgICAgaHAgPSAmcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdOworICAgIGhwLT5QYWRkclAgPSByaW9fcHJvYmVfYWRkcnNbaV07CisgICAgLyogVGhlcmUgd2FzIHNvbWV0aGluZyBhYm91dCB0aGUgSVJRcyBvZiB0aGVzZSBjYXJkcy4gJ0ZvcmdldCB3aGF0Li0tUkVXICovCisgICAgaHAtPkl2ZWMgPSAwOworICAgIGhwLT5DYWRkciA9IGlvcmVtYXAocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwgUklPX1dJTkRPV19MRU4pOworICAgIGhwLT5DYXJkUCA9IChzdHJ1Y3QgRHBSYW0gKikgaHAtPkNhZGRyOworICAgIGhwLT5UeXBlID0gUklPX0FUOworICAgIGhwLT5Db3B5ID0gcmlvX3BjaWNvcHk7IC8qIEFUIGNhcmQgUENJPz8/PyAtIFBWREwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAtLSBZRVMhIHRoaXMgaXMgbm93IGEgbm9ybWFsIGNvcHkuIE9ubHkgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9sZCBQQ0kgY2FyZCB1c2VzIHRoZSBzcGVjaWFsIFBDSSBjb3B5LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBNb3Jlb3ZlciwgdGhlIElTQSBjYXJkIHdpbGwgd29yayB3aXRoIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzcGVjaWFsIFBDSSBjb3B5IGFueXdheS4gLS0gUkVXICovCisgICAgaHAtPk1vZGUgPSAwOworICAgIHNwaW5fbG9ja19pbml0KCZocC0+SG9zdExvY2spOworCisgICAgdnBkcCA9IGdldF9WUERfUFJPTSAoaHApOworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJHb3QgVlBEIFJPTVxuIik7CisgICAgb2tib2FyZCA9IDA7CisgICAgaWYgKChzdHJuY21wICh2cGRwLT5pZGVudGlmaWVyLCBSSU9fSVNBX0lERU5ULCAxNikgPT0gMCkgfHwKKyAgICAgICAgKHN0cm5jbXAgKHZwZHAtPmlkZW50aWZpZXIsIFJJT19JU0EyX0lERU5ULCAxNikgPT0gMCkgfHwKKyAgICAgICAgKHN0cm5jbXAgKHZwZHAtPmlkZW50aWZpZXIsIFJJT19JU0EzX0lERU5ULCAxNikgPT0gMCkpIHsKKyAgICAgIC8qIEJvYXJkIGlzIHByZXNlbnQuLi4gKi8KKyAgICAgIGlmIChSSU9Cb2FyZFRlc3QgKGhwLT5QYWRkclAsIAorICAgICAgICAgICAgICAgICAgICAgICAgaHAtPkNhZGRyLCBSSU9fQVQsIDApID09IFJJT19TVUNDRVNTKSB7CisgICAgICAgIC8qIC4uLiBhbmQgZmVlbGluZyBmaW5lISEhISAqLworICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BST0JFLCAiSG1tIFRlc3RlZCBvaywgdW5pcWlkID0gJXguXG4iLAorICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOworICAgICAgICBpZiAoUklPQXNzaWduQVQocCwgaHAtPlBhZGRyUCwgaHAtPkNhZGRyLCAwKSkgeyAgICAgICAgCisgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkhtbSBUZXN0ZWQgb2ssIGhvc3QlZCB1bmlxaWQgPSAleC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHAtPlJJT051bUhvc3RzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHMtMV0uVW5pcXVlTnVtKTsKKyAgICAgICAgICBva2JvYXJkKys7CisgICAgICAgICAgZm91bmQrKzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgaWYgKCFva2JvYXJkKQorICAgICAgaW91bm1hcCAoKGNoYXIqKSAoaHAtPkNhZGRyKSk7CisgICAgfQorICB9CisKKworICBmb3IgKGk9MDtpPHAtPlJJT051bUhvc3RzO2krKykgeworICAgIGhwID0gJnAtPlJJT0hvc3RzW2ldOworICAgIGlmIChocC0+SXZlYykgeworICAgICAgaW50IG1vZGUgPSBTQV9TSElSUTsKKyAgICAgIGlmIChocC0+SXZlYyAmIDB4ODAwMCkge21vZGUgPSAwOyBocC0+SXZlYyAmPSAweDdmZmY7fQorICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUmVxdWVzdGluZyBpbnRlcnJ1cHQgaHA6ICVwIHJpb19pbnRlcnJ1cHQ6ICVkIE1vZGU6ICV4XG4iLCBocCxocC0+SXZlYywgaHAtPk1vZGUpOworICAgICAgcmV0dmFsID0gcmVxdWVzdF9pcnEgKGhwLT5JdmVjLCByaW9faW50ZXJydXB0LCBtb2RlLCAicmlvIiwgaHApOworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUmV0dXJuIHZhbHVlIGZyb20gcmVxdWVzdF9pcnE6ICVkXG4iLCByZXR2YWwpOworICAgICAgaWYgKHJldHZhbCkgeworICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInJpbzogQ2Fubm90IGFsbG9jYXRlIGlycSAlZC5cbiIsIGhwLT5JdmVjKTsKKyAgICAgICAgICAgICAgaHAtPkl2ZWMgPSAwOworICAgICAgfQorICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiR290IGlycSAlZC5cbiIsIGhwLT5JdmVjKTsKKyAgICAgIGlmIChocC0+SXZlYyAhPSAwKXsKKyAgICAgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRW5hYmxpbmcgaW50ZXJydXB0cyBvbiByaW8gY2FyZC5cbiIpOyAKKyAgICAgICAgICAgICAgaHAtPk1vZGUgfD0gUklPX1BDSV9JTlRfRU5BQkxFOworICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIGhwLT5Nb2RlICY9ICFSSU9fUENJX0lOVF9FTkFCTEU7CisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJOZXcgTW9kZTogJXhcbiIsIGhwLT5Nb2RlKTsKKyAgICAgIHJpb19zdGFydF9jYXJkX3J1bm5pbmcgKGhwKTsKKyAgICB9CisgICAgLyogSW5pdCB0aGUgdGltZXIgImFsd2F5cyIgdG8gbWFrZSBzdXJlIHRoYXQgaXQgY2FuIHNhZmVseSBiZSAKKyAgICAgICBkZWxldGVkIHdoZW4gd2UgdW5sb2FkLi4uICovCisKKyAgICBpbml0X3RpbWVyICgmaHAtPnRpbWVyKTsKKyAgICBpZiAoIWhwLT5JdmVjKSB7CisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJTdGFydGluZyBwb2xsaW5nIGF0ICVkaiBpbnRlcnZhbHMuXG4iLCAKKyAgICAgICAgICAgICAgICAgICByaW9fcG9sbCk7CisgICAgICBocC0+dGltZXIuZGF0YSA9IGk7CisgICAgICBocC0+dGltZXIuZnVuY3Rpb24gPSByaW9fcG9sbGZ1bmM7CisgICAgICBocC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyByaW9fcG9sbDsKKyAgICAgIGFkZF90aW1lciAoJmhwLT50aW1lcik7CisgICAgfQorICB9CisKKyAgaWYgKGZvdW5kKSB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAicmlvOiB0b3RhbCBvZiAlZCBib2FyZHMgZGV0ZWN0ZWQuXG4iLCBmb3VuZCk7CisgICAgcmlvX2luaXRfZHJpdmVycyAoKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBkZXJlZ2lzdGVyIHRoZSBtaXNjIGRldmljZSB3ZSBjcmVhdGVkIGVhcmxpZXIgKi8KKyAgICBtaXNjX2RlcmVnaXN0ZXIoJnJpb19md19kZXZpY2UpOworICB9CisKKyAgZnVuY19leGl0KCk7CisgIHJldHVybiBmb3VuZD8wOi1FSU87Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHJpb19leGl0ICh2b2lkKQoreworICBpbnQgaTsgCisgIHN0cnVjdCBIb3N0ICpocDsKKyAgCisgIGZ1bmNfZW50ZXIoKTsKKworICBmb3IgKGk9MCxocD1wLT5SSU9Ib3N0cztpPHAtPlJJT051bUhvc3RzO2krKywgaHArKykgeworICAgIFJJT0hvc3RSZXNldCAoaHAtPlR5cGUsIGhwLT5DYXJkUCwgaHAtPlNsb3QpOworICAgIGlmIChocC0+SXZlYykgeworICAgICAgZnJlZV9pcnEgKGhwLT5JdmVjLCBocCk7CisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJmcmVlZCBpcnEgJWQuXG4iLCBocC0+SXZlYyk7CisgICAgfQorICAgIC8qIEl0IGlzIHNhZmUvYWxsb3dlZCB0byBkZWxfdGltZXIgYSBub24tYWN0aXZlIHRpbWVyICovCisgICAgZGVsX3RpbWVyICgmaHAtPnRpbWVyKTsKKyAgfQorCisgIGlmIChtaXNjX2RlcmVnaXN0ZXIoJnJpb19md19kZXZpY2UpIDwgMCkgeworICAgIHByaW50ayAoS0VSTl9JTkZPICJyaW86IGNvdWxkbid0IGRlcmVnaXN0ZXIgY29udHJvbC1kZXZpY2VcbiIpOworICB9CisKKworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0NMRUFOVVAsICJDbGVhbmluZyB1cCBkcml2ZXJzXG4iKTsKKworICByaW9fcmVsZWFzZV9kcml2ZXJzICgpOworCisgIC8qIFJlbGVhc2UgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSAqLworICBrZnJlZSAocC0+UklPUG9ydHApOworICBrZnJlZSAocC0+UklPSG9zdHMpOworICBrZnJlZSAocCk7CisKKyAgZnVuY19leGl0KCk7Cit9CisKK21vZHVsZV9pbml0KHJpb19pbml0KTsKK21vZHVsZV9leGl0KHJpb19leGl0KTsKKworLyoKKyAqIEFueWJvZHkgd2hvIGtub3dzIHdoeSB0aGlzIGRvZXNuJ3Qgd29yayBmb3IgbWUsIHBsZWFzZSB0ZWxsIG1lIC0tIFJFVy4KKyAqIFNuYXRjaGVkIGZyb20gc2NzaS5jIChmaXhlZCBvbmUgc3BlbGxpbmcgZXJyb3IpOgorICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cycgdGFiYmluZyBzdHlsZS4KKyAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQorICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAorICogb2YgdGhlIGZpbGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGMtaW5kZW50LWxldmVsOiA0CisgKiBjLWJyYWNlLWltYWdpbmFyeS1vZmZzZXQ6IDAKKyAqIGMtYnJhY2Utb2Zmc2V0OiAtNAorICogYy1hcmdkZWNsLWluZGVudDogNAorICogYy1sYWJlbC1vZmZzZXQ6IC00CisgKiBjLWNvbnRpbnVlZC1zdGF0ZW1lbnQtb2Zmc2V0OiA0CisgKiBjLWNvbnRpbnVlZC1icmFjZS1vZmZzZXQ6IDAKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9fbGludXguaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvX2xpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiYTE5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5oCkBAIC0wLDAgKzEsMTg3IEBACisKKy8qCisgKiAgcmlvX2xpbnV4LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LDE5OTksMjAwMCBSLkUuV29sZmZAQml0V2l6YXJkLm5sCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBSSU8gc2VyaWFsIGRyaXZlci4KKyAqCisgKiAgVmVyc2lvbiAxLjAgLS0gSnVseSwgMTk5OS4gCisgKiAKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjZGVmaW5lIFJJT19OQk9BUkRTICAgICAgICA0CisjZGVmaW5lIFJJT19QT1JUU1BFUkJPQVJEIDEyOAorI2RlZmluZSBSSU9fTlBPUlRTICAgICAgICAoUklPX05CT0FSRFMgKiBSSU9fUE9SVFNQRVJCT0FSRCkKKworI2RlZmluZSBNT0RFTV9TVVBQT1JUCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgUklPX01BR0lDIDB4MTIzNDU2NzgKKworCitzdHJ1Y3QgdnBkX3Byb20geworICB1bnNpZ25lZCBzaG9ydCBpZDsKKyAgY2hhciBod3JldjsKKyAgY2hhciBod2FzczsKKyAgaW50IHVuaXFpZDsKKyAgY2hhciBteWVhcjsKKyAgY2hhciBtd2VlazsKKyAgY2hhciBod19mZWF0dXJlWzVdOworICBjaGFyIG9lbV9pZDsKKyAgY2hhciBpZGVudGlmaWVyWzE2XTsKK307CisKKworI2RlZmluZSBSSU9fREVCVUdfQUxMICAgICAgICAgICAweGZmZmZmZmZmCisKKyNkZWZpbmUgT19PVEhFUih0dHkpICAgIFwKKyAgICAgICgoT19PTENVQyh0dHkpKSAgfHxcCisgICAgICAoT19PTkxDUih0dHkpKSAgIHx8XAorICAgICAgKE9fT0NSTkwodHR5KSkgICB8fFwKKyAgICAgIChPX09OT0NSKHR0eSkpICAgfHxcCisgICAgICAoT19PTkxSRVQodHR5KSkgIHx8XAorICAgICAgKE9fT0ZJTEwodHR5KSkgICB8fFwKKyAgICAgIChPX09GREVMKHR0eSkpICAgfHxcCisgICAgICAoT19OTERMWSh0dHkpKSAgIHx8XAorICAgICAgKE9fQ1JETFkodHR5KSkgICB8fFwKKyAgICAgIChPX1RBQkRMWSh0dHkpKSAgfHxcCisgICAgICAoT19CU0RMWSh0dHkpKSAgIHx8XAorICAgICAgKE9fVlRETFkodHR5KSkgICB8fFwKKyAgICAgIChPX0ZGRExZKHR0eSkpKQorCisvKiBTYW1lIGZvciBpbnB1dC4gKi8KKyNkZWZpbmUgSV9PVEhFUih0dHkpICAgIFwKKyAgICAgICgoSV9JTkxDUih0dHkpKSAgfHxcCisgICAgICAoSV9JR05DUih0dHkpKSAgIHx8XAorICAgICAgKElfSUNSTkwodHR5KSkgICB8fFwKKyAgICAgIChJX0lVQ0xDKHR0eSkpICAgfHxcCisgICAgICAoTF9JU0lHKHR0eSkpKQorCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKworI2RlZmluZSBSSU9fQk9BUkRfSU5UUl9MT0NLICAxCisKKworI2lmbmRlZiBSSU9DVExfTUlTQ19NSU5PUiAKKy8qIEFsbG93IG90aGVycyB0byBnYXRoZXIgdGhpcyBpbnRvICJtYWpvci5oIiBvciBzb21ldGhpbmcgbGlrZSB0aGF0ICovCisjZGVmaW5lIFJJT0NUTF9NSVNDX01JTk9SICAgIDE2OQorI2VuZGlmCisKKworLyogQWxsb3cgdXMgdG8gZGVidWcgImluIHRoZSBmaWVsZCIgd2l0aG91dCByZXF1aXJpbmcgY2xpZW50cyB0bworICAgcmVjb21waWxlLi4uLiAqLworI2lmIDEKKyNkZWZpbmUgcmlvX3NwaW5fbG9ja19pcnFzYXZlKHNlbSwgZmxhZ3MpIGRvIHsgXAorCXJpb19kcHJpbnRrIChSSU9fREVCVUdfU1BJTkxPQ0ssICJzcGlubG9ja2lycXNhdmU6ICVwICVzOiVkXG4iLCBcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW0sIF9fRklMRV9fLCBfX0xJTkVfXyk7XAorCXNwaW5fbG9ja19pcnFzYXZlKHNlbSwgZmxhZ3MpO1wKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKHNlbSwgZmxhZ3MpIGRvIHsgXAorCXJpb19kcHJpbnRrIChSSU9fREVCVUdfU1BJTkxPQ0ssICJzcGludW5sb2NraXJxcmVzdG9yZTogJXAgJXM6JWRcbiIsXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtLCBfX0ZJTEVfXywgX19MSU5FX18pO1wKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNlbSwgZmxhZ3MpO1wKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHJpb19zcGluX2xvY2soc2VtKSBkbyB7IFwKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1NQSU5MT0NLLCAic3BpbmxvY2s6ICVwICVzOiVkXG4iLFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbSwgX19GSUxFX18sIF9fTElORV9fKTtcCisJc3Bpbl9sb2NrKHNlbSk7XAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgcmlvX3NwaW5fdW5sb2NrKHNlbSkgZG8geyBcCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19TUElOTE9DSywgInNwaW51bmxvY2s6ICVwICVzOiVkXG4iLFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbSwgX19GSUxFX18sIF9fTElORV9fKTtcCisJc3Bpbl91bmxvY2soc2VtKTtcCisJfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIHJpb19zcGluX2xvY2tfaXJxc2F2ZShzZW0sIGZsYWdzKSBcCisgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZShzZW0sIGZsYWdzKQorCisjZGVmaW5lIHJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKHNlbSwgZmxhZ3MpIFwKKyAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2VtLCBmbGFncykKKworI2RlZmluZSByaW9fc3Bpbl9sb2NrKHNlbSkgXAorICAgICAgICAgICAgc3Bpbl9sb2NrKHNlbSkgCisKKyNkZWZpbmUgcmlvX3NwaW5fdW5sb2NrKHNlbSkgXAorICAgICAgICAgICAgc3Bpbl91bmxvY2soc2VtKSAKKworI2VuZGlmCisKKworCisjaWZkZWYgQ09ORklHX1JJT19PTERQQ0kKK3N0YXRpYyBpbmxpbmUgdm9pZCAqcmlvX21lbWNweV90b2lvICh2b2lkICpkdW1teSwgdm9pZCAqZGVzdCwgdm9pZCAqc291cmNlLCBpbnQgbikKK3sKKyAgY2hhciAqZHN0ID0gZGVzdDsKKyAgY2hhciAqc3JjID0gc291cmNlOworCisgIHdoaWxlIChuLS0pIHsKKyAgICB3cml0ZWIgKCpzcmMrKywgZHN0KyspOworICAgICh2b2lkKSByZWFkYiAoZHVtbXkpOworICB9CisKKyAgcmV0dXJuIGRlc3Q7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkICpyaW9fbWVtY3B5X2Zyb21pbyAodm9pZCAqZGVzdCwgdm9pZCAqc291cmNlLCBpbnQgbikKK3sKKyAgY2hhciAqZHN0ID0gZGVzdDsKKyAgY2hhciAqc3JjID0gc291cmNlOworCisgIHdoaWxlIChuLS0pIAorICAgICpkc3QrKyA9IHJlYWRiIChzcmMrKyk7CisKKyAgcmV0dXJuIGRlc3Q7Cit9CisKKyNlbHNlCisjZGVmaW5lIHJpb19tZW1jcHlfdG9pbyhkdW1teSxkZXN0LHNvdXJjZSxuKSAgIG1lbWNweV90b2lvKGRlc3QsIHNvdXJjZSwgbikKKyNkZWZpbmUgcmlvX21lbWNweV9mcm9taW8gICAgICAgICAgICAgICAgICAgICAgbWVtY3B5X2Zyb21pbworI2VuZGlmCisKKyNkZWZpbmUgREVCVUcgMQorCisKKy8qIAorICAgVGhpcyBkcml2ZXIgY2FuIHNwZXcgYSB3aG9sZSBsb3Qgb2YgZGVidWdnaW5nIG91dHB1dCBhdCB5b3UuIElmIHlvdQorICAgbmVlZCBtYXhpbXVtIHBlcmZvcm1hbmNlLCB5b3Ugc2hvdWxkIGRpc2FibGUgdGhlIERFQlVHIGRlZmluZS4gVG8KKyAgIGFpZCBpbiBkZWJ1Z2dpbmcgaW4gdGhlIGZpZWxkLCBJJ20gbGVhdmluZyB0aGUgY29tcGlsZS10aW1lIGRlYnVnCisgICBmZWF0dXJlcyBlbmFibGVkLCBhbmQgZGlzYWJsZSB0aGVtICJydW50aW1lIi4gVGhhdCBhbGxvd3MgbWUgdG8KKyAgIGluc3RydWN0IHBlb3BsZSB3aXRoIHByb2JsZW1zIHRvIGVuYWJsZSBkZWJ1Z2dpbmcgd2l0aG91dCByZXF1aXJpbmcKKyAgIHRoZW0gdG8gcmVjb21waWxlLi4uIAorKi8KKworI2lmZGVmIERFQlVHCisjZGVmaW5lIHJpb19kcHJpbnRrKGYsIHN0ci4uLikgZG8geyBpZiAocmlvX2RlYnVnICYgZikgcHJpbnRrIChzdHIpO30gd2hpbGUgKDApCisjZGVmaW5lIGZ1bmNfZW50ZXIoKSByaW9fZHByaW50ayAoUklPX0RFQlVHX0ZMT1csICJyaW86IGVudGVyICVzXG4iLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIGZ1bmNfZXhpdCgpICByaW9fZHByaW50ayAoUklPX0RFQlVHX0ZMT1csICJyaW86IGV4aXQgICVzXG4iLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIGZ1bmNfZW50ZXIyKCkgcmlvX2RwcmludGsgKFJJT19ERUJVR19GTE9XLCAicmlvOiBlbnRlciAlcyAocG9ydCAlZClcbiIsX19GVU5DVElPTl9fLCBwb3J0LT5saW5lKQorI2Vsc2UKKyNkZWZpbmUgcmlvX2RwcmludGsoZiwgc3RyLi4uKSAvKiBub3RoaW5nICovCisjZGVmaW5lIGZ1bmNfZW50ZXIoKQorI2RlZmluZSBmdW5jX2V4aXQoKQorI2RlZmluZSBmdW5jX2VudGVyMigpCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9ib2FyZC5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9ib2FyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNmFjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2JvYXJkLmgKQEAgLTAsMCArMSwyODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglUaXRsZQkJOglSSU8gSG9zdCBDYXJkIEhhcmR3YXJlIERlZmluaXRpb25zCSovCisvKgkJCQkJCQkJCSovCisvKglBdXRob3IJCToJTi5QLlZhc3NhbGxvCQkJCSovCisvKgkJCQkJCQkJCSovCisvKglDcmVhdGlvbgk6CTI2dGggQXByaWwgMTk5OQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoJVmVyc2lvbgkJOgkxLjAuMAkJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUNvcHlyaWdodAk6CShjKSBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuIDE5OTkJKgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCQkJCQkJCQkJKi8KKy8qCURlc2NyaXB0aW9uCToJUHJvdG90eXBlcywgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMJKi8KKy8qCQkJCWRlc2NyaWJpbmcgdGhlIFJJTyBib2FyZCBoYXJkd2FyZQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSGlzdG9yeS4uLgorCisxLjAuMAkyNi8wNC85OSBOUFYJQ3JlYXRpb24uCisKKyovCisKKyNpZm5kZWYJX3Jpb2JvYXJkX2gJCQkJLyogSWYgUklPQk9BUkQuSCBub3QgYWxyZWFkeSBkZWZpbmVkICovCisjZGVmaW5lCV9yaW9ib2FyZF9oICAgIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqICAgSGFyZHdhcmUgQ29udHJvbCBSZWdpc3RlcnMgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSGFyZHdhcmUgUmVnaXN0ZXJzLi4uICovCisKKyNkZWZpbmUJUklPX1JFR19CQVNFCTB4N0MwMAkJCS8qIEJhc2Ugb2YgY29udHJvbCByZWdpc3RlcnMgKi8KKworI2RlZmluZQlSSU9fQ09ORklHCVJJT19SRUdfQkFTRSArIDB4MDAwMAkvKiBXUklURTogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlSSU9fSU5UU0VUCVJJT19SRUdfQkFTRSArIDB4MDA4MAkvKiBXUklURTogSW50ZXJydXB0IFNldCAqLworI2RlZmluZQlSSU9fUkVTRVQJUklPX1JFR19CQVNFICsgMHgwMTAwCS8qIFdSSVRFOiBIb3N0IFJlc2V0ICovCisjZGVmaW5lCVJJT19JTlRSRVNFVAlSSU9fUkVHX0JBU0UgKyAweDAxODAJLyogV1JJVEU6IEludGVycnVwdCBSZXNldCAqLworCisjZGVmaW5lCVJJT19WUERfUk9NCVJJT19SRUdfQkFTRSArIDB4MDAwMAkvKiBSRUFEOiBWaXRhbCBQcm9kdWN0IERhdGEgUk9NICovCisjZGVmaW5lCVJJT19JTlRTVEFUCVJJT19SRUdfQkFTRSArIDB4MDA4MAkvKiBSRUFEOiBJbnRlcnJ1cHQgU3RhdHVzIChKZXQgYm9hcmRzIG9ubHkpICovCisjZGVmaW5lCVJJT19SRVNFVFNUQVQJUklPX1JFR19CQVNFICsgMHgwMTAwCS8qIFJFQUQ6IFJlc2V0IFN0YXR1cyAoSmV0IGJvYXJkcyBvbmx5KSAqLworCisvKiBSSU9fVlBEX1JPTSBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlWUERfU0xYX0lEMQkweDAwCQkJLyogUkVBRDogU3BlY2lhbGl4IElkZW50aWZpZXIgIzEgKi8KKyNkZWZpbmUJVlBEX1NMWF9JRDIJMHgwMQkJCS8qIFJFQUQ6IFNwZWNpYWxpeCBJZGVudGlmaWVyICMyICovCisjZGVmaW5lCVZQRF9IV19SRVYJMHgwMgkJCS8qIFJFQUQ6IEhhcmR3YXJlIFJldmlzaW9uICovCisjZGVmaW5lCVZQRF9IV19BU1NFTQkweDAzCQkJLyogUkVBRDogSGFyZHdhcmUgQXNzZW1ibHkgTGV2ZWwgKi8KKyNkZWZpbmUJVlBEX1VOSVFVRUlENAkweDA0CQkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzQgKi8KKyNkZWZpbmUJVlBEX1VOSVFVRUlEMwkweDA1CQkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzMgKi8KKyNkZWZpbmUJVlBEX1VOSVFVRUlEMgkweDA2CQkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzIgKi8KKyNkZWZpbmUJVlBEX1VOSVFVRUlEMQkweDA3CQkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzEgKi8KKyNkZWZpbmUJVlBEX01BTlVfWUVBUgkweDA4CQkJLyogUkVBRDogWWVhciBPZiBNYW51ZmFjdHVyZSAoMCA9IDE5NzApICovCisjZGVmaW5lCVZQRF9NQU5VX1dFRUsJMHgwOQkJCS8qIFJFQUQ6IFdlZWsgT2YgTWFudWZhY3R1cmUgKDAgPSB3ZWVrIDEgSmFuKSAqLworI2RlZmluZQlWUERfSFdGRUFUVVJFMQkweDBBCQkJLyogUkVBRDogSGFyZHdhcmUgRmVhdHVyZSBCeXRlIDEgKi8KKyNkZWZpbmUJVlBEX0hXRkVBVFVSRTIJMHgwQgkJCS8qIFJFQUQ6IEhhcmR3YXJlIEZlYXR1cmUgQnl0ZSAyICovCisjZGVmaW5lCVZQRF9IV0ZFQVRVUkUzCTB4MEMJCQkvKiBSRUFEOiBIYXJkd2FyZSBGZWF0dXJlIEJ5dGUgMyAqLworI2RlZmluZQlWUERfSFdGRUFUVVJFNAkweDBECQkJLyogUkVBRDogSGFyZHdhcmUgRmVhdHVyZSBCeXRlIDQgKi8KKyNkZWZpbmUJVlBEX0hXRkVBVFVSRTUJMHgwRQkJCS8qIFJFQUQ6IEhhcmR3YXJlIEZlYXR1cmUgQnl0ZSA1ICovCisjZGVmaW5lCVZQRF9PRU1JRAkweDBGCQkJLyogUkVBRDogT0VNIElkZW50aWZpZXIgKi8KKyNkZWZpbmUJVlBEX0lERU5UCTB4MTAJCQkvKiBSRUFEOiBJZGVudGlmaWVyIHN0cmluZyAoMTYgYnl0ZXMpICovCisjZGVmaW5lCVZQRF9JREVOVF9MRU4JMHgxMAorCisvKiBWUEQgUk9NIERlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVNMWF9JRDEJCTB4NEQKKyNkZWZpbmUJU0xYX0lEMgkJMHg5OAorCisjZGVmaW5lCVBST0RVQ1RfSUQoYSkJKChhPj40KSYweEYpCQkvKiBVc2UgdG8gb2J0YWluIFByb2R1Y3QgSUQgZnJvbSBWUERfVU5JUVVFSUQxICovCisKKyNkZWZpbmUJSURfU1hfSVNBCTB4MgorI2RlZmluZQlJRF9SSU9fRUlTQQkweDMKKyNkZWZpbmUJSURfU1hfUENJCTB4NQorI2RlZmluZQlJRF9TWF9FSVNBCTB4NworI2RlZmluZQlJRF9SSU9fUlRBMTYJMHg5CisjZGVmaW5lCUlEX1JJT19JU0EJMHhBCisjZGVmaW5lCUlEX1JJT19NQ0EJMHhCCisjZGVmaW5lCUlEX1JJT19TQlVTCTB4QworI2RlZmluZQlJRF9SSU9fUENJCTB4RAorI2RlZmluZQlJRF9SSU9fUlRBOAkweEUKKworLyogVHJhbnNwdXRlciBib290c3RyYXAgZGVmaW5pdGlvbnMuLi4gKi8KKworI2RlZmluZQlCT09UTE9BREFERFIJCSgweDgwMDAgLSA2KQorI2RlZmluZQlCT09USU5ESUNBVEUJCSgweDgwMDAgLSAyKQorCisvKiBGaXJtd2FyZSBsb2FkIHBvc2l0aW9uLi4uICovCisKKyNkZWZpbmUJRklSTVdBUkVMT0FEQUREUgkweDdDMDAJCS8qIEZpcm13YXJlIGlzIGxvYWRlZCBfYmVmb3JlXyB0aGlzIGFkZHJlc3MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUklPIChSZXYxKSBJU0EgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBEZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fSVNBX0lERU5UCSJKQkpHUEdHSElOU01KUEpSIgorCisjZGVmaW5lCVJJT19JU0FfQ0ZHX0JPT1RSQU0JMHgwMQkJLyogQm9vdCBmcm9tIFJBTSwgZWxzZSBMaW5rICovCisjZGVmaW5lCVJJT19JU0FfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLworI2RlZmluZQlSSU9fSVNBX0NGR19JUlFNQVNLCTB4MzAJCS8qIEludGVycnVwdCBtYXNrICovCisjZGVmaW5lCSAgUklPX0lTQV9DRkdfSVJRMTIJMHgxMAkJLyogSW50ZXJydXB0IExldmVsIDEyICovCisjZGVmaW5lCSAgUklPX0lTQV9DRkdfSVJRMTEJMHgyMAkJLyogSW50ZXJydXB0IExldmVsIDExICovCisjZGVmaW5lCSAgUklPX0lTQV9DRkdfSVJROQkweDMwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgOSAqLworI2RlZmluZQlSSU9fSVNBX0NGR19MSU5LMjAJMHg0MAkJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCisjZGVmaW5lCVJJT19JU0FfQ0ZHX1dBSVRTVEFURTAJMHg4MAkJLyogMCB3YWl0c3RhdGVzLCBlbHNlIDEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUklPIChSZXYyKSBJU0EgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBEZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fSVNBMl9JREVOVAkiSkJKR1BHR0hJTlNNSlBKUiIKKworI2RlZmluZQlSSU9fSVNBMl9DRkdfQk9PVFJBTQkweDAxCQkvKiBCb290IGZyb20gUkFNLCBlbHNlIExpbmsgKi8KKyNkZWZpbmUJUklPX0lTQTJfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLworI2RlZmluZQlSSU9fSVNBMl9DRkdfSU5URU5BQkxFCTB4MDQJCS8qIEludGVycnVwdCBlbmFibGUsIGVsc2UgZGlzYWJsZSAqLworI2RlZmluZQlSSU9fSVNBMl9DRkdfMTZCSVQJMHgwOAkJLyogMTZiaXQgbW9kZSwgZWxzZSA4Yml0ICovCisjZGVmaW5lCVJJT19JU0EyX0NGR19JUlFNQVNLCTB4MzAJCS8qIEludGVycnVwdCBtYXNrICovCisjZGVmaW5lCSAgUklPX0lTQTJfQ0ZHX0lSUTE1CTB4MDAJCS8qIEludGVycnVwdCBMZXZlbCAxNSAqLworI2RlZmluZQkgIFJJT19JU0EyX0NGR19JUlExMgkweDEwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTIgKi8KKyNkZWZpbmUJICBSSU9fSVNBMl9DRkdfSVJRMTEJMHgyMAkJLyogSW50ZXJydXB0IExldmVsIDExICovCisjZGVmaW5lCSAgUklPX0lTQTJfQ0ZHX0lSUTkJMHgzMAkJLyogSW50ZXJydXB0IExldmVsIDkgKi8KKyNkZWZpbmUJUklPX0lTQTJfQ0ZHX0xJTksyMAkweDQwCQkvKiAyME1icHMgbGluaywgZWxzZSAxME1icHMgKi8KKyNkZWZpbmUJUklPX0lTQTJfQ0ZHX1dBSVRTVEFURTAJMHg4MAkJLyogMCB3YWl0c3RhdGVzLCBlbHNlIDEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUklPIChKZXQpIElTQSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBEZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fSVNBM19JREVOVAkiSkVUIEhPU1QgQlkgS0VWIyIKKworI2RlZmluZQlSSU9fSVNBM19DRkdfQlVTRU5BQkxFCTB4MDIJCS8qIEVuYWJsZSBwcm9jZXNzb3IgYnVzICovCisjZGVmaW5lCVJJT19JU0EzX0NGR19JTlRFTkFCTEUJMHgwNAkJLyogSW50ZXJydXB0IGVuYWJsZSwgZWxzZSBkaXNhYmxlICovCisjZGVmaW5lCVJJT19JU0EzMl9DRkdfSVJRTUFTSwkweEYzMAkJLyogSW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUJICBSSU9fSVNBM19DRkdfSVJRMTUJMHhGMAkJLyogSW50ZXJydXB0IExldmVsIDE1ICovCisjZGVmaW5lCSAgUklPX0lTQTNfQ0ZHX0lSUTEyCTB4QzAJCS8qIEludGVycnVwdCBMZXZlbCAxMiAqLworI2RlZmluZQkgIFJJT19JU0EzX0NGR19JUlExMQkweEIwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTEgKi8KKyNkZWZpbmUJICBSSU9fSVNBM19DRkdfSVJRMTAJMHhBMAkJLyogSW50ZXJydXB0IExldmVsIDEwICovCisjZGVmaW5lCSAgUklPX0lTQTNfQ0ZHX0lSUTkJMHg5MAkJLyogSW50ZXJydXB0IExldmVsIDkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJJTyBNQ0EgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBEZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fTUNBX0lERU5UCSJKQkpHUEdHSElOU01KUEpSIgorCisjZGVmaW5lCVJJT19NQ0FfQ0ZHX0JPT1RSQU0JMHgwMQkJLyogQm9vdCBmcm9tIFJBTSwgZWxzZSBMaW5rICovCisjZGVmaW5lCVJJT19NQ0FfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLworI2RlZmluZQlSSU9fTUNBX0NGR19MSU5LMjAJMHg0MAkJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJJTyBFSVNBICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEVJU0EgQ29uZmlndXJhdGlvbiBTcGFjZSBEZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlFSVNBX1BST0RVQ1RfSUQxCTB4QzgwCisjZGVmaW5lCUVJU0FfUFJPRFVDVF9JRDIJMHhDODEKKyNkZWZpbmUJRUlTQV9QUk9EVUNUX05VTUJFUgkweEM4MgorI2RlZmluZQlFSVNBX1JFVklTSU9OX05VTUJFUgkweEM4MworI2RlZmluZQlFSVNBX0NBUkRfRU5BQkxFCTB4Qzg0CisjZGVmaW5lCUVJU0FfVlBEX1VOSVFVRUlENAkweEM4OAkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzQgKi8KKyNkZWZpbmUJRUlTQV9WUERfVU5JUVVFSUQzCTB4QzhBCQkvKiBSRUFEOiBVbmlxdWUgSWRlbnRpZmllciAjMyAqLworI2RlZmluZQlFSVNBX1ZQRF9VTklRVUVJRDIJMHhDOTAJCS8qIFJFQUQ6IFVuaXF1ZSBJZGVudGlmaWVyICMyICovCisjZGVmaW5lCUVJU0FfVlBEX1VOSVFVRUlEMQkweEM5MgkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzEgKi8KKyNkZWZpbmUJRUlTQV9WUERfTUFOVV9ZRUFSCTB4Qzk4CQkvKiBSRUFEOiBZZWFyIE9mIE1hbnVmYWN0dXJlICgwID0gMTk3MCkgKi8KKyNkZWZpbmUJRUlTQV9WUERfTUFOVV9XRUVLCTB4QzlBCQkvKiBSRUFEOiBXZWVrIE9mIE1hbnVmYWN0dXJlICgwID0gd2VlayAxIEphbikgKi8KKyNkZWZpbmUJRUlTQV9NRU1fQUREUl8yM18xNgkweEMwMAorI2RlZmluZQlFSVNBX01FTV9BRERSXzMxXzI0CTB4QzAxCisjZGVmaW5lCUVJU0FfUklPX0NPTkZJRwkJMHhDMDIJCS8qIFdSSVRFOiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCUVJU0FfUklPX0lOVFNFVAkJMHhDMDMJCS8qIFdSSVRFOiBJbnRlcnJ1cHQgU2V0ICovCisjZGVmaW5lCUVJU0FfUklPX0lOVFJFU0VUCTB4QzAzCQkvKiBSRUFEOiAgSW50ZXJydXB0IFJlc2V0ICovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgRGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUklPX0VJU0FfQ0ZHX0JPT1RSQU0JMHgwMQkJLyogQm9vdCBmcm9tIFJBTSwgZWxzZSBMaW5rICovCisjZGVmaW5lCVJJT19FSVNBX0NGR19MSU5LMjAJMHgwMgkJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCisjZGVmaW5lCVJJT19FSVNBX0NGR19CVVNFTkFCTEUJMHgwNAkJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KKyNkZWZpbmUJUklPX0VJU0FfQ0ZHX1BST0NSVU4JMHgwOAkJLyogUHJvY2Vzc29yIHJ1bm5pbmcsIGVsc2UgcmVzZXQgKi8KKyNkZWZpbmUJUklPX0VJU0FfQ0ZHX0lSUU1BU0sJMHhGMAkJLyogSW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRMTUJMHhGMAkJLyogSW50ZXJydXB0IExldmVsIDE1ICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTE0CTB4RTAJCS8qIEludGVycnVwdCBMZXZlbCAxNCAqLworI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlExMgkweEMwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTIgKi8KKyNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRMTEJMHhCMAkJLyogSW50ZXJydXB0IExldmVsIDExICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTEwCTB4QTAJCS8qIEludGVycnVwdCBMZXZlbCAxMCAqLworI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlE5CTB4OTAJCS8qIEludGVycnVwdCBMZXZlbCA5ICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTcJMHg3MAkJLyogSW50ZXJydXB0IExldmVsIDcgKi8KKyNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRNgkweDYwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgNiAqLworI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlE1CTB4NTAJCS8qIEludGVycnVwdCBMZXZlbCA1ICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTQJMHg0MAkJLyogSW50ZXJydXB0IExldmVsIDQgKi8KKyNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRMwkweDMwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBSSU8gU0J1cyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb250cm9sIFJlZ2lzdGVyIERlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVJJT19TQlVTX0lERU5UCSJKQlBHSyNcMFwwXDBcMFwwXDBcMFwwXDBcMCIKKworI2RlZmluZQlSSU9fU0JVU19DRkdfQk9PVFJBTQkweDAxCQkvKiBCb290IGZyb20gUkFNLCBlbHNlIExpbmsgKi8KKyNkZWZpbmUJUklPX1NCVVNfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLworI2RlZmluZQlSSU9fU0JVU19DRkdfSU5URU5BQkxFCTB4MDQJCS8qIEludGVycnVwdCBlbmFibGUsIGVsc2UgZGlzYWJsZSAqLworI2RlZmluZQlSSU9fU0JVU19DRkdfSVJRTUFTSwkweDM4CQkvKiBJbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlFOT05FCTB4MDAJCS8qIE5vIEludGVycnVwdCAqLworI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlE3CTB4MzgJCS8qIEludGVycnVwdCBMZXZlbCA3ICovCisjZGVmaW5lCSAgUklPX1NCVVNfQ0ZHX0lSUTYJMHgzMAkJLyogSW50ZXJydXB0IExldmVsIDYgKi8KKyNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRNQkweDI4CQkvKiBJbnRlcnJ1cHQgTGV2ZWwgNSAqLworI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlE0CTB4MjAJCS8qIEludGVycnVwdCBMZXZlbCA0ICovCisjZGVmaW5lCSAgUklPX1NCVVNfQ0ZHX0lSUTMJMHgxOAkJLyogSW50ZXJydXB0IExldmVsIDMgKi8KKyNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRMgkweDEwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMiAqLworI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlExCTB4MDgJCS8qIEludGVycnVwdCBMZXZlbCAxICovCisjZGVmaW5lCVJJT19TQlVTX0NGR19MSU5LMjAJMHg0MAkJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCisjZGVmaW5lCVJJT19TQlVTX0NGR19QUk9DMjUJMHg4MAkJLyogMjVNaHogcHJvY2Vzc29yIGNsb2NrLCBlbHNlIDIwTWh6ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBSSU8gUENJICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgRGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUklPX1BDSV9JREVOVAkiRUNERFBHSkdKSEpSR1NLIyIKKworI2RlZmluZQlSSU9fUENJX0NGR19CT09UUkFNCTB4MDEJCS8qIEJvb3QgZnJvbSBSQU0sIGVsc2UgTGluayAqLworI2RlZmluZQlSSU9fUENJX0NGR19CVVNFTkFCTEUJMHgwMgkJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KKyNkZWZpbmUJUklPX1BDSV9DRkdfSU5URU5BQkxFCTB4MDQJCS8qIEludGVycnVwdCBlbmFibGUsIGVsc2UgZGlzYWJsZSAqLworI2RlZmluZQlSSU9fUENJX0NGR19MSU5LMjAJMHg0MAkJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCisjZGVmaW5lCVJJT19QQ0lfQ0ZHX1BST0MyNQkweDgwCQkvKiAyNU1oeiBwcm9jZXNzb3IgY2xvY2ssIGVsc2UgMjBNaHogKi8KKworLyogUENJIERlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVNQWF9WRU5ET1JfSUQJCTB4MTFDQgkJLyogQXNzaWduZWQgYnkgdGhlIFBDSSBTSUcgKi8KKyNkZWZpbmUJU1BYX0RFVklDRV9JRAkJMHg4MDAwCQkvKiBSSU8gYnJpZGdlIGJvYXJkcyAqLworI2RlZmluZQlTUFhfUExYREVWSUNFX0lECTB4MjAwMAkJLyogUExYIGJyaWRnZSBib2FyZHMgKi8KKyNkZWZpbmUJU1BYX1NVQl9WRU5ET1JfSUQJU1BYX1ZFTkRPUl9JRAkvKiBTYW1lIGFzIHZlbmRvciBpZCAqLworI2RlZmluZQlSSU9fU1VCX1NZU19JRAkJMHgwODAwCQkvKiBSSU8gUENJIGJvYXJkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJJTyAoSmV0KSBQQ0kgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgRGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUklPX1BDSTJfSURFTlQJIkpFVCBIT1NUIEJZIEtFViMiCisKKyNkZWZpbmUJUklPX1BDSTJfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLworI2RlZmluZQlSSU9fUENJMl9DRkdfSU5URU5BQkxFCTB4MDQJCS8qIEludGVycnVwdCBlbmFibGUsIGVsc2UgZGlzYWJsZSAqLworCisvKiBQQ0kgRGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUklPMl9TVUJfU1lTX0lECQkweDAxMDAJCS8qIFJJTyAoSmV0KSBQQ0kgYm9hcmQgKi8KKworI2VuZGlmCQkJCQkJLypfcmlvYm9hcmRfaCAqLworCisvKiBFbmQgb2YgUklPQk9BUkQuSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9ib290LmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2Jvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGJlMTFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9ib290LmMKQEAgLTAsMCArMSwxMzYwIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW9ib290LmMKKyoqCVNJRAkJOiAxLjMKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDEwOjMzOjM2CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDEwOjMzOjQ4CisqKgorKiogIGlkZW50IEAoIylyaW9ib290LmMJMS4zCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9ib290X2Nfc2Njc18gPSAiQCgjKXJpb2Jvb3QuYwkxLjMiOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworCisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKworCisKKyNpbmNsdWRlICJsaW51eF9jb21wYXQuaCIKKyNpbmNsdWRlICJyaW9fbGludXguaCIKKyNpbmNsdWRlICJ0eXBkZWYuaCIKKyNpbmNsdWRlICJwa3QuaCIKKyNpbmNsdWRlICJkYWVtb24uaCIKKyNpbmNsdWRlICJyaW8uaCIKKyNpbmNsdWRlICJyaW9zcGFjZS5oIgorI2luY2x1ZGUgInRvcC5oIgorI2luY2x1ZGUgImNtZHBrdC5oIgorI2luY2x1ZGUgIm1hcC5oIgorI2luY2x1ZGUgInJpb3R5cGVzLmgiCisjaW5jbHVkZSAicnVwLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgInJpb2RydnIuaCIKKyNpbmNsdWRlICJyaW9pbmZvLmgiCisjaW5jbHVkZSAiZnVuYy5oIgorI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgInBjaS5oIgorCisjaW5jbHVkZSAicGFybW1hcC5oIgorI2luY2x1ZGUgInVuaXhydXAuaCIKKyNpbmNsdWRlICJib2FyZC5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgInBoYi5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJjbWRibGsuaCIKKyNpbmNsdWRlICJyb3V0ZS5oIgorCitzdGF0aWMgaW50IFJJT0Jvb3RDb21wbGV0ZSggc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgSG9zdCAqSG9zdFAsIHVpbnQgUnVwLCBzdHJ1Y3QgUGt0Q21kICpQa3RDbWRQICk7CisKK3N0YXRpYyB1Y2hhcgorUklPQXRWZWMyQ3RybFtdID0KK3sKKwkvKiAwICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiAxICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiAyICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiAzICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiA0ICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiA1ICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiA2ICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiA3ICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiA4ICovICBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiA5ICovICBJUlFfOXxJTlRFUlJVUFRfRU5BQkxFLAorCS8qIDEwICovIElOVEVSUlVQVF9ESVNBQkxFLAorCS8qIDExICovIElSUV8xMXxJTlRFUlJVUFRfRU5BQkxFLAorCS8qIDEyICovIElSUV8xMnxJTlRFUlJVUFRfRU5BQkxFLAorCS8qIDEzICovIElOVEVSUlVQVF9ESVNBQkxFLAorCS8qIDE0ICovIElOVEVSUlVQVF9ESVNBQkxFLAorCS8qIDE1ICovIElSUV8xNXxJTlRFUlJVUFRfRU5BQkxFCit9OworCisvKgorKiogTG9hZCBpbiB0aGUgUlRBIGJvb3QgY29kZS4KKyovCitpbnQKK1JJT0Jvb3RDb2RlUlRBKHAsIHJicCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgRG93bkxvYWQgKglyYnA7IAoreworCWludCBvZmZzZXQ7CisKKwlmdW5jX2VudGVyICgpOworCisJLyogTGludXggZG9lc24ndCBhbGxvdyB5b3UgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzIGR1cmluZyBhCisJICAgImNvcHlpbiIuIChDcmFzaCB3aGVuIGEgcGFnZWZhdWx0IG9jY3VycykuICovCisJLyogZGlzYWJsZShvbGRzcGwpOyAqLworCQorCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkRhdGEgYXQgdXNlciBhZGRyZXNzIDB4JXhcbiIsKGludClyYnAtPkRhdGFQKTsKKworCS8qCisJKiogQ2hlY2sgdGhhdCB3ZSBoYXZlIHNldCBhc3NpZGUgZW5vdWdoIG1lbW9yeSBmb3IgdGhpcworCSovCisJaWYgKCByYnAtPkNvdW50ID4gU0lYVFlfRk9VUl9LICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSVEEgQm9vdCBDb2RlIFRvbyBMYXJnZSFcbiIpOworCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfRklMRV9UT09fTEFSR0U7CisJCS8qIHJlc3RvcmUob2xkc3BsKTsgKi8KKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoIHAtPlJJT0Jvb3RpbmcgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJUQSBCb290IENvZGUgOiBCVVNZIEJVU1kgQlVTWSFcbiIpOworCQlwLT5SSU9FcnJvci5FcnJvciA9IEJPT1RfSU5fUFJPR1JFU1M7CisJCS8qIHJlc3RvcmUob2xkc3BsKTsgKi8KKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qCisJKiogVGhlIGRhdGEgd2UgbG9hZCBpbiBtdXN0IGVuZCBvbiBhIChSVEFfQk9PVF9EQVRBX1NJWkUpIGJ5dGUgYm91bmRhcnksCisJKiogc28gY2FsY3VsYXRlIGhvdyBmYXIgd2UgaGF2ZSB0byBtb3ZlIHRoZSBkYXRhIHVwIHRoZSBidWZmZXIKKwkqKiB0byBhY2hpZXZlIHRoaXMuCisJKi8KKwlvZmZzZXQgPSAoUlRBX0JPT1RfREFUQV9TSVpFIC0gKHJicC0+Q291bnQgJSBSVEFfQk9PVF9EQVRBX1NJWkUpKSAlIAorCQkJCQkJCVJUQV9CT09UX0RBVEFfU0laRTsKKworCS8qCisJKiogQmUgY2xlYW4sIGFuZCBjbGVhciB0aGUgJ3VudXNlZCcgcG9ydGlvbiBvZiB0aGUgYm9vdCBidWZmZXIsCisJKiogYmVjYXVzZSBpdCB3aWxsIChldmVudHVhbGx5KSBiZSBwYXJ0IG9mIHRoZSBSdGEgcnVuIHRpbWUgZW52aXJvbm1lbnQKKwkqKiBhbmQgc28gc2hvdWxkIGJlIHplcm9lZC4KKwkqLworCWJ6ZXJvKCAoY2FkZHJfdClwLT5SSU9Cb290UGFja2V0cywgb2Zmc2V0ICk7CisKKwkvKgorCSoqIENvcHkgdGhlIGRhdGEgZnJvbSB1c2VyIHNwYWNlLgorCSovCisKKwlpZiAoIGNvcHlpbigoaW50KXJicC0+RGF0YVAsKChjYWRkcl90KShwLT5SSU9Cb290UGFja2V0cykpK29mZnNldCwKKwkJCQlyYnAtPkNvdW50KSA9PUNPUFlGQUlMICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJCYWQgZGF0YSBjb3B5IGZyb20gdXNlciBzcGFjZVxuIik7CisJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJLyogcmVzdG9yZShvbGRzcGwpOyAqLworCQlmdW5jX2V4aXQgKCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qCisJKiogTWFrZSBzdXJlIHRoYXQgb3VyIGNvcHkgb2YgdGhlIHNpemUgaW5jbHVkZXMgdGhhdCBvZmZzZXQgd2UgZGlzY3Vzc2VkCisJKiogZWFybGllci4KKwkqLworCXAtPlJJT051bUJvb3RQa3RzID0gKHJicC0+Q291bnQrb2Zmc2V0KS9SVEFfQk9PVF9EQVRBX1NJWkU7CisJcC0+UklPQm9vdENvdW50ICAgPSByYnAtPkNvdW50OworCisJLyogcmVzdG9yZShvbGRzcGwpOyAqLworCWZ1bmNfZXhpdCgpOworCXJldHVybiAwOworfQorCit2b2lkIHJpb19zdGFydF9jYXJkX3J1bm5pbmcgKHN0cnVjdCBIb3N0ICogSG9zdFApCit7CisJZnVuY19lbnRlciAoKTsKKworCXN3aXRjaCAoIEhvc3RQLT5UeXBlICkgeworCWNhc2UgUklPX0FUOgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJTdGFydCBJU0EgY2FyZCBydW5uaW5nXG4iKTsKKwkJV0JZVEUoSG9zdFAtPkNvbnRyb2wsIAorCQkgICAgICBCT09UX0ZST01fUkFNIHwgRVhURVJOQUxfQlVTX09OCisJCSAgICAgIHwgSG9zdFAtPk1vZGUKKwkJICAgICAgfCBSSU9BdFZlYzJDdHJsW0hvc3RQLT5JdmVjICYgMHhGXSApOworCQlicmVhazsKKwkJCisjaWZkZWYgRlVUVVJFX1JFTEVBU0UKKwljYXNlIFJJT19NQ0E6CisJCQkJLyoKKwkJCQkqKiBNQ0EgaGFuZGxlcyBJUlEgdmVjdG9ycyBkaWZmZXJlbnRseSwgc28gd2UgZG9uJ3Qgd3JpdGUgCisJCQkJKiogdGhlbSB0byB0aGlzIHJlZ2lzdGVyLgorCQkJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlN0YXJ0IE1DQSBjYXJkIHJ1bm5pbmdcbiIpOworCQlXQllURShIb3N0UC0+Q29udHJvbCwgTWNhVHBCb290RnJvbVJhbSB8IE1jYVRwQnVzRW5hYmxlIHwgSG9zdFAtPk1vZGUpOworCQlicmVhazsKKworCWNhc2UgUklPX0VJU0E6CisJCQkJLyoKKwkJCQkqKiBFSVNBIGlzIHRvdGFsbHkgZGlmZmVyZW50IGFuZCBleHBlY3RzIE9VVEJacyB0byB0dXJuIGl0IG9uLgorCQkJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlN0YXJ0IEVJU0EgY2FyZCBydW5uaW5nXG4iKTsKKwkJT1VUQlooIEhvc3RQLT5TbG90LCBFSVNBX0NPTlRST0xfUE9SVCwgSG9zdFAtPk1vZGUgfCBSSU9FaXNhVmVjMkN0cmxbSG9zdFAtPkl2ZWNdIHwgRUlTQV9UUF9SVU4gfCBFSVNBX1RQX0JVU19FTkFCTEUgfCBFSVNBX1RQX0JPT1RfRlJPTV9SQU0gKTsKKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgUklPX1BDSToKKwkJCQkvKgorCQkJCSoqIFBDSSBpcyBtdWNoIHRoZSBzYW1lIGFzIE1DQS4gRXZlcnl0aGluZyBpcyBvbmNlIGFnYWluIG1lbW9yeQorCQkJCSoqIG1hcHBlZCwgc28gd2UgYXJlIHdyaXRpbmcgdG8gbWVtb3J5IHJlZ2lzdGVycyBpbnN0ZWFkIG9mIGlvCisJCQkJKiogcG9ydHMuCisJCQkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiU3RhcnQgUENJIGNhcmQgcnVubmluZ1xuIik7CisJCVdCWVRFKEhvc3RQLT5Db250cm9sLCBQQ0lUcEJvb3RGcm9tUmFtIHwgUENJVHBCdXNFbmFibGUgfCBIb3N0UC0+TW9kZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlVua25vd24gaG9zdCB0eXBlICVkXG4iLCBIb3N0UC0+VHlwZSk7CisJCWJyZWFrOworCX0KKy8qIAorCXByaW50ayAoS0VSTl9JTkZPICJEb25lIHdpdGggc3RhcnRpbmcgdGhlIGNhcmRcbiIpOworCWZ1bmNfZXhpdCAoKTsKKyovCisJcmV0dXJuOworfQorCisvKgorKiogTG9hZCBpbiB0aGUgaG9zdCBib290IGNvZGUgLSBsb2FkIGl0IGRpcmVjdGx5IG9udG8gYWxsIGhhbHRlZCBob3N0cworKiogb2YgdGhlIGNvcnJlY3QgdHlwZS4KKyoqCisqKiBQdXQgeW91ciBydWJiZXIgcGFudHMgb24gYmVmb3JlIG1lc3Npbmcgd2l0aCB0aGlzIGNvZGUgLSBldmVuIHRoZSBtYWdpYworKiogbnVtYmVycyBoYXZlIHRyb3VibGUgdW5kZXJzdGFuZGluZyB3aGF0IHRoZXkgYXJlIGRvaW5nIGhlcmUuCisqLworaW50CitSSU9Cb290Q29kZUhPU1QocCwgcmJwKQorc3RydWN0IHJpb19pbmZvICoJcDsKK3JlZ2lzdGVyIHN0cnVjdCBEb3duTG9hZCAqcmJwOworeworCXJlZ2lzdGVyIHN0cnVjdCBIb3N0ICpIb3N0UDsKKwlyZWdpc3RlciBjYWRkcl90IENhZDsKKwlyZWdpc3RlciBQQVJNX01BUCAqUGFybU1hcFA7CisJcmVnaXN0ZXIgaW50IFJ1cE47CisJaW50IFBvcnROOworCXVpbnQgaG9zdDsKKwljYWRkcl90IFN0YXJ0UDsKKwlCWVRFICpEZXN0UDsKKwlpbnQgd2FpdF9jb3VudDsKKwl1c2hvcnQgT2xkUGFybU1hcDsKKwl1c2hvcnQgb2Zmc2V0OwkvKiBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHRoaXMgaXMgYSB1c2hvcnQgKi8KKwkvKiB1aW50IGJ5dGU7ICovCisJY2FkZHJfdCBEb3duQ29kZSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUhvc3RQID0gTlVMTDsgLyogQXNzdXJlIHRoZSBjb21waWxlciB3ZSd2ZSBpbml0aWFsaXplZCBpdCAqLworCWZvciAoIGhvc3Q9MDsgaG9zdDxwLT5SSU9OdW1Ib3N0czsgaG9zdCsrICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJBdHRlbXB0IHRvIGJvb3QgaG9zdCAlZFxuIixob3N0KTsKKwkJSG9zdFAgPSAmcC0+UklPSG9zdHNbaG9zdF07CisJCQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICAiSG9zdCBUeXBlID0gMHgleCwgTW9kZSA9IDB4JXgsIElWZWMgPSAweCV4XG4iLAorCQkgICAgSG9zdFAtPlR5cGUsIEhvc3RQLT5Nb2RlLCBIb3N0UC0+SXZlYyk7CisKKworCQlpZiAoIChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1dBSVRJTkcgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICIlcyAlZCBhbHJlYWR5IHJ1bm5pbmdcbiIsIkhvc3QiLGhvc3QpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkqKiBHcmFiIGEgMzIgYml0IHBvaW50ZXIgdG8gdGhlIGNhcmQuCisJCSovCisJCUNhZCA9IEhvc3RQLT5DYWRkcjsKKworCQkvKgorCQkqKiBXZSBhcmUgZ29pbmcgdG8gKHRyeSkgYW5kIGxvYWQgaW4gcmJwLT5Db3VudCBieXRlcy4KKwkJKiogVGhlIGxhc3QgYnl0ZSB3aWxsIHJlc2lkZSBhdCBwLT5SSU9Db25mLkhvc3RMb2FkQmFzZS0xOworCQkqKiBUaGVyZWZvcmUsIHdlIG5lZWQgdG8gc3RhcnQgY29weWluZyBhdCBhZGRyZXNzCisJCSoqIChjYWRkcitwLT5SSU9Db25mLkhvc3RMb2FkQmFzZS1yYnAtPkNvdW50KQorCQkqLworCQlTdGFydFAgPSAoY2FkZHJfdCkmQ2FkW3AtPlJJT0NvbmYuSG9zdExvYWRCYXNlLXJicC0+Q291bnRdOworCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgImtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgZm9yIGhvc3QgaXMgMHgleFxuIiwgKGludClDYWQgKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAia2VybmVsIHZpcnR1YWwgYWRkcmVzcyBmb3IgZG93bmxvYWQgaXMgMHgleFxuIiwgKGludClTdGFydFApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJob3N0IGxvYWRiYXNlIGlzIDB4JXhcbiIscC0+UklPQ29uZi5Ib3N0TG9hZEJhc2UpOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJzaXplIG9mIGRvd25sb2FkIGlzIDB4JXhcbiIsIHJicC0+Q291bnQpOworCisJCWlmICggcC0+UklPQ29uZi5Ib3N0TG9hZEJhc2UgPCByYnAtPkNvdW50ICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQmluIHRvbyBsYXJnZVxuIik7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfRklMRV9UT09fTEFSR0U7CisJCQlmdW5jX2V4aXQgKCk7CisJCQlyZXR1cm4gLUVGQklHOworCQl9CisJCS8qCisJCSoqIEVuc3VyZSB0aGF0IHRoZSBob3N0IHJlYWxseSBpcyBzdG9wcGVkLgorCQkqKiBEaXNhYmxlIGl0J3MgZXh0ZXJuYWwgYnVzICYgdHdhbmcgaXRzIHJlc2V0IGxpbmUuCisJCSovCisJCVJJT0hvc3RSZXNldCggSG9zdFAtPlR5cGUsIChzdHJ1Y3QgRHBSYW0gKilIb3N0UC0+Q2FyZFAsIEhvc3RQLT5TbG90ICk7CisKKwkJLyoKKwkJKiogQ29weSB0aGUgZGF0YSBkaXJlY3RseSBmcm9tIHVzZXIgc3BhY2UgdG8gdGhlIFNSQU0uCisJCSoqIFRoaXMgYWluJ3QgZ29pbmcgdG8gYmUgbm9uZSB0b28gY2xldmVyIGlmIHRoZSBkb3dubG9hZAorCQkqKiBjb2RlIGlzIGJpZ2dlciB0aGFuIHRoaXMgc2VnbWVudC4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQ29weSBpbiBjb2RlXG4iKTsKKworCQkvKgorCQkqKiBQQ0kgaG9zdGNhcmQgY2FuJ3QgY29wZSB3aXRoIDMyIGJpdCBhY2Nlc3NlcyBhbmQgc28gbmVlZCB0byBjb3B5IAorCQkqKiBkYXRhIHRvIGEgbG9jYWwgYnVmZmVyLCBhbmQgdGhlbiBkcmlwZmVlZCB0aGUgY2FyZC4KKwkJKi8KKwkJaWYgKCBIb3N0UC0+VHlwZSA9PSBSSU9fUENJICkgeworCQkgIC8qIGludCBvZmZzZXQ7ICovCisKKwkJCURvd25Db2RlID0gc3lzYnJrKHJicC0+Q291bnQpOworCQkJaWYgKCAhRG93bkNvZGUgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiTm8gc3lzdGVtIG1lbW9yeSBhdmFpbGFibGVcbiIpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX0VOT1VHSF9DT1JFX0ZPUl9QQ0lfQ09QWTsKKwkJCQlmdW5jX2V4aXQgKCk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQliemVybyhEb3duQ29kZSwgcmJwLT5Db3VudCk7CisKKwkJCWlmICggY29weWluKChpbnQpcmJwLT5EYXRhUCxEb3duQ29kZSxyYnAtPkNvdW50KT09Q09QWUZBSUwgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQmFkIGNvcHlpbiBvZiBob3N0IGRhdGFcbiIpOworCQkJCXN5c2ZyZWUoIERvd25Db2RlLCByYnAtPkNvdW50ICk7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCWZ1bmNfZXhpdCAoKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKworCQkJSG9zdFAtPkNvcHkoIERvd25Db2RlLCBTdGFydFAsIHJicC0+Q291bnQgKTsKKworCQkJc3lzZnJlZSggRG93bkNvZGUsIHJicC0+Q291bnQgKTsKKwkJfQorCQllbHNlIGlmICggY29weWluKChpbnQpcmJwLT5EYXRhUCxTdGFydFAscmJwLT5Db3VudCk9PUNPUFlGQUlMICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQmFkIGNvcHlpbiBvZiBob3N0IGRhdGFcbiIpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJZnVuY19leGl0ICgpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJDb3B5IGNvbXBsZXRlZFxuIik7CisKKwkJLyoKKwkJKioJCQlTIFQgTyBQICEKKwkJKioKKwkJKiogVXB0byB0aGlzIHBvaW50IHRoZSBjb2RlIGhhcyBiZWVuIGZhaXJseSByYXRpb25hbCwgYW5kIHBvc3NpYmx5CisJCSoqIGV2ZW4gc3RyYWlnaHQgZm9yd2FyZC4gV2hhdCBmb2xsb3dzIGlzIGEgcGlsZSBvZiBjcnVkIHRoYXQgd2lsbAorCQkqKiBtYWdpY2FsbHkgdHVybiBpbnRvIHNpeCBieXRlcyBvZiB0cmFuc3B1dGVyIGFzc2VtYmxlci4gTm9ybWFsbHkKKwkJKiogeW91IHdvdWxkIGV4cGVjdCBhbiBhcnJheSBvciBzb21ldGhpbmcsIGJ1dCwgYmVpbmcgbWUsIEkgaGF2ZQorCQkqKiBjaG9zZW4gW2JlZW4gdG9sZF0gdG8gdXNlIGEgdGVjaG5pcXVlIHdoZXJlYnkgdGhlIHN0YXJ0dXAgY29kZQorCQkqKiB3aWxsIGJlIGNvcnJlY3QgaWYgd2UgY2hhbmdlIHRoZSBsb2FkYmFzZSBmb3IgdGhlIGNvZGUuIFdoaWNoCisJCSoqIGJyaW5ncyB1cyBvbnRvIGFub3RoZXIgaXNzdWUgLSB0aGUgbG9hZGJhc2UgaXMgdGhlICplbmQqIG9mIHRoZQorCQkqKiBjb2RlLCBub3QgdGhlIHN0YXJ0LgorCQkqKgorCQkqKiBJZiBJIHdlcmUgeW91IEkgd291bGRuJ3Qgc3RhcnQgZnJvbSBoZXJlLgorCQkqLworCisJCS8qCisJCSoqIFdlIG5vdyBuZWVkIHRvIGluc2VydCBhIHNob3J0IGJvb3Qgc2VjdGlvbiBpbnRvCisJCSoqIHRoZSBtZW1vcnkgYXQgdGhlIGVuZCBvZiBTcmFtMi4gVGhpcyBpcyBub3JtYWxseSAoZGUpY29tcG9zZWQKKwkJKiogb2YgdGhlIGxhc3QgZWlnaHQgYnl0ZXMgb2YgdGhlIGRvd25sb2FkIGNvZGUuIFRoZQorCQkqKiBkb3dubG9hZCBoYXMgYmVlbiBhc3NlbWJsZWQvY29tcGlsZWQgdG8gZXhwZWN0IHRvIGJlCisJCSoqIGxvYWRlZCBmcm9tIDB4N0ZGRiBkb3dud2FyZHMuIFdlIGhhdmUgbG9hZGVkIGl0CisJCSoqIGF0IHNvbWUgb3RoZXIgYWRkcmVzcy4gVGhlIHN0YXJ0dXAgY29kZSBnb2VzIGludG8gdGhlIHNtYWxsCisJCSoqIHJhbSB3aW5kb3cgYXQgU3JhbTIsIGluIHRoZSBsYXN0IDggYnl0ZXMsIHdoaWNoIGFyZSByZWFsbHkKKwkJKiogYXQgYWRkcmVzc2VzIDB4N0ZGOC0weDdGRkYuCisJCSoqCisJCSoqIElmIHRoZSBsb2FkYmFzZSBpcywgc2F5LCAweDdDMDAsIHRoZW4gd2UgbmVlZCB0byBicmFuY2ggdG8KKwkJKiogYWRkcmVzcyAweDdCRkUgdG8gcnVuIHRoZSBob3N0LmJpbiBzdGFydHVwIGNvZGUuIFdlIGFzc2VtYmxlCisJCSoqIHRoaXMganVtcCBtYW51YWxseS4KKwkJKioKKwkJKiogVGhlIHR3byBieXRlIHNlcXVlbmNlIDYwIDA4IGlzIGxvYWRlZCBpbnRvIG1lbW9yeSBhdCBhZGRyZXNzCisJCSoqIDB4N0ZGRSxGLiBUaGlzIGlzIGEgbG9jYWwgYnJhbmNoIHRvIGxvY2F0aW9uIDB4N0ZGOCAoNjAgaXMgbmZpeCAwLAorCQkqKiB3aGljaCBhZGRzICcwJyB0byB0aGUgLk8gcmVnaXN0ZXIsIGNvbXBsZW1lbnRzIC5PLCBhbmQgdGhlbiBzaGlmdHMKKwkJKiogaXQgbGVmdCBieSA0IGJpdCBwb3NpdGlvbnMsIDA4IGlzIGEganVtcCAuTys4IGluc3RydWN0aW9uLiBUaGlzIHdpbGwKKwkJKiogYWRkIDggdG8gLk8gKHdoaWNoIHdhcyAweEZGRjApLCBhbmQgd2lsbCBicmFuY2ggUkVMQVRJVkUgdG8gdGhlIG5ldworCQkqKiBsb2NhdGlvbi4gTm93LCB0aGUgYnJhbmNoIHN0YXJ0cyBmcm9tIHRoZSB2YWx1ZSBvZiAuUEMgKG9yIC5JUCBvcgorCQkqKiB3aGF0ZXZlciB0aGUgYmxvb2R5IHJlZ2lzdGVyIGlzIGNhbGxlZCBvbiB0aGlzIGNoaXApLCBhbmQgdGhlIC5QQworCQkqKiB3aWxsIGJlIHBvaW50aW5nIHRvIHRoZSBsb2NhdGlvbiBBRlRFUiB0aGUgYnJhbmNoLCBpbiB0aGlzIGNhc2UKKwkJKiogLlBDID09IDB4ODAwMCwgc28gdGhlIGJyYW5jaCB3aWxsIGJlIHRvIDB4ODAwMCsweEZGRjggPSAweDdGRjguCisJCSoqCisJCSoqIEEgbG9uZyBicmFuY2ggaXMgY29kZWQgYXQgMHg3RkY4LiBUaGlzIGNvbnNpc3RzIG9mIGxvYWRpbmcgYSBmb3VyCisJCSoqIGJ5dGUgb2Zmc2V0IGludG8gLk8gdXNpbmcgbmZpeCAoYXMgYWJvdmUpIGFuZCBwZml4IG9wZXJhdG9ycy4gVGhlCisJCSoqIHBmaXggb3BlcmF0ZXMgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgdGhlIG5maXggb3BlcmF0b3IsIGJ1dAorCQkqKiB3aXRob3V0IHRoZSBjb21wbGVtZW50IG9wZXJhdGlvbi4gVGhlIG9mZnNldCwgb2YgY291cnNlLCBtdXN0IGJlCisJCSoqIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBieXRlIEFGVEVSIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24sCisJCSoqIHdoaWNoIHdpbGwgYmUgKHVybSkgMHg3RkZDLCBzbywgb3VyIGZpbmFsIGRlc3RpbmF0aW9uIG9mIHRoZSBicmFuY2gKKwkJKiogKGxvYWRiYXNlLTIpLCBoYXMgdG8gYmUgcmVhY2hlZCBmcm9tIGhlcmUuIEltYWdpbmUgdGhhdCB0aGUgbG9hZGJhc2UKKwkJKiogaXMgMHg3QzAwICh3aGljaCBpdCBpcyksIHRoZW4gd2Ugd2lsbCBuZWVkIHRvIGJyYW5jaCB0byAweDdCRkUgKHdoaWNoCisJCSoqIGlzIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBpbml0aWFsIHR3byBieXRlIHNob3J0IGxvY2FsIGJyYW5jaCBvZiB0aGUKKwkJKiogZG93bmxvYWQgY29kZSkuCisJCSoqCisJCSoqIFRvIGNvZGUgYSBqdW1wIGZyb20gMHg3RkZDICh3aGljaCBpcyB3aGVyZSB0aGUgYnJhbmNoIHdpbGwgc3RhcnQKKwkJKiogZnJvbSkgdG8gMHg3QkZFLCB3ZSB3aWxsIG5lZWQgdG8gYnJhbmNoIDB4RkMwMiBieXRlcyAoMHg3RkZDKzB4RkMwMik9CisJCSoqIDB4N0JGRS4KKwkJKiogVGhpcyB3aWxsIGJlIGNvZGVkIGFzIGZvdXIgYnl0ZXM6CisJCSoqIDYwIDJDIDIwIDAyCisJCSoqIGJlaW5nIG5maXggLk8rMAorCQkqKgkgICBwZml4IC5PK0MKKwkJKioJICAgcGZpeCAuTyswCisJCSoqCSAgIGp1bXAgLk8rMgorCQkqKgorCQkqKiBUaGUgbmZpeCBvcGVyYXRvciBpcyB1c2VkLCBzbyB0aGF0IHRoZSBzdGFydHVwIGNvZGUgd2lsbCBiZQorCQkqKiBjb21wYXRpYmxlIHdpdGggdGhlIHdob2xlIFRwIGZhbWlseS4gKGxpZXMsIGRhbW4gbGllcywgaXQnbGwgbmV2ZXIKKwkJKiogd29yayBpbiBhIG1vbnRoIG9mIFN1bmRheXMpLgorCQkqKgorCQkqKiBUaGUgbmZpeCBueWJsZSBpcyB0aGUgMXMgY29tcGxlbWVudCBvZiB0aGUgbnlibGUgdmFsdWUgeW91CisJCSoqIHdhbnQgdG8gbG9hZCAtIGluIHRoaXMgY2FzZSB3ZSB3YW50ZWQgJ0YnIHNvIHdlIG5maXggbG9hZGVkICcwJy4KKwkJKi8KKworCisJCS8qCisJCSoqIERlc3QgcG9pbnRzIHRvIHRoZSB0b3AgOCBieXRlcyBvZiBTcmFtMi4gVGhlIFRwIGp1bXBzCisJCSoqIHRvIDB4N0ZGRSBhdCByZXNldCB0aW1lLCBhbmQgc3RhcnRzIGV4ZWN1dGluZy4gVGhpcyBpcworCQkqKiBhIHNob3J0IGJyYW5jaCB0byAweDdGRjgsIHdoZXJlIGEgbG9uZyBicmFuY2ggaXMgY29kZWQuCisJCSovCisKKwkJRGVzdFAgPSAoQllURSAqKSZDYWRbMHg3RkY4XTsJLyogPDw8LS0tLSBSRUFEIFRIRSBBQk9WRSBDT01NRU5UUyAqLworCisjZGVmaW5lCU5GSVgoTikJKDB4NjAgfCAoTikpCS8qIC5PICA9ICh+KC5PICsgTikpPDw0ICovCisjZGVmaW5lCVBGSVgoTikJKDB4MjAgfCAoTikpCS8qIC5PICA9ICAgKC5PICsgTik8PDQgICovCisjZGVmaW5lCUpVTVAoTikJKDB4MDAgfCAoTikpCS8qIC5QQyA9ICAgLlBDICsgLk8JICovCisKKwkJLyoKKwkJKiogMHg3RkZDIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbiBmb2xsb3dpbmcgdGhlIGxhc3QgYnl0ZSBvZgorCQkqKiB0aGUgZm91ciBieXRlIGp1bXAgaW5zdHJ1Y3Rpb24uCisJCSoqIFJFQUQgVEhFIEFCT1ZFIENPTU1FTlRTCisJCSoqCisJCSoqIG9mZnNldCBpcyAoVE8tRlJPTSkgJSBNRU1TSVpFLCBidXQgd2l0aCBjb21wb3VuZCBidWdnZXJpbmcgYWJvdXQuCisJCSoqIE1lbXNpemUgaXMgNjRLIGZvciB0aGlzIHJhbmdlIG9mIFRwLCBzbyBvZmZzZXQgaXMgYSBzaG9ydCAodW5zaWduZWQsCisJCSoqIGNvcyBJIGRvbid0IHVuZGVyc3RhbmQgMidzIGNvbXBsZW1lbnQpLgorCQkqLworCQlvZmZzZXQgPSAocC0+UklPQ29uZi5Ib3N0TG9hZEJhc2UtMiktMHg3RkZDOworCQlXQllURSggRGVzdFBbMF0gLCBORklYKCgodXNob3J0KSh+b2Zmc2V0KSA+PiAodXNob3J0KTEyKSAmIDB4RikgKTsKKwkJV0JZVEUoIERlc3RQWzFdICwgUEZJWCgoIG9mZnNldCA+PiA4KSAmIDB4RikgKTsKKwkJV0JZVEUoIERlc3RQWzJdICwgUEZJWCgoIG9mZnNldCA+PiA0KSAmIDB4RikgKTsKKwkJV0JZVEUoIERlc3RQWzNdICwgSlVNUCggb2Zmc2V0ICYgMHhGKSApOworCisJCVdCWVRFKCBEZXN0UFs2XSAsIE5GSVgoMCkgKTsKKwkJV0JZVEUoIERlc3RQWzddICwgSlVNUCg4KSApOworCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgImhvc3QgbG9hZGJhc2UgaXMgMHgleFxuIixwLT5SSU9Db25mLkhvc3RMb2FkQmFzZSk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgInN0YXJ0dXAgb2Zmc2V0IGlzIDB4JXhcbiIsb2Zmc2V0KTsKKworCQkvKgorCQkqKiBGbGFnIHdoYXQgaXMgZ29pbmcgb24KKwkJKi8KKwkJSG9zdFAtPkZsYWdzICY9IH5SVU5fU1RBVEU7CisJCUhvc3RQLT5GbGFncyB8PSBSQ19TVEFSVFVQOworCisJCS8qCisJCSoqIEdyYWIgYSBjb3B5IG9mIHRoZSBjdXJyZW50IFBhcm1NYXAgcG9pbnRlciwgc28gd2UKKwkJKiogY2FuIHRlbGwgd2hlbiBpdCBoYXMgY2hhbmdlZC4KKwkJKi8KKwkJT2xkUGFybU1hcCA9IFJXT1JEKEhvc3RQLT5fX1Bhcm1NYXBSKTsKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJPcmlnaW5hbCBwYXJtbWFwIGlzIDB4JXhcbiIsT2xkUGFybU1hcCk7CisKKwkJLyoKKwkJKiogQW5kIHN0YXJ0IGl0IHJ1bm5pbmcgKEkgaG9wZSkuCisJCSoqIEFzIHRoZXJlIGlzIG5vdGhpbmcgZG9kZ3kgb3Igb2JzY3VyZSBhYm91dCB0aGUKKwkJKiogYWJvdmUgY29kZSwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIHdvcmsgZXZlcnkgdGltZS4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAgIkhvc3QgVHlwZSA9IDB4JXgsIE1vZGUgPSAweCV4LCBJVmVjID0gMHgleFxuIiwKKwkJICAgIEhvc3RQLT5UeXBlLCBIb3N0UC0+TW9kZSwgSG9zdFAtPkl2ZWMpOworCisJCXJpb19zdGFydF9jYXJkX3J1bm5pbmcoSG9zdFApOworCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlNldCBjb250cm9sIHBvcnRcbiIpOworCisJCS8qCisJCSoqIE5vdywgd2FpdCBmb3IgdXB0byBmaXZlIHNlY29uZHMgZm9yIHRoZSBUcCB0byBzZXR1cCB0aGUgcGFybW1hcAorCQkqKiBwb2ludGVyOgorCQkqLworCQlmb3IgKCB3YWl0X2NvdW50PTA7ICh3YWl0X2NvdW50PHAtPlJJT0NvbmYuU3RhcnR1cFRpbWUpJiYKKwkJCShSV09SRChIb3N0UC0+X19QYXJtTWFwUik9PU9sZFBhcm1NYXApOyB3YWl0X2NvdW50KysgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJDaGVja291dCAlZCwgMHgleFxuIix3YWl0X2NvdW50LFJXT1JEKEhvc3RQLT5fX1Bhcm1NYXBSKSk7CisJCQlkZWxheShIb3N0UCwgSFVORFJFRF9NUyk7CisKKwkJfQorCisJCS8qCisJCSoqIElmIHRoZSBwYXJtbWFwIHBvaW50ZXIgaXMgdW5jaGFuZ2VkLCB0aGVuIHRoZSBob3N0IGNvZGUKKwkJKiogaGFzIGNyYXNoZWQgJiBidXJuZWQgaW4gYSByZWFsbHkgc3BlY3RhY3VsYXIgd2F5CisJCSovCisJCWlmICggUldPUkQoSG9zdFAtPl9fUGFybU1hcFIpID09IE9sZFBhcm1NYXAgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJwYXJtbWFwIDB4JXhcbiIsIFJXT1JEKEhvc3RQLT5fX1Bhcm1NYXBSKSk7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSSU8gTWVzZyBSdW4gRmFpbFxuIik7CisKKyNkZWZpbmUJSE9TVF9ESVNBQkxFIFwKKwkJSG9zdFAtPkZsYWdzICY9IH5SVU5fU1RBVEU7IFwKKwkJSG9zdFAtPkZsYWdzIHw9IFJDX1NUVUZGRUQ7IFwKKwkJUklPSG9zdFJlc2V0KCBIb3N0UC0+VHlwZSwgKHN0cnVjdCBEcFJhbSAqKUhvc3RQLT5DYXJkUCwgSG9zdFAtPlNsb3QgKTtcCisJCWNvbnRpbnVlCisKKwkJCUhPU1RfRElTQUJMRTsKKwkJfQorCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJ1bm5pbmcgMHgleFxuIiwgUldPUkQoSG9zdFAtPl9fUGFybU1hcFIpKTsKKworCQkvKgorCQkqKiBXZWxsLCB0aGUgYm9hcmQgdGhvdWdodCBpdCB3YXMgT0ssIGFuZCBzZXR1cCBpdHMgcGFybW1hcAorCQkqKiBwb2ludGVyLiBGb3IgdGhlIHRpbWUgYmVpbmcsIHdlIHdpbGwgcHJldGVuZCB0aGF0IHRoaXMKKwkJKiogYm9hcmQgaXMgcnVubmluZywgYW5kIGNoZWNrIG91dCB3aGF0IHRoZSBlcnJvciBmbGFnIHNheXMuCisJCSovCisKKwkJLyoKKwkJKiogR3JhYiBhIDMyIGJpdCBwb2ludGVyIHRvIHRoZSBwYXJtbWFwIHN0cnVjdHVyZQorCQkqLworCQlQYXJtTWFwUCA9IChQQVJNX01BUCAqKVJJT19QVFIoQ2FkLFJXT1JEKEhvc3RQLT5fX1Bhcm1NYXBSKSk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlBhcm1NYXBQIDogJXhcbiIsIChpbnQpUGFybU1hcFApOworCQlQYXJtTWFwUCA9IChQQVJNX01BUCAqKSgodW5zaWduZWQgbG9uZylDYWQgKyAKKwkJCQkJCSh1bnNpZ25lZCBsb25nKSgoUldPUkQoKEhvc3RQLT5fX1Bhcm1NYXBSKSkpICYgMHhGRkZGKSk7IAorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJQYXJtTWFwUCA6ICV4XG4iLCAoaW50KVBhcm1NYXBQKTsKKworCQkvKgorCQkqKiBUaGUgbGlua3MgZW50cnkgc2hvdWxkIGJlIDB4RkZGRjsgd2Ugc2V0IGl0IHVwCisJCSoqIHdpdGggYSBtYXNrIHRvIHNheSBob3cgbWFueSBQSEJzIHRvIHVzZSwgYW5kIAorCQkqKiB3aGljaCBsaW5rcyB0byB1c2UuCisJCSovCisJCWlmICggKFJXT1JEKFBhcm1NYXBQLT5saW5rcykgJiAweEZGRkYpICE9IDB4RkZGRiApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJJTyBNZXNnIFJ1biBGYWlsICVzXG4iLCBIb3N0UC0+TmFtZSk7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJMaW5rcyA9IDB4JXhcbiIsUldPUkQoUGFybU1hcFAtPmxpbmtzKSk7CisJCQlIT1NUX0RJU0FCTEU7CisJCX0KKworCQlXV09SRChQYXJtTWFwUC0+bGlua3MgLCBSSU9fTElOS19FTkFCTEUpOworCisJCS8qCisJCSoqIG5vdyB3YWl0IGZvciB0aGUgY2FyZCB0byBzZXQgYWxsIHRoZSBwYXJtbWFwLT5YWFggc3R1ZmYKKwkJKiogdGhpcyBpcyBhIHdhaXQgb2YgdXB0byB0d28gc2Vjb25kcy4uLi4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiTG9va2luZyBmb3IgaW5pdF9kb25lIC0gJWQgdGlja3NcbiIscC0+UklPQ29uZi5TdGFydHVwVGltZSk7CisJCUhvc3RQLT50aW1lb3V0X2lkID0gMDsKKwkJZm9yICggd2FpdF9jb3VudD0wOyAod2FpdF9jb3VudDxwLT5SSU9Db25mLlN0YXJ0dXBUaW1lKSAmJiAKKwkJCQkJCSFSV09SRChQYXJtTWFwUC0+aW5pdF9kb25lKTsgd2FpdF9jb3VudCsrICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiV2FpdGluZyBmb3IgaW5pdF9kb25lXG4iKTsKKwkJCWRlbGF5KEhvc3RQLCBIVU5EUkVEX01TKTsKKwkJfQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJPSyEgaW5pdF9kb25lIVxuIik7CisKKwkJaWYgKFJXT1JEKFBhcm1NYXBQLT5lcnJvcikgIT0gRV9OT19FUlJPUiB8fCAKKwkJCQkJCQkhUldPUkQoUGFybU1hcFAtPmluaXRfZG9uZSkgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSSU8gTWVzZyBSdW4gRmFpbCAlc1xuIiwgSG9zdFAtPk5hbWUpOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiVGltZWRvdXQgd2FpdGluZyBmb3IgaW5pdF9kb25lXG4iKTsKKwkJCUhPU1RfRElTQUJMRTsKKwkJfQorCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkdvdCBpbml0X2RvbmVcbiIpOworCisJCS8qCisJCSoqIEl0IHJ1bnMhIEl0IHJ1bnMhCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkhvc3QgSUQgJXggUnVubmluZ1xuIixIb3N0UC0+VW5pcXVlTnVtKTsKKworCQkvKgorCQkqKiBzZXQgdGhlIHRpbWUgcGVyaW9kIGJldHdlZW4gaW50ZXJydXB0cy4KKwkJKi8KKwkJV1dPUkQoUGFybU1hcFAtPnRpbWVyLCAoc2hvcnQpcC0+UklPQ29uZi5UaW1lciApOworCisJCS8qCisJCSoqIFRyYW5zbGF0ZSBhbGwgdGhlIDE2IGJpdCBwb2ludGVycyBpbiB0aGUgX19QYXJtTWFwUiBpbnRvCisJCSoqIDMyIGJpdCBwb2ludGVycyBmb3IgdGhlIGRyaXZlci4KKwkJKi8KKwkJSG9zdFAtPlBhcm1NYXBQCSA9CVBhcm1NYXBQOworCQlIb3N0UC0+UGhiUAkJID0JKFBIQiopUklPX1BUUihDYWQsUldPUkQoUGFybU1hcFAtPnBoYl9wdHIpKTsKKwkJSG9zdFAtPlJ1cFAJCSA9CShSVVAqKVJJT19QVFIoQ2FkLFJXT1JEKFBhcm1NYXBQLT5ydXBzKSk7CisJCUhvc3RQLT5QaGJOdW1QCSAgPSAodXNob3J0KilSSU9fUFRSKENhZCxSV09SRChQYXJtTWFwUC0+cGhiX251bV9wdHIpKTsKKwkJSG9zdFAtPkxpbmtTdHJQCSA9CShMUEIqKVJJT19QVFIoQ2FkLFJXT1JEKFBhcm1NYXBQLT5saW5rX3N0cl9wdHIpKTsKKworCQkvKgorCQkqKiBwb2ludCB0aGUgVW5peFJ1cHMgYXQgdGhlIHJlYWwgUnVwcworCQkqLworCQlmb3IgKCBSdXBOID0gMDsgUnVwTjxNQVhfUlVQOyBSdXBOKysgKSB7CisJCQlIb3N0UC0+VW5peFJ1cHNbUnVwTl0uUnVwUAkJPSAmSG9zdFAtPlJ1cFBbUnVwTl07CisJCQlIb3N0UC0+VW5peFJ1cHNbUnVwTl0uSWQJCSAgPSBSdXBOKzE7CisJCQlIb3N0UC0+VW5peFJ1cHNbUnVwTl0uQmFzZVN5c1BvcnQgPSBOT19QT1JUOworCQkJc3Bpbl9sb2NrX2luaXQoJkhvc3RQLT5Vbml4UnVwc1tSdXBOXS5SdXBMb2NrKTsKKwkJfQorCisJCWZvciAoIFJ1cE4gPSAwOyBSdXBOPExJTktTX1BFUl9VTklUOyBSdXBOKysgKSB7CisJCQlIb3N0UC0+VW5peFJ1cHNbUnVwTitNQVhfUlVQXS5SdXBQCT0gJkhvc3RQLT5MaW5rU3RyUFtSdXBOXS5ydXA7CisJCQlIb3N0UC0+VW5peFJ1cHNbUnVwTitNQVhfUlVQXS5JZCAgPSAwOworCQkJSG9zdFAtPlVuaXhSdXBzW1J1cE4rTUFYX1JVUF0uQmFzZVN5c1BvcnQgPSBOT19QT1JUOworCQkJc3Bpbl9sb2NrX2luaXQoJkhvc3RQLT5Vbml4UnVwc1tSdXBOK01BWF9SVVBdLlJ1cExvY2spOworCQl9CisKKwkJLyoKKwkJKiogcG9pbnQgdGhlIFBvcnRQLT5QaGJzIGF0IHRoZSByZWFsIFBoYnMKKwkJKi8KKwkJZm9yICggUG9ydE49cC0+UklPRmlyc3RQb3J0c01hcHBlZDsgCisJCQkJUG9ydE48cC0+UklPTGFzdFBvcnRzTWFwcGVkK1BPUlRTX1BFUl9SVEE7IFBvcnROKysgKSB7CisJCQlpZiAoIHAtPlJJT1BvcnRwW1BvcnROXS0+SG9zdFAgPT0gSG9zdFAgKSB7CisJCQkJc3RydWN0IFBvcnQgKlBvcnRQID0gcC0+UklPUG9ydHBbUG9ydE5dOworCQkJCXN0cnVjdCBQSEIgKlBoYlA7CisJCQkJLyogaW50IG9sZHNwbDsgKi8KKworCQkJCWlmICggIVBvcnRQLT5NYXBwZWQgKQorCQkJCQljb250aW51ZTsKKworCQkJCVBoYlAgPSAmSG9zdFAtPlBoYlBbUG9ydFAtPkhvc3RQb3J0XTsKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwkJCQlQb3J0UC0+UGhiUCA9IFBoYlA7CisKKwkJCQlQb3J0UC0+VHhBZGQJPSAoV09SRCAqKVJJT19QVFIoQ2FkLFJXT1JEKFBoYlAtPnR4X2FkZCkpOworCQkJCVBvcnRQLT5UeFN0YXJ0ICA9IChXT1JEICopUklPX1BUUihDYWQsUldPUkQoUGhiUC0+dHhfc3RhcnQpKTsKKwkJCQlQb3J0UC0+VHhFbmQJPSAoV09SRCAqKVJJT19QVFIoQ2FkLFJXT1JEKFBoYlAtPnR4X2VuZCkpOworCQkJCVBvcnRQLT5SeFJlbW92ZSA9IChXT1JEICopUklPX1BUUihDYWQsUldPUkQoUGhiUC0+cnhfcmVtb3ZlKSk7CisJCQkJUG9ydFAtPlJ4U3RhcnQgID0gKFdPUkQgKilSSU9fUFRSKENhZCxSV09SRChQaGJQLT5yeF9zdGFydCkpOworCQkJCVBvcnRQLT5SeEVuZAk9IChXT1JEICopUklPX1BUUihDYWQsUldPUkQoUGhiUC0+cnhfZW5kKSk7CisKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQkvKgorCQkJCSoqIHBvaW50IHRoZSBVbml4UnVwIGF0IHRoZSBiYXNlIFN5c1BvcnQKKwkJCQkqLworCQkJCWlmICggIShQb3J0TiAlIFBPUlRTX1BFUl9SVEEpICkKKwkJCQkJSG9zdFAtPlVuaXhSdXBzW1BvcnRQLT5SdXBOdW1dLkJhc2VTeXNQb3J0ID0gUG9ydE47CisJCQl9CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJTZXQgdGhlIGNhcmQgcnVubmluZy4uLiBcbiIpOworCQkvKgorCQkqKiBsYXN0IHRoaW5nIC0gc2hvdyB0aGUgd29ybGQgdGhhdCBldmVyeXRoaW5nIGlzIGluIHBsYWNlCisJCSovCisJCUhvc3RQLT5GbGFncyAmPSB+UlVOX1NUQVRFOworCQlIb3N0UC0+RmxhZ3MgfD0gUkNfUlVOTklORzsKKwl9CisJLyoKKwkqKiBNUFggYWx3YXlzIHVzZXMgYSBwb2xsZXIuIFRoaXMgaXMgYWN0dWFsbHkgcGF0Y2hlZCBpbnRvIHRoZSBzeXN0ZW0KKwkqKiBjb25maWd1cmF0aW9uIGFuZCBjYWxsZWQgZGlyZWN0bHkgZnJvbSBlYWNoIGNsb2NrIHRpY2suCisJKioKKwkqLworCXAtPlJJT1BvbGxpbmcgPSAxOworCisJcC0+UklPU3lzdGVtVXArKzsKKwkKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJEb25lIGV2ZXJ5dGhpbmcgJXhcbiIsIEhvc3RQLT5JdmVjKTsKKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIDA7Cit9CisKKworCisvKgorKiogQm9vdCBhbiBSVEEuIElmIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCB0aGlzIGJvb3QsIHRoZW4KKyoqIHJldHVybiAxLiBJZiB3ZSBoYXZlbnQsIHRoZW4gcmV0dXJuIDAuCisqLworaW50CitSSU9Cb290UnVwKCBwLCBSdXAsIEhvc3RQLCBQYWNrZXRQKQorc3RydWN0IHJpb19pbmZvICoJcDsKK3VpbnQgUnVwOworc3RydWN0IEhvc3QgKkhvc3RQOworc3RydWN0IFBLVCAqUGFja2V0UDsgCit7CisJc3RydWN0IFBrdENtZCAqUGt0Q21kUCA9IChzdHJ1Y3QgUGt0Q21kICopUGFja2V0UC0+ZGF0YTsKKwlzdHJ1Y3QgUGt0Q21kX00gKlBrdFJlcGx5UDsKKwlzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOworCXVpbnQgc2VxdWVuY2U7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdChIb3N0KTsKKwlDaGVja1J1cChSdXApOworCUNoZWNrSG9zdFAoSG9zdFApOworCUNoZWNrUGFja2V0UChQYWNrZXRQKTsKKyNlbmRpZgorCisJLyoKKwkqKiBJZiB3ZSBoYXZlbid0IGJlZW4gdG9sZCB3aGF0IHRvIGJvb3QsIHdlIGNhbid0IGJvb3QgaXQuCisJKi8KKwlpZiAoIHAtPlJJT051bUJvb3RQa3RzID09IDAgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIk5vIFJUQSBjb2RlIHRvIGRvd25sb2FkIHlldFxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIHJpb19kcHJpbnQoUklPX0RFQlVHX0JPT1QsIE5VTEwsREJHX0JPT1QsIkluY29taW5nIGNvbW1hbmQgcGFja2V0XG4iKTsgKi8KKwkvKiBTaG93UGFja2V0KCBEQkdfQk9PVCwgUGFja2V0UCApOyAqLworCisJLyoKKwkqKiBTcGVjaWFsIGNhc2Ugb2YgYm9vdCBjb21wbGV0ZWQgLSBpZiB3ZSBnZXQgb25lIG9mIHRoZXNlIHRoZW4gd2UKKwkqKiBkb24ndCBuZWVkIGEgY29tbWFuZCBibG9jay4gRm9yIGFsbCBvdGhlciBjYXNlcyB3ZSBkbywgc28gaGFuZGxlCisJKiogdGhpcyBmaXJzdCBhbmQgdGhlbiBnZXQgYSBjb21tYW5kIGJsb2NrLCB0aGVuIGhhbmRsZSBldmVyeSBvdGhlcgorCSoqIGNhc2UsIHJlbGlucXVpc2hpbmcgdGhlIGNvbW1hbmQgYmxvY2sgaWYgZGlzYXN0ZXIgc3RyaWtlcyEKKwkqLworCWlmICggKFJCWVRFKFBhY2tldFAtPmxlbikgJiBQS1RfQ01EX0JJVCkgJiYgCisJCQkoUkJZVEUoUGt0Q21kUC0+Q29tbWFuZCk9PUJPT1RfQ09NUExFVEVEKSApCisJCXJldHVybiBSSU9Cb290Q29tcGxldGUocCwgSG9zdFAsIFJ1cCwgUGt0Q21kUCApOworCisJLyoKKwkqKiB0cnkgdG8gdW5ob29rIGEgY29tbWFuZCBibG9jayBmcm9tIHRoZSBjb21tYW5kIGZyZWUgbGlzdC4KKwkqLworCWlmICggIShDbWRCbGtQID0gUklPR2V0Q21kQmxrKCkpICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJObyBjb21tYW5kIGJsb2NrcyB0byBib290IFJUQSEgY29tZSBiYWNrIGxhdGVyLlxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJKiogRmlsbCBpbiB0aGUgZGVmYXVsdCBpbmZvIG9uIHRoZSBjb21tYW5kIGJsb2NrCisJKi8KKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF91bml0ID0gUnVwIDwgKHVzaG9ydClNQVhfUlVQID8gUnVwIDogMDsKKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID0gQk9PVF9SVVA7CisJQ21kQmxrUC0+UGFja2V0LnNyY191bml0ICA9IDA7CisJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ICA9IEJPT1RfUlVQOworCisJQ21kQmxrUC0+UHJlRnVuY1AgPSBDbWRCbGtQLT5Qb3N0RnVuY1AgPSBOVUxMOworCVBrdFJlcGx5UCA9IChzdHJ1Y3QgUGt0Q21kX00gKilDbWRCbGtQLT5QYWNrZXQuZGF0YTsKKworCS8qCisJKiogcHJvY2VzcyBDT01NQU5EUyBvbiB0aGUgYm9vdCBydXAhCisJKi8KKwlpZiAoIFJCWVRFKFBhY2tldFAtPmxlbikgJiBQS1RfQ01EX0JJVCApIHsKKwkJLyoKKwkJKiogV2Ugb25seSBleHBlY3Qgb25lIHR5cGUgb2YgY29tbWFuZCAtIGEgQk9PVF9SRVFVRVNUIQorCQkqLworCQlpZiAoIFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpICE9IEJPT1RfUkVRVUVTVCApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlVuZXhwZWN0ZWQgY29tbWFuZCAlZCBvbiBCT09UIFJVUCAlZCBvZiBob3N0ICVkXG4iLCAKKwkJCQkJCVBrdENtZFAtPkNvbW1hbmQsUnVwLEhvc3RQLXAtPlJJT0hvc3RzKTsKKwkJCVNob3dQYWNrZXQoIERCR19CT09ULCBQYWNrZXRQICk7CisJCQlSSU9GcmVlQ21kQmxrKCBDbWRCbGtQICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8qCisJCSoqIEJ1aWxkIGEgQm9vdCBTZXF1ZW5jZSBjb21tYW5kIGJsb2NrCisJCSoqCisJCSoqIDAyLjAzLjE5OTkgQVJHIC0gRVNJTCAwODIwIGZpeAorCQkqKiBXZSBubyBsb25nZXIgbmVlZCB0byB1c2UgIkJvb3QgTW9kZSIsIHdlJ2xsIGFsd2F5cyBhbGxvdworCQkqKiBib290IHJlcXVlc3RzIC0gdGhlIGJvb3Qgd2lsbCBub3QgY29tcGxldGUgaWYgdGhlIGRldmljZQorCQkqKiBhcHBlYXJzIGluIHRoZSBiaW5kaW5ncyB0YWJsZS4KKwkJKiogU28sIHRoaXMgY29uZGl0aW9uYWwgaXMgbm90IHJlcXVpcmVkIC4uLgorCQkqKgorCQlpZiAocC0+UklPQm9vdE1vZGUgPT0gUkNfQk9PVF9OT05FKQorCQkJKioKKwkJCSoqIElmIHRoZSBzeXN0ZW0gaXMgaW4gc2xhdmUgbW9kZSwgYW5kIGEgYm9vdCByZXF1ZXN0IGlzCisJCQkqKiByZWNlaXZlZCwgc2V0IGNvbW1hbmQgdG8gQk9PVF9BQk9SVCBzbyB0aGF0IHRoZSBib290CisJCQkqKiB3aWxsIG5vdCBjb21wbGV0ZS4KKwkJCSoqCisJCQlQa3RSZXBseVAtPkNvbW1hbmQJCQkgPSBCT09UX0FCT1JUOworCQllbHNlCisJCSoqCisJCSoqIFdlJ2xsIGp1c3QgKGFsd2F5cykgc2V0IHRoZSBjb21tYW5kIGZpZWxkIGluIHBhY2tldCByZXBseQorCQkqKiB0byBhbGxvdyBhbiBhdHRlbXB0ZWQgYm9vdCBzZXF1ZW5jZSA6CisJCSovCisJCVBrdFJlcGx5UC0+Q29tbWFuZCA9IEJPT1RfU0VRVUVOQ0U7CisKKwkJUGt0UmVwbHlQLT5Cb290U2VxdWVuY2UuTnVtUGFja2V0cyA9IHAtPlJJT051bUJvb3RQa3RzOworCQlQa3RSZXBseVAtPkJvb3RTZXF1ZW5jZS5Mb2FkQmFzZSAgID0gcC0+UklPQ29uZi5SdGFMb2FkQmFzZTsKKwkJUGt0UmVwbHlQLT5Cb290U2VxdWVuY2UuQ29kZVNpemUgICA9IHAtPlJJT0Jvb3RDb3VudDsKKworCQlDbWRCbGtQLT5QYWNrZXQubGVuCQkJCT0gQk9PVF9TRVFVRU5DRV9MRU4gfCBQS1RfQ01EX0JJVDsKKworCQliY29weSgiQk9PVCIsKHZvaWQgKikmQ21kQmxrUC0+UGFja2V0LmRhdGFbQk9PVF9TRVFVRU5DRV9MRU5dLDQpOworCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkJvb3QgUlRBIG9uIEhvc3QgJWQgUnVwICVkIC0gJWQgKDB4JXgpIHBhY2tldHMgdG8gMHgleFxuIiwKKwkJCUhvc3RQLXAtPlJJT0hvc3RzLCBSdXAsIHAtPlJJT051bUJvb3RQa3RzLCBwLT5SSU9OdW1Cb290UGt0cywgCisJCQkJCQkJCXAtPlJJT0NvbmYuUnRhTG9hZEJhc2UpOworCisJCS8qCisJCSoqIElmIHRoaXMgaG9zdCBpcyBpbiBzbGF2ZSBtb2RlLCBzZW5kIHRoZSBSVEEgYW4gaW52YWxpZCBib290CisJCSoqIHNlcXVlbmNlIGNvbW1hbmQgYmxvY2sgdG8gZm9yY2UgaXQgdG8ga2lsbCB0aGUgYm9vdC4gV2Ugd2FpdAorCQkqKiBmb3IgaGFsZiBhIHNlY29uZCBiZWZvcmUgc2VuZGluZyB0aGlzIHBhY2tldCB0byBwcmV2ZW50IHRoZSBSVEEKKwkJKiogYXR0ZW1wdGluZyB0byBib290IHRvbyBvZnRlbi4gVGhlIG1hc3RlciBob3N0IHNob3VsZCB0aGVuIGdyYWIKKwkJKiogdGhlIFJUQSBhbmQgbWFrZSBpdCBpdHMgb3duLgorCQkqLworCQlwLT5SSU9Cb290aW5nKys7CisJCVJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgUnVwLCBDbWRCbGtQICk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJKiogSXQgaXMgYSByZXF1ZXN0IGZvciBib290IGRhdGEuCisJKi8KKwlzZXF1ZW5jZSA9IFJXT1JEKFBrdENtZFAtPlNlcXVlbmNlKTsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkJvb3QgYmxvY2sgJWQgb24gSG9zdCAlZCBSdXAlZFxuIixzZXF1ZW5jZSxIb3N0UC1wLT5SSU9Ib3N0cyxSdXApOworCisJaWYgKCBzZXF1ZW5jZSA+PSBwLT5SSU9OdW1Cb290UGt0cyApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiR290IGEgcmVxdWVzdCBmb3IgcGFja2V0ICVkLCBtYXggaXMgJWRcbiIsIHNlcXVlbmNlLCAKKwkJCQkJcC0+UklPTnVtQm9vdFBrdHMpOworCQlTaG93UGFja2V0KCBEQkdfQk9PVCwgUGFja2V0UCApOworCX0KKworCVBrdFJlcGx5UC0+U2VxdWVuY2UgPSBzZXF1ZW5jZTsKKworCWJjb3B5KCBwLT5SSU9Cb290UGFja2V0c1sgcC0+UklPTnVtQm9vdFBrdHMgLSBzZXF1ZW5jZSAtIDEgXSwgCisJCQkJUGt0UmVwbHlQLT5Cb290RGF0YSwgUlRBX0JPT1RfREFUQV9TSVpFICk7CisKKwlDbWRCbGtQLT5QYWNrZXQubGVuID0gUEtUX01BWF9EQVRBX0xFTjsKKwlTaG93UGFja2V0KCBEQkdfQk9PVCwgJkNtZEJsa1AtPlBhY2tldCApOworCVJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgUnVwLCBDbWRCbGtQICk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisqKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIFJUQSBiZWVuIGJvb3RlZC4KKyoqIElmIGJvb3RlZCBieSBhIGhvc3QsIEhvc3RQLT5Ib3N0VW5pcXVlTnVtIGlzIHRoZSBib290aW5nIGhvc3QuCisqKiBJZiBib290ZWQgYnkgYW4gUlRBLCBIb3N0UC0+TWFwcGluZ1tSdXBdLlJ0YVVuaXF1ZU51bSBpcyB0aGUgYm9vdGluZyBSVEEuCisqKiBSdGFVbmlxIGlzIHRoZSBib290ZWQgUlRBLgorKi8KK3N0YXRpYyBpbnQgUklPQm9vdENvbXBsZXRlKCBzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBIb3N0ICpIb3N0UCwgdWludCBSdXAsIHN0cnVjdCBQa3RDbWQgKlBrdENtZFAgKQoreworCXN0cnVjdCBNYXAJKk1hcFAgPSBOVUxMOworCXN0cnVjdCBNYXAJKk1hcFAyID0gTlVMTDsKKwlpbnQJRmxhZzsKKwlpbnQJZm91bmQ7CisJaW50CWhvc3QsIHJ0YTsKKwlpbnQJRW1wdHlTbG90ID0gLTE7CisJaW50CWVudHJ5LCBlbnRyeTI7CisJY2hhcgkqTXlUeXBlLCAqTXlOYW1lOworCXVpbnQJTXlMaW5rOworCXVzaG9ydAlSdGFUeXBlOworCXVpbnQJUnRhVW5pcSA9IChSQllURShQa3RDbWRQLT5VbmlxTnVtWzBdKSkgKworCQkJICAoUkJZVEUoUGt0Q21kUC0+VW5pcU51bVsxXSkgPDwgOCkgKworCQkJICAoUkJZVEUoUGt0Q21kUC0+VW5pcU51bVsyXSkgPDwgMTYpICsKKwkJCSAgKFJCWVRFKFBrdENtZFAtPlVuaXFOdW1bM10pIDw8IDI0KTsKKworCS8qIFdhcyBSSU9Cb290aW5nLS0gLiBUaGF0J3MgYmFkLiBJZiBhbiBSVEEgc2VuZHMgdHdvIG9mIHRoZW0sIHRoZQorCSAgIGRyaXZlciB3aWxsIG5ldmVyIHRoaW5rIHRoYXQgdGhlIFJUQSBoYXMgYm9vdGVkLi4uIC0tIFJFVyAqLworCXAtPlJJT0Jvb3RpbmcgPSAwOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiUlRBIEJvb3QgY29tcGxldGVkIC0gQm9vdEluUHJvZ3Jlc3Mgbm93ICVkXG4iLCBwLT5SSU9Cb290aW5nKTsKKworCS8qCisJKiogRGV0ZXJtaW5lIHR5cGUgb2YgdW5pdCAoMTYvOCBwb3J0IFJUQSkuCisJKi8KKwlSdGFUeXBlID0gR2V0VW5pdFR5cGUoUnRhVW5pcSk7CisgICAgICAgIGlmICggUnVwID49ICh1c2hvcnQpTUFYX1JVUCApIHsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiUklPOiBIb3N0ICVzIGhhcyBib290ZWQgYW4gUlRBKCVkKSBvbiBsaW5rICVjXG4iLAorCSAgICAgSG9zdFAtPk5hbWUsIDggKiBSdGFUeXBlLCBSQllURShQa3RDbWRQLT5MaW5rTnVtKSsnQScpOworCX0gZWxzZSB7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJJTzogUlRBICVzIGhhcyBib290ZWQgYW4gUlRBKCVkKSBvbiBsaW5rICVjXG4iLAorCSAgICAgSG9zdFAtPk1hcHBpbmdbUnVwXS5OYW1lLCA4ICogUnRhVHlwZSwKKwkgICAgIFJCWVRFKFBrdENtZFAtPkxpbmtOdW0pKydBJyk7CisJfQorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiVW5pcU51bSBpcyAweCV4XG4iLFJ0YVVuaXEpOworCisgICAgICAgIGlmICggKCBSdGFVbmlxID09IDB4MDAwMDAwMDAgKSB8fCAoIFJ0YVVuaXEgPT0gMHhmZmZmZmZmZiApICkKKwl7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIklsbGVnYWwgUlRBIFVuaXEgTnVtYmVyXG4iKTsKKwkgICAgcmV0dXJuIFRSVUU7CisJfQorCisJLyoKKwkqKiBJZiB0aGlzIFJUQSBoYXMganVzdCBib290ZWQgYW4gUlRBIHdoaWNoIGRvZXNuJ3QgYmVsb25nIHRvIHRoaXMKKwkqKiBzeXN0ZW0sIG9yIHRoZSBzeXN0ZW0gaXMgaW4gc2xhdmUgbW9kZSwgZG8gbm90IGF0dGVtcHQgdG8gY3JlYXRlCisJKiogYSBuZXcgdGFibGUgZW50cnkgZm9yIGl0LgorCSovCisJaWYgKCFSSU9Cb290T2socCwgSG9zdFAsIFJ0YVVuaXEpKQorCXsKKwkgICAgTXlMaW5rID0gUkJZVEUoUGt0Q21kUC0+TGlua051bSk7CisJICAgIGlmIChSdXAgPCAodXNob3J0KSBNQVhfUlVQKQorCSAgICB7CisJCS8qCisJCSoqIFJ0YVVuaXEgd2FzIGNsb25lIGJvb3RlZCAoYnkgdGhpcyBSVEEpLiBJbnN0cnVjdCB0aGlzIFJUQQorCQkqKiB0byBob2xkIG9mZiBmdXJ0aGVyIGF0dGVtcHRzIHRvIGJvb3Qgb24gdGhpcyBsaW5rIGZvciAzMAorCQkqKiBzZWNvbmRzLgorCQkqLworCQlpZiAoUklPU3VzcGVuZEJvb3RSdGEoSG9zdFAsIEhvc3RQLT5NYXBwaW5nW1J1cF0uSUQsIE15TGluaykpCisJCXsKKwkJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJUQSBmYWlsZWQgdG8gc3VzcGVuZCBib290aW5nIG9uIGxpbmsgJWNcbiIsCisJCSAgICAgJ0EnICsgTXlMaW5rKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKgorCQkqKiBSdGFVbmlxIHdhcyBib290ZWQgYnkgdGhpcyBob3N0LiBTZXQgdGhlIGJvb3RpbmcgbGluaworCQkqKiB0byBob2xkIG9mZiBmb3IgMzAgc2Vjb25kcyB0byBnaXZlIGFub3RoZXIgdW5pdCBhCisJCSoqIGNoYW5jZSB0byBib290IGl0LgorCQkqLworCQlXV09SRChIb3N0UC0+TGlua1N0clBbTXlMaW5rXS5XYWl0Tm9Cb290LCAzMCk7CisJICAgIH0KKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiUlRBICV4IG5vdCBvd25lZCAtIHN1c3BlbmQgYm9vdGluZyBkb3duIGxpbmsgJWMgb24gdW5pdCAleFxuIiwKKwkgICAgICBSdGFVbmlxLCAnQScgKyBNeUxpbmssIEhvc3RQLT5NYXBwaW5nW1J1cF0uUnRhVW5pcXVlTnVtKTsKKwkgICAgcmV0dXJuIFRSVUU7CisJfQorCisJLyoKKwkqKiBDaGVjayBmb3IgYSBTTE9UX0lOX1VTRSBlbnRyeSBmb3IgdGhpcyBSVEEgYXR0YWNoZWQgdG8gdGhlCisJKiogY3VycmVudCBob3N0IGNhcmQgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIElmIGl0IGV4aXN0cywgbWFrZSBhIG5vdGUgdGhhdCB3ZSBoYXZlIGJvb3RlZCBpdC4gT3RoZXIgcGFydHMgb2YKKwkqKiB0aGUgZHJpdmVyIGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgaW5mb3JtYXRpb24gYXQgYSBsYXRlciBkYXRlLAorCSoqIGluIHBhcnRpY3VsYXIgd2hlbiB0aGUgYm9vdGluZyBSVEEgYXNrcyBmb3IgYW4gSUQgZm9yIHRoaXMgdW5pdCwKKwkqKiB3ZSBtdXN0IGhhdmUgc2V0IHRoZSBCT09URUQgZmxhZywgYW5kIHRoZSBORVdCT09UIGZsYWcgaXMgdXNlZAorCSoqIHRvIGZvcmNlIGFuIG9wZW4gb24gYW55IHBvcnRzIHRoYXQgd2hlcmUgcHJldmlvdXNseSBvcGVuIG9uIHRoaXMKKwkqKiB1bml0LgorCSovCisgICAgICAgIGZvciAoIGVudHJ5PTA7IGVudHJ5PE1BWF9SVVA7IGVudHJ5KysgKQorCXsKKwkgICAgdWludCBzeXNwb3J0OworCisJICAgIGlmICgoSG9zdFAtPk1hcHBpbmdbZW50cnldLkZsYWdzICYgU0xPVF9JTl9VU0UpICYmIAorCSAgICAgICAoSG9zdFAtPk1hcHBpbmdbZW50cnldLlJ0YVVuaXF1ZU51bT09UnRhVW5pcSkpCisJICAgIHsKKwkgICAgICAgIEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5GbGFncyB8PSBSVEFfQk9PVEVEfFJUQV9ORVdCT09UOworI2lmIE5FRURfVE9fRklYCisJCVJJT19TVl9CUk9BRENBU1QoSG9zdFAtPnN2RmxhZ3NbZW50cnldKTsKKyNlbmRpZgorCQlpZiAoIChzeXNwb3J0PUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5TeXNQb3J0KSAhPSBOT19QT1JUICkKKwkJeworCQkgICBpZiAoIHN5c3BvcnQgPCBwLT5SSU9GaXJzdFBvcnRzQm9vdGVkICkKKwkJCXAtPlJJT0ZpcnN0UG9ydHNCb290ZWQgPSBzeXNwb3J0OworCQkgICBpZiAoIHN5c3BvcnQgPiBwLT5SSU9MYXN0UG9ydHNCb290ZWQgKQorCQkJcC0+UklPTGFzdFBvcnRzQm9vdGVkID0gc3lzcG9ydDsKKwkJICAgLyoKKwkJICAgKiogRm9yIGEgMTYgcG9ydCBSVEEsIGNoZWNrIHRoZSBzZWNvbmQgYmFuayBvZiA4IHBvcnRzCisJCSAgICovCisJCSAgIGlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisJCSAgIHsKKwkJCWVudHJ5MiA9IEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5JRDIgLSAxOworCQkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5GbGFncyB8PSBSVEFfQk9PVEVEfFJUQV9ORVdCT09UOworI2lmIE5FRURfVE9fRklYCisJCQlSSU9fU1ZfQlJPQURDQVNUKEhvc3RQLT5zdkZsYWdzW2VudHJ5Ml0pOworI2VuZGlmCisJCQlzeXNwb3J0ID0gSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5TeXNQb3J0OworCQkJaWYgKCBzeXNwb3J0IDwgcC0+UklPRmlyc3RQb3J0c0Jvb3RlZCApCisJCQkgICAgcC0+UklPRmlyc3RQb3J0c0Jvb3RlZCA9IHN5c3BvcnQ7CisJCQlpZiAoIHN5c3BvcnQgPiBwLT5SSU9MYXN0UG9ydHNCb290ZWQgKQorCQkJICAgIHAtPlJJT0xhc3RQb3J0c0Jvb3RlZCA9IHN5c3BvcnQ7CisJCSAgIH0KKwkJfQorCQlpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KSB7CisJCSAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJUQSB3aWxsIGJlIGdpdmVuIElEcyAlZCslZFxuIiwKKwkJICAgIGVudHJ5KzEsIGVudHJ5MisxKTsKKwkJfSBlbHNlIHsKKwkJICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiUlRBIHdpbGwgYmUgZ2l2ZW4gSUQgJWRcbiIsZW50cnkrMSk7CisJCX0KKwkJcmV0dXJuIFRSVUU7CisJICAgIH0KKwl9CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSVEEgbm90IGNvbmZpZ3VyZWQgZm9yIHRoaXMgaG9zdFxuIik7CisKKwlpZiAoIFJ1cCA+PSAodXNob3J0KU1BWF9SVVAgKQorCXsKKwkgICAgLyoKKwkgICAgKiogSXQgd2FzIGEgaG9zdCB0aGF0IGRpZCB0aGUgYm9vdGluZworCSAgICAqLworCSAgICBNeVR5cGUgPSAiSG9zdCI7CisJICAgIE15TmFtZSA9IEhvc3RQLT5OYW1lOworCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAqKiBJdCB3YXMgYW4gUlRBIHRoYXQgZGlkIHRoZSBib290aW5nCisJICAgICovCisJICAgIE15VHlwZSA9ICJSVEEiOworCSAgICBNeU5hbWUgPSBIb3N0UC0+TWFwcGluZ1tSdXBdLk5hbWU7CisJfQorI2lmZGVmIENIRUNLCisJQ2hlY2tTdHJpbmcoTXlUeXBlKTsKKwlDaGVja1N0cmluZyhNeU5hbWUpOworI2VuZGlmCisKKwlNeUxpbmsgPSBSQllURShQa3RDbWRQLT5MaW5rTnVtKTsKKworCS8qCisJKiogVGhlcmUgaXMgbm8gU0xPVF9JTl9VU0UgZW50cnkgZm9yIHRoaXMgUlRBIGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50CisJKiogaG9zdCBjYXJkIGluIHRoZSBkcml2ZXIgdGFibGUuCisJKioKKwkqKiBDaGVjayBmb3IgYSBTTE9UX1RFTlRBVElWRSBlbnRyeSBmb3IgdGhpcyBSVEEgYXR0YWNoZWQgdG8gdGhlCisJKiogY3VycmVudCBob3N0IGNhcmQgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIElmIHdlIGZpbmQgb25lLCB0aGVuIHdlIHJlLXVzZSB0aGF0IHNsb3QuCisJKi8KKwlmb3IgKCBlbnRyeT0wOyBlbnRyeTxNQVhfUlVQOyBlbnRyeSsrICkKKwl7CisJICAgIGlmICggKEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5GbGFncyAmIFNMT1RfVEVOVEFUSVZFKSAmJgorCQkgKEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5SdGFVbmlxdWVOdW0gPT0gUnRhVW5pcSkgKQorCSAgICB7CisJCWlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisJCXsKKwkJICAgIGVudHJ5MiA9IEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5JRDIgLSAxOworCQkgICAgaWYgKCAoSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5GbGFncyAmIFNMT1RfVEVOVEFUSVZFKSAmJgorCQkJIChIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLlJ0YVVuaXF1ZU51bSA9PSBSdGFVbmlxKSApCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJGb3VuZCBwcmV2aW91cyB0ZW50YXRpdmUgc2xvdHMgKCVkKyVkKVxuIiwKKwkJCSBlbnRyeSwgZW50cnkyKTsKKwkJICAgIGVsc2UKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkZvdW5kIHByZXZpb3VzIHRlbnRhdGl2ZSBzbG90ICglZClcbiIsZW50cnkpOworCQlpZiAoISBwLT5SSU9Ob01lc3NhZ2UpCisJCSAgICBjcHJpbnRmKCJSVEEgY29ubmVjdGVkIHRvICVzICclcycgKCVjKSBub3QgY29uZmlndXJlZC5cbiIsTXlUeXBlLE15TmFtZSxNeUxpbmsrJ0EnKTsKKwkJcmV0dXJuIFRSVUU7CisJICAgIH0KKwl9CisKKwkvKgorCSoqIFRoZXJlIGlzIG5vIFNMT1RfSU5fVVNFIG9yIFNMT1RfVEVOVEFUSVZFIGVudHJ5IGZvciB0aGlzIFJUQQorCSoqIGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50IGhvc3QgY2FyZCBpbiB0aGUgZHJpdmVyIHRhYmxlLgorCSoqCisJKiogQ2hlY2sgaWYgdGhlcmUgaXMgYSBTTE9UX0lOX1VTRSBvciBTTE9UX1RFTlRBVElWRSBlbnRyeSBvbiBhbm90aGVyCisJKiogaG9zdCBmb3IgdGhpcyBSVEEgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIEZvciBhIFNMT1RfSU5fVVNFIGVudHJ5IG9uIGFub3RoZXIgaG9zdCwgd2UgbmVlZCB0byBkZWxldGUgdGhlIFJUQQorCSoqIGVudHJ5IGZyb20gdGhlIG90aGVyIGhvc3QgYW5kIGFkZCBpdCB0byB0aGlzIGhvc3QgKHVzaW5nIHNvbWUgb2YKKwkqKiB0aGUgZnVuY3Rpb25zIGZyb20gdGFibGUuYyB3aGljaCBkbyB0aGlzKS4KKwkqKiBGb3IgYSBTTE9UX1RFTlRBVElWRSBlbnRyeSBvbiBhbm90aGVyIGhvc3QsIHdlIG11c3QgY29wZSB3aXRoIHRoZQorCSoqIGZvbGxvd2luZyBzY2VuYXJpbzoKKwkqKgorCSoqICsgUGx1ZyA4IHBvcnQgUlRBIGludG8gaG9zdCBBLiAoVGhpcyBjcmVhdGVzIFNMT1RfVEVOVEFUSVZFIGVudHJ5CisJKiogICBpbiB0YWJsZSkKKwkqKiArIFVucGx1ZyBSVEEgYW5kIHBsdWcgaW50byBob3N0IEIuIChXZSBub3cgaGF2ZSAyIFNMT1RfVEVOVEFUSVZFCisJKiogICBlbnRyaWVzKQorCSoqICsgQ29uZmlndXJlIFJUQSBvbiBob3N0IEIuIChUaGlzIHNsb3Qgbm93IGJlY29tZXMgU0xPVF9JTl9VU0UpCisJKiogKyBVbnBsdWcgUlRBIGFuZCBwbHVnIGJhY2sgaW50byBob3N0IEEuCisJKiogKyBDb25maWd1cmUgUlRBIG9uIGhvc3QgQS4gV2Ugbm93IGhhdmUgdGhlIHNhbWUgUlRBIGNvbmZpZ3VyZWQKKwkqKiAgIHdpdGggZGlmZmVyZW50IHBvcnRzIG9uIHR3byBkaWZmZXJlbnQgaG9zdHMuCisJKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJIYXZlIHdlIHNlZW4gUlRBICV4IGJlZm9yZT9cbiIsIFJ0YVVuaXEgKTsKKwlmb3VuZCA9IDA7CisJRmxhZyA9IDA7IC8qIENvbnZpbmNlIHRoZSBjb21waWxlciB0aGlzIHZhcmlhYmxlIGlzIGluaXRpYWxpemVkICovCisJZm9yICggaG9zdCA9IDA7ICFmb3VuZCAmJiAoaG9zdCA8IHAtPlJJT051bUhvc3RzKTsgaG9zdCsrICkKKwl7CisJICAgIGZvciAoIHJ0YT0wOyBydGE8TUFYX1JVUDsgcnRhKysgKQorCSAgICB7CisJCWlmICgocC0+UklPSG9zdHNbaG9zdF0uTWFwcGluZ1tydGFdLkZsYWdzICYKKwkJIChTTE9UX0lOX1VTRSB8IFNMT1RfVEVOVEFUSVZFKSkgJiYKKwkJIChwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW3J0YV0uUnRhVW5pcXVlTnVtPT1SdGFVbmlxKSkKKwkJeworCQkgICAgRmxhZyA9IHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbcnRhXS5GbGFnczsKKwkJICAgIE1hcFAgPSAmcC0+UklPSG9zdHNbaG9zdF0uTWFwcGluZ1tydGFdOworCQkgICAgaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKwkJICAgIHsKKwkJCU1hcFAyID0gJnAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbTWFwUC0+SUQyIC0gMV07CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJUaGlzIFJUQSBpcyB1bml0cyAlZCslZCBmcm9tIGhvc3QgJXNcbiIsCisJCQkgcnRhKzEsIE1hcFAtPklEMiwgcC0+UklPSG9zdHNbaG9zdF0uTmFtZSk7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJUaGlzIFJUQSBpcyB1bml0ICVkIGZyb20gaG9zdCAlc1xuIiwKKwkJCSBydGErMSwgcC0+UklPSG9zdHNbaG9zdF0uTmFtZSk7CisJCSAgICBmb3VuZCA9IDE7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJfQorCisJLyoKKwkqKiBUaGVyZSBpcyBubyBTTE9UX0lOX1VTRSBvciBTTE9UX1RFTlRBVElWRSBlbnRyeSBmb3IgdGhpcyBSVEEKKwkqKiBhdHRhY2hlZCB0byB0aGUgY3VycmVudCBob3N0IGNhcmQgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIElmIHdlIGhhdmUgbm90IGZvdW5kIGEgU0xPVF9JTl9VU0Ugb3IgU0xPVF9URU5UQVRJVkUgZW50cnkgb24KKwkqKiBhbm90aGVyIGhvc3QgZm9yIHRoaXMgUlRBIGluIHRoZSBkcml2ZXIgdGFibGUuLi4KKwkqKgorCSoqIENoZWNrIGZvciBhIFNMT1RfSU5fVVNFIGVudHJ5IGZvciB0aGlzIFJUQSBpbiB0aGUgY29uZmlnIHRhYmxlLgorCSovCisJaWYgKCAhTWFwUCApCisJeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJMb29rIGZvciBSVEEgJXggaW4gUklPU2F2ZWRUYWJsZVxuIixSdGFVbmlxKTsKKwkgICAgZm9yICggcnRhPTA7IHJ0YSA8IFRPVEFMX01BUF9FTlRSSUVTOyBydGErKyApCisJICAgIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQ2hlY2sgdGFibGUgZW50cnkgJWQgKCV4KSIsCisJCSAgICAgIHJ0YSwKKwkJICAgICAgcC0+UklPU2F2ZWRUYWJsZVtydGFdLlJ0YVVuaXF1ZU51bSk7CisKKwkJaWYgKCAocC0+UklPU2F2ZWRUYWJsZVtydGFdLkZsYWdzICYgU0xPVF9JTl9VU0UpICYmCisJCSAocC0+UklPU2F2ZWRUYWJsZVtydGFdLlJ0YVVuaXF1ZU51bSA9PSBSdGFVbmlxKSApCisJCXsKKwkJICAgIE1hcFAgPSAmcC0+UklPU2F2ZWRUYWJsZVtydGFdOworCQkgICAgRmxhZyA9IHAtPlJJT1NhdmVkVGFibGVbcnRhXS5GbGFnczsKKwkJICAgIGlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisJCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGVudHJ5MiA9IHJ0YSArIDE7IGVudHJ5MiA8IFRPVEFMX01BUF9FTlRSSUVTOworICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5MisrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLT5SSU9TYXZlZFRhYmxlW2VudHJ5Ml0uUnRhVW5pcXVlTnVtID09IFJ0YVVuaXEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgTWFwUDIgPSAmcC0+UklPU2F2ZWRUYWJsZVtlbnRyeTJdOworICAgICAgICAgICAgICAgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiVGhpcyBSVEEgaXMgZnJvbSB0YWJsZSBlbnRyaWVzICVkKyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRhLCBlbnRyeTIpOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiVGhpcyBSVEEgaXMgZnJvbSB0YWJsZSBlbnRyeSAlZFxuIiwgcnRhKTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisKKwkvKgorCSoqIFRoZXJlIGlzIG5vIFNMT1RfSU5fVVNFIG9yIFNMT1RfVEVOVEFUSVZFIGVudHJ5IGZvciB0aGlzIFJUQQorCSoqIGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50IGhvc3QgY2FyZCBpbiB0aGUgZHJpdmVyIHRhYmxlLgorCSoqCisJKiogV2UgbWF5IGhhdmUgZm91bmQgYSBTTE9UX0lOX1VTRSBlbnRyeSBvbiBhbm90aGVyIGhvc3QgZm9yIHRoaXMKKwkqKiBSVEEgaW4gdGhlIGNvbmZpZyB0YWJsZSwgb3IgYSBTTE9UX0lOX1VTRSBvciBTTE9UX1RFTlRBVElWRSBlbnRyeQorCSoqIG9uIGFub3RoZXIgaG9zdCBmb3IgdGhpcyBSVEEgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIENoZWNrIHRoZSBkcml2ZXIgdGFibGUgZm9yIHJvb20gdG8gZml0IHRoaXMgbmV3bHkgZGlzY292ZXJlZCBSVEEuCisJKiogUklPRmluZEZyZWVJRCgpIGZpcnN0IGxvb2tzIGZvciBmcmVlIHNsb3RzIGFuZCBpZiBpdCBkb2VzIG5vdAorCSoqIGZpbmQgYW55IGZyZWUgc2xvdHMgaXQgd2lsbCB0aGVuIGF0dGVtcHQgdG8gb3VzdCBhbnkKKwkqKiB0ZW50YXRpdmUgZW50cnkgaW4gdGhlIHRhYmxlLgorCSovCisJRW1wdHlTbG90ID0gMTsKKwlpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQorCXsKKwkgICAgaWYgKFJJT0ZpbmRGcmVlSUQocCwgSG9zdFAsICZlbnRyeSwgJmVudHJ5MikgPT0gMCkKKwkgICAgeworCQlSSU9EZWZhdWx0TmFtZShwLCBIb3N0UCwgZW50cnkpOworCQlGaWxsU2xvdChlbnRyeSwgZW50cnkyLCBSdGFVbmlxLCBIb3N0UCk7CisJCUVtcHR5U2xvdCA9IDA7CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKFJJT0ZpbmRGcmVlSUQocCwgSG9zdFAsICZlbnRyeSwgTlVMTCkgPT0gMCkKKwkgICAgeworCQlSSU9EZWZhdWx0TmFtZShwLCBIb3N0UCwgZW50cnkpOworCQlGaWxsU2xvdChlbnRyeSwgMCwgUnRhVW5pcSwgSG9zdFApOworCQlFbXB0eVNsb3QgPSAwOworCSAgICB9CisJfQorCisJLyoKKwkqKiBUaGVyZSBpcyBubyBTTE9UX0lOX1VTRSBvciBTTE9UX1RFTlRBVElWRSBlbnRyeSBmb3IgdGhpcyBSVEEKKwkqKiBhdHRhY2hlZCB0byB0aGUgY3VycmVudCBob3N0IGNhcmQgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIElmIHdlIGZvdW5kIGEgU0xPVF9JTl9VU0UgZW50cnkgb24gYW5vdGhlciBob3N0IGZvciB0aGlzCisJKiogUlRBIGluIHRoZSBjb25maWcgb3IgZHJpdmVyIHRhYmxlLCBhbmQgdGhlcmUgYXJlIGVub3VnaCBmcmVlCisJKiogc2xvdHMgaW4gdGhlIGRyaXZlciB0YWJsZSwgdGhlbiB3ZSBuZWVkIHRvIG1vdmUgaXQgb3ZlciBhbmQKKwkqKiBkZWxldGUgaXQgZnJvbSB0aGUgb3RoZXIgaG9zdC4KKwkqKiBJZiB3ZSBmb3VuZCBhIFNMT1RfVEVOVEFUSVZFIGVudHJ5IG9uIGFub3RoZXIgaG9zdCBmb3IgdGhpcworCSoqIFJUQSBpbiB0aGUgZHJpdmVyIHRhYmxlLCBqdXN0IGRlbGV0ZSB0aGUgb3RoZXIgaG9zdCBlbnRyeS4KKwkqLworCWlmIChFbXB0eVNsb3QgPT0gMCkKKwl7CisJICAgIGlmICggTWFwUCApCisJICAgIHsKKwkJaWYgKEZsYWcgJiBTTE9UX0lOX1VTRSkKKwkJeworCQkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAKKyAgICAiVGhpcyBSVEEgY29uZmlndXJlZCBvbiBhbm90aGVyIGhvc3QgLSBtb3ZlIGVudHJ5IHRvIGN1cnJlbnQgaG9zdCAoMSlcbiIpOworCQkgICAgSG9zdFAtPk1hcHBpbmdbZW50cnldLlN5c1BvcnQgPSBNYXBQLT5TeXNQb3J0OworCQkgICAgQ0NPUFkoIE1hcFAtPk5hbWUsIEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5OYW1lLCBNQVhfTkFNRV9MRU4gKTsKKwkJICAgIEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5GbGFncyA9CisJCSAgICAgU0xPVF9JTl9VU0UgfCBSVEFfQk9PVEVEIHwgUlRBX05FV0JPT1Q7CisjaWYgTkVFRF9UT19GSVgKKwkJICAgIFJJT19TVl9CUk9BRENBU1QoSG9zdFAtPnN2RmxhZ3NbZW50cnldKTsKKyNlbmRpZgorCQkgICAgUklPUmVNYXBQb3J0cyggcCwgSG9zdFAsICZIb3N0UC0+TWFwcGluZ1tlbnRyeV0gKTsKKwkJICAgIGlmICggSG9zdFAtPk1hcHBpbmdbZW50cnldLlN5c1BvcnQgPCBwLT5SSU9GaXJzdFBvcnRzQm9vdGVkICkKKwkJCXAtPlJJT0ZpcnN0UG9ydHNCb290ZWQgPSBIb3N0UC0+TWFwcGluZ1tlbnRyeV0uU3lzUG9ydDsKKwkJICAgIGlmICggSG9zdFAtPk1hcHBpbmdbZW50cnldLlN5c1BvcnQgPiBwLT5SSU9MYXN0UG9ydHNCb290ZWQgKQorCQkJcC0+UklPTGFzdFBvcnRzQm9vdGVkID0gSG9zdFAtPk1hcHBpbmdbZW50cnldLlN5c1BvcnQ7CisJCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJTeXNQb3J0ICVkLCBOYW1lICVzXG4iLChpbnQpTWFwUC0+U3lzUG9ydCxNYXBQLT5OYW1lKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgCisgICAiVGhpcyBSVEEgaGFzIGEgdGVudGF0aXZlIGVudHJ5IG9uIGFub3RoZXIgaG9zdCAtIGRlbGV0ZSB0aGF0IGVudHJ5ICgxKVxuIik7CisJCSAgICBIb3N0UC0+TWFwcGluZ1tlbnRyeV0uRmxhZ3MgPQorCQkgICAgIFNMT1RfVEVOVEFUSVZFIHwgUlRBX0JPT1RFRCB8IFJUQV9ORVdCT09UOworI2lmIE5FRURfVE9fRklYCisJCSAgICBSSU9fU1ZfQlJPQURDQVNUKEhvc3RQLT5zdkZsYWdzW2VudHJ5XSk7CisjZW5kaWYKKwkJfQorCQlpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQorCQl7CisJCSAgICBpZiAoRmxhZyAmIFNMT1RfSU5fVVNFKQorCQkgICAgeworCQkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5GbGFncyA9IFNMT1RfSU5fVVNFIHwKKwkJCSBSVEFfQk9PVEVEIHwgUlRBX05FV0JPT1QgfCBSVEExNl9TRUNPTkRfU0xPVDsKKyNpZiBORUVEX1RPX0ZJWAorCQkJUklPX1NWX0JST0FEQ0FTVChIb3N0UC0+c3ZGbGFnc1tlbnRyeTJdKTsKKyNlbmRpZgorCQkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5TeXNQb3J0ID0gTWFwUDItPlN5c1BvcnQ7CisJCQkvKgorCQkJKiogTWFwIHNlY29uZCBibG9jayBvZiB0dHlzIGZvciAxNiBwb3J0IFJUQQorCQkJKi8KKwkJCVJJT1JlTWFwUG9ydHMoIHAsIEhvc3RQLCAmSG9zdFAtPk1hcHBpbmdbZW50cnkyXSApOworCQkgICAgICAgaWYgKEhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uU3lzUG9ydCA8IHAtPlJJT0ZpcnN0UG9ydHNCb290ZWQpCisJCQkgcC0+UklPRmlyc3RQb3J0c0Jvb3RlZCA9IEhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uU3lzUG9ydDsKKwkJICAgICAgIGlmIChIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLlN5c1BvcnQgPiBwLT5SSU9MYXN0UG9ydHNCb290ZWQpCisJCQkgcC0+UklPTGFzdFBvcnRzQm9vdGVkID0gSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5TeXNQb3J0OworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiU3lzUG9ydCAlZCwgTmFtZSAlc1xuIiwKKwkJCSAgICAgICAoaW50KUhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uU3lzUG9ydCwKKwkJCSAgICAgICBIb3N0UC0+TWFwcGluZ1tlbnRyeV0uTmFtZSk7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQlIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLkZsYWdzID0gU0xPVF9URU5UQVRJVkUgfAorCQkJIFJUQV9CT09URUQgfCBSVEFfTkVXQk9PVCB8IFJUQTE2X1NFQ09ORF9TTE9UOworI2lmIE5FRURfVE9fRklYCisJCQlSSU9fU1ZfQlJPQURDQVNUKEhvc3RQLT5zdkZsYWdzW2VudHJ5Ml0pOworI2VuZGlmCisJCSAgICBiemVybyggKGNhZGRyX3QpTWFwUDIsIHNpemVvZihzdHJ1Y3QgTWFwKSApOworCQl9CisJCWJ6ZXJvKCAoY2FkZHJfdClNYXBQLCBzaXplb2Yoc3RydWN0IE1hcCkgKTsKKwkJaWYgKCEgcC0+UklPTm9NZXNzYWdlKQorCQkgICAgY3ByaW50ZigiQW4gb3JwaGFuZWQgUlRBIGhhcyBiZWVuIGFkb3B0ZWQgYnkgJXMgJyVzJyAoJWMpLlxuIixNeVR5cGUsTXlOYW1lLE15TGluaysnQScpOworCSAgICB9CisJICAgIGVsc2UgaWYgKCEgcC0+UklPTm9NZXNzYWdlKQorCQljcHJpbnRmKCJSVEEgY29ubmVjdGVkIHRvICVzICclcycgKCVjKSBub3QgY29uZmlndXJlZC5cbiIsTXlUeXBlLE15TmFtZSxNeUxpbmsrJ0EnKTsKKwkgICAgUklPU2V0Q2hhbmdlKHApOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisKKwkvKgorCSoqIFRoZXJlIGlzIG5vIHJvb20gaW4gdGhlIGRyaXZlciB0YWJsZSB0byBtYWtlIGFuIGVudHJ5IGZvciB0aGUKKwkqKiBib290ZWQgUlRBLiBLZWVwIGEgbm90ZSBvZiBpdHMgVW5pcSBOdW0gaW4gdGhlIG92ZXJmbG93IHRhYmxlLAorCSoqIHNvIHdlIGNhbiBpZ25vcmUgaXQncyBJRCByZXF1ZXN0cy4KKwkqLworCWlmICghIHAtPlJJT05vTWVzc2FnZSkKKwkgICAgY3ByaW50ZigiVGhlIFJUQSBjb25uZWN0ZWQgdG8gJXMgJyVzJyAoJWMpIGNhbm5vdCBiZSBjb25maWd1cmVkLiAgWW91IGNhbm5vdCBjb25maWd1cmUgbW9yZSB0aGFuIDEyOCBwb3J0cyB0byBvbmUgaG9zdCBjYXJkLlxuIixNeVR5cGUsTXlOYW1lLE15TGluaysnQScpOworCWZvciAoIGVudHJ5PTA7IGVudHJ5PEhvc3RQLT5OdW1FeHRyYUJvb3RlZDsgZW50cnkrKyApCisJeworCSAgICBpZiAoIEhvc3RQLT5FeHRyYVVuaXRzW2VudHJ5XSA9PSBSdGFVbmlxICkKKwkgICAgeworCQkvKgorCQkqKiBhbHJlYWR5IGdvdCBpdCEKKwkJKi8KKwkJcmV0dXJuIFRSVUU7CisJICAgIH0KKwl9CisJLyoKKwkqKiBJZiB0aGVyZSBpcyByb29tLCBhZGQgdGhlIHVuaXQgdG8gdGhlIGxpc3Qgb2YgZXh0cmFzCisJKi8KKwlpZiAoIEhvc3RQLT5OdW1FeHRyYUJvb3RlZCA8IE1BWF9FWFRSQV9VTklUUyApCisJICAgIEhvc3RQLT5FeHRyYVVuaXRzW0hvc3RQLT5OdW1FeHRyYUJvb3RlZCsrXSA9IFJ0YVVuaXE7CisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyoqIElmIHRoZSBSVEEgb3IgaXRzIGhvc3QgYXBwZWFycyBpbiB0aGUgUklPQmluZFRhYltdIHN0cnVjdHVyZSB0aGVuCisqKiB3ZSBtdXN0bid0IGJvb3QgdGhlIFJUQSBhbmQgc2hvdWxkIHJldHVybiBGQUxTRS4KKyoqIFRoaXMgb3BlcmF0aW9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlciBkcml2ZXJzIGZvciBSSU8KKyoqIGluIHRoYXQgdGhpcyBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIG5ldyB1dGlsaXRpZXMKKyoqIG5vdCBjb25maWcucmlvIGFuZCBpcyBGQVIgU0lNUExFUi4KKyoqIFdlIG5vIGxvbmdlciBzdXBwb3J0IHRoZSBSSU9Cb290TW9kZSB2YXJpYWJsZS4gSXQgaXMgYWxsIGRvbmUgZnJvbSB0aGUKKyoqICJib290L25vYm9vdCIgZmllbGQgaW4gdGhlIHJpby5jZiBmaWxlLgorKi8KK2ludAorUklPQm9vdE9rKHAsIEhvc3RQLCBSdGFVbmlxKQorc3RydWN0IHJpb19pbmZvICoJcDsKK3N0cnVjdCBIb3N0ICoJCUhvc3RQOwordWxvbmcgUnRhVW5pcTsKK3sKKyAgICBpbnQJCUVudHJ5OworICAgIHVpbnQgSG9zdFVuaXEgPSBIb3N0UC0+VW5pcXVlTnVtOworCisJLyoKKwkqKiBTZWFyY2ggYmluZGluZ3MgdGFibGUgZm9yIFJUQSBvciBpdHMgcGFyZW50LgorCSoqIElmIGl0IGV4aXN0cywgcmV0dXJuIDAsIGVsc2UgMS4KKwkqLworCWZvciAoRW50cnkgPSAwOworCSAgICAoIEVudHJ5IDwgTUFYX1JUQV9CSU5ESU5HUyApICYmICggcC0+UklPQmluZFRhYltFbnRyeV0gIT0gMCApOworCSAgICBFbnRyeSsrKQorCXsKKwkJaWYgKCAocC0+UklPQmluZFRhYltFbnRyeV0gPT0gSG9zdFVuaXEpIHx8CisJCSAgICAgKHAtPlJJT0JpbmRUYWJbRW50cnldID09IFJ0YVVuaXEpICkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyoqIE1ha2UgYW4gZW1wdHkgc2xvdCB0ZW50YXRpdmUuIElmIHRoaXMgaXMgYSAxNiBwb3J0IFJUQSwgbWFrZSBib3RoCisqKiBzbG90cyB0ZW50YXRpdmUsIGFuZCB0aGUgc2Vjb25kIG9uZSBSVEFfU0VDT05EX1NMT1QgYXMgd2VsbC4KKyovCisKK3ZvaWQKK0ZpbGxTbG90KGVudHJ5LCBlbnRyeTIsIFJ0YVVuaXEsIEhvc3RQKQoraW50IGVudHJ5OworaW50IGVudHJ5MjsKK3VpbnQgUnRhVW5pcTsKK3N0cnVjdCBIb3N0ICpIb3N0UDsKK3sKKwlpbnQJCWxpbms7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJGaWxsU2xvdCglZCwgJWQsIDB4JXguLi4pXG4iLCBlbnRyeSwgZW50cnkyLCBSdGFVbmlxKTsKKworCUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5GbGFncyA9IChSVEFfQk9PVEVEIHwgUlRBX05FV0JPT1QgfCBTTE9UX1RFTlRBVElWRSk7CisJSG9zdFAtPk1hcHBpbmdbZW50cnldLlN5c1BvcnQgPSBOT19QT1JUOworCUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5SdGFVbmlxdWVOdW0gPSBSdGFVbmlxOworCUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5Ib3N0VW5pcXVlTnVtID0gSG9zdFAtPlVuaXF1ZU51bTsKKwlIb3N0UC0+TWFwcGluZ1tlbnRyeV0uSUQgPSBlbnRyeSArIDE7CisJSG9zdFAtPk1hcHBpbmdbZW50cnldLklEMiA9IDA7CisJaWYgKGVudHJ5MikgeworCQlIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLkZsYWdzID0gKFJUQV9CT09URUQgfCBSVEFfTkVXQk9PVCB8IAorCQkJCQkJCQlTTE9UX1RFTlRBVElWRSB8IFJUQTE2X1NFQ09ORF9TTE9UKTsKKwkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5TeXNQb3J0ID0gTk9fUE9SVDsKKwkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5SdGFVbmlxdWVOdW0gPSBSdGFVbmlxOworCQlIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLkhvc3RVbmlxdWVOdW0gPSBIb3N0UC0+VW5pcXVlTnVtOworCQlIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLk5hbWVbMF0gPSAnXDAnOworCQlIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLklEID0gZW50cnkyICsgMTsKKwkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5JRDIgPSBlbnRyeSArIDE7CisJCUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5JRDIgPSBlbnRyeTIgKyAxOworCX0KKwkvKgorCSoqIE11c3Qgc2V0IHRoZXNlIHVwLCBzbyB0aGF0IHV0aWxpdGllcyBzaG93CisJKiogdG9wb2xvZ3kgb2YgMTYgcG9ydCBSVEFzIGNvcnJlY3RseQorCSovCisJZm9yICggbGluaz0wOyBsaW5rPExJTktTX1BFUl9VTklUOyBsaW5rKysgKSB7CisJCUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5Ub3BvbG9neVtsaW5rXS5Vbml0ID0gUk9VVEVfRElTQ09OTkVDVDsKKwkJSG9zdFAtPk1hcHBpbmdbZW50cnldLlRvcG9sb2d5W2xpbmtdLkxpbmsgPSBOT19MSU5LOworCQlpZiAoZW50cnkyKSB7CisJCQlIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLlRvcG9sb2d5W2xpbmtdLlVuaXQgPSBST1VURV9ESVNDT05ORUNUOworCQkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5Ub3BvbG9neVtsaW5rXS5MaW5rID0gTk9fTElOSzsKKwkJfQorCX0KK30KKworI2lmIDAKKy8qCisJRnVuY3Rpb246CVRoaXMgZnVuY3Rpb24gaXMgdG8gZGlzYWJsZSB0aGUgZGlzayBpbnRlcnJ1cHQgCisgICAgUmV0dXJucyA6ICAgTm90aGluZworKi8KK3ZvaWQKK2Rpc2FibGVfaW50ZXJydXB0KHZlY3RvcikKK2ludAl2ZWN0b3I7Cit7CisJaW50CXBzOworCWludAl2YWw7CisKKwlkaXNhYmxlKHBzKTsKKwlpZiAodmVjdG9yID4gNDApICB7CisJCXZhbCA9IDEgPDwgKHZlY3RvciAtIDQwKTsKKwkJX19vdXRiKFM4MjU5KzEsIF9faW5iKFM4MjU5KzEpIHwgdmFsKTsKKwl9CisJZWxzZSB7CisJCXZhbCA9IDEgPDwgKHZlY3RvciAtIDMyKTsKKwkJX19vdXRiKE04MjU5KzEsIF9faW5iKE04MjU5KzEpIHwgdmFsKTsKKwl9CisJcmVzdG9yZShwcyk7Cit9CisKKy8qCisJRnVuY3Rpb246CVRoaXMgZnVuY3Rpb24gaXMgdG8gZW5hYmxlIHRoZSBkaXNrIGludGVycnVwdCAKKyAgICBSZXR1cm5zIDogICBOb3RoaW5nCisqLwordm9pZAorZW5hYmxlX2ludGVycnVwdCh2ZWN0b3IpCitpbnQJdmVjdG9yOworeworCWludAlwczsKKwlpbnQJdmFsOworCisJZGlzYWJsZShwcyk7CisJaWYgKHZlY3RvciA+IDQwKSAgeworCQl2YWwgPSAxIDw8ICh2ZWN0b3IgLSA0MCk7CisJCXZhbCA9IH52YWw7CisJCV9fb3V0YihTODI1OSsxLCBfX2luYihTODI1OSsxKSAmIHZhbCk7CisJfQorCWVsc2UgeworCQl2YWwgPSAxIDw8ICh2ZWN0b3IgLSAzMik7CisJCXZhbCA9IH52YWw7CisJCV9fb3V0YihNODI1OSsxLCBfX2luYihNODI1OSsxKSAmIHZhbCk7CisJfQorCXJlc3RvcmUocHMpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2NtZC5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzMwODVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9jbWQuYwpAQCAtMCwwICsxLDEwNDEgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIHBvcnRlZCBmcm9tIHRoZSBleGlzdGluZyBTQ08gZHJpdmVyIHNvdXJjZQorKioKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW9jbWQuYworKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTA6MzM6NDEKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTA6MzM6NDkKKyoqCisqKiAgaWRlbnQgQCgjKXJpb2NtZC5jCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb2NtZF9jX3NjY3NfID0gIkAoIylyaW9jbWQuYwkxLjIiOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisKKyNpbmNsdWRlICJsaW51eF9jb21wYXQuaCIKKyNpbmNsdWRlICJyaW9fbGludXguaCIKKyNpbmNsdWRlICJ0eXBkZWYuaCIKKyNpbmNsdWRlICJwa3QuaCIKKyNpbmNsdWRlICJkYWVtb24uaCIKKyNpbmNsdWRlICJyaW8uaCIKKyNpbmNsdWRlICJyaW9zcGFjZS5oIgorI2luY2x1ZGUgInRvcC5oIgorI2luY2x1ZGUgImNtZHBrdC5oIgorI2luY2x1ZGUgIm1hcC5oIgorI2luY2x1ZGUgInJpb3R5cGVzLmgiCisjaW5jbHVkZSAicnVwLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgInJpb2RydnIuaCIKKyNpbmNsdWRlICJyaW9pbmZvLmgiCisjaW5jbHVkZSAiZnVuYy5oIgorI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgInBjaS5oIgorCisjaW5jbHVkZSAicGFybW1hcC5oIgorI2luY2x1ZGUgInVuaXhydXAuaCIKKyNpbmNsdWRlICJib2FyZC5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgInBoYi5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJjbWRibGsuaCIKKyNpbmNsdWRlICJyb3V0ZS5oIgorI2luY2x1ZGUgImNvbnRyb2wuaCIKKyNpbmNsdWRlICJjaXJydXMuaCIKKworCitzdGF0aWMgc3RydWN0IElkZW50aWZ5UnRhIElkUnRhOworc3RhdGljIHN0cnVjdCBLaWxsTmVpZ2hib3VyIEtpbGxVbml0OworCitpbnQKK1JJT0ZvYWRSdGEoc3RydWN0IEhvc3QgKkhvc3RQLCBzdHJ1Y3QgTWFwICpNYXBQKQoreworCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkZPQUQgUlRBXG4iKTsKKworCUNtZEJsa1AgPSBSSU9HZXRDbWRCbGsoKTsKKworCWlmICggIUNtZEJsa1AgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiRk9BRCBSVEE6IEdldENtZEJsayBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCUNtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSBNYXBQLT5JRDsKKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID0gQk9PVF9SVVA7CisJQ21kQmxrUC0+UGFja2V0LnNyY191bml0ICA9IDA7CisJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ICA9IEJPT1RfUlVQOworCUNtZEJsa1AtPlBhY2tldC5sZW4JICAgPSAweDg0OworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzBdICAgPSBJRk9BRDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVsxXSAgID0gMDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVsyXSAgID0gSUZPQURfTUFHSUMgJiAweEZGOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzNdICAgPSAoSUZPQURfTUFHSUMgPj4gOCkgJiAweEZGOworCisJaWYgKCBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIE1hcFAtPklELTEsIENtZEJsa1ApID09IFJJT19GQUlMICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkZPQUQgUlRBOiBGYWlsZWQgdG8gcXVldWUgZm9hZCBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCitpbnQKK1JJT1pvbWJpZVJ0YShzdHJ1Y3QgSG9zdCAqSG9zdFAsIHN0cnVjdCBNYXAgKk1hcFApCit7CisJc3RydWN0IENtZEJsayAqQ21kQmxrUDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiWk9NQklFIFJUQVxuIik7CisKKwlDbWRCbGtQID0gUklPR2V0Q21kQmxrKCk7CisKKwlpZiAoICFDbWRCbGtQICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlpPTUJJRSBSVEE6IEdldENtZEJsayBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCUNtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSBNYXBQLT5JRDsKKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID0gQk9PVF9SVVA7CisJQ21kQmxrUC0+UGFja2V0LnNyY191bml0ICA9IDA7CisJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ICA9IEJPT1RfUlVQOworCUNtZEJsa1AtPlBhY2tldC5sZW4JICAgPSAweDg0OworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzBdICAgPSBaT01CSUU7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbMV0gICA9IDA7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbMl0gICA9IFpPTUJJRV9NQUdJQyAmIDB4RkY7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbM10gICA9IChaT01CSUVfTUFHSUMgPj4gOCkgJiAweEZGOworCisJaWYgKCBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIE1hcFAtPklELTEsIENtZEJsa1ApID09IFJJT19GQUlMICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlpPTUJJRSBSVEE6IEZhaWxlZCB0byBxdWV1ZSB6b21iaWUgY29tbWFuZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CitSSU9Db21tYW5kUnRhKHN0cnVjdCByaW9faW5mbyAqcCwgdWludCBSdGFVbmlxdWUsCisJaW50ICgqIGZ1bmMpKHN0cnVjdCBIb3N0ICpIb3N0UCwgc3RydWN0IE1hcCAqTWFwUCkpCit7CisJdWludCBIb3N0OworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDb21tYW5kIFJUQSAweCV4IGZ1bmMgMHgleFxuIiwgUnRhVW5pcXVlLCAoaW50KWZ1bmMpOworCisJaWYgKCAhUnRhVW5pcXVlICkKKwkJcmV0dXJuKDApOworCisJZm9yICggSG9zdCA9IDA7IEhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkgeworCQl1aW50IFJ0YTsKKwkJc3RydWN0IEhvc3QgKkhvc3RQID0gJnAtPlJJT0hvc3RzW0hvc3RdOworCisJCWZvciAoIFJ0YSA9IDA7IFJ0YSA8IFJUQVNfUEVSX0hPU1Q7IFJ0YSsrICkgeworCQkJc3RydWN0IE1hcCAqTWFwUCA9ICZIb3N0UC0+TWFwcGluZ1tSdGFdOworCisJCQlpZiAoIE1hcFAtPlJ0YVVuaXF1ZU51bSA9PSBSdGFVbmlxdWUgKSB7CisJCQkJdWludCBMaW5rOworCisJCQkJLyoKKwkJCQkqKiBub3csIGxldHMganVzdCBjaGVjayB3ZSBoYXZlIGEgcm91dGUgdG8gaXQuLi4KKwkJCQkqKiBJRiB0aGUgcm91dGluZyBzdHVmZiBpcyB3b3JraW5nLCB0aGVuIG9uZSBvZiB0aGUKKwkJCQkqKiB0b3BvbG9neSBlbnRyaWVzIGZvciB0aGlzIHVuaXQgd2lsbCBoYXZlIGEgbGVnaXQKKwkJCQkqKiByb3V0ZSAqc29tZXdoZXJlKi4gV2UgY2FyZSBub3Qgd2hlcmUgLSBpZiBpdHMgZ290CisJCQkJKiogYW55IGNvbm5lY3Rpb25zLCB3ZSBjYW4gZ2V0IHRvIGl0LgorCQkJCSovCisJCQkJZm9yICggTGluayA9IDA7IExpbmsgPCBMSU5LU19QRVJfVU5JVDsgTGluaysrICkgeworCQkJCQlpZiAoIE1hcFAtPlRvcG9sb2d5W0xpbmtdLlVuaXQgPD0gKHVjaGFyKU1BWF9SVVAgKSB7CisJCQkJCQkvKgorCQkJCQkJKiogSXRzIHdvcnRoIHRyeWluZyB0aGUgb3BlcmF0aW9uLi4uCisJCQkJCQkqLworCQkJCQkJcmV0dXJuICgqZnVuYykoIEhvc3RQLCBNYXBQICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIC1FTlhJTzsKK30KKworCitpbnQKK1JJT0lkZW50aWZ5UnRhKHN0cnVjdCByaW9faW5mbyAqcCwgY2FkZHJfdCBhcmcpCit7CisJdWludCBIb3N0OworCisJaWYgKCBjb3B5aW4oIChpbnQpYXJnLCAoY2FkZHJfdCkmSWRSdGEsIHNpemVvZihJZFJ0YSkgKSA9PSBDT1BZRkFJTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJSSU9fSURFTlRJRllfUlRBIGNvcHkgZmFpbGVkXG4iKTsKKwkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlmb3IgKCBIb3N0ID0gMCA7IEhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkgeworCQl1aW50IFJ0YTsKKwkJc3RydWN0IEhvc3QgKkhvc3RQID0gJnAtPlJJT0hvc3RzW0hvc3RdOworCisJCWZvciAoIFJ0YSA9IDA7IFJ0YSA8IFJUQVNfUEVSX0hPU1Q7IFJ0YSsrICkgeworCQkJc3RydWN0IE1hcCAqTWFwUCA9ICZIb3N0UC0+TWFwcGluZ1tSdGFdOworCisJCQlpZiAoIE1hcFAtPlJ0YVVuaXF1ZU51bSA9PSBJZFJ0YS5SdGFVbmlxdWUgKSB7CisJCQkJdWludCBMaW5rOworCQkJCS8qCisJCQkJKiogbm93LCBsZXRzIGp1c3QgY2hlY2sgd2UgaGF2ZSBhIHJvdXRlIHRvIGl0Li4uCisJCQkJKiogSUYgdGhlIHJvdXRpbmcgc3R1ZmYgaXMgd29ya2luZywgdGhlbiBvbmUgb2YgdGhlCisJCQkJKiogdG9wb2xvZ3kgZW50cmllcyBmb3IgdGhpcyB1bml0IHdpbGwgaGF2ZSBhIGxlZ2l0CisJCQkJKiogcm91dGUgKnNvbWV3aGVyZSouIFdlIGNhcmUgbm90IHdoZXJlIC0gaWYgaXRzIGdvdAorCQkJCSoqIGFueSBjb25uZWN0aW9ucywgd2UgY2FuIGdldCB0byBpdC4KKwkJCQkqLworCQkJCWZvciAoIExpbmsgPSAwOyBMaW5rIDwgTElOS1NfUEVSX1VOSVQ7IExpbmsrKyApIHsKKwkJCQkJaWYgKCBNYXBQLT5Ub3BvbG9neVtMaW5rXS5Vbml0IDw9ICh1Y2hhcilNQVhfUlVQICkgeworCQkJCQkJLyoKKwkJCQkJCSoqIEl0cyB3b3J0aCB0cnlpbmcgdGhlIG9wZXJhdGlvbi4uLgorCQkJCQkJKi8KKwkJCQkJCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSURFTlRJRlkgUlRBXG4iKTsKKworCQkJCQkJQ21kQmxrUCA9IFJJT0dldENtZEJsaygpOworCisJCQkJCQlpZiAoICFDbWRCbGtQICkgeworCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSURFTlRJRlkgUlRBOiBHZXRDbWRCbGsgZmFpbGVkXG4iKTsKKwkJCQkJCQlyZXR1cm4gLUVOWElPOworCQkJCQkJfQorCQkKKwkJCQkJCUNtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSBNYXBQLT5JRDsKKwkJCQkJCUNtZEJsa1AtPlBhY2tldC5kZXN0X3BvcnQgPSBCT09UX1JVUDsKKwkJCQkJCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCAgPSAwOworCQkJCQkJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ICA9IEJPT1RfUlVQOworCQkJCQkJQ21kQmxrUC0+UGFja2V0LmxlbgkgICA9IDB4ODQ7CisJCQkJCQlDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSAgID0gSURFTlRJRlk7CisJCQkJCQlDbWRCbGtQLT5QYWNrZXQuZGF0YVsxXSAgID0gMDsKKwkJCQkJCUNtZEJsa1AtPlBhY2tldC5kYXRhWzJdICAgPSBJZFJ0YS5JRDsKKwkJCisJCQkJCQlpZiAoIFJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgTWFwUC0+SUQtMSwgQ21kQmxrUCkgPT0gUklPX0ZBSUwgKSB7CisJCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJJREVOVElGWSBSVEE6IEZhaWxlZCB0byBxdWV1ZSBjb21tYW5kXG4iKTsKKwkJCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfSAKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworCitpbnQKK1JJT0tpbGxOZWlnaGJvdXIoc3RydWN0IHJpb19pbmZvICpwLCBjYWRkcl90IGFyZykKK3sKKwl1aW50IEhvc3Q7CisJdWludCBJRDsKKwlzdHJ1Y3QgSG9zdCAqSG9zdFA7CisJc3RydWN0IENtZEJsayAqQ21kQmxrUDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiS0lMTCBIT1NUIE5FSUdIQk9VUlxuIik7CisKKwlpZiAoIGNvcHlpbiggKGludClhcmcsIChjYWRkcl90KSZLaWxsVW5pdCwgc2l6ZW9mKEtpbGxVbml0KSApID09IENPUFlGQUlMICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJJT19LSUxMX05FSUdIQk9VUiBjb3B5IGZhaWxlZFxuIik7CisJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCBLaWxsVW5pdC5MaW5rID4gMyApCisJCXJldHVybiAtRU5YSU87CisgCisJQ21kQmxrUCA9IFJJT0dldENtZEJsaygpOworCisJaWYgKCAhQ21kQmxrUCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJVRk9BRDogR2V0Q21kQmxrIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJQ21kQmxrUC0+UGFja2V0LmRlc3RfdW5pdCA9IDA7CisJQ21kQmxrUC0+UGFja2V0LnNyY191bml0ICA9IDA7CisJQ21kQmxrUC0+UGFja2V0LmRlc3RfcG9ydCA9IEJPT1RfUlVQOworCUNtZEJsa1AtPlBhY2tldC5zcmNfcG9ydCAgPSBCT09UX1JVUDsKKwlDbWRCbGtQLT5QYWNrZXQubGVuCSAgID0gMHg4NDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSAgID0gVUZPQUQ7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbMV0gICA9IEtpbGxVbml0Lkxpbms7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbMl0gICA9IFVGT0FEX01BR0lDICYgMHhGRjsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVszXSAgID0gKFVGT0FEX01BR0lDID4+IDgpICYgMHhGRjsKKworCWZvciAoIEhvc3QgPSAwOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKyApIHsKKwkJSUQgPSAwOworCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tIb3N0XTsKKworCQlpZiAoIEhvc3RQLT5VbmlxdWVOdW0gPT0gS2lsbFVuaXQuVW5pcXVlTnVtICkgeworCQkJaWYgKCBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIFJUQVNfUEVSX0hPU1QrS2lsbFVuaXQuTGluaywKKwkJCQkJCQlDbWRCbGtQKSA9PSBSSU9fRkFJTCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlVGT0FEOiBGYWlsZWQgcXVldWUgY29tbWFuZFxuIik7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWZvciAoIElEPTA7IElEIDwgUlRBU19QRVJfSE9TVDsgSUQrKyApIHsKKwkJCWlmICggSG9zdFAtPk1hcHBpbmdbSURdLlJ0YVVuaXF1ZU51bSA9PSBLaWxsVW5pdC5VbmlxdWVOdW0gKSB7CisJCQkJQ21kQmxrUC0+UGFja2V0LmRlc3RfdW5pdCA9IElEKzE7CisJCQkJaWYgKCBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIElELCBDbWRCbGtQKSA9PSBSSU9fRkFJTCApIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJVRk9BRDogRmFpbGVkIHF1ZXVlIGNvbW1hbmRcbiIpOworCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJUklPRnJlZUNtZEJsayggQ21kQmxrUCApOworCXJldHVybiAtRU5YSU87Cit9CisKK2ludAorUklPU3VzcGVuZEJvb3RSdGEoc3RydWN0IEhvc3QgKkhvc3RQLCBpbnQgSUQsIGludCBMaW5rKQoreworCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlNVU1BFTkQgQk9PVCBPTiBSVEEgSUQgJWQsIGxpbmsgJWNcbiIsIElELCAnQScgKyBMaW5rKTsKKworCUNtZEJsa1AgPSBSSU9HZXRDbWRCbGsoKTsKKworCWlmICggIUNtZEJsa1AgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiU1VTUEVORCBCT09UIE9OIFJUQTogR2V0Q21kQmxrIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJQ21kQmxrUC0+UGFja2V0LmRlc3RfdW5pdCA9IElEOworCUNtZEJsa1AtPlBhY2tldC5kZXN0X3BvcnQgPSBCT09UX1JVUDsKKwlDbWRCbGtQLT5QYWNrZXQuc3JjX3VuaXQgID0gMDsKKwlDbWRCbGtQLT5QYWNrZXQuc3JjX3BvcnQgID0gQk9PVF9SVVA7CisJQ21kQmxrUC0+UGFja2V0LmxlbgkgICA9IDB4ODQ7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbMF0gICA9IElXQUlUOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzFdICAgPSBMaW5rOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzJdICAgPSBJV0FJVF9NQUdJQyAmIDB4RkY7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbM10gICA9IChJV0FJVF9NQUdJQyA+PiA4KSAmIDB4RkY7CisKKwlpZiAoIFJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgSUQgLSAxLCBDbWRCbGtQKSA9PSBSSU9fRkFJTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJTVVNQRU5EIEJPT1QgT04gUlRBOiBGYWlsZWQgdG8gcXVldWUgaXdhaXQgY29tbWFuZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CitSSU9Gb2FkV2FrZXVwKHN0cnVjdCByaW9faW5mbyAqcCkKK3sKKwlpbnQgcG9ydDsKKwlyZWdpc3RlciBzdHJ1Y3QgUG9ydCAqUG9ydFA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZvciAoIHBvcnQ9MDsgcG9ydDxSSU9fUE9SVFM7IHBvcnQrKykgeworCQlQb3J0UCA9IHAtPlJJT1BvcnRwW3BvcnRdOworCisJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJUG9ydFAtPkNvbmZpZyA9IDA7CisJCVBvcnRQLT5TdGF0ZSA9IDA7CisJCVBvcnRQLT5JblVzZSA9IE5PVF9JTlVTRTsKKwkJUG9ydFAtPlBvcnRTdGF0ZSA9IDA7CisJCVBvcnRQLT5GbHVzaENtZEJvZGdlID0gMDsKKwkJUG9ydFAtPk1vZGVtTGluZXMgPSAwOworCQlQb3J0UC0+TW9kZW1TdGF0ZSA9IDA7CisJCVBvcnRQLT5Db29rTW9kZSA9IDA7CisJCVBvcnRQLT5QYXJhbVNlbSA9IDA7CisJCVBvcnRQLT5NYXBwZWQgPSAwOworCQlQb3J0UC0+V2ZsdXNoRmxhZyA9IDA7CisJCVBvcnRQLT5NYWdpY0ZsYWdzID0gMDsKKwkJUG9ydFAtPlJ4RGF0YVN0YXJ0ID0gMDsKKwkJUG9ydFAtPlR4QnVmZmVySW4gPSAwOworCQlQb3J0UC0+VHhCdWZmZXJPdXQgPSAwOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwl9CisJcmV0dXJuKDApOworfQorCisvKgorKiogSW5jb21pbmcgY29tbWFuZCBvbiB0aGUgQ09NTUFORF9SVVAgdG8gYmUgcHJvY2Vzc2VkLgorKi8KK3N0YXRpYyBpbnQKK1JJT0NvbW1hbmRSdXAoc3RydWN0IHJpb19pbmZvICpwLCB1aW50IFJ1cCwgc3RydWN0IEhvc3QgKkhvc3RQLCBQS1QgKlBhY2tldFApCit7CisJc3RydWN0IFBrdENtZCAqUGt0Q21kUCA9IChzdHJ1Y3QgUGt0Q21kICopUGFja2V0UC0+ZGF0YTsKKwlzdHJ1Y3QgUG9ydCAqUG9ydFA7CisJc3RydWN0IFVuaXhSdXAgKlVuaXhSdXBQOworCXVzaG9ydCBTeXNQb3J0OworCXVzaG9ydCBSZXBvcnRlZE1vZGVtU3RhdHVzOworCXVzaG9ydCBydXA7CisJdXNob3J0IHN1YkNvbW1hbmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIgKCk7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdCggSG9zdCApOworCUNoZWNrSG9zdFAoIEhvc3RQICk7CisJQ2hlY2tQYWNrZXRQKCBQYWNrZXRQICk7CisjZW5kaWYKKworCS8qCisJKiogMTYgcG9ydCBSVEEgbm90ZToKKwkqKiBDb21tYW5kIHJ1cCBwYWNrZXRzIGNvbWluZyBmcm9tIHRoZSBSVEEgd2lsbCBoYXZlIHBrdC0+ZGF0YVsxXSAod2hpY2gKKwkqKiB0cmFuc2xhdGVzIHRvIFBrdENtZFAtPlBoYk51bSkgc2V0IHRvIHRoZSBob3N0IHBvcnQgbnVtYmVyIGZvciB0aGUKKwkqKiBwYXJ0aWN1bGFyIHVuaXQuIFRvIGFjY2VzcyB0aGUgY29ycmVjdCBCYXNlU3lzUG9ydCBmb3IgYSAxNiBwb3J0IFJUQSwKKwkqKiB3ZSBjYW4gdXNlIFBoYk51bSB0byBnZXQgdGhlIHJ1cCBudW1iZXIgZm9yIHRoZSBhcHByb3ByaWF0ZSA4IHBvcnQKKwkqKiBibG9jayAoZm9yIHRoZSBmaXJzdCBibG9jaywgdGhpcyBzaG91bGQgYmUgZXF1YWwgdG8gJ1J1cCcpLgorCSovCisJcnVwID0gUkJZVEUoUGt0Q21kUC0+UGhiTnVtKSAvICh1c2hvcnQpUE9SVFNfUEVSX1JUQTsKKwlVbml4UnVwUCA9ICZIb3N0UC0+VW5peFJ1cHNbcnVwXTsKKwlTeXNQb3J0ID0gVW5peFJ1cFAtPkJhc2VTeXNQb3J0ICsgCisJCQkoUkJZVEUoUGt0Q21kUC0+UGhiTnVtKSAlICh1c2hvcnQpUE9SVFNfUEVSX1JUQSk7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDb21tYW5kIG9uIHJ1cCAlZCwgcG9ydCAlZFxuIiwgcnVwLCBTeXNQb3J0KTsKKworI2lmZGVmIENIRUNLCisJQ2hlY2tSdXAoIHJ1cCApOworCUNoZWNrVW5peFJ1cFAoIFVuaXhSdXBQICk7CisjZW5kaWYKKwlpZiAoIFVuaXhSdXBQLT5CYXNlU3lzUG9ydCA9PSBOT19QT1JUICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk9CU0NVUkUgRVJST1IhXG4iKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJEaWFnbm9zdGljcyBmb2xsb3cuIFBsZWFzZSBXUklURSBUSEVTRSBET1dOIGFuZCByZXBvcnQgdGhlbSB0byBTcGVjaWFsaXggVGVjaG5pY2FsIFN1cHBvcnRcbiIpOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNPTlRST0wgaW5mb3JtYXRpb246IEhvc3QgbnVtYmVyICVkLCBuYW1lIGBgJXMnJ1xuIiwgCisJCQkgICAgIEhvc3RQLXAtPlJJT0hvc3RzLCBIb3N0UC0+TmFtZSApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNPTlRST0wgaW5mb3JtYXRpb246IFJ1cCBudW1iZXIgIDB4JXhcbiIsIHJ1cCk7CisKKwkJaWYgKCBSdXAgPj0gKHVzaG9ydClNQVhfUlVQICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDT05UUk9MIGluZm9ybWF0aW9uOiBUaGlzIGlzIHRoZSBSVVAgZm9yIFJUQSBgYCVzJydcbiIsCisJCQkJICAgICBIb3N0UC0+TWFwcGluZ1tSdXBdLk5hbWUpOworCQl9IGVsc2UKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQ09OVFJPTCBpbmZvcm1hdGlvbjogVGhpcyBpcyB0aGUgUlVQIGZvciBsaW5rIGBgJWMnJyBvZiBob3N0IGBgJXMnJ1xuIiwgCisJCQkJICAgICAoJ0EnICsgUnVwIC0gTUFYX1JVUCksIEhvc3RQLT5OYW1lKTsKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlBBQ0tFVCBpbmZvcm1hdGlvbjogRGVzdGluYXRpb24gMHgleDoweCV4XG4iLAorCQkJICAgICBQYWNrZXRQLT5kZXN0X3VuaXQsIFBhY2tldFAtPmRlc3RfcG9ydCApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlBBQ0tFVCBpbmZvcm1hdGlvbjogU291cmNlCSAgMHgleDoweCV4XG4iLAorCQkJICAgICBQYWNrZXRQLT5zcmNfdW5pdCwgUGFja2V0UC0+c3JjX3BvcnQgKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJQQUNLRVQgaW5mb3JtYXRpb246IExlbmd0aAkgIDB4JXggKCVkKVxuIiwgUGFja2V0UC0+bGVuLFBhY2tldFAtPmxlbiApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlBBQ0tFVCBpbmZvcm1hdGlvbjogQ29udHJvbAkgMHgleCAoJWQpXG4iLCBQYWNrZXRQLT5jb250cm9sLCBQYWNrZXRQLT5jb250cm9sKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJQQUNLRVQgaW5mb3JtYXRpb246IENoZWNrCSAgIDB4JXggKCVkKVxuIiwgUGFja2V0UC0+Y3N1bSwgUGFja2V0UC0+Y3N1bSApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNPTU1BTkQgaW5mb3JtYXRpb246IEhvc3QgUG9ydCBOdW1iZXIgMHgleCwgIgorCQkJCQkiQ29tbWFuZCBDb2RlIDB4JXhcbiIsIFBrdENtZFAtPlBoYk51bSwgUGt0Q21kUC0+Q29tbWFuZCApOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKyNpZmRlZiBDSEVDSworCUNoZWNrU3lzUG9ydCggU3lzUG9ydCApOworI2VuZGlmCisJUG9ydFAgPSBwLT5SSU9Qb3J0cFsgU3lzUG9ydCBdOworCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwlzd2l0Y2goIFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpICkgeworCQljYXNlIEJSRUFLX1JFQ0VJVkVEOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJSZWNlaXZlZCBhIGJyZWFrIVxuIik7CisJCQkvKiBJZiB0aGUgY3VycmVudCBsaW5lIGRpc2MuIGlzIG5vdCBtdWx0aS10aHJlYWRpbmcgYW5kCisJICAgCQkJdGhlIGN1cnJlbnQgcHJvY2Vzc29yIGlzIG5vdCB0aGUgZGVmYXVsdCwgcmVzZXQgcnVwX2ludHIKKwkgICAJCQlhbmQgcmV0dXJuIEZBTFNFIHRvIGVuc3VyZSB0aGF0IHRoZSBjb21tYW5kIHBhY2tldCBpcworCSAgIAkJCW5vdCBmcmVlZC4gKi8KKwkJCS8qIENhbGwgdG1nciBIQU5HVVAgSEVSRSAqLworCQkJLyogRml4IHRoaXMgbGF0ZXIgd2hlbiBldmVyeSB0aGluZyB3b3JrcyAhISEhIFJBTVJBSiAqLworCQkJZ3NfZ290X2JyZWFrICgmUG9ydFAtPmdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ09NUExFVEU6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNvbW1hbmQgY29tcGxldGUgb24gcGhiICVkIGhvc3QgJWRcbiIsCisJCQkgICAgIFJCWVRFKFBrdENtZFAtPlBoYk51bSksIEhvc3RQLXAtPlJJT0hvc3RzKTsKKwkJCXN1YkNvbW1hbmQgPSAxOworCQkJc3dpdGNoIChSQllURShQa3RDbWRQLT5TdWJDb21tYW5kKSkgeworCQkJCWNhc2UgTUVNRFVNUCA6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk1lbW9yeSBkdW1wIGNtZCAoMHgleCkgZnJvbSBhZGRyIDB4JXhcbiIsCisJCQkJICAgICBSQllURShQa3RDbWRQLT5TdWJDb21tYW5kKSwgUldPUkQoUGt0Q21kUC0+U3ViQWRkcikpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFJFQURfUkVHSVNURVIgOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJSZWFkIHJlZ2lzdGVyICgweCV4KVxuIiwgUldPUkQoUGt0Q21kUC0+U3ViQWRkcikpOworCQkJCQlwLT5DZFJlZ2lzdGVyID0gKFJCWVRFKFBrdENtZFAtPk1vZGVtU3RhdHVzKSAmIE1TVlIxX0hPU1QpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJc3ViQ29tbWFuZCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3ViQ29tbWFuZCkKKwkJCQlicmVhazsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiTmV3IHN0YXR1cyBpcyAweCV4IHdhcyAweCV4XG4iLAorCQkJCSAgICAgUkJZVEUoUGt0Q21kUC0+UG9ydFN0YXR1cyksUG9ydFAtPlBvcnRTdGF0ZSk7CisJCQlpZiAoUG9ydFAtPlBvcnRTdGF0ZSAhPSBSQllURShQa3RDbWRQLT5Qb3J0U3RhdHVzKSkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiTWFyayBzdGF0dXMgJiB3YWtldXBcbiIpOworCQkJCVBvcnRQLT5Qb3J0U3RhdGUgPSBSQllURShQa3RDbWRQLT5Qb3J0U3RhdHVzKTsKKwkJCQkvKiBXaGF0IHNob3VsZCB3ZSBkbyBoZXJlIC4uLgorCQkJCXdha2V1cCggJlBvcnRQLT5Qb3J0U3RhdGUgKTsKKwkJCQkqLworCQl9IGVsc2UgCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk5vIGNoYW5nZVxuIik7CisKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgTU9ERU1fU1RBVFVTOgorCQkJLyoKKwkJCSoqIEtub2NrIG91dCB0aGUgdGJ1c3kgYW5kIHRzdG9wIGJpdHMsIGFzIHRoZXNlIGFyZSBub3QgcmVsZXZhbnQKKwkJCSoqIHRvIHRoZSBjaGVjayBmb3IgbW9kZW0gc3RhdHVzIGNoYW5nZSAodGhleSdyZSBqdXN0IHRoZXJlIGJlY2F1c2UKKwkJCSoqIGl0J3MgYSBjb252ZW5pZW50IHBsYWNlIHRvIHB1dCB0aGVtISkuCisJCQkqLworCQkJUmVwb3J0ZWRNb2RlbVN0YXR1cyA9IFJCWVRFKFBrdENtZFAtPk1vZGVtU3RhdHVzKTsKKwkJCWlmICgoUG9ydFAtPk1vZGVtU3RhdGUgJiBNU1ZSMV9IT1NUKSA9PQorCQkJCQkoUmVwb3J0ZWRNb2RlbVN0YXR1cyAmIE1TVlIxX0hPU1QpKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJNb2RlbSBzdGF0dXMgdW5jaGFuZ2VkIDB4JXhcbiIsIFBvcnRQLT5Nb2RlbVN0YXRlKTsKKwkJCQkvKgorCQkJCSoqIFVwZGF0ZSBNb2RlbVN0YXRlIGp1c3QgaW4gY2FzZSB0YnVzeSBvciB0c3RvcCBzdGF0ZXMgaGF2ZQorCQkJCSoqIGNoYW5nZWQuCisJCQkJKi8KKwkJCQlQb3J0UC0+TW9kZW1TdGF0ZSA9IFJlcG9ydGVkTW9kZW1TdGF0dXM7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk1vZGVtIHN0YXR1cyBjaGFuZ2UgZnJvbSAweCV4IHRvIDB4JXhcbiIsCisJCQkJICAgICBQb3J0UC0+TW9kZW1TdGF0ZSwgUmVwb3J0ZWRNb2RlbVN0YXR1cyk7CisJCQkJUG9ydFAtPk1vZGVtU3RhdGUgPSBSZXBvcnRlZE1vZGVtU3RhdHVzOworI2lmZGVmIE1PREVNX1NVUFBPUlQKKwkJCQlpZiAoIFBvcnRQLT5NYXBwZWQgKSB7CisJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorCQkJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCQkqKioJCQkJCQkJCQkJCQkJICAgKioqCisJCQkJKioqCQkgIE0gTyBEIEUgTSAgIFMgVCBBIFQgRSAgIEMgSCBBIE4gRyBFCQkgICoqKgorCQkJCSoqKgkJCQkJCQkJCQkJCQkgICAqKioKKwkJCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQkJXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkJCS8qCisJCQkJKiogSWYgdGhlIGRldmljZSBpcyBhIG1vZGVtLCB0aGVuIGNoZWNrIHRoZSBtb2RlbQorCQkJCSoqIGNhcnJpZXIuCisJCQkJKi8KKwkJCQlpZiAoUG9ydFAtPmdzLnR0eSA9PSBOVUxMKQorCQkJCQlicmVhazsKKwkJCQlpZiAoUG9ydFAtPmdzLnR0eS0+dGVybWlvcyA9PSBOVUxMKQorCQkJCQlicmVhazsKKwkJCSAgCisJCQkJaWYgKCEoUG9ydFAtPmdzLnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkgJiYKKwkJCQkoKFBvcnRQLT5TdGF0ZSAmIChSSU9fTU9QRU58UklPX1dPUEVOKSkpKSB7CisKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJJcyB0aGVyZSBhIENhcnJpZXI/XG4iKTsKKwkJCS8qCisJCQkqKiBJcyB0aGVyZSBhIGNhcnJpZXI/CisJCQkqLworCQkJCQlpZiAoIFBvcnRQLT5Nb2RlbVN0YXRlICYgTVNWUjFfQ0QgKSB7CisJCQkvKgorCQkJKiogSGFzIGNhcnJpZXIganVzdCBhcHBlYXJlZD8KKwkJCSovCisJCQkJCQlpZiAoIShQb3J0UC0+U3RhdGUgJiBSSU9fQ0FSUl9PTikpIHsKKwkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNhcnJpZXIganVzdCBjYW1lIHVwLlxuIik7CisJCQkJCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19DQVJSX09OOworCQkJCS8qCisJCQkJKiogd2FrZXVwIGFueW9uZSBpbiBXT1BFTgorCQkJCSovCisJCQkJCQkJaWYgKFBvcnRQLT5TdGF0ZSAmIChQT1JUX0lTT1BFTiB8IFJJT19XT1BFTikgKQorCQkJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUgKCZQb3J0UC0+Z3Mub3Blbl93YWl0KTsKKyNpZmRlZiBTVEFUUworCQkJCVBvcnRQLT5TdGF0Lk1vZGVtT25DbnQrKzsKKyNlbmRpZgorCQkJfQorCQkJCQl9IGVsc2UgeworCQkJLyoKKwkJCSoqIEhhcyBjYXJyaWVyIGp1c3QgZHJvcHBlZD8KKwkJCSovCisJCQkJCQlpZiAoUG9ydFAtPlN0YXRlICYgUklPX0NBUlJfT04pIHsKKwkJCQkJCQlpZiAoUG9ydFAtPlN0YXRlICYgKFBPUlRfSVNPUEVOfFJJT19XT1BFTnxSSU9fTU9QRU4pKQorCQkJCQkJCQl0dHlfaGFuZ3VwIChQb3J0UC0+Z3MudHR5KTsKKwkJCQkJCQlQb3J0UC0+U3RhdGUgJj0gflJJT19DQVJSX09OOworCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQ2FycmlyZXIganVzdCB3ZW50IGRvd25cbiIpOworI2lmZGVmIFNUQVRTCisJCQkJUG9ydFAtPlN0YXQuTW9kZW1PZmZDbnQrKzsKKyNlbmRpZgorCQkJfQorCQkJfQorCQl9CisJCX0KKyNlbmRpZgorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiVW5rbm93biBjb21tYW5kICVkIG9uIENNRF9SVVAgb2YgaG9zdCAlZFxuIiwKKwkJCSAgICAgUkJZVEUoUGt0Q21kUC0+Q29tbWFuZCksSG9zdFAtcC0+UklPSG9zdHMpOworCQkJYnJlYWs7CisJfQorCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCisJZnVuY19leGl0ICgpOworCisJcmV0dXJuIFRSVUU7Cit9CisvKgorKiogVGhlIGNvbW1hbmQgbWVjaGFuaXNtOgorKioJRWFjaCBydXAgaGFzIGEgY2hhaW4gb2YgY29tbWFuZHMgYXNzb2NpYXRlZCB3aXRoIGl0LgorKioJVGhpcyBjaGFpbiBpcyBtYWludGFpbmVkIGJ5IHJvdXRpbmVzIGluIHRoaXMgZmlsZS4KKyoqCVBlcmlvZGljYWxseSB3ZSBhcmUgY2FsbGVkIGFuZCB3ZSBydW4gYSBxdWljayBjaGVjayBvZiBhbGwgdGhlCisqKglhY3RpdmUgY2hhaW5zIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQsCisqKglhbmQgaWYgdGhlIHJ1cCBpcyByZWFkeSB0byBhY2NlcHQgaXQuCisqKgorKi8KKworLyoKKyoqIEFsbG9jYXRlIGFuIGVtcHR5IGNvbW1hbmQgYmxvY2suCisqLworc3RydWN0IENtZEJsayAqCitSSU9HZXRDbWRCbGsodm9pZCkKK3sKKwlzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOworCisJQ21kQmxrUCA9IChzdHJ1Y3QgQ21kQmxrICopc3lzYnJrKHNpemVvZihzdHJ1Y3QgQ21kQmxrKSk7CisJaWYgKENtZEJsa1ApCisJCWJ6ZXJvKENtZEJsa1AsIHNpemVvZihzdHJ1Y3QgQ21kQmxrKSk7CisKKwlyZXR1cm4gQ21kQmxrUDsKK30KKworLyoKKyoqIFJldHVybiBhIGJsb2NrIHRvIHRoZSBoZWFkIG9mIHRoZSBmcmVlIGxpc3QuCisqLwordm9pZAorUklPRnJlZUNtZEJsayhzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQKQoreworCXN5c2ZyZWUoKHZvaWQgKilDbWRCbGtQLCBzaXplb2Yoc3RydWN0IENtZEJsaykpOworfQorCisvKgorKiogYXR0YWNoIGEgY29tbWFuZCBibG9jayB0byB0aGUgbGlzdCBvZiBjb21tYW5kcyB0byBiZSBwZXJmb3JtZWQgZm9yCisqKiBhIGdpdmVuIHJ1cC4KKyovCitpbnQKK1JJT1F1ZXVlQ21kQmxrKHN0cnVjdCBIb3N0ICpIb3N0UCwgdWludCBSdXAsIHN0cnVjdCBDbWRCbGsgKkNtZEJsa1ApCit7CisJc3RydWN0IENtZEJsayAqKkJhc2U7CisJc3RydWN0IFVuaXhSdXAgKlVuaXhSdXBQOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdFAoIEhvc3RQICk7CisJQ2hlY2tSdXAoIFJ1cCApOworCUNoZWNrQ21kQmxrUCggQ21kQmxrUCApOworI2VuZGlmCisJaWYgKCBSdXAgPj0gKHVzaG9ydCkoTUFYX1JVUCtMSU5LU19QRVJfVU5JVCkgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSWxsZWdhbCBydXAgbnVtYmVyICVkIGluIFJJT1F1ZXVlQ21kQmxrXG4iLFJ1cCk7CisJCVJJT0ZyZWVDbWRCbGsoIENtZEJsa1AgKTsKKwkJcmV0dXJuIFJJT19GQUlMOworCX0KKworCVVuaXhSdXBQID0gJkhvc3RQLT5Vbml4UnVwc1tSdXBdOworCisJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MpOworCisJLyoKKwkqKiBJZiB0aGUgUlVQIGlzIGN1cnJlbnRseSBpbmFjdGl2ZSwgdGhlbiBwdXQgdGhlIHJlcXVlc3QKKwkqKiBzdHJhaWdodCBvbiB0aGUgUlVQLi4uLgorCSovCisJaWYgKCAoVW5peFJ1cFAtPkNtZHNXYWl0aW5nUCA9PSBOVUxMKSAmJiAoVW5peFJ1cFAtPkNtZFBlbmRpbmdQID09IE5VTEwpICYmIAorCSAgICAgKFJXT1JEKFVuaXhSdXBQLT5SdXBQLT50eGNvbnRyb2wpID09IFRYX1JVUF9JTkFDVElWRSApICYmCisJCShDbWRCbGtQLT5QcmVGdW5jUCA/ICgqQ21kQmxrUC0+UHJlRnVuY1ApKENtZEJsa1AtPlByZUFyZyxDbWRCbGtQKQorCQkJCQkJCTpUUlVFKSkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJVUCBpbmFjdGl2ZS1wbGFjaW5nIGNvbW1hbmQgc3RyYWlnaHQgb24uIENtZCBieXRlIGlzIDB4JXhcbiIsCisJCQkJCSAgICAgQ21kQmxrUC0+UGFja2V0LmRhdGFbMF0pOworCisJCS8qCisJCSoqIFdoYW1teSEgYmxhdCB0aGF0IHBhY2shCisJCSovCisJCUhvc3RQLT5Db3B5KCAoY2FkZHJfdCkmQ21kQmxrUC0+UGFja2V0LCAKKwkJCVJJT19QVFIoSG9zdFAtPkNhZGRyLCBVbml4UnVwUC0+UnVwUC0+dHhwa3QgKSwgc2l6ZW9mKFBLVCkgKTsKKworCQkvKgorCQkqKiBwbGFjZSBjb21tYW5kIHBhY2tldCBvbiB0aGUgcGVuZGluZyBwb3NpdGlvbi4KKwkJKi8KKwkJVW5peFJ1cFAtPkNtZFBlbmRpbmdQID0gQ21kQmxrUDsKKworCQkvKgorCQkqKiBzZXQgdGhlIGNvbW1hbmQgcmVnaXN0ZXIKKwkJKi8KKwkJV1dPUkQoVW5peFJ1cFAtPlJ1cFAtPnR4Y29udHJvbCAsIFRYX1BBQ0tFVF9SRUFEWSk7CisKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIFJJT19TVUNDRVNTOworCX0KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJVUCBhY3RpdmUgLSBlbi1xdWVpbmdcbiIpOworCisJaWYgKCBVbml4UnVwUC0+Q21kc1dhaXRpbmdQICE9IE5VTEwpCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiUnVwIGFjdGl2ZSAtIGNvbW1hbmQgd2FpdGluZ1xuIik7CisJaWYgKCBVbml4UnVwUC0+Q21kUGVuZGluZ1AgIT0gTlVMTCApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiUnVwIGFjdGl2ZSAtIGNvbW1hbmQgcGVuZGluZ1xuIik7CisJaWYgKCBSV09SRChVbml4UnVwUC0+UnVwUC0+dHhjb250cm9sKSAhPSBUWF9SVVBfSU5BQ1RJVkUgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJ1cCBhY3RpdmUgLSBjb21tYW5kIHJ1cCBub3QgcmVhZHlcbiIpOworCisJQmFzZSA9ICZVbml4UnVwUC0+Q21kc1dhaXRpbmdQOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJGaXJzdCB0cnkgdG8gcXVldWUgY21kYmxrIDB4JXggYXQgMHgleFxuIiwgKGludClDbWRCbGtQLChpbnQpQmFzZSk7CisKKwl3aGlsZSAoICpCYXNlICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNvbW1hbmQgY21kYmxrIDB4JXggaGVyZVxuIiwgKGludCkoKkJhc2UpKTsKKwkJQmFzZSA9ICYoKCpCYXNlKS0+TmV4dFApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk5vdyB0cnkgdG8gcXVldWUgY21kIGNtZGJsayAweCV4IGF0IDB4JXhcbiIsCisJCQkJCSAgICAgKGludClDbWRCbGtQLChpbnQpQmFzZSk7CisJfQorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJXaWxsIHF1ZXVlIGNtZGJsayAweCV4IGF0IDB4JXhcbiIsKGludClDbWRCbGtQLChpbnQpQmFzZSk7CisKKwkqQmFzZSA9IENtZEJsa1A7CisKKwlDbWRCbGtQLT5OZXh0UCA9IE5VTEw7CisKKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKworCXJldHVybiBSSU9fU1VDQ0VTUzsKK30KKworLyoKKyoqIEhlcmUgd2UgZ28gLSBpZiB0aGVyZSBpcyBhbiBlbXB0eSBydXAsIGZpbGwgaXQhCisqKiBtdXN0IGJlIGNhbGxlZCBhdCBzcGxyaW8oKSBvciBoaWdoZXIuCisqLwordm9pZAorUklPUG9sbEhvc3RDb21tYW5kcyhzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBIb3N0ICpIb3N0UCkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOworCXJlZ2lzdGVyIHN0cnVjdCBVbml4UnVwICpVbml4UnVwUDsKKwlzdHJ1Y3QgUEtUICpQYWNrZXRQOworCXVzaG9ydCBSdXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCisJUnVwID0gTUFYX1JVUCtMSU5LU19QRVJfVU5JVDsKKworCWRvIHsJLyogZG8gdGhpcyBsb29wIGZvciBlYWNoIFJVUCAqLworCQkvKgorCQkqKiBsb2NhdGUgdGhlIHJ1cCB3ZSBhcmUgcHJvY2Vzc2luZyAmIGxvY2sgaXQKKwkJKi8KKwkJVW5peFJ1cFAgPSAmSG9zdFAtPlVuaXhSdXBzWy0tUnVwXTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKworCQkvKgorCQkqKiBGaXJzdCBjaGVjayBmb3IgaW5jb21pbmcgY29tbWFuZHM6CisJCSovCisJCWlmICggUldPUkQoVW5peFJ1cFAtPlJ1cFAtPnJ4Y29udHJvbCkgIT0gUlhfUlVQX0lOQUNUSVZFICkgeworCQkJaW50IEZyZWVNZTsKKworCQkJUGFja2V0UCA9KFBLVCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLFJXT1JEKFVuaXhSdXBQLT5SdXBQLT5yeHBrdCkpOworCisJCQlTaG93UGFja2V0KCBEQkdfQ01ELCBQYWNrZXRQICk7CisKKwkJCXN3aXRjaCAoIFJCWVRFKFBhY2tldFAtPmRlc3RfcG9ydCkgKSB7CisJCQkJY2FzZSBCT09UX1JVUDoKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJJbmNvbWluZyBCb290ICVzIHBhY2tldCAnJXgnXG4iLCAKKwkJCQkJCVJCWVRFKFBhY2tldFAtPmxlbikgJiAweDgwID8gIkNvbW1hbmQiOiJEYXRhIiwgCisJCQkJCQkJICAgICBSQllURShQYWNrZXRQLT5kYXRhWzBdKSk7IAorCQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKwkJCQkJRnJlZU1lPSBSSU9Cb290UnVwKHAsIFJ1cCxIb3N0UCxQYWNrZXRQKTsKKwkJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgQ09NTUFORF9SVVA6CisJCQkJCS8qCisJCQkJCSoqIEZyZWUgdGhlIFJVUCBsb2NrIGFzIGxvc3Mgb2YgY2FycmllciBjYXVzZXMgYQorCQkJCQkqKiB0dHlmbHVzaCB3aGljaCB3aWxsIChldmVudHVhbGx5KSBjYWxsIGFub3RoZXIKKwkJCQkJKiogcm91dGluZSB0aGF0IHVzZXMgdGhlIFJVUCBsb2NrLgorCQkJCQkqLworCQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKwkJCQkJRnJlZU1lPSBSSU9Db21tYW5kUnVwKHAsIFJ1cCxIb3N0UCxQYWNrZXRQKTsKKwkJCQkJaWYgKFBhY2tldFAtPmRhdGFbNV0gPT0gTUVNRFVNUCkgeworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJNZW1kdW1wIGZyb20gMHgleCBjb21wbGV0ZVxuIiwKKwkJCQkJCQkJICAgICAqKHVzaG9ydCAqKSAmKFBhY2tldFAtPmRhdGFbNl0pKTsKKwkJCQkJCUhvc3RQLT5Db3B5KCAoY2FkZHJfdCkmKFBhY2tldFAtPmRhdGFbOF0pLCAKKwkJCQkJCQkJKGNhZGRyX3QpcC0+UklPTWVtRHVtcCwgMzIgKTsKKwkJCQkJfQorCQkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBST1VURV9SVVA6CisJCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKwkJCQkJRnJlZU1lID0gUklPUm91dGVSdXAocCwgUnVwLCBIb3N0UCwgUGFja2V0UCApOworCQkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoICZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MgKTsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlVua25vd24gUlVQICVkXG4iLCBSQllURShQYWNrZXRQLT5kZXN0X3BvcnQpKTsKKwkJCQkJRnJlZU1lID0gMTsKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICggRnJlZU1lICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiRnJlZSBwcm9jZXNzZWQgaW5jb21pbmcgY29tbWFuZCBwYWNrZXRcbiIpOworCQkJCXB1dF9mcmVlX2VuZChIb3N0UCxQYWNrZXRQKTsKKworCQkJCVdXT1JEKFVuaXhSdXBQLT5SdXBQLT5yeGNvbnRyb2wgLCBSWF9SVVBfSU5BQ1RJVkUpOworCisJCQkJaWYgKCBSV09SRChVbml4UnVwUC0+UnVwUC0+aGFuZHNoYWtlKT09UEhCX0hBTkRTSEFLRV9TRVQgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSGFuZHNoYWtlIHJ1cCAlZFxuIixSdXApOworCQkJCQlXV09SRChVbml4UnVwUC0+UnVwUC0+aGFuZHNoYWtlLAorCQkJCQkJUEhCX0hBTkRTSEFLRV9TRVR8UEhCX0hBTkRTSEFLRV9SRVNFVCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyoKKwkJKiogSUYgYSBjb21tYW5kIHdhcyBydW5uaW5nIG9uIHRoZSBwb3J0LCAKKwkJKiogYW5kIGl0IGhhcyBjb21wbGV0ZWQsIHRoZW4gdGlkeSBpdCB1cC4KKwkJKi8KKwkJaWYgKCAoQ21kQmxrUCA9IFVuaXhSdXBQLT5DbWRQZW5kaW5nUCkgJiYgLyogQVNTSUdOISAqLworCQkgICAgIChSV09SRChVbml4UnVwUC0+UnVwUC0+dHhjb250cm9sKSA9PSBUWF9SVVBfSU5BQ1RJVkUpKSB7CisJCQkvKgorCQkJKiogd2UgYXJlIGlkbGUuCisJCQkqKiB0aGVyZSBpcyBhIGNvbW1hbmQgaW4gcGVuZGluZy4KKwkJCSoqIFRoZXJlZm9yZSwgdGhpcyBjb21tYW5kIGhhcyBmaW5pc2hlZC4KKwkJCSoqIFNvLCB3YWtldXAgd2hvZXZlciBpcyB3YWl0aW5nIGZvciBpdCAoYW5kIHRlbGwgdGhlbQorCQkJKiogd2hhdCBoYXBwZW5lZCkuCisJCQkqLworCQkJaWYgKCBDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID09IEJPT1RfUlVQICkKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkZyZWUgQm9vdCAlcyBDb21tYW5kIEJsb2NrICcleCdcbiIsIAorCQkJCQkJQ21kQmxrUC0+UGFja2V0LmxlbiAmIDB4ODAgPyAiQ29tbWFuZCI6IkRhdGEiLCAKKwkJCQkJCQkgICAgIENtZEJsa1AtPlBhY2tldC5kYXRhWzBdKTsKKworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDb21tYW5kIDB4JXggY29tcGxldGVkXG4iLChpbnQpQ21kQmxrUCk7CisKKwkJCS8qCisJCQkqKiBDbGVhciB0aGUgUnVwIGxvY2sgdG8gcHJldmVudCBtdXR1YWwgZXhjbHVzaW9uLgorCQkJKi8KKwkJCWlmICggQ21kQmxrUC0+UG9zdEZ1bmNQICkgeworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MpOworCQkJCSgqQ21kQmxrUC0+UG9zdEZ1bmNQKSAoQ21kQmxrUC0+UG9zdEFyZyxDbWRCbGtQKTsKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisJCQl9CisKKwkJCS8qCisJCQkqKiAuLi4uY2xlYXIgdGhlIHBlbmRpbmcgZmxhZy4uLi4KKwkJCSovCisJCQlVbml4UnVwUC0+Q21kUGVuZGluZ1AgPSBOVUxMOworCisJCQkvKgorCQkJKiogLi4uLmFuZCByZXR1cm4gdGhlIGNvbW1hbmQgYmxvY2sgdG8gdGhlIGZyZWVsaXN0LgorCQkJKi8KKwkJCVJJT0ZyZWVDbWRCbGsoIENtZEJsa1AgKTsKKwkJfQorCisJCS8qCisJCSoqIElmIHRoZXJlIGlzIGEgY29tbWFuZCBmb3IgdGhpcyBydXAsIGFuZCB0aGUgcnVwCisJCSoqIGlzIGlkbGUsIHRoZW4gcHJvY2VzcyB0aGUgY29tbWFuZAorCQkqLworCQlpZiAoIChDbWRCbGtQID0gVW5peFJ1cFAtPkNtZHNXYWl0aW5nUCkgJiYgLyogQVNTSUdOISAqLworCQkJKFVuaXhSdXBQLT5DbWRQZW5kaW5nUCA9PSBOVUxMKSAmJgorCQkgICAgIChSV09SRChVbml4UnVwUC0+UnVwUC0+dHhjb250cm9sKSA9PSBUWF9SVVBfSU5BQ1RJVkUpKSB7CisJCQkvKgorCQkJKiogaWYgdGhlIHByZS1mdW5jdGlvbiBpcyBub24temVybywgY2FsbCBpdC4KKwkJCSoqIElmIGl0IHJldHVybnMgUklPX0ZBSUwgdGhlbiBkb24ndAorCQkJKiogc2VuZCB0aGlzIGNvbW1hbmQgeWV0IQorCQkJKi8KKyNpZmRlZiBDSEVDSworCQkJQ2hlY2tDbWRCbGtQIChDbWRCbGtQKTsKKyNlbmRpZgorCQkJaWYgKCAhKENtZEJsa1AtPlByZUZ1bmNQID8KKwkJCQkoKkNtZEJsa1AtPlByZUZ1bmNQKShDbWRCbGtQLT5QcmVBcmcsIENtZEJsa1ApIDogVFJVRSkpIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk5vdCByZWFkeSB0byBzdGFydCBjb21tYW5kIDB4JXhcbiIsKGludClDbWRCbGtQKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiU3RhcnQgbmV3IGNvbW1hbmQgMHgleCBDbWQgYnl0ZSBpcyAweCV4XG4iLAorCQkJCQkJCSAgICAgKGludClDbWRCbGtQLCBDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSk7CisJCQkJLyoKKwkJCQkqKiBXaGFtbXkhIGJsYXQgdGhhdCBwYWNrIQorCQkJCSovCisjaWZkZWYgQ0hFQ0sKKwkJCQlDaGVja1BhY2tldFAgKChQS1QgKilSSU9fUFRSKEhvc3RQLT5DYWRkciwgVW5peFJ1cFAtPlJ1cFAtPnR4cGt0KSk7CisjZW5kaWYKKwkJCQlIb3N0UC0+Q29weSggKGNhZGRyX3QpJkNtZEJsa1AtPlBhY2tldCwgCisJCQkJCVJJT19QVFIoSG9zdFAtPkNhZGRyLCBVbml4UnVwUC0+UnVwUC0+dHhwa3QpLCBzaXplb2YoUEtUKSk7CisKKwkJCQkvKgorCQkJCSoqIHJlbW92ZSB0aGUgY29tbWFuZCBmcm9tIHRoZSBydXAgY29tbWFuZCBxdWV1ZS4uLgorCQkJCSovCisJCQkJVW5peFJ1cFAtPkNtZHNXYWl0aW5nUCA9IENtZEJsa1AtPk5leHRQOworCisJCQkJLyoKKwkJCQkqKiAuLi5hbmQgcGxhY2UgaXQgb24gdGhlIHBlbmRpbmcgcG9zaXRpb24uCisJCQkJKi8KKwkJCQlVbml4UnVwUC0+Q21kUGVuZGluZ1AgPSBDbWRCbGtQOworCisJCQkJLyoKKwkJCQkqKiBzZXQgdGhlIGNvbW1hbmQgcmVnaXN0ZXIKKwkJCQkqLworCQkJCVdXT1JEKFVuaXhSdXBQLT5SdXBQLT50eGNvbnRyb2wsVFhfUEFDS0VUX1JFQURZKTsKKworCQkJCS8qCisJCQkJKiogdGhlIGNvbW1hbmQgYmxvY2sgd2lsbCBiZSBmcmVlZAorCQkJCSoqIHdoZW4gdGhlIGNvbW1hbmQgaGFzIGJlZW4gcHJvY2Vzc2VkLgorCQkJCSovCisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKwl9IHdoaWxlICggUnVwICk7Cit9CisKK2ludAorUklPV0ZsdXNoTWFyayhpbnQgaVBvcnRQLCBzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQKQoreworCXN0cnVjdCBQb3J0ICoJUG9ydFAgPSAoc3RydWN0IFBvcnQgKilpUG9ydFA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKyNpZmRlZiBDSEVDSworCUNoZWNrUG9ydFAoIFBvcnRQICk7CisjZW5kaWYKKwlQb3J0UC0+V2ZsdXNoRmxhZysrOworCVBvcnRQLT5NYWdpY0ZsYWdzIHw9IE1BR0lDX0ZMVVNIOworCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCXJldHVybiBSSU9VblVzZSggaVBvcnRQLCBDbWRCbGtQICk7Cit9CisKK2ludAorUklPUkZsdXNoRW5hYmxlKGludCBpUG9ydFAsIHN0cnVjdCBDbWRCbGsgKkNtZEJsa1ApCit7CisJc3RydWN0IFBvcnQgKglQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKWlQb3J0UDsKKwlQS1QgKlBhY2tldFA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworCXdoaWxlICggY2FuX3JlbW92ZV9yZWNlaXZlKCZQYWNrZXRQLCBQb3J0UCkgKSB7CisJCXJlbW92ZV9yZWNlaXZlKFBvcnRQKTsKKwkJU2hvd1BhY2tldChEQkdfUFJPQywgUGFja2V0UCApOworCQlwdXRfZnJlZV9lbmQoIFBvcnRQLT5Ib3N0UCwgUGFja2V0UCApOworCX0KKworCWlmICggUldPUkQoUG9ydFAtPlBoYlAtPmhhbmRzaGFrZSk9PVBIQl9IQU5EU0hBS0VfU0VUICkgeworCQkvKgorCQkqKiBNQUdJQyEgKEJhc2ljYWxseSwgaGFuZHNoYWtlIHRoZSBSWCBidWZmZXIsIHNvIHRoYXQKKwkJKiogdGhlIFJUQXMgdXBzdHJlYW0gY2FuIGJlIHJlLWVuYWJsZWQuKQorCQkqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlV0aWw6IFNldCBSWCBoYW5kc2hha2UgYml0XG4iKTsKKwkJV1dPUkQoUG9ydFAtPlBoYlAtPmhhbmRzaGFrZSwgUEhCX0hBTkRTSEFLRV9TRVR8UEhCX0hBTkRTSEFLRV9SRVNFVCk7CisJfQorCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCXJldHVybiBSSU9VblVzZSggaVBvcnRQLCBDbWRCbGtQICk7Cit9CisKK2ludAorUklPVW5Vc2UoaW50IGlQb3J0UCwgc3RydWN0IENtZEJsayAqQ21kQmxrUCkKK3sKKwlzdHJ1Y3QgUG9ydCAqCVBvcnRQID0gKHN0cnVjdCBQb3J0ICopaVBvcnRQOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrUG9ydFAoIFBvcnRQICk7CisjZW5kaWYKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkRlY3JlbWVudCBpbiB1c2UgY291bnQgZm9yIHBvcnRcbiIpOworCisJaWYgKFBvcnRQLT5JblVzZSkgeworCQlpZiAoIC0tUG9ydFAtPkluVXNlICE9IE5PVF9JTlVTRSApIHsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJLyoKKwkqKiBXaGlsZSBQb3J0UC0+SW5Vc2UgaXMgc2V0IChpLmUuIGEgcHJlZW1wdGl2ZSBjb21tYW5kIGhhcyBiZWVuIHNlbnQgdG8KKwkqKiB0aGUgUlRBIGFuZCBpcyBhd2FpdGluZyBjb21wbGV0aW9uKSwgYW55IHRyYW5zbWl0IGRhdGEgaXMgcHJldmVudGVkIGZyb20KKwkqKiBiZWluZyB0cmFuc2ZlcnJlZCBmcm9tIHRoZSB3cml0ZSBxdWV1ZSBpbnRvIHRoZSB0cmFuc21pdCBwYWNrZXRzCisJKiogKGFkZF90cmFuc21pdCkgYW5kIG5vIGZ1cnRodXIgdHJhbnNtaXQgaW50ZXJydXB0IHdpbGwgYmUgc2VudCBmb3IgdGhhdAorCSoqIGRhdGEuIFRoZSBuZXh0IGludGVycnVwdCB3aWxsIG9jY3VyIHVwIHRvIDUwMG1zIGxhdGVyIChSSU9JbnRyIGlzIGNhbGxlZAorCSoqIHR3aWNlIGEgc2Vjb25kIGFzIGEgc2FmdGV5IG1lYXN1cmUpLiBUaGlzIHdhcyB0aGUgY2FzZSB3aGVuIGtlcm1pdCB3YXMKKwkqKiB1c2VkIHRvIHNlbmQgZGF0YSBpbnRvIGEgUklPIHBvcnQuIEFmdGVyIGVhY2ggcGFja2V0IHdhcyBzZW50LCBUQ0ZMU0gKKwkqKiB3YXMgY2FsbGVkIHRvIGZsdXNoIHRoZSByZWFkIHF1ZXVlIHByZWVtcHRpdmVseS4gUG9ydFAtPkluVXNlIHdhcworCSoqIGluY3JlbWVudGVkLCB0aGVyZWJ5IGJsb2NraW5nIHRoZSA2IGJ5dGUgYWNrbm93bGVkZ2VtZW50IHBhY2tldAorCSoqIHRyYW5zbWl0dGVkIGJhY2suIFRoaXMgYWNrbm93bGVkZ21lbnQgaHVuZyBhcm91bmQgZm9yIDUwMG1zIGJlZm9yZQorCSoqIGJlaW5nIHNlbnQsIHRodXMgcmVkdWNpbmcgaW5wdXQgcGVyZm9ybWFuY2Ugc3Vic3RhbnRpYWxseSEuCisJKiogV2hlbiBQb3J0UC0+SW5Vc2UgYmVjb21lcyBOT1RfSU5VU0UsIHdlIG11c3QgZW5zdXJlIHRoYXQgYW55IGRhdGEKKwkqKiBoYW5naW5nIGFyb3VuZCBpbiB0aGUgdHJhbnNtaXQgYnVmZmVyIGlzIHNlbnQgaW1tZWRpYXRlbHkuCisJKi8KKwlXV09SRChQb3J0UC0+SG9zdFAtPlBhcm1NYXBQLT50eF9pbnRyLCAxKTsKKwkvKiBXaGF0IHRvIGRvIGhlcmUgLi4KKwl3YWtldXAoIChjYWRkcl90KSYoUG9ydFAtPkluVXNlKSApOworCSovCisJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK1Nob3dQYWNrZXQodWludCBGbGFncywgc3RydWN0IFBLVCAqUGFja2V0UCkKK3sKK30KKworLyoKKyoqIAorKiogSG93IHRvIHVzZSB0aGlzIGZpbGU6CisqKiAKKyoqIFRvIHNlbmQgYSBjb21tYW5kIGRvd24gYSBydXAsIHlvdSBuZWVkIHRvIGFsbG9jYXRlIGEgY29tbWFuZCBibG9jaywgZmlsbAorKiogaW4gdGhlIHBhY2tldCBpbmZvcm1hdGlvbiwgZmlsbCBpbiB0aGUgY29tbWFuZCBudW1iZXIsIGZpbGwgaW4gdGhlIHByZS0KKyoqIGFuZCBwb3N0LSBmdW5jdGlvbnMgYW5kIGFyZ3VtZW50cywgYW5kIHRoZW4gYWRkIHRoZSBjb21tYW5kIGJsb2NrIHRvIHRoZQorKiogcXVldWUgb2YgY29tbWFuZCBibG9ja3MgZm9yIHRoZSBwb3J0IGluIHF1ZXN0aW9uLiBXaGVuIHRoZSBwb3J0IGlzIGlkbGUsCisqKiB0aGVuIHRoZSBwcmUtZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQuIElmIHRoaXMgcmV0dXJucyBSSU9fRkFJTCB0aGVuIHRoZQorKiogY29tbWFuZCB3aWxsIGJlIHJlLXF1ZXVlZCBhbmQgdHJpZWQgYWdhaW4gYXQgYSBsYXRlciBkYXRlIChwcm9iYWJseSBpbiBvbmUKKyoqIGNsb2NrIHRpY2spLiBJZiB0aGUgcHJlLWZ1bmN0aW9uIHJldHVybnMgTk9UIFJJT19GQUlMLCB0aGVuIHRoZSBjb21tYW5kCisqKiBwYWNrZXQgd2lsbCBiZSBxdWV1ZWQgb24gdGhlIFJVUCwgYW5kIHRoZSB0eGNvbnRyb2wgZmllbGQgc2V0IHRvIHRoZQorKiogY29tbWFuZCBudW1iZXIuIFdoZW4gdGhlIHR4Y29udHJvbCBmaWVsZCBoYXMgY2hhbmdlZCBmcm9tIGJlaW5nIHRoZQorKiogY29tbWFuZCBudW1iZXIsIHRoZW4gdGhlIHBvc3QtZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQsIHdpdGggdGhlIGFyZ3VtZW50CisqKiBzcGVjaWZpZWQgZWFybGllciwgYSBwb2ludGVyIHRvIHRoZSBjb21tYW5kIGJsb2NrLCBhbmQgdGhlIHZhbHVlIG9mCisqKiB0eGNvbnRyb2wuCisqKiAKKyoqIFRvIGFsbG9jYXRlIGEgY29tbWFuZCBibG9jaywgY2FsbCBSSU9HZXRDbWRCbGsoKS4gVGhpcyByZXR1cm5zIGEgcG9pbnRlcgorKiogdG8gdGhlIGNvbW1hbmQgYmxvY2sgc3RydWN0dXJlIGFsbG9jYXRlZCwgb3IgTlVMTCBpZiB0aGVyZSBhcmVuJ3QgYW55LgorKiogVGhlIGJsb2NrIHdpbGwgaGF2ZSBiZWVuIHplcm9lZCBmb3IgeW91LgorKiogCisqKiBUaGUgc3RydWN0dXJlIGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkczoKKyoqIAorKiogc3RydWN0IENtZEJsaworKiogeworKioJIHN0cnVjdCBDbWRCbGsgKk5leHRQOwkJICAqKiBQb2ludGVyIHRvIG5leHQgY29tbWFuZCBibG9jayAgICoqCisqKgkgc3RydWN0IFBLVAkgUGFja2V0OwkJKiogQSBwYWNrZXQsIHRvIGNvcHkgdG8gdGhlIHJ1cAkqKgorKioJCQlpbnQJICgqUHJlRnVuY1ApKCk7ICAqKiBUaGUgZnVuYyB0byBjYWxsIHRvIGNoZWNrIGlmIE9LICoqCisqKgkJCWludAkgUHJlQXJnOwkJKiogVGhlIGFyZyBmb3IgdGhlIGZ1bmMJCQkqKgorKioJCQlpbnQJICgqUG9zdEZ1bmNQKSgpOyAqKiBUaGUgZnVuYyB0byBjYWxsIHdoZW4gY29tcGxldGVkICoqCisqKgkJCWludAkgUG9zdEFyZzsJICAgKiogVGhlIGFyZyBmb3IgdGhlIGZ1bmMJCQkqKgorKiogfTsKKyoqIAorKiogWW91IG5lZWQgdG8gZmlsbCBpbiBBTEwgZmllbGRzIEVYQ0VQVCBOZXh0UCwgd2hpY2ggaXMgdXNlZCB0byBsaW5rIHRoZQorKiogYmxvY2tzIHRvZ2V0aGVyIGVpdGhlciBvbiB0aGUgZnJlZSBsaXN0IG9yIG9uIHRoZSBSdXAgbGlzdC4KKyoqIAorKiogUGFja2V0IGlzIGFuIGFjdHVhbCBwYWNrZXQgc3RydWN0dXJlIHRvIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBwYWNrZXQKKyoqIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWFuZC4gWW91IG5lZWQgdG8gZmlsbCBpbiBldmVyeXRoaW5nLAorKiogYXMgdGhlIGNvbW1hbmQgcHJvY2Vzc29yZSBkb2Vzbid0IHByb2Nlc3MgdGhlIGNvbW1hbmQgcGFja2V0IGluIGFueSB3YXkuCisqKiAKKyoqIFRoZSBQcmVGdW5jUCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBwYWNrZXQgaXMgZW5xdWV1ZWQgb24gdGhlIGhvc3QgcnVwLgorKiogUHJlRnVuY1AgaXMgY2FsbGVkIGFzICgqUHJlRnVuY1ApKFByZUFyZywgQ21kQmxrUCk7LiBQcmVGdW5jUCBtdXN0CisqKiByZXR1cm4gIVJJT19GQUlMIHRvIGhhdmUgdGhlIHBhY2tldCBxdWV1ZWQgb24gdGhlIHJ1cCwgYW5kIFJJT19GQUlMCisqKiBpZiB0aGUgcGFja2V0IGlzIE5PVCB0byBiZSBxdWV1ZWQuCisqKiAKKyoqIFRoZSBQb3N0RnVuY1AgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbW1hbmQgaGFzIGNvbXBsZXRlZC4gSXQgaXMgY2FsbGVkCisqKiBhcyAoKlBvc3RGdW5jUCkoUG9zdEFyZywgQ21kQmxrUCwgdHhjb250cm9sKTsuIFBvc3RGdW5jUCBpcyBub3QgZXhwZWN0ZWQKKyoqIHRvIHJldHVybiBhIHZhbHVlLiBQb3N0RnVuY1AgZG9lcyBOT1QgbmVlZCB0byBmcmVlIHRoZSBjb21tYW5kIGJsb2NrLAorKiogYXMgdGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgUG9zdEZ1bmNQIHJldHVybnMuCisqKiAKKyoqIE9uY2UgdGhlIGNvbW1hbmQgYmxvY2sgaGFzIGJlZW4gZmlsbGVkIGluLCBpdCBpcyBhdHRhY2hlZCB0byB0aGUgY29ycmVjdAorKiogcXVldWUgYnkgY2FsbGluZyBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIFJ1cCwgQ21kQmxrUCApIHdoZXJlIEhvc3RQIGlzCisqKiBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBIb3N0LCBSdXAgaXMgdGhlIE5VTUJFUiBvZiB0aGUgcnVwIChOT1QgYSBwb2ludGVyCisqKiB0byBpdCEpLCBhbmQgQ21kQmxrUCBpcyB0aGUgcG9pbnRlciB0byB0aGUgY29tbWFuZCBibG9jayBhbGxvY2F0ZWQgdXNpbmcKKyoqIFJJT0dldENtZEJsaygpLgorKiogCisqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9jdHJsLmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2N0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGQxYTIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9jdHJsLmMKQEAgLTAsMCArMSwxODY5IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW9jdHJsLmMKKyoqCVNJRAkJOiAxLjMKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDEwOjMzOjQyCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDEwOjMzOjQ5CisqKgorKiogIGlkZW50IEAoIylyaW9jdHJsLmMJMS4zCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvY3RybF9jX3NjY3NfID0gIkAoIylyaW9jdHJsLmMJMS4zIjsKKyNlbmRpZgorCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKworCisjaW5jbHVkZSAibGludXhfY29tcGF0LmgiCisjaW5jbHVkZSAicmlvX2xpbnV4LmgiCisjaW5jbHVkZSAidHlwZGVmLmgiCisjaW5jbHVkZSAicGt0LmgiCisjaW5jbHVkZSAiZGFlbW9uLmgiCisjaW5jbHVkZSAicmlvLmgiCisjaW5jbHVkZSAicmlvc3BhY2UuaCIKKyNpbmNsdWRlICJ0b3AuaCIKKyNpbmNsdWRlICJjbWRwa3QuaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJyaW90eXBlcy5oIgorI2luY2x1ZGUgInJ1cC5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyaW9kcnZyLmgiCisjaW5jbHVkZSAicmlvaW5mby5oIgorI2luY2x1ZGUgImZ1bmMuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2luY2x1ZGUgInBhcm1tYXAuaCIKKyNpbmNsdWRlICJ1bml4cnVwLmgiCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJwaGIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiY21kYmxrLmgiCisjaW5jbHVkZSAicm91dGUuaCIKKyNpbmNsdWRlICJjb250cm9sLmgiCisjaW5jbHVkZSAiY2lycnVzLmgiCisjaW5jbHVkZSAicmlvaW9jdGwuaCIKKworCitzdGF0aWMgc3RydWN0IExwYlJlcQkgTHBiUmVxOworc3RhdGljIHN0cnVjdCBSdXBSZXEJIFJ1cFJlcTsKK3N0YXRpYyBzdHJ1Y3QgUG9ydFJlcQlQb3J0UmVxOworc3RhdGljIHN0cnVjdCBIb3N0UmVxCUhvc3RSZXE7CitzdGF0aWMgc3RydWN0IEhvc3REcFJhbSBIb3N0RHBSYW07CitzdGF0aWMgc3RydWN0IERlYnVnQ3RybCBEZWJ1Z0N0cmw7CitzdGF0aWMgc3RydWN0IE1hcAkJIE1hcEVudDsKK3N0YXRpYyBzdHJ1Y3QgUG9ydFNldHVwIFBvcnRTZXR1cDsKK3N0YXRpYyBzdHJ1Y3QgRG93bkxvYWQJRG93bkxvYWQ7CitzdGF0aWMgc3RydWN0IFNlbmRQYWNrICBTZW5kUGFjazsKKy8qIHN0YXRpYyBzdHJ1Y3QgU3RyZWFtSW5mbwlTdHJlYW1JbmZvOyAqLworLyogc3RhdGljIGNoYXIgbW9kZW10YWJsZVtSSU9fUE9SVFNdOyAqLworc3RhdGljIHN0cnVjdCBTcGVjaWFsUnVwQ21kIFNwZWNpYWxSdXBDbWQ7CitzdGF0aWMgc3RydWN0IFBvcnRQYXJhbXMgUG9ydFBhcmFtczsKK3N0YXRpYyBzdHJ1Y3QgcG9ydFN0YXRzIHBvcnRTdGF0czsKKworc3RhdGljIHN0cnVjdCBTdWJDbWRTdHJ1Y3QgeworCXVzaG9ydAlIb3N0OworCXVzaG9ydAlSdXA7CisJdXNob3J0CVBvcnQ7CisJdXNob3J0CUFkZHI7Cit9IFN1YkNtZDsKKworc3RydWN0IFBvcnRUdHkgeworCXVpbnQJCXBvcnQ7CisJc3RydWN0IHR0eXN0YXRpY3MJVHR5OworfTsKKworc3RhdGljIHN0cnVjdCBQb3J0VHR5CVBvcnRUdHk7Cit0eXBlZGVmIHN0cnVjdCB0dHlzdGF0aWNzIFRFUk1JTzsKKworLyoKKyoqIFRoaXMgdGFibGUgaXMgdXNlZCB3aGVuIHRoZSBjb25maWcucmlvIGRvd25sb2FkcyBiaW4gY29kZSB0byB0aGUKKyoqIGRyaXZlci4gV2UgaW5kZXggdGhlIHRhYmxlIHVzaW5nIHRoZSBwcm9kdWN0IGNvZGUsIDAtRiwgYW5kIGNhbGwKKyoqIHRoZSBmdW5jdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBlbnRyeSwgcGFzc2luZyB0aGUgaW5mb3JtYXRpb24KKyoqIGFib3V0IHRoZSBib290LgorKiogVGhlIFJJT0Jvb3RDb2RlVU5LTk9XTiBlbnRyeSBpcyB0aGVyZSB0byBwb2xpdGVseSB0ZWxsIHRoZSBjYWxsaW5nCisqKiBwcm9jZXNzIHRvIGJvZyBvZmYuCisqLworc3RhdGljIGludCAKKygqUklPQm9vdFRhYmxlW01BWF9QUk9EVUNUXSkoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBEb3duTG9hZCAqKSA9Cit7CisvKiAwICovCVJJT0Jvb3RDb2RlSE9TVCwJLyogSG9zdCBDYXJkICovCisvKiAxICovCVJJT0Jvb3RDb2RlUlRBLAkJLyogUlRBICovCit9OworCisjZGVmaW5lIGRydl9tYWtlZGV2KG1haiwgbWluKSAoKCgodWludCkgbWFqICYgMHhmZikgPDwgOCkgfCAoKHVpbnQpIG1pbiAmIDB4ZmYpKQorCitpbnQgY29weWluIChpbnQgYXJnLCBjYWRkcl90IGRwLCBpbnQgc2l6KQoreworICBpbnQgcnY7CisKKyAgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ29weWluZyAlZCBieXRlcyBmcm9tIHVzZXIgJXAgdG8gJXAuXG4iLCBzaXosICh2b2lkICopYXJnLCBkcCk7CisgIHJ2ID0gY29weV9mcm9tX3VzZXIgKGRwLCAodm9pZCAqKWFyZywgc2l6KTsKKyAgaWYgKHJ2KSByZXR1cm4gQ09QWUZBSUw7CisgIGVsc2UgcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IGNvcHlvdXQgKGNhZGRyX3QgZHAsIGludCBhcmcsIGludCBzaXopCit7CisgIGludCBydjsKKworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDb3B5aW5nICVkIGJ5dGVzIHRvIHVzZXIgJXAgZnJvbSAlcC5cbiIsIHNpeiwgKHZvaWQgKilhcmcsIGRwKTsKKyAgcnYgPSBjb3B5X3RvX3VzZXIgKCh2b2lkICopYXJnLCBkcCwgc2l6KTsKKyAgaWYgKHJ2KSByZXR1cm4gQ09QWUZBSUw7CisgIGVsc2UgcmV0dXJuIHJ2OworfQorCitpbnQKK3Jpb2NvbnRyb2wocCwgZGV2LCBjbWQsIGFyZywgc3UpCitzdHJ1Y3QgcmlvX2luZm8JKiBwOworZGV2X3QJCWRldjsKK2ludAkJY21kOworY2FkZHJfdAkJYXJnOworaW50CQlzdTsKK3sKKwl1aW50CUhvc3Q7CS8qIGxlYXZlIG1lIHVuc2lnbmVkISAqLworCXVpbnQJcG9ydDsJLyogYW5kIG1lISAqLworCXN0cnVjdCBIb3N0CSpIb3N0UDsKKwl1c2hvcnQJbG9vcDsKKwlpbnQJCUVudHJ5OworCXN0cnVjdCBQb3J0CSpQb3J0UDsKKwlQS1QJKlBhY2tldFA7CisJaW50CQlyZXR2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJZnVuY19lbnRlciAoKTsKKwkKKwkvKiBDb25mdXNlIHRoZSBjb21waWxlciB0byB0aGluayB0aGF0IHdlJ3ZlIGluaXRpYWxpemVkIHRoZXNlICovCisJSG9zdD0wOworCVBvcnRQID0gTlVMTDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgImNvbnRyb2wgaW9jdGwgY21kOiAweCV4IGFyZzogMHgleFxuIiwgY21kLCAoaW50KWFyZyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCQkvKgorCQkqKiBSSU9fU0VUX1RJTUVSCisJCSoqCisJCSoqIENoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGhvc3QgY2FyZCBpbnRlcnJ1cHQgdGltZXIuCisJCSoqIElmIHRoZSBob3N0IGNhcmQgbnVtYmVyIGlzIC0xIHRoZW4gYWxsIGhvc3QgY2FyZHMgYXJlIGNoYW5nZWQKKwkJKiogb3RoZXJ3aXNlIGp1c3QgdGhlIHNwZWNpZmllZCBob3N0IGNhcmQgd2lsbCBiZSBjaGFuZ2VkLgorCQkqLworCQljYXNlIFJJT19TRVRfVElNRVI6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VUX1RJTUVSIHRvICVkbXNcbiIsICh1aW50KWFyZyk7CisJCQl7CisJCQkJaW50IGhvc3QsIHZhbHVlOworCQkJCWhvc3QgPSAodWludClhcmcgPj4gMTY7CisJCQkJdmFsdWUgPSAodWludClhcmcgJiAweDAwMDBmZmZmOworCQkJCWlmIChob3N0ID09IC0xKSB7CisJCQkJCWZvciAoaG9zdCA9IDA7IGhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgaG9zdCsrKSB7CisJCQkJCQlpZiAocC0+UklPSG9zdHNbaG9zdF0uRmxhZ3MgPT0gUkNfUlVOTklORykgeworCQkJCQkJCVdXT1JEKHAtPlJJT0hvc3RzW2hvc3RdLlBhcm1NYXBQLT50aW1lciAsIHZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoaG9zdCA+PSBwLT5SSU9OdW1Ib3N0cykgeworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIHAtPlJJT0hvc3RzW2hvc3RdLkZsYWdzID09IFJDX1JVTk5JTkcgKSB7CisJCQkJCQlXV09SRChwLT5SSU9Ib3N0c1tob3N0XS5QYXJtTWFwUC0+dGltZXIgLCB2YWx1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFJJT19JREVOVElGWV9EUklWRVI6CisJCQkvKgorCQkJKiogMTUuMTAuMTk5OCBBUkcgLSBFU0lMIDA3NjAgcGFydCBmaXgKKwkJCSoqIEFkZGVkIGRyaXZlciBpZGVudCBzdHJpbmcgb3V0cHV0LgorCQkJKioKKyNpZm5kZWYgX19USElTX1JFTEVBU0VfXworI3dhcm5pbmcgRHJpdmVyIFZlcnNpb24gc3RyaW5nIG5vdCBkZWZpbmVkICEKKyNlbmRpZgorCQkJY3ByaW50ZigiJXMgJXMgJXMgJXNcbiIsCisJCQkJUklPX0RSVl9TVFIsCisJCQkJX19USElTX1JFTEVBU0VfXywKKwkJCQlfX0RBVEVfXywgX19USU1FX18gKTsKKworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBSSU9fRElTUExBWV9IT1NUX0NGRzoKKwkJCSoqCisJCQkqKiAxNS4xMC4xOTk4IEFSRyAtIEVTSUwgMDc2MCBwYXJ0IGZpeAorCQkJKiogQWRkZWQgZHJpdmVyIGhvc3QgY2FyZCBpZGVudCBzdHJpbmcgb3V0cHV0LgorCQkJKioKKwkJCSoqIE5vdGUgdGhhdCB0aGUgb25seSB0eXBlcyBjdXJyZW50bHkgc3VwcG9ydGVkCisJCQkqKiBhcmUgSVNBIGFuZCBQQ0kuIEFsc28gdGhpcyBkcml2ZXIgZG9lcyBub3QKKwkJCSoqICh5ZXQpIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIE9sZCBQQ0kgY2FyZAorCQkJKiogYW5kIHRoZSBKZXQgUENJIGNhcmQuIEluIGZhY3QgSSB0aGluayB0aGlzCisJCQkqKiBkcml2ZXIgb25seSBzdXBwb3J0cyBKRVQgUENJICEKKwkJCSoqCisKKwkJCWZvciAoSG9zdCA9IDA7IEhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgSG9zdCsrKQorCQkJeworCQkJCUhvc3RQID0gJihwLT5SSU9Ib3N0c1tIb3N0XSk7CisKKwkJCQlzd2l0Y2ggKCBIb3N0UC0+VHlwZSApCisJCQkJeworCQkJCSAgICBjYXNlIFJJT19BVCA6CisJCQkJCXN0cmNweSggaG9zdF90eXBlLCBSSU9fQVRfSE9TVF9TVFIgKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkgICAgY2FzZSBSSU9fUENJIDoKKwkJCQkJc3RyY3B5KCBob3N0X3R5cGUsIFJJT19QQ0lfSE9TVF9TVFIgKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkgICAgZGVmYXVsdCA6CisJCQkJCXN0cmNweSggaG9zdF90eXBlLCAiVW5rbm93biIgKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY3ByaW50ZigKKwkJCQkgICJSSU8gSG9zdCAlZCAtIFR5cGU6JXMgQWRkcjolWCBJUlE6JWRcbiIsCisJCQkJCUhvc3QsIGhvc3RfdHlwZSwKKwkJCQkJKHVpbnQpSG9zdFAtPlBhZGRyUCwKKwkJCQkJKGludClIb3N0UC0+SXZlYyAtIDMyICApOworCQkJfQorCQkJcmV0dXJuIDA7CisJCQkqKgorCQkJKi8KKworCQljYXNlIFJJT19GT0FEX1JUQToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19GT0FEX1JUQVxuIik7CisJCQlyZXR1cm4gUklPQ29tbWFuZFJ0YShwLCAodWludClhcmcsIFJJT0ZvYWRSdGEpOworCisJCWNhc2UgUklPX1pPTUJJRV9SVEE6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fWk9NQklFX1JUQVxuIik7CisJCQlyZXR1cm4gUklPQ29tbWFuZFJ0YShwLCAodWludClhcmcsIFJJT1pvbWJpZVJ0YSk7CisKKwkJY2FzZSBSSU9fSURFTlRJRllfUlRBOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0lERU5USUZZX1JUQVxuIik7CisJCQlyZXR1cm4gUklPSWRlbnRpZnlSdGEocCwgYXJnKTsKKworCQljYXNlIFJJT19LSUxMX05FSUdIQk9VUjoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19LSUxMX05FSUdIQk9VUlxuIik7CisJCQlyZXR1cm4gUklPS2lsbE5laWdoYm91cihwLCBhcmcpOworCisJCWNhc2UgU1BFQ0lBTF9SVVBfQ01EOgorCQkJeworCQkJCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJTUEVDSUFMX1JVUF9DTURcbiIpOworCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZTcGVjaWFsUnVwQ21kLCAKKwkJCQkJCQlzaXplb2YoU3BlY2lhbFJ1cENtZCkpID09IENPUFlGQUlMICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJTUEVDSUFMX1JVUF9DTUQgY29weSBmYWlsZWRcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCSAJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJQ21kQmxrUCA9IFJJT0dldENtZEJsaygpOworCQkJCWlmICggIUNtZEJsa1AgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlNQRUNJQUxfUlVQX0NNRCBHZXRDbWRCbGsgZmFpbGVkXG4iKTsKKwkJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJQ21kQmxrUC0+UGFja2V0ID0gU3BlY2lhbFJ1cENtZC5QYWNrZXQ7CisJCQkJaWYgKCBTcGVjaWFsUnVwQ21kLkhvc3QgPj0gcC0+UklPTnVtSG9zdHMgKQorCQkJCQlTcGVjaWFsUnVwQ21kLkhvc3QgPSAwOworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBzcGVjaWFsIHJ1cCBjb21tYW5kIGZvciBob3N0ICVkIHJ1cCAlZFxuIiwKKwkJCQkJCVNwZWNpYWxSdXBDbWQuSG9zdCwgU3BlY2lhbFJ1cENtZC5SdXBOdW0pOworCQkJCQlpZiAoUklPUXVldWVDbWRCbGsoJnAtPlJJT0hvc3RzW1NwZWNpYWxSdXBDbWQuSG9zdF0sIAorCQkJCQkJCVNwZWNpYWxSdXBDbWQuUnVwTnVtLCBDbWRCbGtQKSA9PSBSSU9fRkFJTCkgeworCQkJCQkJY3ByaW50ZigiRkFJTEVEIFRPIFFVRVVFIFNQRUNJQUwgUlVQIENPTU1BTkRcbiIpOworCQkJCQl9CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJY2FzZSBSSU9fREVCVUdfTUVNOgorI2lmZGVmIERFQlVHX01FTV9TVVBQT1JUCitSSU9fREVCVUdfQ1RSTCwgCQkJCWlmIChzdSkKKwkJCQkJcmV0dXJuIHJpb19SSU9EZWJ1Z01lbW9yeShSSU9fREVCVUdfQ1RSTCwgYXJnKTsKKwkJCQllbHNlCisjZW5kaWYKKwkJCQkJcmV0dXJuIC1FUEVSTTsKKworCQkJY2FzZSBSSU9fQUxMX01PREVNOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19BTExfTU9ERU1cbiIpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gSU9DVExfQ09NTUFORF9VTktOT1dOOworCQkJCXJldHVybiAtRUlOVkFMOworCisJCQljYXNlIFJJT19HRVRfVEFCTEU6CisJCQkJLyoKKwkJCQkqKiBSZWFkIHRoZSByb3V0aW5nIHRhYmxlIGZyb20gdGhlIGRldmljZSBkcml2ZXIgdG8gdXNlciBzcGFjZQorCQkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVF9UQUJMRVxuIik7CisKKwkJCQlpZiAoKHJldHZhbCA9IFJJT0FwZWwocCkpICE9IDApCisJCSAJCQlyZXR1cm4gcmV0dmFsOworCisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpcC0+UklPQ29ubmVjdFRhYmxlLCAoaW50KWFyZywKKwkJCQkJCVRPVEFMX01BUF9FTlRSSUVTKnNpemVvZihzdHJ1Y3QgTWFwKSkgPT0gQ09QWUZBSUwpIHsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfVEFCTEUgY29weSBmYWlsZWRcbiIpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJIAkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKworCQkJCXsKKwkJCQkJaW50IGVudHJ5OworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICAiKioqKipcbk1BUCBFTlRSSUVTXG4iKTsKKwkJCQkJZm9yICggZW50cnk9MDsgZW50cnk8VE9UQUxfTUFQX0VOVFJJRVM7IGVudHJ5KysgKQorCQkJCQl7CisJCQkJCSAgaWYgKChwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLklEID09IDApICYmCisJCQkJCSAgICAgIChwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLkhvc3RVbmlxdWVOdW0gPT0gMCkgJiYKKwkJCQkJICAgICAgKHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uUnRhVW5pcXVlTnVtID09IDApKSBjb250aW51ZTsKKwkJCQkJICAgICAgCisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuSG9zdFVuaXF1ZU51bSA9IDB4JXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLkhvc3RVbmlxdWVOdW0gKTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5SdGFVbmlxdWVOdW0gPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5SdGFVbmlxdWVOdW0gKTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5JRCA9IDB4JXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLklEICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuSUQyID0gMHgleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uSUQyICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuRmxhZ3MgPSAweCV4XG4iLCBlbnRyeSwgKGludClwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLkZsYWdzICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuU3lzUG9ydCA9IDB4JXhcbiIsIGVudHJ5LCAoaW50KXAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uU3lzUG9ydCApOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlRvcFswXS5Vbml0ID0gJXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzBdLlVuaXQgKTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5Ub3BbMF0uTGluayA9ICV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVswXS5MaW5rICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzFdLlVuaXQgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMV0uVW5pdCApOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlRvcFsxXS5MaW5rID0gJXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzFdLkxpbmsgKTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5Ub3BbMl0uVW5pdCA9ICV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVsyXS5Vbml0ICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzJdLkxpbmsgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMl0uTGluayApOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlRvcFszXS5Vbml0ID0gJXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzNdLlVuaXQgKTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5Ub3BbNF0uTGluayA9ICV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVszXS5MaW5rICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuTmFtZSA9ICVzXG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5OYW1lICk7CisJCQkJCX0KKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAgIioqKioqXG5FTkQgTUFQIEVOVFJJRVNcbiIpOworCQkJCX0KKwkJCQlwLT5SSU9RdWlja0NoZWNrID0gTk9UX0NIQU5HRUQ7CS8qIGEgdGFibGUgaGFzIGJlZW4gZ290dGVuICovCisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX1BVVF9UQUJMRToKKwkJCQkvKgorCQkJCSoqIFdyaXRlIHRoZSByb3V0aW5nIHRhYmxlIHRvIHRoZSBkZXZpY2UgZHJpdmVyIGZyb20gdXNlciBzcGFjZQorCQkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1BVVF9UQUJMRVxuIik7CisKKwkJCQlpZiAoICFzdSApIHsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfVEFCTEUgIVJvb3RcbiIpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJIAkJCXJldHVybiAtRVBFUk07CisJCQkJfQorCQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmcC0+UklPQ29ubmVjdFRhYmxlWzBdLCAKKwkJCQkJVE9UQUxfTUFQX0VOVFJJRVMqc2l6ZW9mKHN0cnVjdCBNYXApICkgPT0gQ09QWUZBSUwgKSB7CisJCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUFVUX1RBQkxFIGNvcHkgZmFpbGVkXG4iKTsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJIAkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJCXsKKwkJCQkJaW50IGVudHJ5OworCQkJCQlyaW9fZHByaW50KFJJT19ERUJVR19DVFJMLCAgKCIqKioqKlxuTUFQIEVOVFJJRVNcbiIpICk7CisJCQkJCWZvciAoIGVudHJ5PTA7IGVudHJ5PFRPVEFMX01BUF9FTlRSSUVTOyBlbnRyeSsrICkKKwkJCQkJeworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLkhvc3RVbmlxdWVOdW0gPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ib3N0VW5pcXVlTnVtICkgKTsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5SdGFVbmlxdWVOdW0gPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5SdGFVbmlxdWVOdW0gKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLklEID0gMHgleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uSUQgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLklEMiA9IDB4JXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLklEMiApICk7CisJCQkJCQlyaW9fZHByaW50KFJJT19ERUJVR19DVFJMLCAgKCJNYXAgZW50cnkgJWQuRmxhZ3MgPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5GbGFncyApICk7CisJCQkJCQlyaW9fZHByaW50KFJJT19ERUJVR19DVFJMLCAgKCJNYXAgZW50cnkgJWQuU3lzUG9ydCA9IDB4JXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlN5c1BvcnQgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFswXS5Vbml0ID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzBdLlVuaXQgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFswXS5MaW5rID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzBdLkxpbmsgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFsxXS5Vbml0ID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzFdLlVuaXQgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFsxXS5MaW5rID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzFdLkxpbmsgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFsyXS5Vbml0ID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzJdLlVuaXQgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFsyXS5MaW5rID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzJdLkxpbmsgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFszXS5Vbml0ID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzNdLlVuaXQgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlRvcFs0XS5MaW5rID0gJWJcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzNdLkxpbmsgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLk5hbWUgPSAlc1xuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uTmFtZSApICk7CisJCQkJCX0KKwkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiKioqKipcbkVORCBNQVAgRU5UUklFU1xuIikgKTsKKwkJCQl9CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKwkJCQlyZXR1cm4gUklPTmV3VGFibGUocCk7CisKKwkgCQljYXNlIFJJT19HRVRfQklORElOR1MgOgorCQkJCS8qCisJCQkJKiogU2VuZCBiaW5kaW5ncyB0YWJsZSwgY29udGFpbmluZyB1bmlxdWUgbnVtYmVycyBvZiBSVEFzIG93bmVkCisJCQkJKiogYnkgdGhpcyBzeXN0ZW0gdG8gdXNlciBzcGFjZQorCQkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVF9CSU5ESU5HU1xuIik7CisKKwkJCQlpZiAoICFzdSApCisJCQkJeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVF9CSU5ESU5HUyAhUm9vdFxuIik7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkgCQkJcmV0dXJuIC1FUEVSTTsKKwkJCQl9CisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpIHAtPlJJT0JpbmRUYWIsIChpbnQpYXJnLCAKKwkJCQkJCShzaXplb2YodWxvbmcpICogTUFYX1JUQV9CSU5ESU5HUykpID09IENPUFlGQUlMICkgeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVF9CSU5ESU5HUyBjb3B5IGZhaWxlZFxuIik7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkgCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiAwOworCisJIAkJY2FzZSBSSU9fUFVUX0JJTkRJTkdTIDoKKwkJCS8qCisJCQkqKiBSZWNlaXZlIGEgYmluZGluZ3MgdGFibGUsIGNvbnRhaW5pbmcgdW5pcXVlIG51bWJlcnMgb2YgUlRBcyBvd25lZAorCQkJKiogYnkgdGhpcyBzeXN0ZW0KKwkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1BVVF9CSU5ESU5HU1xuIik7CisKKwkJCQlpZiAoICFzdSApCisJCQkJeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1BVVF9CSU5ESU5HUyAhUm9vdFxuIik7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkgCQkJcmV0dXJuIC1FUEVSTTsKKwkJCQl9CisJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJnAtPlJJT0JpbmRUYWJbMF0sIAorCQkJCQkJKHNpemVvZih1bG9uZykgKiBNQVhfUlRBX0JJTkRJTkdTKSk9PUNPUFlGQUlMICkgeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1BVVF9CSU5ESU5HUyBjb3B5IGZhaWxlZFxuIik7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCSAJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX0JJTkRfUlRBIDoKKwkJCQl7CisJCQkJCWludAlFbXB0eVNsb3QgPSAtMTsKKwkJCQkJLyoKKwkJCQkJKiogQmluZCB0aGlzIFJUQSB0byBob3N0LCBzbyB0aGF0IGl0IHdpbGwgYmUgYm9vdGVkIGJ5IAorCQkJCQkqKiBob3N0IGluICdib290IG93bmVkIFJUQXMnIG1vZGUuCisJCQkJCSovCisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19CSU5EX1JUQVxuIik7CisKKwkJCQkJaWYgKCAhc3UgKSB7CisJCSAJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0JJTkRfUlRBICFSb290XG4iKTsKKwkJIAkJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkgCQkJCXJldHVybiAtRVBFUk07CisJCQkJCX0KKwkJCQkJZm9yIChFbnRyeSA9IDA7IEVudHJ5IDwgTUFYX1JUQV9CSU5ESU5HUzsgRW50cnkrKykgeworCQkgCQkJCWlmICgoRW1wdHlTbG90ID09IC0xKSAmJiAocC0+UklPQmluZFRhYltFbnRyeV0gPT0gMEwpKQorCQkJCQkJCUVtcHR5U2xvdCA9IEVudHJ5OworCQkgCQkJCWVsc2UgaWYgKHAtPlJJT0JpbmRUYWJbRW50cnldID09IChpbnQpIGFyZykgeworCQkJCQkJCS8qCisJCQkJCQkJKiogQWxyZWFkeSBleGlzdHMgLSBkZWxldGUKKwkJCQkJCQkqLworCQkJCQkJCXAtPlJJT0JpbmRUYWJbRW50cnldID0gMEw7CisJCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUmVtb3ZpbmcgUnRhICV4IGZyb20gcC0+UklPQmluZFRhYlxuIiwKKwkJIAkJCQkJCQkJCQkJCShpbnQpIGFyZyk7CisJCQkJCQkJcmV0dXJuIDA7CisJCSAJCQkJfQorCQkJCQl9CisJCQkJCS8qCisJCQkJCSoqIERvc2VuJ3QgZXhpc3QgLSBhZGQKKwkJCQkJKi8KKwkJCQkJaWYgKEVtcHR5U2xvdCAhPSAtMSkgeworCQkgCQkJCXAtPlJJT0JpbmRUYWJbRW1wdHlTbG90XSA9IChpbnQpIGFyZzsKKwkJIAkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJBZGRpbmcgUnRhICV4IHRvIHAtPlJJT0JpbmRUYWJcbiIsCisJCSAgCQkJCQkoaW50KSBhcmcpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkgCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgInAtPlJJT0JpbmRUYWIgZnVsbCEgLSBSdGEgJXggbm90IGFkZGVkXG4iLAorCQkgIAkJCQkJKGludCkgYXJnKTsKKwkJIAkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisKKwkJCWNhc2UgUklPX1JFU1VNRSA6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU1VNRVxuIik7CisJCQkJcG9ydCA9ICh1aW50KSBhcmc7CisJCQkJaWYgKChwb3J0IDwgMCkgfHwgKHBvcnQgPiA1MTEpKSB7CisJCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVTVU1FOiBCYWQgcG9ydCBudW1iZXIgJWRcbiIsIHBvcnQpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCSAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0XTsKKwkJCQlpZiAoIVBvcnRQLT5NYXBwZWQpIHsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRVNVTUU6IFBvcnQgJWQgbm90IG1hcHBlZFxuIiwgcG9ydCk7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTk9UX01BUFBFRF9JTlRPX1NZU1RFTTsKKwkJIAkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlpZiAoIShQb3J0UC0+U3RhdGUgJiAoUklPX0xPUEVOIHwgUklPX01PUEVOKSkpIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU1VNRTogUG9ydCAlZCBub3Qgb3BlblxuIiwgcG9ydCk7CisJCSAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJaWYgKFJJT1ByZWVtcHRpdmVDbWQocCwgKHAtPlJJT1BvcnRwW3BvcnRdKSwgUkVTVU1FKSA9PSAKKwkJCQkJCQkJCQlSSU9fRkFJTCkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVTVU1FIGZhaWxlZFxuIik7CisJCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU1VNRTogUG9ydCAlZCByZXN1bWVkXG4iLCBwb3J0KTsKKwkJCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19CVVNZOworCQkJCX0KKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19BU1NJR05fUlRBOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19BU1NJR05fUlRBXG4iKTsKKwkJCQlpZiAoICFzdSApIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0FTU0lHTl9SVEEgIVJvb3RcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJCQlyZXR1cm4gLUVQRVJNOworCQkJCX0KKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmTWFwRW50LCBzaXplb2YoTWFwRW50KSkKKwkJCQkJCQkJCT09IENPUFlGQUlMKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkNvcHkgZnJvbSB1c2VyIHNwYWNlIGZhaWxlZFxuIik7CisJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiBSSU9Bc3NpZ25SdGEocCwgJk1hcEVudCk7CisKKwkJCWNhc2UgUklPX0NIQU5HRV9OQU1FOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19DSEFOR0VfTkFNRVxuIik7CisJCQkJaWYgKCAhc3UgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19DSEFOR0VfTkFNRSAhUm9vdFxuIik7CisJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCQkJCXJldHVybiAtRVBFUk07CisJCQkJfQorCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZNYXBFbnQsIHNpemVvZihNYXBFbnQpKQorCQkJCQkJPT0gQ09QWUZBSUwpIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ29weSBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIFJJT0NoYW5nZU5hbWUocCwgJk1hcEVudCk7CisKKwkJCWNhc2UgUklPX0RFTEVURV9SVEE6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0RFTEVURV9SVEFcbiIpOworCQkJCWlmICggIXN1ICkgeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0RFTEVURV9SVEEgIVJvb3RcbiIpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJIAkJCXJldHVybiAtRVBFUk07CisJCQkJfQorCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZNYXBFbnQsIHNpemVvZihNYXBFbnQpKQorCQkJCQkJCT09IENPUFlGQUlMICkgeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ29weSBmcm9tIGRhdGEgc3BhY2UgZmFpbGVkXG4iKTsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJIAkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gUklPRGVsZXRlUnRhKHAsICZNYXBFbnQpOworCisJCQljYXNlIFJJT19RVUlDS19DSEVDSzoKKwkJCQkvKgorCQkJCSoqIDA5LjEyLjE5OTggQVJHIC0gRVNJTCAwNzc2IHBhcnQgZml4CisJCQkJKiogQSBjdXN0b21lciB3YXMgdXNpbmcgdGhpcyB0byBnZXQgdGhlIFJUQXMKKwkJCQkqKiBjb25uZWN0L2Rpc2Nvbm5lY3Qgc3RhdHVzLgorCQkJCSoqIFJJT0NvbkNvbigpIGhhZCBiZWVuIGJvdGNoZWQgdXNlIFJJT0hhbHRlZAorCQkJCSoqIHRvIGtlZXAgdHJhY2sgb2YgUlRBIGNvbm5lY3Rpb25zIGFuZAorCQkJCSoqIGRpc2Nvbm5lY3Rpb25zLiBUaGF0IGhhcyBiZWVuIGNoYW5nZWQgYW5kCisJCQkJKiogUklPUnRhRGlzQ29ucyBpbiB0aGUgcmlvX2luZm8gc3RydWN0IG5vdworCQkJCSoqIGRvZXMgdGhlIGpvYi4gU28gd2UgbmVlZCB0byByZXR1cm4gdGhlIHZhbHVlCisJCQkJKiogb2YgUklPUnRhQ29ucyBpbnN0ZWFkIG9mIFJJT0hhbHRlZC4KKwkJCQkqKgorCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwLT5SSU9IYWx0ZWQsKGludClhcmcsCisJCQkJCQkJc2l6ZW9mKHVpbnQpKT09Q09QWUZBSUwpIHsKKwkJCQkqKgorCQkJCSovCisKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+UklPUnRhRGlzQ29ucywoaW50KWFyZywKKwkJCQkJCQlzaXplb2YodWludCkpPT1DT1BZRkFJTCkgeworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX0xBU1RfRVJST1I6CisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJnAtPlJJT0Vycm9yLCAoaW50KWFyZywgCisJCQkJCQlzaXplb2Yoc3RydWN0IEVycm9yKSkgPT1DT1BZRkFJTCApCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19HRVRfTE9HOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfTE9HXG4iKTsKKyNpZmRlZiBMT0dHSU5HCisJCQkJUklPR2V0TG9nKGFyZyk7CisJCQkJcmV0dXJuIDA7CisjZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCisKKwkJCWNhc2UgUklPX0dFVF9NT0RUWVBFOgorCQkJCWlmICggY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJnBvcnQsIAorCQkJCQkJCQkJc2l6ZW9mKHVpbnQpKSA9PSBDT1BZRkFJTCApCisJCQkJeworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkgCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkdldCBtb2R1bGUgdHlwZSBmb3IgcG9ydCAlZFxuIiwgcG9ydCk7CisJCQkJaWYgKCBwb3J0IDwgMCB8fCBwb3J0ID4gNTExICkKKwkJCQl7CisJCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX01PRFRZUEU6IEJhZCBwb3J0IG51bWJlciAlZFxuIiwgcG9ydCk7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJIAkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtwb3J0XSk7CisJCQkJaWYgKCFQb3J0UC0+TWFwcGVkKQorCQkJCXsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfTU9EVFlQRTogUG9ydCAlZCBub3QgbWFwcGVkXG4iLCBwb3J0KTsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OT1RfTUFQUEVEX0lOVE9fU1lTVEVNOworCQkgCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCS8qCisJCQkJKiogUmV0dXJuIG1vZHVsZSB0eXBlIG9mIHBvcnQKKwkJCQkqLworCQkJCXBvcnQgPSBQb3J0UC0+SG9zdFAtPlVuaXhSdXBzW1BvcnRQLT5SdXBOdW1dLk1vZFR5cGVzOworCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwb3J0LCAoaW50KWFyZywgCisJCQkJCQkJc2l6ZW9mKHVpbnQpKSA9PSBDT1BZRkFJTCkgeworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJIAkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4oMCk7CisJCQkvKgorCQkJKiogMDIuMDMuMTk5OSBBUkcgLSBFU0lMIDA4MjAgZml4CisJCQkqKiBXZSBhcmUgbm8gbG9uZ2VyIHVzaW5nICJCb290IE1vZGUiLCBzbyB0aGVzZSBpb2N0bHMKKwkJCSoqIGFyZSBub3QgcmVxdWlyZWQgOgorCQkJKioKKwkgCQljYXNlIFJJT19HRVRfQk9PVF9NT0RFIDoKKwkJCQlyaW9fZHByaW50KFJJT19ERUJVR19DVFJMLCAoIkdldCBib290IG1vZGUgLSAleFxuIiwgcC0+UklPQm9vdE1vZGUpKTsKKwkJCQkqKgorCQkJCSoqIFJldHVybiBib290IHN0YXRlIG9mIHN5c3RlbSAtIEJPT1RfQUxMLCBCT09UX09XTiBvciBCT09UX05PTkUKKwkJCQkqKgorCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwLT5SSU9Cb290TW9kZSwgKGludClhcmcsIAorCQkJCQkJc2l6ZW9mKHAtPlJJT0Jvb3RNb2RlKSkgPT0gQ09QWUZBSUwpIHsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCSAJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuKDApOworCQkJCisgCQkJY2FzZSBSSU9fU0VUX0JPT1RfTU9ERSA6CisJCQkJcC0+UklPQm9vdE1vZGUgPSAodWludCkgYXJnOworCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICgiU2V0IGJvb3QgbW9kZSB0byAweCV4XG4iLCBwLT5SSU9Cb290TW9kZSkpOworCQkJCXJldHVybigwKTsKKwkJCSoqCisJCQkqKiBFbmQgRVNJTCAwODIwIGZpeAorCQkJKi8KKworCSAJCWNhc2UgUklPX0JMT0NLX09QRU5TOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk9wZW5zIGJsb2NrIHVudGlsIGJvb3RlZFxuIik7CisJCQkJZm9yICggRW50cnk9MDsgRW50cnkgPCBSSU9fUE9SVFM7IEVudHJ5KysgKSB7CisJCSAJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCSAJCQlwLT5SSU9Qb3J0cFtFbnRyeV0tPldhaXRVbnRpbEJvb3RlZCA9IDE7CisJCSAJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisJCQkKKwkgCQljYXNlIFJJT19TRVRVUF9QT1JUUzoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJTZXR1cCBwb3J0c1xuIik7CisJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJlBvcnRTZXR1cCwgc2l6ZW9mKFBvcnRTZXR1cCkpIAorCQkJCQkJPT0gQ09QWUZBSUwgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJFRkFVTFQiKTsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoIFBvcnRTZXR1cC5Gcm9tID4gUG9ydFNldHVwLlRvIHx8IAorCQkJCQkJCQlQb3J0U2V0dXAuVG8gPj0gUklPX1BPUlRTICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJFTlhJTyIpOworCQkJCQkgcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJaWYgKCBQb3J0U2V0dXAuWHBDcHMgPiBwLT5SSU9Db25mLk1heFhwQ3BzIHx8CisJCQkJCSBQb3J0U2V0dXAuWHBDcHMgPCBwLT5SSU9Db25mLk1pblhwQ3BzICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBYUFJJTlRfQ1BTX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkVJTlZBTCIpOworCQkJCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCWlmICggIXAtPlJJT1BvcnRwICkgeworCQkJCQkgY3ByaW50ZigiTm8gcC0+UklPUG9ydHAgYXJyYXkhXG4iKTsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk5vIHAtPlJJT1BvcnRwIGFycmF5IVxuIik7CisJCQkJCSByZXR1cm4gLUVJTzsKKwkJCQl9CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiZW50ZXJpbmcgbG9vcCAoJWQgJWQpIVxuIiwgUG9ydFNldHVwLkZyb20sIFBvcnRTZXR1cC5Ubyk7CisJCQkJZm9yIChsb29wPVBvcnRTZXR1cC5Gcm9tOyBsb29wPD1Qb3J0U2V0dXAuVG87IGxvb3ArKykgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgImluIGxvb3AgKCVkKSFcbiIsIGxvb3ApOworI2lmIDAKKwkJCQkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtsb29wXTsKKwkJCQkJaWYgKCAhUG9ydFAtPlR0eVAgKQorCQkJCQkJUG9ydFAtPlR0eVAgPSAmcC0+Y2hhbm5lbFtsb29wXTsKKworCQkgCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQkJCWlmICggUG9ydFNldHVwLkl4QW55ICkKKwkJCQkJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19JWEFOWTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlQb3J0UC0+Q29uZmlnICY9IH5SSU9fSVhBTlk7CisJCQkJCQlpZiAoIFBvcnRTZXR1cC5JeE9uICkKKwkJCQkJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19JWE9OOworCQkJCQkJZWxzZQorCQkJCQkJCVBvcnRQLT5Db25maWcgJj0gflJJT19JWE9OOworCQkJCQkgCisJCQkJCSAvKgorCQkJCQkgKiogSWYgdGhlIHBvcnQgbmVlZHMgdG8gd2FpdCBmb3IgYWxsIGEgcHJvY2Vzc2VzIG91dHB1dAorCQkJCQkgKiogdG8gZHJhaW4gYmVmb3JlIGNsb3NpbmcgdGhlbiB0aGlzIGZsYWcgd2lsbCBiZSBzZXQuCisJCQkJCSAqLworCQkJCQkgCWlmIChQb3J0U2V0dXAuRHJhaW4pIHsKKwkJCQkJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19XQUlURFJBSU47CisJCQkJCSAJfSBlbHNlIHsKKwkJCQkJCQlQb3J0UC0+Q29uZmlnICY9IH5SSU9fV0FJVERSQUlOOworCQkJCQkgCX0KKwkJCQkJIC8qCisJCQkJCSAqKiBTdG9yZSBzZXR0aW5ncyBpZiBsb2NraW5nIG9yIHVubG9ja2luZyBwb3J0IG9yIGlmIHRoZQorCQkJCQkgKiogcG9ydCBpcyBub3QgbG9ja2VkLCB3aGVuIHNldHRpbmcgdGhlIHN0b3JlIG9wdGlvbi4KKwkJCQkJICovCisJCQkJCSBpZiAoUG9ydFAtPk1hcHBlZCAmJgorCQkJCQkJICgoUG9ydFNldHVwLkxvY2sgJiYgIVBvcnRQLT5Mb2NrKSB8fAorCQkJCQkJCSghUG9ydFAtPkxvY2sgJiYKKwkJCQkJCQkoUG9ydFNldHVwLlN0b3JlICYmICFQb3J0UC0+U3RvcmUpKSkpIHsKKwkJCQkJCVBvcnRQLT5TdG9yZWRUdHkuaWZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19pZmxhZzsKKwkJCQkJCVBvcnRQLT5TdG9yZWRUdHkub2ZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19vZmxhZzsKKwkJCQkJCVBvcnRQLT5TdG9yZWRUdHkuY2ZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19jZmxhZzsKKwkJCQkJCVBvcnRQLT5TdG9yZWRUdHkubGZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19sZmxhZzsKKwkJCQkJCVBvcnRQLT5TdG9yZWRUdHkubGluZSA9IFBvcnRQLT5UdHlQLT50bS5jX2xpbmU7CisJCQkJCQliY29weShQb3J0UC0+VHR5UC0+dG0uY19jYywgUG9ydFAtPlN0b3JlZFR0eS5jYywKKwkJCQkJIAkJTkNDICsgNSk7CisJCQkJCSB9CisJCQkJCSBQb3J0UC0+TG9jayA9IFBvcnRTZXR1cC5Mb2NrOworCQkJCQkgUG9ydFAtPlN0b3JlID0gUG9ydFNldHVwLlN0b3JlOworCQkJCQkgUG9ydFAtPlhwcmludC5YcENwcyA9IFBvcnRTZXR1cC5YcENwczsKKwkJCQkJIGJjb3B5KFBvcnRTZXR1cC5YcE9uLFBvcnRQLT5YcHJpbnQuWHBPbixNQVhfWFBfQ1RSTF9MRU4pOworCQkJCQkgYmNvcHkoUG9ydFNldHVwLlhwT2ZmLFBvcnRQLT5YcHJpbnQuWHBPZmYsTUFYX1hQX0NUUkxfTEVOKTsKKwkJCQkJIFBvcnRQLT5YcHJpbnQuWHBPbltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOworCQkJCQkgUG9ydFAtPlhwcmludC5YcE9mZltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOworCQkJCQkgUG9ydFAtPlhwcmludC5YcExlbiA9IFJJT1N0cmxlbihQb3J0UC0+WHByaW50LlhwT24pKworCQkJCQkJCQlSSU9TdHJsZW4oUG9ydFAtPlhwcmludC5YcE9mZik7CisJCQkJCSByaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOworI2VuZGlmCisJCQkJfQorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgImFmdGVyIGxvb3AgKCVkKSFcbiIsIGxvb3ApOworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJldHZhbDoleFxuIiwgcmV0dmFsKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19HRVRfUE9SVF9TRVRVUCA6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiR2V0IHBvcnQgc2V0dXBcbiIpOworCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZQb3J0U2V0dXAsIHNpemVvZihQb3J0U2V0dXApKSAKKwkJCQkJCQk9PSBDT1BZRkFJTCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoIFBvcnRTZXR1cC5Gcm9tID49IFJJT19QT1JUUyApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisKKwkJCQlwb3J0ID0gUG9ydFNldHVwLlRvID0gUG9ydFNldHVwLkZyb207CisJCQkJUG9ydFNldHVwLkl4QW55ID0gKHAtPlJJT1BvcnRwW3BvcnRdLT5Db25maWcgJiBSSU9fSVhBTlkpID8gCisJCQkJCQkJCQkJCQkJMSA6IDA7CisJCQkJUG9ydFNldHVwLkl4T24gPSAocC0+UklPUG9ydHBbcG9ydF0tPkNvbmZpZyAmIFJJT19JWE9OKSA/IAorCQkJCQkJCQkJCQkJCTEgOiAwOworCQkJCVBvcnRTZXR1cC5EcmFpbiA9IChwLT5SSU9Qb3J0cFtwb3J0XS0+Q29uZmlnICYgUklPX1dBSVREUkFJTikgPworCQkJCQkJCQkJCQkJIAkxIDogMDsKKwkJCQlQb3J0U2V0dXAuU3RvcmUgPSBwLT5SSU9Qb3J0cFtwb3J0XS0+U3RvcmU7CisJCQkJUG9ydFNldHVwLkxvY2sgPSBwLT5SSU9Qb3J0cFtwb3J0XS0+TG9jazsKKwkJCQlQb3J0U2V0dXAuWHBDcHMgPSBwLT5SSU9Qb3J0cFtwb3J0XS0+WHByaW50LlhwQ3BzOworCQkJCWJjb3B5KHAtPlJJT1BvcnRwW3BvcnRdLT5YcHJpbnQuWHBPbiwgUG9ydFNldHVwLlhwT24sCisJCQkJCQkJCQkJCQkJTUFYX1hQX0NUUkxfTEVOKTsKKwkJCQliY29weShwLT5SSU9Qb3J0cFtwb3J0XS0+WHByaW50LlhwT2ZmLCBQb3J0U2V0dXAuWHBPZmYsCisJCQkJCQkJCQkJCQkJTUFYX1hQX0NUUkxfTEVOKTsKKwkJCQlQb3J0U2V0dXAuWHBPbltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOworCQkJCVBvcnRTZXR1cC5YcE9mZltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOworCisJCQkJaWYgKCBjb3B5b3V0KChjYWRkcl90KSZQb3J0U2V0dXAsKGludClhcmcsc2l6ZW9mKFBvcnRTZXR1cCkpCisJCQkJCQkJCQkJCQkJCT09Q09QWUZBSUwgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX0dFVF9QT1JUX1BBUkFNUyA6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiR2V0IHBvcnQgcGFyYW1zXG4iKTsKKwkJCQlpZiAoY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJlBvcnRQYXJhbXMsCisJCQkJCXNpemVvZihzdHJ1Y3QgUG9ydFBhcmFtcykpID09IENPUFlGQUlMKSB7CisJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWlmIChQb3J0UGFyYW1zLlBvcnQgPj0gUklPX1BPUlRTKSB7CisJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQlyZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtQb3J0UGFyYW1zLlBvcnRdKTsKKwkJCQlQb3J0UGFyYW1zLkNvbmZpZyA9IFBvcnRQLT5Db25maWc7CisJCQkJUG9ydFBhcmFtcy5TdGF0ZSA9IFBvcnRQLT5TdGF0ZTsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJQb3J0ICVkXG4iLCBQb3J0UGFyYW1zLlBvcnQpOworCisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJlBvcnRQYXJhbXMsIChpbnQpYXJnLCAKKwkJCQkJCXNpemVvZihzdHJ1Y3QgUG9ydFBhcmFtcykpID09IENPUFlGQUlMICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19HRVRfUE9SVF9UVFkgOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkdldCBwb3J0IHR0eVxuIik7CisJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJlBvcnRUdHksIHNpemVvZihzdHJ1Y3QgUG9ydFR0eSkpIAorCQkJCQkJPT0gQ09QWUZBSUwpIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoIFBvcnRUdHkucG9ydCA+PSBSSU9fUE9SVFMgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUG9ydCAlZFxuIiwgUG9ydFR0eS5wb3J0KTsKKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtQb3J0VHR5LnBvcnRdKTsKKyNpZiAwCisJCQkJUG9ydFR0eS5UdHkudG0uY19pZmxhZyA9IFBvcnRQLT5UdHlQLT50bS5jX2lmbGFnOworCQkJCVBvcnRUdHkuVHR5LnRtLmNfb2ZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19vZmxhZzsKKwkJCQlQb3J0VHR5LlR0eS50bS5jX2NmbGFnID0gUG9ydFAtPlR0eVAtPnRtLmNfY2ZsYWc7CisJCQkJUG9ydFR0eS5UdHkudG0uY19sZmxhZyA9IFBvcnRQLT5UdHlQLT50bS5jX2xmbGFnOworI2VuZGlmCisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJlBvcnRUdHksIChpbnQpYXJnLCAKKwkJCQkJCQlzaXplb2Yoc3RydWN0IFBvcnRUdHkpKSA9PSBDT1BZRkFJTCkgeworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fU0VUX1BPUlRfVFRZIDoKKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmUG9ydFR0eSwgCisJCQkJCQlzaXplb2Yoc3RydWN0IFBvcnRUdHkpKSA9PSBDT1BZRkFJTCkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlNldCBwb3J0ICVkIHR0eVxuIiwgUG9ydFR0eS5wb3J0KTsKKwkJCQlpZiAoUG9ydFR0eS5wb3J0ID49ICh1c2hvcnQpIFJJT19QT1JUUykgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtQb3J0VHR5LnBvcnRdKTsKKyNpZiAwCisJCSAJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlQb3J0UC0+VHR5UC0+dG0uY19pZmxhZyA9IFBvcnRUdHkuVHR5LnRtLmNfaWZsYWc7CisJCQkJUG9ydFAtPlR0eVAtPnRtLmNfb2ZsYWcgPSBQb3J0VHR5LlR0eS50bS5jX29mbGFnOworCQkJCVBvcnRQLT5UdHlQLT50bS5jX2NmbGFnID0gUG9ydFR0eS5UdHkudG0uY19jZmxhZzsKKwkJCQlQb3J0UC0+VHR5UC0+dG0uY19sZmxhZyA9IFBvcnRUdHkuVHR5LnRtLmNfbGZsYWc7CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKyNlbmRpZgorCisJCQkJUklPUGFyYW0oUG9ydFAsIENPTkZJRywgUG9ydFAtPlN0YXRlICYgUklPX01PREVNLCBPS19UT19TTEVFUCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fU0VUX1BPUlRfUEFSQU1TIDoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJTZXQgcG9ydCBwYXJhbXNcbiIpOworCQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmUG9ydFBhcmFtcywgc2l6ZW9mKFBvcnRQYXJhbXMpKQorCQkJCQk9PSBDT1BZRkFJTCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoUG9ydFBhcmFtcy5Qb3J0ID49ICh1c2hvcnQpIFJJT19QT1JUUykgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtQb3J0UGFyYW1zLlBvcnRdKTsKKwkJIAkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCVBvcnRQLT5Db25maWcgPSBQb3J0UGFyYW1zLkNvbmZpZzsKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX0dFVF9QT1JUX1NUQVRTIDoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX1BPUlRfU1RBVFNcbiIpOworCQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmcG9ydFN0YXRzLCAKKwkJCQkJCXNpemVvZihzdHJ1Y3QgcG9ydFN0YXRzKSkgPT0gQ09QWUZBSUwgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJaWYgKCBwb3J0U3RhdHMucG9ydCA+PSBSSU9fUE9SVFMgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCVBvcnRQID0gKHAtPlJJT1BvcnRwW3BvcnRTdGF0cy5wb3J0XSk7CisJCQkJcG9ydFN0YXRzLmdhdGhlciA9IFBvcnRQLT5zdGF0c0dhdGhlcjsKKwkJCQlwb3J0U3RhdHMudHhjaGFycyA9IFBvcnRQLT50eGNoYXJzOworCQkJCXBvcnRTdGF0cy5yeGNoYXJzID0gUG9ydFAtPnJ4Y2hhcnM7CisJCQkJcG9ydFN0YXRzLm9wZW5zID0gUG9ydFAtPm9wZW5zOworCQkJCXBvcnRTdGF0cy5jbG9zZXMgPSBQb3J0UC0+Y2xvc2VzOworCQkJCXBvcnRTdGF0cy5pb2N0bHMgPSBQb3J0UC0+aW9jdGxzOworCQkJCWlmICggY29weW91dCgoY2FkZHJfdCkmcG9ydFN0YXRzLCAoaW50KWFyZywgCisJCQkJCQkJc2l6ZW9mKHN0cnVjdCBwb3J0U3RhdHMpKSA9PSBDT1BZRkFJTCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fUkVTRVRfUE9SVF9TVEFUUyA6CisJCQkJcG9ydCA9ICh1aW50KSBhcmc7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU0VUX1BPUlRfU1RBVFNcbiIpOworCQkJCWlmICggcG9ydCA+PSBSSU9fUE9SVFMgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCVBvcnRQID0gKHAtPlJJT1BvcnRwW3BvcnRdKTsKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJUG9ydFAtPnR4Y2hhcnMJPSAwOworCQkJCVBvcnRQLT5yeGNoYXJzCT0gMDsKKwkJCQlQb3J0UC0+b3BlbnMJPSAwOworCQkJCVBvcnRQLT5jbG9zZXMJPSAwOworCQkJCVBvcnRQLT5pb2N0bHMJPSAwOworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX0dBVEhFUl9QT1JUX1NUQVRTIDoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0FUSEVSX1BPUlRfU1RBVFNcbiIpOworCQkJCWlmICggY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJnBvcnRTdGF0cywgCisJCQkJCQlzaXplb2Yoc3RydWN0IHBvcnRTdGF0cykpID09IENPUFlGQUlMICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWlmICggcG9ydFN0YXRzLnBvcnQgPj0gUklPX1BPUlRTICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtwb3J0U3RhdHMucG9ydF0pOworCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlQb3J0UC0+c3RhdHNHYXRoZXIgPSBwb3J0U3RhdHMuZ2F0aGVyOworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7CisJCQkJcmV0dXJuIHJldHZhbDsKKworI2lmZGVmIERFQlVHX1NVUFBPUlRFRAorCQkJY2FzZSBSSU9fUkVBRF9MRVZFTFM6CisJCQkJeworCQkJCQkgaW50IG51bTsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRUFEX0xFVkVMU1xuIik7CisJCQkJCSBmb3IgKCBudW09MDsgUklPRGJJbmZbbnVtXS5GbGFnOyBudW0rKyApIDsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIiVkIGxldmVscyB0byBjb3B5XG4iLG51bSk7CisJCQkJCSBpZiAoY29weW91dCgoY2FkZHJfdClSSU9EYkluZiwoaW50KWFyZywKKwkJCQkJCXNpemVvZihzdHJ1Y3QgRGJJbmYpKihudW0rMSkpPT1DT1BZRkFJTCkgeworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUmVhZExldmVscyBDb3B5IGZhaWxlZFxuIik7CisJCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCSB9CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICIlZCBsZXZlbHMgdG8gY29waWVkXG4iLG51bSk7CisJCQkJCSByZXR1cm4gcmV0dmFsOworCQkJCX0KKyNlbmRpZgorCisJCQkgY2FzZSBSSU9fUkVBRF9DT05GSUc6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFQURfQ09ORklHXG4iKTsKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+UklPQ29uZiwgKGludClhcmcsIAorCQkJCQkJCXNpemVvZihzdHJ1Y3QgQ29uZikpID09Q09QWUZBSUwgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX1NFVF9DT05GSUc6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVF9DT05GSUdcbiIpOworCQkJCWlmICggIXN1ICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJCQkJIHJldHVybiAtRVBFUk07CisJCQkJfQorCQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmcC0+UklPQ29uZiwgc2l6ZW9mKHN0cnVjdCBDb25mKSApCisJCQkJCQk9PUNPUFlGQUlMICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCS8qCisJCQkJKiogbW92ZSBhIGZldyB2YWx1ZSBhcm91bmQKKwkJCQkqLworCQkJCWZvciAoSG9zdD0wOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKykKKwkJCQkJIGlmICggKHAtPlJJT0hvc3RzW0hvc3RdLkZsYWdzICYgUlVOX1NUQVRFKSA9PSBSQ19SVU5OSU5HICkKKwkJCQkJIAlXV09SRChwLT5SSU9Ib3N0c1tIb3N0XS5QYXJtTWFwUC0+dGltZXIgLCAKKwkJCQkJCQkJcC0+UklPQ29uZi5UaW1lcik7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fU1RBUlRfUE9MTEVSOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TVEFSVF9QT0xMRVJcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCisJCQljYXNlIFJJT19TVE9QX1BPTExFUjoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU1RPUF9QT0xMRVJcbiIpOworCQkJCWlmICggIXN1ICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJCQkJIHJldHVybiAtRVBFUk07CisJCQkJfQorCQkJCXAtPlJJT1BvbGxpbmcgPSBOT1RfUE9MTElORzsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19TRVRERUJVRzoKKwkJCWNhc2UgUklPX0dFVERFQlVHOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVRERUJVRy9SSU9fR0VUREVCVUdcbiIpOworCQkJCWlmICggY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJkRlYnVnQ3RybCwgc2l6ZW9mKERlYnVnQ3RybCkgKQorCQkJCQkJCT09Q09QWUZBSUwgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJaWYgKCBEZWJ1Z0N0cmwuU3lzUG9ydCA9PSBOT19QT1JUICkgeworCQkJCQlpZiAoIGNtZCA9PSBSSU9fU0VUREVCVUcgKSB7CisJCQkJCQlpZiAoICFzdSApIHsKKwkJCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJCQkJCXJldHVybiAtRVBFUk07CisJCQkJCQl9CisJCQkJCQlwLT5yaW9fZGVidWcgPSBEZWJ1Z0N0cmwuRGVidWc7CisJCQkJCQlwLT5SSU9EZWJ1Z1dhaXQgPSBEZWJ1Z0N0cmwuV2FpdDsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlNldCBnbG9iYWwgZGVidWcgdG8gMHgleCBzZXQgd2FpdCB0byAweCV4XG4iLAorCQkJCQkJCXAtPnJpb19kZWJ1ZyxwLT5SSU9EZWJ1Z1dhaXQpOworCQkJCQl9CisJCQkJIAllbHNlIHsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkdldCBnbG9iYWwgZGVidWcgMHgleCB3YWl0IDB4JXhcbiIsCisJCQkJCQkJCQkJcC0+cmlvX2RlYnVnLHAtPlJJT0RlYnVnV2FpdCk7CisJCQkJCQlEZWJ1Z0N0cmwuRGVidWcgPSBwLT5yaW9fZGVidWc7CisJCQkJCQlEZWJ1Z0N0cmwuV2FpdCAgPSBwLT5SSU9EZWJ1Z1dhaXQ7CisJCQkJCQlpZiAoIGNvcHlvdXQoKGNhZGRyX3QpJkRlYnVnQ3RybCwoaW50KWFyZywKKwkJCQkJCQkJc2l6ZW9mKERlYnVnQ3RybCkpID09IENPUFlGQUlMICkgeworCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVQvR0VUIERFQlVHOiBiYWQgcG9ydCBudW1iZXIgJWRcbiIsCisJCQkJCQkJCQlEZWJ1Z0N0cmwuU3lzUG9ydCk7CisJCQkJCQkgCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCQkgCXJldHVybiAtRUZBVUxUOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKCBEZWJ1Z0N0cmwuU3lzUG9ydCA+PSBSSU9fUE9SVFMgJiYgCisJCQkJCQkJRGVidWdDdHJsLlN5c1BvcnQgIT0gTk9fUE9SVCApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVQvR0VUIERFQlVHOiBiYWQgcG9ydCBudW1iZXIgJWRcbiIsCisJCQkJCQkJCQlEZWJ1Z0N0cmwuU3lzUG9ydCk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCWVsc2UgaWYgKCBjbWQgPT0gUklPX1NFVERFQlVHICkgeworCQkJCQlpZiAoICFzdSApIHsKKwkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCQkJCQlyZXR1cm4gLUVQRVJNOworCQkJCQl9CisJCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQkJcC0+UklPUG9ydHBbRGVidWdDdHJsLlN5c1BvcnRdLT5EZWJ1ZyA9IERlYnVnQ3RybC5EZWJ1ZzsKKwkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVERFQlVHIDB4JXhcbiIsCisJCQkJCQkJCXAtPlJJT1BvcnRwW0RlYnVnQ3RybC5TeXNQb3J0XS0+RGVidWcpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVERFQlVHIDB4JXhcbiIsCisJCQkJCQkJCQkgcC0+UklPUG9ydHBbRGVidWdDdHJsLlN5c1BvcnRdLT5EZWJ1Zyk7CisJCQkJCURlYnVnQ3RybC5EZWJ1ZyA9IHAtPlJJT1BvcnRwW0RlYnVnQ3RybC5TeXNQb3J0XS0+RGVidWc7CisJCQkJCWlmICggY29weW91dCgoY2FkZHJfdCkmRGVidWdDdHJsLChpbnQpYXJnLAorCQkJCQkJCQlzaXplb2YoRGVidWdDdHJsKSk9PUNPUFlGQUlMICkgeworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVERFQlVHOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19WRVJTSUQ6CisJCQkJLyoKKwkJCQkqKiBFbnF1aXJlIGFib3V0IHRoZSByZWxlYXNlIGFuZCB2ZXJzaW9uLgorCQkJCSoqIFdlIHJldHVybiBNQVhfVkVSU0lPTl9MRU4gYnl0ZXMsIGJlaW5nIGEKKwkJCQkqKiB0ZXh0dWFsIG51bGwgdGVybWluYXRlZCBzdHJpbmcuCisJCQkJKi8KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fVkVSU0lEXG4iKTsKKwkJCQlpZiAoIGNvcHlvdXQoCShjYWRkcl90KVJJT1ZlcnNpZCgpLAorCQkJCQkJKGludClhcmcsCisJCQkJCQlzaXplb2Yoc3RydWN0IHJpb1ZlcnNpb24pICkgPT0gQ09QWUZBSUwgKQorCQkJCXsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgICJSSU9fVkVSU0lEOiBCYWQgY29weSB0byB1c2VyIHNwYWNlIChob3N0PSVkKVxuIiwgSG9zdCk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCS8qCisJCQkqKiAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisJCQkqKiAhISBjb21tZW50ZWQgb3V0IHByZXZpb3VzICdSSU9fVkVSU0lEJyBmdW5jdGlvbmFsaXR5ICEhCisJCQkqKiAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisJCQkqKgorCQkJY2FzZSBSSU9fVkVSU0lEOgorCQkJCSoqCisJCQkJKiogRW5xdWlyZSBhYm91dCB0aGUgcmVsZWFzZSBhbmQgdmVyc2lvbi4KKwkJCQkqKiBXZSByZXR1cm4gTUFYX1ZFUlNJT05fTEVOIGJ5dGVzLCBiZWluZyBhIHRleHR1YWwgbnVsbAorCQkJCSoqIHRlcm1pbmF0ZWQgc3RyaW5nLgorCQkJCSoqCisJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgKCJSSU9fVkVSU0lEXG4iKSk7CisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpUklPVmVyc2lkKCksIAorCQkJCQkJKGludClhcmcsIE1BWF9WRVJTSU9OX0xFTiApID09IENPUFlGQUlMICkgeworCQkJCQkgcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgKCJSSU9fVkVSU0lEOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iLEhvc3QpKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCSoqCisJCQkqKiAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisJCQkqLworCisJCQljYXNlIFJJT19OVU1fSE9TVFM6CisJCQkJLyoKKwkJCQkqKiBFbnF1aXJlIGFzIHRvIHRoZSBudW1iZXIgb2YgaG9zdHMgbG9jYXRlZAorCQkJCSoqIGF0IGluaXQgdGltZS4KKwkJCQkqLworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19OVU1fSE9TVFNcbiIpOworCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwLT5SSU9OdW1Ib3N0cywgKGludClhcmcsIAorCQkJCQkJCXNpemVvZihwLT5SSU9OdW1Ib3N0cykgKT09Q09QWUZBSUwgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fTlVNX0hPU1RTOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fSE9TVF9GT0FEOgorCQkJCS8qCisJCQkJKiogS2lsbCBob3N0LiBUaGlzIG1heSBub3QgYmUgaW4gdGhlIGZpbmFsIHZlcnNpb24uLi4KKwkJCQkqLworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0ZPQUQgJWRcbiIsIChpbnQpYXJnKTsKKwkJCQlpZiAoICFzdSApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0ZPQUQ6IE5vdCBzdXBlciB1c2VyXG4iKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCQkJCSByZXR1cm4gLUVQRVJNOworCQkJCX0KKwkJCQlwLT5SSU9IYWx0ZWQgPSAxOworCQkJCXAtPlJJT1N5c3RlbVVwID0gMDsKKworCQkJCWZvciAoIEhvc3Q9MDsgSG9zdDxwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkgeworCQkJCQkgKHZvaWQpUklPQm9hcmRUZXN0KCBwLT5SSU9Ib3N0c1tIb3N0XS5QYWRkclAsIAorCQkJCQkJcC0+UklPSG9zdHNbSG9zdF0uQ2FkZHIsIHAtPlJJT0hvc3RzW0hvc3RdLlR5cGUsIAorCQkJCQkJCQlwLT5SSU9Ib3N0c1tIb3N0XS5TbG90ICk7CisJCQkJCSBiemVybyggKGNhZGRyX3QpJnAtPlJJT0hvc3RzW0hvc3RdLkZsYWdzLCAKKwkJCQkJCQkoKGludCkmcC0+UklPSG9zdHNbSG9zdF0uX19fX2VuZF9tYXJrZXJfX19fKSAtCisJCQkJCQkJCSAoKGludCkmcC0+UklPSG9zdHNbSG9zdF0uRmxhZ3MpICk7CisJCQkJCSBwLT5SSU9Ib3N0c1tIb3N0XS5GbGFncyAgPSBSQ19XQUlUSU5HOworI2lmIDAKKwkJCQkJIFJJT1NldHVwRGF0YVN0cnVjdHMocCk7CisjZW5kaWYKKwkJCQl9CisJCQkJUklPRm9hZFdha2V1cChwKTsKKwkJCQlwLT5SSU9OdW1Cb290UGt0cyA9IDA7CisJCQkJcC0+UklPQm9vdGluZyA9IDA7CisKKyNpZmRlZiBSSU5HQlVGRkVSX1NVUFBPUlQKKwkJCQlmb3IoIGxvb3A9MDsgbG9vcDxSSU9fUE9SVFM7IGxvb3ArKyApCisJCQkJCWlmICggcC0+UklPUG9ydHBbbG9vcF0tPlR4UmluZ0J1ZmZlciApCisJCQkJCQlzeXNmcmVlKCh2b2lkICopcC0+UklPUG9ydHBbbG9vcF0tPlR4UmluZ0J1ZmZlciwgCisJCQkJCQkJUklPQnVmZmVyU2l6ZSApOworI2VuZGlmCisjaWYgMAorCQkJCWJ6ZXJvKChjYWRkcl90KSZwLT5SSU9Qb3J0cFswXSxSSU9fUE9SVFMqc2l6ZW9mKHN0cnVjdCBQb3J0KSk7CisjZWxzZQorCQkJCXByaW50ayAoIkhFRUVFRUxQIVxuIik7CisjZW5kaWYKKworCQkJCWZvciggbG9vcD0wOyBsb29wPFJJT19QT1JUUzsgbG9vcCsrICkgeworI2lmIDAKKwkJCQkJcC0+UklPUG9ydHBbbG9vcF0tPlR0eVAgPSAmcC0+Y2hhbm5lbFtsb29wXTsKKyNlbmRpZgorCQkJCQkKKwkJCQkJc3Bpbl9sb2NrX2luaXQoJnAtPlJJT1BvcnRwW2xvb3BdLT5wb3J0U2VtKTsKKwkJCQkJcC0+UklPUG9ydHBbbG9vcF0tPkluVXNlID0gTk9UX0lOVVNFOworCQkJCX0KKworCQkJCXAtPlJJT1N5c3RlbVVwID0gMDsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19ET1dOTE9BRDoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fRE9XTkxPQURcbiIpOworCQkJCWlmICggIXN1ICkgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0RPV05MT0FEOiBOb3Qgc3VwZXIgdXNlclxuIik7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJCQkgcmV0dXJuIC1FUEVSTTsKKwkJCQl9CisJCQkJaWYgKCBjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZEb3duTG9hZCwgCisJCQkJCQkJc2l6ZW9mKERvd25Mb2FkKSApPT1DT1BZRkFJTCApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19ET1dOTE9BRDogQ29weSBpbiBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDb3BpZWQgaW4gZG93bmxvYWQgY29kZSBmb3IgcHJvZHVjdCBjb2RlIDB4JXhcbiIsCisJCQkJICAgIERvd25Mb2FkLlByb2R1Y3RDb2RlKTsKKworCQkJCS8qCisJCQkJKiogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIHByb2R1Y3QgY29kZSBpcyBhbiB1bnNpZ25lZCBvYmplY3QhCisJCQkJKi8KKwkJCQlpZiAoIERvd25Mb2FkLlByb2R1Y3RDb2RlID4gTUFYX1BST0RVQ1QgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fRE9XTkxPQUQ6IEJhZCBwcm9kdWN0IGNvZGUgJWQgcGFzc2VkXG4iLAorCQkJCQkJCURvd25Mb2FkLlByb2R1Y3RDb2RlKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gTk9fU1VDSF9QUk9EVUNUOworCQkJCQkgcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJLyoKKwkJCQkqKiBkbyBzb21ldGhpbmchCisJCQkJKi8KKwkJCQlyZXR2YWwgPSAoKihSSU9Cb290VGFibGVbRG93bkxvYWQuUHJvZHVjdENvZGVdKSkocCwgJkRvd25Mb2FkKTsKKwkJCQkJCQkJCQkvKiA8LS0gUGFuaWMgKi8KKwkJCQlwLT5SSU9IYWx0ZWQgPSAwOworCQkJCS8qCisJCQkJKiogYW5kIGdvIGJhY2ssIGNvbnRlbnQgd2l0aCBhIGpvYiB3ZWxsIGNvbXBsZXRlZC4KKwkJCQkqLworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX1BBUk1TOgorCQkJCXsKKwkJCQkJdWludCBob3N0OworCisJCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZob3N0LCAKKwkJCQkJCQlzaXplb2YoaG9zdCkgKSA9PSBDT1BZRkFJTCApIHsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgCisJCQkJCQkJIlJJT19IT1NUX1JFUTogQ29weSBpbiBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJCS8qCisJCQkJCSoqIEZldGNoIHRoZSBwYXJtbWFwCisJCQkJCSovCisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QQVJNU1xuIik7CisJCQkJCWlmICggY29weW91dCggKGNhZGRyX3QpcC0+UklPSG9zdHNbaG9zdF0uUGFybU1hcFAsIAorCQkJCQkJCQkoaW50KWFyZywgc2l6ZW9mKFBBUk1fTUFQKSApPT1DT1BZRkFJTCApIHsKKwkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUEFSTVM6IENvcHkgb3V0IHRvIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX0hPU1RfUkVROgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JFUVxuIik7CisJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJkhvc3RSZXEsIAorCQkJCQkJCXNpemVvZihIb3N0UmVxKSApPT1DT1BZRkFJTCApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JFUTogQ29weSBpbiBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoIEhvc3RSZXEuSG9zdE51bSA+PSBwLT5SSU9OdW1Ib3N0cyApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUkVROiBJbGxlZ2FsIGhvc3QgbnVtYmVyICVkXG4iLAorCQkJCQkJCUhvc3RSZXEuSG9zdE51bSk7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSZXF1ZXN0IGZvciBob3N0ICVkXG4iLCBIb3N0UmVxLkhvc3ROdW0pOworCisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJnAtPlJJT0hvc3RzW0hvc3RSZXEuSG9zdE51bV0sIAorCQkJCQkoaW50KUhvc3RSZXEuSG9zdFAsc2l6ZW9mKHN0cnVjdCBIb3N0KSApID09IENPUFlGQUlMKSB7CisJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JFUTogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIik7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQkgY2FzZSBSSU9fSE9TVF9EUFJBTToKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSZXF1ZXN0IGZvciBEUFJBTVxuIik7CisJCQkJaWYgKCBjb3B5aW4oIChpbnQpYXJnLCAoY2FkZHJfdCkmSG9zdERwUmFtLCAKKwkJCQkJCQkJc2l6ZW9mKEhvc3REcFJhbSkgKT09Q09QWUZBSUwgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0RQUkFNOiBDb3B5IGluIGZyb20gdXNlciBzcGFjZSBmYWlsZWRcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoIEhvc3REcFJhbS5Ib3N0TnVtID49IHAtPlJJT051bUhvc3RzICkgeworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfRFBSQU06IElsbGVnYWwgaG9zdCBudW1iZXIgJWRcbiIsCisJCQkJCQkJCQkJSG9zdERwUmFtLkhvc3ROdW0pOworCQkJCQlyZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSZXF1ZXN0IGZvciBob3N0ICVkXG4iLCBIb3N0RHBSYW0uSG9zdE51bSk7CisKKwkJCQlpZiAocC0+UklPSG9zdHNbSG9zdERwUmFtLkhvc3ROdW1dLlR5cGUgPT0gUklPX1BDSSkgeworCQkJCQkgaW50IG9mZjsKKwkJCQkJIC8qIEl0J3MgaGFyZHdhcmUgbGlrZSB0aGlzIHRoYXQgcmVhbGx5IGdldHMgb24gbXkgdGl0cy4gKi8KKwkJCQkJIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGNvcHlbc2l6ZW9mKHN0cnVjdCBEcFJhbSldOworCQkJCQlmb3IgKCBvZmY9MDsgb2ZmPHNpemVvZihzdHJ1Y3QgRHBSYW0pOyBvZmYrKyApCisJCQkJCQljb3B5W29mZl0gPSBwLT5SSU9Ib3N0c1tIb3N0RHBSYW0uSG9zdE51bV0uQ2FkZHJbb2ZmXTsKKwkJCQkJaWYgKCBjb3B5b3V0KCAoY2FkZHJfdCljb3B5LCAoaW50KUhvc3REcFJhbS5EcFJhbVAsIAorCQkJCQkJCXNpemVvZihzdHJ1Y3QgRHBSYW0pICkgPT0gQ09QWUZBSUwgKSB7CisJCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfRFBSQU06IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAoY29weW91dCgoY2FkZHJfdClwLT5SSU9Ib3N0c1tIb3N0RHBSYW0uSG9zdE51bV0uQ2FkZHIsCisJCQkJCShpbnQpSG9zdERwUmFtLkRwUmFtUCwgCisJCQkJCQlzaXplb2Yoc3RydWN0IERwUmFtKSApID09IENPUFlGQUlMICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0RQUkFNOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQkgY2FzZSBSSU9fU0VUX0JVU1k6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVF9CVVNZXG4iKTsKKwkJCQlpZiAoIChpbnQpYXJnIDwgMCB8fCAoaW50KWFyZyA+IDUxMSApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVRfQlVTWTogQmFkIHBvcnQgbnVtYmVyICVkXG4iLChpbnQpYXJnKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlwLT5SSU9Qb3J0cFsoaW50KWFyZ10tPlN0YXRlIHw9IFJJT19CVVNZOworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJIGNhc2UgUklPX0hPU1RfUE9SVDoKKwkJCQkvKgorCQkJCSoqIFRoZSBkYWVtb24gd2FudCBwb3J0IGluZm9ybWF0aW9uCisJCQkJKiogKHByb2JhYmx5IGZvciBkZWJ1ZyByZWFzb25zKQorCQkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUE9SVFxuIik7CisJCQkJaWYgKCBjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZQb3J0UmVxLCAKKwkJCQkJc2l6ZW9mKFBvcnRSZXEpICk9PUNPUFlGQUlMICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9QT1JUOiBDb3B5IGluIGZyb20gdXNlciBzcGFjZSBmYWlsZWRcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKworCQkJCWlmIChQb3J0UmVxLlN5c1BvcnQgPj0gUklPX1BPUlRTKSB7IC8qIFN5c1BvcnQgaXMgdW5zaWduZWQgKi8KKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1BPUlQ6IElsbGVnYWwgcG9ydCBudW1iZXIgJWRcbiIsCisJCQkJCQkJCQkJCVBvcnRSZXEuU3lzUG9ydCk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJlcXVlc3QgZm9yIHBvcnQgJWRcbiIsIFBvcnRSZXEuU3lzUG9ydCk7CisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpcC0+UklPUG9ydHBbUG9ydFJlcS5TeXNQb3J0XSwgCisJCQkJCQkJIChpbnQpUG9ydFJlcS5Qb3J0UCwKKwkJCQkJCQkJc2l6ZW9mKHN0cnVjdCBQb3J0KSApID09IENPUFlGQUlMKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUE9SVDogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIik7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fSE9TVF9SVVA6CisJCQkJLyoKKwkJCQkqKiBUaGUgZGFlbW9uIHdhbnQgcnVwIGluZm9ybWF0aW9uCisJCQkJKiogKHByb2JhYmx5IGZvciBkZWJ1ZyByZWFzb25zKQorCQkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUlVQXG4iKTsKKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmUnVwUmVxLCAKKwkJCQkJCXNpemVvZihSdXBSZXEpICk9PUNPUFlGQUlMICkgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUlVQOiBDb3B5IGluIGZyb20gdXNlciBzcGFjZSBmYWlsZWRcbiIpOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWlmIChSdXBSZXEuSG9zdE51bSA+PSBwLT5SSU9OdW1Ib3N0cykgeyAvKiBob3N0IGlzIHVuc2lnbmVkICovCisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SVVA6IElsbGVnYWwgaG9zdCBudW1iZXIgJWRcbiIsCisJCQkJCQkJCVJ1cFJlcS5Ib3N0TnVtKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJaWYgKCBSdXBSZXEuUnVwTnVtID49IE1BWF9SVVArTElOS1NfUEVSX1VOSVQgKSB7IC8qIGVlayEgKi8KKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JVUDogSWxsZWdhbCBydXAgbnVtYmVyICVkXG4iLAorCQkJCQkJCVJ1cFJlcS5SdXBOdW0pOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBSVVBfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tSdXBSZXEuSG9zdE51bV07CisKKwkJCQlpZiAoKEhvc3RQLT5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORykgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUlVQOiBIb3N0ICVkIG5vdCBydW5uaW5nXG4iLAorCQkJCQkJCVJ1cFJlcS5Ib3N0TnVtKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OT1RfUlVOTklORzsKKwkJCQkJIHJldHVybiAtRUlPOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSZXF1ZXN0IGZvciBydXAgJWQgZnJvbSBob3N0ICVkXG4iLAorCQkJCQkJUnVwUmVxLlJ1cE51bSxSdXBSZXEuSG9zdE51bSk7CisKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdClIb3N0UC0+VW5peFJ1cHNbUnVwUmVxLlJ1cE51bV0uUnVwUCwKKwkJCQkJKGludClSdXBSZXEuUnVwUCxzaXplb2Yoc3RydWN0IFJVUCkgKSA9PSBDT1BZRkFJTCkgeworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SVVA6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fSE9TVF9MUEI6CisJCQkJLyoKKwkJCQkqKiBUaGUgZGFlbW9uIHdhbnQgbHBiIGluZm9ybWF0aW9uCisJCQkJKiogKHByb2JhYmx5IGZvciBkZWJ1ZyByZWFzb25zKQorCQkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfTFBCXG4iKTsKKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmTHBiUmVxLCAKKwkJCQkJc2l6ZW9mKExwYlJlcSkgKT09Q09QWUZBSUwgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9MUEI6IEJhZCBjb3B5IGZyb20gdXNlciBzcGFjZVxuIik7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJaWYgKExwYlJlcS5Ib3N0ID49IHAtPlJJT051bUhvc3RzKSB7IC8qIGhvc3QgaXMgdW5zaWduZWQgKi8KKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfTFBCOiBJbGxlZ2FsIGhvc3QgbnVtYmVyICVkXG4iLAorCQkJCQkJCUxwYlJlcS5Ib3N0KTsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCXJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCWlmICggTHBiUmVxLkxpbmsgPj0gTElOS1NfUEVSX1VOSVQgKSB7IC8qIGVlayEgKi8KKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0xQQjogSWxsZWdhbCBsaW5rIG51bWJlciAlZFxuIiwKKwkJCQkJCQlMcGJSZXEuTGluayk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IExJTktfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tMcGJSZXEuSG9zdF07CisKKwkJCQlpZiAoIChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9MUEI6IEhvc3QgJWQgbm90IHJ1bm5pbmdcbiIsCisJCQkJCQlMcGJSZXEuSG9zdCApOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05PVF9SVU5OSU5HOworCQkJCQkgcmV0dXJuIC1FSU87CisJCQkJfQorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJlcXVlc3QgZm9yIGxwYiAlZCBmcm9tIGhvc3QgJWRcbiIsCisJCQkJCUxwYlJlcS5MaW5rLCBMcGJSZXEuSG9zdCk7CisKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmSG9zdFAtPkxpbmtTdHJQW0xwYlJlcS5MaW5rXSwKKwkJCQkJKGludClMcGJSZXEuTHBiUCxzaXplb2Yoc3RydWN0IExQQikgKSA9PSBDT1BZRkFJTCkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9MUEI6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJCS8qCisJCQkJKiogSGVyZSAzIElPQ1RMJ3MgdGhhdCBhbGxvdyB1cyB0byBjaGFuZ2UgdGhlIHdheSBpbiB3aGljaAorCQkJCSoqIHJpbyBsb2dzIGVycm9ycy4gc2VuZCB0aGVtIGp1c3QgdG8gc3lzbG9nIG9yIHNlbmQgdGhlbQorCQkJCSoqIHRvIGJvdGggc3lzbG9nIGFuZCBjb25zb2xlIG9yIHNlbmQgdGhlbSB0byBqdXN0IHRoZSBjb25zb2xlLgorCQkJCSoqCisJCQkJKiogU2VlIFJpb1N0ckJ1ZigpIGluIHV0aWwuYyBmb3IgdGhlIG90aGVyIGhhbGYuCisJCQkJKi8KKwkJCWNhc2UgUklPX1NZU0xPR19PTkxZOgorCQkJCXAtPlJJT1ByaW50TG9nU3RhdGUgPSBQUklOVF9UT19MT0c7CS8qIEp1c3Qgc3lzbG9nICovCisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX1NZU0xPR19DT05TOgorCQkJCXAtPlJJT1ByaW50TG9nU3RhdGUgPSBQUklOVF9UT19MT0dfQ09OUzsvKiBzeXNsb2cgYW5kIGNvbnNvbGUgKi8KKwkJCQlyZXR1cm4gMDsKKworCQkJY2FzZSBSSU9fQ09OU19PTkxZOgorCQkJCXAtPlJJT1ByaW50TG9nU3RhdGUgPSBQUklOVF9UT19DT05TOwkvKiBKdXN0IGNvbnNvbGUgKi8KKwkJCQlyZXR1cm4gMDsKKworCQkJY2FzZSBSSU9fU0lHTkFMU19PTjoKKwkJCQlpZiAoIHAtPlJJT1NpZ25hbFByb2Nlc3MgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFNJR05BTFNfQUxSRUFEWV9TRVQ7CisJCQkJCSByZXR1cm4gLUVCVVNZOworCQkJCX0KKwkJCQlwLT5SSU9TaWduYWxQcm9jZXNzID0gZ2V0cGlkKCk7CisJCQkJcC0+UklPUHJpbnREaXNhYmxlZCA9IERPTlRfUFJJTlQ7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fU0lHTkFMU19PRkY6CisJCQkJaWYgKCBwLT5SSU9TaWduYWxQcm9jZXNzICE9IGdldHBpZCgpICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfUkVDRUlWSU5HX1BST0NFU1M7CisJCQkJCSByZXR1cm4gLUVQRVJNOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDbGVhciBzaWduYWwgcHJvY2VzcyB0byB6ZXJvXG4iKTsKKwkJCQlwLT5SSU9TaWduYWxQcm9jZXNzID0gMDsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19TRVRfQllURV9NT0RFOgorCQkJCWZvciAoIEhvc3Q9MDsgSG9zdDxwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkKKwkJCQkJIGlmICggcC0+UklPSG9zdHNbSG9zdF0uVHlwZSA9PSBSSU9fQVQgKQorCQkJCQkJIHAtPlJJT0hvc3RzW0hvc3RdLk1vZGUgJj0gfldPUkRfT1BFUkFUSU9OOworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX1NFVF9XT1JEX01PREU6CisJCQkJZm9yICggSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KysgKQorCQkJCQkgaWYgKCBwLT5SSU9Ib3N0c1tIb3N0XS5UeXBlID09IFJJT19BVCApCisJCQkJCQkgcC0+UklPSG9zdHNbSG9zdF0uTW9kZSB8PSBXT1JEX09QRVJBVElPTjsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19TRVRfRkFTVF9CVVM6CisJCQkJZm9yICggSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KysgKQorCQkJCQkgaWYgKCBwLT5SSU9Ib3N0c1tIb3N0XS5UeXBlID09IFJJT19BVCApCisJCQkJCQkgcC0+UklPSG9zdHNbSG9zdF0uTW9kZSB8PSBGQVNUX0FUX0JVUzsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19TRVRfU0xPV19CVVM6CisJCQkJZm9yICggSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KysgKQorCQkJCQkgaWYgKCBwLT5SSU9Ib3N0c1tIb3N0XS5UeXBlID09IFJJT19BVCApCisJCQkJCQkgcC0+UklPSG9zdHNbSG9zdF0uTW9kZSAmPSB+RkFTVF9BVF9CVVM7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fTUFQX0I1MF9UT181MDoKKwkJCWNhc2UgUklPX01BUF9CNTBfVE9fNTc2MDA6CisJCQljYXNlIFJJT19NQVBfQjExMF9UT18xMTA6CisJCQljYXNlIFJJT19NQVBfQjExMF9UT18xMTUyMDA6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQmF1ZCByYXRlIG1hcHBpbmdcbiIpOworCQkJCXBvcnQgPSAodWludCkgYXJnOworCQkJCWlmICggcG9ydCA8IDAgfHwgcG9ydCA+IDUxMSApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkJhdWQgcmF0ZSBtYXBwaW5nOiBCYWQgcG9ydCBudW1iZXIgJWRcbiIsIHBvcnQpOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCXN3aXRjaCggY21kICkKKwkJCQl7CisJCQkJCWNhc2UgUklPX01BUF9CNTBfVE9fNTAgOgorCQkJCQkJcC0+UklPUG9ydHBbcG9ydF0tPkNvbmZpZyB8PSBSSU9fTUFQXzUwX1RPXzUwOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgUklPX01BUF9CNTBfVE9fNTc2MDAgOgorCQkJCQkJcC0+UklPUG9ydHBbcG9ydF0tPkNvbmZpZyAmPSB+UklPX01BUF81MF9UT181MDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFJJT19NQVBfQjExMF9UT18xMTAgOgorCQkJCQkJcC0+UklPUG9ydHBbcG9ydF0tPkNvbmZpZyB8PSBSSU9fTUFQXzExMF9UT18xMTA7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBSSU9fTUFQX0IxMTBfVE9fMTE1MjAwIDoKKwkJCQkJCXAtPlJJT1BvcnRwW3BvcnRdLT5Db25maWcgJj0gflJJT19NQVBfMTEwX1RPXzExMDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX1NUUkVBTV9JTkZPOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TVFJFQU1fSU5GT1xuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWNhc2UgUklPX1NFTkRfUEFDS0VUOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRU5EX1BBQ0tFVFxuIik7CisJCQkJaWYgKCBjb3B5aW4oIChpbnQpYXJnLCAoY2FkZHJfdCkmU2VuZFBhY2ssCisJCQkJCQkJCQlzaXplb2YoU2VuZFBhY2spICk9PUNPUFlGQUlMICkgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFTkRfUEFDS0VUOiBCYWQgY29weSBmcm9tIHVzZXIgc3BhY2VcbiIpOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWlmICggU2VuZFBhY2suUG9ydE51bSA+PSAxMjggKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCisJCQkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtTZW5kUGFjay5Qb3J0TnVtXTsKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwkJCQlpZiAoICFjYW5fYWRkX3RyYW5zbWl0KCZQYWNrZXRQLFBvcnRQKSApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gVU5JVF9JU19JTl9VU0U7CisJCQkJCSByaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOworCQkJCQkgcmV0dXJuIC1FTk9TUEM7CisJCQkJfQorCisJCQkJZm9yICggbG9vcD0wOyBsb29wPCh1c2hvcnQpKFNlbmRQYWNrLkxlbiAmIDEyNyk7IGxvb3ArKyApCisJCQkJCSBXQllURShQYWNrZXRQLT5kYXRhW2xvb3BdLCBTZW5kUGFjay5EYXRhW2xvb3BdICk7CisKKwkJCQlXQllURShQYWNrZXRQLT5sZW4sIFNlbmRQYWNrLkxlbik7CisKKwkJCQlhZGRfdHJhbnNtaXQoIFBvcnRQICk7CisJCQkJLyoKKwkJCQkqKiBDb3VudCBjaGFyYWN0ZXJzIHRyYW5zbWl0dGVkIGZvciBwb3J0IHN0YXRpc3RpY3MgcmVwb3J0aW5nCisJCQkJKi8KKwkJCQlpZiAoUG9ydFAtPnN0YXRzR2F0aGVyKQorCQkJCQkgUG9ydFAtPnR4Y2hhcnMgKz0gKFNlbmRQYWNrLkxlbiAmIDEyNyk7CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19OT19NRVNHOgorCQkJCWlmICggc3UgKQorCQkJCQkgcC0+UklPTm9NZXNzYWdlID0gMTsKKwkJCQlyZXR1cm4gc3UgPyAwIDogLUVQRVJNOworCisJCQljYXNlIFJJT19NRVNHOgorCQkJCWlmICggc3UgKQorCQkJCQlwLT5SSU9Ob01lc3NhZ2UgPSAwOworCQkJCXJldHVybiBzdSA/IDAgOiAtRVBFUk07CisKKwkJCWNhc2UgUklPX1dIQVRfTUVTRzoKKwkJCQlpZiAoIGNvcHlvdXQoIChjYWRkcl90KSZwLT5SSU9Ob01lc3NhZ2UsIChpbnQpYXJnLCAKKwkJCQkJc2l6ZW9mKHAtPlJJT05vTWVzc2FnZSkgKT09Q09QWUZBSUwgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19XSEFUX01FU0c6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX01FTV9EVU1QIDoKKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmU3ViQ21kLCAKKwkJCQkJCXNpemVvZihzdHJ1Y3QgU3ViQ21kU3RydWN0KSkgPT0gQ09QWUZBSUwpIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fTUVNX0RVTVAgaG9zdCAlZCBydXAgJWQgYWRkciAleFxuIiwgCisJCQkJCQlTdWJDbWQuSG9zdCwgU3ViQ21kLlJ1cCwgU3ViQ21kLkFkZHIpOworCisJCQkJaWYgKFN1YkNtZC5SdXAgPj0gTUFYX1JVUCtMSU5LU19QRVJfVU5JVCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUlVQX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlpZiAoU3ViQ21kLkhvc3QgPj0gcC0+UklPTnVtSG9zdHMgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRUlOVkFMOworCQkJCX0KKworCQkJCXBvcnQgPSBwLT5SSU9Ib3N0c1tTdWJDbWQuSG9zdF0uCisJCQkJCQkJCVVuaXhSdXBzW1N1YkNtZC5SdXBdLkJhc2VTeXNQb3J0OworCisJCQkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0XTsKKworCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworCQkJCWlmICggUklPUHJlZW1wdGl2ZUNtZChwLCAgUG9ydFAsIE1FTURVTVAgKSA9PSBSSU9fRkFJTCApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19NRU1fRFVNUCBmYWlsZWRcbiIpOworCQkJCQkgcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKwkJCQkJIHJldHVybiAtRUJVU1k7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJIFBvcnRQLT5TdGF0ZSB8PSBSSU9fQlVTWTsKKworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7CisJCQkJaWYgKCBjb3B5b3V0KCAoY2FkZHJfdClwLT5SSU9NZW1EdW1wLCAoaW50KWFyZywgCisJCQkJCQkJTUVNRFVNUF9TSVpFKSA9PSBDT1BZRkFJTCApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19NRU1fRFVNUCBjb3B5IGZhaWxlZFxuIik7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19USUNLOgorCQkJCWlmICgoaW50KWFyZyA8IDAgfHwgKGludClhcmcgPj0gcC0+UklPTnVtSG9zdHMpCisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJTZXQgaW50ZXJydXB0IGZvciBob3N0ICVkXG4iLCAoaW50KWFyZyk7CisJCQkJV0JZVEUocC0+UklPSG9zdHNbKGludClhcmddLlNldEludCAsIDB4ZmYpOworCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19UT0NLOgorCQkJCWlmICgoaW50KWFyZyA8IDAgfHwgKGludClhcmcgPj0gcC0+UklPTnVtSG9zdHMpCisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDbGVhciBpbnRlcnJ1cHQgZm9yIGhvc3QgJWRcbiIsIChpbnQpYXJnKTsKKwkJCQlXQllURSgocC0+UklPSG9zdHNbKGludClhcmddLlJlc2V0SW50KSAsIDB4ZmYpOworCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19SRUFEX0NIRUNLOgorCQkJCS8qIENoZWNrIHJlYWRzIGZvciBwa3RzIHdpdGggZGF0YVswXSB0aGUgc2FtZSAqLworCQkJCXAtPlJJT1JlYWRDaGVjayA9ICFwLT5SSU9SZWFkQ2hlY2s7CisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJnAtPlJJT1JlYWRDaGVjaywoaW50KWFyZywKKwkJCQkJCQlzaXplb2YodWludCkpPT0gQ09QWUZBSUwpIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX1JFQURfUkVHSVNURVIgOgorCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZTdWJDbWQsIAorCQkJCQkJCXNpemVvZihzdHJ1Y3QgU3ViQ21kU3RydWN0KSkgPT0gQ09QWUZBSUwpIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVBRF9SRUdJU1RFUiBob3N0ICVkIHJ1cCAlZCBwb3J0ICVkIHJlZyAleFxuIiwgCisJCQkJCQlTdWJDbWQuSG9zdCwgU3ViQ21kLlJ1cCwgU3ViQ21kLlBvcnQsIFN1YkNtZC5BZGRyKTsKKworCQkJCWlmIChTdWJDbWQuUG9ydCA+IDUxMSkgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQmF1ZCByYXRlIG1hcHBpbmc6IEJhZCBwb3J0IG51bWJlciAlZFxuIiwgCisJCQkJCQkJCVN1YkNtZC5Qb3J0KTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJaWYgKFN1YkNtZC5SdXAgPj0gTUFYX1JVUCtMSU5LU19QRVJfVU5JVCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUlVQX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlpZiAoU3ViQ21kLkhvc3QgPj0gcC0+UklPTnVtSG9zdHMgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRUlOVkFMOworCQkJCX0KKworCQkJCXBvcnQgPSBwLT5SSU9Ib3N0c1tTdWJDbWQuSG9zdF0uCisJCQkJCQlVbml4UnVwc1tTdWJDbWQuUnVwXS5CYXNlU3lzUG9ydCArIFN1YkNtZC5Qb3J0OworCQkJCVBvcnRQID0gcC0+UklPUG9ydHBbcG9ydF07CisKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwkJCQlpZiAoUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgUkVBRF9SRUdJU1RFUikgPT0gUklPX0ZBSUwpIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRUFEX1JFR0lTVEVSIGZhaWxlZFxuIik7CisJCQkJCSByaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOworCQkJCQkgcmV0dXJuIC1FQlVTWTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQkgUG9ydFAtPlN0YXRlIHw9IFJJT19CVVNZOworCisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+Q2RSZWdpc3RlciwgKGludClhcmcsIAorCQkJCQkJCXNpemVvZih1aW50KSkgPT0gQ09QWUZBSUwgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVBRF9SRUdJU1RFUiBjb3B5IGZhaWxlZFxuIik7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiAwOworCQkJCS8qCisJCQkJKiogcmlvX21ha2VfZGV2OiBnaXZlbiBwb3J0IG51bWJlciAoMC01MTEpIE9SZWQgd2l0aCBwb3J0IHR5cGUKKwkJCQkqKiAoUklPX0RFVl9ESVJFQ1QsIFJJT19ERVZfTU9ERU0sIFJJT19ERVZfWFBSSU5UKSByZXR1cm4gZGV2X3QKKwkJCQkqKiB2YWx1ZSB0byBwYXNzIHRvIG1rbm9kIHRvIGNyZWF0ZSB0aGUgY29ycmVjdCBkZXZpY2Ugbm9kZS4KKwkJCQkqLworCQkJY2FzZSBSSU9fTUFLRV9ERVY6CisJCQkJeworCQkJCQl1aW50IHBvcnQgPSAodWludClhcmcgJiBSSU9fTU9ERU1fTUFTSzsKKworCQkJCQlzd2l0Y2ggKCAodWludClhcmcgJiBSSU9fREVWX01BU0sgKSB7CisJCQkJCQljYXNlIFJJT19ERVZfRElSRUNUOgorCQkJCQkJCWFyZyA9IChjYWRkcl90KWRydl9tYWtlZGV2KE1BSk9SKGRldiksIHBvcnQpOworCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1ha2VkZXYgZGlyZWN0IDB4JXggaXMgMHgleFxuIixwb3J0LCAoaW50KWFyZyk7CisJCQkJCQkJcmV0dXJuIChpbnQpYXJnOworCQkJCQkgCWNhc2UgUklPX0RFVl9NT0RFTToKKwkJCQkJCQlhcmcgPSAgKGNhZGRyX3QpZHJ2X21ha2VkZXYoTUFKT1IoZGV2KSwgKHBvcnR8UklPX01PREVNX0JJVCkgKTsKKwkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYWtlZGV2IG1vZGVtIDB4JXggaXMgMHgleFxuIixwb3J0LCAoaW50KWFyZyk7CisJCQkJCQkJcmV0dXJuIChpbnQpYXJnOworCQkJCQkJY2FzZSBSSU9fREVWX1hQUklOVDoKKwkJCQkJCQlhcmcgPSAoY2FkZHJfdClkcnZfbWFrZWRldihNQUpPUihkZXYpLCBwb3J0KTsKKwkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYWtlZGV2IHByaW50ZXIgMHgleCBpcyAweCV4XG4iLHBvcnQsIChpbnQpYXJnKTsKKwkJCQkJCQlyZXR1cm4gKGludClhcmc7CisJCQkJCX0KKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTUFLRSBEZXZpY2UgaXMgY2FsbGVkXG4iKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCS8qCisJCQkJKiogcmlvX21pbm9yOiBnaXZlbiBhIGRldl90IGZyb20gYSBzdGF0KCkgY2FsbCwgcmV0dXJuCisJCQkJKiogdGhlIHBvcnQgbnVtYmVyICgwLTUxMSkgT1JlZCB3aXRoIHRoZSBwb3J0IHR5cGUKKwkJCQkqKiAoIFJJT19ERVZfRElSRUNULCBSSU9fREVWX01PREVNLCBSSU9fREVWX1hQUklOVCApCisJCQkJKi8KKwkJCWNhc2UgUklPX01JTk9SOgorCQkJCXsKKwkJCQkJZGV2X3QgZHY7CisJCQkJCWludCBtaW5vOworCisJCQkJCWR2ID0gKGRldl90KSgoaW50KWFyZyk7CisJCQkJCW1pbm8gPSBSSU9fVU5NT0RFTShkdik7CisKKwkJCQkJaWYgKCBSSU9fSVNNT0RFTShkdikgKSB7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNaW5vciBmb3IgZGV2aWNlIDB4JXg6IG1vZGVtICVkXG4iLCBkdiwgbWlubyk7CisJCQkJCQlhcmcgPSAoY2FkZHJfdCkobWlubyB8IFJJT19ERVZfTU9ERU0pOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWlub3IgZm9yIGRldmljZSAweCV4OiBkaXJlY3QgJWRcbiIsIGR2LCBtaW5vKTsKKwkJCQkJCWFyZyA9IChjYWRkcl90KShtaW5vIHwgUklPX0RFVl9ESVJFQ1QpOworCQkJCQl9CisJCQkJCXJldHVybiAoaW50KWFyZzsKKwkJCQl9CisJfQorCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIklOVkFMSUQgREFFTU9OIElPQ1RMIDB4JXhcbiIsY21kKTsKKwlwLT5SSU9FcnJvci5FcnJvciA9IElPQ1RMX0NPTU1BTkRfVU5LTk9XTjsKKworCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyoqIFByZS1lbXB0aXZlIGNvbW1hbmRzIGdvIG9uIFJVUHMgYW5kIGFyZSBvbmx5IG9uZSBieXRlIGxvbmcuCisqLworaW50CitSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBDbWQpCitzdHJ1Y3QgcmlvX2luZm8gKglwOworc3RydWN0IFBvcnQgKlBvcnRQOwordWNoYXIgQ21kOworeworCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisJc3RydWN0IFBrdENtZF9NICpQa3RDbWRQOworCWludCBSZXQ7CisJdXNob3J0IHJ1cDsKKwlpbnQgcG9ydDsKKworI2lmZGVmIENIRUNLCisJQ2hlY2tQb3J0UCggUG9ydFAgKTsKKyNlbmRpZgorCisJaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUHJlZW1wdGl2ZSBjb21tYW5kIHRvIGRlbGV0ZWQgUlRBIGlnbm9yZWRcbiIpOworCQlyZXR1cm4gUklPX0ZBSUw7CisJfQorCisJaWYgKCgoaW50KSgoY2hhcilQb3J0UC0+SW5Vc2UpID09IC0xKSB8fCAhIChDbWRCbGtQID0gUklPR2V0Q21kQmxrKCkpICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDYW5ub3QgYWxsb2NhdGUgY29tbWFuZCBibG9jayBmb3IgY29tbWFuZCAlZCBvbiBwb3J0ICVkXG4iLAorCQkgICAgICAgQ21kLCBQb3J0UC0+UG9ydE51bSk7CisJCXJldHVybiBSSU9fRkFJTDsKKwl9CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDb21tYW5kIGJsayAweCV4IC0gSW5Vc2Ugbm93ICVkXG4iLCAKKwkgICAgICAgKGludClDbWRCbGtQLFBvcnRQLT5JblVzZSk7CisKKwlQa3RDbWRQID0gKHN0cnVjdCBQa3RDbWRfTSAqKSZDbWRCbGtQLT5QYWNrZXQuZGF0YVswXTsKKworCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCAgPSAwOworCWlmIChQb3J0UC0+U2Vjb25kQmxvY2spCisJCXJ1cCA9IFBvcnRQLT5JRDI7CisJZWxzZQorCQlydXAgPSBQb3J0UC0+UnVwTnVtOworCUNtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSBydXA7CisJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ICA9IENPTU1BTkRfUlVQOworCUNtZEJsa1AtPlBhY2tldC5kZXN0X3BvcnQgPSBDT01NQU5EX1JVUDsKKwlDbWRCbGtQLT5QYWNrZXQubGVuCSAgPSBQS1RfQ01EX0JJVCB8IDI7CisJQ21kQmxrUC0+UG9zdEZ1bmNQCT0gUklPVW5Vc2U7CisJQ21kQmxrUC0+UG9zdEFyZwk9IChpbnQpUG9ydFA7CisJUGt0Q21kUC0+Q29tbWFuZAk9IENtZDsKKwlwb3J0CQkJCT0gUG9ydFAtPkhvc3RQb3J0ICUgKHVzaG9ydClQT1JUU19QRVJfUlRBOworCS8qCisJKiogSW5kZXggcG9ydHMgOC0xNSBmb3IgMm5kIGJsb2NrIG9mIDE2IHBvcnQgUlRBLgorCSovCisJaWYgKFBvcnRQLT5TZWNvbmRCbG9jaykKKwkJcG9ydCArPSAodXNob3J0KSBQT1JUU19QRVJfUlRBOworCVBrdENtZFAtPlBoYk51bQkgICA9IHBvcnQ7CisKKwlzd2l0Y2ggKCBDbWQgKSB7CisJCWNhc2UgTUVNRFVNUDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlF1ZXVlIE1FTURVTVAgY29tbWFuZCBibGsgMHgleCAoYWRkciAweCV4KVxuIiwKKwkJCSAgICAgICAoaW50KUNtZEJsa1AsIChpbnQpU3ViQ21kLkFkZHIpOworCQkJUGt0Q21kUC0+U3ViQ29tbWFuZAkJPSBNRU1EVU1QOworCQkJUGt0Q21kUC0+U3ViQWRkcgkJPSBTdWJDbWQuQWRkcjsKKwkJCWJyZWFrOworCQljYXNlIEZDTE9TRToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlF1ZXVlIEZDTE9TRSBjb21tYW5kIGJsayAweCV4XG4iLChpbnQpQ21kQmxrUCk7CisJCQlicmVhazsKKwkJY2FzZSBSRUFEX1JFR0lTVEVSOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUXVldWUgUkVBRF9SRUdJU1RFUiAoMHgleCkgY29tbWFuZCBibGsgMHgleFxuIiwKKwkJIAkJKGludClTdWJDbWQuQWRkciwgKGludClDbWRCbGtQKTsKKwkJCVBrdENtZFAtPlN1YkNvbW1hbmQJCT0gUkVBRF9SRUdJU1RFUjsKKwkJCVBrdENtZFAtPlN1YkFkZHIJCT0gU3ViQ21kLkFkZHI7CisJCQlicmVhazsKKwkJY2FzZSBSRVNVTUU6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBSRVNVTUUgY29tbWFuZCBibGsgMHgleFxuIiwoaW50KUNtZEJsa1ApOworCQkJYnJlYWs7CisJCWNhc2UgUkZMVVNIOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUXVldWUgUkZMVVNIIGNvbW1hbmQgYmxrIDB4JXhcbiIsKGludClDbWRCbGtQKTsKKwkJCUNtZEJsa1AtPlBvc3RGdW5jUCA9IFJJT1JGbHVzaEVuYWJsZTsKKwkJCWJyZWFrOworCQljYXNlIFNVU1BFTkQ6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBTVVNQRU5EIGNvbW1hbmQgYmxrIDB4JXhcbiIsKGludClDbWRCbGtQKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUdFVCA6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBNR0VUIGNvbW1hbmQgYmxrIDB4JXhcbiIsIChpbnQpQ21kQmxrUCk7CisJCQlicmVhazsKKworCQljYXNlIE1TRVQgOgorCQljYXNlIE1CSUMgOgorCQljYXNlIE1CSVMgOgorCQkJQ21kQmxrUC0+UGFja2V0LmRhdGFbNF0gPSAoY2hhcikgUG9ydFAtPk1vZGVtTGluZXM7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBNU0VUL01CSUMvTUJJUyBjb21tYW5kIGJsayAweCV4XG4iLCAoaW50KUNtZEJsa1ApOworCQkJYnJlYWs7CisKKwkJY2FzZSBXRkxVU0g6CisJCQkvKgorCQkJKiogSWYgd2UgaGF2ZSBxdWV1ZWQgdXAgdGhlIG1heGltdW0gbnVtYmVyIG9mIFdyaXRlIGZsdXNoZXMKKwkJCSoqIGFsbG93ZWQgdGhlbiB3ZSBzaG91bGQgbm90IGJvdGhlciBzZW5kaW5nIGFueSBtb3JlIHRvIHRoZQorCQkJKiogUlRBLgorCQkJKi8KKwkJCWlmICgoaW50KSgoY2hhcilQb3J0UC0+V2ZsdXNoRmxhZykgPT0gKGludCktMSkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlRyYXNoZWQgV0ZMVVNILCBXZmx1c2hGbGFnIGFib3V0IHRvIHdyYXAhIik7CisJCQkJUklPRnJlZUNtZEJsayhDbWRCbGtQKTsKKwkJCQlyZXR1cm4oUklPX0ZBSUwpOworCQkJfSBlbHNlIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBXRkxVU0ggY29tbWFuZCBibGsgMHgleFxuIiwKKwkJCQkgICAgICAgKGludClDbWRCbGtQKTsKKwkJCQlDbWRCbGtQLT5Qb3N0RnVuY1AgPSBSSU9XRmx1c2hNYXJrOworCQkJfQorCQkJYnJlYWs7CisJfQorCisJUG9ydFAtPkluVXNlKys7CisKKwlSZXQgPSBSSU9RdWV1ZUNtZEJsayggUG9ydFAtPkhvc3RQLCBydXAsIENtZEJsa1AgKTsKKworCXJldHVybiBSZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2RydnIuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvZHJ2ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMzhhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2RydnIuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvZHJ2ci5oCisqKglTSUQJCTogMS4zCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAwOToyMjo0NgorKioJUmV0cmlldmVkCTogMTEvNi85OCAwOToyMjo0NgorKioKKyoqICBpZGVudCBAKCMpcmlvZHJ2ci5oCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvZHJ2cl9oCisjZGVmaW5lIF9fcmlvZHJ2cl9oCisKKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4JLyogZm9yIEhaICovCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9kcnZyX2hfc2Njc18gPSAiQCgjKXJpb2RydnIuaAkxLjMiOworI2VuZGlmCisKKyNkZWZpbmUgTUVNRFVNUF9TSVpFCTMyCisjZGVmaW5lCU1PRF9ESVNBQkxFCShSSU9fTk9SRUFEfFJJT19OT1dSSVRFfFJJT19OT1hQUklOVCkKKworCitzdHJ1Y3QgcmlvX2luZm8geworCWludAkJCW1vZGU7CQkJLyogSW50ciBvciBwb2xsZWQsIHdvcmQvYnl0ZSAqLworCXNwaW5sb2NrX3QJCVJJT0ludHJTZW07CQkvKiBJbnRlcnJ1cHQgdGhyZWFkIHNlbSAqLworCWludAkJCWN1cnJlbnRfY2hhbjsJCS8qIGN1cnJlbnQgY2hhbm5lbCAqLworCWludAkJCVJJT0ZhaWxlZDsJCS8qIE5vdCBpbml0aWFsaXNlZCA/ICovCisJaW50CQkJUklPSW5zdGFsbEF0dGVtcHRzOwkvKiBuby4gb2YgcmlvLWluc3RhbGwoKSBjYWxscyAqLworCWludAkJCVJJT0xhc3RQQ0lTZWFyY2g7CS8qIHN0YXR1cyBvZiBsYXN0IHNlYXJjaCAqLworCWludAkJCVJJT051bUhvc3RzOwkJLyogTnVtYmVyIG9mIFJJTyBIb3N0cyAqLworCXN0cnVjdCBIb3N0CQkqIFJJT0hvc3RzOwkJLyogUklPIEhvc3QgdmFsdWVzICovCisJc3RydWN0IFBvcnQJCSoqUklPUG9ydHA7CQkvKiBSSU8gcG9ydCB2YWx1ZXMgKi8KKy8qCisqKiAwMi4wMy4xOTk5IEFSRyAtIEVTSUwgMDgyMCBmaXgKKyoqIFdlIG5vIGxvbmdlciB1c2UgUklPQm9vdE1vZGUKKyoqCisJaW50CQkJUklPQm9vdE1vZGU7CQkqIFJJTyBib290IG1vZGUgKgorKioKKyovCisJaW50CQkJUklPUHJpbnREaXNhYmxlZDsJLyogUklPIHByaW50aW5nIGRpc2FibGVkID8gKi8KKwlpbnQJCQlSSU9QcmludExvZ1N0YXRlOwkvKiBSSU8gcHJpbnRpbmcgc3RhdGUgPyAqLworCWludAkJCVJJT1BvbGxpbmc7CQkvKiBQb2xsaW5nID8gKi8KKy8qCisqKiAwOS4xMi4xOTk4IEFSRyAtIEVTSUwgMDc3NiBwYXJ0IGZpeAorKiogVGhlICdSSU9fUVVJQ0tfQ0hFQ0snIGlvY3RsIHdhcyB1c2luZyBSSU9IYWx0ZWQuCisqKiBUaGUgZml4IGZvciB0aGlzIEVTSUwgaW50cm9kdWNlcyBhbm90aGVyIG1lbWJlciAoUklPUnRhRGlzQ29ucykgaGVyZSB0byBiZQorKiogdXBkYXRlZCBpbiBSSU9Db25Db24oKSAtIHRvIGtlZXAgdHJhY2sgb2YgUlRBIGNvbm5lY3Rpb25zL2Rpc2Nvbm5lY3Rpb25zLgorKiogJ1JJT19RVUlDS19DSEVDSycgbm93IHJldHVybnMgdGhlIHZhbHVlIG9mIFJJT1J0YURpc0NvbnMuCisqLworCWludAkJCVJJT0hhbHRlZDsJCS8qIGhhbHRlZCA/ICovCisJaW50CQkJUklPUnRhRGlzQ29uczsJCS8qIFJUQSBjb25uZWN0aW9ucy9kaXNjb25uZWN0aW9ucyAqLworCXVpbnQJCQlSSU9SZWFkQ2hlY2s7CQkvKiBSaW8gcmVhZCBjaGVjayAqLworCXVpbnQJCQlSSU9Ob01lc3NhZ2U7CQkvKiBUbyBkaXNwbGF5IG1lc3NhZ2Ugb3Igbm90ICovCisJdWludAkJCVJJT051bUJvb3RQa3RzOwkJLyogaG93IG1hbnkgcGFja2V0cyBmb3IgYW4gUlRBICovCisJdWludAkJCVJJT0Jvb3RDb3VudDsgCQkvKiBzaXplIG9mIFJUQSBjb2RlICovCisJdWludAkJCVJJT0Jvb3Rpbmc7CQkvKiBjb3VudCBvZiBvdXRzdGFuZGluZyBib290cyAqLworCXVpbnQJCQlSSU9TeXN0ZW1VcDsJCS8qIEJvb3RlZCA/PyAqLworCXVpbnQJCQlSSU9Db3VudGluZzsJCS8qIGZvciBjb3VudGluZyBpbnRlcnJ1cHRzICovCisJdWludAkJCVJJT0ludENvdW50OwkJLyogIyBvZiBpbnRyIHNpbmNlIGxhc3QgY2hlY2sgKi8KKwl1aW50CQkJUklPVHhDb3VudDsJCS8qIG51bWJlciBvZiB4bWl0IGludHJzICAqLworCXVpbnQJCQlSSU9SeENvdW50OwkJLyogbnVtYmVyIG9mIHJ4IGludHJzICovCisJdWludAkJCVJJT1J1cENvdW50OwkJLyogbnVtYmVyIG9mIHJ1cCBpbnRycyAqLworCWludAkJCVJJWFRpbWVyOyAKKwlpbnQJCQlSSU9CdWZmZXJTaXplOwkJLyogQnVmZmVyc2l6ZSAqLworCWludAkJCVJJT0J1ZmZlck1hc2s7CQkvKiBCdWZmZXJzaXplICovCisKKwlpbnQJCQlSSU9GaXJzdE1ham9yOwkJLyogRmlyc3QgaG9zdCBjYXJkJ3MgbWFqb3Igbm8gKi8KKworCXVpbnQJCQlSSU9MYXN0UG9ydHNNYXBwZWQ7CS8qIGhpZ2hlc3QgcG9ydCBudW1iZXIga25vd24gKi8KKwl1aW50CQkJUklPRmlyc3RQb3J0c01hcHBlZDsJLyogbG93ZXN0IHBvcnQgbnVtYmVyIGtub3duICovCisKKwl1aW50CQkJUklPTGFzdFBvcnRzQm9vdGVkOwkvKiBoaWdoZXN0IHBvcnQgbnVtYmVyIHJ1bm5pbmcgKi8KKwl1aW50CQkJUklPRmlyc3RQb3J0c0Jvb3RlZDsJLyogbG93ZXN0IHBvcnQgbnVtYmVyIHJ1bm5pbmcgKi8KKworCXVpbnQJCQlSSU9MYXN0UG9ydHNPcGVuZWQ7CS8qIGhpZ2hlc3QgcG9ydCBudW1iZXIgcnVubmluZyAqLworCXVpbnQJCQlSSU9GaXJzdFBvcnRzT3BlbmVkOwkvKiBsb3dlc3QgcG9ydCBudW1iZXIgcnVubmluZyAqLworCisJLyogRmxhZyB0byBzYXkgdGhhdCB0aGUgdG9wb2xvZ3kgaW5mb3JtYXRpb24gaGFzIGJlZW4gY2hhbmdlZC4gKi8KKwl1aW50CQkJUklPUXVpY2tDaGVjazsgCisJdWludAkJCUNkUmVnaXN0ZXI7CQkvKiA/Pz8gKi8KKwlpbnQJCQlSSU9TaWduYWxQcm9jZXNzOwkvKiBTaWduYWxsaW5nIHByb2Nlc3MgKi8KKwlpbnQJCQlyaW9fZGVidWc7CQkvKiBUbyBkZWJ1ZyAuLi4gKi8KKwlpbnQJCQlSSU9EZWJ1Z1dhaXQ7CQkvKiBGb3Igd2hhdCA/Pz8gKi8KKwlpbnQJCQl0cHJpOwkJCS8qIFRocmVhZCBwcmlvICovCisJaW50CQkJdGlkOwkJCS8qIFRocmVhZCBpZCAqLworCXVpbnQJCQlfUklPX1BvbGxlZDsJCS8qIENvdW50ZXIgZm9yIHBvbGxpbmcgKi8KKwl1aW50CQkJX1JJT19JbnRlcnJ1cHRlZDsJLyogQ291bnRlciBmb3IgaW50ZXJydXB0ICovCisJaW50CQkJaW50cl90aWQ7CQkvKiBpb2ludHNldCByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlUeEVuU2VtOwkJLyogVHhFbmFibGUgU2VtYXBob3JlICovCisKKworCXN0cnVjdCBFcnJvcgkJUklPRXJyb3I7CQkvKiB0byBJZGVudGlmeSB3aGF0IHdlbnQgd3JvbmcgKi8gCisJc3RydWN0IENvbmYJCVJJT0NvbmY7CQkvKiBDb25maWd1cmF0aW9uID8/PyAqLworCXN0cnVjdCB0dHlzdGF0aWNzCWNoYW5uZWxbUklPX1BPUlRTXTsJLyogY2hhbm5lbCBpbmZvcm1hdGlvbiAqLworCWNoYXIJCQlSSU9Cb290UGFja2V0c1sxKyhTSVhUWV9GT1VSX0svUlRBX0JPT1RfREFUQV9TSVpFKV0KKwkJCQkJCQkJW1JUQV9CT09UX0RBVEFfU0laRV07CisJc3RydWN0IE1hcAkJUklPQ29ubmVjdFRhYmxlW1RPVEFMX01BUF9FTlRSSUVTXTsKKwlzdHJ1Y3QgTWFwCQlSSU9TYXZlZFRhYmxlW1RPVEFMX01BUF9FTlRSSUVTXTsKKworCS8qIFJUQSB0byBob3N0IGJpbmRpbmcgdGFibGUgZm9yIG1hc3Rlci9zbGF2ZSBvcGVyYXRpb24gKi8KKwl1bG9uZwkJCVJJT0JpbmRUYWJbTUFYX1JUQV9CSU5ESU5HU107CisJLyogUlRBIG1lbW9yeSBkdW1wIHZhcmlhYmxlICovCisJdWNoYXIJCQlSSU9NZW1EdW1wW01FTURVTVBfU0laRV07IAorCXN0cnVjdCBNb2R1bGVJbmZvIAlSSU9Nb2R1bGVUeXBlc1tNQVhfTU9EVUxFX1RZUEVTXTsKKworfTsKKworCisjaWZkZWYgbGludXgKKyNkZWZpbmUgZGVidWcoeCkgICAgICAgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBkZWJ1Zyh4KQlra3ByaW50ZiB4CisjZW5kaWYKKworCisKKyNkZWZpbmUgUklPX1JFU0VUX0lOVAkweDdkODAKKyNkZWZpbmUgV1JCWVRFKHgseSkJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSgoeCkpID0gXAorCQkJCQkodW5zaWduZWQgY2hhcikoeSkKKworI2VuZGlmCS8qIF9fcmlvZHJ2ci5oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luZm8uaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwODQyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luZm8uaApAQCAtMCwwICsxLDk2IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW9pbmZvLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDE0OjA3OjQ5CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDE0OjA3OjUwCisqKgorKiogIGlkZW50IEAoIylyaW9pbmZvLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9pbmZvX2gKKyNkZWZpbmUgX19yaW9pbmZvX2gKKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb2luZm9faF9zY2NzXyA9ICJAKCMpcmlvaW5mby5oCTEuMiI7CisjZW5kaWYKKworLyoKKyoqIEhvc3QgY2FyZCBkYXRhIHN0cnVjdHVyZQorKi8KK3N0cnVjdCBSaW9Ib3N0SW5mbyB7CisJbG9uZwlsb2NhdGlvbjsJLyogUklPIENhcmQgQmFzZSBJL08gYWRkcmVzcyAqLworCWxvbmcJdmVjdG9yOwkJLyogUklPIENhcmQgSVJRIHZlY3RvciAqLworCWludAlidXM7CQkvKiBJU0EvRUlTQS9NQ0EvUENJICovCisJaW50CW1vZGU7CQkvKiBwb2ludGVyIHRvIGhvc3QgbW9kZSAtIElOVEVSUlVQVCAvIFBPTExFRCAqLworCXN0cnVjdCBvbGRfc2d0dHliCisJCSogU2c7CQkvKiBwb2ludGVyIHRvIGRlZmF1bHQgdGVybSBjaGFyYWN0ZXJpc3RpY3MgKi8KK307CisKKworLyogTW9kZSBpbiByaW8gZGV2aWNlIGluZm8gKi8KKyNkZWZpbmUgSU5URVJSVVBURURfTU9ERQkweDAxCQkvKiBJbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkICovCisjZGVmaW5lIFBPTExFRF9NT0RFCQkweDAyCQkvKiBObyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQVVUT19NT0RFCQkweDAzCQkvKiBBdXRvIG1vZGUgKi8KKworI2RlZmluZSBXT1JEX0FDQ0VTU19NT0RFCTB4MTAJCS8qIFdvcmQgQWNjZXNzIE1vZGUgKi8KKyNkZWZpbmUgQllURV9BQ0NFU1NfTU9ERQkweDIwCQkvKiBCeXRlIEFjY2VzcyBNb2RlICovCisKKworLyogQnVzIHR5cGUgdGhhdCBSSU8gc3VwcG9ydHMgKi8KKyNkZWZpbmUgSVNBX0JVUwkJCTB4MDEJCS8qIFRoZSBjYXJkIGlzIElTQSAqLworI2RlZmluZSBFSVNBX0JVUwkJMHgwMgkJLyogVGhlIGNhcmQgaXMgRUlTQSAqLworI2RlZmluZSBNQ0FfQlVTCQkJMHgwNAkJLyogVGhlIGNhcmQgaXMgTUNBICovCisjZGVmaW5lIFBDSV9CVVMJCQkweDA4CQkvKiBUaGUgY2FyZCBpcyBQQ0kgKi8KKworLyoKKyoqIDExLjExLjE5OTggQVJHIC0gRVNJTCA/Pz8/IHBhcnQgZml4CisqKiBNb3ZlZCBkZWZpbml0aW9uIGZvciAnQ0hBTicgaGVyZSBmcm9tIHJpb2luZm8uYyAoaXQgaXMgbm93CisqKiBjYWxsZWQgJ0RFRl9URVJNX0NIQVJBQ1RFUklTVElDUycpLgorKi8KKworI2RlZmluZSBERUZfVEVSTV9DSEFSQUNURVJJU1RJQ1MgXAoreyBcCisJQjE5MjAwLCBCMTkyMDAsCQkJCS8qIGlucHV0IGFuZCBvdXRwdXQgc3BlZWQgKi8gXAorCSdIJyAtICdAJywJCQkJLyogZXJhc2UgY2hhciAqLyBcCisJLTEsCQkJCQkvKiAybmQgZXJhc2UgY2hhciAqLyBcCisJJ1UnIC0gJ0AnLAkJCQkvKiBraWxsIGNoYXIgKi8gXAorCUVDSE8gfCBDUk1PRCwJCQkJLyogbW9kZSAqLyBcCisJJ0MnIC0gJ0AnLAkJCQkvKiBpbnRlcnJ1cHQgY2hhcmFjdGVyICovIFwKKwknXFwnIC0gJ0AnLAkJCQkvKiBxdWl0IGNoYXIgKi8gXAorCSdRJyAtICdAJywJCQkJLyogc3RhcnQgY2hhciAqLyBcCisJJ1MnIC0gJ0AnLAkJCQkvKiBzdG9wIGNoYXIgKi8gXAorCSdEJyAtICdAJywJCQkJLyogRU9GICovIFwKKwktMSwJCQkJCS8qIGJyayAqLyBcCisJKExDUlRCUyB8IExDUlRFUkEgfCBMQ1JUS0lMIHwgTENUTEVDSCksCS8qIGxvY2FsIG1vZGUgd29yZCAqLyBcCisJJ1onIC0gJ0AnLAkJCQkvKiBwcm9jZXNzIHN0b3AgKi8gXAorCSdZJyAtICdAJywJCQkJLyogZGVsYXllZCBzdG9wICovIFwKKwknUicgLSAnQCcsCQkJCS8qIHJlcHJpbnQgbGluZSAqLyBcCisJJ08nIC0gJ0AnLAkJCQkvKiBmbHVzaCBvdXRwdXQgKi8gXAorCSdXJyAtICdAJywJCQkJLyogd29yZCBlcmFzZSAqLyBcCisJJ1YnIC0gJ0AnCQkJCS8qIGxpdGVyYWwgbmV4dCBjaGFyICovIFwKK30KKworI2VuZGlmIC8qIF9fcmlvaW5mb19oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luaXQuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTk0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luaXQuYwpAQCAtMCwwICsxLDE2MTcgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHJpb2luaXQuYworKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTA6MzM6NDMKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTA6MzM6NDkKKyoqCisqKiAgaWRlbnQgQCgjKXJpb2luaXQuYwkxLjMKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9pbml0X2Nfc2Njc18gPSAiQCgjKXJpb2luaXQuYwkxLjMiOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKworCisjaW5jbHVkZSAibGludXhfY29tcGF0LmgiCisjaW5jbHVkZSAidHlwZGVmLmgiCisjaW5jbHVkZSAicGt0LmgiCisjaW5jbHVkZSAiZGFlbW9uLmgiCisjaW5jbHVkZSAicmlvLmgiCisjaW5jbHVkZSAicmlvc3BhY2UuaCIKKyNpbmNsdWRlICJ0b3AuaCIKKyNpbmNsdWRlICJjbWRwa3QuaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJyaW90eXBlcy5oIgorI2luY2x1ZGUgInJ1cC5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyaW9kcnZyLmgiCisjaW5jbHVkZSAicmlvaW5mby5oIgorI2luY2x1ZGUgImZ1bmMuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2luY2x1ZGUgInBhcm1tYXAuaCIKKyNpbmNsdWRlICJ1bml4cnVwLmgiCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJwaGIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiY21kYmxrLmgiCisjaW5jbHVkZSAicm91dGUuaCIKKyNpbmNsdWRlICJjb250cm9sLmgiCisjaW5jbHVkZSAiY2lycnVzLmgiCisjaW5jbHVkZSAicmlvaW9jdGwuaCIKKyNpbmNsdWRlICJyaW9fbGludXguaCIKKworI3VuZGVmIGJjb3B5CisjZGVmaW5lIGJjb3B5IHJpb19wY2ljb3B5CisKK2ludCBSSU9QQ0lpbml0KHN0cnVjdCByaW9faW5mbyAqcCwgaW50IE1vZGUpOworCisjaWYgMAorc3RhdGljIHZvaWQgUklPQWxsb2NhdGVJbnRlcnJ1cHRzKHN0cnVjdCByaW9faW5mbyAqKTsKK3N0YXRpYyBpbnQgUklPUmVwb3J0KHN0cnVjdCByaW9faW5mbyAqKTsKK3N0YXRpYyB2b2lkIFJJT1N0b3BJbnRlcnJ1cHRzKHN0cnVjdCByaW9faW5mbyAqLCBpbnQsIGludCk7CisjZW5kaWYKKworc3RhdGljIGludCBSSU9TY3J1YihpbnQsIEJZVEUgKiwgaW50KTsKKworI2lmIDAKK2V4dGVybiBpbnQJcmlvX2ludHIoKTsKKworLyoKKyoqCUluaXQgdGltZSBjb2RlLgorKi8KK3ZvaWQKK3Jpb2luaXQoIHAsIGluZm8gKQorc3RydWN0IHJpb19pbmZvCQkqIHA7CitzdHJ1Y3QgUmlvSG9zdEluZm8JKiBpbmZvOworeworCS8qCisJKiogTXVsdGktSG9zdCBjYXJkIHN1cHBvcnQgLSB0YWtpbmcgdGhlIGVhc3kgd2F5IG91dCAtIHNvcnJ5ICEKKwkqKiBXZSBhbGxvY2F0ZSBhbmQgc2V0IHVwIHRoZSBIb3N0IGFuZCBQb3J0IHN0cnVjdHMgd2hlbiB0aGUKKwkqKiBkcml2ZXIgaXMgY2FsbGVkIHRvICdpbnN0YWxsJyB0aGUgZmlyc3QgaG9zdC4KKwkqKiBXZSBjaGVjayBmb3IgdGhpcyBmaXJzdCAnY2FsbCcgYnkgdGVzdGluZyB0aGUgUklPUG9ydHAgcG9pbnRlci4KKwkqLworCWlmICggIXAtPlJJT1BvcnRwICkKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJBbGxvY2F0aW5nIGFuZCBzZXR0aW5nIHVwIGRyaXZlciBkYXRhIHN0cnVjdHVyZXNcbiIpOworCisJCVJJT0FsbG9jRGF0YVN0cnVjdHMocCk7CQkvKiBhbGxvY2F0ZSBob3N0L3BvcnQgc3RydWN0cyAqLworCQlSSU9TZXR1cERhdGFTdHJ1Y3RzKHApOwkJLyogc2V0dXAgdG9wb2xvZ3kgc3RydWN0cyAqLworCX0KKworCVJJT0luaXRIb3N0cyggcCwgaW5mbyApOwkvKiBodW50IGRvd24gdGhlIGhhcmR3YXJlICovCisKKwlSSU9BbGxvY2F0ZUludGVycnVwdHMocCk7CS8qIGFsbG9jYXRlIGludGVycnVwdHMgKi8KKwlSSU9SZXBvcnQocCk7CQkJLyogc2hvdyB3aGF0IHdlIGZvdW5kICovCit9CisKKy8qCisqKiBJbml0aWFsaXNlIHRoZSBDYXJkcyAKKyovIAordm9pZAorUklPSW5pdEhvc3RzKHAsIGluZm8pCitzdHJ1Y3QgcmlvX2luZm8JCSogcDsKK3N0cnVjdCBSaW9Ib3N0SW5mbwkqIGluZm87Cit7CisvKgorKiogMTUuMTAuMTk5OCBBUkcgLSBFU0lMIDA3NjIgcGFydCBmaXgKKyoqIElmIHRoZXJlIGlzIG5vIElTQSBjYXJkIGRlZmluaXRpb24gLSB3ZSBhbHdheXMgbG9vayBmb3IgUENJIGNhcmRzLgorKiogQXMgd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBvbmUgaG9zdCBjYXJkIHRoaXMgbGV0cyBhbiBJU0EgY2FyZAorKiogZGVmaW5pdGlvbiB0YWtlIHByZWNlZGVuY2Ugb3ZlciBQTFVHIGFuZCBQTEFZLgorKiogTm8gSVNBIGNhcmQgLSB3ZSBhcmUgUExVRyBhbmQgUExBWSB3aXRoIFBDSS4KKyovCisKKwkvKgorCSoqIE5vdGUgLSBmb3IgUENJIGJvdGggdGhlc2Ugd2lsbCBiZSB6ZXJvLCB0aGF0J3Mgb2theSBiZWNhdXNlCisJKiogUklPUENJSW5pdCgpIGZpbGxzIHRoZW0gaW4gaWYgYSBjYXJkIGlzIGZvdW5kLgorCSovCisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkl2ZWMJPSBpbmZvLT52ZWN0b3I7CisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUAk9IGluZm8tPmxvY2F0aW9uOworCisJLyoKKwkqKiBDaGVjayB0aGF0IHdlIGFyZSBhYmxlIHRvIGFjY29tbW9kYXRlIGFub3RoZXIgaG9zdAorCSovCisJaWYgKCBwLT5SSU9OdW1Ib3N0cyA+PSBSSU9fSE9TVFMgKQorCXsKKwkJcC0+UklPRmFpbGVkKys7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIGluZm8tPmJ1cyAmIElTQV9CVVMgKQorCXsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgImluaXRpYWxpc2luZyBjYXJkICVkIChJU0EpXG4iLCBwLT5SSU9OdW1Ib3N0cyk7CisJCVJJT0lTQWluaXQocCwgcC0+bW9kZSk7CisJfQorCWVsc2UKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJpbml0aWFsaXNpbmcgY2FyZCAlZCAoUENJKVxuIiwgcC0+UklPTnVtSG9zdHMpOworCQlSSU9QQ0lpbml0KHAsIFJJT19QQ0lfREVGQVVMVF9NT0RFKTsKKwl9CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiVG90YWwgaG9zdHMgaW5pdGlhbGlzZWQgc28gZmFyIDogJWRcbiIsIHAtPlJJT051bUhvc3RzKTsKKworCisjaWZkZWYgRlVUVVJFX1JFTEVBU0UKKwlpZiAocC0+YnVzICYgRUlTQV9CVVMpCisJCS8qIEVJU0EgY2FyZCAqLworCQlSSU9FSVNBaW5pdChwLCBSSU9fRUlTQV9ERUZBVUxUX01PREUpOworCisJaWYgKHAtPmJ1cyAmIE1DQV9CVVMpCisJCS8qIE1DQSBjYXJkICovCisJCVJJT01DQWluaXQocCwgUklPX01DQV9ERUZBVUxUX01PREUpOworI2VuZGlmCit9CisKKy8qCisqKiBnbyB0aHJvdWdoIG1lbW9yeSBmb3IgYW4gQVQgaG9zdCB0aGF0IHdlIHBhc3MgaW4gdGhlIGRldmljZSBpbmZvCisqKiBzdHJ1Y3R1cmUgYW5kIGluaXRpYWxpc2UKKyovCit2b2lkCitSSU9JU0Fpbml0KHAsIG1vZGUpCitzdHJ1Y3QgcmlvX2luZm8gKglwOworaW50CQkJCQltb2RlOworeworCisgIC8qIFhYWCBOZWVkIHRvIGltcGxlbWVudCB0aGlzLiAqLworI2lmIDAKKwlwLT5pbnRyX3RpZCA9IGlvaW50c2V0KHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5JdmVjLAorCQkJCQkoaW50ICgqKSgpKXJpb19pbnRyLCAoY2hhciopcC0+UklPTnVtSG9zdHMpOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIlNldCBpbnRlcnJ1cHQgaGFuZGxlciwgaW50cl90aWQgPSAweCV4XG4iLCBwLT5pbnRyX3RpZCApOworCisJaWYgKFJJT0RvQVQocCwgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwgbW9kZSkpIHsKKwkJcmV0dXJuOworCX0KKwllbHNlIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPRG9BVCBmYWlsZWRcbiIpOworCQlwLT5SSU9GYWlsZWQrKzsKKwl9CisjZW5kaWYKKworfQorCisvKgorKiogUklPRG9BVCA6CisqKgorKiogTWFwIGluIGEgYm9hcmRzIHBoeXNpY2FsIGFkZHJlc3MsIGNoZWNrIHRoYXQgdGhlIGJvYXJkIGlzIHRoZXJlLAorKiogdGVzdCB0aGUgYm9hcmQgYW5kIGlmIGV2ZXJ5dGhpbmcgaXMgb2theSBhc3NpZ24gdGhlIGJvYXJkIGFuIGVudHJ5CisqKiBpbiB0aGUgUmlvIEhvc3RzIHN0cnVjdHVyZS4KKyovCitpbnQKK1JJT0RvQVQocCwgQmFzZSwgbW9kZSkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitpbnQJCUJhc2U7CitpbnQJCW1vZGU7Cit7CisjZGVmaW5lCUZPVU5ECQkxCisjZGVmaW5lIE5PVF9GT1VORAkwCisKKwljYWRkcl90CQljYXJkQWRkcjsKKworCS8qCisJKiogQ2hlY2sgdG8gc2VlIGlmIHdlIGFjdHVhbGx5IGhhdmUgYSBib2FyZCBhdCB0aGlzIHBoeXNpY2FsIGFkZHJlc3MuCisJKi8KKwlpZiAoKGNhcmRBZGRyID0gUklPQ2hlY2tGb3JBVENhcmQoQmFzZSkpICE9IDApIHsKKwkJLyoKKwkJKiogTm93IHRlc3QgdGhlIGJvYXJkIHRvIHNlZSBpZiBpdCBpcyB3b3JraW5nLgorCQkqLworCQlpZiAoUklPQm9hcmRUZXN0KEJhc2UsIGNhcmRBZGRyLCBSSU9fQVQsIDApID09IFJJT19TVUNDRVNTKSB7CisJCQkvKgorCQkJKiogRmlsbCBvdXQgYSBzbG90IGluIHRoZSBSaW8gaG9zdCBzdHJ1Y3R1cmUuCisJCQkqLworCQkJaWYgKFJJT0Fzc2lnbkFUKHAsIEJhc2UsIGNhcmRBZGRyLCBtb2RlKSkgeworCQkJCXJldHVybihGT1VORCk7CisJCQl9CisJCX0KKwkJUklPTWFwb3V0KEJhc2UsIFJJT19BVF9NRU1fU0laRSwgY2FyZEFkZHIpOworCX0KKwlyZXR1cm4oTk9UX0ZPVU5EKTsKK30KKworY2FkZHJfdAorUklPQ2hlY2tGb3JBVENhcmQoQmFzZSkKK2ludAkJQmFzZTsKK3sKKwlpbnQJCQkJb2ZmOworCXN0cnVjdCBEcFJhbQkqY2FyZHA7CQkvKiAoUG9pbnRzIGF0IHRoZSBob3N0KSAqLworCWNhZGRyX3QJCQl2aXJ0QWRkcjsKKwl1bnNpZ25lZCBjaGFyCQkJUklPU2lnVGFiWzI0XTsKKy8qCisqKiBUYWJsZSBvZiB2YWx1ZXMgdG8gc2VhcmNoIGZvciBhcyBwcm9tIHNpZ25hdHVyZSBvZiBhIGhvc3QgY2FyZAorKi8KKwlzdHJjcHkoUklPU2lnVGFiLCAiSkJKR1BHR0hJTlNNSlBKUiIpOworCisJLyoKKwkqKiBIZXkhIFllcywgWW91IHJlYWRpbmcgdGhpcyBjb2RlISBZbywgZ3JhYiBhIGxvYWQgYSB0aGlzOgorCSoqCisJKiogSUYgdGhlIGNhcmQgaXMgdXNpbmcgV09SRCBNT0RFIHJhdGhlciB0aGFuIEJZVEUgTU9ERQorCSoqIHRoZW4gaXQgd2lsbCBvY2N1cHkgMTI4SyBvZiBQSFlTSUNBTCBtZW1vcnkgYXJlYS4gU28sCisJKiogeW91IG1pZ2h0IHRoaW5rIHRoYXQgdGhlIGZvbGxvd2luZyBNYXBpbiBpcyB3cm9uZy4gV2VsbCwKKwkqKiBpdCBpc24ndCwgYmVjYXVzZSB0aGUgU0VDT05EIDY0SyBvZiBvY2N1cGllZCBzcGFjZSBpcyBhbgorCSoqIEVYQUNUIENPUFkgb2YgdGhlIEZJUlNUIDY0Sy4gKGdvb2Q/KSwgc28sIHdlIG5lZWQgb25seQorCSoqIG1hcCBpdCBpbiBpbiBvbmUgNjRLIGJsb2NrLgorCSovCisJaWYgKFJJT01hcGluKEJhc2UsIFJJT19BVF9NRU1fU0laRSwgJnZpcnRBZGRyKSA9PSAtMSkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogQ291bGRuJ3QgbWFwIHRoZSBib2FyZCBpbiFcbiIpOworCQlyZXR1cm4oKGNhZGRyX3QpMCk7CisJfQorCisJLyoKKwkqKiB2aXJ0QWRkciBwb2ludHMgdG8gdGhlIERQIHJhbSBvZiB0aGUgc3lzdGVtLgorCSoqIFdlIG5vdyBjYXN0IHRoaXMgdG8gYSBwb2ludGVyIHRvIGEgUklPIEhvc3QsCisJKiogYW5kIGhhdmUgYSBydW1tYWdlIGFib3V0IGluIHRoZSBQUk9NLgorCSovCisJY2FyZHAgPSAoc3RydWN0IERwUmFtICopdmlydEFkZHI7CisKKwlmb3IgKG9mZj0wOyBSSU9TaWdUYWJbb2ZmXTsgb2ZmKyspIHsKKwkJaWYgKChSQllURShjYXJkcC0+RHBTaWduYXR1cmVbb2ZmXSkgJiAweEZGKSAhPSBSSU9TaWdUYWJbb2ZmXSkgeworCQkJLyoKKwkJCSoqIFNpZ25hdHVyZSBtaXNtYXRjaCAtIGNhcmQgbm90IGF0IHRoaXMgYWRkcmVzcworCQkJKi8KKwkJCVJJT01hcG91dChCYXNlLCBSSU9fQVRfTUVNX1NJWkUsIHZpcnRBZGRyKTsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBDb3VsZG4ndCBtYXRjaCB0aGUgc2lnbmF0dXJlIDB4JXggMHgleCFcbiIsCisJCQkJCQkoaW50KWNhcmRwLCBvZmYpOworCQkJcmV0dXJuKChjYWRkcl90KTApOworCQl9CisJfQorCisJLyoKKwkqKiBJZiB3ZSBnZXQgaGVyZSB0aGVuIHdlIG11c3QgaGF2ZSBmb3VuZCBhIHZhbGlkIGJvYXJkIHNvIHJldHVybgorCSoqIGl0cyB2aXJ0dWFsIGFkZHJlc3MuCisJKi8KKwlyZXR1cm4odmlydEFkZHIpOworfQorI2VuZGlmCisKKy8qKgorKiogUklPQXNzaWduQVQgOgorKioKKyoqIEZpbGwgb3V0IHRoZSBmaWVsZHMgaW4gdGhlIHAtPlJJT0hvc3RzIHN0cnVjdHVyZSBub3cgd2Uga25vdyB3ZSBrbm93CisqKiB3ZSBoYXZlIGEgYm9hcmQgcHJlc2VudC4KKyoqCisqKiBiaXRzIDwgMCBpbmRpY2F0ZXMgOCBiaXQgb3BlcmF0aW9uIHJlcXVlc3RlZCwKKyoqIGJpdHMgPiAwIGluZGljYXRlcyAxNiBiaXQgb3BlcmF0aW9uLgorKi8KK2ludAorUklPQXNzaWduQVQocCwgQmFzZSwgdmlydEFkZHIsIG1vZGUpCitzdHJ1Y3QgcmlvX2luZm8gKglwOworaW50CQlCYXNlOworY2FkZHJfdAl2aXJ0QWRkcjsKK2ludAkJbW9kZTsKK3sKKwlpbnQJCWJpdHM7CisJc3RydWN0IERwUmFtICpjYXJkcCA9IChzdHJ1Y3QgRHBSYW0gKil2aXJ0QWRkcjsKKworCWlmICgoQmFzZSA8IE9ORV9NRUcpIHx8IChtb2RlICYgQllURV9BQ0NFU1NfTU9ERSkpCisJCWJpdHMgPSBCWVRFX09QRVJBVElPTjsKKwllbHNlCisJCWJpdHMgPSBXT1JEX09QRVJBVElPTjsKKworCS8qCisJKiogQm9hcmQgaGFzIHBhc3NlZCBpdHMgc2NydWIgdGVzdC4gRmlsbCBpbiBhbGwgdGhlCisJKiogdHJhbnNpZW50IHN0dWZmLgorCSovCisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNhZGRyCT0gdmlydEFkZHI7CisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNhcmRQCT0gKHN0cnVjdCBEcFJhbSAqKXZpcnRBZGRyOworCisJLyoKKwkqKiBSZXZpc2lvbiAwMSBBVCBob3N0IGNhcmRzIGRvbid0IHN1cHBvcnQgV09SRCBvcGVyYXRpb25zLAorCSovCisJaWYgKCBSQllURShjYXJkcC0+RHBSZXZpc2lvbikgPT0gMDEgKQorCQliaXRzID0gQllURV9PUEVSQVRJT047CisKKwlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVHlwZSA9IFJJT19BVDsKKwlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ29weSA9IGJjb3B5OworCQkJCQkJCQkJCQkvKiBzZXQgdGhpcyBsYXRlciAqLworCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5TbG90ID0gLTE7CisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLk1vZGUgPSBTTE9XX0xJTktTIHwgU0xPV19BVF9CVVMgfCBiaXRzOworCVdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5Db250cm9sLCAKKwkJCUJPT1RfRlJPTV9SQU0gfCBFWFRFUk5BTF9CVVNfT0ZGIHwgCisJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uTW9kZSB8IAorCQkJSU5URVJSVVBUX0RJU0FCTEUgKTsKKwlXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUmVzZXRJbnQsMHhmZik7CisJV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNvbnRyb2wsCisJCQlCT09UX0ZST01fUkFNIHwgRVhURVJOQUxfQlVTX09GRiB8IAorCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLk1vZGUgfAorCQkJSU5URVJSVVBUX0RJU0FCTEUgKTsKKwlXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUmVzZXRJbnQsMHhmZik7CisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZU51bSA9CisJCSgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVswXSkmMHhGRik8PDApfAorCQkoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMV0pJjB4RkYpPDw4KXwKKwkJKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzJdKSYweEZGKTw8MTYpfAorCQkoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbM10pJjB4RkYpPDwyNCk7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFVuaXF1ZW51bSAweCV4XG4iLHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOworCisJcC0+UklPTnVtSG9zdHMrKzsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogVGVzdHMgUGFzc2VkIGF0IDB4JXhcbiIsIEJhc2UpOworCXJldHVybigxKTsKK30KKyNpZiAwCisjaWZkZWYgRlVUVVJFX1JFTEVBU0UKK2ludCBSSU9NQ0Fpbml0KGludCBNb2RlKQoreworCXVjaGFyIFNsb3ROdW1iZXI7CisJY2FkZHJfdCBDYWRkcjsKKwl1aW50CVBhZGRyOworCXVpbnQJSXZlYzsKKwlpbnQJIEhhbmRsZTsKKwlpbnQJIHJldCA9IDA7CisKKwkvKgorCSoqIFZhbGlkIG1vZGUgaW5mb3JtYXRpb24gZm9yIE1DQSBjYXJkcworCSoqIGlzIG9ubHkgRkFTVCBMSU5LUworCSovCisJTW9kZSA9IChNb2RlICYgRkFTVF9MSU5LUykgPyBNY2FUcEZhc3RMaW5rcyA6IE1jYVRwU2xvd0xpbmtzOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJT01DQWluaXQoJWQpXG4iLE1vZGUpOworCisKKwkvKgorCSoqIENoZWNrIG91dCBlYWNoIG9mIHRoZSBzbG90cworCSovCisJZm9yIChTbG90TnVtYmVyID0gMDsgU2xvdE51bWJlciA8IE1jYU1heFNsb3RzOyBTbG90TnVtYmVyKyspIHsKKwkvKgorCSoqIEVuYWJsZSB0aGUgc2xvdCB3ZSB3YW50IHRvIHRhbGsgdG8KKwkqLworCW91dGIoIE1jYVNsb3RTZWxlY3QsIFNsb3ROdW1iZXIgfCBNY2FTbG90RW5hYmxlICk7CisKKwkvKgorCSoqIFJlYWQgdGhlIElEIHdvcmQgZnJvbSB0aGUgc2xvdAorCSovCisJaWYgKCgoaW5iKE1jYUlkSGlnaCk8PCA4KXxpbmIoTWNhSWRMb3cpKSA9PSBNY2FSSU9JZCkKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlBvdGVudGlhbCBNQ0EgY2FyZCBpbiBzbG90ICVkXG4iLCBTbG90TnVtYmVyKTsKKworCQkvKgorCQkqKiBDYXJkIGFwcGVhcnMgdG8gYmUgYSBSSU8gTUNBIGNhcmQhCisJCSovCisJCVJJT01hY2hpbmVUeXBlIHw9ICgxPDxSSU9fTUNBKTsKKworCQkvKgorCQkqKiBKdXN0IGNoZWNrIHdlIGhhdmVuJ3QgZm91bmQgdG9vIG1hbnkgd29uZGVyZnVsIG9iamVjdHMKKwkJKi8KKwkJaWYgKCBSSU9OdW1Ib3N0cyA+PSBSSU9fSE9TVFMgKQorCQl7CisJCVJwcmludGYoUklPTWVzZ1Rvb01hbnlDYXJkcyk7CisJCXJldHVybihyZXQpOworCQl9CisKKwkJLyoKKwkJKiogTWNhSXJxRW5hYmxlIGNvbnRhaW5zIHRoZSBpbnRlcnJ1cHQgdmVjdG9yLCBhbmQgYSBjYXJkCisJCSoqIGVuYWJsZSBiaXQuCisJCSovCisJCUl2ZWMgPSBpbmIoTWNhSXJxRW5hYmxlKTsKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJJdmVjIGlzICV4XG4iLCBJdmVjKTsKKworCQlzd2l0Y2ggKCBJdmVjICYgTWNhSXJxTWFzayApCisJCXsKKwkJY2FzZSBNY2FJcnE5OgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJJUlE5XG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgTWNhSXJxMzoKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiSVJRM1xuIik7CisJCWJyZWFrOworCQljYXNlIE1jYUlycTQ6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIklSUTRcbiIpOworCQlicmVhazsKKwkJY2FzZSBNY2FJcnE3OgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJJUlE3XG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgTWNhSXJxMTA6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIklSUTEwXG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgTWNhSXJxMTE6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIklSUTExXG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgTWNhSXJxMTI6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIklSUTEyXG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgTWNhSXJxMTU6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIklSUTE1XG4iKTsKKwkJYnJlYWs7CisJCX0KKworCQkvKgorCQkqKiBJZiB0aGUgY2FyZCBlbmFibGUgYml0IGlzbid0IHNldCwgdGhlbiBzZXQgaXQhCisJCSovCisJCWlmICgoSXZlYyAmIE1jYUNhcmRFbmFibGUpICE9IE1jYUNhcmRFbmFibGUpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIk1jYUNhcmRFbmFibGUgbm90IHNldCAtIHNldHRpbmchXG4iKTsKKwkJCW91dGIoTWNhSXJxRW5hYmxlLEl2ZWN8TWNhQ2FyZEVuYWJsZSk7CisJCX0gZWxzZQorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiTWNhQ2FyZEVuYWJsZSBhbHJlYWR5IHNldFxuIik7CisKKwkJLyoKKwkJKiogQ29udmVydCB0aGUgSVJRIGVuYWJsZSBtYXNrIGludG8gc29tZXRoaW5nIHVzZWZ1bAorCQkqLworCQlJdmVjID0gUklPTWNhVG9JdmVjW0l2ZWMgJiBNY2FJcnFNYXNrXTsKKworCQkvKgorCQkqKiBGaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgImluYihNY2FNZW1vcnkpIGlzICV4XG4iLCBpbmIoTWNhTWVtb3J5KSk7CisJCVBhZGRyID0gTWNhQWRkcmVzcyhpbmIoTWNhTWVtb3J5KSk7CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiTUNBIGNhcmQgaGFzIEl2ZWMgJWQgQWRkciAleFxuIiwgSXZlYywgUGFkZHIpOworCisJCWlmICggUGFkZHIgIT0gMCApCisJCXsKKworCQkvKgorCQkqKiBUZWxsIHRoZSBtZW1vcnkgbWFwcGVyIHRoYXQgd2Ugd2FudCB0byB0YWxrIHRvIGl0CisJCSovCisJCUhhbmRsZSA9IFJJT01hcGluKCBQYWRkciwgUklPX01DQV9NRU1fU0laRSwgJkNhZGRyICk7CisKKwkJaWYgKCBIYW5kbGUgPT0gLTEgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJDb3VsZG4ndCBtYXAgJWQgYnl0ZXMgYXQgJXhcbiIsIFJJT19NQ0FfTUVNX1NJWkUsIFBhZGRyOworCQkJY29udGludWU7CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJCb2FyZCBtYXBwZWQgdG8gdmFkZHIgMHgleFxuIiwgQ2FkZHIpOworCisJCS8qCisJCSoqIEFuZCBjaGVjayB0aGF0IGl0IGlzIGFjdHVhbGx5IHRoZXJlIQorCQkqLworCQlpZiAoIFJJT0JvYXJkVGVzdCggUGFkZHIsQ2FkZHIsUklPX01DQSxTbG90TnVtYmVyICkgPT0gUklPX1NVQ0NFU1MgKQorCQl7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJCb2FyZCBoYXMgcGFzc2VkIHRlc3RcbiIpOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiU2xvdCAlZC4gVHlwZSAlZC4gUGFkZHIgMHgleC4gQ2FkZHIgMHgleC4gTW9kZSAweCV4LlxuIiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90TnVtYmVyLCBSSU9fTUNBLCBQYWRkciwgQ2FkZHIsIE1vZGUpOworCisJCQkvKgorCQkJKiogQm9hcmQgaGFzIHBhc3NlZCBpdHMgc2NydWIgdGVzdC4gRmlsbCBpbiBhbGwgdGhlCisJCQkqKiB0cmFuc2llbnQgc3R1ZmYuCisJCQkqLworCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlNsb3QJID0gU2xvdE51bWJlcjsKKwkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5JdmVjCSA9IEl2ZWM7CisJCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVHlwZQkgPSBSSU9fTUNBOworCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLkNvcHkJID0gYmNvcHk7CisJCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uUGFkZHJQICAgPSBQYWRkcjsKKwkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5DYWRkcgk9IENhZGRyOworCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLkNhcmRQCT0gKHN0cnVjdCBEcFJhbSAqKUNhZGRyOworCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLk1vZGUJID0gTW9kZTsKKwkJCVdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5SZXNldEludCAsIDB4ZmYpOworCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZU51bSA9CisJCQkoKFJCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbMF0pJjB4RkYpPDwwKXwKKwkJCQkJCSgoUkJZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVsxXSkmMHhGRik8PDgpfAorCQkJKChSQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzJdKSYweEZGKTw8MTYpfAorCQkJKChSQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzNdKSYweEZGKTw8MjQpOworCQkJUklPTnVtSG9zdHMrKzsKKwkJCXJldCsrOworCQl9CisJCWVsc2UKKwkJeworCQkJLyoKKwkJCSoqIEl0IGZhaWxlZCB0aGUgdGVzdCwgc28gaWdub3JlIGl0LgorCQkJKi8KKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlRFU1QgRkFJTEVEXG4iKTsKKwkJCVJJT01hcG91dChQYWRkciwgUklPX01DQV9NRU1fU0laRSwgQ2FkZHIgKTsKKwkJfQorCQl9CisJCWVsc2UKKwkJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJTbG90ICVkIC0gUGFkZHIgemVybyFcbiIsIFNsb3ROdW1iZXIpOworCQl9CisJfQorCWVsc2UKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlNsb3QgJWQgTk9UIFJJT1xuIiwgU2xvdE51bWJlcik7CisJfQorCX0KKwkvKgorCSoqIE5vdyB3ZSBoYXZlIGNoZWNrZWQgYWxsIHRoZSBzbG90cywgdHVybiBvZmYgdGhlIE1DQSBzbG90IHNlbGVjdG9yCisJKi8KKwlvdXRiKE1jYVNsb3RTZWxlY3QsMCk7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiU2xvdCAlZCBOT1QgUklPXG4iLCBTbG90TnVtYmVyKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgUklPRUlTQWluaXQoIGludCBNb2RlICkKK3sKKwlzdGF0aWMgaW50IEVJU0FEb25lID0gMDsKKwl1aW50IFBhZGRyOworCWludCBQb2xsSW50TWl4TXNnRG9uZSA9IDA7CisJY2FkZHJfdCBDYWRkcjsKKwl1c2hvcnQgSWRlbnQ7CisJdWNoYXIgRWlzYVNsb3Q7CisJdWNoYXIgSXZlYzsKKwlpbnQgcmV0ID0gMDsKKworCS8qCisJKiogVGhlIG9ubHkgdmFsaWQgbW9kZSBpbmZvcm1hdGlvbiBmb3IgRUlTQSBob3N0cyBpcyBmYXN0IG9yIHNsb3cKKwkqKiBsaW5rcy4KKwkqLworCU1vZGUgPSAoTW9kZSAmIEZBU1RfTElOS1MpID8gRUlTQV9UUF9GQVNUX0xJTktTIDogRUlTQV9UUF9TTE9XX0xJTktTOworCisJaWYgKCBFSVNBRG9uZSApCisJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU9FSVNBaW5pdCgpIC0gYWxyZWFkeSBkb25lLCByZXR1cm4uXG4iKTsKKwkJcmV0dXJuKDApOworCX0KKworCUVJU0FEb25lKys7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU9FSVNBaW5pdCgpXG4iKTsKKworCisJLyoKKwkqKiBGaXJzdCBjaGVjayBhbGwgY2FyZHMgdG8gc2VlIGlmIEFOWSBhcmUgc2V0IGZvciBwb2xsZWQgbW9kZSBvcGVyYXRpb24uCisJKiogSWYgc28sIHNldCBBTEwgdG8gcG9sbGVkLgorCSovCisKKwlmb3IgKCBFaXNhU2xvdD0xOyBFaXNhU2xvdDw9UklPX01BWF9FSVNBX1NMT1RTOyBFaXNhU2xvdCsrICkKKwl7CisJSWRlbnQgPSAoSU5CWihFaXNhU2xvdCxFSVNBX1BST0RVQ1RfSURFTlRfSEkpPDw4KSB8CisJCSBJTkJaKEVpc2FTbG90LEVJU0FfUFJPRFVDVF9JREVOVF9MTyk7CisKKwlpZiAoIElkZW50ID09IFJJT19FSVNBX0lERU5UICkKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkZvdW5kIFNwZWNpYWxpeCBwcm9kdWN0XG4iKTsKKworCQlpZiAoIElOQlooRWlzYVNsb3QsRUlTQV9QUk9EVUNUX05VTUJFUikgIT0gUklPX0VJU0FfUFJPRFVDVF9DT0RFICkKKwkJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJOb3QgU3BlY2lhbGl4IFJJTyAtIFByb2R1Y3QgbnVtYmVyICV4XG4iLAorCQkJCQkJSU5CWihFaXNhU2xvdCwgRUlTQV9QUk9EVUNUX05VTUJFUikpOworCQljb250aW51ZTsgIC8qIG5leHQgc2xvdCAqLworCQl9CisJCS8qCisJCSoqIEl0cyBhIFNwZWNpYWxpeCBSSU8hCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTyBSZXZpc2lvbiAlZFxuIiwKKwkJCQkJSU5CWihFaXNhU2xvdCwgRUlTQV9SRVZJU0lPTl9OVU1CRVIpKTsKKwkJCisJCVJJT01hY2hpbmVUeXBlIHw9ICgxPDxSSU9fRUlTQSk7CisKKwkJLyoKKwkJKiogSnVzdCBjaGVjayB3ZSBoYXZlbid0IGZvdW5kIHRvbyBtYW55IHdvbmRlcmZ1bCBvYmplY3RzCisJCSovCisJCWlmICggUklPTnVtSG9zdHMgPj0gUklPX0hPU1RTICkKKwkJeworCQlScHJpbnRmKFJJT01lc2dUb29NYW55Q2FyZHMpOworCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qCisJCSoqIEVuc3VyZSB0aGF0IHRoZSBlbmFibGUgYml0IGlzIHNldCEKKwkJKi8KKwkJT1VUQlooIEVpc2FTbG90LCBFSVNBX0VOQUJMRSwgUklPX0VJU0FfRU5BQkxFX0JJVCApOworCisJCS8qCisJCSoqIEVJU0FfSU5URVJSVVBUX1ZFQyBjb250YWlucyB0aGUgaW50ZXJydXB0IHZlY3Rvci4KKwkJKi8KKwkJSXZlYyA9IElOQlooRWlzYVNsb3QsRUlTQV9JTlRFUlJVUFRfVkVDKTsKKworI2lmZGVmIFJJT0RFQlVHCisJCXN3aXRjaCAoIEl2ZWMgJiBFSVNBX0lOVEVSUlVQVF9NQVNLICkKKwkJeworCQljYXNlIEVJU0FfSVJRXzM6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSAzXG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgRUlTQV9JUlFfNDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDRcbiIpOworCQlicmVhazsKKwkJY2FzZSBFSVNBX0lSUV81OgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgNVxuIik7CisJCWJyZWFrOworCQljYXNlIEVJU0FfSVJRXzY6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSA2XG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgRUlTQV9JUlFfNzoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDdcbiIpOworCQlicmVhazsKKwkJY2FzZSBFSVNBX0lSUV85OgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgOVxuIik7CisJCWJyZWFrOworCQljYXNlIEVJU0FfSVJRXzEwOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgMTBcbiIpOworCQlicmVhazsKKwkJY2FzZSBFSVNBX0lSUV8xMToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDExXG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgRUlTQV9JUlFfMTI6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSAxMlxuIik7CisJCWJyZWFrOworCQljYXNlIEVJU0FfSVJRXzE0OgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgMTRcbiIpOworCQlicmVhazsKKwkJY2FzZSBFSVNBX0lSUV8xNToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDE1XG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgRUlTQV9QT0xMRUQ6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIFBPTExFRFxuIik7CisJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCBOVUxMLERCR19JTklUfERCR19GQUlMLCJTaGFnZ2VkIGludGVycnVwdCBudW1iZXIhXG4iKTsKKwkJSXZlYyAmPSBFSVNBX0NPTlRST0xfTUFTSzsKKwkJfQorI2VuZGlmCisKKwkJaWYgKCAoSXZlYyAmIEVJU0FfSU5URVJSVVBUX01BU0spID09CisJCSBFSVNBX1BPTExFRCApCisJCXsKKwkJUklPV2lsbFBvbGwgPSAxOworCQlicmVhazsJCS8qIEZyb20gRWlzYVNsb3QgbG9vcCAqLworCQl9CisJfQorCX0KKworCS8qCisJKiogRG8gaXQgYWxsIGFnYWluIG5vdyB3ZSBrbm93IHdoZXRoZXIgdG8gY2hhbmdlIGFsbCBjYXJkcyB0byBwb2xsZWQKKwkqKiBtb2RlIG9yIG5vdAorCSovCisKKwlmb3IgKCBFaXNhU2xvdD0xOyBFaXNhU2xvdDw9UklPX01BWF9FSVNBX1NMT1RTOyBFaXNhU2xvdCsrICkKKwl7CisJSWRlbnQgPSAoSU5CWihFaXNhU2xvdCxFSVNBX1BST0RVQ1RfSURFTlRfSEkpPDw4KSB8CisJCSBJTkJaKEVpc2FTbG90LEVJU0FfUFJPRFVDVF9JREVOVF9MTyk7CisKKwlpZiAoIElkZW50ID09IFJJT19FSVNBX0lERU5UICkKKwl7CisJCWlmICggSU5CWihFaXNhU2xvdCxFSVNBX1BST0RVQ1RfTlVNQkVSKSAhPSBSSU9fRUlTQV9QUk9EVUNUX0NPREUgKQorCQljb250aW51ZTsgIC8qIG5leHQgc2xvdCAqLworCisJCS8qCisJCSoqIEl0cyBhIFNwZWNpYWxpeCBSSU8hCisJCSovCisJCQorCQkvKgorCQkqKiBFbnN1cmUgdGhhdCB0aGUgZW5hYmxlIGJpdCBpcyBzZXQhCisJCSovCisJCU9VVEJaKCBFaXNhU2xvdCwgRUlTQV9FTkFCTEUsIFJJT19FSVNBX0VOQUJMRV9CSVQgKTsKKworCQkvKgorCQkqKiBFSVNBX0lOVEVSUlVQVF9WRUMgY29udGFpbnMgdGhlIGludGVycnVwdCB2ZWN0b3IuCisJCSovCisJCUl2ZWMgPSBJTkJaKEVpc2FTbG90LEVJU0FfSU5URVJSVVBUX1ZFQyk7CisKKwkJaWYgKCBSSU9XaWxsUG9sbCApCisJCXsKKwkJCS8qCisJCQkqKiBJZiB3ZSBhcmUgZ29pbmcgdG8gb3BlcmF0ZSBpbiBwb2xsZWQgbW9kZSwgYnV0IHRoaXMKKwkJCSoqIGJvYXJkIGlzIGNvbmZpZ3VyZWQgdG8gYmUgaW50ZXJydXB0IGRyaXZlbiwgZGlzcGxheQorCQkJKiogdGhlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGUgc2l0dWF0aW9uIHRvIHRoZSBwdW50ZXIsCisJCQkqKiBhc3N1bWluZyB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzby4KKwkJCSovCisKKwkJCWlmICggIVBvbGxJbnRNaXhNc2dEb25lICYmCisJCQkgKEl2ZWMgJiBFSVNBX0lOVEVSUlVQVF9NQVNLKSAhPSBFSVNBX1BPTExFRCApCisJCQl7CisJCQlScHJpbnRmKFJJT01lc2dBbGxQb2xsZWQpOworCQkJUG9sbEludE1peE1zZ0RvbmUgPSAxOworCQkJfQorCisJCQkvKgorCQkJKiogVW5ncmFjaW91c2x5IGlnbm9yZSB3aGF0ZXZlciB0aGUgYm9hcmQgcmVwb3J0cyBhcyBpdHMKKwkJCSoqIGludGVycnVwdCB2ZWN0b3IuLi4KKwkJCSovCisKKwkJCUl2ZWMgJj0gfkVJU0FfSU5URVJSVVBUX01BU0s7CisKKwkJCS8qCisJCQkqKiAuLi5hbmQgZm9yY2UgaXQgdG8gZGFuY2UgdG8gdGhlIHBvbGwgdHVuZS4KKwkJCSovCisKKwkJCUl2ZWMgfD0gRUlTQV9QT0xMRUQ7CisJCX0KKworCQkvKgorCQkqKiBDb252ZXJ0IHRoZSBJUlEgZW5hYmxlIG1hc2sgaW50byBzb21ldGhpbmcgdXNlZnVsICgwLTE1KQorCQkqLworCQlJdmVjID0gUklPRWlzYVRvSXZlYyhJdmVjKTsKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIGhvc3QgaW4gc2xvdCAlZCBoYXMgSXZlYyAweCV4XG4iLAorCQkgRWlzYVNsb3QsIEl2ZWMpOworCisJCS8qCisJCSoqIEZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwkJKi8KKwkJUGFkZHIgPSAoSU5CWihFaXNhU2xvdCxFSVNBX01FTU9SWV9CQVNFX0hJKTw8MjQpIHwKKwkJCQkoSU5CWihFaXNhU2xvdCxFSVNBX01FTU9SWV9CQVNFX0xPKTw8MTYpOworCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgY2FyZCBoYXMgSXZlYyAlZCBBZGRyICV4XG4iLCBJdmVjLCBQYWRkcik7CisKKwkJaWYgKCBQYWRkciA9PSAwICkKKwkJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsCisJCSAiQm9hcmQgaW4gc2xvdCAlZCBjb25maWd1cmVkIGZvciBhZGRyZXNzIHplcm8hXG4iLCBFaXNhU2xvdCk7CisJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJKiogVGVsbCB0aGUgbWVtb3J5IG1hcHBlciB0aGF0IHdlIHdhbnQgdG8gdGFsayB0byBpdAorCQkqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJBYm91dCB0byBtYXAgRUlTQSBjYXJkIFxuIik7CisKKwkJaWYgKFJJT01hcGluKCBQYWRkciwgUklPX0VJU0FfTUVNX1NJWkUsICZDYWRkcikgPT0gLTEpIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiQ291bGRuJ3QgbWFwICVkIGJ5dGVzIGF0ICV4XG4iLAorCQkJCQkJCVJJT19FSVNBX01FTV9TSVpFLFBhZGRyKTsKKwkJY29udGludWU7CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJCb2FyZCBtYXBwZWQgdG8gdmFkZHIgMHgleFxuIiwgQ2FkZHIpOworCisJCS8qCisJCSoqIEFuZCBjaGVjayB0aGF0IGl0IGlzIGFjdHVhbGx5IHRoZXJlIQorCQkqLworCQlpZiAoIFJJT0JvYXJkVGVzdCggUGFkZHIsQ2FkZHIsUklPX0VJU0EsRWlzYVNsb3QpID09IFJJT19TVUNDRVNTICkKKwkJCXsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiQm9hcmQgaGFzIHBhc3NlZCB0ZXN0XG4iKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAKKwkJIlNsb3QgJWQuIEl2ZWMgJWQuIFR5cGUgJWQuIFBhZGRyIDB4JXguIENhZGRyIDB4JXguIE1vZGUgMHgleC5cbiIsCisJCQlFaXNhU2xvdCxJdmVjLFJJT19FSVNBLFBhZGRyLENhZGRyLE1vZGUpOworCisJCS8qCisJCSoqIEJvYXJkIGhhcyBwYXNzZWQgaXRzIHNjcnViIHRlc3QuIEZpbGwgaW4gYWxsIHRoZQorCQkqKiB0cmFuc2llbnQgc3R1ZmYuCisJCSovCisJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5TbG90CSA9IEVpc2FTbG90OworCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uSXZlYwkgPSBJdmVjOworCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVHlwZQkgPSBSSU9fRUlTQTsKKwkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLkNvcHkJID0gYmNvcHk7CisJCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlBhZGRyUCAgID0gUGFkZHI7CisJCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLkNhZGRyCT0gQ2FkZHI7CisJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5DYXJkUAk9IChzdHJ1Y3QgRHBSYW0gKilDYWRkcjsKKwkJCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uTW9kZQkgPSBNb2RlOworCQkvKgorCQkqKiBiZWNhdXNlIHRoZSBFSVNBIHByb20gaXMgbWFwcGVkIGludG8gSU8gc3BhY2UsIHdlCisJCSoqIG5lZWQgdG8gY29weSB0aGUgdW5xaXVlIG51bWJlciBpbnRvIHRoZSBtZW1vcnkgYXJlYQorCQkqKiB0aGF0IGl0IHdvdWxkIGhhdmUgb2NjdXBpZWQsIHNvIHRoYXQgdGhlIGRvd25sb2FkCisJCSoqIGNvZGUgY2FuIGRldGVybWluZSBpdHMgSUQgYW5kIGNhcmQgdHlwZS4KKwkJKi8KKwkgV0JZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVswXSxJTkJaKEVpc2FTbG90LEVJU0FfVU5JUVVFX05VTV8wKSk7CisJIFdCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbMV0sSU5CWihFaXNhU2xvdCxFSVNBX1VOSVFVRV9OVU1fMSkpOworCSBXQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzJdLElOQlooRWlzYVNsb3QsRUlTQV9VTklRVUVfTlVNXzIpKTsKKwkgV0JZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVszXSxJTkJaKEVpc2FTbG90LEVJU0FfVU5JUVVFX05VTV8zKSk7CisJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVOdW0gPQorCQkJKChSQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzBdKSYweEZGKTw8MCl8CisJCQkJCQkoKFJCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbMV0pJjB4RkYpPDw4KXwKKwkJCSgoUkJZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVsyXSkmMHhGRik8PDE2KXwKKwkJCSgoUkJZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVszXSkmMHhGRik8PDI0KTsKKwkJSU5CWihFaXNhU2xvdCxFSVNBX0lOVEVSUlVQVF9SRVNFVCk7CisJCQkJUklPTnVtSG9zdHMrKzsKKwkJcmV0Kys7CisJCQl9CisJCWVsc2UKKwkJeworCQkvKgorCQkqKiBJdCBmYWlsZWQgdGhlIHRlc3QsIHNvIGlnbm9yZSBpdC4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiVEVTVCBGQUlMRURcbiIpOworCisJCVJJT01hcG91dChQYWRkciwgUklPX0VJU0FfTUVNX1NJWkUsIENhZGRyICk7CisJCX0KKwl9CisJfQorCWlmIChSSU9NYWNoaW5lVHlwZSAmIFJJT19FSVNBKQorCXJldHVybiByZXQrMTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKworI2lmbmRlZiBsaW51eAorCisjZGVmaW5lIENPTkZJR19BRERSRVNTCTB4Y2Y4CisjZGVmaW5lIENPTkZJR19EQVRBCQkweGNmYworI2RlZmluZSBGT1JXQVJEX1JFRwkJMHhjZmEKKworCitzdGF0aWMgaW50CityZWFkX2NvbmZpZyhpbnQgYnVzX251bWJlciwgaW50IGRldmljZV9udW0sIGludCByX251bWJlcikgCit7CisJdW5zaWduZWQgaW50IGNhdjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisvKgorICAgQnVpbGQgY29uZmlnX2FkZHJlc3NfdmFsdWU6CisKKyAgICAgIDMxICAgICAgICAyNCAyMyAgICAgICAgMTYgMTUgICAgICAxMSAxMCAgOCA3ICAgICAgICAwIAorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICB8MXwgMDAwMDAwMCB8IGJ1c19udW1iZXIgfCBkZXZpY2UgIyB8IDAwMCB8IHJlZ2lzdGVyIHwKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworCWNhdiA9IHJfbnVtYmVyICYgMHhmZjsKKwljYXYgfD0gKChkZXZpY2VfbnVtICYgMHgxZikgPDwgMTEpOworCWNhdiB8PSAoKGJ1c19udW1iZXIgJiAweGZmKSA8PCAxNik7CisJY2F2IHw9IDB4ODAwMDAwMDA7IC8qIEVuYWJsZSBiaXQgKi8KKwlvdXRwZChDT05GSUdfQUREUkVTUyxjYXYpOworCXZhbCA9IGlucGQoQ09ORklHX0RBVEEpOworCW91dHBkKENPTkZJR19BRERSRVNTLDApOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYword3JpdGVfY29uZmlnKGJ1c19udW1iZXIsZGV2aWNlX251bSxyX251bWJlcix2YWwpIAoreworCXVuc2lnbmVkIGludCBjYXY7CisKKy8qCisgICBCdWlsZCBjb25maWdfYWRkcmVzc192YWx1ZToKKworICAgICAgMzEgICAgICAgIDI0IDIzICAgICAgICAxNiAxNSAgICAgIDExIDEwICA4IDcgICAgICAgIDAgCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIHwxfCAwMDAwMDAwIHwgYnVzX251bWJlciB8IGRldmljZSAjIHwgMDAwIHwgcmVnaXN0ZXIgfAorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisJY2F2ID0gcl9udW1iZXIgJiAweGZmOworCWNhdiB8PSAoKGRldmljZV9udW0gJiAweDFmKSA8PCAxMSk7CisJY2F2IHw9ICgoYnVzX251bWJlciAmIDB4ZmYpIDw8IDE2KTsKKwljYXYgfD0gMHg4MDAwMDAwMDsgLyogRW5hYmxlIGJpdCAqLworCW91dHBkKENPTkZJR19BRERSRVNTLCBjYXYpOworCW91dHBkKENPTkZJR19EQVRBLCB2YWwpOworCW91dHBkKENPTkZJR19BRERSRVNTLCAwKTsKKwlyZXR1cm4gdmFsOworfQorI2Vsc2UKKy8qIFhYWCBJbXBsZW1lbnQgdGhlc2UuLi4gKi8KK3N0YXRpYyBpbnQKK3JlYWRfY29uZmlnKGludCBidXNfbnVtYmVyLCBpbnQgZGV2aWNlX251bSwgaW50IHJfbnVtYmVyKSAKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dyaXRlX2NvbmZpZyhpbnQgYnVzX251bWJlciwgaW50IGRldmljZV9udW0sIGludCByX251bWJlcikgCit7CisgIHJldHVybiAwOworfQorCisjZW5kaWYKKworaW50CitSSU9QQ0lpbml0KHAsIE1vZGUpCitzdHJ1Y3QgcmlvX2luZm8JKnA7CitpbnQgCQlNb2RlOworeworCSNkZWZpbmUgTUFYX1BDSV9TTE9UCQkzMgorCSNkZWZpbmUgUklPX1BDSV9KRVRfQ0FSRAkweDIwMDAxMUNCCisKKwlzdGF0aWMgaW50CXNsb3Q7CS8qIGNvdW50IG9mIG1hY2hpbmUncyBQQ0kgc2xvdHMgc2VhcmNoZWQgc28gZmFyICovCisJY2FkZHJfdAkJQ2FkZHI7CS8qIFZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBQQ0kgaG9zdCBjYXJkLiAqLworCXVuc2lnbmVkIGNoYXIJSXZlYzsJLyogaW50ZXJydXB0IHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgUENJIGhvc3QgKi8KKwl1bnNpZ25lZCBsb25nCVBhZGRyOwkvKiBQaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgY3VycmVudCBQQ0kgaG9zdCAqLworCWludAkJSGFuZGxlOwkvKiBIYW5kbGUgdG8gVmlydHVhbCBtZW1vcnkgYWxsb2NhdGVkIGZvciBjdXJyZW50IFBDSSBob3N0ICovCisKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJTZWFyY2ggZm9yIGEgUklPIFBDSSBjYXJkIC0gc3RhcnQgYXQgc2xvdCAlZFxuIiwgc2xvdCk7CisKKwkvKgorCSoqIEluaXRpYWxpc2UgdGhlIHNlYXJjaCBzdGF0dXMKKwkqLworCXAtPlJJT0xhc3RQQ0lTZWFyY2gJPSBSSU9fRkFJTDsKKworCXdoaWxlICggKHNsb3QgPCBNQVhfUENJX1NMT1QpICYgKHAtPlJJT0xhc3RQQ0lTZWFyY2ggIT0gUklPX1NVQ0NFU1MpICkKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJDdXJyZW50bHkgdGVzdGluZyBzbG90ICVkXG4iLCBzbG90KTsKKworCQlpZiAocmVhZF9jb25maWcoMCxzbG90LDApID09IFJJT19QQ0lfSkVUX0NBUkQpIHsKKwkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5JdmVjID0gMDsKKwkJCVBhZGRyID0gcmVhZF9jb25maWcoMCxzbG90LDB4MTgpOworCQkJUGFkZHIgPSBQYWRkciAtIChQYWRkciAmIDB4MSk7IC8qIE1hc2sgb2ZmIHRoZSBpbyBiaXQgKi8KKworCQkJaWYgKCAoUGFkZHIgPT0gMCkgfHwgKChQYWRkciAmIDB4ZmZmZjAwMDApID09IDB4ZmZmZjAwMDApICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJHb29mZWQgdXAgc2xvdFxuIik7CS8qIHdoYXQhICovCisJCQkJc2xvdCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUGFkZHJQID0gUGFkZHI7CisJCQlJdmVjID0gKHJlYWRfY29uZmlnKDAsc2xvdCwweDNjKSAmIDB4ZmYpOworCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiUENJIEhvc3QgYXQgMHgleCwgSW50ciAlZFxuIiwgKGludClQYWRkciwgSXZlYyk7CisKKwkJCUhhbmRsZSA9IFJJT01hcGluKCBQYWRkciwgUklPX1BDSV9NRU1fU0laRSwgJkNhZGRyICk7CisJCQlpZiAoSGFuZGxlID09IC0xKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIkNvdWxkbid0IG1hcCAlZCBieXRlcyBhdCAweCV4XG4iLCBSSU9fUENJX01FTV9TSVpFLCAoaW50KVBhZGRyKTsKKwkJCQlzbG90Kys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uSXZlYyA9IEl2ZWMgKyAzMjsKKwkJCXAtPmludHJfdGlkID0gaW9pbnRzZXQocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkl2ZWMsCisJCQkJCQkoaW50ICgqKSgpKXJpb19pbnRyLCAoY2hhciAqKXAtPlJJT051bUhvc3RzKTsKKwkJCWlmIChSSU9Cb2FyZFRlc3QoIFBhZGRyLCBDYWRkciwgUklPX1BDSSwgMCApID09IFJJT19TVUNDRVNTKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAoIkJvYXJkIGhhcyBwYXNzZWQgdGVzdFxuIik7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAoIlBhZGRyIDB4JXguIENhZGRyIDB4JXguIE1vZGUgMHgleC5cbiIsIFBhZGRyLCBDYWRkciwgTW9kZSk7CisKKwkJCQkvKgorCQkJCSoqIEJvYXJkIGhhcyBwYXNzZWQgaXRzIHNjcnViIHRlc3QuIEZpbGwgaW4gYWxsIHRoZQorCQkJCSoqIHRyYW5zaWVudCBzdHVmZi4KKwkJCQkqLworCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5TbG90CSAgID0gMDsKKwkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uSXZlYwkgICA9IEl2ZWMgKyAzMjsKKwkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVHlwZQkgICA9IFJJT19QQ0k7CisJCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNvcHkJICAgPSByaW9fcGNpY29weTsgCisJCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUAkgICA9IFBhZGRyOworCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkcgkgICA9IENhZGRyOworCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYXJkUAkgICA9IChzdHJ1Y3QgRHBSYW0gKilDYWRkcjsKKwkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uTW9kZQkgICA9IE1vZGU7CisKKyNpZiAwCisJCQkJV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNvbnRyb2wsIAorCQkJCQkJQk9PVF9GUk9NX1JBTSB8IEVYVEVSTkFMX0JVU19PRkYgfCAKKwkJCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5Nb2RlIHwgCisJCQkJCQlJTlRFUlJVUFRfRElTQUJMRSApOworCQkJCVdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5SZXNldEludCwweGZmKTsKKwkJCQlXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ29udHJvbCwKKwkJCQkJCUJPT1RfRlJPTV9SQU0gfCBFWFRFUk5BTF9CVVNfT0ZGIHwgCisJCQkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uTW9kZSB8CisJCQkJCQlJTlRFUlJVUFRfRElTQUJMRSApOworCQkJCVdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5SZXNldEludCwweGZmKTsKKyNlbHNlCisJCQkJV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlJlc2V0SW50LCAweGZmKTsKKyNlbmRpZgorCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0gID0KKwkJCQkJKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzBdKSYweEZGKTw8MCl8CisJCQkJCSgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVsxXSkmMHhGRik8PDgpfAorCQkJCQkoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMl0pJjB4RkYpPDwxNil8CisJCQkJCSgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVszXSkmMHhGRik8PDI0KTsKKworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlVuaXF1ZSBubyAweCV4LlxuIiwgCisJCQkJICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOworCisJCQkJcC0+UklPTGFzdFBDSVNlYXJjaCA9IFJJT19TVUNDRVNTOworCQkJCXAtPlJJT051bUhvc3RzKys7CisJCQl9CisJCX0KKwkJc2xvdCsrOworCX0KKworCWlmICggc2xvdCA+PSBNQVhfUENJX1NMT1QgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJBbGwgJWQgUENJIHNsb3RzIGhhdmUgdGVzdGVkIGZvciBSSU8gY2FyZHMgISEhXG4iLAorCQkJICAgICBNQVhfUENJX1NMT1QpOworCX0KKworCisJLyoKKwkqKiBJIGRvbid0IHRoaW5rIHdlIHdhbnQgdG8gZG8gdGhpcyBhbnltb3JlCisJKioKKworCWlmICghcC0+UklPTGFzdFBDSVNlYXJjaCA9PSBSSU9fRkFJTCApIHsKKwkJcC0+UklPRmFpbGVkKys7CisJfQorCisJKioKKwkqLworfQorCisjaWZkZWYgRlVUVVJFX1JFTEVBU0UKK3ZvaWQgcmlvaGFsdCggdm9pZCApCit7CisJaW50IGhvc3Q7CisJZm9yICggaG9zdD0wOyBob3N0PHAtPlJJT051bUhvc3RzOyBob3N0KysgKQorCXsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiU3RvcCBob3N0ICVkXG4iLCBob3N0KTsKKwkJKHZvaWQpUklPQm9hcmRUZXN0KCBwLT5SSU9Ib3N0c1tob3N0XS5QYWRkclAsIHAtPlJJT0hvc3RzW2hvc3RdLkNhZGRyLCBwLT5SSU9Ib3N0c1tob3N0XS5UeXBlLHAtPlJJT0hvc3RzW2hvc3RdLlNsb3QgKTsKKwl9Cit9CisjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMJdWNoYXIJdmFsW10gPSB7CisjaWZkZWYgVkVSWV9MT05HX1RFU1QKKwkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCisJICAweGE1LCAweGZmLCAweDVhLCAweDAwLCAweGZmLCAweGM5LCAweDM2LCAKKyNlbmRpZgorCSAgMHhmZiwgMHgwMCwgMHgwMCB9OworCisjZGVmaW5lCVRFU1RfRU5EIHNpemVvZih2YWwpCisKKy8qCisqKiBSQU0gdGVzdCBhIGJvYXJkLiAKKyoqIE5vdGhpbmcgdG9vIGNvbXBsaWNhdGVkLCBqdXN0IGVub3VnaCB0byBjaGVjayBpdCBvdXQuCisqLworaW50CitSSU9Cb2FyZFRlc3QocGFkZHIsIGNhZGRyLCB0eXBlLCBzbG90KQorcGFkZHJfdAlwYWRkcjsKK2NhZGRyX3QJY2FkZHI7Cit1Y2hhcgl0eXBlOworaW50CQlzbG90OworeworCXN0cnVjdCBEcFJhbSAqRHBSYW0gPSAoc3RydWN0IERwUmFtICopY2FkZHI7CisJY2hhciAqcmFtWzRdOworCWludCAgc2l6ZVs0XTsKKwlpbnQgIG9wLCBiYW5rOworCWludCAgbmJhbmtzOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFJlc2V0IGhvc3QgdHlwZT0lZCwgRHBSYW09MHgleCwgc2xvdD0lZFxuIiwKKwkJCXR5cGUsKGludClEcFJhbSwgc2xvdCk7CisKKwlSSU9Ib3N0UmVzZXQodHlwZSwgRHBSYW0sIHNsb3QpOworCisJLyoKKwkqKiBTY3J1YiB0aGUgbWVtb3J5LiBUaGlzIGNvbWVzIGluIHNldmVyYWwgYmFua3M6CisJKiogRFBzcmFtMQktIDcwMDBoIGJ5dGVzCisJKiogRFBzcmFtMgktIDIwMGggIGJ5dGVzCisJKiogRFBzcmFtMwktIDcwMDBoIGJ5dGVzCisJKiogc2NyYXRjaAktIDEwMDBoIGJ5dGVzCisJKi8KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBTZXR1cCByYW0vc2l6ZSBhcnJheXNcbiIpOworCisJc2l6ZVswXSA9IERQX1NSQU0xX1NJWkU7CisJc2l6ZVsxXSA9IERQX1NSQU0yX1NJWkU7CisJc2l6ZVsyXSA9IERQX1NSQU0zX1NJWkU7CisJc2l6ZVszXSA9IERQX1NDUkFUQ0hfU0laRTsKKworCXJhbVswXSA9IChjaGFyICopJkRwUmFtLT5EcFNyYW0xWzBdOworCXJhbVsxXSA9IChjaGFyICopJkRwUmFtLT5EcFNyYW0yWzBdOworCXJhbVsyXSA9IChjaGFyICopJkRwUmFtLT5EcFNyYW0zWzBdOworCW5iYW5rcyA9ICh0eXBlID09IFJJT19QQ0kpID8gMyA6IDQ7CisJaWYgKG5iYW5rcyA9PSA0KQorCQlyYW1bM10gPSAoY2hhciAqKSZEcFJhbS0+RHBTY3JhdGNoWzBdOworCisKKwlpZiAobmJhbmtzID09IDMpIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IE1lbW9yeTogMHgleCgweCV4KSwgMHgleCgweCV4KSwgMHgleCgweCV4KVxuIiwKKwkJCQkoaW50KXJhbVswXSwgc2l6ZVswXSwgKGludClyYW1bMV0sIHNpemVbMV0sIChpbnQpcmFtWzJdLCBzaXplWzJdKTsKKwl9IGVsc2UgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogMHgleCgweCV4KSwgMHgleCgweCV4KSwgMHgleCgweCV4KSwgMHgleCgweCV4KVxuIiwKKwkJCShpbnQpcmFtWzBdLCBzaXplWzBdLCAoaW50KXJhbVsxXSwgc2l6ZVsxXSwgKGludClyYW1bMl0sIHNpemVbMl0sIChpbnQpcmFtWzNdLCAKKwkJCQkJc2l6ZVszXSk7CisJfQorCisJLyoKKwkqKiBUaGlzIHNjcnViIG9wZXJhdGlvbiB3aWxsIHRlc3QgZm9yIGNyb3NzdGFsayBiZXR3ZWVuCisJKiogYmFua3MuIFRFU1RfRU5EIGlzIGEgbWFnaWMgbnVtYmVyLCBhbmQgcmVsYXRlcyB0byB0aGUgb2Zmc2V0CisJKiogd2l0aGluIHRoZSAndmFsJyBhcnJheSB1c2VkIGJ5IFNjcnViLgorCSovCisJZm9yIChvcD0wOyBvcDxURVNUX0VORDsgb3ArKykgeworCQlmb3IgKGJhbms9MDsgYmFuazxuYmFua3M7IGJhbmsrKykgeworCQkJaWYgKFJJT1NjcnViKG9wLCAoQllURSAqKXJhbVtiYW5rXSwgc2l6ZVtiYW5rXSkgPT0gUklPX0ZBSUwpIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogUklPU2NydWIgYmFuZCAlZCwgb3AgJWQgZmFpbGVkXG4iLCAKKwkJCQkJCQliYW5rLCBvcCk7CisJCQkJcmV0dXJuIFJJT19GQUlMOworCQkJfQorCQl9CisJfQorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiVGVzdCBjb21wbGV0ZWRcbiIpOworCXJldHVybiBSSU9fU1VDQ0VTUzsKK30KKworCisvKgorKiogU2NydWIgYW4gYXJlYSBvZiBSQU0uCisqKiBEZWZpbmUgUFJFVEVTVCBhbmQgUE9TVFRFU1QgZm9yIGEgbW9yZSB0aG9yb3VnaCBjaGVja2luZyBvZiB0aGUKKyoqIHN0YXRlIG9mIHRoZSBtZW1vcnkuCisqKiBDYWxsIHdpdGggb3Agc2V0IHRvIGFuIGluZGV4IGludG8gdGhlIGFib3ZlICd2YWwnIGFycmF5IHRvIGRldGVybWluZQorKiogd2hpY2ggdmFsdWUgd2lsbCBiZSB3cml0dGVuIGludG8gbWVtb3J5LgorKiogQ2FsbCB3aXRoIG9wIHNldCB0byB6ZXJvIG1lYW5zIHRoYXQgdGhlIFJBTSB3aWxsIG5vdCBiZSByZWFkIGFuZCBjaGVja2VkCisqKiBiZWZvcmUgaXQgaXMgd3JpdHRlbi4KKyoqIENhbGwgd2l0aCBvcCBub3QgemVybywgYW5kIHRoZSBSQU0gd2lsbCBiZSByZWFkIGFuZCBjb21wYXRlZCB3aXRoIHZhbFtvcC0xXQorKiogdG8gY2hlY2sgdGhhdCB0aGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyBwaGFzZSB3YXMgcmV0YWluZWQuCisqLworc3RhdGljIGludAorUklPU2NydWIob3AsIHJhbSwgc2l6ZSkKK2ludAkJb3A7CitCWVRFICoJcmFtOworaW50CQlzaXplOyAKK3sKKwlpbnQJCQkJb2ZmOworCXVuc2lnbmVkIGNoYXIJb2xkYnl0ZTsKKwl1bnNpZ25lZCBjaGFyCW5ld2J5dGU7CisJdW5zaWduZWQgY2hhcglpbnZieXRlOworCXVuc2lnbmVkIHNob3J0CW9sZHdvcmQ7CisJdW5zaWduZWQgc2hvcnQJbmV3d29yZDsKKwl1bnNpZ25lZCBzaG9ydAlpbnZ3b3JkOworCXVuc2lnbmVkIHNob3J0CXN3YXB3b3JkOworCisJaWYgKG9wKSB7CisJCW9sZGJ5dGUgPSB2YWxbb3AtMV07CisJCW9sZHdvcmQgPSBvbGRieXRlIHwgKG9sZGJ5dGU8PDgpOworCX0gZWxzZQorCSAgb2xkYnl0ZSA9IG9sZHdvcmQgPSAwOyAvKiBUZWxsIHRoZSBjb21waWxlciB3ZSd2ZSBpbml0aWxhbGl6ZWQgdGhlbS4gKi8KKwluZXdieXRlID0gdmFsW29wXTsKKwluZXd3b3JkID0gbmV3Ynl0ZSB8IChuZXdieXRlPDw4KTsKKwlpbnZieXRlID0gfm5ld2J5dGU7CisJaW52d29yZCA9IGludmJ5dGUgfCAoaW52Ynl0ZTw8OCk7CisKKwkvKgorCSoqIENoZWNrIHRoYXQgdGhlIFJBTSBjb250YWlucyB0aGUgdmFsdWUgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGxlZnQgdGhlcmUKKwkqKiBieSB0aGUgcHJldmlvdXMgdGVzdCAobm90IGFwcGxpY2FibGUgZm9yIHBhc3MgemVybykKKwkqLworCWlmIChvcCkgeworCQlmb3IgKG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKyspIHsKKwkJCWlmIChSQllURShyYW1bb2ZmXSkgIT0gb2xkYnl0ZSkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBCeXRlIFByZSBDaGVjayAxOiBCWVRFIGF0IG9mZnNldCAweCV4IHNob3VsZCBoYXZlIGJlZW49JXgsIHdhcz0leFxuIiwgb2ZmLCBvbGRieXRlLCBSQllURShyYW1bb2ZmXSkpOworCQkJCXJldHVybiBSSU9fRkFJTDsKKwkJCX0KKwkJfQorCQlmb3IgKG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKz0yKSB7CisJCQlpZiAoKih1c2hvcnQgKikmcmFtW29mZl0gIT0gb2xkd29yZCkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBXb3JkIFByZSBDaGVjazogV09SRCBhdCBvZmZzZXQgMHgleCBzaG91bGQgaGF2ZSBiZWVuPSV4LCB3YXM9JXhcbiIsb2ZmLG9sZHdvcmQsKih1c2hvcnQgKikmcmFtW29mZl0pOworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBXb3JkIFByZSBDaGVjazogQllURSBhdCBvZmZzZXQgMHgleCBpcyAleCBCWVRFIGF0IG9mZnNldCAweCV4IGlzICV4XG4iLCBvZmYsIFJCWVRFKHJhbVtvZmZdKSwgb2ZmKzEsIFJCWVRFKHJhbVtvZmYrMV0pKTsKKwkJCQlyZXR1cm4gUklPX0ZBSUw7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSoqIE5vdyB3cml0ZSB0aGUgSU5WRVJTRSBvZiB0aGUgdGVzdCBkYXRhIGludG8gZXZlcnkgbG9jYXRpb24sIHVzaW5nCisJKiogQllURSB3cml0ZSBvcGVyYXRpb25zLCBmaXJzdCBjaGVja2luZyBiZWZvcmUgZWFjaCBieXRlIGlzIHdyaXR0ZW4KKwkqKiB0aGF0IHRoZSBsb2NhdGlvbiBjb250YWlucyB0aGUgb2xkIHZhbHVlIHN0aWxsLCBhbmQgY2hlY2tpbmcgYWZ0ZXIKKwkqKiB0aGUgd3JpdGUgdGhhdCB0aGUgbG9jYXRpb24gY29udGFpbnMgdGhlIGRhdGEgc3BlY2lmaWVkIC0gdGhpcyBpcworCSoqIHRoZSBCWVRFIHJlYWQvd3JpdGUgdGVzdC4KKwkqLworCWZvciAob2ZmPTA7IG9mZjxzaXplOyBvZmYrKykgeworCQlpZiAob3AgJiYgKFJCWVRFKHJhbVtvZmZdKSAhPSBvbGRieXRlKSkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IEJ5dGUgUHJlIENoZWNrIDI6IEJZVEUgYXQgb2Zmc2V0IDB4JXggc2hvdWxkIGhhdmUgYmVlbj0leCwgd2FzPSV4XG4iLCBvZmYsIG9sZGJ5dGUsIFJCWVRFKHJhbVtvZmZdKSk7CisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKwkJV0JZVEUocmFtW29mZl0saW52Ynl0ZSk7CisJCWlmIChSQllURShyYW1bb2ZmXSkgIT0gaW52Ynl0ZSkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IEJ5dGUgSW52IENoZWNrOiBCWVRFIGF0IG9mZnNldCAweCV4IHNob3VsZCBoYXZlIGJlZW49JXgsIHdhcz0leFxuIiwgb2ZmLCBpbnZieXRlLCBSQllURShyYW1bb2ZmXSkpOworCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisJfQorCisJLyoKKwkqKiBub3csIHVzZSBXT1JEIG9wZXJhdGlvbnMgdG8gd3JpdGUgdGhlIHRlc3QgdmFsdWUgaW50byBldmVyeSBsb2NhdGlvbiwKKwkqKiBjaGVjayBhcyBiZWZvcmUgdGhhdCB0aGUgbG9jYXRpb24gY29udGFpbnMgdGhlIHByZXZpb3VzIHRlc3QgdmFsdWUKKwkqKiBiZWZvcmUgb3ZlcndyaXRpbmcsIGFuZCB0aGF0IGl0IGNvbnRhaW5zIHRoZSBkYXRhIHZhbHVlIHdyaXR0ZW4KKwkqKiBhZnRlcndhcmRzLgorCSoqIFRoaXMgaXMgdGhlIFdPUkQgb3BlcmF0aW9uIHRlc3QuCisJKi8KKwlmb3IgKG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKz0yKSB7CisJCWlmICgqKHVzaG9ydCAqKSZyYW1bb2ZmXSAhPSBpbnZ3b3JkKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogV29yZCBJbnYgQ2hlY2s6IFdPUkQgYXQgb2Zmc2V0IDB4JXggc2hvdWxkIGhhdmUgYmVlbj0leCwgd2FzPSV4XG4iLCBvZmYsIGludndvcmQsICoodXNob3J0ICopJnJhbVtvZmZdKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFdvcmQgSW52IENoZWNrOiBCWVRFIGF0IG9mZnNldCAweCV4IGlzICV4IEJZVEUgYXQgb2Zmc2V0IDB4JXggaXMgJXhcbiIsIG9mZiwgUkJZVEUocmFtW29mZl0pLCBvZmYrMSwgUkJZVEUocmFtW29mZisxXSkpOworCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisKKwkJKih1c2hvcnQgKikmcmFtW29mZl0gPSBuZXd3b3JkOworCQlpZiAoICoodXNob3J0ICopJnJhbVtvZmZdICE9IG5ld3dvcmQgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogUG9zdCBXb3JkIENoZWNrIDE6IFdPUkQgYXQgb2Zmc2V0IDB4JXggc2hvdWxkIGhhdmUgYmVlbj0leCwgd2FzPSV4XG4iLCBvZmYsIG5ld3dvcmQsICoodXNob3J0ICopJnJhbVtvZmZdKTsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBQb3N0IFdvcmQgQ2hlY2sgMTogQllURSBhdCBvZmZzZXQgMHgleCBpcyAleCBCWVRFIGF0IG9mZnNldCAweCV4IGlzICV4XG4iLCBvZmYsIFJCWVRFKHJhbVtvZmZdKSwgb2ZmKzEsIFJCWVRFKHJhbVtvZmYrMV0pKTsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCX0KKworCS8qCisJKiogbm93IHJ1biB0aHJvdWdoIHRoZSBibG9jayBvZiBtZW1vcnkgYWdhaW4sIGZpcnN0IGluIGJ5dGUgbW9kZQorCSoqIHRoZW4gaW4gd29yZCBtb2RlLCBhbmQgY2hlY2sgdGhhdCBhbGwgdGhlIGxvY2F0aW9ucyBjb250YWluIHRoZQorCSoqIHJlcXVpcmVkIHRlc3QgZGF0YS4KKwkqLworCWZvciAob2ZmPTA7IG9mZjxzaXplOyBvZmYrKykgeworCQlpZiAoUkJZVEUocmFtW29mZl0pICE9IG5ld2J5dGUpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBQb3N0IEJ5dGUgQ2hlY2s6IEJZVEUgYXQgb2Zmc2V0IDB4JXggc2hvdWxkIGhhdmUgYmVlbj0leCwgd2FzPSV4XG4iLCBvZmYsIG5ld2J5dGUsIFJCWVRFKHJhbVtvZmZdKSk7CisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKwl9CisKKwlmb3IgKG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKz0yKSB7CisJCWlmICggKih1c2hvcnQgKikmcmFtW29mZl0gIT0gbmV3d29yZCApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBQb3N0IFdvcmQgQ2hlY2sgMjogV09SRCBhdCBvZmZzZXQgMHgleCBzaG91bGQgaGF2ZSBiZWVuPSV4LCB3YXM9JXhcbiIsIG9mZiwgbmV3d29yZCwgKih1c2hvcnQgKikmcmFtW29mZl0pOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFBvc3QgV29yZCBDaGVjayAyOiBCWVRFIGF0IG9mZnNldCAweCV4IGlzICV4IEJZVEUgYXQgb2Zmc2V0IDB4JXggaXMgJXhcbiIsIG9mZiwgUkJZVEUocmFtW29mZl0pLCBvZmYrMSwgUkJZVEUocmFtW29mZisxXSkpOworCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisJfQorCisJLyoKKwkqKiB0aW1lIHRvIGNoZWNrIG91dCBieXRlIHN3YXBwaW5nIGVycm9ycworCSovCisJc3dhcHdvcmQgPSBpbnZieXRlIHwgKG5ld2J5dGUgPDwgOCk7CisKKwlmb3IgKG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKz0yKSB7CisJCVdCWVRFKHJhbVtvZmZdLGludmJ5dGUpOworCQlXQllURShyYW1bb2ZmKzFdLG5ld2J5dGUpOworCX0KKworCWZvciAoIG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKz0yICkgeworCQlpZiAoKih1c2hvcnQgKikmcmFtW29mZl0gIT0gc3dhcHdvcmQpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBTd2FwV29yZCBDaGVjayAxOiBXT1JEIGF0IG9mZnNldCAweCV4IHNob3VsZCBoYXZlIGJlZW49JXgsIHdhcz0leFxuIiwgb2ZmLCBzd2Fwd29yZCwgKigodXNob3J0ICopJnJhbVtvZmZdKSk7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogU3dhcFdvcmQgQ2hlY2sgMTogQllURSBhdCBvZmZzZXQgMHgleCBpcyAleCBCWVRFIGF0IG9mZnNldCAweCV4IGlzICV4XG4iLCBvZmYsIFJCWVRFKHJhbVtvZmZdKSwgb2ZmKzEsIFJCWVRFKHJhbVtvZmYrMV0pKTsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCQkqKCh1c2hvcnQgKikmcmFtW29mZl0pID0gfnN3YXB3b3JkOworCX0KKworCWZvciAob2ZmPTA7IG9mZjxzaXplOyBvZmYrPTIpIHsKKwkJaWYgKFJCWVRFKHJhbVtvZmZdKSAhPSBuZXdieXRlKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogU3dhcFdvcmQgQ2hlY2sgMjogQllURSBhdCBvZmZzZXQgMHgleCBzaG91bGQgaGF2ZSBiZWVuPSV4LCB3YXM9JXhcbiIsIG9mZiwgbmV3Ynl0ZSwgUkJZVEUocmFtW29mZl0pKTsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCQlpZiAoUkJZVEUocmFtW29mZisxXSkgIT0gaW52Ynl0ZSkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFN3YXBXb3JkIENoZWNrIDI6IEJZVEUgYXQgb2Zmc2V0IDB4JXggc2hvdWxkIGhhdmUgYmVlbj0leCwgd2FzPSV4XG4iLCBvZmYrMSwgaW52Ynl0ZSwgUkJZVEUocmFtW29mZisxXSkpOworCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisJCSooKHVzaG9ydCAqKSZyYW1bb2ZmXSkgPSBuZXd3b3JkOworCX0KKwlyZXR1cm4gUklPX1NVQ0NFU1M7Cit9CisKKy8qCisqKiB0cnkgdG8gZW5zdXJlIHRoYXQgZXZlcnkgaG9zdCBpcyBlaXRoZXIgaW4gcG9sbGVkIG1vZGUKKyoqIG9yIGlzIGluIGludGVycnVwdCBtb2RlLiBPbmx5IGFsbG93IGludGVycnVwdCBtb2RlIGlmCisqKiBhbGwgaG9zdHMgY2FuIGludGVycnVwdCAod2h5PykKKyoqIGFuZCBmb3JjZSBpbnRvIHBvbGxlZCBtb2RlIGlmIHRvbGQgdG8uIFBhdGNoIHVwIHRoZQorKiogaW50ZXJydXB0IHZlY3RvciAmIHNhbHV0ZSBUaGUgUXVlZW4gd2hlbiB5b3UndmUgZG9uZS4KKyovCisjaWYgMAorc3RhdGljIHZvaWQKK1JJT0FsbG9jYXRlSW50ZXJydXB0cyhwKQorc3RydWN0IHJpb19pbmZvICoJcDsKK3sKKwlpbnQgSG9zdDsKKworCS8qCisJKiogRWFzeSBjYXNlIC0gaWYgd2UgaGF2ZSBiZWVuIHRvbGQgdG8gcG9sbCwgdGhlbiB3ZSBwb2xsLgorCSovCisJaWYgKHAtPm1vZGUgJiBQT0xMRURfTU9ERSkgeworCQlSSU9TdG9wSW50ZXJydXB0cyhwLCAwLCAwKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJKiogY2hlY2sgLSBpZiBhbnkgaG9zdCBoYXMgYmVlbiBzZXQgdG8gcG9sbGVkIG1vZGUsIHRoZW4gYWxsIG11c3QgYmUuCisJKi8KKwlmb3IgKEhvc3Q9MDsgSG9zdDxwLT5SSU9OdW1Ib3N0czsgSG9zdCsrKSB7CisJCWlmICggKHAtPlJJT0hvc3RzW0hvc3RdLlR5cGUgIT0gUklPX0FUKSAmJgorCQkJCShwLT5SSU9Ib3N0c1tIb3N0XS5JdmVjID09IFBPTExFRCkgKSB7CisJCQlSSU9TdG9wSW50ZXJydXB0cyhwLCAxLCBIb3N0ICk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZm9yIChIb3N0PTA7IEhvc3Q8cC0+UklPTnVtSG9zdHM7IEhvc3QrKykgeworCQlpZiAocC0+UklPSG9zdHNbSG9zdF0uVHlwZSA9PSBSSU9fQVQpIHsKKwkJCWlmICggKHAtPlJJT0hvc3RzW0hvc3RdLkl2ZWMgLSAzMikgPT0gMCkgeworCQkJCVJJT1N0b3BJbnRlcnJ1cHRzKHAsIDIsIEhvc3QgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisqKiBzb21ldGhpbmcgaGFzIGRlY2lkZWQgdGhhdCB3ZSBjYW4ndCBiZSBkb2luZyB3aXRoIHRoZXNlCisqKiBuZXctZmFuZ2xlZCBpbnRlcnJ1cHQgdGhpbmdpZXMuIFNldCBldmVyeXRoaW5nIHVwIHRvIGp1c3QKKyoqIHBvbGwuCisqLworc3RhdGljIHZvaWQKK1JJT1N0b3BJbnRlcnJ1cHRzKHAsIFJlYXNvbiwgSG9zdCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitpbnQJUmVhc29uOworaW50CUhvc3Q7IAoreworI2lmZGVmIEZVVFVSRV9SRUxFQVNFCisJc3dpdGNoIChSZWFzb24pIHsKKwkJY2FzZSAwOgkvKiBmb3JjZWQgaW50byBwb2xsaW5nIGJ5IHJpb19wb2xsZWQgKi8KKwkJCWJyZWFrOworCQljYXNlIDE6CS8qIFNDVSBoYXMgc2V0ICdIb3N0JyBpbnRvIHBvbGxlZCBtb2RlICovCisJCQlicmVhazsKKwkJY2FzZSAyOgkvKiB0aGVyZSBhcmVuJ3QgZW5vdWdoIGludGVycnVwdCB2ZWN0b3JzIGZvciAnSG9zdCcgKi8KKwkJCWJyZWFrOworCX0KKyNlbmRpZgorCisJZm9yIChIb3N0PTA7IEhvc3Q8cC0+UklPTnVtSG9zdHM7IEhvc3QrKyApIHsKKwkJc3RydWN0IEhvc3QgKkhvc3RQID0gJnAtPlJJT0hvc3RzW0hvc3RdOworCisJCXN3aXRjaCAoSG9zdFAtPlR5cGUpIHsKKwkJCWNhc2UgUklPX0FUOgorCQkJCS8qCisJCQkJKiogVGhlIEFUIGhvc3QgaGFzIGl0J3MgaW50ZXJydXB0cyBkaXNhYmxlZCBieSBjbGVhcmluZyB0aGUKKwkJCQkqKiBpbnRfZW5hYmxlIGJpdC4KKwkJCQkqLworCQkJCUhvc3RQLT5Nb2RlICY9IH5JTlRFUlJVUFRfRU5BQkxFOworCQkJCUhvc3RQLT5JdmVjID0gUE9MTEVEOworCQkJCWJyZWFrOworI2lmZGVmIEZVVFVSRV9SRUxFQVNFCisJCQljYXNlIFJJT19FSVNBOgorCQkJCS8qCisJCQkJKiogVGhlIEVJU0EgaG9zdCBoYXMgaXQncyBpbnRlcnJ1cHRzIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhlCisJCQkJKiogSXZlYyB0byB6ZXJvCisJCQkJKi8KKwkJCQlIb3N0UC0+SXZlYyA9IFBPTExFRDsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJY2FzZSBSSU9fUENJOgorCQkJCS8qCisJCQkJKiogVGhlIFBDSSBob3N0IGhhcyBpdCdzIGludGVycnVwdHMgZGlzYWJsZWQgYnkgY2xlYXJpbmcgdGhlCisJCQkJKiogaW50X2VuYWJsZSBiaXQsIGxpa2UgYSByZWd1bGFyIGhvc3QgY2FyZC4KKwkJCQkqLworCQkJCUhvc3RQLT5Nb2RlICY9IH5SSU9fUENJX0lOVF9FTkFCTEU7CisJCQkJSG9zdFAtPkl2ZWMgPSBQT0xMRUQ7CisJCQkJYnJlYWs7CisjaWZkZWYgRlVUVVJFX1JFTEVBU0UKKwkJCWNhc2UgUklPX01DQToKKwkJCQkvKgorCQkJCSoqIFRoZXJlJ3MgYWx3YXlzIG9uZSwgaXNuJ3QgdGhlcmU/CisJCQkJKiogVGhlIE1DQSBob3N0IGNhcmQgY2Fubm90IGhhdmUgaXQncyBpbnRlcnJ1cHRzIGRpc2FibGVkLgorCQkJCSovCisJCQkJUklPUGF0Y2hWZWMoSG9zdFApOworCQkJCWJyZWFrOworI2VuZGlmCisJCX0KKwl9Cit9CisKKy8qCisqKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBpbml0IHRpbWUgdG8gc2V0dXAgdGhlIGRhdGEgc3RydWN0dXJlcy4KKyovCit2b2lkCitSSU9BbGxvY0RhdGFTdHJ1Y3RzKHApCitzdHJ1Y3QgcmlvX2luZm8gKglwOworeworCWludAlwb3J0LAorCQlob3N0LAorCQl0bTsKKworCXAtPlJJT1BvcnRwID0gKHN0cnVjdCBQb3J0ICopc3lzYnJrKFJJT19QT1JUUyAqIHNpemVvZihzdHJ1Y3QgUG9ydCkpOworCWlmICghcC0+UklPUG9ydHApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IE5vIG1lbW9yeSBmb3IgcG9ydCBzdHJ1Y3R1cmVzXG4iKTsKKwkJcC0+UklPRmFpbGVkKys7CisJCXJldHVybjsKKwl9IAorCWJ6ZXJvKCBwLT5SSU9Qb3J0cCwgc2l6ZW9mKHN0cnVjdCBQb3J0KSAqIFJJT19QT1JUUyApOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJSSU8taW5pdDogYWxsb2NhdGVkIGFuZCBjbGVhcmVkIG1lbW9yeSBmb3IgcG9ydCBzdHJ1Y3RzXG4iKTsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiRmlyc3QgUklPIHBvcnQgc3RydWN0IEAweCV4LCBzaXplPTB4JXggYnl0ZXNcbiIsCisJICAgIChpbnQpcC0+UklPUG9ydHAsIHNpemVvZihzdHJ1Y3QgUG9ydCkpOworCisJZm9yKCBwb3J0PTA7IHBvcnQ8UklPX1BPUlRTOyBwb3J0KysgKSB7CisJCXAtPlJJT1BvcnRwW3BvcnRdLlBvcnROdW0gPSBwb3J0OworCQlwLT5SSU9Qb3J0cFtwb3J0XS5UdHlQID0gJnAtPmNoYW5uZWxbcG9ydF07CisJCXNyZXNldCAocC0+UklPUG9ydHBbcG9ydF0uSW5Vc2UpOwkvKiBMZXQgdGhlIGZpcnN0IGd1eSB1c2VzIGl0ICovCisJCXAtPlJJT1BvcnRwW3BvcnRdLnBvcnRTZW0gPSAtMTsJLyogTGV0IHRoZSBmaXJzdCBndXkgdGFrZXMgaXQgKi8KKwkJcC0+UklPUG9ydHBbcG9ydF0uUGFyYW1TZW0gPSAtMTsJLyogTGV0IHRoZSBmaXJzdCBndXkgdGFrZXMgaXQgKi8KKwkJcC0+UklPUG9ydHBbcG9ydF0udGltZW91dF9pZCA9IDA7CS8qIExldCB0aGUgZmlyc3QgZ3V5IHRha2VzIGl0ICovCisJfQorCisJcC0+UklPSG9zdHMgPSAoc3RydWN0IEhvc3QgKilzeXNicmsoUklPX0hPU1RTICogc2l6ZW9mKHN0cnVjdCBIb3N0KSk7CisJaWYgKCFwLT5SSU9Ib3N0cykgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogTm8gbWVtb3J5IGZvciBob3N0IHN0cnVjdHVyZXNcbiIpOworCQlwLT5SSU9GYWlsZWQrKzsKKwkJcmV0dXJuOworCX0KKwliemVybyhwLT5SSU9Ib3N0cywgc2l6ZW9mKHN0cnVjdCBIb3N0KSpSSU9fSE9TVFMpOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJSSU8taW5pdDogYWxsb2NhdGVkIGFuZCBjbGVhcmVkIG1lbW9yeSBmb3IgaG9zdCBzdHJ1Y3RzXG4iKTsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiRmlyc3QgUklPIGhvc3Qgc3RydWN0IEAweCV4LCBzaXplPTB4JXggYnl0ZXNcbiIsCisJICAgIChpbnQpcC0+UklPSG9zdHMsIHNpemVvZihzdHJ1Y3QgSG9zdCkpOworCisJZm9yKCBob3N0PTA7IGhvc3Q8UklPX0hPU1RTOyBob3N0KysgKSB7CisJCXNwaW5fbG9ja19pbml0ICgmcC0+UklPSG9zdHNbaG9zdF0uSG9zdExvY2spOworCQlwLT5SSU9Ib3N0c1tob3N0XS50aW1lb3V0X2lkID0gMDsgLyogTGV0IHRoZSBmaXJzdCBndXkgdGFrZXMgaXQgKi8KKwl9CisJLyoKKwkqKiBjaGVjayB0aGF0IHRoZSBidWZmZXIgc2l6ZSBpcyB2YWxpZCwgcm91bmQgZG93biB0byB0aGUgbmV4dCBwb3dlciBvZgorCSoqIHR3byBpZiBuZWNlc3Nhcnk7IGlmIHRoZSByZXN1bHQgaXMgemVybywgdGhlbiwgaGV5LCBubyBkb3VibGUgYnVmZmVycy4KKwkqLworCWZvciAoIHRtID0gMTsgdG0gJiYgdG0gPD0gcC0+UklPQ29uZi5CdWZmZXJTaXplOyB0bSA8PD0gMSApCisJCTsKKwl0bSA+Pj0gMTsKKwlwLT5SSU9CdWZmZXJTaXplID0gdG07CisJcC0+UklPQnVmZmVyTWFzayA9IHRtID8gdG0gLSAxIDogMDsKK30KKworLyoKKyoqIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGRhdGEgc3RydWN0dXJlcyBuZWVkIHRvIGJlCisqKiByZS1zZXR1cCwgZm9yIGV4YW1wbGUsIGFmdGVyIGEgcmlvaGFsdCAod2h5IGRpZCBJIGV2ZXIgaW52ZW50IGl0PykKKyovCit2b2lkCitSSU9TZXR1cERhdGFTdHJ1Y3RzKHApCitzdHJ1Y3QgcmlvX2luZm8JKiBwOworeworCWludCBob3N0LCBlbnRyeSwgcnVwOworCisJZm9yICggaG9zdD0wOyBob3N0PFJJT19IT1NUUzsgaG9zdCsrICkgeworCQlzdHJ1Y3QgSG9zdCAqSG9zdFAgPSAmcC0+UklPSG9zdHNbaG9zdF07CisJCWZvciAoIGVudHJ5PTA7IGVudHJ5PExJTktTX1BFUl9VTklUOyBlbnRyeSsrICkgeworCQkJSG9zdFAtPlRvcG9sb2d5W2VudHJ5XS5Vbml0ID0gUk9VVEVfRElTQ09OTkVDVDsKKwkJCUhvc3RQLT5Ub3BvbG9neVtlbnRyeV0uTGluayA9IE5PX0xJTks7CisJCX0KKwkJYmNvcHkoIkhPU1QgWCIsIEhvc3RQLT5OYW1lLCA3KTsKKwkJSG9zdFAtPk5hbWVbNV0gPSAnMScraG9zdDsKKwkJZm9yIChydXA9MDsgcnVwPChNQVhfUlVQICsgTElOS1NfUEVSX1VOSVQpOyBydXArKykgeworCQkJaWYgKHJ1cCA8IE1BWF9SVVApIHsKKwkJCQlmb3IgKGVudHJ5PTA7IGVudHJ5PExJTktTX1BFUl9VTklUOyBlbnRyeSsrICkgeworCQkJCQlIb3N0UC0+TWFwcGluZ1tydXBdLlRvcG9sb2d5W2VudHJ5XS5Vbml0ID0gUk9VVEVfRElTQ09OTkVDVDsKKwkJCQkJSG9zdFAtPk1hcHBpbmdbcnVwXS5Ub3BvbG9neVtlbnRyeV0uTGluayA9IE5PX0xJTks7CisJCQkJfQorCQkJCVJJT0RlZmF1bHROYW1lKHAsIEhvc3RQLCBydXApOworCQkJfQorCQkJc3Bpbl9sb2NrX2luaXQoJkhvc3RQLT5Vbml4UnVwc1tydXBdLlJ1cExvY2spOworCQl9CisJfQorfQorI2VuZGlmCisKK2ludAorUklPRGVmYXVsdE5hbWUocCwgSG9zdFAsIFVuaXRJZCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgSG9zdCAqCUhvc3RQOwordWludAkJCVVuaXRJZDsKK3sKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdCggSG9zdCApOworCUNoZWNrVW5pdElkKCBVbml0SWQgKTsKKyNlbmRpZgorCWJjb3B5KCJVTktOT1dOIFJUQSBYLVhYIixIb3N0UC0+TWFwcGluZ1tVbml0SWRdLk5hbWUsMTcpOworCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uTmFtZVsxMl09JzEnKyhIb3N0UC1wLT5SSU9Ib3N0cyk7CisJaWYgKChVbml0SWQrMSkgPiA5KSB7CisJCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uTmFtZVsxNF09JzAnKygoVW5pdElkKzEpLzEwKTsKKwkJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5OYW1lWzE1XT0nMCcrKChVbml0SWQrMSklMTApOworCX0KKwllbHNlIHsKKwkJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5OYW1lWzE0XT0nMScrVW5pdElkOworCQlIb3N0UC0+TWFwcGluZ1tVbml0SWRdLk5hbWVbMTVdPTA7CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIFJJT19SRUxFQVNFCSJMaW51eCIKKyNkZWZpbmUgUkVMRUFTRV9JRAkiMS4wIgorCisjaWYgMAorc3RhdGljIGludAorUklPUmVwb3J0KHApCitzdHJ1Y3QgcmlvX2luZm8gKglwOworeworCWNoYXIgKglSSU9SZWxlYXNlID0gUklPX1JFTEVBU0U7CisJY2hhciAqCVJJT1JlbElEID0gUkVMRUFTRV9JRDsKKwlpbnQJCWhvc3Q7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8gOiBSZWxlYXNlOiAlcyBJRDogJXNcbiIsIFJJT1JlbGVhc2UsIFJJT1JlbElEKTsKKworCWlmICggcC0+UklPTnVtSG9zdHM9PTAgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlxuTm8gSG9zdHMgY29uZmlndXJlZFxuIik7CisJCXJldHVybigwKTsKKwl9CisKKwlmb3IgKCBob3N0PTA7IGhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgaG9zdCsrICkgeworCQlzdHJ1Y3QgSG9zdCAqSG9zdFAgPSAmcC0+UklPSG9zdHNbaG9zdF07CisJCXN3aXRjaCAoIEhvc3RQLT5UeXBlICkgeworCQkJY2FzZSBSSU9fQVQ6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiQVQgQlVTIDogZm91bmQgdGhlIGNhcmQgYXQgMHgleFxuIiwgSG9zdFAtPlBhZGRyUCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCByaW9WZXJzaW9uCXN0VmVyc2lvbjsKKworc3RydWN0IHJpb1ZlcnNpb24gKgorUklPVmVyc2lkKHZvaWQpCit7CisgICAgc3RybGNweShzdFZlcnNpb24udmVyc2lvbiwgIlJJTyBkcml2ZXIgZm9yIGxpbnV4IFYxLjAiLAorCSAgICBzaXplb2Yoc3RWZXJzaW9uLnZlcnNpb24pKTsKKyAgICBzdHJsY3B5KHN0VmVyc2lvbi5idWlsZERhdGUsIF9fREFURV9fLAorCSAgICBzaXplb2Yoc3RWZXJzaW9uLmJ1aWxkRGF0ZSkpOworCisgICAgcmV0dXJuICZzdFZlcnNpb247Cit9CisKKyNpZiAwCitpbnQKK1JJT01hcGluKHBhZGRyLCBzaXplLCB2YWRkcikKK3BhZGRyX3QJCXBhZGRyOworaW50CQkJc2l6ZTsKK2NhZGRyX3QgKgl2YWRkcjsKK3sKKwkqdmFkZHIgPSAoY2FkZHJfdClwZXJtYXAoIChsb25nKXBhZGRyLCBzaXplKTsKKwlyZXR1cm4gKChpbnQpKnZhZGRyKTsKK30KKwordm9pZAorUklPTWFwb3V0KHBhZGRyLCBzaXplLCB2YWRkcikKK3BhZGRyX3QJCXBhZGRyOworbG9uZwkJc2l6ZTsKK2NhZGRyX3QgCXZhZGRyOworeworfQorI2VuZGlmCisKKwordm9pZAorUklPSG9zdFJlc2V0KFR5cGUsIERwUmFtUCwgU2xvdCkKK3VpbnQgVHlwZTsKK3ZvbGF0aWxlIHN0cnVjdCBEcFJhbSAqRHBSYW1QOwordWludCBTbG90OyAKK3sKKwkvKgorCSoqIFJlc2V0IHRoZSBUcHUKKwkqLworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJSSU9Ib3N0UmVzZXQ6IHR5cGUgMHgleCIsIFR5cGUpOworCXN3aXRjaCAoIFR5cGUgKSB7CisJCWNhc2UgUklPX0FUOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiIChSSU9fQVQpXG4iKTsKKwkJCVdCWVRFKERwUmFtUC0+RHBDb250cm9sLCAgQk9PVF9GUk9NX1JBTSB8IEVYVEVSTkFMX0JVU19PRkYgfCAKKwkJCQkJICBJTlRFUlJVUFRfRElTQUJMRSB8IEJZVEVfT1BFUkFUSU9OIHwKKwkJCQkJICBTTE9XX0xJTktTIHwgU0xPV19BVF9CVVMpOworCQkJV0JZVEUoRHBSYW1QLT5EcFJlc2V0VHB1LCAweEZGKTsKKwkJCXJpb191ZGVsYXkgKDMpOworCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiUklPSG9zdFJlc2V0OiBEb24ndCBrbm93IGlmIGl0IHdvcmtlZC4gVHJ5IHJlc2V0IGFnYWluXG4iKTsKKwkJCVdCWVRFKERwUmFtUC0+RHBDb250cm9sLCAgQk9PVF9GUk9NX1JBTSB8IEVYVEVSTkFMX0JVU19PRkYgfAorCQkJCQkgIElOVEVSUlVQVF9ESVNBQkxFIHwgQllURV9PUEVSQVRJT04gfAorCQkJCQkgIFNMT1dfTElOS1MgfCBTTE9XX0FUX0JVUyk7CisJCQlXQllURShEcFJhbVAtPkRwUmVzZXRUcHUsIDB4RkYpOworCQkJcmlvX3VkZWxheSAoMyk7CisJCQlicmVhazsKKyNpZmRlZiBGVVRVUkVfUkVMRUFTRQorCWNhc2UgUklPX0VJU0E6CisJLyoKKwkqKiBCZXQgdGhpcyBkb2Vzbid0IHdvcmshCisJKi8KKwlPVVRCWiggU2xvdCwgRUlTQV9DT05UUk9MX1BPUlQsCisJCUVJU0FfVFBfUlVOCQl8IEVJU0FfVFBfQlVTX0RJU0FCTEUgICB8CisJCUVJU0FfVFBfU0xPV19MSU5LUyB8IEVJU0FfVFBfQk9PVF9GUk9NX1JBTSApOworCU9VVEJaKCBTbG90LCBFSVNBX0NPTlRST0xfUE9SVCwKKwkJRUlTQV9UUF9SRVNFVAkgIHwgRUlTQV9UUF9CVVNfRElTQUJMRSAgIHwgCisJCUVJU0FfVFBfU0xPV19MSU5LUyB8IEVJU0FfVFBfQk9PVF9GUk9NX1JBTSApOworCXN1c3BlbmQoIDMgKTsKKwlPVVRCWiggU2xvdCwgRUlTQV9DT05UUk9MX1BPUlQsCisJCUVJU0FfVFBfUlVOCQl8IEVJU0FfVFBfQlVTX0RJU0FCTEUgICB8IAorCQlFSVNBX1RQX1NMT1dfTElOS1MgfCBFSVNBX1RQX0JPT1RfRlJPTV9SQU0gKTsKKwlicmVhazsKKwljYXNlIFJJT19NQ0E6CisJV0JZVEUoRHBSYW1QLT5EcENvbnRyb2wgICwgTWNhVHBCb290RnJvbVJhbSB8IE1jYVRwQnVzRGlzYWJsZSApOworCVdCWVRFKERwUmFtUC0+RHBSZXNldFRwdSAsIDB4RkYgKTsKKwlzdXNwZW5kKCAzICk7CisJV0JZVEUoRHBSYW1QLT5EcENvbnRyb2wgICwgTWNhVHBCb290RnJvbVJhbSB8IE1jYVRwQnVzRGlzYWJsZSApOworCVdCWVRFKERwUmFtUC0+RHBSZXNldFRwdSAsIDB4RkYgKTsKKwlzdXNwZW5kKCAzICk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBSSU9fUENJOgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICIgKFJJT19QQ0kpXG4iKTsKKwkJRHBSYW1QLT5EcENvbnRyb2wgID0gUklPX1BDSV9CT09UX0ZST01fUkFNOworCQlEcFJhbVAtPkRwUmVzZXRJbnQgPSAweEZGOworCQlEcFJhbVAtPkRwUmVzZXRUcHUgPSAweEZGOworCQlyaW9fdWRlbGF5ICgxMDApOworCQkvKiBmb3IgKGk9MDsgaTw2MDAwOyBpKyspOyAgKi8KKwkJLyogc3VzcGVuZCggMyApOyAqLworCQlicmVhazsKKyNpZmRlZiBGVVRVUkVfUkVMRUFTRQorCWRlZmF1bHQ6CisJUnByaW50ZihSSU9NZXNnTm9TdXBwb3J0LFR5cGUsRHBSYW1QLFNsb3QpOworCXJldHVybjsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiIChVTktOT1dOKVxuIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2ludHIuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvaW50ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MmU3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2ludHIuYwpAQCAtMCwwICsxLDk1MSBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvaW50ci5jCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMDozMzo0NAorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMDozMzo0OQorKioKKyoqICBpZGVudCBAKCMpcmlvaW50ci5jCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb2ludHJfY19zY2NzXyA9ICJAKCMpcmlvaW50ci5jCTEuMiI7CisjZW5kaWYKKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAibGludXhfY29tcGF0LmgiCisjaW5jbHVkZSAicmlvX2xpbnV4LmgiCisjaW5jbHVkZSAidHlwZGVmLmgiCisjaW5jbHVkZSAicGt0LmgiCisjaW5jbHVkZSAiZGFlbW9uLmgiCisjaW5jbHVkZSAicmlvLmgiCisjaW5jbHVkZSAicmlvc3BhY2UuaCIKKyNpbmNsdWRlICJ0b3AuaCIKKyNpbmNsdWRlICJjbWRwa3QuaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJyaW90eXBlcy5oIgorI2luY2x1ZGUgInJ1cC5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyaW9kcnZyLmgiCisjaW5jbHVkZSAicmlvaW5mby5oIgorI2luY2x1ZGUgImZ1bmMuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2luY2x1ZGUgInBhcm1tYXAuaCIKKyNpbmNsdWRlICJ1bml4cnVwLmgiCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJwaGIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiY21kYmxrLmgiCisjaW5jbHVkZSAicm91dGUuaCIKKyNpbmNsdWRlICJjb250cm9sLmgiCisjaW5jbHVkZSAiY2lycnVzLmgiCisjaW5jbHVkZSAicmlvaW9jdGwuaCIKKworCitzdGF0aWMgdm9pZCBSSU9SZWNlaXZlKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgUG9ydCAqKTsKKworCitzdGF0aWMgY2hhciAqZmlyc3RjaGFycyAoY2hhciAqcCwgaW50IG5jaCkKK3sKKyAgc3RhdGljIGNoYXIgYnVmWzJdWzEyOF07CisgIHN0YXRpYyBpbnQgdD0wOworICB0ID0gISB0OworICBtZW1jcHkgKGJ1Zlt0XSwgcCwgbmNoKTsKKyAgYnVmW3RdW25jaF0gPSAwOworICByZXR1cm4gYnVmW3RdOworfQorCisKKyNkZWZpbmUJSU5DUiggUCwgSSApCSgoUCkgPSAoKChQKSsoSSkpICYgcC0+UklPQnVmZmVyTWFzaykpCisvKiBFbmFibGUgYW5kIHN0YXJ0IHRoZSB0cmFuc21pc3Npb24gb2YgcGFja2V0cyAqLwordm9pZAorUklPVHhFbmFibGUoZW4pCitjaGFyICoJCWVuOworeworICBzdHJ1Y3QgUG9ydCAqCVBvcnRQOworICBzdHJ1Y3QgcmlvX2luZm8gKnA7CisgIHN0cnVjdCB0dHlfc3RydWN0KiB0dHk7CisgIGludCBjOworICBzdHJ1Y3QgUEtUICoJUGFja2V0UDsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICBQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKWVuOyAKKyAgcCA9IChzdHJ1Y3QgcmlvX2luZm8gKilQb3J0UC0+cDsKKyAgdHR5ID0gUG9ydFAtPmdzLnR0eTsKKworCisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgInR4IHBvcnQgJWQ6ICVkIGNoYXJzIHF1ZXVlZC5cbiIsIAorCSAgICAgIFBvcnRQLT5Qb3J0TnVtLCBQb3J0UC0+Z3MueG1pdF9jbnQpOworCisgIGlmICghUG9ydFAtPmdzLnhtaXRfY250KSByZXR1cm47CisgIAorCisgIC8qIFRoaXMgcm91dGluZSBpcyBhbiBvcmRlciBvZiBtYWduaXR1ZGUgc2ltcGxlciB0aGFuIHRoZSBzcGVjaWFsaXgKKyAgICAgdmVyc2lvbi4gT25lIG9mIHRoZSBkaXNhZHZhbnRhZ2VzIGlzIHRoYXQgdGhpcyB2ZXJzaW9uIHdpbGwgc2VuZAorICAgICBhbiBpbmNvbXBsZXRlIHBhY2tldCAodXN1YWxseSA2NCBieXRlcyBpbnN0ZWFkIG9mIDcyKSBvbmNlIGZvcgorICAgICBldmVyeSA0ayB3b3J0aCBvZiBkYXRhLiBMZXQncyBqdXN0IHNheSB0aGF0IHRoaXMgd29uJ3QgaW5mbHVlbmNlCisgICAgIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuLi4uLiAqLworCisgIHJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworICB3aGlsZSAoY2FuX2FkZF90cmFuc21pdCggJlBhY2tldFAsIFBvcnRQICkpIHsKKyAgICBjID0gUG9ydFAtPmdzLnhtaXRfY250OworICAgIGlmIChjID4gUEtUX01BWF9EQVRBX0xFTikgYyA9IFBLVF9NQVhfREFUQV9MRU47CisKKyAgICAvKiBEb24ndCBjb3B5IHBhc3QgdGhlIGVuZCBvZiB0aGUgc291cmNlIGJ1ZmZlciAqLworICAgIGlmIChjID4gU0VSSUFMX1hNSVRfU0laRSAtIFBvcnRQLT5ncy54bWl0X3RhaWwpIAorICAgICAgYyA9IFNFUklBTF9YTUlUX1NJWkUgLSBQb3J0UC0+Z3MueG1pdF90YWlsOworCisgICAgeyBpbnQgdDsKKyAgICB0ID0gKGMgPiAxMCk/MTA6YzsKKyAgICAKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IHR4IHBvcnQgJWQ6IGNvcHlpbmcgJWQgY2hhcnM6ICVzIC0gJXNcbiIsIAorCQkgUG9ydFAtPlBvcnROdW0sIGMsIAorCQkgZmlyc3RjaGFycyAoUG9ydFAtPmdzLnhtaXRfYnVmICsgUG9ydFAtPmdzLnhtaXRfdGFpbCAgICAgICwgdCksCisJCSBmaXJzdGNoYXJzIChQb3J0UC0+Z3MueG1pdF9idWYgKyBQb3J0UC0+Z3MueG1pdF90YWlsICsgYy10LCB0KSk7CisgICAgfQorICAgIC8qIElmIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIsIHdlIGNhbid0IGNvcHkgbW9yZSBkYXRhLCAKKyAgICAgICB3ZSdyZSBkb25lISAqLworICAgIGlmIChjID09IDApIGJyZWFrOworCisgICAgcmlvX21lbWNweV90b2lvIChQb3J0UC0+SG9zdFAtPkNhZGRyLCAoY2FkZHJfdClQYWNrZXRQLT5kYXRhLCAKKwkJIFBvcnRQLT5ncy54bWl0X2J1ZiArIFBvcnRQLT5ncy54bWl0X3RhaWwsIGMpOworICAgIC8qICAgIHVkZWxheSAoMSk7ICovCisKKyAgICB3cml0ZWIgKGMsICYoUGFja2V0UC0+bGVuKSk7CisgICAgaWYgKCEoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgKSB7CisgICAgICBhZGRfdHJhbnNtaXQgKCBQb3J0UCApOworICAgICAgLyoKKyAgICAgICoqIENvdW50IGNoYXJzIHR4J2QgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKKyAgICAgICovCisgICAgICBpZiAoIFBvcnRQLT5zdGF0c0dhdGhlciApCisJUG9ydFAtPnR4Y2hhcnMgKz0gYzsKKyAgICB9CisgICAgUG9ydFAtPmdzLnhtaXRfdGFpbCA9IChQb3J0UC0+Z3MueG1pdF90YWlsICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKKyAgICBQb3J0UC0+Z3MueG1pdF9jbnQgLT0gYzsKKyAgfQorCisgIHJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCisgIGlmIChQb3J0UC0+Z3MueG1pdF9jbnQgPD0gKFBvcnRQLT5ncy53YWtldXBfY2hhcnMgKyAyKlBLVF9NQVhfREFUQV9MRU4pKSB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiV2FraW5nIHVwLi4uLiBsZGlzYzolZCAoJWQvJWQpLi4uLiIsCisJCSAoaW50KShQb3J0UC0+Z3MudHR5LT5mbGFncyAmICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApKSwKKwkJIFBvcnRQLT5ncy53YWtldXBfY2hhcnMsIFBvcnRQLT5ncy54bWl0X2NudCk7IAorICAgIGlmICgoUG9ydFAtPmdzLnR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSkgJiYKKwlQb3J0UC0+Z3MudHR5LT5sZGlzYy53cml0ZV93YWtldXApCisgICAgICAoUG9ydFAtPmdzLnR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKShQb3J0UC0+Z3MudHR5KTsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIoJWQvJWQpXG4iLAorCQlQb3J0UC0+Z3Mud2FrZXVwX2NoYXJzLCBQb3J0UC0+Z3MueG1pdF9jbnQpOyAKKyAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJlBvcnRQLT5ncy50dHktPndyaXRlX3dhaXQpOworICB9CisKK30KKworCisvKgorKiogUklPIEhvc3QgU2VydmljZSByb3V0aW5lLiBEb2VzIGFsbCB0aGUgd29yayB0cmFkaXRpb25hbGx5IGFzc29jaWF0ZWQgd2l0aCBhbgorKiogaW50ZXJydXB0LgorKi8KK3N0YXRpYyBpbnQJUnVwSW50cjsKK3N0YXRpYyBpbnQJUnhJbnRyOworc3RhdGljIGludAlUeEludHI7Cit2b2lkCitSSU9TZXJ2aWNlSG9zdChwLCBIb3N0UCwgRnJvbSkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgSG9zdCAqSG9zdFA7CitpbnQgRnJvbTsgCit7CisgIHJpb19zcGluX2xvY2sgKCZIb3N0UC0+SG9zdExvY2spOworICBpZiAoIChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcgKSB7IAorICAgIHN0YXRpYyBpbnQgdCA9MDsKKyAgICByaW9fc3Bpbl91bmxvY2sgKCZIb3N0UC0+SG9zdExvY2spOyAKKyAgICBpZiAoKHQrKyAlIDIwMCkgPT0gMCkKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIkludGVycnVwdCBidXQgaG9zdCBub3QgcnVubmluZy4gZmxhZ3M9JXguXG4iLCAoaW50KUhvc3RQLT5GbGFncyk7CisgICAgcmV0dXJuOworICB9CisgIHJpb19zcGluX3VubG9jayAoJkhvc3RQLT5Ib3N0TG9jayk7IAorCisgIGlmICggUldPUkQoIEhvc3RQLT5QYXJtTWFwUC0+cnVwX2ludHIgKSApIHsKKyAgICBXV09SRCggSG9zdFAtPlBhcm1NYXBQLT5ydXBfaW50ciAsIDAgKTsKKyAgICBwLT5SSU9SdXBDb3VudCsrOworICAgIFJ1cEludHIrKzsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IFJVUCBpbnRlcnJ1cHQgb24gaG9zdCAlZFxuIiwgSG9zdFAtcC0+UklPSG9zdHMpOworICAgIFJJT1BvbGxIb3N0Q29tbWFuZHMocCwgSG9zdFAgKTsKKyAgfQorCisgIGlmICggUldPUkQoIEhvc3RQLT5QYXJtTWFwUC0+cnhfaW50ciApICkgeworICAgIGludCBwb3J0OworCisgICAgV1dPUkQoIEhvc3RQLT5QYXJtTWFwUC0+cnhfaW50ciAsIDAgKTsKKyAgICBwLT5SSU9SeENvdW50Kys7CisgICAgUnhJbnRyKys7CisKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IFJYIGludGVycnVwdCBvbiBob3N0ICVkXG4iLCBIb3N0UC1wLT5SSU9Ib3N0cyk7CisgICAgLyoKKyAgICAqKiBMb29wIHRocm91Z2ggZXZlcnkgcG9ydC4gSWYgdGhlIHBvcnQgaXMgbWFwcGVkIGludG8KKyAgICAqKiB0aGUgc3lzdGVtICggaS5lLiBoYXMgL2Rldi90dHlYWFhYIGFzc29jaWF0ZWQgKSB0aGVuIGl0IGlzCisgICAgKiogd29ydGggY2hlY2tpbmcuIElmIHRoZSBwb3J0IGlzbid0IG9wZW4sIGdyYWIgYW55IHBhY2tldHMKKyAgICAqKiBoYW5naW5nIG9uIGl0cyByZWNlaXZlIHF1ZXVlIGFuZCBzdHVmZiB0aGVtIG9uIHRoZSBmcmVlCisgICAgKiogbGlzdDsgY2hlY2sgZm9yIGNvbW1hbmRzIG9uIHRoZSB3YXkuCisgICAgKi8KKyAgICBmb3IgKCBwb3J0PXAtPlJJT0ZpcnN0UG9ydHNCb290ZWQ7IAorCSAgcG9ydDxwLT5SSU9MYXN0UG9ydHNCb290ZWQrUE9SVFNfUEVSX1JUQTsgcG9ydCsrICkgeworICAgICAgc3RydWN0IFBvcnQgKlBvcnRQID0gcC0+UklPUG9ydHBbcG9ydF07CisgICAgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5UDsKKyAgICAgIHN0cnVjdCBQS1QgKlBhY2tldFA7CisJCQorICAgICAgLyoKKyAgICAgICoqIG5vdCBtYXBwZWQgaW4gLSBtb3N0IG9mIHRoZSBSSU9Qb3J0cFtdIGluZm9ybWF0aW9uCisgICAgICAqKiBoYXMgbm90IGJlZW4gc2V0IHVwIQorICAgICAgKiogT3B0aW1pc2U6IHBvcnRzIGNvbWUgaW4gYnVuZGxlcyBvZiBlaWdodC4KKyAgICAgICovCisgICAgICBpZiAoICFQb3J0UC0+TWFwcGVkICkgeworCXBvcnQgKz0gNzsKKwljb250aW51ZTsgLyogd2l0aCB0aGUgbmV4dCBwb3J0ICovCisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAqKiBJZiB0aGUgaG9zdCBib2FyZCBpc24ndCBUSElTIGhvc3QgYm9hcmQsIGNoZWNrIHRoZSBuZXh0IG9uZS4KKyAgICAgICoqIG9wdGltaXNlOiBwb3J0cyBjb21lIGluIGJ1bmRsZXMgb2YgZWlnaHQuCisgICAgICAqLworICAgICAgaWYgKCBQb3J0UC0+SG9zdFAgIT0gSG9zdFAgKSB7CisJcG9ydCArPSA3OworCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKgorICAgICAgKiogTGV0IHVzIHNlZSAtIGlzIHRoZSBwb3J0IG9wZW4/IElmIG5vdCwgdGhlbiBkb24ndCBzZXJ2aWNlIGl0LgorICAgICAgKi8KKyAgICAgIGlmICggISggUG9ydFAtPlBvcnRTdGF0ZSAmIFBPUlRfSVNPUEVOICkgKSB7CisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAqKiBmaW5kIGNvcnJlc3BvbmRpbmcgdHR5IHN0cnVjdHVyZS4gVGhlIHByb2Nlc3Mgb2YgbWFwcGluZworICAgICAgKiogdGhlIHBvcnRzIHB1dHMgdGhlc2UgaGVyZS4KKyAgICAgICovCisgICAgICB0dHlQID0gUG9ydFAtPmdzLnR0eTsKKworICAgICAgLyoKKyAgICAgICoqIExvY2sgdGhlIHBvcnQgYmVmb3JlIHdlIGJlZ2luIHdvcmtpbmcgb24gaXQuCisgICAgICAqLworICAgICAgcmlvX3NwaW5fbG9jaygmUG9ydFAtPnBvcnRTZW0pOworCisgICAgICAvKgorICAgICAgKiogUHJvY2VzcyByZWNlaXZlZCBkYXRhIGlmIHRoZXJlIGlzIGFueS4KKyAgICAgICovCisgICAgICBpZiAoIGNhbl9yZW1vdmVfcmVjZWl2ZSggJlBhY2tldFAsIFBvcnRQICkgKQorCVJJT1JlY2VpdmUocCwgUG9ydFApOworCisgICAgICAvKgorICAgICAgKiogSWYgdGhlcmUgaXMgbm8gZGF0YSBsZWZ0IHRvIGJlIHJlYWQgZnJvbSB0aGUgcG9ydCwgYW5kCisgICAgICAqKiBpdCdzIGhhbmRzaGFrZSBiaXQgaXMgc2V0LCB0aGVuIHdlIG11c3QgY2xlYXIgdGhlIGhhbmRzaGFrZSwKKyAgICAgICoqIHNvIHRoYXQgdGhhdCBkb3duc3RyZWFtIFJUQSBpcyByZS1lbmFibGVkLgorICAgICAgKi8KKyAgICAgIGlmICggIWNhbl9yZW1vdmVfcmVjZWl2ZSggJlBhY2tldFAsIFBvcnRQICkgJiYgCisJICAgKCBSV09SRCggUG9ydFAtPlBoYlAtPmhhbmRzaGFrZSApPT1QSEJfSEFORFNIQUtFX1NFVCApICkgeworCQkJCS8qCisJCQkJKiogTUFHSUMhICggQmFzaWNhbGx5LCBoYW5kc2hha2UgdGhlIFJYIGJ1ZmZlciwgc28gdGhhdAorCQkJCSoqIHRoZSBSVEFzIHVwc3RyZWFtIGNhbiBiZSByZS1lbmFibGVkLiApCisJCQkJKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJTZXQgUlggaGFuZHNoYWtlIGJpdFxuIik7CisJV1dPUkQoIFBvcnRQLT5QaGJQLT5oYW5kc2hha2UsIAorCSAgICAgICBQSEJfSEFORFNIQUtFX1NFVHxQSEJfSEFORFNIQUtFX1JFU0VUICk7CisgICAgICB9CisgICAgICByaW9fc3Bpbl91bmxvY2soJlBvcnRQLT5wb3J0U2VtKTsKKyAgICB9CisgIH0KKworICBpZiAoIFJXT1JEKCBIb3N0UC0+UGFybU1hcFAtPnR4X2ludHIgKSApIHsKKyAgICBpbnQgcG9ydDsKKworICAgIFdXT1JEKCBIb3N0UC0+UGFybU1hcFAtPnR4X2ludHIgLCAwKTsKKworICAgIHAtPlJJT1R4Q291bnQrKzsKKyAgICBUeEludHIrKzsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IFRYIGludGVycnVwdCBvbiBob3N0ICVkXG4iLCBIb3N0UC1wLT5SSU9Ib3N0cyk7CisKKyAgICAvKgorICAgICoqIExvb3AgdGhyb3VnaCBldmVyeSBwb3J0LgorICAgICoqIElmIHRoZSBwb3J0IGlzIG1hcHBlZCBpbnRvIHRoZSBzeXN0ZW0gKCBpLmUuIGhhcyAvZGV2L3R0eVhYWFgKKyAgICAqKiBhc3NvY2lhdGVkICkgdGhlbiBpdCBpcyB3b3J0aCBjaGVja2luZy4KKyAgICAqLworICAgIGZvciAoIHBvcnQ9cC0+UklPRmlyc3RQb3J0c0Jvb3RlZDsgCisJICBwb3J0PHAtPlJJT0xhc3RQb3J0c0Jvb3RlZCtQT1JUU19QRVJfUlRBOyBwb3J0KysgKSB7CisgICAgICBzdHJ1Y3QgUG9ydCAqUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0XTsKKyAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHlQOworICAgICAgc3RydWN0IFBLVCAqUGFja2V0UDsKKworICAgICAgLyoKKyAgICAgICoqIG5vdCBtYXBwZWQgaW4gLSBtb3N0IG9mIHRoZSBSSU9Qb3J0cFtdIGluZm9ybWF0aW9uCisgICAgICAqKiBoYXMgbm90IGJlZW4gc2V0IHVwIQorICAgICAgKi8KKyAgICAgIGlmICggIVBvcnRQLT5NYXBwZWQgKSB7CisJcG9ydCArPSA3OworCWNvbnRpbnVlOyAvKiB3aXRoIHRoZSBuZXh0IHBvcnQgKi8KKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICoqIElmIHRoZSBob3N0IGJvYXJkIGlzbid0IHJ1bm5pbmcsIHRoZW4gaXRzIGRhdGEgc3RydWN0dXJlcworICAgICAgKiogYXJlIG5vIHVzZSB0byB1cyAtIGNvbnRpbnVlIHF1aWV0bHkuCisgICAgICAqLworICAgICAgaWYgKCBQb3J0UC0+SG9zdFAgIT0gSG9zdFAgKSB7CisJcG9ydCArPSA3OworCWNvbnRpbnVlOyAvKiB3aXRoIHRoZSBuZXh0IHBvcnQgKi8KKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICoqIExldCB1cyBzZWUgLSBpcyB0aGUgcG9ydCBvcGVuPyBJZiBub3QsIHRoZW4gZG9uJ3Qgc2VydmljZSBpdC4KKyAgICAgICovCisgICAgICBpZiAoICEoIFBvcnRQLT5Qb3J0U3RhdGUgJiBQT1JUX0lTT1BFTiApICkgeworCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IExvb2tpbmcgaW50byBwb3J0ICVkLlxuIiwgcG9ydCk7CisgICAgICAvKgorICAgICAgKiogTG9jayB0aGUgcG9ydCBiZWZvcmUgd2UgYmVnaW4gd29ya2luZyBvbiBpdC4KKyAgICAgICovCisgICAgICByaW9fc3Bpbl9sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisKKyAgICAgIC8qCisgICAgICAqKiBJZiB3ZSBjYW4ndCBhZGQgYW55dGhpbmcgdG8gdGhlIHRyYW5zbWl0IHF1ZXVlLCB0aGVuCisgICAgICAqKiB3ZSBuZWVkIGRvIG5vbmUgb2YgdGhpcyBwcm9jZXNzaW5nLgorICAgICAgKi8KKyAgICAgIGlmICggIWNhbl9hZGRfdHJhbnNtaXQoICZQYWNrZXRQLCBQb3J0UCApICkgeworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIkNhbid0IGFkZCB0byBwb3J0LCBzbyBza2lwcGluZy5cbiIpOworCXJpb19zcGluX3VubG9jaygmUG9ydFAtPnBvcnRTZW0pOworCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKgorICAgICAgKiogZmluZCBjb3JyZXNwb25kaW5nIHR0eSBzdHJ1Y3R1cmUuIFRoZSBwcm9jZXNzIG9mIG1hcHBpbmcKKyAgICAgICoqIHRoZSBwb3J0cyBwdXRzIHRoZXNlIGhlcmUuCisgICAgICAqLworICAgICAgdHR5UCA9IFBvcnRQLT5ncy50dHk7CisgICAgICAvKiBJZiB0dHlQIGlzIE5VTEwsIHRoZSBwb3J0IGlzIGdldHRpbmcgY2xvc2VkLiBGb3JnZXQgYWJvdXQgaXQuICovCisgICAgICBpZiAoIXR0eVApIHsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJubyB0dHksIHNvIHNraXBwaW5nLlxuIik7CisJcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJY29udGludWU7CisgICAgICB9CisgICAgICAvKgorICAgICAgKiogSWYgdGhlcmUgaXMgbW9yZSByb29tIGF2YWlsYWJsZSB3ZSBzdGFydCB1cCB0aGUgdHJhbnNtaXQKKyAgICAgICoqIGRhdGEgcHJvY2VzcyBhZ2Fpbi4gVGhpcyBjYW4gYmUgZGlyZWN0IEkvTywgaWYgdGhlIGNvb2ttb2RlCisgICAgICAqKiBpcyBzZXQgdG8gQ09PS19SQVcgb3IgQ09PS19NRURJVU0sIG9yIHdpbGwgYmUgYSBjYWxsIHRvIHRoZQorICAgICAgKiogcmlvdHByb2MoIFRfT1VUUFVUICkgaWYgd2UgYXJlIGluIENPT0tfV0VMTCBtb2RlLCB0byBmZXRjaAorICAgICAgKiogY2hhcmFjdGVycyB2aWEgdGhlIGxpbmUgZGlzY2lwbGluZS4gV2UgbXVzdCBhbHdheXMgY2FsbAorICAgICAgKiogdGhlIGxpbmUgZGlzY2lwbGluZSwKKyAgICAgICoqIHNvIHRoYXQgdXNlciBpbnB1dCBjaGFyYWN0ZXJzIGNhbiBiZSBlY2hvZWQgY29ycmVjdGx5LgorICAgICAgKioKKyAgICAgICoqICsrKysgVXBkYXRlICsrKysrCisgICAgICAqKiBXaXRoIHRoZSBhZHZlbnQgb2YgZG91YmxlIGJ1ZmZlcmluZywgd2Ugbm93IHNlZSBpZgorICAgICAgKiogVHhCdWZmZXJPdXQtSW4gaXMgbm9uLXplcm8uIElmIHNvLCB0aGVuIHdlIGNvcHkgYSBwYWNrZXQKKyAgICAgICoqIHRvIHRoZSBvdXRwdXQgcGxhY2UsIGFuZCBzZXQgaXQgZ29pbmcuIElmIHRoaXMgZW1wdGllcworICAgICAgKiogdGhlIGJ1ZmZlciwgdGhlbiB3ZSBtdXN0IGlzc3VlIGEgd2FrZXVwKCApIG9uIE9VVC4KKyAgICAgICoqIElmIGl0IGZyZWVzIHNwYWNlIGluIHRoZSBidWZmZXIgdGhlbiB3ZSBtdXN0IGlzc3VlCisgICAgICAqKiBhIHdha2V1cCggKSBvbiBJTi4KKyAgICAgICoqCisgICAgICAqKiArKysrIEV4dHJhISBFeHRyYSEgSWYgUG9ydFAtPldmbHVzaEZsYWcgaXMgc2V0LCB0aGVuIHdlCisgICAgICAqKiBoYXZlIHRvIHNlbmQgYSBXRkxVU0ggY29tbWFuZCBkb3duIHRoZSBQSEIsIHRvIG1hcmsgdGhlCisgICAgICAqKiBlbmQgcG9pbnQgb2YgYSBXRkxVU0guIFdlIGFsc28gbmVlZCB0byBjbGVhciBvdXQgYW55CisgICAgICAqKiBkYXRhIGZyb20gdGhlIGRvdWJsZSBidWZmZXIhICggbm90ZSB0aGF0IFdmbHVzaEZsYWcgaXMgYQorICAgICAgKiogKmNvdW50KiBvZiB0aGUgbnVtYmVyIG9mIFdGTFVTSCBjb21tYW5kcyBvdXRzdGFuZGluZyEgKQorICAgICAgKioKKyAgICAgICoqICsrKysgQW5kIHRoZXJlJ3MgbW9yZSEKKyAgICAgICoqIElmIGFuIFJUQSBpcyBwb3dlcmVkIG9mZiwgdGhlbiBvbiBhZ2FpbiwgYW5kIHJlYm9vdGVkLAorICAgICAgKiogd2hpbHN0IGl0IGhhcyBwb3J0cyBvcGVuLCB0aGVuIHdlIG5lZWQgdG8gcmUtb3BlbiB0aGUgcG9ydHMuCisgICAgICAqKiAoIHJlYXNvbmFibGUgZW5vdWdoICkuIFdlIGNhbid0IGRvIHRoaXMgd2hlbiB3ZSBzcG90IHRoZQorICAgICAgKiogcmUtYm9vdCwgaW4gaW50ZXJydXB0IHRpbWUsIGJlY2F1c2UgdGhlIHF1ZXVlIGlzIHByb2JhYmx5CisgICAgICAqKiBmdWxsLiBTbywgd2hlbiB3ZSBjb21lIGluIGhlcmUsIHdlIG5lZWQgdG8gdGVzdCBpZiBhbnkKKyAgICAgICoqIHBvcnRzIGFyZSBpbiB0aGlzIGNvbmRpdGlvbiwgYW5kIHJlLW9wZW4gdGhlIHBvcnQgYmVmb3JlCisgICAgICAqKiB3ZSB0cnkgdG8gc2VuZCBhbnkgbW9yZSBkYXRhIHRvIGl0LiBOb3csIHRoZSByZS1ib290ZWQKKyAgICAgICoqIFJUQSB3aWxsIGJlIGRpc2NhcmRpbmcgcGFja2V0cyBmcm9tIHRoZSBQSEIgdW50aWwgaXQKKyAgICAgICoqIHJlY2VpdmVzIHRoaXMgb3BlbiBwYWNrZXQsIGJ1dCBkb24ndCB3b3JyeSB0b29vIG11Y2gKKyAgICAgICoqIGFib3V0IHRoYXQuIFRoZSBvbmUgdGhpbmcgdGhhdCBpcyBpbnRlcmVzdGluZyBpcyB0aGUKKyAgICAgICoqIGNvbWJpbmF0aW9uIG9mIHRoaXMgZWZmZWN0IGFuZCB0aGUgV0ZMVVNIIGVmZmVjdCEKKyAgICAgICovCisgICAgICAvKiBGb3Igbm93IGRvbid0IGhhbmRsZSBSVEEgcmVib290cy4gLS0gUkVXLiAKKwkgUmVlbmFibGVkLiBPdGhlcndpc2UgUlRBIHJlYm9vdHMgZGlkbid0IHdvcmsuIER1aC4gLS0gUkVXICovCisgICAgICBpZiAoIFBvcnRQLT5NYWdpY0ZsYWdzICkgeworI2lmIDEKKwlpZiAoIFBvcnRQLT5NYWdpY0ZsYWdzICYgTUFHSUNfUkVCT09UICkgeworCSAgLyoKKwkgICoqIHdlbGwsIHRoZSBSVEEgaGFzIGJlZW4gcmVib290ZWQsIGFuZCB0aGVyZSBpcyByb29tCisJICAqKiBvbiBpdHMgcXVldWUgdG8gYWRkIHRoZSBvcGVuIHBhY2tldCB0aGF0IGlzIHJlcXVpcmVkLgorCSAgKioKKwkgICoqIFRoZSBtZXNzeSBwYXJ0IG9mIHRoaXMgbGluZSBpcyB0cnlpbmcgdG8gZGVjaWRlIGlmCisJICAqKiB3ZSBuZWVkIHRvIGNhbGwgdGhlIFBhcmFtIGZ1bmN0aW9uIGFzIGEgdHR5IG9yIGFzCisJICAqKiBhIG1vZGVtLgorCSAgKiogRE9OVCBVU0UgQ0xPQ0FMIEFTIEEgVEVTVCBGT1IgVEhJUyEKKwkgICoqCisJICAqKiBJZiB3ZSBjYW4ndCBwYXJhbSB0aGUgcG9ydCwgdGhlbiBtb3ZlIG9uIHRvIHRoZQorCSAgKiogbmV4dCBwb3J0LgorCSAgKi8KKwkgIFBvcnRQLT5JblVzZSA9IE5PVF9JTlVTRTsKKworCSAgcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJICBpZiAoIFJJT1BhcmFtKFBvcnRQLCBPUEVOLCAoKFBvcnRQLT5Db3IyQ29weSAmIAorCQkJCSAgICAgICAoQ09SMl9SVFNGTE9XfENPUjJfQ1RTRkxPVyApICk9PSAKKwkJCQkgICAgICAoQ09SMl9SVFNGTE9XfENPUjJfQ1RTRkxPVyApICkgPyAKKwkJCVRSVUUgOiBGQUxTRSwgRE9OVF9TTEVFUCApID09IFJJT19GQUlMICkgeworCSAgICBjb250aW51ZTsgLyogd2l0aCBuZXh0IHBvcnQgKi8KKwkgIH0KKwkgIHJpb19zcGluX2xvY2soJlBvcnRQLT5wb3J0U2VtKTsKKwkgIFBvcnRQLT5NYWdpY0ZsYWdzICY9IH5NQUdJQ19SRUJPT1Q7CisJfQorI2VuZGlmCisKKwkvKgorCSoqIEFzIG1lbnRpb25lZCBhYm92ZSwgdGhpcyBpcyBhIHRhY2t5IGhhY2sgdG8gY29wZQorCSoqIHdpdGggV0ZMVVNICisJKi8KKwlpZiAoIFBvcnRQLT5XZmx1c2hGbGFnICkgeworCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiV2FudCB0byBXRkxVU0ggbWFyayB0aGlzIHBvcnRcbiIpOworCisJICBpZiAoIFBvcnRQLT5JblVzZSApCisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIkZBSUxTIC0gUE9SVCBJUyBJTiBVU0VcbiIpOworCX0KKwkJCQkKKwl3aGlsZSAoIFBvcnRQLT5XZmx1c2hGbGFnICYmCisJCWNhbl9hZGRfdHJhbnNtaXQoICZQYWNrZXRQLCBQb3J0UCApICYmIAorCQkoIFBvcnRQLT5JblVzZSA9PSBOT1RfSU5VU0UgKSApIHsKKwkgIGludCBwOworCSAgc3RydWN0IFBrdENtZCAqUGt0Q21kUDsKKworCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiQWRkIFdGTFVTSCBtYXJrZXIgdG8gZGF0YSBxdWV1ZVxuIik7CisJICAvKgorCSAgKiogbWFrZSBpdCBsb29rIGp1c3QgbGlrZSBhIFdGTFVTSCBjb21tYW5kCisJICAqLworCSAgUGt0Q21kUCA9ICggc3RydWN0IFBrdENtZCAqICkmUGFja2V0UC0+ZGF0YVswXTsKKworCSAgV0JZVEUoIFBrdENtZFAtPkNvbW1hbmQgLCBXRkxVU0ggKTsKKworCSAgcCA9ICBQb3J0UC0+SG9zdFBvcnQgJSAoIHVzaG9ydCApUE9SVFNfUEVSX1JUQTsKKworCSAgLyoKKwkgICoqIElmIHNlY29uZCBibG9jayBvZiBwb3J0cyBmb3IgMTYgcG9ydCBSVEEsIGFkZCA4CisJICAqKiB0byBpbmRleCA4LTE1LgorCSAgKi8KKwkgIGlmICggUG9ydFAtPlNlY29uZEJsb2NrICkKKwkgICAgcCArPSBQT1JUU19QRVJfUlRBOworCisJICBXQllURSggUGt0Q21kUC0+UGhiTnVtLCBwICk7CisKKwkgIC8qCisJICAqKiB0byBtYWtlIGRlYnVnZ2VyeSBlYXNpZXIKKwkgICovCisJICBXQllURSggUGFja2V0UC0+ZGF0YVsgMl0sICdXJyAgKTsKKwkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWyAzXSwgJ0YnICApOworCSAgV0JZVEUoIFBhY2tldFAtPmRhdGFbIDRdLCAnTCcgICk7CisJICBXQllURSggUGFja2V0UC0+ZGF0YVsgNV0sICdVJyAgKTsKKwkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWyA2XSwgJ1MnICApOworCSAgV0JZVEUoIFBhY2tldFAtPmRhdGFbIDddLCAnSCcgICk7CisJICBXQllURSggUGFja2V0UC0+ZGF0YVsgOF0sICcgJyAgKTsKKwkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWyA5XSwgJzAnK1BvcnRQLT5XZmx1c2hGbGFnICk7CisJICBXQllURSggUGFja2V0UC0+ZGF0YVsxMF0sICcgJyAgKTsKKwkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWzExXSwgJyAnICApOworCSAgV0JZVEUoIFBhY2tldFAtPmRhdGFbMTJdLCAnXDAnICk7CisKKwkgIC8qCisJICAqKiBpdHMgdHdvIGJ5dGVzIGxvbmchCisJICAqLworCSAgV0JZVEUoIFBhY2tldFAtPmxlbiAsIFBLVF9DTURfQklUIHwgMiApOworCisJICAvKgorCSAgKiogcXVldWUgaXQhCisJICAqLworCSAgaWYgKCAhKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApICkgeworCSAgICBhZGRfdHJhbnNtaXQoIFBvcnRQICk7CisJICAgIC8qCisJICAgICoqIENvdW50IGNoYXJzIHR4J2QgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKKwkgICAgKi8KKwkgICAgaWYgKCBQb3J0UC0+c3RhdHNHYXRoZXIgKQorCSAgICAgIFBvcnRQLT50eGNoYXJzICs9IDI7CisJICB9CisKKwkgIGlmICggLS0oIFBvcnRQLT5XZmx1c2hGbGFnICkgPT0gMCApIHsKKwkgICAgUG9ydFAtPk1hZ2ljRmxhZ3MgJj0gfk1BR0lDX0ZMVVNIOworCSAgfQorCisJICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJXZmx1c2ggY291bnQgbm93IHN0YW5kcyBhdCAlZFxuIiwgCisJCSBQb3J0UC0+V2ZsdXNoRmxhZyk7CisJfQorCWlmICggUG9ydFAtPk1hZ2ljRmxhZ3MgJiBNT1JFX09VVFBVVF9FWUdPUiApIHsKKwkgIGlmICggUG9ydFAtPk1hZ2ljRmxhZ3MgJiBNQUdJQ19GTFVTSCApIHsKKwkgICAgUG9ydFAtPk1hZ2ljRmxhZ3MgfD0gTU9SRV9PVVRQVVRfRVlHT1I7CisJICB9CisJICBlbHNlIHsKKwkgICAgaWYgKCAhY2FuX2FkZF90cmFuc21pdCggJlBhY2tldFAsIFBvcnRQICkgKSB7CisJICAgICAgcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgICAgcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJICAgIFJJT1R4RW5hYmxlKChjaGFyICopUG9ydFApOworCSAgICByaW9fc3Bpbl9sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJICAgIFBvcnRQLT5NYWdpY0ZsYWdzICY9IH5NT1JFX09VVFBVVF9FWUdPUjsKKwkgIH0KKwl9CisgICAgICB9CisKKworICAgICAgLyoKKyAgICAgICoqIElmIHdlIGNhbid0IGFkZCBhbnl0aGluZyB0byB0aGUgdHJhbnNtaXQgcXVldWUsIHRoZW4KKyAgICAgICoqIHdlIG5lZWQgZG8gbm9uZSBvZiB0aGUgcmVtYWluaW5nIHByb2Nlc3NpbmcuCisgICAgICAqLworICAgICAgaWYgKCFjYW5fYWRkX3RyYW5zbWl0KCAmUGFja2V0UCwgUG9ydFAgKSApIHsKKwlyaW9fc3Bpbl91bmxvY2soJlBvcnRQLT5wb3J0U2VtKTsKKwljb250aW51ZTsKKyAgICAgIH0KKworICAgICAgcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisgICAgICBSSU9UeEVuYWJsZSgoY2hhciAqKVBvcnRQKTsKKyAgICB9CisgIH0KK30KKworLyoKKyoqIFJvdXRpbmUgZm9yIGhhbmRsaW5nIHJlY2VpdmVkIGRhdGEgZm9yIGNsaXN0IGRyaXZlcnMuCisqKiBOQjogQ2FsbGVkIHdpdGggdGhlIHR0eSBsb2NrZWQuIFRoZSBzcGwgZnJvbSB0aGUgbG9ja2IoICkgaXMgcGFzc2VkLgorKiogd2UgcmV0dXJuIHRoZSB0dHlTcGwgbGV2ZWwgdGhhdCB3ZSByZS1sb2NrZWQgYXQuCisqLworc3RhdGljIHZvaWQKK1JJT1JlY2VpdmUocCwgUG9ydFApCitzdHJ1Y3QgcmlvX2luZm8gKglwOworc3RydWN0IFBvcnQgKgkJUG9ydFA7Cit7CisgIHN0cnVjdCB0dHlfc3RydWN0ICpUdHlQOworICByZWdpc3RlciB1c2hvcnQgdHJhbnNDb3VudDsKKyAgc3RydWN0IFBLVCAqUGFja2V0UDsKKyAgcmVnaXN0ZXIgdWludAlEYXRhQ250OworICB1Y2hhciAqCXB0cjsKKyAgaW50IGNvcGllZCA9MDsKKworICBzdGF0aWMgaW50IGludENvdW50LCBSeEludENudDsKKworICAvKgorICAqKiBUaGUgcmVjZWl2ZSBkYXRhIHByb2Nlc3MgaXMgdG8gcmVtb3ZlIHBhY2tldHMgZnJvbSB0aGUKKyAgKiogUEhCIHVudGlsIHRoZXJlIGFyZW4ndCBhbnkgbW9yZSBvciB0aGUgY3VycmVudCBjYmxvY2sKKyAgKiogaXMgZnVsbC4gV2hlbiB0aGlzIG9jY3VycywgdGhlcmUgd2lsbCBiZSBzb21lIGxlZnQgb3ZlcgorICAqKiBkYXRhIGluIHRoZSBwYWNrZXQsIHRoYXQgd2UgbXVzdCBkbyBzb21ldGhpbmcgd2l0aC4KKyAgKiogQXMgd2UgaGF2ZW4ndCB1bmhvb2tlZCB0aGUgcGFja2V0IGZyb20gdGhlIHJlYWQgbGlzdAorICAqKiB5ZXQsIHdlIGNhbiBqdXN0IGxlYXZlIHRoZSBwYWNrZXQgdGhlcmUsIGhhdmluZyBmaXJzdAorICAqKiBtYWRlIGEgbm90ZSBvZiBob3cgZmFyIHdlIGdvdC4gVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQKKyAgKiogYSBwb2ludGVyIHBlciBwb3J0IHNheWluZyB3aGVyZSB3ZSBzdGFydCB0YWtpbmcgdGhlCisgICoqIGRhdGEgZnJvbSAtIHRoaXMgd2lsbCBub3JtYWxseSBiZSB6ZXJvLCBidXQgd2hlbiB3ZQorICAqKiBydW4gb3V0IG9mIHNwYWNlIGl0IHdpbGwgYmUgc2V0IHRvIHRoZSBvZmZzZXQgb2YgdGhlCisgICoqIG5leHQgYnl0ZSB0byBjb3B5IGZyb20gdGhlIHBhY2tldCBkYXRhIGFyZWEuIFRoZSBwYWNrZXQKKyAgKiogbGVuZ3RoIGZpZWxkIGlzIGRlY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdAorICAqKiB3ZSBzdWNjZXNmdWxseSByZW1vdmVkIGZyb20gdGhlIHBhY2tldC4gV2hlbiB0aGlzIHJlYWNoZXMKKyAgKiogemVybywgd2UgcmVzZXQgdGhlIG9mZnNldCBwb2ludGVyIHRvIGJlIHplcm8sIGFuZCBmcmVlCisgICoqIHRoZSBwYWNrZXQgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLgorICAqLworCisgIGludENvdW50Kys7CisKKyAgVHR5UCA9IFBvcnRQLT5ncy50dHk7CisgIGlmICghVHR5UCkgeworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlJJT1JlY2VpdmU6IHR0eSBpcyBudWxsLiBcbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChQb3J0UC0+U3RhdGUgJiBSSU9fVEhST1RUTEVfUlgpIHsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJSSU9SZWNlaXZlOiBUaHJvdHRsZWQuIENhbid0IGhhbmRsZSBtb3JlIGlucHV0LlxuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApCisgICAgeworICAgICAgd2hpbGUgKCBjYW5fcmVtb3ZlX3JlY2VpdmUoICZQYWNrZXRQLCBQb3J0UCApICkKKwl7CisJICByZW1vdmVfcmVjZWl2ZSggUG9ydFAgKTsKKwkgIHB1dF9mcmVlX2VuZCggUG9ydFAtPkhvc3RQLCBQYWNrZXRQICk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qCisgICAgICAqKiBsb29wLCBqdXN0IHNvIGxvbmcgYXM6CisgICAgICAqKiAgIGkgKSB0aGVyZSdzIHNvbWUgZGF0YSAoIGkuZS4gY2FuX3JlbW92ZV9yZWNlaXZlICkKKyAgICAgICoqICBpaSApIHdlIGhhdmVuJ3QgYmVlbiBibG9ja2VkCisgICAgICAqKiBpaWkgKSB0aGVyZSdzIHNvbWV3aGVyZSB0byBwdXQgdGhlIGRhdGEKKyAgICAgICoqICBpdiApIHdlIGhhdmVuJ3Qgb3V0c3RheWVkIG91ciB3ZWxjb21lCisgICAgICAqLworICAgICAgdHJhbnNDb3VudCA9IDE7CisgICAgICB3aGlsZSAoIGNhbl9yZW1vdmVfcmVjZWl2ZSgmUGFja2V0UCwgUG9ydFApCisJICAgICAgJiYgdHJhbnNDb3VudCkKKwl7CisjaWZkZWYgU1RBVFMKKwkgIFBvcnRQLT5TdGF0LlJ4SW50Q250Kys7CisjZW5kaWYgLyogU1RBVFMgKi8KKwkgIFJ4SW50Q250Kys7CisKKwkgIC8qCisJICAqKiBjaGVjayB0aGF0IGl0IGlzIG5vdCBhIGNvbW1hbmQhCisJICAqLworCSAgaWYgKCBQYWNrZXRQLT5sZW4gJiBQS1RfQ01EX0JJVCApIHsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUklPOiB1bmV4cGVjdGVkIGNvbW1hbmQgcGFja2V0IHJlY2VpdmVkIG9uIFBIQlxuIik7CisJICAgIC8qCSAgICByaW9fZHByaW50KFJJT19ERUJVR19JTlRSLCAoIiBzeXNwb3J0ICAgPSAlZFxuIiwgcC0+UklPUG9ydHAtPlBvcnROdW0pKTsgKi8KKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiIGRlc3RfdW5pdCA9ICVkXG4iLCBQYWNrZXRQLT5kZXN0X3VuaXQpOworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIgZGVzdF9wb3J0ID0gJWRcbiIsIFBhY2tldFAtPmRlc3RfcG9ydCk7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIiBzcmNfdW5pdCAgPSAlZFxuIiwgUGFja2V0UC0+c3JjX3VuaXQpOworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIgc3JjX3BvcnQgID0gJWRcbiIsIFBhY2tldFAtPnNyY19wb3J0KTsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiIGxlbgkgICA9ICVkXG4iLCBQYWNrZXRQLT5sZW4pOworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIgY29udHJvbCAgID0gJWRcbiIsIFBhY2tldFAtPmNvbnRyb2wpOworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIgY3N1bQkgICA9ICVkXG4iLCBQYWNrZXRQLT5jc3VtKTsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiCSBkYXRhIGJ5dGVzOiAiKTsKKwkgICAgZm9yICggRGF0YUNudD0wOyBEYXRhQ250PFBLVF9NQVhfREFUQV9MRU47IERhdGFDbnQrKyApCisJICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiJWRcbiIsIFBhY2tldFAtPmRhdGFbRGF0YUNudF0pOworCSAgICByZW1vdmVfcmVjZWl2ZSggUG9ydFAgKTsKKwkgICAgcHV0X2ZyZWVfZW5kKCBQb3J0UC0+SG9zdFAsIFBhY2tldFAgKTsKKwkgICAgY29udGludWU7IC8qIHdpdGggbmV4dCBwYWNrZXQgKi8KKwkgIH0KKworCSAgLyoKKwkgICoqIEhvdyBtYW55IGNoYXJhY3RlcnMgY2FuIHdlIG1vdmUgJ3Vwc3RyZWFtJyA/CisJICAqKgorCSAgKiogRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIG9mIHRoZSBhbW91bnQgb2YgZGF0YQorCSAgKiogYXZhaWxhYmxlIGFuZCB0aGUgYW1vdW50IG9mIHNwYWNlIGluIHdoaWNoIHRvCisJICAqKiBwdXQgaXQuCisJICAqKgorCSAgKiogMS4JR2V0IHRoZSBwYWNrZXQgbGVuZ3RoIGJ5IG1hc2tpbmcgJ2xlbicKKwkgICoqCWZvciBvbmx5IHRoZSBsZW5ndGggYml0cy4KKwkgICoqIDIuCUF2YWlsYWJsZSBzcGFjZSBpcyBbYnVmZmVyIHNpemVdIC0gW3NwYWNlIHVzZWRdCisJICAqKgorCSAgKiogVHJhbnNmZXIgY291bnQgaXMgdGhlIG1pbmltdW0gb2YgcGFja2V0IGxlbmd0aAorCSAgKiogYW5kIGF2YWlsYWJsZSBzcGFjZS4KKwkgICovCisJCQkKKwkgIHRyYW5zQ291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIFBhY2tldFAtPmxlbiAmIFBLVF9MRU5fTUFTSywKKwkJCSAgIFRUWV9GTElQQlVGX1NJWkUgLSBUdHlQLT5mbGlwLmNvdW50KTsKKwkgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUkVDLCAgInBvcnQgJWQ6IENvcHkgJWQgYnl0ZXNcbiIsIAorCQkJCSAgICAgIFBvcnRQLT5Qb3J0TnVtLCB0cmFuc0NvdW50KTsKKwkgIC8qCisJICAqKiBUbyB1c2UgdGhlIGZvbGxvd2luZyAna2twcmludGZzJyBmb3IgZGVidWdnaW5nIC0gY2hhbmdlIHRoZSAnI3VuZGVmJworCSAgKiogdG8gJyNkZWZpbmUnLCAodGhpcyBpcyB0aGUgb25seSBwbGFjZSBfX19ERUJVR19JVF9fXyBvY2N1cnMgaW4gdGhlCisJICAqKiBkcml2ZXIpLgorCSAgKi8KKyN1bmRlZiBfX19ERUJVR19JVF9fXworI2lmZGVmIF9fX0RFQlVHX0lUX19fCisJICBra3ByaW50ZigiSTolZCBSOiVkIFA6JWQgUTolZCBDOiVkIEY6JXggIiwKKwkJICAgaW50Q291bnQsCisJCSAgIFJ4SW50Q250LAorCQkgICBQb3J0UC0+UG9ydE51bSwKKwkJICAgVHR5UC0+cnhxdWV1ZS5jb3VudCwKKwkJICAgdHJhbnNDb3VudCwKKwkJICAgVHR5UC0+ZmxhZ3MgKTsKKyNlbmRpZgorCSAgcHRyID0gKHVjaGFyICopIFBhY2tldFAtPmRhdGEgKyBQb3J0UC0+UnhEYXRhU3RhcnQ7CisKKwkgIHJpb19tZW1jcHlfZnJvbWlvIChUdHlQLT5mbGlwLmNoYXJfYnVmX3B0ciwgcHRyLCB0cmFuc0NvdW50KTsKKwkgIG1lbXNldChUdHlQLT5mbGlwLmZsYWdfYnVmX3B0ciwgVFRZX05PUk1BTCwgdHJhbnNDb3VudCk7CisKKyNpZmRlZiBTVEFUUworCSAgLyoKKwkgICoqIGtlZXAgYSBjb3VudCBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXMKKwkgICovCisJICBQb3J0UC0+U3RhdC5SeENoYXJDbnQJKz0gdHJhbnNDb3VudDsKKyNlbmRpZgorCSAgUG9ydFAtPlJ4RGF0YVN0YXJ0CSs9IHRyYW5zQ291bnQ7CisJICBQYWNrZXRQLT5sZW4JCS09IHRyYW5zQ291bnQ7CisJICBjb3BpZWQgKz0gdHJhbnNDb3VudDsKKwkgIFR0eVAtPmZsaXAuY291bnQgKz0gdHJhbnNDb3VudDsKKwkgIFR0eVAtPmZsaXAuY2hhcl9idWZfcHRyICs9IHRyYW5zQ291bnQ7CisJICBUdHlQLT5mbGlwLmZsYWdfYnVmX3B0ciArPSB0cmFuc0NvdW50OworCisKKyNpZmRlZiBfX19ERUJVR19JVF9fXworCSAga2twcmludGYoIlQ6JWQgTDolZFxuIiwgRGF0YUNudCwgUGFja2V0UC0+bGVuICk7CisjZW5kaWYKKworCSAgaWYgKCBQYWNrZXRQLT5sZW4gPT0gMCApCisJICAgIHsKKwkJCQkvKgorCQkJCSoqIElmIHdlIGhhdmUgZW1wdGllZCB0aGUgcGFja2V0LCB0aGVuIHdlIGNhbgorCQkJCSoqIGZyZWUgaXQsIGFuZCByZXNldCB0aGUgc3RhcnQgcG9pbnRlciBmb3IKKwkJCQkqKiB0aGUgbmV4dCBwYWNrZXQuCisJCQkJKi8KKwkgICAgICByZW1vdmVfcmVjZWl2ZSggUG9ydFAgKTsKKwkgICAgICBwdXRfZnJlZV9lbmQoIFBvcnRQLT5Ib3N0UCwgUGFja2V0UCApOworCSAgICAgIFBvcnRQLT5SeERhdGFTdGFydCA9IDA7CisjaWZkZWYgU1RBVFMKKwkJCQkvKgorCQkJCSoqIG1vcmUgbGllcyAoIG9vcHMsIEkgbWVhbiBzdGF0aXN0aWNzICkKKwkJCQkqLworCSAgICAgIFBvcnRQLT5TdGF0LlJ4UGt0Q250Kys7CisjZW5kaWYgLyogU1RBVFMgKi8KKwkgICAgfQorCX0KKyAgICB9CisgIGlmIChjb3BpZWQpIHsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JFQywgInBvcnQgJWQ6IHB1c2hpbmcgdHR5IGZsaXAgYnVmZmVyOiAlZCB0b3RhbCBieXRlcyBjb3BpZWQuXG4iLCBQb3J0UC0+UG9ydE51bSwgY29waWVkKTsKKyAgICB0dHlfZmxpcF9idWZmZXJfcHVzaCAoVHR5UCk7CisgIH0KKworICByZXR1cm47Cit9CisKKyNpZmRlZiBGVVRVUkVfUkVMRUFTRQorLyoKKyoqIFRoZSBwcm9jIHJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gZG8gdGhlIHdvcmsgZm9yIGl0LgorKiogVGhlIHByb2Mgcm91dGluZSB3b3JrcyBoYW5kIGluIGhhbmQgd2l0aCB0aGUgaW50ZXJydXB0IHJvdXRpbmUuCisqLworaW50CityaW90cHJvYyhwLCB0cCwgY21kLCBwb3J0KQorc3RydWN0IHJpb19pbmZvICoJcDsKK3JlZ2lzdGVyIHN0cnVjdCB0dHlzdGF0aWNzICp0cDsKK2ludCBjbWQ7CitpbnQJcG9ydDsKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgUG9ydCAqUG9ydFA7CisJaW50IFN5c1BvcnQ7CisJc3RydWN0IFBLVCAqUGFja2V0UDsKKworCVN5c1BvcnQgPSBwb3J0OwkvKiBCZWxpZXZlIG1lLCBpdCB3b3Jrcy4gKi8KKworCWlmICggU3lzUG9ydCA8IDAgfHwgU3lzUG9ydCA+PSBSSU9fUE9SVFMgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIklsbGVnYWwgcG9ydCAlZCBkZXJpdmVkIGZyb20gVFRZIGluIHJpb3Rwcm9jKClcbiIsU3lzUG9ydCk7CisJCXJldHVybiAwOworCX0KKwlQb3J0UCA9IHAtPlJJT1BvcnRwW1N5c1BvcnRdOworCisJaWYgKCh1aW50KVBvcnRQLT5QaGJQIDwgKHVpbnQpUG9ydFAtPkNhZGRyIHx8IAorCQkJKHVpbnQpUG9ydFAtPlBoYlAgPj0gKHVpbnQpUG9ydFAtPkNhZGRyK1NJWFRZX0ZPVVJfSyApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUklPOiBOVUxMIG9yIEJBRCBQaGJQIG9uIHN5cyBwb3J0ICVkIGluIHByb2Mgcm91dGluZVxuIiwKKwkJCQkJCQlTeXNQb3J0KTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiCSBQb3J0UCA9IDB4JXhcbiIsUG9ydFApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIJIFBvcnRQLT5QaGJQID0gMHgleFxuIixQb3J0UC0+UGhiUCk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIgkgUG9ydFAtPkNhZGRyID0gMHgleFxuIixQb3J0UC0+UGhiUCk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIgkgUG9ydFAtPkhvc3RQb3J0ID0gMHgleFxuIixQb3J0UC0+SG9zdFBvcnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2goY21kKSB7CisJCWNhc2UgVF9XRkxVU0g6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1dGTFVTSFxuIik7CisJCQkvKgorCQkJKiogQmVjYXVzZSBvZiB0aGUgc3Bvb2t5IHdheSB0aGUgUklPIHdvcmtzLCB3ZSBkb24ndCBuZWVkCisJCQkqKiB0byBpc3N1ZSBhIGZsdXNoIGNvbW1hbmQgb24gYW55IG9mIHRoZSBTRVQqRiBjb21tYW5kcywKKwkJCSoqIGFzIHRoYXQgY2F1c2VzIHRyb3VibGUgd2l0aCBnZXR0eSBhbmQgbG9naW4sIHdoaWNoIGlzc3VlCisJCQkqKiB0aGVzZSBjb21tYW5kcyB0byBpbmN1ciBhIFJFQUQgZmx1c2gsIGFuZCByZWx5IG9uIHRoZSBmYWN0CisJCQkqKiB0aGF0IHRoZSBsaW5lIGRpc2NpcGxpbmUgZG9lcyBhIHdhaXQgZm9yIGRyYWluIGZvciB0aGVtLgorCQkJKiogQXMgdGhlIHJpbyBkb2Vzbid0IHdhaXQgZm9yIGRyYWluLCB0aGUgd3JpdGUgZmx1c2ggd291bGQKKwkJCSoqIGRlc3Ryb3kgdGhlIFBhc3N3b3JkOiBwcm9tcHQuIFRoaXMgaXNuJ3QgdmVyeSBmcmllbmRseSwgc28KKwkJCSoqIGhlcmUgd2Ugb25seSBpc3N1ZSBhIFdGTFVTSCBjb21tYW5kIGlmIHdlIGFyZSBpbiB0aGUgaW50ZXJydXB0CisJCQkqKiByb3V0aW5lLCBvciB3ZSBhcmVuJ3QgZXhlY3V0aW5nIGEgU0VUKkYgY29tbWFuZC4KKwkJCSovCisJCQlpZiAoIFBvcnRQLT5Ib3N0UC0+SW5JbnRyIHx8ICFQb3J0UC0+Rmx1c2hDbWRCb2RnZSApIHsKKwkJCQkvKgorCQkJCSoqIGZvcm0gYSB3Zmx1c2ggcGFja2V0IC0gMSBieXRlIGxvbmcsIG5vIGRhdGEKKwkJCQkqLworCQkJCWlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIldGTFVTSCBvbiBkZWxldGVkIFJUQVxuIik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlpZiAoIFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIFdGTFVTSCApID09IFJJT19GQUlMICkgeworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9XRkxVU0ggQ29tbWFuZCBmYWlsZWRcbiIpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfV0ZMVVNIIENvbW1hbmRcbiIpOworCQkJCX0KKwkJCQkvKgorCQkJCSoqIFdGTFVTSCBvcGVyYXRpb24gLSBmbHVzaCB0aGUgZGF0YSEKKwkJCQkqLworCQkJCVBvcnRQLT5UeEJ1ZmZlckluID0gUG9ydFAtPlR4QnVmZmVyT3V0ID0gMDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfV0ZMVVNIIENvbW1hbmQgaWdub3JlZFxuIik7CisJCQl9CisJCQkvKgorCQkJKiogc29ydCBvdXQgdGhlIGxpbmUgZGlzY2lwbGluZQorCQkJKi8KKwkJCWlmIChQb3J0UC0+Q29va01vZGUgPT0gQ09PS19XRUxMKQorCQkJCWdvdG8gc3RhcnQ7CisJCQlicmVhazsKKwkKKwkJY2FzZSBUX1JFU1VNRToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfUkVTVU1FXG4iKTsKKwkJCS8qCisJCQkqKiBzZW5kIHByZS1lbXB0aXZlIHJlc3VtZSBwYWNrZXQKKwkJCSovCisJCQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlJFU1VNRSBvbiBkZWxldGVkIFJUQVxuIik7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoIFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIFJFU1VNRSApID09IFJJT19GQUlMICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1JFU1VNRSBDb21tYW5kIGZhaWxlZFxuIik7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSoqIGFuZCByZS1zdGFydCB0aGUgc2VuZGVyIHNvZnR3YXJlIQorCQkJKi8KKwkJCWlmIChQb3J0UC0+Q29va01vZGUgPT0gQ09PS19XRUxMKQorCQkJCWdvdG8gc3RhcnQ7CisJCQlicmVhazsKKwkKKwkJY2FzZSBUX1RJTUU6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1RJTUVcbiIpOworCQkJLyoKKwkJCSoqIFRfVElNRSBpcyBjYWxsZWQgd2hlbiB4RExZIGlzIHNldCBpbiBvZmxhZ3MgYW5kCisJCQkqKiB0aGUgbGluZSBkaXNjaXBsaW5lIHRpbWVvdXQgaGFzIGV4cGlyZWQuIEl0J3MKKwkJCSoqIGZ1bmN0aW9uIGluIGxpZmUgaXMgdG8gY2xlYXIgdGhlIFRJTUVPVVQgZmxhZworCQkJKiogYW5kIHRvIHJlLXN0YXJ0IG91dHB1dCB0byB0aGUgcG9ydC4KKwkJCSovCisJCQkvKgorCQkJKiogRmFsbCB0aHJvdWdoIGFuZCByZS1zdGFydCBvdXRwdXQKKwkJCSovCisJCWNhc2UgVF9PVVRQVVQ6CitzdGFydDoKKwkJCWlmICggUG9ydFAtPk1hZ2ljRmxhZ3MgJiBNQUdJQ19GTFVTSCApIHsKKwkJCQlQb3J0UC0+TWFnaWNGbGFncyB8PSBNT1JFX09VVFBVVF9FWUdPUjsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCVJJT1R4RW5hYmxlKChjaGFyICopUG9ydFApOworCQkJUG9ydFAtPk1hZ2ljRmxhZ3MgJj0gfk1PUkVfT1VUUFVUX0VZR09SOworCQkJLypyaW9fZHByaW50KFJJT19ERUJVR19JTlRSLCBQb3J0UCxEQkdfUFJPQywiVF9PVVRQVVQgZmluaXNoZWRcbiIpOyovCisJCQlicmVhazsKKwkKKwkJY2FzZSBUX1NVU1BFTkQ6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1NVU1BFTkRcbiIpOworCQkJLyoKKwkJCSoqIHNlbmQgYSBzdXNwZW5kIHByZS1lbXB0aXZlIHBhY2tldC4KKwkJCSovCisJCQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlNVU1BFTkQgZGVsZXRlZCBSVEFcbiIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJaWYgKCBSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBTVVNQRU5EICkgPT0gUklPX0ZBSUwgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfU1VTUEVORCBDb21tYW5kIGZhaWxlZFxuIik7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSoqIGRvbmUhCisJCQkqLworCQkJYnJlYWs7CisJCisJCWNhc2UgVF9CTE9DSzoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfQkxPQ0tcbiIpOworCQkJYnJlYWs7CisJCisJCWNhc2UgVF9SRkxVU0g6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1JGTFVTSFxuIik7CisJCQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlJGTFVTSCBvbiBkZWxldGVkIFJUQVxuIik7CisJCQkJUG9ydFAtPlJ4RGF0YVN0YXJ0ID0gMDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlmICggUklPUHJlZW1wdGl2ZUNtZCggcCwgUG9ydFAsIFJGTFVTSCApID09IFJJT19GQUlMICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1JGTFVTSCBDb21tYW5kIGZhaWxlZFxuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlQb3J0UC0+UnhEYXRhU3RhcnQgPSAwOworCQkJCXdoaWxlICggY2FuX3JlbW92ZV9yZWNlaXZlKCZQYWNrZXRQLCBQb3J0UCkgKSB7CisJCQkJCXJlbW92ZV9yZWNlaXZlKFBvcnRQKTsKKwkJCQkJU2hvd1BhY2tldChEQkdfUFJPQywgUGFja2V0UCApOworCQkJCQlwdXRfZnJlZV9lbmQoUG9ydFAtPkhvc3RQLCBQYWNrZXRQICk7CisJCQkJfQorCQkJCWlmICggUG9ydFAtPlBoYlAtPmhhbmRzaGFrZSA9PSBQSEJfSEFORFNIQUtFX1NFVCApIHsKKwkJCQkJLyoKKwkJCQkJKiogTUFHSUMhCisJCQkJCSovCisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlNldCByZWNlaXZlIGhhbmRzaGFrZSBiaXRcbiIpOworCQkJCQlQb3J0UC0+UGhiUC0+aGFuZHNoYWtlIHw9IFBIQl9IQU5EU0hBS0VfUkVTRVQ7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIFRfVU5CTE9DSzoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfVU5CTE9DS1xuIik7CisJCQkvKgorCQkJKiogSWYgdGhlcmUgaXMgYW55IGRhdGEgdG8gcmVjZWl2ZSBzZXQgYSB0aW1lb3V0IHRvIHNlcnZpY2UgaXQuCisJCQkqLworCQkJUklPUmVjZWl2ZShwLCBQb3J0UCk7CisJCQlicmVhazsKKwkKKwkJY2FzZSBUX0JSRUFLOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9CUkVBS1xuIik7CisJCQkvKgorCQkJKiogU2VuZCBhIGJyZWFrIGNvbW1hbmQuIEZvciBTeXMgVgorCQkJKiogdGhpcyBpcyBhIHRpbWVkIGJyZWFrLCBzbyB3ZQorCQkJKiogc2VuZCBhIFNCUkVBS1t0aW1lXSBwYWNrZXQKKwkJCSovCisJCQkvKgorCQkJKiogQnVpbGQgYSBCUkVBSyBjb21tYW5kCisJCQkqLworCQkJaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJCUkVBSyBvbiBkZWxldGVkIFJUQVxuIik7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoUklPU2hvcnRDb21tYW5kKFBvcnRQLFNCUkVBSywyLAorCQkJCQkJCQlwLT5SSU9Db25mLkJyZWFrSW50ZXJ2YWwpPT1SSU9fRkFJTCkgeworCQkJICAgCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJTQlJFQUsgUklPU2hvcnRDb21tYW5kIGZhaWxlZFxuIik7CisJCQkJfQorCQkJfQorCQorCQkJLyoKKwkJCSoqIGRvbmUhCisJCQkqLworCQkJYnJlYWs7CisJCisJCWNhc2UgVF9JTlBVVDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlByb2MgVF9JTlBVVCBjYWxsZWQgLSBJIGRvbid0IGtub3cgd2hhdCB0byBkbyFcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgVF9QQVJNOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUHJvYyBUX1BBUk0gY2FsbGVkIC0gSSBkb24ndCBrbm93IHdoYXQgdG8gZG8hXG4iKTsKKwkJCWJyZWFrOworCQorCQljYXNlIFRfU1dUQ0g6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJQcm9jIFRfU1dUQ0ggY2FsbGVkIC0gSSBkb24ndCBrbm93IHdoYXQgdG8gZG8hXG4iKTsKKwkJCWJyZWFrOworCQorCQlkZWZhdWx0OgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUHJvYyBVTktOT1dOIGNvbW1hbmQgJWRcbiIsY21kKTsKKwl9CisJLyoKKwkqKiBUX09VVFBVVCByZXR1cm5zIHdpdGhvdXQgcGFzc2luZyB0aHJvdWdoIHRoaXMgcG9pbnQhCisJKi8KKwkvKnJpb19kcHJpbnQoUklPX0RFQlVHX0lOVFIsIFBvcnRQLERCR19QUk9DLCJyaW90cHJvYyBkb25lXG4iKTsqLworCXJldHVybigwKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9pb2N0bC5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDY3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2lvY3RsLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHJpb2lvY3RsLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEzCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIyCisqKgorKiogIGlkZW50IEAoIylyaW9pb2N0bC5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9fcmlvaW9jdGxfaF9fCisjZGVmaW5lCV9fcmlvaW9jdGxfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9pb2N0bF9oX3NjY3NfID0gIkAoIylyaW9pb2N0bC5oCTEuMiI7CisjZW5kaWYKKworLyoKKyoqIFJJTyBkZXZpY2UgZHJpdmVyIC0gdXNlciBpb2N0bHMgYW5kIGFzc29jaWF0ZWQgc3RydWN0dXJlcy4KKyovCisKK3N0cnVjdCBwb3J0U3RhdHMgeworCWludAlwb3J0OworCWludAlnYXRoZXI7CisJdWxvbmcJdHhjaGFyczsKKwl1bG9uZwlyeGNoYXJzOworCXVsb25nCW9wZW5zOworCXVsb25nCWNsb3NlczsKKwl1bG9uZwlpb2N0bHM7Cit9OyAKKworCisjZGVmaW5lIHJJT0MJKCdyJzw8OCkKKyNkZWZpbmUJVENSSU9TVEFURQkocklPQyB8IDEpCisjZGVmaW5lCVRDUklPWFBPTgkocklPQyB8IDIpCisjZGVmaW5lCVRDUklPWFBPRkYJKHJJT0MgfCAzKQorI2RlZmluZQlUQ1JJT1hQQ1BTCShySU9DIHwgNCkKKyNkZWZpbmUJVENSSU9YUFJJTlQJKHJJT0MgfCA1KQorI2RlZmluZSBUQ1JJT0lYQU5ZT04JKHJJT0MgfCA2KQorI2RlZmluZQlUQ1JJT0lYQU5ZT0ZGCShySU9DIHwgNykKKyNkZWZpbmUgVENSSU9JWE9OT04JKHJJT0MgfCA4KQorI2RlZmluZQlUQ1JJT0lYT05PRkYJKHJJT0MgfCA5KQorI2RlZmluZQlUQ1JJT01CSVMJKHJJT0MgfCAxMCkKKyNkZWZpbmUJVENSSU9NQklDCShySU9DIHwgMTEpCisjZGVmaW5lCVRDUklPVFJJQUQJKHJJT0MgfCAxMikKKyNkZWZpbmUgVENSSU9UU1RBVEUJKHJJT0MgfCAxMykKKworLyoKKyoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzYxIHBhcnQgZml4CisqKiBBZGQgUklPIGlvY3RscyBmb3IgbWFuaXB1bGF0aW5nIFJUUyBhbmQgQ1RTIGZsb3cgY29udHJvbCwgKGFzIEx5bnhPUworKiogYXBwZWFycyB0byBub3Qgc3VwcG9ydCBoYXJkd2FyZSBmbG93IGNvbnRyb2wpLgorKi8KKyNkZWZpbmUgVENSSU9DVFNGTE9XRU4JKHJJT0MgfCAxNCkJLyogZW5hYmxlIENUUyBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgVENSSU9DVFNGTE9XRElTCShySU9DIHwgMTUpCS8qIGRpc2FibGUgQ1RTIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBUQ1JJT1JUU0ZMT1dFTgkocklPQyB8IDE2KQkvKiBlbmFibGUgUlRTIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBUQ1JJT1JUU0ZMT1dESVMJKHJJT0MgfCAxNykJLyogZGlzYWJsZSBSVFMgZmxvdyBjb250cm9sICovCisKKy8qCisqKiAwOS4xMi4xOTk4IEFSRyAtIEVTSUwgMDc3NiBwYXJ0IGZpeAorKiogRGVmaW5pdGlvbiBmb3IgJ1JJT0MnIGFsc28gYXBwZWFycyBpbiBkYWVtb24uaCwgc28gd2UnZCBiZXR0ZXIgZG8gYQorKiogI2lmbmRlZiBoZXJlIGZpcnN0LgorKiogJ1JJT19RVUlDS19DSEVDSycgYWxzbyAjZGVmaW5lJ2QgaGVyZSBhcyB0aGlzIGlvY3RsIGlzIG5vdworKiogYWxsb3dlZCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4KKyoqCisqKiAwNS4wMi4xOTk5IEFSRyAtCisqKiBUaGlzIGlzIHdoYXQgSSd2ZSBkZWNpZWQgdG8gZG8gd2l0aCBpb2N0bHMgZXRjLiwgd2hpY2ggYXJlIGludGVuZGVkIHRvIGJlCisqKiBpbnZva2VkIGZyb20gdXNlcnMgYXBwbGljYXRpb25zIDoKKyoqIEFueXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgZGVmaW5lZCBoZXJlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGRhZW1vbi5oLCB0aGF0CisqKiB3YXkgaXQgd29uJ3QgZW5kIHVwIGhhdmluZyB0byBiZSBkZWZpbmVkL21haW50YWluZWQgaW4gdHdvIHBsYWNlcy4gVGhlIG9ubHkKKyoqIGNvbnNlcXVlbmNlIG9mIHRoaXMgaXMgdGhhdCB0aGlzIGZpbGUgc2hvdWxkIG5vdyBiZSAjaW5jbHVkZSdkIGJ5IGRhZW1vbi5oCisqKgorKiogJ3N0YXRzJyBpb2N0bHMgbm93ICNkZWZpbmUnZCBoZXJlIGFzIHRoZXkgYXJlIHRvIGJlIHVzZWQgYnkgY3VzdG9tZXJzLgorKi8KKyNkZWZpbmUJUklPQwkoJ1InPDw4KXwoJ2knPDwxNil8KCdvJzw8MjQpCisKKyNkZWZpbmUJUklPX1FVSUNLX0NIRUNLCSAgCShSSU9DIHwgMTA1KQorI2RlZmluZSBSSU9fR0FUSEVSX1BPUlRfU1RBVFMJKFJJT0MgfCAxOTMpCisjZGVmaW5lIFJJT19SRVNFVF9QT1JUX1NUQVRTCShSSU9DIHwgMTk0KQorI2RlZmluZSBSSU9fR0VUX1BPUlRfU1RBVFMJKFJJT0MgfCAxOTUpCisKKyNlbmRpZgkvKiBfX3Jpb2lvY3RsX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9sb2Nrcy5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9sb2Nrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMGNkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2xvY2tzLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvbG9ja3MuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTMKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjIKKyoqCisqKiAgaWRlbnQgQCgjKXJpb2xvY2tzLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYJX19yaW9fcmlvbG9ja3NfaF9fCisjZGVmaW5lCV9fcmlvX3Jpb2xvY2tzX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvbG9ja3NfaF9zY2NzXyA9ICJAKCMpcmlvbG9ja3MuaAkxLjIiOworI2VuZGlmCisKKyNkZWZpbmUgTE9DS0IobGspCQlsb2NrYihsayk7CisjZGVmaW5lIFVOTE9DS0IobGssIG9sZHNwbCkJdW5sb2NrYihsaywgb2xkc3BsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BhcmFtLmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BhcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwOTE2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvcGFyYW0uYwpAQCAtMCwwICsxLDc0NCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvcGFyYW0uYworKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTA6MzM6NDUKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTA6MzM6NTAKKyoqCisqKiAgaWRlbnQgQCgjKXJpb3BhcmFtLmMJMS4zCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9wYXJhbV9jX3NjY3NfID0gIkAoIylyaW9wYXJhbS5jCTEuMyI7CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9nZW5lcmljX3NlcmlhbC5oPgorCisKKyNpbmNsdWRlICJsaW51eF9jb21wYXQuaCIKKyNpbmNsdWRlICJyaW9fbGludXguaCIKKyNpbmNsdWRlICJ0eXBkZWYuaCIKKyNpbmNsdWRlICJwa3QuaCIKKyNpbmNsdWRlICJkYWVtb24uaCIKKyNpbmNsdWRlICJyaW8uaCIKKyNpbmNsdWRlICJyaW9zcGFjZS5oIgorI2luY2x1ZGUgInRvcC5oIgorI2luY2x1ZGUgImNtZHBrdC5oIgorI2luY2x1ZGUgIm1hcC5oIgorI2luY2x1ZGUgInJpb3R5cGVzLmgiCisjaW5jbHVkZSAicnVwLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgInJpb2RydnIuaCIKKyNpbmNsdWRlICJyaW9pbmZvLmgiCisjaW5jbHVkZSAiZnVuYy5oIgorI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgInBjaS5oIgorCisjaW5jbHVkZSAicGFybW1hcC5oIgorI2luY2x1ZGUgInVuaXhydXAuaCIKKyNpbmNsdWRlICJib2FyZC5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgInBoYi5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJjbWRibGsuaCIKKyNpbmNsdWRlICJyb3V0ZS5oIgorI2luY2x1ZGUgImNvbnRyb2wuaCIKKyNpbmNsdWRlICJjaXJydXMuaCIKKyNpbmNsdWRlICJyaW9pb2N0bC5oIgorI2luY2x1ZGUgInBhcmFtLmgiCisjaW5jbHVkZSAibGlzdC5oIgorI2luY2x1ZGUgInNhbS5oIgorCisKKworLyoKKyoqIFRoZSBTY2FtLCBiYXNlZCBvbiBlbWFpbCBmcm9tIGplcmVteXJAYnVncy5zcGVjaWFsaXguY28udWsuLi4uCisqKgorKiogVG8gc2VuZCBhIGNvbW1hbmQgb24gYSBwYXJ0aWN1bGFyIHBvcnQsIHlvdSBwdXQgYSBwYWNrZXQgd2l0aCB0aGUKKyoqIGNvbW1hbmQgYml0IHNldCBvbnRvIHRoZSBwb3J0LiBUaGUgY29tbWFuZCBiaXQgaXMgaW4gdGhlIGxlbiBmaWVsZCwKKyoqIGFuZCBnZXRzIE9SZWQgaW4gd2l0aCB0aGUgYWN0dWFsIGJ5dGUgY291bnQuCisqKgorKiogV2hlbiB5b3Ugc2VuZCBhIHBhY2tldCB3aXRoIHRoZSBjb21tYW5kIGJpdCBzZXQsIHRoZW4gdGhlIGZpcnN0CisqKiBkYXRhIGJ5dGUgKCBkYXRhWzBdICkgaXMgaW50ZXJwcmV0dGVkIGFzIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuCisqKiBJdCBhbHNvIGdvdmVybnMgd2hhdCBkYXRhIHN0cnVjdHVyZSBvdmVybGF5IHNob3VsZCBhY2NvbXBhbnkgdGhlIHBhY2tldC4KKyoqIENvbW1hbmRzIGFyZSBkZWZpbmVkIGluIGNpcnJ1cy9jaXJydXMuaAorKioKKyoqIElmIHlvdSB3YW50IHRoZSBjb21tYW5kIHRvIHByZS1lbXQgZGF0YSBhbHJlYWR5IG9uIHRoZSBxdWV1ZSBmb3IgdGhlCisqKiBwb3J0LCBzZXQgdGhlIHByZS1lbXB0aXZlIGJpdCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBjb21tYW5kIGJpdC4KKyoqIEl0IGlzIG5vdCBkZWZpbmVkIHdoYXQgd2lsbCBoYXBwZW4gaWYgeW91IHNldCB0aGUgcHJlZW1wdGl2ZSBiaXQKKyoqIG9uIGEgcGFja2V0IHRoYXQgaXMgTk9UIGEgY29tbWFuZC4KKyoqCisqKiBQcmUtZW1wdGl2ZSBjb21tYW5kcyBzaG91bGQgYmUgcXVldWVkIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSB1c2luZworKiogYWRkX3N0YXJ0KCksIHdoZXJlYXMgbm9ybWFsIGNvbW1hbmRzIGFuZCBkYXRhIGFyZSBlbnF1ZXVlZCB1c2luZworKiogYWRkX2VuZCgpLgorKioKKyoqIE1vc3QgY29tbWFuZHMgZG8gbm90IHVzZSB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBkYXRhIGFycmF5LiBUaGUKKyoqIGV4Y2VwdGlvbnMgYXJlIE9QRU4gTU9QRU4gYW5kIENPTkZJRy4gKE5CLiBBcyB3aXRoIHRoZSBTSSBDT05GSUcgYW5kCisqKiBPUEVOIGFyZSBjdXJyZW50bHkgYW5hbGFnb3VzKS4gV2l0aCB0aGVzZSB0aHJlZSBjb21tYW5kcyB0aGUgZm9sbG93aW5nCisqKiAxMSBkYXRhIGJ5dGVzIGFyZSBhbGwgdXNlZCB0byBwYXNzIGNvbmZpZyBpbmZvcm1hdGlvbiBzdWNoIGFzIGJhdWQgcmF0ZSBldGMuCisqKiBUaGUgZmllbGRzIGFyZSBhbHNvIGRlZmluZWQgaW4gY2lycnVzLmguIFNvbWUgY29udGFpbiBzdHJhaWdodGZvcndhcmQKKyoqIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHRyYW5zbWl0IFhPTiBjaGFyYWN0ZXIuIFR3byBjb250YWluIHRoZSB0cmFuc21pdCBhbmQKKyoqIHJlY2VpdmUgYmF1ZCByYXRlcyByZXNwZWN0aXZlbHkuIEZvciBtb3N0IGJhdWQgcmF0ZXMgdGhlcmUgaXMgYSBkaXJlY3QKKyoqIG1hcHBpbmcgYmV0d2VlbiB0aGUgcmF0ZXMgZGVmaW5lZCBpbiA8c3lzL3Rlcm1pby5oPiBhbmQgdGhlIGJ5dGUgaW4gdGhlCisqKiBwYWNrZXQuIFRoZXJlIGFyZSBhZGRpdGlvbmFsIChub24gVU5JWC1zdGFuZGFyZCkgcmF0ZXMgZGVmaW5lZCBpbgorKiogL3UvZG9zL3Jpby9jaXJydXMvaC9icmF0ZXMuaC4KKyoqCisqKiBUaGUgcmVzdCBvZiB0aGUgZGF0YSBmaWVsZHMgY29udGFpbiBhcHByb3hpbWF0aW9ucyB0byB0aGUgQ2lycnVzIHJlZ2lzdGVycworKiogdGhhdCBhcmUgdXNlZCB0byBwcm9ncmFtIG51bWJlciBvZiBiaXRzIGV0Yy4gRWFjaCByZWdpc3RlcnMgYml0IGZpZWxkcyBpcworKiogZGVmaW5lZCBpbiBjaXJydXMuaC4KKyoqIAorKiogTkIuIE9ubHkgdXNlIHRob3NlIGJpdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBiZWluZyBkcml2ZXIgc3BlY2lmaWMKKyoqIG9yIGNvbW1vbiB0byB0aGUgUlRBIGFuZCB0aGUgZHJpdmVyLgorKiogCisqKiBBbGwgY29tbWFuZHMgZ29pbmcgZnJvbSBSVEEtPkhvc3Qgd2lsbCBiZSBkZWFsdCB3aXRoIGJ5IHRoZSBIb3N0IGNvZGUgLSB5b3UKKyoqIHdpbGwgbmV2ZXIgc2VlIHRoZW0uIEFzIHdpdGggdGhlIFNJIHRoZXJlIHdpbGwgYmUgdGhyZWUgZmllbGRzIHRvIGxvb2sgb3V0CisqKiBmb3IgaW4gZWFjaCBwaGIgKG5vdCB5ZXQgZGVmaW5lZCAtIG5lZWRzIGRlZmluaW5nIGEucy5hLnApLgorKiogCisqKiBtb2RlbV9zdGF0dXMJLSBjdXJyZW50IHN0YXRlIG9mIGhhbmRzaGFrZSBwaW5zLgorKioKKyoqIHBvcnRfc3RhdHVzCSAtIGN1cnJlbnQgcG9ydCBzdGF0dXMgLSBlcXVpdmFsZW50IHRvIGhpX3N0YXQgZm9yIFNJLCBpbmRpY2F0ZXMKKyoqIGlmIHBvcnQgaXMgSURMRV9PUEVOLCBJRExFX0NMT1NFRCBldGMuCisqKgorKiogYnJlYWtfc3RhdHVzCS0gYml0IFggc2V0IGlmIGJyZWFrIGhhcyBiZWVuIHJlY2VpdmVkLgorKiogCisqKiBIYXBweSBoYWNraW5nLgorKiogCisqLworCisvKiAKKyoqIFJJT1BhcmFtIGlzIHVzZWQgdG8gb3BlbiBvciBjb25maWd1cmUgYSBwb3J0LiBZb3UgcGFzcyBpdCBhIFBvcnRQLAorKiogd2hpY2ggd2lsbCBoYXZlIGEgdHR5IHN0cnVjdCBhdHRhY2hlZCB0byBpdC4gWW91IGFsc28gcGFzcyBhIGNvbW1hbmQsCisqKiBlaXRoZXIgT1BFTiBvciBDT05GSUcuIFRoZSBwb3J0J3Mgc2V0dXAgaXMgdGFrZW4gZnJvbSB0aGUgdF8gZmllbGRzCisqKiBvZiB0aGUgdHR5IHN0cnVjdCBpbnNpZGUgdGhlIFBvcnRQLCBhbmQgdGhlIHBvcnQgaXMgZWl0aGVyIG9wZW5lZAorKiogb3IgcmUtY29uZmlndXJlZC4gWW91IG11c3QgYWxzbyB0ZWxsIFJJT1BhcmFtIGlmIHRoZSBkZXZpY2UgaXMgYSBtb2RlbQorKiogZGV2aWNlIG9yIG5vdCAoaS5lLiB0b3AgYml0IG9mIG1pbm9yIG51bWJlciBzZXQgb3IgY2xlYXIgLSB0YWtlIHNwZWNpYWwKKyoqIGNhcmUgd2hlbiBkZWNpZGluZyBvbiB0aGlzISkuCisqKiBSSU9QYXJhbSBuZWl0aGVyIGZsdXNoZXMgbm9yIHdhaXRzIGZvciBkcmFpbiwgYW5kIGlzIE5PVCBwcmVlbXB0aXZlLgorKioKKyoqIFJJT1BhcmFtIGFzc3VtZXMgaXQgd2lsbCBiZSBjYWxsZWQgYXQgc3BscmlvKCksIGFuZCBhbHNvIGFzc3VtZXMKKyoqIHRoYXQgQ29va01vZGUgaXMgc2V0IGNvcnJlY3RseSBpbiB0aGUgcG9ydCBzdHJ1Y3R1cmUuCisqKgorKiogTkIuIGZvciBNUFgKKyoqCXR0eSBsb2NrIG11c3QgTk9UIGhhdmUgYmVlbiBwcmV2aW91c2x5IGFjcXVpcmVkLgorKi8KK2ludAorUklPUGFyYW0oUG9ydFAsIGNtZCwgTW9kZW0sIFNsZWVwRmxhZykKK3N0cnVjdCBQb3J0ICpQb3J0UDsKK2ludCBjbWQ7CitpbnQgTW9kZW07CitpbnQgU2xlZXBGbGFnOyAKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgdHR5X3N0cnVjdCAqVHR5UDsKKwlpbnQJcmV0dmFsOworCXJlZ2lzdGVyIHN0cnVjdCBwaGJfcGFyYW0gKnBoYl9wYXJhbV9wdHI7CisJUEtUICpQYWNrZXRQOworCWludCByZXM7CisJdWNoYXIgQ29yMT0wLCBDb3IyPTAsIENvcjQ9MCwgQ29yNT0wOworCXVjaGFyIFR4WG9uPTAsIFR4WG9mZj0wLCBSeFhvbj0wLCBSeFhvZmY9MDsKKwl1Y2hhciBMTmV4dD0wLCBUeEJhdWQ9MCwgUnhCYXVkPTA7CisJaW50CQlyZXRyaWVzID0gMHhmZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlciAoKTsKKworCVR0eVAgPSBQb3J0UC0+Z3MudHR5OworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlJJT1BhcmFtOiBQb3J0OiVkIGNtZDolZCBNb2RlbTolZCBTbGVlcEZsYWc6JWQgTWFwcGVkOiAlZCwgdHR5PSVwXG4iLAorCSAgICBQb3J0UC0+UG9ydE51bSwgY21kLCBNb2RlbSwgU2xlZXBGbGFnLCBQb3J0UC0+TWFwcGVkLCBUdHlQKTsKKworCWlmICghVHR5UCkgeworCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkNhbid0IGNhbGwgcmlvcGFyYW0gd2l0aCBudWxsIHR0eS5cbiIpOworCisJICBmdW5jX2V4aXQgKCk7CisKKwkgIHJldHVybiBSSU9fRkFJTDsKKwl9CisJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MgKTsKKworCWlmIChjbWQgPT0gT1BFTikgeworCQkvKgorCQkqKiBJZiB0aGUgcG9ydCBpcyBzZXQgdG8gc3RvcmUgb3IgbG9jayB0aGUgcGFyYW1ldGVycywgYW5kIGl0IGlzCisJCSoqIHBhcmFtZWQgd2l0aCBPUEVOLCB3ZSB3YW50IHRvIHJlc3RvcmUgdGhlIHNhdmVkIHBvcnQgdGVybWlvLCBidXQKKwkJKiogb25seSBpZiBTdG9yZWRUZXJtaW8gaGFzIGJlZW4gc2F2ZWQsIGkuZS4gTk9UIDFzdCBvcGVuIGFmdGVyIHJlYm9vdC4KKwkJKi8KKyNpZiAwCisJCWlmIChQb3J0UC0+Rmlyc3RPcGVuKSB7CisJCQlQb3J0UC0+U3RvcmVkVHR5LmlmbGFnID0gVHR5UC0+dG0uY19pZmxhZzsKKwkJCVBvcnRQLT5TdG9yZWRUdHkub2ZsYWcgPSBUdHlQLT50bS5jX29mbGFnOworCQkJUG9ydFAtPlN0b3JlZFR0eS5jZmxhZyA9IFR0eVAtPnRtLmNfY2ZsYWc7CisJCQlQb3J0UC0+U3RvcmVkVHR5LmxmbGFnID0gVHR5UC0+dG0uY19sZmxhZzsKKwkJCVBvcnRQLT5TdG9yZWRUdHkubGluZSA9IFR0eVAtPnRtLmNfbGluZTsKKwkJCWZvciAoaSA9IDA7IGkgPCBOQ0MgKyA1OyBpKyspCisJCQkJUG9ydFAtPlN0b3JlZFR0eS5jY1tpXSA9IFR0eVAtPnRtLmNfY2NbaV07CisJCQlQb3J0UC0+Rmlyc3RPcGVuID0gMDsKKwkJfQorCQllbHNlIGlmIChQb3J0UC0+U3RvcmUgfHwgUG9ydFAtPkxvY2spIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJPUEVOOiBSZXN0b3Jpbmcgc3RvcmVkL2xvY2tlZCBwYXJhbXNcbiIpOworCQkJVHR5UC0+dG0uY19pZmxhZyA9IFBvcnRQLT5TdG9yZWRUdHkuaWZsYWc7CisJCQlUdHlQLT50bS5jX29mbGFnID0gUG9ydFAtPlN0b3JlZFR0eS5vZmxhZzsKKwkJCVR0eVAtPnRtLmNfY2ZsYWcgPSBQb3J0UC0+U3RvcmVkVHR5LmNmbGFnOworCQkJVHR5UC0+dG0uY19sZmxhZyA9IFBvcnRQLT5TdG9yZWRUdHkubGZsYWc7CisJCQlUdHlQLT50bS5jX2xpbmUgPSBQb3J0UC0+U3RvcmVkVHR5LmxpbmU7CisJCQlmb3IgKGkgPSAwOyBpIDwgTkNDICsgNTsgaSsrKQorCQkJCVR0eVAtPnRtLmNfY2NbaV0gPSBQb3J0UC0+U3RvcmVkVHR5LmNjW2ldOworCQl9CisjZW5kaWYKKwl9CisKKwkvKgorCSoqIHdhaXQgZm9yIHNwYWNlCisJKi8KKwl3aGlsZSAoICEocmVzPWNhbl9hZGRfdHJhbnNtaXQoJlBhY2tldFAsUG9ydFApKSB8fCAKKwkJCShQb3J0UC0+SW5Vc2UgIT0gTk9UX0lOVVNFKSApIHsKKwkJaWYgKHJldHJpZXMgLS0gPD0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCBQb3J0UC0+SW5Vc2UgIT0gTk9UX0lOVVNFICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlBvcnQgSU5fVVNFIGZvciBwcmUtZW1wdGl2ZSBjb21tYW5kXG4iKTsKKwkJfQorCisJCWlmICggIXJlcyApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJQb3J0IGhhcyBubyBzcGFjZSBvbiB0cmFuc21pdCBxdWV1ZVxuIik7CisJCX0KKworCQlpZiAoIFNsZWVwRmxhZyAhPSBPS19UT19TTEVFUCApIHsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCWZ1bmNfZXhpdCgpOworCQkJCisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAid2FpdCBmb3IgY2FuX2FkZF90cmFuc21pdFxuIik7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcmV0dmFsID0gUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMpOworCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoICZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlpZiAocmV0dmFsID09IFJJT19GQUlMKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAid2FpdCBmb3IgY2FuX2FkZF90cmFuc21pdCBicm9rZW4gYnkgc2lnbmFsXG4iKTsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCXBzZXRlcnIoRUlOVFIpOworCQkJZnVuY19leGl0KCk7CisKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJZnVuY19leGl0ICgpOworCisJCQlyZXR1cm4gUklPX1NVQ0NFU1M7CisJCX0KKwl9CisKKwlpZiAoIXJlcykgeworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCWZ1bmNfZXhpdCAoKTsKKworCQlyZXR1cm4gUklPX0ZBSUw7CisJfQorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgImNhbl9hZGRfdHJhbnNtaXQoKSByZXR1cm5zICV4XG4iLHJlcyk7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlBhY2tldCBpcyAweCV4XG4iLChpbnQpIFBhY2tldFApOworCisJcGhiX3BhcmFtX3B0ciA9IChzdHJ1Y3QgcGhiX3BhcmFtICopUGFja2V0UC0+ZGF0YTsKKworCisjaWYgMAorCS8qCisJKiogQ09SIDEKKwkqLworCWlmICggVHR5UC0+dG0uY19pZmxhZyAmIElOUENLICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiUGFyaXR5IGNoZWNraW5nIG9uIGlucHV0IGVuYWJsZWRcbiIpOworCQlDb3IxIHw9IENPUjFfSU5QQ0s7CisJfQorI2VuZGlmCisKKwlzd2l0Y2ggKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgQ1NJWkUgKSB7CisJCWNhc2UgQ1M1OgorCQl7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiNSBiaXQgZGF0YVxuIik7CisJCQlDb3IxIHw9IENPUjFfNUJJVFM7CisJCQlicmVhazsKKwkJfQorCQljYXNlIENTNjoKKwkJeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIjYgYml0IGRhdGFcbiIpOworCQkJQ29yMSB8PSBDT1IxXzZCSVRTOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBDUzc6CisJCXsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICI3IGJpdCBkYXRhXG4iKTsKKwkJCUNvcjEgfD0gQ09SMV83QklUUzsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQ1M4OgorCQl7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiOCBiaXQgZGF0YVxuIik7CisJCQlDb3IxIHw9IENPUjFfOEJJVFM7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggVHR5UC0+dGVybWlvcy0+Y19jZmxhZyAmIENTVE9QQiApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIjIgc3RvcCBiaXRzXG4iKTsKKwkJQ29yMSB8PSBDT1IxXzJTVE9QOworCX0KKwllbHNlIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIjEgc3RvcCBiaXRcbiIpOworCQlDb3IxIHw9IENPUjFfMVNUT1A7CisJfQorCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIHBhcml0eVxuIik7CisJCUNvcjEgfD0gQ09SMV9OT1JNQUw7CisJfQorCWVsc2UgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRGlzYWJsZSBwYXJpdHlcbiIpOworCQlDb3IxIHw9IENPUjFfTk9QOworCX0KKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJPREQgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJPZGQgcGFyaXR5XG4iKTsKKwkJQ29yMSB8PSBDT1IxX09ERDsKKwl9CisJZWxzZSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJFdmVuIHBhcml0eVxuIik7CisJCUNvcjEgfD0gQ09SMV9FVkVOOyAKKwl9CisKKwkvKgorCSoqIENPUiAyCisJKi8KKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJWE9OICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIHN0YXJ0L3N0b3Agb3V0cHV0IGNvbnRyb2xcbiIpOworCQlDb3IyIHw9IENPUjJfSVhPTjsKKwl9CisJZWxzZSB7CisJCWlmICggUG9ydFAtPkNvbmZpZyAmIFJJT19JWE9OICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkZvcmNlIGVuYWJsZSBzdGFydC9zdG9wIG91dHB1dCBjb250cm9sXG4iKTsKKwkJCUNvcjIgfD0gQ09SMl9JWE9OOworCQl9CisJCWVsc2UKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJJWE9OIGhhcyBiZWVuIGRpc2FibGVkLlxuIik7CisJfQorCisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJWEFOWSkgeworCQlpZiAoIFBvcnRQLT5Db25maWcgJiBSSU9fSVhBTlkgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIGFueSBrZXkgdG8gcmVzdGFydCBvdXRwdXRcbiIpOworCQkJQ29yMiB8PSBDT1IyX0lYQU5ZOworCQl9CisJCWVsc2UKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJJWEFOWSBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gc2FuaXR5IHJlYXNvbnMuXG4iKTsKKwl9CisKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJWE9GRiApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBzdGFydC9zdG9wIGlucHV0IGNvbnRyb2wgMlxuIik7CisJCUNvcjIgfD0gQ09SMl9JWE9GRjsKKwl9CisKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkhhbmd1cCBvbiBsYXN0IGNsb3NlXG4iKTsKKwkJQ29yMiB8PSBDT1IyX0hVUENMOworCX0KKworCWlmICggQ19DUlRTQ1RTIChUdHlQKSkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiUnggaGFyZHdhcmUgZmxvdyBjb250cm9sIGVuYWJsZWRcbiIpOworCQlDb3IyIHw9IENPUjJfQ1RTRkxPVzsKKwkJQ29yMiB8PSBDT1IyX1JUU0ZMT1c7CisJfSBlbHNlIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlJ4IGhhcmR3YXJlIGZsb3cgY29udHJvbCBkaXNhYmxlZFxuIik7CisJCUNvcjIgJj0gfkNPUjJfQ1RTRkxPVzsKKwkJQ29yMiAmPSB+Q09SMl9SVFNGTE9XOworCX0KKworCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTG9jYWwgbGluZVxuIik7CisJfQorCWVsc2UgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiUG9zc2libGUgTW9kZW0gbGluZVxuIik7CisJfQorCisJLyoKKwkqKiBDT1IgNCAodGhlcmUgaXMgbm8gQ09SIDMpCisJKi8KKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJR05CUksgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJJZ25vcmUgYnJlYWsgY29uZGl0aW9uXG4iKTsKKwkJQ29yNCB8PSBDT1I0X0lHTkJSSzsKKwl9CisJaWYgKCAhKFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBCUktJTlQpICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiQnJlYWsgZ2VuZXJhdGVzIE5VTEwgY29uZGl0aW9uXG4iKTsKKwkJQ29yNCB8PSBDT1I0X05CUktJTlQ7CisJfSBlbHNlIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkludGVycnVwdCBvbglicmVhayBjb25kaXRpb25cbiIpOworCX0KKworCWlmICggVHR5UC0+dGVybWlvcy0+Y19pZmxhZyAmIElOTENSICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTWFwIG5ld2xpbmUgdG8gY2FycmlhZ2UgcmV0dXJuIG9uIGlucHV0XG4iKTsKKwkJQ29yNCB8PSBDT1I0X0lOTENSOworCX0KKworCWlmICggVHR5UC0+dGVybWlvcy0+Y19pZmxhZyAmIElHTkNSICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiSWdub3JlIGNhcnJpYWdlIHJldHVybiBvbiBpbnB1dFxuIik7CisJCUNvcjQgfD0gQ09SNF9JR05DUjsKKwl9CisKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJQ1JOTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk1hcCBjYXJyaWFnZSByZXR1cm4gdG8gbmV3bGluZSBvbiBpbnB1dFxuIik7CisJCUNvcjQgfD0gQ09SNF9JQ1JOTDsKKwl9CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiSWdub3JlIGNoYXJhY3RlcnMgd2l0aCBwYXJpdHkgZXJyb3JzXG4iKTsKKwkJQ29yNCB8PSBDT1I0X0lHTlBBUjsKKwl9CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgUEFSTVJLICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTWFyayBwYXJpdHkgZXJyb3JzXG4iKTsKKwkJQ29yNCB8PSBDT1I0X1BBUk1SSzsKKwl9CisKKwkvKgorCSoqIFNldCB0aGUgUkFJU0VNT0QgZmxhZyB0byBlbnN1cmUgdGhhdCB0aGUgbW9kZW0gbGluZXMgYXJlIHJhaXNlZAorCSoqIG9uIHJlY2VwdGlvbiBvZiBhIGNvbmZpZyBwYWNrZXQuCisJKiogVGhlIGRvd25sb2FkIGNvZGUgaGFuZGxlcyB0aGUgemVybyBiYXVkIGNvbmRpdGlvbi4KKwkqLworCUNvcjQgfD0gQ09SNF9SQUlTRU1PRDsKKworCS8qCisJKiogQ09SIDUKKwkqLworCisJQ29yNSA9IENPUjVfQ01PRTsKKworCS8qCisJKiogU2V0IHRvIG1vbml0b3IgdGJ1c3kvdHN0b3AgKG9yIG5vdCkuCisJKi8KKworCWlmIChQb3J0UC0+TW9uaXRvclRzdGF0ZSkKKwkJQ29yNSB8PSBDT1I1X1RTVEFURV9PTjsKKwllbHNlCisJCUNvcjUgfD0gQ09SNV9UU1RBVEVfT0ZGOworCisJLyoKKwkqKiBDb3VsZCBzZXQgTE5FIGhlcmUgaWYgeW91IHdhbnRlZCBMTmV4dCBwcm9jZXNzaW5nLiBTVlI0IHdpbGwgdXNlIGl0LgorCSovCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSVNUUklQICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiU3RyaXAgaW5wdXQgY2hhcmFjdGVyc1xuIik7CisJCWlmICghIChQb3J0UC0+U3RhdGUgJiBSSU9fVFJJQURfTU9ERSkpIHsKKwkJCUNvcjUgfD0gQ09SNV9JU1RSSVA7CisJCX0KKwl9CisKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBPTkxDUiApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk1hcCBuZXdsaW5lIHRvIGNhcnJpYWdlLXJldHVybiwgbmV3bGluZSBvbiBvdXRwdXRcbiIpOworCQlpZiAoIFBvcnRQLT5Db29rTW9kZSA9PSBDT09LX01FRElVTSApCisJCQlDb3I1IHw9IENPUjVfT05MQ1I7CisJfQorCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9DUk5MICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTWFwIGNhcnJpYWdlIHJldHVybiB0byBuZXdsaW5lIG9uIG91dHB1dFxuIik7CisJCWlmICggUG9ydFAtPkNvb2tNb2RlID09IENPT0tfTUVESVVNICkKKwkJCUNvcjUgfD0gQ09SNV9PQ1JOTDsKKwl9CisJaWYgKCAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBUQUJETFkpID09IFRBQjMgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJUYWIgZGVsYXkgMyBzZXRcbiIpOworCQlpZiAoIFBvcnRQLT5Db29rTW9kZSA9PSBDT09LX01FRElVTSApCisJCQlDb3I1IHw9IENPUjVfVEFCMzsKKwl9CisKKwkvKgorCSoqIEZsb3cgY29udHJvbCBieXRlcy4KKwkqLworCVR4WG9uID0gVHR5UC0+dGVybWlvcy0+Y19jY1tWU1RBUlRdOworCVR4WG9mZiA9IFR0eVAtPnRlcm1pb3MtPmNfY2NbVlNUT1BdOworCVJ4WG9uID0gVHR5UC0+dGVybWlvcy0+Y19jY1tWU1RBUlRdOworCVJ4WG9mZiA9IFR0eVAtPnRlcm1pb3MtPmNfY2NbVlNUT1BdOworCS8qCisJKiogTE5FWFQgYnl0ZQorCSovCisJTE5leHQgPSAwOworCisJLyoKKwkqKiBCYXVkIHJhdGUgYnl0ZXMKKwkqLworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJNYXBwaW5nIG9mIHJ4L3R4IGJhdWQgJXggKCV4KVxuIiwgCisJCQkJICAgICBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnLCBDQkFVRCk7CisKKwlzd2l0Y2ggKFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgeworI2RlZmluZSBlKGIpIGNhc2UgQiAjIyBiIDogUnhCYXVkID0gVHhCYXVkID0gUklPX0IgIyMgYiA7YnJlYWsKKwkgIGUoNTApO2UoNzUpO2UoMTEwKTtlKDEzNCk7ZSgxNTApO2UoMjAwKTtlKDMwMCk7ZSg2MDApO2UoMTIwMCk7CisJICBlKDE4MDApO2UoMjQwMCk7ZSg0ODAwKTtlKDk2MDApO2UoMTkyMDApO2UoMzg0MDApO2UoNTc2MDApOworCSAgZSgxMTUyMDApOyAvKiBlKDIzMDQwMCk7ZSg0NjA4MDApOyBlKDkyMTYwMCk7ICAqLworCX0KKworCS8qIFhYWCBNSXNzaW5nIGNvbnZlcnNpb24gdGFibGUuIFhYWCAqLworCS8qIAkgKFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBWX0NCQVVEKTsgKi8KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJ0eCBiYXVkIDB4JXgsIHJ4IGJhdWQgMHgleFxuIiwgVHhCYXVkLCBSeEJhdWQpOworCisKKwkvKgorCSoqIExlZnRvdmVycworCSovCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JFQUQgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIHJlY2VpdmVyXG4iKTsKKyNpZmRlZiBSQ1YxRU4KKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBSQ1YxRU4gKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiUkNWMUVOICg/KVxuIik7CisjZW5kaWYKKyNpZmRlZiBYTVQxRU4KKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBYTVQxRU4gKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiWE1UMUVOICg/KVxuIik7CisjZW5kaWYKKyNpZiAwCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgTE9CTEsgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTE9CTEsgLSBKQ0wgb3V0cHV0IGJsb2NrcyB3aGVuIG5vdCBjdXJyZW50XG4iKTsKKyNlbmRpZgorCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIElTSUcgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiSW5wdXQgY2hhcmFjdGVyIHNpZ25hbCBnZW5lcmF0aW5nIGVuYWJsZWRcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIElDQU5PTiApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJDYW5vbmljYWwgaW5wdXQ6IGVyYXNlIGFuZCBraWxsIGVuYWJsZWRcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIFhDQVNFICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkNhbm9uaWNhbCB1cHBlci9sb3dlciBwcmVzZW50YXRpb25cbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIEVDSE8gKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIGlucHV0IGVjaG9cbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIEVDSE9FICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBlY2hvIGVyYXNlXG4iKTsKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBFQ0hPSyApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJFbmFibGUgZWNobyBraWxsXG4iKTsKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBFQ0hPTkwgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIGVjaG8gbmV3bGluZVxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2xmbGFnICYgTk9GTFNIICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkRpc2FibGUgZmx1c2ggYWZ0ZXIgaW50ZXJydXB0IG9yIHF1aXRcbiIpOworI2lmZGVmIFRPU1RPUAorCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIFRPU1RPUCApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJTZW5kIFNJR1RUT1UgZm9yIGJhY2tncm91bmQgb3V0cHV0XG4iKTsKKyNlbmRpZgorI2lmZGVmIFhDTFVERQorCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIFhDTFVERSApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJFeGNsdXNpdmUgdXNlIG9mIHRoaXMgbGluZVxuIik7CisjZW5kaWYKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJVUNMQyApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJNYXAgdXBwZXJjYXNlIHRvIGxvd2VyY2FzZSBvbiBpbnB1dFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgT1BPU1QgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIG91dHB1dCBwb3N0LXByb2Nlc3NpbmdcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9MQ1VDICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk1hcCBsb3dlcmNhc2UgdG8gdXBwZXJjYXNlIG9uIG91dHB1dFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgT05PQ1IgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTm8gY2FycmlhZ2UgcmV0dXJuIG91dHB1dCBhdCBjb2x1bW4gMFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgT05MUkVUICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk5ld2xpbmUgcGVyZm9ybXMgY2FycmlhZ2UgcmV0dXJuIGZ1bmN0aW9uXG4iKTsKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBPRklMTCApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJVc2UgZmlsbCBjaGFyYWN0ZXJzIGZvciBkZWxheVxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgT0ZERUwgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRmlsbCBjaGFyYWN0ZXIgaXMgREVMXG4iKTsKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBOTERMWSApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJOZXdsaW5lIGRlbGF5IHNldFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgQ1JETFkgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiQ2FycmlhZ2UgcmV0dXJuIGRlbGF5IHNldFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgVEFCRExZICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlRhYiBkZWxheSBzZXRcbiIpOworI2lmIDAKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBCU0RMWSApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJCYWNrLXNwYWNlIGRlbGF5IHNldFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgVlRETFkgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiVmVydGljYWwgdGFiIGRlbGF5IHNldFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgRkZETFkgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRm9ybS1mZWVkIGRlbGF5IHNldFxuIik7CisjZW5kaWYKKwkvKgorCSoqIFRoZXNlIHRoaW5ncyBhcmUga2luZCBvZiB1c2VmdWwgaW4gYSBsYXRlciBsaWZlIQorCSovCisJUG9ydFAtPkNvcjJDb3B5ID0gQ29yMjsKKworCWlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKSB7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJZnVuY19leGl0ICgpOworCisJCXJldHVybiBSSU9fRkFJTDsKKwl9CisKKwkvKgorCSoqIEFjdHVhbGx5IHdyaXRlIHRoZSBpbmZvIGludG8gdGhlIHBhY2tldCB0byBiZSBzZW50CisJKi8KKwlXQllURShwaGJfcGFyYW1fcHRyLT5DbWQsCWNtZCk7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+Q29yMSwJIENvcjEpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPkNvcjIsCSBDb3IyKTsKKwlXQllURShwaGJfcGFyYW1fcHRyLT5Db3I0LAkgQ29yNCk7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+Q29yNSwJIENvcjUpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPlR4WG9uLAlUeFhvbik7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+UnhYb24sCVJ4WG9uKTsKKwlXQllURShwaGJfcGFyYW1fcHRyLT5UeFhvZmYsIFR4WG9mZik7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+UnhYb2ZmLCBSeFhvZmYpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPkxOZXh0LAlMTmV4dCk7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+VHhCYXVkLCBUeEJhdWQpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPlJ4QmF1ZCwgUnhCYXVkKTsKKworCS8qCisJKiogU2V0IHRoZSBsZW5ndGgvY29tbWFuZCBmaWVsZAorCSovCisJV0JZVEUoUGFja2V0UC0+bGVuICwgMTIgfCBQS1RfQ01EX0JJVCk7CisKKwkvKgorCSoqIFRoZSBwYWNrZXQgaXMgZm9ybWVkIC0gbm93LCB3aGFjayBpdCBvZmYKKwkqKiB0byBpdHMgZmluYWwgZGVzdGluYXRpb246CisJKi8KKwlhZGRfdHJhbnNtaXQoUG9ydFApOworCS8qCisJKiogQ291bnQgY2hhcmFjdGVycyB0cmFuc21pdHRlZCBmb3IgcG9ydCBzdGF0aXN0aWNzIHJlcG9ydGluZworCSovCisJaWYgKFBvcnRQLT5zdGF0c0dhdGhlcikKKwkJUG9ydFAtPnR4Y2hhcnMgKz0gMTI7CisKKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiYWRkX3RyYW5zbWl0IHJldHVybmVkLlxuIik7CisJLyoKKwkqKiBqb2IgZG9uZS4KKwkqLworCWZ1bmNfZXhpdCAoKTsKKworCXJldHVybiBSSU9fU1VDQ0VTUzsKK30KKworCisvKgorKiogV2UgY2FuIGFkZCBhbm90aGVyIHBhY2tldCB0byBhIHRyYW5zbWl0IHF1ZXVlIGlmIHRoZSBwYWNrZXQgcG9pbnRlciBwb2ludGVkCisqKiB0byBieSB0aGUgVHhBZGQgcG9pbnRlciBoYXMgUEtUX0lOX1VTRSBjbGVhciBpbiBpdHMgYWRkcmVzcy4KKyovCitpbnQKK2Nhbl9hZGRfdHJhbnNtaXQoUGt0UCwgUG9ydFApCitQS1QgKipQa3RQOworc3RydWN0IFBvcnQgKlBvcnRQOyAKK3sKKwlyZWdpc3RlciBQS1QgKnRwOworCisJKlBrdFAgPSB0cCA9IChQS1QgKilSSU9fUFRSKFBvcnRQLT5DYWRkcixSV09SRCgqUG9ydFAtPlR4QWRkKSk7CisKKwlyZXR1cm4gISgodWludCl0cCAmIFBLVF9JTl9VU0UpOworfQorCisvKgorKiogVG8gYWRkIGEgcGFja2V0IHRvIHRoZSBxdWV1ZSwgeW91IHNldCB0aGUgUEtUX0lOX1VTRSBiaXQgaW4gdGhlIGFkZHJlc3MsCisqKiBhbmQgdGhlbiBtb3ZlIHRoZSBUeEFkZCBwb2ludGVyIGFsb25nIG9uZSBwb3NpdGlvbiB0byBwb2ludCB0byB0aGUgbmV4dAorKiogcGFja2V0IHBvaW50ZXIuIFlvdSBtdXN0IHdyYXAgdGhlIHBvaW50ZXIgZnJvbSB0aGUgZW5kIGJhY2sgdG8gdGhlIHN0YXJ0LgorKi8KK3ZvaWQKK2FkZF90cmFuc21pdChQb3J0UCkKK3N0cnVjdCBQb3J0ICpQb3J0UDsgCit7CisgIGlmIChSV09SRCgqUG9ydFAtPlR4QWRkKSAmIFBLVF9JTl9VU0UpIHsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiYWRkX3RyYW5zbWl0OiBQYWNrZXQgaGFzIGJlZW4gc3RvbGVuISIpOworICB9CisJV1dPUkQoICoodXNob3J0ICopUG9ydFAtPlR4QWRkLCBSV09SRCgqUG9ydFAtPlR4QWRkKSB8IFBLVF9JTl9VU0UpOworCVBvcnRQLT5UeEFkZCA9IChQb3J0UC0+VHhBZGQgPT0gUG9ydFAtPlR4RW5kKSA/IFBvcnRQLT5UeFN0YXJ0IDogCisJCQkJCVBvcnRQLT5UeEFkZCArIDE7CisJV1dPUkQoIFBvcnRQLT5QaGJQLT50eF9hZGQgLCBSSU9fT0ZGKFBvcnRQLT5DYWRkcixQb3J0UC0+VHhBZGQpICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQdXQgYSBwYWNrZXQgb250byB0aGUgZW5kIG9mIHRoZQorICogZnJlZSBsaXN0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3B1dF9mcmVlX2VuZChIb3N0UCwgUGt0UCkKK3N0cnVjdCBIb3N0ICpIb3N0UDsKK1BLVCAqUGt0UDsKK3sKKwlGUkVFX0xJU1QgKnRtcF9wb2ludGVyOworCXVzaG9ydCBvbGRfZW5kLCBuZXdfZW5kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJkhvc3RQLT5Ib3N0TG9jaywgZmxhZ3MpOworCisJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKiBQdXQgYSBwYWNrZXQgYmFjayBvbnRvIHRoZSBiYWNrIG9mIHRoZSBmcmVlIGxpc3QKKwkqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19QRkUsICAicHV0X2ZyZWVfZW5kKFBrdFA9JXgpXG4iLChpbnQpUGt0UCk7CisKKwlpZiAoKG9sZF9lbmQ9UldPUkQoSG9zdFAtPlBhcm1NYXBQLT5mcmVlX2xpc3RfZW5kKSkgIT0gVFBOVUxMKSB7CisJCW5ld19lbmQgPSBSSU9fT0ZGKEhvc3RQLT5DYWRkcixQa3RQKTsKKwkJdG1wX3BvaW50ZXIgPSAoRlJFRV9MSVNUICopUklPX1BUUihIb3N0UC0+Q2FkZHIsb2xkX2VuZCk7CisJCVdXT1JEKHRtcF9wb2ludGVyLT5uZXh0ICwgbmV3X2VuZCApOworCQlXV09SRCgoKEZSRUVfTElTVCAqKVBrdFApLT5wcmV2ICwgb2xkX2VuZCk7CisJCVdXT1JEKCgoRlJFRV9MSVNUICopUGt0UCktPm5leHQgLCBUUE5VTEwpOworCQlXV09SRChIb3N0UC0+UGFybU1hcFAtPmZyZWVfbGlzdF9lbmQsIG5ld19lbmQpOworCX0KKwllbHNlIHsJLyogRmlyc3QgcGFja2V0IG9uIHRoZSBmcmVlIGxpc3QgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuISAqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BGRSwgInB1dF9mcmVlX2VuZCgpOiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW5cbiIpOworCQlXV09SRChIb3N0UC0+UGFybU1hcFAtPmZyZWVfbGlzdF9lbmQgLCBSSU9fT0ZGKEhvc3RQLT5DYWRkcixQa3RQKSk7CisJCXRtcF9wb2ludGVyID0gKEZSRUVfTElTVCAqKVBrdFA7CisJCVdXT1JEKHRtcF9wb2ludGVyLT5wcmV2ICwgVFBOVUxMKTsKKwkJV1dPUkQodG1wX3BvaW50ZXItPm5leHQgLCBUUE5VTEwpOworCX0KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkJlZm9yZSB1bmxvY2s6ICVwXG4iLCAmSG9zdFAtPkhvc3RMb2NrKTsKKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSG9zdFAtPkhvc3RMb2NrLCBmbGFncyk7Cit9CisKKy8qCisqKiBjYW5fcmVtb3ZlX3JlY2VpdmUoUGt0UCxQKSByZXR1cm5zIG5vbi16ZXJvIGlmIFBLVF9JTl9VU0UgaXMgc2V0CisqKiBmb3IgdGhlIG5leHQgcGFja2V0IG9uIHRoZSBxdWV1ZS4gSXQgd2lsbCBhbHNvIHNldCBQa3RQIHRvIHBvaW50IHRvIHRoZQorKiogcmVsZXZhbnQgcGFja2V0LCBbaGF2aW5nIGNsZWFyZWQgdGhlIFBLVF9JTl9VU0UgYml0XS4gSWYgUEtUX0lOX1VTRSBpcyBjbGVhciwKKyoqIHRoZW4gY2FuX3JlbW92ZV9yZWNlaXZlKCkgcmV0dXJucyAwLgorKi8KK2ludAorY2FuX3JlbW92ZV9yZWNlaXZlKFBrdFAsIFBvcnRQKQorUEtUICoqUGt0UDsKK3N0cnVjdCBQb3J0ICpQb3J0UDsKK3sKKwlpZiAoIFJXT1JEKCpQb3J0UC0+UnhSZW1vdmUpICYgUEtUX0lOX1VTRSkgeworCQkqUGt0UCA9IChQS1QgKilSSU9fUFRSKFBvcnRQLT5DYWRkciwKKwkJCQkJUldPUkQoKlBvcnRQLT5SeFJlbW92ZSkgJiB+UEtUX0lOX1VTRSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyoqIFRvIHJlbW92ZSBhIHBhY2tldCBmcm9tIHRoZSByZWNlaXZlIHF1ZXVlIHlvdSBjbGVhciBpdHMgUEtUX0lOX1VTRSBiaXQsCisqKiBhbmQgdGhlbiBidW1wIHRoZSBwb2ludGVycy4gT25jZSB0aGUgcG9pbnRlcnMgZ2V0IHRvIHRoZSBlbmQsIHRoZXkgbXVzdAorKiogYmUgd3JhcHBlZCBiYWNrIHRvIHRoZSBzdGFydC4KKyovCit2b2lkCityZW1vdmVfcmVjZWl2ZShQb3J0UCkKK3N0cnVjdCBQb3J0ICpQb3J0UDsgCit7CisJV1dPUkQoICpQb3J0UC0+UnhSZW1vdmUsIFJXT1JEKCpQb3J0UC0+UnhSZW1vdmUpICYgflBLVF9JTl9VU0UgKTsKKwlQb3J0UC0+UnhSZW1vdmUgPSAoUG9ydFAtPlJ4UmVtb3ZlID09IFBvcnRQLT5SeEVuZCkgPyBQb3J0UC0+UnhTdGFydCA6IAorCQkJCQkJCQlQb3J0UC0+UnhSZW1vdmUgKyAxOworCVdXT1JEKCBQb3J0UC0+UGhiUC0+cnhfcmVtb3ZlICwgUklPX09GRihQb3J0UC0+Q2FkZHIsIFBvcnRQLT5SeFJlbW92ZSkgKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvcGNpY29weS5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9wY2ljb3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhOTlhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvcGNpY29weS5jCkBAIC0wLDAgKzEsOCBAQAorCisvKiBZZWFoLiBXZSBoYXZlIGNvcHlyaWdodCBvbiB0aGlzIG9uZS4gU3VyZS4gKi8KKwordm9pZCByaW9fcGNpY29weSggY2hhciAqZnJvbSwgY2hhciAqdG8sIGludCBhbW91bnQpCit7CisgIHdoaWxlICggYW1vdW50LS0gKQorICAgICp0bysrID0gKmZyb20rKzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvcm91dGUuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvcm91dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDZiMzFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9yb3V0ZS5jCkBAIC0wLDAgKzEsMTIzOCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvcm91dGUuYworKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTA6MzM6NDYKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTA6MzM6NTAKKyoqCisqKiAgaWRlbnQgQCgjKXJpb3JvdXRlLmMJMS4zCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvcm91dGVfY19zY2NzXyA9ICJAKCMpcmlvcm91dGUuYwkxLjMiOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKworCisjaW5jbHVkZSAibGludXhfY29tcGF0LmgiCisjaW5jbHVkZSAicmlvX2xpbnV4LmgiCisjaW5jbHVkZSAidHlwZGVmLmgiCisjaW5jbHVkZSAicGt0LmgiCisjaW5jbHVkZSAiZGFlbW9uLmgiCisjaW5jbHVkZSAicmlvLmgiCisjaW5jbHVkZSAicmlvc3BhY2UuaCIKKyNpbmNsdWRlICJ0b3AuaCIKKyNpbmNsdWRlICJjbWRwa3QuaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJyaW90eXBlcy5oIgorI2luY2x1ZGUgInJ1cC5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyaW9kcnZyLmgiCisjaW5jbHVkZSAicmlvaW5mby5oIgorI2luY2x1ZGUgImZ1bmMuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2luY2x1ZGUgInBhcm1tYXAuaCIKKyNpbmNsdWRlICJ1bml4cnVwLmgiCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJwaGIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiY21kYmxrLmgiCisjaW5jbHVkZSAicm91dGUuaCIKKyNpbmNsdWRlICJjb250cm9sLmgiCisjaW5jbHVkZSAiY2lycnVzLmgiCisjaW5jbHVkZSAicmlvaW9jdGwuaCIKKyNpbmNsdWRlICJwYXJhbS5oIgorI2luY2x1ZGUgImxpc3QuaCIKKyNpbmNsdWRlICJzYW0uaCIKKworc3RhdGljIGludCBSSU9DaGVja0lzb2xhdGVkKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgSG9zdCAqLCB1aW50KTsKK3N0YXRpYyBpbnQgUklPSXNvbGF0ZShzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgdWludCk7CitzdGF0aWMgaW50IFJJT0NoZWNrKHN0cnVjdCBIb3N0ICosIHVpbnQpOworc3RhdGljIHZvaWQgUklPQ29uQ29uKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgSG9zdCAqLCB1aW50LCB1aW50LCB1aW50LCB1aW50LCBpbnQpOworCisKKy8qCisqKiBJbmNvbWluZyBvbiB0aGUgUk9VVEVfUlVQCisqKiBJIHdyb3RlIHRoaXMgd2hpbGUgSSB3YXMgdGlyZWQuIEZvcmdpdmUgbWUuCisqLworaW50IFJJT1JvdXRlUnVwKCBzdHJ1Y3QgcmlvX2luZm8gKnAsIHVpbnQgUnVwLCBzdHJ1Y3QgSG9zdCAqSG9zdFAsIFBLVCAqUGFja2V0UCApCit7CisgIHN0cnVjdCBQa3RDbWQgKlBrdENtZFAgPSAoc3RydWN0IFBrdENtZCAqKVBhY2tldFAtPmRhdGE7CisgIHN0cnVjdCBQa3RDbWRfTSAqUGt0UmVwbHlQOworICBzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOworICBzdHJ1Y3QgUG9ydCAqUG9ydFA7CisgIHN0cnVjdCBNYXAgKk1hcFA7CisgIHN0cnVjdCBUb3AgKlRvcFA7CisgIGludCBUaGlzTGluaywgVGhpc0xpbmtNaW4sIFRoaXNMaW5rTWF4OworICBpbnQgcG9ydDsKKyAgaW50IE1vZCwgTW9kMSwgTW9kMjsKKyAgdXNob3J0IFJ0YVR5cGU7CisgIHVpbnQgUnRhVW5pcTsKKyAgdWludCBUaGlzVW5pdCwgVGhpc1VuaXQyOwkvKiAyIGlkcyB0byBhY2NvbW1vZGF0ZSAxNiBwb3J0IFJUQSAqLworICB1aW50IE9sZFVuaXQsIE5ld1VuaXQsIE9sZExpbmssIE5ld0xpbms7CisgIGNoYXIgKk15VHlwZSwgKk15TmFtZTsKKyAgaW50IExpZXM7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBTVEFDSworICAgIFJJT1N0YWNrQ2hlY2soIlJJT1JvdXRlUnVwIik7CisjZW5kaWYKKyNpZmRlZiBDSEVDSworICAgIENoZWNrUGFja2V0UChQYWNrZXRQKTsKKyAgICBDaGVja0hvc3RQKEhvc3RQKTsKKyAgICBDaGVja1J1cChSdXApOworICAgIENoZWNrSG9zdChIb3N0KTsKKyNlbmRpZgorICAvKgorICAqKiBJcyB0aGlzIHVuaXQgdGVsbGluZyB1cyBpdCdzIGN1cnJlbnQgbGluayB0b3BvbG9neT8KKyAgKi8KKyAgaWYgKCBSQllURShQa3RDbWRQLT5Db21tYW5kKSA9PSBST1VURV9UT1BPTE9HWSApCisgIHsKKyAgICBNYXBQID0gSG9zdFAtPk1hcHBpbmc7CisKKyAgICAvKgorICAgICoqIFRoZSBwYWNrZXQgY2FuIGJlIHNlbnQgZWl0aGVyIGJ5IHRoZSBob3N0IG9yIGJ5IGFuIFJUQS4KKyAgICAqKiBJZiBpdCBjb21lcyBmcm9tIHRoZSBob3N0LCB0aGVuIHdlIG5lZWQgdG8gZmlsbCBpbiB0aGUKKyAgICAqKiBUb3BvbG9neSBhcnJheSBpbiB0aGUgaG9zdCBzdHJ1Y3R1cmUuIElmIGl0IGNhbWUgaW4KKyAgICAqKiBmcm9tIGFuIFJUQSB0aGVuIHdlIG5lZWQgdG8gZmlsbCBpbiB0aGUgTWFwcGluZyBzdHJ1Y3R1cmUncworICAgICoqIFRvcG9sb2d5IGFycmF5IGZvciB0aGUgdW5pdC4KKyAgICAqLworICAgIGlmICggUnVwID49ICh1c2hvcnQpTUFYX1JVUCApCisgICAgeworICAgICAgVGhpc1VuaXQgPSBIT1NUX0lEOworICAgICAgVG9wUCA9IEhvc3RQLT5Ub3BvbG9neTsKKyAgICAgIE15VHlwZSA9ICJIb3N0IjsKKyAgICAgIE15TmFtZSA9IEhvc3RQLT5OYW1lOworICAgICAgVGhpc0xpbmtNaW4gPSBUaGlzTGlua01heCA9IFJ1cCAtIE1BWF9SVVA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBUaGlzVW5pdCA9IFJ1cCsxOworICAgICAgVG9wUCA9IEhvc3RQLT5NYXBwaW5nW1J1cF0uVG9wb2xvZ3k7CisgICAgICBNeVR5cGUgPSAiUlRBIjsKKyAgICAgIE15TmFtZSA9IEhvc3RQLT5NYXBwaW5nW1J1cF0uTmFtZTsKKyAgICAgIFRoaXNMaW5rTWluID0gMDsKKyAgICAgIFRoaXNMaW5rTWF4ID0gTElOS1NfUEVSX1VOSVQgLSAxOworICAgIH0KKworICAgIC8qCisgICAgKiogTGllcyB3aWxsIG5vdCBiZSB0b2xlcmF0ZWQuCisgICAgKiogSWYgYW55IHBhaXIgb2YgbGlua3MgY2xhaW0gdG8gYmUgY29ubmVjdGVkIHRvIHRoZSBzYW1lCisgICAgKiogcGxhY2UsIHRoZW4gaWdub3JlIHRoaXMgcGFja2V0IGNvbXBsZXRlbHkuCisgICAgKi8KKyAgICBMaWVzID0gMDsKKyAgICBmb3IgKCBUaGlzTGluaz1UaGlzTGlua01pbiArIDE7IFRoaXNMaW5rIDw9IFRoaXNMaW5rTWF4OyBUaGlzTGluaysrKQorICAgIHsKKyAgICAgIC8qCisgICAgICAqKiBpdCB3b24ndCBsaWUgYWJvdXQgbmV0d29yayBpbnRlcmNvbm5lY3QsIHRvdGFsIGRpc2Nvbm5lY3RzCisgICAgICAqKiBhbmQgbm8tSURzLiAob3IgYXQgbGVhc3QsIGl0IGRvZXNuJ3QgKm1hdHRlciogaWYgaXQgZG9lcykKKyAgICAgICovCisgICAgICBpZiAoIFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbVGhpc0xpbmtdLlVuaXQpID4gKHVzaG9ydClNQVhfUlVQICkKKwkgIGNvbnRpbnVlOworCisgICAgICBmb3IgKCBOZXdMaW5rPVRoaXNMaW5rTWluOyBOZXdMaW5rIDwgVGhpc0xpbms7IE5ld0xpbmsrKyApCisgICAgICB7CisgICAgICAgIGlmICggKFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbVGhpc0xpbmtdLlVuaXQpID09CisgICAgICAgICAgICAgIFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbTmV3TGlua10uVW5pdCkpICYmCisJICAgICAoUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVtUaGlzTGlua10uTGluaykgPT0KKyAgICAgICAgICAgICAgUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVtOZXdMaW5rXS5MaW5rKSkgKQorCXsKKyAgICAgICAgICBMaWVzKys7CisJfQorICAgICAgfQorICAgIH0KKworICAgIGlmICggTGllcyApCisgICAgeworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkxJRVMhIERBTU4gTElFUyEgJWQgTElFUyFcbiIsTGllcyk7CisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiJWQ6JWMgJWQ6JWMgJWQ6JWMgJWQ6JWNcbiIsCisgICAgICAgICAgUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVswXS5Vbml0KSwgCisJICAnQScrUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVswXS5MaW5rKSwKKyAgICAgICAgICBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzFdLlVuaXQpLAorCSAgJ0EnK1JCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbMV0uTGluayksCisgICAgICAgICAgUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVsyXS5Vbml0KSwKKwkgICdBJytSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzJdLkxpbmspLAorICAgICAgICAgIFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbM10uVW5pdCksCisJICAnQScrUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVszXS5MaW5rKSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvKgorICAgICoqIG5vdywgcHJvY2VzcyBlYWNoIGxpbmsuCisgICAgKi8KKyAgICBmb3IgKCBUaGlzTGluaz1UaGlzTGlua01pbjsgVGhpc0xpbmsgPD0gVGhpc0xpbmtNYXg7IFRoaXNMaW5rKyspCisgICAgeworICAgICAgLyoKKyAgICAgICoqIHRoaXMgaXMgd2hhdCBpdCB3YXMgY29ubmVjdGVkIHRvCisgICAgICAqLworICAgICAgT2xkVW5pdCA9IFRvcFBbVGhpc0xpbmtdLlVuaXQ7CisgICAgICBPbGRMaW5rID0gVG9wUFtUaGlzTGlua10uTGluazsKKworICAgICAgLyoKKyAgICAgICoqIHRoaXMgaXMgd2hhdCBpdCBpcyBub3cgY29ubmVjdGVkIHRvCisgICAgICAqLworICAgICAgTmV3VW5pdCA9IFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbVGhpc0xpbmtdLlVuaXQpOworICAgICAgTmV3TGluayA9IFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbVGhpc0xpbmtdLkxpbmspOworCisgICAgICBpZiAoIE9sZFVuaXQgIT0gTmV3VW5pdCB8fCBPbGRMaW5rICE9IE5ld0xpbmsgKQorICAgICAgeworCS8qCisJKiogc29tZXRoaW5nIGhhcyBjaGFuZ2VkIQorCSovCisKKyAgICAgICAgaWYgKCBOZXdVbml0ID4gTUFYX1JVUCAmJgorCSAgICAgTmV3VW5pdCAhPSBST1VURV9ESVNDT05ORUNUICYmCisJICAgICBOZXdVbml0ICE9IFJPVVRFX05PX0lEICYmCisJICAgICBOZXdVbml0ICE9IFJPVVRFX0lOVEVSQ09OTkVDVCApCisJeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiSSBoYXZlIGEgbGluayBmcm9tICVzICVzIHRvIHVuaXQgJWQ6JWQgLSBJIGRvbid0IGxpa2UgaXQuXG4iLAorCQkgIE15VHlwZSwKKwkJICBNeU5hbWUsCisJCSAgTmV3VW5pdCwKKwkJICBOZXdMaW5rKTsKKwl9CisJZWxzZQorCXsKKwkgIC8qCisJICAqKiBwdXQgdGhlIG5ldyB2YWx1ZXMgaW4KKwkgICovCisJICBUb3BQW1RoaXNMaW5rXS5Vbml0ID0gTmV3VW5pdDsKKwkgIFRvcFBbVGhpc0xpbmtdLkxpbmsgPSBOZXdMaW5rOworCisJICBSSU9TZXRDaGFuZ2UocCk7CisKKwkgIGlmICggT2xkVW5pdCA8PSBNQVhfUlVQICkKKwkgIHsKKwkgICAgLyoKKwkgICAgKiogSWYgc29tZXRoaW5nIGhhcyBiZWNvbWUgYnVzdCwgdGhlbiByZS1lbmFibGUgdGhlbSBtZXNzYWdlcworCSAgICAqLworCSAgICBpZiAoISBwLT5SSU9Ob01lc3NhZ2UpCisJCVJJT0NvbkNvbihwLEhvc3RQLFRoaXNVbml0LFRoaXNMaW5rLE9sZFVuaXQsT2xkTGluayxESVNDT05ORUNUKTsKKwkgIH0KKworCSAgaWYgKCAoIE5ld1VuaXQgPD0gTUFYX1JVUCApICYmICFwLT5SSU9Ob01lc3NhZ2UgKQorCSAgICBSSU9Db25Db24ocCxIb3N0UCxUaGlzVW5pdCxUaGlzTGluayxOZXdVbml0LE5ld0xpbmssQ09OTkVDVCk7CisKKwkgIGlmICggTmV3VW5pdCA9PSBST1VURV9OT19JRCApCisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICIlcyAlcyAoJWMpIGlzIGNvbm5lY3RlZCB0byBhbiB1bmNvbmZpZ3VyZWQgdW5pdC5cbiIsCisJCSAgICBNeVR5cGUsTXlOYW1lLCdBJytUaGlzTGluayk7CisKKwkgIGlmICggTmV3VW5pdCA9PSBST1VURV9JTlRFUkNPTk5FQ1QgKQorCSAgeworCSAgICBpZiAoISBwLT5SSU9Ob01lc3NhZ2UpCisJCWNwcmludGYoIiVzICclcycgKCVjKSBpcyBjb25uZWN0ZWQgdG8gYW5vdGhlciBuZXR3b3JrLlxuIiwgTXlUeXBlLE15TmFtZSwnQScrVGhpc0xpbmspOworCSAgfQorCisJICAvKgorCSAgKiogcGVyZm9ybSBhbiB1cGRhdGUgZm9yICd0aGUgb3RoZXIgZW5kJywgc28gdGhhdCB0aGVzZSBtZXNzYWdlcworCSAgKiogb25seSBhcHBlYXJzIG9uY2UuIE9ubHkgZGlzY29ubmVjdCB0aGUgb3RoZXIgZW5kIGlmIGl0IGlzIHBvaW50aW5nCisJICAqKiBhdCB1cyEKKwkgICovCisJICBpZiAoIE9sZFVuaXQgPT0gSE9TVF9JRCApCisJICB7CisJICAgIGlmICggSG9zdFAtPlRvcG9sb2d5W09sZExpbmtdLlVuaXQgPT0gVGhpc1VuaXQgJiYKKwkJIEhvc3RQLT5Ub3BvbG9neVtPbGRMaW5rXS5MaW5rID09IFRoaXNMaW5rICkKKwkgICAgeworCSAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJTRVRUSU5HIEhPU1QgKCVjKSBUTyBESVNDT05ORUNURUQhXG4iLCBPbGRMaW5rKydBJyk7CisJICAgICAgSG9zdFAtPlRvcG9sb2d5W09sZExpbmtdLlVuaXQgPSBST1VURV9ESVNDT05ORUNUOworCSAgICAgIEhvc3RQLT5Ub3BvbG9neVtPbGRMaW5rXS5MaW5rID0gTk9fTElOSzsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiSE9TVCglYykgV0FTIE5PVCBDT05ORUNURUQgVE8gJXMgKCVjKSFcbiIsCisJCSAgICBPbGRMaW5rKydBJyxIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdC0xXS5OYW1lLFRoaXNMaW5rKydBJyk7CisJICAgIH0KKwkgIH0KKwkgIGVsc2UgaWYgKCBPbGRVbml0IDw9IE1BWF9SVVAgKQorCSAgeworCSAgICBpZiAoIEhvc3RQLT5NYXBwaW5nW09sZFVuaXQtMV0uVG9wb2xvZ3lbT2xkTGlua10uVW5pdCA9PSBUaGlzVW5pdCAmJgorCSAgICAgICAgIEhvc3RQLT5NYXBwaW5nW09sZFVuaXQtMV0uVG9wb2xvZ3lbT2xkTGlua10uTGluayA9PSBUaGlzTGluayApCisJICAgIHsKKwkgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiU0VUVElORyBSVEEgJXMgKCVjKSBUTyBESVNDT05ORUNURUQhXG4iLAorCQkJCSAgIEhvc3RQLT5NYXBwaW5nW09sZFVuaXQtMV0uTmFtZSxPbGRMaW5rKydBJyk7CisJICAgICAgSG9zdFAtPk1hcHBpbmdbT2xkVW5pdC0xXS5Ub3BvbG9neVtPbGRMaW5rXS5Vbml0PVJPVVRFX0RJU0NPTk5FQ1Q7CisJICAgICAgSG9zdFAtPk1hcHBpbmdbT2xkVW5pdC0xXS5Ub3BvbG9neVtPbGRMaW5rXS5MaW5rPU5PX0xJTks7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJUQSAlcyAoJWMpIFdBUyBOT1QgQ09OTkVDVEVEIFRPICVzICglYylcbiIsCisJCQkgICAgSG9zdFAtPk1hcHBpbmdbT2xkVW5pdC0xXS5OYW1lLE9sZExpbmsrJ0EnLAorCQkJICAgIEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0LTFdLk5hbWUsVGhpc0xpbmsrJ0EnKTsKKwkgICAgfQorCSAgfQorCSAgaWYgKCBOZXdVbml0ID09IEhPU1RfSUQgKQorCSAgeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiTUFSS0lORyBIT1NUICglYykgQ09OTkVDVEVEIFRPICVzICglYylcbiIsCisJCQkJTmV3TGluaysnQScsTXlOYW1lLFRoaXNMaW5rKydBJyk7CisJICAgIEhvc3RQLT5Ub3BvbG9neVtOZXdMaW5rXS5Vbml0ID0gVGhpc1VuaXQ7CisJICAgIEhvc3RQLT5Ub3BvbG9neVtOZXdMaW5rXS5MaW5rID0gVGhpc0xpbms7CisJICB9CisJICBlbHNlIGlmICggTmV3VW5pdCA8PSBNQVhfUlVQICkKKwkgIHsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIk1BUktJTkcgUlRBICVzICglYykgQ09OTkVDVEVEIFRPICVzICglYylcbiIsCisJICAgICAgSG9zdFAtPk1hcHBpbmdbTmV3VW5pdC0xXS5OYW1lLE5ld0xpbmsrJ0EnLE15TmFtZSxUaGlzTGluaysnQScpOworCSAgICBIb3N0UC0+TWFwcGluZ1tOZXdVbml0LTFdLlRvcG9sb2d5W05ld0xpbmtdLlVuaXQ9VGhpc1VuaXQ7CisJICAgIEhvc3RQLT5NYXBwaW5nW05ld1VuaXQtMV0uVG9wb2xvZ3lbTmV3TGlua10uTGluaz1UaGlzTGluazsKKwkgIH0KKwl9CisJUklPU2V0Q2hhbmdlKHApOworCVJJT0NoZWNrSXNvbGF0ZWQocCwgSG9zdFAsIE9sZFVuaXQgKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICAvKgorICAqKiBUaGUgb25seSBvdGhlciBjb21tYW5kIHdlIHJlY29nbmlzZSBpcyBhIHJvdXRlX3JlcXVlc3QgY29tbWFuZAorICAqLworICBpZiAoIFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpICE9IFJPVVRFX1JFUVVFU1QgKQorICB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlVua25vd24gY29tbWFuZCAlZCByZWNlaXZlZCBvbiBydXAgJWQgaG9zdCAlZCBST1VURV9SVVBcbiIsIAorCSAgIFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpLFJ1cCwoaW50KUhvc3RQKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICAgICAgCisgIFJ0YVVuaXEgPSAoUkJZVEUoUGt0Q21kUC0+VW5pcU51bVswXSkpICsKKwkgICAgKFJCWVRFKFBrdENtZFAtPlVuaXFOdW1bMV0pIDw8IDgpICsKKwkgICAgKFJCWVRFKFBrdENtZFAtPlVuaXFOdW1bMl0pIDw8IDE2KSArCisJICAgIChSQllURShQa3RDbWRQLT5VbmlxTnVtWzNdKSA8PCAyNCk7CisKKyAgLyoKKyAgKiogRGV0ZXJtaW5lIGlmIDggb3IgMTYgcG9ydCBSVEEKKyAgKi8KKyAgUnRhVHlwZSA9IEdldFVuaXRUeXBlKFJ0YVVuaXEpOworCisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSZWNlaXZlZCBhIHJlcXVlc3QgZm9yIGFuIElEIGZvciBzZXJpYWwgbnVtYmVyICV4XG4iLCBSdGFVbmlxKTsKKworICBNb2QgPSBSQllURShQa3RDbWRQLT5Nb2R1bGVUeXBlcyk7CisgIE1vZDEgPSBMT05ZQkxFKE1vZCk7CisgIGlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisgIHsKKyAgICAvKgorICAgICoqIE9ubHkgb25lIGlkZW50IGlzIHNldCBmb3IgYSAxNiBwb3J0IFJUQS4gVG8gbWFrZSBjb21wYXRpYmxlCisgICAgKiogd2l0aCA4IHBvcnQsIHNldCAybmQgaWRlbnQgaW4gTW9kMiB0byB0aGUgc2FtZSBhcyBNb2QxLgorICAgICovCisgICAgTW9kMiA9IE1vZDE7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkJhY2twbGFuZSB0eXBlIGlzICVzIChhbGwgcG9ydHMpXG4iLAorICAgICBwLT5SSU9Nb2R1bGVUeXBlc1tNb2QxXS5OYW1lKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBNb2QyID0gSElOWUJMRShNb2QpOworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJNb2R1bGUgdHlwZXMgYXJlICVzIChwb3J0cyAwLTMpIGFuZCAlcyAocG9ydHMgNC03KVxuIiwKKyAgICAgcC0+UklPTW9kdWxlVHlwZXNbTW9kMV0uTmFtZSwgcC0+UklPTW9kdWxlVHlwZXNbTW9kMl0uTmFtZSk7CisgIH0KKworICBpZiAoIFJ0YVVuaXEgPT0gMHhmZmZmZmZmZiApCisgIHsKKyAgICAgIFNob3dQYWNrZXQoIERCR19TUEVDSUFMLCBQYWNrZXRQICk7CisgIH0KKworICAvKgorICAqKiB0cnkgdG8gdW5ob29rIGEgY29tbWFuZCBibG9jayBmcm9tIHRoZSBjb21tYW5kIGZyZWUgbGlzdC4KKyAgKi8KKyAgaWYgKCAhKENtZEJsa1AgPSBSSU9HZXRDbWRCbGsoKSkgKQorICB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIk5vIGNvbW1hbmQgYmxvY2tzIHRvIHJvdXRlIFJUQSEgY29tZSBiYWNrIGxhdGVyLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKgorICAqKiBGaWxsIGluIHRoZSBkZWZhdWx0IGluZm8gb24gdGhlIGNvbW1hbmQgYmxvY2sKKyAgKi8KKyAgQ21kQmxrUC0+UGFja2V0LmRlc3RfdW5pdCA9IFJ1cDsKKyAgQ21kQmxrUC0+UGFja2V0LmRlc3RfcG9ydCA9IFJPVVRFX1JVUDsKKyAgQ21kQmxrUC0+UGFja2V0LnNyY191bml0ID0gSE9TVF9JRDsKKyAgQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ID0gUk9VVEVfUlVQOworICBDbWRCbGtQLT5QYWNrZXQubGVuID0gUEtUX0NNRF9CSVQgfCAxOworICBDbWRCbGtQLT5QcmVGdW5jUCA9IENtZEJsa1AtPlBvc3RGdW5jUCA9IE5VTEw7CisgIFBrdFJlcGx5UCA9IChzdHJ1Y3QgUGt0Q21kX00gKilDbWRCbGtQLT5QYWNrZXQuZGF0YTsKKworICBpZiAoISBSSU9Cb290T2socCwgSG9zdFAsIFJ0YVVuaXEpKQorICB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJUQSAleCB0cmllZCB0byBnZXQgYW4gSUQsIGJ1dCBkb2VzIG5vdCBiZWxvbmcgLSBGT0FEIGl0IVxuIiwKKwkgIFJ0YVVuaXEpOworICAgIFBrdFJlcGx5UC0+Q29tbWFuZCA9IFJPVVRFX0ZPQUQ7CisgICAgSG9zdFAtPkNvcHkoIlJUX0ZPQUQiLCBQa3RSZXBseVAtPkNvbW1hbmRUZXh0LCA3KTsKKyAgICBSSU9RdWV1ZUNtZEJsayhIb3N0UCwgUnVwLCBDbWRCbGtQKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qCisgICoqIENoZWNrIHRvIHNlZSBpZiB0aGUgUlRBIGlzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgaG9zdAorICAqLworICBmb3IgKCBUaGlzVW5pdD0wOyBUaGlzVW5pdDxNQVhfUlVQOyBUaGlzVW5pdCsrICkKKyAgeworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJFbnRyeSAlZCBGbGFncz0lcyAlcyBVbmlxdWVOdW09MHgleFxuIiwKKwkJCVRoaXNVbml0LAorCQkJSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgU0xPVF9JTl9VU0UgPworCQkJCQkgICAgIlNsb3QtSW4tVXNlIjoiTm90IEluIFVzZSIsCisJCQlIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgJiBTTE9UX1RFTlRBVElWRSA/IAorCQkJCQkgICAgIlNsb3QtVGVudGF0aXZlIjoiTm90IFRlbnRhdGl2ZSIsCisJCQlIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uUnRhVW5pcXVlTnVtKTsKKworICAgIC8qCisgICAgKiogV2UgaGF2ZSBhbiBlbnRyeSBmb3IgaXQuCisgICAgKi8KKyAgICBpZiAoIChIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgJiAoU0xPVF9JTl9VU0UgfCBTTE9UX1RFTlRBVElWRSkpICYmCisgICAgICAgICAoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLlJ0YVVuaXF1ZU51bSA9PSBSdGFVbmlxKSApCisgICAgeworICAgICAgaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKyAgICAgIHsKKwkgIFRoaXNVbml0MiA9IEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5JRDIgLSAxOworICAgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJGb3VuZCB1bml0IDB4JXggYXQgc2xvdHMgJWQrJWRcbiIsCisJCQkJCSAgICBSdGFVbmlxLFRoaXNVbml0LFRoaXNVbml0Mik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkZvdW5kIHVuaXQgMHgleCBhdCBzbG90ICVkXG4iLAorCQkJCQkgICAgUnRhVW5pcSxUaGlzVW5pdCk7CisgICAgICAvKgorICAgICAgKiogSWYgd2UgaGF2ZSBubyBrbm93bGVkZ2Ugb2YgYm9vdGluZyBpdCwgdGhlbiB0aGUgaG9zdCBoYXMKKyAgICAgICoqIGJlZW4gcmUtYm9vdGVkLCBhbmQgc28gd2UgbXVzdCBraWxsIHRoZSBSVEEsIHNvIHRoYXQgaXQKKyAgICAgICoqIHdpbGwgYmUgYm9vdGVkIGFnYWluIChwb3RlbnRpYWxseSB3aXRoIG5ldyBiaW5zKQorICAgICAgKiogYW5kIGl0IHdpbGwgdGhlbiByZS1hc2sgZm9yIGFuIElELCB3aGljaCB3ZSB3aWxsIHNlcnZpY2UuCisgICAgICAqLworICAgICAgaWYgKCAoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgU0xPVF9JTl9VU0UpICYmIAorCSAgIShIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgJiBSVEFfQk9PVEVEKSApCisgICAgICB7CisJaWYgKCAhKEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyAmIE1TR19ET05FKSApCisJeworCSAgICBpZiAoICFwLT5SSU9Ob01lc3NhZ2UgKQorCSAgICAgICAgY3ByaW50ZigiUlRBICclcycgaXMgYmVpbmcgdXBkYXRlZC5cbiIsSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLk5hbWUpOworCSAgICBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgfD0gTVNHX0RPTkU7CisJfQorCVBrdFJlcGx5UC0+Q29tbWFuZCA9IFJPVVRFX0ZPQUQ7CisJSG9zdFAtPkNvcHkoIlJUX0ZPQUQiLFBrdFJlcGx5UC0+Q29tbWFuZFRleHQsNyk7CisJUklPUXVldWVDbWRCbGsoSG9zdFAsIFJ1cCwgQ21kQmxrUCk7CisJcmV0dXJuIFRSVUU7CisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAqKiBTZW5kIHRoZSBJRCAoZW50cnkpIHRvIHRoaXMgUlRBLiBUaGUgSUQgbnVtYmVyIGlzIGltcGxpY2l0IGFzCisgICAgICAqKiB0aGUgb2Zmc2V0IGludG8gdGhlIHRhYmxlLiBJdCBpcyB3b3J0aCBub3RpbmcgYXQgdGhpcyBzdGFnZQorICAgICAgKiogdGhhdCBvZmZzZXQgemVybyBpbiB0aGUgdGFibGUgY29udGFpbnMgdGhlIGVudHJpZXMgZm9yIHRoZQorICAgICAgKiogUlRBIHdpdGggSUQgMSEhISEKKyAgICAgICovCisgICAgICBQa3RSZXBseVAtPkNvbW1hbmQgPSBST1VURV9BTExPQ0FURTsKKyAgICAgIFBrdFJlcGx5UC0+SUROdW0gICA9IFRoaXNVbml0KzE7CisgICAgICBpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQorICAgICAgeworICAgICAgICBpZiAoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgU0xPVF9JTl9VU0UpCisJICAgIC8qCisJICAgICoqIEFkanVzdCB0aGUgcGhiIGFuZCB0eCBwa3QgZGVzdF91bml0cyBmb3IgMm5kIGJsb2NrIG9mIDgKKwkgICAgKiogb25seSBpZiB0aGUgUlRBIGhhcyBwb3J0cyBhc3NvY2lhdGVkIChTTE9UX0lOX1VTRSkKKwkgICAgKi8KKwkgICAgUklPRml4UGhicyhwLCBIb3N0UCwgVGhpc1VuaXQyKTsKKwkgICAgUGt0UmVwbHlQLT5JRE51bTIgID0gVGhpc1VuaXQyKzE7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSVEEgJyVzJyBoYXMgYmVlbiBhbGxvY2F0ZWQgSURzICVkKyVkXG4iLAorCSAgICAgICAgICBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uTmFtZSwgUGt0UmVwbHlQLT5JRE51bSwgUGt0UmVwbHlQLT5JRE51bTIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCSAgICBQa3RSZXBseVAtPklETnVtMiA9IFJPVVRFX05PX0lEOworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUlRBICclcycgaGFzIGJlZW4gYWxsb2NhdGVkIElEICVkXG4iLAorCSAgICAgICAgICBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uTmFtZSxQa3RSZXBseVAtPklETnVtKTsKKyAgICAgIH0KKyAgICAgIEhvc3RQLT5Db3B5KCJSVF9BTExPQ0FUIixQa3RSZXBseVAtPkNvbW1hbmRUZXh0LDEwKTsKKworICAgICAgUklPUXVldWVDbWRCbGsoIEhvc3RQLCBSdXAsIENtZEJsa1ApOworCisgICAgICAvKgorICAgICAgKiogSWYgdGhpcyBpcyBhIGZyZXNobHkgYm9vdGVkIFJUQSwgdGhlbiB3ZSBuZWVkIHRvIHJlLW9wZW4KKyAgICAgICoqIHRoZSBwb3J0cywgaWYgYW55IHdoZXJlIG9wZW4sIHNvIHRoYXQgZGF0YSBtYXkgb25jZSBtb3JlCisgICAgICAqKiBmbG93IGFyb3VuZCB0aGUgc3lzdGVtIQorICAgICAgKi8KKyAgICAgIGlmICggKEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyAmIFJUQV9ORVdCT09UKSAmJgorCSAgIChIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uU3lzUG9ydCAhPSBOT19QT1JUKSApCisgICAgICB7CisJLyoKKwkqKiBsb29rIGF0IHRoZSBwb3J0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBiZWFzdCBhbmQKKwkqKiBzZWUgaWYgYW55IHdoZXJlIG9wZW4uIElmIHRoZXkgd2FzLCB0aGVuIHJlLW9wZW4KKwkqKiB0aGVtLCB1c2luZyB0aGUgaW5mbyBmcm9tIHRoZSB0dHkgZmxhZ3MuCisJKi8KKwlmb3IgKCBwb3J0PTA7IHBvcnQ8UE9SVFNfUEVSX1JUQTsgcG9ydCsrICkKKwl7CisJICBQb3J0UCA9IHAtPlJJT1BvcnRwW3BvcnQrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLlN5c1BvcnRdOworCSAgaWYgKCBQb3J0UC0+U3RhdGUgJiAoUklPX01PUEVOfFJJT19MT1BFTikgKQorCSAgeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUmUtb3BlbmVkIHRoaXMgcG9ydFxuIik7CisJICAgIHJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkgICAgUG9ydFAtPk1hZ2ljRmxhZ3MgfD0gTUFHSUNfUkVCT09UOworCSAgICByaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkgIH0KKwl9CisJaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKwl7CisJICBmb3IgKCBwb3J0PTA7IHBvcnQ8UE9SVFNfUEVSX1JUQTsgcG9ydCsrICkKKwkgIHsKKwkgICAgUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0K0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0Ml0uU3lzUG9ydF07CisJICAgIGlmICggUG9ydFAtPlN0YXRlICYgKFJJT19NT1BFTnxSSU9fTE9QRU4pICkKKwkgICAgeworCSAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSZS1vcGVuZWQgdGhpcyBwb3J0XG4iKTsKKwkgICAgICByaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJICAgICAgUG9ydFAtPk1hZ2ljRmxhZ3MgfD0gTUFHSUNfUkVCT09UOworCSAgICAgIHJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCSAgICB9CisJICB9CisJfQorICAgICAgfQorCisgICAgICAvKgorICAgICAgKioga2VlcCBhIGNvcHkgb2YgdGhlIG1vZHVsZSB0eXBlcyEKKyAgICAgICovCisgICAgICBIb3N0UC0+VW5peFJ1cHNbVGhpc1VuaXRdLk1vZFR5cGVzID0gTW9kOworICAgICAgaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKwkgICAgICBIb3N0UC0+VW5peFJ1cHNbVGhpc1VuaXQyXS5Nb2RUeXBlcyA9IE1vZDsKKworICAgICAgLyoKKyAgICAgICoqIElmIGVpdGhlciBvZiB0aGUgbW9kdWxlcyBvbiB0aGlzIHVuaXQgaXMgcmVhZC1vbmx5IG9yIHdyaXRlLW9ubHkKKyAgICAgICoqIG9yIG5vbmUteHByaW50LCB0aGVuIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhhdCBpbmZvIG92ZXIgdG8gdGhlCisgICAgICAqKiByZWxldmFudCBwb3J0cy4KKyAgICAgICovCisgICAgICBpZiAoIEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5TeXNQb3J0ICE9IE5PX1BPUlQgKQorICAgICAgeworICAgICAgICBmb3IgKCBwb3J0PTA7IHBvcnQ8UE9SVFNfUEVSX01PRFVMRTsgcG9ydCsrICkKKwl7CisJICBwLT5SSU9Qb3J0cFtwb3J0K0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5TeXNQb3J0XS0+Q29uZmlnICY9IH5SSU9fTk9NQVNLOworCSAgcC0+UklPUG9ydHBbcG9ydCtIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uU3lzUG9ydF0tPkNvbmZpZyB8PQorCSAgIHAtPlJJT01vZHVsZVR5cGVzW01vZDFdLkZsYWdzW3BvcnRdOworCSAgcC0+UklPUG9ydHBbcG9ydCtQT1JUU19QRVJfTU9EVUxFK0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5TeXNQb3J0XS0+Q29uZmlnICY9IH5SSU9fTk9NQVNLOworCSAgcC0+UklPUG9ydHBbcG9ydCtQT1JUU19QRVJfTU9EVUxFK0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5TeXNQb3J0XS0+Q29uZmlnIHw9IHAtPlJJT01vZHVsZVR5cGVzW01vZDJdLkZsYWdzW3BvcnRdOworCX0KKwlpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQorCXsKKyAgICAgICAgICBmb3IgKCBwb3J0PTA7IHBvcnQ8UE9SVFNfUEVSX01PRFVMRTsgcG9ydCsrICkKKwkgIHsKKwkgICAgcC0+UklPUG9ydHBbcG9ydCtIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdDJdLlN5c1BvcnRdLT5Db25maWcgJj0gflJJT19OT01BU0s7CisJICAgIHAtPlJJT1BvcnRwW3BvcnQrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXQyXS5TeXNQb3J0XS0+Q29uZmlnIHw9IHAtPlJJT01vZHVsZVR5cGVzW01vZDFdLkZsYWdzW3BvcnRdOworCSAgICBwLT5SSU9Qb3J0cFtwb3J0K1BPUlRTX1BFUl9NT0RVTEUrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXQyXS5TeXNQb3J0XS0+Q29uZmlnICY9IH5SSU9fTk9NQVNLOworCSAgICBwLT5SSU9Qb3J0cFtwb3J0K1BPUlRTX1BFUl9NT0RVTEUrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXQyXS5TeXNQb3J0XS0+Q29uZmlnIHw9IHAtPlJJT01vZHVsZVR5cGVzW01vZDJdLkZsYWdzW3BvcnRdOworICAgICAgICAgIH0KKwl9CisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAqKiBKb2IgZG9uZSwgZ2V0IG9uIHdpdGggdGhlIGludGVycnVwdHMhCisgICAgICAqLworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIC8qCisgICoqIFRoZXJlIGlzIG5vIHRhYmxlIGVudHJ5IGZvciB0aGlzIFJUQSBhdCBhbGwuCisgICoqCisgICoqIExldHMgY2hlY2sgdG8gc2VlIGlmIHdlIGFjdHVhbGx5IGJvb3RlZCB0aGlzIHVuaXQgLSBpZiBub3QsCisgICoqIHRoZW4gd2UgcmVzZXQgaXQgYW5kIGl0IHdpbGwgZ28gcm91bmQgdGhlIGxvb3Agb2YgYmVpbmcgYm9vdGVkCisgICoqIHdlIGNhbiB0aGVuIHdvcnJ5IGFib3V0IHRyeWluZyB0byBmaXQgaXQgaW50byB0aGUgdGFibGUuCisgICovCisgIGZvciAoIFRoaXNVbml0PTA7IFRoaXNVbml0PEhvc3RQLT5OdW1FeHRyYUJvb3RlZDsgVGhpc1VuaXQrKyApCisgICAgaWYgKCBIb3N0UC0+RXh0cmFVbml0c1tUaGlzVW5pdF0gPT0gUnRhVW5pcSApCisgICAgICBicmVhazsKKyAgaWYgKCBUaGlzVW5pdCA9PSBIb3N0UC0+TnVtRXh0cmFCb290ZWQgJiYgVGhpc1VuaXQgIT0gTUFYX0VYVFJBX1VOSVRTICkKKyAgeworICAgIC8qCisgICAgKiogaWYgdGhlIHVuaXQgd2Fzbid0IGluIHRoZSB0YWJsZSwgYW5kIHRoZSB0YWJsZSB3YXNuJ3QgZnVsbCwgdGhlbgorICAgICoqIHdlIHJlc2V0IHRoZSB1bml0LCBiZWNhdXNlIHdlIGRpZG4ndCBib290IGl0LgorICAgICoqIEhvd2V2ZXIsIGlmIHRoZSB0YWJsZSBpcyBmdWxsLCBpdCBjb3VsZCBiZSB0aGF0IHdlIGRpZCBib290CisgICAgKiogdGhpcyB1bml0LCBhbmQgc28gd2Ugd29uJ3QgcmVib290IGl0LCBiZWNhdXNlIGl0IGlzbid0IHJlYWxseQorICAgICoqIGFsbCB0aGF0IGRpc2FzdGVyb3VzIHRvIGtlZXAgdGhlIG9sZCBiaW5zIGluIG1vc3QgY2FzZXMuIFRoaXMKKyAgICAqKiBpcyBhIHJhdGhlciB0YWNreSBmZWF0dXJlLCBidXQgd2UgYXJlIG9uIHRoZSBlZGdlIG9mIHJlYWxsaXR5CisgICAgKiogaGVyZSwgYmVjYXVzZSB0aGUgaW1wbGljYXRpb24gaXMgdGhhdCBzb21lb25lIGhhcyBjb25uZWN0ZWQKKyAgICAqKiAxNitNQVhfRVhUUkFfVU5JVFMgb250byBvbmUgaG9zdC4KKyAgICAqLworICAgIHN0YXRpYyBpbnQgVW5rbm93bk1lc2dEb25lID0gMDsKKworICAgIGlmICggIVVua25vd25NZXNnRG9uZSApCisgICAgeworCWlmICghIHAtPlJJT05vTWVzc2FnZSkKKwkgICAgY3ByaW50ZigiT25lIG9yIG1vcmUgdW5rbm93biBSVEFzIGFyZSBiZWluZyB1cGRhdGVkLlxuIik7CisJVW5rbm93bk1lc2dEb25lID0gMTsKKyAgICB9CisKKyAgICBQa3RSZXBseVAtPkNvbW1hbmQgPSBST1VURV9GT0FEOworICAgIEhvc3RQLT5Db3B5KCJSVF9GT0FEIixQa3RSZXBseVAtPkNvbW1hbmRUZXh0LDcpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qCisgICAgKiogd2UgZGlkIGJvb3QgaXQgKGFzIGFuIGV4dHJhKSwgYW5kIHRoZXJlIG1heSBub3cgYmUgYSB0YWJsZQorICAgICoqIHNsb3QgZnJlZSAoYmVjYXVzZSBvZiBhIGRlbGV0ZSksIHNvIHdlIHdpbGwgdHJ5IHRvIG1ha2UKKyAgICAqKiBhIHRlbnRhdGl2ZSBlbnRyeSBmb3IgaXQsIHNvIHRoYXQgdGhlIGNvbmZpZ3VyYXRvciBjYW4gc2VlIGl0CisgICAgKiogYW5kIGZpbGwgaW4gdGhlIGRldGFpbHMgZm9yIHVzLgorICAgICovCisgICAgaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKyAgICB7CisJaWYgKFJJT0ZpbmRGcmVlSUQocCwgSG9zdFAsICZUaGlzVW5pdCwgJlRoaXNVbml0MikgPT0gMCkKKwl7CisJICAgIFJJT0RlZmF1bHROYW1lKHAsIEhvc3RQLCBUaGlzVW5pdCk7CisJICAgIEZpbGxTbG90KFRoaXNVbml0LCBUaGlzVW5pdDIsIFJ0YVVuaXEsIEhvc3RQKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKFJJT0ZpbmRGcmVlSUQocCwgSG9zdFAsICZUaGlzVW5pdCwgTlVMTCkgPT0gMCkKKwl7CisJICAgIFJJT0RlZmF1bHROYW1lKHAsIEhvc3RQLCBUaGlzVW5pdCk7CisJICAgIEZpbGxTbG90KFRoaXNVbml0LCAwLCBSdGFVbmlxLCBIb3N0UCk7CisJfQorICAgIH0KKyAgICBQa3RSZXBseVAtPkNvbW1hbmQgPSBST1VURV9VU0VEOworICAgIEhvc3RQLT5Db3B5KCJSVF9VU0VEIixQa3RSZXBseVAtPkNvbW1hbmRUZXh0LDcpOworICB9CisgIFJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgUnVwLCBDbWRCbGtQKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKwordm9pZAorUklPRml4UGhicyhwLCBIb3N0UCwgdW5pdCkKK3N0cnVjdCByaW9faW5mbyAqcDsKK3N0cnVjdCBIb3N0ICpIb3N0UDsKK3VpbnQgdW5pdDsKK3sKKwl1c2hvcnQJCQlsaW5rLCBwb3J0OworCXN0cnVjdCBQb3J0CQkqUG9ydFA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgUG9ydE4gPSBIb3N0UC0+TWFwcGluZ1t1bml0XS5TeXNQb3J0OworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJJT0ZpeFBoYnMgdW5pdCAlZCBzeXNwb3J0ICVkXG4iLCB1bml0LCBQb3J0Tik7CisKKwlpZiAoUG9ydE4gIT0gLTEpIHsKKwkJdXNob3J0CQlkZXN0X3VuaXQgPSBIb3N0UC0+TWFwcGluZ1t1bml0XS5JRDI7CisKKwkJLyoKKwkJKiogR2V0IHRoZSBsaW5rIG51bWJlciB1c2VkIGZvciB0aGUgMXN0IDggcGhicyBvbiB0aGlzIHVuaXQuCisJCSovCisJCVBvcnRQID0gcC0+UklPUG9ydHBbSG9zdFAtPk1hcHBpbmdbZGVzdF91bml0IC0gMV0uU3lzUG9ydF07CisKKwkJbGluayA9IFJXT1JEKFBvcnRQLT5QaGJQLT5saW5rKTsKKworCQlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgUE9SVFNfUEVSX1JUQTsgcG9ydCsrLCBQb3J0TisrKSB7CisJCQl1c2hvcnQJCWRlc3RfcG9ydCA9IHBvcnQgKyA4OworI2lmIDAKKwkJCXVpbnQJCVBrdEludDsKKyNlbmRpZgorCQkJV09SRAkJKlR4UGt0UDsKKwkJCVBLVAkJKlBrdDsKKworCQkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtQb3J0Tl07CisKKwkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCS8qCisJCQkqKiBJZiBSVEEgaXMgbm90IHBvd2VyZWQgb24sIHRoZSB0eCBwYWNrZXRzIHdpbGwgYmUKKwkJCSoqIHVuc2V0LCBzbyBnbyBubyBmdXJ0aGVyLgorCQkJKi8KKwkJCWlmIChQb3J0UC0+VHhTdGFydCA9PSAwKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJUeCBwa3RzIG5vdCBzZXQgdXAgeWV0XG4iKTsKKwkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJKiogRm9yIHRoZSBzZWNvbmQgc2xvdCBvZiBhIDE2IHBvcnQgUlRBLCB0aGUgZHJpdmVyIG5lZWRzIHRvCisJCQkqKiBzb3J0IG91dCB0aGUgcGhiIHRvIHBvcnQgbWFwcGluZ3MuIFRoZSBkZXN0X3VuaXQgZm9yIHRoaXMKKwkJCSoqIGdyb3VwIG9mIDggcGhicyBpcyBzZXQgdG8gdGhlIGRlc3RfdW5pdCBvZiB0aGUgYWNjb21wYW55aW5nCisJCQkqKiA4IHBvcnQgYmxvY2suIFRoZSBkZXN0X3BvcnQgb2YgdGhlIHNlY29uZCB1bml0IGlzIHNldCB0bworCQkJKiogYmUgaW4gdGhlIHJhbmdlIDgtMTUgKGkuZS4gOCBpcyBhZGRlZCkuIFRodXMsIGZvciBhIDE2IHBvcnQKKwkJCSoqIFJUQSB3aXRoIElEcyA1IGFuZCA2LCB0cmFmZmljIGJvdW5kIGZvciBwb3J0IDYgb2YgdW5pdCA2CisJCQkqKiAoYmVpbmcgdGhlIHNlY29uZCBtYXAgSUQpIHdpbGwgYmUgc2VudCB0byBkZXN0X3VuaXQgNSwgcG9ydAorCQkJKiogMTQuIFdoZW4gdGhpcyBSVEEgaXMgZGVsZXRlZCwgZGVzdF91bml0IGZvciBJRCA2IHdpbGwgYmUKKwkJCSoqIHJlc3RvcmVkLCBhbmQgdGhlIGRlc3RfcG9ydCB3aWxsIGJlIHJlZHVjZWQgYnkgOC4KKwkJCSoqIFRyYW5zbWl0IHBhY2tldHMgYWxzbyBoYXZlIGEgZGVzdGluYXRpb24gZmllbGQgd2hpY2ggbmVlZHMKKwkJCSoqIGFkanVzdGluZyBpbiB0aGUgc2FtZSBtYW5uZXIuCisJCQkqKiBOb3RlIHRoYXQgdGhlIHVuaXQvcG9ydCBieXRlcyBpbiAnZGVzdCcgYXJlIHN3YXBwZWQuCisJCQkqKiBXZSBhbHNvIG5lZWQgdG8gYWRqdXN0IHRoZSBwaGIgYW5kIHJ1cCBsaW5rIG51bWJlcnMgZm9yIHRoZQorCQkJKiogc2Vjb25kIGJsb2NrIG9mIDggdHR5cy4KKwkJCSovCisJCQlmb3IgKFR4UGt0UCA9IFBvcnRQLT5UeFN0YXJ0OyBUeFBrdFAgPD0gUG9ydFAtPlR4RW5kOyBUeFBrdFArKykgeworCQkJCS8qCisJCQkJKiogKlR4UGt0UCBpcyB0aGUgcG9pbnRlciB0byB0aGUgdHJhbnNtaXQgcGFja2V0IG9uIHRoZSBob3N0CisJCQkJKiogY2FyZC4gVGhpcyBuZWVkcyB0byBiZSB0cmFuc2xhdGVkIGludG8gYSAzMiBiaXQgcG9pbnRlcgorCQkJCSoqIHNvIGl0IGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBkcml2ZXIuCisJCQkJKi8KKwkJCQlQa3QgPSAoUEtUICopIFJJT19QVFIoSG9zdFAtPkNhZGRyLFJJTkRXKFR4UGt0UCkpOworCisJCQkJLyoKKwkJCQkqKiBJZiB0aGUgcGFja2V0IGlzIHVzZWQsIHJlc2V0IGl0LgorCQkJCSovCisJCQkJUGt0ID0gKFBLVCAqKSgodWludClQa3QgJiB+UEtUX0lOX1VTRSk7CisJCQkJV0JZVEUoUGt0LT5kZXN0X3VuaXQsIGRlc3RfdW5pdCk7CisJCQkJV0JZVEUoUGt0LT5kZXN0X3BvcnQsIGRlc3RfcG9ydCk7CisJCQl9CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAicGhiIGRlc3Q6IE9sZCAleDoleCBOZXcgJXg6JXhcbiIsCisJCQkJCVJXT1JEKFBvcnRQLT5QaGJQLT5kZXN0aW5hdGlvbikgJiAweGZmLAorCQkJCQkoUldPUkQoUG9ydFAtPlBoYlAtPmRlc3RpbmF0aW9uKSA+PiA4KSAmIDB4ZmYsCisJCQkJCWRlc3RfdW5pdCwgZGVzdF9wb3J0KTsKKwkJCVdXT1JEKFBvcnRQLT5QaGJQLT5kZXN0aW5hdGlvbiwgZGVzdF91bml0ICsgKGRlc3RfcG9ydCA8PCA4KSk7CisJCQlXV09SRChQb3J0UC0+UGhiUC0+bGluaywgbGluayk7CisKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQl9CisJCS8qCisJCSoqIE5vdyBtYWtlIHN1cmUgdGhlIHJhbmdlIG9mIHBvcnRzIHRvIGJlIHNlcnZpY2VkIGluY2x1ZGVzCisJCSoqIHRoZSAybmQgOCBvbiB0aGlzIDE2IHBvcnQgUlRBLgorCQkqLworCQlpZiAobGluayA+IDMpIHJldHVybjsKKwkJaWYgKCgodW5pdCAqIDgpICsgNykgPiBSV09SRChIb3N0UC0+TGlua1N0clBbbGlua10ubGFzdF9wb3J0KSkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgImxhc3QgcG9ydCBvbiBob3N0IGxpbmsgJWQ6ICVkXG4iLCBsaW5rLCAodW5pdCAqIDgpICsgNyk7CisJCQlXV09SRChIb3N0UC0+TGlua1N0clBbbGlua10ubGFzdF9wb3J0LCAodW5pdCAqIDgpICsgNyk7CisJCX0KKwl9Cit9CisKKy8qCisqKiBDaGVjayB0byBzZWUgaWYgdGhlIG5ldyBkaXNjb25uZWN0aW9uIGhhcyBpc29sYXRlZCB0aGlzIHVuaXQuCisqKiBJZiBpdCBoYXMsIHRoZW4gaW52YWxpZGF0ZSBhbGwgaXRzIGxpbmsgaW5mb3JtYXRpb24sIGFuZCB0ZWxsCisqKiB0aGUgd29ybGQgYWJvdXQgaXQuIFRoaXMgaXMgZG9uZSB0byBlbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdG9yCisqKiBvbmx5IGdldHMgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGlzIGdvaW5nIG9uLgorKi8KK3N0YXRpYyBpbnQKK1JJT0NoZWNrSXNvbGF0ZWQocCwgSG9zdFAsIFVuaXRJZCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgSG9zdCAqSG9zdFA7Cit1aW50IFVuaXRJZDsKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmSG9zdFAtPkhvc3RMb2NrLCBmbGFncyk7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdFAoIEhvc3RQICk7CisJQ2hlY2tVbml0SWQoIFVuaXRJZCApOworI2VuZGlmCisJaWYgKCBSSU9DaGVjayggSG9zdFAsIFVuaXRJZCApICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiVW5pdCAlZCBpcyBOT1QgaXNvbGF0ZWRcbiIsIFVuaXRJZCk7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZIb3N0UC0+SG9zdExvY2ssIGZsYWdzKTsKKwkJcmV0dXJuKDApOworCX0KKworCVJJT0lzb2xhdGUocCwgSG9zdFAsIFVuaXRJZCApOworCVJJT1NldENoYW5nZShwKTsKKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSG9zdFAtPkhvc3RMb2NrLCBmbGFncyk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisqKiBJbnZhbGlkYXRlIGFsbCB0aGUgbGluayBpbnRlcmNvbm5lY3Rpdml0eSBvZiB0aGlzIHVuaXQsIGFuZCBvZgorKiogYWxsIHRoZSB1bml0cyBhdHRhY2hlZCB0byBpdC4gVGhpcyB3aWxsIG1lYW4gdGhhdCB0aGUgZW50aXJlCisqKiBzdWJuZXQgd2lsbCByZS1pbnRyb2R1Y2UgaXRzZWxmLgorKi8KK3N0YXRpYyBpbnQKK1JJT0lzb2xhdGUocCwgSG9zdFAsIFVuaXRJZCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgSG9zdCAqCQlIb3N0UDsKK3VpbnQgVW5pdElkOyAKK3sKKwl1aW50IGxpbmssIHVuaXQ7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdFAoIEhvc3RQICk7CisJQ2hlY2tVbml0SWQoIFVuaXRJZCApOworI2VuZGlmCisJVW5pdElkLS07CQkvKiB0aGlzIHRyaWNrIHJlbGllcyBvbiB0aGUgVW5pdCBJZCBiZWluZyBVTlNJR05FRCEgKi8KKworCWlmICggVW5pdElkID49IE1BWF9SVVAgKQkvKiBkb250Y2hhIGp1c3QgbHVydiB1bnNpZ25lZCBtYXRocyEgKi8KKwkJcmV0dXJuKDApOworCisJaWYgKCBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLkZsYWdzICYgQkVFTl9IRVJFICkKKwkJcmV0dXJuKDApOworCisJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5GbGFncyB8PSBCRUVOX0hFUkU7CisKKwlpZiAoIHAtPlJJT1ByaW50RGlzYWJsZWQgPT0gRE9fUFJJTlQgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUklPTWVzZ0lzb2xhdGVkICVzIiwgSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5OYW1lKTsKKworCWZvciAoIGxpbms9MDsgbGluazxMSU5LU19QRVJfVU5JVDsgbGluaysrKSB7CisJCXVuaXQgPSBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLlRvcG9sb2d5W2xpbmtdLlVuaXQ7CisJCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uVG9wb2xvZ3lbbGlua10uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7CisJCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uVG9wb2xvZ3lbbGlua10uTGluayA9IE5PX0xJTks7CisJCVJJT0lzb2xhdGUocCwgSG9zdFAsIHVuaXQgKTsKKwl9CisJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5GbGFncyAmPSB+QkVFTl9IRVJFOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitSSU9DaGVjayhIb3N0UCwgVW5pdElkKQorc3RydWN0IEhvc3QgKkhvc3RQOwordWludCBVbml0SWQ7Cit7CisgIHVuc2lnbmVkIGNoYXIgbGluazsKKworI2lmZGVmIENIRUNLCisJQ2hlY2tIb3N0UCggSG9zdFAgKTsKKwlDaGVja1VuaXRJZCggVW5pdElkICk7CisjZW5kaWYKKy8qIAlyaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJDaGVjayB0byBzZWUgaWYgdW5pdCAlZCBoYXMgYSByb3V0ZSB0byB0aGUgaG9zdFxuIixVbml0SWQpKTsgKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUklPQ2hlY2sgOiBVbml0SUQgPSAlZFxuIiwgVW5pdElkKTsKKworCWlmICggVW5pdElkID09IEhPU1RfSUQgKSB7CisJCS8qIHJpb19kcHJpbnQoUklPX0RFQlVHX1JPVVRFLCAoIlVuaXQgJWQgaXMgTk9UIGlzb2xhdGVkIC0gaXQgSVMgdGhlIGhvc3QhXG4iLCBVbml0SWQpKTsgKi8KKwkJcmV0dXJuIDE7CisJfQorCisJVW5pdElkLS07CisKKwlpZiAoIFVuaXRJZCA+PSBNQVhfUlVQICkgeworCQkvKiByaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJVbml0ICVkIC0gaWdub3JlZC5cbiIsIFVuaXRJZCkpOyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKCBsaW5rPTA7IGxpbms8TElOS1NfUEVSX1VOSVQ7IGxpbmsrKyApIHsKKwkJaWYgKCBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLlRvcG9sb2d5W2xpbmtdLlVuaXQ9PUhPU1RfSUQgKSB7CisJCQkvKiByaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJVbml0ICVkIGlzIGNvbm5lY3RlZCBkaXJlY3RseSB0byBob3N0IHZpYSBsaW5rICglYykuXG4iLCAKKwkJCQkJCVVuaXRJZCwgJ0EnK2xpbmspKTsgKi8KKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKCBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLkZsYWdzICYgQkVFTl9IRVJFICkgeworCQkvKiByaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJCZWVuIHRvIFVuaXQgJWQgYmVmb3JlIC0gaWdub3JpbmdcbiIsIFVuaXRJZCkpOyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlIb3N0UC0+TWFwcGluZ1tVbml0SWRdLkZsYWdzIHw9IEJFRU5fSEVSRTsKKworCWZvciAoIGxpbms9MDsgbGluayA8IExJTktTX1BFUl9VTklUOyBsaW5rKysgKSB7CisJCS8qIHJpb19kcHJpbnQoUklPX0RFQlVHX1JPVVRFLCAoIlVuaXQgJWQgY2hlY2sgbGluayAoJWMpXG4iLCBVbml0SWQsJ0EnK2xpbmspKTsgKi8KKwkJaWYgKCBSSU9DaGVjayggSG9zdFAsIEhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uVG9wb2xvZ3lbbGlua10uVW5pdCApICkgeworCQkJLyogcmlvX2RwcmludChSSU9fREVCVUdfUk9VVEUsICgiVW5pdCAlZCBpcyBjb25uZWN0ZWQgdG8gc29tZXRoaW5nIHRoYXQga25vd3MgdGhlIGhvc3QgdmlhIGxpbmsgKCVjKVxuIiwgVW5pdElkLGxpbmsrJ0EnKSk7ICovCisJCQlIb3N0UC0+TWFwcGluZ1tVbml0SWRdLkZsYWdzICY9IH5CRUVOX0hFUkU7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uRmxhZ3MgJj0gfkJFRU5fSEVSRTsKKworCS8qIHJpb19kcHJpbnQoUklPX0RFQlVHX1JPVVRFLCAoIlVuaXQgJWQgRE9FU05UIEtOT1cgVEhFIEhPU1QhXG4iLCBVbml0SWQpKTsgKi8KKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyoqIFJldHVybnMgdGhlIHR5cGUgb2YgdW5pdCAoaG9zdCwgMTYvOCBwb3J0IFJUQSkKKyovCisKK3VpbnQKK0dldFVuaXRUeXBlKFVuaXEpCit1aW50IFVuaXE7Cit7CisJc3dpdGNoICggKFVuaXEgPj4gMjgpICYgMHhmKQorCXsKKwkJY2FzZSBSSU9fQVQ6CisJCWNhc2UgUklPX01DQToKKwkJY2FzZSBSSU9fRUlTQToKKwkJY2FzZSBSSU9fUENJOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlVuaXQgdHlwZTogSG9zdFxuIik7CisJCQlyZXR1cm4oVFlQRV9IT1NUKTsKKwkJY2FzZSBSSU9fUlRBXzE2OgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlVuaXQgdHlwZTogMTYgcG9ydCBSVEFcbiIpOworCQkJcmV0dXJuKFRZUEVfUlRBMTYpOworCQljYXNlIFJJT19SVEE6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiVW5pdCB0eXBlOiA4IHBvcnQgUlRBXG4iKTsKKwkJCXJldHVybihUWVBFX1JUQTgpOworCQlkZWZhdWx0IDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJVbml0IHR5cGU6IFVucmVjb2duaXNlZFxuIik7CisJCQlyZXR1cm4oOTkpOworCX0KK30KKworaW50CitSSU9TZXRDaGFuZ2UocCkKK3N0cnVjdCByaW9faW5mbyAqCXA7Cit7CisJaWYgKCBwLT5SSU9RdWlja0NoZWNrICE9IE5PVF9DSEFOR0VEICkKKwkJcmV0dXJuKDApOworCXAtPlJJT1F1aWNrQ2hlY2sgPSBDSEFOR0VEOworCWlmICggcC0+UklPU2lnbmFsUHJvY2VzcyApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlNlbmQgU0lHLUhVUCIpOworCQkvKgorCQlwc2lnbmFsKCBSSU9TaWduYWxQcm9jZXNzLCBTSUdIVVAgKTsKKwkJKi8KKwl9CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZAorUklPQ29uQ29uKHAsIEhvc3RQLCBGcm9tSWQsIEZyb21MaW5rLCBUb0lkLCBUb0xpbmssIENoYW5nZSkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgSG9zdCAqSG9zdFA7Cit1aW50IEZyb21JZDsKK3VpbnQgRnJvbUxpbms7Cit1aW50IFRvSWQ7Cit1aW50IFRvTGluazsKK2ludCBDaGFuZ2U7IAoreworICAgIGNoYXIgKkZyb21OYW1lOworICAgIGNoYXIgKkZyb21UeXBlOworICAgIGNoYXIgKlRvTmFtZTsKKyAgICBjaGFyICpUb1R5cGU7CisgICAgdW5zaWduZWQgaW50IHRwOworCisvKgorKiogMTUuMTAuMTk5OCBBUkcgLSBFU0lMIDA3NTkKKyoqIChQYXJ0KSBmaXggZm9yIHBvcnQgYmVpbmcgdHJhc2hlZCB3aGVuIG9wZW5lZCB3aGlsc3QgUlRBICJkaXNjb25uZWN0ZWQiCisqKgorKiogV2hhdCdzIHRoaXMgZG9pbmcgaW4gaGVyZSBhbnl3YXkgPworKiogSXQgd2FzIGNhdXNpbmcgdGhlIHBvcnQgdG8gYmUgJ3VubWFwcGVkJyBpZiBvcGVuZWQgd2hpbHN0IFJUQSAiZGlzY29ubmVjdGVkIgorKioKKyoqIDA5LjEyLjE5OTggQVJHIC0gRVNJTCAwNzc2IC0gcGFydCBmaXgKKyoqIE9rYXksIFdlJ3ZlIGZvdW5kIG91dCB3aGF0IHRoaXMgd2FzIGFsbCBhYm91dCBub3cgIQorKiogU29tZW9uZSBoYWQgYm90Y2hlZCB0aGlzIHRvIHVzZSBSSU9IYWx0ZWQgdG8gaW5kaWNhdGVkIHRoZSBudW1iZXIgb2YgUlRBcworKiogJ2Rpc2Nvbm5lY3RlZCcuIFRoZSB2YWx1ZSBpbiBSSU9IYWx0ZWQgd2FzIHRoZW4gYmVpbmcgdXNlZCBpbiB0aGUKKyoqICdSSU9fUVVJQ0tfQ0hFQ0snIGlvY3RsLiBBIG5vbmUgemVybyB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgYSBsZWFzdCBvbmUgUlRBCisqKiBpcyAnZGlzY29ubmVjdGVkJy4gVGhlIGNoYW5nZSB3YXMgcHV0IGluIHRvIHNhdGlzZnkgYSBjdXN0b21lcidzIG5lZWRzLgorKiogSGF2aW5nIHRha2VuIHRoaXMgYml0IG9mIGNvZGUgb3V0ICdSSU9fUVVJQ0tfQ0hFQ0snIG5vdyBubyBsb25nZXIgd29ya3MgZm9yCisqKiB0aGUgY3VzdG9tZXIuCisqKgorICAgIGlmIChDaGFuZ2UgPT0gQ09OTkVDVCkgeworCQlpZiAocC0+UklPSGFsdGVkKSBwLT5SSU9IYWx0ZWQgLS07CisJIH0KKwkgZWxzZSB7CisJCXAtPlJJT0hhbHRlZCArKzsKKwkgfQorKioKKyoqIFNvIC0gd2UgbmVlZCB0byBpbXBsZW1lbnQgaXQgc2xpZ2h0bHkgZGlmZmVyZW50bHkgLSBhIG5ldyBtZW1iZXIgb2YgdGhlCisqKiByaW9faW5mbyBzdHJ1Y3QgLSBSSU9SdGFEaXNDb25zIChSSU8gUlRBIGNvbm5lY3Rpb25zKSBrZWVwcyB0cmFjayBvZiBSVEEKKyoqIGNvbm5lY3Rpb25zIGFuZCBkaXNjb25uZWN0aW9ucy4gCisqLworICAgIGlmIChDaGFuZ2UgPT0gQ09OTkVDVCkgeworCQlpZiAocC0+UklPUnRhRGlzQ29ucykgcC0+UklPUnRhRGlzQ29ucy0tOworCSB9CisJIGVsc2UgeworCQlwLT5SSU9SdGFEaXNDb25zKys7CisJIH0KKworICAgIGlmICggcC0+UklPUHJpbnREaXNhYmxlZCA9PSBET05UX1BSSU5UICkKKwkJcmV0dXJuOworCisgICAgaWYgKCBGcm9tSWQgPiBUb0lkICkgeworCQl0cCA9IEZyb21JZDsKKwkJRnJvbUlkID0gVG9JZDsKKwkJVG9JZCA9IHRwOworCQl0cCA9IEZyb21MaW5rOworCQlGcm9tTGluayA9IFRvTGluazsKKwkJVG9MaW5rID0gdHA7CisgICAgfQorCisgICAgRnJvbU5hbWUgPSBGcm9tSWQgPyBIb3N0UC0+TWFwcGluZ1tGcm9tSWQtMV0uTmFtZSA6IEhvc3RQLT5OYW1lOworICAgIEZyb21UeXBlID0gRnJvbUlkID8gIlJUQSIgOiAiSE9TVCI7CisgICAgVG9OYW1lID0gVG9JZCA/IEhvc3RQLT5NYXBwaW5nW1RvSWQtMV0uTmFtZSA6IEhvc3RQLT5OYW1lOworICAgIFRvVHlwZSA9IFRvSWQgPyAiUlRBIiA6ICJIT1NUIjsKKworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJMaW5rIGJldHdlZW4gJXMgJyVzJyAoJWMpIGFuZCAlcyAnJXMnICglYykgJXMuXG4iLAorCQkJICAgIEZyb21UeXBlLCBGcm9tTmFtZSwgJ0EnK0Zyb21MaW5rLAorCQkJICAgIFRvVHlwZSwgICBUb05hbWUsICAgJ0EnK1RvTGluaywKKwkJCSAgICAoQ2hhbmdlPT1DT05ORUNUKSA/ICJlc3RhYmxpc2hlZCIgOiAiZGlzY29ubmVjdGVkIik7CisgICAgY3ByaW50ZigiTGluayBiZXR3ZWVuICVzICclcycgKCVjKSBhbmQgJXMgJyVzJyAoJWMpICVzLlxuIiwKKwkJCSAgICBGcm9tVHlwZSwgRnJvbU5hbWUsICdBJytGcm9tTGluaywKKwkJCSAgICBUb1R5cGUsICAgVG9OYW1lLCAgICdBJytUb0xpbmssCisJCQkgICAgKENoYW5nZT09Q09OTkVDVCkgPyAiZXN0YWJsaXNoZWQiIDogImRpc2Nvbm5lY3RlZCIpOworfQorCisvKgorKiogUklPUmVtb3ZlRnJvbVNhdmVkVGFibGUgOgorKioKKyoqIERlbGV0ZSBhbmQgUlRBIGVudHJ5IGZyb20gdGhlIHNhdmVkIHRhYmxlIGdpdmVuIHRvIHVzCisqKiBieSB0aGUgY29uZmlndXJhdGlvbiBwcm9ncmFtLgorKi8KK3N0YXRpYyBpbnQKK1JJT1JlbW92ZUZyb21TYXZlZFRhYmxlKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IE1hcCAqcE1hcCkKK3sKKyAgICBpbnQJCWVudHJ5OworCisgICAgLyoKKyAgICAqKiBXZSBsb29wIGZvciBhbGwgZW50cmllcyBldmVuIGFmdGVyIGZpbmRpbmcgYW4gZW50cnkgYW5kCisgICAgKiogemVyb2luZyBpdCBiZWNhdXNlIHdlIG1heSBoYXZlIHR3byBlbnRyaWVzIHRvIGRlbGV0ZSBpZgorICAgICoqIGl0J3MgYSAxNiBwb3J0IFJUQS4KKyAgICAqLworICAgIGZvciAoZW50cnkgPSAwOyBlbnRyeSA8IFRPVEFMX01BUF9FTlRSSUVTOyBlbnRyeSsrKQorICAgIHsKKwlpZiAocC0+UklPU2F2ZWRUYWJsZVtlbnRyeV0uUnRhVW5pcXVlTnVtID09IHBNYXAtPlJ0YVVuaXF1ZU51bSkKKwl7CisJICAgIGJ6ZXJvKChjYWRkcl90KSZwLT5SSU9TYXZlZFRhYmxlW2VudHJ5XSwgc2l6ZW9mKHN0cnVjdCBNYXApKTsKKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qCisqKiBSSU9DaGVja0Rpc2Nvbm5lY3RlZCA6CisqKgorKiogU2NhbiB0aGUgdW5pdCBsaW5rcyB0byBhbmQgcmV0dXJuIHplcm8gaWYgdGhlIHVuaXQgaXMgY29tcGxldGVseQorKiogZGlzY29ubmVjdGVkLgorKi8KK3N0YXRpYyBpbnQKK1JJT0ZyZWVEaXNjb25uZWN0ZWQoc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgSG9zdCAqSG9zdFAsIGludCB1bml0KQoreworICAgIGludAkJbGluazsKKworCisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJJT0ZyZWVEaXNjb25uZWN0IHVuaXQgJWRcbiIsIHVuaXQpOworICAgIC8qCisgICAgKiogSWYgdGhlIHNsb3QgaXMgdGVudGF0aXZlIGFuZCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlCisgICAgKiogc2Vjb25kIGhhbGYgb2YgYSAxNiBwb3J0IFJUQSB0aGVuIHNjYW4gdG8gc2VlIGlmCisgICAgKiogaXMgZGlzY29ubmVjdGVkLgorICAgICovCisgICAgZm9yIChsaW5rID0gMDsgbGluayA8IExJTktTX1BFUl9VTklUOyBsaW5rKyspCisgICAgeworCWlmIChIb3N0UC0+TWFwcGluZ1t1bml0XS5Ub3BvbG9neVtsaW5rXS5Vbml0ICE9IFJPVVRFX0RJU0NPTk5FQ1QpCisJICAgIGJyZWFrOworICAgIH0KKworICAgIC8qCisgICAgKiogSWYgbm90IGFsbCBsaW5rcyBhcmUgZGlzY29ubmVjdGVkIHRoZW4gd2UgY2FuIGZvcmdldCBhYm91dCBpdC4KKyAgICAqLworICAgIGlmIChsaW5rIDwgTElOS1NfUEVSX1VOSVQpCisJICAgIHJldHVybiAxOworCisjaWYgTkVFRF9UT19GSVhfVEhJUworICAgIC8qIE9rIHNvIGFsbCB0aGUgbGlua3MgYXJlIGRpc2Nvbm5lY3RlZC4gQnV0IHdlIG1heSBoYXZlIG9ubHkganVzdAorICAgICoqIG1hZGUgdGhpcyBzbG90IHRlbnRhdGl2ZSBhbmQgbm90IHlldCByZWNlaXZlZCBhIHRvcG9sb2d5IHVwZGF0ZS4KKyAgICAqKiBMZXRzIGNoZWNrIGhvdyBsb25nIGFnbyB3ZSBtYWRlIGl0IHRlbnRhdGl2ZS4KKyAgICAqLworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJKdXN0IGFib3V0IHRvIGNoZWNrIExCT0xUIG9uIGVudHJ5ICVkXG4iLCB1bml0KTsKKyAgICBpZiAoZHJ2X2dldHBhcm0oTEJPTFQsICh1bG9uZ190ICopICZjdXJyZW50X3RpbWUpKQorICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiZHJ2X2dldHBhcm0oTEJPTFQsLi4uLikgRmFpbGVkLlxuIik7CisKKyAgICBlbGFwc2VfdGltZSA9IGN1cnJlbnRfdGltZSAtIFRlbnRUaW1lW3VuaXRdOworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJlbGFwc2UgJWQgPSBjdXJyZW50ICVkIC0gdGVudCAlZCAoJWQgdXNlYylcbiIsCisgICAgICAgIGVsYXBzZV90aW1lLCBjdXJyZW50X3RpbWUsIFRlbnRUaW1lW3VuaXRdLCBkcnZfaHp0b3VzZWMoZWxhcHNlX3RpbWUpKTsKKyAgICBpZiAoZHJ2X2h6dG91c2VjKGVsYXBzZV90aW1lKSA8IFdBSVRfVE9fRklOSVNIKQorICAgIHsKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJTa2lwcGluZyBzbG90ICVkLCBub3QgdGltZWQgb3V0IHlldCAlZFxuIiwKKyAgICAgICAgICAgIHVuaXQsIGRydl9oenRvdXNlYyhlbGFwc2VfdGltZSkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgKiogV2UgaGF2ZSBmb3VuZCBhbiB1c2FibGUgc2xvdC4KKyAgICAqKiBJZiBpdCBpcyBoYWxmIG9mIGEgMTYgcG9ydCBSVEEgdGhlbiBkZWxldGUgdGhlIG90aGVyIGhhbGYuCisgICAgKi8KKyAgICBpZiAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uSUQyICE9IDApCisgICAgeworCWludCBuT3RoZXIgPSAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uSUQyKSAtMTsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSaW9GcmVlZGlzIHNlY29uZCBzbG90ICVkLlxuIiwgbk90aGVyKTsKKwliemVybygoY2FkZHJfdCkmSG9zdFAtPk1hcHBpbmdbbk90aGVyXSwgc2l6ZW9mKHN0cnVjdCBNYXApKTsKKyAgICB9CisgICAgUklPUmVtb3ZlRnJvbVNhdmVkVGFibGUocCwgJkhvc3RQLT5NYXBwaW5nW3VuaXRdKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qCisqKiBSSU9GaW5kRnJlZUlEIDoKKyoqCisqKiBUaGlzIGZ1bmN0aW9uIHNjYW5zIHRoZSBnaXZlbiBob3N0IHRhYmxlIGZvciBlaXRoZXIgb25lCisqKiBvciB0d28gZnJlZSB1bml0IElEJ3MuCisqLworaW50CitSSU9GaW5kRnJlZUlEKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IEhvc3QgKkhvc3RQLCB1aW50ICpwSUQxLCB1aW50ICpwSUQyKQoreworICAgIGludCB1bml0LHRlbXBJRDsKKworICAgIC8qCisgICAgKiogSW5pdGlhbGlzZSB0aGUgSUQncyB0byBNQVhfUlVQLgorICAgICoqIFdlIGRvIHRoaXMgdG8gbWFrZSB0aGUgbG9vcCBmb3Igc2V0dGluZyB0aGUgSUQncyBhcyBzaW1wbGUgYXMKKyAgICAqKiBwb3NzaWJsZS4KKyAgICAqLworICAgICpwSUQxID0gTUFYX1JVUDsKKyAgICBpZiAocElEMiAhPSBOVUxMKQorCSpwSUQyID0gTUFYX1JVUDsKKworICAgIC8qCisgICAgKiogU2NhbiBhbGwgZW50cmllcyBvZiB0aGUgaG9zdCBtYXBwaW5nIHRhYmxlIGZvciBmcmVlIHNsb3RzLgorICAgICoqIFdlIHNjYW4gZm9yIGZyZWUgc2xvdHMgZmlyc3QgYW5kIHRoZW4gaWYgdGhhdCBpcyBub3Qgc3VjY2Vzc2Z1bAorICAgICoqIHdlIHN0YXJ0IGFsbCBvdmVyIGFnYWluIGxvb2tpbmcgZm9yIHRlbnRhdGl2ZSBzbG90cyB3ZSBjYW4gcmUtdXNlLgorICAgICovCisgICAgZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9SVVA7IHVuaXQrKykKKyAgICB7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlNjYW5uaW5nIHVuaXQgJWRcbiIsdW5pdCk7CisJLyoKKwkqKiBJZiB0aGUgZmxhZ3MgYXJlIHplcm8gdGhlbiB0aGUgc2xvdCBpcyBlbXB0eS4KKwkqLworCWlmIChIb3N0UC0+TWFwcGluZ1t1bml0XS5GbGFncyA9PSAwKQorCXsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIiAgICAgIFRoaXMgc2xvdCBpcyBlbXB0eS5cbiIpOworCSAgICAvKgorCSAgICAqKiBJZiB3ZSBoYXZlbid0IGFsbG9jYXRlZCB0aGUgZmlyc3QgSUQgdGhlbiBkbyBpdCBub3cuCisJICAgICovCisJICAgIGlmICgqcElEMSA9PSBNQVhfUlVQKQorCSAgICB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJNYWtlIHRlbnRhdGl2ZSBlbnRyeSBmb3IgZmlyc3QgdW5pdCAlZFxuIiwgdW5pdCk7CisJCSpwSUQxID0gdW5pdDsKKworCQkvKgorCQkqKiBJZiB0aGUgc2Vjb25kIElEIGlzIG5vdCBuZWVkZWQgdGhlbiB3ZSBjYW4gcmV0dXJuCisJCSoqIG5vdy4KKwkJKi8KKwkJaWYgKHBJRDIgPT0gTlVMTCkKKwkJICAgIHJldHVybiAwOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKgorCQkqKiBBbGxvY2F0ZSB0aGUgc2Vjb25kIHNsb3QgYW5kIHJldHVybi4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIk1ha2UgdGVudGF0aXZlIGVudHJ5IGZvciBzZWNvbmQgdW5pdCAlZFxuIiwgdW5pdCk7CisJCSpwSUQyID0gdW5pdDsKKwkJcmV0dXJuIDA7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAqKiBJZiB3ZSBtYW5hZ2UgdG8gY29tZSBvdXQgb2YgdGhlIGZyZWUgc2xvdCBsb29wIHRoZW4gd2UKKyAgICAqKiBuZWVkIHRvIHN0YXJ0IGFsbCBvdmVyIGFnYWluIGxvb2tpbmcgZm9yIHRlbnRhdGl2ZSBzbG90cworICAgICoqIHRoYXQgd2UgY2FuIHJlLXVzZS4KKyAgICAqLworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJTdGFydGluZyB0byBzY2FuIGZvciB0ZW50YXRpdmUgc2xvdHNcbiIpOworICAgIGZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfUlVQOyB1bml0KyspCisgICAgeworCWlmICgoKEhvc3RQLT5NYXBwaW5nW3VuaXRdLkZsYWdzICYgU0xPVF9URU5UQVRJVkUpIHx8CisJICAgICAgICAgICAgICAgICAgICAgICAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uRmxhZ3MgPT0gMCkpICAmJiAhIAorCSAgIChIb3N0UC0+TWFwcGluZ1t1bml0XS5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UICkpCisJeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiICAgIFNsb3QgJWQgbG9va3MgcHJvbWlzaW5nLlxuIix1bml0KTsKKworCSAgICBpZih1bml0ID09ICpwSUQxKQorCSAgICB7CisJICAgIAlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiICAgIE5vIGl0IGlzbid0LCBpdHMgdGhlIDFzdCBoYWxmXG4iKTsKKwkJY29udGludWU7CisJICAgIH0KKworCSAgICAvKgorCSAgICAqKiBTbG90IGlzIFRlbnRhdGl2ZSBvciBFbXB0eSwgYnV0IG5vdCBhIHRlbnRhdGl2ZSBzZWNvbmQgCisJICAgICoqIHNsb3Qgb2YgYSAxNiBwb3J0ZXIuCisJICAgICoqIEF0dGVtcHQgdG8gZnJlZSB1cCB0aGlzIHNsb3QgKGFuZCBpdHMgcGFybnRlciBpZgorCSAgICAqKiBpdCBpcyBhIDE2IHBvcnQgc2xvdC4gVGhlIHNlY29uZCBzbG90IHdpbGwgYmVjb21lCisJICAgICoqIGVtcHR5IGFmdGVyIGEgY2FsbCB0byBSSU9GcmVlRGlzY29ubmVjdGVkIHNvIHRoYXRzIHdoeQorCSAgICAqKiB3ZSBsb29rIGZvciBlbXB0eSBzbG90cyBhYm92ZSAgYXMgd2VsbCkuCisJICAgICovCisJICAgIGlmIChIb3N0UC0+TWFwcGluZ1t1bml0XS5GbGFncyAhPSAwKSAKKwkgICAgCWlmIChSSU9GcmVlRGlzY29ubmVjdGVkKHAsIEhvc3RQLCB1bml0KSAhPSAwKQorCQkJICAgIGNvbnRpbnVlOworCSAgICAvKgorCSAgICAqKiBJZiB3ZSBoYXZlbid0IGFsbG9jYXRlZCB0aGUgZmlyc3QgSUQgdGhlbiBkbyBpdCBub3cuCisJICAgICovCisJICAgIGlmICgqcElEMSA9PSBNQVhfUlVQKQorCSAgICB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJHcmFiIHRlbnRhdGl2ZSBlbnRyeSBmb3IgZmlyc3QgdW5pdCAlZFxuIiwgdW5pdCk7CisJCSpwSUQxID0gdW5pdDsKKworCQkvKgorCQkqKiBDbGVhciBvdXQgdGhpcyBzbG90IG5vdyB0aGF0IHdlIGludGVuZCB0byB1c2UgaXQuCisJCSovCisJCWJ6ZXJvKCZIb3N0UC0+TWFwcGluZ1t1bml0XSwgc2l6ZW9mKHN0cnVjdCBNYXApKTsKKworCQkvKgorCQkqKiBJZiB0aGUgc2Vjb25kIElEIGlzIG5vdCBuZWVkZWQgdGhlbiB3ZSBjYW4gcmV0dXJuCisJCSoqIG5vdy4KKwkJKi8KKwkJaWYgKHBJRDIgPT0gTlVMTCkKKwkJICAgIHJldHVybiAwOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKgorCQkqKiBBbGxvY2F0ZSB0aGUgc2Vjb25kIHNsb3QgYW5kIHJldHVybi4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkdyYWIgdGVudGF0aXZlL2VtcHR5ICBlbnRyeSBmb3Igc2Vjb25kIHVuaXQgJWRcbiIsCisJCSAgICAgIHVuaXQpOworCQkqcElEMiA9IHVuaXQ7CisKKwkJLyoKKwkJKiogQ2xlYXIgb3V0IHRoaXMgc2xvdCBub3cgdGhhdCB3ZSBpbnRlbmQgdG8gdXNlIGl0LgorCQkqLworCQliemVybygmSG9zdFAtPk1hcHBpbmdbdW5pdF0sIHNpemVvZihzdHJ1Y3QgTWFwKSk7CisKKwkJLyogQXQgdGhpcyBwb2ludCB1bmRlciB0aGUgcmlnaHQod3Jvbmc/KSBjb25kaXRpb25zCisJCSoqIHdlIG1heSBoYXZlIGEgZmlyc3QgdW5pdCBJRCBiZWluZyBoaWdoZXIgdGhhbiB0aGUKKwkJKiogc2Vjb25kIHVuaXQgSUQuIFRoaXMgaXMgYSBiYWQgaWRlYSBpZiB3ZSBhcmUgYWJvdXQKKwkJKiogdG8gZmlsbCB0aGUgc2xvdHMgd2l0aCBhIDE2IHBvcnQgUlRBLgorCQkqKiBCZXR0ZXIgY2hlY2sgYW5kIHN3YXAgdGhlbSBvdmVyLgorCQkqLworCisJCWlmICgqcElEMSA+ICpwSUQyKQorCQl7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiU3dhcHBpbmcgSURTICVkICVkXG4iLCAqcElEMSwgKnBJRDIpOworCQkJdGVtcElEID0gKnBJRDE7CisJCQkqcElEMSA9ICpwSUQyOworCQkJKnBJRDIgPSB0ZW1wSUQ7CisJCX0KKwkJcmV0dXJuIDA7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAqKiBJZiB3ZSBtYW5hZ2UgdG8gZ2V0IHRvIHRoZSBlbmQgb2YgdGhlIHNlY29uZCBsb29wIHRoZW4gd2UKKyAgICAqKiBjYW4gZ2l2ZSB1cCBhbmQgcmV0dXJuIGEgZmFpbHVyZS4KKyAgICAqLworICAgIHJldHVybiAxOworfQorCisKKy8qCisqKiBUaGUgbGluayBzd2l0Y2ggc2NlbmFyaW8uCisqKgorKiogUnRhIFd1biAoQSkgaXMgY29ubmVjdGVkIHRvIFR1dyAoQSkuCisqKiBUaGUgdGFibGVzIGFyZSBhbGwgdXAgdG8gZGF0ZSwgYW5kIHRoZSBzeXN0ZW0gaXMgT0suCisqKgorKiogSWYgV3VuIChBKSBpcyBub3cgbW92ZWQgdG8gV3VuIChCKSBiZWZvcmUgV3VuIChBKSBjYW4KKyoqIGJlY29tZSBkaXNjb25uZWN0ZWQsIHRoZW4gdGhlIGZvbGxvdyBoYXBwZW5zOgorKioKKyoqIFR1dyAoQSkgc3BvdHMgdGhlIGNoYW5nZSBvZiB1bml0OmxpbmsgYXQgdGhlIG90aGVyIGVuZAorKiogb2YgaXRzIGxpbmsgYW5kIFR1dyBzZW5kcyBhIHRvcG9sb2d5IHBhY2tldCByZWZsZWN0aW5nCisqKiB0aGUgY2hhbmdlOiBUdXcgKEEpIG5vdyBkaXNjb25uZWN0ZWQgZnJvbSBXdW4gKEEpLCBhbmQKKyoqIHRoaXMgaXMgY2xvc2VseSBmb2xsb3dlZCBieSBhIHBhY2tldCBpbmRpY2F0aW5nIHRoYXQgCisqKiBUdXcgKEEpIGlzIG5vdyBjb25uZWN0ZWQgdG8gV3VuIChCKS4KKyoqCisqKiBXdW4gKEIpIHdpbGwgc3BvdCB0aGF0IGl0IGhhcyBub3cgYmVjb21lIGNvbm5lY3RlZCwgYW5kCisqKiBXdW4gd2lsbCBzZW5kIGEgdG9wb2xvZ3kgcGFja2V0LCB3aGljaCBpbmRpY2F0ZXMgdGhhdAorKiogYm90aCBXdW4gKEEpIGFuZCBXdW4gKEIpIGlzIGNvbm5lY3RlZCB0byBUdXcgKEEpLgorKioKKyoqIEV2ZW50dWFsbHkgV3VuIChBKSByZWFsaXNlcyB0aGF0IGl0IGlzIG5vdyBkaXNjb25uZWN0ZWQKKyoqIGFuZCBXdW4gd2lsbCBzZW5kIG91dCBhIHRvcG9sb2d5IHBhY2tldCBpbmRpY2F0aW5nIHRoYXQKKyoqIFd1biAoQSkgaXMgbm93IGRpc2Nvbm5lY3RlZC4KKyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3NwYWNlLmggYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3NwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiMDliMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvc3BhY2UuaApAQCAtMCwwICsxLDE2MSBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvc3BhY2UuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTMKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjIKKyoqCisqKiAgaWRlbnQgQCgjKXJpb3NwYWNlLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fcmlvc3BhY2VfaF9fCisjZGVmaW5lIF9fcmlvX3Jpb3NwYWNlX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvc3BhY2VfaF9zY2NzXyA9ICJAKCMpcmlvc3BhY2UuaAkxLjIiOworI2VuZGlmCisKKyNkZWZpbmUJUklPX0xPQ0FUT1JfTEVOCTE2CisjZGVmaW5lCU1BWF9SSU9fQk9BUkRTCTQKKworLyoKKyoqIERPTlQgY2hhbmdlIHRoaXMgZmlsZS4gQXQgYWxsLiBVbmxlc3MgeW91IGNhbiByZWJ1aWxkIHRoZSBlbnRpcmUKKyoqIGRldmljZSBkcml2ZXIsIHdoaWNoIHlvdSBwcm9iYWJseSBjYW4ndCwgdGhlbiB0aGUgcmVzdCBvZiB0aGUKKyoqIGRyaXZlciB3b24ndCBzZWUgYW55IGNoYW5nZXMgeW91IG1ha2UgaGVyZS4gU28gZG9uJ3QgbWFrZSBhbnkuCisqKiBJbiBwYXJ0aWN1bGFyLCBpdCB3b24ndCBiZSBhYmxlIHRvIHNlZSBjaGFuZ2VzIHRvIFJJT19TTE9UUworKi8KKworc3RydWN0IENvbmYKK3sKKwljaGFyICAgICAgICAgTG9jYXRvclsyNF07CisJdW5zaWduZWQgaW50IFN0YXJ0dXBUaW1lOworCXVuc2lnbmVkIGludCBTbG93Q29vazsKKwl1bnNpZ25lZCBpbnQgSW50clBvbGxUaW1lOworCXVuc2lnbmVkIGludCBCcmVha0ludGVydmFsOworCXVuc2lnbmVkIGludCBUaW1lcjsKKwl1bnNpZ25lZCBpbnQgUnRhTG9hZEJhc2U7CisJdW5zaWduZWQgaW50IEhvc3RMb2FkQmFzZTsKKwl1bnNpZ25lZCBpbnQgWHBIejsKKwl1bnNpZ25lZCBpbnQgWHBDcHM7CisJY2hhciAgICAgICAgICpYcE9uOworCWNoYXIgICAgICAgICAqWHBPZmY7CisJdW5zaWduZWQgaW50IE1heFhwQ3BzOworCXVuc2lnbmVkIGludCBNaW5YcENwczsKKwl1bnNpZ25lZCBpbnQgU3BpbkNtZHM7CisJdW5zaWduZWQgaW50IEZpcnN0QWRkcjsKKwl1bnNpZ25lZCBpbnQgTGFzdEFkZHI7CisJdW5zaWduZWQgaW50IEJ1ZmZlclNpemU7CisJdW5zaWduZWQgaW50IExvd1dhdGVyOworCXVuc2lnbmVkIGludCBMaW5lTGVuZ3RoOworCXVuc2lnbmVkIGludCBDbWRUaW1lOworfTsKKworLyoKKyoqCUJvYXJkIHR5cGVzIC0gdGhlc2UgTVVTVCBjb3JyZXNwb25kIHRvIHByb2R1Y3QgY29kZXMhCisqLyAKKyNkZWZpbmUJUklPX0VNUFRZCTB4MAorI2RlZmluZQlSSU9fRUlTQQkweDMKKyNkZWZpbmUJUklPX1JUQV8xNgkweDkKKyNkZWZpbmUJUklPX0FUCQkweEEKKyNkZWZpbmUJUklPX01DQQkJMHhCCisjZGVmaW5lCVJJT19QQ0kJCTB4RAorI2RlZmluZQlSSU9fUlRBCQkweEUKKworLyoKKyoqCUJvYXJkIGRhdGEgc3RydWN0dXJlLiBUaGlzIGlzIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24gaW5mbworKi8KK3N0cnVjdAlCcmQKK3sKKyAgICB1bnNpZ25lZCBjaGFyIFR5cGU7CS8qIFJJT19FSVNBLCBSSU9fTUNBLCBSSU9fQVQsIFJJT19FTVBUWS4uLiAqLworICAgIHVuc2lnbmVkIGNoYXIgSXZlYzsJLyogUE9MTEVEIG9yIGl2ZWMgbnVtYmVyICovCisgICAgdW5zaWduZWQgY2hhciBNb2RlOwkvKiBDb250cm9sIHN0dWZmLCBzZWUgYmVsb3cgKi8KK307CisKK3N0cnVjdAlCb2FyZAoreworICAgIGNoYXIgICAgICAgTG9jYXRvcltSSU9fTE9DQVRPUl9MRU5dOworICAgIGludCAgICAgICAgTnVtU2xvdHM7CisgICAgc3RydWN0IEJyZCBCb2FyZHNbTUFYX1JJT19CT0FSRFNdOworfTsKKworI2RlZmluZQlCT09UX0ZST01fTElOSwkJMHgwMAorI2RlZmluZQlCT09UX0ZST01fUkFNCQkweDAxCisjZGVmaW5lCUVYVEVSTkFMX0JVU19PRkYJMHgwMAorI2RlZmluZQlFWFRFUk5BTF9CVVNfT04JCTB4MDIKKyNkZWZpbmUJSU5URVJSVVBUX0RJU0FCTEUJMHgwMAorI2RlZmluZQlJTlRFUlJVUFRfRU5BQkxFCTB4MDQKKyNkZWZpbmUJQllURV9PUEVSQVRJT04JCTB4MDAKKyNkZWZpbmUJV09SRF9PUEVSQVRJT04JCTB4MDgKKyNkZWZpbmUJUE9MTEVECQkJSU5URVJSVVBUX0RJU0FCTEUKKyNkZWZpbmUJSVJRXzE1CQkJKDB4MDAgfCBJTlRFUlJVUFRfRU5BQkxFKQorI2RlZmluZQlJUlFfMTIJCQkoMHgxMCB8IElOVEVSUlVQVF9FTkFCTEUpCisjZGVmaW5lCUlSUV8xMQkJCSgweDIwIHwgSU5URVJSVVBUX0VOQUJMRSkKKyNkZWZpbmUJSVJRXzkJCQkoMHgzMCB8IElOVEVSUlVQVF9FTkFCTEUpCisjZGVmaW5lCVNMT1dfTElOS1MJCTB4MDAKKyNkZWZpbmUJRkFTVF9MSU5LUwkJMHg0MAorI2RlZmluZQlTTE9XX0FUX0JVUwkJMHgwMAorI2RlZmluZQlGQVNUX0FUX0JVUwkJMHg4MAorI2RlZmluZQlTTE9XX1BDSV9UUAkJMHgwMAorI2RlZmluZQlGQVNUX1BDSV9UUAkJMHg4MAorLyoKKyoqCURlYnVnIGxldmVscworKi8KKyNkZWZpbmUJREJHX05PTkUJMHgwMDAwMDAwMAorCisjZGVmaW5lCURCR19JTklUCTB4MDAwMDAwMDEKKyNkZWZpbmUJREJHX09QRU4JMHgwMDAwMDAwMgorI2RlZmluZQlEQkdfQ0xPU0UJMHgwMDAwMDAwNAorI2RlZmluZQlEQkdfSU9DVEwJMHgwMDAwMDAwOAorCisjZGVmaW5lCURCR19SRUFECTB4MDAwMDAwMTAKKyNkZWZpbmUJREJHX1dSSVRFCTB4MDAwMDAwMjAKKyNkZWZpbmUJREJHX0lOVFIJMHgwMDAwMDA0MAorI2RlZmluZQlEQkdfUFJPQwkweDAwMDAwMDgwCisKKyNkZWZpbmUJREJHX1BBUkFNCTB4MDAwMDAxMDAKKyNkZWZpbmUJREJHX0NNRAkJMHgwMDAwMDIwMAorI2RlZmluZQlEQkdfWFBSSU5UCTB4MDAwMDA0MDAKKyNkZWZpbmUJREJHX1BPTEwJMHgwMDAwMDgwMAorCisjZGVmaW5lCURCR19EQUVNT04JMHgwMDAwMTAwMAorI2RlZmluZQlEQkdfRkFJTAkweDAwMDAyMDAwCisjZGVmaW5lIERCR19NT0RFTQkweDAwMDA0MDAwCisjZGVmaW5lCURCR19MSVNUCTB4MDAwMDgwMDAKKworI2RlZmluZQlEQkdfUk9VVEUJMHgwMDAxMDAwMAorI2RlZmluZSBEQkdfVVRJTCAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBEQkdfQk9PVAkweDAwMDQwMDAwCisjZGVmaW5lIERCR19CVUZGRVIJMHgwMDA4MDAwMAorCisjZGVmaW5lCURCR19NT04JCTB4MDAxMDAwMDAKKyNkZWZpbmUgREJHX1NQRUNJQUwgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUJREJHX1ZQSVgJMHgwMDQwMDAwMAorI2RlZmluZQlEQkdfRkxVU0gJMHgwMDgwMDAwMAorCisjZGVmaW5lCURCR19RRU5BQkxFCTB4MDEwMDAwMDAKKworI2RlZmluZQlEQkdfQUxXQVlTCTB4ODAwMDAwMDAKKworI2VuZGlmIC8qIF9fcmlvX3Jpb3NwYWNlX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW90YWJsZS5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYjI2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3RhYmxlLmMKQEAgLTAsMCArMSwxMDQ0IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW90YWJsZS5jCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMDozMzo0NworKioJUmV0cmlldmVkCTogMTEvNi85OCAxMDozMzo1MAorKioKKyoqICBpZGVudCBAKCMpcmlvdGFibGUuYwkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW90YWJsZV9jX3NjY3NfID0gIkAoIylyaW90YWJsZS5jCTEuMiI7CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisKKworI2luY2x1ZGUgImxpbnV4X2NvbXBhdC5oIgorI2luY2x1ZGUgInJpb19saW51eC5oIgorI2luY2x1ZGUgInR5cGRlZi5oIgorI2luY2x1ZGUgInBrdC5oIgorI2luY2x1ZGUgImRhZW1vbi5oIgorI2luY2x1ZGUgInJpby5oIgorI2luY2x1ZGUgInJpb3NwYWNlLmgiCisjaW5jbHVkZSAidG9wLmgiCisjaW5jbHVkZSAiY21kcGt0LmgiCisjaW5jbHVkZSAibWFwLmgiCisjaW5jbHVkZSAicmlvdHlwZXMuaCIKKyNpbmNsdWRlICJydXAuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAicmlvZHJ2ci5oIgorI2luY2x1ZGUgInJpb2luZm8uaCIKKyNpbmNsdWRlICJmdW5jLmgiCisjaW5jbHVkZSAiZXJyb3JzLmgiCisjaW5jbHVkZSAicGNpLmgiCisKKyNpbmNsdWRlICJwYXJtbWFwLmgiCisjaW5jbHVkZSAidW5peHJ1cC5oIgorI2luY2x1ZGUgImJvYXJkLmgiCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAicGhiLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgImNtZGJsay5oIgorI2luY2x1ZGUgInJvdXRlLmgiCisjaW5jbHVkZSAiY29udHJvbC5oIgorI2luY2x1ZGUgImNpcnJ1cy5oIgorI2luY2x1ZGUgInJpb2lvY3RsLmgiCisjaW5jbHVkZSAicGFyYW0uaCIKKyNpbmNsdWRlICJsaXN0LmgiCisjaW5jbHVkZSAic2FtLmgiCisjaW5jbHVkZSAicHJvdHN0cy5oIgorCisvKgorKiogQSBjb25maWd1cmF0aW9uIHRhYmxlIGhhcyBiZWVuIGxvYWRlZC4gSXQgaXMgbm93IHVwIHRvIHVzCisqKiB0byBzb3J0IGl0IG91dCBhbmQgdXNlIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgdGhlcmVpbi4KKyovCitpbnQKK1JJT05ld1RhYmxlKHApCitzdHJ1Y3QgcmlvX2luZm8gKglwOworeworCWludCBIb3N0LCBIb3N0MSwgSG9zdDIsIE5hbWVJc1VuaXF1ZSwgRW50cnksIFN1YkVudDsKKwlzdHJ1Y3QgTWFwICpNYXBQOworCXN0cnVjdCBNYXAgKkhvc3RNYXBQOworCXN0cnVjdCBIb3N0ICpIb3N0UDsKKworCWNoYXIgKmNwdHI7CisKKwkvKgorCSoqIFdlIGhhdmUgYmVlbiBzZW50IGEgbmV3IHRhYmxlIHRvIGluc3RhbGwuIFdlIG5lZWQgdG8gYnJlYWsKKwkqKiBpdCBkb3duIGludG8gbGl0dGxlIGJpdHMgYW5kIHNwcmVhZCBpdCBhcm91bmQgYSBiaXQgdG8gc2VlCisJKiogd2hhdCB3ZSBoYXZlIGdvdC4KKwkqLworCS8qCisJKiogVGhpbmdzIHRvIGNoZWNrOgorCSoqICh0aGluZ3MgbWFya2VkICd4eCcgYXJlbid0IGNoZWNrZWQgYW55IG1vcmUhKQorCSoqICgxKQlUaGF0IHRoZXJlIGFyZSBubyBib290ZWQgSG9zdHMvUlRBcyBvdXQgdGhlcmUuCisJKiogKDIpCVRoYXQgdGhlIG5hbWVzIGFyZSBwcm9wZXJseSBmb3JtZWQKKwkqKiAoMykJVGhhdCBibGFuayBlbnRyaWVzIHJlYWxseSBhcmUuCisJKiogeHggKDQpCVRoYXQgaG9zdHMgbWVudGlvbmVkIGluIHRoZSB0YWJsZSBhY3R1YWxseSBleGlzdC4geHgKKwkqKiAoNSkJVGhhdCB0aGUgSURzIGFyZSB1bmlxdWUgKHBlciBob3N0KS4KKwkqKiAoNikJVGhhdCBob3N0IElEcyBhcmUgemVybworCSoqICg3KQlUaGF0IHBvcnQgbnVtYmVycyBhcmUgdmFsaWQKKwkqKiAoOCkJVGhhdCBwb3J0IG51bWJlcnMgYXJlbid0IGR1cGxpY2F0ZWQKKwkqKiAoOSkJVGhhdCBuYW1lcyBhcmVuJ3QgZHVwbGljYXRlZAorCSoqIHh4ICgxMCkgVGhhdCBob3N0cyB0aGF0IGFjdHVhbGx5IGV4aXN0IGFyZSBtZW50aW9uZWQgaW4gdGhlIHRhYmxlLiB4eAorCSovCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZygxKVxuIik7IAorCWlmICggcC0+UklPU3lzdGVtVXAgKSB7CQkvKiAoMSkgKi8KKwkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX0hBU19BTFJFQURZX0JFRU5fQk9PVEVEOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXAtPlJJT0Vycm9yLkVycm9yID0gTk9USElOR19XUk9OR19BVF9BTEw7CisJcC0+UklPRXJyb3IuRW50cnkgPSAtMTsKKwlwLT5SSU9FcnJvci5PdGhlciA9IC0xOworCisJZm9yICggRW50cnk9MDsgRW50cnk8VE9UQUxfTUFQX0VOVFJJRVM7IEVudHJ5KysgKSB7CisJCU1hcFAgPSAmcC0+UklPQ29ubmVjdFRhYmxlW0VudHJ5XTsKKwkJaWYgKChNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKSA9PSAwKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDIpXG4iKTsKKwkJCWNwdHIgPSBNYXBQLT5OYW1lOwkJLyogKDIpICovCisJCQljcHRyW01BWF9OQU1FX0xFTi0xXT0nXDAnOworCQkJaWYgKCBjcHRyWzBdPT0nXDAnICkgeworCQkJCWJjb3B5KE1hcFAtPlJ0YVVuaXF1ZU51bT8iUlRBCU5OIjoiSE9TVCBOTiIsTWFwUC0+TmFtZSw4KTsKKwkJCQlNYXBQLT5OYW1lWzVdID0gJzAnK0VudHJ5LzEwOworCQkJCU1hcFAtPk5hbWVbNl0gPSAnMCcrRW50cnklMTA7CisJCQl9CisJCQl3aGlsZSAoICpjcHRyICkgeworCQkJCWlmICggKmNwdHI8JyAnIHx8ICpjcHRyPid+JyApIHsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBCQURfQ0hBUkFDVEVSX0lOX05BTUU7CisJCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CisJCQkJCXJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCWNwdHIrKzsKKwkJCX0KKwkJfQorCisJCS8qCisJCSoqIElmIHRoZSBlbnRyeSBzYXZlZCB3YXMgYSB0ZW50YXRpdmUgZW50cnkgdGhlbiBqdXN0IGZvcmdldAorCQkqKiBhYm91dCBpdC4KKwkJKi8KKwkJaWYgKCBNYXBQLT5GbGFncyAmIFNMT1RfVEVOVEFUSVZFICkgeworCQkJTWFwUC0+SG9zdFVuaXF1ZU51bSA9IDA7CisJCQlNYXBQLT5SdGFVbmlxdWVOdW0gPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDMpXG4iKTsKKwkJaWYgKCAhTWFwUC0+UnRhVW5pcXVlTnVtICYmICFNYXBQLT5Ib3N0VW5pcXVlTnVtICkgeyAvKiAoMykgKi8KKwkJCWlmICggTWFwUC0+SUQgfHwgTWFwUC0+U3lzUG9ydCB8fCBNYXBQLT5GbGFncyApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiJXMgcHJldGVuZGluZyB0byBiZSBlbXB0eSBidXQgaXNuJ3RcbiIsTWFwUC0+TmFtZSk7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBUQUJMRV9FTlRSWV9JU05UX1BST1BFUkxZX05VTEw7CisJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJfQorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIiFSSU86IERhZW1vbjogdGVzdCAoMykgcGFzc2VzXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg0KVxuIik7CisJCWZvciAoIEhvc3Q9MDsgSG9zdDxwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkgeyAvKiAoNCkgKi8KKwkJCWlmICggcC0+UklPSG9zdHNbSG9zdF0uVW5pcXVlTnVtPT1NYXBQLT5Ib3N0VW5pcXVlTnVtICkgeworCQkJCUhvc3RQID0gJnAtPlJJT0hvc3RzW0hvc3RdOworCQkJCS8qCisJCQkJKiogaGF2aW5nIGRvbmUgdGhlIGxvb2t1cCwgd2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gZG8KKwkJCQkqKiBpdCBhZ2Fpbiwgc28gaGFuZyB0aGUgaG9zdCBudW1iZXIgaW4gYSBzYWZlIHBsYWNlCisJCQkJKi8KKwkJCQlNYXBQLT5Ub3BvbG9neVswXS5Vbml0ID0gSG9zdDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICggSG9zdCA+PSBwLT5SSU9OdW1Ib3N0cyApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgJXMgaGFzIHVua25vd24gaG9zdCB1bmlxdWUgbnVtYmVyIDB4JXhcbiIsCisJCQkJCQkJCQlNYXBQLT5OYW1lLCBNYXBQLT5Ib3N0VW5pcXVlTnVtKTsKKwkJCU1hcFAtPkhvc3RVbmlxdWVOdW0gPSAwOworCQkJLyogTWFwUC0+UnRhVW5pcXVlTnVtCT0gMDsgKi8KKwkJCS8qIE1hcFAtPklECQkJPSAwOyAqLworCQkJLyogTWFwUC0+RmxhZ3MJCSA9IDA7ICovCisJCQkvKiBNYXBQLT5TeXNQb3J0CQkgPSAwOyAqLworCQkJLyogTWFwUC0+TmFtZVswXQkJID0gMDsgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg1KVxuIik7IAorCQlpZiAoIE1hcFAtPlJ0YVVuaXF1ZU51bSApIHsgLyogKDUpICovCisJCQlpZiAoICFNYXBQLT5JRCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPOiBSVEEgJXMgaGFzIGJlZW4gYWxsb2NhdGVkIGFuIElEIG9mIHplcm8hXG4iLAorCQkJCQkJCU1hcFAtPk5hbWUpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yCQkgPSBaRVJPX1JUQV9JRDsKKwkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisJCQlpZiAoIE1hcFAtPklEID4gTUFYX1JVUCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPOiBSVEEgJXMgaGFzIGJlZW4gYWxsb2NhdGVkIGFuIGludmFsaWQgSUQgJWRcbiIsCisJCQkJCQkJTWFwUC0+TmFtZSwgTWFwUC0+SUQpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gSURfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisJCQlmb3IgKCBTdWJFbnQ9MDsgU3ViRW50PEVudHJ5OyBTdWJFbnQrKyApIHsKKwkJCQlpZiAoIE1hcFAtPkhvc3RVbmlxdWVOdW0gPT0gCisJCQkJCQlwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5Ib3N0VW5pcXVlTnVtICYmIAorCQkJCQkJTWFwUC0+SUQgPT0gcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uSUQgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJEdXBsLiBJRCBudW1iZXIgYWxsb2NhdGVkIHRvIFJUQSAlcyBhbmQgUlRBICVzXG4iLAorCQkJCQkJCU1hcFAtPk5hbWUsIHAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLk5hbWUpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IERVUExJQ0FURURfUlRBX0lEOworCQkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCQlwLT5SSU9FcnJvci5PdGhlciA9IFN1YkVudDsKKwkJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJLyoKKwkJCQkqKiBJZiB0aGUgUnRhVW5pcXVlTnVtIGlzIHRoZSBzYW1lLCBpdCBtYXkgYmUgbG9va2luZyBhdCBib3RoCisJCQkJKiogZW50cmllcyBmb3IgYSAxNiBwb3J0IFJUQSwgc28gY2hlY2sgdGhlIGlkcworCQkJCSovCisJCQkJaWYgKChNYXBQLT5SdGFVbmlxdWVOdW0gPT0gCisJCQkJCQlwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5SdGFVbmlxdWVOdW0pCisJCQkJIAkJJiYgKE1hcFAtPklEMiAhPSBwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5JRCkpIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJUQSAlcyBoYXMgZHVwbGljYXRlIHVuaXF1ZSBudW1iZXJcbiIsTWFwUC0+TmFtZSk7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgJXMgaGFzIGR1cGxpY2F0ZSB1bmlxdWUgbnVtYmVyXG4iLAorCQkJCQkJCQkJCXAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLk5hbWUpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IERVUExJQ0FURV9VTklRVUVfTlVNQkVSOworCQkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCQlwLT5SSU9FcnJvci5PdGhlciA9IFN1YkVudDsKKwkJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQl9CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDdhKVxuIik7IAorCQkJLyogKDdhKSAqLworCQkJaWYgKChNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpJiYoTWFwUC0+U3lzUG9ydCAlIFBPUlRTX1BFUl9SVEEpKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlRUWSBQb3J0IG51bWJlciAlZC1SVEEgJXMgaXMgbm90IGEgbXVsdGlwbGUgb2YgJWQhXG4iLAorCQkJCQkoaW50KU1hcFAtPlN5c1BvcnQsTWFwUC0+TmFtZSwgUE9SVFNfUEVSX1JUQSk7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBUVFlfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDdiKVxuIik7IAorCQkJLyogKDdiKSAqLworCQkJaWYgKChNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpJiYoTWFwUC0+U3lzUG9ydCA+PSBSSU9fUE9SVFMpKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlRUWSBQb3J0IG51bWJlciAlZCBmb3IgUlRBICVzIGlzIHRvbyBiaWdcbiIsCisJCQkJCQkJKGludClNYXBQLT5TeXNQb3J0LCBNYXBQLT5OYW1lKTsKKwkJCQlwLT5SSU9FcnJvci5FcnJvciA9IFRUWV9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCX0KKwkJCWZvciAoIFN1YkVudD0wOyBTdWJFbnQ8RW50cnk7IFN1YkVudCsrICkgeworCQkJCWlmICggcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uRmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCApCisJCQkJCQljb250aW51ZTsKKwkJCQlpZiAoIHAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLlJ0YVVuaXF1ZU51bSApIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg4KVxuIik7IAorCQkJCQkvKiAoOCkgKi8KKwkJCQkJaWYgKCAoTWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUKSAmJiAoTWFwUC0+U3lzUG9ydCA9PSAKKwkJCQkJCQkJCXAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLlN5c1BvcnQpICkgeworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJUQSAlczpzYW1lIFRUWSBwb3J0ICMgYXMgUlRBICVzICglZClcbiIsCisJCQkJCQkJTWFwUC0+TmFtZSwgcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uTmFtZSwKKwkJCQkJCQkoaW50KU1hcFAtPlN5c1BvcnQpOworCQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBUVFlfTlVNQkVSX0lOX1VTRTsKKwkJCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CisJCQkJCQlwLT5SSU9FcnJvci5PdGhlciA9IFN1YkVudDsKKwkJCQkJCXJldHVybiAtRU5YSU87CisJCQkJCX0KKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg5KVxuIik7IAorCQkJCQlpZiAoc3RyY21wKE1hcFAtPk5hbWUsCisJCQkJCQkJcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uTmFtZSk9PTAgJiYgIShNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKSkgeyAvKiAoOSkgKi8KKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgbmFtZSAlcyB1c2VkIHR3aWNlXG4iLCBNYXBQLT5OYW1lKTsKKwkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gTkFNRV9VU0VEX1RXSUNFOworCQkJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKKwkJCQkJCXAtPlJJT0Vycm9yLk90aGVyID0gU3ViRW50OworCQkJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIHsgLyogKDYpICovCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDYpXG4iKTsgCisJCQlpZiAoIE1hcFAtPklEICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU86SE9TVCAlcyBoYXMgYmVlbiBhbGxvY2F0ZWQgSUQgdGhhdCBpc24ndCB6ZXJvIVxuIiwKKwkJCQkJTWFwUC0+TmFtZSk7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX0lEX05PVF9aRVJPOworCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCX0KKwkJCWlmICggTWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU86IEhPU1QgJXMgaGFzIGJlZW4gYWxsb2NhdGVkIHBvcnQgbnVtYmVycyFcbiIsCisJCQkJCU1hcFAtPk5hbWUpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9TWVNQT1JUX0JBRDsKKwkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSoqIHdvdyEgaWYgd2UgZ2V0IGhlcmUgdGhlbiBpdCdzIGEgZ29vZHkhCisJKi8KKworCS8qCisJKiogWmVybyB0aGUgKG9sZCkgZW50cmllcyBmb3IgZWFjaCBob3N0Li4uCisJKi8KKwlmb3IgKCBIb3N0PTA7IEhvc3Q8UklPX0hPU1RTOyBIb3N0KysgKSB7CisJCWZvciAoIEVudHJ5PTA7IEVudHJ5PE1BWF9SVVA7IEVudHJ5KysgKSB7CisJCQliemVybygoY2FkZHJfdCkmcC0+UklPSG9zdHNbSG9zdF0uTWFwcGluZ1tFbnRyeV0sIAorCQkJCQkJCQkJCQlzaXplb2Yoc3RydWN0IE1hcCkpOworCQl9CisJCWJ6ZXJvKChjYWRkcl90KSZwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lWzBdLAorCQkJCQkJCQlzaXplb2YocC0+UklPSG9zdHNbSG9zdF0uTmFtZSkgKTsKKwl9CisKKwkvKgorCSoqIENvcHkgaW4gdGhlIG5ldyB0YWJsZSBlbnRyaWVzCisJKi8KKwlmb3IgKCBFbnRyeT0wOyBFbnRyeTwgVE9UQUxfTUFQX0VOVFJJRVM7IEVudHJ5KysgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogQ29weSB0YWJsZSBmb3IgSG9zdCBlbnRyeSAlZFxuIiwgRW50cnkpOworCQlNYXBQID0gJnAtPlJJT0Nvbm5lY3RUYWJsZVtFbnRyeV07CisKKwkJLyoKKwkJKiogTm93LCBpZiBpdCBpcyBhbiBlbXB0eSBzbG90IGlnbm9yZSBpdCEKKwkJKi8KKwkJaWYgKCBNYXBQLT5Ib3N0VW5pcXVlTnVtPT0wICkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSoqIHdlIHNhdmVkIHRoZSBob3N0IG51bWJlciBlYXJsaWVyLCBzbyBncmFiIGl0IGJhY2sKKwkJKi8KKwkJSG9zdFAgPSAmcC0+UklPSG9zdHNbTWFwUC0+VG9wb2xvZ3lbMF0uVW5pdF07CisKKwkJLyoKKwkJKiogSWYgaXQgaXMgYSBob3N0LCB0aGVuIHdlIG9ubHkgbmVlZCB0byBmaWxsIGluIHRoZSBuYW1lIGZpZWxkLgorCQkqLworCQlpZiAoIE1hcFAtPklEPT0wICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkhvc3QgZW50cnkgZm91bmQuIE5hbWUgJXNcbiIsIE1hcFAtPk5hbWUpOworCQkJYmNvcHkoTWFwUC0+TmFtZSxIb3N0UC0+TmFtZSxNQVhfTkFNRV9MRU4pOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkqKiBJdHMgYW4gUlRBIGVudHJ5LCBzbyBmaWxsIGluIHRoZSBob3N0IG1hcHBpbmcgZW50cmllcyBmb3IgaXQKKwkJKiogYW5kIHRoZSBwb3J0IG1hcHBpbmcgZW50cmllcy4gTm90aWNlIHRoYXQgZW50cnkgemVybyBpcyBmb3IKKwkJKiogSUQgb25lLgorCQkqLworCQlIb3N0TWFwUCA9ICZIb3N0UC0+TWFwcGluZ1tNYXBQLT5JRC0xXTsKKworCQlpZiAoTWFwUC0+RmxhZ3MgJiBTTE9UX0lOX1VTRSkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJ0YSBlbnRyeSBmb3VuZC4gTmFtZSAlc1xuIiwgTWFwUC0+TmFtZSk7CisJCQkvKgorCQkJKiogc3RydWN0dXJlIGFzc2lnbiwgdGhlbiBzb3J0IG91dCB0aGUgYml0cyB3ZSBzaG91bGRuJ3QgaGF2ZSBkb25lCisJCQkqLworCQkJKkhvc3RNYXBQID0gKk1hcFA7CisKKwkJCUhvc3RNYXBQLT5GbGFncyA9IFNMT1RfSU5fVVNFOworCQkJaWYgKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpCisJCQkJSG9zdE1hcFAtPkZsYWdzIHw9IFJUQTE2X1NFQ09ORF9TTE9UOworCisJCQlSSU9SZU1hcFBvcnRzKHAsIEhvc3RQLCBIb3N0TWFwUCApOworCQl9CisJCWVsc2UgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlRFTlRBVElWRSBSdGEgZW50cnkgZm91bmQuIE5hbWUgJXNcbiIsIE1hcFAtPk5hbWUpOworCQl9CisJfQorCisJZm9yICggRW50cnk9MDsgRW50cnk8IFRPVEFMX01BUF9FTlRSSUVTOyBFbnRyeSsrICkgeworCQlwLT5SSU9TYXZlZFRhYmxlW0VudHJ5XSA9IHAtPlJJT0Nvbm5lY3RUYWJsZVtFbnRyeV07CisJfQorCisJZm9yICggSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KysgKSB7CisJCWZvciAoIFN1YkVudD0wOyBTdWJFbnQ8TElOS1NfUEVSX1VOSVQ7IFN1YkVudCsrICkgeworCQkJcC0+UklPSG9zdHNbSG9zdF0uVG9wb2xvZ3lbU3ViRW50XS5Vbml0ID0gUk9VVEVfRElTQ09OTkVDVDsKKwkJCXAtPlJJT0hvc3RzW0hvc3RdLlRvcG9sb2d5W1N1YkVudF0uTGluayA9IE5PX0xJTks7CisJCX0KKwkJZm9yICggRW50cnk9MDsgRW50cnk8TUFYX1JVUDsgRW50cnkrKyApIHsKKwkJCWZvciAoIFN1YkVudD0wOyBTdWJFbnQ8TElOS1NfUEVSX1VOSVQ7IFN1YkVudCsrICkgeworCQkJCXAtPlJJT0hvc3RzW0hvc3RdLk1hcHBpbmdbRW50cnldLlRvcG9sb2d5W1N1YkVudF0uVW5pdCA9IAorCQkJCQkJCQlST1VURV9ESVNDT05ORUNUOworCQkJCXAtPlJJT0hvc3RzW0hvc3RdLk1hcHBpbmdbRW50cnldLlRvcG9sb2d5W1N1YkVudF0uTGluayA9IAorCQkJCQkJCQlOT19MSU5LOworCQkJfQorCQl9CisJCWlmICggIXAtPlJJT0hvc3RzW0hvc3RdLk5hbWVbMF0gKSB7CisJCQliY29weSgiSE9TVCAxIixwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lLDcpOworCQkJcC0+UklPSG9zdHNbSG9zdF0uTmFtZVs1XSArPSBIb3N0OworCQl9CisJCS8qCisJCSoqIENoZWNrIHRoYXQgZGVmYXVsdCBuYW1lIGFzc2lnbmVkIGlzIHVuaXF1ZS4KKwkJKi8KKwkJSG9zdDEgPSBIb3N0OworCQlOYW1lSXNVbmlxdWUgPSAwOworCQl3aGlsZSAoIU5hbWVJc1VuaXF1ZSkgeworCQkJTmFtZUlzVW5pcXVlID0gMTsKKwkJCWZvciAoIEhvc3QyPTA7IEhvc3QyPHAtPlJJT051bUhvc3RzOyBIb3N0MisrICkgeworCQkJCWlmIChIb3N0MiA9PSBIb3N0KQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoc3RyY21wKHAtPlJJT0hvc3RzW0hvc3RdLk5hbWUsIHAtPlJJT0hvc3RzW0hvc3QyXS5OYW1lKQorCQkJCQkJCQkJID09IDApIHsKKwkJCQkJTmFtZUlzVW5pcXVlID0gMDsKKwkJCQkJSG9zdDErKzsKKwkJCQkJaWYgKEhvc3QxID49IHAtPlJJT051bUhvc3RzKQorCQkJCQkJSG9zdDEgPSAwOworCQkJCQlwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lWzVdID0gJzEnICsgSG9zdDE7CisJCQkJfQorCQkJfQorCQl9CisJCS8qCisJCSoqIFJlbmFtZSBob3N0IGlmIG5hbWUgYWxyZWFkeSB1c2VkLgorCQkqLworCQlpZiAoSG9zdDEgIT0gSG9zdCkKKwkJeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkRlZmF1bHQgbmFtZSAlcyBhbHJlYWR5IHVzZWRcbiIsIHAtPlJJT0hvc3RzW0hvc3RdLk5hbWUpOworCQkJYmNvcHkoIkhPU1QgMSIscC0+UklPSG9zdHNbSG9zdF0uTmFtZSw3KTsKKwkJCXAtPlJJT0hvc3RzW0hvc3RdLk5hbWVbNV0gKz0gSG9zdDE7CisJCX0KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkFzc2lnbmluZyBkZWZhdWx0IG5hbWUgJXNcbiIsIHAtPlJJT0hvc3RzW0hvc3RdLk5hbWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyoqIFVzZXIgcHJvY2VzcyBuZWVkcyB0aGUgY29uZmlnIHRhYmxlIC0gYnVpbGQgaXQgZnJvbSBmaXJzdAorKiogcHJpbmNpcGxlcy4KKyovCitpbnQKK1JJT0FwZWwocCkKK3N0cnVjdCByaW9faW5mbyAqCXA7Cit7CisJaW50IEhvc3Q7CisJaW50IGxpbms7CisJaW50IFJ1cDsKKwlpbnQgTmV4dCA9IDA7CisJc3RydWN0IE1hcCAqTWFwUDsKKwlzdHJ1Y3QgSG9zdCAqSG9zdFA7CisJbG9uZyBvbGRzcGw7CisKKwlkaXNhYmxlKG9sZHNwbCk7CQkvKiBzdHJhbmdlIGJ1dCB0cnVlISAqLworIAorCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJHZW5lcmF0aW5nIGEgdGFibGUgdG8gcmV0dXJuIHRvIGNvbmZpZy5yaW9cbiIpOworCisJYnplcm8oKGNhZGRyX3QpJnAtPlJJT0Nvbm5lY3RUYWJsZVswXSwgCisJCQkJCXNpemVvZihzdHJ1Y3QgTWFwKSAqIFRPVEFMX01BUF9FTlRSSUVTICk7CisKKwlmb3IgKCBIb3N0PTA7IEhvc3Q8UklPX0hPU1RTOyBIb3N0KysgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJQcm9jZXNzaW5nIGhvc3QgJWRcbiIsIEhvc3QpOworCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tIb3N0XTsKKwkJTWFwUCA9ICZwLT5SSU9Db25uZWN0VGFibGVbTmV4dCsrXTsKKwkJTWFwUC0+SG9zdFVuaXF1ZU51bSA9IEhvc3RQLT5VbmlxdWVOdW07CisJCWlmICggKEhvc3RQLT5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORyApCisJCQljb250aW51ZTsKKwkJTWFwUC0+UnRhVW5pcXVlTnVtID0gMDsKKwkJTWFwUC0+SUQgPSAwOworCQlNYXBQLT5GbGFncyA9IFNMT1RfSU5fVVNFOworCQlNYXBQLT5TeXNQb3J0ID0gTk9fUE9SVDsKKwkJZm9yICggbGluaz0wOyBsaW5rPExJTktTX1BFUl9VTklUOyBsaW5rKysgKQorCQkJTWFwUC0+VG9wb2xvZ3lbbGlua10gPSBIb3N0UC0+VG9wb2xvZ3lbbGlua107CisJCWJjb3B5KEhvc3RQLT5OYW1lLE1hcFAtPk5hbWUsTUFYX05BTUVfTEVOKTsKKwkJZm9yICggUnVwPTA7IFJ1cDxNQVhfUlVQOyBSdXArKyApIHsKKwkJCWlmICggSG9zdFAtPk1hcHBpbmdbUnVwXS5GbGFncyAmIChTTE9UX0lOX1VTRXxTTE9UX1RFTlRBVElWRSkgKSB7CisJCQkJcC0+UklPQ29ubmVjdFRhYmxlW05leHRdID0gSG9zdFAtPk1hcHBpbmdbUnVwXTsKKwkJCQlpZiAoIEhvc3RQLT5NYXBwaW5nW1J1cF0uRmxhZ3MgJiBTTE9UX0lOX1VTRSkKKwkJCQkJcC0+UklPQ29ubmVjdFRhYmxlW05leHRdLkZsYWdzIHw9IFNMT1RfSU5fVVNFOworCQkJCWlmICggSG9zdFAtPk1hcHBpbmdbUnVwXS5GbGFncyAmIFNMT1RfVEVOVEFUSVZFKQorCQkJCQlwLT5SSU9Db25uZWN0VGFibGVbTmV4dF0uRmxhZ3MgfD0gU0xPVF9URU5UQVRJVkU7CisJCQkJaWYgKCBIb3N0UC0+TWFwcGluZ1tSdXBdLkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QgKQorCQkJCQlwLT5SSU9Db25uZWN0VGFibGVbTmV4dF0uRmxhZ3MgfD0gUlRBMTZfU0VDT05EX1NMT1Q7CisJCQkJTmV4dCsrOworCQkJfQorCQl9CisJfQorCXJlc3RvcmUob2xkc3BsKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyoqIGNvbmZpZy5yaW8gaGFzIHRha2VuIGEgZGlzbGlrZSB0byBvbmUgb2YgdGhlIGdyb3NzIG1hcHMgZW50cmllcy4KKyoqIGlmIHRoZSBlbnRyeSBpcyBzdWl0YWJseSBpbmFjdGl2ZSwgdGhlbiB3ZSBjYW4gZ29iIG9uIGl0IGFuZCByZW1vdmUKKyoqIGl0IGZyb20gdGhlIHRhYmxlLgorKi8KK2ludAorUklPRGVsZXRlUnRhKHAsIE1hcFApCitzdHJ1Y3QgcmlvX2luZm8gKnA7CitzdHJ1Y3QgTWFwICpNYXBQOworeworCWludCBob3N0LCBlbnRyeSwgcG9ydCwgbGluazsKKwlpbnQgU3lzUG9ydDsKKwlzdHJ1Y3QgSG9zdCAqSG9zdFA7CisJc3RydWN0IE1hcCAqSG9zdE1hcFA7CisJc3RydWN0IFBvcnQgKlBvcnRQOworCWludCB3b3JrX2RvbmUgPSAwOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncywgc2VtX2ZsYWdzOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkRlbGV0ZSBlbnRyeSBvbiBob3N0ICV4LCBydGEgJXhcbiIsCisJCQkJCQkJCU1hcFAtPkhvc3RVbmlxdWVOdW0sIE1hcFAtPlJ0YVVuaXF1ZU51bSk7CisKKwlmb3IgKCBob3N0PTA7IGhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgaG9zdCsrICkgeworCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tob3N0XTsKKworCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoICZIb3N0UC0+SG9zdExvY2ssIGxvY2tfZmxhZ3MgKTsKKworCQlpZiAoIChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcgKSB7CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSG9zdFAtPkhvc3RMb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yICggZW50cnk9MDsgZW50cnk8TUFYX1JVUDsgZW50cnkrKyApIHsKKwkJCWlmICggTWFwUC0+UnRhVW5pcXVlTnVtID09IEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5SdGFVbmlxdWVOdW0gKSB7CisJCQkJSG9zdE1hcFAgPSAmSG9zdFAtPk1hcHBpbmdbZW50cnldOworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJGb3VuZCBlbnRyeSBvZmZzZXQgJWQgb24gaG9zdCAlc1xuIiwgCisJCQkJCQllbnRyeSwgSG9zdFAtPk5hbWUpOworCisJCQkJLyoKKwkJCQkqKiBDaGVjayBhbGwgZm91ciBsaW5rcyBvZiB0aGUgdW5pdCBhcmUgZGlzY29ubmVjdGVkCisJCQkJKi8KKwkJCQlmb3IgKCBsaW5rPTA7IGxpbms8IExJTktTX1BFUl9VTklUOyBsaW5rKysgKSB7CisJCQkJCWlmICggSG9zdE1hcFAtPlRvcG9sb2d5W2xpbmtdLlVuaXQgIT0gUk9VVEVfRElTQ09OTkVDVCApIHsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJFbnRyeSBpcyBpbiB1c2UgYW5kIGNhbm5vdCBiZSBkZWxldGVkIVxuIik7CisJCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IFVOSVRfSVNfSU5fVVNFOworCQkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZIb3N0UC0+SG9zdExvY2ssIGxvY2tfZmxhZ3MpOworCQkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKgorCQkJCSoqIFNsb3QgaGFzIGJlZW4gYWxsb2NhdGVkLCBCVVQgbm90IGJvb3RlZC9yb3V0ZWQvCisJCQkJKiogY29ubmVjdGVkL3NlbGVjdGVkIG9yIGFueXRoaW5nIGVsc2UtZWQKKwkJCQkqLworCQkJCVN5c1BvcnQgPSBIb3N0TWFwUC0+U3lzUG9ydDsKKworCQkJCWlmICggU3lzUG9ydCAhPSBOT19QT1JUICkgeworCQkJCQlmb3IgKHBvcnQ9U3lzUG9ydDsgcG9ydCA8IFN5c1BvcnQrUE9SVFNfUEVSX1JUQTsgcG9ydCsrKSB7CisJCQkJCQlQb3J0UCA9IHAtPlJJT1BvcnRwW3BvcnRdOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlVubWFwIHBvcnRcbiIpOworCisJCQkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoICZQb3J0UC0+cG9ydFNlbSwgc2VtX2ZsYWdzICk7CisKKwkJCQkJCVBvcnRQLT5NYXBwZWQgPSAwOworCisJCQkJCQlpZiAoIFBvcnRQLT5TdGF0ZSAmIChSSU9fTU9QRU58UklPX0xPUEVOKSApIHsKKworCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJHb2Igb24gcG9ydFxuIik7CisJCQkJCQkJUG9ydFAtPlR4QnVmZmVySW4gPSBQb3J0UC0+VHhCdWZmZXJPdXQgPSAwOworCQkJCQkJCS8qIFdoYXQgc2hvdWxkIEkgZG8gCisJCQkJCQkJd2FrZXVwKCAmUG9ydFAtPlR4QnVmZmVySW4gKTsKKwkJCQkJCQl3YWtldXAoICZQb3J0UC0+VHhCdWZmZXJPdXQpOworCQkJCQkJCSovCisJCQkJCQkJUG9ydFAtPkluVXNlID0gTk9UX0lOVVNFOworCQkJCQkJCS8qIFdoYXQgc2hvdWxkIEkgZG8gCisJCQkJCQkJd2FrZXVwKCAmUG9ydFAtPkluVXNlICk7CisJCQkJCQkJc2lnbmFsKFBvcnRQLT5UdHlQLT50X3BncnAsU0lHS0lMTCk7CisJCQkJCQkJdHR5Zmx1c2goUG9ydFAtPlR0eVAsKEZSRUFEfEZXUklURSkpOworCQkJCQkJCSovCisJCQkJCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19DTE9TSU5HIHwgUklPX0RFTEVURUQ7CisJCQkJCQl9CisKKwkJCQkJCS8qCisJCQkJCQkqKiBGb3IgdGhlIHNlY29uZCBzbG90IG9mIGEgMTYgcG9ydCBSVEEsIHRoZQorCQkJCQkJKiogZHJpdmVyIG5lZWRzIHRvIHJlc2V0IHRoZSBjaGFuZ2VzIG1hZGUgdG8KKwkJCQkJCSoqIHRoZSBwaGIgdG8gcG9ydCBtYXBwaW5ncyBpbiBSSU9Sb3V0ZVJ1cC4KKwkJCQkJCSovCisJCQkJCQlpZiAoUG9ydFAtPlNlY29uZEJsb2NrKSB7CisJCQkJCQkJdXNob3J0IGRlc3RfdW5pdCA9IEhvc3RNYXBQLT5JRDsKKwkJCQkJCQl1c2hvcnQgZGVzdF9wb3J0ID0gcG9ydCAtIFN5c1BvcnQ7CisJCQkJCQkJV09SRAkgKlR4UGt0UDsKKwkJCQkJCQlQS1QJKlBrdDsKKworCQkJCQkJCWZvciAoVHhQa3RQID0gUG9ydFAtPlR4U3RhcnQ7CisJCQkJCQkJCVR4UGt0UCA8PSBQb3J0UC0+VHhFbmQ7IFR4UGt0UCsrKSB7CisJCQkJCQkJCS8qCisJCQkJCQkJCSoqICpUeFBrdFAgaXMgdGhlIHBvaW50ZXIgdG8gdGhlCisJCQkJCQkJCSoqIHRyYW5zbWl0IHBhY2tldCBvbiB0aGUgaG9zdCBjYXJkLgorCQkJCQkJCQkqKiBUaGlzIG5lZWRzIHRvIGJlIHRyYW5zbGF0ZWQgaW50bworCQkJCQkJCQkqKiBhIDMyIGJpdCBwb2ludGVyIHNvIGl0IGNhbiBiZQorCQkJCQkJCQkqKiBhY2Nlc3NlZCBmcm9tIHRoZSBkcml2ZXIuCisJCQkJCQkJCSovCisJCQkJCQkJCVBrdCA9IChQS1QgKikgUklPX1BUUihIb3N0UC0+Q2FkZHIsCisJCQkJCQkJCSAJUldPUkQoKlR4UGt0UCkpOworCQkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAKKwkJCQkJCSJUeCBwYWNrZXQgKCV4KSBkZXN0aW5hdGlvbjogT2xkICV4OiV4IE5ldyAleDoleFxuIiwKKwkJCQkJCQkJICpUeFBrdFAsIFBrdC0+ZGVzdF91bml0LAorCQkJCQkJCQkgUGt0LT5kZXN0X3BvcnQsIGRlc3RfdW5pdCwgZGVzdF9wb3J0KTsKKwkJCQkJCQkJV1dPUkQoUGt0LT5kZXN0X3VuaXQsIGRlc3RfdW5pdCk7CisJCQkJCQkJCVdXT1JEKFBrdC0+ZGVzdF9wb3J0LCBkZXN0X3BvcnQpOworCQkJCQkJCX0KKwkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAKKwkJCQkJCSJQb3J0ICVkIHBoYiBkZXN0aW5hdGlvbjogT2xkICV4OiV4IE5ldyAleDoleFxuIiwKKwkJCQkJCQkgcG9ydCwgUG9ydFAtPlBoYlAtPmRlc3RpbmF0aW9uICYgMHhmZiwKKwkJCQkJCQkgKFBvcnRQLT5QaGJQLT5kZXN0aW5hdGlvbiA+PiA4KSAmIDB4ZmYsCisJCQkJCQkJIGRlc3RfdW5pdCwgZGVzdF9wb3J0KTsKKwkJCQkJCQlXV09SRChQb3J0UC0+UGhiUC0+ZGVzdGluYXRpb24sCisJCQkJCQkJIGRlc3RfdW5pdCArIChkZXN0X3BvcnQgPDwgOCkpOworCQkJCQkJfQorCQkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBzZW1fZmxhZ3MpOworCQkJCQl9CisJCQkJfQorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJFbnRyeSBudWxsZWQuXG4iKTsKKwkJCQliemVybygoY2hhciAqKUhvc3RNYXBQLHNpemVvZihzdHJ1Y3QgTWFwKSk7CisJCQkJd29ya19kb25lKys7CisJCQl9CisJCX0KKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkhvc3RQLT5Ib3N0TG9jaywgbG9ja19mbGFncyk7CisJfQorCisJLyogWFhYWFggbG9jayBtZSB1cCAqLworCWZvciAoIGVudHJ5PTA7IGVudHJ5PCBUT1RBTF9NQVBfRU5UUklFUzsgZW50cnkrKyApIHsKKwkJaWYgKCBwLT5SSU9TYXZlZFRhYmxlW2VudHJ5XS5SdGFVbmlxdWVOdW0gPT0gTWFwUC0+UnRhVW5pcXVlTnVtICkgeworCQkJYnplcm8oKGNoYXIgKikmcC0+UklPU2F2ZWRUYWJsZVtlbnRyeV0sc2l6ZW9mKHN0cnVjdCBNYXApKTsKKwkJCXdvcmtfZG9uZSsrOworCQl9CisJCWlmICggcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5SdGFVbmlxdWVOdW0gPT0gTWFwUC0+UnRhVW5pcXVlTnVtICkgeworCQkJYnplcm8oKGNoYXIgKikmcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XSxzaXplb2Yoc3RydWN0IE1hcCkpOworCQkJd29ya19kb25lKys7CisJCX0KKwl9CisJaWYgKCB3b3JrX2RvbmUgKQorCQlyZXR1cm4gMDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJDb3VsZG4ndCBmaW5kIGVudHJ5IHRvIGJlIGRlbGV0ZWRcbiIpOworCXAtPlJJT0Vycm9yLkVycm9yID0gQ09VTEROVF9GSU5EX0VOVFJZOworCXJldHVybiAtRU5YSU87Cit9CisKK2ludCBSSU9Bc3NpZ25SdGEoIHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IE1hcCAqTWFwUCApCit7CisgICAgaW50IGhvc3Q7CisgICAgc3RydWN0IE1hcCAqSG9zdE1hcFA7CisgICAgY2hhciAqc3B0cjsKKyAgICBpbnQJbGluazsKKworCisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkFzc2lnbiBlbnRyeSBvbiBob3N0ICV4LCBydGEgJXgsIElEICVkLCBTeXNwb3J0ICVkXG4iLAorCQkJCU1hcFAtPkhvc3RVbmlxdWVOdW0sTWFwUC0+UnRhVW5pcXVlTnVtLAorCQkJCU1hcFAtPklELCAoaW50KU1hcFAtPlN5c1BvcnQpOworCisgICAgaWYgKChNYXBQLT5JRCAhPSAodXNob3J0KS0xKSAmJgorCSgoaW50KU1hcFAtPklEIDwgKGludCkxIHx8IChpbnQpTWFwUC0+SUQgPiBNQVhfUlVQICkpCisgICAgeworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJCYWQgSUQgaW4gbWFwIGVudHJ5IVxuIik7CisJcC0+UklPRXJyb3IuRXJyb3IgPSBJRF9OVU1CRVJfT1VUX09GX1JBTkdFOworCXJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoTWFwUC0+UnRhVW5pcXVlTnVtID09IDApCisgICAgeworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSdGEgVW5pcXVlIG51bWJlciB6ZXJvIVxuIik7CisJcC0+UklPRXJyb3IuRXJyb3IgPSBSVEFfVU5JUVVFX05VTUJFUl9aRVJPOworCXJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoIChNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpICYmIChNYXBQLT5TeXNQb3J0ICUgUE9SVFNfUEVSX1JUQSkgKQorICAgIHsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUG9ydCAlZCBub3QgbXVsdGlwbGUgb2YgJWQhXG4iLChpbnQpTWFwUC0+U3lzUG9ydCxQT1JUU19QRVJfUlRBKTsKKwlwLT5SSU9FcnJvci5FcnJvciA9IFRUWV9OVU1CRVJfT1VUX09GX1JBTkdFOworCXJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoIChNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpICYmIChNYXBQLT5TeXNQb3J0ID49IFJJT19QT1JUUykgKQorICAgIHsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUG9ydCAlZCBub3QgdmFsaWQhXG4iLChpbnQpTWFwUC0+U3lzUG9ydCk7CisJcC0+UklPRXJyb3IuRXJyb3IgPSBUVFlfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvKgorICAgICoqIENvcHkgdGhlIG5hbWUgYWNyb3NzIHRvIHRoZSBtYXAgZW50cnkuCisgICAgKi8KKyAgICBNYXBQLT5OYW1lW01BWF9OQU1FX0xFTi0xXSA9ICdcMCc7CisgICAgc3B0ciA9IE1hcFAtPk5hbWU7CisgICAgd2hpbGUgKCAqc3B0ciApCisgICAgeworICAgIGlmICggKnNwdHI8JyAnIHx8ICpzcHRyPid+JyApCisgICAgeworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJOYW1lIGVudHJ5IGNvbnRhaW5zIG5vbi1wcmludGluZyBjaGFyYWN0ZXJzIVxuIik7CisJcC0+UklPRXJyb3IuRXJyb3IgPSBCQURfQ0hBUkFDVEVSX0lOX05BTUU7CisJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHNwdHIrKzsKKyAgICB9CisKKyAgICBmb3IgKCBob3N0PTA7IGhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgaG9zdCsrICkKKyAgICB7CisJaWYgKCBNYXBQLT5Ib3N0VW5pcXVlTnVtID09IHAtPlJJT0hvc3RzW2hvc3RdLlVuaXF1ZU51bSApCisJeworCSAgICBpZiAoIChwLT5SSU9Ib3N0c1tob3N0XS5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORyApCisJICAgIHsKKwkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05PVF9SVU5OSU5HOworCQlyZXR1cm4gLUVOWElPOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgKiogTm93IHdlIGhhdmUgYSBob3N0IHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gSUQKKwkgICAgKiogaWYgdGhlIGVudHJ5IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBvbmUuCisJICAgICovCisJICAgIGlmIChNYXBQLT5JRCA9PSAodXNob3J0KS0xKQorCSAgICB7CisJCWludCBuTmV3SUQ7CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkF0dGVtcHRpbmcgdG8gZ2V0IGEgbmV3IElEIGZvciBydGEgXCIlc1wiXG4iLAorCQkgICAgICBNYXBQLT5OYW1lKTsKKwkJLyoKKwkJKiogVGhlIGlkZWEgaGVyZSBpcyB0byBhbGxvdyBSVEEncyB0byBiZSBhc3NpZ25lZAorCQkqKiBiZWZvcmUgdGhleSBhY3R1YWxseSBhcHBlYXIgb24gdGhlIG5ldHdvcmsuCisJCSoqIFRoaXMgYWxsb3dzIHRoZSBhZGRpdGlvbiBvZiBSVEEncyB3aXRob3V0IGhhdmluZworCQkqKiB0byBwbHVnIHRoZW0gaW4uCisJCSoqIFdoYXQgd2UgZG8gaXM6CisJCSoqICAtIEZpbmQgYSBmcmVlIElEIGFuZCBhbGxvY2F0ZSBpdCB0byB0aGUgUlRBLgorCQkqKiAgLSBJZiB0aGlzIG1hcCBlbnRyeSBpcyB0aGUgc2Vjb25kIGhhbGYgb2YgYQorCQkqKiAgICAxNiBwb3J0IGVudHJ5IHRoZW4gZmluZCB0aGUgb3RoZXIgaGFsZiBhbmQKKwkJKiogICAgbWFrZSBzdXJlIHRoZSAyIGNyb3NzIHJlZmVyZW5jZSBlYWNoIG90aGVyLgorCQkqLworCQlpZiAoUklPRmluZEZyZWVJRChwLCAmcC0+UklPSG9zdHNbaG9zdF0sICZuTmV3SUQsIE5VTEwpICE9IDApCisJCXsKKwkJICAgIHAtPlJJT0Vycm9yLkVycm9yID0gQ09VTEROVF9GSU5EX0VOVFJZOworCQkgICAgcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlNYXBQLT5JRCA9ICh1c2hvcnQpbk5ld0lEICsgMTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkFsbG9jYXRlZCBJRCAlZCBmb3IgdGhpcyBuZXcgUlRBLlxuIiwgTWFwUC0+SUQpOworCQlIb3N0TWFwUCA9ICZwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW25OZXdJRF07CisJCUhvc3RNYXBQLT5SdGFVbmlxdWVOdW0gPSBNYXBQLT5SdGFVbmlxdWVOdW07CisJCUhvc3RNYXBQLT5Ib3N0VW5pcXVlTnVtID0gTWFwUC0+SG9zdFVuaXF1ZU51bTsKKwkJSG9zdE1hcFAtPklEID0gTWFwUC0+SUQ7CisJCWZvciAobGluayA9IDA7IGxpbmsgPCBMSU5LU19QRVJfVU5JVDsgbGluaysrKQorCQl7CisJCSAgICBIb3N0TWFwUC0+VG9wb2xvZ3lbbGlua10uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7CisJCSAgICBIb3N0TWFwUC0+VG9wb2xvZ3lbbGlua10uTGluayA9IE5PX0xJTks7CisJCX0KKwkJaWYgKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpCisJCXsKKwkJICAgIGludCB1bml0OworCisJCSAgICBmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX1JVUDsgdW5pdCsrKQorCQkJaWYgKHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbdW5pdF0uUnRhVW5pcXVlTnVtID09CisJCQkgICAgTWFwUC0+UnRhVW5pcXVlTnVtKQorCQkJICAgIGJyZWFrOworCQkgICAgaWYgKHVuaXQgPT0gTUFYX1JVUCkKKwkJICAgIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09VTEROVF9GSU5EX0VOVFJZOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJICAgIH0KKwkJICAgIEhvc3RNYXBQLT5GbGFncyB8PSBSVEExNl9TRUNPTkRfU0xPVDsKKwkJICAgIEhvc3RNYXBQLT5JRDIgPSBNYXBQLT5JRDIgPSBwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW3VuaXRdLklEOworCQkgICAgcC0+UklPSG9zdHNbaG9zdF0uTWFwcGluZ1t1bml0XS5JRDIgPSBNYXBQLT5JRDsKKwkJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJDcm9zcyByZWZlcmVuY2VkIGlkICVkIHRvIElEICVkLlxuIiwKKwkJCSAgTWFwUC0+SUQsCisJCQkgIHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbdW5pdF0uSUQpOworCQl9CisJICAgIH0KKworCSAgICBIb3N0TWFwUCA9ICZwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW01hcFAtPklELTFdOworCisJICAgIGlmICggSG9zdE1hcFAtPkZsYWdzICYgU0xPVF9JTl9VU0UgKQorCSAgICB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJNYXAgdGFibGUgc2xvdCBmb3IgSUQgJWQgaXMgYWxyZWFkeSBpbiB1c2UuXG4iLCBNYXBQLT5JRCk7CisJCXAtPlJJT0Vycm9yLkVycm9yID0gSURfQUxSRUFEWV9JTl9VU0U7CisJCXJldHVybiAtRUJVU1k7CisJICAgIH0KKworCSAgICAvKgorCSAgICAqKiBBc3NpZ24gdGhlIHN5cyBwb3J0cyBhbmQgdGhlIG5hbWUsIGFuZCBtYXJrIHRoZSBzbG90IGFzCisJICAgICoqIGJlaW5nIGluIHVzZS4KKwkgICAgKi8KKwkgICAgSG9zdE1hcFAtPlN5c1BvcnQgPSBNYXBQLT5TeXNQb3J0OworCSAgICBpZiAoKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpID09IDApCisJICAgICAgQ0NPUFkoIE1hcFAtPk5hbWUsIEhvc3RNYXBQLT5OYW1lLCBNQVhfTkFNRV9MRU4gKTsKKwkgICAgSG9zdE1hcFAtPkZsYWdzID0gU0xPVF9JTl9VU0UgfCBSVEFfQk9PVEVEOworI2lmIE5FRURfVE9fRklYCisJICAgIFJJT19TVl9CUk9BRENBU1QocC0+UklPSG9zdHNbaG9zdF0uc3ZGbGFnc1tNYXBQLT5JRC0xXSk7CisjZW5kaWYKKwkgICAgaWYgKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpCisJCUhvc3RNYXBQLT5GbGFncyB8PSBSVEExNl9TRUNPTkRfU0xPVDsKKworCSAgICBSSU9SZU1hcFBvcnRzKCBwLCAmcC0+UklPSG9zdHNbaG9zdF0sIEhvc3RNYXBQICk7CisJICAgIC8qCisJICAgICoqIEFkanVzdCAybmQgYmxvY2sgb2YgOCBwaGJzCisJICAgICovCisJICAgIGlmIChNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKQorCQlSSU9GaXhQaGJzKHAsICZwLT5SSU9Ib3N0c1tob3N0XSwgSG9zdE1hcFAtPklEIC0gMSk7CisKKwkgICAgaWYgKCBIb3N0TWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUICkKKwkgICAgeworCQlpZiAoIEhvc3RNYXBQLT5TeXNQb3J0IDwgcC0+UklPRmlyc3RQb3J0c0Jvb3RlZCApCisJCSAgICBwLT5SSU9GaXJzdFBvcnRzQm9vdGVkID0gSG9zdE1hcFAtPlN5c1BvcnQ7CisJCWlmICggSG9zdE1hcFAtPlN5c1BvcnQgPiBwLT5SSU9MYXN0UG9ydHNCb290ZWQgKQorCQkgICAgcC0+UklPTGFzdFBvcnRzQm9vdGVkID0gSG9zdE1hcFAtPlN5c1BvcnQ7CisJICAgIH0KKwkgICAgaWYgKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpCisJICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiU2Vjb25kIG1hcCBvZiBSVEEgJXMgYWRkZWQgdG8gY29uZmlndXJhdGlvblxuIiwKKwkJIHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbTWFwUC0+SUQyIC0gMV0uTmFtZSk7CisJICAgIGVsc2UKKwkgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgJXMgYWRkZWQgdG8gY29uZmlndXJhdGlvblxuIiwgTWFwUC0+TmFtZSk7CisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisgICAgcC0+UklPRXJyb3IuRXJyb3IgPSBVTktOT1dOX0hPU1RfTlVNQkVSOworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJVbmtub3duIGhvc3QgJXhcbiIsIE1hcFAtPkhvc3RVbmlxdWVOdW0pOworICAgIHJldHVybiAtRU5YSU87Cit9CisKKworaW50CitSSU9SZU1hcFBvcnRzKHAsIEhvc3RQLCBIb3N0TWFwUCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgSG9zdCAqSG9zdFA7CitzdHJ1Y3QgTWFwICpIb3N0TWFwUDsgCit7CisJcmVnaXN0ZXIgc3RydWN0IFBvcnQgKlBvcnRQOworCXVpbnQgU3ViRW50OworCXVpbnQgSG9zdFBvcnQ7CisJdWludCBTeXNQb3J0OworCXVzaG9ydCBSdGFUeXBlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdFAoIEhvc3RQICk7CisJQ2hlY2tIb3N0TWFwUCggSG9zdE1hcFAgKTsKKyNlbmRpZgorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIk1hcHBpbmcgc3lzcG9ydCAlZCB0byBpZCAlZFxuIiwgKGludClIb3N0TWFwUC0+U3lzUG9ydCwgSG9zdE1hcFAtPklEKTsKKworCS8qCisJKiogV2UgbmVlZCB0byB0ZWxsIHRoZSBVbml4UnVwcyB3aGljaCBzeXNwb3J0IHRoZSBydXAgY29ycmVzcG9uZHMgdG8KKwkqLworCUhvc3RQLT5Vbml4UnVwc1tIb3N0TWFwUC0+SUQtMV0uQmFzZVN5c1BvcnQgPSBIb3N0TWFwUC0+U3lzUG9ydDsKKworCWlmICggSG9zdE1hcFAtPlN5c1BvcnQgPT0gTk9fUE9SVCApCisJCXJldHVybigwKTsKKworCVJ0YVR5cGUgPSBHZXRVbml0VHlwZShIb3N0TWFwUC0+UnRhVW5pcXVlTnVtKTsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiTWFwcGluZyBzeXNwb3J0ICVkLSVkXG4iLAorCQkJCShpbnQpSG9zdE1hcFAtPlN5c1BvcnQsIChpbnQpSG9zdE1hcFAtPlN5c1BvcnQrUE9SVFNfUEVSX1JUQS0xKTsKKworCS8qCisJKiogbm93IG1hcCBlYWNoIG9mIGl0cyBlaWdodCBwb3J0cworCSovCisJZm9yICggU3ViRW50PTA7IFN1YkVudDxQT1JUU19QRVJfUlRBOyBTdWJFbnQrKykgeworCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgInN1YmVudCA9ICVkLCBIb3N0TWFwUC0+U3lzUG9ydCA9ICVkXG4iLCAKKwkJICBTdWJFbnQsIChpbnQpSG9zdE1hcFAtPlN5c1BvcnQpOworCQlTeXNQb3J0ID0gSG9zdE1hcFAtPlN5c1BvcnQrU3ViRW50OwkJLyogcG9ydG51bWJlciB3aXRoaW4gc3lzdGVtICovCisJCQkJCS8qIHBvcnRudW1iZXIgb24gaG9zdCAqLworCQkKKwkJSG9zdFBvcnQgPSAoSG9zdE1hcFAtPklELTEpKlBPUlRTX1BFUl9SVEErU3ViRW50OyAKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiYzEgcCA9ICVwLCBwLT5yaW9Qb3J0cCA9ICVwXG4iLCBwLCBwLT5SSU9Qb3J0cCk7CisJCVBvcnRQID0gcC0+UklPUG9ydHBbU3lzUG9ydF07CisjaWYgMAorCQlQb3J0UC0+VHR5UAk9ICZwLT5jaGFubmVsW1N5c1BvcnRdOworI2VuZGlmCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJNYXAgcG9ydFxuIik7CisKKwkJLyoKKwkJKiogUG9pbnQgYXQgYWxsIHRoZSByZWFsIG5lYXQgZGF0YSBzdHJ1Y3R1cmVzCisJCSovCisJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJUG9ydFAtPkhvc3RQID0gSG9zdFA7CisJCVBvcnRQLT5DYWRkciA9IEhvc3RQLT5DYWRkcjsKKworCQkvKgorCQkqKiBUaGUgUGhiUCBjYW5ub3QgYmUgZmlsbGVkIGluIHlldAorCQkqKiB1bmxlc3MgdGhlIGhvc3QgaGFzIGJlZW4gYm9vdGVkCisJCSovCisJCWlmICgoSG9zdFAtPkZsYWdzICYgUlVOX1NUQVRFKSA9PSBSQ19SVU5OSU5HKSB7CisJCQlzdHJ1Y3QgUEhCICpQaGJQID0gUG9ydFAtPlBoYlAgPSAmSG9zdFAtPlBoYlBbSG9zdFBvcnRdOworCQkJUG9ydFAtPlR4QWRkID0oV09SRCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLFJXT1JEKFBoYlAtPnR4X2FkZCkpOworCQkJUG9ydFAtPlR4U3RhcnQgPShXT1JEICopUklPX1BUUihIb3N0UC0+Q2FkZHIsUldPUkQoUGhiUC0+dHhfc3RhcnQpKTsKKwkJCVBvcnRQLT5UeEVuZCA9KFdPUkQgKilSSU9fUFRSKEhvc3RQLT5DYWRkcixSV09SRChQaGJQLT50eF9lbmQpKTsKKwkJCVBvcnRQLT5SeFJlbW92ZT0oV09SRCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLAorCQkJCQkJCQkJUldPUkQoUGhiUC0+cnhfcmVtb3ZlKSk7CisJCQlQb3J0UC0+UnhTdGFydCA9KFdPUkQgKilSSU9fUFRSKEhvc3RQLT5DYWRkcixSV09SRChQaGJQLT5yeF9zdGFydCkpOworCQkJUG9ydFAtPlJ4RW5kID0oV09SRCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLFJXT1JEKFBoYlAtPnJ4X2VuZCkpOworCQl9CisJCWVsc2UKKwkJCVBvcnRQLT5QaGJQID0gTlVMTDsKKworCQkvKgorCQkqKiBwb3J0IHJlbGF0ZWQgZmxhZ3MKKwkJKi8KKwkJUG9ydFAtPkhvc3RQb3J0CT0gSG9zdFBvcnQ7CisJCS8qCisJCSoqIEZvciBlYWNoIHBhcnQgb2YgYSAxNiBwb3J0IFJUQSwgUnVwTnVtIGlzIElEIC0gMS4KKwkJKi8KKwkJUG9ydFAtPlJ1cE51bSA9IEhvc3RNYXBQLT5JRCAtIDE7CisJCWlmIChIb3N0TWFwUC0+RmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCkgeworCQkJUG9ydFAtPklEMgkJCSA9IEhvc3RNYXBQLT5JRDIgLSAxOworCQkJUG9ydFAtPlNlY29uZEJsb2NrCSA9IFRSVUU7CisJCX0KKwkJZWxzZSB7CisJCQlQb3J0UC0+SUQyCQkJID0gMDsKKwkJCVBvcnRQLT5TZWNvbmRCbG9jawkgPSBGQUxTRTsKKwkJfQorCQlQb3J0UC0+UnRhVW5pcXVlTnVtCT0gSG9zdE1hcFAtPlJ0YVVuaXF1ZU51bTsKKworCQkvKgorCQkqKiBJZiB0aGUgcG9ydCB3YXMgYWxyZWFkeSBtYXBwZWQgdGhlbiB0aGF0cyBhbGwgd2UgbmVlZCB0byBkby4KKwkJKi8KKwkJaWYgKFBvcnRQLT5NYXBwZWQpIHsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgSG9zdE1hcFAtPkZsYWdzICY9IH5SVEFfTkVXQk9PVDsKKworCQlQb3J0UC0+U3RhdGUJCSA9IDA7CisJCVBvcnRQLT5Db25maWcJCT0gMDsKKwkJLyoKKwkJKiogQ2hlY2sgb3V0IHRoZSBtb2R1bGUgdHlwZSAtIGlmIGl0IGlzIHNwZWNpYWwgKHJlYWQgb25seSBldGMuKQorCQkqKiB0aGVuIHdlIG5lZWQgdG8gc2V0IGZsYWdzIGluIHRoZSBQb3J0UC0+Q29uZmlnLgorCQkqKiBOb3RlOiBGb3IgMTYgcG9ydCBSVEEsIGFsbCBwb3J0cyBhcmUgb2YgdGhlIHNhbWUgdHlwZS4KKwkJKi8KKwkJaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikgeworCQkJUG9ydFAtPkNvbmZpZyB8PSBwLT5SSU9Nb2R1bGVUeXBlc1tIb3N0UC0+VW5peFJ1cHMKKwkJCQlbSG9zdE1hcFAtPklELTFdLk1vZFR5cGVzXS5GbGFnc1tTdWJFbnQgJSBQT1JUU19QRVJfTU9EVUxFXTsKKwkJfSBlbHNlIHsKKwkJCWlmICggU3ViRW50IDwgUE9SVFNfUEVSX01PRFVMRSApCisJCQkJUG9ydFAtPkNvbmZpZyB8PSBwLT5SSU9Nb2R1bGVUeXBlc1tMT05ZQkxFKEhvc3RQLT5Vbml4UnVwcworCQkJCVtIb3N0TWFwUC0+SUQtMV0uTW9kVHlwZXMpXS5GbGFnc1tTdWJFbnQgJSBQT1JUU19QRVJfTU9EVUxFXTsKKwkJCWVsc2UKKwkJCQlQb3J0UC0+Q29uZmlnIHw9IHAtPlJJT01vZHVsZVR5cGVzW0hJTllCTEUoSG9zdFAtPlVuaXhSdXBzCisJCQkJW0hvc3RNYXBQLT5JRC0xXS5Nb2RUeXBlcyldLkZsYWdzW1N1YkVudCAlIFBPUlRTX1BFUl9NT0RVTEVdOworCQl9CisKKwkJLyoKKwkJKiogbW9yZSBwb3J0IHJlbGF0ZWQgZmxhZ3MKKwkJKi8KKwkJUG9ydFAtPlBvcnRTdGF0ZQk9IDA7CisJCVBvcnRQLT5Nb2RlbUxpbmVzCT0gMDsKKwkJUG9ydFAtPk1vZGVtU3RhdGUJPSAwOworCQlQb3J0UC0+Q29va01vZGUJCT0gQ09PS19XRUxMOworCQlQb3J0UC0+UGFyYW1TZW0JCT0gMDsKKwkJUG9ydFAtPkZsdXNoQ21kQm9kZ2U9IDA7CisJCVBvcnRQLT5XZmx1c2hGbGFnCT0gMDsKKwkJUG9ydFAtPk1hZ2ljRmxhZ3MJPSAwOworCQlQb3J0UC0+TG9jawkJCT0gMDsKKwkJUG9ydFAtPlN0b3JlCQk9IDA7CisJCVBvcnRQLT5GaXJzdE9wZW4JPSAxOworCisJCS8qCisJCSoqIEJ1ZmZlcnMgJ24gdGhpbmdzCisJCSovCisJCVBvcnRQLT5SeERhdGFTdGFydAk9IDA7CisJCVBvcnRQLT5Db3IyQ29weQkgPSAwOworCQlQb3J0UC0+TmFtZQkJID0gJkhvc3RNYXBQLT5OYW1lWzBdOworI2lmZGVmIFNUQVRTCisJCWJ6ZXJvKCAoY2FkZHJfdCkmUG9ydFAtPlN0YXQsIHNpemVvZihzdHJ1Y3QgUklPU3RhdHMpICk7CisjZW5kaWYKKwkJUG9ydFAtPnN0YXRzR2F0aGVyID0gMDsKKwkJUG9ydFAtPnR4Y2hhcnMgPSAwOworCQlQb3J0UC0+cnhjaGFycyA9IDA7CisJCVBvcnRQLT5vcGVucyA9IDA7CisJCVBvcnRQLT5jbG9zZXMgPSAwOworCQlQb3J0UC0+aW9jdGxzID0gMDsKKwkJaWYgKCBQb3J0UC0+VHhSaW5nQnVmZmVyICkKKwkJCWJ6ZXJvKCBQb3J0UC0+VHhSaW5nQnVmZmVyLCBwLT5SSU9CdWZmZXJTaXplICk7CisJCWVsc2UgaWYgKCBwLT5SSU9CdWZmZXJTaXplICkgeworCQkJUG9ydFAtPlR4UmluZ0J1ZmZlciA9IHN5c2JyayhwLT5SSU9CdWZmZXJTaXplKTsKKwkJCWJ6ZXJvKCBQb3J0UC0+VHhSaW5nQnVmZmVyLCBwLT5SSU9CdWZmZXJTaXplICk7CisJCX0KKwkJUG9ydFAtPlR4QnVmZmVyT3V0CT0gMDsKKwkJUG9ydFAtPlR4QnVmZmVySW4JID0gMDsKKwkJUG9ydFAtPkRlYnVnCQk9IDA7CisJCS8qCisJCSoqIExhc3RSeFRnbCBzdG9yZXMgdGhlIHN0YXRlIG9mIHRoZSByeCB0b2dnbGUgYml0IGZvciB0aGlzCisJCSoqIHBvcnQsIHRvIGJlIGNvbXBhcmVkIHdpdGggdGhlIHN0YXRlIG9mIHRoZSBuZXh0IHBrdCByZWNlaXZlZC4KKwkJKiogSWYgdGhlIHNhbWUsIHdlIGhhdmUgcmVjZWl2ZWQgdGhlIHNhbWUgcnggcGt0IGZyb20gdGhlIFJUQQorCQkqKiB0d2ljZS4gSW5pdGlhbGlzZSB0byBhIHZhbHVlIG5vdCBlcXVhbCB0byBQSEJfUlhfVEdMIG9yIDAuCisJCSovCisJCVBvcnRQLT5MYXN0UnhUZ2wJPSB+KHVjaGFyKVBIQl9SWF9UR0w7CisKKwkJLyoKKwkJKiogYW5kIG1hcmsgdGhlIHBvcnQgYXMgdXNhYmxlCisJCSovCisJCVBvcnRQLT5NYXBwZWQgPSAxOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwl9CisJaWYgKCBIb3N0TWFwUC0+U3lzUG9ydCA8IHAtPlJJT0ZpcnN0UG9ydHNNYXBwZWQgKQorCQlwLT5SSU9GaXJzdFBvcnRzTWFwcGVkID0gSG9zdE1hcFAtPlN5c1BvcnQ7CisJaWYgKCBIb3N0TWFwUC0+U3lzUG9ydCA+IHAtPlJJT0xhc3RQb3J0c01hcHBlZCApCisJCXAtPlJJT0xhc3RQb3J0c01hcHBlZCA9IEhvc3RNYXBQLT5TeXNQb3J0OworCisJcmV0dXJuIDA7Cit9CisKK2ludAorUklPQ2hhbmdlTmFtZShwLCBNYXBQKQorc3RydWN0IHJpb19pbmZvICpwOworc3RydWN0IE1hcCogTWFwUDsgCit7CisJaW50IGhvc3Q7CisJc3RydWN0IE1hcCAqSG9zdE1hcFA7CisJY2hhciAqc3B0cjsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJDaGFuZ2UgbmFtZSBlbnRyeSBvbiBob3N0ICV4LCBydGEgJXgsIElEICVkLCBTeXNwb3J0ICVkXG4iLAorCQkJCQkJCQlNYXBQLT5Ib3N0VW5pcXVlTnVtLE1hcFAtPlJ0YVVuaXF1ZU51bSwKKwkJCQkJCQkJTWFwUC0+SUQsIChpbnQpTWFwUC0+U3lzUG9ydCk7CisKKwlpZiAoIE1hcFAtPklEID4gTUFYX1JVUCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkJhZCBJRCBpbiBtYXAgZW50cnkhXG4iKTsKKwkJcC0+UklPRXJyb3IuRXJyb3IgPSBJRF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlNYXBQLT5OYW1lW01BWF9OQU1FX0xFTi0xXSA9ICdcMCc7CisJc3B0ciA9IE1hcFAtPk5hbWU7CisKKwl3aGlsZSAoICpzcHRyICkgeworCQlpZiAoICpzcHRyPCcgJyB8fCAqc3B0cj4nficgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiTmFtZSBlbnRyeSBjb250YWlucyBub24tcHJpbnRpbmcgY2hhcmFjdGVycyFcbiIpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBCQURfQ0hBUkFDVEVSX0lOX05BTUU7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzcHRyKys7CisJfQorCisJZm9yICggaG9zdD0wOyBob3N0IDwgcC0+UklPTnVtSG9zdHM7IGhvc3QrKyApIHsKKwkJaWYgKCBNYXBQLT5Ib3N0VW5pcXVlTnVtID09IHAtPlJJT0hvc3RzW2hvc3RdLlVuaXF1ZU51bSApIHsKKwkJCWlmICggKHAtPlJJT0hvc3RzW2hvc3RdLkZsYWdzICYgUlVOX1NUQVRFKSAhPSBSQ19SVU5OSU5HICkgeworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OT1RfUlVOTklORzsKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJfQorCQkJaWYgKCBNYXBQLT5JRD09MCApIHsKKwkJCQlDQ09QWSggTWFwUC0+TmFtZSwgcC0+UklPSG9zdHNbaG9zdF0uTmFtZSwgTUFYX05BTUVfTEVOICk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCUhvc3RNYXBQID0gJnAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbTWFwUC0+SUQtMV07CisKKwkJCWlmICggSG9zdE1hcFAtPlJ0YVVuaXF1ZU51bSAhPSBNYXBQLT5SdGFVbmlxdWVOdW0gKSB7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBSVEFfTlVNQkVSX1dST05HOworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisJCQlDQ09QWSggTWFwUC0+TmFtZSwgSG9zdE1hcFAtPk5hbWUsIE1BWF9OQU1FX0xFTiApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcC0+UklPRXJyb3IuRXJyb3IgPSBVTktOT1dOX0hPU1RfTlVNQkVSOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJVbmtub3duIGhvc3QgJXhcbiIsIE1hcFAtPkhvc3RVbmlxdWVOdW0pOworCXJldHVybiAtRU5YSU87Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3RpbWUuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDUyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3RpbWUuaApAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgVCBJIE0gRQorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfcmlvdGltZV9oCisjZGVmaW5lIF9yaW90aW1lX2ggMQorCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTCitzdGF0aWMgY2hhciAqX3Jpb19yaW90aW1lX2hfc2NjcyA9ICJAKCMpcmlvdGltZS5oCTEuMSIgOworI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBUV09fUE9XRVJfRklGVEVFTiAodXNob3J0KTMyNzY4CisjZGVmaW5lIFJpb1RpbWUoKSAgICByaW90aW1lCisjZGVmaW5lIFJpb1RpbWVBZnRlcih0aW1lMSx0aW1lMikgKCh1c2hvcnQpdGltZTEgLSAodXNob3J0KXRpbWUyKSA8IFRXT19QT1dFUl9GSUZURUVOCisjZGVmaW5lIFJpb1RpbWVQbHVzKHRpbWUxLHRpbWUyKSAoKHVzaG9ydCl0aW1lMSArICh1c2hvcnQpdGltZTIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29udmVydCBhIFJJTyB0aWNrICgxLzEwdGggc2Vjb25kKQorICogaW50byB0cmFuc3B1dGVyIGxvdyBwcmlvcml0eSB0aWNrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAorI2RlZmluZSBSaW9UaW1lVG9Mb3codGltZSkgKHRpbWUqKDEwMDAwMCAvIDY0KSkKKyNkZWZpbmUgUmlvTG93VG9UaW1lKHRpbWUpICgodGltZSo2NCkvMTAwMDAwKQorCisjZGVmaW5lIFJJT1RFTlRIU0VDT05EICh1c2hvcnQpMQorI2RlZmluZSBSSU9TRUNPTkQgKHVzaG9ydCkoUklPVEVOVEhTRUNPTkQgKiAxMCkKKyNlbmRpZgorCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3R0eS5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjY1NTAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90dHkuYwpAQCAtMCwwICsxLDEzNzYgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHJpb3R0eS5jCisqKglTSUQJCTogMS4zCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMDozMzo0NworKioJUmV0cmlldmVkCTogMTEvNi85OCAxMDozMzo1MAorKioKKyoqICBpZGVudCBAKCMpcmlvdHR5LmMJMS4zCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvdHR5X2Nfc2Njc18gPSAiQCgjKXJpb3R0eS5jCTEuMyI7CisjZW5kaWYKKworCisjZGVmaW5lIF9fRVhQTElDSVRfREVGX0hfXworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKworCisjaW5jbHVkZSAibGludXhfY29tcGF0LmgiCisjaW5jbHVkZSAicmlvX2xpbnV4LmgiCisjaW5jbHVkZSAidHlwZGVmLmgiCisjaW5jbHVkZSAicGt0LmgiCisjaW5jbHVkZSAiZGFlbW9uLmgiCisjaW5jbHVkZSAicmlvLmgiCisjaW5jbHVkZSAicmlvc3BhY2UuaCIKKyNpbmNsdWRlICJ0b3AuaCIKKyNpbmNsdWRlICJjbWRwa3QuaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJyaW90eXBlcy5oIgorI2luY2x1ZGUgInJ1cC5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyaW9kcnZyLmgiCisjaW5jbHVkZSAicmlvaW5mby5oIgorI2luY2x1ZGUgImZ1bmMuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2luY2x1ZGUgInBhcm1tYXAuaCIKKyNpbmNsdWRlICJ1bml4cnVwLmgiCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJwaGIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiY21kYmxrLmgiCisjaW5jbHVkZSAicm91dGUuaCIKKyNpbmNsdWRlICJjb250cm9sLmgiCisjaW5jbHVkZSAiY2lycnVzLmgiCisjaW5jbHVkZSAicmlvaW9jdGwuaCIKKyNpbmNsdWRlICJwYXJhbS5oIgorI2luY2x1ZGUgImxpc3QuaCIKKyNpbmNsdWRlICJzYW0uaCIKKworI2lmIDAKK3N0YXRpYyB2b2lkIHR0eXNldGhfcHYoc3RydWN0IFBvcnQgKiwgc3RydWN0IHR0eXN0YXRpY3MgKiwgCisJCQkJc3RydWN0IHRlcm1pb3MgKnNnLCBpbnQpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIFJJT0NsZWFyVXAoc3RydWN0IFBvcnQgKlBvcnRQKTsKK2ludCBSSU9TaG9ydENvbW1hbmQoc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgUG9ydCAqUG9ydFAsIAorCQkJICAgaW50IGNvbW1hbmQsIGludCBsZW4sIGludCBhcmcpOworCisjaWYgMAorc3RhdGljIGludCBSSU9Db29rTW9kZShzdHJ1Y3QgdHR5c3RhdGljcyAqKTsKKyNlbmRpZgorCitleHRlcm4gaW50CWNvbnZfdmJbXTsJLyogbm93IGRlZmluZWQgaW4gdHR5bWdyLmMgKi8KK2V4dGVybiBpbnQJY29udl9idltdOwkvKiBub3cgZGVmaW5lZCBpbiB0dHltZ3IuYyAqLworIAorLyoKKyoqIDE2LjA5LjE5OTggQVJHIC0gRml4IHRvIGJ1aWxkIHJpb3R0eS5rLm8gZm9yIE1vZHVsYXIgS2VybmVsIFN1cHBvcnQKKyoqCisqKiBlcC5kZWYuaCBpcyBuZWNlc3NhcnkgZm9yIE1vZHVsYXIgS2VybmVsIFN1cHBvcnQKKyoqIERPIE5PVCBwbGFjZSBhbnkga2VybmVsICdleHRlcm4ncyBhZnRlciB0aGlzIGxpbmUKKyoqIG9yIHRoaXMgc291cmNlIGZpbGUgd2lsbCBub3QgYnVpbGQgcmlvdHR5LmsubworKi8KKyNpZmRlZiB1TFlOWAorI2luY2x1ZGUgPGVwLmRlZi5oPgorI2VuZGlmCisKKyNpZmRlZiBORUVEX1RISVMyCitzdGF0aWMgc3RydWN0IG9sZF9zZ3R0eWIgCitkZWZhdWx0X3NnID0gCit7IAorCUIxOTIwMCwgQjE5MjAwLAkJCQkvKiBpbnB1dCBhbmQgb3V0cHV0IHNwZWVkICovIAorCSdIJyAtICdAJywJCQkJCS8qIGVyYXNlIGNoYXIgKi8gCisJLTEsCQkJCQkJCS8qIDJuZCBlcmFzZSBjaGFyICovIAorCSdVJyAtICdAJywJCQkJCS8qIGtpbGwgY2hhciAqLyAKKwlFQ0hPIHwgQ1JNT0QsCQkJCS8qIG1vZGUgKi8gCisJJ0MnIC0gJ0AnLAkJCQkJLyogaW50ZXJydXB0IGNoYXJhY3RlciAqLyAKKwknXFwnIC0gJ0AnLAkJCQkJLyogcXVpdCBjaGFyICovIAorCSdRJyAtICdAJywJCQkJCS8qIHN0YXJ0IGNoYXIgKi8KKwknUycgLSAnQCcsCQkJCQkvKiBzdG9wIGNoYXIgKi8gCisJJ0QnIC0gJ0AnLAkJCQkJLyogRU9GICovCisJLTEsCQkJCQkJCS8qIGJyayAqLworCShMQ1JUQlMgfCBMQ1JURVJBIHwgTENSVEtJTCB8IExDVExFQ0gpLAkvKiBsb2NhbCBtb2RlIHdvcmQgKi8gCisJJ1onIC0gJ0AnLAkJCQkJLyogcHJvY2VzcyBzdG9wICovCisJJ1knIC0gJ0AnLAkJCQkJLyogZGVsYXllZCBzdG9wICovCisJJ1InIC0gJ0AnLAkJCQkJLyogcmVwcmludCBsaW5lICovIAorCSdPJyAtICdAJywJCQkJCS8qIGZsdXNoIG91dHB1dCAqLworCSdXJyAtICdAJywJCQkJCS8qIHdvcmQgZXJhc2UgKi8KKwknVicgLSAnQCcJCQkJCS8qIGxpdGVyYWwgbmV4dCBjaGFyICovCit9OworI2VuZGlmCisKKworZXh0ZXJuIHN0cnVjdCByaW9faW5mbyAqcDsKKworCitpbnQKK3Jpb3RvcGVuKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJcmVnaXN0ZXIgdWludCBTeXNQb3J0OworCWludCBNb2RlbTsKKwlpbnQgcmVwZWF0X3RoaXMgPSAyNTA7CisJc3RydWN0IFBvcnQgKlBvcnRQOwkJIC8qIHBvaW50ZXIgdG8gdGhlIHBvcnQgc3RydWN0dXJlICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsID0gMDsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwkvKiBNYWtlIHN1cmUgZHJpdmVyX2RhdGEgaXMgTlVMTCBpbiBjYXNlIHRoZSByaW8gaXNuJ3QgYm9vdGVkIGpldC4gRWxzZSBnc19jbG9zZQorCSAgIGlzIGdvaW5nIHRvIG9vcHMuCisJKi8KKwl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKKyAgICAgICAgCisJU3lzUG9ydCA9IHJpb19taW5vcih0dHkpOworCU1vZGVtICAgPSByaW9faXNtb2RlbSh0dHkpOworCisJaWYgKCBwLT5SSU9GYWlsZWQgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiU3lzdGVtIGluaXRpYWxpc2F0aW9uIGZhaWxlZFxuIik7CisJCXBzZXRlcnIoRU5YSU8pOworCQlmdW5jX2V4aXQgKCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJwb3J0IG9wZW4gU3lzUG9ydCAlZCAoJXMpIChtYXBwZWQ6JWQpXG4iLAorCSAgICAgICBTeXNQb3J0LCAgTW9kZW0gPyAiTW9kZW0iIDogInR0eSIsCisJCQkJICAgcC0+UklPUG9ydHBbU3lzUG9ydF0tPk1hcHBlZCk7CisKKwkvKgorCSoqIFZhbGlkYXRlIHRoYXQgd2UgaGF2ZSByZWNlaXZlZCBhIGxlZ2l0aW1hdGUgcmVxdWVzdC4KKwkqKiBDdXJyZW50bHksIGp1c3QgY2hlY2sgdGhhdCB3ZSBhcmUgb3BlbmluZyBhIHBvcnQgb24KKwkqKiBhIGhvc3QgY2FyZCB0aGF0IGFjdHVhbGx5IGV4aXN0cywgYW5kIHRoYXQgdGhlIHBvcnQKKwkqKiBoYXMgYmVlbiBtYXBwZWQgb250byBhIGhvc3QuCisJKi8KKwlpZiAoU3lzUG9ydCA+PSBSSU9fUE9SVFMpIHsJLyogb3V0IG9mIHJhbmdlID8gKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJJbGxlZ2FsIHBvcnQgbnVtYmVyICVkXG4iLFN5c1BvcnQpOworCQlwc2V0ZXJyKEVOWElPKTsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyoKKwkqKiBHcmFiIHBvaW50ZXIgdG8gdGhlIHBvcnQgc3R1Y3R1cmUKKwkqLworCVBvcnRQID0gcC0+UklPUG9ydHBbU3lzUG9ydF07CS8qIEdldCBjb250cm9sIHN0cnVjICovCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJQb3J0UDogJXBcbiIsIFBvcnRQKTsKKwlpZiAoICFQb3J0UC0+TWFwcGVkICkgewkvKiB3ZSBhcmVuJ3QgbWFwcGVkIHlldCEgKi8KKwkJLyoKKwkJKiogVGhlIHN5c3RlbSBkb2Vzbid0IGtub3cgd2hpY2ggUlRBIHRoaXMgcG9ydAorCQkqKiBjb3JyZXNwb25kcyB0by4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJwb3J0IG5vdCBtYXBwZWQgaW50byBzeXN0ZW1cbiIpOworCQlmdW5jX2V4aXQgKCk7CisJCXBzZXRlcnIoRU5YSU8pOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXR0eS0+ZHJpdmVyX2RhdGEgPSBQb3J0UDsKKworCVBvcnRQLT5ncy50dHkgPSB0dHk7CisJUG9ydFAtPmdzLmNvdW50Kys7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIiVkIGJ5dGVzIGluIHR4IGJ1ZmZlclxuIiwKKwkJCQkgICBQb3J0UC0+Z3MueG1pdF9jbnQpOworCisJcmV0dmFsID0gZ3NfaW5pdF9wb3J0ICgmUG9ydFAtPmdzKTsKKwlpZiAocmV0dmFsKSB7CisJCVBvcnRQLT5ncy5jb3VudC0tOworCQlyZXR1cm4gLUVOWElPOworCX0KKwkvKgorCSoqIElmIHRoZSBob3N0IGhhc24ndCBiZWVuIGJvb3RlZCB5ZXQsIHRoZW4gCisJKiogZmFpbAorCSovCisJaWYgKCAoUG9ydFAtPkhvc3RQLT5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORyApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJIb3N0IG5vdCBydW5uaW5nXG4iKTsKKwkJcHNldGVycihFTlhJTyk7CisJCWZ1bmNfZXhpdCAoKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKgorCSoqIElmIHRoZSBSVEEgaGFzIG5vdCBib290ZWQgeWV0IGFuZCB0aGUgdXNlciBoYXMgY2hvb3NlbiB0byBibG9jaworCSoqIHVudGlsIHRoZSBSVEEgaXMgcHJlc2VudCB0aGVuIHdlIG11c3Qgc3BpbiBoZXJlIHdhaXRpbmcgZm9yCisJKiogdGhlIFJUQSB0byBib290LgorCSovCisjaWYgMAorCWlmICghKFBvcnRQLT5Ib3N0UC0+TWFwcGluZ1tQb3J0UC0+UnVwTnVtXS5GbGFncyAmIFJUQV9CT09URUQpKSB7CisJCWlmIChQb3J0UC0+V2FpdFVudGlsQm9vdGVkKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIFJUQSB0byBib290XG4iKTsKKwkJCWRvIHsKKwkJCQlpZiAoUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMpID09IFJJT19GQUlMKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBIEVJTlRSIGluIGRlbGF5IFxuIik7CisJCQkJCWZ1bmNfZXhpdCAoKTsKKwkJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCQl9CisJCQkJaWYgKHJlcGVhdF90aGlzIC0tIDw9IDApIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJXYWl0aW5nIGZvciBSVEEgdG8gYm9vdCB0aW1lb3V0XG4iKTsKKwkJCQkJUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgRkNMT1NFICk7IAorCQkJCQlwc2V0ZXJyKEVJTlRSKTsKKwkJCQkJZnVuY19leGl0ICgpOworCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQl9CisJCQl9IHdoaWxlKCEoUG9ydFAtPkhvc3RQLT5NYXBwaW5nW1BvcnRQLT5SdXBOdW1dLkZsYWdzICYgUlRBX0JPT1RFRCkpOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJSVEEgaGFzIGJlZW4gYm9vdGVkXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBIG5ldmVyIGJvb3RlZFxuIik7CisJCQlwc2V0ZXJyKEVOWElPKTsKKwkJCWZ1bmNfZXhpdCAoKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2Vsc2UKKwkvKiBJIGZpbmQgdGhlIGFib3ZlIGNvZGUgYSBiaXQgaGFpcnkuIEkgZmluZCB0aGUgYmVsb3cgY29kZQorICAgICAgICAgICBlYXNpZXIgdG8gcmVhZCBhbmQgc2hvcnRlci4gTm93LCBpZiBpdCB3b3JrcyB0b28gdGhhdCB3b3VsZAorCSAgIGJlIGdyZWF0Li4uIC0tIFJFVyAKKwkqLworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ2hlY2tpbmcgaWYgUlRBIGhhcyBib290ZWQuLi4gXG4iKTsKKwl3aGlsZSAoIShQb3J0UC0+SG9zdFAtPk1hcHBpbmdbUG9ydFAtPlJ1cE51bV0uRmxhZ3MgJiBSVEFfQk9PVEVEKSkgeworCSAgaWYgKCFQb3J0UC0+V2FpdFVudGlsQm9vdGVkKSB7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBIG5ldmVyIGJvb3RlZFxuIik7CisJICAgIGZ1bmNfZXhpdCAoKTsKKwkgICAgcmV0dXJuIC1FTlhJTzsKKwkgIH0KKworCSAgLyogVW5kZXIgTGludXggeW91J2Qgbm9ybWFsbHkgdXNlIGEgd2FpdCBpbnN0ZWFkIG9mIHRoaXMKKwkgICAgIGJ1c3ktd2FpdGluZy4gSSdsbCBzdGljayB3aXRoIHRoZSBvbGQgaW1wbGVtZW50YXRpb24gZm9yCisJICAgICBub3cuIC0tUkVXIAorCSAgKi8KKwkgIGlmIChSSU9EZWxheShQb3J0UCwgSFVORFJFRF9NUykgPT0gUklPX0ZBSUwpIHsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJSVEFfd2FpdF9mb3JfYm9vdDogRUlOVFIgaW4gZGVsYXkgXG4iKTsKKwkgICAgZnVuY19leGl0ICgpOworCSAgICByZXR1cm4gLUVJTlRSOworCSAgfQorCSAgaWYgKHJlcGVhdF90aGlzIC0tIDw9IDApIHsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJXYWl0aW5nIGZvciBSVEEgdG8gYm9vdCB0aW1lb3V0XG4iKTsKKwkgICAgZnVuY19leGl0ICgpOworCSAgICByZXR1cm4gLUVJTzsKKwkgIH0KKwl9CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJSVEEgaGFzIGJlZW4gYm9vdGVkXG4iKTsKKyNlbmRpZgorI2lmIDAKKwl0cCA9ICBQb3J0UC0+VHR5UDsJCS8qIGdldCB0dHkgc3RydWN0ICovCisjZW5kaWYKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJaWYgKCBwLT5SSU9IYWx0ZWQgKSB7CisJCWdvdG8gYm9tYm91dDsKKwl9CisjaWYgMAorCXJldHZhbCA9IGdzX2luaXRfcG9ydCgmUG9ydFAtPmdzKTsKKwlpZiAocmV0dmFsKXsKKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKyNlbmRpZgorCisJLyoKKwkqKiBJZiB0aGUgcG9ydCBpcyBpbiB0aGUgZmluYWwgdGhyb3dzIG9mIGJlaW5nIGNsb3NlZCwKKwkqKiB3ZSBzaG91bGQgd2FpdCBoZXJlIChwb2xpdGVseSksIHdhaXRpbmcKKwkqKiBmb3IgaXQgdG8gZmluaXNoLCBzbyB0aGF0IGl0IGRvZXNuJ3QgY2xvc2UgdXMhCisJKi8KKwl3aGlsZSAoIChQb3J0UC0+U3RhdGUgJiBSSU9fQ0xPU0lORykgJiYgIXAtPlJJT0hhbHRlZCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJXYWl0aW5nIGZvciBSSU9fQ0xPU0lORyB0byBnbyBhd2F5XG4iKTsKKwkJaWYgKHJlcGVhdF90aGlzIC0tIDw9IDApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3Igbm90IGlkbGUgY2xvc2VkIGJyb2tlbiBieSBzaWduYWxcbiIpOworCQkJUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgRkNMT1NFICk7IAorCQkJcmV0dmFsID0gLUVJTlRSOworCQkJZ290byBib21ib3V0OworCQl9CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlpZiAoUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMpID09IFJJT19GQUlMKSB7CisJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7IAorCQkJcmV0dmFsID0gLUVJTlRSOworCQkJZ290byBib21ib3V0OworCQl9CisJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsgCisJfQorCisJaWYgKCAhUG9ydFAtPk1hcHBlZCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJQb3J0IHVubWFwcGVkIHdoaWxlIGNsb3NpbmchXG4iKTsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCXJldHZhbCA9IC1FTlhJTzsKKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlmICggcC0+UklPSGFsdGVkICkgeworCQlnb3RvIGJvbWJvdXQ7CisJfQorCisvKgorKiogMTUuMTAuMTk5OCBBUkcgLSBFU0lMIDA3NjEgcGFydCBmaXgKKyoqIFJJTyBoYXMgaXQncyBvd24gQ1RTRkxPVyBhbmQgUlRTRkxPVyBmbGFncyBpbiAnQ29uZmlnJyBpbiB0aGUgcG9ydCBzdHJ1Y3R1cmUsCisqKiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBmbGFncyBhcmUgY2xlYXIgd2hlbiB0aGUgcG9ydCBpcyBvcGVuZWQuCisqLworCS8qIFVoPyBTdXBwb3NlIEkgdHVybiB0aGVzZSBvbiBhbmQgdGhlbiBhbm90aGVyIHByb2Nlc3Mgb3BlbnMKKwkgICB0aGUgcG9ydCBhZ2Fpbj8gVGhlIGZsYWdzIGdldCBjbGVhcmVkISBOb3QgZ29vZC4gLS0gUkVXICovCisJaWYgKCAhKFBvcnRQLT5TdGF0ZSAmIChSSU9fTE9QRU4gfCBSSU9fTU9QRU4pKSApIHsKKwkJUG9ydFAtPkNvbmZpZyAmPSB+KFJJT19DVFNGTE9XfFJJT19SVFNGTE9XKTsKKwl9CisKKwlpZiAoIShQb3J0UC0+Zmlyc3RPcGVuKSkgewkvKiBGaXJzdCB0aW1lID8gKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJGaXJzdCBvcGVuIGZvciB0aGlzIHBvcnRcbiIpOworCQorCisJCVBvcnRQLT5maXJzdE9wZW4rKzsKKwkJUG9ydFAtPkNvb2tNb2RlID0gMDsgLyogWFhYIFJJT0Nvb2tNb2RlKHRwKTsgKi8KKwkJUG9ydFAtPkluVXNlID0gTk9UX0lOVVNFOworCisJCS8qIFRlbnRhdGl2ZSBmaXggZm9yIGJ1ZyBQUjI3LiBEaWRuJ3Qgd29yay4gKi8KKwkJLyogUG9ydFAtPmdzLnhtaXRfY250ID0gMDsgKi8KKworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKyNpZmRlZiBORUVEX1RISVMKKwkJdHR5c2V0aChQb3J0UCwgdHAsIChzdHJ1Y3Qgb2xkX3NndHR5YiAqKSZkZWZhdWx0X3NnKTsKKyNlbmRpZgorCisJCS8qIFNvbWVvbmUgZXhwbGFpbiB0byBtZSB3aHkgdGhpcyBkZWxheS9jb25maWcgaXMKKyAgICAgICAgICAgICAgICAgICBoZXJlLiBJZiBJIHJlYWQgdGhlIGRvY3MgY29ycmVjdGx5IHRoZSAib3BlbiIKKyAgICAgICAgICAgICAgICAgICBjb21tYW5kIHBpZ2d5YmFja3MgdGhlIHBhcmFtZXRlcnMgaW1tZWRpYXRlbHkuIAorCQkgICAtLSBSRVcgKi8KKwkJUklPUGFyYW0oUG9ydFAsT1BFTixNb2RlbSxPS19UT19TTEVFUCk7CQkvKiBPcGVuIHRoZSBwb3J0ICovCisjaWYgMAorCQkvKiBUaGlzIGRlbGF5IG9mIDEgc2Vjb25kIHdhcyBhbm5veWluZy4gSSByZW1vdmVkIGl0LiAtLSBSRVcgKi8KKwkJUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMqMTApOworCQlSSU9QYXJhbShQb3J0UCxDT05GSUcsTW9kZW0sT0tfVE9fU0xFRVApOwkvKiBDb25maWcgdGhlIHBvcnQgKi8KKyNlbmRpZgorCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwkJLyoKKwkJKiogd2FpdCBmb3IgdGhlIHBvcnQgdG8gYmUgbm90IGNsb3NlZC4KKwkJKi8KKwkJd2hpbGUgKCAhKFBvcnRQLT5Qb3J0U3RhdGUgJiBQT1JUX0lTT1BFTikgJiYgIXAtPlJJT0hhbHRlZCApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3IgUE9SVF9JU09QRU4tY3VycmVudGx5ICV4XG4iLFBvcnRQLT5Qb3J0U3RhdGUpOworLyoKKyoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzU5CisqKiAoUGFydCkgZml4IGZvciBwb3J0IGJlaW5nIHRyYXNoZWQgd2hlbiBvcGVuZWQgd2hpbHN0IFJUQSAiZGlzY29ubmVjdGVkIgorKiogVGFrZSBvdXQgdGhlIGxpbWl0ZWQgd2FpdCAtIG5vdyB3YWl0IGZvciBldmVyIG9yIHVudGlsIHVzZXIKKyoqIGJhbmdzIHVzIG91dC4KKyoqCisJCQlpZiAocmVwZWF0X3RoaXMgLS0gPD0gMCkgeworCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX1RUWSwgKCJXYWl0aW5nIGZvciBvcGVuIHRvIGZpbmlzaCB0aW1lZCBvdXQuXG4iKSk7CisJCQkJUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgRkNMT1NFICk7IAorCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCXJldHVybiAtRUlOVFI7CisJCQl9CisqKgorKi8KKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJaWYgKFJJT0RlbGF5KFBvcnRQLCBIVU5EUkVEX01TKSA9PSBSSU9fRkFJTCkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3Igb3BlbiB0byBmaW5pc2ggYnJva2VuIGJ5IHNpZ25hbFxuIik7CisJCQkJUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgRkNMT1NFICk7CisJCQkJZnVuY19leGl0ICgpOworCQkJCXJldHVybiAtRUlOVFI7CisJCQl9CisJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCX0KKworCQlpZiAoIHAtPlJJT0hhbHRlZCApIHsKKwkJICByZXR2YWwgPSAtRUlPOworYm9tYm91dDoKKwkJICAvKiAJCQlSSU9DbGVhclVwKCBQb3J0UCApOyAqLworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUE9SVF9JU09QRU4gZm91bmRcbiIpOworCX0KKworI2lmZGVmIE1PREVNX1NVUFBPUlQgCisJaWYgKE1vZGVtKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiTW9kZW0gLSB0ZXN0IGZvciBjYXJyaWVyXG4iKTsKKwkJLyoKKwkJKiogQUNUSU9OCisJCSoqIGluc2VydCB0ZXN0IGZvciBjYXJyaWVyIGhlcmUuIC0tID8/PworCQkqKiBJIGFscmVhZHkgc2VlIHRoYXQgdGVzdCBoZXJlLiBXaGF0J3MgdGhlIGRlYWw/IC0tIFJFVworCQkqLworCQlpZiAoKFBvcnRQLT5ncy50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpIHx8IChQb3J0UC0+TW9kZW1TdGF0ZSAmIE1TVlIxX0NEKSkKKwkJeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJvcGVuKCVkKSBNb2RlbSBjYXJyIG9uXG4iLCBTeXNQb3J0KTsKKwkJCS8qCisJCQl0cC0+dG0uY19zdGF0ZSB8PSBDQVJSX09OOworCQkJd2FrZXVwKChjYWRkcl90KSAmdHAtPnRtLmNfY2FucSk7CisJCQkqLworCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19DQVJSX09OOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICgmUG9ydFAtPmdzLm9wZW5fd2FpdCk7CisJCX0KKwkJZWxzZSAvKiBubyBjYXJyaWVyIC0gd2FpdCBmb3IgRENEICovCisJCXsKKwkJICAvKgorCQkJd2hpbGUgKCEoUG9ydFAtPmdzLnR0eS0+dGVybWlvcy0+Y19zdGF0ZSAmIENBUlJfT04pICYmIAorCQkJICAgICAgICEoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmICFwLT5SSU9IYWx0ZWQgKQorCQkgICovCisJCQl3aGlsZSAoIShQb3J0UC0+U3RhdGUgJiBSSU9fQ0FSUl9PTikgJiYgCisJCQkgICAgICAgIShmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgIXAtPlJJT0hhbHRlZCApIHsKKworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAib3BlbiglZCkgc2xlZXBpbmcgZm9yIGNhcnIgb25cbiIsU3lzUG9ydCk7CisJCQkJLyoKKwkJCQlQb3J0UC0+Z3MudHR5LT50ZXJtaW9zLT5jX3N0YXRlIHw9IFdPUEVOOworCQkJCSovCisJCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19XT1BFTjsKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlpZiAoUklPRGVsYXkgKFBvcnRQLCBIVU5EUkVEX01TKSA9PSBSSU9fRkFJTCkKKyNpZiAwCisJCQkJaWYgKCBzbGVlcCgoY2FkZHJfdCkmdHAtPnRtLmNfY2FucW8sIFRUSVBSSXxQQ0FUQ0gpKQorI2VuZGlmCisJCQkJeworCQkJCQkvKgorCQkJCQkqKiBBQ1RJT046IHZlcmlmeSB0aGF0IHRoaXMgaXMgYSBnb29kIHRoaW5nCisJCQkJCSoqIHRvIGRvIGhlcmUuIC0tID8/PworCQkJCQkqKiBJIHRoaW5rIGl0J3MgT0suIC0tIFJFVworCQkJCQkqLworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIm9wZW4oJWQpIHNsZWVwaW5nIGZvciBjYXJyIGJyb2tlbiBieSBzaWduYWxcbiIsCisJCQkJCSAgICAgICBTeXNQb3J0KTsKKwkJCQkJUklPUHJlZW1wdGl2ZUNtZCggcCwgUG9ydFAsIEZDTE9TRSApOworCQkJCQkvKgorCQkJCQl0cC0+dG0uY19zdGF0ZSAmPSB+V09QRU47CisJCQkJCSovCisJCQkJCVBvcnRQLT5TdGF0ZSAmPSB+UklPX1dPUEVOOworCQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQkJZnVuY19leGl0ICgpOworCQkJCQlyZXR1cm4gLUVJTlRSOworCQkJCX0KKwkJCX0KKwkJCVBvcnRQLT5TdGF0ZSAmPSB+UklPX1dPUEVOOworCQl9CisJCWlmICggcC0+UklPSGFsdGVkICkKKwkJCWdvdG8gYm9tYm91dDsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJTZXR0aW5nIFJJT19NT1BFTlxuIik7CisJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fTU9QRU47CisJfQorCWVsc2UKKyNlbmRpZgorCXsKKwkJLyoKKwkJKiogQUNUSU9OCisJCSoqIERpcmVjdCBsaW5lIG9wZW4gLSBmb3JjZSBjYXJyaWVyICh3aWxsIHByb2JhYmx5IG1lYW4KKwkJKiogdGhhdCBzbGVlcGluZyBNb2RlbSBsaW5lIGZ1YmFyKQorCQkqLworCQlQb3J0UC0+U3RhdGUgfD0gUklPX0xPUEVOOworCX0KKworCWlmICggcC0+UklPSGFsdGVkICkgeworCQlnb3RvIGJvbWJvdXQ7CisJfQorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJoaWdoIGxldmVsIG9wZW4gZG9uZVxuIik7CisKKyNpZmRlZiBTVEFUUworCVBvcnRQLT5TdGF0Lk9wZW5DbnQrKzsKKyNlbmRpZgorCS8qCisJKiogQ291bnQgb3BlbnMgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKKwkqLworCWlmIChQb3J0UC0+c3RhdHNHYXRoZXIpCisJCVBvcnRQLT5vcGVucysrOworCisJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJSZXR1cm5pbmcgZnJvbSBvcGVuXG4iKTsKKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisqKiBSSU9DbG9zZSB0aGUgcG9ydC4KKyoqIFRoZSBvcGVyYXRpbmcgc3lzdGVtIHRoaW5rcyB0aGF0IHRoaXMgaXMgbGFzdCBjbG9zZSBmb3IgdGhlIGRldmljZS4KKyoqIEFzIHRoZXJlIGFyZSB0d28gaW50ZXJmYWNlcyB0byB0aGUgcG9ydCAoTW9kZW0gYW5kIHR0eSksIHdlIG5lZWQgdG8KKyoqIGNoZWNrIHRoYXQgYm90aCBhcmUgY2xvc2VkIGJlZm9yZSB3ZSBjbG9zZSB0aGUgZGV2aWNlLgorKi8gCitpbnQKK3Jpb3RjbG9zZSh2b2lkICAqcHRyKQoreworI2lmIDAKKwlyZWdpc3RlciB1aW50IFN5c1BvcnQgPSBkZXY7CisJc3RydWN0IHR0eXN0YXRpY3MgKnRwOwkJLyogcG9pbnRlciB0byBvdXIgdHR5c3RydWN0ICovCisjZW5kaWYKKwlzdHJ1Y3QgUG9ydCAqUG9ydFAgPXB0cjsJLyogcG9pbnRlciB0byB0aGUgcG9ydCBzdHJ1Y3R1cmUgKi8KKwlpbnQgZGVsZXRlZCA9IDA7CisJaW50CXRyeSA9IC0xOyAvKiBEaXNhYmxlIHRoZSB0aW1lb3V0cyBieSBzZXR0aW5nIHRoZW0gdG8gLTEgKi8KKwlpbnQJcmVwZWF0X3RoaXMgPSAtMTsgLyogQ29uZ3JhdHMgdG8gdGhvc2UgaGF2aW5nIDE1IHllYXJzIG9mIAorCQkJCSAgICAgdXB0aW1lISAoWW91IGdldCB0byBicmVhayB0aGUgZHJpdmVyLikgKi8KKwlsb25nIGVuZF90aW1lOworCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IE1vZGVtOworCWludCBydiA9MDsKKwkKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgInBvcnQgY2xvc2UgU3lzUG9ydCAlZFxuIixQb3J0UC0+UG9ydE51bSk7CisKKwkvKiBQb3J0UCA9IHAtPlJJT1BvcnRwW1N5c1BvcnRdOyAqLworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUG9ydCBpcyBhdCBhZGRyZXNzIDB4JXhcbiIsKGludClQb3J0UCk7CisJLyogdHAgPSBQb3J0UC0+VHR5UDsqLwkJCS8qIEdldCB0dHkgKi8KKwl0dHkgPSBQb3J0UC0+Z3MudHR5OworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVFRZIGlzIGF0IGFkZHJlc3MgMHgleFxuIiwoaW50KXR0eSk7CisKKwlpZiAoUG9ydFAtPmdzLmNsb3Npbmdfd2FpdCkgCisJCWVuZF90aW1lID0gamlmZmllcyArIFBvcnRQLT5ncy5jbG9zaW5nX3dhaXQ7CisJZWxzZSAKKwkJZW5kX3RpbWUgPSBqaWZmaWVzICsgTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisKKwlNb2RlbSA9IHJpb19pc21vZGVtKHR0eSk7CisjaWYgMAorCS8qIFdoYXQgRi5DS0lORyBjYWNoZT8gRXZlbiB0aGVuLCBhIGhpZ2x5IGlkbGUgbXVsdGlwcm9jZXNzb3IsCisJICAgc3lzdGVtIHdpdGggbGFyZ2UgY2FjaGVzIHRoaXMgd29uJ3Qgd29yayAuIEJldHRlciBmaW5kIG91dCB3aGVuIAorCSAgIHRoaXMgZG9lc24ndCB3b3JrIGFzYXAsIGFuZCBmaXggdGhlIGNhdXNlLiAgLS0gUkVXICovCisJCisJUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMqMTApOwkvKiBUbyBmbHVzaCB0aGUgY2FjaGUgKi8KKyNlbmRpZgorCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworCS8qCisJKiogU2V0dGluZyB0aGlzIGZsYWcgd2lsbCBtYWtlIGFueSBwcm9jZXNzIHRyeWluZyB0byBvcGVuCisJKiogdGhpcyBwb3J0IGJsb2NrIHVudGlsIHdlIGFyZSBjb21wbGV0ZSBjbG9zaW5nIGl0LgorCSovCisJUG9ydFAtPlN0YXRlIHw9IFJJT19DTE9TSU5HOworCisJaWYgKCAoUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQpICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNsb3NlIG9uIGRlbGV0ZWQgUlRBXG4iKTsKKwkJZGVsZXRlZCA9IDE7CisJfQorCQorCWlmICggcC0+UklPSGFsdGVkICkgeworCQlSSU9DbGVhclVwKCBQb3J0UCApOworCQlydiA9IC1FSU87CisJCWdvdG8gY2xvc2VfZW5kOworCX0KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ2xlYXIgYml0c1xuIik7CisJLyoKKwkqKiBjbGVhciB0aGUgb3BlbiBiaXRzIGZvciB0aGlzIGRldmljZQorCSovCisJUG9ydFAtPlN0YXRlICY9IChNb2RlbSA/IH5SSU9fTU9QRU4gOiB+UklPX0xPUEVOKTsKKwlQb3J0UC0+U3RhdGUgJj0gflJJT19DQVJSX09OOworCVBvcnRQLT5Nb2RlbVN0YXRlICY9IH5NU1ZSMV9DRDsKKwkvKgorCSoqIElmIHRoZSBkZXZpY2Ugd2FzIG9wZW4gYXMgYm90aCBhIE1vZGVtIGFuZCBhIHR0eSBsaW5lCisJKiogdGhlbiB3ZSBuZWVkIHRvIHdpbXAgb3V0IGhlcmUsIGFzIHRoZSBwb3J0IGhhcyBub3QgcmVhbGx5CisJKiogYmVlbiBmaW5hbGx5IGNsb3NlZCAoZ2VlLCB3aGl6eiEpIFRoZSB0ZXN0IGhlcmUgdXNlcyB0aGUKKwkqKiBiaXQgZm9yIHRoZSBPVEhFUiBtb2RlIG9mIG9wZXJhdGlvbiwgdG8gc2VlIGlmIFRIQVQgaXMKKwkqKiBzdGlsbCBhY3RpdmUhCisJKi8KKwlpZiAoIChQb3J0UC0+U3RhdGUgJiAoUklPX0xPUEVOfFJJT19NT1BFTikpICkgeworCQkvKgorCQkqKiBUaGUgcG9ydCBpcyBzdGlsbCBvcGVuIGZvciB0aGUgb3RoZXIgdGFzayAtCisJCSoqIHJldHVybiwgcHJldGVuZGluZyB0aGF0IHdlIGFyZSBzdGlsbCBhY3RpdmUuCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ2hhbm5lbCAlZCBzdGlsbCBvcGVuICFcbiIsUG9ydFAtPlBvcnROdW0pOworCQlQb3J0UC0+U3RhdGUgJj0gflJJT19DTE9TSU5HOworCQlpZiAoUG9ydFAtPmZpcnN0T3BlbikKKwkJCVBvcnRQLT5maXJzdE9wZW4tLTsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ2xvc2luZyBkb3duIC0gZXZlcnl0aGluZyBtdXN0IGdvIVxuIik7CisKKwlQb3J0UC0+U3RhdGUgJj0gflJJT19EWU5PUk9EOworCisJLyoKKwkqKiBUaGlzIGlzIHdoZXJlIHdlIHdhaXQgZm9yIHRoZSBwb3J0CisJKiogdG8gZHJhaW4gZG93biBiZWZvcmUgY2xvc2luZy4gQnllLWJ5ZS4uLi4KKwkqKiAoV2UgbmV2ZXIgbWVhbnQgdG8gZG8gdGhpcykKKwkqLworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVGltZW91dCAxIHN0YXJ0c1xuIik7CisKKwlpZiAoIWRlbGV0ZWQpCisJd2hpbGUgKCAoUG9ydFAtPkluVXNlICE9IE5PVF9JTlVTRSkgJiYgIXAtPlJJT0hhbHRlZCAmJiAKKwkJKFBvcnRQLT5UeEJ1ZmZlckluICE9IFBvcnRQLT5UeEJ1ZmZlck91dCkgKSB7CisJCWNwcmludGYoIk5lZWQgdG8gZmx1c2ggdGhlIHR0eXBvcnRcbiIpOworCQlpZiAocmVwZWF0X3RoaXMgLS0gPD0gMCkgeworCQkJcnYgPSAtRUlOVFI7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIG5vdCBpZGxlIGNsb3NlZCBicm9rZW4gYnkgc2lnbmFsXG4iKTsKKwkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSApOyAKKwkJCWdvdG8gY2xvc2VfZW5kOworCQl9CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ2FsbGluZyB0aW1lb3V0IHRvIGZsdXNoIGluIGNsb3NpbmdcbiIpOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJaWYgKFJJT0RlbGF5X25pKFBvcnRQLCBIVU5EUkVEX01TKjEwKSA9PSBSSU9fRkFJTCkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJSVEEgRUlOVFIgaW4gZGVsYXkgXG4iKTsKKwkJCXJ2ID0gLUVJTlRSOworCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJZ290byBjbG9zZV9lbmQ7CisJCX0KKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCX0KKworCVBvcnRQLT5UeEJ1ZmZlckluID0gUG9ydFAtPlR4QnVmZmVyT3V0ID0gMDsKKwlyZXBlYXRfdGhpcyA9IDB4ZmY7CisKKwlQb3J0UC0+SW5Vc2UgPSAwOworCWlmICggKFBvcnRQLT5TdGF0ZSAmIChSSU9fTE9QRU58UklPX01PUEVOKSkgKSB7CisJCS8qCisJCSoqIFRoZSBwb3J0IGhhcyBiZWVuIHJlLW9wZW5lZCBmb3IgdGhlIG90aGVyIHRhc2sgLQorCQkqKiByZXR1cm4sIHByZXRlbmRpbmcgdGhhdCB3ZSBhcmUgc3RpbGwgYWN0aXZlLgorCQkqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNoYW5uZWwgJWQgcmUtb3BlbiFcbiIsIFBvcnRQLT5Qb3J0TnVtKTsKKwkJUG9ydFAtPlN0YXRlICY9IH5SSU9fQ0xPU0lORzsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCWlmIChQb3J0UC0+Zmlyc3RPcGVuKQorCQkJUG9ydFAtPmZpcnN0T3Blbi0tOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIHAtPlJJT0hhbHRlZCApIHsKKwkJUklPQ2xlYXJVcCggUG9ydFAgKTsKKwkJZ290byBjbG9zZV9lbmQ7CisJfQorCisJCisKKwkvKiBDYW4ndCBjYWxsIFJJT1Nob3J0Q29tbWFuZCB3aXRoIHRoZSBwb3J0IGxvY2tlZC4gKi8KKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworCWlmIChSSU9TaG9ydENvbW1hbmQocCwgUG9ydFAsIENMT1NFLCAxLCAwKSA9PSBSSU9fRkFJTCkgeworCSAgUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCxGQ0xPU0UpOworCSAgZ290byBjbG9zZV9lbmQ7CisJfQorCisJaWYgKCFkZWxldGVkKQorCSAgd2hpbGUgKHRyeSAmJiAoUG9ydFAtPlBvcnRTdGF0ZSAmIFBPUlRfSVNPUEVOKSkgeworCSAgICAgICAgdHJ5LS07CisJCWlmICh0aW1lX2FmdGVyIChqaWZmaWVzLCBlbmRfdGltZSkpIHsKKwkJICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJ1biBvdXQgb2YgdHJpZXMgLSBmb3JjZSB0aGUgYnVnZ2VyIHNodXQhXG4iICk7CisJCSAgUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCxGQ0xPU0UpOworCQkgIGJyZWFrOworCQl9CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ2xvc2U6IFBvcnRTdGF0ZTpJU09QRU4gaXMgJWRcbiIsIAorCQkJCQkgICBQb3J0UC0+UG9ydFN0YXRlICYgUE9SVF9JU09QRU4pOworCisJCWlmICggcC0+UklPSGFsdGVkICkgeworCQkJUklPQ2xlYXJVcCggUG9ydFAgKTsKKwkJCWdvdG8gY2xvc2VfZW5kOworCQl9CisJCWlmIChSSU9EZWxheShQb3J0UCwgSFVORFJFRF9NUykgPT0gUklPX0ZBSUwpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBIEVJTlRSIGluIGRlbGF5IFxuIik7CisJCQlSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLEZDTE9TRSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJDbG9zZTogdHJ5IHdhcyAlZCBvbiBjb21wbGV0aW9uXG4iLCB0cnkgKTsKKyAKKwkvKiBSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBGQ0xPU0UpOyAqLworCisvKgorKiogMTUuMTAuMTk5OCBBUkcgLSBFU0lMIDA3NjEgcGFydCBmaXgKKyoqIFJJTyBoYXMgaXQncyBvd24gQ1RTRkxPVyBhbmQgUlRTRkxPVyBmbGFncyBpbiAnQ29uZmlnJyBpbiB0aGUgcG9ydCBzdHJ1Y3R1cmUsKiogd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZmxhZ3MgYXJlIGNsZWFyIHdoZW4gdGhlIHBvcnQgaXMgb3BlbmVkLgorKi8KKwlQb3J0UC0+Q29uZmlnICY9IH4oUklPX0NUU0ZMT1d8UklPX1JUU0ZMT1cpOworCisKKyNpZmRlZiBTVEFUUworCVBvcnRQLT5TdGF0LkNsb3NlQ250Kys7CisjZW5kaWYKKwkvKgorCSoqIENvdW50IG9wZW5zIGZvciBwb3J0IHN0YXRpc3RpY3MgcmVwb3J0aW5nCisJKi8KKwlpZiAoUG9ydFAtPnN0YXRzR2F0aGVyKQorCQlQb3J0UC0+Y2xvc2VzKys7CisKK2Nsb3NlX2VuZDoKKwkvKiBYWFg6IFdoeSB3b3VsZCBhICJERUxFVEVEIiBmbGFnIGJlIHJlc2V0IGhlcmU/IEknZCBoYXZlCisJICAgdGhvdWdodCB0aGF0IGEgImRlbGV0ZWQiIGZsYWcgbWVhbnMgdGhhdCB0aGUgcG9ydCB3YXMKKwkgICBwZXJtYW5lbnRseSBnb25lLCBidXQgaGVyZSB3ZSBjYW4gbWFrZSBpdCByZWFwcGVhciBieSBpdAorCSAgIGJlaW5nIGluIGNsb3NlIGR1cmluZyB0aGUgImRlbGV0aW9uIi4KKwkqLworCVBvcnRQLT5TdGF0ZSAmPSB+KFJJT19DTE9TSU5HfFJJT19ERUxFVEVEKTsKKwlpZiAoUG9ydFAtPmZpcnN0T3BlbikKKwkJUG9ydFAtPmZpcnN0T3Blbi0tOworCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUmV0dXJuIGZyb20gY2xvc2VcbiIpOworCXJldHVybiBydjsKK30KKworCisvKgorKiogZGVjaWRlIGlmIHdlIG5lZWQgdG8gdXNlIHRoZSBsaW5lIGRpc2NpcGxpbmUuCisqKiBUaGlzIHJvdXRpbmUgY2FuIHJldHVybiBvbmUgb2YgdGhyZWUgdmFsdWVzOgorKiogQ09PS19SQVcgaWYgbm8gcHJvY2Vzc2luZyBoYXMgdG8gYmUgZG9uZSBieSB0aGUgbGluZSBkaXNjaXBsaW5lIG9yIHRoZSBjYXJkCisqKiBDT09LX1dFTEwgaWYgdGhlIGxpbmUgZGlzY2lwbGluZSBtdXN0IGJlIHVzZWQgdG8gZG8gdGhlIHByb2Nlc3NpbmcKKyoqIENPT0tfTUVESVVNIGlmIHRoZSBjYXJkIGNhbiBkbyBhbGwgdGhlIHByb2Nlc3NpbmcgbmVjZXNzYXJ5LgorKi8KKyNpZiAwCitzdGF0aWMgaW50CitSSU9Db29rTW9kZShzdHJ1Y3QgdHR5c3RhdGljcyAqdHApCit7CisJLyoKKwkqKiBXZSBjYW4ndCBoYW5kbGUgdG0uY19tc3RhdGUgIT0gMCBvbiBTQ08KKwkqKiBXZSBjYW4ndCBoYW5kbGUgbWFwcGluZworCSoqIFdlIGNhbid0IGhhbmRsZSBub24tdHR3cml0ZSBsaW5lIGRpc2MuCisJKiogV2UgY2FuJ3QgaGFuZGxlIGxmbGFnIFhDQVNFCisJKiogV2UgY2FuIGhhbmRsZSBvZmxhZyBPUE9TVCAmIChPQ1JOTCwgT05MQ1IsIFRBQjMpCisJKi8KKworI2lmZGVmIENIRUNLCisJQ2hlY2tUdHlQKCB0cCApOworI2VuZGlmCisJaWYgKCEodHAtPnRtLmNfb2ZsYWcgJiBPUE9TVCkpCS8qIE5vIHBvc3QgcHJvY2Vzc2luZyAqLworCQlyZXR1cm4gQ09PS19SQVc7CS8qIFJhdyBtb2RlIG8vcCAqLworCisJaWYgKCB0cC0+dG0uY19sZmxhZyAmIFhDQVNFICkKKwkJcmV0dXJuIENPT0tfV0VMTDsJLyogVXNlIGxpbmUgZGlzYyAqLworCisJaWYgKHRwLT50bS5jX29mbGFnICYgfihPUE9TVCB8IE9OTENSIHwgT0NSTkwgfCBUQUIzICkgKQorCQlyZXR1cm4gQ09PS19XRUxMOwkvKiBVc2UgbGluZSBkaXNjIGZvciBzdHJhbmdlIG1vZGVzICovCisKKwlpZiAoIHRwLT50bS5jX29mbGFnID09IE9QT1NUICkJLyogSWYgb25seSBPUE9TVCBpcyBzZXQsIGRvIFJBVyAqLworCQlyZXR1cm4gQ09PS19SQVc7CisKKwkvKgorCSoqIFNvLCB3ZSBuZWVkIHRvIG91dHB1dCBwcm9jZXNzIQorCSovCisJcmV0dXJuIENPT0tfTUVESVVNOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitSSU9DbGVhclVwKFBvcnRQKQorc3RydWN0IFBvcnQgKlBvcnRQOworeworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUklPSGFsdGVkIHNldFxuIik7CisJUG9ydFAtPkNvbmZpZyA9IDA7CSAgLyogRGlyZWN0IHNlbWFwaG9yZSAqLworCVBvcnRQLT5Qb3J0U3RhdGUgPSAwOworCVBvcnRQLT5maXJzdE9wZW4gPSAwOworCVBvcnRQLT5GbHVzaENtZEJvZGdlID0gMDsKKwlQb3J0UC0+TW9kZW1TdGF0ZSA9IFBvcnRQLT5Db29rTW9kZSA9IDA7CisJUG9ydFAtPk1hcHBlZCA9IDA7CisJUG9ydFAtPldmbHVzaEZsYWcgPSAwOworCVBvcnRQLT5NYWdpY0ZsYWdzCT0gMDsKKwlQb3J0UC0+UnhEYXRhU3RhcnQgPSAwOworCVBvcnRQLT5UeEJ1ZmZlckluID0gMDsKKwlQb3J0UC0+VHhCdWZmZXJPdXQgPSAwOworfQorCisvKgorKiogUHV0IGEgY29tbWFuZCBvbnRvIGEgcG9ydC4KKyoqIFRoZSBQb3J0UG9pbnRlciwgY29tbWFuZCwgbGVuZ3RoIGFuZCBhcmcgYXJlIHBhc3NlZC4KKyoqIFRoZSBsZW4gaXMgdGhlIGxlbmd0aCAqaW5jbHVzaXZlKiBvZiB0aGUgY29tbWFuZCBieXRlLAorKiogYW5kIHNvIGZvciBhIGNvbW1hbmQgdGhhdCB0YWtlcyBubyBkYXRhLCBsZW49PTEuCisqKiBUaGUgYXJnIGlzIGEgc2luZ2xlIGJ5dGUsIGFuZCBpcyBvbmx5IHVzZWQgaWYgbGVuPT0yLgorKiogT3RoZXIgdmFsdWVzIG9mIGxlbiBhcmVuJ3QgYWxsb3dlZCwgYW5kIHdpbGwgY2F1c2UKKyoqIGEgcGFuaWMuCisqLworaW50IFJJT1Nob3J0Q29tbWFuZChzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBQb3J0ICpQb3J0UCwKKwkJaW50IGNvbW1hbmQsIGludCBsZW4sIGludCBhcmcpCit7CisJUEtUICpQYWNrZXRQOworCWludAkJcmV0cmllcyA9IDIwOyAvKiBhdCAxMCBwZXIgc2Vjb25kIC0+IDIgc2Vjb25kcyAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgImVudGVyaW5nIHNob3J0Y29tbWFuZC5cbiIpOworI2lmZGVmIENIRUNLCisJQ2hlY2tQb3J0UCggUG9ydFAgKTsKKwlpZiAoIGxlbiA8IDEgfHwgbGVuID4gMiApCisJCWNwcmludGYoKCJTVFVQSUQgTEVOR1RIICVkXG4iLGxlbikpOworI2VuZGlmCisKKwlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlNob3J0IGNvbW1hbmQgdG8gZGVsZXRlZCBSVEEgaWdub3JlZFxuIik7CisJCXJldHVybiBSSU9fRkFJTDsKKwl9CisJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCisJLyoKKwkqKiBJZiB0aGUgcG9ydCBpcyBpbiB1c2UgZm9yIHByZS1lbXB0aXZlIGNvbW1hbmQsIHRoZW4gd2FpdCBmb3IgaXQgdG8gCisJKiogYmUgZnJlZSBhZ2Fpbi4KKwkqLworCXdoaWxlICggKFBvcnRQLT5JblVzZSAhPSBOT1RfSU5VU0UpICYmICFwLT5SSU9IYWx0ZWQgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3Igbm90IGluIHVzZSAoJWQpXG4iLCAKKwkJCQkJICAgcmV0cmllcyk7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlpZiAocmV0cmllcy0tIDw9IDApIHsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCQlpZiAoUklPRGVsYXlfbmkoUG9ydFAsIEhVTkRSRURfTVMpID09IFJJT19GQUlMKSB7CisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCX0KKwlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlNob3J0IGNvbW1hbmQgdG8gZGVsZXRlZCBSVEEgaWdub3JlZFxuIik7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyZXR1cm4gUklPX0ZBSUw7CisJfQorCisJd2hpbGUgKCAhY2FuX2FkZF90cmFuc21pdCgmUGFja2V0UCxQb3J0UCkgJiYgIXAtPlJJT0hhbHRlZCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJXYWl0aW5nIHRvIGFkZCBzaG9ydCBjb21tYW5kIHRvIHF1ZXVlICglZClcbiIsIHJldHJpZXMpOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJaWYgKHJldHJpZXMtLSA8PSAwKSB7CisJCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJvdXQgb2YgdHJpZXMuIEZhaWxpbmdcbiIpOworCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisJCWlmICggUklPRGVsYXlfbmkoUG9ydFAsIEhVTkRSRURfTVMpPT1SSU9fRkFJTCApIHsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJfQorCisJaWYgKCBwLT5SSU9IYWx0ZWQgKSB7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyZXR1cm4gUklPX0ZBSUw7CisJfQorCisJLyoKKwkqKiBzZXQgdGhlIGNvbW1hbmQgYnl0ZSBhbmQgdGhlIGFyZ3VtZW50IGJ5dGUKKwkqLworCVdCWVRFKFBhY2tldFAtPmRhdGFbMF0gLCBjb21tYW5kKTsKKworCWlmICggbGVuPT0yICkKKwkJV0JZVEUoUGFja2V0UC0+ZGF0YVsxXSAsIGFyZyk7CisKKwkvKgorCSoqIHNldCB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgYW5kIHNldCB0aGUgY29tbWFuZCBiaXQuCisJKi8KKwlXQllURShQYWNrZXRQLT5sZW4gLCBQS1RfQ01EX0JJVCB8IGxlbik7CisKKwlhZGRfdHJhbnNtaXQoUG9ydFApOworCS8qCisJKiogQ291bnQgY2hhcmFjdGVycyB0cmFuc21pdHRlZCBmb3IgcG9ydCBzdGF0aXN0aWNzIHJlcG9ydGluZworCSovCisJaWYgKFBvcnRQLT5zdGF0c0dhdGhlcikKKwkJUG9ydFAtPnR4Y2hhcnMgKz0gbGVuOworCisJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJcmV0dXJuIHAtPlJJT0hhbHRlZCA/IFJJT19GQUlMIDogflJJT19GQUlMOworfQorCisKKyNpZiAwCisvKgorKiogVGhpcyBpcyBhbiBpb2N0bCBpbnRlcmZhY2UuIFRoaXMgaXMgdGhlIHR3ZW50aWV0aCBjZW50dXJ5LiBZb3Uga25vdyB3aGF0CisqKiBpdHMgYWxsIGFib3V0LgorKi8KK2ludAorcmlvdGlvY3RsKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGNtZCwgY2FkZHJfdCBhcmcpCit7CisJcmVnaXN0ZXIgc3RydWN0CQlQb3J0ICpQb3J0UDsKKwlyZWdpc3RlciBzdHJ1Y3QJCXR0eXN0YXRpY3MgKnRwOworCWludAkJCQkJY3VycmVudDsKKwlpbnQJCQkJCVBhcmFtU2VtSW5jcmVtZW50ZWQgPSAwOworCWludAkJCQkJb2xkX29mbGFnLCBvbGRfY2ZsYWcsIG9sZF9pZmxhZywgY2hhbmdlZCwgb2xkY29vazsKKwlpbnQJCQkJCWk7CisJdW5zaWduZWQgY2hhcgkJc2lvX3JlZ3NbNV07CQkvKiBIZXJlIGJlIG1hZ2ljICovCisJc2hvcnQJCQkJdnBpeF9jZmxhZzsKKwlzaG9ydAkJCQlkaXZpc29yOworCWludAkJCQkJYmF1ZDsKKwl1aW50CQkJCVN5c1BvcnQgPSByaW9fbWlub3IodHR5KTsKKwlpbnQJCQkJTW9kZW0gPSByaW9faXNtb2RlbSh0dHkpOworCWludAkJCQkJaW9jdGxfcHJvY2Vzc2VkOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJwb3J0IGlvY3RsIFN5c1BvcnQgJWQgY29tbWFuZCAweCV4IGFyZ3VtZW50IDB4JXggJXNcbiIsCisJCQlTeXNQb3J0LCBjbWQsIGFyZywgTW9kZW0/Ik1vZGVtIjoidHR5IikgOworCisJaWYgKCBTeXNQb3J0ID49IFJJT19QT1JUUyApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJCYWQgcG9ydCBudW1iZXIgJWRcbiIsIFN5c1BvcnQpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCVBvcnRQID0gcC0+UklPUG9ydHBbU3lzUG9ydF07CisJdHAgPSBQb3J0UC0+VHR5UDsKKworCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworI2lmZGVmIFNUQVRTCisJUG9ydFAtPlN0YXQuSW9jdGxDbnQrKzsKKyNlbmRpZgorCisJaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCXJldHVybiAtRUlPOworCX0KKworCisJaWYgKCBwLT5SSU9IYWx0ZWQgKSB7CisJCVJJT0NsZWFyVXAoIFBvcnRQICk7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKgorCSoqIENvdW50IGlvY3RscyBmb3IgcG9ydCBzdGF0aXN0aWNzIHJlcG9ydGluZworCSovCisJaWYgKFBvcnRQLT5zdGF0c0dhdGhlcikKKwkJUG9ydFAtPmlvY3RscysrOworCisJLyoKKwkqKiBTcGVjaWFsaXggUklPIElvY3RsIGNhbGxzCisJKi8KKwlzd2l0Y2ggKGNtZCkgeworCisJCWNhc2UgVENSSU9UUklBRDoKKwkJCWlmICggYXJnICkKKwkJCQlQb3J0UC0+U3RhdGUgfD0gUklPX1RSSUFEX01PREU7CisJCQllbHNlCisJCQkJUG9ydFAtPlN0YXRlICY9IH5SSU9fVFJJQURfTU9ERTsKKwkJCS8qCisJCQkqKiBOb3JtYWxseSwgd2hlbiBpc3RyaXAgaXMgc2V0IG9uIGEgcG9ydCwgYSBjb25maWcgaXMKKwkJCSoqIHNlbnQgdG8gdGhlIFJUQSBpbnN0cnVjdGluZyB0aGUgQ0QxNDAwIHRvIGRvIHRoZQorCQkJKiogc3RyaXBwaW5nLiBJbiBUUklBRCBtb2RlLCB0aGUgaW50ZXJydXB0IHJlY2VpdmUgcm91dGluZQorCQkJKiogbXVzdCBkbyB0aGUgc3RyaXBwaW5nIGluc3RlYWQsIHNpbmNlIGl0IGhhcyB0byBkZXRlY3QKKwkJCSoqIGFuIDggYml0IGZ1bmN0aW9uIGtleSBzZXF1ZW5jZS4gSWYgaXN0cmlwIGlzIHNldCB3aXRoCisJCQkqKiBUUklBRCBtb2RlIG9uKG9mZiksIGFuZCA4IGJpdCBkYXRhIGlzIGJlaW5nIHJlYWQgYnkKKwkJCSoqIHRoZSBwb3J0LCB0aGUgdXNlciB0aGVuIHR1cm5zIFRSSUFEIG1vZGUgb2ZmKG9uKSwgdGhlIFJUQQorCQkJKiogbXVzdCBiZSByZWNvbmZpZ3VyZWQgKG5vdCkgdG8gZG8gdGhlIHN0cmlwcGluZy4KKwkJCSoqIEhlbmNlIHdlIGNhbGwgUklPUGFyYW0gaGVyZS4KKwkJCSovCisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCVJJT1BhcmFtKFBvcnRQLENPTkZJRyxNb2RlbSxPS19UT19TTEVFUCk7CQorCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT1RTVEFURToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAidGJ1c3kvdHN0b3AgbW9uaXRvcmluZyAlc2FibGVkXG4iLAorCQkgCQlhcmcgPyAiZW4iIDogImRpcyIpOworCQkJLyogTW9uaXRvclRzdGF0ZSA9IDAgOyovCisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCVJJT1BhcmFtKFBvcnRQLCBDT05GSUcsIE1vZGVtLCBPS19UT19TTEVFUCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPU1RBVEU6IC8qIGN1cnJlbnQgc3RhdGUgb2YgTW9kZW0gaW5wdXQgcGlucyAqLworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1NUQVRFXG4iKTsKKwkJCWlmIChSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBNR0VUKSA9PSBSSU9fRkFJTCkKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPU1RBVEUgY29tbWFuZCBmYWlsZWRcbiIpOworCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19CVVNZOworCQkJY3VycmVudCA9IFBvcnRQLT5Nb2RlbVN0YXRlOworCQkJaWYgKCBjb3B5b3V0KChjYWRkcl90KSZjdXJyZW50LCAoaW50KWFyZywKKwkJCQkJCQlzaXplb2YoY3VycmVudCkpPT1DT1BZRkFJTCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNvcHlvdXQgZmFpbGVkXG4iKTsKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlwc2V0ZXJyKEVGQVVMVCk7CisJCQl9CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgVENSSU9NQklTOgkJLyogU2V0IG1vZGVtIGxpbmVzICovCisJCWNhc2UgVENSSU9NQklDOgkJLyogQ2xlYXIgbW9kZW0gbGluZXMgKi8KKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9NQklTL1RDUklPTUJJQ1xuIik7CisJCQlpZiAoY21kID09IFRDUklPTUJJUykgeworCQkJCXVpbnQJCXN0YXRlOworCQkJCXN0YXRlID0gKHVpbnQpYXJnOworCQkJCVBvcnRQLT5Nb2RlbVN0YXRlIHw9ICh1c2hvcnQpc3RhdGU7CisJCQkJUG9ydFAtPk1vZGVtTGluZXMgPSAodWxvbmcpIGFyZzsKKwkJCQlpZiAoUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgTUJJUykgPT0gUklPX0ZBSUwpCisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAKKwkJCQkJICJUQ1JJT01CSVMgY29tbWFuZCBmYWlsZWRcbiIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJdWludAkJc3RhdGU7CisKKwkJCQlzdGF0ZSA9ICh1aW50KWFyZzsKKwkJCQlQb3J0UC0+TW9kZW1TdGF0ZSAmPSB+KHVzaG9ydClzdGF0ZTsKKwkJCQlQb3J0UC0+TW9kZW1MaW5lcyA9ICh1bG9uZykgYXJnOworCQkJCWlmIChSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBNQklDKSA9PSBSSU9fRkFJTCkKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT01CSUMgY29tbWFuZCBmYWlsZWRcbiIpOworCQkJfQorCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19CVVNZOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPWFBPTjogLyogc2V0IFhwcmludCBPTiBzdHJpbmcgKi8KKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9YUE9OXG4iKTsKKwkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdClQb3J0UC0+WHByaW50LlhwT24sCisJCQkJCQlNQVhfWFBfQ1RSTF9MRU4pPT1DT1BZRkFJTCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNvcHlpbiBmYWlsZWRcbiIpOworCQkJCVBvcnRQLT5YcHJpbnQuWHBPblswXSA9ICdcMCc7CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJcHNldGVycihFRkFVTFQpOworCQkJfQorCQkJUG9ydFAtPlhwcmludC5YcE9uW01BWF9YUF9DVFJMX0xFTi0xXSA9ICdcMCc7CisJCQlQb3J0UC0+WHByaW50LlhwTGVuID0gc3RybGVuKFBvcnRQLT5YcHJpbnQuWHBPbikrCisJCQkJCQkJCQkJCQlzdHJsZW4oUG9ydFAtPlhwcmludC5YcE9mZik7CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgVENSSU9YUE9GRjogLyogc2V0IFhwcmludCBPRkYgc3RyaW5nICovCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPWFBPRkZcbiIpOworCQkJaWYgKCBjb3B5aW4oIChpbnQpYXJnLCAoY2FkZHJfdClQb3J0UC0+WHByaW50LlhwT2ZmLAorCQkJCQkJTUFYX1hQX0NUUkxfTEVOKT09Q09QWUZBSUwgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJDb3B5aW4gZmFpbGVkXG4iKTsKKwkJCQlQb3J0UC0+WHByaW50LlhwT2ZmWzBdID0gJ1wwJzsKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlwc2V0ZXJyKEVGQVVMVCk7CisJCQl9CisJCQlQb3J0UC0+WHByaW50LlhwT2ZmW01BWF9YUF9DVFJMX0xFTi0xXSA9ICdcMCc7CisJCQlQb3J0UC0+WHByaW50LlhwTGVuID0gc3RybGVuKFBvcnRQLT5YcHJpbnQuWHBPbikrCisJCQkJCQkJCQkJc3RybGVuKFBvcnRQLT5YcHJpbnQuWHBPZmYpOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPWFBDUFM6IC8qIHNldCBYcHJpbnQgQ1BTIHN0cmluZyAqLworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1hQQ1BTXG4iKTsKKwkJCWlmICggKHVpbnQpYXJnID4gcC0+UklPQ29uZi5NYXhYcENwcyB8fCAKKwkJCQkJKHVpbnQpYXJnIDwgcC0+UklPQ29uZi5NaW5YcENwcyApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIiVkIENQUyBvdXQgb2YgcmFuZ2VcbiIsYXJnKTsKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlwc2V0ZXJyKEVJTlZBTCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlQb3J0UC0+WHByaW50LlhwQ3BzID0gKHVpbnQpYXJnOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPWFBSSU5UOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1hQUklOVFxuIik7CisJCQlpZiAoIGNvcHlvdXQoKGNhZGRyX3QpJlBvcnRQLT5YcHJpbnQsIChpbnQpYXJnLAorCQkJCQlzaXplb2Yoc3RydWN0IFhwcmludCkpPT1DT1BZRkFJTCApIHsKKwkJCSAgICAgICAgcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJcHNldGVycihFRkFVTFQpOworCQkJfQorCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPSVhBTllPTjoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9JWEFOWU9OXG4iKTsKKwkJCVBvcnRQLT5Db25maWcgfD0gUklPX0lYQU5ZOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPSVhBTllPRkY6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPSVhBTllPRkZcbiIpOworCQkJUG9ydFAtPkNvbmZpZyAmPSB+UklPX0lYQU5ZOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPSVhPTk9OOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT0lYT05PTlxuIik7CisJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19JWE9OOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPSVhPTk9GRjoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9JWE9OT0ZGXG4iKTsKKwkJCVBvcnRQLT5Db25maWcgJj0gflJJT19JWE9OOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKworLyoKKyoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzYxIHBhcnQgZml4CisqKiBBZGRlZCBzdXBwb3J0IGZvciBDVFMgYW5kIFJUUyBmbG93IGNvbnRyb2wgaW9jdGxzIDoKKyovCisJCWNhc2UgVENSSU9DVFNGTE9XRU46CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPQ1RTRkxPV0VOXG4iKTsKKwkJCVBvcnRQLT5Db25maWcgfD0gUklPX0NUU0ZMT1c7CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCVJJT1BhcmFtKFBvcnRQLENPTkZJRyxNb2RlbSxPS19UT19TTEVFUCk7CQorCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT0NUU0ZMT1dESVM6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPQ1RTRkxPV0RJU1xuIik7CisJCQlQb3J0UC0+Q29uZmlnICY9IH5SSU9fQ1RTRkxPVzsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJUklPUGFyYW0oUG9ydFAsQ09ORklHLE1vZGVtLE9LX1RPX1NMRUVQKTsJCisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPUlRTRkxPV0VOOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1JUU0ZMT1dFTlxuIik7CisJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19SVFNGTE9XOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlSSU9QYXJhbShQb3J0UCxDT05GSUcsTW9kZW0sT0tfVE9fU0xFRVApOwkKKwkJCXJldHVybiAwOworCisJCWNhc2UgVENSSU9SVFNGTE9XRElTOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1JUU0ZMT1dESVNcbiIpOworCQkJUG9ydFAtPkNvbmZpZyAmPSB+UklPX1JUU0ZMT1c7CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCVJJT1BhcmFtKFBvcnRQLENPTkZJRyxNb2RlbSxPS19UT19TTEVFUCk7CQorCQkJcmV0dXJuIDA7CisKKy8qIGVuZCBFU0lMIDA3NjEgcGFydCBmaXggKi8KKworCX0KKworCisJLyogTHlueCBJT0NUTFMgKi8KKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFRJT0NTRVRQOgorCQljYXNlIFRJT0NTRVROOgorCQljYXNlIE9USU9DU0VUUDoKKwkJY2FzZSBPVElPQ1NFVE46CisJCQlpb2N0bF9wcm9jZXNzZWQrKzsKKwkJCXR0eXNldGgoUG9ydFAsIHRwLCAoc3RydWN0IG9sZF9zZ3R0eWIgKilhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgVENTRVRBOgorCQljYXNlIFRDU0VUQVc6CisJCWNhc2UgVENTRVRBRjoKKwkJCWlvY3RsX3Byb2Nlc3NlZCsrOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJOT04gUE9TSVggaW9jdGxcbiIpOworCQkJdHR5c2V0aF9wdihQb3J0UCwgdHAsIChzdHJ1Y3QgdGVybWlvcyAqKWFyZywgMCk7CisJCQlicmVhazsKKwkJY2FzZSBUQ1NFVEFQOgkvKiBwb3NpeCB0Y3NldGF0dHIoKSAqLworCQljYXNlIFRDU0VUQVdQOgkvKiBwb3NpeCB0Y3NldGF0dHIoKSAqLworCQljYXNlIFRDU0VUQUZQOgkvKiBwb3NpeCB0Y3NldGF0dHIoKSAqLworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJOT04gUE9TSVggU1lTViBpb2N0bFxuIik7CisJCQl0dHlzZXRoX3B2KFBvcnRQLCB0cCwgKHN0cnVjdCB0ZXJtaW9zICopYXJnLCAxKTsKKwkJCWlvY3RsX3Byb2Nlc3NlZCsrOworCQkJYnJlYWs7CisJfQorCisJLyoKKwkqKiBJZiBpdHMgYW55IG9mIHRoZSBjb21tYW5kcyB0aGF0IHJlcXVpcmUgdGhlIHBvcnQgdG8gYmUgaW4gdGhlCisJKiogbm9uLWJ1c3kgc3RhdGUgd2FpdCB1bnRpbCBhbGwgb3V0cHV0IGhhcyBkcmFpbmVkIAorCSovCisJaWYgKCFpb2N0bF9wcm9jZXNzZWQpCisJc3dpdGNoKGNtZCkgeworCQljYXNlIFRDU0VUQVc6CisJCWNhc2UgVENTRVRBRjoKKwkJY2FzZSBUQ1NFVEE6CisJCWNhc2UgVENTQlJLOgorI2RlZmluZSBPTERfUE9TSVggKCd4JyA8PCA4KQorI2RlZmluZSBPTERfUE9TSVhfU0VUQSAoT0xEX1BPU0lYIHwgMikKKyNkZWZpbmUgT0xEX1BPU0lYX1NFVEFXIChPTERfUE9TSVggfCAzKQorI2RlZmluZSBPTERfUE9TSVhfU0VUQUYgKE9MRF9QT1NJWCB8IDQpCisjZGVmaW5lIE5FV19QT1NJWCAoKCdpJyA8PCAyNCkgfCAoJ1gnIDw8IDE2KSkKKyNkZWZpbmUgTkVXX1BPU0lYX1NFVEEgKE5FV19QT1NJWCB8IDIpCisjZGVmaW5lIE5FV19QT1NJWF9TRVRBVyAoTkVXX1BPU0lYIHwgMykKKyNkZWZpbmUgTkVXX1BPU0lYX1NFVEFGIChORVdfUE9TSVggfCA0KQorCQljYXNlIE9MRF9QT1NJWF9TRVRBOgorCQljYXNlIE9MRF9QT1NJWF9TRVRBVzoKKwkJY2FzZSBPTERfUE9TSVhfU0VUQUY6CisJCWNhc2UgTkVXX1BPU0lYX1NFVEE6CisJCWNhc2UgTkVXX1BPU0lYX1NFVEFXOgorCQljYXNlIE5FV19QT1NJWF9TRVRBRjoKKyNpZmRlZiBUSU9DU0VUUAorCQljYXNlIFRJT0NTRVRQOgorI2VuZGlmCisJCWNhc2UgVElPQ1NFVEQ6CisJCWNhc2UgVElPQ1NFVE46CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIndhaXQgZm9yIG5vbi1CVVNZLCBzZW1hcGhvcmUgc2V0XG4iKTsKKwkJCS8qCisJCQkqKiBXYWl0IGZvciBkcmFpbiBoZXJlLCBhdCBsZWFzdCBhcyBmYXIgYXMgdGhlIGRvdWJsZSBidWZmZXIKKwkJCSoqIGJlaW5nIGVtcHR5LgorCQkJKi8KKwkJCS8qIFhYWCBEb2VzIHRoZSBhYm92ZSBjb21tZW50IG1lYW4gdGhhdCB0aGlzIGhhcworCQkJICAgc3RpbGwgdG8gYmUgaW1wbGVtZW50ZWQ/IC0tIFJFVyAqLworCQkJLyogWFhYIElzIHRoZSBsb2NraW5nIE9LIHRvZ2V0aGVyIHdpdGggbG9ja2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdHhlbmFibGU/IChEZWFkbG9jaz8pIC0tIFJFVyAqLworCQkJCisJCQlSSU9UeEVuYWJsZSgoY2hhciAqKVBvcnRQKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJb2xkX2NmbGFnID0gdHAtPnRtLmNfY2ZsYWc7CisJb2xkX2lmbGFnID0gdHAtPnRtLmNfaWZsYWc7CisJb2xkX29mbGFnID0gdHAtPnRtLmNfb2ZsYWc7CisJb2xkY29vayA9IFBvcnRQLT5Db29rTW9kZTsKKworCWlmICggcC0+UklPSGFsdGVkICkgeworCQlSSU9DbGVhclVwKCBQb3J0UCApOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcHNldGVycihFSU8pOworCQlyZXR1cm4gMDsKKwl9CisKKwlQb3J0UC0+Rmx1c2hDbWRCb2RnZSA9IDA7CisKKwkvKgorCSoqIElmIHRoZSBwb3J0IGlzIGxvY2tlZCwgYW5kIGl0IGlzIHJlY29uZmlndXJlZCwgd2Ugd2FudAorCSoqIHRvIHJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSB0dHkgc3RydWN0dXJlIHNvIHRoZSBjaGFuZ2UgaXMgTk9UCisJKiogbWFkZS4KKwkqLworCWlmIChQb3J0UC0+TG9jaykgeworCQl0cC0+dG0uY19pZmxhZyA9IFBvcnRQLT5TdG9yZWRUdHkuaWZsYWc7CisJCXRwLT50bS5jX29mbGFnID0gUG9ydFAtPlN0b3JlZFR0eS5vZmxhZzsKKwkJdHAtPnRtLmNfY2ZsYWcgPSBQb3J0UC0+U3RvcmVkVHR5LmNmbGFnOworCQl0cC0+dG0uY19sZmxhZyA9IFBvcnRQLT5TdG9yZWRUdHkubGZsYWc7CisJCXRwLT50bS5jX2xpbmUgPSBQb3J0UC0+U3RvcmVkVHR5LmxpbmU7CisJCWZvciAoaSA9IDA7IGkgPCBOQ0MgKyAxOyBpKyspCisJCQl0cC0+dG0uY19jY1tpXSA9IFBvcnRQLT5TdG9yZWRUdHkuY2NbaV07CisJfQorCWVsc2UgeworCQkvKgorCQkqKiBJZiB0aGUgcG9ydCBpcyBzZXQgdG8gc3RvcmUgdGhlIHBhcmFtZXRlcnMsIGFuZCBpdCBpcworCQkqKiByZWNvbmZpZ3VyZWQsIHdlIHdhbnQgdG8gc2F2ZSB0aGUgY3VycmVudCB0dHkgc3RydWN0IHNvIGl0CisJCSoqIG1heSBiZSByZXN0b3JlZCBvbiB0aGUgbmV4dCBvcGVuLgorCQkqLworCQlpZiAoUG9ydFAtPlN0b3JlKSB7CisJCQlQb3J0UC0+U3RvcmVkVHR5LmlmbGFnID0gdHAtPnRtLmNfaWZsYWc7CisJCQlQb3J0UC0+U3RvcmVkVHR5Lm9mbGFnID0gdHAtPnRtLmNfb2ZsYWc7CisJCQlQb3J0UC0+U3RvcmVkVHR5LmNmbGFnID0gdHAtPnRtLmNfY2ZsYWc7CisJCQlQb3J0UC0+U3RvcmVkVHR5LmxmbGFnID0gdHAtPnRtLmNfbGZsYWc7CisJCQlQb3J0UC0+U3RvcmVkVHR5LmxpbmUgPSB0cC0+dG0uY19saW5lOworCQkJZm9yIChpID0gMDsgaSA8IE5DQyArIDE7IGkrKykKKwkJCQlQb3J0UC0+U3RvcmVkVHR5LmNjW2ldID0gdHAtPnRtLmNfY2NbaV07CisJCX0KKwl9CisKKwljaGFuZ2VkID0gKHRwLT50bS5jX2NmbGFnICE9IG9sZF9jZmxhZykgfHwKKwkJCQkodHAtPnRtLmNfaWZsYWcgIT0gb2xkX2lmbGFnKSB8fAorCQkJCSh0cC0+dG0uY19vZmxhZyAhPSBvbGRfb2ZsYWcpOworCisJUG9ydFAtPkNvb2tNb2RlID0gUklPQ29va01vZGUodHApOwkvKiBTZXQgbmV3IGNvb2tpbmcgbW9kZSAqLworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJSSU9Jb2N0bCBjaGFuZ2VkICVkIG5ld2Nvb2sgJWQgb2xkY29vayAlZFxuIiwKKwkJCWNoYW5nZWQsUG9ydFAtPkNvb2tNb2RlLG9sZGNvb2spOworCisjaWZkZWYgTU9ERU1fU1VQUE9SVAorCS8qCisJKioga2x1ZGdlIHRvIGZvcmNlIENBUlJfT04gaWYgQ0xPQ0FMIHNldAorCSovCisJaWYgKCh0cC0+dG0uY19jZmxhZyAmIENMT0NBTCkgfHwgKFBvcnRQLT5Nb2RlbVN0YXRlICYgTVNWUjFfQ0QpKQl7CisJCXRwLT50bS5jX3N0YXRlIHw9IENBUlJfT047CisJCXdha2V1cCAoKGNhZGRyX3QpJnRwLT50bS5jX2NhbnEpOworCX0KKyNlbmRpZgorCisJaWYgKCBwLT5SSU9IYWx0ZWQgKSB7CisJCVJJT0NsZWFyVXAoIFBvcnRQICk7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlwc2V0ZXJyKEVJTyk7CisJCXJldHVybiAwOworCX0KKwkvKgorCSoqIFJlLWNvbmZpZ3VyZSBpZiBtb2RlcyBvciBjb29raW5nIGhhdmUgY2hhbmdlZAorCSovCisJaWYgKGNoYW5nZWQgfHwgb2xkY29vayAhPSBQb3J0UC0+Q29va01vZGUgfHwgKGlvY3RsX3Byb2Nlc3NlZCkpIHsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiSW9jdGwgY2hhbmdpbmcgdGhlIFBPUlQgc2V0dGluZ3NcbiIpOworCQlSSU9QYXJhbShQb3J0UCxDT05GSUcsTW9kZW0sT0tfVE9fU0xFRVApOwkKKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCX0KKworCWlmIChwLT5SSU9IYWx0ZWQpIHsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCVJJT0NsZWFyVXAoIFBvcnRQICk7CisJCXBzZXRlcnIoRUlPKTsKKwkJcmV0dXJuIDA7CisJfQorCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKgorCXR0eXNldGggLS0gc2V0IGhhcmR3YXJlIGRlcGVuZGVudCB0dHkgc2V0dGluZ3MKKyovCit2b2lkCit0dHlzZXRoKFBvcnRQLCBzLCBzZykKK3N0cnVjdCBQb3J0ICoJCVBvcnRQOworc3RydWN0IHR0eXN0YXRpY3MgKgkJczsKK3N0cnVjdCBvbGRfc2d0dHliICpzZzsKK3sKKwlzdHJ1Y3Qgb2xkX3NndHR5YiAqCXRzZzsKKwlzdHJ1Y3QgdGVybWlvcyAqdHAgPSAmcy0+dG07CisKKwl0c2cgPSAmcy0+c2c7CisKKwlpZiAoc2ctPnNnX2ZsYWdzICYgKEVWRU5QfE9ERFApKSAgeworCQl0cC0+Y19jZmxhZyAmPSBQQVJFTkI7CisJCWlmIChzZy0+c2dfZmxhZ3MgJiBFVkVOUCkgeworCQkJaWYgKHNnLT5zZ19mbGFncyAmIE9ERFApIHsKKwkJCQl0cC0+Y19jZmxhZyAmPSBWX0NTNzsKKwkJCQl0cC0+Y19jZmxhZyAmPSB+UEFSRU5COworCQkJfQorCQkJZWxzZSB7CisJCQkJdHAtPmNfY2ZsYWcgJj0gVl9DUzc7CisJCQkJdHAtPmNfY2ZsYWcgJj0gUEFSRU5COworCQkJCXRwLT5jX2NmbGFnICY9IFBBUk9ERDsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChzZy0+c2dfZmxhZ3MgJiBPRERQKSB7CisJCQl0cC0+Y19jZmxhZyAmPSBWX0NTNzsKKwkJCXRwLT5jX2NmbGFnICY9IFBBUkVOQjsKKwkJCXRwLT5jX2NmbGFnICY9IFBBUk9ERDsKKwkJfQorCQllbHNlIHsKKwkJCXRwLT5jX2NmbGFnICY9IFZfQ1M3OworCQkJdHAtPmNfY2ZsYWcgJj0gUEFSRU5COworCQl9CisJfQorLyoKKyAqIFVzZSBpc3BlZWQgYXMgdGhlIGRlc2lyZWQgc3BlZWQuICBNb3N0IGltcGxlbWVudGF0aW9ucyBkb24ndCBoYW5kbGUgCisgKiBzZXBhcmF0ZSBpbnB1dCBhbmQgb3V0cHV0IHNwZWVkcyB2ZXJ5IHdlbGwuIElmIHRoZSBSSU8gaGFuZGxlcyB0aGlzLCAKKyAqIEkgd2lsbCBoYXZlIHRvIHVzZSBzZXBhcmF0ZSBzZXRzIG9mIGZsYWdzIHRvIHN0b3JlIHRoZW0gaW4gdGhlIAorICogUG9ydCBzdHJ1Y3R1cmUuCisgKi8KKwlpZiAoICFzZy0+c2dfb3NwZWVkICkKKwkJc2ctPnNnX29zcGVlZCA9IHNnLT5zZ19pc3BlZWQ7CisJZWxzZQorCQlzZy0+c2dfaXNwZWVkID0gc2ctPnNnX29zcGVlZDsKKwlpZiAoc2ctPnNnX2lzcGVlZCA+IFZfRVhUQiApIAorCQlzZy0+c2dfaXNwZWVkID0gVl9FWFRCOworCWlmIChzZy0+c2dfaXNwZWVkIDwgVl9CMCkKKwkJc2ctPnNnX2lzcGVlZCA9IFZfQjA7CisJKnRzZyA9ICpzZzsKKyAgIHRwLT5jX2NmbGFnID0gKHRwLT5jX2NmbGFnICYgflZfQ0JBVUQpIHwgY29udl9idlsoaW50KXNnLT5zZ19pc3BlZWRdOworfQorCisvKgorCXR0eXNldGhfcHYgLS0gc2V0IGhhcmR3YXJlIGRlcGVuZGVudCB0dHkgc2V0dGluZ3MgdXNpbmcgZWl0aGVyIHRoZQorCQkJUE9TSVggdGVybWlvcyBzdHJ1Y3R1cmUgb3IgdGhlIFN5c3RlbSBWIHRlcm1pbyBzdHJ1Y3R1cmUuCisJCQkJc3lzdiA9IDAgPT4gKFBPU0lYKToJIHN0cnVjdCB0ZXJtaW9zICpzZworCQkJCXN5c3YgIT0gMCA9PiAoU3lzdGVtIFYpOiBzdHJ1Y3QgdGVybWlvICpzZworKi8KK3N0YXRpYyB2b2lkCit0dHlzZXRoX3B2KFBvcnRQLCBzLCBzZywgc3lzdikKK3N0cnVjdCBQb3J0ICpQb3J0UDsKK3N0cnVjdCB0dHlzdGF0aWNzICpzOworc3RydWN0IHRlcm1pb3MgKnNnOworaW50IHN5c3Y7Cit7CisgICAgaW50IHNwZWVkOworICAgIHVuc2lnbmVkIGNoYXIgY3NpemU7CisgICAgdW5zaWduZWQgY2hhciBjcmVhZDsKKyAgICB1bnNpZ25lZCBpbnQgbGNyX2ZsYWdzOworICAgIGludCBwczsKKyAKKyAgICBpZiAoc3lzdikgeworICAgICAgICAvKiBzZyBwb2ludHMgdG8gYSBTeXN0ZW0gViB0ZXJtaW8gc3RydWN0dXJlICovCisgICAgICAgIGNzaXplID0gKChzdHJ1Y3QgdGVybWlvICopc2cpLT5jX2NmbGFnICYgQ1NJWkU7CisgICAgICAgIGNyZWFkID0gKChzdHJ1Y3QgdGVybWlvICopc2cpLT5jX2NmbGFnICYgQ1JFQUQ7CisgICAgICAgIHNwZWVkID0gY29udl92YlsoKHN0cnVjdCB0ZXJtaW8gKilzZyktPmNfY2ZsYWcgJiBWX0NCQVVEXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIHNnIHBvaW50cyB0byBhIFBPU0lYIHRlcm1pb3Mgc3RydWN0dXJlICovCisgICAgICAgIGNzaXplID0gc2ctPmNfY2ZsYWcgJiBDU0laRTsKKyAgICAgICAgY3JlYWQgPSBzZy0+Y19jZmxhZyAmIENSRUFEOworICAgICAgICBzcGVlZCA9IGNvbnZfdmJbc2ctPmNfY2ZsYWcgJiBWX0NCQVVEXTsKKyAgICB9CisgICAgaWYgKHMtPnNnLnNnX2lzcGVlZCAhPSBzcGVlZCB8fCBzLT5zZy5zZ19vc3BlZWQgIT0gc3BlZWQpIHsKKyAgICAgICAgcy0+c2cuc2dfaXNwZWVkID0gc3BlZWQ7CisgICAgICAgIHMtPnNnLnNnX29zcGVlZCA9IHNwZWVkOworICAgICAgICBzLT50bS5jX2NmbGFnID0gKHMtPnRtLmNfY2ZsYWcgJiB+Vl9DQkFVRCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfYnZbKGludClzLT5zZy5zZ19pc3BlZWRdOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW90eXBlcy5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjN2M0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3R5cGVzLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgUiBJIE8gVCBZIFAgRSBTCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBKb24gQnJhd24KKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfcmlvdHlwZXNfaAorI2RlZmluZSBfcmlvdHlwZXNfaCAxCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CisvKiBzdGF0aWMgY2hhciAqX3Jpb19yaW90eXBlc19oX3NjY3MgPSAiQCgjKXJpb3R5cGVzLmgJMS4xMCI7ICovCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSU5LRVJORUwKKworI2lmICFkZWZpbmVkKE1JUFNBVCkKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgTlVNQkVSX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgV09SRF9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IEJZVEVfcHRyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBjaGFyX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgQ2hhbm5lbF9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IEZSRUVfTElTVF9wdHJfcHRyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBGUkVFX0xJU1RfcHRyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBMUEJfcHRyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBQcm9jZXNzX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgUEhCX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgUEtUX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgUEtUX3B0cl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFFfQlVGX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgUV9CVUZfcHRyX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgUk9VVEVfU1RSX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgUlVQX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgc2hvcnRfcHRyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X3Nob3J0X3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNob3J0X3B0cjsKKyNlbHNlCisvKiBNSVBTQVQgdHlwZXMgKi8KK3R5cGVkZWYgY2hhciBSSU9fUE9JTlRFUls4XTsKK3R5cGVkZWYgUklPX1BPSU5URVIgTlVNQkVSX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgV09SRF9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIEJZVEVfcHRyOwordHlwZWRlZiBSSU9fUE9JTlRFUiBjaGFyX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgQ2hhbm5lbF9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIEZSRUVfTElTVF9wdHJfcHRyOwordHlwZWRlZiBSSU9fUE9JTlRFUiBGUkVFX0xJU1RfcHRyOwordHlwZWRlZiBSSU9fUE9JTlRFUiBMUEJfcHRyOwordHlwZWRlZiBSSU9fUE9JTlRFUiBQcm9jZXNzX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgUEhCX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgUEtUX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgUEtUX3B0cl9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFFfQlVGX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgUV9CVUZfcHRyX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgUk9VVEVfU1RSX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgUlVQX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgc2hvcnRfcHRyOwordHlwZWRlZiBSSU9fUE9JTlRFUiB1X3Nob3J0X3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgdXNob3J0X3B0cjsKKyNlbmRpZgorCisjZWxzZSAvKiBub3QgSU5LRVJORUwgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgIEJZVEU7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBXT1JEOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgRFdPUkQ7Cit0eXBlZGVmIHNob3J0ICAgICAgICAgICBOVU1CRVI7Cit0eXBlZGVmIHNob3J0ICAgICAgICAgICAqTlVNQkVSX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICpXT1JEX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICpCWVRFX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVjaGFyIDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVzaG9ydCA7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50IDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIHVsb25nIDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVfY2hhciA7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1X3Nob3J0IDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVfaW50IDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIHVfbG9uZyA7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBFUlJPUiA7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgSUQgOwordHlwZWRlZiBjaGFyICAgICAgICAgICAgICpjaGFyX3B0cjsKK3R5cGVkZWYgQ2hhbm5lbCAgICAgICAgICAqQ2hhbm5lbF9wdHI7Cit0eXBlZGVmIHN0cnVjdCBGUkVFX0xJU1QgKkZSRUVfTElTVF9wdHI7Cit0eXBlZGVmIHN0cnVjdCBGUkVFX0xJU1QgKipGUkVFX0xJU1RfcHRyX3B0cjsKK3R5cGVkZWYgc3RydWN0IExQQiAgICAgICAqTFBCX3B0cjsKK3R5cGVkZWYgc3RydWN0IFByb2Nlc3MgICAqUHJvY2Vzc19wdHI7Cit0eXBlZGVmIHN0cnVjdCBQSEIgICAgICAgKlBIQl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBQS1QgICAgICAgKlBLVF9wdHI7Cit0eXBlZGVmIHN0cnVjdCBQS1QgICAgICAgKipQS1RfcHRyX3B0cjsKK3R5cGVkZWYgc3RydWN0IFFfQlVGICAgICAqUV9CVUZfcHRyOwordHlwZWRlZiBzdHJ1Y3QgUV9CVUYgICAgICoqUV9CVUZfcHRyX3B0cjsKK3R5cGVkZWYgc3RydWN0IFJPVVRFX1NUUiAqUk9VVEVfU1RSX3B0cjsKK3R5cGVkZWYgc3RydWN0IFJVUCAgICAgICAqUlVQX3B0cjsKK3R5cGVkZWYgc2hvcnQgICAgICAgICAgICAqc2hvcnRfcHRyOwordHlwZWRlZiB1X3Nob3J0ICAgICAgICAgICp1X3Nob3J0X3B0cjsKK3R5cGVkZWYgdXNob3J0ICAgICAgICAgICAqdXNob3J0X3B0cjsKK3R5cGVkZWYgc3RydWN0IFBLVAkgUEtUOwordHlwZWRlZiBzdHJ1Y3QgTFBCCSBMUEI7Cit0eXBlZGVmIHN0cnVjdCBSVVAJIFJVUDsKKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfX3Jpb3R5cGVzX18gKi8KKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3dpbmlmLmggYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3dpbmlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhNGYxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvd2luaWYuaApAQCAtMCwwICsxLDEzMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglUaXRsZQkJOglSSU8gU2hhcmVkIE1lbW9yeSBXaW5kb3cgSW50ZWZhY2UJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUF1dGhvcgkJOglOLlAuVmFzc2FsbG8JCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUNyZWF0aW9uCToJN3RoIEp1bmUgMTk5OQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoJVmVyc2lvbgkJOgkxLjAuMAkJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUNvcHlyaWdodAk6CShjKSBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuIDE5OTkJKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoJCQkJCQkJCQkqLworLyoJRGVzY3JpcHRpb24JOglQcm90b3R5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucwkqLworLyoJCQkJZGVzY3JpYmluZyBSSU8gaG9zdCBjYXJkIHNoYXJlZAltZW1vcnkJKi8KKy8qCQkJCXdpbmRvdyBpbnRlcmZhY2Ugc3RydWN0dXJlczoJCSovCisvKgkJCQkJUEFSTU1BUAkJCQkqLworLyoJCQkJCVJVUAkJCQkqLworLyoJCQkJCVBIQgkJCQkqLworLyoJCQkJCUxQQgkJCQkqLworLyoJCQkJCVBLVAkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSGlzdG9yeS4uLgorCisxLjAuMAkwNy8wNi85OSBOUFYJQ3JlYXRpb24uIChiYXNlZCBvbiBQQVJNTUFQLkgpCisKKyovCisKKyNpZm5kZWYJX3Jpb3dpbmlmX2gJCQkJLyogSWYgUklPV0lORElGLkggbm90IGFscmVhZHkgZGVmaW5lZCAqLworI2RlZmluZQlfcmlvd2luaWZfaCAgICAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIEdlbmVyYWwgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUJVFBOVUxMCQkoKF91MTYpKDB4ODAwMCkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFBBUk1fTUFQICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBQQVJNX01BUCBzdHJ1Y3R1cmUgZGVmaW5lcyBnbG9iYWwgdmFsdWVzIHJlbGF0aW5nIHRvIHRoZSBIb3N0IENhcmQgLyBSVEEKKyAgIGFuZCBpcyB0aGUgbWFpbiBzdHJ1Y3R1cmUgZnJvbSB3aGljaCBhbGwgb3RoZXIgc3RydWN0dXJlcyBhcmUgcmVmZXJlbmNlZC4gKi8KKwordHlwZWRlZglzdHJ1Y3QJX1BBUk1fTUFQCit7CisJX3UxNglwaGJfcHRyOwkJLyogMHgwMCBQb2ludGVyIHRvIHRoZSBQSEIgYXJyYXkgKi8KKwlfdTE2CXBoYl9udW1fcHRyOwkJLyogMHgwMiBQdHIgdG8gTnVtYmVyIG9mIFBIQidzICovCisJX3UxNglmcmVlX2xpc3Q7CQkvKiAweDA0IEZyZWUgTGlzdCBwb2ludGVyICovCisJX3UxNglmcmVlX2xpc3RfZW5kOwkJLyogMHgwNiBGcmVlIExpc3QgRW5kIHBvaW50ZXIgKi8KKwlfdTE2CXFfZnJlZV9saXN0X3B0cjsJLyogMHgwOCBQdHIgdG8gUV9CVUYgdmFyaWFibGUgKi8KKwlfdTE2CXVuaXRfaWRfcHRyOwkJLyogMHgwQSBVbml0IElkICovCisJX3UxNglsaW5rX3N0cl9wdHI7CQkvKiAweDBDIExpbmsgU3RydWN0dXJlIEFycmF5ICovCisJX3UxNglib290bG9hZGVyXzE7CQkvKiAweDBFIDFzdCBTdGFnZSBCb290IExvYWRlciAqLworCV91MTYJYm9vdGxvYWRlcl8yOwkJLyogMHgxMCAybmQgU3RhZ2UgQm9vdCBMb2FkZXIgKi8KKwlfdTE2CXBvcnRfcm91dGVfbWFwX3B0cjsJLyogMHgxMiBQb3J0IFJvdXRlIE1hcCAqLworCV91MTYJcm91dGVfcHRyOwkJLyogMHgxNCBSb3V0ZSBNYXAgKi8KKwlfdTE2CW1hcF9wcmVzZW50OwkJLyogMHgxNiBSb3V0ZSBNYXAgcHJlc2VudCAqLworCV91MTYJcGt0X251bTsJCS8qIDB4MTggVG90YWwgbnVtYmVyIG9mIHBhY2tldHMgKi8KKwlfdTE2CXFfbnVtOwkJCS8qIDB4MUEgVG90YWwgbnVtYmVyIG9mIFEgcGFja2V0cyAqLworCV91MTYJYnVmZmVyc19wZXJfcG9ydDsJLyogMHgxQyBOdW1iZXIgb2YgYnVmZmVycyBwZXIgcG9ydCAqLworCV91MTYJaGVhcF9zaXplOwkJLyogMHgxRSBJbml0aWFsIHNpemUgb2YgaGVhcCAqLworCV91MTYJaGVhcF9sZWZ0OwkJLyogMHgyMCBDdXJyZW50IEhlYXAgbGVmdCAqLworCV91MTYJZXJyb3I7CQkJLyogMHgyMiBFcnJvciBjb2RlICovCisJX3UxNgl0eF9tYXg7CQkJLyogMHgyNCBNYXggbnVtYmVyIG9mIHR4IHBrdHMgcGVyIHBoYiAqLworCV91MTYJcnhfbWF4OwkJCS8qIDB4MjYgTWF4IG51bWJlciBvZiByeCBwa3RzIHBlciBwaGIgKi8KKwlfdTE2CXJ4X2xpbWl0OwkJLyogMHgyOCBGb3IgaGlnaCAvIGxvdyB3YXRlcm1hcmtzICovCisJX3UxNglsaW5rczsJCQkvKiAweDJBIExpbmtzIHRvIHVzZSAqLworCV91MTYJdGltZXI7CQkJLyogMHgyQyBJbnRlcnJ1cHRzIHBlciBzZWNvbmQgKi8KKwlfdTE2CXJ1cHM7CQkJLyogMHgyRSBQb2ludGVyIHRvIHRoZSBSVVBzICovCisJX3UxNgltYXhfcGhiOwkJLyogMHgzMCBNb3N0bHkgZm9yIGRlYnVnZ2luZyAqLworCV91MTYJbGl2aW5nOwkJCS8qIDB4MzIgSnVzdCBpbmNyZW1lbnRzISEgKi8KKwlfdTE2CWluaXRfZG9uZTsJCS8qIDB4MzQgSW5pdGlhbGlzYXRpb24gb3ZlciAqLworCV91MTYJYm9vdGluZ19saW5rOwkJLyogMHgzNiAqLworCV91MTYJaWRsZV9jb3VudDsJCS8qIDB4MzggSWRsZSB0aW1lIGNvdW50ZXIgKi8KKwlfdTE2CWJ1c3lfY291bnQ7CQkvKiAweDNBIEJ1c3kgY291bnRlciAqLworCV91MTYJaWRsZV9jb250cm9sOwkJLyogMHgzQyBDb250cm9sIElkbGUgUHJvY2VzcyAqLworCV91MTYJdHhfaW50cjsJCS8qIDB4M0UgVFggaW50ZXJydXB0IHBlbmRpbmcgKi8KKwlfdTE2CXJ4X2ludHI7CQkvKiAweDQwIFJYIGludGVycnVwdCBwZW5kaW5nICovCisJX3UxNglydXBfaW50cjsJCS8qIDB4NDIgUlVQIGludGVycnVwdCBwZW5kaW5nICovCisKK30gUEFSTV9NQVA7CisKKy8qIFNhbWUgdGhpbmcgYWdhaW4sIGJ1dCBkZWZpbmVkIGFzIG9mZnNldHMuLi4gKi8KKworI2RlZmluZQlQTV9waGJfcHRyCQkweDAwCS8qIDB4MDAgUG9pbnRlciB0byB0aGUgUEhCIGFycmF5ICovCisjZGVmaW5lCVBNX3BoYl9udW1fcHRyCQkweDAyCS8qIDB4MDIgUHRyIHRvIE51bWJlciBvZiBQSEIncyAqLworI2RlZmluZQlQTV9mcmVlX2xpc3QJCTB4MDQJLyogMHgwNCBGcmVlIExpc3QgcG9pbnRlciAqLworI2RlZmluZQlQTV9mcmVlX2xpc3RfZW5kCTB4MDYJLyogMHgwNiBGcmVlIExpc3QgRW5kIHBvaW50ZXIgKi8KKyNkZWZpbmUJUE1fcV9mcmVlX2xpc3RfcHRyCTB4MDgJLyogMHgwOCBQdHIgdG8gUV9CVUYgdmFyaWFibGUgKi8KKyNkZWZpbmUJUE1fdW5pdF9pZF9wdHIJCTB4MEEJLyogMHgwQSBVbml0IElkICovCisjZGVmaW5lCVBNX2xpbmtfc3RyX3B0cgkJMHgwQwkvKiAweDBDIExpbmsgU3RydWN0dXJlIEFycmF5ICovCisjZGVmaW5lCVBNX2Jvb3Rsb2FkZXJfMQkJMHgwRQkvKiAweDBFIDFzdCBTdGFnZSBCb290IExvYWRlciAqLworI2RlZmluZQlQTV9ib290bG9hZGVyXzIJCTB4MTAJLyogMHgxMCAybmQgU3RhZ2UgQm9vdCBMb2FkZXIgKi8KKyNkZWZpbmUJUE1fcG9ydF9yb3V0ZV9tYXBfcHRyCTB4MTIJLyogMHgxMiBQb3J0IFJvdXRlIE1hcCAqLworI2RlZmluZQlQTV9yb3V0ZV9wdHIJCTB4MTQJLyogMHgxNCBSb3V0ZSBNYXAgKi8KKyNkZWZpbmUJUE1fbWFwX3ByZXNlbnQJCTB4MTYJLyogMHgxNiBSb3V0ZSBNYXAgcHJlc2VudCAqLworI2RlZmluZQlQTV9wa3RfbnVtCQkweDE4CS8qIDB4MTggVG90YWwgbnVtYmVyIG9mIHBhY2tldHMgKi8KKyNkZWZpbmUJUE1fcV9udW0JCTB4MUEJLyogMHgxQSBUb3RhbCBudW1iZXIgb2YgUSBwYWNrZXRzICovCisjZGVmaW5lCVBNX2J1ZmZlcnNfcGVyX3BvcnQJMHgxQwkvKiAweDFDIE51bWJlciBvZiBidWZmZXJzIHBlciBwb3J0ICovCisjZGVmaW5lCVBNX2hlYXBfc2l6ZQkJMHgxRQkvKiAweDFFIEluaXRpYWwgc2l6ZSBvZiBoZWFwICovCisjZGVmaW5lCVBNX2hlYXBfbGVmdAkJMHgyMAkvKiAweDIwIEN1cnJlbnQgSGVhcCBsZWZ0ICovCisjZGVmaW5lCVBNX2Vycm9yCQkweDIyCS8qIDB4MjIgRXJyb3IgY29kZSAqLworI2RlZmluZQlQTV90eF9tYXgJCTB4MjQJLyogMHgyNCBNYXggbnVtYmVyIG9mIHR4IHBrdHMgcGVyIHBoYiAqLworI2RlZmluZQlQTV9yeF9tYXgJCTB4MjYJLyogMHgyNiBNYXggbnVtYmVyIG9mIHJ4IHBrdHMgcGVyIHBoYiAqLworI2RlZmluZQlQTV9yeF9saW1pdAkJMHgyOAkvKiAweDI4IEZvciBoaWdoIC8gbG93IHdhdGVybWFya3MgKi8KKyNkZWZpbmUJUE1fbGlua3MJCTB4MkEJLyogMHgyQSBMaW5rcyB0byB1c2UgKi8KKyNkZWZpbmUJUE1fdGltZXIJCTB4MkMJLyogMHgyQyBJbnRlcnJ1cHRzIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUJUE1fcnVwcwkJCTB4MkUJLyogMHgyRSBQb2ludGVyIHRvIHRoZSBSVVBzICovCisjZGVmaW5lCVBNX21heF9waGIJCTB4MzAJLyogMHgzMCBNb3N0bHkgZm9yIGRlYnVnZ2luZyAqLworI2RlZmluZQlQTV9saXZpbmcJCTB4MzIJLyogMHgzMiBKdXN0IGluY3JlbWVudHMhISAqLworI2RlZmluZQlQTV9pbml0X2RvbmUJCTB4MzQJLyogMHgzNCBJbml0aWFsaXNhdGlvbiBvdmVyICovCisjZGVmaW5lCVBNX2Jvb3RpbmdfbGluawkJMHgzNgkvKiAweDM2ICovCisjZGVmaW5lCVBNX2lkbGVfY291bnQJCTB4MzgJLyogMHgzOCBJZGxlIHRpbWUgY291bnRlciAqLworI2RlZmluZQlQTV9idXN5X2NvdW50CQkweDNBCS8qIDB4M0EgQnVzeSBjb3VudGVyICovCisjZGVmaW5lCVBNX2lkbGVfY29udHJvbAkJMHgzQwkvKiAweDNDIENvbnRyb2wgSWRsZSBQcm9jZXNzICovCisjZGVmaW5lCVBNX3R4X2ludHIJCTB4M0UJLyogMHg0RSBUWCBpbnRlcnJ1cHQgcGVuZGluZyAqLworI2RlZmluZQlQTV9yeF9pbnRyCQkweDQwCS8qIDB4NDAgUlggaW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUJUE1fcnVwX2ludHIJCTB4NDIJLyogMHg0MiBSVVAgaW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUJc2l6ZW9mX1BBUk1fTUFQCQkweDQ0CS8qIHN0cnVjdHVyZSBzaXplID0gMHg0NCAqLworCisvKiBQQVJNX01BUC5lcnJvciBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlFX05PX0VSUk9SCQkweDAwCisjZGVmaW5lCUVfUFJPQ0VTU19OT1RfSU5JVAkweDAxCisjZGVmaW5lCUVfTElOS19USU1FT1VUCQkweDAyCisjZGVmaW5lCUVfTk9fUk9VVEUJCTB4MDMKKyNkZWZpbmUJRV9DT05GVVNFRAkJMHgwNAorI2RlZmluZQlFX0hPTUUJCQkweDA1CisjZGVmaW5lCUVfQ1NVTV9GQUlMCQkweDA2CisjZGVmaW5lCUVfRElTQ09OTkVDVEVECQkweDA3CisjZGVmaW5lCUVfQkFEX1JVUAkJMHgwOAorI2RlZmluZQlFX05PX1ZJUkdJTgkJMHgwOQorI2RlZmluZQlFX0JPT1RfUlVQX0JVU1kJCTB4MTAKKyNkZWZpbmUJRV9DSEFOQUxMT0MJCTB4ODAKKyNkZWZpbmUJRV9QT0xMX0FMTE9DCQkweDgxCisjZGVmaW5lCUVfTFRUV0FLRQkJMHg4MgorI2RlZmluZQlFX0xUVF9BTExPQwkJMHg4MworI2RlZmluZQlFX0xSVF9BTExPQwkJMHg4NAorI2RlZmluZQlFX0NJUlJVUwkJMHg4NQorI2RlZmluZQlFX01PTklUT1IJCTB4ODYKKyNkZWZpbmUJRV9QSEJfQUxMT0MJCTB4ODcKKyNkZWZpbmUJRV9BUlJBWV9BTExPQwkJMHg4OAorI2RlZmluZQlFX1FCVUZfQUxMT0MJCTB4ODkKKyNkZWZpbmUJRV9QS1RfQUxMT0MJCTB4OGEKKyNkZWZpbmUJRV9HRVRfVFhfUV9CVUYJCTB4OGIKKyNkZWZpbmUJRV9HRVRfUlhfUV9CVUYJCTB4OGMKKyNkZWZpbmUJRV9NRU1fT1VUCQkweDhkCisjZGVmaW5lCUVfTU1VX0lOSVQJCTB4OGUKKyNkZWZpbmUJRV9MVFRfSU5JVAkJMHg4ZgorI2RlZmluZQlFX0xSVF9JTklUCQkweDkwCisjZGVmaW5lCUVfTElOS19SVU4JCTB4OTEKKyNkZWZpbmUJRV9NT05JVE9SX0FMTE9DCQkweDkyCisjZGVmaW5lCUVfTU9OSVRPUl9JTklUCQkweDkzCisjZGVmaW5lCUVfUE9MTF9JTklUCQkweDk0CisKKy8qIFBBUk1fTUFQLmxpbmtzIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVJJT19MSU5LX0VOQUJMRQkweDgwRkYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBSVVAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIFJVUCAoUmVtb3RlIFVuaXQgUG9ydCkgc3RydWN0dXJlIHJlbGF0ZXMgdG8gdGhlIFJlbW90ZSBUZXJtaW5hbCBBZGFwdGVycworICAgYXR0YWNoZWQgdG8gdGhlIHN5c3RlbSBhbmQgdGhlcmUgaXMgbm9ybWFsbHkgYW4gYXJyYXkgb2YgTUFYX1JVUFMgKD0xNikgc3RydWN0dXJlcworICAgaW4gYSBob3N0IGNhcmQsIGRlZmluZWQgYnkgUEFSTV9NQVAtPnJ1cC4gKi8KKwordHlwZWRlZglzdHJ1Y3QJX1JVUAoreworCV91MTYJCXR4cGt0OwkJCS8qIDB4MDAgT3V0Z29pbmcgcGFja2V0ICovCisJX3UxNgkJcnhwa3Q7CQkJLyogMHgwMiBuY29taW5nIHBhY2tldCAqLworCV91MTYJCWxpbms7CQkJLyogMHgwNCBXaGljaCBsaW5rIHRvIHNlbmQgcGFja2V0IGRvd24gPyAqLworCV91OAkJcnVwX2Rlc3RfdW5pdFsyXTsJLyogMHgwNiBEZXN0aW5hdGlvbiBVbml0ICovCisJX3UxNgkJaGFuZHNoYWtlOwkJLyogMHgwOCBIYW5kc2hha2luZyAqLworCV91MTYJCXRpbWVvdXQ7CQkvKiAweDBBIFRpbWVvdXQgKi8KKwlfdTE2CQlzdGF0dXM7CQkJLyogMHgwQyBTdGF0dXMgKi8KKwlfdTE2CQl0eGNvbnRyb2w7CQkvKiAweDBFIFRyYW5zbWl0IGNvbnRyb2wgKi8KKwlfdTE2CQlyeGNvbnRyb2w7CQkvKiAweDEwIFJlY2VpdmUgY29udHJvbCAqLworCit9IFJVUDsKKworLyogU2FtZSB0aGluZyBhZ2FpbiwgYnV0IGRlZmluZWQgYXMgb2Zmc2V0cy4uLiAqLworCisjZGVmaW5lCVJVUF90eHBrdAkJMHgwMAkJLyogMHgwMCBPdXRnb2luZyBwYWNrZXQgKi8KKyNkZWZpbmUJUlVQX3J4cGt0CQkweDAyCQkvKiAweDAyIEluY29taW5nIHBhY2tldCAqLworI2RlZmluZQlSVVBfbGluawkJMHgwNAkJLyogMHgwNCBXaGljaCBsaW5rIHRvIHNlbmQgcGFja2V0IGRvd24gPyAqLworI2RlZmluZQlSVVBfcnVwX2Rlc3RfdW5pdAkweDA2CQkvKiAweDA2IERlc3RpbmF0aW9uIFVuaXQgKi8KKyNkZWZpbmUJUlVQX2hhbmRzaGFrZQkJMHgwOAkJLyogMHgwOCBIYW5kc2hha2luZyAqLworI2RlZmluZQlSVVBfdGltZW91dAkJMHgwQQkJLyogMHgwQSBUaW1lb3V0ICovCisjZGVmaW5lCVJVUF9zdGF0dXMJCTB4MEMJCS8qIDB4MEMgU3RhdHVzICovCisjZGVmaW5lCVJVUF90eGNvbnRyb2wJCTB4MEUJCS8qIDB4MEUgVHJhbnNtaXQgY29udHJvbCAqLworI2RlZmluZQlSVVBfcnhjb250cm9sCQkweDEwCQkvKiAweDEwIFJlY2VpdmUgY29udHJvbCAqLworI2RlZmluZQlzaXplb2ZfUlVQCQkweDEyCQkvKiBzdHJ1Y3R1cmUgc2l6ZSA9IDB4MTIgKi8KKworI2RlZmluZSBNQVhfUlVQCQkJMTYKKworLyogUlVQLnR4Y29udHJvbCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlUWF9SVVBfSU5BQ1RJVkUJCTAJCS8qIE5vdGhpbmcgdG8gdHJhbnNtaXQgKi8KKyNkZWZpbmUJVFhfUEFDS0VUX1JFQURZCQkxCQkvKiBUcmFuc21pdCBwYWNrZXQgcmVhZHkgKi8KKyNkZWZpbmUJVFhfTE9DS19SVVAJCTIJCS8qIFRyYW5zbWl0IHNpZGUgbG9ja2VkICovCisKKy8qIFJVUC50eGNvbnRyb2wgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUlhfUlVQX0lOQUNUSVZFCQkwCQkvKiBOb3RoaW5nIHJlY2VpdmVkICovCisjZGVmaW5lCVJYX1BBQ0tFVF9SRUFEWQkJMQkJLyogUGFja2V0IHJlY2VpdmVkICovCisKKyNkZWZpbmUJUlVQX05PX09XTkVSCQkweEZGCQkvKiBSVVAgbm90IG93bmVkIGJ5IGFueSBwcm9jZXNzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUEhCICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBQSEIgKFBvcnQgSGVhZGVyIEJsb2NrKSBzdHJ1Y3R1cmUgcmVsYXRlcyB0byB0aGUgc2VyaWFsIHBvcnRzIGF0dGFjaGVkCisgICB0byB0aGUgc3lzdGVtIGFuZCB0aGVyZSBpcyBub3JtYWxseSBhbiBhcnJheSBvZiBNQVhfUEhCUyAoPTEyOCkgc3RydWN0dXJlcworICAgaW4gYSBob3N0IGNhcmQsIGRlZmluZWQgYnkgUEFSTV9NQVAtPnBoYl9wdHIgYW5kIFBBUk1fTUFQLT5waGJfbnVtX3B0ci4gKi8KKwordHlwZWRlZglzdHJ1Y3QJX1BIQgoreworCV91MTYJCXNvdXJjZTsJCQkvKiAweDAwIExvY2F0aW9uIG9mIHRoZSBQSEIgaW4gdGhlIGhvc3QgY2FyZCAqLworCV91MTYJCWhhbmRzaGFrZTsJCS8qIDB4MDIgVXNlZCB0byBtYW5hZ2UgcmVjZWl2ZSBwYWNrZXQgZmxvdyBjb250cm9sICovCisJX3UxNgkJc3RhdHVzOwkJCS8qIDB4MDQgSW50ZXJuYWwgcG9ydCB0cmFuc21pdC9yZWNlaXZlIHN0YXR1cyAqLworCV91MTYJCXRpbWVvdXQ7CQkvKiAweDA2IFRpbWUgcGVyaW9kIHRvIHdhaXQgZm9yIGFuIEFDSyAqLworCV91MTYJCWxpbms7CQkJLyogMHgwOCBUaGUgaG9zdCBsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgUEhCICovCisJX3UxNgkJZGVzdGluYXRpb247CQkvKiAweDBBIExvY2F0aW9uIG9mIHRoZSByZW1vdGUgcG9ydCBvbiB0aGUgbmV0d29yayAqLworCisJX3UxNgkJdHhfc3RhcnQ7CQkvKiAweDBDIGZpcnN0IGVudHJ5IGluIHRoZSBwYWNrZXQgYXJyYXkgZm9yIHRyYW5zbWl0IHBhY2tldHMgKi8KKwlfdTE2CQl0eF9lbmQ7CQkJLyogMHgwRSBsYXN0IGVudHJ5IGluIHRoZSBwYWNrZXQgYXJyYXkgZm9yIHRyYW5zbWl0IHBhY2tldHMgKi8KKwlfdTE2CQl0eF9hZGQ7CQkJLyogMHgxMCBwb3NpdGlvbiBpbiB0aGUgcGFja2V0IGFycmF5IGZvciBuZXcgdHJhbnNtaXQgcGFja2V0cyAqLworCV91MTYJCXR4X3JlbW92ZTsJCS8qIDB4MTIgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgcGFja2V0IHBvaW50ZXIgYXJyYXkgKi8KKworCV91MTYJCXJ4X3N0YXJ0OwkJLyogMHgxNCBmaXJzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciByZWNlaXZlIHBhY2tldHMgKi8KKwlfdTE2CQlyeF9lbmQ7CQkJLyogMHgxNiBsYXN0IGVudHJ5IGluIHRoZSBwYWNrZXQgYXJyYXkgZm9yIHJlY2VpdmUgcGFja2V0cyAqLworCV91MTYJCXJ4X2FkZDsJCQkvKiAweDE4IHBvc2l0aW9uIGluIHRoZSBwYWNrZXQgYXJyYXkgZm9yIG5ldyByZWNlaXZlIHBhY2tldHMgKi8KKwlfdTE2CQlyeF9yZW1vdmU7CQkvKiAweDFBIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHBhY2tldCBwb2ludGVyIGFycmF5ICovCisKK30gUEhCOworCisvKiBTYW1lIHRoaW5nIGFnYWluLCBidXQgZGVmaW5lZCBhcyBvZmZzZXRzLi4uICovCisKKyNkZWZpbmUJUEhCX3NvdXJjZQkJMHgwMAkJLyogMHgwMCBMb2NhdGlvbiBvZiB0aGUgUEhCIGluIHRoZSBob3N0IGNhcmQgKi8KKyNkZWZpbmUJUEhCX2hhbmRzaGFrZQkJMHgwMgkJLyogMHgwMiBVc2VkIHRvIG1hbmFnZSByZWNlaXZlIHBhY2tldCBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUJUEhCX3N0YXR1cwkJMHgwNAkJLyogMHgwNCBJbnRlcm5hbCBwb3J0IHRyYW5zbWl0L3JlY2VpdmUgc3RhdHVzICovCisjZGVmaW5lCVBIQl90aW1lb3V0CQkweDA2CQkvKiAweDA2IFRpbWUgcGVyaW9kIHRvIHdhaXQgZm9yIGFuIEFDSyAqLworI2RlZmluZQlQSEJfbGluawkJMHgwOAkJLyogMHgwOCBUaGUgaG9zdCBsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgUEhCICovCisjZGVmaW5lCVBIQl9kZXN0aW5hdGlvbgkJMHgwQQkJLyogMHgwQSBMb2NhdGlvbiBvZiB0aGUgcmVtb3RlIHBvcnQgb24gdGhlIG5ldHdvcmsgKi8KKyNkZWZpbmUJUEhCX3R4X3N0YXJ0CQkweDBDCQkvKiAweDBDIGZpcnN0IGVudHJ5IGluIHRoZSBwYWNrZXQgYXJyYXkgZm9yIHRyYW5zbWl0IHBhY2tldHMgKi8KKyNkZWZpbmUJUEhCX3R4X2VuZAkJMHgwRQkJLyogMHgwRSBsYXN0IGVudHJ5IGluIHRoZSBwYWNrZXQgYXJyYXkgZm9yIHRyYW5zbWl0IHBhY2tldHMgKi8KKyNkZWZpbmUJUEhCX3R4X2FkZAkJMHgxMAkJLyogMHgxMCBwb3NpdGlvbiBpbiB0aGUgcGFja2V0IGFycmF5IGZvciBuZXcgdHJhbnNtaXQgcGFja2V0cyAqLworI2RlZmluZQlQSEJfdHhfcmVtb3ZlCQkweDEyCQkvKiAweDEyIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHBhY2tldCBwb2ludGVyIGFycmF5ICovCisjZGVmaW5lCVBIQl9yeF9zdGFydAkJMHgxNAkJLyogMHgxNCBmaXJzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciByZWNlaXZlIHBhY2tldHMgKi8KKyNkZWZpbmUJUEhCX3J4X2VuZAkJMHgxNgkJLyogMHgxNiBsYXN0IGVudHJ5IGluIHRoZSBwYWNrZXQgYXJyYXkgZm9yIHJlY2VpdmUgcGFja2V0cyAqLworI2RlZmluZQlQSEJfcnhfYWRkCQkweDE4CQkvKiAweDE4IHBvc2l0aW9uIGluIHRoZSBwYWNrZXQgYXJyYXkgZm9yIG5ldyByZWNlaXZlIHBhY2tldHMgKi8KKyNkZWZpbmUJUEhCX3J4X3JlbW92ZQkJMHgxQQkJLyogMHgxQSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBwYWNrZXQgcG9pbnRlciBhcnJheSAqLworI2RlZmluZQlzaXplb2ZfUEhCCQkweDFDCQkvKiBzdHJ1Y3R1cmUgc2l6ZSA9IDB4MUMgKi8KKworLyogUEhCLmhhbmRzaGFrZSBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlQSEJfSEFORFNIQUtFX1NFVAkweDAwMDEJCS8qIFNldCBieSBMUlQgKi8KKyNkZWZpbmUJUEhCX0hBTkRTSEFLRV9SRVNFVAkweDAwMDIJCS8qIFNldCBieSBJU1IgLyBkcml2ZXIgKi8KKyNkZWZpbmUJUEhCX0hBTkRTSEFLRV9GTEFHUwkoUEhCX0hBTkRTSEFLRV9SRVNFVHxQSEJfSEFORFNIQUtFX1NFVCkKKwkJCQkJCS8qIFJlc2V0IGJ5IGx0dCAqLworCisjZGVmaW5lCU1BWF9QSEIJCQkxMjgJCS8qIHJhbmdlIDAtMTI3ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgTFBCICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBMUEIgKExpbmsgUGFyYW1ldGVyIEJsb2NrKSBzdHJ1Y3R1cmUgcmVsYXRlcyB0byBhIFJJTyBOZXR3b3JrIExpbmsKKyAgIGFuZCB0aGVyZSBpcyBub3JtYWxseSBhbiBhcnJheSBvZiBNQVhfTElOS1MgKD00KSBzdHJ1Y3R1cmVzIGluIGEgaG9zdCBjYXJkLAorICAgZGVmaW5lZCBieSBQQVJNX01BUC0+bGlua19zdHJfcHRyLiAqLworCit0eXBlZGVmCXN0cnVjdAlfTFBCCit7CisJX3UxNgkJbGlua19udW1iZXI7CQkvKiAweDAwIExpbmsgTnVtYmVyICovCisJX3UxNgkJaW5fY2g7CQkJLyogMHgwMiBMaW5rIEluIENoYW5uZWwgKi8KKwlfdTE2CQlvdXRfY2g7CQkJLyogMHgwNCBMaW5rIE91dCBDaGFubmVsICovCisJX3U4CQlhdHRhY2hlZF9zZXJpYWxbNF07CS8qIDB4MDYgQXR0YWNoZWQgc2VyaWFsIG51bWJlciAqLworCV91OAkJYXR0YWNoZWRfaG9zdF9zZXJpYWxbNF07LyogMHgwQSBTZXJpYWwgbnVtYmVyIG9mIEhvc3Qgd2hvIGJvb3RlZCBvdGhlciBlbmQgKi8KKwlfdTE2CQlkZXNjaGVkdWxlZDsJCS8qIDB4MEUgQ3VycmVudGx5IERlc2NoZWR1bGVkICovCisJX3UxNgkJc3RhdGU7CQkJLyogMHgxMCBDdXJyZW50IHN0YXRlICovCisJX3UxNgkJc2VuZF9wb2xsOwkJLyogMHgxMiBTZW5kIGEgUG9sbCBQYWNrZXQgKi8KKwlfdTE2CQlsdHRfcDsJCQkvKiAweDE0IFByb2Nlc3MgRGVzY3JpcHRvciAqLworCV91MTYJCWxydF9wOwkJCS8qIDB4MTYgUHJvY2VzcyBEZXNjcmlwdG9yICovCisJX3UxNgkJbHJ0X3N0YXR1czsJCS8qIDB4MTggQ3VycmVudCBscnQgc3RhdHVzICovCisJX3UxNgkJbHR0X3N0YXR1czsJCS8qIDB4MUEgQ3VycmVudCBsdHQgc3RhdHVzICovCisJX3UxNgkJdGltZW91dDsJCS8qIDB4MUMgVGltZW91dCB2YWx1ZSAqLworCV91MTYJCXRvcG9sb2d5OwkJLyogMHgxRSBUb3BvbG9neSBiaXRzICovCisJX3UxNgkJbW9uX2x0dDsJCS8qIDB4MjAgKi8KKwlfdTE2CQltb25fbHJ0OwkJLyogMHgyMiAqLworCV91MTYJCW51bV9wa3RzOwkJLyogMHgyNCAqLworCV91MTYJCWFkZF9wYWNrZXRfbGlzdDsJLyogMHgyNiBBZGQgcGFja2V0cyB0byBoZXJlICovCisJX3UxNgkJcmVtb3ZlX3BhY2tldF9saXN0OwkvKiAweDI4IFNlbmQgcGFja2V0cyBmcm9tIGhlcmUgKi8KKworCV91MTYJCWxydF9mYWlsX2NoYW47CQkvKiAweDJBIExydCdzIGZhaWx1cmUgY2hhbm5lbCAqLworCV91MTYJCWx0dF9mYWlsX2NoYW47CQkvKiAweDJDIEx0dCdzIGZhaWx1cmUgY2hhbm5lbCAqLworCisJUlVQCQlydXA7CQkJLyogMHgyRSBSVVAgc3RydWN0dXJlIGZvciBIT1NUIHRvIGRyaXZlciBjb21tcyAqLworCVJVUAkJbGlua19ydXA7CQkvKiAweDQwIFJVUCBmb3IgdGhlIGxpbmsgKFBPTEwsIHRvcG9sb2d5IGV0Yy4pICovCisJX3UxNgkJYXR0YWNoZWRfbGluazsJCS8qIDB4NTIgTnVtYmVyIG9mIGF0dGFjaGVkIGxpbmsgKi8KKwlfdTE2CQljc3VtX2Vycm9yczsJCS8qIDB4NTQgY3N1bSBlcnJvcnMgKi8KKwlfdTE2CQludW1fZGlzY29ubmVjdHM7CS8qIDB4NTYgbnVtYmVyIG9mIGRpc2Nvbm5lY3RzICovCisJX3UxNgkJbnVtX3N5bmNfcmN2ZDsJCS8qIDB4NTggIyBzeW5jJ3MgcmVjZWl2ZWQgKi8KKwlfdTE2CQludW1fc3luY19ycXN0OwkJLyogMHg1QSAjIHN5bmMgcmVxdWVzdHMgKi8KKwlfdTE2CQludW1fdHg7CQkJLyogMHg1QyBOdW0gcGt0cyBzZW50ICovCisJX3UxNgkJbnVtX3J4OwkJCS8qIDB4NUUgTnVtIHBrdHMgcmVjZWl2ZWQgKi8KKwlfdTE2CQltb2R1bGVfYXR0YWNoZWQ7CS8qIDB4NjAgTW9kdWxlIHRweWVzIG9mIGF0dGFjaGVkICovCisJX3UxNgkJbGVkX3RpbWVvdXQ7CQkvKiAweDYyIExFRCB0aW1lb3V0ICovCisJX3UxNgkJZmlyc3RfcG9ydDsJCS8qIDB4NjQgRmlyc3QgcG9ydCB0byBzZXJ2aWNlICovCisJX3UxNgkJbGFzdF9wb3J0OwkJLyogMHg2NiBMYXN0IHBvcnQgdG8gc2VydmljZSAqLworCit9IExQQjsKKworLyogU2FtZSB0aGluZyBhZ2FpbiwgYnV0IGRlZmluZWQgYXMgb2Zmc2V0cy4uLiAqLworCisjZGVmaW5lCUxQQl9saW5rX251bWJlcgkJMHgwMAkJLyogMHgwMCBMaW5rIE51bWJlciAqLworI2RlZmluZQlMUEJfaW5fY2gJCTB4MDIJCS8qIDB4MDIgTGluayBJbiBDaGFubmVsICovCisjZGVmaW5lCUxQQl9vdXRfY2gJCTB4MDQJCS8qIDB4MDQgTGluayBPdXQgQ2hhbm5lbCAqLworI2RlZmluZQlMUEJfYXR0YWNoZWRfc2VyaWFsCTB4MDYJCS8qIDB4MDYgQXR0YWNoZWQgc2VyaWFsIG51bWJlciAqLworI2RlZmluZQlMUEJfYXR0YWNoZWRfaG9zdF9zZXJpYWwgMHgwQQkJLyogMHgwQSBTZXJpYWwgbnVtYmVyIG9mIEhvc3Qgd2hvIGJvb3RlZCBvdGhlciBlbmQgKi8KKyNkZWZpbmUJTFBCX2Rlc2NoZWR1bGVkCQkweDBFCQkvKiAweDBFIEN1cnJlbnRseSBEZXNjaGVkdWxlZCAqLworI2RlZmluZQlMUEJfc3RhdGUJCTB4MTAJCS8qIDB4MTAgQ3VycmVudCBzdGF0ZSAqLworI2RlZmluZQlMUEJfc2VuZF9wb2xsCQkweDEyCQkvKiAweDEyIFNlbmQgYSBQb2xsIFBhY2tldCAqLworI2RlZmluZQlMUEJfbHR0X3AJCTB4MTQJCS8qIDB4MTQgUHJvY2VzcyBEZXNjcmlwdG9yICovCisjZGVmaW5lCUxQQl9scnRfcAkJMHgxNgkJLyogMHgxNiBQcm9jZXNzIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUJTFBCX2xydF9zdGF0dXMJCTB4MTgJCS8qIDB4MTggQ3VycmVudCBscnQgc3RhdHVzICovCisjZGVmaW5lCUxQQl9sdHRfc3RhdHVzCQkweDFBCQkvKiAweDFBIEN1cnJlbnQgbHR0IHN0YXR1cyAqLworI2RlZmluZQlMUEJfdGltZW91dAkJMHgxQwkJLyogMHgxQyBUaW1lb3V0IHZhbHVlICovCisjZGVmaW5lCUxQQl90b3BvbG9neQkJMHgxRQkJLyogMHgxRSBUb3BvbG9neSBiaXRzICovCisjZGVmaW5lCUxQQl9tb25fbHR0CQkweDIwCQkvKiAweDIwICovCisjZGVmaW5lCUxQQl9tb25fbHJ0CQkweDIyCQkvKiAweDIyICovCisjZGVmaW5lCUxQQl9udW1fcGt0cwkJMHgyNAkJLyogMHgyNCAqLworI2RlZmluZQlMUEJfYWRkX3BhY2tldF9saXN0CTB4MjYJCS8qIDB4MjYgQWRkIHBhY2tldHMgdG8gaGVyZSAqLworI2RlZmluZQlMUEJfcmVtb3ZlX3BhY2tldF9saXN0CTB4MjgJCS8qIDB4MjggU2VuZCBwYWNrZXRzIGZyb20gaGVyZSAqLworI2RlZmluZQlMUEJfbHJ0X2ZhaWxfY2hhbgkweDJBCQkvKiAweDJBIExydCdzIGZhaWx1cmUgY2hhbm5lbCAqLworI2RlZmluZQlMUEJfbHR0X2ZhaWxfY2hhbgkweDJDCQkvKiAweDJDIEx0dCdzIGZhaWx1cmUgY2hhbm5lbCAqLworI2RlZmluZQlMUEJfcnVwCQkJMHgyRQkJLyogMHgyRSBSVVAgc3RydWN0dXJlIGZvciBIT1NUIHRvIGRyaXZlciBjb21tcyAqLworI2RlZmluZQlMUEJfbGlua19ydXAJCTB4NDAJCS8qIDB4NDAgUlVQIGZvciB0aGUgbGluayAoUE9MTCwgdG9wb2xvZ3kgZXRjLikgKi8KKyNkZWZpbmUJTFBCX2F0dGFjaGVkX2xpbmsJMHg1MgkJLyogMHg1MiBOdW1iZXIgb2YgYXR0YWNoZWQgbGluayAqLworI2RlZmluZQlMUEJfY3N1bV9lcnJvcnMJCTB4NTQJCS8qIDB4NTQgY3N1bSBlcnJvcnMgKi8KKyNkZWZpbmUJTFBCX251bV9kaXNjb25uZWN0cwkweDU2CQkvKiAweDU2IG51bWJlciBvZiBkaXNjb25uZWN0cyAqLworI2RlZmluZQlMUEJfbnVtX3N5bmNfcmN2ZAkweDU4CQkvKiAweDU4ICMgc3luYydzIHJlY2VpdmVkICovCisjZGVmaW5lCUxQQl9udW1fc3luY19ycXN0CTB4NUEJCS8qIDB4NUEgIyBzeW5jIHJlcXVlc3RzICovCisjZGVmaW5lCUxQQl9udW1fdHgJCTB4NUMJCS8qIDB4NUMgTnVtIHBrdHMgc2VudCAqLworI2RlZmluZQlMUEJfbnVtX3J4CQkweDVFCQkvKiAweDVFIE51bSBwa3RzIHJlY2VpdmVkICovCisjZGVmaW5lCUxQQl9tb2R1bGVfYXR0YWNoZWQJMHg2MAkJLyogMHg2MCBNb2R1bGUgdHB5ZXMgb2YgYXR0YWNoZWQgKi8KKyNkZWZpbmUJTFBCX2xlZF90aW1lb3V0CQkweDYyCQkvKiAweDYyIExFRCB0aW1lb3V0ICovCisjZGVmaW5lCUxQQl9maXJzdF9wb3J0CQkweDY0CQkvKiAweDY0IEZpcnN0IHBvcnQgdG8gc2VydmljZSAqLworI2RlZmluZQlMUEJfbGFzdF9wb3J0CQkweDY2CQkvKiAweDY2IExhc3QgcG9ydCB0byBzZXJ2aWNlICovCisjZGVmaW5lCXNpemVvZl9MUEIJCTB4NjgJCS8qIHN0cnVjdHVyZSBzaXplID0gMHg2OCAqLworCisjZGVmaW5lCUxJTktTX1BFUl9VTklUCQk0CQkvKiBudW1iZXIgb2YgbGlua3MgZnJvbSBhIGhvc3QgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgRlJFRV9MSVNUICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVXNlZCB0byBvdmVybGF5IHBhY2tldCBoZWFkZXJzIHdoZW4gYWxsb2NhdGluZy9mcmVlaW5nIHBhY2tldHMgZnJvbSB0aGUgZnJlZSBsaXN0ICovCisKK3R5cGVkZWYJc3RydWN0CV9GUkVFX0xJU1QKK3sKKwlfdTE2CQluZXh0OwkJCS8qIDB4MDAgb2Zmc2V0IG9mIG5leHQgbGlzdCBpdGVtICovCisJX3UxNgkJcHJldjsJCQkvKiAweDAyIG9mZnNldCBvZiBwcmV2aW91cyBsaXN0IGl0ZW0gKi8KKworfSBGUkVFX0xJU1Q7CisKKy8qIFNhbWUgdGhpbmcgYWdhaW4sIGJ1dCBkZWZpbmVkIGFzIG9mZnNldHMuLi4gKi8KKworI2RlZmluZQlGTF9uZXh0CQkJMHgwMAkJLyogMHgwMCBvZmZzZXQgb2YgbmV4dCBsaXN0IGl0ZW0gKi8KKyNkZWZpbmUJRkxfcHJldgkJCTB4MDIJCS8qIDB4MDIgb2Zmc2V0IG9mIHByZXZpb3VzIGxpc3QgaXRlbSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFBLVCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgUEtUIGlzIHRoZSBtYWluIHVuaXQgb2YgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIEhvc3QgQ2FyZHMgYW5kIFJUQXMgYWNyb3NzCisgICB0aGUgUklPIG5ldHdvcmsuICAqLworCisjZGVmaW5lIFBLVF9NQVhfREFUQV9MRU4gICA3MgkJCS8qIFNpemUgb2YgcGFja2V0IGRhdGEgKi8KKwordHlwZWRlZglzdHJ1Y3QJX1BLVAoreworCV91OAkJZGVzdF91bml0OwkJLyogMHgwMCBEZXN0aW5hdGlvbiBVbml0IElkICovCisJX3U4CQlkZXN0X3BvcnQ7CQkvKiAweDAxIERlc3RpbmF0aW9uIFBvcnQgKi8KKwlfdTgJCXNyY191bml0OwkJLyogMHgwMiBTb3VyY2UgVW5pdCBJZCAqLworCV91OAkJc3JjX3BvcnQ7CQkvKiAweDAzIFNvdXJjZSBQb3J0ICovCisJX3U4CQlsZW47CQkJLyogMHgwNCBMZW5ndGggKGluIGJ5dGVzKSBvZiBkYXRhIGZpZWxkICovCisJX3U4CQljb250cm9sOwkJLyogMHgwNSAqLworCV91OAkJZGF0YVtQS1RfTUFYX0RBVEFfTEVOXTsJLyogMHgwNiBBY3R1YWwgZGF0YSAqLworCV91MTYJCWNzdW07CQkJLyogMHg0RSBDLVNVTSAqLworCit9IFBLVDsKKworLyogU2FtZSB0aGluZyBhZ2FpbiwgYnV0IGRlZmluZWQgYXMgb2Zmc2V0cy4uLiAqLworCisjZGVmaW5lCVBLVF9kZXN0X3VuaXQJCTB4MDAJCS8qIDB4MDAgRGVzdGluYXRpb24gVW5pdCBJZCAqLworI2RlZmluZQlQS1RfZGVzdF9wb3J0CQkweDAxCQkvKiAweDAxIERlc3RpbmF0aW9uIFBvcnQgKi8KKyNkZWZpbmUJUEtUX3NyY191bml0CQkweDAyCQkvKiAweDAyIFNvdXJjZSBVbml0IElkICovCisjZGVmaW5lCVBLVF9zcmNfcG9ydAkJMHgwMwkJLyogMHgwMyBTb3VyY2UgUG9ydCAqLworI2RlZmluZQlQS1RfbGVuCQkJMHgwNAkJLyogMHgwNCBMZW5ndGggKGluIGJ5dGVzKSBvZiBkYXRhIGZpZWxkICovCisjZGVmaW5lCVBLVF9jb250cm9sCQkweDA1CQkvKiAweDA1ICovCisjZGVmaW5lCVBLVF9kYXRhCQkweDA2CQkvKiAweDA2IEFjdHVhbCBkYXRhICovCisjZGVmaW5lCVBLVF9jc3VtCQkweDRFCQkvKiAweDRFIEMtU1VNICovCisjZGVmaW5lCXNpemVvZl9QS1QJCTB4NTAJCS8qIHN0cnVjdHVyZSBzaXplID0gMHg1MCAqLworCisvKiBQS1QubGVuIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVBLVF9DTURfQklUCQkweDgwCisjZGVmaW5lCVBLVF9DTURfREFUQQkJMHg4MAorI2RlZmluZQlQS1RfTEVOX01BU0sJCTB4N0YKKworLyogUEtULmNvbnRyb2wgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUEtUX0FDSwkJCTB4NDAKKyNkZWZpbmUJUEtUX1RHTAkJCTB4MjAKKyNkZWZpbmUJREFUQV9XTkRXCQkweDEwCisjZGVmaW5lCVBLVF9UVExfTUFTSwkJMHgwRgorI2RlZmluZQlNQVhfVFRMCQkJMHgwRgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBDb250cm9sIFBhY2tldHMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzIGRlZmluZSB0aGUgY29udHJvbCBwYWNrZXRzIHNlbnQKKyAgIGJldHdlZW4gdGhlIGRyaXZlciBhbmQgUklPIFBvcnRzLCBSVEFzIGFuZCBIb3N0IENhcmRzLiAqLworCisjZGVmaW5lCVBSRV9FTVBUSVZFCQkweDgwCQkJLyogUHJlLWVtcHRpdmUgY29tbWFuZCAoc2VudCB2aWEgcG9ydCdzIFJVUCkgKi8KKworLyogImluLWJhbmQiIGFuZCAicHJlLWVtcHRpdmUiIHBvcnQgY29tbWFuZHMuLi4gKi8KKyNkZWZpbmUJT1BFTgkJCTB4MDAJCQkvKiBEcml2ZXItPlJJTyBPcGVuIGEgcG9ydCAqLworI2RlZmluZQlDT05GSUcJCQkweDAxCQkJLyogRHJpdmVyLT5SSU8gQ29uZmlndXJlIGEgcG9ydCAqLworI2RlZmluZQlNT1BFTgkJCTB4MDIJCQkvKiBEcml2ZXItPlJJTyBNb2RlbSBvcGVuICh3YWl0IGZvciBEQ0QpICovCisjZGVmaW5lCUNMT1NFCQkJMHgwMwkJCS8qIERyaXZlci0+UklPIENsb3NlIGEgcG9ydCAqLworI2RlZmluZQlXRkxVU0gJCQkoMHgwNHxQUkVfRU1QVElWRSkJLyogRHJpdmVyLT5SSU8gV3JpdGUgZmx1c2ggKi8KKyNkZWZpbmUJUkZMVVNICQkJKDB4MDV8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIFJlYWQgZmx1c2ggKi8KKyNkZWZpbmUJUkVTVU1FCQkJKDB4MDZ8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIEJlaGF2ZSBhcyBpZiBYT04gcmVjZWl2ZWQgKi8KKyNkZWZpbmUJU0JSRUFLCQkJMHgwNwkJCS8qIERyaXZlci0+UklPIFN0YXJ0IGJyZWFrICovCisjZGVmaW5lCUVCUkVBSwkJCTB4MDgJCQkvKiBEcml2ZXItPlJJTyBFbmQgYnJlYWsgKi8KKyNkZWZpbmUJU1VTUEVORAkJCSgweDA5fFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBCZWhhdmUgYXMgaWYgWE9GRiByZWNlaXZlZCAqLworI2RlZmluZQlGQ0xPU0UJCQkoMHgwQXxQUkVfRU1QVElWRSkJLyogRHJpdmVyLT5SSU8gRm9yY2UgY2xvc2UgKi8KKyNkZWZpbmUJWFBSSU5UCQkJMHgwQgkJCS8qIERyaXZlci0+UklPIFhwcmludCBwYWNrZXQgKi8KKyNkZWZpbmUJTUJJUwkJCSgweDBDfFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBTZXQgbW9kZW0gbGluZXMgKi8KKyNkZWZpbmUJTUJJQwkJCSgweDBEfFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBDbGVhciBtb2RlbSBsaW5lcyAqLworI2RlZmluZQlNU0VUCQkJKDB4MEV8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIFNldCBtb2RlbSBsaW5lcyAqLworI2RlZmluZQlQQ0xPU0UJCQkweDBGCQkJLyogRHJpdmVyLT5SSU8gUHNldWRvIGNsb3NlICovCisjZGVmaW5lCU1HRVQJCQkoMHgxMHxQUkVfRU1QVElWRSkJLyogRHJpdmVyLT5SSU8gRm9yY2UgdXBkYXRlIG9mIG1vZGVtIHN0YXR1cyAqLworI2RlZmluZQlNRU1EVU1QCQkJKDB4MTF8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIERFQlVHIHJlcXVlc3QgZm9yIFJUQSBtZW1vcnkgKi8KKyNkZWZpbmUJUkVBRF9SRUdJU1RFUgkJKDB4MTJ8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIERFQlVHIHJlYWQgQ0QxNDAwIHJlZ2lzdGVyICovCisKKy8qIFJlbW90ZSBVbml0IFBvcnQgKFJVUCkgcGFja2V0IGRlZmluaXRpb25zLi4uIChzcGVjaWZpZWQgaW4gUEtULmRlc3RfdW5pdCBhbmQgUEtULnNyY191bml0KSAqLworI2RlZmluZQlTWU5DX1JVUAkJMHhGRgkJCS8qIERvd25sb2FkIGludGVybmFsICovCisjZGVmaW5lCUNPTU1BTkRfUlVQCQkweEZFCQkJLyogQ29tbWFuZCBhY2svc3RhdHVzICovCisjZGVmaW5lCUVSUk9SX1JVUAkJMHhGRAkJCS8qIERvd25sb2FkIGludGVybmFsICovCisjZGVmaW5lCVBPTExfUlVQCQkweEZDCQkJLyogRG93bmxvYWQgaW50ZXJuYWwgKi8KKyNkZWZpbmUJQk9PVF9SVVAJCTB4RkIJCQkvKiBVc2VkIHRvIGJvb3QgUlRBcyAqLworI2RlZmluZQlST1VURV9SVVAJCTB4RkEJCQkvKiBVc2VkIHRvIHNwZWNpZnkgcm91dGluZy90b3BvbG9neSAqLworI2RlZmluZQlTVEFUVVNfUlVQCQkweEY5CQkJLyogTm90IHVzZWQgKi8KKyNkZWZpbmUJUE9XRVJfUlVQCQkweEY4CQkJLyogRG93bmxvYWQgaW50ZXJuYWwgKi8KKworLyogQ09NTUFORF9SVVAgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJQ09NUExFVEUJCSgweDIwfFBSRV9FTVBUSVZFKQkvKiBSSU8tPkRyaXZlciBDb21tYW5kIGNvbXBsZXRlICovCisjZGVmaW5lCUJSRUFLX1JFQ0VJVkVECQkoMHgyMXxQUkVfRU1QVElWRSkJLyogUklPLT5Ecml2ZXIgQnJlYWsgcmVjZWl2ZWQgKi8KKyNkZWZpbmUJTU9ERU1fU1RBVFVTCQkoMHgyMnxQUkVfRU1QVElWRSkJLyogUklPLT5Ecml2ZXIgTW9kZW0gc3RhdHVzIGNoYW5nZSAqLworCisvKiBCT09UX1JVUCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlCT09UX1JFUVVFU1QJCTB4MDAJCQkvKiBSSU8tPkRyaXZlciBSZXF1ZXN0IGZvciBib290ICovCisjZGVmaW5lCUJPT1RfQUJPUlQJCTB4MDEJCQkvKiBEcml2ZXItPlJJTyBBYm9ydCBhIGJvb3QgKi8KKyNkZWZpbmUJQk9PVF9TRVFVRU5DRQkJMHgwMgkJCS8qIERyaXZlci0+UklPIFBhY2tldCB3aXRoIGZpcm13YXJlIGRldGFpbHMgKi8KKyNkZWZpbmUJQk9PVF9DT01QTEVURUQJCTB4MDMJCQkvKiBSSU8tPkRyaXZlciBCb290IGNvbXBsZXRlZCAqLworI2RlZmluZSBJRk9BRAkJCTB4MkYJCQkvKiBEcml2ZXItPlJJTyBTaHV0ZG93bi9SZWJvb3QgUlRBIChGYWxsIE92ZXIgQW5kIERpZSkgKi8KKyNkZWZpbmUJSURFTlRJRlkJCTB4MzAJCQkvKiBEcml2ZXItPlJJTyBJZGVudGlmeSBSVEEgKi8KKyNkZWZpbmUJWk9NQklFCQkJMHgzMQkJCS8qIERyaXZlci0+UklPIFNodXRkb3duL0ZsYXNoIExFRHMgKi8KKyNkZWZpbmUJVUZPQUQJCQkweDMyCQkJLyogRHJpdmVyLT5SSU8gU2h1dGRvd24vUmVib290IG5laWdoYm91cmluZyBSVEEgKi8KKyNkZWZpbmUgSVdBSVQJCQkweDMzCQkJLyogRHJpdmVyLT5SSU8gUGF1c2UgYm9vdGluZyBwcm9jZXNzICovCisKKy8qIFJPVVRFX1JVUCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlST1VURV9SRVFVRVNUCQkweDAwCQkJLyogUklPLT5Ecml2ZXIgUmVxdWVzdCBhbiBJRCAqLworI2RlZmluZQlST1VURV9GT0FECQkweDAxCQkJLyogRHJpdmVyLT5SSU8gU2h1dGRvd24vcmVib290IFJUQSAqLworI2RlZmluZQlST1VURV9BTFJFQURZCQkweDAyCQkJLyogRHJpdmVyLT5SSU8gTm90IHVzZWQgKi8KKyNkZWZpbmUJUk9VVEVfVVNFRAkJMHgwMwkJCS8qIERyaXZlci0+UklPIE5vdCB1c2VkICovCisjZGVmaW5lCVJPVVRFX0FMTE9DQVRFCQkweDA0CQkJLyogRHJpdmVyLT5SSU8gQWxsb2NhdGUgUlRBIFJVUCBudW1iZXJzICovCisjZGVmaW5lCVJPVVRFX1JFUV9UT1AJCTB4MDUJCQkvKiBEcml2ZXItPlJJTyBOb3QgdXNlZCAqLworI2RlZmluZSBST1VURV9UT1BPTE9HWQkJMHgwNgkJCS8qIFJJTy0+RHJpdmVyIFJvdXRlL1RvcG9sb2d5IHN0YXR1cyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIE9QRU4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8saW4tYmFuZCkKKworICAgU2VudCB0byBvcGVuIGEgcG9ydC4gCisgICBTdHJ1Y3R1cmUgb2YgY29uZmlndXJhdGlvbiBpbmZvIHVzZWQgd2l0aCBPUEVOLCBDT05GSUcgYW5kIE1PUEVOIHBhY2tldHMuLi4gKi8KKworI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX0NvcjEJCShQS1RfRGF0YSsxKQkJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZQlQS1RfQ29yMgkJKFBLVF9EYXRhKzIpCQkvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lCVBLVF9Db3I0CQkoUEtUX0RhdGErMykJCS8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUJUEtUX0NvcjUJCShQS1RfRGF0YSs0KQkJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgNSAqLworI2RlZmluZQlQS1RfVHhYb24JCShQS1RfRGF0YSs1KQkJLyogVHJhbnNtaXQgWE9OIGNoYXJhY3RlciAqLworI2RlZmluZQlQS1RfVHhYb2ZmCQkoUEtUX0RhdGErNikJCS8qIFRyYW5zbWl0IFhPRkYgY2hhcmFjdGVyICovCisjZGVmaW5lCVBLVF9SeFhvbgkJKFBLVF9EYXRhKzcpCQkvKiBSZWNlaXZlIFhPTiBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUEtUX1J4WG9mZgkJKFBLVF9EYXRhKzgpCQkvKiBSZWNlaXZlIFhPRkYgY2hhcmFjdGVyICovCisjZGVmaW5lCVBLVF9MbmV4dAkJKFBLVF9EYXRhKzkpCQkvKiBMbmV4dCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUEtUX1R4QmF1ZAkJKFBLVF9EYXRhKzEwKQkJLyogVHJhbnNtaXQgYmF1ZCByYXRlICovCisjZGVmaW5lCVBLVF9SeEJhdWQJCShQS1RfRGF0YSsxMSkJCS8qIFJlY2VpdmUgYmF1ZCByYXRlICovCisKKy8qIENPUjEgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJQ09SMV9QQVJJVFkJCTB4RTAJCQkvKiBQYXJpdHkgbWFzayAqLworI2RlZmluZQlDT1IxX05PTkUJCTB4MDAJCQkvKiBObyBwYXJpdHkgKi8KKyNkZWZpbmUJQ09SMV9TUEFDRQkJMHgyMAkJCS8qIFNwYWNlIHBhcml0eSAqLworI2RlZmluZQlDT1IxX0VWRU4JCTB4NDAJCQkvKiBFdmVuIHBhcml0eSAqLworI2RlZmluZQlDT1IxX01BUksJCTB4QTAJCQkvKiBNYXJrIHBhcml0eSAqLworI2RlZmluZQlDT1IxX09ERAkJMHhDMAkJCS8qIE9kZCBwYXJpdHkgKi8KKworI2RlZmluZQlDT1IxX1NUT1BCSVRTCQkweDBDCQkJLyogU3RvcCBiaXRzIG1hc2sgKi8KKyNkZWZpbmUJQ09SMV9TVE9QMQkJMHgwMAkJCS8qIDEgc3RvcCBiaXQgKi8KKyNkZWZpbmUJQ09SMV9TVE9QMV81CQkweDA0CQkJLyogMS41IHN0b3AgYml0cyAqLworI2RlZmluZQlDT1IxX1NUT1AyCQkweDA4CQkJLyogMiBzdG9wIGJpdHMgKi8KKworI2RlZmluZQlDT1IxX0RBVEFCSVRTCQkweDAzCQkJLyogRGF0YSBiaXRzIG1hc2sgKi8KKyNkZWZpbmUJQ09SMV9EQVRBNQkJMHgwMAkJCS8qIDUgZGF0YSBiaXRzICovCisjZGVmaW5lCUNPUjFfREFUQTYJCTB4MDEJCQkvKiA2IGRhdGEgYml0cyAqLworI2RlZmluZQlDT1IxX0RBVEE3CQkweDAyCQkJLyogNyBkYXRhIGJpdHMgKi8KKyNkZWZpbmUJQ09SMV9EQVRBOAkJMHgwMwkJCS8qIDggZGF0YSBiaXRzICovCisKKy8qIENPUjIgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJQ09SMl9YT05fVFhGTE9XCQkweDQwCQkJLyogWE9OL1hPRkYgVHJhbnNtaXQgRmxvdyAqLworI2RlZmluZQlDT1IyX1hBTllfVFhGTE9XCTB4QzAJCQkvKiBYT04vWEFOWSBUcmFuc21pdCBGbG93ICovCisjZGVmaW5lCUNPUjJfSFVQQ0wJCTB4MjAJCQkvKiBIYW5nIFVwIE9uIENsb3NlICovCisjZGVmaW5lCUNPUjJfRFNSX1RYRkxPVwkJMHgwOAkJCS8qIERTUiBUcmFuc21pdCBGbG93IENvbnRyb2wgKi8KKyNkZWZpbmUJQ09SMl9SVFNfUlhGTE9XCQkweDA0CQkJLyogUlRTIFJlY2VpdmUgRmxvdyBDb250cm9sICovCisjZGVmaW5lCUNPUjJfQ1RTX1RYRkxPVwkJMHgwMgkJCS8qIENUUyBUcmFuc21pdCBGbG93IENvbnRyb2wgKi8KKyNkZWZpbmUJQ09SMl9YT05fUlhGTE9XCQkweDAxCQkJLyogWE9OL1hPRkYgUmVjZWl2ZSBGbG93ICovCisKKy8qIENPUjQgZGVmaW5pdGlvbi4uLiAqLworI2RlZmluZQlDT1I0X0lHTkNSCQkweDgwCQkJLyogRGlzY2FyZCByZWNlaXZlZCBDUiAqLworI2RlZmluZQlDT1I0X0lDUk5MCQkweDQwCQkJLyogTWFwIHJlY2VpdmVkIENSIC0+IE5MICovCisjZGVmaW5lCUNPUjRfSU5MQ1IJCTB4MjAJCQkvKiBNYXAgcmVjZWl2ZWQgTkwgLT4gQ1IgKi8KKyNkZWZpbmUJQ09SNF9JR05CUksJCTB4MTAJCQkvKiBJZ25vcmUgUmVjZWl2ZWQgQnJlYWsgKi8KKyNkZWZpbmUJQ09SNF9OQlJLSU5UCQkweDA4CQkJLyogTm8gaW50ZXJydXB0IG9uIHJ4IEJyZWFrICovCisjZGVmaW5lCUNPUjRfSUdOUEFSCQkweDA0CQkJLyogaWdub3JlIHJ4IHBhcml0eSBlcnJvciBjaGFycyAqLworI2RlZmluZQlDT1I0X1BBUk1SSwkJMHgwMgkJCS8qIE1hcmsgcnggcGFyaXR5IGVycm9yIGNoYXJzICovCisjZGVmaW5lCUNPUjRfUkFJU0VNT0QJCTB4MDEJCQkvKiBSYWlzZSBtb2RlbSBsaW5lcyBvbiAhMCBiYXVkICovCisKKy8qIENPUjUgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJQ09SNV9JU1RSSVAJCTB4ODAJCQkvKiBTdHJpcCBpbnB1dCBjaGFycyB0byA3IGJpdHMgKi8KKyNkZWZpbmUJQ09SNV9MTkUJCTB4NDAJCQkvKiBFbmFibGUgTE5FWFQgcHJvY2Vzc2luZyAqLworI2RlZmluZQlDT1I1X0NNT0UJCTB4MjAJCQkvKiBNYXRjaCBnb29kICYgZXJyb3IgY2hhcmFjdGVycyAqLworI2RlZmluZQlDT1I1X1RBQjMJCTB4MTAJCQkvKiBUQUIzIG1vZGUgKi8KKyNkZWZpbmUJQ09SNV9UU1RBVEVfT04JCTB4MDgJCQkvKiBFbmFibGUgdGJ1c3kvdHN0b3AgbW9uaXRvcmluZyAqLworI2RlZmluZQlDT1I1X1RTVEFURV9PRkYJCTB4MDQJCQkvKiBEaXNhYmxlIHRidXN5L3RzdG9wIG1vbml0b3JpbmcgKi8KKyNkZWZpbmUJQ09SNV9PTkxDUgkJMHgwMgkJCS8qIE5MIC0+IENSIE5MIG9uIG91dHB1dCAqLworI2RlZmluZQlDT1I1X09DUk5MCQkweDAxCQkJLyogQ1IgLT4gTkwgb24gb3V0cHV0ICovCisKKy8qIFJ4QmF1ZCBhbmQgVHhCYXVkIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVJJT19CMAkJCTB4MDAJCQkvKiBSVFMgLyBEVFIgc2lnbmFscyBkcm9wcGVkICovCisjZGVmaW5lCVJJT19CNTAJCQkweDAxCQkJLyogNTAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjc1CQkJMHgwMgkJCS8qIDc1IGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxMTAJCTB4MDMJCQkvKiAxMTAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjEzNAkJMHgwNAkJCS8qIDEzNC41IGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxNTAJCTB4MDUJCQkvKiAxNTAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjIwMAkJMHgwNgkJCS8qIDIwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMzAwCQkweDA3CQkJLyogMzAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I2MDAJCTB4MDgJCQkvKiA2MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjEyMDAJCTB4MDkJCQkvKiAxMjAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxODAwCQkweDBBCQkJLyogMTgwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMjQwMAkJMHgwQgkJCS8qIDI0MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjQ4MDAJCTB4MEMJCQkvKiA0ODAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I5NjAwCQkweDBECQkJLyogOTYwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMTkyMDAJCTB4MEUJCQkvKiAxOTIwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMzg0MDAJCTB4MEYJCQkvKiAzODQwMCBiYXVkICovCisjZGVmaW5lCVJJT19CNTYwMDAJCTB4MTAJCQkvKiA1NjAwMCBiYXVkICovCisjZGVmaW5lCVJJT19CNTc2MDAJCTB4MTEJCQkvKiA1NzYwMCBiYXVkICovCisjZGVmaW5lCVJJT19CNjQwMDAJCTB4MTIJCQkvKiA2NDAwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMTE1MjAwCQkweDEzCQkJLyogMTE1MjAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IyMDAwCQkweDE0CQkJLyogMjAwMCBiYXVkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBDT05GSUcgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxpbi1iYW5kKQorCisgICBDT05GSUcgaXMgc2VudCBmcm9tIHRoZSBkcml2ZXIgdG8gY29uZmlndXJlIGFuIGFscmVhZHkgb3BlbmVkIHBvcnQuCisgICBQYWNrZXQgc3RydWN0dXJlIGlzIHNhbWUgYXMgT1BFTi4gICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBNT1BFTiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxpbi1iYW5kKQorCisgICBNT1BFTiBpcyBzZW50IGZyb20gdGhlIGRyaXZlciB0byBvcGVuIGEgcG9ydCBhdHRhY2hlZCB0byBhIG1vZGVtLiAoaW4tYmFuZCkKKyAgIFBhY2tldCBzdHJ1Y3R1cmUgaXMgc2FtZSBhcyBPUEVOLiAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIENMT1NFICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLGluLWJhbmQpCisKKyAgIENMT1NFIGlzIHNlbnQgZnJvbSB0aGUgZHJpdmVyIHRvIGNsb3NlIGEgcHJldmlvdXNseSBvcGVuZWQgcG9ydC4KKyAgIE5vIHBhcmFtZXRlcnMuCisgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgV0ZMVVNIICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIFdGTFVTSCBpcyBzZW50IHByZS1lbXB0aXZlbHkgZnJvbSB0aGUgZHJpdmVyIHRvIGZsdXNoIHRoZSB3cml0ZSBidWZmZXJzIGFuZAorICAgcGFja2V0cyBvZiBhIHBvcnQuICAocHJlLWVtcHRpdmUpCisgICAKKyAgIFdGTFVTSCBpcyBhbHNvIHNlbnQgaW4tYmFuZCBmcm9tIHRoZSBkcml2ZXIgdG8gYSBwb3J0IGFzIGEgbWFya2VyIHRvIGVuZAorICAgd3JpdGUgZmx1c2hpbmcgcHJldmlvdXNseSBzdGFydGVkIGJ5IGEgcHJlLWVtcHRpdmUgV0ZMVVNIIHBhY2tldC4gKGluLWJhbmQpCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBSRkxVU0ggICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgUkZMVVNIIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gZmx1c2ggdGhlIHJlYWQgYnVmZmVycyBhbmQKKyAgIHBhY2tldHMgb2YgYSBwb3J0LgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUkVTVU1FICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIFJFU1VNRSBpcyBzZW50IHByZS1lbXB0aXZlbHkgZnJvbSB0aGUgZHJpdmVyIHRvIGNhdXNlIGEgcG9ydCB0byByZXN1bWUgCisgICB0cmFuc21pc3Npb24gb2YgZGF0YSBpZiBibG9ja2VkIGJ5IFhPRkYuICAoYXMgaWYgWE9OIGhhZCBiZWVuIHJlY2VpdmVkKQorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgU0JSRUFLICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8saW4tYmFuZCkKKworICAgU0JSRUFLIGlzIHNlbnQgaW4tYmFuZCBmcm9tIHRoZSBkcml2ZXIgdG8gYSBwb3J0IHRvIHN1c3BlbmQgZGF0YSBhbmQgc3RhcnQKKyAgIGJyZWFrIHNpZ25hbCB0cmFuc21pc3Npb24uCisKKyAgIElmIHRoZSBicmVhayBkZWxheSBpcyAwLCB0aGUgYnJlYWsgc2lnbmFsIHdpbGwgYmUgYWNrbm93bGVkZ2VkIHdpdGggYQorICAgUlVQX0NPTU1BTkQsIENPTVBMRVRFIHBhY2tldCBhbmQgY29udGludWUgdW50aWwgYW4gRUJSRUFLIHBhY2tldCBpcyByZWNlaXZlZC4KKworICAgT3RoZXJ3aXNlLCB0aGVyZSBpcyBubyBhY2tub3dsZWRnZW1lbnQgYW5kIHRoZSBicmVhayBzaWduYWwgd2lsbCBsYXN0IGZvciB0aGUKKyAgIHNwZWNpZmllZCBudW1iZXIgb2YgbVMuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX0JyZWFrRGVsYXkJCShQS1RfRGF0YSsxKQkJLyogQnJlYWsgZGVsYXkgaW4gbVMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIEVCUkVBSyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLGluLWJhbmQpCisKKyAgIEVCUkVBSyBpcyBzZW50IGluLWJhbmQgZnJvbSB0aGUgZHJpdmVyIHRvIGEgcG9ydCB0byBzdG9wIHRyYW5zbWlzc2lvbiBvZiBhCisgICBicmVhayBzaWduYWwuCisKKyAgIE5vIHBhcmFtZXRlcnMuICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgU1VTUEVORCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIFNVU1BFTkQgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBjYXVzZSBhIHBvcnQgdG8gc3VzcGVuZAorICAgdHJhbnNtaXNzaW9uIG9mIGRhdGEuICAoYXMgaWYgWE9GRiBoYWQgYmVlbiByZWNlaXZlZCkKKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIEZDTE9TRSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBGQ0xPU0UgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBmb3JjZSBjbG9zZSBhIHBvcnQuCisgICBBIGZvcmNlIGNsb3NlIGZsdXNoZXMgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgcXVldWVzLCBhbmQgYWxzbyBsb3dlcnMgYWxsIG91dHB1dAorICAgbW9kZW0gc2lnbmFscyBpZiB0aGUgQ09SNV9IVVBDTCAoSGFuZyBVcCBPbiBDbG9zZSkgZmxhZyBpcyBzZXQuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBYUFJJTlQgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxpbi1iYW5kKQorCisgICBYUFJJTlQgaXMgc2VudCBhcyBhIG5vcm1hbCBJL08gZGF0YSBwYWNrZXQgZXhjZXB0IHRoYXQgdGhlIFBLVF9DTURfQklUIG9mCisgICB0aGUgImxlbiIgZmllbGQgaXMgc2V0LCBhbmQgdGhlIGZpcnN0ICJkYXRhIiBieXRlIGlzIFhQUklOVC4KKworICAgVGhlIEkvTyBkYXRhIGluIHRoZSBYUFJJTlQgcGFja2V0IHdpbGwgY29udGFpbiB0aGUgZm9sbG93aW5nOgorICAgLQlUcmFuc3BhcmVudCBQcmludCBTdGFydCBTZXF1ZW5jZQorICAgLQlUcmFuc3BhcmVudCBQcmludCBEYXRhCisgICAtCVRyYW5zcGFyZW50IFByaW50IFN0b3AgU2VxdWVuY2UuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgTUJJUyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgTUJJUyBpcyBzZW50IHByZS1lbXB0aXZlbHkgZnJvbSB0aGUgZHJpdmVyIHRvIHNldCBhIHBvcnQncyBtb2RlbSBzaWduYWxzLgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfTW9kZW1TZXQJCShQS1RfRGF0YSs0KQkJLyogTW9kZW0gc2V0IHNpZ25hbHMgbWFzayAqLworCisvKiBNb2RlbVNldCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlNQklTX1JUUwkJMHgwMQkJCS8qIFJUUyBtb2RlbSBzaWduYWwgKi8KKyNkZWZpbmUJTUJJU19EVFIJCTB4MDIJCQkvKiBEVFIgbW9kZW0gc2lnbmFsICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgTUJJQyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgTUJJQyBpcyBzZW50IHByZS1lbXB0aXZlbHkgZnJvbSB0aGUgZHJpdmVyIHRvIGNsZWFyIGEgcG9ydCdzIG1vZGVtIHNpZ25hbHMuCisgICAqLworI2lmIDAgICAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLworI2VuZGlmCisKKyNkZWZpbmUJUEtUX01vZGVtQ2xlYXIJCShQS1RfRGF0YSs0KQkJLyogTW9kZW0gY2xlYXIgc2lnbmFscyBtYXNrICovCisKKy8qIE1vZGVtQ2xlYXIgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJTUJJQ19SVFMJCTB4MDEJCQkvKiBSVFMgbW9kZW0gc2lnbmFsICovCisjZGVmaW5lCU1CSUNfRFRSCQkweDAyCQkJLyogRFRSIG1vZGVtIHNpZ25hbCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIE1TRVQgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIE1TRVQgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBzZXQvY2xlYXIgYSBwb3J0J3MgbW9kZW0gc2lnbmFscy4gKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNlbmRpZgorCisjZGVmaW5lCVBLVF9Nb2RlbVNldAkJKFBLVF9EYXRhKzQpCQkvKiBNb2RlbSBzZXQgc2lnbmFscyBtYXNrICovCisKKy8qIE1vZGVtU2V0IGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCU1TRVRfUlRTCQkweDAxCQkJLyogUlRTIG1vZGVtIHNpZ25hbCAqLworI2RlZmluZQlNU0VUX0RUUgkJMHgwMgkJCS8qIERUUiBtb2RlbSBzaWduYWwgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFBDTE9TRSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLGluLWJhbmQpCisKKyAgIFBDTE9TRSBpcyBzZW50IGZyb20gdGhlIGRyaXZlciB0byBwc2V1ZG8gY2xvc2UgYSBwcmV2aW91c2x5IG9wZW5lZCBwb3J0LgorICAgCisgICBUaGUgcG9ydCB3aWxsIGNsb3NlIHdoZW4gYWxsIGRhdGEgaGFzIGJlZW4gc2VudC9yZWNlaXZlZCwgaG93ZXZlciwgdGhlCisgICBwb3J0J3MgdHJhbnNtaXQgLyByZWNlaXZlIGFuZCBtb2RlbSBzaWduYWxzIHdpbGwgYmUgbGVmdCBlbmFibGVkIGFuZCB0aGUKKyAgIHBvcnQgbWFya2VkIGludGVybmFsbHkgYXMgUHNldWRvIENsb3NlZC4gKi8KKworI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBNR0VUICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBNR0VUIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gcmVxdWVzdCB0aGUgcG9ydCdzIGN1cnJlbnQgbW9kZW0gc2lnbmFscy4gKi8KKworI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBNRU1EVU1QICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgTUVNRFVNUCBpcyBzZW50IHByZS1lbXB0aXZlbHkgZnJvbSB0aGUgZHJpdmVyIHRvIHJlcXVlc3QgYSBkdW1wIG9mIDMyIGJ5dGVzCisgICBvZiB0aGUgc3BlY2lmaWVkIHBvcnQncyBSVEEgYWRkcmVzcyBzcGFjZS4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNkZWZpbmUJUEtUX1N1YkNtZAkJKFBLVF9EYXRhKzUpCQkvKiBTdWIgQ29tbWFuZCAqLworI2RlZmluZQlQS1RfQWRkcmVzcwkJKFBLVF9EYXRhKzYpCQkvKiBSZXF1ZXN0ZWQgYWRkcmVzcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUkVBRF9SRUdJU1RFUiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIFJFQURfUkVHSVNURVIgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byByZXF1ZXN0IHRoZSBjb250ZW50cworICAgb2YgdGhlIENEMTQwMCByZWdpc3RlciBzcGVjaWZpZWQgaW4gYWRkcmVzcy4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNkZWZpbmUJUEtUX1N1YkNtZAkJKFBLVF9EYXRhKzUpCQkvKiBTdWIgQ29tbWFuZCAqLworI2RlZmluZQlQS1RfQWRkcmVzcwkJKFBLVF9EYXRhKzYpCQkvKiBSZXF1ZXN0ZWQgYWRkcmVzcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgQ09NTUFORF9SVVAgLSBDT01QTEVURSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoUklPLT5Ecml2ZXIscHJlLWVtcHRpdmUpCisKKyAgIENPTU1BTkRfUlVQIC0gQ09NUExFVEUgaXMgc2VudCBpbiByZXNwb25zZSB0byBhbGwgcG9ydCBJL08gY29udHJvbCBjb21tYW5kCisgICBwYWNrZXRzLCBleGNlcHQgTUVNRFVNUCBhbmQgUkVBRF9SRUdJU1RFUi4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNkZWZpbmUJUEtUX0NtZDIJCShQS1RfRGF0YSsyKQkJLyogQ29tbWFuZCBjb2RlIGNvcHkgKi8KKyNkZWZpbmUJUEtUX01vZGVtU3RhdHVzCQkoUEtUX0RhdGErMykJCS8qIE1vZGVtIHNpZ25hbCBzdGF0dXMgKi8KKyNkZWZpbmUJUEtUX1BvcnRTdGF0dXMJCShQS1RfRGF0YSs0KQkJLyogUG9ydCBzaWduYWwgc3RhdHVzICovCisjZGVmaW5lCVBLVF9TdWJDbWQJCShQS1RfRGF0YSs1KQkJLyogU3ViIENvbW1hbmQgKi8KKworLyogTW9kZW1TdGF0dXMgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJTU9ERU1fRFNSCQkweDgwCQkJLyogRGF0YSBTZXQgUmVhZHkgbW9kZW0gc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fQ1RTCQkweDQwCQkJLyogQ2xlYXIgVG8gU2VuZCBtb2RlbSBzdGF0ZSAqLworI2RlZmluZQlNT0RFTV9SSQkJMHgyMAkJCS8qIFJpbmcgSW5kaWNhdGUgbW9kZW0gc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fQ0QJCTB4MTAJCQkvKiBDYXJyaWVyIERldGVjdCBtb2RlbSBzdGF0ZSAqLworI2RlZmluZQlNT0RFTV9UU1RPUAkJMHgwOAkJCS8qIFRyYW5zbWl0IFN0b3BwZWQgc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fVEVNUFRZCQkweDA0CQkJLyogVHJhbnNtaXQgRW1wdHkgc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fRFRSCQkweDAyCQkJLyogRFRSIG1vZGVtIG91dHB1dCBzdGF0ZSAqLworI2RlZmluZQlNT0RFTV9SVFMJCTB4MDEJCQkvKiBSVFMgbW9kZW0gb3V0cHV0IHN0YXRlICovCisKKy8qIFBvcnRTdGF0dXMgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUE9SVF9JU09QRU4JCTB4MDEJCQkvKiBQb3J0IG9wZW4gPyAqLworI2RlZmluZQlQT1JUX0hVUENMCQkweDAyCQkJLyogSGFuZ3VwIG9uIGNsb3NlPyAqLworI2RlZmluZQlQT1JUX01PUEVOUEVORAkJMHgwNAkJCS8qIE1vZGVtIG9wZW4gcGVuZGluZyAqLworI2RlZmluZQlQT1JUX0lTUEFSQUxMRUwJCTB4MDgJCQkvKiBQYXJhbGxlbCBwb3J0ICovCisjZGVmaW5lCVBPUlRfQlJFQUsJCTB4MTAJCQkvKiBQb3J0IG9uIGJyZWFrICovCisjZGVmaW5lCVBPUlRfU1RBVFVTUEVORAkJMDAyMAkJCS8qIFN0YXR1cyBwYWNrZXQgcGVuZGluZyAqLworI2RlZmluZQlQT1JUX0JSRUFLUEVORAkJMHg0MAkJCS8qIEJyZWFrIHBhY2tldCBwZW5kaW5nICovCisjZGVmaW5lCVBPUlRfTU9ERU1QRU5ECQkweDgwCQkJLyogTW9kZW0gc3RhdHVzIHBhY2tldCBwZW5kaW5nICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICBDT01NQU5EX1JVUCAtIENPTVBMRVRFICAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKKworICAgQ09NTUFORF9SVVAgLSBDT01QTEVURSBpcyBzZW50IGluIHJlc3BvbnNlIHRvIGFsbCBwb3J0IEkvTyBjb250cm9sIGNvbW1hbmQKKyAgIHBhY2tldHMsIGV4Y2VwdCBNRU1EVU1QIGFuZCBSRUFEX1JFR0lTVEVSLgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNkZWZpbmUJUEtUX0NtZDIJCShQS1RfRGF0YSsyKQkJLyogQ29tbWFuZCBjb2RlIGNvcHkgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfTW9kZW1TdGF0dXMJCShQS1RfRGF0YSszKQkJLyogTW9kZW0gc2lnbmFsIHN0YXR1cyAqLworI2RlZmluZQlQS1RfUG9ydFN0YXR1cwkJKFBLVF9EYXRhKzQpCQkvKiBQb3J0IHNpZ25hbCBzdGF0dXMgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9TdWJDbWQJCShQS1RfRGF0YSs1KQkJLyogU3ViIENvbW1hbmQgKi8KKyNlbmRpZgorCisvKiBNb2RlbVN0YXR1cyBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlNT0RFTV9EU1IJCTB4ODAJCQkvKiBEYXRhIFNldCBSZWFkeSBtb2RlbSBzdGF0ZSAqLworI2RlZmluZQlNT0RFTV9DVFMJCTB4NDAJCQkvKiBDbGVhciBUbyBTZW5kIG1vZGVtIHN0YXRlICovCisjZGVmaW5lCU1PREVNX1JJCQkweDIwCQkJLyogUmluZyBJbmRpY2F0ZSBtb2RlbSBzdGF0ZSAqLworI2RlZmluZQlNT0RFTV9DRAkJMHgxMAkJCS8qIENhcnJpZXIgRGV0ZWN0IG1vZGVtIHN0YXRlICovCisjZGVmaW5lCU1PREVNX1RTVE9QCQkweDA4CQkJLyogVHJhbnNtaXQgU3RvcHBlZCBzdGF0ZSAqLworI2RlZmluZQlNT0RFTV9URU1QVFkJCTB4MDQJCQkvKiBUcmFuc21pdCBFbXB0eSBzdGF0ZSAqLworI2RlZmluZQlNT0RFTV9EVFIJCTB4MDIJCQkvKiBEVFIgbW9kZW0gb3V0cHV0IHN0YXRlICovCisjZGVmaW5lCU1PREVNX1JUUwkJMHgwMQkJCS8qIFJUUyBtb2RlbSBvdXRwdXQgc3RhdGUgKi8KKworLyogUG9ydFN0YXR1cyBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlQT1JUX0lTT1BFTgkJMHgwMQkJCS8qIFBvcnQgb3BlbiA/ICovCisjZGVmaW5lCVBPUlRfSFVQQ0wJCTB4MDIJCQkvKiBIYW5ndXAgb24gY2xvc2U/ICovCisjZGVmaW5lCVBPUlRfTU9QRU5QRU5ECQkweDA0CQkJLyogTW9kZW0gb3BlbiBwZW5kaW5nICovCisjZGVmaW5lCVBPUlRfSVNQQVJBTExFTAkJMHgwOAkJCS8qIFBhcmFsbGVsIHBvcnQgKi8KKyNkZWZpbmUJUE9SVF9CUkVBSwkJMHgxMAkJCS8qIFBvcnQgb24gYnJlYWsgKi8KKyNkZWZpbmUJUE9SVF9TVEFUVVNQRU5ECQkwMDIwCQkJLyogU3RhdHVzIHBhY2tldCBwZW5kaW5nICovCisjZGVmaW5lCVBPUlRfQlJFQUtQRU5ECQkweDQwCQkJLyogQnJlYWsgcGFja2V0IHBlbmRpbmcgKi8KKyNkZWZpbmUJUE9SVF9NT0RFTVBFTkQJCTB4ODAJCQkvKiBNb2RlbSBzdGF0dXMgcGFja2V0IHBlbmRpbmcgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqICAgQ09NTUFORF9SVVAgLSBDT01QTEVURSAtIE1FTURVTVAgICAqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQorCisgICBDT01NQU5EX1JVUCAtIENPTVBMRVRFIC0gTUVNRFVNUCBpcyBzZW50IGFzIGFuIGFja25vd2xlZGdlbWVudCBmb3IgYSBNRU1EVU1QCisgICBwb3J0IEkvTyBjb250cm9sIGNvbW1hbmQgcGFja2V0LgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNkZWZpbmUJUEtUX0NtZDIJCShQS1RfRGF0YSsyKQkJLyogQ29tbWFuZCBjb2RlIGNvcHkgKi8KKyNkZWZpbmUJUEtUX01vZGVtU3RhdHVzCQkoUEtUX0RhdGErMykJCS8qIE1vZGVtIHNpZ25hbCBzdGF0dXMgKi8KKyNkZWZpbmUJUEtUX1BvcnRTdGF0dXMJCShQS1RfRGF0YSs0KQkJLyogUG9ydCBzaWduYWwgc3RhdHVzICovCisjZGVmaW5lCVBLVF9TdWJDbWQJCShQS1RfRGF0YSs1KQkJLyogU3ViIENvbW1hbmQgKi8KKyNkZWZpbmUJUEtUX0FkZHJlc3MJCShQS1RfRGF0YSs2KQkJLyogUmVxdWVzdGVkIGFkZHJlc3MgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfRHVtcAkJKFBLVF9EYXRhKzgpCQkvKiAzMmJ5dGVzIG9mIHJlcXVlc3RlZCBkdW1wIGRhdGEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqICAgQ09NTUFORF9SVVAgLSBDT01QTEVURSAtIFJFQURfUkVHSVNURVIgICAqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQorCisgICBDT01NQU5EX1JVUCAtIENPTVBMRVRFIC0gUkVBRF9SRUdJU1RFUiBpcyBzZW50IGFzIGFuIGFja25vd2xlZGdlbWVudCBmb3IgYQorICAgUkVBRF9SRUdJU1RFUiBwb3J0IEkvTyBjb250cm9sIGNvbW1hbmQgcGFja2V0LgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLypQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX1JlZ2lzdGVyVmFsdWUJKFBLVF9EYXRhKzMpCQkvKiBNb2RlbSBzaWduYWwgc3RhdHVzICovCisjaWYgMAorI2RlZmluZQlQS1RfUG9ydFN0YXR1cwkJKFBLVF9EYXRhKzQpCQkvKiBQb3J0IHNpZ25hbCBzdGF0dXMgKi8KKyNkZWZpbmUJUEtUX1N1YkNtZAkJKFBLVF9EYXRhKzUpCQkvKiBTdWIgQ29tbWFuZCAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKiogICBDT01NQU5EX1JVUCAtIEJSRUFLX1JFQ0VJVkVEICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKKworICAgQ09NTUFORF9SVVAgLSBCUkVBS19SRUNFSVZFRCBwYWNrZXRzIGFyZSBzZW50IHdoZW4gdGhlIHBvcnQgZGV0ZWN0cyBhIHJlY2VpdmUgQlJFQUsgc2lnbmFsLgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNkZWZpbmUJUEtUX0NtZDIJCShQS1RfRGF0YSsyKQkJLyogQ29tbWFuZCBjb2RlIGNvcHkgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqICAgQ09NTUFORF9SVVAgLSBNT0RFTV9TVEFUVVMgICAqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoUklPLT5Ecml2ZXIscHJlLWVtcHRpdmUpCisKKyAgIENPTU1BTkRfUlVQIC0gTU9ERU1fU1RBVFVTIHBhY2tldHMgYXJlIHNlbnQgd2hlbmV2ZXIgdGhlIHBvcnQgZGV0ZWN0cyBhCisgICBjaGFuZ2UgaW4gdGhlIGlucHV0IG1vZGVtIHNpZ25hbCBzdGF0ZXMuCisKKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCisjZGVmaW5lCVBLVF9Nb2RlbVN0YXR1cwkJKFBLVF9EYXRhKzMpCQkvKiBNb2RlbSBzaWduYWwgc3RhdHVzICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gQk9PVF9SRVFVRVNUICAgKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQorCisgICBCT09UX1JVUCAtIEJPT1RfUkVRVUVTVCBwYWNrZXRzIGFyZSBzZW50IHRvIHRoZSBEcml2ZXIgZnJvbSBSSU8gdG8gcmVxdWVzdAorICAgZmlybXdhcmUgY29kZSB0byBsb2FkIG9udG8gYXR0YWNoZWQgUlRBcy4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgQk9PVF9SVVAgLSBCT09UX1NFUVVFTkNFICAgKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIEJPT1RfUlVQIC0gQk9PVF9TRVFVRU5DRSBwYWNrZXRzIGFyZSBzZW50IGZyb20gdGhlIERyaXZlciB0byBSSU8gaW4gcmVzcG9uc2UKKyAgIHRvIGEgQk9PVF9SVVAgLSBCT09UX1JFUVVFU1QgcGFja2V0LgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9OdW1QYWNrZXRzCQkoUEtUX0RhdGErMikJCS8qIFBhY2tldHMgcmVxdWlyZWQgdG8gbG9hZCBmaXJtd2FyZSAqLworI2RlZmluZQlQS1RfTG9hZEJhc2UJCShQS1RfRGF0YSs0KQkJLyogUlRBIGZpcm13YXJlIGxvYWQgYWRkcmVzcyAqLworI2RlZmluZQlQS1RfQ29kZVNpemUJCShQS1RfRGF0YSs2KQkJLyogU2l6ZSBvZiBmaXJtd2FyZSBpbiBieXRlcyAqLworI2RlZmluZQlQS1RfQ21kU3RyaW5nCQkoUEtUX0RhdGErOCkJCS8qIENvbW1hbmQgc3RyaW5nICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICBCT09UX1JVUCAtIEJPT1RfQ09NUExFVEVEICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKKworICAgQk9PVF9SVVAgLSBCT09UX0NPTVBMRVRFIGlzIHNlbnQgdG8gdGhlIERyaXZlciBmcm9tIFJJTyB3aGVuIGRvd25sb2FkaW5nIG9mCisgICBSVEEgZmlybXdhcmUgaGFzIGNvbXBsZXRlZC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfTGlua051bWJlcgkJKFBLVF9EYXRhKzEpCQkvKiBMaW5rIG51bWJlciBSVEEgYm9vdGVkIG9uICovCisjZGVmaW5lCVBLVF9TZXJpYWxOdW1iZXIJKFBLVF9EYXRhKzIpCQkvKiA0IGJ5dGUgc2VyaWFsIG51bWJlciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgQk9PVF9SVVAgLSBQYWNrZXQgUmVxdWVzdCAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoUklPLT5Ecml2ZXIscHJlLWVtcHRpdmUpCisKKyAgIEJPT1RfUlVQIHBhY2tldCB3aXRob3V0IHRoZSBQS1RfQ01EX0JJVCBzZXQgaW4gdGhlIFBLVC0+bGVuIGZpZWxkIGlzIHNlbnQKKyAgIGZyb20gUklPIHRvIHRoZSBEcml2ZXIgYXMgYSByZXF1ZXN0IGZvciBhIGZpcm13YXJlIGJvb3QgcGFja2V0LiAqLworCisjZGVmaW5lCVBLVF9TZXF1ZW5jZU51bWJlcgkoUEtUX0RhdGErMCkJCS8qIFBhY2tldCBzZXF1ZW5jZSBudW1iZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqICAgQk9PVF9SVVAgLSBQYWNrZXQgUmVzcG9uc2UgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBJbiByZXNwb25zZSB0byBhIEJPT1RfUlVQIGJvb3QgcGFja2V0IHJlcXVlc3QsIHRoZSBkcml2ZXIgZmlsbHMgb3V0IHRoZSByZXNwb25zZQorICAgcGFja2V0IHdpdGggdGhlIDcwIGJ5dGVzIG9mIHRoZSByZXF1ZXN0ZWQgc2VxdWVuY2UuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX1NlcXVlbmNlTnVtYmVyCShQS1RfRGF0YSswKQkJLyogUGFja2V0IHNlcXVlbmNlIG51bWJlciAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9GaXJtd2FyZVBhY2tldAkoUEtUX0RhdGErMikJCS8qIEZpcm13YXJlIHBhY2tldCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gSUZPQUQgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIEJPT1RfUlVQIC0gSUZPQUQgcGFja2V0cyBhcmUgc2VudCBmcm9tIHRoZSBEcml2ZXIgdG8gYW4gUlRBIHRvIGNhdXNlIHRoZQorICAgUlRBIHRvIHNodXQgZG93biBhbmQgcmVib290LgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9JZm9hZElkMQkJKFBLVF9EYXRhKzIpCQkvKiBJRk9BRCBJZCAxICovCisjZGVmaW5lCVBLVF9JZm9hZElkMgkJKFBLVF9EYXRhKzMpCQkvKiBJRk9BRCBJZCAyICovCisKKyNkZWZpbmUJSUZPQURJRDEJCTB4QUQKKyNkZWZpbmUJSUZPQURJRDIJCTB4RjAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqICAgQk9PVF9SVVAgLSBJREVOVElGWSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBCT09UX1JVUCAtIElERU5USUZZIHBhY2tldHMgYXJlIHNlbnQgZnJvbSB0aGUgRHJpdmVyIHRvIGFuIFJUQSB0byBjYXVzZSB0aGUKKyAgIFJUQSB0byBmbGFzaCBpdHMgTEVEcyBmb3IgYSBwZXJpb2Qgb2YgdGltZS4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfSWRlbnRpZnlJZAkJKFBLVF9EYXRhKzIpCQkvKiBkZWZpbmVzIHBhdHRlcm4gdG8gZmxhc2ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBCT09UX1JVUCAtIFpPTUJJRSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBCT09UX1JVUCAtIFpPTUJJRSBwYWNrZXRzIGFyZSBzZW50IGZyb20gdGhlIERyaXZlciB0byBhbiBSVEEgdG8gY2F1c2UgdGhlCisgICBSVEEgdG8gc2h1dCBkb3duIGFuZCBmbGFzaCBpdCdzIExFRHMuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX1pvbWJpZUlkMQkJKFBLVF9EYXRhKzIpCQkvKiBaT01CSUUgSWQgMSAqLworI2RlZmluZQlQS1RfWm9tYmllSWQyCQkoUEtUX0RhdGErMykJCS8qIFpPTUJJRSBJZCAyICovCisKKyNkZWZpbmUJWk9NQklFSUQxCQkweDUyCisjZGVmaW5lCVpPTUJJRUlEMgkJMHgyMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gVUZPQUQgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIEJPT1RfUlVQIC0gVUZPQUQgcGFja2V0cyBhcmUgc2VudCBmcm9tIHRoZSBEcml2ZXIgdG8gYW4gUlRBIHRvIGNhdXNlIHRoZSBSVEEKKyAgIHRvIGFzayBpdCdzIG5laWdoYm91cmluZyBSVEEgdG8gc2h1dCBkb3duIGFuZCByZWJvb3QuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9MaW5rTnVtYmVyCQkoUEtUX0RhdGErMSkJCS8qIExpbmsgbnVtYmVyIG9mIFJUQSB0byBVRk9BRCAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9VZm9hZElkMQkJKFBLVF9EYXRhKzIpCQkvKiBVRk9BRCBJZCAxICovCisjZGVmaW5lCVBLVF9VZm9hZElkMgkJKFBLVF9EYXRhKzMpCQkvKiBVRk9BRCBJZCAyICovCisKKyNkZWZpbmUJVUZPQURJRDEJCTB4MUUKKyNkZWZpbmUJVUZPQURJRDIJCTB4MEQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBCT09UX1JVUCAtIElXQUlUICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBCT09UX1JVUCAtIElXQUlUIHBhY2tldHMgYXJlIHNlbnQgZnJvbSB0aGUgRHJpdmVyIHRvIGFuIFJUQSB0byBjYXVzZSB0aGUgUlRBCisgICB0byBwYXVzZSBib290aW5nIG9uIHRoZSBzcGVjaWZpZWQgbGluayBmb3IgMzAgc2Vjb25kcy4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX0xpbmtOdW1iZXIJCShQS1RfRGF0YSsxKQkJLyogTGluayBudW1iZXIgb2YgUlRBIHRvIFVGT0FEICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX0l3YWl0SWQxCQkoUEtUX0RhdGErMikJCS8qIElXQUlUIElkIDEgKi8KKyNkZWZpbmUJUEtUX0l3YWl0SWQyCQkoUEtUX0RhdGErMykJCS8qIElXQUlUIElkIDIgKi8KKworI2RlZmluZQlJV0FJVElEMQkJMHhERQorI2RlZmluZQlJV0FJVElEMgkJMHhCMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgUk9VVEVfUlVQIC0gUk9VVEVfUkVRVUVTVCAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoUklPLT5Ecml2ZXIscHJlLWVtcHRpdmUpCisKKyAgIFJPVVRFX1JVUCAtIFJPVVRFX1JFUVVFU1QgcGFja2V0cyBhcmUgc2VudCBmcm9tIGEgbmV3bHkgYm9vdGVkIG9yIGNvbm5lY3RlZAorICAgUlRBIHRvIGEgRHJpdmVyIHRvIHJlcXVlc3QgYW4gSUQgKFJVUCBvciB1bml0IG51bWJlcikuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX1NlcmlhbE51bWJlcgkoUEtUX0RhdGErMikJCS8qIDQgYnl0ZSBzZXJpYWwgbnVtYmVyICovCisjZGVmaW5lCVBLVF9Nb2R1bGVUeXBlcwkJKFBLVF9EYXRhKzYpCQkvKiBSVEEgTW9kdWxlIHR5cGVzICovCisKKy8qIE1vZHVsZVR5cGVzIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCU1PRF9CTEFOSwkJMHgwRgkJCS8qIEJsYW5rIHBsYXRlIGF0dGFjaGVkICovCisjZGVmaW5lCU1PRF9SUzIzMkRCMjUJCTB4MDAJCQkvKiBSUzIzMiBEQjI1IGNvbm5lY3RvciAqLworI2RlZmluZQlNT0RfUlMyMzJSSjQ1CQkweDAxCQkJLyogUlMyMzIgUko0NSBjb25uZWN0b3IgKi8KKyNkZWZpbmUJTU9EX1JTNDIyREIyNQkJMHgwMgkJCS8qIFJTNDIyIERCMjUgY29ubmVjdG9yICovCisjZGVmaW5lCU1PRF9SUzQ4NURCMjUJCTB4MDMJCQkvKiBSUzQ4NSBEQjI1IGNvbm5lY3RvciAqLworI2RlZmluZQlNT0RfUEFSQUxMRUwJCTB4MDQJCQkvKiBDZW50cm9uaWNzIHBhcmFsbGVsICovCisKKyNkZWZpbmUJTU9EMgkJCTB4MDgJCQkvKiBTZXQgdG8gaW5kaWNhdGUgUmV2MiBtb2R1bGUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiogICBST1VURV9SVVAgLSBST1VURV9GT0FEICAgKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBST1VURV9SVVAgLSBST1VURV9GT0FEIHBhY2tldCBpcyBzZW50IGFzIGEgcmVzcG9uc2UgdG8gYSBST1VURV9SVVAgLSBST1VURV9SRVFVRVNUCisgICBwYWNrZXQgdG8gY2F1c2UgdGhlIFJUQSB0byAiRmFsbCBPdmVyIEFuZCBEaWUiLiwgaS5lLiBzaHV0ZG93biBhbmQgcmVib290LgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9Sb3V0ZUNtZFN0cmluZwkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgc3RyaW5nICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiAgIFJPVVRFX1JVUCAtIFJPVVRFX0FMTE9DQVRFICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgUk9VVEVfUlVQIC0gUk9VVEVfQUxMT0NBVEUgcGFja2V0IGlzIHNlbnQgYXMgYSByZXNwb25zZSB0byBhIFJPVVRFX1JVUCAtIFJPVVRFX1JFUVVFU1QKKyAgIHBhY2tldCB0byBhbGxvY2F0ZSB0aGUgUlRBJ3MgSWQgbnVtYmVyIChSVVAgbnVtYmVyIDEuLjE2KQorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9JZE51bQkJKFBLVF9EYXRhKzEpCQkvKiBSVVAgbnVtYmVyIGZvciBwb3J0cyAxLi44ICovCisjaWYgMAorI2RlZmluZQlQS1RfUm91dGVDbWRTdHJpbmcJKFBLVF9EYXRhKzIpCQkvKiBDb21tYW5kIHN0cmluZyAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9JZE51bTIJCShQS1RfRGF0YSsweDE3KQkJLyogUlVQIG51bWJlciBmb3IgcG9ydHMgOS4uMTYgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqICAgUk9VVEVfUlVQIC0gUk9VVEVfVE9QT0xPR1kgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQorCisgICBST1VURV9SVVAgLSBST1VURV9UT1BPTE9HWSBwYWNrZXQgaXMgc2VudCB0byBpbmZvcm0gdGhlIGRyaXZlciBvZiBhbiBSVEEncworICAgY3VycmVudCBsaW5rIHN0YXR1cy4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfTGluazFSdXAJCShQS1RfRGF0YSsyKQkJLyogTGluayAxIFJVUCBudW1iZXIgKi8KKyNkZWZpbmUJUEtUX0xpbmsxTGluawkJKFBLVF9EYXRhKzMpCQkvKiBMaW5rIDEgbGluayBudW1iZXIgKi8KKyNkZWZpbmUJUEtUX0xpbmsyUnVwCQkoUEtUX0RhdGErNCkJCS8qIExpbmsgMiBSVVAgbnVtYmVyICovCisjZGVmaW5lCVBLVF9MaW5rMkxpbmsJCShQS1RfRGF0YSs1KQkJLyogTGluayAyIGxpbmsgbnVtYmVyICovCisjZGVmaW5lCVBLVF9MaW5rM1J1cAkJKFBLVF9EYXRhKzYpCQkvKiBMaW5rIDMgUlVQIG51bWJlciAqLworI2RlZmluZQlQS1RfTGluazNMaW5rCQkoUEtUX0RhdGErNykJCS8qIExpbmsgMyBsaW5rIG51bWJlciAqLworI2RlZmluZQlQS1RfTGluazRSdXAJCShQS1RfRGF0YSs4KQkJLyogTGluayA0IFJVUCBudW1iZXIgKi8KKyNkZWZpbmUJUEtUX0xpbms0TGluawkJKFBLVF9EYXRhKzkpCQkvKiBMaW5rIDQgbGluayBudW1iZXIgKi8KKyNkZWZpbmUJUEtUX1J0YVZwZFByb20JCShQS1RfRGF0YSsxMCkJCS8qIDMyIGJ5dGVzIG9mIFJUQSBWUEQgUFJPTSBDb250ZW50cyAqLworCisjZW5kaWYJCQkJCQkvKiBfc3h3aW5pZl9oICovCisKKy8qIEVuZCBvZiBSSU9XSU5JRi5IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpc2Nvcy5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaXNjb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njg1Y2MxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaXNjb3MuaApAQCAtMCwwICsxLDYzIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaXNjb3MuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTkKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjIKKyoqCisqKiAgaWRlbnQgQCgjKXJpc2Nvcy5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvX3Jpc2Nvc19oX18KKyNkZWZpbmUgX19yaW9fcmlzY29zX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlzY29zX2hfc2Njc18gPSAiQCgjKXJpc2Nvcy5oCTEuMiI7CisjZW5kaWYKKworLyoKKyoqIFRoaXMgbW9kdWxlIHVzZWQgdG8gZGVmaW5lIGFsbCB0aG9zZSBsaXR0bGUgaXRzeSBiaXRzIHJlcXVpcmVkIGZvciBSSVNDL09TCisqKiBub3cgaXQncyBmdWxsIG9mIG51bGwgbWFjcm9zLgorKi8KKworLyoKKyoqCVJCWVRFIHJlYWRzIGEgYnl0ZSBmcm9tIGEgbG9jYXRpb24uCisqKglSV09SRCByZWFkcyBhIHdvcmQgZnJvbSBhIGxvY2F0aW9uLgorKioJV0JZVEUgd3JpdGVzIGEgYnl0ZSB0byBhIGxvY2F0aW9uLgorKioJV1dPUkQgd3JpdGVzIGEgd29yZCB0byBhIGxvY2F0aW9uLgorKioJUklORFcgcmVhZHMgYSB3b3JkIHRocm91Z2ggYSBwb2ludGVyLgorKioJV0lORFcgd3JpdGVzIGEgd29yZCB0aHJvdWdoIGEgcG9pbnRlci4KKyoqCVJJT1NXQUIgc3dhcHMgdGhlIHR3byBieXRlcyBvZiBhIHdvcmQsIGlmIG5lZWRlZC4KKyovCisKKyNkZWZpbmUJUklPU1dBQihOKSAgICAgIChOKQorI2RlZmluZQlXQllURShBLFYpCShBKT0odWNoYXIpKFYpCisjZGVmaW5lIFdXT1JEKEEsVikJKEEpPSh1c2hvcnQpKFYpCisjZGVmaW5lIFJCWVRFKEEpCSh1Y2hhcikoQSkKKyNkZWZpbmUgUldPUkQoQSkJKHVzaG9ydCkoQSkKKyNkZWZpbmUgUklORFcoQSkJKCoodXNob3J0ICopKEEpKQorI2RlZmluZSBXSU5EVyhBLFYpCSgqKHVzaG9ydCAqKShBKT0odXNob3J0KShWKSkKKworI2VuZGlmIC8qIF9fcmlvX3Jpc2Nvc19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcm9tLmggYi9kcml2ZXJzL2NoYXIvcmlvL3JvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNzliOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3JvbS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgUiBPIE0KKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3JvbV9oCisjZGVmaW5lIF9yb21faCAxCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1MKK3N0YXRpYyBjaGFyICpfcmlvX3JvbV9oX3NjY3MgPSAiQCgjKXJvbS5oCTEuMSIgOworI2VuZGlmCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgIFJPTSAgUk9NIDsKK3N0cnVjdCAgUk9NICB7CisgICAgICAgICAgICAgICAgIHVfc2hvcnQgICAgc2x4IDsKKyAgICAgICAgICAgICAgICAgY2hhciAgICAgICBwY2JfbGV0dGVyX3JldiA7CisgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgcGNiX251bWJlcl9yZXYgOworICAgICAgICAgICAgICAgICBjaGFyICAgICAgIHNlcmlhbFs0XSA7CisgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgeWVhciA7CisgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgd2VlayA7CisgICAgICAgICAgICAgfSA7CisKKyNlbmRpZgorCisjZGVmaW5lIEhPU1RfUk9NICAgIChST00gKikgMHg3YzAwCisjZGVmaW5lIFJUQV9ST00JICAgIChST00gKikgMHg3ODAxCisjZGVmaW5lIFJPTV9MRU5HVEggIDB4MjAKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcm91dGUuaCBiL2RyaXZlcnMvY2hhci9yaW8vcm91dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDJkYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yb3V0ZS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICBSIE8gVSBUIEUgICAgIEggRSBBIEQgRSBSCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYSAvIEplcmVteSBSb2xscworIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9yb3V0ZV9oCisjZGVmaW5lIF9yb3V0ZV9oCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CisvKiBzdGF0aWMgY2hhciAqX3Jpb19yb3V0ZV9oX3NjY3MgPSAiQCgjKXJvdXRlLmgJMS4zIjsgKi8KKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0xJTktTIDQKKyNkZWZpbmUgTUFYX05PREVTIDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIG5vZGVzIGluIGEgc3VibmV0ICovCisjZGVmaW5lIE5PREVfQllURVMgKChNQVhfTk9ERVMgLyA4KSArIDEpICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGJpdCBwZXIgbm9kZSAqLworI2RlZmluZSBST1VURV9EQVRBX1NJWkUgIChOT0RFX0JZVEVTICsgMikgICAgIC8qIE51bWJlciBvZiBieXRlcyBmb3IgY29tcGxldGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyBhYm91dCBjb3N0IGV0Yy4gKi8KKyNkZWZpbmUgUk9VVEVTX1BFUl9QQUNLRVQgKChQS1RfTUFYX0RBVEFfTEVOIC0yKS8gUk9VVEVfREFUQV9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBub2RlcyB3ZSBjYW4gc3F1ZWV6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gb25lIHBhY2tldCAqLworI2RlZmluZSBNQVhfVE9QT0xPR1lfUEFDS0VUUyAoTUFYX05PREVTIC8gUk9VVEVTX1BFUl9QQUNLRVQgKyAxKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5lIHRoZSB0eXBlcyBvZiBjb21tYW5kIGZvciB0aGUgUk9VVEUgUlVQLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUk9VVEVfUkVRVUVTVCAgICAwICAgICAgICAgICAgICAgICAgICAvKiBSZXF1ZXN0IGFuIElEICovCisjZGVmaW5lIFJPVVRFX0ZPQUQgICAgICAgMSAgICAgICAgICAgICAgICAgICAgLyogS2lsbCB0aGUgUlRBICovCisjZGVmaW5lIFJPVVRFX0FMUkVBRFkgICAgMiAgICAgICAgICAgICAgICAgICAgLyogSUQgZ2l2ZW4gYWxyZWFkeSAqLworI2RlZmluZSBST1VURV9VU0VEICAgICAgIDMgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBJRCdzIHVzZWQgKi8KKyNkZWZpbmUgUk9VVEVfQUxMT0NBVEUgICA0ICAgICAgICAgICAgICAgICAgICAvKiBIZXJlIGl0IGlzICovCisjZGVmaW5lIFJPVVRFX1JFUV9UT1AgICAgNSAgICAgICAgICAgICAgICAgICAgLyogSSBiZXQgeW91IGRpZG4ndCBleHBlY3QuLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFRvcG9sb2dpY2FsIElucXVpc2l0aW9uICovCisjZGVmaW5lIFJPVVRFX1RPUE9MT0dZICAgNiAgICAgICAgICAgICAgICAgICAgLyogVG9wb2xvZ3kgcmVxdWVzdCBhbnN3ZXJlZCBGRCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlZmluZSB0aGUgUm91dGUgTWFwIFN0cnVjdHVyZQorICoKKyAqIFRoZSByb3V0ZSBtYXAgZ2l2ZXMgYSBwb2ludGVyIHRvIGEgTGluayBTdHJ1Y3R1cmUgdG8gdXNlLgorICogVGhpcyBhbGxvd3MgRGlzY29ubmVjdGVkIExpbmtzIHRvIGJlIGNoZWNrZWQgcXVpY2tseQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IENPU1RfUk9VVEUgQ09TVF9ST1VURTsKK3N0cnVjdCBDT1NUX1JPVVRFIHsKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNvc3Q7ICAgICAgICAvKiBDb3N0IGRvd24gdGhpcyBsaW5rICovCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciByb3V0ZVtOT0RFX0JZVEVTXTsgLyogTm9kZXMgdGhvcm91Z2ggdGhpcyByb3V0ZSAqLworICAgICAgICAgICAgICAgICAgfSA7CisKK3R5cGVkZWYgc3RydWN0IFJPVVRFX1NUUiBST1VURV9TVFIgOworc3RydWN0ICBST1VURV9TVFIgeworICAgICAgICAgICAgICAgICAgICAgIENPU1RfUk9VVEUgY29zdF9yb3V0ZVtNQVhfTElOS1NdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29zdCAvIHJvdXRlIGZvciB0aGlzIGxpbmsgKi8KKyAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgZmF2b3VyZWQ7ICAgICAgICAgIC8qIGZhdm91cmVkIGxpbmsgKi8KKyAgICAgICAgICAgICAgICAgIH0gOworCisKKyNkZWZpbmUgTk9fTElOSyAgICAgICAgICAgIChzaG9ydCkgNSAgICAgIC8qIExpbmsgdW5hdHRhY2hlZCAqLworI2RlZmluZSBST1VURV9OT19JRCAgICAgICAgKHNob3J0KSAxMDAgICAgLyogTm8gSWQgKi8KKyNkZWZpbmUgUk9VVEVfRElTQ09OTkVDVCAgICh1c2hvcnQpIDB4ZmYgIC8qIE5vdCBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgUk9VVEVfSU5URVJDT05ORUNUICh1c2hvcnQpIDB4NDAgIC8qIFN1Yi1uZXQgaW50ZXJjb25uZWN0ICovCisKKworI2RlZmluZSBTWU5DX1JVUCAgICAgICAgICh1c2hvcnQpIDI1NQorI2RlZmluZSBDT01NQU5EX1JVUCAgICAgICh1c2hvcnQpIDI1NAorI2RlZmluZSBFUlJPUl9SVVAgICAgICAgICh1c2hvcnQpIDI1MworI2RlZmluZSBQT0xMX1JVUCAgICAgICAgICh1c2hvcnQpIDI1MgorI2RlZmluZSBCT09UX1JVUCAgICAgICAgICh1c2hvcnQpIDI1MQorI2RlZmluZSBST1VURV9SVVAgICAgICAgICh1c2hvcnQpIDI1MAorI2RlZmluZSBTVEFUVVNfUlVQICAgICAgICh1c2hvcnQpIDI0OQorI2RlZmluZSBQT1dFUl9SVVAgICAgICAgICh1c2hvcnQpIDI0OAorCisjZGVmaW5lIEhJR0hFU1RfUlVQICAgICAgKHVzaG9ydCkgMjU1ICAgLyogU2V0IHRvIFRvcCBvbmUgKi8KKyNkZWZpbmUgTE9XRVNUX1JVUCAgICAgICAodXNob3J0KSAyNDggICAvKiBTZXQgdG8gYm90dG9tIG9uZSAqLworCisjZW5kaWYKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3J0YWh3LmggYi9kcml2ZXJzL2NoYXIvcmlvL3J0YWh3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4NjAxMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcnRhaHcuaApAQCAtMCwwICsxLDc1IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgUiBUIEEgICAgSCBBIFIgRCBXIEEgUiBFCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9fcnRhaHdfaF9zY2NzID0gIkAoIylydGFody5oCTEuNSIgOworI2VuZGlmCisjZW5kaWYKKworI2RlZmluZQlXQVRDSERPR19BRERSCSgodW5zaWduZWQgc2hvcnQgKikweDdhMDApCisjZGVmaW5lIFJUQV9MRURfQUREUgkoKHVuc2lnbmVkIHNob3J0ICopMHg3YzAwKQorI2RlZmluZSBTRVJJQUxOVU1fQUREUgkoKHVuc2lnbmVkIGNoYXIgKikweDc4MDkpCisjZGVmaW5lIExBVENIX0FERFIgICAgICAoKHVuc2lnbmVkIGNoYXIgKikweDc4MDApCisKKy8qCisqKiBIZXJlIHdlIGRlZmluZSB3aGVyZSB0aGUgY2QxNDAwIGNoaXBzIGFyZSBpbiBtZW1vcnkuCisqLworI2RlZmluZSBDRDE0MDBfT05FX0FERFIJCSgweDczMDApCisjZGVmaW5lIENEMTQwMF9UV09fQUREUgkJKDB4NzIwMCkKKyNkZWZpbmUgQ0QxNDAwX1RIUkVFX0FERFIJKDB4NzEwMCkKKyNkZWZpbmUgQ0QxNDAwX0ZPVVJfQUREUgkoMHg3MDAwKQorCisvKgorKiogRGVmaW5lIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgbW9kdWxlcyB3ZSBjYW4gaGF2ZQorKi8KK2VudW0gbW9kdWxlIHsKKyAgICBNT0RfQkxBTksJCT0gMHgwZiwJCS8qIEJsYW5rIHBsYXRlIGF0dGFjaGVkICovCisgICAgTU9EX1JTMjMyREIyNQk9IDB4MDAsCQkvKiBSUzIzMiBEQjI1IGNvbm5lY3RvciAqLworICAgIE1PRF9SUzIzMlJKNDUJPSAweDAxLAkJLyogUlMyMzIgUko0NSBjb25uZWN0b3IgKi8KKyAgICBNT0RfUlM0MjJEQjI1CT0gMHgwMiwJCS8qIFJTNDIyIERCMjUgY29ubmVjdG9yICovCisgICAgTU9EX1JTNDg1REIyNQk9IDB4MDMsCQkvKiBSUzQ4NSBEQjI1IGNvbm5lY3RvciAqLworICAgIE1PRF9QQVJBTExFTAk9IDB4MDQJCS8qIENlbnRyb25pY3MgcGFyYWxsZWwgKi8KK307CisKKyNkZWZpbmUgVFlQRV9IT1NUCTAKKyNkZWZpbmUgVFlQRV9SVEE4CTEKKyNkZWZpbmUgVFlQRV9SVEExNgkyCisKKyNkZWZpbmUJV0FUQ0hfRE9HCVdBVENIRE9HX0FERFIKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9ydXAuaCBiL2RyaXZlcnMvY2hhci9yaW8vcnVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkMmJjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcnVwLmgKQEAgLTAsMCArMSw4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgIFIgVSBQICAgUyBUIFIgVSBDIFQgVSBSIEUKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3J1cF9oCisjZGVmaW5lIF9ydXBfaCAxCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CisvKiBzdGF0aWMgY2hhciAqX3Jpb19ydXBfaF9zY2NzID0gIkAoIylydXAuaAkxLjUiOyAqLworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoIEhPU1QgKSB8fCBkZWZpbmVkKCBJTktFUk5FTCApCisjZGVmaW5lIE1BWF9SVVAgICAgICAgICAgKChzaG9ydCkgMTYpIAorI2VuZGlmCisjaWZkZWYgUlRBCisjZGVmaW5lIE1BWF9SVVAgICAgICAgICAgKChzaG9ydCkgMSkKKyNlbmRpZgorCisjZGVmaW5lIFBLVFNfUEVSX1JVUCAgICAgKChzaG9ydCkgMikgICAgIC8qIFRoZXkgYXJlIGFsd2F5cyB1c2VkIGluIHBhaXJzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZWZpbmUgYWxsIHRoZSAgcGFja2V0IHJlcXVlc3Qgc3R1ZmYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFRYX1JVUF9JTkFDVElWRSAgICAgICAgICAwICAgICAgICAvKiBOb3RoaW5nIHRvIHRyYW5zbWl0ICovCisjZGVmaW5lIFRYX1BBQ0tFVF9SRUFEWSAgICAgICAgICAxICAgICAgICAvKiBUcmFuc21pdCBwYWNrZXQgcmVhZHkgKi8KKyNkZWZpbmUgVFhfTE9DS19SVVAgICAgICAgICAgICAgIDIgICAgICAgIC8qIFRyYW5zbWl0IHNpZGUgbG9ja2VkICovCisKKyNkZWZpbmUgUlhfUlVQX0lOQUNUSVZFICAgICAgICAgIDAgICAgICAgIC8qIE5vdGhpbmcgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgUlhfUEFDS0VUX1JFQURZICAgICAgICAgIDEgICAgICAgIC8qIFBhY2tldCByZWNlaXZlZCAqLworCisjZGVmaW5lIFJVUF9OT19PV05FUiAgICAgICAgICAgICAweGZmICAgICAvKiBSVVAgbm90IG93bmVkIGJ5IGFueSBwcm9jZXNzICovCisKK3N0cnVjdCBSVVAgeworICAgICAgICAgICAgIFBLVF9wdHIgICAgdHhwa3Q7ICAgICAgICAgICAgLyogT3V0Z29pbmcgcGFja2V0ICovCisgICAgICAgICAgICAgUEtUX3B0ciAgICByeHBrdDsgICAgICAgICAgICAvKiBJbmNvbWluZyBwYWNrZXQgKi8KKyAgICAgICAgICAgICBXT1JEICAgICAgIGxpbms7ICAgICAgICAgICAgIC8qIFdoaWNoIGxpbmsgdG8gc2VuZCBkb3duPyAqLworICAgICAgICAgICAgIEJZVEUgICAgICAgcnVwX2Rlc3RfdW5pdFsyXTsgLyogRGVzdGluYXRpb24gdW5pdCAqLworICAgICAgICAgICAgIFdPUkQgICAgICAgaGFuZHNoYWtlOyAgICAgICAgLyogRm9yIGhhbmRzaGFraW5nICovCisgICAgICAgICAgICAgV09SRCAgICAgICB0aW1lb3V0OyAgICAgICAgICAvKiBUaW1lb3V0ICovCisgICAgICAgICAgICAgV09SRCAgICAgICBzdGF0dXM7ICAgICAgICAgICAvKiBTdGF0dXMgKi8KKyAgICAgICAgICAgICBXT1JEICAgICAgIHR4Y29udHJvbDsgICAgICAgIC8qIFRyYW5zbWl0IGNvbnRyb2wgKi8KKyAgICAgICAgICAgICBXT1JEICAgICAgIHJ4Y29udHJvbDsgICAgICAgIC8qIFJlY2VpdmUgY29udHJvbCAqLworICAgICAgICAgICB9OworIAorI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9ydXBzdGF0LmggYi9kcml2ZXJzL2NoYXIvcmlvL3J1cHN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGFhZmFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9ydXBzdGF0LmgKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICBSVVBTVEFUCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBKZXJlbXkgUm9sbHMKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfcnVwc3RhdF9oCisjZGVmaW5lIF9ydXBzdGF0X2gKKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvX3J1cHN0YXRfaF9zY2NzID0gIkAoIylydXBzdGF0LmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lICAgIFNUQVRVU19TWU5DICAgIDAKKyNkZWZpbmUgICAgU1RBVFVTX1JFUV9UT1AgMQorI2RlZmluZSAgICBTVEFUVVNfVE9QT0xPR1kgICAgMgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9zYW0uaCBiL2RyaXZlcnMvY2hhci9yaW8vc2FtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhY2NiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vc2FtLmgKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgUyBBIE0gLiBICisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfc2FtX2gKKyNkZWZpbmUgX3NhbV9oIDEKKworI2lmZGVmIFNDQ1NfTEFCRUxTCisjaWZuZGVmIGxpbnQKKy8qIHN0YXRpYyBjaGFyICpfcmlvX3NhbV9oX3NjY3MgPSAiQCgjKXNhbS5oCTEuMyI7ICovCisjZW5kaWYKKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZCggSE9TVCApICYmICFkZWZpbmVkKCBJTktFUk5FTCApCisjZGVmaW5lIFJUQSAxCisjZW5kaWYKKworI2RlZmluZSBOVU1fRlJFRV9MSVNUX1VOSVRTICAgICA1MDAKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAoc2hvcnQpICAweDAwCisjZW5kaWYKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFICAoc2hvcnQpICAhRkFMU0UKKyNlbmRpZgorCisjZGVmaW5lIFRYICAgIFRSVUUKKyNkZWZpbmUgUlggICAgRkFMU0UKKworCit0eXBlZGVmIHN0cnVjdCBGUkVFX0xJU1QgRlJFRV9MSVNUIDsKK3N0cnVjdCBGUkVFX0xJU1QgICB7CisgICAgICAgICAgICAgICAgICAgICAgIEZSRUVfTElTVF9wdHIgbmV4dCA7CisgICAgICAgICAgICAgICAgICAgICAgIEZSRUVfTElTVF9wdHIgcHJldiA7CisgICAgICAgICAgICAgICAgICAgfSA7CisKKworI2VuZGlmCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3NlbGZ0ZXN0LmggYi9kcml2ZXJzL2NoYXIvcmlvL3NlbGZ0ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhZTQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vc2VsZnRlc3QuaApAQCAtMCwwICsxLDczIEBACisvKgorKiogRmlsZToJCXNlbGZ0ZXN0LmgKKyoqCisqKiBBdXRob3I6CQlEYXZpZCBEaXgKKyoqCisqKiBDcmVhdGVkOgkJMTV0aCBNYXJjaCAxOTkzCisqKgorKiogTGFzdCBtb2RpZmllZDoJOTQvMDYvMTQKKyoqCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpZm5kZWYJX3NlbGZ0ZXN0c19oXworI2RlZmluZSBfc2VsZnRlc3RzX2hfCisKKy8qCisqKiBTZWxmdGVzdCBpZGVudGlmaWVyLi4uCisqLworI2RlZmluZSBTRUxGVEVTVF9NQUdJQwkweDVhNWEKKworLyoKKyoqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgcGFja2V0IHRoYXQgaXMgc2VudCBiYWNrIGFmdGVyIGVhY2gKKyoqIHNlbGZ0ZXN0IG9uIGEgYm9vdGluZyBSVEEuCisqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHNob3J0CQltYWdpYzsJCQkvKiBJZGVudGlmaWVzIHBhY2tldCB0eXBlICovCisgICAgaW50CQkJdGVzdDsJCQkvKiBUZXN0IG51bWJlciwgc2VlIGJlbG93ICovCisgICAgdW5zaWduZWQgaW50CXJlc3VsdDsJCQkvKiBSZXN1bHQgdmFsdWUgKi8KKyAgICB1bnNpZ25lZCBpbnQJZGF0YUluOworICAgIHVuc2lnbmVkIGludAlkYXRhT3V0OworfXNlbGZ0ZXN0U3RydWN0OworCisvKgorKiogVGhlIGRpZmZlcmVudCB0ZXN0cyBhcmUgaWRlbnRpZmllZCBieSB0aGUgZm9sbG93aW5nIGRhdGEgdmFsdWVzLgorKi8KK2VudW0gdGVzdCB7CisgICAgVEVTVFNfQ09NUExFVEUJPSAweDAwLAorICAgIE1FTVRFU1RfQUREUgk9IDB4MDEsCisgICAgTUVNVEVTVF9CSVQJCT0gMHgwMiwKKyAgICBNRU1URVNUX0ZJTEwJPSAweDAzLAorICAgIE1FTVRFU1RfREFUQUJVUwk9IDB4MDQsCisgICAgTUVNVEVTVF9BRERSQlVTCT0gMHgwNSwKKyAgICBDRDE0MDBfSU5JVAkJPSAweDEwLAorICAgIENEMTQwMF9MT09QCQk9IDB4MTEsCisgICAgQ0QxNDAwX0lOVEVSUlVQVCAgICA9IDB4MTIKK307CisKK2VudW0gcmVzdWx0IHsKKyAgICBFX1BPUlQJCT0gMHgxMCwKKyAgICBFX1RYCQk9IDB4MTEsCisgICAgRV9SWAkJPSAweDEyLAorICAgIEVfRVhDRVBUCQk9IDB4MTMsCisgICAgRV9DT01QQVJFCQk9IDB4MTQsCisgICAgRV9NT0RFTQkJPSAweDE1LAorICAgIEVfVElNRU9VVAkJPSAweDE2LAorICAgIEVfSU5URVJSVVBUICAgICAgICAgPSAweDE3Cit9OworI2VuZGlmCS8qIF9zZWxmdGVzdHNfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vc3BhY2UuaCBiL2RyaXZlcnMvY2hhci9yaW8vc3BhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjM5OGQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9zcGFjZS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHNwYWNlLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjE5CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIyCisqKgorKiogIGlkZW50IEAoIylzcGFjZS5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvX3NwYWNlX2hfXworI2RlZmluZSBfX3Jpb19zcGFjZV9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3NwYWNlX2hfc2Njc18gPSAiQCgjKXNwYWNlLmgJMS4yIjsKKyNlbmRpZgorCitleHRlcm4gaW50IHJpb19jbnRsczsKK2V4dGVybiBpbnQgcmlvX2Jhc2VzW107CitleHRlcm4gaW50IHJpb19saW1pdHNbXTsKK2V4dGVybiBpbnQgcmlvX3ZlY3RzW107CisKKyNlbmRpZiAvKiBfX3Jpb19zcGFjZV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vc3lzbWFwLmggYi9kcml2ZXJzL2NoYXIvcmlvL3N5c21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzczMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3N5c21hcC5oCkBAIC0wLDAgKzEsNjMgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICBTIFkgUyBUIEUgTSAgIE0gQSBQICAgSCBFIEEgRCBFIFIKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb19zeXNtYXBfaF9zY2NzID0gIkAoIylzeXNtYXAuaAkxLjEiIDsKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgU1lTVEVNX01BUF9MRU4gICAgIDY0ICAgICAgICAgICAvKiBMZW4gb2YgU3lzdGVtIE1hcCBhcnJheSAqLworCisKK3R5cGVkZWYgc3RydWN0IFNZU19NQVAgICAgICAgIFNZU19NQVAgOwordHlwZWRlZiBzdHJ1Y3QgU1lTX01BUF9MSU5LICAgU1lTX01BUF9MSU5LIDsKKworc3RydWN0IFNZU19NQVBfTElOSyB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBpZCA7ICAgICAgICAgIC8qIFVuaXQgSWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGxpbmsgOyAgICAgICAgLyogSWQncyBMaW5rICovCisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBiZWVuX2hlcmUgOyAgIC8qIFVzZWQgYnkgbWFwX2dlbiAqLworICAgICAgICAgICAgICAgICAgICB9IDsKKworc3RydWN0IFNZU19NQVAgeworICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICBzZXJpYWxfbnVtWzRdIDsKKyAgICAgICAgICAgICAgICAgICBTWVNfTUFQX0xJTksgbGlua1s0XSA7CisgICAgICAgICAgICAgICB9IDsKKworCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vdGltZW91dHMuaCBiL2RyaXZlcnMvY2hhci9yaW8vdGltZW91dHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWIzMTMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby90aW1lb3V0cy5oCkBAIC0wLDAgKzEsNTEgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgIFQgSSBNIEUgTyBVIFQgUworICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvX2RlZmF1bHRzX2hfc2NjcyA9ICJAKCMpdGltZW91dHMuaAkxLjMiIDsKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgTUlMTElTRUNPTkQgICAgICAgICAgIChpbnQpICgxMDAwLzY0KSAgIC8qIDE1LjYyNSBsb3cgdGlja3MgKi8KKyNkZWZpbmUgU0VDT05EICAgICAgICAgICAgICAgIChpbnQpIDE1NjI1ICAgICAgIC8qIExvdyBwcmlvcml0eSB0aWNrcyAqLworCisjZGVmaW5lIFRYX1RJTUVPVVQgICAgICAgICAgKGludCkgKDIwMCAqIE1JTExJU0VDT05EKQorCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby90b3AuaCBiL2RyaXZlcnMvY2hhci9yaW8vdG9wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1YzQwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vdG9wLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogdG9wLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjE5CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIyCisqKgorKiogIGlkZW50IEAoIyl0b3AuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb190b3BfaF9fCisjZGVmaW5lIF9fcmlvX3RvcF9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3RvcF9oX3NjY3NfID0gIkAoIyl0b3AuaAkxLjIiOworI2VuZGlmCisKKy8qCisqKiBUb3BvbG9neSBpbmZvcm1hdGlvbgorKi8KK3N0cnVjdCBUb3AKK3sKKyAgICB1Y2hhciBVbml0OworICAgIHVjaGFyIExpbms7Cit9OworCisjZW5kaWYgLyogX19yaW9fdG9wX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby90eXBkZWYuaCBiL2RyaXZlcnMvY2hhci9yaW8vdHlwZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiOWRkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vdHlwZGVmLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogdHlwZGVmLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjIwCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIyCisqKgorKiogIGlkZW50IEAoIyl0eXBkZWYuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb190eXBkZWZfaF9fCisjZGVmaW5lIF9fcmlvX3R5cGRlZl9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3R5cGRlZl9oX3NjY3NfID0gIkAoIyl0eXBkZWYuaAkxLjIiOworI2VuZGlmCisKKyN1bmRlZiBWUElYCisKKy8qCisqKiBJVCBJUyBSRUFMTFksIFJFQUxMWSwgSU1QT1JUQU5UIFRIQVQgQllURVMgQVJFIFVOU0lHTkVEIQorKioKKyoqIFRoZXNlIHR5cGVzIGFyZSBPTkxZIHRvIGJlIHVzZWQgZm9yIHJlZmVyaW5nIHRvIGRhdGEgc3RydWN0dXJlcworKiogb24gdGhlIFJJTyBIb3N0IGNhcmQhCisqLwordHlwZWRlZgl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCUJZVEU7Cit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0CVdPUkQ7Cit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIGludAlEV09SRDsKK3R5cGVkZWYJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgUklPUDsKK3R5cGVkZWYJdm9sYXRpbGUgc2hvcnQgICAgICAgICAgTlVNQkVSOworCisKKy8qCisqKiAyNy4wMS4xOTkgQVJHIC0gbW9kcyB0byBjb21waWxlICduZXd1dGlscycgb24gTHl4bk9TIC0KKyoqIFRoZXNlICNkZWZpbmVzIGFyZSBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlICdsaWJmdW5jcycgbGlicmFyeQorKiogb25seS4gVGhleSBhcmUgbm90IG5lY2Vzc2FyaWx5IGNvcnJlY3QgdHlwZSBtYXBwaW5ncyBhbmQKKyoqIGFyZSBoZXJlIG9ubHkgdG8gbWFrZSB0aGUgc291cmNlIGNvbXBpbGUuCisqLworLyogdHlwZWRlZiB1bnNpZ25lZCBpbnQJdWludDsgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZwl1bG9uZ190OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAl1c2hvcnRfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgl1Y2hhcl90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCXF1ZXVlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJbWJsa190OwordHlwZWRlZgl1bnNpZ25lZCBpbnQgCXBhZGRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1Y2hhcjsKKworI2RlZmluZQlUUE5VTEwJKCh1c2hvcnQpKDB4ODAwMCkpCisKKworLyoKKyoqIFJJTyBzdHJ1Y3R1cmVzIGRlZmluZWQgaW4gb3RoZXIgaW5jbHVkZSBmaWxlcy4KKyovCit0eXBlZGVmIHN0cnVjdCBQS1QJIAlQS1Q7Cit0eXBlZGVmIHN0cnVjdCBMUEIJIAlMUEI7Cit0eXBlZGVmIHN0cnVjdCBSVVAJIAlSVVA7Cit0eXBlZGVmIHN0cnVjdCBQb3J0CQlQb3J0OwordHlwZWRlZiBzdHJ1Y3QgRHBSYW0JCURwUmFtOworCisjZW5kaWYgLyogX19yaW9fdHlwZGVmX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby91bml4cnVwLmggYi9kcml2ZXJzL2NoYXIvcmlvL3VuaXhydXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGRmODYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby91bml4cnVwLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogdW5peHJ1cC5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoyMAorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMgorKioKKyoqICBpZGVudCBAKCMpdW5peHJ1cC5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvX3VuaXhydXBfaF9fCisjZGVmaW5lIF9fcmlvX3VuaXhydXBfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl91bml4cnVwX2hfc2Njc18gPSAiQCgjKXVuaXhydXAuaAkxLjIiOworI2VuZGlmCisKKy8qCisqKiAgICBVbml4UnVwIGRhdGEgc3RydWN0dXJlLiBUaGlzIGNvbnRhaW5zIHBvaW50ZXJzIHRvIGFjdHVhbCBSVVBzIG9uIHRoZQorKiogICAgaG9zdCBjYXJkLCBhbmQgYWxsIHRoZSBjb21tYW5kL2Jvb3QgY29udHJvbCBzdHVmZi4KKyovCitzdHJ1Y3QgICAgVW5peFJ1cAoreworICAgIHN0cnVjdCBDbWRCbGsgICAgKkNtZHNXYWl0aW5nUDsJLyogQ29tbWFuZHMgd2FpdGluZyB0byBiZSBkb25lICovCisgICAgc3RydWN0IENtZEJsayAgICAqQ21kUGVuZGluZ1A7CS8qIFRoZSBjb21tYW5kIGN1cnJlbnRseSBiZWluZyBzZW50ICovCisgICAgc3RydWN0IFJVUCAgICAgICAqUnVwUDsJCS8qIHRoZSBSdXAgdG8gc2VuZCBpdCB0byAqLworICAgIHVpbnQgICAgICAgICAgICAgSWQ7CQkvKiBJZCBudW1iZXIgKi8KKyAgICB1aW50ICAgICAgICAgICAgIEJhc2VTeXNQb3J0OwkvKiBTeXNQb3J0IG9mIGZpcnN0IHR0eSBvbiB0aGlzIFJUQSAqLworICAgIHVpbnQgICAgICAgICAgICAgTW9kVHlwZXM7CQkvKiBNb2R1bGVzIG9uIHRoaXMgUlRBICovCisgICAgc3BpbmxvY2tfdAkgICAgIFJ1cExvY2s7CQkvKiBMb2NrIHN0cnVjdHVyZSBmb3IgTVBYICovCisvKiAgICBzdHJ1Y3QgbG9ja2IgICAgIFJ1cExvY2s7CSovCS8qIExvY2sgc3RydWN0dXJlIGZvciBNUFggKi8KK307CisKKyNlbmRpZiAvKiBfX3Jpb191bml4cnVwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYyBiL2RyaXZlcnMvY2hhci9yaXNjb204LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhM2EwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaXNjb204LmMKQEAgLTAsMCArMSwxODA5IEBACisvKgorICogICAgICBsaW51eC9kcml2ZXJzL2NoYXIvcmlzY29tLmMgIC0tIFJJU0NvbS84IG11bHRpcG9ydCBzZXJpYWwgZHJpdmVyLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgIERtaXRyeSBHb3JvZGNoYW5pbiAocGdtZHNnQGliaS5jb20pCisgKgorICogICAgICBUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUgTGludXggc2VyaWFsIGRyaXZlciwgd3JpdHRlbiBieQorICogICAgICBMaW51cyBUb3J2YWxkcywgVGhlb2RvcmUgVCdzbyBhbmQgb3RoZXJzLiBUaGUgUklTQ29tLzggY2FyZCAKKyAqICAgICAgcHJvZ3JhbW1pbmcgaW5mbyB3YXMgb2J0YWluZWQgZnJvbSB2YXJpb3VzIGRyaXZlcnMgZm9yIG90aGVyIE9TZXMgCisgKgkoRnJlZUJTRCwgSVNDLCBldGMpLCBidXQgbm8gc291cmNlIGNvZGUgZnJvbSB0aG9zZSBkcml2ZXJzIHdlcmUgCisgKglkaXJlY3RseSBpbmNsdWRlZCBpbiB0aGlzIGRyaXZlci4KKyAqCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqCVJldmlzaW9uIDEuMQorICoKKyAqCUNoYW5nZUxvZzoKKyAqCUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiAtIDI3LUp1bi0yMDAxCisgKgktIGdldCByaWQgb2YgY2hlY2tfcmVnaW9uIGFuZCBzZXZlcmFsIGNsZWFudXBzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInJpc2NvbTguaCIKKyNpbmNsdWRlICJyaXNjb204X3JlZy5oIgorCisvKiBBbSBJIHBhcmFub2lkIG9yIG5vdCA/IDstKSAqLworI2RlZmluZSBSSVNDT01fUEFSQU5PSUFfQ0hFQ0sKKworLyogCisgKiBDcmF6eSBJbnRlbGlDb20vOCBib2FyZHMgc29tZXRpbWVzIGhhcyBzd2FwcGVkIENUUyAmIERTUiBzaWduYWxzLgorICogWW91IGNhbiBzbGlnaHRseSBzcGVlZCB1cCB0aGluZ3MgYnkgI3VuZGVmaW5nIHRoZSBmb2xsb3dpbmcgb3B0aW9uLAorICogaWYgeW91IGFyZSBSRUFMTFkgc3VyZSB0aGF0IHlvdXIgYm9hcmQgaXMgY29ycmVjdCBvbmUuIAorICovCisKKyNkZWZpbmUgUklTQ09NX0JSQUlOX0RBTUFHRURfQ1RTCisKKy8qIAorICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMuIEJ1dCBpZiB5b3UgbmVlZAorICogc29tZSBuaWNlIHJlcG9ydGluZyBpbiB5b3VyIHN5c2xvZywgeW91IGNhbiBkZWZpbmUgdGhlbSBhbHNvLgorICovCisjdW5kZWYgUkNfUkVQT1JUX0ZJRk8KKyN1bmRlZiBSQ19SRVBPUlRfT1ZFUlJVTgorCisKKyNkZWZpbmUgUklTQ09NX0xFR0FMX0ZMQUdTIFwKKwkoQVNZTkNfSFVQX05PVElGWSAgIHwgQVNZTkNfU0FLICAgICAgICAgIHwgQVNZTkNfU1BMSVRfVEVSTUlPUyAgIHwgXAorCSBBU1lOQ19TUERfSEkgICAgICAgfCBBU1lOQ19TUEVFRF9WSEkgICAgfCBBU1lOQ19TRVNTSU9OX0xPQ0tPVVQgfCBcCisJIEFTWU5DX1BHUlBfTE9DS09VVCB8IEFTWU5DX0NBTExPVVRfTk9IVVApCisKKyNkZWZpbmUgUlNfRVZFTlRfV1JJVEVfV0FLRVVQCTAKKworc3RhdGljIHN0cnVjdCByaXNjb21fYm9hcmQgKiBJUlFfdG9fYm9hcmRbMTZdOworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpyaXNjb21fZHJpdmVyOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKiB0bXBfYnVmOworc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBiYXVkX3RhYmxlW10gPSAgeworCTAsIDUwLCA3NSwgMTEwLCAxMzQsIDE1MCwgMjAwLCAzMDAsIDYwMCwgMTIwMCwgMTgwMCwgMjQwMCwgNDgwMCwKKwk5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCA3NjgwMCwgMCwgCit9OworCitzdGF0aWMgc3RydWN0IHJpc2NvbV9ib2FyZCByY19ib2FyZFtSQ19OQk9BUkRdID0gIHsKKwl7CisJCS5iYXNlCT0gUkNfSU9CQVNFMSwKKwl9LAorCXsKKwkJLmJhc2UJPSBSQ19JT0JBU0UyLAorCX0sCisJeworCQkuYmFzZQk9IFJDX0lPQkFTRTMsCisJfSwKKwl7CisJCS5iYXNlCT0gUkNfSU9CQVNFNCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByaXNjb21fcG9ydCByY19wb3J0W1JDX05CT0FSRCAqIFJDX05QT1JUXTsKKworLyogUklTQ29tLzggSS9PIHBvcnRzIGFkZHJlc3NlcyAod2l0aG91dCBhZGRyZXNzIHRyYW5zbGF0aW9uKSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJjX2lvcG9ydFtdID0gIHsKKyNpZiAxCQorCTB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsCisjZWxzZQkKKwkweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDEwLAorCTB4MTEsIDB4MTIsIDB4MTgsIDB4MjgsIDB4MzEsIDB4MzIsIDB4MzksIDB4M2EsIDB4NDAsIDB4NDEsIDB4NjEsIDB4NjIsCisJMHg2MywgMHg2NCwgMHg2YiwgMHg3MCwgMHg3MSwgMHg3OCwgMHg3YSwgMHg3YiwgMHg3ZiwgMHgxMDAsIDB4MTAxCisjZW5kaWYJCit9OworI2RlZmluZSBSQ19OSU9QT1JUCShzaXplb2YocmNfaW9wb3J0KSAvIHNpemVvZihyY19pb3BvcnRbMF0pKQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHJjX3BhcmFub2lhX2NoZWNrKHN0cnVjdCByaXNjb21fcG9ydCBjb25zdCAqIHBvcnQsCisJCQkJICAgIGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCit7CisjaWZkZWYgUklTQ09NX1BBUkFOT0lBX0NIRUNLCisJc3RhdGljIGNvbnN0IGNoYXIgYmFkbWFnaWNbXSA9IEtFUk5fSU5GTworCQkicmM6IFdhcm5pbmc6IGJhZCByaXNjb20gcG9ydCBtYWdpYyBudW1iZXIgZm9yIGRldmljZSAlcyBpbiAlc1xuIjsKKwlzdGF0aWMgY29uc3QgY2hhciBiYWRpbmZvW10gPSBLRVJOX0lORk8KKwkJInJjOiBXYXJuaW5nOiBudWxsIHJpc2NvbSBwb3J0IGZvciBkZXZpY2UgJXMgaW4gJXNcbiI7CisKKwlpZiAoIXBvcnQpIHsKKwkJcHJpbnRrKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHBvcnQtPm1hZ2ljICE9IFJJU0NPTThfTUFHSUMpIHsKKwkJcHJpbnRrKGJhZG1hZ2ljLCBuYW1lLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAKKyAqICBTZXJ2aWNlIGZ1bmN0aW9ucyBmb3IgUklTQ29tLzggZHJpdmVyLgorICogCisgKi8KKworLyogR2V0IGJvYXJkIG51bWJlciBmcm9tIHBvaW50ZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJvYXJkX05vIChzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnApCit7CisJcmV0dXJuIGJwIC0gcmNfYm9hcmQ7Cit9CisKKy8qIEdldCBwb3J0IG51bWJlciBmcm9tIHBvaW50ZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBvcnRfTm8gKHN0cnVjdCByaXNjb21fcG9ydCBjb25zdCAqIHBvcnQpCit7CisJcmV0dXJuIFJDX1BPUlQocG9ydCAtIHJjX3BvcnQpOyAKK30KKworLyogR2V0IHBvaW50ZXIgdG8gYm9hcmQgZnJvbSBwb2ludGVyIHRvIHBvcnQgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJpc2NvbV9ib2FyZCAqIHBvcnRfQm9hcmQoc3RydWN0IHJpc2NvbV9wb3J0IGNvbnN0ICogcG9ydCkKK3sKKwlyZXR1cm4gJnJjX2JvYXJkW1JDX0JPQVJEKHBvcnQgLSByY19wb3J0KV07Cit9CisKKy8qIElucHV0IEJ5dGUgZnJvbSBDTCBDRDE4MCByZWdpc3RlciAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJjX2luKHN0cnVjdCByaXNjb21fYm9hcmQgY29uc3QgKiBicCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXJldHVybiBpbmIoYnAtPmJhc2UgKyBSQ19UT19JU0EocmVnKSk7Cit9CisKKy8qIE91dHB1dCBCeXRlIHRvIENMIENEMTgwIHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmNfb3V0KHN0cnVjdCByaXNjb21fYm9hcmQgY29uc3QgKiBicCwgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJICB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlvdXRiKHZhbCwgYnAtPmJhc2UgKyBSQ19UT19JU0EocmVnKSk7Cit9CisKKy8qIFdhaXQgZm9yIENoYW5uZWwgQ29tbWFuZCBSZWdpc3RlciByZWFkeSAqLworc3RhdGljIGlubGluZSB2b2lkIHJjX3dhaXRfQ0NSKHN0cnVjdCByaXNjb21fYm9hcmQgY29uc3QgKiBicCkKK3sKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworCisJLyogRklYTUU6IG5lZWQgc29tZXRoaW5nIG1vcmUgZGVzY3JpcHRpdmUgdGhlbiAxMDAwMDAgOikgKi8KKwlmb3IgKGRlbGF5ID0gMTAwMDAwOyBkZWxheTsgZGVsYXktLSkgCisJCWlmICghcmNfaW4oYnAsIENEMTgwX0NDUikpCisJCQlyZXR1cm47CisJCisJcHJpbnRrKEtFUk5fSU5GTyAicmMlZDogVGltZW91dCB3YWl0aW5nIGZvciBDQ1IuXG4iLCBib2FyZF9ObyhicCkpOworfQorCisvKgorICogIFJJU0NvbS84IHByb2JlIGZ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCByY19yZXF1ZXN0X2lvX3JhbmdlKHN0cnVjdCByaXNjb21fYm9hcmQgKiBjb25zdCBicCkKK3sKKwlpbnQgaTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgUkNfTklPUE9SVDsgaSsrKSAgCisJCWlmICghcmVxdWVzdF9yZWdpb24oUkNfVE9fSVNBKHJjX2lvcG9ydFtpXSkgKyBicC0+YmFzZSwgMSwKKwkJCQkgICAiUklTQ29tLzgiKSkgIHsKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CisJCX0KKwlyZXR1cm4gMDsKK291dF9yZWxlYXNlOgorCXByaW50ayhLRVJOX0lORk8gInJjJWQ6IFNraXBwaW5nIHByb2JlIGF0IDB4JTAzeC4gSU8gYWRkcmVzcyBpbiB1c2UuXG4iLAorCQkJIGJvYXJkX05vKGJwKSwgYnAtPmJhc2UpOworCXdoaWxlKC0taSA+PSAwKQorCQlyZWxlYXNlX3JlZ2lvbihSQ19UT19JU0EocmNfaW9wb3J0W2ldKSArIGJwLT5iYXNlLCAxKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJjX3JlbGVhc2VfaW9fcmFuZ2Uoc3RydWN0IHJpc2NvbV9ib2FyZCAqIGNvbnN0IGJwKQoreworCWludCBpOworCQorCWZvciAoaSA9IDA7IGkgPCBSQ19OSU9QT1JUOyBpKyspICAKKwkJcmVsZWFzZV9yZWdpb24oUkNfVE9fSVNBKHJjX2lvcG9ydFtpXSkgKyBicC0+YmFzZSwgMSk7Cit9CisJCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGVuYWJsZWQgaW50ZXJydXB0cyAqLworc3RhdGljIGlubGluZSB2b2lkIHJjX2xvbmdfZGVsYXkodW5zaWduZWQgbG9uZyBkZWxheSkKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJCisJZm9yIChpID0gamlmZmllcyArIGRlbGF5OyB0aW1lX2FmdGVyKGksamlmZmllcyk7ICkgOworfQorCisvKiBSZXNldCBhbmQgc2V0dXAgQ0QxODAgY2hpcCAqLworc3RhdGljIHZvaWQgX19pbml0IHJjX2luaXRfQ0QxODAoc3RydWN0IHJpc2NvbV9ib2FyZCBjb25zdCAqIGJwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCXJjX291dChicCwgUkNfQ1RPVVQsIDApOyAgICAgCSAgICAgICAgICAgLyogQ2xlYXIgdGltZW91dCAgICAgICAgICAgICAqLworCXJjX3dhaXRfQ0NSKGJwKTsJCQkgICAvKiBXYWl0IGZvciBDQ1IgcmVhZHkgICAgICAgICovCisJcmNfb3V0KGJwLCBDRDE4MF9DQ1IsIENDUl9IQVJEUkVTRVQpOyAgICAgIC8qIFJlc2V0IENEMTgwIGNoaXAgICAgICAgICAgKi8KKwlzdGkoKTsKKwlyY19sb25nX2RlbGF5KEhaLzIwKTsgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgMC4wNSBzZWMgICAgICAgICAgICAqLworCWNsaSgpOworCXJjX291dChicCwgQ0QxODBfR0lWUiwgUkNfSUQpOyAgICAgICAgICAgICAvKiBTZXQgSUQgZm9yIHRoaXMgY2hpcCAgICAgICovCisJcmNfb3V0KGJwLCBDRDE4MF9HSUNSLCAwKTsgICAgICAgICAgICAgICAgIC8qIENsZWFyIGFsbCBiaXRzICAgICAgICAgICAgKi8KKwlyY19vdXQoYnAsIENEMTgwX1BJTFIxLCBSQ19BQ0tfTUlOVCk7ICAgICAgLyogUHJpbyBmb3IgbW9kZW0gaW50ciAgICAgICAqLworCXJjX291dChicCwgQ0QxODBfUElMUjIsIFJDX0FDS19USU5UKTsgICAgICAvKiBQcmlvIGZvciB0cmFuc21pdHRlciBpbnRyICovCisJcmNfb3V0KGJwLCBDRDE4MF9QSUxSMywgUkNfQUNLX1JJTlQpOyAgICAgIC8qIFByaW8gZm9yIHJlY2VpdmVyIGludHIgICAgKi8KKwkKKwkvKiBTZXR0aW5nIHVwIHByZXNjYWxlci4gV2UgbmVlZCA0IHRpY2tzIHBlciAxIG1zICovCisJcmNfb3V0KGJwLCBDRDE4MF9QUFJILCAoUkNfT1NDRlJFUS8oMTAwMDAwMC9SSVNDT01fVFBTKSkgPj4gOCk7CisJcmNfb3V0KGJwLCBDRDE4MF9QUFJMLCAoUkNfT1NDRlJFUS8oMTAwMDAwMC9SSVNDT01fVFBTKSkgJiAweGZmKTsKKwkKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyogTWFpbiBwcm9iaW5nIHJvdXRpbmUsIGFsc28gc2V0cyBpcnEuICovCitzdGF0aWMgaW50IF9faW5pdCByY19wcm9iZShzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCkKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDEsIHZhbDI7CisJaW50IGlycXMgPSAwOworCWludCByZXRyaWVzOworCQorCWJwLT5pcnEgPSAwOworCisJaWYgKHJjX3JlcXVlc3RfaW9fcmFuZ2UoYnApKQorCQlyZXR1cm4gMTsKKwkKKwkvKiBBcmUgdGhlIEkvTyBwb3J0cyBoZXJlID8gKi8KKwlyY19vdXQoYnAsIENEMTgwX1BQUkwsIDB4NWEpOworCW91dGIoMHhmZiwgMHg4MCk7CisJdmFsMSA9IHJjX2luKGJwLCBDRDE4MF9QUFJMKTsKKwlyY19vdXQoYnAsIENEMTgwX1BQUkwsIDB4YTUpOworCW91dGIoMHgwMCwgMHg4MCk7CisJdmFsMiA9IHJjX2luKGJwLCBDRDE4MF9QUFJMKTsKKwkKKwlpZiAoKHZhbDEgIT0gMHg1YSkgfHwgKHZhbDIgIT0gMHhhNSkpICB7CisJCXByaW50ayhLRVJOX0VSUiAicmMlZDogUklTQ29tLzggQm9hcmQgYXQgMHglMDN4IG5vdCBmb3VuZC5cbiIsCisJCSAgICAgICBib2FyZF9ObyhicCksIGJwLT5iYXNlKTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisJCisJLyogSXQncyB0aW1lIHRvIGZpbmQgSVJRIGZvciB0aGlzIGJvYXJkICovCisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDUgJiYgaXJxcyA8PSAwOyByZXRyaWVzKyspICB7CisJCWlycXMgPSBwcm9iZV9pcnFfb24oKTsKKwkJcmNfaW5pdF9DRDE4MChicCk7CSAgICAgICAJCS8qIFJlc2V0IENEMTgwIGNoaXAgICAgICAgKi8KKwkJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIDIpOyAgICAgICAgICAgICAgIC8qIFNlbGVjdCBwb3J0IDIgICAgICAgICAgKi8KKwkJcmNfd2FpdF9DQ1IoYnApOworCQlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX1RYRU4pOyAgICAgICAgLyogRW5hYmxlIHRyYW5zbWl0dGVyICAgICAqLworCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgSUVSX1RYUkRZKTsgICAgICAgLyogRW5hYmxlIHR4IGVtcHR5IGludHIgICAqLworCQlyY19sb25nX2RlbGF5KEhaLzIwKTsJICAgICAgIAkJCisJCWlycXMgPSBwcm9iZV9pcnFfb2ZmKGlycXMpOworCQl2YWwxID0gcmNfaW4oYnAsIFJDX0JTUik7CQkvKiBHZXQgQm9hcmQgU3RhdHVzIHJlZyAgICovCisJCXZhbDIgPSByY19pbihicCwgUkNfQUNLX1RJTlQpOyAgICAgICAgICAvKiBBQ0sgaW50ZXJydXB0ICAgICAgICAgICovCisJCXJjX2luaXRfQ0QxODAoYnApOwkgICAgICAgCQkvKiBSZXNldCBDRDE4MCBhZ2FpbiAgICAgICovCisJCisJCWlmICgodmFsMSAmIFJDX0JTUl9USU5UKSB8fCAodmFsMiAhPSAoUkNfSUQgfCBHSVZSX0lUX1RYKSkpICB7CisJCQlwcmludGsoS0VSTl9FUlIgInJjJWQ6IFJJU0NvbS84IEJvYXJkIGF0IDB4JTAzeCBub3QgIgorCQkJCQkiZm91bmQuXG4iLCBib2FyZF9ObyhicCksIGJwLT5iYXNlKTsKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CisJCX0KKwl9CisJCisJaWYgKGlycXMgPD0gMCkgIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYyVkOiBDYW4ndCBmaW5kIElSUSBmb3IgUklTQ29tLzggYm9hcmQgIgorCQkJCSJhdCAweCUwM3guXG4iLCBib2FyZF9ObyhicCksIGJwLT5iYXNlKTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisJYnAtPmlycSA9IGlycXM7CisJYnAtPmZsYWdzIHw9IFJDX0JPQVJEX1BSRVNFTlQ7CisJCisJcHJpbnRrKEtFUk5fSU5GTyAicmMlZDogUklTQ29tLzggUmV2LiAlYyBib2FyZCBkZXRlY3RlZCBhdCAiCisJCQkgIjB4JTAzeCwgSVJRICVkLlxuIiwKKwkgICAgICAgYm9hcmRfTm8oYnApLAorCSAgICAgICAocmNfaW4oYnAsIENEMTgwX0dGUkNSKSAmIDB4MGYpICsgJ0EnLCAgIC8qIEJvYXJkIHJldmlzaW9uICovCisJICAgICAgIGJwLT5iYXNlLCBicC0+aXJxKTsKKwkKKwlyZXR1cm4gMDsKK291dF9yZWxlYXNlOgorCXJjX3JlbGVhc2VfaW9fcmFuZ2UoYnApOworCXJldHVybiAxOworfQorCisvKiAKKyAqIAorICogIEludGVycnVwdCBwcm9jZXNzaW5nIHJvdXRpbmVzLgorICogCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHJjX21hcmtfZXZlbnQoc3RydWN0IHJpc2NvbV9wb3J0ICogcG9ydCwgaW50IGV2ZW50KQoreworCXNldF9iaXQoZXZlbnQsICZwb3J0LT5ldmVudCk7CisJc2NoZWR1bGVfd29yaygmcG9ydC0+dHF1ZXVlKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmlzY29tX3BvcnQgKiByY19nZXRfcG9ydChzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnAsCisJCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICogd2hhdCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWw7CisJc3RydWN0IHJpc2NvbV9wb3J0ICogcG9ydDsKKwkKKwljaGFubmVsID0gcmNfaW4oYnAsIENEMTgwX0dJQ1IpID4+IEdJQ1JfQ0hBTl9PRkY7CisJaWYgKGNoYW5uZWwgPCBDRDE4MF9OQ0gpICB7CisJCXBvcnQgPSAmcmNfcG9ydFtib2FyZF9ObyhicCkgKiBSQ19OUE9SVCArIGNoYW5uZWxdOworCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgIHsKKwkJCXJldHVybiBwb3J0OworCQl9CisJfQorCXByaW50ayhLRVJOX0VSUiAicmMlZDogJXMgaW50ZXJydXB0IGZyb20gaW52YWxpZCBwb3J0ICVkXG4iLCAKKwkgICAgICAgYm9hcmRfTm8oYnApLCB3aGF0LCBjaGFubmVsKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJjX3JlY2VpdmVfZXhjKHN0cnVjdCByaXNjb21fYm9hcmQgY29uc3QgKiBicCkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIGNoOworCQorCWlmICghKHBvcnQgPSByY19nZXRfcG9ydChicCwgIlJlY2VpdmUiKSkpCisJCXJldHVybjsKKworCXR0eSA9IHBvcnQtPnR0eTsKKwlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpICB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInJjJWQ6IHBvcnQgJWQ6IFdvcmtpbmcgYXJvdW5kIGZsaXAgIgorCQkJCSAgICAiYnVmZmVyIG92ZXJmbG93LlxuIiwKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSk7CisJCXJldHVybjsKKwl9CisJCisjaWZkZWYgUkNfUkVQT1JUX09WRVJSVU4JCisJc3RhdHVzID0gcmNfaW4oYnAsIENEMTgwX1JDU1IpOworCWlmIChzdGF0dXMgJiBSQ1NSX09FKSAgeworCQlwb3J0LT5vdmVycnVuKys7CisjaWYgMAkJCisJCXByaW50ayhLRVJOX0VSUiAicmMlZDogcG9ydCAlZDogT3ZlcnJ1bi4gVG90YWwgJWxkIG92ZXJydW5zXG4iLCAKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSwgcG9ydC0+b3ZlcnJ1bik7CisjZW5kaWYJCQorCX0KKwlzdGF0dXMgJj0gcG9ydC0+bWFya19tYXNrOworI2Vsc2UJCisJc3RhdHVzID0gcmNfaW4oYnAsIENEMTgwX1JDU1IpICYgcG9ydC0+bWFya19tYXNrOworI2VuZGlmCQorCWNoID0gcmNfaW4oYnAsIENEMTgwX1JEUik7CisJaWYgKCFzdGF0dXMpICB7CisJCXJldHVybjsKKwl9CisJaWYgKHN0YXR1cyAmIFJDU1JfVE9VVCkgIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicmMlZDogcG9ydCAlZDogUmVjZWl2ZXIgdGltZW91dC4gIgorCQkJCSAgICAiSGFyZHdhcmUgcHJvYmxlbXMgP1xuIiwgCisJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCkpOworCQlyZXR1cm47CisJCQorCX0gZWxzZSBpZiAoc3RhdHVzICYgUkNTUl9CUkVBSykgIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmMlZDogcG9ydCAlZDogSGFuZGxpbmcgYnJlYWsuLi5cbiIsCisJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCkpOworCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0JSRUFLOworCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQlkb19TQUsodHR5KTsKKwkJCisJfSBlbHNlIGlmIChzdGF0dXMgJiBSQ1NSX1BFKSAKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9QQVJJVFk7CisJCisJZWxzZSBpZiAoc3RhdHVzICYgUkNTUl9GRSkgCisJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfRlJBTUU7CisJCisgICAgICAgIGVsc2UgaWYgKHN0YXR1cyAmIFJDU1JfT0UpCisJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfT1ZFUlJVTjsKKwkKKwllbHNlCisJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSAwOworCQorCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBjaDsKKwl0dHktPmZsaXAuY291bnQrKzsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJjX3JlY2VpdmUoc3RydWN0IHJpc2NvbV9ib2FyZCBjb25zdCAqIGJwKQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGNoYXIgY291bnQ7CisJCisJaWYgKCEocG9ydCA9IHJjX2dldF9wb3J0KGJwLCAiUmVjZWl2ZSIpKSkKKwkJcmV0dXJuOworCQorCXR0eSA9IHBvcnQtPnR0eTsKKwkKKwljb3VudCA9IHJjX2luKGJwLCBDRDE4MF9SRENSKTsKKwkKKyNpZmRlZiBSQ19SRVBPUlRfRklGTworCXBvcnQtPmhpdHNbY291bnQgPiA4ID8gOSA6IGNvdW50XSsrOworI2VuZGlmCQorCQorCXdoaWxlIChjb3VudC0tKSAgeworCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpICB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYyVkOiBwb3J0ICVkOiBXb3JraW5nIGFyb3VuZCAiCisJCQkJCSAgICAiZmxpcCBidWZmZXIgb3ZlcmZsb3cuXG4iLAorCQkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSk7CisJCQlicmVhazsKKwkJfQorCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gcmNfaW4oYnAsIENEMTgwX1JEUik7CisJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSAwOworCQl0dHktPmZsaXAuY291bnQrKzsKKwl9CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByY190cmFuc21pdChzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnApCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgY2hhciBjb3VudDsKKwkKKwkKKwlpZiAoIShwb3J0ID0gcmNfZ2V0X3BvcnQoYnAsICJUcmFuc21pdCIpKSkKKwkJcmV0dXJuOworCQorCXR0eSA9IHBvcnQtPnR0eTsKKwkKKwlpZiAocG9ydC0+SUVSICYgSUVSX1RYRU1QVFkpICB7CisJCS8qIEZJRk8gZHJhaW5lZCAqLworCQlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJCXBvcnQtPklFUiAmPSB+SUVSX1RYRU1QVFk7CisJCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCQlyZXR1cm47CisJfQorCQorCWlmICgocG9ydC0+eG1pdF9jbnQgPD0gMCAmJiAhcG9ydC0+YnJlYWtfbGVuZ3RoKQorCSAgICB8fCB0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkKSAgeworCQlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJCXBvcnQtPklFUiAmPSB+SUVSX1RYUkRZOworCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAocG9ydC0+YnJlYWtfbGVuZ3RoKSAgeworCQlpZiAocG9ydC0+YnJlYWtfbGVuZ3RoID4gMCkgIHsKKwkJCWlmIChwb3J0LT5DT1IyICYgQ09SMl9FVEMpICB7CisJCQkJcmNfb3V0KGJwLCBDRDE4MF9URFIsIENEMTgwX0NfRVNDKTsKKwkJCQlyY19vdXQoYnAsIENEMTgwX1REUiwgQ0QxODBfQ19TQlJLKTsKKwkJCQlwb3J0LT5DT1IyICY9IH5DT1IyX0VUQzsKKwkJCX0KKwkJCWNvdW50ID0gbWluX3QoaW50LCBwb3J0LT5icmVha19sZW5ndGgsIDB4ZmYpOworCQkJcmNfb3V0KGJwLCBDRDE4MF9URFIsIENEMTgwX0NfRVNDKTsKKwkJCXJjX291dChicCwgQ0QxODBfVERSLCBDRDE4MF9DX0RFTEFZKTsKKwkJCXJjX291dChicCwgQ0QxODBfVERSLCBjb3VudCk7CisJCQlpZiAoIShwb3J0LT5icmVha19sZW5ndGggLT0gY291bnQpKQorCQkJCXBvcnQtPmJyZWFrX2xlbmd0aC0tOworCQl9IGVsc2UgIHsKKwkJCXJjX291dChicCwgQ0QxODBfVERSLCBDRDE4MF9DX0VTQyk7CisJCQlyY19vdXQoYnAsIENEMTgwX1REUiwgQ0QxODBfQ19FQlJLKTsKKwkJCXJjX291dChicCwgQ0QxODBfQ09SMiwgcG9ydC0+Q09SMik7CisJCQlyY193YWl0X0NDUihicCk7CisJCQlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX0NPUkNIRzIpOworCQkJcG9ydC0+YnJlYWtfbGVuZ3RoID0gMDsKKwkJfQorCQlyZXR1cm47CisJfQorCQorCWNvdW50ID0gQ0QxODBfTkZJRk87CisJZG8geworCQlyY19vdXQoYnAsIENEMTgwX1REUiwgcG9ydC0+eG1pdF9idWZbcG9ydC0+eG1pdF90YWlsKytdKTsKKwkJcG9ydC0+eG1pdF90YWlsID0gcG9ydC0+eG1pdF90YWlsICYgKFNFUklBTF9YTUlUX1NJWkUtMSk7CisJCWlmICgtLXBvcnQtPnhtaXRfY250IDw9IDApCisJCQlicmVhazsKKwl9IHdoaWxlICgtLWNvdW50ID4gMCk7CisJCisJaWYgKHBvcnQtPnhtaXRfY250IDw9IDApICB7CisJCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwkJcG9ydC0+SUVSICY9IH5JRVJfVFhSRFk7CisJCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCX0KKwlpZiAocG9ydC0+eG1pdF9jbnQgPD0gcG9ydC0+d2FrZXVwX2NoYXJzKQorCQlyY19tYXJrX2V2ZW50KHBvcnQsIFJTX0VWRU5UX1dSSVRFX1dBS0VVUCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByY19jaGVja19tb2RlbShzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnApCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgY2hhciBtY3I7CisJCisJaWYgKCEocG9ydCA9IHJjX2dldF9wb3J0KGJwLCAiTW9kZW0iKSkpCisJCXJldHVybjsKKwkKKwl0dHkgPSBwb3J0LT50dHk7CisJCisJbWNyID0gcmNfaW4oYnAsIENEMTgwX01DUik7CisJaWYgKG1jciAmIE1DUl9DRENIRykgIHsKKwkJaWYgKHJjX2luKGJwLCBDRDE4MF9NU1ZSKSAmIE1TVlJfQ0QpIAorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOworCQllbHNlCisJCQlzY2hlZHVsZV93b3JrKCZwb3J0LT50cXVldWVfaGFuZ3VwKTsKKwl9CisJCisjaWZkZWYgUklTQ09NX0JSQUlOX0RBTUFHRURfQ1RTCisJaWYgKG1jciAmIE1DUl9DVFNDSEcpICB7CisJCWlmIChyY19pbihicCwgQ0QxODBfTVNWUikgJiBNU1ZSX0NUUykgIHsKKwkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCQlwb3J0LT5JRVIgfD0gSUVSX1RYUkRZOworCQkJaWYgKHBvcnQtPnhtaXRfY250IDw9IHBvcnQtPndha2V1cF9jaGFycykKKwkJCQlyY19tYXJrX2V2ZW50KHBvcnQsIFJTX0VWRU5UX1dSSVRFX1dBS0VVUCk7CisJCX0gZWxzZSAgeworCQkJdHR5LT5od19zdG9wcGVkID0gMTsKKwkJCXBvcnQtPklFUiAmPSB+SUVSX1RYUkRZOworCQl9CisJCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCX0KKwlpZiAobWNyICYgTUNSX0RTUkNIRykgIHsKKwkJaWYgKHJjX2luKGJwLCBDRDE4MF9NU1ZSKSAmIE1TVlJfRFNSKSAgeworCQkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJCXBvcnQtPklFUiB8PSBJRVJfVFhSRFk7CisJCQlpZiAocG9ydC0+eG1pdF9jbnQgPD0gcG9ydC0+d2FrZXVwX2NoYXJzKQorCQkJCXJjX21hcmtfZXZlbnQocG9ydCwgUlNfRVZFTlRfV1JJVEVfV0FLRVVQKTsKKwkJfSBlbHNlICB7CisJCQl0dHktPmh3X3N0b3BwZWQgPSAxOworCQkJcG9ydC0+SUVSICY9IH5JRVJfVFhSRFk7CisJCX0KKwkJcmNfb3V0KGJwLCBDRDE4MF9JRVIsIHBvcnQtPklFUik7CisJfQorI2VuZGlmIC8qIFJJU0NPTV9CUkFJTl9EQU1BR0VEX0NUUyAqLworCQorCS8qIENsZWFyIGNoYW5nZSBiaXRzICovCisJcmNfb3V0KGJwLCBDRDE4MF9NQ1IsIDApOworfQorCisvKiBUaGUgbWFpbiBpbnRlcnJ1cHQgcHJvY2Vzc2luZyByb3V0aW5lICovCitzdGF0aWMgaXJxcmV0dXJuX3QgcmNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIGFjazsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicDsKKwl1bnNpZ25lZCBsb25nIGxvb3AgPSAwOworCWludCBoYW5kbGVkID0gMDsKKworCWJwID0gSVJRX3RvX2JvYXJkW2lycV07CisJCisJaWYgKCFicCB8fCAhKGJwLT5mbGFncyAmIFJDX0JPQVJEX0FDVElWRSkpICB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJCisJd2hpbGUgKCgrK2xvb3AgPCAxNikgJiYgKChzdGF0dXMgPSB+KHJjX2luKGJwLCBSQ19CU1IpKSkgJgorCQkJCSAoUkNfQlNSX1RPVVQgfCBSQ19CU1JfVElOVCB8CisJCQkJICBSQ19CU1JfTUlOVCB8IFJDX0JTUl9SSU5UKSkpIHsKKwkJaGFuZGxlZCA9IDE7CisJCWlmIChzdGF0dXMgJiBSQ19CU1JfVE9VVCkgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYyVkOiBHb3QgdGltZW91dC4gSGFyZHdhcmUgIgorCQkJCQkgICAgImVycm9yP1xuIiwgYm9hcmRfTm8oYnApKTsKKwkJCisJCWVsc2UgaWYgKHN0YXR1cyAmIFJDX0JTUl9SSU5UKSB7CisJCQlhY2sgPSByY19pbihicCwgUkNfQUNLX1JJTlQpOworCQkKKwkJCWlmIChhY2sgPT0gKFJDX0lEIHwgR0lWUl9JVF9SQ1YpKQorCQkJCXJjX3JlY2VpdmUoYnApOworCQkJZWxzZSBpZiAoYWNrID09IChSQ19JRCB8IEdJVlJfSVRfUkVYQykpCisJCQkJcmNfcmVjZWl2ZV9leGMoYnApOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInJjJWQ6IEJhZCByZWNlaXZlIGFjayAiCisJCQkJCQkgICAgIjB4JTAyeC5cbiIsCisJCQkJICAgICAgIGJvYXJkX05vKGJwKSwgYWNrKTsKKwkJCisJCX0gZWxzZSBpZiAoc3RhdHVzICYgUkNfQlNSX1RJTlQpIHsKKwkJCWFjayA9IHJjX2luKGJwLCBSQ19BQ0tfVElOVCk7CisJCQorCQkJaWYgKGFjayA9PSAoUkNfSUQgfCBHSVZSX0lUX1RYKSkKKwkJCQlyY190cmFuc21pdChicCk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicmMlZDogQmFkIHRyYW5zbWl0IGFjayAiCisJCQkJCQkgICAgIjB4JTAyeC5cbiIsCisJCQkJICAgICAgIGJvYXJkX05vKGJwKSwgYWNrKTsKKwkJCisJCX0gZWxzZSAvKiBpZiAoc3RhdHVzICYgUkNfQlNSX01JTlQpICovIHsKKwkJCWFjayA9IHJjX2luKGJwLCBSQ19BQ0tfTUlOVCk7CisJCQorCQkJaWYgKGFjayA9PSAoUkNfSUQgfCBHSVZSX0lUX01PREVNKSkgCisJCQkJcmNfY2hlY2tfbW9kZW0oYnApOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInJjJWQ6IEJhZCBtb2RlbSBhY2sgIgorCQkJCQkJICAgICIweCUwMnguXG4iLAorCQkJCSAgICAgICBib2FyZF9ObyhicCksIGFjayk7CisJCQorCQl9IAorCisJCXJjX291dChicCwgQ0QxODBfRU9JUiwgMCk7ICAgLyogTWFyayBlbmQgb2YgaW50ZXJydXB0ICovCisJCXJjX291dChicCwgUkNfQ1RPVVQsIDApOyAgICAgLyogQ2xlYXIgdGltZW91dCBmbGFnICAgICovCisJfQorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKgorICogIFJvdXRpbmVzIGZvciBvcGVuICYgY2xvc2UgcHJvY2Vzc2luZy4KKyAqLworCisvKiBDYWxsZWQgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzICovCitzdGF0aWMgaW5saW5lIGludCByY19zZXR1cF9ib2FyZChzdHJ1Y3QgcmlzY29tX2JvYXJkICogYnApCit7CisJaW50IGVycm9yOworCisJaWYgKGJwLT5mbGFncyAmIFJDX0JPQVJEX0FDVElWRSkgCisJCXJldHVybiAwOworCQorCWVycm9yID0gcmVxdWVzdF9pcnEoYnAtPmlycSwgcmNfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsCisJCQkgICAgIlJJU0NvbS84IiwgTlVMTCk7CisJaWYgKGVycm9yKSAKKwkJcmV0dXJuIGVycm9yOworCQorCXJjX291dChicCwgUkNfQ1RPVVQsIDApOyAgICAgICAJCS8qIEp1c3QgaW4gY2FzZSAgICAgICAgICovCisJYnAtPkRUUiA9IH4wOworCXJjX291dChicCwgUkNfRFRSLCBicC0+RFRSKTsJICAgICAgICAvKiBEcm9wIERUUiBvbiBhbGwgcG9ydHMgKi8KKwkKKwlJUlFfdG9fYm9hcmRbYnAtPmlycV0gPSBicDsKKwlicC0+ZmxhZ3MgfD0gUkNfQk9BUkRfQUNUSVZFOworCQorCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmNfc2h1dGRvd25fYm9hcmQoc3RydWN0IHJpc2NvbV9ib2FyZCAqYnApCit7CisJaWYgKCEoYnAtPmZsYWdzICYgUkNfQk9BUkRfQUNUSVZFKSkKKwkJcmV0dXJuOworCQorCWJwLT5mbGFncyAmPSB+UkNfQk9BUkRfQUNUSVZFOworCQorCWZyZWVfaXJxKGJwLT5pcnEsIE5VTEwpOworCUlSUV90b19ib2FyZFticC0+aXJxXSA9IE5VTEw7CisJCisJYnAtPkRUUiA9IH4wOworCXJjX291dChicCwgUkNfRFRSLCBicC0+RFRSKTsJICAgICAgIC8qIERyb3AgRFRSIG9uIGFsbCBwb3J0cyAqLworCQorfQorCisvKgorICogU2V0dGluZyB1cCBwb3J0IGNoYXJhY3RlcmlzdGljcy4gCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGRpc2FibGVkIGludGVycnVwdHMKKyAqLworc3RhdGljIHZvaWQgcmNfY2hhbmdlX3NwZWVkKHN0cnVjdCByaXNjb21fYm9hcmQgKmJwLCBzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBsb25nIGJhdWQ7CisJbG9uZyB0bXA7CisJdW5zaWduZWQgY2hhciBjb3IxID0gMCwgY29yMyA9IDA7CisJdW5zaWduZWQgY2hhciBtY29yMSA9IDAsIG1jb3IyID0gMDsKKwkKKwlpZiAoISh0dHkgPSBwb3J0LT50dHkpIHx8ICF0dHktPnRlcm1pb3MpCisJCXJldHVybjsKKworCXBvcnQtPklFUiAgPSAwOworCXBvcnQtPkNPUjIgPSAwOworCXBvcnQtPk1TVlIgPSBNU1ZSX1JUUzsKKwkKKwliYXVkID0gQ19CQVVEKHR0eSk7CisJCisJaWYgKGJhdWQgJiBDQkFVREVYKSB7CisJCWJhdWQgJj0gfkNCQVVERVg7CisJCWlmIChiYXVkIDwgMSB8fCBiYXVkID4gMikgCisJCQlwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNCQVVERVg7CisJCWVsc2UKKwkJCWJhdWQgKz0gMTU7CisJfQorCWlmIChiYXVkID09IDE1KSAgeworCQlpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKKwkJCWJhdWQgKys7CisJCWlmICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKKwkJCWJhdWQgKz0gMjsKKwl9CisJCisJLyogU2VsZWN0IHBvcnQgb24gdGhlIGJvYXJkICovCisJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQorCWlmICghYmF1ZF90YWJsZVtiYXVkXSkgIHsKKwkJLyogRHJvcCBEVFIgJiBleGl0ICovCisJCWJwLT5EVFIgfD0gKDF1IDw8IHBvcnRfTm8ocG9ydCkpOworCQlyY19vdXQoYnAsIFJDX0RUUiwgYnAtPkRUUik7CisJCXJldHVybjsKKwl9IGVsc2UgIHsKKwkJLyogU2V0IERUUiBvbiAqLworCQlicC0+RFRSICY9IH4oMXUgPDwgcG9ydF9Obyhwb3J0KSk7CisJCXJjX291dChicCwgUkNfRFRSLCBicC0+RFRSKTsKKwl9CisJCisJLyoKKwkgKiBOb3cgd2UgbXVzdCBjYWxjdWxhdGUgc29tZSBzcGVlZCBkZXBlbmRlZCB0aGluZ3MgCisJICovCisJCisJLyogU2V0IGJhdWQgcmF0ZSBmb3IgcG9ydCAqLworCXRtcCA9ICgoKFJDX09TQ0ZSRVEgKyBiYXVkX3RhYmxlW2JhdWRdLzIpIC8gYmF1ZF90YWJsZVtiYXVkXSArCisJCUNEMTgwX1RQQy8yKSAvIENEMTgwX1RQQyk7CisKKwlyY19vdXQoYnAsIENEMTgwX1JCUFJILCAodG1wID4+IDgpICYgMHhmZik7IAorCXJjX291dChicCwgQ0QxODBfVEJQUkgsICh0bXAgPj4gOCkgJiAweGZmKTsgCisJcmNfb3V0KGJwLCBDRDE4MF9SQlBSTCwgdG1wICYgMHhmZik7IAorCXJjX291dChicCwgQ0QxODBfVEJQUkwsIHRtcCAmIDB4ZmYpOworCQorCWJhdWQgPSAoYmF1ZF90YWJsZVtiYXVkXSArIDUpIC8gMTA7ICAgLyogRXN0aW1hdGVkIENQUyAqLworCQorCS8qIFR3byB0aW1lciB0aWNrcyBzZWVtcyBlbm91Z2ggdG8gd2FrZXVwIHNvbWV0aGluZyBsaWtlIFNMSVAgZHJpdmVyICovCisJdG1wID0gKChiYXVkICsgSFovMikgLyBIWikgKiAyIC0gQ0QxODBfTkZJRk87CQkKKwlwb3J0LT53YWtldXBfY2hhcnMgPSAodG1wIDwgMCkgPyAwIDogKCh0bXAgPj0gU0VSSUFMX1hNSVRfU0laRSkgPworCQkJCQkgICAgICBTRVJJQUxfWE1JVF9TSVpFIC0gMSA6IHRtcCk7CisJCisJLyogUmVjZWl2ZXIgdGltZW91dCB3aWxsIGJlIHRyYW5zbWlzc2lvbiB0aW1lIGZvciAxLjUgY2hhcnMgKi8KKwl0bXAgPSAoUklTQ09NX1RQUyArIFJJU0NPTV9UUFMvMiArIGJhdWQvMikgLyBiYXVkOworCXRtcCA9ICh0bXAgPiAweGZmKSA/IDB4ZmYgOiB0bXA7CisJcmNfb3V0KGJwLCBDRDE4MF9SVFBSLCB0bXApOworCQorCXN3aXRjaCAoQ19DU0laRSh0dHkpKSAgeworCSBjYXNlIENTNToKKwkJY29yMSB8PSBDT1IxXzVCSVRTOworCQlicmVhazsKKwkgY2FzZSBDUzY6CisJCWNvcjEgfD0gQ09SMV82QklUUzsKKwkJYnJlYWs7CisJIGNhc2UgQ1M3OgorCQljb3IxIHw9IENPUjFfN0JJVFM7CisJCWJyZWFrOworCSBjYXNlIENTODoKKwkJY29yMSB8PSBDT1IxXzhCSVRTOworCQlicmVhazsKKwl9CisJCisJaWYgKENfQ1NUT1BCKHR0eSkpIAorCQljb3IxIHw9IENPUjFfMlNCOworCQorCWNvcjEgfD0gQ09SMV9JR05PUkU7CisJaWYgKENfUEFSRU5CKHR0eSkpICB7CisJCWNvcjEgfD0gQ09SMV9OT1JNUEFSOworCQlpZiAoQ19QQVJPREQodHR5KSkgCisJCQljb3IxIHw9IENPUjFfT0REUDsKKwkJaWYgKElfSU5QQ0sodHR5KSkgCisJCQljb3IxICY9IH5DT1IxX0lHTk9SRTsKKwl9CisJLyogU2V0IG1hcmtpbmcgb2Ygc29tZSBlcnJvcnMgKi8KKwlwb3J0LT5tYXJrX21hc2sgPSBSQ1NSX09FIHwgUkNTUl9UT1VUOworCWlmIChJX0lOUENLKHR0eSkpIAorCQlwb3J0LT5tYXJrX21hc2sgfD0gUkNTUl9GRSB8IFJDU1JfUEU7CisJaWYgKElfQlJLSU5UKHR0eSkgfHwgSV9QQVJNUksodHR5KSkgCisJCXBvcnQtPm1hcmtfbWFzayB8PSBSQ1NSX0JSRUFLOworCWlmIChJX0lHTlBBUih0dHkpKSAKKwkJcG9ydC0+bWFya19tYXNrICY9IH4oUkNTUl9GRSB8IFJDU1JfUEUpOworCWlmIChJX0lHTkJSSyh0dHkpKSAgeworCQlwb3J0LT5tYXJrX21hc2sgJj0gflJDU1JfQlJFQUs7CisJCWlmIChJX0lHTlBBUih0dHkpKSAKKwkJCS8qIFJlYWwgcmF3IG1vZGUuIElnbm9yZSBhbGwgKi8KKwkJCXBvcnQtPm1hcmtfbWFzayAmPSB+UkNTUl9PRTsKKwl9CisJLyogRW5hYmxlIEhhcmR3YXJlIEZsb3cgQ29udHJvbCAqLworCWlmIChDX0NSVFNDVFModHR5KSkgIHsKKyNpZmRlZiBSSVNDT01fQlJBSU5fREFNQUdFRF9DVFMKKwkJcG9ydC0+SUVSIHw9IElFUl9EU1IgfCBJRVJfQ1RTOworCQltY29yMSB8PSBNQ09SMV9EU1JaRCB8IE1DT1IxX0NUU1pEOworCQltY29yMiB8PSBNQ09SMl9EU1JPRCB8IE1DT1IyX0NUU09EOworCQl0dHktPmh3X3N0b3BwZWQgPSAhKHJjX2luKGJwLCBDRDE4MF9NU1ZSKSAmIChNU1ZSX0NUU3xNU1ZSX0RTUikpOworI2Vsc2UKKwkJcG9ydC0+Q09SMiB8PSBDT1IyX0NUU0FFOworI2VuZGlmCisJfQorCS8qIEVuYWJsZSBTb2Z0d2FyZSBGbG93IENvbnRyb2wuIEZJWE1FOiBJJ20gbm90IHN1cmUgYWJvdXQgdGhpcyAqLworCS8qIFNvbWUgcGVvcGxlIHJlcG9ydGVkIHRoYXQgaXQgd29ya3MsIGJ1dCBJIHN0aWxsIGRvdWJ0ICovCisJaWYgKElfSVhPTih0dHkpKSAgeworCQlwb3J0LT5DT1IyIHw9IENPUjJfVFhJQkU7CisJCWNvcjMgfD0gKENPUjNfRkNUIHwgQ09SM19TQ0RFKTsKKwkJaWYgKElfSVhBTlkodHR5KSkKKwkJCXBvcnQtPkNPUjIgfD0gQ09SMl9JWE07CisJCXJjX291dChicCwgQ0QxODBfU0NIUjEsIFNUQVJUX0NIQVIodHR5KSk7CisJCXJjX291dChicCwgQ0QxODBfU0NIUjIsIFNUT1BfQ0hBUih0dHkpKTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9TQ0hSMywgU1RBUlRfQ0hBUih0dHkpKTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9TQ0hSNCwgU1RPUF9DSEFSKHR0eSkpOworCX0KKwlpZiAoIUNfQ0xPQ0FMKHR0eSkpICB7CisJCS8qIEVuYWJsZSBDRCBjaGVjayAqLworCQlwb3J0LT5JRVIgfD0gSUVSX0NEOworCQltY29yMSB8PSBNQ09SMV9DRFpEOworCQltY29yMiB8PSBNQ09SMl9DRE9EOworCX0KKwkKKwlpZiAoQ19DUkVBRCh0dHkpKSAKKwkJLyogRW5hYmxlIHJlY2VpdmVyICovCisJCXBvcnQtPklFUiB8PSBJRVJfUlhEOworCQorCS8qIFNldCBpbnB1dCBGSUZPIHNpemUgKDEtOCBieXRlcykgKi8KKwljb3IzIHw9IFJJU0NPTV9SWEZJRk87IAorCS8qIFNldHRpbmcgdXAgQ0QxODAgY2hhbm5lbCByZWdpc3RlcnMgKi8KKwlyY19vdXQoYnAsIENEMTgwX0NPUjEsIGNvcjEpOworCXJjX291dChicCwgQ0QxODBfQ09SMiwgcG9ydC0+Q09SMik7CisJcmNfb3V0KGJwLCBDRDE4MF9DT1IzLCBjb3IzKTsKKwkvKiBNYWtlIENEMTgwIGtub3cgYWJvdXQgcmVnaXN0ZXJzIGNoYW5nZSAqLworCXJjX3dhaXRfQ0NSKGJwKTsKKwlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX0NPUkNIRzEgfCBDQ1JfQ09SQ0hHMiB8IENDUl9DT1JDSEczKTsKKwkvKiBTZXR0aW5nIHVwIG1vZGVtIG9wdGlvbiByZWdpc3RlcnMgKi8KKwlyY19vdXQoYnAsIENEMTgwX01DT1IxLCBtY29yMSk7CisJcmNfb3V0KGJwLCBDRDE4MF9NQ09SMiwgbWNvcjIpOworCS8qIEVuYWJsZSBDRDE4MCB0cmFuc21pdHRlciAmIHJlY2VpdmVyICovCisJcmNfd2FpdF9DQ1IoYnApOworCXJjX291dChicCwgQ0QxODBfQ0NSLCBDQ1JfVFhFTiB8IENDUl9SWEVOKTsKKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCS8qIEFuZCBmaW5hbGx5IHNldCBSVFMgb24gKi8KKwlyY19vdXQoYnAsIENEMTgwX01TVlIsIHBvcnQtPk1TVlIpOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZW5hYmxlZCAqLworc3RhdGljIGludCByY19zZXR1cF9wb3J0KHN0cnVjdCByaXNjb21fYm9hcmQgKmJwLCBzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkKKwkJcmV0dXJuIDA7CisJCisJaWYgKCFwb3J0LT54bWl0X2J1ZikgeworCQkvKiBXZSBtYXkgc2xlZXAgaW4gZ2V0X3plcm9lZF9wYWdlKCkgKi8KKwkJdW5zaWduZWQgbG9uZyB0bXA7CisJCQorCQlpZiAoISh0bXAgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCkpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCSAgICAKKwkJaWYgKHBvcnQtPnhtaXRfYnVmKSB7CisJCQlmcmVlX3BhZ2UodG1wKTsKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCX0KKwkJcG9ydC0+eG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKSB0bXA7CisJfQorCQkKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJCQorCWlmIChwb3J0LT50dHkpIAorCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmcG9ydC0+dHR5LT5mbGFncyk7CisJCQorCWlmIChwb3J0LT5jb3VudCA9PSAxKSAKKwkJYnAtPmNvdW50Kys7CisJCQorCXBvcnQtPnhtaXRfY250ID0gcG9ydC0+eG1pdF9oZWFkID0gcG9ydC0+eG1pdF90YWlsID0gMDsKKwlyY19jaGFuZ2Vfc3BlZWQoYnAsIHBvcnQpOworCXBvcnQtPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCQkKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkICovCitzdGF0aWMgdm9pZCByY19zaHV0ZG93bl9wb3J0KHN0cnVjdCByaXNjb21fYm9hcmQgKmJwLCBzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwkKKwlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgCisJCXJldHVybjsKKwkKKyNpZmRlZiBSQ19SRVBPUlRfT1ZFUlJVTgorCXByaW50ayhLRVJOX0lORk8gInJjJWQ6IHBvcnQgJWQ6IFRvdGFsICVsZCBvdmVycnVucyB3ZXJlIGRldGVjdGVkLlxuIiwKKwkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpLCBwb3J0LT5vdmVycnVuKTsKKyNlbmRpZgkKKyNpZmRlZiBSQ19SRVBPUlRfRklGTworCXsKKwkJaW50IGk7CisJCQorCQlwcmludGsoS0VSTl9JTkZPICJyYyVkOiBwb3J0ICVkOiBGSUZPIGhpdHMgWyAiLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpKTsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspICB7CisJCQlwcmludGsoIiVsZCAiLCBwb3J0LT5oaXRzW2ldKTsKKwkJfQorCQlwcmludGsoIl0uXG4iKTsKKwl9CisjZW5kaWYJCisJaWYgKHBvcnQtPnhtaXRfYnVmKSAgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBvcnQtPnhtaXRfYnVmKTsKKwkJcG9ydC0+eG1pdF9idWYgPSBOVUxMOworCX0KKworCWlmICghKHR0eSA9IHBvcnQtPnR0eSkgfHwgQ19IVVBDTCh0dHkpKSAgeworCQkvKiBEcm9wIERUUiAqLworCQlicC0+RFRSIHw9ICgxdSA8PCBwb3J0X05vKHBvcnQpKTsKKwkJcmNfb3V0KGJwLCBSQ19EVFIsIGJwLT5EVFIpOworCX0KKwkKKyAgICAgICAgLyogU2VsZWN0IHBvcnQgKi8KKwlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJLyogUmVzZXQgcG9ydCAqLworCXJjX3dhaXRfQ0NSKGJwKTsKKwlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX1NPRlRSRVNFVCk7CisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBmcm9tIHRoaXMgcG9ydCAqLworCXBvcnQtPklFUiA9IDA7CisJcmNfb3V0KGJwLCBDRDE4MF9JRVIsIHBvcnQtPklFUik7CisJCisJaWYgKHR0eSkgIAorCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOworCXBvcnQtPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKKwkKKwlpZiAoLS1icC0+Y291bnQgPCAwKSAgeworCQlwcmludGsoS0VSTl9JTkZPICJyYyVkOiByY19zaHV0ZG93bl9wb3J0OiAiCisJCQkJICJiYWQgYm9hcmQgY291bnQ6ICVkXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBicC0+Y291bnQpOworCQlicC0+Y291bnQgPSAwOworCX0KKwkKKwkvKgorCSAqIElmIHRoaXMgaXMgdGhlIGxhc3Qgb3BlbmVkIHBvcnQgb24gdGhlIGJvYXJkCisJICogc2h1dGRvd24gd2hvbGUgYm9hcmQKKwkgKi8KKwlpZiAoIWJwLT5jb3VudCkgCisJCXJjX3NodXRkb3duX2JvYXJkKGJwKTsKK30KKworCQorc3RhdGljIGludCBibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwLAorCQkJICAgc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwlpbnQgICAgcmV0dmFsOworCWludCAgICBkb19jbG9jYWwgPSAwOworCWludCAgICBDRDsKKworCS8qCisJICogSWYgdGhlIGRldmljZSBpcyBpbiB0aGUgbWlkZGxlIG9mIGJlaW5nIGNsb3NlZCwgdGhlbiBibG9jaworCSAqIHVudGlsIGl0J3MgZG9uZSwgYW5kIHRoZW4gdHJ5IGFnYWluLgorCSAqLworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8IHBvcnQtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgeworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZwb3J0LT5jbG9zZV93YWl0KTsKKwkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCXJldHVybiAtRUFHQUlOOworCQllbHNlCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKworCS8qCisJICogSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCBvciB0aGUgcG9ydCBpcyBub3QgZW5hYmxlZCwKKwkgKiB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250IGFuZCB0aGVuIGV4aXQuCisJICovCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwKKwkgICAgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgeworCQlwb3J0LT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoQ19DTE9DQUwodHR5KSkgIAorCQlkb19jbG9jYWwgPSAxOworCisJLyoKKwkgKiBCbG9jayB3YWl0aW5nIGZvciB0aGUgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZQorCSAqIGZyZWUgKGkuZS4sIG5vdCBpbiB1c2UgYnkgdGhlIGNhbGxvdXQpLiAgV2hpbGUgd2UgYXJlIGluCisJICogdGhpcyBsb29wLCBpbmZvLT5jb3VudCBpcyBkcm9wcGVkIGJ5IG9uZSwgc28gdGhhdAorCSAqIHJzX2Nsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIFdlIHJlc3RvcmUgaXQgdXBvbgorCSAqIGV4aXQsIGVpdGhlciBub3JtYWwgb3IgYWJub3JtYWwuCisJICovCisJcmV0dmFsID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCk7CisJY2xpKCk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCQlwb3J0LT5jb3VudC0tOworCXN0aSgpOworCXBvcnQtPmJsb2NrZWRfb3BlbisrOworCXdoaWxlICgxKSB7CisJCWNsaSgpOworCQlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJCUNEID0gcmNfaW4oYnAsIENEMTgwX01TVlIpICYgTVNWUl9DRDsKKwkJcmNfb3V0KGJwLCBDRDE4MF9NU1ZSLCBNU1ZSX1JUUyk7CisJCWJwLT5EVFIgJj0gfigxdSA8PCBwb3J0X05vKHBvcnQpKTsKKwkJcmNfb3V0KGJwLCBSQ19EVFIsIGJwLT5EVFIpOworCQlzdGkoKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkJICAgICEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKwkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJgorCQkgICAgKGRvX2Nsb2NhbCB8fCBDRCkpCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCQlwb3J0LT5jb3VudCsrOworCXBvcnQtPmJsb2NrZWRfb3Blbi0tOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJCisJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwlyZXR1cm4gMDsKK30JCisKK3N0YXRpYyBpbnQgcmNfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCWludCBib2FyZDsKKwlpbnQgZXJyb3I7CisJc3RydWN0IHJpc2NvbV9wb3J0ICogcG9ydDsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICogYnA7CisJCisJYm9hcmQgPSBSQ19CT0FSRCh0dHktPmluZGV4KTsKKwlpZiAoYm9hcmQgPj0gUkNfTkJPQVJEIHx8ICEocmNfYm9hcmRbYm9hcmRdLmZsYWdzICYgUkNfQk9BUkRfUFJFU0VOVCkpCisJCXJldHVybiAtRU5PREVWOworCQorCWJwID0gJnJjX2JvYXJkW2JvYXJkXTsKKwlwb3J0ID0gcmNfcG9ydCArIGJvYXJkICogUkNfTlBPUlQgKyBSQ19QT1JUKHR0eS0+aW5kZXgpOworCWlmIChyY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJyY19vcGVuIikpCisJCXJldHVybiAtRU5PREVWOworCQorCWlmICgoZXJyb3IgPSByY19zZXR1cF9ib2FyZChicCkpKSAKKwkJcmV0dXJuIGVycm9yOworCQkKKwlwb3J0LT5jb3VudCsrOworCXR0eS0+ZHJpdmVyX2RhdGEgPSBwb3J0OworCXBvcnQtPnR0eSA9IHR0eTsKKwkKKwlpZiAoKGVycm9yID0gcmNfc2V0dXBfcG9ydChicCwgcG9ydCkpKSAKKwkJcmV0dXJuIGVycm9yOworCQorCWlmICgoZXJyb3IgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBwb3J0KSkpCisJCXJldHVybiBlcnJvcjsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmNfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJCisJaWYgKCFwb3J0IHx8IHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImNsb3NlIikpCisJCXJldHVybjsKKwkKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpCisJCWdvdG8gb3V0OworCQorCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKHBvcnQtPmNvdW50ICE9IDEpKSAgeworCQlwcmludGsoS0VSTl9JTkZPICJyYyVkOiByY19jbG9zZTogYmFkIHBvcnQgY291bnQ7IgorCQkgICAgICAgIiB0dHktPmNvdW50IGlzIDEsIHBvcnQgY291bnQgaXMgJWRcbiIsCisJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnQtPmNvdW50KTsKKwkJcG9ydC0+Y291bnQgPSAxOworCX0KKwlpZiAoLS1wb3J0LT5jb3VudCA8IDApICB7CisJCXByaW50ayhLRVJOX0lORk8gInJjJWQ6IHJjX2Nsb3NlOiBiYWQgcG9ydCBjb3VudCAiCisJCQkJICJmb3IgdHR5JWQ6ICVkXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpLCBwb3J0LT5jb3VudCk7CisJCXBvcnQtPmNvdW50ID0gMDsKKwl9CisJaWYgKHBvcnQtPmNvdW50KQorCQlnb3RvIG91dDsKKwlwb3J0LT5mbGFncyB8PSBBU1lOQ19DTE9TSU5HOworCS8qCisJICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkgCisJICogdGhlIGxpbmUgZGlzY2lwbGluZSB0byBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycy4KKwkgKi8KKwl0dHktPmNsb3NpbmcgPSAxOworCWlmIChwb3J0LT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBwb3J0LT5jbG9zaW5nX3dhaXQpOworCS8qCisJICogQXQgdGhpcyBwb2ludCB3ZSBzdG9wIGFjY2VwdGluZyBpbnB1dC4gIFRvIGRvIHRoaXMsIHdlCisJICogZGlzYWJsZSB0aGUgcmVjZWl2ZSBsaW5lIHN0YXR1cyBpbnRlcnJ1cHRzLCBhbmQgdGVsbCB0aGUKKwkgKiBpbnRlcnJ1cHQgZHJpdmVyIHRvIHN0b3AgY2hlY2tpbmcgdGhlIGRhdGEgcmVhZHkgYml0IGluIHRoZQorCSAqIGxpbmUgc3RhdHVzIHJlZ2lzdGVyLgorCSAqLworCXBvcnQtPklFUiAmPSB+SUVSX1JYRDsKKwlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlwb3J0LT5JRVIgJj0gfklFUl9UWFJEWTsKKwkJcG9ydC0+SUVSIHw9IElFUl9UWEVNUFRZOworCQlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCQkvKgorCQkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgorCQkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkOyB0aGlzIGlzIGVzcGVjaWFsbHkKKwkJICogaW1wb3J0YW50IGlmIHRoZXJlIGlzIGEgdHJhbnNtaXQgRklGTyEKKwkJICovCisJCXRpbWVvdXQgPSBqaWZmaWVzK0haOworCQl3aGlsZShwb3J0LT5JRVIgJiBJRVJfVFhFTVBUWSkgIHsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MocG9ydC0+dGltZW91dCkpOworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmNfc2h1dGRvd25fcG9ydChicCwgcG9ydCk7CisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKworCXR0eS0+Y2xvc2luZyA9IDA7CisJcG9ydC0+ZXZlbnQgPSAwOworCXBvcnQtPnR0eSA9IE5VTEw7CisJaWYgKHBvcnQtPmJsb2NrZWRfb3BlbikgeworCQlpZiAocG9ydC0+Y2xvc2VfZGVsYXkpIHsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MocG9ydC0+Y2xvc2VfZGVsYXkpKTsKKwkJfQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7CisJfQorCXBvcnQtPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRXxBU1lOQ19DTE9TSU5HKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPmNsb3NlX3dhaXQpOworb3V0OglyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIGludCByY193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicDsKKwlpbnQgYywgdG90YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX3dyaXRlIikpCisJCXJldHVybiAwOworCQorCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKworCWlmICghdHR5IHx8ICFwb3J0LT54bWl0X2J1ZiB8fCAhdG1wX2J1ZikKKwkJcmV0dXJuIDA7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwl3aGlsZSAoMSkgeworCQljbGkoKTsJCQorCQljID0gbWluX3QoaW50LCBjb3VudCwgbWluKFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2NudCAtIDEsCisJCQkJCSAgU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfaGVhZCkpOworCQlpZiAoYyA8PSAwKSB7CisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbWVtY3B5KHBvcnQtPnhtaXRfYnVmICsgcG9ydC0+eG1pdF9oZWFkLCBidWYsIGMpOworCQlwb3J0LT54bWl0X2hlYWQgPSAocG9ydC0+eG1pdF9oZWFkICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKKwkJcG9ydC0+eG1pdF9jbnQgKz0gYzsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwkJYnVmICs9IGM7CisJCWNvdW50IC09IGM7CisJCXRvdGFsICs9IGM7CisJfQorCisJY2xpKCk7CisJaWYgKHBvcnQtPnhtaXRfY250ICYmICF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCAmJgorCSAgICAhKHBvcnQtPklFUiAmIElFUl9UWFJEWSkpIHsKKwkJcG9ydC0+SUVSIHw9IElFUl9UWFJEWTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwl9CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlyZXR1cm4gdG90YWw7Cit9CisKK3N0YXRpYyB2b2lkIHJjX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAicmNfcHV0X2NoYXIiKSkKKwkJcmV0dXJuOworCisJaWYgKCF0dHkgfHwgIXBvcnQtPnhtaXRfYnVmKQorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJCisJaWYgKHBvcnQtPnhtaXRfY250ID49IFNFUklBTF9YTUlUX1NJWkUgLSAxKQorCQlnb3RvIG91dDsKKworCXBvcnQtPnhtaXRfYnVmW3BvcnQtPnhtaXRfaGVhZCsrXSA9IGNoOworCXBvcnQtPnhtaXRfaGVhZCAmPSBTRVJJQUxfWE1JVF9TSVpFIC0gMTsKKwlwb3J0LT54bWl0X2NudCsrOworb3V0OglyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcmNfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkKKwlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAicmNfZmx1c2hfY2hhcnMiKSkKKwkJcmV0dXJuOworCQorCWlmIChwb3J0LT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQgfHwKKwkgICAgIXBvcnQtPnhtaXRfYnVmKQorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJcG9ydC0+SUVSIHw9IElFUl9UWFJEWTsKKwlyY19vdXQocG9ydF9Cb2FyZChwb3J0KSwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlyY19vdXQocG9ydF9Cb2FyZChwb3J0KSwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHJjX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJaW50CXJldDsKKwkJCQkKKwlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAicmNfd3JpdGVfcm9vbSIpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2NudCAtIDE7CisJaWYgKHJldCA8IDApCisJCXJldCA9IDA7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByY19jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwkJCQkKKwlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAicmNfY2hhcnNfaW5fYnVmZmVyIikpCisJCXJldHVybiAwOworCQorCXJldHVybiBwb3J0LT54bWl0X2NudDsKK30KKworc3RhdGljIHZvaWQgcmNfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkKKwlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAicmNfZmx1c2hfYnVmZmVyIikpCisJCXJldHVybjsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCXR0eV93YWtldXAodHR5KTsKK30KKworc3RhdGljIGludCByY190aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICogYnA7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgX19GVU5DVElPTl9fKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlzdGF0dXMgPSByY19pbihicCwgQ0QxODBfTVNWUik7CisJcmVzdWx0ID0gcmNfaW4oYnAsIFJDX1JJKSAmICgxdSA8PCBwb3J0X05vKHBvcnQpKSA/IDAgOiBUSU9DTV9STkc7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJcmVzdWx0IHw9ICgoc3RhdHVzICYgTVNWUl9SVFMpID8gVElPQ01fUlRTIDogMCkKKwkJfCAoKHN0YXR1cyAmIE1TVlJfRFRSKSA/IFRJT0NNX0RUUiA6IDApCisJCXwgKChzdGF0dXMgJiBNU1ZSX0NEKSAgPyBUSU9DTV9DQVIgOiAwKQorCQl8ICgoc3RhdHVzICYgTVNWUl9EU1IpID8gVElPQ01fRFNSIDogMCkKKwkJfCAoKHN0YXR1cyAmIE1TVlJfQ1RTKSA/IFRJT0NNX0NUUyA6IDApOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcmNfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicDsKKworCWlmIChyY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsIF9fRlVOQ1RJT05fXykpCisJCXJldHVybiAtRU5PREVWOworCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCXBvcnQtPk1TVlIgfD0gTVNWUl9SVFM7CisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJYnAtPkRUUiAmPSB+KDF1IDw8IHBvcnRfTm8ocG9ydCkpOworCisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlwb3J0LT5NU1ZSICY9IH5NU1ZSX1JUUzsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWJwLT5EVFIgfD0gKDF1IDw8IHBvcnRfTm8ocG9ydCkpOworCisJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCXJjX291dChicCwgQ0QxODBfTVNWUiwgcG9ydC0+TVNWUik7CisJcmNfb3V0KGJwLCBSQ19EVFIsIGJwLT5EVFIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmNfc2VuZF9icmVhayhzdHJ1Y3QgcmlzY29tX3BvcnQgKiBwb3J0LCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJcG9ydC0+YnJlYWtfbGVuZ3RoID0gUklTQ09NX1RQUyAvIEhaICogbGVuZ3RoOworCXBvcnQtPkNPUjIgfD0gQ09SMl9FVEM7CisJcG9ydC0+SUVSICB8PSBJRVJfVFhSRFk7CisJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCXJjX291dChicCwgQ0QxODBfQ09SMiwgcG9ydC0+Q09SMik7CisJcmNfb3V0KGJwLCBDRDE4MF9JRVIsIHBvcnQtPklFUik7CisJcmNfd2FpdF9DQ1IoYnApOworCXJjX291dChicCwgQ0QxODBfQ0NSLCBDQ1JfQ09SQ0hHMik7CisJcmNfd2FpdF9DQ1IoYnApOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCByY19zZXRfc2VyaWFsX2luZm8oc3RydWN0IHJpc2NvbV9wb3J0ICogcG9ydCwKKwkJCQkgICAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqIG5ld2luZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwlpbnQgY2hhbmdlX3NwZWVkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIG5ld2luZm8sIHNpemVvZih0bXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisjaWYgMAkKKwlpZiAoKHRtcC5pcnEgIT0gYnAtPmlycSkgfHwKKwkgICAgKHRtcC5wb3J0ICE9IGJwLT5iYXNlKSB8fAorCSAgICAodG1wLnR5cGUgIT0gUE9SVF9DSVJSVVMpIHx8CisJICAgICh0bXAuYmF1ZF9iYXNlICE9IChSQ19PU0NGUkVRICsgQ0QxODBfVFBDLzIpIC8gQ0QxODBfVFBDKSB8fAorCSAgICAodG1wLmN1c3RvbV9kaXZpc29yICE9IDApIHx8CisJICAgICh0bXAueG1pdF9maWZvX3NpemUgIT0gQ0QxODBfTkZJRk8pIHx8CisJICAgICh0bXAuZmxhZ3MgJiB+UklTQ09NX0xFR0FMX0ZMQUdTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYJCisJCisJY2hhbmdlX3NwZWVkID0gKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSAhPQorCQkJKHRtcC5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSk7CisJCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCWlmICgodG1wLmNsb3NlX2RlbGF5ICE9IHBvcnQtPmNsb3NlX2RlbGF5KSB8fAorCQkgICAgKHRtcC5jbG9zaW5nX3dhaXQgIT0gcG9ydC0+Y2xvc2luZ193YWl0KSB8fAorCQkgICAgKCh0bXAuZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spICE9CisJCSAgICAgKHBvcnQtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpICAKKwkJCXJldHVybiAtRVBFUk07CisJCXBvcnQtPmZsYWdzID0gKChwb3J0LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAorCQkJICAgICAgICh0bXAuZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOworCX0gZWxzZSAgeworCQlwb3J0LT5mbGFncyA9ICgocG9ydC0+ZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwKKwkJCSAgICAgICAodG1wLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKKwkJcG9ydC0+Y2xvc2VfZGVsYXkgPSB0bXAuY2xvc2VfZGVsYXk7CisJCXBvcnQtPmNsb3Npbmdfd2FpdCA9IHRtcC5jbG9zaW5nX3dhaXQ7CisJfQorCWlmIChjaGFuZ2Vfc3BlZWQpICB7CisJCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwkJcmNfY2hhbmdlX3NwZWVkKGJwLCBwb3J0KTsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCByY19nZXRfc2VyaWFsX2luZm8oc3RydWN0IHJpc2NvbV9wb3J0ICogcG9ydCwKKwkJCQkgICAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqcmV0aW5mbykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCQorCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisJdG1wLnR5cGUgPSBQT1JUX0NJUlJVUzsKKwl0bXAubGluZSA9IHBvcnQgLSByY19wb3J0OworCXRtcC5wb3J0ID0gYnAtPmJhc2U7CisJdG1wLmlycSAgPSBicC0+aXJxOworCXRtcC5mbGFncyA9IHBvcnQtPmZsYWdzOworCXRtcC5iYXVkX2Jhc2UgPSAoUkNfT1NDRlJFUSArIENEMTgwX1RQQy8yKSAvIENEMTgwX1RQQzsKKwl0bXAuY2xvc2VfZGVsYXkgPSBwb3J0LT5jbG9zZV9kZWxheSAqIEhaLzEwMDsKKwl0bXAuY2xvc2luZ193YWl0ID0gcG9ydC0+Y2xvc2luZ193YWl0ICogSFovMTAwOworCXRtcC54bWl0X2ZpZm9fc2l6ZSA9IENEMTgwX05GSUZPOworCXJldHVybiBjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgcmNfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCwgCisJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKKwkJICAgIAoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCByZXR2YWw7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX2lvY3RsIikpCisJCXJldHVybiAtRU5PREVWOworCQorCXN3aXRjaCAoY21kKSB7CisJIGNhc2UgVENTQlJLOgkvKiBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsgKi8KKwkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOworCQlpZiAoIWFyZykKKwkJCXJjX3NlbmRfYnJlYWsocG9ydCwgSFovNCk7CS8qIDEvNCBzZWNvbmQgKi8KKwkJYnJlYWs7CisJIGNhc2UgVENTQlJLUDoJLyogc3VwcG9ydCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKSAqLworCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCXJjX3NlbmRfYnJlYWsocG9ydCwgYXJnID8gYXJnKihIWi8xMCkgOiBIWi80KTsKKwkJYnJlYWs7CisJIGNhc2UgVElPQ0dTT0ZUQ0FSOgorCQlyZXR1cm4gcHV0X3VzZXIoQ19DTE9DQUwodHR5KSA/IDEgOiAwLCAodW5zaWduZWQgX191c2VyICopYXJncCk7CisJIGNhc2UgVElPQ1NTT0ZUQ0FSOgorCQlpZiAoZ2V0X3VzZXIoYXJnLCh1bnNpZ25lZCBfX3VzZXIgKikgYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0KKwkJCSgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfAorCQkJKGFyZyA/IENMT0NBTCA6IDApKTsKKwkJYnJlYWs7CisJIGNhc2UgVElPQ0dTRVJJQUw6CQorCQlyZXR1cm4gcmNfZ2V0X3NlcmlhbF9pbmZvKHBvcnQsIGFyZ3ApOworCSBjYXNlIFRJT0NTU0VSSUFMOgkKKwkJcmV0dXJuIHJjX3NldF9zZXJpYWxfaW5mbyhwb3J0LCBhcmdwKTsKKwkgZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJjX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX3Rocm90dGxlIikpCisJCXJldHVybjsKKwkKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCXBvcnQtPk1TVlIgJj0gfk1TVlJfUlRTOworCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlpZiAoSV9JWE9GRih0dHkpKSAgeworCQlyY193YWl0X0NDUihicCk7CisJCXJjX291dChicCwgQ0QxODBfQ0NSLCBDQ1JfU1NDSDIpOworCQlyY193YWl0X0NDUihicCk7CisJfQorCXJjX291dChicCwgQ0QxODBfTVNWUiwgcG9ydC0+TVNWUik7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJjX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkKKwlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAicmNfdW50aHJvdHRsZSIpKQorCQlyZXR1cm47CisJCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCQorCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlwb3J0LT5NU1ZSIHw9IE1TVlJfUlRTOworCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlpZiAoSV9JWE9GRih0dHkpKSAgeworCQlyY193YWl0X0NDUihicCk7CisJCXJjX291dChicCwgQ0QxODBfQ0NSLCBDQ1JfU1NDSDEpOworCQlyY193YWl0X0NDUihicCk7CisJfQorCXJjX291dChicCwgQ0QxODBfTVNWUiwgcG9ydC0+TVNWUik7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJjX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkKKwlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAicmNfc3RvcCIpKQorCQlyZXR1cm47CisJCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCQorCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlwb3J0LT5JRVIgJj0gfklFUl9UWFJEWTsKKwlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJcmNfb3V0KGJwLCBDRDE4MF9JRVIsIHBvcnQtPklFUik7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJjX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX3N0YXJ0IikpCisJCXJldHVybjsKKwkKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCWlmIChwb3J0LT54bWl0X2NudCAmJiBwb3J0LT54bWl0X2J1ZiAmJiAhKHBvcnQtPklFUiAmIElFUl9UWFJEWSkpICB7CisJCXBvcnQtPklFUiB8PSBJRVJfVFhSRFk7CisJCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9JRVIsIHBvcnQtPklFUik7CisJfQorCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHRoZSB3b3JrIHF1ZXVlIHdoZW4gdGhlIGludGVycnVwdAorICogcm91dGluZSBoYXMgc2lnbmFsbGVkIHRoYXQgYSBoYW5ndXAgaGFzIG9jY3VycmVkLiAgVGhlIHBhdGggb2YKKyAqIGhhbmd1cCBwcm9jZXNzaW5nIGlzOgorICoKKyAqIAlzZXJpYWwgaW50ZXJydXB0IHJvdXRpbmUgLT4gKHdvcmtxdWV1ZSkgLT4KKyAqIAlkb19yY19oYW5ndXAoKSAtPiB0dHktPmhhbmd1cCgpIC0+IHJjX2hhbmd1cCgpCisgKiAKKyAqLworc3RhdGljIHZvaWQgZG9fcmNfaGFuZ3VwKHZvaWQgKnByaXZhdGVfKQoreworCXN0cnVjdCByaXNjb21fcG9ydAkqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKikgcHJpdmF0ZV87CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwkKKwl0dHkgPSBwb3J0LT50dHk7CisJaWYgKHR0eSkKKwkJdHR5X2hhbmd1cCh0dHkpOwkvKiBGSVhNRTogbW9kdWxlIHJlbW92YWwgcmFjZSBzdGlsbCBoZXJlICovCit9CisKK3N0YXRpYyB2b2lkIHJjX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicDsKKwkJCQkKKwlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAicmNfaGFuZ3VwIikpCisJCXJldHVybjsKKwkKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJCisJcmNfc2h1dGRvd25fcG9ydChicCwgcG9ydCk7CisJcG9ydC0+ZXZlbnQgPSAwOworCXBvcnQtPmNvdW50ID0gMDsKKwlwb3J0LT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwlwb3J0LT50dHkgPSBOVUxMOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3Blbl93YWl0KTsKK30KKworc3RhdGljIHZvaWQgcmNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCB0ZXJtaW9zICogb2xkX3Rlcm1pb3MpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkKKwlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAicmNfc2V0X3Rlcm1pb3MiKSkKKwkJcmV0dXJuOworCQorCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiYKKwkgICAgdHR5LT50ZXJtaW9zLT5jX2lmbGFnID09IG9sZF90ZXJtaW9zLT5jX2lmbGFnKQorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJcmNfY2hhbmdlX3NwZWVkKHBvcnRfQm9hcmQocG9ydCksIHBvcnQpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCisJICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJcmNfc3RhcnQodHR5KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCit7CisJc3RydWN0IHJpc2NvbV9wb3J0CSpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKSBwcml2YXRlXzsKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OworCQorCWlmKCEodHR5ID0gcG9ydC0+dHR5KSkgCisJCXJldHVybjsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlNfRVZFTlRfV1JJVEVfV0FLRVVQLCAmcG9ydC0+ZXZlbnQpKSB7CisJCXR0eV93YWtldXAodHR5KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCX0KK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyByaXNjb21fb3BzID0geworCS5vcGVuICA9IHJjX29wZW4sCisJLmNsb3NlID0gcmNfY2xvc2UsCisJLndyaXRlID0gcmNfd3JpdGUsCisJLnB1dF9jaGFyID0gcmNfcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gcmNfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSByY193cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSByY19jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciA9IHJjX2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSByY19pb2N0bCwKKwkudGhyb3R0bGUgPSByY190aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IHJjX3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zID0gcmNfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSByY19zdG9wLAorCS5zdGFydCA9IHJjX3N0YXJ0LAorCS5oYW5ndXAgPSByY19oYW5ndXAsCisJLnRpb2NtZ2V0ID0gcmNfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gcmNfdGlvY21zZXQsCit9OworCitzdGF0aWMgaW5saW5lIGludCByY19pbml0X2RyaXZlcnModm9pZCkKK3sKKwlpbnQgZXJyb3I7CisJaW50IGk7CisKKwlyaXNjb21fZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihSQ19OQk9BUkQgKiBSQ19OUE9SVCk7CisJaWYgKCFyaXNjb21fZHJpdmVyKQkKKwkJcmV0dXJuIC1FTk9NRU07CisJCisJaWYgKCEodG1wX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYzogQ291bGRuJ3QgZ2V0IGZyZWUgcGFnZS5cbiIpOworCQlwdXRfdHR5X2RyaXZlcihyaXNjb21fZHJpdmVyKTsKKwkJcmV0dXJuIDE7CisJfQorCW1lbXNldChJUlFfdG9fYm9hcmQsIDAsIHNpemVvZihJUlFfdG9fYm9hcmQpKTsKKwlyaXNjb21fZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXJpc2NvbV9kcml2ZXItPm5hbWUgPSAidHR5TCI7CisJcmlzY29tX2RyaXZlci0+ZGV2ZnNfbmFtZSA9ICJ0dHMvTCI7CisJcmlzY29tX2RyaXZlci0+bWFqb3IgPSBSSVNDT004X05PUk1BTF9NQUpPUjsKKwlyaXNjb21fZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlyaXNjb21fZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCXJpc2NvbV9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlyaXNjb21fZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9CisJCUI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlyaXNjb21fZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKHJpc2NvbV9kcml2ZXIsICZyaXNjb21fb3BzKTsKKwlpZiAoKGVycm9yID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihyaXNjb21fZHJpdmVyKSkpICB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0bXBfYnVmKTsKKwkJcHV0X3R0eV9kcml2ZXIocmlzY29tX2RyaXZlcik7CisJCXByaW50ayhLRVJOX0VSUiAicmM6IENvdWxkbid0IHJlZ2lzdGVyIFJJU0NvbS84IGRyaXZlciwgIgorCQkJCSJlcnJvciA9ICVkXG4iLAorCQkgICAgICAgZXJyb3IpOworCQlyZXR1cm4gMTsKKwl9CisKKwltZW1zZXQocmNfcG9ydCwgMCwgc2l6ZW9mKHJjX3BvcnQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgUkNfTlBPUlQgKiBSQ19OQk9BUkQ7IGkrKykgIHsKKwkJcmNfcG9ydFtpXS5tYWdpYyA9IFJJU0NPTThfTUFHSUM7CisJCUlOSVRfV09SSygmcmNfcG9ydFtpXS50cXVldWUsIGRvX3NvZnRpbnQsICZyY19wb3J0W2ldKTsKKwkJSU5JVF9XT1JLKCZyY19wb3J0W2ldLnRxdWV1ZV9oYW5ndXAsIGRvX3JjX2hhbmd1cCwgJnJjX3BvcnRbaV0pOworCQlyY19wb3J0W2ldLmNsb3NlX2RlbGF5ID0gNTAgKiBIWi8xMDA7CisJCXJjX3BvcnRbaV0uY2xvc2luZ193YWl0ID0gMzAwMCAqIEhaLzEwMDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcmNfcG9ydFtpXS5vcGVuX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyY19wb3J0W2ldLmNsb3NlX3dhaXQpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmNfcmVsZWFzZV9kcml2ZXJzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0bXBfYnVmKTsKKwl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocmlzY29tX2RyaXZlcik7CisJcHV0X3R0eV9kcml2ZXIocmlzY29tX2RyaXZlcik7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKyNpZm5kZWYgTU9EVUxFCisvKgorICogQ2FsbGVkIGF0IGJvb3QgdGltZS4KKyAqIAorICogWW91IGNhbiBzcGVjaWZ5IElPIGJhc2UgZm9yIHVwIHRvIFJDX05CT0FSRCBjYXJkcywKKyAqIHVzaW5nIGxpbmUgInJpc2NvbTg9MHhpb2Jhc2UxLDB4aW9iYXNlMiwuLiIgYXQgTElMTyBwcm9tcHQuCisgKiBOb3RlIHRoYXQgdGhlcmUgd2lsbCBiZSBubyBwcm9iaW5nIGF0IGRlZmF1bHQKKyAqIGFkZHJlc3NlcyBpbiB0aGlzIGNhc2UuCisgKgorICovIAorc3RhdGljIGludCBfX2luaXQgcmlzY29tOF9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbUkNfTkJPQVJEXTsKKwlpbnQgaTsKKworCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkNfTkJPQVJEOyBpKyspIHsKKwkJaWYgKGkgPCBpbnRzWzBdKQorCQkJcmNfYm9hcmRbaV0uYmFzZSA9IGludHNbaSsxXTsKKwkJZWxzZSAKKwkJCXJjX2JvYXJkW2ldLmJhc2UgPSAwOworCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgicmlzY29tOD0iLCByaXNjb204X3NldHVwKTsKKyNlbmRpZgorCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0KKwlLRVJOX0lORk8gInJjOiBTREwgUklTQ29tLzggY2FyZCBkcml2ZXIgdjEuMSwgKGMpIEQuR29yb2RjaGFuaW4gIgorCQkgICIxOTk0LTE5OTYuXG4iOworc3RhdGljIGNoYXIgbm9fYm9hcmRzX21zZ1tdIF9faW5pdGRhdGEgPQorCUtFUk5fSU5GTyAicmM6IE5vIFJJU0NvbS84IGJvYXJkcyBkZXRlY3RlZC5cbiI7CisKKy8qIAorICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGJ5IGtlcm5lbCBhdCBib290IHRpbWUgCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHJpc2NvbThfaW5pdCh2b2lkKQoreworCWludCBpOworCWludCBmb3VuZCA9IDA7CisKKwlwcmludGsoYmFubmVyKTsKKworCWlmIChyY19pbml0X2RyaXZlcnMoKSkgCisJCXJldHVybiAtRUlPOworCisJZm9yIChpID0gMDsgaSA8IFJDX05CT0FSRDsgaSsrKSAKKwkJaWYgKHJjX2JvYXJkW2ldLmJhc2UgJiYgIXJjX3Byb2JlKCZyY19ib2FyZFtpXSkpICAKKwkJCWZvdW5kKys7CisJCisJaWYgKCFmb3VuZCkgIHsKKwkJcmNfcmVsZWFzZV9kcml2ZXJzKCk7CisJCXByaW50ayhub19ib2FyZHNfbXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgaW50IGlvYmFzZTsKK3N0YXRpYyBpbnQgaW9iYXNlMTsKK3N0YXRpYyBpbnQgaW9iYXNlMjsKK3N0YXRpYyBpbnQgaW9iYXNlMzsKK01PRFVMRV9QQVJNKGlvYmFzZSwgImkiKTsKK01PRFVMRV9QQVJNKGlvYmFzZTEsICJpIik7CitNT0RVTEVfUEFSTShpb2Jhc2UyLCAiaSIpOworTU9EVUxFX1BBUk0oaW9iYXNlMywgImkiKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2VuZGlmIC8qIE1PRFVMRSAqLworCisvKgorICogWW91IGNhbiBzZXR1cCB1cCB0byA0IGJvYXJkcyAoY3VycmVudCB2YWx1ZSBvZiBSQ19OQk9BUkQpCisgKiBieSBzcGVjaWZ5aW5nICJpb2Jhc2U9MHhYWFggaW9iYXNlMT0weFhYWCAuLi4iIGFzIGluc21vZCBwYXJhbWV0ZXIuCisgKgorICovCitzdGF0aWMgaW50IF9faW5pdCByaXNjb204X2luaXRfbW9kdWxlICh2b2lkKQoreworI2lmZGVmIE1PRFVMRQorCWludCBpOworCisJaWYgKGlvYmFzZSB8fCBpb2Jhc2UxIHx8IGlvYmFzZTIgfHwgaW9iYXNlMykgeworCQlmb3IoaSA9IDA7IGkgPCBSQ19OQk9BUkQ7IGkrKykKKwkJCXJjX2JvYXJkWzBdLmJhc2UgPSAwOworCX0KKworCWlmIChpb2Jhc2UpCisJCXJjX2JvYXJkWzBdLmJhc2UgPSBpb2Jhc2U7CisJaWYgKGlvYmFzZTEpCisJCXJjX2JvYXJkWzFdLmJhc2UgPSBpb2Jhc2UxOworCWlmIChpb2Jhc2UyKQorCQlyY19ib2FyZFsyXS5iYXNlID0gaW9iYXNlMjsKKwlpZiAoaW9iYXNlMykKKwkJcmNfYm9hcmRbM10uYmFzZSA9IGlvYmFzZTM7CisjZW5kaWYgLyogTU9EVUxFICovCisKKwlyZXR1cm4gcmlzY29tOF9pbml0KCk7Cit9CisJCitzdGF0aWMgdm9pZCBfX2V4aXQgcmlzY29tOF9leGl0X21vZHVsZSAodm9pZCkKK3sKKwlpbnQgaTsKKwkKKwlyY19yZWxlYXNlX2RyaXZlcnMoKTsKKwlmb3IgKGkgPSAwOyBpIDwgUkNfTkJPQVJEOyBpKyspICAKKwkJaWYgKHJjX2JvYXJkW2ldLmZsYWdzICYgUkNfQk9BUkRfUFJFU0VOVCkgCisJCQlyY19yZWxlYXNlX2lvX3JhbmdlKCZyY19ib2FyZFtpXSk7CisJCit9CisKK21vZHVsZV9pbml0KHJpc2NvbThfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocmlzY29tOF9leGl0X21vZHVsZSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaXNjb204LmggYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMTdhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogICAgICBsaW51eC9kcml2ZXJzL2NoYXIvcmlzY29tOC5oICAtLSBSSVNDb20vOCBtdWx0aXBvcnQgc2VyaWFsIGRyaXZlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2ICBEbWl0cnkgR29yb2RjaGFuaW4gKHBnbWRzZ0BpYmkuY29tKQorICoKKyAqICAgICAgVGhpcyBjb2RlIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlIExpbnV4IHNlcmlhbCBkcml2ZXIsIHdyaXR0ZW4gYnkKKyAqICAgICAgTGludXMgVG9ydmFsZHMsIFRoZW9kb3JlIFQnc28gYW5kIG90aGVycy4gVGhlIFJJU0NvbS84IGNhcmQgCisgKiAgICAgIHByb2dyYW1taW5nIGluZm8gd2FzIG9idGFpbmVkIGZyb20gdmFyaW91cyBkcml2ZXJzIGZvciBvdGhlciBPU2VzIAorICoJKEZyZWVCU0QsIElTQywgZXRjKSwgYnV0IG5vIHNvdXJjZSBjb2RlIGZyb20gdGhvc2UgZHJpdmVycyB3ZXJlIAorICoJZGlyZWN0bHkgaW5jbHVkZWQgaW4gdGhpcyBkcml2ZXIuCisgKgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfUklTQ09NOF9ICisjZGVmaW5lIF9fTElOVVhfUklTQ09NOF9ICisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBSQ19OQk9BUkQJCTQKKy8qIE5PVEU6IFJJU0NvbSBkZWNvZGVyIHJlY29nbml6ZXMgMTYgYWRkcmVzc2VzLi4uICovCisjZGVmaW5lIFJDX05QT1JUICAgICAgICAJOCAgCisjZGVmaW5lIFJDX0JPQVJEKGxpbmUpCQkoKChsaW5lKSA+PiAzKSAmIDB4MDcpCisjZGVmaW5lIFJDX1BPUlQobGluZSkJCSgobGluZSkgJiAoUkNfTlBPUlQgLSAxKSkKKworLyogVGlja3MgcGVyIHNlYy4gVXNlZCBmb3Igc2V0dGluZyByZWNlaXZlciB0aW1lb3V0IGFuZCBicmVhayBsZW5ndGggKi8KKyNkZWZpbmUgUklTQ09NX1RQUwkJNDAwMAorCisvKiBZZWFoLCBhZnRlciBoZWF2eSB0ZXN0aW5nIEkgZGVjaWRlZCBpdCBtdXN0IGJlIDYuCisgKiBTdXJlLCBZb3UgY2FuIGNoYW5nZSBpdCBpZiBuZWVkZWQuCisgKi8KKyNkZWZpbmUgUklTQ09NX1JYRklGTwkJNgkvKiBNYXguIHJlY2VpdmVyIEZJRk8gc2l6ZSAoMS04KSAqLworCisjZGVmaW5lIFJJU0NPTThfTUFHSUMJCTB4MDkwNworCisjZGVmaW5lIFJDX0lPQkFTRTEJMHgyMjAKKyNkZWZpbmUgUkNfSU9CQVNFMgkweDI0MAorI2RlZmluZSBSQ19JT0JBU0UzCTB4MjUwCisjZGVmaW5lIFJDX0lPQkFTRTQJMHgyNjAKKworc3RydWN0IHJpc2NvbV9ib2FyZCB7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXVuc2lnbmVkIHNob3J0CWJhc2U7CisJdW5zaWduZWQgY2hhciAJaXJxOworCXNpZ25lZCAgIGNoYXIJY291bnQ7CisJdW5zaWduZWQgY2hhcglEVFI7Cit9OworCisjZGVmaW5lIFJDX0JPQVJEX1BSRVNFTlQJMHgwMDAwMDAwMQorI2RlZmluZSBSQ19CT0FSRF9BQ1RJVkUJCTB4MDAwMDAwMDIKKwkKK3N0cnVjdCByaXNjb21fcG9ydCB7CisJaW50CQkJbWFnaWM7CisJaW50CQkJYmF1ZF9iYXNlOworCWludAkJCWZsYWdzOworCXN0cnVjdCB0dHlfc3RydWN0IAkqIHR0eTsKKwlpbnQJCQljb3VudDsKKwlpbnQJCQlibG9ja2VkX29wZW47CisJbG9uZwkJCWV2ZW50OyAvKiBsb25nIHJlcSdkIGZvciBzZXRfYml0IC0tUlIgKi8KKwlpbnQJCQl0aW1lb3V0OworCWludAkJCWNsb3NlX2RlbGF5OworCXVuc2lnbmVkIGNoYXIgCQkqIHhtaXRfYnVmOworCWludAkJCWN1c3RvbV9kaXZpc29yOworCWludAkJCXhtaXRfaGVhZDsKKwlpbnQJCQl4bWl0X3RhaWw7CisJaW50CQkJeG1pdF9jbnQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJb3Blbl93YWl0OworCXdhaXRfcXVldWVfaGVhZF90CWNsb3NlX3dhaXQ7CisJc3RydWN0IHdvcmtfc3RydWN0CXRxdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHF1ZXVlX2hhbmd1cDsKKwlzaG9ydAkJCXdha2V1cF9jaGFyczsKKwlzaG9ydAkJCWJyZWFrX2xlbmd0aDsKKwl1bnNpZ25lZCBzaG9ydAkJY2xvc2luZ193YWl0OworCXVuc2lnbmVkIGNoYXIJCW1hcmtfbWFzazsKKwl1bnNpZ25lZCBjaGFyCQlJRVI7CisJdW5zaWduZWQgY2hhcgkJTVNWUjsKKwl1bnNpZ25lZCBjaGFyCQlDT1IyOworI2lmZGVmIFJDX1JFUE9SVF9PVkVSUlVOCisJdW5zaWduZWQgbG9uZwkJb3ZlcnJ1bjsKKyNlbmRpZgkKKyNpZmRlZiBSQ19SRVBPUlRfRklGTworCXVuc2lnbmVkIGxvbmcJCWhpdHNbMTBdOworI2VuZGlmCit9OworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9fTElOVVhfUklTQ09NOF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlzY29tOF9yZWcuaCBiL2RyaXZlcnMvY2hhci9yaXNjb204X3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjQ3NWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlzY29tOF9yZWcuaApAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqICAgICAgbGludXgvZHJpdmVycy9jaGFyL3Jpc2NvbThfcmVnLmggIC0tIFJJU0NvbS84IG11bHRpcG9ydCBzZXJpYWwgZHJpdmVyLgorICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgUklTQ29tLzggQXN5bmMgTXV4IGNhcmQgYnkgU0RMIENvbW11bmljYXRpb25zLCBJbmMuCisgKi8KKworLyoKKyAqIEFkZHJlc3MgbWFwcGluZyBiZXR3ZWVuIENpcnJ1cyBMb2dpYyBDRDE4MCBjaGlwIGludGVybmFsIHJlZ2lzdGVycworICogYW5kIElTQSBwb3J0IGFkZHJlc3NlczoKKyAqCisgKiAgICAgIENMLUNEMTgwICAgICAgICAgICAgICAgIEE2ICBBNSAgIEE0ICBBMyAgICAgICAgICAgICAgICAgICAgICBBMiBBMSBBMAorICogICAgICBJU0EgICAgICAgICAgICAgQTE1IEExNCBBMTMgQTEyICBBMTEgQTEwIEE5IEE4ICBBNyBBNiBBNSBBNCAgQTMgQTIgQTEgQTAKKyAqLworI2RlZmluZSBSQ19UT19JU0EocikgICAgKCgoKHIpJjB4MDcpPDwxKSB8ICgoKHIpJn4weDA3KTw8NykpCisKKworLyogUklTQ29tLzggT24tQm9hcmQgUmVnaXN0ZXJzIChhc3N1bWluZyBhZGRyZXNzIHRyYW5zbGF0aW9uKSAqLworCisjZGVmaW5lIFJDX1JJICAgICAgICAgICAweDEwMCAgIC8qIFJpbmcgSW5kaWNhdG9yIFJlZ2lzdGVyIChSL08pICAgICAgICAgICAqLworI2RlZmluZSBSQ19EVFIgICAgICAgICAgMHgxMDAgICAvKiBEVFIgUmVnaXN0ZXIgKFcvTykgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNfQlNSICAgICAgICAgIDB4MTAxICAgLyogQm9hcmQgU3RhdHVzIFJlZ2lzdGVyIChSL08pICAgICAgICAgICAgICovCisjZGVmaW5lIFJDX0NUT1VUICAgICAgICAweDEwMSAgIC8qIENsZWFyIFRpbWVvdXQgKFcvTykgICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIEJvYXJkIFN0YXR1cyBSZWdpc3RlciAqLworCisjZGVmaW5lIFJDX0JTUl9UT1VUICAgICAweDA4ICAgICAvKiBIYXJkd2FyZSBUaW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ19CU1JfUklOVCAgICAgMHgwNCAgICAgLyogUmVjZWl2ZXIgSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNfQlNSX1RJTlQgICAgIDB4MDIgICAgIC8qIFRyYW5zbWl0dGVyIEludGVycnVwdCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDX0JTUl9NSU5UICAgICAweDAxICAgICAvKiBNb2RlbSBDdGwgSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIE9uLWJvYXJkIG9zY2lsbGF0b3IgZnJlcXVlbmN5IChpbiBIeikgKi8KKyNkZWZpbmUgUkNfT1NDRlJFUSAgICAgIDk4MzA0MDAKKworLyogVmFsdWVzIG9mIGNob2ljZSBmb3IgSW50ZXJydXB0IEFDS3MgKi8KKyNkZWZpbmUgUkNfQUNLX01JTlQgICAgIDB4ODEgICAgLyogZ29lcyB0byBQSUxSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDX0FDS19SSU5UICAgICAweDgyICAgIC8qIGdvZXMgdG8gUElMUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ19BQ0tfVElOVCAgICAgMHg4NCAgICAvKiBnb2VzIHRvIFBJTFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogQ2hpcCBJRCAoc29ycnksIG9ubHkgb25lIGNoaXAgbm93KSAqLworI2RlZmluZSBSQ19JRCAgICAgICAgICAgMHgxMAorCisvKiBEZWZpbml0aW9ucyBmb3IgQ2lycnVzIExvZ2ljIENMLUNEMTgwIDgtcG9ydCBhc3luYyBtdXggY2hpcCAqLworIAorI2RlZmluZSBDRDE4MF9OQ0ggICAgICAgOCAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfVFBDICAgICAgIDE2ICAgICAgLyogVGlja3MgcGVyIGNoYXJhY3RlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX05GSUZPCTgJLyogVFggRklGTyBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworLyogR2xvYmFsIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIENEMTgwX0dJVlIgICAgICAweDQwICAgIC8qIEdsb2JhbCBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICAgICAgICAqLworI2RlZmluZSBDRDE4MF9HSUNSICAgICAgMHg0MSAgICAvKiBHbG9iYWwgSW50ZXJydXB0aW5nIENoYW5uZWwgUmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgQ0QxODBfUElMUjEgICAgIDB4NjEgICAgLyogUHJpb3JpdHkgSW50ZXJydXB0IExldmVsIFJlZ2lzdGVyIDEgICAgICovCisjZGVmaW5lIENEMTgwX1BJTFIyICAgICAweDYyICAgIC8qIFByaW9yaXR5IEludGVycnVwdCBMZXZlbCBSZWdpc3RlciAyICAgICAqLworI2RlZmluZSBDRDE4MF9QSUxSMyAgICAgMHg2MyAgICAvKiBQcmlvcml0eSBJbnRlcnJ1cHQgTGV2ZWwgUmVnaXN0ZXIgMyAgICAgKi8KKyNkZWZpbmUgQ0QxODBfQ0FSICAgICAgIDB4NjQgICAgLyogQ2hhbm5lbCBBY2Nlc3MgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX0dGUkNSICAgICAweDZiICAgIC8qIEdsb2JhbCBGaXJtd2FyZSBSZXZpc2lvbiBDb2RlIFJlZ2lzdGVyICAqLworI2RlZmluZSBDRDE4MF9QUFJIICAgICAgMHg3MCAgICAvKiBQcmVzY2FsZXIgUGVyaW9kIFJlZ2lzdGVyIEhpZ2ggICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfUFBSTCAgICAgIDB4NzEgICAgLyogUHJlc2NhbGVyIFBlcmlvZCBSZWdpc3RlciBMb3cgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX1JEUiAgICAgICAweDc4ICAgIC8qIFJlY2VpdmVyIERhdGEgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9SQ1NSICAgICAgMHg3YSAgICAvKiBSZWNlaXZlciBDaGFyYWN0ZXIgU3RhdHVzIFJlZ2lzdGVyICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfVERSICAgICAgIDB4N2IgICAgLyogVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX0VPSVIgICAgICAweDdmICAgIC8qIEVuZCBvZiBJbnRlcnJ1cHQgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLworCisKKy8qIENoYW5uZWwgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgQ0QxODBfQ0NSICAgICAgIDB4MDEgICAgLyogQ2hhbm5lbCBDb21tYW5kIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX0lFUiAgICAgICAweDAyICAgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9DT1IxICAgICAgMHgwMyAgICAvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAxICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfQ09SMiAgICAgIDB4MDQgICAgLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMiAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX0NPUjMgICAgICAweDA1ICAgIC8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDMgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9DQ1NSICAgICAgMHgwNiAgICAvKiBDaGFubmVsIENvbnRyb2wgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfUkRDUiAgICAgIDB4MDcgICAgLyogUmVjZWl2ZSBEYXRhIENvdW50IFJlZ2lzdGVyICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX1NDSFIxICAgICAweDA5ICAgIC8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDEgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9TQ0hSMiAgICAgMHgwYSAgICAvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciAyICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfU0NIUjMgICAgIDB4MGIgICAgLyogU3BlY2lhbCBDaGFyYWN0ZXIgUmVnaXN0ZXIgMyAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX1NDSFI0ICAgICAweDBjICAgIC8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDQgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9NQ09SMSAgICAgMHgxMCAgICAvKiBNb2RlbSBDaGFuZ2UgT3B0aW9uIDEgUmVnaXN0ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfTUNPUjIgICAgIDB4MTEgICAgLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiAyIFJlZ2lzdGVyICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX01DUiAgICAgICAweDEyICAgIC8qIE1vZGVtIENoYW5nZSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9SVFBSICAgICAgMHgxOCAgICAvKiBSZWNlaXZlIFRpbWVvdXQgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfTVNWUiAgICAgIDB4MjggICAgLyogTW9kZW0gU2lnbmFsIFZhbHVlIFJlZ2lzdGVyICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX1JCUFJIICAgICAweDMxICAgIC8qIFJlY2VpdmUgQmF1ZCBSYXRlIFBlcmlvZCBSZWdpc3RlciBIaWdoICAqLworI2RlZmluZSBDRDE4MF9SQlBSTCAgICAgMHgzMiAgICAvKiBSZWNlaXZlIEJhdWQgUmF0ZSBQZXJpb2QgUmVnaXN0ZXIgTG93ICAgKi8KKyNkZWZpbmUgQ0QxODBfVEJQUkggICAgIDB4MzkgICAgLyogVHJhbnNtaXQgQmF1ZCBSYXRlIFBlcmlvZCBSZWdpc3RlciBIaWdoICovCisjZGVmaW5lIENEMTgwX1RCUFJMICAgICAweDNhICAgIC8qIFRyYW5zbWl0IEJhdWQgUmF0ZSBQZXJpb2QgUmVnaXN0ZXIgTG93ICAqLworCisKKy8qIEdsb2JhbCBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyIChSL1cpICovCisKKyNkZWZpbmUgR0lWUl9JVE1BU0sgICAgIDB4MDcgICAgIC8qIEludGVycnVwdCB0eXBlIG1hc2sgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgR0lWUl9JVF9NT0RFTSAgIDB4MDEgICAgLyogTW9kZW0gU2lnbmFsIENoYW5nZSBJbnRlcnJ1cHQgICAgICAgICAgICovCisjZGVmaW5lICBHSVZSX0lUX1RYICAgICAgMHgwMiAgICAvKiBUcmFuc21pdCBEYXRhIEludGVycnVwdCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdJVlJfSVRfUkNWICAgICAweDAzICAgIC8qIFJlY2VpdmUgR29vZCBEYXRhIEludGVycnVwdCAgICAgICAgICAgICAqLworI2RlZmluZSAgR0lWUl9JVF9SRVhDICAgIDB4MDcgICAgLyogUmVjZWl2ZSBFeGNlcHRpb24gSW50ZXJydXB0ICAgICAgICAgICAgICovCisKKworLyogR2xvYmFsIEludGVycnVwdCBDaGFubmVsIFJlZ2lzdGVyIChSL1cpICovCisgCisjZGVmaW5lIEdJQ1JfQ0hBTiAgICAgICAweDFjICAgIC8qIENoYW5uZWwgTnVtYmVyIE1hc2sgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHSUNSX0NIQU5fT0ZGICAgMiAgICAgICAvKiBDaGFubmVsIE51bWJlciBPZmZzZXQgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBDaGFubmVsIEFkZHJlc3MgUmVnaXN0ZXIgKFIvVykgKi8KKworI2RlZmluZSBDQVJfQ0hBTiAgICAgICAgMHgwNyAgICAvKiBDaGFubmVsIE51bWJlciBNYXNrICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FSX0E3ICAgICAgICAgIDB4MDggICAgLyogQTcgQWRkcmVzcyBFeHRlbnNpb24gKHVudXNlZCkgICAgICAgICAgICovCisKKworLyogUmVjZWl2ZSBDaGFyYWN0ZXIgU3RhdHVzIFJlZ2lzdGVyIChSL08pICovCisKKyNkZWZpbmUgUkNTUl9UT1VUICAgICAgIDB4ODAgICAgLyogUnggVGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDU1JfU0NERVQgICAgICAweDcwICAgIC8qIFNwZWNpYWwgQ2hhcmFjdGVyIERldGVjdGVkIE1hc2sgICAgICAgICAqLworI2RlZmluZSAgUkNTUl9OT19TQyAgICAgIDB4MDAgICAvKiBObyBTcGVjaWFsIENoYXJhY3RlcnMgRGV0ZWN0ZWQgICAgICAgICAgKi8KKyNkZWZpbmUgIFJDU1JfU0NfMSAgICAgICAweDEwICAgLyogU3BlY2lhbCBDaGFyIDEgKG9yIDEgJiAzKSBEZXRlY3RlZCAgICAgICovCisjZGVmaW5lICBSQ1NSX1NDXzIgICAgICAgMHgyMCAgIC8qIFNwZWNpYWwgQ2hhciAyIChvciAyICYgNCkgRGV0ZWN0ZWQgICAgICAqLworI2RlZmluZSAgUkNTUl9TQ18zICAgICAgIDB4MzAgICAvKiBTcGVjaWFsIENoYXIgMyBEZXRlY3RlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIFJDU1JfU0NfNCAgICAgICAweDQwICAgLyogU3BlY2lhbCBDaGFyIDQgRGV0ZWN0ZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDU1JfQlJFQUsgICAgICAweDA4ICAgIC8qIEJyZWFrIGhhcyBiZWVuIGRldGVjdGVkICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1NSX1BFICAgICAgICAgMHgwNCAgICAvKiBQYXJpdHkgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNTUl9GRSAgICAgICAgIDB4MDIgICAgLyogRnJhbWUgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDU1JfT0UgICAgICAgICAweDAxICAgIC8qIE92ZXJydW4gRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIENoYW5uZWwgQ29tbWFuZCBSZWdpc3RlciAoUi9XKSAoY29tbWFuZHMgaW4gZ3JvdXBzIGNhbiBiZSBPUi1lZCkgKi8KKworI2RlZmluZSBDQ1JfSEFSRFJFU0VUICAgMHg4MSAgICAvKiBSZXNldCB0aGUgY2hpcCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU09GVFJFU0VUICAgMHg4MCAgICAvKiBTb2Z0IENoYW5uZWwgUmVzZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfQ09SQ0hHMSAgICAgMHg0MiAgICAvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAxIENoYW5nZWQgICAgICAgKi8KKyNkZWZpbmUgQ0NSX0NPUkNIRzIgICAgIDB4NDQgICAgLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMiBDaGFuZ2VkICAgICAgICovCisjZGVmaW5lIENDUl9DT1JDSEczICAgICAweDQ4ICAgIC8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDMgQ2hhbmdlZCAgICAgICAqLworCisjZGVmaW5lIENDUl9TU0NIMSAgICAgICAweDIxICAgIC8qIFNlbmQgU3BlY2lhbCBDaGFyYWN0ZXIgMSAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIENDUl9TU0NIMiAgICAgICAweDIyICAgIC8qIFNlbmQgU3BlY2lhbCBDaGFyYWN0ZXIgMiAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIENDUl9TU0NIMyAgICAgICAweDIzICAgIC8qIFNlbmQgU3BlY2lhbCBDaGFyYWN0ZXIgMyAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIENDUl9TU0NINCAgICAgICAweDI0ICAgIC8qIFNlbmQgU3BlY2lhbCBDaGFyYWN0ZXIgNCAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIENDUl9UWEVOICAgICAgICAweDE4ICAgIC8qIEVuYWJsZSBUcmFuc21pdHRlciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQ1JfUlhFTiAgICAgICAgMHgxMiAgICAvKiBFbmFibGUgUmVjZWl2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfVFhESVMgICAgICAgMHgxNCAgICAvKiBEaXNhYmxlIFRyYW5zbWl0dGVyICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NSX1JYRElTICAgICAgIDB4MTEgICAgLyogRGlzYWJsZSBSZWNlaXZlciAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAoUi9XKSAqLworCisjZGVmaW5lIElFUl9EU1IgICAgICAgICAweDgwICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gRFNSIGNoYW5nZSAgICAgICAgICAqLworI2RlZmluZSBJRVJfQ0QgICAgICAgICAgMHg0MCAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIENEIGNoYW5nZSAgICAgICAgICAgKi8KKyNkZWZpbmUgSUVSX0NUUyAgICAgICAgIDB4MjAgICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBDVFMgY2hhbmdlICAgICAgICAgICovCisjZGVmaW5lIElFUl9SWEQgICAgICAgICAweDEwICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gUmVjZWl2ZSBEYXRhICAgICAgICAqLworI2RlZmluZSBJRVJfUlhTQyAgICAgICAgMHgwOCAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIFJlY2VpdmUgU3BlYy4gQ2hhciAgKi8KKyNkZWZpbmUgSUVSX1RYUkRZICAgICAgIDB4MDQgICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBUWCBGSUZPIGVtcHR5ICAgICAgICovCisjZGVmaW5lIElFUl9UWEVNUFRZICAgICAweDAyICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gVFggY29tcGxldGVseSBlbXB0eSAqLworI2RlZmluZSBJRVJfUkVUICAgICAgICAgMHgwMSAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIFJYIEV4Yy4gVGltZW91dCAgICAgKi8KKworCisvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAxIChSL1cpICovCisKKyNkZWZpbmUgQ09SMV9PRERQICAgICAgIDB4ODAgICAgLyogT2RkIFBhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjFfUEFSTU9ERSAgICAweDYwICAgIC8qIFBhcml0eSBNb2RlIG1hc2sgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV9OT1BBUiAgICAgIDB4MDAgICAvKiBObyBQYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfRk9SQ0VQQVIgICAweDIwICAgLyogRm9yY2UgUGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxX05PUk1QQVIgICAgMHg0MCAgIC8qIE5vcm1hbCBQYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IxX0lHTk9SRSAgICAgMHgxMCAgICAvKiBJZ25vcmUgUGFyaXR5IG9uIFJYICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SMV9TVE9QQklUUyAgIDB4MGMgICAgLyogTnVtYmVyIG9mIFN0b3AgQml0cyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxXzFTQiAgICAgICAgMHgwMCAgIC8qIDEgU3RvcCBCaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV8xNVNCICAgICAgIDB4MDQgICAvKiAxLjUgU3RvcCBCaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfMlNCICAgICAgICAweDA4ICAgLyogMiBTdG9wIEJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjFfQ0hBUkxFTiAgICAweDAzICAgIC8qIENoYXJhY3RlciBMZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV81QklUUyAgICAgIDB4MDAgICAvKiA1IGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfNkJJVFMgICAgICAweDAxICAgLyogNiBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxXzdCSVRTICAgICAgMHgwMiAgIC8qIDcgYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV84QklUUyAgICAgIDB4MDMgICAvKiA4IGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAyIChSL1cpICovCisKKyNkZWZpbmUgQ09SMl9JWE0gICAgICAgIDB4ODAgICAgLyogSW1wbGllZCBYT04gbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjJfVFhJQkUgICAgICAweDQwICAgIC8qIEVuYWJsZSBJbi1CYW5kIChYT04vWE9GRikgRmxvdyBDb250cm9sICAqLworI2RlZmluZSBDT1IyX0VUQyAgICAgICAgMHgyMCAgICAvKiBFbWJlZGRlZCBUeCBDb21tYW5kcyBFbmFibGUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SMl9MTE0gICAgICAgIDB4MTAgICAgLyogTG9jYWwgTG9vcGJhY2sgTW9kZSAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjJfUkxNICAgICAgICAweDA4ICAgIC8qIFJlbW90ZSBMb29wYmFjayBNb2RlICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IyX1JUU0FPICAgICAgMHgwNCAgICAvKiBSVFMgQXV0b21hdGljIE91dHB1dCBFbmFibGUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SMl9DVFNBRSAgICAgIDB4MDIgICAgLyogQ1RTIEF1dG9tYXRpYyBFbmFibGUgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjJfRFNSQUUgICAgICAweDAxICAgIC8qIERTUiBBdXRvbWF0aWMgRW5hYmxlICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDMgKFIvVykgKi8KKworI2RlZmluZSBDT1IzX1hPTkNIICAgICAgMHg4MCAgICAvKiBYT04gaXMgYSBwYWlyIG9mIGNoYXJhY3RlcnMgKDEgJiAzKSAgICAgKi8KKyNkZWZpbmUgQ09SM19YT0ZGQ0ggICAgIDB4NDAgICAgLyogWE9GRiBpcyBhIHBhaXIgb2YgY2hhcmFjdGVycyAoMiAmIDQpICAgICovCisjZGVmaW5lIENPUjNfRkNUICAgICAgICAweDIwICAgIC8qIEZsb3ctQ29udHJvbCBUcmFuc3BhcmVuY3kgTW9kZSAgICAgICAgICAqLworI2RlZmluZSBDT1IzX1NDREUgICAgICAgMHgxMCAgICAvKiBTcGVjaWFsIENoYXJhY3RlciBEZXRlY3Rpb24gRW5hYmxlICAgICAgKi8KKyNkZWZpbmUgQ09SM19SWFRIICAgICAgIDB4MGYgICAgLyogUlggRklGTyBUaHJlc2hvbGQgdmFsdWUgKDEtOCkgICAgICAgICAgICovCisKKworLyogQ2hhbm5lbCBDb250cm9sIFN0YXR1cyBSZWdpc3RlciAoUi9PKSAqLworCisjZGVmaW5lIENDU1JfUlhFTiAgICAgICAweDgwICAgIC8qIFJlY2VpdmVyIEVuYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQ1NSX1JYRkxPRkYgICAgMHg0MCAgICAvKiBSZWNlaXZlIEZsb3cgT2ZmIChYT0ZGIHdhcyBzZW50KSAgICAgICAgKi8KKyNkZWZpbmUgQ0NTUl9SWEZMT04gICAgIDB4MjAgICAgLyogUmVjZWl2ZSBGbG93IE9uIChYT04gd2FzIHNlbnQpICAgICAgICAgICovCisjZGVmaW5lIENDU1JfVFhFTiAgICAgICAweDA4ICAgIC8qIFRyYW5zbWl0dGVyIEVuYWJsZWQgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQ1NSX1RYRkxPRkYgICAgMHgwNCAgICAvKiBUcmFuc21pdCBGbG93IE9mZiAoZ290IFhPRkYpICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NTUl9UWEZMT04gICAgIDB4MDIgICAgLyogVHJhbnNtaXQgRmxvdyBPbiAoZ290IFhPTikgICAgICAgICAgICAgICovCisKKworLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiBSZWdpc3RlciAxIChSL1cpICovCisKKyNkZWZpbmUgTUNPUjFfRFNSWkQgICAgIDB4ODAgICAgLyogRGV0ZWN0IDAtPjEgdHJhbnNpdGlvbiBvZiBEU1IgICAgICAgICAgICovCisjZGVmaW5lIE1DT1IxX0NEWkQgICAgICAweDQwICAgIC8qIERldGVjdCAwLT4xIHRyYW5zaXRpb24gb2YgQ0QgICAgICAgICAgICAqLworI2RlZmluZSBNQ09SMV9DVFNaRCAgICAgMHgyMCAgICAvKiBEZXRlY3QgMC0+MSB0cmFuc2l0aW9uIG9mIENUUyAgICAgICAgICAgKi8KKyNkZWZpbmUgTUNPUjFfRFRSVEggICAgIDB4MGYgICAgLyogQXV0byBEVFIgZmxvdyBjb250cm9sIFRocmVzaG9sZCAoMS04KSAgICovCisjZGVmaW5lICBNQ09SMV9OT0RUUkZDICAgMHgwICAgICAvKiBBdXRvbWF0aWMgRFRSIGZsb3cgY29udHJvbCBkaXNhYmxlZCAgICAgKi8KKworCisvKiBNb2RlbSBDaGFuZ2UgT3B0aW9uIFJlZ2lzdGVyIDIgKFIvVykgKi8KKworI2RlZmluZSBNQ09SMl9EU1JPRCAgICAgMHg4MCAgICAvKiBEZXRlY3QgMS0+MCB0cmFuc2l0aW9uIG9mIERTUiAgICAgICAgICAgKi8KKyNkZWZpbmUgTUNPUjJfQ0RPRCAgICAgIDB4NDAgICAgLyogRGV0ZWN0IDEtPjAgdHJhbnNpdGlvbiBvZiBDRCAgICAgICAgICAgICovCisjZGVmaW5lIE1DT1IyX0NUU09EICAgICAweDIwICAgIC8qIERldGVjdCAxLT4wIHRyYW5zaXRpb24gb2YgQ1RTICAgICAgICAgICAqLworCisKKy8qIE1vZGVtIENoYW5nZSBSZWdpc3RlciAoUi9XKSAqLworCisjZGVmaW5lIE1DUl9EU1JDSEcgICAgICAweDgwICAgIC8qIERTUiBDaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQ1JfQ0RDSEcgICAgICAgMHg0MCAgICAvKiBDRCBDaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUNSX0NUU0NIRyAgICAgIDB4MjAgICAgLyogQ1RTIENoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworLyogTW9kZW0gU2lnbmFsIFZhbHVlIFJlZ2lzdGVyIChSL1cpICovCisKKyNkZWZpbmUgTVNWUl9EU1IgICAgICAgIDB4ODAgICAgLyogQ3VycmVudCBzdGF0ZSBvZiBEU1IgaW5wdXQgICAgICAgICAgICAgICovCisjZGVmaW5lIE1TVlJfQ0QgICAgICAgICAweDQwICAgIC8qIEN1cnJlbnQgc3RhdGUgb2YgQ0QgaW5wdXQgICAgICAgICAgICAgICAqLworI2RlZmluZSBNU1ZSX0NUUyAgICAgICAgMHgyMCAgICAvKiBDdXJyZW50IHN0YXRlIG9mIENUUyBpbnB1dCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVNWUl9EVFIgICAgICAgIDB4MDIgICAgLyogQ3VycmVudCBzdGF0ZSBvZiBEVFIgb3V0cHV0ICAgICAgICAgICAgICovCisjZGVmaW5lIE1TVlJfUlRTICAgICAgICAweDAxICAgIC8qIEN1cnJlbnQgc3RhdGUgb2YgUlRTIG91dHB1dCAgICAgICAgICAgICAqLworCisKKy8qIEVzY2FwZSBjaGFyYWN0ZXJzICovCisKKyNkZWZpbmUgQ0QxODBfQ19FU0MgICAgIDB4MDAgICAgLyogRXNjYXBlIGNoYXJhY3RlciAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX0NfU0JSSyAgICAweDgxICAgIC8qIFN0YXJ0IHNlbmRpbmcgQlJFQUsgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9DX0RFTEFZICAgMHg4MiAgICAvKiBEZWxheSBvdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfQ19FQlJLICAgIDB4ODMgICAgLyogU3RvcCBzZW5kaW5nIEJSRUFLICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcm9ja2V0LmMgYi9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjYmViMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yb2NrZXQuYwpAQCAtMCwwICsxLDMyOTkgQEAKKy8qCisgKiBSb2NrZXRQb3J0IGRldmljZSBkcml2ZXIgZm9yIExpbnV4CisgKgorICogV3JpdHRlbiBieSBUaGVvZG9yZSBUcydvLCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLgorICogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDMgYnkgQ29tdHJvbCwgSW5jLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qCisgKiBLZXJuZWwgU3luY2hyb25pemF0aW9uOgorICoKKyAqIFRoaXMgZHJpdmVyIGhhcyAyIGtlcm5lbCBjb250cm9sIHBhdGhzIC0gZXhjZXB0aW9uIGhhbmRsZXJzIChjYWxscyBpbnRvIHRoZSBkcml2ZXIKKyAqIGZyb20gdXNlciBtb2RlKSBhbmQgdGhlIHRpbWVyIGJvdHRvbSBoYWxmICh0YXNrbGV0KS4gIFRoaXMgaXMgYSBwb2xsZWQgZHJpdmVyLCBpbnRlcnJ1cHRzCisgKiBhcmUgbm90IHVzZWQuCisgKgorICogQ3JpdGljYWwgZGF0YTogCisgKiAtICBycF90YWJsZVtdLCBhY2Nlc3NlZCB0aHJvdWdoIHBhc3NlZCAiaW5mbyIgcG9pbnRlcnMsIGlzIGEgZ2xvYmFsIChzdGF0aWMpIGFycmF5IG9mIAorICogICAgc2VyaWFsIHBvcnQgc3RhdGUgaW5mb3JtYXRpb24gYW5kIHRoZSB4bWl0X2J1ZiBjaXJjdWxhciBidWZmZXIuICBQcm90ZWN0ZWQgYnkgCisgKiAgICBhIHBlciBwb3J0IHNwaW5sb2NrLgorICogLSAgeG1pdF9mbGFnc1tdLCBhbiBhcnJheSBvZiBpbnRzIGluZGV4ZWQgYnkgbGluZSAocG9ydCkgbnVtYmVyLCBpbmRpY2F0aW5nIHRoYXQgdGhlcmUKKyAqICAgIGlzIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQuICBQcm90ZWN0ZWQgYnkgYXRvbWljIGJpdCBvcGVyYXRpb25zLgorICogLSAgcnBfbnVtX3BvcnRzLCBpbnQgaW5kaWNhdGluZyBudW1iZXIgb2Ygb3BlbiBwb3J0cywgcHJvdGVjdGVkIGJ5IGF0b21pYyBvcGVyYXRpb25zLgorICogCisgKiBycF93cml0ZSgpIGFuZCBycF93cml0ZV9jaGFyKCkgZnVuY3Rpb25zIHVzZSBhIHBlciBwb3J0IHNlbWFwaG9yZSB0byBwcm90ZWN0IGFnYWluc3QKKyAqIHNpbXVsdGFuZW91cyBhY2Nlc3MgdG8gdGhlIHNhbWUgcG9ydCBieSBtb3JlIHRoYW4gb25lIHByb2Nlc3MuCisgKi8KKworLyoqKioqKiBEZWZpbmVzICoqKioqKi8KKyNpZmRlZiBQQ0lfTlVNX1JFU09VUkNFUworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTKGRldiwgcikgKChkZXYpLT5yZXNvdXJjZVtyXS5zdGFydCkKKyNlbHNlCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1MoZGV2LCByKSAoKGRldiktPmJhc2VfYWRkcmVzc1tyXSkKKyNlbmRpZgorCisjZGVmaW5lIFJPQ0tFVF9QQVJBTk9JQV9DSEVDSworI2RlZmluZSBST0NLRVRfRElTQUJMRV9TSU1VU0FHRQorCisjdW5kZWYgUk9DS0VUX1NPRlRfRkxPVworI3VuZGVmIFJPQ0tFVF9ERUJVR19PUEVOCisjdW5kZWYgUk9DS0VUX0RFQlVHX0lOVFIKKyN1bmRlZiBST0NLRVRfREVCVUdfV1JJVEUKKyN1bmRlZiBST0NLRVRfREVCVUdfRkxPVworI3VuZGVmIFJPQ0tFVF9ERUJVR19USFJPVFRMRQorI3VuZGVmIFJPQ0tFVF9ERUJVR19XQUlUX1VOVElMX1NFTlQKKyN1bmRlZiBST0NLRVRfREVCVUdfUkVDRUlWRQorI3VuZGVmIFJPQ0tFVF9ERUJVR19IQU5HVVAKKyN1bmRlZiBSRVZfUENJX09SREVSCisjdW5kZWYgUk9DS0VUX0RFQlVHX0lPCisKKyNkZWZpbmUgUE9MTF9QRVJJT0QgSFovMTAwCS8qICBQb2xsaW5nIHBlcmlvZCAuMDEgc2Vjb25kcyAoMTBtcykgKi8KKworLyoqKioqKiBLZXJuZWwgaW5jbHVkZXMgKioqKioqLworCisjaWZkZWYgTU9EVkVSU0lPTlMKKyNpbmNsdWRlIDxjb25maWcvbW9kdmVyc2lvbnMuaD4KKyNlbmRpZgkJCQkKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKy8qKioqKiogUm9ja2V0UG9ydCBpbmNsdWRlcyAqKioqKiovCisKKyNpbmNsdWRlICJyb2NrZXRfaW50LmgiCisjaW5jbHVkZSAicm9ja2V0LmgiCisKKyNkZWZpbmUgUk9DS0VUX1ZFUlNJT04gIjIuMDkiCisjZGVmaW5lIFJPQ0tFVF9EQVRFICIxMi1KdW5lLTIwMDMiCisKKy8qKioqKiogUm9ja2V0UG9ydCBMb2NhbCBWYXJpYWJsZXMgKioqKioqLworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnJvY2tldF9kcml2ZXI7CisKK3N0YXRpYyBzdHJ1Y3Qgcm9ja2V0X3ZlcnNpb24gZHJpdmVyX3ZlcnNpb24gPSB7CQorCVJPQ0tFVF9WRVJTSU9OLCBST0NLRVRfREFURQorfTsKKworc3RhdGljIHN0cnVjdCByX3BvcnQgKnJwX3RhYmxlW01BWF9SUF9QT1JUU107CSAgICAgICAvKiAgVGhlIG1haW4gcmVwb3NpdG9yeSBvZiBzZXJpYWwgcG9ydCBzdGF0ZSBpbmZvcm1hdGlvbi4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgeG1pdF9mbGFnc1tOVU1fQk9BUkRTXTsJICAgICAgIC8qICBCaXQgc2lnbmlmaWNhbnQsIGluZGljYXRlcyBwb3J0IGhhZCBkYXRhIHRvIHRyYW5zbWl0LiAqLworCQkJCQkJICAgICAgIC8qICBlZy4gIEJpdCAwIGluZGljYXRlcyBwb3J0IDAgaGFzIHhtaXQgZGF0YSwgLi4uICAgICAgICAqLworc3RhdGljIGF0b21pY190IHJwX251bV9wb3J0c19vcGVuOwkgICAgICAgICAgICAgICAvKiAgTnVtYmVyIG9mIHNlcmlhbCBwb3J0cyBvcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCByb2NrZXRfdGltZXI7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJvYXJkMTsJICAgICAgICAgICAgICAgICAgICAgICAvKiBJU0EgYWRkcmVzc2VzLCByZXRyaWV2ZWQgZnJvbSByb2NrZXRwb3J0LmNvbmYgICAgICAgICAgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJvYXJkMjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJvYXJkMzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJvYXJkNDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNvbnRyb2xsZXI7CitzdGF0aWMgaW50IHN1cHBvcnRfbG93X3NwZWVkOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbW9kZW0xOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbW9kZW0yOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbW9kZW0zOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbW9kZW00Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGMxMDRfMVs4XTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBjMTA0XzJbOF07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYzEwNF8zWzhdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGMxMDRfNFs4XTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nICpwYzEwNFs0XSA9IHsgcGMxMDRfMSwgcGMxMDRfMiwgcGMxMDRfMywgcGMxMDRfNCB9OworCitzdGF0aWMgaW50IHJwX2JhdWRfYmFzZVtOVU1fQk9BUkRTXTsJICAgICAgICAgICAgICAgLyogIEJvYXJkIGNvbmZpZyBpbmZvIChTb21lZGF5IG1ha2UgYSBwZXItYm9hcmQgc3RydWN0dXJlKSAgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJja3RwdF9pb19hZGRyW05VTV9CT0FSRFNdOworc3RhdGljIGludCByY2t0cHRfdHlwZVtOVU1fQk9BUkRTXTsKK3N0YXRpYyBpbnQgaXNfUENJW05VTV9CT0FSRFNdOworc3RhdGljIHJvY2tldE1vZGVsX3Qgcm9ja2V0TW9kZWxbTlVNX0JPQVJEU107CitzdGF0aWMgaW50IG1heF9ib2FyZDsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgYXJyYXlzIGRlZmluZSB0aGUgaW50ZXJydXB0IGJpdHMgY29ycmVzcG9uZGluZyB0byBlYWNoIEFJT1AuCisgKiBUaGVzZSBiaXRzIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgSVNBIGFuZCByZWd1bGFyIFBDSSBib2FyZHMgYW5kIHRoZQorICogVW5pdmVyc2FsIFBDSSBib2FyZHMuCisgKi8KKworc3RhdGljIFdvcmRfdCBhaW9wX2ludHJfYml0c1tBSU9QX0NUTF9TSVpFXSA9IHsKKwlBSU9QX0lOVFJfQklUXzAsCisJQUlPUF9JTlRSX0JJVF8xLAorCUFJT1BfSU5UUl9CSVRfMiwKKwlBSU9QX0lOVFJfQklUXzMKK307CisKK3N0YXRpYyBXb3JkX3QgdXBjaV9haW9wX2ludHJfYml0c1tBSU9QX0NUTF9TSVpFXSA9IHsKKwlVUENJX0FJT1BfSU5UUl9CSVRfMCwKKwlVUENJX0FJT1BfSU5UUl9CSVRfMSwKKwlVUENJX0FJT1BfSU5UUl9CSVRfMiwKKwlVUENJX0FJT1BfSU5UUl9CSVRfMworfTsKKworLyoKKyAqICBMaW5lIG51bWJlciBpcyB0aGUgdHR5U0l4IG51bWJlciAoeCksIHRoZSBNaW5vciBudW1iZXIuICBXZSAKKyAqICBhc3NpZ24gdGhlbSBzZXF1ZW50aWFsbHksIHN0YXJ0aW5nIGF0IHplcm8uICBUaGUgZm9sbG93aW5nIAorICogIGFycmF5IGtlZXBzIHRyYWNrIG9mIHRoZSBsaW5lIG51bWJlciBhc3NpZ25lZCB0byBhIGdpdmVuIGJvYXJkL2Fpb3AvY2hhbm5lbC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGluZU51bWJlcnNbTUFYX1JQX1BPUlRTXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5leHRMaW5lTnVtYmVyOworCisvKioqKiogIFJvY2tldFBvcnQgU3RhdGljIFByb3RvdHlwZXMgICAqKioqKioqKiovCitzdGF0aWMgaW50IF9faW5pdCBpbml0X0lTQShpbnQgaSk7CitzdGF0aWMgdm9pZCBycF93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOworc3RhdGljIHZvaWQgcnBfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgcm1TcGVha2VyUmVzZXQoQ09OVFJPTExFUl9UICogQ3RsUCwgdW5zaWduZWQgbG9uZyBtb2RlbCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBHZXRMaW5lTnVtYmVyKGludCBjdHJsLCBpbnQgYWlvcCwgaW50IGNoKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFNldExpbmVOdW1iZXIoaW50IGN0cmwsIGludCBhaW9wLCBpbnQgY2gpOworc3RhdGljIHZvaWQgcnBfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CisKKyNpZmRlZiBNT0RVTEUKK01PRFVMRV9BVVRIT1IoIlRoZW9kb3JlIFRzJ28iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tdHJvbCBSb2NrZXRQb3J0IGRyaXZlciIpOworbW9kdWxlX3BhcmFtKGJvYXJkMSwgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhib2FyZDEsICJJL08gcG9ydCBmb3IgKElTQSkgYm9hcmQgIzEiKTsKK21vZHVsZV9wYXJhbShib2FyZDIsIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYm9hcmQyLCAiSS9PIHBvcnQgZm9yIChJU0EpIGJvYXJkICMyIik7Cittb2R1bGVfcGFyYW0oYm9hcmQzLCB1bG9uZywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJvYXJkMywgIkkvTyBwb3J0IGZvciAoSVNBKSBib2FyZCAjMyIpOworbW9kdWxlX3BhcmFtKGJvYXJkNCwgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhib2FyZDQsICJJL08gcG9ydCBmb3IgKElTQSkgYm9hcmQgIzQiKTsKK21vZHVsZV9wYXJhbShjb250cm9sbGVyLCB1bG9uZywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNvbnRyb2xsZXIsICJJL08gcG9ydCBmb3IgKElTQSkgcm9ja2V0cG9ydCBjb250cm9sbGVyIik7Cittb2R1bGVfcGFyYW0oc3VwcG9ydF9sb3dfc3BlZWQsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhzdXBwb3J0X2xvd19zcGVlZCwgIjEgbWVhbnMgc3VwcG9ydCA1MCBiYXVkLCAwIG1lYW5zIHN1cHBvcnQgNDYwNDAwIGJhdWQiKTsKK21vZHVsZV9wYXJhbShtb2RlbTEsIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZW0xLCAiMSBtZWFucyAoSVNBKSBib2FyZCAjMSBpcyBhIFJvY2tldE1vZGVtIik7Cittb2R1bGVfcGFyYW0obW9kZW0yLCB1bG9uZywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGVtMiwgIjEgbWVhbnMgKElTQSkgYm9hcmQgIzIgaXMgYSBSb2NrZXRNb2RlbSIpOworbW9kdWxlX3BhcmFtKG1vZGVtMywgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhtb2RlbTMsICIxIG1lYW5zIChJU0EpIGJvYXJkICMzIGlzIGEgUm9ja2V0TW9kZW0iKTsKK21vZHVsZV9wYXJhbShtb2RlbTQsIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZW00LCAiMSBtZWFucyAoSVNBKSBib2FyZCAjNCBpcyBhIFJvY2tldE1vZGVtIik7Cittb2R1bGVfcGFyYW1fYXJyYXkocGMxMDRfMSwgdWxvbmcsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhwYzEwNF8xLCAic2V0IGludGVyZmFjZSB0eXBlcyBmb3IgSVNBKFBDMTA0KSBib2FyZCAjMSAoZS5nLiBwYzEwNF8xPTIzMiwyMzIsNDg1LDQ4NSwuLi4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShwYzEwNF8yLCB1bG9uZywgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBjMTA0XzIsICJzZXQgaW50ZXJmYWNlIHR5cGVzIGZvciBJU0EoUEMxMDQpIGJvYXJkICMyIChlLmcuIHBjMTA0XzI9MjMyLDIzMiw0ODUsNDg1LC4uLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KHBjMTA0XzMsIHVsb25nLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGMxMDRfMywgInNldCBpbnRlcmZhY2UgdHlwZXMgZm9yIElTQShQQzEwNCkgYm9hcmQgIzMgKGUuZy4gcGMxMDRfMz0yMzIsMjMyLDQ4NSw0ODUsLi4uIik7Cittb2R1bGVfcGFyYW1fYXJyYXkocGMxMDRfNCwgdWxvbmcsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhwYzEwNF80LCAic2V0IGludGVyZmFjZSB0eXBlcyBmb3IgSVNBKFBDMTA0KSBib2FyZCAjNCAoZS5nLiBwYzEwNF80PTIzMiwyMzIsNDg1LDQ4NSwuLi4iKTsKKworaW50IHJwX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBycF9jbGVhbnVwX21vZHVsZSh2b2lkKTsKKworbW9kdWxlX2luaXQocnBfaW5pdCk7Cittb2R1bGVfZXhpdChycF9jbGVhbnVwX21vZHVsZSk7CisKKyNlbmRpZgorCisjaWZkZWYgTU9EVUxFX0xJQ0VOU0UKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgTW9kdWxlIGNvZGUgc3RhcnRzIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgaW5saW5lIGludCByb2NrZXRfcGFyYW5vaWFfY2hlY2soc3RydWN0IHJfcG9ydCAqaW5mbywKKwkJCQkJY29uc3QgY2hhciAqcm91dGluZSkKK3sKKyNpZmRlZiBST0NLRVRfUEFSQU5PSUFfQ0hFQ0sKKwlpZiAoIWluZm8pCisJCXJldHVybiAxOworCWlmIChpbmZvLT5tYWdpYyAhPSBSUE9SVF9NQUdJQykgeworCQlwcmludGsoS0VSTl9JTkZPICJXYXJuaW5nOiBiYWQgbWFnaWMgbnVtYmVyIGZvciByb2NrZXRwb3J0IHN0cnVjdCBpbiAlc1xuIiwKKwkJICAgICByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKworLyogIFNlcmlhbCBwb3J0IHJlY2VpdmUgZGF0YSBmdW5jdGlvbi4gIENhbGxlZCAoZnJvbSB0aW1lciBwb2xsKSB3aGVuIGFuIEFJT1BJQyBzaWduYWxzIAorICogIHRoYXQgcmVjZWl2ZSBkYXRhIGlzIHByZXNlbnQgb24gYSBzZXJpYWwgcG9ydC4gIFB1bGxzIGRhdGEgZnJvbSBGSUZPLCBtb3ZlcyBpdCBpbnRvIHRoZSAKKyAqICB0dHkgbGF5ZXIuICAKKyAqLworc3RhdGljIHZvaWQgcnBfZG9fcmVjZWl2ZShzdHJ1Y3Qgcl9wb3J0ICppbmZvLAorCQkJICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJICBDSEFOTkVMX3QgKiBjcCwgdW5zaWduZWQgaW50IENoYW5TdGF0dXMpCit7CisJdW5zaWduZWQgaW50IENoYXJOU3RhdDsKKwlpbnQgVG9SZWN2LCB3UmVjdiwgc3BhY2UgPSAwLCBjb3VudDsKKwl1bnNpZ25lZCBjaGFyICpjYnVmOworCWNoYXIgKmZidWY7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisKKwlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKworCVRvUmVjdiA9IHNHZXRSeENudChjcCk7CisJaWYgKGxkKQorCQlzcGFjZSA9IGxkLT5yZWNlaXZlX3Jvb20odHR5KTsKKwlpZiAoc3BhY2UgPiAyICogVFRZX0ZMSVBCVUZfU0laRSkKKwkJc3BhY2UgPSAyICogVFRZX0ZMSVBCVUZfU0laRTsKKwljYnVmID0gdHR5LT5mbGlwLmNoYXJfYnVmOworCWZidWYgPSB0dHktPmZsaXAuZmxhZ19idWY7CisJY291bnQgPSAwOworI2lmZGVmIFJPQ0tFVF9ERUJVR19JTlRSCisJcHJpbnRrKEtFUk5fSU5GTyAicnBfZG9fcmVjZWl2ZSglZCwgJWQpLi4uIiwgVG9SZWN2LCBzcGFjZSk7CisjZW5kaWYKKworCS8qCisJICogZGV0ZXJtaW5lIGhvdyBtYW55IHdlIGNhbiBhY3R1YWxseSByZWFkIGluLiAgSWYgd2UgY2FuJ3QKKwkgKiByZWFkIGFueSBpbiB0aGVuIHdlIGhhdmUgYSBzb2Z0d2FyZSBvdmVycnVuIGNvbmRpdGlvbi4KKwkgKi8KKwlpZiAoVG9SZWN2ID4gc3BhY2UpCisJCVRvUmVjdiA9IHNwYWNlOworCisJaWYgKFRvUmVjdiA8PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIGlmIHN0YXR1cyBpbmRpY2F0ZXMgdGhlcmUgYXJlIGVycm9yZWQgY2hhcmFjdGVycyBpbiB0aGUKKwkgKiBGSUZPLCB0aGVuIGVudGVyIHN0YXR1cyBtb2RlIChhIHdvcmQgaW4gRklGTyBob2xkcworCSAqIGNoYXJhY3RlciBhbmQgc3RhdHVzKS4KKwkgKi8KKwlpZiAoQ2hhblN0YXR1cyAmIChSWEZPVkVSRkwgfCBSWEJSRUFLIHwgUlhGUkFNRSB8IFJYUEFSSVRZKSkgeworCQlpZiAoIShDaGFuU3RhdHVzICYgU1RBVE1PREUpKSB7CisjaWZkZWYgUk9DS0VUX0RFQlVHX1JFQ0VJVkUKKwkJCXByaW50ayhLRVJOX0lORk8gIkVudGVyaW5nIFNUQVRNT0RFLi4uIik7CisjZW5kaWYKKwkJCUNoYW5TdGF0dXMgfD0gU1RBVE1PREU7CisJCQlzRW5SeFN0YXR1c01vZGUoY3ApOworCQl9CisJfQorCisJLyogCisJICogaWYgd2UgcHJldmlvdXNseSBlbnRlcmVkIHN0YXR1cyBtb2RlLCB0aGVuIHJlYWQgZG93biB0aGUKKwkgKiBGSUZPIG9uZSB3b3JkIGF0IGEgdGltZSwgcHVsbGluZyBhcGFydCB0aGUgY2hhcmFjdGVyIGFuZAorCSAqIHRoZSBzdGF0dXMuICBVcGRhdGUgZXJyb3IgY291bnRlcnMgZGVwZW5kaW5nIG9uIHN0YXR1cworCSAqLworCWlmIChDaGFuU3RhdHVzICYgU1RBVE1PREUpIHsKKyNpZmRlZiBST0NLRVRfREVCVUdfUkVDRUlWRQorCQlwcmludGsoS0VSTl9JTkZPICJJZ25vcmUgJXgsIHJlYWQgJXguLi4iLCBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2ssCisJCSAgICAgICBpbmZvLT5yZWFkX3N0YXR1c19tYXNrKTsKKyNlbmRpZgorCQl3aGlsZSAoVG9SZWN2KSB7CisJCQlDaGFyTlN0YXQgPSBzSW5XKHNHZXRUeFJ4RGF0YUlPKGNwKSk7CisjaWZkZWYgUk9DS0VUX0RFQlVHX1JFQ0VJVkUKKwkJCXByaW50ayhLRVJOX0lORk8gIiV4Li4uIiwgQ2hhck5TdGF0KTsKKyNlbmRpZgorCQkJaWYgKENoYXJOU3RhdCAmIFNUTUJSRUFLSCkKKwkJCQlDaGFyTlN0YXQgJj0gfihTVE1GUkFNRUggfCBTVE1QQVJJVFlIKTsKKwkJCWlmIChDaGFyTlN0YXQgJiBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2spIHsKKwkJCQlUb1JlY3YtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCUNoYXJOU3RhdCAmPSBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOworCQkJaWYgKENoYXJOU3RhdCAmIFNUTUJSRUFLSCkKKwkJCQkqZmJ1ZisrID0gVFRZX0JSRUFLOworCQkJZWxzZSBpZiAoQ2hhck5TdGF0ICYgU1RNUEFSSVRZSCkKKwkJCQkqZmJ1ZisrID0gVFRZX1BBUklUWTsKKwkJCWVsc2UgaWYgKENoYXJOU3RhdCAmIFNUTUZSQU1FSCkKKwkJCQkqZmJ1ZisrID0gVFRZX0ZSQU1FOworCQkJZWxzZSBpZiAoQ2hhck5TdGF0ICYgU1RNUkNWUk9WUkgpCisJCQkJKmZidWYrKyA9IFRUWV9PVkVSUlVOOworCQkJZWxzZQorCQkJCSpmYnVmKysgPSAwOworCQkJKmNidWYrKyA9IENoYXJOU3RhdCAmIDB4ZmY7CisJCQljb3VudCsrOworCQkJVG9SZWN2LS07CisJCX0KKworCQkvKgorCQkgKiBhZnRlciB3ZSd2ZSBlbXB0aWVkIHRoZSBGSUZPIGluIHN0YXR1cyBtb2RlLCB0dXJuCisJCSAqIHN0YXR1cyBtb2RlIGJhY2sgb2ZmCisJCSAqLworCQlpZiAoc0dldFJ4Q250KGNwKSA9PSAwKSB7CisjaWZkZWYgUk9DS0VUX0RFQlVHX1JFQ0VJVkUKKwkJCXByaW50ayhLRVJOX0lORk8gIlN0YXR1cyBtb2RlIG9mZi5cbiIpOworI2VuZGlmCisJCQlzRGlzUnhTdGF0dXNNb2RlKGNwKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIHdlIGFyZW4ndCBpbiBzdGF0dXMgbW9kZSwgc28gcmVhZCBkb3duIHRoZSBGSUZPIHR3bworCQkgKiBjaGFyYWN0ZXJzIGF0IHRpbWUgYnkgZG9pbmcgcmVwZWF0ZWQgd29yZCBJTworCQkgKiB0cmFuc2Zlci4KKwkJICovCisJCXdSZWN2ID0gVG9SZWN2ID4+IDE7CisJCWlmICh3UmVjdikKKwkJCXNJblN0clcoc0dldFR4UnhEYXRhSU8oY3ApLCAodW5zaWduZWQgc2hvcnQgKikgY2J1Ziwgd1JlY3YpOworCQlpZiAoVG9SZWN2ICYgMSkKKwkJCWNidWZbVG9SZWN2IC0gMV0gPSBzSW5CKHNHZXRUeFJ4RGF0YUlPKGNwKSk7CisJCW1lbXNldChmYnVmLCAwLCBUb1JlY3YpOworCQljYnVmICs9IFRvUmVjdjsKKwkJZmJ1ZiArPSBUb1JlY3Y7CisJCWNvdW50ICs9IFRvUmVjdjsKKwl9CisJLyogIFB1c2ggdGhlIGRhdGEgdXAgdG8gdGhlIHR0eSBsYXllciAqLworCWxkLT5yZWNlaXZlX2J1Zih0dHksIHR0eS0+ZmxpcC5jaGFyX2J1ZiwgdHR5LT5mbGlwLmZsYWdfYnVmLCBjb3VudCk7CisJdHR5X2xkaXNjX2RlcmVmKGxkKTsKK30KKworLyoKKyAqICBTZXJpYWwgcG9ydCB0cmFuc21pdCBkYXRhIGZ1bmN0aW9uLiAgQ2FsbGVkIGZyb20gdGhlIHRpbWVyIHBvbGxpbmcgbG9vcCBhcyBhIAorICogIHJlc3VsdCBvZiBhIGJpdCBzZXQgaW4geG1pdF9mbGFnc1tdLCBpbmRpY2F0aW5nIGRhdGEgKGZyb20gdGhlIHR0eSBsYXllcikgaXMgcmVhZHkKKyAqICB0byBiZSBzZW50IG91dCB0aGUgc2VyaWFsIHBvcnQuICBEYXRhIGlzIGJ1ZmZlcmVkIGluIHJwX3RhYmxlW2xpbmVdLnhtaXRfYnVmLCBpdCBpcyAKKyAqICBtb3ZlZCB0byB0aGUgcG9ydCdzIHhtaXQgRklGTy4gICppbmZvIGlzIGNyaXRpY2FsIGRhdGEsIHByb3RlY3RlZCBieSBzcGlubG9ja3MuCisgKi8KK3N0YXRpYyB2b2lkIHJwX2RvX3RyYW5zbWl0KHN0cnVjdCByX3BvcnQgKmluZm8pCit7CisJaW50IGM7CisJQ0hBTk5FTF90ICpjcCA9ICZpbmZvLT5jaGFubmVsOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIFJPQ0tFVF9ERUJVR19JTlRSCisJcHJpbnRrKEtFUk5fSU5GTyAicnBfZG9fdHJhbnNtaXQgIik7CisjZW5kaWYKKwlpZiAoIWluZm8pCisJCXJldHVybjsKKwlpZiAoIWluZm8tPnR0eSkgeworCQlwcmludGsoS0VSTl9JTkZPICAicnA6IFdBUk5JTkcgcnBfZG9fdHJhbnNtaXQgY2FsbGVkIHdpdGggaW5mby0+dHR5PT1OVUxMXG4iKTsKKwkJY2xlYXJfYml0KChpbmZvLT5haW9wICogOCkgKyBpbmZvLT5jaGFuLCAodm9pZCAqKSAmeG1pdF9mbGFnc1tpbmZvLT5ib2FyZF0pOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJdHR5ID0gaW5mby0+dHR5OworCWluZm8tPnhtaXRfZmlmb19yb29tID0gVFhGSUZPX1NJWkUgLSBzR2V0VHhDbnQoY3ApOworCisJLyogIExvb3Agc2VuZGluZyBkYXRhIHRvIEZJRk8gdW50aWwgZG9uZSBvciBGSUZPIGZ1bGwgKi8KKwl3aGlsZSAoMSkgeworCQlpZiAodHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCkKKwkJCWJyZWFrOworCQljID0gbWluKGluZm8tPnhtaXRfZmlmb19yb29tLCBtaW4oaW5mby0+eG1pdF9jbnQsIFhNSVRfQlVGX1NJWkUgLSBpbmZvLT54bWl0X3RhaWwpKTsKKwkJaWYgKGMgPD0gMCB8fCBpbmZvLT54bWl0X2ZpZm9fcm9vbSA8PSAwKQorCQkJYnJlYWs7CisJCXNPdXRTdHJXKHNHZXRUeFJ4RGF0YUlPKGNwKSwgKHVuc2lnbmVkIHNob3J0ICopIChpbmZvLT54bWl0X2J1ZiArIGluZm8tPnhtaXRfdGFpbCksIGMgLyAyKTsKKwkJaWYgKGMgJiAxKQorCQkJc091dEIoc0dldFR4UnhEYXRhSU8oY3ApLCBpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWwgKyBjIC0gMV0pOworCQlpbmZvLT54bWl0X3RhaWwgKz0gYzsKKwkJaW5mby0+eG1pdF90YWlsICY9IFhNSVRfQlVGX1NJWkUgLSAxOworCQlpbmZvLT54bWl0X2NudCAtPSBjOworCQlpbmZvLT54bWl0X2ZpZm9fcm9vbSAtPSBjOworI2lmZGVmIFJPQ0tFVF9ERUJVR19JTlRSCisJCXByaW50ayhLRVJOX0lORk8gInR4ICVkIGNoYXJzLi4uIiwgYyk7CisjZW5kaWYKKwl9CisKKwlpZiAoaW5mby0+eG1pdF9jbnQgPT0gMCkKKwkJY2xlYXJfYml0KChpbmZvLT5haW9wICogOCkgKyBpbmZvLT5jaGFuLCAodm9pZCAqKSAmeG1pdF9mbGFnc1tpbmZvLT5ib2FyZF0pOworCisJaWYgKGluZm8tPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKSB7CisJCXR0eV93YWtldXAodHR5KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworI2lmZGVmIFJPQ0tFVFBPUlRfSEFWRV9QT0xMX1dBSVQKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnBvbGxfd2FpdCk7CisjZW5kaWYKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX0lOVFIKKwlwcmludGsoS0VSTl9JTkZPICIoJWQsJWQsJWQsJWQpLi4uIiwgaW5mby0+eG1pdF9jbnQsIGluZm8tPnhtaXRfaGVhZCwKKwkgICAgICAgaW5mby0+eG1pdF90YWlsLCBpbmZvLT54bWl0X2ZpZm9fcm9vbSk7CisjZW5kaWYKK30KKworLyoKKyAqICBDYWxsZWQgd2hlbiBhIHNlcmlhbCBwb3J0IHNpZ25hbHMgaXQgaGFzIHJlYWQgZGF0YSBpbiBpdCdzIFJYIEZJRk8uCisgKiAgSXQgY2hlY2tzIHdoYXQgaW50ZXJydXB0cyBhcmUgcGVuZGluZyBhbmQgc2VydmljZXMgdGhlbSwgaW5jbHVkaW5nCisgKiAgcmVjZWl2aW5nIHNlcmlhbCBkYXRhLiAgCisgKi8KK3N0YXRpYyB2b2lkIHJwX2hhbmRsZV9wb3J0KHN0cnVjdCByX3BvcnQgKmluZm8pCit7CisJQ0hBTk5FTF90ICpjcDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGludCBJbnRNYXNrLCBDaGFuU3RhdHVzOworCisJaWYgKCFpbmZvKQorCQlyZXR1cm47CisKKwlpZiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX0lOSVRJQUxJWkVEKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gInJwOiBXQVJOSU5HOiBycF9oYW5kbGVfcG9ydCBjYWxsZWQgd2l0aCBpbmZvLT5mbGFncyAmIE5PVF9JTklUXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIWluZm8tPnR0eSkgeworCQlwcmludGsoS0VSTl9JTkZPICJycDogV0FSTklORzogcnBfaGFuZGxlX3BvcnQgY2FsbGVkIHdpdGggaW5mby0+dHR5PT1OVUxMXG4iKTsKKwkJcmV0dXJuOworCX0KKwljcCA9ICZpbmZvLT5jaGFubmVsOworCXR0eSA9IGluZm8tPnR0eTsKKworCUludE1hc2sgPSBzR2V0Q2hhbkludElEKGNwKSAmIGluZm8tPmludG1hc2s7CisjaWZkZWYgUk9DS0VUX0RFQlVHX0lOVFIKKwlwcmludGsoS0VSTl9JTkZPICJycF9pbnRlcnJ1cHQgJTAyeC4uLiIsIEludE1hc2spOworI2VuZGlmCisJQ2hhblN0YXR1cyA9IHNHZXRDaGFuU3RhdHVzKGNwKTsKKwlpZiAoSW50TWFzayAmIFJYRl9UUklHKSB7CS8qIFJ4IEZJRk8gdHJpZ2dlciBsZXZlbCAqLworCQlycF9kb19yZWNlaXZlKGluZm8sIHR0eSwgY3AsIENoYW5TdGF0dXMpOworCX0KKwlpZiAoSW50TWFzayAmIERFTFRBX0NEKSB7CS8qIENEIGNoYW5nZSAgKi8KKyNpZiAoZGVmaW5lZChST0NLRVRfREVCVUdfT1BFTikgfHwgZGVmaW5lZChST0NLRVRfREVCVUdfSU5UUikgfHwgZGVmaW5lZChST0NLRVRfREVCVUdfSEFOR1VQKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAidHR5UiVkIENEIG5vdyAlcy4uLiIsIGluZm8tPmxpbmUsCisJCSAgICAgICAoQ2hhblN0YXR1cyAmIENEX0FDVCkgPyAib24iIDogIm9mZiIpOworI2VuZGlmCisJCWlmICghKENoYW5TdGF0dXMgJiBDRF9BQ1QpICYmIGluZm8tPmNkX3N0YXR1cykgeworI2lmZGVmIFJPQ0tFVF9ERUJVR19IQU5HVVAKKwkJCXByaW50ayhLRVJOX0lORk8gIkNEIGRyb3AsIGNhbGxpbmcgaGFuZ3VwLlxuIik7CisjZW5kaWYKKwkJCXR0eV9oYW5ndXAodHR5KTsKKwkJfQorCQlpbmZvLT5jZF9zdGF0dXMgPSAoQ2hhblN0YXR1cyAmIENEX0FDVCkgPyAxIDogMDsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCX0KKyNpZmRlZiBST0NLRVRfREVCVUdfSU5UUgorCWlmIChJbnRNYXNrICYgREVMVEFfQ1RTKSB7CS8qIENUUyBjaGFuZ2UgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1RTIGNoYW5nZS4uLlxuIik7CisJfQorCWlmIChJbnRNYXNrICYgREVMVEFfRFNSKSB7CS8qIERTUiBjaGFuZ2UgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiRFNSIGNoYW5nZS4uLlxuIik7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiAgVGhlIHRvcCBsZXZlbCBwb2xsaW5nIHJvdXRpbmUuICBSZXBlYXRzIGV2ZXJ5IDEvMTAwIEhaICgxMG1zKS4KKyAqLworc3RhdGljIHZvaWQgcnBfZG9fcG9sbCh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCUNPTlRST0xMRVJfdCAqY3RscDsKKwlpbnQgY3RybCwgYWlvcCwgY2gsIGxpbmUsIGk7CisJdW5zaWduZWQgaW50IHhtaXRtYXNrOworCXVuc2lnbmVkIGludCBDdGxNYXNrOworCXVuc2lnbmVkIGNoYXIgQWlvcE1hc2s7CisJV29yZF90IGJpdDsKKworCS8qICBXYWxrIHRocm91Z2ggYWxsIHRoZSBib2FyZHMgKGN0cmwncykgKi8KKwlmb3IgKGN0cmwgPSAwOyBjdHJsIDwgbWF4X2JvYXJkOyBjdHJsKyspIHsKKwkJaWYgKHJja3RwdF9pb19hZGRyW2N0cmxdIDw9IDApCisJCQljb250aW51ZTsKKworCQkvKiAgR2V0IGEgcHRyIHRvIHRoZSBib2FyZCdzIGNvbnRyb2wgc3RydWN0ICovCisJCWN0bHAgPSBzQ3RsTnVtVG9DdGxQdHIoY3RybCk7CisKKwkJLyogIEdldCB0aGUgaW50ZXJ1cHQgc3RhdHVzIGZyb20gdGhlIGJvYXJkICovCisjaWZkZWYgQ09ORklHX1BDSQorCQlpZiAoY3RscC0+QnVzVHlwZSA9PSBpc1BDSSkKKwkJCUN0bE1hc2sgPSBzUENJR2V0Q29udHJvbGxlckludFN0YXR1cyhjdGxwKTsKKwkJZWxzZQorI2VuZGlmCisJCQlDdGxNYXNrID0gc0dldENvbnRyb2xsZXJJbnRTdGF0dXMoY3RscCk7CisKKwkJLyogIENoZWNrIGlmIGFueSBBSU9QIHJlYWQgYml0cyBhcmUgc2V0ICovCisJCWZvciAoYWlvcCA9IDA7IEN0bE1hc2s7IGFpb3ArKykgeworCQkJYml0ID0gY3RscC0+QWlvcEludHJCaXRzW2Fpb3BdOworCQkJaWYgKEN0bE1hc2sgJiBiaXQpIHsKKwkJCQlDdGxNYXNrICY9IH5iaXQ7CisJCQkJQWlvcE1hc2sgPSBzR2V0QWlvcEludFN0YXR1cyhjdGxwLCBhaW9wKTsKKworCQkJCS8qICBDaGVjayBpZiBhbnkgcG9ydCByZWFkIGJpdHMgYXJlIHNldCAqLworCQkJCWZvciAoY2ggPSAwOyBBaW9wTWFzazsgIEFpb3BNYXNrID4+PSAxLCBjaCsrKSB7CisJCQkJCWlmIChBaW9wTWFzayAmIDEpIHsKKworCQkJCQkJLyogIEdldCB0aGUgbGluZSBudW1iZXIgKC9kZXYvdHR5UnggbnVtYmVyKS4gKi8KKwkJCQkJCS8qICBSZWFkIHRoZSBkYXRhIGZyb20gdGhlIHBvcnQuICovCisJCQkJCQlsaW5lID0gR2V0TGluZU51bWJlcihjdHJsLCBhaW9wLCBjaCk7CisJCQkJCQlycF9oYW5kbGVfcG9ydChycF90YWJsZVtsaW5lXSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQl4bWl0bWFzayA9IHhtaXRfZmxhZ3NbY3RybF07CisKKwkJLyoKKwkJICogIHhtaXRfZmxhZ3MgY29udGFpbnMgYml0LXNpZ25pZmljYW50IGZsYWdzLCBpbmRpY2F0aW5nIHRoZXJlIGlzIGRhdGEKKwkJICogIHRvIHhtaXQgb24gdGhlIHBvcnQuIEJpdCAwIGlzIHBvcnQgMCBvbiB0aGlzIGJvYXJkLCBiaXQgMSBpcyBwb3J0IAorCQkgKiAgMSwgLi4uICgzMiB0b3RhbCBwb3NzaWJsZSkuICBUaGUgdmFyaWFibGUgaSBoYXMgdGhlIGFpb3AgYW5kIGNoIAorCQkgKiAgbnVtYmVycyBlbmNvZGVkIGluIGl0IChwb3J0IDAtNyBhcmUgYWlvcDAsIDgtMTUgYXJlIGFpb3AxLCBldGMpLgorCQkgKi8KKwkJaWYgKHhtaXRtYXNrKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgcm9ja2V0TW9kZWxbY3RybF0ubnVtUG9ydHM7IGkrKykgeworCQkJCWlmICh4bWl0bWFzayAmICgxIDw8IGkpKSB7CisJCQkJCWFpb3AgPSAoaSAmIDB4MTgpID4+IDM7CisJCQkJCWNoID0gaSAmIDB4MDc7CisJCQkJCWxpbmUgPSBHZXRMaW5lTnVtYmVyKGN0cmwsIGFpb3AsIGNoKTsKKwkJCQkJcnBfZG9fdHJhbnNtaXQocnBfdGFibGVbbGluZV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogUmVzZXQgdGhlIHRpbWVyIHNvIHdlIGdldCBjYWxsZWQgYXQgdGhlIG5leHQgY2xvY2sgdGljayAoMTBtcykuCisJICovCisJaWYgKGF0b21pY19yZWFkKCZycF9udW1fcG9ydHNfb3BlbikpCisJCW1vZF90aW1lcigmcm9ja2V0X3RpbWVyLCBqaWZmaWVzICsgUE9MTF9QRVJJT0QpOworfQorCisvKgorICogIEluaXRpYWxpemVzIHRoZSByX3BvcnQgc3RydWN0dXJlIGZvciBhIHBvcnQsIGFzIHdlbGwgYXMgZW5hYmxpbmcgdGhlIHBvcnQgb24gCisgKiAgdGhlIGJvYXJkLiAgCisgKiAgSW5wdXRzOiAgYm9hcmQsIGFpb3AsIGNoYW4gbnVtYmVycworICovCitzdGF0aWMgdm9pZCBpbml0X3JfcG9ydChpbnQgYm9hcmQsIGludCBhaW9wLCBpbnQgY2hhbiwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJdW5zaWduZWQgcm9ja2V0TW9kZTsKKwlzdHJ1Y3Qgcl9wb3J0ICppbmZvOworCWludCBsaW5lOworCUNPTlRST0xMRVJfVCAqY3RscDsKKworCS8qICBHZXQgdGhlIG5leHQgYXZhaWxhYmxlIGxpbmUgbnVtYmVyICovCisJbGluZSA9IFNldExpbmVOdW1iZXIoYm9hcmQsIGFpb3AsIGNoYW4pOworCisJY3RscCA9IHNDdGxOdW1Ub0N0bFB0cihib2FyZCk7CisKKwkvKiAgR2V0IGEgcl9wb3J0IHN0cnVjdCBmb3IgdGhlIHBvcnQsIGZpbGwgaXQgaW4gYW5kIHNhdmUgaXQgZ2xvYmFsbHksIGluZGV4ZWQgYnkgbGluZSBudW1iZXIgKi8KKwlpbmZvID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCByX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ291bGRuJ3QgYWxsb2NhdGUgaW5mbyBzdHJ1Y3QgZm9yIGxpbmUgIyVkXG4iLCBsaW5lKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3Qgcl9wb3J0KSk7CisKKwlpbmZvLT5tYWdpYyA9IFJQT1JUX01BR0lDOworCWluZm8tPmxpbmUgPSBsaW5lOworCWluZm8tPmN0bHAgPSBjdGxwOworCWluZm8tPmJvYXJkID0gYm9hcmQ7CisJaW5mby0+YWlvcCA9IGFpb3A7CisJaW5mby0+Y2hhbiA9IGNoYW47CisJaW5mby0+Y2xvc2luZ193YWl0ID0gMzAwMDsKKwlpbmZvLT5jbG9zZV9kZWxheSA9IDUwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJaW5mby0+ZmxhZ3MgJj0gflJPQ0tFVF9NT0RFX01BU0s7CisJc3dpdGNoIChwYzEwNFtib2FyZF1bbGluZV0pIHsKKwljYXNlIDQyMjoKKwkJaW5mby0+ZmxhZ3MgfD0gUk9DS0VUX01PREVfUlM0MjI7CisJCWJyZWFrOworCWNhc2UgNDg1OgorCQlpbmZvLT5mbGFncyB8PSBST0NLRVRfTU9ERV9SUzQ4NTsKKwkJYnJlYWs7CisJY2FzZSAyMzI6CisJZGVmYXVsdDoKKwkJaW5mby0+ZmxhZ3MgfD0gUk9DS0VUX01PREVfUlMyMzI7CisJCWJyZWFrOworCX0KKworCWluZm8tPmludG1hc2sgPSBSWEZfVFJJRyB8IFRYRklGT19NVCB8IFNSQ19JTlQgfCBERUxUQV9DRCB8IERFTFRBX0NUUyB8IERFTFRBX0RTUjsKKwlpZiAoc0luaXRDaGFuKGN0bHAsICZpbmZvLT5jaGFubmVsLCBhaW9wLCBjaGFuKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlJvY2tldFBvcnQgc0luaXRDaGFuKCVkLCAlZCwgJWQpIGZhaWxlZCFcbiIsIGJvYXJkLCBhaW9wLCBjaGFuKTsKKwkJa2ZyZWUoaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwlyb2NrZXRNb2RlID0gaW5mby0+ZmxhZ3MgJiBST0NLRVRfTU9ERV9NQVNLOworCisJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9SVFNfVE9HR0xFKSB8fCAocm9ja2V0TW9kZSA9PSBST0NLRVRfTU9ERV9SUzQ4NSkpCisJCXNFblJUU1RvZ2dsZSgmaW5mby0+Y2hhbm5lbCk7CisJZWxzZQorCQlzRGlzUlRTVG9nZ2xlKCZpbmZvLT5jaGFubmVsKTsKKworCWlmIChjdGxwLT5ib2FyZFR5cGUgPT0gUk9DS0VUX1RZUEVfUEMxMDQpIHsKKwkJc3dpdGNoIChyb2NrZXRNb2RlKSB7CisJCWNhc2UgUk9DS0VUX01PREVfUlM0ODU6CisJCQlzU2V0SW50ZXJmYWNlTW9kZSgmaW5mby0+Y2hhbm5lbCwgSW50ZXJmYWNlTW9kZVJTNDg1KTsKKwkJCWJyZWFrOworCQljYXNlIFJPQ0tFVF9NT0RFX1JTNDIyOgorCQkJc1NldEludGVyZmFjZU1vZGUoJmluZm8tPmNoYW5uZWwsIEludGVyZmFjZU1vZGVSUzQyMik7CisJCQlicmVhazsKKwkJY2FzZSBST0NLRVRfTU9ERV9SUzIzMjoKKwkJZGVmYXVsdDoKKwkJCWlmIChpbmZvLT5mbGFncyAmIFJPQ0tFVF9SVFNfVE9HR0xFKQorCQkJCXNTZXRJbnRlcmZhY2VNb2RlKCZpbmZvLT5jaGFubmVsLCBJbnRlcmZhY2VNb2RlUlMyMzJUKTsKKwkJCWVsc2UKKwkJCQlzU2V0SW50ZXJmYWNlTW9kZSgmaW5mby0+Y2hhbm5lbCwgSW50ZXJmYWNlTW9kZVJTMjMyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fbG9ja19pbml0KCZpbmZvLT5zbG9jayk7CisJc2VtYV9pbml0KCZpbmZvLT53cml0ZV9zZW0sIDEpOworCXJwX3RhYmxlW2xpbmVdID0gaW5mbzsKKwlpZiAocGNpX2RldikKKwkJdHR5X3JlZ2lzdGVyX2RldmljZShyb2NrZXRfZHJpdmVyLCBsaW5lLCAmcGNpX2Rldi0+ZGV2KTsKK30KKworLyoKKyAqICBDb25maWd1cmVzIGEgcm9ja2V0cG9ydCBwb3J0IGFjY29yZGluZyB0byBpdHMgdGVybWlvIHNldHRpbmdzLiAgQ2FsbGVkIGZyb20gCisgKiAgdXNlciBtb2RlIGludG8gdGhlIGRyaXZlciAoZXhjZXB0aW9uIGhhbmRsZXIpLiAgKmluZm8gQ0QgbWFuaXB1bGF0aW9uIGlzIHNwaW5sb2NrIHByb3RlY3RlZC4KKyAqLworc3RhdGljIHZvaWQgY29uZmlndXJlX3JfcG9ydChzdHJ1Y3Qgcl9wb3J0ICppbmZvLAorCQkJICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJdW5zaWduZWQgY2ZsYWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCByb2NrZXRNb2RlOworCWludCBiaXRzLCBiYXVkLCBkaXZpc29yOworCUNIQU5ORUxfdCAqY3A7CisKKwlpZiAoIWluZm8tPnR0eSB8fCAhaW5mby0+dHR5LT50ZXJtaW9zKQorCQlyZXR1cm47CisJY3AgPSAmaW5mby0+Y2hhbm5lbDsKKwljZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCS8qIEJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisJaWYgKChjZmxhZyAmIENTSVpFKSA9PSBDUzgpIHsKKwkJc1NldERhdGE4KGNwKTsKKwkJYml0cyA9IDEwOworCX0gZWxzZSB7CisJCXNTZXREYXRhNyhjcCk7CisJCWJpdHMgPSA5OworCX0KKwlpZiAoY2ZsYWcgJiBDU1RPUEIpIHsKKwkJc1NldFN0b3AyKGNwKTsKKwkJYml0cysrOworCX0gZWxzZSB7CisJCXNTZXRTdG9wMShjcCk7CisJfQorCisJaWYgKGNmbGFnICYgUEFSRU5CKSB7CisJCXNFblBhcml0eShjcCk7CisJCWJpdHMrKzsKKwkJaWYgKGNmbGFnICYgUEFST0REKSB7CisJCQlzU2V0T2RkUGFyaXR5KGNwKTsKKwkJfSBlbHNlIHsKKwkJCXNTZXRFdmVuUGFyaXR5KGNwKTsKKwkJfQorCX0gZWxzZSB7CisJCXNEaXNQYXJpdHkoY3ApOworCX0KKworCS8qIGJhdWQgcmF0ZSAqLworCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpOworCWlmICghYmF1ZCkKKwkJYmF1ZCA9IDk2MDA7CisJZGl2aXNvciA9ICgocnBfYmF1ZF9iYXNlW2luZm8tPmJvYXJkXSArIChiYXVkID4+IDEpKSAvIGJhdWQpIC0gMTsKKwlpZiAoKGRpdmlzb3IgPj0gODE5MiB8fCBkaXZpc29yIDwgMCkgJiYgb2xkX3Rlcm1pb3MpIHsKKwkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVRDsKKwkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9CisJCSAgICAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCk7CisJCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpOworCQlpZiAoIWJhdWQpCisJCQliYXVkID0gOTYwMDsKKwkJZGl2aXNvciA9IChycF9iYXVkX2Jhc2VbaW5mby0+Ym9hcmRdIC8gYmF1ZCkgLSAxOworCX0KKwlpZiAoZGl2aXNvciA+PSA4MTkyIHx8IGRpdmlzb3IgPCAwKSB7CisJCWJhdWQgPSA5NjAwOworCQlkaXZpc29yID0gKHJwX2JhdWRfYmFzZVtpbmZvLT5ib2FyZF0gLyBiYXVkKSAtIDE7CisJfQorCWluZm8tPmNwcyA9IGJhdWQgLyBiaXRzOworCXNTZXRCYXVkKGNwLCBkaXZpc29yKTsKKworCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKKwkJaW5mby0+aW50bWFzayB8PSBERUxUQV9DVFM7CisJCXNFbkNUU0Zsb3dDdGwoY3ApOworCX0gZWxzZSB7CisJCWluZm8tPmludG1hc2sgJj0gfkRFTFRBX0NUUzsKKwkJc0Rpc0NUU0Zsb3dDdGwoY3ApOworCX0KKwlpZiAoY2ZsYWcgJiBDTE9DQUwpIHsKKwkJaW5mby0+aW50bWFzayAmPSB+REVMVEFfQ0Q7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCWlmIChzR2V0Q2hhblN0YXR1cyhjcCkgJiBDRF9BQ1QpCisJCQlpbmZvLT5jZF9zdGF0dXMgPSAxOworCQllbHNlCisJCQlpbmZvLT5jZF9zdGF0dXMgPSAwOworCQlpbmZvLT5pbnRtYXNrIHw9IERFTFRBX0NEOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCX0KKworCS8qCisJICogSGFuZGxlIHNvZnR3YXJlIGZsb3cgY29udHJvbCBpbiB0aGUgYm9hcmQKKwkgKi8KKyNpZmRlZiBST0NLRVRfU09GVF9GTE9XCisJaWYgKElfSVhPTihpbmZvLT50dHkpKSB7CisJCXNFblR4U29mdEZsb3dDdGwoY3ApOworCQlpZiAoSV9JWEFOWShpbmZvLT50dHkpKSB7CisJCQlzRW5JWEFOWShjcCk7CisJCX0gZWxzZSB7CisJCQlzRGlzSVhBTlkoY3ApOworCQl9CisJCXNTZXRUeFhPTkNoYXIoY3AsIFNUQVJUX0NIQVIoaW5mby0+dHR5KSk7CisJCXNTZXRUeFhPRkZDaGFyKGNwLCBTVE9QX0NIQVIoaW5mby0+dHR5KSk7CisJfSBlbHNlIHsKKwkJc0Rpc1R4U29mdEZsb3dDdGwoY3ApOworCQlzRGlzSVhBTlkoY3ApOworCQlzQ2xyVHhYT0ZGKGNwKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogU2V0IHVwIGlnbm9yZS9yZWFkIG1hc2sgd29yZHMKKwkgKi8KKwlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gU1RNUkNWUk9WUkggfCAweEZGOworCWlmIChJX0lOUENLKGluZm8tPnR0eSkpCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gU1RNRlJBTUVIIHwgU1RNUEFSSVRZSDsKKwlpZiAoSV9CUktJTlQoaW5mby0+dHR5KSB8fCBJX1BBUk1SSyhpbmZvLT50dHkpKQorCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFNUTUJSRUFLSDsKKworCS8qCisJICogQ2hhcmFjdGVycyB0byBpZ25vcmUKKwkgKi8KKwlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgPSAwOworCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKQorCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gU1RNRlJBTUVIIHwgU1RNUEFSSVRZSDsKKwlpZiAoSV9JR05CUksoaW5mby0+dHR5KSkgeworCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gU1RNQlJFQUtIOworCQkvKgorCQkgKiBJZiB3ZSdyZSBpZ25vcmluZyBwYXJpdHkgYW5kIGJyZWFrIGluZGljYXRvcnMsCisJCSAqIGlnbm9yZSBvdmVycnVucyB0b28uICAoRm9yIHJlYWwgcmF3IHN1cHBvcnQpLgorCQkgKi8KKwkJaWYgKElfSUdOUEFSKGluZm8tPnR0eSkpCisJCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gU1RNUkNWUk9WUkg7CisJfQorCisJcm9ja2V0TW9kZSA9IGluZm8tPmZsYWdzICYgUk9DS0VUX01PREVfTUFTSzsKKworCWlmICgoaW5mby0+ZmxhZ3MgJiBST0NLRVRfUlRTX1RPR0dMRSkKKwkgICAgfHwgKHJvY2tldE1vZGUgPT0gUk9DS0VUX01PREVfUlM0ODUpKQorCQlzRW5SVFNUb2dnbGUoY3ApOworCWVsc2UKKwkJc0Rpc1JUU1RvZ2dsZShjcCk7CisKKwlzU2V0UlRTKCZpbmZvLT5jaGFubmVsKTsKKworCWlmIChjcC0+Q3RsUC0+Ym9hcmRUeXBlID09IFJPQ0tFVF9UWVBFX1BDMTA0KSB7CisJCXN3aXRjaCAocm9ja2V0TW9kZSkgeworCQljYXNlIFJPQ0tFVF9NT0RFX1JTNDg1OgorCQkJc1NldEludGVyZmFjZU1vZGUoY3AsIEludGVyZmFjZU1vZGVSUzQ4NSk7CisJCQlicmVhazsKKwkJY2FzZSBST0NLRVRfTU9ERV9SUzQyMjoKKwkJCXNTZXRJbnRlcmZhY2VNb2RlKGNwLCBJbnRlcmZhY2VNb2RlUlM0MjIpOworCQkJYnJlYWs7CisJCWNhc2UgUk9DS0VUX01PREVfUlMyMzI6CisJCWRlZmF1bHQ6CisJCQlpZiAoaW5mby0+ZmxhZ3MgJiBST0NLRVRfUlRTX1RPR0dMRSkKKwkJCQlzU2V0SW50ZXJmYWNlTW9kZShjcCwgSW50ZXJmYWNlTW9kZVJTMjMyVCk7CisJCQllbHNlCisJCQkJc1NldEludGVyZmFjZU1vZGUoY3AsIEludGVyZmFjZU1vZGVSUzIzMik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyogIGluZm8tPmNvdW50IGlzIGNvbnNpZGVyZWQgY3JpdGljYWwsIHByb3RlY3RlZCBieSBzcGlubG9ja3MuICAqLworc3RhdGljIGludCBibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICBzdHJ1Y3Qgcl9wb3J0ICppbmZvKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludCByZXR2YWw7CisJaW50IGRvX2Nsb2NhbCA9IDAsIGV4dHJhX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCisJICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCisJICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpCisJCXJldHVybiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX0hVUF9OT1RJRlkpID8gLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisJaWYgKGluZm8tPmZsYWdzICYgUk9DS0VUX0NMT1NJTkcpIHsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCXJldHVybiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX0hVUF9OT1RJRlkpID8gLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisJfQorCisJLyoKKwkgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIG9yIHRoZSBwb3J0IGlzIG5vdCBlbmFibGVkLAorCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KKwkgKi8KKwlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fCAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7CisJCWluZm8tPmZsYWdzIHw9IFJPQ0tFVF9OT1JNQUxfQUNUSVZFOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkKKwkJZG9fY2xvY2FsID0gMTsKKworCS8qCisJICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUgZnJlZS4gIFdoaWxlIHdlIGFyZSBpbgorCSAqIHRoaXMgbG9vcCwgaW5mby0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQgcnBfY2xvc2UoKSBrbm93cyB3aGVuIHRvIGZyZWUgdGhpbmdzLiAgCisgICAgICAgICAqIFdlIHJlc3RvcmUgaXQgdXBvbiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworI2lmZGVmIFJPQ0tFVF9ERUJVR19PUEVOCisJcHJpbnRrKEtFUk5fSU5GTyAiYmxvY2tfdGlsX3JlYWR5IGJlZm9yZSBibG9jazogdHR5UiVkLCBjb3VudCA9ICVkXG4iLCBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7CisjZW5kaWYKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworI2lmZGVmIFJPQ0tFVF9ESVNBQkxFX1NJTVVTQUdFCisJaW5mby0+ZmxhZ3MgfD0gUk9DS0VUX05PUk1BTF9BQ1RJVkU7CisjZWxzZQorCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlleHRyYV9jb3VudCA9IDE7CisJCWluZm8tPmNvdW50LS07CisJfQorI2VuZGlmCisJaW5mby0+YmxvY2tlZF9vcGVuKys7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSB7CisJCQlzU2V0RFRSKCZpbmZvLT5jaGFubmVsKTsKKwkJCXNTZXRSVFMoJmluZm8tPmNoYW5uZWwpOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8ICEoaW5mby0+ZmxhZ3MgJiBST0NLRVRfSU5JVElBTElaRUQpKSB7CisJCQlpZiAoaW5mby0+ZmxhZ3MgJiBST0NLRVRfSFVQX05PVElGWSkKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZWxzZQorCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCWlmICghKGluZm8tPmZsYWdzICYgUk9DS0VUX0NMT1NJTkcpICYmIChkb19jbG9jYWwgfHwgKHNHZXRDaGFuU3RhdHVzTG8oJmluZm8tPmNoYW5uZWwpICYgQ0RfQUNUKSkpCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorI2lmZGVmIFJPQ0tFVF9ERUJVR19PUEVOCisJCXByaW50ayhLRVJOX0lORk8gImJsb2NrX3RpbF9yZWFkeSBibG9ja2luZzogdHR5UiVkLCBjb3VudCA9ICVkLCBmbGFncz0weCUweFxuIiwKKwkJICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCwgaW5mby0+ZmxhZ3MpOworI2VuZGlmCisJCXNjaGVkdWxlKCk7CS8qICBEb24ndCBob2xkIHNwaW5sb2NrIGhlcmUsIHdpbGwgaGFuZyBQQyAqLworCX0KKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCWlmIChleHRyYV9jb3VudCkKKwkJaW5mby0+Y291bnQrKzsKKwlpbmZvLT5ibG9ja2VkX29wZW4tLTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKyNpZmRlZiBST0NLRVRfREVCVUdfT1BFTgorCXByaW50ayhLRVJOX0lORk8gImJsb2NrX3RpbF9yZWFkeSBhZnRlciBibG9ja2luZzogdHR5UiVkLCBjb3VudCA9ICVkXG4iLAorCSAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7CisjZW5kaWYKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWluZm8tPmZsYWdzIHw9IFJPQ0tFVF9OT1JNQUxfQUNUSVZFOworCXJldHVybiAwOworfQorCisvKgorICogIEV4Y2VwdGlvbiBoYW5kbGVyIHRoYXQgb3BlbnMgYSBzZXJpYWwgcG9ydC4gIENyZWF0ZXMgeG1pdF9idWYgc3RvcmFnZSwgZmlsbHMgaW4gCisgKiAgcG9ydCdzIHJfcG9ydCBzdHJ1Y3QuICBJbml0aWFsaXplcyB0aGUgcG9ydCBoYXJkd2FyZS4gIAorICovCitzdGF0aWMgaW50IHJwX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbzsKKwlpbnQgbGluZSA9IDAsIHJldHZhbDsKKwlDSEFOTkVMX3QgKmNwOworCXVuc2lnbmVkIGxvbmcgcGFnZTsKKworCWxpbmUgPSBUVFlfR0VUX0xJTkUodHR5KTsKKwlpZiAoKGxpbmUgPCAwKSB8fCAobGluZSA+PSBNQVhfUlBfUE9SVFMpIHx8ICgoaW5mbyA9IHJwX3RhYmxlW2xpbmVdKSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXBhZ2UgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChpbmZvLT5mbGFncyAmIFJPQ0tFVF9DTE9TSU5HKSB7CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOworCQlmcmVlX3BhZ2UocGFnZSk7CisJCXJldHVybiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX0hVUF9OT1RJRlkpID8gLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisJfQorCisJLyoKKwkgKiBXZSBtdXN0IG5vdCBzbGVlcCBmcm9tIGhlcmUgdW50aWwgdGhlIHBvcnQgaXMgbWFya2VkIGZ1bGx5IGluIHVzZS4KKwkgKi8KKwlpZiAoaW5mby0+eG1pdF9idWYpCisJCWZyZWVfcGFnZShwYWdlKTsKKwllbHNlCisJCWluZm8tPnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKKworCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOworCWluZm8tPnR0eSA9IHR0eTsKKworCWlmIChpbmZvLT5jb3VudCsrID09IDApIHsKKwkJYXRvbWljX2luYygmcnBfbnVtX3BvcnRzX29wZW4pOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX09QRU4KKwkJcHJpbnRrKEtFUk5fSU5GTyAicm9ja2V0IG1vZCsrID0gJWQuLi4iLCBhdG9taWNfcmVhZCgmcnBfbnVtX3BvcnRzX29wZW4pKTsKKyNlbmRpZgorCX0KKyNpZmRlZiBST0NLRVRfREVCVUdfT1BFTgorCXByaW50ayhLRVJOX0lORk8gInJwX29wZW4gdHR5UiVkLCBjb3VudD0lZFxuIiwgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisKKwkvKgorCSAqIEluZm8tPmNvdW50IGlzIG5vdyAxOyBzbyBpdCdzIHNhZmUgdG8gc2xlZXAgbm93LgorCSAqLworCWluZm8tPnNlc3Npb24gPSBjdXJyZW50LT5zaWduYWwtPnNlc3Npb247CisJaW5mby0+cGdycCA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7CisKKwlpZiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX0lOSVRJQUxJWkVEKSA9PSAwKSB7CisJCWNwID0gJmluZm8tPmNoYW5uZWw7CisJCXNTZXRSeFRyaWdnZXIoY3AsIFRSSUdfMSk7CisJCWlmIChzR2V0Q2hhblN0YXR1cyhjcCkgJiBDRF9BQ1QpCisJCQlpbmZvLT5jZF9zdGF0dXMgPSAxOworCQllbHNlCisJCQlpbmZvLT5jZF9zdGF0dXMgPSAwOworCQlzRGlzUnhTdGF0dXNNb2RlKGNwKTsKKwkJc0ZsdXNoUnhGSUZPKGNwKTsKKwkJc0ZsdXNoVHhGSUZPKGNwKTsKKworCQlzRW5JbnRlcnJ1cHRzKGNwLCAoVFhJTlRfRU4gfCBNQ0lOVF9FTiB8IFJYSU5UX0VOIHwgU1JDSU5UX0VOIHwgQ0hBTklOVF9FTikpOworCQlzU2V0UnhUcmlnZ2VyKGNwLCBUUklHXzEpOworCisJCXNHZXRDaGFuU3RhdHVzKGNwKTsKKwkJc0Rpc1J4U3RhdHVzTW9kZShjcCk7CisJCXNDbHJUeFhPRkYoY3ApOworCisJCXNEaXNDVFNGbG93Q3RsKGNwKTsKKwkJc0Rpc1R4U29mdEZsb3dDdGwoY3ApOworCisJCXNFblJ4RklGTyhjcCk7CisJCXNFblRyYW5zbWl0KGNwKTsKKworCQlpbmZvLT5mbGFncyB8PSBST0NLRVRfSU5JVElBTElaRUQ7CisKKwkJLyoKKwkJICogU2V0IHVwIHRoZSB0dHktPmFsdF9zcGVlZCBrbHVkZ2UKKwkJICovCisJCWlmICgoaW5mby0+ZmxhZ3MgJiBST0NLRVRfU1BEX01BU0spID09IFJPQ0tFVF9TUERfSEkpCisJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDU3NjAwOworCQlpZiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX1NQRF9NQVNLKSA9PSBST0NLRVRfU1BEX1ZISSkKKwkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMTE1MjAwOworCQlpZiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX1NQRF9NQVNLKSA9PSBST0NLRVRfU1BEX1NISSkKKwkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMjMwNDAwOworCQlpZiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX1NQRF9NQVNLKSA9PSBST0NLRVRfU1BEX1dBUlApCisJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDQ2MDgwMDsKKworCQljb25maWd1cmVfcl9wb3J0KGluZm8sIE5VTEwpOworCQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpIHsKKwkJCXNTZXREVFIoY3ApOworCQkJc1NldFJUUyhjcCk7CisJCX0KKwl9CisJLyogIFN0YXJ0cyAob3IgcmVzZXRzKSB0aGUgbWFpbnQgcG9sbGluZyBsb29wICovCisJbW9kX3RpbWVyKCZyb2NrZXRfdGltZXIsIGppZmZpZXMgKyBQT0xMX1BFUklPRCk7CisKKwlyZXR2YWwgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBpbmZvKTsKKwlpZiAocmV0dmFsKSB7CisjaWZkZWYgUk9DS0VUX0RFQlVHX09QRU4KKwkJcHJpbnRrKEtFUk5fSU5GTyAicnBfb3BlbiByZXR1cm5pbmcgYWZ0ZXIgYmxvY2tfdGlsX3JlYWR5IHdpdGggJWRcbiIsIHJldHZhbCk7CisjZW5kaWYKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgRXhjZXB0aW9uIGhhbmRsZXIgdGhhdCBjbG9zZXMgYSBzZXJpYWwgcG9ydC4gaW5mby0+Y291bnQgaXMgY29uc2lkZXJlZCBjcml0aWNhbC4gCisgKi8KK3N0YXRpYyB2b2lkIHJwX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRpbWVvdXQ7CisJQ0hBTk5FTF90ICpjcDsKKwkKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF9jbG9zZSIpKQorCQlyZXR1cm47CisKKyNpZmRlZiBST0NLRVRfREVCVUdfT1BFTgorCXByaW50ayhLRVJOX0lORk8gInJwX2Nsb3NlIHR0eVIlZCwgY291bnQgPSAlZFxuIiwgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcmV0dXJuOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChpbmZvLT5jb3VudCAhPSAxKSkgeworCQkvKgorCQkgKiBVaCwgb2guICB0dHktPmNvdW50IGlzIDEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHR0eQorCQkgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4gIEluZm8tPmNvdW50IHNob3VsZCBhbHdheXMKKwkJICogYmUgb25lIGluIHRoZXNlIGNvbmRpdGlvbnMuICBJZiBpdCdzIGdyZWF0ZXIgdGhhbgorCQkgKiBvbmUsIHdlJ3ZlIGdvdCByZWFsIHByb2JsZW1zLCBzaW5jZSBpdCBtZWFucyB0aGUKKwkJICogc2VyaWFsIHBvcnQgd29uJ3QgYmUgc2h1dGRvd24uCisJCSAqLworCQlwcmludGsoS0VSTl9JTkZPICJycF9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50OyB0dHktPmNvdW50IGlzIDEsICIKKwkJICAgICAgICJpbmZvLT5jb3VudCBpcyAlZFxuIiwgaW5mby0+Y291bnQpOworCQlpbmZvLT5jb3VudCA9IDE7CisJfQorCWlmICgtLWluZm8tPmNvdW50IDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJycF9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50IGZvciB0dHlSJWQ6ICVkXG4iLAorCQkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworCQlpbmZvLT5jb3VudCA9IDA7CisJfQorCWlmIChpbmZvLT5jb3VudCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWluZm8tPmZsYWdzIHw9IFJPQ0tFVF9DTE9TSU5HOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCisJLyoKKwkgKiBOb3RpZnkgdGhlIGxpbmUgZGlzY3BsaW5lIHRvIG9ubHkgcHJvY2VzcyBYT04vWE9GRiBjaGFyYWN0ZXJzCisJICovCisJdHR5LT5jbG9zaW5nID0gMTsKKworCS8qCisJICogSWYgdHJhbnNtaXNzaW9uIHdhcyB0aHJvdHRsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHJlcXVlc3QsCisJICoganVzdCBmbHVzaCB0aGUgeG1pdCBidWZmZXIuCisJICovCisJaWYgKHR0eS0+Zmxvd19zdG9wcGVkKQorCQlycF9mbHVzaF9idWZmZXIodHR5KTsKKworCS8qCisJICogV2FpdCBmb3IgdGhlIHRyYW5zbWl0IGJ1ZmZlciB0byBjbGVhcgorCSAqLworCWlmIChpbmZvLT5jbG9zaW5nX3dhaXQgIT0gUk9DS0VUX0NMT1NJTkdfV0FJVF9OT05FKQorCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+Y2xvc2luZ193YWl0KTsKKwkvKgorCSAqIEJlZm9yZSB3ZSBkcm9wIERUUiwgbWFrZSBzdXJlIHRoZSBVQVJUIHRyYW5zbWl0dGVyCisJICogaGFzIGNvbXBsZXRlbHkgZHJhaW5lZDsgdGhpcyBpcyBlc3BlY2lhbGx5CisJICogaW1wb3J0YW50IGlmIHRoZXJlIGlzIGEgdHJhbnNtaXQgRklGTyEKKwkgKi8KKwl0aW1lb3V0ID0gKHNHZXRUeENudChjcCkgKyAxKSAqIEhaIC8gaW5mby0+Y3BzOworCWlmICh0aW1lb3V0ID09IDApCisJCXRpbWVvdXQgPSAxOworCXJwX3dhaXRfdW50aWxfc2VudCh0dHksIHRpbWVvdXQpOworCWNsZWFyX2JpdCgoaW5mby0+YWlvcCAqIDgpICsgaW5mby0+Y2hhbiwgKHZvaWQgKikgJnhtaXRfZmxhZ3NbaW5mby0+Ym9hcmRdKTsKKworCXNEaXNUcmFuc21pdChjcCk7CisJc0Rpc0ludGVycnVwdHMoY3AsIChUWElOVF9FTiB8IE1DSU5UX0VOIHwgUlhJTlRfRU4gfCBTUkNJTlRfRU4gfCBDSEFOSU5UX0VOKSk7CisJc0Rpc0NUU0Zsb3dDdGwoY3ApOworCXNEaXNUeFNvZnRGbG93Q3RsKGNwKTsKKwlzQ2xyVHhYT0ZGKGNwKTsKKwlzRmx1c2hSeEZJRk8oY3ApOworCXNGbHVzaFR4RklGTyhjcCk7CisJc0NsclJUUyhjcCk7CisJaWYgKENfSFVQQ0wodHR5KSkKKwkJc0NsckRUUihjcCk7CisKKwlpZiAoVFRZX0RSSVZFUl9GTFVTSF9CVUZGRVJfRVhJU1RTKHR0eSkpCisJCVRUWV9EUklWRVJfRkxVU0hfQlVGRkVSKHR0eSk7CisJCQorCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCisJY2xlYXJfYml0KChpbmZvLT5haW9wICogOCkgKyBpbmZvLT5jaGFuLCAodm9pZCAqKSAmeG1pdF9mbGFnc1tpbmZvLT5ib2FyZF0pOworCisJaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgeworCQlpZiAoaW5mby0+Y2xvc2VfZGVsYXkpIHsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoaW5mby0+Y2xvc2VfZGVsYXkpKTsKKwkJfQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJfSBlbHNlIHsKKwkJaWYgKGluZm8tPnhtaXRfYnVmKSB7CisJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGluZm8tPnhtaXRfYnVmKTsKKwkJCWluZm8tPnhtaXRfYnVmID0gTlVMTDsKKwkJfQorCX0KKwlpbmZvLT5mbGFncyAmPSB+KFJPQ0tFVF9JTklUSUFMSVpFRCB8IFJPQ0tFVF9DTE9TSU5HIHwgUk9DS0VUX05PUk1BTF9BQ1RJVkUpOworCXR0eS0+Y2xvc2luZyA9IDA7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5jbG9zZV93YWl0KTsKKwlhdG9taWNfZGVjKCZycF9udW1fcG9ydHNfb3Blbik7CisKKyNpZmRlZiBST0NLRVRfREVCVUdfT1BFTgorCXByaW50ayhLRVJOX0lORk8gInJvY2tldCBtb2QtLSA9ICVkLi4uIiwgYXRvbWljX3JlYWQoJnJwX251bV9wb3J0c19vcGVuKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAicnBfY2xvc2UgdHR5UiVkIGNvbXBsZXRlIHNodXRkb3duXG4iLCBpbmZvLT5saW5lKTsKKyNlbmRpZgorCit9CisKK3N0YXRpYyB2b2lkIHJwX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkgICBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJQ0hBTk5FTF90ICpjcDsKKwl1bnNpZ25lZCBjZmxhZzsKKworCWlmIChyb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX3NldF90ZXJtaW9zIikpCisJCXJldHVybjsKKworCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJaWYgKGNmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFRoaXMgZHJpdmVyIGRvZXNuJ3Qgc3VwcG9ydCBDUzUgb3IgQ1M2CisJICovCisJaWYgKCgoY2ZsYWcgJiBDU0laRSkgPT0gQ1M1KSB8fCAoKGNmbGFnICYgQ1NJWkUpID09IENTNikpCisJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9CisJCSAgICAoKGNmbGFnICYgfkNTSVpFKSB8IChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENTSVpFKSk7CisKKwljb25maWd1cmVfcl9wb3J0KGluZm8sIG9sZF90ZXJtaW9zKTsKKworCWNwID0gJmluZm8tPmNoYW5uZWw7CisKKwkvKiBIYW5kbGUgdHJhbnNpdGlvbiB0byBCMCBzdGF0dXMgKi8KKwlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKSB7CisJCXNDbHJEVFIoY3ApOworCQlzQ2xyUlRTKGNwKTsKKwl9CisKKwkvKiBIYW5kbGUgdHJhbnNpdGlvbiBhd2F5IGZyb20gQjAgc3RhdHVzICovCisJaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSkgeworCQlpZiAoIXR0eS0+aHdfc3RvcHBlZCB8fCAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKQorCQkJc1NldFJUUyhjcCk7CisJCXNTZXREVFIoY3ApOworCX0KKworCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJiAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCXJwX3N0YXJ0KHR0eSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBycF9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChyb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX2JyZWFrIikpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWlmIChicmVha19zdGF0ZSA9PSAtMSkKKwkJc1NlbmRCcmVhaygmaW5mby0+Y2hhbm5lbCk7CisJZWxzZQorCQlzQ2xyQnJlYWsoJmluZm8tPmNoYW5uZWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBzR2V0Q2hhblJJIHVzZWQgdG8gYmUgYSBtYWNybyBpbiByb2NrZXRfaW50LmguIFdoZW4gdGhlIGZ1bmN0aW9uYWxpdHkgZm9yCisgKiB0aGUgVVBDSSBib2FyZHMgd2FzIGFkZGVkLCBpdCB3YXMgZGVjaWRlZCB0byBtYWtlIHRoaXMgYSBmdW5jdGlvbiBiZWNhdXNlCisgKiB0aGUgbWFjcm8gd2FzIGdldHRpbmcgdG9vIGNvbXBsaWNhdGVkLiBBbGwgY2FzZXMgZXhjZXB0IHRoZSBmaXJzdCBvbmUKKyAqIChVUENJUmluZ0luZCkgYXJlIHRha2VuIGRpcmVjdGx5IGZyb20gdGhlIG9yaWdpbmFsIG1hY3JvLgorICovCitzdGF0aWMgaW50IHNHZXRDaGFuUkkoQ0hBTk5FTF9UICogQ2hQKQoreworCUNPTlRST0xMRVJfdCAqQ3RsUCA9IENoUC0+Q3RsUDsKKwlpbnQgQ2hhbk51bSA9IENoUC0+Q2hhbk51bTsKKwlpbnQgUmluZ0luZCA9IDA7CisKKwlpZiAoQ3RsUC0+VVBDSVJpbmdJbmQpCisJCVJpbmdJbmQgPSAhKHNJbkIoQ3RsUC0+VVBDSVJpbmdJbmQpICYgc0JpdE1hcFNldFRibFtDaGFuTnVtXSk7CisJZWxzZSBpZiAoQ3RsUC0+QWx0Q2hhblJpbmdJbmRpY2F0b3IpCisJCVJpbmdJbmQgPSBzSW5CKChCeXRlSU9fdCkgKENoUC0+Q2hhblN0YXQgKyA4KSkgJiBEU1JfQUNUOworCWVsc2UgaWYgKEN0bFAtPmJvYXJkVHlwZSA9PSBST0NLRVRfVFlQRV9QQzEwNCkKKwkJUmluZ0luZCA9ICEoc0luQihDdGxQLT5BaW9wSU9bM10pICYgc0JpdE1hcFNldFRibFtDaGFuTnVtXSk7CisKKwlyZXR1cm4gUmluZ0luZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEhlcmUgYXJlIHRoZSByb3V0aW5lcyB1c2VkIGJ5IHJwX2lvY3RsLiAgVGhlc2UgYXJlIGFsbCBjYWxsZWQgZnJvbSBleGNlcHRpb24gaGFuZGxlcnMuICAqLworCisvKgorICogIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSBzZXJpYWwgbW9kZW0gY29udHJvbCBsaW5lcy4gIFRoZXNlIG5leHQgMiBmdW5jdGlvbnMgCisgKiAgYXJlIHRoZSB3YXkga2VybmVsIHZlcnNpb25zID4gMi41IGhhbmRsZSBtb2RlbSBjb250cm9sIGxpbmVzIHJhdGhlciB0aGFuIElPQ1RMcy4KKyAqLworc3RhdGljIGludCBycF90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgcl9wb3J0ICppbmZvID0gKHN0cnVjdCByX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGludCBjb250cm9sLCByZXN1bHQsIENoYW5TdGF0dXM7CisKKwlDaGFuU3RhdHVzID0gc0dldENoYW5TdGF0dXNMbygmaW5mby0+Y2hhbm5lbCk7CisJY29udHJvbCA9IGluZm8tPmNoYW5uZWwuVHhDb250cm9sWzNdOworCXJlc3VsdCA9ICgoY29udHJvbCAmIFNFVF9SVFMpID8gVElPQ01fUlRTIDogMCkgfCAKKwkJKChjb250cm9sICYgU0VUX0RUUikgPyAgVElPQ01fRFRSIDogMCkgfAorCQkoKENoYW5TdGF0dXMgJiBDRF9BQ1QpID8gVElPQ01fQ0FSIDogMCkgfAorCQkoc0dldENoYW5SSSgmaW5mby0+Y2hhbm5lbCkgPyBUSU9DTV9STkcgOiAwKSB8CisJCSgoQ2hhblN0YXR1cyAmIERTUl9BQ1QpID8gVElPQ01fRFNSIDogMCkgfAorCQkoKENoYW5TdGF0dXMgJiBDVFNfQUNUKSA/IFRJT0NNX0NUUyA6IDApOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogCisgKiAgU2V0cyB0aGUgbW9kZW0gY29udHJvbCBsaW5lcworICovCitzdGF0aWMgaW50IHJwX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlpbmZvLT5jaGFubmVsLlR4Q29udHJvbFszXSB8PSBTRVRfUlRTOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWluZm8tPmNoYW5uZWwuVHhDb250cm9sWzNdIHw9IFNFVF9EVFI7CisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlpbmZvLT5jaGFubmVsLlR4Q29udHJvbFszXSAmPSB+U0VUX1JUUzsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWluZm8tPmNoYW5uZWwuVHhDb250cm9sWzNdICY9IH5TRVRfRFRSOworCisJc091dERXKGluZm8tPmNoYW5uZWwuSW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiAoaW5mby0+Y2hhbm5lbC5UeENvbnRyb2xbMF0pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfY29uZmlnKHN0cnVjdCByX3BvcnQgKmluZm8sIHN0cnVjdCByb2NrZXRfY29uZmlnIF9fdXNlciAqcmV0aW5mbykKK3sKKwlzdHJ1Y3Qgcm9ja2V0X2NvbmZpZyB0bXA7CisKKwlpZiAoIXJldGluZm8pCisJCXJldHVybiAtRUZBVUxUOworCW1lbXNldCgmdG1wLCAwLCBzaXplb2YgKHRtcCkpOworCXRtcC5saW5lID0gaW5mby0+bGluZTsKKwl0bXAuZmxhZ3MgPSBpbmZvLT5mbGFnczsKKwl0bXAuY2xvc2VfZGVsYXkgPSBpbmZvLT5jbG9zZV9kZWxheTsKKwl0bXAuY2xvc2luZ193YWl0ID0gaW5mby0+Y2xvc2luZ193YWl0OworCXRtcC5wb3J0ID0gcmNrdHB0X2lvX2FkZHJbKGluZm8tPmxpbmUgPj4gNSkgJiAzXTsKKworCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mICgqcmV0aW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfY29uZmlnKHN0cnVjdCByX3BvcnQgKmluZm8sIHN0cnVjdCByb2NrZXRfY29uZmlnIF9fdXNlciAqbmV3X2luZm8pCit7CisJc3RydWN0IHJvY2tldF9jb25maWcgbmV3X3NlcmlhbDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NlcmlhbCwgbmV3X2luZm8sIHNpemVvZiAobmV3X3NlcmlhbCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwl7CisJCWlmICgobmV3X3NlcmlhbC5mbGFncyAmIH5ST0NLRVRfVVNSX01BU0spICE9IChpbmZvLT5mbGFncyAmIH5ST0NLRVRfVVNSX01BU0spKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgflJPQ0tFVF9VU1JfTUFTSykgfCAobmV3X3NlcmlhbC5mbGFncyAmIFJPQ0tFVF9VU1JfTUFTSykpOworCQljb25maWd1cmVfcl9wb3J0KGluZm8sIE5VTEwpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+Uk9DS0VUX0ZMQUdTKSB8IChuZXdfc2VyaWFsLmZsYWdzICYgUk9DS0VUX0ZMQUdTKSk7CisJaW5mby0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5OworCWluZm8tPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0OworCisJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9TUERfTUFTSykgPT0gUk9DS0VUX1NQRF9ISSkKKwkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA1NzYwMDsKKwlpZiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX1NQRF9NQVNLKSA9PSBST0NLRVRfU1BEX1ZISSkKKwkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSAxMTUyMDA7CisJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9TUERfTUFTSykgPT0gUk9DS0VUX1NQRF9TSEkpCisJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMjMwNDAwOworCWlmICgoaW5mby0+ZmxhZ3MgJiBST0NLRVRfU1BEX01BU0spID09IFJPQ0tFVF9TUERfV0FSUCkKKwkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA0NjA4MDA7CisKKwljb25maWd1cmVfcl9wb3J0KGluZm8sIE5VTEwpOworCXJldHVybiAwOworfQorCisvKgorICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gYSByb2NrZXRfcG9ydHMgc3RydWN0IHdpdGggaW5mb3JtYXRpb24KKyAqICBhYm91dCB3aGF0IGJvYXJkcy9wb3J0cyBhcmUgaW4gdGhlIHN5c3RlbS4gIFRoaXMgaW5mbyBpcyBwYXNzZWQKKyAqICB0byB1c2VyIHNwYWNlLiAgU2VlIHNldHJvY2tldC5jIHdoZXJlIHRoZSBpbmZvIGlzIHVzZWQgdG8gY3JlYXRlCisgKiAgdGhlIC9kZXYvdHR5UnggcG9ydHMuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3BvcnRzKHN0cnVjdCByX3BvcnQgKmluZm8sIHN0cnVjdCByb2NrZXRfcG9ydHMgX191c2VyICpyZXRwb3J0cykKK3sKKwlzdHJ1Y3Qgcm9ja2V0X3BvcnRzIHRtcDsKKwlpbnQgYm9hcmQ7CisKKwlpZiAoIXJldHBvcnRzKQorCQlyZXR1cm4gLUVGQVVMVDsKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mICh0bXApKTsKKwl0bXAudHR5X21ham9yID0gcm9ja2V0X2RyaXZlci0+bWFqb3I7CisKKwlmb3IgKGJvYXJkID0gMDsgYm9hcmQgPCA0OyBib2FyZCsrKSB7CisJCXRtcC5yb2NrZXRNb2RlbFtib2FyZF0ubW9kZWwgPSByb2NrZXRNb2RlbFtib2FyZF0ubW9kZWw7CisJCXN0cmNweSh0bXAucm9ja2V0TW9kZWxbYm9hcmRdLm1vZGVsU3RyaW5nLCByb2NrZXRNb2RlbFtib2FyZF0ubW9kZWxTdHJpbmcpOworCQl0bXAucm9ja2V0TW9kZWxbYm9hcmRdLm51bVBvcnRzID0gcm9ja2V0TW9kZWxbYm9hcmRdLm51bVBvcnRzOworCQl0bXAucm9ja2V0TW9kZWxbYm9hcmRdLmxvYWRybTIgPSByb2NrZXRNb2RlbFtib2FyZF0ubG9hZHJtMjsKKwkJdG1wLnJvY2tldE1vZGVsW2JvYXJkXS5zdGFydGluZ1BvcnROdW1iZXIgPSByb2NrZXRNb2RlbFtib2FyZF0uc3RhcnRpbmdQb3J0TnVtYmVyOworCX0KKwlpZiAoY29weV90b191c2VyKHJldHBvcnRzLCAmdG1wLCBzaXplb2YgKCpyZXRwb3J0cykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXNldF9ybTIoc3RydWN0IHJfcG9ydCAqaW5mbywgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgcmVzZXQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlc2V0LCBhcmcsIHNpemVvZiAoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChyZXNldCkKKwkJcmVzZXQgPSAxOworCisJaWYgKHJja3RwdF90eXBlW2luZm8tPmJvYXJkXSAhPSBST0NLRVRfVFlQRV9NT0RFTUlJICYmCisgICAgICAgICAgICByY2t0cHRfdHlwZVtpbmZvLT5ib2FyZF0gIT0gUk9DS0VUX1RZUEVfTU9ERU1JSUkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGluZm8tPmN0bHAtPkJ1c1R5cGUgPT0gaXNJU0EpCisJCXNNb2RlbVJlc2V0KGluZm8tPmN0bHAsIGluZm8tPmNoYW4sIHJlc2V0KTsKKwllbHNlCisJCXNQQ0lNb2RlbVJlc2V0KGluZm8tPmN0bHAsIGluZm8tPmNoYW4sIHJlc2V0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF92ZXJzaW9uKHN0cnVjdCByX3BvcnQgKmluZm8sIHN0cnVjdCByb2NrZXRfdmVyc2lvbiBfX3VzZXIgKnJldHZlcnMpCit7CisJaWYgKGNvcHlfdG9fdXNlcihyZXR2ZXJzLCAmZHJpdmVyX3ZlcnNpb24sIHNpemVvZiAoKnJldHZlcnMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qICBJT0NUTCBjYWxsIGhhbmRsZXIgaW50byB0aGUgZHJpdmVyICovCitzdGF0aWMgaW50IHJwX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoY21kICE9IFJDS1BfR0VUX1BPUlRTICYmIHJvY2tldF9wYXJhbm9pYV9jaGVjayhpbmZvLCAicnBfaW9jdGwiKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSQ0tQX0dFVF9TVFJVQ1Q6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgaW5mbywgc2l6ZW9mIChzdHJ1Y3Qgcl9wb3J0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBSQ0tQX0dFVF9DT05GSUc6CisJCXJldHVybiBnZXRfY29uZmlnKGluZm8sIGFyZ3ApOworCWNhc2UgUkNLUF9TRVRfQ09ORklHOgorCQlyZXR1cm4gc2V0X2NvbmZpZyhpbmZvLCBhcmdwKTsKKwljYXNlIFJDS1BfR0VUX1BPUlRTOgorCQlyZXR1cm4gZ2V0X3BvcnRzKGluZm8sIGFyZ3ApOworCWNhc2UgUkNLUF9SRVNFVF9STTI6CisJCXJldHVybiByZXNldF9ybTIoaW5mbywgYXJncCk7CisJY2FzZSBSQ0tQX0dFVF9WRVJTSU9OOgorCQlyZXR1cm4gZ2V0X3ZlcnNpb24oaW5mbywgYXJncCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJwX3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKK3sKKwlzdHJ1Y3Qgcl9wb3J0ICppbmZvID0gKHN0cnVjdCByX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlDSEFOTkVMX3QgKmNwOworCisJaWYgKHJvY2tldF9wYXJhbm9pYV9jaGVjayhpbmZvLCAicnBfc2VuZF94Y2hhciIpKQorCQlyZXR1cm47CisKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCWlmIChzR2V0VHhDbnQoY3ApKQorCQlzV3JpdGVUeFByaW9CeXRlKGNwLCBjaCk7CisJZWxzZQorCQlzV3JpdGVUeEJ5dGUoc0dldFR4UnhEYXRhSU8oY3ApLCBjaCk7Cit9CisKK3N0YXRpYyB2b2lkIHJwX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJQ0hBTk5FTF90ICpjcDsKKworI2lmZGVmIFJPQ0tFVF9ERUJVR19USFJPVFRMRQorCXByaW50ayhLRVJOX0lORk8gInRocm90dGxlICVzOiAlZC4uLi5cbiIsIHR0eS0+bmFtZSwKKwkgICAgICAgdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSk7CisjZW5kaWYKKworCWlmIChyb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX3Rocm90dGxlIikpCisJCXJldHVybjsKKworCWNwID0gJmluZm8tPmNoYW5uZWw7CisJaWYgKElfSVhPRkYodHR5KSkKKwkJcnBfc2VuZF94Y2hhcih0dHksIFNUT1BfQ0hBUih0dHkpKTsKKworCXNDbHJSVFMoJmluZm8tPmNoYW5uZWwpOworfQorCitzdGF0aWMgdm9pZCBycF91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJQ0hBTk5FTF90ICpjcDsKKyNpZmRlZiBST0NLRVRfREVCVUdfVEhST1RUTEUKKwlwcmludGsoS0VSTl9JTkZPICJ1bnRocm90dGxlICVzOiAlZC4uLi5cbiIsIHR0eS0+bmFtZSwKKwkgICAgICAgdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSk7CisjZW5kaWYKKworCWlmIChyb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX3Rocm90dGxlIikpCisJCXJldHVybjsKKworCWNwID0gJmluZm8tPmNoYW5uZWw7CisJaWYgKElfSVhPRkYodHR5KSkKKwkJcnBfc2VuZF94Y2hhcih0dHksIFNUQVJUX0NIQVIodHR5KSk7CisKKwlzU2V0UlRTKCZpbmZvLT5jaGFubmVsKTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnBfc3RvcCgpIGFuZCBycF9zdGFydCgpCisgKgorICogVGhpcyByb3V0aW5lcyBhcmUgY2FsbGVkIGJlZm9yZSBzZXR0aW5nIG9yIHJlc2V0dGluZyB0dHktPnN0b3BwZWQuCisgKiBUaGV5IGVuYWJsZSBvciBkaXNhYmxlIHRyYW5zbWl0dGVyIGludGVycnVwdHMsIGFzIG5lY2Vzc2FyeS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCBycF9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKyNpZmRlZiBST0NLRVRfREVCVUdfRkxPVworCXByaW50ayhLRVJOX0lORk8gInN0b3AgJXM6ICVkICVkLi4uLlxuIiwgdHR5LT5uYW1lLAorCSAgICAgICBpbmZvLT54bWl0X2NudCwgaW5mby0+eG1pdF9maWZvX3Jvb20pOworI2VuZGlmCisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF9zdG9wIikpCisJCXJldHVybjsKKworCWlmIChzR2V0VHhDbnQoJmluZm8tPmNoYW5uZWwpKQorCQlzRGlzVHJhbnNtaXQoJmluZm8tPmNoYW5uZWwpOworfQorCitzdGF0aWMgdm9pZCBycF9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX0ZMT1cKKwlwcmludGsoS0VSTl9JTkZPICJzdGFydCAlczogJWQgJWQuLi4uXG4iLCB0dHktPm5hbWUsCisJICAgICAgIGluZm8tPnhtaXRfY250LCBpbmZvLT54bWl0X2ZpZm9fcm9vbSk7CisjZW5kaWYKKworCWlmIChyb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX3N0b3AiKSkKKwkJcmV0dXJuOworCisJc0VuVHJhbnNtaXQoJmluZm8tPmNoYW5uZWwpOworCXNldF9iaXQoKGluZm8tPmFpb3AgKiA4KSArIGluZm8tPmNoYW4sCisJCSh2b2lkICopICZ4bWl0X2ZsYWdzW2luZm8tPmJvYXJkXSk7Cit9CisKKy8qCisgKiBycF93YWl0X3VudGlsX3NlbnQoKSAtLS0gd2FpdCB1bnRpbCB0aGUgdHJhbnNtaXR0ZXIgaXMgZW1wdHkKKyAqLworc3RhdGljIHZvaWQgcnBfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXM7CisJaW50IGNoZWNrX3RpbWUsIGV4aXRfdGltZTsKKwlpbnQgdHhjbnQ7CisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF93YWl0X3VudGlsX3NlbnQiKSkKKwkJcmV0dXJuOworCisJY3AgPSAmaW5mby0+Y2hhbm5lbDsKKworCW9yaWdfamlmZmllcyA9IGppZmZpZXM7CisjaWZkZWYgUk9DS0VUX0RFQlVHX1dBSVRfVU5USUxfU0VOVAorCXByaW50ayhLRVJOX0lORk8gIkluIFJQX3dhaXRfdW50aWxfc2VudCglZCkgKGppZmY9JWx1KS4uLiIsIHRpbWVvdXQsCisJICAgICAgIGppZmZpZXMpOworCXByaW50ayhLRVJOX0lORk8gImNwcz0lZC4uLiIsIGluZm8tPmNwcyk7CisjZW5kaWYKKwl3aGlsZSAoMSkgeworCQl0eGNudCA9IHNHZXRUeENudChjcCk7CisJCWlmICghdHhjbnQpIHsKKwkJCWlmIChzR2V0Q2hhblN0YXR1c0xvKGNwKSAmIFRYU0hSTVQpCisJCQkJYnJlYWs7CisJCQljaGVja190aW1lID0gKEhaIC8gaW5mby0+Y3BzKSAvIDU7CisJCX0gZWxzZSB7CisJCQljaGVja190aW1lID0gSFogKiB0eGNudCAvIGluZm8tPmNwczsKKwkJfQorCQlpZiAodGltZW91dCkgeworCQkJZXhpdF90aW1lID0gb3JpZ19qaWZmaWVzICsgdGltZW91dCAtIGppZmZpZXM7CisJCQlpZiAoZXhpdF90aW1lIDw9IDApCisJCQkJYnJlYWs7CisJCQlpZiAoZXhpdF90aW1lIDwgY2hlY2tfdGltZSkKKwkJCQljaGVja190aW1lID0gZXhpdF90aW1lOworCQl9CisJCWlmIChjaGVja190aW1lID09IDApCisJCQljaGVja190aW1lID0gMTsKKyNpZmRlZiBST0NLRVRfREVCVUdfV0FJVF9VTlRJTF9TRU5UCisJCXByaW50ayhLRVJOX0lORk8gInR4Y250ID0gJWQgKGppZmY9JWx1LGNoZWNrPSVkKS4uLiIsIHR4Y250LCBqaWZmaWVzLCBjaGVja190aW1lKTsKKyNlbmRpZgorCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGNoZWNrX3RpbWUpKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJfQorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworI2lmZGVmIFJPQ0tFVF9ERUJVR19XQUlUX1VOVElMX1NFTlQKKwlwcmludGsoS0VSTl9JTkZPICJ0eGNudCA9ICVkIChqaWZmPSVsdSkuLi5kb25lXG4iLCB0eGNudCwgamlmZmllcyk7CisjZW5kaWYKK30KKworLyoKKyAqIHJwX2hhbmd1cCgpIC0tLSBjYWxsZWQgYnkgdHR5X2hhbmd1cCgpIHdoZW4gYSBoYW5ndXAgaXMgc2lnbmFsZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJwX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCUNIQU5ORUxfdCAqY3A7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF9oYW5ndXAiKSkKKwkJcmV0dXJuOworCisjaWYgKGRlZmluZWQoUk9DS0VUX0RFQlVHX09QRU4pIHx8IGRlZmluZWQoUk9DS0VUX0RFQlVHX0hBTkdVUCkpCisJcHJpbnRrKEtFUk5fSU5GTyAicnBfaGFuZ3VwIG9mIHR0eVIlZC4uLiIsIGluZm8tPmxpbmUpOworI2VuZGlmCisJcnBfZmx1c2hfYnVmZmVyKHR0eSk7CisJaWYgKGluZm8tPmZsYWdzICYgUk9DS0VUX0NMT1NJTkcpCisJCXJldHVybjsKKwlpZiAoaW5mby0+Y291bnQpIAorCQlhdG9taWNfZGVjKCZycF9udW1fcG9ydHNfb3Blbik7CisJY2xlYXJfYml0KChpbmZvLT5haW9wICogOCkgKyBpbmZvLT5jaGFuLCAodm9pZCAqKSAmeG1pdF9mbGFnc1tpbmZvLT5ib2FyZF0pOworCisJaW5mby0+Y291bnQgPSAwOworCWluZm8tPmZsYWdzICY9IH5ST0NLRVRfTk9STUFMX0FDVElWRTsKKwlpbmZvLT50dHkgPSBOVUxMOworCisJY3AgPSAmaW5mby0+Y2hhbm5lbDsKKwlzRGlzUnhGSUZPKGNwKTsKKwlzRGlzVHJhbnNtaXQoY3ApOworCXNEaXNJbnRlcnJ1cHRzKGNwLCAoVFhJTlRfRU4gfCBNQ0lOVF9FTiB8IFJYSU5UX0VOIHwgU1JDSU5UX0VOIHwgQ0hBTklOVF9FTikpOworCXNEaXNDVFNGbG93Q3RsKGNwKTsKKwlzRGlzVHhTb2Z0Rmxvd0N0bChjcCk7CisJc0NsclR4WE9GRihjcCk7CisJaW5mby0+ZmxhZ3MgJj0gflJPQ0tFVF9JTklUSUFMSVpFRDsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKK30KKworLyoKKyAqICBFeGNlcHRpb24gaGFuZGxlciAtIHdyaXRlIGNoYXIgcm91dGluZS4gIFRoZSBSb2NrZXRQb3J0IGRyaXZlciB1c2VzIGEKKyAqICBkb3VibGUtYnVmZmVyaW5nIHN0cmF0ZWd5LCB3aXRoIHRoZSB0d2lzdCB0aGF0IGlmIHRoZSBpbi1tZW1vcnkgQ1BVCisgKiAgYnVmZmVyIGlzIGVtcHR5LCBhbmQgdGhlcmUncyBzcGFjZSBpbiB0aGUgdHJhbnNtaXQgRklGTywgdGhlCisgKiAgd3JpdGluZyByb3V0aW5lcyB3aWxsIHdyaXRlIGRpcmVjdGx5IHRvIHRyYW5zbWl0IEZJRk8uCisgKiAgV3JpdGUgYnVmZmVyIGFuZCBjb3VudGVycyBwcm90ZWN0ZWQgYnkgc3BpbmxvY2tzCisgKi8KK3N0YXRpYyB2b2lkIHJwX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJQ0hBTk5FTF90ICpjcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHJvY2tldF9wYXJhbm9pYV9jaGVjayhpbmZvLCAicnBfcHV0X2NoYXIiKSkKKwkJcmV0dXJuOworCisJLyogIEdyYWIgdGhlIHBvcnQgd3JpdGUgc2VtYXBob3JlLCBsb2NraW5nIG91dCBvdGhlciBwcm9jZXNzZXMgdGhhdCB0cnkgdG8gd3JpdGUgdG8gdGhpcyBwb3J0ICovCisJZG93bigmaW5mby0+d3JpdGVfc2VtKTsKKworI2lmZGVmIFJPQ0tFVF9ERUJVR19XUklURQorCXByaW50ayhLRVJOX0lORk8gInJwX3B1dF9jaGFyICVjLi4uIiwgY2gpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCisJaWYgKCF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCAmJiBpbmZvLT54bWl0X2ZpZm9fcm9vbSA9PSAwKQorCQlpbmZvLT54bWl0X2ZpZm9fcm9vbSA9IFRYRklGT19TSVpFIC0gc0dldFR4Q250KGNwKTsKKworCWlmICh0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkIHx8IGluZm8tPnhtaXRfZmlmb19yb29tID09IDAgfHwgaW5mby0+eG1pdF9jbnQgIT0gMCkgeworCQlpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X2hlYWQrK10gPSBjaDsKKwkJaW5mby0+eG1pdF9oZWFkICY9IFhNSVRfQlVGX1NJWkUgLSAxOworCQlpbmZvLT54bWl0X2NudCsrOworCQlzZXRfYml0KChpbmZvLT5haW9wICogOCkgKyBpbmZvLT5jaGFuLCAodm9pZCAqKSAmeG1pdF9mbGFnc1tpbmZvLT5ib2FyZF0pOworCX0gZWxzZSB7CisJCXNPdXRCKHNHZXRUeFJ4RGF0YUlPKGNwKSwgY2gpOworCQlpbmZvLT54bWl0X2ZpZm9fcm9vbS0tOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCXVwKCZpbmZvLT53cml0ZV9zZW0pOworfQorCisvKgorICogIEV4Y2VwdGlvbiBoYW5kbGVyIC0gd3JpdGUgcm91dGluZSwgY2FsbGVkIHdoZW4gdXNlciBhcHAgd3JpdGVzIHRvIHRoZSBkZXZpY2UuCisgKiAgQSBwZXIgcG9ydCB3cml0ZSBzZW1hcGhvcmUgaXMgdXNlZCB0byBwcm90ZWN0IGZyb20gYW5vdGhlciBwcm9jZXNzIHdyaXRpbmcgdG8KKyAqICB0aGlzIHBvcnQgYXQgdGhlIHNhbWUgdGltZS4gIFRoaXMgb3RoZXIgcHJvY2VzcyBjb3VsZCBiZSBydW5uaW5nIG9uIHRoZSBvdGhlciBDUFUKKyAqICBvciBnZXQgY29udHJvbCBvZiB0aGUgQ1BVIGlmIHRoZSBjb3B5X2Zyb21fdXNlcigpIGJsb2NrcyBkdWUgdG8gYSBwYWdlIGZhdWx0IChzd2FwcGVkIG91dCkuIAorICogIFNwaW5sb2NrcyBwcm90ZWN0IHRoZSBpbmZvIHhtaXQgbWVtYmVycy4KKyAqLworc3RhdGljIGludCBycF93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJQ0hBTk5FTF90ICpjcDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpiOworCWludCBjLCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoY291bnQgPD0gMCB8fCByb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX3dyaXRlIikpCisJCXJldHVybiAwOworCisJZG93bl9pbnRlcnJ1cHRpYmxlKCZpbmZvLT53cml0ZV9zZW0pOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX1dSSVRFCisJcHJpbnRrKEtFUk5fSU5GTyAicnBfd3JpdGUgJWQgY2hhcnMuLi4iLCBjb3VudCk7CisjZW5kaWYKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCisJaWYgKCF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCAmJiBpbmZvLT54bWl0X2ZpZm9fcm9vbSA8IGNvdW50KQorCQlpbmZvLT54bWl0X2ZpZm9fcm9vbSA9IFRYRklGT19TSVpFIC0gc0dldFR4Q250KGNwKTsKKworICAgICAgICAvKgorCSAqICBJZiB0aGUgd3JpdGUgcXVldWUgZm9yIHRoZSBwb3J0IGlzIGVtcHR5LCBhbmQgdGhlcmUgaXMgRklGTyBzcGFjZSwgc3R1ZmYgYnl0ZXMgCisJICogIGludG8gRklGTy4gIFVzZSB0aGUgd3JpdGUgcXVldWUgZm9yIHRlbXAgc3RvcmFnZS4KKyAgICAgICAgICovCisJaWYgKCF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCAmJiBpbmZvLT54bWl0X2NudCA9PSAwICYmIGluZm8tPnhtaXRfZmlmb19yb29tID4gMCkgeworCQljID0gbWluKGNvdW50LCBpbmZvLT54bWl0X2ZpZm9fcm9vbSk7CisJCWIgPSBidWY7CisKKwkJLyogIFB1c2ggZGF0YSBpbnRvIEZJRk8sIDIgYnl0ZXMgYXQgYSB0aW1lICovCisJCXNPdXRTdHJXKHNHZXRUeFJ4RGF0YUlPKGNwKSwgKHVuc2lnbmVkIHNob3J0ICopIGIsIGMgLyAyKTsKKworCQkvKiAgSWYgdGhlcmUgaXMgYSBieXRlIHJlbWFpbmluZywgd3JpdGUgaXQgKi8KKwkJaWYgKGMgJiAxKQorCQkJc091dEIoc0dldFR4UnhEYXRhSU8oY3ApLCBiW2MgLSAxXSk7CisKKwkJcmV0dmFsICs9IGM7CisJCWJ1ZiArPSBjOworCQljb3VudCAtPSBjOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlpbmZvLT54bWl0X2ZpZm9fcm9vbSAtPSBjOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCX0KKworCS8qIElmIGNvdW50IGlzIHplcm8sIHdlIHdyb3RlIGl0IGFsbCBhbmQgYXJlIGRvbmUgKi8KKwlpZiAoIWNvdW50KQorCQlnb3RvIGVuZDsKKworCS8qICBXcml0ZSByZW1haW5pbmcgZGF0YSBpbnRvIHRoZSBwb3J0J3MgeG1pdF9idWYgKi8KKwl3aGlsZSAoMSkgeworCQlpZiAoaW5mby0+dHR5ID09IDApCS8qICAgU2VlbWluZ2x5IG9ibGlnYXRvcnkgY2hlY2suLi4gKi8KKwkJCWdvdG8gZW5kOworCisJCWMgPSBtaW4oY291bnQsIG1pbihYTUlUX0JVRl9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxLCBYTUlUX0JVRl9TSVpFIC0gaW5mby0+eG1pdF9oZWFkKSk7CisJCWlmIChjIDw9IDApCisJCQlicmVhazsKKworCQliID0gYnVmOworCQltZW1jcHkoaW5mby0+eG1pdF9idWYgKyBpbmZvLT54bWl0X2hlYWQsIGIsIGMpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlpbmZvLT54bWl0X2hlYWQgPQorCQkgICAgKGluZm8tPnhtaXRfaGVhZCArIGMpICYgKFhNSVRfQlVGX1NJWkUgLSAxKTsKKwkJaW5mby0+eG1pdF9jbnQgKz0gYzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKwkJcmV0dmFsICs9IGM7CisJfQorCisJaWYgKChyZXR2YWwgPiAwKSAmJiAhdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQpCisJCXNldF9iaXQoKGluZm8tPmFpb3AgKiA4KSArIGluZm8tPmNoYW4sICh2b2lkICopICZ4bWl0X2ZsYWdzW2luZm8tPmJvYXJkXSk7CisJCitlbmQ6CisgCWlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgeworIAkJdHR5X3dha2V1cCh0dHkpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisjaWZkZWYgUk9DS0VUUE9SVF9IQVZFX1BPTExfV0FJVAorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cG9sbF93YWl0KTsKKyNlbmRpZgorCX0KKwl1cCgmaW5mby0+d3JpdGVfc2VtKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGNhbiBiZSBzZW50LiAgV2UgZXN0aW1hdGUKKyAqIG9ubHkgdXNpbmcgdGhlIGluLW1lbW9yeSB0cmFuc21pdCBidWZmZXIgb25seSwgYW5kIGlnbm9yZSB0aGUKKyAqIHBvdGVudGlhbCBzcGFjZSBpbiB0aGUgdHJhbnNtaXQgRklGTy4KKyAqLworc3RhdGljIGludCBycF93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IHJldDsKKworCWlmIChyb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX3dyaXRlX3Jvb20iKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBYTUlUX0JVRl9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxOworCWlmIChyZXQgPCAwKQorCQlyZXQgPSAwOworI2lmZGVmIFJPQ0tFVF9ERUJVR19XUklURQorCXByaW50ayhLRVJOX0lORk8gInJwX3dyaXRlX3Jvb20gcmV0dXJucyAlZC4uLiIsIHJldCk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyLiAgQWdhaW4sIHRoaXMgb25seQorICogY291bnRzIHRob3NlIGNoYXJhY3RlcnMgaW4gdGhlIGluLW1lbW9yeSB0cmFuc21pdCBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgcnBfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJQ0hBTk5FTF90ICpjcDsKKworCWlmIChyb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX2NoYXJzX2luX2J1ZmZlciIpKQorCQlyZXR1cm4gMDsKKworCWNwID0gJmluZm8tPmNoYW5uZWw7CisKKyNpZmRlZiBST0NLRVRfREVCVUdfV1JJVEUKKwlwcmludGsoS0VSTl9JTkZPICJycF9jaGFyc19pbl9idWZmZXIgcmV0dXJucyAlZC4uLiIsIGluZm8tPnhtaXRfY250KTsKKyNlbmRpZgorCXJldHVybiBpbmZvLT54bWl0X2NudDsKK30KKworLyoKKyAqICBGbHVzaGVzIHRoZSBUWCBmaWZvIGZvciBhIHBvcnQsIGRlbGV0ZXMgZGF0YSBpbiB0aGUgeG1pdF9idWYgc3RvcmVkIGluIHRoZQorICogIHJfcG9ydCBzdHJ1Y3QgZm9yIHRoZSBwb3J0LiAgTm90ZSB0aGF0IHNwaW5sb2NrIGFyZSB1c2VkIHRvIHByb3RlY3QgaW5mbyBtZW1iZXJzLAorICogIGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgdGhlIHNwaW5sb2NrIGlzIGFscmVhZHkgaGVsZC4KKyAqLworc3RhdGljIHZvaWQgcnBfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJQ0hBTk5FTF90ICpjcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHJvY2tldF9wYXJhbm9pYV9jaGVjayhpbmZvLCAicnBfZmx1c2hfYnVmZmVyIikpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworI2lmZGVmIFJPQ0tFVFBPUlRfSEFWRV9QT0xMX1dBSVQKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cG9sbF93YWl0KTsKKyNlbmRpZgorCXR0eV93YWtldXAodHR5KTsKKworCWNwID0gJmluZm8tPmNoYW5uZWw7CisJc0ZsdXNoVHhGSUZPKGNwKTsKK30KKworI2lmZGVmIENPTkZJR19QQ0kKKworLyoKKyAqICBDYWxsZWQgd2hlbiBhIFBDSSBjYXJkIGlzIGZvdW5kLiAgUmV0cmlldmVzIGFuZCBzdG9yZXMgbW9kZWwgaW5mb3JtYXRpb24sCisgKiAgaW5pdCdzIGFpb3BpYyBhbmQgc2VyaWFsIHBvcnQgaGFyZHdhcmUuCisgKiAgSW5wdXRzOiAgaSBpcyB0aGUgYm9hcmQgbnVtYmVyICgwLW4pCisgKi8KK19faW5pdCBpbnQgcmVnaXN0ZXJfUENJKGludCBpLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBudW1fYWlvcHMsIGFpb3AsIG1heF9udW1fYWlvcHMsIG51bV9jaGFuLCBjaGFuOworCXVuc2lnbmVkIGludCBhaW9waW9bTUFYX0FJT1BTX1BFUl9CT0FSRF07CisJY2hhciAqc3RyLCAqYm9hcmRfdHlwZTsKKwlDT05UUk9MTEVSX3QgKmN0bHA7CisKKwlpbnQgZmFzdF9jbG9jayA9IDA7CisJaW50IGFsdENoYW5SaW5nSW5kaWNhdG9yID0gMDsKKwlpbnQgcG9ydHNfcGVyX2Fpb3AgPSA4OworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGNsYXNzX3JldjsKKwlXb3JkSU9fdCBDb25maWdJTyA9IDA7CisJQnl0ZUlPX3QgVVBDSVJpbmdJbmQgPSAwOworCisJaWYgKCFkZXYgfHwgcGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlyY2t0cHRfaW9fYWRkcltpXSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOworCXJldCA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmNsYXNzX3Jldik7CisKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIiAgRXJyb3IgZHVyaW5nIHJlZ2lzdGVyX1BDSSgpLCB1bmFibGUgdG8gcmVhZCBjb25maWcgZHdvcmQgXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmNrdHB0X3R5cGVbaV0gPSBST0NLRVRfVFlQRV9OT1JNQUw7CisJcm9ja2V0TW9kZWxbaV0ubG9hZHJtMiA9IDA7CisJcm9ja2V0TW9kZWxbaV0uc3RhcnRpbmdQb3J0TnVtYmVyID0gbmV4dExpbmVOdW1iZXI7CisKKwkvKiAgRGVwZW5kaW5nIG9uIHRoZSBtb2RlbCwgc2V0IHVwIHNvbWUgY29uZmlnIHZhcmlhYmxlcyAqLworCXN3aXRjaCAoZGV2LT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlA0UVVBRDoKKwkJc3RyID0gIlF1YWRjYWJsZSI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlwb3J0c19wZXJfYWlvcCA9IDQ7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfUlA0UVVBRDsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCA0IHBvcnQgdy9xdWFkIGNhYmxlIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gNDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQOE9DVEE6CisJCXN0ciA9ICJPY3RhY2FibGUiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUDhPQ1RBOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IDggcG9ydCB3L29jdGEgY2FibGUiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSA4OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVVJQOE9DVEE6CisJCXN0ciA9ICJPY3RhY2FibGUiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9VUENJX1JQOE9DVEE7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgVVBDSSA4IHBvcnQgdy9vY3RhIGNhYmxlIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gODsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQOElOVEY6CisJCXN0ciA9ICI4IjsKKwkJbWF4X251bV9haW9wcyA9IDE7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfUlA4SU5URjsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCA4IHBvcnQgdy9leHRlcm5hbCBJL0YiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSA4OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVVJQOElOVEY6CisJCXN0ciA9ICI4IjsKKwkJbWF4X251bV9haW9wcyA9IDE7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfVVBDSV9SUDhJTlRGOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IFVQQ0kgOCBwb3J0IHcvZXh0ZXJuYWwgSS9GIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gODsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQOEo6CisJCXN0ciA9ICI4SiI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQOEo7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgOCBwb3J0IHcvUkoxMSBjb25uZWN0b3JzIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gODsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQNEo6CisJCXN0ciA9ICI0SiI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlwb3J0c19wZXJfYWlvcCA9IDQ7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfUlA0SjsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCA0IHBvcnQgdy9SSjQ1IGNvbm5lY3RvcnMiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSA0OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlA4U05JOgorCQlzdHIgPSAiOCAoREI3OCBDdXN0b20pIjsKKwkJbWF4X251bV9haW9wcyA9IDE7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfUlA4U05JOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IDggcG9ydCB3LyBjdXN0b20gREI3OCIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDg7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDE2U05JOgorCQlzdHIgPSAiMTYgKERCNzggQ3VzdG9tKSI7CisJCW1heF9udW1fYWlvcHMgPSAyOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQMTZTTkk7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgMTYgcG9ydCB3LyBjdXN0b20gREI3OCIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDE2OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlAxNklOVEY6CisJCXN0ciA9ICIxNiI7CisJCW1heF9udW1fYWlvcHMgPSAyOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQMTZJTlRGOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IDE2IHBvcnQgdy9leHRlcm5hbCBJL0YiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1VSUDE2SU5URjoKKwkJc3RyID0gIjE2IjsKKwkJbWF4X251bV9haW9wcyA9IDI7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfVVBDSV9SUDE2SU5URjsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCBVUENJIDE2IHBvcnQgdy9leHRlcm5hbCBJL0YiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0NSUDE2SU5URjoKKwkJc3RyID0gIjE2IjsKKwkJbWF4X251bV9haW9wcyA9IDI7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfQ1BDSV9SUDE2SU5URjsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCBDb21wYWN0IFBDSSAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gMTY7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDMySU5URjoKKwkJc3RyID0gIjMyIjsKKwkJbWF4X251bV9haW9wcyA9IDQ7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfUlAzMklOVEY7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgMzIgcG9ydCB3L2V4dGVybmFsIEkvRiIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDMyOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVVJQMzJJTlRGOgorCQlzdHIgPSAiMzIiOworCQltYXhfbnVtX2Fpb3BzID0gNDsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9VUENJX1JQMzJJTlRGOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IFVQQ0kgMzIgcG9ydCB3L2V4dGVybmFsIEkvRiIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDMyOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlBQNDoKKwkJc3RyID0gIlBsdXMgUXVhZGNhYmxlIjsKKwkJbWF4X251bV9haW9wcyA9IDE7CisJCXBvcnRzX3Blcl9haW9wID0gNDsKKwkJYWx0Q2hhblJpbmdJbmRpY2F0b3IrKzsKKwkJZmFzdF9jbG9jaysrOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQUDQ7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgUGx1cyA0IHBvcnQiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSA0OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlBQODoKKwkJc3RyID0gIlBsdXMgT2N0YWNhYmxlIjsKKwkJbWF4X251bV9haW9wcyA9IDI7CisJCXBvcnRzX3Blcl9haW9wID0gNDsKKwkJYWx0Q2hhblJpbmdJbmRpY2F0b3IrKzsKKwkJZmFzdF9jbG9jaysrOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQUDg7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgUGx1cyA4IHBvcnQiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSA4OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlAyXzIzMjoKKwkJc3RyID0gIlBsdXMgMiAoUlMtMjMyKSI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlwb3J0c19wZXJfYWlvcCA9IDI7CisJCWFsdENoYW5SaW5nSW5kaWNhdG9yKys7CisJCWZhc3RfY2xvY2srKzsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUDJfMjMyOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IFBsdXMgMiBwb3J0IFJTMjMyIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gMjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQMl80MjI6CisJCXN0ciA9ICJQbHVzIDIgKFJTLTQyMikiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcG9ydHNfcGVyX2Fpb3AgPSAyOworCQlhbHRDaGFuUmluZ0luZGljYXRvcisrOworCQlmYXN0X2Nsb2NrKys7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfUlAyXzQyMjsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCBQbHVzIDIgcG9ydCBSUzQyMiIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDI7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDZNOgorCisJCW1heF9udW1fYWlvcHMgPSAxOworCQlwb3J0c19wZXJfYWlvcCA9IDY7CisJCXN0ciA9ICI2LXBvcnQiOworCisJCS8qICBJZiBjbGFzc19yZXYgaXMgMSwgdGhlIHJvY2tldG1vZGVtIGZsYXNoIG11c3QgYmUgbG9hZGVkLiAgSWYgaXQgaXMgMiBpdCBpcyBhICJzb2NrZXRlZCIgdmVyc2lvbi4gKi8KKwkJaWYgKChjbGFzc19yZXYgJiAweEZGKSA9PSAxKSB7CisJCQlyY2t0cHRfdHlwZVtpXSA9IFJPQ0tFVF9UWVBFX01PREVNSUk7CisJCQlyb2NrZXRNb2RlbFtpXS5sb2Fkcm0yID0gMTsKKwkJfSBlbHNlIHsKKwkJCXJja3RwdF90eXBlW2ldID0gUk9DS0VUX1RZUEVfTU9ERU07CisJCX0KKworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQNk07CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldE1vZGVtIDYgcG9ydCIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDY7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDRNOgorCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcG9ydHNfcGVyX2Fpb3AgPSA0OworCQlzdHIgPSAiNC1wb3J0IjsKKwkJaWYgKChjbGFzc19yZXYgJiAweEZGKSA9PSAxKSB7CisJCQlyY2t0cHRfdHlwZVtpXSA9IFJPQ0tFVF9UWVBFX01PREVNSUk7CisJCQlyb2NrZXRNb2RlbFtpXS5sb2Fkcm0yID0gMTsKKwkJfSBlbHNlIHsKKwkJCXJja3RwdF90eXBlW2ldID0gUk9DS0VUX1RZUEVfTU9ERU07CisJCX0KKworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQNE07CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldE1vZGVtIDQgcG9ydCIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0ciA9ICIodW5rbm93bi91bnN1cHBvcnRlZCkiOworCQltYXhfbnVtX2Fpb3BzID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgVVBDSSBib2FyZHMuCisJICovCisKKwlzd2l0Y2ggKGRldi0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1VSUDMySU5URjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfVVJQOElOVEY6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1VSUDE2SU5URjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfQ1JQMTZJTlRGOgorCWNhc2UgUENJX0RFVklDRV9JRF9VUlA4T0NUQToKKwkJcmNrdHB0X2lvX2FkZHJbaV0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAyKTsKKwkJQ29uZmlnSU8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKTsKKwkJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVVJQOE9DVEEpIHsKKwkJCVVQQ0lSaW5nSW5kID0gcmNrdHB0X2lvX2FkZHJbaV0gKyBfUENJXzkwMzBfUklOR19JTkQ7CisKKwkJCS8qCisJCQkgKiBDaGVjayBmb3Igb2N0YSBvciBxdWFkIGNhYmxlLgorCQkJICovCisJCQlpZiAoIQorCQkJICAgIChzSW5XKENvbmZpZ0lPICsgX1BDSV85MDMwX0dQSU9fQ1RSTCkgJgorCQkJICAgICBQQ0lfR1BJT19DVFJMXzhQT1JUKSkgeworCQkJCXN0ciA9ICJRdWFkY2FibGUiOworCQkJCXBvcnRzX3Blcl9haW9wID0gNDsKKwkJCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1VQQ0lfUk0zXzhQT1JUOgorCQlzdHIgPSAiOCBwb3J0cyI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1VQQ0lfUk0zXzhQT1JUOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRNb2RlbSBJSUkgOCBwb3J0Iik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gODsKKwkJcmNrdHB0X2lvX2FkZHJbaV0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAyKTsKKwkJVVBDSVJpbmdJbmQgPSByY2t0cHRfaW9fYWRkcltpXSArIF9QQ0lfOTAzMF9SSU5HX0lORDsKKwkJQ29uZmlnSU8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKTsKKwkJcmNrdHB0X3R5cGVbaV0gPSBST0NLRVRfVFlQRV9NT0RFTUlJSTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1VQQ0lfUk0zXzRQT1JUOgorCQlzdHIgPSAiNCBwb3J0cyI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1VQQ0lfUk0zXzRQT1JUOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRNb2RlbSBJSUkgNCBwb3J0Iik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gNDsKKwkJcmNrdHB0X2lvX2FkZHJbaV0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAyKTsKKwkJVVBDSVJpbmdJbmQgPSByY2t0cHRfaW9fYWRkcltpXSArIF9QQ0lfOTAzMF9SSU5HX0lORDsKKwkJQ29uZmlnSU8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKTsKKwkJcmNrdHB0X3R5cGVbaV0gPSBST0NLRVRfVFlQRV9NT0RFTUlJSTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChyY2t0cHRfdHlwZVtpXSkgeworCWNhc2UgUk9DS0VUX1RZUEVfTU9ERU06CisJCWJvYXJkX3R5cGUgPSAiUm9ja2V0TW9kZW0iOworCQlicmVhazsKKwljYXNlIFJPQ0tFVF9UWVBFX01PREVNSUk6CisJCWJvYXJkX3R5cGUgPSAiUm9ja2V0TW9kZW0gSUkiOworCQlicmVhazsKKwljYXNlIFJPQ0tFVF9UWVBFX01PREVNSUlJOgorCQlib2FyZF90eXBlID0gIlJvY2tldE1vZGVtIElJSSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJvYXJkX3R5cGUgPSAiUm9ja2V0UG9ydCI7CisJCWJyZWFrOworCX0KKworCWlmIChmYXN0X2Nsb2NrKSB7CisJCXNDbG9ja1ByZXNjYWxlID0gMHgxMjsJLyogbW9kIDIgKGRpdmlkZSBieSAzKSAqLworCQlycF9iYXVkX2Jhc2VbaV0gPSA5MjE2MDA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgc3VwcG9ydF9sb3dfc3BlZWQgaXMgc2V0LCB1c2UgdGhlIHNsb3cgY2xvY2sKKwkJICogcHJlc2NhbGUsIHdoaWNoIHN1cHBvcnRzIDUwIGJwcworCQkgKi8KKwkJaWYgKHN1cHBvcnRfbG93X3NwZWVkKSB7CisJCQkvKiBtb2QgOSAoZGl2aWRlIGJ5IDEwKSBwcmVzY2FsZSAqLworCQkJc0Nsb2NrUHJlc2NhbGUgPSAweDE5OworCQkJcnBfYmF1ZF9iYXNlW2ldID0gMjMwNDAwOworCQl9IGVsc2UgeworCQkJLyogbW9kIDQgKGRldmlkZSBieSA1KSBwcmVzY2FsZSAqLworCQkJc0Nsb2NrUHJlc2NhbGUgPSAweDE0OworCQkJcnBfYmF1ZF9iYXNlW2ldID0gNDYwODAwOworCQl9CisJfQorCisJZm9yIChhaW9wID0gMDsgYWlvcCA8IG1heF9udW1fYWlvcHM7IGFpb3ArKykKKwkJYWlvcGlvW2Fpb3BdID0gcmNrdHB0X2lvX2FkZHJbaV0gKyAoYWlvcCAqIDB4NDApOworCWN0bHAgPSBzQ3RsTnVtVG9DdGxQdHIoaSk7CisJbnVtX2Fpb3BzID0gc1BDSUluaXRDb250cm9sbGVyKGN0bHAsIGksIGFpb3BpbywgbWF4X251bV9haW9wcywgQ29uZmlnSU8sIDAsIEZSRVFfRElTLCAwLCBhbHRDaGFuUmluZ0luZGljYXRvciwgVVBDSVJpbmdJbmQpOworCWZvciAoYWlvcCA9IDA7IGFpb3AgPCBtYXhfbnVtX2Fpb3BzOyBhaW9wKyspCisJCWN0bHAtPkFpb3BOdW1DaGFuW2Fpb3BdID0gcG9ydHNfcGVyX2Fpb3A7CisKKwlwcmludGsoIkNvbXRyb2wgUENJIGNvbnRyb2xsZXIgIyVkIElEIDB4JXggZm91bmQgaW4gYnVzOnNsb3Q6Zm4gJXMgYXQgYWRkcmVzcyAlMDRseCwgIgorCSAgICAgIiVkIEFJT1AocykgKCVzKVxuIiwgaSwgZGV2LT5kZXZpY2UsIHBjaV9uYW1lKGRldiksCisJICAgICByY2t0cHRfaW9fYWRkcltpXSwgbnVtX2Fpb3BzLCByb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiSW5zdGFsbGluZyAlcywgY3JlYXRpbmcgL2Rldi90dHlSJWQgLSAlbGRcbiIsCisJICAgICAgIHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLAorCSAgICAgICByb2NrZXRNb2RlbFtpXS5zdGFydGluZ1BvcnROdW1iZXIsCisJICAgICAgIHJvY2tldE1vZGVsW2ldLnN0YXJ0aW5nUG9ydE51bWJlciArCisJICAgICAgIHJvY2tldE1vZGVsW2ldLm51bVBvcnRzIC0gMSk7CisKKwlpZiAobnVtX2Fpb3BzIDw9IDApIHsKKwkJcmNrdHB0X2lvX2FkZHJbaV0gPSAwOworCQlyZXR1cm4gKDApOworCX0KKwlpc19QQ0lbaV0gPSAxOworCisJLyogIFJlc2V0IHRoZSBBSU9QSUMsIGluaXQgdGhlIHNlcmlhbCBwb3J0cyAqLworCWZvciAoYWlvcCA9IDA7IGFpb3AgPCBudW1fYWlvcHM7IGFpb3ArKykgeworCQlzUmVzZXRBaW9wQnlOdW0oY3RscCwgYWlvcCk7CisJCW51bV9jaGFuID0gcG9ydHNfcGVyX2Fpb3A7CisJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBudW1fY2hhbjsgY2hhbisrKQorCQkJaW5pdF9yX3BvcnQoaSwgYWlvcCwgY2hhbiwgZGV2KTsKKwl9CisKKwkvKiAgUm9ja2V0IG1vZGVtcyBtdXN0IGJlIHJlc2V0ICovCisJaWYgKChyY2t0cHRfdHlwZVtpXSA9PSBST0NLRVRfVFlQRV9NT0RFTSkgfHwKKwkgICAgKHJja3RwdF90eXBlW2ldID09IFJPQ0tFVF9UWVBFX01PREVNSUkpIHx8CisJICAgIChyY2t0cHRfdHlwZVtpXSA9PSBST0NLRVRfVFlQRV9NT0RFTUlJSSkpIHsKKwkJbnVtX2NoYW4gPSBwb3J0c19wZXJfYWlvcDsKKwkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG51bV9jaGFuOyBjaGFuKyspCisJCQlzUENJTW9kZW1SZXNldChjdGxwLCBjaGFuLCAxKTsKKwkJbWRlbGF5KDUwMCk7CisJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBudW1fY2hhbjsgY2hhbisrKQorCQkJc1BDSU1vZGVtUmVzZXQoY3RscCwgY2hhbiwgMCk7CisJCW1kZWxheSg1MDApOworCQlybVNwZWFrZXJSZXNldChjdGxwLCByb2NrZXRNb2RlbFtpXS5tb2RlbCk7CisJfQorCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiAgUHJvYmVzIGZvciBQQ0kgY2FyZHMsIGluaXRzIHRoZW0gaWYgZm91bmQKKyAqICBJbnB1dDogICBib2FyZF9mb3VuZCA9IG51bWJlciBvZiBJU0EgYm9hcmRzIGFscmVhZHkgZm91bmQsIG9yIHRoZQorICogICAgICAgICAgIHN0YXJ0aW5nIGJvYXJkIG51bWJlcgorICogIFJldHVybnM6IE51bWJlciBvZiBQQ0kgYm9hcmRzIGZvdW5kCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGluaXRfUENJKGludCBib2FyZHNfZm91bmQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJaW50IGNvdW50ID0gMDsKKworCS8qICBXb3JrIHRocm91Z2ggdGhlIFBDSSBkZXZpY2UgbGlzdCwgcHVsbGluZyBvdXQgb3VycyAqLworCXdoaWxlICgoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfUlAsIFBDSV9BTllfSUQsIGRldikpKSB7CisJCWlmIChyZWdpc3Rlcl9QQ0koY291bnQgKyBib2FyZHNfZm91bmQsIGRldikpCisJCQljb3VudCsrOworCX0KKwlyZXR1cm4gKGNvdW50KTsKK30KKworI2VuZGlmCQkJCS8qIENPTkZJR19QQ0kgKi8KKworLyoKKyAqICBQcm9iZXMgZm9yIElTQSBjYXJkcworICogIElucHV0OiAgIGkgPSB0aGUgYm9hcmQgbnVtYmVyIHRvIGxvb2sgZm9yCisgKiAgUmV0dXJuczogMSBpZiBib2FyZCBmb3VuZCwgMCBlbHNlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGluaXRfSVNBKGludCBpKQoreworCWludCBudW1fYWlvcHMsIG51bV9jaGFuID0gMCwgdG90YWxfbnVtX2NoYW4gPSAwOworCWludCBhaW9wLCBjaGFuOworCXVuc2lnbmVkIGludCBhaW9waW9bTUFYX0FJT1BTX1BFUl9CT0FSRF07CisJQ09OVFJPTExFUl90ICpjdGxwOworCWNoYXIgKnR5cGVfc3RyaW5nOworCisJLyogIElmIGlvX2FkZHIgaXMgemVybywgbm8gYm9hcmQgY29uZmlndXJlZCAqLworCWlmIChyY2t0cHRfaW9fYWRkcltpXSA9PSAwKQorCQlyZXR1cm4gKDApOworCisJLyogIFJlc2VydmUgdGhlIElPIHJlZ2lvbiAqLworCWlmICghcmVxdWVzdF9yZWdpb24ocmNrdHB0X2lvX2FkZHJbaV0sIDY0LCAiQ29tdHJvbCBSb2NrZXRQb3J0IikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVW5hYmxlIHRvIHJlc2VydmUgSU8gcmVnaW9uIGZvciBjb25maWd1cmVkIElTQSBSb2NrZXRQb3J0IGF0IGFkZHJlc3MgMHglbHgsIGJvYXJkIG5vdCBpbnN0YWxsZWQuLi5cbiIsIHJja3RwdF9pb19hZGRyW2ldKTsKKwkJcmNrdHB0X2lvX2FkZHJbaV0gPSAwOworCQlyZXR1cm4gKDApOworCX0KKworCWN0bHAgPSBzQ3RsTnVtVG9DdGxQdHIoaSk7CisKKwljdGxwLT5ib2FyZFR5cGUgPSByY2t0cHRfdHlwZVtpXTsKKworCXN3aXRjaCAocmNrdHB0X3R5cGVbaV0pIHsKKwljYXNlIFJPQ0tFVF9UWVBFX1BDMTA0OgorCQl0eXBlX3N0cmluZyA9ICIoUEMxMDQpIjsKKwkJYnJlYWs7CisJY2FzZSBST0NLRVRfVFlQRV9NT0RFTToKKwkJdHlwZV9zdHJpbmcgPSAiKFJvY2tldE1vZGVtKSI7CisJCWJyZWFrOworCWNhc2UgUk9DS0VUX1RZUEVfTU9ERU1JSToKKwkJdHlwZV9zdHJpbmcgPSAiKFJvY2tldE1vZGVtIElJKSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXR5cGVfc3RyaW5nID0gIiI7CisJCWJyZWFrOworCX0KKworCS8qCisJICogSWYgc3VwcG9ydF9sb3dfc3BlZWQgaXMgc2V0LCB1c2UgdGhlIHNsb3cgY2xvY2sgcHJlc2NhbGUsCisJICogd2hpY2ggc3VwcG9ydHMgNTAgYnBzCisJICovCisJaWYgKHN1cHBvcnRfbG93X3NwZWVkKSB7CisJCXNDbG9ja1ByZXNjYWxlID0gMHgxOTsJLyogbW9kIDkgKGRpdmlkZSBieSAxMCkgcHJlc2NhbGUgKi8KKwkJcnBfYmF1ZF9iYXNlW2ldID0gMjMwNDAwOworCX0gZWxzZSB7CisJCXNDbG9ja1ByZXNjYWxlID0gMHgxNDsJLyogbW9kIDQgKGRldmlkZSBieSA1KSBwcmVzY2FsZSAqLworCQlycF9iYXVkX2Jhc2VbaV0gPSA0NjA4MDA7CisJfQorCisJZm9yIChhaW9wID0gMDsgYWlvcCA8IE1BWF9BSU9QU19QRVJfQk9BUkQ7IGFpb3ArKykKKwkJYWlvcGlvW2Fpb3BdID0gcmNrdHB0X2lvX2FkZHJbaV0gKyAoYWlvcCAqIDB4NDAwKTsKKworCW51bV9haW9wcyA9IHNJbml0Q29udHJvbGxlcihjdGxwLCBpLCBjb250cm9sbGVyICsgKGkgKiAweDQwMCksIGFpb3BpbywgIE1BWF9BSU9QU19QRVJfQk9BUkQsIDAsIEZSRVFfRElTLCAwKTsKKworCWlmIChjdGxwLT5ib2FyZFR5cGUgPT0gUk9DS0VUX1RZUEVfUEMxMDQpIHsKKwkJc0VuQWlvcChjdGxwLCAyKTsJLyogb25seSBvbmUgQUlPUElDLCBidXQgdGhlc2UgKi8KKwkJc0VuQWlvcChjdGxwLCAzKTsJLyogQ1NlbHMgdXNlZCBmb3Igb3RoZXIgc3R1ZmYgKi8KKwl9CisKKwkvKiAgSWYgc29tZXRoaW5nIHdlbnQgd3JvbmcgaW5pdGluZyB0aGUgQUlPUCdzIHJlbGVhc2UgdGhlIElTQSBJTyBtZW1vcnkgKi8KKwlpZiAobnVtX2Fpb3BzIDw9IDApIHsKKwkJcmVsZWFzZV9yZWdpb24ocmNrdHB0X2lvX2FkZHJbaV0sIDY0KTsKKwkJcmNrdHB0X2lvX2FkZHJbaV0gPSAwOworCQlyZXR1cm4gKDApOworCX0KKyAgCisJcm9ja2V0TW9kZWxbaV0uc3RhcnRpbmdQb3J0TnVtYmVyID0gbmV4dExpbmVOdW1iZXI7CisKKwlmb3IgKGFpb3AgPSAwOyBhaW9wIDwgbnVtX2Fpb3BzOyBhaW9wKyspIHsKKwkJc1Jlc2V0QWlvcEJ5TnVtKGN0bHAsIGFpb3ApOworCQlzRW5BaW9wKGN0bHAsIGFpb3ApOworCQludW1fY2hhbiA9IHNHZXRBaW9wTnVtQ2hhbihjdGxwLCBhaW9wKTsKKwkJdG90YWxfbnVtX2NoYW4gKz0gbnVtX2NoYW47CisJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBudW1fY2hhbjsgY2hhbisrKQorCQkJaW5pdF9yX3BvcnQoaSwgYWlvcCwgY2hhbiwgTlVMTCk7CisJfQorCWlzX1BDSVtpXSA9IDA7CisJaWYgKChyY2t0cHRfdHlwZVtpXSA9PSBST0NLRVRfVFlQRV9NT0RFTSkgfHwgKHJja3RwdF90eXBlW2ldID09IFJPQ0tFVF9UWVBFX01PREVNSUkpKSB7CisJCW51bV9jaGFuID0gc0dldEFpb3BOdW1DaGFuKGN0bHAsIDApOworCQl0b3RhbF9udW1fY2hhbiA9IG51bV9jaGFuOworCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbnVtX2NoYW47IGNoYW4rKykKKwkJCXNNb2RlbVJlc2V0KGN0bHAsIGNoYW4sIDEpOworCQltZGVsYXkoNTAwKTsKKwkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG51bV9jaGFuOyBjaGFuKyspCisJCQlzTW9kZW1SZXNldChjdGxwLCBjaGFuLCAwKTsKKwkJbWRlbGF5KDUwMCk7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldE1vZGVtIElTQSIpOworCX0gZWxzZSB7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgSVNBIik7CisJfQorCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gdG90YWxfbnVtX2NoYW47CisJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9JU0E7CisKKwlwcmludGsoS0VSTl9JTkZPICJSb2NrZXRQb3J0IElTQSBjYXJkICMlZCBmb3VuZCBhdCAweCVseCAtICVkIEFJT1BzICVzXG4iLCAKKwkgICAgICAgaSwgcmNrdHB0X2lvX2FkZHJbaV0sIG51bV9haW9wcywgdHlwZV9zdHJpbmcpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSW5zdGFsbGluZyAlcywgY3JlYXRpbmcgL2Rldi90dHlSJWQgLSAlbGRcbiIsCisJICAgICAgIHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLAorCSAgICAgICByb2NrZXRNb2RlbFtpXS5zdGFydGluZ1BvcnROdW1iZXIsCisJICAgICAgIHJvY2tldE1vZGVsW2ldLnN0YXJ0aW5nUG9ydE51bWJlciArCisJICAgICAgIHJvY2tldE1vZGVsW2ldLm51bVBvcnRzIC0gMSk7CisKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHJvY2tldF9vcHMgPSB7CisJLm9wZW4gPSBycF9vcGVuLAorCS5jbG9zZSA9IHJwX2Nsb3NlLAorCS53cml0ZSA9IHJwX3dyaXRlLAorCS5wdXRfY2hhciA9IHJwX3B1dF9jaGFyLAorCS53cml0ZV9yb29tID0gcnBfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gcnBfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSBycF9mbHVzaF9idWZmZXIsCisJLmlvY3RsID0gcnBfaW9jdGwsCisJLnRocm90dGxlID0gcnBfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSBycF91bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IHJwX3NldF90ZXJtaW9zLAorCS5zdG9wID0gcnBfc3RvcCwKKwkuc3RhcnQgPSBycF9zdGFydCwKKwkuaGFuZ3VwID0gcnBfaGFuZ3VwLAorCS5icmVha19jdGwgPSBycF9icmVhaywKKwkuc2VuZF94Y2hhciA9IHJwX3NlbmRfeGNoYXIsCisJLndhaXRfdW50aWxfc2VudCA9IHJwX3dhaXRfdW50aWxfc2VudCwKKwkudGlvY21nZXQgPSBycF90aW9jbWdldCwKKwkudGlvY21zZXQgPSBycF90aW9jbXNldCwKK307CisKKy8qCisgKiBUaGUgbW9kdWxlICJzdGFydHVwIiByb3V0aW5lOyBpdCdzIHJ1biB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkLgorICovCitpbnQgX19pbml0IHJwX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsLCBwY2lfYm9hcmRzX2ZvdW5kLCBpc2FfYm9hcmRzX2ZvdW5kLCBpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUm9ja2V0UG9ydCBkZXZpY2UgZHJpdmVyIG1vZHVsZSwgdmVyc2lvbiAlcywgJXNcbiIsCisJICAgICAgIFJPQ0tFVF9WRVJTSU9OLCBST0NLRVRfREFURSk7CisKKwlyb2NrZXRfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihNQVhfUlBfUE9SVFMpOworCWlmICghcm9ja2V0X2RyaXZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFNldCB1cCB0aGUgdGltZXIgY2hhbm5lbC4KKwkgKi8KKwlpbml0X3RpbWVyKCZyb2NrZXRfdGltZXIpOworCXJvY2tldF90aW1lci5mdW5jdGlvbiA9IHJwX2RvX3BvbGw7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGFycmF5IG9mIHBvaW50ZXJzIHRvIG91ciBvd24gaW50ZXJuYWwgc3RhdGUKKwkgKiBzdHJ1Y3R1cmVzLgorCSAqLworCW1lbXNldChycF90YWJsZSwgMCwgc2l6ZW9mIChycF90YWJsZSkpOworCW1lbXNldCh4bWl0X2ZsYWdzLCAwLCBzaXplb2YgKHhtaXRfZmxhZ3MpKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUlBfUE9SVFM7IGkrKykKKwkJbGluZU51bWJlcnNbaV0gPSAwOworCW5leHRMaW5lTnVtYmVyID0gMDsKKwltZW1zZXQocm9ja2V0TW9kZWwsIDAsIHNpemVvZiAocm9ja2V0TW9kZWwpKTsKKworCS8qCisJICogIElmIGJvYXJkIDEgaXMgbm9uLXplcm8sIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBJU0EgY29uZmlndXJlZC4gIElmIGNvbnRyb2xsZXIgaXMgCisJICogIHplcm8sIHVzZSB0aGUgZGVmYXVsdCBjb250cm9sbGVyIElPIGFkZHJlc3Mgb2YgYm9hcmQxICsgMHg0MC4KKwkgKi8KKwlpZiAoYm9hcmQxKSB7CisJCWlmIChjb250cm9sbGVyID09IDApCisJCQljb250cm9sbGVyID0gYm9hcmQxICsgMHg0MDsKKwl9IGVsc2UgeworCQljb250cm9sbGVyID0gMDsgIC8qICBVc2VkIGFzIGEgZmxhZywgbWVhbmluZyBubyBJU0EgYm9hcmRzICovCisJfQorCisJLyogIElmIGFuIElTQSBjYXJkIGlzIGNvbmZpZ3VyZWQsIHJlc2VydmUgdGhlIDQgYnl0ZSBJTyBzcGFjZSBmb3IgdGhlIE11ZGJhYyBjb250cm9sbGVyICovCisJaWYgKGNvbnRyb2xsZXIgJiYgKCFyZXF1ZXN0X3JlZ2lvbihjb250cm9sbGVyLCA0LCAiQ29tdHJvbCBSb2NrZXRQb3J0IikpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlVuYWJsZSB0byByZXNlcnZlIElPIHJlZ2lvbiBmb3IgZmlyc3QgY29uZmlndXJlZCBJU0EgUm9ja2V0UG9ydCBjb250cm9sbGVyIDB4JWx4LiAgRHJpdmVyIGV4aXRpbmcgXG4iLCBjb250cm9sbGVyKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiAgU3RvcmUgSVNBIHZhcmlhYmxlIHJldHJpZXZlZCBmcm9tIGNvbW1hbmQgbGluZSBvciAuY29uZiBmaWxlLiAqLworCXJja3RwdF9pb19hZGRyWzBdID0gYm9hcmQxOworCXJja3RwdF9pb19hZGRyWzFdID0gYm9hcmQyOworCXJja3RwdF9pb19hZGRyWzJdID0gYm9hcmQzOworCXJja3RwdF9pb19hZGRyWzNdID0gYm9hcmQ0OworCisJcmNrdHB0X3R5cGVbMF0gPSBtb2RlbTEgPyBST0NLRVRfVFlQRV9NT0RFTSA6IFJPQ0tFVF9UWVBFX05PUk1BTDsKKwlyY2t0cHRfdHlwZVswXSA9IHBjMTA0XzFbMF0gPyBST0NLRVRfVFlQRV9QQzEwNCA6IHJja3RwdF90eXBlWzBdOworCXJja3RwdF90eXBlWzFdID0gbW9kZW0yID8gUk9DS0VUX1RZUEVfTU9ERU0gOiBST0NLRVRfVFlQRV9OT1JNQUw7CisJcmNrdHB0X3R5cGVbMV0gPSBwYzEwNF8yWzBdID8gUk9DS0VUX1RZUEVfUEMxMDQgOiByY2t0cHRfdHlwZVsxXTsKKwlyY2t0cHRfdHlwZVsyXSA9IG1vZGVtMyA/IFJPQ0tFVF9UWVBFX01PREVNIDogUk9DS0VUX1RZUEVfTk9STUFMOworCXJja3RwdF90eXBlWzJdID0gcGMxMDRfM1swXSA/IFJPQ0tFVF9UWVBFX1BDMTA0IDogcmNrdHB0X3R5cGVbMl07CisJcmNrdHB0X3R5cGVbM10gPSBtb2RlbTQgPyBST0NLRVRfVFlQRV9NT0RFTSA6IFJPQ0tFVF9UWVBFX05PUk1BTDsKKwlyY2t0cHRfdHlwZVszXSA9IHBjMTA0XzRbMF0gPyBST0NLRVRfVFlQRV9QQzEwNCA6IHJja3RwdF90eXBlWzNdOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIHR0eSBkcml2ZXIgc3RydWN0dXJlIGFuZCB0aGVuIHJlZ2lzdGVyIHRoaXMKKwkgKiBkcml2ZXIgd2l0aCB0aGUgdHR5IGxheWVyLgorCSAqLworCisJcm9ja2V0X2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlyb2NrZXRfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfTk9fREVWRlM7CisJcm9ja2V0X2RyaXZlci0+ZGV2ZnNfbmFtZSA9ICJ0dHMvUiI7CisJcm9ja2V0X2RyaXZlci0+bmFtZSA9ICJ0dHlSIjsKKwlyb2NrZXRfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJDb210cm9sIFJvY2tldFBvcnQiOworCXJvY2tldF9kcml2ZXItPm1ham9yID0gVFRZX1JPQ0tFVF9NQUpPUjsKKwlyb2NrZXRfZHJpdmVyLT5taW5vcl9zdGFydCA9IDA7CisJcm9ja2V0X2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJcm9ja2V0X2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlyb2NrZXRfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJcm9ja2V0X2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQorCSAgICBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisjaWZkZWYgUk9DS0VUX1NPRlRfRkxPVworCXJvY2tldF9kcml2ZXItPmZsYWdzIHw9IFRUWV9EUklWRVJfUkVBTF9SQVcgfCBUVFlfRFJJVkVSX05PX0RFVkZTOworI2VuZGlmCisJdHR5X3NldF9vcGVyYXRpb25zKHJvY2tldF9kcml2ZXIsICZyb2NrZXRfb3BzKTsKKworCXJldHZhbCA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIocm9ja2V0X2RyaXZlcik7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ291bGRuJ3QgaW5zdGFsbCB0dHkgUm9ja2V0UG9ydCBkcml2ZXIgKGVycm9yICVkKVxuIiwgLXJldHZhbCk7CisJCXB1dF90dHlfZHJpdmVyKHJvY2tldF9kcml2ZXIpOworCQlyZXR1cm4gLTE7CisJfQorCisjaWZkZWYgUk9DS0VUX0RFQlVHX09QRU4KKwlwcmludGsoS0VSTl9JTkZPICJSb2NrZXRQb3J0IGRyaXZlciBpcyBtYWpvciAlZFxuIiwgcm9ja2V0X2RyaXZlci5tYWpvcik7CisjZW5kaWYKKworCS8qCisJICogIE9LLCBsZXQncyBwcm9iZSBlYWNoIG9mIHRoZSBjb250cm9sbGVycyBsb29raW5nIGZvciBib2FyZHMuICBBbnkgYm9hcmRzIGZvdW5kCisgICAgICAgICAqICB3aWxsIGJlIGluaXRpYWxpemVkIGhlcmUuCisJICovCisJaXNhX2JvYXJkc19mb3VuZCA9IDA7CisJcGNpX2JvYXJkc19mb3VuZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0JPQVJEUzsgaSsrKSB7CisJCWlmIChpbml0X0lTQShpKSkKKwkJCWlzYV9ib2FyZHNfZm91bmQrKzsKKwl9CisKKyNpZmRlZiBDT05GSUdfUENJCisJaWYgKGlzYV9ib2FyZHNfZm91bmQgPCBOVU1fQk9BUkRTKQorCQlwY2lfYm9hcmRzX2ZvdW5kID0gaW5pdF9QQ0koaXNhX2JvYXJkc19mb3VuZCk7CisjZW5kaWYKKworCW1heF9ib2FyZCA9IHBjaV9ib2FyZHNfZm91bmQgKyBpc2FfYm9hcmRzX2ZvdW5kOworCisJaWYgKG1heF9ib2FyZCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIk5vIHJvY2tldHBvcnQgcG9ydHMgZm91bmQ7IHVubG9hZGluZyBkcml2ZXIuXG4iKTsKKwkJZGVsX3RpbWVyX3N5bmMoJnJvY2tldF90aW1lcik7CisJCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihyb2NrZXRfZHJpdmVyKTsKKwkJcHV0X3R0eV9kcml2ZXIocm9ja2V0X2RyaXZlcik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKKworc3RhdGljIHZvaWQgcnBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCWludCBpOworCisJZGVsX3RpbWVyX3N5bmMoJnJvY2tldF90aW1lcik7CisKKwlyZXR2YWwgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocm9ja2V0X2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRXJyb3IgJWQgd2hpbGUgdHJ5aW5nIHRvIHVucmVnaXN0ZXIgIgorCQkgICAgICAgInJvY2tldHBvcnQgZHJpdmVyXG4iLCAtcmV0dmFsKTsKKwlwdXRfdHR5X2RyaXZlcihyb2NrZXRfZHJpdmVyKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUlBfUE9SVFM7IGkrKykgeworCQlpZiAocnBfdGFibGVbaV0pCisJCQlrZnJlZShycF90YWJsZVtpXSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE5VTV9CT0FSRFM7IGkrKykgeworCQlpZiAocmNrdHB0X2lvX2FkZHJbaV0gPD0gMCB8fCBpc19QQ0lbaV0pCisJCQljb250aW51ZTsKKwkJcmVsZWFzZV9yZWdpb24ocmNrdHB0X2lvX2FkZHJbaV0sIDY0KTsKKwl9CisJaWYgKGNvbnRyb2xsZXIpCisJCXJlbGVhc2VfcmVnaW9uKGNvbnRyb2xsZXIsIDQpOworfQorI2VuZGlmCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCitzdGF0aWMgQnl0ZV90IFJEYXRhW1JEQVRBU0laRV0gPSB7CisJMHgwMCwgMHgwOSwgMHhmNiwgMHg4MiwKKwkweDAyLCAweDA5LCAweDg2LCAweGZiLAorCTB4MDQsIDB4MDksIDB4MDAsIDB4MGEsCisJMHgwNiwgMHgwOSwgMHgwMSwgMHgwYSwKKwkweDA4LCAweDA5LCAweDhhLCAweDEzLAorCTB4MGEsIDB4MDksIDB4YzUsIDB4MTEsCisJMHgwYywgMHgwOSwgMHg4NiwgMHg4NSwKKwkweDBlLCAweDA5LCAweDIwLCAweDBhLAorCTB4MTAsIDB4MDksIDB4MjEsIDB4MGEsCisJMHgxMiwgMHgwOSwgMHg0MSwgMHhmZiwKKwkweDE0LCAweDA5LCAweDgyLCAweDAwLAorCTB4MTYsIDB4MDksIDB4ODIsIDB4N2IsCisJMHgxOCwgMHgwOSwgMHg4YSwgMHg3ZCwKKwkweDFhLCAweDA5LCAweDg4LCAweDgxLAorCTB4MWMsIDB4MDksIDB4ODYsIDB4N2EsCisJMHgxZSwgMHgwOSwgMHg4NCwgMHg4MSwKKwkweDIwLCAweDA5LCAweDgyLCAweDdjLAorCTB4MjIsIDB4MDksIDB4MGEsIDB4MGEKK307CisKK3N0YXRpYyBCeXRlX3QgUlJlZ0RhdGFbUlJFR0RBVEFTSVpFXSA9IHsKKwkweDAwLCAweDA5LCAweGY2LCAweDgyLAkvKiAwMDogU3RvcCBSeCBwcm9jZXNzb3IgKi8KKwkweDA4LCAweDA5LCAweDhhLCAweDEzLAkvKiAwNDogVHggc29mdHdhcmUgZmxvdyBjb250cm9sICovCisJMHgwYSwgMHgwOSwgMHhjNSwgMHgxMSwJLyogMDg6IFhPTiBjaGFyICovCisJMHgwYywgMHgwOSwgMHg4NiwgMHg4NSwJLyogMGM6IFhBTlkgKi8KKwkweDEyLCAweDA5LCAweDQxLCAweGZmLAkvKiAxMDogUnggbWFzayBjaGFyICovCisJMHgxNCwgMHgwOSwgMHg4MiwgMHgwMCwJLyogMTQ6IENvbXBhcmUvSWdub3JlICMwICovCisJMHgxNiwgMHgwOSwgMHg4MiwgMHg3YiwJLyogMTg6IENvbXBhcmUgIzEgKi8KKwkweDE4LCAweDA5LCAweDhhLCAweDdkLAkvKiAxYzogQ29tcGFyZSAjMiAqLworCTB4MWEsIDB4MDksIDB4ODgsIDB4ODEsCS8qIDIwOiBJbnRlcnJ1cHQgIzEgKi8KKwkweDFjLCAweDA5LCAweDg2LCAweDdhLAkvKiAyNDogSWdub3JlL1JlcGxhY2UgIzEgKi8KKwkweDFlLCAweDA5LCAweDg0LCAweDgxLAkvKiAyODogSW50ZXJydXB0ICMyICovCisJMHgyMCwgMHgwOSwgMHg4MiwgMHg3YywJLyogMmM6IElnbm9yZS9SZXBsYWNlICMyICovCisJMHgyMiwgMHgwOSwgMHgwYSwgMHgwYQkvKiAzMDogUnggRklGTyBFbmFibGUgKi8KK307CisKK0NPTlRST0xMRVJfVCBzQ29udHJvbGxlcltDVExfU0laRV0gPSB7CisJey0xLCAtMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDB9LAorCSB7MCwgMCwgMCwgMH0sIHstMSwgLTEsIC0xLCAtMX0sIHswLCAwLCAwLCAwfX0sCisJey0xLCAtMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDB9LAorCSB7MCwgMCwgMCwgMH0sIHstMSwgLTEsIC0xLCAtMX0sIHswLCAwLCAwLCAwfX0sCisJey0xLCAtMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDB9LAorCSB7MCwgMCwgMCwgMH0sIHstMSwgLTEsIC0xLCAtMX0sIHswLCAwLCAwLCAwfX0sCisJey0xLCAtMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDB9LAorCSB7MCwgMCwgMCwgMH0sIHstMSwgLTEsIC0xLCAtMX0sIHswLCAwLCAwLCAwfX0KK307CisKK0J5dGVfdCBzQml0TWFwQ2xyVGJsWzhdID0geworCTB4ZmUsIDB4ZmQsIDB4ZmIsIDB4ZjcsIDB4ZWYsIDB4ZGYsIDB4YmYsIDB4N2YKK307CisKK0J5dGVfdCBzQml0TWFwU2V0VGJsWzhdID0geworCTB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAKK307CisKK2ludCBzQ2xvY2tQcmVzY2FsZSA9IDB4MTQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzSW5pdENvbnRyb2xsZXIKK1B1cnBvc2U6ICBJbml0aWFsaXphdGlvbiBvZiBjb250cm9sbGVyIGdsb2JhbCByZWdpc3RlcnMgYW5kIGNvbnRyb2xsZXIKKyAgICAgICAgICBzdHJ1Y3R1cmUuCitDYWxsOiAgICAgc0luaXRDb250cm9sbGVyKEN0bFAsQ3RsTnVtLE11ZGJhY0lPLEFpb3BJT0xpc3QsQWlvcElPTGlzdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElSUU51bSxGcmVxdWVuY3ksUGVyaW9kaWNPbmx5KQorICAgICAgICAgIENPTlRST0xMRVJfVCAqQ3RsUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCisgICAgICAgICAgaW50IEN0bE51bTsgQ29udHJvbGxlciBudW1iZXIKKyAgICAgICAgICBCeXRlSU9fdCBNdWRiYWNJTzsgTXVkYmFjIGJhc2UgSS9PIGFkZHJlc3MuCisgICAgICAgICAgQnl0ZUlPX3QgKkFpb3BJT0xpc3Q7IExpc3Qgb2YgSS9PIGFkZHJlc3NlcyBmb3IgZWFjaCBBSU9QLgorICAgICAgICAgICAgIFRoaXMgbGlzdCBtdXN0IGJlIGluIHRoZSBvcmRlciB0aGUgQUlPUHMgd2lsbCBiZSBmb3VuZCBvbiB0aGUKKyAgICAgICAgICAgICBjb250cm9sbGVyLiAgT25jZSBhbiBBSU9QIGluIHRoZSBsaXN0IGlzIG5vdCBmb3VuZCwgaXQgaXMKKyAgICAgICAgICAgICBhc3N1bWVkIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgQUlPUHMgb24gdGhlIGNvbnRyb2xsZXIuCisgICAgICAgICAgaW50IEFpb3BJT0xpc3RTaXplOyBOdW1iZXIgb2YgYWRkcmVzc2VzIGluIEFpb3BJT0xpc3QKKyAgICAgICAgICBpbnQgSVJRTnVtOyBJbnRlcnJ1cHQgUmVxdWVzdCBudW1iZXIuICBDYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgMDogRGlzYWJsZSBnbG9iYWwgaW50ZXJydXB0cworICAgICAgICAgICAgICAgICAgICAgICAgIDM6IElSUSAzCisgICAgICAgICAgICAgICAgICAgICAgICAgNDogSVJRIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICA1OiBJUlEgNQorICAgICAgICAgICAgICAgICAgICAgICAgIDk6IElSUSA5CisgICAgICAgICAgICAgICAgICAgICAgICAgMTA6IElSUSAxMAorICAgICAgICAgICAgICAgICAgICAgICAgIDExOiBJUlEgMTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAxMjogSVJRIDEyCisgICAgICAgICAgICAgICAgICAgICAgICAgMTU6IElSUSAxNQorICAgICAgICAgIEJ5dGVfdCBGcmVxdWVuY3k6IEEgZmxhZyBpZGVudGlmeWluZyB0aGUgZnJlcXVlbmN5CisgICAgICAgICAgICAgICAgICAgb2YgdGhlIHBlcmlvZGljIGludGVycnVwdCwgY2FuIGJlIGFueSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRX0RJUyAtIHBlcmlvZGljIGludGVycnVwdCBkaXNhYmxlZAorICAgICAgICAgICAgICAgICAgICAgIEZSRVFfMTM3SFogLSAxMzcgSGVydHoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzY5SFogLSA2OSBIZXJ0egorICAgICAgICAgICAgICAgICAgICAgIEZSRVFfMzRIWiAtIDM0IEhlcnR6CisgICAgICAgICAgICAgICAgICAgICAgRlJFUV8xN0haIC0gMTcgSGVydHoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzlIWiAtIDkgSGVydHoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzRIWiAtIDQgSGVydHoKKyAgICAgICAgICAgICAgICAgICBJZiBJUlFOdW0gaXMgc2V0IHRvIDAgdGhlIEZyZXF1ZW5jeSBwYXJhbWV0ZXIgaXMKKyAgICAgICAgICAgICAgICAgICBvdmVyaWRkZW4sIGl0IGlzIGZvcmNlZCB0byBhIHZhbHVlIG9mIEZSRVFfRElTLgorICAgICAgICAgIGludCBQZXJpb2RpY09ubHk6IFRSVUUgaWYgYWxsIGludGVycnVwdHMgZXhjZXB0IHRoZSBwZXJpb2RpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCBhcmUgdG8gYmUgYmxvY2tlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBpcyBib3RoIHRoZSBwZXJpb2RpYyBpbnRlcnJ1cHQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgY2hhbm5lbCBpbnRlcnJ1cHRzIGFyZSBhbGxvd2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIElSUU51bSBpcyBzZXQgdG8gMCB0aGUgUGVyaW9kaWNPbmx5IHBhcmFtZXRlciBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJpZGRlbiwgaXQgaXMgZm9yY2VkIHRvIGEgdmFsdWUgb2YgRkFMU0UuCitSZXR1cm46ICAgaW50OiBOdW1iZXIgb2YgQUlPUHMgb24gdGhlIGNvbnRyb2xsZXIsIG9yIENUTElEX05VTEwgaWYgY29udHJvbGxlcgorICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gZmFpbGVkLgorCitDb21tZW50czoKKyAgICAgICAgICBJZiBwZXJpb2RpYyBpbnRlcnJ1cHRzIGFyZSB0byBiZSBkaXNhYmxlZCBidXQgQUlPUCBpbnRlcnJ1cHRzCisgICAgICAgICAgYXJlIGFsbG93ZWQsIHNldCBGcmVxdWVuY3kgdG8gRlJFUV9ESVMgYW5kIFBlcmlvZGljT25seSB0byBGQUxTRS4KKworICAgICAgICAgIElmIGludGVycnVwdHMgYXJlIHRvIGJlIGNvbXBsZXRlbHkgZGlzYWJsZWQgc2V0IElSUU51bSB0byAwLgorCisgICAgICAgICAgU2V0dGluZyBGcmVxdWVuY3kgdG8gRlJFUV9ESVMgYW5kIFBlcmlvZGljT25seSB0byBUUlVFIGlzIGFuCisgICAgICAgICAgaW52YWxpZCBjb21iaW5hdGlvbi4KKworICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gb2YgZ2xvYmFsIGludGVycnVwdCBtb2RlcywKKyAgICAgICAgICBidXQgaXQgZG9lcyBub3QgYWN0dWFsbHkgZW5hYmxlIGdsb2JhbCBpbnRlcnJ1cHRzLiAgVG8gZW5hYmxlCisgICAgICAgICAgYW5kIGRpc2FibGUgZ2xvYmFsIGludGVycnVwdHMgdXNlIGZ1bmN0aW9ucyBzRW5HbG9iYWxJbnQoKSBhbmQKKyAgICAgICAgICBzRGlzR2xvYmFsSW50KCkuICBFbmFibGluZyBvZiBnbG9iYWwgaW50ZXJydXB0cyBpcyBub3JtYWxseSBub3QKKyAgICAgICAgICBkb25lIHVudGlsIGFsbCBvdGhlciBpbml0aWFsaXphdGlvbnMgYXJlIGNvbXBsZXRlLgorCisgICAgICAgICAgRXZlbiBpZiBpbnRlcnJ1cHRzIGFyZSBnbG9iYWxseSBlbmFibGVkLCB0aGV5IG11c3QgYWxzbyBiZQorICAgICAgICAgIGluZGl2aWR1YWxseSBlbmFibGVkIGZvciBlYWNoIGNoYW5uZWwgdGhhdCBpcyB0byBnZW5lcmF0ZQorICAgICAgICAgIGludGVycnVwdHMuCisKK1dhcm5pbmdzOiBObyByYW5nZSBjaGVja2luZyBvbiBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgaXMgZG9uZS4KKworICAgICAgICAgIE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCisKKyAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uIGFsbCBBSU9QcyBvbiB0aGUgY29udHJvbGxlciBhcmUgZGlzYWJsZWQsCisgICAgICAgICAgdGhleSBjYW4gYmUgZW5hYmxlZCB3aXRoIHNFbkFpb3AoKS4KKyovCitpbnQgc0luaXRDb250cm9sbGVyKENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBDdGxOdW0sIEJ5dGVJT190IE11ZGJhY0lPLAorCQkgICAgQnl0ZUlPX3QgKiBBaW9wSU9MaXN0LCBpbnQgQWlvcElPTGlzdFNpemUsIGludCBJUlFOdW0sCisJCSAgICBCeXRlX3QgRnJlcXVlbmN5LCBpbnQgUGVyaW9kaWNPbmx5KQoreworCWludCBpOworCUJ5dGVJT190IGlvOworCWludCBkb25lOworCisJQ3RsUC0+QWlvcEludHJCaXRzID0gYWlvcF9pbnRyX2JpdHM7CisJQ3RsUC0+QWx0Q2hhblJpbmdJbmRpY2F0b3IgPSAwOworCUN0bFAtPkN0bE51bSA9IEN0bE51bTsKKwlDdGxQLT5DdGxJRCA9IENUTElEXzAwMDE7CS8qIGNvbnRyb2xsZXIgcmVsZWFzZSAxICovCisJQ3RsUC0+QnVzVHlwZSA9IGlzSVNBOworCUN0bFAtPk1CYXNlSU8gPSBNdWRiYWNJTzsKKwlDdGxQLT5NUmVnMUlPID0gTXVkYmFjSU8gKyAxOworCUN0bFAtPk1SZWcySU8gPSBNdWRiYWNJTyArIDI7CisJQ3RsUC0+TVJlZzNJTyA9IE11ZGJhY0lPICsgMzsKKyNpZiAxCisJQ3RsUC0+TVJlZzIgPSAwOwkvKiBpbnRlcnJ1cHQgZGlzYWJsZSAqLworCUN0bFAtPk1SZWczID0gMDsJLyogbm8gcGVyaW9kaWMgaW50ZXJydXB0cyAqLworI2Vsc2UKKwlpZiAoc0lSUU1hcFtJUlFOdW1dID09IDApIHsJLyogaW50ZXJydXB0cyBnbG9iYWxseSBkaXNhYmxlZCAqLworCQlDdGxQLT5NUmVnMiA9IDA7CS8qIGludGVycnVwdCBkaXNhYmxlICovCisJCUN0bFAtPk1SZWczID0gMDsJLyogbm8gcGVyaW9kaWMgaW50ZXJydXB0cyAqLworCX0gZWxzZSB7CisJCUN0bFAtPk1SZWcyID0gc0lSUU1hcFtJUlFOdW1dOwkvKiBzZXQgSVJRIG51bWJlciAqLworCQlDdGxQLT5NUmVnMyA9IEZyZXF1ZW5jeTsJLyogc2V0IGZyZXF1ZW5jeSAqLworCQlpZiAoUGVyaW9kaWNPbmx5KSB7CS8qIHBlcmlvZGljIGludGVycnVwdCBvbmx5ICovCisJCQlDdGxQLT5NUmVnMyB8PSBQRVJJT0RJQ19PTkxZOworCQl9CisJfQorI2VuZGlmCisJc091dEIoQ3RsUC0+TVJlZzJJTywgQ3RsUC0+TVJlZzIpOworCXNPdXRCKEN0bFAtPk1SZWczSU8sIEN0bFAtPk1SZWczKTsKKwlzQ29udHJvbGxlckVPSShDdGxQKTsJLyogY2xlYXIgRU9JIGlmIHdhcm0gaW5pdCAqLworCS8qIEluaXQgQUlPUHMgKi8KKwlDdGxQLT5OdW1BaW9wID0gMDsKKwlmb3IgKGkgPSBkb25lID0gMDsgaSA8IEFpb3BJT0xpc3RTaXplOyBpKyspIHsKKwkJaW8gPSBBaW9wSU9MaXN0W2ldOworCQlDdGxQLT5BaW9wSU9baV0gPSAoV29yZElPX3QpIGlvOworCQlDdGxQLT5BaW9wSW50Q2hhbklPW2ldID0gaW8gKyBfSU5UX0NIQU47CisJCXNPdXRCKEN0bFAtPk1SZWcySU8sIEN0bFAtPk1SZWcyIHwgKGkgJiAweDAzKSk7CS8qIEFJT1AgaW5kZXggKi8KKwkJc091dEIoTXVkYmFjSU8sIChCeXRlX3QpIChpbyA+PiA2KSk7CS8qIHNldCB1cCBBSU9QIEkvTyBpbiBNVURCQUMgKi8KKwkJaWYgKGRvbmUpCisJCQljb250aW51ZTsKKwkJc0VuQWlvcChDdGxQLCBpKTsJLyogZW5hYmxlIHRoZSBBSU9QICovCisJCUN0bFAtPkFpb3BJRFtpXSA9IHNSZWFkQWlvcElEKGlvKTsJLyogcmVhZCBBSU9QIElEICovCisJCWlmIChDdGxQLT5BaW9wSURbaV0gPT0gQUlPUElEX05VTEwpCS8qIGlmIEFJT1AgZG9lcyBub3QgZXhpc3QgKi8KKwkJCWRvbmUgPSAxOwkvKiBkb25lIGxvb2tpbmcgZm9yIEFJT1BzICovCisJCWVsc2UgeworCQkJQ3RsUC0+QWlvcE51bUNoYW5baV0gPSBzUmVhZEFpb3BOdW1DaGFuKChXb3JkSU9fdCkgaW8pOwkvKiBudW0gY2hhbm5lbHMgaW4gQUlPUCAqLworCQkJc091dFcoKFdvcmRJT190KSBpbyArIF9JTkRYX0FERFIsIF9DTEtfUFJFKTsJLyogY2xvY2sgcHJlc2NhbGVyICovCisJCQlzT3V0QihpbyArIF9JTkRYX0RBVEEsIHNDbG9ja1ByZXNjYWxlKTsKKwkJCUN0bFAtPk51bUFpb3ArKzsJLyogYnVtcCBjb3VudCBvZiBBSU9QcyAqLworCQl9CisJCXNEaXNBaW9wKEN0bFAsIGkpOwkvKiBkaXNhYmxlIEFJT1AgKi8KKwl9CisKKwlpZiAoQ3RsUC0+TnVtQWlvcCA9PSAwKQorCQlyZXR1cm4gKC0xKTsKKwllbHNlCisJCXJldHVybiAoQ3RsUC0+TnVtQWlvcCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzUENJSW5pdENvbnRyb2xsZXIKK1B1cnBvc2U6ICBJbml0aWFsaXphdGlvbiBvZiBjb250cm9sbGVyIGdsb2JhbCByZWdpc3RlcnMgYW5kIGNvbnRyb2xsZXIKKyAgICAgICAgICBzdHJ1Y3R1cmUuCitDYWxsOiAgICAgc1BDSUluaXRDb250cm9sbGVyKEN0bFAsQ3RsTnVtLEFpb3BJT0xpc3QsQWlvcElPTGlzdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElSUU51bSxGcmVxdWVuY3ksUGVyaW9kaWNPbmx5KQorICAgICAgICAgIENPTlRST0xMRVJfVCAqQ3RsUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCisgICAgICAgICAgaW50IEN0bE51bTsgQ29udHJvbGxlciBudW1iZXIKKyAgICAgICAgICBCeXRlSU9fdCAqQWlvcElPTGlzdDsgTGlzdCBvZiBJL08gYWRkcmVzc2VzIGZvciBlYWNoIEFJT1AuCisgICAgICAgICAgICAgVGhpcyBsaXN0IG11c3QgYmUgaW4gdGhlIG9yZGVyIHRoZSBBSU9QcyB3aWxsIGJlIGZvdW5kIG9uIHRoZQorICAgICAgICAgICAgIGNvbnRyb2xsZXIuICBPbmNlIGFuIEFJT1AgaW4gdGhlIGxpc3QgaXMgbm90IGZvdW5kLCBpdCBpcworICAgICAgICAgICAgIGFzc3VtZWQgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBBSU9QcyBvbiB0aGUgY29udHJvbGxlci4KKyAgICAgICAgICBpbnQgQWlvcElPTGlzdFNpemU7IE51bWJlciBvZiBhZGRyZXNzZXMgaW4gQWlvcElPTGlzdAorICAgICAgICAgIGludCBJUlFOdW07IEludGVycnVwdCBSZXF1ZXN0IG51bWJlci4gIENhbiBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAwOiBEaXNhYmxlIGdsb2JhbCBpbnRlcnJ1cHRzCisgICAgICAgICAgICAgICAgICAgICAgICAgMzogSVJRIDMKKyAgICAgICAgICAgICAgICAgICAgICAgICA0OiBJUlEgNAorICAgICAgICAgICAgICAgICAgICAgICAgIDU6IElSUSA1CisgICAgICAgICAgICAgICAgICAgICAgICAgOTogSVJRIDkKKyAgICAgICAgICAgICAgICAgICAgICAgICAxMDogSVJRIDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgMTE6IElSUSAxMQorICAgICAgICAgICAgICAgICAgICAgICAgIDEyOiBJUlEgMTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAxNTogSVJRIDE1CisgICAgICAgICAgQnl0ZV90IEZyZXF1ZW5jeTogQSBmbGFnIGlkZW50aWZ5aW5nIHRoZSBmcmVxdWVuY3kKKyAgICAgICAgICAgICAgICAgICBvZiB0aGUgcGVyaW9kaWMgaW50ZXJydXB0LCBjYW4gYmUgYW55IG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgICAgICAgIEZSRVFfRElTIC0gcGVyaW9kaWMgaW50ZXJydXB0IGRpc2FibGVkCisgICAgICAgICAgICAgICAgICAgICAgRlJFUV8xMzdIWiAtIDEzNyBIZXJ0egorICAgICAgICAgICAgICAgICAgICAgIEZSRVFfNjlIWiAtIDY5IEhlcnR6CisgICAgICAgICAgICAgICAgICAgICAgRlJFUV8zNEhaIC0gMzQgSGVydHoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzE3SFogLSAxNyBIZXJ0egorICAgICAgICAgICAgICAgICAgICAgIEZSRVFfOUhaIC0gOSBIZXJ0egorICAgICAgICAgICAgICAgICAgICAgIEZSRVFfNEhaIC0gNCBIZXJ0egorICAgICAgICAgICAgICAgICAgIElmIElSUU51bSBpcyBzZXQgdG8gMCB0aGUgRnJlcXVlbmN5IHBhcmFtZXRlciBpcworICAgICAgICAgICAgICAgICAgIG92ZXJpZGRlbiwgaXQgaXMgZm9yY2VkIHRvIGEgdmFsdWUgb2YgRlJFUV9ESVMuCisgICAgICAgICAgaW50IFBlcmlvZGljT25seTogVFJVRSBpZiBhbGwgaW50ZXJydXB0cyBleGNlcHQgdGhlIHBlcmlvZGljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGFyZSB0byBiZSBibG9ja2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIGlzIGJvdGggdGhlIHBlcmlvZGljIGludGVycnVwdCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBjaGFubmVsIGludGVycnVwdHMgYXJlIGFsbG93ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgSVJRTnVtIGlzIHNldCB0byAwIHRoZSBQZXJpb2RpY09ubHkgcGFyYW1ldGVyIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmlkZGVuLCBpdCBpcyBmb3JjZWQgdG8gYSB2YWx1ZSBvZiBGQUxTRS4KK1JldHVybjogICBpbnQ6IE51bWJlciBvZiBBSU9QcyBvbiB0aGUgY29udHJvbGxlciwgb3IgQ1RMSURfTlVMTCBpZiBjb250cm9sbGVyCisgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiBmYWlsZWQuCisKK0NvbW1lbnRzOgorICAgICAgICAgIElmIHBlcmlvZGljIGludGVycnVwdHMgYXJlIHRvIGJlIGRpc2FibGVkIGJ1dCBBSU9QIGludGVycnVwdHMKKyAgICAgICAgICBhcmUgYWxsb3dlZCwgc2V0IEZyZXF1ZW5jeSB0byBGUkVRX0RJUyBhbmQgUGVyaW9kaWNPbmx5IHRvIEZBTFNFLgorCisgICAgICAgICAgSWYgaW50ZXJydXB0cyBhcmUgdG8gYmUgY29tcGxldGVseSBkaXNhYmxlZCBzZXQgSVJRTnVtIHRvIDAuCisKKyAgICAgICAgICBTZXR0aW5nIEZyZXF1ZW5jeSB0byBGUkVRX0RJUyBhbmQgUGVyaW9kaWNPbmx5IHRvIFRSVUUgaXMgYW4KKyAgICAgICAgICBpbnZhbGlkIGNvbWJpbmF0aW9uLgorCisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbml0aWFsaXphdGlvbiBvZiBnbG9iYWwgaW50ZXJydXB0IG1vZGVzLAorICAgICAgICAgIGJ1dCBpdCBkb2VzIG5vdCBhY3R1YWxseSBlbmFibGUgZ2xvYmFsIGludGVycnVwdHMuICBUbyBlbmFibGUKKyAgICAgICAgICBhbmQgZGlzYWJsZSBnbG9iYWwgaW50ZXJydXB0cyB1c2UgZnVuY3Rpb25zIHNFbkdsb2JhbEludCgpIGFuZAorICAgICAgICAgIHNEaXNHbG9iYWxJbnQoKS4gIEVuYWJsaW5nIG9mIGdsb2JhbCBpbnRlcnJ1cHRzIGlzIG5vcm1hbGx5IG5vdAorICAgICAgICAgIGRvbmUgdW50aWwgYWxsIG90aGVyIGluaXRpYWxpemF0aW9ucyBhcmUgY29tcGxldGUuCisKKyAgICAgICAgICBFdmVuIGlmIGludGVycnVwdHMgYXJlIGdsb2JhbGx5IGVuYWJsZWQsIHRoZXkgbXVzdCBhbHNvIGJlCisgICAgICAgICAgaW5kaXZpZHVhbGx5IGVuYWJsZWQgZm9yIGVhY2ggY2hhbm5lbCB0aGF0IGlzIHRvIGdlbmVyYXRlCisgICAgICAgICAgaW50ZXJydXB0cy4KKworV2FybmluZ3M6IE5vIHJhbmdlIGNoZWNraW5nIG9uIGFueSBvZiB0aGUgcGFyYW1ldGVycyBpcyBkb25lLgorCisgICAgICAgICAgTm8gY29udGV4dCBzd2l0Y2hlcyBhcmUgYWxsb3dlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBmdW5jdGlvbi4KKworICAgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24gYWxsIEFJT1BzIG9uIHRoZSBjb250cm9sbGVyIGFyZSBkaXNhYmxlZCwKKyAgICAgICAgICB0aGV5IGNhbiBiZSBlbmFibGVkIHdpdGggc0VuQWlvcCgpLgorKi8KK2ludCBzUENJSW5pdENvbnRyb2xsZXIoQ09OVFJPTExFUl9UICogQ3RsUCwgaW50IEN0bE51bSwKKwkJICAgICAgIEJ5dGVJT190ICogQWlvcElPTGlzdCwgaW50IEFpb3BJT0xpc3RTaXplLAorCQkgICAgICAgV29yZElPX3QgQ29uZmlnSU8sIGludCBJUlFOdW0sIEJ5dGVfdCBGcmVxdWVuY3ksCisJCSAgICAgICBpbnQgUGVyaW9kaWNPbmx5LCBpbnQgYWx0Q2hhblJpbmdJbmRpY2F0b3IsCisJCSAgICAgICBpbnQgVVBDSVJpbmdJbmQpCit7CisJaW50IGk7CisJQnl0ZUlPX3QgaW87CisKKwlDdGxQLT5BbHRDaGFuUmluZ0luZGljYXRvciA9IGFsdENoYW5SaW5nSW5kaWNhdG9yOworCUN0bFAtPlVQQ0lSaW5nSW5kID0gVVBDSVJpbmdJbmQ7CisJQ3RsUC0+Q3RsTnVtID0gQ3RsTnVtOworCUN0bFAtPkN0bElEID0gQ1RMSURfMDAwMTsJLyogY29udHJvbGxlciByZWxlYXNlIDEgKi8KKwlDdGxQLT5CdXNUeXBlID0gaXNQQ0k7CS8qIGNvbnRyb2xsZXIgcmVsZWFzZSAxICovCisKKwlpZiAoQ29uZmlnSU8pIHsKKwkJQ3RsUC0+aXNVUENJID0gMTsKKwkJQ3RsUC0+UENJSU8gPSBDb25maWdJTyArIF9QQ0lfOTAzMF9JTlRfQ1RSTDsKKwkJQ3RsUC0+UENJSU8yID0gQ29uZmlnSU8gKyBfUENJXzkwMzBfR1BJT19DVFJMOworCQlDdGxQLT5BaW9wSW50ckJpdHMgPSB1cGNpX2Fpb3BfaW50cl9iaXRzOworCX0gZWxzZSB7CisJCUN0bFAtPmlzVVBDSSA9IDA7CisJCUN0bFAtPlBDSUlPID0KKwkJICAgIChXb3JkSU9fdCkgKChCeXRlSU9fdCkgQWlvcElPTGlzdFswXSArIF9QQ0lfSU5UX0ZVTkMpOworCQlDdGxQLT5BaW9wSW50ckJpdHMgPSBhaW9wX2ludHJfYml0czsKKwl9CisKKwlzUENJQ29udHJvbGxlckVPSShDdGxQKTsJLyogY2xlYXIgRU9JIGlmIHdhcm0gaW5pdCAqLworCS8qIEluaXQgQUlPUHMgKi8KKwlDdGxQLT5OdW1BaW9wID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgQWlvcElPTGlzdFNpemU7IGkrKykgeworCQlpbyA9IEFpb3BJT0xpc3RbaV07CisJCUN0bFAtPkFpb3BJT1tpXSA9IChXb3JkSU9fdCkgaW87CisJCUN0bFAtPkFpb3BJbnRDaGFuSU9baV0gPSBpbyArIF9JTlRfQ0hBTjsKKworCQlDdGxQLT5BaW9wSURbaV0gPSBzUmVhZEFpb3BJRChpbyk7CS8qIHJlYWQgQUlPUCBJRCAqLworCQlpZiAoQ3RsUC0+QWlvcElEW2ldID09IEFJT1BJRF9OVUxMKQkvKiBpZiBBSU9QIGRvZXMgbm90IGV4aXN0ICovCisJCQlicmVhazsJLyogZG9uZSBsb29raW5nIGZvciBBSU9QcyAqLworCisJCUN0bFAtPkFpb3BOdW1DaGFuW2ldID0gc1JlYWRBaW9wTnVtQ2hhbigoV29yZElPX3QpIGlvKTsJLyogbnVtIGNoYW5uZWxzIGluIEFJT1AgKi8KKwkJc091dFcoKFdvcmRJT190KSBpbyArIF9JTkRYX0FERFIsIF9DTEtfUFJFKTsJLyogY2xvY2sgcHJlc2NhbGVyICovCisJCXNPdXRCKGlvICsgX0lORFhfREFUQSwgc0Nsb2NrUHJlc2NhbGUpOworCQlDdGxQLT5OdW1BaW9wKys7CS8qIGJ1bXAgY291bnQgb2YgQUlPUHMgKi8KKwl9CisKKwlpZiAoQ3RsUC0+TnVtQWlvcCA9PSAwKQorCQlyZXR1cm4gKC0xKTsKKwllbHNlCisJCXJldHVybiAoQ3RsUC0+TnVtQWlvcCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzUmVhZEFpb3BJRAorUHVycG9zZTogIFJlYWQgdGhlIEFJT1AgaWRlbmZpY2F0aW9uIG51bWJlciBkaXJlY3RseSBmcm9tIGFuIEFJT1AuCitDYWxsOiAgICAgc1JlYWRBaW9wSUQoaW8pCisgICAgICAgICAgQnl0ZUlPX3QgaW86IEFJT1AgYmFzZSBJL08gYWRkcmVzcworUmV0dXJuOiAgIGludDogRmxhZyBBSU9QSURfWFhYWCBpZiBhIHZhbGlkIEFJT1AgaXMgZm91bmQsIHdoZXJlIFgKKyAgICAgICAgICAgICAgICAgaXMgcmVwbGFjZSBieSBhbiBpZGVudGlmeWluZyBudW1iZXIuCisgICAgICAgICAgRmxhZyBBSU9QSURfTlVMTCBpZiBubyB2YWxpZCBBSU9QIGlzIGZvdW5kCitXYXJuaW5nczogTm8gY29udGV4dCBzd2l0Y2hlcyBhcmUgYWxsb3dlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBmdW5jdGlvbi4KKworKi8KK2ludCBzUmVhZEFpb3BJRChCeXRlSU9fdCBpbykKK3sKKwlCeXRlX3QgQWlvcElEOwkJLyogSUQgYnl0ZSBmcm9tIEFJT1AgKi8KKworCXNPdXRCKGlvICsgX0NNRF9SRUcsIFJFU0VUX0FMTCk7CS8qIHJlc2V0IEFJT1AgKi8KKwlzT3V0QihpbyArIF9DTURfUkVHLCAweDApOworCUFpb3BJRCA9IHNJblcoaW8gKyBfQ0hOX1NUQVQwKSAmIDB4MDc7CisJaWYgKEFpb3BJRCA9PSAweDA2KQorCQlyZXR1cm4gKDEpOworCWVsc2UJCQkvKiBBSU9QIGRvZXMgbm90IGV4aXN0ICovCisJCXJldHVybiAoLTEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1JlYWRBaW9wTnVtQ2hhbgorUHVycG9zZTogIFJlYWQgdGhlIG51bWJlciBvZiBjaGFubmVscyBhdmFpbGFibGUgaW4gYW4gQUlPUCBkaXJlY3RseSBmcm9tCisgICAgICAgICAgYW4gQUlPUC4KK0NhbGw6ICAgICBzUmVhZEFpb3BOdW1DaGFuKGlvKQorICAgICAgICAgIFdvcmRJT190IGlvOiBBSU9QIGJhc2UgSS9PIGFkZHJlc3MKK1JldHVybjogICBpbnQ6IFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYXZhaWxhYmxlCitDb21tZW50czogVGhlIG51bWJlciBvZiBjaGFubmVscyBpcyBkZXRlcm1pbmVkIGJ5IHdyaXRlL3JlYWRzIGZyb20gaWRlbnRpY2FsCisgICAgICAgICAgb2Zmc2V0cyB3aXRoaW4gdGhlIFNSQU0gYWRkcmVzcyBzcGFjZXMgZm9yIGNoYW5uZWxzIDAgYW5kIDQuCisgICAgICAgICAgSWYgdGhlIGNoYW5uZWwgNCBzcGFjZSBpcyBtaXJyb3JlZCB0byBjaGFubmVsIDAgaXQgaXMgYSA0IGNoYW5uZWwKKyAgICAgICAgICBBSU9QLCBvdGhlcndpc2UgaXQgaXMgYW4gOCBjaGFubmVsLgorV2FybmluZ3M6IE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCisqLworaW50IHNSZWFkQWlvcE51bUNoYW4oV29yZElPX3QgaW8pCit7CisJV29yZF90IHg7CisJc3RhdGljIEJ5dGVfdCBSWzRdID0geyAweDAwLCAweDAwLCAweDM0LCAweDEyIH07CisKKwkvKiB3cml0ZSB0byBjaGFuIDAgU1JBTSAqLworCXNPdXREVygoRFdvcmRJT190KSBpbyArIF9JTkRYX0FERFIsICooKERXb3JkX3QgKikgJiBSWzBdKSk7CisJc091dFcoaW8gKyBfSU5EWF9BRERSLCAwKTsJLyogcmVhZCBmcm9tIFNSQU0sIGNoYW4gMCAqLworCXggPSBzSW5XKGlvICsgX0lORFhfREFUQSk7CisJc091dFcoaW8gKyBfSU5EWF9BRERSLCAweDQwMDApOwkvKiByZWFkIGZyb20gU1JBTSwgY2hhbiA0ICovCisJaWYgKHggIT0gc0luVyhpbyArIF9JTkRYX0RBVEEpKQkvKiBpZiBkaWZmZXJlbnQgbXVzdCBiZSA4IGNoYW4gKi8KKwkJcmV0dXJuICg4KTsKKwllbHNlCisJCXJldHVybiAoNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzSW5pdENoYW4KK1B1cnBvc2U6ICBJbml0aWFsaXphdGlvbiBvZiBhIGNoYW5uZWwgYW5kIGNoYW5uZWwgc3RydWN0dXJlCitDYWxsOiAgICAgc0luaXRDaGFuKEN0bFAsQ2hQLEFpb3BOdW0sQ2hhbk51bSkKKyAgICAgICAgICBDT05UUk9MTEVSX1QgKkN0bFA7IFB0ciB0byBjb250cm9sbGVyIHN0cnVjdHVyZQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyAgICAgICAgICBpbnQgQWlvcE51bTsgQUlPUCBudW1iZXIgd2l0aGluIGNvbnRyb2xsZXIKKyAgICAgICAgICBpbnQgQ2hhbk51bTsgQ2hhbm5lbCBudW1iZXIgd2l0aGluIEFJT1AKK1JldHVybjogICBpbnQ6IFRSVUUgaWYgaW5pdGlhbGl6YXRpb24gc3VjY2VlZGVkLCBGQUxTRSBpZiBpdCBmYWlscyBiZWNhdXNlIGNoYW5uZWwKKyAgICAgICAgICAgICAgIG51bWJlciBleGNlZWRzIG51bWJlciBvZiBjaGFubmVscyBhdmFpbGFibGUgaW4gQUlPUC4KK0NvbW1lbnRzOiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhIGNoYW5uZWwgY2FuIGJlIHVzZWQuCitXYXJuaW5nczogTm8gcmFuZ2UgY2hlY2tpbmcgb24gYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGlzIGRvbmUuCisKKyAgICAgICAgICBObyBjb250ZXh0IHN3aXRjaGVzIGFyZSBhbGxvd2VkIHdoaWxlIGV4ZWN1dGluZyB0aGlzIGZ1bmN0aW9uLgorKi8KK2ludCBzSW5pdENoYW4oQ09OVFJPTExFUl9UICogQ3RsUCwgQ0hBTk5FTF9UICogQ2hQLCBpbnQgQWlvcE51bSwKKwkgICAgICBpbnQgQ2hhbk51bSkKK3sKKwlpbnQgaTsKKwlXb3JkSU9fdCBBaW9wSU87CisJV29yZElPX3QgQ2hJT09mZjsKKwlCeXRlX3QgKkNoUjsKKwlXb3JkX3QgQ2hPZmY7CisJc3RhdGljIEJ5dGVfdCBSWzRdOworCWludCBicmQ5NjAwOworCisJaWYgKENoYW5OdW0gPj0gQ3RsUC0+QWlvcE51bUNoYW5bQWlvcE51bV0pCisJCXJldHVybiAoRkFMU0UpOwkvKiBleGNlZWRzIG51bSBjaGFucyBpbiBBSU9QICovCisKKwkvKiBDaGFubmVsLCBBSU9QLCBhbmQgY29udHJvbGxlciBpZGVudGlmaWVycyAqLworCUNoUC0+Q3RsUCA9IEN0bFA7CisJQ2hQLT5DaGFuSUQgPSBDdGxQLT5BaW9wSURbQWlvcE51bV07CisJQ2hQLT5BaW9wTnVtID0gQWlvcE51bTsKKwlDaFAtPkNoYW5OdW0gPSBDaGFuTnVtOworCisJLyogR2xvYmFsIGRpcmVjdCBhZGRyZXNzZXMgKi8KKwlBaW9wSU8gPSBDdGxQLT5BaW9wSU9bQWlvcE51bV07CisJQ2hQLT5DbWQgPSAoQnl0ZUlPX3QpIEFpb3BJTyArIF9DTURfUkVHOworCUNoUC0+SW50Q2hhbiA9IChCeXRlSU9fdCkgQWlvcElPICsgX0lOVF9DSEFOOworCUNoUC0+SW50TWFzayA9IChCeXRlSU9fdCkgQWlvcElPICsgX0lOVF9NQVNLOworCUNoUC0+SW5kZXhBZGRyID0gKERXb3JkSU9fdCkgQWlvcElPICsgX0lORFhfQUREUjsKKwlDaFAtPkluZGV4RGF0YSA9IEFpb3BJTyArIF9JTkRYX0RBVEE7CisKKwkvKiBDaGFubmVsIGRpcmVjdCBhZGRyZXNzZXMgKi8KKwlDaElPT2ZmID0gQWlvcElPICsgQ2hQLT5DaGFuTnVtICogMjsKKwlDaFAtPlR4UnhEYXRhID0gQ2hJT09mZiArIF9URDA7CisJQ2hQLT5DaGFuU3RhdCA9IENoSU9PZmYgKyBfQ0hOX1NUQVQwOworCUNoUC0+VHhSeENvdW50ID0gQ2hJT09mZiArIF9GSUZPX0NOVDA7CisJQ2hQLT5JbnRJRCA9IChCeXRlSU9fdCkgQWlvcElPICsgQ2hQLT5DaGFuTnVtICsgX0lOVF9JRDA7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjaGFubmVsIGZyb20gdGhlIFJEYXRhIGFycmF5ICovCisJZm9yIChpID0gMDsgaSA8IFJEQVRBU0laRTsgaSArPSA0KSB7CisJCVJbMF0gPSBSRGF0YVtpXTsKKwkJUlsxXSA9IFJEYXRhW2kgKyAxXSArIDB4MTAgKiBDaGFuTnVtOworCQlSWzJdID0gUkRhdGFbaSArIDJdOworCQlSWzNdID0gUkRhdGFbaSArIDNdOworCQlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooKERXb3JkX3QgKikgJiBSWzBdKSk7CisJfQorCisJQ2hSID0gQ2hQLT5SOworCWZvciAoaSA9IDA7IGkgPCBSUkVHREFUQVNJWkU7IGkgKz0gNCkgeworCQlDaFJbaV0gPSBSUmVnRGF0YVtpXTsKKwkJQ2hSW2kgKyAxXSA9IFJSZWdEYXRhW2kgKyAxXSArIDB4MTAgKiBDaGFuTnVtOworCQlDaFJbaSArIDJdID0gUlJlZ0RhdGFbaSArIDJdOworCQlDaFJbaSArIDNdID0gUlJlZ0RhdGFbaSArIDNdOworCX0KKworCS8qIEluZGV4ZWQgcmVnaXN0ZXJzICovCisJQ2hPZmYgPSAoV29yZF90KSBDaGFuTnVtICoweDEwMDA7CisKKwlpZiAoc0Nsb2NrUHJlc2NhbGUgPT0gMHgxNCkKKwkJYnJkOTYwMCA9IDQ3OworCWVsc2UKKwkJYnJkOTYwMCA9IDIzOworCisJQ2hQLT5CYXVkRGl2WzBdID0gKEJ5dGVfdCkgKENoT2ZmICsgX0JBVUQpOworCUNoUC0+QmF1ZERpdlsxXSA9IChCeXRlX3QpICgoQ2hPZmYgKyBfQkFVRCkgPj4gOCk7CisJQ2hQLT5CYXVkRGl2WzJdID0gKEJ5dGVfdCkgYnJkOTYwMDsKKwlDaFAtPkJhdWREaXZbM10gPSAoQnl0ZV90KSAoYnJkOTYwMCA+PiA4KTsKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIENoUC0+QmF1ZERpdlswXSk7CisKKwlDaFAtPlR4Q29udHJvbFswXSA9IChCeXRlX3QpIChDaE9mZiArIF9UWF9DVFJMKTsKKwlDaFAtPlR4Q29udHJvbFsxXSA9IChCeXRlX3QpICgoQ2hPZmYgKyBfVFhfQ1RSTCkgPj4gOCk7CisJQ2hQLT5UeENvbnRyb2xbMl0gPSAwOworCUNoUC0+VHhDb250cm9sWzNdID0gMDsKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIENoUC0+VHhDb250cm9sWzBdKTsKKworCUNoUC0+UnhDb250cm9sWzBdID0gKEJ5dGVfdCkgKENoT2ZmICsgX1JYX0NUUkwpOworCUNoUC0+UnhDb250cm9sWzFdID0gKEJ5dGVfdCkgKChDaE9mZiArIF9SWF9DVFJMKSA+PiA4KTsKKwlDaFAtPlJ4Q29udHJvbFsyXSA9IDA7CisJQ2hQLT5SeENvbnRyb2xbM10gPSAwOworCXNPdXREVyhDaFAtPkluZGV4QWRkciwgKihEV29yZF90ICopICYgQ2hQLT5SeENvbnRyb2xbMF0pOworCisJQ2hQLT5UeEVuYWJsZXNbMF0gPSAoQnl0ZV90KSAoQ2hPZmYgKyBfVFhfRU5CTFMpOworCUNoUC0+VHhFbmFibGVzWzFdID0gKEJ5dGVfdCkgKChDaE9mZiArIF9UWF9FTkJMUykgPj4gOCk7CisJQ2hQLT5UeEVuYWJsZXNbMl0gPSAwOworCUNoUC0+VHhFbmFibGVzWzNdID0gMDsKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIENoUC0+VHhFbmFibGVzWzBdKTsKKworCUNoUC0+VHhDb21wYXJlWzBdID0gKEJ5dGVfdCkgKENoT2ZmICsgX1RYQ01QMSk7CisJQ2hQLT5UeENvbXBhcmVbMV0gPSAoQnl0ZV90KSAoKENoT2ZmICsgX1RYQ01QMSkgPj4gOCk7CisJQ2hQLT5UeENvbXBhcmVbMl0gPSAwOworCUNoUC0+VHhDb21wYXJlWzNdID0gMDsKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIENoUC0+VHhDb21wYXJlWzBdKTsKKworCUNoUC0+VHhSZXBsYWNlMVswXSA9IChCeXRlX3QpIChDaE9mZiArIF9UWFJFUDFCMSk7CisJQ2hQLT5UeFJlcGxhY2UxWzFdID0gKEJ5dGVfdCkgKChDaE9mZiArIF9UWFJFUDFCMSkgPj4gOCk7CisJQ2hQLT5UeFJlcGxhY2UxWzJdID0gMDsKKwlDaFAtPlR4UmVwbGFjZTFbM10gPSAwOworCXNPdXREVyhDaFAtPkluZGV4QWRkciwgKihEV29yZF90ICopICYgQ2hQLT5UeFJlcGxhY2UxWzBdKTsKKworCUNoUC0+VHhSZXBsYWNlMlswXSA9IChCeXRlX3QpIChDaE9mZiArIF9UWFJFUDIpOworCUNoUC0+VHhSZXBsYWNlMlsxXSA9IChCeXRlX3QpICgoQ2hPZmYgKyBfVFhSRVAyKSA+PiA4KTsKKwlDaFAtPlR4UmVwbGFjZTJbMl0gPSAwOworCUNoUC0+VHhSZXBsYWNlMlszXSA9IDA7CisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPlR4UmVwbGFjZTJbMF0pOworCisJQ2hQLT5UeEZJRk9QdHJzID0gQ2hPZmYgKyBfVFhGX09VVFA7CisJQ2hQLT5UeEZJRk8gPSBDaE9mZiArIF9UWF9GSUZPOworCisJc091dEIoQ2hQLT5DbWQsIChCeXRlX3QpIENoYW5OdW0gfCBSRVNUWEZDTlQpOwkvKiBhcHBseSByZXNldCBUeCBGSUZPIGNvdW50ICovCisJc091dEIoQ2hQLT5DbWQsIChCeXRlX3QpIENoYW5OdW0pOwkvKiByZW1vdmUgcmVzZXQgVHggRklGTyBjb3VudCAqLworCXNPdXRXKChXb3JkSU9fdCkgQ2hQLT5JbmRleEFkZHIsIENoUC0+VHhGSUZPUHRycyk7CS8qIGNsZWFyIFR4IGluL291dCBwdHJzICovCisJc091dFcoQ2hQLT5JbmRleERhdGEsIDApOworCUNoUC0+UnhGSUZPUHRycyA9IENoT2ZmICsgX1JYRl9PVVRQOworCUNoUC0+UnhGSUZPID0gQ2hPZmYgKyBfUlhfRklGTzsKKworCXNPdXRCKENoUC0+Q21kLCAoQnl0ZV90KSBDaGFuTnVtIHwgUkVTUlhGQ05UKTsJLyogYXBwbHkgcmVzZXQgUnggRklGTyBjb3VudCAqLworCXNPdXRCKENoUC0+Q21kLCAoQnl0ZV90KSBDaGFuTnVtKTsJLyogcmVtb3ZlIHJlc2V0IFJ4IEZJRk8gY291bnQgKi8KKwlzT3V0VygoV29yZElPX3QpIENoUC0+SW5kZXhBZGRyLCBDaFAtPlJ4RklGT1B0cnMpOwkvKiBjbGVhciBSeCBvdXQgcHRyICovCisJc091dFcoQ2hQLT5JbmRleERhdGEsIDApOworCXNPdXRXKChXb3JkSU9fdCkgQ2hQLT5JbmRleEFkZHIsIENoUC0+UnhGSUZPUHRycyArIDIpOwkvKiBjbGVhciBSeCBpbiBwdHIgKi8KKwlzT3V0VyhDaFAtPkluZGV4RGF0YSwgMCk7CisJQ2hQLT5UeFByaW9DbnQgPSBDaE9mZiArIF9UWFBfQ05UOworCXNPdXRXKChXb3JkSU9fdCkgQ2hQLT5JbmRleEFkZHIsIENoUC0+VHhQcmlvQ250KTsKKwlzT3V0QihDaFAtPkluZGV4RGF0YSwgMCk7CisJQ2hQLT5UeFByaW9QdHIgPSBDaE9mZiArIF9UWFBfUE5UUjsKKwlzT3V0VygoV29yZElPX3QpIENoUC0+SW5kZXhBZGRyLCBDaFAtPlR4UHJpb1B0cik7CisJc091dEIoQ2hQLT5JbmRleERhdGEsIDApOworCUNoUC0+VHhQcmlvQnVmID0gQ2hPZmYgKyBfVFhQX0JVRjsKKwlzRW5SeFByb2Nlc3NvcihDaFApOwkvKiBzdGFydCB0aGUgUnggcHJvY2Vzc29yICovCisKKwlyZXR1cm4gKFRSVUUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1N0b3BSeFByb2Nlc3NvcgorUHVycG9zZTogIFN0b3AgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIGZyb20gcHJvY2Vzc2luZyBhIGNoYW5uZWwuCitDYWxsOiAgICAgc1N0b3BSeFByb2Nlc3NvcihDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorCitDb21tZW50czogVGhlIHJlY2VpdmUgcHJvY2Vzc29yIGNhbiBiZSBzdGFydGVkIGFnYWluIHdpdGggc1N0YXJ0UnhQcm9jZXNzb3IoKS4KKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhdXNlcyB0aGUgcmVjZWl2ZSBwcm9jZXNzb3IgdG8gc2tpcCBvdmVyIHRoZQorICAgICAgICAgIHN0b3BwZWQgY2hhbm5lbC4gIEl0IGRvZXMgbm90IHN0b3AgaXQgZnJvbSBwcm9jZXNzaW5nIG90aGVyIGNoYW5uZWxzLgorCitXYXJuaW5nczogTm8gY29udGV4dCBzd2l0Y2hlcyBhcmUgYWxsb3dlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBmdW5jdGlvbi4KKworICAgICAgICAgIERvIG5vdCBsZWF2ZSB0aGUgcmVjZWl2ZSBwcm9jZXNzb3Igc3RvcHBlZCBmb3IgbW9yZSB0aGFuIG9uZQorICAgICAgICAgIGNoYXJhY3RlciB0aW1lLgorCisgICAgICAgICAgQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGEgZGVsYXkgb2YgNCB1UyBpcyByZXF1aXJlZCB0byBlbnN1cmUKKyAgICAgICAgICB0aGF0IHRoZSByZWNlaXZlIHByb2Nlc3NvciBpcyBubyBsb25nZXIgcHJvY2Vzc2luZyB0aGlzIGNoYW5uZWwuCisqLwordm9pZCBzU3RvcFJ4UHJvY2Vzc29yKENIQU5ORUxfVCAqIENoUCkKK3sKKwlCeXRlX3QgUls0XTsKKworCVJbMF0gPSBDaFAtPlJbMF07CisJUlsxXSA9IENoUC0+UlsxXTsKKwlSWzJdID0gMHgwYTsKKwlSWzNdID0gQ2hQLT5SWzNdOworCXNPdXREVyhDaFAtPkluZGV4QWRkciwgKihEV29yZF90ICopICYgUlswXSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRmx1c2hSeEZJRk8KK1B1cnBvc2U6ICBGbHVzaCB0aGUgUnggRklGTworQ2FsbDogICAgIHNGbHVzaFJ4RklGTyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorUmV0dXJuOiAgIHZvaWQKK0NvbW1lbnRzOiBUbyBwcmV2ZW50IGRhdGEgZnJvbSBiZWluZyBlbnF1ZXVlZCBvciBkZXF1ZXVlZCBpbiB0aGUgVHggRklGTworICAgICAgICAgIHdoaWxlIGl0IGlzIGJlaW5nIGZsdXNoZWQgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIGlzIHN0b3BwZWQKKyAgICAgICAgICBhbmQgdGhlIHRyYW5zbWl0dGVyIGlzIGRpc2FibGVkLiAgQWZ0ZXIgdGhlc2Ugb3BlcmF0aW9ucyBhCisgICAgICAgICAgNCB1UyBkZWxheSBpcyBkb25lIGJlZm9yZSBjbGVhcmluZyB0aGUgcG9pbnRlcnMgdG8gYWxsb3cKKyAgICAgICAgICB0aGUgcmVjZWl2ZSBwcm9jZXNzb3IgdG8gc3RvcC4gIFRoZXNlIGl0ZW1zIGFyZSBoYW5kbGVkIGluc2lkZQorICAgICAgICAgIHRoaXMgZnVuY3Rpb24uCitXYXJuaW5nczogTm8gY29udGV4dCBzd2l0Y2hlcyBhcmUgYWxsb3dlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBmdW5jdGlvbi4KKyovCit2b2lkIHNGbHVzaFJ4RklGTyhDSEFOTkVMX1QgKiBDaFApCit7CisJaW50IGk7CisJQnl0ZV90IENoOwkJLyogY2hhbm5lbCBudW1iZXIgd2l0aGluIEFJT1AgKi8KKwlpbnQgUnhGSUZPRW5hYmxlZDsJLyogVFJVRSBpZiBSeCBGSUZPIGVuYWJsZWQgKi8KKworCWlmIChzR2V0UnhDbnQoQ2hQKSA9PSAwKQkvKiBSeCBGSUZPIGVtcHR5ICovCisJCXJldHVybjsJCS8qIGRvbid0IG5lZWQgdG8gZmx1c2ggKi8KKworCVJ4RklGT0VuYWJsZWQgPSBGQUxTRTsKKwlpZiAoQ2hQLT5SWzB4MzJdID09IDB4MDgpIHsJLyogUnggRklGTyBpcyBlbmFibGVkICovCisJCVJ4RklGT0VuYWJsZWQgPSBUUlVFOworCQlzRGlzUnhGSUZPKENoUCk7CS8qIGRpc2FibGUgaXQgKi8KKwkJZm9yIChpID0gMDsgaSA8IDIwMDAgLyAyMDA7IGkrKykJLyogZGVsYXkgMiB1UyB0byBhbGxvdyBwcm9jIHRvIGRpc2FibGUgRklGTyAqLworCQkJc0luQihDaFAtPkludENoYW4pOwkvKiBkZXBlbmRzIG9uIGJ1cyBpL28gdGltaW5nICovCisJfQorCXNHZXRDaGFuU3RhdHVzKENoUCk7CS8qIGNsZWFyIGFueSBwZW5kaW5nIFJ4IGVycm9ycyBpbiBjaGFuIHN0YXQgKi8KKwlDaCA9IChCeXRlX3QpIHNHZXRDaGFuTnVtKENoUCk7CisJc091dEIoQ2hQLT5DbWQsIENoIHwgUkVTUlhGQ05UKTsJLyogYXBwbHkgcmVzZXQgUnggRklGTyBjb3VudCAqLworCXNPdXRCKENoUC0+Q21kLCBDaCk7CS8qIHJlbW92ZSByZXNldCBSeCBGSUZPIGNvdW50ICovCisJc091dFcoKFdvcmRJT190KSBDaFAtPkluZGV4QWRkciwgQ2hQLT5SeEZJRk9QdHJzKTsJLyogY2xlYXIgUnggb3V0IHB0ciAqLworCXNPdXRXKENoUC0+SW5kZXhEYXRhLCAwKTsKKwlzT3V0VygoV29yZElPX3QpIENoUC0+SW5kZXhBZGRyLCBDaFAtPlJ4RklGT1B0cnMgKyAyKTsJLyogY2xlYXIgUnggaW4gcHRyICovCisJc091dFcoQ2hQLT5JbmRleERhdGEsIDApOworCWlmIChSeEZJRk9FbmFibGVkKQorCQlzRW5SeEZJRk8oQ2hQKTsJLyogZW5hYmxlIFJ4IEZJRk8gKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNGbHVzaFR4RklGTworUHVycG9zZTogIEZsdXNoIHRoZSBUeCBGSUZPCitDYWxsOiAgICAgc0ZsdXNoVHhGSUZPKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitSZXR1cm46ICAgdm9pZAorQ29tbWVudHM6IFRvIHByZXZlbnQgZGF0YSBmcm9tIGJlaW5nIGVucXVldWVkIG9yIGRlcXVldWVkIGluIHRoZSBUeCBGSUZPCisgICAgICAgICAgd2hpbGUgaXQgaXMgYmVpbmcgZmx1c2hlZCB0aGUgcmVjZWl2ZSBwcm9jZXNzb3IgaXMgc3RvcHBlZAorICAgICAgICAgIGFuZCB0aGUgdHJhbnNtaXR0ZXIgaXMgZGlzYWJsZWQuICBBZnRlciB0aGVzZSBvcGVyYXRpb25zIGEKKyAgICAgICAgICA0IHVTIGRlbGF5IGlzIGRvbmUgYmVmb3JlIGNsZWFyaW5nIHRoZSBwb2ludGVycyB0byBhbGxvdworICAgICAgICAgIHRoZSByZWNlaXZlIHByb2Nlc3NvciB0byBzdG9wLiAgVGhlc2UgaXRlbXMgYXJlIGhhbmRsZWQgaW5zaWRlCisgICAgICAgICAgdGhpcyBmdW5jdGlvbi4KK1dhcm5pbmdzOiBObyBjb250ZXh0IHN3aXRjaGVzIGFyZSBhbGxvd2VkIHdoaWxlIGV4ZWN1dGluZyB0aGlzIGZ1bmN0aW9uLgorKi8KK3ZvaWQgc0ZsdXNoVHhGSUZPKENIQU5ORUxfVCAqIENoUCkKK3sKKwlpbnQgaTsKKwlCeXRlX3QgQ2g7CQkvKiBjaGFubmVsIG51bWJlciB3aXRoaW4gQUlPUCAqLworCWludCBUeEVuYWJsZWQ7CQkvKiBUUlVFIGlmIHRyYW5zbWl0dGVyIGVuYWJsZWQgKi8KKworCWlmIChzR2V0VHhDbnQoQ2hQKSA9PSAwKQkvKiBUeCBGSUZPIGVtcHR5ICovCisJCXJldHVybjsJCS8qIGRvbid0IG5lZWQgdG8gZmx1c2ggKi8KKworCVR4RW5hYmxlZCA9IEZBTFNFOworCWlmIChDaFAtPlR4Q29udHJvbFszXSAmIFRYX0VOQUJMRSkgeworCQlUeEVuYWJsZWQgPSBUUlVFOworCQlzRGlzVHJhbnNtaXQoQ2hQKTsJLyogZGlzYWJsZSB0cmFuc21pdHRlciAqLworCX0KKwlzU3RvcFJ4UHJvY2Vzc29yKENoUCk7CS8qIHN0b3AgUnggcHJvY2Vzc29yICovCisJZm9yIChpID0gMDsgaSA8IDQwMDAgLyAyMDA7IGkrKykJLyogZGVsYXkgNCB1UyB0byBhbGxvdyBwcm9jIHRvIHN0b3AgKi8KKwkJc0luQihDaFAtPkludENoYW4pOwkvKiBkZXBlbmRzIG9uIGJ1cyBpL28gdGltaW5nICovCisJQ2ggPSAoQnl0ZV90KSBzR2V0Q2hhbk51bShDaFApOworCXNPdXRCKENoUC0+Q21kLCBDaCB8IFJFU1RYRkNOVCk7CS8qIGFwcGx5IHJlc2V0IFR4IEZJRk8gY291bnQgKi8KKwlzT3V0QihDaFAtPkNtZCwgQ2gpOwkvKiByZW1vdmUgcmVzZXQgVHggRklGTyBjb3VudCAqLworCXNPdXRXKChXb3JkSU9fdCkgQ2hQLT5JbmRleEFkZHIsIENoUC0+VHhGSUZPUHRycyk7CS8qIGNsZWFyIFR4IGluL291dCBwdHJzICovCisJc091dFcoQ2hQLT5JbmRleERhdGEsIDApOworCWlmIChUeEVuYWJsZWQpCisJCXNFblRyYW5zbWl0KENoUCk7CS8qIGVuYWJsZSB0cmFuc21pdHRlciAqLworCXNTdGFydFJ4UHJvY2Vzc29yKENoUCk7CS8qIHJlc3RhcnQgUnggcHJvY2Vzc29yICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzV3JpdGVUeFByaW9CeXRlCitQdXJwb3NlOiAgV3JpdGUgYSBieXRlIG9mIHByaW9yaXR5IHRyYW5zbWl0IGRhdGEgdG8gYSBjaGFubmVsCitDYWxsOiAgICAgc1dyaXRlVHhQcmlvQnl0ZShDaFAsRGF0YSkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgQnl0ZV90IERhdGE7IFRoZSB0cmFuc21pdCBkYXRhIGJ5dGUKKworUmV0dXJuOiAgIGludDogMSBpZiB0aGUgYnl0ZXMgaXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4sIG90aGVyd2lzZSAwLgorCitDb21tZW50czogVGhlIHByaW9yaXR5IGJ5dGUgaXMgdHJhbnNtaXR0ZWQgYmVmb3JlIGFueSBkYXRhIGluIHRoZSBUeCBGSUZPLgorCitXYXJuaW5nczogTm8gY29udGV4dCBzd2l0Y2hlcyBhcmUgYWxsb3dlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBmdW5jdGlvbi4KKyovCitpbnQgc1dyaXRlVHhQcmlvQnl0ZShDSEFOTkVMX1QgKiBDaFAsIEJ5dGVfdCBEYXRhKQoreworCUJ5dGVfdCBEV0J1Zls0XTsJLyogYnVmZmVyIGZvciBkb3VibGUgd29yZCB3cml0ZXMgKi8KKwlXb3JkX3QgKldvcmRQdHI7CS8qIG11c3QgYmUgZmFyIGJlY2F1c2UgV2luIFNTICE9IERTICovCisJcmVnaXN0ZXIgRFdvcmRJT190IEluZGV4QWRkcjsKKworCWlmIChzR2V0VHhDbnQoQ2hQKSA+IDEpIHsJLyogd3JpdGUgaXQgdG8gVHggcHJpb3JpdHkgYnVmZmVyICovCisJCUluZGV4QWRkciA9IENoUC0+SW5kZXhBZGRyOworCQlzT3V0VygoV29yZElPX3QpIEluZGV4QWRkciwgQ2hQLT5UeFByaW9DbnQpOwkvKiBnZXQgcHJpb3JpdHkgYnVmZmVyIHN0YXR1cyAqLworCQlpZiAoc0luQigoQnl0ZUlPX3QpIENoUC0+SW5kZXhEYXRhKSAmIFBSSV9QRU5EKQkvKiBwcmlvcml0eSBidWZmZXIgYnVzeSAqLworCQkJcmV0dXJuICgwKTsJLyogbm90aGluZyBzZW50ICovCisKKwkJV29yZFB0ciA9IChXb3JkX3QgKikgKCZEV0J1ZlswXSk7CisJCSpXb3JkUHRyID0gQ2hQLT5UeFByaW9CdWY7CS8qIGRhdGEgYnl0ZSBhZGRyZXNzICovCisKKwkJRFdCdWZbMl0gPSBEYXRhOwkvKiBkYXRhIGJ5dGUgdmFsdWUgKi8KKwkJc091dERXKEluZGV4QWRkciwgKigoRFdvcmRfdCAqKSAoJkRXQnVmWzBdKSkpOwkvKiB3cml0ZSBpdCBvdXQgKi8KKworCQkqV29yZFB0ciA9IENoUC0+VHhQcmlvQ250OwkvKiBUeCBwcmlvcml0eSBjb3VudCBhZGRyZXNzICovCisKKwkJRFdCdWZbMl0gPSBQUklfUEVORCArIDE7CS8qIGluZGljYXRlIDEgYnl0ZSBwZW5kaW5nICovCisJCURXQnVmWzNdID0gMDsJLyogcHJpb3JpdHkgYnVmZmVyIHBvaW50ZXIgKi8KKwkJc091dERXKEluZGV4QWRkciwgKigoRFdvcmRfdCAqKSAoJkRXQnVmWzBdKSkpOwkvKiB3cml0ZSBpdCBvdXQgKi8KKwl9IGVsc2UgewkJLyogd3JpdGUgaXQgdG8gVHggRklGTyAqLworCisJCXNXcml0ZVR4Qnl0ZShzR2V0VHhSeERhdGFJTyhDaFApLCBEYXRhKTsKKwl9CisJcmV0dXJuICgxKTsJCS8qIDEgYnl0ZSBzZW50ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRW5JbnRlcnJ1cHRzCitQdXJwb3NlOiAgRW5hYmxlIG9uZSBvciBtb3JlIGludGVycnVwdHMgZm9yIGEgY2hhbm5lbAorQ2FsbDogICAgIHNFbkludGVycnVwdHMoQ2hQLEZsYWdzKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyAgICAgICAgICBXb3JkX3QgRmxhZ3M6IEludGVycnVwdCBlbmFibGUgZmxhZ3MsIGNhbiBiZSBhbnkgY29tYmluYXRpb24KKyAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorICAgICAgICAgICAgICAgIFRYSU5UX0VOOiAgIEludGVycnVwdCBvbiBUeCBGSUZPIGVtcHR5CisgICAgICAgICAgICAgICAgUlhJTlRfRU46ICAgSW50ZXJydXB0IG9uIFJ4IEZJRk8gYXQgdHJpZ2dlciBsZXZlbCAoc2VlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1NldFJ4VHJpZ2dlcigpKQorICAgICAgICAgICAgICAgIFNSQ0lOVF9FTjogIEludGVycnVwdCBvbiBTUkMgKFNwZWNpYWwgUnggQ29uZGl0aW9uKQorICAgICAgICAgICAgICAgIE1DSU5UX0VOOiAgIEludGVycnVwdCBvbiBtb2RlbSBpbnB1dCBjaGFuZ2UKKyAgICAgICAgICAgICAgICBDSEFOSU5UX0VOOiBBbGxvdyBjaGFubmVsIGludGVycnVwdCBzaWduYWwgdG8gdGhlIEFJT1AncworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVycnVwdCBDaGFubmVsIFJlZ2lzdGVyLgorUmV0dXJuOiAgIHZvaWQKK0NvbW1lbnRzOiBJZiBhbiBpbnRlcnJ1cHQgZW5hYmxlIGZsYWcgaXMgc2V0IGluIEZsYWdzLCB0aGF0IGludGVycnVwdCB3aWxsIGJlCisgICAgICAgICAgZW5hYmxlZC4gIElmIGFuIGludGVycnVwdCBlbmFibGUgZmxhZyBpcyBub3Qgc2V0IGluIEZsYWdzLCB0aGF0CisgICAgICAgICAgaW50ZXJydXB0IHdpbGwgbm90IGJlIGNoYW5nZWQuICBJbnRlcnJ1cHRzIGNhbiBiZSBkaXNhYmxlZCB3aXRoCisgICAgICAgICAgZnVuY3Rpb24gc0Rpc0ludGVycnVwdHMoKS4KKworICAgICAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYXBwcm9wcmlhdGUgYml0IGZvciB0aGUgY2hhbm5lbCBpbiB0aGUgQUlPUCdzCisgICAgICAgICAgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgaWYgdGhlIENIQU5JTlRfRU4gZmxhZyBpcyBzZXQuICBUaGlzIGFsbG93cworICAgICAgICAgIHRoaXMgY2hhbm5lbCdzIGJpdCB0byBiZSBzZXQgaW4gdGhlIEFJT1AncyBJbnRlcnJ1cHQgQ2hhbm5lbCBSZWdpc3Rlci4KKworICAgICAgICAgIEludGVycnVwdHMgbXVzdCBhbHNvIGJlIGdsb2JhbGx5IGVuYWJsZWQgYmVmb3JlIGNoYW5uZWwgaW50ZXJydXB0cworICAgICAgICAgIHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBob3N0LiAgVGhpcyBpcyBkb25lIHdpdGggZnVuY3Rpb24KKyAgICAgICAgICBzRW5HbG9iYWxJbnQoKS4KKworICAgICAgICAgIEluIHNvbWUgY2FzZXMgaXQgbWF5IGJlIGRlc2lyYWJsZSB0byBkaXNhYmxlIGludGVycnVwdHMgZ2xvYmFsbHkgYnV0CisgICAgICAgICAgZW5hYmxlIGNoYW5uZWwgaW50ZXJydXB0cy4gIFRoaXMgd291bGQgYWxsb3cgdGhlIGdsb2JhbCBpbnRlcnJ1cHQKKyAgICAgICAgICBzdGF0dXMgcmVnaXN0ZXIgdG8gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggQUlPUHMgbmVlZCBzZXJ2aWNlLgorKi8KK3ZvaWQgc0VuSW50ZXJydXB0cyhDSEFOTkVMX1QgKiBDaFAsIFdvcmRfdCBGbGFncykKK3sKKwlCeXRlX3QgTWFzazsJCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisKKwlDaFAtPlJ4Q29udHJvbFsyXSB8PQorCSAgICAoKEJ5dGVfdCkgRmxhZ3MgJiAoUlhJTlRfRU4gfCBTUkNJTlRfRU4gfCBNQ0lOVF9FTikpOworCisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPlJ4Q29udHJvbFswXSk7CisKKwlDaFAtPlR4Q29udHJvbFsyXSB8PSAoKEJ5dGVfdCkgRmxhZ3MgJiBUWElOVF9FTik7CisKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIENoUC0+VHhDb250cm9sWzBdKTsKKworCWlmIChGbGFncyAmIENIQU5JTlRfRU4pIHsKKwkJTWFzayA9IHNJbkIoQ2hQLT5JbnRNYXNrKSB8IHNCaXRNYXBTZXRUYmxbQ2hQLT5DaGFuTnVtXTsKKwkJc091dEIoQ2hQLT5JbnRNYXNrLCBNYXNrKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRGlzSW50ZXJydXB0cworUHVycG9zZTogIERpc2FibGUgb25lIG9yIG1vcmUgaW50ZXJydXB0cyBmb3IgYSBjaGFubmVsCitDYWxsOiAgICAgc0Rpc0ludGVycnVwdHMoQ2hQLEZsYWdzKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyAgICAgICAgICBXb3JkX3QgRmxhZ3M6IEludGVycnVwdCBmbGFncywgY2FuIGJlIGFueSBjb21iaW5hdGlvbgorICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAgICAgICAgICAgICAgVFhJTlRfRU46ICAgSW50ZXJydXB0IG9uIFR4IEZJRk8gZW1wdHkKKyAgICAgICAgICAgICAgICBSWElOVF9FTjogICBJbnRlcnJ1cHQgb24gUnggRklGTyBhdCB0cmlnZ2VyIGxldmVsIChzZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzU2V0UnhUcmlnZ2VyKCkpCisgICAgICAgICAgICAgICAgU1JDSU5UX0VOOiAgSW50ZXJydXB0IG9uIFNSQyAoU3BlY2lhbCBSeCBDb25kaXRpb24pCisgICAgICAgICAgICAgICAgTUNJTlRfRU46ICAgSW50ZXJydXB0IG9uIG1vZGVtIGlucHV0IGNoYW5nZQorICAgICAgICAgICAgICAgIENIQU5JTlRfRU46IERpc2FibGUgY2hhbm5lbCBpbnRlcnJ1cHQgc2lnbmFsIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFJT1AncyBJbnRlcnJ1cHQgQ2hhbm5lbCBSZWdpc3Rlci4KK1JldHVybjogICB2b2lkCitDb21tZW50czogSWYgYW4gaW50ZXJydXB0IGZsYWcgaXMgc2V0IGluIEZsYWdzLCB0aGF0IGludGVycnVwdCB3aWxsIGJlCisgICAgICAgICAgZGlzYWJsZWQuICBJZiBhbiBpbnRlcnJ1cHQgZmxhZyBpcyBub3Qgc2V0IGluIEZsYWdzLCB0aGF0CisgICAgICAgICAgaW50ZXJydXB0IHdpbGwgbm90IGJlIGNoYW5nZWQuICBJbnRlcnJ1cHRzIGNhbiBiZSBlbmFibGVkIHdpdGgKKyAgICAgICAgICBmdW5jdGlvbiBzRW5JbnRlcnJ1cHRzKCkuCisKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgYXBwcm9wcmlhdGUgYml0IGZvciB0aGUgY2hhbm5lbCBpbiB0aGUgQUlPUCdzCisgICAgICAgICAgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgaWYgdGhlIENIQU5JTlRfRU4gZmxhZyBpcyBzZXQuICBUaGlzIGJsb2NrcworICAgICAgICAgIHRoaXMgY2hhbm5lbCdzIGJpdCBmcm9tIGJlaW5nIHNldCBpbiB0aGUgQUlPUCdzIEludGVycnVwdCBDaGFubmVsCisgICAgICAgICAgUmVnaXN0ZXIuCisqLwordm9pZCBzRGlzSW50ZXJydXB0cyhDSEFOTkVMX1QgKiBDaFAsIFdvcmRfdCBGbGFncykKK3sKKwlCeXRlX3QgTWFzazsJCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisKKwlDaFAtPlJ4Q29udHJvbFsyXSAmPQorCSAgICB+KChCeXRlX3QpIEZsYWdzICYgKFJYSU5UX0VOIHwgU1JDSU5UX0VOIHwgTUNJTlRfRU4pKTsKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIENoUC0+UnhDb250cm9sWzBdKTsKKwlDaFAtPlR4Q29udHJvbFsyXSAmPSB+KChCeXRlX3QpIEZsYWdzICYgVFhJTlRfRU4pOworCXNPdXREVyhDaFAtPkluZGV4QWRkciwgKihEV29yZF90ICopICYgQ2hQLT5UeENvbnRyb2xbMF0pOworCisJaWYgKEZsYWdzICYgQ0hBTklOVF9FTikgeworCQlNYXNrID0gc0luQihDaFAtPkludE1hc2spICYgc0JpdE1hcENsclRibFtDaFAtPkNoYW5OdW1dOworCQlzT3V0QihDaFAtPkludE1hc2ssIE1hc2spOworCX0KK30KKwordm9pZCBzU2V0SW50ZXJmYWNlTW9kZShDSEFOTkVMX1QgKiBDaFAsIEJ5dGVfdCBtb2RlKQoreworCXNPdXRCKENoUC0+Q3RsUC0+QWlvcElPWzJdLCAobW9kZSAmIDB4MTgpIHwgQ2hQLT5DaGFuTnVtKTsKK30KKworLyoKKyAqICBOb3QgYW4gb2ZmaWNpYWwgU1NDSSBmdW5jdGlvbiwgYnV0IGhvdyB0byByZXNldCBSb2NrZXRNb2RlbXMuCisgKiAgSVNBIGJ1cyB2ZXJzaW9uCisgKi8KK3ZvaWQgc01vZGVtUmVzZXQoQ09OVFJPTExFUl9UICogQ3RsUCwgaW50IGNoYW4sIGludCBvbikKK3sKKwlCeXRlSU9fdCBhZGRyOworCUJ5dGVfdCB2YWw7CisKKwlhZGRyID0gQ3RsUC0+QWlvcElPWzBdICsgMHg0MDA7CisJdmFsID0gc0luQihDdGxQLT5NUmVnM0lPKTsKKwkvKiBpZiBBSU9QWzFdIGlzIG5vdCBlbmFibGVkLCBlbmFibGUgaXQgKi8KKwlpZiAoKHZhbCAmIDIpID09IDApIHsKKwkJdmFsID0gc0luQihDdGxQLT5NUmVnMklPKTsKKwkJc091dEIoQ3RsUC0+TVJlZzJJTywgKHZhbCAmIDB4ZmMpIHwgKDEgJiAweDAzKSk7CisJCXNPdXRCKEN0bFAtPk1CYXNlSU8sICh1bnNpZ25lZCBjaGFyKSAoYWRkciA+PiA2KSk7CisJfQorCisJc0VuQWlvcChDdGxQLCAxKTsKKwlpZiAoIW9uKQorCQlhZGRyICs9IDg7CisJc091dEIoYWRkciArIGNoYW4sIDApOwkvKiBhcHBseSBvciByZW1vdmUgcmVzZXQgKi8KKwlzRGlzQWlvcChDdGxQLCAxKTsKK30KKworLyoKKyAqICBOb3QgYW4gb2ZmaWNpYWwgU1NDSSBmdW5jdGlvbiwgYnV0IGhvdyB0byByZXNldCBSb2NrZXRNb2RlbXMuCisgKiAgUENJIGJ1cyB2ZXJzaW9uCisgKi8KK3ZvaWQgc1BDSU1vZGVtUmVzZXQoQ09OVFJPTExFUl9UICogQ3RsUCwgaW50IGNoYW4sIGludCBvbikKK3sKKwlCeXRlSU9fdCBhZGRyOworCisJYWRkciA9IEN0bFAtPkFpb3BJT1swXSArIDB4NDA7CS8qIDJuZCBBSU9QICovCisJaWYgKCFvbikKKwkJYWRkciArPSA4OworCXNPdXRCKGFkZHIgKyBjaGFuLCAwKTsJLyogYXBwbHkgb3IgcmVtb3ZlIHJlc2V0ICovCit9CisKKy8qICBSZXNldHMgdGhlIHNwZWFrZXIgY29udHJvbGxlciBvbiBSb2NrZXRNb2RlbSBJSSBhbmQgSUlJIGRldmljZXMgKi8KK3N0YXRpYyB2b2lkIHJtU3BlYWtlclJlc2V0KENPTlRST0xMRVJfVCAqIEN0bFAsIHVuc2lnbmVkIGxvbmcgbW9kZWwpCit7CisJQnl0ZUlPX3QgYWRkcjsKKworCS8qIFJvY2tldE1vZGVtIElJIHNwZWFrZXIgY29udHJvbCBpcyBhdCB0aGUgOHRoIHBvcnQgbG9jYXRpb24gb2Ygb2Zmc2V0IDB4NDAgKi8KKwlpZiAoKG1vZGVsID09IE1PREVMX1JQNE0pIHx8IChtb2RlbCA9PSBNT0RFTF9SUDZNKSkgeworCQlhZGRyID0gQ3RsUC0+QWlvcElPWzBdICsgMHg0RjsKKwkJc091dEIoYWRkciwgMCk7CisJfQorCisJLyogUm9ja2V0TW9kZW0gSUlJIHNwZWFrZXIgY29udHJvbCBpcyBhdCB0aGUgMXN0IHBvcnQgbG9jYXRpb24gb2Ygb2Zmc2V0IDB4ODAgKi8KKwlpZiAoKG1vZGVsID09IE1PREVMX1VQQ0lfUk0zXzhQT1JUKQorCSAgICB8fCAobW9kZWwgPT0gTU9ERUxfVVBDSV9STTNfNFBPUlQpKSB7CisJCWFkZHIgPSBDdGxQLT5BaW9wSU9bMF0gKyAweDg4OworCQlzT3V0QihhZGRyLCAwKTsKKwl9Cit9CisKKy8qICBSZXR1cm5zIHRoZSBsaW5lIG51bWJlciBnaXZlbiB0aGUgY29udHJvbGxlciAoYm9hcmQpLCBhaW9wIGFuZCBjaGFubmVsIG51bWJlciAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgR2V0TGluZU51bWJlcihpbnQgY3RybCwgaW50IGFpb3AsIGludCBjaCkKK3sKKwlyZXR1cm4gbGluZU51bWJlcnNbKGN0cmwgPDwgNSkgfCAoYWlvcCA8PCAzKSB8IGNoXTsKK30KKworLyoKKyAqICBTdG9yZXMgdGhlIGxpbmUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGNvbnRyb2xsZXIgKGJvYXJkKSwgYWlvcAorICogIGFuZCBjaGFubmVsIG51bWJlci4gIAorICogIFJldHVybnM6ICBUaGUgbGluZSBudW1iZXIgYXNzaWduZWQgCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFNldExpbmVOdW1iZXIoaW50IGN0cmwsIGludCBhaW9wLCBpbnQgY2gpCit7CisJbGluZU51bWJlcnNbKGN0cmwgPDwgNSkgfCAoYWlvcCA8PCAzKSB8IGNoXSA9IG5leHRMaW5lTnVtYmVyKys7CisJcmV0dXJuIChuZXh0TGluZU51bWJlciAtIDEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JvY2tldC5oIGIvZHJpdmVycy9jaGFyL3JvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNmIwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcm9ja2V0LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiByb2NrZXQuaCAtLS0gdGhlIGV4cG9ydGVkIGludGVyZmFjZSBvZiB0aGUgcm9ja2V0IGRyaXZlciB0byBpdHMgY29uZmlndXJhdGlvbiBwcm9ncmFtLgorICoKKyAqIFdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbywgQ29weXJpZ2h0IDE5OTcuCisgKiBDb3B5cmlnaHQgMTk5NyBDb210cm9sIENvcnBvcmF0aW9uLiAKKyAqCisgKi8KKworLyogIE1vZGVsIEluZm9ybWF0aW9uIFN0cnVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbW9kZWw7CisJY2hhciBtb2RlbFN0cmluZ1s4MF07CisJdW5zaWduZWQgbG9uZyBudW1Qb3J0czsKKwlpbnQgbG9hZHJtMjsKKwlpbnQgc3RhcnRpbmdQb3J0TnVtYmVyOworfSByb2NrZXRNb2RlbF90OworCitzdHJ1Y3Qgcm9ja2V0X2NvbmZpZyB7CisJaW50IGxpbmU7CisJaW50IGZsYWdzOworCWludCBjbG9zaW5nX3dhaXQ7CisJaW50IGNsb3NlX2RlbGF5OworCWludCBwb3J0OworCWludCByZXNlcnZlZFszMl07Cit9OworCitzdHJ1Y3Qgcm9ja2V0X3BvcnRzIHsKKwlpbnQgdHR5X21ham9yOworCWludCBjYWxsb3V0X21ham9yOworCXJvY2tldE1vZGVsX3Qgcm9ja2V0TW9kZWxbOF07Cit9OworCitzdHJ1Y3Qgcm9ja2V0X3ZlcnNpb24geworCWNoYXIgcm9ja2V0X3ZlcnNpb25bMzJdOworCWNoYXIgcm9ja2V0X2RhdGVbMzJdOworCWNoYXIgcmVzZXJ2ZWRbNjRdOworfTsKKworLyoKKyAqIFJvY2tldHBvcnQgZmxhZ3MKKyAqLworI2RlZmluZSBST0NLRVRfQ0FMTE9VVF9OT0hVUCAgICAweDAwMDAwMDAxCisjZGVmaW5lIFJPQ0tFVF9GT1JDRV9DRAkJMHgwMDAwMDAwMgorI2RlZmluZSBST0NLRVRfSFVQX05PVElGWQkweDAwMDAwMDA0CisjZGVmaW5lIFJPQ0tFVF9TUExJVF9URVJNSU9TCTB4MDAwMDAwMDgKKyNkZWZpbmUgUk9DS0VUX1NQRF9NQVNLCQkweDAwMDAwMDcwCisjZGVmaW5lIFJPQ0tFVF9TUERfSEkJCTB4MDAwMDAwMTAJLyogVXNlIDU2MDAwIGluc3RlYWQgb2YgMzg0MDAgYnBzICovCisjZGVmaW5lIFJPQ0tFVF9TUERfVkhJCQkweDAwMDAwMDIwCS8qIFVzZSAxMTUyMDAgaW5zdGVhZCBvZiAzODQwMCBicHMgKi8KKyNkZWZpbmUgUk9DS0VUX1NQRF9TSEkJCTB4MDAwMDAwMzAJLyogVXNlIDIzMDQwMCBpbnN0ZWFkIG9mIDM4NDAwIGJwcyAqLworI2RlZmluZSBST0NLRVRfU1BEX1dBUlAJICAgICAgICAweDAwMDAwMDQwCS8qIFVzZSA0NjA4MDAgaW5zdGVhZCBvZiAzODQwMCBicHMgKi8KKyNkZWZpbmUgUk9DS0VUX1NBSwkJMHgwMDAwMDA4MAorI2RlZmluZSBST0NLRVRfU0VTU0lPTl9MT0NLT1VUCTB4MDAwMDAxMDAKKyNkZWZpbmUgUk9DS0VUX1BHUlBfTE9DS09VVAkweDAwMDAwMjAwCisjZGVmaW5lIFJPQ0tFVF9SVFNfVE9HR0xFCTB4MDAwMDA0MDAKKyNkZWZpbmUgUk9DS0VUX01PREVfTUFTSyAgICAgICAgMHgwMDAwMzAwMAorI2RlZmluZSBST0NLRVRfTU9ERV9SUzIzMiAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFJPQ0tFVF9NT0RFX1JTNDg1ICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgUk9DS0VUX01PREVfUlM0MjIgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBST0NLRVRfRkxBR1MJCTB4MDAwMDNGRkYKKworI2RlZmluZSBST0NLRVRfVVNSX01BU0sgMHgwMDcxCS8qIExlZ2FsIGZsYWdzIHRoYXQgbm9uLXByaXZpbGVnZWQKKwkJCQkgKiB1c2VycyBjYW4gc2V0IG9yIHJlc2V0ICovCisKKy8qCisgKiBGb3IgY2xvc2luZ193YWl0IGFuZCBjbG9zaW5nX3dhaXQyCisgKi8KKyNkZWZpbmUgUk9DS0VUX0NMT1NJTkdfV0FJVF9OT05FCTY1NTM1CisjZGVmaW5lIFJPQ0tFVF9DTE9TSU5HX1dBSVRfSU5GCQkwCisKKy8qCisgKiBSb2NrZXRwb3J0IGlvY3RscyAtLSAiUlAiCisgKi8KKyNkZWZpbmUgUkNLUF9HRVRfU1RSVUNUCQkweDAwNTI1MDAxCisjZGVmaW5lIFJDS1BfR0VUX0NPTkZJRwkJMHgwMDUyNTAwMgorI2RlZmluZSBSQ0tQX1NFVF9DT05GSUcJCTB4MDA1MjUwMDMKKyNkZWZpbmUgUkNLUF9HRVRfUE9SVFMJCTB4MDA1MjUwMDQKKyNkZWZpbmUgUkNLUF9SRVNFVF9STTIJCTB4MDA1MjUwMDUKKyNkZWZpbmUgUkNLUF9HRVRfVkVSU0lPTgkweDAwNTI1MDA2CisKKy8qICBSb2NrZXRwb3J0IE1vZGVscyAqLworI2RlZmluZSBNT0RFTF9SUDMySU5URiAgICAgICAgMHgwMDAxCS8qIFJQIDMyIHBvcnQgdy9leHRlcm5hbCBJL0YgICAqLworI2RlZmluZSBNT0RFTF9SUDhJTlRGICAgICAgICAgMHgwMDAyCS8qIFJQIDggcG9ydCB3L2V4dGVybmFsIEkvRiAgICAqLworI2RlZmluZSBNT0RFTF9SUDE2SU5URiAgICAgICAgMHgwMDAzCS8qIFJQIDE2IHBvcnQgdy9leHRlcm5hbCBJL0YgICAqLworI2RlZmluZSBNT0RFTF9SUDhPQ1RBICAgICAgICAgMHgwMDA1CS8qIFJQIDggcG9ydCB3L29jdGEgY2FibGUgICAgICAqLworI2RlZmluZSBNT0RFTF9SUDRRVUFEICAgICAgICAgMHgwMDA0CS8qIFJQIDQgcG9ydCB3L3F1YWQgY2FibGUgICAgICAqLworI2RlZmluZSBNT0RFTF9SUDhKICAgICAgICAgICAgMHgwMDA2CS8qIFJQIDggcG9ydCB3L1JKMTEgY29ubmVjdG9ycyAqLworI2RlZmluZSBNT0RFTF9SUDRKICAgICAgICAgICAgMHgwMDA3CS8qIFJQIDQgcG9ydCB3L1JKNDUgY29ubmVjdG9ycyAqLworI2RlZmluZSBNT0RFTF9SUDhTTkkgICAgICAgICAgMHgwMDA4CS8qIFJQIDggcG9ydCB3LyBEQjc4IFNOSSBjb25uZWN0b3IgKi8KKyNkZWZpbmUgTU9ERUxfUlAxNlNOSSAgICAgICAgIDB4MDAwOQkvKiBSUCAxNiBwb3J0IHcvIERCNzggU05JIGNvbm5lY3RvciAqLworI2RlZmluZSBNT0RFTF9SUFA0ICAgICAgICAgICAgMHgwMDBBCS8qIFJQIFBsdXMgNCBwb3J0ICAgICAgICAgICAgICAqLworI2RlZmluZSBNT0RFTF9SUFA4ICAgICAgICAgICAgMHgwMDBCCS8qIFJQIFBsdXMgOCBwb3J0ICAgICAgICAgICAgICAqLworI2RlZmluZSBNT0RFTF9SUDJfMjMyICAgICAgICAgMHgwMDBFCS8qIFJQIFBsdXMgMiBwb3J0IFJTMjMyICAgICAgICAqLworI2RlZmluZSBNT0RFTF9SUDJfNDIyICAgICAgICAgMHgwMDBGCS8qIFJQIFBsdXMgMiBwb3J0IFJTMjMyICAgICAgICAqLworCisvKiAgUm9ja2V0bW9kZW0gSUkgTW9kZWxzICovCisjZGVmaW5lIE1PREVMX1JQNk0gICAgICAgICAgICAweDAwMEMJLyogUk0gNiBwb3J0ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1PREVMX1JQNE0gICAgICAgICAgICAweDAwMEQJLyogUk0gNCBwb3J0ICAgICAgICAgICAgICAgICAgICovCisKKy8qIFVuaXZlcnNhbCBQQ0kgYm9hcmRzICovCisjZGVmaW5lIE1PREVMX1VQQ0lfUlAzMklOVEYgICAweDA4MDEJLyogUlAgVVBDSSAzMiBwb3J0IHcvZXh0ZXJuYWwgSS9GICAgICAqLworI2RlZmluZSBNT0RFTF9VUENJX1JQOElOVEYgICAgMHgwODAyCS8qIFJQIFVQQ0kgOCBwb3J0IHcvZXh0ZXJuYWwgSS9GICAgICAgKi8KKyNkZWZpbmUgTU9ERUxfVVBDSV9SUDE2SU5URiAgIDB4MDgwMwkvKiBSUCBVUENJIDE2IHBvcnQgdy9leHRlcm5hbCBJL0YgICAgICovCisjZGVmaW5lIE1PREVMX1VQQ0lfUlA4T0NUQSAgICAweDA4MDUJLyogUlAgVVBDSSA4IHBvcnQgdy9vY3RhIGNhYmxlICAgICAgICAqLyAKKyNkZWZpbmUgTU9ERUxfVVBDSV9STTNfOFBPUlQgIDB4MDgwQwkvKiBSUCBVUENJIFJvY2tldG1vZGVtIElJSSA4IHBvcnQgICAgICovCisjZGVmaW5lIE1PREVMX1VQQ0lfUk0zXzRQT1JUICAweDA4MEMJLyogUlAgVVBDSSBSb2NrZXRtb2RlbSBJSUkgNCBwb3J0ICAgICAqLworCisvKiAgQ29tcGFjdCBQQ0kgMTYgcG9ydCAgKi8KKyNkZWZpbmUgTU9ERUxfQ1BDSV9SUDE2SU5URiAgIDB4MDkwMwkvKiBSUCBDb21wYWN0IFBDSSAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GICovCisKKy8qIEFsbCBJU0EgYm9hcmRzICovCisjZGVmaW5lIE1PREVMX0lTQSAgICAgICAgICAgICAweDEwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yb2NrZXRfaW50LmggYi9kcml2ZXJzL2NoYXIvcm9ja2V0X2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMjY4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcm9ja2V0X2ludC5oCkBAIC0wLDAgKzEsMTI5NiBAQAorLyoKKyAqIHJvY2tldF9pbnQuaCAtLS0gaW50ZXJuYWwgaGVhZGVyIGZpbGUgZm9yIHJvY2tldC5jCisgKgorICogV3JpdHRlbiBieSBUaGVvZG9yZSBUcydvLCBDb3B5cmlnaHQgMTk5Ny4KKyAqIENvcHlyaWdodCAxOTk3IENvbXRyb2wgQ29ycG9yYXRpb24uICAKKyAqIAorICovCisKKy8qCisgKiBEZWZpbml0aW9uIG9mIHRoZSB0eXBlcyBpbiByY2t0cHRfdHlwZQorICovCisjZGVmaW5lIFJPQ0tFVF9UWVBFX05PUk1BTAkwCisjZGVmaW5lIFJPQ0tFVF9UWVBFX01PREVNCTEKKyNkZWZpbmUgUk9DS0VUX1RZUEVfTU9ERU1JSQkyCisjZGVmaW5lIFJPQ0tFVF9UWVBFX01PREVNSUlJCTMKKyNkZWZpbmUgUk9DS0VUX1RZUEVfUEMxMDQgICAgICAgNAorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQnl0ZV90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgQnl0ZUlPX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgaW50IFdvcmRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFdvcmRJT190OworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgRFdvcmRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IERXb3JkSU9fdDsKKworLyoKKyAqIE5vdGUhICBOb3JtYWxseSB0aGUgTGludXggSS9PIG1hY3JvcyBhbHJlYWR5IHRha2UgY2FyZSBvZgorICogYnl0ZS1zd2FwcGluZyB0aGUgSS9PIGluc3RydWN0aW9ucy4gIEhvd2V2ZXIsIGFsbCBhY2Nlc3NlcyB1c2luZworICogc091dERXIGFyZW4ndCByZWFsbHkgMzItYml0IGFjY2Vzc2VzLCBidXQgc2hvdWxkIGJlIGhhbmRsZWQgaW4gYnl0ZQorICogb3JkZXIuICBIZW5jZSB0aGUgdXNlIG9mIHRoZSBjcHVfdG9fbGUzMigpIG1hY3JvIHRvIGJ5dGUtc3dhcAorICogdGhpbmdzIHRvIG5vLW9wIHRoZSBieXRlIHN3YXBwaW5nIGRvbmUgYnkgdGhlIGJpZy1lbmRpYW4gb3V0bCgpCisgKiBpbnN0cnVjdGlvbi4KKyAqLworCisjaWZkZWYgUk9DS0VUX0RFQlVHX0lPCitzdGF0aWMgaW5saW5lIHZvaWQgc091dEIodW5zaWduZWQgc2hvcnQgcG9ydCwgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKyNpZmRlZiBST0NLRVRfREVCVUdfSU8KKwlwcmludGsoInNPdXRCKCV4LCAleCkuLi4iLCBwb3J0LCB2YWx1ZSk7CisjZW5kaWYKKwlvdXRiX3AodmFsdWUsIHBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc091dFcodW5zaWduZWQgc2hvcnQgcG9ydCwgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisjaWZkZWYgUk9DS0VUX0RFQlVHX0lPCisJcHJpbnRrKCJzT3V0VygleCwgJXgpLi4uIiwgcG9ydCwgdmFsdWUpOworI2VuZGlmCisJb3V0d19wKHZhbHVlLCBwb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNPdXREVyh1bnNpZ25lZCBzaG9ydCBwb3J0LCB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworI2lmZGVmIFJPQ0tFVF9ERUJVR19JTworCXByaW50aygic091dERXKCV4LCAlbHgpLi4uIiwgcG9ydCwgdmFsdWUpOworI2VuZGlmCisJb3V0bF9wKGNwdV90b19sZTMyKHZhbHVlKSwgcG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBzSW5CKHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisJcmV0dXJuIGluYl9wKHBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHNJblcodW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKwlyZXR1cm4gaW53X3AocG9ydCk7Cit9CisKKyNlbHNlCQkJCS8qICFST0NLRVRfREVCVUdfSU8gKi8KKyNkZWZpbmUgc091dEIoYSwgYikgb3V0Yl9wKGIsIGEpCisjZGVmaW5lIHNPdXRXKGEsIGIpIG91dHdfcChiLCBhKQorI2RlZmluZSBzT3V0RFcocG9ydCwgdmFsdWUpIG91dGxfcChjcHVfdG9fbGUzMih2YWx1ZSksIHBvcnQpCisjZGVmaW5lIHNJbkIoYSkgKGluYl9wKGEpKQorI2RlZmluZSBzSW5XKGEpIChpbndfcChhKSkKKyNlbmRpZgkJCQkvKiBST0NLRVRfREVCVUdfSU8gKi8KKworLyogVGhpcyBpcyB1c2VkIHRvIG1vdmUgYXJyYXlzIG9mIGJ5dGVzIHNvIGJ5dGUgc3dhcHBpbmcgaXNuJ3QgYXBwcm9wcmlhdGUuICovCisjZGVmaW5lIHNPdXRTdHJXKHBvcnQsIGFkZHIsIGNvdW50KSBpZiAoY291bnQpIG91dHN3KHBvcnQsIGFkZHIsIGNvdW50KQorI2RlZmluZSBzSW5TdHJXKHBvcnQsIGFkZHIsIGNvdW50KSBpZiAoY291bnQpIGluc3cocG9ydCwgYWRkciwgY291bnQpCisKKyNkZWZpbmUgQ1RMX1NJWkUgOAorI2RlZmluZSBBSU9QX0NUTF9TSVpFIDQKKyNkZWZpbmUgQ0hBTl9BSU9QX1NJWkUgOAorI2RlZmluZSBNQVhfUE9SVFNfUEVSX0FJT1AgOAorI2RlZmluZSBNQVhfQUlPUFNfUEVSX0JPQVJEIDQKKyNkZWZpbmUgTUFYX1BPUlRTX1BFUl9CT0FSRCAzMgorCisvKiBCdXMgdHlwZSBJRCAqLworI2RlZmluZQlpc0lTQQkwCisjZGVmaW5lCWlzUENJCTEKKyNkZWZpbmUJaXNNQwkyCisKKy8qIENvbnRyb2xsZXIgSUQgbnVtYmVycyAqLworI2RlZmluZSBDVExJRF9OVUxMICAtMQkJLyogbm8gY29udHJvbGxlciBleGlzdHMgKi8KKyNkZWZpbmUgQ1RMSURfMDAwMSAgMHgwMDAxCS8qIGNvbnRyb2xsZXIgcmVsZWFzZSAxICovCisKKy8qIEFJT1AgSUQgbnVtYmVycywgaWRlbnRpZmllcyBBSU9QIHR5cGUgaW1wbGVtZW50aW5nIGNoYW5uZWwgKi8KKyNkZWZpbmUgQUlPUElEX05VTEwgLTEJCS8qIG5vIEFJT1Agb3IgY2hhbm5lbCBleGlzdHMgKi8KKyNkZWZpbmUgQUlPUElEXzAwMDEgMHgwMDAxCS8qIEFJT1AgcmVsZWFzZSAxICovCisKKyNkZWZpbmUgTlVMTERFViAtMQkJLyogaWRlbnRpZmllcyBub24tZXhpc3RhbnQgZGV2aWNlICovCisjZGVmaW5lIE5VTExDVEwgLTEJCS8qIGlkZW50aWZpZXMgbm9uLWV4aXN0YW50IGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgTlVMTENUTFBUUiAoQ09OVFJPTExFUl9UICopMAkvKiBpZGVudGlmaWVzIG5vbi1leGlzdGFudCBjb250cm9sbGVyICovCisjZGVmaW5lIE5VTExBSU9QIC0xCQkvKiBpZGVudGlmaWVzIG5vbi1leGlzdGFudCBBSU9QICovCisjZGVmaW5lIE5VTExDSEFOIC0xCQkvKiBpZGVudGlmaWVzIG5vbi1leGlzdGFudCBjaGFubmVsICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBHbG9iYWwgUmVnaXN0ZXIgT2Zmc2V0cyAtIERpcmVjdCBBY2Nlc3MgLSBGaXhlZCB2YWx1ZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBfQ01EX1JFRyAgIDB4MzgJCS8qIENvbW1hbmQgUmVnaXN0ZXIgICAgICAgICAgICA4ICAgIFdyaXRlICovCisjZGVmaW5lIF9JTlRfQ0hBTiAgMHgzOQkJLyogSW50ZXJydXB0IENoYW5uZWwgUmVnaXN0ZXIgIDggICAgUmVhZCAqLworI2RlZmluZSBfSU5UX01BU0sgIDB4M0EJCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICAgICA4ICAgIFJlYWQgLyBXcml0ZSAqLworI2RlZmluZSBfVU5VU0VEICAgIDB4M0IJCS8qIFVudXNlZCAgICAgICAgICAgICAgICAgICAgICA4ICovCisjZGVmaW5lIF9JTkRYX0FERFIgMHgzQwkJLyogSW5kZXggUmVnaXN0ZXIgQWRkcmVzcyAgICAgIDE2ICAgV3JpdGUgKi8KKyNkZWZpbmUgX0lORFhfREFUQSAweDNFCQkvKiBJbmRleCBSZWdpc3RlciBEYXRhICAgICAgICAgOC8xNiBSZWFkIC8gV3JpdGUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIENoYW5uZWwgUmVnaXN0ZXIgT2Zmc2V0cyBmb3IgMXN0IGNoYW5uZWwgaW4gQUlPUCAtIERpcmVjdCBBY2Nlc3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX1REMCAgICAgICAweDAwCQkvKiBUcmFuc21pdCBEYXRhICAgICAgICAgICAgICAgMTYgICBXcml0ZSAqLworI2RlZmluZSBfUkQwICAgICAgIDB4MDAJCS8qIFJlY2VpdmUgRGF0YSAgICAgICAgICAgICAgICAxNiAgIFJlYWQgKi8KKyNkZWZpbmUgX0NITl9TVEFUMCAweDIwCQkvKiBDaGFubmVsIFN0YXR1cyAgICAgICAgICAgICAgOC8xNiBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgX0ZJRk9fQ05UMCAweDEwCQkvKiBUcmFuc21pdC9SZWNlaXZlIEZJRk8gQ291bnQgMTYgICBSZWFkICovCisjZGVmaW5lIF9JTlRfSUQwICAgMHgzMAkJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uICAgIDggICAgUmVhZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgVHggQ29udHJvbCBSZWdpc3RlciBPZmZzZXRzIC0gSW5kZXhlZCAtIEV4dGVybmFsIC0gRml4ZWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX1RYX0VOQkxTICAweDk4MAkvKiBUeCBQcm9jZXNzb3IgRW5hYmxlcyBSZWdpc3RlciA4IFJlYWQgLyBXcml0ZSAqLworI2RlZmluZSBfVFhDTVAxICAgIDB4OTg4CS8qIFRyYW5zbWl0IENvbXBhcmUgVmFsdWUgIzEgICAgIDggUmVhZCAvIFdyaXRlICovCisjZGVmaW5lIF9UWENNUDIgICAgMHg5ODkJLyogVHJhbnNtaXQgQ29tcGFyZSBWYWx1ZSAjMiAgICAgOCBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgX1RYUkVQMUIxICAweDk4QQkvKiBUeCBSZXBsYWNlIFZhbHVlICMxIC0gQnl0ZSAxICA4IFJlYWQgLyBXcml0ZSAqLworI2RlZmluZSBfVFhSRVAxQjIgIDB4OThCCS8qIFR4IFJlcGxhY2UgVmFsdWUgIzEgLSBCeXRlIDIgIDggUmVhZCAvIFdyaXRlICovCisjZGVmaW5lIF9UWFJFUDIgICAgMHg5OEMJLyogVHJhbnNtaXQgUmVwbGFjZSBWYWx1ZSAjMiAgICAgOCBSZWFkIC8gV3JpdGUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWVtb3J5IENvbnRyb2xsZXIgUmVnaXN0ZXIgT2Zmc2V0cyAtIEluZGV4ZWQgLSBFeHRlcm5hbCAtIEZpeGVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9SWF9GSUZPICAgIDB4MDAwCS8qIFJ4IEZJRk8gKi8KKyNkZWZpbmUgX1RYX0ZJRk8gICAgMHg4MDAJLyogVHggRklGTyAqLworI2RlZmluZSBfUlhGX09VVFAgICAweDk5MAkvKiBSeCBGSUZPIE9VVCBwb2ludGVyICAgICAgICAxNiBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgX1JYRl9JTlAgICAgMHg5OTIJLyogUnggRklGTyBJTiBwb2ludGVyICAgICAgICAgMTYgUmVhZCAvIFdyaXRlICovCisjZGVmaW5lIF9UWEZfT1VUUCAgIDB4OTk0CS8qIFR4IEZJRk8gT1VUIHBvaW50ZXIgICAgICAgIDggIFJlYWQgLyBXcml0ZSAqLworI2RlZmluZSBfVFhGX0lOUCAgICAweDk5NQkvKiBUeCBGSUZPIElOIHBvaW50ZXIgICAgICAgICA4ICBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgX1RYUF9DTlQgICAgMHg5OTYJLyogVHggUHJpb3JpdHkgQ291bnQgICAgICAgICAgOCAgUmVhZCAvIFdyaXRlICovCisjZGVmaW5lIF9UWFBfUE5UUiAgIDB4OTk3CS8qIFR4IFByaW9yaXR5IFBvaW50ZXIgICAgICAgIDggIFJlYWQgLyBXcml0ZSAqLworCisjZGVmaW5lIFBSSV9QRU5EICAgIDB4ODAJLyogUHJpb3JpdHkgZGF0YSBwZW5kaW5nIChiaXQ3LCBUeCBwcmkgY250KSAqLworI2RlZmluZSBUWEZJRk9fU0laRSAyNTUJCS8qIHNpemUgb2YgVHggRklGTyAqLworI2RlZmluZSBSWEZJRk9fU0laRSAxMDIzCS8qIHNpemUgb2YgUnggRklGTyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUeCBQcmlvcml0eSBCdWZmZXIgLSBJbmRleGVkIC0gRXh0ZXJuYWwgLSBGaXhlZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfVFhQX0JVRiAgICAweDlDMAkvKiBUeCBQcmlvcml0eSBCdWZmZXIgIDMyICBCeXRlcyAgIFJlYWQgLyBXcml0ZSAqLworI2RlZmluZSBUWFBfU0laRSAgICAweDIwCS8qIDMyIGJ5dGVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NoYW5uZWwgUmVnaXN0ZXIgT2Zmc2V0cyAtIEluZGV4ZWQgLSBJbnRlcm5hbCAtIEZpeGVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX1RYX0NUUkwgICAgMHhGRjAJLyogVHJhbnNtaXQgQ29udHJvbCAgICAgICAgICAgICAgIDE2ICBXcml0ZSAqLworI2RlZmluZSBfUlhfQ1RSTCAgICAweEZGMgkvKiBSZWNlaXZlIENvbnRyb2wgICAgICAgICAgICAgICAgIDggIFdyaXRlICovCisjZGVmaW5lIF9CQVVEICAgICAgIDB4RkY0CS8qIEJhdWQgUmF0ZSAgICAgICAgICAgICAgICAgICAgICAxNiAgV3JpdGUgKi8KKyNkZWZpbmUgX0NMS19QUkUgICAgMHhGRjYJLyogQ2xvY2sgUHJlc2NhbGVyICAgICAgICAgICAgICAgICA4ICBXcml0ZSAqLworCisjZGVmaW5lIFNUTUJSRUFLICAgMHgwOAkJLyogQlJFQUsgKi8KKyNkZWZpbmUgU1RNRlJBTUUgICAweDA0CQkvKiBmcmFtaW5nIGVycm9yICovCisjZGVmaW5lIFNUTVJDVlJPVlIgMHgwMgkJLyogcmVjZWl2ZXIgb3ZlciBydW4gZXJyb3IgKi8KKyNkZWZpbmUgU1RNUEFSSVRZICAweDAxCQkvKiBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgU1RNRVJST1IgICAoU1RNQlJFQUsgfCBTVE1GUkFNRSB8IFNUTVBBUklUWSkKKyNkZWZpbmUgU1RNQlJFQUtIICAgMHg4MDAJLyogQlJFQUsgKi8KKyNkZWZpbmUgU1RNRlJBTUVIICAgMHg0MDAJLyogZnJhbWluZyBlcnJvciAqLworI2RlZmluZSBTVE1SQ1ZST1ZSSCAweDIwMAkvKiByZWNlaXZlciBvdmVyIHJ1biBlcnJvciAqLworI2RlZmluZSBTVE1QQVJJVFlIICAweDEwMAkvKiBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgU1RNRVJST1JIICAgKFNUTUJSRUFLSCB8IFNUTUZSQU1FSCB8IFNUTVBBUklUWUgpCisKKyNkZWZpbmUgQ1RTX0FDVCAgIDB4MjAJCS8qIENUUyBpbnB1dCBhc3NlcnRlZCAqLworI2RlZmluZSBEU1JfQUNUICAgMHgxMAkJLyogRFNSIGlucHV0IGFzc2VydGVkICovCisjZGVmaW5lIENEX0FDVCAgICAweDA4CQkvKiBDRCBpbnB1dCBhc3NlcnRlZCAqLworI2RlZmluZSBUWEZJRk9NVCAgMHgwNAkJLyogVHggRklGTyBpcyBlbXB0eSAqLworI2RlZmluZSBUWFNIUk1UICAgMHgwMgkJLyogVHggc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHkgKi8KKyNkZWZpbmUgUkRBICAgICAgIDB4MDEJCS8qIFJ4IGRhdGEgYXZhaWxhYmxlICovCisjZGVmaW5lIERSQUlORUQgKFRYRklGT01UIHwgVFhTSFJNVCkJLyogaW5kaWNhdGVzIFR4IGlzIGRyYWluZWQgKi8KKworI2RlZmluZSBTVEFUTU9ERSAgMHg4MDAwCS8qIHN0YXR1cyBtb2RlIGVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgUlhGT1ZFUkZMIDB4MjAwMAkvKiByZWNlaXZlIEZJRk8gb3ZlcmZsb3cgKi8KKyNkZWZpbmUgUlgyTUFUQ0ggIDB4MTAwMAkvKiByZWNlaXZlIGNvbXBhcmUgYnl0ZSAyIG1hdGNoICovCisjZGVmaW5lIFJYMU1BVENIICAweDA4MDAJLyogcmVjZWl2ZSBjb21wYXJlIGJ5dGUgMSBtYXRjaCAqLworI2RlZmluZSBSWEJSRUFLICAgMHgwNDAwCS8qIHJlY2VpdmVkIEJSRUFLICovCisjZGVmaW5lIFJYRlJBTUUgICAweDAyMDAJLyogcmVjZWl2ZWQgZnJhbWluZyBlcnJvciAqLworI2RlZmluZSBSWFBBUklUWSAgMHgwMTAwCS8qIHJlY2VpdmVkIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBTVEFURVJST1IgKFJYQlJFQUsgfCBSWEZSQU1FIHwgUlhQQVJJVFkpCisKKyNkZWZpbmUgQ1RTRkNfRU4gIDB4ODAJCS8qIENUUyBmbG93IGNvbnRyb2wgZW5hYmxlIGJpdCAqLworI2RlZmluZSBSVFNUT0dfRU4gMHg0MAkJLyogUlRTIHRvZ2dsZSBlbmFibGUgYml0ICovCisjZGVmaW5lIFRYSU5UX0VOICAweDEwCQkvKiB0cmFuc21pdCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFNUT1AyICAgICAweDA4CQkvKiBlbmFibGUgMiBzdG9wIGJpdHMgKDAgPSAxIHN0b3ApICovCisjZGVmaW5lIFBBUklUWV9FTiAweDA0CQkvKiBlbmFibGUgcGFyaXR5ICgwID0gbm8gcGFyaXR5KSAqLworI2RlZmluZSBFVkVOX1BBUiAgMHgwMgkJLyogZXZlbiBwYXJpdHkgKDAgPSBvZGQgcGFyaXR5KSAqLworI2RlZmluZSBEQVRBOEJJVCAgMHgwMQkJLyogOCBiaXQgZGF0YSAoMCA9IDcgYml0IGRhdGEpICovCisKKyNkZWZpbmUgU0VUQlJFQUsgIDB4MTAJCS8qIHNlbmQgYnJlYWsgY29uZGl0aW9uIChtdXN0IGNsZWFyKSAqLworI2RlZmluZSBMT0NBTExPT1AgMHgwOAkJLyogbG9jYWwgbG9vcGJhY2sgc2V0IGZvciB0ZXN0ICovCisjZGVmaW5lIFNFVF9EVFIgICAweDA0CQkvKiBhc3NlcnQgRFRSICovCisjZGVmaW5lIFNFVF9SVFMgICAweDAyCQkvKiBhc3NlcnQgUlRTICovCisjZGVmaW5lIFRYX0VOQUJMRSAweDAxCQkvKiBlbmFibGUgdHJhbnNtaXR0ZXIgKi8KKworI2RlZmluZSBSVFNGQ19FTiAgMHg0MAkJLyogUlRTIGZsb3cgY29udHJvbCBlbmFibGUgKi8KKyNkZWZpbmUgUlhQUk9DX0VOIDB4MjAJCS8qIHJlY2VpdmUgcHJvY2Vzc29yIGVuYWJsZSAqLworI2RlZmluZSBUUklHX05PICAgMHgwMAkJLyogUnggRklGTyB0cmlnZ2VyIGxldmVsIDAgKG5vIHRyaWdnZXIpICovCisjZGVmaW5lIFRSSUdfMSAgICAweDA4CQkvKiB0cmlnZ2VyIGxldmVsIDEgY2hhciAqLworI2RlZmluZSBUUklHXzFfMiAgMHgxMAkJLyogdHJpZ2dlciBsZXZlbCAxLzIgKi8KKyNkZWZpbmUgVFJJR183XzggIDB4MTgJCS8qIHRyaWdnZXIgbGV2ZWwgNy84ICovCisjZGVmaW5lIFRSSUdfTUFTSyAweDE4CQkvKiB0cmlnZ2VyIGxldmVsIG1hc2sgKi8KKyNkZWZpbmUgU1JDSU5UX0VOIDB4MDQJCS8qIHNwZWNpYWwgUnggY29uZGl0aW9uIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgUlhJTlRfRU4gIDB4MDIJCS8qIFJ4IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTUNJTlRfRU4gIDB4MDEJCS8qIG1vZGVtIGNoYW5nZSBpbnRlcnJ1cHQgZW5hYmxlICovCisKKyNkZWZpbmUgUlhGX1RSSUcgIDB4MjAJCS8qIFJ4IEZJRk8gdHJpZ2dlciBsZXZlbCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVFhGSUZPX01UIDB4MTAJCS8qIFR4IEZJRk8gZW1wdHkgaW50ZXJydXB0ICovCisjZGVmaW5lIFNSQ19JTlQgICAweDA4CQkvKiBzcGVjaWFsIHJlY2VpdmUgY29uZGl0aW9uIGludGVycnVwdCAqLworI2RlZmluZSBERUxUQV9DRCAgMHgwNAkJLyogQ0QgY2hhbmdlIGludGVycnVwdCAqLworI2RlZmluZSBERUxUQV9DVFMgMHgwMgkJLyogQ1RTIGNoYW5nZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgREVMVEFfRFNSIDB4MDEJCS8qIERTUiBjaGFuZ2UgaW50ZXJydXB0ICovCisKKyNkZWZpbmUgUkVQMVcyX0VOIDB4MTAJCS8qIHJlcGxhY2UgYnl0ZSAxIHdpdGggMiBieXRlcyBlbmFibGUgKi8KKyNkZWZpbmUgSUdOMl9FTiAgIDB4MDgJCS8qIGlnbm9yZSBieXRlIDIgZW5hYmxlICovCisjZGVmaW5lIElHTjFfRU4gICAweDA0CQkvKiBpZ25vcmUgYnl0ZSAxIGVuYWJsZSAqLworI2RlZmluZSBDT01QMl9FTiAgMHgwMgkJLyogY29tcGFyZSBieXRlIDIgZW5hYmxlICovCisjZGVmaW5lIENPTVAxX0VOICAweDAxCQkvKiBjb21wYXJlIGJ5dGUgMSBlbmFibGUgKi8KKworI2RlZmluZSBSRVNFVF9BTEwgMHg4MAkJLyogcmVzZXQgQUlPUCAoYWxsIGNoYW5uZWxzKSAqLworI2RlZmluZSBUWE9WRVJJREUgMHg0MAkJLyogVHJhbnNtaXQgc29mdHdhcmUgb2ZmIG92ZXJyaWRlICovCisjZGVmaW5lIFJFU0VUVUFSVCAweDIwCQkvKiByZXNldCBjaGFubmVsJ3MgVUFSVCAqLworI2RlZmluZSBSRVNUWEZDTlQgMHgxMAkJLyogcmVzZXQgY2hhbm5lbCdzIFR4IEZJRk8gY291bnQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVTUlhGQ05UIDB4MDgJCS8qIHJlc2V0IGNoYW5uZWwncyBSeCBGSUZPIGNvdW50IHJlZ2lzdGVyICovCisKKyNkZWZpbmUgSU5UU1RBVDAgIDB4MDEJCS8qIEFJT1AgMCBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIElOVFNUQVQxICAweDAyCQkvKiBBSU9QIDEgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBJTlRTVEFUMiAgMHgwNAkJLyogQUlPUCAyIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgSU5UU1RBVDMgIDB4MDgJCS8qIEFJT1AgMyBpbnRlcnJ1cHQgc3RhdHVzICovCisKKyNkZWZpbmUgSU5UUl9FTiAgIDB4MDgJCS8qIGFsbG93IGludGVycnVwdHMgdG8gaG9zdCAqLworI2RlZmluZSBJTlRfU1RST0IgMHgwNAkJLyogc3Ryb2JlIGFuZCBjbGVhciBpbnRlcnJ1cHQgbGluZSAoRU9JKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBNVURCQUMgcmVtYXBwZWQgZm9yIFBDSQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX0NGR19JTlRfUENJICAweDQwCisjZGVmaW5lIF9QQ0lfSU5UX0ZVTkMgMHgzQQorCisjZGVmaW5lIFBDSV9TVFJPQiAweDIwMDAJLyogYml0IDEzIG9mIGludCBhaW9wIHJlZ2lzdGVyICovCisjZGVmaW5lIElOVFJfRU5fUENJICAgMHgwMDEwCS8qIGFsbG93IGludGVycnVwdHMgdG8gaG9zdCAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIFVuaXZlcnNhbCBQQ0kgYm9hcmQgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgX1BDSV85MDMwX0lOVF9DVFJMCTB4NGMgICAgICAgICAgLyogT2Zmc2V0cyBmcm9tIEJBUjEgKi8KKyNkZWZpbmUgX1BDSV85MDMwX0dQSU9fQ1RSTAkweDU0CisjZGVmaW5lIFBDSV9JTlRfQ1RSTF9BSU9QCTB4MDAwMQorI2RlZmluZSBQQ0lfR1BJT19DVFJMXzhQT1JUCTB4NDAwMAorI2RlZmluZSBfUENJXzkwMzBfUklOR19JTkQJMHhjMCAgICAgICAgICAvKiBPZmZzZXRzIGZyb20gQkFSMSAqLworCisjZGVmaW5lIENIQU4zX0VOICAweDA4CQkvKiBlbmFibGUgQUlPUCAzICovCisjZGVmaW5lIENIQU4yX0VOICAweDA0CQkvKiBlbmFibGUgQUlPUCAyICovCisjZGVmaW5lIENIQU4xX0VOICAweDAyCQkvKiBlbmFibGUgQUlPUCAxICovCisjZGVmaW5lIENIQU4wX0VOICAweDAxCQkvKiBlbmFibGUgQUlPUCAwICovCisjZGVmaW5lIEZSRVFfRElTICAweDAwCisjZGVmaW5lIEZSRVFfMjc0SFogMHg2MAorI2RlZmluZSBGUkVRXzEzN0haIDB4NTAKKyNkZWZpbmUgRlJFUV82OUhaICAweDQwCisjZGVmaW5lIEZSRVFfMzRIWiAgMHgzMAorI2RlZmluZSBGUkVRXzE3SFogIDB4MjAKKyNkZWZpbmUgRlJFUV85SFogICAweDEwCisjZGVmaW5lIFBFUklPRElDX09OTFkgMHg4MAkvKiBvbmx5IFBFUklPRElDIGludGVycnVwdCAqLworCisjZGVmaW5lIENIQU5JTlRfRU4gMHgwMTAwCS8qIGZsYWdzIHRvIGVuYWJsZS9kaXNhYmxlIGNoYW5uZWwgaW50cyAqLworCisjZGVmaW5lIFJEQVRBU0laRSA3MgorI2RlZmluZSBSUkVHREFUQVNJWkUgNTIKKworLyoKKyAqIEFJT1AgaW50ZXJydXB0IGJpdHMgZm9yIElTQS9QQ0kgYm9hcmRzIGFuZCBVUENJIGJvYXJkcy4KKyAqLworI2RlZmluZSBBSU9QX0lOVFJfQklUXzAJCTB4MDAwMQorI2RlZmluZSBBSU9QX0lOVFJfQklUXzEJCTB4MDAwMgorI2RlZmluZSBBSU9QX0lOVFJfQklUXzIJCTB4MDAwNAorI2RlZmluZSBBSU9QX0lOVFJfQklUXzMJCTB4MDAwOAorCisjZGVmaW5lIEFJT1BfSU5UUl9CSVRTICggXAorCUFJT1BfSU5UUl9CSVRfMCBcCisJfCBBSU9QX0lOVFJfQklUXzEgXAorCXwgQUlPUF9JTlRSX0JJVF8yIFwKKwl8IEFJT1BfSU5UUl9CSVRfMykKKworI2RlZmluZSBVUENJX0FJT1BfSU5UUl9CSVRfMAkweDAwMDQKKyNkZWZpbmUgVVBDSV9BSU9QX0lOVFJfQklUXzEJMHgwMDIwCisjZGVmaW5lIFVQQ0lfQUlPUF9JTlRSX0JJVF8yCTB4MDEwMAorI2RlZmluZSBVUENJX0FJT1BfSU5UUl9CSVRfMwkweDA4MDAKKworI2RlZmluZSBVUENJX0FJT1BfSU5UUl9CSVRTICggXAorCVVQQ0lfQUlPUF9JTlRSX0JJVF8wIFwKKwl8IFVQQ0lfQUlPUF9JTlRSX0JJVF8xIFwKKwl8IFVQQ0lfQUlPUF9JTlRSX0JJVF8yIFwKKwl8IFVQQ0lfQUlPUF9JTlRSX0JJVF8zKQorCisvKiBDb250cm9sbGVyIGxldmVsIGluZm9ybWF0aW9uIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBDdGxJRDsKKwlpbnQgQ3RsTnVtOworCWludCBCdXNUeXBlOworCWludCBib2FyZFR5cGU7CisJaW50IGlzVVBDSTsKKwlXb3JkSU9fdCBQQ0lJTzsKKwlXb3JkSU9fdCBQQ0lJTzI7CisJQnl0ZUlPX3QgTUJhc2VJTzsKKwlCeXRlSU9fdCBNUmVnMUlPOworCUJ5dGVJT190IE1SZWcySU87CisJQnl0ZUlPX3QgTVJlZzNJTzsKKwlCeXRlX3QgTVJlZzI7CisJQnl0ZV90IE1SZWczOworCWludCBOdW1BaW9wOworCWludCBBbHRDaGFuUmluZ0luZGljYXRvcjsKKwlCeXRlSU9fdCBVUENJUmluZ0luZDsKKwlXb3JkSU9fdCBBaW9wSU9bQUlPUF9DVExfU0laRV07CisJQnl0ZUlPX3QgQWlvcEludENoYW5JT1tBSU9QX0NUTF9TSVpFXTsKKwlpbnQgQWlvcElEW0FJT1BfQ1RMX1NJWkVdOworCWludCBBaW9wTnVtQ2hhbltBSU9QX0NUTF9TSVpFXTsKKwlXb3JkX3QgKkFpb3BJbnRyQml0czsKK30gQ09OVFJPTExFUl9UOworCit0eXBlZGVmIENPTlRST0xMRVJfVCBDT05UUk9MTEVSX3Q7CisKKy8qIENoYW5uZWwgbGV2ZWwgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB7CisJQ09OVFJPTExFUl9UICpDdGxQOworCWludCBBaW9wTnVtOworCWludCBDaGFuSUQ7CisJaW50IENoYW5OdW07CisJaW50IHJ0c1RvZ2dsZTsKKworCUJ5dGVJT190IENtZDsKKwlCeXRlSU9fdCBJbnRDaGFuOworCUJ5dGVJT190IEludE1hc2s7CisJRFdvcmRJT190IEluZGV4QWRkcjsKKwlXb3JkSU9fdCBJbmRleERhdGE7CisKKwlXb3JkSU9fdCBUeFJ4RGF0YTsKKwlXb3JkSU9fdCBDaGFuU3RhdDsKKwlXb3JkSU9fdCBUeFJ4Q291bnQ7CisJQnl0ZUlPX3QgSW50SUQ7CisKKwlXb3JkX3QgVHhGSUZPOworCVdvcmRfdCBUeEZJRk9QdHJzOworCVdvcmRfdCBSeEZJRk87CisJV29yZF90IFJ4RklGT1B0cnM7CisJV29yZF90IFR4UHJpb0NudDsKKwlXb3JkX3QgVHhQcmlvUHRyOworCVdvcmRfdCBUeFByaW9CdWY7CisKKwlCeXRlX3QgUltSUkVHREFUQVNJWkVdOworCisJQnl0ZV90IEJhdWREaXZbNF07CisJQnl0ZV90IFR4Q29udHJvbFs0XTsKKwlCeXRlX3QgUnhDb250cm9sWzRdOworCUJ5dGVfdCBUeEVuYWJsZXNbNF07CisJQnl0ZV90IFR4Q29tcGFyZVs0XTsKKwlCeXRlX3QgVHhSZXBsYWNlMVs0XTsKKwlCeXRlX3QgVHhSZXBsYWNlMls0XTsKK30gQ0hBTk5FTF9UOworCit0eXBlZGVmIENIQU5ORUxfVCBDSEFOTkVMX3Q7Cit0eXBlZGVmIENIQU5ORUxfVCAqQ0hBTlBUUl9UOworCisjZGVmaW5lIEludGVyZmFjZU1vZGVSUzIzMiAgMHgwMAorI2RlZmluZSBJbnRlcmZhY2VNb2RlUlM0MjIgIDB4MDgKKyNkZWZpbmUgSW50ZXJmYWNlTW9kZVJTNDg1ICAweDEwCisjZGVmaW5lIEludGVyZmFjZU1vZGVSUzIzMlQgMHgxOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0NsckJyZWFrCitQdXJwb3NlOiAgU3RvcCBzZW5kaW5nIGEgdHJhbnNtaXQgQlJFQUsgc2lnbmFsCitDYWxsOiAgICAgc0NsckJyZWFrKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzQ2xyQnJlYWsoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gJj0gflNFVEJSRUFLOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlR4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzQ2xyRFRSCitQdXJwb3NlOiAgQ2xyIHRoZSBEVFIgb3V0cHV0CitDYWxsOiAgICAgc0NsckRUUihDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0NsckRUUihDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlR4Q29udHJvbFszXSAmPSB+U0VUX0RUUjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0NsclJUUworUHVycG9zZTogIENsciB0aGUgUlRTIG91dHB1dAorQ2FsbDogICAgIHNDbHJSVFMoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNDbHJSVFMoQ2hQKSBcCitkbyB7IFwKKyAgIGlmICgoQ2hQKS0+cnRzVG9nZ2xlKSBicmVhazsgXAorICAgKENoUCktPlR4Q29udHJvbFszXSAmPSB+U0VUX1JUUzsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0NsclR4WE9GRgorUHVycG9zZTogIENsZWFyIGFueSBleGlzdGluZyB0cmFuc21pdCBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgb2ZmIGNvbmRpdGlvbgorQ2FsbDogICAgIHNDbHJUeFhPRkYoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNDbHJUeFhPRkYoQ2hQKSBcCitkbyB7IFwKKyAgIHNPdXRCKChDaFApLT5DbWQsVFhPVkVSSURFIHwgKEJ5dGVfdCkoQ2hQKS0+Q2hhbk51bSk7IFwKKyAgIHNPdXRCKChDaFApLT5DbWQsKEJ5dGVfdCkoQ2hQKS0+Q2hhbk51bSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzQ3RsTnVtVG9DdGxQdHIKK1B1cnBvc2U6ICBDb252ZXJ0IGEgY29udHJvbGxlciBudW1iZXIgdG8gY29udHJvbGxlciBzdHJ1Y3R1cmUgcG9pbnRlcgorQ2FsbDogICAgIHNDdGxOdW1Ub0N0bFB0cihDdGxOdW0pCisgICAgICAgICAgaW50IEN0bE51bTsgQ29udHJvbGxlciBudW1iZXIKK1JldHVybjogICBDT05UUk9MTEVSX1QgKjogUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCisqLworI2RlZmluZSBzQ3RsTnVtVG9DdGxQdHIoQ1RMTlVNKSAmc0NvbnRyb2xsZXJbQ1RMTlVNXQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0NvbnRyb2xsZXJFT0kKK1B1cnBvc2U6ICBTdHJvYmUgdGhlIE1VREJBQydzIEVuZCBPZiBJbnRlcnJ1cHQgYml0LgorQ2FsbDogICAgIHNDb250cm9sbGVyRU9JKEN0bFApCisgICAgICAgICAgQ09OVFJPTExFUl9UICpDdGxQOyBQdHIgdG8gY29udHJvbGxlciBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNDb250cm9sbGVyRU9JKENUTFApIHNPdXRCKChDVExQKS0+TVJlZzJJTywoQ1RMUCktPk1SZWcyIHwgSU5UX1NUUk9CKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1BDSUNvbnRyb2xsZXJFT0kKK1B1cnBvc2U6ICBTdHJvYmUgdGhlIFBDSSBFbmQgT2YgSW50ZXJydXB0IGJpdC4KKyAgICAgICAgICBGb3IgdGhlIFVQQ0kgYm9hcmRzLCB0b2dnbGUgdGhlIEFJT1AgaW50ZXJydXB0IGVuYWJsZSBiaXQKKwkgICh0aGlzIHdhcyB0YWtlbiBmcm9tIHRoZSBXaW5kb3dzIGRyaXZlcikuCitDYWxsOiAgICAgc1BDSUNvbnRyb2xsZXJFT0koQ3RsUCkKKyAgICAgICAgICBDT05UUk9MTEVSX1QgKkN0bFA7IFB0ciB0byBjb250cm9sbGVyIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc1BDSUNvbnRyb2xsZXJFT0koQ1RMUCkgXAorZG8geyBcCisgICAgaWYgKChDVExQKS0+aXNVUENJKSB7IFwKKwlXb3JkX3QgdyA9IHNJblcoKENUTFApLT5QQ0lJTyk7IFwKKwlzT3V0VygoQ1RMUCktPlBDSUlPLCAodyBeIFBDSV9JTlRfQ1RSTF9BSU9QKSk7IFwKKwlzT3V0VygoQ1RMUCktPlBDSUlPLCB3KTsgXAorICAgIH0gXAorICAgIGVsc2UgeyBcCisJc091dFcoKENUTFApLT5QQ0lJTywgUENJX1NUUk9CKTsgXAorICAgIH0gXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNEaXNBaW9wCitQdXJwb3NlOiAgRGlzYWJsZSBJL08gYWNjZXNzIHRvIGFuIEFJT1AKK0NhbGw6ICAgICBzRGlzQWlvcChDbHRQKQorICAgICAgICAgIENPTlRST0xMRVJfVCAqQ3RsUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCisgICAgICAgICAgaW50IEFpb3BOdW07IE51bWJlciBvZiBBSU9QIG9uIGNvbnRyb2xsZXIKKyovCisjZGVmaW5lIHNEaXNBaW9wKENUTFAsQUlPUE5VTSkgXAorZG8geyBcCisgICAoQ1RMUCktPk1SZWczICY9IHNCaXRNYXBDbHJUYmxbQUlPUE5VTV07IFwKKyAgIHNPdXRCKChDVExQKS0+TVJlZzNJTywoQ1RMUCktPk1SZWczKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNEaXNDVFNGbG93Q3RsCitQdXJwb3NlOiAgRGlzYWJsZSBvdXRwdXQgZmxvdyBjb250cm9sIHVzaW5nIENUUworQ2FsbDogICAgIHNEaXNDVFNGbG93Q3RsKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzRGlzQ1RTRmxvd0N0bChDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlR4Q29udHJvbFsyXSAmPSB+Q1RTRkNfRU47IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNEaXNJWEFOWQorUHVycG9zZTogIERpc2FibGUgSVhBTlkgU29mdHdhcmUgRmxvdyBDb250cm9sCitDYWxsOiAgICAgc0Rpc0lYQU5ZKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzRGlzSVhBTlkoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5SWzB4MGVdID0gMHg4NjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5SWzB4MGNdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IERpc1Bhcml0eQorUHVycG9zZTogIERpc2FibGUgcGFyaXR5CitDYWxsOiAgICAgc0Rpc1Bhcml0eShDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorQ29tbWVudHM6IEZ1bmN0aW9uIHNTZXRQYXJpdHkoKSBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBmdW5jdGlvbnMgc0VuUGFyaXR5KCksCisgICAgICAgICAgc0Rpc1Bhcml0eSgpLCBzU2V0T2RkUGFyaXR5KCksIGFuZCBzU2V0RXZlblBhcml0eSgpLgorKi8KKyNkZWZpbmUgc0Rpc1Bhcml0eShDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlR4Q29udHJvbFsyXSAmPSB+UEFSSVRZX0VOOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlR4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRGlzUlRTVG9nZ2xlCitQdXJwb3NlOiAgRGlzYWJsZSBSVFMgdG9nZ2xlCitDYWxsOiAgICAgc0Rpc1JUU1RvZ2dsZShDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0Rpc1JUU1RvZ2dsZShDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlR4Q29udHJvbFsyXSAmPSB+UlRTVE9HX0VOOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlR4Q29udHJvbFswXSk7IFwKKyAgIChDaFApLT5ydHNUb2dnbGUgPSAwOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0Rpc1J4RklGTworUHVycG9zZTogIERpc2FibGUgUnggRklGTworQ2FsbDogICAgIHNEaXNSeEZJRk8oQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNEaXNSeEZJRk8oQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5SWzB4MzJdID0gMHgwYTsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5SWzB4MzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNEaXNSeFN0YXR1c01vZGUKK1B1cnBvc2U6ICBEaXNhYmxlIHRoZSBSeCBzdGF0dXMgbW9kZQorQ2FsbDogICAgIHNEaXNSeFN0YXR1c01vZGUoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK0NvbW1lbnRzOiBUaGlzIHRha2VzIHRoZSBjaGFubmVsIG91dCBvZiB0aGUgcmVjZWl2ZSBzdGF0dXMgbW9kZS4gIEFsbAorICAgICAgICAgIHN1YnNlcXVlbnQgcmVhZHMgb2YgcmVjZWl2ZSBkYXRhIHVzaW5nIHNSZWFkUnhXb3JkKCkgd2lsbCByZXR1cm4KKyAgICAgICAgICB0d28gZGF0YSBieXRlcy4KKyovCisjZGVmaW5lIHNEaXNSeFN0YXR1c01vZGUoQ2hQKSBzT3V0VygoQ2hQKS0+Q2hhblN0YXQsMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNEaXNUcmFuc21pdAorUHVycG9zZTogIERpc2FibGUgdHJhbnNtaXQKK0NhbGw6ICAgICBzRGlzVHJhbnNtaXQoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyAgICAgICAgICBUaGlzIGRpc2FibGVzIG1vdmVtZW50IG9mIFR4IGRhdGEgZnJvbSB0aGUgVHggRklGTyBpbnRvIHRoZSAxIGJ5dGUKKyAgICAgICAgICBUeCBidWZmZXIuICBUaGVyZWZvcmUgdGhlcmUgY291bGQgYmUgdXAgdG8gYSAyIGJ5dGUgbGF0ZW5jeQorICAgICAgICAgIGJldHdlZW4gdGhlIHRpbWUgc0Rpc1RyYW5zbWl0KCkgaXMgY2FsbGVkIGFuZCB0aGUgdHJhbnNtaXQgYnVmZmVyCisgICAgICAgICAgYW5kIHRyYW5zbWl0IHNoaWZ0IHJlZ2lzdGVyIGdvaW5nIGNvbXBsZXRlbHkgZW1wdHkuCisqLworI2RlZmluZSBzRGlzVHJhbnNtaXQoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gJj0gflRYX0VOQUJMRTsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0Rpc1R4U29mdEZsb3dDdGwKK1B1cnBvc2U6ICBEaXNhYmxlIFR4IFNvZnR3YXJlIEZsb3cgQ29udHJvbAorQ2FsbDogICAgIHNEaXNUeFNvZnRGbG93Q3RsKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzRGlzVHhTb2Z0Rmxvd0N0bChDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlJbMHgwNl0gPSAweDhhOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlJbMHgwNF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0VuQWlvcAorUHVycG9zZTogIEVuYWJsZSBJL08gYWNjZXNzIHRvIGFuIEFJT1AKK0NhbGw6ICAgICBzRW5BaW9wKENsdFApCisgICAgICAgICAgQ09OVFJPTExFUl9UICpDdGxQOyBQdHIgdG8gY29udHJvbGxlciBzdHJ1Y3R1cmUKKyAgICAgICAgICBpbnQgQWlvcE51bTsgTnVtYmVyIG9mIEFJT1Agb24gY29udHJvbGxlcgorKi8KKyNkZWZpbmUgc0VuQWlvcChDVExQLEFJT1BOVU0pIFwKK2RvIHsgXAorICAgKENUTFApLT5NUmVnMyB8PSBzQml0TWFwU2V0VGJsW0FJT1BOVU1dOyBcCisgICBzT3V0QigoQ1RMUCktPk1SZWczSU8sKENUTFApLT5NUmVnMyk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRW5DVFNGbG93Q3RsCitQdXJwb3NlOiAgRW5hYmxlIG91dHB1dCBmbG93IGNvbnRyb2wgdXNpbmcgQ1RTCitDYWxsOiAgICAgc0VuQ1RTRmxvd0N0bChDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0VuQ1RTRmxvd0N0bChDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlR4Q29udHJvbFsyXSB8PSBDVFNGQ19FTjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0VuSVhBTlkKK1B1cnBvc2U6ICBFbmFibGUgSVhBTlkgU29mdHdhcmUgRmxvdyBDb250cm9sCitDYWxsOiAgICAgc0VuSVhBTlkoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNFbklYQU5ZKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+UlsweDBlXSA9IDB4MjE7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+UlsweDBjXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBFblBhcml0eQorUHVycG9zZTogIEVuYWJsZSBwYXJpdHkKK0NhbGw6ICAgICBzRW5QYXJpdHkoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK0NvbW1lbnRzOiBGdW5jdGlvbiBzU2V0UGFyaXR5KCkgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgZnVuY3Rpb25zIHNFblBhcml0eSgpLAorICAgICAgICAgIHNEaXNQYXJpdHkoKSwgc1NldE9kZFBhcml0eSgpLCBhbmQgc1NldEV2ZW5QYXJpdHkoKS4KKworV2FybmluZ3M6IEJlZm9yZSBlbmFibGluZyBwYXJpdHkgb2RkIG9yIGV2ZW4gcGFyaXR5IHNob3VsZCBiZSBjaG9zZW4gdXNpbmcKKyAgICAgICAgICBmdW5jdGlvbnMgc1NldE9kZFBhcml0eSgpIG9yIHNTZXRFdmVuUGFyaXR5KCkuCisqLworI2RlZmluZSBzRW5QYXJpdHkoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gfD0gUEFSSVRZX0VOOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlR4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRW5SVFNUb2dnbGUKK1B1cnBvc2U6ICBFbmFibGUgUlRTIHRvZ2dsZQorQ2FsbDogICAgIHNFblJUU1RvZ2dsZShDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorQ29tbWVudHM6IFRoaXMgZnVuY3Rpb24gd2lsbCBkaXNhYmxlIFJUUyBmbG93IGNvbnRyb2wgYW5kIGNsZWFyIHRoZSBSVFMKKyAgICAgICAgICBsaW5lIHRvIGFsbG93IG9wZXJhdGlvbiBvZiBSVFMgdG9nZ2xlLgorKi8KKyNkZWZpbmUgc0VuUlRTVG9nZ2xlKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+UnhDb250cm9sWzJdICY9IH5SVFNGQ19FTjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5SeENvbnRyb2xbMF0pOyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzJdIHw9IFJUU1RPR19FTjsgXAorICAgKENoUCktPlR4Q29udHJvbFszXSAmPSB+U0VUX1JUUzsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCisgICAoQ2hQKS0+cnRzVG9nZ2xlID0gMTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNFblJ4RklGTworUHVycG9zZTogIEVuYWJsZSBSeCBGSUZPCitDYWxsOiAgICAgc0VuUnhGSUZPKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzRW5SeEZJRk8oQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5SWzB4MzJdID0gMHgwODsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5SWzB4MzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNFblJ4UHJvY2Vzc29yCitQdXJwb3NlOiAgRW5hYmxlIHRoZSByZWNlaXZlIHByb2Nlc3NvcgorQ2FsbDogICAgIHNFblJ4UHJvY2Vzc29yKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitDb21tZW50czogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IHRoZSByZWNlaXZlIHByb2Nlc3Nvci4gIFdoZW4KKyAgICAgICAgICB0aGUgY2hhbm5lbCBpcyBpbiB0aGUgcmVzZXQgc3RhdGUgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIGlzIG5vdAorICAgICAgICAgIHJ1bm5pbmcuICBUaGlzIGlzIGRvbmUgdG8gcHJldmVudCB0aGUgcmVjZWl2ZSBwcm9jZXNzb3IgZnJvbQorICAgICAgICAgIGV4ZWN1dGluZyBpbnZhbGlkIG1pY3JvY29kZSBpbnN0cnVjdGlvbnMgcHJpb3IgdG8gdGhlCisgICAgICAgICAgZG93bmxvYWRpbmcgb2YgdGhlIG1pY3JvY29kZS4KKworV2FybmluZ3M6IFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdmFsaWQgbWljcm9jb2RlIGhhcyBiZWVuCisgICAgICAgICAgZG93bmxvYWRlZCB0byB0aGUgQUlPUCwgYW5kIGl0IG11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgdGhlCisgICAgICAgICAgbWljcm9jb2RlIGhhcyBiZWVuIGRvd25sb2FkZWQuCisqLworI2RlZmluZSBzRW5SeFByb2Nlc3NvcihDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlJ4Q29udHJvbFsyXSB8PSBSWFBST0NfRU47IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+UnhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNFblJ4U3RhdHVzTW9kZQorUHVycG9zZTogIEVuYWJsZSB0aGUgUnggc3RhdHVzIG1vZGUKK0NhbGw6ICAgICBzRW5SeFN0YXR1c01vZGUoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK0NvbW1lbnRzOiBUaGlzIHBsYWNlcyB0aGUgY2hhbm5lbCBpbiB0aGUgcmVjZWl2ZSBzdGF0dXMgbW9kZS4gIEFsbCBzdWJzZXF1ZW50CisgICAgICAgICAgcmVhZHMgb2YgcmVjZWl2ZSBkYXRhIHVzaW5nIHNSZWFkUnhXb3JkKCkgd2lsbCByZXR1cm4gYSBkYXRhIGJ5dGUKKyAgICAgICAgICBpbiB0aGUgbG93IHdvcmQgYW5kIGEgc3RhdHVzIGJ5dGUgaW4gdGhlIGhpZ2ggd29yZC4KKworKi8KKyNkZWZpbmUgc0VuUnhTdGF0dXNNb2RlKENoUCkgc091dFcoKENoUCktPkNoYW5TdGF0LFNUQVRNT0RFKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0VuVHJhbnNtaXQKK1B1cnBvc2U6ICBFbmFibGUgdHJhbnNtaXQKK0NhbGw6ICAgICBzRW5UcmFuc21pdChDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0VuVHJhbnNtaXQoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gfD0gVFhfRU5BQkxFOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlR4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRW5UeFNvZnRGbG93Q3RsCitQdXJwb3NlOiAgRW5hYmxlIFR4IFNvZnR3YXJlIEZsb3cgQ29udHJvbAorQ2FsbDogICAgIHNFblR4U29mdEZsb3dDdGwoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNFblR4U29mdEZsb3dDdGwoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5SWzB4MDZdID0gMHhjNTsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5SWzB4MDRdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNHZXRBaW9wSW50U3RhdHVzCitQdXJwb3NlOiAgR2V0IHRoZSBBSU9QIGludGVycnVwdCBzdGF0dXMKK0NhbGw6ICAgICBzR2V0QWlvcEludFN0YXR1cyhDdGxQLEFpb3BOdW0pCisgICAgICAgICAgQ09OVFJPTExFUl9UICpDdGxQOyBQdHIgdG8gY29udHJvbGxlciBzdHJ1Y3R1cmUKKyAgICAgICAgICBpbnQgQWlvcE51bTsgQUlPUCBudW1iZXIKK1JldHVybjogICBCeXRlX3Q6IFRoZSBBSU9QIGludGVycnVwdCBzdGF0dXMuICBCaXRzIDAgdGhyb3VnaCA3CisgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50IGNoYW5uZWxzIDAgdGhyb3VnaCA3IHJlc3BlY3RpdmVseS4gIElmIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgaXMgc2V0IHRoYXQgY2hhbm5lbCBpcyBpbnRlcnJ1cHRpbmcuCisqLworI2RlZmluZSBzR2V0QWlvcEludFN0YXR1cyhDVExQLEFJT1BOVU0pIHNJbkIoKENUTFApLT5BaW9wSW50Q2hhbklPW0FJT1BOVU1dKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0dldEFpb3BOdW1DaGFuCitQdXJwb3NlOiAgR2V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgc3VwcG9ydGVkIGJ5IGFuIEFJT1AKK0NhbGw6ICAgICBzR2V0QWlvcE51bUNoYW4oQ3RsUCxBaW9wTnVtKQorICAgICAgICAgIENPTlRST0xMRVJfVCAqQ3RsUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCisgICAgICAgICAgaW50IEFpb3BOdW07IEFJT1AgbnVtYmVyCitSZXR1cm46ICAgaW50OiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCBieSB0aGUgQUlPUAorKi8KKyNkZWZpbmUgc0dldEFpb3BOdW1DaGFuKENUTFAsQUlPUE5VTSkgKENUTFApLT5BaW9wTnVtQ2hhbltBSU9QTlVNXQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0dldENoYW5JbnRJRAorUHVycG9zZTogIEdldCBhIGNoYW5uZWwncyBpbnRlcnJ1cHQgaWRlbnRpZmljYXRpb24gYnl0ZQorQ2FsbDogICAgIHNHZXRDaGFuSW50SUQoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK1JldHVybjogICBCeXRlX3Q6IFRoZSBjaGFubmVsIGludGVycnVwdCBJRC4gIENhbiBiZSBhbnkKKyAgICAgICAgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorICAgICAgICAgICAgICAgIFJYRl9UUklHOiAgICAgUnggRklGTyB0cmlnZ2VyIGxldmVsIGludGVycnVwdAorICAgICAgICAgICAgICAgIFRYRklGT19NVDogICAgVHggRklGTyBlbXB0eSBpbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICBTUkNfSU5UOiAgICAgIFNwZWNpYWwgcmVjZWl2ZSBjb25kaXRpb24gaW50ZXJydXB0CisgICAgICAgICAgICAgICAgREVMVEFfQ0Q6ICAgICBDRCBjaGFuZ2UgaW50ZXJydXB0CisgICAgICAgICAgICAgICAgREVMVEFfQ1RTOiAgICBDVFMgY2hhbmdlIGludGVycnVwdAorICAgICAgICAgICAgICAgIERFTFRBX0RTUjogICAgRFNSIGNoYW5nZSBpbnRlcnJ1cHQKKyovCisjZGVmaW5lIHNHZXRDaGFuSW50SUQoQ2hQKSAoc0luQigoQ2hQKS0+SW50SUQpICYgKFJYRl9UUklHIHwgVFhGSUZPX01UIHwgU1JDX0lOVCB8IERFTFRBX0NEIHwgREVMVEFfQ1RTIHwgREVMVEFfRFNSKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNHZXRDaGFuTnVtCitQdXJwb3NlOiAgR2V0IHRoZSBudW1iZXIgb2YgYSBjaGFubmVsIHdpdGhpbiBhbiBBSU9QCitDYWxsOiAgICAgc0dldENoYW5OdW0oQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK1JldHVybjogICBpbnQ6IENoYW5uZWwgbnVtYmVyIHdpdGhpbiBBSU9QLCBvciBOVUxMQ0hBTiBpZiBjaGFubmVsIGRvZXMKKyAgICAgICAgICAgICAgIG5vdCBleGlzdC4KKyovCisjZGVmaW5lIHNHZXRDaGFuTnVtKENoUCkgKENoUCktPkNoYW5OdW0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNHZXRDaGFuU3RhdHVzCitQdXJwb3NlOiAgR2V0IHRoZSBjaGFubmVsIHN0YXR1cworQ2FsbDogICAgIHNHZXRDaGFuU3RhdHVzKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitSZXR1cm46ICAgV29yZF90OiBUaGUgY2hhbm5lbCBzdGF0dXMuICBDYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mCisgICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBmbGFnczoKKyAgICAgICAgICAgICAgICBMT1cgQllURSBGTEFHUworICAgICAgICAgICAgICAgIENUU19BQ1Q6ICAgICAgQ1RTIGlucHV0IGFzc2VydGVkCisgICAgICAgICAgICAgICAgRFNSX0FDVDogICAgICBEU1IgaW5wdXQgYXNzZXJ0ZWQKKyAgICAgICAgICAgICAgICBDRF9BQ1Q6ICAgICAgIENEIGlucHV0IGFzc2VydGVkCisgICAgICAgICAgICAgICAgVFhGSUZPTVQ6ICAgICBUeCBGSUZPIGlzIGVtcHR5CisgICAgICAgICAgICAgICAgVFhTSFJNVDogICAgICBUeCBzaGlmdCByZWdpc3RlciBpcyBlbXB0eQorICAgICAgICAgICAgICAgIFJEQTogICAgICAgICAgUnggZGF0YSBhdmFpbGFibGUKKworICAgICAgICAgICAgICAgIEhJR0ggQllURSBGTEFHUworICAgICAgICAgICAgICAgIFNUQVRNT0RFOiAgICAgc3RhdHVzIG1vZGUgZW5hYmxlIGJpdAorICAgICAgICAgICAgICAgIFJYRk9WRVJGTDogICAgcmVjZWl2ZSBGSUZPIG92ZXJmbG93CisgICAgICAgICAgICAgICAgUlgyTUFUQ0g6ICAgICByZWNlaXZlIGNvbXBhcmUgYnl0ZSAyIG1hdGNoCisgICAgICAgICAgICAgICAgUlgxTUFUQ0g6ICAgICByZWNlaXZlIGNvbXBhcmUgYnl0ZSAxIG1hdGNoCisgICAgICAgICAgICAgICAgUlhCUkVBSzogICAgICByZWNlaXZlZCBCUkVBSworICAgICAgICAgICAgICAgIFJYRlJBTUU6ICAgICAgcmVjZWl2ZWQgZnJhbWluZyBlcnJvcgorICAgICAgICAgICAgICAgIFJYUEFSSVRZOiAgICAgcmVjZWl2ZWQgcGFyaXR5IGVycm9yCitXYXJuaW5nczogVGhpcyBmdW5jdGlvbiB3aWxsIGNsZWFyIHRoZSBoaWdoIGJ5dGUgZmxhZ3MgaW4gdGhlIENoYW5uZWwKKyAgICAgICAgICBTdGF0dXMgUmVnaXN0ZXIuCisqLworI2RlZmluZSBzR2V0Q2hhblN0YXR1cyhDaFApIHNJblcoKENoUCktPkNoYW5TdGF0KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0dldENoYW5TdGF0dXNMbworUHVycG9zZTogIEdldCB0aGUgbG93IGJ5dGUgb25seSBvZiB0aGUgY2hhbm5lbCBzdGF0dXMKK0NhbGw6ICAgICBzR2V0Q2hhblN0YXR1c0xvKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitSZXR1cm46ICAgQnl0ZV90OiBUaGUgY2hhbm5lbCBzdGF0dXMgbG93IGJ5dGUuICBDYW4gYmUgYW55IGNvbWJpbmF0aW9uCisgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKyAgICAgICAgICAgICAgICBDVFNfQUNUOiAgICAgIENUUyBpbnB1dCBhc3NlcnRlZAorICAgICAgICAgICAgICAgIERTUl9BQ1Q6ICAgICAgRFNSIGlucHV0IGFzc2VydGVkCisgICAgICAgICAgICAgICAgQ0RfQUNUOiAgICAgICBDRCBpbnB1dCBhc3NlcnRlZAorICAgICAgICAgICAgICAgIFRYRklGT01UOiAgICAgVHggRklGTyBpcyBlbXB0eQorICAgICAgICAgICAgICAgIFRYU0hSTVQ6ICAgICAgVHggc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHkKKyAgICAgICAgICAgICAgICBSREE6ICAgICAgICAgIFJ4IGRhdGEgYXZhaWxhYmxlCisqLworI2RlZmluZSBzR2V0Q2hhblN0YXR1c0xvKENoUCkgc0luQigoQnl0ZUlPX3QpKENoUCktPkNoYW5TdGF0KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2V0IFJJIHN0YXR1cyBvZiBjaGFubmVsCisgKiBEZWZpbmVkIGFzIGEgZnVuY3Rpb24gaW4gcm9ja2V0LmMgICAtYWVzCisgKi8KKyNpZiAwCisjZGVmaW5lIHNHZXRDaGFuUkkoQ2hQKSAoKENoUCktPkN0bFAtPkFsdENoYW5SaW5nSW5kaWNhdG9yID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoc0luQigoQnl0ZUlPX3QpKChDaFApLT5DaGFuU3RhdCs4KSkgJiBEU1JfQUNUKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDaFApLT5DdGxQLT5ib2FyZFR5cGUgPT0gUk9DS0VUX1RZUEVfUEMxMDQpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghKHNJbkIoKENoUCktPkN0bFAtPkFpb3BJT1szXSkgJiBzQml0TWFwU2V0VGJsWyhDaFApLT5DaGFuTnVtXSkpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0dldENvbnRyb2xsZXJJbnRTdGF0dXMKK1B1cnBvc2U6ICBHZXQgdGhlIGNvbnRyb2xsZXIgaW50ZXJydXB0IHN0YXR1cworQ2FsbDogICAgIHNHZXRDb250cm9sbGVySW50U3RhdHVzKEN0bFApCisgICAgICAgICAgQ09OVFJPTExFUl9UICpDdGxQOyBQdHIgdG8gY29udHJvbGxlciBzdHJ1Y3R1cmUKK1JldHVybjogICBCeXRlX3Q6IFRoZSBjb250cm9sbGVyIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGxvd2VyIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzLiAgQml0cyAwIHRocm91Z2ggMyByZXByZXNlbnQgQUlPUCdzIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdWdoIDMgcmVzcGVjdGl2ZWx5LiAgSWYgYSBiaXQgaXMgc2V0IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICBBSU9QIGlzIGludGVycnVwdGluZy4gIEJpdHMgNCB0aHJvdWdoIDcgd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBiZSBjbGVhcmVkLgorKi8KKyNkZWZpbmUgc0dldENvbnRyb2xsZXJJbnRTdGF0dXMoQ1RMUCkgKHNJbkIoKENUTFApLT5NUmVnMUlPKSAmIDB4MGYpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzUENJR2V0Q29udHJvbGxlckludFN0YXR1cworUHVycG9zZTogIEdldCB0aGUgY29udHJvbGxlciBpbnRlcnJ1cHQgc3RhdHVzCitDYWxsOiAgICAgc1BDSUdldENvbnRyb2xsZXJJbnRTdGF0dXMoQ3RsUCkKKyAgICAgICAgICBDT05UUk9MTEVSX1QgKkN0bFA7IFB0ciB0byBjb250cm9sbGVyIHN0cnVjdHVyZQorUmV0dXJuOiAgIHVuc2lnbmVkIGNoYXI6IFRoZSBjb250cm9sbGVyIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGxvd2VyIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzIGFuZCBiaXQgNC4gIEJpdHMgMCB0aHJvdWdoIDMgcmVwcmVzZW50IEFJT1AncyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCAzIHJlc3BlY3RpdmVseS4gQml0IDQgaXMgc2V0IGlmIHRoZSBpbnQgCisJCQkgd2FzIGdlbmVyYXRlZCBmcm9tIHBlcmlvZGljLiBJZiBhIGJpdCBpcyBzZXQgdGhlCisJCQkgQUlPUCBpcyBpbnRlcnJ1cHRpbmcuCisqLworI2RlZmluZSBzUENJR2V0Q29udHJvbGxlckludFN0YXR1cyhDVExQKSBcCisJKChDVExQKS0+aXNVUENJID8gXAorCSAgKHNJblcoKENUTFApLT5QQ0lJTzIpICYgVVBDSV9BSU9QX0lOVFJfQklUUykgOiBcCisJICAoKHNJblcoKENUTFApLT5QQ0lJTykgPj4gOCkgJiBBSU9QX0lOVFJfQklUUykpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworRnVuY3Rpb246IHNHZXRSeENudAorUHVycG9zZTogIEdldCB0aGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gdGhlIFJ4IEZJRk8KK0NhbGw6ICAgICBzR2V0UnhDbnQoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK1JldHVybjogICBpbnQ6IFRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiB0aGUgUnggRklGTy4KK0NvbW1lbnRzOiBCeXRlIHJlYWQgb2YgY291bnQgcmVnaXN0ZXIgaXMgcmVxdWlyZWQgdG8gb2J0YWluIFJ4IGNvdW50LgorCisqLworI2RlZmluZSBzR2V0UnhDbnQoQ2hQKSBzSW5XKChDaFApLT5UeFJ4Q291bnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzR2V0VHhDbnQKK1B1cnBvc2U6ICBHZXQgdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIHRoZSBUeCBGSUZPCitDYWxsOiAgICAgc0dldFR4Q250KENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitSZXR1cm46ICAgQnl0ZV90OiBUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gdGhlIFR4IEZJRk8uCitDb21tZW50czogQnl0ZSByZWFkIG9mIGNvdW50IHJlZ2lzdGVyIGlzIHJlcXVpcmVkIHRvIG9idGFpbiBUeCBjb3VudC4KKworKi8KKyNkZWZpbmUgc0dldFR4Q250KENoUCkgc0luQigoQnl0ZUlPX3QpKENoUCktPlR4UnhDb3VudCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0dldFR4UnhEYXRhSU8KK1B1cnBvc2U6ICBHZXQgdGhlIEkvTyBhZGRyZXNzIG9mIGEgY2hhbm5lbCdzIFR4UnggRGF0YSByZWdpc3RlcgorQ2FsbDogICAgIHNHZXRUeFJ4RGF0YUlPKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitSZXR1cm46ICAgV29yZElPX3Q6IEkvTyBhZGRyZXNzIG9mIGEgY2hhbm5lbCdzIFR4UnggRGF0YSByZWdpc3RlcgorKi8KKyNkZWZpbmUgc0dldFR4UnhEYXRhSU8oQ2hQKSAoQ2hQKS0+VHhSeERhdGEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNJbml0Q2hhbkRlZmF1bHRzCitQdXJwb3NlOiAgSW5pdGlhbGl6ZSBhIGNoYW5uZWwgc3RydWN0dXJlIHRvIGl0J3MgZGVmYXVsdCBzdGF0ZS4KK0NhbGw6ICAgICBzSW5pdENoYW5EZWZhdWx0cyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byB0aGUgY2hhbm5lbCBzdHJ1Y3R1cmUKK0NvbW1lbnRzOiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgZm9yIGV2ZXJ5IGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgdGhhdCBleGlzdHMgYmVmb3JlIGFueSBvdGhlciBTU0NJIGNhbGxzIGNhbiBiZSBtYWRlLgorCisqLworI2RlZmluZSBzSW5pdENoYW5EZWZhdWx0cyhDaFApIFwKK2RvIHsgXAorICAgKENoUCktPkN0bFAgPSBOVUxMQ1RMUFRSOyBcCisgICAoQ2hQKS0+QWlvcE51bSA9IE5VTExBSU9QOyBcCisgICAoQ2hQKS0+Q2hhbklEID0gQUlPUElEX05VTEw7IFwKKyAgIChDaFApLT5DaGFuTnVtID0gTlVMTENIQU47IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzUmVzZXRBaW9wQnlOdW0KK1B1cnBvc2U6ICBSZXNldCB0aGUgQUlPUCBieSBudW1iZXIKK0NhbGw6ICAgICBzUmVzZXRBaW9wQnlOdW0oQ1RMUCxBSU9QTlVNKQorCUNPTlRST0xMRVJfVCBDVExQOyBQdHIgdG8gY29udHJvbGxlciBzdHJ1Y3R1cmUKKwlBSU9QTlVNOyBBSU9QIGluZGV4IAorKi8KKyNkZWZpbmUgc1Jlc2V0QWlvcEJ5TnVtKENUTFAsQUlPUE5VTSkgXAorZG8geyBcCisgICBzT3V0QigoQ1RMUCktPkFpb3BJT1soQUlPUE5VTSldK19DTURfUkVHLFJFU0VUX0FMTCk7IFwKKyAgIHNPdXRCKChDVExQKS0+QWlvcElPWyhBSU9QTlVNKV0rX0NNRF9SRUcsMHgwKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZW5kQnJlYWsKK1B1cnBvc2U6ICBTZW5kIGEgdHJhbnNtaXQgQlJFQUsgc2lnbmFsCitDYWxsOiAgICAgc1NlbmRCcmVhayhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc1NlbmRCcmVhayhDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlR4Q29udHJvbFszXSB8PSBTRVRCUkVBSzsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldEJhdWQKK1B1cnBvc2U6ICBTZXQgYmF1ZCByYXRlCitDYWxsOiAgICAgc1NldEJhdWQoQ2hQLERpdmlzb3IpCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorICAgICAgICAgIFdvcmRfdCBEaXZpc29yOyAxNiBiaXQgYmF1ZCByYXRlIGRpdmlzb3IgZm9yIGNoYW5uZWwKKyovCisjZGVmaW5lIHNTZXRCYXVkKENoUCxESVZJU09SKSBcCitkbyB7IFwKKyAgIChDaFApLT5CYXVkRGl2WzJdID0gKEJ5dGVfdCkoRElWSVNPUik7IFwKKyAgIChDaFApLT5CYXVkRGl2WzNdID0gKEJ5dGVfdCkoKERJVklTT1IpID4+IDgpOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPkJhdWREaXZbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldERhdGE3CitQdXJwb3NlOiAgU2V0IGRhdGEgYml0cyB0byA3CitDYWxsOiAgICAgc1NldERhdGE3KENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzU2V0RGF0YTcoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gJj0gfkRBVEE4QklUOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlR4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzU2V0RGF0YTgKK1B1cnBvc2U6ICBTZXQgZGF0YSBiaXRzIHRvIDgKK0NhbGw6ICAgICBzU2V0RGF0YTgoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNTZXREYXRhOChDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlR4Q29udHJvbFsyXSB8PSBEQVRBOEJJVDsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldERUUgorUHVycG9zZTogIFNldCB0aGUgRFRSIG91dHB1dAorQ2FsbDogICAgIHNTZXREVFIoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNTZXREVFIoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gfD0gU0VUX0RUUjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldEV2ZW5QYXJpdHkKK1B1cnBvc2U6ICBTZXQgZXZlbiBwYXJpdHkKK0NhbGw6ICAgICBzU2V0RXZlblBhcml0eShDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorQ29tbWVudHM6IEZ1bmN0aW9uIHNTZXRQYXJpdHkoKSBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBmdW5jdGlvbnMgc0VuUGFyaXR5KCksCisgICAgICAgICAgc0Rpc1Bhcml0eSgpLCBzU2V0T2RkUGFyaXR5KCksIGFuZCBzU2V0RXZlblBhcml0eSgpLgorCitXYXJuaW5nczogVGhpcyBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IHVubGVzcyBwYXJpdHkgaXMgZW5hYmxlZCB3aXRoIGZ1bmN0aW9uCisgICAgICAgICAgc0VuUGFyaXR5KCkuCisqLworI2RlZmluZSBzU2V0RXZlblBhcml0eShDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlR4Q29udHJvbFsyXSB8PSBFVkVOX1BBUjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldE9kZFBhcml0eQorUHVycG9zZTogIFNldCBvZGQgcGFyaXR5CitDYWxsOiAgICAgc1NldE9kZFBhcml0eShDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorQ29tbWVudHM6IEZ1bmN0aW9uIHNTZXRQYXJpdHkoKSBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBmdW5jdGlvbnMgc0VuUGFyaXR5KCksCisgICAgICAgICAgc0Rpc1Bhcml0eSgpLCBzU2V0T2RkUGFyaXR5KCksIGFuZCBzU2V0RXZlblBhcml0eSgpLgorCitXYXJuaW5nczogVGhpcyBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IHVubGVzcyBwYXJpdHkgaXMgZW5hYmxlZCB3aXRoIGZ1bmN0aW9uCisgICAgICAgICAgc0VuUGFyaXR5KCkuCisqLworI2RlZmluZSBzU2V0T2RkUGFyaXR5KENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzJdICY9IH5FVkVOX1BBUjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldFJUUworUHVycG9zZTogIFNldCB0aGUgUlRTIG91dHB1dAorQ2FsbDogICAgIHNTZXRSVFMoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNTZXRSVFMoQ2hQKSBcCitkbyB7IFwKKyAgIGlmICgoQ2hQKS0+cnRzVG9nZ2xlKSBicmVhazsgXAorICAgKENoUCktPlR4Q29udHJvbFszXSB8PSBTRVRfUlRTOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlR4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzU2V0UnhUcmlnZ2VyCitQdXJwb3NlOiAgU2V0IHRoZSBSeCBGSUZPIHRyaWdnZXIgbGV2ZWwKK0NhbGw6ICAgICBzU2V0UnhQcm9jZXNzb3IoQ2hQLExldmVsKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyAgICAgICAgICBCeXRlX3QgTGV2ZWw7IE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIFJ4IEZJRk8gYXQgd2hpY2ggdGhlCisgICAgICAgICAgICAgaW50ZXJydXB0IHdpbGwgYmUgZ2VuZXJhdGVkLiAgQ2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorCisgICAgICAgICAgICAgVFJJR19OTzogICBubyB0cmlnZ2VyCisgICAgICAgICAgICAgVFJJR18xOiAgICAxIGNoYXJhY3RlciBpbiBGSUZPCisgICAgICAgICAgICAgVFJJR18xXzI6ICBGSUZPIDEvMiBmdWxsCisgICAgICAgICAgICAgVFJJR183Xzg6ICBGSUZPIDcvOCBmdWxsCitDb21tZW50czogQW4gaW50ZXJydXB0IHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gdGhlIHRyaWdnZXIgbGV2ZWwgaXMgcmVhY2hlZAorICAgICAgICAgIG9ubHkgaWYgZnVuY3Rpb24gc0VuSW50ZXJydXB0KCkgaGFzIGJlZW4gY2FsbGVkIHdpdGggZmxhZworICAgICAgICAgIFJYSU5UX0VOIHNldC4gIFRoZSBSWEZfVFJJRyBmbGFnIGluIHRoZSBJbnRlcnJ1cHQgSWRlbmZpZmljYXRpb24KKyAgICAgICAgICByZWdpc3RlciB3aWxsIGJlIHNldCB3aGVuZXZlciB0aGUgdHJpZ2dlciBsZXZlbCBpcyByZWFjaGVkCisgICAgICAgICAgcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiBSWElOVF9FTi4KKworKi8KKyNkZWZpbmUgc1NldFJ4VHJpZ2dlcihDaFAsTEVWRUwpIFwKK2RvIHsgXAorICAgKENoUCktPlJ4Q29udHJvbFsyXSAmPSB+VFJJR19NQVNLOyBcCisgICAoQ2hQKS0+UnhDb250cm9sWzJdIHw9IExFVkVMOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlJ4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzU2V0U3RvcDEKK1B1cnBvc2U6ICBTZXQgc3RvcCBiaXRzIHRvIDEKK0NhbGw6ICAgICBzU2V0U3RvcDEoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNTZXRTdG9wMShDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlR4Q29udHJvbFsyXSAmPSB+U1RPUDI7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXRTdG9wMgorUHVycG9zZTogIFNldCBzdG9wIGJpdHMgdG8gMgorQ2FsbDogICAgIHNTZXRTdG9wMihDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc1NldFN0b3AyKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzJdIHw9IFNUT1AyOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlR4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzU2V0VHhYT0ZGQ2hhcgorUHVycG9zZTogIFNldCB0aGUgVHggWE9GRiBmbG93IGNvbnRyb2wgY2hhcmFjdGVyCitDYWxsOiAgICAgc1NldFR4WE9GRkNoYXIoQ2hQLENoKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyAgICAgICAgICBCeXRlX3QgQ2g7IFRoZSB2YWx1ZSB0byBzZXQgdGhlIFR4IFhPRkYgY2hhcmFjdGVyIHRvCisqLworI2RlZmluZSBzU2V0VHhYT0ZGQ2hhcihDaFAsQ0gpIFwKK2RvIHsgXAorICAgKENoUCktPlJbMHgwN10gPSAoQ0gpOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlJbMHgwNF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldFR4WE9OQ2hhcgorUHVycG9zZTogIFNldCB0aGUgVHggWE9OIGZsb3cgY29udHJvbCBjaGFyYWN0ZXIKK0NhbGw6ICAgICBzU2V0VHhYT05DaGFyKENoUCxDaCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgQnl0ZV90IENoOyBUaGUgdmFsdWUgdG8gc2V0IHRoZSBUeCBYT04gY2hhcmFjdGVyIHRvCisqLworI2RlZmluZSBzU2V0VHhYT05DaGFyKENoUCxDSCkgXAorZG8geyBcCisgICAoQ2hQKS0+UlsweDBiXSA9IChDSCk7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+UlsweDA4XSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzU3RhcnRSeFByb2Nlc3NvcgorUHVycG9zZTogIFN0YXJ0IGEgY2hhbm5lbCdzIHJlY2VpdmUgcHJvY2Vzc29yCitDYWxsOiAgICAgc1N0YXJ0UnhQcm9jZXNzb3IoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK0NvbW1lbnRzOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgYSBSeCBwcm9jZXNzb3IgYWZ0ZXIgaXQgd2FzCisgICAgICAgICAgc3RvcHBlZCB3aXRoIHNTdG9wUnhQcm9jZXNzb3IoKSBvciBzU3RvcFNXSW5GbG93Q3RsKCkuICBJdAorICAgICAgICAgIHdpbGwgcmVzdGFydCBib3RoIHRoZSBSeCBwcm9jZXNzb3IgYW5kIHNvZnR3YXJlIGlucHV0IGZsb3cgY29udHJvbC4KKworKi8KKyNkZWZpbmUgc1N0YXJ0UnhQcm9jZXNzb3IoQ2hQKSBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlJbMF0pCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzV3JpdGVUeEJ5dGUKK1B1cnBvc2U6ICBXcml0ZSBhIHRyYW5zbWl0IGRhdGEgYnl0ZSB0byBhIGNoYW5uZWwuCisgICAgICAgICAgQnl0ZUlPX3QgaW86IENoYW5uZWwgdHJhbnNtaXQgcmVnaXN0ZXIgSS9PIGFkZHJlc3MuICBUaGlzIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgb2J0YWluZWQgd2l0aCBzR2V0VHhSeERhdGFJTygpLgorICAgICAgICAgIEJ5dGVfdCBEYXRhOyBUaGUgdHJhbnNtaXQgZGF0YSBieXRlLgorV2FybmluZ3M6IFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBkYXRhIGJ5dGUgd2l0aG91dCBjaGVja2luZyB0byBzZWUgaWYKKyAgICAgICAgICBzTWF4VHhTaXplIGlzIGV4Y2VlZGVkIGluIHRoZSBUeCBGSUZPLgorKi8KKyNkZWZpbmUgc1dyaXRlVHhCeXRlKElPLERBVEEpIHNPdXRCKElPLERBVEEpCisKK2ludCBzSW5pdENvbnRyb2xsZXIoQ09OVFJPTExFUl9UICogQ3RsUCwKKwkJICAgIGludCBDdGxOdW0sCisJCSAgICBCeXRlSU9fdCBNdWRiYWNJTywKKwkJICAgIEJ5dGVJT190ICogQWlvcElPTGlzdCwKKwkJICAgIGludCBBaW9wSU9MaXN0U2l6ZSwKKwkJICAgIGludCBJUlFOdW0sIEJ5dGVfdCBGcmVxdWVuY3ksIGludCBQZXJpb2RpY09ubHkpOworCitpbnQgc1BDSUluaXRDb250cm9sbGVyKENPTlRST0xMRVJfVCAqIEN0bFAsCisJCSAgICAgICBpbnQgQ3RsTnVtLAorCQkgICAgICAgQnl0ZUlPX3QgKiBBaW9wSU9MaXN0LAorCQkgICAgICAgaW50IEFpb3BJT0xpc3RTaXplLAorCQkgICAgICAgV29yZElPX3QgQ29uZmlnSU8sCisJCSAgICAgICBpbnQgSVJRTnVtLAorCQkgICAgICAgQnl0ZV90IEZyZXF1ZW5jeSwKKwkJICAgICAgIGludCBQZXJpb2RpY09ubHksCisJCSAgICAgICBpbnQgYWx0Q2hhblJpbmdJbmRpY2F0b3IsIGludCBVUENJUmluZ0luZCk7CisKK2ludCBzUmVhZEFpb3BJRChCeXRlSU9fdCBpbyk7CitpbnQgc1JlYWRBaW9wTnVtQ2hhbihXb3JkSU9fdCBpbyk7CitpbnQgc0luaXRDaGFuKENPTlRST0xMRVJfVCAqIEN0bFAsCisJICAgICAgQ0hBTk5FTF9UICogQ2hQLCBpbnQgQWlvcE51bSwgaW50IENoYW5OdW0pOworQnl0ZV90IHNHZXRSeEVyclN0YXR1cyhDSEFOTkVMX1QgKiBDaFApOwordm9pZCBzU3RvcFJ4UHJvY2Vzc29yKENIQU5ORUxfVCAqIENoUCk7Cit2b2lkIHNTdG9wU1dJbkZsb3dDdGwoQ0hBTk5FTF9UICogQ2hQKTsKK3ZvaWQgc0ZsdXNoUnhGSUZPKENIQU5ORUxfVCAqIENoUCk7Cit2b2lkIHNGbHVzaFR4RklGTyhDSEFOTkVMX1QgKiBDaFApOworaW50IHNXcml0ZVR4UHJpb0J5dGUoQ0hBTk5FTF9UICogQ2hQLCBCeXRlX3QgRGF0YSk7Cit2b2lkIHNFbkludGVycnVwdHMoQ0hBTk5FTF9UICogQ2hQLCBXb3JkX3QgRmxhZ3MpOwordm9pZCBzRGlzSW50ZXJydXB0cyhDSEFOTkVMX1QgKiBDaFAsIFdvcmRfdCBGbGFncyk7Cit2b2lkIHNNb2RlbVJlc2V0KENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBjaGFuLCBpbnQgb24pOwordm9pZCBzUENJTW9kZW1SZXNldChDT05UUk9MTEVSX1QgKiBDdGxQLCBpbnQgY2hhbiwgaW50IG9uKTsKK3ZvaWQgc1NldEludGVyZmFjZU1vZGUoQ0hBTk5FTF9UICogQ2hQLCBCeXRlX3QgbW9kZSk7CisKK2V4dGVybiBCeXRlX3QgUltSREFUQVNJWkVdOworZXh0ZXJuIENPTlRST0xMRVJfVCBzQ29udHJvbGxlcltDVExfU0laRV07CitleHRlcm4gQnl0ZV90IHNJUlFNYXBbMTZdOworZXh0ZXJuIEJ5dGVfdCBzQml0TWFwQ2xyVGJsWzhdOworZXh0ZXJuIEJ5dGVfdCBzQml0TWFwU2V0VGJsWzhdOworZXh0ZXJuIGludCBzQ2xvY2tQcmVzY2FsZTsKKworLyoKKyAqIEJlZ2luIExpbnV4IHNwZWNpZmljIGRlZmluaXRpb25zIGZvciB0aGUgUm9ja2V0cG9ydCBkcml2ZXIKKyAqCisgKiBUaGlzIGNvZGUgaXMgQ29weXJpZ2h0IFRoZW9kb3JlIFRzJ28sIDE5OTUtMTk5NworICovCisKK3N0cnVjdCByX3BvcnQgeworCWludCBtYWdpYzsKKwlpbnQgbGluZTsKKwlpbnQgZmxhZ3M7CisJaW50IGNvdW50OworCWludCBibG9ja2VkX29wZW47CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBpbnQgYm9hcmQ6MzsKKwl1bnNpZ25lZCBpbnQgYWlvcDoyOworCXVuc2lnbmVkIGludCBjaGFuOjM7CisJQ09OVFJPTExFUl90ICpjdGxwOworCUNIQU5ORUxfdCBjaGFubmVsOworCWludCBjbG9zaW5nX3dhaXQ7CisJaW50IGNsb3NlX2RlbGF5OworCWludCBpbnRtYXNrOworCWludCB4bWl0X2ZpZm9fcm9vbTsJLyogcm9vbSBpbiB4bWl0IGZpZm8gKi8KKwl1bnNpZ25lZCBjaGFyICp4bWl0X2J1ZjsKKwlpbnQgeG1pdF9oZWFkOworCWludCB4bWl0X3RhaWw7CisJaW50IHhtaXRfY250OworCWludCBzZXNzaW9uOworCWludCBwZ3JwOworCWludCBjZF9zdGF0dXM7CisJaW50IGlnbm9yZV9zdGF0dXNfbWFzazsKKwlpbnQgcmVhZF9zdGF0dXNfbWFzazsKKwlpbnQgY3BzOworCisjaWZkZWYgREVDTEFSRV9XQUlUUVVFVUUKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgY2xvc2Vfd2FpdDsKKyNlbHNlCisJc3RydWN0IHdhaXRfcXVldWUgKm9wZW5fd2FpdDsKKwlzdHJ1Y3Qgd2FpdF9xdWV1ZSAqY2xvc2Vfd2FpdDsKKyNlbmRpZgorCXNwaW5sb2NrX3Qgc2xvY2s7CisJc3RydWN0IHNlbWFwaG9yZSB3cml0ZV9zZW07Cit9OworCisjZGVmaW5lIFJQT1JUX01BR0lDIDB4NTI1MDAxCisKKyNkZWZpbmUgTlVNX0JPQVJEUyA4CisjZGVmaW5lIE1BWF9SUF9QT1JUUyAoMzIqTlVNX0JPQVJEUykKKworLyoKKyAqIFRoZSBzaXplIG9mIHRoZSB4bWl0IGJ1ZmZlciBpcyAxIHBhZ2UsIG9yIDQwOTYgYnl0ZXMKKyAqLworI2RlZmluZSBYTUlUX0JVRl9TSVpFIDQwOTYKKworLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgbGVmdCBpbiB4bWl0IGJ1ZmZlciBiZWZvcmUgd2UgYXNrIGZvciBtb3JlICovCisjZGVmaW5lIFdBS0VVUF9DSEFSUyAyNTYKKworLyogSW50ZXJuYWwgZmxhZ3MgdXNlZCBvbmx5IGJ5IHRoZSByb2NrZXRwb3J0IGRyaXZlciAqLworI2RlZmluZSBST0NLRVRfSU5JVElBTElaRUQJMHg4MDAwMDAwMAkvKiBQb3J0IGlzIGFjdGl2ZSAqLworI2RlZmluZSBST0NLRVRfQ0xPU0lORwkJMHg0MDAwMDAwMAkvKiBTZXJpYWwgcG9ydCBpcyBjbG9zaW5nICovCisjZGVmaW5lIFJPQ0tFVF9OT1JNQUxfQUNUSVZFCTB4MjAwMDAwMDAJLyogTm9ybWFsIHBvcnQgaXMgYWN0aXZlICovCisKKy8qIHR0eSBzdWJ0eXBlcyAqLworI2RlZmluZSBTRVJJQUxfVFlQRV9OT1JNQUwgMQorCisvKgorICogQXNzaWduZWQgbWFqb3IgbnVtYmVycyBmb3IgdGhlIENvbXRyb2wgUm9ja2V0cG9ydAorICovCisjZGVmaW5lIFRUWV9ST0NLRVRfTUFKT1IJNDYKKyNkZWZpbmUgQ1VBX1JPQ0tFVF9NQUpPUgk0NworCisjaWZkZWYgUENJX1ZFTkRPUl9JRF9SUAorI3VuZGVmIFBDSV9WRU5ET1JfSURfUlAKKyN1bmRlZiBQQ0lfREVWSUNFX0lEX1JQOE9DVEEKKyN1bmRlZiBQQ0lfREVWSUNFX0lEX1JQOElOVEYKKyN1bmRlZiBQQ0lfREVWSUNFX0lEX1JQMTZJTlRGCisjdW5kZWYgUENJX0RFVklDRV9JRF9SUDMySU5URgorI3VuZGVmIFBDSV9ERVZJQ0VfSURfVVJQOE9DVEEKKyN1bmRlZiBQQ0lfREVWSUNFX0lEX1VSUDhJTlRGCisjdW5kZWYgUENJX0RFVklDRV9JRF9VUlAxNklOVEYKKyN1bmRlZiBQQ0lfREVWSUNFX0lEX0NSUDE2SU5URgorI3VuZGVmIFBDSV9ERVZJQ0VfSURfVVJQMzJJTlRGCisjZW5kaWYKKworLyogIENvbXRyb2wgUENJIFZlbmRvciBJRCAqLworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JQCQkweDExZmUKKworLyogIENvbXRyb2wgRGV2aWNlIElEJ3MgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDMySU5URgkJMHgwMDAxCS8qIFJvY2tldHBvcnQgMzIgcG9ydCB3L2V4dGVybmFsIEkvRiAgICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDhJTlRGCQkweDAwMDIJLyogUm9ja2V0cG9ydCA4IHBvcnQgdy9leHRlcm5hbCBJL0YgICAgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQMTZJTlRGCQkweDAwMDMJLyogUm9ja2V0cG9ydCAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GICAgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQNFFVQUQJCTB4MDAwNAkvKiBSb2NrZXRwb3J0IDQgcG9ydCB3L3F1YWQgY2FibGUgICAgICAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlA4T0NUQQkJMHgwMDA1CS8qIFJvY2tldHBvcnQgOCBwb3J0IHcvb2N0YSBjYWJsZSAgICAgICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDhKCQkweDAwMDYJLyogUm9ja2V0cG9ydCA4IHBvcnQgdy9SSjExIGNvbm5lY3RvcnMgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQNEoJCTB4MDAwNwkvKiBSb2NrZXRwb3J0IDQgcG9ydCB3L1JKMTEgY29ubmVjdG9ycyAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlA4U05JCQkweDAwMDgJLyogUm9ja2V0cG9ydCA4IHBvcnQgdy8gREI3OCBTTkkgKFNpZW1lbnMpIGNvbm5lY3RvciAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQMTZTTkkJCTB4MDAwOQkvKiBSb2NrZXRwb3J0IDE2IHBvcnQgdy8gREI3OCBTTkkgKFNpZW1lbnMpIGNvbm5lY3RvciAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlBQNAkJMHgwMDBBCS8qIFJvY2tldHBvcnQgUGx1cyA0IHBvcnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUFA4CQkweDAwMEIJLyogUm9ja2V0cG9ydCBQbHVzIDggcG9ydCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQNk0JCTB4MDAwQwkvKiBSb2NrZXRNb2RlbSA2IHBvcnQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlA0TQkJMHgwMDBECS8qIFJvY2tldE1vZGVtIDQgcG9ydCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDJfMjMyICAgICAgICAgICAweDAwMEUJLyogUm9ja2V0cG9ydCBQbHVzIDIgcG9ydCBSUzIzMiAgICAgICAgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQMl80MjIgICAgICAgICAgIDB4MDAwRgkvKiBSb2NrZXRwb3J0IFBsdXMgMiBwb3J0IFJTNDIyICAgICAgICAgICovIAorCisvKiBVbml2ZXJzYWwgUENJIGJvYXJkcyAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9VUlAzMklOVEYJCTB4MDgwMQkvKiBSb2NrZXRwb3J0IFVQQ0kgMzIgcG9ydCB3L2V4dGVybmFsIEkvRiAqLyAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9VUlA4SU5URgkJMHgwODAyCS8qIFJvY2tldHBvcnQgVVBDSSA4IHBvcnQgdy9leHRlcm5hbCBJL0YgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVVJQMTZJTlRGCQkweDA4MDMJLyogUm9ja2V0cG9ydCBVUENJIDE2IHBvcnQgdy9leHRlcm5hbCBJL0YgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9VUlA4T0NUQQkJMHgwODA1CS8qIFJvY2tldHBvcnQgVVBDSSA4IHBvcnQgdy9vY3RhIGNhYmxlICAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVVBDSV9STTNfOFBPUlQgICAgMHgwODBDCS8qIFJvY2tldG1vZGVtIElJSSA4IHBvcnQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVVBDSV9STTNfNFBPUlQgICAgMHgwODBECS8qIFJvY2tldG1vZGVtIElJSSA0IHBvcnQgICAgICAgICAgICAgICAgICovCisKKy8qIENvbXBhY3QgUENJIGRldmljZSAqLyAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DUlAxNklOVEYJCTB4MDkwMwkvKiBSb2NrZXRwb3J0IENvbXBhY3QgUENJIDE2IHBvcnQgdy9leHRlcm5hbCBJL0YgKi8KKworI2RlZmluZSBUVFlfR0VUX0xJTkUodCkgdC0+aW5kZXgKKyNkZWZpbmUgVFRZX0RSSVZFUl9NSU5PUl9TVEFSVCh0KSB0LT5kcml2ZXItPm1pbm9yX3N0YXJ0CisjZGVmaW5lIFRUWV9EUklWRVJfU1VCVFlQRSh0KSB0LT5kcml2ZXItPnN1YnR5cGUKKyNkZWZpbmUgVFRZX0RSSVZFUl9OQU1FKHQpIHQtPmRyaXZlci0+bmFtZQorI2RlZmluZSBUVFlfRFJJVkVSX05BTUVfQkFTRSh0KSB0LT5kcml2ZXItPm5hbWVfYmFzZQorI2RlZmluZSBUVFlfRFJJVkVSX0ZMVVNIX0JVRkZFUl9FWElTVFModCkgdC0+ZHJpdmVyLT5mbHVzaF9idWZmZXIKKyNkZWZpbmUgVFRZX0RSSVZFUl9GTFVTSF9CVUZGRVIodCkgdC0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodCkKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcnRjLmMgYi9kcml2ZXJzL2NoYXIvcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0ZjA5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9ydGMuYwpAQCAtMCwwICsxLDEzNTQgQEAKKy8qCisgKglSZWFsIFRpbWUgQ2xvY2sgaW50ZXJmYWNlIGZvciBMaW51eAkKKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBHb3J0bWFrZXIKKyAqCisgKglUaGlzIGRyaXZlciBhbGxvd3MgdXNlIG9mIHRoZSByZWFsIHRpbWUgY2xvY2sgKGJ1aWx0IGludG8KKyAqCW5lYXJseSBhbGwgY29tcHV0ZXJzKSBmcm9tIHVzZXIgc3BhY2UuIEl0IGV4cG9ydHMgdGhlIC9kZXYvcnRjCisgKglpbnRlcmZhY2Ugc3VwcG9ydGluZyB2YXJpb3VzIGlvY3RsKCkgYW5kIGFsc28gdGhlCisgKgkvcHJvYy9kcml2ZXIvcnRjIHBzZXVkby1maWxlIGZvciBzdGF0dXMgaW5mb3JtYXRpb24uCisgKgorICoJVGhlIGlvY3RscyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGludGVycnVwdCBiZWhhdmlvdXIgYW5kCisgKglnZW5lcmF0aW9uIHJhdGUgZnJvbSB0aGUgUlRDIHZpYSBJUlEgOC4gVGhlbiB0aGUgL2Rldi9ydGMKKyAqCWludGVyZmFjZSBjYW4gYmUgdXNlZCB0byBtYWtlIHVzZSBvZiB0aGVzZSB0aW1lciBpbnRlcnJ1cHRzLAorICoJYmUgdGhleSBpbnRlcnZhbCBvciBhbGFybSBiYXNlZC4KKyAqCisgKglUaGUgL2Rldi9ydGMgaW50ZXJmYWNlIHdpbGwgYmxvY2sgb24gcmVhZHMgdW50aWwgYW4gaW50ZXJydXB0CisgKgloYXMgYmVlbiByZWNlaXZlZC4gSWYgYSBSVEMgaW50ZXJydXB0IGhhcyBhbHJlYWR5IGhhcHBlbmVkLAorICoJaXQgd2lsbCBvdXRwdXQgYW4gdW5zaWduZWQgbG9uZyBhbmQgdGhlbiBibG9jay4gVGhlIG91dHB1dCB2YWx1ZQorICoJY29udGFpbnMgdGhlIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGxvdyBieXRlIGFuZCB0aGUgbnVtYmVyIG9mCisgKglpbnRlcnJ1cHRzIHNpbmNlIHRoZSBsYXN0IHJlYWQgaW4gdGhlIHJlbWFpbmluZyBoaWdoIGJ5dGVzLiBUaGUgCisgKgkvZGV2L3J0YyBpbnRlcmZhY2UgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBzZWxlY3QoMikgY2FsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUJhc2VkIG9uIG90aGVyIG1pbmltYWwgY2hhciBkZXZpY2UgZHJpdmVycywgbGlrZSBBbGFuJ3MKKyAqCXdhdGNoZG9nLCBUZWQncyByYW5kb20sIGV0Yy4gZXRjLgorICoKKyAqCTEuMDcJUGF1bCBHb3J0bWFrZXIuCisgKgkxLjA4CU1pcXVlbCB2YW4gU21vb3JlbmJ1cmc6IGRpc2FsbG93IGNlcnRhaW4gdGhpbmdzIG9uIHRoZQorICoJCURFQyBBbHBoYSBhcyB0aGUgQ01PUyBjbG9jayBpcyBhbHNvIHVzZWQgZm9yIG90aGVyIHRoaW5ncy4KKyAqCTEuMDkJTmlraXRhIFNjaG1pZHQ6IGVwb2NoIHN1cHBvcnQgYW5kIHNvbWUgQWxwaGEgY2xlYW51cC4KKyAqCTEuMDlhCVBldGUgWmFpdGNldjogU3VuIFNQQVJDCisgKgkxLjA5YglKZWZmIEdhcnppazogTW9kdWxhcml6ZSwgaW5pdCBjbGVhbnVwCisgKgkxLjA5YwlKZWZmIEdhcnppazogU01QIGNsZWFudXAKKyAqCTEuMTAgICAgUGF1bCBCYXJ0b24tRGF2aXM6IGFkZCBzdXBwb3J0IGZvciBhc3luYyBJL08KKyAqCTEuMTBhCUFuZHJlYSBBcmNhbmdlbGk6IEFscGhhIHVwZGF0ZXMKKyAqCTEuMTBiCUFuZHJldyBNb3J0b246IFNNUCBsb2NrIGZpeAorICoJMS4xMGMJQ2VzYXIgQmFycm9zOiBTTVAgbG9ja2luZyBmaXhlcyBhbmQgY2xlYW51cAorICoJMS4xMGQJUGF1bCBHb3J0bWFrZXI6IGRlbGV0ZSBwYXJhbm9pYSBjaGVjayBpbiBydGNfZXhpdAorICoJMS4xMGUJTWFjaWVqIFcuIFJvenlja2k6IEhhbmRsZSBERUNzdGF0aW9uJ3MgeWVhciB3ZWlyZG5lc3MuCisgKiAgICAgIDEuMTEgICAgVGFrYXNoaSBJd2FpOiBLZXJuZWwgYWNjZXNzIGZ1bmN0aW9ucworICoJCQkgICAgICBydGNfcmVnaXN0ZXIvcnRjX3VucmVnaXN0ZXIvcnRjX2NvbnRyb2wKKyAqICAgICAgMS4xMWEgICBEYW5pZWxlIEJlbGx1Y2NpOiBBdWRpdCBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IGluIHJ0Y19pbml0CisgKgkxLjEyCVZlbmthdGVzaCBQYWxsaXBhZGk6IEhvb2tzIGZvciBlbXVsYXRpbmcgcnRjIG9uIEhQRVQgYmFzZS10aW1lcgorICoJCUNPTkZJR19IUEVUX0VNVUxBVEVfUlRDCisgKgorICovCisKKyNkZWZpbmUgUlRDX1ZFUlNJT04JCSIxLjEyIgorCisjZGVmaW5lIFJUQ19JT19FWFRFTlQJMHg4CisKKy8qCisgKglOb3RlIHRoYXQgKmFsbCogY2FsbHMgdG8gQ01PU19SRUFEIGFuZCBDTU9TX1dSSVRFIGFyZSBkb25lIHdpdGgKKyAqCWludGVycnVwdHMgZGlzYWJsZWQuIER1ZSB0byB0aGUgaW5kZXgtcG9ydC9kYXRhLXBvcnQgKDB4NzAvMHg3MSkKKyAqCWRlc2lnbiBvZiB0aGUgUlRDLCB3ZSBkb24ndCB3YW50IHR3byBkaWZmZXJlbnQgdGhpbmdzIHRyeWluZyB0bworICoJZ2V0IHRvIGl0IGF0IG9uY2UuIChlLmcuIHRoZSBwZXJpb2RpYyAxMSBtaW4gc3luYyBmcm9tIHRpbWUuYyB2cy4KKyAqCXRoaXMgZHJpdmVyLikKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisKKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaWYgZGVmaW5lZChfX2kzODZfXykKKyNpbmNsdWRlIDxhc20vaHBldC5oPgorI2VuZGlmCisKKyNpZmRlZiBfX3NwYXJjX18KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vZWJ1cy5oPgorI2lmZGVmIF9fc3BhcmNfdjlfXworI2luY2x1ZGUgPGFzbS9pc2EuaD4KKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydGNfcG9ydDsKK3N0YXRpYyBpbnQgcnRjX2lycSA9IFBDSV9JUlFfTk9ORTsKKyNlbmRpZgorCisjaWZkZWYJQ09ORklHX0hQRVRfUlRDX0lSUQorI3VuZGVmCVJUQ19JUlEKKyNlbmRpZgorCisjaWZkZWYgUlRDX0lSUQorc3RhdGljIGludCBydGNfaGFzX2lycSA9IDE7CisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQworI2RlZmluZSBpc19ocGV0X2VuYWJsZWQoKQkJCTAKKyNkZWZpbmUgaHBldF9zZXRfYWxhcm1fdGltZShocnMsIG1pbiwgc2VjKSAJMAorI2RlZmluZSBocGV0X3NldF9wZXJpb2RpY19mcmVxKGFyZykgCQkwCisjZGVmaW5lIGhwZXRfbWFza19ydGNfaXJxX2JpdChhcmcpIAkJMAorI2RlZmluZSBocGV0X3NldF9ydGNfaXJxX2JpdChhcmcpIAkJMAorI2RlZmluZSBocGV0X3J0Y190aW1lcl9pbml0KCkgCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBocGV0X3J0Y19kcm9wcGVkX2lycSgpIAkJCTAKK3N0YXRpYyBpbmxpbmUgaXJxcmV0dXJuX3QgaHBldF9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIHtyZXR1cm4gMDt9CisjZWxzZQorZXh0ZXJuIGlycXJldHVybl90IGhwZXRfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorCisvKgorICoJV2Ugc3BvbmdlIGEgbWlub3Igb2ZmIG9mIHRoZSBtaXNjIG1ham9yLiBObyBuZWVkIHNsdXJwaW5nCisgKgl1cCBhbm90aGVyIHZhbHVhYmxlIG1ham9yIGRldiBudW1iZXIgZm9yIHRoaXMuIElmIHlvdSBhZGQKKyAqCWFuIGlvY3RsLCBtYWtlIHN1cmUgeW91IGRvbid0IGNvbmZsaWN0IHdpdGggU1BBUkMncyBSVEMKKyAqCWlvY3Rscy4KKyAqLworCitzdGF0aWMgc3RydWN0IGZhc3luY19zdHJ1Y3QgKnJ0Y19hc3luY19xdWV1ZTsKKworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHJ0Y193YWl0KTsKKworI2lmZGVmIFJUQ19JUlEKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBydGNfaXJxX3RpbWVyOworI2VuZGlmCisKK3N0YXRpYyBzc2l6ZV90IHJ0Y19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworCitzdGF0aWMgaW50IHJ0Y19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKKyNpZmRlZiBSVENfSVJRCitzdGF0aWMgdW5zaWduZWQgaW50IHJ0Y19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBnZXRfcnRjX2FsbV90aW1lIChzdHJ1Y3QgcnRjX3RpbWUgKmFsbV90bSk7CisjaWZkZWYgUlRDX0lSUQorc3RhdGljIHZvaWQgcnRjX2Ryb3BwZWRfaXJxKHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKK3N0YXRpYyB2b2lkIHNldF9ydGNfaXJxX2JpdCh1bnNpZ25lZCBjaGFyIGJpdCk7CitzdGF0aWMgdm9pZCBtYXNrX3J0Y19pcnFfYml0KHVuc2lnbmVkIGNoYXIgYml0KTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHJ0Y19wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworCisvKgorICoJQml0cyBpbiBydGNfc3RhdHVzLiAoNiBiaXRzIG9mIHJvb20gZm9yIGZ1dHVyZSBleHBhbnNpb24pCisgKi8KKworI2RlZmluZSBSVENfSVNfT1BFTgkJMHgwMQkvKiBtZWFucyAvZGV2L3J0YyBpcyBpbiB1c2UJKi8KKyNkZWZpbmUgUlRDX1RJTUVSX09OCQkweDAyCS8qIG1pc3NlZCBpcnEgdGltZXIgYWN0aXZlCSovCisKKy8qCisgKiBydGNfc3RhdHVzIGlzIG5ldmVyIGNoYW5nZWQgYnkgcnRjX2ludGVycnVwdCwgYW5kIGlvY3RsL29wZW4vY2xvc2UgaXMKKyAqIHByb3RlY3RlZCBieSB0aGUgYmlnIGtlcm5lbCBsb2NrLiBIb3dldmVyLCBpb2N0bCBjYW4gc3RpbGwgZGlzYWJsZSB0aGUgdGltZXIKKyAqIGluIHJ0Y19zdGF0dXMgYW5kIHRoZW4gd2l0aCBkZWxfdGltZXIgYWZ0ZXIgdGhlIGludGVycnVwdCBoYXMgcmVhZAorICogcnRjX3N0YXR1cyBidXQgYmVmb3JlIG1vZF90aW1lciBpcyBjYWxsZWQsIHdoaWNoIHdvdWxkIHRoZW4gcmVlbmFibGUgdGhlCisgKiB0aW1lciAoYnV0IHlvdSB3b3VsZCBuZWVkIHRvIGhhdmUgYW4gYXdmdWwgdGltaW5nIGJlZm9yZSB5b3UnZCB0cmlwIG9uIGl0KQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydGNfc3RhdHVzID0gMDsJLyogYml0bWFwcGVkIHN0YXR1cyBieXRlLgkqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjX2ZyZXEgPSAwOwkvKiBDdXJyZW50IHBlcmlvZGljIElSUSByYXRlCSovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydGNfaXJxX2RhdGEgPSAwOwkvKiBvdXIgb3V0cHV0IHRvIHRoZSB3b3JsZAkqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjX21heF91c2VyX2ZyZXEgPSA2NDsgLyogPiB0aGlzLCBuZWVkIENBUF9TWVNfUkVTT1VSQ0UgKi8KKworI2lmZGVmIFJUQ19JUlEKKy8qCisgKiBydGNfdGFza19sb2NrIG5lc3RzIGluc2lkZSBydGNfbG9jay4KKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhydGNfdGFza19sb2NrKTsKK3N0YXRpYyBydGNfdGFza190ICpydGNfY2FsbGJhY2sgPSBOVUxMOworI2VuZGlmCisKKy8qCisgKglJZiB0aGlzIGRyaXZlciBldmVyIGJlY29tZXMgbW9kdWxhcmlzZWQsIGl0IHdpbGwgYmUgcmVhbGx5IG5pY2UKKyAqCXRvIG1ha2UgdGhlIGVwb2NoIHJldGFpbiBpdHMgdmFsdWUgYWNyb3NzIG1vZHVsZSByZWxvYWQuLi4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlcG9jaCA9IDE5MDA7CS8qIHllYXIgY29ycmVzcG9uZGluZyB0byAweDAwCSovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRheXNfaW5fbW9bXSA9IAorezAsIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9OworCisvKgorICogUmV0dXJucyB0cnVlIGlmIGEgY2xvY2sgdXBkYXRlIGlzIGluIHByb2dyZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBydGNfaXNfdXBkYXRpbmcodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHVpcDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwl1aXAgPSAoQ01PU19SRUFEKFJUQ19GUkVRX1NFTEVDVCkgJiBSVENfVUlQKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlyZXR1cm4gdWlwOworfQorCisjaWZkZWYgUlRDX0lSUQorLyoKKyAqCUEgdmVyeSB0aW55IGludGVycnVwdCBoYW5kbGVyLiBJdCBydW5zIHdpdGggU0FfSU5URVJSVVBUIHNldCwKKyAqCWJ1dCB0aGVyZSBpcyBwb3NzaWJpbGl0eSBvZiBjb25mbGljdGluZyB3aXRoIHRoZSBzZXRfcnRjX21tc3MoKQorICoJY2FsbCAodGhlIHJ0YyBpcnEgYW5kIHRoZSB0aW1lciBpcnEgY2FuIGVhc2lseSBydW4gYXQgdGhlIHNhbWUKKyAqCXRpbWUgaW4gdHdvIGRpZmZlcmVudCBDUFVzKS4gU28gd2UgbmVlZCB0byBzZXJpYWxpemUKKyAqCWFjY2Vzc2VzIHRvIHRoZSBjaGlwIHdpdGggdGhlIHJ0Y19sb2NrIHNwaW5sb2NrIHRoYXQgZWFjaAorICoJYXJjaGl0ZWN0dXJlIHNob3VsZCBpbXBsZW1lbnQgaW4gdGhlIHRpbWVyIGNvZGUuCisgKgkoU2VlIC4vYXJjaC9YWFhYL2tlcm5lbC90aW1lLmMgZm9yIHRoZSBzZXRfcnRjX21tc3MoKSBmdW5jdGlvbi4pCisgKi8KKworaXJxcmV0dXJuX3QgcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qCisJICoJQ2FuIGJlIGFuIGFsYXJtIGludGVycnVwdCwgdXBkYXRlIGNvbXBsZXRlIGludGVycnVwdCwKKwkgKglvciBhIHBlcmlvZGljIGludGVycnVwdC4gV2Ugc3RvcmUgdGhlIHN0YXR1cyBpbiB0aGUKKwkgKglsb3cgYnl0ZSBhbmQgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIHJlY2VpdmVkIHNpbmNlCisJICoJdGhlIGxhc3QgcmVhZCBpbiB0aGUgcmVtYWluZGVyIG9mIHJ0Y19pcnFfZGF0YS4KKwkgKi8KKworCXNwaW5fbG9jayAoJnJ0Y19sb2NrKTsKKwlydGNfaXJxX2RhdGEgKz0gMHgxMDA7CisJcnRjX2lycV9kYXRhICY9IH4weGZmOworCWlmIChpc19ocGV0X2VuYWJsZWQoKSkgeworCQkvKgorCQkgKiBJbiB0aGlzIGNhc2UgaXQgaXMgSFBFVCBSVEMgaW50ZXJydXB0IGhhbmRsZXIKKwkJICogY2FsbGluZyB1cywgd2l0aCB0aGUgaW50ZXJydXB0IGluZm9ybWF0aW9uCisJCSAqIHBhc3NlZCBhcyBhcmcxLCBpbnN0ZWFkIG9mIGlycS4KKwkJICovCisJCXJ0Y19pcnFfZGF0YSB8PSAodW5zaWduZWQgbG9uZylpcnEgJiAweEYwOworCX0gZWxzZSB7CisJCXJ0Y19pcnFfZGF0YSB8PSAoQ01PU19SRUFEKFJUQ19JTlRSX0ZMQUdTKSAmIDB4RjApOworCX0KKworCWlmIChydGNfc3RhdHVzICYgUlRDX1RJTUVSX09OKQorCQltb2RfdGltZXIoJnJ0Y19pcnFfdGltZXIsIGppZmZpZXMgKyBIWi9ydGNfZnJlcSArIDIqSFovMTAwKTsKKworCXNwaW5fdW5sb2NrICgmcnRjX2xvY2spOworCisJLyogTm93IGRvIHRoZSByZXN0IG9mIHRoZSBhY3Rpb25zICovCisJc3Bpbl9sb2NrKCZydGNfdGFza19sb2NrKTsKKwlpZiAocnRjX2NhbGxiYWNrKQorCQlydGNfY2FsbGJhY2stPmZ1bmMocnRjX2NhbGxiYWNrLT5wcml2YXRlX2RhdGEpOworCXNwaW5fdW5sb2NrKCZydGNfdGFza19sb2NrKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJ0Y193YWl0KTsJCisKKwlraWxsX2Zhc3luYyAoJnJ0Y19hc3luY19xdWV1ZSwgU0lHSU8sIFBPTExfSU4pOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorI2VuZGlmCisKKy8qCisgKiBzeXNjdGwtdHVuaW5nIGluZnJhc3RydWN0dXJlLgorICovCitzdGF0aWMgY3RsX3RhYmxlIHJ0Y190YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gMSwKKwkJLnByb2NuYW1lCT0gIm1heC11c2VyLWZyZXEiLAorCQkuZGF0YQkJPSAmcnRjX21heF91c2VyX2ZyZXEsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIHJ0Y19yb290W10gPSB7CisJeworCQkuY3RsX25hbWUJPSAxLAorCQkucHJvY25hbWUJPSAicnRjIiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gcnRjX3RhYmxlLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgZGV2X3Jvb3RbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9ERVYsCisJCS5wcm9jbmFtZQk9ICJkZXYiLAorCQkubWF4bGVuCQk9IDAsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBydGNfcm9vdCwKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKnN5c2N0bF9oZWFkZXI7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc3lzY3RsKHZvaWQpCit7CisgICAgc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShkZXZfcm9vdCwgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3N5c2N0bCh2b2lkKQoreworICAgIHVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN5c2N0bF9oZWFkZXIpOworfQorCisvKgorICoJTm93IGFsbCB0aGUgdmFyaW91cyBmaWxlIG9wZXJhdGlvbnMgdGhhdCB3ZSBleHBvcnQuCisgKi8KKworc3RhdGljIHNzaXplX3QgcnRjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKyNpZm5kZWYgUlRDX0lSUQorCXJldHVybiAtRUlPOworI2Vsc2UKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJc3NpemVfdCByZXR2YWw7CisJCisJaWYgKHJ0Y19oYXNfaXJxID09IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKGNvdW50IDwgc2l6ZW9mKHVuc2lnbmVkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZGRfd2FpdF9xdWV1ZSgmcnRjX3dhaXQsICZ3YWl0KTsKKworCWRvIHsKKwkJLyogRmlyc3QgbWFrZSBpdCByaWdodC4gVGhlbiBtYWtlIGl0IGZhc3QuIFB1dHRpbmcgdGhpcyB3aG9sZQorCQkgKiBibG9jayB3aXRoaW4gdGhlIHBhcmVudGhlc2VzIG9mIGEgd2hpbGUgd291bGQgYmUgdG9vCisJCSAqIGNvbmZ1c2luZy4gQW5kIG5vLCB4Y2hnKCkgaXMgbm90IHRoZSBhbnN3ZXIuICovCisKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkKKwkJc3Bpbl9sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKwkJZGF0YSA9IHJ0Y19pcnFfZGF0YTsKKwkJcnRjX2lycV9kYXRhID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxICgmcnRjX2xvY2spOworCisJCWlmIChkYXRhICE9IDApCisJCQlicmVhazsKKworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNjaGVkdWxlKCk7CisJfSB3aGlsZSAoMSk7CisKKwlpZiAoY291bnQgPCBzaXplb2YodW5zaWduZWQgbG9uZykpCisJCXJldHZhbCA9IHB1dF91c2VyKGRhdGEsICh1bnNpZ25lZCBpbnQgX191c2VyICopYnVmKSA/OiBzaXplb2YoaW50KTsgCisJZWxzZQorCQlyZXR2YWwgPSBwdXRfdXNlcihkYXRhLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilidWYpID86IHNpemVvZihsb25nKTsKKyBvdXQ6CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnJ0Y193YWl0LCAmd2FpdCk7CisKKwlyZXR1cm4gcmV0dmFsOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgcnRjX2RvX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQga2VybmVsKQoreworCXN0cnVjdCBydGNfdGltZSB3dGltZTsgCisKKyNpZmRlZiBSVENfSVJRCisJaWYgKHJ0Y19oYXNfaXJxID09IDApIHsKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBSVENfQUlFX09GRjoKKwkJY2FzZSBSVENfQUlFX09OOgorCQljYXNlIFJUQ19QSUVfT0ZGOgorCQljYXNlIFJUQ19QSUVfT046CisJCWNhc2UgUlRDX1VJRV9PRkY6CisJCWNhc2UgUlRDX1VJRV9PTjoKKwkJY2FzZSBSVENfSVJRUF9SRUFEOgorCQljYXNlIFJUQ19JUlFQX1NFVDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9OworCX0KKyNlbmRpZgorCisJc3dpdGNoIChjbWQpIHsKKyNpZmRlZiBSVENfSVJRCisJY2FzZSBSVENfQUlFX09GRjoJLyogTWFzayBhbGFybSBpbnQuIGVuYWIuIGJpdAkqLworCXsKKwkJbWFza19ydGNfaXJxX2JpdChSVENfQUlFKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX0FJRV9PTjoJLyogQWxsb3cgYWxhcm0gaW50ZXJydXB0cy4JKi8KKwl7CisJCXNldF9ydGNfaXJxX2JpdChSVENfQUlFKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX1BJRV9PRkY6CS8qIE1hc2sgcGVyaW9kaWMgaW50LiBlbmFiLiBiaXQJKi8KKwl7CisJCW1hc2tfcnRjX2lycV9iaXQoUlRDX1BJRSk7CisJCWlmIChydGNfc3RhdHVzICYgUlRDX1RJTUVSX09OKSB7CisJCQlzcGluX2xvY2tfaXJxICgmcnRjX2xvY2spOworCQkJcnRjX3N0YXR1cyAmPSB+UlRDX1RJTUVSX09OOworCQkJZGVsX3RpbWVyKCZydGNfaXJxX3RpbWVyKTsKKwkJCXNwaW5fdW5sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBSVENfUElFX09OOgkvKiBBbGxvdyBwZXJpb2RpYyBpbnRzCQkqLworCXsKKworCQkvKgorCQkgKiBXZSBkb24ndCByZWFsbHkgd2FudCBKb2UgVXNlciBlbmFibGluZyBtb3JlCisJCSAqIHRoYW4gNjRIeiBvZiBpbnRlcnJ1cHRzIG9uIGEgbXVsdGktdXNlciBtYWNoaW5lLgorCQkgKi8KKwkJaWYgKCFrZXJuZWwgJiYgKHJ0Y19mcmVxID4gcnRjX21heF91c2VyX2ZyZXEpICYmCisJCQkoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKCEocnRjX3N0YXR1cyAmIFJUQ19USU1FUl9PTikpIHsKKwkJCXNwaW5fbG9ja19pcnEgKCZydGNfbG9jayk7CisJCQlydGNfaXJxX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFovcnRjX2ZyZXEgKyAyKkhaLzEwMDsKKwkJCWFkZF90aW1lcigmcnRjX2lycV90aW1lcik7CisJCQlydGNfc3RhdHVzIHw9IFJUQ19USU1FUl9PTjsKKwkJCXNwaW5fdW5sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKwkJfQorCQlzZXRfcnRjX2lycV9iaXQoUlRDX1BJRSk7CisJCXJldHVybiAwOworCX0KKwljYXNlIFJUQ19VSUVfT0ZGOgkvKiBNYXNrIGludHMgZnJvbSBSVEMgdXBkYXRlcy4JKi8KKwl7CisJCW1hc2tfcnRjX2lycV9iaXQoUlRDX1VJRSk7CisJCXJldHVybiAwOworCX0KKwljYXNlIFJUQ19VSUVfT046CS8qIEFsbG93IGludHMgZm9yIFJUQyB1cGRhdGVzLgkqLworCXsKKwkJc2V0X3J0Y19pcnFfYml0KFJUQ19VSUUpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwljYXNlIFJUQ19BTE1fUkVBRDoJLyogUmVhZCB0aGUgcHJlc2VudCBhbGFybSB0aW1lICovCisJeworCQkvKgorCQkgKiBUaGlzIHJldHVybnMgYSBzdHJ1Y3QgcnRjX3RpbWUuIFJlYWRpbmcgPj0gMHhjMAorCQkgKiBtZWFucyAiZG9uJ3QgY2FyZSIgb3IgIm1hdGNoIGFsbCIuIE9ubHkgdGhlIHRtX2hvdXIsCisJCSAqIHRtX21pbiwgYW5kIHRtX3NlYyB2YWx1ZXMgYXJlIGZpbGxlZCBpbi4KKwkJICovCisJCW1lbXNldCgmd3RpbWUsIDAsIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKTsKKwkJZ2V0X3J0Y19hbG1fdGltZSgmd3RpbWUpOworCQlicmVhazsgCisJfQorCWNhc2UgUlRDX0FMTV9TRVQ6CS8qIFN0b3JlIGEgdGltZSBpbnRvIHRoZSBhbGFybSAqLworCXsKKwkJLyoKKwkJICogVGhpcyBleHBlY3RzIGEgc3RydWN0IHJ0Y190aW1lLiBXcml0aW5nIDB4ZmYgbWVhbnMKKwkJICogImRvbid0IGNhcmUiIG9yICJtYXRjaCBhbGwiLiBPbmx5IHRoZSB0bV9ob3VyLAorCQkgKiB0bV9taW4gYW5kIHRtX3NlYyBhcmUgdXNlZC4KKwkJICovCisJCXVuc2lnbmVkIGNoYXIgaHJzLCBtaW4sIHNlYzsKKwkJc3RydWN0IHJ0Y190aW1lIGFsbV90bTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmFsbV90bSwgKHN0cnVjdCBydGNfdGltZSBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaHJzID0gYWxtX3RtLnRtX2hvdXI7CisJCW1pbiA9IGFsbV90bS50bV9taW47CisJCXNlYyA9IGFsbV90bS50bV9zZWM7CisKKwkJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCQlpZiAoaHBldF9zZXRfYWxhcm1fdGltZShocnMsIG1pbiwgc2VjKSkgeworCQkJLyoKKwkJCSAqIEZhbGx0aHJ1IGFuZCBzZXQgYWxhcm0gdGltZSBpbiBDTU9TIHRvbywKKwkJCSAqIHNvIHRoYXQgd2Ugd2lsbCBnZXQgcHJvcGVyIHZhbHVlIGluIFJUQ19BTE1fUkVBRAorCQkJICovCisJCX0KKwkJaWYgKCEoQ01PU19SRUFEKFJUQ19DT05UUk9MKSAmIFJUQ19ETV9CSU5BUlkpIHx8CisJCSAgICBSVENfQUxXQVlTX0JDRCkKKwkJeworCQkJaWYgKHNlYyA8IDYwKSBCSU5fVE9fQkNEKHNlYyk7CisJCQllbHNlIHNlYyA9IDB4ZmY7CisKKwkJCWlmIChtaW4gPCA2MCkgQklOX1RPX0JDRChtaW4pOworCQkJZWxzZSBtaW4gPSAweGZmOworCisJCQlpZiAoaHJzIDwgMjQpIEJJTl9UT19CQ0QoaHJzKTsKKwkJCWVsc2UgaHJzID0gMHhmZjsKKwkJfQorCQlDTU9TX1dSSVRFKGhycywgUlRDX0hPVVJTX0FMQVJNKTsKKwkJQ01PU19XUklURShtaW4sIFJUQ19NSU5VVEVTX0FMQVJNKTsKKwkJQ01PU19XUklURShzZWMsIFJUQ19TRUNPTkRTX0FMQVJNKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX1JEX1RJTUU6CS8qIFJlYWQgdGhlIHRpbWUvZGF0ZSBmcm9tIFJUQwkqLworCXsKKwkJbWVtc2V0KCZ3dGltZSwgMCwgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpOworCQlydGNfZ2V0X3J0Y190aW1lKCZ3dGltZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFJUQ19TRVRfVElNRToJLyogU2V0IHRoZSBSVEMgKi8KKwl7CisJCXN0cnVjdCBydGNfdGltZSBydGNfdG07CisJCXVuc2lnbmVkIGNoYXIgbW9uLCBkYXksIGhycywgbWluLCBzZWMsIGxlYXBfeXI7CisJCXVuc2lnbmVkIGNoYXIgc2F2ZV9jb250cm9sLCBzYXZlX2ZyZXFfc2VsZWN0OworCQl1bnNpZ25lZCBpbnQgeXJzOworI2lmZGVmIENPTkZJR19NQUNIX0RFQ1NUQVRJT04KKwkJdW5zaWduZWQgaW50IHJlYWxfeXJzOworI2VuZGlmCisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ0Y190bSwgKHN0cnVjdCBydGNfdGltZSBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJeXJzID0gcnRjX3RtLnRtX3llYXIgKyAxOTAwOworCQltb24gPSBydGNfdG0udG1fbW9uICsgMTsgICAvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KKwkJZGF5ID0gcnRjX3RtLnRtX21kYXk7CisJCWhycyA9IHJ0Y190bS50bV9ob3VyOworCQltaW4gPSBydGNfdG0udG1fbWluOworCQlzZWMgPSBydGNfdG0udG1fc2VjOworCisJCWlmICh5cnMgPCAxOTcwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbGVhcF95ciA9ICgoISh5cnMgJSA0KSAmJiAoeXJzICUgMTAwKSkgfHwgISh5cnMgJSA0MDApKTsKKworCQlpZiAoKG1vbiA+IDEyKSB8fCAoZGF5ID09IDApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGRheSA+IChkYXlzX2luX21vW21vbl0gKyAoKG1vbiA9PSAyKSAmJiBsZWFwX3lyKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQorCQlpZiAoKGhycyA+PSAyNCkgfHwgKG1pbiA+PSA2MCkgfHwgKHNlYyA+PSA2MCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoKHlycyAtPSBlcG9jaCkgPiAyNTUpICAgIC8qIFRoZXkgYXJlIHVuc2lnbmVkICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisjaWZkZWYgQ09ORklHX01BQ0hfREVDU1RBVElPTgorCQlyZWFsX3lycyA9IHlyczsKKwkJeXJzID0gNzI7CisKKwkJLyoKKwkJICogV2Ugd2FudCB0byBrZWVwIHRoZSB5ZWFyIHNldCB0byA3MyB1bnRpbCBNYXJjaAorCQkgKiBmb3Igbm9uLWxlYXAgeWVhcnMsIHNvIHRoYXQgRmViLCAyOXRoIGlzIGhhbmRsZWQKKwkJICogY29ycmVjdGx5LgorCQkgKi8KKwkJaWYgKCFsZWFwX3lyICYmIG1vbiA8IDMpIHsKKwkJCXJlYWxfeXJzLS07CisJCQl5cnMgPSA3MzsKKwkJfQorI2VuZGlmCisJCS8qIFRoZXNlIGxpbWl0cyBhbmQgYWRqdXN0bWVudHMgYXJlIGluZGVwZW5kZW50IG9mCisJCSAqIHdoZXRoZXIgdGhlIGNoaXAgaXMgaW4gYmluYXJ5IG1vZGUgb3Igbm90LgorCQkgKi8KKwkJaWYgKHlycyA+IDE2OSkgeworCQkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoeXJzID49IDEwMCkKKwkJCXlycyAtPSAxMDA7CisKKwkJaWYgKCEoQ01PU19SRUFEKFJUQ19DT05UUk9MKSAmIFJUQ19ETV9CSU5BUlkpCisJCSAgICB8fCBSVENfQUxXQVlTX0JDRCkgeworCQkJQklOX1RPX0JDRChzZWMpOworCQkJQklOX1RPX0JDRChtaW4pOworCQkJQklOX1RPX0JDRChocnMpOworCQkJQklOX1RPX0JDRChkYXkpOworCQkJQklOX1RPX0JDRChtb24pOworCQkJQklOX1RPX0JDRCh5cnMpOworCQl9CisKKwkJc2F2ZV9jb250cm9sID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsKKwkJQ01PU19XUklURSgoc2F2ZV9jb250cm9sfFJUQ19TRVQpLCBSVENfQ09OVFJPTCk7CisJCXNhdmVfZnJlcV9zZWxlY3QgPSBDTU9TX1JFQUQoUlRDX0ZSRVFfU0VMRUNUKTsKKwkJQ01PU19XUklURSgoc2F2ZV9mcmVxX3NlbGVjdHxSVENfRElWX1JFU0VUMiksIFJUQ19GUkVRX1NFTEVDVCk7CisKKyNpZmRlZiBDT05GSUdfTUFDSF9ERUNTVEFUSU9OCisJCUNNT1NfV1JJVEUocmVhbF95cnMsIFJUQ19ERUNfWUVBUik7CisjZW5kaWYKKwkJQ01PU19XUklURSh5cnMsIFJUQ19ZRUFSKTsKKwkJQ01PU19XUklURShtb24sIFJUQ19NT05USCk7CisJCUNNT1NfV1JJVEUoZGF5LCBSVENfREFZX09GX01PTlRIKTsKKwkJQ01PU19XUklURShocnMsIFJUQ19IT1VSUyk7CisJCUNNT1NfV1JJVEUobWluLCBSVENfTUlOVVRFUyk7CisJCUNNT1NfV1JJVEUoc2VjLCBSVENfU0VDT05EUyk7CisKKwkJQ01PU19XUklURShzYXZlX2NvbnRyb2wsIFJUQ19DT05UUk9MKTsKKwkJQ01PU19XUklURShzYXZlX2ZyZXFfc2VsZWN0LCBSVENfRlJFUV9TRUxFQ1QpOworCisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisjaWZkZWYgUlRDX0lSUQorCWNhc2UgUlRDX0lSUVBfUkVBRDoJLyogUmVhZCB0aGUgcGVyaW9kaWMgSVJRIHJhdGUuCSovCisJeworCQlyZXR1cm4gcHV0X3VzZXIocnRjX2ZyZXEsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZyk7CisJfQorCWNhc2UgUlRDX0lSUVBfU0VUOgkvKiBTZXQgcGVyaW9kaWMgSVJRIHJhdGUuCSovCisJeworCQlpbnQgdG1wID0gMDsKKwkJdW5zaWduZWQgY2hhciB2YWw7CisKKwkJLyogCisJCSAqIFRoZSBtYXggd2UgY2FuIGRvIGlzIDgxOTJIei4KKwkJICovCisJCWlmICgoYXJnIDwgMikgfHwgKGFyZyA+IDgxOTIpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qCisJCSAqIFdlIGRvbid0IHJlYWxseSB3YW50IEpvZSBVc2VyIGdlbmVyYXRpbmcgbW9yZQorCQkgKiB0aGFuIDY0SHogb2YgaW50ZXJydXB0cyBvbiBhIG11bHRpLXVzZXIgbWFjaGluZS4KKwkJICovCisJCWlmICgha2VybmVsICYmIChhcmcgPiBydGNfbWF4X3VzZXJfZnJlcSkgJiYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCXdoaWxlIChhcmcgPiAoMTw8dG1wKSkKKwkJCXRtcCsrOworCisJCS8qCisJCSAqIENoZWNrIHRoYXQgdGhlIGlucHV0IHdhcyByZWFsbHkgYSBwb3dlciBvZiAyLgorCQkgKi8KKwkJaWYgKGFyZyAhPSAoMTw8dG1wKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJaWYgKGhwZXRfc2V0X3BlcmlvZGljX2ZyZXEoYXJnKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlydGNfZnJlcSA9IGFyZzsKKworCQl2YWwgPSBDTU9TX1JFQUQoUlRDX0ZSRVFfU0VMRUNUKSAmIDB4ZjA7CisJCXZhbCB8PSAoMTYgLSB0bXApOworCQlDTU9TX1dSSVRFKHZhbCwgUlRDX0ZSRVFfU0VMRUNUKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWNhc2UgUlRDX0VQT0NIX1JFQUQ6CS8qIFJlYWQgdGhlIGVwb2NoLgkqLworCXsKKwkJcmV0dXJuIHB1dF91c2VyIChlcG9jaCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKTsKKwl9CisJY2FzZSBSVENfRVBPQ0hfU0VUOgkvKiBTZXQgdGhlIGVwb2NoLgkqLworCXsKKwkJLyogCisJCSAqIFRoZXJlIHdlcmUgbm8gUlRDIGNsb2NrcyBiZWZvcmUgMTkwMC4KKwkJICovCisJCWlmIChhcmcgPCAxOTAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQllcG9jaCA9IGFyZzsKKwkJcmV0dXJuIDA7CisJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KKwlyZXR1cm4gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnd0aW1lLCBzaXplb2Ygd3RpbWUpID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgcnRjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBydGNfZG9faW9jdGwoY21kLCBhcmcsIDApOworfQorCisvKgorICoJV2UgZW5mb3JjZSBvbmx5IG9uZSB1c2VyIGF0IGEgdGltZSBoZXJlIHdpdGggdGhlIG9wZW4vY2xvc2UuCisgKglBbHNvIGNsZWFyIHRoZSBwcmV2aW91cyBpbnRlcnJ1cHQgZGF0YSBvbiBhbiBvcGVuLCBhbmQgY2xlYW4KKyAqCXVwIHRoaW5ncyBvbiBhIGNsb3NlLgorICovCisKKy8qIFdlIHVzZSBydGNfbG9jayB0byBwcm90ZWN0IGFnYWluc3QgY29uY3VycmVudCBvcGVucy4gU28gdGhlIEJLTCBpcyBub3QKKyAqIG5lZWRlZCBoZXJlLiBPciBhbnl3aGVyZSBlbHNlIGluIHRoaXMgZHJpdmVyLiAqLworc3RhdGljIGludCBydGNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzcGluX2xvY2tfaXJxICgmcnRjX2xvY2spOworCisJaWYocnRjX3N0YXR1cyAmIFJUQ19JU19PUEVOKQorCQlnb3RvIG91dF9idXN5OworCisJcnRjX3N0YXR1cyB8PSBSVENfSVNfT1BFTjsKKworCXJ0Y19pcnFfZGF0YSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxICgmcnRjX2xvY2spOworCXJldHVybiAwOworCitvdXRfYnVzeToKKwlzcGluX3VubG9ja19pcnEgKCZydGNfbG9jayk7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBydGNfZmFzeW5jIChpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCisKK3sKKwlyZXR1cm4gZmFzeW5jX2hlbHBlciAoZmQsIGZpbHAsIG9uLCAmcnRjX2FzeW5jX3F1ZXVlKTsKK30KKworc3RhdGljIGludCBydGNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyNpZmRlZiBSVENfSVJRCisJdW5zaWduZWQgY2hhciB0bXA7CisKKwlpZiAocnRjX2hhc19pcnEgPT0gMCkKKwkJZ290byBub19pcnE7CisKKwkvKgorCSAqIFR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIG9uY2UgdGhlIGRldmljZSBpcyBubyBsb25nZXIKKwkgKiBpbiB1c2UsIGFuZCBjbGVhciB0aGUgZGF0YS4KKwkgKi8KKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlpZiAoIWhwZXRfbWFza19ydGNfaXJxX2JpdChSVENfUElFIHwgUlRDX0FJRSB8IFJUQ19VSUUpKSB7CisJCXRtcCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJCXRtcCAmPSAgflJUQ19QSUU7CisJCXRtcCAmPSAgflJUQ19BSUU7CisJCXRtcCAmPSAgflJUQ19VSUU7CisJCUNNT1NfV1JJVEUodG1wLCBSVENfQ09OVFJPTCk7CisJCUNNT1NfUkVBRChSVENfSU5UUl9GTEFHUyk7CisJfQorCWlmIChydGNfc3RhdHVzICYgUlRDX1RJTUVSX09OKSB7CisJCXJ0Y19zdGF0dXMgJj0gflJUQ19USU1FUl9PTjsKKwkJZGVsX3RpbWVyKCZydGNfaXJxX3RpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIEZBU1lOQykgeworCQlydGNfZmFzeW5jICgtMSwgZmlsZSwgMCk7CisJfQorbm9faXJxOgorI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxICgmcnRjX2xvY2spOworCXJ0Y19pcnFfZGF0YSA9IDA7CisJcnRjX3N0YXR1cyAmPSB+UlRDX0lTX09QRU47CisJc3Bpbl91bmxvY2tfaXJxICgmcnRjX2xvY2spOworCXJldHVybiAwOworfQorCisjaWZkZWYgUlRDX0lSUQorLyogQ2FsbGVkIHdpdGhvdXQgdGhlIGtlcm5lbCBsb2NrIC0gZmluZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBydGNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwl1bnNpZ25lZCBsb25nIGw7CisKKwlpZiAocnRjX2hhc19pcnEgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlwb2xsX3dhaXQoZmlsZSwgJnJ0Y193YWl0LCB3YWl0KTsKKworCXNwaW5fbG9ja19pcnEgKCZydGNfbG9jayk7CisJbCA9IHJ0Y19pcnFfZGF0YTsKKwlzcGluX3VubG9ja19pcnEgKCZydGNfbG9jayk7CisKKwlpZiAobCAhPSAwKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogZXhwb3J0ZWQgc3R1ZmZzCisgKi8KKworRVhQT1JUX1NZTUJPTChydGNfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChydGNfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKHJ0Y19jb250cm9sKTsKKworaW50IHJ0Y19yZWdpc3RlcihydGNfdGFza190ICp0YXNrKQoreworI2lmbmRlZiBSVENfSVJRCisJcmV0dXJuIC1FSU87CisjZWxzZQorCWlmICh0YXNrID09IE5VTEwgfHwgdGFzay0+ZnVuYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJaWYgKHJ0Y19zdGF0dXMgJiBSVENfSVNfT1BFTikgeworCQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJc3Bpbl9sb2NrKCZydGNfdGFza19sb2NrKTsKKwlpZiAocnRjX2NhbGxiYWNrKSB7CisJCXNwaW5fdW5sb2NrKCZydGNfdGFza19sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXJ0Y19zdGF0dXMgfD0gUlRDX0lTX09QRU47CisJcnRjX2NhbGxiYWNrID0gdGFzazsKKwlzcGluX3VubG9jaygmcnRjX3Rhc2tfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworaW50IHJ0Y191bnJlZ2lzdGVyKHJ0Y190YXNrX3QgKnRhc2spCit7CisjaWZuZGVmIFJUQ19JUlEKKwlyZXR1cm4gLUVJTzsKKyNlbHNlCisJdW5zaWduZWQgY2hhciB0bXA7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJc3Bpbl9sb2NrKCZydGNfdGFza19sb2NrKTsKKwlpZiAocnRjX2NhbGxiYWNrICE9IHRhc2spIHsKKwkJc3Bpbl91bmxvY2soJnJ0Y190YXNrX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJcnRjX2NhbGxiYWNrID0gTlVMTDsKKwkKKwkvKiBkaXNhYmxlIGNvbnRyb2xzICovCisJaWYgKCFocGV0X21hc2tfcnRjX2lycV9iaXQoUlRDX1BJRSB8IFJUQ19BSUUgfCBSVENfVUlFKSkgeworCQl0bXAgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOworCQl0bXAgJj0gflJUQ19QSUU7CisJCXRtcCAmPSB+UlRDX0FJRTsKKwkJdG1wICY9IH5SVENfVUlFOworCQlDTU9TX1dSSVRFKHRtcCwgUlRDX0NPTlRST0wpOworCQlDTU9TX1JFQUQoUlRDX0lOVFJfRkxBR1MpOworCX0KKwlpZiAocnRjX3N0YXR1cyAmIFJUQ19USU1FUl9PTikgeworCQlydGNfc3RhdHVzICY9IH5SVENfVElNRVJfT047CisJCWRlbF90aW1lcigmcnRjX2lycV90aW1lcik7CisJfQorCXJ0Y19zdGF0dXMgJj0gflJUQ19JU19PUEVOOworCXNwaW5fdW5sb2NrKCZydGNfdGFza19sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbnQgcnRjX2NvbnRyb2wocnRjX3Rhc2tfdCAqdGFzaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisjaWZuZGVmIFJUQ19JUlEKKwlyZXR1cm4gLUVJTzsKKyNlbHNlCisJc3Bpbl9sb2NrX2lycSgmcnRjX3Rhc2tfbG9jayk7CisJaWYgKHJ0Y19jYWxsYmFjayAhPSB0YXNrKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX3Rhc2tfbG9jayk7CisJCXJldHVybiAtRU5YSU87CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcnRjX3Rhc2tfbG9jayk7CisJcmV0dXJuIHJ0Y19kb19pb2N0bChjbWQsIGFyZywgMSk7CisjZW5kaWYKK30KKworCisvKgorICoJVGhlIHZhcmlvdXMgZmlsZSBvcGVyYXRpb25zIHdlIHN1cHBvcnQuCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHJ0Y19yZWFkLAorI2lmZGVmIFJUQ19JUlEKKwkucG9sbAkJPSBydGNfcG9sbCwKKyNlbmRpZgorCS5pb2N0bAkJPSBydGNfaW9jdGwsCisJLm9wZW4JCT0gcnRjX29wZW4sCisJLnJlbGVhc2UJPSBydGNfcmVsZWFzZSwKKwkuZmFzeW5jCQk9IHJ0Y19mYXN5bmMsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgcnRjX2RldiA9IHsKKwkubWlub3IJCT0gUlRDX01JTk9SLAorCS5uYW1lCQk9ICJydGMiLAorCS5mb3BzCQk9ICZydGNfZm9wcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ0Y19wcm9jX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBydGNfcHJvY19vcGVuLAorCS5yZWFkICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKyNpZiBkZWZpbmVkKFJUQ19JUlEpICYmICFkZWZpbmVkKF9fc3BhcmNfXykKK3N0YXRpYyBpcnFyZXR1cm5fdCAoKnJ0Y19pbnRfaGFuZGxlcl9wdHIpKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IHJ0Y19pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19taXBzX18pCisJdW5zaWduZWQgaW50IHllYXIsIGN0cmw7CisJdW5zaWduZWQgbG9uZyB1aXBfd2F0Y2hkb2c7CisJY2hhciAqZ3Vlc3MgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgX19zcGFyY19fCisJc3RydWN0IGxpbnV4X2VidXMgKmVidXM7CisJc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2OworI2lmZGVmIF9fc3BhcmNfdjlfXworCXN0cnVjdCBzcGFyY19pc2FfYnJpZGdlICppc2FfYnI7CisJc3RydWN0IHNwYXJjX2lzYV9kZXZpY2UgKmlzYV9kZXY7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19zcGFyY19fCisJZm9yX2VhY2hfZWJ1cyhlYnVzKSB7CisJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgeworCQkJaWYoc3RyY21wKGVkZXYtPnByb21fbmFtZSwgInJ0YyIpID09IDApIHsKKwkJCQlydGNfcG9ydCA9IGVkZXYtPnJlc291cmNlWzBdLnN0YXJ0OworCQkJCXJ0Y19pcnEgPSBlZGV2LT5pcnFzWzBdOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwl9CisjaWZkZWYgX19zcGFyY192OV9fCisJZm9yX2VhY2hfaXNhKGlzYV9icikgeworCQlmb3JfZWFjaF9pc2FkZXYoaXNhX2RldiwgaXNhX2JyKSB7CisJCQlpZiAoc3RyY21wKGlzYV9kZXYtPnByb21fbmFtZSwgInJ0YyIpID09IDApIHsKKwkJCQlydGNfcG9ydCA9IGlzYV9kZXYtPnJlc291cmNlLnN0YXJ0OworCQkJCXJ0Y19pcnEgPSBpc2FfZGV2LT5pcnE7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCXByaW50ayhLRVJOX0VSUiAicnRjX2luaXQ6IG5vIFBDIHJ0YyBmb3VuZFxuIik7CisJcmV0dXJuIC1FSU87CisKK2ZvdW5kOgorCWlmIChydGNfaXJxID09IFBDSV9JUlFfTk9ORSkgeworCQlydGNfaGFzX2lycSA9IDA7CisJCWdvdG8gbm9faXJxOworCX0KKworCS8qCisJICogWFhYIEludGVycnVwdCBwaW4gIzcgaW4gRXNwcmVzc28gaXMgc2hhcmVkIGJldHdlZW4gUlRDIGFuZAorCSAqIFBDSSBTbG90IDIgSU5UQSMgKGFuZCBzb21lIElOVHgjIGluIFNsb3QgMSkuIFNBX0lOVEVSUlVQVCBoZXJlCisJICogaXMgYXNraW5nIGZvciB0cm91YmxlIHdpdGggYWRkLW9uIGJvYXJkcy4gQ2hhbmdlIHRvIFNBX1NISVJRLgorCSAqLworCWlmIChyZXF1ZXN0X2lycShydGNfaXJxLCBydGNfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsICJydGMiLCAodm9pZCAqKSZydGNfcG9ydCkpIHsKKwkJLyoKKwkJICogU3RhbmRhcmQgd2F5IGZvciBzcGFyYyB0byBwcmludCBpcnEncyBpcyB0byB1c2UKKwkJICogX19pcnFfaXRvYSgpLiBJIHRoaW5rIGZvciBFQnVzIGl0J3Mgb2sgdG8gdXNlICVkLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJydGM6IGNhbm5vdCByZWdpc3RlciBJUlEgJWRcbiIsIHJ0Y19pcnEpOworCQlyZXR1cm4gLUVJTzsKKwl9Citub19pcnE6CisjZWxzZQorCWlmICghcmVxdWVzdF9yZWdpb24oUlRDX1BPUlQoMCksIFJUQ19JT19FWFRFTlQsICJydGMiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInJ0YzogSS9PIHBvcnQgJWQgaXMgbm90IGZyZWUuXG4iLCBSVENfUE9SVCAoMCkpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKyNpZmRlZiBSVENfSVJRCisJaWYgKGlzX2hwZXRfZW5hYmxlZCgpKSB7CisJCXJ0Y19pbnRfaGFuZGxlcl9wdHIgPSBocGV0X3J0Y19pbnRlcnJ1cHQ7CisJfSBlbHNlIHsKKwkJcnRjX2ludF9oYW5kbGVyX3B0ciA9IHJ0Y19pbnRlcnJ1cHQ7CisJfQorCisJaWYocmVxdWVzdF9pcnEoUlRDX0lSUSwgcnRjX2ludF9oYW5kbGVyX3B0ciwgU0FfSU5URVJSVVBULCAicnRjIiwgTlVMTCkpIHsKKwkJLyogWWVhaCByaWdodCwgc2VlaW5nIGFzIGlycSA4IGRvZXNuJ3QgZXZlbiBoaXQgdGhlIGJ1cy4gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJydGM6IElSUSAlZCBpcyBub3QgZnJlZS5cbiIsIFJUQ19JUlEpOworCQlyZWxlYXNlX3JlZ2lvbihSVENfUE9SVCgwKSwgUlRDX0lPX0VYVEVOVCk7CisJCXJldHVybiAtRUlPOworCX0KKwlocGV0X3J0Y190aW1lcl9pbml0KCk7CisKKyNlbmRpZgorCisjZW5kaWYgLyogX19zcGFyY19fIHZzLiBvdGhlcnMgKi8KKworCWlmIChtaXNjX3JlZ2lzdGVyKCZydGNfZGV2KSkgeworI2lmZGVmIFJUQ19JUlEKKwkJZnJlZV9pcnEoUlRDX0lSUSwgTlVMTCk7CisjZW5kaWYKKwkJcmVsZWFzZV9yZWdpb24oUlRDX1BPUlQoMCksIFJUQ19JT19FWFRFTlQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllbnQgPSBjcmVhdGVfcHJvY19lbnRyeSgiZHJpdmVyL3J0YyIsIDAsIE5VTEwpOworCWlmICghZW50KSB7CisjaWZkZWYgUlRDX0lSUQorCQlmcmVlX2lycShSVENfSVJRLCBOVUxMKTsKKyNlbmRpZgorCQlyZWxlYXNlX3JlZ2lvbihSVENfUE9SVCgwKSwgUlRDX0lPX0VYVEVOVCk7CisJCW1pc2NfZGVyZWdpc3RlcigmcnRjX2Rldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwllbnQtPnByb2NfZm9wcyA9ICZydGNfcHJvY19mb3BzOworCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19taXBzX18pCisJcnRjX2ZyZXEgPSBIWjsKKwkKKwkvKiBFYWNoIG9wZXJhdGluZyBzeXN0ZW0gb24gYW4gQWxwaGEgdXNlcyBpdHMgb3duIGVwb2NoLgorCSAgIExldCdzIHRyeSB0byBndWVzcyB3aGljaCBvbmUgd2UgYXJlIHVzaW5nIG5vdy4gKi8KKwkKKwl1aXBfd2F0Y2hkb2cgPSBqaWZmaWVzOworCWlmIChydGNfaXNfdXBkYXRpbmcoKSAhPSAwKQorCQl3aGlsZSAoamlmZmllcyAtIHVpcF93YXRjaGRvZyA8IDIqSFovMTAwKSB7IAorCQkJYmFycmllcigpOworCQkJY3B1X3JlbGF4KCk7CisJCX0KKwkKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJeWVhciA9IENNT1NfUkVBRChSVENfWUVBUik7CisJY3RybCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCisJaWYgKCEoY3RybCAmIFJUQ19ETV9CSU5BUlkpIHx8IFJUQ19BTFdBWVNfQkNEKQorCQlCQ0RfVE9fQklOKHllYXIpOyAgICAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uLi4gKi8KKwkKKwlpZiAoeWVhciA8IDIwKSB7CisJCWVwb2NoID0gMjAwMDsKKwkJZ3Vlc3MgPSAiU1JNIChwb3N0LTIwMDApIjsKKwl9IGVsc2UgaWYgKHllYXIgPj0gMjAgJiYgeWVhciA8IDQ4KSB7CisJCWVwb2NoID0gMTk4MDsKKwkJZ3Vlc3MgPSAiQVJDIGNvbnNvbGUiOworCX0gZWxzZSBpZiAoeWVhciA+PSA0OCAmJiB5ZWFyIDwgNzIpIHsKKwkJZXBvY2ggPSAxOTUyOworCQlndWVzcyA9ICJEaWdpdGFsIFVOSVgiOworI2lmIGRlZmluZWQoX19taXBzX18pCisJfSBlbHNlIGlmICh5ZWFyID49IDcyICYmIHllYXIgPCA3NCkgeworCQllcG9jaCA9IDIwMDA7CisJCWd1ZXNzID0gIkRpZ2l0YWwgREVDc3RhdGlvbiI7CisjZWxzZQorCX0gZWxzZSBpZiAoeWVhciA+PSA3MCkgeworCQllcG9jaCA9IDE5MDA7CisJCWd1ZXNzID0gIlN0YW5kYXJkIFBDICgxOTAwKSI7CisjZW5kaWYKKwl9CisJaWYgKGd1ZXNzKQorCQlwcmludGsoS0VSTl9JTkZPICJydGM6ICVzIGVwb2NoICglbHUpIGRldGVjdGVkXG4iLCBndWVzcywgZXBvY2gpOworI2VuZGlmCisjaWZkZWYgUlRDX0lSUQorCWlmIChydGNfaGFzX2lycSA9PSAwKQorCQlnb3RvIG5vX2lycTI7CisKKwlpbml0X3RpbWVyKCZydGNfaXJxX3RpbWVyKTsKKwlydGNfaXJxX3RpbWVyLmZ1bmN0aW9uID0gcnRjX2Ryb3BwZWRfaXJxOworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlydGNfZnJlcSA9IDEwMjQ7CisJaWYgKCFocGV0X3NldF9wZXJpb2RpY19mcmVxKHJ0Y19mcmVxKSkgeworCQkvKiBJbml0aWFsaXplIHBlcmlvZGljIGZyZXEuIHRvIENNT1MgcmVzZXQgZGVmYXVsdCwgd2hpY2ggaXMgMTAyNEh6ICovCisJCUNNT1NfV1JJVEUoKChDTU9TX1JFQUQoUlRDX0ZSRVFfU0VMRUNUKSAmIDB4RjApIHwgMHgwNiksIFJUQ19GUkVRX1NFTEVDVCk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworbm9faXJxMjoKKyNlbmRpZgorCisJKHZvaWQpIGluaXRfc3lzY3RsKCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJSZWFsIFRpbWUgQ2xvY2sgRHJpdmVyIHYiIFJUQ19WRVJTSU9OICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBydGNfZXhpdCAodm9pZCkKK3sKKwljbGVhbnVwX3N5c2N0bCgpOworCXJlbW92ZV9wcm9jX2VudHJ5ICgiZHJpdmVyL3J0YyIsIE5VTEwpOworCW1pc2NfZGVyZWdpc3RlcigmcnRjX2Rldik7CisKKyNpZmRlZiBfX3NwYXJjX18KKwlpZiAocnRjX2hhc19pcnEpCisJCWZyZWVfaXJxIChydGNfaXJxLCAmcnRjX3BvcnQpOworI2Vsc2UKKwlyZWxlYXNlX3JlZ2lvbiAoUlRDX1BPUlQgKDApLCBSVENfSU9fRVhURU5UKTsKKyNpZmRlZiBSVENfSVJRCisJaWYgKHJ0Y19oYXNfaXJxKQorCQlmcmVlX2lycSAoUlRDX0lSUSwgTlVMTCk7CisjZW5kaWYKKyNlbmRpZiAvKiBfX3NwYXJjX18gKi8KK30KKworbW9kdWxlX2luaXQocnRjX2luaXQpOworbW9kdWxlX2V4aXQocnRjX2V4aXQpOworCisjaWZkZWYgUlRDX0lSUQorLyoKKyAqIAlBdCBJUlEgcmF0ZXMgPj0gNDA5Nkh6LCBhbiBpbnRlcnJ1cHQgbWF5IGdldCBsb3N0IGFsdG9nZXRoZXIuCisgKgkodXN1YWxseSBkdXJpbmcgYW4gSURFIGRpc2sgaW50ZXJydXB0LCB3aXRoIElSUSB1bm1hc2tpbmcgb2ZmKQorICoJU2luY2UgdGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXNuJ3QgZ2V0IGNhbGxlZCwgdGhlIElSUSBzdGF0dXMKKyAqCWJ5dGUgZG9lc24ndCBnZXQgcmVhZCwgYW5kIHRoZSBSVEMgc3RvcHMgZ2VuZXJhdGluZyBpbnRlcnJ1cHRzLgorICoJQSB0aW1lciBpcyBzZXQsIGFuZCB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBpZi93aGVuIHRoYXQgaGFwcGVucy4KKyAqCVRvIGdldCBpdCBvdXQgb2YgdGhpcyBzdGFsbGVkIHN0YXRlLCB3ZSBqdXN0IHJlYWQgdGhlIHN0YXR1cy4KKyAqCUF0IGxlYXN0IGEgamlmZnkgb2YgaW50ZXJydXB0cyAocnRjX2ZyZXEvSFopIHdpbGwgaGF2ZSBiZWVuIGxvc3QuCisgKgkoWW91ICpyZWFsbHkqIHNob3VsZG4ndCBiZSB0cnlpbmcgdG8gdXNlIGEgbm9uLXJlYWx0aW1lIHN5c3RlbSAKKyAqCWZvciBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBhIHN0ZWFkeSA+IDFLSHogc2lnbmFsIGFueXdheXMuKQorICovCisKK3N0YXRpYyB2b2lkIHJ0Y19kcm9wcGVkX2lycSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmcmVxOworCisJc3Bpbl9sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKworCWlmIChocGV0X3J0Y19kcm9wcGVkX2lycSgpKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm47CisJfQorCisJLyogSnVzdCBpbiBjYXNlIHNvbWVvbmUgZGlzYWJsZWQgdGhlIHRpbWVyIGZyb20gYmVoaW5kIG91ciBiYWNrLi4uICovCisJaWYgKHJ0Y19zdGF0dXMgJiBSVENfVElNRVJfT04pCisJCW1vZF90aW1lcigmcnRjX2lycV90aW1lciwgamlmZmllcyArIEhaL3J0Y19mcmVxICsgMipIWi8xMDApOworCisJcnRjX2lycV9kYXRhICs9ICgocnRjX2ZyZXEvSFopPDw4KTsKKwlydGNfaXJxX2RhdGEgJj0gfjB4ZmY7CisJcnRjX2lycV9kYXRhIHw9IChDTU9TX1JFQUQoUlRDX0lOVFJfRkxBR1MpICYgMHhGMCk7CS8qIHJlc3RhcnQgKi8KKworCWZyZXEgPSBydGNfZnJlcTsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAicnRjOiBsb3N0IHNvbWUgaW50ZXJydXB0cyBhdCAlbGRIei5cbiIsIGZyZXEpOworCisJLyogTm93IHdlIGhhdmUgbmV3IGRhdGEgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJ0Y193YWl0KTsKKworCWtpbGxfZmFzeW5jICgmcnRjX2FzeW5jX3F1ZXVlLCBTSUdJTywgUE9MTF9JTik7Cit9CisjZW5kaWYKKworLyoKKyAqCUluZm8gZXhwb3J0ZWQgdmlhICIvcHJvYy9kcml2ZXIvcnRjIi4KKyAqLworCitzdGF0aWMgaW50IHJ0Y19wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisjZGVmaW5lIFlOKGJpdCkgKChjdHJsICYgYml0KSA/ICJ5ZXMiIDogIm5vIikKKyNkZWZpbmUgTlkoYml0KSAoKGN0cmwgJiBiaXQpID8gIm5vIiA6ICJ5ZXMiKQorCXN0cnVjdCBydGNfdGltZSB0bTsKKwl1bnNpZ25lZCBjaGFyIGJhdHQsIGN0cmw7CisJdW5zaWduZWQgbG9uZyBmcmVxOworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCWJhdHQgPSBDTU9TX1JFQUQoUlRDX1ZBTElEKSAmIFJUQ19WUlQ7CisJY3RybCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJZnJlcSA9IHJ0Y19mcmVxOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisKKwlydGNfZ2V0X3J0Y190aW1lKCZ0bSk7CisKKwkvKgorCSAqIFRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIGlmIHRoZSBsdXNlciBoYXMgdGhlIFJUQyBzZXQgZm9yIGxvY2FsCisJICogdGltZSBvciBmb3IgVW5pdmVyc2FsIFN0YW5kYXJkIFRpbWUgKEdNVCkuIFByb2JhYmx5IGxvY2FsIHRob3VnaC4KKwkgKi8KKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgInJ0Y190aW1lXHQ6ICUwMmQ6JTAyZDolMDJkXG4iCisJCSAgICJydGNfZGF0ZVx0OiAlMDRkLSUwMmQtJTAyZFxuIgorCQkgICAicnRjX2Vwb2NoXHQ6ICUwNGx1XG4iLAorCQkgICB0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYywKKwkJICAgdG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiArIDEsIHRtLnRtX21kYXksIGVwb2NoKTsKKworCWdldF9ydGNfYWxtX3RpbWUoJnRtKTsKKworCS8qCisJICogV2UgaW1wbGljaXRseSBhc3N1bWUgMjRociBtb2RlIGhlcmUuIEFsYXJtIHZhbHVlcyA+PSAweGMwIHdpbGwKKwkgKiBtYXRjaCBhbnkgdmFsdWUgZm9yIHRoYXQgcGFydGljdWxhciBmaWVsZC4gVmFsdWVzIHRoYXQgYXJlCisJICogZ3JlYXRlciB0aGFuIGEgdmFsaWQgdGltZSwgYnV0IGxlc3MgdGhhbiAweGMwIHNob3VsZG4ndCBhcHBlYXIuCisJICovCisJc2VxX3B1dHMoc2VxLCAiYWxhcm1cdFx0OiAiKTsKKwlpZiAodG0udG1faG91ciA8PSAyNCkKKwkJc2VxX3ByaW50ZihzZXEsICIlMDJkOiIsIHRtLnRtX2hvdXIpOworCWVsc2UKKwkJc2VxX3B1dHMoc2VxLCAiKio6Iik7CisKKwlpZiAodG0udG1fbWluIDw9IDU5KQorCQlzZXFfcHJpbnRmKHNlcSwgIiUwMmQ6IiwgdG0udG1fbWluKTsKKwllbHNlCisJCXNlcV9wdXRzKHNlcSwgIioqOiIpOworCisJaWYgKHRtLnRtX3NlYyA8PSA1OSkKKwkJc2VxX3ByaW50ZihzZXEsICIlMDJkXG4iLCB0bS50bV9zZWMpOworCWVsc2UKKwkJc2VxX3B1dHMoc2VxLCAiKipcbiIpOworCisJc2VxX3ByaW50ZihzZXEsCisJCSAgICJEU1RfZW5hYmxlXHQ6ICVzXG4iCisJCSAgICJCQ0RcdFx0OiAlc1xuIgorCQkgICAiMjRoclx0XHQ6ICVzXG4iCisJCSAgICJzcXVhcmVfd2F2ZVx0OiAlc1xuIgorCQkgICAiYWxhcm1fSVJRXHQ6ICVzXG4iCisJCSAgICJ1cGRhdGVfSVJRXHQ6ICVzXG4iCisJCSAgICJwZXJpb2RpY19JUlFcdDogJXNcbiIKKwkJICAgInBlcmlvZGljX2ZyZXFcdDogJWxkXG4iCisJCSAgICJiYXR0X3N0YXR1c1x0OiAlc1xuIiwKKwkJICAgWU4oUlRDX0RTVF9FTiksCisJCSAgIE5ZKFJUQ19ETV9CSU5BUlkpLAorCQkgICBZTihSVENfMjRIKSwKKwkJICAgWU4oUlRDX1NRV0UpLAorCQkgICBZTihSVENfQUlFKSwKKwkJICAgWU4oUlRDX1VJRSksCisJCSAgIFlOKFJUQ19QSUUpLAorCQkgICBmcmVxLAorCQkgICBiYXR0ID8gIm9rYXkiIDogImRlYWQiKTsKKworCXJldHVybiAgMDsKKyN1bmRlZiBZTgorI3VuZGVmIE5ZCit9CisKK3N0YXRpYyBpbnQgcnRjX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcnRjX3Byb2Nfc2hvdywgTlVMTCk7Cit9CisKK3ZvaWQgcnRjX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSkKK3sKKwl1bnNpZ25lZCBsb25nIHVpcF93YXRjaGRvZyA9IGppZmZpZXM7CisJdW5zaWduZWQgY2hhciBjdHJsOworI2lmZGVmIENPTkZJR19NQUNIX0RFQ1NUQVRJT04KKwl1bnNpZ25lZCBpbnQgcmVhbF95ZWFyOworI2VuZGlmCisKKwkvKgorCSAqIHJlYWQgUlRDIG9uY2UgYW55IHVwZGF0ZSBpbiBwcm9ncmVzcyBpcyBkb25lLiBUaGUgdXBkYXRlCisJICogY2FuIHRha2UganVzdCBvdmVyIDJtcy4gV2Ugd2FpdCAxMCB0byAyMG1zLiBUaGVyZSBpcyBubyBuZWVkIHRvCisJICogdG8gcG9sbC13YWl0ICh1cCB0byAxcyAtIGVlY2NjaCkgZm9yIHRoZSBmYWxsaW5nIGVkZ2Ugb2YgUlRDX1VJUC4KKwkgKiBJZiB5b3UgbmVlZCB0byBrbm93ICpleGFjdGx5KiB3aGVuIGEgc2Vjb25kIGhhcyBzdGFydGVkLCBlbmFibGUKKwkgKiBwZXJpb2RpYyB1cGRhdGUgY29tcGxldGUgaW50ZXJydXB0cywgKHZpYSBpb2N0bCkgYW5kIHRoZW4gCisJICogaW1tZWRpYXRlbHkgcmVhZCAvZGV2L3J0YyB3aGljaCB3aWxsIGJsb2NrIHVudGlsIHlvdSBnZXQgdGhlIElSUS4KKwkgKiBPbmNlIHRoZSByZWFkIGNsZWFycywgcmVhZCB0aGUgUlRDIHRpbWUgKGFnYWluIHZpYSBpb2N0bCkuIEVhc3kuCisJICovCisKKwlpZiAocnRjX2lzX3VwZGF0aW5nKCkgIT0gMCkKKwkJd2hpbGUgKGppZmZpZXMgLSB1aXBfd2F0Y2hkb2cgPCAyKkhaLzEwMCkgeworCQkJYmFycmllcigpOworCQkJY3B1X3JlbGF4KCk7CisJCX0KKworCS8qCisJICogT25seSB0aGUgdmFsdWVzIHRoYXQgd2UgcmVhZCBmcm9tIHRoZSBSVEMgYXJlIHNldC4gV2UgbGVhdmUKKwkgKiB0bV93ZGF5LCB0bV95ZGF5IGFuZCB0bV9pc2RzdCB1bnRvdWNoZWQuIEV2ZW4gdGhvdWdoIHRoZQorCSAqIFJUQyBoYXMgUlRDX0RBWV9PRl9XRUVLLCB3ZSBpZ25vcmUgaXQsIGFzIGl0IGlzIG9ubHkgdXBkYXRlZAorCSAqIGJ5IHRoZSBSVEMgd2hlbiBpbml0aWFsbHkgc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUuCisJICovCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCXJ0Y190bS0+dG1fc2VjID0gQ01PU19SRUFEKFJUQ19TRUNPTkRTKTsKKwlydGNfdG0tPnRtX21pbiA9IENNT1NfUkVBRChSVENfTUlOVVRFUyk7CisJcnRjX3RtLT50bV9ob3VyID0gQ01PU19SRUFEKFJUQ19IT1VSUyk7CisJcnRjX3RtLT50bV9tZGF5ID0gQ01PU19SRUFEKFJUQ19EQVlfT0ZfTU9OVEgpOworCXJ0Y190bS0+dG1fbW9uID0gQ01PU19SRUFEKFJUQ19NT05USCk7CisJcnRjX3RtLT50bV95ZWFyID0gQ01PU19SRUFEKFJUQ19ZRUFSKTsKKyNpZmRlZiBDT05GSUdfTUFDSF9ERUNTVEFUSU9OCisJcmVhbF95ZWFyID0gQ01PU19SRUFEKFJUQ19ERUNfWUVBUik7CisjZW5kaWYKKwljdHJsID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWlmICghKGN0cmwgJiBSVENfRE1fQklOQVJZKSB8fCBSVENfQUxXQVlTX0JDRCkKKwl7CisJCUJDRF9UT19CSU4ocnRjX3RtLT50bV9zZWMpOworCQlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbWluKTsKKwkJQkNEX1RPX0JJTihydGNfdG0tPnRtX2hvdXIpOworCQlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbWRheSk7CisJCUJDRF9UT19CSU4ocnRjX3RtLT50bV9tb24pOworCQlCQ0RfVE9fQklOKHJ0Y190bS0+dG1feWVhcik7CisJfQorCisjaWZkZWYgQ09ORklHX01BQ0hfREVDU1RBVElPTgorCXJ0Y190bS0+dG1feWVhciArPSByZWFsX3llYXIgLSA3MjsKKyNlbmRpZgorCisJLyoKKwkgKiBBY2NvdW50IGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGhvdyB0aGUgUlRDIHVzZXMgdGhlIHZhbHVlcworCSAqIGFuZCBob3cgdGhleSBhcmUgZGVmaW5lZCBpbiBhIHN0cnVjdCBydGNfdGltZTsKKwkgKi8KKwlpZiAoKHJ0Y190bS0+dG1feWVhciArPSAoZXBvY2ggLSAxOTAwKSkgPD0gNjkpCisJCXJ0Y190bS0+dG1feWVhciArPSAxMDA7CisKKwlydGNfdG0tPnRtX21vbi0tOworfQorCitzdGF0aWMgdm9pZCBnZXRfcnRjX2FsbV90aW1lKHN0cnVjdCBydGNfdGltZSAqYWxtX3RtKQoreworCXVuc2lnbmVkIGNoYXIgY3RybDsKKworCS8qCisJICogT25seSB0aGUgdmFsdWVzIHRoYXQgd2UgcmVhZCBmcm9tIHRoZSBSVEMgYXJlIHNldC4gVGhhdAorCSAqIG1lYW5zIG9ubHkgdG1faG91ciwgdG1fbWluLCBhbmQgdG1fc2VjLgorCSAqLworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlhbG1fdG0tPnRtX3NlYyA9IENNT1NfUkVBRChSVENfU0VDT05EU19BTEFSTSk7CisJYWxtX3RtLT50bV9taW4gPSBDTU9TX1JFQUQoUlRDX01JTlVURVNfQUxBUk0pOworCWFsbV90bS0+dG1faG91ciA9IENNT1NfUkVBRChSVENfSE9VUlNfQUxBUk0pOworCWN0cmwgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJaWYgKCEoY3RybCAmIFJUQ19ETV9CSU5BUlkpIHx8IFJUQ19BTFdBWVNfQkNEKQorCXsKKwkJQkNEX1RPX0JJTihhbG1fdG0tPnRtX3NlYyk7CisJCUJDRF9UT19CSU4oYWxtX3RtLT50bV9taW4pOworCQlCQ0RfVE9fQklOKGFsbV90bS0+dG1faG91cik7CisJfQorfQorCisjaWZkZWYgUlRDX0lSUQorLyoKKyAqIFVzZWQgdG8gZGlzYWJsZS9lbmFibGUgaW50ZXJydXB0cyBmb3IgYW55IG9uZSBvZiBVSUUsIEFJRSwgUElFLgorICogUnVtb3VyIGhhcyBpdCB0aGF0IGlmIHlvdSBmcm9iIHRoZSBpbnRlcnJ1cHQgZW5hYmxlL2Rpc2FibGUKKyAqIGJpdHMgaW4gUlRDX0NPTlRST0wsIHlvdSBzaG91bGQgcmVhZCBSVENfSU5UUl9GTEFHUywgdG8KKyAqIGVuc3VyZSB5b3UgYWN0dWFsbHkgc3RhcnQgZ2V0dGluZyBpbnRlcnJ1cHRzLiBQcm9iYWJseSBmb3IKKyAqIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlci9icm9rZW4gY2hpcHNldCBSVEMgaW1wbGVtZW50YXRpb25zLgorICogV2UgYWxzbyBjbGVhciBvdXQgYW55IG9sZCBpcnEgZGF0YSBhZnRlciBhbiBpb2N0bCgpIHRoYXQKKyAqIG1lZGRsZXMgd2l0aCB0aGUgaW50ZXJydXB0IGVuYWJsZS9kaXNhYmxlIGJpdHMuCisgKi8KKworc3RhdGljIHZvaWQgbWFza19ydGNfaXJxX2JpdCh1bnNpZ25lZCBjaGFyIGJpdCkKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlpZiAoaHBldF9tYXNrX3J0Y19pcnFfYml0KGJpdCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCXJldHVybjsKKwl9CisJdmFsID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsKKwl2YWwgJj0gIH5iaXQ7CisJQ01PU19XUklURSh2YWwsIFJUQ19DT05UUk9MKTsKKwlDTU9TX1JFQUQoUlRDX0lOVFJfRkxBR1MpOworCisJcnRjX2lycV9kYXRhID0gMDsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3J0Y19pcnFfYml0KHVuc2lnbmVkIGNoYXIgYml0KQoreworCXVuc2lnbmVkIGNoYXIgdmFsOworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCWlmIChocGV0X3NldF9ydGNfaXJxX2JpdChiaXQpKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm47CisJfQorCXZhbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJdmFsIHw9IGJpdDsKKwlDTU9TX1dSSVRFKHZhbCwgUlRDX0NPTlRST0wpOworCUNNT1NfUkVBRChSVENfSU5UUl9GTEFHUyk7CisKKwlydGNfaXJxX2RhdGEgPSAwOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworfQorI2VuZGlmCisKK01PRFVMRV9BVVRIT1IoIlBhdWwgR29ydG1ha2VyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihSVENfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3MzYzI0MTAtcnRjLmMgYi9kcml2ZXJzL2NoYXIvczNjMjQxMC1ydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzY2NjM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3MzYzI0MTAtcnRjLmMKQEAgLTAsMCArMSw1ODggQEAKKy8qIGRyaXZlcnMvY2hhci9zM2MyNDEwX3J0Yy5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljcyA8bGludXhAc2ltdGVjLmNvLnVrPgorICoJCSAgICAgIGh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL1NXTElOVVgvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBTM0MyNDEwIEludGVybmFsIFJUQyBEcml2ZXIKKyAqCisgKiAgQ2hhbmdlbG9nOgorICoJMDgtTm92LTIwMDQJQkpECUluaXRpYWwgY3JlYXRpb24KKyAqCTEyLU5vdi0yMDA0CUJKRAlBZGRlZCBwZXJpb2RpYyBJUlEgYW5kIFBNIGNvZGUKKyAqCTIyLU5vdi0yMDA0CUJKRAlTaWduLXRlc3Qgb24gYWxhcm0gY29kZSB0byBjaGVjayBmb3IgPDAKKyAqCTEwLU1hci0yMDA1CUxDVlIJQ2hhbmdlZCBTM0MyNDEwX1ZBX1JUQyB0byBTM0MyNFhYX1ZBX1JUQworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3J0Yy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ydGMuaD4KKworLyogbmVlZCB0aGlzIGZvciB0aGUgUlRDX0FGIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKworI3VuZGVmIFMzQzI0WFhfVkFfUlRDCisjZGVmaW5lIFMzQzI0WFhfVkFfUlRDIHMzYzI0MTBfcnRjX2Jhc2UKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqczNjMjQxMF9ydGNfbWVtOworCitzdGF0aWMgdm9pZCBfX2lvbWVtICpzM2MyNDEwX3J0Y19iYXNlOworc3RhdGljIGludCBzM2MyNDEwX3J0Y19hbGFybW5vID0gTk9fSVJROworc3RhdGljIGludCBzM2MyNDEwX3J0Y190aWNrbm8gID0gTk9fSVJROworc3RhdGljIGludCBzM2MyNDEwX3J0Y19mcmVxICAgID0gMTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhzM2MyNDEwX3J0Y19waWVfbG9jayk7CisKKy8qIElSUSBIYW5kbGVycyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgczNjMjQxMF9ydGNfYWxhcm1pcnEoaW50IGlycSwgdm9pZCAqaWQsIHN0cnVjdCBwdF9yZWdzICpyKQoreworCXJ0Y191cGRhdGUoMSwgUlRDX0FGIHwgUlRDX0lSUUYpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHMzYzI0MTBfcnRjX3RpY2tpcnEoaW50IGlycSwgdm9pZCAqaWQsIHN0cnVjdCBwdF9yZWdzICpyKQoreworCXJ0Y191cGRhdGUoMSwgUlRDX1BGIHwgUlRDX0lSUUYpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogVXBkYXRlIGNvbnRyb2wgcmVnaXN0ZXJzICovCitzdGF0aWMgdm9pZCBzM2MyNDEwX3J0Y19zZXRhaWUoaW50IHRvKQoreworCXVuc2lnbmVkIGludCB0bXA7CisKKwlwcl9kZWJ1ZygiJXM6IGFpZT0lZFxuIiwgX19GVU5DVElPTl9fLCB0byk7CisKKwl0bXAgPSByZWFkYihTM0MyNDEwX1JUQ0FMTSk7CisKKwlpZiAodG8pCisJCXRtcCB8PSBTM0MyNDEwX1JUQ0FMTV9BTE1FTjsKKwllbHNlCisJCXRtcCAmPSB+UzNDMjQxMF9SVENBTE1fQUxNRU47CisKKworCXdyaXRlYih0bXAsIFMzQzI0MTBfUlRDQUxNKTsKK30KKworc3RhdGljIHZvaWQgczNjMjQxMF9ydGNfc2V0cGllKGludCB0bykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJcHJfZGVidWcoIiVzOiBwaWU9JWRcbiIsIF9fRlVOQ1RJT05fXywgdG8pOworCisJc3Bpbl9sb2NrX2lycSgmczNjMjQxMF9ydGNfcGllX2xvY2spOworCXRtcCA9IHJlYWRiKFMzQzI0MTBfVElDTlQpICYgflMzQzI0MTBfVElDTlRfRU5BQkxFOworCisJaWYgKHRvKQorCQl0bXAgfD0gUzNDMjQxMF9USUNOVF9FTkFCTEU7CisKKwl3cml0ZWIodG1wLCBTM0MyNDEwX1RJQ05UKTsKKwlzcGluX3VubG9ja19pcnEoJnMzYzI0MTBfcnRjX3BpZV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgczNjMjQxMF9ydGNfc2V0ZnJlcShpbnQgZnJlcSkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJc3Bpbl9sb2NrX2lycSgmczNjMjQxMF9ydGNfcGllX2xvY2spOworCXRtcCA9IHJlYWRiKFMzQzI0MTBfVElDTlQpICYgUzNDMjQxMF9USUNOVF9FTkFCTEU7CisKKwlzM2MyNDEwX3J0Y19mcmVxID0gZnJlcTsKKworCXRtcCB8PSAoMTI4IC8gZnJlcSktMTsKKworCXdyaXRlYih0bXAsIFMzQzI0MTBfVElDTlQpOworCXNwaW5fdW5sb2NrX2lycSgmczNjMjQxMF9ydGNfcGllX2xvY2spOworfQorCisvKiBUaW1lIHJlYWQvd3JpdGUgKi8KKworc3RhdGljIHZvaWQgczNjMjQxMF9ydGNfZ2V0dGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSkKK3sKKwl1bnNpZ25lZCBpbnQgaGF2ZV9yZXRyaWVkID0gMDsKKworIHJldHJ5X2dldF90aW1lOgorCXJ0Y190bS0+dG1fbWluICA9IHJlYWRiKFMzQzI0MTBfUlRDTUlOKTsKKwlydGNfdG0tPnRtX2hvdXIgPSByZWFkYihTM0MyNDEwX1JUQ0hPVVIpOworCXJ0Y190bS0+dG1fbWRheSA9IHJlYWRiKFMzQzI0MTBfUlRDREFURSk7CisJcnRjX3RtLT50bV9tb24gID0gcmVhZGIoUzNDMjQxMF9SVENNT04pOworCXJ0Y190bS0+dG1feWVhciA9IHJlYWRiKFMzQzI0MTBfUlRDWUVBUik7CisJcnRjX3RtLT50bV9zZWMgID0gcmVhZGIoUzNDMjQxMF9SVENTRUMpOworCisJLyogdGhlIG9ubHkgd2F5IHRvIHdvcmsgb3V0IHdldGhlciB0aGUgc3lzdGVtIHdhcyBtaWQtdXBkYXRlCisJICogd2hlbiB3ZSByZWFkIGl0IGlzIHRvIGNoZWNrIHRoZSBzZWNvbmQgY291bnRlciwgYW5kIGlmIGl0CisJICogaXMgemVybywgdGhlbiB3ZSByZS10cnkgdGhlIGVudGlyZSByZWFkCisJICovCisKKwlpZiAocnRjX3RtLT50bV9zZWMgPT0gMCAmJiAhaGF2ZV9yZXRyaWVkKSB7CisJCWhhdmVfcmV0cmllZCA9IDE7CisJCWdvdG8gcmV0cnlfZ2V0X3RpbWU7CisJfQorCisJcHJfZGVidWcoInJlYWQgdGltZSAlMDJ4LiUwMnguJTAyeCAlMDJ4LyUwMngvJTAyeFxuIiwKKwkJIHJ0Y190bS0+dG1feWVhciwgcnRjX3RtLT50bV9tb24sIHJ0Y190bS0+dG1fbWRheSwKKwkJIHJ0Y190bS0+dG1faG91ciwgcnRjX3RtLT50bV9taW4sIHJ0Y190bS0+dG1fc2VjKTsKKworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9zZWMpOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9taW4pOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9ob3VyKTsKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbWRheSk7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX21vbik7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX3llYXIpOworCisJcnRjX3RtLT50bV95ZWFyICs9IDEwMDsKKwlydGNfdG0tPnRtX21vbiAtPSAxOworfQorCisKK3N0YXRpYyBpbnQgczNjMjQxMF9ydGNfc2V0dGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCS8qIHRoZSBydGMgZ2V0cyByb3VuZCB0aGUgeTJrIHByb2JsZW0gYnkganVzdCBub3Qgc3VwcG9ydGluZyBpdCAqLworCisJaWYgKHRtLT50bV95ZWFyIDwgMTAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdyaXRlYihCSU4yQkNEKHRtLT50bV9zZWMpLCAgUzNDMjQxMF9SVENTRUMpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV9taW4pLCAgUzNDMjQxMF9SVENNSU4pOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV9ob3VyKSwgUzNDMjQxMF9SVENIT1VSKTsKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1fbWRheSksIFMzQzI0MTBfUlRDREFURSk7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX21vbiArIDEpLCBTM0MyNDEwX1JUQ01PTik7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX3llYXIgLSAxMDApLCBTM0MyNDEwX1JUQ1lFQVIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcnRjX2dldGFsYXJtKHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBydGNfdGltZSAqYWxtX3RtID0gJmFscm0tPnRpbWU7CisJdW5zaWduZWQgaW50IGFsbV9lbjsKKworCWFsbV90bS0+dG1fc2VjICA9IHJlYWRiKFMzQzI0MTBfQUxNU0VDKTsKKwlhbG1fdG0tPnRtX21pbiAgPSByZWFkYihTM0MyNDEwX0FMTU1JTik7CisJYWxtX3RtLT50bV9ob3VyID0gcmVhZGIoUzNDMjQxMF9BTE1IT1VSKTsKKwlhbG1fdG0tPnRtX21vbiAgPSByZWFkYihTM0MyNDEwX0FMTU1PTik7CisJYWxtX3RtLT50bV9tZGF5ID0gcmVhZGIoUzNDMjQxMF9BTE1EQVRFKTsKKwlhbG1fdG0tPnRtX3llYXIgPSByZWFkYihTM0MyNDEwX0FMTVlFQVIpOworCisJYWxtX2VuID0gcmVhZGIoUzNDMjQxMF9SVENBTE0pOworCisJcHJfZGVidWcoInJlYWQgYWxhcm0gJTAyeCAlMDJ4LiUwMnguJTAyeCAlMDJ4LyUwMngvJTAyeFxuIiwKKwkJIGFsbV9lbiwKKwkJIGFsbV90bS0+dG1feWVhciwgYWxtX3RtLT50bV9tb24sIGFsbV90bS0+dG1fbWRheSwKKwkJIGFsbV90bS0+dG1faG91ciwgYWxtX3RtLT50bV9taW4sIGFsbV90bS0+dG1fc2VjKTsKKworCisJLyogZGVjb2RlIHRoZSBhbGFybSBlbmFibGUgZmllbGQgKi8KKworCWlmIChhbG1fZW4gJiBTM0MyNDEwX1JUQ0FMTV9TRUNFTikgeworCQlCQ0RfVE9fQklOKGFsbV90bS0+dG1fc2VjKTsKKwl9IGVsc2UgeworCQlhbG1fdG0tPnRtX3NlYyA9IDB4ZmY7CisJfQorCisJaWYgKGFsbV9lbiAmIFMzQzI0MTBfUlRDQUxNX01JTkVOKSB7CisJCUJDRF9UT19CSU4oYWxtX3RtLT50bV9taW4pOworCX0gZWxzZSB7CisJCWFsbV90bS0+dG1fbWluID0gMHhmZjsKKwl9CisKKwlpZiAoYWxtX2VuICYgUzNDMjQxMF9SVENBTE1fSE9VUkVOKSB7CisJCUJDRF9UT19CSU4oYWxtX3RtLT50bV9ob3VyKTsKKwl9IGVsc2UgeworCQlhbG1fdG0tPnRtX2hvdXIgPSAweGZmOworCX0KKworCWlmIChhbG1fZW4gJiBTM0MyNDEwX1JUQ0FMTV9EQVlFTikgeworCQlCQ0RfVE9fQklOKGFsbV90bS0+dG1fbWRheSk7CisJfSBlbHNlIHsKKwkJYWxtX3RtLT50bV9tZGF5ID0gMHhmZjsKKwl9CisKKwlpZiAoYWxtX2VuICYgUzNDMjQxMF9SVENBTE1fTU9ORU4pIHsKKwkJQkNEX1RPX0JJTihhbG1fdG0tPnRtX21vbik7CisJCWFsbV90bS0+dG1fbW9uIC09IDE7CisJfSBlbHNlIHsKKwkJYWxtX3RtLT50bV9tb24gPSAweGZmOworCX0KKworCWlmIChhbG1fZW4gJiBTM0MyNDEwX1JUQ0FMTV9ZRUFSRU4pIHsKKwkJQkNEX1RPX0JJTihhbG1fdG0tPnRtX3llYXIpOworCX0gZWxzZSB7CisJCWFsbV90bS0+dG1feWVhciA9IDB4ZmZmZjsKKwl9CisKKwkvKiB0b2RvIC0gc2V0IGFscm0tPmVuYWJsZWQgPyAqLworfQorCitzdGF0aWMgaW50IHMzYzI0MTBfcnRjX3NldGFsYXJtKHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBydGNfdGltZSAqdG0gPSAmYWxybS0+dGltZTsKKwl1bnNpZ25lZCBpbnQgYWxybV9lbjsKKworCXByX2RlYnVnKCJzM2MyNDEwX3J0Y19zZXRhbGFybTogJWQsICUwMngvJTAyeC8lMDJ4ICUwMnguJTAyeC4lMDJ4XG4iLAorCQkgYWxybS0+ZW5hYmxlZCwKKwkJIHRtLT50bV9tZGF5ICYgMHhmZiwgdG0tPnRtX21vbiAmIDB4ZmYsIHRtLT50bV95ZWFyICYgMHhmZiwKKwkJIHRtLT50bV9ob3VyICYgMHhmZiwgdG0tPnRtX21pbiAmIDB4ZmYsIHRtLT50bV9zZWMpOworCisJaWYgKGFscm0tPmVuYWJsZWQgfHwgMSkgeworCQlhbHJtX2VuID0gcmVhZGIoUzNDMjQxMF9SVENBTE0pICYgUzNDMjQxMF9SVENBTE1fQUxNRU47CisJCXdyaXRlYigweDAwLCBTM0MyNDEwX1JUQ0FMTSk7CisKKwkJaWYgKHRtLT50bV9zZWMgPCA2MCAmJiB0bS0+dG1fc2VjID49IDApIHsKKwkJCWFscm1fZW4gfD0gUzNDMjQxMF9SVENBTE1fU0VDRU47CisJCQl3cml0ZWIoQklOMkJDRCh0bS0+dG1fc2VjKSwgUzNDMjQxMF9BTE1TRUMpOworCQl9CisKKwkJaWYgKHRtLT50bV9taW4gPCA2MCAmJiB0bS0+dG1fbWluID49IDApIHsKKwkJCWFscm1fZW4gfD0gUzNDMjQxMF9SVENBTE1fTUlORU47CisJCQl3cml0ZWIoQklOMkJDRCh0bS0+dG1fbWluKSwgUzNDMjQxMF9BTE1NSU4pOworCQl9CisKKwkJaWYgKHRtLT50bV9ob3VyIDwgMjQgJiYgdG0tPnRtX2hvdXIgPj0gMCkgeworCQkJYWxybV9lbiB8PSBTM0MyNDEwX1JUQ0FMTV9IT1VSRU47CisJCQl3cml0ZWIoQklOMkJDRCh0bS0+dG1faG91ciksIFMzQzI0MTBfQUxNSE9VUik7CisJCX0KKworCQlwcl9kZWJ1Zygic2V0dGluZyBTM0MyNDEwX1JUQ0FMTSB0byAlMDh4XG4iLCBhbHJtX2VuKTsKKworCQl3cml0ZWIoYWxybV9lbiwgUzNDMjQxMF9SVENBTE0pOworCQllbmFibGVfaXJxX3dha2UoczNjMjQxMF9ydGNfYWxhcm1ubyk7CisJfSBlbHNlIHsKKwkJYWxybV9lbiA9IHJlYWRiKFMzQzI0MTBfUlRDQUxNKTsKKwkJYWxybV9lbiAmPSB+UzNDMjQxMF9SVENBTE1fQUxNRU47CisJCXdyaXRlYihhbHJtX2VuLCBTM0MyNDEwX1JUQ0FMTSk7CisJCWRpc2FibGVfaXJxX3dha2UoczNjMjQxMF9ydGNfYWxhcm1ubyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjMjQxMF9ydGNfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT0ZGOgorCWNhc2UgUlRDX0FJRV9PTjoKKwkJczNjMjQxMF9ydGNfc2V0YWllKChjbWQgPT0gUlRDX0FJRV9PTikgPyAxIDogMCk7CisJCXJldHVybiAwOworCisJY2FzZSBSVENfUElFX09GRjoKKwljYXNlIFJUQ19QSUVfT046CisJCXMzYzI0MTBfcnRjX3NldHBpZSgoY21kID09IFJUQ19QSUVfT04pID8gMSA6IDApOworCQlyZXR1cm4gMDsKKworCWNhc2UgUlRDX0lSUVBfUkVBRDoKKwkJcmV0dXJuIHB1dF91c2VyKHMzYzI0MTBfcnRjX2ZyZXEsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZyk7CisKKwljYXNlIFJUQ19JUlFQX1NFVDoKKwkJaWYgKGFyZyA8IDEgfHwgYXJnID4gNjQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQkvKiBjaGVjayBmb3IgcG93ZXIgb2YgMiAqLworCisJCWlmICgoYXJnICYgKGFyZy0xKSkgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXByX2RlYnVnKCJzM2MyNDEwX3J0Yzogc2V0dGluZyBmcmVxdWVuY3kgJWxkXG4iLCBhcmcpOworCisJCXMzYzI0MTBfcnRjX3NldGZyZXEoYXJnKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFJUQ19VSUVfT046CisJY2FzZSBSVENfVUlFX09GRjoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgczNjMjQxMF9ydGNfcHJvYyhjaGFyICpidWYpCit7CisJdW5zaWduZWQgaW50IHJ0Y2FsbSA9IHJlYWRiKFMzQzI0MTBfUlRDQUxNKTsKKwl1bnNpZ25lZCBpbnQgdGljbnQgPSByZWFkYiAoUzNDMjQxMF9USUNOVCk7CisJY2hhciAqcCA9IGJ1ZjsKKworCXAgKz0gc3ByaW50ZihwLCAiYWxhcm1fSVJRXHQ6ICVzXG4iLAorCQkgICAgIChydGNhbG0gJiBTM0MyNDEwX1JUQ0FMTV9BTE1FTikgPyAieWVzIiA6ICJubyIgKTsKKwlwICs9IHNwcmludGYocCwgInBlcmlvZGljX0lSUVx0OiAlc1xuIiwKKwkJICAgICAodGljbnQgJiBTM0MyNDEwX1RJQ05UX0VOQUJMRSkgPyAieWVzIiA6ICJubyIgKTsKKwlwICs9IHNwcmludGYocCwgInBlcmlvZGljX2ZyZXFcdDogJWRcbiIsIHMzYzI0MTBfcnRjX2ZyZXEpOworCisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgczNjMjQxMF9ydGNfb3Blbih2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSByZXF1ZXN0X2lycShzM2MyNDEwX3J0Y19hbGFybW5vLCBzM2MyNDEwX3J0Y19hbGFybWlycSwKKwkJCSAgU0FfSU5URVJSVVBULCAgInMzYzI0MTAtcnRjIGFsYXJtIiwgTlVMTCk7CisKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgIklSUSVkIGFscmVhZHkgaW4gdXNlXG4iLCBzM2MyNDEwX3J0Y19hbGFybW5vKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKHMzYzI0MTBfcnRjX3RpY2tubywgczNjMjQxMF9ydGNfdGlja2lycSwKKwkJCSAgU0FfSU5URVJSVVBULCAgInMzYzI0MTAtcnRjIHRpY2siLCBOVUxMKTsKKworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJUlElZCBhbHJlYWR5IGluIHVzZVxuIiwgczNjMjQxMF9ydGNfdGlja25vKTsKKwkJZ290byB0aWNrX2VycjsKKwl9CisKKwlyZXR1cm4gcmV0OworCisgdGlja19lcnI6CisJZnJlZV9pcnEoczNjMjQxMF9ydGNfYWxhcm1ubywgTlVMTCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgczNjMjQxMF9ydGNfcmVsZWFzZSh2b2lkKQoreworCS8qIGRvIG5vdCBjbGVhciBBSUUgaGVyZSwgaXQgbWF5IGJlIG5lZWRlZCBmb3Igd2FrZSAqLworCisJczNjMjQxMF9ydGNfc2V0cGllKDApOworCWZyZWVfaXJxKHMzYzI0MTBfcnRjX2FsYXJtbm8sIE5VTEwpOworCWZyZWVfaXJxKHMzYzI0MTBfcnRjX3RpY2tubywgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX29wcyBzM2MyNDEwX3J0Y29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gczNjMjQxMF9ydGNfb3BlbiwKKwkucmVsZWFzZQk9IHMzYzI0MTBfcnRjX3JlbGVhc2UsCisJLmlvY3RsCQk9IHMzYzI0MTBfcnRjX2lvY3RsLAorCS5yZWFkX3RpbWUJPSBzM2MyNDEwX3J0Y19nZXR0aW1lLAorCS5zZXRfdGltZQk9IHMzYzI0MTBfcnRjX3NldHRpbWUsCisJLnJlYWRfYWxhcm0JPSBzM2MyNDEwX3J0Y19nZXRhbGFybSwKKwkuc2V0X2FsYXJtCT0gczNjMjQxMF9ydGNfc2V0YWxhcm0sCisJLnByb2MJICAgICAgICA9IHMzYzI0MTBfcnRjX3Byb2MsCit9OworCitzdGF0aWMgdm9pZCBzM2MyNDEwX3J0Y19lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZW4pCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCWlmIChzM2MyNDEwX3J0Y19iYXNlID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICghZW4pIHsKKwkJdG1wID0gcmVhZGIoUzNDMjQxMF9SVENDT04pOworCQl3cml0ZWIodG1wICYgflMzQzI0MTBfUlRDQ09OX1JUQ0VOLCBTM0MyNDEwX1JUQ0NPTik7CisKKwkJdG1wID0gcmVhZGIoUzNDMjQxMF9USUNOVCk7CisJCXdyaXRlYih0bXAgJiB+UzNDMjQxMF9USUNOVF9FTkFCTEUsIFMzQzI0MTBfVElDTlQpOworCX0gZWxzZSB7CisJCS8qIHJlLWVuYWJsZSB0aGUgZGV2aWNlLCBhbmQgY2hlY2sgaXQgaXMgb2sgKi8KKworCQlpZiAoKHJlYWRiKFMzQzI0MTBfUlRDQ09OKSAmIFMzQzI0MTBfUlRDQ09OX1JUQ0VOKSA9PSAwKXsKKwkJCWRldl9pbmZvKGRldiwgInJ0YyBkaXNhYmxlZCwgcmUtZW5hYmxpbmdcbiIpOworCisJCQl0bXAgPSByZWFkYihTM0MyNDEwX1JUQ0NPTik7CisJCQl3cml0ZWIodG1wIHwgUzNDMjQxMF9SVENDT05fUlRDRU4gLCBTM0MyNDEwX1JUQ0NPTik7CisJCX0KKworCQlpZiAoKHJlYWRiKFMzQzI0MTBfUlRDQ09OKSAmIFMzQzI0MTBfUlRDQ09OX0NOVFNFTCkpeworCQkJZGV2X2luZm8oZGV2LCAicmVtb3ZpbmcgUzNDMjQxMF9SVENDT05fQ05UU0VMXG4iKTsKKworCQkJdG1wID0gcmVhZGIoUzNDMjQxMF9SVENDT04pOworCQkJd3JpdGViKHRtcCYgflMzQzI0MTBfUlRDQ09OX0NOVFNFTCAsIFMzQzI0MTBfUlRDQ09OKTsKKwkJfQorCisJCWlmICgocmVhZGIoUzNDMjQxMF9SVENDT04pICYgUzNDMjQxMF9SVENDT05fQ0xLUlNUKSl7CisJCQlkZXZfaW5mbyhkZXYsICJyZW1vdmluZyBTM0MyNDEwX1JUQ0NPTl9DTEtSU1RcbiIpOworCisJCQl0bXAgPSByZWFkYihTM0MyNDEwX1JUQ0NPTik7CisJCQl3cml0ZWIodG1wICYgflMzQzI0MTBfUlRDQ09OX0NMS1JTVCwgUzNDMjQxMF9SVENDT04pOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHMzYzI0MTBfcnRjX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdW5yZWdpc3Rlcl9ydGMoJnMzYzI0MTBfcnRjb3BzKTsKKworCXMzYzI0MTBfcnRjX3NldHBpZSgwKTsKKwlzM2MyNDEwX3J0Y19zZXRhaWUoMCk7CisKKwlpZiAoczNjMjQxMF9ydGNfbWVtICE9IE5VTEwpIHsKKwkJcHJfZGVidWcoInMzYzI0MTBfcnRjOiByZWxlYXNpbmcgczNjMjQxMF9ydGNfbWVtXG4iKTsKKwkJaW91bm1hcChzM2MyNDEwX3J0Y19iYXNlKTsKKwkJcmVsZWFzZV9yZXNvdXJjZShzM2MyNDEwX3J0Y19tZW0pOworCQlrZnJlZShzM2MyNDEwX3J0Y19tZW0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0MTBfcnRjX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldDsKKworCXByX2RlYnVnKCIlczogcHJvYmU9JXAsIGRldmljZT0lcFxuIiwgX19GVU5DVElPTl9fLCBwZGV2LCBkZXYpOworCisJLyogZmluZCB0aGUgSVJRcyAqLworCisJczNjMjQxMF9ydGNfdGlja25vID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwlpZiAoczNjMjQxMF9ydGNfdGlja25vIDw9IDApIHsKKwkJZGV2X2VycihkZXYsICJubyBpcnEgZm9yIHJ0YyB0aWNrXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJczNjMjQxMF9ydGNfYWxhcm1ubyA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHMzYzI0MTBfcnRjX2FsYXJtbm8gPD0gMCkgeworCQlkZXZfZXJyKGRldiwgIm5vIGlycSBmb3IgYWxhcm1cbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlwcl9kZWJ1ZygiczNjMjQxMF9ydGM6IHRpY2sgaXJxICVkLCBhbGFybSBpcnEgJWRcbiIsCisJCSBzM2MyNDEwX3J0Y190aWNrbm8sIHMzYzI0MTBfcnRjX2FsYXJtbm8pOworCisJLyogZ2V0IHRoZSBtZW1vcnkgcmVnaW9uICovCisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgbWVtb3J5IHJlZ2lvbiByZXNvdXJjZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXMzYzI0MTBfcnRjX21lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZC1yZXMtPnN0YXJ0KzEsCisJCQkJICAgICBwZGV2LT5uYW1lKTsKKworCWlmIChzM2MyNDEwX3J0Y19tZW0gPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXNlcnZlIG1lbW9yeSByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGV4aXRfZXJyOworCX0KKworCXMzYzI0MTBfcnRjX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCWlmIChzM2MyNDEwX3J0Y19iYXNlID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgaW9yZW1hcCgpXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0X2VycjsKKwl9CisKKwlzM2MyNDEwX3J0Y19tZW0gPSByZXM7CisJcHJfZGVidWcoInMzYzI0MTBfcnRjX2Jhc2U9JXBcbiIsIHMzYzI0MTBfcnRjX2Jhc2UpOworCisgCXByX2RlYnVnKCJzM2MyNDEwX3J0YzogUlRDQ09OPSUwMnhcbiIsIHJlYWRiKFMzQzI0MTBfUlRDQ09OKSk7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgZXZlcnl0aGluZyBpcyBzZXR1cCBjb3JyZWN0bHkgKi8KKworCXMzYzI0MTBfcnRjX2VuYWJsZShkZXYsIDEpOworCisgCXByX2RlYnVnKCJzM2MyNDEwX3J0YzogUlRDQ09OPSUwMnhcbiIsIHJlYWRiKFMzQzI0MTBfUlRDQ09OKSk7CisKKwlzM2MyNDEwX3J0Y19zZXRmcmVxKHMzYzI0MTBfcnRjX2ZyZXEpOworCisJLyogcmVnaXN0ZXIgUlRDIGFuZCBleGl0ICovCisKKwlyZWdpc3Rlcl9ydGMoJnMzYzI0MTBfcnRjb3BzKTsKKwlyZXR1cm4gMDsKKworIGV4aXRfZXJyOgorCWRldl9lcnIoZGV2LCAiZXJyb3IgJWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCisvKiBTM0MyNDEwIFJUQyBQb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wgKi8KKworc3RhdGljIHN0cnVjdCB0aW1lc3BlYyBzM2MyNDEwX3J0Y19kZWx0YTsKKworc3RhdGljIGludCB0aWNudF9zYXZlOworCitzdGF0aWMgaW50IHMzYzI0MTBfcnRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgc3RhdGUsIHUzMiBsZXZlbCkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJc3RydWN0IHRpbWVzcGVjIHRpbWU7CisKKwl0aW1lLnR2X25zZWMgPSAwOworCisJaWYgKGxldmVsID09IFNVU1BFTkRfUE9XRVJfRE9XTikgeworCQkvKiBzYXZlIFRJQ05UIGZvciBhbnlvbmUgdXNpbmcgcGVyaW9kaWMgaW50ZXJydXB0cyAqLworCisJCXRpY250X3NhdmUgPSByZWFkYihTM0MyNDEwX1RJQ05UKTsKKworCQkvKiBjYWxjdWxhdGUgdGltZSBkZWx0YSBmb3Igc3VzcGVuZCAqLworCisJCXMzYzI0MTBfcnRjX2dldHRpbWUoJnRtKTsKKwkJcnRjX3RtX3RvX3RpbWUoJnRtLCAmdGltZS50dl9zZWMpOworCQlzYXZlX3RpbWVfZGVsdGEoJnMzYzI0MTBfcnRjX2RlbHRhLCAmdGltZSk7CisJCXMzYzI0MTBfcnRjX2VuYWJsZShkZXYsIDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0MTBfcnRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJc3RydWN0IHRpbWVzcGVjIHRpbWU7CisKKwl0aW1lLnR2X25zZWMgPSAwOworCisJczNjMjQxMF9ydGNfZW5hYmxlKGRldiwgMSk7CisJczNjMjQxMF9ydGNfZ2V0dGltZSgmdG0pOworCXJ0Y190bV90b190aW1lKCZ0bSwgJnRpbWUudHZfc2VjKTsKKwlyZXN0b3JlX3RpbWVfZGVsdGEoJnMzYzI0MTBfcnRjX2RlbHRhLCAmdGltZSk7CisKKwl3cml0ZWIodGljbnRfc2F2ZSwgUzNDMjQxMF9USUNOVCk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBzM2MyNDEwX3J0Y19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgczNjMjQxMF9ydGNfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHMzYzI0MTBfcnRjZHJ2ID0geworCS5uYW1lCQk9ICJzM2MyNDEwLXJ0YyIsCisJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlCQk9IHMzYzI0MTBfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gczNjMjQxMF9ydGNfcmVtb3ZlLAorCS5zdXNwZW5kCT0gczNjMjQxMF9ydGNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHMzYzI0MTBfcnRjX3Jlc3VtZSwKK307CisKK3N0YXRpYyBjaGFyIF9faW5pdGRhdGEgYmFubmVyW10gPSAiUzNDMjQxMCBSVEMsIChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljc1xuIjsKKworc3RhdGljIGludCBfX2luaXQgczNjMjQxMF9ydGNfaW5pdCh2b2lkKQoreworCXByaW50ayhiYW5uZXIpOworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnMzYzI0MTBfcnRjZHJ2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHMzYzI0MTBfcnRjX2V4aXQodm9pZCkKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmczNjMjQxMF9ydGNkcnYpOworfQorCittb2R1bGVfaW5pdChzM2MyNDEwX3J0Y19pbml0KTsKK21vZHVsZV9leGl0KHMzYzI0MTBfcnRjX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlMzQzI0WFggUlRDIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzLCA8YmVuQHNpbXRlYy5jby51az4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zY2FuX2tleWIuYyBiL2RyaXZlcnMvY2hhci9zY2FuX2tleWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjViYjRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3NjYW5fa2V5Yi5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICoJJElkOiBzY2FuX2tleWIuYyx2IDEuMiAyMDAwLzA3LzA0IDA2OjI0OjQyIHlhZWdhc2hpIEV4cCAkIAorICoJQ29weXJpZ2h0IChDKSAyMDAwIFlBRUdBU0hJIFRha2VzaGkKKyAqCUdlbmVyaWMgc2NhbiBrZXlib2FyZCBkcml2ZXIKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tiZF9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2JkX2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorCisjZGVmaW5lIFNDQU5IWgkoSFovMjApCisKK3N0cnVjdCBzY2FuX2tleWJvYXJkIHsKKwlzdHJ1Y3Qgc2Nhbl9rZXlib2FyZCAqbmV4dDsKKwlpbnQgKCpzY2FuKSh1bnNpZ25lZCBjaGFyICpidWZmZXIpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnRhYmxlOworCXVuc2lnbmVkIGNoYXIgKnMwLCAqczE7CisJaW50IGxlbmd0aDsKK307CisKK3N0YXRpYyBpbnQgc2Nhbl9qaWZmaWVzPTA7CitzdGF0aWMgc3RydWN0IHNjYW5fa2V5Ym9hcmQgKmtleWJvYXJkcz1OVUxMOworc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90aW1lcjsKKworc3RhdGljIHZvaWQgY2hlY2tfa2JkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRhYmxlLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICpuZXcsIHVuc2lnbmVkIGNoYXIgKm9sZCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgbmVlZF90YXNrbGV0X3NjaGVkdWxlPTA7CisJdW5zaWduZWQgaW50IHhvciwgYml0OworCQorCXdoaWxlKGxlbmd0aC0tPjApIHsKKwkJaWYoKHhvcj0qbmV3XipvbGQpPT0wKSB7CisJCQl0YWJsZSs9ODsKKwkJfQorCQllbHNlIHsKKwkJCWZvcihiaXQ9MHgwMTsgYml0PDB4MTAwOyBiaXQ8PD0xKSB7CisJCQkJaWYoeG9yJmJpdCkgeworCQkJCQloYW5kbGVfc2NhbmNvZGUoKnRhYmxlLCAhKCpuZXcmYml0KSk7CisJCQkJCW5lZWRfdGFza2xldF9zY2hlZHVsZT0xOworI2lmIDAKKwkJCQkJcHJpbnRrKCIweCV4ICVzXG4iLCAqdGFibGUsICgqbmV3JmJpdCk/InJlbGVhc2VkIjoicHJlc3NlZCIpOworI2VuZGlmCisJCQkJfQorCQkJCXRhYmxlKys7CisJCQl9CisJCX0KKwkJbmV3Kys7IG9sZCsrOworCX0KKworCWlmKG5lZWRfdGFza2xldF9zY2hlZHVsZSkKKwkJdGFza2xldF9zY2hlZHVsZSgma2V5Ym9hcmRfdGFza2xldCk7Cit9CisKKworc3RhdGljIHZvaWQgc2Nhbl9rYmQodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlzdHJ1Y3Qgc2Nhbl9rZXlib2FyZCAqa2JkOworCisJc2Nhbl9qaWZmaWVzKys7CisKKwlmb3Ioa2JkPWtleWJvYXJkczsga2JkIT1OVUxMOyBrYmQ9a2JkLT5uZXh0KSB7CisJCWlmKHNjYW5famlmZmllcyYxKSB7CisJCQlpZigha2JkLT5zY2FuKGtiZC0+czApKQorCQkJCWNoZWNrX2tiZChrYmQtPnRhYmxlLAorCQkJCQkgIGtiZC0+czAsIGtiZC0+czEsIGtiZC0+bGVuZ3RoKTsKKwkJCWVsc2UKKwkJCQltZW1jcHkoa2JkLT5zMCwga2JkLT5zMSwga2JkLT5sZW5ndGgpOworCQl9CisJCWVsc2UgeworCQkJaWYoIWtiZC0+c2NhbihrYmQtPnMxKSkKKwkJCQljaGVja19rYmQoa2JkLT50YWJsZSwKKwkJCQkJICBrYmQtPnMxLCBrYmQtPnMwLCBrYmQtPmxlbmd0aCk7CisJCQllbHNlCisJCQkJbWVtY3B5KGtiZC0+czEsIGtiZC0+czAsIGtiZC0+bGVuZ3RoKTsKKwkJfQorCQkKKwl9CisKKwlpbml0X3RpbWVyKCZzY2FuX3RpbWVyKTsKKwlzY2FuX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgU0NBTkhaOworCXNjYW5fdGltZXIuZGF0YSA9IDA7CisJc2Nhbl90aW1lci5mdW5jdGlvbiA9IHNjYW5fa2JkOworCWFkZF90aW1lcigmc2Nhbl90aW1lcik7Cit9CisKKworaW50IHJlZ2lzdGVyX3NjYW5fa2V5Ym9hcmQoaW50ICgqc2NhbikodW5zaWduZWQgY2hhciAqYnVmZmVyKSwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRhYmxlLAorCQkJICAgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3Qgc2Nhbl9rZXlib2FyZCAqa2JkOworCisJa2JkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjYW5fa2V5Ym9hcmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoa2JkID09IE5VTEwpCisJCWdvdG8gZXJyb3Jfb3V0OworCisJa2JkLT5zY2FuPXNjYW47CisJa2JkLT50YWJsZT10YWJsZTsKKwlrYmQtPmxlbmd0aD1sZW5ndGg7CisKKwlrYmQtPnMwID0ga21hbGxvYyhsZW5ndGgsIEdGUF9LRVJORUwpOworCWlmIChrYmQtPnMwID09IE5VTEwpCisJCWdvdG8gZXJyb3JfZnJlZV9rYmQ7CisKKwlrYmQtPnMxID0ga21hbGxvYyhsZW5ndGgsIEdGUF9LRVJORUwpOworCWlmIChrYmQtPnMxID09IE5VTEwpCisJCWdvdG8gZXJyb3JfZnJlZV9zMDsKKworCW1lbXNldChrYmQtPnMwLCAtMSwga2JkLT5sZW5ndGgpOworCW1lbXNldChrYmQtPnMxLCAtMSwga2JkLT5sZW5ndGgpOworCQorCWtiZC0+bmV4dD1rZXlib2FyZHM7CisJa2V5Ym9hcmRzPWtiZDsKKworCXJldHVybiAwOworCisgZXJyb3JfZnJlZV9zMDoKKwlrZnJlZShrYmQtPnMwKTsKKworIGVycm9yX2ZyZWVfa2JkOgorCWtmcmVlKGtiZCk7CisKKyBlcnJvcl9vdXQ6CisJcmV0dXJuIC1FTk9NRU07Cit9CisJCQkgICAgICAKKwkJCSAgICAgIAordm9pZCBfX2luaXQgc2Nhbl9rYmRfaW5pdCh2b2lkKQoreworCWluaXRfdGltZXIoJnNjYW5fdGltZXIpOworCXNjYW5fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBTQ0FOSFo7CisJc2Nhbl90aW1lci5kYXRhID0gMDsKKwlzY2FuX3RpbWVyLmZ1bmN0aW9uID0gc2Nhbl9rYmQ7CisJYWRkX3RpbWVyKCZzY2FuX3RpbWVyKTsKKworCXByaW50ayhLRVJOX0lORk8gIkdlbmVyaWMgc2NhbiBrZXlib2FyZCBkcml2ZXIgaW5pdGlhbGl6ZWRcbiIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NjYW5fa2V5Yi5oIGIvZHJpdmVycy9jaGFyL3NjYW5fa2V5Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YjYxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc2Nhbl9rZXliLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZglfX0RSSVZFUl9DSEFSX1NDQU5fS0VZQl9ICisjZGVmaW5lCV9fRFJJVkVSX0NIQVJfU0NBTl9LRVlCX0gKKy8qCisgKgkkSWQ6IHNjYW5fa2V5Yi5oLHYgMS4xIDIwMDAvMDYvMTAgMjE6NDU6MzAgeWFlZ2FzaGkgRXhwICQKKyAqCUNvcHlyaWdodCAoQykgMjAwMCBZQUVHQVNISSBUYWtlc2hpCisgKglHZW5lcmljIHNjYW4ga2V5Ym9hcmQgZHJpdmVyCisgKi8KKworaW50IHJlZ2lzdGVyX3NjYW5fa2V5Ym9hcmQoaW50ICgqc2NhbikodW5zaWduZWQgY2hhciAqYnVmZmVyKSwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRhYmxlLAorCQkJICAgaW50IGxlbmd0aCk7CisKK3ZvaWQgX19pbml0IHNjYW5fa2JkX2luaXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NjYy5oIGIvZHJpdmVycy9jaGFyL3NjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxODEwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc2NjLmgKQEAgLTAsMCArMSw2MTMgQEAKKy8qCisgKiBhdGFyaV9TQ0MuaDogRGVmaW5pdGlvbnMgZm9yIHRoZSBBbTg1MzAgU2VyaWFsIENvbW11bmljYXRpb25zIENvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgMTk5NCBSb21hbiBIb2RlayA8Um9tYW4uSG9kZWtAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisKKyNpZm5kZWYgX1NDQ19ICisjZGVmaW5lIF9TQ0NfSAorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworLyogU3BlY2lhbCBjb25maWd1cmF0aW9uIGlvY3RscyBmb3IgdGhlIEF0YXJpIFNDQzUzODAgU2VyaWFsCisgKiBDb21tdW5pY2F0aW9ucyBDb250cm9sbGVyCisgKi8KKworLyogaW9jdGwgY29tbWFuZCBjb2RlcyAqLworCisjZGVmaW5lIFRJT0NHQVRTQ0MJMHg1NGMwCS8qIGdldCBTQ0MgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBUSU9DU0FUU0NDCTB4NTRjMQkvKiBzZXQgU0NDIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgVElPQ0RBVFNDQwkweDU0YzIJLyogcmVzZXQgY29uZmlndXJhdGlvbiB0byBkZWZhdWx0cyAqLworCisvKiBDbG9jayBzb3VyY2VzICovCisKKyNkZWZpbmUgQ0xLX1JUeEMJMAorI2RlZmluZSBDTEtfVFJ4QwkxCisjZGVmaW5lIENMS19QQ0xLCTIKKworLyogYmF1ZF9iYXNlcyBmb3IgdGhlIGNvbW1vbiBjbG9ja3MgaW4gdGhlIEF0YXJpLiBUaGVzZSBhcmUgdGhlIHJlYWwKKyAqIGZyZXF1ZW5jaWVzIGRpdmlkZWQgYnkgMTYuCisgKi8KKyAgIAorI2RlZmluZSBTQ0NfQkFVRF9CQVNFX1RJTUMJMTkyMDAJLyogMC4zMDcyIE1IeiBmcm9tIFRULU1GUCwgVGltZXIgQyAqLworI2RlZmluZSBTQ0NfQkFVRF9CQVNFX0JDTEsJMTUzNjAwCS8qIDIuNDU3NiBNSHogKi8KKyNkZWZpbmUgU0NDX0JBVURfQkFTRV9QQ0xLNAkyMjk1MDAJLyogMy42NzIwIE1IeiAqLworI2RlZmluZSBTQ0NfQkFVRF9CQVNFX1BDTEsJNTAzMzc0CS8qIDguMDUzOTc2MyBNSHogKi8KKyNkZWZpbmUgU0NDX0JBVURfQkFTRV9OT05FCTAJLyogZm9yIG5vdCBjb25uZWN0ZWQgb3IgdW51c2VkCisJCQkJCSAqIGNsb2NrIHNvdXJjZXMgKi8KKworLyogVGhlIFNDQyBjbG9jayBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLworCitzdHJ1Y3Qgc2NjX2Nsb2NrX2NvbmZpZyB7CisJdW5zaWduZWQJUlR4Q19iYXNlOwkvKiBiYXNlX2JhdWQgb2YgUlR4QyAqLworCXVuc2lnbmVkCVRSeENfYmFzZTsJLyogYmFzZV9iYXVkIG9mIFRSeEMgKi8KKwl1bnNpZ25lZAlQQ0xLX2Jhc2U7CS8qIGJhc2VfYmF1ZCBvZiBQQ0xLLCBib3RoIGNoYW5uZWxzISAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNsa3NyYzsJLyogQ0xLX1JUeEMsIENMS19UUnhDIG9yIENMS19QQ0xLICovCisJCXVuc2lnbmVkIGRpdmlzb3I7CS8qIGRpdmlzb3IgZm9yIGJhc2UgYmF1ZCwgdmFsaWQgdmFsdWVzOgorCQkJCQkgKiBzZWUgYmVsb3cgKi8KKwl9IGJhdWRfdGFibGVbMTddOwkJLyogRm9yIDUwLCA3NSwgMTEwLCAxMzUsIDE1MCwgMjAwLCAzMDAsCisJCQkJCSAqIDYwMCwgMTIwMCwgMTgwMCwgMjQwMCwgNDgwMCwgOTYwMCwKKwkJCQkJICogMTkyMDAsIDM4NDAwLCA1NzYwMCBhbmQgMTE1MjAwIGJwcy4KKwkJCQkJICogVGhlIGxhc3QgdHdvIGNvdWxkIGJlIHJlcGxhY2VkIGJ5CisJCQkJCSAqIG90aGVyIHJhdGVzID4gMzg0MDAgaWYgdGhleSdyZSBub3QKKwkJCQkJICogcG9zc2libGUuCisJCQkJCSAqLworfTsKKworLyogVGhlIGZvbGxvd2luZyBkaXZpc29ycyBhcmUgdmFsaWQ6CisgKgorICogICAtIENMS19SVHhDOiAxIG9yIGV2ZW4gKDEsIDIgYW5kIDQgYXJlIHRoZSBkaXJlY3QgbW9kZXMsID4gNCB1c2UKKyAqICAgICAgICAgICAgICAgdGhlIEJSRykKKyAqCisgKiAgIC0gQ0xLX1RSeEM6IDEsIDIgb3IgNCAobm8gQlJHLCBvbmx5IGRpcmVjdCBtb2RlcyBwb3NzaWJsZSkKKyAqCisgKiAgIC0gQ0xLX1BDTEs6ID49IDQgYW5kIGV2ZW4gKG5vIGRpcmVjdCBtb2Rlcywgb25seSBCUkcpCisgKgorICovCisKK3N0cnVjdCBzY2NfcG9ydCB7CisJc3RydWN0IGdzX3BvcnQJCWdzOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKmN0cmxwOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKmRhdGFwOworCWludAkJCXhfY2hhcjsJCS8qIHhvbi94b2ZmIGNoYXJhY3RlciAqLworCWludAkJCWNfZGNkOworCWludAkJCWNoYW5uZWw7CisJc3RydWN0IHNjY19wb3J0CQkqcG9ydF9hOwkvKiBSZWZlcmVuY2UgdG8gcG9ydCBBIGFuZCBCICovCisJc3RydWN0IHNjY19wb3J0CQkqcG9ydF9iOwkvKiAgIHN0cnVjdHMgZm9yIHJlZyBhY2Nlc3MgICovCit9OworCisjZGVmaW5lIFNDQ19NQUdJQwkweDUyNjk2MzY4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIFNDQyBkb2N1bWVudGF0aW9uIGdpdmVzIG5vIGV4cGxpY2l0IG5hbWVzIHRvIHRoZSByZWdpc3RlcnMsCisgKiB0aGV5J3JlIGp1c3QgY2FsbGVkIFdSMC4uMTUgYW5kIFJSMC4uMTUuIFRvIG1ha2UgdGhlIHNvdXJjZSBjb2RlCisgKiBiZXR0ZXIgcmVhZGFibGUgYW5kIG1ha2UgdGhlIHRyYW5zcGFyZW50IHdyaXRlIHJlZyByZWFkIGFjY2VzcyAoc2VlCisgKiBiZWxvdykgcG9zc2libGUsIEkgY2hyaXN0ZW4gdGhlbSBoZXJlIHdpdGggc2VsZi1pbnZlbnRlZCBuYW1lcy4KKyAqIE5vdGUgdGhhdCAocmVhbCkgcmVhZCByZWdpc3RlcnMgYXJlIGFzc2lnbmVkIG51bWJlcnMgMTYuLjMxLiBXUjcnCisgKiBoYXMgbnVtYmVyIDMzLgorICovCisKKyNkZWZpbmUJQ09NTUFORF9SRUcJCTAJLyogd28gKi8KKyNkZWZpbmUJSU5UX0FORF9ETUFfUkVHCQkxCS8qIHdvICovCisjZGVmaW5lCUlOVF9WRUNUT1JfUkVHCQkyCS8qIHJ3LCBjb21tb24gdG8gYm90aCBjaGFubmVscyAqLworI2RlZmluZQlSWF9DVFJMX1JFRwkJMwkvKiBydyAqLworI2RlZmluZQlBVVgxX0NUUkxfUkVHCQk0CS8qIHJ3ICovCisjZGVmaW5lCVRYX0NUUkxfUkVHCQk1CS8qIHJ3ICovCisjZGVmaW5lCVNZTkNfQURSX1JFRwkJNgkvKiB3byAqLworI2RlZmluZQlTWU5DX0NIQVJfUkVHCQk3CS8qIHdvICovCisjZGVmaW5lCVNETENfT1BUSU9OX1JFRwkJMzMJLyogd28gKi8KKyNkZWZpbmUJVFhfREFUQV9SRUcJCTgJLyogd28gKi8KKyNkZWZpbmUJTUFTVEVSX0lOVF9DVFJMCQk5CS8qIHdvLCBjb21tb24gdG8gYm90aCBjaGFubmVscyAqLworI2RlZmluZQlBVVgyX0NUUkxfUkVHCQkxMAkvKiBydyAqLworI2RlZmluZQlDTEtfQ1RSTF9SRUcJCTExCS8qIHdvICovCisjZGVmaW5lCVRJTUVSX0xPV19SRUcJCTEyCS8qIHJ3ICovCisjZGVmaW5lCVRJTUVSX0hJR0hfUkVHCQkxMwkvKiBydyAqLworI2RlZmluZQlEUExMX0NUUkxfUkVHCQkxNAkvKiB3byAqLworI2RlZmluZQlJTlRfQ1RSTF9SRUcJCTE1CS8qIHJ3ICovCisKKyNkZWZpbmUJU1RBVFVTX1JFRwkJMTYJLyogcm8gKi8KKyNkZWZpbmUJU1BDT05EX1NUQVRVU19SRUcJMTcJLyogd28gKi8KKy8qIFJSMiBpcyBXUjIgZm9yIENoYW5uZWwgQSwgQ2hhbm5lbCBCIGdpdmVzIHZlY3RvciArIGN1cnJlbnQgc3RhdHVzOiAqLworI2RlZmluZQlDVVJSX1ZFQ1RPUl9SRUcJCTE4CS8qIENoLiBCIG9ubHksIENoLiBBIGZvciBydyAqLworI2RlZmluZQlJTlRfUEVORElOR19SRUcJCTE5CS8qIENoYW5uZWwgQSBvbmx5ISAqLworLyogUlI0IGlzIFdSNCwgaWYgYjYoTVI3JykgPT0gMSAqLworLyogUlI1IGlzIFdSNSwgaWYgYjYoTVI3JykgPT0gMSAqLworI2RlZmluZQlGU19GSUZPX0xPV19SRUcJCTIyCS8qIHJvICovCisjZGVmaW5lCUZTX0ZJRk9fSElHSF9SRUcJMjMJLyogcm8gKi8KKyNkZWZpbmUJUlhfREFUQV9SRUcJCTI0CS8qIHJvICovCisvKiBSUjkgaXMgV1IzLCBpZiBiNihNUjcnKSA9PSAxICovCisjZGVmaW5lCURQTExfU1RBVFVTX1JFRwkJMjYJLyogcm8gKi8KKy8qIFJSMTEgaXMgV1IxMCwgaWYgYjYoTVI3JykgPT0gMSAqLworLyogUlIxMiBpcyBXUjEyICovCisvKiBSUjEzIGlzIFdSMTMgKi8KKy8qIFJSMTQgbm90IHByZXNlbnQgKi8KKy8qIFJSMTUgaXMgV1IxNSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBWYWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBXUjA6IENPTU1BTkRfUkVHICJDUiIgKi8KKworI2RlZmluZQlDUl9SWF9DUkNfUkVTRVQJCTB4NDAKKyNkZWZpbmUJQ1JfVFhfQ1JDX1JFU0VUCQkweDgwCisjZGVmaW5lCUNSX1RYX1VOREVSUlVOX1JFU0VUCTB4YzAKKworI2RlZmluZQlDUl9FWFRTVEFUX1JFU0VUCTB4MTAKKyNkZWZpbmUJQ1JfU0VORF9BQk9SVAkJMHgxOAorI2RlZmluZQlDUl9FTkFCX0lOVF9ORVhUX1JYCTB4MjAKKyNkZWZpbmUJQ1JfVFhfUEVORElOR19SRVNFVAkweDI4CisjZGVmaW5lCUNSX0VSUk9SX1JFU0VUCQkweDMwCisjZGVmaW5lCUNSX0hJR0hFU1RfSVVTX1JFU0VUCTB4MzgKKworCisvKiBXUjE6IElOVF9BTkRfRE1BX1JFRyAiSURSIiAqLworCisjZGVmaW5lCUlEUl9FWFRTVEFUX0lOVF9FTkFCCTB4MDEKKyNkZWZpbmUJSURSX1RYX0lOVF9FTkFCCQkweDAyCisjZGVmaW5lCUlEUl9QQVJFUlJfQVNfU1BDT05ECTB4MDQKKworI2RlZmluZQlJRFJfUlhfSU5UX0RJU0FCCTB4MDAKKyNkZWZpbmUJSURSX1JYX0lOVF9GSVJTVAkweDA4CisjZGVmaW5lCUlEUl9SWF9JTlRfQUxMCQkweDEwCisjZGVmaW5lCUlEUl9SWF9JTlRfU1BDT05ECTB4MTgKKyNkZWZpbmUJSURSX1JYX0lOVF9NQVNLCQkweDE4CisKKyNkZWZpbmUJSURSX1dBSVRSRVFfUlgJCTB4MjAKKyNkZWZpbmUJSURSX1dBSVRSRVFfSVNfUkVRCTB4NDAKKyNkZWZpbmUJSURSX1dBSVRSRVFfRU5BQgkweDgwCisKKworLyogV1IzOiBSWF9DVFJMX1JFRyAiUkNSIiAqLworCisjZGVmaW5lCVJDUl9SWF9FTkFCCQkweDAxCisjZGVmaW5lCVJDUl9ESVNDQVJEX1NZTkNfQ0hBUlMJMHgwMgorI2RlZmluZQlSQ1JfQUREUl9TRUFSQ0gJCTB4MDQKKyNkZWZpbmUJUkNSX0NSQ19FTkFCCQkweDA4CisjZGVmaW5lCVJDUl9TRUFSQ0hfTU9ERQkJMHgxMAorI2RlZmluZQlSQ1JfQVVUT19FTkFCX01PREUJMHgyMAorCisjZGVmaW5lCVJDUl9DSFNJWkVfTUFTSwkJMHhjMAorI2RlZmluZQlSQ1JfQ0hTSVpFXzUJCTB4MDAKKyNkZWZpbmUJUkNSX0NIU0laRV82CQkweDQwCisjZGVmaW5lCVJDUl9DSFNJWkVfNwkJMHg4MAorI2RlZmluZQlSQ1JfQ0hTSVpFXzgJCTB4YzAKKworCisvKiBXUjQ6IEFVWDFfQ1RSTF9SRUcgIkExQ1IiICovCisKKyNkZWZpbmUJQTFDUl9QQVJJVFlfTUFTSwkweDAzCisjZGVmaW5lCUExQ1JfUEFSSVRZX05PTkUJMHgwMAorI2RlZmluZQlBMUNSX1BBUklUWV9PREQJCTB4MDEKKyNkZWZpbmUJQTFDUl9QQVJJVFlfRVZFTgkweDAzCisKKyNkZWZpbmUJQTFDUl9NT0RFX01BU0sJCTB4MGMKKyNkZWZpbmUJQTFDUl9NT0RFX1NZTkNSCQkweDAwCisjZGVmaW5lCUExQ1JfTU9ERV9BU1lOQ18xCTB4MDQKKyNkZWZpbmUJQTFDUl9NT0RFX0FTWU5DXzE1CTB4MDgKKyNkZWZpbmUJQTFDUl9NT0RFX0FTWU5DXzIJMHgwYworCisjZGVmaW5lCUExQ1JfU1lOQ1JfTU9ERV9NQVNLCTB4MzAKKyNkZWZpbmUJQTFDUl9TWU5DUl9NT05PU1lOQwkweDAwCisjZGVmaW5lCUExQ1JfU1lOQ1JfQklTWU5DCTB4MTAKKyNkZWZpbmUJQTFDUl9TWU5DUl9TRExDCQkweDIwCisjZGVmaW5lCUExQ1JfU1lOQ1JfRVhUQ1NZTkMJMHgzMAorCisjZGVmaW5lCUExQ1JfQ0xLTU9ERV9NQVNLCTB4YzAKKyNkZWZpbmUJQTFDUl9DTEtNT0RFX3gxCQkweDAwCisjZGVmaW5lCUExQ1JfQ0xLTU9ERV94MTYJMHg0MAorI2RlZmluZQlBMUNSX0NMS01PREVfeDMyCTB4ODAKKyNkZWZpbmUJQTFDUl9DTEtNT0RFX3g2NAkweGMwCisKKworLyogV1I1OiBUWF9DVFJMX1JFRyAiVENSIiAqLworCisjZGVmaW5lCVRDUl9UWF9DUkNfRU5BQgkJMHgwMQorI2RlZmluZQlUQ1JfUlRTCQkJMHgwMgorI2RlZmluZQlUQ1JfVVNFX0NSQ19DQ0lUVAkweDAwCisjZGVmaW5lCVRDUl9VU0VfQ1JDXzE2CQkweDA0CisjZGVmaW5lCVRDUl9UWF9FTkFCCQkweDA4CisjZGVmaW5lCVRDUl9TRU5EX0JSRUFLCQkweDEwCisKKyNkZWZpbmUJVENSX0NIU0laRV9NQVNLCQkweDYwCisjZGVmaW5lCVRDUl9DSFNJWkVfNQkJMHgwMAorI2RlZmluZQlUQ1JfQ0hTSVpFXzYJCTB4MjAKKyNkZWZpbmUJVENSX0NIU0laRV83CQkweDQwCisjZGVmaW5lCVRDUl9DSFNJWkVfOAkJMHg2MAorCisjZGVmaW5lCVRDUl9EVFIJCQkweDgwCisKKworLyogV1I3JzogU0xEQ19PUFRJT05fUkVHICJTT1IiICovCisKKyNkZWZpbmUJU09SX0FVVE9fVFhfRU5BQgkweDAxCisjZGVmaW5lCVNPUl9BVVRPX0VPTV9SRVNFVAkweDAyCisjZGVmaW5lCVNPUl9BVVRPX1JUU19NT0RFCTB4MDQKKyNkZWZpbmUJU09SX05SWklfRElTQUJfSElHSAkweDA4CisjZGVmaW5lCVNPUl9BTFRfRFRSUkVRX1RJTUlORwkweDEwCisjZGVmaW5lCVNPUl9SRUFEX0NSQ19DSEFSUwkweDIwCisjZGVmaW5lCVNPUl9FWFRFTkRFRF9SRUdfQUNDRVNTCTB4NDAKKworCisvKiBXUjk6IE1BU1RFUl9JTlRfQ1RSTCAiTUlDIiAqLworCisjZGVmaW5lCU1JQ19WRUNfSU5DTF9TVEFUCTB4MDEKKyNkZWZpbmUJTUlDX05PX1ZFQ1RPUgkJMHgwMgorI2RlZmluZQlNSUNfRElTQUJfTE9XRVJfQ0hBSU4JMHgwNAorI2RlZmluZQlNSUNfTUFTVEVSX0lOVF9FTkFCCTB4MDgKKyNkZWZpbmUJTUlDX1NUQVRVU19ISUdICQkweDEwCisjZGVmaW5lCU1JQ19JR05fSU5UQUNLCQkweDIwCisKKyNkZWZpbmUJTUlDX05PX1JFU0VUCQkweDAwCisjZGVmaW5lCU1JQ19DSF9BX1JFU0VUCQkweDQwCisjZGVmaW5lCU1JQ19DSF9CX1JFU0VUCQkweDgwCisjZGVmaW5lCU1JQ19IQVJEX1JFU0VUCQkweGMwCisKKworLyogV1IxMDogQVVYMl9DVFJMX1JFRyAiQTJDUiIgKi8KKworI2RlZmluZQlBMkNSX1NZTkNfNgkJMHgwMQorI2RlZmluZQlBMkNSX0xPT1BfTU9ERQkJMHgwMgorI2RlZmluZQlBMkNSX0FCT1JUX09OX1VOREVSUlVOCTB4MDQKKyNkZWZpbmUJQTJDUl9NQVJLX0lETEUJCTB4MDgKKyNkZWZpbmUJQTJDUl9HT19BQ1RJVkVfT05fUE9MTAkweDEwCisKKyNkZWZpbmUJQTJDUl9DT0RJTkdfTUFTSwkweDYwCisjZGVmaW5lCUEyQ1JfQ09ESU5HX05SWgkJMHgwMAorI2RlZmluZQlBMkNSX0NPRElOR19OUlpJCTB4MjAKKyNkZWZpbmUJQTJDUl9DT0RJTkdfRk0xCQkweDQwCisjZGVmaW5lCUEyQ1JfQ09ESU5HX0ZNMAkJMHg2MAorCisjZGVmaW5lCUEyQ1JfUFJFU0VUX0NSQ18xCTB4ODAKKworCisvKiBXUjExOiBDTEtfQ1RSTF9SRUcgIkNDUiIgKi8KKworI2RlZmluZQlDQ1JfVFJ4Q09VVF9NQVNLCTB4MDMKKyNkZWZpbmUJQ0NSX1RSeENPVVRfWFRBTAkweDAwCisjZGVmaW5lCUNDUl9UUnhDT1VUX1RYQ0xLCTB4MDEKKyNkZWZpbmUJQ0NSX1RSeENPVVRfQlJHCQkweDAyCisjZGVmaW5lCUNDUl9UUnhDT1VUX0RQTEwJMHgwMworCisjZGVmaW5lCUNDUl9UUnhDX09VVFBVVAkJMHgwNAorCisjZGVmaW5lCUNDUl9UWENMS19NQVNLCQkweDE4CisjZGVmaW5lCUNDUl9UWENMS19SVHhDCQkweDAwCisjZGVmaW5lCUNDUl9UWENMS19UUnhDCQkweDA4CisjZGVmaW5lCUNDUl9UWENMS19CUkcJCTB4MTAKKyNkZWZpbmUJQ0NSX1RYQ0xLX0RQTEwJCTB4MTgKKworI2RlZmluZQlDQ1JfUlhDTEtfTUFTSwkJMHg2MAorI2RlZmluZQlDQ1JfUlhDTEtfUlR4QwkJMHgwMAorI2RlZmluZQlDQ1JfUlhDTEtfVFJ4QwkJMHgyMAorI2RlZmluZQlDQ1JfUlhDTEtfQlJHCQkweDQwCisjZGVmaW5lCUNDUl9SWENMS19EUExMCQkweDYwCisKKyNkZWZpbmUJQ0NSX1JUeENfWFRBTAkJMHg4MAorCisKKy8qIFdSMTQ6IERQTExfQ1RSTF9SRUcgIkRDUiIgKi8KKworI2RlZmluZQlEQ1JfQlJHX0VOQUIJCTB4MDEKKyNkZWZpbmUJRENSX0JSR19VU0VfUENMSwkweDAyCisjZGVmaW5lCURDUl9EVFJSRVFfSVNfUkVRCTB4MDQKKyNkZWZpbmUJRENSX0FVVE9fRUNITwkJMHgwOAorI2RlZmluZQlEQ1JfTE9DQUxfTE9PUEJBQ0sJMHgxMAorCisjZGVmaW5lCURDUl9EUExMX0VER0VfU0VBUkNICTB4MjAKKyNkZWZpbmUJRENSX0RQTExfRVJSX1JFU0VUCTB4NDAKKyNkZWZpbmUJRENSX0RQTExfRElTQUIJCTB4NjAKKyNkZWZpbmUJRENSX0RQTExfQ0xLX0JSRwkweDgwCisjZGVmaW5lCURDUl9EUExMX0NMS19SVHhDCTB4YTAKKyNkZWZpbmUJRENSX0RQTExfRk0JCTB4YzAKKyNkZWZpbmUJRENSX0RQTExfTlJaSQkJMHhlMAorCisKKy8qIFdSMTU6IElOVF9DVFJMX1JFRyAiSUNSIiAqLworCisjZGVmaW5lCUlDUl9PUFRJT05SRUdfU0VMRUNUCTB4MDEKKyNkZWZpbmUJSUNSX0VOQUJfQlJHX1pFUk9fSU5UCTB4MDIKKyNkZWZpbmUJSUNSX1VTRV9GU19GSUZPCQkweDA0CisjZGVmaW5lCUlDUl9FTkFCX0RDRF9JTlQJMHgwOAorI2RlZmluZQlJQ1JfRU5BQl9TWU5DX0lOVAkweDEwCisjZGVmaW5lCUlDUl9FTkFCX0NUU19JTlQJMHgyMAorI2RlZmluZQlJQ1JfRU5BQl9VTkRFUlJVTl9JTlQJMHg0MAorI2RlZmluZQlJQ1JfRU5BQl9CUkVBS19JTlQJMHg4MAorCisKKy8qIFJSMDogU1RBVFVTX1JFRyAiU1IiICovCisKKyNkZWZpbmUJU1JfQ0hBUl9BVkFJTAkJMHgwMQorI2RlZmluZQlTUl9CUkdfWkVSTwkJMHgwMgorI2RlZmluZQlTUl9UWF9CVUZfRU1QVFkJCTB4MDQKKyNkZWZpbmUJU1JfRENECQkJMHgwOAorI2RlZmluZQlTUl9TWU5DX0FCT1JUCQkweDEwCisjZGVmaW5lCVNSX0NUUwkJCTB4MjAKKyNkZWZpbmUJU1JfVFhfVU5ERVJSVU4JCTB4NDAKKyNkZWZpbmUJU1JfQlJFQUsJCTB4ODAKKworCisvKiBSUjE6IFNQQ09ORF9TVEFUVVNfUkVHICJTQ1NSIiAqLworCisjZGVmaW5lCVNDU1JfQUxMX1NFTlQJCTB4MDEKKyNkZWZpbmUJU0NTUl9SRVNJRFVBTF9NQVNLCTB4MGUKKyNkZWZpbmUJU0NTUl9QQVJJVFlfRVJSCQkweDEwCisjZGVmaW5lCVNDU1JfUlhfT1ZFUlJVTgkJMHgyMAorI2RlZmluZQlTQ1NSX0NSQ19GUkFNRV9FUlIJMHg0MAorI2RlZmluZQlTQ1NSX0VORF9PRl9GUkFNRQkweDgwCisKKworLyogUlIzOiBJTlRfUEVORElOR19SRUcgIklQUiIgKi8KKworI2RlZmluZQlJUFJfQl9FWFRTVEFUCQkweDAxCisjZGVmaW5lCUlQUl9CX1RYCQkweDAyCisjZGVmaW5lCUlQUl9CX1JYCQkweDA0CisjZGVmaW5lCUlQUl9BX0VYVFNUQVQJCTB4MDgKKyNkZWZpbmUJSVBSX0FfVFgJCTB4MTAKKyNkZWZpbmUJSVBSX0FfUlgJCTB4MjAKKworCisvKiBSUjc6IEZTX0ZJRk9fSElHSF9SRUcgIkZGSFIiICovCisKKyNkZWZpbmUJRkZIUl9DTlRfTUFTSwkJMHgzZgorI2RlZmluZQlGRkhSX0lTX0ZST01fRklGTwkweDQwCisjZGVmaW5lCUZGSFJfRklGT19PVkVSUlVOCTB4ODAKKworCisvKiBSUjEwOiBEUExMX1NUQVRVU19SRUcgIkRTUiIgKi8KKworI2RlZmluZQlEU1JfT05fTE9PUAkJMHgwMgorI2RlZmluZQlEU1JfT05fTE9PUF9TRU5ESU5HCTB4MTAKKyNkZWZpbmUJRFNSX1RXT19DTEtfTUlTU0lORwkweDQwCisjZGVmaW5lCURTUl9PTkVfQ0xLX01JU1NJTkcJMHg4MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgQWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogVGhlIFNDQyBuZWVkcyAzLjUgUENMSyBjeWNsZXMgcmVjb3ZlcnkgdGltZSBiZXR3ZWVuIHRvIHJlZ2lzdGVyCisgKiBhY2Nlc3Nlcy4gUENMSyBydW5zIHdpdGggOCBNSHogb24gYW4gQXRhcmksIHNvIHRoaXMgZGVsYXkgaXMgMy41ICoKKyAqIDEyNSBucyA9IDQzNy41IG5zLiBUaGlzIGlzIHRvbyBzaG9ydCBmb3IgdWRlbGF5KCkuCisgKiAxMC8xNi85NTogQSB0c3RiIG1mcC5wYXJfZHRfcmVnIHRha2VzIDYwMG5zIChzdXJlPykgYW5kIHRodXMgc2hvdWxkIGJlCisgKiBxdWl0ZSByaWdodAorICovCisKKyNkZWZpbmUgc2NjX3JlZ19kZWxheSgpIFwKKyAgICBkbyB7CQkJXAorCWlmIChNQUNIX0lTX01WTUUxNnggfHwgTUFDSF9JU19CVk1FNjAwMCB8fCBNQUNIX0lTX01WTUUxNDcpCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAiIG5vcDsgbm9wIik7CQkJXAorCWVsc2UgaWYgKE1BQ0hfSVNfQVRBUkkpCQkJCQkJXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJ0c3RiICUwIiA6IDogImciICgqX3NjY19kZWwpIDogImNjIiApO1wKKyAgICB9IHdoaWxlICgwKQorCitleHRlcm4gdW5zaWduZWQgY2hhciBzY2Nfc2hhZG93WzJdWzE2XTsKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgc2hvdWxkIHJlbGF4IHRoZSBzb21laG93IGNvbXBsaWNhdGVkCisgKiByZWdpc3RlciBhY2Nlc3Mgb2YgdGhlIFNDQy4gX1NDQ3dyaXRlKCkgc3RvcmVzIGFsbCB3cml0dGVuIHZhbHVlcworICogKGV4Y2VwdCBmb3IgV1IwIGFuZCBXUjgpIGluIHNoYWRvdyByZWdpc3RlcnMgZm9yIGxhdGVyIHJlY2FsbC4gVGhpcworICogcmVtb3ZlcyB0aGUgYnVyZGVuIG9mIHJlbWVtYmVyaW5nIHdyaXR0ZW4gdmFsdWVzIGFzIG5lZWRlZC4gVGhlCisgKiBleHRyYSB3b3JrIG9mIHN0b3JpbmcgdGhlIHZhbHVlIGRvZXNuJ3QgY291bnQsIHNpbmNlIGEgZGVsYXkgaXMKKyAqIG5lZWRlZCBhZnRlciBhIFNDQyBhY2Nlc3MgYW55d2F5LiBBZGRpdGlvbmFsbHksIF9TQ0N3cml0ZSgpIG1hbmFnZXMKKyAqIHdyaXRlcyB0byBXUjAgYW5kIFdSOCBkaWZmZXJlbnRseSwgYmVjYXVzZSB0aGVzZSBjYW4gYmUgYWNjZXNzZWQKKyAqIGRpcmVjdGx5IHdpdGggbGVzcyBvdmVyaGVhZC4gQW5vdGhlciBzcGVjaWFsIGNhc2UgYXJlIFdSNyBhbmQgV1I3Jy4KKyAqIF9TQ0N3cml0ZSBhdXRvbWF0aWNhbGx5IGNoZWNrcyB3aGF0IG9mIHRoaXMgcmVnaXN0ZXJzIGlzIHNlbGVjdGVkCisgKiBhbmQgY2hhbmdlcyBiMCBvZiBXUjE1IGlmIG5lZWRlZC4KKyAqIAorICogX1NDQ3JlYWQoKSBmb3Igc3RhbmRhcmQgcmVhZCByZWdpc3RlcnMgaXMgc3RyYWlnaHRmb3J3YXJkLCBleGNlcHQKKyAqIGZvciBSUjIgKHNwbGl0IGludG8gdHdvICJ2aXJ0dWFsIiByZWdpc3RlcnM6IG9uZSBmb3IgdGhlIHZhbHVlCisgKiB3cml0dGVuIHRvIFdSMiAoZnJvbSB0aGUgc2hhZG93KSBhbmQgb25lIGZvciB0aGUgdmVjdG9yIGluY2x1ZGluZworICogc3RhdHVzIGZyb20gUlIyLCBDaC4gQikgYW5kIFJSMy4gVGhlIGxhdHRlciBtdXN0IGJlIHJlYWQgZnJvbQorICogQ2hhbm5lbCBBLCBiZWNhdXNlIGl0IHJlYWRzIGFzIGFsbCB6ZXJvcyBvbiBDaC4gQi4gUlIwIGFuZCBSUjggY2FuCisgKiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBhcyBiZWZvcmUuCisgKiAKKyAqIFRoZSB0d28gaW5saW5lIGZ1bmN0aW9uIGNvbnRhaW4gY29tcGxpY2F0ZWQgc3dpdGNoIHN0YXRlbWVudHMuIEJ1dAorICogSSByZWx5IG9uIHJlZ25vIGFuZCBmaW5hbF9kZWxheSBiZWluZyBjb25zdGFudHMsIHNvIGdjYyBjYW4gcmVkdWNlCisgKiB0aGUgd2hvbGUgc3R1ZmYgdG8ganVzdCBzb21lIGFzc2VtYmxlciBzdGF0ZW1lbnRzLgorICogCisgKiBfU0NDd3JpdGUgYW5kIF9TQ0NyZWFkIGFyZW4ndCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IHVuZGVyCisgKiBub3JtYWwgY2lyY3Vtc3RhbmNlcy4gVGhlIG1hY3JvcyBTQ0NyZWFkW19ORF0gYW5kIFNDQ3dyaXRlW19ORF0gYXJlCisgKiBmb3IgdGhhdCBwdXJwb3NlLiBUaGV5IGFzc3VtZSB0aGF0IGEgbG9jYWwgdmFyaWFibGUgJ3BvcnQnIGlzCisgKiBkZWNsYXJlZCBhbmQgcG9pbnRpbmcgdG8gdGhlIHBvcnQncyBzY2Nfc3RydWN0IGVudHJ5LiBUaGUKKyAqIHZhcmlhbnRzIHdpdGggIl9OQiIgYXBwZW5kZWQgc2hvdWxkIGJlIHVzZWQgaWYgbm8gb3RoZXIgU0NDCisgKiBhY2Nlc3NlcyBmb2xsb3cgaW1tZWRpYXRlbHkgKHdpdGhpbiAwLjUgdXNlY3MpLiBUaGV5IGp1c3Qgc2tpcCB0aGUKKyAqIGZpbmFsIGRlbGF5IG5vcHMuCisgKiAKKyAqIFBsZWFzZSBub3RlIHRoYXQgYWNjZXNzZXMgdG8gU0NDIHJlZ2lzdGVycyBzaG91bGQgb25seSB0YWtlIHBsYWNlCisgKiB3aGVuIGludGVycnVwdHMgYXJlIHR1cm5lZCBvZmYgKGF0IGxlYXN0IGlmIFNDQyBpbnRlcnJ1cHRzIGFyZQorICogZW5hYmxlZCkuIE90aGVyd2lzZSwgYW4gaW50ZXJydXB0IGNvdWxkIGludGVyZmVyZSB3aXRoIHRoZQorICogdHdvLXN0YWdlIGFjY2Vzc2luZyBwcm9jZXNzLgorICoKKyAqLworCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX1NDQ3dyaXRlKAorCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCwKKwl1bnNpZ25lZCBjaGFyICpzaGFkb3csCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqX3NjY19kZWwsCisJaW50IHJlZ25vLAorCXVuc2lnbmVkIGNoYXIgdmFsLCBpbnQgZmluYWxfZGVsYXkgKQoreworCXN3aXRjaCggcmVnbm8gKSB7CisKKwkgIGNhc2UgQ09NTUFORF9SRUc6CisJCS8qIFdSMCBjYW4gYmUgd3JpdHRlbiBkaXJlY3RseSB3aXRob3V0IHBvaW50aW5nICovCisJCSpwb3J0LT5jdHJscCA9IHZhbDsKKwkJYnJlYWs7CisKKwkgIGNhc2UgU1lOQ19DSEFSX1JFRzoKKwkJLyogRm9yIFdSNywgZmlyc3Qgc2V0IGIwIG9mIFdSMTUgdG8gMCwgaWYgbmVlZGVkICovCisJCWlmIChzaGFkb3dbSU5UX0NUUkxfUkVHXSAmIElDUl9PUFRJT05SRUdfU0VMRUNUKSB7CisJCQkqcG9ydC0+Y3RybHAgPSAxNTsKKwkJCXNoYWRvd1tJTlRfQ1RSTF9SRUddICY9IH5JQ1JfT1BUSU9OUkVHX1NFTEVDVDsKKwkJCXNjY19yZWdfZGVsYXkoKTsKKwkJCSpwb3J0LT5jdHJscCA9IHNoYWRvd1tJTlRfQ1RSTF9SRUddOworCQkJc2NjX3JlZ19kZWxheSgpOworCQl9CisJCWdvdG8gbm9ybWFsX2Nhc2U7CisJCQorCSAgY2FzZSBTRExDX09QVElPTl9SRUc6CisJCS8qIEZvciBXUjcnLCBmaXJzdCBzZXQgYjAgb2YgV1IxNSB0byAxLCBpZiBuZWVkZWQgKi8KKwkJaWYgKCEoc2hhZG93W0lOVF9DVFJMX1JFR10gJiBJQ1JfT1BUSU9OUkVHX1NFTEVDVCkpIHsKKwkJCSpwb3J0LT5jdHJscCA9IDE1OworCQkJc2hhZG93W0lOVF9DVFJMX1JFR10gfD0gSUNSX09QVElPTlJFR19TRUxFQ1Q7CisJCQlzY2NfcmVnX2RlbGF5KCk7CisJCQkqcG9ydC0+Y3RybHAgPSBzaGFkb3dbSU5UX0NUUkxfUkVHXTsKKwkJCXNjY19yZWdfZGVsYXkoKTsKKwkJfQorCQkqcG9ydC0+Y3RybHAgPSA3OworCQlzaGFkb3dbOF0gPSB2YWw7CS8qIFdSNycgc2hhZG93ZWQgYXQgV1I4ICovCisJCXNjY19yZWdfZGVsYXkoKTsKKwkJKnBvcnQtPmN0cmxwID0gdmFsOworCQlicmVhazsKKworCSAgY2FzZSBUWF9EQVRBX1JFRzoJCS8qIFdSOCAqLworCQkvKiBUWF9EQVRBX1JFRyBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgb24gc29tZSBoL3cgKi8KKwkJaWYgKE1BQ0hfSVNfTVZNRTE2eCB8fCBNQUNIX0lTX0JWTUU2MDAwIHx8IE1BQ0hfSVNfTVZNRTE0NykKKwkJeworCQkJKnBvcnQtPmN0cmxwID0gcmVnbm87CisJCQlzY2NfcmVnX2RlbGF5KCk7CisJCQkqcG9ydC0+Y3RybHAgPSB2YWw7CisJCX0KKwkJZWxzZQorCQkJKnBvcnQtPmRhdGFwID0gdmFsOworCQlicmVhazsKKworCSAgY2FzZSBNQVNURVJfSU5UX0NUUkw6CisJCSpwb3J0LT5jdHJscCA9IHJlZ25vOworCQl2YWwgJj0gMHgzZjsJLyogYml0cyA2Li43IGFyZSB0aGUgcmVzZXQgY29tbWFuZHMgKi8KKwkJc2NjX3NoYWRvd1swXVtyZWdub10gPSB2YWw7CisJCXNjY19yZWdfZGVsYXkoKTsKKwkJKnBvcnQtPmN0cmxwID0gdmFsOworCQlicmVhazsKKworCSAgY2FzZSBEUExMX0NUUkxfUkVHOgorCQkqcG9ydC0+Y3RybHAgPSByZWdubzsKKwkJdmFsICY9IDB4MWY7CQkJLyogYml0cyA1Li43IGFyZSB0aGUgRFBMTCBjb21tYW5kcyAqLworCQlzaGFkb3dbcmVnbm9dID0gdmFsOworCQlzY2NfcmVnX2RlbGF5KCk7CisJCSpwb3J0LT5jdHJscCA9IHZhbDsKKwkJYnJlYWs7CisKKwkgIGNhc2UgMSAuLi4gNjoJCisJICBjYXNlIDEwIC4uLiAxMzoKKwkgIGNhc2UgMTU6CisJICBub3JtYWxfY2FzZToKKwkJKnBvcnQtPmN0cmxwID0gcmVnbm87CisJCXNoYWRvd1tyZWdub10gPSB2YWw7CisJCXNjY19yZWdfZGVsYXkoKTsKKwkJKnBvcnQtPmN0cmxwID0gdmFsOworCQlicmVhazsKKwkJCisJICBkZWZhdWx0OgorCQlwcmludGsoICJCYWQgU0NDIHdyaXRlIGFjY2VzcyB0byBXUiVkXG4iLCByZWdubyApOworCQlicmVhazsKKwkJCisJfQorCisJaWYgKGZpbmFsX2RlbGF5KQorCQlzY2NfcmVnX2RlbGF5KCk7Cit9CisKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBfU0NDcmVhZCgKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQsCisJdW5zaWduZWQgY2hhciAqc2hhZG93LAorCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKl9zY2NfZGVsLAorCWludCByZWdubywgaW50IGZpbmFsX2RlbGF5ICkKK3sKKwl1bnNpZ25lZCBjaGFyIHJ2OworCisJc3dpdGNoKCByZWdubyApIHsKKworCQkvKiAtLS0gcmVhbCByZWFkIHJlZ2lzdGVycyAtLS0gKi8KKwkgIGNhc2UgU1RBVFVTX1JFRzoKKwkJcnYgPSAqcG9ydC0+Y3RybHA7CisJCWJyZWFrOworCisJICBjYXNlIElOVF9QRU5ESU5HX1JFRzoKKwkJLyogUlIzOiByZWFkIG9ubHkgZnJvbSBDaGFubmVsIEEhICovCisJCXBvcnQgPSBwb3J0LT5wb3J0X2E7CisJCWdvdG8gbm9ybWFsX2Nhc2U7CisKKwkgIGNhc2UgUlhfREFUQV9SRUc6CisJCS8qIFJSOCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgb24gc29tZSBoL3cgKi8KKwkJaWYgKE1BQ0hfSVNfTVZNRTE2eCB8fCBNQUNIX0lTX0JWTUU2MDAwIHx8IE1BQ0hfSVNfTVZNRTE0NykKKwkJeworCQkJKnBvcnQtPmN0cmxwID0gODsKKwkJCXNjY19yZWdfZGVsYXkoKTsKKwkJCXJ2ID0gKnBvcnQtPmN0cmxwOworCQl9CisJCWVsc2UKKwkJCXJ2ID0gKnBvcnQtPmRhdGFwOworCQlicmVhazsKKworCSAgY2FzZSBDVVJSX1ZFQ1RPUl9SRUc6CisJCS8qIFJSMiAodmVjdG9yIGluY2x1ZGluZyBzdGF0dXMpIGZyb20gQ2guIEIgKi8KKwkJcG9ydCA9IHBvcnQtPnBvcnRfYjsKKwkJZ290byBub3JtYWxfY2FzZTsKKwkJCisJCS8qIC0tLSByZWFkaW5nIHdyaXRlIHJlZ2lzdGVyczogYWNjZXNzIHRoZSBzaGFkb3cgLS0tICovCisJICBjYXNlIDEgLi4uIDc6CisJICBjYXNlIDEwIC4uLiAxNToKKwkJcmV0dXJuIHNoYWRvd1tyZWdub107IC8qIG5vIGZpbmFsIGRlbGF5ISAqLworCisJCS8qIFdSNycgaXMgc3BlY2lhbCwgYmVjYXVzZSBpdCBpcyBzaGFkb3dlZCBhdCB0aGUgcGxhY2Ugb2YgV1I4ICovCisJICBjYXNlIFNETENfT1BUSU9OX1JFRzoKKwkJcmV0dXJuIHNoYWRvd1s4XTsgLyogbm8gZmluYWwgZGVsYXkhICovCisKKwkJLyogV1I5IGlzIHNwZWNpYWwgdG9vLCBiZWNhdXNlIGl0IGlzIGNvbW1vbiBmb3IgYm90aCBjaGFubmVscyAqLworCSAgY2FzZSBNQVNURVJfSU5UX0NUUkw6CisJCXJldHVybiBzY2Nfc2hhZG93WzBdWzldOyAvKiBubyBmaW5hbCBkZWxheSEgKi8KKworCSAgZGVmYXVsdDoKKwkJcHJpbnRrKCAiQmFkIFNDQyByZWFkIGFjY2VzcyB0byAlY1IlZFxuIiwgKHJlZ25vICYgMTYpID8gJ1InIDogJ1cnLAorCQkJCXJlZ25vICYgfjE2ICk7CisJCWJyZWFrOworCQkKKwkgIGNhc2UgU1BDT05EX1NUQVRVU19SRUc6CisJICBjYXNlIEZTX0ZJRk9fTE9XX1JFRzoKKwkgIGNhc2UgRlNfRklGT19ISUdIX1JFRzoKKwkgIGNhc2UgRFBMTF9TVEFUVVNfUkVHOgorCSAgbm9ybWFsX2Nhc2U6CisJCSpwb3J0LT5jdHJscCA9IHJlZ25vICYgMHgwZjsKKwkJc2NjX3JlZ19kZWxheSgpOworCQlydiA9ICpwb3J0LT5jdHJscDsKKwkJYnJlYWs7CisJCQorCX0KKworCWlmIChmaW5hbF9kZWxheSkKKwkJc2NjX3JlZ19kZWxheSgpOworCXJldHVybiBydjsKK30KKworI2RlZmluZSBTQ0NfQUNDRVNTX0lOSVQocG9ydCkJCQkJCQlcCisJdW5zaWduZWQgY2hhciAqX3NjY19zaGFkb3cgPSAmc2NjX3NoYWRvd1twb3J0LT5jaGFubmVsXVswXQorCisjZGVmaW5lCVNDQ3dyaXRlKHJlZyx2YWwpCV9TQ0N3cml0ZShwb3J0LF9zY2Nfc2hhZG93LHNjY19kZWwsKHJlZyksKHZhbCksMSkKKyNkZWZpbmUJU0NDd3JpdGVfTkIocmVnLHZhbCkJX1NDQ3dyaXRlKHBvcnQsX3NjY19zaGFkb3csc2NjX2RlbCwocmVnKSwodmFsKSwwKQorI2RlZmluZQlTQ0NyZWFkKHJlZykJCV9TQ0NyZWFkKHBvcnQsX3NjY19zaGFkb3csc2NjX2RlbCwocmVnKSwxKQorI2RlZmluZQlTQ0NyZWFkX05CKHJlZykJCV9TQ0NyZWFkKHBvcnQsX3NjY19zaGFkb3csc2NjX2RlbCwocmVnKSwwKQorCisjZGVmaW5lIFNDQ21vZChyZWcsYW5kLG9yKQlTQ0N3cml0ZSgocmVnKSwoU0NDcmVhZChyZWcpJihhbmQpKXwob3IpKQorCisjZW5kaWYgLyogX1NDQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc2N4MjAwX2dwaW8uYyBiL2RyaXZlcnMvY2hhci9zY3gyMDBfZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NGE2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc2N4MjAwX2dwaW8uYwpAQCAtMCwwICsxLDE0OSBAQAorLyogbGludXgvZHJpdmVycy9jaGFyL3NjeDIwMF9ncGlvLmMgCisKKyAgIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgU0N4MjAwIEdQSU8gZHJpdmVyLiAgQWxsb3dzIGEgdXNlciBzcGFjZQorICAgcHJvY2VzcyB0byBwbGF5IHdpdGggdGhlIEdQSU8gcGlucy4KKworICAgQ29weXJpZ2h0IChjKSAyMDAxLDIwMDIgQ2hyaXN0ZXIgV2VpbmlnZWwgPHdpbmdlbEBuYW5vLXN5c3RlbS5jb20+ICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zY3gyMDBfZ3Bpby5oPgorCisjZGVmaW5lIE5BTUUgInNjeDIwMF9ncGlvIgorCitNT0RVTEVfQVVUSE9SKCJDaHJpc3RlciBXZWluaWdlbCA8d2luZ2VsQG5hbm8tc3lzdGVtLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTmF0U2VtaSBTQ3gyMDAgR1BJTyBQaW4gRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgbWFqb3IgPSAwOwkJLyogZGVmYXVsdCB0byBkeW5hbWljIG1ham9yICovCittb2R1bGVfcGFyYW0obWFqb3IsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1ham9yLCAiTWFqb3IgZGV2aWNlIG51bWJlciIpOworCitzdGF0aWMgc3NpemVfdCBzY3gyMDBfZ3Bpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsIAorCQkJCSBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbSA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJY2hhciBjOworCQlpZiAoZ2V0X3VzZXIoYywgZGF0YStpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzd2l0Y2ggKGMpCisJCXsKKwkJY2FzZSAnMCc6IAorCQkJc2N4MjAwX2dwaW9fc2V0KG0sIDApOyAKKwkJCWJyZWFrOworCQljYXNlICcxJzogCisJCQlzY3gyMDBfZ3Bpb19zZXQobSwgMSk7IAorCQkJYnJlYWs7CisJCWNhc2UgJ08nOgorCQkJcHJpbnRrKEtFUk5fSU5GTyBOQU1FICI6IEdQSU8lZCBvdXRwdXQgZW5hYmxlZFxuIiwgbSk7CisJCQlzY3gyMDBfZ3Bpb19jb25maWd1cmUobSwgfjEsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJcHJpbnRrKEtFUk5fSU5GTyBOQU1FICI6IEdQSU8lZCBvdXRwdXQgZGlzYWJsZWRcbiIsIG0pOworCQkJc2N4MjAwX2dwaW9fY29uZmlndXJlKG0sIH4xLCAwKTsKKwkJCWJyZWFrOworCQljYXNlICdUJzoKKwkJCXByaW50ayhLRVJOX0lORk8gTkFNRSAiOiBHUElPJWQgb3V0cHV0IGlzIHB1c2ggcHVsbFxuIiwgbSk7CisJCQlzY3gyMDBfZ3Bpb19jb25maWd1cmUobSwgfjIsIDIpOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJcHJpbnRrKEtFUk5fSU5GTyBOQU1FICI6IEdQSU8lZCBvdXRwdXQgaXMgb3BlbiBkcmFpblxuIiwgbSk7CisJCQlzY3gyMDBfZ3Bpb19jb25maWd1cmUobSwgfjIsIDApOworCQkJYnJlYWs7CisJCWNhc2UgJ1AnOgorCQkJcHJpbnRrKEtFUk5fSU5GTyBOQU1FICI6IEdQSU8lZCBwdWxsIHVwIGVuYWJsZWRcbiIsIG0pOworCQkJc2N4MjAwX2dwaW9fY29uZmlndXJlKG0sIH40LCA0KTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCXByaW50ayhLRVJOX0lORk8gTkFNRSAiOiBHUElPJWQgcHVsbCB1cCBkaXNhYmxlZFxuIiwgbSk7CisJCQlzY3gyMDBfZ3Bpb19jb25maWd1cmUobSwgfjQsIDApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBzY3gyMDBfZ3Bpb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBtID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlpbnQgdmFsdWU7CisKKwl2YWx1ZSA9IHNjeDIwMF9ncGlvX2dldChtKTsKKwlpZiAocHV0X3VzZXIodmFsdWUgPyAnMScgOiAnMCcsIGJ1ZikpCisJCXJldHVybiAtRUZBVUxUOworCQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNjeDIwMF9ncGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgbSA9IGltaW5vcihpbm9kZSk7CisJaWYgKG0gPiA2MykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHNjeDIwMF9ncGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2N4MjAwX2dwaW9fZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS53cml0ZSAgID0gc2N4MjAwX2dwaW9fd3JpdGUsCisJLnJlYWQgICAgPSBzY3gyMDBfZ3Bpb19yZWFkLAorCS5vcGVuICAgID0gc2N4MjAwX2dwaW9fb3BlbiwKKwkucmVsZWFzZSA9IHNjeDIwMF9ncGlvX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzY3gyMDBfZ3Bpb19pbml0KHZvaWQpCit7CisJaW50IHI7CisKKwlwcmludGsoS0VSTl9ERUJVRyBOQU1FICI6IE5hdFNlbWkgU0N4MjAwIEdQSU8gRHJpdmVyXG4iKTsKKworCWlmICghc2N4MjAwX2dwaW9fcHJlc2VudCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiBOQU1FICI6IG5vIFNDeDIwMCBncGlvIHBpbnMgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJciA9IHJlZ2lzdGVyX2NocmRldihtYWpvciwgTkFNRSwgJnNjeDIwMF9ncGlvX2ZvcHMpOworCWlmIChyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgTkFNRSAiOiB1bmFibGUgdG8gcmVnaXN0ZXIgY2hhcmFjdGVyIGRldmljZVxuIik7CisJCXJldHVybiByOworCX0KKwlpZiAoIW1ham9yKSB7CisJCW1ham9yID0gcjsKKwkJcHJpbnRrKEtFUk5fREVCVUcgTkFNRSAiOiBnb3QgZHluYW1pYyBtYWpvciAlZFxuIiwgbWFqb3IpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2N4MjAwX2dwaW9fY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfY2hyZGV2KG1ham9yLCBOQU1FKTsKK30KKworbW9kdWxlX2luaXQoc2N4MjAwX2dwaW9faW5pdCk7Cittb2R1bGVfZXhpdChzY3gyMDBfZ3Bpb19jbGVhbnVwKTsKKworLyoKKyAgICBMb2NhbCB2YXJpYWJsZXM6CisgICAgICAgIGNvbXBpbGUtY29tbWFuZDogIm1ha2UgLWsgLUMgLi4vLi4gU1VCRElSUz1kcml2ZXJzL2NoYXIgbW9kdWxlcyIKKyAgICAgICAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAgICBFbmQ6CisqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jIGIvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZDYzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc2VsZWN0aW9uLmMKQEAgLTAsMCArMSwzMDYgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2NoYXIvc2VsZWN0aW9uLmMKKyAqCisgKiBUaGlzIG1vZHVsZSBleHBvcnRzIHRoZSBmdW5jdGlvbnM6CisgKgorICogICAgICdpbnQgc2V0X3NlbGVjdGlvbihzdHJ1Y3QgdGlvY2xfc2VsZWN0aW9uIF9fdXNlciAqLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqKScKKyAqICAgICAndm9pZCBjbGVhcl9zZWxlY3Rpb24odm9pZCknCisgKiAgICAgJ2ludCBwYXN0ZV9zZWxlY3Rpb24oc3RydWN0IHR0eV9zdHJ1Y3QgKiknCisgKiAgICAgJ2ludCBzZWxfbG9hZGx1dChjaGFyIF9fdXNlciAqKScKKyAqCisgKiBOb3cgdGhhdCAvZGV2L3ZjcyBleGlzdHMsIG1vc3Qgb2YgdGhpcyBjYW4gZGlzYXBwZWFyIGFnYWluLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGVtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWxlY3Rpb24uaD4KKyNpbmNsdWRlIDxsaW51eC90aW9jbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKworLyogRG9uJ3QgdGFrZSB0aGlzIGZyb20gPGN0eXBlLmg+OiAwMTEtMDE1IG9uIHRoZSBzY3JlZW4gYXJlbid0IHNwYWNlcyAqLworI2RlZmluZSBpc3NwYWNlKGMpCSgoYykgPT0gJyAnKQorCitleHRlcm4gdm9pZCBwb2tlX2JsYW5rZWRfY29uc29sZSh2b2lkKTsKKworLyogVmFyaWFibGVzIGZvciBzZWxlY3Rpb24gY29udHJvbC4gKi8KKy8qIFVzZSBhIGR5bmFtaWMgYnVmZmVyLCBpbnN0ZWFkIG9mIHN0YXRpYyAoRGVjIDE5OTQpICovCitzdHJ1Y3QgdmNfZGF0YSAqc2VsX2NvbnM7CQkvKiBtdXN0IG5vdCBiZSBkaXNhbGxvY2F0ZWQgKi8KK3N0YXRpYyB2b2xhdGlsZSBpbnQgc2VsX3N0YXJ0ID0gLTE7IAkvKiBjbGVhcmVkIGJ5IGNsZWFyX3NlbGVjdGlvbiAqLworc3RhdGljIGludCBzZWxfZW5kOworc3RhdGljIGludCBzZWxfYnVmZmVyX2x0aDsKK3N0YXRpYyBjaGFyICpzZWxfYnVmZmVyOworCisvKiBjbGVhcl9zZWxlY3Rpb24sIGhpZ2hsaWdodCBhbmQgaGlnaGxpZ2h0X3BvaW50ZXIgY2FuIGJlIGNhbGxlZAorICAgZnJvbSBpbnRlcnJ1cHQgKHZpYSBzY3JvbGxiYWNrL2Zyb250KSAqLworCisvKiBzZXQgcmV2ZXJzZSB2aWRlbyBvbiBjaGFyYWN0ZXJzIHMtZSBvZiBjb25zb2xlIHdpdGggc2VsZWN0aW9uLiAqLworc3RhdGljIGlubGluZSB2b2lkIGhpZ2hsaWdodChjb25zdCBpbnQgcywgY29uc3QgaW50IGUpCit7CisJaW52ZXJ0X3NjcmVlbihzZWxfY29ucywgcywgZS1zKzIsIDEpOworfQorCisvKiB1c2UgY29tcGxlbWVudGFyeSBjb2xvciB0byBzaG93IHRoZSBwb2ludGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGlnaGxpZ2h0X3BvaW50ZXIoY29uc3QgaW50IHdoZXJlKQoreworCWNvbXBsZW1lbnRfcG9zKHNlbF9jb25zLCB3aGVyZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitzZWxfcG9zKGludCBuKQoreworCXJldHVybiBpbnZlcnNlX3RyYW5zbGF0ZShzZWxfY29ucywgc2NyZWVuX2dseXBoKHNlbF9jb25zLCBuKSk7Cit9CisKKy8qIHJlbW92ZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gaGlnaGxpZ2h0LCBpZiBhbnksCisgICBmcm9tIHRoZSBjb25zb2xlIGhvbGRpbmcgdGhlIHNlbGVjdGlvbi4gKi8KK3ZvaWQKK2NsZWFyX3NlbGVjdGlvbih2b2lkKSB7CisJaGlnaGxpZ2h0X3BvaW50ZXIoLTEpOyAvKiBoaWRlIHRoZSBwb2ludGVyICovCisJaWYgKHNlbF9zdGFydCAhPSAtMSkgeworCQloaWdobGlnaHQoc2VsX3N0YXJ0LCBzZWxfZW5kKTsKKwkJc2VsX3N0YXJ0ID0gLTE7CisJfQorfQorCisvKgorICogVXNlciBzZXR0YWJsZSB0YWJsZTogd2hhdCBjaGFyYWN0ZXJzIGFyZSB0byBiZSBjb25zaWRlcmVkIGFscGhhYmV0aWM/CisgKiAyNTYgYml0cworICovCitzdGF0aWMgdTMyIGlud29yZEx1dFs4XT17CisgIDB4MDAwMDAwMDAsIC8qIGNvbnRyb2wgY2hhcnMgICAgICovCisgIDB4MDNGRjAwMDAsIC8qIGRpZ2l0cyAgICAgICAgICAgICovCisgIDB4ODdGRkZGRkUsIC8qIHVwcGVyY2FzZSBhbmQgJ18nICovCisgIDB4MDdGRkZGRkUsIC8qIGxvd2VyY2FzZSAgICAgICAgICovCisgIDB4MDAwMDAwMDAsCisgIDB4MDAwMDAwMDAsCisgIDB4RkY3RkZGRkYsIC8qIGxhdGluLTEgYWNjZW50ZWQgbGV0dGVycywgbm90IG11bHRpcGxpY2F0aW9uIHNpZ24gKi8KKyAgMHhGRjdGRkZGRiAgLyogbGF0aW4tMSBhY2NlbnRlZCBsZXR0ZXJzLCBub3QgZGl2aXNpb24gc2lnbiAqLworfTsKKworc3RhdGljIGlubGluZSBpbnQgaW53b3JkKGNvbnN0IHVuc2lnbmVkIGNoYXIgYykgeworCXJldHVybiAoIGlud29yZEx1dFtjPj41XSA+PiAoYyAmIDB4MUYpICkgJiAxOworfQorCisvKiBzZXQgaW53b3JkTHV0IGNvbnRlbnRzLiBJbnZva2VkIGJ5IGlvY3RsKCkuICovCitpbnQgc2VsX2xvYWRsdXQoY2hhciBfX3VzZXIgKnApCit7CisJcmV0dXJuIGNvcHlfZnJvbV91c2VyKGlud29yZEx1dCwgKHUzMiBfX3VzZXIgKikocCs0KSwgMzIpID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qIGRvZXMgc2NyZWVuIGFkZHJlc3MgcCBjb3JyZXNwb25kIHRvIGNoYXJhY3RlciBhdCBMSC9SSCBlZGdlIG9mIHNjcmVlbj8gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0ZWRnZShjb25zdCBpbnQgcCwgaW50IHNpemVfcm93KQoreworCXJldHVybiAoIShwICUgc2l6ZV9yb3cpCXx8ICEoKHAgKyAyKSAlIHNpemVfcm93KSk7Cit9CisKKy8qIGNvbnN0cmFpbiB2IHN1Y2ggdGhhdCB2IDw9IHUgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgbGltaXQoY29uc3QgdW5zaWduZWQgc2hvcnQgdiwgY29uc3QgdW5zaWduZWQgc2hvcnQgdSkKK3sKKwlyZXR1cm4gKHYgPiB1KSA/IHUgOiB2OworfQorCisvKiBzZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBJbnZva2VkIGJ5IGlvY3RsKCkgb3IgYnkga2VybmVsIGNvZGUuICovCitpbnQgc2V0X3NlbGVjdGlvbihjb25zdCBzdHJ1Y3QgdGlvY2xfc2VsZWN0aW9uIF9fdXNlciAqc2VsLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB2Y19kYXRhICp2YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKKwlpbnQgc2VsX21vZGUsIG5ld19zZWxfc3RhcnQsIG5ld19zZWxfZW5kLCBzcGM7CisJY2hhciAqYnAsICpvYnA7CisJaW50IGksIHBzLCBwZTsKKworCXBva2VfYmxhbmtlZF9jb25zb2xlKCk7CisKKwl7IHVuc2lnbmVkIHNob3J0IHhzLCB5cywgeGUsIHllOworCisJICBpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgc2VsLCBzaXplb2YoKnNlbCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkgIF9fZ2V0X3VzZXIoeHMsICZzZWwtPnhzKTsKKwkgIF9fZ2V0X3VzZXIoeXMsICZzZWwtPnlzKTsKKwkgIF9fZ2V0X3VzZXIoeGUsICZzZWwtPnhlKTsKKwkgIF9fZ2V0X3VzZXIoeWUsICZzZWwtPnllKTsKKwkgIF9fZ2V0X3VzZXIoc2VsX21vZGUsICZzZWwtPnNlbF9tb2RlKTsKKwkgIHhzLS07IHlzLS07IHhlLS07IHllLS07CisJICB4cyA9IGxpbWl0KHhzLCB2Yy0+dmNfY29scyAtIDEpOworCSAgeXMgPSBsaW1pdCh5cywgdmMtPnZjX3Jvd3MgLSAxKTsKKwkgIHhlID0gbGltaXQoeGUsIHZjLT52Y19jb2xzIC0gMSk7CisJICB5ZSA9IGxpbWl0KHllLCB2Yy0+dmNfcm93cyAtIDEpOworCSAgcHMgPSB5cyAqIHZjLT52Y19zaXplX3JvdyArICh4cyA8PCAxKTsKKwkgIHBlID0geWUgKiB2Yy0+dmNfc2l6ZV9yb3cgKyAoeGUgPDwgMSk7CisKKwkgIGlmIChzZWxfbW9kZSA9PSBUSU9DTF9TRUxDTEVBUikgeworCSAgICAgIC8qIHVzZWZ1bCBmb3Igc2NyZWVuZHVtcCB3aXRob3V0IHNlbGVjdGlvbiBoaWdobGlnaHRzICovCisJICAgICAgY2xlYXJfc2VsZWN0aW9uKCk7CisJICAgICAgcmV0dXJuIDA7CisJICB9CisKKwkgIGlmIChtb3VzZV9yZXBvcnRpbmcoKSAmJiAoc2VsX21vZGUgJiBUSU9DTF9TRUxNT1VTRVJFUE9SVCkpIHsKKwkgICAgICBtb3VzZV9yZXBvcnQodHR5LCBzZWxfbW9kZSAmIFRJT0NMX1NFTEJVVFRPTk1BU0ssIHhzLCB5cyk7CisJICAgICAgcmV0dXJuIDA7CisJICB9CisgICAgICAgIH0KKworCWlmIChwcyA+IHBlKQkvKiBtYWtlIHNlbF9zdGFydCA8PSBzZWxfZW5kICovCisJeworCQlpbnQgdG1wID0gcHM7CisJCXBzID0gcGU7CisJCXBlID0gdG1wOworCX0KKworCWlmIChzZWxfY29ucyAhPSB2Y19jb25zW2ZnX2NvbnNvbGVdLmQpIHsKKwkJY2xlYXJfc2VsZWN0aW9uKCk7CisJCXNlbF9jb25zID0gdmNfY29uc1tmZ19jb25zb2xlXS5kOworCX0KKworCXN3aXRjaCAoc2VsX21vZGUpCisJeworCQljYXNlIFRJT0NMX1NFTENIQVI6CS8qIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgc2VsZWN0aW9uICovCisJCQluZXdfc2VsX3N0YXJ0ID0gcHM7CisJCQluZXdfc2VsX2VuZCA9IHBlOworCQkJYnJlYWs7CisJCWNhc2UgVElPQ0xfU0VMV09SRDoJLyogd29yZC1ieS13b3JkIHNlbGVjdGlvbiAqLworCQkJc3BjID0gaXNzcGFjZShzZWxfcG9zKHBzKSk7CisJCQlmb3IgKG5ld19zZWxfc3RhcnQgPSBwczsgOyBwcyAtPSAyKQorCQkJeworCQkJCWlmICgoc3BjICYmICFpc3NwYWNlKHNlbF9wb3MocHMpKSkgfHwKKwkJCQkgICAgKCFzcGMgJiYgIWlud29yZChzZWxfcG9zKHBzKSkpKQorCQkJCQlicmVhazsKKwkJCQluZXdfc2VsX3N0YXJ0ID0gcHM7CisJCQkJaWYgKCEocHMgJSB2Yy0+dmNfc2l6ZV9yb3cpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXNwYyA9IGlzc3BhY2Uoc2VsX3BvcyhwZSkpOworCQkJZm9yIChuZXdfc2VsX2VuZCA9IHBlOyA7IHBlICs9IDIpCisJCQl7CisJCQkJaWYgKChzcGMgJiYgIWlzc3BhY2Uoc2VsX3BvcyhwZSkpKSB8fAorCQkJCSAgICAoIXNwYyAmJiAhaW53b3JkKHNlbF9wb3MocGUpKSkpCisJCQkJCWJyZWFrOworCQkJCW5ld19zZWxfZW5kID0gcGU7CisJCQkJaWYgKCEoKHBlICsgMikgJSB2Yy0+dmNfc2l6ZV9yb3cpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJT0NMX1NFTExJTkU6CS8qIGxpbmUtYnktbGluZSBzZWxlY3Rpb24gKi8KKwkJCW5ld19zZWxfc3RhcnQgPSBwcyAtIHBzICUgdmMtPnZjX3NpemVfcm93OworCQkJbmV3X3NlbF9lbmQgPSBwZSArIHZjLT52Y19zaXplX3JvdworCQkJCSAgICAtIHBlICUgdmMtPnZjX3NpemVfcm93IC0gMjsKKwkJCWJyZWFrOworCQljYXNlIFRJT0NMX1NFTFBPSU5URVI6CisJCQloaWdobGlnaHRfcG9pbnRlcihwZSk7CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHJlbW92ZSB0aGUgcG9pbnRlciAqLworCWhpZ2hsaWdodF9wb2ludGVyKC0xKTsKKworCS8qIHNlbGVjdCB0byBlbmQgb2YgbGluZSBpZiBvbiB0cmFpbGluZyBzcGFjZSAqLworCWlmIChuZXdfc2VsX2VuZCA+IG5ld19zZWxfc3RhcnQgJiYKKwkJIWF0ZWRnZShuZXdfc2VsX2VuZCwgdmMtPnZjX3NpemVfcm93KSAmJgorCQlpc3NwYWNlKHNlbF9wb3MobmV3X3NlbF9lbmQpKSkgeworCQlmb3IgKHBlID0gbmV3X3NlbF9lbmQgKyAyOyA7IHBlICs9IDIpCisJCQlpZiAoIWlzc3BhY2Uoc2VsX3BvcyhwZSkpIHx8CisJCQkgICAgYXRlZGdlKHBlLCB2Yy0+dmNfc2l6ZV9yb3cpKQorCQkJCWJyZWFrOworCQlpZiAoaXNzcGFjZShzZWxfcG9zKHBlKSkpCisJCQluZXdfc2VsX2VuZCA9IHBlOworCX0KKwlpZiAoc2VsX3N0YXJ0ID09IC0xKQkvKiBubyBjdXJyZW50IHNlbGVjdGlvbiAqLworCQloaWdobGlnaHQobmV3X3NlbF9zdGFydCwgbmV3X3NlbF9lbmQpOworCWVsc2UgaWYgKG5ld19zZWxfc3RhcnQgPT0gc2VsX3N0YXJ0KQorCXsKKwkJaWYgKG5ld19zZWxfZW5kID09IHNlbF9lbmQpCS8qIG5vIGFjdGlvbiByZXF1aXJlZCAqLworCQkJcmV0dXJuIDA7CisJCWVsc2UgaWYgKG5ld19zZWxfZW5kID4gc2VsX2VuZCkJLyogZXh0ZW5kIHRvIHJpZ2h0ICovCisJCQloaWdobGlnaHQoc2VsX2VuZCArIDIsIG5ld19zZWxfZW5kKTsKKwkJZWxzZQkJCQkvKiBjb250cmFjdCBmcm9tIHJpZ2h0ICovCisJCQloaWdobGlnaHQobmV3X3NlbF9lbmQgKyAyLCBzZWxfZW5kKTsKKwl9CisJZWxzZSBpZiAobmV3X3NlbF9lbmQgPT0gc2VsX2VuZCkKKwl7CisJCWlmIChuZXdfc2VsX3N0YXJ0IDwgc2VsX3N0YXJ0KQkvKiBleHRlbmQgdG8gbGVmdCAqLworCQkJaGlnaGxpZ2h0KG5ld19zZWxfc3RhcnQsIHNlbF9zdGFydCAtIDIpOworCQllbHNlCQkJCS8qIGNvbnRyYWN0IGZyb20gbGVmdCAqLworCQkJaGlnaGxpZ2h0KHNlbF9zdGFydCwgbmV3X3NlbF9zdGFydCAtIDIpOworCX0KKwllbHNlCS8qIHNvbWUgb3RoZXIgY2FzZTsgc3RhcnQgc2VsZWN0aW9uIGZyb20gc2NyYXRjaCAqLworCXsKKwkJY2xlYXJfc2VsZWN0aW9uKCk7CisJCWhpZ2hsaWdodChuZXdfc2VsX3N0YXJ0LCBuZXdfc2VsX2VuZCk7CisJfQorCXNlbF9zdGFydCA9IG5ld19zZWxfc3RhcnQ7CisJc2VsX2VuZCA9IG5ld19zZWxfZW5kOworCisJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIGJlZm9yZSBmcmVlaW5nIHRoZSBvbGQgb25lIC4uLiAqLworCWJwID0ga21hbGxvYygoc2VsX2VuZC1zZWxfc3RhcnQpLzIrMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFicCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzZWxlY3Rpb246IGttYWxsb2MoKSBmYWlsZWRcbiIpOworCQljbGVhcl9zZWxlY3Rpb24oKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmIChzZWxfYnVmZmVyKQorCQlrZnJlZShzZWxfYnVmZmVyKTsKKwlzZWxfYnVmZmVyID0gYnA7CisKKwlvYnAgPSBicDsKKwlmb3IgKGkgPSBzZWxfc3RhcnQ7IGkgPD0gc2VsX2VuZDsgaSArPSAyKSB7CisJCSpicCA9IHNlbF9wb3MoaSk7CisJCWlmICghaXNzcGFjZSgqYnArKykpCisJCQlvYnAgPSBicDsKKwkJaWYgKCEgKChpICsgMikgJSB2Yy0+dmNfc2l6ZV9yb3cpKSB7CisJCQkvKiBzdHJpcCB0cmFpbGluZyBibGFua3MgZnJvbSBsaW5lIGFuZCBhZGQgbmV3bGluZSwKKwkJCSAgIHVubGVzcyBub24tc3BhY2UgYXQgZW5kIG9mIGxpbmUuICovCisJCQlpZiAob2JwICE9IGJwKSB7CisJCQkJYnAgPSBvYnA7CisJCQkJKmJwKysgPSAnXHInOworCQkJfQorCQkJb2JwID0gYnA7CisJCX0KKwl9CisJc2VsX2J1ZmZlcl9sdGggPSBicCAtIHNlbF9idWZmZXI7CisJcmV0dXJuIDA7Cit9CisKKy8qIEluc2VydCB0aGUgY29udGVudHMgb2YgdGhlIHNlbGVjdGlvbiBidWZmZXIgaW50byB0aGUKKyAqIHF1ZXVlIG9mIHRoZSB0dHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGNvbnNvbGUuCisgKiBJbnZva2VkIGJ5IGlvY3RsKCkuCisgKi8KK2ludCBwYXN0ZV9zZWxlY3Rpb24oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdmNfZGF0YSAqdmMgPSAoc3RydWN0IHZjX2RhdGEgKil0dHktPmRyaXZlcl9kYXRhOworCWludAlwYXN0ZWQgPSAwLCBjb3VudDsKKwlzdHJ1Y3QgIHR0eV9sZGlzYyAqbGQ7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJcG9rZV9ibGFua2VkX2NvbnNvbGUoKTsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisKKwlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOworCQorCWFkZF93YWl0X3F1ZXVlKCZ2Yy0+cGFzdGVfd2FpdCwgJndhaXQpOworCXdoaWxlIChzZWxfYnVmZmVyICYmIHNlbF9idWZmZXJfbHRoID4gcGFzdGVkKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICh0ZXN0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykpIHsKKwkJCXNjaGVkdWxlKCk7CisJCQljb250aW51ZTsKKwkJfQorCQljb3VudCA9IHNlbF9idWZmZXJfbHRoIC0gcGFzdGVkOworCQljb3VudCA9IG1pbihjb3VudCwgdHR5LT5sZGlzYy5yZWNlaXZlX3Jvb20odHR5KSk7CisJCXR0eS0+bGRpc2MucmVjZWl2ZV9idWYodHR5LCBzZWxfYnVmZmVyICsgcGFzdGVkLCBOVUxMLCBjb3VudCk7CisJCXBhc3RlZCArPSBjb3VudDsKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJnZjLT5wYXN0ZV93YWl0LCAmd2FpdCk7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisKKwl0dHlfbGRpc2NfZGVyZWYobGQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMi5jIGIvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNGU5ZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMi5jCkBAIC0wLDAgKzEsODI1IEBACisvKiBkcml2ZXJzL2NoYXIvc2VyX2EyMjMyLmMgKi8KKworLyogJElkOiBzZXJfYTIyMzIuYyx2IDAuNCAyMDAwLzAxLzI1IDEyOjAwOjAwIGVoYWFzZSBFeHAgJCAqLworCisvKiBMaW51eCBzZXJpYWwgZHJpdmVyIGZvciB0aGUgQW1pZ2EgQTIyMzIgYm9hcmQgKi8KKworLyogVGhpcyBkcml2ZXIgaXMgTUFJTlRBSU5FRC4gQmVmb3JlIGFwcGx5aW5nIGFueSBjaGFuZ2VzLCBwbGVhc2UgY29udGFjdAorICogdGhlIGF1dGhvci4KKyAqLworCisvKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBFbnZlciBIYWFzZSAgICA8ZWhhYXNlQGluZi5mdS1iZXJsaW4uZGU+CisgKiAgICAgICAgICAgICAgICAgICBhbGlhcyBUaGUgQTIyMzIgZHJpdmVyIHByb2plY3QgPEEyMjMyQGdteC5uZXQ+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEb2N1bWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIGRyaXZlciBpcyBpbiBFWFBFUklNRU5UQUwgc3RhdGUuIFRoYXQgbWVhbnMgSSBjb3VsZCBub3QgZmluZAorICogc29tZW9uZSB3aXRoIGZpdmUgQTIyMzIgYm9hcmRzIHdpdGggMzUgcG9ydHMgcnVubmluZyBhdCAxOTIwMCBicHMKKyAqIGF0IHRoZSBzYW1lIHRpbWUgYW5kIHRlc3QgdGhlIG1hY2hpbmUncyBiZWhhdmlvdXIuCisgKiBIb3dldmVyLCBJIGtub3cgdGhhdCB5b3UgY2FuIHBlcmZvcm1hbmNlLXR3ZWFrIHRoaXMgZHJpdmVyIChzZWUKKyAqIHRoZSBzb3VyY2UgY29kZSkuCisgKiBPbmUgdGhpbmcgdG8gY29uc2lkZXIgaXMgdGhlIHRpbWUgdGhpcyBkcml2ZXIgY29uc3VtZXMgZHVyaW5nIHRoZQorICogQW1pZ2EncyB2ZXJ0aWNhbCBibGFuayBpbnRlcnJ1cHQuIEV2ZXJ5dGhpbmcgdGhhdCBpcyB0byBiZSBkb25lCisgKiBfSVMgRE9ORV8gd2hlbiBlbnRlcmluZyB0aGUgdmVydGljYWwgYmxhbmsgaW50ZXJydXB0IGhhbmRsZXIgb2YKKyAqIHRoaXMgZHJpdmVyLgorICogSG93ZXZlciwgaXQgd291bGQgYmUgbW9yZSBzYW5lIHRvIG9ubHkgZG8gdGhlIGpvYiBmb3Igb25seSBPTkUgY2FyZAorICogaW5zdGVhZCBvZiBBTEwgY2FyZHMgYXQgYSB0aW1lOyBvciwgbW9yZSBnZW5lcmFsbHksIHRvIGhhbmRsZSBvbmx5CisgKiBTT01FIHBvcnRzIGluc3RlYWQgb2YgQUxMIHBvcnRzIGF0IGEgdGltZS4KKyAqIEhvd2V2ZXIsIGFzIGxvbmcgYXMgbm8tb25lIHJ1bnMgaW50byBwcm9ibGVtcyBJIGd1ZXNzIEkgc2hvdWxkbid0CisgKiBjaGFuZ2UgdGhlIGRyaXZlciBhcyBpdCBydW5zIGZpbmUgZm9yIG1lIDopIC4KKyAqCisgKiBWZXJzaW9uIGhpc3Rvcnkgb2YgdGhpcyBmaWxlOgorICogMC40CVJlc29sdmVkIGxpY2Vuc2luZyBpc3N1ZXMuCisgKiAwLjMJSW5jbHVzaW9uIGluIHRoZSBMaW51eC9tNjhrIHRyZWUsIHNtYWxsIGZpeGVzLgorICogMC4yCUFkZGVkIGRvY3VtZW50YXRpb24sIG1pbm9yIHR5cG8gZml4ZXMuCisgKiAwLjEJSW5pdGlhbCByZWxlYXNlLgorICoKKyAqIFRPIERPOgorICogLQlIYW5kbGUgaW5jb21pbmcgQlJFQUsgZXZlbnRzLiBJIGd1ZXNzICJTdGV2ZW5zOiBBZHZhbmNlZAorICoJUHJvZ3JhbW1pbmcgaW4gdGhlIFVOSVgoUikgRW52aXJvbm1lbnQiIGlzIGEgZ29vZCByZWZlcmVuY2UKKyAqCW9uIHdoYXQgaXMgdG8gYmUgZG9uZS4KKyAqIC0JV2hlbiBpbnN0YWxsaW5nIGFzIGEgbW9kdWxlLCBkb24ndCBzaW1wbHkgJ3ByaW50aycgdGV4dCwgYnV0CisgKglzZW5kIGl0IHRvIHRoZSBUVFkgdXNlZCBieSB0aGUgdXNlci4KKyAqCisgKiBUSEFOS1MgVE86CisgKiAtCUp1a2thIE1hcmluICg2NUVDMDIgY29kZSkuCisgKiAtCVRoZSBvdGhlciBOZXRCU0QgZGV2ZWxvcGVycyBvbiB3aG9zZSBBMjIzMiBkcml2ZXIgSSBoYWQgYQorICoJcHJldHR5IGNsb3NlIGxvb2suIEhvd2V2ZXIsIEkgZGlkbid0IGNvcHkgYW55IGNvZGUgc28gaXQKKyAqCWlzIG9rYXkgdG8gcHV0IG15IGNvZGUgdW5kZXIgdGhlIEdQTCBhbmQgaW5jbHVkZSBpdCBpbnRvCisgKglMaW51eC4KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBEb2N1bWVudGF0aW9uICoqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogRW5hYmxlcyBleHBlcmltZW50YWwgMTE1MjAwIChub3JtYWwpIDIzMDQwMCAodHVyYm8pIGJhdWQgcmF0ZS4KKyAqIFRoZSBBMjIzMiBzcGVjaWZpY2F0aW9uIHN0YXRlcyBpdCBjYW4gb25seSBvcGVyYXRlIGF0IHNwZWVkcyB1cCB0bworICogMTkyMDAgYml0cyBwZXIgc2Vjb25kLCBhbmQgSSB3YXMgbm90IGFibGUgdG8gc2VuZCBhIGZpbGUgdmlhCisgKiAic3oiLyJyeiIgYW5kIGEgbnVsbC1tb2RlbSBjYWJsZSBmcm9tIG9uZSBBMjIzMiBwb3J0IHRvIGFub3RoZXIKKyAqIGF0IDExNTIwMCBiaXRzIHBlciBzZWNvbmQuCisgKiBIb3dldmVyLCB0aGlzIG1pZ2h0IHdvcmsgZm9yIHlvdS4KKyAqLworI3VuZGVmIEEyMjMyX1NQRUVESEFDSworLyoKKyAqIERlZmF1bHQgaXMgbm90IHRvIHVzZSBSVFMvQ1RTIHNvIHlvdSBjb3VsZCBiZSB0YWxrZWQgdG8gZGVhdGguCisgKi8KKyNkZWZpbmUgQTIyMzJfU1VQUFJFU1NfUlRTQ1RTX1dBUk5JTkcKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKworI2luY2x1ZGUgInNlcl9hMjIzMi5oIgorI2luY2x1ZGUgInNlcl9hMjIzMmZ3LmgiCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYTIyMzJfdmJsX2ludGVyKGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpmcCk7CisvKiBJbml0aWFsaXplIHRoZSBwb3J0IHN0cnVjdHVyZXMgKi8KK3N0YXRpYyB2b2lkIGEyMjMyX2luaXRfcG9ydHN0cnVjdHModm9pZCk7CisvKiBJbml0aWFsaXplIGFuZCByZWdpc3RlciBUVFkgZHJpdmVycy4gKi8KKy8qIHJldHVybnMgMCBJRkYgc3VjY2Vzc2Z1bCAqLworc3RhdGljIGludCBhMjIzMl9pbml0X2RyaXZlcnModm9pZCk7IAorCisvKiBCRUdJTiBHRU5FUklDX1NFUklBTCBQUk9UT1RZUEVTICovCitzdGF0aWMgdm9pZCBhMjIzMl9kaXNhYmxlX3R4X2ludGVycnVwdHModm9pZCAqcHRyKTsKK3N0YXRpYyB2b2lkIGEyMjMyX2VuYWJsZV90eF9pbnRlcnJ1cHRzKHZvaWQgKnB0cik7CitzdGF0aWMgdm9pZCBhMjIzMl9kaXNhYmxlX3J4X2ludGVycnVwdHModm9pZCAqcHRyKTsKK3N0YXRpYyB2b2lkIGEyMjMyX2VuYWJsZV9yeF9pbnRlcnJ1cHRzKHZvaWQgKnB0cik7CitzdGF0aWMgaW50ICBhMjIzMl9nZXRfQ0Qodm9pZCAqcHRyKTsKK3N0YXRpYyB2b2lkIGEyMjMyX3NodXRkb3duX3BvcnQodm9pZCAqcHRyKTsKK3N0YXRpYyBpbnQgIGEyMjMyX3NldF9yZWFsX3Rlcm1pb3Modm9pZCAqcHRyKTsKK3N0YXRpYyBpbnQgIGEyMjMyX2NoYXJzX2luX2J1ZmZlcih2b2lkICpwdHIpOworc3RhdGljIHZvaWQgYTIyMzJfY2xvc2Uodm9pZCAqcHRyKTsKK3N0YXRpYyB2b2lkIGEyMjMyX2h1bmd1cCh2b2lkICpwdHIpOworLyogc3RhdGljIHZvaWQgYTIyMzJfZ2V0c2VyaWFsICh2b2lkICpwdHIsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpzcCk7ICovCisvKiBFTkQgR0VORVJJQ19TRVJJQUwgUFJPVE9UWVBFUyAqLworCisvKiBGdW5jdGlvbnMgdGhhdCB0aGUgVFRZIGRyaXZlciBzdHJ1Y3QgZXhwZWN0cyAqLworc3RhdGljIGludCAgYTIyMzJfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCQkJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgYTIyMzJfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBhMjIzMl91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludCAgYTIyMzJfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEludGVyZmFjZSBmcm9tIGdlbmVyaWNfc2VyaWFsLmMgYmFjayBoZXJlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzdHJ1Y3QgcmVhbF9kcml2ZXIgYTIyMzJfcmVhbF9kcml2ZXIgPSB7CisgICAgICAgIGEyMjMyX2Rpc2FibGVfdHhfaW50ZXJydXB0cywKKyAgICAgICAgYTIyMzJfZW5hYmxlX3R4X2ludGVycnVwdHMsCisgICAgICAgIGEyMjMyX2Rpc2FibGVfcnhfaW50ZXJydXB0cywKKyAgICAgICAgYTIyMzJfZW5hYmxlX3J4X2ludGVycnVwdHMsCisgICAgICAgIGEyMjMyX2dldF9DRCwKKyAgICAgICAgYTIyMzJfc2h1dGRvd25fcG9ydCwKKyAgICAgICAgYTIyMzJfc2V0X3JlYWxfdGVybWlvcywKKyAgICAgICAgYTIyMzJfY2hhcnNfaW5fYnVmZmVyLAorICAgICAgICBhMjIzMl9jbG9zZSwKKyAgICAgICAgYTIyMzJfaHVuZ3VwLAorCU5VTEwJLyogYTIyMzJfZ2V0c2VyaWFsICovCit9OworCitzdGF0aWMgdm9pZCAqYTIyMzJfZHJpdmVyX0lEID0gJmEyMjMyX2RyaXZlcl9JRDsgLy8gU29tZSBtZW1vcnkgYWRkcmVzcyBXRSBvd24uCisKKy8qIFBvcnRzIHN0cnVjdHMgKi8KK3N0YXRpYyBzdHJ1Y3QgYTIyMzJfcG9ydCBhMjIzMl9wb3J0c1tNQVhfQTIyMzJfQk9BUkRTKk5VTUxJTkVTXTsKKworLyogVFRZIGRyaXZlciBzdHJ1Y3RzICovCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmEyMjMyX2RyaXZlcjsKKworLyogbnIgb2YgY2FyZHMgY29tcGxldGVseSAoYWxsIHBvcnRzKSBhbmQgY29ycmVjdGx5IGNvbmZpZ3VyZWQgKi8KK3N0YXRpYyBpbnQgbnJfYTIyMzI7IAorCisvKiB6b3Jyb19kZXYgc3RydWN0cyBmb3IgdGhlIEEyMjMyJ3MgKi8KK3N0YXRpYyBzdHJ1Y3Qgem9ycm9fZGV2ICp6ZF9hMjIzMltNQVhfQTIyMzJfQk9BUkRTXTsgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRW5kIG9mIEdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKiovCisKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KKworc3RhdGljIGlubGluZSB2b2xhdGlsZSBzdHJ1Y3QgYTIyMzJtZW1vcnkgKmEyMjMybWVtKHVuc2lnbmVkIGludCBib2FyZCkKK3sKKwlyZXR1cm4gKHZvbGF0aWxlIHN0cnVjdCBhMjIzMm1lbW9yeSAqKVpUV09fVkFERFIoemRfYTIyMzJbYm9hcmRdLT5yZXNvdXJjZS5zdGFydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9sYXRpbGUgc3RydWN0IGEyMjMyc3RhdHVzICphMjIzMnN0YXQodW5zaWduZWQgaW50IGJvYXJkLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgcG9ydG9uYm9hcmQpCit7CisJdm9sYXRpbGUgc3RydWN0IGEyMjMybWVtb3J5ICptZW0gPSBhMjIzMm1lbShib2FyZCk7CisJcmV0dXJuICYobWVtLT5TdGF0dXNbcG9ydG9uYm9hcmRdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGEyMjMyX3JlY2VpdmVfY2hhcihzdHJ1Y3QgYTIyMzJfcG9ydCAqcG9ydCwgaW50IGNoLCBpbnQgZXJyKQoreworLyogCU1vc3RseSBzdG9sZW4gZnJvbSBvdGhlciBkcml2ZXJzLgorCU1heWJlIG9uZSBjb3VsZCBpbXBsZW1lbnQgYSBtb3JlIGVmZmljaWVudCB2ZXJzaW9uIGJ5IG5vdCBvbmx5CisJdHJhbnNmZXJyaW5nIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLgorKi8KKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+Z3MudHR5OworCisJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQorCQlyZXR1cm47CisKKwl0dHktPmZsaXAuY291bnQrKzsKKworI2lmIDAKKwlzd2l0Y2goZXJyKSB7CisJY2FzZSBUVFlfQlJFQUs6CisJCWJyZWFrOworCWNhc2UgVFRZX1BBUklUWToKKwkJYnJlYWs7CisJY2FzZSBUVFlfT1ZFUlJVTjoKKwkJYnJlYWs7CisJY2FzZSBUVFlfRlJBTUU6CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IGVycjsKKwkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gY2g7CisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiBCRUdJTiBPRiBSRUFMX0RSSVZFUiBGVU5DVElPTlMgKioqLworCitzdGF0aWMgdm9pZCBhMjIzMl9kaXNhYmxlX3R4X2ludGVycnVwdHModm9pZCAqcHRyKQoreworCXN0cnVjdCBhMjIzMl9wb3J0ICpwb3J0OworCXZvbGF0aWxlIHN0cnVjdCBhMjIzMnN0YXR1cyAqc3RhdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAKKwlwb3J0ID0gcHRyOworCXN0YXQgPSBhMjIzMnN0YXQocG9ydC0+d2hpY2hfYTIyMzIsIHBvcnQtPndoaWNoX3BvcnRfb25fYTIyMzIpOworCXN0YXQtPk91dERpc2FibGUgPSAtMTsKKworCS8qIERvZXMgdGhpcyBoZXJlIHJlYWxseSBoYXZlIHRvIGJlPyAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlwb3J0LT5ncy5mbGFncyAmPSB+R1NfVFhfSU5URU47CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhMjIzMl9lbmFibGVfdHhfaW50ZXJydXB0cyh2b2lkICpwdHIpCit7CisJc3RydWN0IGEyMjMyX3BvcnQgKnBvcnQ7CisJdm9sYXRpbGUgc3RydWN0IGEyMjMyc3RhdHVzICpzdGF0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwb3J0ID0gcHRyOworCXN0YXQgPSBhMjIzMnN0YXQocG9ydC0+d2hpY2hfYTIyMzIsIHBvcnQtPndoaWNoX3BvcnRfb25fYTIyMzIpOworCXN0YXQtPk91dERpc2FibGUgPSAwOworCisJLyogRG9lcyB0aGlzIGhlcmUgcmVhbGx5IGhhdmUgdG8gYmU/ICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXBvcnQtPmdzLmZsYWdzIHw9IEdTX1RYX0lOVEVOOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYTIyMzJfZGlzYWJsZV9yeF9pbnRlcnJ1cHRzKHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgYTIyMzJfcG9ydCAqcG9ydDsKKwlwb3J0ID0gcHRyOworCXBvcnQtPmRpc2FibGVfcnggPSAtMTsKK30KKworc3RhdGljIHZvaWQgYTIyMzJfZW5hYmxlX3J4X2ludGVycnVwdHModm9pZCAqcHRyKQoreworCXN0cnVjdCBhMjIzMl9wb3J0ICpwb3J0OworCXBvcnQgPSBwdHI7CisJcG9ydC0+ZGlzYWJsZV9yeCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgIGEyMjMyX2dldF9DRCh2b2lkICpwdHIpCit7CisJcmV0dXJuICgoc3RydWN0IGEyMjMyX3BvcnQgKikgcHRyKS0+Y2Rfc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBhMjIzMl9zaHV0ZG93bl9wb3J0KHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgYTIyMzJfcG9ydCAqcG9ydDsKKwl2b2xhdGlsZSBzdHJ1Y3QgYTIyMzJzdGF0dXMgKnN0YXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXBvcnQgPSBwdHI7CisJc3RhdCA9IGEyMjMyc3RhdChwb3J0LT53aGljaF9hMjIzMiwgcG9ydC0+d2hpY2hfcG9ydF9vbl9hMjIzMik7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlwb3J0LT5ncy5mbGFncyAmPSB+R1NfQUNUSVZFOworCQorCWlmIChwb3J0LT5ncy50dHkgJiYgcG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpIHsKKwkJLyogU2V0IERUUiBhbmQgUlRTIHRvIExvdywgZmx1c2ggb3V0cHV0LgorCQkgICBUaGUgTmV0QlNEIGRyaXZlciAibXNjLmMiIGRvZXMgaXQgdGhpcyB3YXkuICovCisJCXN0YXQtPkNvbW1hbmQgPSAoCShzdGF0LT5Db21tYW5kICYgfkEyMjMyQ01EX0NNYXNrKSB8IAorCQkJCQlBMjIzMkNNRF9DbG9zZSApOworCQlzdGF0LT5PdXRGbHVzaCA9IC0xOworCQlzdGF0LT5TZXR1cCA9IC0xOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkKKwkvKiBBZnRlciBhbmFseXppbmcgY29udHJvbCBmbG93LCBJIHRoaW5rIGEyMjMyX3NodXRkb3duX3BvcnQKKwkJaXMgYWN0dWFsbHkgdGhlIGxhc3QgY2FsbCBmcm9tIHRoZSBzeXN0ZW0gd2hlbiBhdCBhcHBsaWNhdGlvbgorCQlsZXZlbCBzb21lb25lIGlzc3VlcyBhICJlY2hvIEhlbGxvID4+L2Rldi90dHlZMCIuCisJCVRoZXJlZm9yZSBJIHRoaW5rIHRoZSBNT0RfREVDX1VTRV9DT1VOVCBzaG91bGQgYmUgaGVyZSBhbmQKKwkJbm90IGluICJhMjIzMl9jbG9zZSgpIi4gU2VlIHRoZSBjb21tZW50IGluICJzeC5jIiwgdG9vLgorCQlJZiB5b3UgcnVuIGludG8gcHJvYmxlbXMsIGNvbXBpbGUgdGhpcyBkcml2ZXIgaW50byB0aGUKKwkJa2VybmVsIGluc3RlYWQgb2YgY29tcGlsaW5nIGl0IGFzIGEgbW9kdWxlLiAqLworfQorCitzdGF0aWMgaW50ICBhMjIzMl9zZXRfcmVhbF90ZXJtaW9zKHZvaWQgKnB0cikKK3sKKwl1bnNpZ25lZCBpbnQgY2ZsYWcsIGJhdWQsIGNoc2l6ZSwgc3RvcGIsIHBhcml0eSwgc29mdGZsb3c7CisJaW50IHJhdGU7CisJaW50IGEyMjMyX3BhcmFtLCBhMjIzMl9jbWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgYTIyMzJfcG9ydCAqcG9ydCA9IHB0cjsKKwl2b2xhdGlsZSBzdHJ1Y3QgYTIyMzJzdGF0dXMgKnN0YXR1czsKKwl2b2xhdGlsZSBzdHJ1Y3QgYTIyMzJtZW1vcnkgKm1lbTsKKworCWlmICghcG9ydC0+Z3MudHR5IHx8ICFwb3J0LT5ncy50dHktPnRlcm1pb3MpIHJldHVybiAwOworCisJc3RhdHVzID0gYTIyMzJzdGF0KHBvcnQtPndoaWNoX2EyMjMyLCBwb3J0LT53aGljaF9wb3J0X29uX2EyMjMyKTsKKwltZW0gPSBhMjIzMm1lbShwb3J0LT53aGljaF9hMjIzMik7CisJCisJYTIyMzJfcGFyYW0gPSBhMjIzMl9jbWQgPSAwOworCisJLy8gZ2V0IGJhdWQgcmF0ZQorCWJhdWQgPSBwb3J0LT5ncy5iYXVkOworCWlmIChiYXVkID09IDApIHsKKwkJLyogc3BlZWQgPT0gMCAtPiBkcm9wIERUUiwgZG8gbm90aGluZyBlbHNlICovCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJLy8gQ2xlYXIgRFRSIChhbmQgUlRTLi4uIG1oaGgpLgorCQlzdGF0dXMtPkNvbW1hbmQgPSAoCShzdGF0dXMtPkNvbW1hbmQgJiB+QTIyMzJDTURfQ01hc2spIHwKKwkJCQkJQTIyMzJDTURfQ2xvc2UgKTsKKwkJc3RhdHVzLT5PdXRGbHVzaCA9IC0xOworCQlzdGF0dXMtPlNldHVwID0gLTE7CisJCQorCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybiAwOworCX0KKwkKKwlyYXRlID0gQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMOworCWZvciAoaT0wOyBpIDwgQTIyMzJfQkFVRF9UQUJMRV9OVU1fUkFURVMgKiAzOyBpICs9IDMpeworCQlpZiAoYTIyMzJfYmF1ZF90YWJsZVtpXSA9PSBiYXVkKXsKKwkJCWlmIChtZW0tPkNvbW1vbi5DcnlzdGFsID09IEEyMjMyX1RVUkJPKSByYXRlID0gYTIyMzJfYmF1ZF90YWJsZVtpKzJdOworCQkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgPSBhMjIzMl9iYXVkX3RhYmxlW2krMV07CisJCX0KKwl9CisJaWYgKHJhdGUgPT0gQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMKXsKKwkJcHJpbnRrKCJhMjIzMjogQm9hcmQgJWQgUG9ydCAlZCB1bnN1cHBvcnRlZCBiYXVkIHJhdGU6ICVkIGJhdWQuIFVzaW5nIGFub3RoZXIuXG4iLHBvcnQtPndoaWNoX2EyMjMyLHBvcnQtPndoaWNoX3BvcnRfb25fYTIyMzIsYmF1ZCk7CisJCS8vIFRoaXMgaXMgdXNlZnVsIGZvciBib3RoICh0dXJibyBvciBub3JtYWwpIENyeXN0YWwgdmVyc2lvbnMuCisJCXJhdGUgPSBBMjIzMlBBUkFNX0I5NjAwOworCX0KKwlhMjIzMl9wYXJhbSB8PSByYXRlOworCisJY2ZsYWcgID0gcG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJLy8gZ2V0IGNoYXJhY3RlciBzaXplCisJY2hzaXplID0gY2ZsYWcgJiBDU0laRTsKKwlzd2l0Y2ggKGNoc2l6ZSl7CisJCWNhc2UgQ1M4OiAJYTIyMzJfcGFyYW0gfD0gQTIyMzJQQVJBTV84Qml0OyBicmVhazsKKwkJY2FzZSBDUzc6IAlhMjIzMl9wYXJhbSB8PSBBMjIzMlBBUkFNXzdCaXQ7IGJyZWFrOworCQljYXNlIENTNjogCWEyMjMyX3BhcmFtIHw9IEEyMjMyUEFSQU1fNkJpdDsgYnJlYWs7CisJCWNhc2UgQ1M1OiAJYTIyMzJfcGFyYW0gfD0gQTIyMzJQQVJBTV81Qml0OyBicmVhazsKKwkJZGVmYXVsdDoJcHJpbnRrKCJhMjIzMjogQm9hcmQgJWQgUG9ydCAlZCB1bnN1cHBvcnRlZCBjaGFyYWN0ZXIgc2l6ZTogJWQuIFVzaW5nIDggZGF0YSBiaXRzLlxuIiwKKwkJCQkJcG9ydC0+d2hpY2hfYTIyMzIscG9ydC0+d2hpY2hfcG9ydF9vbl9hMjIzMixjaHNpemUpOworCQkJCWEyMjMyX3BhcmFtIHw9IEEyMjMyUEFSQU1fOEJpdDsgYnJlYWs7CisJfQorCisJLy8gZ2V0IG51bWJlciBvZiBzdG9wIGJpdHMKKwlzdG9wYiAgPSBjZmxhZyAmIENTVE9QQjsKKwlpZiAoc3RvcGIpeyAvLyB0d28gc3RvcCBiaXRzIGluc3RlYWQgb2Ygb25lCisJCXByaW50aygiYTIyMzI6IEJvYXJkICVkIFBvcnQgJWQgMiBzdG9wIGJpdHMgdW5zdXBwb3J0ZWQuIFVzaW5nIDEgc3RvcCBiaXQuXG4iLAorCQkJcG9ydC0+d2hpY2hfYTIyMzIscG9ydC0+d2hpY2hfcG9ydF9vbl9hMjIzMik7CisJfQorCisJLy8gV2FybiBpZiBSVFMvQ1RTIG5vdCB3YW50ZWQKKwlpZiAoIShjZmxhZyAmIENSVFNDVFMpKXsKKyNpZm5kZWYgQTIyMzJfU1VQUFJFU1NfUlRTQ1RTX1dBUk5JTkcKKwkJcHJpbnRrKCJhMjIzMjogQm9hcmQgJWQgUG9ydCAlZCBjYW5ub3Qgc3dpdGNoIG9mZiBmaXJtd2FyZS1pbXBsZW1lbnRlZCBSVFMvQ1RTIGhhcmR3YXJlIGZsb3cgY29udHJvbC5cbiIsCisJCQlwb3J0LT53aGljaF9hMjIzMixwb3J0LT53aGljaF9wb3J0X29uX2EyMjMyKTsKKyNlbmRpZgorCX0KKworCS8qCUkgdGhpbmsgdGhpcyBpcyBjb3JyZWN0LgorCQlIb3dldmVyLCBJWE9GRiBtZWFucyBfaW5wdXRfIGZsb3cgY29udHJvbCBhbmQgSSB3b25kZXIKKwkJaWYgb25lIHNob3VsZCBjYXJlIGFib3V0IElYT04gX291dHB1dF8gZmxvdyBjb250cm9sLAorCQl0b28uIElmIHRoaXMgbWFrZXMgcHJvYmxlbXMsIG9uZSBzaG91bGQgdHVybiB0aGUgQTIyMzIKKwkJZmlybXdhcmUgWE9OL1hPRkYgIlNvZnRGbG93IiBmbG93IGNvbnRyb2wgb2ZmIGFuZCB1c2UKKwkJdGhlIGNvbnZlbnRpb25hbCB3YXkgb2YgaW5zZXJ0aW5nIFNUQVJUL1NUT1AgY2hhcmFjdGVycworCQlieSBoYW5kIGluIHRocm90dGxlKCkvdW50aHJvdHRsZSgpLgorCSovCisJc29mdGZsb3cgPSAhISggcG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX2lmbGFnICYgSVhPRkYgKTsKKworCS8vIGdldCBQYXJpdHkgKEVuYWJsZWQvRGlzYWJsZWQ/IElmIEVuYWJsZWQsIE9kZCBvciBFdmVuPykKKwlwYXJpdHkgPSBjZmxhZyAmIChQQVJFTkIgfCBQQVJPREQpOworCWlmIChwYXJpdHkgJiBQQVJFTkIpeworCQlpZiAocGFyaXR5ICYgUEFST0REKXsKKwkJCWEyMjMyX2NtZCB8PSBBMjIzMkNNRF9PZGRQYXJpdHk7CisJCX0KKwkJZWxzZXsKKwkJCWEyMjMyX2NtZCB8PSBBMjIzMkNNRF9FdmVuUGFyaXR5OworCQl9CisJfQorCWVsc2UgYTIyMzJfY21kIHw9IEEyMjMyQ01EX05vUGFyaXR5OworCisKKwkvKglIbW0uIE1heWJlIGFuIG93biBhMjIzMl9wb3J0IHN0cnVjdHVyZQorCQltZW1iZXIgd291bGQgYmUgY2xlYW5lcj8JKi8KKwlpZiAoY2ZsYWcgJiBDTE9DQUwpCisJCXBvcnQtPmdzLmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwllbHNlCisJCXBvcnQtPmdzLmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCisKKwkvKiBOb3cgd2UgaGF2ZSBhbGwgcGFyYW1ldGVycyBhbmQgY2FuIGdvIHRvIHNldCB0aGVtOiAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXN0YXR1cy0+UGFyYW0gPSBhMjIzMl9wYXJhbSB8IEEyMjMyUEFSQU1fUmN2QmF1ZDsKKwlzdGF0dXMtPkNvbW1hbmQgPSBhMjIzMl9jbWQgfCBBMjIzMkNNRF9PcGVuIHwgIEEyMjMyQ01EX0VuYWJsZTsKKwlzdGF0dXMtPlNvZnRGbG93ID0gc29mdGZsb3c7CisJc3RhdHVzLT5PdXREaXNhYmxlID0gMDsKKwlzdGF0dXMtPlNldHVwID0gLTE7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgIGEyMjMyX2NoYXJzX2luX2J1ZmZlcih2b2lkICpwdHIpCit7CisJc3RydWN0IGEyMjMyX3BvcnQgKnBvcnQ7CisJdm9sYXRpbGUgc3RydWN0IGEyMjMyc3RhdHVzICpzdGF0dXM7IAorCXVuc2lnbmVkIGNoYXIgcmV0OyAvKiB3ZSBuZWVkIG1vZHVsby0yNTYgYXJpdGhtZXRpY3MgKi8KKwlwb3J0ID0gcHRyOworCXN0YXR1cyA9IGEyMjMyc3RhdChwb3J0LT53aGljaF9hMjIzMiwgcG9ydC0+d2hpY2hfcG9ydF9vbl9hMjIzMik7CisjaWYgQTIyMzJfSU9CVUZMRU4gIT0gMjU2CisjZXJyb3IgIlJlLUltcGxlbWVudCBhMjIzMl9jaGFyc19pbl9idWZmZXIoKSEiCisjZW5kaWYKKwlyZXQgPSAoc3RhdHVzLT5PdXRIZWFkIC0gc3RhdHVzLT5PdXRUYWlsKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhMjIzMl9jbG9zZSh2b2lkICpwdHIpCit7CisJYTIyMzJfZGlzYWJsZV90eF9pbnRlcnJ1cHRzKHB0cik7CisJYTIyMzJfZGlzYWJsZV9yeF9pbnRlcnJ1cHRzKHB0cik7CisJLyogc2VlIHRoZSBjb21tZW50IGluIGEyMjMyX3NodXRkb3duX3BvcnQgYWJvdmUuICovCit9CisKK3N0YXRpYyB2b2lkIGEyMjMyX2h1bmd1cCh2b2lkICpwdHIpCit7CisJYTIyMzJfY2xvc2UocHRyKTsKK30KKy8qKiogRU5EICAgT0YgUkVBTF9EUklWRVIgRlVOQ1RJT05TICoqKi8KKworLyoqKiBCRUdJTiAgRlVOQ1RJT05TIEVYUEVDVEVEIEJZIFRUWSBEUklWRVIgU1RSVUNUUyAqKiovCitzdGF0aWMgaW50IGEyMjMyX2lvY3RsKAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisKK3N0YXRpYyB2b2lkIGEyMjMyX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisvKiBUaHJvdHRsZTogU3lzdGVtIGNhbm5vdCB0YWtlIGFub3RoZXIgY2hhcnM6IERyb3AgUlRTIG9yCisgICAgICAgICAgICAgc2VuZCB0aGUgU1RPUCBjaGFyIG9yIHdoYXRldmVyLgorICAgVGhlIEEyMjMyIGZpcm13YXJlIGRvZXMgUlRTL0NUUyBhbnl3YXksIGFuZCBYT04vWE9GRgorICAgaWYgc3dpdGNoZWQgb24uIFNvIHRoZSBvbmx5IHRoaW5nIHdlIGNhbiBkbyBhdCB0aGlzCisgICBsYXllciBoZXJlIGlzIG5vdCB0YWtpbmcgYW55IGNoYXJhY3RlcnMgb3V0IG9mIHRoZQorICAgQTIyMzIgYnVmZmVyIGFueSBtb3JlLiAqLworCXN0cnVjdCBhMjIzMl9wb3J0ICpwb3J0ID0gKHN0cnVjdCBhMjIzMl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJcG9ydC0+dGhyb3R0bGVfaW5wdXQgPSAtMTsKK30KKworc3RhdGljIHZvaWQgYTIyMzJfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworLyogVW50aHJvdHRsZTogZHVhbCB0byAidGhyb3R0bGUoKSIgYWJvdmUuICovCisJc3RydWN0IGEyMjMyX3BvcnQgKnBvcnQgPSAoc3RydWN0IGEyMjMyX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlwb3J0LT50aHJvdHRsZV9pbnB1dCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgIGEyMjMyX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKy8qIE1vcmUgb3IgbGVzcyBzdG9sZW4gZnJvbSBvdGhlciBkcml2ZXJzLiAqLworCWludCBsaW5lOworCWludCByZXR2YWw7CisJc3RydWN0IGEyMjMyX3BvcnQgKnBvcnQ7CisKKwlsaW5lID0gdHR5LT5pbmRleDsKKwlwb3J0ID0gJmEyMjMyX3BvcnRzW2xpbmVdOworCQorCXR0eS0+ZHJpdmVyX2RhdGEgPSBwb3J0OworCXBvcnQtPmdzLnR0eSA9IHR0eTsKKwlwb3J0LT5ncy5jb3VudCsrOworCXJldHZhbCA9IGdzX2luaXRfcG9ydCgmcG9ydC0+Z3MpOworCWlmIChyZXR2YWwpIHsKKwkJcG9ydC0+Z3MuY291bnQtLTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcG9ydC0+Z3MuZmxhZ3MgfD0gR1NfQUNUSVZFOworCXJldHZhbCA9IGdzX2Jsb2NrX3RpbF9yZWFkeShwb3J0LCBmaWxwKTsKKworCWlmIChyZXR2YWwpIHsKKwkJcG9ydC0+Z3MuY291bnQtLTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlhMjIzMl9lbmFibGVfcnhfaW50ZXJydXB0cyhwb3J0KTsKKwkKKwlyZXR1cm4gMDsKK30KKy8qKiogRU5EIE9GIEZVTkNUSU9OUyBFWFBFQ1RFRCBCWSBUVFkgRFJJVkVSIFNUUlVDVFMgKioqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgYTIyMzJfdmJsX2ludGVyKGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKyNpZiBBMjIzMl9JT0JVRkxFTiAhPSAyNTYKKyNlcnJvciAiUmUtSW1wbGVtZW50IGEyMjMyX3ZibF9pbnRlcigpISIKKyNlbmRpZgorCitzdHJ1Y3QgYTIyMzJfcG9ydCAqcG9ydDsKK3ZvbGF0aWxlIHN0cnVjdCBhMjIzMm1lbW9yeSAqbWVtOwordm9sYXRpbGUgc3RydWN0IGEyMjMyc3RhdHVzICpzdGF0dXM7Cit1bnNpZ25lZCBjaGFyIG5ld2hlYWQ7Cit1bnNpZ25lZCBjaGFyIGJ1ZnBvczsgLyogTXVzdCBiZSB1bnNpZ25lZCBjaGFyLiBXZSBuZWVkIHRoZSBtb2R1bG8tMjU2IGFyaXRobWV0aWNzICovCit1bnNpZ25lZCBjaGFyIG5jZCwgb2NkLCBjY2Q7IC8qIG5hbWVzIGNvbnNpc3RlbnQgd2l0aCB0aGUgTmV0QlNEIGRyaXZlciAqLwordm9sYXRpbGUgdV9jaGFyICppYnVmLCAqY2J1ZiwgKm9idWY7CitpbnQgY2gsIGVyciwgbiwgcDsKKwlmb3IgKG4gPSAwOyBuIDwgbnJfYTIyMzI7IG4rKyl7CQkvKiBmb3IgZXZlcnkgY29tcGxldGVseSBpbml0aWFsaXplZCBBMjIzMiBib2FyZCAqLworCQltZW0gPSBhMjIzMm1lbShuKTsKKwkJZm9yIChwID0gMDsgcCA8IE5VTUxJTkVTOyBwKyspewkvKiBmb3IgZXZlcnkgcG9ydCBvbiB0aGlzIGJvYXJkICovCisJCQllcnIgPSAwOworCQkJcG9ydCA9ICZhMjIzMl9wb3J0c1tuKk5VTUxJTkVTK3BdOworCQkJaWYgKCBwb3J0LT5ncy5mbGFncyAmIEdTX0FDVElWRSApeyAvKiBpZiB0aGUgcG9ydCBpcyB1c2VkICovCisKKwkJCQlzdGF0dXMgPSBhMjIzMnN0YXQobixwKTsKKworCQkJCWlmICghcG9ydC0+ZGlzYWJsZV9yeCAmJiAhcG9ydC0+dGhyb3R0bGVfaW5wdXQpeyAvKiBJZiBpbnB1dCBpcyBub3QgZGlzYWJsZWQgKi8KKwkJCQkJbmV3aGVhZCA9IHN0YXR1cy0+SW5IZWFkOyAgICAgICAgICAgICAgIC8qIDY1RUMwMiB3cml0ZSBwb2ludGVyICovCisJCQkJCWJ1ZnBvcyA9IHN0YXR1cy0+SW5UYWlsOworCisJCQkJCS8qIGNoZWNrIGZvciBpbnB1dCBmb3IgdGhpcyBwb3J0ICovCisJCQkJCWlmIChuZXdoZWFkICE9IGJ1ZnBvcykgeworCQkJCQkJLyogYnVmZmVyIGZvciBpbnB1dCBjaGFycy9ldmVudHMgKi8KKwkJCQkJCWlidWYgPSBtZW0tPkluQnVmW3BdOworIAorCQkJCQkJLyogZGF0YSB0eXBlcyBvZiBieXRlcyBpbiBpYnVmICovCisJCQkJCQljYnVmID0gbWVtLT5JbkN0bFtwXTsKKyAKKwkJCQkJCS8qIGRvIGZvciBhbGwgY2hhcnMgKi8KKwkJCQkJCXdoaWxlIChidWZwb3MgIT0gbmV3aGVhZCkgeworCQkJCQkJCS8qIHdoaWNoIHR5cGUgb2YgaW5wdXQgZGF0YT8gKi8KKwkJCQkJCQlzd2l0Y2ggKGNidWZbYnVmcG9zXSkgeworCQkJCQkJCQkvKiBzd2l0Y2ggb24gaW5wdXQgZXZlbnQgKENELCBCUkVBSywgZXRjLikgKi8KKwkJCQkJCQljYXNlIEEyMjMySU5DVExfRVZFTlQ6CisJCQkJCQkJCXN3aXRjaCAoaWJ1ZltidWZwb3MrK10pIHsKKwkJCQkJCQkJY2FzZSBBMjIzMkVWRU5UX0JyZWFrOgorCQkJCQkJCQkJLyogVE9ETzogSGFuZGxlIEJSRUFLIHNpZ25hbCAqLworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkvKglBMjIzMkVWRU5UX0NhcnJpZXJPbiBhbmQgQTIyMzJFVkVOVF9DYXJyaWVyT2ZmIGFyZQorCQkJCQkJCQkJCWhhbmRsZWQgaW4gYSBzZXBhcmF0ZSBxdWV1ZSBhbmQgc2hvdWxkIG5vdCBvY2N1ciBoZXJlLiAqLworCQkJCQkJCQljYXNlIEEyMjMyRVZFTlRfU3luYzoKKwkJCQkJCQkJCXByaW50aygiQTIyMzI6IDY1RUMwMiBzb2Z0d2FyZSBzZW50IFNZTkMgZXZlbnQsIGRvbid0IGtub3cgd2hhdCB0byBkby4gSWdub3JpbmcuIik7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCXByaW50aygiQTIyMzI6IDY1RUMwMiBzb2Z0d2FyZSBicm9rZW4sIHVua25vd24gZXZlbnQgdHlwZSAlZCBvY2N1cnJlZC5cbiIsaWJ1ZltidWZwb3MtMV0pOworCQkJCQkJCQl9IC8qIGV2ZW50IHR5cGUgc3dpdGNoICovCisJCQkJCQkJCWJyZWFrOworIAkJCQkJCQljYXNlIEEyMjMySU5DVExfQ0hBUjoKKwkJCQkJCQkJLyogUmVjZWl2ZSBpbmNvbWluZyBjaGFyICovCisJCQkJCQkJCWEyMjMyX3JlY2VpdmVfY2hhcihwb3J0LCBpYnVmW2J1ZnBvc10sIGVycik7CisJCQkJCQkJCWJ1ZnBvcysrOworCQkJCQkJCQlicmVhazsKKyAJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJcHJpbnRrKCJBMjIzMjogNjVFQzAyIHNvZnR3YXJlIGJyb2tlbiwgdW5rbm93biBkYXRhIHR5cGUgJWQgb2NjdXJyZWQuXG4iLGNidWZbYnVmcG9zXSk7CisJCQkJCQkJCWJ1ZnBvcysrOworCQkJCQkJCX0gLyogc3dpdGNoIG9uIGlucHV0IGRhdGEgdHlwZSAqLworCQkJCQkJfSAvKiB3aGlsZSB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyICovCisKKwkJCQkJCXN0YXR1cy0+SW5UYWlsID0gYnVmcG9zOyAgICAgICAgICAgIC8qIHRlbGwgNjVFQzAyIHdoYXQgd2UndmUgcmVhZCAqLworCQkJCQkJCisJCQkJCX0gLyogaWYgdGhlcmUgd2FzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQl9IC8qIElmIGlucHV0IGlzIG5vdCBkaXNhYmxlZCAqLworCisJCQkJLyogTm93IGNoZWNrIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIHRvIG91dHB1dCAqLworCQkJCW9idWYgPSBtZW0tPk91dEJ1ZltwXTsKKwkJCQlidWZwb3MgPSBzdGF0dXMtPk91dEhlYWQ7CisJCQkJd2hpbGUgKCAocG9ydC0+Z3MueG1pdF9jbnQgPiAwKQkJJiYKKwkJCQkJKCFwb3J0LT5ncy50dHktPnN0b3BwZWQpCSYmCisJCQkJCSghcG9ydC0+Z3MudHR5LT5od19zdG9wcGVkKSApewkvKiBXaGlsZSB0aGVyZSBhcmUgY2hhcnMgdG8gdHJhbnNtaXQgKi8KKwkJCQkJaWYgKCgoYnVmcG9zKzEpICYgQTIyMzJfSU9CVUZMRU5NQVNLKSAhPSBzdGF0dXMtPk91dFRhaWwpIHsgLyogSWYgdGhlIEEyMjMyIGJ1ZmZlciBpcyBub3QgZnVsbCAqLworCQkJCQkJY2ggPSBwb3J0LT5ncy54bWl0X2J1Zltwb3J0LT5ncy54bWl0X3RhaWxdOwkJCQkJLyogZ2V0IHRoZSBuZXh0IGNoYXIgdG8gdHJhbnNtaXQgKi8KKwkJCQkJCXBvcnQtPmdzLnhtaXRfdGFpbCA9IChwb3J0LT5ncy54bWl0X3RhaWwrMSkgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsgLyogbW9kdWxvLWFkZGl0aW9uIGZvciB0aGUgZ3MueG1pdF9idWYgcmluZy1idWZmZXIgKi8KKwkJCQkJCW9idWZbYnVmcG9zKytdID0gY2g7CQkJCQkJCQkJCQkJCQkJCS8qIHB1dCBpdCBpbnRvIHRoZSBBMjIzMiBidWZmZXIgKi8KKwkJCQkJCXBvcnQtPmdzLnhtaXRfY250LS07CisJCQkJCX0KKwkJCQkJZWxzZXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLyogSWYgQTIyMzIgdGhlIGJ1ZmZlciBpcyBmdWxsICovCisJCQkJCQlicmVhazsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIHNpbXBseSBzdG9wIGZpbGxpbmcgaXQuICovCisJCQkJCX0JCQkJCQkJCQkJCQkJCisJCQkJfQkJCQkJCisJCQkJc3RhdHVzLT5PdXRIZWFkID0gYnVmcG9zOworCQkJCQkKKwkJCQkvKiBXYWtlVXAgaWYgb3V0cHV0IGJ1ZmZlciBydW5zIGxvdyAqLworCQkJCWlmICgocG9ydC0+Z3MueG1pdF9jbnQgPD0gcG9ydC0+Z3Mud2FrZXVwX2NoYXJzKSAmJiBwb3J0LT5ncy50dHkpIHsKKwkJCQkJdHR5X3dha2V1cChwb3J0LT5ncy50dHkpOworCQkJCX0KKwkJCX0gLy8gaWYgdGhlIHBvcnQgaXMgdXNlZAorCQl9IC8vIGZvciBldmVyeSBwb3J0IG9uIHRoZSBib2FyZAorCQkJCisJCS8qIE5vdyBjaGVjayB0aGUgQ0QgbWVzc2FnZSBxdWV1ZSAqLworCQluZXdoZWFkID0gbWVtLT5Db21tb24uQ0RIZWFkOworCQlidWZwb3MgPSBtZW0tPkNvbW1vbi5DRFRhaWw7CisJCWlmIChuZXdoZWFkICE9IGJ1ZnBvcyl7CQkJCS8qIFRoZXJlIGFyZSBDRCBldmVudHMgaW4gcXVldWUgKi8KKwkJCW9jZCA9IG1lbS0+Q29tbW9uLkNEU3RhdHVzOyAJCS8qIGdldCBvbGQgc3RhdHVzIGJpdHMgKi8KKwkJCXdoaWxlIChuZXdoZWFkICE9IGJ1ZnBvcyl7CQkvKiByZWFkIGFsbCBldmVudHMgKi8KKwkJCQluY2QgPSBtZW0tPkNEQnVmW2J1ZnBvcysrXTsgCS8qIGdldCBvbmUgZXZlbnQgKi8KKwkJCQljY2QgPSBuY2QgXiBvY2Q7IAkJLyogbWFzayBvZiBjaGFuZ2VkIGxpbmVzICovCisJCQkJb2NkID0gbmNkOyAJCQkvKiBzYXZlIG5ldyBzdGF0dXMgYml0cyAqLworCQkJCWZvcihwPTA7IHAgPCBOVU1MSU5FUzsgcCsrKXsJLyogZm9yIGFsbCBwb3J0cyAqLworCQkJCQlpZiAoY2NkICYgMSl7CQkvKiB0aGlzIG9uZSBjaGFuZ2VkICovCisKKwkJCQkJCXN0cnVjdCBhMjIzMl9wb3J0ICpwb3J0ID0gJmEyMjMyX3BvcnRzW24qNytwXTsKKwkJCQkJCXBvcnQtPmNkX3N0YXR1cyA9ICEobmNkICYgMSk7IC8qIG5jZCYxIDw9PiBDRCBpcyBub3cgb2ZmICovCisKKwkJCQkJCWlmICghKHBvcnQtPmdzLmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpKQorCQkJCQkJCTsJLyogRG9uJ3QgcmVwb3J0IERDRCBjaGFuZ2VzICovCisJCQkJCQllbHNlIGlmIChwb3J0LT5jZF9zdGF0dXMpIHsgLy8gaWYgRENEIG9uOiBEQ0Qgd2VudCBVUCEKKwkJCQkJCQkKKwkJCQkJCQkvKiBBcmUgd2UgYmxvY2tpbmcgaW4gb3Blbj8qLworCQkJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+Z3Mub3Blbl93YWl0KTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgeyAvLyBpZiBEQ0Qgb2ZmOiBEQ0Qgd2VudCBET1dOIQorCQkJCQkJCWlmIChwb3J0LT5ncy50dHkpCisJCQkJCQkJCXR0eV9oYW5ndXAgKHBvcnQtPmdzLnR0eSk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJfSAvLyBpZiBDRCBjaGFuZ2VkIGZvciB0aGlzIHBvcnQKKwkJCQkJY2NkID4+PSAxOworCQkJCQluY2QgPj49IDE7CQkJCQkJCQkJLyogU2hpZnQgYml0cyBmb3IgbmV4dCBsaW5lICovCisJCQkJfSAvLyBmb3IgZXZlcnkgcG9ydAorCQkJfSAvLyB3aGlsZSBDRCBldmVudHMgaW4gcXVldWUKKwkJCW1lbS0+Q29tbW9uLkNEU3RhdHVzID0gb2NkOyAvKiBzYXZlIG5ldyBzdGF0dXMgKi8KKwkJCW1lbS0+Q29tbW9uLkNEVGFpbCA9IGJ1ZnBvczsgLyogcmVtb3ZlIGV2ZW50cyAqLworCQl9IC8vIGlmIGV2ZW50cyBpbiBDRCBxdWV1ZQorCQkKKwl9IC8vIGZvciBldmVyeSBjb21wbGV0ZWx5IGluaXRpYWxpemVkIEEyMjMyIGJvYXJkCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBhMjIzMl9pbml0X3BvcnRzdHJ1Y3RzKHZvaWQpCit7CisJc3RydWN0IGEyMjMyX3BvcnQgKnBvcnQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0EyMjMyX0JPQVJEUypOVU1MSU5FUzsgaSsrKSB7CisJCXBvcnQgPSBhMjIzMl9wb3J0cyArIGk7CisJCXBvcnQtPndoaWNoX2EyMjMyID0gaS9OVU1MSU5FUzsKKwkJcG9ydC0+d2hpY2hfcG9ydF9vbl9hMjIzMiA9IGklTlVNTElORVM7CisJCXBvcnQtPmRpc2FibGVfcnggPSBwb3J0LT50aHJvdHRsZV9pbnB1dCA9IHBvcnQtPmNkX3N0YXR1cyA9IDA7CisJCXBvcnQtPmdzLm1hZ2ljID0gQTIyMzJfTUFHSUM7CisJCXBvcnQtPmdzLmNsb3NlX2RlbGF5ID0gSFovMjsKKwkJcG9ydC0+Z3MuY2xvc2luZ193YWl0ID0gMzAgKiBIWjsKKwkJcG9ydC0+Z3MucmQgPSAmYTIyMzJfcmVhbF9kcml2ZXI7CisjaWZkZWYgTkVXX1dSSVRFX0xPQ0tJTkcKKwkJaW5pdF9NVVRFWCgmKHBvcnQtPmdzLnBvcnRfd3JpdGVfc2VtKSk7CisjZW5kaWYKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydC0+Z3Mub3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydC0+Z3MuY2xvc2Vfd2FpdCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIGEyMjMyX29wcyA9IHsKKwkub3BlbiA9IGEyMjMyX29wZW4sCisJLmNsb3NlID0gZ3NfY2xvc2UsCisJLndyaXRlID0gZ3Nfd3JpdGUsCisJLnB1dF9jaGFyID0gZ3NfcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gZ3NfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSBnc193cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBnc19jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciA9IGdzX2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSBhMjIzMl9pb2N0bCwKKwkudGhyb3R0bGUgPSBhMjIzMl90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IGEyMjMyX3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zID0gZ3Nfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSBnc19zdG9wLAorCS5zdGFydCA9IGdzX3N0YXJ0LAorCS5oYW5ndXAgPSBnc19oYW5ndXAsCit9OworCitzdGF0aWMgaW50IGEyMjMyX2luaXRfZHJpdmVycyh2b2lkKQoreworCWludCBlcnJvcjsKKworCWEyMjMyX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTlVNTElORVMgKiBucl9hMjIzMik7CisJaWYgKCFhMjIzMl9kcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCWEyMjMyX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlhMjIzMl9kcml2ZXItPmRyaXZlcl9uYW1lID0gImNvbW1vZG9yZV9hMjIzMiI7CisJYTIyMzJfZHJpdmVyLT5uYW1lID0gInR0eVkiOworCWEyMjMyX2RyaXZlci0+bWFqb3IgPSBBMjIzMl9OT1JNQUxfTUFKT1I7CisJYTIyMzJfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlhMjIzMl9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJYTIyMzJfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJYTIyMzJfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9CisJCUI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlhMjIzMl9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoYTIyMzJfZHJpdmVyLCAmYTIyMzJfb3BzKTsKKwlpZiAoKGVycm9yID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihhMjIzMl9kcml2ZXIpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkEyMjMyOiBDb3VsZG4ndCByZWdpc3RlciBBMjIzMiBkcml2ZXIsIGVycm9yID0gJWRcbiIsCisJCSAgICAgICBlcnJvcik7CisJCXB1dF90dHlfZHJpdmVyKGEyMjMyX2RyaXZlcik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgYTIyMzJib2FyZF9pbml0KHZvaWQpCit7CisJc3RydWN0IHpvcnJvX2RldiAqejsKKworCXVuc2lnbmVkIGludCBib2FyZGFkZHI7CisJaW50IGJjb3VudDsKKwlzaG9ydCBzdGFydDsKKwl1X2NoYXIgKmZyb207CisJdm9sYXRpbGUgdV9jaGFyICp0bzsKKwl2b2xhdGlsZSBzdHJ1Y3QgYTIyMzJtZW1vcnkgKm1lbTsKKworI2lmZGVmIENPTkZJR19TTVAKKwlyZXR1cm4gLUVOT0RFVjsJLyogVGhpcyBkcml2ZXIgaXMgbm90IFNNUCBhd2FyZS4gSXMgdGhlcmUgYW4gU01QIFpvcnJvSUktYnVzLW1hY2hpbmU/ICovCisjZW5kaWYKKworCWlmICghTUFDSF9JU19BTUlHQSl7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXByaW50aygiQ29tbW9kb3JlIEEyMjMyIGRyaXZlciBpbml0aWFsaXppbmcuXG4iKTsgLyogU2F5IHRoYXQgd2UncmUgYWxpdmUuICovCisKKwl6ID0gTlVMTDsKKwlucl9hMjIzMiA9IDA7CisJd2hpbGUgKCAoeiA9IHpvcnJvX2ZpbmRfZGV2aWNlKFpPUlJPX1dJTERDQVJELCB6KSkgKXsKKwkJaWYgKAkoei0+aWQgIT0gWk9SUk9fUFJPRF9DQk1fQTIyMzJfUFJPVE9UWVBFKSAmJiAKKwkJCSh6LT5pZCAhPSBaT1JST19QUk9EX0NCTV9BMjIzMikJKXsKKwkJCWNvbnRpbnVlOwkvLyBUaGUgYm9hcmQgZm91bmQgd2FzIG5vIEEyMjMyCisJCX0KKwkJaWYgKCF6b3Jyb19yZXF1ZXN0X2RldmljZSh6LCJBMjIzMiBkcml2ZXIiKSkKKwkJCWNvbnRpbnVlOworCisJCXByaW50aygiQ29tbW9kb3JlIEEyMjMyIGZvdW5kICgjJWQpLlxuIixucl9hMjIzMik7CisKKwkJemRfYTIyMzJbbnJfYTIyMzJdID0gejsKKworCQlib2FyZGFkZHIgPSBaVFdPX1ZBRERSKCB6LT5yZXNvdXJjZS5zdGFydCApOworCQlwcmludGsoIkJvYXJkIGlzIGxvY2F0ZWQgYXQgYWRkcmVzcyAweCV4LCBzaXplIGlzIDB4JXguXG4iLCBib2FyZGFkZHIsICh1bnNpZ25lZCBpbnQpICgoei0+cmVzb3VyY2UuZW5kKzEpIC0gKHotPnJlc291cmNlLnN0YXJ0KSkpOworCisJCW1lbSA9ICh2b2xhdGlsZSBzdHJ1Y3QgYTIyMzJtZW1vcnkgKikgYm9hcmRhZGRyOworCisJCSh2b2lkKSBtZW0tPkVuYWJsZTY1MDJSZXNldDsgICAvKiBjb3B5IHRoZSBjb2RlIGFjcm9zcyB0byB0aGUgYm9hcmQgKi8KKwkJdG8gPSAodV9jaGFyICopbWVtOyAgZnJvbSA9IGEyMjMyXzY1RUMwMmNvZGU7IGJjb3VudCA9IHNpemVvZihhMjIzMl82NUVDMDJjb2RlKSAtIDI7CisJCXN0YXJ0ID0gKihzaG9ydCAqKWZyb207CisJCWZyb20gKz0gc2l6ZW9mKHN0YXJ0KTsKKwkJdG8gKz0gc3RhcnQ7CisJCXdoaWxlKGJjb3VudC0tKSAqdG8rKyA9ICpmcm9tKys7CisJCXByaW50aygiNjVFQzAyIHNvZnR3YXJlIHVwbG9hZGVkIHRvIHRoZSBBMjIzMiBtZW1vcnkuXG4iKTsKKyAgCisJCW1lbS0+Q29tbW9uLkNyeXN0YWwgPSBBMjIzMl9VTktOT1dOOyAgLyogdXNlIGF1dG9tYXRpYyBzcGVlZCBjaGVjayAqLworICAKKwkJLyogc3RhcnQgNjUwMiBydW5uaW5nICovCisJCSh2b2lkKSBtZW0tPlJlc2V0Qm9hcmQ7CisJCXByaW50aygiQTIyMzIncyA2NUVDMDIgQ1BVIHVwIGFuZCBydW5uaW5nLlxuIik7CisgIAorCQkvKiB3YWl0IHVudGlsIHNwZWVkIGRldGVjdG9yIGhhcyBmaW5pc2hlZCAqLworCQlmb3IgKGJjb3VudCA9IDA7IGJjb3VudCA8IDIwMDA7IGJjb3VudCsrKSB7CisJCQl1ZGVsYXkoMTAwMCk7CisJCQlpZiAobWVtLT5Db21tb24uQ3J5c3RhbCkKKwkJCQlicmVhazsKKwkJfQorCQlwcmludGsoKG1lbS0+Q29tbW9uLkNyeXN0YWw/IkEyMjMyIG9zY2lsbGF0b3IgY3J5c3RhbCBkZXRlY3RlZCBieSA2NUVDMDIgc29mdHdhcmU6ICI6IjY1RUMwMiBzb2Z0d2FyZSBjb3VsZCBub3QgZGV0ZXJtaW5lIEEyMjMyIG9zY2lsbGF0b3IgY3J5c3RhbDogIikpOworCQlzd2l0Y2ggKG1lbS0+Q29tbW9uLkNyeXN0YWwpeworCQljYXNlIEEyMjMyX1VOS05PV046CisJCQlwcmludGsoIlVua25vd24gY3J5c3RhbC5cbiIpOworCQkJYnJlYWs7CisgCQljYXNlIEEyMjMyX05PUk1BTDoKKwkJCXByaW50ayAoIk5vcm1hbCBjcnlzdGFsLlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBBMjIzMl9UVVJCTzoKKwkJCXByaW50ayAoIlR1cmJvIGNyeXN0YWwuXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrICgiMHgleC4gSHVoP1xuIixtZW0tPkNvbW1vbi5DcnlzdGFsKTsKKwkJfQorCisJCW5yX2EyMjMyKys7CisKKwl9CQorCisJcHJpbnRrKCJUb3RhbDogJWQgQTIyMzIgYm9hcmRzIGluaXRpYWxpemVkLlxuLiIsIG5yX2EyMjMyKTsgLyogU29tZSBzdGF0dXMgcmVwb3J0IGlmIG5vIGNhcmQgd2FzIGZvdW5kICovCisKKwlhMjIzMl9pbml0X3BvcnRzdHJ1Y3RzKCk7CisKKwkvKgorCQlhMjIzMl9pbml0X2RyaXZlcnMgYWxzbyByZWdpc3RlcnMgdGhlIGRyaXZlcnMuIE11c3QgYmUgaGVyZSBiZWNhdXNlIGFsbCBib2FyZHMKKwkJaGF2ZSB0byBiZSBkZXRlY3RlZCBmaXJzdC4KKwkqLworCWlmIChhMjIzMl9pbml0X2RyaXZlcnMoKSkgcmV0dXJuIC1FTk9ERVY7IC8vIG1heWJlIHdlIHNob3VsZCB1c2UgYSBkaWZmZXJlbnQgLUV4eHg/CisKKwlyZXF1ZXN0X2lycShJUlFfQU1JR0FfVkVSVEIsIGEyMjMyX3ZibF9pbnRlciwgMCwgIkEyMjMyIHNlcmlhbCBWQkwiLCBhMjIzMl9kcml2ZXJfSUQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYTIyMzJib2FyZF9leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfYTIyMzI7IGkrKykgeworCQl6b3Jyb19yZWxlYXNlX2RldmljZSh6ZF9hMjIzMltpXSk7CisJfQorCisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGEyMjMyX2RyaXZlcik7CisJcHV0X3R0eV9kcml2ZXIoYTIyMzJfZHJpdmVyKTsKKwlmcmVlX2lycShJUlFfQU1JR0FfVkVSVEIsIGEyMjMyX2RyaXZlcl9JRCk7Cit9CisKK21vZHVsZV9pbml0KGEyMjMyYm9hcmRfaW5pdCk7Cittb2R1bGVfZXhpdChhMjIzMmJvYXJkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJFbnZlciBIYWFzZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbWlnYSBBMjIzMiBtdWx0aS1zZXJpYWwgYm9hcmQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc2VyX2EyMjMyLmggYi9kcml2ZXJzL2NoYXIvc2VyX2EyMjMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMwOWViOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9zZXJfYTIyMzIuaApAQCAtMCwwICsxLDIwMiBAQAorLyogZHJpdmVycy9jaGFyL3Nlcl9hMjIzMi5oICovCisKKy8qICRJZDogc2VyX2EyMjMyLmgsdiAwLjQgMjAwMC8wMS8yNSAxMjowMDowMCBlaGFhc2UgRXhwICQgKi8KKworLyogTGludXggc2VyaWFsIGRyaXZlciBmb3IgdGhlIEFtaWdhIEEyMjMyIGJvYXJkICovCisKKy8qIFRoaXMgZHJpdmVyIGlzIE1BSU5UQUlORUQuIEJlZm9yZSBhcHBseWluZyBhbnkgY2hhbmdlcywgcGxlYXNlIGNvbnRhY3QKKyAqIHRoZSBhdXRob3IuCisgKi8KKyAgIAorLyogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgRW52ZXIgSGFhc2UgICAgPGVoYWFzZUBpbmYuZnUtYmVybGluLmRlPgorICogICAgICAgICAgICAgICAgICAgYWxpYXMgVGhlIEEyMjMyIGRyaXZlciBwcm9qZWN0IDxBMjIzMkBnbXgubmV0PgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAgCisgKi8KKworI2lmbmRlZiBfU0VSX0EyMjMyX0hfCisjZGVmaW5lIF9TRVJfQTIyMzJfSF8KKworLyoKKwlIb3cgbWFueSBib2FyZHMgYXJlIHRvIGJlIHN1cHBvcnRlZCBhdCBtYXhpbXVtOworCSJ1cCB0byBmaXZlIEEyMjMyIE11bHRpcG9ydCBTZXJpYWwgQ2FyZHMgbWF5IGJlIGluc3RhbGxlZCBpbiBhCisJc2luZ2xlIEFtaWdhIDIwMDAiIHN0YXRlcyB0aGUgQTIyMzIgVXNlcidzIEd1aWRlLiBJZiB5b3UgaGF2ZQorCW1vcmUgc2xvdHMgYXZhaWxhYmxlLCB5b3UgbWlnaHQgd2FudCB0byBjaGFuZ2UgdGhlIHZhbHVlIGJlbG93LgorKi8KKyNkZWZpbmUgTUFYX0EyMjMyX0JPQVJEUyA1CisKKyNpZm5kZWYgQTIyMzJfTk9STUFMX01BSk9SCisvKiBUaGlzIGFsbG93cyBvdmVycmlkaW5nIG9uIHRoZSBjb21waWxlciBjb21tYW5kbGluZSwgb3IgaW4gYSAibWFqb3IuaCIgCisgICBpbmNsdWRlIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQgKi8KKyNkZWZpbmUgQTIyMzJfTk9STUFMX01BSk9SICAyMjQJLyogL2Rldi90dHlZKiAqLworI2RlZmluZSBBMjIzMl9DQUxMT1VUX01BSk9SIDIyNQkvKiAvZGV2L2N1eSogICovCisjZW5kaWYKKworLyogU29tZSBtYWdpYyBpcyBhbHdheXMgZ29vZCAtIFdobyBrbm93cyA6KSAqLworI2RlZmluZSBBMjIzMl9NQUdJQyAweDAwMGEyMjMyCisKKy8qIEEyMjMyIHBvcnQgc3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgdGhlCisgICBzdGF0dXMgb2YgZXZlcnkgc2luZ2xlIGxpbmUgdXNlZCAqLworc3RydWN0IGEyMjMyX3BvcnR7CisJc3RydWN0IGdzX3BvcnQgZ3M7CisJdW5zaWduZWQgaW50IHdoaWNoX2EyMjMyOworCXVuc2lnbmVkIGludCB3aGljaF9wb3J0X29uX2EyMjMyOworCXNob3J0IGRpc2FibGVfcng7CisJc2hvcnQgdGhyb3R0bGVfaW5wdXQ7CisJc2hvcnQgY2Rfc3RhdHVzOworfTsKKworI2RlZmluZQlOVU1MSU5FUwkJNwkvKiBudW1iZXIgb2YgbGluZXMgcGVyIGJvYXJkICovCisjZGVmaW5lCUEyMjMyX0lPQlVGTEVOCQkyNTYJLyogbnVtYmVyIG9mIGJ5dGVzIHBlciBidWZmZXIgKi8KKyNkZWZpbmUJQTIyMzJfSU9CVUZMRU5NQVNLCTB4ZmYJLyogbWFzayBmb3IgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgKi8KKworCisjZGVmaW5lCUEyMjMyX1VOS05PV04JMAkvKiBjcnlzdGFsIG5vdCBrbm93biAqLworI2RlZmluZQlBMjIzMl9OT1JNQUwJMQkvKiBub3JtYWwgQTIyMzIgKDEuODQzMiBNSHogb3NjaWxsYXRvcikgKi8KKyNkZWZpbmUJQTIyMzJfVFVSQk8JMgkvKiB0dXJibyBBMjIzMiAoMy42ODY0IE1IeiBvc2NpbGxhdG9yKSAqLworCisKK3N0cnVjdCBhMjIzMmNvbW1vbiB7CisJY2hhciAgIENyeXN0YWw7CS8qIG5vcm1hbCAoMSkgb3IgdHVyYm8gKDIpIGJvYXJkPyAqLworCXVfY2hhciBQYWRfYTsKKwl1X2NoYXIgVGltZXJIOwkvKiB0aW1lciB2YWx1ZSBhZnRlciBzcGVlZCBjaGVjayAqLworCXVfY2hhciBUaW1lckw7CisJdV9jaGFyIENESGVhZDsJLyogaGVhZCBwb2ludGVyIGZvciBDRCBtZXNzYWdlIHF1ZXVlICovCisJdV9jaGFyIENEVGFpbDsJLyogdGFpbCBwb2ludGVyIGZvciBDRCBtZXNzYWdlIHF1ZXVlICovCisJdV9jaGFyIENEU3RhdHVzOworCXVfY2hhciBQYWRfYjsKK307CisKK3N0cnVjdCBhMjIzMnN0YXR1cyB7CisJdV9jaGFyIEluSGVhZDsJCS8qIGlucHV0IHF1ZXVlIGhlYWQgKi8KKwl1X2NoYXIgSW5UYWlsOwkJLyogaW5wdXQgcXVldWUgdGFpbCAqLworCXVfY2hhciBPdXREaXNhYmxlOwkvKiBkaXNhYmxlcyBvdXRwdXQgKi8KKwl1X2NoYXIgT3V0SGVhZDsJCS8qIG91dHB1dCBxdWV1ZSBoZWFkICovCisJdV9jaGFyIE91dFRhaWw7CQkvKiBvdXRwdXQgcXVldWUgdGFpbCAqLworCXVfY2hhciBPdXRDdHJsOwkJLyogc29mdCBmbG93IGNvbnRyb2wgY2hhcmFjdGVyIHRvIHNlbmQgKi8KKwl1X2NoYXIgT3V0Rmx1c2g7CS8qIGZsdXNoZXMgb3V0cHV0IGJ1ZmZlciAqLworCXVfY2hhciBTZXR1cDsJCS8qIGNhdXNlcyByZWNvbmZpZ3VyYXRpb24gKi8KKwl1X2NoYXIgUGFyYW07CQkvKiBwYXJhbWV0ZXIgYnl0ZSAtIHNlZSBBMjIzMlBBUkFNICovCisJdV9jaGFyIENvbW1hbmQ7CQkvKiBjb21tYW5kIGJ5dGUgLSBzZWUgQTIyMzJDTUQgKi8KKwl1X2NoYXIgU29mdEZsb3c7CS8qIGVuYWJsZXMgeG9uL3hvZmYgZmxvdyBjb250cm9sICovCisJLyogcHJpdmF0ZSA2NUVDMDIgZmllbGRzOiAqLworCXVfY2hhciBYb25PZmY7CQkvKiBzdG9yZXMgWE9OL1hPRkYgZW5hYmxlL2Rpc2FibGUgKi8KK307CisKKyNkZWZpbmUJQTIyMzJfTUVNUEFEMQlcCisJKDB4MDIwMCAtIE5VTUxJTkVTICogc2l6ZW9mKHN0cnVjdCBhMjIzMnN0YXR1cykJLQlcCisJc2l6ZW9mKHN0cnVjdCBhMjIzMmNvbW1vbikpCisjZGVmaW5lCUEyMjMyX01FTVBBRDIJKDB4MjAwMCAtIE5VTUxJTkVTICogQTIyMzJfSU9CVUZMRU4gLSBBMjIzMl9JT0JVRkxFTikKKworc3RydWN0IGEyMjMybWVtb3J5IHsKKwlzdHJ1Y3QgYTIyMzJzdGF0dXMgU3RhdHVzW05VTUxJTkVTXTsJLyogMHgwMDAwLTB4MDA2ZiBzdGF0dXMgYXJlYXMgKi8KKwlzdHJ1Y3QgYTIyMzJjb21tb24gQ29tbW9uOwkJLyogMHgwMDcwLTB4MDA3NyBjb21tb24gZmxhZ3MgKi8KKwl1X2NoYXIgRHVtbXkxW0EyMjMyX01FTVBBRDFdOwkJLyogMHgwMFhYLTB4MDFmZiAqLworCXVfY2hhciBPdXRCdWZbTlVNTElORVNdW0EyMjMyX0lPQlVGTEVOXTsvKiAweDAyMDAtMHgwOGZmIG91dHB1dCBidWZzICovCisJdV9jaGFyIEluQnVmW05VTUxJTkVTXVtBMjIzMl9JT0JVRkxFTl07CS8qIDB4MDkwMC0weDBmZmYgaW5wdXQgYnVmcyAqLworCXVfY2hhciBJbkN0bFtOVU1MSU5FU11bQTIyMzJfSU9CVUZMRU5dOwkvKiAweDEwMDAtMHgxNmZmIGNvbnRyb2wgZGF0YSAqLworCXVfY2hhciBDREJ1ZltBMjIzMl9JT0JVRkxFTl07CQkvKiAweDE3MDAtMHgxN2ZmIENEIGV2ZW50IGJ1ZmZlciAqLworCXVfY2hhciBEdW1teTJbQTIyMzJfTUVNUEFEMl07CQkvKiAweDE4MDAtMHgyZmZmICovCisJdV9jaGFyIENvZGVbMHgxMDAwXTsJCQkvKiAweDMwMDAtMHgzZmZmIGNvZGUgYXJlYSAqLworCXVfc2hvcnQgSW50ZXJydXB0QWNrOwkJCS8qIDB4NDAwMCAgICAgICAgaW50ciBhY2sgKi8KKwl1X2NoYXIgRHVtbXkzWzB4M2ZmZV07CQkJLyogMHg0MDAyLTB4N2ZmZiAqLworCXVfc2hvcnQgRW5hYmxlNjUwMlJlc2V0OwkJLyogMHg4MDAwIFN0b3AgYm9hcmQsICovCisJCQkJCQkvKiAgNjUwMiBSRVNFVCBsaW5lIGhlbGQgbG93ICovCisJdV9jaGFyIER1bW15NFsweDNmZmVdOwkJCS8qIDB4ODAwMi0weGJmZmYgKi8KKwl1X3Nob3J0IFJlc2V0Qm9hcmQ7CQkJLyogMHhjMDAwIHJlc2V0IGJvYXJkICYgcnVuLCAqLworCQkJCQkJLyogIDY1MDIgUkVTRVQgbGluZSBoZWxkIGhpZ2ggKi8KK307CisKKyN1bmRlZiBBMjIzMl9NRU1QQUQxCisjdW5kZWYgQTIyMzJfTUVNUEFEMgorCisjZGVmaW5lCUEyMjMySU5DVExfQ0hBUgkJMAkvKiBjb3JyZXNwb25kaW5nIGJ5dGUgaW4gSW5CdWYgaXMgYSBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUJQTIyMzJJTkNUTF9FVkVOVAkxCS8qIGNvcnJlc3BvbmRpbmcgYnl0ZSBpbiBJbkJ1ZiBpcyBhbiBldmVudCAqLworCisjZGVmaW5lCUEyMjMyRVZFTlRfQnJlYWsJMQkvKiBicmVhayBzZXQgKi8KKyNkZWZpbmUJQTIyMzJFVkVOVF9DYXJyaWVyT24JMgkvKiBjYXJyaWVyIHJhaXNlZCAqLworI2RlZmluZQlBMjIzMkVWRU5UX0NhcnJpZXJPZmYJMwkvKiBjYXJyaWVyIGRyb3BwZWQgKi8KKyNkZWZpbmUgQTIyMzJFVkVOVF9TeW5jCQk0CS8qIGRvbid0IGtub3csIGRlZmluZWQgaW4gMjIzMi5heCAqLworCisjZGVmaW5lCUEyMjMyQ01EX0VuYWJsZQkJMHgxCS8qIGVuYWJsZS9EVFIgYml0ICovCisjZGVmaW5lCUEyMjMyQ01EX0Nsb3NlCQkweDIJLyogY2xvc2UgdGhlIGRldmljZSAqLworI2RlZmluZQlBMjIzMkNNRF9PcGVuCQkweGIJLyogb3BlbiB0aGUgZGV2aWNlICovCisjZGVmaW5lCUEyMjMyQ01EX0NNYXNrCQkweGYJLyogY29tbWFuZCBtYXNrICovCisjZGVmaW5lCUEyMjMyQ01EX1JUU09mZgkJMHgwICAJLyogdHVybiBvZmYgUlRTICovCisjZGVmaW5lCUEyMjMyQ01EX1JUU09uCQkweDgJLyogdHVybiBvbiBSVFMgKi8KKyNkZWZpbmUJQTIyMzJDTURfQnJlYWsJCTB4ZAkvKiB0cmFuc21pdCBhIGJyZWFrICovCisjZGVmaW5lCUEyMjMyQ01EX1JUU01hc2sJMHhjCS8qIG1hc2sgZm9yIFJUUyBzdHVmZiAqLworI2RlZmluZQlBMjIzMkNNRF9Ob1Bhcml0eQkweDAwCS8qIGRvbid0IHVzZSBwYXJpdHkgKi8KKyNkZWZpbmUJQTIyMzJDTURfT2RkUGFyaXR5CTB4MjAJLyogb2RkIHBhcml0eSAqLworI2RlZmluZQlBMjIzMkNNRF9FdmVuUGFyaXR5CTB4NjAJLyogZXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUJQTIyMzJDTURfUGFyaXR5TWFzawkweGUwCS8qIHBhcml0eSBtYXNrICovCisKKyNkZWZpbmUJQTIyMzJQQVJBTV9CMTE1MjAwCTB4MAkvKiBiYXVkIHJhdGVzICovCisjZGVmaW5lCUEyMjMyUEFSQU1fQjUwCQkweDEKKyNkZWZpbmUJQTIyMzJQQVJBTV9CNzUJCTB4MgorI2RlZmluZQlBMjIzMlBBUkFNX0IxMTAJCTB4MworI2RlZmluZQlBMjIzMlBBUkFNX0IxMzQJCTB4NAorI2RlZmluZQlBMjIzMlBBUkFNX0IxNTAJCTB4NQorI2RlZmluZQlBMjIzMlBBUkFNX0IzMDAJCTB4NgorI2RlZmluZQlBMjIzMlBBUkFNX0I2MDAJCTB4NworI2RlZmluZQlBMjIzMlBBUkFNX0IxMjAwCTB4OAorI2RlZmluZQlBMjIzMlBBUkFNX0IxODAwCTB4OQorI2RlZmluZQlBMjIzMlBBUkFNX0IyNDAwCTB4YQorI2RlZmluZQlBMjIzMlBBUkFNX0IzNjAwCTB4YgorI2RlZmluZQlBMjIzMlBBUkFNX0I0ODAwCTB4YworI2RlZmluZQlBMjIzMlBBUkFNX0I3MjAwCTB4ZAorI2RlZmluZQlBMjIzMlBBUkFNX0I5NjAwCTB4ZQorI2RlZmluZQlBMjIzMlBBUkFNX0IxOTIwMAkweGYKKyNkZWZpbmUJQTIyMzJQQVJBTV9CYXVkTWFzawkweGYJLyogYmF1ZCByYXRlIG1hc2sgKi8KKyNkZWZpbmUJQTIyMzJQQVJBTV9SY3ZCYXVkCTB4MTAJLyogZW5hYmxlIHJlY2VpdmUgYmF1ZCByYXRlICovCisjZGVmaW5lCUEyMjMyUEFSQU1fOEJpdAkJMHgwMAkvKiBudW1iZXJzIG9mIGJpdHMgKi8KKyNkZWZpbmUJQTIyMzJQQVJBTV83Qml0CQkweDIwCisjZGVmaW5lCUEyMjMyUEFSQU1fNkJpdAkJMHg0MAorI2RlZmluZQlBMjIzMlBBUkFNXzVCaXQJCTB4NjAKKyNkZWZpbmUJQTIyMzJQQVJBTV9CaXRNYXNrCTB4NjAJLyogbnVtYmVycyBvZiBiaXRzIG1hc2sgKi8KKworCisvKiBTdGFuZGFyZCBzcGVlZHMgdGFibGVzLCAtMSBtZWFucyB1bmF2YWlsYWJsZSwgLTIgbWVhbnMgMCBiYXVkOiBzd2l0Y2ggb2ZmIGxpbmUgKi8KKyNkZWZpbmUgQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMIC0xCisjZGVmaW5lIEEyMjMyX0JBVURfVEFCTEVfTlVNX1JBVEVTICgxOCkKK3N0YXRpYyBpbnQgYTIyMzJfYmF1ZF90YWJsZVtBMjIzMl9CQVVEX1RBQkxFX05VTV9SQVRFUyozXSA9IHsKKwkvL0JhdWQJLy9Ob3JtYWwJCQkvL1R1cmJvCisJNTAsCUEyMjMyUEFSQU1fQjUwLAkJCUEyMjMyX0JBVURfVEFCTEVfTk9BVkFJTCwKKwk3NSwJQTIyMzJQQVJBTV9CNzUsCQkJQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMLAorCTExMCwJQTIyMzJQQVJBTV9CMTEwLAkJQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMLAorCTEzNCwJQTIyMzJQQVJBTV9CMTM0LAkJQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMLAorCTE1MCwJQTIyMzJQQVJBTV9CMTUwLAkJQTIyMzJQQVJBTV9CNzUsCisJMjAwLAlBMjIzMl9CQVVEX1RBQkxFX05PQVZBSUwsCUEyMjMyX0JBVURfVEFCTEVfTk9BVkFJTCwKKwkzMDAsCUEyMjMyUEFSQU1fQjMwMCwJCUEyMjMyUEFSQU1fQjE1MCwKKwk2MDAsCUEyMjMyUEFSQU1fQjYwMCwJCUEyMjMyUEFSQU1fQjMwMCwKKwkxMjAwLAlBMjIzMlBBUkFNX0IxMjAwLAkJQTIyMzJQQVJBTV9CNjAwLAorCTE4MDAsCUEyMjMyUEFSQU1fQjE4MDAsCQlBMjIzMl9CQVVEX1RBQkxFX05PQVZBSUwsCisJMjQwMCwJQTIyMzJQQVJBTV9CMjQwMCwJCUEyMjMyUEFSQU1fQjEyMDAsCisJNDgwMCwJQTIyMzJQQVJBTV9CNDgwMCwJCUEyMjMyUEFSQU1fQjI0MDAsCisJOTYwMCwJQTIyMzJQQVJBTV9COTYwMCwJCUEyMjMyUEFSQU1fQjQ4MDAsCisJMTkyMDAsCUEyMjMyUEFSQU1fQjE5MjAwLAkJQTIyMzJQQVJBTV9COTYwMCwKKwkzODQwMCwJQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMLAlBMjIzMlBBUkFNX0IxOTIwMCwKKwk1NzYwMCwJQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMLAlBMjIzMl9CQVVEX1RBQkxFX05PQVZBSUwsCisjaWZkZWYgQTIyMzJfU1BFRURIQUNLCisJMTE1MjAwLAlBMjIzMlBBUkFNX0IxMTUyMDAsCQlBMjIzMl9CQVVEX1RBQkxFX05PQVZBSUwsCisJMjMwNDAwLAlBMjIzMl9CQVVEX1RBQkxFX05PQVZBSUwsCUEyMjMyUEFSQU1fQjExNTIwMAorI2Vsc2UKKwkxMTUyMDAsCUEyMjMyX0JBVURfVEFCTEVfTk9BVkFJTCwJQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMLAorCTIzMDQwMCwJQTIyMzJfQkFVRF9UQUJMRV9OT0FWQUlMLAlBMjIzMl9CQVVEX1RBQkxFX05PQVZBSUwKKyNlbmRpZgorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMmZ3LmF4IGIvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMmZ3LmF4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNjQzODAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc2VyX2EyMjMyZncuYXgKQEAgLTAsMCArMSw1MjkgQEAKKzsubGliICJheG0iCis7Cis7YmVnaW4KKzt0aXRsZSAiQTIyMzIgc2VyaWFsIGJvYXJkIGRyaXZlciIKKzsKKztzZXQgbW9kdWxlcyAiMjIzMiIKKztzZXQgZXhlY3V0YWJsZSAiMjIzMi5iaW4iCis7Cis7Ozs7c2V0IG5vbGluaworOworO3NldCB0ZW1wb3JhcnkgZGlyZWN0b3J5ICJ0OiIKKzsKKztzZXQgYXNzZW1ibHkgb3B0aW9ucyAiLW02NTAyIC1sNjA6dDpsaXN0IgorO3NldCBsaW5rIG9wdGlvbnMgImJpbiI7IGxvYWRhZHIiCis7OztiaW4yYyAyMjMyLmJpbiBtc2M2NTAyLmggbXNjNjUwMmNvZGUKKztlbmQKKzsKKzsKKzsgIyMjIENvbW1vZG9yZSBBMjIzMiBzZXJpYWwgYm9hcmQgZHJpdmVyIGZvciBOZXRCU0QgYnkgSk0gdjEuMyAjIyMKKzsKKzsgLSBDcmVhdGVkIDk1MDUwMSBieSBKTSAtCis7Cis7Cis7IFNlcmlhbCBib2FyZCBkcml2ZXIgc29mdHdhcmUuCis7Cis7CislIENvcHlyaWdodCAoYykgMTk5NSBKdWtrYSBNYXJpbiA8am1hcmluQGptcC5maT4uCislIEFsbCByaWdodHMgcmVzZXJ2ZWQuCislCislIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorJSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyUgYXJlIG1ldDoKKyUgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyUgICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCislICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorJSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorJSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCislICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCislIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorJSAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCislICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyUKKyUgQUxURVJOQVRJVkVMWSwgdGhpcyBwcm9kdWN0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKKyUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZQorJSBHUEwgYXJlIHJlcXVpcmVkIElOU1RFQUQgT0YgdGhlIGFib3ZlIHJlc3RyaWN0aW9ucy4gIChUaGlzIGNsYXVzZSBpcworJSBuZWNlc3NhcnkgZHVlIHRvIGEgcG90ZW50aWFsIGJhZCBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBHUEwgYW5kCislIHRoZSByZXN0cmljdGlvbnMgY29udGFpbmVkIGluIGEgQlNELXN0eWxlIGNvcHlyaWdodC4pCislCislIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyUgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyUgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorJSBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyUgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCislIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorJSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCislIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyUgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorJSBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCis7Cis7Cis7IEJ1Z3M6Cis7Cis7IC0gQ2FuJ3Qgc2VuZCBhIGJyZWFrIHlldAorOworOworOworOyBFZGl0ZWQ6Cis7Cis7IC0gOTUwNTAxIGJ5IEpNIC0+IHYwLjEJLSBDcmVhdGVkIHRoaXMgZmlsZS4KKzsgLSA5NTEwMjkgYnkgSk0gLT4gdjEuMwktIENhcnJpZXIgRGV0ZWN0IGV2ZW50cyBub3cgcXVldWVkIGluIGEgc2VwYXJhdGUKKzsJCQkJICBxdWV1ZS4KKzsKKzsKKworCitDT0RFCQllcXUJJDM4MDAJCTsgc3RhcnQgYWRkcmVzcyBmb3IgcHJvZ3JhbSBjb2RlCisKKworQ1RMX0NIQVIJZXF1CSQwMAkJOyBieXRlIGluIGlidWYgaXMgYSBjaGFyYWN0ZXIKK0NUTF9FVkVOVAllcXUJJDAxCQk7IGJ5dGUgaW4gaWJ1ZiBpcyBhbiBldmVudAorCitFVkVOVF9CUkVBSwllcXUJJDAxCitFVkVOVF9DRE9OCWVxdQkkMDIKK0VWRU5UX0NET0ZGCWVxdQkkMDMKK0VWRU5UX1NZTkMJZXF1CSQwNAorCitYT04JCWVxdQkkMTEKK1hPRkYJCWVxdQkkMTMKKworCitWQVJCQVNFCQltYWNybwkqc3RhcnRpbmdfYWRkcmVzcwk7IHdhcyBWQVJJTklUCitfdmFyYmFzZQlzZXQJXDEKKwkJZW5kbQorCitWQVJERUYJCW1hY3JvCSpuYW1lIHNwYWNlX25lZWRzCitcMQkJZXF1CV92YXJiYXNlCitfdmFyYmFzZQlzZXQJX3ZhcmJhc2UrXDIKKwkJZW5kbQorCisKK3N0egkJbWFjcm8JKiBhZGRyZXNzCisJCSBkYgkkNjQsXDEKKwkJZW5kbQorCitzdHpheAkJbWFjcm8JKiBhZGRyZXNzCisJCSBkYgkkOWUsPFwxLD5cMQorCQllbmRtCisKKworYml0aQkJbWFjcm8JKiBpbW1lZGlhdGUgdmFsdWUKKwkJZGIJJDg5LFwxCisJCWVuZG0KKworc21iMAkJbWFjcm8JKiBhZGRyZXNzCisJCWRiCSQ4NyxcMQorCQllbmRtCitzbWIxCQltYWNybwkqIGFkZHJlc3MKKwkJZGIJJDk3LFwxCisJCWVuZG0KK3NtYjIJCW1hY3JvCSogYWRkcmVzcworCQlkYgkkYTcsXDEKKwkJZW5kbQorc21iMwkJbWFjcm8JKiBhZGRyZXNzCisJCWRiCSRiNyxcMQorCQllbmRtCitzbWI0CQltYWNybwkqIGFkZHJlc3MKKwkJZGIJJGM3LFwxCisJCWVuZG0KK3NtYjUJCW1hY3JvCSogYWRkcmVzcworCQlkYgkkZDcsXDEKKwkJZW5kbQorc21iNgkJbWFjcm8JKiBhZGRyZXNzCisJCWRiCSRlNyxcMQorCQllbmRtCitzbWI3CQltYWNybwkqIGFkZHJlc3MKKwkJZGIJJGY3LFwxCisJCWVuZG0KKworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTsKKzsJCQkJCQkJCQk7Cis7IHN0dWZmIGNvbW1vbiBmb3IgYWxsIHBvcnRzLCBub24tY3JpdGljYWwgKHJ1biBvbmNlIC8gbG9vcCkJCTsKKzsJCQkJCQkJCQk7CitET19TTE9XCQltYWNybwkqIHBvcnRfbnVtYmVyCQkJCQk7CisJCS5sb2NhbAkJCTsJCQkJOworCQlsZGEJQ0lBK0NfUEEJOyBjaGVjayBhbGwgQ0QgaW5wdXRzCQk7CisJCWNtcAlDb21tb25DRG8JOyBjaGFuZ2VkIGZyb20gcHJldmlvdXMgYWNjcHRkPwk7CisJCWJlcQk9b3ZlcgkJOyBub3BlLCBkbyBub3RoaW5nIGVsc2UgaGVyZQk7CisJCQkJCTsJCQkJOworCQljbXAJQ29tbW9uQ0RiCTsgYm91bmNpbmc/CQkJOworCQliZXEJPW5vYm91bmNlCTsgbm9wZSAtPgkJCTsKKwkJCQkJOwkJCQk7CisJCXN0YQlDb21tb25DRGIJOyBzYXZlIGN1cnJlbnQgc3RhdGUJCTsKKwkJbGRhCSM2NAkJOyByZWluaXRpYWxpemUgY291bnRlcgkJOworCQlzdGEJQ29tbW9uQ0RjCTsJCQkJOworCQlqbXAJPW92ZXIJCTsgc2tpcCBDRCBzYXZlCQkJOworCQkJCQk7CQkJCTsKKz1ub2JvdW5jZQlkZWMJQ29tbW9uQ0RjCTsgbm8sIGRlY3JlbWVudCBib3VuY2UgY291bnRlcgk7CisJCWJwbAk9b3ZlcgkJOyBub3QgZG9uZSB5ZXQsIHNvIHNraXAgQ0Qgc2F2ZQk7CisJCQkJCTsJCQkJOworPXNhdmVDRAkJbGR4CUNESGVhZAkJOyBnZXQgd3JpdGUgaW5kZXgJCTsKKwkJc3RhCWNkYnVmLHgJCTsgc2F2ZSBzdGF0dXMgaW4gYnVmZmVyCQk7CisJCWlueAkJCTsJCQkJOworCQljcHgJQ0RUYWlsCQk7IGJ1ZmZlciBmdWxsPwkJCTsKKwkJLmlmCW5lCQk7IG5vOiBwcmVzZXJ2ZSBzdGF0dXM6CQk7CisJCSBzdHgJQ0RIZWFkCQk7IHVwZGF0ZSBpbmRleCBpbiBSQU0JCTsKKwkJIHN0YQlDb21tb25DRG8JOyBzYXZlIHN0YXRlIGZvciB0aGUgbmV4dCBjaGVjawk7CisJCS5lbmQJCQk7CQkJCTsKKz1vdmVyCQkuZW5kCWxvY2FsCQkJCQkJOworCQllbmRtCQkJCQkJCTsKKwkJCQkJCQkJCTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTsKKworCis7IHBvcnQgc3BlY2lmaWMgc3R1ZmYgKG5vIGRhdGEgdHJhbnNmZXIpCisKK0RPX1BPUlQJCW1hY3JvCSogcG9ydF9udW1iZXIKKwkJLmxvY2FsCQkJOwkJCQk7CisJCWxkYQlTZXRVcFwxCQk7IHJlY29uZmlndXJhdGlvbiByZXF1ZXN0Pwk7CisJCS5pZgluZQkJOyB5ZXM6CQkJCTsKKwkJIGxkYQlTb2Z0Rmxvd1wxCTsgZ2V0IFhPTi9YT0ZGIGZsYWcJCTsKKwkJIHN0YQlYb25PZmZcMQk7IHNhdmUgaXQJCQk7CisJCSBsZGEJUGFyYW1cMQkJOyBnZXQgcGFyYW1ldGVyCQkJOworCQkgb3JhCSMlMDAwMTAwMDAJOyB1c2UgYmF1ZCBnZW5lcmF0b3IgZm9yIFJ4CTsKKwkJIHN0YQlBQ0lBXDErQV9DVFJMCTsgc3RvcmUgaW4gY29udHJvbCByZWdpc3Rlcgk7CisJCSBzdHoJT3V0RGlzYWJsZVwxCTsgZW5hYmxlIHRyYW5zbWl0IG91dHB1dAk7CisJCSBzdHoJU2V0VXBcMQkJOyBubyByZWNvbmZpZ3VyYXRpb24gbm8gbW9yZQk7CisJCS5lbmQJCQk7CQkJCTsKKwkJCQkJOwkJCQk7CisJCWxkYQlJbkhlYWRcMQk7IGdldCB3cml0ZSBpbmRleAkJOworCQlzYmMJSW5UYWlsXDEJOyBidWZmZXIgZnVsbCBzb29uPwkJOworCQljbXAJIzIwMAkJOyAyMDAgY2hhcnMgb3IgbW9yZSBpbiBidWZmZXI/CTsKKwkJbGRhCUNvbW1hbmRcMQk7IGdldCBDb21tYW5kIHJlZyB2YWx1ZQkJOworCQlhbmQJIyUxMTExMDAxMQk7IHR1cm4gUlRTIE9GRiBieSBkZWZhdWx0CTsKKwkJLmlmCWNjCQk7IHN0aWxsIHJvb20gaW4gYnVmZmVyOgkJOworCQkgb3JhCSMlMDAwMDEwMDAJOyB0dXJuIFJUUyBPTgkJCTsKKwkJLmVuZAkJCTsJCQkJOworCQlzdGEJQUNJQVwxK0FfQ01ECTsgc2V0L2NsZWFyIFJUUwkJCTsKKwkJCQkJOwkJCQk7CisJCWxkYQlPdXRGbHVzaFwxCTsgcmVxdWVzdCB0byBmbHVzaCBvdXRwdXQgYnVmZmVyOworCQkuaWYJbmUJCTsgeWVzc2ghCQkJOworCQkgbGRhCU91dEhlYWRcMQk7IGdldCBoZWFkCQkJOworCQkgc3RhCU91dFRhaWxcMQk7IHNhdmUgYXMgdGFpbAkJCTsKKwkJIHN0eglPdXREaXNhYmxlXDEJOyBlbmFibGUgdHJhbnNtaXQgb3V0cHV0CTsKKwkJIHN0eglPdXRGbHVzaFwxCTsgY2xlYXIgcmVxdWVzdAkJCTsKKwkJLmVuZAorCQkuZW5kCWxvY2FsCisJCWVuZG0KKworCitET19EQVRBCQltYWNybwkqIHBvcnQgbnVtYmVyCisJCS5sb2NhbAorCQlsZGEJQUNJQVwxK0FfU1IJOyByZWFkIEFDSUEgc3RhdHVzIHJlZ2lzdGVyCTsKKwkJYml0aQlbMTw8M10JCTsgc29tZXRoaW5nIHJlY2VpdmVkPwkJOworCQkuaWYJbmUJCTsgeWVzOgkJCQk7CisJCSBiaXRpCVsxPDwxXQkJOyBmcmFtaW5nIGVycm9yPwkJOworCQkgLmlmCW5lCQk7IHllczoJCQkJOworCQkgIGxkYQlBQ0lBXDErQV9EQVRBCTsgcmVhZCByZWNlaXZlZCBjaGFyYWN0ZXIJOworCQkgIGJuZQk9U0VORAkJOyBub3QgYnJlYWsgLT4gaWdub3JlIGl0CTsKKwkJICBsZHgJSW5IZWFkXDEJOyBnZXQgd3JpdGUgcG9pbnRlcgkJOworCQkgIGxkYQkjQ1RMX0VWRU5UCTsgZ2V0IHR5cGUgb2YgYnl0ZQkJOworCQkgIHN0YQlpY3RsXDEseAk7IHNhdmUgaXQgaW4gSW5DdGwgYnVmZmVyCTsKKwkJICBsZGEJI0VWRU5UX0JSRUFLCTsgZXZlbnQgY29kZQkJCTsKKwkJICBzdGEJaWJ1ZlwxLHgJOyBzYXZlIGl0IGFzIHdlbGwJCTsKKwkJICBpbngJCQk7CQkJCTsKKwkJICBjcHgJSW5UYWlsXDEJOyBzdGlsbCByb29tIGluIGJ1ZmZlcj8JCTsKKwkJICAuaWYJbmUJCTsgYWJzb2x1dGVseToJCQk7CisJCSAgIHN0eAlJbkhlYWRcMQk7IHVwZGF0ZSBpbmRleCBpbiBtZW1vcnkJOworCQkgIC5lbmQJCQk7CQkJCTsKKwkJICBqbXAJPVNFTkQJCTsgZ28gY2hlY2sgaWYgYW55dGhpbmcgdG8gc2VuZAk7CisJCSAuZW5kCQkJOwkJCQk7CisJCSAJCQk7IG5vcm1hbCBjaGFyIHJlY2VpdmVkOgkJOworCQkgbGR4CUluSGVhZFwxCTsgZ2V0IHdyaXRlIGluZGV4CQk7CisJCSBsZGEJQUNJQVwxK0FfREFUQQk7IHJlYWQgcmVjZWl2ZWQgY2hhcmFjdGVyCTsKKwkJIHN0YQlpYnVmXDEseAk7IHNhdmUgY2hhciBpbiBidWZmZXIJCTsKKwkJIHN0emF4CWljdGxcMQkJOyBzZXQgdHlwZSB0byBDVExfQ0hBUgkJOworCQkgaW54CQkJOwkJCQk7CisJCSBjcHgJSW5UYWlsXDEJOyBidWZmZXIgZnVsbD8JCQk7CisJCSAuaWYJbmUJCTsgbm86IHByZXNlcnZlIGNoYXJhY3RlcjoJOworCQkgIHN0eAlJbkhlYWRcMQk7IHVwZGF0ZSBpbmRleCBpbiBSQU0JCTsKKwkJIC5lbmQJCQk7CQkJCTsKKwkJIGFuZAkjJDdmCQk7IG1hc2sgb2ZmIHBhcml0eSBpZiBhbnkJOworCQkgY21wCSNYT0ZGCQk7IFhPRkYgZnJvbSByZW1vdGUgaG9zdD8JOworCQkgLmlmCWVxCQk7IHllczoJCQkJOworCQkgIGxkYQlYb25PZmZcMQk7IGlmIFhPTi9YT0ZGIGhhbmRzaGFraW5nLi4JOworCQkgIHN0YQlPdXREaXNhYmxlXDEJOyAuLmRpc2FibGUgdHJhbnNtaXR0ZXIJCTsKKwkJIC5lbmQJCQk7CQkJCTsKKwkJLmVuZAkJCTsJCQkJOworCQkJCQk7CQkJCTsKKwkJCQkJOyBCVUZGRVIgRlVMTCBDSEVDSyBXQVMgSEVSRQk7CisJCQkJCTsJCQkJOworPVNFTkQJCWxkYQlBQ0lBXDErQV9TUgk7IHRyYW5zbWl0IHJlZ2lzdGVyIGVtcHR5Pwk7CisJCWFuZAkjWzE8PDRdCQk7CQkJCTsKKwkJLmlmCW5lCQk7IHllczoJCQkJOworCQkgbGR4CU91dEN0cmxcMQk7IHNlbmRpbmcgb3V0IFhPTi9YT0ZGPwkJOworCQkgLmlmCW5lCQk7IHllczoJCQkJOworCQkgIGxkYQlDSUErQ19QQgk7IGNoZWNrIENUUyBzaWduYWwJCTsKKwkJICBhbmQJI1sxPDxcMV0JOyAoZm9yIHRoaXMgcG9ydCBvbmx5KQkJOworCQkgIGJuZQk9RE9ORQkJOyBub3QgYWxsb3dlZCB0byBzZW5kIC0+IGRvbmUJOworCQkgIHN0eAlBQ0lBXDErQV9EQVRBCTsgdHJhbnNtaXQgY29udHJvbCBjaGFyCQk7CisJCSAgc3R6CU91dEN0cmxcMQk7IGNsZWFyIGZsYWcJCQk7CisJCSAgam1wCT1ET05FCQk7IGFuZCB3ZSdyZSBkb25lCQk7CisJCSAuZW5kCQkJOwkJCQk7CisJCQkJCTsJCQkJOworCQkgbGR4CU91dFRhaWxcMQk7IGFueXRoaW5nIHRvIHRyYW5zbWl0PwkJOworCQkgY3B4CU91dEhlYWRcMQk7CQkJCTsKKwkJIC5pZgluZQkJOyB5ZXM6CQkJCTsKKwkJICBsZGEJT3V0RGlzYWJsZVwxCTsgYWxsb3dlZCB0byB0cmFuc21pdD8JCTsKKwkJICAuaWYJZXEJCTsgeWVzOgkJCQk7CisJCSAgIGxkYQlDSUErQ19QQgk7IGNoZWNrIENUUyBzaWduYWwJCTsKKwkJICAgYW5kCSNbMTw8XDFdCTsgKGZvciB0aGlzIHBvcnQgb25seSkJCTsKKwkJICAgYm5lCT1ET05FCQk7IG5vdCBhbGxvd2VkIHRvIHNlbmQgLT4gZG9uZQk7CisJCSAgIGxkYQlvYnVmXDEseAk7IGdldCBhIGNoYXIgZnJvbSBidWZmZXIJOworCQkgICBzdGEJQUNJQVwxK0FfREFUQQk7IHNlbmQgaXQgYXdheQkJCTsKKwkJICAgaW5jCU91dFRhaWxcMQk7IHVwZGF0ZSByZWFkIGluZGV4CQk7CisJCSAgLmVuZAkJCTsJCQkJOworCQkgLmVuZAkJCTsJCQkJOworCQkuZW5kCQkJOwkJCQk7Cis9RE9ORQkJLmVuZAlsb2NhbAorCQllbmRtCisKKworCitQT1JUVkFSCQltYWNybwkqIHBvcnQgbnVtYmVyCisJCVZBUkRFRglJbkhlYWRcMSAxCisJCVZBUkRFRglJblRhaWxcMSAxCisJCVZBUkRFRglPdXREaXNhYmxlXDEgMQorCQlWQVJERUYJT3V0SGVhZFwxIDEKKwkJVkFSREVGCU91dFRhaWxcMSAxCisJCVZBUkRFRglPdXRDdHJsXDEgMQorCQlWQVJERUYJT3V0Rmx1c2hcMSAxCisJCVZBUkRFRglTZXRVcFwxIDEKKwkJVkFSREVGCVBhcmFtXDEgMQorCQlWQVJERUYJQ29tbWFuZFwxIDEKKwkJVkFSREVGCVNvZnRGbG93XDEgMQorCQk7IHByaXZhdGU6CisJCVZBUkRFRglYb25PZmZcMSAxCisJCWVuZG0KKworCisgVkFSQkFTRSAwCTsgc3RhcnQgdmFyaWFibGVzIGF0IGFkZHJlc3MgJDAwMDAKKyBQT1JUVkFSIDAJOyBkZWZpbmUgdmFyaWFibGVzIGZvciBwb3J0IDAKKyBQT1JUVkFSIDEJOyBkZWZpbmUgdmFyaWFibGVzIGZvciBwb3J0IDEKKyBQT1JUVkFSIDIJOyBkZWZpbmUgdmFyaWFibGVzIGZvciBwb3J0IDIKKyBQT1JUVkFSIDMJOyBkZWZpbmUgdmFyaWFibGVzIGZvciBwb3J0IDMKKyBQT1JUVkFSIDQJOyBkZWZpbmUgdmFyaWFibGVzIGZvciBwb3J0IDQKKyBQT1JUVkFSIDUJOyBkZWZpbmUgdmFyaWFibGVzIGZvciBwb3J0IDUKKyBQT1JUVkFSIDYJOyBkZWZpbmUgdmFyaWFibGVzIGZvciBwb3J0IDYKKworCisKKyBWQVJERUYJQ3J5c3RhbAkxCTsgMCA9IHVua25vd24sIDEgPSBub3JtYWwsIDIgPSB0dXJibworIFZBUkRFRglQYWRfYQkxCisgVkFSREVGCVRpbWVySAkxCisgVkFSREVGCVRpbWVyTAkxCisgVkFSREVGCUNESGVhZAkxCisgVkFSREVGCUNEVGFpbAkxCisgVkFSREVGCUNEU3RhdHVzIDEKKyBWQVJERUYJUGFkX2IJMQorCisgVkFSREVGCUNvbW1vbkNEbyAxCTsgZm9yIGNhcnJpZXIgZGV0ZWN0IG9wdGltaXphdGlvbgorIFZBUkRFRglDb21tb25DRGMgMQk7IGZvciBjYXJyaWVyIGRldGVjdCBkZWJvdW5jaW5nCisgVkFSREVGCUNvbW1vbkNEYiAxCTsgZm9yIGNhcnJpZXIgZGV0ZWN0IGRlYm91bmNpbmcKKworCisgVkFSQkFTRSAkMDIwMAorIFZBUkRFRglvYnVmMCAyNTYJOyBvdXRwdXQgZGF0YSAoY2hhcmFjdGVycyBvbmx5KQorIFZBUkRFRglvYnVmMSAyNTYKKyBWQVJERUYJb2J1ZjIgMjU2CisgVkFSREVGCW9idWYzIDI1NgorIFZBUkRFRglvYnVmNCAyNTYKKyBWQVJERUYJb2J1ZjUgMjU2CisgVkFSREVGCW9idWY2IDI1NgorCisgVkFSREVGCWlidWYwIDI1Ngk7IGlucHV0IGRhdGEgKGNoYXJhY3RlcnMsIGV2ZW50cyBldGMgLSBzZWUgaWN0bCkKKyBWQVJERUYJaWJ1ZjEgMjU2CisgVkFSREVGCWlidWYyIDI1NgorIFZBUkRFRglpYnVmMyAyNTYKKyBWQVJERUYJaWJ1ZjQgMjU2CisgVkFSREVGCWlidWY1IDI1NgorIFZBUkRFRglpYnVmNiAyNTYKKworIFZBUkRFRglpY3RsMCAyNTYJOyBpbnB1dCBjb250cm9sIGluZm9ybWF0aW9uICh0eXBlIG9mIGRhdGEgaW4gaWJ1ZikKKyBWQVJERUYJaWN0bDEgMjU2CisgVkFSREVGCWljdGwyIDI1NgorIFZBUkRFRglpY3RsMyAyNTYKKyBWQVJERUYJaWN0bDQgMjU2CisgVkFSREVGCWljdGw1IDI1NgorIFZBUkRFRglpY3RsNiAyNTYKKworIFZBUkRFRgljZGJ1ZiAyNTYJOyBDRCBldmVudCBxdWV1ZQorCisKK0FDSUEwCQllcXUJJDQ0MDAKK0FDSUExCQllcXUJJDRjMDAKK0FDSUEyCQllcXUJJDU0MDAKK0FDSUEzCQllcXUJJDVjMDAKK0FDSUE0CQllcXUJJDY0MDAKK0FDSUE1CQllcXUJJDZjMDAKK0FDSUE2CQllcXUJJDc0MDAKKworQV9EQVRBCQllcXUJJDAwCitBX1NSCQllcXUJJDAyCitBX0NNRAkJZXF1CSQwNAorQV9DVFJMCQllcXUJJDA2Cis7ICAwMAl3cml0ZSB0cmFuc21pdCBkYXRhCXJlYWQgcmVjZWl2ZWQgZGF0YQorOyAgMDIJcmVzZXQgQUNJQQkJcmVhZCBzdGF0dXMgcmVnaXN0ZXIKKzsgIDA0CXdyaXRlIGNvbW1hbmQgcmVnaXN0ZXIJcmVhZCBjb21tYW5kIHJlZ2lzdGVyCis7ICAwNgl3cml0ZSBjb250cm9sIHJlZ2lzdGVyCXJlYWQgY29udHJvbCByZWdpc3RlcgorCitDSUEJCWVxdQkkN2MwMAkJOyA4NTIwIENJQQorQ19QQQkJZXF1CSQwMAkJOyBwb3J0IEEgZGF0YSByZWdpc3RlcgorQ19QQgkJZXF1CSQwMgkJOyBwb3J0IEIgZGF0YSByZWdpc3RlcgorQ19ERFJBCQllcXUJJDA0CQk7IGRhdGEgZGlyZWN0aW9uIHJlZ2lzdGVyIGZvciBwb3J0IEEKK0NfRERSQgkJZXF1CSQwNgkJOyBkYXRhIGRpcmVjdGlvbiByZWdpc3RlciBmb3IgcG9ydCBCCitDX1RBTAkJZXF1CSQwOAkJOyB0aW1lciBBCitDX1RBSAkJZXF1CSQwYQorQ19UQkwJCWVxdQkkMGMJCTsgdGltZXIgQgorQ19UQkgJCWVxdQkkMGUKK0NfVE9ETAkJZXF1CSQxMAkJOyBUT0QgTFNCCitDX1RPRE0JCWVxdQkkMTIJCTsgVE9EIG1pZGRsZSBieXRlCitDX1RPREgJCWVxdQkkMTQJCTsgVE9EIE1TQgorQ19EQVRBCQllcXUJJDE4CQk7IHNlcmlhbCBkYXRhIHJlZ2lzdGVyCitDX0lOVENUUkwJZXF1CSQxYQkJOyBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlcgorQ19DVFJMQQkJZXF1CSQxYwkJOyBjb250cm9sIHJlZ2lzdGVyIEEKK0NfQ1RSTEIJCWVxdQkkMWUJCTsgY29udHJvbCByZWdpc3RlciBCCisKKworCisKKworCQlzZWN0aW9uCW1haW4sY29kZSxDT0RFLTIKKworCQlkYgk+Q09ERSw8Q09ERQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS07Cis7IGhlcmUncyB0aGUgaW5pdGlhbGl6YXRpb24gY29kZToJCQkJCTsKKzsJCQkJCQkJCQk7CitSX1JFU0VUCQlsZHgJIyRmZgkJCQkJCTsKKwkJdHhzCQkJOyBpbml0aWFsaXplIHN0YWNrIHBvaW50ZXIJOworCQljbGQJCQk7IGluIGNhc2UgYSA2NTAyIGlzIHVzZWQuLi4JOworCQlsZHgJIzAJCTsJCQkJOworCQlsZGEJIzAJCTsJCQkJOworCQlsZHkJI0NyeXN0YWwJOyB0aGlzIG1hbnkgYnl0ZXMgdG8gY2xlYXIJOworY2xyX2xvb3AJc3RhCTAseAkJOyBjbGVhciB6ZXJvIHBhZ2UgdmFyaWFibGVzCTsKKwkJaW54CQkJOwkJCQk7CisJCWRleQkJCTsJCQkJOworCQlibmUJY2xyX2xvb3AJOwkJCQk7CisJCQkJCTsJCQkJOworCQlzdHoJQ29tbW9uQ0RvCTsgZm9yY2UgQ0QgdGVzdCBhdCBib290CQk7CisJCXN0eglDb21tb25DRGIJOwkJCQk7CisJCXN0eglDREhlYWQJCTsgY2xlYXIgcXVldWUJCQk7CisJCXN0eglDRFRhaWwJCTsJCQkJOworCQkJCQk7CQkJCTsKKwkJbGRhCSMwCQk7CQkJCTsKKwkJc3RhCVBhZF9hCQk7CQkJCTsKKwkJbGRhCSMxNzAJCTsgdGVzdCBjbXAJCQk7CisJCWNtcAkjMTAwCQk7CQkJCTsKKwkJLmlmCWNzCQk7CQkJCTsKKwkJIGluYwlQYWRfYQkJOyBDIHdhcyBzZXQJCQk7CisJCS5lbmQJCQk7CQkJCTsKKwkJCQkJCQkJCTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTsKKzsgU3BlZWQgY2hlY2sJCQkJCQkJCTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTsKKwkJCQkJCQkJCTsKKwkJbGRhCUNyeXN0YWwJCTsgc3BlZWQgYWxyZWFkeSBzZXQ/CQk7CisJCWJlcQlEb1NwZWVkeQk7CQkJCTsKKwkJam1wCUxPT1AJCTsgeWVzLCBza2lwIHNwZWVkIHRlc3QJCTsKKwkJCQkJOwkJCQk7CitEb1NwZWVkeQlsZGEJIyUxMDAxMTAwMAk7IDhOMSwgMTIwMC8yNDAwIGJwcwkJOworCQlzdGEJQUNJQTArQV9DVFJMCTsJCQkJOworCQlsZGEJIyUwMDAwMTAxMQk7IGVuYWJsZSBEVFIJCQk7CisJCXN0YQlBQ0lBMCtBX0NNRAk7CQkJCTsKKwkJbGRhCUFDSUEwK0FfU1IJOyByZWFkIHN0YXR1cyByZWdpc3RlcgkJOworCQkJCQk7CQkJCTsKKwkJbGRhCSMlMTAwMDAwMDAJOyBkaXNhYmxlIGFsbCBpbnRzICh1bm5lY2Vzc2FyeSk7CisJCXN0YQlDSUErQ19JTlRDVFJMCTsJCQkJOworCQlsZGEJIzI1NQkJOyBwcm9ncmFtIHRoZSB0aW1lcgkJOworCQlzdGEJQ0lBK0NfVEFMCTsJCQkJOworCQlzdGEJQ0lBK0NfVEFICTsJCQkJOworCQkJCQk7CQkJCTsKKwkJbGR4CSMwCQk7CQkJCTsKKwkJc3R4CUFDSUEwK0FfREFUQQk7IHRyYW5zbWl0IGEgemVybwkJOworCQlub3AJCQk7CQkJCTsKKwkJbm9wCQkJOwkJCQk7CisJCWxkYQlBQ0lBMCtBX1NSCTsgcmVhZCBzdGF0dXMJCQk7CisJCW5vcAkJCTsJCQkJOworCQlub3AJCQk7CQkJCTsKKwkJc3R4CUFDSUEwK0FfREFUQQk7IHRyYW5zbWl0IGEgemVybwkJOworU3BlZWR5MQkJbGRhCUFDSUEwK0FfU1IJOyByZWFkIHN0YXR1cwkJCTsKKwkJYW5kCSNbMTw8NF0JCTsgdHJhbnNtaXQgZGF0YSByZWcgZW1wdHk/CTsKKwkJYmVxCVNwZWVkeTEJCTsgbm90IHlldCwgd2FpdCBtb3JlCQk7CisJCQkJCTsJCQkJOworCQlsZGEJIyUwMDAxMDAwMQk7IGxvYWQgJiBzdGFydCB0aGUgdGltZXIJOworCQlzdHgJQUNJQTArQV9EQVRBCTsgdHJhbnNtaXQgb25lIG1vcmUgemVybwk7CisJCXN0YQlDSUErQ19DVFJMQQk7CQkJCTsKK1NwZWVkeTIJCWxkYQlBQ0lBMCtBX1NSCTsgcmVhZCBzdGF0dXMJCQk7CisJCWFuZAkjWzE8PDRdCQk7IHRyYW5zbWl0IGRhdGEgcmVnIGVtcHR5Pwk7CisJCWJlcQlTcGVlZHkyCQk7IG5vdCB5ZXQsIHdhaXQgbW9yZQkJOworCQlzdHgJQ0lBK0NfQ1RSTEEJOyBzdG9wIHRoZSB0aW1lcgkJOworCQkJCQk7CQkJCTsKKwkJbGRhCUNJQStDX1RBTAk7IGNvcHkgdGltZXIgdmFsdWUgZm9yIDY4awk7CisJCXN0YQlUaW1lckwJCTsJCQkJOworCQlsZGEJQ0lBK0NfVEFICTsJCQkJOworCQlzdGEJVGltZXJICQk7CQkJCTsKKwkJY21wCSMkZDAJCTsgdHVyYm8gb3Igbm9ybWFsPwkJOworCQkuaWYJY3MJCTsJCQkJOworCQkgbGRhCSMyCQk7IHR1cmJvISA6LSkJCQk7CisJCS5lbHNlCQkJOwkJCQk7CisJCSBsZGEJIzEJCTsgbm9ybWFsIDotKAkJCTsKKwkJLmVuZAkJCTsJCQkJOworCQlzdGEJQ3J5c3RhbAkJOwkJCQk7CisJCWxkYQkjMAkJOwkJCQk7CisJCXN0YQlBQ0lBMCtBX1NSCTsJCQkJOworCQlzdGEJQUNJQTArQV9DVFJMCTsgcmVzZXQgVUFSVAkJCTsKKwkJc3RhCUFDSUEwK0FfQ01ECTsJCQkJOworCQkJCQkJCQkJOworCQlqbXAJTE9PUAkJCQkJCTsKKwkJCQkJCQkJCTsKKzsJCQkJCQkJCQk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS07Cis7CQkJCQkJCQkJOworOyBUaGUgUmVhbCBUaGluZzoJCQkJCQkJOworOwkJCQkJCQkJCTsKK0xPT1AJCURPX1NMT1cJCQk7IGRvIG5vbi1jcml0aWNhbCB0aGluZ3MJOworCQlqc3IJZG9faW5wdXQJOyBjaGVjayBmb3IgcmVjZWl2ZWQgZGF0YQorCQlET19QT1JUCTAKKwkJanNyCWRvX2lucHV0CisJCURPX1BPUlQJMQorCQlqc3IJZG9faW5wdXQKKwkJRE9fUE9SVAkyCisJCWpzcglkb19pbnB1dAorCQlET19QT1JUCTMKKwkJanNyCWRvX2lucHV0CisJCURPX1BPUlQJNAorCQlqc3IJZG9faW5wdXQKKwkJRE9fUE9SVAk1CisJCWpzcglkb19pbnB1dAorCQlET19QT1JUCTYKKwkJanNyCWRvX2lucHV0CisJCWptcAlMT09QCisKKworZG9faW5wdXQJRE9fREFUQQkwCisJCURPX0RBVEEJMQorCQlET19EQVRBCTIKKwkJRE9fREFUQQkzCisJCURPX0RBVEEJNAorCQlET19EQVRBCTUKKwkJRE9fREFUQQk2CisJCXJ0cworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTsKKwkJc2VjdGlvbgl2ZWN0b3JzLGRhdGEsJDNmZmEKKwkJZHcJJGQwZDAKKwkJZHcJUl9SRVNFVAorCQlkdwkkYzBjZQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tOworCisKKworCQllbmQKKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZXJfYTIyMzJmdy5oIGIvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMmZ3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5YTMwYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9zZXJfYTIyMzJmdy5oCkBAIC0wLDAgKzEsMzA2IEBACisvKiBkcml2ZXJzL2NoYXIvc2VyX2EyMjMyZncuaCAqLworCisvKiAkSWQ6IHNlcl9hMjIzMmZ3LmgsdiAwLjQgMjAwMC8wMS8yNSAxMjowMDowMCBlaGFhc2UgRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBKdWtrYSBNYXJpbiA8am1hcmluQGptcC5maT4uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgYW5kIHRoZSBlbnRpcmUgcGVybWlzc2lvbiBub3RpY2UgaW4gaXRzIGVudGlyZXR5LAorICogICAgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnRpZXMuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgcHJvZHVjdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlCisgKiByZXF1aXJlZCBJTlNURUFEIE9GIHRoZSBhYm92ZSByZXN0cmljdGlvbnMuICAoVGhpcyBjbGF1c2UgaXMKKyAqIG5lY2Vzc2FyeSBkdWUgdG8gYSBwb3RlbnRpYWwgYmFkIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIEdQTCBhbmQKKyAqIHRoZSByZXN0cmljdGlvbnMgY29udGFpbmVkIGluIGEgQlNELXN0eWxlIGNvcHlyaWdodC4pCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLyogVGhpcyBpcyB0aGUgNjVFQzAyIGNvZGUgYnkgSnVra2EgTWFyaW4gdGhhdCBpcyBleGVjdXRlZCBieQorICAgdGhlIEEyMjMyJ3MgNjVFQzAyIHByb2Nlc3NvciAoYmFzZSBhZGRyZXNzOiAweDM4MDApCisgICBTb3VyY2UgZmlsZToJc2VyX2EyMjMyZncuYXgKKyAgIFZlcnNpb246CTEuMyAoOTUxMDI5KQorICAgS25vd24gQnVnczoJQ2Fubm90IHNlbmQgYSBicmVhayB5ZXQKKyovCitzdGF0aWMgdW5zaWduZWQgY2hhciBhMjIzMl82NUVDMDJjb2RlW10gPSB7CisJMHgzOCwgMHgwMCwgMHhBMiwgMHhGRiwgMHg5QSwgMHhEOCwgMHhBMiwgMHgwMCwgCisJMHhBOSwgMHgwMCwgMHhBMCwgMHg1NCwgMHg5NSwgMHgwMCwgMHhFOCwgMHg4OCwgCisJMHhEMCwgMHhGQSwgMHg2NCwgMHg1QywgMHg2NCwgMHg1RSwgMHg2NCwgMHg1OCwgCisJMHg2NCwgMHg1OSwgMHhBOSwgMHgwMCwgMHg4NSwgMHg1NSwgMHhBOSwgMHhBQSwgCisJMHhDOSwgMHg2NCwgMHg5MCwgMHgwMiwgMHhFNiwgMHg1NSwgMHhBNSwgMHg1NCwgCisJMHhGMCwgMHgwMywgMHg0QywgMHg5MiwgMHgzOCwgMHhBOSwgMHg5OCwgMHg4RCwgCisJMHgwNiwgMHg0NCwgMHhBOSwgMHgwQiwgMHg4RCwgMHgwNCwgMHg0NCwgMHhBRCwgCisJMHgwMiwgMHg0NCwgMHhBOSwgMHg4MCwgMHg4RCwgMHgxQSwgMHg3QywgMHhBOSwgCisJMHhGRiwgMHg4RCwgMHgwOCwgMHg3QywgMHg4RCwgMHgwQSwgMHg3QywgMHhBMiwgCisJMHgwMCwgMHg4RSwgMHgwMCwgMHg0NCwgMHhFQSwgMHhFQSwgMHhBRCwgMHgwMiwgCisJMHg0NCwgMHhFQSwgMHhFQSwgMHg4RSwgMHgwMCwgMHg0NCwgMHhBRCwgMHgwMiwgCisJMHg0NCwgMHgyOSwgMHgxMCwgMHhGMCwgMHhGOSwgMHhBOSwgMHgxMSwgMHg4RSwgCisJMHgwMCwgMHg0NCwgMHg4RCwgMHgxQywgMHg3QywgMHhBRCwgMHgwMiwgMHg0NCwgCisJMHgyOSwgMHgxMCwgMHhGMCwgMHhGOSwgMHg4RSwgMHgxQywgMHg3QywgMHhBRCwgCisJMHgwOCwgMHg3QywgMHg4NSwgMHg1NywgMHhBRCwgMHgwQSwgMHg3QywgMHg4NSwgCisJMHg1NiwgMHhDOSwgMHhEMCwgMHg5MCwgMHgwNSwgMHhBOSwgMHgwMiwgMHg0QywgCisJMHg4MiwgMHgzOCwgMHhBOSwgMHgwMSwgMHg4NSwgMHg1NCwgMHhBOSwgMHgwMCwgCisJMHg4RCwgMHgwMiwgMHg0NCwgMHg4RCwgMHgwNiwgMHg0NCwgMHg4RCwgMHgwNCwgCisJMHg0NCwgMHg0QywgMHg5MiwgMHgzOCwgMHhBRCwgMHgwMCwgMHg3QywgMHhDNSwgCisJMHg1QywgMHhGMCwgMHgxRiwgMHhDNSwgMHg1RSwgMHhGMCwgMHgwOSwgMHg4NSwgCisJMHg1RSwgMHhBOSwgMHg0MCwgMHg4NSwgMHg1RCwgMHg0QywgMHhCOCwgMHgzOCwgCisJMHhDNiwgMHg1RCwgMHgxMCwgMHgwRSwgMHhBNiwgMHg1OCwgMHg5RCwgMHgwMCwgCisJMHgxNywgMHhFOCwgMHhFNCwgMHg1OSwgMHhGMCwgMHgwNCwgMHg4NiwgMHg1OCwgCisJMHg4NSwgMHg1QywgMHgyMCwgMHgyMywgMHgzQSwgMHhBNSwgMHgwNywgMHhGMCwgCisJMHgwRiwgMHhBNSwgMHgwQSwgMHg4NSwgMHgwQiwgMHhBNSwgMHgwOCwgMHgwOSwgCisJMHgxMCwgMHg4RCwgMHgwNiwgMHg0NCwgMHg2NCwgMHgwMiwgMHg2NCwgMHgwNywgCisJMHhBNSwgMHgwMCwgMHhFNSwgMHgwMSwgMHhDOSwgMHhDOCwgMHhBNSwgMHgwOSwgCisJMHgyOSwgMHhGMywgMHhCMCwgMHgwMiwgMHgwOSwgMHgwOCwgMHg4RCwgMHgwNCwgCisJMHg0NCwgMHhBNSwgMHgwNiwgMHhGMCwgMHgwOCwgMHhBNSwgMHgwMywgMHg4NSwgCisJMHgwNCwgMHg2NCwgMHgwMiwgMHg2NCwgMHgwNiwgMHgyMCwgMHgyMywgMHgzQSwgCisJMHhBNSwgMHgxMywgMHhGMCwgMHgwRiwgMHhBNSwgMHgxNiwgMHg4NSwgMHgxNywgCisJMHhBNSwgMHgxNCwgMHgwOSwgMHgxMCwgMHg4RCwgMHgwNiwgMHg0QywgMHg2NCwgCisJMHgwRSwgMHg2NCwgMHgxMywgMHhBNSwgMHgwQywgMHhFNSwgMHgwRCwgMHhDOSwgCisJMHhDOCwgMHhBNSwgMHgxNSwgMHgyOSwgMHhGMywgMHhCMCwgMHgwMiwgMHgwOSwgCisJMHgwOCwgMHg4RCwgMHgwNCwgMHg0QywgMHhBNSwgMHgxMiwgMHhGMCwgMHgwOCwgCisJMHhBNSwgMHgwRiwgMHg4NSwgMHgxMCwgMHg2NCwgMHgwRSwgMHg2NCwgMHgxMiwgCisJMHgyMCwgMHgyMywgMHgzQSwgMHhBNSwgMHgxRiwgMHhGMCwgMHgwRiwgMHhBNSwgCisJMHgyMiwgMHg4NSwgMHgyMywgMHhBNSwgMHgyMCwgMHgwOSwgMHgxMCwgMHg4RCwgCisJMHgwNiwgMHg1NCwgMHg2NCwgMHgxQSwgMHg2NCwgMHgxRiwgMHhBNSwgMHgxOCwgCisJMHhFNSwgMHgxOSwgMHhDOSwgMHhDOCwgMHhBNSwgMHgyMSwgMHgyOSwgMHhGMywgCisJMHhCMCwgMHgwMiwgMHgwOSwgMHgwOCwgMHg4RCwgMHgwNCwgMHg1NCwgMHhBNSwgCisJMHgxRSwgMHhGMCwgMHgwOCwgMHhBNSwgMHgxQiwgMHg4NSwgMHgxQywgMHg2NCwgCisJMHgxQSwgMHg2NCwgMHgxRSwgMHgyMCwgMHgyMywgMHgzQSwgMHhBNSwgMHgyQiwgCisJMHhGMCwgMHgwRiwgMHhBNSwgMHgyRSwgMHg4NSwgMHgyRiwgMHhBNSwgMHgyQywgCisJMHgwOSwgMHgxMCwgMHg4RCwgMHgwNiwgMHg1QywgMHg2NCwgMHgyNiwgMHg2NCwgCisJMHgyQiwgMHhBNSwgMHgyNCwgMHhFNSwgMHgyNSwgMHhDOSwgMHhDOCwgMHhBNSwgCisJMHgyRCwgMHgyOSwgMHhGMywgMHhCMCwgMHgwMiwgMHgwOSwgMHgwOCwgMHg4RCwgCisJMHgwNCwgMHg1QywgMHhBNSwgMHgyQSwgMHhGMCwgMHgwOCwgMHhBNSwgMHgyNywgCisJMHg4NSwgMHgyOCwgMHg2NCwgMHgyNiwgMHg2NCwgMHgyQSwgMHgyMCwgMHgyMywgCisJMHgzQSwgMHhBNSwgMHgzNywgMHhGMCwgMHgwRiwgMHhBNSwgMHgzQSwgMHg4NSwgCisJMHgzQiwgMHhBNSwgMHgzOCwgMHgwOSwgMHgxMCwgMHg4RCwgMHgwNiwgMHg2NCwgCisJMHg2NCwgMHgzMiwgMHg2NCwgMHgzNywgMHhBNSwgMHgzMCwgMHhFNSwgMHgzMSwgCisJMHhDOSwgMHhDOCwgMHhBNSwgMHgzOSwgMHgyOSwgMHhGMywgMHhCMCwgMHgwMiwgCisJMHgwOSwgMHgwOCwgMHg4RCwgMHgwNCwgMHg2NCwgMHhBNSwgMHgzNiwgMHhGMCwgCisJMHgwOCwgMHhBNSwgMHgzMywgMHg4NSwgMHgzNCwgMHg2NCwgMHgzMiwgMHg2NCwgCisJMHgzNiwgMHgyMCwgMHgyMywgMHgzQSwgMHhBNSwgMHg0MywgMHhGMCwgMHgwRiwgCisJMHhBNSwgMHg0NiwgMHg4NSwgMHg0NywgMHhBNSwgMHg0NCwgMHgwOSwgMHgxMCwgCisJMHg4RCwgMHgwNiwgMHg2QywgMHg2NCwgMHgzRSwgMHg2NCwgMHg0MywgMHhBNSwgCisJMHgzQywgMHhFNSwgMHgzRCwgMHhDOSwgMHhDOCwgMHhBNSwgMHg0NSwgMHgyOSwgCisJMHhGMywgMHhCMCwgMHgwMiwgMHgwOSwgMHgwOCwgMHg4RCwgMHgwNCwgMHg2QywgCisJMHhBNSwgMHg0MiwgMHhGMCwgMHgwOCwgMHhBNSwgMHgzRiwgMHg4NSwgMHg0MCwgCisJMHg2NCwgMHgzRSwgMHg2NCwgMHg0MiwgMHgyMCwgMHgyMywgMHgzQSwgMHhBNSwgCisJMHg0RiwgMHhGMCwgMHgwRiwgMHhBNSwgMHg1MiwgMHg4NSwgMHg1MywgMHhBNSwgCisJMHg1MCwgMHgwOSwgMHgxMCwgMHg4RCwgMHgwNiwgMHg3NCwgMHg2NCwgMHg0QSwgCisJMHg2NCwgMHg0RiwgMHhBNSwgMHg0OCwgMHhFNSwgMHg0OSwgMHhDOSwgMHhDOCwgCisJMHhBNSwgMHg1MSwgMHgyOSwgMHhGMywgMHhCMCwgMHgwMiwgMHgwOSwgMHgwOCwgCisJMHg4RCwgMHgwNCwgMHg3NCwgMHhBNSwgMHg0RSwgMHhGMCwgMHgwOCwgMHhBNSwgCisJMHg0QiwgMHg4NSwgMHg0QywgMHg2NCwgMHg0QSwgMHg2NCwgMHg0RSwgMHgyMCwgCisJMHgyMywgMHgzQSwgMHg0QywgMHg5MiwgMHgzOCwgMHhBRCwgMHgwMiwgMHg0NCwgCisJMHg4OSwgMHgwOCwgMHhGMCwgMHgzQiwgMHg4OSwgMHgwMiwgMHhGMCwgMHgxQiwgCisJMHhBRCwgMHgwMCwgMHg0NCwgMHhEMCwgMHgzMiwgMHhBNiwgMHgwMCwgMHhBOSwgCisJMHgwMSwgMHg5RCwgMHgwMCwgMHgxMCwgMHhBOSwgMHgwMSwgMHg5RCwgMHgwMCwgCisJMHgwOSwgMHhFOCwgMHhFNCwgMHgwMSwgMHhGMCwgMHgwMiwgMHg4NiwgMHgwMCwgCisJMHg0QywgMHg2NSwgMHgzQSwgMHhBNiwgMHgwMCwgMHhBRCwgMHgwMCwgMHg0NCwgCisJMHg5RCwgMHgwMCwgMHgwOSwgMHg5RSwgMHgwMCwgMHgxMCwgMHhFOCwgMHhFNCwgCisJMHgwMSwgMHhGMCwgMHgwMiwgMHg4NiwgMHgwMCwgMHgyOSwgMHg3RiwgMHhDOSwgCisJMHgxMywgMHhEMCwgMHgwNCwgMHhBNSwgMHgwQiwgMHg4NSwgMHgwMiwgMHhBRCwgCisJMHgwMiwgMHg0NCwgMHgyOSwgMHgxMCwgMHhGMCwgMHgyQywgMHhBNiwgMHgwNSwgCisJMHhGMCwgMHgwRiwgMHhBRCwgMHgwMiwgMHg3QywgMHgyOSwgMHgwMSwgMHhEMCwgCisJMHgyMSwgMHg4RSwgMHgwMCwgMHg0NCwgMHg2NCwgMHgwNSwgMHg0QywgMHg5OCwgCisJMHgzQSwgMHhBNiwgMHgwNCwgMHhFNCwgMHgwMywgMHhGMCwgMHgxMywgMHhBNSwgCisJMHgwMiwgMHhEMCwgMHgwRiwgMHhBRCwgMHgwMiwgMHg3QywgMHgyOSwgMHgwMSwgCisJMHhEMCwgMHgwOCwgMHhCRCwgMHgwMCwgMHgwMiwgMHg4RCwgMHgwMCwgMHg0NCwgCisJMHhFNiwgMHgwNCwgMHhBRCwgMHgwMiwgMHg0QywgMHg4OSwgMHgwOCwgMHhGMCwgCisJMHgzQiwgMHg4OSwgMHgwMiwgMHhGMCwgMHgxQiwgMHhBRCwgMHgwMCwgMHg0QywgCisJMHhEMCwgMHgzMiwgMHhBNiwgMHgwQywgMHhBOSwgMHgwMSwgMHg5RCwgMHgwMCwgCisJMHgxMSwgMHhBOSwgMHgwMSwgMHg5RCwgMHgwMCwgMHgwQSwgMHhFOCwgMHhFNCwgCisJMHgwRCwgMHhGMCwgMHgwMiwgMHg4NiwgMHgwQywgMHg0QywgMHhEQSwgMHgzQSwgCisJMHhBNiwgMHgwQywgMHhBRCwgMHgwMCwgMHg0QywgMHg5RCwgMHgwMCwgMHgwQSwgCisJMHg5RSwgMHgwMCwgMHgxMSwgMHhFOCwgMHhFNCwgMHgwRCwgMHhGMCwgMHgwMiwgCisJMHg4NiwgMHgwQywgMHgyOSwgMHg3RiwgMHhDOSwgMHgxMywgMHhEMCwgMHgwNCwgCisJMHhBNSwgMHgxNywgMHg4NSwgMHgwRSwgMHhBRCwgMHgwMiwgMHg0QywgMHgyOSwgCisJMHgxMCwgMHhGMCwgMHgyQywgMHhBNiwgMHgxMSwgMHhGMCwgMHgwRiwgMHhBRCwgCisJMHgwMiwgMHg3QywgMHgyOSwgMHgwMiwgMHhEMCwgMHgyMSwgMHg4RSwgMHgwMCwgCisJMHg0QywgMHg2NCwgMHgxMSwgMHg0QywgMHgwRCwgMHgzQiwgMHhBNiwgMHgxMCwgCisJMHhFNCwgMHgwRiwgMHhGMCwgMHgxMywgMHhBNSwgMHgwRSwgMHhEMCwgMHgwRiwgCisJMHhBRCwgMHgwMiwgMHg3QywgMHgyOSwgMHgwMiwgMHhEMCwgMHgwOCwgMHhCRCwgCisJMHgwMCwgMHgwMywgMHg4RCwgMHgwMCwgMHg0QywgMHhFNiwgMHgxMCwgMHhBRCwgCisJMHgwMiwgMHg1NCwgMHg4OSwgMHgwOCwgMHhGMCwgMHgzQiwgMHg4OSwgMHgwMiwgCisJMHhGMCwgMHgxQiwgMHhBRCwgMHgwMCwgMHg1NCwgMHhEMCwgMHgzMiwgMHhBNiwgCisJMHgxOCwgMHhBOSwgMHgwMSwgMHg5RCwgMHgwMCwgMHgxMiwgMHhBOSwgMHgwMSwgCisJMHg5RCwgMHgwMCwgMHgwQiwgMHhFOCwgMHhFNCwgMHgxOSwgMHhGMCwgMHgwMiwgCisJMHg4NiwgMHgxOCwgMHg0QywgMHg0RiwgMHgzQiwgMHhBNiwgMHgxOCwgMHhBRCwgCisJMHgwMCwgMHg1NCwgMHg5RCwgMHgwMCwgMHgwQiwgMHg5RSwgMHgwMCwgMHgxMiwgCisJMHhFOCwgMHhFNCwgMHgxOSwgMHhGMCwgMHgwMiwgMHg4NiwgMHgxOCwgMHgyOSwgCisJMHg3RiwgMHhDOSwgMHgxMywgMHhEMCwgMHgwNCwgMHhBNSwgMHgyMywgMHg4NSwgCisJMHgxQSwgMHhBRCwgMHgwMiwgMHg1NCwgMHgyOSwgMHgxMCwgMHhGMCwgMHgyQywgCisJMHhBNiwgMHgxRCwgMHhGMCwgMHgwRiwgMHhBRCwgMHgwMiwgMHg3QywgMHgyOSwgCisJMHgwNCwgMHhEMCwgMHgyMSwgMHg4RSwgMHgwMCwgMHg1NCwgMHg2NCwgMHgxRCwgCisJMHg0QywgMHg4MiwgMHgzQiwgMHhBNiwgMHgxQywgMHhFNCwgMHgxQiwgMHhGMCwgCisJMHgxMywgMHhBNSwgMHgxQSwgMHhEMCwgMHgwRiwgMHhBRCwgMHgwMiwgMHg3QywgCisJMHgyOSwgMHgwNCwgMHhEMCwgMHgwOCwgMHhCRCwgMHgwMCwgMHgwNCwgMHg4RCwgCisJMHgwMCwgMHg1NCwgMHhFNiwgMHgxQywgMHhBRCwgMHgwMiwgMHg1QywgMHg4OSwgCisJMHgwOCwgMHhGMCwgMHgzQiwgMHg4OSwgMHgwMiwgMHhGMCwgMHgxQiwgMHhBRCwgCisJMHgwMCwgMHg1QywgMHhEMCwgMHgzMiwgMHhBNiwgMHgyNCwgMHhBOSwgMHgwMSwgCisJMHg5RCwgMHgwMCwgMHgxMywgMHhBOSwgMHgwMSwgMHg5RCwgMHgwMCwgMHgwQywgCisJMHhFOCwgMHhFNCwgMHgyNSwgMHhGMCwgMHgwMiwgMHg4NiwgMHgyNCwgMHg0QywgCisJMHhDNCwgMHgzQiwgMHhBNiwgMHgyNCwgMHhBRCwgMHgwMCwgMHg1QywgMHg5RCwgCisJMHgwMCwgMHgwQywgMHg5RSwgMHgwMCwgMHgxMywgMHhFOCwgMHhFNCwgMHgyNSwgCisJMHhGMCwgMHgwMiwgMHg4NiwgMHgyNCwgMHgyOSwgMHg3RiwgMHhDOSwgMHgxMywgCisJMHhEMCwgMHgwNCwgMHhBNSwgMHgyRiwgMHg4NSwgMHgyNiwgMHhBRCwgMHgwMiwgCisJMHg1QywgMHgyOSwgMHgxMCwgMHhGMCwgMHgyQywgMHhBNiwgMHgyOSwgMHhGMCwgCisJMHgwRiwgMHhBRCwgMHgwMiwgMHg3QywgMHgyOSwgMHgwOCwgMHhEMCwgMHgyMSwgCisJMHg4RSwgMHgwMCwgMHg1QywgMHg2NCwgMHgyOSwgMHg0QywgMHhGNywgMHgzQiwgCisJMHhBNiwgMHgyOCwgMHhFNCwgMHgyNywgMHhGMCwgMHgxMywgMHhBNSwgMHgyNiwgCisJMHhEMCwgMHgwRiwgMHhBRCwgMHgwMiwgMHg3QywgMHgyOSwgMHgwOCwgMHhEMCwgCisJMHgwOCwgMHhCRCwgMHgwMCwgMHgwNSwgMHg4RCwgMHgwMCwgMHg1QywgMHhFNiwgCisJMHgyOCwgMHhBRCwgMHgwMiwgMHg2NCwgMHg4OSwgMHgwOCwgMHhGMCwgMHgzQiwgCisJMHg4OSwgMHgwMiwgMHhGMCwgMHgxQiwgMHhBRCwgMHgwMCwgMHg2NCwgMHhEMCwgCisJMHgzMiwgMHhBNiwgMHgzMCwgMHhBOSwgMHgwMSwgMHg5RCwgMHgwMCwgMHgxNCwgCisJMHhBOSwgMHgwMSwgMHg5RCwgMHgwMCwgMHgwRCwgMHhFOCwgMHhFNCwgMHgzMSwgCisJMHhGMCwgMHgwMiwgMHg4NiwgMHgzMCwgMHg0QywgMHgzOSwgMHgzQywgMHhBNiwgCisJMHgzMCwgMHhBRCwgMHgwMCwgMHg2NCwgMHg5RCwgMHgwMCwgMHgwRCwgMHg5RSwgCisJMHgwMCwgMHgxNCwgMHhFOCwgMHhFNCwgMHgzMSwgMHhGMCwgMHgwMiwgMHg4NiwgCisJMHgzMCwgMHgyOSwgMHg3RiwgMHhDOSwgMHgxMywgMHhEMCwgMHgwNCwgMHhBNSwgCisJMHgzQiwgMHg4NSwgMHgzMiwgMHhBRCwgMHgwMiwgMHg2NCwgMHgyOSwgMHgxMCwgCisJMHhGMCwgMHgyQywgMHhBNiwgMHgzNSwgMHhGMCwgMHgwRiwgMHhBRCwgMHgwMiwgCisJMHg3QywgMHgyOSwgMHgxMCwgMHhEMCwgMHgyMSwgMHg4RSwgMHgwMCwgMHg2NCwgCisJMHg2NCwgMHgzNSwgMHg0QywgMHg2QywgMHgzQywgMHhBNiwgMHgzNCwgMHhFNCwgCisJMHgzMywgMHhGMCwgMHgxMywgMHhBNSwgMHgzMiwgMHhEMCwgMHgwRiwgMHhBRCwgCisJMHgwMiwgMHg3QywgMHgyOSwgMHgxMCwgMHhEMCwgMHgwOCwgMHhCRCwgMHgwMCwgCisJMHgwNiwgMHg4RCwgMHgwMCwgMHg2NCwgMHhFNiwgMHgzNCwgMHhBRCwgMHgwMiwgCisJMHg2QywgMHg4OSwgMHgwOCwgMHhGMCwgMHgzQiwgMHg4OSwgMHgwMiwgMHhGMCwgCisJMHgxQiwgMHhBRCwgMHgwMCwgMHg2QywgMHhEMCwgMHgzMiwgMHhBNiwgMHgzQywgCisJMHhBOSwgMHgwMSwgMHg5RCwgMHgwMCwgMHgxNSwgMHhBOSwgMHgwMSwgMHg5RCwgCisJMHgwMCwgMHgwRSwgMHhFOCwgMHhFNCwgMHgzRCwgMHhGMCwgMHgwMiwgMHg4NiwgCisJMHgzQywgMHg0QywgMHhBRSwgMHgzQywgMHhBNiwgMHgzQywgMHhBRCwgMHgwMCwgCisJMHg2QywgMHg5RCwgMHgwMCwgMHgwRSwgMHg5RSwgMHgwMCwgMHgxNSwgMHhFOCwgCisJMHhFNCwgMHgzRCwgMHhGMCwgMHgwMiwgMHg4NiwgMHgzQywgMHgyOSwgMHg3RiwgCisJMHhDOSwgMHgxMywgMHhEMCwgMHgwNCwgMHhBNSwgMHg0NywgMHg4NSwgMHgzRSwgCisJMHhBRCwgMHgwMiwgMHg2QywgMHgyOSwgMHgxMCwgMHhGMCwgMHgyQywgMHhBNiwgCisJMHg0MSwgMHhGMCwgMHgwRiwgMHhBRCwgMHgwMiwgMHg3QywgMHgyOSwgMHgyMCwgCisJMHhEMCwgMHgyMSwgMHg4RSwgMHgwMCwgMHg2QywgMHg2NCwgMHg0MSwgMHg0QywgCisJMHhFMSwgMHgzQywgMHhBNiwgMHg0MCwgMHhFNCwgMHgzRiwgMHhGMCwgMHgxMywgCisJMHhBNSwgMHgzRSwgMHhEMCwgMHgwRiwgMHhBRCwgMHgwMiwgMHg3QywgMHgyOSwgCisJMHgyMCwgMHhEMCwgMHgwOCwgMHhCRCwgMHgwMCwgMHgwNywgMHg4RCwgMHgwMCwgCisJMHg2QywgMHhFNiwgMHg0MCwgMHhBRCwgMHgwMiwgMHg3NCwgMHg4OSwgMHgwOCwgCisJMHhGMCwgMHgzQiwgMHg4OSwgMHgwMiwgMHhGMCwgMHgxQiwgMHhBRCwgMHgwMCwgCisJMHg3NCwgMHhEMCwgMHgzMiwgMHhBNiwgMHg0OCwgMHhBOSwgMHgwMSwgMHg5RCwgCisJMHgwMCwgMHgxNiwgMHhBOSwgMHgwMSwgMHg5RCwgMHgwMCwgMHgwRiwgMHhFOCwgCisJMHhFNCwgMHg0OSwgMHhGMCwgMHgwMiwgMHg4NiwgMHg0OCwgMHg0QywgMHgyMywgCisJMHgzRCwgMHhBNiwgMHg0OCwgMHhBRCwgMHgwMCwgMHg3NCwgMHg5RCwgMHgwMCwgCisJMHgwRiwgMHg5RSwgMHgwMCwgMHgxNiwgMHhFOCwgMHhFNCwgMHg0OSwgMHhGMCwgCisJMHgwMiwgMHg4NiwgMHg0OCwgMHgyOSwgMHg3RiwgMHhDOSwgMHgxMywgMHhEMCwgCisJMHgwNCwgMHhBNSwgMHg1MywgMHg4NSwgMHg0QSwgMHhBRCwgMHgwMiwgMHg3NCwgCisJMHgyOSwgMHgxMCwgMHhGMCwgMHgyQywgMHhBNiwgMHg0RCwgMHhGMCwgMHgwRiwgCisJMHhBRCwgMHgwMiwgMHg3QywgMHgyOSwgMHg0MCwgMHhEMCwgMHgyMSwgMHg4RSwgCisJMHgwMCwgMHg3NCwgMHg2NCwgMHg0RCwgMHg0QywgMHg1NiwgMHgzRCwgMHhBNiwgCisJMHg0QywgMHhFNCwgMHg0QiwgMHhGMCwgMHgxMywgMHhBNSwgMHg0QSwgMHhEMCwgCisJMHgwRiwgMHhBRCwgMHgwMiwgMHg3QywgMHgyOSwgMHg0MCwgMHhEMCwgMHgwOCwgCisJMHhCRCwgMHgwMCwgMHgwOCwgMHg4RCwgMHgwMCwgMHg3NCwgMHhFNiwgMHg0QywgCisJMHg2MCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMCwgMHhEMCwgMHgwMCwgMHgzOCwgCisJMHhDRSwgMHhDMCwgCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NlcmlhbDE2Ny5jIGIvZHJpdmVycy9jaGFyL3NlcmlhbDE2Ny5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZGVhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc2VyaWFsMTY3LmMKQEAgLTAsMCArMSwyODU4IEBACisvKgorICogbGludXgvZHJpdmVycy9jaGFyL3NlcmlhbDE2Ny5jCisgKgorICogRHJpdmVyIGZvciBNVk1FMTY2LzcgYm9hcmQgc2VyaWFsIHBvcnRzLCB3aGljaCBhcmUgdmlhIGEgQ0QyNDAxLgorICogQmFzZWQgdmVyeSBtdWNoIG9uIGN5Y2xhZGVzLmMuCisgKgorICogTVZNRTE2Ni83IHdvcmsgYnkgUmljaGFyZCBIaXJzdCBbcmljaGFyZEBzbGVlcGllLmRlbW9uLmNvLnVrXQorICoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogc3RhdGljIGNoYXIgcmNzaWRbXSA9CisgKiAiJFJldmlzaW9uOiAxLjM2LjEuNCAkJERhdGU6IDE5OTUvMDMvMjkgMDY6MTQ6MTQgJCI7CisgKgorICogIGxpbnV4L2tlcm5lbC9jeWNsYWRlcy5jCisgKgorICogTWFpbnRhaW5lZCBieSBNYXJjaW8gU2FpdG8gKGN5Y2xhZGVzQG5ldGNvbS5jb20pIGFuZAorICogUmFuZG9scGggQmVudHNvbiAoYmVudHNvbkBncmllZy5zZWFzbHVnLm9yZykKKyAqCisgKiBNdWNoIG9mIHRoZSBkZXNpZ24gYW5kIHNvbWUgb2YgdGhlIGNvZGUgY2FtZSBmcm9tIHNlcmlhbC5jCisgKiB3aGljaCB3YXMgY29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcy4gIEl0IHdhcworICogZXh0ZW5zaXZlbHkgcmV3cml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIDgvMTYvOTIgLS0gOS8xNC85MiwKKyAqIGFuZCB0aGVuIGZpeGVkIGFzIHN1Z2dlc3RlZCBieSBNaWNoYWVsIEsuIEpvaG5zb24gMTIvMTIvOTIuCisgKgorICogVGhpcyB2ZXJzaW9uIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGlycSdzLgorICoKKyAqICRMb2c6IGN5Y2xhZGVzLmMsdiAkCisgKiBSZXZpc2lvbiAxLjM2LjEuNCAgMTk5NS8wMy8yOSAgMDY6MTQ6MTQgIGJlbnRzb24KKyAqIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIEN5Y2xvbS0xNlkgYW5kIEN5Y2xvbS0zMlllOworICoKKyAqIENoYW5nZXM6CisgKgorICogMjAwIGxpbmVzIG9mIGNoYW5nZXMgcmVjb3JkIHJlbW92ZWQgLSBSR0ggMTEtMTAtOTUsIHN0YXJ0aW5nIHdvcmsgb24KKyAqIGNvbnZlcnRpbmcgdGhpcyB0byBkcml2ZSBzZXJpYWwgcG9ydHMgb24gbXZtZTE2NiAoY2QyNDAxKS4KKyAqCisgKiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSAyMDAwLzA4LzI1CisgKiAtIGdldCByaWQgb2YgdmVyaWZ5X2FyZWEKKyAqIC0gdXNlIGdldF91c2VyIHRvIGFjY2VzcyBtZW1vcnkgZnJvbSB1c2Vyc3BhY2UgaW4gc2V0X3RocmVzaG9sZCwKKyAqICAgc2V0X2RlZmF1bHRfdGhyZXNob2xkIGFuZCBzZXRfdGltZW91dAorICogLSBkb24ndCB1c2UgdGhlIHBhbmljIGZ1bmN0aW9uIGluIHNlcmlhbDE2N19pbml0CisgKiAtIGRvIHJlc291cmNlIHJlbGVhc2Ugb24gZmFpbHVyZSBvbiBzZXJpYWwxNjdfaW5pdAorICogLSBpbmNsdWRlIG1pc3NpbmcgcmVzdG9yZV9mbGFncyBpbiBtdm1lMTY3X3NlcmlhbF9jb25zb2xlX3NldHVwCisgKgorICogS2FycyBkZSBKb25nIDxqb25na0BsaW51eC1tNjhrLm9yZz4gLSAyMDA0LzA5LzA2CisgKiAtIHJlcGxhY2UgYm90dG9tIGhhbGYgaGFuZGxlciB3aXRoIHRhc2sgcXVldWUgaGFuZGxlcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxQLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwxNjcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL212bWUxNnhody5oPgorI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjZGVmaW5lIFNFUklBTF9QQVJBTk9JQV9DSEVDSworI3VuZGVmICBTRVJJQUxfREVCVUdfT1BFTgorI3VuZGVmICBTRVJJQUxfREVCVUdfVEhST1RUTEUKKyN1bmRlZiAgU0VSSUFMX0RFQlVHX09USEVSCisjdW5kZWYgIFNFUklBTF9ERUJVR19JTworI3VuZGVmICBTRVJJQUxfREVCVUdfQ09VTlQKKyN1bmRlZiAgU0VSSUFMX0RFQlVHX0RUUgorI3VuZGVmICBDWUNMT01fMTZZX0hBQ0sKKyNkZWZpbmUgIENZQ0xPTV9FTkFCTEVfTU9OSVRPUklORworCisjZGVmaW5lIFdBS0VVUF9DSEFSUyAyNTYKKworI2RlZmluZSBTVERfQ09NX0ZMQUdTICgwKQorCisjZGVmaW5lIFNFUklBTF9UWVBFX05PUk1BTCAgMQorCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmN5X3NlcmlhbF9kcml2ZXI7CitleHRlcm4gaW50IHNlcmlhbF9jb25zb2xlOworc3RhdGljIHN0cnVjdCBjeWNsYWRlc19wb3J0ICpzZXJpYWxfY29uc29sZV9pbmZvID0gTlVMTDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaWFsX2NvbnNvbGVfY2ZsYWcgPSAwOwordV9jaGFyIGluaXRpYWxfY29uc29sZV9zcGVlZDsKKworLyogQmFzZSBhZGRyZXNzIG9mIGNkMjQwMSBjaGlwIG9uIG12bWUxNjYvNyAqLworCisjZGVmaW5lIEJBU0VfQUREUiAoMHhmZmY0NTAwMCkKKyNkZWZpbmUgcGNjMmNoaXAJKCh2b2xhdGlsZSB1X2NoYXIgKikweGZmZjQyMDAwKQorI2RlZmluZSBQY2NTQ0NNSUNSCTB4MWQKKyNkZWZpbmUgUGNjU0NDVElDUgkweDFlCisjZGVmaW5lIFBjY1NDQ1JJQ1IJMHgxZgorI2RlZmluZSBQY2NUUElBQ0tSCTB4MjUKKyNkZWZpbmUgUGNjUlBJQUNLUgkweDI3CisjZGVmaW5lIFBjY0lNTFIJCTB4M2YKKworLyogVGhpcyBpcyB0aGUgcGVyLXBvcnQgZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBjeWNsYWRlc19wb3J0IGN5X3BvcnRbXSA9IHsKKyAgICAgIC8qIENBUkQjICAqLworICAgICAgICB7LTEgfSwgICAgICAvKiB0dHlTMCAqLworICAgICAgICB7LTEgfSwgICAgICAvKiB0dHlTMSAqLworICAgICAgICB7LTEgfSwgICAgICAvKiB0dHlTMiAqLworICAgICAgICB7LTEgfSwgICAgICAvKiB0dHlTMyAqLworfTsKKyNkZWZpbmUgTlJfUE9SVFMgICAgICAgIChzaXplb2YoY3lfcG9ydCkvc2l6ZW9mKHN0cnVjdCBjeWNsYWRlc19wb3J0KSkKKworLyoKKyAqIHRtcF9idWYgaXMgdXNlZCBhcyBhIHRlbXBvcmFyeSBidWZmZXIgYnkgc2VyaWFsX3dyaXRlLiAgV2UgbmVlZCB0bworICogbG9jayBpdCBpbiBjYXNlIHRoZSBjb3B5X2Zyb21fdXNlciBibG9ja3Mgd2hpbGUgc3dhcHBpbmcgaW4gYSBwYWdlLAorICogYW5kIHNvbWUgb3RoZXIgcHJvZ3JhbSB0cmllcyB0byBkbyBhIHNlcmlhbCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lLgorICogU2luY2UgdGhlIGxvY2sgd2lsbCBvbmx5IGNvbWUgdW5kZXIgY29udGVudGlvbiB3aGVuIHRoZSBzeXN0ZW0gaXMKKyAqIHN3YXBwaW5nIGFuZCBhdmFpbGFibGUgbWVtb3J5IGlzIGxvdywgaXQgbWFrZXMgc2Vuc2UgdG8gc2hhcmUgb25lCisgKiBidWZmZXIgYWNyb3NzIGFsbCB0aGUgc2VyaWFsIHBvcnRzLCBzaW5jZSBpdCBzaWduaWZpY2FudGx5IHNhdmVzCisgKiBtZW1vcnkgaWYgbGFyZ2UgbnVtYmVycyBvZiBzZXJpYWwgcG9ydHMgYXJlIG9wZW4uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmID0gMDsKK0RFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOworCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGxvb2sgdXAgdGhlIGRpdmlzb3Igc3BlZWRzIGFuZCB0aGUgdGltZW91dHMKKyAqIFdlJ3JlIG5vcm1hbGx5IGxpbWl0ZWQgdG8gMTUgZGlzdGluY3QgYmF1ZCByYXRlcy4gIFRoZSBleHRyYQorICogYXJlIGFjY2Vzc2VkIHZpYSBzZXR0aW5ncyBpbiBpbmZvLT5mbGFncy4KKyAqICAgICAgICAgMCwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwKKyAqICAgICAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISSAgICAgICAgICAgIFZISQorICovCitzdGF0aWMgaW50IGJhdWRfdGFibGVbXSA9IHsKKyAgICAgICAgICAgMCwgICAgNTAsICAgIDc1LCAgIDExMCwgICAxMzQsICAgMTUwLCAgIDIwMCwgICAzMDAsICAgNjAwLCAgMTIwMCwKKyAgICAgICAgMTgwMCwgIDI0MDAsICA0ODAwLCAgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgNzY4MDAsMTE1MjAwLDE1MDAwMCwKKyAgICAgICAgMH07CisKKyNpZiAwCitzdGF0aWMgY2hhciBiYXVkX2NvW10gPSB7ICAvKiAyNSBNSHogY2xvY2sgb3B0aW9uIHRhYmxlICovCisgICAgICAgIC8qIHZhbHVlID0+ICAgIDAwICAgIDAxICAgMDIgICAgMDMgICAgMDQgKi8KKyAgICAgICAgLyogZGl2aWRlIGJ5ICAgIDggICAgMzIgICAxMjggICA1MTIgIDIwNDggKi8KKyAgICAgICAgMHgwMCwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwMywgIDB4MDMsICAweDAzLCAgMHgwMiwKKyAgICAgICAgMHgwMiwgIDB4MDIsICAweDAxLCAgMHgwMSwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMH07CisKK3N0YXRpYyBjaGFyIGJhdWRfYnByW10gPSB7ICAvKiAyNSBNSHogYmF1ZCByYXRlIHBlcmlvZCB0YWJsZSAqLworICAgICAgICAweDAwLCAgMHhmNSwgIDB4YTMsICAweDZmLCAgMHg1YywgIDB4NTEsICAweGY1LCAgMHhhMywgIDB4NTEsICAweGEzLAorICAgICAgICAweDZkLCAgMHg1MSwgIDB4YTMsICAweDUxLCAgMHhhMywgIDB4NTEsICAweDM2LCAgMHgyOSwgIDB4MWIsICAweDE1fTsKKyNlbmRpZgorCisvKiBJIHRoaW5rIDE2NiBicmQgY2xvY2tzIDI0MDEgYXQgMjBNSHouLi4uICovCisKKy8qIFRoZXNlIHZhbHVlcyBhcmUgd3JpdHRlbiBkaXJlY3RseSB0byB0Y29yLCBhbmQgPj4gNSBmb3Igd3JpdGluZyB0byByY29yICovCitzdGF0aWMgdV9jaGFyIGJhdWRfY29bXSA9IHsgIC8qIDIwIE1IeiBjbG9jayBvcHRpb24gdGFibGUgKi8KKyAgICAgICAgMHgwMCwgIDB4ODAsICAweDgwLCAgMHg4MCwgIDB4ODAsICAweDgwLCAgMHg4MCwgIDB4NjAsICAweDYwLCAgMHg0MCwKKyAgICAgICAgMHg0MCwgIDB4NDAsICAweDIwLCAgMHgyMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMH07CisKKy8qIFRoZXNlIHZhbHVlcyB3cml0dGVuIGRpcmVjdGx5IHRvIHRicHIvcmJwciAqLworc3RhdGljIHVfY2hhciBiYXVkX2JwcltdID0geyAgLyogMjAgTUh6IGJhdWQgcmF0ZSBwZXJpb2QgdGFibGUgKi8KKyAgICAgICAgMHgwMCwgIDB4YzAsICAweDgwLCAgMHg1OCwgIDB4NmMsICAweDQwLCAgMHhjMCwgIDB4ODEsICAweDQwLCAgMHg4MSwKKyAgICAgICAgMHg1NywgIDB4NDAsICAweDgxLCAgMHg0MCwgIDB4ODEsICAweDQwLCAgMHgyYiwgIDB4MjAsICAweDE1LCAgMHgxMH07CisKK3N0YXRpYyB1X2NoYXIgYmF1ZF9jb3I0W10gPSB7ICAvKiByZWNlaXZlIHRocmVzaG9sZCAqLworICAgICAgICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLAorICAgICAgICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDA5LCAgMHgwOSwgIDB4MDgsICAweDA4LCAgMHgwOCwgIDB4MDgsICAweDA3fTsKKworCisKK3N0YXRpYyB2b2lkIHNodXRkb3duKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopOworc3RhdGljIGludCBzdGFydHVwIChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKTsKK3N0YXRpYyB2b2lkIGN5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgY3lfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIGNvbmZpZ19zZXR1cChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKTsKK2V4dGVybiB2b2lkIGNvbnNvbGVfcHJpbnQoY29uc3QgY2hhciAqKTsKKyNpZmRlZiBDWUNMT01fU0hPV19TVEFUVVMKK3N0YXRpYyB2b2lkIHNob3dfc3RhdHVzKGludCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SRU1PVEVfREVCVUcKK3N0YXRpYyB2b2lkIGRlYnVnX3NldHVwKHZvaWQpOwordm9pZCBxdWV1ZURlYnVnQ2hhciAoaW50IGMpOworaW50IGdldERlYnVnQ2hhcih2b2lkKTsKKworI2RlZmluZSBERUJVR19QT1JUCTEKKyNkZWZpbmUgREVCVUdfTEVOCTI1NgorCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CWluOworCWludAlvdXQ7CisJdW5zaWduZWQgY2hhcglidWZbREVCVUdfTEVOXTsKK30gZGVidWdxOworCitkZWJ1Z3EgZGVidWdpcTsKKyNlbmRpZgorCisvKgorICogSSBoYXZlIG15IG93biB2ZXJzaW9uIG9mIHVkZWxheSgpLCBhcyBpdCBpcyBuZWVkZWQgd2hlbiBpbml0aWFsaXNpbmcKKyAqIHRoZSBjaGlwLCBiZWZvcmUgdGhlIGRlbGF5IGxvb3AgaGFzIGJlZW4gY2FsaWJyYXRlZC4gIFNob3VsZCBwcm9iYWJseQorICogcmVmZXJlbmNlIG9uZSBvZiB0aGUgdm1lY2hpcDIgb3IgcGNjY2hpcDIgY291bnRlciBmb3IgYW4gYWNjdXJhdGUKKyAqIGRlbGF5LCBidXQgdGhpcyB3aWxkIGd1ZXNzIHdpbGwgZG8gZm9yIG5vdy4KKyAqLworCit2b2lkIG15X3VkZWxheSAobG9uZyB1cykKK3sKKwl1X2NoYXIgeDsKKwl2b2xhdGlsZSB1X2NoYXIgKnAgPSAmeDsKKwlpbnQgaTsKKworCXdoaWxlICh1cy0tKQorCQlmb3IgKGkgPSAxMDA7IGk7IGktLSkKKwkJCXggfD0gKnA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzZXJpYWxfcGFyYW5vaWFfY2hlY2soc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8sIGNoYXIgKm5hbWUsCisJCSAgICAgIGNvbnN0IGNoYXIgKnJvdXRpbmUpCit7CisjaWZkZWYgU0VSSUFMX1BBUkFOT0lBX0NIRUNLCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmJhZG1hZ2ljID0KKwkiV2FybmluZzogYmFkIG1hZ2ljIG51bWJlciBmb3Igc2VyaWFsIHN0cnVjdCAoJXMpIGluICVzXG4iOworICAgIHN0YXRpYyBjb25zdCBjaGFyICpiYWRpbmZvID0KKwkiV2FybmluZzogbnVsbCBjeWNsYWRlc19wb3J0IGZvciAoJXMpIGluICVzXG4iOworICAgIHN0YXRpYyBjb25zdCBjaGFyICpiYWRyYW5nZSA9CisJIldhcm5pbmc6IGN5Y2xhZGVzX3BvcnQgb3V0IG9mIHJhbmdlIGZvciAoJXMpIGluICVzXG4iOworCisgICAgaWYgKCFpbmZvKSB7CisJcHJpbnRrKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOworCXJldHVybiAxOworICAgIH0KKworICAgIGlmKCAobG9uZylpbmZvIDwgKGxvbmcpKCZjeV9wb3J0WzBdKQorICAgIHx8IChsb25nKSgmY3lfcG9ydFtOUl9QT1JUU10pIDwgKGxvbmcpaW5mbyApeworCXByaW50ayhiYWRyYW5nZSwgbmFtZSwgcm91dGluZSk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGluZm8tPm1hZ2ljICE9IENZQ0xBREVTX01BR0lDKSB7CisJcHJpbnRrKGJhZG1hZ2ljLCBuYW1lLCByb3V0aW5lKTsKKwlyZXR1cm4gMTsKKyAgICB9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30gLyogc2VyaWFsX3BhcmFub2lhX2NoZWNrICovCisKKyNpZiAwCisvKiBUaGUgZm9sbG93aW5nIGRpYWdub3N0aWMgcm91dGluZXMgYWxsb3cgdGhlIGRyaXZlciB0byBzcGV3CisgICBpbmZvcm1hdGlvbiBvbiB0aGUgc2NyZWVuLCBldmVuIChlc3BlY2lhbGx5ISkgZHVyaW5nIGludGVycnVwdHMuCisgKi8KK3ZvaWQKK1NQKGNoYXIgKmRhdGEpeworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAgICAgY29uc29sZV9wcmludChkYXRhKTsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CitjaGFyIHNjcm5bMl07Cit2b2lkCitDUChjaGFyIGRhdGEpeworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAgICAgc2NyblswXSA9IGRhdGE7CisgICAgICAgIGNvbnNvbGVfcHJpbnQoc2Nybik7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfS8qIENQICovCisKK3ZvaWQgQ1AxKGludCBkYXRhKSB7IChkYXRhPDEwKT8gIENQKGRhdGErJzAnKTogQ1AoZGF0YSsnQSctMTApOyB9LyogQ1AxICovCit2b2lkIENQMihpbnQgZGF0YSkgeyBDUDEoKGRhdGE+PjQpICYgMHgwZik7IENQMSggZGF0YSAmIDB4MGYpOyB9LyogQ1AyICovCit2b2lkIENQNChpbnQgZGF0YSkgeyBDUDIoKGRhdGE+PjgpICYgMHhmZik7IENQMihkYXRhICYgMHhmZik7IH0vKiBDUDQgKi8KK3ZvaWQgQ1A4KGxvbmcgZGF0YSkgeyBDUDQoKGRhdGE+PjE2KSAmIDB4ZmZmZik7IENQNChkYXRhICYgMHhmZmZmKTsgfS8qIENQOCAqLworI2VuZGlmCisKKy8qIFRoaXMgcm91dGluZSB3YWl0cyB1cCB0byAxMDAwIG1pY3JvLXNlY29uZHMgZm9yIHRoZSBwcmV2aW91cworICAgY29tbWFuZCB0byB0aGUgQ2lycnVzIGNoaXAgdG8gY29tcGxldGUgYW5kIHRoZW4gaXNzdWVzIHRoZQorICAgbmV3IGNvbW1hbmQuICBBbiBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGUgcHJldmlvdXMgY29tbWFuZAorICAgZGlkbid0IGZpbmlzaCB3aXRoaW4gdGhlIHRpbWUgbGltaXQuCisgKi8KK3Vfc2hvcnQKK3dyaXRlX2N5X2NtZCh2b2xhdGlsZSB1X2NoYXIgKmJhc2VfYWRkciwgdV9jaGFyIGNtZCkKK3sKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgdm9sYXRpbGUgaW50ICBpOworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCS8qIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwcmV2aW91cyBjb21tYW5kIGhhcyBjb21wbGV0ZWQgKi8KKwlmb3IoaSA9IDAgOyBpIDwgMTAwIDsgaSsrKXsKKwkgICAgaWYgKGJhc2VfYWRkcltDeUNDUl0gPT0gMCl7CisJCWJyZWFrOworCSAgICB9CisJICAgIG15X3VkZWxheSgxMEwpOworCX0KKwkvKiBpZiB0aGUgQ0NSIG5ldmVyIGNsZWFyZWQsIHRoZSBwcmV2aW91cyBjb21tYW5kCisJICAgIGRpZG4ndCBmaW5pc2ggd2l0aGluIHRoZSAicmVhc29uYWJsZSB0aW1lIiAqLworCWlmICggaSA9PSAxMCApIHsKKwkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCSAgICByZXR1cm4gKC0xKTsKKwl9CisKKwkvKiBJc3N1ZSB0aGUgbmV3IGNvbW1hbmQgKi8KKwliYXNlX2FkZHJbQ3lDQ1JdID0gY21kOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICByZXR1cm4oMCk7Cit9IC8qIHdyaXRlX2N5X2NtZCAqLworCisKKy8qIGN5X3N0YXJ0IGFuZCBjeV9zdG9wIHByb3ZpZGUgc29mdHdhcmUgb3V0cHV0IGZsb3cgY29udHJvbCBhcyBhCisgICBmdW5jdGlvbiBvZiBYT04vWE9GRiwgc29mdHdhcmUgQ1RTLCBhbmQgb3RoZXIgc3VjaCBzdHVmZi4gKi8KKworc3RhdGljIHZvaWQKK2N5X3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKUJBU0VfQUREUjsKKyAgaW50IGNoYW5uZWw7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1RIRVIKKyAgICBwcmludGsoImN5X3N0b3AgJXNcbiIsIHR0eS0+bmFtZSk7IC8qICovCisjZW5kaWYKKworICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfc3RvcCIpKQorCXJldHVybjsKKwkKKyAgICBjaGFubmVsID0gaW5mby0+bGluZTsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAgICAgYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpKGNoYW5uZWwpOyAvKiBpbmRleCBjaGFubmVsICovCisgICAgICAgIGJhc2VfYWRkcltDeUlFUl0gJj0gfihDeVR4TXB0eXxDeVR4UmR5KTsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICByZXR1cm47Cit9IC8qIGN5X3N0b3AgKi8KKworc3RhdGljIHZvaWQKK2N5X3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVuc2lnbmVkIGNoYXIgKilCQVNFX0FERFI7CisgIGludCBjaGFubmVsOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeV9zdGFydCAlc1xuIiwgdHR5LT5uYW1lKTsgLyogKi8KKyNlbmRpZgorCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9zdGFydCIpKQorCXJldHVybjsKKwkKKyAgICBjaGFubmVsID0gaW5mby0+bGluZTsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAgICAgYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpKGNoYW5uZWwpOworICAgICAgICBiYXNlX2FkZHJbQ3lJRVJdIHw9IEN5VHhNcHR5OworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIHJldHVybjsKK30gLyogY3lfc3RhcnQgKi8KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyIHRvIHNjaGVkdWxlCisgKiBwcm9jZXNzaW5nIGluIHRoZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgcG9ydGlvbiBvZiB0aGUgZHJpdmVyCisgKiAoYWxzbyBrbm93biBhcyB0aGUgImJvdHRvbSBoYWxmIikuICBUaGlzIGNhbiBiZSBjYWxsZWQgYW55CisgKiBudW1iZXIgb2YgdGltZXMgZm9yIGFueSBjaGFubmVsIHdpdGhvdXQgaGFybS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitjeV9zY2hlZF9ldmVudChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbywgaW50IGV2ZW50KQoreworICAgIGluZm8tPmV2ZW50IHw9IDEgPDwgZXZlbnQ7IC8qIHJlbWVtYmVyIHdoYXQga2luZCBvZiBldmVudCBhbmQgd2hvICovCisgICAgc2NoZWR1bGVfd29yaygmaW5mby0+dHF1ZXVlKTsKK30gLyogY3lfc2NoZWRfZXZlbnQgKi8KKworCisvKiBUaGUgcmVhbCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lcyBhcmUgY2FsbGVkCisgICB3aGVuZXZlciB0aGUgY2FyZCB3YW50cyBpdHMgaGFuZCBoZWxkLS1jaGFycworICAgcmVjZWl2ZWQsIG91dCBidWZmZXIgZW1wdHksIG1vZGVtIGNoYW5nZSwgZXRjLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2NkMjQwMV9yeGVycl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisgICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKyAgICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbzsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKUJBU0VfQUREUjsKKyAgICB1bnNpZ25lZCBjaGFyIGVyciwgcmZvYzsKKyAgICBpbnQgY2hhbm5lbDsKKyAgICBjaGFyIGRhdGE7CisKKyAgICAvKiBkZXRlcm1pbmUgdGhlIGNoYW5uZWwgYW5kIGNoYW5nZSB0byB0aGF0IGNvbnRleHQgKi8KKyAgICBjaGFubmVsID0gKHVfc2hvcnQgKSAoYmFzZV9hZGRyW0N5TElDUl0gPj4gMik7CisgICAgaW5mbyA9ICZjeV9wb3J0W2NoYW5uZWxdOworICAgIGluZm8tPmxhc3RfYWN0aXZlID0gamlmZmllczsKKworICAgIGlmICgoZXJyID0gYmFzZV9hZGRyW0N5UklTUl0pICYgQ3lUSU1FT1VUKSB7CisJLyogVGhpcyBpcyBhIHJlY2VpdmUgdGltZW91dCBpbnRlcnJ1cHQsIGlnbm9yZSBpdCAqLworCWJhc2VfYWRkcltDeVJFT0lSXSA9IEN5Tk9UUkFOUzsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgfQorCisgICAgLyogUmVhZCBhIGJ5dGUgb2YgZGF0YSBpZiB0aGVyZSBpcyBhbnkgLSBhc3N1bWUgdGhlIGVycm9yCisgICAgICogaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2hhcmFjdGVyICovCisKKyAgICBpZiAoKHJmb2MgPSBiYXNlX2FkZHJbQ3lSRk9DXSkgIT0gMCkKKwlkYXRhID0gYmFzZV9hZGRyW0N5UkRSXTsKKyAgICBlbHNlCisJZGF0YSA9IDA7CisKKyAgICAvKiBpZiB0aGVyZSBpcyBub3doZXJlIHRvIHB1dCB0aGUgZGF0YSwgZGlzY2FyZCBpdCAqLworICAgIGlmKGluZm8tPnR0eSA9PSAwKSB7CisJYmFzZV9hZGRyW0N5UkVPSVJdID0gcmZvYyA/IDAgOiBDeU5PVFJBTlM7CisJcmV0dXJuIElSUV9IQU5ETEVEOworICAgIH0KKyAgICBlbHNlIHsgLyogdGhlcmUgaXMgYW4gb3BlbiBwb3J0IGZvciB0aGlzIGRhdGEgKi8KKwl0dHkgPSBpbmZvLT50dHk7CisJaWYoZXJyICYgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrKXsKKwkgICAgYmFzZV9hZGRyW0N5UkVPSVJdID0gcmZvYyA/IDAgOiBDeU5PVFJBTlM7CisJICAgIHJldHVybiBJUlFfSEFORExFRDsKKwl9CisJaWYgKHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpeworCSAgICB0dHktPmZsaXAuY291bnQrKzsKKwkgICAgaWYgKGVyciAmIGluZm8tPnJlYWRfc3RhdHVzX21hc2speworCQlpZihlcnIgJiBDeUJSRUFLKXsKKwkJICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfQlJFQUs7CisJCSAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gZGF0YTsKKwkJICAgIGlmIChpbmZvLT5mbGFncyAmIEFTWU5DX1NBSyl7CisJCQlkb19TQUsodHR5KTsKKwkJICAgIH0KKwkJfWVsc2UgaWYoZXJyICYgQ3lGUkFNRSl7CisJCSAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0ZSQU1FOworCQkgICAgKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGRhdGE7CisJCX1lbHNlIGlmKGVyciAmIEN5UEFSSVRZKXsKKwkJICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfUEFSSVRZOworCQkgICAgKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGRhdGE7CisJCX1lbHNlIGlmKGVyciAmIEN5T1ZFUlJVTil7CisJCSAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX09WRVJSVU47CisJCSAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKKwkJICAgIC8qCisJCSAgICAgICBJZiB0aGUgZmxpcCBidWZmZXIgaXRzZWxmIGlzCisJCSAgICAgICBvdmVyZmxvd2luZywgd2Ugc3RpbGwgbG9vc2UKKwkJICAgICAgIHRoZSBuZXh0IGluY29taW5nIGNoYXJhY3Rlci4KKwkJICAgICAqLworCQkgICAgaWYodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSl7CisJCQl0dHktPmZsaXAuY291bnQrKzsKKwkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfTk9STUFMOworCQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGRhdGE7CisJCSAgICB9CisJCS8qIFRoZXNlIHR3byBjb25kaXRpb25zIG1heSBpbXBseSAqLworCQkvKiBhIG5vcm1hbCByZWFkIHNob3VsZCBiZSBkb25lLiAqLworCQkvKiBlbHNlIGlmKGRhdGEgJiBDeVRJTUVPVVQpICovCisJCS8qIGVsc2UgaWYoZGF0YSAmIEN5U1BFQ0hBUikgKi8KKwkJfWVsc2V7CisJCSAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gMDsKKwkJICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOworCQl9CisJICAgIH1lbHNleworCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gMDsKKwkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IDA7CisJICAgIH0KKwl9ZWxzZXsKKwkgICAgLyogdGhlcmUgd2FzIGEgc29mdHdhcmUgYnVmZmVyIG92ZXJydW4KKwkgICAgICAgYW5kIG5vdGhpbmcgY291bGQgYmUgZG9uZSBhYm91dCBpdCEhISAqLworCX0KKyAgICB9CisgICAgc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisgICAgLyogZW5kIG9mIHNlcnZpY2UgKi8KKyAgICBiYXNlX2FkZHJbQ3lSRU9JUl0gPSByZm9jID8gMCA6IEN5Tk9UUkFOUzsKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9IC8qIGN5X3J4ZXJyX2ludGVycnVwdCAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK2NkMjQwMV9tb2RlbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisgICAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVuc2lnbmVkIGNoYXIgKilCQVNFX0FERFI7CisgICAgaW50IGNoYW5uZWw7CisgICAgaW50IG1kbV9jaGFuZ2U7CisgICAgaW50IG1kbV9zdGF0dXM7CisKKworICAgIC8qIGRldGVybWluZSB0aGUgY2hhbm5lbCBhbmQgY2hhbmdlIHRvIHRoYXQgY29udGV4dCAqLworICAgIGNoYW5uZWwgPSAodV9zaG9ydCApIChiYXNlX2FkZHJbQ3lMSUNSXSA+PiAyKTsKKyAgICBpbmZvID0gJmN5X3BvcnRbY2hhbm5lbF07CisgICAgaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworCisgICAgbWRtX2NoYW5nZSA9IGJhc2VfYWRkcltDeU1JU1JdOworICAgIG1kbV9zdGF0dXMgPSBiYXNlX2FkZHJbQ3lNU1ZSMV07CisKKyAgICBpZihpbmZvLT50dHkgPT0gMCl7IC8qIG5vd2hlcmUgdG8gcHV0IHRoZSBkYXRhLCBpZ25vcmUgaXQgKi8KKwk7CisgICAgfWVsc2V7CisJaWYoKG1kbV9jaGFuZ2UgJiBDeURDRCkKKwkmJiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkpeworCSAgICBpZihtZG1fc3RhdHVzICYgQ3lEQ0QpeworLyogQ1AoJyEnKTsgKi8KKwkJY3lfc2NoZWRfZXZlbnQoaW5mbywgQ3lfRVZFTlRfT1BFTl9XQUtFVVApOworCSAgICB9IGVsc2UgeworLyogQ1AoJ0AnKTsgKi8KKwkJY3lfc2NoZWRfZXZlbnQoaW5mbywgQ3lfRVZFTlRfSEFOR1VQKTsKKwkgICAgfQorCX0KKwlpZigobWRtX2NoYW5nZSAmIEN5Q1RTKQorCSYmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NUU19GTE9XKSl7CisJICAgIGlmKGluZm8tPnR0eS0+c3RvcHBlZCl7CisJCWlmKG1kbV9zdGF0dXMgJiBDeUNUUyl7CisJCSAgICAvKiAhISEgY3lfc3RhcnQgaXNuJ3QgdXNlZCBiZWNhdXNlLi4uICovCisJCSAgICBpbmZvLT50dHktPnN0b3BwZWQgPSAwOworICAgICAgICAJICAgIGJhc2VfYWRkcltDeUlFUl0gfD0gQ3lUeE1wdHk7CisJCSAgICBjeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9XUklURV9XQUtFVVApOworCQl9CisJICAgIH1lbHNleworCQlpZighKG1kbV9zdGF0dXMgJiBDeUNUUykpeworCQkgICAgLyogISEhIGN5X3N0b3AgaXNuJ3QgdXNlZCBiZWNhdXNlLi4uICovCisJCSAgICBpbmZvLT50dHktPnN0b3BwZWQgPSAxOworICAgICAgICAJICAgIGJhc2VfYWRkcltDeUlFUl0gJj0gfihDeVR4TXB0eXxDeVR4UmR5KTsKKwkJfQorCSAgICB9CisJfQorCWlmKG1kbV9zdGF0dXMgJiBDeURTUil7CisJfQorICAgIH0KKyAgICBiYXNlX2FkZHJbQ3lNRU9JUl0gPSAwOworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30gLyogY3lfbW9kZW1faW50ZXJydXB0ICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorY2QyNDAxX3R4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKyAgICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbzsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKUJBU0VfQUREUjsKKyAgICBpbnQgY2hhbm5lbDsKKyAgICBpbnQgY2hhcl9jb3VudCwgc2F2ZWRfY250OworICAgIGludCBvdXRjaDsKKworICAgIC8qIGRldGVybWluZSB0aGUgY2hhbm5lbCBhbmQgY2hhbmdlIHRvIHRoYXQgY29udGV4dCAqLworICAgIGNoYW5uZWwgPSAodV9zaG9ydCApIChiYXNlX2FkZHJbQ3lMSUNSXSA+PiAyKTsKKworI2lmZGVmIENPTkZJR19SRU1PVEVfREVCVUcKKyAgICBpZiAoY2hhbm5lbCA9PSBERUJVR19QT1JUKSB7CisJcGFuaWMgKCJUeEludCBvbiBkZWJ1ZyBwb3J0ISEhIik7CisgICAgfQorI2VuZGlmCisKKyAgICBpbmZvID0gJmN5X3BvcnRbY2hhbm5lbF07CisKKyAgICAvKiB2YWxpZGF0ZSB0aGUgcG9ydCBudW1iZXIgKGFzIGNvbmZpZ3VyZWQgYW5kIG9wZW4pICovCisgICAgaWYoIChjaGFubmVsIDwgMCkgfHwgKE5SX1BPUlRTIDw9IGNoYW5uZWwpICl7CisJYmFzZV9hZGRyW0N5SUVSXSAmPSB+KEN5VHhNcHR5fEN5VHhSZHkpOworCWJhc2VfYWRkcltDeVRFT0lSXSA9IEN5Tk9UUkFOUzsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgfQorICAgIGluZm8tPmxhc3RfYWN0aXZlID0gamlmZmllczsKKyAgICBpZihpbmZvLT50dHkgPT0gMCl7CisJYmFzZV9hZGRyW0N5SUVSXSAmPSB+KEN5VHhNcHR5fEN5VHhSZHkpOworICAgICAgICBpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpIHsKKwkgICAgY3lfc2NoZWRfZXZlbnQoaW5mbywgQ3lfRVZFTlRfV1JJVEVfV0FLRVVQKTsKKyAgICAgICAgfQorCWJhc2VfYWRkcltDeVRFT0lSXSA9IEN5Tk9UUkFOUzsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgfQorCisgICAgLyogbG9hZCB0aGUgb24tY2hpcCBzcGFjZSBhdmFpbGFibGUgZm9yIG91dGJvdW5kIGRhdGEgKi8KKyAgICBzYXZlZF9jbnQgPSBjaGFyX2NvdW50ID0gYmFzZV9hZGRyW0N5VEZUQ107CisKKyAgICBpZihpbmZvLT54X2NoYXIpIHsgLyogc2VuZCBzcGVjaWFsIGNoYXIgKi8KKwlvdXRjaCA9IGluZm8tPnhfY2hhcjsKKwliYXNlX2FkZHJbQ3lURFJdID0gb3V0Y2g7CisJY2hhcl9jb3VudC0tOworCWluZm8tPnhfY2hhciA9IDA7CisgICAgfQorCisgICAgaWYgKGluZm8tPnhfYnJlYWspeworCS8qICBUaGUgQ2lycnVzIGNoaXAgcmVxdWlyZXMgdGhlICJFbWJlZGRlZCBUcmFuc21pdAorCSAgICBDb21tYW5kcyIgb2Ygc3RhcnQgYnJlYWssIGRlbGF5LCBhbmQgZW5kIGJyZWFrCisJICAgIHNlcXVlbmNlcyB0byBiZSBzZW50LiAgVGhlIGR1cmF0aW9uIG9mIHRoZQorCSAgICBicmVhayBpcyBnaXZlbiBpbiBUSUNzLCB3aGljaCBydW5zIGF0IEhaCisJICAgICh0eXBpY2FsbHkgMTAwKSBhbmQgdGhlIFBQUiBydW5zIGF0IDIwMCBIeiwKKwkgICAgc28gdGhlIGRlbGF5IGlzIGR1cmF0aW9uICogMjAwL0haLCBhbmQgdGh1cyBhCisJICAgIGJyZWFrIGNhbiBydW4gZnJvbSAxLzEwMCBzZWMgdG8gYWJvdXQgNS80IHNlYy4KKwkgICAgTmVlZCB0byBjaGVjayB0aGVzZSB2YWx1ZXMgLSBSR0ggMTQxMDk1LgorCSAqLworCWJhc2VfYWRkcltDeVREUl0gPSAwOyAvKiBzdGFydCBicmVhayAqLworCWJhc2VfYWRkcltDeVREUl0gPSAweDgxOworCWJhc2VfYWRkcltDeVREUl0gPSAwOyAvKiBkZWxheSBhIGJpdCAqLworCWJhc2VfYWRkcltDeVREUl0gPSAweDgyOworCWJhc2VfYWRkcltDeVREUl0gPSBpbmZvLT54X2JyZWFrKjIwMC9IWjsKKwliYXNlX2FkZHJbQ3lURFJdID0gMDsgLyogdGVybWluYXRlIGJyZWFrICovCisJYmFzZV9hZGRyW0N5VERSXSA9IDB4ODM7CisJY2hhcl9jb3VudCAtPSA3OworCWluZm8tPnhfYnJlYWsgPSAwOworICAgIH0KKworICAgIHdoaWxlIChjaGFyX2NvdW50ID4gMCl7CisJaWYgKCFpbmZvLT54bWl0X2NudCl7CisJICAgIGJhc2VfYWRkcltDeUlFUl0gJj0gfihDeVR4TXB0eXxDeVR4UmR5KTsKKwkgICAgYnJlYWs7CisJfQorCWlmIChpbmZvLT54bWl0X2J1ZiA9PSAwKXsKKwkgICAgYmFzZV9hZGRyW0N5SUVSXSAmPSB+KEN5VHhNcHR5fEN5VHhSZHkpOworCSAgICBicmVhazsKKwl9CisJaWYgKGluZm8tPnR0eS0+c3RvcHBlZCB8fCBpbmZvLT50dHktPmh3X3N0b3BwZWQpeworCSAgICBiYXNlX2FkZHJbQ3lJRVJdICY9IH4oQ3lUeE1wdHl8Q3lUeFJkeSk7CisJICAgIGJyZWFrOworCX0KKwkvKiBCZWNhdXNlIHRoZSBFbWJlZGRlZCBUcmFuc21pdCBDb21tYW5kcyBoYXZlIGJlZW4KKwkgICBlbmFibGVkLCB3ZSBtdXN0IGNoZWNrIHRvIHNlZSBpZiB0aGUgZXNjYXBlCisJICAgY2hhcmFjdGVyLCBOVUxMLCBpcyBiZWluZyBzZW50LiAgSWYgaXQgaXMsIHdlCisJICAgbXVzdCBlbnN1cmUgdGhhdCB0aGVyZSBpcyByb29tIGZvciBpdCB0byBiZQorCSAgIGRvdWJsZWQgaW4gdGhlIG91dHB1dCBzdHJlYW0uICBUaGVyZWZvcmUgd2UKKwkgICBubyBsb25nZXIgYWR2YW5jZSB0aGUgcG9pbnRlciB3aGVuIHRoZSBjaGFyYWN0ZXIKKwkgICBpcyBmZXRjaGVkLCBidXQgcmF0aGVyIHdhaXQgdW50aWwgYWZ0ZXIgdGhlIGNoZWNrCisJICAgZm9yIGEgTlVMTCBvdXRwdXQgY2hhcmFjdGVyLiAoVGhpcyBpcyBuZWNlc3NhcnkKKwkgICBiZWNhdXNlIHRoZXJlIG1heSBub3QgYmUgcm9vbSBmb3IgdGhlIHR3byBjaGFycworCSAgIG5lZWRlZCB0byBzZW5kIGEgTlVMTC4KKwkgKi8KKwlvdXRjaCA9IGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF07CisJaWYoIG91dGNoICl7CisJICAgIGluZm8tPnhtaXRfY250LS07CisJICAgIGluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyAxKQorCQkJCSAgICAgICYgKFBBR0VfU0laRSAtIDEpOworCSAgICBiYXNlX2FkZHJbQ3lURFJdID0gb3V0Y2g7CisJICAgIGNoYXJfY291bnQtLTsKKwl9ZWxzZXsKKwkgICAgaWYoY2hhcl9jb3VudCA+IDEpeworCQlpbmZvLT54bWl0X2NudC0tOworCQlpbmZvLT54bWl0X3RhaWwgPSAoaW5mby0+eG1pdF90YWlsICsgMSkKKwkJCQkJICAmIChQQUdFX1NJWkUgLSAxKTsKKwkJYmFzZV9hZGRyW0N5VERSXSA9IG91dGNoOworCQliYXNlX2FkZHJbQ3lURFJdID0gMDsKKwkJY2hhcl9jb3VudC0tOworCQljaGFyX2NvdW50LS07CisJICAgIH1lbHNleworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpIHsKKwljeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9XUklURV9XQUtFVVApOworICAgIH0KKyAgICBiYXNlX2FkZHJbQ3lURU9JUl0gPSAoY2hhcl9jb3VudCAhPSBzYXZlZF9jbnQpID8gMCA6IEN5Tk9UUkFOUzsKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9IC8qIGN5X3R4X2ludGVycnVwdCAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK2NkMjQwMV9yeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisgICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKyAgICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbzsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKUJBU0VfQUREUjsKKyAgICBpbnQgY2hhbm5lbDsKKyAgICBjaGFyIGRhdGE7CisgICAgaW50IGNoYXJfY291bnQ7CisgICAgaW50IHNhdmVfY250OworCisgICAgLyogZGV0ZXJtaW5lIHRoZSBjaGFubmVsIGFuZCBjaGFuZ2UgdG8gdGhhdCBjb250ZXh0ICovCisgICAgY2hhbm5lbCA9ICh1X3Nob3J0ICkgKGJhc2VfYWRkcltDeUxJQ1JdID4+IDIpOworICAgIGluZm8gPSAmY3lfcG9ydFtjaGFubmVsXTsKKyAgICBpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisgICAgc2F2ZV9jbnQgPSBjaGFyX2NvdW50ID0gYmFzZV9hZGRyW0N5UkZPQ107CisKKyNpZmRlZiBDT05GSUdfUkVNT1RFX0RFQlVHCisgICAgaWYgKGNoYW5uZWwgPT0gREVCVUdfUE9SVCkgeworCXdoaWxlIChjaGFyX2NvdW50LS0pIHsKKyAgICAgICAgICAgIGRhdGEgPSBiYXNlX2FkZHJbQ3lSRFJdOworCSAgICBxdWV1ZURlYnVnQ2hhcihkYXRhKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIC8qIGlmIHRoZXJlIGlzIG5vd2hlcmUgdG8gcHV0IHRoZSBkYXRhLCBkaXNjYXJkIGl0ICovCisgICAgaWYoaW5mby0+dHR5ID09IDApeworCXdoaWxlKGNoYXJfY291bnQtLSl7CisJICAgIGRhdGEgPSBiYXNlX2FkZHJbQ3lSRFJdOworCX0KKyAgICB9ZWxzZXsgLyogdGhlcmUgaXMgYW4gb3BlbiBwb3J0IGZvciB0aGlzIGRhdGEgKi8KKwl0dHkgPSBpbmZvLT50dHk7CisJLyogbG9hZCAjIGNoYXJhY3RlcnMgYXZhaWxhYmxlIGZyb20gdGhlIGNoaXAgKi8KKworI2lmZGVmIENZQ0xPTV9FTkFCTEVfTU9OSVRPUklORworCSsraW5mby0+bW9uLmludF9jb3VudDsKKwlpbmZvLT5tb24uY2hhcl9jb3VudCArPSBjaGFyX2NvdW50OworCWlmIChjaGFyX2NvdW50ID4gaW5mby0+bW9uLmNoYXJfbWF4KQorCSAgICBpbmZvLT5tb24uY2hhcl9tYXggPSBjaGFyX2NvdW50OworCWluZm8tPm1vbi5jaGFyX2xhc3QgPSBjaGFyX2NvdW50OworI2VuZGlmCisJd2hpbGUoY2hhcl9jb3VudC0tKXsKKwkgICAgZGF0YSA9IGJhc2VfYWRkcltDeVJEUl07CisJICAgIGlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSl7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIHR0eS0+ZmxpcC5jb3VudCsrOworCSAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX05PUk1BTDsKKwkgICAgKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGRhdGE7CisjaWZkZWYgQ1lDTE9NXzE2WV9IQUNLCisJICAgIHVkZWxheSgxMEwpOworI2VuZGlmCisgICAgICAgIH0KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKyAgICB9CisgICAgLyogZW5kIG9mIHNlcnZpY2UgKi8KKyAgICBiYXNlX2FkZHJbQ3lSRU9JUl0gPSBzYXZlX2NudCA/IDAgOiBDeU5PVFJBTlM7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfSAvKiBjeV9yeF9pbnRlcnJ1cHQgKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGhhbmRsZSB0aGUgImJvdHRvbSBoYWxmIiBwcm9jZXNzaW5nIGZvciB0aGUKKyAqIHNlcmlhbCBkcml2ZXIsIGtub3duIGFsc28gdGhlICJzb2Z0d2FyZSBpbnRlcnJ1cHQiIHByb2Nlc3NpbmcuCisgKiBUaGlzIHByb2Nlc3NpbmcgaXMgZG9uZSBhdCB0aGUga2VybmVsIGludGVycnVwdCBsZXZlbCwgYWZ0ZXIgdGhlCisgKiBjeSMvX2ludGVycnVwdCgpIGhhcyByZXR1cm5lZCwgQlVUIFdJVEggSU5URVJSVVBUUyBUVVJORUQgT04uICBUaGlzCisgKiBpcyB3aGVyZSB0aW1lLWNvbnN1bWluZyBhY3Rpdml0aWVzIHdoaWNoIGNhbiBub3QgYmUgZG9uZSBpbiB0aGUKKyAqIGludGVycnVwdCBkcml2ZXIgcHJvcGVyIGFyZSBkb25lOyB0aGUgaW50ZXJydXB0IGRyaXZlciBzY2hlZHVsZXMKKyAqIHRoZW0gdXNpbmcgY3lfc2NoZWRfZXZlbnQoKSwgYW5kIHRoZXkgZ2V0IGRvbmUgaGVyZS4KKyAqCisgKiBUaGlzIGlzIGRvbmUgdGhyb3VnaCBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24tLXRoZSB0YXNrIHF1ZXVlLgorICogV2hlbiBhIGhhcmR3YXJlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgd2FudHMgc2VydmljZSBieSB0aGUKKyAqIGRyaXZlcidzIGJvdHRvbSBoYWxmLCBpdCBlbnF1ZXVlcyB0aGUgYXBwcm9wcmlhdGUgdHFfc3RydWN0IChvbmUKKyAqIHBlciBwb3J0KSB0byB0aGUga2V2ZW50ZCB3b3JrIHF1ZXVlIGFuZCBzZXRzIGEgcmVxdWVzdCBmbGFnCisgKiB0aGF0IHRoZSB3b3JrIHF1ZXVlIGJlIHByb2Nlc3NlZC4KKyAqCisgKiBBbHRob3VnaCB0aGlzIG1heSBzZWVtIHVud2llbGR5LCBpdCBnaXZlcyB0aGUgc3lzdGVtIGEgd2F5IHRvCisgKiBwYXNzIGFuIGFyZ3VtZW50IChpbiB0aGlzIGNhc2UgdGhlIHBvaW50ZXIgdG8gdGhlIGN5Y2xhZGVzX3BvcnQKKyAqIHN0cnVjdHVyZSkgdG8gdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSBkcml2ZXIuICBQcmV2aW91cyBrZXJuZWxzCisgKiBoYWQgdG8gcG9sbCBldmVyeSBwb3J0IHRvIHNlZSBpZiB0aGF0IHBvcnQgbmVlZGVkIHNlcnZpY2luZy4KKyAqLworc3RhdGljIHZvaWQKK2RvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopIHByaXZhdGVfOworICBzdHJ1Y3QgdHR5X3N0cnVjdCAgICAqdHR5OworCisgICAgdHR5ID0gaW5mby0+dHR5OworICAgIGlmICghdHR5KQorCXJldHVybjsKKworICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfSEFOR1VQLCAmaW5mby0+ZXZlbnQpKSB7CisJdHR5X2hhbmd1cChpbmZvLT50dHkpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKwlpbmZvLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKyAgICB9CisgICAgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDeV9FVkVOVF9PUEVOX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkgeworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKyAgICB9CisgICAgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDeV9FVkVOVF9XUklURV9XQUtFVVAsICZpbmZvLT5ldmVudCkpIHsKKyAgICAJdHR5X3dha2V1cCh0dHkpOworICAgIH0KK30gLyogZG9fc29mdGludCAqLworCisKKy8qIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIGEgcG9ydCBiZWNvbWVzIGFjdGl2ZTsKKyAgIGludGVycnVwdHMgYXJlIGVuYWJsZWQgYW5kIERUUiAmIFJUUyBhcmUgdHVybmVkIG9uLgorICovCitzdGF0aWMgaW50CitzdGFydHVwKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbykKK3sKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVuc2lnbmVkIGNoYXIgKilCQVNFX0FERFI7CisgIGludCBjaGFubmVsOworCisgICAgaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpeworCXJldHVybiAwOworICAgIH0KKworICAgIGlmICghaW5mby0+dHlwZSl7CisJaWYgKGluZm8tPnR0eSl7CisJICAgIHNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJfQorCXJldHVybiAwOworICAgIH0KKyAgICBpZiAoIWluZm8tPnhtaXRfYnVmKXsKKwlpbmZvLT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGdldF96ZXJvZWRfcGFnZSAoR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvLT54bWl0X2J1Zil7CisJICAgIHJldHVybiAtRU5PTUVNOworCX0KKyAgICB9CisKKyAgICBjb25maWdfc2V0dXAoaW5mbyk7CisKKyAgICBjaGFubmVsID0gaW5mby0+bGluZTsKKworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisgICAgcHJpbnRrKCJzdGFydHVwIGNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOworI2VuZGlmCisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsKKwl3cml0ZV9jeV9jbWQoYmFzZV9hZGRyLEN5RU5CX1JDVlJ8Q3lFTkJfWE1UUik7CisKKwliYXNlX2FkZHJbQ3lDQVJdID0gKHVfY2hhciljaGFubmVsOyAvKiAhISEgSXMgdGhpcyBuZWVkZWQ/ICovCisJYmFzZV9hZGRyW0N5TVNWUjFdID0gQ3lSVFM7CisvKiBDUCgnUycpO0NQKCcxJyk7ICovCisJYmFzZV9hZGRyW0N5TVNWUjJdID0gQ3lEVFI7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfRFRSCisgICAgICAgIHByaW50aygiY3ljOiAlZDogcmFpc2luZyBEVFJcbiIsIF9fTElORV9fKTsKKyAgICAgICAgcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwgYmFzZV9hZGRyW0N5TVNWUjFdLCBiYXNlX2FkZHJbQ3lNU1ZSMl0pOworI2VuZGlmCisKKwliYXNlX2FkZHJbQ3lJRVJdIHw9IEN5UnhEYXRhOworCWluZm8tPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCisJaWYgKGluZm8tPnR0eSl7CisJICAgIGNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwl9CisJaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOworCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKyAgICBwcmludGsoIiBkb25lXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfSAvKiBzdGFydHVwICovCisKK3ZvaWQKK3N0YXJ0X3htaXQoIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvICkKK3sKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKKyAgaW50IGNoYW5uZWw7CisKKyAgICBjaGFubmVsID0gaW5mby0+bGluZTsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYmFzZV9hZGRyW0N5Q0FSXSA9IGNoYW5uZWw7CisJYmFzZV9hZGRyW0N5SUVSXSB8PSBDeVR4TXB0eTsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9IC8qIHN0YXJ0X3htaXQgKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSBzaHV0cyBkb3duIGEgc2VyaWFsIHBvcnQ7IGludGVycnVwdHMgYXJlIGRpc2FibGVkLAorICogYW5kIERUUiBpcyBkcm9wcGVkIGlmIHRoZSBoYW5ndXAgb24gY2xvc2UgdGVybWlvIGZsYWcgaXMgb24uCisgKi8KK3N0YXRpYyB2b2lkCitzaHV0ZG93bihzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8pCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisgIGludCBjaGFubmVsOworCisgICAgaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpeworLyogQ1AoJyQnKTsgKi8KKwlyZXR1cm47CisgICAgfQorCisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorICAgIHByaW50aygic2h1dGRvd24gY2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CisjZW5kaWYKKworICAgIC8qICEhISBSRUFMTFkgTVVTVCBXQUlUIEZPUiBMQVNUIENIQVJBQ1RFUiBUTyBCRQorICAgICAgIFNFTlQgQkVGT1JFIERST1BQSU5HIFRIRSBMSU5FICEhISAgKFBlcmhhcHMKKyAgICAgICBzZXQgc29tZSBmbGFnIHRoYXQgaXMgcmVhZCB3aGVuIFhNVFkgaGFwcGVucy4pCisgICAgICAgT3RoZXIgY2hvaWNlcyBhcmUgdG8gZGVsYXkgc29tZSBmaXhlZCBpbnRlcnZhbAorICAgICAgIG9yIHNjaGVkdWxlIHNvbWUgbGF0ZXIgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKGluZm8tPnhtaXRfYnVmKXsKKwkgICAgZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT54bWl0X2J1Zik7CisJICAgIGluZm8tPnhtaXRfYnVmID0gMDsKKwl9CisKKwliYXNlX2FkZHJbQ3lDQVJdID0gKHVfY2hhciljaGFubmVsOworCWlmICghaW5mby0+dHR5IHx8IChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkpIHsKKwkgICAgYmFzZV9hZGRyW0N5TVNWUjFdID0gMDsKKy8qIENQKCdDJyk7Q1AoJzEnKTsgKi8KKwkgICAgYmFzZV9hZGRyW0N5TVNWUjJdID0gMDsKKyNpZmRlZiBTRVJJQUxfREVCVUdfRFRSCisgICAgICAgICAgICBwcmludGsoImN5YzogJWQ6IGRyb3BwaW5nIERUUlxuIiwgX19MSU5FX18pOworICAgICAgICAgICAgcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwgYmFzZV9hZGRyW0N5TVNWUjFdLCBiYXNlX2FkZHJbQ3lNU1ZSMl0pOworI2VuZGlmCisgICAgICAgIH0KKwl3cml0ZV9jeV9jbWQoYmFzZV9hZGRyLEN5RElTX1JDVlIpOworICAgICAgICAgLyogaXQgbWF5IGJlIGFwcHJvcHJpYXRlIHRvIGNsZWFyIF9YTUlUIGF0CisgICAgICAgICAgIHNvbWUgbGF0ZXIgZGF0ZSAoYWZ0ZXIgdGVzdGluZykhISEgKi8KKworCWlmIChpbmZvLT50dHkpeworCSAgICBzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCX0KKwlpbmZvLT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKyAgICBwcmludGsoIiBkb25lXG4iKTsKKyNlbmRpZgorICAgIHJldHVybjsKK30gLyogc2h1dGRvd24gKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSBmaW5kcyBvciBjb21wdXRlcyB0aGUgdmFyaW91cyBsaW5lIGNoYXJhY3RlcmlzdGljcy4KKyAqLworc3RhdGljIHZvaWQKK2NvbmZpZ19zZXR1cChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8pCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisgIGludCBjaGFubmVsOworICB1bnNpZ25lZCBjZmxhZzsKKyAgaW50ICAgaTsKKyAgdW5zaWduZWQgY2hhciB0aSwgbmVlZF9pbml0X2NoYW4gPSAwOworCisgICAgaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcyl7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGluZm8tPmxpbmUgPT0gLTEpeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNmbGFnID0gaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisgICAgLyogYmF1ZCByYXRlICovCisgICAgaSA9IGNmbGFnICYgQ0JBVUQ7CisjaWZkZWYgQ0JBVURFWAorLyogU3RhcnRpbmcgd2l0aCBrZXJuZWwgMS4xLjY1LCB0aGVyZSBpcyBkaXJlY3Qgc3VwcG9ydCBmb3IKKyAgIGhpZ2hlciBiYXVkIHJhdGVzLiAgVGhlIGZvbGxvd2luZyBjb2RlIHN1cHBvcnRzIHRob3NlCisgICBjaGFuZ2VzLiAgVGhlIGNvbmRpdGlvbmFsIGFzcGVjdCBhbGxvd3MgdGhpcyBkcml2ZXIgdG8gYmUKKyAgIHVzZWQgZm9yIGVhcmxpZXIgYXMgd2VsbCBhcyBsYXRlciBrZXJuZWwgdmVyc2lvbnMuICAoVGhlCisgICBtYXBwaW5nIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHNlcmlhbC5jIGJlY2F1c2UgdGhlcmUKKyAgIGlzIHN0aWxsIHRoZSBwb3NzaWJpbGl0eSBvZiBzdXBwb3J0aW5nIDc1IGtiaXQvc2VjIHdpdGgKKyAgIHRoZSBDeWNsYWRlcyBib2FyZC4pCisgKi8KKyAgICBpZiAoaSAmIENCQVVERVgpIHsKKwlpZiAoaSA9PSBCNTc2MDApCisJICAgIGkgPSAxNjsKKwllbHNlIGlmKGkgPT0gQjExNTIwMCkgCisJICAgIGkgPSAxODsKKyNpZmRlZiBCNzg2MDAKKwllbHNlIGlmKGkgPT0gQjc4NjAwKSAKKwkgICAgaSA9IDE3OworI2VuZGlmCisJZWxzZQorCSAgICBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNCQVVERVg7CisgICAgfQorI2VuZGlmCisgICAgaWYgKGkgPT0gMTUpIHsKKwkgICAgaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJCSAgICBpICs9IDE7CisJICAgIGlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKKwkJICAgIGkgKz0gMzsKKyAgICB9CisgICAgLyogRG9uJ3QgZXZlciBjaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBjb25zb2xlIHBvcnQuICBJdCB3aWxsCisgICAgICogcnVuIGF0IHRoZSBzcGVlZCBzcGVjaWZpZWQgaW4gYm9vdGluZm8sIG9yIGF0IDE5LjJLICovCisgICAgLyogQWN0dWFsbHksIGl0IHNob3VsZCBydW4gYXQgd2hhdGV2ZXIgc3BlZWQgMTY2QnVnIHdhcyB1c2luZyAqLworICAgIC8qIE5vdGUgaW5mby0+dGltZW91dCBpc24ndCB1c2VkIGF0IHByZXNlbnQgKi8KKyAgICBpZiAoaW5mbyAhPSBzZXJpYWxfY29uc29sZV9pbmZvKSB7CisJaW5mby0+dGJwciA9IGJhdWRfYnByW2ldOyAvKiBUeCBCUFIgKi8KKwlpbmZvLT50Y28gPSBiYXVkX2NvW2ldOyAvKiBUeCBDTyAqLworCWluZm8tPnJicHIgPSBiYXVkX2JwcltpXTsgLyogUnggQlBSICovCisJaW5mby0+cmNvID0gYmF1ZF9jb1tpXSA+PiA1OyAvKiBSeCBDTyAqLworCWlmIChiYXVkX3RhYmxlW2ldID09IDEzNCkgeworICAgICAgICAgICAgaW5mby0+dGltZW91dCA9IChpbmZvLT54bWl0X2ZpZm9fc2l6ZSpIWiozMC8yNjkpICsgMjsKKyAgICAgICAgICAgIC8qIGdldCBpdCByaWdodCBmb3IgMTM0LjUgYmF1ZCAqLworCX0gZWxzZSBpZiAoYmF1ZF90YWJsZVtpXSkgeworICAgICAgICAgICAgaW5mby0+dGltZW91dCA9IChpbmZvLT54bWl0X2ZpZm9fc2l6ZSpIWioxNS9iYXVkX3RhYmxlW2ldKSArIDI7CisgICAgICAgIC8qIHRoaXMgbmVlZHMgdG8gYmUgcHJvcGFnYXRlZCBpbnRvIHRoZSBjYXJkIGluZm8gKi8KKwl9IGVsc2UgeworICAgICAgICAgICAgaW5mby0+dGltZW91dCA9IDA7CisJfQorICAgIH0KKyAgICAvKiBCeSB0cmFkaXRpb24gKGlzIGl0IGEgc3RhbmRhcmQ/KSBhIGJhdWQgcmF0ZSBvZiB6ZXJvCisgICAgICAgaW1wbGllcyB0aGUgbGluZSBzaG91bGQgYmUvaGFzIGJlZW4gY2xvc2VkLiAgQSBiaXQKKyAgICAgICBsYXRlciBpbiB0aGlzIHJvdXRpbmUgc3VjaCBhIHRlc3QgaXMgcGVyZm9ybWVkLiAqLworCisgICAgLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KKyAgICBpbmZvLT5jb3I3ID0gMDsKKyAgICBpbmZvLT5jb3I2ID0gMDsKKyAgICBpbmZvLT5jb3I1ID0gMDsKKyAgICBpbmZvLT5jb3I0ID0gKGluZm8tPmRlZmF1bHRfdGhyZXNob2xkCisJCSAgPyBpbmZvLT5kZWZhdWx0X3RocmVzaG9sZAorCQkgIDogYmF1ZF9jb3I0W2ldKTsgLyogcmVjZWl2ZSB0aHJlc2hvbGQgKi8KKyAgICAvKiBGb2xsb3dpbmcgdHdvIGxpbmVzIGFkZGVkIDEwMTI5NSwgUkdILiAqLworICAgIC8qIEl0IGlzIG9idmlvdXNseSB3cm9uZyB0byBhY2Nlc3MgQ3lDT1J4LCBhbmQgbm90IGluZm8tPmNvcnggaGVyZSwKKyAgICAgKiB0cnkgYW5kIHJlbWVtYmVyIHRvIGZpeCBpdCBsYXRlciEgKi8KKyAgICBjaGFubmVsID0gaW5mby0+bGluZTsKKyAgICBiYXNlX2FkZHJbQ3lDQVJdID0gKHVfY2hhciljaGFubmVsOworICAgIGlmIChDX0NMT0NBTChpbmZvLT50dHkpKSB7CisJaWYgKGJhc2VfYWRkcltDeUlFUl0gJiBDeU1kbUNoKQorCSAgICBiYXNlX2FkZHJbQ3lJRVJdICY9IH5DeU1kbUNoOyAvKiB3aXRob3V0IG1vZGVtIGludHIgKi8KKwkJCSAgICAgICAvKiBpZ25vcmUgMS0+MCBtb2RlbSB0cmFuc2l0aW9ucyAqLworCWlmIChiYXNlX2FkZHJbQ3lDT1I0XSAmIChDeURTUnxDeUNUU3xDeURDRCkpCisJICAgIGJhc2VfYWRkcltDeUNPUjRdICY9IH4oQ3lEU1J8Q3lDVFN8Q3lEQ0QpOworCQkJICAgICAgIC8qIGlnbm9yZSAwLT4xIG1vZGVtIHRyYW5zaXRpb25zICovCisJaWYgKGJhc2VfYWRkcltDeUNPUjVdICYgKEN5RFNSfEN5Q1RTfEN5RENEKSkKKwkgICAgYmFzZV9hZGRyW0N5Q09SNV0gJj0gfihDeURTUnxDeUNUU3xDeURDRCk7CisgICAgfSBlbHNlIHsKKwlpZiAoKGJhc2VfYWRkcltDeUlFUl0gJiBDeU1kbUNoKSAhPSBDeU1kbUNoKQorCSAgICBiYXNlX2FkZHJbQ3lJRVJdIHw9IEN5TWRtQ2g7IC8qIHdpdGggbW9kZW0gaW50ciAqLworCQkJICAgICAgIC8qIGFjdCBvbiAxLT4wIG1vZGVtIHRyYW5zaXRpb25zICovCisJaWYgKChiYXNlX2FkZHJbQ3lDT1I0XSAmIChDeURTUnxDeUNUU3xDeURDRCkpICE9IChDeURTUnxDeUNUU3xDeURDRCkpCisJICAgIGJhc2VfYWRkcltDeUNPUjRdIHw9IEN5RFNSfEN5Q1RTfEN5RENEOworCQkJICAgICAgIC8qIGFjdCBvbiAwLT4xIG1vZGVtIHRyYW5zaXRpb25zICovCisJaWYgKChiYXNlX2FkZHJbQ3lDT1I1XSAmIChDeURTUnxDeUNUU3xDeURDRCkpICE9IChDeURTUnxDeUNUU3xDeURDRCkpCisJICAgIGJhc2VfYWRkcltDeUNPUjVdIHw9IEN5RFNSfEN5Q1RTfEN5RENEOworICAgIH0KKyAgICBpbmZvLT5jb3IzID0gKGNmbGFnICYgQ1NUT1BCKSA/IEN5XzJfU1RPUCA6IEN5XzFfU1RPUDsKKyAgICBpbmZvLT5jb3IyID0gQ3lFVEM7CisgICAgc3dpdGNoKGNmbGFnICYgQ1NJWkUpeworICAgIGNhc2UgQ1M1OgorICAgICAgICBpbmZvLT5jb3IxID0gQ3lfNV9CSVRTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTNjoKKyAgICAgICAgaW5mby0+Y29yMSA9IEN5XzZfQklUUzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDUzc6CisgICAgICAgIGluZm8tPmNvcjEgPSBDeV83X0JJVFM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1M4OgorICAgICAgICBpbmZvLT5jb3IxID0gQ3lfOF9CSVRTOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGNmbGFnICYgUEFSRU5CKXsKKyAgICAgICAgaWYgKGNmbGFnICYgUEFST0REKXsKKyAgICAgICAgICAgIGluZm8tPmNvcjEgfD0gQ3lQQVJJVFlfTzsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBpbmZvLT5jb3IxIHw9IEN5UEFSSVRZX0U7CisgICAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgICAgaW5mby0+Y29yMSB8PSBDeVBBUklUWV9OT05FOworICAgIH0KKwkKKyAgICAvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgKi8KKyNpZiAwCisgICAgLyogRG9uJ3QgY29tcGxjYXRlIG1hdHRlcnMgZm9yIG5vdyEgUkdIIDE0MTA5NSAqLworICAgIGlmIChjZmxhZyAmIENSVFNDVFMpeworCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCWluZm8tPmNvcjIgfD0gQ3lDdHNBRTsKKyAgICB9ZWxzZXsKKwlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ1RTX0ZMT1c7CisJaW5mby0+Y29yMiAmPSB+Q3lDdHNBRTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoY2ZsYWcgJiBDTE9DQUwpCisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworICAgIGVsc2UKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKworICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlUaGUgaGFyZHdhcmUgb3B0aW9uLCBDeVJ0c0FPLCBwcmVzZW50cyBSVFMgd2hlbgorCXRoZSBjaGlwIGhhcyBjaGFyYWN0ZXJzIHRvIHNlbmQuICBTaW5jZSBtb3N0IG1vZGVtcworCXVzZSBSVFMgYXMgcmV2ZXJzZSAoaW5ib3VuZCkgZmxvdyBjb250cm9sLCB0aGlzCisJb3B0aW9uIGlzIG5vdCB1c2VkLiAgSWYgaW5ib3VuZCBmbG93IGNvbnRyb2wgaXMKKwluZWNlc3NhcnksIERUUiBjYW4gYmUgcHJvZ3JhbW1lZCB0byBwcm92aWRlIHRoZQorCWFwcHJvcHJpYXRlIHNpZ25hbHMgZm9yIHVzZSB3aXRoIGEgbm9uLXN0YW5kYXJkCisJY2FibGUuICBDb250YWN0IE1hcmNpbyBTYWl0byBmb3IgZGV0YWlscy4KKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBjaGFubmVsID0gaW5mby0+bGluZTsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwliYXNlX2FkZHJbQ3lDQVJdID0gKHVfY2hhciljaGFubmVsOworCisJLyogQ3lDTVIgc2V0IG9uY2Ugb25seSBpbiBtdm1lMTY3X2luaXRfc2VyaWFsKCkgKi8KKwlpZiAoYmFzZV9hZGRyW0N5TElDUl0gIT0gY2hhbm5lbCA8PCAyKQorCSAgICBiYXNlX2FkZHJbQ3lMSUNSXSA9IGNoYW5uZWwgPDwgMjsKKwlpZiAoYmFzZV9hZGRyW0N5TElWUl0gIT0gMHg1YykKKwkgICAgYmFzZV9hZGRyW0N5TElWUl0gPSAweDVjOworCisgICAgICAgLyogdHggYW5kIHJ4IGJhdWQgcmF0ZSAqLworCisJaWYgKGJhc2VfYWRkcltDeUNPUjFdICE9IGluZm8tPmNvcjEpCisJICAgIG5lZWRfaW5pdF9jaGFuID0gMTsKKwlpZiAoYmFzZV9hZGRyW0N5VENPUl0gIT0gaW5mby0+dGNvKQorCSAgICBiYXNlX2FkZHJbQ3lUQ09SXSA9IGluZm8tPnRjbzsKKwlpZiAoYmFzZV9hZGRyW0N5VEJQUl0gIT0gaW5mby0+dGJwcikKKwkgICAgYmFzZV9hZGRyW0N5VEJQUl0gPSBpbmZvLT50YnByOworCWlmIChiYXNlX2FkZHJbQ3lSQ09SXSAhPSBpbmZvLT5yY28pCisJICAgIGJhc2VfYWRkcltDeVJDT1JdID0gaW5mby0+cmNvOworCWlmIChiYXNlX2FkZHJbQ3lSQlBSXSAhPSBpbmZvLT5yYnByKQorCSAgICBiYXNlX2FkZHJbQ3lSQlBSXSA9IGluZm8tPnJicHI7CisKKwkvKiBzZXQgbGluZSBjaGFyYWN0ZXJpc3RpY3MgIGFjY29yZGluZyBjb25maWd1cmF0aW9uICovCisKKwlpZiAoYmFzZV9hZGRyW0N5U0NIUjFdICE9IFNUQVJUX0NIQVIoaW5mby0+dHR5KSkKKwkgICAgYmFzZV9hZGRyW0N5U0NIUjFdID0gU1RBUlRfQ0hBUihpbmZvLT50dHkpOworCWlmIChiYXNlX2FkZHJbQ3lTQ0hSMl0gIT0gU1RPUF9DSEFSKGluZm8tPnR0eSkpCisJICAgIGJhc2VfYWRkcltDeVNDSFIyXSA9IFNUT1BfQ0hBUihpbmZvLT50dHkpOworCWlmIChiYXNlX2FkZHJbQ3lTQ1JMXSAhPSBTVEFSVF9DSEFSKGluZm8tPnR0eSkpCisJICAgIGJhc2VfYWRkcltDeVNDUkxdID0gU1RBUlRfQ0hBUihpbmZvLT50dHkpOworCWlmIChiYXNlX2FkZHJbQ3lTQ1JIXSAhPSBTVEFSVF9DSEFSKGluZm8tPnR0eSkpCisJICAgIGJhc2VfYWRkcltDeVNDUkhdID0gU1RBUlRfQ0hBUihpbmZvLT50dHkpOworCWlmIChiYXNlX2FkZHJbQ3lDT1IxXSAhPSBpbmZvLT5jb3IxKQorCSAgICBiYXNlX2FkZHJbQ3lDT1IxXSA9IGluZm8tPmNvcjE7CisJaWYgKGJhc2VfYWRkcltDeUNPUjJdICE9IGluZm8tPmNvcjIpCisJICAgIGJhc2VfYWRkcltDeUNPUjJdID0gaW5mby0+Y29yMjsKKwlpZiAoYmFzZV9hZGRyW0N5Q09SM10gIT0gaW5mby0+Y29yMykKKwkgICAgYmFzZV9hZGRyW0N5Q09SM10gPSBpbmZvLT5jb3IzOworCWlmIChiYXNlX2FkZHJbQ3lDT1I0XSAhPSBpbmZvLT5jb3I0KQorCSAgICBiYXNlX2FkZHJbQ3lDT1I0XSA9IGluZm8tPmNvcjQ7CisJaWYgKGJhc2VfYWRkcltDeUNPUjVdICE9IGluZm8tPmNvcjUpCisJICAgIGJhc2VfYWRkcltDeUNPUjVdID0gaW5mby0+Y29yNTsKKwlpZiAoYmFzZV9hZGRyW0N5Q09SNl0gIT0gaW5mby0+Y29yNikKKwkgICAgYmFzZV9hZGRyW0N5Q09SNl0gPSBpbmZvLT5jb3I2OworCWlmIChiYXNlX2FkZHJbQ3lDT1I3XSAhPSBpbmZvLT5jb3I3KQorCSAgICBiYXNlX2FkZHJbQ3lDT1I3XSA9IGluZm8tPmNvcjc7CisKKwlpZiAobmVlZF9pbml0X2NoYW4pCisJICAgIHdyaXRlX2N5X2NtZChiYXNlX2FkZHIsQ3lJTklUX0NIQU4pOworCisJYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsgLyogISEhIElzIHRoaXMgbmVlZGVkPyAqLworCisJLyogMm1zIGRlZmF1bHQgcnggdGltZW91dCAqLworCXRpID0gaW5mby0+ZGVmYXVsdF90aW1lb3V0ID8gaW5mby0+ZGVmYXVsdF90aW1lb3V0IDogMHgwMjsKKwlpZiAoYmFzZV9hZGRyW0N5UlRQUkxdICE9IHRpKQorCSAgICBiYXNlX2FkZHJbQ3lSVFBSTF0gPSB0aTsKKwlpZiAoYmFzZV9hZGRyW0N5UlRQUkhdICE9IDApCisJICAgIGJhc2VfYWRkcltDeVJUUFJIXSA9IDA7CisKKwkvKiBTZXQgdXAgUlRTIGhlcmUgYWxzbyA/Pz8/PyBSR0ggMTQxMDk1ICovCisJaWYoaSA9PSAwKXsgLyogYmF1ZCByYXRlIGlzIHplcm8sIHR1cm4gb2ZmIGxpbmUgKi8KKwkgICAgaWYgKChiYXNlX2FkZHJbQ3lNU1ZSMl0gJiBDeURUUikgPT0gQ3lEVFIpCisJICAgICAgICBiYXNlX2FkZHJbQ3lNU1ZSMl0gPSAwOworI2lmZGVmIFNFUklBTF9ERUJVR19EVFIKKyAgICAgICAgICAgIHByaW50aygiY3ljOiAlZDogZHJvcHBpbmcgRFRSXG4iLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBwcmludGsoIiAgICAgc3RhdHVzOiAweCV4LCAweCV4XG4iLCBiYXNlX2FkZHJbQ3lNU1ZSMV0sIGJhc2VfYWRkcltDeU1TVlIyXSk7CisjZW5kaWYKKwl9ZWxzZXsKKwkgICAgaWYgKChiYXNlX2FkZHJbQ3lNU1ZSMl0gJiBDeURUUikgIT0gQ3lEVFIpCisJICAgICAgICBiYXNlX2FkZHJbQ3lNU1ZSMl0gPSBDeURUUjsKKyNpZmRlZiBTRVJJQUxfREVCVUdfRFRSCisgICAgICAgICAgICBwcmludGsoImN5YzogJWQ6IHJhaXNpbmcgRFRSXG4iLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBwcmludGsoIiAgICAgc3RhdHVzOiAweCV4LCAweCV4XG4iLCBiYXNlX2FkZHJbQ3lNU1ZSMV0sIGJhc2VfYWRkcltDeU1TVlIyXSk7CisjZW5kaWYKKwl9CisKKwlpZiAoaW5mby0+dHR5KXsKKwkgICAgY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCX0KKworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworfSAvKiBjb25maWdfc2V0dXAgKi8KKworCitzdGF0aWMgdm9pZAorY3lfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX0lPCisgICAgcHJpbnRrKCJjeV9wdXRfY2hhciAlcygweCUwMngpXG4iLCB0dHktPm5hbWUsIGNoKTsKKyNlbmRpZgorCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9wdXRfY2hhciIpKQorCXJldHVybjsKKworICAgIGlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZikKKwlyZXR1cm47CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKGluZm8tPnhtaXRfY250ID49IFBBR0VfU0laRSAtIDEpIHsKKwkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCSAgICByZXR1cm47CisJfQorCisJaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF9oZWFkKytdID0gY2g7CisJaW5mby0+eG1pdF9oZWFkICY9IFBBR0VfU0laRSAtIDE7CisJaW5mby0+eG1pdF9jbnQrKzsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9IC8qIGN5X3B1dF9jaGFyICovCisKKworc3RhdGljIHZvaWQKK2N5X2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKKyAgaW50IGNoYW5uZWw7CisJCQkJCisjaWZkZWYgU0VSSUFMX0RFQlVHX0lPCisgICAgcHJpbnRrKCJjeV9mbHVzaF9jaGFycyAlc1xuIiwgdHR5LT5uYW1lKTsgLyogKi8KKyNlbmRpZgorCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9mbHVzaF9jaGFycyIpKQorCXJldHVybjsKKworICAgIGlmIChpbmZvLT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZAorICAgIHx8IHR0eS0+aHdfc3RvcHBlZCB8fCAhaW5mby0+eG1pdF9idWYpCisJcmV0dXJuOworCisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYmFzZV9hZGRyW0N5Q0FSXSA9IGNoYW5uZWw7CisJYmFzZV9hZGRyW0N5SUVSXSB8PSBDeVR4TXB0eTsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9IC8qIGN5X2ZsdXNoX2NoYXJzICovCisKKworLyogVGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIHdoZW4gdHR5X3dyaXRlIGhhcyBwdXQgc29tZXRoaW5nIGludG8KKyAgICB0aGUgd3JpdGVfcXVldWUuICBJZiB0aGUgcG9ydCBpcyBub3QgYWxyZWFkeSB0cmFuc21pdHRpbmcgc3R1ZmYsCisgICAgc3RhcnQgaXQgb2ZmIGJ5IGVuYWJsaW5nIGludGVycnVwdHMuICBUaGUgaW50ZXJydXB0IHNlcnZpY2UKKyAgICByb3V0aW5lIHdpbGwgdGhlbiBlbnN1cmUgdGhhdCB0aGUgY2hhcmFjdGVycyBhcmUgc2VudC4gIElmIHRoZQorICAgIHBvcnQgaXMgYWxyZWFkeSBhY3RpdmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8ga2ljayBpdC4KKyAqLworc3RhdGljIGludAorY3lfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCisgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIGludCBjLCB0b3RhbCA9IDA7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU8KKyAgICBwcmludGsoImN5X3dyaXRlICVzXG4iLCB0dHktPm5hbWUpOyAvKiAqLworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3dyaXRlIikpeworCXJldHVybiAwOworICAgIH0KKwkKKyAgICBpZiAoIXR0eSB8fCAhaW5mby0+eG1pdF9idWYgfHwgIXRtcF9idWYpeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworCSAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJICAgIGMgPSBtaW5fdChpbnQsIGNvdW50LCBtaW4oU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMSwKKwkJCQkgICAgICBTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9oZWFkKSk7CisJICAgIGlmIChjIDw9IDApIHsKKwkJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJICAgIGJyZWFrOworCSAgICB9CisKKwkgICAgbWVtY3B5KGluZm8tPnhtaXRfYnVmICsgaW5mby0+eG1pdF9oZWFkLCBidWYsIGMpOworCSAgICBpbmZvLT54bWl0X2hlYWQgPSAoaW5mby0+eG1pdF9oZWFkICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKKwkgICAgaW5mby0+eG1pdF9jbnQgKz0gYzsKKwkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJICAgIGJ1ZiArPSBjOworCSAgICBjb3VudCAtPSBjOworCSAgICB0b3RhbCArPSBjOworICAgIH0KKworICAgIGlmIChpbmZvLT54bWl0X2NudAorICAgICYmICF0dHktPnN0b3BwZWQKKyAgICAmJiAhdHR5LT5od19zdG9wcGVkICkgeworICAgICAgICBzdGFydF94bWl0KGluZm8pOworICAgIH0KKyAgICByZXR1cm4gdG90YWw7Cit9IC8qIGN5X3dyaXRlICovCisKKworc3RhdGljIGludAorY3lfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIGludAlyZXQ7CisJCQkJCisjaWZkZWYgU0VSSUFMX0RFQlVHX0lPCisgICAgcHJpbnRrKCJjeV93cml0ZV9yb29tICVzXG4iLCB0dHktPm5hbWUpOyAvKiAqLworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3dyaXRlX3Jvb20iKSkKKwlyZXR1cm4gMDsKKyAgICByZXQgPSBQQUdFX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDE7CisgICAgaWYgKHJldCA8IDApCisJcmV0ID0gMDsKKyAgICByZXR1cm4gcmV0OworfSAvKiBjeV93cml0ZV9yb29tICovCisKKworc3RhdGljIGludAorY3lfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwkJCQkKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU8KKyAgICBwcmludGsoImN5X2NoYXJzX2luX2J1ZmZlciAlcyAlZFxuIiwgdHR5LT5uYW1lLCBpbmZvLT54bWl0X2NudCk7IC8qICovCisjZW5kaWYKKworICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfY2hhcnNfaW5fYnVmZmVyIikpCisJcmV0dXJuIDA7CisKKyAgICByZXR1cm4gaW5mby0+eG1pdF9jbnQ7Cit9IC8qIGN5X2NoYXJzX2luX2J1ZmZlciAqLworCisKK3N0YXRpYyB2b2lkCitjeV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQorI2lmZGVmIFNFUklBTF9ERUJVR19JTworICAgIHByaW50aygiY3lfZmx1c2hfYnVmZmVyICVzXG4iLCB0dHktPm5hbWUpOyAvKiAqLworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X2ZsdXNoX2J1ZmZlciIpKQorCXJldHVybjsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB0dHlfd2FrZXVwKHR0eSk7Cit9IC8qIGN5X2ZsdXNoX2J1ZmZlciAqLworCisKKy8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHVwcGVyLWxheWVyIHR0eSBsYXllciB0byBzaWduYWwKKyAgIHRoYXQgaW5jb21pbmcgY2hhcmFjdGVycyBzaG91bGQgYmUgdGhyb3R0bGVkIG9yIHRoYXQgdGhlCisgICB0aHJvdHRsZSBzaG91bGQgYmUgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyB2b2lkCitjeV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOworICBpbnQgY2hhbm5lbDsKKworI2lmZGVmIFNFUklBTF9ERUJVR19USFJPVFRMRQorICBjaGFyIGJ1Zls2NF07CisJCisgICAgcHJpbnRrKCJ0aHJvdHRsZSAlczogJWQuLi4uXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZiksCisJICAgdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSk7CisgICAgcHJpbnRrKCJjeV90aHJvdHRsZSAlc1xuIiwgdHR5LT5uYW1lKTsKKyNlbmRpZgorCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9udGhyb3R0bGUiKSl7CisJICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoSV9JWE9GRih0dHkpKSB7CisJaW5mby0+eF9jaGFyID0gU1RPUF9DSEFSKHR0eSk7CisJICAgIC8qIFNob3VsZCB1c2UgdGhlICJTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIiBmZWF0dXJlISEhICovCisgICAgfQorCisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsKKwliYXNlX2FkZHJbQ3lNU1ZSMV0gPSAwOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIHJldHVybjsKK30gLyogY3lfdGhyb3R0bGUgKi8KKworCitzdGF0aWMgdm9pZAorY3lfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOworICBpbnQgY2hhbm5lbDsKKworI2lmZGVmIFNFUklBTF9ERUJVR19USFJPVFRMRQorICBjaGFyIGJ1Zls2NF07CisJCisgICAgcHJpbnRrKCJ0aHJvdHRsZSAlczogJWQuLi4uXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZiksCisJICAgdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSk7CisgICAgcHJpbnRrKCJjeV91bnRocm90dGxlICVzXG4iLCB0dHktPm5hbWUpOworI2VuZGlmCisKKyAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X250aHJvdHRsZSIpKXsKKwkgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChJX0lYT0ZGKHR0eSkpIHsKKwlpbmZvLT54X2NoYXIgPSBTVEFSVF9DSEFSKHR0eSk7CisJLyogU2hvdWxkIHVzZSB0aGUgIlNlbmQgU3BlY2lhbCBDaGFyYWN0ZXIiIGZlYXR1cmUhISEgKi8KKyAgICB9CisKKyAgICBjaGFubmVsID0gaW5mby0+bGluZTsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwliYXNlX2FkZHJbQ3lDQVJdID0gKHVfY2hhciljaGFubmVsOworCWJhc2VfYWRkcltDeU1TVlIxXSA9IEN5UlRTOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIHJldHVybjsKK30gLyogY3lfdW50aHJvdHRsZSAqLworCitzdGF0aWMgaW50CitnZXRfc2VyaWFsX2luZm8oc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKiByZXRpbmZvKQoreworICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7CisKKy8qIENQKCdnJyk7ICovCisgICAgaWYgKCFyZXRpbmZvKQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKyAgICB0bXAudHlwZSA9IGluZm8tPnR5cGU7CisgICAgdG1wLmxpbmUgPSBpbmZvLT5saW5lOworICAgIHRtcC5wb3J0ID0gaW5mby0+bGluZTsKKyAgICB0bXAuaXJxID0gMDsKKyAgICB0bXAuZmxhZ3MgPSBpbmZvLT5mbGFnczsKKyAgICB0bXAuYmF1ZF9iYXNlID0gMDsgICAgICAgICAgLyohISEqLworICAgIHRtcC5jbG9zZV9kZWxheSA9IGluZm8tPmNsb3NlX2RlbGF5OworICAgIHRtcC5jdXN0b21fZGl2aXNvciA9IDA7ICAgICAvKiEhISovCisgICAgdG1wLmh1YjYgPSAwOyAgICAgICAgICAgICAgIC8qISEhKi8KKyAgICByZXR1cm4gY29weV90b191c2VyKHJldGluZm8sJnRtcCxzaXplb2YoKnJldGluZm8pKSA/IC1FRkFVTFQgOiAwOworfSAvKiBnZXRfc2VyaWFsX2luZm8gKi8KKworc3RhdGljIGludAorc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZXJpYWxfc3RydWN0ICogbmV3X2luZm8pCit7CisgIHN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0IG9sZF9pbmZvOworCisvKiBDUCgncycpOyAqLworICAgIGlmICghbmV3X2luZm8pCisJICAgIHJldHVybiAtRUZBVUxUOworICAgIGlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NlcmlhbCxuZXdfaW5mbyxzaXplb2YobmV3X3NlcmlhbCkpKQorCSAgICByZXR1cm4gLUVGQVVMVDsKKyAgICBvbGRfaW5mbyA9ICppbmZvOworCisgICAgaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJICAgIGlmICgobmV3X3NlcmlhbC5jbG9zZV9kZWxheSAhPSBpbmZvLT5jbG9zZV9kZWxheSkgfHwKKwkJKChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MgJiB+QVNZTkNfVVNSX01BU0spICE9CisJCSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19GTEFHUyAmIH5BU1lOQ19VU1JfTUFTSykpKQorCQkgICAgcmV0dXJuIC1FUEVSTTsKKwkgICAgaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CisJCQkgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX1VTUl9NQVNLKSk7CisJICAgIGdvdG8gY2hlY2tfYW5kX2V4aXQ7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIE9LLCBwYXN0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3IgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZS4KKyAgICAgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGFydCBtYWtpbmcgY2hhbmdlcy4uLi4uCisgICAgICovCisKKyAgICBpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwKKwkJICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKKyAgICBpbmZvLT5jbG9zZV9kZWxheSA9IG5ld19zZXJpYWwuY2xvc2VfZGVsYXk7CisKKworY2hlY2tfYW5kX2V4aXQ6CisgICAgaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpeworCWNvbmZpZ19zZXR1cChpbmZvKTsKKwlyZXR1cm4gMDsKKyAgICB9ZWxzZXsKKyAgICAgICAgcmV0dXJuIHN0YXJ0dXAoaW5mbyk7CisgICAgfQorfSAvKiBzZXRfc2VyaWFsX2luZm8gKi8KKworc3RhdGljIGludAorY3lfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIGludCBjaGFubmVsOworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICB1bnNpZ25lZCBjaGFyIHN0YXR1czsKKyAgdW5zaWduZWQgaW50IHJlc3VsdDsKKworICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lOworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgICAgICBiYXNlX2FkZHJbQ3lDQVJdID0gKHVfY2hhciljaGFubmVsOworICAgICAgICBzdGF0dXMgPSBiYXNlX2FkZHJbQ3lNU1ZSMV0gfCBiYXNlX2FkZHJbQ3lNU1ZSMl07CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgcmV0dXJuICAgICgoc3RhdHVzICAmIEN5UlRTKSA/IFRJT0NNX1JUUyA6IDApCisgICAgICAgICAgICB8ICgoc3RhdHVzICAmIEN5RFRSKSA/IFRJT0NNX0RUUiA6IDApCisgICAgICAgICAgICB8ICgoc3RhdHVzICAmIEN5RENEKSA/IFRJT0NNX0NBUiA6IDApCisgICAgICAgICAgICB8ICgoc3RhdHVzICAmIEN5RFNSKSA/IFRJT0NNX0RTUiA6IDApCisgICAgICAgICAgICB8ICgoc3RhdHVzICAmIEN5Q1RTKSA/IFRJT0NNX0NUUyA6IDApOworfSAvKiBjeV90aW9jbWdldCAqLworCitzdGF0aWMgaW50CitjeV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICBpbnQgY2hhbm5lbDsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgdW5zaWduZWQgaW50IGFyZzsKKwkgIAorICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lOworCisJaWYgKHNldCAmIFRJT0NNX1JUUyl7CisJICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsKKwkJYmFzZV9hZGRyW0N5TVNWUjFdID0gQ3lSVFM7CisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9CisJaWYgKHNldCAmIFRJT0NNX0RUUil7CisJICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkgICAgYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsKKy8qIENQKCdTJyk7Q1AoJzInKTsgKi8KKwkgICAgYmFzZV9hZGRyW0N5TVNWUjJdID0gQ3lEVFI7CisjaWZkZWYgU0VSSUFMX0RFQlVHX0RUUgorICAgICAgICAgICAgcHJpbnRrKCJjeWM6ICVkOiByYWlzaW5nIERUUlxuIiwgX19MSU5FX18pOworICAgICAgICAgICAgcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwgYmFzZV9hZGRyW0N5TVNWUjFdLCBiYXNlX2FkZHJbQ3lNU1ZSMl0pOworI2VuZGlmCisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9CisKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpeworCSAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWJhc2VfYWRkcltDeUNBUl0gPSAodV9jaGFyKWNoYW5uZWw7CisJCWJhc2VfYWRkcltDeU1TVlIxXSA9IDA7CisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKXsKKwkgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCSAgICBiYXNlX2FkZHJbQ3lDQVJdID0gKHVfY2hhciljaGFubmVsOworLyogQ1AoJ0MnKTtDUCgnMicpOyAqLworCSAgICBiYXNlX2FkZHJbQ3lNU1ZSMl0gPSAwOworI2lmZGVmIFNFUklBTF9ERUJVR19EVFIKKyAgICAgICAgICAgIHByaW50aygiY3ljOiAlZDogZHJvcHBpbmcgRFRSXG4iLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBwcmludGsoIiAgICAgc3RhdHVzOiAweCV4LCAweCV4XG4iLCBiYXNlX2FkZHJbQ3lNU1ZSMV0sIGJhc2VfYWRkcltDeU1TVlIyXSk7CisjZW5kaWYKKwkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKworICAgIHJldHVybiAwOworfSAvKiBzZXRfbW9kZW1faW5mbyAqLworCitzdGF0aWMgdm9pZAorc2VuZF9icmVhayggc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCBpbnQgZHVyYXRpb24pCit7IC8qIExldCB0aGUgdHJhbnNtaXQgSVNSIHRha2UgY2FyZSBvZiB0aGlzIChzaW5jZSBpdAorICAgICByZXF1aXJlcyBzdHVmZmluZyBjaGFyYWN0ZXJzIGludG8gdGhlIG91dHB1dCBzdHJlYW0pLgorICAgKi8KKyAgICBpbmZvLT54X2JyZWFrID0gZHVyYXRpb247CisgICAgaWYgKCFpbmZvLT54bWl0X2NudCApIHsKKwlzdGFydF94bWl0KGluZm8pOworICAgIH0KK30gLyogc2VuZF9icmVhayAqLworCitzdGF0aWMgaW50CitnZXRfbW9uX2luZm8oc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCBzdHJ1Y3QgY3ljbGFkZXNfbW9uaXRvciAqIG1vbikKK3sKKworICAgaWYgKGNvcHlfdG9fdXNlcihtb24sICZpbmZvLT5tb24sIHNpemVvZihzdHJ1Y3QgY3ljbGFkZXNfbW9uaXRvcikpKQorCSAgIHJldHVybiAtRUZBVUxUOworICAgaW5mby0+bW9uLmludF9jb3VudCAgPSAwOworICAgaW5mby0+bW9uLmNoYXJfY291bnQgPSAwOworICAgaW5mby0+bW9uLmNoYXJfbWF4ICAgPSAwOworICAgaW5mby0+bW9uLmNoYXJfbGFzdCAgPSAwOworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NldF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nICphcmcpCit7CisgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOworICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKyAgIGludCBjaGFubmVsOworICAgCisgICBpZiAoZ2V0X3VzZXIodmFsdWUsIGFyZykpCisJICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgIGNoYW5uZWwgPSBpbmZvLT5saW5lOworICAgaW5mby0+Y29yNCAmPSB+Q3lSRUNfRklGTzsKKyAgIGluZm8tPmNvcjQgfD0gdmFsdWUgJiBDeVJFQ19GSUZPOworICAgYmFzZV9hZGRyW0N5Q09SNF0gPSBpbmZvLT5jb3I0OworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2dldF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nICp2YWx1ZSkKK3sKKyAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisgICBpbnQgY2hhbm5lbDsKKyAgIHVuc2lnbmVkIGxvbmcgdG1wOworICAgCisgICBjaGFubmVsID0gaW5mby0+bGluZTsKKworICAgdG1wID0gYmFzZV9hZGRyW0N5Q09SNF0gJiBDeVJFQ19GSUZPOworICAgcmV0dXJuIHB1dF91c2VyKHRtcCx2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3NldF9kZWZhdWx0X3RocmVzaG9sZChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgKmFyZykKK3sKKyAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKyAgIGlmIChnZXRfdXNlcih2YWx1ZSwgYXJnKSkKKwlyZXR1cm4gLUVGQVVMVDsKKworICAgaW5mby0+ZGVmYXVsdF90aHJlc2hvbGQgPSB2YWx1ZSAmIDB4MGY7CisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZ2V0X2RlZmF1bHRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyAqdmFsdWUpCit7CisgICByZXR1cm4gcHV0X3VzZXIoaW5mby0+ZGVmYXVsdF90aHJlc2hvbGQsdmFsdWUpOworfQorCitzdGF0aWMgaW50CitzZXRfdGltZW91dChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgKmFyZykKK3sKKyAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisgICBpbnQgY2hhbm5lbDsKKyAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKyAgIGlmIChnZXRfdXNlcih2YWx1ZSwgYXJnKSkKKwkgICByZXR1cm4gLUVGQVVMVDsKKyAgIAorICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisKKyAgIGJhc2VfYWRkcltDeVJUUFJMXSA9IHZhbHVlICYgMHhmZjsKKyAgIGJhc2VfYWRkcltDeVJUUFJIXSA9ICh2YWx1ZSA+PiA4KSAmIDB4ZmY7CisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZ2V0X3RpbWVvdXQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nICp2YWx1ZSkKK3sKKyAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisgICBpbnQgY2hhbm5lbDsKKyAgIHVuc2lnbmVkIGxvbmcgdG1wOworICAgCisgICBjaGFubmVsID0gaW5mby0+bGluZTsKKworICAgdG1wID0gYmFzZV9hZGRyW0N5UlRQUkxdOworICAgcmV0dXJuIHB1dF91c2VyKHRtcCx2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3NldF9kZWZhdWx0X3RpbWVvdXQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworICAgaW5mby0+ZGVmYXVsdF90aW1lb3V0ID0gdmFsdWUgJiAweGZmOworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9kZWZhdWx0X3RpbWVvdXQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nICp2YWx1ZSkKK3sKKyAgIHJldHVybiBwdXRfdXNlcihpbmZvLT5kZWZhdWx0X3RpbWVvdXQsdmFsdWUpOworfQorCitzdGF0aWMgaW50CitjeV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgdW5zaWduZWQgbG9uZyB2YWw7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgIGludCByZXRfdmFsID0gMDsKKworI2lmZGVmIFNFUklBTF9ERUJVR19PVEhFUgorICAgIHByaW50aygiY3lfaW9jdGwgJXMsIGNtZCA9ICV4IGFyZyA9ICVseFxuIiwgdHR5LT5uYW1lLCBjbWQsIGFyZyk7IC8qICovCisjZW5kaWYKKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgIGNhc2UgQ1lHRVRNT046CisgICAgICAgICAgICByZXRfdmFsID0gZ2V0X21vbl9pbmZvKGluZm8sIChzdHJ1Y3QgY3ljbGFkZXNfbW9uaXRvciAqKWFyZyk7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIENZR0VUVEhSRVNIOgorCSAgICByZXRfdmFsID0gZ2V0X3RocmVzaG9sZChpbmZvLCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisgCSAgICBicmVhazsKKyAgICAgICAgY2FzZSBDWVNFVFRIUkVTSDoKKyAgICAgICAgICAgIHJldF92YWwgPSBzZXRfdGhyZXNob2xkKGluZm8sICh1bnNpZ25lZCBsb25nICopYXJnKTsKKwkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lHRVRERUZUSFJFU0g6CisJICAgIHJldF92YWwgPSBnZXRfZGVmYXVsdF90aHJlc2hvbGQoaW5mbywgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworIAkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lTRVRERUZUSFJFU0g6CisgICAgICAgICAgICByZXRfdmFsID0gc2V0X2RlZmF1bHRfdGhyZXNob2xkKGluZm8sICh1bnNpZ25lZCBsb25nICopYXJnKTsKKwkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lHRVRUSU1FT1VUOgorCSAgICByZXRfdmFsID0gZ2V0X3RpbWVvdXQoaW5mbywgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworIAkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lTRVRUSU1FT1VUOgorICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF90aW1lb3V0KGluZm8sICh1bnNpZ25lZCBsb25nICopYXJnKTsKKwkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1lHRVRERUZUSU1FT1VUOgorCSAgICByZXRfdmFsID0gZ2V0X2RlZmF1bHRfdGltZW91dChpbmZvLCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisgCSAgICBicmVhazsKKyAgICAgICAgY2FzZSBDWVNFVERFRlRJTUVPVVQ6CisgICAgICAgICAgICByZXRfdmFsID0gc2V0X2RlZmF1bHRfdGltZW91dChpbmZvLCAodW5zaWduZWQgbG9uZylhcmcpOworCSAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQ1NCUks6ICAgIC8qIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhayAqLworCSAgICByZXRfdmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCSAgICBpZiAocmV0X3ZhbCkKKwkJICAgIGJyZWFrOworICAgICAgICAgICAgdHR5X3dhaXRfdW50aWxfc2VudCh0dHksMCk7CisgICAgICAgICAgICBpZiAoIWFyZykKKyAgICAgICAgICAgICAgICBzZW5kX2JyZWFrKGluZm8sIEhaLzQpOyAvKiAxLzQgc2Vjb25kICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQ1NCUktQOiAgIC8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KKwkgICAgcmV0X3ZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkgICAgaWYgKHJldF92YWwpCisJCWJyZWFrOworICAgICAgICAgICAgdHR5X3dhaXRfdW50aWxfc2VudCh0dHksMCk7CisgICAgICAgICAgICBzZW5kX2JyZWFrKGluZm8sIGFyZyA/IGFyZyooSFovMTApIDogSFovNCk7CisgICAgICAgICAgICBicmVhazsKKworLyogVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgaW5jb21wbGV0ZWx5IGltcGxlbWVudGVkISEhICovCisgICAgICAgIGNhc2UgVElPQ0dTT0ZUQ0FSOgorICAgICAgICAgICAgcmV0X3ZhbCA9IHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwgKHVuc2lnbmVkIGxvbmcgKikgYXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRJT0NTU09GVENBUjoKKyAgICAgICAgICAgIHJldF92YWwgPSBnZXRfdXNlcih2YWwsICh1bnNpZ25lZCBsb25nICopIGFyZyk7CisJICAgIGlmIChyZXRfdmFsKQorCQkgICAgYnJlYWs7CisgICAgICAgICAgICB0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQorICAgICAgICAgICAgICAgICAgICAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpIHwgKHZhbCA/IENMT0NBTCA6IDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRJT0NHU0VSSUFMOgorICAgICAgICAgICAgcmV0X3ZhbCA9IGdldF9zZXJpYWxfaW5mbyhpbmZvLCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKikgYXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRJT0NTU0VSSUFMOgorICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF9zZXJpYWxfaW5mbyhpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKikgYXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorCSAgICByZXRfdmFsID0gLUVOT0lPQ1RMQ01EOworICAgIH0KKworI2lmZGVmIFNFUklBTF9ERUJVR19PVEhFUgorICAgIHByaW50aygiY3lfaW9jdGwgZG9uZVxuIik7CisjZW5kaWYKKworICAgIHJldHVybiByZXRfdmFsOworfSAvKiBjeV9pb2N0bCAqLworCisKKworCitzdGF0aWMgdm9pZAorY3lfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGRfdGVybWlvcykKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeV9zZXRfdGVybWlvcyAlc1xuIiwgdHR5LT5uYW1lKTsKKyNlbmRpZgorCisgICAgaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKKyAgICAgICAgcmV0dXJuOworICAgIGNvbmZpZ19zZXR1cChpbmZvKTsKKworICAgIGlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgorICAgICAgICAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisgICAgICAgICAgICB0dHktPnN0b3BwZWQgPSAwOworICAgICAgICAgICAgY3lfc3RhcnQodHR5KTsKKyAgICB9CisjaWZkZWYgdHl0c29fcGF0Y2hfOTROb3YyNV8xNzI2CisgICAgaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICYmCisgICAgICAgICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpKQorICAgICAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworI2VuZGlmCisKKyAgICByZXR1cm47Cit9IC8qIGN5X3NldF90ZXJtaW9zICovCisKKworc3RhdGljIHZvaWQKK2N5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKy8qIENQKCdDJyk7ICovCisjaWZkZWYgU0VSSUFMX0RFQlVHX09USEVSCisgICAgcHJpbnRrKCJjeV9jbG9zZSAlc1xuIiwgdHR5LT5uYW1lKTsKKyNlbmRpZgorCisgICAgaWYgKCFpbmZvCisgICAgfHwgc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X2Nsb3NlIikpeworICAgICAgICByZXR1cm47CisgICAgfQorI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisgICAgcHJpbnRrKCJjeV9jbG9zZSAlcywgY291bnQgPSAlZFxuIiwgdHR5LT5uYW1lLCBpbmZvLT5jb3VudCk7CisjZW5kaWYKKworICAgIGlmICgodHR5LT5jb3VudCA9PSAxKSAmJiAoaW5mby0+Y291bnQgIT0gMSkpIHsKKwkvKgorCSAqIFVoLCBvaC4gIHR0eS0+Y291bnQgaXMgMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdHR5CisJICogc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuICBJbmZvLT5jb3VudCBzaG91bGQgYWx3YXlzCisJICogYmUgb25lIGluIHRoZXNlIGNvbmRpdGlvbnMuICBJZiBpdCdzIGdyZWF0ZXIgdGhhbgorCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQorCSAqIHNlcmlhbCBwb3J0IHdvbid0IGJlIHNodXRkb3duLgorCSAqLworCXByaW50aygiY3lfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCisJICAgImluZm8tPmNvdW50IGlzICVkXG4iLCBpbmZvLT5jb3VudCk7CisJaW5mby0+Y291bnQgPSAxOworICAgIH0KKyNpZmRlZiBTRVJJQUxfREVCVUdfQ09VTlQKKyAgICBwcmludGsoImN5YzogJWQ6IGRlY3JlbWVudGluZyBjb3VudCB0byAlZFxuIiwgX19MSU5FX18sIGluZm8tPmNvdW50IC0gMSk7CisjZW5kaWYKKyAgICBpZiAoLS1pbmZvLT5jb3VudCA8IDApIHsKKwlwcmludGsoImN5X2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQgZm9yIHR0eXMlZDogJWRcbiIsCisJICAgICAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsKKyNpZmRlZiBTRVJJQUxfREVCVUdfQ09VTlQKKyAgICBwcmludGsoImN5YzogJWQ6IHNldHRpbmcgY291bnQgdG8gMFxuIiwgX19MSU5FX18pOworI2VuZGlmCisJaW5mby0+Y291bnQgPSAwOworICAgIH0KKyAgICBpZiAoaW5mby0+Y291bnQpCisJcmV0dXJuOworICAgIGluZm8tPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisgICAgaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpCisJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDMwMDApOyAvKiAzMCBzZWNvbmRzIHRpbWVvdXQgKi8KKyAgICBzaHV0ZG93bihpbmZvKTsKKyAgICBpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisgICAgdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisgICAgaW5mby0+ZXZlbnQgPSAwOworICAgIGluZm8tPnR0eSA9IDA7CisgICAgaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgeworCWlmIChpbmZvLT5jbG9zZV9kZWxheSkgeworCSAgICBtc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7CisJfQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKyAgICB9CisgICAgaW5mby0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFfEFTWU5DX0NMT1NJTkcpOworICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1RIRVIKKyAgICBwcmludGsoImN5X2Nsb3NlIGRvbmVcbiIpOworI2VuZGlmCisKKyAgICByZXR1cm47Cit9IC8qIGN5X2Nsb3NlICovCisKKy8qCisgKiBjeV9oYW5ndXAoKSAtLS0gY2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgorICovCit2b2lkCitjeV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwkKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1RIRVIKKyAgICBwcmludGsoImN5X2hhbmd1cCAlc1xuIiwgdHR5LT5uYW1lKTsgLyogKi8KKyNlbmRpZgorCisgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9oYW5ndXAiKSkKKwlyZXR1cm47CisgICAgCisgICAgc2h1dGRvd24oaW5mbyk7CisjaWYgMAorICAgIGluZm8tPmV2ZW50ID0gMDsKKyAgICBpbmZvLT5jb3VudCA9IDA7CisjaWZkZWYgU0VSSUFMX0RFQlVHX0NPVU5UCisgICAgcHJpbnRrKCJjeWM6ICVkOiBzZXR0aW5nIGNvdW50IHRvIDBcbiIsIF9fTElORV9fKTsKKyNlbmRpZgorICAgIGluZm8tPnR0eSA9IDA7CisjZW5kaWYKKyAgICBpbmZvLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKyAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9IC8qIGN5X2hhbmd1cCAqLworCisKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY3lfb3BlbigpIGFuZCBmcmllbmRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdGF0aWMgaW50CitibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8pCit7CisgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICBpbnQgY2hhbm5lbDsKKyAgaW50IHJldHZhbDsKKyAgdm9sYXRpbGUgdV9jaGFyICpiYXNlX2FkZHIgPSAodV9jaGFyICopQkFTRV9BRERSOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCisgICAgICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCisgICAgICovCisgICAgaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgeworCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpeworCSAgICByZXR1cm4gLUVBR0FJTjsKKwl9ZWxzZXsKKwkgICAgcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQKKyAgICAgKiBhbmQgdGhlbiBleGl0LgorICAgICAqLworICAgIGlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBCbG9jayB3YWl0aW5nIGZvciB0aGUgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZQorICAgICAqIGZyZWUgKGkuZS4sIG5vdCBpbiB1c2UgYnkgdGhlIGNhbGxvdXQpLiAgV2hpbGUgd2UgYXJlIGluCisgICAgICogdGhpcyBsb29wLCBpbmZvLT5jb3VudCBpcyBkcm9wcGVkIGJ5IG9uZSwgc28gdGhhdAorICAgICAqIGN5X2Nsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIFdlIHJlc3RvcmUgaXQgdXBvbgorICAgICAqIGV4aXQsIGVpdGhlciBub3JtYWwgb3IgYWJub3JtYWwuCisgICAgICovCisgICAgcmV0dmFsID0gMDsKKyAgICBhZGRfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKyAgICBwcmludGsoImJsb2NrX3RpbF9yZWFkeSBiZWZvcmUgYmxvY2s6ICVzLCBjb3VudCA9ICVkXG4iLAorCSAgIHR0eS0+bmFtZSwgaW5mby0+Y291bnQpOy8qKi8KKyNlbmRpZgorICAgIGluZm8tPmNvdW50LS07CisjaWZkZWYgU0VSSUFMX0RFQlVHX0NPVU5UCisgICAgcHJpbnRrKCJjeWM6ICVkOiBkZWNyZW1lbnRpbmcgY291bnQgdG8gJWRcbiIsIF9fTElORV9fLCBpbmZvLT5jb3VudCk7CisjZW5kaWYKKyAgICBpbmZvLT5ibG9ja2VkX29wZW4rKzsKKworICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lOworCisgICAgd2hpbGUgKDEpIHsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsKKwliYXNlX2FkZHJbQ3lNU1ZSMV0gPSBDeVJUUzsKKy8qIENQKCdTJyk7Q1AoJzQnKTsgKi8KKwliYXNlX2FkZHJbQ3lNU1ZSMl0gPSBDeURUUjsKKyNpZmRlZiBTRVJJQUxfREVCVUdfRFRSCisJcHJpbnRrKCJjeWM6ICVkOiByYWlzaW5nIERUUlxuIiwgX19MSU5FX18pOworCXByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsIGJhc2VfYWRkcltDeU1TVlIxXSwgYmFzZV9hZGRyW0N5TVNWUjJdKTsKKyNlbmRpZgorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApCisJfHwgIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSApeworCSAgICBpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSB7CisJCXJldHZhbCA9IC1FQUdBSU47CisJICAgIH1lbHNleworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkgICAgYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsKKy8qIENQKCdMJyk7Q1AxKDEgJiYgQ19DTE9DQUwodHR5KSk7IENQMSgxICYmIChiYXNlX2FkZHJbQ3lNU1ZSMV0gJiBDeURDRCkgKTsgKi8KKwkgICAgaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKQorCSAgICAmJiAoQ19DTE9DQUwodHR5KQorCSAgICAgICAgfHwgKGJhc2VfYWRkcltDeU1TVlIxXSAmIEN5RENEKSkpIHsKKwkJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJICAgIGJyZWFrOworCSAgICB9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCSAgICByZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJICAgIGJyZWFrOworCX0KKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygiYmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nOiAlcywgY291bnQgPSAlZFxuIiwKKwkgICAgICAgdHR5LT5uYW1lLCBpbmZvLT5jb3VudCk7LyoqLworI2VuZGlmCisJc2NoZWR1bGUoKTsKKyAgICB9CisgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisgICAgcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworICAgIGlmICghdHR5X2h1bmdfdXBfcChmaWxwKSl7CisJaW5mby0+Y291bnQrKzsKKyNpZmRlZiBTRVJJQUxfREVCVUdfQ09VTlQKKyAgICBwcmludGsoImN5YzogJWQ6IGluY3JlbWVudGluZyBjb3VudCB0byAlZFxuIiwgX19MSU5FX18sIGluZm8tPmNvdW50KTsKKyNlbmRpZgorICAgIH0KKyAgICBpbmZvLT5ibG9ja2VkX29wZW4tLTsKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorICAgIHByaW50aygiYmxvY2tfdGlsX3JlYWR5IGFmdGVyIGJsb2NraW5nOiAlcywgY291bnQgPSAlZFxuIiwKKwkgICB0dHktPm5hbWUsIGluZm8tPmNvdW50KTsvKiovCisjZW5kaWYKKyAgICBpZiAocmV0dmFsKQorCSAgICByZXR1cm4gcmV0dmFsOworICAgIGluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisgICAgcmV0dXJuIDA7Cit9IC8qIGJsb2NrX3RpbF9yZWFkeSAqLworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBhIHNlcmlhbCBwb3J0IGlzIG9wZW5lZC4gIEl0CisgKiBwZXJmb3JtcyB0aGUgc2VyaWFsLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZvciB0aGUgdHR5IHN0cnVjdHVyZS4KKyAqLworaW50CitjeV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKyAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgICppbmZvOworICBpbnQgcmV0dmFsLCBsaW5lOworCisvKiBDUCgnTycpOyAqLworICAgIGxpbmUgPSB0dHktPmluZGV4OworICAgIGlmICgobGluZSA8IDApIHx8IChOUl9QT1JUUyA8PSBsaW5lKSl7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICBpbmZvID0gJmN5X3BvcnRbbGluZV07CisgICAgaWYgKGluZm8tPmxpbmUgPCAwKXsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorI2lmZGVmIFNFUklBTF9ERUJVR19PVEhFUgorICAgIHByaW50aygiY3lfb3BlbiAlc1xuIiwgdHR5LT5uYW1lKTsgLyogKi8KKyNlbmRpZgorICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfb3BlbiIpKXsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisgICAgcHJpbnRrKCJjeV9vcGVuICVzLCBjb3VudCA9ICVkXG4iLCB0dHktPm5hbWUsIGluZm8tPmNvdW50KTsvKiovCisjZW5kaWYKKyAgICBpbmZvLT5jb3VudCsrOworI2lmZGVmIFNFUklBTF9ERUJVR19DT1VOVAorICAgIHByaW50aygiY3ljOiAlZDogaW5jcmVtZW50aW5nIGNvdW50IHRvICVkXG4iLCBfX0xJTkVfXywgaW5mby0+Y291bnQpOworI2VuZGlmCisgICAgdHR5LT5kcml2ZXJfZGF0YSA9IGluZm87CisgICAgaW5mby0+dHR5ID0gdHR5OworCisgICAgaWYgKCF0bXBfYnVmKSB7CisJdG1wX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXRtcF9idWYpeworCSAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU3RhcnQgdXAgc2VyaWFsIHBvcnQKKyAgICAgKi8KKyAgICByZXR2YWwgPSBzdGFydHVwKGluZm8pOworICAgIGlmIChyZXR2YWwpeworCXJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgcmV0dmFsID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgaW5mbyk7CisgICAgaWYgKHJldHZhbCkgeworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisJcHJpbnRrKCJjeV9vcGVuIHJldHVybmluZyBhZnRlciBibG9ja190aWxfcmVhZHkgd2l0aCAlZFxuIiwKKwkgICAgICAgcmV0dmFsKTsKKyNlbmRpZgorCXJldHVybiByZXR2YWw7CisgICAgfQorCisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKyAgICBwcmludGsoImN5X29wZW4gZG9uZVxuIik7LyoqLworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9IC8qIGN5X29wZW4gKi8KKworCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNlcmlhbDE2N19pbml0KCkgYW5kIGZyaWVuZHMKKyAqCisgKiBzZXJpYWwxNjdfaW5pdCgpIGlzIGNhbGxlZCBhdCBib290LXRpbWUgdG8gaW5pdGlhbGl6ZSB0aGUgc2VyaWFsIGRyaXZlci4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgcHJpbnRzIG91dCB0aGUgYXBwcm9wcmlhdGUgc2VyaWFsIGRyaXZlciB2ZXJzaW9uCisgKiBudW1iZXIsIGFuZCBpZGVudGlmaWVzIHdoaWNoIG9wdGlvbnMgd2VyZSBjb25maWd1cmVkIGludG8gdGhpcworICogZHJpdmVyLgorICovCitzdGF0aWMgdm9pZAorc2hvd192ZXJzaW9uKHZvaWQpCit7CisgICAgcHJpbnRrKCJNVk1FMTY2LzE2NyBjZDI0MDEgZHJpdmVyXG4iKTsKK30gLyogc2hvd192ZXJzaW9uICovCisKKy8qIGluaXRpYWxpemUgY2hpcHMgb24gY2FyZCAtLSByZXR1cm4gbnVtYmVyIG9mIHZhbGlkCisgICBjaGlwcyAod2hpY2ggaXMgbnVtYmVyIG9mIHBvcnRzLzQpICovCisKKy8qCisgKiBUaGlzIGluaXRpYWxpc2VzIHRoZSBoYXJkd2FyZSB0byBhIHJlYXNvbmFibGUgc3RhdGUuICBJdCBzaG91bGQKKyAqIHByb2JlIHRoZSBjaGlwIGZpcnN0IHNvIGFzIHRvIGNvcHkgMTY2LUJ1ZyBzZXR1cCBhcyBhIGRlZmF1bHQgZm9yCisgKiBwb3J0IDAuICBJdCBpbml0aWFsaXNlcyBDTVIgdG8gQ3lBU1lOQzsgdGhhdCBpcyBuZXZlciBkb25lIGFnYWluLCBzbworICogYXMgdG8gbGltaXQgdGhlIG51bWJlciBvZiBDeUlOSVRfQ0hBTiBjb21tYW5kcyBpbiBub3JtYWwgcnVubmluZy4KKyAqCisgKiAuLi4gSSB3b25kZXIgd2hhdCBJIHNob3VsZCBkbyBpZiB0aGlzIGZhaWxzIC4uLgorICovCisKK3ZvaWQKK212bWUxNjdfc2VyaWFsX2NvbnNvbGVfc2V0dXAoaW50IGNmbGFnKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqIGJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisJaW50IGNoOworCXVfY2hhciBzcGQ7CisJdV9jaGFyIHJjb3IsIHJicHIsIGJhZHNwZWVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyoKKwkgKiBGaXJzdCBwcm9iZSBjaGFubmVsIHplcm8gb2YgdGhlIGNoaXAsIHRvIHNlZSB3aGF0IHNwZWVkIGhhcworCSAqIGJlZW4gc2VsZWN0ZWQuCisJICovCisKKwliYXNlX2FkZHJbQ3lDQVJdID0gMDsKKworCXJjb3IgPSBiYXNlX2FkZHJbQ3lSQ09SXSA8PCA1OworCXJicHIgPSBiYXNlX2FkZHJbQ3lSQlBSXTsKKworCWZvciAoc3BkID0gMDsgc3BkIDwgc2l6ZW9mKGJhdWRfYnByKTsgc3BkKyspCisJCWlmIChyYnByID09IGJhdWRfYnByW3NwZF0gJiYgcmNvciA9PSBiYXVkX2NvW3NwZF0pCisJCQlicmVhazsKKwlpZiAoc3BkID49IHNpemVvZihiYXVkX2JwcikpIHsKKwkJc3BkID0gMTQ7CS8qIDE5MjAwICovCisJCWJhZHNwZWVkID0gMTsJLyogRmFpbGVkIHRvIGlkZW50aWZ5IHNwZWVkICovCisJfQorCWluaXRpYWxfY29uc29sZV9zcGVlZCA9IHNwZDsKKworCS8qIE9LLCB3ZSBoYXZlIGNob3NlbiBhIHNwZWVkLCBub3cgcmVzZXQgYW5kIHJlaW5pdGlhbGlzZSAqLworCisgICAgICAgIG15X3VkZWxheSgyMDAwMEwpOwkvKiBBbGxvdyB0aW1lIGZvciBhbnkgYWN0aXZlIG8vcCB0byBjb21wbGV0ZSAqLworICAgICAgICBpZihiYXNlX2FkZHJbQ3lDQ1JdICE9IDB4MDApeworICAgICAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgICAgICAgICAgLyogcHJpbnRrKCIgY2hpcCBpcyBuZXZlciBpZGxlIChDQ1IgIT0gMClcbiIpOyAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYmFzZV9hZGRyW0N5Q0NSXSA9IEN5Q0hJUF9SRVNFVDsJLyogUmVzZXQgdGhlIGNoaXAgKi8KKyAgICAgICAgbXlfdWRlbGF5KDEwMDBMKTsKKworICAgICAgICBpZihiYXNlX2FkZHJbQ3lHRlJDUl0gPT0gMHgwMCl7CisgICAgICAgICAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgICAgICAgICAvKiBwcmludGsoIiBjaGlwIGlzIG5vdCByZXNwb25kaW5nIChHRlJDUiBzdGF5ZWQgMClcbiIpOyAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwkvKgorCSAqIFN5c3RlbSBjbG9jayBpcyAyME1oeiwgZGl2aWRlZCBieSAyMDQ4LCBzbyBkaXZpZGUgYnkgMTAgZm9yIGEgMS4wbXMKKwkgKiB0aWNrCisJICovCisKKwliYXNlX2FkZHJbQ3lUUFJdID0gMTA7CisKKwliYXNlX2FkZHJbQ3lQSUxSMV0gPSAweDAxOyAgICAvKiBJbnRlcnJ1cHQgbGV2ZWwgZm9yIG1vZGVtIGNoYW5nZSAqLworCWJhc2VfYWRkcltDeVBJTFIyXSA9IDB4MDI7ICAgIC8qIEludGVycnVwdCBsZXZlbCBmb3IgdHggaW50cyAqLworCWJhc2VfYWRkcltDeVBJTFIzXSA9IDB4MDM7ICAgIC8qIEludGVycnVwdCBsZXZlbCBmb3IgcnggaW50cyAqLworCisJLyoKKwkgKiBBdHRlbXB0IHRvIHNldCB1cCBhbGwgY2hhbm5lbHMgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUsIGFuZAorCSAqIGJhbmcgb3V0IGEgSU5JVF9DSEFOIGNvbW1hbmQuICBXZSBzaG91bGQgdGhlbiBiZSBhYmxlIHRvIGxpbWl0CisJICogdGhlIGFtbW91bnQgb2YgZmlkZGxpbmcgd2UgaGF2ZSB0byBkbyBpbiBub3JtYWwgcnVubmluZy4KKwkgKi8KKworCWZvciAoY2ggPSAzOyBjaCA+PSAwIDsgY2gtLSkgeworCQliYXNlX2FkZHJbQ3lDQVJdID0gKHVfY2hhciljaDsKKwkJYmFzZV9hZGRyW0N5SUVSXSA9IDA7CisJCWJhc2VfYWRkcltDeUNNUl0gPSBDeUFTWU5DOworCQliYXNlX2FkZHJbQ3lMSUNSXSA9ICh1X2NoYXIpY2ggPDwgMjsKKwkJYmFzZV9hZGRyW0N5TElWUl0gPSAweDVjOworCQliYXNlX2FkZHJbQ3lUQ09SXSA9IGJhdWRfY29bc3BkXTsKKwkJYmFzZV9hZGRyW0N5VEJQUl0gPSBiYXVkX2JwcltzcGRdOworCQliYXNlX2FkZHJbQ3lSQ09SXSA9IGJhdWRfY29bc3BkXSA+PiA1OworCQliYXNlX2FkZHJbQ3lSQlBSXSA9IGJhdWRfYnByW3NwZF07CisJCWJhc2VfYWRkcltDeVNDSFIxXSA9ICdRJyAmIDB4MWY7CisJCWJhc2VfYWRkcltDeVNDSFIyXSA9ICdYJyAmIDB4MWY7CisJCWJhc2VfYWRkcltDeVNDUkxdID0gMDsKKwkJYmFzZV9hZGRyW0N5U0NSSF0gPSAwOworCQliYXNlX2FkZHJbQ3lDT1IxXSA9IEN5XzhfQklUUyB8IEN5UEFSSVRZX05PTkU7CisJCWJhc2VfYWRkcltDeUNPUjJdID0gMDsKKwkJYmFzZV9hZGRyW0N5Q09SM10gPSBDeV8xX1NUT1A7CisJCWJhc2VfYWRkcltDeUNPUjRdID0gYmF1ZF9jb3I0W3NwZF07CisJCWJhc2VfYWRkcltDeUNPUjVdID0gMDsKKwkJYmFzZV9hZGRyW0N5Q09SNl0gPSAwOworCQliYXNlX2FkZHJbQ3lDT1I3XSA9IDA7CisJCWJhc2VfYWRkcltDeVJUUFJMXSA9IDI7CisJCWJhc2VfYWRkcltDeVJUUFJIXSA9IDA7CisJICAgICAgICBiYXNlX2FkZHJbQ3lNU1ZSMV0gPSAwOworCSAgICAgICAgYmFzZV9hZGRyW0N5TVNWUjJdID0gMDsKKwkJd3JpdGVfY3lfY21kKGJhc2VfYWRkcixDeUlOSVRfQ0hBTnxDeURJU19SQ1ZSfEN5RElTX1hNVFIpOworCX0KKworCS8qCisJICogTm93IGRvIHNwZWNpYWxzIGZvciBjaGFubmVsIHplcm8uLi4uCisJICovCisKKyAgICAgICAgYmFzZV9hZGRyW0N5TVNWUjFdID0gQ3lSVFM7CisgICAgICAgIGJhc2VfYWRkcltDeU1TVlIyXSA9IEN5RFRSOworCWJhc2VfYWRkcltDeUlFUl0gPSBDeVJ4RGF0YTsKKwl3cml0ZV9jeV9jbWQoYmFzZV9hZGRyLEN5RU5CX1JDVlJ8Q3lFTkJfWE1UUik7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlteV91ZGVsYXkoMjAwMDBMKTsJLyogTGV0IGl0IGFsbCBzZXR0bGUgZG93biAqLworCisgICAgICAgIHByaW50aygiQ0QyNDAxIGluaXRpYWxpc2VkLCAgY2hpcCBpcyByZXYgMHglMDJ4XG4iLCBiYXNlX2FkZHJbQ3lHRlJDUl0pOworCWlmIChiYWRzcGVlZCkKKyAgICAgICAgCXByaW50aygiICBXQVJOSU5HOiAgRmFpbGVkIHRvIGlkZW50aWZ5IGxpbmUgc3BlZWQsIHJjb3I9JTAyeCxyYnByPSUwMnhcbiIsCisJCQkJCXJjb3IgPj4gNSwgcmJwcik7Cit9IC8qIHNlcmlhbF9jb25zb2xlX2luaXQgKi8KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBjeV9vcHMgPSB7CisJLm9wZW4gPSBjeV9vcGVuLAorCS5jbG9zZSA9IGN5X2Nsb3NlLAorCS53cml0ZSA9IGN5X3dyaXRlLAorCS5wdXRfY2hhciA9IGN5X3B1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IGN5X2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gY3lfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gY3lfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSBjeV9mbHVzaF9idWZmZXIsCisJLmlvY3RsID0gY3lfaW9jdGwsCisJLnRocm90dGxlID0gY3lfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSBjeV91bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IGN5X3NldF90ZXJtaW9zLAorCS5zdG9wID0gY3lfc3RvcCwKKwkuc3RhcnQgPSBjeV9zdGFydCwKKwkuaGFuZ3VwID0gY3lfaGFuZ3VwLAorCS50aW9jbWdldCA9IGN5X3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9IGN5X3Rpb2Ntc2V0LAorfTsKKy8qIFRoZSBzZXJpYWwgZHJpdmVyIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBjb2RlIQorICAgIEhhcmR3YXJlIEkvTyBwb3J0cyBhcmUgbWFwcGVkIHRvIGNoYXJhY3RlciBzcGVjaWFsIGRldmljZXMgb24gYQorICAgIGZpcnN0IGZvdW5kLCBmaXJzdCBhbGxvY2F0ZWQgbWFubmVyLiAgVGhhdCBpcywgdGhpcyBjb2RlIHNlYXJjaGVzCisgICAgZm9yIEN5Y2xvbSBjYXJkcyBpbiB0aGUgc3lzdGVtLiAgQXMgZWFjaCBpcyBmb3VuZCwgaXQgaXMgcHJvYmVkCisgICAgdG8gZGlzY292ZXIgaG93IG1hbnkgY2hpcHMgKGFuZCB0aHVzIGhvdyBtYW55IHBvcnRzKSBhcmUgcHJlc2VudC4KKyAgICBUaGVzZSBwb3J0cyBhcmUgbWFwcGVkIHRvIHRoZSB0dHkgcG9ydHMgNjQgYW5kIHVwd2FyZCBpbiBtb25vdG9uaWMKKyAgICBmYXNoaW9uLiAgSWYgYW4gOC1wb3J0IGNhcmQgaXMgcmVwbGFjZWQgd2l0aCBhIDE2LXBvcnQgY2FyZCwgdGhlCisgICAgcG9ydCBtYXBwaW5nIG9uIGEgZm9sbG93aW5nIGNhcmQgd2lsbCBzaGlmdC4KKworICAgIFRoaXMgYXBwcm9hY2ggaXMgZGlmZmVyZW50IGZyb20gd2hhdCBpcyB1c2VkIGluIHRoZSBvdGhlciBzZXJpYWwKKyAgICBkZXZpY2UgZHJpdmVyIGJlY2F1c2UgdGhlIEN5Y2xvbSBpcyBtb3JlIHByb3Blcmx5IGEgbXVsdGlwbGV4ZXIsCisgICAgbm90IGp1c3QgYW4gYWdncmVnYXRpb24gb2Ygc2VyaWFsIHBvcnRzIG9uIG9uZSBjYXJkLgorCisgICAgSWYgdGhlcmUgYXJlIG1vcmUgY2FyZHMgd2l0aCBtb3JlIHBvcnRzIHRoYW4gaGF2ZSBiZWVuIHN0YXRpY2FsbHkKKyAgICBhbGxvY2F0ZWQgYWJvdmUsIGEgd2FybmluZyBpcyBwcmludGVkIGFuZCB0aGUgZXh0cmEgcG9ydHMgYXJlIGlnbm9yZWQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CitzZXJpYWwxNjdfaW5pdCh2b2lkKQoreworICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbzsKKyAgaW50IHJldCA9IDA7CisgIGludCBnb29kX3BvcnRzID0gMDsKKyAgaW50IHBvcnRfbnVtID0gMDsKKyAgaW50IGluZGV4OworICBpbnQgRGVmU3BlZWQ7CisjaWZkZWYgbm90eWV0CisgIHN0cnVjdCBzaWdhY3Rpb24gc2E7CisjZW5kaWYKKworICAgIGlmICghKG12bWUxNnhfY29uZmlnICZNVk1FMTZ4X0NPTkZJR19HT1RfQ0QyNDAxKSkKKwlyZXR1cm4gMDsKKworICAgIGN5X3NlcmlhbF9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE5SX1BPUlRTKTsKKyAgICBpZiAoIWN5X3NlcmlhbF9kcml2ZXIpCisJcmV0dXJuIC1FTk9NRU07CisKKyNpZiAwCitzY3JuWzFdID0gJ1wwJzsKKyNlbmRpZgorCisgICAgc2hvd192ZXJzaW9uKCk7CisKKyAgICAvKiBIYXMgImNvbnNvbGU9MCw5NjAwbjgiIGJlZW4gdXNlZCBpbiBib290aW5mbyB0byBjaGFuZ2Ugc3BlZWQ/ICovCisgICAgaWYgKHNlcmlhbF9jb25zb2xlX2NmbGFnKQorCURlZlNwZWVkID0gc2VyaWFsX2NvbnNvbGVfY2ZsYWcgJiAwMDE3OworICAgIGVsc2UgeworCURlZlNwZWVkID0gaW5pdGlhbF9jb25zb2xlX3NwZWVkOworCXNlcmlhbF9jb25zb2xlX2luZm8gPSAmY3lfcG9ydFswXTsKKwlzZXJpYWxfY29uc29sZV9jZmxhZyA9IERlZlNwZWVkIHwgQ1M4OworI2lmIDAKKwlzZXJpYWxfY29uc29sZSA9IDY0OyAvKmNhbGxvdXRfZHJpdmVyLm1pbm9yX3N0YXJ0Ki8KKyNlbmRpZgorICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCisgICAgCisgICAgY3lfc2VyaWFsX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKyAgICBjeV9zZXJpYWxfZHJpdmVyLT5kZXZmc19uYW1lID0gInR0cy8iOworICAgIGN5X3NlcmlhbF9kcml2ZXItPm5hbWUgPSAidHR5UyI7CisgICAgY3lfc2VyaWFsX2RyaXZlci0+bWFqb3IgPSBUVFlfTUFKT1I7CisgICAgY3lfc2VyaWFsX2RyaXZlci0+bWlub3Jfc3RhcnQgPSA2NDsKKyAgICBjeV9zZXJpYWxfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKyAgICBjeV9zZXJpYWxfZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworICAgIGN5X3NlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKyAgICBjeV9zZXJpYWxfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9CisJICAgIEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKyAgICBjeV9zZXJpYWxfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisgICAgdHR5X3NldF9vcGVyYXRpb25zKGN5X3NlcmlhbF9kcml2ZXIsICZjeV9vcHMpOworCisgICAgcmV0ID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihjeV9zZXJpYWxfZHJpdmVyKTsKKyAgICBpZiAocmV0KSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgcmVnaXN0ZXIgTVZNRTE2Ni83IHNlcmlhbCBkcml2ZXJcbiIpOworCSAgICBwdXRfdHR5X2RyaXZlcihjeV9zZXJpYWxfZHJpdmVyKTsKKwkgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwb3J0X251bSA9IDA7CisgICAgaW5mbyA9IGN5X3BvcnQ7CisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMTsgaW5kZXgrKykgeworCisJZ29vZF9wb3J0cyA9IDQ7CisKKwlpZihwb3J0X251bSA8IE5SX1BPUlRTKXsKKwkgICAgd2hpbGUoIGdvb2RfcG9ydHMtLSAmJiBwb3J0X251bSA8IE5SX1BPUlRTKXsKKwkJLyoqKiBpbml0aWFsaXplIHBvcnQgKioqLworCQlpbmZvLT5tYWdpYyA9IENZQ0xBREVTX01BR0lDOworCQlpbmZvLT50eXBlID0gUE9SVF9DSVJSVVM7CisJCWluZm8tPmNhcmQgPSBpbmRleDsKKwkJaW5mby0+bGluZSA9IHBvcnRfbnVtOworCQlpbmZvLT5mbGFncyA9IFNURF9DT01fRkxBR1M7CisJCWluZm8tPnR0eSA9IDA7CisJCWluZm8tPnhtaXRfZmlmb19zaXplID0gMTI7CisJCWluZm8tPmNvcjEgPSBDeVBBUklUWV9OT05FfEN5XzhfQklUUzsKKwkJaW5mby0+Y29yMiA9IEN5RVRDOworCQlpbmZvLT5jb3IzID0gQ3lfMV9TVE9QOworCQlpbmZvLT5jb3I0ID0gMHgwODsgLyogX3ZlcnlfIHNtYWxsIHJlY2VpdmUgdGhyZXNob2xkICovCisJCWluZm8tPmNvcjUgPSAwOworCQlpbmZvLT5jb3I2ID0gMDsKKwkJaW5mby0+Y29yNyA9IDA7CisJCWluZm8tPnRicHIgPSBiYXVkX2JwcltEZWZTcGVlZF07IC8qIFR4IEJQUiAqLworCQlpbmZvLT50Y28gPSBiYXVkX2NvW0RlZlNwZWVkXTsgLyogVHggQ08gKi8KKwkJaW5mby0+cmJwciA9IGJhdWRfYnByW0RlZlNwZWVkXTsgLyogUnggQlBSICovCisJCWluZm8tPnJjbyA9IGJhdWRfY29bRGVmU3BlZWRdID4+IDU7IC8qIFJ4IENPICovCisJCWluZm8tPmNsb3NlX2RlbGF5ID0gMDsKKwkJaW5mby0+eF9jaGFyID0gMDsKKwkJaW5mby0+ZXZlbnQgPSAwOworCQlpbmZvLT5jb3VudCA9IDA7CisjaWZkZWYgU0VSSUFMX0RFQlVHX0NPVU5UCisgICAgcHJpbnRrKCJjeWM6ICVkOiBzZXR0aW5nIGNvdW50IHRvIDBcbiIsIF9fTElORV9fKTsKKyNlbmRpZgorCQlpbmZvLT5ibG9ja2VkX29wZW4gPSAwOworCQlpbmZvLT5kZWZhdWx0X3RocmVzaG9sZCA9IDA7CisJCWluZm8tPmRlZmF1bHRfdGltZW91dCA9IDA7CisJCUlOSVRfV09SSygmaW5mby0+dHF1ZXVlLCBkb19zb2Z0aW50LCBpbmZvKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+b3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCS8qIGluZm8tPnNlc3Npb24gKi8KKwkJLyogaW5mby0+cGdycCAqLworLyoqKiAhISEhISEhISB0aGlzIG1heSBleHBvc2UgbmV3IGJ1Z3MgISEhISEhISEhICoqKioqKioqKi8KKwkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IEN5VElNRU9VVHwgQ3lTUEVDSEFSfCBDeUJSRUFLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEN5UEFSSVRZfCBDeUZSQU1FfCBDeU9WRVJSVU47CisJCS8qIGluZm8tPnRpbWVvdXQgKi8KKworCQlwcmludGsoInR0eVMlZCAiLCBpbmZvLT5saW5lKTsKKwkJcG9ydF9udW0rKztpbmZvKys7CisJCWlmKCEocG9ydF9udW0gJiA3KSl7CisJCSAgICBwcmludGsoIlxuICAgICAgICAgICAgICAgIik7CisJCX0KKwkgICAgfQorCX0KKwlwcmludGsoIlxuIik7CisgICAgfQorICAgIHdoaWxlKCBwb3J0X251bSA8IE5SX1BPUlRTKXsKKwlpbmZvLT5saW5lID0gLTE7CisJcG9ydF9udW0rKztpbmZvKys7CisgICAgfQorI2lmZGVmIENPTkZJR19SRU1PVEVfREVCVUcKKyAgICBkZWJ1Z19zZXR1cCgpOworI2VuZGlmCisgICAgcmV0ID0gcmVxdWVzdF9pcnEoTVZNRTE2N19JUlFfU0VSX0VSUiwgY2QyNDAxX3J4ZXJyX2ludGVycnVwdCwgMCwKKwkJCQkiY2QyNDAxX2Vycm9ycyIsIGNkMjQwMV9yeGVycl9pbnRlcnJ1cHQpOworICAgIGlmIChyZXQpIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJDb3VsZCd0IGdldCBjZDI0MDFfZXJyb3JzIElSUSIpOworCSAgICBnb3RvIGNsZWFudXBfc2VyaWFsX2RyaXZlcjsKKyAgICB9CisKKyAgICByZXQgPSByZXF1ZXN0X2lycShNVk1FMTY3X0lSUV9TRVJfTU9ERU0sIGNkMjQwMV9tb2RlbV9pbnRlcnJ1cHQsIDAsCisJCQkJImNkMjQwMV9tb2RlbSIsIGNkMjQwMV9tb2RlbV9pbnRlcnJ1cHQpOworICAgIGlmIChyZXQpIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJDb3VsZCd0IGdldCBjZDI0MDFfbW9kZW0gSVJRIik7CisJICAgIGdvdG8gY2xlYW51cF9pcnFfY2QyNDAxX2Vycm9yczsKKyAgICB9CisKKyAgICByZXQgPSByZXF1ZXN0X2lycShNVk1FMTY3X0lSUV9TRVJfVFgsIGNkMjQwMV90eF9pbnRlcnJ1cHQsIDAsCisJCQkJImNkMjQwMV90eGludHMiLCBjZDI0MDFfdHhfaW50ZXJydXB0KTsKKyAgICBpZiAocmV0KSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAiQ291bGQndCBnZXQgY2QyNDAxX3R4aW50cyBJUlEiKTsKKwkgICAgZ290byBjbGVhbnVwX2lycV9jZDI0MDFfbW9kZW07CisgICAgfQorCisgICAgcmV0ID0gcmVxdWVzdF9pcnEoTVZNRTE2N19JUlFfU0VSX1JYLCBjZDI0MDFfcnhfaW50ZXJydXB0LCAwLAorCQkJCSJjZDI0MDFfcnhpbnRzIiwgY2QyNDAxX3J4X2ludGVycnVwdCk7CisgICAgaWYgKHJldCkgeworCSAgICBwcmludGsoS0VSTl9FUlIgIkNvdWxkJ3QgZ2V0IGNkMjQwMV9yeGludHMgSVJRIik7CisJICAgIGdvdG8gY2xlYW51cF9pcnFfY2QyNDAxX3R4aW50czsKKyAgICB9CisKKyAgICAvKiBOb3cgd2UgaGF2ZSByZWdpc3RlcmVkIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcnMsIGFsbG93IHRoZSBpbnRlcnJ1cHRzICovCisKKyAgICBwY2MyY2hpcFtQY2NTQ0NNSUNSXSA9IDB4MTU7CQkvKiBTZXJpYWwgaW50cyBhcmUgbGV2ZWwgNSAqLworICAgIHBjYzJjaGlwW1BjY1NDQ1RJQ1JdID0gMHgxNTsKKyAgICBwY2MyY2hpcFtQY2NTQ0NSSUNSXSA9IDB4MTU7CisKKyAgICBwY2MyY2hpcFtQY2NJTUxSXSA9IDM7CQkJLyogQWxsb3cgUENDMiBpbnRzIGFib3ZlIDMhPyAqLworCisgICAgcmV0dXJuIDA7CitjbGVhbnVwX2lycV9jZDI0MDFfdHhpbnRzOgorICAgIGZyZWVfaXJxKE1WTUUxNjdfSVJRX1NFUl9UWCwgY2QyNDAxX3R4X2ludGVycnVwdCk7CitjbGVhbnVwX2lycV9jZDI0MDFfbW9kZW06CisgICAgZnJlZV9pcnEoTVZNRTE2N19JUlFfU0VSX01PREVNLCBjZDI0MDFfbW9kZW1faW50ZXJydXB0KTsKK2NsZWFudXBfaXJxX2NkMjQwMV9lcnJvcnM6CisgICAgZnJlZV9pcnEoTVZNRTE2N19JUlFfU0VSX0VSUiwgY2QyNDAxX3J4ZXJyX2ludGVycnVwdCk7CitjbGVhbnVwX3NlcmlhbF9kcml2ZXI6CisgICAgaWYgKHR0eV91bnJlZ2lzdGVyX2RyaXZlcihjeV9zZXJpYWxfZHJpdmVyKSkKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCB1bnJlZ2lzdGVyIE1WTUUxNjYvNyBzZXJpYWwgZHJpdmVyXG4iKTsKKyAgICBwdXRfdHR5X2RyaXZlcihjeV9zZXJpYWxfZHJpdmVyKTsKKyAgICByZXR1cm4gcmV0OworfSAvKiBzZXJpYWwxNjdfaW5pdCAqLworCittb2R1bGVfaW5pdChzZXJpYWwxNjdfaW5pdCk7CisKKworI2lmZGVmIENZQ0xPTV9TSE9XX1NUQVRVUworc3RhdGljIHZvaWQKK3Nob3dfc3RhdHVzKGludCBsaW5lX251bSkKK3sKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKKyAgaW50IGNoYW5uZWw7CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbzsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGluZm8gPSAmY3lfcG9ydFtsaW5lX251bV07CisgICAgY2hhbm5lbCA9IGluZm8tPmxpbmU7CisgICAgcHJpbnRrKCIgIGNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOy8qKi8KKworICAgIHByaW50aygiIGN5X3BvcnRcbiIpOworICAgIHByaW50aygiICBjYXJkIGxpbmUgZmxhZ3MgPSAlZCAlZCAleFxuIiwKKyAgICAgICAgICAgICAgICAgaW5mby0+Y2FyZCwgaW5mby0+bGluZSwgaW5mby0+ZmxhZ3MpOworICAgIHByaW50aygiICAqdHR5IHJlYWRfc3RhdHVzX21hc2sgdGltZW91dCB4bWl0X2ZpZm9fc2l6ZSA9ICVseCAleCAleCAleFxuIiwKKyAgICAgICAgICAgICAgICAgKGxvbmcpaW5mby0+dHR5LCBpbmZvLT5yZWFkX3N0YXR1c19tYXNrLAorICAgICAgICAgICAgICAgICBpbmZvLT50aW1lb3V0LCBpbmZvLT54bWl0X2ZpZm9fc2l6ZSk7CisgICAgcHJpbnRrKCIgIGNvcjEsY29yMixjb3IzLGNvcjQsY29yNSxjb3I2LGNvcjcgPSAleCAleCAleCAleCAleCAleCAleFxuIiwKKyAgICAgICAgICAgICBpbmZvLT5jb3IxLCBpbmZvLT5jb3IyLCBpbmZvLT5jb3IzLCBpbmZvLT5jb3I0LCBpbmZvLT5jb3I1LAorCQkJaW5mby0+Y29yNiwgaW5mby0+Y29yNyk7CisgICAgcHJpbnRrKCIgIHRicHIsdGNvLHJicHIscmNvID0gJWQgJWQgJWQgJWRcbiIsCisgICAgICAgICAgICAgaW5mby0+dGJwciwgaW5mby0+dGNvLCBpbmZvLT5yYnByLCBpbmZvLT5yY28pOworICAgIHByaW50aygiICBjbG9zZV9kZWxheSBldmVudCBjb3VudCA9ICVkICVkICVkXG4iLAorICAgICAgICAgICAgIGluZm8tPmNsb3NlX2RlbGF5LCBpbmZvLT5ldmVudCwgaW5mby0+Y291bnQpOworICAgIHByaW50aygiICB4X2NoYXIgYmxvY2tlZF9vcGVuID0gJXggJXhcbiIsCisgICAgICAgICAgICAgaW5mby0+eF9jaGFyLCBpbmZvLT5ibG9ja2VkX29wZW4pOworICAgIHByaW50aygiICBvcGVuX3dhaXQgPSAlbHggJWx4ICVseFxuIiwKKyAgICAgICAgICAgICAobG9uZylpbmZvLT5vcGVuX3dhaXQpOworCisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKy8qIEdsb2JhbCBSZWdpc3RlcnMgKi8KKworCXByaW50aygiIEN5R0ZSQ1IgJXhcbiIsIGJhc2VfYWRkcltDeUdGUkNSXSk7CisJcHJpbnRrKCIgQ3lDQVIgJXhcbiIsIGJhc2VfYWRkcltDeUNBUl0pOworCXByaW50aygiIEN5UklTUiAleFxuIiwgYmFzZV9hZGRyW0N5UklTUl0pOworCXByaW50aygiIEN5VElTUiAleFxuIiwgYmFzZV9hZGRyW0N5VElTUl0pOworCXByaW50aygiIEN5TUlTUiAleFxuIiwgYmFzZV9hZGRyW0N5TUlTUl0pOworCXByaW50aygiIEN5UklSICV4XG4iLCBiYXNlX2FkZHJbQ3lSSVJdKTsKKwlwcmludGsoIiBDeVRJUiAleFxuIiwgYmFzZV9hZGRyW0N5VElSXSk7CisJcHJpbnRrKCIgQ3lNSVIgJXhcbiIsIGJhc2VfYWRkcltDeU1JUl0pOworCXByaW50aygiIEN5VFBSICV4XG4iLCBiYXNlX2FkZHJbQ3lUUFJdKTsKKworCWJhc2VfYWRkcltDeUNBUl0gPSAodV9jaGFyKWNoYW5uZWw7CisKKy8qIFZpcnR1YWwgUmVnaXN0ZXJzICovCisKKyNpZiAwCisJcHJpbnRrKCIgQ3lSSVZSICV4XG4iLCBiYXNlX2FkZHJbQ3lSSVZSXSk7CisJcHJpbnRrKCIgQ3lUSVZSICV4XG4iLCBiYXNlX2FkZHJbQ3lUSVZSXSk7CisJcHJpbnRrKCIgQ3lNSVZSICV4XG4iLCBiYXNlX2FkZHJbQ3lNSVZSXSk7CisJcHJpbnRrKCIgQ3lNSVNSICV4XG4iLCBiYXNlX2FkZHJbQ3lNSVNSXSk7CisjZW5kaWYKKworLyogQ2hhbm5lbCBSZWdpc3RlcnMgKi8KKworCXByaW50aygiIEN5Q0NSICV4XG4iLCBiYXNlX2FkZHJbQ3lDQ1JdKTsKKwlwcmludGsoIiBDeUlFUiAleFxuIiwgYmFzZV9hZGRyW0N5SUVSXSk7CisJcHJpbnRrKCIgQ3lDT1IxICV4XG4iLCBiYXNlX2FkZHJbQ3lDT1IxXSk7CisJcHJpbnRrKCIgQ3lDT1IyICV4XG4iLCBiYXNlX2FkZHJbQ3lDT1IyXSk7CisJcHJpbnRrKCIgQ3lDT1IzICV4XG4iLCBiYXNlX2FkZHJbQ3lDT1IzXSk7CisJcHJpbnRrKCIgQ3lDT1I0ICV4XG4iLCBiYXNlX2FkZHJbQ3lDT1I0XSk7CisJcHJpbnRrKCIgQ3lDT1I1ICV4XG4iLCBiYXNlX2FkZHJbQ3lDT1I1XSk7CisjaWYgMAorCXByaW50aygiIEN5Q0NTUiAleFxuIiwgYmFzZV9hZGRyW0N5Q0NTUl0pOworCXByaW50aygiIEN5UkRDUiAleFxuIiwgYmFzZV9hZGRyW0N5UkRDUl0pOworI2VuZGlmCisJcHJpbnRrKCIgQ3lTQ0hSMSAleFxuIiwgYmFzZV9hZGRyW0N5U0NIUjFdKTsKKwlwcmludGsoIiBDeVNDSFIyICV4XG4iLCBiYXNlX2FkZHJbQ3lTQ0hSMl0pOworI2lmIDAKKwlwcmludGsoIiBDeVNDSFIzICV4XG4iLCBiYXNlX2FkZHJbQ3lTQ0hSM10pOworCXByaW50aygiIEN5U0NIUjQgJXhcbiIsIGJhc2VfYWRkcltDeVNDSFI0XSk7CisJcHJpbnRrKCIgQ3lTQ1JMICV4XG4iLCBiYXNlX2FkZHJbQ3lTQ1JMXSk7CisJcHJpbnRrKCIgQ3lTQ1JIICV4XG4iLCBiYXNlX2FkZHJbQ3lTQ1JIXSk7CisJcHJpbnRrKCIgQ3lMTkMgJXhcbiIsIGJhc2VfYWRkcltDeUxOQ10pOworCXByaW50aygiIEN5TUNPUjEgJXhcbiIsIGJhc2VfYWRkcltDeU1DT1IxXSk7CisJcHJpbnRrKCIgQ3lNQ09SMiAleFxuIiwgYmFzZV9hZGRyW0N5TUNPUjJdKTsKKyNlbmRpZgorCXByaW50aygiIEN5UlRQUkwgJXhcbiIsIGJhc2VfYWRkcltDeVJUUFJMXSk7CisJcHJpbnRrKCIgQ3lSVFBSSCAleFxuIiwgYmFzZV9hZGRyW0N5UlRQUkhdKTsKKwlwcmludGsoIiBDeU1TVlIxICV4XG4iLCBiYXNlX2FkZHJbQ3lNU1ZSMV0pOworCXByaW50aygiIEN5TVNWUjIgJXhcbiIsIGJhc2VfYWRkcltDeU1TVlIyXSk7CisJcHJpbnRrKCIgQ3lSQlBSICV4XG4iLCBiYXNlX2FkZHJbQ3lSQlBSXSk7CisJcHJpbnRrKCIgQ3lSQ09SICV4XG4iLCBiYXNlX2FkZHJbQ3lSQ09SXSk7CisJcHJpbnRrKCIgQ3lUQlBSICV4XG4iLCBiYXNlX2FkZHJbQ3lUQlBSXSk7CisJcHJpbnRrKCIgQ3lUQ09SICV4XG4iLCBiYXNlX2FkZHJbQ3lUQ09SXSk7CisKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9IC8qIHNob3dfc3RhdHVzICovCisjZW5kaWYKKworCisjaWYgMAorLyogRHVtbXkgcm91dGluZSBpbiBtdm1lMTZ4L2NvbmZpZy5jIGZvciBub3cgKi8KKworLyogU2VyaWFsIGNvbnNvbGUgc2V0dXAuIENhbGxlZCBmcm9tIGxpbnV4L2luaXQvbWFpbi5jICovCisKK3ZvaWQgY29uc29sZV9zZXR1cChjaGFyICpzdHIsIGludCAqaW50cykKK3sKKwljaGFyICpzOworCWludCBiYXVkLCBiaXRzLCBwYXJpdHk7CisJaW50IGNmbGFnID0gMDsKKworCS8qIFNhbml0eSBjaGVjay4gKi8KKwlpZiAoaW50c1swXSA+IDMgfHwgaW50c1sxXSA+IDMpIHJldHVybjsKKworCS8qIEdldCBiYXVkLCBiaXRzIGFuZCBwYXJpdHkgKi8KKwliYXVkID0gMjQwMDsKKwliaXRzID0gODsKKwlwYXJpdHkgPSAnbic7CisJaWYgKGludHNbMl0pIGJhdWQgPSBpbnRzWzJdOworCWlmICgocyA9IHN0cmNocihzdHIsICcsJykpKSB7CisJCWRvIHsKKwkJCXMrKzsKKwkJfSB3aGlsZSgqcyA+PSAnMCcgJiYgKnMgPD0gJzknKTsKKwkJaWYgKCpzKSBwYXJpdHkgPSAqcysrOworCQlpZiAoKnMpIGJpdHMgICA9ICpzIC0gJzAnOworCX0KKworCS8qIE5vdyBjb25zdHJ1Y3QgYSBjZmxhZyBzZXR0aW5nLiAqLworCXN3aXRjaChiYXVkKSB7CisJCWNhc2UgMTIwMDoKKwkJCWNmbGFnIHw9IEIxMjAwOworCQkJYnJlYWs7CisJCWNhc2UgOTYwMDoKKwkJCWNmbGFnIHw9IEI5NjAwOworCQkJYnJlYWs7CisJCWNhc2UgMTkyMDA6CisJCQljZmxhZyB8PSBCMTkyMDA7CisJCQlicmVhazsKKwkJY2FzZSAzODQwMDoKKwkJCWNmbGFnIHw9IEIzODQwMDsKKwkJCWJyZWFrOworCQljYXNlIDI0MDA6CisJCWRlZmF1bHQ6CisJCQljZmxhZyB8PSBCMjQwMDsKKwkJCWJyZWFrOworCX0KKwlzd2l0Y2goYml0cykgeworCQljYXNlIDc6CisJCQljZmxhZyB8PSBDUzc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSA4OgorCQkJY2ZsYWcgfD0gQ1M4OworCQkJYnJlYWs7CisJfQorCXN3aXRjaChwYXJpdHkpIHsKKwkJY2FzZSAnbyc6IGNhc2UgJ08nOgorCQkJY2ZsYWcgfD0gUEFST0REOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOiBjYXNlICdFJzoKKwkJCWNmbGFnIHw9IFBBUkVOQjsKKwkJCWJyZWFrOworCX0KKworCXNlcmlhbF9jb25zb2xlX2luZm8gPSAmY3lfcG9ydFtpbnRzWzFdXTsKKwlzZXJpYWxfY29uc29sZV9jZmxhZyA9IGNmbGFnOworCXNlcmlhbF9jb25zb2xlID0gaW50c1sxXSArIDY0OyAvKmNhbGxvdXRfZHJpdmVyLm1pbm9yX3N0YXJ0Ki8KK30KKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyBpcyBwcm9iYWJseSBvdXQgb2YgZGF0ZSBmb3IgMi4xLnggc2VyaWFsIGNvbnNvbGUgc3R1ZmYuCisgKgorICogVGhlIGNvbnNvbGUgaXMgcmVnaXN0ZXJlZCBlYXJseSBvbiBmcm9tIGFyY2gvbTY4ay9rZXJuZWwvc2V0dXAuYywgYW5kCisgKiBpdCB0aGVyZWZvcmUgcmVsaWVzIG9uIHRoZSBjaGlwIGJlaW5nIHNldHVwIGNvcnJlY3RseSBieSAxNjYtQnVnLiAgVGhpcworICogc2VlbXMgcmVhc29uYWJsZSwgYXMgdGhlIHNlcmlhbCBwb3J0IGhhcyBiZWVuIHVzZWQgdG8gaW52b2tlIHRoZSBzeXN0ZW0KKyAqIGJvb3QuICBJdCBhbHNvIG1lYW5zIHRoYXQgdGhpcyBmdW5jdGlvbiBtdXN0IG5vdCByZWx5IG9uIGFueSBkYXRhCisgKiBpbml0aWFsaXNhdGlvbiBwZXJmb3JtZWQgYnkgc2VyaWFsMTY3X2luaXQoKSBldGMuCisgKgorICogT2YgY291cnNlLCBvbmNlIHRoZSBjb25zb2xlIGhhcyBiZWVuIHJlZ2lzdGVyZWQsIHdlIGhhZCBiZXR0ZXIgZW5zdXJlCisgKiB0aGF0IHNlcmlhbDE2N19pbml0KCkgZG9lc24ndCBsZWF2ZSB0aGUgY2hpcCBub24tZnVuY3Rpb25hbC4KKyAqCisgKiBUaGUgY29uc29sZSBtdXN0IGJlIGxvY2tlZCB3aGVuIHdlIGdldCBoZXJlLgorICovCisKK3ZvaWQgc2VyaWFsMTY3X2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGNvdW50KQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2xhdGlsZSB1X2NoYXIgc2luazsKKwl1X2NoYXIgaWVyOworCWludCBwb3J0OworCXVfY2hhciBkb19sZiA9IDA7CisJaW50IGkgPSAwOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogRW5zdXJlIHRyYW5zbWl0dGVyIGlzIGVuYWJsZWQhICovCisKKwlwb3J0ID0gMDsKKwliYXNlX2FkZHJbQ3lDQVJdID0gKHVfY2hhcilwb3J0OworCXdoaWxlIChiYXNlX2FkZHJbQ3lDQ1JdKQorCQk7CisJYmFzZV9hZGRyW0N5Q0NSXSA9IEN5RU5CX1hNVFI7CisKKwlpZXIgPSBiYXNlX2FkZHJbQ3lJRVJdOworCWJhc2VfYWRkcltDeUlFUl0gPSBDeVR4TXB0eTsKKworCXdoaWxlICgxKSB7CisJCWlmIChwY2MyY2hpcFtQY2NTQ0NUSUNSXSAmIDB4MjApCisJCXsKKwkJCS8qIFdlIGhhdmUgYSBUeCBpbnQuIEFja25vd2xlZGdlIGl0ICovCisJCQlzaW5rID0gcGNjMmNoaXBbUGNjVFBJQUNLUl07CisJCQlpZiAoKGJhc2VfYWRkcltDeUxJQ1JdID4+IDIpID09IHBvcnQpIHsKKwkJCQlpZiAoaSA9PSBjb3VudCkgeworCQkJCQkvKiBMYXN0IGNoYXIgb2Ygc3RyaW5nIGlzIG5vdyBvdXRwdXQgKi8KKwkJCQkJYmFzZV9hZGRyW0N5VEVPSVJdID0gQ3lOT1RSQU5TOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGRvX2xmKSB7CisJCQkJCWJhc2VfYWRkcltDeVREUl0gPSAnXG4nOworCQkJCQlzdHIrKzsKKwkJCQkJaSsrOworCQkJCQlkb19sZiA9IDA7CisJCQkJfQorCQkJCWVsc2UgaWYgKCpzdHIgPT0gJ1xuJykgeworCQkJCQliYXNlX2FkZHJbQ3lURFJdID0gJ1xyJzsKKwkJCQkJZG9fbGYgPSAxOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJYmFzZV9hZGRyW0N5VERSXSA9ICpzdHIrKzsKKwkJCQkJaSsrOworCQkJCX0KKwkJCQliYXNlX2FkZHJbQ3lURU9JUl0gPSAwOworCQkJfQorCQkJZWxzZQorCQkJCWJhc2VfYWRkcltDeVRFT0lSXSA9IEN5Tk9UUkFOUzsKKwkJfQorCX0KKworCWJhc2VfYWRkcltDeUlFUl0gPSBpZXI7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsMTY3X2NvbnNvbGVfZGV2aWNlKHN0cnVjdCBjb25zb2xlICpjLCBpbnQgKmluZGV4KQoreworCSppbmRleCA9IGMtPmluZGV4OworCXJldHVybiBjeV9zZXJpYWxfZHJpdmVyOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHNlcmlhbDE2N19jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGNvbnNvbGUgc2VyY29ucyA9IHsKKwkubmFtZQkJPSAidHR5UyIsCisJLndyaXRlCQk9IHNlcmlhbDE2N19jb25zb2xlX3dyaXRlLAorCS5kZXZpY2UJCT0gc2VyaWFsMTY3X2NvbnNvbGVfZGV2aWNlLAorCS5zZXR1cAkJPSBzZXJpYWwxNjdfY29uc29sZV9zZXR1cCwKKwkuZmxhZ3MJCT0gQ09OX1BSSU5UQlVGRkVSLAorCS5pbmRleAkJPSAtMSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgc2VyaWFsMTY3X2NvbnNvbGVfaW5pdCh2b2lkKQoreworCWlmICh2bWVfYnJkdHlwZSA9PSBWTUVfVFlQRV9NVk1FMTY2IHx8CisJCQl2bWVfYnJkdHlwZSA9PSBWTUVfVFlQRV9NVk1FMTY3IHx8CisJCQl2bWVfYnJkdHlwZSA9PSBWTUVfVFlQRV9NVk1FMTc3KSB7CisJCW12bWUxNjdfc2VyaWFsX2NvbnNvbGVfc2V0dXAoMCk7CisJCXJlZ2lzdGVyX2NvbnNvbGUoJnNlcmNvbnMpOworCX0KKwlyZXR1cm4gMDsKK30KK2NvbnNvbGVfaW5pdGNhbGwoc2VyaWFsMTY3X2NvbnNvbGVfaW5pdCk7CisKKyNpZmRlZiBDT05GSUdfUkVNT1RFX0RFQlVHCit2b2lkIHB1dERlYnVnQ2hhciAoaW50IGMpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvbGF0aWxlIHVfY2hhciBzaW5rOworCXVfY2hhciBpZXI7CisJaW50IHBvcnQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBFbnN1cmUgdHJhbnNtaXR0ZXIgaXMgZW5hYmxlZCEgKi8KKworCXBvcnQgPSBERUJVR19QT1JUOworCWJhc2VfYWRkcltDeUNBUl0gPSAodV9jaGFyKXBvcnQ7CisJd2hpbGUgKGJhc2VfYWRkcltDeUNDUl0pCisJCTsKKwliYXNlX2FkZHJbQ3lDQ1JdID0gQ3lFTkJfWE1UUjsKKworCWllciA9IGJhc2VfYWRkcltDeUlFUl07CisJYmFzZV9hZGRyW0N5SUVSXSA9IEN5VHhNcHR5OworCisJd2hpbGUgKDEpIHsKKwkJaWYgKHBjYzJjaGlwW1BjY1NDQ1RJQ1JdICYgMHgyMCkKKwkJeworCQkJLyogV2UgaGF2ZSBhIFR4IGludC4gQWNrbm93bGVkZ2UgaXQgKi8KKwkJCXNpbmsgPSBwY2MyY2hpcFtQY2NUUElBQ0tSXTsKKwkJCWlmICgoYmFzZV9hZGRyW0N5TElDUl0gPj4gMikgPT0gcG9ydCkgeworCQkJCWJhc2VfYWRkcltDeVREUl0gPSBjOworCQkJCWJhc2VfYWRkcltDeVRFT0lSXSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQkJYmFzZV9hZGRyW0N5VEVPSVJdID0gQ3lOT1RSQU5TOworCQl9CisJfQorCisJYmFzZV9hZGRyW0N5SUVSXSA9IGllcjsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworaW50IGdldERlYnVnQ2hhcigpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvbGF0aWxlIHVfY2hhciBzaW5rOworCXVfY2hhciBpZXI7CisJaW50IHBvcnQ7CisJaW50IGksIGM7CisKKwlpID0gZGVidWdpcS5vdXQ7CisJaWYgKGkgIT0gZGVidWdpcS5pbikgeworCQljID0gZGVidWdpcS5idWZbaV07CisJCWlmICgrK2kgPT0gREVCVUdfTEVOKQorCQkJaSA9IDA7CisJCWRlYnVnaXEub3V0ID0gaTsKKwkJcmV0dXJuIGM7CisJfQorCS8qIE9LLCBub3RoaW5nIGluIHF1ZXVlLCB3YWl0IGluIHBvbGwgbG9vcCAqLworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogRW5zdXJlIHJlY2VpdmVyIGlzIGVuYWJsZWQhICovCisKKwlwb3J0ID0gREVCVUdfUE9SVDsKKwliYXNlX2FkZHJbQ3lDQVJdID0gKHVfY2hhcilwb3J0OworI2lmIDAKKwl3aGlsZSAoYmFzZV9hZGRyW0N5Q0NSXSkKKwkJOworCWJhc2VfYWRkcltDeUNDUl0gPSBDeUVOQl9SQ1ZSOworI2VuZGlmCisJaWVyID0gYmFzZV9hZGRyW0N5SUVSXTsKKwliYXNlX2FkZHJbQ3lJRVJdID0gQ3lSeERhdGE7CisKKwl3aGlsZSAoMSkgeworCQlpZiAocGNjMmNoaXBbUGNjU0NDUklDUl0gJiAweDIwKQorCQl7CisJCQkvKiBXZSBoYXZlIGEgUnggaW50LiBBY2tub3dsZWRnZSBpdCAqLworCQkJc2luayA9IHBjYzJjaGlwW1BjY1JQSUFDS1JdOworCQkJaWYgKChiYXNlX2FkZHJbQ3lMSUNSXSA+PiAyKSA9PSBwb3J0KSB7CisJCQkJaW50IGNudCA9IGJhc2VfYWRkcltDeVJGT0NdOworCQkJCXdoaWxlIChjbnQtLSA+IDApCisJCQkJeworCQkJCQljID0gYmFzZV9hZGRyW0N5UkRSXTsKKwkJCQkJaWYgKGMgPT0gMCkKKwkJCQkJCXByaW50ayAoIiEhIGRlYnVnIGNoYXIgaXMgbnVsbCAoY250PSVkKSAhISIsIGNudCk7CisJCQkJCWVsc2UKKwkJCQkJCXF1ZXVlRGVidWdDaGFyIChjKTsKKwkJCQl9CisJCQkJYmFzZV9hZGRyW0N5UkVPSVJdID0gMDsKKwkJCQlpID0gZGVidWdpcS5vdXQ7CisJCQkJaWYgKGkgPT0gZGVidWdpcS5pbikKKwkJCQkJcGFuaWMgKCJEZWJ1ZyBpbnB1dCBxdWV1ZSBlbXB0eSEiKTsKKwkJCQljID0gZGVidWdpcS5idWZbaV07CisJCQkJaWYgKCsraSA9PSBERUJVR19MRU4pCisJCQkJCWkgPSAwOworCQkJCWRlYnVnaXEub3V0ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCQliYXNlX2FkZHJbQ3lSRU9JUl0gPSBDeU5PVFJBTlM7CisJCX0KKwl9CisKKwliYXNlX2FkZHJbQ3lJRVJdID0gaWVyOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIChjKTsKK30KKwordm9pZCBxdWV1ZURlYnVnQ2hhciAoaW50IGMpCit7CisJaW50IGk7CisKKwlpID0gZGVidWdpcS5pbjsKKwlkZWJ1Z2lxLmJ1ZltpXSA9IGM7CisJaWYgKCsraSA9PSBERUJVR19MRU4pCisJCWkgPSAwOworCWlmIChpICE9IGRlYnVnaXEub3V0KQorCQlkZWJ1Z2lxLmluID0gaTsKK30KKworc3RhdGljIHZvaWQKK2RlYnVnX3NldHVwKCkKK3sKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKKyAgaW50ICAgaSwgY2ZsYWc7CisKKyAgICBjZmxhZyA9IEIxOTIwMDsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworCWJhc2VfYWRkcltDeUNBUl0gPSBpOworCWJhc2VfYWRkcltDeUxJQ1JdID0gaSA8PCAyOworICAgIH0KKworICAgIGRlYnVnaXEuaW4gPSBkZWJ1Z2lxLm91dCA9IDA7CisKKyAgICBiYXNlX2FkZHJbQ3lDQVJdID0gREVCVUdfUE9SVDsKKworICAgIC8qIGJhdWQgcmF0ZSAqLworICAgIGkgPSBjZmxhZyAmIENCQVVEOworCisgICAgYmFzZV9hZGRyW0N5SUVSXSA9IDA7CisKKyAgICBiYXNlX2FkZHJbQ3lDTVJdID0gQ3lBU1lOQzsKKyAgICBiYXNlX2FkZHJbQ3lMSUNSXSA9IERFQlVHX1BPUlQgPDwgMjsKKyAgICBiYXNlX2FkZHJbQ3lMSVZSXSA9IDB4NWM7CisKKyAgICAvKiB0eCBhbmQgcnggYmF1ZCByYXRlICovCisKKyAgICBiYXNlX2FkZHJbQ3lUQ09SXSA9IGJhdWRfY29baV07CisgICAgYmFzZV9hZGRyW0N5VEJQUl0gPSBiYXVkX2JwcltpXTsKKyAgICBiYXNlX2FkZHJbQ3lSQ09SXSA9IGJhdWRfY29baV0gPj4gNTsKKyAgICBiYXNlX2FkZHJbQ3lSQlBSXSA9IGJhdWRfYnByW2ldOworCisgICAgLyogc2V0IGxpbmUgY2hhcmFjdGVyaXN0aWNzICBhY2NvcmRpbmcgY29uZmlndXJhdGlvbiAqLworCisgICAgYmFzZV9hZGRyW0N5U0NIUjFdID0gMDsKKyAgICBiYXNlX2FkZHJbQ3lTQ0hSMl0gPSAwOworICAgIGJhc2VfYWRkcltDeVNDUkxdID0gMDsKKyAgICBiYXNlX2FkZHJbQ3lTQ1JIXSA9IDA7CisgICAgYmFzZV9hZGRyW0N5Q09SMV0gPSBDeV84X0JJVFMgfCBDeVBBUklUWV9OT05FOworICAgIGJhc2VfYWRkcltDeUNPUjJdID0gMDsKKyAgICBiYXNlX2FkZHJbQ3lDT1IzXSA9IEN5XzFfU1RPUDsKKyAgICBiYXNlX2FkZHJbQ3lDT1I0XSA9IGJhdWRfY29yNFtpXTsKKyAgICBiYXNlX2FkZHJbQ3lDT1I1XSA9IDA7CisgICAgYmFzZV9hZGRyW0N5Q09SNl0gPSAwOworICAgIGJhc2VfYWRkcltDeUNPUjddID0gMDsKKworICAgIHdyaXRlX2N5X2NtZChiYXNlX2FkZHIsQ3lJTklUX0NIQU4pOworICAgIHdyaXRlX2N5X2NtZChiYXNlX2FkZHIsQ3lFTkJfUkNWUik7CisKKyAgICBiYXNlX2FkZHJbQ3lDQVJdID0gREVCVUdfUE9SVDsgLyogISEhIElzIHRoaXMgbmVlZGVkPyAqLworCisgICAgYmFzZV9hZGRyW0N5UlRQUkxdID0gMjsKKyAgICBiYXNlX2FkZHJbQ3lSVFBSSF0gPSAwOworCisgICAgYmFzZV9hZGRyW0N5TVNWUjFdID0gQ3lSVFM7CisgICAgYmFzZV9hZGRyW0N5TVNWUjJdID0gQ3lEVFI7CisKKyAgICBiYXNlX2FkZHJbQ3lJRVJdID0gQ3lSeERhdGE7CisKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKK30gLyogZGVidWdfc2V0dXAgKi8KKworI2VuZGlmCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zbnNjLmMgYi9kcml2ZXJzL2NoYXIvc25zYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYjkxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc25zYy5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICogU04gUGxhdGZvcm0gc3lzdGVtIGNvbnRyb2xsZXIgY29tbXVuaWNhdGlvbiBzdXBwb3J0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqLworCisvKgorICogU3lzdGVtIGNvbnRyb2xsZXIgY29tbXVuaWNhdGlvbiBkcml2ZXIKKyAqCisgKiBUaGlzIGRyaXZlciBhbGxvd3MgYSB1c2VyIHByb2Nlc3MgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgc3lzdGVtCisgKiBjb250cm9sbGVyIChhLmsuYS4gIklSb3V0ZXIiKSBuZXR3b3JrIGluIGFuIFNHSSBTTiBzeXN0ZW0uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vc24vaW8uaD4KKyNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CisjaW5jbHVkZSA8YXNtL3NuL21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9zbi9nZW8uaD4KKyNpbmNsdWRlIDxhc20vc24vbm9kZXBkYS5oPgorI2luY2x1ZGUgInNuc2MuaCIKKworI2RlZmluZSBTWVNDVExfQkFTRU5BTUUJInNuc2MiCisKKyNkZWZpbmUgU0NEUlZfQlVGU1oJMjA0OAorI2RlZmluZSBTQ0RSVl9USU1FT1VUCTEwMDAKKworc3RhdGljIGlycXJldHVybl90CitzY2Rydl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqc3ViY2hfZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHN1YmNoX2RhdGFfcyAqc2QgPSBzdWJjaF9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YXR1czsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZC0+c2RfcmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJnNkLT5zZF93bG9jayk7CisJc3RhdHVzID0gaWE2NF9zbl9pcnRyX2ludHIoc2QtPnNkX25hc2lkLCBzZC0+c2Rfc3ViY2gpOworCisJaWYgKHN0YXR1cyA+IDApIHsKKwkJaWYgKHN0YXR1cyAmIFNBTF9JUk9VVEVSX0lOVFJfUkVDVikgeworCQkJd2FrZV91cCgmc2QtPnNkX3JxKTsKKwkJfQorCQlpZiAoc3RhdHVzICYgU0FMX0lST1VURVJfSU5UUl9YTUlUKSB7CisJCQlpYTY0X3NuX2lydHJfaW50cl9kaXNhYmxlCisJCQkgICAgKHNkLT5zZF9uYXNpZCwgc2QtPnNkX3N1YmNoLAorCQkJICAgICBTQUxfSVJPVVRFUl9JTlRSX1hNSVQpOworCQkJd2FrZV91cCgmc2QtPnNkX3dxKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmc2QtPnNkX3dsb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZC0+c2RfcmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBzY2Rydl9vcGVuCisgKgorICogUmVzZXJ2ZSBhIHN1YmNoYW5uZWwgZm9yIHN5c3RlbSBjb250cm9sbGVyIGNvbW11bmljYXRpb24uCisgKi8KKworc3RhdGljIGludAorc2NkcnZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3lzY3RsX2RhdGFfcyAqc2NkOworCXN0cnVjdCBzdWJjaF9kYXRhX3MgKnNkOworCWludCBydjsKKworCS8qIGxvb2sgdXAgZGV2aWNlIGluZm8gZm9yIHRoaXMgZGV2aWNlIGZpbGUgKi8KKwlzY2QgPSBjb250YWluZXJfb2YoaW5vZGUtPmlfY2Rldiwgc3RydWN0IHN5c2N0bF9kYXRhX3MsIHNjZF9jZGV2KTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViY2hhbm5lbCBkYXRhICovCisJc2QgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IHN1YmNoX2RhdGFfcyksIEdGUF9LRVJORUwpOworCWlmIChzZCA9PSBOVUxMKSB7CisJCXByaW50aygiJXM6IGNvdWxkbid0IGFsbG9jYXRlIHN1YmNoYW5uZWwgZGF0YVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGluaXRpYWxpemUgc3ViY2hfZGF0YV9zIGZpZWxkcyAqLworCW1lbXNldChzZCwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3ViY2hfZGF0YV9zKSk7CisJc2QtPnNkX25hc2lkID0gc2NkLT5zY2RfbmFzaWQ7CisJc2QtPnNkX3N1YmNoID0gaWE2NF9zbl9pcnRyX29wZW4oc2NkLT5zY2RfbmFzaWQpOworCisJaWYgKHNkLT5zZF9zdWJjaCA8IDApIHsKKwkJa2ZyZWUoc2QpOworCQlwcmludGsoIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSBzdWJjaGFubmVsXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXNwaW5fbG9ja19pbml0KCZzZC0+c2RfcmxvY2spOworCXNwaW5fbG9ja19pbml0KCZzZC0+c2Rfd2xvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkLT5zZF9ycSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc2QtPnNkX3dxKTsKKwlzZW1hX2luaXQoJnNkLT5zZF9yYnMsIDEpOworCXNlbWFfaW5pdCgmc2QtPnNkX3dicywgMSk7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzZDsKKworCS8qIGhvb2sgdGhpcyBzdWJjaGFubmVsIHVwIHRvIHRoZSBzeXN0ZW0gY29udHJvbGxlciBpbnRlcnJ1cHQgKi8KKwlydiA9IHJlcXVlc3RfaXJxKFNHSV9VQVJUX1ZFQ1RPUiwgc2NkcnZfaW50ZXJydXB0LAorCQkJIFNBX1NISVJRIHwgU0FfSU5URVJSVVBULAorCQkJIFNZU0NUTF9CQVNFTkFNRSwgc2QpOworCWlmIChydikgeworCQlpYTY0X3NuX2lydHJfY2xvc2Uoc2QtPnNkX25hc2lkLCBzZC0+c2Rfc3ViY2gpOworCQlrZnJlZShzZCk7CisJCXByaW50aygiJXM6IGlycSByZXF1ZXN0IGZhaWxlZCAoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHJ2KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNjZHJ2X3JlbGVhc2UKKyAqCisgKiBSZWxlYXNlIGEgcHJldmlvdXNseS1yZXNlcnZlZCBzdWJjaGFubmVsLgorICovCisKK3N0YXRpYyBpbnQKK3NjZHJ2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHN1YmNoX2RhdGFfcyAqc2QgPSAoc3RydWN0IHN1YmNoX2RhdGFfcyAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJ2OworCisJLyogZnJlZSB0aGUgaW50ZXJydXB0ICovCisJZnJlZV9pcnEoU0dJX1VBUlRfVkVDVE9SLCBzZCk7CisKKwkvKiBhc2sgU0FMIHRvIGNsb3NlIHRoZSBzdWJjaGFubmVsICovCisJcnYgPSBpYTY0X3NuX2lydHJfY2xvc2Uoc2QtPnNkX25hc2lkLCBzZC0+c2Rfc3ViY2gpOworCisJa2ZyZWUoc2QpOworCXJldHVybiBydjsKK30KKworLyoKKyAqIHNjZHJ2X3JlYWQKKyAqCisgKiBDYWxsZWQgdG8gcmVhZCBieXRlcyBmcm9tIHRoZSBvcGVuIElSb3V0ZXIgcGlwZS4KKyAqCisgKi8KKworc3RhdGljIGlubGluZSBpbnQKK3JlYWRfc3RhdHVzX2NoZWNrKHN0cnVjdCBzdWJjaF9kYXRhX3MgKnNkLCBpbnQgKmxlbikKK3sKKwlyZXR1cm4gaWE2NF9zbl9pcnRyX3JlY3Yoc2QtPnNkX25hc2lkLCBzZC0+c2Rfc3ViY2gsIHNkLT5zZF9yYiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QKK3NjZHJ2X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpmX3BvcykKK3sKKwlpbnQgc3RhdHVzOworCWludCBsZW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3ViY2hfZGF0YV9zICpzZCA9IChzdHJ1Y3Qgc3ViY2hfZGF0YV9zICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIHRyeSB0byBnZXQgY29udHJvbCBvZiB0aGUgcmVhZCBidWZmZXIgKi8KKwlpZiAoZG93bl90cnlsb2NrKCZzZC0+c2RfcmJzKSkgeworCQkvKiBzb21lYm9keSBlbHNlIGhhcyBpdCBub3c7CisJCSAqIGlmIHdlJ3JlIG5vbi1ibG9ja2luZywgdGhlbiBleGl0Li4uCisJCSAqLworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJCS8qIC4uLm9yIGlmIHdlIHdhbnQgdG8gYmxvY2ssIHRoZW4gZG8gc28gaGVyZSAqLworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzZC0+c2RfcmJzKSkgeworCQkJLyogc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB3YWl0ICovCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJfQorCisJLyogYW55dGhpbmcgdG8gcmVhZD8gKi8KKwlsZW4gPSBDSFVOS1NJWkU7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNkLT5zZF9ybG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IHJlYWRfc3RhdHVzX2NoZWNrKHNkLCAmbGVuKTsKKworCS8qIGlmIG5vdCwgYW5kIHdlJ3JlIGJsb2NraW5nIEkvTywgbG9vcCAqLworCXdoaWxlIChzdGF0dXMgPCAwKSB7CisJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2QtPnNkX3Jsb2NrLCBmbGFncyk7CisJCQl1cCgmc2QtPnNkX3Jicyk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCisJCWxlbiA9IENIVU5LU0laRTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoJnNkLT5zZF9ycSwgJndhaXQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZC0+c2RfcmxvY2ssIGZsYWdzKTsKKworCQlzY2hlZHVsZV90aW1lb3V0KFNDRFJWX1RJTUVPVVQpOworCisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzZC0+c2RfcnEsICZ3YWl0KTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkvKiB3YWl0IHdhcyBpbnRlcnJ1cHRlZCAqLworCQkJdXAoJnNkLT5zZF9yYnMpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZC0+c2RfcmxvY2ssIGZsYWdzKTsKKwkJc3RhdHVzID0gcmVhZF9zdGF0dXNfY2hlY2soc2QsICZsZW4pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZC0+c2RfcmxvY2ssIGZsYWdzKTsKKworCWlmIChsZW4gPiAwKSB7CisJCS8qIHdlIHJlYWQgc29tZXRoaW5nIGluIHRoZSBsYXN0IHJlYWRfc3RhdHVzX2NoZWNrKCk7IGNvcHkKKwkJICogaXQgb3V0IHRvIHVzZXIgc3BhY2UKKwkJICovCisJCWlmIChjb3VudCA8IGxlbikgeworCQkJcHJfZGVidWcoIiVzOiBvbmx5IGFjY2VwdGluZyAlZCBvZiAlZCBieXRlc1xuIiwKKwkJCQkgX19GVU5DVElPTl9fLCAoaW50KSBjb3VudCwgbGVuKTsKKwkJfQorCQlsZW4gPSBtaW4oKGludCkgY291bnQsIGxlbik7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBzZC0+c2RfcmIsIGxlbikpCisJCQlsZW4gPSAtRUZBVUxUOworCX0KKworCS8qIHJlbGVhc2UgdGhlIHJlYWQgYnVmZmVyIGFuZCB3YWtlIGFueW9uZSB3aG8gbWlnaHQgYmUKKwkgKiB3YWl0aW5nIGZvciBpdAorCSAqLworCXVwKCZzZC0+c2RfcmJzKTsKKworCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbiAqLworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBzY2Rydl93cml0ZQorICoKKyAqIFdyaXRlcyBhIGNodW5rIG9mIGFuIElSb3V0ZXIgcGFja2V0IChvciBvdGhlciBzeXN0ZW0gY29udHJvbGxlciBkYXRhKQorICogdG8gdGhlIHN5c3RlbSBjb250cm9sbGVyLgorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3dyaXRlX3N0YXR1c19jaGVjayhzdHJ1Y3Qgc3ViY2hfZGF0YV9zICpzZCwgaW50IGNvdW50KQoreworCXJldHVybiBpYTY0X3NuX2lydHJfc2VuZChzZC0+c2RfbmFzaWQsIHNkLT5zZF9zdWJjaCwgc2QtPnNkX3diLCBjb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzY2Rydl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKmZfcG9zKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3Qgc3ViY2hfZGF0YV9zICpzZCA9IChzdHJ1Y3Qgc3ViY2hfZGF0YV9zICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIHRyeSB0byBnZXQgY29udHJvbCBvZiB0aGUgd3JpdGUgYnVmZmVyICovCisJaWYgKGRvd25fdHJ5bG9jaygmc2QtPnNkX3dicykpIHsKKwkJLyogc29tZWJvZHkgZWxzZSBoYXMgaXQgbm93OworCQkgKiBpZiB3ZSdyZSBub24tYmxvY2tpbmcsIHRoZW4gZXhpdC4uLgorCQkgKi8KKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQkvKiAuLi5vciBpZiB3ZSB3YW50IHRvIGJsb2NrLCB0aGVuIGRvIHNvIGhlcmUgKi8KKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc2QtPnNkX3dicykpIHsKKwkJCS8qIHNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggd2FpdCAqLworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCX0KKworCWNvdW50ID0gbWluKChpbnQpIGNvdW50LCBDSFVOS1NJWkUpOworCWlmIChjb3B5X2Zyb21fdXNlcihzZC0+c2Rfd2IsIGJ1ZiwgY291bnQpKSB7CisJCXVwKCZzZC0+c2Rfd2JzKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogdHJ5IHRvIHNlbmQgdGhlIGJ1ZmZlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZC0+c2Rfd2xvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSB3cml0ZV9zdGF0dXNfY2hlY2soc2QsIGNvdW50KTsKKworCS8qIGlmIHdlIGZhaWxlZCwgYW5kIHdlIHdhbnQgdG8gYmxvY2ssIHRoZW4gbG9vcCAqLworCXdoaWxlIChzdGF0dXMgPD0gMCkgeworCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXNwaW5fdW5sb2NrKCZzZC0+c2Rfd2xvY2spOworCQkJdXAoJnNkLT5zZF93YnMpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlhZGRfd2FpdF9xdWV1ZSgmc2QtPnNkX3dxLCAmd2FpdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkLT5zZF93bG9jaywgZmxhZ3MpOworCisJCXNjaGVkdWxlX3RpbWVvdXQoU0NEUlZfVElNRU9VVCk7CisKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnNkLT5zZF93cSwgJndhaXQpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCS8qIHdhaXQgd2FzIGludGVycnVwdGVkICovCisJCQl1cCgmc2QtPnNkX3dicyk7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNkLT5zZF93bG9jaywgZmxhZ3MpOworCQlzdGF0dXMgPSB3cml0ZV9zdGF0dXNfY2hlY2soc2QsIGNvdW50KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2QtPnNkX3dsb2NrLCBmbGFncyk7CisKKwkvKiByZWxlYXNlIHRoZSB3cml0ZSBidWZmZXIgYW5kIHdha2UgYW55b25lIHdobydzIHdhaXRpbmcgZm9yIGl0ICovCisJdXAoJnNkLT5zZF93YnMpOworCisJLyogcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY2NlcHRlZCAoc2hvdWxkIGJlIHRoZSBjb21wbGV0ZQorCSAqICJjaHVuayIgYXMgcmVxdWVzdGVkKQorCSAqLworCWlmICgoc3RhdHVzID49IDApICYmIChzdGF0dXMgPCBjb3VudCkpIHsKKwkJcHJfZGVidWcoIkRpZG4ndCBhY2NlcHQgdGhlIGZ1bGwgY2h1bms7ICVkIG9mICVkXG4iLAorCQkJIHN0YXR1cywgKGludCkgY291bnQpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitzY2Rydl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBzdWJjaF9kYXRhX3MgKnNkID0gKHN0cnVjdCBzdWJjaF9kYXRhX3MgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwb2xsX3dhaXQoZmlsZSwgJnNkLT5zZF9ycSwgd2FpdCk7CisJcG9sbF93YWl0KGZpbGUsICZzZC0+c2Rfd3EsIHdhaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNkLT5zZF9ybG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmc2QtPnNkX3dsb2NrKTsKKwlzdGF0dXMgPSBpYTY0X3NuX2lydHJfaW50cihzZC0+c2RfbmFzaWQsIHNkLT5zZF9zdWJjaCk7CisJc3Bpbl91bmxvY2soJnNkLT5zZF93bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2QtPnNkX3Jsb2NrLCBmbGFncyk7CisKKwlpZiAoc3RhdHVzID4gMCkgeworCQlpZiAoc3RhdHVzICYgU0FMX0lST1VURVJfSU5UUl9SRUNWKSB7CisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCX0KKwkJaWYgKHN0YXR1cyAmIFNBTF9JUk9VVEVSX0lOVFJfWE1JVCkgeworCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCX0KKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzY2Rydl9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWFkID0JCXNjZHJ2X3JlYWQsCisJLndyaXRlID0Jc2NkcnZfd3JpdGUsCisJLnBvbGwgPQkJc2NkcnZfcG9sbCwKKwkub3BlbiA9CQlzY2Rydl9vcGVuLAorCS5yZWxlYXNlID0Jc2NkcnZfcmVsZWFzZSwKK307CisKKy8qCisgKiBzY2Rydl9pbml0CisgKgorICogQ2FsbGVkIGF0IGJvb3QgdGltZSB0byBpbml0aWFsaXplIHRoZSBzeXN0ZW0gY29udHJvbGxlciBjb21tdW5pY2F0aW9uCisgKiBmYWNpbGl0eS4KKyAqLworaW50IF9faW5pdAorc2NkcnZfaW5pdCh2b2lkKQoreworCWdlb2lkX3QgZ2VvaWQ7CisJY25vZGVpZF90IGNub2RlOworCWNoYXIgZGV2bmFtZVszMl07CisJY2hhciAqZGV2bmFtZXA7CisJc3RydWN0IHN5c2N0bF9kYXRhX3MgKnNjZDsKKwl2b2lkICpzYWxidWY7CisJc3RydWN0IGNsYXNzX3NpbXBsZSAqc25zY19jbGFzczsKKwlkZXZfdCBmaXJzdF9kZXYsIGRldjsKKworCWlmIChhbGxvY19jaHJkZXZfcmVnaW9uKCZmaXJzdF9kZXYsIDAsIG51bWlvbm9kZXMsCisJCQkJU1lTQ1RMX0JBU0VOQU1FKSA8IDApIHsKKwkJcHJpbnRrKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIFNOIHN5c3RlbSBjb250cm9sbGVyIGRldmljZVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlzbnNjX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgU1lTQ1RMX0JBU0VOQU1FKTsKKworCWZvciAoY25vZGUgPSAwOyBjbm9kZSA8IG51bWlvbm9kZXM7IGNub2RlKyspIHsKKwkJCWdlb2lkID0gY25vZGVpZF9nZXRfZ2VvaWQoY25vZGUpOworCQkJZGV2bmFtZXAgPSBkZXZuYW1lOworCQkJZm9ybWF0X21vZHVsZV9pZChkZXZuYW1lcCwgZ2VvX21vZHVsZShnZW9pZCksCisJCQkJCSBNT0RVTEVfRk9STUFUX0JSSUVGKTsKKwkJCWRldm5hbWVwID0gZGV2bmFtZSArIHN0cmxlbihkZXZuYW1lKTsKKwkJCXNwcmludGYoZGV2bmFtZXAsICIjJWQiLCBnZW9fc2xhYihnZW9pZCkpOworCisJCQkvKiBhbGxvY2F0ZSBzeXNjdGwgZGV2aWNlIGRhdGEgKi8KKwkJCXNjZCA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgc3lzY3RsX2RhdGFfcyksCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXNjZCkgeworCQkJCXByaW50aygiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBkZXZpY2UgaW5mbyIKKwkJCQkgICAgICAgImZvciAlcy8lc1xuIiwgX19GVU5DVElPTl9fLAorCQkJCSAgICAgICBTWVNDVExfQkFTRU5BTUUsIGRldm5hbWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbWVtc2V0KHNjZCwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3lzY3RsX2RhdGFfcykpOworCisJCQkvKiBpbml0aWFsaXplIHN5c2N0bCBkZXZpY2UgZGF0YSBmaWVsZHMgKi8KKwkJCXNjZC0+c2NkX25hc2lkID0gY25vZGVpZF90b19uYXNpZChjbm9kZSk7CisJCQlpZiAoIShzYWxidWYgPSBrbWFsbG9jKFNDRFJWX0JVRlNaLCBHRlBfS0VSTkVMKSkpIHsKKwkJCQlwcmludGsoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgZHJpdmVyIGJ1ZmZlciIKKwkJCQkgICAgICAgIiglcyVzKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCSAgICAgICBTWVNDVExfQkFTRU5BTUUsIGRldm5hbWUpOworCQkJCWtmcmVlKHNjZCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChpYTY0X3NuX2lydHJfaW5pdChzY2QtPnNjZF9uYXNpZCwgc2FsYnVmLAorCQkJCQkgICAgICBTQ0RSVl9CVUZTWikgPCAwKSB7CisJCQkJcHJpbnRrCisJCQkJICAgICgiJXM6IGZhaWxlZCB0byBpbml0aWFsaXplIFNBTCBmb3IiCisJCQkJICAgICAiIHN5c3RlbSBjb250cm9sbGVyIGNvbW11bmljYXRpb24iCisJCQkJICAgICAiICglcy8lcyk6IG91dGRhdGVkIFBST00/XG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fLCBTWVNDVExfQkFTRU5BTUUsIGRldm5hbWUpOworCQkJCWtmcmVlKHNjZCk7CisJCQkJa2ZyZWUoc2FsYnVmKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZGV2ID0gZmlyc3RfZGV2ICsgY25vZGU7CisJCQljZGV2X2luaXQoJnNjZC0+c2NkX2NkZXYsICZzY2Rydl9mb3BzKTsKKwkJCWlmIChjZGV2X2FkZCgmc2NkLT5zY2RfY2RldiwgZGV2LCAxKSkgeworCQkJCXByaW50aygiJXM6IGZhaWxlZCB0byByZWdpc3RlciBzeXN0ZW0iCisJCQkJICAgICAgICIgY29udHJvbGxlciBkZXZpY2UgKCVzJXMpXG4iLAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIFNZU0NUTF9CQVNFTkFNRSwgZGV2bmFtZSk7CisJCQkJa2ZyZWUoc2NkKTsKKwkJCQlrZnJlZShzYWxidWYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZChzbnNjX2NsYXNzLCBkZXYsIE5VTEwsCisJCQkJCQkiJXMiLCBkZXZuYW1lKTsKKworCQkJaWE2NF9zbl9pcnRyX2ludHJfZW5hYmxlKHNjZC0+c2NkX25hc2lkLAorCQkJCQkJIDAgLyppZ25vcmVkICovICwKKwkJCQkJCSBTQUxfSVJPVVRFUl9JTlRSX1JFQ1YpOworCX0KKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoc2NkcnZfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc25zYy5oIGIvZHJpdmVycy9jaGFyL3Nuc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjJjNmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Nuc2MuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogU04gUGxhdGZvcm0gc3lzdGVtIGNvbnRyb2xsZXIgY29tbXVuaWNhdGlvbiBzdXBwb3J0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1hY3JvcyBhbmQgZGF0YSB0eXBlcyBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQorICogc3lzdGVtIGNvbnRyb2xsZXJzIGluIFNHSSBTTiBzeXN0ZW1zLgorICovCisKKyNpZm5kZWYgX1NOX1NZU0NUTF9IXworI2RlZmluZSBfU05fU1lTQ1RMX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNkZWZpbmUgQ0hVTktTSVpFIDEyNworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHRyYWNrIGFuIG9wZW4gc3ViY2hhbm5lbC4gKi8KK3N0cnVjdCBzdWJjaF9kYXRhX3MgeworCW5hc2lkX3Qgc2RfbmFzaWQ7CS8qIG5vZGUgb24gd2hpY2ggdGhlIHN1YmNoYW5uZWwgd2FzIG9wZW5lZCAqLworCWludCBzZF9zdWJjaDsJCS8qIHN1YmNoYW5uZWwgbnVtYmVyICovCisJc3BpbmxvY2tfdCBzZF9ybG9jazsJLyogbW9uaXRvciBsb2NrIGZvciByc3YgKi8KKwlzcGlubG9ja190IHNkX3dsb2NrOwkvKiBtb25pdG9yIGxvY2sgZm9yIHdzdiAqLworCXdhaXRfcXVldWVfaGVhZF90IHNkX3JxOwkvKiB3YWl0IHF1ZXVlIGZvciByZWFkZXJzICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgc2Rfd3E7CS8qIHdhaXQgcXVldWUgZm9yIHdyaXRlcnMgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIHNkX3JiczsJLyogc2VtYXBob3JlIGZvciByZWFkIGJ1ZmZlciAqLworCXN0cnVjdCBzZW1hcGhvcmUgc2Rfd2JzOwkvKiBzZW1hcGhvcmUgZm9yIHdyaXRlIGJ1ZmZlciAqLworCisJY2hhciBzZF9yYltDSFVOS1NJWkVdOwkvKiByZWFkIGJ1ZmZlciAqLworCWNoYXIgc2Rfd2JbQ0hVTktTSVpFXTsJLyogd3JpdGUgYnVmZmVyICovCit9OworCitzdHJ1Y3Qgc3lzY3RsX2RhdGFfcyB7CisJc3RydWN0IGNkZXYgc2NkX2NkZXY7CS8qIENoYXJhY3RlciBkZXZpY2UgaW5mbyAqLworCW5hc2lkX3Qgc2NkX25hc2lkOwkvKiBOb2RlIG9uIHdoaWNoIHN1YmNoYW5uZWxzIGFyZSBvcGVuZWQuICovCit9OworCisjZW5kaWYgLyogX1NOX1NZU0NUTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NvbnlwaS5jIGIvZHJpdmVycy9jaGFyL3NvbnlwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5N2E4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc29ueXBpLmMKQEAgLTAsMCArMSwxNDAzIEBACisvKgorICogU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2wgRGV2aWNlIGRyaXZlciBmb3IgVkFJTworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IFN0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5hcmF5YW5hbiBSIFMgPG5hcnNAa2FkYW1iYS5vcmc+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgQWxj9HZlIDx3d3cuYWxjb3ZlLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWljaGFlbCBBc2hsZXkgPG0uYXNobGV5QHVuc3cuZWR1LmF1PgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBKdW5pY2hpIE1vcml0YSA8anVuMW1AbWFycy5kdGkubmUuanA+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIFRha2F5YSBLaW5qbyA8dC1raW5qb0B0YzQuc28tbmV0Lm5lLmpwPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBBbmRyZXcgVHJpZGdlbGwgPHRyaWRnZUB2YWxpbnV4LmNvbT4KKyAqCisgKiBFYXJsaWVyIHdvcmsgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBQYXVsIGBSdXN0eScgUnVzc2VsbCBhbmQgUGF1bCBNYWNrZXJyYXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3NvbnlwaS5oPgorCisjZGVmaW5lIFNPTllQSV9EUklWRVJfVkVSU0lPTgkgIjEuMjYiCisKK01PRFVMRV9BVVRIT1IoIlN0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNvbnkgUHJvZ3JhbW1hYmxlIEkvTyBDb250cm9sIERldmljZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFNPTllQSV9EUklWRVJfVkVSU0lPTik7CisKK3N0YXRpYyBpbnQgbWlub3IgPSAtMTsKK21vZHVsZV9wYXJhbShtaW5vciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWlub3IsCisJCSAibWlub3IgbnVtYmVyIG9mIHRoZSBtaXNjIGRldmljZSwgZGVmYXVsdCBpcyAtMSAoYXV0b21hdGljKSIpOworCitzdGF0aWMgaW50IHZlcmJvc2U7CQkvKiA9IDAgKi8KK21vZHVsZV9wYXJhbSh2ZXJib3NlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh2ZXJib3NlLCAiYmUgdmVyYm9zZSwgZGVmYXVsdCBpcyAwIChubykiKTsKKworc3RhdGljIGludCBmbmtleWluaXQ7CQkvKiA9IDAgKi8KK21vZHVsZV9wYXJhbShmbmtleWluaXQsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZua2V5aW5pdCwKKwkJICJzZXQgdGhpcyBpZiB5b3VyIEZuIGtleXMgZG8gbm90IGdlbmVyYXRlIGFueSBldmVudCIpOworCitzdGF0aWMgaW50IGNhbWVyYTsJCS8qID0gMCAqLworbW9kdWxlX3BhcmFtKGNhbWVyYSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY2FtZXJhLAorCQkgInNldCB0aGlzIGlmIHlvdSBoYXZlIGEgTW90aW9uRXllIGNhbWVyYSAoUGljdHVyZUJvb2sgc2VyaWVzKSIpOworCitzdGF0aWMgaW50IGNvbXBhdDsJCS8qID0gMCAqLworbW9kdWxlX3BhcmFtKGNvbXBhdCwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY29tcGF0LAorCQkgInNldCB0aGlzIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG1vZGUiKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFzayA9IDB4ZmZmZmZmZmY7Cittb2R1bGVfcGFyYW0obWFzaywgdWxvbmcsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhtYXNrLAorCQkgInNldCB0aGlzIHRvIHRoZSBtYXNrIG9mIGV2ZW50IHlvdSB3YW50IHRvIGVuYWJsZSAoc2VlIGRvYykiKTsKKworc3RhdGljIGludCB1c2VpbnB1dCA9IDE7Cittb2R1bGVfcGFyYW0odXNlaW5wdXQsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVzZWlucHV0LAorCQkgInNldCB0aGlzIGlmIHlvdSB3b3VsZCBsaWtlIHNvbnlwaSB0byBmZWVkIGV2ZW50cyB0byB0aGUgaW5wdXQgc3Vic3lzdGVtIik7CisKKyNkZWZpbmUgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMQkxCisjZGVmaW5lIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIJMgorCisvKiB0eXBlMSBtb2RlbHMgdXNlIHRob3NlICovCisjZGVmaW5lIFNPTllQSV9JUlFfUE9SVAkJCTB4ODAzNAorI2RlZmluZSBTT05ZUElfSVJRX1NISUZUCQkyMgorI2RlZmluZSBTT05ZUElfQkFTRQkJCTB4NTAKKyNkZWZpbmUgU09OWVBJX0cxMEEJCQkoU09OWVBJX0JBU0UrMHgxNCkKKyNkZWZpbmUgU09OWVBJX1RZUEUxX1JFR0lPTl9TSVpFCTB4MDgKKyNkZWZpbmUgU09OWVBJX1RZUEUxX0VWVFlQRV9PRkZTRVQJMHgwNAorCisvKiB0eXBlMiBzZXJpZXMgc3BlY2lmaWNzICovCisjZGVmaW5lIFNPTllQSV9TSVJRCQkJMHg5YgorI2RlZmluZSBTT05ZUElfU0xPQgkJCTB4OWMKKyNkZWZpbmUgU09OWVBJX1NISUIJCQkweDlkCisjZGVmaW5lIFNPTllQSV9UWVBFMl9SRUdJT05fU0laRQkweDIwCisjZGVmaW5lIFNPTllQSV9UWVBFMl9FVlRZUEVfT0ZGU0VUCTB4MTIKKworLyogYmF0dGVyeSAvIGJyaWdodG5lc3MgYWRkcmVzc2VzICovCisjZGVmaW5lIFNPTllQSV9CQVRfRkxBR1MJMHg4MQorI2RlZmluZSBTT05ZUElfTENEX0xJR0hUCTB4OTYKKyNkZWZpbmUgU09OWVBJX0JBVDFfUENUUk0JMHhhMAorI2RlZmluZSBTT05ZUElfQkFUMV9MRUZUCTB4YTIKKyNkZWZpbmUgU09OWVBJX0JBVDFfTUFYUlQJMHhhNAorI2RlZmluZSBTT05ZUElfQkFUMl9QQ1RSTQkweGE4CisjZGVmaW5lIFNPTllQSV9CQVQyX0xFRlQJMHhhYQorI2RlZmluZSBTT05ZUElfQkFUMl9NQVhSVAkweGFjCisjZGVmaW5lIFNPTllQSV9CQVQxX01BWFRLCTB4YjAKKyNkZWZpbmUgU09OWVBJX0JBVDFfRlVMTAkweGIyCisjZGVmaW5lIFNPTllQSV9CQVQyX01BWFRLCTB4YjgKKyNkZWZpbmUgU09OWVBJX0JBVDJfRlVMTAkweGJhCisKKy8qIEZBTjAgaW5mb3JtYXRpb24gKHJldmVyc2UgZW5naW5lZXJlZCBmcm9tIEFDUEkgdGFibGVzKSAqLworI2RlZmluZSBTT05ZUElfRkFOMF9TVEFUVVMJMHg5MworI2RlZmluZSBTT05ZUElfVEVNUF9TVEFUVVMJMHhDMQorCisvKiBpb3BvcnRzIHVzZWQgZm9yIGJyaWdodG5lc3MgYW5kIHR5cGUyIGV2ZW50cyAqLworI2RlZmluZSBTT05ZUElfREFUQV9JT1BPUlQJMHg2MgorI2RlZmluZSBTT05ZUElfQ1NUX0lPUE9SVAkweDY2CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgaW9wb3J0cyAqLworc3RydWN0IHNvbnlwaV9pb3BvcnRfbGlzdCB7CisJdTE2CXBvcnQxOworCXUxNglwb3J0MjsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2lvcG9ydF9saXN0IHNvbnlwaV90eXBlMV9pb3BvcnRfbGlzdFtdID0geworCXsgMHgxMGMwLCAweDEwYzQgfSwJLyogbG9va3MgbGlrZSB0aGUgZGVmYXVsdCBvbiBDMVZ4ICovCisJeyAweDEwODAsIDB4MTA4NCB9LAorCXsgMHgxMDkwLCAweDEwOTQgfSwKKwl7IDB4MTBhMCwgMHgxMGE0IH0sCisJeyAweDEwYjAsIDB4MTBiNCB9LAorCXsgMHgwLCAweDAgfQorfTsKKworc3RhdGljIHN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3Qgc29ueXBpX3R5cGUyX2lvcG9ydF9saXN0W10gPSB7CisJeyAweDEwODAsIDB4MTA4NCB9LAorCXsgMHgxMGEwLCAweDEwYTQgfSwKKwl7IDB4MTBjMCwgMHgxMGM0IH0sCisJeyAweDEwZTAsIDB4MTBlNCB9LAorCXsgMHgwLCAweDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBpbnRlcnJ1cHRzICovCitzdHJ1Y3Qgc29ueXBpX2lycV9saXN0IHsKKwl1MTYJaXJxOworCXUxNgliaXRzOworfTsKKworc3RhdGljIHN0cnVjdCBzb255cGlfaXJxX2xpc3Qgc29ueXBpX3R5cGUxX2lycV9saXN0W10gPSB7CisJeyAxMSwgMHgyIH0sCS8qIElSUSAxMSwgR08yMj0wLEdPMjM9MSBpbiBBTUwgKi8KKwl7IDEwLCAweDEgfSwJLyogSVJRIDEwLCBHTzIyPTEsR08yMz0wIGluIEFNTCAqLworCXsgIDUsIDB4MCB9LAkvKiBJUlEgIDUsIEdPMjI9MCxHTzIzPTAgaW4gQU1MICovCisJeyAgMCwgMHgzIH0JLyogbm8gSVJRLCBHTzIyPTEsR08yMz0xIGluIEFNTCAqLworfTsKKworc3RhdGljIHN0cnVjdCBzb255cGlfaXJxX2xpc3Qgc29ueXBpX3R5cGUyX2lycV9saXN0W10gPSB7CisJeyAxMSwgMHg4MCB9LAkvKiBJUlEgMTEsIDB4ODAgaW4gU0lSUSBpbiBBTUwgKi8KKwl7IDEwLCAweDQwIH0sCS8qIElSUSAxMCwgMHg0MCBpbiBTSVJRIGluIEFNTCAqLworCXsgIDksIDB4MjAgfSwJLyogSVJRICA5LCAweDIwIGluIFNJUlEgaW4gQU1MICovCisJeyAgNiwgMHgxMCB9LAkvKiBJUlEgIDYsIDB4MTAgaW4gU0lSUSBpbiBBTUwgKi8KKwl7ICAwLCAweDAwIH0JLyogbm8gSVJRLCAweDAwIGluIFNJUlEgaW4gQU1MICovCit9OworCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfQlJJR0hUTkVTUwkJMAorI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRSQVNUCQkJMQorI2RlZmluZSBTT05ZUElfQ0FNRVJBX0hVRQkJCTIKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9DT0xPUgkJCTMKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9TSEFSUE5FU1MJCQk0CisKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9QSUNUVVJFCQkJNQorI2RlZmluZSBTT05ZUElfQ0FNRVJBX0VYUE9TVVJFX01BU0sJCTB4QworI2RlZmluZSBTT05ZUElfQ0FNRVJBX1dISVRFX0JBTEFOQ0VfTUFTSwkweDMKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9QSUNUVVJFX01PREVfTUFTSwkJMHgzMAorI2RlZmluZSBTT05ZUElfQ0FNRVJBX01VVEVfTUFTSwkJCTB4NDAKKworLyogdGhlIHJlc3QgZG9uJ3QgbmVlZCBhIGxvb3AgdW50aWwgbm90IDB4ZmYgKi8KKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9BR0MJCQk2CisjZGVmaW5lIFNPTllQSV9DQU1FUkFfQUdDX01BU0sJCQkweDMwCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfU0hVVFRFUl9NQVNLIAkJMHg3CisKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9TSFVURE9XTl9SRVFVRVNUCQk3CisjZGVmaW5lIFNPTllQSV9DQU1FUkFfQ09OVFJPTAkJCTB4MTAKKworI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVUyAJCQk3CisjZGVmaW5lIFNPTllQSV9DQU1FUkFfU1RBVFVTX1JFQURZIAkJMHgyCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfU1RBVFVTX1BPU0lUSU9OCQkweDQKKworI2RlZmluZSBTT05ZUElfRElSRUNUSU9OX0JBQ0tXQVJEUyAJCTB4NAorCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfUkVWSVNJT04gCQkJOAorI2RlZmluZSBTT05ZUElfQ0FNRVJBX1JPTVZFUlNJT04gCQk5CisKKy8qIEV2ZW50IG1hc2tzICovCisjZGVmaW5lIFNPTllQSV9KT0dHRVJfTUFTSwkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgU09OWVBJX0NBUFRVUkVfTUFTSwkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU09OWVBJX0ZOS0VZX01BU0sJCQkweDAwMDAwMDA0CisjZGVmaW5lIFNPTllQSV9CTFVFVE9PVEhfTUFTSwkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgU09OWVBJX1BLRVlfTUFTSwkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgU09OWVBJX0JBQ0tfTUFTSwkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgU09OWVBJX0hFTFBfTUFTSwkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU09OWVBJX0xJRF9NQVNLCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgU09OWVBJX1pPT01fTUFTSwkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgU09OWVBJX1RIVU1CUEhSQVNFX01BU0sJCQkweDAwMDAwMjAwCisjZGVmaW5lIFNPTllQSV9NRVlFX01BU0sJCQkweDAwMDAwNDAwCisjZGVmaW5lIFNPTllQSV9NRU1PUllTVElDS19NQVNLCQkJMHgwMDAwMDgwMAorI2RlZmluZSBTT05ZUElfQkFUVEVSWV9NQVNLCQkJMHgwMDAwMTAwMAorCitzdHJ1Y3Qgc29ueXBpX2V2ZW50IHsKKwl1OAlkYXRhOworCXU4CWV2ZW50OworfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBidXR0b24gcmVsZWFzZSBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9yZWxlYXNlZXZbXSA9IHsKKwl7IDB4MDAsIFNPTllQSV9FVkVOVF9BTllCVVRUT05fUkVMRUFTRUQgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBqb2dnZXIgZXZlbnRzICAqLworc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2pvZ2dlcmV2W10gPSB7CisJeyAweDFmLCBTT05ZUElfRVZFTlRfSk9HRElBTF9VUCB9LAorCXsgMHgwMSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTiB9LAorCXsgMHg1ZiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVBfUFJFU1NFRCB9LAorCXsgMHg0MSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTl9QUkVTU0VEIH0sCisJeyAweDFlLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQIH0sCisJeyAweDAyLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX0RPV04gfSwKKwl7IDB4NWUsIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfVVBfUFJFU1NFRCB9LAorCXsgMHg0MiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOX1BSRVNTRUQgfSwKKwl7IDB4MWQsIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX1VQIH0sCisJeyAweDAzLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9ET1dOIH0sCisJeyAweDVkLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUF9QUkVTU0VEIH0sCisJeyAweDQzLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9ET1dOX1BSRVNTRUQgfSwKKwl7IDB4NDAsIFNPTllQSV9FVkVOVF9KT0dESUFMX1BSRVNTRUQgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBjYXB0dXJlIGJ1dHRvbiBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9jYXB0dXJlZXZbXSA9IHsKKwl7IDB4MDUsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxQUkVTU0VEIH0sCisJeyAweDA3LCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VEIH0sCisJeyAweDAxLCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUkVMRUFTRUQgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBmbmtleXMgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfZm5rZXlldltdID0geworCXsgMHgxMCwgU09OWVBJX0VWRU5UX0ZOS0VZX0VTQyB9LAorCXsgMHgxMSwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxIH0sCisJeyAweDEyLCBTT05ZUElfRVZFTlRfRk5LRVlfRjIgfSwKKwl7IDB4MTMsIFNPTllQSV9FVkVOVF9GTktFWV9GMyB9LAorCXsgMHgxNCwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y0IH0sCisJeyAweDE1LCBTT05ZUElfRVZFTlRfRk5LRVlfRjUgfSwKKwl7IDB4MTYsIFNPTllQSV9FVkVOVF9GTktFWV9GNiB9LAorCXsgMHgxNywgU09OWVBJX0VWRU5UX0ZOS0VZX0Y3IH0sCisJeyAweDE4LCBTT05ZUElfRVZFTlRfRk5LRVlfRjggfSwKKwl7IDB4MTksIFNPTllQSV9FVkVOVF9GTktFWV9GOSB9LAorCXsgMHgxYSwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMCB9LAorCXsgMHgxYiwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMSB9LAorCXsgMHgxYywgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMiB9LAorCXsgMHgxZiwgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEIH0sCisJeyAweDIxLCBTT05ZUElfRVZFTlRfRk5LRVlfMSB9LAorCXsgMHgyMiwgU09OWVBJX0VWRU5UX0ZOS0VZXzIgfSwKKwl7IDB4MzEsIFNPTllQSV9FVkVOVF9GTktFWV9EIH0sCisJeyAweDMyLCBTT05ZUElfRVZFTlRfRk5LRVlfRSB9LAorCXsgMHgzMywgU09OWVBJX0VWRU5UX0ZOS0VZX0YgfSwKKwl7IDB4MzQsIFNPTllQSV9FVkVOVF9GTktFWV9TIH0sCisJeyAweDM1LCBTT05ZUElfRVZFTlRfRk5LRVlfQiB9LAorCXsgMHgzNiwgU09OWVBJX0VWRU5UX0ZOS0VZX09OTFkgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBwcm9ncmFtIGtleSBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9wa2V5ZXZbXSA9IHsKKwl7IDB4MDEsIFNPTllQSV9FVkVOVF9QS0VZX1AxIH0sCisJeyAweDAyLCBTT05ZUElfRVZFTlRfUEtFWV9QMiB9LAorCXsgMHgwNCwgU09OWVBJX0VWRU5UX1BLRVlfUDMgfSwKKwl7IDB4NWMsIFNPTllQSV9FVkVOVF9QS0VZX1AxIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgYmx1ZXRvb3RoIGV2ZW50cyAqLworc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JsdWVldltdID0geworCXsgMHg1NSwgU09OWVBJX0VWRU5UX0JMVUVUT09USF9QUkVTU0VEIH0sCisJeyAweDU5LCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09OIH0sCisJeyAweDVhLCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09GRiB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJhY2sgYnV0dG9uIGV2ZW50cyAqLworc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JhY2tldltdID0geworCXsgMHgyMCwgU09OWVBJX0VWRU5UX0JBQ0tfUFJFU1NFRCB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGhlbHAgYnV0dG9uIGV2ZW50cyAqLworc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2hlbHBldltdID0geworCXsgMHgzYiwgU09OWVBJX0VWRU5UX0hFTFBfUFJFU1NFRCB9LAorCXsgMCwgMCB9Cit9OworCisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgbGlkIGV2ZW50cyAqLworc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2xpZGV2W10gPSB7CisJeyAweDUxLCBTT05ZUElfRVZFTlRfTElEX0NMT1NFRCB9LAorCXsgMHg1MCwgU09OWVBJX0VWRU5UX0xJRF9PUEVORUQgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSB6b29tIGV2ZW50cyAqLworc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3pvb21ldltdID0geworCXsgMHgzOSwgU09OWVBJX0VWRU5UX1pPT01fUFJFU1NFRCB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIHRodW1icGhyYXNlIGV2ZW50cyAqLworc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3RodW1icGhyYXNlZXZbXSA9IHsKKwl7IDB4M2EsIFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VEIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgbW90aW9uZXllIGNhbWVyYSBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9tZXllZXZbXSA9IHsKKwl7IDB4MDAsIFNPTllQSV9FVkVOVF9NRVlFX0ZBQ0UgfSwKKwl7IDB4MDEsIFNPTllQSV9FVkVOVF9NRVlFX09QUE9TSVRFIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgbWVtb3J5c3RpY2sgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbWVtb3J5c3RpY2tldltdID0geworCXsgMHg1MywgU09OWVBJX0VWRU5UX01FTU9SWVNUSUNLX0lOU0VSVCB9LAorCXsgMHg1NCwgU09OWVBJX0VWRU5UX01FTU9SWVNUSUNLX0VKRUNUIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgYmF0dGVyeSBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9iYXR0ZXJ5ZXZbXSA9IHsKKwl7IDB4MjAsIFNPTllQSV9FVkVOVF9CQVRURVJZX0lOU0VSVCB9LAorCXsgMHgzMCwgU09OWVBJX0VWRU5UX0JBVFRFUllfUkVNT1ZFIH0sCisJeyAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50dHlwZXMgeworCWludAkJCW1vZGVsOworCXU4CQkJZGF0YTsKKwl1bnNpZ25lZCBsb25nCQltYXNrOworCXN0cnVjdCBzb255cGlfZXZlbnQgKglldmVudHM7Cit9IHNvbnlwaV9ldmVudHR5cGVzW10gPSB7CisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAwLCAweGZmZmZmZmZmLCBzb255cGlfcmVsZWFzZWV2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDcwLCBTT05ZUElfTUVZRV9NQVNLLCBzb255cGlfbWV5ZWV2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg2MCwgU09OWVBJX0NBUFRVUkVfTUFTSywgc29ueXBpX2NhcHR1cmVldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHgxMCwgU09OWVBJX0pPR0dFUl9NQVNLLCBzb255cGlfam9nZ2VyZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MjAsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHgzMCwgU09OWVBJX0JMVUVUT09USF9NQVNLLCBzb255cGlfYmx1ZWV2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDQwLCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4NDAsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKKworCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgzOCwgU09OWVBJX0xJRF9NQVNLLCBzb255cGlfbGlkZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MTEsIFNPTllQSV9KT0dHRVJfTUFTSywgc29ueXBpX2pvZ2dlcmV2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDYxLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDIxLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MzEsIFNPTllQSV9CTFVFVE9PVEhfTUFTSywgc29ueXBpX2JsdWVldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgwOCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgxMSwgU09OWVBJX0JBQ0tfTUFTSywgc29ueXBpX2JhY2tldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgwOCwgU09OWVBJX0hFTFBfTUFTSywgc29ueXBpX2hlbHBldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMSwgU09OWVBJX0hFTFBfTUFTSywgc29ueXBpX2hlbHBldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMSwgU09OWVBJX1pPT01fTUFTSywgc29ueXBpX3pvb21ldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMCwgU09OWVBJX1RIVU1CUEhSQVNFX01BU0ssIHNvbnlwaV90aHVtYnBocmFzZWV2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDMxLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4NDEsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MzEsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKKworCXsgMCB9Cit9OworCisjZGVmaW5lIFNPTllQSV9CVUZfU0laRQkxMjgKKworLyogVGhlIG5hbWUgb2YgdGhlIGRldmljZXMgZm9yIHRoZSBpbnB1dCBkZXZpY2UgZHJpdmVycyAqLworI2RlZmluZSBTT05ZUElfSk9HX0lOUFVUTkFNRQkiU29ueSBWYWlvIEpvZ2RpYWwiCisjZGVmaW5lIFNPTllQSV9LRVlfSU5QVVROQU1FCSJTb255IFZhaW8gS2V5cyIKKworLyogQ29ycmVzcG9uZGFuY2UgdGFibGUgYmV0d2VlbiBzb255cGkgZXZlbnRzIGFuZCBpbnB1dCBsYXllciBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWludCBzb255cGlldjsKKwlpbnQgaW5wdXRldjsKK30gc29ueXBpX2lucHV0a2V5c1tdID0geworCXsgU09OWVBJX0VWRU5UX0NBUFRVUkVfUFJFU1NFRCwJIAlLRVlfQ0FNRVJBIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfT05MWSwgCQlLRVlfRk4gfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9FU0MsIAkJS0VZX0ZOX0VTQyB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YxLCAJCUtFWV9GTl9GMSB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YyLCAJCUtFWV9GTl9GMiB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YzLCAJCUtFWV9GTl9GMyB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y0LCAJCUtFWV9GTl9GNCB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y1LCAJCUtFWV9GTl9GNSB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2LCAJCUtFWV9GTl9GNiB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y3LCAJCUtFWV9GTl9GNyB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y4LCAJCUtFWV9GTl9GOCB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5LAkJS0VZX0ZOX0Y5IH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjEwLAkJS0VZX0ZOX0YxMCB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMSwgCQlLRVlfRk5fRjExIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjEyLAkJS0VZX0ZOX0YxMiB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZXzEsIAkJS0VZX0ZOXzEgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV8yLCAJCUtFWV9GTl8yIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRCwJCQlLRVlfRk5fRCB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0UsCQkJS0VZX0ZOX0UgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9GLAkJCUtFWV9GTl9GIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfUywJCQlLRVlfRk5fUyB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0IsCQkJS0VZX0ZOX0IgfSwKKwl7IFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfUFJFU1NFRCwgCUtFWV9CTFVFIH0sCisJeyBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09OLCAJCUtFWV9CTFVFIH0sCisJeyBTT05ZUElfRVZFTlRfUEtFWV9QMSwgCQlLRVlfUFJPRzEgfSwKKwl7IFNPTllQSV9FVkVOVF9QS0VZX1AyLCAJCUtFWV9QUk9HMiB9LAorCXsgU09OWVBJX0VWRU5UX1BLRVlfUDMsIAkJS0VZX1BST0czIH0sCisJeyBTT05ZUElfRVZFTlRfQkFDS19QUkVTU0VELCAJCUtFWV9CQUNLIH0sCisJeyBTT05ZUElfRVZFTlRfSEVMUF9QUkVTU0VELCAJCUtFWV9IRUxQIH0sCisJeyBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VELCAJCUtFWV9aT09NIH0sCisJeyBTT05ZUElfRVZFTlRfVEhVTUJQSFJBU0VfUFJFU1NFRCwgCUJUTl9USFVNQiB9LAorCXsgMCwgMCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBzb255cGlfZGV2aWNlIHsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJdTE2IGlycTsKKwl1MTYgYml0czsKKwl1MTYgaW9wb3J0MTsKKwl1MTYgaW9wb3J0MjsKKwl1MTYgcmVnaW9uX3NpemU7CisJdTE2IGV2dHlwZV9vZmZzZXQ7CisJaW50IGNhbWVyYV9wb3dlcjsKKwlpbnQgYmx1ZXRvb3RoX3Bvd2VyOworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwlzdHJ1Y3Qga2ZpZm8gKmZpZm87CisJc3BpbmxvY2tfdCBmaWZvX2xvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3QgZmlmb19wcm9jX2xpc3Q7CisJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmZpZm9fYXN5bmM7CisJaW50IG9wZW5fY291bnQ7CisJaW50IG1vZGVsOworCXN0cnVjdCBpbnB1dF9kZXYgaW5wdXRfam9nX2RldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2IGlucHV0X2tleV9kZXY7CisJc3RydWN0IHdvcmtfc3RydWN0IGlucHV0X3dvcms7CisJc3RydWN0IGtmaWZvICppbnB1dF9maWZvOworCXNwaW5sb2NrX3QgaW5wdXRfZmlmb19sb2NrOworfSBzb255cGlfZGV2aWNlOworCisjZGVmaW5lIElURVJBVElPTlNfTE9ORwkJMTAwMDAKKyNkZWZpbmUgSVRFUkFUSU9OU19TSE9SVAkxMAorCisjZGVmaW5lIHdhaXRfb25fY29tbWFuZChxdWlldCwgY29tbWFuZCwgaXRlcmF0aW9ucykgeyBcCisJdW5zaWduZWQgaW50IG4gPSBpdGVyYXRpb25zOyBcCisJd2hpbGUgKC0tbiAmJiAoY29tbWFuZCkpIFwKKwkJdWRlbGF5KDEpOyBcCisJaWYgKCFuICYmICh2ZXJib3NlIHx8ICFxdWlldCkpIFwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic29ueXBpIGNvbW1hbmQgZmFpbGVkIGF0ICVzIDogJXMgKGxpbmUgJWQpXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKK30KKworI2lmZGVmIENPTkZJR19BQ1BJCisjZGVmaW5lIFNPTllQSV9BQ1BJX0FDVElWRSAoIWFjcGlfZGlzYWJsZWQpCisjZWxzZQorI2RlZmluZSBTT05ZUElfQUNQSV9BQ1RJVkUgMAorI2VuZGlmCQkJCS8qIENPTkZJR19BQ1BJICovCisKK3N0YXRpYyBpbnQgc29ueXBpX2VjX3dyaXRlKHU4IGFkZHIsIHU4IHZhbHVlKQoreworI2lmZGVmIENPTkZJR19BQ1BJX0VDCisJaWYgKFNPTllQSV9BQ1BJX0FDVElWRSkKKwkJcmV0dXJuIGVjX3dyaXRlKGFkZHIsIHZhbHVlKTsKKyNlbmRpZgorCXdhaXRfb25fY29tbWFuZCgxLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAzLCBJVEVSQVRJT05TX0xPTkcpOworCW91dGJfcCgweDgxLCBTT05ZUElfQ1NUX0lPUE9SVCk7CisJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CisJb3V0Yl9wKGFkZHIsIFNPTllQSV9EQVRBX0lPUE9SVCk7CisJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CisJb3V0Yl9wKHZhbHVlLCBTT05ZUElfREFUQV9JT1BPUlQpOworCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbnlwaV9lY19yZWFkKHU4IGFkZHIsIHU4ICp2YWx1ZSkKK3sKKyNpZmRlZiBDT05GSUdfQUNQSV9FQworCWlmIChTT05ZUElfQUNQSV9BQ1RJVkUpCisJCXJldHVybiBlY19yZWFkKGFkZHIsIHZhbHVlKTsKKyNlbmRpZgorCXdhaXRfb25fY29tbWFuZCgxLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAzLCBJVEVSQVRJT05TX0xPTkcpOworCW91dGJfcCgweDgwLCBTT05ZUElfQ1NUX0lPUE9SVCk7CisJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CisJb3V0Yl9wKGFkZHIsIFNPTllQSV9EQVRBX0lPUE9SVCk7CisJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CisJKnZhbHVlID0gaW5iX3AoU09OWVBJX0RBVEFfSU9QT1JUKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlY19yZWFkMTYodTggYWRkciwgdTE2ICp2YWx1ZSkKK3sKKwl1OCB2YWxfbGIsIHZhbF9oYjsKKwlpZiAoc29ueXBpX2VjX3JlYWQoYWRkciwgJnZhbF9sYikpCisJCXJldHVybiAtMTsKKwlpZiAoc29ueXBpX2VjX3JlYWQoYWRkciArIDEsICZ2YWxfaGIpKQorCQlyZXR1cm4gLTE7CisJKnZhbHVlID0gdmFsX2xiIHwgKHZhbF9oYiA8PCA4KTsKKwlyZXR1cm4gMDsKK30KKworLyogSW5pdGlhbGl6ZXMgdGhlIGRldmljZSAtIHRoaXMgY29tZXMgZnJvbSB0aGUgQU1MIGNvZGUgaW4gdGhlIEFDUEkgYmlvcyAqLworc3RhdGljIHZvaWQgc29ueXBpX3R5cGUxX3Nycyh2b2lkKQoreworCXUzMiB2OworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgJnYpOworCXYgPSAodiAmIDB4RkZGRjAwMDApIHwgKCh1MzIpIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsIHYpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgJnYpOworCXYgPSAodiAmIDB4RkZGMEZGRkYpIHwKKwkgICAgKCgodTMyKSBzb255cGlfZGV2aWNlLmlvcG9ydDEgXiBzb255cGlfZGV2aWNlLmlvcG9ydDIpIDw8IDE2KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgdik7CisKKwl2ID0gaW5sKFNPTllQSV9JUlFfUE9SVCk7CisJdiAmPSB+KCgodTMyKSAweDMpIDw8IFNPTllQSV9JUlFfU0hJRlQpOworCXYgfD0gKCgodTMyKSBzb255cGlfZGV2aWNlLmJpdHMpIDw8IFNPTllQSV9JUlFfU0hJRlQpOworCW91dGwodiwgU09OWVBJX0lSUV9QT1JUKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsICZ2KTsKKwl2ID0gKHYgJiAweEZGMUZGRkZGKSB8IDB4MDBDMDAwMDA7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsIHYpOworfQorCitzdGF0aWMgdm9pZCBzb255cGlfdHlwZTJfc3JzKHZvaWQpCit7CisJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0hJQiwgKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSAmIDB4RkYwMCkgPj4gOCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7CisJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0xPQiwgc29ueXBpX2RldmljZS5pb3BvcnQxICYgMHgwMEZGKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWNfd3JpdGUgZmFpbGVkXG4iKTsKKwlpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TSVJRLCBzb255cGlfZGV2aWNlLmJpdHMpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJlY193cml0ZSBmYWlsZWRcbiIpOworCXVkZWxheSgxMCk7Cit9CisKKy8qIERpc2FibGVzIHRoZSBkZXZpY2UgLSB0aGlzIGNvbWVzIGZyb20gdGhlIEFNTCBjb2RlIGluIHRoZSBBQ1BJIGJpb3MgKi8KK3N0YXRpYyB2b2lkIHNvbnlwaV90eXBlMV9kaXModm9pZCkKK3sKKwl1MzIgdjsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsICZ2KTsKKwl2ID0gdiAmIDB4RkYzRkZGRkY7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsIHYpOworCisJdiA9IGlubChTT05ZUElfSVJRX1BPUlQpOworCXYgfD0gKDB4MyA8PCBTT05ZUElfSVJRX1NISUZUKTsKKwlvdXRsKHYsIFNPTllQSV9JUlFfUE9SVCk7Cit9CisKK3N0YXRpYyB2b2lkIHNvbnlwaV90eXBlMl9kaXModm9pZCkKK3sKKwlpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TSElCLCAwKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWNfd3JpdGUgZmFpbGVkXG4iKTsKKwlpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TTE9CLCAwKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWNfd3JpdGUgZmFpbGVkXG4iKTsKKwlpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TSVJRLCAwKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWNfd3JpdGUgZmFpbGVkXG4iKTsKK30KKworc3RhdGljIHU4IHNvbnlwaV9jYWxsMSh1OCBkZXYpCit7CisJdTggdjEsIHYyOworCisJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MikgJiAyLCBJVEVSQVRJT05TX0xPTkcpOworCW91dGIoZGV2LCBzb255cGlfZGV2aWNlLmlvcG9ydDIpOworCXYxID0gaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQyKTsKKwl2MiA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7CisJcmV0dXJuIHYyOworfQorCitzdGF0aWMgdTggc29ueXBpX2NhbGwyKHU4IGRldiwgdTggZm4pCit7CisJdTggdjE7CisKKwl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQyKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CisJb3V0YihkZXYsIHNvbnlwaV9kZXZpY2UuaW9wb3J0Mik7CisJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MikgJiAyLCBJVEVSQVRJT05TX0xPTkcpOworCW91dGIoZm4sIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7CisJdjEgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDEpOworCXJldHVybiB2MTsKK30KKworc3RhdGljIHU4IHNvbnlwaV9jYWxsMyh1OCBkZXYsIHU4IGZuLCB1OCB2KQoreworCXU4IHYxOworCisJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MikgJiAyLCBJVEVSQVRJT05TX0xPTkcpOworCW91dGIoZGV2LCBzb255cGlfZGV2aWNlLmlvcG9ydDIpOworCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKKwlvdXRiKGZuLCBzb255cGlfZGV2aWNlLmlvcG9ydDEpOworCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKKwlvdXRiKHYsIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7CisJdjEgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDEpOworCXJldHVybiB2MTsKK30KKworI2lmIDAKKy8qIEdldCBicmlnaHRuZXNzLCBodWUgZXRjLiBVbnJlbGlhYmxlLi4uICovCitzdGF0aWMgdTggc29ueXBpX3JlYWQodTggZm4pCit7CisJdTggdjEsIHYyOworCWludCBuID0gMTAwOworCisJd2hpbGUgKG4tLSkgeworCQl2MSA9IHNvbnlwaV9jYWxsMigweDhmLCBmbik7CisJCXYyID0gc29ueXBpX2NhbGwyKDB4OGYsIGZuKTsKKwkJaWYgKHYxID09IHYyICYmIHYxICE9IDB4ZmYpCisJCQlyZXR1cm4gdjE7CisJfQorCXJldHVybiAweGZmOworfQorI2VuZGlmCisKKy8qIFNldCBicmlnaHRuZXNzLCBodWUgZXRjICovCitzdGF0aWMgdm9pZCBzb255cGlfc2V0KHU4IGZuLCB1OCB2KQoreworCXdhaXRfb25fY29tbWFuZCgwLCBzb255cGlfY2FsbDMoMHg5MCwgZm4sIHYpLCBJVEVSQVRJT05TX1NIT1JUKTsKK30KKworLyogVGVzdHMgaWYgdGhlIGNhbWVyYSBpcyByZWFkeSAqLworc3RhdGljIGludCBzb255cGlfY2FtZXJhX3JlYWR5KHZvaWQpCit7CisJdTggdjsKKworCXYgPSBzb255cGlfY2FsbDIoMHg4ZiwgU09OWVBJX0NBTUVSQV9TVEFUVVMpOworCXJldHVybiAodiAhPSAweGZmICYmICh2ICYgU09OWVBJX0NBTUVSQV9TVEFUVVNfUkVBRFkpKTsKK30KKworLyogVHVybnMgdGhlIGNhbWVyYSBvZmYgKi8KK3N0YXRpYyB2b2lkIHNvbnlwaV9jYW1lcmFfb2ZmKHZvaWQpCit7CisJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX1BJQ1RVUkUsIFNPTllQSV9DQU1FUkFfTVVURV9NQVNLKTsKKworCWlmICghc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXIpCisJCXJldHVybjsKKworCXNvbnlwaV9jYWxsMigweDkxLCAwKTsKKwlzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlciA9IDA7Cit9CisKKy8qIFR1cm5zIHRoZSBjYW1lcmEgb24gKi8KK3N0YXRpYyB2b2lkIHNvbnlwaV9jYW1lcmFfb24odm9pZCkKK3sKKwlpbnQgaSwgajsKKworCWlmIChzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlcikKKwkJcmV0dXJuOworCisJZm9yIChqID0gNTsgaiA+IDA7IGotLSkgeworCisJCXdoaWxlIChzb255cGlfY2FsbDIoMHg5MSwgMHgxKSkKKwkJCW1zbGVlcCgxMCk7CisJCXNvbnlwaV9jYWxsMSgweDkzKTsKKworCQlmb3IgKGkgPSA0MDA7IGkgPiAwOyBpLS0pIHsKKwkJCWlmIChzb255cGlfY2FtZXJhX3JlYWR5KCkpCisJCQkJYnJlYWs7CisJCQltc2xlZXAoMTApOworCQl9CisJCWlmIChpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGogPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzb255cGk6IGZhaWxlZCB0byBwb3dlciBvbiBjYW1lcmFcbiIpOworCQlyZXR1cm47CisJfQorCisJc29ueXBpX3NldCgweDEwLCAweDVhKTsKKwlzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlciA9IDE7Cit9CisKKy8qIHNldHMgdGhlIGJsdWV0b290aCBzdWJzeXN0ZW0gcG93ZXIgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIHNvbnlwaV9zZXRibHVldG9vdGhwb3dlcih1OCBzdGF0ZSkKK3sKKwlzdGF0ZSA9ICEhc3RhdGU7CisKKwlpZiAoc29ueXBpX2RldmljZS5ibHVldG9vdGhfcG93ZXIgPT0gc3RhdGUpCisJCXJldHVybjsKKworCXNvbnlwaV9jYWxsMigweDk2LCBzdGF0ZSk7CisJc29ueXBpX2NhbGwxKDB4ODIpOworCXNvbnlwaV9kZXZpY2UuYmx1ZXRvb3RoX3Bvd2VyID0gc3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkIGlucHV0X2tleXJlbGVhc2Uodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJaW50IGtleTsKKworCXdoaWxlICgxKSB7CisJCWlmIChrZmlmb19nZXQoc29ueXBpX2RldmljZS5pbnB1dF9maWZvLAorCQkJICAgICAgKHVuc2lnbmVkIGNoYXIgKikmaW5wdXRfZGV2LAorCQkJICAgICAgc2l6ZW9mKGlucHV0X2RldikpICE9IHNpemVvZihpbnB1dF9kZXYpKQorCQkJcmV0dXJuOworCQlpZiAoa2ZpZm9fZ2V0KHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbywKKwkJCSAgICAgICh1bnNpZ25lZCBjaGFyICopJmtleSwKKwkJCSAgICAgIHNpemVvZihrZXkpKSAhPSBzaXplb2Yoa2V5KSkKKwkJCXJldHVybjsKKworCQltc2xlZXAoMTApOworCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0X2Rldiwga2V5LCAwKTsKKwkJaW5wdXRfc3luYyhpbnB1dF9kZXYpOworCX0KK30KKworLyogSW50ZXJydXB0IGhhbmRsZXI6IHNvbWUgZXZlbnQgaXMgYXZhaWxhYmxlICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc29ueXBpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXU4IHYxLCB2MiwgZXZlbnQgPSAwOworCWludCBpLCBqOworCisJdjEgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDEpOworCXYyID0gaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQxICsgc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0KTsKKworCWZvciAoaSA9IDA7IHNvbnlwaV9ldmVudHR5cGVzW2ldLm1vZGVsOyBpKyspIHsKKwkJaWYgKHNvbnlwaV9kZXZpY2UubW9kZWwgIT0gc29ueXBpX2V2ZW50dHlwZXNbaV0ubW9kZWwpCisJCQljb250aW51ZTsKKwkJaWYgKCh2MiAmIHNvbnlwaV9ldmVudHR5cGVzW2ldLmRhdGEpICE9CisJCSAgICBzb255cGlfZXZlbnR0eXBlc1tpXS5kYXRhKQorCQkJY29udGludWU7CisJCWlmICghKG1hc2sgJiBzb255cGlfZXZlbnR0eXBlc1tpXS5tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBzb255cGlfZXZlbnR0eXBlc1tpXS5ldmVudHNbal0uZXZlbnQ7IGorKykgeworCQkJaWYgKHYxID09IHNvbnlwaV9ldmVudHR5cGVzW2ldLmV2ZW50c1tqXS5kYXRhKSB7CisJCQkJZXZlbnQgPSBzb255cGlfZXZlbnR0eXBlc1tpXS5ldmVudHNbal0uZXZlbnQ7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJfQorCX0KKworCWlmICh2ZXJib3NlKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAic29ueXBpOiB1bmtub3duIGV2ZW50IHBvcnQxPTB4JTAyeCxwb3J0Mj0weCUwMnhcbiIsCisJCSAgICAgICB2MSwgdjIpOworCS8qIFdlIG5lZWQgdG8gcmV0dXJuIElSUV9IQU5ETEVEIGhlcmUgYmVjYXVzZSB0aGVyZSAqYXJlKgorCSAqIGV2ZW50cyBiZWxvbmdpbmcgdG8gdGhlIHNvbnlwaSBkZXZpY2Ugd2UgZG9uJ3Qga25vdyBhYm91dCwKKwkgKiBidXQgd2Ugc3RpbGwgZG9uJ3Qgd2FudCB0aG9zZSB0byBwb2xsdXRlIHRoZSBsb2dzLi4uICovCisJcmV0dXJuIElSUV9IQU5ETEVEOworCitmb3VuZDoKKwlpZiAodmVyYm9zZSA+IDEpCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJzb255cGk6IGV2ZW50IHBvcnQxPTB4JTAyeCxwb3J0Mj0weCUwMnhcbiIsIHYxLCB2Mik7CisKKwlpZiAodXNlaW5wdXQpIHsKKwkJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfam9nX2RldiA9ICZzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXY7CisJCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2tleV9kZXYgPSAmc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2OworCQlzd2l0Y2ggKGV2ZW50KSB7CisJCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVA6CisJCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVBfUFJFU1NFRDoKKwkJCWlucHV0X3JlcG9ydF9yZWwoaW5wdXRfam9nX2RldiwgUkVMX1dIRUVMLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV046CisJCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTl9QUkVTU0VEOgorCQkJaW5wdXRfcmVwb3J0X3JlbChpbnB1dF9qb2dfZGV2LCBSRUxfV0hFRUwsIC0xKTsKKwkJCWJyZWFrOworCQljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1BSRVNTRUQ6IHsKKwkJCWludCBrZXkgPSBCVE5fTUlERExFOworCQkJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9qb2dfZGV2LCBrZXksIDEpOworCQkJa2ZpZm9fcHV0KHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbywKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopJmlucHV0X2pvZ19kZXYsCisJCQkJICBzaXplb2YoaW5wdXRfam9nX2RldikpOworCQkJa2ZpZm9fcHV0KHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbywKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopJmtleSwgc2l6ZW9mKGtleSkpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQ6CisJCQkvKiBOb3RoaW5nLCBub3QgYWxsIFZBSU9zIGdlbmVyYXRlIHRoaXMgZXZlbnQgKi8KKwkJCWJyZWFrOworCQl9CisJCWlucHV0X3N5bmMoaW5wdXRfam9nX2Rldik7CisKKwkJZm9yIChpID0gMDsgc29ueXBpX2lucHV0a2V5c1tpXS5zb255cGlldjsgaSsrKSB7CisJCQlpbnQga2V5OworCisJCQlpZiAoZXZlbnQgIT0gc29ueXBpX2lucHV0a2V5c1tpXS5zb255cGlldikKKwkJCQljb250aW51ZTsKKworCQkJa2V5ID0gc29ueXBpX2lucHV0a2V5c1tpXS5pbnB1dGV2OworCQkJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9rZXlfZGV2LCBrZXksIDEpOworCQkJa2ZpZm9fcHV0KHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbywKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopJmlucHV0X2tleV9kZXYsCisJCQkJICBzaXplb2YoaW5wdXRfa2V5X2RldikpOworCQkJa2ZpZm9fcHV0KHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbywKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopJmtleSwgc2l6ZW9mKGtleSkpOworCQl9CisJCWlucHV0X3N5bmMoaW5wdXRfa2V5X2Rldik7CisJCXNjaGVkdWxlX3dvcmsoJnNvbnlwaV9kZXZpY2UuaW5wdXRfd29yayk7CisJfQorCisJa2ZpZm9fcHV0KHNvbnlwaV9kZXZpY2UuZmlmbywgKHVuc2lnbmVkIGNoYXIgKikmZXZlbnQsIHNpemVvZihldmVudCkpOworCWtpbGxfZmFzeW5jKCZzb255cGlfZGV2aWNlLmZpZm9fYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNvbnlwaV9kZXZpY2UuZmlmb19wcm9jX2xpc3QpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBFeHRlcm5hbCBjYW1lcmEgY29tbWFuZCAoZXhwb3J0ZWQgdG8gdGhlIG1vdGlvbiBleWUgdjRsIGRyaXZlcikgKi8KK2ludCBzb255cGlfY2FtZXJhX2NvbW1hbmQoaW50IGNvbW1hbmQsIHU4IHZhbHVlKQoreworCWlmICghY2FtZXJhKQorCQlyZXR1cm4gLUVJTzsKKworCWRvd24oJnNvbnlwaV9kZXZpY2UubG9jayk7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQToKKwkJaWYgKHZhbHVlKQorCQkJc29ueXBpX2NhbWVyYV9vbigpOworCQllbHNlCisJCQlzb255cGlfY2FtZXJhX29mZigpOworCQlicmVhazsKKwljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUJSSUdIVE5FU1M6CisJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9CUklHSFRORVNTLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQ09OVFJBU1Q6CisJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9DT05UUkFTVCwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUhVRToKKwkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0hVRSwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUNPTE9SOgorCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQ09MT1IsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFTSEFSUE5FU1M6CisJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9TSEFSUE5FU1MsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFQSUNUVVJFOgorCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfUElDVFVSRSwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUFHQzoKKwkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0FHQywgdmFsdWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogc29ueXBpX2NhbWVyYV9jb21tYW5kIGludmFsaWQ6ICVkXG4iLAorCQkgICAgICAgY29tbWFuZCk7CisJCWJyZWFrOworCX0KKwl1cCgmc29ueXBpX2RldmljZS5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChzb255cGlfY2FtZXJhX2NvbW1hbmQpOworCitzdGF0aWMgaW50IHNvbnlwaV9taXNjX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCAmc29ueXBpX2RldmljZS5maWZvX2FzeW5jKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb255cGlfbWlzY19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXNvbnlwaV9taXNjX2Zhc3luYygtMSwgZmlsZSwgMCk7CisJZG93bigmc29ueXBpX2RldmljZS5sb2NrKTsKKwlzb255cGlfZGV2aWNlLm9wZW5fY291bnQtLTsKKwl1cCgmc29ueXBpX2RldmljZS5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb255cGlfbWlzY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWRvd24oJnNvbnlwaV9kZXZpY2UubG9jayk7CisJLyogRmx1c2ggaW5wdXQgcXVldWUgb24gZmlyc3Qgb3BlbiAqLworCWlmICghc29ueXBpX2RldmljZS5vcGVuX2NvdW50KQorCQlrZmlmb19yZXNldChzb255cGlfZGV2aWNlLmZpZm8pOworCXNvbnlwaV9kZXZpY2Uub3Blbl9jb3VudCsrOworCXVwKCZzb255cGlfZGV2aWNlLmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBzb255cGlfbWlzY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgY2hhciBjOworCisJaWYgKChrZmlmb19sZW4oc29ueXBpX2RldmljZS5maWZvKSA9PSAwKSAmJgorCSAgICAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzb255cGlfZGV2aWNlLmZpZm9fcHJvY19saXN0LAorCQkJCSAgICAgICBrZmlmb19sZW4oc29ueXBpX2RldmljZS5maWZvKSAhPSAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJd2hpbGUgKHJldCA8IGNvdW50ICYmCisJICAgICAgIChrZmlmb19nZXQoc29ueXBpX2RldmljZS5maWZvLCAmYywgc2l6ZW9mKGMpKSA9PSBzaXplb2YoYykpKSB7CisJCWlmIChwdXRfdXNlcihjLCBidWYrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0Kys7CisJfQorCisJaWYgKHJldCA+IDApIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpbm9kZS0+aV9hdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzb255cGlfbWlzY19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXBvbGxfd2FpdChmaWxlLCAmc29ueXBpX2RldmljZS5maWZvX3Byb2NfbGlzdCwgd2FpdCk7CisJaWYgKGtmaWZvX2xlbihzb255cGlfZGV2aWNlLmZpZm8pKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb255cGlfbWlzY19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQgPSAwOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXU4IHZhbDg7CisJdTE2IHZhbDE2OworCisJZG93bigmc29ueXBpX2RldmljZS5sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU09OWVBJX0lPQ0dCUlQ6CisJCWlmIChzb255cGlfZWNfcmVhZChTT05ZUElfTENEX0xJR0hULCAmdmFsOCkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfSU9DU0JSVDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCBhcmdwLCBzaXplb2YodmFsOCkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfTENEX0xJR0hULCB2YWw4KSkKKwkJCXJldCA9IC1FSU87CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0lPQ0dCQVQxQ0FQOgorCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQxX0ZVTEwsICZ2YWwxNikpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFNPTllQSV9JT0NHQkFUMVJFTToKKwkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMV9MRUZULCAmdmFsMTYpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfSU9DR0JBVDJDQVA6CisJCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDJfRlVMTCwgJnZhbDE2KSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0lPQ0dCQVQyUkVNOgorCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQyX0xFRlQsICZ2YWwxNikpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFNPTllQSV9JT0NHQkFURkxBR1M6CisJCWlmIChzb255cGlfZWNfcmVhZChTT05ZUElfQkFUX0ZMQUdTLCAmdmFsOCkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQl2YWw4ICY9IDB4MDc7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFNPTllQSV9JT0NHQkxVRToKKwkJdmFsOCA9IHNvbnlwaV9kZXZpY2UuYmx1ZXRvb3RoX3Bvd2VyOworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfSU9DU0JMVUU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsOCwgYXJncCwgc2l6ZW9mKHZhbDgpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXNvbnlwaV9zZXRibHVldG9vdGhwb3dlcih2YWw4KTsKKwkJYnJlYWs7CisJLyogRkFOIENvbnRyb2xzICovCisJY2FzZSBTT05ZUElfSU9DR0ZBTjoKKwkJaWYgKHNvbnlwaV9lY19yZWFkKFNPTllQSV9GQU4wX1NUQVRVUywgJnZhbDgpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcigodTggKilhcmcsICZ2YWw4LCBzaXplb2YodmFsOCkpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfSU9DU0ZBTjoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCAodTggKilhcmcsIHNpemVvZih2YWw4KSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9GQU4wX1NUQVRVUywgdmFsOCkpCisJCQlyZXQgPSAtRUlPOworCQlicmVhazsKKwkvKiBHRVQgVGVtcGVyYXR1cmUgKHVzZWZ1bCB1bmRlciBBUE0pICovCisJY2FzZSBTT05ZUElfSU9DR1RFTVA6CisJCWlmIChzb255cGlfZWNfcmVhZChTT05ZUElfVEVNUF9TVEFUVVMsICZ2YWw4KSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoKHU4ICopYXJnLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXVwKCZzb255cGlfZGV2aWNlLmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNvbnlwaV9taXNjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IHNvbnlwaV9taXNjX3JlYWQsCisJLnBvbGwJCT0gc29ueXBpX21pc2NfcG9sbCwKKwkub3BlbgkJPSBzb255cGlfbWlzY19vcGVuLAorCS5yZWxlYXNlCT0gc29ueXBpX21pc2NfcmVsZWFzZSwKKwkuZmFzeW5jCQk9IHNvbnlwaV9taXNjX2Zhc3luYywKKwkuaW9jdGwJCT0gc29ueXBpX21pc2NfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugc29ueXBpX21pc2NfZGV2aWNlID0geworCS5taW5vcgkJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUJCT0gInNvbnlwaSIsCisJLmZvcHMJCT0gJnNvbnlwaV9taXNjX2ZvcHMsCit9OworCitzdGF0aWMgdm9pZCBzb255cGlfZW5hYmxlKHVuc2lnbmVkIGludCBjYW1lcmFfb24pCit7CisJaWYgKHNvbnlwaV9kZXZpY2UubW9kZWwgPT0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMikKKwkJc29ueXBpX3R5cGUyX3NycygpOworCWVsc2UKKwkJc29ueXBpX3R5cGUxX3NycygpOworCisJc29ueXBpX2NhbGwxKDB4ODIpOworCXNvbnlwaV9jYWxsMigweDgxLCAweGZmKTsKKwlzb255cGlfY2FsbDEoY29tcGF0ID8gMHg5MiA6IDB4ODIpOworCisJLyogRW5hYmxlIEFDUEkgbW9kZSB0byBnZXQgRm4ga2V5IGV2ZW50cyAqLworCWlmICghU09OWVBJX0FDUElfQUNUSVZFICYmIGZua2V5aW5pdCkKKwkJb3V0YigweGYwLCAweGIyKTsKKworCWlmIChjYW1lcmEgJiYgY2FtZXJhX29uKQorCQlzb255cGlfY2FtZXJhX29uKCk7Cit9CisKK3N0YXRpYyBpbnQgc29ueXBpX2Rpc2FibGUodm9pZCkKK3sKKwlzb255cGlfY2FsbDIoMHg4MSwgMCk7CS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IG1vcmUgZXZlbnRzICovCisJaWYgKGNhbWVyYSkKKwkJc29ueXBpX2NhbWVyYV9vZmYoKTsKKworCS8qIGRpc2FibGUgQUNQSSBtb2RlICovCisJaWYgKCFTT05ZUElfQUNQSV9BQ1RJVkUgJiYgZm5rZXlpbml0KQorCQlvdXRiKDB4ZjEsIDB4YjIpOworCisJaWYgKHNvbnlwaV9kZXZpY2UubW9kZWwgPT0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMikKKwkJc29ueXBpX3R5cGUyX2RpcygpOworCWVsc2UKKwkJc29ueXBpX3R5cGUxX2RpcygpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IG9sZF9jYW1lcmFfcG93ZXI7CisKK3N0YXRpYyBpbnQgc29ueXBpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgc3RhdGUsIHUzMiBsZXZlbCkKK3sKKwlpZiAobGV2ZWwgPT0gU1VTUEVORF9ESVNBQkxFKSB7CisJCW9sZF9jYW1lcmFfcG93ZXIgPSBzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlcjsKKwkJc29ueXBpX2Rpc2FibGUoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29ueXBpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwlpZiAobGV2ZWwgPT0gUkVTVU1FX0VOQUJMRSkKKwkJc29ueXBpX2VuYWJsZShvbGRfY2FtZXJhX3Bvd2VyKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzb255cGlfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXNvbnlwaV9kaXNhYmxlKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzb255cGlfZHJpdmVyID0geworCS5uYW1lCQk9ICJzb255cGkiLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gc29ueXBpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzb255cGlfcmVzdW1lLAorI2VuZGlmCisJLnNodXRkb3duCT0gc29ueXBpX3NodXRkb3duLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc29ueXBpX3Byb2JlKHZvaWQpCit7CisJaW50IGksIHJldDsKKwlzdHJ1Y3Qgc29ueXBpX2lvcG9ydF9saXN0ICppb3BvcnRfbGlzdDsKKwlzdHJ1Y3Qgc29ueXBpX2lycV9saXN0ICppcnFfbGlzdDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCisJcGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQlQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMywgTlVMTCk7CisKKwlzb255cGlfZGV2aWNlLmRldiA9IHBjaWRldjsKKwlzb255cGlfZGV2aWNlLm1vZGVsID0gcGNpZGV2ID8KKwkJU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSA6IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTI7CisKKwlzcGluX2xvY2tfaW5pdCgmc29ueXBpX2RldmljZS5maWZvX2xvY2spOworCXNvbnlwaV9kZXZpY2UuZmlmbyA9IGtmaWZvX2FsbG9jKFNPTllQSV9CVUZfU0laRSwgR0ZQX0tFUk5FTCwKKwkJCQkJICZzb255cGlfZGV2aWNlLmZpZm9fbG9jayk7CisJaWYgKElTX0VSUihzb255cGlfZGV2aWNlLmZpZm8pKSB7CisJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBrZmlmb19hbGxvYyBmYWlsZWRcbiIpOworCQlyZXQgPSBQVFJfRVJSKHNvbnlwaV9kZXZpY2UuZmlmbyk7CisJCWdvdG8gb3V0X2ZpZm87CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmc29ueXBpX2RldmljZS5maWZvX3Byb2NfbGlzdCk7CisJaW5pdF9NVVRFWCgmc29ueXBpX2RldmljZS5sb2NrKTsKKwlzb255cGlfZGV2aWNlLmJsdWV0b290aF9wb3dlciA9IC0xOworCisJaWYgKHBjaWRldiAmJiBwY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWRcbiIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9wY2llbmFibGU7CisJfQorCisJaWYgKG1pbm9yICE9IC0xKQorCQlzb255cGlfbWlzY19kZXZpY2UubWlub3IgPSBtaW5vcjsKKwlpZiAoKHJldCA9IG1pc2NfcmVnaXN0ZXIoJnNvbnlwaV9taXNjX2RldmljZSkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBtaXNjX3JlZ2lzdGVyIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X21pc2NyZWc7CisJfQorCisJaWYgKHNvbnlwaV9kZXZpY2UubW9kZWwgPT0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMikgeworCQlpb3BvcnRfbGlzdCA9IHNvbnlwaV90eXBlMl9pb3BvcnRfbGlzdDsKKwkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFMl9SRUdJT05fU0laRTsKKwkJc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0ID0gU09OWVBJX1RZUEUyX0VWVFlQRV9PRkZTRVQ7CisJCWlycV9saXN0ID0gc29ueXBpX3R5cGUyX2lycV9saXN0OworCX0gZWxzZSB7CisJCWlvcG9ydF9saXN0ID0gc29ueXBpX3R5cGUxX2lvcG9ydF9saXN0OworCQlzb255cGlfZGV2aWNlLnJlZ2lvbl9zaXplID0gU09OWVBJX1RZUEUxX1JFR0lPTl9TSVpFOworCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTFfRVZUWVBFX09GRlNFVDsKKwkJaXJxX2xpc3QgPSBzb255cGlfdHlwZTFfaXJxX2xpc3Q7CisJfQorCisJZm9yIChpID0gMDsgaW9wb3J0X2xpc3RbaV0ucG9ydDE7IGkrKykgeworCQlpZiAocmVxdWVzdF9yZWdpb24oaW9wb3J0X2xpc3RbaV0ucG9ydDEsCisJCQkJICAgc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSwKKwkJCQkgICAiU29ueSBQcm9ncmFtYWJsZSBJL08gRGV2aWNlIikpIHsKKwkJCS8qIGdldCB0aGUgaW9wb3J0ICovCisJCQlzb255cGlfZGV2aWNlLmlvcG9ydDEgPSBpb3BvcnRfbGlzdFtpXS5wb3J0MTsKKwkJCXNvbnlwaV9kZXZpY2UuaW9wb3J0MiA9IGlvcG9ydF9saXN0W2ldLnBvcnQyOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFzb255cGlfZGV2aWNlLmlvcG9ydDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IHJlcXVlc3RfcmVnaW9uIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3JlcXJlZzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpcnFfbGlzdFtpXS5pcnE7IGkrKykgeworCisJCXNvbnlwaV9kZXZpY2UuaXJxID0gaXJxX2xpc3RbaV0uaXJxOworCQlzb255cGlfZGV2aWNlLmJpdHMgPSBpcnFfbGlzdFtpXS5iaXRzOworCisJCWlmICghcmVxdWVzdF9pcnEoc29ueXBpX2RldmljZS5pcnEsIHNvbnlwaV9pcnEsCisJCQkJIFNBX1NISVJRLCAic29ueXBpIiwgc29ueXBpX2lycSkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIWlycV9saXN0W2ldLmlycSkgeworCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogcmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfcmVxaXJxOworCX0KKworCWlmICh1c2VpbnB1dCkgeworCQkvKiBJbml0aWFsaXplIHRoZSBJbnB1dCBEcml2ZXJzOiBqb2dkaWFsICovCisJCWludCBpOworCQlzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYuZXZiaXRbMF0gPQorCQkJQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVMKTsKKwkJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2LmtleWJpdFtMT05HKEJUTl9NT1VTRSldID0KKwkJCUJJVChCVE5fTUlERExFKTsKKwkJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2LnJlbGJpdFswXSA9IEJJVChSRUxfV0hFRUwpOworCQlzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYubmFtZSA9CisJCQlrbWFsbG9jKHNpemVvZihTT05ZUElfSk9HX0lOUFVUTkFNRSksIEdGUF9LRVJORUwpOworCQlpZiAoIXNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5uYW1lKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaToga21hbGxvYyBmYWlsZWRcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2lua21hbGxvY2lucHV0MTsKKwkJfQorCQlzcHJpbnRmKHNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5uYW1lLCBTT05ZUElfSk9HX0lOUFVUTkFNRSk7CisJCXNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5pZC5idXN0eXBlID0gQlVTX0lTQTsKKwkJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2LmlkLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfU09OWTsKKworCQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJnNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIGlucHV0IG1ldGhvZCBpbnN0YWxsZWQuXG4iLAorCQkgICAgICAgc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2Lm5hbWUpOworCisJCS8qIEluaXRpYWxpemUgdGhlIElucHV0IERyaXZlcnM6IHNwZWNpYWwga2V5cyAqLworCQlzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKKwkJZm9yIChpID0gMDsgc29ueXBpX2lucHV0a2V5c1tpXS5zb255cGlldjsgaSsrKQorCQkJaWYgKHNvbnlwaV9pbnB1dGtleXNbaV0uaW5wdXRldikKKwkJCQlzZXRfYml0KHNvbnlwaV9pbnB1dGtleXNbaV0uaW5wdXRldiwKKwkJCQkJc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2LmtleWJpdCk7CisJCXNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5uYW1lID0KKwkJCWttYWxsb2Moc2l6ZW9mKFNPTllQSV9LRVlfSU5QVVROQU1FKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2Lm5hbWUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBrbWFsbG9jIGZhaWxlZFxuIik7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXRfaW5rbWFsbG9jaW5wdXQyOworCQl9CisJCXNwcmludGYoc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2Lm5hbWUsIFNPTllQSV9LRVlfSU5QVVROQU1FKTsKKwkJc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2LmlkLmJ1c3R5cGUgPSBCVVNfSVNBOworCQlzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYuaWQudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9TT05ZOworCisJCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgaW5wdXQgbWV0aG9kIGluc3RhbGxlZC5cbiIsCisJCSAgICAgICBzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYubmFtZSk7CisKKwkJc3Bpbl9sb2NrX2luaXQoJnNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmb19sb2NrKTsKKwkJc29ueXBpX2RldmljZS5pbnB1dF9maWZvID0KKwkJCWtmaWZvX2FsbG9jKFNPTllQSV9CVUZfU0laRSwgR0ZQX0tFUk5FTCwKKwkJCQkgICAgJnNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmb19sb2NrKTsKKwkJaWYgKElTX0VSUihzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaToga2ZpZm9fYWxsb2MgZmFpbGVkXG4iKTsKKwkJCXJldCA9IFBUUl9FUlIoc29ueXBpX2RldmljZS5pbnB1dF9maWZvKTsKKwkJCWdvdG8gb3V0X2luZmlmbzsKKwkJfQorCisJCUlOSVRfV09SSygmc29ueXBpX2RldmljZS5pbnB1dF93b3JrLCBpbnB1dF9rZXlyZWxlYXNlLCBOVUxMKTsKKwl9CisKKwlzb255cGlfZGV2aWNlLnBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJzb255cGkiLCAtMSwKKwkJCQkJCQkgICAgIE5VTEwsIDApOworCWlmIChJU19FUlIoc29ueXBpX2RldmljZS5wZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKHNvbnlwaV9kZXZpY2UucGRldik7CisJCWdvdG8gb3V0X3BsYXRmb3JtZGV2OworCX0KKworCXNvbnlwaV9lbmFibGUoMCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJzb255cGk6IFNvbnkgUHJvZ3JhbW1hYmxlIEkvTyBDb250cm9sbGVyIERyaXZlciIKKwkgICAgICAgInYlcy5cbiIsIFNPTllQSV9EUklWRVJfVkVSU0lPTik7CisJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBkZXRlY3RlZCAlcyBtb2RlbCwgIgorCSAgICAgICAidmVyYm9zZSA9ICVkLCBmbmtleWluaXQgPSAlcywgY2FtZXJhID0gJXMsICIKKwkgICAgICAgImNvbXBhdCA9ICVzLCBtYXNrID0gMHglMDhseCwgdXNlaW5wdXQgPSAlcywgYWNwaSA9ICVzXG4iLAorCSAgICAgICAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxKSA/CisJCQkidHlwZTEiIDogInR5cGUyIiwKKwkgICAgICAgdmVyYm9zZSwKKwkgICAgICAgZm5rZXlpbml0ID8gIm9uIiA6ICJvZmYiLAorCSAgICAgICBjYW1lcmEgPyAib24iIDogIm9mZiIsCisJICAgICAgIGNvbXBhdCA/ICJvbiIgOiAib2ZmIiwKKwkgICAgICAgbWFzaywKKwkgICAgICAgdXNlaW5wdXQgPyAib24iIDogIm9mZiIsCisJICAgICAgIFNPTllQSV9BQ1BJX0FDVElWRSA/ICJvbiIgOiAib2ZmIik7CisJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBlbmFibGVkIGF0IGlycT0lZCwgcG9ydDE9MHgleCwgcG9ydDI9MHgleFxuIiwKKwkgICAgICAgc29ueXBpX2RldmljZS5pcnEsCisJICAgICAgIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSwgc29ueXBpX2RldmljZS5pb3BvcnQyKTsKKworCWlmIChtaW5vciA9PSAtMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBkZXZpY2UgYWxsb2NhdGVkIG1pbm9yIGlzICVkXG4iLAorCQkgICAgICAgc29ueXBpX21pc2NfZGV2aWNlLm1pbm9yKTsKKworCXJldHVybiAwOworCitvdXRfcGxhdGZvcm1kZXY6CisJa2ZpZm9fZnJlZShzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pOworb3V0X2luZmlmbzoKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2KTsKKwlrZnJlZShzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYubmFtZSk7CitvdXRfaW5rbWFsbG9jaW5wdXQyOgorCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYpOworCWtmcmVlKHNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5uYW1lKTsKK291dF9pbmttYWxsb2NpbnB1dDE6CisJZnJlZV9pcnEoc29ueXBpX2RldmljZS5pcnEsIHNvbnlwaV9pcnEpOworb3V0X3JlcWlycToKKwlyZWxlYXNlX3JlZ2lvbihzb255cGlfZGV2aWNlLmlvcG9ydDEsIHNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUpOworb3V0X3JlcXJlZzoKKwltaXNjX2RlcmVnaXN0ZXIoJnNvbnlwaV9taXNjX2RldmljZSk7CitvdXRfbWlzY3JlZzoKKwlpZiAocGNpZGV2KQorCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpZGV2KTsKK291dF9wY2llbmFibGU6CisJa2ZpZm9fZnJlZShzb255cGlfZGV2aWNlLmZpZm8pOworb3V0X2ZpZm86CisJcGNpX2Rldl9wdXQoc29ueXBpX2RldmljZS5kZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzb255cGlfcmVtb3ZlKHZvaWQpCit7CisJc29ueXBpX2Rpc2FibGUoKTsKKworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNvbnlwaV9kZXZpY2UucGRldik7CisKKwlpZiAodXNlaW5wdXQpIHsKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldik7CisJCWtmcmVlKHNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5uYW1lKTsKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldik7CisJCWtmcmVlKHNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5uYW1lKTsKKwkJa2ZpZm9fZnJlZShzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pOworCX0KKworCWZyZWVfaXJxKHNvbnlwaV9kZXZpY2UuaXJxLCBzb255cGlfaXJxKTsKKwlyZWxlYXNlX3JlZ2lvbihzb255cGlfZGV2aWNlLmlvcG9ydDEsIHNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUpOworCW1pc2NfZGVyZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKTsKKwlpZiAoc29ueXBpX2RldmljZS5kZXYpCisJCXBjaV9kaXNhYmxlX2RldmljZShzb255cGlfZGV2aWNlLmRldik7CisJa2ZpZm9fZnJlZShzb255cGlfZGV2aWNlLmZpZm8pOworCXBjaV9kZXZfcHV0KHNvbnlwaV9kZXZpY2UuZGV2KTsKKwlwcmludGsoS0VSTl9JTkZPICJzb255cGk6IHJlbW92ZWQuXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgc29ueXBpX2RtaV90YWJsZVtdID0geworCXsKKwkJLmlkZW50ID0gIlNvbnkgVmFpbyIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQQ0ctIiksCisJCX0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJTb255IFZhaW8iLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVkdOLSIpLAorCQl9LAorCX0sCisJeyB9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBzb255cGlfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAoIWRtaV9jaGVja19zeXN0ZW0oc29ueXBpX2RtaV90YWJsZSkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gZHJpdmVyX3JlZ2lzdGVyKCZzb255cGlfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc29ueXBpX3Byb2JlKCk7CisJaWYgKHJldCkKKwkJZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlwaV9kcml2ZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNvbnlwaV9leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlwaV9kcml2ZXIpOworCXNvbnlwaV9yZW1vdmUoKTsKK30KKworbW9kdWxlX2luaXQoc29ueXBpX2luaXQpOworbW9kdWxlX2V4aXQoc29ueXBpX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jIGIvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ODlkNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMKQEAgLTAsMCArMSwyNjEwIEBACisvKgorICogICAgICBzcGVjaWFsaXguYyAgLS0gc3BlY2lhbGl4IElPOCsgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgIFJvZ2VyIFdvbGZmIChSLkUuV29sZmZAQml0V2l6YXJkLm5sKQorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiAgRG1pdHJ5IEdvcm9kY2hhbmluIChwZ21kc2dAaWJpLmNvbSkKKyAqCisgKiAgICAgIFNwZWNpYWxpeCBwYXlzIGZvciB0aGUgZGV2ZWxvcG1lbnQgYW5kIHN1cHBvcnQgb2YgdGhpcyBkcml2ZXIuCisgKiAgICAgIFBsZWFzZSBETyBjb250YWN0IGlvOC1saW51eEBzcGVjaWFsaXguY28udWsgaWYgeW91IHJlcXVpcmUKKyAqICAgICAgc3VwcG9ydC4gQnV0IHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIChzcGVjaWFsaXgudHh0KQorICogICAgICBmaXJzdC4KKyAqCisgKiAgICAgIFRoaXMgZHJpdmVyIHdhcyBkZXZlbG9wcGVkIGluIHRoZSBCaXRXaXphcmQgbGludXggZGV2aWNlCisgKiAgICAgIGRyaXZlciBzZXJ2aWNlLiBJZiB5b3UgcmVxdWlyZSBhIGxpbnV4IGRldmljZSBkcml2ZXIgZm9yIHlvdXIKKyAqICAgICAgcHJvZHVjdCwgcGxlYXNlIGNvbnRhY3QgZGV2aWNlc0BCaXRXaXphcmQubmwgZm9yIGEgcXVvdGUuCisgKgorICogICAgICBUaGlzIGNvZGUgaXMgZmlybWx5IGJhc2VkIG9uIHRoZSByaXNjb20vOCBzZXJpYWwgZHJpdmVyLAorICogICAgICB3cml0dGVuIGJ5IERtaXRyeSBHb3JvZGNoYW5pbi4gVGhlIHNwZWNpYWxpeCBJTzgrIGNhcmQKKyAqICAgICAgcHJvZ3JhbW1pbmcgaW5mb3JtYXRpb24gd2FzIG9idGFpbmVkIGZyb20gdGhlIENMLUNEMTg2NSBEYXRhCisgKiAgICAgIEJvb2ssIGFuZCBTcGVjaWFsaXggZG9jdW1lbnQgbnVtYmVyIDYyMDAwNTk6IElPOCsgSGFyZHdhcmUKKyAqICAgICAgRnVuY3Rpb25hbCBTcGVjaWZpY2F0aW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqICAgICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiAgICAgIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgIFVTQS4KKyAqCisgKiBSZXZpc2lvbiBoaXN0b3J5OgorICoKKyAqIFJldmlzaW9uIDEuMDogIEFwcmlsIDFzdCAxOTk3LgorICogICAgICAgICAgICAgICAgSW5pdGlhbCByZWxlYXNlIGZvciBhbHBoYSB0ZXN0aW5nLgorICogUmV2aXNpb24gMS4xOiAgQXByaWwgMTR0aCAxOTk3LiAKKyAqICAgICAgICAgICAgICAgIEluY29ycG9yYXRlZCBSaWNoYXJkIEh1ZHNvbnMgc3VnZ2VzdGlvbnMsIAorICogICAgICAgICAgICAgICAgcmVtb3ZlZCBzb21lIGRlYnVnZ2luZyBwcmludGsncy4KKyAqIFJldmlzaW9uIDEuMjogIEFwcmlsIDE1dGggMTk5Ny4KKyAqICAgICAgICAgICAgICAgIFBvcnRlZCB0byAyLjEueCBrZXJuZWxzLgorICogUmV2aXNpb24gMS4zOiAgQXByaWwgMTd0aCAxOTk3IAorICogICAgICAgICAgICAgICAgQmFja3BvcnRlZCB0byAyLjAuIChDb21wYXRpYmlsaXR5IG1hY3JvcykuIAorICogUmV2aXNpb24gMS40OiAgQXByaWwgMTh0aCAxOTk3CisgKiAgICAgICAgICAgICAgICBGaXhlZCBEVFIvUlRTIGJ1ZyB0aGF0IGNhdXNlZCB0aGUgY2FyZCB0byBpbmRpY2F0ZSAKKyAqICAgICAgICAgICAgICAgICJkb24ndCBzZW5kIGRhdGEiIHRvIGEgbW9kZW0gYWZ0ZXIgdGhlIHBhc3N3b3JkIHByb21wdC4gIAorICogICAgICAgICAgICAgICAgRml4ZWQgYnVnIGZvciBwcmVtYXR1cmUgKGZha2UpIGludGVycnVwdHMuCisgKiBSZXZpc2lvbiAxLjU6ICBBcHJpbCAxOXRoIDE5OTcKKyAqICAgICAgICAgICAgICAgIGZpeGVkIGEgbWlub3IgdHlwbyBpbiB0aGUgaGVhZGVyIGZpbGUsIGNsZWFudXAgYSBsaXR0bGUuIAorICogICAgICAgICAgICAgICAgcGVyZm9ybWFuY2Ugd2FybmluZ3MgYXJlIG5vdyBNQVhlZCBhdCBvbmNlIHBlciBtaW51dGUuCisgKiBSZXZpc2lvbiAxLjY6ICBNYXkgMjMgMTk5NworICogICAgICAgICAgICAgICAgQ2hhbmdlZCB0aGUgc3BlY2lhbGl4PS4uLiBmb3JtYXQgdG8gaW5jbHVkZSBpbnRlcnJ1cHQuCisgKiBSZXZpc2lvbiAxLjc6ICBNYXkgMjcgMTk5NworICogICAgICAgICAgICAgICAgTWFkZSBtYW55IG1vcmUgZGVidWcgcHJpbnRrJ3MgYSBjb21waWxlIHRpbWUgb3B0aW9uLgorICogUmV2aXNpb24gMS44OiAgSnVsIDEgIDE5OTcKKyAqICAgICAgICAgICAgICAgIHBvcnQgdG8gbGludXgtMi4xLjQzIGtlcm5lbC4KKyAqIFJldmlzaW9uIDEuOTogIE9jdCA5ICAxOTk4CisgKiAgICAgICAgICAgICAgICBBZGRlZCBzdHVmZiBmb3IgdGhlIElPOCsvUENJIHZlcnNpb24uCisgKiBSZXZpc2lvbiAxLjEwOiBPY3QgMjIgIDE5OTkgLyBKYW4gMjEgMjAwMC4gCisgKiAgICAgICAgICAgICAgICBBZGRlZCBzdHVmZiBmb3Igc2V0c2VyaWFsLiAKKyAqICAgICAgICAgICAgICAgIE5pY29sYXMgTWFpbGhvdCAoTmljb2xhcy5NYWlsaG90QGVtYWlsLmVuc3QuZnIpCisgKiAKKyAqLworCisjZGVmaW5lIFZFUlNJT04gIjEuMTEiCisKKworLyoKKyAqIFRoZXJlIGlzIGEgYnVuY2ggb2YgZG9jdW1lbnRhdGlvbiBhYm91dCB0aGUgY2FyZCwganVtcGVycywgY29uZmlnCisgKiBzZXR0aW5ncywgcmVzdHJpY3Rpb25zLCBjYWJsZXMsIGRldmljZSBuYW1lcyBhbmQgbnVtYmVycyBpbgorICogRG9jdW1lbnRhdGlvbi9zcGVjaWFsaXgudHh0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAic3BlY2lhbGl4X2lvOC5oIgorI2luY2x1ZGUgImNkMTg2NS5oIgorCisKKy8qCisgICBUaGlzIGRyaXZlciBjYW4gc3BldyBhIHdob2xlIGxvdCBvZiBkZWJ1Z2dpbmcgb3V0cHV0IGF0IHlvdS4gSWYgeW91CisgICBuZWVkIG1heGltdW0gcGVyZm9ybWFuY2UsIHlvdSBzaG91bGQgZGlzYWJsZSB0aGUgREVCVUcgZGVmaW5lLiBUbworICAgYWlkIGluIGRlYnVnZ2luZyBpbiB0aGUgZmllbGQsIEknbSBsZWF2aW5nIHRoZSBjb21waWxlLXRpbWUgZGVidWcKKyAgIGZlYXR1cmVzIGVuYWJsZWQsIGFuZCBkaXNhYmxlIHRoZW0gInJ1bnRpbWUiLiBUaGF0IGFsbG93cyBtZSB0bworICAgaW5zdHJ1Y3QgcGVvcGxlIHdpdGggcHJvYmxlbXMgdG8gZW5hYmxlIGRlYnVnZ2luZyB3aXRob3V0IHJlcXVpcmluZworICAgdGhlbSB0byByZWNvbXBpbGUuLi4KKyovCisjZGVmaW5lIERFQlVHCisKK3N0YXRpYyBpbnQgc3hfZGVidWc7CitzdGF0aWMgaW50IHN4X3J4ZmlmbyA9IFNQRUNJQUxJWF9SWEZJRk87CisKKyNpZmRlZiBERUJVRworI2RlZmluZSBkcHJpbnRrKGYsIHN0ci4uLikgaWYgKHN4X2RlYnVnICYgZikgcHJpbnRrIChzdHIpCisjZWxzZQorI2RlZmluZSBkcHJpbnRrKGYsIHN0ci4uLikgLyogbm90aGluZyAqLworI2VuZGlmCisKKyNkZWZpbmUgU1hfREVCVUdfRkxPVyAgICAweDAwMDEKKyNkZWZpbmUgU1hfREVCVUdfREFUQSAgICAweDAwMDIKKyNkZWZpbmUgU1hfREVCVUdfUFJPQkUgICAweDAwMDQKKyNkZWZpbmUgU1hfREVCVUdfQ0hBTiAgICAweDAwMDgKKyNkZWZpbmUgU1hfREVCVUdfSU5JVCAgICAweDAwMTAKKyNkZWZpbmUgU1hfREVCVUdfUlggICAgICAweDAwMjAKKyNkZWZpbmUgU1hfREVCVUdfVFggICAgICAweDAwNDAKKyNkZWZpbmUgU1hfREVCVUdfSVJRICAgICAweDAwODAKKyNkZWZpbmUgU1hfREVCVUdfT1BFTiAgICAweDAxMDAKKyNkZWZpbmUgU1hfREVCVUdfVEVSTUlPUyAweDAyMDAKKyNkZWZpbmUgU1hfREVCVUdfU0lHTkFMUyAweDA0MDAKKyNkZWZpbmUgU1hfREVCVUdfRklGTyAgICAweDA4MDAKKworCisjZGVmaW5lIGZ1bmNfZW50ZXIoKSBkcHJpbnRrIChTWF9ERUJVR19GTE9XLCAiaW84OiBlbnRlciAlc1xuIixfX0ZVTkNUSU9OX18pCisjZGVmaW5lIGZ1bmNfZXhpdCgpICBkcHJpbnRrIChTWF9ERUJVR19GTE9XLCAiaW84OiBleGl0ICAlc1xuIiwgX19GVU5DVElPTl9fKQorCisjZGVmaW5lIGppZmZpZXNfZnJvbV9tcyhhKSAoKCgoYSkgKiBIWikvMTAwMCkrMSkKKworCisvKiBDb25maWd1cmFibGUgb3B0aW9uczogKi8KKworLyogQW0gSSBwYXJhbm9pZCBvciBub3QgPyA7LSkgKi8KKyNkZWZpbmUgU1BFQ0lBTElYX1BBUkFOT0lBX0NIRUNLCisKKy8qIERvIEkgdHJ1c3QgdGhlIElSUSBmcm9tIHRoZSBjYXJkPyAoZW5hYmVsaW5nIGl0IGRvZXNuJ3Qgc2VlbSB0byBoZWxwKQorICAgV2hlbiB0aGUgSVJRIHJvdXRpbmUgbGVhdmVzIHRoZSBjaGlwIGluIGEgc3RhdGUgdGhhdCBpcyBrZWVwcyBvbgorICAgcmVxdWlyaW5nIGF0dGVudGlvbiwgdGhlIHRpbWVyIGRvZXNuJ3QgaGVscCBlaXRoZXIuICovCisjdW5kZWYgU1BFQ0lBTElYX1RJTUVSCisKKyNpZmRlZiBTUEVDSUFMSVhfVElNRVIKK3N0YXRpYyBpbnQgc3hfcG9sbCA9IEhaOworI2VuZGlmCisKKworCisvKiAKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBCdXQgaWYgeW91IG5lZWQKKyAqIHNvbWUgbmljZSByZXBvcnRpbmcgaW4geW91ciBzeXNsb2csIHlvdSBjYW4gZGVmaW5lIHRoZW0gYWxzby4KKyAqLworI3VuZGVmIFNYX1JFUE9SVF9GSUZPCisjdW5kZWYgU1hfUkVQT1JUX09WRVJSVU4KKworCisKKyNpZmRlZiBDT05GSUdfU1BFQ0lBTElYX1JUU0NUUworI2RlZmluZSBTWF9DUlRTQ1RTKGJsYSkgMQorI2Vsc2UKKyNkZWZpbmUgU1hfQ1JUU0NUUyh0dHkpIENfQ1JUU0NUUyh0dHkpCisjZW5kaWYKKworCisvKiBVc2VkIHRvIGJlIG91dGIgKDB4ZmYsIDB4ODApOyAqLworI2RlZmluZSBzaG9ydF9wYXVzZSgpIHVkZWxheSAoMSkKKworCisjZGVmaW5lIFNQRUNJQUxJWF9MRUdBTF9GTEFHUyBcCisJKEFTWU5DX0hVUF9OT1RJRlkgICB8IEFTWU5DX1NBSyAgICAgICAgICB8IEFTWU5DX1NQTElUX1RFUk1JT1MgICB8IFwKKwkgQVNZTkNfU1BEX0hJICAgICAgIHwgQVNZTkNfU1BFRURfVkhJICAgIHwgQVNZTkNfU0VTU0lPTl9MT0NLT1VUIHwgXAorCSBBU1lOQ19QR1JQX0xPQ0tPVVQgfCBBU1lOQ19DQUxMT1VUX05PSFVQKQorCisjdW5kZWYgUlNfRVZFTlRfV1JJVEVfV0FLRVVQCisjZGVmaW5lIFJTX0VWRU5UX1dSSVRFX1dBS0VVUAkwCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc3BlY2lhbGl4X2RyaXZlcjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICogdG1wX2J1ZjsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmF1ZF90YWJsZVtdID0gIHsKKwkwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsCisJOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAwLCAKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkIHN4X2JvYXJkW1NYX05CT0FSRF0gPSAgeworCXsgMCwgU1hfSU9CQVNFMSwgIDksIH0sCisJeyAwLCBTWF9JT0JBU0UyLCAxMSwgfSwKKwl7IDAsIFNYX0lPQkFTRTMsIDEyLCB9LAorCXsgMCwgU1hfSU9CQVNFNCwgMTUsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHNwZWNpYWxpeF9wb3J0IHN4X3BvcnRbU1hfTkJPQVJEICogU1hfTlBPUlRdOworCisKKyNpZmRlZiBTUEVDSUFMSVhfVElNRVIKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBtaXNzZWRfaXJxX3RpbWVyOworc3RhdGljIGlycXJldHVybl90IHN4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworI2VuZGlmCisKKworCitzdGF0aWMgaW5saW5lIGludCBzeF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgY29uc3QgKiBwb3J0LAorCQkJCSAgICBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworI2lmZGVmIFNQRUNJQUxJWF9QQVJBTk9JQV9DSEVDSworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRtYWdpYyA9CisJCUtFUk5fRVJSICJzeDogV2FybmluZzogYmFkIHNwZWNpYWxpeCBwb3J0IG1hZ2ljIG51bWJlciBmb3IgZGV2aWNlICVzIGluICVzXG4iOworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRpbmZvID0KKwkJS0VSTl9FUlIgInN4OiBXYXJuaW5nOiBudWxsIHNwZWNpYWxpeCBwb3J0IGZvciBkZXZpY2UgJXMgaW4gJXNcbiI7CisgCisJaWYgKCFwb3J0KSB7CisJCXByaW50ayhiYWRpbmZvLCBuYW1lLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChwb3J0LT5tYWdpYyAhPSBTUEVDSUFMSVhfTUFHSUMpIHsKKwkJcHJpbnRrKGJhZG1hZ2ljLCBuYW1lLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIAorICogIFNlcnZpY2UgZnVuY3Rpb25zIGZvciBzcGVjaWFsaXggSU84KyBkcml2ZXIuCisgKiAKKyAqLworCisvKiBHZXQgYm9hcmQgbnVtYmVyIGZyb20gcG9pbnRlciAqLworc3RhdGljIGlubGluZSBpbnQgYm9hcmRfTm8gKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKiBicCkKK3sKKwlyZXR1cm4gYnAgLSBzeF9ib2FyZDsKK30KKworCisvKiBHZXQgcG9ydCBudW1iZXIgZnJvbSBwb2ludGVyICovCitzdGF0aWMgaW5saW5lIGludCBwb3J0X05vIChzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgY29uc3QgKiBwb3J0KQoreworCXJldHVybiBTWF9QT1JUKHBvcnQgLSBzeF9wb3J0KTsgCit9CisKKworLyogR2V0IHBvaW50ZXIgdG8gYm9hcmQgZnJvbSBwb2ludGVyIHRvIHBvcnQgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqIHBvcnRfQm9hcmQoc3RydWN0IHNwZWNpYWxpeF9wb3J0IGNvbnN0ICogcG9ydCkKK3sKKwlyZXR1cm4gJnN4X2JvYXJkW1NYX0JPQVJEKHBvcnQgLSBzeF9wb3J0KV07Cit9CisKKworLyogSW5wdXQgQnl0ZSBmcm9tIENMIENEMTg2eCByZWdpc3RlciAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHN4X2luKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgICogYnAsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlicC0+cmVnID0gcmVnIHwgMHg4MDsKKwlvdXRiIChyZWcgfCAweDgwLCBicC0+YmFzZSArIFNYX0FERFJfUkVHKTsKKwlyZXR1cm4gaW5iICAoYnAtPmJhc2UgKyBTWF9EQVRBX1JFRyk7Cit9CisKKworLyogT3V0cHV0IEJ5dGUgdG8gQ0wgQ0QxODZ4IHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3hfb3V0KHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgICogYnAsIHVuc2lnbmVkIHNob3J0IHJlZywKKwkJCSAgdW5zaWduZWQgY2hhciB2YWwpCit7CisJYnAtPnJlZyA9IHJlZyB8IDB4ODA7CisJb3V0YiAocmVnIHwgMHg4MCwgYnAtPmJhc2UgKyBTWF9BRERSX1JFRyk7CisJb3V0YiAodmFsLCBicC0+YmFzZSArIFNYX0RBVEFfUkVHKTsKK30KKworCisvKiBJbnB1dCBCeXRlIGZyb20gQ0wgQ0QxODZ4IHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgc3hfaW5fb2ZmKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgICogYnAsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlicC0+cmVnID0gcmVnOworCW91dGIgKHJlZywgYnAtPmJhc2UgKyBTWF9BRERSX1JFRyk7CisJcmV0dXJuIGluYiAgKGJwLT5iYXNlICsgU1hfREFUQV9SRUcpOworfQorCisKKy8qIE91dHB1dCBCeXRlIHRvIENMIENEMTg2eCByZWdpc3RlciAqLworc3RhdGljIGlubGluZSB2b2lkIHN4X291dF9vZmYoc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAgKiBicCwgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJICB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlicC0+cmVnID0gcmVnOworCW91dGIgKHJlZywgYnAtPmJhc2UgKyBTWF9BRERSX1JFRyk7CisJb3V0YiAodmFsLCBicC0+YmFzZSArIFNYX0RBVEFfUkVHKTsKK30KKworCisvKiBXYWl0IGZvciBDaGFubmVsIENvbW1hbmQgUmVnaXN0ZXIgcmVhZHkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF93YWl0X0NDUihzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICAqIGJwKQoreworCXVuc2lnbmVkIGxvbmcgZGVsYXksIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgY2NyOworCisJZm9yIChkZWxheSA9IFNYX0NDUl9USU1FT1VUOyBkZWxheTsgZGVsYXktLSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJY2NyID0gc3hfaW4oYnAsIENEMTg2eF9DQ1IpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCQlpZiAoIWNjcikKKwkJCXJldHVybjsKKwkJdWRlbGF5ICgxKTsKKwl9CisJCisJcHJpbnRrKEtFUk5fRVJSICJzeCVkOiBUaW1lb3V0IHdhaXRpbmcgZm9yIENDUi5cbiIsIGJvYXJkX05vKGJwKSk7Cit9CisKKworLyogV2FpdCBmb3IgQ2hhbm5lbCBDb21tYW5kIFJlZ2lzdGVyIHJlYWR5ICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3hfd2FpdF9DQ1Jfb2ZmKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgICogYnApCit7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKKwl1bnNpZ25lZCBjaGFyIGNycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZm9yIChkZWxheSA9IFNYX0NDUl9USU1FT1VUOyBkZWxheTsgZGVsYXktLSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJY3JyID0gc3hfaW5fb2ZmKGJwLCBDRDE4NnhfQ0NSKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKCFjcnIpCisJCQlyZXR1cm47CisJCXVkZWxheSAoMSk7CisJfQorCQorCXByaW50ayhLRVJOX0VSUiAic3glZDogVGltZW91dCB3YWl0aW5nIGZvciBDQ1IuXG4iLCBib2FyZF9ObyhicCkpOworfQorCisKKy8qCisgKiAgc3BlY2lhbGl4IElPOCsgSU8gcmFuZ2UgZnVuY3Rpb25zLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHN4X2NoZWNrX2lvX3JhbmdlKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKiBicCkKK3sKKwlyZXR1cm4gY2hlY2tfcmVnaW9uIChicC0+YmFzZSwgU1hfSU9fU1BBQ0UpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF9yZXF1ZXN0X2lvX3JhbmdlKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKiBicCkKK3sKKwlyZXF1ZXN0X3JlZ2lvbihicC0+YmFzZSwgCisJICAgICAgICAgICAgICAgYnAtPmZsYWdzJlNYX0JPQVJEX0lTX1BDST9TWF9QQ0lfSU9fU1BBQ0U6U1hfSU9fU1BBQ0UsCisJICAgICAgICAgICAgICAgInNwZWNpYWxpeCBJTzgrIiApOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF9yZWxlYXNlX2lvX3JhbmdlKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKiBicCkKK3sKKwlyZWxlYXNlX3JlZ2lvbihicC0+YmFzZSwgCisJICAgICAgICAgICAgICAgYnAtPmZsYWdzJlNYX0JPQVJEX0lTX1BDST9TWF9QQ0lfSU9fU1BBQ0U6U1hfSU9fU1BBQ0UpOworfQorCisJCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGVuYWJsZWQgaW50ZXJydXB0cyAqLworLyogVWdseS4gVmVyeSB1Z2x5LiBEb24ndCB1c2UgdGhpcyBmb3IgYW55dGhpbmcgZWxzZSB0aGFuIGluaXRpYWxpemF0aW9uIAorICAgY29kZSAqLworc3RhdGljIGlubGluZSB2b2lkIHN4X2xvbmdfZGVsYXkodW5zaWduZWQgbG9uZyBkZWxheSkKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJCisJZm9yIChpID0gamlmZmllcyArIGRlbGF5OyB0aW1lX2FmdGVyKGksIGppZmZpZXMpOyApIDsKK30KKworCisKKy8qIFNldCB0aGUgSVJRIHVzaW5nIHRoZSBSVFMgbGluZXMgdGhhdCBydW4gdG8gdGhlIFBBTCBvbiB0aGUgYm9hcmQuLi4uICovCitzdGF0aWMgaW50IHN4X3NldF9pcnEgKCBzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicCkKK3sKKwlpbnQgdmlycTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGJwLT5mbGFncyAmIFNYX0JPQVJEX0lTX1BDSSkgCisJCXJldHVybiAxOworCXN3aXRjaCAoYnAtPmlycSkgeworCS8qIEluIHRoZSBzYW1lIG9yZGVyIGFzIGluIHRoZSBkb2NzLi4uICovCisJY2FzZSAxNTogdmlycSA9IDA7YnJlYWs7CisJY2FzZSAxMjogdmlycSA9IDE7YnJlYWs7CisJY2FzZSAxMTogdmlycSA9IDI7YnJlYWs7CisJY2FzZSA5OiAgdmlycSA9IDM7YnJlYWs7CisJZGVmYXVsdDogcHJpbnRrIChLRVJOX0VSUiAiU3BlY2xpYWxpeDogY2Fubm90IHNldCBpcnEgdG8gJWQuXG4iLCBicC0+aXJxKTsKKwkgICAgICAgICByZXR1cm4gMDsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJZm9yIChpPTA7aTwyO2krKykgeworCQlzeF9vdXQoYnAsIENEMTg2eF9DQVIsIGkpOworCQlzeF9vdXQoYnAsIENEMTg2eF9NU1ZSVFMsICgodmlycSA+PiBpKSAmIDB4MSk/IE1TVlJfUlRTOjApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAxOworfQorCisKKy8qIFJlc2V0IGFuZCBzZXR1cCBDRDE4NnggY2hpcCAqLworc3RhdGljIGludCBzeF9pbml0X0NEMTg2eChzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICAqIGJwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHNjYWxlcjsKKwlpbnQgcnYgPSAxOworCisJZnVuY19lbnRlcigpOworCXN4X3dhaXRfQ0NSX29mZihicCk7CQkJICAgLyogV2FpdCBmb3IgQ0NSIHJlYWR5ICAgICAgICAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X291dF9vZmYoYnAsIENEMTg2eF9DQ1IsIENDUl9IQVJEUkVTRVQpOyAgICAgIC8qIFJlc2V0IENEMTg2eCBjaGlwICAgICAgICAgICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF9sb25nX2RlbGF5KEhaLzIwKTsgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgMC4wNSBzZWMgICAgICAgICAgICAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X291dF9vZmYoYnAsIENEMTg2eF9HSVZSLCBTWF9JRCk7ICAgICAgICAgICAgIC8qIFNldCBJRCBmb3IgdGhpcyBjaGlwICAgICAgKi8KKwlzeF9vdXRfb2ZmKGJwLCBDRDE4NnhfR0lDUiwgMCk7ICAgICAgICAgICAgICAgICAvKiBDbGVhciBhbGwgYml0cyAgICAgICAgICAgICovCisJc3hfb3V0X29mZihicCwgQ0QxODZ4X1BJTFIxLCBTWF9BQ0tfTUlOVCk7ICAgICAgLyogUHJpbyBmb3IgbW9kZW0gaW50ciAgICAgICAqLworCXN4X291dF9vZmYoYnAsIENEMTg2eF9QSUxSMiwgU1hfQUNLX1RJTlQpOyAgICAgIC8qIFByaW8gZm9yIHRyYW5zbWl0dGVyIGludHIgKi8KKwlzeF9vdXRfb2ZmKGJwLCBDRDE4NnhfUElMUjMsIFNYX0FDS19SSU5UKTsgICAgICAvKiBQcmlvIGZvciByZWNlaXZlciBpbnRyICAgICovCisJLyogU2V0IFJlZ0Fja0VuICovCisJc3hfb3V0X29mZihicCwgQ0QxODZ4X1NSQ1IsIHN4X2luIChicCwgQ0QxODZ4X1NSQ1IpIHwgU1JDUl9SRUdBQ0tFTik7CisJCisJLyogU2V0dGluZyB1cCBwcmVzY2FsZXIuIFdlIG5lZWQgNCB0aWNrcyBwZXIgMSBtcyAqLworCXNjYWxlciA9ICBTWF9PU0NGUkVRL1NQRUNJQUxJWF9UUFM7CisKKwlzeF9vdXRfb2ZmKGJwLCBDRDE4NnhfUFBSSCwgc2NhbGVyID4+IDgpOworCXN4X291dF9vZmYoYnAsIENEMTg2eF9QUFJMLCBzY2FsZXIgJiAweGZmKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFzeF9zZXRfaXJxIChicCkpIHsKKwkJLyogRmlndXJlIG91dCBob3cgdG8gcGFzcyB0aGlzIGFsb25nLi4uICovCisJCXByaW50ayAoS0VSTl9FUlIgIkNhbm5vdCBzZXQgaXJxIHRvICVkLlxuIiwgYnAtPmlycSk7CisJCXJ2ID0gMDsKKwl9CisKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gcnY7Cit9CisKKworc3RhdGljIGludCByZWFkX2Nyb3NzX2J5dGUgKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwLCBpbnQgcmVnLCBpbnQgYml0KQoreworCWludCBpOworCWludCB0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGk9MCwgdD0wO2k8ODtpKyspIHsKKwkJc3hfb3V0X29mZiAoYnAsIENEMTg2eF9DQVIsIGkpOworCQlpZiAoc3hfaW5fb2ZmIChicCwgcmVnKSAmIGJpdCkgCisJCQl0IHw9IDEgPDwgaTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiB0OworfQorCisKKyNpZmRlZiBTUEVDSUFMSVhfVElNRVIKK3ZvaWQgbWlzc2VkX2lycSAodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGNoYXIgaXJxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAgKmJwID0gKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKilkYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJaXJxID0gc3hfaW4gKChzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICopZGF0YSwgQ0QxODZ4X1NSU1IpICYKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTUlNSX1JSRVFpbnQgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNSU1JfVFJFUWludCB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JTUl9NUkVRaW50KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCWlmIChpcnEpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gIk1pc3NlZCBpbnRlcnJ1cHQuLi4gQ2FsbGluZyBpbnQgZnJvbSB0aW1lci4gXG4iKTsKKwkJc3hfaW50ZXJydXB0ICgoKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKilkYXRhKS0+aXJxLCAKKwkJICAgICAgICAgICAgICAodm9pZCopZGF0YSwgTlVMTCk7CisJfQorCW1pc3NlZF9pcnFfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBzeF9wb2xsOworCWFkZF90aW1lciAoJm1pc3NlZF9pcnFfdGltZXIpOworfQorI2VuZGlmCisKKworCisvKiBNYWluIHByb2Jpbmcgcm91dGluZSwgYWxzbyBzZXRzIGlycS4gKi8KK3N0YXRpYyBpbnQgc3hfcHJvYmUoc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnApCit7CisJdW5zaWduZWQgY2hhciB2YWwxLCB2YWwyOworI2lmIDAKKwlpbnQgaXJxcyA9IDA7CisJaW50IHJldHJpZXM7CisjZW5kaWYKKwlpbnQgcmV2OworCWludCBjaGlwOworCisJZnVuY19lbnRlcigpOworCisJaWYgKHN4X2NoZWNrX2lvX3JhbmdlKGJwKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogQXJlIHRoZSBJL08gcG9ydHMgaGVyZSA/ICovCisJc3hfb3V0X29mZihicCwgQ0QxODZ4X1BQUkwsIDB4NWEpOworCXNob3J0X3BhdXNlICgpOworCXZhbDEgPSBzeF9pbl9vZmYoYnAsIENEMTg2eF9QUFJMKTsKKworCXN4X291dF9vZmYoYnAsIENEMTg2eF9QUFJMLCAweGE1KTsKKwlzaG9ydF9wYXVzZSAoKTsKKwl2YWwyID0gc3hfaW5fb2ZmKGJwLCBDRDE4NnhfUFBSTCk7CisKKwkKKwlpZiAoKHZhbDEgIT0gMHg1YSkgfHwgKHZhbDIgIT0gMHhhNSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic3glZDogc3BlY2lhbGl4IElPOCsgQm9hcmQgYXQgMHglMDN4IG5vdCBmb3VuZC5cbiIsCisJCSAgICAgICBib2FyZF9ObyhicCksIGJwLT5iYXNlKTsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAxOworCX0KKworCS8qIENoZWNrIHRoZSBEU1IgbGluZXMgdGhhdCBTcGVjaWFsaXggdXNlcyBhcyBib2FyZCAKKwkgICBpZGVudGlmaWNhdGlvbiAqLworCXZhbDEgPSByZWFkX2Nyb3NzX2J5dGUgKGJwLCBDRDE4NnhfTVNWUiwgTVNWUl9EU1IpOworCXZhbDIgPSByZWFkX2Nyb3NzX2J5dGUgKGJwLCBDRDE4NnhfTVNWUiwgTVNWUl9SVFMpOworCWRwcmludGsgKFNYX0RFQlVHX0lOSVQsICJzeCVkOiBEU1IgbGluZXMgYXJlOiAlMDJ4LCBydHMgbGluZXMgYXJlOiAlMDJ4XG4iLAorCSAgICAgICAgYm9hcmRfTm8oYnApLCAgdmFsMSwgdmFsMik7CisKKwkvKiBUaGV5IG1hbmFnZWQgdG8gc3dpdGNoIHRoZSBiaXQgb3JkZXIgYmV0d2VlbiB0aGUgZG9jcyBhbmQKKwkgICB0aGUgSU84KyBjYXJkLiBUaGUgbmV3IFBDSSBjYXJkIG5vdyBjb25mb3JtcyB0byBvbGQgZG9jcy4KKwkgICBUaGV5IGNoYW5nZWQgdGhlIFBDSSBkb2NzIHRvIHJlZmxlY3QgdGhlIHNpdHVhdGlvbiBvbiB0aGUKKwkgICBvbGQgY2FyZC4gKi8KKwl2YWwyID0gKGJwLT5mbGFncyAmIFNYX0JPQVJEX0lTX1BDSSk/MHg0ZCA6IDB4YjI7CisJaWYgKHZhbDEgIT0gdmFsMikgeworCQlwcmludGsoS0VSTl9JTkZPICJzeCVkOiBzcGVjaWFsaXggSU84KyBJRCAlMDJ4IGF0IDB4JTAzeCBub3QgZm91bmQgKCUwMngpLlxuIiwKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgdmFsMiwgYnAtPmJhc2UsIHZhbDEpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIDE7CisJfQorCisKKyNpZiAwCisJLyogSXQncyB0aW1lIHRvIGZpbmQgSVJRIGZvciB0aGlzIGJvYXJkICovCisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDUgJiYgaXJxcyA8PSAwOyByZXRyaWVzKyspIHsKKwkJaXJxcyA9IHByb2JlX2lycV9vbigpOworCQlzeF9pbml0X0NEMTg2eChicCk7CSAgICAgICAJCS8qIFJlc2V0IENEMTg2eCBjaGlwICAgICAgICovCisJCXN4X291dChicCwgQ0QxODZ4X0NBUiwgMik7ICAgICAgICAgICAgICAgLyogU2VsZWN0IHBvcnQgMiAgICAgICAgICAqLworCQlzeF93YWl0X0NDUihicCk7CisJCXN4X291dChicCwgQ0QxODZ4X0NDUiwgQ0NSX1RYRU4pOyAgICAgICAgLyogRW5hYmxlIHRyYW5zbWl0dGVyICAgICAqLworCQlzeF9vdXQoYnAsIENEMTg2eF9JRVIsIElFUl9UWFJEWSk7ICAgICAgIC8qIEVuYWJsZSB0eCBlbXB0eSBpbnRyICAgKi8KKwkJc3hfbG9uZ19kZWxheShIWi8yMCk7CSAgICAgICAJCQorCQlpcnFzID0gcHJvYmVfaXJxX29mZihpcnFzKTsKKworCQlkcHJpbnRrIChTWF9ERUJVR19JTklULCAiU1JTUiA9ICUwMngsICIsIHN4X2luKGJwLCBDRDE4NnhfU1JTUikpOworCQlkcHJpbnRrIChTWF9ERUJVR19JTklULCAiVFJBUiA9ICUwMngsICIsIHN4X2luKGJwLCBDRDE4NnhfVFJBUikpOworCQlkcHJpbnRrIChTWF9ERUJVR19JTklULCAiR0lWUiA9ICUwMngsICIsIHN4X2luKGJwLCBDRDE4NnhfR0lWUikpOworCQlkcHJpbnRrIChTWF9ERUJVR19JTklULCAiR0lDUiA9ICUwMngsICIsIHN4X2luKGJwLCBDRDE4NnhfR0lDUikpOworCQlkcHJpbnRrIChTWF9ERUJVR19JTklULCAiXG4iKTsKKworCQkvKiBSZXNldCBDRDE4NnggYWdhaW4gICAgICAqLworCQlpZiAoIXN4X2luaXRfQ0QxODZ4KGJwKSkgeworCQkJLyogSG1tbS4gVGhpcyBpcyBkZWFkIGNvZGUgYW55d2F5LiAqLworCQl9CisKKwkJZHByaW50ayAoU1hfREVCVUdfSU5JVCAidmFsMSA9ICUwMngsIHZhbDIgPSAlMDJ4LCB2YWwzID0gJTAyeC5cbiIsCisJCSAgICAgICAgdmFsMSwgdmFsMiwgdmFsMyk7IAorCQorCX0KKwkKKyNpZiAwCisJaWYgKGlycXMgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInN4JWQ6IENhbid0IGZpbmQgSVJRIGZvciBzcGVjaWFsaXggSU84KyBib2FyZCBhdCAweCUwM3guXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBicC0+YmFzZSk7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlwcmludGsgKEtFUk5fSU5GTyAiU3RhcnRlZCB3aXRoIGlycT0lZCwgYnV0IG5vdyBoYXZlIGlycT0lZC5cbiIsIGJwLT5pcnEsIGlycXMpOworCWlmIChpcnFzID4gMCkKKwkJYnAtPmlycSA9IGlycXM7CisjZW5kaWYKKwkvKiBSZXNldCBDRDE4NnggYWdhaW4gICovCisJaWYgKCFzeF9pbml0X0NEMTg2eChicCkpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXN4X3JlcXVlc3RfaW9fcmFuZ2UoYnApOworCWJwLT5mbGFncyB8PSBTWF9CT0FSRF9QUkVTRU5UOworCQorCS8qIENoaXAgICAgICAgICAgIHJldmNvZGUgICBwa2d0eXBlCisJICAgICAgICAgICAgICAgICAgR0ZSQ1IgICAgIFNSQ1IgYml0IDcKKwkgICBDRDE4MCByZXYgQiAgICAweDgxICAgICAgMAorCSAgIENEMTgwIHJldiBDICAgIDB4ODIgICAgICAwCisJICAgQ0QxODY0IHJldiBBICAgMHg4MiAgICAgIDEKKwkgICBDRDE4NjUgcmV2IEEgICAweDgzICAgICAgMSAgLS0gRG8gbm90IHVzZSEhISBEb2VzIG5vdCB3b3JrLiAKKwkgICBDRDE4NjUgcmV2IEIgICAweDg0ICAgICAgMQorCSAtLSBUaGFua3MgdG8gR3dlbiBXYW5nLCBDaXJydXMgTG9naWMuCisJICovCisKKwlzd2l0Y2ggKHN4X2luX29mZihicCwgQ0QxODZ4X0dGUkNSKSkgeworCWNhc2UgMHg4MjpjaGlwID0gMTg2NDtyZXY9J0EnO2JyZWFrOworCWNhc2UgMHg4MzpjaGlwID0gMTg2NTtyZXY9J0EnO2JyZWFrOworCWNhc2UgMHg4NDpjaGlwID0gMTg2NTtyZXY9J0InO2JyZWFrOworCWNhc2UgMHg4NTpjaGlwID0gMTg2NTtyZXY9J0MnO2JyZWFrOyAvKiBEb2VzIG5vdCBleGlzdCBhdCB0aGlzIHRpbWUgKi8KKwlkZWZhdWx0OmNoaXA9LTE7cmV2PSd4JzsKKwl9CisKKwlkcHJpbnRrIChTWF9ERUJVR19JTklULCAiIEdGQ1IgPSAweCUwMnhcbiIsIHN4X2luX29mZihicCwgQ0QxODZ4X0dGUkNSKSApOworCisjaWZkZWYgU1BFQ0lBTElYX1RJTUVSCisJaW5pdF90aW1lciAoJm1pc3NlZF9pcnFfdGltZXIpOworCW1pc3NlZF9pcnFfdGltZXIuZnVuY3Rpb24gPSBtaXNzZWRfaXJxOworCW1pc3NlZF9pcnFfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBicDsKKwltaXNzZWRfaXJxX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgc3hfcG9sbDsKKwlhZGRfdGltZXIgKCZtaXNzZWRfaXJxX3RpbWVyKTsKKyNlbmRpZgorCisJcHJpbnRrKEtFUk5fSU5GTyJzeCVkOiBzcGVjaWFsaXggSU84KyBib2FyZCBkZXRlY3RlZCBhdCAweCUwM3gsIElSUSAlZCwgQ0QlZCBSZXYuICVjLlxuIiwKKwkgICAgICAgYm9hcmRfTm8oYnApLAorCSAgICAgICBicC0+YmFzZSwgYnAtPmlycSwKKwkgICAgICAgY2hpcCwgcmV2KTsKKworCWZ1bmNfZXhpdCgpOworCXJldHVybiAwOworfQorCisvKiAKKyAqIAorICogIEludGVycnVwdCBwcm9jZXNzaW5nIHJvdXRpbmVzLgorICogKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN4X21hcmtfZXZlbnQoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICogcG9ydCwgaW50IGV2ZW50KQoreworCWZ1bmNfZW50ZXIoKTsKKworCXNldF9iaXQoZXZlbnQsICZwb3J0LT5ldmVudCk7CisJc2NoZWR1bGVfd29yaygmcG9ydC0+dHF1ZXVlKTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNwZWNpYWxpeF9wb3J0ICogc3hfZ2V0X3BvcnQoc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqIGJwLAorCQkJCQkgICAgICAgdW5zaWduZWQgY2hhciBjb25zdCAqIHdoYXQpCit7CisJdW5zaWduZWQgY2hhciBjaGFubmVsOworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqIHBvcnQgPSBOVUxMOworCisJY2hhbm5lbCA9IHN4X2luKGJwLCBDRDE4NnhfR0lDUikgPj4gR0lDUl9DSEFOX09GRjsKKwlkcHJpbnRrIChTWF9ERUJVR19DSEFOLCAiY2hhbm5lbDogJWRcbiIsIGNoYW5uZWwpOworCWlmIChjaGFubmVsIDwgQ0QxODZ4X05DSCkgeworCQlwb3J0ID0gJnN4X3BvcnRbYm9hcmRfTm8oYnApICogU1hfTlBPUlQgKyBjaGFubmVsXTsKKwkJZHByaW50ayAoU1hfREVCVUdfQ0hBTiwgInBvcnQ6ICVkICVwIGZsYWdzOiAweCV4XG4iLGJvYXJkX05vKGJwKSAqIFNYX05QT1JUICsgY2hhbm5lbCwgIHBvcnQsIHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpOworCisJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCQlkcHJpbnRrIChTWF9ERUJVR19DSEFOLCAicG9ydDogJWQgJXBcbiIsIGNoYW5uZWwsIHBvcnQpOworCQkJZnVuY19leGl0KCk7CisJCQlyZXR1cm4gcG9ydDsKKwkJfQorCX0KKwlwcmludGsoS0VSTl9JTkZPICJzeCVkOiAlcyBpbnRlcnJ1cHQgZnJvbSBpbnZhbGlkIHBvcnQgJWRcbiIsIAorCSAgICAgICBib2FyZF9ObyhicCksIHdoYXQsIGNoYW5uZWwpOworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF9yZWNlaXZlX2V4YyhzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICogYnApCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBjaDsKKworCWZ1bmNfZW50ZXIoKTsKKworCXBvcnQgPSBzeF9nZXRfcG9ydChicCwgIlJlY2VpdmUiKTsKKwlpZiAoIXBvcnQpIHsKKwkJZHByaW50ayAoU1hfREVCVUdfUlgsICJIbW0sIGNvdWxkbid0IGZpbmQgcG9ydC5cbiIpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwl0dHkgPSBwb3J0LT50dHk7CisJZHByaW50ayAoU1hfREVCVUdfUlgsICJwb3J0OiAlcCBjb3VudDogJWQgQlVGRl9TSVpFOiAlZFxuIiwKKwkJIHBvcnQsICB0dHktPmZsaXAuY291bnQsIFRUWV9GTElQQlVGX1NJWkUpOworCQorCXN0YXR1cyA9IHN4X2luKGJwLCBDRDE4NnhfUkNTUik7CisKKwlkcHJpbnRrIChTWF9ERUJVR19SWCwgInN0YXR1czogMHgleFxuIiwgc3RhdHVzKTsKKwlpZiAoc3RhdHVzICYgUkNTUl9PRSkgeworCQlwb3J0LT5vdmVycnVuKys7CisJCWRwcmludGsoU1hfREVCVUdfRklGTywgInN4JWQ6IHBvcnQgJWQ6IE92ZXJydW4uIFRvdGFsICVsZCBvdmVycnVucy5cbiIsCisJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCksIHBvcnQtPm92ZXJydW4pOworCX0KKwlzdGF0dXMgJj0gcG9ydC0+bWFya19tYXNrOworCisJLyogVGhpcyBmbGlwIGJ1ZmZlciBjaGVjayBuZWVkcyB0byBiZSBiZWxvdyB0aGUgcmVhZGluZyBvZiB0aGUKKwkgICBzdGF0dXMgcmVnaXN0ZXIgdG8gcmVzZXQgdGhlIGNoaXAncyBJUlEuLi4uICovCisJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7CisJCWRwcmludGsoU1hfREVCVUdfRklGTywgInN4JWQ6IHBvcnQgJWQ6IFdvcmtpbmcgYXJvdW5kIGZsaXAgYnVmZmVyIG92ZXJmbG93LlxuIiwKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSk7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCisJY2ggPSBzeF9pbihicCwgQ0QxODZ4X1JEUik7CisJaWYgKCFzdGF0dXMpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybjsKKwl9CisJaWYgKHN0YXR1cyAmIFJDU1JfVE9VVCkgeworCQlwcmludGsoS0VSTl9JTkZPICJzeCVkOiBwb3J0ICVkOiBSZWNlaXZlciB0aW1lb3V0LiBIYXJkd2FyZSBwcm9ibGVtcyA/XG4iLCAKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSk7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJCQorCX0gZWxzZSBpZiAoc3RhdHVzICYgUkNTUl9CUkVBSykgeworCQlkcHJpbnRrKFNYX0RFQlVHX1JYLCAic3glZDogcG9ydCAlZDogSGFuZGxpbmcgYnJlYWsuLi5cbiIsCisJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCkpOworCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0JSRUFLOworCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQlkb19TQUsodHR5KTsKKwkJCisJfSBlbHNlIGlmIChzdGF0dXMgJiBSQ1NSX1BFKSAKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9QQVJJVFk7CisJCisJZWxzZSBpZiAoc3RhdHVzICYgUkNTUl9GRSkgCisJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfRlJBTUU7CisJCisJZWxzZSBpZiAoc3RhdHVzICYgUkNTUl9PRSkKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9PVkVSUlVOOworCQorCWVsc2UKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IDA7CisJCisJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGNoOworCXR0eS0+ZmxpcC5jb3VudCsrOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworCisJZnVuY19leGl0KCk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHN4X3JlY2VpdmUoc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqIGJwKQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGNoYXIgY291bnQ7CisKKwlmdW5jX2VudGVyKCk7CisJCisJaWYgKCEocG9ydCA9IHN4X2dldF9wb3J0KGJwLCAiUmVjZWl2ZSIpKSkgeworCQlkcHJpbnRrIChTWF9ERUJVR19SWCwgIkhtbSwgY291bGRuJ3QgZmluZCBwb3J0LlxuIik7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCXR0eSA9IHBvcnQtPnR0eTsKKwkKKwljb3VudCA9IHN4X2luKGJwLCBDRDE4NnhfUkRDUik7CisJZHByaW50ayAoU1hfREVCVUdfUlgsICJwb3J0OiAlcDogY291bnQ6ICVkXG4iLCBwb3J0LCBjb3VudCk7CisJcG9ydC0+aGl0c1tjb3VudCA+IDggPyA5IDogY291bnRdKys7CisJCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJzeCVkOiBwb3J0ICVkOiBXb3JraW5nIGFyb3VuZCBmbGlwIGJ1ZmZlciBvdmVyZmxvdy5cbiIsCisJCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpKTsKKwkJCWJyZWFrOworCQl9CisJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBzeF9pbihicCwgQ0QxODZ4X1JEUik7CisJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSAwOworCQl0dHktPmZsaXAuY291bnQrKzsKKwl9CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgc3hfdHJhbnNtaXQoc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqIGJwKQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGNoYXIgY291bnQ7CisKKwlmdW5jX2VudGVyKCk7CisJaWYgKCEocG9ydCA9IHN4X2dldF9wb3J0KGJwLCAiVHJhbnNtaXQiKSkpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybjsKKwl9CisJZHByaW50ayAoU1hfREVCVUdfVFgsICJwb3J0OiAlcFxuIiwgcG9ydCk7CisJdHR5ID0gcG9ydC0+dHR5OworCQorCWlmIChwb3J0LT5JRVIgJiBJRVJfVFhFTVBUWSkgeworCQkvKiBGSUZPIGRyYWluZWQgKi8KKwkJc3hfb3V0KGJwLCBDRDE4NnhfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwkJcG9ydC0+SUVSICY9IH5JRVJfVFhFTVBUWTsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBwb3J0LT5JRVIpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoKHBvcnQtPnhtaXRfY250IDw9IDAgJiYgIXBvcnQtPmJyZWFrX2xlbmd0aCkKKwkgICAgfHwgdHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCkgeworCQlzeF9vdXQoYnAsIENEMTg2eF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlwb3J0LT5JRVIgJj0gfklFUl9UWFJEWTsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBwb3J0LT5JRVIpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAocG9ydC0+YnJlYWtfbGVuZ3RoKSB7CisJCWlmIChwb3J0LT5icmVha19sZW5ndGggPiAwKSB7CisJCQlpZiAocG9ydC0+Q09SMiAmIENPUjJfRVRDKSB7CisJCQkJc3hfb3V0KGJwLCBDRDE4NnhfVERSLCBDRDE4NnhfQ19FU0MpOworCQkJCXN4X291dChicCwgQ0QxODZ4X1REUiwgQ0QxODZ4X0NfU0JSSyk7CisJCQkJcG9ydC0+Q09SMiAmPSB+Q09SMl9FVEM7CisJCQl9CisJCQljb3VudCA9IG1pbl90KGludCwgcG9ydC0+YnJlYWtfbGVuZ3RoLCAweGZmKTsKKwkJCXN4X291dChicCwgQ0QxODZ4X1REUiwgQ0QxODZ4X0NfRVNDKTsKKwkJCXN4X291dChicCwgQ0QxODZ4X1REUiwgQ0QxODZ4X0NfREVMQVkpOworCQkJc3hfb3V0KGJwLCBDRDE4NnhfVERSLCBjb3VudCk7CisJCQlpZiAoIShwb3J0LT5icmVha19sZW5ndGggLT0gY291bnQpKQorCQkJCXBvcnQtPmJyZWFrX2xlbmd0aC0tOworCQl9IGVsc2UgeworCQkJc3hfb3V0KGJwLCBDRDE4NnhfVERSLCBDRDE4NnhfQ19FU0MpOworCQkJc3hfb3V0KGJwLCBDRDE4NnhfVERSLCBDRDE4NnhfQ19FQlJLKTsKKwkJCXN4X291dChicCwgQ0QxODZ4X0NPUjIsIHBvcnQtPkNPUjIpOworCQkJc3hfd2FpdF9DQ1IoYnApOworCQkJc3hfb3V0KGJwLCBDRDE4NnhfQ0NSLCBDQ1JfQ09SQ0hHMik7CisJCQlwb3J0LT5icmVha19sZW5ndGggPSAwOworCQl9CisKKwkJZnVuY19leGl0KCk7CisJCXJldHVybjsKKwl9CisJCisJY291bnQgPSBDRDE4NnhfTkZJRk87CisJZG8geworCQlzeF9vdXQoYnAsIENEMTg2eF9URFIsIHBvcnQtPnhtaXRfYnVmW3BvcnQtPnhtaXRfdGFpbCsrXSk7CisJCXBvcnQtPnhtaXRfdGFpbCA9IHBvcnQtPnhtaXRfdGFpbCAmIChTRVJJQUxfWE1JVF9TSVpFLTEpOworCQlpZiAoLS1wb3J0LT54bWl0X2NudCA8PSAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoLS1jb3VudCA+IDApOworCQorCWlmIChwb3J0LT54bWl0X2NudCA8PSAwKSB7CisJCXN4X291dChicCwgQ0QxODZ4X0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJCXBvcnQtPklFUiAmPSB+SUVSX1RYUkRZOworCQlzeF9vdXQoYnAsIENEMTg2eF9JRVIsIHBvcnQtPklFUik7CisJfQorCWlmIChwb3J0LT54bWl0X2NudCA8PSBwb3J0LT53YWtldXBfY2hhcnMpCisJCXN4X21hcmtfZXZlbnQocG9ydCwgUlNfRVZFTlRfV1JJVEVfV0FLRVVQKTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF9jaGVja19tb2RlbShzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICogYnApCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgY2hhciBtY3I7CisJaW50IG1zdnJfY2Q7CisKKwlkcHJpbnRrIChTWF9ERUJVR19TSUdOQUxTLCAiTW9kZW0gaW50ci4gIik7CisJaWYgKCEocG9ydCA9IHN4X2dldF9wb3J0KGJwLCAiTW9kZW0iKSkpCisJCXJldHVybjsKKwkKKwl0dHkgPSBwb3J0LT50dHk7CisJCisJbWNyID0gc3hfaW4oYnAsIENEMTg2eF9NQ1IpOworCXByaW50ayAoIm1jciA9ICUwMnguXG4iLCBtY3IpOworCisJaWYgKChtY3IgJiBNQ1JfQ0RDSEcpKSB7CisJCWRwcmludGsgKFNYX0RFQlVHX1NJR05BTFMsICJDRCBqdXN0IGNoYW5nZWQuLi4gIik7CisJCW1zdnJfY2QgPSBzeF9pbihicCwgQ0QxODZ4X01TVlIpICYgTVNWUl9DRDsKKwkJaWYgKG1zdnJfY2QpIHsKKwkJCWRwcmludGsgKFNYX0RFQlVHX1NJR05BTFMsICJXYWtpbmcgdXAgZ3V5cyBpbiBvcGVuLlxuIik7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7CisJCX0gZWxzZSB7CisJCQlkcHJpbnRrIChTWF9ERUJVR19TSUdOQUxTLCAiU2VuZGluZyBIVVAuXG4iKTsKKwkJCXNjaGVkdWxlX3dvcmsoJnBvcnQtPnRxdWV1ZV9oYW5ndXApOworCQl9CisJfQorCQorI2lmZGVmIFNQRUNJQUxJWF9CUkFJTl9EQU1BR0VEX0NUUworCWlmIChtY3IgJiBNQ1JfQ1RTQ0hHKSB7CisJCWlmIChzeF9pbihicCwgQ0QxODZ4X01TVlIpICYgTVNWUl9DVFMpIHsKKwkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCQlwb3J0LT5JRVIgfD0gSUVSX1RYUkRZOworCQkJaWYgKHBvcnQtPnhtaXRfY250IDw9IHBvcnQtPndha2V1cF9jaGFycykKKwkJCQlzeF9tYXJrX2V2ZW50KHBvcnQsIFJTX0VWRU5UX1dSSVRFX1dBS0VVUCk7CisJCX0gZWxzZSB7CisJCQl0dHktPmh3X3N0b3BwZWQgPSAxOworCQkJcG9ydC0+SUVSICY9IH5JRVJfVFhSRFk7CisJCX0KKwkJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBwb3J0LT5JRVIpOworCX0KKwlpZiAobWNyICYgTUNSX0RTU1hIRykgeworCQlpZiAoc3hfaW4oYnAsIENEMTg2eF9NU1ZSKSAmIE1TVlJfRFNSKSB7CisJCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQkJcG9ydC0+SUVSIHw9IElFUl9UWFJEWTsKKwkJCWlmIChwb3J0LT54bWl0X2NudCA8PSBwb3J0LT53YWtldXBfY2hhcnMpCisJCQkJc3hfbWFya19ldmVudChwb3J0LCBSU19FVkVOVF9XUklURV9XQUtFVVApOworCQl9IGVsc2UgeworCQkJdHR5LT5od19zdG9wcGVkID0gMTsKKwkJCXBvcnQtPklFUiAmPSB+SUVSX1RYUkRZOworCQl9CisJCXN4X291dChicCwgQ0QxODZ4X0lFUiwgcG9ydC0+SUVSKTsKKwl9CisjZW5kaWYgLyogU1BFQ0lBTElYX0JSQUlOX0RBTUFHRURfQ1RTICovCisJCisJLyogQ2xlYXIgY2hhbmdlIGJpdHMgKi8KKwlzeF9vdXQoYnAsIENEMTg2eF9NQ1IsIDApOworfQorCisKKy8qIFRoZSBtYWluIGludGVycnVwdCBwcm9jZXNzaW5nIHJvdXRpbmUgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIGFjazsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicDsKKwl1bnNpZ25lZCBsb25nIGxvb3AgPSAwOworCWludCBzYXZlZF9yZWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIoKTsKKworCWJwID0gZGV2X2lkOworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCisJZHByaW50ayAoU1hfREVCVUdfRkxPVywgImVudGVyICVzIHBvcnQgJWQgcm9vbTogJWxkXG4iLCBfX0ZVTkNUSU9OX18sIHBvcnRfTm8oc3hfZ2V0X3BvcnQoYnAsICJJTlQiKSksIFNFUklBTF9YTUlUX1NJWkUgLSBzeF9nZXRfcG9ydChicCwgIklUTiIpLT54bWl0X2NudCAtIDEpOworCWlmICghYnAgfHwgIShicC0+ZmxhZ3MgJiBTWF9CT0FSRF9BQ1RJVkUpKSB7CisJCWRwcmludGsgKFNYX0RFQlVHX0lSUSwgInN4OiBGYWxzZSBpbnRlcnJ1cHQuIGlycSAlZC5cbiIsIGlycSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJc2F2ZWRfcmVnID0gYnAtPnJlZzsKKworCXdoaWxlICgoKytsb29wIDwgMTYpICYmIChzdGF0dXMgPSAoc3hfaW4oYnAsIENEMTg2eF9TUlNSKSAmCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1JTUl9SUkVRaW50IHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNSU1JfVFJFUWludCB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JTUl9NUkVRaW50KSkpKSB7CQorCQlpZiAoc3RhdHVzICYgU1JTUl9SUkVRaW50KSB7CisJCQlhY2sgPSBzeF9pbihicCwgQ0QxODZ4X1JSQVIpOworCisJCQlpZiAoYWNrID09IChTWF9JRCB8IEdJVlJfSVRfUkNWKSkKKwkJCQlzeF9yZWNlaXZlKGJwKTsKKwkJCWVsc2UgaWYgKGFjayA9PSAoU1hfSUQgfCBHSVZSX0lUX1JFWEMpKQorCQkJCXN4X3JlY2VpdmVfZXhjKGJwKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9FUlIgInN4JWQ6IHN0YXR1czogMHgleCBCYWQgcmVjZWl2ZSBhY2sgMHglMDJ4LlxuIiwKKwkJCQkgICAgICAgYm9hcmRfTm8oYnApLCBzdGF0dXMsIGFjayk7CisJCQorCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFNSU1JfVFJFUWludCkgeworCQkJYWNrID0gc3hfaW4oYnAsIENEMTg2eF9UUkFSKTsKKworCQkJaWYgKGFjayA9PSAoU1hfSUQgfCBHSVZSX0lUX1RYKSkKKwkJCQlzeF90cmFuc21pdChicCk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fRVJSICJzeCVkOiBzdGF0dXM6IDB4JXggQmFkIHRyYW5zbWl0IGFjayAweCUwMnguIHBvcnQ6ICVkXG4iLAorCQkJCSAgICAgICBib2FyZF9ObyhicCksIHN0YXR1cywgYWNrLCBwb3J0X05vIChzeF9nZXRfcG9ydCAoYnAsICJJbnQiKSkpOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFNSU1JfTVJFUWludCkgeworCQkJYWNrID0gc3hfaW4oYnAsIENEMTg2eF9NUkFSKTsKKworCQkJaWYgKGFjayA9PSAoU1hfSUQgfCBHSVZSX0lUX01PREVNKSkgCisJCQkJc3hfY2hlY2tfbW9kZW0oYnApOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX0VSUiAic3glZDogc3RhdHVzOiAweCV4IEJhZCBtb2RlbSBhY2sgMHglMDJ4LlxuIiwKKwkJCQkgICAgICAgYm9hcmRfTm8oYnApLCBzdGF0dXMsIGFjayk7CisJCQorCQl9IAorCisJCXN4X291dChicCwgQ0QxODZ4X0VPSVIsIDApOyAgIC8qIE1hcmsgZW5kIG9mIGludGVycnVwdCAqLworCX0KKwlicC0+cmVnID0gc2F2ZWRfcmVnOworCW91dGIgKGJwLT5yZWcsIGJwLT5iYXNlICsgU1hfQUREUl9SRUcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJZnVuY19leGl0KCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qCisgKiAgUm91dGluZXMgZm9yIG9wZW4gJiBjbG9zZSBwcm9jZXNzaW5nLgorICovCisKK3N0YXRpYyB2b2lkIHR1cm5faW50c19vZmYgKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyKCk7CisJaWYgKGJwLT5mbGFncyAmIFNYX0JPQVJEX0lTX1BDSSkgeworCQkvKiBUaGlzIHdhcyBpbnRlbmRlZCBmb3IgZW5hYmVsaW5nIHRoZSBpbnRlcnJ1cHQgb24gdGhlCisJCSAqIFBDSSBjYXJkLiBIb3dldmVyIGl0IHNlZW1zIHRoYXQgaXQncyBhbHJlYWR5IGVuYWJsZWQKKwkJICogYW5kIGFzIFBDSSBpbnRlcnJ1cHRzIGNhbiBiZSBzaGFyZWQsIHRoZXJlIGlzIG5vIHJlYWwKKwkJICogcmVhc29uIHRvIGhhdmUgdG8gdHVybiBpdCBvZmYuICovCisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJKHZvaWQpIHN4X2luX29mZiAoYnAsIDApOyAvKiBUdXJuIG9mZiBpbnRlcnJ1cHRzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworc3RhdGljIHZvaWQgdHVybl9pbnRzX29uIChzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlcigpOworCisJaWYgKGJwLT5mbGFncyAmIFNYX0JPQVJEX0lTX1BDSSkgeworCQkvKiBwbGF5IHdpdGggdGhlIFBDSSBjaGlwLiBTZWUgY29tbWVudCBhYm92ZS4gKi8KKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJKHZvaWQpIHN4X2luIChicCwgMCk7IC8qIFR1cm4gT04gaW50ZXJydXB0cy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCisJZnVuY19leGl0KCk7Cit9CisKKworLyogQ2FsbGVkIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cyAqLworc3RhdGljIGlubGluZSBpbnQgc3hfc2V0dXBfYm9hcmQoc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqIGJwKQoreworCWludCBlcnJvcjsKKworCWlmIChicC0+ZmxhZ3MgJiBTWF9CT0FSRF9BQ1RJVkUpIAorCQlyZXR1cm4gMDsKKworCWlmIChicC0+ZmxhZ3MgJiBTWF9CT0FSRF9JU19QQ0kpCisJCWVycm9yID0gcmVxdWVzdF9pcnEoYnAtPmlycSwgc3hfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwgInNwZWNpYWxpeCBJTzgrIiwgYnApOworCWVsc2UKKwkJZXJyb3IgPSByZXF1ZXN0X2lycShicC0+aXJxLCBzeF9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgInNwZWNpYWxpeCBJTzgrIiwgYnApOworCisJaWYgKGVycm9yKSAKKwkJcmV0dXJuIGVycm9yOworCisJdHVybl9pbnRzX29uIChicCk7CisJYnAtPmZsYWdzIHw9IFNYX0JPQVJEX0FDVElWRTsKKworCXJldHVybiAwOworfQorCisKKy8qIENhbGxlZCB3aXRoIGRpc2FibGVkIGludGVycnVwdHMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF9zaHV0ZG93bl9ib2FyZChzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicCkKK3sKKwlmdW5jX2VudGVyKCk7CisKKwlpZiAoIShicC0+ZmxhZ3MgJiBTWF9CT0FSRF9BQ1RJVkUpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCisJYnAtPmZsYWdzICY9IH5TWF9CT0FSRF9BQ1RJVkU7CisJCisJZHByaW50ayAoU1hfREVCVUdfSVJRLCAiRnJlZWluZyBJUlElZCBmb3IgYm9hcmQgJWQuXG4iLAorCQkgYnAtPmlycSwgYm9hcmRfTm8gKGJwKSk7CisJZnJlZV9pcnEoYnAtPmlycSwgYnApOworCisJdHVybl9pbnRzX29mZiAoYnApOworCisKKwlmdW5jX2V4aXQoKTsKK30KKworCisvKgorICogU2V0dGluZyB1cCBwb3J0IGNoYXJhY3RlcmlzdGljcy4gCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGRpc2FibGVkIGludGVycnVwdHMKKyAqLworc3RhdGljIHZvaWQgc3hfY2hhbmdlX3NwZWVkKHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwLCBzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBsb25nIGJhdWQ7CisJbG9uZyB0bXA7CisJdW5zaWduZWQgY2hhciBjb3IxID0gMCwgY29yMyA9IDA7CisJdW5zaWduZWQgY2hhciBtY29yMSA9IDAsIG1jb3IyID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBhZ2FpbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlcigpOworCisJaWYgKCEodHR5ID0gcG9ydC0+dHR5KSB8fCAhdHR5LT50ZXJtaW9zKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCisJcG9ydC0+SUVSICA9IDA7CisJcG9ydC0+Q09SMiA9IDA7CisJLyogU2VsZWN0IHBvcnQgb24gdGhlIGJvYXJkICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfb3V0KGJwLCBDRDE4NnhfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKworCS8qIFRoZSBTcGVjaWFsaXggYm9hcmQgZG9lbnMndCBpbXBsZW1lbnQgdGhlIFJUUyBsaW5lcy4KKwkgICBUaGV5IGFyZSB1c2VkIHRvIHNldCB0aGUgSVJRIGxldmVsLiBEb24ndCB0b3VjaCB0aGVtLiAqLworCWlmIChTWF9DUlRTQ1RTKHR0eSkpCisJCXBvcnQtPk1TVlIgPSBNU1ZSX0RUUiB8IChzeF9pbihicCwgQ0QxODZ4X01TVlIpICYgTVNWUl9SVFMpOworCWVsc2UKKwkJcG9ydC0+TVNWUiA9ICAoc3hfaW4oYnAsIENEMTg2eF9NU1ZSKSAmIE1TVlJfUlRTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCWRwcmludGsgKFNYX0RFQlVHX1RFUk1JT1MsICJzeDogZ290IE1TVlI9JTAyeC5cbiIsIHBvcnQtPk1TVlIpOworCWJhdWQgPSBDX0JBVUQodHR5KTsKKwkKKwlpZiAoYmF1ZCAmIENCQVVERVgpIHsKKwkJYmF1ZCAmPSB+Q0JBVURFWDsKKwkJaWYgKGJhdWQgPCAxIHx8IGJhdWQgPiAyKSAKKwkJCXBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVURFWDsKKwkJZWxzZQorCQkJYmF1ZCArPSAxNTsKKwl9CisJaWYgKGJhdWQgPT0gMTUpIHsKKwkJaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJCQliYXVkICsrOworCQlpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCisJCQliYXVkICs9IDI7CisJfQorCQorCQorCWlmICghYmF1ZF90YWJsZVtiYXVkXSkgeworCQkvKiBEcm9wIERUUiAmIGV4aXQgKi8KKwkJZHByaW50ayAoU1hfREVCVUdfVEVSTUlPUywgIkRyb3BwaW5nIERUUi4uLiAgSG1tLi4uLlxuIik7CisJCWlmICghU1hfQ1JUU0NUUyAodHR5KSkgeworCQkJcG9ydCAtPiBNU1ZSICY9IH4gTVNWUl9EVFI7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJCXN4X291dChicCwgQ0QxODZ4X01TVlIsIHBvcnQtPk1TVlIgKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCX0gCisJCWVsc2UKKwkJCWRwcmludGsgKFNYX0RFQlVHX1RFUk1JT1MsICJDYW4ndCBkcm9wIERUUjogbm8gRFRSLlxuIik7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQkvKiBTZXQgRFRSIG9uICovCisJCWlmICghU1hfQ1JUU0NUUyAodHR5KSkgeworCQkJcG9ydCAtPk1TVlIgfD0gTVNWUl9EVFI7CisJCX0KKwl9CisJCisJLyoKKwkgKiBOb3cgd2UgbXVzdCBjYWxjdWxhdGUgc29tZSBzcGVlZCBkZXBlbmRlZCB0aGluZ3MgCisJICovCisKKwkvKiBTZXQgYmF1ZCByYXRlIGZvciBwb3J0ICovCisJdG1wID0gcG9ydC0+Y3VzdG9tX2Rpdmlzb3IgOworCWlmICggdG1wICkKKwkJcHJpbnRrIChLRVJOX0lORk8gInN4JWQ6IFVzaW5nIGN1c3RvbSBiYXVkIHJhdGUgZGl2aXNvciAlbGQuIFxuIgorCQkgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBhbiB1bnRlc3RlZCBvcHRpb24sIHBsZWFzZSBiZSBjYXJlZnVsbC5cbiIsCisJCSAgICAgICAgICAgICAgICAgIHBvcnRfTm8gKHBvcnQpLCB0bXApOworCWVsc2UKKwkJdG1wID0gKCgoU1hfT1NDRlJFUSArIGJhdWRfdGFibGVbYmF1ZF0vMikgLyBiYXVkX3RhYmxlW2JhdWRdICsKKwkJICAgICAgICAgQ0QxODZ4X1RQQy8yKSAvIENEMTg2eF9UUEMpOworCisJaWYgKCh0bXAgPCAweDEwKSAmJiB0aW1lX2JlZm9yZShhZ2FpbiwgamlmZmllcykpIHsgCisJCWFnYWluID0gamlmZmllcyArIEhaICogNjA7CisJCS8qIFBhZ2UgNDggb2YgdmVyc2lvbiAyLjAgb2YgdGhlIENMLUNEMTg2NSBkYXRhYm9vayAqLworCQlpZiAodG1wID49IDEyKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAic3glZDogQmF1ZCByYXRlIGRpdmlzb3IgaXMgJWxkLiBcbiIKKwkJCSAgICAgICAgIlBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGlzIHBvc3NpYmxlLlxuIgorCQkJICAgICAgICAiUmVhZCBzcGVjaWFsaXgudHh0IGZvciBtb3JlIGluZm8uXG4iLAorCQkJICAgICAgICBwb3J0X05vIChwb3J0KSwgdG1wKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJzeCVkOiBCYXVkIHJhdGUgZGl2aXNvciBpcyAlbGQuIFxuIgorCQkJICAgICAgICAiV2FybmluZzogb3ZlcnN0cmVzc2luZyBDaXJydXMgY2hpcC4gIgorCQkJICAgICAgICAiVGhpcyBtaWdodCBub3Qgd29yay5cbiIKKwkJCSAgICAgICAgIlJlYWQgc3BlY2lhbGl4LnR4dCBmb3IgbW9yZSBpbmZvLlxuIiwgCisJCQkgICAgICAgIHBvcnRfTm8gKHBvcnQpLCB0bXApOworCQl9CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X291dChicCwgQ0QxODZ4X1JCUFJILCAodG1wID4+IDgpICYgMHhmZik7IAorCXN4X291dChicCwgQ0QxODZ4X1RCUFJILCAodG1wID4+IDgpICYgMHhmZik7IAorCXN4X291dChicCwgQ0QxODZ4X1JCUFJMLCB0bXAgJiAweGZmKTsgCisJc3hfb3V0KGJwLCBDRDE4NnhfVEJQUkwsIHRtcCAmIDB4ZmYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJaWYgKHBvcnQtPmN1c3RvbV9kaXZpc29yKSB7CisJCWJhdWQgPSAoU1hfT1NDRlJFUSArIHBvcnQtPmN1c3RvbV9kaXZpc29yLzIpIC8gcG9ydC0+Y3VzdG9tX2Rpdmlzb3I7CisJCWJhdWQgPSAoIGJhdWQgKyA1ICkgLyAxMDsKKwl9IGVsc2UgCisJCWJhdWQgPSAoYmF1ZF90YWJsZVtiYXVkXSArIDUpIC8gMTA7ICAgLyogRXN0aW1hdGVkIENQUyAqLworCisJLyogVHdvIHRpbWVyIHRpY2tzIHNlZW1zIGVub3VnaCB0byB3YWtldXAgc29tZXRoaW5nIGxpa2UgU0xJUCBkcml2ZXIgKi8KKwl0bXAgPSAoKGJhdWQgKyBIWi8yKSAvIEhaKSAqIDIgLSBDRDE4NnhfTkZJRk87CQkKKwlwb3J0LT53YWtldXBfY2hhcnMgPSAodG1wIDwgMCkgPyAwIDogKCh0bXAgPj0gU0VSSUFMX1hNSVRfU0laRSkgPworCQkJCQkgICAgICBTRVJJQUxfWE1JVF9TSVpFIC0gMSA6IHRtcCk7CisJCisJLyogUmVjZWl2ZXIgdGltZW91dCB3aWxsIGJlIHRyYW5zbWlzc2lvbiB0aW1lIGZvciAxLjUgY2hhcnMgKi8KKwl0bXAgPSAoU1BFQ0lBTElYX1RQUyArIFNQRUNJQUxJWF9UUFMvMiArIGJhdWQvMikgLyBiYXVkOworCXRtcCA9ICh0bXAgPiAweGZmKSA/IDB4ZmYgOiB0bXA7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfb3V0KGJwLCBDRDE4NnhfUlRQUiwgdG1wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCXN3aXRjaCAoQ19DU0laRSh0dHkpKSB7CisJIGNhc2UgQ1M1OgorCQljb3IxIHw9IENPUjFfNUJJVFM7CisJCWJyZWFrOworCSBjYXNlIENTNjoKKwkJY29yMSB8PSBDT1IxXzZCSVRTOworCQlicmVhazsKKwkgY2FzZSBDUzc6CisJCWNvcjEgfD0gQ09SMV83QklUUzsKKwkJYnJlYWs7CisJIGNhc2UgQ1M4OgorCQljb3IxIHw9IENPUjFfOEJJVFM7CisJCWJyZWFrOworCX0KKwkKKwlpZiAoQ19DU1RPUEIodHR5KSkgCisJCWNvcjEgfD0gQ09SMV8yU0I7CisJCisJY29yMSB8PSBDT1IxX0lHTk9SRTsKKwlpZiAoQ19QQVJFTkIodHR5KSkgeworCQljb3IxIHw9IENPUjFfTk9STVBBUjsKKwkJaWYgKENfUEFST0REKHR0eSkpIAorCQkJY29yMSB8PSBDT1IxX09ERFA7CisJCWlmIChJX0lOUENLKHR0eSkpIAorCQkJY29yMSAmPSB+Q09SMV9JR05PUkU7CisJfQorCS8qIFNldCBtYXJraW5nIG9mIHNvbWUgZXJyb3JzICovCisJcG9ydC0+bWFya19tYXNrID0gUkNTUl9PRSB8IFJDU1JfVE9VVDsKKwlpZiAoSV9JTlBDSyh0dHkpKSAKKwkJcG9ydC0+bWFya19tYXNrIHw9IFJDU1JfRkUgfCBSQ1NSX1BFOworCWlmIChJX0JSS0lOVCh0dHkpIHx8IElfUEFSTVJLKHR0eSkpIAorCQlwb3J0LT5tYXJrX21hc2sgfD0gUkNTUl9CUkVBSzsKKwlpZiAoSV9JR05QQVIodHR5KSkgCisJCXBvcnQtPm1hcmtfbWFzayAmPSB+KFJDU1JfRkUgfCBSQ1NSX1BFKTsKKwlpZiAoSV9JR05CUksodHR5KSkgeworCQlwb3J0LT5tYXJrX21hc2sgJj0gflJDU1JfQlJFQUs7CisJCWlmIChJX0lHTlBBUih0dHkpKSAKKwkJCS8qIFJlYWwgcmF3IG1vZGUuIElnbm9yZSBhbGwgKi8KKwkJCXBvcnQtPm1hcmtfbWFzayAmPSB+UkNTUl9PRTsKKwl9CisJLyogRW5hYmxlIEhhcmR3YXJlIEZsb3cgQ29udHJvbCAqLworCWlmIChDX0NSVFNDVFModHR5KSkgeworI2lmZGVmIFNQRUNJQUxJWF9CUkFJTl9EQU1BR0VEX0NUUworCQlwb3J0LT5JRVIgfD0gSUVSX0RTUiB8IElFUl9DVFM7CisJCW1jb3IxIHw9IE1DT1IxX0RTUlpEIHwgTUNPUjFfQ1RTWkQ7CisJCW1jb3IyIHw9IE1DT1IyX0RTUk9EIHwgTUNPUjJfQ1RTT0Q7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCQl0dHktPmh3X3N0b3BwZWQgPSAhKHN4X2luKGJwLCBDRDE4NnhfTVNWUikgJiAoTVNWUl9DVFN8TVNWUl9EU1IpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKyNlbHNlCisJCXBvcnQtPkNPUjIgfD0gQ09SMl9DVFNBRTsgCisjZW5kaWYKKwl9CisJLyogRW5hYmxlIFNvZnR3YXJlIEZsb3cgQ29udHJvbC4gRklYTUU6IEknbSBub3Qgc3VyZSBhYm91dCB0aGlzICovCisJLyogU29tZSBwZW9wbGUgcmVwb3J0ZWQgdGhhdCBpdCB3b3JrcywgYnV0IEkgc3RpbGwgZG91YnQgaXQgKi8KKwlpZiAoSV9JWE9OKHR0eSkpIHsKKwkJcG9ydC0+Q09SMiB8PSBDT1IyX1RYSUJFOworCQljb3IzIHw9IChDT1IzX0ZDVCB8IENPUjNfU0NERSk7CisJCWlmIChJX0lYQU5ZKHR0eSkpCisJCQlwb3J0LT5DT1IyIHw9IENPUjJfSVhNOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfU0NIUjEsIFNUQVJUX0NIQVIodHR5KSk7CisJCXN4X291dChicCwgQ0QxODZ4X1NDSFIyLCBTVE9QX0NIQVIodHR5KSk7CisJCXN4X291dChicCwgQ0QxODZ4X1NDSFIzLCBTVEFSVF9DSEFSKHR0eSkpOworCQlzeF9vdXQoYnAsIENEMTg2eF9TQ0hSNCwgU1RPUF9DSEFSKHR0eSkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCX0KKwlpZiAoIUNfQ0xPQ0FMKHR0eSkpIHsKKwkJLyogRW5hYmxlIENEIGNoZWNrICovCisJCXBvcnQtPklFUiB8PSBJRVJfQ0Q7CisJCW1jb3IxIHw9IE1DT1IxX0NEWkQ7CisJCW1jb3IyIHw9IE1DT1IyX0NET0Q7CisJfQorCQorCWlmIChDX0NSRUFEKHR0eSkpIAorCQkvKiBFbmFibGUgcmVjZWl2ZXIgKi8KKwkJcG9ydC0+SUVSIHw9IElFUl9SWEQ7CisJCisJLyogU2V0IGlucHV0IEZJRk8gc2l6ZSAoMS04IGJ5dGVzKSAqLworCWNvcjMgfD0gc3hfcnhmaWZvOworCS8qIFNldHRpbmcgdXAgQ0QxODZ4IGNoYW5uZWwgcmVnaXN0ZXJzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfb3V0KGJwLCBDRDE4NnhfQ09SMSwgY29yMSk7CisJc3hfb3V0KGJwLCBDRDE4NnhfQ09SMiwgcG9ydC0+Q09SMik7CisJc3hfb3V0KGJwLCBDRDE4NnhfQ09SMywgY29yMyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkvKiBNYWtlIENEMTg2eCBrbm93IGFib3V0IHJlZ2lzdGVycyBjaGFuZ2UgKi8KKwlzeF93YWl0X0NDUihicCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfb3V0KGJwLCBDRDE4NnhfQ0NSLCBDQ1JfQ09SQ0hHMSB8IENDUl9DT1JDSEcyIHwgQ0NSX0NPUkNIRzMpOworCS8qIFNldHRpbmcgdXAgbW9kZW0gb3B0aW9uIHJlZ2lzdGVycyAqLworCWRwcmludGsgKFNYX0RFQlVHX1RFUk1JT1MsICJNY29yMSA9ICUwMngsIG1jb3IyID0gJTAyeC5cbiIsIG1jb3IxLCBtY29yMik7CisJc3hfb3V0KGJwLCBDRDE4NnhfTUNPUjEsIG1jb3IxKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9NQ09SMiwgbWNvcjIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJLyogRW5hYmxlIENEMTg2eCB0cmFuc21pdHRlciAmIHJlY2VpdmVyICovCisJc3hfd2FpdF9DQ1IoYnApOworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X291dChicCwgQ0QxODZ4X0NDUiwgQ0NSX1RYRU4gfCBDQ1JfUlhFTik7CisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwlzeF9vdXQoYnAsIENEMTg2eF9JRVIsIHBvcnQtPklFUik7CisJLyogQW5kIGZpbmFsbHkgc2V0IHRoZSBtb2RlbSBsaW5lcy4uLiAqLworCXN4X291dChicCwgQ0QxODZ4X01TVlIsIHBvcnQtPk1TVlIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZW5hYmxlZCAqLworc3RhdGljIGludCBzeF9zZXR1cF9wb3J0KHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwLCBzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIoKTsKKworCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gMDsKKwl9CisJCisJaWYgKCFwb3J0LT54bWl0X2J1ZikgeworCQkvKiBXZSBtYXkgc2xlZXAgaW4gZ2V0X3plcm9lZF9wYWdlKCkgKi8KKwkJdW5zaWduZWQgbG9uZyB0bXA7CisJCQorCQlpZiAoISh0bXAgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCkpKSB7CisJCQlmdW5jX2V4aXQoKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJaWYgKHBvcnQtPnhtaXRfYnVmKSB7CisJCQlmcmVlX3BhZ2UodG1wKTsKKwkJCWZ1bmNfZXhpdCgpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCQlwb3J0LT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHRtcDsKKwl9CisJCQorCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAocG9ydC0+dHR5KSAKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnBvcnQtPnR0eS0+ZmxhZ3MpOworCisJcG9ydC0+eG1pdF9jbnQgPSBwb3J0LT54bWl0X2hlYWQgPSBwb3J0LT54bWl0X3RhaWwgPSAwOworCXN4X2NoYW5nZV9zcGVlZChicCwgcG9ydCk7CisJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwkJCisJZnVuY19leGl0KCk7CisJcmV0dXJuIDA7Cit9CisKKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkICovCitzdGF0aWMgdm9pZCBzeF9zaHV0ZG93bl9wb3J0KHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwLCBzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWZ1bmNfZW50ZXIoKTsKKworCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCQorCWlmIChzeF9kZWJ1ZyAmIFNYX0RFQlVHX0ZJRk8pIHsKKwkJZHByaW50ayhTWF9ERUJVR19GSUZPLCAic3glZDogcG9ydCAlZDogJWxkIG92ZXJydW5zLCBGSUZPIGhpdHMgWyAiLAorCQkJYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpLCBwb3J0LT5vdmVycnVuKTsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCWRwcmludGsoU1hfREVCVUdfRklGTywgIiVsZCAiLCBwb3J0LT5oaXRzW2ldKTsKKwkJfQorCQlkcHJpbnRrKFNYX0RFQlVHX0ZJRk8sICJdLlxuIik7CisJfQorCisJaWYgKHBvcnQtPnhtaXRfYnVmKSB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcG9ydC0+eG1pdF9idWYpOworCQlwb3J0LT54bWl0X2J1ZiA9IE5VTEw7CisJfQorCisJLyogU2VsZWN0IHBvcnQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCisJaWYgKCEodHR5ID0gcG9ydC0+dHR5KSB8fCBDX0hVUENMKHR0eSkpIHsKKwkJLyogRHJvcCBEVFIgKi8KKwkJc3hfb3V0KGJwLCBDRDE4NnhfTVNWRFRSLCAwKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkvKiBSZXNldCBwb3J0ICovCisJc3hfd2FpdF9DQ1IoYnApOworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X291dChicCwgQ0QxODZ4X0NDUiwgQ0NSX1NPRlRSRVNFVCk7CisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBmcm9tIHRoaXMgcG9ydCAqLworCXBvcnQtPklFUiA9IDA7CisJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBwb3J0LT5JRVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJaWYgKHR0eSkKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKKwlwb3J0LT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisJCisJaWYgKCFicC0+Y291bnQpIAorCQlzeF9zaHV0ZG93bl9ib2FyZChicCk7CisJZnVuY19leGl0KCk7Cit9CisKKwkKK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCAgY3VycmVudCk7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCWludCAgICByZXR2YWw7CisJaW50ICAgIGRvX2Nsb2NhbCA9IDA7CisJaW50ICAgIENEOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyKCk7CisKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyBjbG9zZWQsIHRoZW4gYmxvY2sKKwkgKiB1bnRpbCBpdCdzIGRvbmUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4KKwkgKi8KKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCBwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydC0+Y2xvc2Vfd2FpdCk7CisJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpIHsKKwkJCWZ1bmNfZXhpdCgpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0gZWxzZSB7CisJCQlmdW5jX2V4aXQoKTsKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCX0KKwl9CisJCisJLyoKKwkgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIG9yIHRoZSBwb3J0IGlzIG5vdCBlbmFibGVkLAorCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KKwkgKi8KKwlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAorCSAgICAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7CisJCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoQ19DTE9DQUwodHR5KSkKKwkJZG9fY2xvY2FsID0gMTsKKworCS8qCisJICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUKKwkgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgorCSAqIHRoaXMgbG9vcCwgaW5mby0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKwkgKiByc19jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCXBvcnQtPmNvdW50LS07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlwb3J0LT5ibG9ja2VkX29wZW4rKzsKKwl3aGlsZSAoMSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJc3hfb3V0KGJwLCBDRDE4NnhfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwkJQ0QgPSBzeF9pbihicCwgQ0QxODZ4X01TVlIpICYgTVNWUl9DRDsKKwkJaWYgKFNYX0NSVFNDVFMgKHR0eSkpIHsKKwkJCS8qIEFjdGl2YXRlIFJUUyAqLworCQkJcG9ydC0+TVNWUiB8PSBNU1ZSX0RUUjsJCS8qIFdURj8gKi8KKwkJCXN4X291dCAoYnAsIENEMTg2eF9NU1ZSLCBwb3J0LT5NU1ZSKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEFjdGl2YXRlIERUUiAqLworCQkJcG9ydC0+TVNWUiB8PSBNU1ZSX0RUUjsKKwkJCXN4X291dCAoYnAsIENEMTg2eF9NU1ZSLCBwb3J0LT5NU1ZSKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fAorCQkgICAgIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgeworCQkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZWxzZQorCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsJCisJCQlicmVhazsKKwkJfQorCQlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmCisJCSAgICAoZG9fY2xvY2FsIHx8IENEKSkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJcG9ydC0+Y291bnQrKzsKKwl9CisJcG9ydC0+YmxvY2tlZF9vcGVuLS07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCWlmIChyZXR2YWwpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gMDsKK30JCisKKworc3RhdGljIGludCBzeF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJaW50IGJvYXJkOworCWludCBlcnJvcjsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKiBwb3J0OworCXN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKiBicDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlcigpOworCisJYm9hcmQgPSBTWF9CT0FSRCh0dHktPmluZGV4KTsKKworCWlmIChib2FyZCA+PSBTWF9OQk9BUkQgfHwgIShzeF9ib2FyZFtib2FyZF0uZmxhZ3MgJiBTWF9CT0FSRF9QUkVTRU5UKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCQorCWJwID0gJnN4X2JvYXJkW2JvYXJkXTsKKwlwb3J0ID0gc3hfcG9ydCArIGJvYXJkICogU1hfTlBPUlQgKyBTWF9QT1JUKHR0eS0+aW5kZXgpOworCXBvcnQtPm92ZXJydW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQlwb3J0LT5oaXRzW2ldPTA7CisKKwlkcHJpbnRrIChTWF9ERUJVR19PUEVOLCAiQm9hcmQgPSAlZCwgYnAgPSAlcCwgcG9ydCA9ICVwLCBwb3J0bm8gPSAlZC5cbiIsCisJICAgICAgICBib2FyZCwgYnAsIHBvcnQsIFNYX1BPUlQodHR5LT5pbmRleCkpOworCisJaWYgKHN4X3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInN4X29wZW4iKSkgeworCQlmdW5jX2VudGVyKCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICgoZXJyb3IgPSBzeF9zZXR1cF9ib2FyZChicCkpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJcG9ydC0+Y291bnQrKzsKKwlicC0+Y291bnQrKzsKKwl0dHktPmRyaXZlcl9kYXRhID0gcG9ydDsKKwlwb3J0LT50dHkgPSB0dHk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCWlmICgoZXJyb3IgPSBzeF9zZXR1cF9wb3J0KGJwLCBwb3J0KSkpIHsKKwkJZnVuY19lbnRlcigpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCQorCWlmICgoZXJyb3IgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBwb3J0KSkpIHsKKwkJZnVuY19lbnRlcigpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZnVuY19leGl0KCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgc3hfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQgPSAoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJCisJZnVuY19lbnRlcigpOworCWlmICghcG9ydCB8fCBzeF9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJjbG9zZSIpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCQorCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKHBvcnQtPmNvdW50ICE9IDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3glZDogc3hfY2xvc2U6IGJhZCBwb3J0IGNvdW50OyIKKwkJICAgICAgICIgdHR5LT5jb3VudCBpcyAxLCBwb3J0IGNvdW50IGlzICVkXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0LT5jb3VudCk7CisJCXBvcnQtPmNvdW50ID0gMTsKKwl9CisKKwlpZiAocG9ydC0+Y291bnQgPiAxKSB7CisJCXBvcnQtPmNvdW50LS07CisJCWJwLT5jb3VudC0tOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwlwb3J0LT5mbGFncyB8PSBBU1lOQ19DTE9TSU5HOworCS8qCisJICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkgCisJICogdGhlIGxpbmUgZGlzY2lwbGluZSB0byBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycy4KKwkgKi8KKwl0dHktPmNsb3NpbmcgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlkcHJpbnRrIChTWF9ERUJVR19PUEVOLCAiQ2xvc2luZ1xuIik7CisJaWYgKHBvcnQtPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkgeworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgcG9ydC0+Y2xvc2luZ193YWl0KTsKKwl9CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiAgVG8gZG8gdGhpcywgd2UKKwkgKiBkaXNhYmxlIHRoZSByZWNlaXZlIGxpbmUgc3RhdHVzIGludGVycnVwdHMsIGFuZCB0ZWxsIHRoZQorCSAqIGludGVycnVwdCBkcml2ZXIgdG8gc3RvcCBjaGVja2luZyB0aGUgZGF0YSByZWFkeSBiaXQgaW4gdGhlCisJICogbGluZSBzdGF0dXMgcmVnaXN0ZXIuCisJICovCisJZHByaW50ayAoU1hfREVCVUdfT1BFTiwgIkNsb3NlZFxuIik7CisJcG9ydC0+SUVSICY9IH5JRVJfUlhEOworCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCXBvcnQtPklFUiAmPSB+SUVSX1RYUkRZOworCQlwb3J0LT5JRVIgfD0gSUVSX1RYRU1QVFk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCQlzeF9vdXQoYnAsIENEMTg2eF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlzeF9vdXQoYnAsIENEMTg2eF9JRVIsIHBvcnQtPklFUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCS8qCisJCSAqIEJlZm9yZSB3ZSBkcm9wIERUUiwgbWFrZSBzdXJlIHRoZSBVQVJUIHRyYW5zbWl0dGVyCisJCSAqIGhhcyBjb21wbGV0ZWx5IGRyYWluZWQ7IHRoaXMgaXMgZXNwZWNpYWxseQorCQkgKiBpbXBvcnRhbnQgaWYgdGhlcmUgaXMgYSB0cmFuc21pdCBGSUZPIQorCQkgKi8KKwkJdGltZW91dCA9IGppZmZpZXMrSFo7CisJCXdoaWxlKHBvcnQtPklFUiAmIElFUl9UWEVNUFRZKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZSAoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MocG9ydC0+dGltZW91dCkpOworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCQlwcmludGsgKEtFUk5fSU5GTyAiVGltZW91dCB3YWl0aW5nIGZvciBjbG9zZVxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCX0KKworCWlmICgtLWJwLT5jb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzeCVkOiBzeF9zaHV0ZG93bl9wb3J0OiBiYWQgYm9hcmQgY291bnQ6ICVkIHBvcnQ6ICVkXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBicC0+Y291bnQsIHR0eS0+aW5kZXgpOworCQlicC0+Y291bnQgPSAwOworCX0KKwlpZiAoLS1wb3J0LT5jb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzeCVkOiBzeF9jbG9zZTogYmFkIHBvcnQgY291bnQgZm9yIHR0eSVkOiAlZFxuIiwKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSwgcG9ydC0+Y291bnQpOworCQlwb3J0LT5jb3VudCA9IDA7CisJfQorCisJc3hfc2h1dGRvd25fcG9ydChicCwgcG9ydCk7CisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXR0eS0+Y2xvc2luZyA9IDA7CisJcG9ydC0+ZXZlbnQgPSAwOworCXBvcnQtPnR0eSA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCWlmIChwb3J0LT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKHBvcnQtPmNsb3NlX2RlbGF5KSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHBvcnQtPmNsb3NlX2RlbGF5KSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOworCX0KKwlwb3J0LT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5jbG9zZV93YWl0KTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyBpbnQgc3hfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQgPSAoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicDsKKwlpbnQgYywgdG90YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyKCk7CisJaWYgKHN4X3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInN4X3dyaXRlIikpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAwOworCX0KKwkKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisKKwlpZiAoIXR0eSB8fCAhcG9ydC0+eG1pdF9idWYgfHwgIXRtcF9idWYpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlICgxKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJCWMgPSBtaW5fdChpbnQsIGNvdW50LCBtaW4oU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfY250IC0gMSwKKwkJCQkgICBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9oZWFkKSk7CisJCWlmIChjIDw9IDApIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJCW1lbWNweShwb3J0LT54bWl0X2J1ZiArIHBvcnQtPnhtaXRfaGVhZCwgYnVmLCBjKTsKKwkJcG9ydC0+eG1pdF9oZWFkID0gKHBvcnQtPnhtaXRfaGVhZCArIGMpICYgKFNFUklBTF9YTUlUX1NJWkUtMSk7CisJCXBvcnQtPnhtaXRfY250ICs9IGM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKwkJdG90YWwgKz0gYzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlpZiAocG9ydC0+eG1pdF9jbnQgJiYgIXR0eS0+c3RvcHBlZCAmJiAhdHR5LT5od19zdG9wcGVkICYmCisJICAgICEocG9ydC0+SUVSICYgSUVSX1RYUkRZKSkgeworCQlwb3J0LT5JRVIgfD0gSUVSX1RYUkRZOworCQlzeF9vdXQoYnAsIENEMTg2eF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlzeF9vdXQoYnAsIENEMTg2eF9JRVIsIHBvcnQtPklFUik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJZnVuY19leGl0KCk7CisKKwlyZXR1cm4gdG90YWw7Cit9CisKKworc3RhdGljIHZvaWQgc3hfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICAqIGJwOworCisJZnVuY19lbnRlcigpOworCisJaWYgKHN4X3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInN4X3B1dF9jaGFyIikpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybjsKKwl9CisJZHByaW50ayAoU1hfREVCVUdfVFgsICJjaGVjayB0dHk6ICVwICVwXG4iLCB0dHksIHBvcnQtPnhtaXRfYnVmKTsKKwlpZiAoIXR0eSB8fCAhcG9ydC0+eG1pdF9idWYpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybjsKKwl9CisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlkcHJpbnRrIChTWF9ERUJVR19UWCwgInhtaXRfY250OiAlZCB4bWl0X2J1ZjogJXBcbiIsIHBvcnQtPnhtaXRfY250LCBwb3J0LT54bWl0X2J1Zik7CisJaWYgKChwb3J0LT54bWl0X2NudCA+PSBTRVJJQUxfWE1JVF9TSVpFIC0gMSkgfHwgKCFwb3J0LT54bWl0X2J1ZikpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCQlkcHJpbnRrIChTWF9ERUJVR19UWCwgIkV4aXQgc2l6ZVxuIik7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCWRwcmludGsgKFNYX0RFQlVHX1RYLCAiSGFuZGxlIHhtaXQ6ICVwICVwXG4iLCBwb3J0LCBwb3J0LT54bWl0X2J1Zik7CisJcG9ydC0+eG1pdF9idWZbcG9ydC0+eG1pdF9oZWFkKytdID0gY2g7CisJcG9ydC0+eG1pdF9oZWFkICY9IFNFUklBTF9YTUlUX1NJWkUgLSAxOworCXBvcnQtPnhtaXRfY250Kys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCisJZnVuY19leGl0KCk7Cit9CisKKworc3RhdGljIHZvaWQgc3hfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICAqIGJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKworCWZ1bmNfZW50ZXIoKTsKKworCWlmIChzeF9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJzeF9mbHVzaF9jaGFycyIpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCWlmIChwb3J0LT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQgfHwKKwkgICAgIXBvcnQtPnhtaXRfYnVmKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXBvcnQtPklFUiB8PSBJRVJfVFhSRFk7CisJc3hfb3V0KHBvcnRfQm9hcmQocG9ydCksIENEMTg2eF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCXN4X291dChwb3J0X0JvYXJkKHBvcnQpLCBDRDE4NnhfSUVSLCBwb3J0LT5JRVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgaW50IHN4X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJaW50CXJldDsKKworCWZ1bmNfZW50ZXIoKTsKKworCWlmIChzeF9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJzeF93cml0ZV9yb29tIikpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2NudCAtIDE7CisJaWYgKHJldCA8IDApCisJCXJldCA9IDA7CisKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgc3hfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlmdW5jX2VudGVyKCk7CisJCisJaWYgKHN4X3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInN4X2NoYXJzX2luX2J1ZmZlciIpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gMDsKKwl9CisJZnVuY19leGl0KCk7CisJcmV0dXJuIHBvcnQtPnhtaXRfY250OworfQorCisKK3N0YXRpYyB2b2lkIHN4X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAgKiBicDsKKworCWZ1bmNfZW50ZXIoKTsKKworCWlmIChzeF9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJzeF9mbHVzaF9idWZmZXIiKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKworCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXBvcnQtPnhtaXRfY250ID0gcG9ydC0+eG1pdF9oZWFkID0gcG9ydC0+eG1pdF90YWlsID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJdHR5X3dha2V1cCh0dHkpOworCisJZnVuY19leGl0KCk7Cit9CisKKworc3RhdGljIGludCBzeF90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQgPSAoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICogYnA7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlcigpOworCisJaWYgKHN4X3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgX19GVU5DVElPTl9fKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCXNwaW5fbG9ja19pcnFzYXZlICgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCXN0YXR1cyA9IHN4X2luKGJwLCBDRDE4NnhfTVNWUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlkcHJpbnRrIChTWF9ERUJVR19JTklULCAiR290IG1zdnJbJWRdID0gJTAyeCwgY2FyID0gJWQuXG4iLAorCQlwb3J0X05vKHBvcnQpLCBzdGF0dXMsIHN4X2luIChicCwgQ0QxODZ4X0NBUikpOworCWRwcmludGsgKFNYX0RFQlVHX0lOSVQsICJzeF9wb3J0ID0gJXAsIHBvcnQgPSAlcFxuIiwgc3hfcG9ydCwgcG9ydCk7CisJaWYgKFNYX0NSVFNDVFMocG9ydC0+dHR5KSkgeworCQlyZXN1bHQgID0gLyogICAoc3RhdHVzICYgTVNWUl9SVFMpID8gKi8gVElPQ01fRFRSIC8qIDogMCkgKi8gCisJCSAgICAgICAgICB8ICAgKChzdGF0dXMgJiBNU1ZSX0RUUikgPyBUSU9DTV9SVFMgOiAwKQorCQkgICAgICAgICAgfCAgICgoc3RhdHVzICYgTVNWUl9DRCkgID8gVElPQ01fQ0FSIDogMCkKKwkJICAgICAgICAgIHwvKiAoKHN0YXR1cyAmIE1TVlJfRFNSKSA/ICovIFRJT0NNX0RTUiAvKiA6IDApICovCisJCSAgICAgICAgICB8ICAgKChzdGF0dXMgJiBNU1ZSX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKKwl9IGVsc2UgeworCQlyZXN1bHQgID0gLyogICAoc3RhdHVzICYgTVNWUl9SVFMpID8gKi8gVElPQ01fUlRTIC8qIDogMCkgKi8gCisJCSAgICAgICAgICB8ICAgKChzdGF0dXMgJiBNU1ZSX0RUUikgPyBUSU9DTV9EVFIgOiAwKQorCQkgICAgICAgICAgfCAgICgoc3RhdHVzICYgTVNWUl9DRCkgID8gVElPQ01fQ0FSIDogMCkKKwkJICAgICAgICAgIHwvKiAoKHN0YXR1cyAmIE1TVlJfRFNSKSA/ICovIFRJT0NNX0RTUiAvKiA6IDApICovCisJCSAgICAgICAgICB8ICAgKChzdGF0dXMgJiBNU1ZSX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKKwl9CisKKwlmdW5jX2V4aXQoKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGludCBzeF90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQgPSAoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwOworCisJZnVuY19lbnRlcigpOworCisJaWYgKHN4X3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgX19GVU5DVElPTl9fKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKyAgIC8qCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCXBvcnQtPk1TVlIgfD0gTVNWUl9SVFM7ICovCisgICAvKiAgIGlmIChzZXQgJiBUSU9DTV9EVFIpCisJCXBvcnQtPk1TVlIgfD0gTVNWUl9EVFI7ICovCisKKwlpZiAoU1hfQ1JUU0NUUyhwb3J0LT50dHkpKSB7CisJCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCQlwb3J0LT5NU1ZSIHw9IE1TVlJfRFRSOworCX0gZWxzZSB7CisJCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCQlwb3J0LT5NU1ZSIHw9IE1TVlJfRFRSOworCX0KKworICAvKglpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCXBvcnQtPk1TVlIgJj0gfk1TVlJfUlRTOyAqLworICAvKiAgICBpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCXBvcnQtPk1TVlIgJj0gfk1TVlJfRFRSOyAqLworCWlmIChTWF9DUlRTQ1RTKHBvcnQtPnR0eSkpIHsKKwkJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQkJcG9ydC0+TVNWUiAmPSB+TVNWUl9EVFI7CisJfSBlbHNlIHsKKwkJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQkJcG9ydC0+TVNWUiAmPSB+TVNWUl9EVFI7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X291dChicCwgQ0QxODZ4X0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJc3hfb3V0KGJwLCBDRDE4NnhfTVNWUiwgcG9ydC0+TVNWUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJZnVuY19leGl0KCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHN4X3NlbmRfYnJlYWsoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICogcG9ydCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJZnVuY19lbnRlcigpOworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJcG9ydC0+YnJlYWtfbGVuZ3RoID0gU1BFQ0lBTElYX1RQUyAvIEhaICogbGVuZ3RoOworCXBvcnQtPkNPUjIgfD0gQ09SMl9FVEM7CisJcG9ydC0+SUVSICB8PSBJRVJfVFhSRFk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfb3V0KGJwLCBDRDE4NnhfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9DT1IyLCBwb3J0LT5DT1IyKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9JRVIsIHBvcnQtPklFUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXN4X3dhaXRfQ0NSKGJwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9DQ1IsIENDUl9DT1JDSEcyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCXN4X3dhaXRfQ0NSKGJwKTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHN4X3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKiBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqIG5ld2luZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOworCXN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwlpbnQgY2hhbmdlX3NwZWVkOworCisJZnVuY19lbnRlcigpOworCS8qCisJZXJyb3IgPSB2ZXJpZnlfYXJlYShWRVJJRllfUkVBRCwgKHZvaWQgKikgbmV3aW5mbywgc2l6ZW9mKHRtcCkpOworCWlmIChlcnJvcikgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkqLworCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCBuZXdpbmZvLCBzaXplb2YodG1wKSkpIHsKKwkJZnVuY19lbnRlcigpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJCisjaWYgMAkKKwlpZiAoKHRtcC5pcnEgIT0gYnAtPmlycSkgfHwKKwkgICAgKHRtcC5wb3J0ICE9IGJwLT5iYXNlKSB8fAorCSAgICAodG1wLnR5cGUgIT0gUE9SVF9DSVJSVVMpIHx8CisJICAgICh0bXAuYmF1ZF9iYXNlICE9IChTWF9PU0NGUkVRICsgQ0QxODZ4X1RQQy8yKSAvIENEMTg2eF9UUEMpIHx8CisJICAgICh0bXAuY3VzdG9tX2Rpdmlzb3IgIT0gMCkgfHwKKwkgICAgKHRtcC54bWl0X2ZpZm9fc2l6ZSAhPSBDRDE4NnhfTkZJRk8pIHx8CisJICAgICh0bXAuZmxhZ3MgJiB+U1BFQ0lBTElYX0xFR0FMX0ZMQUdTKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2VuZGlmCQorCisJY2hhbmdlX3NwZWVkID0gKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSAhPQorCQkJKHRtcC5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSk7CisJY2hhbmdlX3NwZWVkIHw9ICh0bXAuY3VzdG9tX2Rpdmlzb3IgIT0gcG9ydC0+Y3VzdG9tX2Rpdmlzb3IpOworCQorCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlpZiAoKHRtcC5jbG9zZV9kZWxheSAhPSBwb3J0LT5jbG9zZV9kZWxheSkgfHwKKwkJICAgICh0bXAuY2xvc2luZ193YWl0ICE9IHBvcnQtPmNsb3Npbmdfd2FpdCkgfHwKKwkJICAgICgodG1wLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPQorCQkgICAgIChwb3J0LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKSB7CisJCQlmdW5jX2V4aXQoKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJcG9ydC0+ZmxhZ3MgPSAoKHBvcnQtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CisJCSAgICAgICAgICAgICAgICAgICh0bXAuZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOworCQlwb3J0LT5jdXN0b21fZGl2aXNvciA9IHRtcC5jdXN0b21fZGl2aXNvcjsKKwl9IGVsc2UgeworCQlwb3J0LT5mbGFncyA9ICgocG9ydC0+ZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwKKwkJICAgICAgICAgICAgICAgICAgKHRtcC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CisJCXBvcnQtPmNsb3NlX2RlbGF5ID0gdG1wLmNsb3NlX2RlbGF5OworCQlwb3J0LT5jbG9zaW5nX3dhaXQgPSB0bXAuY2xvc2luZ193YWl0OworCQlwb3J0LT5jdXN0b21fZGl2aXNvciA9IHRtcC5jdXN0b21fZGl2aXNvcjsKKwl9CisJaWYgKGNoYW5nZV9zcGVlZCkgeworCQlzeF9jaGFuZ2Vfc3BlZWQoYnAsIHBvcnQpOworCX0KKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBzeF9nZXRfc2VyaWFsX2luZm8oc3RydWN0IHNwZWNpYWxpeF9wb3J0ICogcG9ydCwKKwkJCQkgICAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqcmV0aW5mbykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCS8vCWludCBlcnJvcjsKKwkKKwlmdW5jX2VudGVyKCk7CisKKwkvKgorCWVycm9yID0gdmVyaWZ5X2FyZWEoVkVSSUZZX1dSSVRFLCAodm9pZCAqKSByZXRpbmZvLCBzaXplb2YodG1wKSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJKi8KKworCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisJdG1wLnR5cGUgPSBQT1JUX0NJUlJVUzsKKwl0bXAubGluZSA9IHBvcnQgLSBzeF9wb3J0OworCXRtcC5wb3J0ID0gYnAtPmJhc2U7CisJdG1wLmlycSAgPSBicC0+aXJxOworCXRtcC5mbGFncyA9IHBvcnQtPmZsYWdzOworCXRtcC5iYXVkX2Jhc2UgPSAoU1hfT1NDRlJFUSArIENEMTg2eF9UUEMvMikgLyBDRDE4NnhfVFBDOworCXRtcC5jbG9zZV9kZWxheSA9IHBvcnQtPmNsb3NlX2RlbGF5ICogSFovMTAwOworCXRtcC5jbG9zaW5nX3dhaXQgPSBwb3J0LT5jbG9zaW5nX3dhaXQgKiBIWi8xMDA7CisJdG1wLmN1c3RvbV9kaXZpc29yID0gIHBvcnQtPmN1c3RvbV9kaXZpc29yOworCXRtcC54bWl0X2ZpZm9fc2l6ZSA9IENEMTg2eF9ORklGTzsKKwlpZiAoY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZih0bXApKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZnVuY19leGl0KCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzeF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwLCAKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IHJldHZhbDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWZ1bmNfZW50ZXIoKTsKKworCWlmIChzeF9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJzeF9pb2N0bCIpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJc3dpdGNoIChjbWQpIHsKKwkgY2FzZSBUQ1NCUks6CS8qIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhayAqLworCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWZ1bmNfZXhpdCgpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCWlmICghYXJnKQorCQkJc3hfc2VuZF9icmVhayhwb3J0LCBIWi80KTsJLyogMS80IHNlY29uZCAqLworCQlyZXR1cm4gMDsKKwkgY2FzZSBUQ1NCUktQOgkvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpICovCisJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJaWYgKHJldHZhbCkgeworCQkJZnVuY19leGl0KCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJc3hfc2VuZF9icmVhayhwb3J0LCBhcmcgPyBhcmcqKEhaLzEwKSA6IEhaLzQpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIDA7CisJIGNhc2UgVElPQ0dTT0ZUQ0FSOgorCQkgaWYgKHB1dF91c2VyKENfQ0xPQ0FMKHR0eSk/MTowLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKSkgeworCQkJIGZ1bmNfZXhpdCgpOworCQkJIHJldHVybiAtRUZBVUxUOworCQkgfQorCQkgZnVuY19leGl0KCk7CisJCXJldHVybiAwOworCSBjYXNlIFRJT0NTU09GVENBUjoKKwkJIGlmIChnZXRfdXNlcihhcmcsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKSkgeworCQkJIGZ1bmNfZXhpdCgpOworCQkJIHJldHVybiAtRUZBVUxUOworCQkgfQorCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQorCQkJKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8CisJCQkoYXJnID8gQ0xPQ0FMIDogMCkpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIDA7CisJIGNhc2UgVElPQ0dTRVJJQUw6CisJCSBmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIHN4X2dldF9zZXJpYWxfaW5mbyhwb3J0LCBhcmdwKTsKKwkgY2FzZSBUSU9DU1NFUklBTDoJCisJCSBmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIHN4X3NldF9zZXJpYWxfaW5mbyhwb3J0LCBhcmdwKTsKKwkgZGVmYXVsdDoKKwkJIGZ1bmNfZXhpdCgpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBzeF90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQgPSAoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlcigpOworCisJaWYgKHN4X3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInN4X3Rocm90dGxlIikpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybjsKKwl9CisJCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCQorCS8qIFVzZSBEVFIgaW5zdGVhZCBvZiBSVFMgISAqLworCWlmIChTWF9DUlRTQ1RTICh0dHkpKSAKKwkJcG9ydC0+TVNWUiAmPSB+TVNWUl9EVFI7CisJZWxzZSB7CisJCS8qIEF1Y2ghISEgSSB0aGluayB0aGUgc3lzdGVtIHNob3VsZG4ndCBjYWxsIHRoaXMgdGhlbi4gKi8KKwkJLyogT3IgbWF5YmUgd2UncmUgc3VwcG9zZWQgKGFsbG93ZWQ/KSB0byBkbyBvdXIgc2lkZSBvZiBodworCQkgICBoYW5kc2hha2UgYW55d2F5LCBldmVuIHdoZW4gaGFyZHdhcmUgaGFuZHNoYWtlIGlzIG9mZi4gCisJCSAgIFdoZW4geW91IHNlZSB0aGlzIGluIHlvdXIgbG9ncywgcGxlYXNlIHJlcG9ydC4uLi4gKi8KKwkJcHJpbnRrIChLRVJOX0VSUiAic3glZDogTmVlZCB0byB0aHJvdHRsZSwgYnV0IGNhbid0IChoYXJkd2FyZSBocyBpcyBvZmYpXG4iLAorCSAgICAgICAgICAgICAgICAgcG9ydF9ObyAocG9ydCkpOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJaWYgKElfSVhPRkYodHR5KSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCQlzeF93YWl0X0NDUihicCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCQlzeF9vdXQoYnAsIENEMTg2eF9DQ1IsIENDUl9TU0NIMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCXN4X3dhaXRfQ0NSKGJwKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfb3V0KGJwLCBDRDE4NnhfTVNWUiwgcG9ydC0+TVNWUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyB2b2lkIHN4X3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIoKTsKKwkJCQkKKwlpZiAoc3hfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAic3hfdW50aHJvdHRsZSIpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCQorCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCS8qIFhYWFggVXNlIERUUiBJTlNURUFEPz8/PyAqLworCWlmIChTWF9DUlRTQ1RTKHR0eSkpIHsKKwkJcG9ydC0+TVNWUiB8PSBNU1ZSX0RUUjsKKwl9IC8qIEVsc2UgY2xhdXNlOiBzZWUgcmVtYXJrIGluICJzeF90aHJvdHRsZSIuLi4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJaWYgKElfSVhPRkYodHR5KSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJCXN4X3dhaXRfQ0NSKGJwKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCXN4X291dChicCwgQ0QxODZ4X0NDUiwgQ0NSX1NTQ0gxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJc3hfd2FpdF9DQ1IoYnApOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9NU1ZSLCBwb3J0LT5NU1ZSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyB2b2lkIHN4X3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIoKTsKKwkKKwlpZiAoc3hfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAic3hfc3RvcCIpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJcG9ydC0+SUVSICY9IH5JRVJfVFhSRFk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJc3hfb3V0KGJwLCBDRDE4NnhfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlzeF9vdXQoYnAsIENEMTg2eF9JRVIsIHBvcnQtPklFUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgdm9pZCBzeF9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKnBvcnQgPSAoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkICpicDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlcigpOworCQkJCQorCWlmIChzeF9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJzeF9zdGFydCIpKSB7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm47CisJfQorCQorCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCWlmIChwb3J0LT54bWl0X2NudCAmJiBwb3J0LT54bWl0X2J1ZiAmJiAhKHBvcnQtPklFUiAmIElFUl9UWFJEWSkpIHsKKwkJcG9ydC0+SUVSIHw9IElFUl9UWFJEWTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCXN4X291dChicCwgQ0QxODZ4X0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJCXN4X291dChicCwgQ0QxODZ4X0lFUiwgcG9ydC0+SUVSKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCisJZnVuY19leGl0KCk7Cit9CisKKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSB0aGUgd29yay1xdWV1ZSB3aGVuIHRoZSBpbnRlcnJ1cHQKKyAqIHJvdXRpbmUgaGFzIHNpZ25hbGxlZCB0aGF0IGEgaGFuZ3VwIGhhcyBvY2N1cnJlZC4gIFRoZSBwYXRoIG9mCisgKiBoYW5ndXAgcHJvY2Vzc2luZyBpczoKKyAqCisgKiAJc2VyaWFsIGludGVycnVwdCByb3V0aW5lIC0+ICh3b3JrcXVldWUpIC0+CisgKiAJZG9fc3hfaGFuZ3VwKCkgLT4gdHR5LT5oYW5ndXAoKSAtPiBzeF9oYW5ndXAoKQorICogCisgKi8KK3N0YXRpYyB2b2lkIGRvX3N4X2hhbmd1cCh2b2lkICpwcml2YXRlXykKK3sKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQJKnBvcnQgPSAoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICopIHByaXZhdGVfOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJCisJZnVuY19lbnRlcigpOworCisJdHR5ID0gcG9ydC0+dHR5OworCWlmICh0dHkpCisJCXR0eV9oYW5ndXAodHR5KTsJLyogRklYTUU6IG1vZHVsZSByZW1vdmFsIHJhY2UgaGVyZSAqLworCisJZnVuY19leGl0KCk7Cit9CisKKworc3RhdGljIHZvaWQgc3hfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyKCk7CisKKwlpZiAoc3hfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAic3hfaGFuZ3VwIikpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybjsKKwl9CisJCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCQorCXN4X3NodXRkb3duX3BvcnQoYnAsIHBvcnQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJcG9ydC0+ZXZlbnQgPSAwOworCWJwLT5jb3VudCAtPSBwb3J0LT5jb3VudDsKKwlpZiAoYnAtPmNvdW50IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgInN4JWQ6IHN4X2hhbmd1cDogYmFkIGJvYXJkIGNvdW50OiAlZCBwb3J0OiAlZFxuIiwKKwkJCWJvYXJkX05vKGJwKSwgYnAtPmNvdW50LCB0dHktPmluZGV4KTsKKwkJYnAtPmNvdW50ID0gMDsKKwl9CisJcG9ydC0+Y291bnQgPSAwOworCXBvcnQtPmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOworCXBvcnQtPnR0eSA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3Blbl93YWl0KTsKKworCWZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyB2b2lkIHN4X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZF90ZXJtaW9zKQoreworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAgKiBicDsKKwkJCQkKKwlpZiAoc3hfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAic3hfc2V0X3Rlcm1pb3MiKSkKKwkJcmV0dXJuOworCQorCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiYKKwkgICAgdHR5LT50ZXJtaW9zLT5jX2lmbGFnID09IG9sZF90ZXJtaW9zLT5jX2lmbGFnKQorCQlyZXR1cm47CisKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlzeF9jaGFuZ2Vfc3BlZWQocG9ydF9Cb2FyZChwb3J0KSwgcG9ydCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCisJICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJc3hfc3RhcnQodHR5KTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKK3sKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQJKnBvcnQgPSAoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICopIHByaXZhdGVfOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisKKwlmdW5jX2VudGVyKCk7CisKKwlpZighKHR0eSA9IHBvcnQtPnR0eSkpIHsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJTX0VWRU5UX1dSSVRFX1dBS0VVUCwgJnBvcnQtPmV2ZW50KSkgeworIAkJdHR5X3dha2V1cCh0dHkpOworCQkvL3dha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl9CisKKwlmdW5jX2V4aXQoKTsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBzeF9vcHMgPSB7CisJLm9wZW4gID0gc3hfb3BlbiwKKwkuY2xvc2UgPSBzeF9jbG9zZSwKKwkud3JpdGUgPSBzeF93cml0ZSwKKwkucHV0X2NoYXIgPSBzeF9wdXRfY2hhciwKKwkuZmx1c2hfY2hhcnMgPSBzeF9mbHVzaF9jaGFycywKKwkud3JpdGVfcm9vbSA9IHN4X3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlciA9IHN4X2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfYnVmZmVyID0gc3hfZmx1c2hfYnVmZmVyLAorCS5pb2N0bCA9IHN4X2lvY3RsLAorCS50aHJvdHRsZSA9IHN4X3Rocm90dGxlLAorCS51bnRocm90dGxlID0gc3hfdW50aHJvdHRsZSwKKwkuc2V0X3Rlcm1pb3MgPSBzeF9zZXRfdGVybWlvcywKKwkuc3RvcCA9IHN4X3N0b3AsCisJLnN0YXJ0ID0gc3hfc3RhcnQsCisJLmhhbmd1cCA9IHN4X2hhbmd1cCwKKwkudGlvY21nZXQgPSBzeF90aW9jbWdldCwKKwkudGlvY21zZXQgPSBzeF90aW9jbXNldCwKK307CisKK3N0YXRpYyBpbnQgc3hfaW5pdF9kcml2ZXJzKHZvaWQpCit7CisJaW50IGVycm9yOworCWludCBpOworCisJZnVuY19lbnRlcigpOworCisJc3BlY2lhbGl4X2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoU1hfTkJPQVJEICogU1hfTlBPUlQpOworCWlmICghc3BlY2lhbGl4X2RyaXZlcikgeworCQlwcmludGsoS0VSTl9FUlIgInN4OiBDb3VsZG4ndCBhbGxvY2F0ZSB0dHlfZHJpdmVyLlxuIik7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gMTsKKwl9CisJCisJaWYgKCEodG1wX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzeDogQ291bGRuJ3QgZ2V0IGZyZWUgcGFnZS5cbiIpOworCQlwdXRfdHR5X2RyaXZlcihzcGVjaWFsaXhfZHJpdmVyKTsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiAxOworCX0KKwlzcGVjaWFsaXhfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXNwZWNpYWxpeF9kcml2ZXItPm5hbWUgPSAidHR5VyI7CisJc3BlY2lhbGl4X2RyaXZlci0+bWFqb3IgPSBTUEVDSUFMSVhfTk9STUFMX01BSk9SOworCXNwZWNpYWxpeF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXNwZWNpYWxpeF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJc3BlY2lhbGl4X2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXNwZWNpYWxpeF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkJQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCXNwZWNpYWxpeF9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoc3BlY2lhbGl4X2RyaXZlciwgJnN4X29wcyk7CisKKwlpZiAoKGVycm9yID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihzcGVjaWFsaXhfZHJpdmVyKSkpIHsKKwkJcHV0X3R0eV9kcml2ZXIoc3BlY2lhbGl4X2RyaXZlcik7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0bXBfYnVmKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJzeDogQ291bGRuJ3QgcmVnaXN0ZXIgc3BlY2lhbGl4IElPOCsgZHJpdmVyLCBlcnJvciA9ICVkXG4iLAorCQkgICAgICAgZXJyb3IpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIDE7CisJfQorCW1lbXNldChzeF9wb3J0LCAwLCBzaXplb2Yoc3hfcG9ydCkpOworCWZvciAoaSA9IDA7IGkgPCBTWF9OUE9SVCAqIFNYX05CT0FSRDsgaSsrKSB7CisJCXN4X3BvcnRbaV0ubWFnaWMgPSBTUEVDSUFMSVhfTUFHSUM7CisJCUlOSVRfV09SSygmc3hfcG9ydFtpXS50cXVldWUsIGRvX3NvZnRpbnQsICZzeF9wb3J0W2ldKTsKKwkJSU5JVF9XT1JLKCZzeF9wb3J0W2ldLnRxdWV1ZV9oYW5ndXAsIGRvX3N4X2hhbmd1cCwgJnN4X3BvcnRbaV0pOworCQlzeF9wb3J0W2ldLmNsb3NlX2RlbGF5ID0gNTAgKiBIWi8xMDA7CisJCXN4X3BvcnRbaV0uY2xvc2luZ193YWl0ID0gMzAwMCAqIEhaLzEwMDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmc3hfcG9ydFtpXS5vcGVuX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzeF9wb3J0W2ldLmNsb3NlX3dhaXQpOworCQlzcGluX2xvY2tfaW5pdCgmc3hfcG9ydFtpXS5sb2NrKTsKKwl9CisJCisJZnVuY19leGl0KCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN4X3JlbGVhc2VfZHJpdmVycyh2b2lkKQoreworCWZ1bmNfZW50ZXIoKTsKKworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0bXBfYnVmKTsKKwl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoc3BlY2lhbGl4X2RyaXZlcik7CisJcHV0X3R0eV9kcml2ZXIoc3BlY2lhbGl4X2RyaXZlcik7CisJZnVuY19leGl0KCk7Cit9CisKKy8qIAorICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGJ5IGtlcm5lbCBhdCBib290IHRpbWUgCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNwZWNpYWxpeF9pbml0KHZvaWQpCit7CisJaW50IGk7CisJaW50IGZvdW5kID0gMDsKKworCWZ1bmNfZW50ZXIoKTsKKworCXByaW50ayhLRVJOX0lORk8gInN4OiBTcGVjaWFsaXggSU84KyBkcml2ZXIgdiIgVkVSU0lPTiAiLCAoYykgUi5FLldvbGZmIDE5OTcvMTk5OC5cbiIpOworCXByaW50ayhLRVJOX0lORk8gInN4OiBkZXJpdmVkIGZyb20gd29yayAoYykgRC5Hb3JvZGNoYW5pbiAxOTk0LTE5OTYuXG4iKTsKKyNpZmRlZiBDT05GSUdfU1BFQ0lBTElYX1JUU0NUUworCXByaW50ayAoS0VSTl9JTkZPICJzeDogRFRSL1JUUyBwaW4gaXMgYWx3YXlzIFJUUy5cbiIpOworI2Vsc2UKKwlwcmludGsgKEtFUk5fSU5GTyAic3g6IERUUi9SVFMgcGluIGlzIFJUUyB3aGVuIENSVFNDVFMgaXMgb24uXG4iKTsKKyNlbmRpZgorCQorCWZvciAoaSA9IDA7IGkgPCBTWF9OQk9BUkQ7IGkrKykKKwkJc3hfYm9hcmRbaV0ubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKworCWlmIChzeF9pbml0X2RyaXZlcnMoKSkgeworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZm9yIChpID0gMDsgaSA8IFNYX05CT0FSRDsgaSsrKSAKKwkJaWYgKHN4X2JvYXJkW2ldLmJhc2UgJiYgIXN4X3Byb2JlKCZzeF9ib2FyZFtpXSkpCisJCQlmb3VuZCsrOworCisjaWZkZWYgQ09ORklHX1BDSQorCXsKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCisJCWk9MDsKKwkJd2hpbGUgKGkgPCBTWF9OQk9BUkQpIHsKKwkJCWlmIChzeF9ib2FyZFtpXS5mbGFncyAmIFNYX0JPQVJEX1BSRVNFTlQpIHsKKwkJCQlpKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlIChQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWCwgCisJCQkgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9JTzgsIAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgcGRldik7CisJCQlpZiAoIXBkZXYpIGJyZWFrOworCisJCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCQkJY29udGludWU7CisKKwkJCXN4X2JvYXJkW2ldLmlycSA9IHBkZXYtPmlycTsKKworCQkJc3hfYm9hcmRbaV0uYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMik7CisKKwkJCXN4X2JvYXJkW2ldLmZsYWdzIHw9IFNYX0JPQVJEX0lTX1BDSTsKKwkJCWlmICghc3hfcHJvYmUoJnN4X2JvYXJkW2ldKSkKKwkJCQlmb3VuZCArKzsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKCFmb3VuZCkgeworCQlzeF9yZWxlYXNlX2RyaXZlcnMoKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic3g6IE5vIHNwZWNpYWxpeCBJTzgrIGJvYXJkcyBkZXRlY3RlZC5cbiIpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZnVuY19leGl0KCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9iYXNlW1NYX05CT0FSRF0gID0gezAsfTsKKworc3RhdGljIGludCBpcnEgW1NYX05CT0FSRF0gPSB7MCx9OworCittb2R1bGVfcGFyYW1fYXJyYXkoaW9iYXNlLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShzeF9kZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzeF9yeGZpZm8sIGludCwgMCk7CisjaWZkZWYgU1BFQ0lBTElYX1RJTUVSCittb2R1bGVfcGFyYW0oc3hfcG9sbCwgaW50LCAwKTsKKyNlbmRpZgorCisvKgorICogWW91IGNhbiBzZXR1cCB1cCB0byA0IGJvYXJkcy4KKyAqIGJ5IHNwZWNpZnlpbmcgImlvYmFzZT0weFhYWCwweFhYWCAuLi4iIGFzIGluc21vZCBwYXJhbWV0ZXIuCisgKiBZb3Ugc2hvdWxkIHNwZWNpZnkgdGhlIElSUXMgdG9vIGluIHRoYXQgY2FzZSAiaXJxPS4uLi4sLi4uIi4gCisgKiAKKyAqIE1vcmUgdGhhbiA0IGJvYXJkcyBpbiBvbmUgY29tcHV0ZXIgaXMgbm90IHBvc3NpYmxlLCBhcyB0aGUgY2FyZCBjYW4KKyAqIG9ubHkgdXNlIDQgZGlmZmVyZW50IGludGVycnVwdHMuIAorICoKKyAqLworc3RhdGljIGludCBfX2luaXQgc3BlY2lhbGl4X2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmdW5jX2VudGVyKCk7CisKKwlpbml0X01VVEVYKCZ0bXBfYnVmX3NlbSk7IC8qIEluaXQgZGUgdGhlIHNlbWFwaG9yZSAtIHB2ZGwgKi8KKworCWlmIChpb2Jhc2VbMF0gfHwgaW9iYXNlWzFdIHx8IGlvYmFzZVsyXSB8fCBpb2Jhc2VbM10pIHsKKwkJZm9yKGkgPSAwOyBpIDwgU1hfTkJPQVJEOyBpKyspIHsKKwkJCXN4X2JvYXJkW2ldLmJhc2UgPSBpb2Jhc2VbaV07CisJCQlzeF9ib2FyZFtpXS5pcnEgPSBpcnFbaV07CisJCQlzeF9ib2FyZFtpXS5jb3VudD0gMDsKKwkJfQorCX0KKworCWZ1bmNfZXhpdCgpOworCisJcmV0dXJuIHNwZWNpYWxpeF9pbml0KCk7Cit9CisJCitzdGF0aWMgdm9pZCBfX2V4aXQgc3BlY2lhbGl4X2V4aXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisJCisJZnVuY19lbnRlcigpOworCisJc3hfcmVsZWFzZV9kcml2ZXJzKCk7CisJZm9yIChpID0gMDsgaSA8IFNYX05CT0FSRDsgaSsrKQorCQlpZiAoc3hfYm9hcmRbaV0uZmxhZ3MgJiBTWF9CT0FSRF9QUkVTRU5UKSAKKwkJCXN4X3JlbGVhc2VfaW9fcmFuZ2UoJnN4X2JvYXJkW2ldKTsKKyNpZmRlZiBTUEVDSUFMSVhfVElNRVIKKwlkZWxfdGltZXIgKCZtaXNzZWRfaXJxX3RpbWVyKTsKKyNlbmRpZgorCisJZnVuY19leGl0KCk7Cit9CisKK21vZHVsZV9pbml0KHNwZWNpYWxpeF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChzcGVjaWFsaXhfZXhpdF9tb2R1bGUpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4X2lvOC5oIGIvZHJpdmVycy9jaGFyL3NwZWNpYWxpeF9pbzguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTViZDkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3NwZWNpYWxpeF9pbzguaApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqICAgICAgbGludXgvZHJpdmVycy9jaGFyL3NwZWNpYWxpeF9pbzguaCAgLS0gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lhbGl4IElPOCsgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgUm9nZXIgV29sZmYgKFIuRS5Xb2xmZkBCaXRXaXphcmQubmwpCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2ICBEbWl0cnkgR29yb2RjaGFuaW4gKHBnbWRzZ0BpYmkuY29tKQorICoKKyAqCisgKiAgICAgIFNwZWNpYWxpeCBwYXlzIGZvciB0aGUgZGV2ZWxvcG1lbnQgYW5kIHN1cHBvcnQgb2YgdGhpcyBkcml2ZXIuCisgKiAgICAgIFBsZWFzZSBETyBjb250YWN0IGlvOC1saW51eEBzcGVjaWFsaXguY28udWsgaWYgeW91IHJlcXVpcmUKKyAqICAgICAgc3VwcG9ydC4KKyAqCisgKiAgICAgIFRoaXMgZHJpdmVyIHdhcyBkZXZlbG9wcGVkIGluIHRoZSBCaXRXaXphcmQgbGludXggZGV2aWNlCisgKiAgICAgIGRyaXZlciBzZXJ2aWNlLiBJZiB5b3UgcmVxdWlyZSBhIGxpbnV4IGRldmljZSBkcml2ZXIgZm9yIHlvdXIKKyAqICAgICAgcHJvZHVjdCwgcGxlYXNlIGNvbnRhY3QgZGV2aWNlc0BCaXRXaXphcmQubmwgZm9yIGEgcXVvdGUuCisgKgorICogICAgICBUaGlzIGNvZGUgaXMgZmlybWx5IGJhc2VkIG9uIHRoZSByaXNjb20vOCBzZXJpYWwgZHJpdmVyLAorICogICAgICB3cml0dGVuIGJ5IERtaXRyeSBHb3JvZGNoYW5pbi4gVGhlIHNwZWNpYWxpeCBJTzgrIGNhcmQKKyAqICAgICAgcHJvZ3JhbW1pbmcgaW5mb3JtYXRpb24gd2FzIG9idGFpbmVkIGZyb20gdGhlIENMLUNEMTg2NSBEYXRhCisgKiAgICAgIEJvb2ssIGFuZCBTcGVjaWFsaXggZG9jdW1lbnQgbnVtYmVyIDYyMDAwNTk6IElPOCsgSGFyZHdhcmUKKyAqICAgICAgRnVuY3Rpb25hbCBTcGVjaWZpY2F0aW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqICAgICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiAgICAgIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgIFVTQS4KKyAqICovCisKKyNpZm5kZWYgX19MSU5VWF9TUEVDSUFMSVhfSAorI2RlZmluZSBfX0xJTlVYX1NQRUNJQUxJWF9ICisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyogWW91IGNhbiBoYXZlIG1heCA0IElTQSBjYXJkcyBpbiBvbmUgUEMsIGFuZCBJIHJlY29tbWVuZCBub3QgbXVjaCAKK21vcmUgdGhhbiBhIGZldyAgUENJIHZlcnNpb25zIG9mIHRoZSBjYXJkLiAqLworCisjZGVmaW5lIFNYX05CT0FSRAkJOAorCisvKiBOT1RFOiBTcGVjaWFsaXggZGVjb2RlciByZWNvZ25pemVzIDQgYWRkcmVzc2VzLCBidXQgb25seSB0d28gYXJlIHVzZWQuLi4uICovCisjZGVmaW5lIFNYX0lPX1NQQUNFICAgICAgICAgICAgIDQKKy8qIFRoZSBQQ0kgdmVyc2lvbiBkZWNvZGVzIDggYWRkcmVzc2VzLCBidXQgc3RpbGwgb25seSAyIGFyZSB1c2VkLiAqLworI2RlZmluZSBTWF9QQ0lfSU9fU1BBQ0UgICAgICAgICA4CisKKy8qIGVpZ2h0IHBvcnRzIHBlciBib2FyZC4gKi8KKyNkZWZpbmUgU1hfTlBPUlQgICAgICAgIAk4CisjZGVmaW5lIFNYX0JPQVJEKGxpbmUpCQkoKGxpbmUpIC8gU1hfTlBPUlQpCisjZGVmaW5lIFNYX1BPUlQobGluZSkJCSgobGluZSkgJiAoU1hfTlBPUlQgLSAxKSkKKworCisjZGVmaW5lIFNYX0RBVEFfUkVHIDAgICAgIC8qIEJhc2UrMCA6IERhdGEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1hfQUREUl9SRUcgMSAgICAgLyogYmFzZSsxIDogQWRkcmVzcyByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNSHogKjEwMDAwMDAJLyogSSdtIGFzaGFtZWQgb2YgbXlzZWxmLiAqLworCisvKiBPbi1ib2FyZCBvc2NpbGxhdG9yIGZyZXF1ZW5jeSAqLworI2RlZmluZSBTWF9PU0NGUkVRICAgICAgKDI1IE1Iei8yKQorLyogVGhlcmUgaXMgYSAyNU1IeiBjcnlzdGFsIG9uIHRoZSBib2FyZCwgYnV0IHRoZSBjaGlwIGlzIGluIC8yIG1vZGUgKi8KKworCisvKiBUaWNrcyBwZXIgc2VjLiBVc2VkIGZvciBzZXR0aW5nIHJlY2VpdmVyIHRpbWVvdXQgYW5kIGJyZWFrIGxlbmd0aCAqLworI2RlZmluZSBTUEVDSUFMSVhfVFBTCQk0MDAwCisKKy8qIFllYWgsIGFmdGVyIGhlYXZ5IHRlc3RpbmcgSSBkZWNpZGVkIGl0IG11c3QgYmUgNi4KKyAqIFN1cmUsIFlvdSBjYW4gY2hhbmdlIGl0IGlmIG5lZWRlZC4KKyAqLworI2RlZmluZSBTUEVDSUFMSVhfUlhGSUZPCTYJLyogTWF4LiByZWNlaXZlciBGSUZPIHNpemUgKDEtOCkgKi8KKworI2RlZmluZSBTUEVDSUFMSVhfTUFHSUMJCTB4MDkwNworCisjZGVmaW5lIFNYX0NDUl9USU1FT1VUIDEwMDAwICAgLyogQ0NSIHRpbWVvdXQuIFlvdSBtYXkgbmVlZCB0byB3YWl0IHVwdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBpbnRlcm5hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciBpcyBhdmFpbGFibGUgYWdhaW4gYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UgZ2l2ZSBpdCBhIGNvbW1hbmQgKi8KKworI2RlZmluZSBTWF9JT0JBU0UxCTB4MTAwCisjZGVmaW5lIFNYX0lPQkFTRTIJMHgxODAKKyNkZWZpbmUgU1hfSU9CQVNFMwkweDI1MAorI2RlZmluZSBTWF9JT0JBU0U0CTB4MjYwCisKK3N0cnVjdCBzcGVjaWFsaXhfYm9hcmQgeworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydAliYXNlOworCXVuc2lnbmVkIGNoYXIgCWlycTsKKwkvL3NpZ25lZCAgIGNoYXIJY291bnQ7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGNoYXIJRFRSOworICAgICAgICBpbnQgcmVnOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKyNkZWZpbmUgU1hfQk9BUkRfUFJFU0VOVAkweDAwMDAwMDAxCisjZGVmaW5lIFNYX0JPQVJEX0FDVElWRQkJMHgwMDAwMDAwMgorI2RlZmluZSBTWF9CT0FSRF9JU19QQ0kJCTB4MDAwMDAwMDQKKworCitzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgeworCWludAkJCW1hZ2ljOworCWludAkJCWJhdWRfYmFzZTsKKwlpbnQJCQlmbGFnczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAJKiB0dHk7CisJaW50CQkJY291bnQ7CisJaW50CQkJYmxvY2tlZF9vcGVuOworCXVsb25nCQkJZXZlbnQ7CisJaW50CQkJdGltZW91dDsKKwlpbnQJCQljbG9zZV9kZWxheTsKKwl1bnNpZ25lZCBjaGFyIAkJKiB4bWl0X2J1ZjsKKwlpbnQJCQljdXN0b21fZGl2aXNvcjsKKwlpbnQJCQl4bWl0X2hlYWQ7CisJaW50CQkJeG1pdF90YWlsOworCWludAkJCXhtaXRfY250OworCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OworCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0CXRxdWV1ZV9oYW5ndXA7CisJc2hvcnQJCQl3YWtldXBfY2hhcnM7CisJc2hvcnQJCQlicmVha19sZW5ndGg7CisJdW5zaWduZWQgc2hvcnQJCWNsb3Npbmdfd2FpdDsKKwl1bnNpZ25lZCBjaGFyCQltYXJrX21hc2s7CisJdW5zaWduZWQgY2hhcgkJSUVSOworCXVuc2lnbmVkIGNoYXIJCU1TVlI7CisJdW5zaWduZWQgY2hhcgkJQ09SMjsKKwl1bnNpZ25lZCBsb25nCQlvdmVycnVuOworCXVuc2lnbmVkIGxvbmcJCWhpdHNbMTBdOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX19MSU5VWF9TUEVDSUFMSVhfSCAqLworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTE2NjYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMKQEAgLTAsMCArMSw1MTk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglzdGFsbGlvbi5jICAtLSBzdGFsbGlvbiBtdWx0aXBvcnQgc2VyaWFsIGRyaXZlci4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSAgU3RhbGxpb24gVGVjaG5vbG9naWVzCisgKglDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiAgR3JlZyBVbmdlcmVyLgorICoKKyAqCVRoaXMgY29kZSBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZSBMaW51eCBzZXJpYWwgZHJpdmVyLCB3cml0dGVuIGJ5CisgKglMaW51cyBUb3J2YWxkcywgVGhlb2RvcmUgVCdzbyBhbmQgb3RoZXJzLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NkMTQwMC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjMjYxOTguaD4KKyNpbmNsdWRlIDxsaW51eC9jb21zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YWxsaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBDT05GSUdfUENJCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGVmaW5lIGRpZmZlcmVudCBib2FyZCB0eXBlcy4gVXNlIHRoZSBzdGFuZGFyZCBTdGFsbGlvbiAiYXNzaWduZWQiCisgKglib2FyZCBudW1iZXJzLiBCb2FyZHMgc3VwcG9ydGVkIGluIHRoaXMgZHJpdmVyIGFyZSBhYmJyZXZpYXRlZCBhcworICoJRUlPID0gRWFzeUlPIGFuZCBFQ0ggPSBFYXN5Q29ubmVjdGlvbiA4LzMyLgorICovCisjZGVmaW5lCUJSRF9FQVNZSU8JMjAKKyNkZWZpbmUJQlJEX0VDSAkJMjEKKyNkZWZpbmUJQlJEX0VDSE1DCTIyCisjZGVmaW5lCUJSRF9FQ0hQQ0kJMjYKKyNkZWZpbmUJQlJEX0VDSDY0UENJCTI3CisjZGVmaW5lCUJSRF9FQVNZSU9QQ0kJMjgKKworLyoKKyAqCURlZmluZSBhIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIHRvIGhvbGQgdGhlIGJvYXJkIGNvbmZpZ3VyYXRpb24uCisgKglOZWVkIHRvIHNldCB0aGlzIHVwIGluIHRoZSBjb2RlIChmb3Igbm93KSB3aXRoIHRoZSBib2FyZHMgdGhhdCBhcmUKKyAqCXRvIGJlIGNvbmZpZ3VyZWQgaW50byB0aGUgc3lzdGVtLiBUaGlzIGlzIHdoYXQgbmVlZHMgdG8gYmUgbW9kaWZpZWQKKyAqCXdoZW4gYWRkaW5nL3JlbW92aW5nL21vZGlmeWluZyBib2FyZHMuIEVhY2ggbGluZSBlbnRyeSBpbiB0aGUKKyAqCXN0bF9icmRjb25mW10gYXJyYXkgaXMgYSBib2FyZC4gRWFjaCBsaW5lIGNvbnRhaW5zIGlvL2lycS9tZW1vcnkKKyAqCXJhbmdlcyBmb3IgdGhhdCBib2FyZCAoYXMgd2VsbCBhcyB3aGF0IHR5cGUgb2YgYm9hcmQgaXQgaXMpLgorICoJU29tZSBleGFtcGxlczoKKyAqCQl7IEJSRF9FQVNZSU8sIDB4MmEwLCAwLCAwLCAxMCwgMCB9LAorICoJVGhpcyBsaW5lIHdvdWxkIGNvbmZpZ3VyZSBhbiBFYXN5SU8gYm9hcmQgKDQgb3IgOCwgbm8gZGlmZmVyZW5jZSksCisgKglhdCBpbyBhZGRyZXNzIDJhMCBhbmQgaXJxIDEwLgorICoJQW5vdGhlciBleGFtcGxlOgorICoJCXsgQlJEX0VDSCwgMHgyYTgsIDB4MjgwLCAwLCAxMiwgMCB9LAorICoJVGhpcyBsaW5lIHdpbGwgY29uZmlndXJlIGFuIEVhc3lDb25uZWN0aW9uIDgvMzIgYm9hcmQgYXQgcHJpbWFyeSBpbworICoJYWRkcmVzcyAyYTgsIHNlY29uZGFyeSBpbyBhZGRyZXNzIDI4MCBhbmQgaXJxIDEyLgorICoJRW50ZXIgYXMgbWFueSBsaW5lcyBpbnRvIHRoaXMgYXJyYXkgYXMgeW91IHdhbnQgKG9ubHkgdGhlIGZpcnN0IDQKKyAqCXdpbGwgYWN0dWFsbHkgYmUgdXNlZCEpLiBBbnkgY29tYmluYXRpb24gb2YgRWFzeUlPIGFuZCBFYXN5Q29ubmVjdGlvbgorICoJYm9hcmRzIGNhbiBiZSBzcGVjaWZpZWQuIEVhc3lDb25uZWN0aW9uIDgvMzIgYm9hcmRzIGNhbiBzaGFyZSB0aGVpcgorICoJc2Vjb25kYXJ5IGlvIGFkZHJlc3NlcyBiZXR3ZWVuIGVhY2ggb3RoZXIuCisgKgorICoJTk9URTogdGhlcmUgaXMgbm8gbmVlZCB0byBwdXQgYW55IGVudHJpZXMgaW4gdGhpcyB0YWJsZSBmb3IgUENJCisgKglib2FyZHMuIFRoZXkgd2lsbCBiZSBmb3VuZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBkcml2ZXIgLSBwcm92aWRlZAorICoJUENJIEJJT1MzMiBzdXBwb3J0IGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CQlicmR0eXBlOworCWludAkJaW9hZGRyMTsKKwlpbnQJCWlvYWRkcjI7CisJdW5zaWduZWQgbG9uZwltZW1hZGRyOworCWludAkJaXJxOworCWludAkJaXJxdHlwZTsKK30gc3RsY29uZl90OworCitzdGF0aWMgc3RsY29uZl90CXN0bF9icmRjb25mW10gPSB7CisJLyp7IEJSRF9FQVNZSU8sIDB4MmEwLCAwLCAwLCAxMCwgMCB9LCovCit9OworCitzdGF0aWMgaW50CXN0bF9ucmJyZHMgPSBzaXplb2Yoc3RsX2JyZGNvbmYpIC8gc2l6ZW9mKHN0bGNvbmZfdCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlZmluZSBzb21lIGltcG9ydGFudCBkcml2ZXIgY2hhcmFjdGVyaXN0aWNzLiBEZXZpY2UgbWFqb3IgbnVtYmVycworICoJYWxsb2NhdGVkIGFzIHBlciBMaW51eCBEZXZpY2UgUmVnaXN0cnkuCisgKi8KKyNpZm5kZWYJU1RMX1NJT01FTU1BSk9SCisjZGVmaW5lCVNUTF9TSU9NRU1NQUpPUgkJMjgKKyNlbmRpZgorI2lmbmRlZglTVExfU0VSSUFMTUFKT1IKKyNkZWZpbmUJU1RMX1NFUklBTE1BSk9SCQkyNAorI2VuZGlmCisjaWZuZGVmCVNUTF9DQUxMT1VUTUFKT1IKKyNkZWZpbmUJU1RMX0NBTExPVVRNQUpPUgkyNQorI2VuZGlmCisKKy8qCisgKglTZXQgdGhlIFRYIGJ1ZmZlciBzaXplLiBCaWdnZXIgaXMgYmV0dGVyLCBidXQgd2UgZG9uJ3Qgd2FudAorICoJdG8gY2hldyB0b28gbXVjaCBtZW1vcnkgd2l0aCBidWZmZXJzIQorICovCisjZGVmaW5lCVNUTF9UWEJVRkxPVwkJNTEyCisjZGVmaW5lCVNUTF9UWEJVRlNJWkUJCTQwOTYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGVmaW5lIG91ciBsb2NhbCBkcml2ZXIgaWRlbnRpdHkgZmlyc3QuIFNldCB1cCBzdHVmZiB0byBkZWFsIHdpdGgKKyAqCWFsbCB0aGUgbG9jYWwgc3RydWN0dXJlcyByZXF1aXJlZCBieSBhIHNlcmlhbCB0dHkgZHJpdmVyLgorICovCitzdGF0aWMgY2hhcgkqc3RsX2RydnRpdGxlID0gIlN0YWxsaW9uIE11bHRpcG9ydCBTZXJpYWwgRHJpdmVyIjsKK3N0YXRpYyBjaGFyCSpzdGxfZHJ2bmFtZSA9ICJzdGFsbGlvbiI7CitzdGF0aWMgY2hhcgkqc3RsX2RydnZlcnNpb24gPSAiNS42LjAiOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIJKnN0bF9zZXJpYWw7CisKKy8qCisgKglXZSB3aWxsIG5lZWQgdG8gYWxsb2NhdGUgYSB0ZW1wb3Jhcnkgd3JpdGUgYnVmZmVyIGZvciBjaGFycyB0aGF0CisgKgljb21lIGRpcmVjdCBmcm9tIHVzZXIgc3BhY2UuIFRoZSBwcm9ibGVtIGlzIHRoYXQgYSBjb3B5IGZyb20gdXNlcgorICoJc3BhY2UgbWlnaHQgY2F1c2UgYSBwYWdlIGZhdWx0ICh0eXBpY2FsbHkgb24gYSBzeXN0ZW0gdGhhdCBpcworICoJc3dhcHBpbmchKS4gQWxsIHBvcnRzIHdpbGwgc2hhcmUgb25lIGJ1ZmZlciAtIHNpbmNlIGlmIHRoZSBzeXN0ZW0KKyAqCWlzIGFscmVhZHkgc3dhcHBpbmcgYSBzaGFyZWQgYnVmZmVyIHdvbid0IG1ha2UgdGhpbmdzIGFueSB3b3JzZS4KKyAqLworc3RhdGljIGNoYXIJCQkqc3RsX3RtcHdyaXRlYnVmOworc3RhdGljIERFQ0xBUkVfTVVURVgoc3RsX3RtcHdyaXRlc2VtKTsKKworLyoKKyAqCURlZmluZSBhIGxvY2FsIGRlZmF1bHQgdGVybWlvcyBzdHJ1Y3QuIEFsbCBwb3J0cyB3aWxsIGJlIGNyZWF0ZWQKKyAqCXdpdGggdGhpcyB0ZXJtaW9zIGluaXRpYWxseS4gQmFzaWNhbGx5IGFsbCBpdCBkZWZpbmVzIGlzIGEgcmF3IHBvcnQKKyAqCWF0IDk2MDAsIDggZGF0YSBiaXRzLCAxIHN0b3AgYml0LgorICovCitzdGF0aWMgc3RydWN0IHRlcm1pb3MJCXN0bF9kZWZ0ZXJtaW9zID0geworCS5jX2NmbGFnCT0gKEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTCksCisJLmNfY2MJCT0gSU5JVF9DX0NDLAorfTsKKworLyoKKyAqCURlZmluZSBnbG9iYWwgc3RhdHMgc3RydWN0dXJlcy4gTm90IHVzZWQgb2Z0ZW4sIGFuZCBjYW4gYmUKKyAqCXJlLXVzZWQgZm9yIGVhY2ggc3RhdHMgY2FsbC4KKyAqLworc3RhdGljIGNvbXN0YXRzX3QJc3RsX2NvbXN0YXRzOworc3RhdGljIGNvbWJyZF90CQlzdGxfYnJkc3RhdHM7CitzdGF0aWMgc3RsYnJkX3QJCXN0bF9kdW1teWJyZDsKK3N0YXRpYyBzdGxwb3J0X3QJc3RsX2R1bW15cG9ydDsKKworLyoKKyAqCURlZmluZSBnbG9iYWwgcGxhY2UgdG8gcHV0IGJ1ZmZlciBvdmVyZmxvdyBjaGFyYWN0ZXJzLgorICovCitzdGF0aWMgY2hhcgkJc3RsX3Vud2FudGVkW1NDMjYxOThfUlhGSUZPU0laRV07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0bGJyZF90CQkqc3RsX2JyZHNbU1RMX01BWEJSRFNdOworCisvKgorICoJUGVyIGJvYXJkIHN0YXRlIGZsYWdzLiBVc2VkIHdpdGggdGhlIHN0YXRlIGZpZWxkIG9mIHRoZSBib2FyZCBzdHJ1Y3QuCisgKglOb3QgcmVhbGx5IG11Y2ggaGVyZSEKKyAqLworI2RlZmluZQlCUkRfRk9VTkQJMHgxCisKKy8qCisgKglEZWZpbmUgdGhlIHBvcnQgc3RydWN0dXJlIGlzdGF0ZSBmbGFncy4gVGhlc2Ugc2V0IG9mIGZsYWdzIGFyZQorICoJbW9kaWZpZWQgYXQgaW50ZXJydXB0IHRpbWUgLSBzbyBzZXR0aW5nIGFuZCByZXNldGluZyB0aGVtIG5lZWRzCisgKgl0byBiZSBhdG9taWMuIFVzZSB0aGUgYml0IGNsZWFyL3NldHRpbmcgcm91dGluZXMgZm9yIHRoaXMuCisgKi8KKyNkZWZpbmUJQVNZSV9UWEJVU1kJMQorI2RlZmluZQlBU1lJX1RYTE9XCTIKKyNkZWZpbmUJQVNZSV9EQ0RDSEFOR0UJMworI2RlZmluZQlBU1lJX1RYRkxPV0VECTQKKworLyoKKyAqCURlZmluZSBhbiBhcnJheSBvZiBib2FyZCBuYW1lcyBhcyBwcmludGFibGUgc3RyaW5ncy4gSGFuZHkgZm9yCisgKglyZWZlcmVuY2luZyBib2FyZHMgd2hlbiBwcmludGluZyB0cmFjZSBhbmQgc3R1ZmYuCisgKi8KK3N0YXRpYyBjaGFyCSpzdGxfYnJkbmFtZXNbXSA9IHsKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJIkVhc3lJTyIsCisJIkVDOC8zMi1BVCIsCisJIkVDOC8zMi1NQyIsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJIkVDOC8zMi1QQ0kiLAorCSJFQzgvNjQtUENJIiwKKwkiRWFzeUlPLVBDSSIsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEZWZpbmUgc29tZSBzdHJpbmcgbGFiZWxzIGZvciBhcmd1bWVudHMgcGFzc2VkIGZyb20gdGhlIG1vZHVsZQorICoJbG9hZCBsaW5lLiBUaGVzZSBhbGxvdyBmb3IgZWFzeSBib2FyZCBkZWZpbml0aW9ucywgYW5kIGVhc3kKKyAqCW1vZGlmaWNhdGlvbiBvZiB0aGUgaW8sIG1lbW9yeSBhbmQgaXJxIHJlc291Y3Jlcy4KKyAqLworc3RhdGljIGludAlzdGxfbmFyZ3MgPSAwOworc3RhdGljIGNoYXIJKmJvYXJkMFs0XTsKK3N0YXRpYyBjaGFyCSpib2FyZDFbNF07CitzdGF0aWMgY2hhcgkqYm9hcmQyWzRdOworc3RhdGljIGNoYXIJKmJvYXJkM1s0XTsKKworc3RhdGljIGNoYXIJKipzdGxfYnJkc3BbXSA9IHsKKwkoY2hhciAqKikgJmJvYXJkMCwKKwkoY2hhciAqKikgJmJvYXJkMSwKKwkoY2hhciAqKikgJmJvYXJkMiwKKwkoY2hhciAqKikgJmJvYXJkMworfTsKKworLyoKKyAqCURlZmluZSBhIHNldCBvZiBjb21tb24gYm9hcmQgbmFtZXMsIGFuZCB0eXBlcy4gVGhpcyBpcyB1c2VkIHRvCisgKglwYXJzZSBhbnkgbW9kdWxlIGFyZ3VtZW50cy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBzdGxicmR0eXBlIHsKKwljaGFyCSpuYW1lOworCWludAl0eXBlOworfSBzdGxicmR0eXBlX3Q7CisKK3N0YXRpYyBzdGxicmR0eXBlX3QJc3RsX2JyZHN0cltdID0geworCXsgImVhc3lpbyIsIEJSRF9FQVNZSU8gfSwKKwl7ICJlaW8iLCBCUkRfRUFTWUlPIH0sCisJeyAiMjAiLCBCUkRfRUFTWUlPIH0sCisJeyAiZWM4LzMyIiwgQlJEX0VDSCB9LAorCXsgImVjOC8zMi1hdCIsIEJSRF9FQ0ggfSwKKwl7ICJlYzgvMzItaXNhIiwgQlJEX0VDSCB9LAorCXsgImVjaCIsIEJSRF9FQ0ggfSwKKwl7ICJlY2hhdCIsIEJSRF9FQ0ggfSwKKwl7ICIyMSIsIEJSRF9FQ0ggfSwKKwl7ICJlYzgvMzItbWMiLCBCUkRfRUNITUMgfSwKKwl7ICJlYzgvMzItbWNhIiwgQlJEX0VDSE1DIH0sCisJeyAiZWNobWMiLCBCUkRfRUNITUMgfSwKKwl7ICJlY2htY2EiLCBCUkRfRUNITUMgfSwKKwl7ICIyMiIsIEJSRF9FQ0hNQyB9LAorCXsgImVjOC8zMi1wYyIsIEJSRF9FQ0hQQ0kgfSwKKwl7ICJlYzgvMzItcGNpIiwgQlJEX0VDSFBDSSB9LAorCXsgIjI2IiwgQlJEX0VDSFBDSSB9LAorCXsgImVjOC82NC1wYyIsIEJSRF9FQ0g2NFBDSSB9LAorCXsgImVjOC82NC1wY2kiLCBCUkRfRUNINjRQQ0kgfSwKKwl7ICJlY2gtcGNpIiwgQlJEX0VDSDY0UENJIH0sCisJeyAiZWNocGNpIiwgQlJEX0VDSDY0UENJIH0sCisJeyAiZWNocGMiLCBCUkRfRUNINjRQQ0kgfSwKKwl7ICIyNyIsIEJSRF9FQ0g2NFBDSSB9LAorCXsgImVhc3lpby1wYyIsIEJSRF9FQVNZSU9QQ0kgfSwKKwl7ICJlYXN5aW8tcGNpIiwgQlJEX0VBU1lJT1BDSSB9LAorCXsgImVpby1wY2kiLCBCUkRfRUFTWUlPUENJIH0sCisJeyAiZWlvcGNpIiwgQlJEX0VBU1lJT1BDSSB9LAorCXsgIjI4IiwgQlJEX0VBU1lJT1BDSSB9LAorfTsKKworLyoKKyAqCURlZmluZSB0aGUgbW9kdWxlIGFncnVtZW50cy4KKyAqLworTU9EVUxFX0FVVEhPUigiR3JlZyBVbmdlcmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN0YWxsaW9uIE11bHRpcG9ydCBTZXJpYWwgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShib2FyZDAsIGNoYXJwLCAmc3RsX25hcmdzLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYm9hcmQwLCAiQm9hcmQgMCBjb25maWcgLT4gbmFtZVssaW9hZGRyWyxpb2FkZHIyXVssaXJxXV0iKTsKK21vZHVsZV9wYXJhbV9hcnJheShib2FyZDEsIGNoYXJwLCAmc3RsX25hcmdzLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYm9hcmQxLCAiQm9hcmQgMSBjb25maWcgLT4gbmFtZVssaW9hZGRyWyxpb2FkZHIyXVssaXJxXV0iKTsKK21vZHVsZV9wYXJhbV9hcnJheShib2FyZDIsIGNoYXJwLCAmc3RsX25hcmdzLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYm9hcmQyLCAiQm9hcmQgMiBjb25maWcgLT4gbmFtZVssaW9hZGRyWyxpb2FkZHIyXVssaXJxXV0iKTsKK21vZHVsZV9wYXJhbV9hcnJheShib2FyZDMsIGNoYXJwLCAmc3RsX25hcmdzLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYm9hcmQzLCAiQm9hcmQgMyBjb25maWcgLT4gbmFtZVssaW9hZGRyWyxpb2FkZHIyXVssaXJxXV0iKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSGFyZHdhcmUgSUQgYml0cyBmb3IgdGhlIEVhc3lJTyBhbmQgRUNIIGJvYXJkcy4gVGhlc2UgZGVmaW5lcyBhcHBseQorICoJdG8gdGhlIGRpcmVjdGx5IGFjY2Vzc2libGUgaW8gcG9ydHMgb2YgdGhlc2UgYm9hcmRzIChub3QgdGhlIHVhcnRzIC0KKyAqCXRoZXkgYXJlIGluIGNkMTQwMC5oIGFuZCBzYzI2MTk4LmgpLgorICovCisjZGVmaW5lCUVJT184UE9SVFJTCTB4MDQKKyNkZWZpbmUJRUlPXzRQT1JUUlMJMHgwNQorI2RlZmluZQlFSU9fOFBPUlRESQkweDAwCisjZGVmaW5lCUVJT184UE9SVE0JMHgwNgorI2RlZmluZQlFSU9fTUszCQkweDAzCisjZGVmaW5lCUVJT19JREJJVE1BU0sJMHgwNworCisjZGVmaW5lCUVJT19CUkRNQVNLCTB4ZjAKKyNkZWZpbmUJSURfQlJENAkJMHgxMAorI2RlZmluZQlJRF9CUkQ4CQkweDIwCisjZGVmaW5lCUlEX0JSRDE2CTB4MzAKKworI2RlZmluZQlFSU9fSU5UUlBFTkQJMHgwOAorI2RlZmluZQlFSU9fSU5URURHRQkweDAwCisjZGVmaW5lCUVJT19JTlRMRVZFTAkweDA4CisjZGVmaW5lCUVJT18wV1MJCTB4MTAKKworI2RlZmluZQlFQ0hfSUQJCTB4YTAKKyNkZWZpbmUJRUNIX0lEQklUTUFTSwkweGUwCisjZGVmaW5lCUVDSF9CUkRFTkFCTEUJMHgwOAorI2RlZmluZQlFQ0hfQlJERElTQUJMRQkweDAwCisjZGVmaW5lCUVDSF9JTlRFTkFCTEUJMHgwMQorI2RlZmluZQlFQ0hfSU5URElTQUJMRQkweDAwCisjZGVmaW5lCUVDSF9JTlRMRVZFTAkweDAyCisjZGVmaW5lCUVDSF9JTlRFREdFCTB4MDAKKyNkZWZpbmUJRUNIX0lOVFJQRU5ECTB4MDEKKyNkZWZpbmUJRUNIX0JSRFJFU0VUCTB4MDEKKworI2RlZmluZQlFQ0hNQ19JTlRFTkFCTEUJMHgwMQorI2RlZmluZQlFQ0hNQ19CUkRSRVNFVAkweDAyCisKKyNkZWZpbmUJRUNIX1BOTFNUQVRVUwkyCisjZGVmaW5lCUVDSF9QTkwxNlBPUlQJMHgyMAorI2RlZmluZQlFQ0hfUE5MSURNQVNLCTB4MDcKKyNkZWZpbmUJRUNIX1BOTFhQSUQJMHg0MAorI2RlZmluZQlFQ0hfUE5MSU5UUlBFTkQJMHg4MAorCisjZGVmaW5lCUVDSF9BRERSMk1BU0sJMHgxZTAKKworLyoKKyAqCURlZmluZSB0aGUgdmVjdG9yIG1hcHBpbmcgYml0cyBmb3IgdGhlIHByb2dyYW1tYWJsZSBpbnRlcnJ1cHQgYm9hcmQKKyAqCWhhcmR3YXJlLiBUaGVzZSBiaXRzIGVuY29kZSB0aGUgaW50ZXJydXB0IGZvciB0aGUgYm9hcmQgdG8gdXNlIC0gaXQKKyAqCWlzIHNvZnR3YXJlIHNlbGVjdGFibGUgKGV4Y2VwdCB0aGUgRUlPLThNKS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIJc3RsX3ZlY21hcFtdID0geworCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDQsIDB4MDYsIDB4MDUsIDB4ZmYsIDB4MDcsCisJMHhmZiwgMHhmZiwgMHgwMCwgMHgwMiwgMHgwMSwgMHhmZiwgMHhmZiwgMHgwMworfTsKKworLyoKKyAqCVNldCB1cCBlbmFibGUgYW5kIGRpc2FibGUgbWFjcm9zIGZvciB0aGUgRUNIIGJvYXJkcy4gVGhleSByZXF1aXJlCisgKgl0aGUgc2Vjb25kYXJ5IGlvIGFkZHJlc3Mgc3BhY2UgdG8gYmUgYWN0aXZhdGVkIGFuZCBkZWFjdGl2YXRlZC4KKyAqCVRoaXMgd2F5IGFsbCBFQ0ggYm9hcmRzIGNhbiBzaGFyZSB0aGVpciBzZWNvbmRhcnkgaW8gcmVnaW9uLgorICoJSWYgdGhpcyBpcyBhbiBFQ0gtUENJIGJvYXJkIHRoZW4gYWxzbyBuZWVkIHRvIHNldCB0aGUgcGFnZSBwb2ludGVyCisgKgl0byBwb2ludCB0byB0aGUgY29ycmVjdCBwYWdlLgorICovCisjZGVmaW5lCUJSREVOQUJMRShicmRucixwYWdlbnIpCQkJCQkJXAorCWlmIChzdGxfYnJkc1soYnJkbnIpXS0+YnJkdHlwZSA9PSBCUkRfRUNIKQkJCVwKKwkJb3V0Yigoc3RsX2JyZHNbKGJyZG5yKV0tPmlvY3RybHZhbCB8IEVDSF9CUkRFTkFCTEUpLAlcCisJCQlzdGxfYnJkc1soYnJkbnIpXS0+aW9jdHJsKTsJCQlcCisJZWxzZSBpZiAoc3RsX2JyZHNbKGJyZG5yKV0tPmJyZHR5cGUgPT0gQlJEX0VDSFBDSSkJCVwKKwkJb3V0YigocGFnZW5yKSwgc3RsX2JyZHNbKGJyZG5yKV0tPmlvY3RybCk7CisKKyNkZWZpbmUJQlJERElTQUJMRShicmRucikJCQkJCQlcCisJaWYgKHN0bF9icmRzWyhicmRucildLT5icmR0eXBlID09IEJSRF9FQ0gpCQkJXAorCQlvdXRiKChzdGxfYnJkc1soYnJkbnIpXS0+aW9jdHJsdmFsIHwgRUNIX0JSRERJU0FCTEUpLAlcCisJCQlzdGxfYnJkc1soYnJkbnIpXS0+aW9jdHJsKTsKKworI2RlZmluZQlTVExfQ0QxNDAwTUFYQkFVRAkyMzA0MDAKKyNkZWZpbmUJU1RMX1NDMjYxOThNQVhCQVVECTQ2MDgwMAorCisjZGVmaW5lCVNUTF9CQVVEQkFTRQkJMTE1MjAwCisjZGVmaW5lCVNUTF9DTE9TRURFTEFZCQkoNSAqIEhaIC8gMTApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIENPTkZJR19QQ0kKKworLyoKKyAqCURlZmluZSB0aGUgU3RhbGxpb24gUENJIHZlbmRvciBhbmQgZGV2aWNlIElEcy4KKyAqLworI2lmbmRlZglQQ0lfVkVORE9SX0lEX1NUQUxMSU9OCisjZGVmaW5lCVBDSV9WRU5ET1JfSURfU1RBTExJT04JCTB4MTI0ZAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRUNIUENJODMyCisjZGVmaW5lCVBDSV9ERVZJQ0VfSURfRUNIUENJODMyCQkweDAwMDAKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0VDSFBDSTg2NAorI2RlZmluZQlQQ0lfREVWSUNFX0lEX0VDSFBDSTg2NAkJMHgwMDAyCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FSU9QQ0kKKyNkZWZpbmUJUENJX0RFVklDRV9JRF9FSU9QQ0kJCTB4MDAwMworI2VuZGlmCisKKy8qCisgKglEZWZpbmUgc3RydWN0dXJlIHRvIGhvbGQgYWxsIFN0YWxsaW9uIFBDSSBib2FyZHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHN0bHBjaWJyZCB7CisJdW5zaWduZWQgc2hvcnQJCXZlbmRpZDsKKwl1bnNpZ25lZCBzaG9ydAkJZGV2aWQ7CisJaW50CQkJYnJkdHlwZTsKK30gc3RscGNpYnJkX3Q7CisKK3N0YXRpYyBzdGxwY2licmRfdAlzdGxfcGNpYnJkc1tdID0geworCXsgUENJX1ZFTkRPUl9JRF9TVEFMTElPTiwgUENJX0RFVklDRV9JRF9FQ0hQQ0k4NjQsIEJSRF9FQ0g2NFBDSSB9LAorCXsgUENJX1ZFTkRPUl9JRF9TVEFMTElPTiwgUENJX0RFVklDRV9JRF9FSU9QQ0ksIEJSRF9FQVNZSU9QQ0kgfSwKKwl7IFBDSV9WRU5ET1JfSURfU1RBTExJT04sIFBDSV9ERVZJQ0VfSURfRUNIUENJODMyLCBCUkRfRUNIUENJIH0sCisJeyBQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TXzg3NDEwLCBCUkRfRUNIUENJIH0sCit9OworCitzdGF0aWMgaW50CXN0bF9ucnBjaWJyZHMgPSBzaXplb2Yoc3RsX3BjaWJyZHMpIC8gc2l6ZW9mKHN0bHBjaWJyZF90KTsKKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlZmluZSBtYWNyb3MgdG8gZXh0cmFjdCBhIGJyZC9wb3J0IG51bWJlciBmcm9tIGEgbWlub3IgbnVtYmVyLgorICovCisjZGVmaW5lCU1JTk9SMkJSRChtaW4pCQkoKChtaW4pICYgMHhjMCkgPj4gNikKKyNkZWZpbmUJTUlOT1IyUE9SVChtaW4pCQkoKG1pbikgJiAweDNmKQorCisvKgorICoJRGVmaW5lIGEgYmF1ZCByYXRlIHRhYmxlIHRoYXQgY29udmVydHMgdGVybWlvcyBiYXVkIHJhdGUgc2VsZWN0b3IKKyAqCWludG8gdGhlIGFjdHVhbCBiYXVkIHJhdGUgdmFsdWUuIEFsbCBiYXVkIHJhdGUgY2FsY3VsYXRpb25zIGFyZQorICoJYmFzZWQgb24gdGhlIGFjdHVhbCBiYXVkIHJhdGUgcmVxdWlyZWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQJc3RsX2JhdWRyYXRlc1tdID0geworCTAsIDUwLCA3NSwgMTEwLCAxMzQsIDE1MCwgMjAwLCAzMDAsIDYwMCwgMTIwMCwgMTgwMCwgMjQwMCwgNDgwMCwKKwk5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAsIDIzMDQwMCwgNDYwODAwLCA5MjE2MDAKK307CisKKy8qCisgKglEZWZpbmUgc29tZSBoYW5keSBsb2NhbCBtYWNyb3MuLi4KKyAqLworI3VuZGVmCU1JTgorI2RlZmluZQlNSU4oYSxiKQkoKChhKSA8PSAoYikpID8gKGEpIDogKGIpKQorCisjdW5kZWYJVE9MT1dFUgorI2RlZmluZQlUT0xPV0VSKHgpCSgoKCh4KSA+PSAnQScpICYmICgoeCkgPD0gJ1onKSkgPyAoKHgpICsgMHgyMCkgOiAoeCkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlY2xhcmUgYWxsIHRob3NlIGZ1bmN0aW9ucyBpbiB0aGlzIGRyaXZlciEKKyAqLworCitzdGF0aWMgdm9pZAlzdGxfYXJnYnJkcyh2b2lkKTsKK3N0YXRpYyBpbnQJc3RsX3BhcnNlYnJkKHN0bGNvbmZfdCAqY29uZnAsIGNoYXIgKiphcmdwKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RsX2F0b2woY2hhciAqc3RyKTsKKworaW50CQlzdGxfaW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQJc3RsX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHZvaWQJc3RsX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyBpbnQJc3RsX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkCXN0bF9wdXRjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpOworc3RhdGljIHZvaWQJc3RsX2ZsdXNoY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50CXN0bF93cml0ZXJvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50CXN0bF9jaGFyc2luYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludAlzdGxfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyB2b2lkCXN0bF9zZXR0ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGQpOworc3RhdGljIHZvaWQJc3RsX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQJc3RsX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZAlzdGxfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkCXN0bF9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkCXN0bF9mbHVzaGJ1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkCXN0bF9icmVha2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgc3RhdGUpOworc3RhdGljIHZvaWQJc3RsX3dhaXR1bnRpbHNlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOworc3RhdGljIHZvaWQJc3RsX3NlbmR4Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKTsKK3N0YXRpYyB2b2lkCXN0bF9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50CXN0bF9tZW1pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQJc3RsX3BvcnRpbmZvKHN0bHBvcnRfdCAqcG9ydHAsIGludCBwb3J0bnIsIGNoYXIgKnBvcyk7CitzdGF0aWMgaW50CXN0bF9yZWFkcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CisKK3N0YXRpYyBpbnQJc3RsX2JyZGluaXQoc3RsYnJkX3QgKmJyZHApOworc3RhdGljIGludAlzdGxfaW5pdHBvcnRzKHN0bGJyZF90ICpicmRwLCBzdGxwYW5lbF90ICpwYW5lbHApOworc3RhdGljIGludAlzdGxfZ2V0c2VyaWFsKHN0bHBvcnRfdCAqcG9ydHAsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqc3ApOworc3RhdGljIGludAlzdGxfc2V0c2VyaWFsKHN0bHBvcnRfdCAqcG9ydHAsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqc3ApOworc3RhdGljIGludAlzdGxfZ2V0YnJkc3RhdHMoY29tYnJkX3QgX191c2VyICpicCk7CitzdGF0aWMgaW50CXN0bF9nZXRwb3J0c3RhdHMoc3RscG9ydF90ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKTsKK3N0YXRpYyBpbnQJc3RsX2NscnBvcnRzdGF0cyhzdGxwb3J0X3QgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApOworc3RhdGljIGludAlzdGxfZ2V0cG9ydHN0cnVjdChzdGxwb3J0X3QgX191c2VyICphcmcpOworc3RhdGljIGludAlzdGxfZ2V0YnJkc3RydWN0KHN0bGJyZF90IF9fdXNlciAqYXJnKTsKK3N0YXRpYyBpbnQJc3RsX3dhaXRjYXJyaWVyKHN0bHBvcnRfdCAqcG9ydHAsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyBpbnQJc3RsX2Vpb2ludHIoc3RsYnJkX3QgKmJyZHApOworc3RhdGljIGludAlzdGxfZWNoYXRpbnRyKHN0bGJyZF90ICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsX2VjaG1jYWludHIoc3RsYnJkX3QgKmJyZHApOworc3RhdGljIGludAlzdGxfZWNocGNpaW50cihzdGxicmRfdCAqYnJkcCk7CitzdGF0aWMgaW50CXN0bF9lY2hwY2k2NGludHIoc3RsYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsX29mZmludHIodm9pZCAqcHJpdmF0ZSk7CitzdGF0aWMgdm9pZAkqc3RsX21lbWFsbG9jKGludCBsZW4pOworc3RhdGljIHN0bGJyZF90ICpzdGxfYWxsb2NicmQodm9pZCk7CitzdGF0aWMgc3RscG9ydF90ICpzdGxfZ2V0cG9ydChpbnQgYnJkbnIsIGludCBwYW5lbG5yLCBpbnQgcG9ydG5yKTsKKworc3RhdGljIGlubGluZSBpbnQJc3RsX2luaXRicmRzKHZvaWQpOworc3RhdGljIGlubGluZSBpbnQJc3RsX2luaXRlaW8oc3RsYnJkX3QgKmJyZHApOworc3RhdGljIGlubGluZSBpbnQJc3RsX2luaXRlY2goc3RsYnJkX3QgKmJyZHApOworc3RhdGljIGlubGluZSBpbnQJc3RsX2dldGJyZG5yKHZvaWQpOworCisjaWZkZWYJQ09ORklHX1BDSQorc3RhdGljIGlubGluZSBpbnQJc3RsX2ZpbmRwY2licmRzKHZvaWQpOworc3RhdGljIGlubGluZSBpbnQJc3RsX2luaXRwY2licmQoaW50IGJyZHR5cGUsIHN0cnVjdCBwY2lfZGV2ICpkZXZwKTsKKyNlbmRpZgorCisvKgorICoJQ0QxNDAwIHVhcnQgc3BlY2lmaWMgaGFuZGxpbmcgZnVuY3Rpb25zLgorICovCitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwc2V0cmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWduciwgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQJc3RsX2NkMTQwMGdldHJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIpOworc3RhdGljIGludAlzdGxfY2QxNDAwdXBkYXRlcmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWduciwgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQJc3RsX2NkMTQwMHBhbmVsaW5pdChzdGxicmRfdCAqYnJkcCwgc3RscGFuZWxfdCAqcGFuZWxwKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBwb3J0aW5pdChzdGxicmRfdCAqYnJkcCwgc3RscGFuZWxfdCAqcGFuZWxwLCBzdGxwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBzZXRwb3J0KHN0bHBvcnRfdCAqcG9ydHAsIHN0cnVjdCB0ZXJtaW9zICp0aW9zcCk7CitzdGF0aWMgaW50CXN0bF9jZDE0MDBnZXRzaWduYWxzKHN0bHBvcnRfdCAqcG9ydHApOworc3RhdGljIHZvaWQJc3RsX2NkMTQwMHNldHNpZ25hbHMoc3RscG9ydF90ICpwb3J0cCwgaW50IGR0ciwgaW50IHJ0cyk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwY2Nyd2FpdChzdGxwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBlbmFibGVyeHR4KHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBzdGFydHJ4dHgoc3RscG9ydF90ICpwb3J0cCwgaW50IHJ4LCBpbnQgdHgpOworc3RhdGljIHZvaWQJc3RsX2NkMTQwMGRpc2FibGVpbnRycyhzdGxwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBzZW5kYnJlYWsoc3RscG9ydF90ICpwb3J0cCwgaW50IGxlbik7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwZmxvd2N0cmwoc3RscG9ydF90ICpwb3J0cCwgaW50IHN0YXRlKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBzZW5kZmxvdyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgc3RhdGUpOworc3RhdGljIHZvaWQJc3RsX2NkMTQwMGZsdXNoKHN0bHBvcnRfdCAqcG9ydHApOworc3RhdGljIGludAlzdGxfY2QxNDAwZGF0YXN0YXRlKHN0bHBvcnRfdCAqcG9ydHApOworc3RhdGljIHZvaWQJc3RsX2NkMTQwMGVpb2ludHIoc3RscGFuZWxfdCAqcGFuZWxwLCB1bnNpZ25lZCBpbnQgaW9iYXNlKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBlY2hpbnRyKHN0bHBhbmVsX3QgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwdHhpc3Ioc3RscGFuZWxfdCAqcGFuZWxwLCBpbnQgaW9hZGRyKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDByeGlzcihzdGxwYW5lbF90ICpwYW5lbHAsIGludCBpb2FkZHIpOworc3RhdGljIHZvaWQJc3RsX2NkMTQwMG1kbWlzcihzdGxwYW5lbF90ICpwYW5lbHAsIGludCBpb2FkZHIpOworCitzdGF0aWMgaW5saW5lIGludAlzdGxfY2QxNDAwYnJlYWtpc3Ioc3RscG9ydF90ICpwb3J0cCwgaW50IGlvYWRkcik7CisKKy8qCisgKglTQzI2MTk4IHVhcnQgc3BlY2lmaWMgaGFuZGxpbmcgZnVuY3Rpb25zLgorICovCitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHNldHJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIsIGludCB2YWx1ZSk7CitzdGF0aWMgaW50CXN0bF9zYzI2MTk4Z2V0cmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWducik7CitzdGF0aWMgaW50CXN0bF9zYzI2MTk4dXBkYXRlcmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWduciwgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQJc3RsX3NjMjYxOThnZXRnbG9icmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWducik7CitzdGF0aWMgaW50CXN0bF9zYzI2MTk4cGFuZWxpbml0KHN0bGJyZF90ICpicmRwLCBzdGxwYW5lbF90ICpwYW5lbHApOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThwb3J0aW5pdChzdGxicmRfdCAqYnJkcCwgc3RscGFuZWxfdCAqcGFuZWxwLCBzdGxwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4c2V0cG9ydChzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3QgdGVybWlvcyAqdGlvc3ApOworc3RhdGljIGludAlzdGxfc2MyNjE5OGdldHNpZ25hbHMoc3RscG9ydF90ICpwb3J0cCk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHNldHNpZ25hbHMoc3RscG9ydF90ICpwb3J0cCwgaW50IGR0ciwgaW50IHJ0cyk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OGVuYWJsZXJ4dHgoc3RscG9ydF90ICpwb3J0cCwgaW50IHJ4LCBpbnQgdHgpOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThzdGFydHJ4dHgoc3RscG9ydF90ICpwb3J0cCwgaW50IHJ4LCBpbnQgdHgpOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThkaXNhYmxlaW50cnMoc3RscG9ydF90ICpwb3J0cCk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHNlbmRicmVhayhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4Zmxvd2N0cmwoc3RscG9ydF90ICpwb3J0cCwgaW50IHN0YXRlKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4c2VuZGZsb3coc3RscG9ydF90ICpwb3J0cCwgaW50IHN0YXRlKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4Zmx1c2goc3RscG9ydF90ICpwb3J0cCk7CitzdGF0aWMgaW50CXN0bF9zYzI2MTk4ZGF0YXN0YXRlKHN0bHBvcnRfdCAqcG9ydHApOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOTh3YWl0KHN0bHBvcnRfdCAqcG9ydHApOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOTh0eHVuZmxvdyhzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4aW50cihzdGxwYW5lbF90ICpwYW5lbHAsIHVuc2lnbmVkIGludCBpb2Jhc2UpOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOTh0eGlzcihzdGxwb3J0X3QgKnBvcnQpOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThyeGlzcihzdGxwb3J0X3QgKnBvcnQsIHVuc2lnbmVkIGludCBpYWNrKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4cnhiYWRjaChzdGxwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBjaGFyIHN0YXR1cywgY2hhciBjaCk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHJ4YmFkY2hhcnMoc3RscG9ydF90ICpwb3J0cCk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OG90aGVyaXNyKHN0bHBvcnRfdCAqcG9ydCwgdW5zaWduZWQgaW50IGlhY2spOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglHZW5lcmljIFVBUlQgc3VwcG9ydCBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHVhcnQgeworCWludAkoKnBhbmVsaW5pdCkoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCk7CisJdm9pZAkoKnBvcnRpbml0KShzdGxicmRfdCAqYnJkcCwgc3RscGFuZWxfdCAqcGFuZWxwLCBzdGxwb3J0X3QgKnBvcnRwKTsKKwl2b2lkCSgqc2V0cG9ydCkoc3RscG9ydF90ICpwb3J0cCwgc3RydWN0IHRlcm1pb3MgKnRpb3NwKTsKKwlpbnQJKCpnZXRzaWduYWxzKShzdGxwb3J0X3QgKnBvcnRwKTsKKwl2b2lkCSgqc2V0c2lnbmFscykoc3RscG9ydF90ICpwb3J0cCwgaW50IGR0ciwgaW50IHJ0cyk7CisJdm9pZAkoKmVuYWJsZXJ4dHgpKHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KTsKKwl2b2lkCSgqc3RhcnRyeHR4KShzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcngsIGludCB0eCk7CisJdm9pZAkoKmRpc2FibGVpbnRycykoc3RscG9ydF90ICpwb3J0cCk7CisJdm9pZAkoKnNlbmRicmVhaykoc3RscG9ydF90ICpwb3J0cCwgaW50IGxlbik7CisJdm9pZAkoKmZsb3djdHJsKShzdGxwb3J0X3QgKnBvcnRwLCBpbnQgc3RhdGUpOworCXZvaWQJKCpzZW5kZmxvdykoc3RscG9ydF90ICpwb3J0cCwgaW50IHN0YXRlKTsKKwl2b2lkCSgqZmx1c2gpKHN0bHBvcnRfdCAqcG9ydHApOworCWludAkoKmRhdGFzdGF0ZSkoc3RscG9ydF90ICpwb3J0cCk7CisJdm9pZAkoKmludHIpKHN0bHBhbmVsX3QgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSk7Cit9IHVhcnRfdDsKKworLyoKKyAqCURlZmluZSBzb21lIG1hY3JvcyB0byBtYWtlIGNhbGxpbmcgdGhlc2UgZnVuY3Rpb25zIG5pY2UgYW5kIGNsZWFuLgorICovCisjZGVmaW5lCXN0bF9wYW5lbGluaXQJCSgqICgodWFydF90ICopIHBhbmVscC0+dWFydHApLT5wYW5lbGluaXQpCisjZGVmaW5lCXN0bF9wb3J0aW5pdAkJKCogKCh1YXJ0X3QgKikgcG9ydHAtPnVhcnRwKS0+cG9ydGluaXQpCisjZGVmaW5lCXN0bF9zZXRwb3J0CQkoKiAoKHVhcnRfdCAqKSBwb3J0cC0+dWFydHApLT5zZXRwb3J0KQorI2RlZmluZQlzdGxfZ2V0c2lnbmFscwkJKCogKCh1YXJ0X3QgKikgcG9ydHAtPnVhcnRwKS0+Z2V0c2lnbmFscykKKyNkZWZpbmUJc3RsX3NldHNpZ25hbHMJCSgqICgodWFydF90ICopIHBvcnRwLT51YXJ0cCktPnNldHNpZ25hbHMpCisjZGVmaW5lCXN0bF9lbmFibGVyeHR4CQkoKiAoKHVhcnRfdCAqKSBwb3J0cC0+dWFydHApLT5lbmFibGVyeHR4KQorI2RlZmluZQlzdGxfc3RhcnRyeHR4CQkoKiAoKHVhcnRfdCAqKSBwb3J0cC0+dWFydHApLT5zdGFydHJ4dHgpCisjZGVmaW5lCXN0bF9kaXNhYmxlaW50cnMJKCogKCh1YXJ0X3QgKikgcG9ydHAtPnVhcnRwKS0+ZGlzYWJsZWludHJzKQorI2RlZmluZQlzdGxfc2VuZGJyZWFrCQkoKiAoKHVhcnRfdCAqKSBwb3J0cC0+dWFydHApLT5zZW5kYnJlYWspCisjZGVmaW5lCXN0bF9mbG93Y3RybAkJKCogKCh1YXJ0X3QgKikgcG9ydHAtPnVhcnRwKS0+Zmxvd2N0cmwpCisjZGVmaW5lCXN0bF9zZW5kZmxvdwkJKCogKCh1YXJ0X3QgKikgcG9ydHAtPnVhcnRwKS0+c2VuZGZsb3cpCisjZGVmaW5lCXN0bF9mbHVzaAkJKCogKCh1YXJ0X3QgKikgcG9ydHAtPnVhcnRwKS0+Zmx1c2gpCisjZGVmaW5lCXN0bF9kYXRhc3RhdGUJCSgqICgodWFydF90ICopIHBvcnRwLT51YXJ0cCktPmRhdGFzdGF0ZSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQ0QxNDAwIFVBUlQgc3BlY2lmaWMgZGF0YSBpbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIHVhcnRfdCBzdGxfY2QxNDAwdWFydCA9IHsKKwlzdGxfY2QxNDAwcGFuZWxpbml0LAorCXN0bF9jZDE0MDBwb3J0aW5pdCwKKwlzdGxfY2QxNDAwc2V0cG9ydCwKKwlzdGxfY2QxNDAwZ2V0c2lnbmFscywKKwlzdGxfY2QxNDAwc2V0c2lnbmFscywKKwlzdGxfY2QxNDAwZW5hYmxlcnh0eCwKKwlzdGxfY2QxNDAwc3RhcnRyeHR4LAorCXN0bF9jZDE0MDBkaXNhYmxlaW50cnMsCisJc3RsX2NkMTQwMHNlbmRicmVhaywKKwlzdGxfY2QxNDAwZmxvd2N0cmwsCisJc3RsX2NkMTQwMHNlbmRmbG93LAorCXN0bF9jZDE0MDBmbHVzaCwKKwlzdGxfY2QxNDAwZGF0YXN0YXRlLAorCXN0bF9jZDE0MDBlaW9pbnRyCit9OworCisvKgorICoJRGVmaW5lIHRoZSBvZmZzZXRzIHdpdGhpbiB0aGUgcmVnaXN0ZXIgYmFuayBvZiBhIGNkMTQwMCBiYXNlZCBwYW5lbC4KKyAqCVRoZXNlIGlvIGFkZHJlc3Mgb2Zmc2V0cyBhcmUgY29tbW9uIHRvIHRoZSBFYXN5SU8gYm9hcmQgYXMgd2VsbC4KKyAqLworI2RlZmluZQlFUkVHX0FERFIJMAorI2RlZmluZQlFUkVHX0RBVEEJNAorI2RlZmluZQlFUkVHX1JYQUNLCTUKKyNkZWZpbmUJRVJFR19UWEFDSwk2CisjZGVmaW5lCUVSRUdfTURBQ0sJNworCisjZGVmaW5lCUVSRUdfQkFOS1NJWkUJOAorCisjZGVmaW5lCUNEMTQwMF9DTEsJMjUwMDAwMDAKKyNkZWZpbmUJQ0QxNDAwX0NMSzhNCTIwMDAwMDAwCisKKy8qCisgKglEZWZpbmUgdGhlIGNkMTQwMCBiYXVkIHJhdGUgY2xvY2tzLiBUaGVzZSBhcmUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nCisgKgl3aGF0IGNsb2NrIGFuZCBkaXZpc29yIHRvIHVzZSBmb3IgdGhlIHJlcXVpcmVkIGJhdWQgcmF0ZS4gQWxzbworICoJZGVmaW5lIHRoZSBtYXhpbXVtIGJhdWQgcmF0ZSBhbGxvd2VkLCBhbmQgdGhlIGRlZmF1bHQgYmFzZSBiYXVkLgorICovCitzdGF0aWMgaW50CXN0bF9jZDE0MDBjbGtkaXZzW10gPSB7CisJQ0QxNDAwX0NMSzAsIENEMTQwMF9DTEsxLCBDRDE0MDBfQ0xLMiwgQ0QxNDAwX0NMSzMsIENEMTQwMF9DTEs0Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTQzI2MTk4IFVBUlQgc3BlY2lmaWMgZGF0YSBpbml0aXphdGlvbi4KKyAqLworc3RhdGljIHVhcnRfdCBzdGxfc2MyNjE5OHVhcnQgPSB7CisJc3RsX3NjMjYxOThwYW5lbGluaXQsCisJc3RsX3NjMjYxOThwb3J0aW5pdCwKKwlzdGxfc2MyNjE5OHNldHBvcnQsCisJc3RsX3NjMjYxOThnZXRzaWduYWxzLAorCXN0bF9zYzI2MTk4c2V0c2lnbmFscywKKwlzdGxfc2MyNjE5OGVuYWJsZXJ4dHgsCisJc3RsX3NjMjYxOThzdGFydHJ4dHgsCisJc3RsX3NjMjYxOThkaXNhYmxlaW50cnMsCisJc3RsX3NjMjYxOThzZW5kYnJlYWssCisJc3RsX3NjMjYxOThmbG93Y3RybCwKKwlzdGxfc2MyNjE5OHNlbmRmbG93LAorCXN0bF9zYzI2MTk4Zmx1c2gsCisJc3RsX3NjMjYxOThkYXRhc3RhdGUsCisJc3RsX3NjMjYxOThpbnRyCit9OworCisvKgorICoJRGVmaW5lIHRoZSBvZmZzZXRzIHdpdGhpbiB0aGUgcmVnaXN0ZXIgYmFuayBvZiBhIHNjMjYxOTggYmFzZWQgcGFuZWwuCisgKi8KKyNkZWZpbmUJWFBfREFUQQkJMAorI2RlZmluZQlYUF9BRERSCQkxCisjZGVmaW5lCVhQX01PRElECTIKKyNkZWZpbmUJWFBfU1RBVFVTCTIKKyNkZWZpbmUJWFBfSUFDSwkJMworCisjZGVmaW5lCVhQX0JBTktTSVpFCTQKKworLyoKKyAqCURlZmluZSB0aGUgc2MyNjE5OCBiYXVkIHJhdGUgdGFibGUuIE9mZnNldHMgd2l0aGluIHRoZSB0YWJsZQorICoJcmVwcmVzZW50IHRoZSBhY3R1YWwgYmF1ZCByYXRlIHNlbGVjdG9yIG9mIHNjMjYxOTggcmVnaXN0ZXJzLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CXNjMjYxOThfYmF1ZHRhYmxlW10gPSB7CisJNTAsIDc1LCAxNTAsIDIwMCwgMzAwLCA0NTAsIDYwMCwgOTAwLCAxMjAwLCAxODAwLCAyNDAwLCAzNjAwLAorCTQ4MDAsIDcyMDAsIDk2MDAsIDE0NDAwLCAxOTIwMCwgMjg4MDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLAorCTIzMDQwMCwgNDYwODAwLCA5MjE2MDAKK307CisKKyNkZWZpbmUJU0MyNjE5OF9OUkJBVURTCQkoc2l6ZW9mKHNjMjYxOThfYmF1ZHRhYmxlKSAvIHNpemVvZih1bnNpZ25lZCBpbnQpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEZWZpbmUgdGhlIGRyaXZlciBpbmZvIGZvciBhIHVzZXIgbGV2ZWwgY29udHJvbCBkZXZpY2UuIFVzZWQgbWFpbmx5CisgKgl0byBnZXQgYXQgcG9ydCBzdGF0cyAtIG9ubHkgbm90IHVzaW5nIHRoZSBwb3J0IGRldmljZSBpdHNlbGYuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCXN0bF9mc2lvbWVtID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW9jdGwJCT0gc3RsX21lbWlvY3RsLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqc3RhbGxpb25fY2xhc3M7CisKKy8qCisgKglMb2FkYWJsZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gc3R1ZmYuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgc3RhbGxpb25fbW9kdWxlX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoImluaXRfbW9kdWxlKClcbiIpOworI2VuZGlmCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlzdGxfaW5pdCgpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzdGFsbGlvbl9tb2R1bGVfZXhpdCh2b2lkKQoreworCXN0bGJyZF90CSpicmRwOworCXN0bHBhbmVsX3QJKnBhbmVscDsKKwlzdGxwb3J0X3QJKnBvcnRwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50CQlpLCBqLCBrOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoImNsZWFudXBfbW9kdWxlKClcbiIpOworI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPICJVbmxvYWRpbmcgJXM6IHZlcnNpb24gJXNcbiIsIHN0bF9kcnZ0aXRsZSwKKwkJc3RsX2RydnZlcnNpb24pOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKy8qCisgKglGcmVlIHVwIGFsbCBhbGxvY2F0ZWQgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIHBvcnRzLiBUaGlzIGluY2x1ZGVzCisgKgltZW1vcnkgYW5kIGludGVycnVwdHMuIEFzIHBhcnQgb2YgdGhpcyBwcm9jZXNzIHdlIHdpbGwgYWxzbyBkbworICoJYSBoYW5ndXAgb24gZXZlcnkgb3BlbiBwb3J0IC0gdG8gdHJ5IHRvIGZsdXNoIG91dCBhbnkgcHJvY2Vzc2VzCisgKgloYW5naW5nIG9udG8gcG9ydHMuCisgKi8KKwlpID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHN0bF9zZXJpYWwpOworCXB1dF90dHlfZHJpdmVyKHN0bF9zZXJpYWwpOworCWlmIChpKSB7CisJCXByaW50aygiU1RBTExJT046IGZhaWxlZCB0byB1bi1yZWdpc3RlciB0dHkgZHJpdmVyLCAiCisJCQkiZXJybm89JWRcbiIsIC1pKTsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlkZXZmc19yZW1vdmUoInN0YWxpb21lbS8lZCIsIGkpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihTVExfU0lPTUVNTUFKT1IsIGkpKTsKKwl9CisJZGV2ZnNfcmVtb3ZlKCJzdGFsaW9tZW0iKTsKKwlpZiAoKGkgPSB1bnJlZ2lzdGVyX2NocmRldihTVExfU0lPTUVNTUFKT1IsICJzdGFsaW9tZW0iKSkpCisJCXByaW50aygiU1RBTExJT046IGZhaWxlZCB0byB1bi1yZWdpc3RlciBzZXJpYWwgbWVtb3J5IGRldmljZSwgIgorCQkJImVycm5vPSVkXG4iLCAtaSk7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koc3RhbGxpb25fY2xhc3MpOworCisJaWYgKHN0bF90bXB3cml0ZWJ1ZiAhPSAoY2hhciAqKSBOVUxMKQorCQlrZnJlZShzdGxfdG1wd3JpdGVidWYpOworCisJZm9yIChpID0gMDsgKGkgPCBzdGxfbnJicmRzKTsgaSsrKSB7CisJCWlmICgoYnJkcCA9IHN0bF9icmRzW2ldKSA9PSAoc3RsYnJkX3QgKikgTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWZyZWVfaXJxKGJyZHAtPmlycSwgYnJkcCk7CisKKwkJZm9yIChqID0gMDsgKGogPCBTVExfTUFYUEFORUxTKTsgaisrKSB7CisJCQlwYW5lbHAgPSBicmRwLT5wYW5lbHNbal07CisJCQlpZiAocGFuZWxwID09IChzdGxwYW5lbF90ICopIE5VTEwpCisJCQkJY29udGludWU7CisJCQlmb3IgKGsgPSAwOyAoayA8IFNUTF9QT1JUU1BFUlBBTkVMKTsgaysrKSB7CisJCQkJcG9ydHAgPSBwYW5lbHAtPnBvcnRzW2tdOworCQkJCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChwb3J0cC0+dHR5ICE9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQkJCQlzdGxfaGFuZ3VwKHBvcnRwLT50dHkpOworCQkJCWlmIChwb3J0cC0+dHguYnVmICE9IChjaGFyICopIE5VTEwpCisJCQkJCWtmcmVlKHBvcnRwLT50eC5idWYpOworCQkJCWtmcmVlKHBvcnRwKTsKKwkJCX0KKwkJCWtmcmVlKHBhbmVscCk7CisJCX0KKworCQlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2FkZHIxLCBicmRwLT5pb3NpemUxKTsKKwkJaWYgKGJyZHAtPmlvc2l6ZTIgPiAwKQorCQkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9hZGRyMiwgYnJkcC0+aW9zaXplMik7CisKKwkJa2ZyZWUoYnJkcCk7CisJCXN0bF9icmRzW2ldID0gKHN0bGJyZF90ICopIE5VTEw7CisJfQorCisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK21vZHVsZV9pbml0KHN0YWxsaW9uX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHN0YWxsaW9uX21vZHVsZV9leGl0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQ2hlY2sgZm9yIGFueSBhcmd1bWVudHMgcGFzc2VkIGluIG9uIHRoZSBtb2R1bGUgbG9hZCBjb21tYW5kIGxpbmUuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX2FyZ2JyZHModm9pZCkKK3sKKwlzdGxjb25mX3QJY29uZjsKKwlzdGxicmRfdAkqYnJkcDsKKwlpbnQJCWk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2FyZ2JyZHMoKVxuIik7CisjZW5kaWYKKworCWZvciAoaSA9IHN0bF9ucmJyZHM7IChpIDwgc3RsX25hcmdzKTsgaSsrKSB7CisJCW1lbXNldCgmY29uZiwgMCwgc2l6ZW9mKGNvbmYpKTsKKwkJaWYgKHN0bF9wYXJzZWJyZCgmY29uZiwgc3RsX2JyZHNwW2ldKSA9PSAwKQorCQkJY29udGludWU7CisJCWlmICgoYnJkcCA9IHN0bF9hbGxvY2JyZCgpKSA9PSAoc3RsYnJkX3QgKikgTlVMTCkKKwkJCWNvbnRpbnVlOworCQlzdGxfbnJicmRzID0gaSArIDE7CisJCWJyZHAtPmJyZG5yID0gaTsKKwkJYnJkcC0+YnJkdHlwZSA9IGNvbmYuYnJkdHlwZTsKKwkJYnJkcC0+aW9hZGRyMSA9IGNvbmYuaW9hZGRyMTsKKwkJYnJkcC0+aW9hZGRyMiA9IGNvbmYuaW9hZGRyMjsKKwkJYnJkcC0+aXJxID0gY29uZi5pcnE7CisJCWJyZHAtPmlycXR5cGUgPSBjb25mLmlycXR5cGU7CisJCXN0bF9icmRpbml0KGJyZHApOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQ29udmVydCBhbiBhc2NpaSBzdHJpbmcgbnVtYmVyIGludG8gYW4gdW5zaWduZWQgbG9uZy4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzdGxfYXRvbChjaGFyICpzdHIpCit7CisJdW5zaWduZWQgbG9uZwl2YWw7CisJaW50CQliYXNlLCBjOworCWNoYXIJCSpzcDsKKworCXZhbCA9IDA7CisJc3AgPSBzdHI7CisJaWYgKCgqc3AgPT0gJzAnKSAmJiAoKihzcCsxKSA9PSAneCcpKSB7CisJCWJhc2UgPSAxNjsKKwkJc3AgKz0gMjsKKwl9IGVsc2UgaWYgKCpzcCA9PSAnMCcpIHsKKwkJYmFzZSA9IDg7CisJCXNwKys7CisJfSBlbHNlIHsKKwkJYmFzZSA9IDEwOworCX0KKworCWZvciAoOyAoKnNwICE9IDApOyBzcCsrKSB7CisJCWMgPSAoKnNwID4gJzknKSA/IChUT0xPV0VSKCpzcCkgLSAnYScgKyAxMCkgOiAoKnNwIC0gJzAnKTsKKwkJaWYgKChjIDwgMCkgfHwgKGMgPj0gYmFzZSkpIHsKKwkJCXByaW50aygiU1RBTExJT046IGludmFsaWQgYXJndW1lbnQgJXNcbiIsIHN0cik7CisJCQl2YWwgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJdmFsID0gKHZhbCAqIGJhc2UpICsgYzsKKwl9CisJcmV0dXJuKHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVBhcnNlIHRoZSBzdXBwbGllZCBhcmd1bWVudCBzdHJpbmcsIGludG8gdGhlIGJvYXJkIGNvbmYgc3RydWN0LgorICovCisKK3N0YXRpYyBpbnQgc3RsX3BhcnNlYnJkKHN0bGNvbmZfdCAqY29uZnAsIGNoYXIgKiphcmdwKQoreworCWNoYXIJKnNwOworCWludAlucmJyZG5hbWVzLCBpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9wYXJzZWJyZChjb25mcD0leCxhcmdwPSV4KVxuIiwgKGludCkgY29uZnAsIChpbnQpIGFyZ3ApOworI2VuZGlmCisKKwlpZiAoKGFyZ3BbMF0gPT0gKGNoYXIgKikgTlVMTCkgfHwgKCphcmdwWzBdID09IDApKQorCQlyZXR1cm4oMCk7CisKKwlmb3IgKHNwID0gYXJncFswXSwgaSA9IDA7ICgoKnNwICE9IDApICYmIChpIDwgMjUpKTsgc3ArKywgaSsrKQorCQkqc3AgPSBUT0xPV0VSKCpzcCk7CisKKwlucmJyZG5hbWVzID0gc2l6ZW9mKHN0bF9icmRzdHIpIC8gc2l6ZW9mKHN0bGJyZHR5cGVfdCk7CisJZm9yIChpID0gMDsgKGkgPCBucmJyZG5hbWVzKTsgaSsrKSB7CisJCWlmIChzdHJjbXAoc3RsX2JyZHN0cltpXS5uYW1lLCBhcmdwWzBdKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChpID49IG5yYnJkbmFtZXMpIHsKKwkJcHJpbnRrKCJTVEFMTElPTjogdW5rbm93biBib2FyZCBuYW1lLCAlcz9cbiIsIGFyZ3BbMF0pOworCQlyZXR1cm4oMCk7CisJfQorCisJY29uZnAtPmJyZHR5cGUgPSBzdGxfYnJkc3RyW2ldLnR5cGU7CisKKwlpID0gMTsKKwlpZiAoKGFyZ3BbaV0gIT0gKGNoYXIgKikgTlVMTCkgJiYgKCphcmdwW2ldICE9IDApKQorCQljb25mcC0+aW9hZGRyMSA9IHN0bF9hdG9sKGFyZ3BbaV0pOworCWkrKzsKKwlpZiAoY29uZnAtPmJyZHR5cGUgPT0gQlJEX0VDSCkgeworCQlpZiAoKGFyZ3BbaV0gIT0gKGNoYXIgKikgTlVMTCkgJiYgKCphcmdwW2ldICE9IDApKQorCQkJY29uZnAtPmlvYWRkcjIgPSBzdGxfYXRvbChhcmdwW2ldKTsKKwkJaSsrOworCX0KKwlpZiAoKGFyZ3BbaV0gIT0gKGNoYXIgKikgTlVMTCkgJiYgKCphcmdwW2ldICE9IDApKQorCQljb25mcC0+aXJxID0gc3RsX2F0b2woYXJncFtpXSk7CisJcmV0dXJuKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglMb2NhbCBkcml2ZXIga2VybmVsIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmUuCisgKi8KKworc3RhdGljIHZvaWQgKnN0bF9tZW1hbGxvYyhpbnQgbGVuKQoreworCXJldHVybigodm9pZCAqKSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglBbGxvY2F0ZSBhIG5ldyBib2FyZCBzdHJ1Y3R1cmUuIEZpbGwgb3V0IHRoZSBiYXNpYyBpbmZvIGluIGl0LgorICovCisKK3N0YXRpYyBzdGxicmRfdCAqc3RsX2FsbG9jYnJkKHZvaWQpCit7CisJc3RsYnJkX3QJKmJyZHA7CisKKwlicmRwID0gKHN0bGJyZF90ICopIHN0bF9tZW1hbGxvYyhzaXplb2Yoc3RsYnJkX3QpKTsKKwlpZiAoYnJkcCA9PSAoc3RsYnJkX3QgKikgTlVMTCkgeworCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IChzaXplPSVkKVxuIiwKKwkJCXNpemVvZihzdGxicmRfdCkpOworCQlyZXR1cm4oKHN0bGJyZF90ICopIE5VTEwpOworCX0KKworCW1lbXNldChicmRwLCAwLCBzaXplb2Yoc3RsYnJkX3QpKTsKKwlicmRwLT5tYWdpYyA9IFNUTF9CT0FSRE1BR0lDOworCXJldHVybihicmRwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHN0bF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisJc3RsYnJkX3QJKmJyZHA7CisJdW5zaWduZWQgaW50CW1pbm9yZGV2OworCWludAkJYnJkbnIsIHBhbmVsbnIsIHBvcnRuciwgcmM7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX29wZW4odHR5PSV4LGZpbHA9JXgpOiBkZXZpY2U9JXNcbiIsIChpbnQpIHR0eSwKKwkJKGludCkgZmlscCwgdHR5LT5uYW1lKTsKKyNlbmRpZgorCisJbWlub3JkZXYgPSB0dHktPmluZGV4OworCWJyZG5yID0gTUlOT1IyQlJEKG1pbm9yZGV2KTsKKwlpZiAoYnJkbnIgPj0gc3RsX25yYnJkcykKKwkJcmV0dXJuKC1FTk9ERVYpOworCWJyZHAgPSBzdGxfYnJkc1ticmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGJyZF90ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwltaW5vcmRldiA9IE1JTk9SMlBPUlQobWlub3JkZXYpOworCWZvciAocG9ydG5yID0gLTEsIHBhbmVsbnIgPSAwOyAocGFuZWxuciA8IFNUTF9NQVhQQU5FTFMpOyBwYW5lbG5yKyspIHsKKwkJaWYgKGJyZHAtPnBhbmVsc1twYW5lbG5yXSA9PSAoc3RscGFuZWxfdCAqKSBOVUxMKQorCQkJYnJlYWs7CisJCWlmIChtaW5vcmRldiA8IGJyZHAtPnBhbmVsc1twYW5lbG5yXS0+bnJwb3J0cykgeworCQkJcG9ydG5yID0gbWlub3JkZXY7CisJCQlicmVhazsKKwkJfQorCQltaW5vcmRldiAtPSBicmRwLT5wYW5lbHNbcGFuZWxucl0tPm5ycG9ydHM7CisJfQorCWlmIChwb3J0bnIgPCAwKQorCQlyZXR1cm4oLUVOT0RFVik7CisKKwlwb3J0cCA9IGJyZHAtPnBhbmVsc1twYW5lbG5yXS0+cG9ydHNbcG9ydG5yXTsKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisKKy8qCisgKglPbiB0aGUgZmlyc3Qgb3BlbiBvZiB0aGUgZGV2aWNlIHNldHVwIHRoZSBwb3J0IGhhcmR3YXJlLCBhbmQKKyAqCWluaXRpYWxpemUgdGhlIHBlciBwb3J0IGRhdGEgc3RydWN0dXJlLgorICovCisJcG9ydHAtPnR0eSA9IHR0eTsKKwl0dHktPmRyaXZlcl9kYXRhID0gcG9ydHA7CisJcG9ydHAtPnJlZmNvdW50Kys7CisKKwlpZiAoKHBvcnRwLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSA9PSAwKSB7CisJCWlmIChwb3J0cC0+dHguYnVmID09IChjaGFyICopIE5VTEwpIHsKKwkJCXBvcnRwLT50eC5idWYgPSAoY2hhciAqKSBzdGxfbWVtYWxsb2MoU1RMX1RYQlVGU0laRSk7CisJCQlpZiAocG9ydHAtPnR4LmJ1ZiA9PSAoY2hhciAqKSBOVUxMKQorCQkJCXJldHVybigtRU5PTUVNKTsKKwkJCXBvcnRwLT50eC5oZWFkID0gcG9ydHAtPnR4LmJ1ZjsKKwkJCXBvcnRwLT50eC50YWlsID0gcG9ydHAtPnR4LmJ1ZjsKKwkJfQorCQlzdGxfc2V0cG9ydChwb3J0cCwgdHR5LT50ZXJtaW9zKTsKKwkJcG9ydHAtPnNpZ3MgPSBzdGxfZ2V0c2lnbmFscyhwb3J0cCk7CisJCXN0bF9zZXRzaWduYWxzKHBvcnRwLCAxLCAxKTsKKwkJc3RsX2VuYWJsZXJ4dHgocG9ydHAsIDEsIDEpOworCQlzdGxfc3RhcnRyeHR4KHBvcnRwLCAxLCAwKTsKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOworCQlwb3J0cC0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CisJfQorCisvKgorICoJQ2hlY2sgaWYgdGhpcyBwb3J0IGlzIGluIHRoZSBtaWRkbGUgb2YgY2xvc2luZy4gSWYgc28gdGhlbiB3YWl0CisgKgl1bnRpbCBpdCBpcyBjbG9zZWQgdGhlbiByZXR1cm4gZXJyb3Igc3RhdHVzLCBiYXNlZCBvbiBmbGFnIHNldHRpbmdzLgorICoJVGhlIHNsZWVwIGhlcmUgZG9lcyBub3QgbmVlZCBpbnRlcnJ1cHQgcHJvdGVjdGlvbiBzaW5jZSB0aGUgd2FrZXVwCisgKglmb3IgaXQgaXMgZG9uZSB3aXRoIHRoZSBzYW1lIGNvbnRleHQuCisgKi8KKwlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgeworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZwb3J0cC0+Y2xvc2Vfd2FpdCk7CisJCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJcmV0dXJuKC1FQUdBSU4pOworCQlyZXR1cm4oLUVSRVNUQVJUU1lTKTsKKwl9CisKKy8qCisgKglCYXNlZCBvbiB0eXBlIG9mIG9wZW4gYmVpbmcgZG9uZSBjaGVjayBpZiBpdCBjYW4gb3ZlcmxhcCB3aXRoIGFueQorICoJcHJldmlvdXMgb3BlbnMgc3RpbGwgaW4gZWZmZWN0LiBJZiB3ZSBhcmUgYSBub3JtYWwgc2VyaWFsIGRldmljZQorICoJdGhlbiBhbHNvIHdlIG1pZ2h0IGhhdmUgdG8gd2FpdCBmb3IgY2Fycmllci4KKyAqLworCWlmICghKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgeworCQlpZiAoKHJjID0gc3RsX3dhaXRjYXJyaWVyKHBvcnRwLCBmaWxwKSkgIT0gMCkKKwkJCXJldHVybihyYyk7CisJfQorCXBvcnRwLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglQb3NzaWJseSBuZWVkIHRvIHdhaXQgZm9yIGNhcnJpZXIgKERDRCBzaWduYWwpIHRvIGNvbWUgaGlnaC4gU2F5CisgKgltYXliZSBiZWNhdXNlIGlmIHdlIGFyZSBjbG9jYWwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIHdhaXQuLi4KKyAqLworCitzdGF0aWMgaW50IHN0bF93YWl0Y2FycmllcihzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludAkJcmMsIGRvY2xvY2FsOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF93YWl0Y2Fycmllcihwb3J0cD0leCxmaWxwPSV4KVxuIiwgKGludCkgcG9ydHAsIChpbnQpIGZpbHApOworI2VuZGlmCisKKwlyYyA9IDA7CisJZG9jbG9jYWwgPSAwOworCisJaWYgKHBvcnRwLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCisJCWRvY2xvY2FsKys7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlwb3J0cC0+b3BlbndhaXRjbnQrKzsKKwlpZiAoISB0dHlfaHVuZ191cF9wKGZpbHApKQorCQlwb3J0cC0+cmVmY291bnQtLTsKKworCWZvciAoOzspIHsKKwkJc3RsX3NldHNpZ25hbHMocG9ydHAsIDEsIDEpOworCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fAorCQkgICAgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgPT0gMCkpIHsKKwkJCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJCXJjID0gLUVCVVNZOworCQkJZWxzZQorCQkJCXJjID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCgocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgPT0gMCkgJiYKKwkJICAgIChkb2Nsb2NhbCB8fCAocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkpKSB7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJjID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydHAtPm9wZW5fd2FpdCk7CisJfQorCisJaWYgKCEgdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcG9ydHAtPnJlZmNvdW50Kys7CisJcG9ydHAtPm9wZW53YWl0Y250LS07CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlyZXR1cm4ocmMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2Nsb3NlKHR0eT0leCxmaWxwPSV4KVxuIiwgKGludCkgdHR5LCAoaW50KSBmaWxwKTsKKyNlbmRpZgorCisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWlmICgodHR5LT5jb3VudCA9PSAxKSAmJiAocG9ydHAtPnJlZmNvdW50ICE9IDEpKQorCQlwb3J0cC0+cmVmY291bnQgPSAxOworCWlmIChwb3J0cC0+cmVmY291bnQtLSA+IDEpIHsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlwb3J0cC0+cmVmY291bnQgPSAwOworCXBvcnRwLT5mbGFncyB8PSBBU1lOQ19DTE9TSU5HOworCisvKgorICoJTWF5IHdhbnQgdG8gd2FpdCBmb3IgYW55IGRhdGEgdG8gZHJhaW4gYmVmb3JlIGNsb3NpbmcuIFRoZSBCVVNZCisgKglmbGFnIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgd2UgYXJlIHN0aWxsIHNlbmRpbmcgb3Igbm90IC0gaXQgaXMKKyAqCXZlcnkgYWNjdXJhdGUgZm9yIHRoZSBjZDE0MDAsIG5vdCBxdWl0ZSBzbyBmb3IgdGhlIHNjMjYxOTguCisgKgkoVGhlIHNjMjYxOTggaGFzIG5vICJlbmQtb2YtZGF0YSIgaW50ZXJydXB0IG9ubHkgZW1wdHkgRklGTykKKyAqLworCXR0eS0+Y2xvc2luZyA9IDE7CisJaWYgKHBvcnRwLT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBwb3J0cC0+Y2xvc2luZ193YWl0KTsKKwlzdGxfd2FpdHVudGlsc2VudCh0dHksIChIWiAvIDIpKTsKKworCXBvcnRwLT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisJc3RsX2Rpc2FibGVpbnRycyhwb3J0cCk7CisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKQorCQlzdGxfc2V0c2lnbmFscyhwb3J0cCwgMCwgMCk7CisJc3RsX2VuYWJsZXJ4dHgocG9ydHAsIDAsIDApOworCXN0bF9mbHVzaGJ1ZmZlcih0dHkpOworCXBvcnRwLT5pc3RhdGUgPSAwOworCWlmIChwb3J0cC0+dHguYnVmICE9IChjaGFyICopIE5VTEwpIHsKKwkJa2ZyZWUocG9ydHAtPnR4LmJ1Zik7CisJCXBvcnRwLT50eC5idWYgPSAoY2hhciAqKSBOVUxMOworCQlwb3J0cC0+dHguaGVhZCA9IChjaGFyICopIE5VTEw7CisJCXBvcnRwLT50eC50YWlsID0gKGNoYXIgKikgTlVMTDsKKwl9CisJc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKworCXR0eS0+Y2xvc2luZyA9IDA7CisJcG9ydHAtPnR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMOworCisJaWYgKHBvcnRwLT5vcGVud2FpdGNudCkgeworCQlpZiAocG9ydHAtPmNsb3NlX2RlbGF5KQorCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2Vjcyhwb3J0cC0+Y2xvc2VfZGVsYXkpKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+b3Blbl93YWl0KTsKKwl9CisKKwlwb3J0cC0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFfEFTWU5DX0NMT1NJTkcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPmNsb3NlX3dhaXQpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglXcml0ZSByb3V0aW5lLiBUYWtlIGRhdGEgYW5kIHN0dWZmIGl0IGluIHRvIHRoZSBUWCByaW5nIHF1ZXVlLgorICoJSWYgdHJhbnNtaXQgaW50ZXJydXB0cyBhcmUgbm90IHJ1bm5pbmcgdGhlbiBzdGFydCB0aGVtLgorICovCisKK3N0YXRpYyBpbnQgc3RsX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisJdW5zaWduZWQgaW50CWxlbiwgc3RsZW47CisJdW5zaWduZWQgY2hhcgkqY2hidWY7CisJY2hhcgkJKmhlYWQsICp0YWlsOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF93cml0ZSh0dHk9JXgsYnVmPSV4LGNvdW50PSVkKVxuIiwKKwkJKGludCkgdHR5LCAoaW50KSBidWYsIGNvdW50KTsKKyNlbmRpZgorCisJaWYgKCh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpIHx8CisJICAgIChzdGxfdG1wd3JpdGVidWYgPT0gKGNoYXIgKikgTlVMTCkpCisJCXJldHVybigwKTsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCWlmIChwb3J0cC0+dHguYnVmID09IChjaGFyICopIE5VTEwpCisJCXJldHVybigwKTsKKworLyoKKyAqCUlmIGNvcHlpbmcgZGlyZWN0IGZyb20gdXNlciBzcGFjZSB3ZSBtdXN0IGNhdGVyIGZvciBwYWdlIGZhdWx0cywKKyAqCWNhdXNpbmcgdXMgdG8gInNsZWVwIiBoZXJlIGZvciBhIHdoaWxlLiBUbyBoYW5kbGUgdGhpcyBjb3B5IGluIGFsbAorICoJdGhlIGRhdGEgd2UgbmVlZCBub3csIGludG8gYSBsb2NhbCBidWZmZXIuIFRoZW4gd2hlbiB3ZSBnb3QgaXQgYWxsCisgKgljb3B5IGl0IGludG8gdGhlIFRYIGJ1ZmZlci4KKyAqLworCWNoYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmOworCisJaGVhZCA9IHBvcnRwLT50eC5oZWFkOworCXRhaWwgPSBwb3J0cC0+dHgudGFpbDsKKwlpZiAoaGVhZCA+PSB0YWlsKSB7CisJCWxlbiA9IFNUTF9UWEJVRlNJWkUgLSAoaGVhZCAtIHRhaWwpIC0gMTsKKwkJc3RsZW4gPSBTVExfVFhCVUZTSVpFIC0gKGhlYWQgLSBwb3J0cC0+dHguYnVmKTsKKwl9IGVsc2UgeworCQlsZW4gPSB0YWlsIC0gaGVhZCAtIDE7CisJCXN0bGVuID0gbGVuOworCX0KKworCWxlbiA9IE1JTihsZW4sIGNvdW50KTsKKwljb3VudCA9IDA7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJc3RsZW4gPSBNSU4obGVuLCBzdGxlbik7CisJCW1lbWNweShoZWFkLCBjaGJ1Ziwgc3RsZW4pOworCQlsZW4gLT0gc3RsZW47CisJCWNoYnVmICs9IHN0bGVuOworCQljb3VudCArPSBzdGxlbjsKKwkJaGVhZCArPSBzdGxlbjsKKwkJaWYgKGhlYWQgPj0gKHBvcnRwLT50eC5idWYgKyBTVExfVFhCVUZTSVpFKSkgeworCQkJaGVhZCA9IHBvcnRwLT50eC5idWY7CisJCQlzdGxlbiA9IHRhaWwgLSBoZWFkOworCQl9CisJfQorCXBvcnRwLT50eC5oZWFkID0gaGVhZDsKKworCWNsZWFyX2JpdChBU1lJX1RYTE9XLCAmcG9ydHAtPmlzdGF0ZSk7CisJc3RsX3N0YXJ0cnh0eChwb3J0cCwgLTEsIDEpOworCisJcmV0dXJuKGNvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxfcHV0Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisJdW5zaWduZWQgaW50CWxlbjsKKwljaGFyCQkqaGVhZCwgKnRhaWw7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3B1dGNoYXIodHR5PSV4LGNoPSV4KVxuIiwgKGludCkgdHR5LCAoaW50KSBjaCk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmIChwb3J0cC0+dHguYnVmID09IChjaGFyICopIE5VTEwpCisJCXJldHVybjsKKworCWhlYWQgPSBwb3J0cC0+dHguaGVhZDsKKwl0YWlsID0gcG9ydHAtPnR4LnRhaWw7CisKKwlsZW4gPSAoaGVhZCA+PSB0YWlsKSA/IChTVExfVFhCVUZTSVpFIC0gKGhlYWQgLSB0YWlsKSkgOiAodGFpbCAtIGhlYWQpOworCWxlbi0tOworCisJaWYgKGxlbiA+IDApIHsKKwkJKmhlYWQrKyA9IGNoOworCQlpZiAoaGVhZCA+PSAocG9ydHAtPnR4LmJ1ZiArIFNUTF9UWEJVRlNJWkUpKQorCQkJaGVhZCA9IHBvcnRwLT50eC5idWY7CisJfQkKKwlwb3J0cC0+dHguaGVhZCA9IGhlYWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUlmIHRoZXJlIGFyZSBhbnkgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyIHRoZW4gbWFrZSBzdXJlIHRoYXQgVFgKKyAqCWludGVycnVwdHMgYXJlIG9uIGFuZCBnZXQnZW0gb3V0LiBOb3JtYWxseSB1c2VkIGFmdGVyIHRoZSBwdXRjaGFyCisgKglyb3V0aW5lIGhhcyBiZWVuIGNhbGxlZC4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfZmx1c2hjaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2ZsdXNoY2hhcnModHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJaWYgKHBvcnRwLT50eC5idWYgPT0gKGNoYXIgKikgTlVMTCkKKwkJcmV0dXJuOworCisjaWYgMAorCWlmICh0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkIHx8CisJICAgIChwb3J0cC0+dHguaGVhZCA9PSBwb3J0cC0+dHgudGFpbCkpCisJCXJldHVybjsKKyNlbmRpZgorCXN0bF9zdGFydHJ4dHgocG9ydHAsIC0xLCAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHN0bF93cml0ZXJvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCWNoYXIJCSpoZWFkLCAqdGFpbDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfd3JpdGVyb29tKHR0eT0leClcbiIsIChpbnQpIHR0eSk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybigwKTsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCWlmIChwb3J0cC0+dHguYnVmID09IChjaGFyICopIE5VTEwpCisJCXJldHVybigwKTsKKworCWhlYWQgPSBwb3J0cC0+dHguaGVhZDsKKwl0YWlsID0gcG9ydHAtPnR4LnRhaWw7CisJcmV0dXJuKChoZWFkID49IHRhaWwpID8gKFNUTF9UWEJVRlNJWkUgLSAoaGVhZCAtIHRhaWwpIC0gMSkgOiAodGFpbCAtIGhlYWQgLSAxKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJldHVybiBudW1iZXIgb2YgY2hhcnMgaW4gdGhlIFRYIGJ1ZmZlci4gTm9ybWFsbHkgd2Ugd291bGQganVzdAorICoJY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2hhcnMgaW4gdGhlIGJ1ZmZlciBhbmQgcmV0dXJuIHRoYXQsIGJ1dCBpZgorICoJdGhlIGJ1ZmZlciBpcyBlbXB0eSBhbmQgVFggaW50ZXJydXB0cyBhcmUgc3RpbGwgb24gdGhlbiB3ZSByZXR1cm4KKyAqCXRoYXQgdGhlIGJ1ZmZlciBzdGlsbCBoYXMgMSBjaGFyIGluIGl0LiBUaGlzIHdheSB3aG9ldmVyIGNhbGxlZCB1cworICoJd2lsbCBub3QgdGhpbmsgdGhhdCBBTEwgY2hhcnMgaGF2ZSBkcmFpbmVkIC0gc2luY2UgdGhlIFVBUlQgc3RpbGwKKyAqCW11c3QgaGF2ZSBzb21lIGNoYXJzIGluIGl0ICh3ZSBhcmUgYnVzeSBhZnRlciBhbGwpLgorICovCisKK3N0YXRpYyBpbnQgc3RsX2NoYXJzaW5idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCXVuc2lnbmVkIGludAlzaXplOworCWNoYXIJCSpoZWFkLCAqdGFpbDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfY2hhcnNpbmJ1ZmZlcih0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybigwKTsKKwlpZiAocG9ydHAtPnR4LmJ1ZiA9PSAoY2hhciAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisKKwloZWFkID0gcG9ydHAtPnR4LmhlYWQ7CisJdGFpbCA9IHBvcnRwLT50eC50YWlsOworCXNpemUgPSAoaGVhZCA+PSB0YWlsKSA/IChoZWFkIC0gdGFpbCkgOiAoU1RMX1RYQlVGU0laRSAtICh0YWlsIC0gaGVhZCkpOworCWlmICgoc2l6ZSA9PSAwKSAmJiB0ZXN0X2JpdChBU1lJX1RYQlVTWSwgJnBvcnRwLT5pc3RhdGUpKQorCQlzaXplID0gMTsKKwlyZXR1cm4oc2l6ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUdlbmVyYXRlIHRoZSBzZXJpYWwgc3RydWN0IGluZm8uCisgKi8KKworc3RhdGljIGludCBzdGxfZ2V0c2VyaWFsKHN0bHBvcnRfdCAqcG9ydHAsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqc3ApCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QJc2lvOworCXN0bGJyZF90CQkqYnJkcDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfZ2V0c2VyaWFsKHBvcnRwPSV4LHNwPSV4KVxuIiwgKGludCkgcG9ydHAsIChpbnQpIHNwKTsKKyNlbmRpZgorCisJbWVtc2V0KCZzaW8sIDAsIHNpemVvZihzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkpOworCXNpby5saW5lID0gcG9ydHAtPnBvcnRucjsKKwlzaW8ucG9ydCA9IHBvcnRwLT5pb2FkZHI7CisJc2lvLmZsYWdzID0gcG9ydHAtPmZsYWdzOworCXNpby5iYXVkX2Jhc2UgPSBwb3J0cC0+YmF1ZF9iYXNlOworCXNpby5jbG9zZV9kZWxheSA9IHBvcnRwLT5jbG9zZV9kZWxheTsKKwlzaW8uY2xvc2luZ193YWl0ID0gcG9ydHAtPmNsb3Npbmdfd2FpdDsKKwlzaW8uY3VzdG9tX2Rpdmlzb3IgPSBwb3J0cC0+Y3VzdG9tX2Rpdmlzb3I7CisJc2lvLmh1YjYgPSAwOworCWlmIChwb3J0cC0+dWFydHAgPT0gJnN0bF9jZDE0MDB1YXJ0KSB7CisJCXNpby50eXBlID0gUE9SVF9DSVJSVVM7CisJCXNpby54bWl0X2ZpZm9fc2l6ZSA9IENEMTQwMF9UWEZJRk9TSVpFOworCX0gZWxzZSB7CisJCXNpby50eXBlID0gUE9SVF9VTktOT1dOOworCQlzaW8ueG1pdF9maWZvX3NpemUgPSBTQzI2MTk4X1RYRklGT1NJWkU7CisJfQorCisJYnJkcCA9IHN0bF9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgIT0gKHN0bGJyZF90ICopIE5VTEwpCisJCXNpby5pcnEgPSBicmRwLT5pcnE7CisKKwlyZXR1cm4gY29weV90b191c2VyKHNwLCAmc2lvLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSA/IC1FRkFVTFQgOiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTZXQgcG9ydCBhY2NvcmRpbmcgdG8gdGhlIHNlcmlhbCBzdHJ1Y3QgaW5mby4KKyAqCUF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IGRvIGFueSBhdXRvLWNvbmZpZ3VyZSBzdHVmZiwgc28gd2Ugd2lsbAorICoJanVzdCBxdWlldGx5IGlnbm9yZSBhbnkgcmVxdWVzdHMgdG8gY2hhbmdlIGlycSwgZXRjLgorICovCisKK3N0YXRpYyBpbnQgc3RsX3NldHNlcmlhbChzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0CXNpbzsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfc2V0c2VyaWFsKHBvcnRwPSV4LHNwPSV4KVxuIiwgKGludCkgcG9ydHAsIChpbnQpIHNwKTsKKyNlbmRpZgorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzaW8sIHNwLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCWlmICgoc2lvLmJhdWRfYmFzZSAhPSBwb3J0cC0+YmF1ZF9iYXNlKSB8fAorCQkgICAgKHNpby5jbG9zZV9kZWxheSAhPSBwb3J0cC0+Y2xvc2VfZGVsYXkpIHx8CisJCSAgICAoKHNpby5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KKwkJICAgIChwb3J0cC0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkKKwkJCXJldHVybigtRVBFUk0pOworCX0gCisKKwlwb3J0cC0+ZmxhZ3MgPSAocG9ydHAtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CisJCShzaW8uZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSyk7CisJcG9ydHAtPmJhdWRfYmFzZSA9IHNpby5iYXVkX2Jhc2U7CisJcG9ydHAtPmNsb3NlX2RlbGF5ID0gc2lvLmNsb3NlX2RlbGF5OworCXBvcnRwLT5jbG9zaW5nX3dhaXQgPSBzaW8uY2xvc2luZ193YWl0OworCXBvcnRwLT5jdXN0b21fZGl2aXNvciA9IHNpby5jdXN0b21fZGl2aXNvcjsKKwlzdGxfc2V0cG9ydChwb3J0cCwgcG9ydHAtPnR0eS0+dGVybWlvcyk7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgc3RsX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCXJldHVybigtRUlPKTsKKworCXJldHVybiBzdGxfZ2V0c2lnbmFscyhwb3J0cCk7Cit9CisKK3N0YXRpYyBpbnQgc3RsX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisJaW50IHJ0cyA9IC0xLCBkdHIgPSAtMTsKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJcmV0dXJuKC1FSU8pOworCisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJcnRzID0gMTsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlkdHIgPSAxOworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJcnRzID0gMDsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWR0ciA9IDA7CisKKwlzdGxfc2V0c2lnbmFscyhwb3J0cCwgZHRyLCBydHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0bF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RscG9ydF90CSpwb3J0cDsKKwl1bnNpZ25lZCBpbnQJaXZhbDsKKwlpbnQJCXJjOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9pb2N0bCh0dHk9JXgsZmlsZT0leCxjbWQ9JXgsYXJnPSV4KVxuIiwKKwkJKGludCkgdHR5LCAoaW50KSBmaWxlLCBjbWQsIChpbnQpIGFyZyk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCisgCSAgICAoY21kICE9IENPTV9HRVRQT1JUU1RBVFMpICYmIChjbWQgIT0gQ09NX0NMUlBPUlRTVEFUUykpIHsKKwkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQkJcmV0dXJuKC1FSU8pOworCX0KKworCXJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DR1NPRlRDQVI6CisJCXJjID0gcHV0X3VzZXIoKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpID8gMSA6IDApLAorCQkJKHVuc2lnbmVkIF9fdXNlciAqKSBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DU1NPRlRDQVI6CisJCWlmIChnZXRfdXNlcihpdmFsLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9CisJCQkJKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpIHwKKwkJCQkoaXZhbCA/IENMT0NBTCA6IDApOworCQlicmVhazsKKwljYXNlIFRJT0NHU0VSSUFMOgorCQlyYyA9IHN0bF9nZXRzZXJpYWwocG9ydHAsIGFyZ3ApOworCQlicmVhazsKKwljYXNlIFRJT0NTU0VSSUFMOgorCQlyYyA9IHN0bF9zZXRzZXJpYWwocG9ydHAsIGFyZ3ApOworCQlicmVhazsKKwljYXNlIENPTV9HRVRQT1JUU1RBVFM6CisJCXJjID0gc3RsX2dldHBvcnRzdGF0cyhwb3J0cCwgYXJncCk7CisJCWJyZWFrOworCWNhc2UgQ09NX0NMUlBPUlRTVEFUUzoKKwkJcmMgPSBzdGxfY2xycG9ydHN0YXRzKHBvcnRwLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DU0VSQ09ORklHOgorCWNhc2UgVElPQ1NFUkdXSUxEOgorCWNhc2UgVElPQ1NFUlNXSUxEOgorCWNhc2UgVElPQ1NFUkdFVExTUjoKKwljYXNlIFRJT0NTRVJHU1RSVUNUOgorCWNhc2UgVElPQ1NFUkdFVE1VTFRJOgorCWNhc2UgVElPQ1NFUlNFVE1VTFRJOgorCWRlZmF1bHQ6CisJCXJjID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4ocmMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bF9zZXR0ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGQpCit7CisJc3RscG9ydF90CSpwb3J0cDsKKwlzdHJ1Y3QgdGVybWlvcwkqdGlvc3A7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NldHRlcm1pb3ModHR5PSV4LG9sZD0leClcbiIsIChpbnQpIHR0eSwgKGludCkgb2xkKTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwl0aW9zcCA9IHR0eS0+dGVybWlvczsKKwlpZiAoKHRpb3NwLT5jX2NmbGFnID09IG9sZC0+Y19jZmxhZykgJiYKKwkgICAgKHRpb3NwLT5jX2lmbGFnID09IG9sZC0+Y19pZmxhZykpCisJCXJldHVybjsKKworCXN0bF9zZXRwb3J0KHBvcnRwLCB0aW9zcCk7CisJc3RsX3NldHNpZ25hbHMocG9ydHAsICgodGlvc3AtPmNfY2ZsYWcgJiAoQ0JBVUQgJiB+Q0JBVURFWCkpID8gMSA6IDApLAorCQktMSk7CisJaWYgKChvbGQtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJiAoKHRpb3NwLT5jX2NmbGFnICYgQ1JUU0NUUykgPT0gMCkpIHsKKwkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJc3RsX3N0YXJ0KHR0eSk7CisJfQorCWlmICgoKG9sZC0+Y19jZmxhZyAmIENMT0NBTCkgPT0gMCkgJiYgKHRpb3NwLT5jX2NmbGFnICYgQ0xPQ0FMKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+b3Blbl93YWl0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQXR0ZW1wdCB0byBmbG93IGNvbnRyb2wgd2hvIGV2ZXIgaXMgc2VuZGluZyB1cyBkYXRhLiBCYXNlZCBvbiB0ZXJtaW9zCisgKglzZXR0aW5ncyB1c2Ugc29mdHdhcmUgb3IvYW5kIGhhcmR3YXJlIGZsb3cgY29udHJvbC4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF90aHJvdHRsZSh0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwlzdGxfZmxvd2N0cmwocG9ydHAsIDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglVbmZsb3cgY29udHJvbCB0aGUgZGV2aWNlIHNlbmRpbmcgdXMgZGF0YS4uLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RscG9ydF90CSpwb3J0cDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfdW50aHJvdHRsZSh0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwlzdGxfZmxvd2N0cmwocG9ydHAsIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTdG9wIHRoZSB0cmFuc21pdHRlci4gQmFzaWNhbGx5IHRvIGRvIHRoaXMgd2Ugd2lsbCBqdXN0IHR1cm4gVFgKKyAqCWludGVycnVwdHMgb2ZmLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RscG9ydF90CSpwb3J0cDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfc3RvcCh0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwlzdGxfc3RhcnRyeHR4KHBvcnRwLCAtMSwgMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVN0YXJ0IHRoZSB0cmFuc21pdHRlciBhZ2Fpbi4gSnVzdCB0dXJuIFRYIGludGVycnVwdHMgYmFjayBvbi4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zdGFydCh0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwlzdGxfc3RhcnRyeHR4KHBvcnRwLCAtMSwgMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUhhbmd1cCB0aGlzIHBvcnQuIFRoaXMgaXMgcHJldHR5IG11Y2ggbGlrZSBjbG9zaW5nIHRoZSBwb3J0LCBvbmx5CisgKglhIGxpdHRsZSBtb3JlIGJydXRhbC4gTm8gd2FpdGluZyBmb3IgZGF0YSB0byBkcmFpbi4gU2h1dGRvd24gdGhlCisgKglwb3J0IGFuZCBtYXliZSBkcm9wIHNpZ25hbHMuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2hhbmd1cCh0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKworCXBvcnRwLT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisJc3RsX2Rpc2FibGVpbnRycyhwb3J0cCk7CisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKQorCQlzdGxfc2V0c2lnbmFscyhwb3J0cCwgMCwgMCk7CisJc3RsX2VuYWJsZXJ4dHgocG9ydHAsIDAsIDApOworCXN0bF9mbHVzaGJ1ZmZlcih0dHkpOworCXBvcnRwLT5pc3RhdGUgPSAwOworCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CisJaWYgKHBvcnRwLT50eC5idWYgIT0gKGNoYXIgKikgTlVMTCkgeworCQlrZnJlZShwb3J0cC0+dHguYnVmKTsKKwkJcG9ydHAtPnR4LmJ1ZiA9IChjaGFyICopIE5VTEw7CisJCXBvcnRwLT50eC5oZWFkID0gKGNoYXIgKikgTlVMTDsKKwkJcG9ydHAtPnR4LnRhaWwgPSAoY2hhciAqKSBOVUxMOworCX0KKwlwb3J0cC0+dHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEw7CisJcG9ydHAtPmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOworCXBvcnRwLT5yZWZjb3VudCA9IDA7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+b3Blbl93YWl0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxfZmx1c2hidWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9mbHVzaGJ1ZmZlcih0dHk9JXgpXG4iLCAoaW50KSB0dHkpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKworCXN0bF9mbHVzaChwb3J0cCk7CisJdHR5X3dha2V1cCh0dHkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bF9icmVha2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgc3RhdGUpCit7CisJc3RscG9ydF90CSpwb3J0cDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfYnJlYWtjdGwodHR5PSV4LHN0YXRlPSVkKVxuIiwgKGludCkgdHR5LCBzdGF0ZSk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJc3RsX3NlbmRicmVhayhwb3J0cCwgKChzdGF0ZSA9PSAtMSkgPyAxIDogMikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bF93YWl0dW50aWxzZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisJdW5zaWduZWQgbG9uZwl0ZW5kOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF93YWl0dW50aWxzZW50KHR0eT0leCx0aW1lb3V0PSVkKVxuIiwgKGludCkgdHR5LCB0aW1lb3V0KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAodGltZW91dCA9PSAwKQorCQl0aW1lb3V0ID0gSFo7CisJdGVuZCA9IGppZmZpZXMgKyB0aW1lb3V0OworCisJd2hpbGUgKHN0bF9kYXRhc3RhdGUocG9ydHApKSB7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgyMCk7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRlbmQpKQorCQkJYnJlYWs7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bF9zZW5keGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKK3sKKwlzdGxwb3J0X3QJKnBvcnRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zZW5keGNoYXIodHR5PSV4LGNoPSV4KVxuIiwgKGludCkgdHR5LCBjaCk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGNoID09IFNUT1BfQ0hBUih0dHkpKQorCQlzdGxfc2VuZGZsb3cocG9ydHAsIDApOworCWVsc2UgaWYgKGNoID09IFNUQVJUX0NIQVIodHR5KSkKKwkJc3RsX3NlbmRmbG93KHBvcnRwLCAxKTsKKwllbHNlCisJCXN0bF9wdXRjaGFyKHR0eSwgY2gpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUJTUFYTElORQkJODAKKworLyoKKyAqCUZvcm1hdCBpbmZvIGZvciBhIHNwZWNpZmllZCBwb3J0LiBUaGUgbGluZSBpcyBkZWxpYmVyYXRlbHkgbGltaXRlZAorICoJdG8gODAgY2hhcmFjdGVycy4gKElmIGl0IGlzIHRvbyBsb25nIGl0IHdpbGwgYmUgdHJ1bmNhdGVkLCBpZiB0b28KKyAqCXNob3J0IHRoZW4gcGFkZGVkIHdpdGggc3BhY2VzKS4KKyAqLworCitzdGF0aWMgaW50IHN0bF9wb3J0aW5mbyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcG9ydG5yLCBjaGFyICpwb3MpCit7CisJY2hhcgkqc3A7CisJaW50CXNpZ3MsIGNudDsKKworCXNwID0gcG9zOworCXNwICs9IHNwcmludGYoc3AsICIlZDogdWFydDolcyB0eDolZCByeDolZCIsCisJCXBvcnRuciwgKHBvcnRwLT5od2lkID09IDEpID8gIlNDMjYxOTgiIDogIkNEMTQwMCIsCisJCShpbnQpIHBvcnRwLT5zdGF0cy50eHRvdGFsLCAoaW50KSBwb3J0cC0+c3RhdHMucnh0b3RhbCk7CisKKwlpZiAocG9ydHAtPnN0YXRzLnJ4ZnJhbWluZykKKwkJc3AgKz0gc3ByaW50ZihzcCwgIiBmZTolZCIsIChpbnQpIHBvcnRwLT5zdGF0cy5yeGZyYW1pbmcpOworCWlmIChwb3J0cC0+c3RhdHMucnhwYXJpdHkpCisJCXNwICs9IHNwcmludGYoc3AsICIgcGU6JWQiLCAoaW50KSBwb3J0cC0+c3RhdHMucnhwYXJpdHkpOworCWlmIChwb3J0cC0+c3RhdHMucnhicmVha3MpCisJCXNwICs9IHNwcmludGYoc3AsICIgYnJrOiVkIiwgKGludCkgcG9ydHAtPnN0YXRzLnJ4YnJlYWtzKTsKKwlpZiAocG9ydHAtPnN0YXRzLnJ4b3ZlcnJ1bikKKwkJc3AgKz0gc3ByaW50ZihzcCwgIiBvZTolZCIsIChpbnQpIHBvcnRwLT5zdGF0cy5yeG92ZXJydW4pOworCisJc2lncyA9IHN0bF9nZXRzaWduYWxzKHBvcnRwKTsKKwljbnQgPSBzcHJpbnRmKHNwLCAiJXMlcyVzJXMlcyAiLAorCQkoc2lncyAmIFRJT0NNX1JUUykgPyAifFJUUyIgOiAiIiwKKwkJKHNpZ3MgJiBUSU9DTV9DVFMpID8gInxDVFMiIDogIiIsCisJCShzaWdzICYgVElPQ01fRFRSKSA/ICJ8RFRSIiA6ICIiLAorCQkoc2lncyAmIFRJT0NNX0NEKSA/ICJ8RENEIiA6ICIiLAorCQkoc2lncyAmIFRJT0NNX0RTUikgPyAifERTUiIgOiAiIik7CisJKnNwID0gJyAnOworCXNwICs9IGNudDsKKworCWZvciAoY250ID0gKHNwIC0gcG9zKTsgKGNudCA8IChNQVhMSU5FIC0gMSkpOyBjbnQrKykKKwkJKnNwKysgPSAnICc7CisJaWYgKGNudCA+PSBNQVhMSU5FKQorCQlwb3NbKE1BWExJTkUgLSAyKV0gPSAnKyc7CisJcG9zWyhNQVhMSU5FIC0gMSldID0gJ1xuJzsKKworCXJldHVybihNQVhMSU5FKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUG9ydCBpbmZvLCByZWFkIGZyb20gdGhlIC9wcm9jIGZpbGUgc3lzdGVtLgorICovCisKK3N0YXRpYyBpbnQgc3RsX3JlYWRwcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0bGJyZF90CSpicmRwOworCXN0bHBhbmVsX3QJKnBhbmVscDsKKwlzdGxwb3J0X3QJKnBvcnRwOworCWludAkJYnJkbnIsIHBhbmVsbnIsIHBvcnRuciwgdG90YWxwb3J0OworCWludAkJY3Vyb2ZmLCBtYXhvZmY7CisJY2hhcgkJKnBvczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfcmVhZHByb2MocGFnZT0leCxzdGFydD0leCxvZmY9JXgsY291bnQ9JWQsZW9mPSV4LCIKKwkJImRhdGE9JXhcbiIsIChpbnQpIHBhZ2UsIChpbnQpIHN0YXJ0LCAoaW50KSBvZmYsIGNvdW50LAorCQkoaW50KSBlb2YsIChpbnQpIGRhdGEpOworI2VuZGlmCisKKwlwb3MgPSBwYWdlOworCXRvdGFscG9ydCA9IDA7CisJY3Vyb2ZmID0gMDsKKworCWlmIChvZmYgPT0gMCkgeworCQlwb3MgKz0gc3ByaW50Zihwb3MsICIlczogdmVyc2lvbiAlcyIsIHN0bF9kcnZ0aXRsZSwKKwkJCXN0bF9kcnZ2ZXJzaW9uKTsKKwkJd2hpbGUgKHBvcyA8IChwYWdlICsgTUFYTElORSAtIDEpKQorCQkJKnBvcysrID0gJyAnOworCQkqcG9zKysgPSAnXG4nOworCX0KKwljdXJvZmYgPSAgTUFYTElORTsKKworLyoKKyAqCVdlIHNjYW4gdGhyb3VnaCBmb3IgZWFjaCBib2FyZCwgcGFuZWwgYW5kIHBvcnQuIFRoZSBvZmZzZXQgaXMKKyAqCWNhbGN1bGF0ZWQgb24gdGhlIGZseSwgYW5kIGlycmVsZXZhbnQgcG9ydHMgYXJlIHNraXBwZWQuCisgKi8KKwlmb3IgKGJyZG5yID0gMDsgKGJyZG5yIDwgc3RsX25yYnJkcyk7IGJyZG5yKyspIHsKKwkJYnJkcCA9IHN0bF9icmRzW2JyZG5yXTsKKwkJaWYgKGJyZHAgPT0gKHN0bGJyZF90ICopIE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKGJyZHAtPnN0YXRlID09IDApCisJCQljb250aW51ZTsKKworCQltYXhvZmYgPSBjdXJvZmYgKyAoYnJkcC0+bnJwb3J0cyAqIE1BWExJTkUpOworCQlpZiAob2ZmID49IG1heG9mZikgeworCQkJY3Vyb2ZmID0gbWF4b2ZmOworCQkJY29udGludWU7CisJCX0KKworCQl0b3RhbHBvcnQgPSBicmRuciAqIFNUTF9NQVhQT1JUUzsKKwkJZm9yIChwYW5lbG5yID0gMDsgKHBhbmVsbnIgPCBicmRwLT5ucnBhbmVscyk7IHBhbmVsbnIrKykgeworCQkJcGFuZWxwID0gYnJkcC0+cGFuZWxzW3BhbmVsbnJdOworCQkJaWYgKHBhbmVscCA9PSAoc3RscGFuZWxfdCAqKSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQltYXhvZmYgPSBjdXJvZmYgKyAocGFuZWxwLT5ucnBvcnRzICogTUFYTElORSk7CisJCQlpZiAob2ZmID49IG1heG9mZikgeworCQkJCWN1cm9mZiA9IG1heG9mZjsKKwkJCQl0b3RhbHBvcnQgKz0gcGFuZWxwLT5ucnBvcnRzOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlmb3IgKHBvcnRuciA9IDA7IChwb3J0bnIgPCBwYW5lbHAtPm5ycG9ydHMpOyBwb3J0bnIrKywKKwkJCSAgICB0b3RhbHBvcnQrKykgeworCQkJCXBvcnRwID0gcGFuZWxwLT5wb3J0c1twb3J0bnJdOworCQkJCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChvZmYgPj0gKGN1cm9mZiArPSBNQVhMSU5FKSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKChwb3MgLSBwYWdlICsgTUFYTElORSkgPiBjb3VudCkKKwkJCQkJZ290byBzdGxfcmVhZGRvbmU7CisJCQkJcG9zICs9IHN0bF9wb3J0aW5mbyhwb3J0cCwgdG90YWxwb3J0LCBwb3MpOworCQkJfQorCQl9CisJfQorCisJKmVvZiA9IDE7CisKK3N0bF9yZWFkZG9uZToKKwkqc3RhcnQgPSBwYWdlOworCXJldHVybihwb3MgLSBwYWdlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQWxsIGJvYXJkIGludGVycnVwdHMgYXJlIHZlY3RvcmVkIHRocm91Z2ggaGVyZSBmaXJzdC4gVGhpcyBjb2RlIHRoZW4KKyAqCWNhbGxzIG9mZiB0byB0aGUgYXBwcm9ycHJpYXRlIGJvYXJkIGludGVycnVwdCBoYW5kbGVycy4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3RsX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdGxicmRfdAkqYnJkcCA9IChzdGxicmRfdCAqKSBkZXZfaWQ7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2ludHIoYnJkcD0leCxpcnE9JWQscmVncz0leClcbiIsIChpbnQpIGJyZHAsIGlycSwKKwkgICAgKGludCkgcmVncyk7CisjZW5kaWYKKworCXJldHVybiBJUlFfUkVUVkFMKCgqIGJyZHAtPmlzcikoYnJkcCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBFYXN5SU8gYm9hcmQgdHlwZXMuCisgKi8KKworc3RhdGljIGludCBzdGxfZWlvaW50cihzdGxicmRfdCAqYnJkcCkKK3sKKwlzdGxwYW5lbF90CSpwYW5lbHA7CisJdW5zaWduZWQgaW50CWlvYmFzZTsKKwlpbnQJCWhhbmRsZWQgPSAwOworCisJcGFuZWxwID0gYnJkcC0+cGFuZWxzWzBdOworCWlvYmFzZSA9IHBhbmVscC0+aW9iYXNlOworCXdoaWxlIChpbmIoYnJkcC0+aW9zdGF0dXMpICYgRUlPX0lOVFJQRU5EKSB7CisJCWhhbmRsZWQgPSAxOworCQkoKiBwYW5lbHAtPmlzcikocGFuZWxwLCBpb2Jhc2UpOworCX0KKwlyZXR1cm4gaGFuZGxlZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgRUNILUFUIGJvYXJkIHR5cGVzLgorICovCisKK3N0YXRpYyBpbnQgc3RsX2VjaGF0aW50cihzdGxicmRfdCAqYnJkcCkKK3sKKwlzdGxwYW5lbF90CSpwYW5lbHA7CisJdW5zaWduZWQgaW50CWlvYWRkcjsKKwlpbnQJCWJua25yOworCWludAkJaGFuZGxlZCA9IDA7CisKKwlvdXRiKChicmRwLT5pb2N0cmx2YWwgfCBFQ0hfQlJERU5BQkxFKSwgYnJkcC0+aW9jdHJsKTsKKworCXdoaWxlIChpbmIoYnJkcC0+aW9zdGF0dXMpICYgRUNIX0lOVFJQRU5EKSB7CisJCWhhbmRsZWQgPSAxOworCQlmb3IgKGJua25yID0gMDsgKGJua25yIDwgYnJkcC0+bnJibmtzKTsgYm5rbnIrKykgeworCQkJaW9hZGRyID0gYnJkcC0+Ym5rc3RhdGFkZHJbYm5rbnJdOworCQkJaWYgKGluYihpb2FkZHIpICYgRUNIX1BOTElOVFJQRU5EKSB7CisJCQkJcGFuZWxwID0gYnJkcC0+Ym5rMnBhbmVsW2Jua25yXTsKKwkJCQkoKiBwYW5lbHAtPmlzcikocGFuZWxwLCAoaW9hZGRyICYgMHhmZmZjKSk7CisJCQl9CisJCX0KKwl9CisKKwlvdXRiKChicmRwLT5pb2N0cmx2YWwgfCBFQ0hfQlJERElTQUJMRSksIGJyZHAtPmlvY3RybCk7CisKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgRUNILU1DQSBib2FyZCB0eXBlcy4KKyAqLworCitzdGF0aWMgaW50IHN0bF9lY2htY2FpbnRyKHN0bGJyZF90ICpicmRwKQoreworCXN0bHBhbmVsX3QJKnBhbmVscDsKKwl1bnNpZ25lZCBpbnQJaW9hZGRyOworCWludAkJYm5rbnI7CisJaW50CQloYW5kbGVkID0gMDsKKworCXdoaWxlIChpbmIoYnJkcC0+aW9zdGF0dXMpICYgRUNIX0lOVFJQRU5EKSB7CisJCWhhbmRsZWQgPSAxOworCQlmb3IgKGJua25yID0gMDsgKGJua25yIDwgYnJkcC0+bnJibmtzKTsgYm5rbnIrKykgeworCQkJaW9hZGRyID0gYnJkcC0+Ym5rc3RhdGFkZHJbYm5rbnJdOworCQkJaWYgKGluYihpb2FkZHIpICYgRUNIX1BOTElOVFJQRU5EKSB7CisJCQkJcGFuZWxwID0gYnJkcC0+Ym5rMnBhbmVsW2Jua25yXTsKKwkJCQkoKiBwYW5lbHAtPmlzcikocGFuZWxwLCAoaW9hZGRyICYgMHhmZmZjKSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIEVDSC1QQ0kgYm9hcmQgdHlwZXMuCisgKi8KKworc3RhdGljIGludCBzdGxfZWNocGNpaW50cihzdGxicmRfdCAqYnJkcCkKK3sKKwlzdGxwYW5lbF90CSpwYW5lbHA7CisJdW5zaWduZWQgaW50CWlvYWRkcjsKKwlpbnQJCWJua25yLCByZWNoZWNrOworCWludAkJaGFuZGxlZCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlyZWNoZWNrID0gMDsKKwkJZm9yIChibmtuciA9IDA7IChibmtuciA8IGJyZHAtPm5yYm5rcyk7IGJua25yKyspIHsKKwkJCW91dGIoYnJkcC0+Ym5rcGFnZWFkZHJbYm5rbnJdLCBicmRwLT5pb2N0cmwpOworCQkJaW9hZGRyID0gYnJkcC0+Ym5rc3RhdGFkZHJbYm5rbnJdOworCQkJaWYgKGluYihpb2FkZHIpICYgRUNIX1BOTElOVFJQRU5EKSB7CisJCQkJcGFuZWxwID0gYnJkcC0+Ym5rMnBhbmVsW2Jua25yXTsKKwkJCQkoKiBwYW5lbHAtPmlzcikocGFuZWxwLCAoaW9hZGRyICYgMHhmZmZjKSk7CisJCQkJcmVjaGVjaysrOworCQkJCWhhbmRsZWQgPSAxOworCQkJfQorCQl9CisJCWlmICghIHJlY2hlY2spCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIEVDSC04LzY0LVBDSSBib2FyZCB0eXBlcy4KKyAqLworCitzdGF0aWMgaW50IHN0bF9lY2hwY2k2NGludHIoc3RsYnJkX3QgKmJyZHApCit7CisJc3RscGFuZWxfdAkqcGFuZWxwOworCXVuc2lnbmVkIGludAlpb2FkZHI7CisJaW50CQlibmtucjsKKwlpbnQJCWhhbmRsZWQgPSAwOworCisJd2hpbGUgKGluYihicmRwLT5pb2N0cmwpICYgMHgxKSB7CisJCWhhbmRsZWQgPSAxOworCQlmb3IgKGJua25yID0gMDsgKGJua25yIDwgYnJkcC0+bnJibmtzKTsgYm5rbnIrKykgeworCQkJaW9hZGRyID0gYnJkcC0+Ym5rc3RhdGFkZHJbYm5rbnJdOworCQkJaWYgKGluYihpb2FkZHIpICYgRUNIX1BOTElOVFJQRU5EKSB7CisJCQkJcGFuZWxwID0gYnJkcC0+Ym5rMnBhbmVsW2Jua25yXTsKKwkJCQkoKiBwYW5lbHAtPmlzcikocGFuZWxwLCAoaW9hZGRyICYgMHhmZmZjKSk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2VydmljZSBhbiBvZmYtbGV2ZWwgcmVxdWVzdCBmb3Igc29tZSBjaGFubmVsLgorICovCitzdGF0aWMgdm9pZCBzdGxfb2ZmaW50cih2b2lkICpwcml2YXRlKQoreworCXN0bHBvcnRfdAkJKnBvcnRwOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJdW5zaWduZWQgaW50CQlvbGRzaWdzOworCisJcG9ydHAgPSBwcml2YXRlOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9vZmZpbnRyKHBvcnRwPSV4KVxuIiwgKGludCkgcG9ydHApOworI2VuZGlmCisKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwl0dHkgPSBwb3J0cC0+dHR5OworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKHRlc3RfYml0KEFTWUlfVFhMT1csICZwb3J0cC0+aXN0YXRlKSkgeworCQl0dHlfd2FrZXVwKHR0eSk7CisJfQorCWlmICh0ZXN0X2JpdChBU1lJX0RDRENIQU5HRSwgJnBvcnRwLT5pc3RhdGUpKSB7CisJCWNsZWFyX2JpdChBU1lJX0RDRENIQU5HRSwgJnBvcnRwLT5pc3RhdGUpOworCQlvbGRzaWdzID0gcG9ydHAtPnNpZ3M7CisJCXBvcnRwLT5zaWdzID0gc3RsX2dldHNpZ25hbHMocG9ydHApOworCQlpZiAoKHBvcnRwLT5zaWdzICYgVElPQ01fQ0QpICYmICgob2xkc2lncyAmIFRJT0NNX0NEKSA9PSAwKSkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPm9wZW5fd2FpdCk7CisJCWlmICgob2xkc2lncyAmIFRJT0NNX0NEKSAmJiAoKHBvcnRwLT5zaWdzICYgVElPQ01fQ0QpID09IDApKSB7CisJCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpCisJCQkJdHR5X2hhbmd1cCh0dHkpOwkvKiBGSVhNRTogbW9kdWxlIHJlbW92YWwgcmFjZSBoZXJlIC0gQUtQTSAqLworCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSW5pdGlhbGl6ZSBhbGwgdGhlIHBvcnRzIG9uIGEgcGFuZWwuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgc3RsX2luaXRwb3J0cyhzdGxicmRfdCAqYnJkcCwgc3RscGFuZWxfdCAqcGFuZWxwKQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisJaW50CQljaGlwbWFzaywgaTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfaW5pdHBvcnRzKGJyZHA9JXgscGFuZWxwPSV4KVxuIiwgKGludCkgYnJkcCwgKGludCkgcGFuZWxwKTsKKyNlbmRpZgorCisJY2hpcG1hc2sgPSBzdGxfcGFuZWxpbml0KGJyZHAsIHBhbmVscCk7CisKKy8qCisgKglBbGwgVUFSVCdzIGFyZSBpbml0aWFsaXplZCAoaWYgZm91bmQhKS4gTm93IGdvIHRocm91Z2ggYW5kIHNldHVwCisgKgllYWNoIHBvcnRzIGRhdGEgc3RydWN0dXJlcy4KKyAqLworCWZvciAoaSA9IDA7IChpIDwgcGFuZWxwLT5ucnBvcnRzKTsgaSsrKSB7CisJCXBvcnRwID0gKHN0bHBvcnRfdCAqKSBzdGxfbWVtYWxsb2Moc2l6ZW9mKHN0bHBvcnRfdCkpOworCQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKSB7CisJCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ICIKKwkJCQkiKHNpemU9JWQpXG4iLCBzaXplb2Yoc3RscG9ydF90KSk7CisJCQlicmVhazsKKwkJfQorCQltZW1zZXQocG9ydHAsIDAsIHNpemVvZihzdGxwb3J0X3QpKTsKKworCQlwb3J0cC0+bWFnaWMgPSBTVExfUE9SVE1BR0lDOworCQlwb3J0cC0+cG9ydG5yID0gaTsKKwkJcG9ydHAtPmJyZG5yID0gcGFuZWxwLT5icmRucjsKKwkJcG9ydHAtPnBhbmVsbnIgPSBwYW5lbHAtPnBhbmVsbnI7CisJCXBvcnRwLT51YXJ0cCA9IHBhbmVscC0+dWFydHA7CisJCXBvcnRwLT5jbGsgPSBicmRwLT5jbGs7CisJCXBvcnRwLT5iYXVkX2Jhc2UgPSBTVExfQkFVREJBU0U7CisJCXBvcnRwLT5jbG9zZV9kZWxheSA9IFNUTF9DTE9TRURFTEFZOworCQlwb3J0cC0+Y2xvc2luZ193YWl0ID0gMzAgKiBIWjsKKwkJSU5JVF9XT1JLKCZwb3J0cC0+dHF1ZXVlLCBzdGxfb2ZmaW50ciwgcG9ydHApOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0cC0+b3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydHAtPmNsb3NlX3dhaXQpOworCQlwb3J0cC0+c3RhdHMuYnJkID0gcG9ydHAtPmJyZG5yOworCQlwb3J0cC0+c3RhdHMucGFuZWwgPSBwb3J0cC0+cGFuZWxucjsKKwkJcG9ydHAtPnN0YXRzLnBvcnQgPSBwb3J0cC0+cG9ydG5yOworCQlwYW5lbHAtPnBvcnRzW2ldID0gcG9ydHA7CisJCXN0bF9wb3J0aW5pdChicmRwLCBwYW5lbHAsIHBvcnRwKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVRyeSB0byBmaW5kIGFuZCBpbml0aWFsaXplIGFuIEVhc3lJTyBib2FyZC4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBzdGxfaW5pdGVpbyhzdGxicmRfdCAqYnJkcCkKK3sKKwlzdGxwYW5lbF90CSpwYW5lbHA7CisJdW5zaWduZWQgaW50CXN0YXR1czsKKwljaGFyCQkqbmFtZTsKKwlpbnQJCXJjOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9pbml0ZWlvKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJYnJkcC0+aW9jdHJsID0gYnJkcC0+aW9hZGRyMSArIDE7CisJYnJkcC0+aW9zdGF0dXMgPSBicmRwLT5pb2FkZHIxICsgMjsKKworCXN0YXR1cyA9IGluYihicmRwLT5pb3N0YXR1cyk7CisJaWYgKChzdGF0dXMgJiBFSU9fSURCSVRNQVNLKSA9PSBFSU9fTUszKQorCQlicmRwLT5pb2N0cmwrKzsKKworLyoKKyAqCUhhbmRsZSBib2FyZCBzcGVjaWZpYyBzdHVmZiBub3cuIFRoZSByZWFsIGRpZmZlcmVuY2UgaXMgUENJCisgKglvciBub3QgUENJLgorICovCisJaWYgKGJyZHAtPmJyZHR5cGUgPT0gQlJEX0VBU1lJT1BDSSkgeworCQlicmRwLT5pb3NpemUxID0gMHg4MDsKKwkJYnJkcC0+aW9zaXplMiA9IDB4ODA7CisJCW5hbWUgPSAic2VyaWFsKEVJTy1QQ0kpIjsKKwkJb3V0YigweDQxLCAoYnJkcC0+aW9hZGRyMiArIDB4NGMpKTsKKwl9IGVsc2UgeworCQlicmRwLT5pb3NpemUxID0gODsKKwkJbmFtZSA9ICJzZXJpYWwoRUlPKSI7CisJCWlmICgoYnJkcC0+aXJxIDwgMCkgfHwgKGJyZHAtPmlycSA+IDE1KSB8fAorCQkgICAgKHN0bF92ZWNtYXBbYnJkcC0+aXJxXSA9PSAodW5zaWduZWQgY2hhcikgMHhmZikpIHsKKwkJCXByaW50aygiU1RBTExJT046IGludmFsaWQgaXJxPSVkIGZvciBicmQ9JWRcbiIsCisJCQkJYnJkcC0+aXJxLCBicmRwLT5icmRucik7CisJCQlyZXR1cm4oLUVJTlZBTCk7CisJCX0KKwkJb3V0Yigoc3RsX3ZlY21hcFticmRwLT5pcnFdIHwgRUlPXzBXUyB8CisJCQkoKGJyZHAtPmlycXR5cGUpID8gRUlPX0lOVExFVkVMIDogRUlPX0lOVEVER0UpKSwKKwkJCWJyZHAtPmlvY3RybCk7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihicmRwLT5pb2FkZHIxLCBicmRwLT5pb3NpemUxLCBuYW1lKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTVEFMTElPTjogV2FybmluZywgYm9hcmQgJWQgSS9PIGFkZHJlc3MgIgorCQkJIiV4IGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZGV2aWNlXG4iLCBicmRwLT5icmRuciwgCisJCQlicmRwLT5pb2FkZHIxKTsKKwkJcmV0dXJuKC1FQlVTWSk7CisJfQorCQorCWlmIChicmRwLT5pb3NpemUyID4gMCkKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihicmRwLT5pb2FkZHIyLCBicmRwLT5pb3NpemUyLCBuYW1lKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU1RBTExJT046IFdhcm5pbmcsIGJvYXJkICVkIEkvTyAiCisJCQkJImFkZHJlc3MgJXggY29uZmxpY3RzIHdpdGggYW5vdGhlciBkZXZpY2VcbiIsCisJCQkJYnJkcC0+YnJkbnIsIGJyZHAtPmlvYWRkcjIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU1RBTExJT046IFdhcm5pbmcsIGFsc28gIgorCQkJCSJyZWxlYXNpbmcgYm9hcmQgJWQgSS9PIGFkZHJlc3MgJXggXG4iLCAKKwkJCQlicmRwLT5icmRuciwgYnJkcC0+aW9hZGRyMSk7CisJCQlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2FkZHIxLCBicmRwLT5pb3NpemUxKTsKKyAgICAgICAgCQlyZXR1cm4oLUVCVVNZKTsKKwkJfQorCisvKgorICoJRXZlcnl0aGluZyBsb29rcyBPSywgc28gbGV0J3MgZ28gYWhlYWQgYW5kIHByb2JlIGZvciB0aGUgaGFyZHdhcmUuCisgKi8KKwlicmRwLT5jbGsgPSBDRDE0MDBfQ0xLOworCWJyZHAtPmlzciA9IHN0bF9laW9pbnRyOworCisJc3dpdGNoIChzdGF0dXMgJiBFSU9fSURCSVRNQVNLKSB7CisJY2FzZSBFSU9fOFBPUlRNOgorCQlicmRwLT5jbGsgPSBDRDE0MDBfQ0xLOE07CisJCS8qIGZhbGwgdGhydSAqLworCWNhc2UgRUlPXzhQT1JUUlM6CisJY2FzZSBFSU9fOFBPUlRESToKKwkJYnJkcC0+bnJwb3J0cyA9IDg7CisJCWJyZWFrOworCWNhc2UgRUlPXzRQT1JUUlM6CisJCWJyZHAtPm5ycG9ydHMgPSA0OworCQlicmVhazsKKwljYXNlIEVJT19NSzM6CisJCXN3aXRjaCAoc3RhdHVzICYgRUlPX0JSRE1BU0spIHsKKwkJY2FzZSBJRF9CUkQ0OgorCQkJYnJkcC0+bnJwb3J0cyA9IDQ7CisJCQlicmVhazsKKwkJY2FzZSBJRF9CUkQ4OgorCQkJYnJkcC0+bnJwb3J0cyA9IDg7CisJCQlicmVhazsKKwkJY2FzZSBJRF9CUkQxNjoKKwkJCWJyZHAtPm5ycG9ydHMgPSAxNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuKC1FTk9ERVYpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybigtRU5PREVWKTsKKwl9CisKKy8qCisgKglXZSBoYXZlIHZlcmlmaWVkIHRoYXQgdGhlIGJvYXJkIGlzIGFjdHVhbGx5IHByZXNlbnQsIHNvIG5vdyB3ZQorICoJY2FuIGNvbXBsZXRlIHRoZSBzZXR1cC4KKyAqLworCisJcGFuZWxwID0gKHN0bHBhbmVsX3QgKikgc3RsX21lbWFsbG9jKHNpemVvZihzdGxwYW5lbF90KSk7CisJaWYgKHBhbmVscCA9PSAoc3RscGFuZWxfdCAqKSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNUQUxMSU9OOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ICIKKwkJCSIoc2l6ZT0lZClcbiIsIHNpemVvZihzdGxwYW5lbF90KSk7CisJCXJldHVybigtRU5PTUVNKTsKKwl9CisJbWVtc2V0KHBhbmVscCwgMCwgc2l6ZW9mKHN0bHBhbmVsX3QpKTsKKworCXBhbmVscC0+bWFnaWMgPSBTVExfUEFORUxNQUdJQzsKKwlwYW5lbHAtPmJyZG5yID0gYnJkcC0+YnJkbnI7CisJcGFuZWxwLT5wYW5lbG5yID0gMDsKKwlwYW5lbHAtPm5ycG9ydHMgPSBicmRwLT5ucnBvcnRzOworCXBhbmVscC0+aW9iYXNlID0gYnJkcC0+aW9hZGRyMTsKKwlwYW5lbHAtPmh3aWQgPSBzdGF0dXM7CisJaWYgKChzdGF0dXMgJiBFSU9fSURCSVRNQVNLKSA9PSBFSU9fTUszKSB7CisJCXBhbmVscC0+dWFydHAgPSAodm9pZCAqKSAmc3RsX3NjMjYxOTh1YXJ0OworCQlwYW5lbHAtPmlzciA9IHN0bF9zYzI2MTk4aW50cjsKKwl9IGVsc2UgeworCQlwYW5lbHAtPnVhcnRwID0gKHZvaWQgKikgJnN0bF9jZDE0MDB1YXJ0OworCQlwYW5lbHAtPmlzciA9IHN0bF9jZDE0MDBlaW9pbnRyOworCX0KKworCWJyZHAtPnBhbmVsc1swXSA9IHBhbmVscDsKKwlicmRwLT5ucnBhbmVscyA9IDE7CisJYnJkcC0+c3RhdGUgfD0gQlJEX0ZPVU5EOworCWJyZHAtPmh3aWQgPSBzdGF0dXM7CisJaWYgKHJlcXVlc3RfaXJxKGJyZHAtPmlycSwgc3RsX2ludHIsIFNBX1NISVJRLCBuYW1lLCBicmRwKSAhPSAwKSB7CisJCXByaW50aygiU1RBTExJT046IGZhaWxlZCB0byByZWdpc3RlciBpbnRlcnJ1cHQgIgorCQkgICAgInJvdXRpbmUgZm9yICVzIGlycT0lZFxuIiwgbmFtZSwgYnJkcC0+aXJxKTsKKwkJcmMgPSAtRU5PREVWOworCX0gZWxzZSB7CisJCXJjID0gMDsKKwl9CisJcmV0dXJuKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVHJ5IHRvIGZpbmQgYW4gRUNIIGJvYXJkIGFuZCBpbml0aWFsaXplIGl0LiBUaGlzIGNvZGUgaXMgY2FwYWJsZSBvZgorICoJZGVhbGluZyB3aXRoIGFsbCB0eXBlcyBvZiBFQ0ggYm9hcmQuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgc3RsX2luaXRlY2goc3RsYnJkX3QgKmJyZHApCit7CisJc3RscGFuZWxfdAkqcGFuZWxwOworCXVuc2lnbmVkIGludAlzdGF0dXMsIG54dGlkLCBpb2FkZHIsIGNvbmZsaWN0OworCWludAkJcGFuZWxuciwgYmFua25yLCBpOworCWNoYXIJCSpuYW1lOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9pbml0ZWNoKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJc3RhdHVzID0gMDsKKwljb25mbGljdCA9IDA7CisKKy8qCisgKglTZXQgdXAgdGhlIGluaXRpYWwgYm9hcmQgcmVnaXN0ZXIgY29udGVudHMgZm9yIGJvYXJkcy4gVGhpcyB2YXJpZXMgYQorICoJYml0IGJldHdlZW4gdGhlIGRpZmZlcmVudCBib2FyZCB0eXBlcy4gU28gd2UgbmVlZCB0byBoYW5kbGUgZWFjaAorICoJc2VwYXJhdGVseS4gQWxzbyBkbyBhIGNoZWNrIHRoYXQgdGhlIHN1cHBsaWVkIElSUSBpcyBnb29kLgorICovCisJc3dpdGNoIChicmRwLT5icmR0eXBlKSB7CisKKwljYXNlIEJSRF9FQ0g6CisJCWJyZHAtPmlzciA9IHN0bF9lY2hhdGludHI7CisJCWJyZHAtPmlvY3RybCA9IGJyZHAtPmlvYWRkcjEgKyAxOworCQlicmRwLT5pb3N0YXR1cyA9IGJyZHAtPmlvYWRkcjEgKyAxOworCQlzdGF0dXMgPSBpbmIoYnJkcC0+aW9zdGF0dXMpOworCQlpZiAoKHN0YXR1cyAmIEVDSF9JREJJVE1BU0spICE9IEVDSF9JRCkKKwkJCXJldHVybigtRU5PREVWKTsKKwkJaWYgKChicmRwLT5pcnEgPCAwKSB8fCAoYnJkcC0+aXJxID4gMTUpIHx8CisJCSAgICAoc3RsX3ZlY21hcFticmRwLT5pcnFdID09ICh1bnNpZ25lZCBjaGFyKSAweGZmKSkgeworCQkJcHJpbnRrKCJTVEFMTElPTjogaW52YWxpZCBpcnE9JWQgZm9yIGJyZD0lZFxuIiwKKwkJCQlicmRwLT5pcnEsIGJyZHAtPmJyZG5yKTsKKwkJCXJldHVybigtRUlOVkFMKTsKKwkJfQorCQlzdGF0dXMgPSAoKGJyZHAtPmlvYWRkcjIgJiBFQ0hfQUREUjJNQVNLKSA+PiAxKTsKKwkJc3RhdHVzIHw9IChzdGxfdmVjbWFwW2JyZHAtPmlycV0gPDwgMSk7CisJCW91dGIoKHN0YXR1cyB8IEVDSF9CUkRSRVNFVCksIGJyZHAtPmlvYWRkcjEpOworCQlicmRwLT5pb2N0cmx2YWwgPSBFQ0hfSU5URU5BQkxFIHwKKwkJCSgoYnJkcC0+aXJxdHlwZSkgPyBFQ0hfSU5UTEVWRUwgOiBFQ0hfSU5URURHRSk7CisJCWZvciAoaSA9IDA7IChpIDwgMTApOyBpKyspCisJCQlvdXRiKChicmRwLT5pb2N0cmx2YWwgfCBFQ0hfQlJERU5BQkxFKSwgYnJkcC0+aW9jdHJsKTsKKwkJYnJkcC0+aW9zaXplMSA9IDI7CisJCWJyZHAtPmlvc2l6ZTIgPSAzMjsKKwkJbmFtZSA9ICJzZXJpYWwoRUM4LzMyKSI7CisJCW91dGIoc3RhdHVzLCBicmRwLT5pb2FkZHIxKTsKKwkJYnJlYWs7CisKKwljYXNlIEJSRF9FQ0hNQzoKKwkJYnJkcC0+aXNyID0gc3RsX2VjaG1jYWludHI7CisJCWJyZHAtPmlvY3RybCA9IGJyZHAtPmlvYWRkcjEgKyAweDIwOworCQlicmRwLT5pb3N0YXR1cyA9IGJyZHAtPmlvY3RybDsKKwkJc3RhdHVzID0gaW5iKGJyZHAtPmlvc3RhdHVzKTsKKwkJaWYgKChzdGF0dXMgJiBFQ0hfSURCSVRNQVNLKSAhPSBFQ0hfSUQpCisJCQlyZXR1cm4oLUVOT0RFVik7CisJCWlmICgoYnJkcC0+aXJxIDwgMCkgfHwgKGJyZHAtPmlycSA+IDE1KSB8fAorCQkgICAgKHN0bF92ZWNtYXBbYnJkcC0+aXJxXSA9PSAodW5zaWduZWQgY2hhcikgMHhmZikpIHsKKwkJCXByaW50aygiU1RBTExJT046IGludmFsaWQgaXJxPSVkIGZvciBicmQ9JWRcbiIsCisJCQkJYnJkcC0+aXJxLCBicmRwLT5icmRucik7CisJCQlyZXR1cm4oLUVJTlZBTCk7CisJCX0KKwkJb3V0YihFQ0hNQ19CUkRSRVNFVCwgYnJkcC0+aW9jdHJsKTsKKwkJb3V0YihFQ0hNQ19JTlRFTkFCTEUsIGJyZHAtPmlvY3RybCk7CisJCWJyZHAtPmlvc2l6ZTEgPSA2NDsKKwkJbmFtZSA9ICJzZXJpYWwoRUM4LzMyLU1DKSI7CisJCWJyZWFrOworCisJY2FzZSBCUkRfRUNIUENJOgorCQlicmRwLT5pc3IgPSBzdGxfZWNocGNpaW50cjsKKwkJYnJkcC0+aW9jdHJsID0gYnJkcC0+aW9hZGRyMSArIDI7CisJCWJyZHAtPmlvc2l6ZTEgPSA0OworCQlicmRwLT5pb3NpemUyID0gODsKKwkJbmFtZSA9ICJzZXJpYWwoRUM4LzMyLVBDSSkiOworCQlicmVhazsKKworCWNhc2UgQlJEX0VDSDY0UENJOgorCQlicmRwLT5pc3IgPSBzdGxfZWNocGNpNjRpbnRyOworCQlicmRwLT5pb2N0cmwgPSBicmRwLT5pb2FkZHIyICsgMHg0MDsKKwkJb3V0YigweDQzLCAoYnJkcC0+aW9hZGRyMSArIDB4NGMpKTsKKwkJYnJkcC0+aW9zaXplMSA9IDB4ODA7CisJCWJyZHAtPmlvc2l6ZTIgPSAweDgwOworCQluYW1lID0gInNlcmlhbChFQzgvNjQtUENJKSI7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJTVEFMTElPTjogdW5rbm93biBib2FyZCB0eXBlPSVkXG4iLCBicmRwLT5icmR0eXBlKTsKKwkJcmV0dXJuKC1FSU5WQUwpOworCQlicmVhazsKKwl9CisKKy8qCisgKglDaGVjayBib2FyZHMgZm9yIHBvc3NpYmxlIElPIGFkZHJlc3MgY29uZmxpY3RzIGFuZCByZXR1cm4gZmFpbCBzdGF0dXMgCisgKiAJaWYgYW4gSU8gY29uZmxpY3QgZm91bmQuCisgKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGJyZHAtPmlvYWRkcjEsIGJyZHAtPmlvc2l6ZTEsIG5hbWUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNUQUxMSU9OOiBXYXJuaW5nLCBib2FyZCAlZCBJL08gYWRkcmVzcyAiCisJCQkiJXggY29uZmxpY3RzIHdpdGggYW5vdGhlciBkZXZpY2VcbiIsIGJyZHAtPmJyZG5yLCAKKwkJCWJyZHAtPmlvYWRkcjEpOworCQlyZXR1cm4oLUVCVVNZKTsKKwl9CisJCisJaWYgKGJyZHAtPmlvc2l6ZTIgPiAwKQorCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGJyZHAtPmlvYWRkcjIsIGJyZHAtPmlvc2l6ZTIsIG5hbWUpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTVEFMTElPTjogV2FybmluZywgYm9hcmQgJWQgSS9PICIKKwkJCQkiYWRkcmVzcyAleCBjb25mbGljdHMgd2l0aCBhbm90aGVyIGRldmljZVxuIiwKKwkJCQlicmRwLT5icmRuciwgYnJkcC0+aW9hZGRyMik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTVEFMTElPTjogV2FybmluZywgYWxzbyAiCisJCQkJInJlbGVhc2luZyBib2FyZCAlZCBJL08gYWRkcmVzcyAleCBcbiIsIAorCQkJCWJyZHAtPmJyZG5yLCBicmRwLT5pb2FkZHIxKTsKKwkJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYWRkcjEsIGJyZHAtPmlvc2l6ZTEpOworCQkJcmV0dXJuKC1FQlVTWSk7CisJCX0KKworLyoKKyAqCVNjYW4gdGhyb3VnaCB0aGUgc2Vjb25kYXJ5IGlvIGFkZHJlc3Mgc3BhY2UgbG9va2luZyBmb3IgcGFuZWxzLgorICoJQXMgd2UgZmluZCdlbSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBwYW5lbCBzdHJ1Y3R1cmVzIGZvciBlYWNoLgorICovCisJYnJkcC0+Y2xrID0gQ0QxNDAwX0NMSzsKKwlicmRwLT5od2lkID0gc3RhdHVzOworCisJaW9hZGRyID0gYnJkcC0+aW9hZGRyMjsKKwliYW5rbnIgPSAwOworCXBhbmVsbnIgPSAwOworCW54dGlkID0gMDsKKworCWZvciAoaSA9IDA7IChpIDwgU1RMX01BWFBBTkVMUyk7IGkrKykgeworCQlpZiAoYnJkcC0+YnJkdHlwZSA9PSBCUkRfRUNIUENJKSB7CisJCQlvdXRiKG54dGlkLCBicmRwLT5pb2N0cmwpOworCQkJaW9hZGRyID0gYnJkcC0+aW9hZGRyMjsKKwkJfQorCQlzdGF0dXMgPSBpbmIoaW9hZGRyICsgRUNIX1BOTFNUQVRVUyk7CisJCWlmICgoc3RhdHVzICYgRUNIX1BOTElETUFTSykgIT0gbnh0aWQpCisJCQlicmVhazsKKwkJcGFuZWxwID0gKHN0bHBhbmVsX3QgKikgc3RsX21lbWFsbG9jKHNpemVvZihzdGxwYW5lbF90KSk7CisJCWlmIChwYW5lbHAgPT0gKHN0bHBhbmVsX3QgKikgTlVMTCkgeworCQkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAiCisJCQkJIihzaXplPSVkKVxuIiwgc2l6ZW9mKHN0bHBhbmVsX3QpKTsKKwkJCWJyZWFrOworCQl9CisJCW1lbXNldChwYW5lbHAsIDAsIHNpemVvZihzdGxwYW5lbF90KSk7CisJCXBhbmVscC0+bWFnaWMgPSBTVExfUEFORUxNQUdJQzsKKwkJcGFuZWxwLT5icmRuciA9IGJyZHAtPmJyZG5yOworCQlwYW5lbHAtPnBhbmVsbnIgPSBwYW5lbG5yOworCQlwYW5lbHAtPmlvYmFzZSA9IGlvYWRkcjsKKwkJcGFuZWxwLT5wYWdlbnIgPSBueHRpZDsKKwkJcGFuZWxwLT5od2lkID0gc3RhdHVzOworCQlicmRwLT5ibmsycGFuZWxbYmFua25yXSA9IHBhbmVscDsKKwkJYnJkcC0+Ym5rcGFnZWFkZHJbYmFua25yXSA9IG54dGlkOworCQlicmRwLT5ibmtzdGF0YWRkcltiYW5rbnIrK10gPSBpb2FkZHIgKyBFQ0hfUE5MU1RBVFVTOworCisJCWlmIChzdGF0dXMgJiBFQ0hfUE5MWFBJRCkgeworCQkJcGFuZWxwLT51YXJ0cCA9ICh2b2lkICopICZzdGxfc2MyNjE5OHVhcnQ7CisJCQlwYW5lbHAtPmlzciA9IHN0bF9zYzI2MTk4aW50cjsKKwkJCWlmIChzdGF0dXMgJiBFQ0hfUE5MMTZQT1JUKSB7CisJCQkJcGFuZWxwLT5ucnBvcnRzID0gMTY7CisJCQkJYnJkcC0+Ym5rMnBhbmVsW2Jhbmtucl0gPSBwYW5lbHA7CisJCQkJYnJkcC0+Ym5rcGFnZWFkZHJbYmFua25yXSA9IG54dGlkOworCQkJCWJyZHAtPmJua3N0YXRhZGRyW2JhbmtucisrXSA9IGlvYWRkciArIDQgKworCQkJCQlFQ0hfUE5MU1RBVFVTOworCQkJfSBlbHNlIHsKKwkJCQlwYW5lbHAtPm5ycG9ydHMgPSA4OworCQkJfQorCQl9IGVsc2UgeworCQkJcGFuZWxwLT51YXJ0cCA9ICh2b2lkICopICZzdGxfY2QxNDAwdWFydDsKKwkJCXBhbmVscC0+aXNyID0gc3RsX2NkMTQwMGVjaGludHI7CisJCQlpZiAoc3RhdHVzICYgRUNIX1BOTDE2UE9SVCkgeworCQkJCXBhbmVscC0+bnJwb3J0cyA9IDE2OworCQkJCXBhbmVscC0+YWNrbWFzayA9IDB4ODA7CisJCQkJaWYgKGJyZHAtPmJyZHR5cGUgIT0gQlJEX0VDSFBDSSkKKwkJCQkJaW9hZGRyICs9IEVSRUdfQkFOS1NJWkU7CisJCQkJYnJkcC0+Ym5rMnBhbmVsW2Jhbmtucl0gPSBwYW5lbHA7CisJCQkJYnJkcC0+Ym5rcGFnZWFkZHJbYmFua25yXSA9ICsrbnh0aWQ7CisJCQkJYnJkcC0+Ym5rc3RhdGFkZHJbYmFua25yKytdID0gaW9hZGRyICsKKwkJCQkJRUNIX1BOTFNUQVRVUzsKKwkJCX0gZWxzZSB7CisJCQkJcGFuZWxwLT5ucnBvcnRzID0gODsKKwkJCQlwYW5lbHAtPmFja21hc2sgPSAweGMwOworCQkJfQorCQl9CisKKwkJbnh0aWQrKzsKKwkJaW9hZGRyICs9IEVSRUdfQkFOS1NJWkU7CisJCWJyZHAtPm5ycG9ydHMgKz0gcGFuZWxwLT5ucnBvcnRzOworCQlicmRwLT5wYW5lbHNbcGFuZWxucisrXSA9IHBhbmVscDsKKwkJaWYgKChicmRwLT5icmR0eXBlICE9IEJSRF9FQ0hQQ0kpICYmCisJCSAgICAoaW9hZGRyID49IChicmRwLT5pb2FkZHIyICsgYnJkcC0+aW9zaXplMikpKQorCQkJYnJlYWs7CisJfQorCisJYnJkcC0+bnJwYW5lbHMgPSBwYW5lbG5yOworCWJyZHAtPm5yYm5rcyA9IGJhbmtucjsKKwlpZiAoYnJkcC0+YnJkdHlwZSA9PSBCUkRfRUNIKQorCQlvdXRiKChicmRwLT5pb2N0cmx2YWwgfCBFQ0hfQlJERElTQUJMRSksIGJyZHAtPmlvY3RybCk7CisKKwlicmRwLT5zdGF0ZSB8PSBCUkRfRk9VTkQ7CisJaWYgKHJlcXVlc3RfaXJxKGJyZHAtPmlycSwgc3RsX2ludHIsIFNBX1NISVJRLCBuYW1lLCBicmRwKSAhPSAwKSB7CisJCXByaW50aygiU1RBTExJT046IGZhaWxlZCB0byByZWdpc3RlciBpbnRlcnJ1cHQgIgorCQkgICAgInJvdXRpbmUgZm9yICVzIGlycT0lZFxuIiwgbmFtZSwgYnJkcC0+aXJxKTsKKwkJaSA9IC1FTk9ERVY7CisJfSBlbHNlIHsKKwkJaSA9IDA7CisJfQorCisJcmV0dXJuKGkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIHNwZWNpZmllZCBib2FyZC4KKyAqCVNjYW4gdGhyb3VnaCBhbGwgdGhlIGJvYXJkcyBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgc2VlIHdoYXQgd2UKKyAqCWNhbiBmaW5kLiBIYW5kbGUgRUlPIGFuZCB0aGUgRUNIIGJvYXJkcyBhIGxpdHRsZSBkaWZmZXJlbnRseSBoZXJlCisgKglzaW5jZSB0aGUgaW5pdGlhbCBzZWFyY2ggYW5kIHNldHVwIGlzIHZlcnkgZGlmZmVyZW50LgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHN0bF9icmRpbml0KHN0bGJyZF90ICpicmRwKQoreworCWludAlpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9icmRpbml0KGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJc3dpdGNoIChicmRwLT5icmR0eXBlKSB7CisJY2FzZSBCUkRfRUFTWUlPOgorCWNhc2UgQlJEX0VBU1lJT1BDSToKKwkJc3RsX2luaXRlaW8oYnJkcCk7CisJCWJyZWFrOworCWNhc2UgQlJEX0VDSDoKKwljYXNlIEJSRF9FQ0hNQzoKKwljYXNlIEJSRF9FQ0hQQ0k6CisJY2FzZSBCUkRfRUNINjRQQ0k6CisJCXN0bF9pbml0ZWNoKGJyZHApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIlNUQUxMSU9OOiBib2FyZD0lZCBpcyB1bmtub3duIGJvYXJkIHR5cGU9JWRcbiIsCisJCQlicmRwLT5icmRuciwgYnJkcC0+YnJkdHlwZSk7CisJCXJldHVybihFTk9ERVYpOworCX0KKworCXN0bF9icmRzW2JyZHAtPmJyZG5yXSA9IGJyZHA7CisJaWYgKChicmRwLT5zdGF0ZSAmIEJSRF9GT1VORCkgPT0gMCkgeworCQlwcmludGsoIlNUQUxMSU9OOiAlcyBib2FyZCBub3QgZm91bmQsIGJvYXJkPSVkIGlvPSV4IGlycT0lZFxuIiwKKwkJCXN0bF9icmRuYW1lc1ticmRwLT5icmR0eXBlXSwgYnJkcC0+YnJkbnIsCisJCQlicmRwLT5pb2FkZHIxLCBicmRwLT5pcnEpOworCQlyZXR1cm4oRU5PREVWKTsKKwl9CisKKwlmb3IgKGkgPSAwOyAoaSA8IFNUTF9NQVhQQU5FTFMpOyBpKyspCisJCWlmIChicmRwLT5wYW5lbHNbaV0gIT0gKHN0bHBhbmVsX3QgKikgTlVMTCkKKwkJCXN0bF9pbml0cG9ydHMoYnJkcCwgYnJkcC0+cGFuZWxzW2ldKTsKKworCXByaW50aygiU1RBTExJT046ICVzIGZvdW5kLCBib2FyZD0lZCBpbz0leCBpcnE9JWQgIgorCQkibnJwYW5lbHM9JWQgbnJwb3J0cz0lZFxuIiwgc3RsX2JyZG5hbWVzW2JyZHAtPmJyZHR5cGVdLAorCQlicmRwLT5icmRuciwgYnJkcC0+aW9hZGRyMSwgYnJkcC0+aXJxLCBicmRwLT5ucnBhbmVscywKKwkJYnJkcC0+bnJwb3J0cyk7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglGaW5kIHRoZSBuZXh0IGF2YWlsYWJsZSBib2FyZCBudW1iZXIgdGhhdCBpcyBmcmVlLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHN0bF9nZXRicmRucih2b2lkKQoreworCWludAlpOworCisJZm9yIChpID0gMDsgKGkgPCBTVExfTUFYQlJEUyk7IGkrKykgeworCQlpZiAoc3RsX2JyZHNbaV0gPT0gKHN0bGJyZF90ICopIE5VTEwpIHsKKwkJCWlmIChpID49IHN0bF9ucmJyZHMpCisJCQkJc3RsX25yYnJkcyA9IGkgKyAxOworCQkJcmV0dXJuKGkpOworCQl9CisJfQorCXJldHVybigtMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmCUNPTkZJR19QQ0kKKworLyoKKyAqCVdlIGhhdmUgYSBTdGFsbGlvbiBib2FyZC4gQWxsb2NhdGUgYSBib2FyZCBzdHJ1Y3R1cmUgYW5kCisgKglpbml0aWFsaXplIGl0LiBSZWFkIGl0cyBJTyBhbmQgSVJRIHJlc291cmNlcyBmcm9tIFBDSQorICoJY29uZmlndXJhdGlvbiBzcGFjZS4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBzdGxfaW5pdHBjaWJyZChpbnQgYnJkdHlwZSwgc3RydWN0IHBjaV9kZXYgKmRldnApCit7CisJc3RsYnJkX3QJKmJyZHA7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2luaXRwY2licmQoYnJkdHlwZT0lZCxidXNucj0leCxkZXZucj0leClcbiIsIGJyZHR5cGUsCisJCWRldnAtPmJ1cy0+bnVtYmVyLCBkZXZwLT5kZXZmbik7CisjZW5kaWYKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXZwKSkKKwkJcmV0dXJuKC1FSU8pOworCWlmICgoYnJkcCA9IHN0bF9hbGxvY2JyZCgpKSA9PSAoc3RsYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9NRU0pOworCWlmICgoYnJkcC0+YnJkbnIgPSBzdGxfZ2V0YnJkbnIoKSkgPCAwKSB7CisJCXByaW50aygiU1RBTExJT046IHRvbyBtYW55IGJvYXJkcyBmb3VuZCwgIgorCQkJIm1heGltdW0gc3VwcG9ydGVkICVkXG4iLCBTVExfTUFYQlJEUyk7CisJCXJldHVybigwKTsKKwl9CisJYnJkcC0+YnJkdHlwZSA9IGJyZHR5cGU7CisKKy8qCisgKglEaWZmZXJlbnQgU3RhbGxpb24gYm9hcmRzIHVzZSB0aGUgQkFSIHJlZ2lzdGVycyBpbiBkaWZmZXJlbnQgd2F5cywKKyAqCXNvIHNldCB1cCBpbyBhZGRyZXNzZXMgYmFzZWQgb24gYm9hcmQgdHlwZS4KKyAqLworI2lmZGVmIERFQlVHCisJcHJpbnRrKCIlcyglZCk6IEJBUltdPSV4LCV4LCV4LCV4IElSUT0leFxuIiwgX19GSUxFX18sIF9fTElORV9fLAorCQlwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMCksIHBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAxKSwKKwkJcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDIpLCBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMyksIGRldnAtPmlycSk7CisjZW5kaWYKKworLyoKKyAqCVdlIGhhdmUgYWxsIHJlc291cmNlcyBmcm9tIHRoZSBib2FyZCwgc28gbGV0J3Mgc2V0dXAgdGhlIGFjdHVhbAorICoJYm9hcmQgc3RydWN0dXJlIG5vdy4KKyAqLworCXN3aXRjaCAoYnJkdHlwZSkgeworCWNhc2UgQlJEX0VDSFBDSToKKwkJYnJkcC0+aW9hZGRyMiA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAwKTsKKwkJYnJkcC0+aW9hZGRyMSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBCUkRfRUNINjRQQ0k6CisJCWJyZHAtPmlvYWRkcjIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMik7CisJCWJyZHAtPmlvYWRkcjEgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMSk7CisJCWJyZWFrOworCWNhc2UgQlJEX0VBU1lJT1BDSToKKwkJYnJkcC0+aW9hZGRyMSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAyKTsKKwkJYnJkcC0+aW9hZGRyMiA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJTVEFMTElPTjogdW5rbm93biBQQ0kgYm9hcmQgdHlwZT0lZFxuIiwgYnJkdHlwZSk7CisJCWJyZWFrOworCX0KKworCWJyZHAtPmlycSA9IGRldnAtPmlycTsKKwlzdGxfYnJkaW5pdChicmRwKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRmluZCBhbGwgU3RhbGxpb24gUENJIGJvYXJkcyB0aGF0IG1pZ2h0IGJlIGluc3RhbGxlZC4gSW5pdGlhbGl6ZSBlYWNoCisgKglvbmUgYXMgaXQgaXMgZm91bmQuCisgKi8KKworCitzdGF0aWMgaW5saW5lIGludCBzdGxfZmluZHBjaWJyZHModm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldgkqZGV2ID0gTlVMTDsKKwlpbnQJCWksIHJjOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9maW5kcGNpYnJkcygpXG4iKTsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgKGkgPCBzdGxfbnJwY2licmRzKTsgaSsrKQorCQl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2RldmljZShzdGxfcGNpYnJkc1tpXS52ZW5kaWQsCisJCSAgICBzdGxfcGNpYnJkc1tpXS5kZXZpZCwgZGV2KSkpIHsKKworLyoKKyAqCQkJRm91bmQgYSBkZXZpY2Ugb24gdGhlIFBDSSBidXMgdGhhdCBoYXMgb3VyIHZlbmRvciBhbmQKKyAqCQkJZGV2aWNlIElELiBOZWVkIHRvIGNoZWNrIG5vdyB0aGF0IGl0IGlzIHJlYWxseSB1cy4KKyAqLworCQkJaWYgKChkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19TVE9SQUdFX0lERSkKKwkJCQljb250aW51ZTsKKworCQkJcmMgPSBzdGxfaW5pdHBjaWJyZChzdGxfcGNpYnJkc1tpXS5icmR0eXBlLCBkZXYpOworCQkJaWYgKHJjKQorCQkJCXJldHVybihyYyk7CisJCX0KKworCXJldHVybigwKTsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNjYW4gdGhyb3VnaCBhbGwgdGhlIGJvYXJkcyBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgc2VlIHdoYXQgd2UKKyAqCWNhbiBmaW5kLiBIYW5kbGUgRUlPIGFuZCB0aGUgRUNIIGJvYXJkcyBhIGxpdHRsZSBkaWZmZXJlbnRseSBoZXJlCisgKglzaW5jZSB0aGUgaW5pdGlhbCBzZWFyY2ggYW5kIHNldHVwIGlzIHRvbyBkaWZmZXJlbnQuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgc3RsX2luaXRicmRzKHZvaWQpCit7CisJc3RsYnJkX3QJKmJyZHA7CisJc3RsY29uZl90CSpjb25mcDsKKwlpbnQJCWk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2luaXRicmRzKClcbiIpOworI2VuZGlmCisKKwlpZiAoc3RsX25yYnJkcyA+IFNUTF9NQVhCUkRTKSB7CisJCXByaW50aygiU1RBTExJT046IHRvbyBtYW55IGJvYXJkcyBpbiBjb25maWd1cmF0aW9uIHRhYmxlLCAiCisJCQkidHJ1bmNhdGluZyB0byAlZFxuIiwgU1RMX01BWEJSRFMpOworCQlzdGxfbnJicmRzID0gU1RMX01BWEJSRFM7CisJfQorCisvKgorICoJRmlyc3RseSBzY2FuIHRoZSBsaXN0IG9mIHN0YXRpYyBib2FyZHMgY29uZmlndXJlZC4gQWxsb2NhdGUKKyAqCXJlc291cmNlcyBhbmQgaW5pdGlhbGl6ZSB0aGUgYm9hcmRzIGFzIGZvdW5kLgorICovCisJZm9yIChpID0gMDsgKGkgPCBzdGxfbnJicmRzKTsgaSsrKSB7CisJCWNvbmZwID0gJnN0bF9icmRjb25mW2ldOworCQlzdGxfcGFyc2VicmQoY29uZnAsIHN0bF9icmRzcFtpXSk7CisJCWlmICgoYnJkcCA9IHN0bF9hbGxvY2JyZCgpKSA9PSAoc3RsYnJkX3QgKikgTlVMTCkKKwkJCXJldHVybigtRU5PTUVNKTsKKwkJYnJkcC0+YnJkbnIgPSBpOworCQlicmRwLT5icmR0eXBlID0gY29uZnAtPmJyZHR5cGU7CisJCWJyZHAtPmlvYWRkcjEgPSBjb25mcC0+aW9hZGRyMTsKKwkJYnJkcC0+aW9hZGRyMiA9IGNvbmZwLT5pb2FkZHIyOworCQlicmRwLT5pcnEgPSBjb25mcC0+aXJxOworCQlicmRwLT5pcnF0eXBlID0gY29uZnAtPmlycXR5cGU7CisJCXN0bF9icmRpbml0KGJyZHApOworCX0KKworLyoKKyAqCUZpbmQgYW55IGR5bmFtaWNhbGx5IHN1cHBvcnRlZCBib2FyZHMuIFRoYXQgaXMgdmlhIG1vZHVsZSBsb2FkCisgKglsaW5lIG9wdGlvbnMgb3IgYXV0by1kZXRlY3RlZCBvbiB0aGUgUENJIGJ1cy4KKyAqLworCXN0bF9hcmdicmRzKCk7CisjaWZkZWYgQ09ORklHX1BDSQorCXN0bF9maW5kcGNpYnJkcygpOworI2VuZGlmCisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJldHVybiB0aGUgYm9hcmQgc3RhdHMgc3RydWN0dXJlIHRvIHVzZXIgYXBwLgorICovCisKK3N0YXRpYyBpbnQgc3RsX2dldGJyZHN0YXRzKGNvbWJyZF90IF9fdXNlciAqYnApCit7CisJc3RsYnJkX3QJKmJyZHA7CisJc3RscGFuZWxfdAkqcGFuZWxwOworCWludAkJaTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsX2JyZHN0YXRzLCBicCwgc2l6ZW9mKGNvbWJyZF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChzdGxfYnJkc3RhdHMuYnJkID49IFNUTF9NQVhCUkRTKQorCQlyZXR1cm4oLUVOT0RFVik7CisJYnJkcCA9IHN0bF9icmRzW3N0bF9icmRzdGF0cy5icmRdOworCWlmIChicmRwID09IChzdGxicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisKKwltZW1zZXQoJnN0bF9icmRzdGF0cywgMCwgc2l6ZW9mKGNvbWJyZF90KSk7CisJc3RsX2JyZHN0YXRzLmJyZCA9IGJyZHAtPmJyZG5yOworCXN0bF9icmRzdGF0cy50eXBlID0gYnJkcC0+YnJkdHlwZTsKKwlzdGxfYnJkc3RhdHMuaHdpZCA9IGJyZHAtPmh3aWQ7CisJc3RsX2JyZHN0YXRzLnN0YXRlID0gYnJkcC0+c3RhdGU7CisJc3RsX2JyZHN0YXRzLmlvYWRkciA9IGJyZHAtPmlvYWRkcjE7CisJc3RsX2JyZHN0YXRzLmlvYWRkcjIgPSBicmRwLT5pb2FkZHIyOworCXN0bF9icmRzdGF0cy5pcnEgPSBicmRwLT5pcnE7CisJc3RsX2JyZHN0YXRzLm5ycGFuZWxzID0gYnJkcC0+bnJwYW5lbHM7CisJc3RsX2JyZHN0YXRzLm5ycG9ydHMgPSBicmRwLT5ucnBvcnRzOworCWZvciAoaSA9IDA7IChpIDwgYnJkcC0+bnJwYW5lbHMpOyBpKyspIHsKKwkJcGFuZWxwID0gYnJkcC0+cGFuZWxzW2ldOworCQlzdGxfYnJkc3RhdHMucGFuZWxzW2ldLnBhbmVsID0gaTsKKwkJc3RsX2JyZHN0YXRzLnBhbmVsc1tpXS5od2lkID0gcGFuZWxwLT5od2lkOworCQlzdGxfYnJkc3RhdHMucGFuZWxzW2ldLm5ycG9ydHMgPSBwYW5lbHAtPm5ycG9ydHM7CisJfQorCisJcmV0dXJuIGNvcHlfdG9fdXNlcihicCwgJnN0bF9icmRzdGF0cywgc2l6ZW9mKGNvbWJyZF90KSkgPyAtRUZBVUxUIDogMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmVzb2x2ZSB0aGUgcmVmZXJlbmNlZCBwb3J0IG51bWJlciBpbnRvIGEgcG9ydCBzdHJ1Y3QgcG9pbnRlci4KKyAqLworCitzdGF0aWMgc3RscG9ydF90ICpzdGxfZ2V0cG9ydChpbnQgYnJkbnIsIGludCBwYW5lbG5yLCBpbnQgcG9ydG5yKQoreworCXN0bGJyZF90CSpicmRwOworCXN0bHBhbmVsX3QJKnBhbmVscDsKKworCWlmICgoYnJkbnIgPCAwKSB8fCAoYnJkbnIgPj0gU1RMX01BWEJSRFMpKQorCQlyZXR1cm4oKHN0bHBvcnRfdCAqKSBOVUxMKTsKKwlicmRwID0gc3RsX2JyZHNbYnJkbnJdOworCWlmIChicmRwID09IChzdGxicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oKHN0bHBvcnRfdCAqKSBOVUxMKTsKKwlpZiAoKHBhbmVsbnIgPCAwKSB8fCAocGFuZWxuciA+PSBicmRwLT5ucnBhbmVscykpCisJCXJldHVybigoc3RscG9ydF90ICopIE5VTEwpOworCXBhbmVscCA9IGJyZHAtPnBhbmVsc1twYW5lbG5yXTsKKwlpZiAocGFuZWxwID09IChzdGxwYW5lbF90ICopIE5VTEwpCisJCXJldHVybigoc3RscG9ydF90ICopIE5VTEwpOworCWlmICgocG9ydG5yIDwgMCkgfHwgKHBvcnRuciA+PSBwYW5lbHAtPm5ycG9ydHMpKQorCQlyZXR1cm4oKHN0bHBvcnRfdCAqKSBOVUxMKTsKKwlyZXR1cm4ocGFuZWxwLT5wb3J0c1twb3J0bnJdKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmV0dXJuIHRoZSBwb3J0IHN0YXRzIHN0cnVjdHVyZSB0byB1c2VyIGFwcC4gQSBOVUxMIHBvcnQgc3RydWN0CisgKglwb2ludGVyIHBhc3NlZCBpbiBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZmluZCBvdXQgZnJvbSB0aGUgYXBwCisgKgl3aGF0IHBvcnQgdG8gZ2V0IHN0YXRzIGZvciAodXNlZCB0aHJvdWdoIGJvYXJkIGNvbnRyb2wgZGV2aWNlKS4KKyAqLworCitzdGF0aWMgaW50IHN0bF9nZXRwb3J0c3RhdHMoc3RscG9ydF90ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKQoreworCXVuc2lnbmVkIGNoYXIJKmhlYWQsICp0YWlsOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAoIXBvcnRwKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsX2NvbXN0YXRzLCBjcCwgc2l6ZW9mKGNvbXN0YXRzX3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwb3J0cCA9IHN0bF9nZXRwb3J0KHN0bF9jb21zdGF0cy5icmQsIHN0bF9jb21zdGF0cy5wYW5lbCwKKwkJCXN0bF9jb21zdGF0cy5wb3J0KTsKKwkJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJCXJldHVybigtRU5PREVWKTsKKwl9CisKKwlwb3J0cC0+c3RhdHMuc3RhdGUgPSBwb3J0cC0+aXN0YXRlOworCXBvcnRwLT5zdGF0cy5mbGFncyA9IHBvcnRwLT5mbGFnczsKKwlwb3J0cC0+c3RhdHMuaHdpZCA9IHBvcnRwLT5od2lkOworCisJcG9ydHAtPnN0YXRzLnR0eXN0YXRlID0gMDsKKwlwb3J0cC0+c3RhdHMuY2ZsYWdzID0gMDsKKwlwb3J0cC0+c3RhdHMuaWZsYWdzID0gMDsKKwlwb3J0cC0+c3RhdHMub2ZsYWdzID0gMDsKKwlwb3J0cC0+c3RhdHMubGZsYWdzID0gMDsKKwlwb3J0cC0+c3RhdHMucnhidWZmZXJlZCA9IDA7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlpZiAocG9ydHAtPnR0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkgeworCQlpZiAocG9ydHAtPnR0eS0+ZHJpdmVyX2RhdGEgPT0gcG9ydHApIHsKKwkJCXBvcnRwLT5zdGF0cy50dHlzdGF0ZSA9IHBvcnRwLT50dHktPmZsYWdzOworCQkJcG9ydHAtPnN0YXRzLnJ4YnVmZmVyZWQgPSBwb3J0cC0+dHR5LT5mbGlwLmNvdW50OworCQkJaWYgKHBvcnRwLT50dHktPnRlcm1pb3MgIT0gKHN0cnVjdCB0ZXJtaW9zICopIE5VTEwpIHsKKwkJCQlwb3J0cC0+c3RhdHMuY2ZsYWdzID0gcG9ydHAtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwkJCQlwb3J0cC0+c3RhdHMuaWZsYWdzID0gcG9ydHAtPnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKKwkJCQlwb3J0cC0+c3RhdHMub2ZsYWdzID0gcG9ydHAtPnR0eS0+dGVybWlvcy0+Y19vZmxhZzsKKwkJCQlwb3J0cC0+c3RhdHMubGZsYWdzID0gcG9ydHAtPnR0eS0+dGVybWlvcy0+Y19sZmxhZzsKKwkJCX0KKwkJfQorCX0KKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCWhlYWQgPSBwb3J0cC0+dHguaGVhZDsKKwl0YWlsID0gcG9ydHAtPnR4LnRhaWw7CisJcG9ydHAtPnN0YXRzLnR4YnVmZmVyZWQgPSAoKGhlYWQgPj0gdGFpbCkgPyAoaGVhZCAtIHRhaWwpIDoKKwkJKFNUTF9UWEJVRlNJWkUgLSAodGFpbCAtIGhlYWQpKSk7CisKKwlwb3J0cC0+c3RhdHMuc2lnbmFscyA9ICh1bnNpZ25lZCBsb25nKSBzdGxfZ2V0c2lnbmFscyhwb3J0cCk7CisKKwlyZXR1cm4gY29weV90b191c2VyKGNwLCAmcG9ydHAtPnN0YXRzLAorCQkJICAgIHNpemVvZihjb21zdGF0c190KSkgPyAtRUZBVUxUIDogMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQ2xlYXIgdGhlIHBvcnQgc3RhdHMgc3RydWN0dXJlLiBXZSBhbHNvIHJldHVybiBpdCB6ZXJvZWQgb3V0Li4uCisgKi8KKworc3RhdGljIGludCBzdGxfY2xycG9ydHN0YXRzKHN0bHBvcnRfdCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCkKK3sKKwlpZiAoIXBvcnRwKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsX2NvbXN0YXRzLCBjcCwgc2l6ZW9mKGNvbXN0YXRzX3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwb3J0cCA9IHN0bF9nZXRwb3J0KHN0bF9jb21zdGF0cy5icmQsIHN0bF9jb21zdGF0cy5wYW5lbCwKKwkJCXN0bF9jb21zdGF0cy5wb3J0KTsKKwkJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJCXJldHVybigtRU5PREVWKTsKKwl9CisKKwltZW1zZXQoJnBvcnRwLT5zdGF0cywgMCwgc2l6ZW9mKGNvbXN0YXRzX3QpKTsKKwlwb3J0cC0+c3RhdHMuYnJkID0gcG9ydHAtPmJyZG5yOworCXBvcnRwLT5zdGF0cy5wYW5lbCA9IHBvcnRwLT5wYW5lbG5yOworCXBvcnRwLT5zdGF0cy5wb3J0ID0gcG9ydHAtPnBvcnRucjsKKwlyZXR1cm4gY29weV90b191c2VyKGNwLCAmcG9ydHAtPnN0YXRzLAorCQkJICAgIHNpemVvZihjb21zdGF0c190KSkgPyAtRUZBVUxUIDogMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmV0dXJuIHRoZSBlbnRpcmUgZHJpdmVyIHBvcnRzIHN0cnVjdHVyZSB0byBhIHVzZXIgYXBwLgorICovCisKK3N0YXRpYyBpbnQgc3RsX2dldHBvcnRzdHJ1Y3Qoc3RscG9ydF90IF9fdXNlciAqYXJnKQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnN0bF9kdW1teXBvcnQsIGFyZywgc2l6ZW9mKHN0bHBvcnRfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlwb3J0cCA9IHN0bF9nZXRwb3J0KHN0bF9kdW1teXBvcnQuYnJkbnIsIHN0bF9kdW1teXBvcnQucGFuZWxuciwKKwkJIHN0bF9kdW1teXBvcnQucG9ydG5yKTsKKwlpZiAoIXBvcnRwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gY29weV90b191c2VyKGFyZywgcG9ydHAsIHNpemVvZihzdGxwb3J0X3QpKSA/IC1FRkFVTFQgOiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gdGhlIGVudGlyZSBkcml2ZXIgYm9hcmQgc3RydWN0dXJlIHRvIGEgdXNlciBhcHAuCisgKi8KKworc3RhdGljIGludCBzdGxfZ2V0YnJkc3RydWN0KHN0bGJyZF90IF9fdXNlciAqYXJnKQoreworCXN0bGJyZF90CSpicmRwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzdGxfZHVtbXlicmQsIGFyZywgc2l6ZW9mKHN0bGJyZF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICgoc3RsX2R1bW15YnJkLmJyZG5yIDwgMCkgfHwgKHN0bF9kdW1teWJyZC5icmRuciA+PSBTVExfTUFYQlJEUykpCisJCXJldHVybiAtRU5PREVWOworCWJyZHAgPSBzdGxfYnJkc1tzdGxfZHVtbXlicmQuYnJkbnJdOworCWlmICghYnJkcCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCXJldHVybiBjb3B5X3RvX3VzZXIoYXJnLCBicmRwLCBzaXplb2Yoc3RsYnJkX3QpKSA/IC1FRkFVTFQgOiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUaGUgInN0YWxpb21lbSIgZGV2aWNlIGlzIGFsc28gcmVxdWlyZWQgdG8gZG8gc29tZSBzcGVjaWFsIG9wZXJhdGlvbnMKKyAqCW9uIHRoZSBib2FyZCBhbmQvb3IgcG9ydHMuIEluIHRoaXMgZHJpdmVyIGl0IGlzIG1vc3RseSB1c2VkIGZvciBzdGF0cworICoJY29sbGVjdGlvbi4KKyAqLworCitzdGF0aWMgaW50IHN0bF9tZW1pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludAlicmRuciwgcmM7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX21lbWlvY3RsKGlwPSV4LGZwPSV4LGNtZD0leCxhcmc9JXgpXG4iLCAoaW50KSBpcCwKKwkJKGludCkgZnAsIGNtZCwgKGludCkgYXJnKTsKKyNlbmRpZgorCisJYnJkbnIgPSBpbWlub3IoaXApOworCWlmIChicmRuciA+PSBTVExfTUFYQlJEUykKKwkJcmV0dXJuKC1FTk9ERVYpOworCXJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDT01fR0VUUE9SVFNUQVRTOgorCQlyYyA9IHN0bF9nZXRwb3J0c3RhdHMoTlVMTCwgYXJncCk7CisJCWJyZWFrOworCWNhc2UgQ09NX0NMUlBPUlRTVEFUUzoKKwkJcmMgPSBzdGxfY2xycG9ydHN0YXRzKE5VTEwsIGFyZ3ApOworCQlicmVhazsKKwljYXNlIENPTV9HRVRCUkRTVEFUUzoKKwkJcmMgPSBzdGxfZ2V0YnJkc3RhdHMoYXJncCk7CisJCWJyZWFrOworCWNhc2UgQ09NX1JFQURQT1JUOgorCQlyYyA9IHN0bF9nZXRwb3J0c3RydWN0KGFyZ3ApOworCQlicmVhazsKKwljYXNlIENPTV9SRUFEQk9BUkQ6CisJCXJjID0gc3RsX2dldGJyZHN0cnVjdChhcmdwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKworCXJldHVybihyYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgc3RsX29wcyA9IHsKKwkub3BlbiA9IHN0bF9vcGVuLAorCS5jbG9zZSA9IHN0bF9jbG9zZSwKKwkud3JpdGUgPSBzdGxfd3JpdGUsCisJLnB1dF9jaGFyID0gc3RsX3B1dGNoYXIsCisJLmZsdXNoX2NoYXJzID0gc3RsX2ZsdXNoY2hhcnMsCisJLndyaXRlX3Jvb20gPSBzdGxfd3JpdGVyb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBzdGxfY2hhcnNpbmJ1ZmZlciwKKwkuaW9jdGwgPSBzdGxfaW9jdGwsCisJLnNldF90ZXJtaW9zID0gc3RsX3NldHRlcm1pb3MsCisJLnRocm90dGxlID0gc3RsX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gc3RsX3VudGhyb3R0bGUsCisJLnN0b3AgPSBzdGxfc3RvcCwKKwkuc3RhcnQgPSBzdGxfc3RhcnQsCisJLmhhbmd1cCA9IHN0bF9oYW5ndXAsCisJLmZsdXNoX2J1ZmZlciA9IHN0bF9mbHVzaGJ1ZmZlciwKKwkuYnJlYWtfY3RsID0gc3RsX2JyZWFrY3RsLAorCS53YWl0X3VudGlsX3NlbnQgPSBzdGxfd2FpdHVudGlsc2VudCwKKwkuc2VuZF94Y2hhciA9IHN0bF9zZW5keGNoYXIsCisJLnJlYWRfcHJvYyA9IHN0bF9yZWFkcHJvYywKKwkudGlvY21nZXQgPSBzdGxfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gc3RsX3Rpb2Ntc2V0LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgX19pbml0IHN0bF9pbml0KHZvaWQpCit7CisJaW50IGk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHZlcnNpb24gJXNcbiIsIHN0bF9kcnZ0aXRsZSwgc3RsX2RydnZlcnNpb24pOworCisJc3RsX2luaXRicmRzKCk7CisKKwlzdGxfc2VyaWFsID0gYWxsb2NfdHR5X2RyaXZlcihTVExfTUFYQlJEUyAqIFNUTF9NQVhQT1JUUyk7CisJaWYgKCFzdGxfc2VyaWFsKQorCQlyZXR1cm4gLTE7CisKKy8qCisgKglBbGxvY2F0ZSBhIHRlbXBvcmFyeSB3cml0ZSBidWZmZXIuCisgKi8KKwlzdGxfdG1wd3JpdGVidWYgPSAoY2hhciAqKSBzdGxfbWVtYWxsb2MoU1RMX1RYQlVGU0laRSk7CisJaWYgKHN0bF90bXB3cml0ZWJ1ZiA9PSAoY2hhciAqKSBOVUxMKQorCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IChzaXplPSVkKVxuIiwKKwkJCVNUTF9UWEJVRlNJWkUpOworCisvKgorICoJU2V0IHVwIGEgY2hhcmFjdGVyIGRyaXZlciBmb3IgcGVyIGJvYXJkIHN0dWZmLiBUaGlzIGlzIG1haW5seSB1c2VkCisgKgl0byBkbyBzdGF0cyBpb2N0bHMgb24gdGhlIHBvcnRzLgorICovCisJaWYgKHJlZ2lzdGVyX2NocmRldihTVExfU0lPTUVNTUFKT1IsICJzdGFsaW9tZW0iLCAmc3RsX2ZzaW9tZW0pKQorCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gcmVnaXN0ZXIgc2VyaWFsIGJvYXJkIGRldmljZVxuIik7CisJZGV2ZnNfbWtfZGlyKCJzdGFsaW9tZW0iKTsKKworCXN0YWxsaW9uX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgInN0YWxpb21lbSIpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJZGV2ZnNfbWtfY2RldihNS0RFVihTVExfU0lPTUVNTUFKT1IsIGkpLAorCQkJCVNfSUZDSFJ8U19JUlVTUnxTX0lXVVNSLAorCQkJCSJzdGFsaW9tZW0vJWQiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoc3RhbGxpb25fY2xhc3MsIE1LREVWKFNUTF9TSU9NRU1NQUpPUiwgaSksIE5VTEwsICJzdGFsaW9tZW0lZCIsIGkpOworCX0KKworCXN0bF9zZXJpYWwtPm93bmVyID0gVEhJU19NT0RVTEU7CisJc3RsX3NlcmlhbC0+ZHJpdmVyX25hbWUgPSBzdGxfZHJ2bmFtZTsKKwlzdGxfc2VyaWFsLT5uYW1lID0gInR0eUUiOworCXN0bF9zZXJpYWwtPmRldmZzX25hbWUgPSAidHRzL0UiOworCXN0bF9zZXJpYWwtPm1ham9yID0gU1RMX1NFUklBTE1BSk9SOworCXN0bF9zZXJpYWwtPm1pbm9yX3N0YXJ0ID0gMDsKKwlzdGxfc2VyaWFsLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlzdGxfc2VyaWFsLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCXN0bF9zZXJpYWwtPmluaXRfdGVybWlvcyA9IHN0bF9kZWZ0ZXJtaW9zOworCXN0bF9zZXJpYWwtPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoc3RsX3NlcmlhbCwgJnN0bF9vcHMpOworCisJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoc3RsX3NlcmlhbCkpIHsKKwkJcHV0X3R0eV9kcml2ZXIoc3RsX3NlcmlhbCk7CisJCXByaW50aygiU1RBTExJT046IGZhaWxlZCB0byByZWdpc3RlciBzZXJpYWwgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgIENEMTQwMCBIQVJEV0FSRSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlc2UgZnVuY3Rpb25zIGdldC9zZXQvdXBkYXRlIHRoZSByZWdpc3RlcnMgb2YgdGhlIGNkMTQwMCBVQVJUcy4KKyAqCUFjY2VzcyB0byB0aGUgY2QxNDAwIHJlZ2lzdGVycyBpcyB2aWEgYW4gYWRkcmVzcy9kYXRhIGlvIHBvcnQgcGFpci4KKyAqCShNYXliZSBzaG91bGQgbWFrZSB0aGlzIGlubGluZS4uLikKKyAqLworCitzdGF0aWMgaW50IHN0bF9jZDE0MDBnZXRyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yKQoreworCW91dGIoKHJlZ25yICsgcG9ydHAtPnVhcnRhZGRyKSwgcG9ydHAtPmlvYWRkcik7CisJcmV0dXJuKGluYihwb3J0cC0+aW9hZGRyICsgRVJFR19EQVRBKSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBzZXRyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yLCBpbnQgdmFsdWUpCit7CisJb3V0YigocmVnbnIgKyBwb3J0cC0+dWFydGFkZHIpLCBwb3J0cC0+aW9hZGRyKTsKKwlvdXRiKHZhbHVlLCBwb3J0cC0+aW9hZGRyICsgRVJFR19EQVRBKTsKK30KKworc3RhdGljIGludCBzdGxfY2QxNDAwdXBkYXRlcmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWduciwgaW50IHZhbHVlKQoreworCW91dGIoKHJlZ25yICsgcG9ydHAtPnVhcnRhZGRyKSwgcG9ydHAtPmlvYWRkcik7CisJaWYgKGluYihwb3J0cC0+aW9hZGRyICsgRVJFR19EQVRBKSAhPSB2YWx1ZSkgeworCQlvdXRiKHZhbHVlLCBwb3J0cC0+aW9hZGRyICsgRVJFR19EQVRBKTsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUluYml0aWFsaXplIHRoZSBVQVJUcyBpbiBhIHBhbmVsLiBXZSBkb24ndCBjYXJlIHdoYXQgc29ydCBvZiBib2FyZAorICoJdGhlc2UgcG9ydHMgYXJlIG9uIC0gc2luY2UgdGhlIHBvcnQgaW8gcmVnaXN0ZXJzIGFyZSBhbG1vc3QKKyAqCWlkZW50aWNhbCB3aGVuIGRlYWxpbmcgd2l0aCBwb3J0cy4KKyAqLworCitzdGF0aWMgaW50IHN0bF9jZDE0MDBwYW5lbGluaXQoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCkKK3sKKwl1bnNpZ25lZCBpbnQJZ2ZyY3I7CisJaW50CQljaGlwbWFzaywgaSwgajsKKwlpbnQJCW5yY2hpcHMsIHVhcnRhZGRyLCBpb2FkZHI7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3BhbmVsaW5pdChicmRwPSV4LHBhbmVscD0leClcbiIsIChpbnQpIGJyZHAsIChpbnQpIHBhbmVscCk7CisjZW5kaWYKKworCUJSREVOQUJMRShwYW5lbHAtPmJyZG5yLCBwYW5lbHAtPnBhZ2Vucik7CisKKy8qCisgKglDaGVjayB0aGF0IGVhY2ggY2hpcCBpcyBwcmVzZW50IGFuZCBzdGFydGVkIHVwIE9LLgorICovCisJY2hpcG1hc2sgPSAwOworCW5yY2hpcHMgPSBwYW5lbHAtPm5ycG9ydHMgLyBDRDE0MDBfUE9SVFM7CisJZm9yIChpID0gMDsgKGkgPCBucmNoaXBzKTsgaSsrKSB7CisJCWlmIChicmRwLT5icmR0eXBlID09IEJSRF9FQ0hQQ0kpIHsKKwkJCW91dGIoKHBhbmVscC0+cGFnZW5yICsgKGkgPj4gMSkpLCBicmRwLT5pb2N0cmwpOworCQkJaW9hZGRyID0gcGFuZWxwLT5pb2Jhc2U7CisJCX0gZWxzZSB7CisJCQlpb2FkZHIgPSBwYW5lbHAtPmlvYmFzZSArIChFUkVHX0JBTktTSVpFICogKGkgPj4gMSkpOworCQl9CisJCXVhcnRhZGRyID0gKGkgJiAweDAxKSA/IDB4MDgwIDogMDsKKwkJb3V0YigoR0ZSQ1IgKyB1YXJ0YWRkciksIGlvYWRkcik7CisJCW91dGIoMCwgKGlvYWRkciArIEVSRUdfREFUQSkpOworCQlvdXRiKChDQ1IgKyB1YXJ0YWRkciksIGlvYWRkcik7CisJCW91dGIoQ0NSX1JFU0VURlVMTCwgKGlvYWRkciArIEVSRUdfREFUQSkpOworCQlvdXRiKENDUl9SRVNFVEZVTEwsIChpb2FkZHIgKyBFUkVHX0RBVEEpKTsKKwkJb3V0YigoR0ZSQ1IgKyB1YXJ0YWRkciksIGlvYWRkcik7CisJCWZvciAoaiA9IDA7IChqIDwgQ0NSX01BWFdBSVQpOyBqKyspIHsKKwkJCWlmICgoZ2ZyY3IgPSBpbmIoaW9hZGRyICsgRVJFR19EQVRBKSkgIT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoKGogPj0gQ0NSX01BWFdBSVQpIHx8IChnZnJjciA8IDB4NDApIHx8IChnZnJjciA+IDB4NjApKSB7CisJCQlwcmludGsoIlNUQUxMSU9OOiBjZDE0MDAgbm90IHJlc3BvbmRpbmcsICIKKwkJCQkiYnJkPSVkIHBhbmVsPSVkIGNoaXA9JWRcbiIsCisJCQkJcGFuZWxwLT5icmRuciwgcGFuZWxwLT5wYW5lbG5yLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNoaXBtYXNrIHw9ICgweDEgPDwgaSk7CisJCW91dGIoKFBQUiArIHVhcnRhZGRyKSwgaW9hZGRyKTsKKwkJb3V0YihQUFJfU0NBTEFSLCAoaW9hZGRyICsgRVJFR19EQVRBKSk7CisJfQorCisJQlJERElTQUJMRShwYW5lbHAtPmJyZG5yKTsKKwlyZXR1cm4oY2hpcG1hc2spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJbml0aWFsaXplIGhhcmR3YXJlIHNwZWNpZmljIHBvcnQgcmVnaXN0ZXJzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBwb3J0aW5pdChzdGxicmRfdCAqYnJkcCwgc3RscGFuZWxfdCAqcGFuZWxwLCBzdGxwb3J0X3QgKnBvcnRwKQoreworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfY2QxNDAwcG9ydGluaXQoYnJkcD0leCxwYW5lbHA9JXgscG9ydHA9JXgpXG4iLAorCQkoaW50KSBicmRwLCAoaW50KSBwYW5lbHAsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCisJaWYgKChicmRwID09IChzdGxicmRfdCAqKSBOVUxMKSB8fCAocGFuZWxwID09IChzdGxwYW5lbF90ICopIE5VTEwpIHx8CisJICAgIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpKQorCQlyZXR1cm47CisKKwlwb3J0cC0+aW9hZGRyID0gcGFuZWxwLT5pb2Jhc2UgKyAoKChicmRwLT5icmR0eXBlID09IEJSRF9FQ0hQQ0kpIHx8CisJCShwb3J0cC0+cG9ydG5yIDwgOCkpID8gMCA6IEVSRUdfQkFOS1NJWkUpOworCXBvcnRwLT51YXJ0YWRkciA9IChwb3J0cC0+cG9ydG5yICYgMHgwNCkgPDwgNTsKKwlwb3J0cC0+cGFnZW5yID0gcGFuZWxwLT5wYWdlbnIgKyAocG9ydHAtPnBvcnRuciA+PiAzKTsKKworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIENBUiwgKHBvcnRwLT5wb3J0bnIgJiAweDAzKSk7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgTElWUiwgKHBvcnRwLT5wb3J0bnIgPDwgMykpOworCXBvcnRwLT5od2lkID0gc3RsX2NkMTQwMGdldHJlZyhwb3J0cCwgR0ZSQ1IpOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJV2FpdCBmb3IgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdG8gYmUgcmVhZHkuIFdlIHdpbGwgcG9sbCB0aGlzLAorICoJc2luY2UgaXQgd29uJ3QgdXN1YWxseSB0YWtlIHRvbyBsb25nIHRvIGJlIHJlYWR5LgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBjY3J3YWl0KHN0bHBvcnRfdCAqcG9ydHApCit7CisJaW50CWk7CisKKwlmb3IgKGkgPSAwOyAoaSA8IENDUl9NQVhXQUlUKTsgaSsrKSB7CisJCWlmIChzdGxfY2QxNDAwZ2V0cmVnKHBvcnRwLCBDQ1IpID09IDApIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXByaW50aygiU1RBTExJT046IGNkMTQwMCBub3QgcmVzcG9uZGluZywgcG9ydD0lZCBwYW5lbD0lZCBicmQ9JWRcbiIsCisJCXBvcnRwLT5wb3J0bnIsIHBvcnRwLT5wYW5lbG5yLCBwb3J0cC0+YnJkbnIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTZXQgdXAgdGhlIGNkMTQwMCByZWdpc3RlcnMgZm9yIGEgcG9ydCBiYXNlZCBvbiB0aGUgdGVybWlvcyBwb3J0CisgKglzZXR0aW5ncy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwc2V0cG9ydChzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3QgdGVybWlvcyAqdGlvc3ApCit7CisJc3RsYnJkX3QJKmJyZHA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1bnNpZ25lZCBpbnQJY2xrZGl2LCBiYXVkcmF0ZTsKKwl1bnNpZ25lZCBjaGFyCWNvcjEsIGNvcjIsIGNvcjM7CisJdW5zaWduZWQgY2hhcgljb3I0LCBjb3I1LCBjY3I7CisJdW5zaWduZWQgY2hhcglzcmVyLCBzcmVyb24sIHNyZXJvZmY7CisJdW5zaWduZWQgY2hhcgltY29yMSwgbWNvcjIsIHJ0cHI7CisJdW5zaWduZWQgY2hhcgljbGssIGRpdjsKKworCWNvcjEgPSAwOworCWNvcjIgPSAwOworCWNvcjMgPSAwOworCWNvcjQgPSAwOworCWNvcjUgPSAwOworCWNjciA9IDA7CisJcnRwciA9IDA7CisJY2xrID0gMDsKKwlkaXYgPSAwOworCW1jb3IxID0gMDsKKwltY29yMiA9IDA7CisJc3Jlcm9uID0gMDsKKwlzcmVyb2ZmID0gMDsKKworCWJyZHAgPSBzdGxfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxicmRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKy8qCisgKglTZXQgdXAgdGhlIFJYIGNoYXIgaWdub3JlIG1hc2sgd2l0aCB0aG9zZSBSWCBlcnJvciB0eXBlcyB3ZQorICoJY2FuIGlnbm9yZS4gV2UgY2FuIGdldCB0aGUgY2QxNDAwIHRvIGhlbHAgdXMgb3V0IGEgbGl0dGxlIGhlcmUsCisgKglpdCB3aWxsIGlnbm9yZSBwYXJpdHkgZXJyb3JzIGFuZCBicmVha3MgZm9yIHVzLgorICovCisJcG9ydHAtPnJ4aWdub3JlbXNrID0gMDsKKwlpZiAodGlvc3AtPmNfaWZsYWcgJiBJR05QQVIpIHsKKwkJcG9ydHAtPnJ4aWdub3JlbXNrIHw9IChTVF9QQVJJVFkgfCBTVF9GUkFNSU5HIHwgU1RfT1ZFUlJVTik7CisJCWNvcjEgfD0gQ09SMV9QQVJJR05PUkU7CisJfQorCWlmICh0aW9zcC0+Y19pZmxhZyAmIElHTkJSSykgeworCQlwb3J0cC0+cnhpZ25vcmVtc2sgfD0gU1RfQlJFQUs7CisJCWNvcjQgfD0gQ09SNF9JR05CUks7CisJfQorCisJcG9ydHAtPnJ4bWFya21zayA9IFNUX09WRVJSVU47CisJaWYgKHRpb3NwLT5jX2lmbGFnICYgKElOUENLIHwgUEFSTVJLKSkKKwkJcG9ydHAtPnJ4bWFya21zayB8PSAoU1RfUEFSSVRZIHwgU1RfRlJBTUlORyk7CisJaWYgKHRpb3NwLT5jX2lmbGFnICYgQlJLSU5UKQorCQlwb3J0cC0+cnhtYXJrbXNrIHw9IFNUX0JSRUFLOworCisvKgorICoJR28gdGhyb3VnaCB0aGUgY2hhciBzaXplLCBwYXJpdHkgYW5kIHN0b3AgYml0cyBhbmQgc2V0IGFsbCB0aGUKKyAqCW9wdGlvbiByZWdpc3RlciBhcHByb3ByaWF0ZWx5LgorICovCisJc3dpdGNoICh0aW9zcC0+Y19jZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJCWNvcjEgfD0gQ09SMV9DSEw1OworCQlicmVhazsKKwljYXNlIENTNjoKKwkJY29yMSB8PSBDT1IxX0NITDY7CisJCWJyZWFrOworCWNhc2UgQ1M3OgorCQljb3IxIHw9IENPUjFfQ0hMNzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY29yMSB8PSBDT1IxX0NITDg7CisJCWJyZWFrOworCX0KKworCWlmICh0aW9zcC0+Y19jZmxhZyAmIENTVE9QQikKKwkJY29yMSB8PSBDT1IxX1NUT1AyOworCWVsc2UKKwkJY29yMSB8PSBDT1IxX1NUT1AxOworCisJaWYgKHRpb3NwLT5jX2NmbGFnICYgUEFSRU5CKSB7CisJCWlmICh0aW9zcC0+Y19jZmxhZyAmIFBBUk9ERCkKKwkJCWNvcjEgfD0gKENPUjFfUEFSRU5CIHwgQ09SMV9QQVJPREQpOworCQllbHNlCisJCQljb3IxIHw9IChDT1IxX1BBUkVOQiB8IENPUjFfUEFSRVZFTik7CisJfSBlbHNlIHsKKwkJY29yMSB8PSBDT1IxX1BBUk5PTkU7CisJfQorCisvKgorICoJU2V0IHRoZSBSWCBGSUZPIHRocmVzaG9sZCBhdCA2IGNoYXJzLiBUaGlzIGdpdmVzIGEgYml0IG9mIGJyZWF0aGluZworICoJc3BhY2UgZm9yIGhhcmR3YXJlIGZsb3cgY29udHJvbCBhbmQgdGhlIGxpa2UuIFRoaXMgc2hvdWxkIGJlIHNldCB0bworICoJVk1JTi4gQWxzbyBoZXJlIHdlIHdpbGwgc2V0IHRoZSBSWCBkYXRhIHRpbWVvdXQgdG8gMTBtcyAtIHRoaXMgc2hvdWxkCisgKglyZWFsbHkgYmUgYmFzZWQgb24gVlRJTUUuCisgKi8KKwljb3IzIHw9IEZJRk9fUlhUSFJFU0hPTEQ7CisJcnRwciA9IDI7CisKKy8qCisgKglDYWxjdWxhdGUgdGhlIGJhdWQgcmF0ZSB0aW1lcnMuIEZvciBub3cgd2Ugd2lsbCBqdXN0IGFzc3VtZSB0aGF0CisgKgl0aGUgaW5wdXQgYW5kIG91dHB1dCBiYXVkIGFyZSB0aGUgc2FtZS4gQ291bGQgaGF2ZSB1c2VkIGEgYmF1ZAorICoJdGFibGUgaGVyZSwgYnV0IHRoaXMgd2F5IHdlIGNhbiBnZW5lcmF0ZSB2aXJ0dWFsbHkgYW55IGJhdWQgcmF0ZQorICoJd2UgbGlrZSEKKyAqLworCWJhdWRyYXRlID0gdGlvc3AtPmNfY2ZsYWcgJiBDQkFVRDsKKwlpZiAoYmF1ZHJhdGUgJiBDQkFVREVYKSB7CisJCWJhdWRyYXRlICY9IH5DQkFVREVYOworCQlpZiAoKGJhdWRyYXRlIDwgMSkgfHwgKGJhdWRyYXRlID4gNCkpCisJCQl0aW9zcC0+Y19jZmxhZyAmPSB+Q0JBVURFWDsKKwkJZWxzZQorCQkJYmF1ZHJhdGUgKz0gMTU7CisJfQorCWJhdWRyYXRlID0gc3RsX2JhdWRyYXRlc1tiYXVkcmF0ZV07CisJaWYgKCh0aW9zcC0+Y19jZmxhZyAmIENCQVVEKSA9PSBCMzg0MDApIHsKKwkJaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQorCQkJYmF1ZHJhdGUgPSA1NzYwMDsKKwkJZWxzZSBpZiAoKHBvcnRwLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJYmF1ZHJhdGUgPSAxMTUyMDA7CisJCWVsc2UgaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKKwkJCWJhdWRyYXRlID0gMjMwNDAwOworCQllbHNlIGlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQorCQkJYmF1ZHJhdGUgPSA0NjA4MDA7CisJCWVsc2UgaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QpCisJCQliYXVkcmF0ZSA9IChwb3J0cC0+YmF1ZF9iYXNlIC8gcG9ydHAtPmN1c3RvbV9kaXZpc29yKTsKKwl9CisJaWYgKGJhdWRyYXRlID4gU1RMX0NEMTQwME1BWEJBVUQpCisJCWJhdWRyYXRlID0gU1RMX0NEMTQwME1BWEJBVUQ7CisKKwlpZiAoYmF1ZHJhdGUgPiAwKSB7CisJCWZvciAoY2xrID0gMDsgKGNsayA8IENEMTQwMF9OVU1DTEtTKTsgY2xrKyspIHsKKwkJCWNsa2RpdiA9ICgocG9ydHAtPmNsayAvIHN0bF9jZDE0MDBjbGtkaXZzW2Nsa10pIC8gYmF1ZHJhdGUpOworCQkJaWYgKGNsa2RpdiA8IDB4MTAwKQorCQkJCWJyZWFrOworCQl9CisJCWRpdiA9ICh1bnNpZ25lZCBjaGFyKSBjbGtkaXY7CisJfQorCisvKgorICoJQ2hlY2sgd2hhdCBmb3JtIG9mIG1vZGVtIHNpZ25hbGluZyBpcyByZXF1aXJlZCBhbmQgc2V0IGl0IHVwLgorICovCisJaWYgKCh0aW9zcC0+Y19jZmxhZyAmIENMT0NBTCkgPT0gMCkgeworCQltY29yMSB8PSBNQ09SMV9EQ0Q7CisJCW1jb3IyIHw9IE1DT1IyX0RDRDsKKwkJc3Jlcm9uIHw9IFNSRVJfTU9ERU07CisJCXBvcnRwLT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKwl9IGVsc2UgeworCQlwb3J0cC0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworCX0KKworLyoKKyAqCVNldHVwIGNkMTQwMCBlbmhhbmNlZCBtb2RlcyBpZiB3ZSBjYW4uIEluIHBhcnRpY3VsYXIgd2Ugd2FudCB0bworICoJaGFuZGxlIGFzIG11Y2ggb2YgdGhlIGZsb3cgY29udHJvbCBhcyBwb3NzaWJsZSBhdXRvbWF0aWNhbGx5LiBBcworICoJd2VsbCBhcyBzYXZpbmcgYSBmZXcgQ1BVIGN5Y2xlcyBpdCB3aWxsIGFsc28gZ3JlYXRseSBpbXByb3ZlIGZsb3cKKyAqCWNvbnRyb2wgcmVsaWFiaWxpdHkuCisgKi8KKwlpZiAodGlvc3AtPmNfaWZsYWcgJiBJWE9OKSB7CisJCWNvcjIgfD0gQ09SMl9UWElCRTsKKwkJY29yMyB8PSBDT1IzX1NDRDEyOworCQlpZiAodGlvc3AtPmNfaWZsYWcgJiBJWEFOWSkKKwkJCWNvcjIgfD0gQ09SMl9JWE07CisJfQorCisJaWYgKHRpb3NwLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQljb3IyIHw9IENPUjJfQ1RTQUU7CisJCW1jb3IxIHw9IEZJRk9fUlRTVEhSRVNIT0xEOworCX0KKworLyoKKyAqCUFsbCBjZDE0MDAgcmVnaXN0ZXIgdmFsdWVzIGNhbGN1bGF0ZWQgc28gZ28gdGhyb3VnaCBhbmQgc2V0CisgKgl0aGVtIGFsbCB1cC4KKyAqLworCisjaWZkZWYgREVCVUcKKwlwcmludGsoIlNFVFBPUlQ6IHBvcnRucj0lZCBwYW5lbG5yPSVkIGJyZG5yPSVkXG4iLAorCQlwb3J0cC0+cG9ydG5yLCBwb3J0cC0+cGFuZWxuciwgcG9ydHAtPmJyZG5yKTsKKwlwcmludGsoIiAgICBjb3IxPSV4IGNvcjI9JXggY29yMz0leCBjb3I0PSV4IGNvcjU9JXhcbiIsCisJCWNvcjEsIGNvcjIsIGNvcjMsIGNvcjQsIGNvcjUpOworCXByaW50aygiICAgIG1jb3IxPSV4IG1jb3IyPSV4IHJ0cHI9JXggc3Jlcm9uPSV4IHNyZXJvZmY9JXhcbiIsCisJCW1jb3IxLCBtY29yMiwgcnRwciwgc3Jlcm9uLCBzcmVyb2ZmKTsKKwlwcmludGsoIiAgICB0Y29yPSV4IHRicHI9JXggcmNvcj0leCByYnByPSV4XG4iLCBjbGssIGRpdiwgY2xrLCBkaXYpOworCXByaW50aygiICAgIHNjaHIxPSV4IHNjaHIyPSV4IHNjaHIzPSV4IHNjaHI0PSV4XG4iLAorCQl0aW9zcC0+Y19jY1tWU1RBUlRdLCB0aW9zcC0+Y19jY1tWU1RPUF0sCisJCXRpb3NwLT5jX2NjW1ZTVEFSVF0sIHRpb3NwLT5jX2NjW1ZTVE9QXSk7CisjZW5kaWYKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIENBUiwgKHBvcnRwLT5wb3J0bnIgJiAweDMpKTsKKwlzcmVyID0gc3RsX2NkMTQwMGdldHJlZyhwb3J0cCwgU1JFUik7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgU1JFUiwgMCk7CisJaWYgKHN0bF9jZDE0MDB1cGRhdGVyZWcocG9ydHAsIENPUjEsIGNvcjEpKQorCQljY3IgPSAxOworCWlmIChzdGxfY2QxNDAwdXBkYXRlcmVnKHBvcnRwLCBDT1IyLCBjb3IyKSkKKwkJY2NyID0gMTsKKwlpZiAoc3RsX2NkMTQwMHVwZGF0ZXJlZyhwb3J0cCwgQ09SMywgY29yMykpCisJCWNjciA9IDE7CisJaWYgKGNjcikgeworCQlzdGxfY2QxNDAwY2Nyd2FpdChwb3J0cCk7CisJCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIENDUiwgQ0NSX0NPUkNIQU5HRSk7CisJfQorCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIENPUjQsIGNvcjQpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIENPUjUsIGNvcjUpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIE1DT1IxLCBtY29yMSk7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgTUNPUjIsIG1jb3IyKTsKKwlpZiAoYmF1ZHJhdGUgPiAwKSB7CisJCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIFRDT1IsIGNsayk7CisJCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIFRCUFIsIGRpdik7CisJCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIFJDT1IsIGNsayk7CisJCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIFJCUFIsIGRpdik7CisJfQorCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIFNDSFIxLCB0aW9zcC0+Y19jY1tWU1RBUlRdKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBTQ0hSMiwgdGlvc3AtPmNfY2NbVlNUT1BdKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBTQ0hSMywgdGlvc3AtPmNfY2NbVlNUQVJUXSk7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgU0NIUjQsIHRpb3NwLT5jX2NjW1ZTVE9QXSk7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgUlRQUiwgcnRwcik7CisJbWNvcjEgPSBzdGxfY2QxNDAwZ2V0cmVnKHBvcnRwLCBNU1ZSMSk7CisJaWYgKG1jb3IxICYgTVNWUjFfRENEKQorCQlwb3J0cC0+c2lncyB8PSBUSU9DTV9DRDsKKwllbHNlCisJCXBvcnRwLT5zaWdzICY9IH5USU9DTV9DRDsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBTUkVSLCAoKHNyZXIgJiB+c3Jlcm9mZikgfCBzcmVyb24pKTsKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNldCB0aGUgc3RhdGUgb2YgdGhlIERUUiBhbmQgUlRTIHNpZ25hbHMuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX2NkMTQwMHNldHNpZ25hbHMoc3RscG9ydF90ICpwb3J0cCwgaW50IGR0ciwgaW50IHJ0cykKK3sKKwl1bnNpZ25lZCBjaGFyCW1zdnIxLCBtc3ZyMjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9jZDE0MDBzZXRzaWduYWxzKHBvcnRwPSV4LGR0cj0lZCxydHM9JWQpXG4iLAorCQkoaW50KSBwb3J0cCwgZHRyLCBydHMpOworI2VuZGlmCisKKwltc3ZyMSA9IDA7CisJbXN2cjIgPSAwOworCWlmIChkdHIgPiAwKQorCQltc3ZyMSA9IE1TVlIxX0RUUjsKKwlpZiAocnRzID4gMCkKKwkJbXN2cjIgPSBNU1ZSMl9SVFM7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQVIsIChwb3J0cC0+cG9ydG5yICYgMHgwMykpOworCWlmIChydHMgPj0gMCkKKwkJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgTVNWUjIsIG1zdnIyKTsKKwlpZiAoZHRyID49IDApCisJCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIE1TVlIxLCBtc3ZyMSk7CisJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBzaWduYWxzLgorICovCisKK3N0YXRpYyBpbnQgc3RsX2NkMTQwMGdldHNpZ25hbHMoc3RscG9ydF90ICpwb3J0cCkKK3sKKwl1bnNpZ25lZCBjaGFyCW1zdnIxLCBtc3ZyMjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludAkJc2lnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfY2QxNDAwZ2V0c2lnbmFscyhwb3J0cD0leClcbiIsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgQ0FSLCAocG9ydHAtPnBvcnRuciAmIDB4MDMpKTsKKwltc3ZyMSA9IHN0bF9jZDE0MDBnZXRyZWcocG9ydHAsIE1TVlIxKTsKKwltc3ZyMiA9IHN0bF9jZDE0MDBnZXRyZWcocG9ydHAsIE1TVlIyKTsKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlzaWdzID0gMDsKKwlzaWdzIHw9IChtc3ZyMSAmIE1TVlIxX0RDRCkgPyBUSU9DTV9DRCA6IDA7CisJc2lncyB8PSAobXN2cjEgJiBNU1ZSMV9DVFMpID8gVElPQ01fQ1RTIDogMDsKKwlzaWdzIHw9IChtc3ZyMSAmIE1TVlIxX0RUUikgPyBUSU9DTV9EVFIgOiAwOworCXNpZ3MgfD0gKG1zdnIyICYgTVNWUjJfUlRTKSA/IFRJT0NNX1JUUyA6IDA7CisjaWYgMAorCXNpZ3MgfD0gKG1zdnIxICYgTVNWUjFfUkkpID8gVElPQ01fUkkgOiAwOworCXNpZ3MgfD0gKG1zdnIxICYgTVNWUjFfRFNSKSA/IFRJT0NNX0RTUiA6IDA7CisjZWxzZQorCXNpZ3MgfD0gVElPQ01fRFNSOworI2VuZGlmCisJcmV0dXJuKHNpZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglFbmFibGUvRGlzYWJsZSB0aGUgVHJhbnNtaXR0ZXIgYW5kL29yIFJlY2VpdmVyLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBlbmFibGVyeHR4KHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KQoreworCXVuc2lnbmVkIGNoYXIJY2NyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2NkMTQwMGVuYWJsZXJ4dHgocG9ydHA9JXgscng9JWQsdHg9JWQpXG4iLAorCQkoaW50KSBwb3J0cCwgcngsIHR4KTsKKyNlbmRpZgorCWNjciA9IDA7CisKKwlpZiAodHggPT0gMCkKKwkJY2NyIHw9IENDUl9UWERJU0FCTEU7CisJZWxzZSBpZiAodHggPiAwKQorCQljY3IgfD0gQ0NSX1RYRU5BQkxFOworCWlmIChyeCA9PSAwKQorCQljY3IgfD0gQ0NSX1JYRElTQUJMRTsKKwllbHNlIGlmIChyeCA+IDApCisJCWNjciB8PSBDQ1JfUlhFTkFCTEU7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQVIsIChwb3J0cC0+cG9ydG5yICYgMHgwMykpOworCXN0bF9jZDE0MDBjY3J3YWl0KHBvcnRwKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQ1IsIGNjcik7CisJc3RsX2NkMTQwMGNjcndhaXQocG9ydHApOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU3RhcnQvc3RvcCB0aGUgVHJhbnNtaXR0ZXIgYW5kL29yIFJlY2VpdmVyLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBzdGFydHJ4dHgoc3RscG9ydF90ICpwb3J0cCwgaW50IHJ4LCBpbnQgdHgpCit7CisJdW5zaWduZWQgY2hhcglzcmVyb24sIHNyZXJvZmY7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfY2QxNDAwc3RhcnRyeHR4KHBvcnRwPSV4LHJ4PSVkLHR4PSVkKVxuIiwKKwkJKGludCkgcG9ydHAsIHJ4LCB0eCk7CisjZW5kaWYKKworCXNyZXJvbiA9IDA7CisJc3Jlcm9mZiA9IDA7CisJaWYgKHR4ID09IDApCisJCXNyZXJvZmYgfD0gKFNSRVJfVFhEQVRBIHwgU1JFUl9UWEVNUFRZKTsKKwllbHNlIGlmICh0eCA9PSAxKQorCQlzcmVyb24gfD0gU1JFUl9UWERBVEE7CisJZWxzZSBpZiAodHggPj0gMikKKwkJc3Jlcm9uIHw9IFNSRVJfVFhFTVBUWTsKKwlpZiAocnggPT0gMCkKKwkJc3Jlcm9mZiB8PSBTUkVSX1JYREFUQTsKKwllbHNlIGlmIChyeCA+IDApCisJCXNyZXJvbiB8PSBTUkVSX1JYREFUQTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIENBUiwgKHBvcnRwLT5wb3J0bnIgJiAweDAzKSk7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgU1JFUiwKKwkJKChzdGxfY2QxNDAwZ2V0cmVnKHBvcnRwLCBTUkVSKSAmIH5zcmVyb2ZmKSB8IHNyZXJvbikpOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlpZiAodHggPiAwKQorCQlzZXRfYml0KEFTWUlfVFhCVVNZLCAmcG9ydHAtPmlzdGF0ZSk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURpc2FibGUgYWxsIGludGVycnVwdHMgZnJvbSB0aGlzIHBvcnQuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX2NkMTQwMGRpc2FibGVpbnRycyhzdGxwb3J0X3QgKnBvcnRwKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2NkMTQwMGRpc2FibGVpbnRycyhwb3J0cD0leClcbiIsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIENBUiwgKHBvcnRwLT5wb3J0bnIgJiAweDAzKSk7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgU1JFUiwgMCk7CisJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBzZW5kYnJlYWsoc3RscG9ydF90ICpwb3J0cCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9jZDE0MDBzZW5kYnJlYWsocG9ydHA9JXgsbGVuPSVkKVxuIiwgKGludCkgcG9ydHAsIGxlbik7CisjZW5kaWYKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIENBUiwgKHBvcnRwLT5wb3J0bnIgJiAweDAzKSk7CisJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgU1JFUiwKKwkJKChzdGxfY2QxNDAwZ2V0cmVnKHBvcnRwLCBTUkVSKSAmIH5TUkVSX1RYREFUQSkgfAorCQlTUkVSX1RYRU1QVFkpKTsKKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CisJcG9ydHAtPmJya2xlbiA9IGxlbjsKKwlpZiAobGVuID09IDEpCisJCXBvcnRwLT5zdGF0cy50eGJyZWFrcysrOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUYWtlIGZsb3cgY29udHJvbCBhY3Rpb25zLi4uCisgKi8KKworc3RhdGljIHZvaWQgc3RsX2NkMTQwMGZsb3djdHJsKHN0bHBvcnRfdCAqcG9ydHAsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9jZDE0MDBmbG93Y3RybChwb3J0cD0leCxzdGF0ZT0leClcbiIsIChpbnQpIHBvcnRwLCBzdGF0ZSk7CisjZW5kaWYKKworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwl0dHkgPSBwb3J0cC0+dHR5OworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIENBUiwgKHBvcnRwLT5wb3J0bnIgJiAweDAzKSk7CisKKwlpZiAoc3RhdGUpIHsKKwkJaWYgKHR0eS0+dGVybWlvcy0+Y19pZmxhZyAmIElYT0ZGKSB7CisJCQlzdGxfY2QxNDAwY2Nyd2FpdChwb3J0cCk7CisJCQlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQ1IsIENDUl9TRU5EU0NIUjEpOworCQkJcG9ydHAtPnN0YXRzLnJ4eG9uKys7CisJCQlzdGxfY2QxNDAwY2Nyd2FpdChwb3J0cCk7CisJCX0KKy8qCisgKgkJUXVlc3Rpb246IHNob3VsZCB3ZSByZXR1cm4gUlRTIHRvIHdoYXQgaXQgd2FzIGJlZm9yZT8gSXQgbWF5CisgKgkJaGF2ZSBiZWVuIHNldCBieSBhbiBpb2N0bC4uLiBTdXBwb3NlIG5vdCwgc2luY2UgaWYgeW91IGhhdmUKKyAqCQloYXJkd2FyZSBmbG93IGNvbnRyb2wgc2V0IHRoZW4gaXQgaXMgcHJldHR5IHNpbGx5IHRvIGdvIGFuZAorICoJCXNldCB0aGUgUlRTIGxpbmUgYnkgaGFuZC4KKyAqLworCQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQkJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgTUNPUjEsCisJCQkJKHN0bF9jZDE0MDBnZXRyZWcocG9ydHAsIE1DT1IxKSB8CisJCQkJRklGT19SVFNUSFJFU0hPTEQpKTsKKwkJCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIE1TVlIyLCBNU1ZSMl9SVFMpOworCQkJcG9ydHAtPnN0YXRzLnJ4cnRzb24rKzsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh0dHktPnRlcm1pb3MtPmNfaWZsYWcgJiBJWE9GRikgeworCQkJc3RsX2NkMTQwMGNjcndhaXQocG9ydHApOworCQkJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgQ0NSLCBDQ1JfU0VORFNDSFIyKTsKKwkJCXBvcnRwLT5zdGF0cy5yeHhvZmYrKzsKKwkJCXN0bF9jZDE0MDBjY3J3YWl0KHBvcnRwKTsKKwkJfQorCQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQkJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgTUNPUjEsCisJCQkJKHN0bF9jZDE0MDBnZXRyZWcocG9ydHAsIE1DT1IxKSAmIDB4ZjApKTsKKwkJCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIE1TVlIyLCAwKTsKKwkJCXBvcnRwLT5zdGF0cy5yeHJ0c29mZisrOworCQl9CisJfQorCisJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTZW5kIGEgZmxvdyBjb250cm9sIGNoYXJhY3Rlci4uLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBzZW5kZmxvdyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfY2QxNDAwc2VuZGZsb3cocG9ydHA9JXgsc3RhdGU9JXgpXG4iLCAoaW50KSBwb3J0cCwgc3RhdGUpOworI2VuZGlmCisKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJdHR5ID0gcG9ydHAtPnR0eTsKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQVIsIChwb3J0cC0+cG9ydG5yICYgMHgwMykpOworCWlmIChzdGF0ZSkgeworCQlzdGxfY2QxNDAwY2Nyd2FpdChwb3J0cCk7CisJCXN0bF9jZDE0MDBzZXRyZWcocG9ydHAsIENDUiwgQ0NSX1NFTkRTQ0hSMSk7CisJCXBvcnRwLT5zdGF0cy5yeHhvbisrOworCQlzdGxfY2QxNDAwY2Nyd2FpdChwb3J0cCk7CisJfSBlbHNlIHsKKwkJc3RsX2NkMTQwMGNjcndhaXQocG9ydHApOworCQlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQ1IsIENDUl9TRU5EU0NIUjIpOworCQlwb3J0cC0+c3RhdHMucnh4b2ZmKys7CisJCXN0bF9jZDE0MDBjY3J3YWl0KHBvcnRwKTsKKwl9CisJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBmbHVzaChzdGxwb3J0X3QgKnBvcnRwKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2NkMTQwMGZsdXNoKHBvcnRwPSV4KVxuIiwgKGludCkgcG9ydHApOworI2VuZGlmCisKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQVIsIChwb3J0cC0+cG9ydG5yICYgMHgwMykpOworCXN0bF9jZDE0MDBjY3J3YWl0KHBvcnRwKTsKKwlzdGxfY2QxNDAwc2V0cmVnKHBvcnRwLCBDQ1IsIENDUl9UWEZMVVNIRklGTyk7CisJc3RsX2NkMTQwMGNjcndhaXQocG9ydHApOworCXBvcnRwLT50eC50YWlsID0gcG9ydHAtPnR4LmhlYWQ7CisJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgZGF0YSBmbG93IG9uIHRoaXMgcG9ydC4gVGhpcyBpcyBvbmx5CisgKglyZWFsbHkgaW50ZXJyZXN0aW5nIHdoZW4gZGV0ZXJtaW5pbmcgaWYgZGF0YSBoYXMgZnVsbHkgY29tcGxldGVkCisgKgl0cmFuc21pc3Npb24gb3Igbm90Li4uIFRoaXMgaXMgZWFzeSBmb3IgdGhlIGNkMTQwMCwgaXQgYWNjdXJhdGVseQorICoJbWFpbnRhaW5zIHRoZSBidXN5IHBvcnQgZmxhZy4KKyAqLworCitzdGF0aWMgaW50IHN0bF9jZDE0MDBkYXRhc3RhdGUoc3RscG9ydF90ICpwb3J0cCkKK3sKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2NkMTQwMGRhdGFzdGF0ZShwb3J0cD0leClcbiIsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCisJcmV0dXJuKHRlc3RfYml0KEFTWUlfVFhCVVNZLCAmcG9ydHAtPmlzdGF0ZSkgPyAxIDogMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIGNkMTQwMCBFYXN5SU8gYm9hcmRzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBlaW9pbnRyKHN0bHBhbmVsX3QgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSkKK3sKKwl1bnNpZ25lZCBjaGFyCXN2cnR5cGU7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX2NkMTQwMGVpb2ludHIocGFuZWxwPSV4LGlvYmFzZT0leClcbiIsCisJCShpbnQpIHBhbmVscCwgaW9iYXNlKTsKKyNlbmRpZgorCisJb3V0YihTVlJSLCBpb2Jhc2UpOworCXN2cnR5cGUgPSBpbmIoaW9iYXNlICsgRVJFR19EQVRBKTsKKwlpZiAocGFuZWxwLT5ucnBvcnRzID4gNCkgeworCQlvdXRiKChTVlJSICsgMHg4MCksIGlvYmFzZSk7CisJCXN2cnR5cGUgfD0gaW5iKGlvYmFzZSArIEVSRUdfREFUQSk7CisJfQorCisJaWYgKHN2cnR5cGUgJiBTVlJSX1JYKQorCQlzdGxfY2QxNDAwcnhpc3IocGFuZWxwLCBpb2Jhc2UpOworCWVsc2UgaWYgKHN2cnR5cGUgJiBTVlJSX1RYKQorCQlzdGxfY2QxNDAwdHhpc3IocGFuZWxwLCBpb2Jhc2UpOworCWVsc2UgaWYgKHN2cnR5cGUgJiBTVlJSX01ETSkKKwkJc3RsX2NkMTQwMG1kbWlzcihwYW5lbHAsIGlvYmFzZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIGNkMTQwMCBwYW5lbHMuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX2NkMTQwMGVjaGludHIoc3RscGFuZWxfdCAqcGFuZWxwLCB1bnNpZ25lZCBpbnQgaW9iYXNlKQoreworCXVuc2lnbmVkIGNoYXIJc3ZydHlwZTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfY2QxNDAwZWNoaW50cihwYW5lbHA9JXgsaW9iYXNlPSV4KVxuIiwgKGludCkgcGFuZWxwLAorCQlpb2Jhc2UpOworI2VuZGlmCisKKwlvdXRiKFNWUlIsIGlvYmFzZSk7CisJc3ZydHlwZSA9IGluYihpb2Jhc2UgKyBFUkVHX0RBVEEpOworCW91dGIoKFNWUlIgKyAweDgwKSwgaW9iYXNlKTsKKwlzdnJ0eXBlIHw9IGluYihpb2Jhc2UgKyBFUkVHX0RBVEEpOworCWlmIChzdnJ0eXBlICYgU1ZSUl9SWCkKKwkJc3RsX2NkMTQwMHJ4aXNyKHBhbmVscCwgaW9iYXNlKTsKKwllbHNlIGlmIChzdnJ0eXBlICYgU1ZSUl9UWCkKKwkJc3RsX2NkMTQwMHR4aXNyKHBhbmVscCwgaW9iYXNlKTsKKwllbHNlIGlmIChzdnJ0eXBlICYgU1ZSUl9NRE0pCisJCXN0bF9jZDE0MDBtZG1pc3IocGFuZWxwLCBpb2Jhc2UpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVVuZm9ydHVuYXRlbHkgd2UgbmVlZCB0byBoYW5kbGUgYnJlYWtzIGluIHRoZSBUWCBkYXRhIHN0cmVhbSwgc2luY2UKKyAqCXRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIGdlbmVyYXRlIHRoZW0gb24gdGhlIGNkMTQwMC4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBzdGxfY2QxNDAwYnJlYWtpc3Ioc3RscG9ydF90ICpwb3J0cCwgaW50IGlvYWRkcikKK3sKKwlpZiAocG9ydHAtPmJya2xlbiA9PSAxKSB7CisJCW91dGIoKENPUjIgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOworCQlvdXRiKChpbmIoaW9hZGRyICsgRVJFR19EQVRBKSB8IENPUjJfRVRDKSwKKwkJCShpb2FkZHIgKyBFUkVHX0RBVEEpKTsKKwkJb3V0YigoVERSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKKwkJb3V0YihFVENfQ01ELCAoaW9hZGRyICsgRVJFR19EQVRBKSk7CisJCW91dGIoRVRDX1NUQVJUQlJFQUssIChpb2FkZHIgKyBFUkVHX0RBVEEpKTsKKwkJb3V0YigoU1JFUiArIHBvcnRwLT51YXJ0YWRkciksIGlvYWRkcik7CisJCW91dGIoKGluYihpb2FkZHIgKyBFUkVHX0RBVEEpICYgfihTUkVSX1RYREFUQSB8IFNSRVJfVFhFTVBUWSkpLAorCQkJKGlvYWRkciArIEVSRUdfREFUQSkpOworCQlyZXR1cm4oMSk7CisJfSBlbHNlIGlmIChwb3J0cC0+YnJrbGVuID4gMSkgeworCQlvdXRiKChURFIgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOworCQlvdXRiKEVUQ19DTUQsIChpb2FkZHIgKyBFUkVHX0RBVEEpKTsKKwkJb3V0YihFVENfU1RPUEJSRUFLLCAoaW9hZGRyICsgRVJFR19EQVRBKSk7CisJCXBvcnRwLT5icmtsZW4gPSAtMTsKKwkJcmV0dXJuKDEpOworCX0gZWxzZSB7CisJCW91dGIoKENPUjIgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOworCQlvdXRiKChpbmIoaW9hZGRyICsgRVJFR19EQVRBKSAmIH5DT1IyX0VUQyksCisJCQkoaW9hZGRyICsgRVJFR19EQVRBKSk7CisJCXBvcnRwLT5icmtsZW4gPSAwOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyLiBUaGlzIGhhcyBnb3R0YSBiZSBmYXN0ISAgSGFuZGxpbmcgVFgKKyAqCWNoYXJzIGlzIHByZXR0eSBzaW1wbGUsIHN0dWZmIGFzIG1hbnkgYXMgcG9zc2libGUgZnJvbSB0aGUgVFggYnVmZmVyCisgKglpbnRvIHRoZSBjZDE0MDAgRklGTy4gTXVzdCBhbHNvIGhhbmRsZSBUWCBicmVha3MgaGVyZSwgc2luY2UgdGhleQorICoJYXJlIGVtYmVkZGVkIGFzIGNvbW1hbmRzIGluIHRoZSBkYXRhIHN0cmVhbS4gT2ggbm8sIGhhZCB0byB1c2UgYSBnb3RvIQorICoJVGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgbW9yZSwgd2lsbCBkbyB3aGVuIEkgZ2V0IHRpbWUuLi4KKyAqCUluIHByYWN0aWNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBidXQgdGhhdCB0aGUKKyAqCXBvcnQgaGFzIGJlZW4gaHVuZyB1cC4gTmVlZCB0byBoYW5kbGUgbm90IGhhdmluZyBhbnkgVFggYnVmZmVyIGhlcmUsCisgKgl0aGlzIGlzIGRvbmUgYnkgdXNpbmcgdGhlIHNpZGUgZWZmZWN0IHRoYXQgaGVhZCBhbmQgdGFpbCB3aWxsIGFsc28KKyAqCWJlIE5VTEwgaWYgdGhlIGJ1ZmZlciBoYXMgYmVlbiBmcmVlZC4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwdHhpc3Ioc3RscGFuZWxfdCAqcGFuZWxwLCBpbnQgaW9hZGRyKQoreworCXN0bHBvcnRfdAkqcG9ydHA7CisJaW50CQlsZW4sIHN0bGVuOworCWNoYXIJCSpoZWFkLCAqdGFpbDsKKwl1bnNpZ25lZCBjaGFyCWlvYWNrLCBzcmVyOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9jZDE0MDB0eGlzcihwYW5lbHA9JXgsaW9hZGRyPSV4KVxuIiwgKGludCkgcGFuZWxwLCBpb2FkZHIpOworI2VuZGlmCisKKwlpb2FjayA9IGluYihpb2FkZHIgKyBFUkVHX1RYQUNLKTsKKwlpZiAoKChpb2FjayAmIHBhbmVscC0+YWNrbWFzaykgIT0gMCkgfHwKKwkgICAgKChpb2FjayAmIEFDS19UWVBNQVNLKSAhPSBBQ0tfVFlQVFgpKSB7CisJCXByaW50aygiU1RBTExJT046IGJhZCBUWCBpbnRlcnJ1cHQgYWNrIHZhbHVlPSV4XG4iLCBpb2Fjayk7CisJCXJldHVybjsKKwl9CisJcG9ydHAgPSBwYW5lbHAtPnBvcnRzWyhpb2FjayA+PiAzKV07CisKKy8qCisgKglVbmZvcnR1bmF0ZWx5IHdlIG5lZWQgdG8gaGFuZGxlIGJyZWFrcyBpbiB0aGUgZGF0YSBzdHJlYW0sIHNpbmNlCisgKgl0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBnZW5lcmF0ZSB0aGVtIG9uIHRoZSBjZDE0MDAuIERvIGl0IG5vdyBpZgorICoJYSBicmVhayBpcyB0byBiZSBzZW50LgorICovCisJaWYgKHBvcnRwLT5icmtsZW4gIT0gMCkKKwkJaWYgKHN0bF9jZDE0MDBicmVha2lzcihwb3J0cCwgaW9hZGRyKSkKKwkJCWdvdG8gc3RsX3R4YWxsZG9uZTsKKworCWhlYWQgPSBwb3J0cC0+dHguaGVhZDsKKwl0YWlsID0gcG9ydHAtPnR4LnRhaWw7CisJbGVuID0gKGhlYWQgPj0gdGFpbCkgPyAoaGVhZCAtIHRhaWwpIDogKFNUTF9UWEJVRlNJWkUgLSAodGFpbCAtIGhlYWQpKTsKKwlpZiAoKGxlbiA9PSAwKSB8fCAoKGxlbiA8IFNUTF9UWEJVRkxPVykgJiYKKwkgICAgKHRlc3RfYml0KEFTWUlfVFhMT1csICZwb3J0cC0+aXN0YXRlKSA9PSAwKSkpIHsKKwkJc2V0X2JpdChBU1lJX1RYTE9XLCAmcG9ydHAtPmlzdGF0ZSk7CisJCXNjaGVkdWxlX3dvcmsoJnBvcnRwLT50cXVldWUpOworCX0KKworCWlmIChsZW4gPT0gMCkgeworCQlvdXRiKChTUkVSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKKwkJc3JlciA9IGluYihpb2FkZHIgKyBFUkVHX0RBVEEpOworCQlpZiAoc3JlciAmIFNSRVJfVFhEQVRBKSB7CisJCQlzcmVyID0gKHNyZXIgJiB+U1JFUl9UWERBVEEpIHwgU1JFUl9UWEVNUFRZOworCQl9IGVsc2UgeworCQkJc3JlciAmPSB+KFNSRVJfVFhEQVRBIHwgU1JFUl9UWEVNUFRZKTsKKwkJCWNsZWFyX2JpdChBU1lJX1RYQlVTWSwgJnBvcnRwLT5pc3RhdGUpOworCQl9CisJCW91dGIoc3JlciwgKGlvYWRkciArIEVSRUdfREFUQSkpOworCX0gZWxzZSB7CisJCWxlbiA9IE1JTihsZW4sIENEMTQwMF9UWEZJRk9TSVpFKTsKKwkJcG9ydHAtPnN0YXRzLnR4dG90YWwgKz0gbGVuOworCQlzdGxlbiA9IE1JTihsZW4sICgocG9ydHAtPnR4LmJ1ZiArIFNUTF9UWEJVRlNJWkUpIC0gdGFpbCkpOworCQlvdXRiKChURFIgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOworCQlvdXRzYigoaW9hZGRyICsgRVJFR19EQVRBKSwgdGFpbCwgc3RsZW4pOworCQlsZW4gLT0gc3RsZW47CisJCXRhaWwgKz0gc3RsZW47CisJCWlmICh0YWlsID49IChwb3J0cC0+dHguYnVmICsgU1RMX1RYQlVGU0laRSkpCisJCQl0YWlsID0gcG9ydHAtPnR4LmJ1ZjsKKwkJaWYgKGxlbiA+IDApIHsKKwkJCW91dHNiKChpb2FkZHIgKyBFUkVHX0RBVEEpLCB0YWlsLCBsZW4pOworCQkJdGFpbCArPSBsZW47CisJCX0KKwkJcG9ydHAtPnR4LnRhaWwgPSB0YWlsOworCX0KKworc3RsX3R4YWxsZG9uZToKKwlvdXRiKChFT1NSUiArIHBvcnRwLT51YXJ0YWRkciksIGlvYWRkcik7CisJb3V0YigwLCAoaW9hZGRyICsgRVJFR19EQVRBKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJlY2VpdmUgY2hhcmFjdGVyIGludGVycnVwdCBoYW5kbGVyLiBEZXRlcm1pbmUgaWYgd2UgaGF2ZSBnb29kIGNoYXJzCisgKglvciBiYWQgY2hhcnMgYW5kIHRoZW4gcHJvY2VzcyBhcHByb3ByaWF0ZWx5LiBHb29kIGNoYXJzIGFyZSBlYXN5CisgKglqdXN0IHNob3ZlIHRoZSBsb3QgaW50byB0aGUgUlggYnVmZmVyIGFuZCBzZXQgYWxsIHN0YXR1cyBieXRlIHRvIDAuCisgKglJZiBhIGJhZCBSWCBjaGFyIHRoZW4gcHJvY2VzcyBhcyByZXF1aXJlZC4gVGhpcyByb3V0aW5lIG5lZWRzIHRvIGJlCisgKglmYXN0ISAgSW4gcHJhY3RpY2UgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBnZXQgYW4gaW50ZXJydXB0IG9uIGEgcG9ydAorICoJdGhhdCBpcyBjbG9zZWQuIFRoaXMgY2FuIGhhcHBlbiBvbiBoYW5ndXBzIC0gc2luY2UgdGhleSBjb21wbGV0ZWx5CisgKglzaHV0ZG93biBhIHBvcnQgbm90IGluIHVzZXIgY29udGV4dC4gTmVlZCB0byBoYW5kbGUgdGhpcyBjYXNlLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDByeGlzcihzdGxwYW5lbF90ICpwYW5lbHAsIGludCBpb2FkZHIpCit7CisJc3RscG9ydF90CQkqcG9ydHA7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwl1bnNpZ25lZCBpbnQJCWlvYWNrLCBsZW4sIGJ1ZmxlbjsKKwl1bnNpZ25lZCBjaGFyCQlzdGF0dXM7CisJY2hhcgkJCWNoOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9jZDE0MDByeGlzcihwYW5lbHA9JXgsaW9hZGRyPSV4KVxuIiwgKGludCkgcGFuZWxwLCBpb2FkZHIpOworI2VuZGlmCisKKwlpb2FjayA9IGluYihpb2FkZHIgKyBFUkVHX1JYQUNLKTsKKwlpZiAoKGlvYWNrICYgcGFuZWxwLT5hY2ttYXNrKSAhPSAwKSB7CisJCXByaW50aygiU1RBTExJT046IGJhZCBSWCBpbnRlcnJ1cHQgYWNrIHZhbHVlPSV4XG4iLCBpb2Fjayk7CisJCXJldHVybjsKKwl9CisJcG9ydHAgPSBwYW5lbHAtPnBvcnRzWyhpb2FjayA+PiAzKV07CisJdHR5ID0gcG9ydHAtPnR0eTsKKworCWlmICgoaW9hY2sgJiBBQ0tfVFlQTUFTSykgPT0gQUNLX1RZUFJYR09PRCkgeworCQlvdXRiKChSRENSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKKwkJbGVuID0gaW5iKGlvYWRkciArIEVSRUdfREFUQSk7CisJCWlmICgodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKSB8fAorCQkgICAgKHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPT0gKGNoYXIgKikgTlVMTCkgfHwKKwkJICAgICgoYnVmbGVuID0gVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudCkgPT0gMCkpIHsKKwkJCWxlbiA9IE1JTihsZW4sIHNpemVvZihzdGxfdW53YW50ZWQpKTsKKwkJCW91dGIoKFJEU1IgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOworCQkJaW5zYigoaW9hZGRyICsgRVJFR19EQVRBKSwgJnN0bF91bndhbnRlZFswXSwgbGVuKTsKKwkJCXBvcnRwLT5zdGF0cy5yeGxvc3QgKz0gbGVuOworCQkJcG9ydHAtPnN0YXRzLnJ4dG90YWwgKz0gbGVuOworCQl9IGVsc2UgeworCQkJbGVuID0gTUlOKGxlbiwgYnVmbGVuKTsKKwkJCWlmIChsZW4gPiAwKSB7CisJCQkJb3V0YigoUkRTUiArIHBvcnRwLT51YXJ0YWRkciksIGlvYWRkcik7CisJCQkJaW5zYigoaW9hZGRyICsgRVJFR19EQVRBKSwgdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgbGVuKTsKKwkJCQltZW1zZXQodHR5LT5mbGlwLmZsYWdfYnVmX3B0ciwgMCwgbGVuKTsKKwkJCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyICs9IGxlbjsKKwkJCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyICs9IGxlbjsKKwkJCQl0dHktPmZsaXAuY291bnQgKz0gbGVuOworCQkJCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7CisJCQkJcG9ydHAtPnN0YXRzLnJ4dG90YWwgKz0gbGVuOworCQkJfQorCQl9CisJfSBlbHNlIGlmICgoaW9hY2sgJiBBQ0tfVFlQTUFTSykgPT0gQUNLX1RZUFJYQkFEKSB7CisJCW91dGIoKFJEU1IgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOworCQlzdGF0dXMgPSBpbmIoaW9hZGRyICsgRVJFR19EQVRBKTsKKwkJY2ggPSBpbmIoaW9hZGRyICsgRVJFR19EQVRBKTsKKwkJaWYgKHN0YXR1cyAmIFNUX1BBUklUWSkKKwkJCXBvcnRwLT5zdGF0cy5yeHBhcml0eSsrOworCQlpZiAoc3RhdHVzICYgU1RfRlJBTUlORykKKwkJCXBvcnRwLT5zdGF0cy5yeGZyYW1pbmcrKzsKKwkJaWYgKHN0YXR1cyAmIFNUX09WRVJSVU4pCisJCQlwb3J0cC0+c3RhdHMucnhvdmVycnVuKys7CisJCWlmIChzdGF0dXMgJiBTVF9CUkVBSykKKwkJCXBvcnRwLT5zdGF0cy5yeGJyZWFrcysrOworCQlpZiAoc3RhdHVzICYgU1RfU0NIQVJNQVNLKSB7CisJCQlpZiAoKHN0YXR1cyAmIFNUX1NDSEFSTUFTSykgPT0gU1RfU0NIQVIxKQorCQkJCXBvcnRwLT5zdGF0cy50eHhvbisrOworCQkJaWYgKChzdGF0dXMgJiBTVF9TQ0hBUk1BU0spID09IFNUX1NDSEFSMikKKwkJCQlwb3J0cC0+c3RhdHMudHh4b2ZmKys7CisJCQlnb3RvIHN0bF9yeGFsbGRvbmU7CisJCX0KKwkJaWYgKCh0dHkgIT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpICYmCisJCSAgICAoKHBvcnRwLT5yeGlnbm9yZW1zayAmIHN0YXR1cykgPT0gMCkpIHsKKwkJCWlmIChwb3J0cC0+cnhtYXJrbXNrICYgc3RhdHVzKSB7CisJCQkJaWYgKHN0YXR1cyAmIFNUX0JSRUFLKSB7CisJCQkJCXN0YXR1cyA9IFRUWV9CUkVBSzsKKwkJCQkJaWYgKHBvcnRwLT5mbGFncyAmIEFTWU5DX1NBSykgeworCQkJCQkJZG9fU0FLKHR0eSk7CisJCQkJCQlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgU1RfUEFSSVRZKSB7CisJCQkJCXN0YXR1cyA9IFRUWV9QQVJJVFk7CisJCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBTVF9GUkFNSU5HKSB7CisJCQkJCXN0YXR1cyA9IFRUWV9GUkFNRTsKKwkJCQl9IGVsc2UgaWYoc3RhdHVzICYgU1RfT1ZFUlJVTikgeworCQkJCQlzdGF0dXMgPSBUVFlfT1ZFUlJVTjsKKwkJCQl9IGVsc2UgeworCQkJCQlzdGF0dXMgPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3RhdHVzID0gMDsKKwkJCX0KKwkJCWlmICh0dHktPmZsaXAuY2hhcl9idWZfcHRyICE9IChjaGFyICopIE5VTEwpIHsKKwkJCQlpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgeworCQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gc3RhdHVzOworCQkJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gY2g7CisJCQkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkJCX0KKwkJCQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJTVEFMTElPTjogYmFkIFJYIGludGVycnVwdCBhY2sgdmFsdWU9JXhcbiIsIGlvYWNrKTsKKwkJcmV0dXJuOworCX0KKworc3RsX3J4YWxsZG9uZToKKwlvdXRiKChFT1NSUiArIHBvcnRwLT51YXJ0YWRkciksIGlvYWRkcik7CisJb3V0YigwLCAoaW9hZGRyICsgRVJFR19EQVRBKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCU1vZGVtIGludGVycnVwdCBoYW5kbGVyLiBUaGUgaXMgY2FsbGVkIHdoZW4gdGhlIG1vZGVtIHNpZ25hbCBsaW5lCisgKgkoRENEKSBoYXMgY2hhbmdlZCBzdGF0ZS4gTGVhdmUgbW9zdCBvZiB0aGUgd29yayB0byB0aGUgb2ZmLWxldmVsCisgKglwcm9jZXNzaW5nIHJvdXRpbmUuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX2NkMTQwMG1kbWlzcihzdGxwYW5lbF90ICpwYW5lbHAsIGludCBpb2FkZHIpCit7CisJc3RscG9ydF90CSpwb3J0cDsKKwl1bnNpZ25lZCBpbnQJaW9hY2s7CisJdW5zaWduZWQgY2hhcgltaXNyOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9jZDE0MDBtZG1pc3IocGFuZWxwPSV4KVxuIiwgKGludCkgcGFuZWxwKTsKKyNlbmRpZgorCisJaW9hY2sgPSBpbmIoaW9hZGRyICsgRVJFR19NREFDSyk7CisJaWYgKCgoaW9hY2sgJiBwYW5lbHAtPmFja21hc2spICE9IDApIHx8CisJICAgICgoaW9hY2sgJiBBQ0tfVFlQTUFTSykgIT0gQUNLX1RZUE1ETSkpIHsKKwkJcHJpbnRrKCJTVEFMTElPTjogYmFkIE1PREVNIGludGVycnVwdCBhY2sgdmFsdWU9JXhcbiIsIGlvYWNrKTsKKwkJcmV0dXJuOworCX0KKwlwb3J0cCA9IHBhbmVscC0+cG9ydHNbKGlvYWNrID4+IDMpXTsKKworCW91dGIoKE1JU1IgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOworCW1pc3IgPSBpbmIoaW9hZGRyICsgRVJFR19EQVRBKTsKKwlpZiAobWlzciAmIE1JU1JfRENEKSB7CisJCXNldF9iaXQoQVNZSV9EQ0RDSEFOR0UsICZwb3J0cC0+aXN0YXRlKTsKKwkJc2NoZWR1bGVfd29yaygmcG9ydHAtPnRxdWV1ZSk7CisJCXBvcnRwLT5zdGF0cy5tb2RlbSsrOworCX0KKworCW91dGIoKEVPU1JSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKKwlvdXRiKDAsIChpb2FkZHIgKyBFUkVHX0RBVEEpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgU0MyNjE5OCBIQVJEV0FSRSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlc2UgZnVuY3Rpb25zIGdldC9zZXQvdXBkYXRlIHRoZSByZWdpc3RlcnMgb2YgdGhlIHNjMjYxOTggVUFSVHMuCisgKglBY2Nlc3MgdG8gdGhlIHNjMjYxOTggcmVnaXN0ZXJzIGlzIHZpYSBhbiBhZGRyZXNzL2RhdGEgaW8gcG9ydCBwYWlyLgorICoJKE1heWJlIHNob3VsZCBtYWtlIHRoaXMgaW5saW5lLi4uKQorICovCisKK3N0YXRpYyBpbnQgc3RsX3NjMjYxOThnZXRyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yKQoreworCW91dGIoKHJlZ25yIHwgcG9ydHAtPnVhcnRhZGRyKSwgKHBvcnRwLT5pb2FkZHIgKyBYUF9BRERSKSk7CisJcmV0dXJuKGluYihwb3J0cC0+aW9hZGRyICsgWFBfREFUQSkpOworfQorCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHNldHJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIsIGludCB2YWx1ZSkKK3sKKwlvdXRiKChyZWduciB8IHBvcnRwLT51YXJ0YWRkciksIChwb3J0cC0+aW9hZGRyICsgWFBfQUREUikpOworCW91dGIodmFsdWUsIChwb3J0cC0+aW9hZGRyICsgWFBfREFUQSkpOworfQorCitzdGF0aWMgaW50IHN0bF9zYzI2MTk4dXBkYXRlcmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWduciwgaW50IHZhbHVlKQoreworCW91dGIoKHJlZ25yIHwgcG9ydHAtPnVhcnRhZGRyKSwgKHBvcnRwLT5pb2FkZHIgKyBYUF9BRERSKSk7CisJaWYgKGluYihwb3J0cC0+aW9hZGRyICsgWFBfREFUQSkgIT0gdmFsdWUpIHsKKwkJb3V0Yih2YWx1ZSwgKHBvcnRwLT5pb2FkZHIgKyBYUF9EQVRBKSk7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglGdW5jdGlvbnMgdG8gZ2V0IGFuZCBzZXQgdGhlIHNjMjYxOTggZ2xvYmFsIHJlZ2lzdGVycy4KKyAqLworCitzdGF0aWMgaW50IHN0bF9zYzI2MTk4Z2V0Z2xvYnJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIpCit7CisJb3V0YihyZWduciwgKHBvcnRwLT5pb2FkZHIgKyBYUF9BRERSKSk7CisJcmV0dXJuKGluYihwb3J0cC0+aW9hZGRyICsgWFBfREFUQSkpOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgc3RsX3NjMjYxOThzZXRnbG9icmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWduciwgaW50IHZhbHVlKQoreworCW91dGIocmVnbnIsIChwb3J0cC0+aW9hZGRyICsgWFBfQUREUikpOworCW91dGIodmFsdWUsIChwb3J0cC0+aW9hZGRyICsgWFBfREFUQSkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUluYml0aWFsaXplIHRoZSBVQVJUcyBpbiBhIHBhbmVsLiBXZSBkb24ndCBjYXJlIHdoYXQgc29ydCBvZiBib2FyZAorICoJdGhlc2UgcG9ydHMgYXJlIG9uIC0gc2luY2UgdGhlIHBvcnQgaW8gcmVnaXN0ZXJzIGFyZSBhbG1vc3QKKyAqCWlkZW50aWNhbCB3aGVuIGRlYWxpbmcgd2l0aCBwb3J0cy4KKyAqLworCitzdGF0aWMgaW50IHN0bF9zYzI2MTk4cGFuZWxpbml0KHN0bGJyZF90ICpicmRwLCBzdGxwYW5lbF90ICpwYW5lbHApCit7CisJaW50CWNoaXBtYXNrLCBpOworCWludAlucmNoaXBzLCBpb2FkZHI7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOThwYW5lbGluaXQoYnJkcD0leCxwYW5lbHA9JXgpXG4iLAorCQkoaW50KSBicmRwLCAoaW50KSBwYW5lbHApOworI2VuZGlmCisKKwlCUkRFTkFCTEUocGFuZWxwLT5icmRuciwgcGFuZWxwLT5wYWdlbnIpOworCisvKgorICoJQ2hlY2sgdGhhdCBlYWNoIGNoaXAgaXMgcHJlc2VudCBhbmQgc3RhcnRlZCB1cCBPSy4KKyAqLworCWNoaXBtYXNrID0gMDsKKwlucmNoaXBzID0gKHBhbmVscC0+bnJwb3J0cyArIDQpIC8gU0MyNjE5OF9QT1JUUzsKKwlpZiAoYnJkcC0+YnJkdHlwZSA9PSBCUkRfRUNIUENJKQorCQlvdXRiKHBhbmVscC0+cGFnZW5yLCBicmRwLT5pb2N0cmwpOworCisJZm9yIChpID0gMDsgKGkgPCBucmNoaXBzKTsgaSsrKSB7CisJCWlvYWRkciA9IHBhbmVscC0+aW9iYXNlICsgKGkgKiA0KTsgCisJCW91dGIoU0NDUiwgKGlvYWRkciArIFhQX0FERFIpKTsKKwkJb3V0YihDUl9SRVNFVEFMTCwgKGlvYWRkciArIFhQX0RBVEEpKTsKKwkJb3V0YihUU1RSLCAoaW9hZGRyICsgWFBfQUREUikpOworCQlpZiAoaW5iKGlvYWRkciArIFhQX0RBVEEpICE9IDApIHsKKwkJCXByaW50aygiU1RBTExJT046IHNjMjYxOTggbm90IHJlc3BvbmRpbmcsICIKKwkJCQkiYnJkPSVkIHBhbmVsPSVkIGNoaXA9JWRcbiIsCisJCQkJcGFuZWxwLT5icmRuciwgcGFuZWxwLT5wYW5lbG5yLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNoaXBtYXNrIHw9ICgweDEgPDwgaSk7CisJCW91dGIoR0NDUiwgKGlvYWRkciArIFhQX0FERFIpKTsKKwkJb3V0YihHQ0NSX0lWUlRZUENIQU5BQ0ssIChpb2FkZHIgKyBYUF9EQVRBKSk7CisJCW91dGIoV0RUUkNSLCAoaW9hZGRyICsgWFBfQUREUikpOworCQlvdXRiKDB4ZmYsIChpb2FkZHIgKyBYUF9EQVRBKSk7CisJfQorCisJQlJERElTQUJMRShwYW5lbHAtPmJyZG5yKTsKKwlyZXR1cm4oY2hpcG1hc2spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJbml0aWFsaXplIGhhcmR3YXJlIHNwZWNpZmljIHBvcnQgcmVnaXN0ZXJzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4cG9ydGluaXQoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCwgc3RscG9ydF90ICpwb3J0cCkKK3sKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOThwb3J0aW5pdChicmRwPSV4LHBhbmVscD0leCxwb3J0cD0leClcbiIsCisJCShpbnQpIGJyZHAsIChpbnQpIHBhbmVscCwgKGludCkgcG9ydHApOworI2VuZGlmCisKKwlpZiAoKGJyZHAgPT0gKHN0bGJyZF90ICopIE5VTEwpIHx8IChwYW5lbHAgPT0gKHN0bHBhbmVsX3QgKikgTlVMTCkgfHwKKwkgICAgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkpCisJCXJldHVybjsKKworCXBvcnRwLT5pb2FkZHIgPSBwYW5lbHAtPmlvYmFzZSArICgocG9ydHAtPnBvcnRuciA8IDgpID8gMCA6IDQpOworCXBvcnRwLT51YXJ0YWRkciA9IChwb3J0cC0+cG9ydG5yICYgMHgwNykgPDwgNDsKKwlwb3J0cC0+cGFnZW5yID0gcGFuZWxwLT5wYWdlbnI7CisJcG9ydHAtPmh3aWQgPSAweDE7CisKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgSU9QQ1IsIElPUENSX1NFVFNJR1MpOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2V0IHVwIHRoZSBzYzI2MTk4IHJlZ2lzdGVycyBmb3IgYSBwb3J0IGJhc2VkIG9uIHRoZSB0ZXJtaW9zIHBvcnQKKyAqCXNldHRpbmdzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4c2V0cG9ydChzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3QgdGVybWlvcyAqdGlvc3ApCit7CisJc3RsYnJkX3QJKmJyZHA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1bnNpZ25lZCBpbnQJYmF1ZHJhdGU7CisJdW5zaWduZWQgY2hhcgltcjAsIG1yMSwgbXIyLCBjbGs7CisJdW5zaWduZWQgY2hhcglpbXJvbiwgaW1yb2ZmLCBpb3ByLCBpcHI7CisKKwltcjAgPSAwOworCW1yMSA9IDA7CisJbXIyID0gMDsKKwljbGsgPSAwOworCWlvcHIgPSAwOworCWltcm9uID0gMDsKKwlpbXJvZmYgPSAwOworCisJYnJkcCA9IHN0bF9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGJyZF90ICopIE5VTEwpCisJCXJldHVybjsKKworLyoKKyAqCVNldCB1cCB0aGUgUlggY2hhciBpZ25vcmUgbWFzayB3aXRoIHRob3NlIFJYIGVycm9yIHR5cGVzIHdlCisgKgljYW4gaWdub3JlLgorICovCisJcG9ydHAtPnJ4aWdub3JlbXNrID0gMDsKKwlpZiAodGlvc3AtPmNfaWZsYWcgJiBJR05QQVIpCisJCXBvcnRwLT5yeGlnbm9yZW1zayB8PSAoU1JfUlhQQVJJVFkgfCBTUl9SWEZSQU1JTkcgfAorCQkJU1JfUlhPVkVSUlVOKTsKKwlpZiAodGlvc3AtPmNfaWZsYWcgJiBJR05CUkspCisJCXBvcnRwLT5yeGlnbm9yZW1zayB8PSBTUl9SWEJSRUFLOworCisJcG9ydHAtPnJ4bWFya21zayA9IFNSX1JYT1ZFUlJVTjsKKwlpZiAodGlvc3AtPmNfaWZsYWcgJiAoSU5QQ0sgfCBQQVJNUkspKQorCQlwb3J0cC0+cnhtYXJrbXNrIHw9IChTUl9SWFBBUklUWSB8IFNSX1JYRlJBTUlORyk7CisJaWYgKHRpb3NwLT5jX2lmbGFnICYgQlJLSU5UKQorCQlwb3J0cC0+cnhtYXJrbXNrIHw9IFNSX1JYQlJFQUs7CisKKy8qCisgKglHbyB0aHJvdWdoIHRoZSBjaGFyIHNpemUsIHBhcml0eSBhbmQgc3RvcCBiaXRzIGFuZCBzZXQgYWxsIHRoZQorICoJb3B0aW9uIHJlZ2lzdGVyIGFwcHJvcHJpYXRlbHkuCisgKi8KKwlzd2l0Y2ggKHRpb3NwLT5jX2NmbGFnICYgQ1NJWkUpIHsKKwljYXNlIENTNToKKwkJbXIxIHw9IE1SMV9DUzU7CisJCWJyZWFrOworCWNhc2UgQ1M2OgorCQltcjEgfD0gTVIxX0NTNjsKKwkJYnJlYWs7CisJY2FzZSBDUzc6CisJCW1yMSB8PSBNUjFfQ1M3OworCQlicmVhazsKKwlkZWZhdWx0OgorCQltcjEgfD0gTVIxX0NTODsKKwkJYnJlYWs7CisJfQorCisJaWYgKHRpb3NwLT5jX2NmbGFnICYgQ1NUT1BCKQorCQltcjIgfD0gTVIyX1NUT1AyOworCWVsc2UKKwkJbXIyIHw9IE1SMl9TVE9QMTsKKworCWlmICh0aW9zcC0+Y19jZmxhZyAmIFBBUkVOQikgeworCQlpZiAodGlvc3AtPmNfY2ZsYWcgJiBQQVJPREQpCisJCQltcjEgfD0gKE1SMV9QQVJFTkIgfCBNUjFfUEFST0REKTsKKwkJZWxzZQorCQkJbXIxIHw9IChNUjFfUEFSRU5CIHwgTVIxX1BBUkVWRU4pOworCX0gZWxzZSB7CisJCW1yMSB8PSBNUjFfUEFSTk9ORTsKKwl9CisKKwltcjEgfD0gTVIxX0VSUkJMT0NLOworCisvKgorICoJU2V0IHRoZSBSWCBGSUZPIHRocmVzaG9sZCBhdCA4IGNoYXJzLiBUaGlzIGdpdmVzIGEgYml0IG9mIGJyZWF0aGluZworICoJc3BhY2UgZm9yIGhhcmR3YXJlIGZsb3cgY29udHJvbCBhbmQgdGhlIGxpa2UuIFRoaXMgc2hvdWxkIGJlIHNldCB0bworICoJVk1JTi4KKyAqLworCW1yMiB8PSBNUjJfUlhGSUZPSEFMRjsKKworLyoKKyAqCUNhbGN1bGF0ZSB0aGUgYmF1ZCByYXRlIHRpbWVycy4gRm9yIG5vdyB3ZSB3aWxsIGp1c3QgYXNzdW1lIHRoYXQKKyAqCXRoZSBpbnB1dCBhbmQgb3V0cHV0IGJhdWQgYXJlIHRoZSBzYW1lLiBUaGUgc2MyNjE5OCBoYXMgYSBmaXhlZAorICoJYmF1ZCByYXRlIHRhYmxlLCBzbyBvbmx5IGRpc2NyZXRlIGJhdWQgcmF0ZXMgcG9zc2libGUuCisgKi8KKwliYXVkcmF0ZSA9IHRpb3NwLT5jX2NmbGFnICYgQ0JBVUQ7CisJaWYgKGJhdWRyYXRlICYgQ0JBVURFWCkgeworCQliYXVkcmF0ZSAmPSB+Q0JBVURFWDsKKwkJaWYgKChiYXVkcmF0ZSA8IDEpIHx8IChiYXVkcmF0ZSA+IDQpKQorCQkJdGlvc3AtPmNfY2ZsYWcgJj0gfkNCQVVERVg7CisJCWVsc2UKKwkJCWJhdWRyYXRlICs9IDE1OworCX0KKwliYXVkcmF0ZSA9IHN0bF9iYXVkcmF0ZXNbYmF1ZHJhdGVdOworCWlmICgodGlvc3AtPmNfY2ZsYWcgJiBDQkFVRCkgPT0gQjM4NDAwKSB7CisJCWlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKKwkJCWJhdWRyYXRlID0gNTc2MDA7CisJCWVsc2UgaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKKwkJCWJhdWRyYXRlID0gMTE1MjAwOworCQllbHNlIGlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9TSEkpCisJCQliYXVkcmF0ZSA9IDIzMDQwMDsKKwkJZWxzZSBpZiAoKHBvcnRwLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfV0FSUCkKKwkJCWJhdWRyYXRlID0gNDYwODAwOworCQllbHNlIGlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKQorCQkJYmF1ZHJhdGUgPSAocG9ydHAtPmJhdWRfYmFzZSAvIHBvcnRwLT5jdXN0b21fZGl2aXNvcik7CisJfQorCWlmIChiYXVkcmF0ZSA+IFNUTF9TQzI2MTk4TUFYQkFVRCkKKwkJYmF1ZHJhdGUgPSBTVExfU0MyNjE5OE1BWEJBVUQ7CisKKwlpZiAoYmF1ZHJhdGUgPiAwKSB7CisJCWZvciAoY2xrID0gMDsgKGNsayA8IFNDMjYxOThfTlJCQVVEUyk7IGNsaysrKSB7CisJCQlpZiAoYmF1ZHJhdGUgPD0gc2MyNjE5OF9iYXVkdGFibGVbY2xrXSkKKwkJCQlicmVhazsKKwkJfQorCX0KKworLyoKKyAqCUNoZWNrIHdoYXQgZm9ybSBvZiBtb2RlbSBzaWduYWxpbmcgaXMgcmVxdWlyZWQgYW5kIHNldCBpdCB1cC4KKyAqLworCWlmICh0aW9zcC0+Y19jZmxhZyAmIENMT0NBTCkgeworCQlwb3J0cC0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworCX0gZWxzZSB7CisJCWlvcHIgfD0gSU9QUl9EQ0RDT1M7CisJCWltcm9uIHw9IElSX0lPUE9SVDsKKwkJcG9ydHAtPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCX0KKworLyoKKyAqCVNldHVwIHNjMjYxOTggZW5oYW5jZWQgbW9kZXMgaWYgd2UgY2FuLiBJbiBwYXJ0aWN1bGFyIHdlIHdhbnQgdG8KKyAqCWhhbmRsZSBhcyBtdWNoIG9mIHRoZSBmbG93IGNvbnRyb2wgYXMgcG9zc2libGUgYXV0b21hdGljYWxseS4gQXMKKyAqCXdlbGwgYXMgc2F2aW5nIGEgZmV3IENQVSBjeWNsZXMgaXQgd2lsbCBhbHNvIGdyZWF0bHkgaW1wcm92ZSBmbG93CisgKgljb250cm9sIHJlbGlhYmlsaXR5LgorICovCisJaWYgKHRpb3NwLT5jX2lmbGFnICYgSVhPTikgeworCQltcjAgfD0gTVIwX1NXRlRYIHwgTVIwX1NXRlQ7CisJCWltcm9uIHw9IElSX1hPTlhPRkY7CisJfSBlbHNlIHsKKwkJaW1yb2ZmIHw9IElSX1hPTlhPRkY7CisJfQorCWlmICh0aW9zcC0+Y19pZmxhZyAmIElYT0ZGKQorCQltcjAgfD0gTVIwX1NXRlJYOworCisJaWYgKHRpb3NwLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQltcjIgfD0gTVIyX0FVVE9DVFM7CisJCW1yMSB8PSBNUjFfQVVUT1JUUzsKKwl9CisKKy8qCisgKglBbGwgc2MyNjE5OCByZWdpc3RlciB2YWx1ZXMgY2FsY3VsYXRlZCBzbyBnbyB0aHJvdWdoIGFuZCBzZXQKKyAqCXRoZW0gYWxsIHVwLgorICovCisKKyNpZmRlZiBERUJVRworCXByaW50aygiU0VUUE9SVDogcG9ydG5yPSVkIHBhbmVsbnI9JWQgYnJkbnI9JWRcbiIsCisJCXBvcnRwLT5wb3J0bnIsIHBvcnRwLT5wYW5lbG5yLCBwb3J0cC0+YnJkbnIpOworCXByaW50aygiICAgIG1yMD0leCBtcjE9JXggbXIyPSV4IGNsaz0leFxuIiwgbXIwLCBtcjEsIG1yMiwgY2xrKTsKKwlwcmludGsoIiAgICBpb3ByPSV4IGltcm9uPSV4IGltcm9mZj0leFxuIiwgaW9wciwgaW1yb24sIGltcm9mZik7CisJcHJpbnRrKCIgICAgc2NocjE9JXggc2NocjI9JXggc2NocjM9JXggc2NocjQ9JXhcbiIsCisJCXRpb3NwLT5jX2NjW1ZTVEFSVF0sIHRpb3NwLT5jX2NjW1ZTVE9QXSwKKwkJdGlvc3AtPmNfY2NbVlNUQVJUXSwgdGlvc3AtPmNfY2NbVlNUT1BdKTsKKyNlbmRpZgorCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIElNUiwgMCk7CisJc3RsX3NjMjYxOTh1cGRhdGVyZWcocG9ydHAsIE1SMCwgbXIwKTsKKwlzdGxfc2MyNjE5OHVwZGF0ZXJlZyhwb3J0cCwgTVIxLCBtcjEpOworCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBTQ0NSLCBDUl9SWEVSUkJMT0NLKTsKKwlzdGxfc2MyNjE5OHVwZGF0ZXJlZyhwb3J0cCwgTVIyLCBtcjIpOworCXN0bF9zYzI2MTk4dXBkYXRlcmVnKHBvcnRwLCBJT1BJT1IsCisJCSgoc3RsX3NjMjYxOThnZXRyZWcocG9ydHAsIElPUElPUikgJiB+SVBSX0NIQU5HRU1BU0spIHwgaW9wcikpOworCisJaWYgKGJhdWRyYXRlID4gMCkgeworCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgVFhDU1IsIGNsayk7CisJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBSWENTUiwgY2xrKTsKKwl9CisKKwlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgWE9OQ1IsIHRpb3NwLT5jX2NjW1ZTVEFSVF0pOworCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBYT0ZGQ1IsIHRpb3NwLT5jX2NjW1ZTVE9QXSk7CisKKwlpcHIgPSBzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgSVBSKTsKKwlpZiAoaXByICYgSVBSX0RDRCkKKwkJcG9ydHAtPnNpZ3MgJj0gflRJT0NNX0NEOworCWVsc2UKKwkJcG9ydHAtPnNpZ3MgfD0gVElPQ01fQ0Q7CisKKwlwb3J0cC0+aW1yID0gKHBvcnRwLT5pbXIgJiB+aW1yb2ZmKSB8IGltcm9uOworCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBJTVIsIHBvcnRwLT5pbXIpOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2V0IHRoZSBzdGF0ZSBvZiB0aGUgRFRSIGFuZCBSVFMgc2lnbmFscy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHNldHNpZ25hbHMoc3RscG9ydF90ICpwb3J0cCwgaW50IGR0ciwgaW50IHJ0cykKK3sKKwl1bnNpZ25lZCBjaGFyCWlvcGlvcm9uLCBpb3Bpb3JvZmY7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfc2MyNjE5OHNldHNpZ25hbHMocG9ydHA9JXgsZHRyPSVkLHJ0cz0lZClcbiIsCisJCShpbnQpIHBvcnRwLCBkdHIsIHJ0cyk7CisjZW5kaWYKKworCWlvcGlvcm9uID0gMDsKKwlpb3Bpb3JvZmYgPSAwOworCWlmIChkdHIgPT0gMCkKKwkJaW9waW9yb2ZmIHw9IElQUl9EVFI7CisJZWxzZSBpZiAoZHRyID4gMCkKKwkJaW9waW9yb24gfD0gSVBSX0RUUjsKKwlpZiAocnRzID09IDApCisJCWlvcGlvcm9mZiB8PSBJUFJfUlRTOworCWVsc2UgaWYgKHJ0cyA+IDApCisJCWlvcGlvcm9uIHw9IElQUl9SVFM7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgSU9QSU9SLAorCQkoKHN0bF9zYzI2MTk4Z2V0cmVnKHBvcnRwLCBJT1BJT1IpICYgfmlvcGlvcm9mZikgfCBpb3Bpb3JvbikpOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgc2lnbmFscy4KKyAqLworCitzdGF0aWMgaW50IHN0bF9zYzI2MTk4Z2V0c2lnbmFscyhzdGxwb3J0X3QgKnBvcnRwKQoreworCXVuc2lnbmVkIGNoYXIJaXByOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50CQlzaWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zYzI2MTk4Z2V0c2lnbmFscyhwb3J0cD0leClcbiIsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJaXByID0gc3RsX3NjMjYxOThnZXRyZWcocG9ydHAsIElQUik7CisJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJc2lncyA9IDA7CisJc2lncyB8PSAoaXByICYgSVBSX0RDRCkgPyAwIDogVElPQ01fQ0Q7CisJc2lncyB8PSAoaXByICYgSVBSX0NUUykgPyAwIDogVElPQ01fQ1RTOworCXNpZ3MgfD0gKGlwciAmIElQUl9EVFIpID8gMDogVElPQ01fRFRSOworCXNpZ3MgfD0gKGlwciAmIElQUl9SVFMpID8gMDogVElPQ01fUlRTOworCXNpZ3MgfD0gVElPQ01fRFNSOworCXJldHVybihzaWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRW5hYmxlL0Rpc2FibGUgdGhlIFRyYW5zbWl0dGVyIGFuZC9vciBSZWNlaXZlci4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OGVuYWJsZXJ4dHgoc3RscG9ydF90ICpwb3J0cCwgaW50IHJ4LCBpbnQgdHgpCit7CisJdW5zaWduZWQgY2hhcgljY3I7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfc2MyNjE5OGVuYWJsZXJ4dHgocG9ydHA9JXgscng9JWQsdHg9JWQpXG4iLAorCQkoaW50KSBwb3J0cCwgcngsIHR4KTsKKyNlbmRpZgorCisJY2NyID0gcG9ydHAtPmNyZW5hYmxlOworCWlmICh0eCA9PSAwKQorCQljY3IgJj0gfkNSX1RYRU5BQkxFOworCWVsc2UgaWYgKHR4ID4gMCkKKwkJY2NyIHw9IENSX1RYRU5BQkxFOworCWlmIChyeCA9PSAwKQorCQljY3IgJj0gfkNSX1JYRU5BQkxFOworCWVsc2UgaWYgKHJ4ID4gMCkKKwkJY2NyIHw9IENSX1JYRU5BQkxFOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIFNDQ1IsIGNjcik7CisJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOworCXBvcnRwLT5jcmVuYWJsZSA9IGNjcjsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU3RhcnQvc3RvcCB0aGUgVHJhbnNtaXR0ZXIgYW5kL29yIFJlY2VpdmVyLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4c3RhcnRyeHR4KHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KQoreworCXVuc2lnbmVkIGNoYXIJaW1yOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOThzdGFydHJ4dHgocG9ydHA9JXgscng9JWQsdHg9JWQpXG4iLAorCQkoaW50KSBwb3J0cCwgcngsIHR4KTsKKyNlbmRpZgorCisJaW1yID0gcG9ydHAtPmltcjsKKwlpZiAodHggPT0gMCkKKwkJaW1yICY9IH5JUl9UWFJEWTsKKwllbHNlIGlmICh0eCA9PSAxKQorCQlpbXIgfD0gSVJfVFhSRFk7CisJaWYgKHJ4ID09IDApCisJCWltciAmPSB+KElSX1JYUkRZIHwgSVJfUlhCUkVBSyB8IElSX1JYV0FUQ0hET0cpOworCWVsc2UgaWYgKHJ4ID4gMCkKKwkJaW1yIHw9IElSX1JYUkRZIHwgSVJfUlhCUkVBSyB8IElSX1JYV0FUQ0hET0c7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKKwlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgSU1SLCBpbXIpOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlwb3J0cC0+aW1yID0gaW1yOworCWlmICh0eCA+IDApCisJCXNldF9iaXQoQVNZSV9UWEJVU1ksICZwb3J0cC0+aXN0YXRlKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBmcm9tIHRoaXMgcG9ydC4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OGRpc2FibGVpbnRycyhzdGxwb3J0X3QgKnBvcnRwKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOThkaXNhYmxlaW50cnMocG9ydHA9JXgpXG4iLCAoaW50KSBwb3J0cCk7CisjZW5kaWYKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCXBvcnRwLT5pbXIgPSAwOworCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBJTVIsIDApOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHNlbmRicmVhayhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOThzZW5kYnJlYWsocG9ydHA9JXgsbGVuPSVkKVxuIiwgKGludCkgcG9ydHAsIGxlbik7CisjZW5kaWYKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCWlmIChsZW4gPT0gMSkgeworCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgU0NDUiwgQ1JfVFhTVEFSVEJSRUFLKTsKKwkJcG9ydHAtPnN0YXRzLnR4YnJlYWtzKys7CisJfSBlbHNlIHsKKwkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIFNDQ1IsIENSX1RYU1RPUEJSRUFLKTsKKwl9CisJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUYWtlIGZsb3cgY29udHJvbCBhY3Rpb25zLi4uCisgKi8KKworc3RhdGljIHZvaWQgc3RsX3NjMjYxOThmbG93Y3RybChzdGxwb3J0X3QgKnBvcnRwLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwl1bnNpZ25lZCBjaGFyCQltcjA7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOThmbG93Y3RybChwb3J0cD0leCxzdGF0ZT0leClcbiIsIChpbnQpIHBvcnRwLCBzdGF0ZSk7CisjZW5kaWYKKworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwl0dHkgPSBwb3J0cC0+dHR5OworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCisJaWYgKHN0YXRlKSB7CisJCWlmICh0dHktPnRlcm1pb3MtPmNfaWZsYWcgJiBJWE9GRikgeworCQkJbXIwID0gc3RsX3NjMjYxOThnZXRyZWcocG9ydHAsIE1SMCk7CisJCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgTVIwLCAobXIwICYgfk1SMF9TV0ZSWFRYKSk7CisJCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgU0NDUiwgQ1JfVFhTRU5EWE9OKTsKKwkJCW1yMCB8PSBNUjBfU1dGUlg7CisJCQlwb3J0cC0+c3RhdHMucnh4b24rKzsKKwkJCXN0bF9zYzI2MTk4d2FpdChwb3J0cCk7CisJCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgTVIwLCBtcjApOworCQl9CisvKgorICoJCVF1ZXN0aW9uOiBzaG91bGQgd2UgcmV0dXJuIFJUUyB0byB3aGF0IGl0IHdhcyBiZWZvcmU/IEl0IG1heQorICoJCWhhdmUgYmVlbiBzZXQgYnkgYW4gaW9jdGwuLi4gU3VwcG9zZSBub3QsIHNpbmNlIGlmIHlvdSBoYXZlCisgKgkJaGFyZHdhcmUgZmxvdyBjb250cm9sIHNldCB0aGVuIGl0IGlzIHByZXR0eSBzaWxseSB0byBnbyBhbmQKKyAqCQlzZXQgdGhlIFJUUyBsaW5lIGJ5IGhhbmQuCisgKi8KKwkJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBNUjEsCisJCQkJKHN0bF9zYzI2MTk4Z2V0cmVnKHBvcnRwLCBNUjEpIHwgTVIxX0FVVE9SVFMpKTsKKwkJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBJT1BJT1IsCisJCQkJKHN0bF9zYzI2MTk4Z2V0cmVnKHBvcnRwLCBJT1BJT1IpIHwgSU9QUl9SVFMpKTsKKwkJCXBvcnRwLT5zdGF0cy5yeHJ0c29uKys7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodHR5LT50ZXJtaW9zLT5jX2lmbGFnICYgSVhPRkYpIHsKKwkJCW1yMCA9IHN0bF9zYzI2MTk4Z2V0cmVnKHBvcnRwLCBNUjApOworCQkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIE1SMCwgKG1yMCAmIH5NUjBfU1dGUlhUWCkpOworCQkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIFNDQ1IsIENSX1RYU0VORFhPRkYpOworCQkJbXIwICY9IH5NUjBfU1dGUlg7CisJCQlwb3J0cC0+c3RhdHMucnh4b2ZmKys7CisJCQlzdGxfc2MyNjE5OHdhaXQocG9ydHApOworCQkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIE1SMCwgbXIwKTsKKwkJfQorCQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIE1SMSwKKwkJCQkoc3RsX3NjMjYxOThnZXRyZWcocG9ydHAsIE1SMSkgJiB+TVIxX0FVVE9SVFMpKTsKKwkJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBJT1BJT1IsCisJCQkJKHN0bF9zYzI2MTk4Z2V0cmVnKHBvcnRwLCBJT1BJT1IpICYgfklPUFJfUlRTKSk7CisJCQlwb3J0cC0+c3RhdHMucnhydHNvZmYrKzsKKwkJfQorCX0KKworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2VuZCBhIGZsb3cgY29udHJvbCBjaGFyYWN0ZXIuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX3NjMjYxOThzZW5kZmxvdyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwl1bnNpZ25lZCBjaGFyCQltcjA7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOThzZW5kZmxvdyhwb3J0cD0leCxzdGF0ZT0leClcbiIsIChpbnQpIHBvcnRwLCBzdGF0ZSk7CisjZW5kaWYKKworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwl0dHkgPSBwb3J0cC0+dHR5OworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCWlmIChzdGF0ZSkgeworCQltcjAgPSBzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgTVIwKTsKKwkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIE1SMCwgKG1yMCAmIH5NUjBfU1dGUlhUWCkpOworCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgU0NDUiwgQ1JfVFhTRU5EWE9OKTsKKwkJbXIwIHw9IE1SMF9TV0ZSWDsKKwkJcG9ydHAtPnN0YXRzLnJ4eG9uKys7CisJCXN0bF9zYzI2MTk4d2FpdChwb3J0cCk7CisJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBNUjAsIG1yMCk7CisJfSBlbHNlIHsKKwkJbXIwID0gc3RsX3NjMjYxOThnZXRyZWcocG9ydHAsIE1SMCk7CisJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBNUjAsIChtcjAgJiB+TVIwX1NXRlJYVFgpKTsKKwkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIFNDQ1IsIENSX1RYU0VORFhPRkYpOworCQltcjAgJj0gfk1SMF9TV0ZSWDsKKwkJcG9ydHAtPnN0YXRzLnJ4eG9mZisrOworCQlzdGxfc2MyNjE5OHdhaXQocG9ydHApOworCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgTVIwLCBtcjApOworCX0KKwlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsX3NjMjYxOThmbHVzaChzdGxwb3J0X3QgKnBvcnRwKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOThmbHVzaChwb3J0cD0leClcbiIsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCisJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIFNDQ1IsIENSX1RYUkVTRVQpOworCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBTQ0NSLCBwb3J0cC0+Y3JlbmFibGUpOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlwb3J0cC0+dHgudGFpbCA9IHBvcnRwLT50eC5oZWFkOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgZGF0YSBmbG93IG9uIHRoaXMgcG9ydC4gVGhpcyBpcyBvbmx5CisgKglyZWFsbHkgaW50ZXJyZXN0aW5nIHdoZW4gZGV0ZXJtaW5pbmcgaWYgZGF0YSBoYXMgZnVsbHkgY29tcGxldGVkCisgKgl0cmFuc21pc3Npb24gb3Igbm90Li4uIFRoZSBzYzI2MTk4IGludGVycnVwdCBzY2hlbWUgY2Fubm90CisgKglkZXRlcm1pbmUgd2hlbiBhbGwgZGF0YSBoYXMgYWN0dWFsbHkgZHJhaW5lZCwgc28gd2UgbmVlZCB0bworICoJY2hlY2sgdGhlIHBvcnQgc3RhdHVzeSByZWdpc3RlciB0byBiZSBzdXJlLgorICovCisKK3N0YXRpYyBpbnQgc3RsX3NjMjYxOThkYXRhc3RhdGUoc3RscG9ydF90ICpwb3J0cCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJc3I7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOThkYXRhc3RhdGUocG9ydHA9JXgpXG4iLCAoaW50KSBwb3J0cCk7CisjZW5kaWYKKworCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCXJldHVybigwKTsKKwlpZiAodGVzdF9iaXQoQVNZSV9UWEJVU1ksICZwb3J0cC0+aXN0YXRlKSkKKwkJcmV0dXJuKDEpOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CisJc3IgPSBzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgU1IpOworCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybigoc3IgJiBTUl9UWEVNUFRZKSA/IDAgOiAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGVsYXkgZm9yIGEgc21hbGwgYW1vdW50IG9mIHRpbWUsIHRvIGdpdmUgdGhlIHNjMjYxOTggYSBjaGFuY2UKKyAqCXRvIHByb2Nlc3MgYSBjb21tYW5kLi4uCisgKi8KKworc3RhdGljIHZvaWQgc3RsX3NjMjYxOTh3YWl0KHN0bHBvcnRfdCAqcG9ydHApCit7CisJaW50CWk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOTh3YWl0KHBvcnRwPSV4KVxuIiwgKGludCkgcG9ydHApOworI2VuZGlmCisKKwlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyAoaSA8IDIwKTsgaSsrKQorCQlzdGxfc2MyNjE5OGdldGdsb2JyZWcocG9ydHAsIFRTVFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJZiB3ZSBhcmUgVFggZmxvdyBjb250cm9sbGVkIGFuZCBpbiBJWEFOWSBtb2RlIHRoZW4gd2UgbWF5CisgKgluZWVkIHRvIHVuZmxvdyBjb250cm9sIGhlcmUuIFdlIGdvdHRhIGRvIHRoaXMgYmVjYXVzZSBvZiB0aGUKKyAqCWF1dG9tYXRpYyBmbG93IGNvbnRyb2wgbW9kZXMgb2YgdGhlIHNjMjYxOTguCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN0bF9zYzI2MTk4dHh1bmZsb3coc3RscG9ydF90ICpwb3J0cCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwl1bnNpZ25lZCBjaGFyCW1yMDsKKworCW1yMCA9IHN0bF9zYzI2MTk4Z2V0cmVnKHBvcnRwLCBNUjApOworCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBNUjAsIChtcjAgJiB+TVIwX1NXRlJYVFgpKTsKKwlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgU0NDUiwgQ1JfSE9TVFhPTik7CisJc3RsX3NjMjYxOTh3YWl0KHBvcnRwKTsKKwlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgTVIwLCBtcjApOworCWNsZWFyX2JpdChBU1lJX1RYRkxPV0VELCAmcG9ydHAtPmlzdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIHNjMjYxOTggcGFuZWxzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4aW50cihzdGxwYW5lbF90ICpwYW5lbHAsIHVuc2lnbmVkIGludCBpb2Jhc2UpCit7CisJc3RscG9ydF90CSpwb3J0cDsKKwl1bnNpZ25lZCBpbnQJaWFjazsKKworLyogCisgKglXb3JrIGFyb3VuZCBidWcgaW4gc2MyNjE5OCBjaGlwLi4uIENhbm5vdCBoYXZlIEE2IGFkZHJlc3MKKyAqCWxpbmUgb2YgVUFSVCBoaWdoLCBlbHNlIGlhY2sgd2lsbCBiZSByZXR1cm5lZCBhcyAwLgorICovCisJb3V0YigwLCAoaW9iYXNlICsgMSkpOworCisJaWFjayA9IGluYihpb2Jhc2UgKyBYUF9JQUNLKTsKKwlwb3J0cCA9IHBhbmVscC0+cG9ydHNbKGlhY2sgJiBJVlJfQ0hBTk1BU0spICsgKChpb2Jhc2UgJiAweDQpIDw8IDEpXTsKKworCWlmIChpYWNrICYgSVZSX1JYREFUQSkKKwkJc3RsX3NjMjYxOThyeGlzcihwb3J0cCwgaWFjayk7CisJZWxzZSBpZiAoaWFjayAmIElWUl9UWERBVEEpCisJCXN0bF9zYzI2MTk4dHhpc3IocG9ydHApOworCWVsc2UKKwkJc3RsX3NjMjYxOThvdGhlcmlzcihwb3J0cCwgaWFjayk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyLiBUaGlzIGhhcyBnb3R0YSBiZSBmYXN0ISAgSGFuZGxpbmcgVFgKKyAqCWNoYXJzIGlzIHByZXR0eSBzaW1wbGUsIHN0dWZmIGFzIG1hbnkgYXMgcG9zc2libGUgZnJvbSB0aGUgVFggYnVmZmVyCisgKglpbnRvIHRoZSBzYzI2MTk4IEZJRk8uCisgKglJbiBwcmFjdGljZSBpdCBpcyBwb3NzaWJsZSB0aGF0IGludGVycnVwdHMgYXJlIGVuYWJsZWQgYnV0IHRoYXQgdGhlCisgKglwb3J0IGhhcyBiZWVuIGh1bmcgdXAuIE5lZWQgdG8gaGFuZGxlIG5vdCBoYXZpbmcgYW55IFRYIGJ1ZmZlciBoZXJlLAorICoJdGhpcyBpcyBkb25lIGJ5IHVzaW5nIHRoZSBzaWRlIGVmZmVjdCB0aGF0IGhlYWQgYW5kIHRhaWwgd2lsbCBhbHNvCisgKgliZSBOVUxMIGlmIHRoZSBidWZmZXIgaGFzIGJlZW4gZnJlZWQuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX3NjMjYxOTh0eGlzcihzdGxwb3J0X3QgKnBvcnRwKQoreworCXVuc2lnbmVkIGludAlpb2FkZHI7CisJdW5zaWduZWQgY2hhcgltcjA7CisJaW50CQlsZW4sIHN0bGVuOworCWNoYXIJCSpoZWFkLCAqdGFpbDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxfc2MyNjE5OHR4aXNyKHBvcnRwPSV4KVxuIiwgKGludCkgcG9ydHApOworI2VuZGlmCisKKwlpb2FkZHIgPSBwb3J0cC0+aW9hZGRyOworCWhlYWQgPSBwb3J0cC0+dHguaGVhZDsKKwl0YWlsID0gcG9ydHAtPnR4LnRhaWw7CisJbGVuID0gKGhlYWQgPj0gdGFpbCkgPyAoaGVhZCAtIHRhaWwpIDogKFNUTF9UWEJVRlNJWkUgLSAodGFpbCAtIGhlYWQpKTsKKwlpZiAoKGxlbiA9PSAwKSB8fCAoKGxlbiA8IFNUTF9UWEJVRkxPVykgJiYKKwkgICAgKHRlc3RfYml0KEFTWUlfVFhMT1csICZwb3J0cC0+aXN0YXRlKSA9PSAwKSkpIHsKKwkJc2V0X2JpdChBU1lJX1RYTE9XLCAmcG9ydHAtPmlzdGF0ZSk7CisJCXNjaGVkdWxlX3dvcmsoJnBvcnRwLT50cXVldWUpOyAKKwl9CisKKwlpZiAobGVuID09IDApIHsKKwkJb3V0YigoTVIwIHwgcG9ydHAtPnVhcnRhZGRyKSwgKGlvYWRkciArIFhQX0FERFIpKTsKKwkJbXIwID0gaW5iKGlvYWRkciArIFhQX0RBVEEpOworCQlpZiAoKG1yMCAmIE1SMF9UWE1BU0spID09IE1SMF9UWEVNUFRZKSB7CisJCQlwb3J0cC0+aW1yICY9IH5JUl9UWFJEWTsKKwkJCW91dGIoKElNUiB8IHBvcnRwLT51YXJ0YWRkciksIChpb2FkZHIgKyBYUF9BRERSKSk7CisJCQlvdXRiKHBvcnRwLT5pbXIsIChpb2FkZHIgKyBYUF9EQVRBKSk7CisJCQljbGVhcl9iaXQoQVNZSV9UWEJVU1ksICZwb3J0cC0+aXN0YXRlKTsKKwkJfSBlbHNlIHsKKwkJCW1yMCB8PSAoKG1yMCAmIH5NUjBfVFhNQVNLKSB8IE1SMF9UWEVNUFRZKTsKKwkJCW91dGIobXIwLCAoaW9hZGRyICsgWFBfREFUQSkpOworCQl9CisJfSBlbHNlIHsKKwkJbGVuID0gTUlOKGxlbiwgU0MyNjE5OF9UWEZJRk9TSVpFKTsKKwkJcG9ydHAtPnN0YXRzLnR4dG90YWwgKz0gbGVuOworCQlzdGxlbiA9IE1JTihsZW4sICgocG9ydHAtPnR4LmJ1ZiArIFNUTF9UWEJVRlNJWkUpIC0gdGFpbCkpOworCQlvdXRiKEdUWEZJRk8sIChpb2FkZHIgKyBYUF9BRERSKSk7CisJCW91dHNiKChpb2FkZHIgKyBYUF9EQVRBKSwgdGFpbCwgc3RsZW4pOworCQlsZW4gLT0gc3RsZW47CisJCXRhaWwgKz0gc3RsZW47CisJCWlmICh0YWlsID49IChwb3J0cC0+dHguYnVmICsgU1RMX1RYQlVGU0laRSkpCisJCQl0YWlsID0gcG9ydHAtPnR4LmJ1ZjsKKwkJaWYgKGxlbiA+IDApIHsKKwkJCW91dHNiKChpb2FkZHIgKyBYUF9EQVRBKSwgdGFpbCwgbGVuKTsKKwkJCXRhaWwgKz0gbGVuOworCQl9CisJCXBvcnRwLT50eC50YWlsID0gdGFpbDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJlY2VpdmUgY2hhcmFjdGVyIGludGVycnVwdCBoYW5kbGVyLiBEZXRlcm1pbmUgaWYgd2UgaGF2ZSBnb29kIGNoYXJzCisgKglvciBiYWQgY2hhcnMgYW5kIHRoZW4gcHJvY2VzcyBhcHByb3ByaWF0ZWx5LiBHb29kIGNoYXJzIGFyZSBlYXN5CisgKglqdXN0IHNob3ZlIHRoZSBsb3QgaW50byB0aGUgUlggYnVmZmVyIGFuZCBzZXQgYWxsIHN0YXR1cyBieXRlIHRvIDAuCisgKglJZiBhIGJhZCBSWCBjaGFyIHRoZW4gcHJvY2VzcyBhcyByZXF1aXJlZC4gVGhpcyByb3V0aW5lIG5lZWRzIHRvIGJlCisgKglmYXN0ISAgSW4gcHJhY3RpY2UgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBnZXQgYW4gaW50ZXJydXB0IG9uIGEgcG9ydAorICoJdGhhdCBpcyBjbG9zZWQuIFRoaXMgY2FuIGhhcHBlbiBvbiBoYW5ndXBzIC0gc2luY2UgdGhleSBjb21wbGV0ZWx5CisgKglzaHV0ZG93biBhIHBvcnQgbm90IGluIHVzZXIgY29udGV4dC4gTmVlZCB0byBoYW5kbGUgdGhpcyBjYXNlLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4cnhpc3Ioc3RscG9ydF90ICpwb3J0cCwgdW5zaWduZWQgaW50IGlhY2spCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwl1bnNpZ25lZCBpbnQJCWxlbiwgYnVmbGVuLCBpb2FkZHI7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsX3NjMjYxOThyeGlzcihwb3J0cD0leCxpYWNrPSV4KVxuIiwgKGludCkgcG9ydHAsIGlhY2spOworI2VuZGlmCisKKwl0dHkgPSBwb3J0cC0+dHR5OworCWlvYWRkciA9IHBvcnRwLT5pb2FkZHI7CisJb3V0YihHSUJDUiwgKGlvYWRkciArIFhQX0FERFIpKTsKKwlsZW4gPSBpbmIoaW9hZGRyICsgWFBfREFUQSkgKyAxOworCisJaWYgKChpYWNrICYgSVZSX1RZUEVNQVNLKSA9PSBJVlJfUlhEQVRBKSB7CisJCWlmICgodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKSB8fAorCQkgICAgKHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPT0gKGNoYXIgKikgTlVMTCkgfHwKKwkJICAgICgoYnVmbGVuID0gVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudCkgPT0gMCkpIHsKKwkJCWxlbiA9IE1JTihsZW4sIHNpemVvZihzdGxfdW53YW50ZWQpKTsKKwkJCW91dGIoR1JYRklGTywgKGlvYWRkciArIFhQX0FERFIpKTsKKwkJCWluc2IoKGlvYWRkciArIFhQX0RBVEEpLCAmc3RsX3Vud2FudGVkWzBdLCBsZW4pOworCQkJcG9ydHAtPnN0YXRzLnJ4bG9zdCArPSBsZW47CisJCQlwb3J0cC0+c3RhdHMucnh0b3RhbCArPSBsZW47CisJCX0gZWxzZSB7CisJCQlsZW4gPSBNSU4obGVuLCBidWZsZW4pOworCQkJaWYgKGxlbiA+IDApIHsKKwkJCQlvdXRiKEdSWEZJRk8sIChpb2FkZHIgKyBYUF9BRERSKSk7CisJCQkJaW5zYigoaW9hZGRyICsgWFBfREFUQSksIHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsIGxlbik7CisJCQkJbWVtc2V0KHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsIDAsIGxlbik7CisJCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBsZW47CisJCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciArPSBsZW47CisJCQkJdHR5LT5mbGlwLmNvdW50ICs9IGxlbjsKKwkJCQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOworCQkJCXBvcnRwLT5zdGF0cy5yeHRvdGFsICs9IGxlbjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXN0bF9zYzI2MTk4cnhiYWRjaGFycyhwb3J0cCk7CisJfQorCisvKgorICoJSWYgd2UgYXJlIFRYIGZsb3cgY29udHJvbGxlZCBhbmQgaW4gSVhBTlkgbW9kZSB0aGVuIHdlIG1heSBuZWVkCisgKgl0byB1bmZsb3cgY29udHJvbCBoZXJlLiBXZSBnb3R0YSBkbyB0aGlzIGJlY2F1c2Ugb2YgdGhlIGF1dG9tYXRpYworICoJZmxvdyBjb250cm9sIG1vZGVzIG9mIHRoZSBzYzI2MTk4LgorICovCisJaWYgKHRlc3RfYml0KEFTWUlfVFhGTE9XRUQsICZwb3J0cC0+aXN0YXRlKSkgeworCQlpZiAoKHR0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkgJiYKKwkJICAgICh0dHktPnRlcm1pb3MgIT0gKHN0cnVjdCB0ZXJtaW9zICopIE5VTEwpICYmCisJCSAgICAodHR5LT50ZXJtaW9zLT5jX2lmbGFnICYgSVhBTlkpKSB7CisJCQlzdGxfc2MyNjE5OHR4dW5mbG93KHBvcnRwLCB0dHkpOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglQcm9jZXNzIGFuIFJYIGJhZCBjaGFyYWN0ZXIuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN0bF9zYzI2MTk4cnhiYWRjaChzdGxwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBjaGFyIHN0YXR1cywgY2hhciBjaCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OworCXVuc2lnbmVkIGludAkJaW9hZGRyOworCisJdHR5ID0gcG9ydHAtPnR0eTsKKwlpb2FkZHIgPSBwb3J0cC0+aW9hZGRyOworCisJaWYgKHN0YXR1cyAmIFNSX1JYUEFSSVRZKQorCQlwb3J0cC0+c3RhdHMucnhwYXJpdHkrKzsKKwlpZiAoc3RhdHVzICYgU1JfUlhGUkFNSU5HKQorCQlwb3J0cC0+c3RhdHMucnhmcmFtaW5nKys7CisJaWYgKHN0YXR1cyAmIFNSX1JYT1ZFUlJVTikKKwkJcG9ydHAtPnN0YXRzLnJ4b3ZlcnJ1bisrOworCWlmIChzdGF0dXMgJiBTUl9SWEJSRUFLKQorCQlwb3J0cC0+c3RhdHMucnhicmVha3MrKzsKKworCWlmICgodHR5ICE9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKSAmJgorCSAgICAoKHBvcnRwLT5yeGlnbm9yZW1zayAmIHN0YXR1cykgPT0gMCkpIHsKKwkJaWYgKHBvcnRwLT5yeG1hcmttc2sgJiBzdGF0dXMpIHsKKwkJCWlmIChzdGF0dXMgJiBTUl9SWEJSRUFLKSB7CisJCQkJc3RhdHVzID0gVFRZX0JSRUFLOworCQkJCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TQUspIHsKKwkJCQkJZG9fU0FLKHR0eSk7CisJCQkJCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc3RhdHVzICYgU1JfUlhQQVJJVFkpIHsKKwkJCQlzdGF0dXMgPSBUVFlfUEFSSVRZOworCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBTUl9SWEZSQU1JTkcpIHsKKwkJCQlzdGF0dXMgPSBUVFlfRlJBTUU7CisJCQl9IGVsc2UgaWYoc3RhdHVzICYgU1JfUlhPVkVSUlVOKSB7CisJCQkJc3RhdHVzID0gVFRZX09WRVJSVU47CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAwOworCQl9CisKKwkJaWYgKHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgIT0gKGNoYXIgKikgTlVMTCkgeworCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpIHsKKwkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gc3RhdHVzOworCQkJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBjaDsKKwkJCQl0dHktPmZsaXAuY291bnQrKzsKKwkJCX0KKwkJCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7CisJCX0KKworCQlpZiAoc3RhdHVzID09IDApCisJCQlwb3J0cC0+c3RhdHMucnh0b3RhbCsrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUHJvY2VzcyBhbGwgY2hhcmFjdGVycyBpbiB0aGUgUlggRklGTyBvZiB0aGUgVUFSVC4gQ2hlY2sgYWxsIGNoYXIKKyAqCXN0YXR1cyBieXRlcyBhcyB3ZWxsLCBhbmQgcHJvY2VzcyBhcyByZXF1aXJlZC4gV2UgbmVlZCB0byBjaGVjaworICoJYWxsIGJ5dGVzIGluIHRoZSBGSUZPLCBpbiBjYXNlIHNvbWUgbW9yZSBlbnRlciB0aGUgRklGTyB3aGlsZSB3ZQorICoJYXJlIGhlcmUuIFRvIGdldCB0aGUgZXhhY3QgY2hhcmFjdGVyIGVycm9yIHR5cGUgd2UgbmVlZCB0byBzd2l0Y2gKKyAqCWludG8gQ0hBUiBlcnJvciBtb2RlICh0aGF0IGlzIHdoeSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBlbXB0eQorICoJdGhlIEZJRk8pLgorICovCisKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4cnhiYWRjaGFycyhzdGxwb3J0X3QgKnBvcnRwKQoreworCXVuc2lnbmVkIGNoYXIJc3RhdHVzLCBtcjE7CisJY2hhcgkJY2g7CisKKy8qCisgKglUbyBnZXQgdGhlIHByZWNpc2UgZXJyb3IgdHlwZSBmb3IgZWFjaCBjaGFyYWN0ZXIgd2UgbXVzdCBzd2l0Y2gKKyAqCWJhY2sgaW50byBDSEFSIGVycm9yIG1vZGUuCisgKi8KKwltcjEgPSBzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgTVIxKTsKKwlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgTVIxLCAobXIxICYgfk1SMV9FUlJCTE9DSykpOworCisJd2hpbGUgKChzdGF0dXMgPSBzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgU1IpKSAmIFNSX1JYUkRZKSB7CisJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBTQ0NSLCBDUl9DTEVBUlJYRVJSKTsKKwkJY2ggPSBzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgUlhGSUZPKTsKKwkJc3RsX3NjMjYxOThyeGJhZGNoKHBvcnRwLCBzdGF0dXMsIGNoKTsKKwl9CisKKy8qCisgKglUbyBnZXQgY29ycmVjdCBpbnRlcnJ1cHQgY2xhc3Mgd2UgbXVzdCBzd2l0Y2ggYmFjayBpbnRvIEJMT0NLCisgKgllcnJvciBtb2RlLgorICovCisJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIE1SMSwgbXIxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJT3RoZXIgaW50ZXJydXB0IGhhbmRsZXIuIFRoaXMgaW5jbHVkZXMgbW9kZW0gc2lnbmFscywgZmxvdworICoJY29udHJvbCBhY3Rpb25zLCBldGMuIE1vc3Qgc3R1ZmYgaXMgbGVmdCB0byBvZmYtbGV2ZWwgaW50ZXJydXB0CisgKglwcm9jZXNzaW5nIHRpbWUuCisgKi8KKworc3RhdGljIHZvaWQgc3RsX3NjMjYxOThvdGhlcmlzcihzdGxwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBpbnQgaWFjaykKK3sKKwl1bnNpZ25lZCBjaGFyCWNpciwgaXByLCB4aXNyOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bF9zYzI2MTk4b3RoZXJpc3IocG9ydHA9JXgsaWFjaz0leClcbiIsIChpbnQpIHBvcnRwLCBpYWNrKTsKKyNlbmRpZgorCisJY2lyID0gc3RsX3NjMjYxOThnZXRnbG9icmVnKHBvcnRwLCBDSVIpOworCisJc3dpdGNoIChjaXIgJiBDSVJfU1VCVFlQRU1BU0spIHsKKwljYXNlIENJUl9TVUJDT1M6CisJCWlwciA9IHN0bF9zYzI2MTk4Z2V0cmVnKHBvcnRwLCBJUFIpOworCQlpZiAoaXByICYgSVBSX0RDRENIQU5HRSkgeworCQkJc2V0X2JpdChBU1lJX0RDRENIQU5HRSwgJnBvcnRwLT5pc3RhdGUpOworCQkJc2NoZWR1bGVfd29yaygmcG9ydHAtPnRxdWV1ZSk7IAorCQkJcG9ydHAtPnN0YXRzLm1vZGVtKys7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDSVJfU1VCWE9OWE9GRjoKKwkJeGlzciA9IHN0bF9zYzI2MTk4Z2V0cmVnKHBvcnRwLCBYSVNSKTsKKwkJaWYgKHhpc3IgJiBYSVNSX1JYWE9OR09UKSB7CisJCQlzZXRfYml0KEFTWUlfVFhGTE9XRUQsICZwb3J0cC0+aXN0YXRlKTsKKwkJCXBvcnRwLT5zdGF0cy50eHhvZmYrKzsKKwkJfQorCQlpZiAoeGlzciAmIFhJU1JfUlhYT0ZGR09UKSB7CisJCQljbGVhcl9iaXQoQVNZSV9UWEZMT1dFRCwgJnBvcnRwLT5pc3RhdGUpOworCQkJcG9ydHAtPnN0YXRzLnR4eG9uKys7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDSVJfU1VCQlJFQUs6CisJCXN0bF9zYzI2MTk4c2V0cmVnKHBvcnRwLCBTQ0NSLCBDUl9CUkVBS1JFU0VUKTsKKwkJc3RsX3NjMjYxOThyeGJhZGNoYXJzKHBvcnRwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3guYyBiL2RyaXZlcnMvY2hhci9zeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZDc1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc3guYwpAQCAtMCwwICsxLDI2MjEgQEAKKworLyogc3guYyAtLSBkcml2ZXIgZm9yIHRoZSBTcGVjaWFsaXggU1ggc2VyaWVzIGNhcmRzLiAKKyAqCisgKiAgVGhpcyBkcml2ZXIgd2lsbCBhbHNvIHN1cHBvcnQgdGhlIG9sZGVyIFNJLCBhbmQgWElPIGNhcmRzLgorICoKKyAqCisgKiAgIChDKSAxOTk4IC0gMjAwNCAgUi5FLldvbGZmQEJpdFdpemFyZC5ubAorICoKKyAqICBTaW1vbiBBbGxlbiAoc2ltb25hbGxlbkBjaXguY29tcHVsaW5rLmNvLnVrKSB3cm90ZSBhIHByZXZpb3VzCisgKiAgdmVyc2lvbiBvZiB0aGlzIGRyaXZlci4gU29tZSBmcmFnbWVudHMgbWF5IGhhdmUgYmVlbiBjb3BpZWQuIChub25lCisgKiAgeWV0IDotKQorICoKKyAqIFNwZWNpYWxpeCBwYXlzIGZvciB0aGUgZGV2ZWxvcG1lbnQgYW5kIHN1cHBvcnQgb2YgdGhpcyBkcml2ZXIuCisgKiBQbGVhc2UgRE8gY29udGFjdCBzdXBwb3J0QHNwZWNpYWxpeC5jby51ayBpZiB5b3UgcmVxdWlyZQorICogc3VwcG9ydC4gQnV0IHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIChzeC50eHQpIGZpcnN0LgorICoKKyAqCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogICAgICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqICAgICAgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICAgVVNBLgorICoKKyAqIFJldmlzaW9uIGhpc3Rvcnk6CisgKiAkTG9nOiBzeC5jLHYgJAorICogUmV2aXNpb24gMS4zMyAgMjAwMC8wMy8wOSAxMDowMDowMCAgcHZkbCx3b2xmZgorICogLSBGaXhlZCBtb2R1bGUgYW5kIHBvcnQgY291bnRpbmcKKyAqIC0gRml4ZWQgc2lnbmFsIGhhbmRsaW5nCisgKiAtIEZpeGVkIGFuIE9vb3BzCisgKiAKKyAqIFJldmlzaW9uIDEuMzIgIDIwMDAvMDMvMDcgMDk6MDA6MDAgIHdvbGZmLHB2ZGwKKyAqIC0gRml4ZWQgc29tZSBzeF9kcHJpbnRrIHR5cG9zCisgKiAtIGFkZGVkIGRldGVjdGlvbiBmb3IgYW4gaW52YWxpZCBib2FyZC9tb2R1bGUgY29uZmlndXJhdGlvbgorICoKKyAqIFJldmlzaW9uIDEuMzEgIDIwMDAvMDMvMDYgMTI6MDA6MDAgIHdvbGZmLHB2ZGwKKyAqIC0gQWRkZWQgc3VwcG9ydCBmb3IgRUlTQQorICoKKyAqIFJldmlzaW9uIDEuMzAgIDIwMDAvMDEvMjEgMTc6NDM6MDYgIHdvbGZmCisgKiAtIEFkZGVkIHN1cHBvcnQgZm9yIFNYKworICoKKyAqIFJldmlzaW9uIDEuMjYgIDE5OTkvMDgvMDUgMTU6MjI6MTQgIHdvbGZmCisgKiAtIFBvcnQgdG8gMi4zLngKKyAqIC0gUmVmb3JtYXR0ZWQgdG8gTGludXMnIGxpa2luZy4KKyAqCisgKiBSZXZpc2lvbiAxLjI1ICAxOTk5LzA3LzMwIDE0OjI0OjA4ICB3b2xmZgorICogSGFkIGFjY2lkZW50YWxseSBsZWZ0ICJnc19kZWJ1ZyIgc2V0IHRvICItMSIgaW5zdGVhZCBvZiAib2ZmIiAoPTApLgorICoKKyAqIFJldmlzaW9uIDEuMjQgIDE5OTkvMDcvMjggMDk6NDE6NTIgIHdvbGZmCisgKiAtIEkgbm90aWNlZCB0aGUgcmVtYXJrIGFib3V0IHVzZS1jb3VudCBzdHJheWluZyBpbiBzeC50eHQuIEkgY2hlY2tlZAorICogICBzeF9vcGVuLCBhbmQgZm91bmQgYSBmZXcgcGxhY2VzIHdoZXJlIHRoYXQgY291bGQgaGFwcGVuLiBJIGhvcGUgaXQncworICogICBmaXhlZCBub3cuCisgKgorICogUmV2aXNpb24gMS4yMyAgMTk5OS8wNy8yOCAwODo1NjowNiAgd29sZmYKKyAqIC0gRml4ZWQgY3Jhc2ggd2hlbiBzeF9maXJtd2FyZSBydW4gdHdpY2UuCisgKiAtIEFkZGVkIHN4X3Nsb3dwb2xsIGFzIGEgbW9kdWxlIHBhcmFtZXRlciAoSSBndWVzcyBub2JvZHkgcmVhbGx5IHdhbnRlZAorICogICB0byBjaGFuZ2UgaXQgZnJvbSB0aGUgZGVmYXVsdC4uLiApCisgKiAtIEZpeGVkIGEgc3R1cGlkIGVkaXRpbmcgcHJvYmxlbSBJIGludHJvZHVjZWQgaW4gMS4yMi4KKyAqIC0gRml4ZWQgZHJvcHBpbmcgY2hhcmFjdGVycyBvbiBhIHRlcm1pb3MgY2hhbmdlLgorICoKKyAqIFJldmlzaW9uIDEuMjIgIDE5OTkvMDcvMjYgMjE6MDE6NDMgIHdvbGZmCisgKiBSdXNzZWxsIEJyb3duIG5vdGljZWQgdGhhdCBJIGhhZCBvdmVybG9va2VkIDQgb3V0IG9mIHNpeCBtb2RlbSBjb250cm9sCisgKiBzaWduYWxzIGluIHN4X2dldHNpZ25hbHMuIE9vb3BzLgorICoKKyAqIFJldmlzaW9uIDEuMjEgIDE5OTkvMDcvMjMgMDk6MTE6MzMgIHdvbGZmCisgKiBJIGZvcmdvdCB0byBmcmVlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkgd2hlbiB0aGUgZHJpdmVyIGlzIHVubG9hZGVkLgorICoKKyAqIFJldmlzaW9uIDEuMjAgIDE5OTkvMDcvMjAgMDY6MjU6MjYgIHdvbGZmCisgKiBUaGUgImNsb3Npbmcgd2FpdCIgd2Fzbid0IGhvbm91cmVkLiBUaGFua3MgdG8gSmFtZXMgR3JpZmZpdGhzIGZvcgorICogcmVwb3J0aW5nIHRoaXMuCisgKgorICogUmV2aXNpb24gMS4xOSAgMTk5OS8wNy8xMSAwODo1OTo1OSAgd29sZmYKKyAqIEZpeGVkIGFuIG9vcHMgaW4gY2xvc2UsIHdoZW4gYW4gb3BlbiB3YXMgcGVuZGluZy4gQ2hhbmdlZCB0aGUgbWVtdGVzdAorICogYSBiaXQuIFNob3VsZCBhbHNvIHRlc3QgdGhlIGJvYXJkIGluIHdvcmQtbW9kZSwgaG93ZXZlciBteSBjYXJkIGZhaWxzIHRoZQorICogbWVtdGVzdCB0aGVuLiBJIHN0aWxsIGhhdmUgdG8gZmlndXJlIG91dCB3aGF0IGlzIHdyb25nLi4uCisgKgorICogUmV2aXNpb24gMS4xOCAgMTk5OS8wNi8xMCAwOTozODo0MiAgd29sZmYKKyAqIENoYW5nZWQgdGhlIGZvcm1hdCBvZiB0aGUgZmlybXdhcmUgcmV2aXNpb24gZnJvbSAlMDR4IHRvICV4LiUwMnggLgorICoKKyAqIFJldmlzaW9uIDEuMTcgIDE5OTkvMDYvMDQgMDk6NDQ6MzUgIHdvbGZmCisgKiBmaXhlZCBwcm9ibGVtOiByZWZlcmVuY2UgdG8gcGNpIHN0dWZmIHdoZW4gY29uZmlnX3BjaSB3YXMgb2ZmLi4uCisgKiBUaGFua3MgdG8gSm9yZ2UgTm92byBmb3Igbm90aWNpbmcgdGhpcy4KKyAqCisgKiBSZXZpc2lvbiAxLjE2ICAxOTk5LzA2LzAyIDA4OjMwOjE1ICB3b2xmZgorICogYWRkZWQvcmVtb3ZlZCB0aGUgd29ya2Fyb3VuZCBmb3IgdGhlIERDRCBidWcgaW4gdGhlIEZpcm13YXJlLgorICogQSBiaXQgbW9yZSBkZWJ1Z2dpbmcgY29kZSB0byBsb2NhdGUgdGhhdC4uLgorICoKKyAqIFJldmlzaW9uIDEuMTUgIDE5OTkvMDYvMDEgMTE6MzU6MzAgIHdvbGZmCisgKiB3aGVuIERDRCBpcyBsZWZ0IGxvdyAoZmxvYXRpbmc/KSwgb24gVEEncyB0aGUgZmlybXdhcmUgZmlyc3QgdGVsbHMgdXMKKyAqIHRoYXQgRENEIGlzIGhpZ2gsIGJ1dCBhZnRlciBhIHNob3J0IHdoaWxlIHN1ZGRlbmx5IGNvbWVzIHRvIHRoZQorICogY29uY2x1c2lvbiB0aGF0IGl0IGlzIGxvdy4gQWxsIHRoaXMgd291bGQgYmUgZmluZSwgaWYgaXQgd2VyZW4ndCB0aGF0CisgKiBVbml4IHJlcXVpcmVzIHVzIHRvIHNlbmQgYSAiaGFuZ3VwIiBzaWduYWwgaW4gdGhhdCBjYXNlLiBUaGlzIHVzdWFsbHkKKyAqIGFsbCBoYXBwZW5zIEJFRk9SRSB0aGUgcHJvZ3JhbSBoYXMgaGFkIGEgY2hhbmNlIHRvIGlvY3RsIHRoZSBkZXZpY2UKKyAqIGludG8gY2xvY2FsIG1vZGUuLgorICoKKyAqIFJldmlzaW9uIDEuMTQgIDE5OTkvMDUvMjUgMTE6MTg6NTkgIHdvbGZmCisgKiBBZGRlZCBQQ0ktZml4LgorICogQWRkZWQgY2hlY2tzIGZvciByZXR1cm4gY29kZSBvZiBzeF9zZW5kY29tbWFuZC4KKyAqIERvbid0IGlzc3VlICJyZWNvbmZpZyIgaWYgcG9ydCBpc24ndCBvcGVuIHlldC4gKGJpdCB1cyBvbiBUQSBtb2R1bGVzLi4uKQorICoKKyAqIFJldmlzaW9uIDEuMTMgIDE5OTkvMDQvMjkgMTU6MTg6MDEgIHdvbGZmCisgKiBGaXhlZCBhbiAib29wcyIgdGhhdCBzaG93ZWQgb24gU3VTRSA2LjAgc3lzdGVtcy4KKyAqIEFjdGl2YXRlIERUUiBhZ2FpbiBhZnRlciBzdHR5IDAuCisgKgorICogUmV2aXNpb24gMS4xMiAgMTk5OS8wNC8yOSAwNzo0OTo1MiAgd29sZmYKKyAqIEltcHJvdmVkICJzdHR5IDAiIGhhbmRsaW5nIGEgYml0LiAodXNlZCB0byBjaGFuZ2UgYmF1ZCB0byA5NjAwIGFzc3VtaW5nCisgKiAgICAgdGhlIGNvbm5lY3Rpb24gd291bGQgYmUgZHJvcHBlZCBhbnl3YXkuIFRoYXQgaXMgbm90IGFsd2F5cyB0aGUgY2FzZSwKKyAqICAgICBhbmQgY29uZnVzZXMgcGVvcGxlKS4KKyAqIFRvbGQgdGhlIGNhcmQgdG8gYWx3YXlzIG1vbml0b3IgdGhlIG1vZGVtIHNpZ25hbHMuCisgKiBBZGRlZCBzdXBwb3J0IGZvciBkeW5hbWljICBnc19kZWJ1ZyBhZGp1c3RtZW50cy4KKyAqIE5vdyB0ZWxscyB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtIHRoZSBudW1iZXIgb2YgcG9ydHMuCisgKgorICogUmV2aXNpb24gMS4xMSAgMTk5OS8wNC8yNCAxMToxMTozMCAgd29sZmYKKyAqIEZpeGVkIHR3byBzdHVwaWQgdHlwb3MgaW4gdGhlIG1lbW9yeSB0ZXN0LgorICoKKyAqIFJldmlzaW9uIDEuMTAgIDE5OTkvMDQvMjQgMTA6NTM6MzkgIHdvbGZmCisgKiBBZGRlZCBzb21lIG9mIENocmlzdGlhbidzIHN1Z2dlc3Rpb25zLgorICogRml4ZWQgYW4gSFdfQ09PS19JTiBidWcgKElTSUcgd2FzIG5vdCBpbiBJX09USEVSLiBXZSB1c2VkIHRvIHRydXN0IHRoZQorICogY2FyZCB0byBzZW5kIHRoZSBzaWduYWwgdG8gdGhlIHByb2Nlc3MuLi4uLikKKyAqCisgKiBSZXZpc2lvbiAxLjkgIDE5OTkvMDQvMjMgMDc6MjY6MzggIHdvbGZmCisgKiBJbmNsdWRlZCBDaHJpc3RpYW4gTGFkZW1hbm4ncyAyLjAgY29tcGlsZS13YXJuaW5nIGZpeGVzIGFuZCBpbnRlcnJ1cHQKKyAqICAgIGFzc2lnbm1lbnQgcmVkZXNpZ24uCisgKiBDbGVhbnVwIG9mIHNvbWUgb3RoZXIgc3R1ZmYuCisgKgorICogUmV2aXNpb24gMS44ICAxOTk5LzA0LzE2IDEzOjA1OjMwICB3b2xmZgorICogZml4ZWQgYSBEQ0QgY2hhbmdlIHVubm90aWNlZCBidWcuCisgKgorICogUmV2aXNpb24gMS43ICAxOTk5LzA0LzE0IDIyOjE5OjUxICB3b2xmZgorICogRml4ZWQgdHlwbyB0aGF0IHNob3dlZCB1cCBpbiAyLjAueCBidWlsZHMgKGdldF91c2VyIGluc3RlYWQgb2YgR2V0X3VzZXIhKQorICoKKyAqIFJldmlzaW9uIDEuNiAgMTk5OS8wNC8xMyAxODo0MDoyMCAgd29sZmYKKyAqIGNoYW5nZWQgbWlzYy1taW5vciB0byAxNjEsIGFzIGFzc2lnbmVkIGJ5IEhQQS4KKyAqCisgKiBSZXZpc2lvbiAxLjUgIDE5OTkvMDQvMTMgMTU6MTI6MjUgIHdvbGZmCisgKiBGaXhlZCB1c2UtY291bnQgbGVhayB3aGVuICJoYW5ndXAiIG9jY3VycmVkLgorICogQWRkZWQgd29ya2Fyb3VuZCBmb3IgYSBzdHVwaWQtUENJQklPUyBidWcuCisgKgorICoKKyAqIFJldmlzaW9uIDEuNCAgMTk5OS8wNC8wMSAyMjo0Nzo0MCAgd29sZmYKKyAqIEZpeGVkIDwgMU0gbGludXgtMi4wIHByb2JsZW0uCisgKiAodnJlbWFwIGlzbid0IGNvbXBhdGlibGUgd2l0aCBpb3JlbWFwIGluIHRoYXQgY2FzZSkKKyAqCisgKiBSZXZpc2lvbiAxLjMgIDE5OTkvMDMvMzEgMTM6NDU6NDUgIHdvbGZmCisgKiBGaXJtd2FyZSBsb2FkaW5nIGlzIG5vdyBkb25lIHRocm91Z2ggYSBzZXBhcmF0ZSBJT0NUTC4KKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTkvMDMvMjggMTI6MjI6MjkgIHdvbGZmCisgKiByY3MgY2xlYW51cAorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5OS8wMy8yOCAxMjoxMDozNCAgd29sZmYKKyAqIFJlYWR5aW5nIGZvciByZWxlYXNlIG9uIDIuMC54IChzb3JyeSBEYXZpZCwgMS4wMSBiZWNvbWVzIDEuMSBmb3IgUkNTKS4gCisgKgorICogUmV2aXNpb24gMC4xMiAgMTk5OS8wMy8yOCAwOToyMDoxMCAgd29sZmYKKyAqIEZpeGVkIHByb2JsZW0gaW4gMC4xMSwgY29udGludWVpbmcgY2xlYW51cC4KKyAqCisgKiBSZXZpc2lvbiAwLjExICAxOTk5LzAzLzI4IDA4OjQ2OjQ0ICB3b2xmZgorICogY2xlYW51cC4gTm90IGdvb2QuCisgKgorICogUmV2aXNpb24gMC4xMCAgMTk5OS8wMy8yOCAwODowOTo0MyAgd29sZmYKKyAqIEZpeGVkIGxvb3NpbmcgY2hhcmFjdGVycyBvbiBjbG9zZS4KKyAqCisgKiBSZXZpc2lvbiAwLjkgIDE5OTkvMDMvMjEgMjI6NTI6MDEgIHdvbGZmCisgKiBQb3J0ZWQgYmFjayB0byAyLjIuLi4uIChtaW5vciB0aGluZ3MpCisgKgorICogUmV2aXNpb24gMC44ICAxOTk5LzAzLzIxIDIyOjQwOjMzICB3b2xmZgorICogUG9ydCB0byAyLjAKKyAqCisgKiBSZXZpc2lvbiAwLjcgIDE5OTkvMDMvMjEgMTk6MDY6MzQgIHdvbGZmCisgKiBGaXhlZCBoYW5ndXAgcHJvY2Vzc2luZy4KKyAqCisgKiBSZXZpc2lvbiAwLjYgIDE5OTkvMDIvMDUgMDg6NDU6MTQgIHdvbGZmCisgKiBmaXhlZCByZWFsX3JhdyBwcm9ibGVtcy4gSW5jbHVzaW9uIGludG8ga2VybmVsIGltbWluZW50LgorICoKKyAqIFJldmlzaW9uIDAuNSAgMTk5OC8xMi8yMSAyMzo1MTowNiAgd29sZmYKKyAqIFNuYXRjaGVkIGEgbmFzdHkgYnVnOiBzeF90cmFuc21pdF9jaGFycyB3YXMgZ2V0dGluZyByZS1lbnRlcmVkLCBhbmQgaXQKKyAqIHNob3VsZG4ndCBoYXZlLiBUSEFUcyB3aHkgSSB3YW50IHRvIGhhdmUgdHJhbnNtaXQgaW50ZXJydXB0cyBldmVuIHdoZW4KKyAqIHRoZSBidWZmZXIgaXMgZW1wdHkuCisgKgorICogUmV2aXNpb24gMC40ICAxOTk4LzEyLzE3IDA5OjM0OjQ2ICB3b2xmZgorICogUFBQIHdvcmtzLiBpb2N0bCB3b3Jrcy4gQmFzaWNhbGx5IHdvcmtzIQorICoKKyAqIFJldmlzaW9uIDAuMyAgMTk5OC8xMi8xNSAxMzowNToxOCAgd29sZmYKKyAqIEl0IHdvcmtzISBXb3chIEdvdHRhIHN0YXJ0IGltcGxlbWVudGluZyBJT0NUTCBhbmQgc3R1ZmYuLi4uCisgKgorICogUmV2aXNpb24gMC4yICAxOTk4LzEyLzAxIDA4OjMzOjUzICB3b2xmZgorICogbW92ZWQgb3ZlciB0byAyLjEuMTMwCisgKgorICogUmV2aXNpb24gMC4xICAxOTk4LzExLzAzIDIxOjIzOjUxICB3b2xmZgorICogSW5pdGlhbCByZXZpc2lvbi4gRGV0ZWN0cyBTWCBjYXJkLgorICoKKyAqICovCisKKworI2RlZmluZSBSQ1NfSUQgIiRJZDogc3guYyx2IDEuMzMgMjAwMC8wMy8wOCAxMDowMTowMiB3b2xmZiwgcHZkbCBFeHAgJCIKKyNkZWZpbmUgUkNTX1JFViAiJFJldmlzaW9uOiAxLjMzICQiCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAKKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogVGhlIDMuMC4wIHZlcnNpb24gb2Ygc3hib2FyZHMvc3h3aW5kb3cuaCAgdXNlcyBCWVRFIGFuZCBXT1JELi4uLiAqLworI2RlZmluZSBCWVRFIHU4CisjZGVmaW5lIFdPUkQgdTE2CisKKy8qIC4uLi4gYnV0IHRoZSAzLjAuNCB2ZXJzaW9uIHVzZXMgX3U4IGFuZCBfdTE2LiAqLworI2RlZmluZSBfdTggdTgKKyNkZWZpbmUgX3UxNiB1MTYKKworI2luY2x1ZGUgInN4Ym9hcmRzLmgiCisjaW5jbHVkZSAic3h3aW5kb3cuaCIKKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisjaW5jbHVkZSAic3guaCIKKworCisvKiBJIGRvbid0IHRoaW5rIHRoYXQgdGhpcyBkcml2ZXIgY2FuIGhhbmRsZSBtb3JlIHRoYW4gMjU2IHBvcnRzIG9uCisgICBvbmUgbWFjaGluZS4gWW91J2xsIGhhdmUgdG8gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBib2FyZHMgaW4gc3guaAorICAgaWYgeW91IHdhbnQgbW9yZSB0aGFuIDQgYm9hcmRzLiAgKi8KKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9TWF9YSU9fSU84CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1NYX1hJT19JTzggMHgyMDAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzeF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWCwgUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfU1hfWElPX0lPOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgMCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHN4X3BjaV90YmwpOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworLyogQ29uZmlndXJhYmxlIG9wdGlvbnM6IAorICAgKERvbid0IGJlIHRvbyBzdXJlIHRoYXQgaXQnbGwgd29yayBpZiB5b3UgdG9nZ2xlIHRoZW0pICovCisKKy8qIEFtIEkgcGFyYW5vaWQgb3Igbm90ID8gOy0pICovCisjdW5kZWYgU1hfUEFSQU5PSUFfQ0hFQ0sKKworCisvKiAyMCAtPiAyMDAwIHBlciBzZWNvbmQuIFRoZSBjYXJkIHNob3VsZCByYXRlLWxpbWl0IGludGVycnVwdHMgYXQgMTAwCisgICBIeiwgYnV0IGl0IGlzIHVzZXIgY29uZmlndXJhYmxlLiBJIGRvbid0IHJlY29tbWVuZCBnb2luZyBhYm92ZSAxMDAwCisgICBIei4gVGhlIGludGVycnVwdCByYXRlbGltaXQgbWlnaHQgdHJpZ2dlciBpZiB0aGUgaW50ZXJydXB0IGlzCisgICBzaGFyZWQgd2l0aCBhIHZlcnkgYWN0aXZlIG90aGVyIGRldmljZS4gKi8KKyNkZWZpbmUgSVJRX1JBVEVfTElNSVQgMjAKKworLyogU2hhcmluZyBpbnRlcnJ1cHRzIGlzIHBvc3NpYmxlIG5vdy4gSWYgdGhlIG90aGVyIGRldmljZSB3YW50cyBtb3JlCisgICB0aGFuIDIwMDAgaW50ZXJydXB0cyBwZXIgc2Vjb25kLCB3ZSdkIGdyYWNlZnVsbHkgZGVjbGluZSBmdXJ0aGVyCisgICBpbnRlcnJ1cHRzLiBUaGF0J3Mgbm90IHdoYXQgd2Ugd2FudC4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZQorICAgb3RoZXIgZGV2aWNlIGludGVycnVwdHMgMjAwMCB0aW1lcyBhIHNlY29uZCwgZG9uJ3QgdXNlIHRoZSBTWAorICAgaW50ZXJydXB0LiBVc2UgcG9sbGluZy4gKi8KKyN1bmRlZiBJUlFfUkFURV9MSU1JVAorCisKKyNpZiAwCisvKiBOb3QgaW1wbGVtZW50ZWQgKi8KKy8qIAorICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMuIEJ1dCBpZiB5b3UgbmVlZAorICogc29tZSBuaWNlIHJlcG9ydGluZyBpbiB5b3VyIHN5c2xvZywgeW91IGNhbiBkZWZpbmUgdGhlbSBhbHNvLgorICovCisjZGVmaW5lIFNYX1JFUE9SVF9GSUZPCisjZGVmaW5lIFNYX1JFUE9SVF9PVkVSUlVOCisjZW5kaWYgCisKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgc3hfZGlzYWJsZV90eF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKTsgCitzdGF0aWMgdm9pZCBzeF9lbmFibGVfdHhfaW50ZXJydXB0cyAodm9pZCAqIHB0cik7IAorc3RhdGljIHZvaWQgc3hfZGlzYWJsZV9yeF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKTsgCitzdGF0aWMgdm9pZCBzeF9lbmFibGVfcnhfaW50ZXJydXB0cyAodm9pZCAqIHB0cik7IAorc3RhdGljIGludCAgc3hfZ2V0X0NEICh2b2lkICogcHRyKTsgCitzdGF0aWMgdm9pZCBzeF9zaHV0ZG93bl9wb3J0ICh2b2lkICogcHRyKTsKK3N0YXRpYyBpbnQgIHN4X3NldF9yZWFsX3Rlcm1pb3MgKHZvaWQgICpwdHIpOworc3RhdGljIHZvaWQgc3hfY2xvc2UgKHZvaWQgICpwdHIpOworc3RhdGljIGludCBzeF9jaGFyc19pbl9idWZmZXIgKHZvaWQgKiBwdHIpOworc3RhdGljIGludCBzeF9pbml0X2JvYXJkIChzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkKTsKK3N0YXRpYyBpbnQgc3hfaW5pdF9wb3J0c3RydWN0cyAoaW50IG5ib2FyZHMsIGludCBucG9ydHMpOworc3RhdGljIGludCBzeF9md19pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IHN4X2luaXRfZHJpdmVycyh2b2lkKTsKKworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnN4X2RyaXZlcjsKKworc3RhdGljIHN0cnVjdCBzeF9ib2FyZCBib2FyZHNbU1hfTkJPQVJEU107CitzdGF0aWMgc3RydWN0IHN4X3BvcnQgKnN4X3BvcnRzOworc3RhdGljIGludCBzeF9pbml0aWFsaXplZDsKK3N0YXRpYyBpbnQgc3hfbnBvcnRzOworc3RhdGljIGludCBzeF9kZWJ1ZzsKKworCisvKiBZb3UgY2FuIGhhdmUgdGhlIGRyaXZlciBwb2xsIHlvdXIgY2FyZC4gCisgICAgLSBTZXQgc3hfcG9sbCB0byAxIHRvIHBvbGwgZXZlcnkgdGltZXIgdGljayAoMTBtcyBvbiBJbnRlbCkuIAorICAgICAgVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGNhcmQgY2Fubm90IHVzZSBhbiBpbnRlcnJ1cHQgZm9yIHNvbWUgcmVhc29uLgorCisgICAgLSBzZXQgc3hfc2xvd3BvbGwgdG8gMTAwIHRvIGRvIGFuIGV4dHJhIHBvbGwgb25jZSBhIHNlY29uZCAob24gSW50ZWwpLiBJZiAKKyAgICAgIHRoZSBkcml2ZXIgbWlzc2VzIGFuIGludGVycnVwdCAocmVwb3J0IHRoaXMgaWYgaXQgRE9FUyBoYXBwZW4gdG8geW91ISkKKyAgICAgIGV2ZXJ5dGhpbmcgd2lsbCBjb250aW51ZSB0byB3b3JrLi4uLiAKKyAqLworc3RhdGljIGludCBzeF9wb2xsID0gMTsKK3N0YXRpYyBpbnQgc3hfc2xvd3BvbGw7CisKKy8qIFRoZSBjYXJkIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMgcGVyIHNlY29uZC4gCisgICBBdCAxMTVrMiAiMTAwIiBzaG91bGQgYmUgc3VmZmljaWVudC4gCisgICBJZiB5b3UncmUgdXNpbmcgaGlnaGVyIGJhdWRyYXRlcywgeW91IGNhbiBpbmNyZWFzZSB0aGlzLi4uCisgKi8KKworc3RhdGljIGludCBzeF9tYXhpbnRzID0gMTAwOworCisvKiBUaGVzZSBhcmUgdGhlIG9ubHkgb3BlbiBzcGFjZXMgaW4gbXkgY29tcHV0ZXIuIFlvdXJzIG1heSBoYXZlIG1vcmUKKyAgIG9yIGxlc3MuLi4uIC0tIFJFVyAKKyAgIGR1aDogQ2FyZCBhdCAweGEwMDAwIGlzIHBvc3NpYmxlIG9uIEhQIE5ldHNlcnZlcj8/IC0tIHB2ZGwKKyovCitzdGF0aWMgaW50IHN4X3Byb2JlX2FkZHJzW109IHsweGMwMDAwLCAweGQwMDAwLCAweGUwMDAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YzgwMDAsIDB4ZDgwMDAsIDB4ZTgwMDB9Oworc3RhdGljIGludCBzaV9wcm9iZV9hZGRyc1tdPSB7MHhjMDAwMCwgMHhkMDAwMCwgMHhlMDAwMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGM4MDAwLCAweGQ4MDAwLCAweGU4MDAwLCAweGEwMDAwfTsKK3N0YXRpYyBpbnQgc2kxX3Byb2JlX2FkZHJzW109IHsgMHhkMDAwMH07CisKKyNkZWZpbmUgTlJfU1hfQUREUlMgKHNpemVvZihzeF9wcm9iZV9hZGRycykvc2l6ZW9mIChpbnQpKQorI2RlZmluZSBOUl9TSV9BRERSUyAoc2l6ZW9mKHNpX3Byb2JlX2FkZHJzKS9zaXplb2YgKGludCkpCisjZGVmaW5lIE5SX1NJMV9BRERSUyAoc2l6ZW9mKHNpMV9wcm9iZV9hZGRycykvc2l6ZW9mIChpbnQpKQorCisKKy8qIFNldCB0aGUgbWFzayB0byBhbGwtb25lcy4gVGhpcyBhbGFzLCBvbmx5IHN1cHBvcnRzIDMyIGludGVycnVwdHMuIAorICAgU29tZSBhcmNoaXRlY3R1cmVzIG1heSBuZWVkIG1vcmUuICovCitzdGF0aWMgaW50IHN4X2lycW1hc2sgPSAtMTsKKworbW9kdWxlX3BhcmFtX2FycmF5KHN4X3Byb2JlX2FkZHJzLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHNpX3Byb2JlX2FkZHJzLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKHN4X3BvbGwsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc3hfc2xvd3BvbGwsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc3hfbWF4aW50cywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzeF9kZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzeF9pcnFtYXNrLCBpbnQsIDApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3QgcmVhbF9kcml2ZXIgc3hfcmVhbF9kcml2ZXIgPSB7CisJc3hfZGlzYWJsZV90eF9pbnRlcnJ1cHRzLAorCXN4X2VuYWJsZV90eF9pbnRlcnJ1cHRzLAorCXN4X2Rpc2FibGVfcnhfaW50ZXJydXB0cywKKwlzeF9lbmFibGVfcnhfaW50ZXJydXB0cywKKwlzeF9nZXRfQ0QsCisJc3hfc2h1dGRvd25fcG9ydCwgCisJc3hfc2V0X3JlYWxfdGVybWlvcywgCisJc3hfY2hhcnNfaW5fYnVmZmVyLAorCXN4X2Nsb3NlLAorfTsKKworCisvKiAKKyAgIFRoaXMgZHJpdmVyIGNhbiBzcGV3IGEgd2hvbGUgbG90IG9mIGRlYnVnZ2luZyBvdXRwdXQgYXQgeW91LiBJZiB5b3UKKyAgIG5lZWQgbWF4aW11bSBwZXJmb3JtYW5jZSwgeW91IHNob3VsZCBkaXNhYmxlIHRoZSBERUJVRyBkZWZpbmUuIFRvCisgICBhaWQgaW4gZGVidWdnaW5nIGluIHRoZSBmaWVsZCwgSSdtIGxlYXZpbmcgdGhlIGNvbXBpbGUtdGltZSBkZWJ1ZworICAgZmVhdHVyZXMgZW5hYmxlZCwgYW5kIGRpc2FibGUgdGhlbSAicnVudGltZSIuIFRoYXQgYWxsb3dzIG1lIHRvCisgICBpbnN0cnVjdCBwZW9wbGUgd2l0aCBwcm9ibGVtcyB0byBlbmFibGUgZGVidWdnaW5nIHdpdGhvdXQgcmVxdWlyaW5nCisgICB0aGVtIHRvIHJlY29tcGlsZS4uLiAKKyovCisjZGVmaW5lIERFQlVHCisKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIHN4X2RwcmludGsoZiwgc3RyLi4uKSBpZiAoc3hfZGVidWcgJiBmKSBwcmludGsgKHN0cikKKyNlbHNlCisjZGVmaW5lIHN4X2RwcmludGsoZiwgc3RyLi4uKSAvKiBub3RoaW5nICovCisjZW5kaWYKKworCisKKyNkZWZpbmUgZnVuY19lbnRlcigpIHN4X2RwcmludGsgKFNYX0RFQlVHX0ZMT1csICJzeDogZW50ZXIgJXNcbiIsX19GVU5DVElPTl9fKQorI2RlZmluZSBmdW5jX2V4aXQoKSAgc3hfZHByaW50ayAoU1hfREVCVUdfRkxPVywgInN4OiBleGl0ICAlc1xuIiwgX19GVU5DVElPTl9fKQorCisjZGVmaW5lIGZ1bmNfZW50ZXIyKCkgc3hfZHByaW50ayAoU1hfREVCVUdfRkxPVywgInN4OiBlbnRlciAlcyAocG9ydCAlZClcbiIsIFwKKwkJCQkJX19GVU5DVElPTl9fLCBwb3J0LT5saW5lKQorCisKKworCisvKiAKKyAqICBGaXJtd2FyZSBsb2FkZXIgZHJpdmVyIHNwZWNpZmljIHJvdXRpbmVzCisgKgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN4X2Z3X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAkJPSBzeF9md19pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBzeF9md19kZXZpY2UgPSB7CisJU1hDVExfTUlTQ19NSU5PUiwgInN4Y3RsIiwgJnN4X2Z3X2ZvcHMKK307CisKKworCisKKworI2lmZGVmIFNYX1BBUkFOT0lBX0NIRUNLCisKKy8qIFRoaXMgZG9lc24ndCB3b3JrLiBXaG8ncyBwYXJhbm9pZCBhcm91bmQgaGVyZT8gTm90IG1lISAqLworCitzdGF0aWMgaW5saW5lIGludCBzeF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3Qgc3hfcG9ydCBjb25zdCAqIHBvcnQsCisJCQkJICAgIGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCit7CisKKwlzdGF0aWMgY29uc3QgY2hhciAqYmFkbWFnaWMgPQorCSAgS0VSTl9FUlIgInN4OiBXYXJuaW5nOiBiYWQgc3ggcG9ydCBtYWdpYyBudW1iZXIgZm9yIGRldmljZSAlcyBpbiAlc1xuIjsKKwlzdGF0aWMgY29uc3QgY2hhciAqYmFkaW5mbyA9CisJICBLRVJOX0VSUiAic3g6IFdhcm5pbmc6IG51bGwgc3ggcG9ydCBmb3IgZGV2aWNlICVzIGluICVzXG4iOworIAorCWlmICghcG9ydCkgeworCQlwcmludGsoYmFkaW5mbywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAocG9ydC0+bWFnaWMgIT0gU1hfTUFHSUMpIHsKKwkJcHJpbnRrKGJhZG1hZ2ljLCBuYW1lLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBzeF9wYXJhbm9pYV9jaGVjayhhLGIsYykgMAorI2VuZGlmCisKKy8qIFRoZSB0aW1lb3V0cy4gRmlyc3QgdHJ5IDMwIHRpbWVzIGFzIGZhc3QgYXMgcG9zc2libGUuIFRoZW4gZ2l2ZQorICAgdGhlIGNhcmQgc29tZSB0aW1lIHRvIGJyZWF0aGUgYmV0d2VlbiBhY2Nlc3Nlcy4gKE90aGVyd2lzZSB0aGUKKyAgIHByb2Nlc3NvciBvbiB0aGUgY2FyZCBtaWdodCBub3QgYmUgYWJsZSB0byBhY2Nlc3MgaXRzIE9XTiBidXMuLi4gKi8KKworI2RlZmluZSBUSU1FT1VUXzEgMzAKKyNkZWZpbmUgVElNRU9VVF8yIDEwMDAwMDAKKworCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIG15X2hkX2lvKHZvaWQgX19pb21lbSAqcCwgaW50IGxlbikKK3sKKwlpbnQgaSwgaiwgY2g7CisJdW5zaWduZWQgY2hhciBfX2lvbWVtICphZGRyID0gcDsKKworCWZvciAoaT0wO2k8bGVuO2krPTE2KSB7CisJCXByaW50ayAoIiVwICIsIGFkZHIraSk7CisJCWZvciAoaj0wO2o8MTY7aisrKSB7CisJCQlwcmludGsgKCIlMDJ4ICVzIiwgcmVhZGIoYWRkcitqK2kpLCAoaj09Nyk/IiAiOiIiKTsKKwkJfQorCQlmb3IgKGo9MDtqPDE2O2orKykgeworCQkJY2ggPSByZWFkYihhZGRyK2oraSk7CisJCQlwcmludGsgKCIlYyIsIChjaCA8IDB4MjApPycuJzooKGNoID4gMHg3Zik/Jy4nOmNoKSk7CisJCX0KKwkJcHJpbnRrICgiXG4iKTsKKwl9Cit9CitzdGF0aWMgdm9pZCBteV9oZCh2b2lkICpwLCBpbnQgbGVuKQoreworCWludCBpLCBqLCBjaDsKKwl1bnNpZ25lZCBjaGFyICphZGRyID0gcDsKKworCWZvciAoaT0wO2k8bGVuO2krPTE2KSB7CisJCXByaW50ayAoIiVwICIsIGFkZHIraSk7CisJCWZvciAoaj0wO2o8MTY7aisrKSB7CisJCQlwcmludGsgKCIlMDJ4ICVzIiwgYWRkcltqK2ldLCAoaj09Nyk/IiAiOiIiKTsKKwkJfQorCQlmb3IgKGo9MDtqPDE2O2orKykgeworCQkJY2ggPSBhZGRyW2oraV07CisJCQlwcmludGsgKCIlYyIsIChjaCA8IDB4MjApPycuJzooKGNoID4gMHg3Zik/Jy4nOmNoKSk7CisJCX0KKwkJcHJpbnRrICgiXG4iKTsKKwl9Cit9CisjZW5kaWYKKworCisKKy8qIFRoaXMgbmVlZHMgcmVkb2luZyBmb3IgQWxwaGEgLS0gUkVXIC0tIERvbmUuICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9zeF9ieXRlIChzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkLCBpbnQgb2Zmc2V0LCB1OCBieXRlKQoreworCXdyaXRlYiAoYnl0ZSwgYm9hcmQtPmJhc2Urb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1OCByZWFkX3N4X2J5dGUgKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQsIGludCBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRiIChib2FyZC0+YmFzZStvZmZzZXQpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9zeF93b3JkIChzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkLCBpbnQgb2Zmc2V0LCB1MTYgd29yZCkKK3sKKwl3cml0ZXcgKHdvcmQsIGJvYXJkLT5iYXNlK29mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHJlYWRfc3hfd29yZCAoc3RydWN0IHN4X2JvYXJkICpib2FyZCwgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZHcgKGJvYXJkLT5iYXNlICsgb2Zmc2V0KTsKK30KKworCitzdGF0aWMgaW50IHN4X2J1c3lfd2FpdF9lcSAoc3RydWN0IHN4X2JvYXJkICpib2FyZCwgCisgICAgICAgICAgICAgICAgICAgICAJICAgIGludCBvZmZzZXQsIGludCBtYXNrLCBpbnQgY29ycmVjdHZhbCkKK3sKKwlpbnQgaTsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlmb3IgKGk9MDsgaSA8IFRJTUVPVVRfMSA7aSsrKQorCQlpZiAoKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIG9mZnNldCkgJiBtYXNrKSA9PSBjb3JyZWN0dmFsKSB7CisJCQlmdW5jX2V4aXQgKCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJZm9yIChpPTA7IGkgPCBUSU1FT1VUXzIgO2krKykgeworCQlpZiAoKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIG9mZnNldCkgJiBtYXNrKSA9PSBjb3JyZWN0dmFsKSB7CisJCQlmdW5jX2V4aXQgKCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQl1ZGVsYXkgKDEpOworCX0KKworCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHN4X2J1c3lfd2FpdF9uZXEgKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQsIAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgIGludCBvZmZzZXQsIGludCBtYXNrLCBpbnQgYmFkdmFsKQoreworCWludCBpOworCisJZnVuY19lbnRlciAoKTsKKworCWZvciAoaT0wOyBpIDwgVElNRU9VVF8xIDtpKyspCisJCWlmICgocmVhZF9zeF9ieXRlIChib2FyZCwgb2Zmc2V0KSAmIG1hc2spICE9IGJhZHZhbCkgeworCQkJZnVuY19leGl0ICgpOworCQkJcmV0dXJuIDE7CisJCX0KKworCWZvciAoaT0wOyBpIDwgVElNRU9VVF8yIDtpKyspIHsKKwkJaWYgKChyZWFkX3N4X2J5dGUgKGJvYXJkLCBvZmZzZXQpICYgbWFzaykgIT0gYmFkdmFsKSB7CisJCQlmdW5jX2V4aXQgKCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQl1ZGVsYXkgKDEpOworCX0KKworCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gMDsKK30KKworCisKKy8qIDUuNi40IG9mIDYyMTAwMjggcjIuMyAqLworc3RhdGljIGludCBzeF9yZXNldCAoc3RydWN0IHN4X2JvYXJkICpib2FyZCkKK3sKKwlmdW5jX2VudGVyICgpOworCisJaWYgKElTX1NYX0JPQVJEIChib2FyZCkpIHsKKworCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU1hfQ09ORklHLCAwKTsKKwkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNYX1JFU0VULCAxKTsgLyogVmFsdWUgZG9lc24ndCBtYXR0ZXIgKi8KKworCQlpZiAoIXN4X2J1c3lfd2FpdF9lcSAoYm9hcmQsIFNYX1JFU0VUX1NUQVRVUywgMSwgMCkpIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJzeDogQ2FyZCBkb2Vzbid0IHJlc3BvbmQgdG8gcmVzZXQuLi4uXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIGlmIChJU19FSVNBX0JPQVJEKGJvYXJkKSkgeworCQlvdXRiKGJvYXJkLT5pcnE8PDQsIGJvYXJkLT5laXNhX2Jhc2UrMHhjMDIpOworCX0gZWxzZSBpZiAoSVNfU0kxX0JPQVJEKGJvYXJkKSkgeworCSAgICAgICAgd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMV9JU0FfUkVTRVQsICAgMCk7IC8vIHZhbHVlIGRvZXMgbm90IG1hdHRlcgorCX0gZWxzZSB7CisJCS8qIEdvcnkgZGV0YWlscyBvZiB0aGUgU0kvSVNBIGJvYXJkICovCisJCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX1JFU0VULCAgICBTSTJfSVNBX1JFU0VUX1NFVCk7CisJCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lSUTExLCAgICBTSTJfSVNBX0lSUTExX0NMRUFSKTsKKwkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSVJRMTIsICAgIFNJMl9JU0FfSVJRMTJfQ0xFQVIpOworCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JUlExNSwgICAgU0kyX0lTQV9JUlExNV9DTEVBUik7CisJCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lOVENMRUFSLCBTSTJfSVNBX0lOVENMRUFSX0NMRUFSKTsKKwkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSVJRU0VULCAgIFNJMl9JU0FfSVJRU0VUX0NMRUFSKTsKKwl9CisKKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIDE7Cit9CisKKworLyogVGhpcyBkb2Vzbid0IHdvcmsgb24gbWFjaGluZXMgd2hlcmUgIk5VTEwiIGlzbid0IDAgKi8KKy8qIElmIHlvdSBoYXZlIG9uZSBvZiB0aG9zZSwgc29tZW9uZSB3aWxsIG5lZWQgdG8gd3JpdGUgCisgICB0aGUgZXF1aXZhbGVudCBvZiB0aGlzLCB3aGljaCB3aWxsIGFtb3VudCB0byBhYm91dCAzIGxpbmVzLiBJIGRvbid0CisgICB3YW50IHRvIGNvbXBsaWNhdGUgdGhpcyByaWdodCBub3cuIC0tIFJFVworICAgKFNlZSwgSSBkbyB3cml0ZSBjb21tZW50cyBldmVyeSBub3cgYW5kIHRoZW4gOi0pICovCisjZGVmaW5lIE9GRlNFVE9GKHN0cmN0LCBlbGVtKSAoKGxvbmcpJigoKHN0cnVjdCBzdHJjdCAqKU5VTEwpLT5lbGVtKSkKKworCisjZGVmaW5lIENIQU5fT0ZGU0VUKHBvcnQsZWxlbSkgKHBvcnQtPmNoX2Jhc2UgKyBPRkZTRVRPRiAoX1NYQ0hBTk5FTCwgZWxlbSkpCisjZGVmaW5lIE1PRFVfT0ZGU0VUKGJvYXJkLGFkZHIsZWxlbSkgICAgKGFkZHIgKyBPRkZTRVRPRiAoX1NYTU9EVUxFLCBlbGVtKSkKKyNkZWZpbmUgIEJSRF9PRkZTRVQoYm9hcmQsZWxlbSkgICAgICAgICAgICAgICAgKE9GRlNFVE9GIChfU1hDQVJELCBlbGVtKSkKKworCisjZGVmaW5lIHN4X3dyaXRlX2NoYW5uZWxfYnl0ZShwb3J0LCBlbGVtLCB2YWwpIFwKKyAgIHdyaXRlX3N4X2J5dGUgKHBvcnQtPmJvYXJkLCBDSEFOX09GRlNFVCAocG9ydCwgZWxlbSksIHZhbCkKKworI2RlZmluZSBzeF9yZWFkX2NoYW5uZWxfYnl0ZShwb3J0LCBlbGVtKSBcCisgICByZWFkX3N4X2J5dGUgKHBvcnQtPmJvYXJkLCBDSEFOX09GRlNFVCAocG9ydCwgZWxlbSkpCisKKyNkZWZpbmUgc3hfd3JpdGVfY2hhbm5lbF93b3JkKHBvcnQsIGVsZW0sIHZhbCkgXAorICAgd3JpdGVfc3hfd29yZCAocG9ydC0+Ym9hcmQsIENIQU5fT0ZGU0VUIChwb3J0LCBlbGVtKSwgdmFsKQorCisjZGVmaW5lIHN4X3JlYWRfY2hhbm5lbF93b3JkKHBvcnQsIGVsZW0pIFwKKyAgIHJlYWRfc3hfd29yZCAocG9ydC0+Ym9hcmQsIENIQU5fT0ZGU0VUIChwb3J0LCBlbGVtKSkKKworCisjZGVmaW5lIHN4X3dyaXRlX21vZHVsZV9ieXRlKGJvYXJkLCBhZGRyLCBlbGVtLCB2YWwpIFwKKyAgIHdyaXRlX3N4X2J5dGUgKGJvYXJkLCBNT0RVX09GRlNFVCAoYm9hcmQsIGFkZHIsIGVsZW0pLCB2YWwpCisKKyNkZWZpbmUgc3hfcmVhZF9tb2R1bGVfYnl0ZShib2FyZCwgYWRkciwgZWxlbSkgXAorICAgcmVhZF9zeF9ieXRlIChib2FyZCwgTU9EVV9PRkZTRVQgKGJvYXJkLCBhZGRyLCBlbGVtKSkKKworI2RlZmluZSBzeF93cml0ZV9tb2R1bGVfd29yZChib2FyZCwgYWRkciwgZWxlbSwgdmFsKSBcCisgICB3cml0ZV9zeF93b3JkIChib2FyZCwgTU9EVV9PRkZTRVQgKGJvYXJkLCBhZGRyLCBlbGVtKSwgdmFsKQorCisjZGVmaW5lIHN4X3JlYWRfbW9kdWxlX3dvcmQoYm9hcmQsIGFkZHIsIGVsZW0pIFwKKyAgIHJlYWRfc3hfd29yZCAoYm9hcmQsIE1PRFVfT0ZGU0VUIChib2FyZCwgYWRkciwgZWxlbSkpCisKKworI2RlZmluZSBzeF93cml0ZV9ib2FyZF9ieXRlKGJvYXJkLCBlbGVtLCB2YWwpIFwKKyAgIHdyaXRlX3N4X2J5dGUgKGJvYXJkLCBCUkRfT0ZGU0VUIChib2FyZCwgZWxlbSksIHZhbCkKKworI2RlZmluZSBzeF9yZWFkX2JvYXJkX2J5dGUoYm9hcmQsIGVsZW0pIFwKKyAgIHJlYWRfc3hfYnl0ZSAoYm9hcmQsIEJSRF9PRkZTRVQgKGJvYXJkLCBlbGVtKSkKKworI2RlZmluZSBzeF93cml0ZV9ib2FyZF93b3JkKGJvYXJkLCBlbGVtLCB2YWwpIFwKKyAgIHdyaXRlX3N4X3dvcmQgKGJvYXJkLCBCUkRfT0ZGU0VUIChib2FyZCwgZWxlbSksIHZhbCkKKworI2RlZmluZSBzeF9yZWFkX2JvYXJkX3dvcmQoYm9hcmQsIGVsZW0pIFwKKyAgIHJlYWRfc3hfd29yZCAoYm9hcmQsIEJSRF9PRkZTRVQgKGJvYXJkLCBlbGVtKSkKKworCitzdGF0aWMgaW50IHN4X3N0YXJ0X2JvYXJkIChzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkKQoreworCWlmIChJU19TWF9CT0FSRCAoYm9hcmQpKSB7CisJCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTWF9DT05GSUcsIFNYX0NPTkZfQlVTRU4pOworCX0gZWxzZSBpZiAoSVNfRUlTQV9CT0FSRChib2FyZCkpIHsKKwkJd3JpdGVfc3hfYnl0ZShib2FyZCwgU0kyX0VJU0FfT0ZGLCBTSTJfRUlTQV9WQUwpOworCQlvdXRiKChib2FyZC0+aXJxPDw0KXw0LCBib2FyZC0+ZWlzYV9iYXNlKzB4YzAyKTsKKwl9IGVsc2UgaWYgKElTX1NJMV9CT0FSRChib2FyZCkpIHsKKwkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMV9JU0FfUkVTRVRfQ0xFQVIsIDApOworCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kxX0lTQV9JTlRDTCwgMCk7CisJfSBlbHNlIHsKKwkJLyogRG9uJ3QgYnVnIG1lIGFib3V0IHRoZSBjbGVhcl9zZXQuIAorCQkgICBJIGhhdmVuJ3QgdGhlIGZvZ2dpZXN0IGlkZWEgd2hhdCBpdCdzIGFib3V0IC0tIFJFVyAqLworCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9SRVNFVCwgICAgU0kyX0lTQV9SRVNFVF9DTEVBUik7CisJCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lOVENMRUFSLCBTSTJfSVNBX0lOVENMRUFSX1NFVCk7CisJfQorCXJldHVybiAxOworfQorCisjZGVmaW5lIFNYX0lSUV9SRUdfVkFMKGJvYXJkKSBcCisgICAgICAgICgoYm9hcmQtPmZsYWdzICYgU1hfSVNBX0JPQVJEKT8oYm9hcmQtPmlycSA8PCA0KTowKQorCisvKiBOb3RlLiBUaGUgU1ggcmVnaXN0ZXIgaXMgd3JpdGUtb25seS4gVGhlcmVmb3JlLCB3ZSBoYXZlIHRvIGVuYWJsZSB0aGUKKyAgIGJ1cyB0b28uIFRoaXMgaXMgYSBuby1vcCwgaWYgeW91IGRvbid0IG1lc3Mgd2l0aCB0aGlzIGRyaXZlci4uLiAqLworc3RhdGljIGludCBzeF9zdGFydF9pbnRlcnJ1cHRzIChzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkKQoreworCisJLyogRG9uJ3QgY2FsbCB0aGlzIHdpdGggYm9hcmQtPmlycSA9PSAwICovCisKKwlpZiAoSVNfU1hfQk9BUkQoYm9hcmQpKSB7CisJCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTWF9DT05GSUcsIFNYX0lSUV9SRUdfVkFMIChib2FyZCkgfCAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1hfQ09ORl9CVVNFTiB8IAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWF9DT05GX0hPU1RJUlEpOworCX0gZWxzZSBpZiAoSVNfRUlTQV9CT0FSRChib2FyZCkpIHsKKwkJaW5iKGJvYXJkLT5laXNhX2Jhc2UrMHhjMDMpOyAgCisJfSBlbHNlIGlmIChJU19TSTFfQk9BUkQoYm9hcmQpKSB7CisJICAgICAgIHdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTFfSVNBX0lOVENMLDApOworCSAgICAgICB3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kxX0lTQV9JTlRDTF9DTEVBUiwwKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGJvYXJkLT5pcnEpIHsKKwkJY2FzZSAxMTp3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JUlExMSwgU0kyX0lTQV9JUlExMV9TRVQpO2JyZWFrOworCQljYXNlIDEyOndyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lSUTEyLCBTSTJfSVNBX0lSUTEyX1NFVCk7YnJlYWs7CisJCWNhc2UgMTU6d3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSVJRMTUsIFNJMl9JU0FfSVJRMTVfU0VUKTticmVhazsKKwkJZGVmYXVsdDpwcmludGsgKEtFUk5fSU5GTyAic3g6IFNJL1hJTyBjYXJkIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlcnJ1cHQgJWQuXG4iLCAKKwkJICAgICAgICAgICAgICAgIGJvYXJkLT5pcnEpOworCQlyZXR1cm4gMDsKKwkJfQorCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JTlRDTEVBUiwgU0kyX0lTQV9JTlRDTEVBUl9TRVQpOworCX0KKworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgc3hfc2VuZF9jb21tYW5kIChzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCwgCisgICAgICAgICAgICAgICAgICAgICAJICAgIGludCBjb21tYW5kLCBpbnQgbWFzaywgaW50IG5ld3N0YXQpCit7CisJZnVuY19lbnRlcjIgKCk7CisJd3JpdGVfc3hfYnl0ZSAocG9ydC0+Ym9hcmQsIENIQU5fT0ZGU0VUIChwb3J0LCBoaV9oc3RhdCksIGNvbW1hbmQpOworCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gc3hfYnVzeV93YWl0X2VxIChwb3J0LT5ib2FyZCwgQ0hBTl9PRkZTRVQgKHBvcnQsIGhpX2hzdGF0KSwgbWFzaywgbmV3c3RhdCk7Cit9CisKKworc3RhdGljIGNoYXIgKm1vZF90eXBlX3MgKGludCBtb2R1bGVfdHlwZSkKK3sKKwlzd2l0Y2ggKG1vZHVsZV90eXBlKSB7CisJY2FzZSBUQTQ6ICAgICAgIHJldHVybiAiVEE0IjsKKwljYXNlIFRBODogICAgICAgcmV0dXJuICJUQTgiOworCWNhc2UgVEE0X0FTSUM6ICByZXR1cm4gIlRBNF9BU0lDIjsKKwljYXNlIFRBOF9BU0lDOiAgcmV0dXJuICJUQThfQVNJQyI7CisJY2FzZSBNVEFfQ0QxNDAwOnJldHVybiAiTVRBX0NEMTQwMCI7CisJY2FzZSBTWERDOiAgICAgIHJldHVybiAiU1hEQyI7CisJZGVmYXVsdDpyZXR1cm4gIlVua25vd24vaW52YWxpZCI7CisJfQorfQorCisKK3N0YXRpYyBjaGFyICpwYW5fdHlwZV9zIChpbnQgcGFuX3R5cGUpCit7CisJc3dpdGNoIChwYW5fdHlwZSkgeworCWNhc2UgTU9EX1JTMjMyREIyNTogICAgIHJldHVybiAiTU9EX1JTMjMyREIyNSI7CisJY2FzZSBNT0RfUlMyMzJSSjQ1OiAgICAgcmV0dXJuICJNT0RfUlMyMzJSSjQ1IjsKKwljYXNlIE1PRF9SUzQyMkRCMjU6ICAgICByZXR1cm4gIk1PRF9SUzQyMkRCMjUiOworCWNhc2UgTU9EX1BBUkFMTEVMOiAgICAgIHJldHVybiAiTU9EX1BBUkFMTEVMIjsKKwljYXNlIE1PRF8yX1JTMjMyREIyNTogICByZXR1cm4gIk1PRF8yX1JTMjMyREIyNSI7CisJY2FzZSBNT0RfMl9SUzIzMlJKNDU6ICAgcmV0dXJuICJNT0RfMl9SUzIzMlJKNDUiOworCWNhc2UgTU9EXzJfUlM0MjJEQjI1OiAgIHJldHVybiAiTU9EXzJfUlM0MjJEQjI1IjsKKwljYXNlIE1PRF9SUzIzMkRCMjVNQUxFOiByZXR1cm4gIk1PRF9SUzIzMkRCMjVNQUxFIjsKKwljYXNlIE1PRF8yX1BBUkFMTEVMOiAgICByZXR1cm4gIk1PRF8yX1BBUkFMTEVMIjsKKwljYXNlIE1PRF9CTEFOSzogICAgICAgICByZXR1cm4gImVtcHR5IjsKKwlkZWZhdWx0OnJldHVybiAiaW52YWxpZCI7CisJfQorfQorCisKK3N0YXRpYyBpbnQgbW9kX2NvbXBhdF90eXBlIChpbnQgbW9kdWxlX3R5cGUpCit7CisJcmV0dXJuIG1vZHVsZV90eXBlID4+IDQ7Cit9CisKK3N0YXRpYyB2b2lkIHN4X3JlY29uZmlndXJlX3BvcnQoc3RydWN0IHN4X3BvcnQgKnBvcnQpCit7CisJaWYgKHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9oc3RhdCkgPT0gSFNfSURMRV9PUEVOKSB7CisJCWlmIChzeF9zZW5kX2NvbW1hbmQgKHBvcnQsIEhTX0NPTkZJRywgLTEsIEhTX0lETEVfT1BFTikgIT0gMSkgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgInN4OiBTZW50IHJlY29uZmlndXJlIGNvbW1hbmQsIGJ1dCBjYXJkIGRpZG4ndCByZWFjdC5cbiIpOworCQl9CisJfSBlbHNlIHsKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfVEVSTUlPUywgCisJCSAgICAgICAgICAgICJzeDogTm90IHNlbmRpbmcgcmVjb25maWd1cmU6IHBvcnQgaXNuJ3Qgb3BlbiAoJTAyeCkuXG4iLCAKKwkJICAgICAgICAgICAgc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX2hzdGF0KSk7CisJfQkKK30KKworc3RhdGljIHZvaWQgc3hfc2V0c2lnbmFscyAoc3RydWN0IHN4X3BvcnQgKnBvcnQsIGludCBkdHIsIGludCBydHMpCit7CisJaW50IHQ7CisJZnVuY19lbnRlcjIgKCk7CisKKwl0ID0gc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX29wKTsKKwlpZiAoZHRyID49IDApIHQgPSBkdHI/ICh0IHwgT1BfRFRSKTogKHQgJiB+T1BfRFRSKTsKKwlpZiAocnRzID49IDApIHQgPSBydHM/ICh0IHwgT1BfUlRTKTogKHQgJiB+T1BfUlRTKTsKKwlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX29wLCB0KTsKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJzZXRzaWduYWxzOiAlZC8lZFxuIiwgZHRyLCBydHMpOworCisJZnVuY19leGl0ICgpOworfQorCisKKworc3RhdGljIGludCBzeF9nZXRzaWduYWxzIChzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCkKK3sKKwlpbnQgaV9zdGF0LG9fc3RhdDsKKworCW9fc3RhdCA9IHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9vcCk7CisJaV9zdGF0ID0gc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX2lwKTsKKworCXN4X2RwcmludGsgKFNYX0RFQlVHX01PREVNU0lHTkFMUywgImdldHNpZ25hbHM6ICVkLyVkICAoJWQvJWQpICUwMngvJTAyeFxuIiwKKwkgICAgICAgICAgICAob19zdGF0ICYgT1BfRFRSKSAhPSAwLCAob19zdGF0ICYgT1BfUlRTKSAhPSAwLAorCSAgICAgICAgICAgIHBvcnQtPmNfZGNkLCBzeF9nZXRfQ0QgKHBvcnQpLAorCSAgICAgICAgICAgIHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9pcCksCisJICAgICAgICAgICAgc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3N0YXRlKSk7CisKKwlyZXR1cm4gKCgob19zdGF0ICYgT1BfRFRSKT9USU9DTV9EVFI6MCkgfAorCSAgICAgICAgKChvX3N0YXQgJiBPUF9SVFMpP1RJT0NNX1JUUzowKSB8CisJICAgICAgICAoKGlfc3RhdCAmIElQX0NUUyk/VElPQ01fQ1RTOjApIHwKKwkgICAgICAgICgoaV9zdGF0ICYgSVBfRENEKT9USU9DTV9DQVI6MCkgfAorCSAgICAgICAgKChpX3N0YXQgJiBJUF9EU1IpP1RJT0NNX0RTUjowKSB8CisJICAgICAgICAoKGlfc3RhdCAmIElQX1JJKT9USU9DTV9STkc6MCkKKwkgICAgICAgICk7Cit9CisKKworc3RhdGljIHZvaWQgc3hfc2V0X2JhdWQgKHN0cnVjdCBzeF9wb3J0ICpwb3J0KQoreworCWludCB0OworCisJaWYgKHBvcnQtPmJvYXJkLT50YV90eXBlID09IE1PRF9TWERDKSB7CisJCXN3aXRjaCAocG9ydC0+Z3MuYmF1ZCkgeworCQkgIC8qIFNhdmUgc29tZSB0eXBpbmcgd29yay4uLiAqLworI2RlZmluZSBlKHgpIGNhc2UgeDp0PSBCQVVEXyAjIyB4IDsgYnJlYWsKKwkJCWUoNTApO2UoNzUpO2UoMTEwKTtlKDE1MCk7ZSgyMDApO2UoMzAwKTtlKDYwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlKDEyMDApO2UoMTgwMCk7ZSgyMDAwKTtlKDI0MDApO2UoNDgwMCk7ZSg3MjAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUoOTYwMCk7ZSgxNDQwMCk7ZSgxOTIwMCk7ZSgyODgwMCk7ZSgzODQwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlKDU2MDAwKTtlKDU3NjAwKTtlKDY0MDAwKTtlKDc2ODAwKTtlKDExNTIwMCk7CisJCQllKDEyODAwMCk7ZSgxNTAwMDApO2UoMjMwNDAwKTtlKDI1NjAwMCk7ZSg0NjA4MDApOworICAgICAgICAgICAgICAgICAgICAgICAgZSg5MjE2MDApOworCQljYXNlIDEzNCAgICA6dCA9IEJBVURfMTM0XzU7ICAgYnJlYWs7CisJCWNhc2UgMCAgICAgIDp0ID0gLTE7CisJCQkJCQkJCSBicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIENhbiBJIHJldHVybiAiaW52YWxpZCI/ICovCisJCQl0ID0gQkFVRF85NjAwOworCQkJcHJpbnRrIChLRVJOX0lORk8gInN4OiB1bnN1cHBvcnRlZCBiYXVkIHJhdGU6ICVkLlxuIiwgcG9ydC0+Z3MuYmF1ZCk7CisJCQlicmVhazsKKwkJfQorI3VuZGVmIGUKKwkJaWYgKHQgPiAwKSB7CisJCQkvKiBUaGUgYmF1ZCByYXRlIGlzIG5vdCBzZXQgdG8gMCwgc28gd2UncmUgZW5hYmVsaW5nIERUUi4uLiAtLSBSRVcgKi8KKwkJCXN4X3NldHNpZ25hbHMgKHBvcnQsIDEsIC0xKTsgCisJCQkvKiBYWFggVGhpcyBpcyBub3QgVEEgJiBNVEEgY29tcGF0aWJsZSAqLworCQkJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9jc3IsIDB4ZmYpOworCisJCQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3R4YmF1ZCwgdCk7CisJCQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3J4YmF1ZCwgdCk7CisJCX0gZWxzZSB7CisJCQlzeF9zZXRzaWduYWxzIChwb3J0LCAwLCAtMSk7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKHBvcnQtPmdzLmJhdWQpIHsKKyNkZWZpbmUgZSh4KSBjYXNlIHg6dD0gQ1NSXyAjIyB4IDsgYnJlYWsKKwkJCWUoNzUpO2UoMTUwKTtlKDMwMCk7ZSg2MDApO2UoMTIwMCk7ZSgyNDAwKTtlKDQ4MDApOworICAgICAgICAgICAgICAgICAgICAgICAgZSgxODAwKTtlKDk2MDApOworCQkJZSgxOTIwMCk7ZSg1NzYwMCk7ZSgzODQwMCk7CisJCQkvKiBUQSBzdXBwb3J0cyAxMTAsIGJ1dCBub3QgMTE1MjAwLCBNVEEgc3VwcG9ydHMgMTE1MjAwLCBidXQgbm90IDExMCAqLworCQljYXNlIDExMDogCisJCQlpZiAocG9ydC0+Ym9hcmQtPnRhX3R5cGUgPT0gTU9EX1RBKSB7CisJCQkJdCA9IENTUl8xMTA7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXQgPSBDU1JfOTYwMDsKKwkJCQlwcmludGsgKEtFUk5fSU5GTyAic3g6IFVuc3VwcG9ydGVkIGJhdWQgcmF0ZTogJWQuXG4iLCBwb3J0LT5ncy5iYXVkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSAxMTUyMDA6IAorCQkJaWYgKHBvcnQtPmJvYXJkLT50YV90eXBlID09IE1PRF9UQSkgeworCQkJCXQgPSBDU1JfOTYwMDsKKwkJCQlwcmludGsgKEtFUk5fSU5GTyAic3g6IFVuc3VwcG9ydGVkIGJhdWQgcmF0ZTogJWQuXG4iLCBwb3J0LT5ncy5iYXVkKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJdCA9IENTUl8xMTA7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgMCAgICAgIDp0ID0gLTE7CisJCQkJCQkJCSBicmVhazsKKwkJZGVmYXVsdDoKKwkJCXQgPSBDU1JfOTYwMDsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJzeDogVW5zdXBwb3J0ZWQgYmF1ZCByYXRlOiAlZC5cbiIsIHBvcnQtPmdzLmJhdWQpOworCQkJYnJlYWs7CisJCX0KKyN1bmRlZiBlCisJCWlmICh0ID49IDApIHsKKwkJCXN4X3NldHNpZ25hbHMgKHBvcnQsIDEsIC0xKTsKKwkJCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfY3NyLCB0ICogMHgxMSk7CisJCX0gZWxzZSB7CisJCQlzeF9zZXRzaWduYWxzIChwb3J0LCAwLCAtMSk7CisJCX0KKwl9Cit9CisKKworLyogU2ltb24gQWxsZW4ncyB2ZXJzaW9uIG9mIHRoaXMgcm91dGluZSB3YXMgMjI1IGxpbmVzIGxvbmcuIDg1IGlzIGEgbG90CisgICBiZXR0ZXIuIC0tIFJFVyAqLworCitzdGF0aWMgaW50IHN4X3NldF9yZWFsX3Rlcm1pb3MgKHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCA9IHB0cjsKKworCWZ1bmNfZW50ZXIyKCk7CisKKwlpZiAoIXBvcnQtPmdzLnR0eSkKKwkJcmV0dXJuIDA7CisKKwkvKiBXaGF0IGlzIHRoaXMgZG9pbmcgaGVyZT8gLS0gUkVXCisJICAgSGEhIGZpZ3VyZWQgaXQgb3V0LiBJdCBpcyB0byBhbGxvdyB5b3UgdG8gZ2V0IERUUiBhY3RpdmUgYWdhaW4KKwkgICBpZiB5b3UndmUgZHJvcHBlZCBpdCB3aXRoIHN0dHkgMC4gTW92ZWQgdG8gc2V0X2JhdWQsIHdoZXJlIGl0CisJICAgYmVsb25ncyAobmV4dCB0byB0aGUgZHJvcCBkdHIgaWYgYmF1ZCA9PSAwKSAtLSBSRVcgKi8KKwkvKiBzeF9zZXRzaWduYWxzIChwb3J0LCAxLCAtMSk7ICovCisKKwlzeF9zZXRfYmF1ZCAocG9ydCk7CisKKyNkZWZpbmUgQ0ZMQUcgcG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX2NmbGFnCisJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9tcjEsCisJICAgICAgICAgICAgICAgICAgICAgICAoQ19QQVJFTkIgKHBvcnQtPmdzLnR0eSk/IE1SMV9XSVRIOk1SMV9OT05FKSB8CisJICAgICAgICAgICAgICAgICAgICAgICAoQ19QQVJPREQgKHBvcnQtPmdzLnR0eSk/IE1SMV9PREQ6TVIxX0VWRU4pIHwKKwkgICAgICAgICAgICAgICAgICAgICAgIChDX0NSVFNDVFMocG9ydC0+Z3MudHR5KT8gTVIxX1JUU19SWEZMT1c6MCkgfAorCSAgICAgICAgICAgICAgICAgICAgICAgKCgoQ0ZMQUcgJiBDU0laRSk9PUNTOCkgPyBNUjFfOF9CSVRTOjApIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICgoKENGTEFHICYgQ1NJWkUpPT1DUzcpID8gTVIxXzdfQklUUzowKSB8CisJICAgICAgICAgICAgICAgICAgICAgICAoKChDRkxBRyAmIENTSVpFKT09Q1M2KSA/IE1SMV82X0JJVFM6MCkgfAorCSAgICAgICAgICAgICAgICAgICAgICAgKCgoQ0ZMQUcgJiBDU0laRSk9PUNTNSkgPyBNUjFfNV9CSVRTOjApICk7CisKKwlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX21yMiwKKwkgICAgICAgICAgICAgICAgICAgICAgIChDX0NSVFNDVFMocG9ydC0+Z3MudHR5KT9NUjJfQ1RTX1RYRkxPVzowKSB8CisJICAgICAgICAgICAgICAgICAgICAgICAoQ19DU1RPUEIgKHBvcnQtPmdzLnR0eSk/TVIyXzJfU1RPUDpNUjJfMV9TVE9QKSk7CisKKwlzd2l0Y2ggKENGTEFHICYgQ1NJWkUpIHsKKwljYXNlIENTODpzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX21hc2ssIDB4ZmYpO2JyZWFrOworCWNhc2UgQ1M3OnN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfbWFzaywgMHg3Zik7YnJlYWs7CisJY2FzZSBDUzY6c3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9tYXNrLCAweDNmKTticmVhazsKKwljYXNlIENTNTpzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX21hc2ssIDB4MWYpO2JyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayAoS0VSTl9JTkZPICJzeDogSW52YWxpZCB3b3Jkc2l6ZTogJWRcbiIsIENGTEFHICYgQ1NJWkUpOworCQlicmVhazsKKwl9CisKKwlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3BydGNsLCAKKwkgICAgICAgICAgICAgICAgICAgICAgIChJX0lYT04gICAocG9ydC0+Z3MudHR5KT9TUF9UWEVOOjApIHwKKwkgICAgICAgICAgICAgICAgICAgICAgIChJX0lYT0ZGICAocG9ydC0+Z3MudHR5KT9TUF9SWEVOOjApIHwKKwkgICAgICAgICAgICAgICAgICAgICAgIChJX0lYQU5ZICAocG9ydC0+Z3MudHR5KT9TUF9UQU5ZOjApIHwKKwkgICAgICAgICAgICAgICAgICAgICAgIFNQX0RDRU4pOworCisJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9icmVhaywgCisJICAgICAgICAgICAgICAgICAgICAgICAoSV9JR05CUksocG9ydC0+Z3MudHR5KT9CUl9JR046MCB8CisJICAgICAgICAgICAgICAgICAgICAgICAgSV9CUktJTlQocG9ydC0+Z3MudHR5KT9CUl9JTlQ6MCkpOworCisJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV90eG9uLCAgU1RBUlRfQ0hBUiAocG9ydC0+Z3MudHR5KSk7CisJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9yeG9uLCAgU1RBUlRfQ0hBUiAocG9ydC0+Z3MudHR5KSk7CisJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV90eG9mZiwgU1RPUF9DSEFSICAocG9ydC0+Z3MudHR5KSk7CisJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9yeG9mZiwgU1RPUF9DSEFSICAocG9ydC0+Z3MudHR5KSk7CisKKwlzeF9yZWNvbmZpZ3VyZV9wb3J0KHBvcnQpOworCisJLyogVGVsbCBsaW5lIGRpc2NpcGxpbmUgd2hldGhlciB3ZSB3aWxsIGRvIGlucHV0IGNvb2tpbmcgKi8KKwlpZihJX09USEVSKHBvcnQtPmdzLnR0eSkpIHsKKwkJY2xlYXJfYml0KFRUWV9IV19DT09LX0lOLCAmcG9ydC0+Z3MudHR5LT5mbGFncyk7CisJfSBlbHNlIHsKKwkJc2V0X2JpdChUVFlfSFdfQ09PS19JTiwgJnBvcnQtPmdzLnR0eS0+ZmxhZ3MpOworCX0KKwlzeF9kcHJpbnRrIChTWF9ERUJVR19URVJNSU9TLCAiaWZsYWdzOiAleCglZCkgIiwgCisJICAgICAgICAgICAgcG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX2lmbGFnLCAKKwkgICAgICAgICAgICBJX09USEVSKHBvcnQtPmdzLnR0eSkpOworCisKKy8qIFRlbGwgbGluZSBkaXNjaXBsaW5lIHdoZXRoZXIgd2Ugd2lsbCBkbyBvdXRwdXQgY29va2luZy4KKyAqIElmIE9QT1NUIGlzIHNldCBhbmQgbm8gb3RoZXIgb3V0cHV0IGZsYWdzIGFyZSBzZXQgdGhlbiB3ZSBjYW4gZG8gb3V0cHV0CisgKiBwcm9jZXNzaW5nLiAgRXZlbiBpZiBvbmx5ICpvbmUqIG90aGVyIGZsYWcgaW4gdGhlIE9fT1RIRVIgZ3JvdXAgaXMgc2V0CisgKiB3ZSBkbyBjb29raW5nIGluIHNvZnR3YXJlLgorICovCisJaWYoT19PUE9TVChwb3J0LT5ncy50dHkpICYmICFPX09USEVSKHBvcnQtPmdzLnR0eSkpIHsKKwkJc2V0X2JpdChUVFlfSFdfQ09PS19PVVQsICZwb3J0LT5ncy50dHktPmZsYWdzKTsKKwl9IGVsc2UgeworCQljbGVhcl9iaXQoVFRZX0hXX0NPT0tfT1VULCAmcG9ydC0+Z3MudHR5LT5mbGFncyk7CisJfQorCXN4X2RwcmludGsgKFNYX0RFQlVHX1RFUk1JT1MsICJvZmxhZ3M6ICV4KCVkKVxuIiwgCisJICAgICAgICAgICAgcG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX29mbGFnLCAKKwkgICAgICAgICAgICBPX09USEVSKHBvcnQtPmdzLnR0eSkpOworCS8qIHBvcnQtPmNfZGNkID0gc3hfZ2V0X0NEIChwb3J0KTsgKi8KKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIDA7Cit9CisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoKKyAqICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcnJ1cHQgcmVsYXRlZCByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBOb3RlOgorICAgT3RoZXIgZHJpdmVycyB1c2UgdGhlIG1hY3JvICJNSU4iIHRvIGNhbGN1bGF0ZSBob3cgbXVjaCB0byBjb3B5LgorICAgVGhpcyBoYXMgdGhlIGRpc2FkdmFudGFnZSB0aGF0IGl0IHdpbGwgZXZhbHVhdGUgcGFydHMgdHdpY2UuIFRoYXQncworICAgZXhwZW5zaXZlIHdoZW4gaXQncyBJTyAoYW5kIHRoZSBjb21waWxlciBjYW5ub3Qgb3B0aW1pemUgdGhvc2UgYXdheSEpLgorICAgTW9yZW92ZXIsIEknbSBub3Qgc3VyZSB0aGF0IHlvdSdyZSByYWNlLWZyZWUuIAorCisgICBJIGFzc2lnbiBhIHZhbHVlLCBhbmQgdGhlbiBvbmx5IGFsbG93IHRoZSB2YWx1ZSB0byBkZWNyZWFzZS4gVGhpcworICAgaXMgYWx3YXlzIHNhZmUuIFRoaXMgbWFrZXMgdGhlIGNvZGUgYSBmZXcgbGluZXMgbG9uZ2VyLCBhbmQgeW91CisgICBrbm93IEknbSBkZWFkIGFnYWluc3QgdGhhdCwgYnV0IEkgdGhpbmsgaXQgaXMgcmVxdWlyZWQgaW4gdGhpcworICAgY2FzZS4gICovCisKKworc3RhdGljIHZvaWQgc3hfdHJhbnNtaXRfY2hhcnMgKHN0cnVjdCBzeF9wb3J0ICpwb3J0KQoreworCWludCBjOworCWludCB0eF9pcDsKKwlpbnQgdHhyb29tOworCisJZnVuY19lbnRlcjIgKCk7CisJc3hfZHByaW50ayAoU1hfREVCVUdfVFJBTlNNSVQsICJQb3J0ICVwOiB0cmFuc21pdCAlZCBjaGFyc1xuIiwgCisJICAgICAgICAgICAgcG9ydCwgcG9ydC0+Z3MueG1pdF9jbnQpOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQgKFNYX1BPUlRfVFJBTlNNSVRfTE9DSywgJnBvcnQtPmxvY2tzKSkgeworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKDEpIHsKKwkJYyA9IHBvcnQtPmdzLnhtaXRfY250OworCisJCXN4X2RwcmludGsgKFNYX0RFQlVHX1RSQU5TTUlULCAiQ29weWluZyAlZCAiLCBjKTsKKwkJdHhfaXAgID0gc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3R4aXBvcyk7CisKKwkJLyogVG9vayBtZSA1IG1pbnV0ZXMgdG8gZGVkdWNlIHRoaXMgZm9ybXVsYS4gCisJCSAgIEx1Y2tpbHkgaXQgaXMgbGl0ZXJhbGx5IGluIHRoZSBtYW51YWwgaW4gc2VjdGlvbiA2LjUuNC4zLjUgKi8KKwkJdHhyb29tID0gKHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV90eG9wb3MpIC0gdHhfaXAgLSAxKSAmIDB4ZmY7CisKKwkJLyogRG9uJ3QgY29weSBtb3JlIGJ5dGVzIHRoYW4gdGhlcmUgaXMgcm9vbSBmb3IgaW4gdGhlIGJ1ZmZlciAqLworCQlpZiAoYyA+IHR4cm9vbSkKKwkJCWMgPSB0eHJvb207CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX1RSQU5TTUlULCAiICVkKCVkKSAiLCBjLCB0eHJvb20gKTsKKworCQkvKiBEb24ndCBjb3B5IHBhc3QgdGhlIGVuZCBvZiB0aGUgaGFyZHdhcmUgdHJhbnNtaXQgYnVmZmVyICovCisJCWlmIChjID4gMHgxMDAgLSB0eF9pcCkgCisJCQljID0gMHgxMDAgLSB0eF9pcDsKKworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19UUkFOU01JVCwgIiAlZCglZCkgIiwgYywgMHgxMDAtdHhfaXAgKTsKKworCQkvKiBEb24ndCBjb3B5IHBhcyB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgYnVmZmVyICovCisJCWlmIChjID4gU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPmdzLnhtaXRfdGFpbCkgCisJCQljID0gU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPmdzLnhtaXRfdGFpbDsKKworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19UUkFOU01JVCwgIiAlZCglbGQpIFxuIiwgCisJCSAgICAgICAgICAgIGMsIFNFUklBTF9YTUlUX1NJWkUtIHBvcnQtPmdzLnhtaXRfdGFpbCk7CisKKwkJLyogSWYgZm9yIG9uZSByZWFzb24gb3IgYW5vdGhlciwgd2UgY2FuJ3QgY29weSBtb3JlIGRhdGEsIHdlJ3JlIGRvbmUhICovCisJCWlmIChjID09IDApIGJyZWFrOworCisKKwkJbWVtY3B5X3RvaW8gKHBvcnQtPmJvYXJkLT5iYXNlICsgQ0hBTl9PRkZTRVQocG9ydCxoaV90eGJ1ZikgKyB0eF9pcCwgCisJCSAgICAgICAgICAgICBwb3J0LT5ncy54bWl0X2J1ZiArIHBvcnQtPmdzLnhtaXRfdGFpbCwgYyk7CisKKwkJLyogVXBkYXRlIHRoZSBwb2ludGVyIGluIHRoZSBjYXJkICovCisJCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfdHhpcG9zLCAodHhfaXArYykgJiAweGZmKTsKKworCQkvKiBVcGRhdGUgdGhlIGtlcm5lbCBidWZmZXIgZW5kICovCisJCXBvcnQtPmdzLnhtaXRfdGFpbCA9IChwb3J0LT5ncy54bWl0X3RhaWwgKyBjKSAmIChTRVJJQUxfWE1JVF9TSVpFLTEpOworCisJCS8qIFRoaXMgb25lIGxhc3QuICh0aGlzIGlzIGVzc2VudGlhbCkKKwkJICAgSXQgd291bGQgYWxsb3cgb3RoZXJzIHRvIHN0YXJ0IHB1dHRpbmcgbW9yZSBkYXRhIGludG8gdGhlIGJ1ZmZlciEgKi8KKwkJcG9ydC0+Z3MueG1pdF9jbnQgLT0gYzsKKwl9CisKKwlpZiAocG9ydC0+Z3MueG1pdF9jbnQgPT0gMCkgeworCQlzeF9kaXNhYmxlX3R4X2ludGVycnVwdHMgKHBvcnQpOworCX0KKworCWlmICgocG9ydC0+Z3MueG1pdF9jbnQgPD0gcG9ydC0+Z3Mud2FrZXVwX2NoYXJzKSAmJiBwb3J0LT5ncy50dHkpIHsKKwkJdHR5X3dha2V1cChwb3J0LT5ncy50dHkpOworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19UUkFOU01JVCwgIldha2luZyB1cC4uLi4gbGRpc2MgKCVkKS4uLi5cbiIsCisJCSAgICAgICAgICAgIHBvcnQtPmdzLndha2V1cF9jaGFycyk7IAorCX0KKworCWNsZWFyX2JpdCAoU1hfUE9SVF9UUkFOU01JVF9MT0NLLCAmcG9ydC0+bG9ja3MpOworCWZ1bmNfZXhpdCAoKTsKK30KKworCisvKiBOb3RlIHRoZSBzeW1tZXRyeSBiZXR3ZWVuIHJlY2VpdmluZyBjaGFycyBhbmQgdHJhbnNtaXR0aW5nIHRoZW0hCisgICBOb3RlOiBUaGUga2VybmVsIHNob3VsZCBoYXZlIGltcGxlbWVudGVkIGJvdGggYSByZWNlaXZlIGJ1ZmZlciBhbmQKKyAgIGEgdHJhbnNtaXQgYnVmZmVyLiAqLworCisvKiBJbmxpbmVkOiBDYWxsZWQgb25seSBvbmNlLiBSZW1vdmUgdGhlIGlubGluZSB3aGVuIHlvdSBhZGQgYW5vdGhlciBjYWxsICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3hfcmVjZWl2ZV9jaGFycyAoc3RydWN0IHN4X3BvcnQgKnBvcnQpCit7CisJaW50IGM7CisJaW50IHJ4X29wOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IGNvcGllZD0wOworCisJZnVuY19lbnRlcjIgKCk7CisJdHR5ID0gcG9ydC0+Z3MudHR5OworCXdoaWxlICgxKSB7CisJCXJ4X29wID0gc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3J4b3Bvcyk7CisJCWMgPSAoc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3J4aXBvcykgLSByeF9vcCkgJiAweGZmOworCisJCXN4X2RwcmludGsgKFNYX0RFQlVHX1JFQ0VJVkUsICJyeG9wPSVkLCBjID0gJWQuXG4iLCByeF9vcCwgYyk7IAorCisJCS8qIERvbid0IGNvcHkgbW9yZSBieXRlcyB0aGFuIHRoZXJlIGlzIHJvb20gZm9yIGluIHRoZSBidWZmZXIgKi8KKwkJaWYgKHR0eS0+ZmxpcC5jb3VudCArIGMgPiBUVFlfRkxJUEJVRl9TSVpFKSAKKwkJCWMgPSBUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50OworCisJCXN4X2RwcmludGsgKFNYX0RFQlVHX1JFQ0VJVkUsICJjID0gJWQuXG4iLCBjKTsgCisKKwkJLyogRG9uJ3QgY29weSBwYXN0IHRoZSBlbmQgb2YgdGhlIGhhcmR3YXJlIHJlY2VpdmUgYnVmZmVyICovCisJCWlmIChyeF9vcCArIGMgPiAweDEwMCkgYyA9IDB4MTAwIC0gcnhfb3A7CisKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfUkVDRUlWRSwgImMgPSAlZC5cbiIsIGMpOworCisJCS8qIElmIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIsIHdlIGNhbid0IGNvcHkgbW9yZSBkYXRhLCB3ZSdyZSBkb25lISAqLworCQlpZiAoYyA9PSAwKSBicmVhazsKKworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19SRUNFSVZFICwgIkNvcHlpbmcgb3ZlciAlZCBjaGFycy4gRmlyc3QgaXMgJWQgYXQgJWx4XG4iLCBjLCAKKwkJICAgICAgICAgICAgcmVhZF9zeF9ieXRlIChwb3J0LT5ib2FyZCwgQ0hBTl9PRkZTRVQocG9ydCxoaV9yeGJ1ZikgKyByeF9vcCksCisJCSAgICAgICAgICAgIENIQU5fT0ZGU0VUKHBvcnQsIGhpX3J4YnVmKSk7IAorCQltZW1jcHlfZnJvbWlvICh0dHktPmZsaXAuY2hhcl9idWZfcHRyLCAKKwkJICAgICAgICAgICAgICAgcG9ydC0+Ym9hcmQtPmJhc2UgKyBDSEFOX09GRlNFVChwb3J0LGhpX3J4YnVmKSArIHJ4X29wLCBjKTsKKwkJbWVtc2V0KHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsIFRUWV9OT1JNQUwsIGMpOworCisJCS8qIFVwZGF0ZSB0aGUga2VybmVsIGJ1ZmZlciBlbmQgKi8KKwkJdHR5LT5mbGlwLmNvdW50ICs9IGM7CisJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gYzsKKwkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBjOworCisJCS8qIFRoaXMgb25lIGxhc3QuICggTm90IGVzc2VudGlhbC4pCisJCSAgIEl0IGFsbG93cyB0aGUgY2FyZCB0byBzdGFydCBwdXR0aW5nIG1vcmUgZGF0YSBpbnRvIHRoZSBidWZmZXIhIAorCQkgICBVcGRhdGUgdGhlIHBvaW50ZXIgaW4gdGhlIGNhcmQgKi8KKwkJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9yeG9wb3MsIChyeF9vcCArIGMpICYgMHhmZik7CisKKwkJY29waWVkICs9IGM7CisJfQorCWlmIChjb3BpZWQpIHsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisKKwkJZG9fZ2V0dGltZW9mZGF5ICgmdHYpOworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19SRUNFSVZFLCAKKwkJICAgICAgICAgICAgInB1c2hpbmcgZmxpcHEgcG9ydCAlZCAoJTNkIGNoYXJzKTogJWQuJTA2ZCAgKCVkLyVkKVxuIiwgCisJCSAgICAgICAgICAgIHBvcnQtPmxpbmUsIGNvcGllZCwgCisJCSAgICAgICAgICAgIChpbnQpICh0di50dl9zZWMgJSA2MCksIChpbnQpdHYudHZfdXNlYywgdHR5LT5yYXcsIHR0eS0+cmVhbF9yYXcpOworCisJCS8qIFRlbGwgdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbSB0aGUgbmV3cy4gR3JlYXQgbmV3cy4gTmV3IGNoYXJhY3RlcnMhICovCisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoICh0dHkpOworCQkvKiAgICB0dHlfc2NoZWR1bGVfZmxpcCAodHR5KTsgKi8KKwl9CisKKwlmdW5jX2V4aXQgKCk7Cit9CisKKy8qIElubGluZWQ6IGl0IGlzIGNhbGxlZCBvbmx5IG9uY2UuIFJlbW92ZSB0aGUgaW5saW5lIGlmIHlvdSBhZGQgYW5vdGhlciAKKyAgIGNhbGwgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF9jaGVja19tb2RlbV9zaWduYWxzIChzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCkKK3sKKwlpbnQgaGlfc3RhdGU7CisJaW50IGNfZGNkOworCisJaGlfc3RhdGUgPSBzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfc3RhdGUpOworCXN4X2RwcmludGsgKFNYX0RFQlVHX01PREVNU0lHTkFMUywgIkNoZWNraW5nIG1vZGVtIHNpZ25hbHMgKCVkLyVkKVxuIiwKKwkgICAgICAgICAgICBwb3J0LT5jX2RjZCwgc3hfZ2V0X0NEIChwb3J0KSk7CisKKwlpZiAoaGlfc3RhdGUgJiBTVF9CUkVBSykgeworCQloaV9zdGF0ZSAmPSB+U1RfQlJFQUs7CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX01PREVNU0lHTkFMUywgImdvdCBhIGJyZWFrLlxuIik7CisJCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfc3RhdGUsIGhpX3N0YXRlKTsKKwkJZ3NfZ290X2JyZWFrICgmcG9ydC0+Z3MpOworCX0KKwlpZiAoaGlfc3RhdGUgJiBTVF9EQ0QpIHsKKwkJaGlfc3RhdGUgJj0gflNUX0RDRDsKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAiZ290IGEgRENEIGNoYW5nZS5cbiIpOworCQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3N0YXRlLCBoaV9zdGF0ZSk7CisJCWNfZGNkID0gc3hfZ2V0X0NEIChwb3J0KTsKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAiRENEIGlzIG5vdyAlZFxuIiwgY19kY2QpOworCQlpZiAoY19kY2QgIT0gcG9ydC0+Y19kY2QpIHsKKwkJCXBvcnQtPmNfZGNkID0gY19kY2Q7CisJCQlpZiAoc3hfZ2V0X0NEIChwb3J0KSkgeworCQkJCS8qIERDRCB3ZW50IFVQICovCisJCQkJaWYgKChzeF9yZWFkX2NoYW5uZWxfYnl0ZShwb3J0LCBoaV9oc3RhdCkgIT0gSFNfSURMRV9DTE9TRUQpICYmCisJCQkJCQkhKHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkgKSB7CisJCQkJCS8qIEFyZSB3ZSBibG9ja2luZyBpbiBvcGVuPyovCisJCQkJCXN4X2RwcmludGsgKFNYX0RFQlVHX01PREVNU0lHTkFMUywgIkRDRCBhY3RpdmUsIHVuYmxvY2tpbmcgb3BlblxuIik7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+Z3Mub3Blbl93YWl0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJEQ0QgcmFpc2VkLiBJZ25vcmluZy5cbiIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogRENEIHdlbnQgZG93biEgKi8KKwkJCQlpZiAoIShwb3J0LT5ncy50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICkgeworCQkJCQlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJEQ0QgZHJvcHBlZC4gaGFuZ2luZyB1cC4uLi5cbiIpOworCQkJCQl0dHlfaGFuZ3VwIChwb3J0LT5ncy50dHkpOworCQkJCX0gZWxzZSB7CisJCQkJCXN4X2RwcmludGsgKFNYX0RFQlVHX01PREVNU0lHTkFMUywgIkRDRCBkcm9wcGVkLiBpZ25vcmluZy5cbiIpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN4X2RwcmludGsgKFNYX0RFQlVHX01PREVNU0lHTkFMUywgIkhtbW0uIGNhcmQgdG9sZCB1cyBEQ0QgY2hhbmdlZCwgYnV0IGl0IGRpZG4ndC5cbiIpOworCQl9CisJfQorfQorCisKKy8qIFRoaXMgaXMgd2hhdCBhbiBpbnRlcnJ1cHQgcm91dGluZSBzaG91bGQgbG9vayBsaWtlLiAKKyAqIFNtYWxsLCBlbGVnYW50LCBjbGVhci4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3hfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpwdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBzeF9ib2FyZCAqYm9hcmQgPSBwdHI7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQ7CisJaW50IGk7CisKKwlmdW5jX2VudGVyICgpOworCXN4X2RwcmludGsgKFNYX0RFQlVHX0ZMT1csICJzeDogZW50ZXIgc3hfaW50ZXJydXB0ICglZC8lZClcbiIsIGlycSwgYm9hcmQtPmlycSk7IAorCisJLyogQUFhcmdoISBUaGUgb3JkZXIgaW4gd2hpY2ggdG8gZG8gdGhlc2UgdGhpbmdzIGlzIGVzc2VudGlhbCBhbmQKKwkgICBub3QgdHJpdmlhbC4gCisKKwkgICAtIFJhdGUgbGltaXQgZ29lcyBiZWZvcmUgInJlY3Vyc2l2ZSIuIE90aGVyd2lzZSBhIHNlcmllcyBvZgorCSAgICAgcmVjdXJzaXZlIGNhbGxzIHdpbGwgaGFuZyB0aGUgbWFjaGluZSBpbiB0aGUgaW50ZXJydXB0IHJvdXRpbmUuIAorCisJICAgLSBoYXJkd2FyZSB0d2lkZGxpbmcgZ29lcyBiZWZvcmUgInJlY3Vyc2l2ZSIuIE90aGVyd2lzZSB3aGVuIHdlCisJICAgICBwb2xsIHRoZSBjYXJkLCBhbmQgYSByZWN1cnNpdmUgaW50ZXJydXB0IGhhcHBlbnMsIHdlIHdvbid0CisJICAgICBhY2sgdGhlIGNhcmQsIHNvIGl0IG1pZ2h0IGtlZXAgb24gaW50ZXJydXB0aW5nIHVzLiAoZXNwZWNpYWxseQorCSAgICAgbGV2ZWwgc2Vuc2l0aXZlIGludGVycnVwdCBzeXN0ZW1zIGxpa2UgUENJKS4KKworCSAgIC0gUmF0ZSBsaW1pdCBnb2VzIGJlZm9yZSBoYXJkd2FyZSB0d2lkZGxpbmcuIE90aGVyd2lzZSB3ZSB3b24ndAorCSAgICAgY2F0Y2ggYSBjYXJkIHRoYXQgaGFzIGdvbmUgYm9ua2Vycy4KKworCSAgIC0gVGhlICJpbml0aWFsaXplZCIgdGVzdCBnb2VzIGFmdGVyIHRoZSBoYXJkd2FyZSB0d2lkZGxpbmcuIE90aGVyd2lzZQorCSAgICAgdGhlIGNhcmQgd2lsbCBzdGljayB1cyBpbiB0aGUgaW50ZXJydXB0IHJvdXRpbmUgYWdhaW4uCisKKwkgICAtIFRoZSBpbml0aWFsaXplZCB0ZXN0IGdvZXMgYmVmb3JlIHJlY3Vyc2l2ZS4gCisJKi8KKworCisKKyNpZmRlZiBJUlFfUkFURV9MSU1JVAorCS8qIEFhYXJnaCEgSSdtIGFzaGFtZWQuIFRoaXMgY29zdHMgbW9yZSBsaW5lcy1vZi1jb2RlIHRoYW4gdGhlCisJICAgYWN0dWFsIGludGVycnVwdCByb3V0aW5lIS4gKFdlbGwsIHVzZWQgdG8gd2hlbiBJIHdyb3RlIHRoYXQgY29tbWVudCkgKi8KKwl7CisJCXN0YXRpYyBpbnQgbGFzdGppZjsKKwkJc3RhdGljIGludCBuaW50cj0wOworCisJCWlmIChsYXN0amlmID09IGppZmZpZXMpIHsKKwkJCWlmICgrK25pbnRyID4gSVJRX1JBVEVfTElNSVQpIHsKKwkJCQlmcmVlX2lycSAoYm9hcmQtPmlycSwgYm9hcmQpOworCQkJCXByaW50ayAoS0VSTl9FUlIgInN4OiBUb28gbWFueSBpbnRlcnJ1cHRzLiBUdXJuaW5nIG9mZiBpbnRlcnJ1cHQgJWQuXG4iLCAKKwkJCQkJICAgICAgYm9hcmQtPmlycSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsYXN0amlmID0gamlmZmllczsKKwkJCW5pbnRyID0gMDsKKwkJfQorCX0KKyNlbmRpZgorCisKKwlpZiAoYm9hcmQtPmlycSA9PSBpcnEpIHsKKwkJLyogVGVsbCB0aGUgY2FyZCB3ZSd2ZSBub3RpY2VkIHRoZSBpbnRlcnJ1cHQuICovCisKKwkJc3hfd3JpdGVfYm9hcmRfd29yZCAoYm9hcmQsIGNjX2ludF9wZW5kaW5nLCAwKTsKKwkJaWYgKElTX1NYX0JPQVJEIChib2FyZCkpIHsKKwkJCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTWF9SRVNFVF9JUlEsIDEpOworCQl9IGVsc2UgaWYgKElTX0VJU0FfQk9BUkQoYm9hcmQpKSB7CisJCQlpbmIoYm9hcmQtPmVpc2FfYmFzZSsweGMwMyk7CisJCQl3cml0ZV9zeF93b3JkKGJvYXJkLCA4LCAwKTsgCisJCX0gZWxzZSB7CisJCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JTlRDTEVBUiwgU0kyX0lTQV9JTlRDTEVBUl9DTEVBUik7CisJCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JTlRDTEVBUiwgU0kyX0lTQV9JTlRDTEVBUl9TRVQpOworCQl9CisJfQorCisJaWYgKCFzeF9pbml0aWFsaXplZCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWlmICghKGJvYXJkLT5mbGFncyAmIFNYX0JPQVJEX0lOSVRJQUxJWkVEKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQgKFNYX0JPQVJEX0lOVFJfTE9DSywgJmJvYXJkLT5sb2NrcykpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiUmVjdXJzaXZlIGludGVycnVwdCEgKCVkKVxuIiwgYm9hcmQtPmlycSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkgZm9yIChpPTA7aTxib2FyZC0+bnBvcnRzO2krKykgeworCQlwb3J0ID0gJmJvYXJkLT5wb3J0c1tpXTsKKwkJaWYgKHBvcnQtPmdzLmZsYWdzICYgR1NfQUNUSVZFKSB7CisJCQlpZiAoc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3N0YXRlKSkgeworCQkJCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOVEVSUlVQVFMsIAorCQkJCSAgICAgICAgICAgICJQb3J0ICVkOiBtb2RlbSBzaWduYWwgY2hhbmdlPy4uLiBcbiIsIGkpOworCQkJCXN4X2NoZWNrX21vZGVtX3NpZ25hbHMgKHBvcnQpOyAKKwkJCX0KKwkJCWlmIChwb3J0LT5ncy54bWl0X2NudCkgeworCQkJCXN4X3RyYW5zbWl0X2NoYXJzIChwb3J0KTsKKwkJCX0KKwkJCWlmICghKHBvcnQtPmdzLmZsYWdzICYgU1hfUlhfVEhST1RUTEUpKSB7CisJCQkJc3hfcmVjZWl2ZV9jaGFycyAocG9ydCk7CisJCQl9CisJCX0KKwl9CisKKwljbGVhcl9iaXQgKFNYX0JPQVJEX0lOVFJfTE9DSywgJmJvYXJkLT5sb2Nrcyk7CisKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19GTE9XLCAic3g6IGV4aXQgc3hfaW50ZXJydXB0ICglZC8lZClcbiIsIGlycSwgYm9hcmQtPmlycSk7IAorICAgICAgICBmdW5jX2V4aXQgKCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyB2b2lkIHN4X3BvbGxmdW5jICh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHN4X2JvYXJkICpib2FyZCA9IChzdHJ1Y3Qgc3hfYm9hcmQgKikgZGF0YTsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlzeF9pbnRlcnJ1cHQgKDAsIGJvYXJkLCBOVUxMKTsKKworCWluaXRfdGltZXIoJmJvYXJkLT50aW1lcik7CisKKwlib2FyZC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBzeF9wb2xsOworCWFkZF90aW1lciAoJmJvYXJkLT50aW1lcik7CisJZnVuY19leGl0ICgpOworfQorCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCisgKiAgICAgICAgICAgICAgICBIZXJlIGFyZSB0aGUgcm91dGluZXMgdGhhdCBhY3R1YWxseSAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICBpbnRlcmZhY2Ugd2l0aCB0aGUgZ2VuZXJpY19zZXJpYWwgZHJpdmVyICAgICAgICAgICAgICAgICAgKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBFaGhtLiBJIGRvbid0IGtub3cgaG93IHRvIGZpZGRsZSB3aXRoIGludGVycnVwdHMgb24gdGhlIFNYIGNhcmQuIC0tUkVXICovCisvKiBIbW0uIE9rIEkgZmlndXJlZCBpdCBvdXQuIFlvdSBkb24ndC4gICovCisKK3N0YXRpYyB2b2lkIHN4X2Rpc2FibGVfdHhfaW50ZXJydXB0cyAodm9pZCAqIHB0cikgCit7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSBwdHI7IAorCWZ1bmNfZW50ZXIyKCk7CisKKwlwb3J0LT5ncy5mbGFncyAmPSB+R1NfVFhfSU5URU47CisKKwlmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgdm9pZCBzeF9lbmFibGVfdHhfaW50ZXJydXB0cyAodm9pZCAqIHB0cikgCit7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSBwdHI7IAorCWludCBkYXRhX2luX2J1ZmZlcjsKKwlmdW5jX2VudGVyMigpOworCisJLyogRmlyc3QgdHJhbnNtaXQgdGhlIGNoYXJhY3RlcnMgdGhhdCB3ZSdyZSBzdXBwb3NlZCB0byAqLworCXN4X3RyYW5zbWl0X2NoYXJzIChwb3J0KTsKKworCS8qIFRoZSBzeCBjYXJkIHdpbGwgbmV2ZXIgaW50ZXJydXB0IHVzIGlmIHdlIGRvbid0IGZpbGwgdGhlIGJ1ZmZlcgorCSAgIHBhc3QgMjUlLiBTbyB3ZSBrZWVwIGNvbnNpZGVyaW5nIGludGVycnVwdHMgb2ZmIGlmIHRoYXQncyB0aGUgY2FzZS4gKi8KKwlkYXRhX2luX2J1ZmZlciA9IChzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfdHhpcG9zKSAtIAorCSAgICAgICAgICAgICAgICAgIHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV90eG9wb3MpKSAmIDB4ZmY7CisKKwkvKiBYWFggTXVzdCBiZSAiSElHSF9XQVRFUiIgZm9yIFNJIGNhcmQgYWNjb3JkaW5nIHRvIGRvYy4gKi8KKwlpZiAoZGF0YV9pbl9idWZmZXIgPCBMT1dfV0FURVIpIAorCQlwb3J0LT5ncy5mbGFncyAmPSB+R1NfVFhfSU5URU47CisKKwlmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgdm9pZCBzeF9kaXNhYmxlX3J4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAoreworCS8qICBzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCA9IHB0cjsgKi8KKwlmdW5jX2VudGVyKCk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworc3RhdGljIHZvaWQgc3hfZW5hYmxlX3J4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAoreworCS8qICBzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCA9IHB0cjsgKi8KKwlmdW5jX2VudGVyKCk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworCisvKiBKZWV6LiBJc24ndCB0aGlzIHNpbXBsZT8gKi8KK3N0YXRpYyBpbnQgc3hfZ2V0X0NEICh2b2lkICogcHRyKSAKK3sKKwlzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCA9IHB0cjsKKwlmdW5jX2VudGVyMigpOworCisJZnVuY19leGl0KCk7CisJcmV0dXJuICgoc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX2lwKSAmIElQX0RDRCkgIT0gMCk7Cit9CisKKworLyogSmVlei4gSXNuJ3QgdGhpcyBzaW1wbGU/ICovCitzdGF0aWMgaW50IHN4X2NoYXJzX2luX2J1ZmZlciAodm9pZCAqIHB0cikgCit7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSBwdHI7CisJZnVuY19lbnRlcjIoKTsKKworCWZ1bmNfZXhpdCgpOworCXJldHVybiAoKHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV90eGlwb3MpIC0gCisJICAgICAgICAgc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3R4b3BvcykpICYgMHhmZik7Cit9CisKKworc3RhdGljIHZvaWQgc3hfc2h1dGRvd25fcG9ydCAodm9pZCAqIHB0cikgCit7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSBwdHI7IAorCisJZnVuY19lbnRlcigpOworCisJcG9ydC0+Z3MuZmxhZ3MgJj0gfiBHU19BQ1RJVkU7CisJaWYgKHBvcnQtPmdzLnR0eSAmJiAocG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpKSB7CisJCXN4X3NldHNpZ25hbHMgKHBvcnQsIDAsIDApOworCQlzeF9yZWNvbmZpZ3VyZV9wb3J0KHBvcnQpOworCX0KKworCWZ1bmNfZXhpdCgpOworfQorCisKKworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKgorICogICAgICAgICAgICAgICAgSGVyZSBhcmUgdGhlIHJvdXRpbmVzIHRoYXQgYWN0dWFsbHkgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgIGludGVyZmFjZSB3aXRoIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIGludCBzeF9vcGVuICAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3Qgc3hfcG9ydCAqcG9ydDsKKwlpbnQgcmV0dmFsLCBsaW5lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyKCk7CisKKwlpZiAoIXN4X2luaXRpYWxpemVkKSB7CisJCXJldHVybiAtRUlPOworCX0KKworCWxpbmUgPSB0dHktPmluZGV4OworCXN4X2RwcmludGsgKFNYX0RFQlVHX09QRU4sICIlZDogb3BlbmluZyBsaW5lICVkLiB0dHk9JXAgY3R0eT0lcCwgbnA9JWQpXG4iLCAKKwkgICAgICAgICAgICBjdXJyZW50LT5waWQsIGxpbmUsIHR0eSwgY3VycmVudC0+c2lnbmFsLT50dHksIHN4X25wb3J0cyk7CisKKwlpZiAoKGxpbmUgPCAwKSB8fCAobGluZSA+PSBTWF9OUE9SVFMpIHx8IChsaW5lID49IHN4X25wb3J0cykpCisJCXJldHVybiAtRU5PREVWOworCisJcG9ydCA9ICYgc3hfcG9ydHNbbGluZV07CisJcG9ydC0+Y19kY2QgPSAwOyAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgaW50ZXJydXB0IGRvZXNuJ3QgZGV0ZWN0IGEKKwkgICAgICAgICAgICAgICAgICAgIDEgLT4gMCB0cmFuc2l0aW9uLiAqLworCisKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19PUEVOLCAicG9ydCA9ICVwIGNfZGNkID0gJWRcbiIsIHBvcnQsIHBvcnQtPmNfZGNkKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5ncy5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJdHR5LT5kcml2ZXJfZGF0YSA9IHBvcnQ7CisJcG9ydC0+Z3MudHR5ID0gdHR5OworCXBvcnQtPmdzLmNvdW50Kys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+Z3MuZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCXN4X2RwcmludGsgKFNYX0RFQlVHX09QRU4sICJzdGFydGluZyBwb3J0XG4iKTsKKworCS8qCisJICogU3RhcnQgdXAgc2VyaWFsIHBvcnQKKwkgKi8KKwlyZXR2YWwgPSBnc19pbml0X3BvcnQoJnBvcnQtPmdzKTsKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19PUEVOLCAiZG9uZSBnc19pbml0XG4iKTsKKwlpZiAocmV0dmFsKSB7CisJCXBvcnQtPmdzLmNvdW50LS07CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcG9ydC0+Z3MuZmxhZ3MgfD0gR1NfQUNUSVZFOworCWlmIChwb3J0LT5ncy5jb3VudCA8PSAxKQorCQlzeF9zZXRzaWduYWxzIChwb3J0LCAxLDEpOworCisjaWYgMAorCWlmIChzeF9kZWJ1ZyAmIFNYX0RFQlVHX09QRU4pCisJCW15X2hkIChwb3J0LCBzaXplb2YgKCpwb3J0KSk7CisjZWxzZQorCWlmIChzeF9kZWJ1ZyAmIFNYX0RFQlVHX09QRU4pCisJCW15X2hkX2lvIChwb3J0LT5ib2FyZC0+YmFzZSArIHBvcnQtPmNoX2Jhc2UsIHNpemVvZiAoKnBvcnQpKTsKKyNlbmRpZgorCisJaWYgKHBvcnQtPmdzLmNvdW50IDw9IDEpIHsKKwkJaWYgKHN4X3NlbmRfY29tbWFuZCAocG9ydCwgSFNfTE9QRU4sIC0xLCBIU19JRExFX09QRU4pICE9IDEpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgInN4OiBDYXJkIGRpZG4ndCByZXNwb25kIHRvIExPUEVOIGNvbW1hbmQuXG4iKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5ncy5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQkJcG9ydC0+Z3MuY291bnQtLTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmdzLmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCXJldHZhbCA9IGdzX2Jsb2NrX3RpbF9yZWFkeShwb3J0LCBmaWxwKTsKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19PUEVOLCAiQmxvY2sgdGlsIHJlYWR5IHJldHVybmVkICVkLiBDb3VudD0lZFxuIiwgCisJICAgICAgICAgICAgcmV0dmFsLCBwb3J0LT5ncy5jb3VudCk7CisKKwlpZiAocmV0dmFsKSB7CisJCS8qIAorCQkgKiBEb24ndCBsb3dlciBncy5jb3VudCBoZXJlIGJlY2F1c2Ugc3hfY2xvc2UoKSB3aWxsIGJlIGNhbGxlZCBsYXRlcgorCQkgKi8gCisKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJLyogdHR5LT5sb3dfbGF0ZW5jeSA9IDE7ICovCisKKwlwb3J0LT5jX2RjZCA9IHN4X2dldF9DRCAocG9ydCk7CisJc3hfZHByaW50ayAoU1hfREVCVUdfT1BFTiwgImF0IG9wZW46IGNkPSVkXG4iLCBwb3J0LT5jX2RjZCk7CisKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gMDsKKworfQorCisKK3N0YXRpYyB2b2lkIHN4X2Nsb3NlICh2b2lkICpwdHIpCit7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSBwdHI7IAorCS8qIEdpdmUgdGhlIHBvcnQgNSBzZWNvbmRzIHRvIGNsb3NlIGRvd24uICovCisJaW50IHRvID0gNSAqIEhaOyAKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlzeF9zZXRzaWduYWxzIChwb3J0LCAwLCAwKTsKKwlzeF9yZWNvbmZpZ3VyZV9wb3J0KHBvcnQpOwkKKwlzeF9zZW5kX2NvbW1hbmQgKHBvcnQsIEhTX0NMT1NFLCAwLCAwKTsKKworCXdoaWxlICh0by0tICYmIChzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfaHN0YXQpICE9IEhTX0lETEVfQ0xPU0VEKSkKKwkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwKSkKKwkJCWJyZWFrOworCWlmIChzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfaHN0YXQpICE9IEhTX0lETEVfQ0xPU0VEKSB7CisJCWlmIChzeF9zZW5kX2NvbW1hbmQgKHBvcnQsIEhTX0ZPUkNFX0NMT1NFRCwgLTEsIEhTX0lETEVfQ0xPU0VEKSAhPSAxKSB7CisJCQlwcmludGsgKEtFUk5fRVJSIAorCQkJICAgICAgICAic3g6IHNlbnQgdGhlIGZvcmNlX2Nsb3NlIGNvbW1hbmQsIGJ1dCBjYXJkIGRpZG4ndCByZWFjdFxuIik7CisJCX0gZWxzZQorCQkJc3hfZHByaW50ayAoU1hfREVCVUdfQ0xPU0UsICJzZW50IHRoZSBmb3JjZV9jbG9zZSBjb21tYW5kLlxuIik7CisJfQorCisJc3hfZHByaW50ayAoU1hfREVCVUdfQ0xPU0UsICJ3YWl0ZWQgJWQgamlmZmllcyBmb3IgY2xvc2UuIGNvdW50PSVkXG4iLCAKKwkgICAgICAgICAgICA1ICogSFogLSB0byAtIDEsIHBvcnQtPmdzLmNvdW50KTsKKworCWlmKHBvcnQtPmdzLmNvdW50KSB7CisJCXN4X2RwcmludGsoU1hfREVCVUdfQ0xPU0UsICJXQVJOSU5HIHBvcnQgY291bnQ6JWRcbiIsIHBvcnQtPmdzLmNvdW50KTsKKwkJLy9wcmludGsgKCIlcyBTRVRUSU5HIHBvcnQgY291bnQgdG8gemVybzogJXAgY291bnQ6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBvcnQsIHBvcnQtPmdzLmNvdW50KTsKKwkJLy9wb3J0LT5ncy5jb3VudCA9IDA7CisJfQorCisJZnVuY19leGl0ICgpOworfQorCisKKworLyogVGhpcyBpcyByZWxhdGl2ZWx5IHRob3JvdWdoLiBCdXQgdGhlbiBhZ2FpbiBpdCBpcyBvbmx5IDIwIGxpbmVzLiAqLworI2RlZmluZSBNQVJDSFVQICAgIGZvciAoaT1taW47aTxtYXg7aSsrKSAKKyNkZWZpbmUgTUFSQ0hET1dOICBmb3IgKGk9bWF4LTE7aT49bWluO2ktLSkKKyNkZWZpbmUgVzAgICAgICAgICB3cml0ZV9zeF9ieXRlIChib2FyZCwgaSwgMHg1NSkKKyNkZWZpbmUgVzEgICAgICAgICB3cml0ZV9zeF9ieXRlIChib2FyZCwgaSwgMHhhYSkKKyNkZWZpbmUgUjAgICAgICAgICBpZiAocmVhZF9zeF9ieXRlIChib2FyZCwgaSkgIT0gMHg1NSkgcmV0dXJuIDEKKyNkZWZpbmUgUjEgICAgICAgICBpZiAocmVhZF9zeF9ieXRlIChib2FyZCwgaSkgIT0gMHhhYSkgcmV0dXJuIDEKKworLyogVGhpcyBtZW10ZXN0IHRha2VzIGEgaHVtYW4tbm90aWNhYmxlIHRpbWUuIFlvdSBub3JtYWxseSBvbmx5IGRvIGl0CisgICBvbmNlIGEgYm9vdCwgc28gSSBndWVzcyB0aGF0IGl0IGlzIHdvcnRoIGl0LiAqLworc3RhdGljIGludCBkb19tZW10ZXN0IChzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkLCBpbnQgbWluLCBpbnQgbWF4KQoreworCWludCBpOworCisJLyogVGhpcyBpcyBhIG1hcmNoYi4gVGhlb3JldGljYWxseSwgbWFyY2hiIGNhdGNoZXMgbXVjaCBtb3JlIHRoYW4KKwkgICBzaW1wbGVyIHRlc3RzLiBJbiBwcmFjdGlzZSwgdGhlIGxvbmdlciB0ZXN0IGp1c3QgY2F0Y2hlcyBtb3JlCisJICAgaW50ZXJtaXR0ZW50IGVycm9ycy4gLS0gUkVXCisJICAgKEZvciB0aGUgdGhlb3J5IGJlaGluZCBtZW1vcnkgdGVzdGluZyBzZWU6IAorCSAgIFRlc3RpbmcgU2VtaWNvbmR1Y3RvciBNZW1vcmllcyBieSBBLkouIHZhbiBkZSBHb29yLikgKi8KKwlNQVJDSFVQCSB7VzA7fQorCU1BUkNIVVAgICB7UjA7VzE7UjE7VzA7UjA7VzE7fQorCU1BUkNIVVAgICB7UjE7VzA7VzE7fQorCU1BUkNIRE9XTiB7UjE7VzA7VzE7VzA7fQorCU1BUkNIRE9XTiB7UjA7VzE7VzA7fQorCisJcmV0dXJuIDA7Cit9CisKKworI3VuZGVmIE1BUkNIVVAKKyN1bmRlZiBNQVJDSERPV04KKyN1bmRlZiBXMAorI3VuZGVmIFcxCisjdW5kZWYgUjAKKyN1bmRlZiBSMQorCisjZGVmaW5lIE1BUkNIVVAgICAgZm9yIChpPW1pbjtpPG1heDtpKz0yKSAKKyNkZWZpbmUgTUFSQ0hET1dOICBmb3IgKGk9bWF4LTE7aT49bWluO2ktPTIpCisjZGVmaW5lIFcwICAgICAgICAgd3JpdGVfc3hfd29yZCAoYm9hcmQsIGksIDB4NTVhYSkKKyNkZWZpbmUgVzEgICAgICAgICB3cml0ZV9zeF93b3JkIChib2FyZCwgaSwgMHhhYTU1KQorI2RlZmluZSBSMCAgICAgICAgIGlmIChyZWFkX3N4X3dvcmQgKGJvYXJkLCBpKSAhPSAweDU1YWEpIHJldHVybiAxCisjZGVmaW5lIFIxICAgICAgICAgaWYgKHJlYWRfc3hfd29yZCAoYm9hcmQsIGkpICE9IDB4YWE1NSkgcmV0dXJuIDEKKworI2lmIDAKKy8qIFRoaXMgbWVtdGVzdCB0YWtlcyBhIGh1bWFuLW5vdGljYWJsZSB0aW1lLiBZb3Ugbm9ybWFsbHkgb25seSBkbyBpdAorICAgb25jZSBhIGJvb3QsIHNvIEkgZ3Vlc3MgdGhhdCBpdCBpcyB3b3J0aCBpdC4gKi8KK3N0YXRpYyBpbnQgZG9fbWVtdGVzdF93IChzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkLCBpbnQgbWluLCBpbnQgbWF4KQoreworCWludCBpOworCisJTUFSQ0hVUCAgIHtXMDt9CisJTUFSQ0hVUCAgIHtSMDtXMTtSMTtXMDtSMDtXMTt9CisJTUFSQ0hVUCAgIHtSMTtXMDtXMTt9CisJTUFSQ0hET1dOIHtSMTtXMDtXMTtXMDt9CisJTUFSQ0hET1dOIHtSMDtXMTtXMDt9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgc3hfZndfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJjID0gMDsKKwlpbnQgX191c2VyICpkZXNjciA9IChpbnQgX191c2VyICopYXJnOworCWludCBpOworCXN0YXRpYyBzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkID0gTlVMTDsKKwlpbnQgbmJ5dGVzLCBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWNoYXIgKnRtcDsKKworCWZ1bmNfZW50ZXIoKTsKKworI2lmIDAgCisJLyogUmVtb3ZlZCBzdXBlcnVzZXIgY2hlY2s6IFN5c29wcyBjYW4gdXNlIHRoZSBwZXJtaXNzaW9ucyBvbiB0aGUgZGV2aWNlCisJICAgZmlsZSB0byByZXN0cmljdCBhY2Nlc3MuIFJlY29tbWVuZGF0aW9uOiBSb290IG9ubHkuIChyb290LnJvb3QgNjAwKSAqLworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlyZXR1cm4gLUVQRVJNOworCX0KKyNlbmRpZgorCisJc3hfZHByaW50ayAoU1hfREVCVUdfRklSTVdBUkUsICJJT0NUTCAleDogJWx4XG4iLCBjbWQsIGFyZyk7CisKKwlpZiAoIWJvYXJkKSBib2FyZCA9ICZib2FyZHNbMF07CisJaWYgKGJvYXJkLT5mbGFncyAmIFNYX0JPQVJEX1BSRVNFTlQpIHsKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfRklSTVdBUkUsICJCb2FyZCBwcmVzZW50ISAoJXgpXG4iLCAKKwkJICAgICAgICAgICAgYm9hcmQtPmZsYWdzKTsKKwl9IGVsc2UgeworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19GSVJNV0FSRSwgIkJvYXJkIG5vdCBwcmVzZW50ISAoJXgpIGFsbDoiLCAKKwkJICAgICAgICAgICAgYm9hcmQtPmZsYWdzKTsKKwkJZm9yIChpPTA7aTwgU1hfTkJPQVJEUztpKyspCisJCQlzeF9kcHJpbnRrIChTWF9ERUJVR19GSVJNV0FSRSwgIjwleD4gIiwgYm9hcmRzW2ldLmZsYWdzKTsKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfRklSTVdBUkUsICJcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU1hJT19TRVRfQk9BUkQ6CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX0ZJUk1XQVJFLCAic2V0IGJvYXJkIHRvICVsZFxuIiwgYXJnKTsKKwkJaWYgKGFyZyA+PSBTWF9OQk9BUkRTKSByZXR1cm4gLUVJTzsKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfRklSTVdBUkUsICJub3Qgb3V0IG9mIHJhbmdlXG4iKTsKKwkJaWYgKCEoYm9hcmRzW2FyZ10uZmxhZ3MJJiBTWF9CT0FSRF9QUkVTRU5UKSkgcmV0dXJuIC1FSU87CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX0ZJUk1XQVJFLCAiLi4gYW5kIHByZXNlbnQhXG4iKTsKKwkJYm9hcmQgPSAmYm9hcmRzW2FyZ107CisJCWJyZWFrOworCWNhc2UgU1hJT19HRVRfVFlQRToKKwkJcmMgPSAtRU5PRU5UOyAvKiBJZiB3ZSBtYW5hZ2UgdG8gbWlzcyBvbmUsIHJldHVybiBlcnJvci4gKi8KKwkJaWYgKElTX1NYX0JPQVJEIChib2FyZCkpIHJjID0gU1hfVFlQRV9TWDsKKwkJaWYgKElTX0NGX0JPQVJEIChib2FyZCkpIHJjID0gU1hfVFlQRV9DRjsKKwkJaWYgKElTX1NJX0JPQVJEIChib2FyZCkpIHJjID0gU1hfVFlQRV9TSTsKKwkJaWYgKElTX1NJMV9CT0FSRCAoYm9hcmQpKSByYyA9IFNYX1RZUEVfU0k7CisJCWlmIChJU19FSVNBX0JPQVJEIChib2FyZCkpIHJjID0gU1hfVFlQRV9TSTsKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfRklSTVdBUkUsICJyZXR1cm5pbmcgdHlwZT0gJWRcbiIsIHJjKTsKKwkJYnJlYWs7CisJY2FzZSBTWElPX0RPX1JBTVRFU1Q6CisJCWlmIChzeF9pbml0aWFsaXplZCkgLyogQWxyZWFkeSBpbml0aWFsaXplZDogYmV0dGVyIG5vdCByYW10ZXN0IHRoZSBib2FyZC4gICovCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoSVNfU1hfQk9BUkQgKGJvYXJkKSkgeworCQkJcmMgICAgICAgICAgPSBkb19tZW10ZXN0ICAgKGJvYXJkLCAwLCAweDcwMDApOworCQkJaWYgKCFyYykgcmMgPSBkb19tZW10ZXN0ICAgKGJvYXJkLCAwLCAweDcwMDApOworCQkJLyppZiAoIXJjKSByYyA9IGRvX21lbXRlc3RfdyAoYm9hcmQsIDAsIDB4NzAwMCk7Ki8KKwkJfSBlbHNlIHsKKwkJCXJjICAgICAgICAgICAgID0gZG9fbWVtdGVzdCAgIChib2FyZCwgMCwgMHg3ZmY4KTsKKwkJCS8qIGlmICghcmMpIHJjID0gZG9fbWVtdGVzdF93IChib2FyZCwgMCwgMHg3ZmY4KTsgKi8KKwkJfQorCQlzeF9kcHJpbnRrIChTWF9ERUJVR19GSVJNV0FSRSwgInJldHVybmluZyBtZW10ZXN0IHJlc3VsdD0gJWRcbiIsIHJjKTsKKwkJYnJlYWs7CisJY2FzZSBTWElPX0RPV05MT0FEOgorCQlpZiAoc3hfaW5pdGlhbGl6ZWQpIC8qIEFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KKwkJCXJldHVybiAtRUVYSVNUOworCQlpZiAoIXN4X3Jlc2V0IChib2FyZCkpIAorCQkJcmV0dXJuIC1FSU87CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOSVQsICJyZXNldCB0aGUgYm9hcmQuLi5cbiIpOworCisJCXRtcCA9IGttYWxsb2MgKFNYX0NIVU5LX1NJWkUsIEdGUF9VU0VSKTsKKwkJaWYgKCF0bXApIHJldHVybiAtRU5PTUVNOworCQlnZXRfdXNlciAobmJ5dGVzLCBkZXNjcisrKTsKKwkJZ2V0X3VzZXIgKG9mZnNldCwgZGVzY3IrKyk7IAorCQlnZXRfdXNlciAoZGF0YSwJIGRlc2NyKyspOworCQl3aGlsZSAobmJ5dGVzICYmIGRhdGEpIHsKKwkJCWZvciAoaT0wO2k8bmJ5dGVzO2kgKz0gU1hfQ0hVTktfU0laRSkgeworCQkJCWlmIChjb3B5X2Zyb21fdXNlcih0bXAsIChjaGFyIF9fdXNlciAqKWRhdGEraSwgCisJCQkJCQkgICAoaSArIFNYX0NIVU5LX1NJWkUgPgorCQkJCQkJICAgIG5ieXRlcykgPyBuYnl0ZXMgLSBpIDoKKwkJCQkJCSAgIAkgICAgICBTWF9DSFVOS19TSVpFKSkgeworCQkJCQlrZnJlZSAodG1wKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCW1lbWNweV90b2lvKGJvYXJkLT5iYXNlMiArIG9mZnNldCArIGksIHRtcCwgCisJCQkJICAgICAgICAgICAgICAgIChpK1NYX0NIVU5LX1NJWkU+bmJ5dGVzKT9uYnl0ZXMtaTpTWF9DSFVOS19TSVpFKTsKKwkJCX0KKworCQkJZ2V0X3VzZXIgKG5ieXRlcywgZGVzY3IrKyk7CisJCQlnZXRfdXNlciAob2Zmc2V0LCBkZXNjcisrKTsgCisJCQlnZXRfdXNlciAoZGF0YSwgICBkZXNjcisrKTsKKwkJfQorCQlrZnJlZSAodG1wKTsKKwkJc3hfbnBvcnRzICs9IHN4X2luaXRfYm9hcmQgKGJvYXJkKTsKKwkJcmMgPSBzeF9ucG9ydHM7CisJCWJyZWFrOworCWNhc2UgU1hJT19JTklUOgorCQlpZiAoc3hfaW5pdGlhbGl6ZWQpIC8qIEFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KKwkJCXJldHVybiAtRUVYSVNUOworCQkvKiBUaGlzIGlzIG5vdCBhbGxvd2VkIHVudGlsIGFsbCBib2FyZHMgYXJlIGluaXRpYWxpemVkLi4uICovCisJCWZvciAoaT0wO2k8U1hfTkJPQVJEUztpKyspIHsKKwkJCWlmICggKGJvYXJkc1tpXS5mbGFncyAmIFNYX0JPQVJEX1BSRVNFTlQpICYmCisJCQkgICAgICEoYm9hcmRzW2ldLmZsYWdzICYgU1hfQk9BUkRfSU5JVElBTElaRUQpKQorCQkJCXJldHVybiAtRUlPOworCQl9CisJCWZvciAoaT0wO2k8U1hfTkJPQVJEUztpKyspCisJCQlpZiAoIShib2FyZHNbaV0uZmxhZ3MgJiBTWF9CT0FSRF9QUkVTRU5UKSkgYnJlYWs7CisKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfRklSTVdBUkUsICJpbml0aW5nIHBvcnRzdHJ1Y3RzLCAlZCBib2FyZHMsICIKKwkJICAgICAgICAgICAgIiVkIGNoYW5uZWxzLCBmaXJzdCBib2FyZDogJWQgcG9ydHNcbiIsIAorCQkgICAgICAgICAgICBpLCBzeF9ucG9ydHMsIGJvYXJkc1swXS5ucG9ydHMpOworCQlyYyA9IHN4X2luaXRfcG9ydHN0cnVjdHMgKGksIHN4X25wb3J0cyk7CisJCXN4X2luaXRfZHJpdmVycyAoKTsKKwkJaWYgKHJjID49IDApIAorCQkJc3hfaW5pdGlhbGl6ZWQrKzsKKwkJYnJlYWs7CisJY2FzZSBTWElPX1NFVERFQlVHOgorCQlzeF9kZWJ1ZyA9IGFyZzsKKwkJYnJlYWs7CisJY2FzZSBTWElPX0dFVERFQlVHOgorCQlyYyA9IHN4X2RlYnVnOworCQlicmVhazsKKwljYXNlIFNYSU9fR0VUR1NERUJVRzoKKwljYXNlIFNYSU9fU0VUR1NERUJVRzoKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFNYSU9fR0VUTlBPUlRTOgorCQlyYyA9IHN4X25wb3J0czsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIlVua25vd24gaW9jdGwgb24gZmlybXdhcmUgZGV2aWNlICgleCkuXG4iLCBjbWQpOworCQlicmVhazsKKwl9CisJZnVuY19leGl0ICgpOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZCBzeF9icmVhayAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIGludCBmbGFnKQoreworCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcnY7CisKKwlmdW5jX2VudGVyICgpOworCisJaWYgKGZsYWcpIAorCQlydiA9IHN4X3NlbmRfY29tbWFuZCAocG9ydCwgSFNfU1RBUlQsIC0xLCBIU19JRExFX0JSRUFLKTsKKwllbHNlIAorCQlydiA9IHN4X3NlbmRfY29tbWFuZCAocG9ydCwgSFNfU1RPUCwgLTEsIEhTX0lETEVfT1BFTik7CisJaWYgKHJ2ICE9IDEpIHByaW50ayAoS0VSTl9FUlIgInN4OiBjb3VsZG4ndCBzZW5kIGJyZWFrICgleCkuXG4iLAorCQkJcmVhZF9zeF9ieXRlIChwb3J0LT5ib2FyZCwgQ0hBTl9PRkZTRVQgKHBvcnQsIGhpX2hzdGF0KSkpOworCisJZnVuY19leGl0ICgpOworfQorCisKK3N0YXRpYyBpbnQgc3hfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXJldHVybiBzeF9nZXRzaWduYWxzKHBvcnQpOworfQorCitzdGF0aWMgaW50IHN4X3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcnRzID0gLTEsIGR0ciA9IC0xOworCisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJcnRzID0gMTsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlkdHIgPSAxOworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJcnRzID0gMDsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWR0ciA9IDA7CisKKwlzeF9zZXRzaWduYWxzKHBvcnQsIGR0ciwgcnRzKTsKKwlzeF9yZWNvbmZpZ3VyZV9wb3J0KHBvcnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN4X2lvY3RsIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwLCAKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IGl2YWw7CisKKwkvKiBmdW5jX2VudGVyMigpOyAqLworCisJcmMgPSAwOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DR1NPRlRDQVI6CisJCXJjID0gcHV0X3VzZXIoKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpID8gMSA6IDApLAorCQkgICAgICAgICAgICAgICh1bnNpZ25lZCBfX3VzZXIgKikgYXJncCk7CisJCWJyZWFrOworCWNhc2UgVElPQ1NTT0ZUQ0FSOgorCQlpZiAoKHJjID0gZ2V0X3VzZXIoaXZhbCwgKHVuc2lnbmVkIF9fdXNlciAqKSBhcmdwKSkgPT0gMCkgeworCQkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0KKwkJCQkodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfAorCQkJCShpdmFsID8gQ0xPQ0FMIDogMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUSU9DR1NFUklBTDoKKwkJcmMgPSBnc19nZXRzZXJpYWwoJnBvcnQtPmdzLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DU1NFUklBTDoKKwkJcmMgPSBnc19zZXRzZXJpYWwoJnBvcnQtPmdzLCBhcmdwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKworCS8qIGZ1bmNfZXhpdCgpOyAqLworCXJldHVybiByYzsKK30KKworCisvKiBUaGUgdGhyb3R0bGUvdW50aHJvdHRsZSBzY2hlbWUgZm9yIHRoZSBTcGVjaWFsaXggY2FyZCBpcyBkaWZmZXJlbnQKKyAqIGZyb20gb3RoZXIgZHJpdmVycyBhbmQgZGVzZXJ2ZXMgc29tZSBleHBsYW5hdGlvbi4gCisgKiBUaGUgU3BlY2lhbGl4IGhhcmR3YXJlIHRha2VzIGNhcmUgb2YgWE9OL1hPRkYKKyAqIGFuZCBDVFMvUlRTIGZsb3cgY29udHJvbCBpdHNlbGYuICBUaGlzIG1lYW5zIHRoYXQgYWxsIHdlIGhhdmUgdG8KKyAqIGRvIHdoZW4gc2lnbmFsbGVkIGJ5IHRoZSB1cHBlciB0dHkgbGF5ZXIgdG8gdGhyb3R0bGUvdW50aHJvdHRsZSBpcworICogdG8gbWFrZSBhIG5vdGUgb2YgaXQgaGVyZS4gIFdoZW4gd2UgY29tZSB0byByZWFkIGNoYXJhY3RlcnMgZnJvbSB0aGUKKyAqIHJ4IGJ1ZmZlcnMgb24gdGhlIGNhcmQgKHN4X3JlY2VpdmVfY2hhcnMoKSkgd2UgbG9vayB0byBzZWUgaWYgdGhlCisgKiB1cHBlciBsYXllciBjYW4gYWNjZXB0IG1vcmUgKGFzIG5vdGVkIGhlcmUgaW4gc3hfcnhfdGhyb3RbXSkuIAorICogSWYgaXQgY2FuJ3Qgd2Ugc2ltcGx5IGRvbid0IHJlbW92ZSBjaGFycyBmcm9tIHRoZSBjYXJkcyBidWZmZXIuIAorICogV2hlbiB0aGUgdHR5IGxheWVyIGNhbiBhY2NlcHQgY2hhcnMsIHdlIGFnYWluIG5vdGUgdGhhdCBoZXJlIGFuZCB3aGVuCisgKiBzeF9yZWNlaXZlX2NoYXJzKCkgaXMgY2FsbGVkIGl0IHdpbGwgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgY2FyZHMgYnVmZmVyLgorICogVGhlIGNhcmQgd2lsbCBub3RpY2UgdGhhdCBhIHBvcnRzIGJ1ZmZlciBoYXMgZHJhaW5lZCBiZWxvdyBzb21lIGxvdworICogd2F0ZXIgbWFyayBhbmQgd2lsbCB1bmZsb3cgY29udHJvbCB0aGUgbGluZSBpdHNlbGYsIHVzaW5nIHdoYXRldmVyCisgKiBmbG93IGNvbnRyb2wgc2NoZW1lIGlzIGluIHVzZSBmb3IgdGhhdCBwb3J0LiAtLSBTaW1vbiBBbGxlbgorICovCisKK3N0YXRpYyB2b2lkIHN4X3Rocm90dGxlIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc3hfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlmdW5jX2VudGVyMigpOworCS8qIElmIHRoZSBwb3J0IGlzIHVzaW5nIGFueSB0eXBlIG9mIGlucHV0IGZsb3cKKwkgKiBjb250cm9sIHRoZW4gdGhyb3R0bGUgdGhlIHBvcnQuCisJICovCisJaWYoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHx8IChJX0lYT0ZGKHR0eSkpICkgeworCQlwb3J0LT5ncy5mbGFncyB8PSBTWF9SWF9USFJPVFRMRTsKKwl9CisJZnVuY19leGl0KCk7Cit9CisKKworc3RhdGljIHZvaWQgc3hfdW50aHJvdHRsZSAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSAoc3RydWN0IHN4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCisJZnVuY19lbnRlcjIoKTsKKwkvKiBBbHdheXMgdW50aHJvdHRsZSBldmVuIGlmIGZsb3cgY29udHJvbCBpcyBub3QgZW5hYmxlZCBvbgorCSAqIHRoaXMgcG9ydCBpbiBjYXNlIHdlIGRpc2FibGVkIGZsb3cgY29udHJvbCB3aGlsZSB0aGUgcG9ydAorCSAqIHdhcyB0aHJvdHRsZWQKKwkgKi8KKwlwb3J0LT5ncy5mbGFncyAmPSB+U1hfUlhfVEhST1RUTEU7CisJZnVuY19leGl0KCk7CisJcmV0dXJuOworfQorCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKgorICogICAgICAgICAgICAgICAgICAgIEhlcmUgYXJlIHRoZSBpbml0aWFsaXphdGlvbiByb3V0aW5lcy4gICAgICAgICAgICAgICAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworCisKK3N0YXRpYyBpbnQgc3hfaW5pdF9ib2FyZCAoc3RydWN0IHN4X2JvYXJkICpib2FyZCkKK3sKKwlpbnQgYWRkcjsKKwlpbnQgY2hhbnM7CisJaW50IHR5cGU7CisKKwlmdW5jX2VudGVyKCk7CisKKwkvKiBUaGlzIGlzIHByZWNlZGVkIGJ5IGRvd25sb2FkaW5nIHRoZSBkb3dubG9hZCBjb2RlLiAqLworCisJYm9hcmQtPmZsYWdzIHw9IFNYX0JPQVJEX0lOSVRJQUxJWkVEOworCisJaWYgKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIDApKQorCQkvKiBDRiBib2FyZHMgbWF5IG5lZWQgdGhpcy4gKi8KKwkJd3JpdGVfc3hfYnl0ZShib2FyZCwwLCAwKTsKKworCS8qIFRoaXMgcmVzZXRzIHRoZSBwcm9jZXNzb3IgYWdhaW4sIHRvIG1ha2Ugc3VyZSBpdCBkaWRuJ3QgZG8gYW55CisJICAgZm9vbGlzaCB0aGluZ3Mgd2hpbGUgd2Ugd2VyZSBkb3dubG9hZGluZyB0aGUgaW1hZ2UgKi8KKwlpZiAoIXN4X3Jlc2V0IChib2FyZCkpCisJCXJldHVybiAwOworCisJc3hfc3RhcnRfYm9hcmQgKGJvYXJkKTsKKwl1ZGVsYXkgKDEwKTsKKwlpZiAoIXN4X2J1c3lfd2FpdF9uZXEgKGJvYXJkLCAwLCAweGZmLCAwKSkgeworCQlwcmludGsgKEtFUk5fRVJSICJzeDogT29vcHMuIEJvYXJkIHdvbid0IGluaXRpYWxpemUuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogT2suIFNvIG5vdyB0aGUgcHJvY2Vzc29yIG9uIHRoZSBjYXJkIGlzIHJ1bm5pbmcuIEl0IGdhdGhlcmVkCisJICAgc29tZSBpbmZvIGZvciB1cy4uLiAqLworCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOSVQsICJUaGUgc3hjYXJkIHN0cnVjdHVyZTpcbiIpOworCWlmIChzeF9kZWJ1ZyAmIFNYX0RFQlVHX0lOSVQpIG15X2hkX2lvIChib2FyZC0+YmFzZSwgMHgxMCk7CisJc3hfZHByaW50ayAoU1hfREVCVUdfSU5JVCwgInRoZSBmaXJzdCBzeF9tb2R1bGUgc3RydWN0dXJlOlxuIik7CisJaWYgKHN4X2RlYnVnICYgU1hfREVCVUdfSU5JVCkgbXlfaGRfaW8gKGJvYXJkLT5iYXNlICsgMHg4MCwgMHgzMCk7CisKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAKKwkgICAgICAgICAgICAiaW5pdF9zdGF0dXM6ICV4LCAlZGsgbWVtb3J5LCBmaXJtd2FyZSBWJXguJTAyeCxcbiIsIAorCSAgICAgICAgICAgIHJlYWRfc3hfYnl0ZSAoYm9hcmQsIDApLCByZWFkX3N4X2J5dGUoYm9hcmQsIDEpLCAKKwkgICAgICAgICAgICByZWFkX3N4X2J5dGUgKGJvYXJkLCA1KSwgcmVhZF9zeF9ieXRlKGJvYXJkLCA0KSk7CisKKwlpZiAocmVhZF9zeF9ieXRlIChib2FyZCwgMCkgPT0gMHhmZikgeworCQlwcmludGsgKEtFUk5fSU5GTyAic3g6IE5vIG1vZHVsZXMgZm91bmQuIFNvcnJ5LlxuIik7CisJCWJvYXJkLT5ucG9ydHMgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwljaGFucyA9IDA7CisKKwlpZiAoSVNfU1hfQk9BUkQoYm9hcmQpKSB7CisJCXN4X3dyaXRlX2JvYXJkX3dvcmQgKGJvYXJkLCBjY19pbnRfY291bnQsIHN4X21heGludHMpOworCX0gZWxzZSB7CisJCWlmIChzeF9tYXhpbnRzKQorCQkJc3hfd3JpdGVfYm9hcmRfd29yZCAoYm9hcmQsIGNjX2ludF9jb3VudCwgU0lfUFJPQ0VTU09SX0NMT0NLLzgvc3hfbWF4aW50cyk7CisJfQorCisJLyogZ3JhYiB0aGUgZmlyc3QgbW9kdWxlIHR5cGUuLi4gKi8KKwkvKiAgYm9hcmQtPnRhX3R5cGUgPSBtb2RfY29tcGF0X3R5cGUgKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIDB4ODAgKyAweDA4KSk7ICovCisJYm9hcmQtPnRhX3R5cGUgPSBtb2RfY29tcGF0X3R5cGUgKHN4X3JlYWRfbW9kdWxlX2J5dGUgKGJvYXJkLCAweDgwLCBtY19jaGlwKSk7CisKKwkvKiBYWFggYnl0ZW9yZGVyICovCisJZm9yIChhZGRyID0gMHg4MDthZGRyICE9IDA7YWRkciA9IHJlYWRfc3hfd29yZCAoYm9hcmQsIGFkZHIpICYgMHg3ZmZmKSB7CisJCXR5cGUgPSBzeF9yZWFkX21vZHVsZV9ieXRlIChib2FyZCwgYWRkciwgbWNfY2hpcCk7CisJCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOSVQsICJNb2R1bGUgYXQgJXg6ICVkIGNoYW5uZWxzXG4iLCAKKwkJICAgICAgICAgICAgYWRkciwgcmVhZF9zeF9ieXRlIChib2FyZCwgYWRkciArIDIpKTsKKworCQljaGFucyArPSBzeF9yZWFkX21vZHVsZV9ieXRlIChib2FyZCwgYWRkciwgbWNfdHlwZSk7CisKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfSU5JVCwgIm1vZHVsZSBpcyBhbiAlcywgd2hpY2ggaGFzICVzLyVzIHBhbmVsc1xuIiwgCisJCSAgICAgICAgICAgIG1vZF90eXBlX3MgKHR5cGUpLAorCQkgICAgICAgICAgICBwYW5fdHlwZV9zIChzeF9yZWFkX21vZHVsZV9ieXRlIChib2FyZCwgYWRkciwgbWNfbW9kcykgJiAweGYpLAorCQkgICAgICAgICAgICBwYW5fdHlwZV9zIChzeF9yZWFkX21vZHVsZV9ieXRlIChib2FyZCwgYWRkciwgbWNfbW9kcykgPj4gNCkpOworCisJCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOSVQsICJDRDE0MDAgdmVyc2lvbnM6ICV4LyV4LCBBU0lDIHZlcnNpb246ICV4XG4iLCAKKwkJICAgICAgICAgICAgc3hfcmVhZF9tb2R1bGVfYnl0ZSAoYm9hcmQsIGFkZHIsIG1jX3JldjEpLAorCQkgICAgICAgICAgICBzeF9yZWFkX21vZHVsZV9ieXRlIChib2FyZCwgYWRkciwgbWNfcmV2MiksCisJCSAgICAgICAgICAgIHN4X3JlYWRfbW9kdWxlX2J5dGUgKGJvYXJkLCBhZGRyLCBtY19tdGFhc2ljX3JldikpOworCisJCS8qIFRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zIGFyZSBpbGxlZ2FsOiBJdCBzaG91bGQgdGhlb3JldGljYWxseQorCQkgICB3b3JrLCBidXQgdGltaW5nIHByb2JsZW1zIG1ha2UgdGhlIGJ1cyBIQU5HLiAqLworCisJCWlmIChtb2RfY29tcGF0X3R5cGUgKHR5cGUpICE9IGJvYXJkLT50YV90eXBlKSB7CisJCQlwcmludGsgKEtFUk5fRVJSICJzeDogVGhpcyBpcyBhbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24uXG4iCisJCQkgICAgICAgICJEb24ndCBtaXggVEEvTVRBL1NYREMgb24gdGhlIHNhbWUgaG9zdGFkYXB0ZXIuXG4iKTsKKwkJCWNoYW5zPTA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKElTX0VJU0FfQk9BUkQoYm9hcmQpIHx8IAorCQkgICAgIElTX1NJX0JPQVJEKGJvYXJkKSkgJiYgKG1vZF9jb21wYXRfdHlwZSh0eXBlKSA9PSA0KSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAic3g6IFRoaXMgaXMgYW4gaW52YWxpZCBjb25maWd1cmF0aW9uLlxuIgorCQkJICAgICAgICAiRG9uJ3QgdXNlIFNYRENzIG9uIGFuIFNJL1hJTyBhZGFwdGVyLlxuIik7CisJCQljaGFucz0wOworCQkJYnJlYWs7CisJCX0KKyNpZiAwIC8qIFByb2JsZW0gZml4ZWQ6IGZpcm13YXJlIDMuMDUgKi8KKwkJaWYgKElTX1NYX0JPQVJEKGJvYXJkKSAmJiAodHlwZSA9PSBUQTgpKSB7CisJCQkvKiBUaGVyZSBhcmUgc29tZSBpc3N1ZXMgd2l0aCB0aGUgZmlybXdhcmUgYW5kIHRoZSBEQ0QvUlRTCisJCQkgICBsaW5lcy4gSXQgbWlnaHQgd29yayBpZiB5b3UgdGllIHRoZW0gdG9nZXRoZXIgb3Igc29tZXRoaW5nLgorCQkJICAgSXQgbWlnaHQgYWxzbyB3b3JrIGlmIHlvdSBnZXQgYSBuZXdlciBzeF9maXJtd2FyZS4JVGhlcmVmb3JlCisJCQkgICB0aGlzIGlzIGp1c3QgYSB3YXJuaW5nLiAqLworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgInN4OiBUaGUgU1ggaG9zdCBkb2Vzbid0IHdvcmsgdG9vIHdlbGwgIgorCQkJICAgICAgICAid2l0aCB0aGUgVEE4IGFkYXB0ZXJzLlxuU3BlY2lhbGl4IGlzIHdvcmtpbmcgb24gaXQuXG4iKTsKKwkJfQorI2VuZGlmCisJfQorCisJaWYgKGNoYW5zKSB7CisJCS8qIGJvYXJkLT5mbGFncyB8PSBTWF9CT0FSRF9QUkVTRU5UOyAqLworCQlpZihib2FyZC0+aXJxID4gMCkgeworCQkJLyogZml4ZWQgaXJxLCBwcm9iYWJseSBQQ0kgKi8KKwkJCWlmKHN4X2lycW1hc2sgJiAoMSA8PCBib2FyZC0+aXJxKSkgeyAvKiBtYXkgd2UgdXNlIHRoaXMgaXJxPyAqLworCQkJCWlmKHJlcXVlc3RfaXJxKGJvYXJkLT5pcnEsIHN4X2ludGVycnVwdCwgU0FfU0hJUlEgfCBTQV9JTlRFUlJVUFQsICJzeCIsIGJvYXJkKSkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgInN4OiBDYW5ub3QgYWxsb2NhdGUgaXJxICVkLlxuIiwgYm9hcmQtPmlycSk7CisJCQkJCWJvYXJkLT5pcnEgPSAwOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWJvYXJkLT5pcnEgPSAwOworCQl9IGVsc2UgaWYoYm9hcmQtPmlycSA8IDAgJiYgc3hfaXJxbWFzaykgeworCQkJLyogYXV0by1hbGxvY2F0ZSBpcnEgKi8KKwkJCWludCBpcnFucjsKKwkJCWludCBpcnFtYXNrID0gc3hfaXJxbWFzayAmIChJU19TWF9CT0FSRChib2FyZCkgPyBTWF9JU0FfSVJRX01BU0sgOiBTSTJfSVNBX0lSUV9NQVNLKTsKKwkJCWZvcihpcnFuciA9IDE1OyBpcnFuciA+IDA7IGlycW5yLS0pCisJCQkJaWYoaXJxbWFzayAmICgxIDw8IGlycW5yKSkKKwkJCQkJaWYoISByZXF1ZXN0X2lycShpcnFuciwgc3hfaW50ZXJydXB0LCBTQV9TSElSUSB8IFNBX0lOVEVSUlVQVCwgInN4IiwgYm9hcmQpKQorCQkJCQkJYnJlYWs7CisJCQlpZighIGlycW5yKQorCQkJCXByaW50ayhLRVJOX0VSUiAic3g6IENhbm5vdCBhbGxvY2F0ZSBJUlEuXG4iKTsKKwkJCWJvYXJkLT5pcnEgPSBpcnFucjsKKwkJfSBlbHNlCisJCQlib2FyZC0+aXJxID0gMDsKKworCQlpZiAoYm9hcmQtPmlycSkgeworCQkJLyogRm91bmQgYSB2YWxpZCBpbnRlcnJ1cHQsIHN0YXJ0IHVwIGludGVycnVwdHMhICovCisJCQlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAiVXNpbmcgaXJxICVkLlxuIiwgYm9hcmQtPmlycSk7CisJCQlzeF9zdGFydF9pbnRlcnJ1cHRzIChib2FyZCk7CisJCQlib2FyZC0+cG9sbCA9IHN4X3Nsb3dwb2xsOworCQkJYm9hcmQtPmZsYWdzIHw9IFNYX0lSUV9BTExPQ0FURUQ7CisJCX0gZWxzZSB7CisJCQkvKiBubyBpcnE6IHNldHVwIGJvYXJkIGZvciBwb2xsZWQgb3BlcmF0aW9uICovCisJCQlib2FyZC0+cG9sbCA9IHN4X3BvbGw7CisJCQlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAiVXNpbmcgcG9sbC1pbnRlcnZhbCAlZC5cbiIsIGJvYXJkLT5wb2xsKTsKKwkJfQorCisJCS8qIFRoZSB0aW1lciBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYW55d2F5OiBUaGF0IHdheSB3ZSBjYW4gc2FmZWx5CisJCQkgZGVsX3RpbWVyIGl0IHdoZW4gdGhlIG1vZHVsZSBpcyB1bmxvYWRlZC4gKi8KKwkJaW5pdF90aW1lciAoJmJvYXJkLT50aW1lcik7CisKKwkJaWYgKGJvYXJkLT5wb2xsKSB7CisJCQlib2FyZC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBib2FyZDsKKwkJCWJvYXJkLT50aW1lci5mdW5jdGlvbiA9IHN4X3BvbGxmdW5jOworCQkJYm9hcmQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgYm9hcmQtPnBvbGw7CisJCQlhZGRfdGltZXIgKCZib2FyZC0+dGltZXIpOworCQl9CisJfSBlbHNlIHsKKwkJYm9hcmQtPmlycSA9IDA7CisJfQorCisJYm9hcmQtPm5wb3J0cyA9IGNoYW5zOworCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOSVQsICJyZXR1cm5pbmcgJWQgcG9ydHMuIiwgYm9hcmQtPm5wb3J0cyk7CisKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gY2hhbnM7Cit9CisKKworc3RhdGljIHZvaWQgcHJpbnRoZWFkZXIodm9pZCkKK3sKKwlzdGF0aWMgaW50IGhlYWRlcl9wcmludGVkOworCisJaWYgKCFoZWFkZXJfcHJpbnRlZCkgeworCQlwcmludGsgKEtFUk5fSU5GTyAiU3BlY2lhbGl4IFNYIGRyaXZlciAiCisJCSAgICAgICAgIihDKSAxOTk4LzE5OTkgUi5FLldvbGZmQEJpdFdpemFyZC5ubCBcbiIpOworCQlwcmludGsgKEtFUk5fSU5GTyAic3g6IHZlcnNpb24gJXNcbiIsIFJDU19JRCk7CisJCWhlYWRlcl9wcmludGVkID0gMTsKKwl9Cit9CisKKworc3RhdGljIGludCBwcm9iZV9zeCAoc3RydWN0IHN4X2JvYXJkICpib2FyZCkKK3sKKwlzdHJ1Y3QgdnBkX3Byb20gdnBkcDsKKwljaGFyICpwOworCWludCBpOworCisJZnVuY19lbnRlcigpOworCisJaWYgKCFJU19DRl9CT0FSRCAoYm9hcmQpKSB7ICAgIAorCQlzeF9kcHJpbnRrIChTWF9ERUJVR19QUk9CRSwgIkdvaW5nIHRvIHZlcmlmeSB2cGQgcHJvbSBhdCAlcC5cbiIsIAorCQkgICAgICAgICAgICBib2FyZC0+YmFzZSArIFNYX1ZQRF9ST00pOworCisJCWlmIChzeF9kZWJ1ZyAmIFNYX0RFQlVHX1BST0JFKQorCQkJbXlfaGRfaW8oYm9hcmQtPmJhc2UgKyBTWF9WUERfUk9NLCAweDQwKTsKKworCQlwID0gKGNoYXIgKikgJnZwZHA7CisJCWZvciAoaT0wO2k8IHNpemVvZiAoc3RydWN0IHZwZF9wcm9tKTtpKyspCisJCQkqcCsrID0gcmVhZF9zeF9ieXRlIChib2FyZCwgU1hfVlBEX1JPTSArIGkqMik7CisKKwkJaWYgKHN4X2RlYnVnICYgU1hfREVCVUdfUFJPQkUpCisJCQlteV9oZCAoJnZwZHAsIDB4MjApOworCisJCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiY2hlY2tpbmcgaWRlbnRpZmllci4uLlxuIik7CisKKwkJaWYgKHN0cm5jbXAgKHZwZHAuaWRlbnRpZmllciwgU1hfVlBEX0lERU5UX1NUUklORywgMTYpICE9IDApIHsKKwkJCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiR290IG5vbi1TWCBpZGVudGlmaWVyOiAnJXMnXG4iLCAKKwkJCSAgICAgICAgICAgIHZwZHAuaWRlbnRpZmllcik7IAorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlwcmludGhlYWRlciAoKTsKKworCWlmICghSVNfQ0ZfQk9BUkQgKGJvYXJkKSkgeworCQlwcmludGsgKEtFUk5fREVCVUcgInN4OiBGb3VuZCBhbiBTWCBib2FyZCBhdCAlbHhcbiIsIGJvYXJkLT5od19iYXNlKTsKKwkJcHJpbnRrIChLRVJOX0RFQlVHICJzeDogaHdfcmV2OiAlZCwgYXNzZW1ibHkgbGV2ZWw6ICVkLCB1bmlxIElEOiUwOHgsICIsIAorCQkgICAgICAgIHZwZHAuaHdyZXYsIHZwZHAuaHdhc3MsIHZwZHAudW5pcWlkKTsKKwkJcHJpbnRrICggICAgICAgICAgICJNYW51ZmFjdHVyZWQ6ICVkLyVkXG4iLCAKKwkJICAgICAgICAxOTcwICsgdnBkcC5teWVhciwgdnBkcC5td2Vlayk7CisKKworCQlpZiAoKCgodnBkcC51bmlxaWQgPj4gMjQpICYgU1hfVU5JUVVFSURfTUFTSykgIT0gU1hfUENJX1VOSVFVRUlEMSkgJiYKKwkJICAgICgoKHZwZHAudW5pcWlkID4+IDI0KSAmIFNYX1VOSVFVRUlEX01BU0spICE9IFNYX0lTQV9VTklRVUVJRDEpKSB7CisJCQkvKiBUaGlzIG1pZ2h0IGJlIGEgYml0IGhhcnNoLiBUaGlzIHdhcyB0aGUgcHJpbWFyeSByZWFzb24gdGhlCisJCQkgICBTWC9JU0EgY2FyZCBkaWRuJ3Qgd29yayBhdCBmaXJzdC4uLiAqLworCQkJcHJpbnRrIChLRVJOX0VSUiAic3g6IEhtbS4gTm90IGFuIFNYL1BDSSBvciBTWC9JU0EgY2FyZC4gU29ycnk6IGdpdmluZyB1cC5cbiIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCWlmICgoKHZwZHAudW5pcWlkID4+IDI0KSAmIFNYX1VOSVFVRUlEX01BU0spID09IFNYX0lTQV9VTklRVUVJRDEpIHsKKwkJCWlmICgoKHVuc2lnbmVkIGxvbmcpYm9hcmQtPmh3X2Jhc2UpICYgMHg4MDAwKSB7CisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgInN4OiBXYXJuaW5nOiBUaGVyZSBtYXkgYmUgaGFyZHdhcmUgcHJvYmxlbXMgd2l0aCB0aGUgY2FyZCBhdCAlbHguXG4iLCBib2FyZC0+aHdfYmFzZSk7CisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgInN4OiBSZWFkIHN4LnR4dCBmb3IgbW9yZSBpbmZvLlxuIik7CisJCQl9CisJCX0KKwl9CisKKwlib2FyZC0+bnBvcnRzID0gLTE7CisKKwkvKiBUaGlzIHJlc2V0cyB0aGUgcHJvY2Vzc29yLCBhbmQga2VlcHMgaXQgb2ZmIHRoZSBidXMuICovCisJaWYgKCFzeF9yZXNldCAoYm9hcmQpKSAKKwkJcmV0dXJuIDA7CisJc3hfZHByaW50ayAoU1hfREVCVUdfSU5JVCwgInJlc2V0IHRoZSBib2FyZC4uLlxuIik7CisKKwlib2FyZC0+ZmxhZ3MgfD0gU1hfQk9BUkRfUFJFU0VOVDsKKworCWZ1bmNfZXhpdCgpOworCXJldHVybiAxOworfQorCisKKworLyogU3BlY2lhbGl4IHByb2JlcyBmb3IgdGhpcyBjYXJkIGF0IDMyayBpbmNyZW1lbnRzIGZyb20gNjQwayB0byAxNk0uCisgICBJIGNvbnNpZGVyIG1hY2hpbmVzIHdpdGggbGVzcyB0aGFuIDE2TSB1bmxpa2VseSBub3dhZGF5cywgc28gSSdtCisgICBub3QgcHJvYmluZyBhYm92ZSAxTWIuIEFsc28sIDB4YTAwMDAsIDB4YjAwMDAsIGFyZSB0YWtlbiBieSB0aGUgVkdBCisgICBjYXJkLiAweGUwMDAwIGFuZCAweGYwMDAwIGFyZSB0YWtlbiBieSB0aGUgQklPUy4gVGhhdCBvbmx5IGxlYXZlcyAKKyAgIDB4YzAwMDAsIDB4YzgwMDAsIDB4ZDAwMDAgYW5kIDB4ZDgwMDAgLiAqLworCitzdGF0aWMgaW50IHByb2JlX3NpIChzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkKQoreworCWludCBpOworCisJZnVuY19lbnRlcigpOworCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiR29pbmcgdG8gdmVyaWZ5IFNJIHNpZ25hdHVyZSBodyAlbHggYXQgJXAuXG4iLCBib2FyZC0+aHdfYmFzZSwKKwkgICAgICAgICAgICBib2FyZC0+YmFzZSArIFNJMl9JU0FfSURfQkFTRSk7CisKKwlpZiAoc3hfZGVidWcgJiBTWF9ERUJVR19QUk9CRSkKKwkJbXlfaGRfaW8oYm9hcmQtPmJhc2UgKyBTSTJfSVNBX0lEX0JBU0UsIDB4OCk7CisKKwlpZiAoIUlTX0VJU0FfQk9BUkQoYm9hcmQpKSB7CisJICBpZiggSVNfU0kxX0JPQVJEKGJvYXJkKSApIAorCSAgICB7CisJCWZvciAoaT0wO2k8ODtpKyspIHsKKwkJICB3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JRF9CQVNFKzctaSxpKTsgCisKKwkJfQorCSAgICB9CisJCWZvciAoaT0wO2k8ODtpKyspIHsKKwkJCWlmICgocmVhZF9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JRF9CQVNFKzctaSkgJiA3KSAhPSBpKSB7CisJCQkJZnVuY19leGl0ICgpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCisJLyogTm93IHdlJ3JlIHByZXR0eSBtdWNoIGNvbnZpbmNlZCB0aGF0IHRoZXJlIGlzIGFuIFNJIGJvYXJkIGhlcmUsIAorCSAgIGJ1dCB0byBwcmV2ZW50IHRyb3VibGUsIHdlJ2QgYmV0dGVyIGRvdWJsZSBjaGVjayB0aGF0IHdlIGRvbid0CisJICAgaGF2ZSBhbiBTSTEgYm9hcmQgd2hlbiB3ZSdyZSBwcm9iaW5nIGZvciBhbiBTSTIgYm9hcmQuLi4uICovCisKKwl3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JRF9CQVNFLDB4MTApOyAKKwlpZiAoIElTX1NJMV9CT0FSRChib2FyZCkpIHsKKwkJLyogVGhpcyBzaG91bGQgYmUgYW4gU0kxIGJvYXJkLCB3aGljaCBoYXMgdGhpcworCQkgICBsb2NhdGlvbiB3cml0YWJsZS4uLiAqLworCQlpZiAocmVhZF9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JRF9CQVNFKSAhPSAweDEwKQorCQkJZnVuY19leGl0ICgpOworCQkJcmV0dXJuIDA7IAorCX0gZWxzZSB7CisJCS8qIFRoaXMgc2hvdWxkIGJlIGFuIFNJMiBib2FyZCwgd2hpY2ggaGFzIHRoZSBib3R0b20KKwkJICAgMyBiaXRzIG5vbi13cml0YWJsZS4uLiAqLworCQlpZiAocmVhZF9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JRF9CQVNFKSA9PSAweDEwKQorCQkJZnVuY19leGl0ICgpOworCQkJcmV0dXJuIDA7IAorCX0KKworCS8qIE5vdyB3ZSdyZSBwcmV0dHkgbXVjaCBjb252aW5jZWQgdGhhdCB0aGVyZSBpcyBhbiBTSSBib2FyZCBoZXJlLCAKKwkgICBidXQgdG8gcHJldmVudCB0cm91YmxlLCB3ZSdkIGJldHRlciBkb3VibGUgY2hlY2sgdGhhdCB3ZSBkb24ndAorCSAgIGhhdmUgYW4gU0kxIGJvYXJkIHdoZW4gd2UncmUgcHJvYmluZyBmb3IgYW4gU0kyIGJvYXJkLi4uLiAqLworCisJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSURfQkFTRSwweDEwKTsgCisJaWYgKCBJU19TSTFfQk9BUkQoYm9hcmQpKSB7CisJCS8qIFRoaXMgc2hvdWxkIGJlIGFuIFNJMSBib2FyZCwgd2hpY2ggaGFzIHRoaXMKKwkJICAgbG9jYXRpb24gd3JpdGFibGUuLi4gKi8KKwkJaWYgKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSURfQkFTRSkgIT0gMHgxMCkKKwkJCWZ1bmNfZXhpdCgpOworCQkJcmV0dXJuIDA7IAorCX0gZWxzZSB7CisJCS8qIFRoaXMgc2hvdWxkIGJlIGFuIFNJMiBib2FyZCwgd2hpY2ggaGFzIHRoZSBib3R0b20KKwkJICAgMyBiaXRzIG5vbi13cml0YWJsZS4uLiAqLworCQlpZiAocmVhZF9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JRF9CQVNFKSA9PSAweDEwKQorCQkJZnVuY19leGl0ICgpOworCQkJcmV0dXJuIDA7IAorCX0KKworCXByaW50aGVhZGVyICgpOworCisJcHJpbnRrIChLRVJOX0RFQlVHICJzeDogRm91bmQgYW4gU0kgYm9hcmQgYXQgJWx4XG4iLCBib2FyZC0+aHdfYmFzZSk7CisJLyogQ29tcGFyZWQgdG8gdGhlIFNYIGJvYXJkcywgaXQgaXMgYSBjb21wbGV0ZSBndWVzcyBhcyB0byB3aGF0CisJCSB0aGlzIGNhcmQgaXMgdXAgdG8uLi4gKi8KKworCWJvYXJkLT5ucG9ydHMgPSAtMTsKKworCS8qIFRoaXMgcmVzZXRzIHRoZSBwcm9jZXNzb3IsIGFuZCBrZWVwcyBpdCBvZmYgdGhlIGJ1cy4gKi8KKwlpZiAoIXN4X3Jlc2V0IChib2FyZCkpIAorCQlyZXR1cm4gMDsKKwlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAicmVzZXQgdGhlIGJvYXJkLi4uXG4iKTsKKworCWJvYXJkLT5mbGFncyB8PSBTWF9CT0FSRF9QUkVTRU5UOworCisJZnVuY19leGl0KCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgc3hfb3BzID0geworCS5icmVha19jdGwgPSBzeF9icmVhaywKKwkub3Blbgk9IHN4X29wZW4sCisJLmNsb3NlID0gZ3NfY2xvc2UsCisJLndyaXRlID0gZ3Nfd3JpdGUsCisJLnB1dF9jaGFyID0gZ3NfcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gZ3NfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSBnc193cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBnc19jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciA9IGdzX2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSBzeF9pb2N0bCwKKwkudGhyb3R0bGUgPSBzeF90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IHN4X3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zID0gZ3Nfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSBnc19zdG9wLAorCS5zdGFydCA9IGdzX3N0YXJ0LAorCS5oYW5ndXAgPSBnc19oYW5ndXAsCisJLnRpb2NtZ2V0ID0gc3hfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gc3hfdGlvY21zZXQsCit9OworCitzdGF0aWMgaW50IHN4X2luaXRfZHJpdmVycyh2b2lkKQoreworCWludCBlcnJvcjsKKworCWZ1bmNfZW50ZXIoKTsKKworCXN4X2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoc3hfbnBvcnRzKTsKKwlpZiAoIXN4X2RyaXZlcikKKwkJcmV0dXJuIDE7CisJc3hfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXN4X2RyaXZlci0+ZHJpdmVyX25hbWUgPSAic3BlY2lhbGl4X3N4IjsKKwlzeF9kcml2ZXItPm5hbWUgPSAidHR5WCI7CisJc3hfZHJpdmVyLT5tYWpvciA9IFNYX05PUk1BTF9NQUpPUjsKKwlzeF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXN4X2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlzeF9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlzeF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkgIEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlzeF9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoc3hfZHJpdmVyLCAmc3hfb3BzKTsKKworCWlmICgoZXJyb3IgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKHN4X2RyaXZlcikpKSB7CisJCXB1dF90dHlfZHJpdmVyKHN4X2RyaXZlcik7CisJCXByaW50ayhLRVJOX0VSUiAic3g6IENvdWxkbid0IHJlZ2lzdGVyIHN4IGRyaXZlciwgZXJyb3IgPSAlZFxuIiwKKwkJICAgICAgIGVycm9yKTsKKwkJcmV0dXJuIDE7CisJfQorCWZ1bmNfZXhpdCgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkICogY2ttYWxsb2MgKGludCBzaXplKQoreworCXZvaWQgKnA7CisKKwlwID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocCkgCisJCW1lbXNldChwLCAwLCBzaXplKTsKKwlyZXR1cm4gcDsKK30KKworCitzdGF0aWMgaW50IHN4X2luaXRfcG9ydHN0cnVjdHMgKGludCBuYm9hcmRzLCBpbnQgbnBvcnRzKQoreworCXN0cnVjdCBzeF9ib2FyZCAqYm9hcmQ7CisJc3RydWN0IHN4X3BvcnQgKnBvcnQ7CisJaW50IGksIGo7CisJaW50IGFkZHIsIGNoYW5zOworCWludCBwb3J0bm87CisKKwlmdW5jX2VudGVyKCk7CisKKwkvKiBNYW55IGRyaXZlcnMgc3RhdGljYWxseSBhbGxvY2F0ZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9ydHMKKwkgICBUaGVyZSBpcyBubyByZWFzb24gbm90IHRvIGFsbG9jYXRlIHRoZW0gZHluYW1pY2FsbHkuIElzIHRoZXJlPyAtLSBSRVcgKi8KKwlzeF9wb3J0cyAgICAgICAgICA9IGNrbWFsbG9jKG5wb3J0cyAqIHNpemVvZiAoc3RydWN0IHN4X3BvcnQpKTsKKwlpZiAoIXN4X3BvcnRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBvcnQgPSBzeF9wb3J0czsKKwlmb3IgKGkgPSAwOyBpIDwgbmJvYXJkczsgaSsrKSB7CisJCWJvYXJkID0gJmJvYXJkc1tpXTsKKwkJYm9hcmQtPnBvcnRzID0gcG9ydDsKKwkJZm9yIChqPTA7IGogPCBib2FyZHNbaV0ubnBvcnRzO2orKykgeworCQkJc3hfZHByaW50ayAoU1hfREVCVUdfSU5JVCwgImluaXRpbmcgcG9ydCAlZFxuIiwgaik7CisJCQlwb3J0LT5ncy5tYWdpYyA9IFNYX01BR0lDOworCQkJcG9ydC0+Z3MuY2xvc2VfZGVsYXkgPSBIWi8yOworCQkJcG9ydC0+Z3MuY2xvc2luZ193YWl0ID0gMzAgKiBIWjsKKwkJCXBvcnQtPmJvYXJkID0gYm9hcmQ7CisJCQlwb3J0LT5ncy5yZCA9ICZzeF9yZWFsX2RyaXZlcjsKKyNpZmRlZiBORVdfV1JJVEVfTE9DS0lORworCQkJcG9ydC0+Z3MucG9ydF93cml0ZV9zZW0gPSBNVVRFWDsKKyNlbmRpZgorCQkJcG9ydC0+Z3MuZHJpdmVyX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisJCQkvKgorCQkJICogSW5pdGlhbGl6aW5nIHdhaXQgcXVldWUKKwkJCSAqLworCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydC0+Z3Mub3Blbl93YWl0KTsKKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPmdzLmNsb3NlX3dhaXQpOyAJCQorCQkJCisJCQlwb3J0Kys7CisJCX0KKwl9CisKKwlwb3J0ID0gc3hfcG9ydHM7CisJcG9ydG5vID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbmJvYXJkczsgaSsrKSB7CisJCWJvYXJkID0gJmJvYXJkc1tpXTsKKwkJYm9hcmQtPnBvcnRfYmFzZSA9IHBvcnRubzsKKwkJLyogUG9zc2libHkgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIHJlamVjdGVkLiAqLworCQlzeF9kcHJpbnRrIChTWF9ERUJVR19QUk9CRSwgIkJvYXJkIGhhcyAlZCBjaGFubmVsc1xuIiwgYm9hcmQtPm5wb3J0cyk7CisJCWlmIChib2FyZC0+bnBvcnRzIDw9IDApIGNvbnRpbnVlOworCQkvKiBYWFggYnl0ZW9yZGVyID8/ICovCisJCWZvciAoYWRkciA9IDB4ODA7YWRkciAhPSAwO2FkZHIgPSByZWFkX3N4X3dvcmQgKGJvYXJkLCBhZGRyKSAmIDB4N2ZmZikgeworCQkJY2hhbnMgPSBzeF9yZWFkX21vZHVsZV9ieXRlIChib2FyZCwgYWRkciwgbWNfdHlwZSk7IAorCQkJc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICJNb2R1bGUgYXQgJXg6ICVkIGNoYW5uZWxzXG4iLCBhZGRyLCBjaGFucyk7CisJCQlzeF9kcHJpbnRrIChTWF9ERUJVR19QUk9CRSwgIlBvcnQgYXQiKTsKKwkJCWZvciAoaj0wO2o8Y2hhbnM7aisrKSB7CisJCQkJLyogVGhlICJzeC13YXkiIGlzIHRoZSB3YXkgaXQgU0hPVUxEIGJlIGRvbmUuIFRoYXQgd2F5IGluIHRoZSAKKwkJCQkgICBmdXR1cmUsIHRoZSBmaXJtd2FyZSBtYXkgZm9yIGV4YW1wbGUgcGFjayB0aGUgc3RydWN0dXJlcyBhIGJpdAorCQkJCSAgIG1vcmUgZWZmaWNpZW50LiBOZWlsIHRlbGxzIG1lIGl0IGlzbid0IGdvaW5nIHRvIGhhcHBlbiBhbnl0aW1lCisJCQkJICAgc29vbiB0aG91Z2guICovCisJCQkJaWYgKElTX1NYX0JPQVJEKGJvYXJkKSkKKwkJCQkJcG9ydC0+Y2hfYmFzZSA9IHN4X3JlYWRfbW9kdWxlX3dvcmQgKGJvYXJkLCBhZGRyK2oqMiwgbWNfY2hhbl9wb2ludGVyKTsKKwkJCQllbHNlCisJCQkJCXBvcnQtPmNoX2Jhc2UgPSBhZGRyICsgMHgxMDAgKyAweDMwMCpqOworCisJCQkJc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICIgJXgiLCBwb3J0LT5jaF9iYXNlKTsKKwkJCQlwb3J0LT5saW5lID0gcG9ydG5vKys7CisJCQkJcG9ydCsrOworCQkJfQorCQkJc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICJcbiIpOworCQl9CisJCS8qIFRoaXMgaGFzIHRvIGJlIGRvbmUgZWFybGllci4gKi8KKwkJLyogYm9hcmQtPmZsYWdzIHw9IFNYX0JPQVJEX0lOSVRJQUxJWkVEOyAqLworCX0KKworCWZ1bmNfZXhpdCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3hfcmVsZWFzZV9kcml2ZXJzKHZvaWQpCit7CisJZnVuY19lbnRlcigpOworCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihzeF9kcml2ZXIpOworCXB1dF90dHlfZHJpdmVyKHN4X2RyaXZlcik7CisJZnVuY19leGl0KCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUENJCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogU2V0dGluZyBiaXQgMTcgaW4gdGhlIENOVFJMIHJlZ2lzdGVyIG9mIHRoZSBQTFggOTA1MCAgKiAKKyAqIGNoaXAgZm9yY2VzIGEgcmV0cnkgb24gd3JpdGVzIHdoaWxlIGEgcmVhZCBpcyBwZW5kaW5nLioKKyAqIFRoaXMgaXMgdG8gcHJldmVudCB0aGUgY2FyZCBsb2NraW5nIHVwIG9uIEludGVsIFhlb24gICoKKyAqIG11bHRpcHJvY2Vzc29yIHN5c3RlbXMgd2l0aCB0aGUgTlggY2hpcHNldC4gICAgLS0gTlYgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTmV3ZXIgY2FyZHMgYXJlIHByb2R1Y2VkIHdpdGggdGhpcyBiaXQgc2V0IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24KKyAgIEVFcHJvbS4gIEFzIHRoZSBiaXQgaXMgcmVhZC93cml0ZSBmb3IgdGhlIENQVSwgd2UgY2FuIGZpeCBpdCBoZXJlLAorICAgaWYgd2UgZGV0ZWN0IHRoYXQgaXQgaXNuJ3Qgc2V0IGNvcnJlY3RseS4gLS0gUkVXICovCisKK3N0YXRpYyB2b2lkIGZpeF9zeF9wY2kgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkKQoreworCXVuc2lnbmVkIGludCBod2Jhc2U7CisJdm9pZCBfX2lvbWVtICpyZWJhc2U7CisJdW5zaWduZWQgaW50IHQ7CisKKyNkZWZpbmUgQ05UUkxfUkVHX09GRlNFVCAgICAgICAgMHg1MAorI2RlZmluZSBDTlRSTF9SRUdfR09PRFZBTFVFICAgICAweDE4MjYwMDAwCisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18wLCAmaHdiYXNlKTsKKwlod2Jhc2UgJj0gUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwlyZWJhc2UgPSBpb3JlbWFwKGh3YmFzZSwgMHg4MCk7CisJdCA9IHJlYWRsIChyZWJhc2UgKyBDTlRSTF9SRUdfT0ZGU0VUKTsKKwlpZiAodCAhPSBDTlRSTF9SRUdfR09PRFZBTFVFKSB7CisJCXByaW50ayAoS0VSTl9ERUJVRyAic3g6IHBlcmZvcm1pbmcgY250cmwgcmVnIGZpeDogJTA4eCAtPiAlMDh4XG4iLCB0LCBDTlRSTF9SRUdfR09PRFZBTFVFKTsgCisJCXdyaXRlbCAoQ05UUkxfUkVHX0dPT0RWQUxVRSwgcmViYXNlICsgQ05UUkxfUkVHX09GRlNFVCk7CisJfQorCWlvdW5tYXAocmViYXNlKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgX19pbml0IHN4X2luaXQodm9pZCkgCit7CisJaW50IGk7CisJaW50IGZvdW5kID0gMDsKKwlpbnQgZWlzYV9zbG90OworCXN0cnVjdCBzeF9ib2FyZCAqYm9hcmQ7CisKKyNpZmRlZiBDT05GSUdfUENJCisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCXVuc2lnbmVkIGludCB0aW50OworCXVuc2lnbmVkIHNob3J0IHRzaG9ydDsKKyNlbmRpZgorCisJZnVuY19lbnRlcigpOworCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOSVQsICJJbml0aW5nIHN4IG1vZHVsZS4uLiAoc3hfZGVidWc9JWQpXG4iLCBzeF9kZWJ1Zyk7CisJaWYgKGFicyAoKGxvbmcpICgmc3hfZGVidWcpIC0gc3hfZGVidWcpIDwgMHgxMDAwMCkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAic3g6IHN4X2RlYnVnIGlzIGFuIGFkZHJlc3MsIGluc3RlYWQgb2YgYSB2YWx1ZS4gIgorCQkgICAgICAgICJBc3N1bWluZyAtMS5cbiIpOworCQlwcmludGsgKCIoJXApXG4iLCAmc3hfZGVidWcpOworCQlzeF9kZWJ1Zz0tMTsKKwl9CisKKwlpZiAobWlzY19yZWdpc3Rlcigmc3hfZndfZGV2aWNlKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTWDogVW5hYmxlIHRvIHJlZ2lzdGVyIGZpcm13YXJlIGxvYWRlciBkcml2ZXIuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisjaWZkZWYgQ09ORklHX1BDSQorCXdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZSAoUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgsIAorCQkJCQlQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9TWF9YSU9fSU84LCAKKwkJCQkJICAgICAgcGRldikpKSB7CisJCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFNwZWNpYWxpeCBoYXMgYSB3aG9sZSBidW5jaCBvZiBjYXJkcyB3aXRoCisJCSAgIDB4MjAwMCBhcyB0aGUgZGV2aWNlIElELiBUaGV5IHNheSBpdHMgYmVjYXVzZQorCQkgICB0aGUgc3RhbmRhcmQgcmVxdWlyZXMgaXQuIFN0dXBpZCBzdGFuZGFyZC4gKi8KKwkJLyogSXQgc2VlbXMgdGhhdCByZWFkaW5nIGEgd29yZCBkb2Vzbid0IHdvcmsgcmVsaWFibHkgb24gMi4wLgorCQkgICBBbHNvLCByZWFkaW5nIGEgbm9uLWFsaWduZWQgZHdvcmQgZG9lc24ndCB3b3JrLiBTbyB3ZSByZWFkIHRoZQorCQkgICB3aG9sZSBkd29yZCBhdCAweDJjIGFuZCBleHRyYWN0IHRoZSB3b3JkIGF0IDB4MmUgKFNVQlNZU1RFTV9JRCkKKwkJICAgb3Vyc2VsdmVzICovCisJCS8qIEkgZG9uJ3Qga25vdyB3aHkgdGhlIGRlZmluZSBkb2Vzbid0IHdvcmssIGNvbnN0YW50IDB4MmMgZG9lcyAtLVJFVyAqLyAKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkIChwZGV2LCAweDJjLCAmdGludCk7CisJCXRzaG9ydCA9ICh0aW50ID4+IDE2KSAmIDB4ZmZmZjsKKwkJc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICJHb3QgYSBzcGVjaWFsaXggY2FyZDogJXguXG4iLCB0aW50KTsKKwkJLyogc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICJwZGV2ID0gJWQvJWQJKCV4KVxuIiwgcGRldiwgdGludCk7ICovIAorCQlpZiAoKHRzaG9ydCAhPSAweDAyMDApICYmICh0c2hvcnQgIT0gMHgwMzAwKSkgeworCQkJc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICJCdXQgaXQncyBub3QgYW4gU1ggY2FyZCAoJWQpLi4uXG4iLCAKKwkJCQkgICAgdHNob3J0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJvYXJkID0gJmJvYXJkc1tmb3VuZF07CisKKwkJYm9hcmQtPmZsYWdzICY9IH5TWF9CT0FSRF9UWVBFOworCQlib2FyZC0+ZmxhZ3MgfD0gKHRzaG9ydCA9PSAweDIwMCk/U1hfUENJX0JPQVJEOgorCQkJCQkJICBTWF9DRlBDSV9CT0FSRDsKKworCQkvKiBDRiBib2FyZHMgdXNlIGJhc2UgYWRkcmVzcyAzLi4uLiAqLworCQlpZiAoSVNfQ0ZfQk9BUkQgKGJvYXJkKSkKKwkJCWJvYXJkLT5od19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAzKTsKKwkJZWxzZQorCQkJYm9hcmQtPmh3X2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDIpOworCQlib2FyZC0+YmFzZTIgPSAKKwkJYm9hcmQtPmJhc2UgPSBpb3JlbWFwKGJvYXJkLT5od19iYXNlLCBXSU5ET1dfTEVOIChib2FyZCkpOworCQlpZiAoIWJvYXJkLT5iYXNlKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImlvcmVtYXAgZmFpbGVkXG4iKTsKKwkJCS8qIFhYWCBoYW5kbGUgZXJyb3IgKi8KKwkJfQorCisJCS8qIE1vc3Qgb2YgdGhlIHN0dWZmIG9uIHRoZSBDRiBib2FyZCBpcyBvZmZzZXQgYnkKKwkJICAgMHgxODAwMCAuLi4uICAqLworCQlpZiAoSVNfQ0ZfQk9BUkQgKGJvYXJkKSkgYm9hcmQtPmJhc2UgKz0gMHgxODAwMDsKKworCQlib2FyZC0+aXJxID0gcGRldi0+aXJxOworCisJCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiR290IGEgc3BlY2lhbGl4IGNhcmQ6ICV4LyVwKCVkKSAleC5cbiIsIAorCQkJICAgIHRpbnQsIGJvYXJkc1tmb3VuZF0uYmFzZSwgYm9hcmQtPmlycSwgYm9hcmQtPmZsYWdzKTsKKworCQlpZiAocHJvYmVfc3ggKGJvYXJkKSkgeworCQkJZm91bmQrKzsKKwkJCWZpeF9zeF9wY2kgKHBkZXYsIGJvYXJkKTsKKwkJfSBlbHNlIAorCQkJaW91bm1hcChib2FyZC0+YmFzZTIpOworCX0KKyNlbmRpZgorCisJZm9yIChpPTA7aTxOUl9TWF9BRERSUztpKyspIHsKKwkJYm9hcmQgPSAmYm9hcmRzW2ZvdW5kXTsKKwkJYm9hcmQtPmh3X2Jhc2UgPSBzeF9wcm9iZV9hZGRyc1tpXTsKKwkJYm9hcmQtPmJhc2UyID0KKwkJYm9hcmQtPmJhc2UgPSBpb3JlbWFwKGJvYXJkLT5od19iYXNlLCBTWF9XSU5ET1dfTEVOKTsKKwkJYm9hcmQtPmZsYWdzICY9IH5TWF9CT0FSRF9UWVBFOworCQlib2FyZC0+ZmxhZ3MgfD0JU1hfSVNBX0JPQVJEOworCQlib2FyZC0+aXJxID0gc3hfaXJxbWFzaz8tMTowOworCisJCWlmIChwcm9iZV9zeCAoYm9hcmQpKSB7CisJCQlmb3VuZCsrOworCQl9IGVsc2UgeworCQkJaW91bm1hcChib2FyZC0+YmFzZSk7CisJCX0KKwl9CisKKwlmb3IgKGk9MDtpPE5SX1NJX0FERFJTO2krKykgeworCQlib2FyZCA9ICZib2FyZHNbZm91bmRdOworCQlib2FyZC0+aHdfYmFzZSA9IHNpX3Byb2JlX2FkZHJzW2ldOworCQlib2FyZC0+YmFzZTIgPQorCQlib2FyZC0+YmFzZSA9IGlvcmVtYXAoYm9hcmQtPmh3X2Jhc2UsIFNJMl9JU0FfV0lORE9XX0xFTik7CisJCWJvYXJkLT5mbGFncyAmPSB+U1hfQk9BUkRfVFlQRTsKKwkJYm9hcmQtPmZsYWdzIHw9ICBTSV9JU0FfQk9BUkQ7CisJCWJvYXJkLT5pcnEgPSBzeF9pcnFtYXNrID8tMTowOworCisJCWlmIChwcm9iZV9zaSAoYm9hcmQpKSB7CisJCQlmb3VuZCsrOworCQl9IGVsc2UgeworCQkJaW91bm1hcCAoYm9hcmQtPmJhc2UpOworCQl9CisJfQorCWZvciAoaT0wO2k8TlJfU0kxX0FERFJTO2krKykgeworCQlib2FyZCA9ICZib2FyZHNbZm91bmRdOworCQlib2FyZC0+aHdfYmFzZSA9IHNpMV9wcm9iZV9hZGRyc1tpXTsKKwkJYm9hcmQtPmJhc2UyID0KKwkJYm9hcmQtPmJhc2UgPSBpb3JlbWFwKGJvYXJkLT5od19iYXNlLCBTSTFfSVNBX1dJTkRPV19MRU4pOworCQlib2FyZC0+ZmxhZ3MgJj0gflNYX0JPQVJEX1RZUEU7CisJCWJvYXJkLT5mbGFncyB8PSAgU0kxX0lTQV9CT0FSRDsKKwkJYm9hcmQtPmlycSA9IHN4X2lycW1hc2sgPy0xOjA7CisKKwkJaWYgKHByb2JlX3NpIChib2FyZCkpIHsKKwkJCWZvdW5kKys7CisJCX0gZWxzZSB7CisJCQlpb3VubWFwIChib2FyZC0+YmFzZSk7CisJCX0KKwl9CisKKyAgICAgICAgc3hfZHByaW50ayhTWF9ERUJVR19QUk9CRSwgIlByb2JpbmcgZm9yIEVJU0EgY2FyZHNcbiIpOworICAgICAgICBmb3IoZWlzYV9zbG90PTB4MTAwMDsgZWlzYV9zbG90PDB4MTAwMDA7IGVpc2Ffc2xvdCs9MHgxMDAwKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKGluYihlaXNhX3Nsb3QrMHhjODApPT0weDRkKSAmJgorICAgICAgICAgICAgICAgICAgIChpbmIoZWlzYV9zbG90KzB4YzgxKT09MHg5OCkpCisgICAgICAgICAgICAgICAgeworCQkJc3hfZHByaW50ayhTWF9ERUJVR19QUk9CRSwgIiVzIDogU2lnbmF0dXJlIGZvdW5kIGluIEVJU0Egc2xvdCAlZCwgUHJvZHVjdCAlZCBSZXYgJWRcbiIsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAiWElPIiwgKGVpc2Ffc2xvdD4+MTIpLCBpbmIoZWlzYV9zbG90KzB4YzgyKSwgaW5iKGVpc2Ffc2xvdCsweGM4MykpOworCisJCQlib2FyZCA9ICZib2FyZHNbZm91bmRdOworCQkJYm9hcmQtPmVpc2FfYmFzZSA9IGVpc2Ffc2xvdDsKKwkJCWJvYXJkLT5mbGFncyAmPSB+U1hfQk9BUkRfVFlQRTsKKwkJCWJvYXJkLT5mbGFncyB8PSBTSV9FSVNBX0JPQVJEOworCisJCQlib2FyZC0+aHdfYmFzZSA9ICgoKGluYigweGMwMStlaXNhX3Nsb3QpIDw8IDgpICsgaW5iKDB4YzAwK2Vpc2Ffc2xvdCkpIDw8IDE2KTsKKwkJCWJvYXJkLT5iYXNlMiA9CisJCQlib2FyZC0+YmFzZSA9IGlvcmVtYXAoYm9hcmQtPmh3X2Jhc2UsIFNJMl9FSVNBX1dJTkRPV19MRU4pOworCisJCQlzeF9kcHJpbnRrKFNYX0RFQlVHX1BST0JFLCAiSU8gaHdfYmFzZSBhZGRyZXNzOiAlbHhcbiIsIGJvYXJkLT5od19iYXNlKTsKKwkJCXN4X2RwcmludGsoU1hfREVCVUdfUFJPQkUsICJiYXNlOiAlcFxuIiwgYm9hcmQtPmJhc2UpOworCQkJYm9hcmQtPmlycSA9IGluYihib2FyZC0+ZWlzYV9iYXNlKzB4YzAyKT4+NDsgCisJCQlzeF9kcHJpbnRrKFNYX0RFQlVHX1BST0JFLCAiSVJROiAlZFxuIiwgYm9hcmQtPmlycSk7CisJCQkKKwkJCXByb2JlX3NpKGJvYXJkKTsKKworCQkJZm91bmQrKzsKKwkJfQorCX0KKwlpZiAoZm91bmQpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gInN4OiB0b3RhbCBvZiAlZCBib2FyZHMgZGV0ZWN0ZWQuXG4iLCBmb3VuZCk7CisJfSBlbHNlIHsKKwkJbWlzY19kZXJlZ2lzdGVyKCZzeF9md19kZXZpY2UpOworCX0KKworCWZ1bmNfZXhpdCgpOworCXJldHVybiBmb3VuZD8wOi1FSU87Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHN4X2V4aXQgKHZvaWQpCit7CisJaW50IGk7IAorCXN0cnVjdCBzeF9ib2FyZCAqYm9hcmQ7CisKKwlmdW5jX2VudGVyKCk7CisJZm9yIChpID0gMDsgaSA8IFNYX05CT0FSRFM7IGkrKykgeworCQlib2FyZCA9ICZib2FyZHNbaV07CisJCWlmIChib2FyZC0+ZmxhZ3MgJiBTWF9CT0FSRF9JTklUSUFMSVpFRCkgeworCQkJc3hfZHByaW50ayAoU1hfREVCVUdfQ0xFQU5VUCwgIkNsZWFuaW5nIHVwIGJvYXJkIGF0ICVwXG4iLCBib2FyZC0+YmFzZSk7CisJCQkvKiBUaGUgYm9hcmQgc2hvdWxkIHN0b3AgbWVzc2luZyB3aXRoIHVzLgorCQkJICAgKGFjdHVhbGx5IEkgbWVhbiB0aGUgaW50ZXJydXB0KSAqLworCQkJc3hfcmVzZXQgKGJvYXJkKTsKKwkJCWlmICgoYm9hcmQtPmlycSkgJiYgKGJvYXJkLT5mbGFncyAmIFNYX0lSUV9BTExPQ0FURUQpKQorCQkJCWZyZWVfaXJxIChib2FyZC0+aXJxLCBib2FyZCk7CisKKwkJCS8qIEl0IGlzIHNhZmUvYWxsb3dlZCB0byBkZWxfdGltZXIgYSBub24tYWN0aXZlIHRpbWVyICovCisJCQlkZWxfdGltZXIgKCYgYm9hcmQtPnRpbWVyKTsKKwkJCWlvdW5tYXAoYm9hcmQtPmJhc2UpOworCQl9CisJfQorCWlmIChtaXNjX2RlcmVnaXN0ZXIoJnN4X2Z3X2RldmljZSkgPCAwKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJzeDogY291bGRuJ3QgZGVyZWdpc3RlciBmaXJtd2FyZSBsb2FkZXIgZGV2aWNcbiIpOworCX0KKwlzeF9kcHJpbnRrIChTWF9ERUJVR19DTEVBTlVQLCAiQ2xlYW5pbmcgdXAgZHJpdmVycyAoJWQpXG4iLCBzeF9pbml0aWFsaXplZCk7CisJaWYgKHN4X2luaXRpYWxpemVkKQorCQlzeF9yZWxlYXNlX2RyaXZlcnMgKCk7CisKKwlrZnJlZSAoc3hfcG9ydHMpOworCWZ1bmNfZXhpdCgpOworfQorCittb2R1bGVfaW5pdChzeF9pbml0KTsKK21vZHVsZV9leGl0KHN4X2V4aXQpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeC5oIGIvZHJpdmVycy9jaGFyL3N4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxZjgzYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9zeC5oCkBAIC0wLDAgKzEsMjAyIEBACisKKy8qCisgKiAgc3guaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgvMTk5OSBSLkUuV29sZmZAQml0V2l6YXJkLm5sCisgKgorICogIFNYIHNlcmlhbCBkcml2ZXIuCisgKiAgLS0gU3VwcG9ydHMgU0ksIFhJTyBhbmQgU1ggaG9zdCBjYXJkcy4gCisgKiAgLS0gU3VwcG9ydHMgVEFzLCBNVEFzIGFuZCBTWERDcy4KKyAqCisgKiAgVmVyc2lvbiAxLjMgLS0gTWFyY2gsIDE5OTkuIAorICogCisgKi8KKworI2RlZmluZSBTWF9OQk9BUkRTICAgICAgICA0CisjZGVmaW5lIFNYX1BPUlRTUEVSQk9BUkQgMzIKKyNkZWZpbmUgU1hfTlBPUlRTICAgICAgICAoU1hfTkJPQVJEUyAqIFNYX1BPUlRTUEVSQk9BUkQpCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgU1hfTUFHSUMgMHgxMjM0NTY3OAorCitzdHJ1Y3Qgc3hfcG9ydCB7CisgIHN0cnVjdCBnc19wb3J0ICAgICAgICAgIGdzOworICBzdHJ1Y3Qgd2FpdF9xdWV1ZSAgICAgICAqc2h1dGRvd25fd2FpdDsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgY2hfYmFzZTsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgY19kY2Q7CisgIHN0cnVjdCBzeF9ib2FyZCAgICAgICAgICpib2FyZDsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgbGluZTsKKyAgbG9uZyAgICAgICAgICAgICAgICAgICAgbG9ja3M7Cit9OworCitzdHJ1Y3Qgc3hfYm9hcmQgeworICBpbnQgbWFnaWM7CisgIHZvaWQgX19pb21lbSAqYmFzZTsKKyAgdm9pZCBfX2lvbWVtICpiYXNlMjsKKyAgdW5zaWduZWQgbG9uZyBod19iYXNlOworICBpbnQgZWlzYV9iYXNlOworICBpbnQgcG9ydF9iYXNlOyAvKiBOdW1iZXIgb2YgdGhlIGZpcnN0IHBvcnQgKi8KKyAgc3RydWN0IHN4X3BvcnQgKnBvcnRzOworICBpbnQgbnBvcnRzOworICBpbnQgZmxhZ3M7CisgIGludCBpcnE7CisgIGludCBwb2xsOworICBpbnQgdGFfdHlwZTsKKyAgc3RydWN0IHRpbWVyX2xpc3QgICAgICAgdGltZXI7CisgIGxvbmcgICAgICAgICAgICAgICAgICAgIGxvY2tzOworfTsKKworc3RydWN0IHZwZF9wcm9tIHsKKyAgdW5zaWduZWQgc2hvcnQgaWQ7CisgIGNoYXIgaHdyZXY7CisgIGNoYXIgaHdhc3M7CisgIGludCB1bmlxaWQ7CisgIGNoYXIgbXllYXI7CisgIGNoYXIgbXdlZWs7CisgIGNoYXIgaHdfZmVhdHVyZVs1XTsKKyAgY2hhciBvZW1faWQ7CisgIGNoYXIgaWRlbnRpZmllclsxNl07Cit9OworCisjaWZuZGVmIE1PRF9SUzIzMkRCMjVNQUxFCisjZGVmaW5lIE1PRF9SUzIzMkRCMjVNQUxFIDB4MGEKKyNlbmRpZgorCisjZGVmaW5lIFNJX0lTQV9CT0FSRCAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU1hfSVNBX0JPQVJEICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBTWF9QQ0lfQk9BUkQgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFNYX0NGUENJX0JPQVJEICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgU1hfQ0ZJU0FfQk9BUkQgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBTSV9FSVNBX0JPQVJEICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFNJMV9JU0FfQk9BUkQgICAgICAgIDB4MDAwMDAwNDAKKworI2RlZmluZSBTWF9CT0FSRF9QUkVTRU5UICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFNYX0JPQVJEX0lOSVRJQUxJWkVEIDB4MDAwMDIwMDAKKyNkZWZpbmUgU1hfSVJRX0FMTE9DQVRFRCAgICAgMHgwMDAwNDAwMAorCisjZGVmaW5lIFNYX0JPQVJEX1RZUEUgICAgICAgIDB4MDAwMDAwZmYKKworI2RlZmluZSBJU19TWF9CT0FSRChib2FyZCkgKGJvYXJkLT5mbGFncyAmIChTWF9QQ0lfQk9BUkQgfCBTWF9DRlBDSV9CT0FSRCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1hfSVNBX0JPQVJEIHwgU1hfQ0ZJU0FfQk9BUkQpKQorCisjZGVmaW5lIElTX1NJX0JPQVJEKGJvYXJkKSAoYm9hcmQtPmZsYWdzICYgU0lfSVNBX0JPQVJEKQorI2RlZmluZSBJU19TSTFfQk9BUkQoYm9hcmQpIChib2FyZC0+ZmxhZ3MgJiBTSTFfSVNBX0JPQVJEKQorCisjZGVmaW5lIElTX0VJU0FfQk9BUkQoYm9hcmQpIChib2FyZC0+ZmxhZ3MgJiBTSV9FSVNBX0JPQVJEKQorCisjZGVmaW5lIElTX0NGX0JPQVJEKGJvYXJkKSAoYm9hcmQtPmZsYWdzICYgKFNYX0NGSVNBX0JPQVJEIHwgU1hfQ0ZQQ0lfQk9BUkQpKQorCisjZGVmaW5lIFNFUklBTF9UWVBFX05PUk1BTCAxCisKKy8qIFRoZSBTSSBwcm9jZXNzb3IgY2xvY2sgaXMgcmVxdWlyZWQgdG8gY2FsY3VsYXRlIHRoZSBjY19pbnRfY291bnQgcmVnaXN0ZXIKKyAgIHZhbHVlIGZvciB0aGUgU0kgY2FyZHMuICovCisjZGVmaW5lIFNJX1BST0NFU1NPUl9DTE9DSyAyNTAwMDAwMAorCisKKy8qIHBvcnQgZmxhZ3MgKi8KKy8qIE1ha2Ugc3VyZSB0aGVzZSBkb24ndCBjbGFzaCB3aXRoIGdzIGZsYWdzIG9yIGFzeW5jIGZsYWdzICovCisjZGVmaW5lIFNYX1JYX1RIUk9UVExFICAgICAgICAweDAwMDAwMDEKKworCisKKyNkZWZpbmUgU1hfUE9SVF9UUkFOU01JVF9MT0NLICAwCisjZGVmaW5lIFNYX0JPQVJEX0lOVFJfTE9DSyAgICAgMAorCisKKworLyogRGVidWcgZmxhZ3MuIEFkZCB0aGVzZSB0b2dldGhlciB0byBnZXQgbW9yZSBkZWJ1ZyBpbmZvLiAqLworCisjZGVmaW5lIFNYX0RFQlVHX09QRU4gICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTWF9ERUJVR19TRVRUSU5HICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU1hfREVCVUdfRkxPVyAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFNYX0RFQlVHX01PREVNU0lHTkFMUyAgMHgwMDAwMDAwOAorI2RlZmluZSBTWF9ERUJVR19URVJNSU9TICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgU1hfREVCVUdfVFJBTlNNSVQgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFNYX0RFQlVHX1JFQ0VJVkUgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBTWF9ERUJVR19JTlRFUlJVUFRTICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgU1hfREVCVUdfUFJPQkUgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFNYX0RFQlVHX0lOSVQgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBTWF9ERUJVR19DTEVBTlVQICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgU1hfREVCVUdfQ0xPU0UgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFNYX0RFQlVHX0ZJUk1XQVJFICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBTWF9ERUJVR19NRU1URVNUICAgICAgIDB4MDAwMDIwMDAKKworI2RlZmluZSBTWF9ERUJVR19BTEwgICAgICAgICAgIDB4ZmZmZmZmZmYKKworCisjZGVmaW5lIE9fT1RIRVIodHR5KSAgICBcCisgICAgICAoKE9fT0xDVUModHR5KSkgIHx8XAorICAgICAgKE9fT05MQ1IodHR5KSkgICB8fFwKKyAgICAgIChPX09DUk5MKHR0eSkpICAgfHxcCisgICAgICAoT19PTk9DUih0dHkpKSAgIHx8XAorICAgICAgKE9fT05MUkVUKHR0eSkpICB8fFwKKyAgICAgIChPX09GSUxMKHR0eSkpICAgfHxcCisgICAgICAoT19PRkRFTCh0dHkpKSAgIHx8XAorICAgICAgKE9fTkxETFkodHR5KSkgICB8fFwKKyAgICAgIChPX0NSRExZKHR0eSkpICAgfHxcCisgICAgICAoT19UQUJETFkodHR5KSkgIHx8XAorICAgICAgKE9fQlNETFkodHR5KSkgICB8fFwKKyAgICAgIChPX1ZURExZKHR0eSkpICAgfHxcCisgICAgICAoT19GRkRMWSh0dHkpKSkKKworLyogU2FtZSBmb3IgaW5wdXQuICovCisjZGVmaW5lIElfT1RIRVIodHR5KSAgICBcCisgICAgICAoKElfSU5MQ1IodHR5KSkgIHx8XAorICAgICAgKElfSUdOQ1IodHR5KSkgICB8fFwKKyAgICAgIChJX0lDUk5MKHR0eSkpICAgfHxcCisgICAgICAoSV9JVUNMQyh0dHkpKSAgIHx8XAorICAgICAgKExfSVNJRyh0dHkpKSkKKworI2RlZmluZSBNT0RfVEEgICAoICAgICAgICBUQT4+NCkKKyNkZWZpbmUgTU9EX01UQSAgKE1UQV9DRDE0MDA+PjQpCisjZGVmaW5lIE1PRF9TWERDICggICAgICBTWERDPj40KQorCisKKy8qIFdlIGNvcHkgdGhlIGRvd25sb2FkIGNvZGUgb3ZlciB0byB0aGUgY2FyZCBpbiBjaHVua3Mgb2YgLi4uIGJ5dGVzICovCisjZGVmaW5lIFNYX0NIVU5LX1NJWkUgMTI4CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKworCisvKiBTcGVjaWFsaXggZG9jdW1lbnQgNjIxMDA0Ni0xMSBwYWdlIDMgKi8KKyNkZWZpbmUgU1BYKFgpICgoJ1MnPDwyNCkgfCAoJ1AnIDw8IDE2KSB8IChYKSkKKworLyogU3BlY2lhbGl4LUxpbnV4IHNwZWNpZmljIElPQ1RMUy4gKi8KKyNkZWZpbmUgU1BYTChYKSAoU1BYKCgnTCcgPDwgOCkgfCAoWCkpKQorCisKKyNkZWZpbmUgU1hJT19TRVRfQk9BUkQgICAgICBTUFhMKDB4MDEpCisjZGVmaW5lIFNYSU9fR0VUX1RZUEUgICAgICAgU1BYTCgweDAyKQorI2RlZmluZSBTWElPX0RPV05MT0FEICAgICAgIFNQWEwoMHgwMykKKyNkZWZpbmUgU1hJT19JTklUICAgICAgICAgICBTUFhMKDB4MDQpCisjZGVmaW5lIFNYSU9fU0VUREVCVUcgICAgICAgU1BYTCgweDA1KQorI2RlZmluZSBTWElPX0dFVERFQlVHICAgICAgIFNQWEwoMHgwNikKKyNkZWZpbmUgU1hJT19ET19SQU1URVNUICAgICBTUFhMKDB4MDcpCisjZGVmaW5lIFNYSU9fU0VUR1NERUJVRyAgICAgU1BYTCgweDA4KQorI2RlZmluZSBTWElPX0dFVEdTREVCVUcgICAgIFNQWEwoMHgwOSkKKyNkZWZpbmUgU1hJT19HRVROUE9SVFMgICAgICBTUFhMKDB4MGEpCisKKworI2lmbmRlZiBTWENUTF9NSVNDX01JTk9SIAorLyogQWxsb3cgb3RoZXJzIHRvIGdhdGhlciB0aGlzIGludG8gIm1ham9yLmgiIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQgKi8KKyNkZWZpbmUgU1hDVExfTUlTQ19NSU5PUiAgICAxNjcKKyNlbmRpZgorCisjaWZuZGVmIFNYX05PUk1BTF9NQUpPUgorLyogVGhpcyBhbGxvd3Mgb3ZlcnJpZGluZyBvbiB0aGUgY29tcGlsZXIgY29tbWFuZGxpbmUsIG9yIGluIGEgIm1ham9yLmgiIAorICAgaW5jbHVkZSBvciBzb21ldGhpbmcgbGlrZSB0aGF0ICovCisjZGVmaW5lIFNYX05PUk1BTF9NQUpPUiAgMzIKKyNkZWZpbmUgU1hfQ0FMTE9VVF9NQUpPUiAzMworI2VuZGlmCisKKworI2RlZmluZSBTWF9UWVBFX1NYICAgICAgICAgIDB4MDEKKyNkZWZpbmUgU1hfVFlQRV9TSSAgICAgICAgICAweDAyCisjZGVmaW5lIFNYX1RZUEVfQ0YgICAgICAgICAgMHgwMworCisKKyNkZWZpbmUgV0lORE9XX0xFTihib2FyZCkgKElTX0NGX0JPQVJEKGJvYXJkKT8weDIwMDAwOlNYX1dJTkRPV19MRU4pCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBOZWVkIGEgI2RlZmluZSBmb3IgXl5eXl5eXiAhISEgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N4Ym9hcmRzLmggYi9kcml2ZXJzL2NoYXIvc3hib2FyZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjc5MjdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3N4Ym9hcmRzLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglUaXRsZQkJOglTWC9TSS9YSU8gQm9hcmQgSGFyZHdhcmUgRGVmaW5pdGlvbnMJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUF1dGhvcgkJOglOLlAuVmFzc2FsbG8JCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUNyZWF0aW9uCToJMTZ0aCBNYXJjaCAxOTk4CQkJCSovCisvKgkJCQkJCQkJCSovCisvKglWZXJzaW9uCQk6CTMuMC4wCQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoJQ29weXJpZ2h0CToJKGMpIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4gMTk5OAkqLworLyoJCQkJCQkJCQkqLworLyoJRGVzY3JpcHRpb24JOglQcm90b3R5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucwkqLworLyoJCQkJZGVzY3JpYmluZyB0aGUgU1gvU0kvWElPIGJvYXJkIGhhcmR3YXJlCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIaXN0b3J5Li4uCisKKzMuMC4wCTE2LzAzLzk4IE5QVglDcmVhdGlvbi4KKworKi8KKworI2lmbmRlZglfc3hib2FyZHNfaAkJCQkvKiBJZiBTWEJPQVJEUy5IIG5vdCBhbHJlYWR5IGRlZmluZWQgKi8KKyNkZWZpbmUJX3N4Ym9hcmRzX2ggICAgMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIEJvYXJkIFR5cGVzICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBCVVMgdHlwZXMuLi4gKi8KKyNkZWZpbmUJCUJVU19JU0EJCTAKKyNkZWZpbmUJCUJVU19NQ0EJCTEKKyNkZWZpbmUJCUJVU19FSVNBCTIKKyNkZWZpbmUJCUJVU19QQ0kJCTMKKworLyogQm9hcmQgcGhhc2VzLi4uICovCisjZGVmaW5lCQlTSTFfWjI4MAkxCisjZGVmaW5lCQlTSTJfWjI4MAkyCisjZGVmaW5lCQlTSTNfVDIyNQkzCisKKy8qIEJvYXJkIHR5cGVzLi4uICovCisjZGVmaW5lCQlDQVJEX1RZUEUoYnVzLHBoYXNlKQkoYnVzPDw0fHBoYXNlKQorI2RlZmluZQkJQ0FSRF9CVVModHlwZSkJCSgodHlwZT4+NCkmMHhGKQorI2RlZmluZQkJQ0FSRF9QSEFTRSh0eXBlKQkodHlwZSYweEYpCisKKyNkZWZpbmUJCVRZUEVfU0kxX0lTQQkJQ0FSRF9UWVBFKEJVU19JU0EsU0kxX1oyODApCisjZGVmaW5lCQlUWVBFX1NJMl9JU0EJCUNBUkRfVFlQRShCVVNfSVNBLFNJMl9aMjgwKQorI2RlZmluZQkJVFlQRV9TSTJfRUlTQQkJQ0FSRF9UWVBFKEJVU19FSVNBLFNJMl9aMjgwKQorI2RlZmluZQkJVFlQRV9TSTJfUENJCQlDQVJEX1RZUEUoQlVTX1BDSSxTSTJfWjI4MCkKKworI2RlZmluZQkJVFlQRV9TWF9JU0EJCUNBUkRfVFlQRShCVVNfSVNBLFNJM19UMjI1KQorI2RlZmluZQkJVFlQRV9TWF9QQ0kJCUNBUkRfVFlQRShCVVNfUENJLFNJM19UMjI1KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFBoYXNlIDEgWjI4MCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSVNBIGJvYXJkIGRldGFpbHMuLi4gKi8KKyNkZWZpbmUJCVNJMV9JU0FfV0lORE9XX0xFTgkweDEwMDAwCQkvKiA2NCBLYnl0ZSBzaGFyZWQgbWVtb3J5IHdpbmRvdyAqLworLy8jZGVmaW5lIAlTSTFfSVNBX01FTU9SWV9MRU4JMHg4MDAwCQkvKiBVc2FibGUgbWVtb3J5ICAtIHVudXNlZCBkZWZpbmUqLworLy8jZGVmaW5lCQlTSTFfSVNBX0FERFJfTE9XCTB4MEEwMDAwCS8qIExvd2VzdCBhZGRyZXNzID0gNjQwIEtieXRlICovCisvLyNkZWZpbmUJCVNJMV9JU0FfQUREUl9ISUdICTB4RkY4MDAwCS8qIEhpZ2hlc3QgYWRkcmVzcyA9IDE2TWJ5dGUgLSAzMktieXRlICovCisvLyNkZWZpbmUJCVNJMl9JU0FfQUREUl9TVEVQCVNJMl9JU0FfV0lORE9XX0xFTi8qIElTQSBib2FyZCBhZGRyZXNzIHN0ZXAgKi8KKy8vI2RlZmluZQkJU0kyX0lTQV9JUlFfTUFTSwkweDk4MDAJCS8qIElSUXMgMTUsMTIsMTEgKi8KKworLyogSVNBIGJvYXJkLCByZWdpc3RlciBkZWZpbml0aW9ucy4uLiAqLworLy8jZGVmaW5lCQlTSTJfSVNBX0lEX0JBU0UJCTB4N0ZGOAkJCS8qIFJFQUQ6ICBCb2FyZCBJRCBzdHJpbmcgKi8KKyNkZWZpbmUJCVNJMV9JU0FfUkVTRVQJCTB4ODAwMAkJLyogV1JJVEU6IEhvc3QgUmVzZXQgKi8KKyNkZWZpbmUJCVNJMV9JU0FfUkVTRVRfQ0xFQVIJMHhjMDAwCQkvKiBXUklURTogSG9zdCBSZXNldCBjbGVhciovCisjZGVmaW5lCQlTSTFfSVNBX1dBSVQJICAgICAgICAweDkwMDAJCS8qIFdSSVRFOiBIb3N0IHdhaXQgKi8KKyNkZWZpbmUJCVNJMV9JU0FfV0FJVF9DTEVBUgkweGQwMDAJCS8qIFdSSVRFOiBIb3N0IHdhaXQgY2xlYXIgKi8KKyNkZWZpbmUJCVNJMV9JU0FfSU5UQ0wgICAgICAgIAkweGEwMDAJCS8qIFdSSVRFOiBIb3N0IFJlc2V0ICovCisjZGVmaW5lCQlTSTFfSVNBX0lOVENMX0NMRUFSCTB4ZTAwMAkJLyogV1JJVEU6IEhvc3QgUmVzZXQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUGhhc2UgMiBaMjgwICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJU0EgYm9hcmQgZGV0YWlscy4uLiAqLworI2RlZmluZQkJU0kyX0lTQV9XSU5ET1dfTEVOCTB4ODAwMAkJLyogMzIgS2J5dGUgc2hhcmVkIG1lbW9yeSB3aW5kb3cgKi8KKyNkZWZpbmUgCVNJMl9JU0FfTUVNT1JZX0xFTgkweDdGRjgJCS8qIFVzYWJsZSBtZW1vcnkgKi8KKyNkZWZpbmUJCVNJMl9JU0FfQUREUl9MT1cJMHgwQTAwMDAJLyogTG93ZXN0IGFkZHJlc3MgPSA2NDAgS2J5dGUgKi8KKyNkZWZpbmUJCVNJMl9JU0FfQUREUl9ISUdICTB4RkY4MDAwCS8qIEhpZ2hlc3QgYWRkcmVzcyA9IDE2TWJ5dGUgLSAzMktieXRlICovCisjZGVmaW5lCQlTSTJfSVNBX0FERFJfU1RFUAlTSTJfSVNBX1dJTkRPV19MRU4vKiBJU0EgYm9hcmQgYWRkcmVzcyBzdGVwICovCisjZGVmaW5lCQlTSTJfSVNBX0lSUV9NQVNLCTB4OTgwMAkJLyogSVJRcyAxNSwxMiwxMSAqLworCisvKiBJU0EgYm9hcmQsIHJlZ2lzdGVyIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlTSTJfSVNBX0lEX0JBU0UJCTB4N0ZGOAkJCS8qIFJFQUQ6ICBCb2FyZCBJRCBzdHJpbmcgKi8KKyNkZWZpbmUJCVNJMl9JU0FfUkVTRVQJCVNJMl9JU0FfSURfQkFTRQkJLyogV1JJVEU6IEhvc3QgUmVzZXQgKi8KKyNkZWZpbmUJCVNJMl9JU0FfSVJRMTEJCShTSTJfSVNBX0lEX0JBU0UrMSkJLyogV1JJVEU6IFNldCBJUlExMSAqLworI2RlZmluZQkJU0kyX0lTQV9JUlExMgkJKFNJMl9JU0FfSURfQkFTRSsyKQkvKiBXUklURTogU2V0IElSUTEyICovCisjZGVmaW5lCQlTSTJfSVNBX0lSUTE1CQkoU0kyX0lTQV9JRF9CQVNFKzMpCS8qIFdSSVRFOiBTZXQgSVJRMTUgKi8KKyNkZWZpbmUJCVNJMl9JU0FfSVJRU0VUCQkoU0kyX0lTQV9JRF9CQVNFKzQpCS8qIFdSSVRFOiBTZXQgSG9zdCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCVNJMl9JU0FfSU5UQ0xFQVIJKFNJMl9JU0FfSURfQkFTRSs1KQkvKiBXUklURTogRW5hYmxlIEhvc3QgSW50ZXJydXB0ICovCisKKyNkZWZpbmUJCVNJMl9JU0FfSVJRMTFfU0VUCTB4MTAKKyNkZWZpbmUJCVNJMl9JU0FfSVJRMTFfQ0xFQVIJMHgwMAorI2RlZmluZQkJU0kyX0lTQV9JUlExMl9TRVQJMHgxMAorI2RlZmluZQkJU0kyX0lTQV9JUlExMl9DTEVBUgkweDAwCisjZGVmaW5lCQlTSTJfSVNBX0lSUTE1X1NFVAkweDEwCisjZGVmaW5lCQlTSTJfSVNBX0lSUTE1X0NMRUFSCTB4MDAKKyNkZWZpbmUJCVNJMl9JU0FfSU5UQ0xFQVJfU0VUCTB4MTAKKyNkZWZpbmUJCVNJMl9JU0FfSU5UQ0xFQVJfQ0xFQVIJMHgwMAorI2RlZmluZQkJU0kyX0lTQV9JUlFTRVRfQ0xFQVIJMHgxMAorI2RlZmluZQkJU0kyX0lTQV9JUlFTRVRfU0VUCTB4MDAKKyNkZWZpbmUJCVNJMl9JU0FfUkVTRVRfU0VUCTB4MDAKKyNkZWZpbmUJCVNJMl9JU0FfUkVTRVRfQ0xFQVIJMHgxMAorCisvKiBQQ0kgYm9hcmQgZGV0YWlscy4uLiAqLworI2RlZmluZQkJU0kyX1BDSV9XSU5ET1dfTEVOCTB4MTAwMDAwCS8qIDEgTWJ5dGUgbWVtb3J5IHdpbmRvdyAqLworCisvKiBQQ0kgYm9hcmQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJCVNJMl9QQ0lfU0VUX0lSUQkJMHg0MDAwMQkJLyogU2V0IEhvc3QgSW50ZXJydXB0ICAqLworI2RlZmluZQkJU0kyX1BDSV9SRVNFVAkJMHhDMDAwMQkJLyogSG9zdCBSZXNldCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUGhhc2UgMyBUMjI1ICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBHZW5lcmFsIGJvYXJkIGRldGFpbHMuLi4gKi8KKyNkZWZpbmUJCVNYX1dJTkRPV19MRU4JCTY0KjEwMjQJCS8qIDY0IEtieXRlIG1lbW9yeSB3aW5kb3cgKi8KKworLyogSVNBIGJvYXJkIGRldGFpbHMuLi4gKi8KKyNkZWZpbmUJCVNYX0lTQV9BRERSX0xPVwkJMHgwQTAwMDAJLyogTG93ZXN0IGFkZHJlc3MgPSA2NDAgS2J5dGUgKi8KKyNkZWZpbmUJCVNYX0lTQV9BRERSX0hJR0gJMHhGRjgwMDAJLyogSGlnaGVzdCBhZGRyZXNzID0gMTZNYnl0ZSAtIDMyS2J5dGUgKi8KKyNkZWZpbmUJCVNYX0lTQV9BRERSX1NURVAJU1hfV0lORE9XX0xFTgkvKiBJU0EgYm9hcmQgYWRkcmVzcyBzdGVwICovCisjZGVmaW5lCQlTWF9JU0FfSVJRX01BU0sJCTB4OUUwMAkJLyogSVJRcyAxNSwxMiwxMSwxMCw5ICovCisKKy8qIEhhcmR3YXJlIHJlZ2lzdGVyIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlTWF9FVkVOVF9TVEFUVVMJCTB4NzgwMAkJLyogUkVBRDogIFQyMjUgRXZlbnQgU3RhdHVzICovCisjZGVmaW5lCQlTWF9FVkVOVF9TVFJPQkUJCTB4NzgwMAkJLyogV1JJVEU6IFQyMjUgRXZlbnQgU3Ryb2JlICovCisjZGVmaW5lCQlTWF9FVkVOVF9FTkFCTEUJCTB4Nzg4MAkJLyogV1JJVEU6IFQyMjUgRXZlbnQgRW5hYmxlICovCisjZGVmaW5lCQlTWF9WUERfUk9NCQkweDdDMDAJCS8qIFJFQUQ6ICBWaXRhbCBQcm9kdWN0IERhdGEgUk9NICovCisjZGVmaW5lCQlTWF9DT05GSUcJCTB4N0MwMAkJLyogV1JJVEU6IEhvc3QgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQkJU1hfSVJRX1NUQVRVUwkJMHg3QzgwCQkvKiBSRUFEOiAgSG9zdCBJbnRlcnJ1cHQgU3RhdHVzICovCisjZGVmaW5lCQlTWF9TRVRfSVJRCQkweDdDODAJCS8qIFdSSVRFOiBTZXQgSG9zdCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCVNYX1JFU0VUX1NUQVRVUwkJMHg3RDAwCQkvKiBSRUFEOiAgSG9zdCBSZXNldCBTdGF0dXMgKi8KKyNkZWZpbmUJCVNYX1JFU0VUCQkweDdEMDAJCS8qIFdSSVRFOiBIb3N0IFJlc2V0ICovCisjZGVmaW5lCQlTWF9SRVNFVF9JUlEJCTB4N0Q4MAkJLyogV1JJVEU6IFJlc2V0IEhvc3QgSW50ZXJydXB0ICovCisKKy8qIFNYX1ZQRF9ST00gZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJCVNYX1ZQRF9TTFhfSUQxCQkweDAwCisjZGVmaW5lCQlTWF9WUERfU0xYX0lEMgkJMHgwMQorI2RlZmluZQkJU1hfVlBEX0hXX1JFVgkJMHgwMgorI2RlZmluZQkJU1hfVlBEX0hXX0FTU0VNCQkweDAzCisjZGVmaW5lCQlTWF9WUERfVU5JUVVFSUQ0CTB4MDQKKyNkZWZpbmUJCVNYX1ZQRF9VTklRVUVJRDMJMHgwNQorI2RlZmluZQkJU1hfVlBEX1VOSVFVRUlEMgkweDA2CisjZGVmaW5lCQlTWF9WUERfVU5JUVVFSUQxCTB4MDcKKyNkZWZpbmUJCVNYX1ZQRF9NQU5VX1lFQVIJMHgwOAorI2RlZmluZQkJU1hfVlBEX01BTlVfV0VFSwkweDA5CisjZGVmaW5lCQlTWF9WUERfSURFTlQJCTB4MTAKKyNkZWZpbmUJCVNYX1ZQRF9JREVOVF9TVFJJTkcJIkpFVCBIT1NUIEJZIEtFViMiCisKKy8qIFNYIHVuaXF1ZSBpZGVudGlmaWVycy4uLiAqLworI2RlZmluZQkJU1hfVU5JUVVFSURfTUFTSwkweEYwCisjZGVmaW5lCQlTWF9JU0FfVU5JUVVFSUQxCTB4MjAKKyNkZWZpbmUJCVNYX1BDSV9VTklRVUVJRDEJMHg1MAorCisvKiBTWF9DT05GSUcgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJCVNYX0NPTkZfQlVTRU4JCTB4MDIJCS8qIEVuYWJsZSBUMjI1IG1lbW9yeSBhbmQgSS9PICovCisjZGVmaW5lCQlTWF9DT05GX0hPU1RJUlEJCTB4MDQJCS8qIEVuYWJsZSBib2FyZCB0byBob3N0IGludGVycnVwdCAqLworCisvKiBTWCBib290c3RyYXAuLi4gKi8KKyNkZWZpbmUJCVNYX0JPT1RTVFJBUAkJIlx4MjhceDIwXHgyMVx4MDJceDYwXHgwYSIKKyNkZWZpbmUJCVNYX0JPT1RTVFJBUF9TSVpFCTYKKyNkZWZpbmUJCVNYX0JPT1RTVFJBUF9BRERSCSgweDgwMDAtU1hfQk9PVFNUUkFQX1NJWkUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgRUlTQSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUJCVNJMl9FSVNBX09GRgkgCTB4NDIKKyNkZWZpbmUJCVNJMl9FSVNBX1ZBTAkgCTB4MDEKKyNkZWZpbmUJCVNJMl9FSVNBX1dJTkRPV19MRU4gICAgIDB4MTAwMDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUENJICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogR2VuZXJhbCBkZWZpbml0aW9ucy4uLiAqLworCisjZGVmaW5lCQlTUFhfVkVORE9SX0lECQkweDExQ0IJCS8qIEFzc2lnbmVkIGJ5IHRoZSBQQ0kgU0lHICovCisjZGVmaW5lCQlTUFhfREVWSUNFX0lECQkweDQwMDAJCS8qIFNJL1hJTyBib2FyZHMgKi8KKyNkZWZpbmUJCVNQWF9QTFhERVZJQ0VfSUQJMHgyMDAwCQkvKiBTWCBib2FyZHMgKi8KKworI2RlZmluZQkJU1BYX1NVQl9WRU5ET1JfSUQJU1BYX1ZFTkRPUl9JRAkvKiBTYW1lIGFzIHZlbmRvciBpZCAqLworI2RlZmluZQkJU0kyX1NVQl9TWVNfSUQJCTB4NDAwCQkvKiBQaGFzZSAyIChaMjgwKSBib2FyZCAqLworI2RlZmluZQkJU1hfU1VCX1NZU19JRAkJMHgyMDAJCS8qIFBoYXNlIDMgKHQyMjUpIGJvYXJkICovCisKKyNlbmRpZgkJCQkJCS8qX3N4Ym9hcmRzX2ggKi8KKworLyogRW5kIG9mIFNYQk9BUkRTLkggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeHdpbmRvdy5oIGIvZHJpdmVycy9jaGFyL3N4d2luZG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwMWI2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9zeHdpbmRvdy5oCkBAIC0wLDAgKzEsMzkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJVGl0bGUJCToJU1ggU2hhcmVkIE1lbW9yeSBXaW5kb3cgU3RydWN0dXJlCSovCisvKgkJCQkJCQkJCSovCisvKglBdXRob3IJCToJTi5QLlZhc3NhbGxvCQkJCSovCisvKgkJCQkJCQkJCSovCisvKglDcmVhdGlvbgk6CTE2dGggTWFyY2ggMTk5OAkJCQkqLworLyoJCQkJCQkJCQkqLworLyoJVmVyc2lvbgkJOgkzLjAuMAkJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUNvcHlyaWdodAk6CShjKSBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuIDE5OTgJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCURlc2NyaXB0aW9uCToJUHJvdG90eXBlcywgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMJKi8KKy8qCQkJCWRlc2NyaWJpbmcgdGhlIFNYL1NJL1hJTyBjYXJkcyBzaGFyZWQJKi8KKy8qCQkJCW1lbW9yeSB3aW5kb3cgc3RydWN0dXJlOgkJKi8KKy8qCQkJCQlTWENBUkQJCQkJKi8KKy8qCQkJCQlTWE1PRFVMRQkJCSovCisvKgkJCQkJU1hDSEFOTkVMCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhpc3RvcnkuLi4KKworMy4wLjAJMTYvMDMvOTggTlBWCUNyZWF0aW9uLiAoYmFzZWQgb24gU1RSVUNULkgpCisKKyovCisKKyNpZm5kZWYJX3N4d2luZG93X2gJCQkJLyogSWYgU1hXSU5ET1cuSCBub3QgYWxyZWFkeSBkZWZpbmVkICovCisjZGVmaW5lCV9zeHdpbmRvd19oICAgIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIENvbW1vbiBEZWZpbml0aW9ucyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZglzdHJ1Y3QJX1NYQ0FSRAkJKlBTWENBUkQ7CS8qIFNYQ0FSRCBzdHJ1Y3R1cmUgcG9pbnRlciAqLwordHlwZWRlZglzdHJ1Y3QJX1NYTU9EVUxFCSpQTU9EOwkJLyogU1hNT0RVTEUgc3RydWN0dXJlIHBvaW50ZXIgKi8KK3R5cGVkZWYJc3RydWN0CV9TWENIQU5ORUwJKlBDSEFOOwkJLyogU1hDSEFOTkVMIHN0cnVjdHVyZSBwb2ludGVyICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBTWENBUkQgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYJc3RydWN0CV9TWENBUkQKK3sKKwlCWVRFCWNjX2luaXRfc3RhdHVzOwkJCS8qIDB4MDAgSW5pdGlhbGlzYXRpb24gc3RhdHVzICovCisJQllURQljY19tZW1fc2l6ZTsJCQkvKiAweDAxIFNpemUgb2YgbWVtb3J5IG9uIGNhcmQgKi8KKwlXT1JECWNjX2ludF9jb3VudDsJCQkvKiAweDAyIEludGVycnVwdCBjb3VudCAqLworCVdPUkQJY2NfcmV2aXNpb247CQkJLyogMHgwNCBEb3dubG9hZCBjb2RlIHJldmlzaW9uICovCisJQllURQljY19pc3JfY291bnQ7CQkJLyogMHgwNiBDb3VudCB3aGVuIElTUiBpcyBydW4gKi8KKwlCWVRFCWNjX21haW5fY291bnQ7CQkJLyogMHgwNyBDb3VudCB3aGVuIG1haW4gbG9vcCBpcyBydW4gKi8KKwlXT1JECWNjX2ludF9wZW5kaW5nOwkJCS8qIDB4MDggSW50ZXJydXB0IHBlbmRpbmcgKi8KKwlXT1JECWNjX3BvbGxfY291bnQ7CQkJLyogMHgwQSBDb3VudCB3aGVuIHBvbGwgaXMgcnVuICovCisJQllURQljY19pbnRfc2V0X2NvdW50OwkJLyogMHgwQyBDb3VudCB3aGVuIGhvc3QgaW50ZXJydXB0IGlzIHNldCAqLworCUJZVEUJY2NfcmZ1WzB4ODAgLSAweDBEXTsJCS8qIDB4MEQgUGFkIHN0cnVjdHVyZSB0byAxMjggYnl0ZXMgKDB4ODApICovCisKK30gU1hDQVJEOworCisvKiBTWENBUkQuY2NfaW5pdF9zdGF0dXMgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUgCUFEQVBURVJTX0ZPVU5ECQkoQllURSkweDAxCisjZGVmaW5lIAlOT19BREFQVEVSU19GT1VORAkoQllURSkweEZGCisKKy8qIFNYQ0FSRC5jY19tZW1fc2l6ZSBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZSAJU1hfTUVNT1JZX1NJWkUJCShCWVRFKTB4NDAKKworLyogU1hDQVJELmNjX2ludF9jb3VudCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZSAJSU5UX0NPVU5UX0RFRkFVTFQJMTAwCS8qIEh6ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFNYTU9EVUxFICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUJVE9QX1BPSU5URVIoYSkJCSgoYSl8MHg4MDAwKQkvKiBTZXRzIHRvcCBiaXQgb2Ygd29yZCAqLworI2RlZmluZSBVTlRPUF9QT0lOVEVSKGEpCSgoYSkmfjB4ODAwMCkJLyogQ2xlYXJzIHRvcCBiaXQgb2Ygd29yZCAqLworCit0eXBlZGVmCXN0cnVjdAlfU1hNT0RVTEUKK3sKKwlXT1JECW1jX25leHQ7CQkJLyogMHgwMCBOZXh0IG1vZHVsZSAicG9pbnRlciIgKE9SZWQgd2l0aCAweDgwMDApICovCisJQllURQltY190eXBlOwkJCS8qIDB4MDIgVHlwZSBvZiBUQSBpbiB0ZXJtcyBvZiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKwlCWVRFCW1jX21vZF9ubzsJCQkvKiAweDAzIE1vZHVsZSBudW1iZXIgb24gU0kgYnVzIGNhYmxlICgwIGNsb3Nlc3QgdG8gY2FyZCkgKi8KKwlCWVRFCW1jX2R0cjsJCQkJLyogMHgwNCBQcml2YXRlIERUUiBjb3B5IChUQSBvbmx5KSAqLworCUJZVEUJbWNfcmZ1MTsJCQkvKiAweDA1IFJlc2VydmVkICovCisJV09SRAltY191YXJ0OwkJCS8qIDB4MDYgVUFSVCBiYXNlIGFkZHJlc3MgZm9yIHRoaXMgbW9kdWxlICovCisJQllURQltY19jaGlwOwkJCS8qIDB4MDggQ2hpcCB0eXBlIC8gbnVtYmVyIG9mIHBvcnRzICovCisJQllURQltY19jdXJyZW50X3VhcnQ7CQkvKiAweDA5IEN1cnJlbnQgdWFydCBzZWxlY3RlZCBmb3IgdGhpcyBtb2R1bGUgKi8KKyNpZmRlZglET1dOTE9BRAorCVBDSEFOCW1jX2NoYW5fcG9pbnRlcls4XTsJCS8qIDB4MEEgUG9pbnRlciB0byBlYWNoIGNoYW5uZWwgc3RydWN0dXJlICovCisjZWxzZQorCVdPUkQJbWNfY2hhbl9wb2ludGVyWzhdOwkJLyogMHgwQSBEZWZpbmUgYXMgV09SRCBpZiBub3QgY29tcGlsaW5nIGludG8gZG93bmxvYWQgKi8KKyNlbmRpZgorCVdPUkQJbWNfcmZ1MjsJCQkvKiAweDFBIFJlc2VydmVkICovCisJQllURQltY19vcGVuczE7CQkJLyogMHgxQyBOdW1iZXIgb2Ygb3BlbiBwb3J0cyBvbiBmaXJzdCBmb3VyIHBvcnRzIG9uIE1UQS9TWERDICovCisJQllURQltY19vcGVuczI7CQkJLyogMHgxRCBOdW1iZXIgb2Ygb3BlbiBwb3J0cyBvbiBzZWNvbmQgZm91ciBwb3J0cyBvbiBNVEEvU1hEQyAqLworCUJZVEUJbWNfbW9kczsJCQkvKiAweDFFIFR5cGVzIG9mIGNvbm5lY3RvciBtb2R1bGUgYXR0YWNoZWQgdG8gTVRBL1NYREMgKi8KKwlCWVRFCW1jX3JldjE7CQkJLyogMHgxRiBSZXZpc2lvbiBvZiBmaXJzdCBDRDE0MDAgb24gTVRBL1NYREMgKi8KKwlCWVRFCW1jX3JldjI7CQkJLyogMHgyMCBSZXZpc2lvbiBvZiBzZWNvbmQgQ0QxNDAwIG9uIE1UQS9TWERDICovCisJQllURQltY19tdGFhc2ljX3JldjsJCQkvKiAweDIxIFJldmlzaW9uIG9mIE1UQSBBU0lDIDEuLjQgLT4gQSwgQiwgQywgRCAqLworCUJZVEUJbWNfcmZ1M1sweDEwMCAtIDB4MjJdOwkJLyogMHgyMiBQYWQgc3RydWN0dXJlIHRvIDI1NiBieXRlcyAoMHgxMDApICovCisKK30gU1hNT0RVTEU7CisKKy8qIFNYTU9EVUxFLm1jX3R5cGUgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJCUZPVVJfUE9SVFMJKEJZVEUpNAorI2RlZmluZSAJRUlHSFRfUE9SVFMJKEJZVEUpOAorCisvKiBTWE1PRFVMRS5tY19jaGlwIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lIAlDSElQX01BU0sJMHhGMAorI2RlZmluZQkJVEEJCShCWVRFKTAKKyNkZWZpbmUgCVRBNAkJKFRBIHwgRk9VUl9QT1JUUykKKyNkZWZpbmUgCVRBOAkJKFRBIHwgRUlHSFRfUE9SVFMpCisjZGVmaW5lCQlUQTRfQVNJQwkoQllURSkweDBBCisjZGVmaW5lCQlUQThfQVNJQwkoQllURSkweDBCCisjZGVmaW5lIAlNVEFfQ0QxNDAwCShCWVRFKTB4MjgKKyNkZWZpbmUgCVNYREMJCShCWVRFKTB4NDgKKworLyogU1hNT0RVTEUubWNfbW9kcyBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQkJTU9EX1JTMjMyREIyNQkweDAwCQkvKiBSUzIzMiBEQjI1IChzb2NrZXQvcGx1ZykgKi8KKyNkZWZpbmUJCU1PRF9SUzIzMlJKNDUJMHgwMQkJLyogUlMyMzIgUko0NSAoc2hpZWxkZWQvb3B0by1pc29sYXRlZCkgKi8KKyNkZWZpbmUJCU1PRF9SRVNFUlZFRF8yCTB4MDIJCS8qIFJlc2VydmVkIChSUzQ4NSkgKi8KKyNkZWZpbmUJCU1PRF9SUzQyMkRCMjUJMHgwMwkJLyogUlM0MjIgREIyNSBTb2NrZXQgKi8KKyNkZWZpbmUJCU1PRF9SRVNFUlZFRF80CTB4MDQJCS8qIFJlc2VydmVkICovCisjZGVmaW5lCQlNT0RfUEFSQUxMRUwJMHgwNQkJLyogUGFyYWxsZWwgKi8KKyNkZWZpbmUJCU1PRF9SRVNFUlZFRF82CTB4MDYJCS8qIFJlc2VydmVkIChSUzQyMykgKi8KKyNkZWZpbmUJCU1PRF9SRVNFUlZFRF83CTB4MDcJCS8qIFJlc2VydmVkICovCisjZGVmaW5lCQlNT0RfMl9SUzIzMkRCMjUJMHgwOAkJLyogUmV2IDIuMCBSUzIzMiBEQjI1IChzb2NrZXQvcGx1ZykgKi8KKyNkZWZpbmUJCU1PRF8yX1JTMjMyUko0NQkweDA5CQkvKiBSZXYgMi4wIFJTMjMyIFJKNDUgKi8KKyNkZWZpbmUJCU1PRF9SRVNFUlZFRF9BCTB4MEEJCS8qIFJldiAyLjAgUmVzZXJ2ZWQgKi8KKyNkZWZpbmUJCU1PRF8yX1JTNDIyREIyNQkweDBCCQkvKiBSZXYgMi4wIFJTNDIyIERCMjUgKi8KKyNkZWZpbmUJCU1PRF9SRVNFUlZFRF9DCTB4MEMJCS8qIFJldiAyLjAgUmVzZXJ2ZWQgKi8KKyNkZWZpbmUJCU1PRF8yX1BBUkFMTEVMCTB4MEQJCS8qIFJldiAyLjAgUGFyYWxsZWwgKi8KKyNkZWZpbmUJCU1PRF9SRVNFUlZFRF9FCTB4MEUJCS8qIFJldiAyLjAgUmVzZXJ2ZWQgKi8KKyNkZWZpbmUJCU1PRF9CTEFOSwkweDBGCQkvKiBCbGFuayBQYW5lbCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBTWENIQU5ORUwgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCQlUWF9CVUZGX09GRlNFVAkJMHg2MAkvKiBUcmFuc21pdCBidWZmZXIgb2Zmc2V0IGluIGNoYW5uZWwgc3RydWN0dXJlICovCisjZGVmaW5lCQlCVUZGX1BPSU5URVIoYSkJCSgoKGEpK1RYX0JVRkZfT0ZGU0VUKXwweDgwMDApCisjZGVmaW5lCQlVTkJVRkZfUE9JTlRFUihhKQkoamV0X2NoYW5uZWwqKSgoKGEpJn4weDgwMDApLVRYX0JVRkZfT0ZGU0VUKSAKKyNkZWZpbmUgCUJVRkZFUl9TSVpFCQkyNTYKKyNkZWZpbmUgCUhJR0hfV0FURVIJCSgoQlVGRkVSX1NJWkUgLyA0KSAqIDMpCisjZGVmaW5lIAlMT1dfV0FURVIJCShCVUZGRVJfU0laRSAvIDQpCisKK3R5cGVkZWYJc3RydWN0CV9TWENIQU5ORUwKK3sKKwlXT1JECW5leHRfaXRlbTsJCQkvKiAweDAwIE9mZnNldCBmcm9tIHdpbmRvdyBiYXNlIG9mIG5leHQgY2hhbm5lbHMgaGlfdHhidWYgKE9ScmVkIHdpdGggMHg4MDAwKSAqLworCVdPUkQgCWFkZHJfdWFydDsJCQkvKiAweDAyIElOVEVSTkFMIHBvaW50ZXIgdG8gdWFydCBhZGRyZXNzLiBJbmNsdWRlcyBGQVNUUEFUSCBiaXQgKi8KKwlXT1JECW1vZHVsZTsJCQkJLyogMHgwNCBPZmZzZXQgZnJvbSB3aW5kb3cgYmFzZSBvZiBwYXJlbnQgU1hNT0RVTEUgc3RydWN0dXJlICovCisJQllURSAJdHlwZTsJCQkJLyogMHgwNiBDaGlwIHR5cGUgLyBudW1iZXIgb2YgcG9ydHMgKGNvcHkgb2YgbWNfY2hpcCkgKi8KKwlCWVRFCWNoYW5fbnVtYmVyOwkJCS8qIDB4MDcgQ2hhbm5lbCBudW1iZXIgb24gdGhlIFRBL01UQS9TWERDICovCisJV09SRAl4Y19zdGF0dXM7CQkJLyogMHgwOCBGbG93IGNvbnRyb2wgYW5kIEkvTyBzdGF0dXMgKi8KKwlCWVRFCWhpX3J4aXBvczsJCQkvKiAweDBBIFJlY2VpdmUgYnVmZmVyIGlucHV0IGluZGV4ICovCisJQllURQloaV9yeG9wb3M7CQkJLyogMHgwQiBSZWNlaXZlIGJ1ZmZlciBvdXRwdXQgaW5kZXggKi8KKwlCWVRFCWhpX3R4b3BvczsJCQkvKiAweDBDIFRyYW5zbWl0IGJ1ZmZlciBvdXRwdXQgaW5kZXggKi8KKwlCWVRFCWhpX3R4aXBvczsJCQkvKiAweDBEIFRyYW5zbWl0IGJ1ZmZlciBpbnB1dCBpbmRleCAqLworCUJZVEUJaGlfaHN0YXQ7CQkJLyogMHgwRSBDb21tYW5kIHJlZ2lzdGVyICovCisJQllURQlkdHJfYml0OwkJCS8qIDB4MEYgSU5URVJOQUwgRFRSIGNvbnRyb2wgYnl0ZSAoVEEgb25seSkgKi8KKwlCWVRFCXR4b247CQkJCS8qIDB4MTAgSU5URVJOQUwgY29weSBvZiBoaV90eG9uICovCisJQllURQl0eG9mZjsJCQkJLyogMHgxMSBJTlRFUk5BTCBjb3B5IG9mIGhpX3R4b2ZmICovCisJQllURQlyeG9uOwkJCQkvKiAweDEyIElOVEVSTkFMIGNvcHkgb2YgaGlfcnhvbiAqLworCUJZVEUJcnhvZmY7CQkJCS8qIDB4MTMgSU5URVJOQUwgY29weSBvZiBoaV9yeG9mZiAqLworCUJZVEUJaGlfbXIxOwkJCQkvKiAweDE0IE1vZGUgUmVnaXN0ZXIgMSAoZGF0YWJpdHMscGFyaXR5LFJUUyByeCBmbG93KSovCisJQllURQloaV9tcjI7CQkJCS8qIDB4MTUgTW9kZSBSZWdpc3RlciAyIChzdG9wYml0cyxsb2NhbCxDVFMgdHggZmxvdykqLworCUJZVEUJaGlfY3NyOwkJCQkvKiAweDE2IENsb2NrIFNlbGVjdCBSZWdpc3RlciAoYmF1ZCByYXRlKSAqLworCUJZVEUJaGlfb3A7CQkJCS8qIDB4MTcgTW9kZW0gT3V0cHV0IFNpZ25hbCAqLworCUJZVEUJaGlfaXA7CQkJCS8qIDB4MTggTW9kZW0gSW5wdXQgU2lnbmFsICovCisJQllURQloaV9zdGF0ZTsJCQkvKiAweDE5IENoYW5uZWwgc3RhdHVzICovCisJQllURQloaV9wcnRjbDsJCQkvKiAweDFBIENoYW5uZWwgcHJvdG9jb2wgKGZsb3cgY29udHJvbCkgKi8KKwlCWVRFCWhpX3R4b247CQkJLyogMHgxQiBUcmFuc21pdCBYT04gY2hhcmFjdGVyICovCisJQllURQloaV90eG9mZjsJCQkvKiAweDFDIFRyYW5zbWl0IFhPRkYgY2hhcmFjdGVyICovCisJQllURQloaV9yeG9uOwkJCS8qIDB4MUQgUmVjZWl2ZSBYT04gY2hhcmFjdGVyICovCisJQllURQloaV9yeG9mZjsJCQkvKiAweDFFIFJlY2VpdmUgWE9GRiBjaGFyYWN0ZXIgKi8KKwlCWVRFCWNsb3NlX3ByZXY7CQkJLyogMHgxRiBJTlRFUk5BTCBjaGFubmVsIHByZXZpb3VzbHkgY2xvc2VkIGZsYWcgKi8KKwlCWVRFCWhpX2JyZWFrOwkJCS8qIDB4MjAgQnJlYWsgYW5kIGVycm9yIGNvbnRyb2wgKi8KKwlCWVRFCWJyZWFrX3N0YXRlOwkJCS8qIDB4MjEgSU5URVJOQUwgY29weSBvZiBoaV9icmVhayAqLworCUJZVEUJaGlfbWFzazsJCQkvKiAweDIyIE1hc2sgZm9yIHJlY2VpdmVkIGRhdGEgKi8KKwlCWVRFCW1hc2s7CQkJCS8qIDB4MjMgSU5URVJOQUwgY29weSBvZiBoaV9tYXNrICovCisJQllURQltb2RfdHlwZTsJCQkvKiAweDI0IE1UQS9TWERDIGhhcmR3YXJlIG1vZHVsZSB0eXBlICovCisJQllURQljY3Jfc3RhdGU7CQkJLyogMHgyNSBJTlRFUk5BTCBNVEEvU1hEQyBzdGF0ZSBvZiBDQ1IgcmVnaXN0ZXIgKi8KKwlCWVRFCWlwX21hc2s7CQkJLyogMHgyNiBJbnB1dCBoYW5kc2hha2UgbWFzayAqLworCUJZVEUJaGlfcGFyYWxsZWw7CQkJLyogMHgyNyBQYXJhbGxlbCBwb3J0IGZsYWcgKi8KKwlCWVRFCXBhcl9lcnJvcjsJCQkvKiAweDI4IEVycm9yIGNvZGUgZm9yIHBhcmFsbGVsIGxvb3BiYWNrIHRlc3QgKi8KKwlCWVRFCWFueV9zZW50OwkJCS8qIDB4MjkgSU5URVJOQUwgZGF0YSBzZW50IGZsYWcgKi8KKwlCWVRFCWFzaWNfdHhmaWZvX3NpemU7CQkvKiAweDJBIElOVEVSTkFMIFNYREMgdHJhbnNtaXQgRklGTyBzaXplICovCisJQllURQlyZnUxWzJdOwkJCS8qIDB4MkIgUmVzZXJ2ZWQgKi8KKwlCWVRFCWNzcjsJCQkJLyogMHgyRCBJTlRFUk5BTCBjb3B5IG9mIGhpX2NzciAqLworI2lmZGVmCURPV05MT0FECisJUENIQU4JbmV4dHA7CQkJCS8qIDB4MkUgT2Zmc2V0IGZyb20gd2luZG93IGJhc2Ugb2YgbmV4dCBjaGFubmVsIHN0cnVjdHVyZSAqLworI2Vsc2UKKwlXT1JECW5leHRwOwkJCQkvKiAweDJFIERlZmluZSBhcyBXT1JEIGlmIG5vdCBjb21waWxpbmcgaW50byBkb3dubG9hZCAqLworI2VuZGlmCisJQllURQlwcnRjbDsJCQkJLyogMHgzMCBJTlRFUk5BTCBjb3B5IG9mIGhpX3BydGNsICovCisJQllURQltcjE7CQkJCS8qIDB4MzEgSU5URVJOQUwgY29weSBvZiBoaV9tcjEgKi8KKwlCWVRFCW1yMjsJCQkJLyogMHgzMiBJTlRFUk5BTCBjb3B5IG9mIGhpX21yMiAqLworCUJZVEUJaGlfdHhiYXVkOwkJCS8qIDB4MzMgRXh0ZW5kZWQgdHJhbnNtaXQgYmF1ZCByYXRlIChTWERDIG9ubHkgaWYoKGhpX2NzciYweDBGKT09MHgwRikgKi8KKwlCWVRFCWhpX3J4YmF1ZDsJCQkvKiAweDM0IEV4dGVuZGVkIHJlY2VpdmUgYmF1ZCByYXRlICAoU1hEQyBvbmx5IGlmKChoaV9jc3ImMHhGMCk9PTB4RjApICovCisJQllURQl0eGJyZWFrX3N0YXRlOwkJCS8qIDB4MzUgSU5URVJOQUwgTVRBL1NYREMgdHJhbnNtaXQgYnJlYWsgc3RhdGUgKi8KKwlCWVRFCXR4YmF1ZDsJCQkJLyogMHgzNiBJTlRFUk5BTCBjb3B5IG9mIGhpX3R4YmF1ZCAqLworCUJZVEUJcnhiYXVkOwkJCQkvKiAweDM3IElOVEVSTkFMIGNvcHkgb2YgaGlfcnhiYXVkICovCisJV09SRAllcnJfZnJhbWluZzsJCQkvKiAweDM4IENvdW50IG9mIHJlY2VpdmUgZnJhbWluZyBlcnJvcnMgKi8KKwlXT1JECWVycl9wYXJpdHk7CQkJLyogMHgzQSBDb3VudCBvZiByZWNlaXZlIHBhcml0eSBlcnJvcnMgKi8KKwlXT1JECWVycl9vdmVycnVuOwkJCS8qIDB4M0MgQ291bnQgb2YgcmVjZWl2ZSBvdmVycnVuIGVycm9ycyAqLworCVdPUkQJZXJyX292ZXJmbG93OwkJCS8qIDB4M0UgQ291bnQgb2YgcmVjZWl2ZSBidWZmZXIgb3ZlcmZsb3cgZXJyb3JzICovCisJQllURQlyZnUyW1RYX0JVRkZfT0ZGU0VUIC0gMHg0MF07CS8qIDB4NDAgUmVzZXJ2ZWQgdW50aWwgaGlfdHhidWYgKi8KKwlCWVRFCWhpX3R4YnVmW0JVRkZFUl9TSVpFXTsJCS8qIDB4MDYwIFRyYW5zbWl0IGJ1ZmZlciAqLworCUJZVEUJaGlfcnhidWZbQlVGRkVSX1NJWkVdOwkJLyogMHgxNjAgUmVjZWl2ZSBidWZmZXIgKi8KKwlCWVRFCXJmdTNbMHgzMDAgLSAweDI2MF07CQkvKiAweDI2MCBSZXNlcnZlZCB1bnRpbCA3NjggYnl0ZXMgKDB4MzAwKSAqLworCit9IFNYQ0hBTk5FTDsKKworLyogU1hDSEFOTkVMLmFkZHJfdWFydCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQkJRkFTVFBBVEgJMHgxMDAwCQkvKiBTZXQgdG8gaW5kaWNhdGUgZmFzdCByeC90eCBwcm9jZXNzaW5nIChUQSBvbmx5KSAqLworCisvKiBTWENIQU5ORUwueGNfc3RhdHVzIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlYX1RBTlkJCTB4MDAwMQkJLyogWE9OIGlzIGFueSBjaGFyYWN0ZXIgKFRBIG9ubHkpICovCisjZGVmaW5lCQlYX1RJT04JCTB4MDAwMQkJLyogVHggaW50ZXJydXB0cyBvbiAoTVRBIG9ubHkpICovCisjZGVmaW5lCQlYX1RYRU4JCTB4MDAwMgkJLyogVHggWE9OL1hPRkYgZW5hYmxlZCAoVEEgb25seSkgKi8KKyNkZWZpbmUJCVhfUlRTRU4JCTB4MDAwMgkJLyogUlRTIEZMT1cgZW5hYmxlZCAoTVRBIG9ubHkpICovCisjZGVmaW5lCQlYX1RYUkMJCTB4MDAwNAkJLyogWE9GRiByZWNlaXZlZCAoVEEgb25seSkgKi8KKyNkZWZpbmUJCVhfUlRTTE9XCTB4MDAwNAkJLyogUlRTIGRyb3BwZWQgKE1UQSBvbmx5KSAqLworI2RlZmluZQkJWF9SWEVOCQkweDAwMDgJCS8qIFJ4IFhPTi9YT0ZGIGVuYWJsZWQgKi8KKyNkZWZpbmUJCVhfQU5ZWE8JCTB4MDAxMAkJLyogWE9GRiBwZW5kaW5nL3NlbnQgb3IgUlRTIGRyb3BwZWQgKi8KKyNkZWZpbmUJCVhfUlhTRQkJMHgwMDIwCQkvKiBSeCBYT0ZGIHNlbnQgKi8KKyNkZWZpbmUJCVhfTlBFTkQJCTB4MDA0MAkJLyogUnggWE9OIHBlbmRpbmcgb3IgWE9GRiBwZW5kaW5nICovCisjZGVmaW5lCQlYX0ZQRU5ECQkweDAwODAJCS8qIFJ4IFhPRkYgcGVuZGluZyAqLworI2RlZmluZQkJQ19DUlNFCQkweDAxMDAJCS8qIENhcnJpYWdlIHJldHVybiBzZW50IChUQSBvbmx5KSAqLworI2RlZmluZQkJQ19URU1SCQkweDAxMDAJCS8qIFR4IGVtcHR5IHJlcXVlc3RlZCAoTVRBIG9ubHkpICovCisjZGVmaW5lCQlDX1RFTUEJCTB4MDIwMAkJLyogVHggZW1wdHkgYWNrZWQgKE1UQSBvbmx5KSAqLworI2RlZmluZQkJQ19BTllQCQkweDAyMDAJCS8qIEFueSBwcm90b2NvbCBiYXIgdHggWE9OL1hPRkYgKFRBIG9ubHkpICovCisjZGVmaW5lCQlDX0VOCQkweDA0MDAJCS8qIENvb2tpbmcgZW5hYmxlZCAob24gTVRBIG1lYW5zIHBvcnQgaXMgYWxzbyB8fCAqLworI2RlZmluZQkJQ19ISUdICQkweDA4MDAJCS8qIEJ1ZmZlciBwcmV2aW91c2x5IGhpdCBoaWdoIHdhdGVyICovCisjZGVmaW5lCQlDX0NUU0VOCQkweDEwMDAJCS8qIENUUyBhdXRvbWF0aWMgZmxvdy1jb250cm9sIGVuYWJsZWQgKi8KKyNkZWZpbmUJCUNfRENERU4JCTB4MjAwMAkJLyogRENEL0RUUiBjaGVja2luZyBlbmFibGVkICovCisjZGVmaW5lCQlDX0JSRUFLCQkweDQwMDAJCS8qIEJyZWFrIGRldGVjdGVkICovCisjZGVmaW5lCQlDX1JUU0VOCQkweDgwMDAJCS8qIFJUUyBhdXRvbWF0aWMgZmxvdyBjb250cm9sIGVuYWJsZWQgKE1UQSBvbmx5KSAqLworI2RlZmluZQkJQ19QQVJJVFkJMHg4MDAwCQkvKiBQYXJpdHkgY2hlY2tpbmcgZW5hYmxlZCAoVEEgb25seSkgKi8KKworLyogU1hDSEFOTkVMLmhpX2hzdGF0IGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlIU19JRExFX09QRU4JMHgwMAkJLyogQ2hhbm5lbCBvcGVuIHN0YXRlICovCisjZGVmaW5lCQlIU19MT1BFTgkweDAyCQkvKiBMb2NhbCBvcGVuIGNvbW1hbmQgKG5vIG1vZGVtIG1vbml0b3JpbmcpICovCisjZGVmaW5lCQlIU19NT1BFTgkweDA0CQkvKiBNb2RlbSBvcGVuIGNvbW1hbmQgKHdhaXQgZm9yIERDRCBzaWduYWwpICovCisjZGVmaW5lCQlIU19JRExFX01QRU5ECTB4MDYJCS8qIFdhaXRpbmcgZm9yIERDRCBzaWduYWwgc3RhdGUgKi8KKyNkZWZpbmUJCUhTX0NPTkZJRwkweDA4CQkvKiBDb25maWd1cmF0aW9uIGNvbW1hbmQgKi8KKyNkZWZpbmUJCUhTX0NMT1NFCTB4MEEJCS8qIENsb3NlIGNvbW1hbmQgKi8KKyNkZWZpbmUJCUhTX1NUQVJUCTB4MEMJCS8qIFN0YXJ0IHRyYW5zbWl0IGJyZWFrIGNvbW1hbmQgKi8KKyNkZWZpbmUJCUhTX1NUT1AJCTB4MEUJCS8qIFN0b3AgdHJhbnNtaXQgYnJlYWsgY29tbWFuZCAqLworI2RlZmluZQkJSFNfSURMRV9DTE9TRUQJMHgxMAkJLyogQ2xvc2VkIGNoYW5uZWwgc3RhdGUgKi8KKyNkZWZpbmUJCUhTX0lETEVfQlJFQUsJMHgxMgkJLyogVHJhbnNtaXQgYnJlYWsgc3RhdGUgKi8KKyNkZWZpbmUJCUhTX0ZPUkNFX0NMT1NFRAkweDE0CQkvKiBGb3JjZSBjbG9zZSBjb21tYW5kICovCisjZGVmaW5lCQlIU19SRVNVTUUJMHgxNgkJLyogQ2xlYXIgcGVuZGluZyBYT0ZGIGNvbW1hbmQgKi8KKyNkZWZpbmUJCUhTX1dGTFVTSAkweDE4CQkvKiBGbHVzaCB0cmFuc21pdCBidWZmZXIgY29tbWFuZCAqLworI2RlZmluZQkJSFNfUkZMVVNICTB4MUEJCS8qIEZsdXNoIHJlY2VpdmUgYnVmZmVyIGNvbW1hbmQgKi8KKyNkZWZpbmUJCUhTX1NVU1BFTkQJMHgxQwkJLyogU3VzcGVuZCBvdXRwdXQgY29tbWFuZCAobGlrZSBYT0ZGIHJlY2VpdmVkKSAqLworI2RlZmluZQkJUEFSQUxMRUwJMHgxRQkJLyogUGFyYWxsZWwgcG9ydCBsb29wYmFjayB0ZXN0IGNvbW1hbmQgKERpYWdub3N0aWNzIE9ubHkpICovCisjZGVmaW5lCQlFTkFCTEVfUlhfSU5UUwkweDIwCQkvKiBFbmFibGUgcmVjZWl2ZSBpbnRlcnJ1cHRzIGNvbW1hbmQgKERpYWdub3N0aWNzIE9ubHkpICovCisjZGVmaW5lCQlFTkFCTEVfVFhfSU5UUwkweDIyCQkvKiBFbmFibGUgdHJhbnNtaXQgaW50ZXJydXB0cyBjb21tYW5kIChEaWFnbm9zdGljcyBPbmx5KSAqLworI2RlZmluZQkJRU5BQkxFX01ETV9JTlRTCTB4MjQJCS8qIEVuYWJsZSBtb2RlbSBpbnRlcnJ1cHRzIGNvbW1hbmQgKERpYWdub3N0aWNzIE9ubHkpICovCisjZGVmaW5lCQlESVNBQkxFX0lOVFMJMHgyNgkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGNvbW1hbmQgKERpYWdub3N0aWNzIE9ubHkpICovCisKKy8qIFNYQ0hBTk5FTC5oaV9tcjEgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJCU1SMV9CSVRTCTB4MDMJCS8qIERhdGEgYml0cyBtYXNrICovCisjZGVmaW5lCQlNUjFfNV9CSVRTCTB4MDAJCS8qIDUgZGF0YSBiaXRzICovCisjZGVmaW5lCQlNUjFfNl9CSVRTCTB4MDEJCS8qIDYgZGF0YSBiaXRzICovCisjZGVmaW5lCQlNUjFfN19CSVRTCTB4MDIJCS8qIDcgZGF0YSBiaXRzICovCisjZGVmaW5lCQlNUjFfOF9CSVRTCTB4MDMJCS8qIDggZGF0YSBiaXRzICovCisjZGVmaW5lCQlNUjFfUEFSSVRZCTB4MUMJCS8qIFBhcml0eSBtYXNrICovCisjZGVmaW5lCQlNUjFfT0RECQkweDA0CQkvKiBPZGQgcGFyaXR5ICovCisjZGVmaW5lCQlNUjFfRVZFTgkweDAwCQkvKiBFdmVuIHBhcml0eSAqLworI2RlZmluZQkJTVIxX1dJVEgJMHgwMAkJLyogUGFyaXR5IGVuYWJsZWQgKi8KKyNkZWZpbmUJCU1SMV9GT1JDRQkweDA4CQkvKiBGb3JjZSBwYXJpdHkgKi8KKyNkZWZpbmUJCU1SMV9OT05FCTB4MTAJCS8qIE5vIHBhcml0eSAqLworI2RlZmluZQkJTVIxX05PUEFSSVRZCU1SMV9OT05FCQkvKiBObyBwYXJpdHkgKi8KKyNkZWZpbmUJCU1SMV9PRERQQVJJVFkJKE1SMV9XSVRIfE1SMV9PREQpCS8qIE9kZCBwYXJpdHkgKi8KKyNkZWZpbmUJCU1SMV9FVkVOUEFSSVRZCShNUjFfV0lUSHxNUjFfRVZFTikJLyogRXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUJCU1SMV9NQVJLUEFSSVRZCShNUjFfRk9SQ0V8TVIxX09ERCkJLyogTWFyayBwYXJpdHkgKi8KKyNkZWZpbmUJCU1SMV9TUEFDRVBBUklUWQkoTVIxX0ZPUkNFfE1SMV9FVkVOKQkvKiBTcGFjZSBwYXJpdHkgKi8KKyNkZWZpbmUJCU1SMV9SVFNfUlhGTE9XCTB4ODAJCS8qIFJUUyByZWNlaXZlIGZsb3cgY29udHJvbCAqLworCisvKiBTWENIQU5ORUwuaGlfbXIyIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlNUjJfU1RPUAkweDBGCQkvKiBTdG9wIGJpdHMgbWFzayAqLworI2RlZmluZQkJTVIyXzFfU1RPUAkweDA3CQkvKiAxIHN0b3AgYml0ICovCisjZGVmaW5lCQlNUjJfMl9TVE9QCTB4MEYJCS8qIDIgc3RvcCBiaXRzICovCisjZGVmaW5lCQlNUjJfQ1RTX1RYRkxPVwkweDEwCQkvKiBDVFMgdHJhbnNtaXQgZmxvdyBjb250cm9sICovCisjZGVmaW5lCQlNUjJfUlRTX1RPR0dMRQkweDIwCQkvKiBSVFMgdG9nZ2xlIG9uIHRyYW5zbWl0ICovCisjZGVmaW5lCQlNUjJfTk9STUFMCTB4MDAJCS8qIE5vcm1hbCBtb2RlICovCisjZGVmaW5lCQlNUjJfQVVUTwkweDQwCQkvKiBBdXRvLWVjaG8gbW9kZSAoVEEgb25seSkgKi8KKyNkZWZpbmUJCU1SMl9MT0NBTAkweDgwCQkvKiBMb2NhbCBlY2hvIG1vZGUgKi8KKyNkZWZpbmUJCU1SMl9SRU1PVEUJMHhDMAkJLyogUmVtb3RlIGVjaG8gbW9kZSAoVEEgb25seSkgKi8KKworLyogU1hDSEFOTkVMLmhpX2NzciBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQkJQ1NSXzc1CQkweDAJCS8qICAgIDc1IGJhdWQgKi8KKyNkZWZpbmUJCUNTUl8xMTAJCTB4MQkJLyogICAxMTAgYmF1ZCAoVEEpLCAxMTUyMDAgKE1UQS9TWERDKSAqLworI2RlZmluZQkJQ1NSXzM4NDAwCTB4MgkJLyogMzg0MDAgYmF1ZCAqLworI2RlZmluZQkJQ1NSXzE1MAkJMHgzCQkvKiAgIDE1MCBiYXVkICovCisjZGVmaW5lCQlDU1JfMzAwCQkweDQJCS8qICAgMzAwIGJhdWQgKi8KKyNkZWZpbmUJCUNTUl82MDAJCTB4NQkJLyogICA2MDAgYmF1ZCAqLworI2RlZmluZQkJQ1NSXzEyMDAJMHg2CQkvKiAgMTIwMCBiYXVkICovCisjZGVmaW5lCQlDU1JfMjAwMAkweDcJCS8qICAyMDAwIGJhdWQgKi8KKyNkZWZpbmUJCUNTUl8yNDAwCTB4OAkJLyogIDI0MDAgYmF1ZCAqLworI2RlZmluZQkJQ1NSXzQ4MDAJMHg5CQkvKiAgNDgwMCBiYXVkICovCisjZGVmaW5lCQlDU1JfMTgwMAkweEEJCS8qICAxODAwIGJhdWQgKi8KKyNkZWZpbmUJCUNTUl85NjAwCTB4QgkJLyogIDk2MDAgYmF1ZCAqLworI2RlZmluZQkJQ1NSXzE5MjAwCTB4QwkJLyogMTkyMDAgYmF1ZCAqLworI2RlZmluZQkJQ1NSXzU3NjAwCTB4RAkJLyogNTc2MDAgYmF1ZCAqLworI2RlZmluZQkJQ1NSX0VYVEJBVUQJMHhGCQkvKiBFeHRlbmRlZCBiYXVkIHJhdGUgKGhpX3R4YmF1ZC9oaV9yeGJhdWQpICovCisKKy8qIFNYQ0hBTk5FTC5oaV9vcCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQkJT1BfUlRTCQkweDAxCQkvKiBSVFMgbW9kZW0gb3V0cHV0IHNpZ25hbCAqLworI2RlZmluZQkJT1BfRFRSCQkweDAyCQkvKiBEVFIgbW9kZW0gb3V0cHV0IHNpZ25hbCAqLworCisvKiBTWENIQU5ORUwuaGlfaXAgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJCUlQX0NUUwkJMHgwMgkJLyogQ1RTIG1vZGVtIGlucHV0IHNpZ25hbCAqLworI2RlZmluZQkJSVBfRENECQkweDA0CQkvKiBEQ0QgbW9kZW0gaW5wdXQgc2lnbmFsICovCisjZGVmaW5lCQlJUF9EU1IJCTB4MjAJCS8qIERUUiBtb2RlbSBpbnB1dCBzaWduYWwgKi8KKyNkZWZpbmUJCUlQX1JJCQkweDQwCQkvKiBSSSBtb2RlbSBpbnB1dCBzaWduYWwgKi8KKworLyogU1hDSEFOTkVMLmhpX3N0YXRlIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCQlTVF9CUkVBSwkweDAxCQkvKiBCcmVhayByZWNlaXZlZCAoY2xlYXIgd2l0aCBjb25maWcpICovCisjZGVmaW5lCQlTVF9EQ0QJCTB4MDIJCS8qIERDRCBzaWduYWwgY2hhbmdlZCBzdGF0ZSAqLworCisvKiBTWENIQU5ORUwuaGlfcHJ0Y2wgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJCVNQX1RBTlkJCTB4MDEJCS8qIFRyYW5zbWl0IFhPTi9YQU5ZIChpZiBTUF9UWEVOIGVuYWJsZWQpICovCisjZGVmaW5lCQlTUF9UWEVOCQkweDAyCQkvKiBUcmFuc21pdCBYT04vWE9GRiBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUJCVNQX0NFTgkJMHgwNAkJLyogQ29va2luZyBlbmFibGVkICovCisjZGVmaW5lCQlTUF9SWEVOCQkweDA4CQkvKiBSeCBYT04vWE9GRiBlbmFibGVkICovCisjZGVmaW5lCQlTUF9EQ0VOCQkweDIwCQkvKiBEQ0QgLyBEVFIgY2hlY2sgKi8KKyNkZWZpbmUJCVNQX0RUUl9SWEZMT1cJMHg0MAkJLyogRFRSIHJlY2VpdmUgZmxvdyBjb250cm9sICovCisjZGVmaW5lCQlTUF9QQUVOCQkweDgwCQkvKiBQYXJpdHkgY2hlY2tpbmcgZW5hYmxlZCAqLworCisvKiBTWENIQU5ORUwuaGlfYnJlYWsgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJCUJSX0lHTgkJMHgwMQkJLyogSWdub3JlIGFueSByZWNlaXZlZCBicmVha3MgKi8KKyNkZWZpbmUJCUJSX0lOVAkJMHgwMgkJLyogSW50ZXJydXB0IG9uIHJlY2VpdmVkIGJyZWFrICovCisjZGVmaW5lCQlCUl9QQVJNUksJMHgwNAkJLyogRW5hYmxlIHBhcm1yayBwYXJpdHkgZXJyb3IgcHJvY2Vzc2luZyAqLworI2RlZmluZQkJQlJfUEFSSUdOCTB4MDgJCS8qIElnbm9yZSBjaGFycyB3aXRoIHBhcml0eSBlcnJvcnMgKi8KKyNkZWZpbmUgCUJSX0VSUklOVAkweDgwCQkvKiBUcmVhdCBwYXJpdHkvZnJhbWluZy9vdmVycnVuIGVycm9ycyBhcyBleGNlcHRpb25zICovCisKKy8qIFNYQ0hBTk5FTC5wYXJfZXJyb3IgZGVmaW5pdGlvbnMuLiAqLworI2RlZmluZQkJRElBR19JUlFfUlgJMHgwMQkJLyogSW5kaWNhdGUgc2VyaWFsIHJlY2VpdmUgaW50ZXJydXB0IChkaWFncyBvbmx5KSAqLworI2RlZmluZQkJRElBR19JUlFfVFgJMHgwMgkJLyogSW5kaWNhdGUgc2VyaWFsIHRyYW5zbWl0IGludGVycnVwdCAoZGlhZ3Mgb25seSkgKi8KKyNkZWZpbmUJCURJQUdfSVJRX01ECTB4MDQJCS8qIEluZGljYXRlIHNlcmlhbCBtb2RlbSBpbnRlcnJ1cHQgKGRpYWdzIG9ubHkpICovCisKKy8qIFNYQ0hBTk5FTC5oaV90eGJhdWQvaGlfcnhiYXVkIGRlZmluaXRpb25zLi4uIChTWERDIG9ubHkpICovCisjZGVmaW5lCQlCQVVEXzc1CQkweDAwCQkvKiAgICAgNzUgYmF1ZCAqLworI2RlZmluZQkJQkFVRF8xMTUyMDAJMHgwMQkJLyogMTE1MjAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfMzg0MDAJMHgwMgkJLyogIDM4NDAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfMTUwCTB4MDMJCS8qICAgIDE1MCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzMwMAkweDA0CQkvKiAgICAzMDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF82MDAJMHgwNQkJLyogICAgNjAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfMTIwMAkweDA2CQkvKiAgIDEyMDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF8yMDAwCTB4MDcJCS8qICAgMjAwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzI0MDAJMHgwOAkJLyogICAyNDAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfNDgwMAkweDA5CQkvKiAgIDQ4MDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF8xODAwCTB4MEEJCS8qICAgMTgwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzk2MDAJMHgwQgkJLyogICA5NjAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfMTkyMDAJMHgwQwkJLyogIDE5MjAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfNTc2MDAJMHgwRAkJLyogIDU3NjAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfMjMwNDAwCTB4MEUJCS8qIDIzMDQwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzQ2MDgwMAkweDBGCQkvKiA0NjA4MDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF85MjE2MDAJMHgxMAkJLyogOTIxNjAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfNTAJCTB4MTEgICAgCS8qICAgICA1MCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzExMAkweDEyCQkvKiAgICAxMTAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF8xMzRfNQkweDEzCQkvKiAgMTM0LjUgYmF1ZCAqLworI2RlZmluZQkJQkFVRF8yMDAJMHgxNAkJLyogICAgMjAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfNzIwMAkweDE1CQkvKiAgIDcyMDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF81NjAwMAkweDE2CQkvKiAgNTYwMDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF82NDAwMAkweDE3CQkvKiAgNjQwMDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF83NjgwMAkweDE4CQkvKiAgNzY4MDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF8xMjgwMDAJMHgxOQkJLyogMTI4MDAwIGJhdWQgKi8KKyNkZWZpbmUJCUJBVURfMTUwMDAwCTB4MUEJCS8qIDE1MDAwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzE0NDAwCTB4MUIJCS8qICAxNDQwMCBiYXVkICovCisjZGVmaW5lCQlCQVVEXzI1NjAwMAkweDFDCQkvKiAyNTYwMDAgYmF1ZCAqLworI2RlZmluZQkJQkFVRF8yODgwMAkweDFECQkvKiAgMjg4MDAgYmF1ZCAqLworCisvKiBTWENIQU5ORUwudHhicmVha19zdGF0ZSBkZWZpbmlpb25zLi4uICovCisjZGVmaW5lCQlUWEJSRUFLX09GRgkwCQkvKiBOb3Qgc2VuZGluZyBicmVhayAqLworI2RlZmluZQkJVFhCUkVBS19TVEFSVAkxCQkvKiBCZWdpbiBzZW5kaW5nIGJyZWFrICovCisjZGVmaW5lCQlUWEJSRUFLX1NUQVJUMQkyCQkvKiBCZWdpbiBzZW5kaW5nIGJyZWFrLCBwYXJ0IDEgKi8KKyNkZWZpbmUJCVRYQlJFQUtfT04JMwkJLyogU2VuZGluZyBicmVhayAqLworI2RlZmluZQkJVFhCUkVBS19TVE9QCTQJCS8qIFN0b3Agc2VuZGluZyBicmVhayAqLworI2RlZmluZQkJVFhCUkVBS19TVE9QMQk1CQkvKiBTdG9wIHNlbmRpbmcgYnJlYWssIHBhcnQgMSAqLworCisjZW5kaWYJCQkJCQkvKiBfc3h3aW5kb3dfaCAqLworCisvKiBFbmQgb2YgU1hXSU5ET1cuSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YzhiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwpAQCAtMCwwICsxLDgyMTQgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYworICoKKyAqICRJZDogc3luY2xpbmsuYyx2IDQuMjggMjAwNC8wOC8xMSAxOTozMDowMSBwYXVsa2YgRXhwICQKKyAqCisgKiBEZXZpY2UgZHJpdmVyIGZvciBNaWNyb2dhdGUgU3luY0xpbmsgSVNBIGFuZCBQQ0kKKyAqIGhpZ2ggc3BlZWQgbXVsdGlwcm90b2NvbCBzZXJpYWwgYWRhcHRlcnMuCisgKgorICogd3JpdHRlbiBieSBQYXVsIEZ1bGdodW0gZm9yIE1pY3JvZ2F0ZSBDb3Jwb3JhdGlvbgorICogcGF1bGtmQG1pY3JvZ2F0ZS5jb20KKyAqCisgKiBNaWNyb2dhdGUgYW5kIFN5bmNMaW5rIGFyZSB0cmFkZW1hcmtzIG9mIE1pY3JvZ2F0ZSBDb3Jwb3JhdGlvbgorICoKKyAqIERlcml2ZWQgZnJvbSBzZXJpYWwuYyB3cml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28gYW5kIExpbnVzIFRvcnZhbGRzCisgKgorICogT3JpZ2luYWwgcmVsZWFzZSAwMS8xMS85OQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBwcmltYXJpbHkgaW50ZW5kZWQgZm9yIHVzZSBpbiBzeW5jaHJvbm91cworICogSERMQyBtb2RlLiBBc3luY2hyb25vdXMgbW9kZSBpcyBhbHNvIHByb3ZpZGVkLgorICoKKyAqIFdoZW4gb3BlcmF0aW5nIGluIHN5bmNocm9ub3VzIG1vZGUsIGVhY2ggY2FsbCB0byBtZ3NsX3dyaXRlKCkKKyAqIGNvbnRhaW5zIGV4YWN0bHkgb25lIGNvbXBsZXRlIEhETEMgZnJhbWUuIENhbGxpbmcgbWdzbF9wdXRfY2hhcgorICogd2lsbCBzdGFydCBhc3NlbWJsaW5nIGFuIEhETEMgZnJhbWUgdGhhdCB3aWxsIG5vdCBiZSBzZW50IHVudGlsCisgKiBtZ3NsX2ZsdXNoX2NoYXJzIG9yIG1nc2xfd3JpdGUgaXMgY2FsbGVkLgorICogCisgKiBTeW5jaHJvbm91cyByZWNlaXZlIGRhdGEgaXMgcmVwb3J0ZWQgYXMgY29tcGxldGUgZnJhbWVzLiBUbyBhY2NvbXBsaXNoCisgKiB0aGlzLCB0aGUgVFRZIGZsaXAgYnVmZmVyIGlzIGJ5cGFzc2VkICh0b28gc21hbGwgdG8gaG9sZCBsYXJnZXN0CisgKiBmcmFtZSBhbmQgbWF5IGZyYWdtZW50IGZyYW1lcykgYW5kIHRoZSBsaW5lIGRpc2NpcGxpbmUKKyAqIHJlY2VpdmUgZW50cnkgcG9pbnQgaXMgY2FsbGVkIGRpcmVjdGx5LgorICoKKyAqIFRoaXMgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCB3aXRoIGEgc2xpZ2h0bHkgbW9kaWZpZWQgcHBwLmMgZHJpdmVyCisgKiBmb3Igc3luY2hyb25vdXMgUFBQLgorICoKKyAqIDIwMDAvMDIvMTYKKyAqIEFkZGVkIGludGVyZmFjZSBmb3Igc3luY3BwcC5jIGRyaXZlciAoYW4gYWx0ZXJuYXRlIHN5bmNocm9ub3VzIFBQUAorICogaW1wbGVtZW50YXRpb24gdGhhdCBhbHNvIHN1cHBvcnRzIENpc2NvIEhETEMpLiBFYWNoIGRldmljZSBpbnN0YW5jZQorICogcmVnaXN0ZXJzIGFzIGEgdHR5IGRldmljZSBBTkQgYSBuZXR3b3JrIGRldmljZSAoaWYgZG9zeW5jcHBwIG9wdGlvbgorICogaXMgc2V0IGZvciB0aGUgZGV2aWNlKS4gVGhlIGZ1bmN0aW9uYWxpdHkgaXMgZGV0ZXJtaW5lZCBieSB3aGljaAorICogZGV2aWNlIGludGVyZmFjZSBpcyBvcGVuZWQuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorIyAgZGVmaW5lIEJSRUFLUE9JTlQoKSBhc20oIiAgIGludCAkMyIpOworI2Vsc2UKKyMgIGRlZmluZSBCUkVBS1BPSU5UKCkgeyB9CisjZW5kaWYKKworI2RlZmluZSBNQVhfSVNBX0RFVklDRVMgMTAKKyNkZWZpbmUgTUFYX1BDSV9ERVZJQ0VTIDEwCisjZGVmaW5lIE1BWF9UT1RBTF9ERVZJQ0VTIDIwCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisjaWZkZWYgQ09ORklHX0hETENfTU9EVUxFCisjZGVmaW5lIENPTkZJR19IRExDIDEKKyNlbmRpZgorCisjZGVmaW5lIEdFVF9VU0VSKGVycm9yLHZhbHVlLGFkZHIpIGVycm9yID0gZ2V0X3VzZXIodmFsdWUsYWRkcikKKyNkZWZpbmUgQ09QWV9GUk9NX1VTRVIoZXJyb3IsZGVzdCxzcmMsc2l6ZSkgZXJyb3IgPSBjb3B5X2Zyb21fdXNlcihkZXN0LHNyYyxzaXplKSA/IC1FRkFVTFQgOiAwCisjZGVmaW5lIFBVVF9VU0VSKGVycm9yLHZhbHVlLGFkZHIpIGVycm9yID0gcHV0X3VzZXIodmFsdWUsYWRkcikKKyNkZWZpbmUgQ09QWV9UT19VU0VSKGVycm9yLGRlc3Qsc3JjLHNpemUpIGVycm9yID0gY29weV90b191c2VyKGRlc3Qsc3JjLHNpemUpID8gLUVGQVVMVCA6IDAKKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJsaW51eC9zeW5jbGluay5oIgorCisjZGVmaW5lIFJDTFJWQUxVRSAweGZmZmYKKworc3RhdGljIE1HU0xfUEFSQU1TIGRlZmF1bHRfcGFyYW1zID0geworCU1HU0xfTU9ERV9IRExDLAkJCS8qIHVuc2lnbmVkIGxvbmcgbW9kZSAqLworCTAsCQkJCS8qIHVuc2lnbmVkIGNoYXIgbG9vcGJhY2s7ICovCisJSERMQ19GTEFHX1VOREVSUlVOX0FCT1JUMTUsCS8qIHVuc2lnbmVkIHNob3J0IGZsYWdzOyAqLworCUhETENfRU5DT0RJTkdfTlJaSV9TUEFDRSwJLyogdW5zaWduZWQgY2hhciBlbmNvZGluZzsgKi8KKwkwLAkJCQkvKiB1bnNpZ25lZCBsb25nIGNsb2NrX3NwZWVkOyAqLworCTB4ZmYsCQkJCS8qIHVuc2lnbmVkIGNoYXIgYWRkcl9maWx0ZXI7ICovCisJSERMQ19DUkNfMTZfQ0NJVFQsCQkvKiB1bnNpZ25lZCBzaG9ydCBjcmNfdHlwZTsgKi8KKwlIRExDX1BSRUFNQkxFX0xFTkdUSF84QklUUywJLyogdW5zaWduZWQgY2hhciBwcmVhbWJsZV9sZW5ndGg7ICovCisJSERMQ19QUkVBTUJMRV9QQVRURVJOX05PTkUsCS8qIHVuc2lnbmVkIGNoYXIgcHJlYW1ibGU7ICovCisJOTYwMCwJCQkJLyogdW5zaWduZWQgbG9uZyBkYXRhX3JhdGU7ICovCisJOCwJCQkJLyogdW5zaWduZWQgY2hhciBkYXRhX2JpdHM7ICovCisJMSwJCQkJLyogdW5zaWduZWQgY2hhciBzdG9wX2JpdHM7ICovCisJQVNZTkNfUEFSSVRZX05PTkUJCS8qIHVuc2lnbmVkIGNoYXIgcGFyaXR5OyAqLworfTsKKworI2RlZmluZSBTSEFSRURfTUVNX0FERFJFU1NfU0laRSAweDQwMDAwCisjZGVmaW5lIEJVRkZFUkxJU1RTSVpFIChQQUdFX1NJWkUpCisjZGVmaW5lIERNQUJVRkZFUlNJWkUgKFBBR0VfU0laRSkKKyNkZWZpbmUgTUFYUlhGUkFNRVMgNworCit0eXBlZGVmIHN0cnVjdCBfRE1BQlVGRkVSRU5UUlkKK3sKKwl1MzIgcGh5c19hZGRyOwkvKiAzMi1iaXQgZmxhdCBwaHlzaWNhbCBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyICovCisJdTE2IGNvdW50OwkvKiBidWZmZXIgc2l6ZS9kYXRhIGNvdW50ICovCisJdTE2IHN0YXR1czsJLyogQ29udHJvbC9zdGF0dXMgZmllbGQgKi8KKwl1MTYgcmNjOwkvKiBjaGFyYWN0ZXIgY291bnQgZmllbGQgKi8KKwl1MTYgcmVzZXJ2ZWQ7CS8qIHBhZGRpbmcgcmVxdWlyZWQgYnkgMTZDMzIgKi8KKwl1MzIgbGluazsJLyogMzItYml0IGZsYXQgbGluayB0byBuZXh0IGJ1ZmZlciBlbnRyeSAqLworCWNoYXIgKnZpcnRfYWRkcjsJLyogdmlydHVhbCBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyICovCisJdTMyIHBoeXNfZW50cnk7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhpcyBidWZmZXIgZW50cnkgKi8KK30gRE1BQlVGRkVSRU5UUlksICpETUFQQlVGRkVSRU5UUlk7CisKKy8qIFRoZSBxdWV1ZSBvZiBCSCBhY3Rpb25zIHRvIGJlIHBlcmZvcm1lZCAqLworCisjZGVmaW5lIEJIX1JFQ0VJVkUgIDEKKyNkZWZpbmUgQkhfVFJBTlNNSVQgMgorI2RlZmluZSBCSF9TVEFUVVMgICA0CisKKyNkZWZpbmUgSU9fUElOX1NIVVRET1dOX0xJTUlUIDEwMAorCisjZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKKworc3RydWN0CV9pbnB1dF9zaWduYWxfZXZlbnRzIHsKKwlpbnQJcmlfdXA7CQorCWludAlyaV9kb3duOworCWludAlkc3JfdXA7CisJaW50CWRzcl9kb3duOworCWludAlkY2RfdXA7CisJaW50CWRjZF9kb3duOworCWludAljdHNfdXA7CisJaW50CWN0c19kb3duOworfTsKKworLyogdHJhbnNtaXQgaG9sZGluZyBidWZmZXIgZGVmaW5pdGlvbnMqLworI2RlZmluZSBNQVhfVFhfSE9MRElOR19CVUZGRVJTIDUKK3N0cnVjdCB0eF9ob2xkaW5nX2J1ZmZlciB7CisJaW50CWJ1ZmZlcl9zaXplOworCXVuc2lnbmVkIGNoYXIgKglidWZmZXI7Cit9OworCisKKy8qCisgKiBEZXZpY2UgaW5zdGFuY2UgZGF0YSBzdHJ1Y3R1cmUKKyAqLworIAorc3RydWN0IG1nc2xfc3RydWN0IHsKKwlpbnQJCQltYWdpYzsKKwlpbnQJCQlmbGFnczsKKwlpbnQJCQljb3VudDsJCS8qIGNvdW50IG9mIG9wZW5zICovCisJaW50CQkJbGluZTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBod192ZXJzaW9uOworCXVuc2lnbmVkIHNob3J0CQljbG9zZV9kZWxheTsKKwl1bnNpZ25lZCBzaG9ydAkJY2xvc2luZ193YWl0OwkvKiB0aW1lIHRvIHdhaXQgYmVmb3JlIGNsb3NpbmcgKi8KKwkKKwlzdHJ1Y3QgbWdzbF9pY291bnQJaWNvdW50OworCQorCXN0cnVjdCB0dHlfc3RydWN0IAkqdHR5OworCWludAkJCXRpbWVvdXQ7CisJaW50CQkJeF9jaGFyOwkJLyogeG9uL3hvZmYgY2hhcmFjdGVyICovCisJaW50CQkJYmxvY2tlZF9vcGVuOwkvKiAjIG9mIGJsb2NrZWQgb3BlbnMgKi8KKwl1MTYJCQlyZWFkX3N0YXR1c19tYXNrOworCXUxNgkJCWlnbm9yZV9zdGF0dXNfbWFzazsJCisJdW5zaWduZWQgY2hhciAJCSp4bWl0X2J1ZjsKKwlpbnQJCQl4bWl0X2hlYWQ7CisJaW50CQkJeG1pdF90YWlsOworCWludAkJCXhtaXRfY250OworCQorCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OworCQorCXdhaXRfcXVldWVfaGVhZF90CXN0YXR1c19ldmVudF93YWl0X3E7CisJd2FpdF9xdWV1ZV9oZWFkX3QJZXZlbnRfd2FpdF9xOworCXN0cnVjdCB0aW1lcl9saXN0CXR4X3RpbWVyOwkvKiBIRExDIHRyYW5zbWl0IHRpbWVvdXQgdGltZXIgKi8KKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QJKm5leHRfZGV2aWNlOwkvKiBkZXZpY2UgbGlzdCBsaW5rICovCisJCisJc3BpbmxvY2tfdCBpcnFfc3BpbmxvY2s7CQkvKiBzcGlubG9jayBmb3Igc3luY2hyb25pemluZyB3aXRoIElTUiAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCB0YXNrOwkJLyogdGFzayBzdHJ1Y3R1cmUgZm9yIHNjaGVkdWxpbmcgYmggKi8KKworCXUzMiBFdmVudE1hc2s7CQkJLyogZXZlbnQgdHJpZ2dlciBtYXNrICovCisJdTMyIFJlY29yZGVkRXZlbnRzOwkJLyogcGVuZGluZyBldmVudHMgKi8KKworCXUzMiBtYXhfZnJhbWVfc2l6ZTsJCS8qIGFzIHNldCBieSBkZXZpY2UgY29uZmlnICovCisKKwl1MzIgcGVuZGluZ19iaDsKKworCWludCBiaF9ydW5uaW5nOwkJLyogUHJvdGVjdGlvbiBmcm9tIG11bHRpcGxlICovCisJaW50IGlzcl9vdmVyZmxvdzsKKwlpbnQgYmhfcmVxdWVzdGVkOworCQorCWludCBkY2RfY2hrY291bnQ7CQkvKiBjaGVjayBjb3VudHMgdG8gcHJldmVudCAqLworCWludCBjdHNfY2hrY291bnQ7CQkvKiB0b28gbWFueSBJUlFzIGlmIGEgc2lnbmFsICovCisJaW50IGRzcl9jaGtjb3VudDsJCS8qIGlzIGZsb2F0aW5nICovCisJaW50IHJpX2Noa2NvdW50OworCisJY2hhciAqYnVmZmVyX2xpc3Q7CQkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgUnggJiBUeCBidWZmZXIgbGlzdHMgKi8KKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9saXN0X3BoeXM7CisKKwl1bnNpZ25lZCBpbnQgcnhfYnVmZmVyX2NvdW50OwkvKiBjb3VudCBvZiB0b3RhbCBhbGxvY2F0ZWQgUnggYnVmZmVycyAqLworCURNQUJVRkZFUkVOVFJZICpyeF9idWZmZXJfbGlzdDsJLyogbGlzdCBvZiByZWNlaXZlIGJ1ZmZlciBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IGN1cnJlbnRfcnhfYnVmZmVyOworCisJaW50IG51bV90eF9kbWFfYnVmZmVyczsJCS8qIG51bWJlciBvZiB0eCBkbWEgZnJhbWVzIHJlcXVpcmVkICovCisgCWludCB0eF9kbWFfYnVmZmVyc191c2VkOworCXVuc2lnbmVkIGludCB0eF9idWZmZXJfY291bnQ7CS8qIGNvdW50IG9mIHRvdGFsIGFsbG9jYXRlZCBUeCBidWZmZXJzICovCisJRE1BQlVGRkVSRU5UUlkgKnR4X2J1ZmZlcl9saXN0OwkvKiBsaXN0IG9mIHRyYW5zbWl0IGJ1ZmZlciBlbnRyaWVzICovCisJaW50IHN0YXJ0X3R4X2RtYV9idWZmZXI7CS8qIHR4IGRtYSBidWZmZXIgdG8gc3RhcnQgdHggZG1hIG9wZXJhdGlvbiAqLworCWludCBjdXJyZW50X3R4X2J1ZmZlcjsgICAgICAgICAgLyogbmV4dCB0eCBkbWEgYnVmZmVyIHRvIGJlIGxvYWRlZCAqLworCQorCXVuc2lnbmVkIGNoYXIgKmludGVybWVkaWF0ZV9yeGJ1ZmZlcjsKKworCWludCBudW1fdHhfaG9sZGluZ19idWZmZXJzOwkvKiBudW1iZXIgb2YgdHggaG9sZGluZyBidWZmZXIgYWxsb2NhdGVkICovCisJaW50IGdldF90eF9ob2xkaW5nX2luZGV4OyAgCS8qIG5leHQgdHggaG9sZGluZyBidWZmZXIgZm9yIGFkYXB0ZXIgdG8gbG9hZCAqLworCWludCBwdXRfdHhfaG9sZGluZ19pbmRleDsgIAkvKiBuZXh0IHR4IGhvbGRpbmcgYnVmZmVyIHRvIHN0b3JlIHVzZXIgcmVxdWVzdCAqLworCWludCB0eF9ob2xkaW5nX2NvdW50OwkJLyogbnVtYmVyIG9mIHR4IGhvbGRpbmcgYnVmZmVycyB3YWl0aW5nICovCisJc3RydWN0IHR4X2hvbGRpbmdfYnVmZmVyIHR4X2hvbGRpbmdfYnVmZmVyc1tNQVhfVFhfSE9MRElOR19CVUZGRVJTXTsKKworCWludCByeF9lbmFibGVkOworCWludCByeF9vdmVyZmxvdzsKKwlpbnQgcnhfcmNjX3VuZGVycnVuOworCisJaW50IHR4X2VuYWJsZWQ7CisJaW50IHR4X2FjdGl2ZTsKKwl1MzIgaWRsZV9tb2RlOworCisJdTE2IGNtcl92YWx1ZTsKKwl1MTYgdGNzcl92YWx1ZTsKKworCWNoYXIgZGV2aWNlX25hbWVbMjVdOwkJLyogZGV2aWNlIGluc3RhbmNlIG5hbWUgKi8KKworCXVuc2lnbmVkIGludCBidXNfdHlwZTsJLyogZXhwYW5zaW9uIGJ1cyB0eXBlIChJU0EsRUlTQSxQQ0kpICovCisJdW5zaWduZWQgY2hhciBidXM7CQkvKiBleHBhbnNpb24gYnVzIG51bWJlciAoemVybyBiYXNlZCkgKi8KKwl1bnNpZ25lZCBjaGFyIGZ1bmN0aW9uOwkJLyogUENJIGRldmljZSBudW1iZXIgKi8KKworCXVuc2lnbmVkIGludCBpb19iYXNlOwkJLyogYmFzZSBJL08gYWRkcmVzcyBvZiBhZGFwdGVyICovCisJdW5zaWduZWQgaW50IGlvX2FkZHJfc2l6ZTsJLyogc2l6ZSBvZiB0aGUgSS9PIGFkZHJlc3MgcmFuZ2UgKi8KKwlpbnQgaW9fYWRkcl9yZXF1ZXN0ZWQ7CQkvKiBub256ZXJvIGlmIEkvTyBhZGRyZXNzIHJlcXVlc3RlZCAqLworCQorCXVuc2lnbmVkIGludCBpcnFfbGV2ZWw7CQkvKiBpbnRlcnJ1cHQgbGV2ZWwgKi8KKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwlpbnQgaXJxX3JlcXVlc3RlZDsJCS8qIG5vbnplcm8gaWYgSVJRIHJlcXVlc3RlZCAqLworCQorCXVuc2lnbmVkIGludCBkbWFfbGV2ZWw7CQkvKiBETUEgY2hhbm5lbCAqLworCWludCBkbWFfcmVxdWVzdGVkOwkJLyogbm9uemVybyBpZiBkbWEgY2hhbm5lbCByZXF1ZXN0ZWQgKi8KKworCXUxNiBtYnJlX2JpdDsKKwl1MTYgbG9vcGJhY2tfYml0czsKKwl1MTYgdXNjX2lkbGVfbW9kZTsKKworCU1HU0xfUEFSQU1TIHBhcmFtczsJCS8qIGNvbW11bmljYXRpb25zIHBhcmFtZXRlcnMgKi8KKworCXVuc2lnbmVkIGNoYXIgc2VyaWFsX3NpZ25hbHM7CS8qIGN1cnJlbnQgc2VyaWFsIHNpZ25hbCBzdGF0ZXMgKi8KKworCWludCBpcnFfb2NjdXJyZWQ7CQkvKiBmb3IgZGlhZ25vc3RpY3MgdXNlICovCisJdW5zaWduZWQgaW50IGluaXRfZXJyb3I7CS8qIEluaXRpYWxpemF0aW9uIHN0YXJ0dXAgZXJyb3IgCQkoRElBR1MpCSovCisJaW50CWZEaWFnbm9zdGljc21vZGU7CS8qIERyaXZlciBpbiBEaWFnbm9zdGljIG1vZGU/CQkJKERJQUdTKQkqLworCisJdTMyIGxhc3RfbWVtX2FsbG9jOworCXVuc2lnbmVkIGNoYXIqIG1lbW9yeV9iYXNlOwkvKiBzaGFyZWQgbWVtb3J5IGFkZHJlc3MgKFBDSSBvbmx5KSAqLworCXUzMiBwaHlzX21lbW9yeV9iYXNlOworCWludCBzaGFyZWRfbWVtX3JlcXVlc3RlZDsKKworCXVuc2lnbmVkIGNoYXIqIGxjcl9iYXNlOwkvKiBsb2NhbCBjb25maWcgcmVnaXN0ZXJzIChQQ0kgb25seSkgKi8KKwl1MzIgcGh5c19sY3JfYmFzZTsKKwl1MzIgbGNyX29mZnNldDsKKwlpbnQgbGNyX21lbV9yZXF1ZXN0ZWQ7CisKKwl1MzIgbWlzY19jdHJsX3ZhbHVlOworCWNoYXIgZmxhZ19idWZbTUFYX0FTWU5DX0JVRkZFUl9TSVpFXTsKKwljaGFyIGNoYXJfYnVmW01BWF9BU1lOQ19CVUZGRVJfU0laRV07CQorCUJPT0xFQU4gZHJvcF9ydHNfb25fdHhfZG9uZTsKKworCUJPT0xFQU4gbG9vcG1vZGVfaW5zZXJ0X3JlcXVlc3RlZDsKKwlCT09MRUFOCWxvb3Btb2RlX3NlbmRfZG9uZV9yZXF1ZXN0ZWQ7CisJCisJc3RydWN0CV9pbnB1dF9zaWduYWxfZXZlbnRzCWlucHV0X3NpZ25hbF9ldmVudHM7CisKKwkvKiBnZW5lcmljIEhETEMgZGV2aWNlIHBhcnRzICovCisJaW50IG5ldGNvdW50OworCWludCBkb3N5bmNwcHA7CisJc3BpbmxvY2tfdCBuZXRsb2NrOworCisjaWZkZWYgQ09ORklHX0hETEMKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworI2VuZGlmCit9OworCisjZGVmaW5lIE1HU0xfTUFHSUMgMHg1NDAxCisKKy8qCisgKiBUaGUgc2l6ZSBvZiB0aGUgc2VyaWFsIHhtaXQgYnVmZmVyIGlzIDEgcGFnZSwgb3IgNDA5NiBieXRlcworICovCisjaWZuZGVmIFNFUklBTF9YTUlUX1NJWkUKKyNkZWZpbmUgU0VSSUFMX1hNSVRfU0laRSA0MDk2CisjZW5kaWYKKworLyoKKyAqIFRoZXNlIG1hY3JvcyBkZWZpbmUgdGhlIG9mZnNldHMgdXNlZCBpbiBjYWxjdWxhdGluZyB0aGUKKyAqIEkvTyBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgVVNDIHJlZ2lzdGVycy4KKyAqLworCisKKyNkZWZpbmUgRENQSU4gMgkJLyogQml0IDEgb2YgSS9PIGFkZHJlc3MgKi8KKyNkZWZpbmUgU0RQSU4gNAkJLyogQml0IDIgb2YgSS9PIGFkZHJlc3MgKi8KKworI2RlZmluZSBEQ0FSIDAJCS8qIERNQSBjb21tYW5kL2FkZHJlc3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ0NBUiBTRFBJTgkJLyogY2hhbm5lbCBjb21tYW5kL2FkZHJlc3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgREFUQVJFRyBEQ1BJTiArIFNEUElOCS8qIHNlcmlhbCBkYXRhIHJlZ2lzdGVyICovCisjZGVmaW5lIE1TQk9OTFkgMHg0MQorI2RlZmluZSBMU0JPTkxZIDB4NDAKKworLyoKKyAqIFRoZXNlIG1hY3JvcyBkZWZpbmUgdGhlIHJlZ2lzdGVyIGFkZHJlc3MgKG9yZGluYWwgbnVtYmVyKQorICogdXNlZCBmb3Igd3JpdGluZyBhZGRyZXNzL3ZhbHVlIHBhaXJzIHRvIHRoZSBVU0MuCisgKi8KKworI2RlZmluZSBDTVIJMHgwMgkvKiBDaGFubmVsIG1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ0NTUgkweDA0CS8qIENoYW5uZWwgQ29tbWFuZC9zdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ0NSCTB4MDYJLyogQ2hhbm5lbCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBTUgkweDA4CS8qIFBvcnQgc3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDUgkweDBhCS8qIFBvcnQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBUTURSCTB4MGMJLyogVGVzdCBtb2RlIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVE1DUgkweDBlCS8qIFRlc3QgbW9kZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIENNQ1IJMHgxMAkvKiBDbG9jayBtb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSENSCTB4MTIJLyogSGFyZHdhcmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBJVlIJMHgxNAkvKiBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICovCisjZGVmaW5lIElPQ1IJMHgxNgkvKiBJbnB1dC9PdXRwdXQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBJQ1IJMHgxOAkvKiBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBEQ0NSCTB4MWEJLyogRGFpc3kgQ2hhaW4gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNSVNSCTB4MWMJLyogTWlzYyBJbnRlcnJ1cHQgc3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFNJQ1IJMHgxZQkvKiBzdGF0dXMgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkRSCTB4MjAJLyogUmVjZWl2ZSBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIFJNUgkweDIyCS8qIFJlY2VpdmUgbW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBSQ1NSCTB4MjQJLyogUmVjZWl2ZSBDb21tYW5kL3N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBSSUNSCTB4MjYJLyogUmVjZWl2ZSBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSU1IJMHgyOAkvKiBSZWNlaXZlIFN5bmMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkNMUgkweDJhCS8qIFJlY2VpdmUgY291bnQgTGltaXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkNDUgkweDJjCS8qIFJlY2VpdmUgQ2hhcmFjdGVyIGNvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFRDMFIJMHgyZQkvKiBUaW1lIENvbnN0YW50IDAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVERSCTB4MzAJLyogVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBUTVIJMHgzMgkvKiBUcmFuc21pdCBtb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIFRDU1IJMHgzNAkvKiBUcmFuc21pdCBDb21tYW5kL3N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBUSUNSCTB4MzYJLyogVHJhbnNtaXQgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVFNSCTB4MzgJLyogVHJhbnNtaXQgU3luYyBSZWdpc3RlciAqLworI2RlZmluZSBUQ0xSCTB4M2EJLyogVHJhbnNtaXQgY291bnQgTGltaXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVENDUgkweDNjCS8qIFRyYW5zbWl0IENoYXJhY3RlciBjb3VudCBSZWdpc3RlciAqLworI2RlZmluZSBUQzFSCTB4M2UJLyogVGltZSBDb25zdGFudCAxIFJlZ2lzdGVyICovCisKKworLyoKKyAqIE1BQ1JPIERFRklOSVRJT05TIEZPUiBETUEgUkVHSVNURVJTCisgKi8KKworI2RlZmluZSBEQ1IJMHgwNgkvKiBETUEgQ29udHJvbCBSZWdpc3RlciAoc2hhcmVkKSAqLworI2RlZmluZSBEQUNSCTB4MDgJLyogRE1BIEFycmF5IGNvdW50IFJlZ2lzdGVyIChzaGFyZWQpICovCisjZGVmaW5lIEJEQ1IJMHgxMgkvKiBCdXJzdC9Ed2VsbCBDb250cm9sIFJlZ2lzdGVyIChzaGFyZWQpICovCisjZGVmaW5lIERJVlIJMHgxNAkvKiBETUEgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAoc2hhcmVkKSAqLwkKKyNkZWZpbmUgRElDUgkweDE4CS8qIERNQSBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAoc2hhcmVkKSAqLworI2RlZmluZSBDRElSCTB4MWEJLyogQ2xlYXIgRE1BIEludGVycnVwdCBSZWdpc3RlciAoc2hhcmVkKSAqLworI2RlZmluZSBTRElSCTB4MWMJLyogU2V0IERNQSBJbnRlcnJ1cHQgUmVnaXN0ZXIgKHNoYXJlZCkgKi8KKworI2RlZmluZSBURE1SCTB4MDIJLyogVHJhbnNtaXQgRE1BIG1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVERJQVIJMHgxZQkvKiBUcmFuc21pdCBETUEgSW50ZXJydXB0IEFybSBSZWdpc3RlciAqLworI2RlZmluZSBUQkNSCTB4MmEJLyogVHJhbnNtaXQgQnl0ZSBjb3VudCBSZWdpc3RlciAqLworI2RlZmluZSBUQVJMCTB4MmMJLyogVHJhbnNtaXQgQWRkcmVzcyBSZWdpc3RlciAobG93KSAqLworI2RlZmluZSBUQVJVCTB4MmUJLyogVHJhbnNtaXQgQWRkcmVzcyBSZWdpc3RlciAoaGlnaCkgKi8KKyNkZWZpbmUgTlRCQ1IJMHgzYQkvKiBOZXh0IFRyYW5zbWl0IEJ5dGUgY291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTlRBUkwJMHgzYwkvKiBOZXh0IFRyYW5zbWl0IEFkZHJlc3MgUmVnaXN0ZXIgKGxvdykgKi8KKyNkZWZpbmUgTlRBUlUJMHgzZQkvKiBOZXh0IFRyYW5zbWl0IEFkZHJlc3MgUmVnaXN0ZXIgKGhpZ2gpICovCisKKyNkZWZpbmUgUkRNUgkweDgyCS8qIFJlY2VpdmUgRE1BIG1vZGUgUmVnaXN0ZXIgKG5vbi1zaGFyZWQpICovCisjZGVmaW5lIFJESUFSCTB4OWUJLyogUmVjZWl2ZSBETUEgSW50ZXJydXB0IEFybSBSZWdpc3RlciAqLworI2RlZmluZSBSQkNSCTB4YWEJLyogUmVjZWl2ZSBCeXRlIGNvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFJBUkwJMHhhYwkvKiBSZWNlaXZlIEFkZHJlc3MgUmVnaXN0ZXIgKGxvdykgKi8KKyNkZWZpbmUgUkFSVQkweGFlCS8qIFJlY2VpdmUgQWRkcmVzcyBSZWdpc3RlciAoaGlnaCkgKi8KKyNkZWZpbmUgTlJCQ1IJMHhiYQkvKiBOZXh0IFJlY2VpdmUgQnl0ZSBjb3VudCBSZWdpc3RlciAqLworI2RlZmluZSBOUkFSTAkweGJjCS8qIE5leHQgUmVjZWl2ZSBBZGRyZXNzIFJlZ2lzdGVyIChsb3cpICovCisjZGVmaW5lIE5SQVJVCTB4YmUJLyogTmV4dCBSZWNlaXZlIEFkZHJlc3MgUmVnaXN0ZXIgKGhpZ2gpICovCisKKworLyoKKyAqIE1BQ1JPIERFRklOSVRJT05TIEZPUiBNT0RFTSBTVEFUVVMgQklUUworICovCisKKyNkZWZpbmUgTU9ERU1TVEFUVVNfRFRSIDB4ODAKKyNkZWZpbmUgTU9ERU1TVEFUVVNfRFNSIDB4NDAKKyNkZWZpbmUgTU9ERU1TVEFUVVNfUlRTIDB4MjAKKyNkZWZpbmUgTU9ERU1TVEFUVVNfQ1RTIDB4MTAKKyNkZWZpbmUgTU9ERU1TVEFUVVNfUkkgIDB4MDQKKyNkZWZpbmUgTU9ERU1TVEFUVVNfRENEIDB4MDEKKworCisvKgorICogQ2hhbm5lbCBDb21tYW5kL0FkZHJlc3MgUmVnaXN0ZXIgKENDQVIpIENvbW1hbmQgQ29kZXMKKyAqLworCisjZGVmaW5lIFJUQ21kX051bGwJCQkweDAwMDAKKyNkZWZpbmUgUlRDbWRfUmVzZXRIaWdoZXN0SXVzCQkweDEwMDAKKyNkZWZpbmUgUlRDbWRfVHJpZ2dlckNoYW5uZWxMb2FkRG1hCTB4MjAwMAorI2RlZmluZSBSVENtZF9UcmlnZ2VyUnhEbWEJCTB4MjgwMAorI2RlZmluZSBSVENtZF9UcmlnZ2VyVHhEbWEJCTB4MzAwMAorI2RlZmluZSBSVENtZF9UcmlnZ2VyUnhBbmRUeERtYQkJMHgzODAwCisjZGVmaW5lIFJUQ21kX1B1cmdlUnhGaWZvCQkweDQ4MDAKKyNkZWZpbmUgUlRDbWRfUHVyZ2VUeEZpZm8JCTB4NTAwMAorI2RlZmluZSBSVENtZF9QdXJnZVJ4QW5kVHhGaWZvCQkweDU4MDAKKyNkZWZpbmUgUlRDbWRfTG9hZFJjYwkJCTB4NjgwMAorI2RlZmluZSBSVENtZF9Mb2FkVGNjCQkJMHg3MDAwCisjZGVmaW5lIFJUQ21kX0xvYWRSY2NBbmRUY2MJCTB4NzgwMAorI2RlZmluZSBSVENtZF9Mb2FkVEMwCQkJMHg4ODAwCisjZGVmaW5lIFJUQ21kX0xvYWRUQzEJCQkweDkwMDAKKyNkZWZpbmUgUlRDbWRfTG9hZFRDMEFuZFRDMQkJMHg5ODAwCisjZGVmaW5lIFJUQ21kX1NlcmlhbERhdGFMU0JGaXJzdAkweGEwMDAKKyNkZWZpbmUgUlRDbWRfU2VyaWFsRGF0YU1TQkZpcnN0CTB4YTgwMAorI2RlZmluZSBSVENtZF9TZWxlY3RCaWdFbmRpYW4JCTB4YjAwMAorI2RlZmluZSBSVENtZF9TZWxlY3RMaXR0bGVFbmRpYW4JMHhiODAwCisKKworLyoKKyAqIERNQSBDb21tYW5kL0FkZHJlc3MgUmVnaXN0ZXIgKERDQVIpIENvbW1hbmQgQ29kZXMKKyAqLworCisjZGVmaW5lIERtYUNtZF9OdWxsCQkJMHgwMDAwCisjZGVmaW5lIERtYUNtZF9SZXNldFR4Q2hhbm5lbAkJMHgxMDAwCisjZGVmaW5lIERtYUNtZF9SZXNldFJ4Q2hhbm5lbAkJMHgxMjAwCisjZGVmaW5lIERtYUNtZF9TdGFydFR4Q2hhbm5lbAkJMHgyMDAwCisjZGVmaW5lIERtYUNtZF9TdGFydFJ4Q2hhbm5lbAkJMHgyMjAwCisjZGVmaW5lIERtYUNtZF9Db250aW51ZVR4Q2hhbm5lbAkweDMwMDAKKyNkZWZpbmUgRG1hQ21kX0NvbnRpbnVlUnhDaGFubmVsCTB4MzIwMAorI2RlZmluZSBEbWFDbWRfUGF1c2VUeENoYW5uZWwJCTB4NDAwMAorI2RlZmluZSBEbWFDbWRfUGF1c2VSeENoYW5uZWwJCTB4NDIwMAorI2RlZmluZSBEbWFDbWRfQWJvcnRUeENoYW5uZWwJCTB4NTAwMAorI2RlZmluZSBEbWFDbWRfQWJvcnRSeENoYW5uZWwJCTB4NTIwMAorI2RlZmluZSBEbWFDbWRfSW5pdFR4Q2hhbm5lbAkJMHg3MDAwCisjZGVmaW5lIERtYUNtZF9Jbml0UnhDaGFubmVsCQkweDcyMDAKKyNkZWZpbmUgRG1hQ21kX1Jlc2V0SGlnaGVzdERtYUl1cwkweDgwMDAKKyNkZWZpbmUgRG1hQ21kX1Jlc2V0QWxsQ2hhbm5lbHMJCTB4OTAwMAorI2RlZmluZSBEbWFDbWRfU3RhcnRBbGxDaGFubmVscwkJMHhhMDAwCisjZGVmaW5lIERtYUNtZF9Db250aW51ZUFsbENoYW5uZWxzCTB4YjAwMAorI2RlZmluZSBEbWFDbWRfUGF1c2VBbGxDaGFubmVscwkJMHhjMDAwCisjZGVmaW5lIERtYUNtZF9BYm9ydEFsbENoYW5uZWxzCQkweGQwMDAKKyNkZWZpbmUgRG1hQ21kX0luaXRBbGxDaGFubmVscwkJMHhmMDAwCisKKyNkZWZpbmUgVENtZF9OdWxsCQkJMHgwMDAwCisjZGVmaW5lIFRDbWRfQ2xlYXJUeENSQwkJCTB4MjAwMAorI2RlZmluZSBUQ21kX1NlbGVjdFRpY3JUdHNhRGF0YQkJMHg0MDAwCisjZGVmaW5lIFRDbWRfU2VsZWN0VGljclR4Rmlmb3N0YXR1cwkweDUwMDAKKyNkZWZpbmUgVENtZF9TZWxlY3RUaWNySW50TGV2ZWwJCTB4NjAwMAorI2RlZmluZSBUQ21kX1NlbGVjdFRpY3JkbWFfbGV2ZWwJCTB4NzAwMAorI2RlZmluZSBUQ21kX1NlbmRGcmFtZQkJCTB4ODAwMAorI2RlZmluZSBUQ21kX1NlbmRBYm9ydAkJCTB4OTAwMAorI2RlZmluZSBUQ21kX0VuYWJsZURsZUluc2VydGlvbgkJMHhjMDAwCisjZGVmaW5lIFRDbWRfRGlzYWJsZURsZUluc2VydGlvbgkweGQwMDAKKyNkZWZpbmUgVENtZF9DbGVhckVvZkVvbQkJMHhlMDAwCisjZGVmaW5lIFRDbWRfU2V0RW9mRW9tCQkJMHhmMDAwCisKKyNkZWZpbmUgUkNtZF9OdWxsCQkJMHgwMDAwCisjZGVmaW5lIFJDbWRfQ2xlYXJSeENSQwkJCTB4MjAwMAorI2RlZmluZSBSQ21kX0VudGVySHVudG1vZGUJCTB4MzAwMAorI2RlZmluZSBSQ21kX1NlbGVjdFJpY3JSdHNhRGF0YQkJMHg0MDAwCisjZGVmaW5lIFJDbWRfU2VsZWN0UmljclJ4Rmlmb3N0YXR1cwkweDUwMDAKKyNkZWZpbmUgUkNtZF9TZWxlY3RSaWNySW50TGV2ZWwJCTB4NjAwMAorI2RlZmluZSBSQ21kX1NlbGVjdFJpY3JkbWFfbGV2ZWwJCTB4NzAwMAorCisvKgorICogQml0cyBmb3IgZW5hYmxpbmcgYW5kIGRpc2FibGluZyBJUlFzIGluIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyIChJQ1IpCisgKi8KKyAKKyNkZWZpbmUgUkVDRUlWRV9TVEFUVVMJCUJJVDUKKyNkZWZpbmUgUkVDRUlWRV9EQVRBCQlCSVQ0CisjZGVmaW5lIFRSQU5TTUlUX1NUQVRVUwkJQklUMworI2RlZmluZSBUUkFOU01JVF9EQVRBCQlCSVQyCisjZGVmaW5lIElPX1BJTgkJCUJJVDEKKyNkZWZpbmUgTUlTQwkJCUJJVDAKKworCisvKgorICogUmVjZWl2ZSBzdGF0dXMgQml0cyBpbiBSZWNlaXZlIENvbW1hbmQvc3RhdHVzIFJlZ2lzdGVyIFJDU1IKKyAqLworCisjZGVmaW5lIFJYU1RBVFVTX1NIT1JUX0ZSQU1FCQlCSVQ4CisjZGVmaW5lIFJYU1RBVFVTX0NPREVfVklPTEFUSU9OCQlCSVQ4CisjZGVmaW5lIFJYU1RBVFVTX0VYSVRFRF9IVU5UCQlCSVQ3CisjZGVmaW5lIFJYU1RBVFVTX0lETEVfUkVDRUlWRUQJCUJJVDYKKyNkZWZpbmUgUlhTVEFUVVNfQlJFQUtfUkVDRUlWRUQJCUJJVDUKKyNkZWZpbmUgUlhTVEFUVVNfQUJPUlRfUkVDRUlWRUQJCUJJVDUKKyNkZWZpbmUgUlhTVEFUVVNfUlhCT1VORAkJQklUNAorI2RlZmluZSBSWFNUQVRVU19DUkNfRVJST1IJCUJJVDMKKyNkZWZpbmUgUlhTVEFUVVNfRlJBTUlOR19FUlJPUgkJQklUMworI2RlZmluZSBSWFNUQVRVU19BQk9SVAkJCUJJVDIKKyNkZWZpbmUgUlhTVEFUVVNfUEFSSVRZX0VSUk9SCQlCSVQyCisjZGVmaW5lIFJYU1RBVFVTX09WRVJSVU4JCUJJVDEKKyNkZWZpbmUgUlhTVEFUVVNfREFUQV9BVkFJTEFCTEUJCUJJVDAKKyNkZWZpbmUgUlhTVEFUVVNfQUxMCQkJMHgwMWY2CisjZGVmaW5lIHVzY19VbmxhdGNoUnhzdGF0dXNCaXRzKGEsYikgdXNjX091dFJlZyggKGEpLCBSQ1NSLCAodTE2KSgoYikgJiBSWFNUQVRVU19BTEwpICkKKworLyoKKyAqIFZhbHVlcyBmb3Igc2V0dGluZyB0cmFuc21pdCBpZGxlIG1vZGUgaW4gCisgKiBUcmFuc21pdCBDb250cm9sL3N0YXR1cyBSZWdpc3RlciAoVENTUikKKyAqLworI2RlZmluZSBJRExFTU9ERV9GTEFHUwkJCTB4MDAwMAorI2RlZmluZSBJRExFTU9ERV9BTFRfT05FX1pFUk8JCTB4MDEwMAorI2RlZmluZSBJRExFTU9ERV9aRVJPCQkJMHgwMjAwCisjZGVmaW5lIElETEVNT0RFX09ORQkJCTB4MDMwMAorI2RlZmluZSBJRExFTU9ERV9BTFRfTUFSS19TUEFDRQkJMHgwNTAwCisjZGVmaW5lIElETEVNT0RFX1NQQUNFCQkJMHgwNjAwCisjZGVmaW5lIElETEVNT0RFX01BUksJCQkweDA3MDAKKyNkZWZpbmUgSURMRU1PREVfTUFTSwkJCTB4MDcwMAorCisvKgorICogSVVTQyByZXZpc2lvbiBpZGVudGlmaWVycworICovCisjZGVmaW5lCUlVU0NfU0wxNjYwCQkJMHg0ZDQ0CisjZGVmaW5lIElVU0NfUFJFX1NMMTY2MAkJCTB4NDU1MworCisvKgorICogVHJhbnNtaXQgc3RhdHVzIEJpdHMgaW4gVHJhbnNtaXQgQ29tbWFuZC9zdGF0dXMgUmVnaXN0ZXIgKFRDU1IpCisgKi8KKworI2RlZmluZSBUQ1NSX1BSRVNFUlZFCQkJMHgwRjAwCisKKyNkZWZpbmUgVENTUl9VTkRFUldBSVQJCQlCSVQxMQorI2RlZmluZSBUWFNUQVRVU19QUkVBTUJMRV9TRU5UCQlCSVQ3CisjZGVmaW5lIFRYU1RBVFVTX0lETEVfU0VOVAkJQklUNgorI2RlZmluZSBUWFNUQVRVU19BQk9SVF9TRU5UCQlCSVQ1CisjZGVmaW5lIFRYU1RBVFVTX0VPRl9TRU5UCQlCSVQ0CisjZGVmaW5lIFRYU1RBVFVTX0VPTV9TRU5UCQlCSVQ0CisjZGVmaW5lIFRYU1RBVFVTX0NSQ19TRU5UCQlCSVQzCisjZGVmaW5lIFRYU1RBVFVTX0FMTF9TRU5UCQlCSVQyCisjZGVmaW5lIFRYU1RBVFVTX1VOREVSUlVOCQlCSVQxCisjZGVmaW5lIFRYU1RBVFVTX0ZJRk9fRU1QVFkJCUJJVDAKKyNkZWZpbmUgVFhTVEFUVVNfQUxMCQkJMHgwMGZhCisjZGVmaW5lIHVzY19VbmxhdGNoVHhzdGF0dXNCaXRzKGEsYikgdXNjX091dFJlZyggKGEpLCBUQ1NSLCAodTE2KSgoYSktPnRjc3JfdmFsdWUgKyAoKGIpICYgMHgwMEZGKSkgKQorCQkJCQorCisjZGVmaW5lIE1JU0NTVEFUVVNfUlhDX0xBVENIRUQJCUJJVDE1CisjZGVmaW5lIE1JU0NTVEFUVVNfUlhDCQkJQklUMTQKKyNkZWZpbmUgTUlTQ1NUQVRVU19UWENfTEFUQ0hFRAkJQklUMTMKKyNkZWZpbmUgTUlTQ1NUQVRVU19UWEMJCQlCSVQxMgorI2RlZmluZSBNSVNDU1RBVFVTX1JJX0xBVENIRUQJCUJJVDExCisjZGVmaW5lIE1JU0NTVEFUVVNfUkkJCQlCSVQxMAorI2RlZmluZSBNSVNDU1RBVFVTX0RTUl9MQVRDSEVECQlCSVQ5CisjZGVmaW5lIE1JU0NTVEFUVVNfRFNSCQkJQklUOAorI2RlZmluZSBNSVNDU1RBVFVTX0RDRF9MQVRDSEVECQlCSVQ3CisjZGVmaW5lIE1JU0NTVEFUVVNfRENECQkJQklUNgorI2RlZmluZSBNSVNDU1RBVFVTX0NUU19MQVRDSEVECQlCSVQ1CisjZGVmaW5lIE1JU0NTVEFUVVNfQ1RTCQkJQklUNAorI2RlZmluZSBNSVNDU1RBVFVTX1JDQ19VTkRFUlJVTgkJQklUMworI2RlZmluZSBNSVNDU1RBVFVTX0RQTExfTk9fU1lOQwkJQklUMgorI2RlZmluZSBNSVNDU1RBVFVTX0JSRzFfWkVSTwkJQklUMQorI2RlZmluZSBNSVNDU1RBVFVTX0JSRzBfWkVSTwkJQklUMAorCisjZGVmaW5lIHVzY19VbmxhdGNoSW9zdGF0dXNCaXRzKGEsYikgdXNjX091dFJlZygoYSksTUlTUiwodTE2KSgoYikgJiAweGFhYTApKQorI2RlZmluZSB1c2NfVW5sYXRjaE1pc2NzdGF0dXNCaXRzKGEsYikgdXNjX091dFJlZygoYSksTUlTUiwodTE2KSgoYikgJiAweDAwMGYpKQorCisjZGVmaW5lIFNJQ1JfUlhDX0FDVElWRQkJCUJJVDE1CisjZGVmaW5lIFNJQ1JfUlhDX0lOQUNUSVZFCQlCSVQxNAorI2RlZmluZSBTSUNSX1JYQwkJCShCSVQxNStCSVQxNCkKKyNkZWZpbmUgU0lDUl9UWENfQUNUSVZFCQkJQklUMTMKKyNkZWZpbmUgU0lDUl9UWENfSU5BQ1RJVkUJCUJJVDEyCisjZGVmaW5lIFNJQ1JfVFhDCQkJKEJJVDEzK0JJVDEyKQorI2RlZmluZSBTSUNSX1JJX0FDVElWRQkJCUJJVDExCisjZGVmaW5lIFNJQ1JfUklfSU5BQ1RJVkUJCUJJVDEwCisjZGVmaW5lIFNJQ1JfUkkJCQkJKEJJVDExK0JJVDEwKQorI2RlZmluZSBTSUNSX0RTUl9BQ1RJVkUJCQlCSVQ5CisjZGVmaW5lIFNJQ1JfRFNSX0lOQUNUSVZFCQlCSVQ4CisjZGVmaW5lIFNJQ1JfRFNSCQkJKEJJVDkrQklUOCkKKyNkZWZpbmUgU0lDUl9EQ0RfQUNUSVZFCQkJQklUNworI2RlZmluZSBTSUNSX0RDRF9JTkFDVElWRQkJQklUNgorI2RlZmluZSBTSUNSX0RDRAkJCShCSVQ3K0JJVDYpCisjZGVmaW5lIFNJQ1JfQ1RTX0FDVElWRQkJCUJJVDUKKyNkZWZpbmUgU0lDUl9DVFNfSU5BQ1RJVkUJCUJJVDQKKyNkZWZpbmUgU0lDUl9DVFMJCQkoQklUNStCSVQ0KQorI2RlZmluZSBTSUNSX1JDQ19VTkRFUkZMT1cJCUJJVDMKKyNkZWZpbmUgU0lDUl9EUExMX05PX1NZTkMJCUJJVDIKKyNkZWZpbmUgU0lDUl9CUkcxX1pFUk8JCQlCSVQxCisjZGVmaW5lIFNJQ1JfQlJHMF9aRVJPCQkJQklUMAorCit2b2lkIHVzY19EaXNhYmxlTWFzdGVySXJxQml0KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3ZvaWQgdXNjX0VuYWJsZU1hc3RlcklycUJpdCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7Cit2b2lkIHVzY19FbmFibGVJbnRlcnJ1cHRzKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHUxNiBJcnFNYXNrICk7Cit2b2lkIHVzY19EaXNhYmxlSW50ZXJydXB0cyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MTYgSXJxTWFzayApOwordm9pZCB1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MTYgSXJxTWFzayApOworCisjZGVmaW5lIHVzY19FbmFibGVJbnRlcnJ1cHRzKCBhLCBiICkgXAorCXVzY19PdXRSZWcoIChhKSwgSUNSLCAodTE2KSgodXNjX0luUmVnKChhKSxJQ1IpICYgMHhmZjAwKSArIDB4YzAgKyAoYikpICkKKworI2RlZmluZSB1c2NfRGlzYWJsZUludGVycnVwdHMoIGEsIGIgKSBcCisJdXNjX091dFJlZyggKGEpLCBJQ1IsICh1MTYpKCh1c2NfSW5SZWcoKGEpLElDUikgJiAweGZmMDApICsgMHg4MCArIChiKSkgKQorCisjZGVmaW5lIHVzY19FbmFibGVNYXN0ZXJJcnFCaXQoYSkgXAorCXVzY19PdXRSZWcoIChhKSwgSUNSLCAodTE2KSgodXNjX0luUmVnKChhKSxJQ1IpICYgMHgwZjAwKSArIDB4YjAwMCkgKQorCisjZGVmaW5lIHVzY19EaXNhYmxlTWFzdGVySXJxQml0KGEpIFwKKwl1c2NfT3V0UmVnKCAoYSksIElDUiwgKHUxNikodXNjX0luUmVnKChhKSxJQ1IpICYgMHg3ZjAwKSApCisKKyNkZWZpbmUgdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoIGEsIGIgKSB1c2NfT3V0UmVnKCAoYSksIERDQ1IsIDB4NDAgKyAoYikgKQorCisvKgorICogVHJhbnNtaXQgc3RhdHVzIEJpdHMgaW4gVHJhbnNtaXQgQ29udHJvbCBzdGF0dXMgUmVnaXN0ZXIgKFRDU1IpCisgKiBhbmQgVHJhbnNtaXQgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKFRJQ1IpIChleGNlcHQgQklUMiwgQklUMCkKKyAqLworCisjZGVmaW5lIFRYU1RBVFVTX1BSRUFNQkxFX1NFTlQJQklUNworI2RlZmluZSBUWFNUQVRVU19JRExFX1NFTlQJQklUNgorI2RlZmluZSBUWFNUQVRVU19BQk9SVF9TRU5UCUJJVDUKKyNkZWZpbmUgVFhTVEFUVVNfRU9GCQlCSVQ0CisjZGVmaW5lIFRYU1RBVFVTX0NSQ19TRU5UCUJJVDMKKyNkZWZpbmUgVFhTVEFUVVNfQUxMX1NFTlQJQklUMgorI2RlZmluZSBUWFNUQVRVU19VTkRFUlJVTglCSVQxCisjZGVmaW5lIFRYU1RBVFVTX0ZJRk9fRU1QVFkJQklUMAorCisjZGVmaW5lIERJQ1JfTUFTVEVSCQlCSVQxNQorI2RlZmluZSBESUNSX1RSQU5TTUlUCQlCSVQwCisjZGVmaW5lIERJQ1JfUkVDRUlWRQkJQklUMQorCisjZGVmaW5lIHVzY19FbmFibGVEbWFJbnRlcnJ1cHRzKGEsYikgXAorCXVzY19PdXREbWFSZWcoIChhKSwgRElDUiwgKHUxNikodXNjX0luRG1hUmVnKChhKSxESUNSKSB8IChiKSkgKQorCisjZGVmaW5lIHVzY19EaXNhYmxlRG1hSW50ZXJydXB0cyhhLGIpIFwKKwl1c2NfT3V0RG1hUmVnKCAoYSksIERJQ1IsICh1MTYpKHVzY19JbkRtYVJlZygoYSksRElDUikgJiB+KGIpKSApCisKKyNkZWZpbmUgdXNjX0VuYWJsZVN0YXR1c0lycXMoYSxiKSBcCisJdXNjX091dFJlZyggKGEpLCBTSUNSLCAodTE2KSh1c2NfSW5SZWcoKGEpLFNJQ1IpIHwgKGIpKSApCisKKyNkZWZpbmUgdXNjX0Rpc2FibGVzdGF0dXNJcnFzKGEsYikgXAorCXVzY19PdXRSZWcoIChhKSwgU0lDUiwgKHUxNikodXNjX0luUmVnKChhKSxTSUNSKSAmIH4oYikpICkKKworLyogVHJhbnNtaXQgc3RhdHVzIEJpdHMgaW4gVHJhbnNtaXQgQ29udHJvbCBzdGF0dXMgUmVnaXN0ZXIgKFRDU1IpICovCisvKiBhbmQgVHJhbnNtaXQgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKFRJQ1IpIChleGNlcHQgQklUMiwgQklUMCkgKi8KKworCisjZGVmaW5lIERJU0FCTEVfVU5DT05ESVRJT05BTCAgICAwCisjZGVmaW5lIERJU0FCTEVfRU5EX09GX0ZSQU1FICAgICAxCisjZGVmaW5lIEVOQUJMRV9VTkNPTkRJVElPTkFMICAgICAyCisjZGVmaW5lIEVOQUJMRV9BVVRPX0NUUyAgICAgICAgICAzCisjZGVmaW5lIEVOQUJMRV9BVVRPX0RDRCAgICAgICAgICAzCisjZGVmaW5lIHVzY19FbmFibGVUcmFuc21pdHRlcihhLGIpIFwKKwl1c2NfT3V0UmVnKCAoYSksIFRNUiwgKHUxNikoKHVzY19JblJlZygoYSksVE1SKSAmIDB4ZmZmYykgfCAoYikpICkKKyNkZWZpbmUgdXNjX0VuYWJsZVJlY2VpdmVyKGEsYikgXAorCXVzY19PdXRSZWcoIChhKSwgUk1SLCAodTE2KSgodXNjX0luUmVnKChhKSxSTVIpICYgMHhmZmZjKSB8IChiKSkgKQorCitzdGF0aWMgdTE2ICB1c2NfSW5EbWFSZWcoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTE2IFBvcnQgKTsKK3N0YXRpYyB2b2lkIHVzY19PdXREbWFSZWcoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTE2IFBvcnQsIHUxNiBWYWx1ZSApOworc3RhdGljIHZvaWQgdXNjX0RtYUNtZCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MTYgQ21kICk7CisKK3N0YXRpYyB1MTYgIHVzY19JblJlZyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MTYgUG9ydCApOworc3RhdGljIHZvaWQgdXNjX091dFJlZyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MTYgUG9ydCwgdTE2IFZhbHVlICk7CitzdGF0aWMgdm9pZCB1c2NfUlRDbWQoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTE2IENtZCApOwordm9pZCB1c2NfUkNtZCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MTYgQ21kICk7Cit2b2lkIHVzY19UQ21kKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHUxNiBDbWQgKTsKKworI2RlZmluZSB1c2NfVENtZChhLGIpIHVzY19PdXRSZWcoKGEpLCBUQ1NSLCAodTE2KSgoYSktPnRjc3JfdmFsdWUgKyAoYikpKQorI2RlZmluZSB1c2NfUkNtZChhLGIpIHVzY19PdXRSZWcoKGEpLCBSQ1NSLCAoYikpCisKKyNkZWZpbmUgdXNjX1NldFRyYW5zbWl0U3luY0NoYXJzKGEsczAsczEpIHVzY19PdXRSZWcoKGEpLCBUU1IsICh1MTYpKCgodTE2KXMwPDw4KXwodTE2KXMxKSkKKworc3RhdGljIHZvaWQgdXNjX3Byb2Nlc3NfcnhvdmVycnVuX3N5bmMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworc3RhdGljIHZvaWQgdXNjX3N0YXJ0X3JlY2VpdmVyKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIHVzY19zdG9wX3JlY2VpdmVyKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKKworc3RhdGljIHZvaWQgdXNjX3N0YXJ0X3RyYW5zbWl0dGVyKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIHVzY19zdG9wX3RyYW5zbWl0dGVyKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIHVzY19zZXRfdHhpZGxlKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIHVzY19sb2FkX3R4Zmlmbyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CisKK3N0YXRpYyB2b2lkIHVzY19lbmFibGVfYXV4X2Nsb2NrKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHUzMiBEYXRhUmF0ZSApOworc3RhdGljIHZvaWQgdXNjX2VuYWJsZV9sb29wYmFjayggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCBpbnQgZW5hYmxlICk7CisKK3N0YXRpYyB2b2lkIHVzY19nZXRfc2VyaWFsX3NpZ25hbHMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworc3RhdGljIHZvaWQgdXNjX3NldF9zZXJpYWxfc2lnbmFscyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CisKK3N0YXRpYyB2b2lkIHVzY19yZXNldCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CisKK3N0YXRpYyB2b2lkIHVzY19zZXRfc3luY19tb2RlKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIHVzY19zZXRfc2RsY19tb2RlKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIHVzY19zZXRfYXN5bmNfbW9kZSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCB1c2NfZW5hYmxlX2FzeW5jX2Nsb2NrKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHUzMiBEYXRhUmF0ZSApOworCitzdGF0aWMgdm9pZCB1c2NfbG9vcGJhY2tfZnJhbWUoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworCitzdGF0aWMgdm9pZCBtZ3NsX3R4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBjb250ZXh0KTsKKworCitzdGF0aWMgdm9pZCB1c2NfbG9vcG1vZGVfY2FuY2VsX3RyYW5zbWl0KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvICk7CitzdGF0aWMgdm9pZCB1c2NfbG9vcG1vZGVfaW5zZXJ0X3JlcXVlc3QoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8gKTsKK3N0YXRpYyBpbnQgdXNjX2xvb3Btb2RlX2FjdGl2ZSggc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbyk7CitzdGF0aWMgdm9pZCB1c2NfbG9vcG1vZGVfc2VuZF9kb25lKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvICk7CisKK3N0YXRpYyBpbnQgbWdzbF9pb2N0bF9jb21tb24oc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKKyNpZmRlZiBDT05GSUdfSERMQworI2RlZmluZSBkZXZfdG9fcG9ydChEKSAoZGV2X3RvX2hkbGMoRCktPnByaXYpCitzdGF0aWMgdm9pZCBoZGxjZGV2X3R4X2RvbmUoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIGhkbGNkZXZfcngoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCBjaGFyICpidWYsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgIGhkbGNkZXZfaW5pdChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOworc3RhdGljIHZvaWQgaGRsY2Rldl9leGl0KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyk7CisjZW5kaWYKKworLyoKKyAqIERlZmluZXMgYSBCVVMgZGVzY3JpcHRvciB2YWx1ZSBmb3IgdGhlIFBDSSBhZGFwdGVyCisgKiBsb2NhbCBidXMgYWRkcmVzcyByYW5nZXMuCisgKi8KKworI2RlZmluZSBCVVNfREVTQ1JJUFRPUiggV3JIb2xkLCBXckRseSwgUmREbHksIE53ZGQsIE53YWQsIE54ZGEsIE5yZGQsIE5yYWQgKSBcCisoMHgwMDQwMDAyMCArIFwKKygoV3JIb2xkKSA8PCAzMCkgKyBcCisoKFdyRGx5KSAgPDwgMjgpICsgXAorKChSZERseSkgIDw8IDI2KSArIFwKKygoTndkZCkgICA8PCAyMCkgKyBcCisoKE53YWQpICAgPDwgMTUpICsgXAorKChOeGRhKSAgIDw8IDEzKSArIFwKKygoTnJkZCkgICA8PCAxMSkgKyBcCisoKE5yYWQpICAgPDwgIDYpICkKKworc3RhdGljIHZvaWQgbWdzbF90cmFjZV9ibG9jayhzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sY29uc3QgY2hhciogZGF0YSwgaW50IGNvdW50LCBpbnQgeG1pdCk7CisKKy8qCisgKiBBZGFwdGVyIGRpYWdub3N0aWMgcm91dGluZXMKKyAqLworc3RhdGljIEJPT0xFQU4gbWdzbF9yZWdpc3Rlcl90ZXN0KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyBCT09MRUFOIG1nc2xfaXJxX3Rlc3QoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworc3RhdGljIEJPT0xFQU4gbWdzbF9kbWFfdGVzdCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgQk9PTEVBTiBtZ3NsX21lbW9yeV90ZXN0KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyBpbnQgbWdzbF9hZGFwdGVyX3Rlc3QoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworCisvKgorICogZGV2aWNlIGFuZCByZXNvdXJjZSBtYW5hZ2VtZW50IHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9jbGFpbV9yZXNvdXJjZXMoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xfYWRkX2RldmljZShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOworc3RhdGljIHN0cnVjdCBtZ3NsX3N0cnVjdCogbWdzbF9hbGxvY2F0ZV9kZXZpY2Uodm9pZCk7CisKKy8qCisgKiBETUEgYnVmZmVyIG1hbnVwdWxhdGlvbiBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfZnJlZV9yeF9mcmFtZV9idWZmZXJzKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHVuc2lnbmVkIGludCBTdGFydEluZGV4LCB1bnNpZ25lZCBpbnQgRW5kSW5kZXggKTsKK3N0YXRpYyBpbnQgIG1nc2xfZ2V0X3J4X2ZyYW1lKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyBpbnQgIG1nc2xfZ2V0X3Jhd19yeF9mcmFtZSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCBtZ3NsX3Jlc2V0X3J4X2RtYV9idWZmZXJzKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIG1nc2xfcmVzZXRfdHhfZG1hX2J1ZmZlcnMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworc3RhdGljIGludCBudW1fZnJlZV90eF9kbWFfYnVmZmVycyhzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOworc3RhdGljIHZvaWQgbWdzbF9sb2FkX3R4X2RtYV9idWZmZXIoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgY29uc3QgY2hhciAqQnVmZmVyLCB1bnNpZ25lZCBpbnQgQnVmZmVyU2l6ZSk7CitzdGF0aWMgdm9pZCBtZ3NsX2xvYWRfcGNpX21lbW9yeShjaGFyKiBUYXJnZXRQdHIsIGNvbnN0IGNoYXIqIFNvdXJjZVB0ciwgdW5zaWduZWQgc2hvcnQgY291bnQpOworCisvKgorICogRE1BIGFuZCBTaGFyZWQgTWVtb3J5IGJ1ZmZlciBhbGxvY2F0aW9uIGFuZCBmb3JtYXR0aW5nCisgKi8KK3N0YXRpYyBpbnQgIG1nc2xfYWxsb2NhdGVfZG1hX2J1ZmZlcnMoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xfZnJlZV9kbWFfYnVmZmVycyhzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOworc3RhdGljIGludCAgbWdzbF9hbGxvY19mcmFtZV9tZW1vcnkoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCBETUFCVUZGRVJFTlRSWSAqQnVmZmVyTGlzdCxpbnQgQnVmZmVyY291bnQpOworc3RhdGljIHZvaWQgbWdzbF9mcmVlX2ZyYW1lX21lbW9yeShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIERNQUJVRkZFUkVOVFJZICpCdWZmZXJMaXN0LGludCBCdWZmZXJjb3VudCk7CitzdGF0aWMgaW50ICBtZ3NsX2FsbG9jX2J1ZmZlcl9saXN0X21lbW9yeShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOworc3RhdGljIHZvaWQgbWdzbF9mcmVlX2J1ZmZlcl9saXN0X21lbW9yeShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOworc3RhdGljIGludCBtZ3NsX2FsbG9jX2ludGVybWVkaWF0ZV9yeGJ1ZmZlcl9tZW1vcnkoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xfZnJlZV9pbnRlcm1lZGlhdGVfcnhidWZmZXJfbWVtb3J5KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyk7CitzdGF0aWMgaW50IG1nc2xfYWxsb2NfaW50ZXJtZWRpYXRlX3R4YnVmZmVyX21lbW9yeShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOworc3RhdGljIHZvaWQgbWdzbF9mcmVlX2ludGVybWVkaWF0ZV90eGJ1ZmZlcl9tZW1vcnkoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyBpbnQgbG9hZF9uZXh0X3R4X2hvbGRpbmdfYnVmZmVyKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyk7CitzdGF0aWMgaW50IHNhdmVfdHhfYnVmZmVyX3JlcXVlc3Qoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLGNvbnN0IGNoYXIgKkJ1ZmZlciwgdW5zaWduZWQgaW50IEJ1ZmZlclNpemUpOworCisvKgorICogQm90dG9tIGhhbGYgaW50ZXJydXB0IGhhbmRsZXJzCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfYmhfaGFuZGxlcih2b2lkKiBDb250ZXh0KTsKK3N0YXRpYyB2b2lkIG1nc2xfYmhfcmVjZWl2ZShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOworc3RhdGljIHZvaWQgbWdzbF9iaF90cmFuc21pdChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOworc3RhdGljIHZvaWQgbWdzbF9iaF9zdGF0dXMoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKKworLyoKKyAqIEludGVycnVwdCBoYW5kbGVyIHJvdXRpbmVzIGFuZCBkaXNwYXRjaCB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgbWdzbF9pc3JfbnVsbCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCBtZ3NsX2lzcl90cmFuc21pdF9kYXRhKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIG1nc2xfaXNyX3JlY2VpdmVfZGF0YSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCBtZ3NsX2lzcl9yZWNlaXZlX3N0YXR1cyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICk7CitzdGF0aWMgdm9pZCBtZ3NsX2lzcl90cmFuc21pdF9zdGF0dXMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworc3RhdGljIHZvaWQgbWdzbF9pc3JfaW9fcGluKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKK3N0YXRpYyB2b2lkIG1nc2xfaXNyX21pc2MoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworc3RhdGljIHZvaWQgbWdzbF9pc3JfcmVjZWl2ZV9kbWEoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApOworc3RhdGljIHZvaWQgbWdzbF9pc3JfdHJhbnNtaXRfZG1hKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKTsKKwordHlwZWRlZiB2b2lkICgqaXNyX2Rpc3BhdGNoX2Z1bmMpKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKTsKKworc3RhdGljIGlzcl9kaXNwYXRjaF9mdW5jIFVzY0lzclRhYmxlWzddID0KK3sKKwltZ3NsX2lzcl9udWxsLAorCW1nc2xfaXNyX21pc2MsCisJbWdzbF9pc3JfaW9fcGluLAorCW1nc2xfaXNyX3RyYW5zbWl0X2RhdGEsCisJbWdzbF9pc3JfdHJhbnNtaXRfc3RhdHVzLAorCW1nc2xfaXNyX3JlY2VpdmVfZGF0YSwKKwltZ3NsX2lzcl9yZWNlaXZlX3N0YXR1cworfTsKKworLyoKKyAqIGlvY3RsIGNhbGwgaGFuZGxlcnMKKyAqLworc3RhdGljIGludCB0aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IHRpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKK3N0YXRpYyBpbnQgbWdzbF9nZXRfc3RhdHMoc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbywgc3RydWN0IG1nc2xfaWNvdW50CisJX191c2VyICp1c2VyX2ljb3VudCk7CitzdGF0aWMgaW50IG1nc2xfZ2V0X3BhcmFtcyhzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvLCBNR1NMX1BBUkFNUyAgX191c2VyICp1c2VyX3BhcmFtcyk7CitzdGF0aWMgaW50IG1nc2xfc2V0X3BhcmFtcyhzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvLCBNR1NMX1BBUkFNUyAgX191c2VyICpuZXdfcGFyYW1zKTsKK3N0YXRpYyBpbnQgbWdzbF9nZXRfdHhpZGxlKHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8sIGludCBfX3VzZXIgKmlkbGVfbW9kZSk7CitzdGF0aWMgaW50IG1nc2xfc2V0X3R4aWRsZShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvLCBpbnQgaWRsZV9tb2RlKTsKK3N0YXRpYyBpbnQgbWdzbF90eGVuYWJsZShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvLCBpbnQgZW5hYmxlKTsKK3N0YXRpYyBpbnQgbWdzbF90eGFib3J0KHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8pOworc3RhdGljIGludCBtZ3NsX3J4ZW5hYmxlKHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8sIGludCBlbmFibGUpOworc3RhdGljIGludCBtZ3NsX3dhaXRfZXZlbnQoc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbywgaW50IF9fdXNlciAqbWFzayk7CitzdGF0aWMgaW50IG1nc2xfbG9vcG1vZGVfc2VuZF9kb25lKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvICk7CisKKy8qIHNldCBub24temVybyBvbiBzdWNjZXNzZnVsIHJlZ2lzdHJhdGlvbiB3aXRoIFBDSSBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBpbnQgcGNpX3JlZ2lzdGVyZWQ7CisKKy8qCisgKiBHbG9iYWwgbGlua2VkIGxpc3Qgb2YgU3luY0xpbmsgZGV2aWNlcworICovCitzdGF0aWMgc3RydWN0IG1nc2xfc3RydWN0ICptZ3NsX2RldmljZV9saXN0Oworc3RhdGljIGludCBtZ3NsX2RldmljZV9jb3VudDsKKworLyoKKyAqIFNldCB0aGlzIHBhcmFtIHRvIG5vbi16ZXJvIHRvIGxvYWQgZWF4IHdpdGggdGhlCisgKiAudGV4dCBzZWN0aW9uIGFkZHJlc3MgYW5kIGJyZWFrcG9pbnQgb24gbW9kdWxlIGxvYWQuCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgdXNlIHdpdGggZ2RiIGFuZCBhZGQtc3ltYm9sLWZpbGUgY29tbWFuZC4KKyAqLworc3RhdGljIGludCBicmVha19vbl9sb2FkOworCisvKgorICogRHJpdmVyIG1ham9yIG51bWJlciwgZGVmYXVsdHMgdG8gemVybyB0byBnZXQgYXV0bworICogYXNzaWduZWQgbWFqb3IgbnVtYmVyLiBNYXkgYmUgZm9yY2VkIGFzIG1vZHVsZSBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyBpbnQgdHR5bWFqb3I7CisKKy8qCisgKiBBcnJheSBvZiB1c2VyIHNwZWNpZmllZCBvcHRpb25zIGZvciBJU0EgYWRhcHRlcnMuCisgKi8KK3N0YXRpYyBpbnQgaW9bTUFYX0lTQV9ERVZJQ0VTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF9JU0FfREVWSUNFU107CitzdGF0aWMgaW50IGRtYVtNQVhfSVNBX0RFVklDRVNdOworc3RhdGljIGludCBkZWJ1Z19sZXZlbDsKK3N0YXRpYyBpbnQgbWF4ZnJhbWVbTUFYX1RPVEFMX0RFVklDRVNdOworc3RhdGljIGludCBkb3N5bmNwcHBbTUFYX1RPVEFMX0RFVklDRVNdOworc3RhdGljIGludCB0eGRtYWJ1ZnNbTUFYX1RPVEFMX0RFVklDRVNdOworc3RhdGljIGludCB0eGhvbGRidWZzW01BWF9UT1RBTF9ERVZJQ0VTXTsKKwkKK21vZHVsZV9wYXJhbShicmVha19vbl9sb2FkLCBib29sLCAwKTsKK21vZHVsZV9wYXJhbSh0dHltYWpvciwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZG1hLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnX2xldmVsLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG1heGZyYW1lLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGRvc3luY3BwcCwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh0eGRtYWJ1ZnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkodHhob2xkYnVmcywgaW50LCBOVUxMLCAwKTsKKworc3RhdGljIGNoYXIgKmRyaXZlcl9uYW1lID0gIlN5bmNMaW5rIHNlcmlhbCBkcml2ZXIiOworc3RhdGljIGNoYXIgKmRyaXZlcl92ZXJzaW9uID0gIiRSZXZpc2lvbjogNC4yOCAkIjsKKworc3RhdGljIGludCBzeW5jbGlua19pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHZvaWQgc3luY2xpbmtfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKmRldik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzeW5jbGlua19wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX01JQ1JPR0FURSwgUENJX0RFVklDRV9JRF9NSUNST0dBVEVfVVNDLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgUENJX1ZFTkRPUl9JRF9NSUNST0dBVEUsIDB4MDIxMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDAsIH0sIC8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHN5bmNsaW5rX3BjaV90YmwpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzeW5jbGlua19wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJzeW5jbGluayIsCisJLmlkX3RhYmxlCT0gc3luY2xpbmtfcGNpX3RibCwKKwkucHJvYmUJCT0gc3luY2xpbmtfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzeW5jbGlua19yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKKworLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgbGVmdCBpbiB4bWl0IGJ1ZmZlciBiZWZvcmUgd2UgYXNrIGZvciBtb3JlICovCisjZGVmaW5lIFdBS0VVUF9DSEFSUyAyNTYKKworCitzdGF0aWMgdm9pZCBtZ3NsX2NoYW5nZV9wYXJhbXMoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKKworLyoKKyAqIDFzdCBmdW5jdGlvbiBkZWZpbmVkIGluIC50ZXh0IHNlY3Rpb24uIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbgorICogaW5pdF9tb2R1bGUoKSBmb2xsb3dlZCBieSBhIGJyZWFrcG9pbnQgYWxsb3dzIGEgcmVtb3RlIGRlYnVnZ2VyCisgKiAoZ2RiKSB0byBnZXQgdGhlIC50ZXh0IGFkZHJlc3MgZm9yIHRoZSBhZGQtc3ltYm9sLWZpbGUgY29tbWFuZC4KKyAqIFRoaXMgYWxsb3dzIHJlbW90ZSBkZWJ1Z2dpbmcgb2YgZHluYW1pY2FsbHkgbG9hZGFibGUgbW9kdWxlcy4KKyAqLworc3RhdGljIHZvaWQqIG1nc2xfZ2V0X3RleHRfcHRyKHZvaWQpCit7CisJcmV0dXJuIG1nc2xfZ2V0X3RleHRfcHRyOworfQorCisvKgorICogdG1wX2J1ZiBpcyB1c2VkIGFzIGEgdGVtcG9yYXJ5IGJ1ZmZlciBieSBtZ3NsX3dyaXRlLiAgV2UgbmVlZCB0bworICogbG9jayBpdCBpbiBjYXNlIHRoZSBDT1BZX0ZST01fVVNFUiBibG9ja3Mgd2hpbGUgc3dhcHBpbmcgaW4gYSBwYWdlLAorICogYW5kIHNvbWUgb3RoZXIgcHJvZ3JhbSB0cmllcyB0byBkbyBhIHNlcmlhbCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lLgorICogU2luY2UgdGhlIGxvY2sgd2lsbCBvbmx5IGNvbWUgdW5kZXIgY29udGVudGlvbiB3aGVuIHRoZSBzeXN0ZW0gaXMKKyAqIHN3YXBwaW5nIGFuZCBhdmFpbGFibGUgbWVtb3J5IGlzIGxvdywgaXQgbWFrZXMgc2Vuc2UgdG8gc2hhcmUgb25lCisgKiBidWZmZXIgYWNyb3NzIGFsbCB0aGUgc2VyaWFsIGlvcG9ydHMsIHNpbmNlIGl0IHNpZ25pZmljYW50bHkgc2F2ZXMKKyAqIG1lbW9yeSBpZiBsYXJnZSBudW1iZXJzIG9mIHNlcmlhbCBwb3J0cyBhcmUgb3Blbi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnRtcF9idWY7CitzdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IG1nc2xfcGFyYW5vaWFfY2hlY2soc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLAorCQkJCQljaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworI2lmZGVmIE1HU0xfUEFSQU5PSUFfQ0hFQ0sKKwlzdGF0aWMgY29uc3QgY2hhciAqYmFkbWFnaWMgPQorCQkiV2FybmluZzogYmFkIG1hZ2ljIG51bWJlciBmb3IgbWdzbCBzdHJ1Y3QgKCVzKSBpbiAlc1xuIjsKKwlzdGF0aWMgY29uc3QgY2hhciAqYmFkaW5mbyA9CisJCSJXYXJuaW5nOiBudWxsIG1nc2xfc3RydWN0IGZvciAoJXMpIGluICVzXG4iOworCisJaWYgKCFpbmZvKSB7CisJCXByaW50ayhiYWRpbmZvLCBuYW1lLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChpbmZvLT5tYWdpYyAhPSBNR1NMX01BR0lDKSB7CisJCXByaW50ayhiYWRtYWdpYywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKyNlbHNlCisJaWYgKCFpbmZvKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKioKKyAqIGxpbmUgZGlzY2lwbGluZSBjYWxsYmFjayB3cmFwcGVycworICoKKyAqIFRoZSB3cmFwcGVycyBtYWludGFpbiBsaW5lIGRpc2NpcGxpbmUgcmVmZXJlbmNlcworICogd2hpbGUgY2FsbGluZyBpbnRvIHRoZSBsaW5lIGRpc2NpcGxpbmUuCisgKgorICogbGRpc2NfcmVjZWl2ZV9idWYgIC0gcGFzcyByZWNlaXZlIGRhdGEgdG8gbGluZSBkaXNjaXBsaW5lCisgKi8KKworc3RhdGljIHZvaWQgbGRpc2NfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCSAgICAgIGNvbnN0IF9fdTggKmRhdGEsIGNoYXIgKmZsYWdzLCBpbnQgY291bnQpCit7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisJaWYgKCF0dHkpCisJCXJldHVybjsKKwlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwlpZiAobGQpIHsKKwkJaWYgKGxkLT5yZWNlaXZlX2J1ZikKKwkJCWxkLT5yZWNlaXZlX2J1Zih0dHksIGRhdGEsIGZsYWdzLCBjb3VudCk7CisJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJfQorfQorCisvKiBtZ3NsX3N0b3AoKQkJdGhyb3R0bGUgKHN0b3ApIHRyYW5zbWl0dGVyCisgKiAJCisgKiBBcmd1bWVudHM6CQl0dHkJcG9pbnRlciB0byB0dHkgaW5mbyBzdHJ1Y3R1cmUKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChtZ3NsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xfc3RvcCIpKQorCQlyZXR1cm47CisJCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCJtZ3NsX3N0b3AoJXMpXG4iLGluZm8tPmRldmljZV9uYW1lKTsJCisJCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCWlmIChpbmZvLT50eF9lbmFibGVkKQorCSAJdXNjX3N0b3BfdHJhbnNtaXR0ZXIoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkKK30JLyogZW5kIG9mIG1nc2xfc3RvcCgpICovCisKKy8qIG1nc2xfc3RhcnQoKQkJcmVsZWFzZSAoc3RhcnQpIHRyYW5zbWl0dGVyCisgKiAJCisgKiBBcmd1bWVudHM6CQl0dHkJcG9pbnRlciB0byB0dHkgaW5mbyBzdHJ1Y3R1cmUKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAobWdzbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NsX3N0YXJ0IikpCisJCXJldHVybjsKKwkKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoIm1nc2xfc3RhcnQoJXMpXG4iLGluZm8tPmRldmljZV9uYW1lKTsJCisJCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCWlmICghaW5mby0+dHhfZW5hYmxlZCkKKwkgCXVzY19zdGFydF90cmFuc21pdHRlcihpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQorfQkvKiBlbmQgb2YgbWdzbF9zdGFydCgpICovCisKKy8qCisgKiBCb3R0b20gaGFsZiB3b3JrIHF1ZXVlIGFjY2VzcyBmdW5jdGlvbnMKKyAqLworCisvKiBtZ3NsX2JoX2FjdGlvbigpCVJldHVybiBuZXh0IGJvdHRvbSBoYWxmIGFjdGlvbiB0byBwZXJmb3JtLgorICogUmV0dXJuIFZhbHVlOglCSCBhY3Rpb24gY29kZSBvciAwIGlmIG5vdGhpbmcgdG8gZG8uCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9iaF9hY3Rpb24oc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gMDsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCWlmIChpbmZvLT5wZW5kaW5nX2JoICYgQkhfUkVDRUlWRSkgeworCQlpbmZvLT5wZW5kaW5nX2JoICY9IH5CSF9SRUNFSVZFOworCQlyYyA9IEJIX1JFQ0VJVkU7CisJfSBlbHNlIGlmIChpbmZvLT5wZW5kaW5nX2JoICYgQkhfVFJBTlNNSVQpIHsKKwkJaW5mby0+cGVuZGluZ19iaCAmPSB+QkhfVFJBTlNNSVQ7CisJCXJjID0gQkhfVFJBTlNNSVQ7CisJfSBlbHNlIGlmIChpbmZvLT5wZW5kaW5nX2JoICYgQkhfU1RBVFVTKSB7CisJCWluZm8tPnBlbmRpbmdfYmggJj0gfkJIX1NUQVRVUzsKKwkJcmMgPSBCSF9TVEFUVVM7CisJfQorCisJaWYgKCFyYykgeworCQkvKiBNYXJrIEJIIHJvdXRpbmUgYXMgY29tcGxldGUgKi8KKwkJaW5mby0+YmhfcnVubmluZyAgID0gMDsKKwkJaW5mby0+YmhfcmVxdWVzdGVkID0gMDsKKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiAJUGVyZm9ybSBib3R0b20gaGFsZiBwcm9jZXNzaW5nIG9mIHdvcmsgaXRlbXMgcXVldWVkIGJ5IElTUi4KKyAqLworc3RhdGljIHZvaWQgbWdzbF9iaF9oYW5kbGVyKHZvaWQqIENvbnRleHQpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCopQ29udGV4dDsKKwlpbnQgYWN0aW9uOworCisJaWYgKCFpbmZvKQorCQlyZXR1cm47CisJCQorCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkggKQorCQlwcmludGsoICIlcyglZCk6bWdzbF9iaF9oYW5kbGVyKCVzKSBlbnRyeVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkKKwlpbmZvLT5iaF9ydW5uaW5nID0gMTsKKworCXdoaWxlKChhY3Rpb24gPSBtZ3NsX2JoX2FjdGlvbihpbmZvKSkgIT0gMCkgeworCQorCQkvKiBQcm9jZXNzIHdvcmsgaXRlbSAqLworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0JIICkKKwkJCXByaW50ayggIiVzKCVkKTptZ3NsX2JoX2hhbmRsZXIoKSB3b3JrIGl0ZW0gYWN0aW9uPSVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGFjdGlvbik7CisKKwkJc3dpdGNoIChhY3Rpb24pIHsKKwkJCisJCWNhc2UgQkhfUkVDRUlWRToKKwkJCW1nc2xfYmhfcmVjZWl2ZShpbmZvKTsKKwkJCWJyZWFrOworCQljYXNlIEJIX1RSQU5TTUlUOgorCQkJbWdzbF9iaF90cmFuc21pdChpbmZvKTsKKwkJCWJyZWFrOworCQljYXNlIEJIX1NUQVRVUzoKKwkJCW1nc2xfYmhfc3RhdHVzKGluZm8pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiB1bmtub3duIHdvcmsgaXRlbSBJRCAqLworCQkJcHJpbnRrKCJVbmtub3duIHdvcmsgaXRlbSBJRD0lMDhYIVxuIiwgYWN0aW9uKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCApCisJCXByaW50ayggIiVzKCVkKTptZ3NsX2JoX2hhbmRsZXIoJXMpIGV4aXRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1nc2xfYmhfcmVjZWl2ZShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pCit7CisJaW50ICgqZ2V0X3J4X2ZyYW1lKShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pID0KKwkJKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDID8gbWdzbF9nZXRfcnhfZnJhbWUgOiBtZ3NsX2dldF9yYXdfcnhfZnJhbWUpOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCApCisJCXByaW50ayggIiVzKCVkKTptZ3NsX2JoX3JlY2VpdmUoJXMpXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCQorCWRvCisJeworCQlpZiAoaW5mby0+cnhfcmNjX3VuZGVycnVuKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCQl1c2Nfc3RhcnRfcmVjZWl2ZXIoaW5mbyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJfSB3aGlsZShnZXRfcnhfZnJhbWUoaW5mbykpOworfQorCitzdGF0aWMgdm9pZCBtZ3NsX2JoX3RyYW5zbWl0KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCApCisJCXByaW50ayggIiVzKCVkKTptZ3NsX2JoX3RyYW5zbWl0KCkgZW50cnkgb24gJXNcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwlpZiAodHR5KSB7CisJCXR0eV93YWtldXAodHR5KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCX0KKworCS8qIGlmIHRyYW5zbWl0dGVyIGlkbGUgYW5kIGxvb3Btb2RlX3NlbmRfZG9uZV9yZXF1ZXN0ZWQKKwkgKiB0aGVuIHN0YXJ0IGVjaG9pbmcgUnhEIHRvIFR4RAorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworIAlpZiAoICFpbmZvLT50eF9hY3RpdmUgJiYgaW5mby0+bG9vcG1vZGVfc2VuZF9kb25lX3JlcXVlc3RlZCApCisgCQl1c2NfbG9vcG1vZGVfc2VuZF9kb25lKCBpbmZvICk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbWdzbF9iaF9zdGF0dXMoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKQoreworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkggKQorCQlwcmludGsoICIlcyglZCk6bWdzbF9iaF9zdGF0dXMoKSBlbnRyeSBvbiAlc1xuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKworCWluZm8tPnJpX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5kc3JfY2hrY291bnQgPSAwOworCWluZm8tPmRjZF9jaGtjb3VudCA9IDA7CisJaW5mby0+Y3RzX2Noa2NvdW50ID0gMDsKK30KKworLyogbWdzbF9pc3JfcmVjZWl2ZV9zdGF0dXMoKQorICogCisgKglTZXJ2aWNlIGEgcmVjZWl2ZSBzdGF0dXMgaW50ZXJydXB0LiBUaGUgdHlwZSBvZiBzdGF0dXMKKyAqCWludGVycnVwdCBpcyBpbmRpY2F0ZWQgYnkgdGhlIHN0YXRlIG9mIHRoZSBSQ1NSLgorICoJVGhpcyBpcyBvbmx5IHVzZWQgZm9yIEhETEMgbW9kZS4KKyAqCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2lzcl9yZWNlaXZlX3N0YXR1cyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwl1MTYgc3RhdHVzID0gdXNjX0luUmVnKCBpbmZvLCBSQ1NSICk7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2lzcl9yZWNlaXZlX3N0YXR1cyBzdGF0dXM9JTA0WFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLHN0YXR1cyk7CisJCQkKKyAJaWYgKCAoc3RhdHVzICYgUlhTVEFUVVNfQUJPUlRfUkVDRUlWRUQpICYmIAorCQlpbmZvLT5sb29wbW9kZV9pbnNlcnRfcmVxdWVzdGVkICYmCisgCQl1c2NfbG9vcG1vZGVfYWN0aXZlKGluZm8pICkKKyAJeworCQkrK2luZm8tPmljb3VudC5yeGFib3J0OworCSAJaW5mby0+bG9vcG1vZGVfaW5zZXJ0X3JlcXVlc3RlZCA9IEZBTFNFOworIAorIAkJLyogY2xlYXIgQ01SOjEzIHRvIHN0YXJ0IGVjaG9pbmcgUnhEIHRvIFR4RCAqLworCQlpbmZvLT5jbXJfdmFsdWUgJj0gfkJJVDEzOworIAkJdXNjX091dFJlZyhpbmZvLCBDTVIsIGluZm8tPmNtcl92YWx1ZSk7CisgCisJCS8qIGRpc2FibGUgcmVjZWl2ZWQgYWJvcnQgaXJxIChubyBsb25nZXIgcmVxdWlyZWQpICovCisJIAl1c2NfT3V0UmVnKGluZm8sIFJJQ1IsCisgCQkJKHVzY19JblJlZyhpbmZvLCBSSUNSKSAmIH5SWFNUQVRVU19BQk9SVF9SRUNFSVZFRCkpOworIAl9CisKKwlpZiAoc3RhdHVzICYgKFJYU1RBVFVTX0VYSVRFRF9IVU5UICsgUlhTVEFUVVNfSURMRV9SRUNFSVZFRCkpIHsKKwkJaWYgKHN0YXR1cyAmIFJYU1RBVFVTX0VYSVRFRF9IVU5UKQorCQkJaW5mby0+aWNvdW50LmV4aXRodW50Kys7CisJCWlmIChzdGF0dXMgJiBSWFNUQVRVU19JRExFX1JFQ0VJVkVEKQorCQkJaW5mby0+aWNvdW50LnJ4aWRsZSsrOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisJfQorCisJaWYgKHN0YXR1cyAmIFJYU1RBVFVTX09WRVJSVU4peworCQlpbmZvLT5pY291bnQucnhvdmVyKys7CisJCXVzY19wcm9jZXNzX3J4b3ZlcnJ1bl9zeW5jKCBpbmZvICk7CisJfQorCisJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoIGluZm8sIFJFQ0VJVkVfU1RBVFVTICk7CisJdXNjX1VubGF0Y2hSeHN0YXR1c0JpdHMoIGluZm8sIHN0YXR1cyApOworCit9CS8qIGVuZCBvZiBtZ3NsX2lzcl9yZWNlaXZlX3N0YXR1cygpICovCisKKy8qIG1nc2xfaXNyX3RyYW5zbWl0X3N0YXR1cygpCisgKiAKKyAqIAlTZXJ2aWNlIGEgdHJhbnNtaXQgc3RhdHVzIGludGVycnVwdAorICoJSERMQyBtb2RlIDplbmQgb2YgdHJhbnNtaXQgZnJhbWUKKyAqCUFzeW5jIG1vZGU6YWxsIGRhdGEgaXMgc2VudAorICogCXRyYW5zbWl0IHN0YXR1cyBpcyBpbmRpY2F0ZWQgYnkgYml0cyBpbiB0aGUgVENTUi4KKyAqIAorICogQXJndW1lbnRzOgkJaW5mbwkgICAgICAgcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfaXNyX3RyYW5zbWl0X3N0YXR1cyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwl1MTYgc3RhdHVzID0gdXNjX0luUmVnKCBpbmZvLCBUQ1NSICk7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2lzcl90cmFuc21pdF9zdGF0dXMgc3RhdHVzPSUwNFhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxzdGF0dXMpOworCQorCXVzY19DbGVhcklycVBlbmRpbmdCaXRzKCBpbmZvLCBUUkFOU01JVF9TVEFUVVMgKTsKKwl1c2NfVW5sYXRjaFR4c3RhdHVzQml0cyggaW5mbywgc3RhdHVzICk7CisJCisJaWYgKCBzdGF0dXMgJiAoVFhTVEFUVVNfVU5ERVJSVU4gfCBUWFNUQVRVU19BQk9SVF9TRU5UKSApCisJeworCQkvKiBmaW5pc2hlZCBzZW5kaW5nIEhETEMgYWJvcnQuIFRoaXMgbWF5IGxlYXZlCSovCisJCS8qIHRoZSBUeEZpZm8gd2l0aCBkYXRhIGZyb20gdGhlIGFib3J0ZWQgZnJhbWUJKi8KKwkJLyogc28gcHVyZ2UgdGhlIFR4Rmlmby4gQWxzbyBzaHV0ZG93biB0aGUgRE1BCSovCisJCS8qIGNoYW5uZWwgaW4gY2FzZSB0aGVyZSBpcyBkYXRhIHJlbWFpbmluZyBpbiAJKi8KKwkJLyogdGhlIERNQSBidWZmZXIJCQkJKi8KKyAJCXVzY19EbWFDbWQoIGluZm8sIERtYUNtZF9SZXNldFR4Q2hhbm5lbCApOworIAkJdXNjX1JUQ21kKCBpbmZvLCBSVENtZF9QdXJnZVR4RmlmbyApOworCX0KKyAKKwlpZiAoIHN0YXR1cyAmIFRYU1RBVFVTX0VPRl9TRU5UICkKKwkJaW5mby0+aWNvdW50LnR4b2srKzsKKwllbHNlIGlmICggc3RhdHVzICYgVFhTVEFUVVNfVU5ERVJSVU4gKQorCQlpbmZvLT5pY291bnQudHh1bmRlcisrOworCWVsc2UgaWYgKCBzdGF0dXMgJiBUWFNUQVRVU19BQk9SVF9TRU5UICkKKwkJaW5mby0+aWNvdW50LnR4YWJvcnQrKzsKKwllbHNlCisJCWluZm8tPmljb3VudC50eHVuZGVyKys7CisJCQkKKwlpbmZvLT50eF9hY3RpdmUgPSAwOworCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKwlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsJCisJCisJaWYgKCBpbmZvLT5kcm9wX3J0c19vbl90eF9kb25lICkgeworCQl1c2NfZ2V0X3NlcmlhbF9zaWduYWxzKCBpbmZvICk7CisJCWlmICggaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUlRTICkgeworCQkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gflNlcmlhbFNpZ25hbF9SVFM7CisJCQl1c2Nfc2V0X3NlcmlhbF9zaWduYWxzKCBpbmZvICk7CisJCX0KKwkJaW5mby0+ZHJvcF9ydHNfb25fdHhfZG9uZSA9IDA7CisJfQorCisjaWZkZWYgQ09ORklHX0hETEMKKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCWhkbGNkZXZfdHhfZG9uZShpbmZvKTsKKwllbHNlIAorI2VuZGlmCisJeworCQlpZiAoaW5mby0+dHR5LT5zdG9wcGVkIHx8IGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJdXNjX3N0b3BfdHJhbnNtaXR0ZXIoaW5mbyk7CisJCQlyZXR1cm47CisJCX0KKwkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9UUkFOU01JVDsKKwl9CisKK30JLyogZW5kIG9mIG1nc2xfaXNyX3RyYW5zbWl0X3N0YXR1cygpICovCisKKy8qIG1nc2xfaXNyX2lvX3BpbigpCisgKiAKKyAqIAlTZXJ2aWNlIGFuIElucHV0L091dHB1dCBwaW4gaW50ZXJydXB0LiBUaGUgdHlwZSBvZgorICogCWludGVycnVwdCBpcyBpbmRpY2F0ZWQgYnkgYml0cyBpbiB0aGUgTUlTUgorICogCQorICogQXJndW1lbnRzOgkJaW5mbwkgICAgICAgcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfaXNyX2lvX3Bpbiggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKyAJc3RydWN0CW1nc2xfaWNvdW50ICppY291bnQ7CisJdTE2IHN0YXR1cyA9IHVzY19JblJlZyggaW5mbywgTUlTUiApOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQkKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9pc3JfaW9fcGluIHN0YXR1cz0lMDRYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sc3RhdHVzKTsKKwkJCQorCXVzY19DbGVhcklycVBlbmRpbmdCaXRzKCBpbmZvLCBJT19QSU4gKTsKKwl1c2NfVW5sYXRjaElvc3RhdHVzQml0cyggaW5mbywgc3RhdHVzICk7CisKKwlpZiAoc3RhdHVzICYgKE1JU0NTVEFUVVNfQ1RTX0xBVENIRUQgfCBNSVNDU1RBVFVTX0RDRF9MQVRDSEVEIHwKKwkgICAgICAgICAgICAgIE1JU0NTVEFUVVNfRFNSX0xBVENIRUQgfCBNSVNDU1RBVFVTX1JJX0xBVENIRUQpICkgeworCQlpY291bnQgPSAmaW5mby0+aWNvdW50OworCQkvKiB1cGRhdGUgaW5wdXQgbGluZSBjb3VudGVycyAqLworCQlpZiAoc3RhdHVzICYgTUlTQ1NUQVRVU19SSV9MQVRDSEVEKSB7CisJCQlpZiAoKGluZm8tPnJpX2Noa2NvdW50KSsrID49IElPX1BJTl9TSFVURE9XTl9MSU1JVCkKKwkJCQl1c2NfRGlzYWJsZXN0YXR1c0lycXMoaW5mbyxTSUNSX1JJKTsKKwkJCWljb3VudC0+cm5nKys7CisJCQlpZiAoIHN0YXR1cyAmIE1JU0NTVEFUVVNfUkkgKQorCQkJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMucmlfdXArKzsJCisJCQllbHNlCisJCQkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5yaV9kb3duKys7CQorCQl9CisJCWlmIChzdGF0dXMgJiBNSVNDU1RBVFVTX0RTUl9MQVRDSEVEKSB7CisJCQlpZiAoKGluZm8tPmRzcl9jaGtjb3VudCkrKyA+PSBJT19QSU5fU0hVVERPV05fTElNSVQpCisJCQkJdXNjX0Rpc2FibGVzdGF0dXNJcnFzKGluZm8sU0lDUl9EU1IpOworCQkJaWNvdW50LT5kc3IrKzsKKwkJCWlmICggc3RhdHVzICYgTUlTQ1NUQVRVU19EU1IgKQorCQkJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuZHNyX3VwKys7CisJCQllbHNlCisJCQkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kc3JfZG93bisrOworCQl9CisJCWlmIChzdGF0dXMgJiBNSVNDU1RBVFVTX0RDRF9MQVRDSEVEKSB7CisJCQlpZiAoKGluZm8tPmRjZF9jaGtjb3VudCkrKyA+PSBJT19QSU5fU0hVVERPV05fTElNSVQpCisJCQkJdXNjX0Rpc2FibGVzdGF0dXNJcnFzKGluZm8sU0lDUl9EQ0QpOworCQkJaWNvdW50LT5kY2QrKzsKKwkJCWlmIChzdGF0dXMgJiBNSVNDU1RBVFVTX0RDRCkgeworCQkJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuZGNkX3VwKys7CisJCQl9IGVsc2UKKwkJCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmRjZF9kb3duKys7CisjaWZkZWYgQ09ORklHX0hETEMKKwkJCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJCQloZGxjX3NldF9jYXJyaWVyKHN0YXR1cyAmIE1JU0NTVEFUVVNfRENELCBpbmZvLT5uZXRkZXYpOworI2VuZGlmCisJCX0KKwkJaWYgKHN0YXR1cyAmIE1JU0NTVEFUVVNfQ1RTX0xBVENIRUQpCisJCXsKKwkJCWlmICgoaW5mby0+Y3RzX2Noa2NvdW50KSsrID49IElPX1BJTl9TSFVURE9XTl9MSU1JVCkKKwkJCQl1c2NfRGlzYWJsZXN0YXR1c0lycXMoaW5mbyxTSUNSX0NUUyk7CisJCQlpY291bnQtPmN0cysrOworCQkJaWYgKCBzdGF0dXMgJiBNSVNDU1RBVFVTX0NUUyApCisJCQkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5jdHNfdXArKzsKKwkJCWVsc2UKKwkJCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmN0c19kb3duKys7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5ldmVudF93YWl0X3EpOworCisJCWlmICggKGluZm8tPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpICYmIAorCQkgICAgIChzdGF0dXMgJiBNSVNDU1RBVFVTX0RDRF9MQVRDSEVEKSApIHsKKwkJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJCQlwcmludGsoIiVzIENEIG5vdyAlcy4uLiIsIGluZm8tPmRldmljZV9uYW1lLAorCQkJCSAgICAgICAoc3RhdHVzICYgTUlTQ1NUQVRVU19EQ0QpID8gIm9uIiA6ICJvZmYiKTsKKwkJCWlmIChzdGF0dXMgJiBNSVNDU1RBVFVTX0RDRCkKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJCQllbHNlIHsKKwkJCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCQkJCXByaW50aygiZG9pbmcgc2VyaWFsIGhhbmd1cC4uLiIpOworCQkJCWlmIChpbmZvLT50dHkpCisJCQkJCXR0eV9oYW5ndXAoaW5mby0+dHR5KTsKKwkJCX0KKwkJfQorCQorCQlpZiAoIChpbmZvLT5mbGFncyAmIEFTWU5DX0NUU19GTE9XKSAmJiAKKwkJICAgICAoc3RhdHVzICYgTUlTQ1NUQVRVU19DVFNfTEFUQ0hFRCkgKSB7CisJCQlpZiAoaW5mby0+dHR5LT5od19zdG9wcGVkKSB7CisJCQkJaWYgKHN0YXR1cyAmIE1JU0NTVEFUVVNfQ1RTKSB7CisJCQkJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJCQkJCXByaW50aygiQ1RTIHR4IHN0YXJ0Li4uIik7CisJCQkJCWlmIChpbmZvLT50dHkpCisJCQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAwOworCQkJCQl1c2Nfc3RhcnRfdHJhbnNtaXR0ZXIoaW5mbyk7CisJCQkJCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfVFJBTlNNSVQ7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICghKHN0YXR1cyAmIE1JU0NTVEFUVVNfQ1RTKSkgeworCQkJCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCQkJCQlwcmludGsoIkNUUyB0eCBzdG9wLi4uIik7CisJCQkJCWlmIChpbmZvLT50dHkpCisJCQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAxOworCQkJCQl1c2Nfc3RvcF90cmFuc21pdHRlcihpbmZvKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1NUQVRVUzsKKwkKKwkvKiBmb3IgZGlhZ25vc3RpY3Mgc2V0IElSUSBmbGFnICovCisJaWYgKCBzdGF0dXMgJiBNSVNDU1RBVFVTX1RYQ19MQVRDSEVEICl7CisJCXVzY19PdXRSZWcoIGluZm8sIFNJQ1IsCisJCQkodW5zaWduZWQgc2hvcnQpKHVzY19JblJlZyhpbmZvLFNJQ1IpICYgfihTSUNSX1RYQ19BQ1RJVkUrU0lDUl9UWENfSU5BQ1RJVkUpKSApOworCQl1c2NfVW5sYXRjaElvc3RhdHVzQml0cyggaW5mbywgTUlTQ1NUQVRVU19UWENfTEFUQ0hFRCApOworCQlpbmZvLT5pcnFfb2NjdXJyZWQgPSAxOworCX0KKworfQkvKiBlbmQgb2YgbWdzbF9pc3JfaW9fcGluKCkgKi8KKworLyogbWdzbF9pc3JfdHJhbnNtaXRfZGF0YSgpCisgKiAKKyAqIAlTZXJ2aWNlIGEgdHJhbnNtaXQgZGF0YSBpbnRlcnJ1cHQgKGFzeW5jIG1vZGUgb25seSkuCisgKiAKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfaXNyX3RyYW5zbWl0X2RhdGEoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQkKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9pc3JfdHJhbnNtaXRfZGF0YSB4bWl0X2NudD0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPnhtaXRfY250KTsKKwkJCQorCXVzY19DbGVhcklycVBlbmRpbmdCaXRzKCBpbmZvLCBUUkFOU01JVF9EQVRBICk7CisJCisJaWYgKGluZm8tPnR0eS0+c3RvcHBlZCB8fCBpbmZvLT50dHktPmh3X3N0b3BwZWQpIHsKKwkJdXNjX3N0b3BfdHJhbnNtaXR0ZXIoaW5mbyk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKCBpbmZvLT54bWl0X2NudCApCisJCXVzY19sb2FkX3R4ZmlmbyggaW5mbyApOworCWVsc2UKKwkJaW5mby0+dHhfYWN0aXZlID0gMDsKKwkJCisJaWYgKGluZm8tPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKQorCQlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1RSQU5TTUlUOworCit9CS8qIGVuZCBvZiBtZ3NsX2lzcl90cmFuc21pdF9kYXRhKCkgKi8KKworLyogbWdzbF9pc3JfcmVjZWl2ZV9kYXRhKCkKKyAqIAorICogCVNlcnZpY2UgYSByZWNlaXZlIGRhdGEgaW50ZXJydXB0LiBUaGlzIG9jY3VycworICogCXdoZW4gb3BlcmF0aW5nIGluIGFzeW5jaHJvbm91cyBpbnRlcnJ1cHQgdHJhbnNmZXIgbW9kZS4KKyAqCVRoZSByZWNlaXZlIGRhdGEgRklGTyBpcyBmbHVzaGVkIHRvIHRoZSByZWNlaXZlIGRhdGEgYnVmZmVycy4gCisgKiAKKyAqIEFyZ3VtZW50czoJCWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2lzcl9yZWNlaXZlX2RhdGEoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJaW50IEZpZm9jb3VudDsKKwl1MTYgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgRGF0YUJ5dGU7CisgCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CisgCXN0cnVjdAltZ3NsX2ljb3VudCAqaWNvdW50ID0gJmluZm8tPmljb3VudDsKKwkKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2lzcl9yZWNlaXZlX2RhdGFcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyk7CisKKwl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggaW5mbywgUkVDRUlWRV9EQVRBICk7CisJCisJLyogc2VsZWN0IEZJRk8gc3RhdHVzIGZvciBSSUNSIHJlYWRiYWNrICovCisJdXNjX1JDbWQoIGluZm8sIFJDbWRfU2VsZWN0UmljclJ4Rmlmb3N0YXR1cyApOworCisJLyogY2xlYXIgdGhlIFdvcmRzdGF0dXMgYml0IHNvIHRoYXQgc3RhdHVzIHJlYWRiYWNrICovCisJLyogb25seSByZWZsZWN0cyB0aGUgc3RhdHVzIG9mIHRoaXMgYnl0ZSAqLworCXVzY19PdXRSZWcoIGluZm8sIFJJQ1IrTFNCT05MWSwgKHUxNikodXNjX0luUmVnKGluZm8sIFJJQ1IrTFNCT05MWSkgJiB+QklUMyApKTsKKworCS8qIGZsdXNoIHRoZSByZWNlaXZlIEZJRk8gKi8KKworCXdoaWxlKCAoRmlmb2NvdW50ID0gKHVzY19JblJlZyhpbmZvLFJJQ1IpID4+IDgpKSApIHsKKwkJLyogcmVhZCBvbmUgYnl0ZSBmcm9tIFJ4RklGTyAqLworCQlvdXR3KCAoaW53KGluZm8tPmlvX2Jhc2UgKyBDQ0FSKSAmIDB4MDc4MCkgfCAoUkRSK0xTQk9OTFkpLAorCQkgICAgICBpbmZvLT5pb19iYXNlICsgQ0NBUiApOworCQlEYXRhQnl0ZSA9IGluYiggaW5mby0+aW9fYmFzZSArIENDQVIgKTsKKworCQkvKiBnZXQgdGhlIHN0YXR1cyBvZiB0aGUgcmVjZWl2ZWQgYnl0ZSAqLworCQlzdGF0dXMgPSB1c2NfSW5SZWcoaW5mbywgUkNTUik7CisJCWlmICggc3RhdHVzICYgKFJYU1RBVFVTX0ZSQU1JTkdfRVJST1IgKyBSWFNUQVRVU19QQVJJVFlfRVJST1IgKworCQkJCVJYU1RBVFVTX09WRVJSVU4gKyBSWFNUQVRVU19CUkVBS19SRUNFSVZFRCkgKQorCQkJdXNjX1VubGF0Y2hSeHN0YXR1c0JpdHMoaW5mbyxSWFNUQVRVU19BTEwpOworCQkKKwkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQorCQkJY29udGludWU7CisJCQkKKwkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBEYXRhQnl0ZTsKKwkJaWNvdW50LT5yeCsrOworCQkKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSAwOworCQlpZiAoIHN0YXR1cyAmIChSWFNUQVRVU19GUkFNSU5HX0VSUk9SICsgUlhTVEFUVVNfUEFSSVRZX0VSUk9SICsKKwkJCQlSWFNUQVRVU19PVkVSUlVOICsgUlhTVEFUVVNfQlJFQUtfUkVDRUlWRUQpICkgeworCQkJcHJpbnRrKCJyeGVycj0lMDRYXG4iLHN0YXR1cyk7CQkJCQkKKwkJCS8qIHVwZGF0ZSBlcnJvciBzdGF0aXN0aWNzICovCisJCQlpZiAoIHN0YXR1cyAmIFJYU1RBVFVTX0JSRUFLX1JFQ0VJVkVEICkgeworCQkJCXN0YXR1cyAmPSB+KFJYU1RBVFVTX0ZSQU1JTkdfRVJST1IgKyBSWFNUQVRVU19QQVJJVFlfRVJST1IpOworCQkJCWljb3VudC0+YnJrKys7CisJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFJYU1RBVFVTX1BBUklUWV9FUlJPUikgCisJCQkJaWNvdW50LT5wYXJpdHkrKzsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIFJYU1RBVFVTX0ZSQU1JTkdfRVJST1IpCisJCQkJaWNvdW50LT5mcmFtZSsrOworCQkJZWxzZSBpZiAoc3RhdHVzICYgUlhTVEFUVVNfT1ZFUlJVTikgeworCQkJCS8qIG11c3QgaXNzdWUgcHVyZ2UgZmlmbyBjbWQgYmVmb3JlICovCisJCQkJLyogMTZDMzIgYWNjZXB0cyBtb3JlIHJlY2VpdmUgY2hhcnMgKi8KKwkJCQl1c2NfUlRDbWQoaW5mbyxSVENtZF9QdXJnZVJ4Rmlmbyk7CisJCQkJaWNvdW50LT5vdmVycnVuKys7CisJCQl9CisKKwkJCS8qIGRpc2NhcmQgY2hhciBpZiB0dHkgY29udHJvbCBmbGFncyBzYXkgc28gKi8JCQkJCQorCQkJaWYgKHN0YXR1cyAmIGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzaykKKwkJCQljb250aW51ZTsKKwkJCQkKKwkJCXN0YXR1cyAmPSBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOworCQkKKwkJCWlmIChzdGF0dXMgJiBSWFNUQVRVU19CUkVBS19SRUNFSVZFRCkgeworCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0JSRUFLOworCQkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX1NBSykKKwkJCQkJZG9fU0FLKHR0eSk7CisJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFJYU1RBVFVTX1BBUklUWV9FUlJPUikKKwkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9QQVJJVFk7CisJCQllbHNlIGlmIChzdGF0dXMgJiBSWFNUQVRVU19GUkFNSU5HX0VSUk9SKQorCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0ZSQU1FOworCQkJaWYgKHN0YXR1cyAmIFJYU1RBVFVTX09WRVJSVU4pIHsKKwkJCQkvKiBPdmVycnVuIGlzIHNwZWNpYWwsIHNpbmNlIGl0J3MKKwkJCQkgKiByZXBvcnRlZCBpbW1lZGlhdGVseSwgYW5kIGRvZXNuJ3QKKwkJCQkgKiBhZmZlY3QgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCisJCQkJICovCisJCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpIHsKKwkJCQkJdHR5LT5mbGlwLmNvdW50Kys7CisJCQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKKwkJCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOworCQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9PVkVSUlVOOworCQkJCX0KKwkJCX0KKwkJfQkvKiBlbmQgb2YgaWYgKGVycm9yKSAqLworCQkKKwkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOworCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7CisJCXR0eS0+ZmxpcC5jb3VudCsrOworCX0KKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkgeworCQlwcmludGsoIiVzKCVkKTptZ3NsX2lzcl9yZWNlaXZlX2RhdGEgZmxpcCBjb3VudD0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLHR0eS0+ZmxpcC5jb3VudCk7CisJCXByaW50aygiJXMoJWQpOnJ4PSVkIGJyaz0lZCBwYXJpdHk9JWQgZnJhbWU9JWQgb3ZlcnJ1bj0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGljb3VudC0+cngsaWNvdW50LT5icmssCisJCQlpY291bnQtPnBhcml0eSxpY291bnQtPmZyYW1lLGljb3VudC0+b3ZlcnJ1bik7CisJfQorCQkJCisJaWYgKCB0dHktPmZsaXAuY291bnQgKQorCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworfQorCisvKiBtZ3NsX2lzcl9taXNjKCkKKyAqIAorICogCVNlcnZpY2UgYSBtaXNjZWxsYW5lb3MgaW50ZXJydXB0IHNvdXJjZS4KKyAqIAkKKyAqIEFyZ3VtZW50czoJCWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGV4dGVuc2lvbiAoaW5zdGFuY2UgZGF0YSkKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2lzcl9taXNjKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCXUxNiBzdGF0dXMgPSB1c2NfSW5SZWcoIGluZm8sIE1JU1IgKTsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkJCisJCXByaW50aygiJXMoJWQpOm1nc2xfaXNyX21pc2Mgc3RhdHVzPSUwNFhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxzdGF0dXMpOworCQkJCisJaWYgKChzdGF0dXMgJiBNSVNDU1RBVFVTX1JDQ19VTkRFUlJVTikgJiYKKwkgICAgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSkgeworCisJCS8qIHR1cm4gb2ZmIHJlY2VpdmVyIGFuZCByeCBETUEgKi8KKwkJdXNjX0VuYWJsZVJlY2VpdmVyKGluZm8sRElTQUJMRV9VTkNPTkRJVElPTkFMKTsKKwkJdXNjX0RtYUNtZChpbmZvLCBEbWFDbWRfUmVzZXRSeENoYW5uZWwpOworCQl1c2NfVW5sYXRjaFJ4c3RhdHVzQml0cyhpbmZvLCBSWFNUQVRVU19BTEwpOworCQl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyhpbmZvLCBSRUNFSVZFX0RBVEEgKyBSRUNFSVZFX1NUQVRVUyk7CisJCXVzY19EaXNhYmxlSW50ZXJydXB0cyhpbmZvLCBSRUNFSVZFX0RBVEEgKyBSRUNFSVZFX1NUQVRVUyk7CisKKwkJLyogc2NoZWR1bGUgQkggaGFuZGxlciB0byByZXN0YXJ0IHJlY2VpdmVyICovCisJCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfUkVDRUlWRTsKKwkJaW5mby0+cnhfcmNjX3VuZGVycnVuID0gMTsKKwl9CisKKwl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggaW5mbywgTUlTQyApOworCXVzY19VbmxhdGNoTWlzY3N0YXR1c0JpdHMoIGluZm8sIHN0YXR1cyApOworCit9CS8qIGVuZCBvZiBtZ3NsX2lzcl9taXNjKCkgKi8KKworLyogbWdzbF9pc3JfbnVsbCgpCisgKgorICogCVNlcnZpY2VzIHVuZGVmaW5lZCBpbnRlcnJ1cHQgdmVjdG9ycyBmcm9tIHRoZQorICogCVVTQy4gKGhlbmNlIHRoaXMgZnVuY3Rpb24gU0hPVUxEIG5ldmVyIGJlIGNhbGxlZCkKKyAqIAorICogQXJndW1lbnRzOgkJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgZXh0ZW5zaW9uIChpbnN0YW5jZSBkYXRhKQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfaXNyX251bGwoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisKK30JLyogZW5kIG9mIG1nc2xfaXNyX251bGwoKSAqLworCisvKiBtZ3NsX2lzcl9yZWNlaXZlX2RtYSgpCisgKiAKKyAqIAlTZXJ2aWNlIGEgcmVjZWl2ZSBETUEgY2hhbm5lbCBpbnRlcnJ1cHQuCisgKiAJRm9yIHRoaXMgZHJpdmVyIHRoZXJlIGFyZSB0d28gc291cmNlcyBvZiByZWNlaXZlIERNQSBpbnRlcnJ1cHRzCisgKiAJYXMgaWRlbnRpZmllZCBpbiB0aGUgUmVjZWl2ZSBETUEgbW9kZSBSZWdpc3RlciAoUkRNUik6CisgKiAKKyAqIAlCSVQzCUVPQS9FT0wJCUVuZCBvZiBMaXN0LCBhbGwgcmVjZWl2ZSBidWZmZXJzIGluIHJlY2VpdmUKKyAqIAkJCQlidWZmZXIgbGlzdCBoYXZlIGJlZW4gZmlsbGVkIChubyBtb3JlIGZyZWUgYnVmZmVycworICogCQkJCWF2YWlsYWJsZSkuIFRoZSBETUEgY29udHJvbGxlciBoYXMgc2h1dCBkb3duLgorICogCisgKiAJQklUMglFT0IJCUVuZCBvZiBCdWZmZXIuIFRoaXMgaW50ZXJydXB0IG9jY3VycyB3aGVuIGEgcmVjZWl2ZQorICogCQkJCURNQSBidWZmZXIgaXMgdGVybWluYXRlZCBpbiByZXNwb25zZSB0byBjb21wbGV0aW9uCisgKiAJCQkJb2YgYSBnb29kIGZyYW1lIG9yIGEgZnJhbWUgd2l0aCBlcnJvcnMuIFRoZSBzdGF0dXMKKyAqIAkJCQlvZiB0aGUgZnJhbWUgaXMgc3RvcmVkIGluIHRoZSBidWZmZXIgZW50cnkgaW4gdGhlCisgKiAJCQkJbGlzdCBvZiByZWNlaXZlIGJ1ZmZlciBlbnRyaWVzLgorICogCisgKiBBcmd1bWVudHM6CQlpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9pc3JfcmVjZWl2ZV9kbWEoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdTE2IHN0YXR1czsKKwkKKwkvKiBjbGVhciBpbnRlcnJ1cHQgcGVuZGluZyBhbmQgSVVTIGJpdCBmb3IgUnggRE1BIElSUSAqLworCXVzY19PdXREbWFSZWcoIGluZm8sIENESVIsIEJJVDkrQklUMSApOworCisJLyogUmVhZCB0aGUgcmVjZWl2ZSBETUEgc3RhdHVzIHRvIGlkZW50aWZ5IGludGVycnVwdCB0eXBlLiAqLworCS8qIFRoaXMgYWxzbyBjbGVhcnMgdGhlIHN0YXR1cyBiaXRzLiAqLworCXN0YXR1cyA9IHVzY19JbkRtYVJlZyggaW5mbywgUkRNUiApOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQkKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9pc3JfcmVjZWl2ZV9kbWEoJXMpIHN0YXR1cz0lMDRYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsc3RhdHVzKTsKKwkJCQorCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfUkVDRUlWRTsKKwkKKwlpZiAoIHN0YXR1cyAmIEJJVDMgKSB7CisJCWluZm8tPnJ4X292ZXJmbG93ID0gMTsKKwkJaW5mby0+aWNvdW50LmJ1Zl9vdmVycnVuKys7CisJfQorCit9CS8qIGVuZCBvZiBtZ3NsX2lzcl9yZWNlaXZlX2RtYSgpICovCisKKy8qIG1nc2xfaXNyX3RyYW5zbWl0X2RtYSgpCisgKgorICoJVGhpcyBmdW5jdGlvbiBzZXJ2aWNlcyBhIHRyYW5zbWl0IERNQSBjaGFubmVsIGludGVycnVwdC4KKyAqCisgKglGb3IgdGhpcyBkcml2ZXIgdGhlcmUgaXMgb25lIHNvdXJjZSBvZiB0cmFuc21pdCBETUEgaW50ZXJydXB0cworICoJYXMgaWRlbnRpZmllZCBpbiB0aGUgVHJhbnNtaXQgRE1BIE1vZGUgUmVnaXN0ZXIgKFRETVIpOgorICoKKyAqICAgICAJQklUMiAgRU9CICAgICAgIEVuZCBvZiBCdWZmZXIuIFRoaXMgaW50ZXJydXB0IG9jY3VycyB3aGVuIGEKKyAqICAgICAJCQl0cmFuc21pdCBETUEgYnVmZmVyIGhhcyBiZWVuIGVtcHRpZWQuCisgKgorICogICAgIAlUaGUgZHJpdmVyIG1haW50YWlucyBlbm91Z2ggdHJhbnNtaXQgRE1BIGJ1ZmZlcnMgdG8gaG9sZCBhdCBsZWFzdAorICogICAgIAlvbmUgbWF4IGZyYW1lIHNpemUgdHJhbnNtaXQgZnJhbWUuIFdoZW4gb3BlcmF0aW5nIGluIGEgYnVmZmVyZWQKKyAqICAgICAJdHJhbnNtaXQgbW9kZSwgdGhlcmUgbWF5IGJlIGVub3VnaCB0cmFuc21pdCBETUEgYnVmZmVycyB0byBob2xkIGF0CisgKiAgICAgCWxlYXN0IHR3byBvciBtb3JlIG1heCBmcmFtZSBzaXplIGZyYW1lcy4gT24gYW4gRU9CIGNvbmRpdGlvbiwKKyAqICAgICAJZGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSBhbnkgcXVldWVkIHRyYW5zbWl0IGJ1ZmZlcnMgYW5kIGNvcHkgaW50bworICogICAgIAl0cmFuc21pdCBETUEgYnVmZmVycyBpZiB3ZSBoYXZlIHJvb20uCisgKgorICogQXJndW1lbnRzOgkJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfaXNyX3RyYW5zbWl0X2RtYSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwl1MTYgc3RhdHVzOworCisJLyogY2xlYXIgaW50ZXJydXB0IHBlbmRpbmcgYW5kIElVUyBiaXQgZm9yIFR4IERNQSBJUlEgKi8KKwl1c2NfT3V0RG1hUmVnKGluZm8sIENESVIsIEJJVDgrQklUMCApOworCisJLyogUmVhZCB0aGUgdHJhbnNtaXQgRE1BIHN0YXR1cyB0byBpZGVudGlmeSBpbnRlcnJ1cHQgdHlwZS4gKi8KKwkvKiBUaGlzIGFsc28gY2xlYXJzIHRoZSBzdGF0dXMgYml0cy4gKi8KKworCXN0YXR1cyA9IHVzY19JbkRtYVJlZyggaW5mbywgVERNUiApOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2lzcl90cmFuc21pdF9kbWEoJXMpIHN0YXR1cz0lMDRYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsc3RhdHVzKTsKKworCWlmICggc3RhdHVzICYgQklUMiApIHsKKwkJLS1pbmZvLT50eF9kbWFfYnVmZmVyc191c2VkOworCisJCS8qIGlmIHRoZXJlIGFyZSB0cmFuc21pdCBmcmFtZXMgcXVldWVkLAorCQkgKiAgdHJ5IHRvIGxvYWQgdGhlIG5leHQgb25lCisJCSAqLworCQlpZiAoIGxvYWRfbmV4dF90eF9ob2xkaW5nX2J1ZmZlcihpbmZvKSApIHsKKwkJCS8qIGlmIGNhbGwgcmV0dXJucyBub24temVybyB2YWx1ZSwgd2UgaGF2ZQorCQkJICogYXQgbGVhc3Qgb25lIGZyZWUgdHggaG9sZGluZyBidWZmZXIKKwkJCSAqLworCQkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9UUkFOU01JVDsKKwkJfQorCX0KKworfQkvKiBlbmQgb2YgbWdzbF9pc3JfdHJhbnNtaXRfZG1hKCkgKi8KKworLyogbWdzbF9pbnRlcnJ1cHQoKQorICogCisgKiAJSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBlbnRyeSBwb2ludC4KKyAqIAkKKyAqIEFyZ3VtZW50czoKKyAqIAorICogCWlycQkJaW50ZXJydXB0IG51bWJlciB0aGF0IGNhdXNlZCBpbnRlcnJ1cHQKKyAqIAlkZXZfaWQJCWRldmljZSBJRCBzdXBwbGllZCBkdXJpbmcgaW50ZXJydXB0IHJlZ2lzdHJhdGlvbgorICogCXJlZ3MJCWludGVycnVwdGVkIHByb2Nlc3NvciBjb250ZXh0CisgKiAJCisgKiBSZXR1cm4gVmFsdWU6IE5vbmUKKyAqLworc3RhdGljIGlycXJldHVybl90IG1nc2xfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm87CisJdTE2IFVzY1ZlY3RvcjsKKwl1MTYgRG1hVmVjdG9yOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQkKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9pbnRlcnJ1cHQoJWQpZW50cnkuXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saXJxKTsKKworCWluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopZGV2X2lkOwkKKwlpZiAoIWluZm8pCisJCXJldHVybiBJUlFfTk9ORTsKKwkJCisJc3Bpbl9sb2NrKCZpbmZvLT5pcnFfc3BpbmxvY2spOworCisJZm9yKDs7KSB7CisJCS8qIFJlYWQgdGhlIGludGVycnVwdCB2ZWN0b3JzIGZyb20gaGFyZHdhcmUuICovCisJCVVzY1ZlY3RvciA9IHVzY19JblJlZyhpbmZvLCBJVlIpID4+IDk7CisJCURtYVZlY3RvciA9IHVzY19JbkRtYVJlZyhpbmZvLCBESVZSKTsKKwkJCisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkJCisJCQlwcmludGsoIiVzKCVkKTolcyBVc2NWZWN0b3I9JTA4WCBEbWFWZWN0b3I9JTA4WFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxVc2NWZWN0b3IsRG1hVmVjdG9yKTsKKwkJCQorCQlpZiAoICFVc2NWZWN0b3IgJiYgIURtYVZlY3RvciApCisJCQlicmVhazsKKwkJCQorCQkvKiBEaXNwYXRjaCBpbnRlcnJ1cHQgdmVjdG9yICovCisJCWlmICggVXNjVmVjdG9yICkKKwkJCSgqVXNjSXNyVGFibGVbVXNjVmVjdG9yXSkoaW5mbyk7CisJCWVsc2UgaWYgKCAoRG1hVmVjdG9yJihCSVQxMHxCSVQ5KSkgPT0gQklUMTApCisJCQltZ3NsX2lzcl90cmFuc21pdF9kbWEoaW5mbyk7CisJCWVsc2UKKwkJCW1nc2xfaXNyX3JlY2VpdmVfZG1hKGluZm8pOworCisJCWlmICggaW5mby0+aXNyX292ZXJmbG93ICkgeworCQkJcHJpbnRrKEtFUk5fRVJSIiVzKCVkKTolcyBpc3Igb3ZlcmZsb3cgaXJxPSVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpcnEpOworCQkJdXNjX0Rpc2FibGVNYXN0ZXJJcnFCaXQoaW5mbyk7CisJCQl1c2NfRGlzYWJsZURtYUludGVycnVwdHMoaW5mbyxESUNSX01BU1RFUik7CisJCQlicmVhazsKKwkJfQorCX0KKwkKKwkvKiBSZXF1ZXN0IGJvdHRvbSBoYWxmIHByb2Nlc3NpbmcgaWYgdGhlcmUncyBzb21ldGhpbmcgCisJICogZm9yIGl0IHRvIGRvIGFuZCB0aGUgYmggaXMgbm90IGFscmVhZHkgcnVubmluZworCSAqLworCisJaWYgKCBpbmZvLT5wZW5kaW5nX2JoICYmICFpbmZvLT5iaF9ydW5uaW5nICYmICFpbmZvLT5iaF9yZXF1ZXN0ZWQgKSB7CisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkJCisJCQlwcmludGsoIiVzKCVkKTolcyBxdWV1ZWluZyBiaCB0YXNrLlxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCXNjaGVkdWxlX3dvcmsoJmluZm8tPnRhc2spOworCQlpbmZvLT5iaF9yZXF1ZXN0ZWQgPSAxOworCX0KKworCXNwaW5fdW5sb2NrKCZpbmZvLT5pcnFfc3BpbmxvY2spOworCQorCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkJCisJCXByaW50aygiJXMoJWQpOm1nc2xfaW50ZXJydXB0KCVkKWV4aXQuXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saXJxKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CS8qIGVuZCBvZiBtZ3NsX2ludGVycnVwdCgpICovCisKKy8qIHN0YXJ0dXAoKQorICogCisgKiAJSW5pdGlhbGl6ZSBhbmQgc3RhcnQgZGV2aWNlLgorICogCQorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBzdGFydHVwKHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8pCit7CisJaW50IHJldHZhbCA9IDA7CisJCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9zdGFydHVwKCVzKVxuIixfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCQorCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKQorCQlyZXR1cm4gMDsKKwkKKwlpZiAoIWluZm8tPnhtaXRfYnVmKSB7CisJCS8qIGFsbG9jYXRlIGEgcGFnZSBvZiBtZW1vcnkgZm9yIGEgdHJhbnNtaXQgYnVmZmVyICovCisJCWluZm8tPnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICghaW5mby0+eG1pdF9idWYpIHsKKwkJCXByaW50ayhLRVJOX0VSUiIlcyglZCk6JXMgY2FuJ3QgYWxsb2NhdGUgdHJhbnNtaXQgYnVmZmVyXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJaW5mby0+cGVuZGluZ19iaCA9IDA7CisJCisJaW5pdF90aW1lcigmaW5mby0+dHhfdGltZXIpOworCWluZm8tPnR4X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbmZvOworCWluZm8tPnR4X3RpbWVyLmZ1bmN0aW9uID0gbWdzbF90eF90aW1lb3V0OworCQorCS8qIEFsbG9jYXRlIGFuZCBjbGFpbSBhZGFwdGVyIHJlc291cmNlcyAqLworCXJldHZhbCA9IG1nc2xfY2xhaW1fcmVzb3VyY2VzKGluZm8pOworCQorCS8qIHBlcmZvcm0gZXhpc3RlbmNlIGNoZWNrIGFuZCBkaWFnbm9zdGljcyAqLworCWlmICggIXJldHZhbCApCisJCXJldHZhbCA9IG1nc2xfYWRhcHRlcl90ZXN0KGluZm8pOworCQkKKwlpZiAoIHJldHZhbCApIHsKKyAgCQlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSAmJiBpbmZvLT50dHkpCisJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQltZ3NsX3JlbGVhc2VfcmVzb3VyY2VzKGluZm8pOworICAJCXJldHVybiByZXR2YWw7CisgIAl9CisKKwkvKiBwcm9ncmFtIGhhcmR3YXJlIGZvciBjdXJyZW50IHBhcmFtZXRlcnMgKi8KKwltZ3NsX2NoYW5nZV9wYXJhbXMoaW5mbyk7CisJCisJaWYgKGluZm8tPnR0eSkKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CisJCisJcmV0dXJuIDA7CisJCit9CS8qIGVuZCBvZiBzdGFydHVwKCkgKi8KKworLyogc2h1dGRvd24oKQorICoKKyAqIENhbGxlZCBieSBtZ3NsX2Nsb3NlKCkgYW5kIG1nc2xfaGFuZ3VwKCkgdG8gc2h1dGRvd24gaGFyZHdhcmUKKyAqCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBzaHV0ZG93bihzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCXJldHVybjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX3NodXRkb3duKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKworCS8qIGNsZWFyIHN0YXR1cyB3YWl0IHF1ZXVlIGJlY2F1c2Ugc3RhdHVzIGNoYW5nZXMgKi8KKwkvKiBjYW4ndCBoYXBwZW4gYWZ0ZXIgc2h1dHRpbmcgZG93biB0aGUgaGFyZHdhcmUgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKworCWRlbF90aW1lcigmaW5mby0+dHhfdGltZXIpOwkKKworCWlmIChpbmZvLT54bWl0X2J1ZikgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGluZm8tPnhtaXRfYnVmKTsKKwkJaW5mby0+eG1pdF9idWYgPSBOVUxMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCXVzY19EaXNhYmxlTWFzdGVySXJxQml0KGluZm8pOworCXVzY19zdG9wX3JlY2VpdmVyKGluZm8pOworCXVzY19zdG9wX3RyYW5zbWl0dGVyKGluZm8pOworCXVzY19EaXNhYmxlSW50ZXJydXB0cyhpbmZvLFJFQ0VJVkVfREFUQSArIFJFQ0VJVkVfU1RBVFVTICsKKwkJVFJBTlNNSVRfREFUQSArIFRSQU5TTUlUX1NUQVRVUyArIElPX1BJTiArIE1JU0MgKTsKKwl1c2NfRGlzYWJsZURtYUludGVycnVwdHMoaW5mbyxESUNSX01BU1RFUiArIERJQ1JfVFJBTlNNSVQgKyBESUNSX1JFQ0VJVkUpOworCQorCS8qIERpc2FibGUgRE1BRU4gKFBvcnQgNywgQml0IDE0KSAqLworCS8qIFRoaXMgZGlzY29ubmVjdHMgdGhlIERNQSByZXF1ZXN0IHNpZ25hbCBmcm9tIHRoZSBJU0EgYnVzICovCisJLyogb24gdGhlIElTQSBhZGFwdGVyLiBUaGlzIGhhcyBubyBlZmZlY3QgZm9yIHRoZSBQQ0kgYWRhcHRlciAqLworCXVzY19PdXRSZWcoaW5mbywgUENSLCAodTE2KSgodXNjX0luUmVnKGluZm8sIFBDUikgfCBCSVQxNSkgfCBCSVQxNCkpOworCQorCS8qIERpc2FibGUgSU5URU4gKFBvcnQgNiwgQml0MTIpICovCisJLyogVGhpcyBkaXNjb25uZWN0cyB0aGUgSVJRIHJlcXVlc3Qgc2lnbmFsIHRvIHRoZSBJU0EgYnVzICovCisJLyogb24gdGhlIElTQSBhZGFwdGVyLiBUaGlzIGhhcyBubyBlZmZlY3QgZm9yIHRoZSBQQ0kgYWRhcHRlciAqLworCXVzY19PdXRSZWcoaW5mbywgUENSLCAodTE2KSgodXNjX0luUmVnKGluZm8sIFBDUikgfCBCSVQxMykgfCBCSVQxMikpOworCQorIAlpZiAoIWluZm8tPnR0eSB8fCBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkgeworIAkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gfihTZXJpYWxTaWduYWxfRFRSICsgU2VyaWFsU2lnbmFsX1JUUyk7CisJCXVzY19zZXRfc2VyaWFsX3NpZ25hbHMoaW5mbyk7CisJfQorCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwltZ3NsX3JlbGVhc2VfcmVzb3VyY2VzKGluZm8pOwkKKwkKKwlpZiAoaW5mby0+dHR5KQorCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCQorfQkvKiBlbmQgb2Ygc2h1dGRvd24oKSAqLworCitzdGF0aWMgdm9pZCBtZ3NsX3Byb2dyYW1faHcoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkKKwl1c2Nfc3RvcF9yZWNlaXZlcihpbmZvKTsKKwl1c2Nfc3RvcF90cmFuc21pdHRlcihpbmZvKTsKKwlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7CisJCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDIHx8CisJICAgIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9SQVcgfHwKKwkgICAgaW5mby0+bmV0Y291bnQpCisJCXVzY19zZXRfc3luY19tb2RlKGluZm8pOworCWVsc2UKKwkJdXNjX3NldF9hc3luY19tb2RlKGluZm8pOworCQkKKwl1c2Nfc2V0X3NlcmlhbF9zaWduYWxzKGluZm8pOworCQorCWluZm8tPmRjZF9jaGtjb3VudCA9IDA7CisJaW5mby0+Y3RzX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5yaV9jaGtjb3VudCA9IDA7CisJaW5mby0+ZHNyX2Noa2NvdW50ID0gMDsKKworCXVzY19FbmFibGVTdGF0dXNJcnFzKGluZm8sU0lDUl9DVFMrU0lDUl9EU1IrU0lDUl9EQ0QrU0lDUl9SSSk7CQkKKwl1c2NfRW5hYmxlSW50ZXJydXB0cyhpbmZvLCBJT19QSU4pOworCXVzY19nZXRfc2VyaWFsX3NpZ25hbHMoaW5mbyk7CisJCQorCWlmIChpbmZvLT5uZXRjb3VudCB8fCBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUkVBRCkKKwkJdXNjX3N0YXJ0X3JlY2VpdmVyKGluZm8pOworCQkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworfQorCisvKiBSZWNvbmZpZ3VyZSBhZGFwdGVyIGJhc2VkIG9uIG5ldyBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfY2hhbmdlX3BhcmFtcyhzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pCit7CisJdW5zaWduZWQgY2ZsYWc7CisJaW50IGJpdHNfcGVyX2NoYXI7CisKKwlpZiAoIWluZm8tPnR0eSB8fCAhaW5mby0+dHR5LT50ZXJtaW9zKQorCQlyZXR1cm47CisJCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2NoYW5nZV9wYXJhbXMoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJIAorCWNmbGFnID0gaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJLyogaWYgQjAgcmF0ZSAoaGFuZ3VwKSBzcGVjaWZpZWQgdGhlbiBuZWdhdGUgRFRSIGFuZCBSVFMgKi8KKwkvKiBvdGhlcndpc2UgYXNzZXJ0IERUUiBhbmQgUlRTICovCisgCWlmIChjZmxhZyAmIENCQVVEKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTICsgU2VyaWFsU2lnbmFsX0RUUjsKKwllbHNlCisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH4oU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFIpOworCQorCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisJCisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJICAgICAgY2FzZSBDUzU6IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA1OyBicmVhazsKKwkgICAgICBjYXNlIENTNjogaW5mby0+cGFyYW1zLmRhdGFfYml0cyA9IDY7IGJyZWFrOworCSAgICAgIGNhc2UgQ1M3OiBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzID0gNzsgYnJlYWs7CisJICAgICAgY2FzZSBDUzg6IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA4OyBicmVhazsKKwkgICAgICAvKiBOZXZlciBoYXBwZW5zLCBidXQgR0NDIGlzIHRvbyBkdW1iIHRvIGZpZ3VyZSBpdCBvdXQgKi8KKwkgICAgICBkZWZhdWx0OiAgaW5mby0+cGFyYW1zLmRhdGFfYml0cyA9IDc7IGJyZWFrOworCSAgICAgIH0KKwkgICAgICAKKwlpZiAoY2ZsYWcgJiBDU1RPUEIpCisJCWluZm8tPnBhcmFtcy5zdG9wX2JpdHMgPSAyOworCWVsc2UKKwkJaW5mby0+cGFyYW1zLnN0b3BfYml0cyA9IDE7CisKKwlpbmZvLT5wYXJhbXMucGFyaXR5ID0gQVNZTkNfUEFSSVRZX05PTkU7CisJaWYgKGNmbGFnICYgUEFSRU5CKSB7CisJCWlmIChjZmxhZyAmIFBBUk9ERCkKKwkJCWluZm8tPnBhcmFtcy5wYXJpdHkgPSBBU1lOQ19QQVJJVFlfT0REOworCQllbHNlCisJCQlpbmZvLT5wYXJhbXMucGFyaXR5ID0gQVNZTkNfUEFSSVRZX0VWRU47CisjaWZkZWYgQ01TUEFSCisJCWlmIChjZmxhZyAmIENNU1BBUikKKwkJCWluZm8tPnBhcmFtcy5wYXJpdHkgPSBBU1lOQ19QQVJJVFlfU1BBQ0U7CisjZW5kaWYKKwl9CisKKwkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGppZmZpZXMgdG8gdHJhbnNtaXQgYSBmdWxsCisJICogRklGTyAoMzIgYnl0ZXMpIGF0IHNwZWNpZmllZCBkYXRhIHJhdGUKKwkgKi8KKwliaXRzX3Blcl9jaGFyID0gaW5mby0+cGFyYW1zLmRhdGFfYml0cyArIAorCQkJaW5mby0+cGFyYW1zLnN0b3BfYml0cyArIDE7CisKKwkvKiBpZiBwb3J0IGRhdGEgcmF0ZSBpcyBzZXQgdG8gNDYwODAwIG9yIGxlc3MgdGhlbgorCSAqIGFsbG93IHR0eSBzZXR0aW5ncyB0byBvdmVycmlkZSwgb3RoZXJ3aXNlIGtlZXAgdGhlCisJICogY3VycmVudCBkYXRhIHJhdGUuCisJICovCisJaWYgKGluZm8tPnBhcmFtcy5kYXRhX3JhdGUgPD0gNDYwODAwKQorCQlpbmZvLT5wYXJhbXMuZGF0YV9yYXRlID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKKwkKKwlpZiAoIGluZm8tPnBhcmFtcy5kYXRhX3JhdGUgKSB7CisJCWluZm8tPnRpbWVvdXQgPSAoMzIqSFoqYml0c19wZXJfY2hhcikgLyAKKwkJCQlpbmZvLT5wYXJhbXMuZGF0YV9yYXRlOworCX0KKwlpbmZvLT50aW1lb3V0ICs9IEhaLzUwOwkJLyogQWRkIC4wMiBzZWNvbmRzIG9mIHNsb3AgKi8KKworCWlmIChjZmxhZyAmIENSVFNDVFMpCisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCWVsc2UKKwkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NUU19GTE9XOworCQkKKwlpZiAoY2ZsYWcgJiBDTE9DQUwpCisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwllbHNlCisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCisJLyogcHJvY2VzcyB0dHkgaW5wdXQgY29udHJvbCBmbGFncyAqLworCQorCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSBSWFNUQVRVU19PVkVSUlVOOworCWlmIChJX0lOUENLKGluZm8tPnR0eSkpCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gUlhTVEFUVVNfUEFSSVRZX0VSUk9SIHwgUlhTVEFUVVNfRlJBTUlOR19FUlJPUjsKKyAJaWYgKElfQlJLSU5UKGluZm8tPnR0eSkgfHwgSV9QQVJNUksoaW5mby0+dHR5KSkKKyAJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gUlhTVEFUVVNfQlJFQUtfUkVDRUlWRUQ7CisJCisJaWYgKElfSUdOUEFSKGluZm8tPnR0eSkpCisJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBSWFNUQVRVU19QQVJJVFlfRVJST1IgfCBSWFNUQVRVU19GUkFNSU5HX0VSUk9SOworCWlmIChJX0lHTkJSSyhpbmZvLT50dHkpKSB7CisJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBSWFNUQVRVU19CUkVBS19SRUNFSVZFRDsKKwkJLyogSWYgaWdub3JpbmcgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLCBpZ25vcmUgCisJCSAqIG92ZXJydW5zIHRvby4gIChGb3IgcmVhbCByYXcgc3VwcG9ydCkuCisJCSAqLworCQlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkKKwkJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBSWFNUQVRVU19PVkVSUlVOOworCX0KKworCW1nc2xfcHJvZ3JhbV9odyhpbmZvKTsKKworfQkvKiBlbmQgb2YgbWdzbF9jaGFuZ2VfcGFyYW1zKCkgKi8KKworLyogbWdzbF9wdXRfY2hhcigpCisgKiAKKyAqIAlBZGQgYSBjaGFyYWN0ZXIgdG8gdGhlIHRyYW5zbWl0IGJ1ZmZlci4KKyAqIAkKKyAqIEFyZ3VtZW50czoJCXR0eQlwb2ludGVyIHRvIHR0eSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqIAkJCWNoCWNoYXJhY3RlciB0byBhZGQgdG8gdHJhbnNtaXQgYnVmZmVyCisgKiAJCQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkgeworCQlwcmludGsoICIlcyglZCk6bWdzbF9wdXRfY2hhciglZCkgb24gJXNcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxjaCxpbmZvLT5kZXZpY2VfbmFtZSk7CisJfQkJCisJCisJaWYgKG1nc2xfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbF9wdXRfY2hhciIpKQorCQlyZXR1cm47CisKKwlpZiAoIXR0eSB8fCAhaW5mby0+eG1pdF9idWYpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQorCWlmICggKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9BU1lOQyApIHx8ICFpbmZvLT50eF9hY3RpdmUgKSB7CisJCisJCWlmIChpbmZvLT54bWl0X2NudCA8IFNFUklBTF9YTUlUX1NJWkUgLSAxKSB7CisJCQlpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X2hlYWQrK10gPSBjaDsKKwkJCWluZm8tPnhtaXRfaGVhZCAmPSBTRVJJQUxfWE1JVF9TSVpFLTE7CisJCQlpbmZvLT54bWl0X2NudCsrOworCQl9CisJfQorCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCit9CS8qIGVuZCBvZiBtZ3NsX3B1dF9jaGFyKCkgKi8KKworLyogbWdzbF9mbHVzaF9jaGFycygpCisgKiAKKyAqIAlFbmFibGUgdHJhbnNtaXR0ZXIgc28gcmVtYWluaW5nIGNoYXJhY3RlcnMgaW4gdGhlCisgKiAJdHJhbnNtaXQgYnVmZmVyIGFyZSBzZW50LgorICogCQorICogQXJndW1lbnRzOgkJdHR5CXBvaW50ZXIgdG8gdHR5IGluZm9ybWF0aW9uIHN0cnVjdHVyZQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQorCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50ayggIiVzKCVkKTptZ3NsX2ZsdXNoX2NoYXJzKCkgZW50cnkgb24gJXMgeG1pdF9jbnQ9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxpbmZvLT54bWl0X2NudCk7CisJCisJaWYgKG1nc2xfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbF9mbHVzaF9jaGFycyIpKQorCQlyZXR1cm47CisKKwlpZiAoaW5mby0+eG1pdF9jbnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkIHx8CisJICAgICFpbmZvLT54bWl0X2J1ZikKKwkJcmV0dXJuOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfZmx1c2hfY2hhcnMoKSBlbnRyeSBvbiAlcyBzdGFydGluZyB0cmFuc21pdHRlclxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lICk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkKKwlpZiAoIWluZm8tPnR4X2FjdGl2ZSkgeworCQlpZiAoIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyB8fAorCQkJaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX1JBVykgJiYgaW5mby0+eG1pdF9jbnQgKSB7CisJCQkvKiBvcGVyYXRpbmcgaW4gc3luY2hyb25vdXMgKGZyYW1lIG9yaWVudGVkKSBtb2RlICovCisJCQkvKiBjb3B5IGRhdGEgZnJvbSBjaXJjdWxhciB4bWl0X2J1ZiB0byAqLworCQkJLyogdHJhbnNtaXQgRE1BIGJ1ZmZlci4gKi8KKwkJCW1nc2xfbG9hZF90eF9kbWFfYnVmZmVyKGluZm8sCisJCQkJIGluZm8tPnhtaXRfYnVmLGluZm8tPnhtaXRfY250KTsKKwkJfQorCSAJdXNjX3N0YXJ0X3RyYW5zbWl0dGVyKGluZm8pOworCX0KKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQorfQkvKiBlbmQgb2YgbWdzbF9mbHVzaF9jaGFycygpICovCisKKy8qIG1nc2xfd3JpdGUoKQorICogCisgKiAJU2VuZCBhIGJsb2NrIG9mIGRhdGEKKyAqIAkKKyAqIEFyZ3VtZW50czoKKyAqIAorICogCXR0eQkJcG9pbnRlciB0byB0dHkgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKiAJYnVmCQlwb2ludGVyIHRvIGJ1ZmZlciBjb250YWluaW5nIHNlbmQgZGF0YQorICogCWNvdW50CQlzaXplIG9mIHNlbmQgZGF0YSBpbiBieXRlcworICogCQorICogUmV0dXJuIFZhbHVlOgludW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuCisgKi8KK3N0YXRpYyBpbnQgbWdzbF93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludAljLCByZXQgPSAwOworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfd3JpdGUoJXMpIGNvdW50PSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsY291bnQpOworCQorCWlmIChtZ3NsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xfd3JpdGUiKSkKKwkJZ290byBjbGVhbnVwOworCisJaWYgKCF0dHkgfHwgIWluZm8tPnhtaXRfYnVmIHx8ICF0bXBfYnVmKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDIHx8CisJCQlpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfUkFXICkgeworCQkvKiBvcGVyYXRpbmcgaW4gc3luY2hyb25vdXMgKGZyYW1lIG9yaWVudGVkKSBtb2RlICovCisJCS8qIG9wZXJhdGluZyBpbiBzeW5jaHJvbm91cyAoZnJhbWUgb3JpZW50ZWQpIG1vZGUgKi8KKwkJaWYgKGluZm8tPnR4X2FjdGl2ZSkgeworCisJCQlpZiAoIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDICkgeworCQkJCXJldCA9IDA7CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQkJLyogdHJhbnNtaXR0ZXIgaXMgYWN0aXZlbHkgc2VuZGluZyBkYXRhIC0KKwkJCSAqIGlmIHdlIGhhdmUgbXVsdGlwbGUgdHJhbnNtaXQgZG1hIGFuZAorCQkJICogaG9sZGluZyBidWZmZXJzLCBhdHRlbXB0IHRvIHF1ZXVlIHRoaXMKKwkJCSAqIGZyYW1lIGZvciB0cmFuc21pc3Npb24gYXQgYSBsYXRlciB0aW1lLgorCQkJICovCisJCQlpZiAoaW5mby0+dHhfaG9sZGluZ19jb3VudCA+PSBpbmZvLT5udW1fdHhfaG9sZGluZ19idWZmZXJzICkgeworCQkJCS8qIG5vIHR4IGhvbGRpbmcgYnVmZmVycyBhdmFpbGFibGUgKi8KKwkJCQlyZXQgPSAwOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKworCQkJLyogcXVldWUgdHJhbnNtaXQgZnJhbWUgcmVxdWVzdCAqLworCQkJcmV0ID0gY291bnQ7CisJCQlzYXZlX3R4X2J1ZmZlcl9yZXF1ZXN0KGluZm8sYnVmLGNvdW50KTsKKworCQkJLyogaWYgd2UgaGF2ZSBzdWZmaWNpZW50IHR4IGRtYSBidWZmZXJzLAorCQkJICogbG9hZCB0aGUgbmV4dCBidWZmZXJlZCB0eCByZXF1ZXN0CisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQkJbG9hZF9uZXh0X3R4X2hvbGRpbmdfYnVmZmVyKGluZm8pOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQorCQkvKiBpZiBvcGVyYXRpbmcgaW4gSERMQyBMb29wTW9kZSBhbmQgdGhlIGFkYXB0ZXIgICovCisJCS8qIGhhcyB5ZXQgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbG9vcCwgd2UgY2FuJ3QgKi8KKwkJLyogdHJhbnNtaXQJCQkJCSAgKi8KKworCQlpZiAoIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfSERMQ19MT09QTU9ERSkgJiYKKwkJCSF1c2NfbG9vcG1vZGVfYWN0aXZlKGluZm8pICkKKwkJeworCQkJcmV0ID0gMDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCWlmICggaW5mby0+eG1pdF9jbnQgKSB7CisJCQkvKiBTZW5kIGFjY3VtdWxhdGVkIGZyb20gc2VuZF9jaGFyKCkgY2FsbHMgKi8KKwkJCS8qIGFzIGZyYW1lIGFuZCB3YWl0IGJlZm9yZSBhY2NlcHRpbmcgbW9yZSBkYXRhLiAqLworCQkJcmV0ID0gMDsKKwkJCQorCQkJLyogY29weSBkYXRhIGZyb20gY2lyY3VsYXIgeG1pdF9idWYgdG8gKi8KKwkJCS8qIHRyYW5zbWl0IERNQSBidWZmZXIuICovCisJCQltZ3NsX2xvYWRfdHhfZG1hX2J1ZmZlcihpbmZvLAorCQkJCWluZm8tPnhtaXRfYnVmLGluZm8tPnhtaXRfY250KTsKKwkJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCQkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfd3JpdGUoJXMpIHN5bmMgeG1pdF9jbnQgZmx1c2hpbmdcbiIsCisJCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCQkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfd3JpdGUoJXMpIHN5bmMgdHJhbnNtaXQgYWNjZXB0ZWRcbiIsCisJCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJCXJldCA9IGNvdW50OworCQkJaW5mby0+eG1pdF9jbnQgPSBjb3VudDsKKwkJCW1nc2xfbG9hZF90eF9kbWFfYnVmZmVyKGluZm8sYnVmLGNvdW50KTsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICgxKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCWMgPSBtaW5fdChpbnQsIGNvdW50LAorCQkJCW1pbihTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxLAorCQkJCSAgICBTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9oZWFkKSk7CisJCQlpZiAoYyA8PSAwKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1lbWNweShpbmZvLT54bWl0X2J1ZiArIGluZm8tPnhtaXRfaGVhZCwgYnVmLCBjKTsKKwkJCWluZm8tPnhtaXRfaGVhZCA9ICgoaW5mby0+eG1pdF9oZWFkICsgYykgJgorCQkJCQkgICAoU0VSSUFMX1hNSVRfU0laRS0xKSk7CisJCQlpbmZvLT54bWl0X2NudCArPSBjOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCWJ1ZiArPSBjOworCQkJY291bnQgLT0gYzsKKwkJCXJldCArPSBjOworCQl9CisJfQkKKwkKKyAJaWYgKGluZm8tPnhtaXRfY250ICYmICF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJaWYgKCFpbmZvLT50eF9hY3RpdmUpCisJCSAJdXNjX3N0YXJ0X3RyYW5zbWl0dGVyKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworIAl9CitjbGVhbnVwOgkKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoICIlcyglZCk6bWdzbF93cml0ZSglcykgcmV0dXJuaW5nPSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUscmV0KTsKKwkJCQorCXJldHVybiByZXQ7CisJCit9CS8qIGVuZCBvZiBtZ3NsX3dyaXRlKCkgKi8KKworLyogbWdzbF93cml0ZV9yb29tKCkKKyAqCisgKglSZXR1cm4gdGhlIGNvdW50IG9mIGZyZWUgYnl0ZXMgaW4gdHJhbnNtaXQgYnVmZmVyCisgKiAJCisgKiBBcmd1bWVudHM6CQl0dHkJcG9pbnRlciB0byB0dHkgaW5mbyBzdHJ1Y3R1cmUKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgaW50IG1nc2xfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCWludAlyZXQ7CisJCQkJCisJaWYgKG1nc2xfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbF93cml0ZV9yb29tIikpCisJCXJldHVybiAwOworCXJldCA9IFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDE7CisJaWYgKHJldCA8IDApCisJCXJldCA9IDA7CisJCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX3dyaXRlX3Jvb20oJXMpPSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSxyZXQgKTsKKwkJCSAKKwlpZiAoIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDIHx8CisJCWluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9SQVcgKSB7CisJCS8qIG9wZXJhdGluZyBpbiBzeW5jaHJvbm91cyAoZnJhbWUgb3JpZW50ZWQpIG1vZGUgKi8KKwkJaWYgKCBpbmZvLT50eF9hY3RpdmUgKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiBIRExDX01BWF9GUkFNRV9TSVpFOworCX0KKwkKKwlyZXR1cm4gcmV0OworCQorfQkvKiBlbmQgb2YgbWdzbF93cml0ZV9yb29tKCkgKi8KKworLyogbWdzbF9jaGFyc19pbl9idWZmZXIoKQorICoKKyAqCVJldHVybiB0aGUgY291bnQgb2YgYnl0ZXMgaW4gdHJhbnNtaXQgYnVmZmVyCisgKiAJCisgKiBBcmd1bWVudHM6CQl0dHkJcG9pbnRlciB0byB0dHkgaW5mbyBzdHJ1Y3R1cmUKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgaW50IG1nc2xfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCQkgCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfY2hhcnNfaW5fYnVmZmVyKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwlpZiAobWdzbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NsX2NoYXJzX2luX2J1ZmZlciIpKQorCQlyZXR1cm4gMDsKKwkJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfY2hhcnNfaW5fYnVmZmVyKCVzKT0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsaW5mby0+eG1pdF9jbnQgKTsKKwkJCSAKKwlpZiAoIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDIHx8CisJCWluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9SQVcgKSB7CisJCS8qIG9wZXJhdGluZyBpbiBzeW5jaHJvbm91cyAoZnJhbWUgb3JpZW50ZWQpIG1vZGUgKi8KKwkJaWYgKCBpbmZvLT50eF9hY3RpdmUgKQorCQkJcmV0dXJuIGluZm8tPm1heF9mcmFtZV9zaXplOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9CisJCQkgCisJcmV0dXJuIGluZm8tPnhtaXRfY250OworfQkvKiBlbmQgb2YgbWdzbF9jaGFyc19pbl9idWZmZXIoKSAqLworCisvKiBtZ3NsX2ZsdXNoX2J1ZmZlcigpCisgKgorICoJRGlzY2FyZCBhbGwgZGF0YSBpbiB0aGUgc2VuZCBidWZmZXIKKyAqIAkKKyAqIEFyZ3VtZW50czoJCXR0eQlwb2ludGVyIHRvIHR0eSBpbmZvIHN0cnVjdHVyZQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9mbHVzaF9idWZmZXIoJXMpIGVudHJ5XG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQorCWlmIChtZ3NsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xfZmx1c2hfYnVmZmVyIikpCisJCXJldHVybjsKKwkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7IAorCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKwlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJdHR5X3dha2V1cCh0dHkpOworfQorCisvKiBtZ3NsX3NlbmRfeGNoYXIoKQorICoKKyAqCVNlbmQgYSBoaWdoLXByaW9yaXR5IFhPTi9YT0ZGIGNoYXJhY3RlcgorICogCQorICogQXJndW1lbnRzOgkJdHR5CXBvaW50ZXIgdG8gdHR5IGluZm8gc3RydWN0dXJlCisgKgkJCWNoCWNoYXJhY3RlciB0byBzZW5kCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX3NlbmRfeGNoYXIoJXMsJWQpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgY2ggKTsKKwkJCSAKKwlpZiAobWdzbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NsX3NlbmRfeGNoYXIiKSkKKwkJcmV0dXJuOworCisJaW5mby0+eF9jaGFyID0gY2g7CisJaWYgKGNoKSB7CisJCS8qIE1ha2Ugc3VyZSB0cmFuc21pdCBpbnRlcnJ1cHRzIGFyZSBvbiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJaWYgKCFpbmZvLT50eF9lbmFibGVkKQorCQkgCXVzY19zdGFydF90cmFuc21pdHRlcihpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwl9Cit9CS8qIGVuZCBvZiBtZ3NsX3NlbmRfeGNoYXIoKSAqLworCisvKiBtZ3NsX3Rocm90dGxlKCkKKyAqIAorICogCVNpZ25hbCByZW1vdGUgZGV2aWNlIHRvIHRocm90dGxlIHNlbmQgZGF0YSAob3VyIHJlY2VpdmUgZGF0YSkKKyAqIAkKKyAqIEFyZ3VtZW50czoJCXR0eQlwb2ludGVyIHRvIHR0eSBpbmZvIHN0cnVjdHVyZQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF90aHJvdHRsZSglcykgZW50cnlcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwlpZiAobWdzbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NsX3Rocm90dGxlIikpCisJCXJldHVybjsKKwkKKwlpZiAoSV9JWE9GRih0dHkpKQorCQltZ3NsX3NlbmRfeGNoYXIodHR5LCBTVE9QX0NIQVIodHR5KSk7CisgCisgCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+U2VyaWFsU2lnbmFsX1JUUzsKKwkgCXVzY19zZXRfc2VyaWFsX3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJfQorfQkvKiBlbmQgb2YgbWdzbF90aHJvdHRsZSgpICovCisKKy8qIG1nc2xfdW50aHJvdHRsZSgpCisgKiAKKyAqIAlTaWduYWwgcmVtb3RlIGRldmljZSB0byBzdG9wIHRocm90dGxpbmcgc2VuZCBkYXRhIChvdXIgcmVjZWl2ZSBkYXRhKQorICogCQorICogQXJndW1lbnRzOgkJdHR5CXBvaW50ZXIgdG8gdHR5IGluZm8gc3RydWN0dXJlCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfdW50aHJvdHRsZSglcykgZW50cnlcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwlpZiAobWdzbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NsX3VudGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCQorCWlmIChJX0lYT0ZGKHR0eSkpIHsKKwkJaWYgKGluZm8tPnhfY2hhcikKKwkJCWluZm8tPnhfY2hhciA9IDA7CisJCWVsc2UKKwkJCW1nc2xfc2VuZF94Y2hhcih0dHksIFNUQVJUX0NIQVIodHR5KSk7CisJfQorCQorIAlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUzsKKwkgCXVzY19zZXRfc2VyaWFsX3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJfQorCQorfQkvKiBlbmQgb2YgbWdzbF91bnRocm90dGxlKCkgKi8KKworLyogbWdzbF9nZXRfc3RhdHMoKQorICogCisgKiAJZ2V0IHRoZSBjdXJyZW50IHNlcmlhbCBwYXJhbWV0ZXJzIGluZm9ybWF0aW9uCisgKgorICogQXJndW1lbnRzOglpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJCXVzZXJfaWNvdW50CXBvaW50ZXIgdG8gYnVmZmVyIHRvIGhvbGQgcmV0dXJuZWQgc3RhdHMKKyAqIAkKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IG1nc2xfZ2V0X3N0YXRzKHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8sIHN0cnVjdCBtZ3NsX2ljb3VudCBfX3VzZXIgKnVzZXJfaWNvdW50KQoreworCWludCBlcnI7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfZ2V0X3BhcmFtcyglcylcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lKTsKKwkJCQorCUNPUFlfVE9fVVNFUihlcnIsdXNlcl9pY291bnQsICZpbmZvLT5pY291bnQsIHNpemVvZihzdHJ1Y3QgbWdzbF9pY291bnQpKTsKKwlpZiAoZXJyKSB7CisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCQlwcmludGsoICIlcyglZCk6bWdzbF9nZXRfc3RhdHMoJXMpIHVzZXIgYnVmZmVyIGNvcHkgZmFpbGVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCQorCXJldHVybiAwOworCQorfQkvKiBlbmQgb2YgbWdzbF9nZXRfc3RhdHMoKSAqLworCisvKiBtZ3NsX2dldF9wYXJhbXMoKQorICogCisgKiAJZ2V0IHRoZSBjdXJyZW50IHNlcmlhbCBwYXJhbWV0ZXJzIGluZm9ybWF0aW9uCisgKgorICogQXJndW1lbnRzOglpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJCXVzZXJfcGFyYW1zCXBvaW50ZXIgdG8gYnVmZmVyIHRvIGhvbGQgcmV0dXJuZWQgcGFyYW1zCisgKiAJCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBtZ3NsX2dldF9wYXJhbXMoc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbywgTUdTTF9QQVJBTVMgX191c2VyICp1c2VyX3BhcmFtcykKK3sKKwlpbnQgZXJyOworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2dldF9wYXJhbXMoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSk7CisJCQkKKwlDT1BZX1RPX1VTRVIoZXJyLHVzZXJfcGFyYW1zLCAmaW5mby0+cGFyYW1zLCBzaXplb2YoTUdTTF9QQVJBTVMpKTsKKwlpZiAoZXJyKSB7CisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCQlwcmludGsoICIlcyglZCk6bWdzbF9nZXRfcGFyYW1zKCVzKSB1c2VyIGJ1ZmZlciBjb3B5IGZhaWxlZFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkKKwlyZXR1cm4gMDsKKwkKK30JLyogZW5kIG9mIG1nc2xfZ2V0X3BhcmFtcygpICovCisKKy8qIG1nc2xfc2V0X3BhcmFtcygpCisgKiAKKyAqIAlzZXQgdGhlIHNlcmlhbCBwYXJhbWV0ZXJzCisgKiAJCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIAlpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJbmV3X3BhcmFtcwl1c2VyIGJ1ZmZlciBjb250YWluaW5nIG5ldyBzZXJpYWwgcGFyYW1zCisgKgorICogUmV0dXJuIFZhbHVlOgkwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9zZXRfcGFyYW1zKHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8sIE1HU0xfUEFSQU1TIF9fdXNlciAqbmV3X3BhcmFtcykKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlNR1NMX1BBUkFNUyB0bXBfcGFyYW1zOworCWludCBlcnI7CisgCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfc2V0X3BhcmFtcyAlc1xuIiwgX19GSUxFX18sX19MSU5FX18sCisJCQlpbmZvLT5kZXZpY2VfbmFtZSApOworCUNPUFlfRlJPTV9VU0VSKGVyciwmdG1wX3BhcmFtcywgbmV3X3BhcmFtcywgc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJaWYgKGVycikgeworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfc2V0X3BhcmFtcyglcykgdXNlciBidWZmZXIgY29weSBmYWlsZWRcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJbWVtY3B5KCZpbmZvLT5wYXJhbXMsJnRtcF9wYXJhbXMsc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkKKyAJbWdzbF9jaGFuZ2VfcGFyYW1zKGluZm8pOworCQorCXJldHVybiAwOworCQorfQkvKiBlbmQgb2YgbWdzbF9zZXRfcGFyYW1zKCkgKi8KKworLyogbWdzbF9nZXRfdHhpZGxlKCkKKyAqIAorICogCWdldCB0aGUgY3VycmVudCB0cmFuc21pdCBpZGxlIG1vZGUKKyAqCisgKiBBcmd1bWVudHM6CWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIAkJaWRsZV9tb2RlCXBvaW50ZXIgdG8gYnVmZmVyIHRvIGhvbGQgcmV0dXJuZWQgaWRsZSBtb2RlCisgKiAJCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBtZ3NsX2dldF90eGlkbGUoc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbywgaW50IF9fdXNlciAqaWRsZV9tb2RlKQoreworCWludCBlcnI7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfZ2V0X3R4aWRsZSglcyk9JWRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pZGxlX21vZGUpOworCQkJCisJQ09QWV9UT19VU0VSKGVycixpZGxlX21vZGUsICZpbmZvLT5pZGxlX21vZGUsIHNpemVvZihpbnQpKTsKKwlpZiAoZXJyKSB7CisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCQlwcmludGsoICIlcyglZCk6bWdzbF9nZXRfdHhpZGxlKCVzKSB1c2VyIGJ1ZmZlciBjb3B5IGZhaWxlZFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkKKwlyZXR1cm4gMDsKKwkKK30JLyogZW5kIG9mIG1nc2xfZ2V0X3R4aWRsZSgpICovCisKKy8qIG1nc2xfc2V0X3R4aWRsZSgpCXNlcnZpY2UgaW9jdGwgdG8gc2V0IHRyYW5zbWl0IGlkbGUgbW9kZQorICogCQorICogQXJndW1lbnRzOgkgCWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIAkJCWlkbGVfbW9kZQluZXcgaWRsZSBtb2RlCisgKgorICogUmV0dXJuIFZhbHVlOgkwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9zZXRfdHhpZGxlKHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8sIGludCBpZGxlX21vZGUpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfc2V0X3R4aWRsZSglcywlZClcbiIsIF9fRklMRV9fLF9fTElORV9fLAorCQkJaW5mby0+ZGV2aWNlX25hbWUsIGlkbGVfbW9kZSApOworCQkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJaW5mby0+aWRsZV9tb2RlID0gaWRsZV9tb2RlOworCXVzY19zZXRfdHhpZGxlKCBpbmZvICk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKKwkKK30JLyogZW5kIG9mIG1nc2xfc2V0X3R4aWRsZSgpICovCisKKy8qIG1nc2xfdHhlbmFibGUoKQorICogCisgKiAJZW5hYmxlIG9yIGRpc2FibGUgdGhlIHRyYW5zbWl0dGVyCisgKiAJCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIAlpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJZW5hYmxlCQkxID0gZW5hYmxlLCAwID0gZGlzYWJsZQorICoKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IG1nc2xfdHhlbmFibGUoc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbywgaW50IGVuYWJsZSkKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF90eGVuYWJsZSglcywlZClcbiIsIF9fRklMRV9fLF9fTElORV9fLAorCQkJaW5mby0+ZGV2aWNlX25hbWUsIGVuYWJsZSk7CisJCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwlpZiAoIGVuYWJsZSApIHsKKwkJaWYgKCAhaW5mby0+dHhfZW5hYmxlZCApIHsKKworCQkJdXNjX3N0YXJ0X3RyYW5zbWl0dGVyKGluZm8pOworCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJICogaWYgSERMQy9TRExDIExvb3AgbW9kZSwgYXR0ZW1wdCB0byBpbnNlcnQgdGhlCisJCQkgKiBzdGF0aW9uIGluIHRoZSAnbG9vcCcgYnkgc2V0dGluZyBDTVI6MTMuIFVwb24KKwkJCSAqIHJlY2VpcHQgb2YgdGhlIG5leHQgR29BaGVhZCAoUnhBYm9ydCkgc2VxdWVuY2UsCisJCQkgKiB0aGUgT25Mb29wIGluZGljYXRvciAoQ0NTUjo3KSBzaG91bGQgZ28gYWN0aXZlCisJCQkgKiB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBvbiB0aGUgbG9vcAorCQkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQlpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19IRExDX0xPT1BNT0RFICkKKwkJCQl1c2NfbG9vcG1vZGVfaW5zZXJ0X3JlcXVlc3QoIGluZm8gKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICggaW5mby0+dHhfZW5hYmxlZCApCisJCQl1c2Nfc3RvcF90cmFuc21pdHRlcihpbmZvKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKKwkKK30JLyogZW5kIG9mIG1nc2xfdHhlbmFibGUoKSAqLworCisvKiBtZ3NsX3R4YWJvcnQoKQlhYm9ydCBzZW5kIEhETEMgZnJhbWUKKyAqIAkKKyAqIEFyZ3VtZW50czoJIAlpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBtZ3NsX3R4YWJvcnQoc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbykKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF90eGFib3J0KCVzKVxuIiwgX19GSUxFX18sX19MSU5FX18sCisJCQlpbmZvLT5kZXZpY2VfbmFtZSk7CisJCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwlpZiAoIGluZm8tPnR4X2FjdGl2ZSAmJiBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyApCisJeworCQlpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19IRExDX0xPT1BNT0RFICkKKwkJCXVzY19sb29wbW9kZV9jYW5jZWxfdHJhbnNtaXQoIGluZm8gKTsKKwkJZWxzZQorCQkJdXNjX1RDbWQoaW5mbyxUQ21kX1NlbmRBYm9ydCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJcmV0dXJuIDA7CisJCit9CS8qIGVuZCBvZiBtZ3NsX3R4YWJvcnQoKSAqLworCisvKiBtZ3NsX3J4ZW5hYmxlKCkgCWVuYWJsZSBvciBkaXNhYmxlIHRoZSByZWNlaXZlcgorICogCQorICogQXJndW1lbnRzOgkgCWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIAkJCWVuYWJsZQkJMSA9IGVuYWJsZSwgMCA9IGRpc2FibGUKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IG1nc2xfcnhlbmFibGUoc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbywgaW50IGVuYWJsZSkKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9yeGVuYWJsZSglcywlZClcbiIsIF9fRklMRV9fLF9fTElORV9fLAorCQkJaW5mby0+ZGV2aWNlX25hbWUsIGVuYWJsZSk7CisJCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwlpZiAoIGVuYWJsZSApIHsKKwkJaWYgKCAhaW5mby0+cnhfZW5hYmxlZCApCisJCQl1c2Nfc3RhcnRfcmVjZWl2ZXIoaW5mbyk7CisJfSBlbHNlIHsKKwkJaWYgKCBpbmZvLT5yeF9lbmFibGVkICkKKwkJCXVzY19zdG9wX3JlY2VpdmVyKGluZm8pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworCQorfQkvKiBlbmQgb2YgbWdzbF9yeGVuYWJsZSgpICovCisKKy8qIG1nc2xfd2FpdF9ldmVudCgpIAl3YWl0IGZvciBzcGVjaWZpZWQgZXZlbnQgdG8gb2NjdXIKKyAqIAkKKyAqIEFyZ3VtZW50czoJIAlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIAkJCW1hc2sJcG9pbnRlciB0byBiaXRtYXNrIG9mIGV2ZW50cyB0byB3YWl0IGZvcgorICogUmV0dXJuIFZhbHVlOgkwIAlpZiBzdWNjZXNzZnVsIGFuZCBiaXQgbWFzayB1cGRhdGVkIHdpdGgKKyAqCQkJCW9mIGV2ZW50cyB0cmlnZ2VycmVkLAorICogCQkJb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBtZ3NsX3dhaXRfZXZlbnQoc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbywgaW50IF9fdXNlciAqIG1hc2tfcHRyKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzOworCWludCByYz0wOworCXN0cnVjdCBtZ3NsX2ljb3VudCBjcHJldiwgY25vdzsKKwlpbnQgZXZlbnRzOworCWludCBtYXNrOworCXN0cnVjdAlfaW5wdXRfc2lnbmFsX2V2ZW50cyBvbGRzaWdzLCBuZXdzaWdzOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJQ09QWV9GUk9NX1VTRVIocmMsJm1hc2ssIG1hc2tfcHRyLCBzaXplb2YoaW50KSk7CisJaWYgKHJjKSB7CisJCXJldHVybiAgLUVGQVVMVDsKKwl9CisJCSAKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF93YWl0X2V2ZW50KCVzLCVkKVxuIiwgX19GSUxFX18sX19MSU5FX18sCisJCQlpbmZvLT5kZXZpY2VfbmFtZSwgbWFzayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCS8qIHJldHVybiBpbW1lZGlhdGVseSBpZiBzdGF0ZSBtYXRjaGVzIHJlcXVlc3RlZCBldmVudHMgKi8KKwl1c2NfZ2V0X3NlcmlhbF9zaWduYWxzKGluZm8pOworCXMgPSBpbmZvLT5zZXJpYWxfc2lnbmFsczsKKwlldmVudHMgPSBtYXNrICYKKwkJKCAoKHMgJiBTZXJpYWxTaWduYWxfRFNSKSA/IE1nc2xFdmVudF9Ec3JBY3RpdmU6TWdzbEV2ZW50X0RzckluYWN0aXZlKSArCisgCQkgICgocyAmIFNlcmlhbFNpZ25hbF9EQ0QpID8gTWdzbEV2ZW50X0RjZEFjdGl2ZTpNZ3NsRXZlbnRfRGNkSW5hY3RpdmUpICsKKwkJICAoKHMgJiBTZXJpYWxTaWduYWxfQ1RTKSA/IE1nc2xFdmVudF9DdHNBY3RpdmU6TWdzbEV2ZW50X0N0c0luYWN0aXZlKSArCisJCSAgKChzICYgU2VyaWFsU2lnbmFsX1JJKSAgPyBNZ3NsRXZlbnRfUmlBY3RpdmUgOk1nc2xFdmVudF9SaUluYWN0aXZlKSApOworCWlmIChldmVudHMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIHNhdmUgY3VycmVudCBpcnEgY291bnRzICovCisJY3ByZXYgPSBpbmZvLT5pY291bnQ7CisJb2xkc2lncyA9IGluZm8tPmlucHV0X3NpZ25hbF9ldmVudHM7CisJCisJLyogZW5hYmxlIGh1bnQgYW5kIGlkbGUgaXJxcyBpZiBuZWVkZWQgKi8KKwlpZiAobWFzayAmIChNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlICsgTWdzbEV2ZW50X0lkbGVSZWNlaXZlZCkpIHsKKwkJdTE2IG9sZHJlZyA9IHVzY19JblJlZyhpbmZvLFJJQ1IpOworCQl1MTYgbmV3cmVnID0gb2xkcmVnICsKKwkJCSAobWFzayAmIE1nc2xFdmVudF9FeGl0SHVudE1vZGUgPyBSWFNUQVRVU19FWElURURfSFVOVDowKSArCisJCQkgKG1hc2sgJiBNZ3NsRXZlbnRfSWRsZVJlY2VpdmVkID8gUlhTVEFUVVNfSURMRV9SRUNFSVZFRDowKTsKKwkJaWYgKG9sZHJlZyAhPSBuZXdyZWcpCisJCQl1c2NfT3V0UmVnKGluZm8sIFJJQ1IsIG5ld3JlZyk7CisJfQorCQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJYWRkX3dhaXRfcXVldWUoJmluZm8tPmV2ZW50X3dhaXRfcSwgJndhaXQpOworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCisKKwlmb3IoOzspIHsKKwkJc2NoZWR1bGUoKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCQkKKwkJLyogZ2V0IGN1cnJlbnQgaXJxIGNvdW50cyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJY25vdyA9IGluZm8tPmljb3VudDsKKwkJbmV3c2lncyA9IGluZm8tPmlucHV0X3NpZ25hbF9ldmVudHM7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwkJLyogaWYgbm8gY2hhbmdlLCB3YWl0IGFib3J0ZWQgZm9yIHNvbWUgcmVhc29uICovCisJCWlmIChuZXdzaWdzLmRzcl91cCAgID09IG9sZHNpZ3MuZHNyX3VwICAgJiYKKwkJICAgIG5ld3NpZ3MuZHNyX2Rvd24gPT0gb2xkc2lncy5kc3JfZG93biAmJgorCQkgICAgbmV3c2lncy5kY2RfdXAgICA9PSBvbGRzaWdzLmRjZF91cCAgICYmCisJCSAgICBuZXdzaWdzLmRjZF9kb3duID09IG9sZHNpZ3MuZGNkX2Rvd24gJiYKKwkJICAgIG5ld3NpZ3MuY3RzX3VwICAgPT0gb2xkc2lncy5jdHNfdXAgICAmJgorCQkgICAgbmV3c2lncy5jdHNfZG93biA9PSBvbGRzaWdzLmN0c19kb3duICYmCisJCSAgICBuZXdzaWdzLnJpX3VwICAgID09IG9sZHNpZ3MucmlfdXAgICAgJiYKKwkJICAgIG5ld3NpZ3MucmlfZG93biAgPT0gb2xkc2lncy5yaV9kb3duICAmJgorCQkgICAgY25vdy5leGl0aHVudCAgICA9PSBjcHJldi5leGl0aHVudCAgICYmCisJCSAgICBjbm93LnJ4aWRsZSAgICAgID09IGNwcmV2LnJ4aWRsZSkgeworCQkJcmMgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQlldmVudHMgPSBtYXNrICYKKwkJCSggKG5ld3NpZ3MuZHNyX3VwICAgIT0gb2xkc2lncy5kc3JfdXAgICA/IE1nc2xFdmVudF9Ec3JBY3RpdmU6MCkgICArCisJCQkobmV3c2lncy5kc3JfZG93biAhPSBvbGRzaWdzLmRzcl9kb3duID8gTWdzbEV2ZW50X0RzckluYWN0aXZlOjApICsKKwkJCShuZXdzaWdzLmRjZF91cCAgICE9IG9sZHNpZ3MuZGNkX3VwICAgPyBNZ3NsRXZlbnRfRGNkQWN0aXZlOjApICAgKworCQkJKG5ld3NpZ3MuZGNkX2Rvd24gIT0gb2xkc2lncy5kY2RfZG93biA/IE1nc2xFdmVudF9EY2RJbmFjdGl2ZTowKSArCisJCQkobmV3c2lncy5jdHNfdXAgICAhPSBvbGRzaWdzLmN0c191cCAgID8gTWdzbEV2ZW50X0N0c0FjdGl2ZTowKSAgICsKKwkJCShuZXdzaWdzLmN0c19kb3duICE9IG9sZHNpZ3MuY3RzX2Rvd24gPyBNZ3NsRXZlbnRfQ3RzSW5hY3RpdmU6MCkgKworCQkJKG5ld3NpZ3MucmlfdXAgICAgIT0gb2xkc2lncy5yaV91cCAgICA/IE1nc2xFdmVudF9SaUFjdGl2ZTowKSAgICArCisJCQkobmV3c2lncy5yaV9kb3duICAhPSBvbGRzaWdzLnJpX2Rvd24gID8gTWdzbEV2ZW50X1JpSW5hY3RpdmU6MCkgICsKKwkJCShjbm93LmV4aXRodW50ICAgICE9IGNwcmV2LmV4aXRodW50ICAgPyBNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlOjApICsKKwkJCSAgKGNub3cucnhpZGxlICAgICAgIT0gY3ByZXYucnhpZGxlICAgICA/IE1nc2xFdmVudF9JZGxlUmVjZWl2ZWQ6MCkgKTsKKwkJaWYgKGV2ZW50cykKKwkJCWJyZWFrOworCQkKKwkJY3ByZXYgPSBjbm93OworCQlvbGRzaWdzID0gbmV3c2lnczsKKwl9CisJCisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPmV2ZW50X3dhaXRfcSwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwlpZiAobWFzayAmIChNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlICsgTWdzbEV2ZW50X0lkbGVSZWNlaXZlZCkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCWlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmaW5mby0+ZXZlbnRfd2FpdF9xKSkgeworCQkJLyogZGlzYWJsZSBlbmFibGUgZXhpdCBodW50IG1vZGUvaWRsZSByY3ZkIElSUXMgKi8KKwkJCXVzY19PdXRSZWcoaW5mbywgUklDUiwgdXNjX0luUmVnKGluZm8sUklDUikgJgorCQkJCX4oUlhTVEFUVVNfRVhJVEVEX0hVTlQgKyBSWFNUQVRVU19JRExFX1JFQ0VJVkVEKSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwl9CitleGl0OgorCWlmICggcmMgPT0gMCApCisJCVBVVF9VU0VSKHJjLCBldmVudHMsIG1hc2tfcHRyKTsKKwkJCisJcmV0dXJuIHJjOworCQorfQkvKiBlbmQgb2YgbWdzbF93YWl0X2V2ZW50KCkgKi8KKworc3RhdGljIGludCBtb2RlbV9pbnB1dF93YWl0KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyxpbnQgYXJnKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKwlzdHJ1Y3QgbWdzbF9pY291bnQgY3ByZXYsIGNub3c7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwkvKiBzYXZlIGN1cnJlbnQgaXJxIGNvdW50cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCWNwcmV2ID0gaW5mby0+aWNvdW50OworCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCisJZm9yKDs7KSB7CisJCXNjaGVkdWxlKCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmMgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGdldCBuZXcgaXJxIGNvdW50cyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJY25vdyA9IGluZm8tPmljb3VudDsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCQkvKiBpZiBubyBjaGFuZ2UsIHdhaXQgYWJvcnRlZCBmb3Igc29tZSByZWFzb24gKi8KKwkJaWYgKGNub3cucm5nID09IGNwcmV2LnJuZyAmJiBjbm93LmRzciA9PSBjcHJldi5kc3IgJiYKKwkJICAgIGNub3cuZGNkID09IGNwcmV2LmRjZCAmJiBjbm93LmN0cyA9PSBjcHJldi5jdHMpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogY2hlY2sgZm9yIGNoYW5nZSBpbiBjYWxsZXIgc3BlY2lmaWVkIG1vZGVtIGlucHV0ICovCisJCWlmICgoYXJnICYgVElPQ01fUk5HICYmIGNub3cucm5nICE9IGNwcmV2LnJuZykgfHwKKwkJICAgIChhcmcgJiBUSU9DTV9EU1IgJiYgY25vdy5kc3IgIT0gY3ByZXYuZHNyKSB8fAorCQkgICAgKGFyZyAmIFRJT0NNX0NEICAmJiBjbm93LmRjZCAhPSBjcHJldi5kY2QpIHx8CisJCSAgICAoYXJnICYgVElPQ01fQ1RTICYmIGNub3cuY3RzICE9IGNwcmV2LmN0cykpIHsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJY3ByZXYgPSBjbm93OworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJjOworfQorCisvKiByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBzZXJpYWwgY29udHJvbCBhbmQgc3RhdHVzIHNpZ25hbHMKKyAqLworc3RhdGljIGludCB0aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisgCXVzY19nZXRfc2VyaWFsX3NpZ25hbHMoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCXJlc3VsdCA9ICgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUlRTKSA/IFRJT0NNX1JUUzowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFRSKSA/IFRJT0NNX0RUUjowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKSA/IFRJT0NNX0NBUjowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpICA/IFRJT0NNX1JORzowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFNSKSA/IFRJT0NNX0RTUjowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfQ1RTKSA/IFRJT0NNX0NUUzowKTsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyB0aW9jbWdldCgpIHZhbHVlPSUwOFhcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCByZXN1bHQgKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBzZXQgbW9kZW0gY29udHJvbCBzaWduYWxzIChEVFIvUlRTKQorICovCitzdGF0aWMgaW50IHRpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHRpb2Ntc2V0KCV4LCV4KVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBzZXQsIGNsZWFyKTsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFM7CisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RUUjsKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfUlRTOworCWlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gflNlcmlhbFNpZ25hbF9EVFI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKyAJdXNjX3NldF9zZXJpYWxfc2lnbmFscyhpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIG1nc2xfYnJlYWsoKQkJU2V0IG9yIGNsZWFyIHRyYW5zbWl0IGJyZWFrIGNvbmRpdGlvbgorICoKKyAqIEFyZ3VtZW50czoJCXR0eQkJcG9pbnRlciB0byB0dHkgaW5zdGFuY2UgZGF0YQorICoJCQlicmVha19zdGF0ZQktMT1zZXQgYnJlYWsgY29uZGl0aW9uLCAwPWNsZWFyCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfYnJlYWsoJXMsJWQpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgYnJlYWtfc3RhdGUpOworCQkJIAorCWlmIChtZ3NsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xfYnJlYWsiKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisgCWlmIChicmVha19zdGF0ZSA9PSAtMSkKKwkJdXNjX091dFJlZyhpbmZvLElPQ1IsKHUxNikodXNjX0luUmVnKGluZm8sSU9DUikgfCBCSVQ3KSk7CisJZWxzZSAKKwkJdXNjX091dFJlZyhpbmZvLElPQ1IsKHUxNikodXNjX0luUmVnKGluZm8sSU9DUikgJiB+QklUNykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCit9CS8qIGVuZCBvZiBtZ3NsX2JyZWFrKCkgKi8KKworLyogbWdzbF9pb2N0bCgpCVNlcnZpY2UgYW4gSU9DVEwgcmVxdWVzdAorICogCQorICogQXJndW1lbnRzOgorICogCisgKiAJdHR5CXBvaW50ZXIgdG8gdHR5IGluc3RhbmNlIGRhdGEKKyAqIAlmaWxlCXBvaW50ZXIgdG8gYXNzb2NpYXRlZCBmaWxlIG9iamVjdCBmb3IgZGV2aWNlCisgKiAJY21kCUlPQ1RMIGNvbW1hbmQgY29kZQorICogCWFyZwljb21tYW5kIGFyZ3VtZW50L2NvbnRleHQKKyAqIAkKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IG1nc2xfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2lvY3RsICVzIGNtZD0lMDhYXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKKwkJCWluZm8tPmRldmljZV9uYW1lLCBjbWQgKTsKKwkKKwlpZiAobWdzbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NsX2lvY3RsIikpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCisJICAgIChjbWQgIT0gVElPQ01JV0FJVCkgJiYgKGNtZCAhPSBUSU9DR0lDT1VOVCkpIHsKKwkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQkgICAgcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIG1nc2xfaW9jdGxfY29tbW9uKGluZm8sIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBtZ3NsX2lvY3RsX2NvbW1vbihzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbWdzbF9pY291bnQgY25vdzsJLyoga2VybmVsIGNvdW50ZXIgdGVtcHMgKi8KKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBfX3VzZXIgKnBfY3VzZXI7CS8qIHVzZXIgc3BhY2UgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgTUdTTF9JT0NHUEFSQU1TOgorCQkJcmV0dXJuIG1nc2xfZ2V0X3BhcmFtcyhpbmZvLCBhcmdwKTsKKwkJY2FzZSBNR1NMX0lPQ1NQQVJBTVM6CisJCQlyZXR1cm4gbWdzbF9zZXRfcGFyYW1zKGluZm8sIGFyZ3ApOworCQljYXNlIE1HU0xfSU9DR1RYSURMRToKKwkJCXJldHVybiBtZ3NsX2dldF90eGlkbGUoaW5mbywgYXJncCk7CisJCWNhc2UgTUdTTF9JT0NTVFhJRExFOgorCQkJcmV0dXJuIG1nc2xfc2V0X3R4aWRsZShpbmZvLChpbnQpYXJnKTsKKwkJY2FzZSBNR1NMX0lPQ1RYRU5BQkxFOgorCQkJcmV0dXJuIG1nc2xfdHhlbmFibGUoaW5mbywoaW50KWFyZyk7CisJCWNhc2UgTUdTTF9JT0NSWEVOQUJMRToKKwkJCXJldHVybiBtZ3NsX3J4ZW5hYmxlKGluZm8sKGludClhcmcpOworCQljYXNlIE1HU0xfSU9DVFhBQk9SVDoKKwkJCXJldHVybiBtZ3NsX3R4YWJvcnQoaW5mbyk7CisJCWNhc2UgTUdTTF9JT0NHU1RBVFM6CisJCQlyZXR1cm4gbWdzbF9nZXRfc3RhdHMoaW5mbywgYXJncCk7CisJCWNhc2UgTUdTTF9JT0NXQUlURVZFTlQ6CisJCQlyZXR1cm4gbWdzbF93YWl0X2V2ZW50KGluZm8sIGFyZ3ApOworCQljYXNlIE1HU0xfSU9DTE9PUFRYRE9ORToKKwkJCXJldHVybiBtZ3NsX2xvb3Btb2RlX3NlbmRfZG9uZShpbmZvKTsKKwkJLyogV2FpdCBmb3IgbW9kZW0gaW5wdXQgKERDRCxSSSxEU1IsQ1RTKSBjaGFuZ2UKKwkJICogYXMgc3BlY2lmaWVkIGJ5IG1hc2sgaW4gYXJnIChUSU9DTV9STkcvRFNSL0NEL0NUUykKKwkJICovCisJCWNhc2UgVElPQ01JV0FJVDoKKwkJCXJldHVybiBtb2RlbV9pbnB1dF93YWl0KGluZm8sKGludClhcmcpOworCisJCS8qIAorCQkgKiBHZXQgY291bnRlciBvZiBpbnB1dCBzZXJpYWwgbGluZSBpbnRlcnJ1cHRzIChEQ0QsUkksRFNSLENUUykKKwkJICogUmV0dXJuOiB3cml0ZSBjb3VudGVycyB0byB0aGUgdXNlciBwYXNzZWQgY291bnRlciBzdHJ1Y3QKKwkJICogTkI6IGJvdGggMS0+MCBhbmQgMC0+MSB0cmFuc2l0aW9ucyBhcmUgY291bnRlZCBleGNlcHQgZm9yCisJCSAqICAgICBSSSB3aGVyZSBvbmx5IDAtPjEgaXMgY291bnRlZC4KKwkJICovCisJCWNhc2UgVElPQ0dJQ09VTlQ6CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQkJcF9jdXNlciA9IGFyZ3A7CisJCQlQVVRfVVNFUihlcnJvcixjbm93LmN0cywgJnBfY3VzZXItPmN0cyk7CisJCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJCVBVVF9VU0VSKGVycm9yLGNub3cuZHNyLCAmcF9jdXNlci0+ZHNyKTsKKwkJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQkJUFVUX1VTRVIoZXJyb3IsY25vdy5ybmcsICZwX2N1c2VyLT5ybmcpOworCQkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCQlQVVRfVVNFUihlcnJvcixjbm93LmRjZCwgJnBfY3VzZXItPmRjZCk7CisJCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJCVBVVF9VU0VSKGVycm9yLGNub3cucngsICZwX2N1c2VyLT5yeCk7CisJCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJCVBVVF9VU0VSKGVycm9yLGNub3cudHgsICZwX2N1c2VyLT50eCk7CisJCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJCVBVVF9VU0VSKGVycm9yLGNub3cuZnJhbWUsICZwX2N1c2VyLT5mcmFtZSk7CisJCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJCVBVVF9VU0VSKGVycm9yLGNub3cub3ZlcnJ1biwgJnBfY3VzZXItPm92ZXJydW4pOworCQkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCQlQVVRfVVNFUihlcnJvcixjbm93LnBhcml0eSwgJnBfY3VzZXItPnBhcml0eSk7CisJCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJCVBVVF9VU0VSKGVycm9yLGNub3cuYnJrLCAmcF9jdXNlci0+YnJrKTsKKwkJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQkJUFVUX1VTRVIoZXJyb3IsY25vdy5idWZfb3ZlcnJ1biwgJnBfY3VzZXItPmJ1Zl9vdmVycnVuKTsKKwkJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogbWdzbF9zZXRfdGVybWlvcygpCisgKiAKKyAqIAlTZXQgbmV3IHRlcm1pb3Mgc2V0dGluZ3MKKyAqIAkKKyAqIEFyZ3VtZW50czoKKyAqIAorICogCXR0eQkJcG9pbnRlciB0byB0dHkgc3RydWN0dXJlCisgKiAJdGVybWlvcwkJcG9pbnRlciB0byBidWZmZXIgdG8gaG9sZCByZXR1cm5lZCBvbGQgdGVybWlvcworICogCQorICogUmV0dXJuIFZhbHVlOgkJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX3NldF90ZXJtaW9zICVzXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKKwkJCXR0eS0+ZHJpdmVyLT5uYW1lICk7CisJCisJLyoganVzdCByZXR1cm4gaWYgbm90aGluZyBoYXMgY2hhbmdlZCAqLworCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQorCSAgICAmJiAoUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAKKwkJPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKKwkgIHJldHVybjsKKworCW1nc2xfY2hhbmdlX3BhcmFtcyhpbmZvKTsKKworCS8qIEhhbmRsZSB0cmFuc2l0aW9uIHRvIEIwIHN0YXR1cyAqLworCWlmIChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEICYmCisJICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKSB7CisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH4oU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFIpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkgCXVzY19zZXRfc2VyaWFsX3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJfQorCQorCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGF3YXkgZnJvbSBCMCBzdGF0dXMgKi8KKwlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJgorCSAgICB0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgeworCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfRFRSOworIAkJaWYgKCEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgfHwgCisgCQkgICAgIXRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSkgeworCQkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUzsKKyAJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJIAl1c2Nfc2V0X3NlcmlhbF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCX0KKwkKKwkvKiBIYW5kbGUgdHVybmluZyBvZmYgQ1JUU0NUUyAqLworCWlmIChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMgJiYKKwkgICAgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQltZ3NsX3N0YXJ0KHR0eSk7CisJfQorCit9CS8qIGVuZCBvZiBtZ3NsX3NldF90ZXJtaW9zKCkgKi8KKworLyogbWdzbF9jbG9zZSgpCisgKiAKKyAqIAlDYWxsZWQgd2hlbiBwb3J0IGlzIGNsb3NlZC4gV2FpdCBmb3IgcmVtYWluaW5nIGRhdGEgdG8gYmUKKyAqIAlzZW50LiBEaXNhYmxlIHBvcnQgYW5kIGZyZWUgcmVzb3VyY2VzLgorICogCQorICogQXJndW1lbnRzOgorICogCisgKiAJdHR5CXBvaW50ZXIgdG8gb3BlbiB0dHkgc3RydWN0dXJlCisgKiAJZmlscAlwb2ludGVyIHRvIG9wZW4gZmlsZSBvYmplY3QKKyAqIAkKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAobWdzbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NsX2Nsb3NlIikpCisJCXJldHVybjsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9jbG9zZSglcykgZW50cnksIGNvdW50PSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+Y291bnQpOworCQkJIAorCWlmICghaW5mby0+Y291bnQpCisJCXJldHVybjsKKworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQorCQlnb3RvIGNsZWFudXA7CisJCQkKKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKGluZm8tPmNvdW50ICE9IDEpKSB7CisJCS8qCisJCSAqIHR0eS0+Y291bnQgaXMgMSBhbmQgdGhlIHR0eSBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4KKwkJICogaW5mby0+Y291bnQgc2hvdWxkIGJlIG9uZSBpbiB0aGlzIGNhc2UuCisJCSAqIGlmIGl0J3Mgbm90LCBjb3JyZWN0IGl0IHNvIHRoYXQgdGhlIHBvcnQgaXMgc2h1dGRvd24uCisJCSAqLworCQlwcmludGsoIm1nc2xfY2xvc2U6IGJhZCByZWZjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCisJCSAgICAgICAiaW5mby0+Y291bnQgaXMgJWRcbiIsIGluZm8tPmNvdW50KTsKKwkJaW5mby0+Y291bnQgPSAxOworCX0KKwkKKwlpbmZvLT5jb3VudC0tOworCQorCS8qIGlmIGF0IGxlYXN0IG9uZSBvcGVuIHJlbWFpbmluZywgbGVhdmUgaGFyZHdhcmUgYWN0aXZlICovCisJaWYgKGluZm8tPmNvdW50KQorCQlnb3RvIGNsZWFudXA7CisJCisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKwkKKwkvKiBzZXQgdHR5LT5jbG9zaW5nIHRvIG5vdGlmeSBsaW5lIGRpc2NpcGxpbmUgdG8gCisJICogb25seSBwcm9jZXNzIFhPTi9YT0ZGIGNoYXJhY3RlcnMuIE9ubHkgdGhlIE5fVFRZCisJICogZGlzY2lwbGluZSBhcHBlYXJzIHRvIHVzZSB0aGlzIChwcHAgZG9lcyBub3QpLgorCSAqLworCXR0eS0+Y2xvc2luZyA9IDE7CisJCisJLyogd2FpdCBmb3IgdHJhbnNtaXQgZGF0YSB0byBjbGVhciBhbGwgbGF5ZXJzICovCisJCisJaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkgeworCQlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJCXByaW50aygiJXMoJWQpOm1nc2xfY2xvc2UoJXMpIGNhbGxpbmcgdHR5X3dhaXRfdW50aWxfc2VudFxuIiwKKwkJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT5jbG9zaW5nX3dhaXQpOworCX0KKwkJCisgCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKQorIAkJbWdzbF93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT50aW1lb3V0KTsKKworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKwkJCisJc2h1dGRvd24oaW5mbyk7CisJCisJdHR5LT5jbG9zaW5nID0gMDsKKwlpbmZvLT50dHkgPSBOVUxMOworCQorCWlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKGluZm8tPmNsb3NlX2RlbGF5KSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCX0KKwkKKwlpbmZvLT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7CisJCQkgCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5jbG9zZV93YWl0KTsKKwkKK2NsZWFudXA6CQkJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfY2xvc2UoJXMpIGV4aXQsIGNvdW50PSVkXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKKwkJCXR0eS0+ZHJpdmVyLT5uYW1lLCBpbmZvLT5jb3VudCk7CisJCQkKK30JLyogZW5kIG9mIG1nc2xfY2xvc2UoKSAqLworCisvKiBtZ3NsX3dhaXRfdW50aWxfc2VudCgpCisgKgorICoJV2FpdCB1bnRpbCB0aGUgdHJhbnNtaXR0ZXIgaXMgZW1wdHkuCisgKgorICogQXJndW1lbnRzOgorICoKKyAqCXR0eQkJcG9pbnRlciB0byB0dHkgaW5mbyBzdHJ1Y3R1cmUKKyAqCXRpbWVvdXQJCXRpbWUgdG8gd2FpdCBmb3Igc2VuZCBjb21wbGV0aW9uCisgKgorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIG9yaWdfamlmZmllcywgY2hhcl90aW1lOworCisJaWYgKCFpbmZvICkKKwkJcmV0dXJuOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xfd2FpdF91bnRpbF9zZW50KCVzKSBlbnRyeVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKyAgICAgIAorCWlmIChtZ3NsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xfd2FpdF91bnRpbF9zZW50IikpCisJCXJldHVybjsKKworCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQorCQlnb3RvIGV4aXQ7CisJIAorCW9yaWdfamlmZmllcyA9IGppZmZpZXM7CisgICAgICAKKwkvKiBTZXQgY2hlY2sgaW50ZXJ2YWwgdG8gMS81IG9mIGVzdGltYXRlZCB0aW1lIHRvCisJICogc2VuZCBhIGNoYXJhY3RlciwgYW5kIG1ha2UgaXQgYXQgbGVhc3QgMS4gVGhlIGNoZWNrCisJICogaW50ZXJ2YWwgc2hvdWxkIGFsc28gYmUgbGVzcyB0aGFuIHRoZSB0aW1lb3V0LgorCSAqIE5vdGU6IHVzZSB0aWdodCB0aW1pbmdzIGhlcmUgdG8gc2F0aXNmeSB0aGUgTklTVC1QQ1RTLgorCSAqLyAKKyAgICAgICAKKwlpZiAoIGluZm8tPnBhcmFtcy5kYXRhX3JhdGUgKSB7CisJICAgICAgIAljaGFyX3RpbWUgPSBpbmZvLT50aW1lb3V0LygzMiAqIDUpOworCQlpZiAoIWNoYXJfdGltZSkKKwkJCWNoYXJfdGltZSsrOworCX0gZWxzZQorCQljaGFyX3RpbWUgPSAxOworCQkKKwlpZiAodGltZW91dCkKKwkJY2hhcl90aW1lID0gbWluX3QodW5zaWduZWQgbG9uZywgY2hhcl90aW1lLCB0aW1lb3V0KTsKKwkJCisJaWYgKCBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyB8fAorCQlpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfUkFXICkgeworCQl3aGlsZSAoaW5mby0+dHhfYWN0aXZlKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGNoYXJfdGltZSkpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWJyZWFrOworCQkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICghKHVzY19JblJlZyhpbmZvLFRDU1IpICYgVFhTVEFUVVNfQUxMX1NFTlQpICYmCisJCQlpbmZvLT50eF9lbmFibGVkKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGNoYXJfdGltZSkpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWJyZWFrOworCQkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCQlicmVhazsKKwkJfQorCX0KKyAgICAgIAorZXhpdDoKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF93YWl0X3VudGlsX3NlbnQoJXMpIGV4aXRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisJCQkgCit9CS8qIGVuZCBvZiBtZ3NsX3dhaXRfdW50aWxfc2VudCgpICovCisKKy8qIG1nc2xfaGFuZ3VwKCkKKyAqCisgKglDYWxsZWQgYnkgdHR5X2hhbmd1cCgpIHdoZW4gYSBoYW5ndXAgaXMgc2lnbmFsZWQuCisgKglUaGlzIGlzIHRoZSBzYW1lIGFzIHRvIGNsb3NpbmcgYWxsIG9wZW4gZmlsZXMgZm9yIHRoZSBwb3J0LgorICoKKyAqIEFyZ3VtZW50czoJCXR0eQlwb2ludGVyIHRvIGFzc29jaWF0ZWQgdHR5IG9iamVjdAorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX2hhbmd1cCglcylcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisJCQkgCisJaWYgKG1nc2xfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbF9oYW5ndXAiKSkKKwkJcmV0dXJuOworCisJbWdzbF9mbHVzaF9idWZmZXIodHR5KTsKKwlzaHV0ZG93bihpbmZvKTsKKwkKKwlpbmZvLT5jb3VudCA9IDA7CQorCWluZm8tPmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOworCWluZm8tPnR0eSA9IE5VTEw7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJCit9CS8qIGVuZCBvZiBtZ3NsX2hhbmd1cCgpICovCisKKy8qIGJsb2NrX3RpbF9yZWFkeSgpCisgKiAKKyAqIAlCbG9jayB0aGUgY3VycmVudCBwcm9jZXNzIHVudGlsIHRoZSBzcGVjaWZpZWQgcG9ydAorICogCWlzIHJlYWR5IHRvIGJlIG9wZW5lZC4KKyAqIAkKKyAqIEFyZ3VtZW50czoKKyAqIAorICogCXR0eQkJcG9pbnRlciB0byB0dHkgaW5mbyBzdHJ1Y3R1cmUKKyAqIAlmaWxwCQlwb2ludGVyIHRvIG9wZW4gZmlsZSBvYmplY3QKKyAqIAlpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwLAorCQkJICAgc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludAkJcmV0dmFsOworCWludAkJZG9fY2xvY2FsID0gMCwgZXh0cmFfY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOmJsb2NrX3RpbF9yZWFkeSBvbiAlc1xuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgdHR5LT5kcml2ZXItPm5hbWUgKTsKKworCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyB8fCB0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSl7CisJCS8qIG5vbmJsb2NrIG1vZGUgaXMgc2V0IG9yIHBvcnQgaXMgbm90IGVuYWJsZWQgKi8KKwkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkKKwkJZG9fY2xvY2FsID0gMTsKKworCS8qIFdhaXQgZm9yIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUKKwkgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgorCSAqIHRoaXMgbG9vcCwgaW5mby0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKwkgKiBtZ3NsX2Nsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIFdlIHJlc3RvcmUgaXQgdXBvbgorCSAqIGV4aXQsIGVpdGhlciBub3JtYWwgb3IgYWJub3JtYWwuCisJICovCisJIAorCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTpibG9ja190aWxfcmVhZHkgYmVmb3JlIGJsb2NrIG9uICVzIGNvdW50PSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCB0dHktPmRyaXZlci0+bmFtZSwgaW5mby0+Y291bnQgKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJZXh0cmFfY291bnQgPSAxOworCQlpbmZvLT5jb3VudC0tOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssIGZsYWdzKTsKKwlpbmZvLT5ibG9ja2VkX29wZW4rKzsKKwkKKwl3aGlsZSAoMSkgeworCQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CisJCSAJdXNjX3NldF9zZXJpYWxfc2lnbmFscyhpbmZvKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCX0KKwkJCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQorCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCAhKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKXsKKwkJCXJldHZhbCA9IChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpID8KKwkJCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkgCXVzY19nZXRfc2VyaWFsX3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCQorIAkJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJgorIAkJICAgIChkb19jbG9jYWwgfHwgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCkpICkgeworIAkJCWJyZWFrOworCQl9CisJCQkKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQkKKwkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCQlwcmludGsoIiVzKCVkKTpibG9ja190aWxfcmVhZHkgYmxvY2tpbmcgb24gJXMgY291bnQ9JWRcbiIsCisJCQkJIF9fRklMRV9fLF9fTElORV9fLCB0dHktPmRyaXZlci0+bmFtZSwgaW5mby0+Y291bnQgKTsKKwkJCQkgCisJCXNjaGVkdWxlKCk7CisJfQorCQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworCQorCWlmIChleHRyYV9jb3VudCkKKwkJaW5mby0+Y291bnQrKzsKKwlpbmZvLT5ibG9ja2VkX29wZW4tLTsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6YmxvY2tfdGlsX3JlYWR5IGFmdGVyIGJsb2NraW5nIG9uICVzIGNvdW50PSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCB0dHktPmRyaXZlci0+bmFtZSwgaW5mby0+Y291bnQgKTsKKwkJCSAKKwlpZiAoIXJldHZhbCkKKwkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJCisJcmV0dXJuIHJldHZhbDsKKwkKK30JLyogZW5kIG9mIGJsb2NrX3RpbF9yZWFkeSgpICovCisKKy8qIG1nc2xfb3BlbigpCisgKgorICoJQ2FsbGVkIHdoZW4gYSBwb3J0IGlzIG9wZW5lZC4gIEluaXQgYW5kIGVuYWJsZSBwb3J0LgorICoJUGVyZm9ybSBzZXJpYWwtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSB0dHkgc3RydWN0dXJlLgorICoKKyAqIEFyZ3VtZW50czoJCXR0eQlwb2ludGVyIHRvIHR0eSBpbmZvIHN0cnVjdHVyZQorICoJCQlmaWxwCWFzc29jaWF0ZWQgZmlsZSBwb2ludGVyCisgKgorICogUmV0dXJuIFZhbHVlOgkwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QJKmluZm87CisJaW50IAkJCXJldHZhbCwgbGluZTsKKwl1bnNpZ25lZCBsb25nCQlwYWdlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiB2ZXJpZnkgcmFuZ2Ugb2Ygc3BlY2lmaWVkIGxpbmUgbnVtYmVyICovCQorCWxpbmUgPSB0dHktPmluZGV4OworCWlmICgobGluZSA8IDApIHx8IChsaW5lID49IG1nc2xfZGV2aWNlX2NvdW50KSkgeworCQlwcmludGsoIiVzKCVkKTptZ3NsX29wZW4gd2l0aCBpbnZhbGlkIGxpbmUgIyVkLlxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGxpbmUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBmaW5kIHRoZSBpbmZvIHN0cnVjdHVyZSBmb3IgdGhlIHNwZWNpZmllZCBsaW5lICovCisJaW5mbyA9IG1nc2xfZGV2aWNlX2xpc3Q7CisJd2hpbGUoaW5mbyAmJiBpbmZvLT5saW5lICE9IGxpbmUpCisJCWluZm8gPSBpbmZvLT5uZXh0X2RldmljZTsKKwlpZiAobWdzbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NsX29wZW4iKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJdHR5LT5kcml2ZXJfZGF0YSA9IGluZm87CisJaW5mby0+dHR5ID0gdHR5OworCQkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbF9vcGVuKCVzKSwgb2xkIHJlZiBjb3VudCA9ICVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLHR0eS0+ZHJpdmVyLT5uYW1lLCBpbmZvLT5jb3VudCk7CisKKwkvKiBJZiBwb3J0IGlzIGNsb3NpbmcsIHNpZ25hbCBjYWxsZXIgdG8gdHJ5IGFnYWluICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKXsKKwkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOworCQlyZXR2YWwgPSAoKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPworCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJCisJaWYgKCF0bXBfYnVmKSB7CisJCXBhZ2UgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICghcGFnZSkgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlpZiAodG1wX2J1ZikKKwkJCWZyZWVfcGFnZShwYWdlKTsKKwkJZWxzZQorCQkJdG1wX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2U7CisJfQorCQorCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJaWYgKGluZm8tPm5ldGNvdW50KSB7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlnb3RvIGNsZWFudXA7CisJfQorCWluZm8tPmNvdW50Kys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCisJaWYgKGluZm8tPmNvdW50ID09IDEpIHsKKwkJLyogMXN0IG9wZW4gb24gdGhpcyBkZXZpY2UsIGluaXQgaGFyZHdhcmUgKi8KKwkJcmV0dmFsID0gc3RhcnR1cChpbmZvKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlnb3RvIGNsZWFudXA7CisJfQorCisJcmV0dmFsID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgaW5mbyk7CisJaWYgKHJldHZhbCkgeworCQlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJCXByaW50aygiJXMoJWQpOmJsb2NrX3RpbF9yZWFkeSglcykgcmV0dXJuZWQgJWRcbiIsCisJCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgcmV0dmFsKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NsX29wZW4oJXMpIHN1Y2Nlc3NcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lKTsKKwlyZXR2YWwgPSAwOworCQorY2xlYW51cDoJCQkKKwlpZiAocmV0dmFsKSB7CisJCWlmICh0dHktPmNvdW50ID09IDEpCisJCQlpbmZvLT50dHkgPSBOVUxMOyAvKiB0dHkgbGF5ZXIgd2lsbCByZWxlYXNlIHR0eSBzdHJ1Y3QgKi8KKwkJaWYoaW5mby0+Y291bnQpCisJCQlpbmZvLT5jb3VudC0tOworCX0KKwkKKwlyZXR1cm4gcmV0dmFsOworCQorfQkvKiBlbmQgb2YgbWdzbF9vcGVuKCkgKi8KKworLyoKKyAqIC9wcm9jIGZzIHJvdXRpbmVzLi4uLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmVfaW5mbyhjaGFyICpidWYsIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwljaGFyCXN0YXRfYnVmWzMwXTsKKwlpbnQJcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9QQ0kpIHsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlczpQQ0kgaW86JTA0WCBpcnE6JWQgbWVtOiUwOFggbGNyOiUwOFgiLAorCQkJaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPmlvX2Jhc2UsIGluZm8tPmlycV9sZXZlbCwKKwkJCWluZm8tPnBoeXNfbWVtb3J5X2Jhc2UsIGluZm8tPnBoeXNfbGNyX2Jhc2UpOworCX0gZWxzZSB7CisJCXJldCA9IHNwcmludGYoYnVmLCAiJXM6KEUpSVNBIGlvOiUwNFggaXJxOiVkIGRtYTolZCIsCisJCQlpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aW9fYmFzZSwgCisJCQlpbmZvLT5pcnFfbGV2ZWwsIGluZm8tPmRtYV9sZXZlbCk7CisJfQorCisJLyogb3V0cHV0IGN1cnJlbnQgc2VyaWFsIHNpZ25hbCBzdGF0ZXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKyAJdXNjX2dldF9zZXJpYWxfc2lnbmFscyhpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQorCXN0YXRfYnVmWzBdID0gMDsKKwlzdGF0X2J1ZlsxXSA9IDA7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykKKwkJc3RyY2F0KHN0YXRfYnVmLCAifFJUUyIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9DVFMpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxDVFMiKTsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFRSKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8RFRSIik7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RTUikKKwkJc3RyY2F0KHN0YXRfYnVmLCAifERTUiIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxDRCIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SSSkKKwkJc3RyY2F0KHN0YXRfYnVmLCAifFJJIik7CisKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMgfHwKKwkgICAgaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX1JBVyApIHsKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBIRExDIHR4b2s6JWQgcnhvazolZCIsCisJCQkgICAgICBpbmZvLT5pY291bnQudHhvaywgaW5mby0+aWNvdW50LnJ4b2spOworCQlpZiAoaW5mby0+aWNvdW50LnR4dW5kZXIpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHR4dW5kZXI6JWQiLCBpbmZvLT5pY291bnQudHh1bmRlcik7CisJCWlmIChpbmZvLT5pY291bnQudHhhYm9ydCkKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgdHhhYm9ydDolZCIsIGluZm8tPmljb3VudC50eGFib3J0KTsKKwkJaWYgKGluZm8tPmljb3VudC5yeHNob3J0KQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiByeHNob3J0OiVkIiwgaW5mby0+aWNvdW50LnJ4c2hvcnQpOwkKKwkJaWYgKGluZm8tPmljb3VudC5yeGxvbmcpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHJ4bG9uZzolZCIsIGluZm8tPmljb3VudC5yeGxvbmcpOworCQlpZiAoaW5mby0+aWNvdW50LnJ4b3ZlcikKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgcnhvdmVyOiVkIiwgaW5mby0+aWNvdW50LnJ4b3Zlcik7CisJCWlmIChpbmZvLT5pY291bnQucnhjcmMpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHJ4Y3JjOiVkIiwgaW5mby0+aWNvdW50LnJ4Y3JjKTsKKwl9IGVsc2UgeworCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIEFTWU5DIHR4OiVkIHJ4OiVkIiwKKwkJCSAgICAgIGluZm8tPmljb3VudC50eCwgaW5mby0+aWNvdW50LnJ4KTsKKwkJaWYgKGluZm8tPmljb3VudC5mcmFtZSkKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgZmU6JWQiLCBpbmZvLT5pY291bnQuZnJhbWUpOworCQlpZiAoaW5mby0+aWNvdW50LnBhcml0eSkKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgcGU6JWQiLCBpbmZvLT5pY291bnQucGFyaXR5KTsKKwkJaWYgKGluZm8tPmljb3VudC5icmspCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIGJyazolZCIsIGluZm8tPmljb3VudC5icmspOwkKKwkJaWYgKGluZm8tPmljb3VudC5vdmVycnVuKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBvZTolZCIsIGluZm8tPmljb3VudC5vdmVycnVuKTsKKwl9CisJCisJLyogQXBwZW5kIHNlcmlhbCBzaWduYWwgc3RhdHVzIHRvIGVuZCAqLworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgJXNcbiIsIHN0YXRfYnVmKzEpOworCQorCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJ0eGFjdGl2ZT0lZCBiaF9yZXE9JWQgYmhfcnVuPSVkIHBlbmRpbmdfYmg9JXhcbiIsCisJIGluZm8tPnR4X2FjdGl2ZSxpbmZvLT5iaF9yZXF1ZXN0ZWQsaW5mby0+YmhfcnVubmluZywKKwkgaW5mby0+cGVuZGluZ19iaCk7CisJIAorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCXsJCisJdTE2IFRjc3IgPSB1c2NfSW5SZWcoIGluZm8sIFRDU1IgKTsKKwl1MTYgVGRtciA9IHVzY19JbkRtYVJlZyggaW5mbywgVERNUiApOworCXUxNiBUaWNyID0gdXNjX0luUmVnKCBpbmZvLCBUSUNSICk7CisJdTE2IFJzY3IgPSB1c2NfSW5SZWcoIGluZm8sIFJDU1IgKTsKKwl1MTYgUmRtciA9IHVzY19JbkRtYVJlZyggaW5mbywgUkRNUiApOworCXUxNiBSaWNyID0gdXNjX0luUmVnKCBpbmZvLCBSSUNSICk7CisJdTE2IEljciA9IHVzY19JblJlZyggaW5mbywgSUNSICk7CisJdTE2IERjY3IgPSB1c2NfSW5SZWcoIGluZm8sIERDQ1IgKTsKKwl1MTYgVG1yID0gdXNjX0luUmVnKCBpbmZvLCBUTVIgKTsKKwl1MTYgVGNjciA9IHVzY19JblJlZyggaW5mbywgVENDUiApOworCXUxNiBDY2FyID0gaW53KCBpbmZvLT5pb19iYXNlICsgQ0NBUiApOworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJ0Y3NyPSUwNFggdGRtcj0lMDRYIHRpY3I9JTA0WCByY3NyPSUwNFggcmRtcj0lMDRYXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAicmljcj0lMDRYIGljciA9JTA0WCBkY2NyPSUwNFggdG1yPSUwNFggdGNjcj0lMDRYIGNjYXI9JTA0WFxuIiwKKwkgCQlUY3NyLFRkbXIsVGljcixSc2NyLFJkbXIsUmljcixJY3IsRGNjcixUbXIsVGNjcixDY2FyICk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCisJcmV0dXJuIHJldDsKKwkKK30JLyogZW5kIG9mIGxpbmVfaW5mbygpICovCisKKy8qIG1nc2xfcmVhZF9wcm9jKCkKKyAqIAorICogQ2FsbGVkIHRvIHByaW50IGluZm9ybWF0aW9uIGFib3V0IGRldmljZXMKKyAqIAorICogQXJndW1lbnRzOgorICogCXBhZ2UJcGFnZSBvZiBtZW1vcnkgdG8gaG9sZCByZXR1cm5lZCBpbmZvCisgKiAJc3RhcnQJCisgKiAJb2ZmCisgKiAJY291bnQKKyAqIAllb2YKKyAqIAlkYXRhCisgKiAJCisgKiBSZXR1cm4gVmFsdWU6CisgKi8KK3N0YXRpYyBpbnQgbWdzbF9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwKKwkJIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSAwLCBsOworCW9mZl90CWJlZ2luID0gMDsKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm87CisJCisJbGVuICs9IHNwcmludGYocGFnZSwgInN5bmNsaW5rIGRyaXZlcjolc1xuIiwgZHJpdmVyX3ZlcnNpb24pOworCQorCWluZm8gPSBtZ3NsX2RldmljZV9saXN0OworCXdoaWxlKCBpbmZvICkgeworCQlsID0gbGluZV9pbmZvKHBhZ2UgKyBsZW4sIGluZm8pOworCQlsZW4gKz0gbDsKKwkJaWYgKGxlbitiZWdpbiA+IG9mZitjb3VudCkKKwkJCWdvdG8gZG9uZTsKKwkJaWYgKGxlbitiZWdpbiA8IG9mZikgeworCQkJYmVnaW4gKz0gbGVuOworCQkJbGVuID0gMDsKKwkJfQorCQlpbmZvID0gaW5mby0+bmV4dF9kZXZpY2U7CisJfQorCisJKmVvZiA9IDE7Citkb25lOgorCWlmIChvZmYgPj0gbGVuK2JlZ2luKQorCQlyZXR1cm4gMDsKKwkqc3RhcnQgPSBwYWdlICsgKG9mZi1iZWdpbik7CisJcmV0dXJuICgoY291bnQgPCBiZWdpbitsZW4tb2ZmKSA/IGNvdW50IDogYmVnaW4rbGVuLW9mZik7CisJCit9CS8qIGVuZCBvZiBtZ3NsX3JlYWRfcHJvYygpICovCisKKy8qIG1nc2xfYWxsb2NhdGVfZG1hX2J1ZmZlcnMoKQorICogCisgKiAJQWxsb2NhdGUgYW5kIGZvcm1hdCBETUEgYnVmZmVycyAoSVNBIGFkYXB0ZXIpCisgKiAJb3IgZm9ybWF0IHNoYXJlZCBtZW1vcnkgYnVmZmVycyAoUENJIGFkYXB0ZXIpLgorICogCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IKKyAqLworc3RhdGljIGludCBtZ3NsX2FsbG9jYXRlX2RtYV9idWZmZXJzKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwl1bnNpZ25lZCBzaG9ydCBCdWZmZXJzUGVyRnJhbWU7CisKKwlpbmZvLT5sYXN0X21lbV9hbGxvYyA9IDA7CisKKwkvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBETUEgYnVmZmVycyBuZWNlc3NhcnkgdG8gaG9sZCB0aGUgKi8KKwkvKiBsYXJnZXN0IGFsbG93YWJsZSBmcmFtZSBzaXplLiBOb3RlOiBJZiB0aGUgbWF4IGZyYW1lIHNpemUgaXMgKi8KKwkvKiBub3QgYW4gZXZlbiBtdWx0aXBsZSBvZiB0aGUgRE1BIGJ1ZmZlciBzaXplIHRoZW4gd2UgbmVlZCB0byAqLworCS8qIHJvdW5kIHRoZSBidWZmZXIgY291bnQgcGVyIGZyYW1lIHVwIG9uZS4gKi8KKworCUJ1ZmZlcnNQZXJGcmFtZSA9ICh1bnNpZ25lZCBzaG9ydCkoaW5mby0+bWF4X2ZyYW1lX3NpemUvRE1BQlVGRkVSU0laRSk7CisJaWYgKCBpbmZvLT5tYXhfZnJhbWVfc2l6ZSAlIERNQUJVRkZFUlNJWkUgKQorCQlCdWZmZXJzUGVyRnJhbWUrKzsKKworCWlmICggaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9QQ0kgKSB7CisJCS8qCisJCSAqIFRoZSBQQ0kgYWRhcHRlciBoYXMgMjU2S0J5dGVzIG9mIHNoYXJlZCBtZW1vcnkgdG8gdXNlLgorCQkgKiBUaGlzIGlzIDY0IFBBR0VfU0laRSBidWZmZXJzLgorCQkgKgorCQkgKiBUaGUgZmlyc3QgcGFnZSBpcyB1c2VkIGZvciBwYWRkaW5nIGF0IHRoaXMgdGltZSBzbyB0aGUKKwkJICogYnVmZmVyIGxpc3QgZG9lcyBub3QgYmVnaW4gYXQgb2Zmc2V0IDAgb2YgdGhlIFBDSQorCQkgKiBhZGFwdGVyJ3Mgc2hhcmVkIG1lbW9yeS4KKwkJICoKKwkJICogVGhlIDJuZCBwYWdlIGlzIHVzZWQgZm9yIHRoZSBidWZmZXIgbGlzdC4gQSA0SyBidWZmZXIKKwkJICogbGlzdCBjYW4gaG9sZCAxMjggRE1BX0JVRkZFUiBzdHJ1Y3R1cmVzIGF0IDMyIGJ5dGVzCisJCSAqIGVhY2guCisJCSAqCisJCSAqIFRoaXMgbGVhdmVzIDYyIDRLIHBhZ2VzLgorCQkgKgorCQkgKiBUaGUgbmV4dCBOIHBhZ2VzIGFyZSB1c2VkIGZvciB0cmFuc21pdCBmcmFtZShzKS4gV2UKKwkJICogcmVzZXJ2ZSBlbm91Z2ggNEsgcGFnZSBibG9ja3MgdG8gaG9sZCB0aGUgcmVxdWlyZWQKKwkJICogbnVtYmVyIG9mIHRyYW5zbWl0IGRtYSBidWZmZXJzIChudW1fdHhfZG1hX2J1ZmZlcnMpLAorCQkgKiBlYWNoIG9mIE1heEZyYW1lU2l6ZSBzaXplLgorCQkgKgorCQkgKiBPZiB0aGUgcmVtYWluaW5nIHBhZ2VzICg2Mi1OKSwgZGV0ZXJtaW5lIGhvdyBtYW55IGNhbgorCQkgKiBiZSB1c2VkIHRvIHJlY2VpdmUgZnVsbCBNYXhGcmFtZVNpemUgaW5ib3VuZCBmcmFtZXMKKwkJICovCisJCWluZm8tPnR4X2J1ZmZlcl9jb3VudCA9IGluZm8tPm51bV90eF9kbWFfYnVmZmVycyAqIEJ1ZmZlcnNQZXJGcmFtZTsKKwkJaW5mby0+cnhfYnVmZmVyX2NvdW50ID0gNjIgLSBpbmZvLT50eF9idWZmZXJfY291bnQ7CisJfSBlbHNlIHsKKwkJLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgUEFHRV9TSVpFIGJ1ZmZlcnMgbmVlZGVkIGZvciAqLworCQkvKiByZWNlaXZlIGFuZCB0cmFuc21pdCBETUEgYnVmZmVycy4gKi8KKworCisJCS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIERNQSBidWZmZXJzIG5lY2Vzc2FyeSB0byAqLworCQkvKiBob2xkIDcgbWF4IHNpemUgcmVjZWl2ZSBmcmFtZXMgYW5kIG9uZSBtYXggc2l6ZSB0cmFuc21pdCBmcmFtZS4gKi8KKwkJLyogVGhlIHJlY2VpdmUgYnVmZmVyIGNvdW50IGlzIGJ1bXBlZCBieSBvbmUgc28gd2UgYXZvaWQgYW4gKi8KKwkJLyogRW5kIG9mIExpc3QgY29uZGl0aW9uIGlmIGFsbCByZWNlaXZlIGJ1ZmZlcnMgYXJlIHVzZWQgd2hlbiAqLworCQkvKiB1c2luZyBsaW5rZWQgbGlzdCBETUEgYnVmZmVycy4gKi8KKworCQlpbmZvLT50eF9idWZmZXJfY291bnQgPSBpbmZvLT5udW1fdHhfZG1hX2J1ZmZlcnMgKiBCdWZmZXJzUGVyRnJhbWU7CisJCWluZm8tPnJ4X2J1ZmZlcl9jb3VudCA9IChCdWZmZXJzUGVyRnJhbWUgKiBNQVhSWEZSQU1FUykgKyA2OworCQkKKwkJLyogCisJCSAqIGxpbWl0IHRvdGFsIFR4QnVmZmVycyAmIFJ4QnVmZmVycyB0byA2MiA0SyB0b3RhbCAKKwkJICogKGFsYSBQQ0kgQWxsb2NhdGlvbikgCisJCSAqLworCQkKKwkJaWYgKCAoaW5mby0+dHhfYnVmZmVyX2NvdW50ICsgaW5mby0+cnhfYnVmZmVyX2NvdW50KSA+IDYyICkKKwkJCWluZm8tPnJ4X2J1ZmZlcl9jb3VudCA9IDYyIC0gaW5mby0+dHhfYnVmZmVyX2NvdW50OworCisJfQorCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCIlcyglZCk6QWxsb2NhdGluZyAlZCBUWCBhbmQgJWQgUlggRE1BIGJ1ZmZlcnMuXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sIGluZm8tPnR4X2J1ZmZlcl9jb3VudCxpbmZvLT5yeF9idWZmZXJfY291bnQpOworCQorCWlmICggbWdzbF9hbGxvY19idWZmZXJfbGlzdF9tZW1vcnkoIGluZm8gKSA8IDAgfHwKKwkJICBtZ3NsX2FsbG9jX2ZyYW1lX21lbW9yeShpbmZvLCBpbmZvLT5yeF9idWZmZXJfbGlzdCwgaW5mby0+cnhfYnVmZmVyX2NvdW50KSA8IDAgfHwgCisJCSAgbWdzbF9hbGxvY19mcmFtZV9tZW1vcnkoaW5mbywgaW5mby0+dHhfYnVmZmVyX2xpc3QsIGluZm8tPnR4X2J1ZmZlcl9jb3VudCkgPCAwIHx8IAorCQkgIG1nc2xfYWxsb2NfaW50ZXJtZWRpYXRlX3J4YnVmZmVyX21lbW9yeShpbmZvKSA8IDAgIHx8CisJCSAgbWdzbF9hbGxvY19pbnRlcm1lZGlhdGVfdHhidWZmZXJfbWVtb3J5KGluZm8pIDwgMCApIHsKKwkJcHJpbnRrKCIlcyglZCk6Q2FuJ3QgYWxsb2NhdGUgRE1BIGJ1ZmZlciBtZW1vcnlcbiIsX19GSUxFX18sX19MSU5FX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJCisJbWdzbF9yZXNldF9yeF9kbWFfYnVmZmVycyggaW5mbyApOworICAJbWdzbF9yZXNldF90eF9kbWFfYnVmZmVycyggaW5mbyApOworCisJcmV0dXJuIDA7CisKK30JLyogZW5kIG9mIG1nc2xfYWxsb2NhdGVfZG1hX2J1ZmZlcnMoKSAqLworCisvKgorICogbWdzbF9hbGxvY19idWZmZXJfbGlzdF9tZW1vcnkoKQorICogCisgKiBBbGxvY2F0ZSBhIGNvbW1vbiBETUEgYnVmZmVyIGZvciB1c2UgYXMgdGhlCisgKiByZWNlaXZlIGFuZCB0cmFuc21pdCBidWZmZXIgbGlzdHMuCisgKiAKKyAqIEEgYnVmZmVyIGxpc3QgaXMgYSBzZXQgb2YgYnVmZmVyIGVudHJpZXMgd2hlcmUgZWFjaCBlbnRyeSBjb250YWlucworICogYSBwb2ludGVyIHRvIGFuIGFjdHVhbCBidWZmZXIgYW5kIGEgcG9pbnRlciB0byB0aGUgbmV4dCBidWZmZXIgZW50cnkKKyAqIChwbHVzIHNvbWUgb3RoZXIgaW5mbyBhYm91dCB0aGUgYnVmZmVyKS4KKyAqIAorICogVGhlIGJ1ZmZlciBlbnRyaWVzIGZvciBhIGxpc3QgYXJlIGJ1aWx0IHRvIGZvcm0gYSBjaXJjdWxhciBsaXN0IHNvCisgKiB0aGF0IHdoZW4gdGhlIGVudGlyZSBsaXN0IGhhcyBiZWVuIHRyYXZlcnNlZCB5b3Ugc3RhcnQgYmFjayBhdCB0aGUKKyAqIGJlZ2lubmluZy4KKyAqIAorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZvciBqdXN0IHRoZSBidWZmZXIgZW50cmllcy4KKyAqIFRoZSBsaW5rcyAocG9pbnRlciB0byBuZXh0IGVudHJ5KSBhcmUgZmlsbGVkIGluIHdpdGggdGhlIHBoeXNpY2FsCisgKiBhZGRyZXNzIG9mIHRoZSBuZXh0IGVudHJ5IHNvIHRoZSBhZGFwdGVyIGNhbiBuYXZpZ2F0ZSB0aGUgbGlzdAorICogdXNpbmcgYnVzIG1hc3RlciBETUEuIFRoZSBwb2ludGVycyB0byB0aGUgYWN0dWFsIGJ1ZmZlcnMgYXJlIGZpbGxlZAorICogb3V0IGxhdGVyIHdoZW4gdGhlIGFjdHVhbCBidWZmZXJzIGFyZSBhbGxvY2F0ZWQuCisgKiAKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOgkwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvcgorICovCitzdGF0aWMgaW50IG1nc2xfYWxsb2NfYnVmZmVyX2xpc3RfbWVtb3J5KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApIHsKKwkJLyogUENJIGFkYXB0ZXIgdXNlcyBzaGFyZWQgbWVtb3J5LiAqLworCQlpbmZvLT5idWZmZXJfbGlzdCA9IGluZm8tPm1lbW9yeV9iYXNlICsgaW5mby0+bGFzdF9tZW1fYWxsb2M7CisJCWluZm8tPmJ1ZmZlcl9saXN0X3BoeXMgPSBpbmZvLT5sYXN0X21lbV9hbGxvYzsKKwkJaW5mby0+bGFzdF9tZW1fYWxsb2MgKz0gQlVGRkVSTElTVFNJWkU7CisJfSBlbHNlIHsKKwkJLyogSVNBIGFkYXB0ZXIgdXNlcyBzeXN0ZW0gbWVtb3J5LiAqLworCQkvKiBUaGUgYnVmZmVyIGxpc3RzIGFyZSBhbGxvY2F0ZWQgYXMgYSBjb21tb24gYnVmZmVyIHRoYXQgYm90aCAqLworCQkvKiB0aGUgcHJvY2Vzc29yIGFuZCBhZGFwdGVyIGNhbiBhY2Nlc3MuIFRoaXMgYWxsb3dzIHRoZSBkcml2ZXIgdG8gKi8KKwkJLyogaW5zcGVjdCBwb3J0aW9ucyBvZiB0aGUgYnVmZmVyIHdoaWxlIG90aGVyIHBvcnRpb25zIGFyZSBiZWluZyAqLworCQkvKiB1cGRhdGVkIGJ5IHRoZSBhZGFwdGVyIHVzaW5nIEJ1cyBNYXN0ZXIgRE1BLiAqLworCisJCWluZm8tPmJ1ZmZlcl9saXN0ID0ga21hbGxvYyhCVUZGRVJMSVNUU0laRSwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCQlpZiAoIGluZm8tPmJ1ZmZlcl9saXN0ID09IE5VTEwgKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCQkKKwkJaW5mby0+YnVmZmVyX2xpc3RfcGh5cyA9IGlzYV92aXJ0X3RvX2J1cyhpbmZvLT5idWZmZXJfbGlzdCk7CisJfQorCisJLyogV2UgZ290IHRoZSBtZW1vcnkgZm9yIHRoZSBidWZmZXIgZW50cnkgbGlzdHMuICovCisJLyogSW5pdGlhbGl6ZSB0aGUgbWVtb3J5IGJsb2NrIHRvIGFsbCB6ZXJvcy4gKi8KKwltZW1zZXQoIGluZm8tPmJ1ZmZlcl9saXN0LCAwLCBCVUZGRVJMSVNUU0laRSApOworCisJLyogU2F2ZSB2aXJ0dWFsIGFkZHJlc3MgcG9pbnRlcnMgdG8gdGhlIHJlY2VpdmUgYW5kICovCisJLyogdHJhbnNtaXQgYnVmZmVyIGxpc3RzLiAoUmVjZWl2ZSAxc3QpLiBUaGVzZSBwb2ludGVycyB3aWxsICovCisJLyogYmUgdXNlZCBieSB0aGUgcHJvY2Vzc29yIHRvIGFjY2VzcyB0aGUgbGlzdHMuICovCisJaW5mby0+cnhfYnVmZmVyX2xpc3QgPSAoRE1BQlVGRkVSRU5UUlkgKilpbmZvLT5idWZmZXJfbGlzdDsKKwlpbmZvLT50eF9idWZmZXJfbGlzdCA9IChETUFCVUZGRVJFTlRSWSAqKWluZm8tPmJ1ZmZlcl9saXN0OworCWluZm8tPnR4X2J1ZmZlcl9saXN0ICs9IGluZm8tPnJ4X2J1ZmZlcl9jb3VudDsKKworCS8qCisJICogQnVpbGQgdGhlIGxpbmtzIGZvciB0aGUgYnVmZmVyIGVudHJ5IGxpc3RzIHN1Y2ggdGhhdAorCSAqIHR3byBjaXJjdWxhciBsaXN0cyBhcmUgYnVpbHQuIChUcmFuc21pdCBhbmQgUmVjZWl2ZSkuCisJICoKKwkgKiBOb3RlOiB0aGUgbGlua3MgYXJlIHBoeXNpY2FsIGFkZHJlc3NlcworCSAqIHdoaWNoIGFyZSByZWFkIGJ5IHRoZSBhZGFwdGVyIHRvIGRldGVybWluZSB0aGUgbmV4dAorCSAqIGJ1ZmZlciBlbnRyeSB0byB1c2UuCisJICovCisKKwlmb3IgKCBpID0gMDsgaSA8IGluZm8tPnJ4X2J1ZmZlcl9jb3VudDsgaSsrICkgeworCQkvKiBjYWxjdWxhdGUgYW5kIHN0b3JlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhpcyBidWZmZXIgZW50cnkgKi8KKwkJaW5mby0+cnhfYnVmZmVyX2xpc3RbaV0ucGh5c19lbnRyeSA9CisJCQlpbmZvLT5idWZmZXJfbGlzdF9waHlzICsgKGkgKiBzaXplb2YoRE1BQlVGRkVSRU5UUlkpKTsKKworCQkvKiBjYWxjdWxhdGUgYW5kIHN0b3JlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgKi8KKwkJLyogbmV4dCBlbnRyeSBpbiBjaXJ1bGFyIGxpc3Qgb2YgZW50cmllcyAqLworCisJCWluZm8tPnJ4X2J1ZmZlcl9saXN0W2ldLmxpbmsgPSBpbmZvLT5idWZmZXJfbGlzdF9waHlzOworCisJCWlmICggaSA8IGluZm8tPnJ4X2J1ZmZlcl9jb3VudCAtIDEgKQorCQkJaW5mby0+cnhfYnVmZmVyX2xpc3RbaV0ubGluayArPSAoaSArIDEpICogc2l6ZW9mKERNQUJVRkZFUkVOVFJZKTsKKwl9CisKKwlmb3IgKCBpID0gMDsgaSA8IGluZm8tPnR4X2J1ZmZlcl9jb3VudDsgaSsrICkgeworCQkvKiBjYWxjdWxhdGUgYW5kIHN0b3JlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhpcyBidWZmZXIgZW50cnkgKi8KKwkJaW5mby0+dHhfYnVmZmVyX2xpc3RbaV0ucGh5c19lbnRyeSA9IGluZm8tPmJ1ZmZlcl9saXN0X3BoeXMgKworCQkJKChpbmZvLT5yeF9idWZmZXJfY291bnQgKyBpKSAqIHNpemVvZihETUFCVUZGRVJFTlRSWSkpOworCisJCS8qIGNhbGN1bGF0ZSBhbmQgc3RvcmUgcGh5c2ljYWwgYWRkcmVzcyBvZiAqLworCQkvKiBuZXh0IGVudHJ5IGluIGNpcnVsYXIgbGlzdCBvZiBlbnRyaWVzICovCisKKwkJaW5mby0+dHhfYnVmZmVyX2xpc3RbaV0ubGluayA9IGluZm8tPmJ1ZmZlcl9saXN0X3BoeXMgKworCQkJaW5mby0+cnhfYnVmZmVyX2NvdW50ICogc2l6ZW9mKERNQUJVRkZFUkVOVFJZKTsKKworCQlpZiAoIGkgPCBpbmZvLT50eF9idWZmZXJfY291bnQgLSAxICkKKwkJCWluZm8tPnR4X2J1ZmZlcl9saXN0W2ldLmxpbmsgKz0gKGkgKyAxKSAqIHNpemVvZihETUFCVUZGRVJFTlRSWSk7CisJfQorCisJcmV0dXJuIDA7CisKK30JLyogZW5kIG9mIG1nc2xfYWxsb2NfYnVmZmVyX2xpc3RfbWVtb3J5KCkgKi8KKworLyogRnJlZSBETUEgYnVmZmVycyBhbGxvY2F0ZWQgZm9yIHVzZSBhcyB0aGUKKyAqIHJlY2VpdmUgYW5kIHRyYW5zbWl0IGJ1ZmZlciBsaXN0cy4KKyAqIFdhcm5pbmc6CisgKiAKKyAqIAlUaGUgZGF0YSB0cmFuc2ZlciBidWZmZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmZmVyIGxpc3QKKyAqIAlNVVNUIGJlIGZyZWVkIGJlZm9yZSBmcmVlaW5nIHRoZSBidWZmZXIgbGlzdCBpdHNlbGYgYmVjYXVzZQorICogCXRoZSBidWZmZXIgbGlzdCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGZyZWUKKyAqIAl0aGUgaW5kaXZpZHVhbCBidWZmZXJzIQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2ZyZWVfYnVmZmVyX2xpc3RfbWVtb3J5KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCWlmICggaW5mby0+YnVmZmVyX2xpc3QgJiYgaW5mby0+YnVzX3R5cGUgIT0gTUdTTF9CVVNfVFlQRV9QQ0kgKQorCQlrZnJlZShpbmZvLT5idWZmZXJfbGlzdCk7CisJCQorCWluZm8tPmJ1ZmZlcl9saXN0ID0gTlVMTDsKKwlpbmZvLT5yeF9idWZmZXJfbGlzdCA9IE5VTEw7CisJaW5mby0+dHhfYnVmZmVyX2xpc3QgPSBOVUxMOworCit9CS8qIGVuZCBvZiBtZ3NsX2ZyZWVfYnVmZmVyX2xpc3RfbWVtb3J5KCkgKi8KKworLyoKKyAqIG1nc2xfYWxsb2NfZnJhbWVfbWVtb3J5KCkKKyAqIAorICogCUFsbG9jYXRlIHRoZSBmcmFtZSBETUEgYnVmZmVycyB1c2VkIGJ5IHRoZSBzcGVjaWZpZWQgYnVmZmVyIGxpc3QuCisgKiAJRWFjaCBETUEgYnVmZmVyIHdpbGwgYmUgb25lIG1lbW9yeSBwYWdlIGluIHNpemUuIFRoaXMgaXMgbmVjZXNzYXJ5CisgKiAJYmVjYXVzZSBtZW1vcnkgY2FuIGZyYWdtZW50IGVub3VnaCB0aGF0IGl0IG1heSBiZSBpbXBvc3NpYmxlCisgKiAJY29udGlndW91cyBwYWdlcy4KKyAqIAorICogQXJndW1lbnRzOgorICogCisgKglpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJQnVmZmVyTGlzdAlwb2ludGVyIHRvIGxpc3Qgb2YgYnVmZmVyIGVudHJpZXMKKyAqIAlCdWZmZXJjb3VudAljb3VudCBvZiBidWZmZXIgZW50cmllcyBpbiBidWZmZXIgbGlzdAorICogCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIC1FTk9NRU0KKyAqLworc3RhdGljIGludCBtZ3NsX2FsbG9jX2ZyYW1lX21lbW9yeShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sRE1BQlVGRkVSRU5UUlkgKkJ1ZmZlckxpc3QsaW50IEJ1ZmZlcmNvdW50KQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyOworCisJLyogQWxsb2NhdGUgcGFnZSBzaXplZCBidWZmZXJzIGZvciB0aGUgcmVjZWl2ZSBidWZmZXIgbGlzdCAqLworCisJZm9yICggaSA9IDA7IGkgPCBCdWZmZXJjb3VudDsgaSsrICkgeworCQlpZiAoIGluZm8tPmJ1c190eXBlID09IE1HU0xfQlVTX1RZUEVfUENJICkgeworCQkJLyogUENJIGFkYXB0ZXIgdXNlcyBzaGFyZWQgbWVtb3J5IGJ1ZmZlcnMuICovCisJCQlCdWZmZXJMaXN0W2ldLnZpcnRfYWRkciA9IGluZm8tPm1lbW9yeV9iYXNlICsgaW5mby0+bGFzdF9tZW1fYWxsb2M7CisJCQlwaHlzX2FkZHIgPSBpbmZvLT5sYXN0X21lbV9hbGxvYzsKKwkJCWluZm8tPmxhc3RfbWVtX2FsbG9jICs9IERNQUJVRkZFUlNJWkU7CisJCX0gZWxzZSB7CisJCQkvKiBJU0EgYWRhcHRlciB1c2VzIHN5c3RlbSBtZW1vcnkuICovCisJCQlCdWZmZXJMaXN0W2ldLnZpcnRfYWRkciA9IAorCQkJCWttYWxsb2MoRE1BQlVGRkVSU0laRSwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCQkJaWYgKCBCdWZmZXJMaXN0W2ldLnZpcnRfYWRkciA9PSBOVUxMICkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCXBoeXNfYWRkciA9IGlzYV92aXJ0X3RvX2J1cyhCdWZmZXJMaXN0W2ldLnZpcnRfYWRkcik7CisJCX0KKwkJQnVmZmVyTGlzdFtpXS5waHlzX2FkZHIgPSBwaHlzX2FkZHI7CisJfQorCisJcmV0dXJuIDA7CisKK30JLyogZW5kIG9mIG1nc2xfYWxsb2NfZnJhbWVfbWVtb3J5KCkgKi8KKworLyoKKyAqIG1nc2xfZnJlZV9mcmFtZV9tZW1vcnkoKQorICogCisgKiAJRnJlZSB0aGUgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGgKKyAqIAllYWNoIGJ1ZmZlciBlbnRyeSBvZiBhIGJ1ZmZlciBsaXN0LgorICogCisgKiBBcmd1bWVudHM6CisgKiAKKyAqCWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIAlCdWZmZXJMaXN0CXBvaW50ZXIgdG8gbGlzdCBvZiBidWZmZXIgZW50cmllcworICogCUJ1ZmZlcmNvdW50CWNvdW50IG9mIGJ1ZmZlciBlbnRyaWVzIGluIGJ1ZmZlciBsaXN0CisgKiAKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2ZyZWVfZnJhbWVfbWVtb3J5KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgRE1BQlVGRkVSRU5UUlkgKkJ1ZmZlckxpc3QsIGludCBCdWZmZXJjb3VudCkKK3sKKwlpbnQgaTsKKworCWlmICggQnVmZmVyTGlzdCApIHsKKwkJZm9yICggaSA9IDAgOyBpIDwgQnVmZmVyY291bnQgOyBpKysgKSB7CisJCQlpZiAoIEJ1ZmZlckxpc3RbaV0udmlydF9hZGRyICkgeworCQkJCWlmICggaW5mby0+YnVzX3R5cGUgIT0gTUdTTF9CVVNfVFlQRV9QQ0kgKQorCQkJCQlrZnJlZShCdWZmZXJMaXN0W2ldLnZpcnRfYWRkcik7CisJCQkJQnVmZmVyTGlzdFtpXS52aXJ0X2FkZHIgPSBOVUxMOworCQkJfQorCQl9CisJfQorCit9CS8qIGVuZCBvZiBtZ3NsX2ZyZWVfZnJhbWVfbWVtb3J5KCkgKi8KKworLyogbWdzbF9mcmVlX2RtYV9idWZmZXJzKCkKKyAqIAorICogCUZyZWUgRE1BIGJ1ZmZlcnMKKyAqIAkKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfZnJlZV9kbWFfYnVmZmVycyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwltZ3NsX2ZyZWVfZnJhbWVfbWVtb3J5KCBpbmZvLCBpbmZvLT5yeF9idWZmZXJfbGlzdCwgaW5mby0+cnhfYnVmZmVyX2NvdW50ICk7CisJbWdzbF9mcmVlX2ZyYW1lX21lbW9yeSggaW5mbywgaW5mby0+dHhfYnVmZmVyX2xpc3QsIGluZm8tPnR4X2J1ZmZlcl9jb3VudCApOworCW1nc2xfZnJlZV9idWZmZXJfbGlzdF9tZW1vcnkoIGluZm8gKTsKKworfQkvKiBlbmQgb2YgbWdzbF9mcmVlX2RtYV9idWZmZXJzKCkgKi8KKworCisvKgorICogbWdzbF9hbGxvY19pbnRlcm1lZGlhdGVfcnhidWZmZXJfbWVtb3J5KCkKKyAqIAorICogCUFsbG9jYXRlIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG1heF9mcmFtZV9zaXplLiBUaGlzIGJ1ZmZlcgorICoJaXMgdXNlZCB0byBwYXNzIGFuIGFzc2VtYmxlZCBmcmFtZSB0byB0aGUgbGluZSBkaXNjaXBsaW5lLgorICogCisgKiBBcmd1bWVudHM6CisgKiAKKyAqCWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIAorICogUmV0dXJuIFZhbHVlOgkwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSAtRU5PTUVNCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9hbGxvY19pbnRlcm1lZGlhdGVfcnhidWZmZXJfbWVtb3J5KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwlpbmZvLT5pbnRlcm1lZGlhdGVfcnhidWZmZXIgPSBrbWFsbG9jKGluZm8tPm1heF9mcmFtZV9zaXplLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCBpbmZvLT5pbnRlcm1lZGlhdGVfcnhidWZmZXIgPT0gTlVMTCApCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7CisKK30JLyogZW5kIG9mIG1nc2xfYWxsb2NfaW50ZXJtZWRpYXRlX3J4YnVmZmVyX21lbW9yeSgpICovCisKKy8qCisgKiBtZ3NsX2ZyZWVfaW50ZXJtZWRpYXRlX3J4YnVmZmVyX21lbW9yeSgpCisgKiAKKyAqIAorICogQXJndW1lbnRzOgorICogCisgKglpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2ZyZWVfaW50ZXJtZWRpYXRlX3J4YnVmZmVyX21lbW9yeShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pCit7CisJaWYgKCBpbmZvLT5pbnRlcm1lZGlhdGVfcnhidWZmZXIgKQorCQlrZnJlZShpbmZvLT5pbnRlcm1lZGlhdGVfcnhidWZmZXIpOworCisJaW5mby0+aW50ZXJtZWRpYXRlX3J4YnVmZmVyID0gTlVMTDsKKworfQkvKiBlbmQgb2YgbWdzbF9mcmVlX2ludGVybWVkaWF0ZV9yeGJ1ZmZlcl9tZW1vcnkoKSAqLworCisvKgorICogbWdzbF9hbGxvY19pbnRlcm1lZGlhdGVfdHhidWZmZXJfbWVtb3J5KCkKKyAqCisgKiAJQWxsb2NhdGUgaW50ZXJtZGlhdGUgdHJhbnNtaXQgYnVmZmVyKHMpIGxhcmdlIGVub3VnaCB0byBob2xkIG1heF9mcmFtZV9zaXplLgorICogCVRoaXMgYnVmZmVyIGlzIHVzZWQgdG8gbG9hZCB0cmFuc21pdCBmcmFtZXMgaW50byB0aGUgYWRhcHRlcidzIGRtYSB0cmFuc2ZlcgorICogCWJ1ZmZlcnMgd2hlbiB0aGVyZSBpcyBzdWZmaWNpZW50IHNwYWNlLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCisgKglpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKgorICogUmV0dXJuIFZhbHVlOgkwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSAtRU5PTUVNCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9hbGxvY19pbnRlcm1lZGlhdGVfdHhidWZmZXJfbWVtb3J5KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwlpbnQgaTsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50aygiJXMgJXMoJWQpICBhbGxvY2F0aW5nICVkIHR4IGhvbGRpbmcgYnVmZmVyc1xuIiwKKwkJCQlpbmZvLT5kZXZpY2VfbmFtZSwgX19GSUxFX18sX19MSU5FX18saW5mby0+bnVtX3R4X2hvbGRpbmdfYnVmZmVycyk7CisKKwltZW1zZXQoaW5mby0+dHhfaG9sZGluZ19idWZmZXJzLDAsc2l6ZW9mKGluZm8tPnR4X2hvbGRpbmdfYnVmZmVycykpOworCisJZm9yICggaT0wOyBpPGluZm8tPm51bV90eF9ob2xkaW5nX2J1ZmZlcnM7ICsraSkgeworCQlpbmZvLT50eF9ob2xkaW5nX2J1ZmZlcnNbaV0uYnVmZmVyID0KKwkJCWttYWxsb2MoaW5mby0+bWF4X2ZyYW1lX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIGluZm8tPnR4X2hvbGRpbmdfYnVmZmVyc1tpXS5idWZmZXIgPT0gTlVMTCApCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKKworfQkvKiBlbmQgb2YgbWdzbF9hbGxvY19pbnRlcm1lZGlhdGVfdHhidWZmZXJfbWVtb3J5KCkgKi8KKworLyoKKyAqIG1nc2xfZnJlZV9pbnRlcm1lZGlhdGVfdHhidWZmZXJfbWVtb3J5KCkKKyAqCisgKgorICogQXJndW1lbnRzOgorICoKKyAqCWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9mcmVlX2ludGVybWVkaWF0ZV90eGJ1ZmZlcl9tZW1vcnkoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKQoreworCWludCBpOworCisJZm9yICggaT0wOyBpPGluZm8tPm51bV90eF9ob2xkaW5nX2J1ZmZlcnM7ICsraSApIHsKKwkJaWYgKCBpbmZvLT50eF9ob2xkaW5nX2J1ZmZlcnNbaV0uYnVmZmVyICkgeworCQkJCWtmcmVlKGluZm8tPnR4X2hvbGRpbmdfYnVmZmVyc1tpXS5idWZmZXIpOworCQkJCWluZm8tPnR4X2hvbGRpbmdfYnVmZmVyc1tpXS5idWZmZXI9TlVMTDsKKwkJfQorCX0KKworCWluZm8tPmdldF90eF9ob2xkaW5nX2luZGV4ID0gMDsKKwlpbmZvLT5wdXRfdHhfaG9sZGluZ19pbmRleCA9IDA7CisJaW5mby0+dHhfaG9sZGluZ19jb3VudCA9IDA7CisKK30JLyogZW5kIG9mIG1nc2xfZnJlZV9pbnRlcm1lZGlhdGVfdHhidWZmZXJfbWVtb3J5KCkgKi8KKworCisvKgorICogbG9hZF9uZXh0X3R4X2hvbGRpbmdfYnVmZmVyKCkKKyAqCisgKiBhdHRlbXB0cyB0byBsb2FkIHRoZSBuZXh0IGJ1ZmZlcmVkIHR4IHJlcXVlc3QgaW50byB0aGUKKyAqIHR4IGRtYSBidWZmZXJzCisgKgorICogQXJndW1lbnRzOgorICoKKyAqCWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqCisgKiBSZXR1cm4gVmFsdWU6CTEgaWYgbmV4dCBidWZmZXJlZCB0eCByZXF1ZXN0IGxvYWRlZAorICogCQkJaW50byBhZGFwdGVyJ3MgdHggZG1hIGJ1ZmZlciwKKyAqIAkJCTAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgbG9hZF9uZXh0X3R4X2hvbGRpbmdfYnVmZmVyKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICggaW5mby0+dHhfaG9sZGluZ19jb3VudCApIHsKKwkJLyogZGV0ZXJtaW5lIGlmIHdlIGhhdmUgZW5vdWdoIHR4IGRtYSBidWZmZXJzCisJCSAqIHRvIGFjY29tbW9kYXRlIHRoZSBuZXh0IHR4IGZyYW1lCisJCSAqLworCQlzdHJ1Y3QgdHhfaG9sZGluZ19idWZmZXIgKnB0eCA9CisJCQkmaW5mby0+dHhfaG9sZGluZ19idWZmZXJzW2luZm8tPmdldF90eF9ob2xkaW5nX2luZGV4XTsKKwkJaW50IG51bV9mcmVlID0gbnVtX2ZyZWVfdHhfZG1hX2J1ZmZlcnMoaW5mbyk7CisJCWludCBudW1fbmVlZGVkID0gcHR4LT5idWZmZXJfc2l6ZSAvIERNQUJVRkZFUlNJWkU7CisJCWlmICggcHR4LT5idWZmZXJfc2l6ZSAlIERNQUJVRkZFUlNJWkUgKQorCQkJKytudW1fbmVlZGVkOworCisJCWlmIChudW1fbmVlZGVkIDw9IG51bV9mcmVlKSB7CisJCQlpbmZvLT54bWl0X2NudCA9IHB0eC0+YnVmZmVyX3NpemU7CisJCQltZ3NsX2xvYWRfdHhfZG1hX2J1ZmZlcihpbmZvLHB0eC0+YnVmZmVyLHB0eC0+YnVmZmVyX3NpemUpOworCisJCQktLWluZm8tPnR4X2hvbGRpbmdfY291bnQ7CisJCQlpZiAoICsraW5mby0+Z2V0X3R4X2hvbGRpbmdfaW5kZXggPj0gaW5mby0+bnVtX3R4X2hvbGRpbmdfYnVmZmVycykKKwkJCQlpbmZvLT5nZXRfdHhfaG9sZGluZ19pbmRleD0wOworCisJCQkvKiByZXN0YXJ0IHRyYW5zbWl0IHRpbWVyICovCisJCQltb2RfdGltZXIoJmluZm8tPnR4X3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDAwKSk7CisKKwkJCXJldCA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc2F2ZV90eF9idWZmZXJfcmVxdWVzdCgpCisgKgorICogYXR0ZW1wdCB0byBzdG9yZSB0cmFuc21pdCBmcmFtZSByZXF1ZXN0IGZvciBsYXRlciB0cmFuc21pc3Npb24KKyAqCisgKiBBcmd1bWVudHM6CisgKgorICoJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogCUJ1ZmZlcgkJcG9pbnRlciB0byBidWZmZXIgY29udGFpbmluZyBmcmFtZSB0byBsb2FkCisgKiAJQnVmZmVyU2l6ZQlzaXplIGluIGJ5dGVzIG9mIGZyYW1lIGluIEJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToJMSBpZiBhYmxlIHRvIHN0b3JlLCAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHNhdmVfdHhfYnVmZmVyX3JlcXVlc3Qoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLGNvbnN0IGNoYXIgKkJ1ZmZlciwgdW5zaWduZWQgaW50IEJ1ZmZlclNpemUpCit7CisJc3RydWN0IHR4X2hvbGRpbmdfYnVmZmVyICpwdHg7CisKKwlpZiAoIGluZm8tPnR4X2hvbGRpbmdfY291bnQgPj0gaW5mby0+bnVtX3R4X2hvbGRpbmdfYnVmZmVycyApIHsKKwkJcmV0dXJuIDA7CSAgICAgICAgLyogYWxsIGJ1ZmZlcnMgaW4gdXNlICovCisJfQorCisJcHR4ID0gJmluZm8tPnR4X2hvbGRpbmdfYnVmZmVyc1tpbmZvLT5wdXRfdHhfaG9sZGluZ19pbmRleF07CisJcHR4LT5idWZmZXJfc2l6ZSA9IEJ1ZmZlclNpemU7CisJbWVtY3B5KCBwdHgtPmJ1ZmZlciwgQnVmZmVyLCBCdWZmZXJTaXplKTsKKworCSsraW5mby0+dHhfaG9sZGluZ19jb3VudDsKKwlpZiAoICsraW5mby0+cHV0X3R4X2hvbGRpbmdfaW5kZXggPj0gaW5mby0+bnVtX3R4X2hvbGRpbmdfYnVmZmVycykKKwkJaW5mby0+cHV0X3R4X2hvbGRpbmdfaW5kZXg9MDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1nc2xfY2xhaW1fcmVzb3VyY2VzKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwlpZiAocmVxdWVzdF9yZWdpb24oaW5mby0+aW9fYmFzZSxpbmZvLT5pb19hZGRyX3NpemUsInN5bmNsaW5rIikgPT0gTlVMTCkgeworCQlwcmludGsoICIlcyglZCk6SS9PIGFkZHJlc3MgY29uZmxpY3Qgb24gZGV2aWNlICVzIEFkZHI9JTA4WFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pb19iYXNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWluZm8tPmlvX2FkZHJfcmVxdWVzdGVkID0gMTsKKwkKKwlpZiAoIHJlcXVlc3RfaXJxKGluZm8tPmlycV9sZXZlbCxtZ3NsX2ludGVycnVwdCxpbmZvLT5pcnFfZmxhZ3MsCisJCWluZm8tPmRldmljZV9uYW1lLCBpbmZvICkgPCAwICkgeworCQlwcmludGsoICIlcyglZCk6Q2FudCByZXF1ZXN0IGludGVycnVwdCBvbiBkZXZpY2UgJXMgSVJRPSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPmlycV9sZXZlbCApOworCQlnb3RvIGVycm91dDsKKwl9CisJaW5mby0+aXJxX3JlcXVlc3RlZCA9IDE7CisJCisJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApIHsKKwkJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihpbmZvLT5waHlzX21lbW9yeV9iYXNlLDB4NDAwMDAsInN5bmNsaW5rIikgPT0gTlVMTCkgeworCQkJcHJpbnRrKCAiJXMoJWQpOm1lbSBhZGRyIGNvbmZsaWN0IGRldmljZSAlcyBBZGRyPSUwOFhcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnBoeXNfbWVtb3J5X2Jhc2UpOworCQkJZ290byBlcnJvdXQ7CisJCX0KKwkJaW5mby0+c2hhcmVkX21lbV9yZXF1ZXN0ZWQgPSAxOworCQlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGluZm8tPnBoeXNfbGNyX2Jhc2UgKyBpbmZvLT5sY3Jfb2Zmc2V0LDEyOCwic3luY2xpbmsiKSA9PSBOVUxMKSB7CisJCQlwcmludGsoICIlcyglZCk6bGNyIG1lbSBhZGRyIGNvbmZsaWN0IGRldmljZSAlcyBBZGRyPSUwOFhcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnBoeXNfbGNyX2Jhc2UgKyBpbmZvLT5sY3Jfb2Zmc2V0KTsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisJCWluZm8tPmxjcl9tZW1fcmVxdWVzdGVkID0gMTsKKworCQlpbmZvLT5tZW1vcnlfYmFzZSA9IGlvcmVtYXAoaW5mby0+cGh5c19tZW1vcnlfYmFzZSwweDQwMDAwKTsKKwkJaWYgKCFpbmZvLT5tZW1vcnlfYmFzZSkgeworCQkJcHJpbnRrKCAiJXMoJWQpOkNhbnQgbWFwIHNoYXJlZCBtZW1vcnkgb24gZGV2aWNlICVzIE1lbUFkZHI9JTA4WFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+cGh5c19tZW1vcnlfYmFzZSApOworCQkJZ290byBlcnJvdXQ7CisJCX0KKwkJCisJCWlmICggIW1nc2xfbWVtb3J5X3Rlc3QoaW5mbykgKSB7CisJCQlwcmludGsoICIlcyglZCk6RmFpbGVkIHNoYXJlZCBtZW1vcnkgdGVzdCAlcyBNZW1BZGRyPSUwOFhcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnBoeXNfbWVtb3J5X2Jhc2UgKTsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisJCQorCQlpbmZvLT5sY3JfYmFzZSA9IGlvcmVtYXAoaW5mby0+cGh5c19sY3JfYmFzZSxQQUdFX1NJWkUpICsgaW5mby0+bGNyX29mZnNldDsKKwkJaWYgKCFpbmZvLT5sY3JfYmFzZSkgeworCQkJcHJpbnRrKCAiJXMoJWQpOkNhbnQgbWFwIExDUiBtZW1vcnkgb24gZGV2aWNlICVzIE1lbUFkZHI9JTA4WFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+cGh5c19sY3JfYmFzZSApOworCQkJZ290byBlcnJvdXQ7CisJCX0KKwkJCisJfSBlbHNlIHsKKwkJLyogY2xhaW0gRE1BIGNoYW5uZWwgKi8KKwkJCisJCWlmIChyZXF1ZXN0X2RtYShpbmZvLT5kbWFfbGV2ZWwsaW5mby0+ZGV2aWNlX25hbWUpIDwgMCl7CisJCQlwcmludGsoICIlcyglZCk6Q2FudCByZXF1ZXN0IERNQSBjaGFubmVsIG9uIGRldmljZSAlcyBETUE9JWRcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPmRtYV9sZXZlbCApOworCQkJbWdzbF9yZWxlYXNlX3Jlc291cmNlcyggaW5mbyApOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaW5mby0+ZG1hX3JlcXVlc3RlZCA9IDE7CisKKwkJLyogSVNBIGFkYXB0ZXIgdXNlcyBidXMgbWFzdGVyIERNQSAqLwkJCisJCXNldF9kbWFfbW9kZShpbmZvLT5kbWFfbGV2ZWwsRE1BX01PREVfQ0FTQ0FERSk7CisJCWVuYWJsZV9kbWEoaW5mby0+ZG1hX2xldmVsKTsKKwl9CisJCisJaWYgKCBtZ3NsX2FsbG9jYXRlX2RtYV9idWZmZXJzKGluZm8pIDwgMCApIHsKKwkJcHJpbnRrKCAiJXMoJWQpOkNhbnQgYWxsb2NhdGUgRE1BIGJ1ZmZlcnMgb24gZGV2aWNlICVzIERNQT0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5kbWFfbGV2ZWwgKTsKKwkJZ290byBlcnJvdXQ7CisJfQkKKwkKKwlyZXR1cm4gMDsKK2Vycm91dDoKKwltZ3NsX3JlbGVhc2VfcmVzb3VyY2VzKGluZm8pOworCXJldHVybiAtRU5PREVWOworCit9CS8qIGVuZCBvZiBtZ3NsX2NsYWltX3Jlc291cmNlcygpICovCisKK3N0YXRpYyB2b2lkIG1nc2xfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKQoreworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50ayggIiVzKCVkKTptZ3NsX3JlbGVhc2VfcmVzb3VyY2VzKCVzKSBlbnRyeVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lICk7CisJCQkKKwlpZiAoIGluZm8tPmlycV9yZXF1ZXN0ZWQgKSB7CisJCWZyZWVfaXJxKGluZm8tPmlycV9sZXZlbCwgaW5mbyk7CisJCWluZm8tPmlycV9yZXF1ZXN0ZWQgPSAwOworCX0KKwlpZiAoIGluZm8tPmRtYV9yZXF1ZXN0ZWQgKSB7CisJCWRpc2FibGVfZG1hKGluZm8tPmRtYV9sZXZlbCk7CisJCWZyZWVfZG1hKGluZm8tPmRtYV9sZXZlbCk7CisJCWluZm8tPmRtYV9yZXF1ZXN0ZWQgPSAwOworCX0KKwltZ3NsX2ZyZWVfZG1hX2J1ZmZlcnMoaW5mbyk7CisJbWdzbF9mcmVlX2ludGVybWVkaWF0ZV9yeGJ1ZmZlcl9tZW1vcnkoaW5mbyk7CisgICAgIAltZ3NsX2ZyZWVfaW50ZXJtZWRpYXRlX3R4YnVmZmVyX21lbW9yeShpbmZvKTsKKwkKKwlpZiAoIGluZm8tPmlvX2FkZHJfcmVxdWVzdGVkICkgeworCQlyZWxlYXNlX3JlZ2lvbihpbmZvLT5pb19iYXNlLGluZm8tPmlvX2FkZHJfc2l6ZSk7CisJCWluZm8tPmlvX2FkZHJfcmVxdWVzdGVkID0gMDsKKwl9CisJaWYgKCBpbmZvLT5zaGFyZWRfbWVtX3JlcXVlc3RlZCApIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPnBoeXNfbWVtb3J5X2Jhc2UsMHg0MDAwMCk7CisJCWluZm8tPnNoYXJlZF9tZW1fcmVxdWVzdGVkID0gMDsKKwl9CisJaWYgKCBpbmZvLT5sY3JfbWVtX3JlcXVlc3RlZCApIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPnBoeXNfbGNyX2Jhc2UgKyBpbmZvLT5sY3Jfb2Zmc2V0LDEyOCk7CisJCWluZm8tPmxjcl9tZW1fcmVxdWVzdGVkID0gMDsKKwl9CisJaWYgKGluZm8tPm1lbW9yeV9iYXNlKXsKKwkJaW91bm1hcChpbmZvLT5tZW1vcnlfYmFzZSk7CisJCWluZm8tPm1lbW9yeV9iYXNlID0gTlVMTDsKKwl9CisJaWYgKGluZm8tPmxjcl9iYXNlKXsKKwkJaW91bm1hcChpbmZvLT5sY3JfYmFzZSAtIGluZm8tPmxjcl9vZmZzZXQpOworCQlpbmZvLT5sY3JfYmFzZSA9IE5VTEw7CisJfQorCQorCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50ayggIiVzKCVkKTptZ3NsX3JlbGVhc2VfcmVzb3VyY2VzKCVzKSBleGl0XG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCQorfQkvKiBlbmQgb2YgbWdzbF9yZWxlYXNlX3Jlc291cmNlcygpICovCisKKy8qIG1nc2xfYWRkX2RldmljZSgpCisgKiAKKyAqIAlBZGQgdGhlIHNwZWNpZmllZCBkZXZpY2UgaW5zdGFuY2UgZGF0YSBzdHJ1Y3R1cmUgdG8gdGhlCisgKiAJZ2xvYmFsIGxpbmtlZCBsaXN0IG9mIGRldmljZXMgYW5kIGluY3JlbWVudCB0aGUgZGV2aWNlIGNvdW50LgorICogCQorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF9hZGRfZGV2aWNlKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCWluZm8tPm5leHRfZGV2aWNlID0gTlVMTDsKKwlpbmZvLT5saW5lID0gbWdzbF9kZXZpY2VfY291bnQ7CisJc3ByaW50ZihpbmZvLT5kZXZpY2VfbmFtZSwidHR5U0wlZCIsaW5mby0+bGluZSk7CisJCisJaWYgKGluZm8tPmxpbmUgPCBNQVhfVE9UQUxfREVWSUNFUykgeworCQlpZiAobWF4ZnJhbWVbaW5mby0+bGluZV0pCisJCQlpbmZvLT5tYXhfZnJhbWVfc2l6ZSA9IG1heGZyYW1lW2luZm8tPmxpbmVdOworCQlpbmZvLT5kb3N5bmNwcHAgPSBkb3N5bmNwcHBbaW5mby0+bGluZV07CisKKwkJaWYgKHR4ZG1hYnVmc1tpbmZvLT5saW5lXSkgeworCQkJaW5mby0+bnVtX3R4X2RtYV9idWZmZXJzID0gdHhkbWFidWZzW2luZm8tPmxpbmVdOworCQkJaWYgKGluZm8tPm51bV90eF9kbWFfYnVmZmVycyA8IDEpCisJCQkJaW5mby0+bnVtX3R4X2RtYV9idWZmZXJzID0gMTsKKwkJfQorCisJCWlmICh0eGhvbGRidWZzW2luZm8tPmxpbmVdKSB7CisJCQlpbmZvLT5udW1fdHhfaG9sZGluZ19idWZmZXJzID0gdHhob2xkYnVmc1tpbmZvLT5saW5lXTsKKwkJCWlmIChpbmZvLT5udW1fdHhfaG9sZGluZ19idWZmZXJzIDwgMSkKKwkJCQlpbmZvLT5udW1fdHhfaG9sZGluZ19idWZmZXJzID0gMTsKKwkJCWVsc2UgaWYgKGluZm8tPm51bV90eF9ob2xkaW5nX2J1ZmZlcnMgPiBNQVhfVFhfSE9MRElOR19CVUZGRVJTKQorCQkJCWluZm8tPm51bV90eF9ob2xkaW5nX2J1ZmZlcnMgPSBNQVhfVFhfSE9MRElOR19CVUZGRVJTOworCQl9CisJfQorCisJbWdzbF9kZXZpY2VfY291bnQrKzsKKwkKKwlpZiAoICFtZ3NsX2RldmljZV9saXN0ICkKKwkJbWdzbF9kZXZpY2VfbGlzdCA9IGluZm87CisJZWxzZSB7CQorCQlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmN1cnJlbnRfZGV2ID0gbWdzbF9kZXZpY2VfbGlzdDsKKwkJd2hpbGUoIGN1cnJlbnRfZGV2LT5uZXh0X2RldmljZSApCisJCQljdXJyZW50X2RldiA9IGN1cnJlbnRfZGV2LT5uZXh0X2RldmljZTsKKwkJY3VycmVudF9kZXYtPm5leHRfZGV2aWNlID0gaW5mbzsKKwl9CisJCisJaWYgKCBpbmZvLT5tYXhfZnJhbWVfc2l6ZSA8IDQwOTYgKQorCQlpbmZvLT5tYXhfZnJhbWVfc2l6ZSA9IDQwOTY7CisJZWxzZSBpZiAoIGluZm8tPm1heF9mcmFtZV9zaXplID4gNjU1MzUgKQorCQlpbmZvLT5tYXhfZnJhbWVfc2l6ZSA9IDY1NTM1OworCQorCWlmICggaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9QQ0kgKSB7CisJCXByaW50ayggIlN5bmNMaW5rIFBDSSB2JWQgJXM6IElPPSUwNFggSVJRPSVkIE1lbT0lMDhYLCUwOFggTWF4RnJhbWVTaXplPSV1XG4iLAorCQkJaW5mby0+aHdfdmVyc2lvbiArIDEsIGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pb19iYXNlLCBpbmZvLT5pcnFfbGV2ZWwsCisJCQlpbmZvLT5waHlzX21lbW9yeV9iYXNlLCBpbmZvLT5waHlzX2xjcl9iYXNlLAorCQkgICAgIAlpbmZvLT5tYXhfZnJhbWVfc2l6ZSApOworCX0gZWxzZSB7CisJCXByaW50ayggIlN5bmNMaW5rIElTQSAlczogSU89JTA0WCBJUlE9JWQgRE1BPSVkIE1heEZyYW1lU2l6ZT0ldVxuIiwKKwkJCWluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pb19iYXNlLCBpbmZvLT5pcnFfbGV2ZWwsIGluZm8tPmRtYV9sZXZlbCwKKwkJICAgICAJaW5mby0+bWF4X2ZyYW1lX3NpemUgKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfSERMQworCWhkbGNkZXZfaW5pdChpbmZvKTsKKyNlbmRpZgorCit9CS8qIGVuZCBvZiBtZ3NsX2FkZF9kZXZpY2UoKSAqLworCisvKiBtZ3NsX2FsbG9jYXRlX2RldmljZSgpCisgKiAKKyAqIAlBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGRldmljZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKKyAqIAkKKyAqIEFyZ3VtZW50czoJCW5vbmUKKyAqIFJldHVybiBWYWx1ZToJcG9pbnRlciB0byBtZ3NsX3N0cnVjdCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgTlVMTAorICovCitzdGF0aWMgc3RydWN0IG1nc2xfc3RydWN0KiBtZ3NsX2FsbG9jYXRlX2RldmljZSh2b2lkKQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbzsKKwkKKwlpbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtZ3NsX3N0cnVjdCksCisJCSBHRlBfS0VSTkVMKTsKKwkJIAorCWlmICghaW5mbykgeworCQlwcmludGsoIkVycm9yIGNhbid0IGFsbG9jYXRlIGRldmljZSBpbnN0YW5jZSBkYXRhXG4iKTsKKwl9IGVsc2UgeworCQltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBtZ3NsX3N0cnVjdCkpOworCQlpbmZvLT5tYWdpYyA9IE1HU0xfTUFHSUM7CisJCUlOSVRfV09SSygmaW5mby0+dGFzaywgbWdzbF9iaF9oYW5kbGVyLCBpbmZvKTsKKwkJaW5mby0+bWF4X2ZyYW1lX3NpemUgPSA0MDk2OworCQlpbmZvLT5jbG9zZV9kZWxheSA9IDUqSFovMTA7CisJCWluZm8tPmNsb3Npbmdfd2FpdCA9IDMwKkhaOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5jbG9zZV93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisJCXNwaW5fbG9ja19pbml0KCZpbmZvLT5pcnFfc3BpbmxvY2spOworCQlzcGluX2xvY2tfaW5pdCgmaW5mby0+bmV0bG9jayk7CisJCW1lbWNweSgmaW5mby0+cGFyYW1zLCZkZWZhdWx0X3BhcmFtcyxzaXplb2YoTUdTTF9QQVJBTVMpKTsKKwkJaW5mby0+aWRsZV9tb2RlID0gSERMQ19UWElETEVfRkxBR1M7CQkKKwkJaW5mby0+bnVtX3R4X2RtYV9idWZmZXJzID0gMTsKKwkJaW5mby0+bnVtX3R4X2hvbGRpbmdfYnVmZmVycyA9IDA7CisJfQorCQorCXJldHVybiBpbmZvOworCit9CS8qIGVuZCBvZiBtZ3NsX2FsbG9jYXRlX2RldmljZSgpKi8KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBtZ3NsX29wcyA9IHsKKwkub3BlbiA9IG1nc2xfb3BlbiwKKwkuY2xvc2UgPSBtZ3NsX2Nsb3NlLAorCS53cml0ZSA9IG1nc2xfd3JpdGUsCisJLnB1dF9jaGFyID0gbWdzbF9wdXRfY2hhciwKKwkuZmx1c2hfY2hhcnMgPSBtZ3NsX2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gbWdzbF93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBtZ3NsX2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfYnVmZmVyID0gbWdzbF9mbHVzaF9idWZmZXIsCisJLmlvY3RsID0gbWdzbF9pb2N0bCwKKwkudGhyb3R0bGUgPSBtZ3NsX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gbWdzbF91bnRocm90dGxlLAorCS5zZW5kX3hjaGFyID0gbWdzbF9zZW5kX3hjaGFyLAorCS5icmVha19jdGwgPSBtZ3NsX2JyZWFrLAorCS53YWl0X3VudGlsX3NlbnQgPSBtZ3NsX3dhaXRfdW50aWxfc2VudCwKKyAJLnJlYWRfcHJvYyA9IG1nc2xfcmVhZF9wcm9jLAorCS5zZXRfdGVybWlvcyA9IG1nc2xfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSBtZ3NsX3N0b3AsCisJLnN0YXJ0ID0gbWdzbF9zdGFydCwKKwkuaGFuZ3VwID0gbWdzbF9oYW5ndXAsCisJLnRpb2NtZ2V0ID0gdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gdGlvY21zZXQsCit9OworCisvKgorICogcGVyZm9ybSB0dHkgZGV2aWNlIGluaXRpYWxpemF0aW9uCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9pbml0X3R0eSh2b2lkKQoreworCWludCByYzsKKworCXNlcmlhbF9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKDEyOCk7CisJaWYgKCFzZXJpYWxfZHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwkKKwlzZXJpYWxfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXNlcmlhbF9kcml2ZXItPmRyaXZlcl9uYW1lID0gInN5bmNsaW5rIjsKKwlzZXJpYWxfZHJpdmVyLT5uYW1lID0gInR0eVNMIjsKKwlzZXJpYWxfZHJpdmVyLT5tYWpvciA9IHR0eW1ham9yOworCXNlcmlhbF9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gNjQ7CisJc2VyaWFsX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJc2VyaWFsX2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlzZXJpYWxfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQorCQlCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJc2VyaWFsX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhzZXJpYWxfZHJpdmVyLCAmbWdzbF9vcHMpOworCWlmICgocmMgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKHNlcmlhbF9kcml2ZXIpKSA8IDApIHsKKwkJcHJpbnRrKCIlcyglZCk6Q291bGRuJ3QgcmVnaXN0ZXIgc2VyaWFsIGRyaXZlclxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fKTsKKwkJcHV0X3R0eV9kcml2ZXIoc2VyaWFsX2RyaXZlcik7CisJCXNlcmlhbF9kcml2ZXIgPSBOVUxMOworCQlyZXR1cm4gcmM7CisJfQorCQkJCisgCXByaW50aygiJXMgJXMsIHR0eSBtYWpvciMlZFxuIiwKKwkJZHJpdmVyX25hbWUsIGRyaXZlcl92ZXJzaW9uLAorCQlzZXJpYWxfZHJpdmVyLT5tYWpvcik7CisJcmV0dXJuIDA7Cit9CisKKy8qIGVudW1lcmF0ZSB1c2VyIHNwZWNpZmllZCBJU0EgYWRhcHRlcnMKKyAqLworc3RhdGljIHZvaWQgbWdzbF9lbnVtX2lzYV9kZXZpY2VzKHZvaWQpCit7CisJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvOworCWludCBpOworCQkKKwkvKiBDaGVjayBmb3IgdXNlciBzcGVjaWZpZWQgSVNBIGRldmljZXMgKi8KKwkKKwlmb3IgKGk9MCA7KGkgPCBNQVhfSVNBX0RFVklDRVMpICYmIGlvW2ldICYmIGlycVtpXTsgaSsrKXsKKwkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJCXByaW50aygiSVNBIGRldmljZSBzcGVjaWZpZWQgaW89JTA0WCxpcnE9JWQsZG1hPSVkXG4iLAorCQkJCWlvW2ldLCBpcnFbaV0sIGRtYVtpXSApOworCQkKKwkJaW5mbyA9IG1nc2xfYWxsb2NhdGVfZGV2aWNlKCk7CisJCWlmICggIWluZm8gKSB7CisJCQkvKiBlcnJvciBhbGxvY2F0aW5nIGRldmljZSBpbnN0YW5jZSBkYXRhICovCisJCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0VSUk9SICkKKwkJCQlwcmludGsoICJjYW4ndCBhbGxvY2F0ZSBkZXZpY2UgaW5zdGFuY2UgZGF0YS5cbiIpOworCQkJY29udGludWU7CisJCX0KKwkJCisJCS8qIENvcHkgdXNlciBjb25maWd1cmF0aW9uIGluZm8gdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEgKi8KKwkJaW5mby0+aW9fYmFzZSA9ICh1bnNpZ25lZCBpbnQpaW9baV07CisJCWluZm8tPmlycV9sZXZlbCA9ICh1bnNpZ25lZCBpbnQpaXJxW2ldOworCQlpbmZvLT5pcnFfbGV2ZWwgPSBpcnFfY2Fub25pY2FsaXplKGluZm8tPmlycV9sZXZlbCk7CisJCWluZm8tPmRtYV9sZXZlbCA9ICh1bnNpZ25lZCBpbnQpZG1hW2ldOworCQlpbmZvLT5idXNfdHlwZSA9IE1HU0xfQlVTX1RZUEVfSVNBOworCQlpbmZvLT5pb19hZGRyX3NpemUgPSAxNjsKKwkJaW5mby0+aXJxX2ZsYWdzID0gMDsKKwkJCisJCW1nc2xfYWRkX2RldmljZSggaW5mbyApOworCX0KK30KKworc3RhdGljIHZvaWQgc3luY2xpbmtfY2xlYW51cCh2b2lkKQoreworCWludCByYzsKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm87CisJc3RydWN0IG1nc2xfc3RydWN0ICp0bXA7CisKKwlwcmludGsoIlVubG9hZGluZyAlczogJXNcbiIsIGRyaXZlcl9uYW1lLCBkcml2ZXJfdmVyc2lvbik7CisKKwlpZiAoc2VyaWFsX2RyaXZlcikgeworCQlpZiAoKHJjID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHNlcmlhbF9kcml2ZXIpKSkKKwkJCXByaW50aygiJXMoJWQpIGZhaWxlZCB0byB1bnJlZ2lzdGVyIHR0eSBkcml2ZXIgZXJyPSVkXG4iLAorCQkJICAgICAgIF9fRklMRV9fLF9fTElORV9fLHJjKTsKKwkJcHV0X3R0eV9kcml2ZXIoc2VyaWFsX2RyaXZlcik7CisJfQorCisJaW5mbyA9IG1nc2xfZGV2aWNlX2xpc3Q7CisJd2hpbGUoaW5mbykgeworI2lmZGVmIENPTkZJR19IRExDCisJCWhkbGNkZXZfZXhpdChpbmZvKTsKKyNlbmRpZgorCQltZ3NsX3JlbGVhc2VfcmVzb3VyY2VzKGluZm8pOworCQl0bXAgPSBpbmZvOworCQlpbmZvID0gaW5mby0+bmV4dF9kZXZpY2U7CisJCWtmcmVlKHRtcCk7CisJfQorCQorCWlmICh0bXBfYnVmKSB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgdG1wX2J1Zik7CisJCXRtcF9idWYgPSBOVUxMOworCX0KKwkKKwlpZiAocGNpX3JlZ2lzdGVyZWQpCisJCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc3luY2xpbmtfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHN5bmNsaW5rX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlpZiAoYnJlYWtfb25fbG9hZCkgeworCSAJbWdzbF9nZXRfdGV4dF9wdHIoKTsKKyAgCQlCUkVBS1BPSU5UKCk7CisJfQorCisgCXByaW50aygiJXMgJXNcbiIsIGRyaXZlcl9uYW1lLCBkcml2ZXJfdmVyc2lvbik7CisKKwltZ3NsX2VudW1faXNhX2RldmljZXMoKTsKKwlpZiAoKHJjID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc3luY2xpbmtfcGNpX2RyaXZlcikpIDwgMCkKKwkJcHJpbnRrKCIlczpmYWlsZWQgdG8gcmVnaXN0ZXIgUENJIGRyaXZlciwgZXJyb3I9JWRcbiIsX19GSUxFX18scmMpOworCWVsc2UKKwkJcGNpX3JlZ2lzdGVyZWQgPSAxOworCisJaWYgKChyYyA9IG1nc2xfaW5pdF90dHkoKSkgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXN5bmNsaW5rX2NsZWFudXAoKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzeW5jbGlua19leGl0KHZvaWQpCit7CisJc3luY2xpbmtfY2xlYW51cCgpOworfQorCittb2R1bGVfaW5pdChzeW5jbGlua19pbml0KTsKK21vZHVsZV9leGl0KHN5bmNsaW5rX2V4aXQpOworCisvKgorICogdXNjX1JUQ21kKCkKKyAqCisgKiBJc3N1ZSBhIFVTQyBSZWNlaXZlL1RyYW5zbWl0IGNvbW1hbmQgdG8gdGhlCisgKiBDaGFubmVsIENvbW1hbmQvQWRkcmVzcyBSZWdpc3RlciAoQ0NBUikuCisgKgorICogTm90ZXM6CisgKgorICogICAgVGhlIGNvbW1hbmQgaXMgZW5jb2RlZCBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCA1IGJpdHMgPDE1Li4xMT4KKyAqICAgIG9mIHRoZSBDQ0FSIHZhbHVlLiBCaXRzIDwxMC4uNz4gb2YgdGhlIENDQVIgbXVzdCBiZSBwcmVzZXJ2ZWQKKyAqICAgIGFuZCBCaXRzIDw2Li4wPiBtdXN0IGJlIHdyaXR0ZW4gYXMgemVyb3MuCisgKgorICogQXJndW1lbnRzOgorICoKKyAqICAgIGluZm8gICBwb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqICAgIENtZCAgICBjb21tYW5kIG1hc2sgKHVzZSBzeW1ib2xpYyBtYWNyb3MpCisgKgorICogUmV0dXJuIFZhbHVlOgorICoKKyAqICAgIE5vbmUKKyAqLworc3RhdGljIHZvaWQgdXNjX1JUQ21kKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHUxNiBDbWQgKQoreworCS8qIG91dHB1dCBjb21tYW5kIHRvIENDQVIgaW4gYml0cyA8MTUuLjExPiAqLworCS8qIHByZXNlcnZlIGJpdHMgPDEwLi43PiwgYml0cyA8Ni4uMD4gbXVzdCBiZSB6ZXJvICovCisKKwlvdXR3KCBDbWQgKyBpbmZvLT5sb29wYmFja19iaXRzLCBpbmZvLT5pb19iYXNlICsgQ0NBUiApOworCisJLyogUmVhZCB0byBmbHVzaCB3cml0ZSB0byBDQ0FSICovCisJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApCisJCWludyggaW5mby0+aW9fYmFzZSArIENDQVIgKTsKKworfQkvKiBlbmQgb2YgdXNjX1JUQ21kKCkgKi8KKworLyoKKyAqIHVzY19EbWFDbWQoKQorICoKKyAqICAgIElzc3VlIGEgRE1BIGNvbW1hbmQgdG8gdGhlIERNQSBDb21tYW5kL0FkZHJlc3MgUmVnaXN0ZXIgKERDQVIpLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCisgKiAgICBpbmZvICAgcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKiAgICBDbWQgICAgRE1BIGNvbW1hbmQgbWFzayAodXNjX0RtYUNtZF9YWCBNYWNyb3MpCisgKgorICogUmV0dXJuIFZhbHVlOgorICoKKyAqICAgICAgIE5vbmUKKyAqLworc3RhdGljIHZvaWQgdXNjX0RtYUNtZCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MTYgQ21kICkKK3sKKwkvKiB3cml0ZSBjb21tYW5kIG1hc2sgdG8gRENBUiAqLworCW91dHcoIENtZCArIGluZm8tPm1icmVfYml0LCBpbmZvLT5pb19iYXNlICk7CisKKwkvKiBSZWFkIHRvIGZsdXNoIHdyaXRlIHRvIERDQVIgKi8KKwlpZiAoIGluZm8tPmJ1c190eXBlID09IE1HU0xfQlVTX1RZUEVfUENJICkKKwkJaW53KCBpbmZvLT5pb19iYXNlICk7CisKK30JLyogZW5kIG9mIHVzY19EbWFDbWQoKSAqLworCisvKgorICogdXNjX091dERtYVJlZygpCisgKgorICogICAgV3JpdGUgYSAxNi1iaXQgdmFsdWUgdG8gYSBVU0MgRE1BIHJlZ2lzdGVyCisgKgorICogQXJndW1lbnRzOgorICoKKyAqICAgIGluZm8gICAgICBwb2ludGVyIHRvIGRldmljZSBpbmZvIHN0cnVjdHVyZQorICogICAgUmVnQWRkciAgIHJlZ2lzdGVyIGFkZHJlc3MgKG51bWJlcikgZm9yIHdyaXRlCisgKiAgICBSZWdWYWx1ZSAgMTYtYml0IHZhbHVlIHRvIHdyaXRlIHRvIHJlZ2lzdGVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICoKKyAqICAgIE5vbmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHVzY19PdXREbWFSZWcoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTE2IFJlZ0FkZHIsIHUxNiBSZWdWYWx1ZSApCit7CisJLyogTm90ZTogVGhlIERDQVIgaXMgbG9jYXRlZCBhdCB0aGUgYWRhcHRlciBiYXNlIGFkZHJlc3MgKi8KKwkvKiBOb3RlOiBtdXN0IHByZXNlcnZlIHN0YXRlIG9mIEJJVDggaW4gRENBUiAqLworCisJb3V0dyggUmVnQWRkciArIGluZm8tPm1icmVfYml0LCBpbmZvLT5pb19iYXNlICk7CisJb3V0dyggUmVnVmFsdWUsIGluZm8tPmlvX2Jhc2UgKTsKKworCS8qIFJlYWQgdG8gZmx1c2ggd3JpdGUgdG8gRENBUiAqLworCWlmICggaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9QQ0kgKQorCQlpbncoIGluZm8tPmlvX2Jhc2UgKTsKKworfQkvKiBlbmQgb2YgdXNjX091dERtYVJlZygpICovCisgCisvKgorICogdXNjX0luRG1hUmVnKCkKKyAqCisgKiAgICBSZWFkIGEgMTYtYml0IHZhbHVlIGZyb20gYSBETUEgcmVnaXN0ZXIKKyAqCisgKiBBcmd1bWVudHM6CisgKgorICogICAgaW5mbyAgICAgcG9pbnRlciB0byBkZXZpY2UgaW5mbyBzdHJ1Y3R1cmUKKyAqICAgIFJlZ0FkZHIgIHJlZ2lzdGVyIGFkZHJlc3MgKG51bWJlcikgdG8gcmVhZCBmcm9tCisgKgorICogUmV0dXJuIFZhbHVlOgorICoKKyAqICAgIFRoZSAxNi1iaXQgdmFsdWUgcmVhZCBmcm9tIHJlZ2lzdGVyCisgKgorICovCitzdGF0aWMgdTE2IHVzY19JbkRtYVJlZyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1MTYgUmVnQWRkciApCit7CisJLyogTm90ZTogVGhlIERDQVIgaXMgbG9jYXRlZCBhdCB0aGUgYWRhcHRlciBiYXNlIGFkZHJlc3MgKi8KKwkvKiBOb3RlOiBtdXN0IHByZXNlcnZlIHN0YXRlIG9mIEJJVDggaW4gRENBUiAqLworCisJb3V0dyggUmVnQWRkciArIGluZm8tPm1icmVfYml0LCBpbmZvLT5pb19iYXNlICk7CisJcmV0dXJuIGludyggaW5mby0+aW9fYmFzZSApOworCit9CS8qIGVuZCBvZiB1c2NfSW5EbWFSZWcoKSAqLworCisvKgorICoKKyAqIHVzY19PdXRSZWcoKQorICoKKyAqICAgIFdyaXRlIGEgMTYtYml0IHZhbHVlIHRvIGEgVVNDIHNlcmlhbCBjaGFubmVsIHJlZ2lzdGVyIAorICoKKyAqIEFyZ3VtZW50czoKKyAqCisgKiAgICBpbmZvICAgICAgcG9pbnRlciB0byBkZXZpY2UgaW5mbyBzdHJ1Y3R1cmUKKyAqICAgIFJlZ0FkZHIgICByZWdpc3RlciBhZGRyZXNzIChudW1iZXIpIHRvIHdyaXRlIHRvCisgKiAgICBSZWdWYWx1ZSAgMTYtYml0IHZhbHVlIHRvIHdyaXRlIHRvIHJlZ2lzdGVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICoKKyAqICAgIE5vbmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHVzY19PdXRSZWcoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTE2IFJlZ0FkZHIsIHUxNiBSZWdWYWx1ZSApCit7CisJb3V0dyggUmVnQWRkciArIGluZm8tPmxvb3BiYWNrX2JpdHMsIGluZm8tPmlvX2Jhc2UgKyBDQ0FSICk7CisJb3V0dyggUmVnVmFsdWUsIGluZm8tPmlvX2Jhc2UgKyBDQ0FSICk7CisKKwkvKiBSZWFkIHRvIGZsdXNoIHdyaXRlIHRvIENDQVIgKi8KKwlpZiAoIGluZm8tPmJ1c190eXBlID09IE1HU0xfQlVTX1RZUEVfUENJICkKKwkJaW53KCBpbmZvLT5pb19iYXNlICsgQ0NBUiApOworCit9CS8qIGVuZCBvZiB1c2NfT3V0UmVnKCkgKi8KKworLyoKKyAqIHVzY19JblJlZygpCisgKgorICogICAgUmVhZHMgYSAxNi1iaXQgdmFsdWUgZnJvbSBhIFVTQyBzZXJpYWwgY2hhbm5lbCByZWdpc3RlcgorICoKKyAqIEFyZ3VtZW50czoKKyAqCisgKiAgICBpbmZvICAgICAgIHBvaW50ZXIgdG8gZGV2aWNlIGV4dGVuc2lvbgorICogICAgUmVnQWRkciAgICByZWdpc3RlciBhZGRyZXNzIChudW1iZXIpIHRvIHJlYWQgZnJvbQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqCisgKiAgICAxNi1iaXQgdmFsdWUgcmVhZCBmcm9tIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB1MTYgdXNjX0luUmVnKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHUxNiBSZWdBZGRyICkKK3sKKwlvdXR3KCBSZWdBZGRyICsgaW5mby0+bG9vcGJhY2tfYml0cywgaW5mby0+aW9fYmFzZSArIENDQVIgKTsKKwlyZXR1cm4gaW53KCBpbmZvLT5pb19iYXNlICsgQ0NBUiApOworCit9CS8qIGVuZCBvZiB1c2NfSW5SZWcoKSAqLworCisvKiB1c2Nfc2V0X3NkbGNfbW9kZSgpCisgKgorICogICAgU2V0IHVwIHRoZSBhZGFwdGVyIGZvciBTRExDIERNQSBjb21tdW5pY2F0aW9ucy4KKyAqCisgKiBBcmd1bWVudHM6CQlpbmZvICAgIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZTogCU5PTkUKKyAqLworc3RhdGljIHZvaWQgdXNjX3NldF9zZGxjX21vZGUoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdTE2IFJlZ1ZhbHVlOworCWludCBQcmVTTDE2NjA7CisJCisJLyoKKwkgKiBkZXRlcm1pbmUgaWYgdGhlIElVU0Mgb24gdGhlIGFkYXB0ZXIgaXMgcHJlLVNMMTY2MC4gSWYKKwkgKiBub3QsIHRha2UgYWR2YW50YWdlIG9mIHRoZSBVbmRlcldhaXQgZmVhdHVyZSBvZiBtb3JlCisJICogbW9kZXJuIGNoaXBzLiBJZiBhbiB1bmRlcnJ1biBvY2N1cnMgYW5kIHRoaXMgYml0IGlzIHNldCwKKwkgKiB0aGUgdHJhbnNtaXR0ZXIgd2lsbCBpZGxlIHRoZSBwcm9ncmFtbWVkIGlkbGUgcGF0dGVybgorCSAqIHVudGlsIHRoZSBkcml2ZXIgaGFzIHRpbWUgdG8gc2VydmljZSB0aGUgdW5kZXJydW4uIE90aGVyd2lzZSwKKwkgKiB0aGUgZG1hIGNvbnRyb2xsZXIgbWF5IGdldCB0aGUgY3ljbGVzIHByZXZpb3VzbHkgcmVxdWVzdGVkCisJICogYW5kIGJlZ2luIHRyYW5zbWl0dGluZyBxdWV1ZWQgdHggZGF0YS4KKwkgKi8KKwl1c2NfT3V0UmVnKGluZm8sVE1DUiwweDFmKTsKKwlSZWdWYWx1ZT11c2NfSW5SZWcoaW5mbyxUTURSKTsKKwlpZiAoIFJlZ1ZhbHVlID09IElVU0NfUFJFX1NMMTY2MCApCisJCVByZVNMMTY2MCA9IDE7CisJZWxzZQorCQlQcmVTTDE2NjAgPSAwOworCQorCisgCWlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0hETENfTE9PUE1PREUgKQorIAl7CisgCSAgIC8qCisgCSAgICoqIENoYW5uZWwgTW9kZSBSZWdpc3RlciAoQ01SKQorIAkgICAqKgorIAkgICAqKiA8MTUuLjE0PiAgICAxMCAgICBUeCBTdWIgTW9kZXMsIFNlbmQgRmxhZyBvbiBVbmRlcnJ1bgorIAkgICAqKiA8MTM+ICAgICAgICAwICAgICAwID0gVHJhbnNtaXQgRGlzYWJsZWQgKGluaXRpYWxseSkKKyAJICAgKiogPDEyPiAgICAgICAgMCAgICAgMSA9IENvbnNlY3V0aXZlIElkbGVzIHNoYXJlIGNvbW1vbiAwCisgCSAgICoqIDwxMS4uOD4gICAgIDExMTAgIFRyYW5zbWl0dGVyIE1vZGUgPSBIRExDL1NETEMgTG9vcAorIAkgICAqKiA8Ny4uND4gICAgICAwMDAwICBSeCBTdWIgTW9kZXMsIGFkZHIvY3RybCBmaWVsZCBoYW5kbGluZworIAkgICAqKiA8My4uMD4gICAgICAwMTEwICBSZWNlaXZlciBNb2RlID0gSERMQy9TRExDCisgCSAgICoqCisgCSAgICoqIDEwMDAgMTExMCAwMDAwIDAxMTAgPSAweDhlMDYKKyAJICAgKi8KKyAJICAgUmVnVmFsdWUgPSAweDhlMDY7CisgCisgCSAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAJICAgICogaWdub3JlIHVzZXIgb3B0aW9ucyBmb3IgVW5kZXJSdW4gQWN0aW9ucyBhbmQKKyAJICAgICogcHJlYW1ibGVzCisgCSAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworIAl9CisgCWVsc2UKKyAJewkKKwkJLyogQ2hhbm5lbCBtb2RlIFJlZ2lzdGVyIChDTVIpCisJCSAqCisJCSAqIDwxNS4uMTQ+ICAwMCAgICBUeCBTdWIgbW9kZXMsIFVuZGVycnVuIEFjdGlvbgorCQkgKiA8MTM+ICAgICAgMCAgICAgMSA9IFNlbmQgUHJlYW1ibGUgYmVmb3JlIG9wZW5pbmcgZmxhZworCQkgKiA8MTI+ICAgICAgMCAgICAgMSA9IENvbnNlY3V0aXZlIElkbGVzIHNoYXJlIGNvbW1vbiAwCisJCSAqIDwxMS4uOD4gICAwMTEwICBUcmFuc21pdHRlciBtb2RlID0gSERMQy9TRExDCisJCSAqIDw3Li40PiAgICAwMDAwICBSeCBTdWIgbW9kZXMsIGFkZHIvY3RybCBmaWVsZCBoYW5kbGluZworCQkgKiA8My4uMD4gICAgMDExMCAgUmVjZWl2ZXIgbW9kZSA9IEhETEMvU0RMQworCQkgKgorCQkgKiAwMDAwIDAxMTAgMDAwMCAwMTEwID0gMHgwNjA2CisJCSAqLworCQlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX1JBVykgeworCQkJUmVnVmFsdWUgPSAweDAwMDE7CQkvKiBTZXQgUmVjZWl2ZSBtb2RlID0gZXh0ZXJuYWwgc3luYyAqLworCisJCQl1c2NfT3V0UmVnKCBpbmZvLCBJT0NSLAkJLyogU2V0IElPQ1IgRENEIGlzIFJ4U3luYyBEZXRlY3QgSW5wdXQgKi8KKwkJCQkodW5zaWduZWQgc2hvcnQpKCh1c2NfSW5SZWcoaW5mbywgSU9DUikgJiB+KEJJVDEzfEJJVDEyKSkgfCBCSVQxMikpOworCisJCQkvKgorCQkJICogVHhTdWJNb2RlOgorCQkJICogCUNNUiA8MTU+CQkwCURvbid0IHNlbmQgQ1JDIG9uIFR4IFVuZGVycnVuCisJCQkgKiAJQ01SIDwxND4JCXgJdW5kZWZpbmVkCisJCQkgKiAJQ01SIDwxMz4JCTAJU2VuZCBwcmVhbWJsZSBiZWZvcmUgb3Blbm5pbmcgc3luYworCQkJICogCUNNUiA8MTI+CQkwCVNlbmQgOC1iaXQgc3luY3MsIDE9c2VuZCBTeW5jcyBwZXIgVHhMZW5ndGgKKwkJCSAqCisJCQkgKiBUeE1vZGU6CisJCQkgKiAJQ01SIDwxMS04KQkwMTAwCU1vbm9TeW5jCisJCQkgKgorCQkJICogCTB4MDAgMDEwMCB4eHh4IHh4eHggIDA0eHgKKwkJCSAqLworCQkJUmVnVmFsdWUgfD0gMHgwNDAwOworCQl9CisJCWVsc2UgeworCisJCVJlZ1ZhbHVlID0gMHgwNjA2OworCisJCWlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1VOREVSUlVOX0FCT1JUMTUgKQorCQkJUmVnVmFsdWUgfD0gQklUMTQ7CisJCWVsc2UgaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfVU5ERVJSVU5fRkxBRyApCisJCQlSZWdWYWx1ZSB8PSBCSVQxNTsKKwkJZWxzZSBpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19VTkRFUlJVTl9DUkMgKQorCQkJUmVnVmFsdWUgfD0gQklUMTUgKyBCSVQxNDsKKwkJfQorCisJCWlmICggaW5mby0+cGFyYW1zLnByZWFtYmxlICE9IEhETENfUFJFQU1CTEVfUEFUVEVSTl9OT05FICkKKwkJCVJlZ1ZhbHVlIHw9IEJJVDEzOworCX0KKworCWlmICggaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMgJiYKKwkJKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19TSEFSRV9aRVJPKSApCisJCVJlZ1ZhbHVlIHw9IEJJVDEyOworCisJaWYgKCBpbmZvLT5wYXJhbXMuYWRkcl9maWx0ZXIgIT0gMHhmZiApCisJeworCQkvKiBzZXQgdXAgcmVjZWl2ZSBhZGRyZXNzIGZpbHRlcmluZyAqLworCQl1c2NfT3V0UmVnKCBpbmZvLCBSU1IsIGluZm8tPnBhcmFtcy5hZGRyX2ZpbHRlciApOworCQlSZWdWYWx1ZSB8PSBCSVQ0OworCX0KKworCXVzY19PdXRSZWcoIGluZm8sIENNUiwgUmVnVmFsdWUgKTsKKwlpbmZvLT5jbXJfdmFsdWUgPSBSZWdWYWx1ZTsKKworCS8qIFJlY2VpdmVyIG1vZGUgUmVnaXN0ZXIgKFJNUikKKwkgKgorCSAqIDwxNS4uMTM+ICAwMDAgICAgZW5jb2RpbmcKKwkgKiA8MTIuLjExPiAgMDAgICAgIEZDUyA9IDE2Yml0IENSQyBDQ0lUVCAoeDE1ICsgeDEyICsgeDUgKyAxKQorCSAqIDwxMD4gICAgICAxICAgICAgMSA9IFNldCBDUkMgdG8gYWxsIDFzICh1c2UgZm9yIFNETEMvSERMQykKKwkgKiA8OT4gICAgICAgMCAgICAgIDEgPSBJbmNsdWRlIFJlY2VpdmUgY2hhcnMgaW4gQ1JDCisJICogPDg+ICAgICAgIDEgICAgICAxID0gVXNlIEFib3J0L1BFIGJpdCBhcyBhYm9ydCBpbmRpY2F0b3IKKwkgKiA8Ny4uNj4gICAgMDAgICAgIEV2ZW4gcGFyaXR5CisJICogPDU+ICAgICAgIDAgICAgICBwYXJpdHkgZGlzYWJsZWQKKwkgKiA8NC4uMj4gICAgMDAwICAgIFJlY2VpdmUgQ2hhciBMZW5ndGggPSA4IGJpdHMKKwkgKiA8MS4uMD4gICAgMDAgICAgIERpc2FibGUgUmVjZWl2ZXIKKwkgKgorCSAqIDAwMDAgMDEwMSAwMDAwIDAwMDAgPSAweDA1MDAKKwkgKi8KKworCVJlZ1ZhbHVlID0gMHgwNTAwOworCisJc3dpdGNoICggaW5mby0+cGFyYW1zLmVuY29kaW5nICkgeworCWNhc2UgSERMQ19FTkNPRElOR19OUlpCOiAgICAgICAgICAgICAgIFJlZ1ZhbHVlIHw9IEJJVDEzOyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfTlJaSV9NQVJLOiAgICAgICAgICBSZWdWYWx1ZSB8PSBCSVQxNDsgYnJlYWs7CisJY2FzZSBIRExDX0VOQ09ESU5HX05SWklfU1BBQ0U6CSAgICAgICBSZWdWYWx1ZSB8PSBCSVQxNCArIEJJVDEzOyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfQklQSEFTRV9NQVJLOiAgICAgICBSZWdWYWx1ZSB8PSBCSVQxNTsgYnJlYWs7CisJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfU1BBQ0U6ICAgICAgUmVnVmFsdWUgfD0gQklUMTUgKyBCSVQxMzsgYnJlYWs7CisJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTEVWRUw6ICAgICAgUmVnVmFsdWUgfD0gQklUMTUgKyBCSVQxNDsgYnJlYWs7CisJY2FzZSBIRExDX0VOQ09ESU5HX0RJRkZfQklQSEFTRV9MRVZFTDogUmVnVmFsdWUgfD0gQklUMTUgKyBCSVQxNCArIEJJVDEzOyBicmVhazsKKwl9CisKKwlpZiAoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19NQVNLKSA9PSBIRExDX0NSQ18xNl9DQ0lUVCApCisJCVJlZ1ZhbHVlIHw9IEJJVDk7CisJZWxzZSBpZiAoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19NQVNLKSA9PSBIRExDX0NSQ18zMl9DQ0lUVCApCisJCVJlZ1ZhbHVlIHw9ICggQklUMTIgfCBCSVQxMCB8IEJJVDkgKTsKKworCXVzY19PdXRSZWcoIGluZm8sIFJNUiwgUmVnVmFsdWUgKTsKKworCS8qIFNldCB0aGUgUmVjZWl2ZSBjb3VudCBMaW1pdCBSZWdpc3RlciAoUkNMUikgdG8gMHhmZmZmLiAqLworCS8qIFdoZW4gYW4gb3BlbmluZyBmbGFnIG9mIGFuIFNETEMgZnJhbWUgaXMgcmVjb2duaXplZCB0aGUgKi8KKwkvKiBSZWNlaXZlIENoYXJhY3RlciBjb3VudCAoUkNDKSBpcyBsb2FkZWQgd2l0aCB0aGUgdmFsdWUgaW4gKi8KKwkvKiBSQ0xSLiBUaGUgUkNDIGlzIGRlY3JlbWVudGVkIGZvciBlYWNoIHJlY2VpdmVkIGJ5dGUuICBUaGUgKi8KKwkvKiB2YWx1ZSBvZiBSQ0MgaXMgc3RvcmVkIGFmdGVyIHRoZSBjbG9zaW5nIGZsYWcgb2YgdGhlIGZyYW1lICovCisJLyogYWxsb3dpbmcgdGhlIGZyYW1lIHNpemUgdG8gYmUgY29tcHV0ZWQuICovCisKKwl1c2NfT3V0UmVnKCBpbmZvLCBSQ0xSLCBSQ0xSVkFMVUUgKTsKKworCXVzY19SQ21kKCBpbmZvLCBSQ21kX1NlbGVjdFJpY3JkbWFfbGV2ZWwgKTsKKworCS8qIFJlY2VpdmUgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKFJJQ1IpCisJICoKKwkgKiA8MTUuLjg+CT8JUnhGSUZPIERNQSBSZXF1ZXN0IExldmVsCisJICogPDc+CQkwCUV4aXRlZCBIdW50IElBIChJbnRlcnJ1cHQgQXJtKQorCSAqIDw2PgkJMAlJZGxlIFJlY2VpdmVkIElBCisJICogPDU+CQkwCUJyZWFrL0Fib3J0IElBCisJICogPDQ+CQkwCVJ4IEJvdW5kIElBCisJICogPDM+CQkxCVF1ZXVlZCBzdGF0dXMgcmVmbGVjdHMgb2xkZXN0IDIgYnl0ZXMgaW4gRklGTworCSAqIDwyPgkJMAlBYm9ydC9QRSBJQQorCSAqIDwxPgkJMQlSeCBPdmVycnVuIElBCisJICogPDA+CQkwCVNlbGVjdCBUQzAgdmFsdWUgZm9yIHJlYWRiYWNrCisJICoKKwkgKgkwMDAwIDAwMDAgMDAwMCAxMDAwID0gMHgwMDBhCisJICovCisKKwkvKiBDYXJyeSBvdmVyIHRoZSBFeGl0IEh1bnQgYW5kIElkbGUgUmVjZWl2ZWQgYml0cyAqLworCS8qIGluIGNhc2UgdGhleSBoYXZlIGJlZW4gYXJtZWQgYnkgdXNjX0FybUV2ZW50cy4gICAqLworCisJUmVnVmFsdWUgPSB1c2NfSW5SZWcoIGluZm8sIFJJQ1IgKSAmIDB4YzA7CisKKwlpZiAoIGluZm8tPmJ1c190eXBlID09IE1HU0xfQlVTX1RZUEVfUENJICkKKwkJdXNjX091dFJlZyggaW5mbywgUklDUiwgKHUxNikoMHgwMzBhIHwgUmVnVmFsdWUpICk7CisJZWxzZQorCQl1c2NfT3V0UmVnKCBpbmZvLCBSSUNSLCAodTE2KSgweDE0MGEgfCBSZWdWYWx1ZSkgKTsKKworCS8qIFVubGF0Y2ggYWxsIFJ4IHN0YXR1cyBiaXRzIGFuZCBjbGVhciBSeCBzdGF0dXMgSVJRIFBlbmRpbmcgKi8KKworCXVzY19VbmxhdGNoUnhzdGF0dXNCaXRzKCBpbmZvLCBSWFNUQVRVU19BTEwgKTsKKwl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggaW5mbywgUkVDRUlWRV9TVEFUVVMgKTsKKworCS8qIFRyYW5zbWl0IG1vZGUgUmVnaXN0ZXIgKFRNUikKKwkgKgkKKwkgKiA8MTUuLjEzPgkwMDAJZW5jb2RpbmcKKwkgKiA8MTIuLjExPgkwMAlGQ1MgPSAxNmJpdCBDUkMgQ0NJVFQgKHgxNSArIHgxMiArIHg1ICsgMSkKKwkgKiA8MTA+CQkxCTEgPSBTdGFydCBDUkMgYXMgYWxsIDFzICh1c2UgZm9yIFNETEMvSERMQykKKwkgKiA8OT4JCTAJMSA9IFR4IENSQyBFbmFibGVkCisJICogPDg+CQkwCTEgPSBBcHBlbmQgQ1JDIHRvIGVuZCBvZiB0cmFuc21pdCBmcmFtZQorCSAqIDw3Li42PgkwMAlUcmFuc21pdCBwYXJpdHkgRXZlbgorCSAqIDw1PgkJMAlUcmFuc21pdCBwYXJpdHkgRGlzYWJsZWQKKwkgKiA8NC4uMj4JMDAwCVR4IENoYXIgTGVuZ3RoID0gOCBiaXRzCisJICogPDEuLjA+CTAwCURpc2FibGUgVHJhbnNtaXR0ZXIKKwkgKgorCSAqIAkwMDAwIDAxMDAgMDAwMCAwMDAwID0gMHgwNDAwCisJICovCisKKwlSZWdWYWx1ZSA9IDB4MDQwMDsKKworCXN3aXRjaCAoIGluZm8tPnBhcmFtcy5lbmNvZGluZyApIHsKKwljYXNlIEhETENfRU5DT0RJTkdfTlJaQjogICAgICAgICAgICAgICBSZWdWYWx1ZSB8PSBCSVQxMzsgYnJlYWs7CisJY2FzZSBIRExDX0VOQ09ESU5HX05SWklfTUFSSzogICAgICAgICAgUmVnVmFsdWUgfD0gQklUMTQ7IGJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19OUlpJX1NQQUNFOiAgICAgICAgIFJlZ1ZhbHVlIHw9IEJJVDE0ICsgQklUMTM7IGJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19CSVBIQVNFX01BUks6ICAgICAgIFJlZ1ZhbHVlIHw9IEJJVDE1OyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfQklQSEFTRV9TUEFDRTogICAgICBSZWdWYWx1ZSB8PSBCSVQxNSArIEJJVDEzOyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfQklQSEFTRV9MRVZFTDogICAgICBSZWdWYWx1ZSB8PSBCSVQxNSArIEJJVDE0OyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfRElGRl9CSVBIQVNFX0xFVkVMOiBSZWdWYWx1ZSB8PSBCSVQxNSArIEJJVDE0ICsgQklUMTM7IGJyZWFrOworCX0KKworCWlmICggKGluZm8tPnBhcmFtcy5jcmNfdHlwZSAmIEhETENfQ1JDX01BU0spID09IEhETENfQ1JDXzE2X0NDSVRUICkKKwkJUmVnVmFsdWUgfD0gQklUOSArIEJJVDg7CisJZWxzZSBpZiAoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19NQVNLKSA9PSBIRExDX0NSQ18zMl9DQ0lUVCApCisJCVJlZ1ZhbHVlIHw9ICggQklUMTIgfCBCSVQxMCB8IEJJVDkgfCBCSVQ4KTsKKworCXVzY19PdXRSZWcoIGluZm8sIFRNUiwgUmVnVmFsdWUgKTsKKworCXVzY19zZXRfdHhpZGxlKCBpbmZvICk7CisKKworCXVzY19UQ21kKCBpbmZvLCBUQ21kX1NlbGVjdFRpY3JkbWFfbGV2ZWwgKTsKKworCS8qIFRyYW5zbWl0IEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyIChUSUNSKQorCSAqCisJICogPDE1Li44Pgk/CVRyYW5zbWl0IEZJRk8gRE1BIExldmVsCisJICogPDc+CQkwCVByZXNlbnQgSUEgKEludGVycnVwdCBBcm0pCisJICogPDY+CQkwCUlkbGUgU2VudCBJQQorCSAqIDw1PgkJMQlBYm9ydCBTZW50IElBCisJICogPDQ+CQkxCUVPRi9FT00gU2VudCBJQQorCSAqIDwzPgkJMAlDUkMgU2VudCBJQQorCSAqIDwyPgkJMQkxID0gV2FpdCBmb3IgU1cgVHJpZ2dlciB0byBTdGFydCBGcmFtZQorCSAqIDwxPgkJMQlUeCBVbmRlcnJ1biBJQQorCSAqIDwwPgkJMAlUQzAgY29uc3RhbnQgb24gcmVhZCBiYWNrCisJICoKKwkgKgkwMDAwIDAwMDAgMDAxMSAwMTEwID0gMHgwMDM2CisJICovCisKKwlpZiAoIGluZm8tPmJ1c190eXBlID09IE1HU0xfQlVTX1RZUEVfUENJICkKKwkJdXNjX091dFJlZyggaW5mbywgVElDUiwgMHgwNzM2ICk7CisJZWxzZQkJCQkJCQkJCisJCXVzY19PdXRSZWcoIGluZm8sIFRJQ1IsIDB4MTQzNiApOworCisJdXNjX1VubGF0Y2hUeHN0YXR1c0JpdHMoIGluZm8sIFRYU1RBVFVTX0FMTCApOworCXVzY19DbGVhcklycVBlbmRpbmdCaXRzKCBpbmZvLCBUUkFOU01JVF9TVEFUVVMgKTsKKworCS8qCisJKiogVHJhbnNtaXQgQ29tbWFuZC9TdGF0dXMgUmVnaXN0ZXIgKFRDU1IpCisJKioKKwkqKiA8MTUuLjEyPgkwMDAwCVRDbWQKKwkqKiA8MTE+IAkwLzEJVW5kZXJXYWl0CisJKiogPDEwLi4wOD4JMDAwCVR4SWRsZQorCSoqIDw3PgkJeAlQcmVTZW50CisJKiogPDY+ICAgICAgICAgCXgJSWRsZVNlbnQKKwkqKiA8NT4gICAgICAgICAJeAlBYm9ydFNlbnQKKwkqKiA8ND4gICAgICAgICAJeAlFT0YvRU9NIFNlbnQKKwkqKiA8Mz4gICAgICAgICAJeAlDUkMgU2VudAorCSoqIDwyPiAgICAgICAgIAl4CUFsbCBTZW50CisJKiogPDE+ICAgICAgICAgCXgJVHhVbmRlcgorCSoqIDwwPiAgICAgICAgIAl4CVR4RW1wdHkKKwkqKiAKKwkqKiAwMDAwIDAwMDAgMDAwMCAwMDAwID0gMHgwMDAwCisJKi8KKwlpbmZvLT50Y3NyX3ZhbHVlID0gMDsKKworCWlmICggIVByZVNMMTY2MCApCisJCWluZm8tPnRjc3JfdmFsdWUgfD0gVENTUl9VTkRFUldBSVQ7CisJCQorCXVzY19PdXRSZWcoIGluZm8sIFRDU1IsIGluZm8tPnRjc3JfdmFsdWUgKTsKKworCS8qIENsb2NrIG1vZGUgQ29udHJvbCBSZWdpc3RlciAoQ01DUikKKwkgKgorCSAqIDwxNS4uMTQ+CTAwCWNvdW50ZXIgMSBTb3VyY2UgPSBEaXNhYmxlZAorCSAqIDwxMy4uMTI+IAkwMAljb3VudGVyIDAgU291cmNlID0gRGlzYWJsZWQKKwkgKiA8MTEuLjEwPiAJMTEJQlJHMSBJbnB1dCBpcyBUeEMgUGluCisJICogPDkuLjg+CTExCUJSRzAgSW5wdXQgaXMgVHhDIFBpbgorCSAqIDw3Li42PgkwMQlEUExMIElucHV0IGlzIEJSRzEgT3V0cHV0CisJICogPDUuLjM+CVhYWAlUeENMSyBjb21lcyBmcm9tIFBvcnQgMAorCSAqIDwyLi4wPiAgIAlYWFgJUnhDTEsgY29tZXMgZnJvbSBQb3J0IDEKKwkgKgorCSAqCTAwMDAgMTExMSAwMTExIDAxMTEgPSAweDBmNzcKKwkgKi8KKworCVJlZ1ZhbHVlID0gMHgwZjQwOworCisJaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfUlhDX0RQTEwgKQorCQlSZWdWYWx1ZSB8PSAweDAwMDM7CS8qIFJ4Q0xLIGZyb20gRFBMTCAqLworCWVsc2UgaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfUlhDX0JSRyApCisJCVJlZ1ZhbHVlIHw9IDB4MDAwNDsJLyogUnhDTEsgZnJvbSBCUkcwICovCisgCWVsc2UgaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfUlhDX1RYQ1BJTikKKyAJCVJlZ1ZhbHVlIHw9IDB4MDAwNjsJLyogUnhDTEsgZnJvbSBUWEMgSW5wdXQgKi8KKwllbHNlCisJCVJlZ1ZhbHVlIHw9IDB4MDAwNzsJLyogUnhDTEsgZnJvbSBQb3J0MSAqLworCisJaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfVFhDX0RQTEwgKQorCQlSZWdWYWx1ZSB8PSAweDAwMTg7CS8qIFR4Q0xLIGZyb20gRFBMTCAqLworCWVsc2UgaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfVFhDX0JSRyApCisJCVJlZ1ZhbHVlIHw9IDB4MDAyMDsJLyogVHhDTEsgZnJvbSBCUkcwICovCisgCWVsc2UgaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfVFhDX1JYQ1BJTikKKyAJCVJlZ1ZhbHVlIHw9IDB4MDAzODsJLyogUnhDTEsgZnJvbSBUWEMgSW5wdXQgKi8KKwllbHNlCisJCVJlZ1ZhbHVlIHw9IDB4MDAzMDsJLyogVHhDTEsgZnJvbSBQb3J0MCAqLworCisJdXNjX091dFJlZyggaW5mbywgQ01DUiwgUmVnVmFsdWUgKTsKKworCisJLyogSGFyZHdhcmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoSENSKQorCSAqCisJICogPDE1Li4xND4JMDAJQ1RSMCBEaXZpc29yOjAwPTMyLDAxPTE2LDEwPTgsMTE9NAorCSAqIDwxMz4JCTAJQ1RSMURTZWw6MD1DVFIwRGl2IGRldGVybWluZXMgQ1RSMERpdgorCSAqIDwxMj4JCTAJQ1ZPSzowPXJlcG9ydCBjb2RlIHZpb2xhdGlvbiBpbiBiaXBoYXNlCisJICogPDExLi4xMD4JMDAJRFBMTCBEaXZpc29yOjAwPTMyLDAxPTE2LDEwPTgsMTE9NAorCSAqIDw5Li44PglYWAlEUExMIG1vZGU6MDA9ZGlzYWJsZSwwMT1OUlosMTA9QmlwaGFzZSwxMT1CaXBoYXNlIExldmVsCisJICogPDcuLjY+CTAwCXJlc2VydmVkCisJICogPDU+CQkwCUJSRzEgbW9kZTowPWNvbnRpbnVvdXMsMT1zaW5nbGUgY3ljbGUKKwkgKiA8ND4JCVgJQlJHMSBFbmFibGUKKwkgKiA8My4uMj4JMDAJcmVzZXJ2ZWQKKwkgKiA8MT4JCTAJQlJHMCBtb2RlOjA9Y29udGludW91cywxPXNpbmdsZSBjeWNsZQorCSAqIDwwPgkJMAlCUkcwIEVuYWJsZQorCSAqLworCisJUmVnVmFsdWUgPSAweDAwMDA7CisKKwlpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIChIRExDX0ZMQUdfUlhDX0RQTEwgKyBIRExDX0ZMQUdfVFhDX0RQTEwpICkgeworCQl1MzIgWHRhbFNwZWVkOworCQl1MzIgRHBsbERpdmlzb3I7CisJCXUxNiBUYzsKKworCQkvKiAgRFBMTCBpcyBlbmFibGVkLiBVc2UgQlJHMSB0byBwcm92aWRlIGNvbnRpbnVvdXMgcmVmZXJlbmNlIGNsb2NrICAqLworCQkvKiAgZm9yIERQTEwuIERQTEwgbW9kZSBpbiBIQ1IgaXMgZGVwZW5kZW50IG9uIHRoZSBlbmNvZGluZyB1c2VkLiAqLworCisJCWlmICggaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9QQ0kgKQorCQkJWHRhbFNwZWVkID0gMTEwNTkyMDA7CisJCWVsc2UKKwkJCVh0YWxTcGVlZCA9IDE0NzQ1NjAwOworCisJCWlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0RQTExfRElWMTYgKSB7CisJCQlEcGxsRGl2aXNvciA9IDE2OworCQkJUmVnVmFsdWUgfD0gQklUMTA7CisJCX0KKwkJZWxzZSBpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19EUExMX0RJVjggKSB7CisJCQlEcGxsRGl2aXNvciA9IDg7CisJCQlSZWdWYWx1ZSB8PSBCSVQxMTsKKwkJfQorCQllbHNlCisJCQlEcGxsRGl2aXNvciA9IDMyOworCisJCS8qICBUYyA9IChYdGFsL1NwZWVkKSAtIDEgKi8KKwkJLyogIElmIHR3aWNlIHRoZSByZW1haW5kZXIgb2YgKFh0YWwvU3BlZWQpIGlzIGdyZWF0ZXIgdGhhbiBTcGVlZCAqLworCQkvKiAgdGhlbiByb3VuZGluZyB1cCBnaXZlcyBhIG1vcmUgcHJlY2lzZSB0aW1lIGNvbnN0YW50LiBJbnN0ZWFkICovCisJCS8qICBvZiByb3VuZGluZyB1cCBhbmQgdGhlbiBzdWJ0cmFjdGluZyAxIHdlIGp1c3QgZG9uJ3Qgc3VidHJhY3QgKi8KKwkJLyogIHRoZSBvbmUgaW4gdGhpcyBjYXNlLiAqLworCisgCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgCQkgKiBlano6IGZvciBEUExMIG1vZGUsIGFwcGxpY2F0aW9uIHNob3VsZCB1c2UgdGhlCisgCQkgKiBzYW1lIGNsb2NrIHNwZWVkIGFzIHRoZSBwYXJ0bmVyIHN5c3RlbSwgZXZlbiAKKyAJCSAqIHRob3VnaCBjbG9ja2luZyBpcyBkZXJpdmVkIGZyb20gdGhlIGlucHV0IFJ4RGF0YS4KKyAJCSAqIEluIGNhc2UgdGhlIHVzZXIgdXNlcyBhIDAgZm9yIHRoZSBjbG9jayBzcGVlZCwKKyAJCSAqIGRlZmF1bHQgdG8gMHhmZmZmZmZmZiBhbmQgZG9uJ3QgdHJ5IHRvIGRpdmlkZSBieQorIAkJICogemVybworIAkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgCQlpZiAoIGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCApCisgCQl7CisJCQlUYyA9ICh1MTYpKChYdGFsU3BlZWQvRHBsbERpdmlzb3IpL2luZm8tPnBhcmFtcy5jbG9ja19zcGVlZCk7CisJCQlpZiAoICEoKCgoWHRhbFNwZWVkL0RwbGxEaXZpc29yKSAlIGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCkgKiAyKQorCQkJICAgICAgIC8gaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKSApCisJCQkJVGMtLTsKKyAJCX0KKyAJCWVsc2UKKyAJCQlUYyA9IC0xOworIAkJCQkgIAorCisJCS8qIFdyaXRlIDE2LWJpdCBUaW1lIENvbnN0YW50IGZvciBCUkcxICovCisJCXVzY19PdXRSZWcoIGluZm8sIFRDMVIsIFRjICk7CisKKwkJUmVnVmFsdWUgfD0gQklUNDsJCS8qIGVuYWJsZSBCUkcxICovCisKKwkJc3dpdGNoICggaW5mby0+cGFyYW1zLmVuY29kaW5nICkgeworCQljYXNlIEhETENfRU5DT0RJTkdfTlJaOgorCQljYXNlIEhETENfRU5DT0RJTkdfTlJaQjoKKwkJY2FzZSBIRExDX0VOQ09ESU5HX05SWklfTUFSSzoKKwkJY2FzZSBIRExDX0VOQ09ESU5HX05SWklfU1BBQ0U6IFJlZ1ZhbHVlIHw9IEJJVDg7IGJyZWFrOworCQljYXNlIEhETENfRU5DT0RJTkdfQklQSEFTRV9NQVJLOgorCQljYXNlIEhETENfRU5DT0RJTkdfQklQSEFTRV9TUEFDRTogUmVnVmFsdWUgfD0gQklUOTsgYnJlYWs7CisJCWNhc2UgSERMQ19FTkNPRElOR19CSVBIQVNFX0xFVkVMOgorCQljYXNlIEhETENfRU5DT0RJTkdfRElGRl9CSVBIQVNFX0xFVkVMOiBSZWdWYWx1ZSB8PSBCSVQ5ICsgQklUODsgYnJlYWs7CisJCX0KKwl9CisKKwl1c2NfT3V0UmVnKCBpbmZvLCBIQ1IsIFJlZ1ZhbHVlICk7CisKKworCS8qIENoYW5uZWwgQ29udHJvbC9zdGF0dXMgUmVnaXN0ZXIgKENDU1IpCisJICoKKwkgKiA8MTU+CQlYCVJDQyBGSUZPIE92ZXJmbG93IHN0YXR1cyAoUk8pCisJICogPDE0PgkJWAlSQ0MgRklGTyBOb3QgRW1wdHkgc3RhdHVzIChSTykKKwkgKiA8MTM+CQkwCTEgPSBDbGVhciBSQ0MgRklGTyAoV08pCisJICogPDEyPgkJWAlEUExMIFN5bmMgKFJXKQorCSAqIDwxMT4JCVgJRFBMTCAyIE1pc3NlZCBDbG9ja3Mgc3RhdHVzIChSTykKKwkgKiA8MTA+CQlYCURQTEwgMSBNaXNzZWQgQ2xvY2sgc3RhdHVzIChSTykKKwkgKiA8OS4uOD4JMDAJRFBMTCBSZXN5bmMgb24gcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzIChSVykKKwkgKiA8Nz4JCVgJU0RMQyBMb29wIE9uIHN0YXR1cyAoUk8pCisJICogPDY+CQlYCVNETEMgTG9vcCBTZW5kIHN0YXR1cyAoUk8pCisJICogPDU+CQkxCUJ5cGFzcyBjb3VudGVycyBmb3IgVHhDbGsgYW5kIFJ4Q2xrIChSVykKKwkgKiA8NC4uMj4gICAJMDAwCUxhc3QgQ2hhciBvZiBTRExDIGZyYW1lIGhhcyA4IGJpdHMgKFJXKQorCSAqIDwxLi4wPiAgIAkwMAlyZXNlcnZlZAorCSAqCisJICoJMDAwMCAwMDAwIDAwMTAgMDAwMCA9IDB4MDAyMAorCSAqLworCisJdXNjX091dFJlZyggaW5mbywgQ0NTUiwgMHgxMDIwICk7CisKKworCWlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0FVVE9fQ1RTICkgeworCQl1c2NfT3V0UmVnKCBpbmZvLCBTSUNSLAorCQkJICAgICh1MTYpKHVzY19JblJlZyhpbmZvLFNJQ1IpIHwgU0lDUl9DVFNfSU5BQ1RJVkUpICk7CisJfQorCQorCisJLyogZW5hYmxlIE1hc3RlciBJbnRlcnJ1cHQgRW5hYmxlIGJpdCAoTUlFKSAqLworCXVzY19FbmFibGVNYXN0ZXJJcnFCaXQoIGluZm8gKTsKKworCXVzY19DbGVhcklycVBlbmRpbmdCaXRzKCBpbmZvLCBSRUNFSVZFX1NUQVRVUyArIFJFQ0VJVkVfREFUQSArCisJCQkJVFJBTlNNSVRfU1RBVFVTICsgVFJBTlNNSVRfREFUQSArIE1JU0MpOworCisJLyogYXJtIFJDQyB1bmRlcmZsb3cgaW50ZXJydXB0ICovCisJdXNjX091dFJlZyhpbmZvLCBTSUNSLCAodTE2KSh1c2NfSW5SZWcoaW5mbyxTSUNSKSB8IEJJVDMpKTsKKwl1c2NfRW5hYmxlSW50ZXJydXB0cyhpbmZvLCBNSVNDKTsKKworCWluZm8tPm1icmVfYml0ID0gMDsKKwlvdXR3KCAwLCBpbmZvLT5pb19iYXNlICk7IAkJCS8qIGNsZWFyIE1hc3RlciBCdXMgRW5hYmxlIChEQ0FSKSAqLworCXVzY19EbWFDbWQoIGluZm8sIERtYUNtZF9SZXNldEFsbENoYW5uZWxzICk7CS8qIGRpc2FibGUgYm90aCBETUEgY2hhbm5lbHMgKi8KKwlpbmZvLT5tYnJlX2JpdCA9IEJJVDg7CisJb3V0dyggQklUOCwgaW5mby0+aW9fYmFzZSApOwkJCS8qIHNldCBNYXN0ZXIgQnVzIEVuYWJsZSAoRENBUikgKi8KKworCWlmIChpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX0lTQSkgeworCQkvKiBFbmFibGUgRE1BRU4gKFBvcnQgNywgQml0IDE0KSAqLworCQkvKiBUaGlzIGNvbm5lY3RzIHRoZSBETUEgcmVxdWVzdCBzaWduYWwgdG8gdGhlIElTQSBidXMgKi8KKwkJdXNjX091dFJlZyhpbmZvLCBQQ1IsICh1MTYpKCh1c2NfSW5SZWcoaW5mbywgUENSKSB8IEJJVDE1KSAmIH5CSVQxNCkpOworCX0KKworCS8qIERNQSBDb250cm9sIFJlZ2lzdGVyIChEQ1IpCisJICoKKwkgKiA8MTUuLjE0PgkxMAlQcmlvcml0eSBtb2RlID0gQWx0ZXJuYXRpbmcgVHgvUngKKwkgKgkJMDEJUnggaGFzIHByaW9yaXR5CisJICoJCTAwCVR4IGhhcyBwcmlvcml0eQorCSAqCisJICogPDEzPgkJMQlFbmFibGUgUHJpb3JpdHkgUHJlZW1wdCBwZXIgRENSPDE1Li4xND4KKwkgKgkJCShXQVJOSU5HIERDUjwxMS4uMTA+IG11c3QgYmUgMDAgd2hlbiB0aGlzIGlzIDEpCisJICoJCTAJQ2hvb3NlIGFjdGl2YXRlIGNoYW5uZWwgcGVyIERDUjwxMS4uMTA+CisJICoKKwkgKiA8MTI+CQkwCUxpdHRsZSBFbmRpYW4gZm9yIEFycmF5L0xpc3QKKwkgKiA8MTEuLjEwPgkwMAlCb3RoIENoYW5uZWxzIGNhbiB1c2UgZWFjaCBidXMgZ3JhbnQKKwkgKiA8OS4uNj4JMDAwMAlyZXNlcnZlZAorCSAqIDw1PgkJMAk3IENMSyAtIE1pbmltdW0gQnVzIFJlLXJlcXVlc3QgSW50ZXJ2YWwKKwkgKiA8ND4JCTAJMSA9IGRyaXZlIEQvQyBhbmQgUy9EIHBpbnMKKwkgKiA8Mz4JCTEJMSA9IEFkZCBvbmUgd2FpdCBzdGF0ZSB0byBhbGwgRE1BIGN5Y2xlcy4KKwkgKiA8Mj4JCTAJMSA9IFN0cm9iZSAvVUFTIG9uIGV2ZXJ5IHRyYW5zZmVyLgorCSAqIDwxLi4wPgkxMQlBZGRyIGluY3JlbWVudGluZyBvbmx5IGFmZmVjdHMgTFMyNCBiaXRzCisJICoKKwkgKgkwMTEwIDAwMDAgMDAwMCAxMDExID0gMHg2MDBiCisJICovCisKKwlpZiAoIGluZm8tPmJ1c190eXBlID09IE1HU0xfQlVTX1RZUEVfUENJICkgeworCQkvKiBQQ0kgYWRhcHRlciBkb2VzIG5vdCBuZWVkIERNQSB3YWl0IHN0YXRlICovCisJCXVzY19PdXREbWFSZWcoIGluZm8sIERDUiwgMHhhMDBiICk7CisJfQorCWVsc2UKKwkJdXNjX091dERtYVJlZyggaW5mbywgRENSLCAweDgwMGIgKTsKKworCisJLyogUmVjZWl2ZSBETUEgbW9kZSBSZWdpc3RlciAoUkRNUikKKwkgKgorCSAqIDwxNS4uMTQ+CTExCURNQSBtb2RlID0gTGlua2VkIExpc3QgQnVmZmVyIG1vZGUKKwkgKiA8MTM+CQkxCVJTQmluQS9MID0gc3RvcmUgUnggc3RhdHVzIEJsb2NrIGluIEFycmFyeS9MaXN0IGVudHJ5CisJICogPDEyPgkJMQlDbGVhciBjb3VudCBvZiBMaXN0IEVudHJ5IGFmdGVyIGZldGNoaW5nCisJICogPDExLi4xMD4JMDAJQWRkcmVzcyBtb2RlID0gSW5jcmVtZW50CisJICogPDk+CQkxCVRlcm1pbmF0ZSBCdWZmZXIgb24gUnhCb3VuZAorCSAqIDw4PgkJMAlCdXMgV2lkdGggPSAxNmJpdHMKKwkgKiA8Ny4uMD4JPwlzdGF0dXMgQml0cyAod3JpdGUgYXMgMHMpCisJICoKKwkgKiAxMTExIDAwMTAgMDAwMCAwMDAwID0gMHhmMjAwCisJICovCisKKwl1c2NfT3V0RG1hUmVnKCBpbmZvLCBSRE1SLCAweGYyMDAgKTsKKworCisJLyogVHJhbnNtaXQgRE1BIG1vZGUgUmVnaXN0ZXIgKFRETVIpCisJICoKKwkgKiA8MTUuLjE0PgkxMQlETUEgbW9kZSA9IExpbmtlZCBMaXN0IEJ1ZmZlciBtb2RlCisJICogPDEzPgkJMQlUQ0JpbkEvTCA9IGZldGNoIFR4IENvbnRyb2wgQmxvY2sgZnJvbSBMaXN0IGVudHJ5CisJICogPDEyPgkJMQlDbGVhciBjb3VudCBvZiBMaXN0IEVudHJ5IGFmdGVyIGZldGNoaW5nCisJICogPDExLi4xMD4JMDAJQWRkcmVzcyBtb2RlID0gSW5jcmVtZW50CisJICogPDk+CQkxCVRlcm1pbmF0ZSBCdWZmZXIgb24gZW5kIG9mIGZyYW1lCisJICogPDg+CQkwCUJ1cyBXaWR0aCA9IDE2Yml0cworCSAqIDw3Li4wPgk/CXN0YXR1cyBCaXRzIChSZWFkIE9ubHkgc28gd3JpdGUgYXMgMCkKKwkgKgorCSAqCTExMTEgMDAxMCAwMDAwIDAwMDAgPSAweGYyMDAKKwkgKi8KKworCXVzY19PdXREbWFSZWcoIGluZm8sIFRETVIsIDB4ZjIwMCApOworCisKKwkvKiBETUEgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKERJQ1IpCisJICoKKwkgKiA8MTU+CQkxCURNQSBJbnRlcnJ1cHQgRW5hYmxlCisJICogPDE0PgkJMAkxID0gRGlzYWJsZSBJRU8gZnJvbSBVU0MKKwkgKiA8MTM+CQkwCTEgPSBEb24ndCBwcm92aWRlIHZlY3RvciBkdXJpbmcgSW50QWNrCisJICogPDEyPgkJMQkxID0gSW5jbHVkZSBzdGF0dXMgaW4gVmVjdG9yCisJICogPDEwLi4yPgkwCXJlc2VydmVkLCBNdXN0IGJlIDBzCisJICogPDE+CQkwCTEgPSBSeCBETUEgSW50ZXJydXB0IEVuYWJsZWQKKwkgKiA8MD4JCTAJMSA9IFR4IERNQSBJbnRlcnJ1cHQgRW5hYmxlZAorCSAqCisJICoJMTAwMSAwMDAwIDAwMDAgMDAwMCA9IDB4OTAwMAorCSAqLworCisJdXNjX091dERtYVJlZyggaW5mbywgRElDUiwgMHg5MDAwICk7CisKKwl1c2NfSW5EbWFSZWcoIGluZm8sIFJETVIgKTsJCS8qIGNsZWFyIHBlbmRpbmcgcmVjZWl2ZSBETUEgSVJRIGJpdHMgKi8KKwl1c2NfSW5EbWFSZWcoIGluZm8sIFRETVIgKTsJCS8qIGNsZWFyIHBlbmRpbmcgdHJhbnNtaXQgRE1BIElSUSBiaXRzICovCisJdXNjX091dERtYVJlZyggaW5mbywgQ0RJUiwgMHgwMzAzICk7CS8qIGNsZWFyIElVUyBhbmQgUGVuZGluZyBmb3IgVHggYW5kIFJ4ICovCisKKwkvKiBDaGFubmVsIENvbnRyb2wgUmVnaXN0ZXIgKENDUikKKwkgKgorCSAqIDwxNS4uMTQ+CTEwCVVzZSAzMi1iaXQgVHggQ29udHJvbCBCbG9ja3MgKFRDQnMpCisJICogPDEzPgkJMAlUcmlnZ2VyIFR4IG9uIFNXIENvbW1hbmQgRGlzYWJsZWQKKwkgKiA8MTI+CQkwCUZsYWcgUHJlYW1ibGUgRGlzYWJsZWQKKwkgKiA8MTEuLjEwPgkwMAlQcmVhbWJsZSBMZW5ndGgKKwkgKiA8OS4uOD4JMDAJUHJlYW1ibGUgUGF0dGVybgorCSAqIDw3Li42PgkxMAlVc2UgMzItYml0IFJ4IHN0YXR1cyBCbG9ja3MgKFJTQnMpCisJICogPDU+CQkwCVRyaWdnZXIgUnggb24gU1cgQ29tbWFuZCBEaXNhYmxlZAorCSAqIDw0Li4wPgkwCXJlc2VydmVkCisJICoKKwkgKgkxMDAwIDAwMDAgMTAwMCAwMDAwID0gMHg4MDgwCisJICovCisKKwlSZWdWYWx1ZSA9IDB4ODA4MDsKKworCXN3aXRjaCAoIGluZm8tPnBhcmFtcy5wcmVhbWJsZV9sZW5ndGggKSB7CisJY2FzZSBIRExDX1BSRUFNQkxFX0xFTkdUSF8xNkJJVFM6IFJlZ1ZhbHVlIHw9IEJJVDEwOyBicmVhazsKKwljYXNlIEhETENfUFJFQU1CTEVfTEVOR1RIXzMyQklUUzogUmVnVmFsdWUgfD0gQklUMTE7IGJyZWFrOworCWNhc2UgSERMQ19QUkVBTUJMRV9MRU5HVEhfNjRCSVRTOiBSZWdWYWx1ZSB8PSBCSVQxMSArIEJJVDEwOyBicmVhazsKKwl9CisKKwlzd2l0Y2ggKCBpbmZvLT5wYXJhbXMucHJlYW1ibGUgKSB7CisJY2FzZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fRkxBR1M6IFJlZ1ZhbHVlIHw9IEJJVDggKyBCSVQxMjsgYnJlYWs7CisJY2FzZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fT05FUzogIFJlZ1ZhbHVlIHw9IEJJVDg7IGJyZWFrOworCWNhc2UgSERMQ19QUkVBTUJMRV9QQVRURVJOXzEwOiAgICBSZWdWYWx1ZSB8PSBCSVQ5OyBicmVhazsKKwljYXNlIEhETENfUFJFQU1CTEVfUEFUVEVSTl8wMTogICAgUmVnVmFsdWUgfD0gQklUOSArIEJJVDg7IGJyZWFrOworCX0KKworCXVzY19PdXRSZWcoIGluZm8sIENDUiwgUmVnVmFsdWUgKTsKKworCisJLyoKKwkgKiBCdXJzdC9Ed2VsbCBDb250cm9sIFJlZ2lzdGVyCisJICoKKwkgKiA8MTUuLjg+CTB4MjAJTWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXJzIHBlciBidXMgZ3JhbnQKKwkgKiA8Ny4uMD4JMHgwMAlNYXhpbXVtIG51bWJlciBvZiBjbG9jayBjeWNsZXMgcGVyIGJ1cyBncmFudAorCSAqLworCisJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApIHsKKwkJLyogZG9uJ3QgbGltaXQgYnVzIG9jY3VwYW5jeSBvbiBQQ0kgYWRhcHRlciAqLworCQl1c2NfT3V0RG1hUmVnKCBpbmZvLCBCRENSLCAweDAwMDAgKTsKKwl9CisJZWxzZQorCQl1c2NfT3V0RG1hUmVnKCBpbmZvLCBCRENSLCAweDIwMDAgKTsKKworCXVzY19zdG9wX3RyYW5zbWl0dGVyKGluZm8pOworCXVzY19zdG9wX3JlY2VpdmVyKGluZm8pOworCQorfQkvKiBlbmQgb2YgdXNjX3NldF9zZGxjX21vZGUoKSAqLworCisvKiB1c2NfZW5hYmxlX2xvb3BiYWNrKCkKKyAqCisgKiBTZXQgdGhlIDE2QzMyIGZvciBpbnRlcm5hbCBsb29wYmFjayBtb2RlLgorICogVGhlIFR4Q0xLIGFuZCBSeENMSyBzaWduYWxzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgQlJHMCBhbmQKKyAqIHRoZSBUeEQgaXMgbG9vcGVkIGJhY2sgdG8gdGhlIFJ4RCBpbnRlcm5hbGx5LgorICoKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICoJCQllbmFibGUJMSA9IGVuYWJsZSBsb29wYmFjaywgMCA9IGRpc2FibGUKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCB1c2NfZW5hYmxlX2xvb3BiYWNrKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKSB7CisJCS8qIGJsYW5rIGV4dGVybmFsIFRYRCBvdXRwdXQgKi8KKwkJdXNjX091dFJlZyhpbmZvLElPQ1IsdXNjX0luUmVnKGluZm8sSU9DUikgfCAoQklUNytCSVQ2KSk7CisJCisJCS8qIENsb2NrIG1vZGUgQ29udHJvbCBSZWdpc3RlciAoQ01DUikKKwkJICoKKwkJICogPDE1Li4xND4JMDAJY291bnRlciAxIERpc2FibGVkCisJCSAqIDwxMy4uMTI+IAkwMAljb3VudGVyIDAgRGlzYWJsZWQKKwkJICogPDExLi4xMD4gCTExCUJSRzEgSW5wdXQgaXMgVHhDIFBpbgorCQkgKiA8OS4uOD4JMTEJQlJHMCBJbnB1dCBpcyBUeEMgUGluCisJCSAqIDw3Li42PgkwMQlEUExMIElucHV0IGlzIEJSRzEgT3V0cHV0CisJCSAqIDw1Li4zPgkxMDAJVHhDTEsgY29tZXMgZnJvbSBCUkcwCisJCSAqIDwyLi4wPiAgIAkxMDAJUnhDTEsgY29tZXMgZnJvbSBCUkcwCisJCSAqCisJCSAqIDAwMDAgMTExMSAwMTEwIDAxMDAgPSAweDBmNjQKKwkJICovCisKKwkJdXNjX091dFJlZyggaW5mbywgQ01DUiwgMHgwZjY0ICk7CisKKwkJLyogV3JpdGUgMTYtYml0IFRpbWUgQ29uc3RhbnQgZm9yIEJSRzAgKi8KKwkJLyogdXNlIGNsb2NrIHNwZWVkIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSA4IGZvciBkaWFnbm9zdGljcyAqLworCQlpZiAoaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKSB7CisJCQlpZiAoaW5mby0+YnVzX3R5cGUgPT0gTUdTTF9CVVNfVFlQRV9QQ0kpCisJCQkJdXNjX091dFJlZyhpbmZvLCBUQzBSLCAodTE2KSgoMTEwNTkyMDAvaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKS0xKSk7CisJCQllbHNlCisJCQkJdXNjX091dFJlZyhpbmZvLCBUQzBSLCAodTE2KSgoMTQ3NDU2MDAvaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKS0xKSk7CisJCX0gZWxzZQorCQkJdXNjX091dFJlZyhpbmZvLCBUQzBSLCAodTE2KTgpOworCisJCS8qIEhhcmR3YXJlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKEhDUikgQ2xlYXIgQml0IDEsIEJSRzAKKwkJICAgbW9kZSA9IENvbnRpbnVvdXMgU2V0IEJpdCAwIHRvIGVuYWJsZSBCUkcwLiAgKi8KKwkJdXNjX091dFJlZyggaW5mbywgSENSLCAodTE2KSgodXNjX0luUmVnKCBpbmZvLCBIQ1IgKSAmIH5CSVQxKSB8IEJJVDApICk7CisKKwkJLyogSW5wdXQvT3V0cHV0IENvbnRyb2wgUmVnLCA8Mi4uMD4gPSAxMDAsIERyaXZlIFJ4QyBwaW4gd2l0aCBCUkcwICovCisJCXVzY19PdXRSZWcoaW5mbywgSU9DUiwgKHUxNikoKHVzY19JblJlZyhpbmZvLCBJT0NSKSAmIDB4ZmZmOCkgfCAweDAwMDQpKTsKKworCQkvKiBzZXQgSW50ZXJuYWwgRGF0YSBsb29wYmFjayBtb2RlICovCisJCWluZm8tPmxvb3BiYWNrX2JpdHMgPSAweDMwMDsKKwkJb3V0dyggMHgwMzAwLCBpbmZvLT5pb19iYXNlICsgQ0NBUiApOworCX0gZWxzZSB7CisJCS8qIGVuYWJsZSBleHRlcm5hbCBUWEQgb3V0cHV0ICovCisJCXVzY19PdXRSZWcoaW5mbyxJT0NSLHVzY19JblJlZyhpbmZvLElPQ1IpICYgfihCSVQ3K0JJVDYpKTsKKwkKKwkJLyogY2xlYXIgSW50ZXJuYWwgRGF0YSBsb29wYmFjayBtb2RlICovCisJCWluZm8tPmxvb3BiYWNrX2JpdHMgPSAwOworCQlvdXR3KCAwLGluZm8tPmlvX2Jhc2UgKyBDQ0FSICk7CisJfQorCQorfQkvKiBlbmQgb2YgdXNjX2VuYWJsZV9sb29wYmFjaygpICovCisKKy8qIHVzY19lbmFibGVfYXV4X2Nsb2NrKCkKKyAqCisgKiBFbmFibGVkIHRoZSBBVVggY2xvY2sgb3V0cHV0IGF0IHRoZSBzcGVjaWZpZWQgZnJlcXVlbmN5LgorICoKKyAqIEFyZ3VtZW50czoKKyAqCisgKglpbmZvCQlwb2ludGVyIHRvIGRldmljZSBleHRlbnNpb24KKyAqCWRhdGFfcmF0ZQlkYXRhIHJhdGUgb2YgY2xvY2sgaW4gYml0cyBwZXIgc2Vjb25kCisgKgkJCUEgZGF0YSByYXRlIG9mIDAgZGlzYWJsZXMgdGhlIEFVWCBjbG9jay4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgdXNjX2VuYWJsZV9hdXhfY2xvY2soIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTMyIGRhdGFfcmF0ZSApCit7CisJdTMyIFh0YWxTcGVlZDsKKwl1MTYgVGM7CisKKwlpZiAoIGRhdGFfcmF0ZSApIHsKKwkJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApCisJCQlYdGFsU3BlZWQgPSAxMTA1OTIwMDsKKwkJZWxzZQorCQkJWHRhbFNwZWVkID0gMTQ3NDU2MDA7CisKKworCQkvKiBUYyA9IChYdGFsL1NwZWVkKSAtIDEgKi8KKwkJLyogSWYgdHdpY2UgdGhlIHJlbWFpbmRlciBvZiAoWHRhbC9TcGVlZCkgaXMgZ3JlYXRlciB0aGFuIFNwZWVkICovCisJCS8qIHRoZW4gcm91bmRpbmcgdXAgZ2l2ZXMgYSBtb3JlIHByZWNpc2UgdGltZSBjb25zdGFudC4gSW5zdGVhZCAqLworCQkvKiBvZiByb3VuZGluZyB1cCBhbmQgdGhlbiBzdWJ0cmFjdGluZyAxIHdlIGp1c3QgZG9uJ3Qgc3VidHJhY3QgKi8KKwkJLyogdGhlIG9uZSBpbiB0aGlzIGNhc2UuICovCisKKworCQlUYyA9ICh1MTYpKFh0YWxTcGVlZC9kYXRhX3JhdGUpOworCQlpZiAoICEoKChYdGFsU3BlZWQgJSBkYXRhX3JhdGUpICogMikgLyBkYXRhX3JhdGUpICkKKwkJCVRjLS07CisKKwkJLyogV3JpdGUgMTYtYml0IFRpbWUgQ29uc3RhbnQgZm9yIEJSRzAgKi8KKwkJdXNjX091dFJlZyggaW5mbywgVEMwUiwgVGMgKTsKKworCQkvKgorCQkgKiBIYXJkd2FyZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChIQ1IpCisJCSAqIENsZWFyIEJpdCAxLCBCUkcwIG1vZGUgPSBDb250aW51b3VzCisJCSAqIFNldCBCaXQgMCB0byBlbmFibGUgQlJHMC4KKwkJICovCisKKwkJdXNjX091dFJlZyggaW5mbywgSENSLCAodTE2KSgodXNjX0luUmVnKCBpbmZvLCBIQ1IgKSAmIH5CSVQxKSB8IEJJVDApICk7CisKKwkJLyogSW5wdXQvT3V0cHV0IENvbnRyb2wgUmVnLCA8Mi4uMD4gPSAxMDAsIERyaXZlIFJ4QyBwaW4gd2l0aCBCUkcwICovCisJCXVzY19PdXRSZWcoIGluZm8sIElPQ1IsICh1MTYpKCh1c2NfSW5SZWcoaW5mbywgSU9DUikgJiAweGZmZjgpIHwgMHgwMDA0KSApOworCX0gZWxzZSB7CisJCS8qIGRhdGEgcmF0ZSA9PSAwIHNvIHR1cm4gb2ZmIEJSRzAgKi8KKwkJdXNjX091dFJlZyggaW5mbywgSENSLCAodTE2KSh1c2NfSW5SZWcoIGluZm8sIEhDUiApICYgfkJJVDApICk7CisJfQorCit9CS8qIGVuZCBvZiB1c2NfZW5hYmxlX2F1eF9jbG9jaygpICovCisKKy8qCisgKgorICogdXNjX3Byb2Nlc3NfcnhvdmVycnVuX3N5bmMoKQorICoKKyAqCQlUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhIHJlY2VpdmUgb3ZlcnJ1biBieSByZXNldHRpbmcgdGhlCisgKgkJcmVjZWl2ZSBETUEgYnVmZmVycyBhbmQgaXNzdWluZyBhIFB1cmdlIFJ4IEZJRk8gY29tbWFuZAorICoJCXRvIGFsbG93IHRoZSByZWNlaXZlciB0byBjb250aW51ZSByZWNlaXZpbmcuCisgKgorICogQXJndW1lbnRzOgorICoKKyAqCWluZm8JCXBvaW50ZXIgdG8gZGV2aWNlIGV4dGVuc2lvbgorICoKKyAqIFJldHVybiBWYWx1ZTogTm9uZQorICovCitzdGF0aWMgdm9pZCB1c2NfcHJvY2Vzc19yeG92ZXJydW5fc3luYyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwlpbnQgc3RhcnRfaW5kZXg7CisJaW50IGVuZF9pbmRleDsKKwlpbnQgZnJhbWVfc3RhcnRfaW5kZXg7CisJaW50IHN0YXJ0X29mX2ZyYW1lX2ZvdW5kID0gRkFMU0U7CisJaW50IGVuZF9vZl9mcmFtZV9mb3VuZCA9IEZBTFNFOworCWludCByZXByb2dyYW1fZG1hID0gRkFMU0U7CisKKwlETUFCVUZGRVJFTlRSWSAqYnVmZmVyX2xpc3QgPSBpbmZvLT5yeF9idWZmZXJfbGlzdDsKKwl1MzIgcGh5c19hZGRyOworCisJdXNjX0RtYUNtZCggaW5mbywgRG1hQ21kX1BhdXNlUnhDaGFubmVsICk7CisJdXNjX1JDbWQoIGluZm8sIFJDbWRfRW50ZXJIdW50bW9kZSApOworCXVzY19SVENtZCggaW5mbywgUlRDbWRfUHVyZ2VSeEZpZm8gKTsKKworCS8qIEN1cnJlbnRSeEJ1ZmZlciBwb2ludHMgdG8gdGhlIDFzdCBidWZmZXIgb2YgdGhlIG5leHQgKi8KKwkvKiBwb3NzaWJseSBhdmFpbGFibGUgcmVjZWl2ZSBmcmFtZS4gKi8KKwkKKwlmcmFtZV9zdGFydF9pbmRleCA9IHN0YXJ0X2luZGV4ID0gZW5kX2luZGV4ID0gaW5mby0+Y3VycmVudF9yeF9idWZmZXI7CisKKwkvKiBTZWFyY2ggZm9yIGFuIHVuZmluaXNoZWQgc3RyaW5nIG9mIGJ1ZmZlcnMuIFRoaXMgbWVhbnMgKi8KKwkvKiB0aGF0IGEgcmVjZWl2ZSBmcmFtZSBzdGFydGVkIChhdCBsZWFzdCBvbmUgYnVmZmVyIHdpdGggKi8KKwkvKiBjb3VudCBzZXQgdG8gemVybykgYnV0IHRoZXJlIGlzIG5vIHRlcm1pbml0aW5nIGJ1ZmZlciAqLworCS8qIChzdGF0dXMgc2V0IHRvIG5vbi16ZXJvKS4gKi8KKworCXdoaWxlKCAhYnVmZmVyX2xpc3RbZW5kX2luZGV4XS5jb3VudCApCisJeworCQkvKiBDb3VudCBmaWVsZCBoYXMgYmVlbiByZXNldCB0byB6ZXJvIGJ5IDE2QzMyLiAqLworCQkvKiBUaGlzIGJ1ZmZlciBpcyBjdXJyZW50bHkgaW4gdXNlLiAqLworCisJCWlmICggIXN0YXJ0X29mX2ZyYW1lX2ZvdW5kICkKKwkJeworCQkJc3RhcnRfb2ZfZnJhbWVfZm91bmQgPSBUUlVFOworCQkJZnJhbWVfc3RhcnRfaW5kZXggPSBlbmRfaW5kZXg7CisJCQllbmRfb2ZfZnJhbWVfZm91bmQgPSBGQUxTRTsKKwkJfQorCisJCWlmICggYnVmZmVyX2xpc3RbZW5kX2luZGV4XS5zdGF0dXMgKQorCQl7CisJCQkvKiBTdGF0dXMgZmllbGQgaGFzIGJlZW4gc2V0IGJ5IDE2QzMyLiAqLworCQkJLyogVGhpcyBpcyB0aGUgbGFzdCBidWZmZXIgb2YgYSByZWNlaXZlZCBmcmFtZS4gKi8KKworCQkJLyogV2Ugd2FudCB0byBsZWF2ZSB0aGUgYnVmZmVycyBmb3IgdGhpcyBmcmFtZSBpbnRhY3QuICovCisJCQkvKiBNb3ZlIG9uIHRvIG5leHQgcG9zc2libGUgZnJhbWUuICovCisKKwkJCXN0YXJ0X29mX2ZyYW1lX2ZvdW5kID0gRkFMU0U7CisJCQllbmRfb2ZfZnJhbWVfZm91bmQgPSBUUlVFOworCQl9CisKKyAgCQkvKiBhZHZhbmNlIHRvIG5leHQgYnVmZmVyIGVudHJ5IGluIGxpbmtlZCBsaXN0ICovCisgIAkJZW5kX2luZGV4Kys7CisgIAkJaWYgKCBlbmRfaW5kZXggPT0gaW5mby0+cnhfYnVmZmVyX2NvdW50ICkKKyAgCQkJZW5kX2luZGV4ID0gMDsKKworCQlpZiAoIHN0YXJ0X2luZGV4ID09IGVuZF9pbmRleCApCisJCXsKKwkJCS8qIFRoZSBlbnRpcmUgbGlzdCBoYXMgYmVlbiBzZWFyY2hlZCB3aXRoIGFsbCBDb3VudHMgPT0gMCBhbmQgKi8KKwkJCS8qIGFsbCBTdGF0dXMgPT0gMC4gVGhlIHJlY2VpdmUgYnVmZmVycyBhcmUgKi8KKwkJCS8qIGNvbXBsZXRlbHkgc2NyZXdlZCwgcmVzZXQgYWxsIHJlY2VpdmUgYnVmZmVycyEgKi8KKwkJCW1nc2xfcmVzZXRfcnhfZG1hX2J1ZmZlcnMoIGluZm8gKTsKKwkJCWZyYW1lX3N0YXJ0X2luZGV4ID0gMDsKKwkJCXN0YXJ0X29mX2ZyYW1lX2ZvdW5kID0gRkFMU0U7CisJCQlyZXByb2dyYW1fZG1hID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCBzdGFydF9vZl9mcmFtZV9mb3VuZCAmJiAhZW5kX29mX2ZyYW1lX2ZvdW5kICkKKwl7CisJCS8qIFRoZXJlIGlzIGFuIHVuZmluaXNoZWQgc3RyaW5nIG9mIHJlY2VpdmUgRE1BIGJ1ZmZlcnMgKi8KKwkJLyogYXMgYSByZXN1bHQgb2YgdGhlIHJlY2VpdmVyIG92ZXJydW4uICovCisKKwkJLyogUmVzZXQgdGhlIGJ1ZmZlcnMgZm9yIHRoZSB1bmZpbmlzaGVkIGZyYW1lICovCisJCS8qIGFuZCByZXByb2dyYW0gdGhlIHJlY2VpdmUgRE1BIGNvbnRyb2xsZXIgdG8gc3RhcnQgKi8KKwkJLyogYXQgdGhlIDFzdCBidWZmZXIgb2YgdW5maW5pc2hlZCBmcmFtZS4gKi8KKworCQlzdGFydF9pbmRleCA9IGZyYW1lX3N0YXJ0X2luZGV4OworCisJCWRvCisJCXsKKwkJCSooKHVuc2lnbmVkIGxvbmcgKikmKGluZm8tPnJ4X2J1ZmZlcl9saXN0W3N0YXJ0X2luZGV4KytdLmNvdW50KSkgPSBETUFCVUZGRVJTSVpFOworCisgIAkJCS8qIEFkanVzdCBpbmRleCBmb3Igd3JhcCBhcm91bmQuICovCisgIAkJCWlmICggc3RhcnRfaW5kZXggPT0gaW5mby0+cnhfYnVmZmVyX2NvdW50ICkKKyAgCQkJCXN0YXJ0X2luZGV4ID0gMDsKKworCQl9IHdoaWxlKCBzdGFydF9pbmRleCAhPSBlbmRfaW5kZXggKTsKKworCQlyZXByb2dyYW1fZG1hID0gVFJVRTsKKwl9CisKKwlpZiAoIHJlcHJvZ3JhbV9kbWEgKQorCXsKKwkJdXNjX1VubGF0Y2hSeHN0YXR1c0JpdHMoaW5mbyxSWFNUQVRVU19BTEwpOworCQl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyhpbmZvLCBSRUNFSVZFX0RBVEF8UkVDRUlWRV9TVEFUVVMpOworCQl1c2NfVW5sYXRjaFJ4c3RhdHVzQml0cyhpbmZvLCBSRUNFSVZFX0RBVEF8UkVDRUlWRV9TVEFUVVMpOworCQkKKwkJdXNjX0VuYWJsZVJlY2VpdmVyKGluZm8sRElTQUJMRV9VTkNPTkRJVElPTkFMKTsKKwkJCisJCS8qIFRoaXMgZW1wdGllcyB0aGUgcmVjZWl2ZSBGSUZPIGFuZCBsb2FkcyB0aGUgUkNDIHdpdGggUkNMUiAqLworCQl1c2NfT3V0UmVnKCBpbmZvLCBDQ1NSLCAodTE2KSh1c2NfSW5SZWcoaW5mbyxDQ1NSKSB8IEJJVDEzKSApOworCisJCS8qIHByb2dyYW0gMTZDMzIgd2l0aCBwaHlzaWNhbCBhZGRyZXNzIG9mIDFzdCBETUEgYnVmZmVyIGVudHJ5ICovCisJCXBoeXNfYWRkciA9IGluZm8tPnJ4X2J1ZmZlcl9saXN0W2ZyYW1lX3N0YXJ0X2luZGV4XS5waHlzX2VudHJ5OworCQl1c2NfT3V0RG1hUmVnKCBpbmZvLCBOUkFSTCwgKHUxNilwaHlzX2FkZHIgKTsKKwkJdXNjX091dERtYVJlZyggaW5mbywgTlJBUlUsICh1MTYpKHBoeXNfYWRkciA+PiAxNikgKTsKKworCQl1c2NfVW5sYXRjaFJ4c3RhdHVzQml0cyggaW5mbywgUlhTVEFUVVNfQUxMICk7CisJCXVzY19DbGVhcklycVBlbmRpbmdCaXRzKCBpbmZvLCBSRUNFSVZFX0RBVEEgKyBSRUNFSVZFX1NUQVRVUyApOworCQl1c2NfRW5hYmxlSW50ZXJydXB0cyggaW5mbywgUkVDRUlWRV9TVEFUVVMgKTsKKworCQkvKiAxLiBBcm0gRW5kIG9mIEJ1ZmZlciAoRU9CKSBSZWNlaXZlIERNQSBJbnRlcnJ1cHQgKEJJVDIgb2YgUkRJQVIpICovCisJCS8qIDIuIEVuYWJsZSBSZWNlaXZlIERNQSBJbnRlcnJ1cHRzIChCSVQxIG9mIERJQ1IpICovCisKKwkJdXNjX091dERtYVJlZyggaW5mbywgUkRJQVIsIEJJVDMgKyBCSVQyICk7CisJCXVzY19PdXREbWFSZWcoIGluZm8sIERJQ1IsICh1MTYpKHVzY19JbkRtYVJlZyhpbmZvLERJQ1IpIHwgQklUMSkgKTsKKwkJdXNjX0RtYUNtZCggaW5mbywgRG1hQ21kX0luaXRSeENoYW5uZWwgKTsKKwkJaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfQVVUT19EQ0QgKQorCQkJdXNjX0VuYWJsZVJlY2VpdmVyKGluZm8sRU5BQkxFX0FVVE9fRENEKTsKKwkJZWxzZQorCQkJdXNjX0VuYWJsZVJlY2VpdmVyKGluZm8sRU5BQkxFX1VOQ09ORElUSU9OQUwpOworCX0KKwllbHNlCisJeworCQkvKiBUaGlzIGVtcHRpZXMgdGhlIHJlY2VpdmUgRklGTyBhbmQgbG9hZHMgdGhlIFJDQyB3aXRoIFJDTFIgKi8KKwkJdXNjX091dFJlZyggaW5mbywgQ0NTUiwgKHUxNikodXNjX0luUmVnKGluZm8sQ0NTUikgfCBCSVQxMykgKTsKKwkJdXNjX1JUQ21kKCBpbmZvLCBSVENtZF9QdXJnZVJ4RmlmbyApOworCX0KKworfQkvKiBlbmQgb2YgdXNjX3Byb2Nlc3NfcnhvdmVycnVuX3N5bmMoKSAqLworCisvKiB1c2Nfc3RvcF9yZWNlaXZlcigpCisgKgorICoJRGlzYWJsZSBVU0MgcmVjZWl2ZXIKKyAqCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCB1c2Nfc3RvcF9yZWNlaXZlciggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTp1c2Nfc3RvcF9yZWNlaXZlciglcylcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisJCQkgCisJLyogRGlzYWJsZSByZWNlaXZlIERNQSBjaGFubmVsLiAqLworCS8qIFRoaXMgYWxzbyBkaXNhYmxlcyByZWNlaXZlIERNQSBjaGFubmVsIGludGVycnVwdHMgKi8KKwl1c2NfRG1hQ21kKCBpbmZvLCBEbWFDbWRfUmVzZXRSeENoYW5uZWwgKTsKKworCXVzY19VbmxhdGNoUnhzdGF0dXNCaXRzKCBpbmZvLCBSWFNUQVRVU19BTEwgKTsKKwl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggaW5mbywgUkVDRUlWRV9EQVRBICsgUkVDRUlWRV9TVEFUVVMgKTsKKwl1c2NfRGlzYWJsZUludGVycnVwdHMoIGluZm8sIFJFQ0VJVkVfREFUQSArIFJFQ0VJVkVfU1RBVFVTICk7CisKKwl1c2NfRW5hYmxlUmVjZWl2ZXIoaW5mbyxESVNBQkxFX1VOQ09ORElUSU9OQUwpOworCisJLyogVGhpcyBlbXB0aWVzIHRoZSByZWNlaXZlIEZJRk8gYW5kIGxvYWRzIHRoZSBSQ0Mgd2l0aCBSQ0xSICovCisJdXNjX091dFJlZyggaW5mbywgQ0NTUiwgKHUxNikodXNjX0luUmVnKGluZm8sQ0NTUikgfCBCSVQxMykgKTsKKwl1c2NfUlRDbWQoIGluZm8sIFJUQ21kX1B1cmdlUnhGaWZvICk7CisKKwlpbmZvLT5yeF9lbmFibGVkID0gMDsKKwlpbmZvLT5yeF9vdmVyZmxvdyA9IDA7CisJaW5mby0+cnhfcmNjX3VuZGVycnVuID0gMDsKKwkKK30JLyogZW5kIG9mIHN0b3BfcmVjZWl2ZXIoKSAqLworCisvKiB1c2Nfc3RhcnRfcmVjZWl2ZXIoKQorICoKKyAqCUVuYWJsZSB0aGUgVVNDIHJlY2VpdmVyIAorICoKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19zdGFydF9yZWNlaXZlciggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwl1MzIgcGh5c19hZGRyOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCXByaW50aygiJXMoJWQpOnVzY19zdGFydF9yZWNlaXZlciglcylcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwltZ3NsX3Jlc2V0X3J4X2RtYV9idWZmZXJzKCBpbmZvICk7CisJdXNjX3N0b3BfcmVjZWl2ZXIoIGluZm8gKTsKKworCXVzY19PdXRSZWcoIGluZm8sIENDU1IsICh1MTYpKHVzY19JblJlZyhpbmZvLENDU1IpIHwgQklUMTMpICk7CisJdXNjX1JUQ21kKCBpbmZvLCBSVENtZF9QdXJnZVJ4RmlmbyApOworCisJaWYgKCBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyB8fAorCQlpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfUkFXICkgeworCQkvKiBETUEgbW9kZSBUcmFuc2ZlcnMgKi8KKwkJLyogUHJvZ3JhbSB0aGUgRE1BIGNvbnRyb2xsZXIuICovCisJCS8qIEVuYWJsZSB0aGUgRE1BIGNvbnRyb2xsZXIgZW5kIG9mIGJ1ZmZlciBpbnRlcnJ1cHQuICovCisKKwkJLyogcHJvZ3JhbSAxNkMzMiB3aXRoIHBoeXNpY2FsIGFkZHJlc3Mgb2YgMXN0IERNQSBidWZmZXIgZW50cnkgKi8KKwkJcGh5c19hZGRyID0gaW5mby0+cnhfYnVmZmVyX2xpc3RbMF0ucGh5c19lbnRyeTsKKwkJdXNjX091dERtYVJlZyggaW5mbywgTlJBUkwsICh1MTYpcGh5c19hZGRyICk7CisJCXVzY19PdXREbWFSZWcoIGluZm8sIE5SQVJVLCAodTE2KShwaHlzX2FkZHIgPj4gMTYpICk7CisKKwkJdXNjX1VubGF0Y2hSeHN0YXR1c0JpdHMoIGluZm8sIFJYU1RBVFVTX0FMTCApOworCQl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggaW5mbywgUkVDRUlWRV9EQVRBICsgUkVDRUlWRV9TVEFUVVMgKTsKKwkJdXNjX0VuYWJsZUludGVycnVwdHMoIGluZm8sIFJFQ0VJVkVfU1RBVFVTICk7CisKKwkJLyogMS4gQXJtIEVuZCBvZiBCdWZmZXIgKEVPQikgUmVjZWl2ZSBETUEgSW50ZXJydXB0IChCSVQyIG9mIFJESUFSKSAqLworCQkvKiAyLiBFbmFibGUgUmVjZWl2ZSBETUEgSW50ZXJydXB0cyAoQklUMSBvZiBESUNSKSAqLworCisJCXVzY19PdXREbWFSZWcoIGluZm8sIFJESUFSLCBCSVQzICsgQklUMiApOworCQl1c2NfT3V0RG1hUmVnKCBpbmZvLCBESUNSLCAodTE2KSh1c2NfSW5EbWFSZWcoaW5mbyxESUNSKSB8IEJJVDEpICk7CisJCXVzY19EbWFDbWQoIGluZm8sIERtYUNtZF9Jbml0UnhDaGFubmVsICk7CisJCWlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0FVVE9fRENEICkKKwkJCXVzY19FbmFibGVSZWNlaXZlcihpbmZvLEVOQUJMRV9BVVRPX0RDRCk7CisJCWVsc2UKKwkJCXVzY19FbmFibGVSZWNlaXZlcihpbmZvLEVOQUJMRV9VTkNPTkRJVElPTkFMKTsKKwl9IGVsc2UgeworCQl1c2NfVW5sYXRjaFJ4c3RhdHVzQml0cyhpbmZvLCBSWFNUQVRVU19BTEwpOworCQl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyhpbmZvLCBSRUNFSVZFX0RBVEEgKyBSRUNFSVZFX1NUQVRVUyk7CisJCXVzY19FbmFibGVJbnRlcnJ1cHRzKGluZm8sIFJFQ0VJVkVfREFUQSk7CisKKwkJdXNjX1JUQ21kKCBpbmZvLCBSVENtZF9QdXJnZVJ4RmlmbyApOworCQl1c2NfUkNtZCggaW5mbywgUkNtZF9FbnRlckh1bnRtb2RlICk7CisKKwkJdXNjX0VuYWJsZVJlY2VpdmVyKGluZm8sRU5BQkxFX1VOQ09ORElUSU9OQUwpOworCX0KKworCXVzY19PdXRSZWcoIGluZm8sIENDU1IsIDB4MTAyMCApOworCisJaW5mby0+cnhfZW5hYmxlZCA9IDE7CisKK30JLyogZW5kIG9mIHVzY19zdGFydF9yZWNlaXZlcigpICovCisKKy8qIHVzY19zdGFydF90cmFuc21pdHRlcigpCisgKgorICoJRW5hYmxlIHRoZSBVU0MgdHJhbnNtaXR0ZXIgYW5kIHNlbmQgYSB0cmFuc21pdCBmcmFtZSBpZgorICoJb25lIGlzIGxvYWRlZCBpbiB0aGUgRE1BIGJ1ZmZlcnMuCisgKgorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgdXNjX3N0YXJ0X3RyYW5zbWl0dGVyKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCXUzMiBwaHlzX2FkZHI7CisJdW5zaWduZWQgaW50IEZyYW1lU2l6ZTsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCXByaW50aygiJXMoJWQpOnVzY19zdGFydF90cmFuc21pdHRlciglcylcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisJCQkgCisJaWYgKCBpbmZvLT54bWl0X2NudCApIHsKKworCQkvKiBJZiBhdXRvIFJUUyBlbmFibGVkIGFuZCBSVFMgaXMgaW5hY3RpdmUsIHRoZW4gYXNzZXJ0ICovCisJCS8qIFJUUyBhbmQgc2V0IGEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRyaXZlciBzaG91bGQgKi8KKwkJLyogbmVnYXRlIFJUUyB3aGVuIHRoZSB0cmFuc21pc3Npb24gY29tcGxldGVzLiAqLworCisJCWluZm8tPmRyb3BfcnRzX29uX3R4X2RvbmUgPSAwOworCisJCWlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0FVVE9fUlRTICkgeworCQkJdXNjX2dldF9zZXJpYWxfc2lnbmFscyggaW5mbyApOworCQkJaWYgKCAhKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykgKSB7CisJCQkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUzsKKwkJCQl1c2Nfc2V0X3NlcmlhbF9zaWduYWxzKCBpbmZvICk7CisJCQkJaW5mby0+ZHJvcF9ydHNfb25fdHhfZG9uZSA9IDE7CisJCQl9CisJCX0KKworCisJCWlmICggaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0FTWU5DICkgeworCQkJaWYgKCAhaW5mby0+dHhfYWN0aXZlICkgeworCQkJCXVzY19VbmxhdGNoVHhzdGF0dXNCaXRzKGluZm8sIFRYU1RBVFVTX0FMTCk7CisJCQkJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoaW5mbywgVFJBTlNNSVRfU1RBVFVTICsgVFJBTlNNSVRfREFUQSk7CisJCQkJdXNjX0VuYWJsZUludGVycnVwdHMoaW5mbywgVFJBTlNNSVRfREFUQSk7CisJCQkJdXNjX2xvYWRfdHhmaWZvKGluZm8pOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSB0cmFuc21pdCBETUEgY29udHJvbGxlciB3aGlsZSBwcm9ncmFtbWluZy4gKi8KKwkJCXVzY19EbWFDbWQoIGluZm8sIERtYUNtZF9SZXNldFR4Q2hhbm5lbCApOworCQkJCisJCQkvKiBUcmFuc21pdCBETUEgYnVmZmVyIGlzIGxvYWRlZCwgc28gcHJvZ3JhbSBVU0MgKi8KKwkJCS8qIHRvIHNlbmQgdGhlIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgYnVmZmVycy4JICovCisKKwkJCUZyYW1lU2l6ZSA9IGluZm8tPnR4X2J1ZmZlcl9saXN0W2luZm8tPnN0YXJ0X3R4X2RtYV9idWZmZXJdLnJjYzsKKworCQkJLyogaWYgb3BlcmF0aW5nIGluIFJhdyBzeW5jIG1vZGUsIHJlc2V0IHRoZSByY2MgY29tcG9uZW50CisJCQkgKiBvZiB0aGUgdHggZG1hIGJ1ZmZlciBlbnRyeSwgb3RoZXJ3aXNlLCB0aGUgc2VyaWFsIGNvbnRyb2xsZXIKKwkJCSAqIHdpbGwgc2VuZCBhIGNsb3Npbmcgc3luYyBjaGFyIGFmdGVyIHRoaXMgY291bnQuCisJCQkgKi8KKwkgICAgCQlpZiAoIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9SQVcgKQorCQkJCWluZm8tPnR4X2J1ZmZlcl9saXN0W2luZm8tPnN0YXJ0X3R4X2RtYV9idWZmZXJdLnJjYyA9IDA7CisKKwkJCS8qIFByb2dyYW0gdGhlIFRyYW5zbWl0IENoYXJhY3RlciBMZW5ndGggUmVnaXN0ZXIgKFRDTFIpICovCisJCQkvKiBhbmQgY2xlYXIgRklGTyAoVENDIGlzIGxvYWRlZCB3aXRoIFRDTFIgb24gRklGTyBjbGVhcikgKi8KKwkJCXVzY19PdXRSZWcoIGluZm8sIFRDTFIsICh1MTYpRnJhbWVTaXplICk7CisKKwkJCXVzY19SVENtZCggaW5mbywgUlRDbWRfUHVyZ2VUeEZpZm8gKTsKKworCQkJLyogUHJvZ3JhbSB0aGUgYWRkcmVzcyBvZiB0aGUgMXN0IERNQSBCdWZmZXIgRW50cnkgaW4gbGlua2VkIGxpc3QgKi8KKwkJCXBoeXNfYWRkciA9IGluZm8tPnR4X2J1ZmZlcl9saXN0W2luZm8tPnN0YXJ0X3R4X2RtYV9idWZmZXJdLnBoeXNfZW50cnk7CisJCQl1c2NfT3V0RG1hUmVnKCBpbmZvLCBOVEFSTCwgKHUxNilwaHlzX2FkZHIgKTsKKwkJCXVzY19PdXREbWFSZWcoIGluZm8sIE5UQVJVLCAodTE2KShwaHlzX2FkZHIgPj4gMTYpICk7CisKKwkJCXVzY19VbmxhdGNoVHhzdGF0dXNCaXRzKCBpbmZvLCBUWFNUQVRVU19BTEwgKTsKKwkJCXVzY19DbGVhcklycVBlbmRpbmdCaXRzKCBpbmZvLCBUUkFOU01JVF9TVEFUVVMgKTsKKwkJCXVzY19FbmFibGVJbnRlcnJ1cHRzKCBpbmZvLCBUUkFOU01JVF9TVEFUVVMgKTsKKworCQkJaWYgKCBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfUkFXICYmCisJCQkJCWluZm8tPm51bV90eF9kbWFfYnVmZmVycyA+IDEgKSB7CisJCQkgICAvKiBXaGVuIHJ1bm5pbmcgZXh0ZXJuYWwgc3luYyBtb2RlLCBhdHRlbXB0IHRvICdzdHJlYW0nIHRyYW5zbWl0ICAqLworCQkJICAgLyogYnkgZmlsbGluZyB0eCBkbWEgYnVmZmVycyBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUuIFRvIGRvIHRoaXMgKi8KKwkJCSAgIC8qIHdlIG5lZWQgdG8gZW5hYmxlIFR4IERNQSBFT0IgU3RhdHVzIGludGVycnVwdHMgOiAgICAgICAgICAgICAgICovCisJCQkgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJICAgLyogMS4gQXJtIEVuZCBvZiBCdWZmZXIgKEVPQikgVHJhbnNtaXQgRE1BIEludGVycnVwdCAoQklUMiBvZiBURElBUikgKi8KKwkJCSAgIC8qIDIuIEVuYWJsZSBUcmFuc21pdCBETUEgSW50ZXJydXB0cyAoQklUMCBvZiBESUNSKSAqLworCisJCQkgICB1c2NfT3V0RG1hUmVnKCBpbmZvLCBURElBUiwgQklUMnxCSVQzICk7CisJCQkgICB1c2NfT3V0RG1hUmVnKCBpbmZvLCBESUNSLCAodTE2KSh1c2NfSW5EbWFSZWcoaW5mbyxESUNSKSB8IEJJVDApICk7CisJCQl9CisKKwkJCS8qIEluaXRpYWxpemUgVHJhbnNtaXQgRE1BIENoYW5uZWwgKi8KKwkJCXVzY19EbWFDbWQoIGluZm8sIERtYUNtZF9Jbml0VHhDaGFubmVsICk7CisJCQkKKwkJCXVzY19UQ21kKCBpbmZvLCBUQ21kX1NlbmRGcmFtZSApOworCQkJCisJCQlpbmZvLT50eF90aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwMCk7CisJCQlhZGRfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsJCisJCX0KKwkJaW5mby0+dHhfYWN0aXZlID0gMTsKKwl9CisKKwlpZiAoICFpbmZvLT50eF9lbmFibGVkICkgeworCQlpbmZvLT50eF9lbmFibGVkID0gMTsKKwkJaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfQVVUT19DVFMgKQorCQkJdXNjX0VuYWJsZVRyYW5zbWl0dGVyKGluZm8sRU5BQkxFX0FVVE9fQ1RTKTsKKwkJZWxzZQorCQkJdXNjX0VuYWJsZVRyYW5zbWl0dGVyKGluZm8sRU5BQkxFX1VOQ09ORElUSU9OQUwpOworCX0KKworfQkvKiBlbmQgb2YgdXNjX3N0YXJ0X3RyYW5zbWl0dGVyKCkgKi8KKworLyogdXNjX3N0b3BfdHJhbnNtaXR0ZXIoKQorICoKKyAqCVN0b3BzIHRoZSB0cmFuc21pdHRlciBhbmQgRE1BCisgKgorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpc250YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgdXNjX3N0b3BfdHJhbnNtaXR0ZXIoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKKwkJcHJpbnRrKCIlcyglZCk6dXNjX3N0b3BfdHJhbnNtaXR0ZXIoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQkJIAorCWRlbF90aW1lcigmaW5mby0+dHhfdGltZXIpOwkKKwkJCSAKKwl1c2NfVW5sYXRjaFR4c3RhdHVzQml0cyggaW5mbywgVFhTVEFUVVNfQUxMICk7CisJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoIGluZm8sIFRSQU5TTUlUX1NUQVRVUyArIFRSQU5TTUlUX0RBVEEgKTsKKwl1c2NfRGlzYWJsZUludGVycnVwdHMoIGluZm8sIFRSQU5TTUlUX1NUQVRVUyArIFRSQU5TTUlUX0RBVEEgKTsKKworCXVzY19FbmFibGVUcmFuc21pdHRlcihpbmZvLERJU0FCTEVfVU5DT05ESVRJT05BTCk7CisJdXNjX0RtYUNtZCggaW5mbywgRG1hQ21kX1Jlc2V0VHhDaGFubmVsICk7CisJdXNjX1JUQ21kKCBpbmZvLCBSVENtZF9QdXJnZVR4RmlmbyApOworCisJaW5mby0+dHhfZW5hYmxlZCA9IDA7CisJaW5mby0+dHhfYWN0aXZlICA9IDA7CisKK30JLyogZW5kIG9mIHVzY19zdG9wX3RyYW5zbWl0dGVyKCkgKi8KKworLyogdXNjX2xvYWRfdHhmaWZvKCkKKyAqCisgKglGaWxsIHRoZSB0cmFuc21pdCBGSUZPIHVudGlsIHRoZSBGSUZPIGlzIGZ1bGwgb3IKKyAqCXRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0byBsb2FkLgorICoKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgZXh0ZW5zaW9uIChpbnN0YW5jZSBkYXRhKQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19sb2FkX3R4Zmlmbyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwlpbnQgRmlmb2NvdW50OworCXU4IFR3b0J5dGVzWzJdOworCQorCWlmICggIWluZm8tPnhtaXRfY250ICYmICFpbmZvLT54X2NoYXIgKQorCQlyZXR1cm47IAorCQkKKwkvKiBTZWxlY3QgdHJhbnNtaXQgRklGTyBzdGF0dXMgcmVhZGJhY2sgaW4gVElDUiAqLworCXVzY19UQ21kKCBpbmZvLCBUQ21kX1NlbGVjdFRpY3JUeEZpZm9zdGF0dXMgKTsKKworCS8qIGxvYWQgdGhlIFRyYW5zbWl0IEZJRk8gdW50aWwgRklGT3MgZnVsbCBvciBhbGwgZGF0YSBzZW50ICovCisKKwl3aGlsZSggKEZpZm9jb3VudCA9IHVzY19JblJlZyhpbmZvLCBUSUNSKSA+PiA4KSAmJiBpbmZvLT54bWl0X2NudCApIHsKKwkJLyogdGhlcmUgaXMgbW9yZSBzcGFjZSBpbiB0aGUgdHJhbnNtaXQgRklGTyBhbmQgKi8KKwkJLyogdGhlcmUgaXMgbW9yZSBkYXRhIGluIHRyYW5zbWl0IGJ1ZmZlciAqLworCisJCWlmICggKGluZm8tPnhtaXRfY250ID4gMSkgJiYgKEZpZm9jb3VudCA+IDEpICYmICFpbmZvLT54X2NoYXIgKSB7CisgCQkJLyogd3JpdGUgYSAxNi1iaXQgd29yZCBmcm9tIHRyYW5zbWl0IGJ1ZmZlciB0byAxNkMzMiAqLworCQkJCQorCQkJVHdvQnl0ZXNbMF0gPSBpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWwrK107CisJCQlpbmZvLT54bWl0X3RhaWwgPSBpbmZvLT54bWl0X3RhaWwgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKKwkJCVR3b0J5dGVzWzFdID0gaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsKytdOworCQkJaW5mby0+eG1pdF90YWlsID0gaW5mby0+eG1pdF90YWlsICYgKFNFUklBTF9YTUlUX1NJWkUtMSk7CisJCQkKKwkJCW91dHcoICooKHUxNiAqKVR3b0J5dGVzKSwgaW5mby0+aW9fYmFzZSArIERBVEFSRUcpOworCQkJCQorCQkJaW5mby0+eG1pdF9jbnQgLT0gMjsKKwkJCWluZm8tPmljb3VudC50eCArPSAyOworCQl9IGVsc2UgeworCQkJLyogb25seSAxIGJ5dGUgbGVmdCB0byB0cmFuc21pdCBvciAxIEZJRk8gc2xvdCBsZWZ0ICovCisJCQkKKwkJCW91dHcoIChpbncoIGluZm8tPmlvX2Jhc2UgKyBDQ0FSKSAmIDB4MDc4MCkgfCAoVERSK0xTQk9OTFkpLAorCQkJCWluZm8tPmlvX2Jhc2UgKyBDQ0FSICk7CisJCQkKKwkJCWlmIChpbmZvLT54X2NoYXIpIHsKKwkJCQkvKiB0cmFuc21pdCBwZW5kaW5nIGhpZ2ggcHJpb3JpdHkgY2hhciAqLworCQkJCW91dHcoIGluZm8tPnhfY2hhcixpbmZvLT5pb19iYXNlICsgQ0NBUiApOworCQkJCWluZm8tPnhfY2hhciA9IDA7CisJCQl9IGVsc2UgeworCQkJCW91dHcoIGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbCsrXSxpbmZvLT5pb19iYXNlICsgQ0NBUiApOworCQkJCWluZm8tPnhtaXRfdGFpbCA9IGluZm8tPnhtaXRfdGFpbCAmIChTRVJJQUxfWE1JVF9TSVpFLTEpOworCQkJCWluZm8tPnhtaXRfY250LS07CisJCQl9CisJCQlpbmZvLT5pY291bnQudHgrKzsKKwkJfQorCX0KKworfQkvKiBlbmQgb2YgdXNjX2xvYWRfdHhmaWZvKCkgKi8KKworLyogdXNjX3Jlc2V0KCkKKyAqCisgKglSZXNldCB0aGUgYWRhcHRlciB0byBhIGtub3duIHN0YXRlIGFuZCBwcmVwYXJlIGl0IGZvciBmdXJ0aGVyIHVzZS4KKyAqCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCB1c2NfcmVzZXQoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApIHsKKwkJaW50IGk7CisJCXUzMiByZWFkdmFsOworCisJCS8qIFNldCBCSVQzMCBvZiBNaXNjIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwkJLyogKExvY2FsIENvbnRyb2wgUmVnaXN0ZXIgMHg1MCkgdG8gZm9yY2UgcmVzZXQgb2YgVVNDLiAqLworCisJCXZvbGF0aWxlIHUzMiAqTWlzY0N0cmwgPSAodTMyICopKGluZm8tPmxjcl9iYXNlICsgMHg1MCk7CisJCXUzMiAqTENSMEJSRFIgPSAodTMyICopKGluZm8tPmxjcl9iYXNlICsgMHgyOCk7CisKKwkJaW5mby0+bWlzY19jdHJsX3ZhbHVlIHw9IEJJVDMwOworCQkqTWlzY0N0cmwgPSBpbmZvLT5taXNjX2N0cmxfdmFsdWU7CisKKwkJLyoKKwkJICogRm9yY2UgYXQgbGVhc3QgMTcwbnMgZGVsYXkgYmVmb3JlIGNsZWFyaW5nIAorCQkgKiByZXNldCBiaXQuIEVhY2ggcmVhZCBmcm9tIExDUiB0YWtlcyBhdCBsZWFzdCAKKwkJICogMzBucyBzbyAxMCB0aW1lcyBmb3IgMzAwbnMgdG8gYmUgc2FmZS4KKwkJICovCisJCWZvcihpPTA7aTwxMDtpKyspCisJCQlyZWFkdmFsID0gKk1pc2NDdHJsOworCisJCWluZm8tPm1pc2NfY3RybF92YWx1ZSAmPSB+QklUMzA7CisJCSpNaXNjQ3RybCA9IGluZm8tPm1pc2NfY3RybF92YWx1ZTsKKworCQkqTENSMEJSRFIgPSBCVVNfREVTQ1JJUFRPUigKKwkJCTEsCQkvLyBXcml0ZSBTdHJvYmUgSG9sZCAoMC0zKQorCQkJMiwJCS8vIFdyaXRlIFN0cm9iZSBEZWxheSAoMC0zKQorCQkJMiwJCS8vIFJlYWQgU3Ryb2JlIERlbGF5ICAoMC0zKQorCQkJMCwJCS8vIE5XREQgKFdyaXRlIGRhdGEtZGF0YSkgKDAtMykKKwkJCTQsCQkvLyBOV0FEIChXcml0ZSBBZGRyLWRhdGEpICgwLTMxKQorCQkJMCwJCS8vIE5YREEgKFJlYWQvV3JpdGUgRGF0YS1BZGRyKSAoMC0zKQorCQkJMCwJCS8vIE5SREQgKFJlYWQgRGF0YS1EYXRhKSAoMC0zKQorCQkJNQkJLy8gTlJBRCAoUmVhZCBBZGRyLURhdGEpICgwLTMxKQorCQkJKTsKKwl9IGVsc2UgeworCQkvKiBkbyBIVyByZXNldCAqLworCQlvdXRiKCAwLGluZm8tPmlvX2Jhc2UgKyA4ICk7CisJfQorCisJaW5mby0+bWJyZV9iaXQgPSAwOworCWluZm8tPmxvb3BiYWNrX2JpdHMgPSAwOworCWluZm8tPnVzY19pZGxlX21vZGUgPSAwOworCisJLyoKKwkgKiBQcm9ncmFtIHRoZSBCdXMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoQkNSKQorCSAqCisJICogPDE1PgkJMAlEb24ndCB1c2Ugc2VwYXJhdGUgYWRkcmVzcworCSAqIDwxNC4uNj4JMAlyZXNlcnZlZAorCSAqIDw1Li40PgkwMAlJQWNrbW9kZSA9IERlZmF1bHQsIGRvbid0IGNhcmUKKwkgKiA8Mz4JCTEJQnVzIFJlcXVlc3QgVG90ZW0gUG9sZSBvdXRwdXQKKwkgKiA8Mj4JCTEJVXNlIDE2IEJpdCBkYXRhIGJ1cworCSAqIDwxPgkJMAlJUlEgVG90ZW0gUG9sZSBvdXRwdXQKKwkgKiA8MD4JCTAJRG9uJ3QgU2hpZnQgUmlnaHQgQWRkcgorCSAqCisJICogMDAwMCAwMDAwIDAwMDAgMTEwMCA9IDB4MDAwYworCSAqCisJICogQnkgd3JpdGluZyB0byBpb19iYXNlICsgU0RQSU4gdGhlIFdhaXQvQWNrIHBpbiBpcworCSAqIHByb2dyYW1tZWQgdG8gd29yayBhcyBhIFdhaXQgcGluLgorCSAqLworCQorCW91dHcoIDB4MDAwYyxpbmZvLT5pb19iYXNlICsgU0RQSU4gKTsKKworCisJb3V0dyggMCxpbmZvLT5pb19iYXNlICk7CisJb3V0dyggMCxpbmZvLT5pb19iYXNlICsgQ0NBUiApOworCisJLyogc2VsZWN0IGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlcmluZyAqLworCXVzY19SVENtZCggaW5mbywgUlRDbWRfU2VsZWN0TGl0dGxlRW5kaWFuICk7CisKKworCS8qIFBvcnQgQ29udHJvbCBSZWdpc3RlciAoUENSKQorCSAqCisJICogPDE1Li4xND4JMTEJUG9ydCA3IGlzIE91dHB1dCAofkRNQUVOLCBCaXQgMTQgOiAwID0gRW5hYmxlZCkKKwkgKiA8MTMuLjEyPgkxMQlQb3J0IDYgaXMgT3V0cHV0ICh+SU5URU4sIEJpdCAxMiA6IDAgPSBFbmFibGVkKQorCSAqIDwxMS4uMTA+IAkwMAlQb3J0IDUgaXMgSW5wdXQgKE5vIENvbm5lY3QsIERvbid0IENhcmUpCisJICogPDkuLjg+IAkwMAlQb3J0IDQgaXMgSW5wdXQgKE5vIENvbm5lY3QsIERvbid0IENhcmUpCisJICogPDcuLjY+CTExCVBvcnQgMyBpcyBPdXRwdXQgKH5SVFMsIEJpdCA2IDogMCA9IEVuYWJsZWQgKQorCSAqIDw1Li40PgkxMQlQb3J0IDIgaXMgT3V0cHV0ICh+RFRSLCBCaXQgNCA6IDAgPSBFbmFibGVkICkKKwkgKiA8My4uMj4JMDEJUG9ydCAxIGlzIElucHV0IChEZWRpY2F0ZWQgUnhDKQorCSAqIDwxLi4wPgkwMQlQb3J0IDAgaXMgSW5wdXQgKERlZGljYXRlZCBUeEMpCisJICoKKwkgKgkxMTExIDAwMDAgMTExMSAwMTAxID0gMHhmMGY1CisJICovCisKKwl1c2NfT3V0UmVnKCBpbmZvLCBQQ1IsIDB4ZjBmNSApOworCisKKwkvKgorCSAqIElucHV0L091dHB1dCBDb250cm9sIFJlZ2lzdGVyCisJICoKKwkgKiA8MTUuLjE0PgkwMAlDVFMgaXMgYWN0aXZlIGxvdyBpbnB1dAorCSAqIDwxMy4uMTI+CTAwCURDRCBpcyBhY3RpdmUgbG93IGlucHV0CisJICogPDExLi4xMD4JMDAJVHhSRVEgcGluIGlzIGlucHV0IChEU1IpCisJICogPDkuLjg+CTAwCVJ4UkVRIHBpbiBpcyBpbnB1dCAoUkkpCisJICogPDcuLjY+CTAwCVR4RCBpcyBvdXRwdXQgKFRyYW5zbWl0IERhdGEpCisJICogPDUuLjM+CTAwMAlUeEMgUGluIGluIElucHV0ICgxNC43NDU2TUh6IENsb2NrKQorCSAqIDwyLi4wPgkxMDAJUnhDIGlzIE91dHB1dCAoZHJpdmUgd2l0aCBCUkcwKQorCSAqCisJICoJMDAwMCAwMDAwIDAwMDAgMDEwMCA9IDB4MDAwNAorCSAqLworCisJdXNjX091dFJlZyggaW5mbywgSU9DUiwgMHgwMDA0ICk7CisKK30JLyogZW5kIG9mIHVzY19yZXNldCgpICovCisKKy8qIHVzY19zZXRfYXN5bmNfbW9kZSgpCisgKgorICoJUHJvZ3JhbSBhZGFwdGVyIGZvciBhc3luY2hyb25vdXMgY29tbXVuaWNhdGlvbnMuCisgKgorICogQXJndW1lbnRzOgkJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19zZXRfYXN5bmNfbW9kZSggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwl1MTYgUmVnVmFsdWU7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgd2hpbGUgcHJvZ3JhbW1pbmcgVVNDICovCisJdXNjX0Rpc2FibGVNYXN0ZXJJcnFCaXQoIGluZm8gKTsKKworCW91dHcoIDAsIGluZm8tPmlvX2Jhc2UgKTsgCQkJLyogY2xlYXIgTWFzdGVyIEJ1cyBFbmFibGUgKERDQVIpICovCisJdXNjX0RtYUNtZCggaW5mbywgRG1hQ21kX1Jlc2V0QWxsQ2hhbm5lbHMgKTsJLyogZGlzYWJsZSBib3RoIERNQSBjaGFubmVscyAqLworCisJdXNjX2xvb3BiYWNrX2ZyYW1lKCBpbmZvICk7CisKKwkvKiBDaGFubmVsIG1vZGUgUmVnaXN0ZXIgKENNUikKKwkgKgorCSAqIDwxNS4uMTQ+CTAwCVR4IFN1YiBtb2RlcywgMDAgPSAxIFN0b3AgQml0CisJICogPDEzLi4xMj4JMDAJICAgICAgICAgICAgICAwMCA9IDE2WCBDbG9jaworCSAqIDwxMS4uOD4JMDAwMAlUcmFuc21pdHRlciBtb2RlID0gQXN5bmNocm9ub3VzCisJICogPDcuLjY+CTAwCXJlc2VydmVkPworCSAqIDw1Li40PgkwMAlSeCBTdWIgbW9kZXMsIDAwID0gMTZYIENsb2NrCisJICogPDMuLjA+CTAwMDAJUmVjZWl2ZXIgbW9kZSA9IEFzeW5jaHJvbm91cworCSAqCisJICogMDAwMCAwMDAwIDAwMDAgMDAwMCA9IDB4MAorCSAqLworCisJUmVnVmFsdWUgPSAwOworCWlmICggaW5mby0+cGFyYW1zLnN0b3BfYml0cyAhPSAxICkKKwkJUmVnVmFsdWUgfD0gQklUMTQ7CisJdXNjX091dFJlZyggaW5mbywgQ01SLCBSZWdWYWx1ZSApOworCisJCisJLyogUmVjZWl2ZXIgbW9kZSBSZWdpc3RlciAoUk1SKQorCSAqCisJICogPDE1Li4xMz4JMDAwCWVuY29kaW5nID0gTm9uZQorCSAqIDwxMi4uMDg+CTAwMDAwCXJlc2VydmVkIChTeW5jIE9ubHkpCisJICogPDcuLjY+ICAgCTAwCUV2ZW4gcGFyaXR5CisJICogPDU+CQkwCXBhcml0eSBkaXNhYmxlZAorCSAqIDw0Li4yPgkwMDAJUmVjZWl2ZSBDaGFyIExlbmd0aCA9IDggYml0cworCSAqIDwxLi4wPgkwMAlEaXNhYmxlIFJlY2VpdmVyCisJICoKKwkgKiAwMDAwIDAwMDAgMDAwMCAwMDAwID0gMHgwCisJICovCisKKwlSZWdWYWx1ZSA9IDA7CisKKwlpZiAoIGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgIT0gOCApCisJCVJlZ1ZhbHVlIHw9IEJJVDQrQklUMytCSVQyOworCisJaWYgKCBpbmZvLT5wYXJhbXMucGFyaXR5ICE9IEFTWU5DX1BBUklUWV9OT05FICkgeworCQlSZWdWYWx1ZSB8PSBCSVQ1OworCQlpZiAoIGluZm8tPnBhcmFtcy5wYXJpdHkgIT0gQVNZTkNfUEFSSVRZX09ERCApCisJCQlSZWdWYWx1ZSB8PSBCSVQ2OworCX0KKworCXVzY19PdXRSZWcoIGluZm8sIFJNUiwgUmVnVmFsdWUgKTsKKworCisJLyogU2V0IElSUSB0cmlnZ2VyIGxldmVsICovCisKKwl1c2NfUkNtZCggaW5mbywgUkNtZF9TZWxlY3RSaWNySW50TGV2ZWwgKTsKKworCQorCS8qIFJlY2VpdmUgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKFJJQ1IpCisJICoKKwkgKiA8MTUuLjg+CT8JCVJ4RklGTyBJUlEgUmVxdWVzdCBMZXZlbAorCSAqCisJICogTm90ZTogRm9yIGFzeW5jIG1vZGUgdGhlIHJlY2VpdmUgRklGTyBsZXZlbCBtdXN0IGJlIHNldAorCSAqIHRvIDAgdG8gYXZpb2QgdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGUgRklGTyBjb250YWlucyBmZXdlciBieXRlcworCSAqIHRoYW4gdGhlIHRyaWdnZXIgbGV2ZWwgYW5kIG5vIG1vcmUgZGF0YSBpcyBleHBlY3RlZC4KKwkgKgorCSAqIDw3PgkJMAkJRXhpdGVkIEh1bnQgSUEgKEludGVycnVwdCBBcm0pCisJICogPDY+CQkwCQlJZGxlIFJlY2VpdmVkIElBCisJICogPDU+CQkwCQlCcmVhay9BYm9ydCBJQQorCSAqIDw0PgkJMAkJUnggQm91bmQgSUEKKwkgKiA8Mz4JCTAJCVF1ZXVlZCBzdGF0dXMgcmVmbGVjdHMgb2xkZXN0IGJ5dGUgaW4gRklGTworCSAqIDwyPgkJMAkJQWJvcnQvUEUgSUEKKwkgKiA8MT4JCTAJCVJ4IE92ZXJydW4gSUEKKwkgKiA8MD4JCTAJCVNlbGVjdCBUQzAgdmFsdWUgZm9yIHJlYWRiYWNrCisJICoKKwkgKiAwMDAwIDAwMDAgMDEwMCAwMDAwID0gMHgwMDAwICsgKEZJRk9MRVZFTCBpbiBNU0IpCisJICovCisJCisJdXNjX091dFJlZyggaW5mbywgUklDUiwgMHgwMDAwICk7CisKKwl1c2NfVW5sYXRjaFJ4c3RhdHVzQml0cyggaW5mbywgUlhTVEFUVVNfQUxMICk7CisJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoIGluZm8sIFJFQ0VJVkVfU1RBVFVTICk7CisKKwkKKwkvKiBUcmFuc21pdCBtb2RlIFJlZ2lzdGVyIChUTVIpCisJICoKKwkgKiA8MTUuLjEzPgkwMDAJZW5jb2RpbmcgPSBOb25lCisJICogPDEyLi4wOD4JMDAwMDAJcmVzZXJ2ZWQgKFN5bmMgT25seSkKKwkgKiA8Ny4uNj4JMDAJVHJhbnNtaXQgcGFyaXR5IEV2ZW4KKwkgKiA8NT4JCTAJVHJhbnNtaXQgcGFyaXR5IERpc2FibGVkCisJICogPDQuLjI+CTAwMAlUeCBDaGFyIExlbmd0aCA9IDggYml0cworCSAqIDwxLi4wPgkwMAlEaXNhYmxlIFRyYW5zbWl0dGVyCisJICoKKwkgKiAwMDAwIDAwMDAgMDAwMCAwMDAwID0gMHgwCisJICovCisKKwlSZWdWYWx1ZSA9IDA7CisKKwlpZiAoIGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgIT0gOCApCisJCVJlZ1ZhbHVlIHw9IEJJVDQrQklUMytCSVQyOworCisJaWYgKCBpbmZvLT5wYXJhbXMucGFyaXR5ICE9IEFTWU5DX1BBUklUWV9OT05FICkgeworCQlSZWdWYWx1ZSB8PSBCSVQ1OworCQlpZiAoIGluZm8tPnBhcmFtcy5wYXJpdHkgIT0gQVNZTkNfUEFSSVRZX09ERCApCisJCQlSZWdWYWx1ZSB8PSBCSVQ2OworCX0KKworCXVzY19PdXRSZWcoIGluZm8sIFRNUiwgUmVnVmFsdWUgKTsKKworCXVzY19zZXRfdHhpZGxlKCBpbmZvICk7CisKKworCS8qIFNldCBJUlEgdHJpZ2dlciBsZXZlbCAqLworCisJdXNjX1RDbWQoIGluZm8sIFRDbWRfU2VsZWN0VGljckludExldmVsICk7CisKKwkKKwkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAoVElDUikKKwkgKgorCSAqIDwxNS4uOD4JPwlUcmFuc21pdCBGSUZPIElSUSBMZXZlbAorCSAqIDw3PgkJMAlQcmVzZW50IElBIChJbnRlcnJ1cHQgQXJtKQorCSAqIDw2PgkJMQlJZGxlIFNlbnQgSUEKKwkgKiA8NT4JCTAJQWJvcnQgU2VudCBJQQorCSAqIDw0PgkJMAlFT0YvRU9NIFNlbnQgSUEKKwkgKiA8Mz4JCTAJQ1JDIFNlbnQgSUEKKwkgKiA8Mj4JCTAJMSA9IFdhaXQgZm9yIFNXIFRyaWdnZXIgdG8gU3RhcnQgRnJhbWUKKwkgKiA8MT4JCTAJVHggVW5kZXJydW4gSUEKKwkgKiA8MD4JCTAJVEMwIGNvbnN0YW50IG9uIHJlYWQgYmFjaworCSAqCisJICoJMDAwMCAwMDAwIDAxMDAgMDAwMCA9IDB4MDA0MAorCSAqLworCisJdXNjX091dFJlZyggaW5mbywgVElDUiwgMHgxZjQwICk7CisKKwl1c2NfVW5sYXRjaFR4c3RhdHVzQml0cyggaW5mbywgVFhTVEFUVVNfQUxMICk7CisJdXNjX0NsZWFySXJxUGVuZGluZ0JpdHMoIGluZm8sIFRSQU5TTUlUX1NUQVRVUyApOworCisJdXNjX2VuYWJsZV9hc3luY19jbG9jayggaW5mbywgaW5mby0+cGFyYW1zLmRhdGFfcmF0ZSApOworCisJCisJLyogQ2hhbm5lbCBDb250cm9sL3N0YXR1cyBSZWdpc3RlciAoQ0NTUikKKwkgKgorCSAqIDwxNT4JCVgJUkNDIEZJRk8gT3ZlcmZsb3cgc3RhdHVzIChSTykKKwkgKiA8MTQ+CQlYCVJDQyBGSUZPIE5vdCBFbXB0eSBzdGF0dXMgKFJPKQorCSAqIDwxMz4JCTAJMSA9IENsZWFyIFJDQyBGSUZPIChXTykKKwkgKiA8MTI+CQlYCURQTEwgaW4gU3luYyBzdGF0dXMgKFJPKQorCSAqIDwxMT4JCVgJRFBMTCAyIE1pc3NlZCBDbG9ja3Mgc3RhdHVzIChSTykKKwkgKiA8MTA+CQlYCURQTEwgMSBNaXNzZWQgQ2xvY2sgc3RhdHVzIChSTykKKwkgKiA8OS4uOD4JMDAJRFBMTCBSZXN5bmMgb24gcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzIChSVykKKwkgKiA8Nz4JCVgJU0RMQyBMb29wIE9uIHN0YXR1cyAoUk8pCisJICogPDY+CQlYCVNETEMgTG9vcCBTZW5kIHN0YXR1cyAoUk8pCisJICogPDU+CQkxCUJ5cGFzcyBjb3VudGVycyBmb3IgVHhDbGsgYW5kIFJ4Q2xrIChSVykKKwkgKiA8NC4uMj4gICAJMDAwCUxhc3QgQ2hhciBvZiBTRExDIGZyYW1lIGhhcyA4IGJpdHMgKFJXKQorCSAqIDwxLi4wPiAgIAkwMAlyZXNlcnZlZAorCSAqCisJICoJMDAwMCAwMDAwIDAwMTAgMDAwMCA9IDB4MDAyMAorCSAqLworCQorCXVzY19PdXRSZWcoIGluZm8sIENDU1IsIDB4MDAyMCApOworCisJdXNjX0Rpc2FibGVJbnRlcnJ1cHRzKCBpbmZvLCBUUkFOU01JVF9TVEFUVVMgKyBUUkFOU01JVF9EQVRBICsKKwkJCSAgICAgIFJFQ0VJVkVfREFUQSArIFJFQ0VJVkVfU1RBVFVTICk7CisKKwl1c2NfQ2xlYXJJcnFQZW5kaW5nQml0cyggaW5mbywgVFJBTlNNSVRfU1RBVFVTICsgVFJBTlNNSVRfREFUQSArCisJCQkJUkVDRUlWRV9EQVRBICsgUkVDRUlWRV9TVEFUVVMgKTsKKworCXVzY19FbmFibGVNYXN0ZXJJcnFCaXQoIGluZm8gKTsKKworCWlmIChpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX0lTQSkgeworCQkvKiBFbmFibGUgSU5URU4gKFBvcnQgNiwgQml0MTIpICovCisJCS8qIFRoaXMgY29ubmVjdHMgdGhlIElSUSByZXF1ZXN0IHNpZ25hbCB0byB0aGUgSVNBIGJ1cyAqLworCQl1c2NfT3V0UmVnKGluZm8sIFBDUiwgKHUxNikoKHVzY19JblJlZyhpbmZvLCBQQ1IpIHwgQklUMTMpICYgfkJJVDEyKSk7CisJfQorCit9CS8qIGVuZCBvZiB1c2Nfc2V0X2FzeW5jX21vZGUoKSAqLworCisvKiB1c2NfbG9vcGJhY2tfZnJhbWUoKQorICoKKyAqCUxvb3AgYmFjayBhIHNtYWxsICgyIGJ5dGUpIGR1bW15IFNETEMgZnJhbWUuCisgKglJbnRlcnJ1cHRzIGFuZCBETUEgYXJlIE5PVCB1c2VkLiBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHRvCisgKgljbGVhciBhbnkgJ3N0YWxlJyBzdGF0dXMgaW5mbyBsZWZ0IG92ZXIgZnJvbSBydW5uaW5nIGluCWFzeW5jIG1vZGUuCisgKgorICoJVGhlIDE2QzMyIHNob3dzIHRoZSBzdHJhbmdlIGJlaGF2aW91ciBvZiBtYXJraW5nIHRoZSAxc3QKKyAqCXJlY2VpdmVkIFNETEMgZnJhbWUgd2l0aCBhIENSQyBlcnJvciBldmVuIHdoZW4gdGhlcmUgaXMgbm8KKyAqCUNSQyBlcnJvci4gVG8gZ2V0IGFyb3VuZCB0aGlzIGEgc21hbGwgZHVtbXkgZnJvbSBvZiAyIGJ5dGVzCisgKglpcyBsb29wZWQgYmFjayB3aGVuIHN3aXRjaGluZyBmcm9tIGFzeW5jIHRvIHN5bmMgbW9kZS4KKyAqCisgKiBBcmd1bWVudHM6CQlpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgdXNjX2xvb3BiYWNrX2ZyYW1lKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgb2xkbW9kZSA9IGluZm8tPnBhcmFtcy5tb2RlOworCisJaW5mby0+cGFyYW1zLm1vZGUgPSBNR1NMX01PREVfSERMQzsKKwkKKwl1c2NfRGlzYWJsZU1hc3RlcklycUJpdCggaW5mbyApOworCisJdXNjX3NldF9zZGxjX21vZGUoIGluZm8gKTsKKwl1c2NfZW5hYmxlX2xvb3BiYWNrKCBpbmZvLCAxICk7CisKKwkvKiBXcml0ZSAxNi1iaXQgVGltZSBDb25zdGFudCBmb3IgQlJHMCAqLworCXVzY19PdXRSZWcoIGluZm8sIFRDMFIsIDAgKTsKKwkKKwkvKiBDaGFubmVsIENvbnRyb2wgUmVnaXN0ZXIgKENDUikKKwkgKgorCSAqIDwxNS4uMTQ+CTAwCURvbid0IHVzZSAzMi1iaXQgVHggQ29udHJvbCBCbG9ja3MgKFRDQnMpCisJICogPDEzPgkJMAlUcmlnZ2VyIFR4IG9uIFNXIENvbW1hbmQgRGlzYWJsZWQKKwkgKiA8MTI+CQkwCUZsYWcgUHJlYW1ibGUgRGlzYWJsZWQKKwkgKiA8MTEuLjEwPgkwMAlQcmVhbWJsZSBMZW5ndGggPSA4LUJpdHMKKwkgKiA8OS4uOD4JMDEJUHJlYW1ibGUgUGF0dGVybiA9IGZsYWdzCisJICogPDcuLjY+CTEwCURvbid0IHVzZSAzMi1iaXQgUnggc3RhdHVzIEJsb2NrcyAoUlNCcykKKwkgKiA8NT4JCTAJVHJpZ2dlciBSeCBvbiBTVyBDb21tYW5kIERpc2FibGVkCisJICogPDQuLjA+CTAJcmVzZXJ2ZWQKKwkgKgorCSAqCTAwMDAgMDAwMSAwMDAwIDAwMDAgPSAweDAxMDAKKwkgKi8KKworCXVzY19PdXRSZWcoIGluZm8sIENDUiwgMHgwMTAwICk7CisKKwkvKiBTRVRVUCBSRUNFSVZFUiAqLworCXVzY19SVENtZCggaW5mbywgUlRDbWRfUHVyZ2VSeEZpZm8gKTsKKwl1c2NfRW5hYmxlUmVjZWl2ZXIoaW5mbyxFTkFCTEVfVU5DT05ESVRJT05BTCk7CisKKwkvKiBTRVRVUCBUUkFOU01JVFRFUiAqLworCS8qIFByb2dyYW0gdGhlIFRyYW5zbWl0IENoYXJhY3RlciBMZW5ndGggUmVnaXN0ZXIgKFRDTFIpICovCisJLyogYW5kIGNsZWFyIEZJRk8gKFRDQyBpcyBsb2FkZWQgd2l0aCBUQ0xSIG9uIEZJRk8gY2xlYXIpICovCisJdXNjX091dFJlZyggaW5mbywgVENMUiwgMiApOworCXVzY19SVENtZCggaW5mbywgUlRDbWRfUHVyZ2VUeEZpZm8gKTsKKworCS8qIHVubGF0Y2ggVHggc3RhdHVzIGJpdHMsIGFuZCBzdGFydCB0cmFuc21pdCBjaGFubmVsLiAqLworCXVzY19VbmxhdGNoVHhzdGF0dXNCaXRzKGluZm8sVFhTVEFUVVNfQUxMKTsKKwlvdXR3KDAsaW5mby0+aW9fYmFzZSArIERBVEFSRUcpOworCisJLyogRU5BQkxFIFRSQU5TTUlUVEVSICovCisJdXNjX1RDbWQoIGluZm8sIFRDbWRfU2VuZEZyYW1lICk7CisJdXNjX0VuYWJsZVRyYW5zbWl0dGVyKGluZm8sRU5BQkxFX1VOQ09ORElUSU9OQUwpOworCQkJCQkJCQorCS8qIFdBSVQgRk9SIFJFQ0VJVkUgQ09NUExFVEUgKi8KKwlmb3IgKGk9MCA7IGk8MTAwMCA7IGkrKykKKwkJaWYgKHVzY19JblJlZyggaW5mbywgUkNTUiApICYgKEJJVDggKyBCSVQ0ICsgQklUMyArIEJJVDEpKQorCQkJYnJlYWs7CisKKwkvKiBjbGVhciBJbnRlcm5hbCBEYXRhIGxvb3BiYWNrIG1vZGUgKi8KKwl1c2NfZW5hYmxlX2xvb3BiYWNrKGluZm8sIDApOworCisJdXNjX0VuYWJsZU1hc3RlcklycUJpdChpbmZvKTsKKworCWluZm8tPnBhcmFtcy5tb2RlID0gb2xkbW9kZTsKKworfQkvKiBlbmQgb2YgdXNjX2xvb3BiYWNrX2ZyYW1lKCkgKi8KKworLyogdXNjX3NldF9zeW5jX21vZGUoKQlQcm9ncmFtcyB0aGUgVVNDIGZvciBTRExDIGNvbW11bmljYXRpb25zLgorICoKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBhZGFwdGVyIGluZm8gc3RydWN0dXJlCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgdXNjX3NldF9zeW5jX21vZGUoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdXNjX2xvb3BiYWNrX2ZyYW1lKCBpbmZvICk7CisJdXNjX3NldF9zZGxjX21vZGUoIGluZm8gKTsKKworCWlmIChpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX0lTQSkgeworCQkvKiBFbmFibGUgSU5URU4gKFBvcnQgNiwgQml0MTIpICovCisJCS8qIFRoaXMgY29ubmVjdHMgdGhlIElSUSByZXF1ZXN0IHNpZ25hbCB0byB0aGUgSVNBIGJ1cyAqLworCQl1c2NfT3V0UmVnKGluZm8sIFBDUiwgKHUxNikoKHVzY19JblJlZyhpbmZvLCBQQ1IpIHwgQklUMTMpICYgfkJJVDEyKSk7CisJfQorCisJdXNjX2VuYWJsZV9hdXhfY2xvY2soaW5mbywgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKTsKKworCWlmIChpbmZvLT5wYXJhbXMubG9vcGJhY2spCisJCXVzY19lbmFibGVfbG9vcGJhY2soaW5mbywxKTsKKworfQkvKiBlbmQgb2YgbWdzbF9zZXRfc3luY19tb2RlKCkgKi8KKworLyogdXNjX3NldF90eGlkbGUoKQlTZXQgdGhlIEhETEMgaWRsZSBtb2RlIGZvciB0aGUgdHJhbnNtaXR0ZXIuCisgKgorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgdXNjX3NldF90eGlkbGUoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdTE2IHVzY19pZGxlX21vZGUgPSBJRExFTU9ERV9GTEFHUzsKKworCS8qIE1hcCBBUEkgaWRsZSBtb2RlIHRvIFVTQyByZWdpc3RlciBiaXRzICovCisKKwlzd2l0Y2goIGluZm8tPmlkbGVfbW9kZSApeworCWNhc2UgSERMQ19UWElETEVfRkxBR1M6CQkJdXNjX2lkbGVfbW9kZSA9IElETEVNT0RFX0ZMQUdTOyBicmVhazsKKwljYXNlIEhETENfVFhJRExFX0FMVF9aRVJPU19PTkVTOgl1c2NfaWRsZV9tb2RlID0gSURMRU1PREVfQUxUX09ORV9aRVJPOyBicmVhazsKKwljYXNlIEhETENfVFhJRExFX1pFUk9TOgkJCXVzY19pZGxlX21vZGUgPSBJRExFTU9ERV9aRVJPOyBicmVhazsKKwljYXNlIEhETENfVFhJRExFX09ORVM6CQkJdXNjX2lkbGVfbW9kZSA9IElETEVNT0RFX09ORTsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9BTFRfTUFSS19TUEFDRToJdXNjX2lkbGVfbW9kZSA9IElETEVNT0RFX0FMVF9NQVJLX1NQQUNFOyBicmVhazsKKwljYXNlIEhETENfVFhJRExFX1NQQUNFOgkJCXVzY19pZGxlX21vZGUgPSBJRExFTU9ERV9TUEFDRTsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9NQVJLOgkJCXVzY19pZGxlX21vZGUgPSBJRExFTU9ERV9NQVJLOyBicmVhazsKKwl9CisKKwlpbmZvLT51c2NfaWRsZV9tb2RlID0gdXNjX2lkbGVfbW9kZTsKKwkvL3VzY19PdXRSZWcoaW5mbywgVENTUiwgdXNjX2lkbGVfbW9kZSk7CisJaW5mby0+dGNzcl92YWx1ZSAmPSB+SURMRU1PREVfTUFTSzsJLyogY2xlYXIgaWRsZSBtb2RlIGJpdHMgKi8KKwlpbmZvLT50Y3NyX3ZhbHVlICs9IHVzY19pZGxlX21vZGU7CisJdXNjX091dFJlZyhpbmZvLCBUQ1NSLCBpbmZvLT50Y3NyX3ZhbHVlKTsKKworCS8qCisJICogaWYgU3luY0xpbmsgV0FOIGFkYXB0ZXIgaXMgcnVubmluZyBpbiBleHRlcm5hbCBzeW5jIG1vZGUsIHRoZQorCSAqIHRyYW5zbWl0dGVyIGhhcyBiZWVuIHNldCB0byBNb25vc3luYyBpbiBvcmRlciB0byB0cnkgdG8gbWltaWMKKwkgKiBhIHRydWUgcmF3IG91dGJvdW5kIGJpdCBzdHJlYW0uIE1vbm9zeW5jIHN0aWxsIHNlbmRzIGFuIG9wZW4vY2xvc2UKKwkgKiBzeW5jIGNoYXIgYXQgdGhlIHN0YXJ0L2VuZCBvZiBhIGZyYW1lLiBUcnkgdG8gbWF0Y2ggdGhvc2Ugc3luYworCSAqIHBhdHRlcm5zIHRvIHRoZSBpZGxlIG1vZGUgc2V0IGhlcmUKKwkgKi8KKwlpZiAoIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9SQVcgKSB7CisJCXVuc2lnbmVkIGNoYXIgc3luY3BhdCA9IDA7CisJCXN3aXRjaCggaW5mby0+aWRsZV9tb2RlICkgeworCQljYXNlIEhETENfVFhJRExFX0ZMQUdTOgorCQkJc3luY3BhdCA9IDB4N2U7CisJCQlicmVhazsKKwkJY2FzZSBIRExDX1RYSURMRV9BTFRfWkVST1NfT05FUzoKKwkJCXN5bmNwYXQgPSAweDU1OworCQkJYnJlYWs7CisJCWNhc2UgSERMQ19UWElETEVfWkVST1M6CisJCWNhc2UgSERMQ19UWElETEVfU1BBQ0U6CisJCQlzeW5jcGF0ID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIEhETENfVFhJRExFX09ORVM6CisJCWNhc2UgSERMQ19UWElETEVfTUFSSzoKKwkJCXN5bmNwYXQgPSAweGZmOworCQkJYnJlYWs7CisJCWNhc2UgSERMQ19UWElETEVfQUxUX01BUktfU1BBQ0U6CisJCQlzeW5jcGF0ID0gMHhhYTsKKwkJCWJyZWFrOworCQl9CisKKwkJdXNjX1NldFRyYW5zbWl0U3luY0NoYXJzKGluZm8sc3luY3BhdCxzeW5jcGF0KTsKKwl9CisKK30JLyogZW5kIG9mIHVzY19zZXRfdHhpZGxlKCkgKi8KKworLyogdXNjX2dldF9zZXJpYWxfc2lnbmFscygpCisgKgorICoJUXVlcnkgdGhlIGFkYXB0ZXIgZm9yIHRoZSBzdGF0ZSBvZiB0aGUgVjI0IHN0YXR1cyAoaW5wdXQpIHNpZ25hbHMuCisgKgorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgdXNjX2dldF9zZXJpYWxfc2lnbmFscyggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwl1MTYgc3RhdHVzOworCisJLyogY2xlYXIgYWxsIHNlcmlhbCBzaWduYWxzIGV4Y2VwdCBEVFIgYW5kIFJUUyAqLworCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IFNlcmlhbFNpZ25hbF9EVFIgKyBTZXJpYWxTaWduYWxfUlRTOworCisJLyogUmVhZCB0aGUgTWlzYyBJbnRlcnJ1cHQgc3RhdHVzIFJlZ2lzdGVyIChNSVNSKSB0byBnZXQgKi8KKwkvKiB0aGUgVjI0IHN0YXR1cyBzaWduYWxzLiAqLworCisJc3RhdHVzID0gdXNjX0luUmVnKCBpbmZvLCBNSVNSICk7CisKKwkvKiBzZXQgc2VyaWFsIHNpZ25hbCBiaXRzIHRvIHJlZmxlY3QgTUlTUiAqLworCisJaWYgKCBzdGF0dXMgJiBNSVNDU1RBVFVTX0NUUyApCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9DVFM7CisKKwlpZiAoIHN0YXR1cyAmIE1JU0NTVEFUVVNfRENEICkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RDRDsKKworCWlmICggc3RhdHVzICYgTUlTQ1NUQVRVU19SSSApCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SSTsKKworCWlmICggc3RhdHVzICYgTUlTQ1NUQVRVU19EU1IgKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfRFNSOworCit9CS8qIGVuZCBvZiB1c2NfZ2V0X3NlcmlhbF9zaWduYWxzKCkgKi8KKworLyogdXNjX3NldF9zZXJpYWxfc2lnbmFscygpCisgKgorICoJU2V0IHRoZSBzdGF0ZSBvZiBEVFIgYW5kIFJUUyBiYXNlZCBvbiBjb250ZW50cyBvZgorICoJc2VyaWFsX3NpZ25hbHMgbWVtYmVyIG9mIGRldmljZSBleHRlbnNpb24uCisgKgkKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19zZXRfc2VyaWFsX3NpZ25hbHMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdTE2IENvbnRyb2w7CisJdW5zaWduZWQgY2hhciBWMjRPdXQgPSBpbmZvLT5zZXJpYWxfc2lnbmFsczsKKworCS8qIGdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgUG9ydCBDb250cm9sIFJlZ2lzdGVyIChQQ1IpICovCisKKwlDb250cm9sID0gdXNjX0luUmVnKCBpbmZvLCBQQ1IgKTsKKworCWlmICggVjI0T3V0ICYgU2VyaWFsU2lnbmFsX1JUUyApCisJCUNvbnRyb2wgJj0gfihCSVQ2KTsKKwllbHNlCisJCUNvbnRyb2wgfD0gQklUNjsKKworCWlmICggVjI0T3V0ICYgU2VyaWFsU2lnbmFsX0RUUiApCisJCUNvbnRyb2wgJj0gfihCSVQ0KTsKKwllbHNlCisJCUNvbnRyb2wgfD0gQklUNDsKKworCXVzY19PdXRSZWcoIGluZm8sIFBDUiwgQ29udHJvbCApOworCit9CS8qIGVuZCBvZiB1c2Nfc2V0X3NlcmlhbF9zaWduYWxzKCkgKi8KKworLyogdXNjX2VuYWJsZV9hc3luY19jbG9jaygpCisgKgorICoJRW5hYmxlIHRoZSBhc3luYyBjbG9jayBhdCB0aGUgc3BlY2lmaWVkIGZyZXF1ZW5jeS4KKyAqCisgKiBBcmd1bWVudHM6CQlpbmZvCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKgkJCWRhdGFfcmF0ZQlkYXRhIHJhdGUgb2YgY2xvY2sgaW4gYnBzCisgKgkJCQkJMCBkaXNhYmxlcyB0aGUgQVVYIGNsb2NrLgorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIHVzY19lbmFibGVfYXN5bmNfY2xvY2soIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgdTMyIGRhdGFfcmF0ZSApCit7CisJaWYgKCBkYXRhX3JhdGUgKQl7CisJCS8qCisJCSAqIENsb2NrIG1vZGUgQ29udHJvbCBSZWdpc3RlciAoQ01DUikKKwkJICogCisJCSAqIDwxNS4uMTQ+ICAgICAwMCAgICAgIGNvdW50ZXIgMSBEaXNhYmxlZAorCQkgKiA8MTMuLjEyPiAgICAgMDAgICAgICBjb3VudGVyIDAgRGlzYWJsZWQKKwkJICogPDExLi4xMD4gICAgIDExICAgICAgQlJHMSBJbnB1dCBpcyBUeEMgUGluCisJCSAqIDw5Li44PiAgICAgICAxMSAgICAgIEJSRzAgSW5wdXQgaXMgVHhDIFBpbgorCQkgKiA8Ny4uNj4gICAgICAgMDEgICAgICBEUExMIElucHV0IGlzIEJSRzEgT3V0cHV0CisJCSAqIDw1Li4zPiAgICAgICAxMDAgICAgIFR4Q0xLIGNvbWVzIGZyb20gQlJHMAorCQkgKiA8Mi4uMD4gICAgICAgMTAwICAgICBSeENMSyBjb21lcyBmcm9tIEJSRzAKKwkJICoKKwkJICogMDAwMCAxMTExIDAxMTAgMDEwMCA9IDB4MGY2NAorCQkgKi8KKwkJCisJCXVzY19PdXRSZWcoIGluZm8sIENNQ1IsIDB4MGY2NCApOworCisKKwkJLyoKKwkJICogV3JpdGUgMTYtYml0IFRpbWUgQ29uc3RhbnQgZm9yIEJSRzAKKwkJICogVGltZSBDb25zdGFudCA9IChDbGtTcGVlZCAvIGRhdGFfcmF0ZSkgLSAxCisJCSAqIENsa1NwZWVkID0gOTIxNjAwIChJU0EpLCA2OTEyMDAgKFBDSSkKKwkJICovCisKKwkJaWYgKCBpbmZvLT5idXNfdHlwZSA9PSBNR1NMX0JVU19UWVBFX1BDSSApCisJCQl1c2NfT3V0UmVnKCBpbmZvLCBUQzBSLCAodTE2KSgoNjkxMjAwL2RhdGFfcmF0ZSkgLSAxKSApOworCQllbHNlCisJCQl1c2NfT3V0UmVnKCBpbmZvLCBUQzBSLCAodTE2KSgoOTIxNjAwL2RhdGFfcmF0ZSkgLSAxKSApOworCisJCQorCQkvKgorCQkgKiBIYXJkd2FyZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChIQ1IpCisJCSAqIENsZWFyIEJpdCAxLCBCUkcwIG1vZGUgPSBDb250aW51b3VzCisJCSAqIFNldCBCaXQgMCB0byBlbmFibGUgQlJHMC4KKwkJICovCisKKwkJdXNjX091dFJlZyggaW5mbywgSENSLAorCQkJICAgICh1MTYpKCh1c2NfSW5SZWcoIGluZm8sIEhDUiApICYgfkJJVDEpIHwgQklUMCkgKTsKKworCisJCS8qIElucHV0L091dHB1dCBDb250cm9sIFJlZywgPDIuLjA+ID0gMTAwLCBEcml2ZSBSeEMgcGluIHdpdGggQlJHMCAqLworCisJCXVzY19PdXRSZWcoIGluZm8sIElPQ1IsCisJCQkgICAgKHUxNikoKHVzY19JblJlZyhpbmZvLCBJT0NSKSAmIDB4ZmZmOCkgfCAweDAwMDQpICk7CisJfSBlbHNlIHsKKwkJLyogZGF0YSByYXRlID09IDAgc28gdHVybiBvZmYgQlJHMCAqLworCQl1c2NfT3V0UmVnKCBpbmZvLCBIQ1IsICh1MTYpKHVzY19JblJlZyggaW5mbywgSENSICkgJiB+QklUMCkgKTsKKwl9CisKK30JLyogZW5kIG9mIHVzY19lbmFibGVfYXN5bmNfY2xvY2soKSAqLworCisvKgorICogQnVmZmVyIFN0cnVjdHVyZXM6CisgKgorICogTm9ybWFsIG1lbW9yeSBhY2Nlc3MgdXNlcyB2aXJ0dWFsIGFkZHJlc3NlcyB0aGF0IGNhbiBtYWtlIGRpc2NvbnRpZ3VvdXMKKyAqIHBoeXNpY2FsIG1lbW9yeSBwYWdlcyBhcHBlYXIgdG8gYmUgY29udGlndW91cyBpbiB0aGUgdmlydHVhbCBhZGRyZXNzCisgKiBzcGFjZSAodGhlIHByb2Nlc3NvcnMgbWVtb3J5IG1hcHBpbmcgaGFuZGxlcyB0aGUgY29udmVyc2lvbnMpLgorICoKKyAqIERNQSB0cmFuc2ZlcnMgcmVxdWlyZSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5LiBUaGlzIGlzIGJlY2F1c2UKKyAqIHRoZSBETUEgc3lzdGVtIGNvbnRyb2xsZXIgYW5kIERNQSBidXMgbWFzdGVycyBkZWFsIHdpdGggbWVtb3J5IHVzaW5nCisgKiBvbmx5IHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAqCisgKiBUaGlzIGNhdXNlcyBhIHByb2JsZW0gdW5kZXIgV2luZG93cyBOVCB3aGVuIGxhcmdlIERNQSBidWZmZXJzIGFyZQorICogbmVlZGVkLiBGcmFnbWVudGF0aW9uIG9mIHRoZSBub25wYWdlZCBwb29sIHByZXZlbnRzIGFsbG9jYXRpb25zIG9mCisgKiBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgYnVmZmVycyBsYXJnZXIgdGhhbiB0aGUgUEFHRV9TSVpFLgorICoKKyAqIEhvd2V2ZXIgdGhlIDE2QzMyIHN1cHBvcnRzIEJ1cyBNYXN0ZXIgU2NhdHRlci9HYXRoZXIgRE1BIHdoaWNoCisgKiBhbGxvd3MgRE1BIHRyYW5zZmVycyB0byBwaHlzaWNhbGx5IGRpc2NvbnRpZ3VvdXMgYnVmZmVycy4gSW5mb3JtYXRpb24KKyAqIGFib3V0IGVhY2ggZGF0YSB0cmFuc2ZlciBidWZmZXIgaXMgY29udGFpbmVkIGluIGEgbWVtb3J5IHN0cnVjdHVyZQorICogY2FsbGVkIGEgJ2J1ZmZlciBlbnRyeScuIEEgbGlzdCBvZiBidWZmZXIgZW50cmllcyBpcyBtYWludGFpbmVkCisgKiB0byB0cmFjayBhbmQgY29udHJvbCB0aGUgdXNlIG9mIHRoZSBkYXRhIHRyYW5zZmVyIGJ1ZmZlcnMuCisgKgorICogVG8gc3VwcG9ydCB0aGlzIHN0cmF0ZWd5IHdlIHdpbGwgYWxsb2NhdGUgc3VmZmljaWVudCBQQUdFX1NJWkUKKyAqIGNvbnRpZ3VvdXMgbWVtb3J5IGJ1ZmZlcnMgdG8gYWxsb3cgZm9yIHRoZSB0b3RhbCByZXF1aXJlZCBidWZmZXIKKyAqIHNwYWNlLgorICoKKyAqIFRoZSAxNkMzMiBhY2Nlc3NlcyB0aGUgbGlzdCBvZiBidWZmZXIgZW50cmllcyB1c2luZyBCdXMgTWFzdGVyCisgKiBETUEuIENvbnRyb2wgaW5mb3JtYXRpb24gaXMgcmVhZCBmcm9tIHRoZSBidWZmZXIgZW50cmllcyBieSB0aGUKKyAqIDE2QzMyIHRvIGNvbnRyb2wgZGF0YSB0cmFuc2ZlcnMuIHN0YXR1cyBpbmZvcm1hdGlvbiBpcyB3cml0dGVuIHRvCisgKiB0aGUgYnVmZmVyIGVudHJpZXMgYnkgdGhlIDE2QzMyIHRvIGluZGljYXRlIHRoZSBzdGF0dXMgb2YgY29tcGxldGVkCisgKiB0cmFuc2ZlcnMuCisgKgorICogVGhlIENQVSB3cml0ZXMgY29udHJvbCBpbmZvcm1hdGlvbiB0byB0aGUgYnVmZmVyIGVudHJpZXMgdG8gY29udHJvbAorICogdGhlIDE2QzMyIGFuZCByZWFkcyBzdGF0dXMgaW5mb3JtYXRpb24gZnJvbSB0aGUgYnVmZmVyIGVudHJpZXMgdG8KKyAqIGRldGVybWluZSBpbmZvcm1hdGlvbiBhYm91dCByZWNlaXZlZCBhbmQgdHJhbnNtaXR0ZWQgZnJhbWVzLgorICoKKyAqIEJlY2F1c2UgdGhlIENQVSBhbmQgMTZDMzIgKGFkYXB0ZXIpIGJvdGggbmVlZCBzaW11bHRhbmVvdXMgYWNjZXNzCisgKiB0byB0aGUgYnVmZmVyIGVudHJpZXMsIHRoZSBidWZmZXIgZW50cnkgbWVtb3J5IGlzIGFsbG9jYXRlZCB3aXRoCisgKiBIYWxBbGxvY2F0ZUNvbW1vbkJ1ZmZlcigpLiBUaGlzIHJlc3RyaWN0cyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgKiBlbnRyeSBsaXN0IHRvIFBBR0VfU0laRS4KKyAqCisgKiBUaGUgYWN0dWFsIGRhdGEgYnVmZmVycyBvbiB0aGUgb3RoZXIgaGFuZCB3aWxsIG9ubHkgYmUgYWNjZXNzZWQKKyAqIGJ5IHRoZSBDUFUgb3IgdGhlIGFkYXB0ZXIgYnV0IG5vdCBieSBib3RoIHNpbXVsdGFuZW91c2x5LiBUaGlzIGFsbG93cworICogU2NhdHRlci9HYXRoZXIgcGFja2V0IGJhc2VkIERNQSBwcm9jZWR1cmVzIGZvciB1c2luZyBwaHlzaWNhbGx5CisgKiBkaXNjb250aWd1b3VzIHBhZ2VzLgorICovCisKKy8qCisgKiBtZ3NsX3Jlc2V0X3R4X2RtYV9idWZmZXJzKCkKKyAqCisgKiAJU2V0IHRoZSBjb3VudCBmb3IgYWxsIHRyYW5zbWl0IGJ1ZmZlcnMgdG8gMCB0byBpbmRpY2F0ZSB0aGUKKyAqIAlidWZmZXIgaXMgYXZhaWxhYmxlIGZvciB1c2UgYW5kIHNldCB0aGUgY3VycmVudCBidWZmZXIgdG8gdGhlCisgKiAJZmlyc3QgYnVmZmVyLiBUaGlzIGVmZmVjdGl2ZWx5IG1ha2VzIGFsbCBidWZmZXJzIGZyZWUgYW5kCisgKiAJZGlzY2FyZHMgYW55IGRhdGEgaW4gYnVmZmVycy4KKyAqCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX3Jlc2V0X3R4X2RtYV9idWZmZXJzKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yICggaSA9IDA7IGkgPCBpbmZvLT50eF9idWZmZXJfY291bnQ7IGkrKyApIHsKKwkJKigodW5zaWduZWQgbG9uZyAqKSYoaW5mby0+dHhfYnVmZmVyX2xpc3RbaV0uY291bnQpKSA9IDA7CisJfQorCisJaW5mby0+Y3VycmVudF90eF9idWZmZXIgPSAwOworCWluZm8tPnN0YXJ0X3R4X2RtYV9idWZmZXIgPSAwOworCWluZm8tPnR4X2RtYV9idWZmZXJzX3VzZWQgPSAwOworCisJaW5mby0+Z2V0X3R4X2hvbGRpbmdfaW5kZXggPSAwOworCWluZm8tPnB1dF90eF9ob2xkaW5nX2luZGV4ID0gMDsKKwlpbmZvLT50eF9ob2xkaW5nX2NvdW50ID0gMDsKKworfQkvKiBlbmQgb2YgbWdzbF9yZXNldF90eF9kbWFfYnVmZmVycygpICovCisKKy8qCisgKiBudW1fZnJlZV90eF9kbWFfYnVmZmVycygpCisgKgorICogCXJldHVybnMgdGhlIG51bWJlciBvZiBmcmVlIHR4IGRtYSBidWZmZXJzIGF2YWlsYWJsZQorICoKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOgludW1iZXIgb2YgZnJlZSB0eCBkbWEgYnVmZmVycworICovCitzdGF0aWMgaW50IG51bV9mcmVlX3R4X2RtYV9idWZmZXJzKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwlyZXR1cm4gaW5mby0+dHhfYnVmZmVyX2NvdW50IC0gaW5mby0+dHhfZG1hX2J1ZmZlcnNfdXNlZDsKK30KKworLyoKKyAqIG1nc2xfcmVzZXRfcnhfZG1hX2J1ZmZlcnMoKQorICogCisgKiAJU2V0IHRoZSBjb3VudCBmb3IgYWxsIHJlY2VpdmUgYnVmZmVycyB0byBETUFCVUZGRVJTSVpFCisgKiAJYW5kIHNldCB0aGUgY3VycmVudCBidWZmZXIgdG8gdGhlIGZpcnN0IGJ1ZmZlci4gVGhpcyBlZmZlY3RpdmVseQorICogCW1ha2VzIGFsbCBidWZmZXJzIGZyZWUgYW5kIGRpc2NhcmRzIGFueSBkYXRhIGluIGJ1ZmZlcnMuCisgKiAKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfcmVzZXRfcnhfZG1hX2J1ZmZlcnMoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKCBpID0gMDsgaSA8IGluZm8tPnJ4X2J1ZmZlcl9jb3VudDsgaSsrICkgeworCQkqKCh1bnNpZ25lZCBsb25nICopJihpbmZvLT5yeF9idWZmZXJfbGlzdFtpXS5jb3VudCkpID0gRE1BQlVGRkVSU0laRTsKKy8vCQlpbmZvLT5yeF9idWZmZXJfbGlzdFtpXS5jb3VudCA9IERNQUJVRkZFUlNJWkU7CisvLwkJaW5mby0+cnhfYnVmZmVyX2xpc3RbaV0uc3RhdHVzID0gMDsKKwl9CisKKwlpbmZvLT5jdXJyZW50X3J4X2J1ZmZlciA9IDA7CisKK30JLyogZW5kIG9mIG1nc2xfcmVzZXRfcnhfZG1hX2J1ZmZlcnMoKSAqLworCisvKgorICogbWdzbF9mcmVlX3J4X2ZyYW1lX2J1ZmZlcnMoKQorICogCisgKiAJRnJlZSB0aGUgcmVjZWl2ZSBidWZmZXJzIHVzZWQgYnkgYSByZWNlaXZlZCBTRExDCisgKiAJZnJhbWUgc3VjaCB0aGF0IHRoZSBidWZmZXJzIGNhbiBiZSByZXVzZWQuCisgKiAKKyAqIEFyZ3VtZW50czoKKyAqIAorICogCWluZm8JCQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJU3RhcnRJbmRleAkJaW5kZXggb2YgMXN0IHJlY2VpdmUgYnVmZmVyIG9mIGZyYW1lCisgKiAJRW5kSW5kZXgJCWluZGV4IG9mIGxhc3QgcmVjZWl2ZSBidWZmZXIgb2YgZnJhbWUKKyAqIAorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfZnJlZV9yeF9mcmFtZV9idWZmZXJzKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sIHVuc2lnbmVkIGludCBTdGFydEluZGV4LCB1bnNpZ25lZCBpbnQgRW5kSW5kZXggKQoreworCWludCBEb25lID0gMDsKKwlETUFCVUZGRVJFTlRSWSAqcEJ1ZkVudHJ5OworCXVuc2lnbmVkIGludCBJbmRleDsKKworCS8qIFN0YXJ0aW5nIHdpdGggMXN0IGJ1ZmZlciBlbnRyeSBvZiB0aGUgZnJhbWUgY2xlYXIgdGhlIHN0YXR1cyAqLworCS8qIGZpZWxkIGFuZCBzZXQgdGhlIGNvdW50IGZpZWxkIHRvIERNQSBCdWZmZXIgU2l6ZS4gKi8KKworCUluZGV4ID0gU3RhcnRJbmRleDsKKworCXdoaWxlKCAhRG9uZSApIHsKKwkJcEJ1ZkVudHJ5ID0gJihpbmZvLT5yeF9idWZmZXJfbGlzdFtJbmRleF0pOworCisJCWlmICggSW5kZXggPT0gRW5kSW5kZXggKSB7CisJCQkvKiBUaGlzIGlzIHRoZSBsYXN0IGJ1ZmZlciBvZiB0aGUgZnJhbWUhICovCisJCQlEb25lID0gMTsKKwkJfQorCisJCS8qIHJlc2V0IGN1cnJlbnQgYnVmZmVyIGZvciByZXVzZSAqLworLy8JCXBCdWZFbnRyeS0+c3RhdHVzID0gMDsKKy8vCQlwQnVmRW50cnktPmNvdW50ID0gRE1BQlVGRkVSU0laRTsKKwkJKigodW5zaWduZWQgbG9uZyAqKSYocEJ1ZkVudHJ5LT5jb3VudCkpID0gRE1BQlVGRkVSU0laRTsKKworCQkvKiBhZHZhbmNlIHRvIG5leHQgYnVmZmVyIGVudHJ5IGluIGxpbmtlZCBsaXN0ICovCisJCUluZGV4Kys7CisJCWlmICggSW5kZXggPT0gaW5mby0+cnhfYnVmZmVyX2NvdW50ICkKKwkJCUluZGV4ID0gMDsKKwl9CisKKwkvKiBzZXQgY3VycmVudCBidWZmZXIgdG8gbmV4dCBidWZmZXIgYWZ0ZXIgbGFzdCBidWZmZXIgb2YgZnJhbWUgKi8KKwlpbmZvLT5jdXJyZW50X3J4X2J1ZmZlciA9IEluZGV4OworCit9CS8qIGVuZCBvZiBmcmVlX3J4X2ZyYW1lX2J1ZmZlcnMoKSAqLworCisvKiBtZ3NsX2dldF9yeF9mcmFtZSgpCisgKiAKKyAqIAlUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIHJldHVybiBhIHJlY2VpdmVkIFNETEMgZnJhbWUgZnJvbSB0aGUKKyAqIAlyZWNlaXZlIERNQSBidWZmZXJzLiBPbmx5IGZyYW1lcyByZWNlaXZlZCB3aXRob3V0IGVycm9ycyBhcmUgcmV0dXJuZWQuCisgKgorICogQXJndW1lbnRzOgkgCWluZm8JcG9pbnRlciB0byBkZXZpY2UgZXh0ZW5zaW9uCisgKiBSZXR1cm4gVmFsdWU6CTEgaWYgZnJhbWUgcmV0dXJuZWQsIG90aGVyd2lzZSAwCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9nZXRfcnhfZnJhbWUoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKQoreworCXVuc2lnbmVkIGludCBTdGFydEluZGV4LCBFbmRJbmRleDsJLyogaW5kZXggb2YgMXN0IGFuZCBsYXN0IGJ1ZmZlcnMgb2YgUnggZnJhbWUgKi8KKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJRE1BQlVGRkVSRU5UUlkgKnBCdWZFbnRyeTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVzaXplID0gMDsKKwlpbnQgUmV0dXJuQ29kZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworCWludCByZXR1cm5fZnJhbWUgPSAwOworCQorCS8qCisJICogY3VycmVudF9yeF9idWZmZXIgcG9pbnRzIHRvIHRoZSAxc3QgYnVmZmVyIG9mIHRoZSBuZXh0IGF2YWlsYWJsZQorCSAqIHJlY2VpdmUgZnJhbWUuIFRvIGZpbmQgdGhlIGxhc3QgYnVmZmVyIG9mIHRoZSBmcmFtZSBsb29rIGZvcgorCSAqIGEgbm9uLXplcm8gc3RhdHVzIGZpZWxkIGluIHRoZSBidWZmZXIgZW50cmllcy4gKFRoZSBzdGF0dXMKKwkgKiBmaWVsZCBpcyBzZXQgYnkgdGhlIDE2QzMyIGFmdGVyIGNvbXBsZXRpbmcgYSByZWNlaXZlIGZyYW1lLgorCSAqLworCisJU3RhcnRJbmRleCA9IEVuZEluZGV4ID0gaW5mby0+Y3VycmVudF9yeF9idWZmZXI7CisKKwl3aGlsZSggIWluZm8tPnJ4X2J1ZmZlcl9saXN0W0VuZEluZGV4XS5zdGF0dXMgKSB7CisJCS8qCisJCSAqIElmIHRoZSBjb3VudCBmaWVsZCBvZiB0aGUgYnVmZmVyIGVudHJ5IGlzIG5vbi16ZXJvIHRoZW4KKwkJICogdGhpcyBidWZmZXIgaGFzIG5vdCBiZWVuIHVzZWQuIChUaGUgMTZDMzIgY2xlYXJzIHRoZSBjb3VudAorCQkgKiBmaWVsZCB3aGVuIGl0IHN0YXJ0cyB1c2luZyB0aGUgYnVmZmVyLikgSWYgYW4gdW51c2VkIGJ1ZmZlcgorCQkgKiBpcyBlbmNvdW50ZXJlZCB0aGVuIHRoZXJlIGFyZSBubyBmcmFtZXMgYXZhaWxhYmxlLgorCQkgKi8KKworCQlpZiAoIGluZm8tPnJ4X2J1ZmZlcl9saXN0W0VuZEluZGV4XS5jb3VudCApCisJCQlnb3RvIENsZWFudXA7CisKKwkJLyogYWR2YW5jZSB0byBuZXh0IGJ1ZmZlciBlbnRyeSBpbiBsaW5rZWQgbGlzdCAqLworCQlFbmRJbmRleCsrOworCQlpZiAoIEVuZEluZGV4ID09IGluZm8tPnJ4X2J1ZmZlcl9jb3VudCApCisJCQlFbmRJbmRleCA9IDA7CisKKwkJLyogaWYgZW50aXJlIGxpc3Qgc2VhcmNoZWQgdGhlbiBubyBmcmFtZSBhdmFpbGFibGUgKi8KKwkJaWYgKCBFbmRJbmRleCA9PSBTdGFydEluZGV4ICkgeworCQkJLyogSWYgdGhpcyBvY2N1cnMgdGhlbiBzb21ldGhpbmcgYmFkIGhhcHBlbmVkLAorCQkJICogYWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuICd1c2VkJyBidXQgbm9uZSBtYXJrCisJCQkgKiB0aGUgZW5kIG9mIGEgZnJhbWUuIFJlc2V0IGJ1ZmZlcnMgYW5kIHJlY2VpdmVyLgorCQkJICovCisKKwkJCWlmICggaW5mby0+cnhfZW5hYmxlZCApeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQkJCXVzY19zdGFydF9yZWNlaXZlcihpbmZvKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQkJfQorCQkJZ290byBDbGVhbnVwOworCQl9CisJfQorCisKKwkvKiBjaGVjayBzdGF0dXMgb2YgcmVjZWl2ZSBmcmFtZSAqLworCQorCXN0YXR1cyA9IGluZm8tPnJ4X2J1ZmZlcl9saXN0W0VuZEluZGV4XS5zdGF0dXM7CisKKwlpZiAoIHN0YXR1cyAmIChSWFNUQVRVU19TSE9SVF9GUkFNRSArIFJYU1RBVFVTX09WRVJSVU4gKworCQkJUlhTVEFUVVNfQ1JDX0VSUk9SICsgUlhTVEFUVVNfQUJPUlQpICkgeworCQlpZiAoIHN0YXR1cyAmIFJYU1RBVFVTX1NIT1JUX0ZSQU1FICkKKwkJCWluZm8tPmljb3VudC5yeHNob3J0Kys7CisJCWVsc2UgaWYgKCBzdGF0dXMgJiBSWFNUQVRVU19BQk9SVCApCisJCQlpbmZvLT5pY291bnQucnhhYm9ydCsrOworCQllbHNlIGlmICggc3RhdHVzICYgUlhTVEFUVVNfT1ZFUlJVTiApCisJCQlpbmZvLT5pY291bnQucnhvdmVyKys7CisJCWVsc2UgeworCQkJaW5mby0+aWNvdW50LnJ4Y3JjKys7CisJCQlpZiAoIGluZm8tPnBhcmFtcy5jcmNfdHlwZSAmIEhETENfQ1JDX1JFVFVSTl9FWCApCisJCQkJcmV0dXJuX2ZyYW1lID0gMTsKKwkJfQorCQlmcmFtZXNpemUgPSAwOworI2lmZGVmIENPTkZJR19IRExDCisJCXsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoaW5mby0+bmV0ZGV2KTsKKwkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJfQorI2VuZGlmCisJfSBlbHNlCisJCXJldHVybl9mcmFtZSA9IDE7CisKKwlpZiAoIHJldHVybl9mcmFtZSApIHsKKwkJLyogcmVjZWl2ZSBmcmFtZSBoYXMgbm8gZXJyb3JzLCBnZXQgZnJhbWUgc2l6ZS4KKwkJICogVGhlIGZyYW1lIHNpemUgaXMgdGhlIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZSBSQ0MgKHdoaWNoIHdhcworCQkgKiBzZXQgdG8gMHhmZmZmKSBtaW51cyB0aGUgZW5kaW5nIHZhbHVlIG9mIHRoZSBSQ0MgKGRlY3JlbWVudGVkCisJCSAqIG9uY2UgZm9yIGVhY2ggcmVjZWl2ZSBjaGFyYWN0ZXIpIG1pbnVzIDIgZm9yIHRoZSAxNi1iaXQgQ1JDLgorCQkgKi8KKworCQlmcmFtZXNpemUgPSBSQ0xSVkFMVUUgLSBpbmZvLT5yeF9idWZmZXJfbGlzdFtFbmRJbmRleF0ucmNjOworCisJCS8qIGFkanVzdCBmcmFtZSBzaXplIGZvciBDUkMgaWYgYW55ICovCisJCWlmICggaW5mby0+cGFyYW1zLmNyY190eXBlID09IEhETENfQ1JDXzE2X0NDSVRUICkKKwkJCWZyYW1lc2l6ZSAtPSAyOworCQllbHNlIGlmICggaW5mby0+cGFyYW1zLmNyY190eXBlID09IEhETENfQ1JDXzMyX0NDSVRUICkKKwkJCWZyYW1lc2l6ZSAtPSA0OwkJCisJfQorCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCApCisJCXByaW50aygiJXMoJWQpOm1nc2xfZ2V0X3J4X2ZyYW1lKCVzKSBzdGF0dXM9JTA0WCBzaXplPSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsc3RhdHVzLGZyYW1lc2l6ZSk7CisJCQkKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0RBVEEgKQorCQltZ3NsX3RyYWNlX2Jsb2NrKGluZm8saW5mby0+cnhfYnVmZmVyX2xpc3RbU3RhcnRJbmRleF0udmlydF9hZGRyLAorCQkJbWluX3QoaW50LCBmcmFtZXNpemUsIERNQUJVRkZFUlNJWkUpLDApOworCQkKKwlpZiAoZnJhbWVzaXplKSB7CisJCWlmICggKCAoaW5mby0+cGFyYW1zLmNyY190eXBlICYgSERMQ19DUkNfUkVUVVJOX0VYKSAmJgorCQkJCSgoZnJhbWVzaXplKzEpID4gaW5mby0+bWF4X2ZyYW1lX3NpemUpICkgfHwKKwkJCShmcmFtZXNpemUgPiBpbmZvLT5tYXhfZnJhbWVfc2l6ZSkgKQorCQkJaW5mby0+aWNvdW50LnJ4bG9uZysrOworCQllbHNlIHsKKwkJCS8qIGNvcHkgZG1hIGJ1ZmZlcihzKSB0byBjb250aWd1b3VzIGludGVybWVkaWF0ZSBidWZmZXIgKi8KKwkJCWludCBjb3B5X2NvdW50ID0gZnJhbWVzaXplOworCQkJaW50IGluZGV4ID0gU3RhcnRJbmRleDsKKwkJCXVuc2lnbmVkIGNoYXIgKnB0bXAgPSBpbmZvLT5pbnRlcm1lZGlhdGVfcnhidWZmZXI7CisKKwkJCWlmICggIShzdGF0dXMgJiBSWFNUQVRVU19DUkNfRVJST1IpKQorCQkJaW5mby0+aWNvdW50LnJ4b2srKzsKKwkJCQorCQkJd2hpbGUoY29weV9jb3VudCkgeworCQkJCWludCBwYXJ0aWFsX2NvdW50OworCQkJCWlmICggY29weV9jb3VudCA+IERNQUJVRkZFUlNJWkUgKQorCQkJCQlwYXJ0aWFsX2NvdW50ID0gRE1BQlVGRkVSU0laRTsKKwkJCQllbHNlCisJCQkJCXBhcnRpYWxfY291bnQgPSBjb3B5X2NvdW50OworCQkJCisJCQkJcEJ1ZkVudHJ5ID0gJihpbmZvLT5yeF9idWZmZXJfbGlzdFtpbmRleF0pOworCQkJCW1lbWNweSggcHRtcCwgcEJ1ZkVudHJ5LT52aXJ0X2FkZHIsIHBhcnRpYWxfY291bnQgKTsKKwkJCQlwdG1wICs9IHBhcnRpYWxfY291bnQ7CisJCQkJY29weV9jb3VudCAtPSBwYXJ0aWFsX2NvdW50OworCQkJCQorCQkJCWlmICggKytpbmRleCA9PSBpbmZvLT5yeF9idWZmZXJfY291bnQgKQorCQkJCQlpbmRleCA9IDA7CisJCQl9CisKKwkJCWlmICggaW5mby0+cGFyYW1zLmNyY190eXBlICYgSERMQ19DUkNfUkVUVVJOX0VYICkgeworCQkJCSsrZnJhbWVzaXplOworCQkJCSpwdG1wID0gKHN0YXR1cyAmIFJYU1RBVFVTX0NSQ19FUlJPUiA/CisJCQkJCQlSWF9DUkNfRVJST1IgOgorCQkJCQkJUlhfT0spOworCisJCQkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9EQVRBICkKKwkJCQkJcHJpbnRrKCIlcyglZCk6bWdzbF9nZXRfcnhfZnJhbWUoJXMpIHJ4IGZyYW1lIHN0YXR1cz0lZFxuIiwKKwkJCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLAorCQkJCQkJKnB0bXApOworCQkJfQorCisjaWZkZWYgQ09ORklHX0hETEMKKwkJCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJCQloZGxjZGV2X3J4KGluZm8saW5mby0+aW50ZXJtZWRpYXRlX3J4YnVmZmVyLGZyYW1lc2l6ZSk7CisJCQllbHNlCisjZW5kaWYKKwkJCQlsZGlzY19yZWNlaXZlX2J1Zih0dHksIGluZm8tPmludGVybWVkaWF0ZV9yeGJ1ZmZlciwgaW5mby0+ZmxhZ19idWYsIGZyYW1lc2l6ZSk7CisJCX0KKwl9CisJLyogRnJlZSB0aGUgYnVmZmVycyB1c2VkIGJ5IHRoaXMgZnJhbWUuICovCisJbWdzbF9mcmVlX3J4X2ZyYW1lX2J1ZmZlcnMoIGluZm8sIFN0YXJ0SW5kZXgsIEVuZEluZGV4ICk7CisKKwlSZXR1cm5Db2RlID0gMTsKKworQ2xlYW51cDoKKworCWlmICggaW5mby0+cnhfZW5hYmxlZCAmJiBpbmZvLT5yeF9vdmVyZmxvdyApIHsKKwkJLyogVGhlIHJlY2VpdmVyIG5lZWRzIHRvIHJlc3RhcnRlZCBiZWNhdXNlIG9mIAorCQkgKiBhIHJlY2VpdmUgb3ZlcmZsb3cgKGJ1ZmZlciBvciBGSUZPKS4gSWYgdGhlIAorCQkgKiByZWNlaXZlIGJ1ZmZlcnMgYXJlIG5vdyBlbXB0eSwgdGhlbiByZXN0YXJ0IHJlY2VpdmVyLgorCQkgKi8KKworCQlpZiAoICFpbmZvLT5yeF9idWZmZXJfbGlzdFtFbmRJbmRleF0uc3RhdHVzICYmCisJCQlpbmZvLT5yeF9idWZmZXJfbGlzdFtFbmRJbmRleF0uY291bnQgKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCXVzY19zdGFydF9yZWNlaXZlcihpbmZvKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCX0KKwl9CisKKwlyZXR1cm4gUmV0dXJuQ29kZTsKKworfQkvKiBlbmQgb2YgbWdzbF9nZXRfcnhfZnJhbWUoKSAqLworCisvKiBtZ3NsX2dldF9yYXdfcnhfZnJhbWUoKQorICoKKyAqICAgICAJVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byByZXR1cm4gYSByZWNlaXZlZCBmcmFtZSBmcm9tIHRoZQorICoJcmVjZWl2ZSBETUEgYnVmZmVycyB3aGVuIHJ1bm5pbmcgaW4gZXh0ZXJuYWwgbG9vcCBtb2RlLiBJbiB0aGlzIG1vZGUsCisgKgl3ZSB3aWxsIHJldHVybiBhdCBtb3N0IG9uZSBETUFCVUZGRVJTSVpFIGZyYW1lIHRvIHRoZSBhcHBsaWNhdGlvbi4KKyAqCVRoZSBVU0MgcmVjZWl2ZXIgaXMgdHJpZ2dlcmluZyBvZmYgb2YgRENEIGdvaW5nIGFjdGl2ZSB0byBzdGFydCBhIG5ldworICoJZnJhbWUsIGFuZCBEQ0QgZ29pbmcgaW5hY3RpdmUgdG8gdGVybWluYXRlIHRoZSBmcmFtZSAoc2ltaWxhciB0bworICoJcHJvY2Vzc2luZyBhIGNsb3NpbmcgZmxhZyBjaGFyYWN0ZXIpLgorICoKKyAqCUluIHRoaXMgcm91dGluZSwgd2Ugd2lsbCByZXR1cm4gRE1BQlVGRkVSU0laRSAiY2h1bmtzIiBhdCBhIHRpbWUuCisgKglJZiBEQ0QgZ29lcyBpbmFjdGl2ZSwgdGhlIGxhc3QgUnggRE1BIEJ1ZmZlciB3aWxsIGhhdmUgYSBub24temVybworICogCXN0YXR1cyBmaWVsZCBhbmQgdGhlIFJDQyBmaWVsZCB3aWxsIGluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlCisgKgllbnRpcmUgcmVjZWl2ZWQgZnJhbWUuIFdlIHRha2UgdGhpcyBSQ0MgZmllbGQgYW5kIGdldCB0aGUgbW9kdWx1cworICoJb2YgUkNDIGFuZCBETUFCVUZGRVJTSVpFIHRvIGRldGVybWluZSBpZiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgKglsYXN0IFJ4IERNQSBidWZmZXIgYW5kIHJldHVybiB0aGF0IGxhc3QgcG9ydGlvbiBvZiB0aGUgZnJhbWUuCisgKgorICogQXJndW1lbnRzOgkgCWluZm8JcG9pbnRlciB0byBkZXZpY2UgZXh0ZW5zaW9uCisgKiBSZXR1cm4gVmFsdWU6CTEgaWYgZnJhbWUgcmV0dXJuZWQsIG90aGVyd2lzZSAwCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9nZXRfcmF3X3J4X2ZyYW1lKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgQ3VycmVudEluZGV4LCBOZXh0SW5kZXg7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCURNQUJVRkZFUkVOVFJZICpwQnVmRW50cnk7CisJdW5zaWduZWQgaW50IGZyYW1lc2l6ZSA9IDA7CisJaW50IFJldHVybkNvZGUgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKworCS8qCisgCSAqIGN1cnJlbnRfcnhfYnVmZmVyIHBvaW50cyB0byB0aGUgMXN0IGJ1ZmZlciBvZiB0aGUgbmV4dCBhdmFpbGFibGUKKwkgKiByZWNlaXZlIGZyYW1lLiBUaGUgc3RhdHVzIGZpZWxkIGlzIHNldCBieSB0aGUgMTZDMzIgYWZ0ZXIKKwkgKiBjb21wbGV0aW5nIGEgcmVjZWl2ZSBmcmFtZS4gSWYgdGhlIHN0YXR1cyBmaWVsZCBvZiB0aGlzIGJ1ZmZlcgorCSAqIGlzIHplcm8sIGVpdGhlciB0aGUgVVNDIGlzIHN0aWxsIGZpbGxpbmcgdGhpcyBidWZmZXIgb3IgdGhpcworCSAqIGlzIG9uZSBvZiBhIHNlcmllcyBvZiBidWZmZXJzIG1ha2luZyB1cCBhIHJlY2VpdmVkIGZyYW1lLgorCSAqCisJICogSWYgdGhlIGNvdW50IGZpZWxkIG9mIHRoaXMgYnVmZmVyIGlzIHplcm8sIHRoZSBVU0MgaXMgZWl0aGVyCisJICogdXNpbmcgdGhpcyBidWZmZXIgb3IgaGFzIHVzZWQgdGhpcyBidWZmZXIuIExvb2sgYXQgdGhlIGNvdW50CisJICogZmllbGQgb2YgdGhlIG5leHQgYnVmZmVyLiBJZiB0aGF0IG5leHQgYnVmZmVyJ3MgY291bnQgaXMKKwkgKiBub24temVybywgdGhlIFVTQyBpcyBzdGlsbCBhY3RpdmVseSB1c2luZyB0aGUgY3VycmVudCBidWZmZXIuCisJICogT3RoZXJ3aXNlLCBpZiB0aGUgbmV4dCBidWZmZXIncyBjb3VudCBmaWVsZCBpcyB6ZXJvLCB0aGUKKwkgKiBjdXJyZW50IGJ1ZmZlciBpcyBjb21wbGV0ZSBhbmQgdGhlIFVTQyBpcyB1c2luZyB0aGUgbmV4dAorCSAqIGJ1ZmZlci4KKwkgKi8KKwlDdXJyZW50SW5kZXggPSBOZXh0SW5kZXggPSBpbmZvLT5jdXJyZW50X3J4X2J1ZmZlcjsKKwkrK05leHRJbmRleDsKKwlpZiAoIE5leHRJbmRleCA9PSBpbmZvLT5yeF9idWZmZXJfY291bnQgKQorCQlOZXh0SW5kZXggPSAwOworCisJaWYgKCBpbmZvLT5yeF9idWZmZXJfbGlzdFtDdXJyZW50SW5kZXhdLnN0YXR1cyAhPSAwIHx8CisJCShpbmZvLT5yeF9idWZmZXJfbGlzdFtDdXJyZW50SW5kZXhdLmNvdW50ID09IDAgJiYKKwkJCWluZm8tPnJ4X2J1ZmZlcl9saXN0W05leHRJbmRleF0uY291bnQgPT0gMCkpIHsKKwkJLyoKKwkgCSAqIEVpdGhlciB0aGUgc3RhdHVzIGZpZWxkIG9mIHRoaXMgZG1hIGJ1ZmZlciBpcyBub24temVybworCQkgKiAoaW5kaWNhdGluZyB0aGUgbGFzdCBidWZmZXIgb2YgYSByZWNlaXZlIGZyYW1lKSBvciB0aGUgbmV4dAorCSAJICogYnVmZmVyIGlzIG1hcmtlZCBhcyBpbiB1c2UgLS0gaW1wbHlpbmcgdGhpcyBidWZmZXIgaXMgY29tcGxldGUKKwkJICogYW5kIGFuIGludGVybWVkaWF0ZSBidWZmZXIgZm9yIHRoaXMgcmVjZWl2ZWQgZnJhbWUuCisJIAkgKi8KKworCQlzdGF0dXMgPSBpbmZvLT5yeF9idWZmZXJfbGlzdFtDdXJyZW50SW5kZXhdLnN0YXR1czsKKworCQlpZiAoIHN0YXR1cyAmIChSWFNUQVRVU19TSE9SVF9GUkFNRSArIFJYU1RBVFVTX09WRVJSVU4gKworCQkJCVJYU1RBVFVTX0NSQ19FUlJPUiArIFJYU1RBVFVTX0FCT1JUKSApIHsKKwkJCWlmICggc3RhdHVzICYgUlhTVEFUVVNfU0hPUlRfRlJBTUUgKQorCQkJCWluZm8tPmljb3VudC5yeHNob3J0Kys7CisJCQllbHNlIGlmICggc3RhdHVzICYgUlhTVEFUVVNfQUJPUlQgKQorCQkJCWluZm8tPmljb3VudC5yeGFib3J0Kys7CisJCQllbHNlIGlmICggc3RhdHVzICYgUlhTVEFUVVNfT1ZFUlJVTiApCisJCQkJaW5mby0+aWNvdW50LnJ4b3ZlcisrOworCQkJZWxzZQorCQkJCWluZm8tPmljb3VudC5yeGNyYysrOworCQkJZnJhbWVzaXplID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBBIHJlY2VpdmUgZnJhbWUgaXMgYXZhaWxhYmxlLCBnZXQgZnJhbWUgc2l6ZSBhbmQgc3RhdHVzLgorCQkJICoKKwkJCSAqIFRoZSBmcmFtZSBzaXplIGlzIHRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgUkNDICh3aGljaCB3YXMKKwkJCSAqIHNldCB0byAweGZmZmYpIG1pbnVzIHRoZSBlbmRpbmcgdmFsdWUgb2YgdGhlIFJDQyAoZGVjcmVtZW50ZWQKKwkJCSAqIG9uY2UgZm9yIGVhY2ggcmVjZWl2ZSBjaGFyYWN0ZXIpIG1pbnVzIDIgb3IgNCBmb3IgdGhlIDE2LWJpdAorCQkJICogb3IgMzItYml0IENSQy4KKwkJCSAqCisJCQkgKiBJZiB0aGUgc3RhdHVzIGZpZWxkIGlzIHplcm8sIHRoaXMgaXMgYW4gaW50ZXJtZWRpYXRlIGJ1ZmZlci4KKwkJCSAqIEl0J3Mgc2l6ZSBpcyA0Sy4KKwkJCSAqCisJCQkgKiBJZiB0aGUgRE1BIEJ1ZmZlciBFbnRyeSdzIFN0YXR1cyBmaWVsZCBpcyBub24temVybywgdGhlCisJCQkgKiByZWNlaXZlIG9wZXJhdGlvbiBjb21wbGV0ZWQgbm9ybWFsbHkgKGllOiBEQ0QgZHJvcHBlZCkuIFRoZQorCQkJICogUkNDIGZpZWxkIGlzIHZhbGlkIGFuZCBob2xkcyB0aGUgcmVjZWl2ZWQgZnJhbWUgc2l6ZS4KKwkJCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIFJDQyBmaWVsZCB3aWxsIGJlIHplcm8gb24gYSBETUEgYnVmZmVyCisJCQkgKiBlbnRyeSB3aXRoIGEgbm9uLXplcm8gc3RhdHVzLiBUaGlzIGNhbiBvY2N1ciBpZiB0aGUgdG90YWwKKwkJCSAqIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBiZXR3ZWVuIHRoZSB0aW1lIERDRCBnb2VzIGFjdGl2ZQorCQkJICogdG8gdGhlIHRpbWUgRENEIGdvZXMgaW5hY3RpdmUpIGV4Y2VlZHMgNjU1MzUgYnl0ZXMuIEluIHRoaXMKKwkJCSAqIGNhc2UgdGhlIDE2QzMyIGhhcyB1bmRlcnJ1biBvbiB0aGUgUkNDIGNvdW50IGFuZCBhcHBlYXJzIHRvCisJCQkgKiBzdG9wIHVwZGF0aW5nIHRoaXMgY291bnRlciB0byBsZXQgdXMga25vdyB0aGUgYWN0dWFsIHJlY2VpdmVkCisJCQkgKiBmcmFtZSBzaXplLiBJZiB0aGlzIGhhcHBlbnMgKG5vbi16ZXJvIHN0YXR1cyBhbmQgemVybyBSQ0MpLAorCQkJICogc2ltcGx5IHJldHVybiB0aGUgZW50aXJlIFJ4RE1BIEJ1ZmZlcgorCQkJICovCisJCQlpZiAoIHN0YXR1cyApIHsKKwkJCQkvKgorCQkJCSAqIEluIHRoZSBldmVudCB0aGF0IHRoZSBmaW5hbCBSeERNQSBCdWZmZXIgaXMKKwkJCQkgKiB0ZXJtaW5hdGVkIHdpdGggYSBub24temVybyBzdGF0dXMgYW5kIHRoZSBSQ0MKKwkJCQkgKiBmaWVsZCBpcyB6ZXJvLCB3ZSBpbnRlcnByZXQgdGhpcyBhcyB0aGUgUkNDCisJCQkJICogaGF2aW5nIHVuZGVyZmxvd2VkIChyZWNlaXZlZCBmcmFtZSA+IDY1NTM1IGJ5dGVzKS4KKwkJCQkgKgorCQkJCSAqIFNpZ25hbCB0aGUgZXZlbnQgdG8gdGhlIHVzZXIgYnkgcGFzc2luZyBiYWNrCisJCQkJICogYSBzdGF0dXMgb2YgUnhTdGF0dXNfQ3JjRXJyb3IgcmV0dXJuaW5nIHRoZSBmdWxsCisJCQkJICogYnVmZmVyIGFuZCBsZXQgdGhlIGFwcCBmaWd1cmUgb3V0IHdoYXQgZGF0YSBpcworCQkJCSAqIGFjdHVhbGx5IHZhbGlkCisJCQkJICovCisJCQkJaWYgKCBpbmZvLT5yeF9idWZmZXJfbGlzdFtDdXJyZW50SW5kZXhdLnJjYyApCisJCQkJCWZyYW1lc2l6ZSA9IFJDTFJWQUxVRSAtIGluZm8tPnJ4X2J1ZmZlcl9saXN0W0N1cnJlbnRJbmRleF0ucmNjOworCQkJCWVsc2UKKwkJCQkJZnJhbWVzaXplID0gRE1BQlVGRkVSU0laRTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlmcmFtZXNpemUgPSBETUFCVUZGRVJTSVpFOworCQl9CisKKwkJaWYgKCBmcmFtZXNpemUgPiBETUFCVUZGRVJTSVpFICkgeworCQkJLyoKKwkJCSAqIGlmIHJ1bm5pbmcgaW4gcmF3IHN5bmMgbW9kZSwgSVNSIGhhbmRsZXIgZm9yCisJCQkgKiBFbmQgT2YgQnVmZmVyIGV2ZW50cyB0ZXJtaW5hdGVzIGFsbCBidWZmZXJzIGF0IDRLLgorCQkJICogSWYgdGhpcyBmcmFtZSBzaXplIGlzIHNhaWQgdG8gYmUgPjRLLCBnZXQgdGhlCisJCQkgKiBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBmcmFtZSBpbiB0aGlzIGJ1ZmZlci4KKwkJCSAqLworCQkJZnJhbWVzaXplID0gZnJhbWVzaXplICUgRE1BQlVGRkVSU0laRTsKKwkJfQorCisKKwkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCApCisJCQlwcmludGsoIiVzKCVkKTptZ3NsX2dldF9yYXdfcnhfZnJhbWUoJXMpIHN0YXR1cz0lMDRYIHNpemU9JWRcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsc3RhdHVzLGZyYW1lc2l6ZSk7CisKKwkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9EQVRBICkKKwkJCW1nc2xfdHJhY2VfYmxvY2soaW5mbyxpbmZvLT5yeF9idWZmZXJfbGlzdFtDdXJyZW50SW5kZXhdLnZpcnRfYWRkciwKKwkJCQltaW5fdChpbnQsIGZyYW1lc2l6ZSwgRE1BQlVGRkVSU0laRSksMCk7CisKKwkJaWYgKGZyYW1lc2l6ZSkgeworCQkJLyogY29weSBkbWEgYnVmZmVyKHMpIHRvIGNvbnRpZ3VvdXMgaW50ZXJtZWRpYXRlIGJ1ZmZlciAqLworCQkJLyogTk9URTogd2UgbmV2ZXIgY29weSBtb3JlIHRoYW4gRE1BQlVGRkVSU0laRSBieXRlcwkqLworCisJCQlwQnVmRW50cnkgPSAmKGluZm8tPnJ4X2J1ZmZlcl9saXN0W0N1cnJlbnRJbmRleF0pOworCQkJbWVtY3B5KCBpbmZvLT5pbnRlcm1lZGlhdGVfcnhidWZmZXIsIHBCdWZFbnRyeS0+dmlydF9hZGRyLCBmcmFtZXNpemUpOworCQkJaW5mby0+aWNvdW50LnJ4b2srKzsKKworCQkJbGRpc2NfcmVjZWl2ZV9idWYodHR5LCBpbmZvLT5pbnRlcm1lZGlhdGVfcnhidWZmZXIsIGluZm8tPmZsYWdfYnVmLCBmcmFtZXNpemUpOworCQl9CisKKwkJLyogRnJlZSB0aGUgYnVmZmVycyB1c2VkIGJ5IHRoaXMgZnJhbWUuICovCisJCW1nc2xfZnJlZV9yeF9mcmFtZV9idWZmZXJzKCBpbmZvLCBDdXJyZW50SW5kZXgsIEN1cnJlbnRJbmRleCApOworCisJCVJldHVybkNvZGUgPSAxOworCX0KKworCisJaWYgKCBpbmZvLT5yeF9lbmFibGVkICYmIGluZm8tPnJ4X292ZXJmbG93ICkgeworCQkvKiBUaGUgcmVjZWl2ZXIgbmVlZHMgdG8gcmVzdGFydGVkIGJlY2F1c2Ugb2YKKwkJICogYSByZWNlaXZlIG92ZXJmbG93IChidWZmZXIgb3IgRklGTykuIElmIHRoZQorCQkgKiByZWNlaXZlIGJ1ZmZlcnMgYXJlIG5vdyBlbXB0eSwgdGhlbiByZXN0YXJ0IHJlY2VpdmVyLgorCQkgKi8KKworCQlpZiAoICFpbmZvLT5yeF9idWZmZXJfbGlzdFtDdXJyZW50SW5kZXhdLnN0YXR1cyAmJgorCQkJaW5mby0+cnhfYnVmZmVyX2xpc3RbQ3VycmVudEluZGV4XS5jb3VudCApIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQkJdXNjX3N0YXJ0X3JlY2VpdmVyKGluZm8pOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJfQorCX0KKworCXJldHVybiBSZXR1cm5Db2RlOworCit9CS8qIGVuZCBvZiBtZ3NsX2dldF9yYXdfcnhfZnJhbWUoKSAqLworCisvKiBtZ3NsX2xvYWRfdHhfZG1hX2J1ZmZlcigpCisgKiAKKyAqIAlMb2FkIHRoZSB0cmFuc21pdCBETUEgYnVmZmVyIHdpdGggdGhlIHNwZWNpZmllZCBkYXRhLgorICogCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIAlpbmZvCQlwb2ludGVyIHRvIGRldmljZSBleHRlbnNpb24KKyAqIAlCdWZmZXIJCXBvaW50ZXIgdG8gYnVmZmVyIGNvbnRhaW5pbmcgZnJhbWUgdG8gbG9hZAorICogCUJ1ZmZlclNpemUJc2l6ZSBpbiBieXRlcyBvZiBmcmFtZSBpbiBCdWZmZXIKKyAqIAorICogUmV0dXJuIFZhbHVlOiAJTm9uZQorICovCitzdGF0aWMgdm9pZCBtZ3NsX2xvYWRfdHhfZG1hX2J1ZmZlcihzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8sCisJCWNvbnN0IGNoYXIgKkJ1ZmZlciwgdW5zaWduZWQgaW50IEJ1ZmZlclNpemUpCit7CisJdW5zaWduZWQgc2hvcnQgQ29weWNvdW50OworCXVuc2lnbmVkIGludCBpID0gMDsKKwlETUFCVUZGRVJFTlRSWSAqcEJ1ZkVudHJ5OworCQorCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfREFUQSApCisJCW1nc2xfdHJhY2VfYmxvY2soaW5mbyxCdWZmZXIsIG1pbl90KGludCwgQnVmZmVyU2l6ZSwgRE1BQlVGRkVSU0laRSksIDEpOworCisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19IRExDX0xPT1BNT0RFKSB7CisJCS8qIHNldCBDTVI6MTMgdG8gc3RhcnQgdHJhbnNtaXQgd2hlbgorCQkgKiBuZXh0IEdvQWhlYWQgKGFib3J0KSBpcyByZWNlaXZlZAorCQkgKi8KKwkgCWluZm8tPmNtcl92YWx1ZSB8PSBCSVQxMzsJCQkgIAorCX0KKwkJCisJLyogYmVnaW4gbG9hZGluZyB0aGUgZnJhbWUgaW4gdGhlIG5leHQgYXZhaWxhYmxlIHR4IGRtYQorCSAqIGJ1ZmZlciwgcmVtZW1iZXIgaXQncyBzdGFydGluZyBsb2NhdGlvbiBmb3Igc2V0dGluZworCSAqIHVwIHR4IGRtYSBvcGVyYXRpb24KKwkgKi8KKwlpID0gaW5mby0+Y3VycmVudF90eF9idWZmZXI7CisJaW5mby0+c3RhcnRfdHhfZG1hX2J1ZmZlciA9IGk7CisKKwkvKiBTZXR1cCB0aGUgc3RhdHVzIGFuZCBSQ0MgKEZyYW1lIFNpemUpIGZpZWxkcyBvZiB0aGUgMXN0ICovCisJLyogYnVmZmVyIGVudHJ5IGluIHRoZSB0cmFuc21pdCBETUEgYnVmZmVyIGxpc3QuICovCisKKwlpbmZvLT50eF9idWZmZXJfbGlzdFtpXS5zdGF0dXMgPSBpbmZvLT5jbXJfdmFsdWUgJiAweGYwMDA7CisJaW5mby0+dHhfYnVmZmVyX2xpc3RbaV0ucmNjICAgID0gQnVmZmVyU2l6ZTsKKwlpbmZvLT50eF9idWZmZXJfbGlzdFtpXS5jb3VudCAgPSBCdWZmZXJTaXplOworCisJLyogQ29weSBmcmFtZSBkYXRhIGZyb20gMXN0IHNvdXJjZSBidWZmZXIgdG8gdGhlIERNQSBidWZmZXJzLiAqLworCS8qIFRoZSBmcmFtZSBkYXRhIG1heSBzcGFuIG11bHRpcGxlIERNQSBidWZmZXJzLiAqLworCisJd2hpbGUoIEJ1ZmZlclNpemUgKXsKKwkJLyogR2V0IGEgcG9pbnRlciB0byBuZXh0IERNQSBidWZmZXIgZW50cnkuICovCisJCXBCdWZFbnRyeSA9ICZpbmZvLT50eF9idWZmZXJfbGlzdFtpKytdOworCQkJCisJCWlmICggaSA9PSBpbmZvLT50eF9idWZmZXJfY291bnQgKQorCQkJaT0wOworCisJCS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIGNvcGllZCBmcm9tICovCisJCS8qIHRoZSBzb3VyY2UgYnVmZmVyIHRvIHRoaXMgRE1BIGJ1ZmZlci4gKi8KKwkJaWYgKCBCdWZmZXJTaXplID4gRE1BQlVGRkVSU0laRSApCisJCQlDb3B5Y291bnQgPSBETUFCVUZGRVJTSVpFOworCQllbHNlCisJCQlDb3B5Y291bnQgPSBCdWZmZXJTaXplOworCisJCS8qIEFjdHVhbGx5IGNvcHkgZGF0YSBmcm9tIHNvdXJjZSBidWZmZXIgdG8gRE1BIGJ1ZmZlci4gKi8KKwkJLyogQWxzbyBzZXQgdGhlIGRhdGEgY291bnQgZm9yIHRoaXMgaW5kaXZpZHVhbCBETUEgYnVmZmVyLiAqLworCQlpZiAoIGluZm8tPmJ1c190eXBlID09IE1HU0xfQlVTX1RZUEVfUENJICkKKwkJCW1nc2xfbG9hZF9wY2lfbWVtb3J5KHBCdWZFbnRyeS0+dmlydF9hZGRyLCBCdWZmZXIsQ29weWNvdW50KTsKKwkJZWxzZQorCQkJbWVtY3B5KHBCdWZFbnRyeS0+dmlydF9hZGRyLCBCdWZmZXIsIENvcHljb3VudCk7CisKKwkJcEJ1ZkVudHJ5LT5jb3VudCA9IENvcHljb3VudDsKKworCQkvKiBBZHZhbmNlIHNvdXJjZSBwb2ludGVyIGFuZCByZWR1Y2UgcmVtYWluaW5nIGRhdGEgY291bnQuICovCisJCUJ1ZmZlciArPSBDb3B5Y291bnQ7CisJCUJ1ZmZlclNpemUgLT0gQ29weWNvdW50OworCisJCSsraW5mby0+dHhfZG1hX2J1ZmZlcnNfdXNlZDsKKwl9CisKKwkvKiByZW1lbWJlciBuZXh0IGF2YWlsYWJsZSB0eCBkbWEgYnVmZmVyICovCisJaW5mby0+Y3VycmVudF90eF9idWZmZXIgPSBpOworCit9CS8qIGVuZCBvZiBtZ3NsX2xvYWRfdHhfZG1hX2J1ZmZlcigpICovCisKKy8qCisgKiBtZ3NsX3JlZ2lzdGVyX3Rlc3QoKQorICogCisgKiAJUGVyZm9ybXMgYSByZWdpc3RlciB0ZXN0IG9mIHRoZSAxNkMzMi4KKyAqIAkKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOgkJVFJVRSBpZiB0ZXN0IHBhc3NlZCwgb3RoZXJ3aXNlIEZBTFNFCisgKi8KK3N0YXRpYyBCT09MRUFOIG1nc2xfcmVnaXN0ZXJfdGVzdCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgQml0UGF0dGVybnNbXSA9CisJCXsgMHgwMDAwLCAweGZmZmYsIDB4YWFhYSwgMHg1NTU1LCAweDEyMzQsIDB4Njk2OSwgMHg5Njk2LCAweDBmMGYgfTsKKwlzdGF0aWMgdW5zaWduZWQgaW50IFBhdHRlcm5jb3VudCA9IHNpemVvZihCaXRQYXR0ZXJucykvc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlCT09MRUFOIHJjID0gVFJVRTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJdXNjX3Jlc2V0KGluZm8pOworCisJLyogVmVyaWZ5IHRoZSByZXNldCBzdGF0ZSBvZiBzb21lIHJlZ2lzdGVycy4gKi8KKworCWlmICggKHVzY19JblJlZyggaW5mbywgU0lDUiApICE9IDApIHx8CisJCSAgKHVzY19JblJlZyggaW5mbywgSVZSICApICE9IDApIHx8CisJCSAgKHVzY19JbkRtYVJlZyggaW5mbywgRElWUiApICE9IDApICl7CisJCXJjID0gRkFMU0U7CisJfQorCisJaWYgKCByYyA9PSBUUlVFICl7CisJCS8qIFdyaXRlIGJpdCBwYXR0ZXJucyB0byB2YXJpb3VzIHJlZ2lzdGVycyBidXQgZG8gaXQgb3V0IG9mICovCisJCS8qIHN5bmMsIHRoZW4gcmVhZCBiYWNrIGFuZCB2ZXJpZnkgdmFsdWVzLiAqLworCisJCWZvciAoIGkgPSAwIDsgaSA8IFBhdHRlcm5jb3VudCA7IGkrKyApIHsKKwkJCXVzY19PdXRSZWcoIGluZm8sIFRDMFIsIEJpdFBhdHRlcm5zW2ldICk7CisJCQl1c2NfT3V0UmVnKCBpbmZvLCBUQzFSLCBCaXRQYXR0ZXJuc1soaSsxKSVQYXR0ZXJuY291bnRdICk7CisJCQl1c2NfT3V0UmVnKCBpbmZvLCBUQ0xSLCBCaXRQYXR0ZXJuc1soaSsyKSVQYXR0ZXJuY291bnRdICk7CisJCQl1c2NfT3V0UmVnKCBpbmZvLCBSQ0xSLCBCaXRQYXR0ZXJuc1soaSszKSVQYXR0ZXJuY291bnRdICk7CisJCQl1c2NfT3V0UmVnKCBpbmZvLCBSU1IsICBCaXRQYXR0ZXJuc1soaSs0KSVQYXR0ZXJuY291bnRdICk7CisJCQl1c2NfT3V0RG1hUmVnKCBpbmZvLCBUQkNSLCBCaXRQYXR0ZXJuc1soaSs1KSVQYXR0ZXJuY291bnRdICk7CisKKwkJCWlmICggKHVzY19JblJlZyggaW5mbywgVEMwUiApICE9IEJpdFBhdHRlcm5zW2ldKSB8fAorCQkJCSAgKHVzY19JblJlZyggaW5mbywgVEMxUiApICE9IEJpdFBhdHRlcm5zWyhpKzEpJVBhdHRlcm5jb3VudF0pIHx8CisJCQkJICAodXNjX0luUmVnKCBpbmZvLCBUQ0xSICkgIT0gQml0UGF0dGVybnNbKGkrMiklUGF0dGVybmNvdW50XSkgfHwKKwkJCQkgICh1c2NfSW5SZWcoIGluZm8sIFJDTFIgKSAhPSBCaXRQYXR0ZXJuc1soaSszKSVQYXR0ZXJuY291bnRdKSB8fAorCQkJCSAgKHVzY19JblJlZyggaW5mbywgUlNSICkgICE9IEJpdFBhdHRlcm5zWyhpKzQpJVBhdHRlcm5jb3VudF0pIHx8CisJCQkJICAodXNjX0luRG1hUmVnKCBpbmZvLCBUQkNSICkgIT0gQml0UGF0dGVybnNbKGkrNSklUGF0dGVybmNvdW50XSkgKXsKKwkJCQlyYyA9IEZBTFNFOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJdXNjX3Jlc2V0KGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwlyZXR1cm4gcmM7CisKK30JLyogZW5kIG9mIG1nc2xfcmVnaXN0ZXJfdGVzdCgpICovCisKKy8qIG1nc2xfaXJxX3Rlc3QoKSAJUGVyZm9ybSBpbnRlcnJ1cHQgdGVzdCBvZiB0aGUgMTZDMzIuCisgKiAKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogUmV0dXJuIFZhbHVlOglUUlVFIGlmIHRlc3QgcGFzc2VkLCBvdGhlcndpc2UgRkFMU0UKKyAqLworc3RhdGljIEJPT0xFQU4gbWdzbF9pcnFfdGVzdCggc3RydWN0IG1nc2xfc3RydWN0ICppbmZvICkKK3sKKwl1bnNpZ25lZCBsb25nIEVuZFRpbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCXVzY19yZXNldChpbmZvKTsKKworCS8qCisJICogU2V0dXAgMTZDMzIgdG8gaW50ZXJydXB0IG9uIFR4QyBwaW4gKDE0TUh6IGNsb2NrKSB0cmFuc2l0aW9uLiAKKwkgKiBUaGUgSVNSIHNldHMgaXJxX29jY3VycmVkIHRvIDEuIAorCSAqLworCisJaW5mby0+aXJxX29jY3VycmVkID0gRkFMU0U7CisKKwkvKiBFbmFibGUgSU5URU4gZ2F0ZSBmb3IgSVNBIGFkYXB0ZXIgKFBvcnQgNiwgQml0MTIpICovCisJLyogRW5hYmxlIElOVEVOIChQb3J0IDYsIEJpdDEyKSAqLworCS8qIFRoaXMgY29ubmVjdHMgdGhlIElSUSByZXF1ZXN0IHNpZ25hbCB0byB0aGUgSVNBIGJ1cyAqLworCS8qIG9uIHRoZSBJU0EgYWRhcHRlci4gVGhpcyBoYXMgbm8gZWZmZWN0IGZvciB0aGUgUENJIGFkYXB0ZXIgKi8KKwl1c2NfT3V0UmVnKCBpbmZvLCBQQ1IsICh1bnNpZ25lZCBzaG9ydCkoKHVzY19JblJlZyhpbmZvLCBQQ1IpIHwgQklUMTMpICYgfkJJVDEyKSApOworCisJdXNjX0VuYWJsZU1hc3RlcklycUJpdChpbmZvKTsKKwl1c2NfRW5hYmxlSW50ZXJydXB0cyhpbmZvLCBJT19QSU4pOworCXVzY19DbGVhcklycVBlbmRpbmdCaXRzKGluZm8sIElPX1BJTik7CisJCisJdXNjX1VubGF0Y2hJb3N0YXR1c0JpdHMoaW5mbywgTUlTQ1NUQVRVU19UWENfTEFUQ0hFRCk7CisJdXNjX0VuYWJsZVN0YXR1c0lycXMoaW5mbywgU0lDUl9UWENfQUNUSVZFICsgU0lDUl9UWENfSU5BQ1RJVkUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCUVuZFRpbWU9MTAwOworCXdoaWxlKCBFbmRUaW1lLS0gJiYgIWluZm8tPmlycV9vY2N1cnJlZCApIHsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCX0KKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwl1c2NfcmVzZXQoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkKKwlpZiAoICFpbmZvLT5pcnFfb2NjdXJyZWQgKSAKKwkJcmV0dXJuIEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIFRSVUU7CisKK30JLyogZW5kIG9mIG1nc2xfaXJxX3Rlc3QoKSAqLworCisvKiBtZ3NsX2RtYV90ZXN0KCkKKyAqIAorICogCVBlcmZvcm0gYSBETUEgdGVzdCBvZiB0aGUgMTZDMzIuIEEgc21hbGwgZnJhbWUgaXMKKyAqIAl0cmFuc21pdHRlZCB2aWEgRE1BIGZyb20gYSB0cmFuc21pdCBidWZmZXIgdG8gYSByZWNlaXZlIGJ1ZmZlcgorICogCXVzaW5nIHNpbmdsZSBidWZmZXIgRE1BIG1vZGUuCisgKiAJCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJVFJVRSBpZiB0ZXN0IHBhc3NlZCwgb3RoZXJ3aXNlIEZBTFNFCisgKi8KK3N0YXRpYyBCT09MRUFOIG1nc2xfZG1hX3Rlc3QoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCit7CisJdW5zaWduZWQgc2hvcnQgRmlmb0xldmVsOworCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyOworCXVuc2lnbmVkIGludCBGcmFtZVNpemU7CisJdW5zaWduZWQgaW50IGk7CisJY2hhciAqVG1wUHRyOworCUJPT0xFQU4gcmMgPSBUUlVFOworCXVuc2lnbmVkIHNob3J0IHN0YXR1cz0wOworCXVuc2lnbmVkIGxvbmcgRW5kVGltZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCU1HU0xfUEFSQU1TIHRtcF9wYXJhbXM7CisKKwkvKiBzYXZlIGN1cnJlbnQgcG9ydCBvcHRpb25zICovCisJbWVtY3B5KCZ0bXBfcGFyYW1zLCZpbmZvLT5wYXJhbXMsc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJLyogbG9hZCBkZWZhdWx0IHBvcnQgb3B0aW9ucyAqLworCW1lbWNweSgmaW5mby0+cGFyYW1zLCZkZWZhdWx0X3BhcmFtcyxzaXplb2YoTUdTTF9QQVJBTVMpKTsKKwkKKyNkZWZpbmUgVEVTVEZSQU1FU0laRSA0MAorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCisJLyogc2V0dXAgMTZDMzIgZm9yIFNETEMgRE1BIHRyYW5zZmVyIG1vZGUgKi8KKworCXVzY19yZXNldChpbmZvKTsKKwl1c2Nfc2V0X3NkbGNfbW9kZShpbmZvKTsKKwl1c2NfZW5hYmxlX2xvb3BiYWNrKGluZm8sMSk7CisJCisJLyogUmVwcm9ncmFtIHRoZSBSRE1SIHNvIHRoYXQgdGhlIDE2QzMyIGRvZXMgTk9UIGNsZWFyIHRoZSBjb3VudAorCSAqIGZpZWxkIG9mIHRoZSBidWZmZXIgZW50cnkgYWZ0ZXIgZmV0Y2hpbmcgYnVmZmVyIGFkZHJlc3MuIFRoaXMKKwkgKiB3YXkgd2UgY2FuIGRldGVjdCBhIERNQSBmYWlsdXJlIGZvciBhIERNQSByZWFkICh3aGljaCBzaG91bGQgYmUKKwkgKiBub24tZGVzdHJ1Y3RpdmUgdG8gc3lzdGVtIG1lbW9yeSkgYmVmb3JlIHdlIHRyeSBhbmQgd3JpdGUgdG8KKwkgKiBtZW1vcnkgKHdoZXJlIGEgZmFpbHVyZSBjb3VsZCBjb3JydXB0IHN5c3RlbSBtZW1vcnkpLgorCSAqLworCisJLyogUmVjZWl2ZSBETUEgbW9kZSBSZWdpc3RlciAoUkRNUikKKwkgKiAKKwkgKiA8MTUuLjE0PgkxMQlETUEgbW9kZSA9IExpbmtlZCBMaXN0IEJ1ZmZlciBtb2RlCisJICogPDEzPgkJMQlSU0JpbkEvTCA9IHN0b3JlIFJ4IHN0YXR1cyBCbG9jayBpbiBMaXN0IGVudHJ5CisJICogPDEyPgkJMAkxID0gQ2xlYXIgY291bnQgb2YgTGlzdCBFbnRyeSBhZnRlciBmZXRjaGluZworCSAqIDwxMS4uMTA+CTAwCUFkZHJlc3MgbW9kZSA9IEluY3JlbWVudAorCSAqIDw5PgkJMQlUZXJtaW5hdGUgQnVmZmVyIG9uIFJ4Qm91bmQKKwkgKiA8OD4JCTAJQnVzIFdpZHRoID0gMTZiaXRzCisJICogPDcuLjA+CQk/CXN0YXR1cyBCaXRzICh3cml0ZSBhcyAwcykKKwkgKiAKKwkgKiAxMTEwIDAwMTAgMDAwMCAwMDAwID0gMHhlMjAwCisJICovCisKKwl1c2NfT3V0RG1hUmVnKCBpbmZvLCBSRE1SLCAweGUyMDAgKTsKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCisKKwkvKiBTRVRVUCBUUkFOU01JVCBBTkQgUkVDRUlWRSBETUEgQlVGRkVSUyAqLworCisJRnJhbWVTaXplID0gVEVTVEZSQU1FU0laRTsKKworCS8qIHNldHVwIDFzdCB0cmFuc21pdCBidWZmZXIgZW50cnk6ICovCisJLyogd2l0aCBmcmFtZSBzaXplIGFuZCB0cmFuc21pdCBjb250cm9sIHdvcmQgKi8KKworCWluZm8tPnR4X2J1ZmZlcl9saXN0WzBdLmNvdW50ICA9IEZyYW1lU2l6ZTsKKwlpbmZvLT50eF9idWZmZXJfbGlzdFswXS5yY2MgICAgPSBGcmFtZVNpemU7CisJaW5mby0+dHhfYnVmZmVyX2xpc3RbMF0uc3RhdHVzID0gMHg0MDAwOworCisJLyogYnVpbGQgYSB0cmFuc21pdCBmcmFtZSBpbiAxc3QgdHJhbnNtaXQgRE1BIGJ1ZmZlciAqLworCisJVG1wUHRyID0gaW5mby0+dHhfYnVmZmVyX2xpc3RbMF0udmlydF9hZGRyOworCWZvciAoaSA9IDA7IGkgPCBGcmFtZVNpemU7IGkrKyApCisJCSpUbXBQdHIrKyA9IGk7CisKKwkvKiBzZXR1cCAxc3QgcmVjZWl2ZSBidWZmZXIgZW50cnk6ICovCisJLyogY2xlYXIgc3RhdHVzLCBzZXQgbWF4IHJlY2VpdmUgYnVmZmVyIHNpemUgKi8KKworCWluZm8tPnJ4X2J1ZmZlcl9saXN0WzBdLnN0YXR1cyA9IDA7CisJaW5mby0+cnhfYnVmZmVyX2xpc3RbMF0uY291bnQgPSBGcmFtZVNpemUgKyA0OworCisJLyogemVybyBvdXQgdGhlIDFzdCByZWNlaXZlIGJ1ZmZlciAqLworCisJbWVtc2V0KCBpbmZvLT5yeF9idWZmZXJfbGlzdFswXS52aXJ0X2FkZHIsIDAsIEZyYW1lU2l6ZSArIDQgKTsKKworCS8qIFNldCBjb3VudCBmaWVsZCBvZiBuZXh0IGJ1ZmZlciBlbnRyaWVzIHRvIHByZXZlbnQgKi8KKwkvKiAxNkMzMiBmcm9tIHVzaW5nIGJ1ZmZlcnMgYWZ0ZXIgdGhlIDFzdCBvbmUuICovCisKKwlpbmZvLT50eF9idWZmZXJfbGlzdFsxXS5jb3VudCA9IDA7CisJaW5mby0+cnhfYnVmZmVyX2xpc3RbMV0uY291bnQgPSAwOworCQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiBQcm9ncmFtIDE2QzMyIHJlY2VpdmVyLiAqLworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKwkvKiBzZXR1cCBETUEgdHJhbnNmZXJzICovCisJdXNjX1JUQ21kKCBpbmZvLCBSVENtZF9QdXJnZVJ4RmlmbyApOworCisJLyogcHJvZ3JhbSAxNkMzMiByZWNlaXZlciB3aXRoIHBoeXNpY2FsIGFkZHJlc3Mgb2YgMXN0IERNQSBidWZmZXIgZW50cnkgKi8KKwlwaHlzX2FkZHIgPSBpbmZvLT5yeF9idWZmZXJfbGlzdFswXS5waHlzX2VudHJ5OworCXVzY19PdXREbWFSZWcoIGluZm8sIE5SQVJMLCAodW5zaWduZWQgc2hvcnQpcGh5c19hZGRyICk7CisJdXNjX091dERtYVJlZyggaW5mbywgTlJBUlUsICh1bnNpZ25lZCBzaG9ydCkocGh5c19hZGRyID4+IDE2KSApOworCisJLyogQ2xlYXIgdGhlIFJ4IERNQSBzdGF0dXMgYml0cyAocmVhZCBSRE1SKSBhbmQgc3RhcnQgY2hhbm5lbCAqLworCXVzY19JbkRtYVJlZyggaW5mbywgUkRNUiApOworCXVzY19EbWFDbWQoIGluZm8sIERtYUNtZF9Jbml0UnhDaGFubmVsICk7CisKKwkvKiBFbmFibGUgUmVjZWl2ZXIgKFJNUiA8MS4uMD4gPSAxMCkgKi8KKwl1c2NfT3V0UmVnKCBpbmZvLCBSTVIsICh1bnNpZ25lZCBzaG9ydCkoKHVzY19JblJlZyhpbmZvLCBSTVIpICYgMHhmZmZjKSB8IDB4MDAwMikgKTsKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiBXQUlUIEZPUiBSRUNFSVZFUiBUTyBETUEgQUxMIFBBUkFNRVRFUlMgRlJPTSBCVUZGRVIgRU5UUlkgKi8KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIFdhaXQgMTAwbXMgZm9yIGludGVycnVwdC4gKi8KKwlFbmRUaW1lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKworCWZvcig7OykgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBFbmRUaW1lKSkgeworCQkJcmMgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCXN0YXR1cyA9IHVzY19JbkRtYVJlZyggaW5mbywgUkRNUiApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCisJCWlmICggIShzdGF0dXMgJiBCSVQ0KSAmJiAoc3RhdHVzICYgQklUNSkgKSB7CisJCQkvKiBJTklURyAoQklUIDQpIGlzIGluYWN0aXZlIChubyBlbnRyeSByZWFkIGluIHByb2dyZXNzKSBBTkQgKi8KKwkJCS8qIEJVU1kgIChCSVQgNSkgaXMgYWN0aXZlIChjaGFubmVsIHN0aWxsIGFjdGl2ZSkuICovCisJCQkvKiBUaGlzIG1lYW5zIHRoZSBidWZmZXIgZW50cnkgcmVhZCBoYXMgY29tcGxldGVkLiAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogUHJvZ3JhbSAxNkMzMiB0cmFuc21pdHRlci4gKi8KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCisJLyogUHJvZ3JhbSB0aGUgVHJhbnNtaXQgQ2hhcmFjdGVyIExlbmd0aCBSZWdpc3RlciAoVENMUikgKi8KKwkvKiBhbmQgY2xlYXIgRklGTyAoVENDIGlzIGxvYWRlZCB3aXRoIFRDTFIgb24gRklGTyBjbGVhcikgKi8KKworCXVzY19PdXRSZWcoIGluZm8sIFRDTFIsICh1bnNpZ25lZCBzaG9ydClpbmZvLT50eF9idWZmZXJfbGlzdFswXS5jb3VudCApOworCXVzY19SVENtZCggaW5mbywgUlRDbWRfUHVyZ2VUeEZpZm8gKTsKKworCS8qIFByb2dyYW0gdGhlIGFkZHJlc3Mgb2YgdGhlIDFzdCBETUEgQnVmZmVyIEVudHJ5IGluIGxpbmtlZCBsaXN0ICovCisKKwlwaHlzX2FkZHIgPSBpbmZvLT50eF9idWZmZXJfbGlzdFswXS5waHlzX2VudHJ5OworCXVzY19PdXREbWFSZWcoIGluZm8sIE5UQVJMLCAodW5zaWduZWQgc2hvcnQpcGh5c19hZGRyICk7CisJdXNjX091dERtYVJlZyggaW5mbywgTlRBUlUsICh1bnNpZ25lZCBzaG9ydCkocGh5c19hZGRyID4+IDE2KSApOworCisJLyogdW5sYXRjaCBUeCBzdGF0dXMgYml0cywgYW5kIHN0YXJ0IHRyYW5zbWl0IGNoYW5uZWwuICovCisKKwl1c2NfT3V0UmVnKCBpbmZvLCBUQ1NSLCAodW5zaWduZWQgc2hvcnQpKCggdXNjX0luUmVnKGluZm8sIFRDU1IpICYgMHgwZjAwKSB8IDB4ZmEpICk7CisJdXNjX0RtYUNtZCggaW5mbywgRG1hQ21kX0luaXRUeENoYW5uZWwgKTsKKworCS8qIHdhaXQgZm9yIERNQSBjb250cm9sbGVyIHRvIGZpbGwgdHJhbnNtaXQgRklGTyAqLworCisJdXNjX1RDbWQoIGluZm8sIFRDbWRfU2VsZWN0VGljclR4Rmlmb3N0YXR1cyApOworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIFdBSVQgRk9SIFRSQU5TTUlUIEZJRk8gVE8gRklMTCAqLworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQorCS8qIFdhaXQgMTAwbXMgKi8KKwlFbmRUaW1lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKworCWZvcig7OykgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBFbmRUaW1lKSkgeworCQkJcmMgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCUZpZm9MZXZlbCA9IHVzY19JblJlZyhpbmZvLCBUSUNSKSA+PiA4OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQkJCisJCWlmICggRmlmb0xldmVsIDwgMTYgKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCWlmICggRnJhbWVTaXplIDwgMzIgKSB7CisJCQkJLyogVGhpcyBmcmFtZSBpcyBzbWFsbGVyIHRoYW4gdGhlIGVudGlyZSB0cmFuc21pdCBGSUZPICovCisJCQkJLyogc28gd2FpdCBmb3IgdGhlIGVudGlyZSBmcmFtZSB0byBiZSBsb2FkZWQuICovCisJCQkJaWYgKCBGaWZvTGV2ZWwgPD0gKDMyIC0gRnJhbWVTaXplKSApCisJCQkJCWJyZWFrOworCQkJfQorCX0KKworCisJaWYgKCByYyA9PSBUUlVFICkKKwl7CisJCS8qIEVuYWJsZSAxNkMzMiB0cmFuc21pdHRlci4gKi8KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCisJCS8qIFRyYW5zbWl0IG1vZGUgUmVnaXN0ZXIgKFRNUiksIDwxLi4wPiA9IDEwLCBFbmFibGUgVHJhbnNtaXR0ZXIgKi8KKwkJdXNjX1RDbWQoIGluZm8sIFRDbWRfU2VuZEZyYW1lICk7CisJCXVzY19PdXRSZWcoIGluZm8sIFRNUiwgKHVuc2lnbmVkIHNob3J0KSgodXNjX0luUmVnKGluZm8sIFRNUikgJiAweGZmZmMpIHwgMHgwMDAyKSApOworCQkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCQkJCQkJCisJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCS8qIFdBSVQgRk9SIFRSQU5TTUlUIENPTVBMRVRFICovCisJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkJLyogV2FpdCAxMDBtcyAqLworCQlFbmRUaW1lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKworCQkvKiBXaGlsZSB0aW1lciBub3QgZXhwaXJlZCB3YWl0IGZvciB0cmFuc21pdCBjb21wbGV0ZSAqLworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCQlzdGF0dXMgPSB1c2NfSW5SZWcoIGluZm8sIFRDU1IgKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCQl3aGlsZSAoICEoc3RhdHVzICYgKEJJVDYrQklUNStCSVQ0K0JJVDIrQklUMSkpICkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgRW5kVGltZSkpIHsKKwkJCQlyYyA9IEZBTFNFOworCQkJCWJyZWFrOworCQkJfQorCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJCXN0YXR1cyA9IHVzY19JblJlZyggaW5mbywgVENTUiApOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwkJfQorCX0KKworCisJaWYgKCByYyA9PSBUUlVFICl7CisJCS8qIENIRUNLIEZPUiBUUkFOU01JVCBFUlJPUlMgKi8KKwkJaWYgKCBzdGF0dXMgJiAoQklUNSArIEJJVDEpICkgCisJCQlyYyA9IEZBTFNFOworCX0KKworCWlmICggcmMgPT0gVFJVRSApIHsKKwkJLyogV0FJVCBGT1IgUkVDRUlWRSBDT01QTEVURSAqLworCisJCS8qIFdhaXQgMTAwbXMgKi8KKwkJRW5kVGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisKKwkJLyogV2FpdCBmb3IgMTZDMzIgdG8gd3JpdGUgcmVjZWl2ZSBzdGF0dXMgdG8gYnVmZmVyIGVudHJ5LiAqLworCQlzdGF0dXM9aW5mby0+cnhfYnVmZmVyX2xpc3RbMF0uc3RhdHVzOworCQl3aGlsZSAoIHN0YXR1cyA9PSAwICkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgRW5kVGltZSkpIHsKKwkJCQlyYyA9IEZBTFNFOworCQkJCWJyZWFrOworCQkJfQorCQkJc3RhdHVzPWluZm8tPnJ4X2J1ZmZlcl9saXN0WzBdLnN0YXR1czsKKwkJfQorCX0KKworCisJaWYgKCByYyA9PSBUUlVFICkgeworCQkvKiBDSEVDSyBGT1IgUkVDRUlWRSBFUlJPUlMgKi8KKwkJc3RhdHVzID0gaW5mby0+cnhfYnVmZmVyX2xpc3RbMF0uc3RhdHVzOworCisJCWlmICggc3RhdHVzICYgKEJJVDggKyBCSVQzICsgQklUMSkgKSB7CisJCQkvKiByZWNlaXZlIGVycm9yIGhhcyBvY2N1cnJlZCAqLworCQkJcmMgPSBGQUxTRTsKKwkJfSBlbHNlIHsKKwkJCWlmICggbWVtY21wKCBpbmZvLT50eF9idWZmZXJfbGlzdFswXS52aXJ0X2FkZHIgLAorCQkJCWluZm8tPnJ4X2J1ZmZlcl9saXN0WzBdLnZpcnRfYWRkciwgRnJhbWVTaXplICkgKXsKKwkJCQlyYyA9IEZBTFNFOworCQkJfQorCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJdXNjX3Jlc2V0KCBpbmZvICk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCS8qIHJlc3RvcmUgY3VycmVudCBwb3J0IG9wdGlvbnMgKi8KKwltZW1jcHkoJmluZm8tPnBhcmFtcywmdG1wX3BhcmFtcyxzaXplb2YoTUdTTF9QQVJBTVMpKTsKKwkKKwlyZXR1cm4gcmM7CisKK30JLyogZW5kIG9mIG1nc2xfZG1hX3Rlc3QoKSAqLworCisvKiBtZ3NsX2FkYXB0ZXJfdGVzdCgpCisgKiAKKyAqIAlQZXJmb3JtIHRoZSByZWdpc3RlciwgSVJRLCBhbmQgRE1BIHRlc3RzIGZvciB0aGUgMTZDMzIuCisgKiAJCisgKiBBcmd1bWVudHM6CQlpbmZvCXBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgLUVOT0RFVgorICovCitzdGF0aWMgaW50IG1nc2xfYWRhcHRlcl90ZXN0KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50ayggIiVzKCVkKTpUZXN0aW5nIGRldmljZSAlc1xuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lICk7CisJCQkKKwlpZiAoICFtZ3NsX3JlZ2lzdGVyX3Rlc3QoIGluZm8gKSApIHsKKwkJaW5mby0+aW5pdF9lcnJvciA9IERpYWdTdGF0dXNfQWRkcmVzc0ZhaWx1cmU7CisJCXByaW50ayggIiVzKCVkKTpSZWdpc3RlciB0ZXN0IGZhaWx1cmUgZm9yIGRldmljZSAlcyBBZGRyPSUwNFhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgKHVuc2lnbmVkIHNob3J0KShpbmZvLT5pb19iYXNlKSApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoICFtZ3NsX2lycV90ZXN0KCBpbmZvICkgKSB7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0lycUZhaWx1cmU7CisJCXByaW50ayggIiVzKCVkKTpJbnRlcnJ1cHQgdGVzdCBmYWlsdXJlIGZvciBkZXZpY2UgJXMgSVJRPSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsICh1bnNpZ25lZCBzaG9ydCkoaW5mby0+aXJxX2xldmVsKSApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoICFtZ3NsX2RtYV90ZXN0KCBpbmZvICkgKSB7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0RtYUZhaWx1cmU7CisJCXByaW50ayggIiVzKCVkKTpETUEgdGVzdCBmYWlsdXJlIGZvciBkZXZpY2UgJXMgRE1BPSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsICh1bnNpZ25lZCBzaG9ydCkoaW5mby0+ZG1hX2xldmVsKSApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoICIlcyglZCk6ZGV2aWNlICVzIHBhc3NlZCBkaWFnbm9zdGljc1xuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lICk7CisJCQkKKwlyZXR1cm4gMDsKKworfQkvKiBlbmQgb2YgbWdzbF9hZGFwdGVyX3Rlc3QoKSAqLworCisvKiBtZ3NsX21lbW9yeV90ZXN0KCkKKyAqIAorICogCVRlc3QgdGhlIHNoYXJlZCBtZW1vcnkgb24gYSBQQ0kgYWRhcHRlci4KKyAqIAorICogQXJndW1lbnRzOgkJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CVRSVUUgaWYgdGVzdCBwYXNzZWQsIG90aGVyd2lzZSBGQUxTRQorICovCitzdGF0aWMgQk9PTEVBTiBtZ3NsX21lbW9yeV90ZXN0KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gKQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIEJpdFBhdHRlcm5zW10gPSB7IDB4MCwgMHg1NTU1NTU1NSwgMHhhYWFhYWFhYSwKKwkJCQkJCQkJCQkJMHg2NjY2NjY2NiwgMHg5OTk5OTk5OSwgMHhmZmZmZmZmZiwgMHgxMjM0NTY3OCB9OworCXVuc2lnbmVkIGxvbmcgUGF0dGVybmNvdW50ID0gc2l6ZW9mKEJpdFBhdHRlcm5zKS9zaXplb2YodW5zaWduZWQgbG9uZyk7CisJdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgVGVzdExpbWl0ID0gU0hBUkVEX01FTV9BRERSRVNTX1NJWkUvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCXVuc2lnbmVkIGxvbmcgKiBUZXN0QWRkcjsKKworCWlmICggaW5mby0+YnVzX3R5cGUgIT0gTUdTTF9CVVNfVFlQRV9QQ0kgKQorCQlyZXR1cm4gVFJVRTsKKworCVRlc3RBZGRyID0gKHVuc2lnbmVkIGxvbmcgKilpbmZvLT5tZW1vcnlfYmFzZTsKKworCS8qIFRlc3QgZGF0YSBsaW5lcyB3aXRoIHRlc3QgcGF0dGVybiBhdCBvbmUgbG9jYXRpb24uICovCisKKwlmb3IgKCBpID0gMCA7IGkgPCBQYXR0ZXJuY291bnQgOyBpKysgKSB7CisJCSpUZXN0QWRkciA9IEJpdFBhdHRlcm5zW2ldOworCQlpZiAoICpUZXN0QWRkciAhPSBCaXRQYXR0ZXJuc1tpXSApCisJCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLyogVGVzdCBhZGRyZXNzIGxpbmVzIHdpdGggaW5jcmVtZW50aW5nIHBhdHRlcm4gb3ZlciAqLworCS8qIGVudGlyZSBhZGRyZXNzIHJhbmdlLiAqLworCisJZm9yICggaSA9IDAgOyBpIDwgVGVzdExpbWl0IDsgaSsrICkgeworCQkqVGVzdEFkZHIgPSBpICogNDsKKwkJVGVzdEFkZHIrKzsKKwl9CisKKwlUZXN0QWRkciA9ICh1bnNpZ25lZCBsb25nICopaW5mby0+bWVtb3J5X2Jhc2U7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBUZXN0TGltaXQgOyBpKysgKSB7CisJCWlmICggKlRlc3RBZGRyICE9IGkgKiA0ICkKKwkJCXJldHVybiBGQUxTRTsKKwkJVGVzdEFkZHIrKzsKKwl9CisKKwltZW1zZXQoIGluZm8tPm1lbW9yeV9iYXNlLCAwLCBTSEFSRURfTUVNX0FERFJFU1NfU0laRSApOworCisJcmV0dXJuIFRSVUU7CisKK30JLyogRW5kIE9mIG1nc2xfbWVtb3J5X3Rlc3QoKSAqLworCisKKy8qIG1nc2xfbG9hZF9wY2lfbWVtb3J5KCkKKyAqIAorICogCUxvYWQgYSBsYXJnZSBibG9jayBvZiBkYXRhIGludG8gdGhlIFBDSSBzaGFyZWQgbWVtb3J5LgorICogCVVzZSB0aGlzIGluc3RlYWQgb2YgbWVtY3B5KCkgb3IgbWVtbW92ZSgpIHRvIG1vdmUgZGF0YQorICogCWludG8gdGhlIFBDSSBzaGFyZWQgbWVtb3J5LgorICogCisgKiBOb3RlczoKKyAqIAorICogCVRoaXMgZnVuY3Rpb24gcHJldmVudHMgdGhlIFBDSTkwNTAgaW50ZXJmYWNlIGNoaXAgZnJvbSBob2dnaW5nCisgKiAJdGhlIGFkYXB0ZXIgbG9jYWwgYnVzLCB3aGljaCBjYW4gc3RhcnZlIHRoZSAxNkMzMiBieSBwcmV2ZW50aW5nCisgKiAJMTZDMzIgYnVzIG1hc3RlciBjeWNsZXMuCisgKiAKKyAqIAlUaGUgUENJOTA1MCBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCB0aGUgOTA1MCB3aWxsIGFsd2F5cyByZWxlYXNlCisgKiAJY29udHJvbCBvZiB0aGUgbG9jYWwgYnVzIGFmdGVyIGNvbXBsZXRpbmcgdGhlIGN1cnJlbnQgcmVhZAorICogCW9yIHdyaXRlIG9wZXJhdGlvbi4KKyAqIAorICogCUl0IGFwcGVhcnMgdGhhdCBhcyBsb25nIGFzIHRoZSBQQ0k5MDUwIHdyaXRlIEZJRk8gaXMgZnVsbCwgdGhlCisgKiAJUENJOTA1MCB0cmVhdHMgYWxsIG9mIHRoZSB3cml0ZXMgYXMgYSBzaW5nbGUgYnVyc3QgdHJhbnNhY3Rpb24KKyAqIAlhbmQgd2lsbCBub3QgcmVsZWFzZSB0aGUgYnVzLiBUaGlzIGNhdXNlcyBETUEgbGF0ZW5jeSBwcm9ibGVtcworICogCWF0IGhpZ2ggc3BlZWRzIHdoZW4gY29weWluZyBsYXJnZSBkYXRhIGJsb2NrcyB0byB0aGUgc2hhcmVkCisgKiAJbWVtb3J5LgorICogCisgKiAJVGhpcyBmdW5jdGlvbiBpbiBlZmZlY3QsIGJyZWFrcyB0aGUgYSBsYXJnZSBzaGFyZWQgbWVtb3J5IHdyaXRlCisgKiAJaW50byBtdWx0aXBsZSB0cmFuc2F0aW9ucyBieSBpbnRlcmxlYXZpbmcgYSBzaGFyZWQgbWVtb3J5IHJlYWQKKyAqIAl3aGljaCB3aWxsIGZsdXNoIHRoZSB3cml0ZSBGSUZPIGFuZCAnY29tcGxldGUnIHRoZSB3cml0ZQorICogCXRyYW5zYXRpb24uIFRoaXMgYWxsb3dzIGFueSBwZW5kaW5nIERNQSByZXF1ZXN0IHRvIGdhaW4gY29udHJvbAorICogCW9mIHRoZSBsb2NhbCBidXMgaW4gYSB0aW1lbHkgZmFzaW9uLgorICogCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIAlUYXJnZXRQdHIJcG9pbnRlciB0byB0YXJnZXQgYWRkcmVzcyBpbiBQQ0kgc2hhcmVkIG1lbW9yeQorICogCVNvdXJjZVB0cglwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIgZm9yIGRhdGEKKyAqIAljb3VudAkJY291bnQgaW4gYnl0ZXMgb2YgZGF0YSB0byBjb3B5CisgKgorICogUmV0dXJuIFZhbHVlOglOb25lCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xfbG9hZF9wY2lfbWVtb3J5KCBjaGFyKiBUYXJnZXRQdHIsIGNvbnN0IGNoYXIqIFNvdXJjZVB0ciwKKwl1bnNpZ25lZCBzaG9ydCBjb3VudCApCit7CisJLyogMTYgMzItYml0IHdyaXRlcyBAIDYwbnMgZWFjaCA9IDk2MG5zIG1heCBsYXRlbmN5IG9uIGxvY2FsIGJ1cyAqLworI2RlZmluZSBQQ0lfTE9BRF9JTlRFUlZBTCA2NAorCisJdW5zaWduZWQgc2hvcnQgSW50ZXJ2YWxjb3VudCA9IGNvdW50IC8gUENJX0xPQURfSU5URVJWQUw7CisJdW5zaWduZWQgc2hvcnQgSW5kZXg7CisJdW5zaWduZWQgbG9uZyBEdW1teTsKKworCWZvciAoIEluZGV4ID0gMCA7IEluZGV4IDwgSW50ZXJ2YWxjb3VudCA7IEluZGV4KysgKQorCXsKKwkJbWVtY3B5KFRhcmdldFB0ciwgU291cmNlUHRyLCBQQ0lfTE9BRF9JTlRFUlZBTCk7CisJCUR1bW15ID0gKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKVRhcmdldFB0cik7CisJCVRhcmdldFB0ciArPSBQQ0lfTE9BRF9JTlRFUlZBTDsKKwkJU291cmNlUHRyICs9IFBDSV9MT0FEX0lOVEVSVkFMOworCX0KKworCW1lbWNweSggVGFyZ2V0UHRyLCBTb3VyY2VQdHIsIGNvdW50ICUgUENJX0xPQURfSU5URVJWQUwgKTsKKworfQkvKiBFbmQgT2YgbWdzbF9sb2FkX3BjaV9tZW1vcnkoKSAqLworCitzdGF0aWMgdm9pZCBtZ3NsX3RyYWNlX2Jsb2NrKHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyxjb25zdCBjaGFyKiBkYXRhLCBpbnQgY291bnQsIGludCB4bWl0KQoreworCWludCBpOworCWludCBsaW5lY291bnQ7CisJaWYgKHhtaXQpCisJCXByaW50aygiJXMgdHggZGF0YTpcbiIsaW5mby0+ZGV2aWNlX25hbWUpOworCWVsc2UKKwkJcHJpbnRrKCIlcyByeCBkYXRhOlxuIixpbmZvLT5kZXZpY2VfbmFtZSk7CisJCQorCXdoaWxlKGNvdW50KSB7CisJCWlmIChjb3VudCA+IDE2KQorCQkJbGluZWNvdW50ID0gMTY7CisJCWVsc2UKKwkJCWxpbmVjb3VudCA9IGNvdW50OworCQkJCisJCWZvcihpPTA7aTxsaW5lY291bnQ7aSsrKQorCQkJcHJpbnRrKCIlMDJYICIsKHVuc2lnbmVkIGNoYXIpZGF0YVtpXSk7CisJCWZvcig7aTwxNztpKyspCisJCQlwcmludGsoIiAgICIpOworCQlmb3IoaT0wO2k8bGluZWNvdW50O2krKykgeworCQkJaWYgKGRhdGFbaV0+PTA0MCAmJiBkYXRhW2ldPD0wMTc2KQorCQkJCXByaW50aygiJWMiLGRhdGFbaV0pOworCQkJZWxzZQorCQkJCXByaW50aygiLiIpOworCQl9CisJCXByaW50aygiXG4iKTsKKwkJCisJCWRhdGEgICs9IGxpbmVjb3VudDsKKwkJY291bnQgLT0gbGluZWNvdW50OworCX0KK30JLyogZW5kIG9mIG1nc2xfdHJhY2VfYmxvY2soKSAqLworCisvKiBtZ3NsX3R4X3RpbWVvdXQoKQorICogCisgKiAJY2FsbGVkIHdoZW4gSERMQyBmcmFtZSB0aW1lcyBvdXQKKyAqIAl1cGRhdGUgc3RhdHMgYW5kIGRvIHR4IGNvbXBsZXRpb24gcHJvY2Vzc2luZworICogCQorICogQXJndW1lbnRzOgljb250ZXh0CQlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBSZXR1cm4gVmFsdWU6CU5vbmUKKyAqLworc3RhdGljIHZvaWQgbWdzbF90eF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0Kiljb250ZXh0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfdHhfdGltZW91dCglcylcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJaWYoaW5mby0+dHhfYWN0aXZlICYmCisJICAgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDIHx8CisJICAgIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9SQVcpICkgeworCQlpbmZvLT5pY291bnQudHh0aW1lb3V0Kys7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCWluZm8tPnR4X2FjdGl2ZSA9IDA7CisJaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOworCisJaWYgKCBpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfSERMQ19MT09QTU9ERSApCisJCXVzY19sb29wbW9kZV9jYW5jZWxfdHJhbnNtaXQoIGluZm8gKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJCisjaWZkZWYgQ09ORklHX0hETEMKKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCWhkbGNkZXZfdHhfZG9uZShpbmZvKTsKKwllbHNlCisjZW5kaWYKKwkJbWdzbF9iaF90cmFuc21pdChpbmZvKTsKKwkKK30JLyogZW5kIG9mIG1nc2xfdHhfdGltZW91dCgpICovCisKKy8qIHNpZ25hbCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIGZyYW1lcyB0byBzZW5kLCBzbyB0aGF0CisgKiBsaW5lIGlzICdyZWxlYXNlZCcgYnkgZWNob2luZyBSeEQgdG8gVHhEIHdoZW4gY3VycmVudAorICogdHJhbnNtaXNzaW9uIGlzIGNvbXBsZXRlIChvciBpbW1lZGlhdGVseSBpZiBubyB0eCBpbiBwcm9ncmVzcykuCisgKi8KK3N0YXRpYyBpbnQgbWdzbF9sb29wbW9kZV9zZW5kX2RvbmUoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8gKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19IRExDX0xPT1BNT0RFKSB7CisJCWlmIChpbmZvLT50eF9hY3RpdmUpCisJCQlpbmZvLT5sb29wbW9kZV9zZW5kX2RvbmVfcmVxdWVzdGVkID0gVFJVRTsKKwkJZWxzZQorCQkJdXNjX2xvb3Btb2RlX3NlbmRfZG9uZShpbmZvKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKiByZWxlYXNlIHRoZSBsaW5lIGJ5IGVjaG9pbmcgUnhEIHRvIFR4RAorICogdXBvbiBjb21wbGV0aW9uIG9mIGEgdHJhbnNtaXQgZnJhbWUKKyAqLworc3RhdGljIHZvaWQgdXNjX2xvb3Btb2RlX3NlbmRfZG9uZSggc3RydWN0IG1nc2xfc3RydWN0ICogaW5mbyApCit7CisgCWluZm8tPmxvb3Btb2RlX3NlbmRfZG9uZV9yZXF1ZXN0ZWQgPSBGQUxTRTsKKyAJLyogY2xlYXIgQ01SOjEzIHRvIDAgdG8gc3RhcnQgZWNob2luZyBSeERhdGEgdG8gVHhEYXRhICovCisgCWluZm8tPmNtcl92YWx1ZSAmPSB+QklUMTM7CQkJICAKKyAJdXNjX091dFJlZyhpbmZvLCBDTVIsIGluZm8tPmNtcl92YWx1ZSk7Cit9CisKKy8qIGFib3J0IGEgdHJhbnNtaXQgaW4gcHJvZ3Jlc3Mgd2hpbGUgaW4gSERMQyBMb29wTW9kZQorICovCitzdGF0aWMgdm9pZCB1c2NfbG9vcG1vZGVfY2FuY2VsX3RyYW5zbWl0KCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvICkKK3sKKyAJLyogcmVzZXQgdHggZG1hIGNoYW5uZWwgYW5kIHB1cmdlIFR4RmlmbyAqLworIAl1c2NfUlRDbWQoIGluZm8sIFJUQ21kX1B1cmdlVHhGaWZvICk7CisgCXVzY19EbWFDbWQoIGluZm8sIERtYUNtZF9SZXNldFR4Q2hhbm5lbCApOworICAJdXNjX2xvb3Btb2RlX3NlbmRfZG9uZSggaW5mbyApOworfQorCisvKiBmb3IgSERMQy9TRExDIExvb3BNb2RlLCBzZXR0aW5nIENNUjoxMyBhZnRlciB0aGUgdHJhbnNtaXR0ZXIgaXMgZW5hYmxlZAorICogaXMgYW4gSW5zZXJ0IEludG8gTG9vcCBhY3Rpb24uIFVwb24gcmVjZWlwdCBvZiBhIEdvQWhlYWQgc2VxdWVuY2UgKFJ4QWJvcnQpCisgKiB3ZSBtdXN0IGNsZWFyIENNUjoxMyB0byBiZWdpbiByZXBlYXRpbmcgVHhEYXRhIHRvIFJ4RGF0YQorICovCitzdGF0aWMgdm9pZCB1c2NfbG9vcG1vZGVfaW5zZXJ0X3JlcXVlc3QoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqIGluZm8gKQoreworIAlpbmZvLT5sb29wbW9kZV9pbnNlcnRfcmVxdWVzdGVkID0gVFJVRTsKKyAKKyAJLyogZW5hYmxlIFJ4QWJvcnQgaXJxLiBPbiBuZXh0IFJ4QWJvcnQsIGNsZWFyIENNUjoxMyB0bworIAkgKiBiZWdpbiByZXBlYXRpbmcgVHhEYXRhIG9uIFJ4RGF0YSAoY29tcGxldGUgaW5zZXJ0aW9uKQorCSAqLworIAl1c2NfT3V0UmVnKCBpbmZvLCBSSUNSLCAKKwkJKHVzY19JblJlZyggaW5mbywgUklDUiApIHwgUlhTVEFUVVNfQUJPUlRfUkVDRUlWRUQgKSApOworCQkKKwkvKiBzZXQgQ01SOjEzIHRvIGluc2VydCBpbnRvIGxvb3Agb24gbmV4dCBHb0FoZWFkIChSeEFib3J0KSAqLworCWluZm8tPmNtcl92YWx1ZSB8PSBCSVQxMzsKKyAJdXNjX091dFJlZyhpbmZvLCBDTVIsIGluZm8tPmNtcl92YWx1ZSk7Cit9CisKKy8qIHJldHVybiAxIGlmIHN0YXRpb24gaXMgaW5zZXJ0ZWQgaW50byB0aGUgbG9vcCwgb3RoZXJ3aXNlIDAKKyAqLworc3RhdGljIGludCB1c2NfbG9vcG1vZGVfYWN0aXZlKCBzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKiBpbmZvKQoreworIAlyZXR1cm4gdXNjX0luUmVnKCBpbmZvLCBDQ1NSICkgJiBCSVQ3ID8gMSA6IDAgOworfQorCisjaWZkZWYgQ09ORklHX0hETEMKKworLyoqCisgKiBjYWxsZWQgYnkgZ2VuZXJpYyBIRExDIGxheWVyIHdoZW4gcHJvdG9jb2wgc2VsZWN0ZWQgKFBQUCwgZnJhbWUgcmVsYXksIGV0Yy4pCisgKiBzZXQgZW5jb2RpbmcgYW5kIGZyYW1lIGNoZWNrIHNlcXVlbmNlIChGQ1MpIG9wdGlvbnMKKyAqCisgKiBkZXYgICAgICAgcG9pbnRlciB0byBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqIGVuY29kaW5nICBzZXJpYWwgZW5jb2Rpbmcgc2V0dGluZworICogcGFyaXR5ICAgIEZDUyBzZXR0aW5nCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgZW5jb2RpbmcsCisJCQkgIHVuc2lnbmVkIHNob3J0IHBhcml0eSkKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXVuc2lnbmVkIGNoYXIgIG5ld19lbmNvZGluZzsKKwl1bnNpZ25lZCBzaG9ydCBuZXdfY3JjdHlwZTsKKworCS8qIHJldHVybiBlcnJvciBpZiBUVFkgaW50ZXJmYWNlIG9wZW4gKi8KKwlpZiAoaW5mby0+Y291bnQpCisJCXJldHVybiAtRUJVU1k7CisKKwlzd2l0Y2ggKGVuY29kaW5nKQorCXsKKwljYXNlIEVOQ09ESU5HX05SWjogICAgICAgIG5ld19lbmNvZGluZyA9IEhETENfRU5DT0RJTkdfTlJaOyBicmVhazsKKwljYXNlIEVOQ09ESU5HX05SWkk6ICAgICAgIG5ld19lbmNvZGluZyA9IEhETENfRU5DT0RJTkdfTlJaSV9TUEFDRTsgYnJlYWs7CisJY2FzZSBFTkNPRElOR19GTV9NQVJLOiAgICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTUFSSzsgYnJlYWs7CisJY2FzZSBFTkNPRElOR19GTV9TUEFDRTogICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfU1BBQ0U7IGJyZWFrOworCWNhc2UgRU5DT0RJTkdfTUFOQ0hFU1RFUjogbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19CSVBIQVNFX0xFVkVMOyBicmVhazsKKwlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHBhcml0eSkKKwl7CisJY2FzZSBQQVJJVFlfTk9ORTogICAgICAgICAgICBuZXdfY3JjdHlwZSA9IEhETENfQ1JDX05PTkU7IGJyZWFrOworCWNhc2UgUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVDogbmV3X2NyY3R5cGUgPSBIRExDX0NSQ18xNl9DQ0lUVDsgYnJlYWs7CisJY2FzZSBQQVJJVFlfQ1JDMzJfUFIxX0NDSVRUOiBuZXdfY3JjdHlwZSA9IEhETENfQ1JDXzMyX0NDSVRUOyBicmVhazsKKwlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbmZvLT5wYXJhbXMuZW5jb2RpbmcgPSBuZXdfZW5jb2Rpbmc7CisJaW5mby0+cGFyYW1zLmNyY190eXBlID0gbmV3X2NyY3R5cGU7OworCisJLyogaWYgbmV0d29yayBpbnRlcmZhY2UgdXAsIHJlcHJvZ3JhbSBoYXJkd2FyZSAqLworCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJbWdzbF9wcm9ncmFtX2h3KGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGdlbmVyaWMgSERMQyBsYXllciB0byBzZW5kIGZyYW1lCisgKgorICogc2tiICBzb2NrZXQgYnVmZmVyIGNvbnRhaW5pbmcgSERMQyBmcmFtZQorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IGRldl90b19wb3J0KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6aGRsY194bWl0KCVzKVxuIixfX0ZJTEVfXyxkZXYtPm5hbWUpOworCisJLyogc3RvcCBzZW5kaW5nIHVudGlsIHRoaXMgZnJhbWUgY29tcGxldGVzICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogY29weSBkYXRhIHRvIGRldmljZSBidWZmZXJzICovCisJaW5mby0+eG1pdF9jbnQgPSBza2ItPmxlbjsKKwltZ3NsX2xvYWRfdHhfZG1hX2J1ZmZlcihpbmZvLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworCS8qIHVwZGF0ZSBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwlzdGF0cy0+dHhfcGFja2V0cysrOworCXN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCS8qIGRvbmUgd2l0aCBzb2NrZXQgYnVmZmVyLCBzbyBmcmVlIGl0ICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJLyogc2F2ZSBzdGFydCB0aW1lIGZvciB0cmFuc21pdCB0aW1lb3V0IGRldGVjdGlvbiAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogc3RhcnQgaGFyZHdhcmUgdHJhbnNtaXR0ZXIgaWYgbmVjZXNzYXJ5ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CisJaWYgKCFpbmZvLT50eF9hY3RpdmUpCisJIAl1c2Nfc3RhcnRfdHJhbnNtaXR0ZXIoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGxlZCBieSBuZXR3b3JrIGxheWVyIHdoZW4gaW50ZXJmYWNlIGVuYWJsZWQKKyAqIGNsYWltIHJlc291cmNlcyBhbmQgaW5pdGlhbGl6ZSBoYXJkd2FyZQorICoKKyAqIGRldiAgcG9pbnRlciB0byBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBoZGxjZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXM6aGRsY2Rldl9vcGVuKCVzKVxuIixfX0ZJTEVfXyxkZXYtPm5hbWUpOworCisJLyogZ2VuZXJpYyBIRExDIGxheWVyIG9wZW4gcHJvY2Vzc2luZyAqLworCWlmICgocmMgPSBoZGxjX29wZW4oZGV2KSkpCisJCXJldHVybiByYzsKKworCS8qIGFyYml0cmF0ZSBiZXR3ZWVuIG5ldHdvcmsgYW5kIHR0eSBvcGVucyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJaWYgKGluZm8tPmNvdW50ICE9IDAgfHwgaW5mby0+bmV0Y291bnQgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaGRsY19vcGVuIHJldHVybmluZyBidXN5XG4iLCBkZXYtPm5hbWUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWluZm8tPm5ldGNvdW50PTE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCisJLyogY2xhaW0gcmVzb3VyY2VzIGFuZCBpbml0IGFkYXB0ZXIgKi8KKwlpZiAoKHJjID0gc3RhcnR1cChpbmZvKSkgIT0gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlpbmZvLT5uZXRjb3VudD0wOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBhc3NlcnQgRFRSIGFuZCBSVFMsIGFwcGx5IGhhcmR3YXJlIHNldHRpbmdzICovCisJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CisJbWdzbF9wcm9ncmFtX2h3KGluZm8pOworCisJLyogZW5hYmxlIG5ldHdvcmsgbGF5ZXIgdHJhbnNtaXQgKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJLyogaW5mb3JtIGdlbmVyaWMgSERMQyBsYXllciBvZiBjdXJyZW50IERDRCBzdGF0dXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLCBmbGFncyk7CisJdXNjX2dldF9zZXJpYWxfc2lnbmFscyhpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssIGZsYWdzKTsKKwloZGxjX3NldF9jYXJyaWVyKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCwgZGV2KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGxlZCBieSBuZXR3b3JrIGxheWVyIHdoZW4gaW50ZXJmYWNlIGlzIGRpc2FibGVkCisgKiBzaHV0ZG93biBoYXJkd2FyZSBhbmQgcmVsZWFzZSByZXNvdXJjZXMKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IGRldl90b19wb3J0KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzOmhkbGNkZXZfY2xvc2UoJXMpXG4iLF9fRklMRV9fLGRldi0+bmFtZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBzaHV0ZG93biBhZGFwdGVyIGFuZCByZWxlYXNlIHJlc291cmNlcyAqLworCXNodXRkb3duKGluZm8pOworCisJaGRsY19jbG9zZShkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwlpbmZvLT5uZXRjb3VudD0wOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGxlZCBieSBuZXR3b3JrIGxheWVyIHRvIHByb2Nlc3MgSU9DVEwgY2FsbCB0byBuZXR3b3JrIGRldmljZQorICoKKyAqIGRldiAgcG9pbnRlciB0byBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqIGlmciAgcG9pbnRlciB0byBuZXR3b3JrIGludGVyZmFjZSByZXF1ZXN0IHN0cnVjdHVyZQorICogY21kICBJT0NUTCBjb21tYW5kIGNvZGUKKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBoZGxjZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKHN5bmNfc2VyaWFsX3NldHRpbmdzKTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBuZXdfbGluZTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBfX3VzZXIgKmxpbmUgPSBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jOworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IGRldl90b19wb3J0KGRldik7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXM6aGRsY2Rldl9pb2N0bCglcylcbiIsX19GSUxFX18sZGV2LT5uYW1lKTsKKworCS8qIHJldHVybiBlcnJvciBpZiBUVFkgaW50ZXJmYWNlIG9wZW4gKi8KKwlpZiAoaW5mby0+Y291bnQpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoY21kICE9IFNJT0NXQU5ERVYpCisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCisJc3dpdGNoKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0dFVF9JRkFDRTogLyogcmV0dXJuIGN1cnJlbnQgc3luY19zZXJpYWxfc2V0dGluZ3MgKi8KKworCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfU1lOQ19TRVJJQUw7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCisJCWZsYWdzID0gaW5mby0+cGFyYW1zLmZsYWdzICYgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1JYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfUlhDX1RYQ1BJTiB8CisJCQkJCSAgICAgIEhETENfRkxBR19UWENfVFhDUElOIHwgSERMQ19GTEFHX1RYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik7CisKKwkJc3dpdGNoIChmbGFncyl7CisJCWNhc2UgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19UWENQSU4pOiBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfRVhUOyBicmVhazsKKwkJY2FzZSAoSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX0JSRyk6ICAgIG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19JTlQ7IGJyZWFrOworCQljYXNlIChIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19UWENfQlJHKTogICAgbmV3X2xpbmUuY2xvY2tfdHlwZSA9IENMT0NLX1RYSU5UOyBicmVhazsKKwkJY2FzZSAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik6IG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19UWEZST01SWDsgYnJlYWs7CisJCWRlZmF1bHQ6IG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19ERUZBVUxUOworCQl9CisKKwkJbmV3X2xpbmUuY2xvY2tfcmF0ZSA9IGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZDsKKwkJbmV3X2xpbmUubG9vcGJhY2sgICA9IGluZm8tPnBhcmFtcy5sb29wYmFjayA/IDE6MDsKKworCQlpZiAoY29weV90b191c2VyKGxpbmUsICZuZXdfbGluZSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX0lGQUNFX1NZTkNfU0VSSUFMOiAvKiBzZXQgc3luY19zZXJpYWxfc2V0dGluZ3MgKi8KKworCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X2xpbmUsIGxpbmUsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJc3dpdGNoIChuZXdfbGluZS5jbG9ja190eXBlKQorCQl7CisJCWNhc2UgQ0xPQ0tfRVhUOiAgICAgIGZsYWdzID0gSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1RYQ1BJTjsgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfVFhGUk9NUlg6IGZsYWdzID0gSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTjsgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfSU5UOiAgICAgIGZsYWdzID0gSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX0JSRzsgICAgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfVFhJTlQ6ICAgIGZsYWdzID0gSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX0JSRzsgICAgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfREVGQVVMVDogIGZsYWdzID0gaW5mby0+cGFyYW1zLmZsYWdzICYKKwkJCQkJICAgICAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfUlhDX0RQTEwgfAorCQkJCQkgICAgICBIRExDX0ZMQUdfUlhDX0JSRyAgICB8IEhETENfRkxBR19SWENfVFhDUElOIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19UWENQSU4gfCBIRExDX0ZMQUdfVFhDX0RQTEwgfAorCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX0JSRyAgICB8IEhETENfRkxBR19UWENfUlhDUElOKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKG5ld19saW5lLmxvb3BiYWNrICE9IDAgJiYgbmV3X2xpbmUubG9vcGJhY2sgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWluZm8tPnBhcmFtcy5mbGFncyAmPSB+KEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1JYQ19EUExMIHwKKwkJCQkJSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfUlhDX1RYQ1BJTiB8CisJCQkJCUhETENfRkxBR19UWENfVFhDUElOIHwgSERMQ19GTEFHX1RYQ19EUExMIHwKKwkJCQkJSERMQ19GTEFHX1RYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik7CisJCWluZm8tPnBhcmFtcy5mbGFncyB8PSBmbGFnczsKKworCQlpbmZvLT5wYXJhbXMubG9vcGJhY2sgPSBuZXdfbGluZS5sb29wYmFjazsKKworCQlpZiAoZmxhZ3MgJiAoSERMQ19GTEFHX1JYQ19CUkcgfCBIRExDX0ZMQUdfVFhDX0JSRykpCisJCQlpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQgPSBuZXdfbGluZS5jbG9ja19yYXRlOworCQllbHNlCisJCQlpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQgPSAwOworCisJCS8qIGlmIG5ldHdvcmsgaW50ZXJmYWNlIHVwLCByZXByb2dyYW0gaGFyZHdhcmUgKi8KKwkJaWYgKGluZm8tPm5ldGNvdW50KQorCQkJbWdzbF9wcm9ncmFtX2h3KGluZm8pOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCX0KK30KKworLyoqCisgKiBjYWxsZWQgYnkgbmV0d29yayBsYXllciB3aGVuIHRyYW5zbWl0IHRpbWVvdXQgaXMgZGV0ZWN0ZWQKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGhkbGNkZXZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IGRldl90b19wb3J0KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJoZGxjZGV2X3R4X3RpbWVvdXQoJXMpXG4iLGRldi0+bmFtZSk7CisKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisJc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzKys7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aXJxX3NwaW5sb2NrLGZsYWdzKTsKKwl1c2Nfc3RvcF90cmFuc21pdHRlcihpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKioKKyAqIGNhbGxlZCBieSBkZXZpY2UgZHJpdmVyIHdoZW4gdHJhbnNtaXQgY29tcGxldGVzCisgKiByZWVuYWJsZSBuZXR3b3JrIGxheWVyIHRyYW5zbWl0IGlmIHN0b3BwZWQKKyAqCisgKiBpbmZvICBwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBoZGxjZGV2X3R4X2RvbmUoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKQoreworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGluZm8tPm5ldGRldikpCisJCW5ldGlmX3dha2VfcXVldWUoaW5mby0+bmV0ZGV2KTsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZGV2aWNlIGRyaXZlciB3aGVuIGZyYW1lIHJlY2VpdmVkCisgKiBwYXNzIGZyYW1lIHRvIG5ldHdvcmsgbGF5ZXIKKyAqCisgKiBpbmZvICBwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBpbmZvcm1hdGlvbgorICogYnVmICAgcG9pbnRlciB0byBidWZmZXIgY29udGlhbmluZyBmcmFtZSBkYXRhCisgKiBzaXplICBjb3VudCBvZiBkYXRhIGJ5dGVzIGluIGJ1ZgorICovCitzdGF0aWMgdm9pZCBoZGxjZGV2X3J4KHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbywgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+bmV0ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoImhkbGNkZXZfcngoJXMpXG4iLGRldi0+bmFtZSk7CisKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogY2FuJ3QgYWxsb2Mgc2tiLCBkcm9wcGluZyBwYWNrZXRcbiIsIGRldi0+bmFtZSk7CisJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisKKwltZW1jcHkoc2tiX3B1dChza2IsIHNpemUpLGJ1ZixzaXplKTsKKworCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBpbmZvLT5uZXRkZXYpOworCisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gc2l6ZTsKKworCW5ldGlmX3J4KHNrYik7CisKKwlpbmZvLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworfQorCisvKioKKyAqIGNhbGxlZCBieSBkZXZpY2UgZHJpdmVyIHdoZW4gYWRkaW5nIGRldmljZSBpbnN0YW5jZQorICogZG8gZ2VuZXJpYyBIRExDIGluaXRpYWxpemF0aW9uCisgKgorICogaW5mbyAgcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgaW5mb3JtYXRpb24KKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBoZGxjZGV2X2luaXQoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKQoreworCWludCByYzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWhkbGNfZGV2aWNlICpoZGxjOworCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgbmV0d29yayBhbmQgSERMQyBsYXllciBvYmplY3RzICovCisKKwlpZiAoIShkZXYgPSBhbGxvY19oZGxjZGV2KGluZm8pKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOmhkbGMgZGV2aWNlIGFsbG9jYXRpb24gZmFpbHVyZVxuIixfX0ZJTEVfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGZvciBuZXR3b3JrIGxheWVyIHJlcG9ydGluZyBwdXJwb3NlcyBvbmx5ICovCisJZGV2LT5iYXNlX2FkZHIgPSBpbmZvLT5pb19iYXNlOworCWRldi0+aXJxICAgICAgID0gaW5mby0+aXJxX2xldmVsOworCWRldi0+ZG1hICAgICAgID0gaW5mby0+ZG1hX2xldmVsOworCisJLyogbmV0d29yayBsYXllciBjYWxsYmFja3MgYW5kIHNldHRpbmdzICovCisJZGV2LT5kb19pb2N0bCAgICAgICA9IGhkbGNkZXZfaW9jdGw7CisJZGV2LT5vcGVuICAgICAgICAgICA9IGhkbGNkZXZfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgID0gaGRsY2Rldl9jbG9zZTsKKwlkZXYtPnR4X3RpbWVvdXQgICAgID0gaGRsY2Rldl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAxMCpIWjsKKwlkZXYtPnR4X3F1ZXVlX2xlbiAgID0gNTA7CisKKwkvKiBnZW5lcmljIEhETEMgbGF5ZXIgY2FsbGJhY2tzIGFuZCBzZXR0aW5ncyAqLworCWhkbGMgICAgICAgICA9IGRldl90b19oZGxjKGRldik7CisJaGRsYy0+YXR0YWNoID0gaGRsY2Rldl9hdHRhY2g7CisJaGRsYy0+eG1pdCAgID0gaGRsY2Rldl94bWl0OworCisJLyogcmVnaXN0ZXIgb2JqZWN0cyB3aXRoIEhETEMgbGF5ZXIgKi8KKwlpZiAoKHJjID0gcmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6dW5hYmxlIHRvIHJlZ2lzdGVyIGhkbGMgZGV2aWNlXG4iLF9fRklMRV9fKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIHJjOworCX0KKworCWluZm8tPm5ldGRldiA9IGRldjsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZGV2aWNlIGRyaXZlciB3aGVuIHJlbW92aW5nIGRldmljZSBpbnN0YW5jZQorICogZG8gZ2VuZXJpYyBIRExDIGNsZWFudXAKKyAqCisgKiBpbmZvICBwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBoZGxjZGV2X2V4aXQoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKQoreworCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoaW5mby0+bmV0ZGV2KTsKKwlmcmVlX25ldGRldihpbmZvLT5uZXRkZXYpOworCWluZm8tPm5ldGRldiA9IE5VTEw7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfSERMQyAqLworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHN5bmNsaW5rX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbzsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXYpKSB7CisJCXByaW50aygiZXJyb3IgZW5hYmxpbmcgcGNpIGRldmljZSAlcFxuIiwgZGV2KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCEoaW5mbyA9IG1nc2xfYWxsb2NhdGVfZGV2aWNlKCkpKSB7CisJCXByaW50aygiY2FuJ3QgYWxsb2NhdGUgZGV2aWNlIGluc3RhbmNlIGRhdGEuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisgICAgICAgIC8qIENvcHkgdXNlciBjb25maWd1cmF0aW9uIGluZm8gdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEgKi8KKwkJCisJaW5mby0+aW9fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDIpOworCWluZm8tPmlycV9sZXZlbCA9IGRldi0+aXJxOworCWluZm8tPnBoeXNfbWVtb3J5X2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAzKTsKKwkJCQkKKyAgICAgICAgLyogQmVjYXVzZSB2ZXJlbWFwIG9ubHkgd29ya3Mgb24gcGFnZSBib3VuZGFyaWVzIHdlIG11c3QgbWFwCisJICogYSBsYXJnZXIgYXJlYSB0aGFuIGlzIGFjdHVhbGx5IGltcGxlbWVudGVkIGZvciB0aGUgTENSCisJICogbWVtb3J5IHJhbmdlLiBXZSBtYXAgYSBmdWxsIHBhZ2Ugc3RhcnRpbmcgYXQgdGhlIHBhZ2UgYm91bmRhcnkuCisJICovCisJaW5mby0+cGh5c19sY3JfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOworCWluZm8tPmxjcl9vZmZzZXQgICAgPSBpbmZvLT5waHlzX2xjcl9iYXNlICYgKFBBR0VfU0laRS0xKTsKKwlpbmZvLT5waHlzX2xjcl9iYXNlICY9IH4oUEFHRV9TSVpFLTEpOworCQkJCQorCWluZm8tPmJ1c190eXBlID0gTUdTTF9CVVNfVFlQRV9QQ0k7CisJaW5mby0+aW9fYWRkcl9zaXplID0gODsKKwlpbmZvLT5pcnFfZmxhZ3MgPSBTQV9TSElSUTsKKworCWlmIChkZXYtPmRldmljZSA9PSAweDAyMTApIHsKKwkJLyogVmVyc2lvbiAxIFBDSTkwMzAgYmFzZWQgdW5pdmVyc2FsIFBDSSBhZGFwdGVyICovCisJCWluZm8tPm1pc2NfY3RybF92YWx1ZSA9IDB4MDA3YzQwODA7CisJCWluZm8tPmh3X3ZlcnNpb24gPSAxOworCX0gZWxzZSB7CisJCS8qIFZlcnNpb24gMCBQQ0k5MDUwIGJhc2VkIDVWIFBDSSBhZGFwdGVyCisJCSAqIEEgUENJOTA1MCBidWcgcHJldmVudHMgcmVhZGluZyBMQ1IgcmVnaXN0ZXJzIGlmIAorCQkgKiBMQ1IgYmFzZSBhZGRyZXNzIGJpdCA3IGlzIHNldC4gTWFpbnRhaW4gc2hhZG93CisJCSAqIHZhbHVlIHNvIHdlIGNhbiB3cml0ZSB0byBMQ1IgbWlzYyBjb250cm9sIHJlZy4KKwkJICovCisJCWluZm8tPm1pc2NfY3RybF92YWx1ZSA9IDB4MDg3ZTQ1NDY7CisJCWluZm8tPmh3X3ZlcnNpb24gPSAwOworCX0KKwkJCQkKKwltZ3NsX2FkZF9kZXZpY2UoaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHN5bmNsaW5rX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOTQ5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jCkBAIC0wLDAgKzEsNTY3MSBAQAorLyoKKyAqICRJZDogc3luY2xpbmttcC5jLHYgNC4zNCAyMDA1LzAzLzA0IDE1OjA3OjEwIHBhdWxrZiBFeHAgJAorICoKKyAqIERldmljZSBkcml2ZXIgZm9yIE1pY3JvZ2F0ZSBTeW5jTGluayBNdWx0aXBvcnQKKyAqIGhpZ2ggc3BlZWQgbXVsdGlwcm90b2NvbCBzZXJpYWwgYWRhcHRlci4KKyAqCisgKiB3cml0dGVuIGJ5IFBhdWwgRnVsZ2h1bSBmb3IgTWljcm9nYXRlIENvcnBvcmF0aW9uCisgKiBwYXVsa2ZAbWljcm9nYXRlLmNvbQorICoKKyAqIE1pY3JvZ2F0ZSBhbmQgU3luY0xpbmsgYXJlIHRyYWRlbWFya3Mgb2YgTWljcm9nYXRlIENvcnBvcmF0aW9uCisgKgorICogRGVyaXZlZCBmcm9tIHNlcmlhbC5jIHdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbyBhbmQgTGludXMgVG9ydmFsZHMKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2RlZmluZSBWRVJTSU9OKHZlcixyZWwsc2VxKSAoKCh2ZXIpPDwxNikgfCAoKHJlbCk8PDgpIHwgKHNlcSkpCisjaWYgZGVmaW5lZChfX2kzODZfXykKKyMgIGRlZmluZSBCUkVBS1BPSU5UKCkgYXNtKCIgICBpbnQgJDMiKTsKKyNlbHNlCisjICBkZWZpbmUgQlJFQUtQT0lOVCgpIHsgfQorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0RFVklDRVMgMTIKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisKKyNpZmRlZiBDT05GSUdfSERMQ19NT0RVTEUKKyNkZWZpbmUgQ09ORklHX0hETEMgMQorI2VuZGlmCisKKyNkZWZpbmUgR0VUX1VTRVIoZXJyb3IsdmFsdWUsYWRkcikgZXJyb3IgPSBnZXRfdXNlcih2YWx1ZSxhZGRyKQorI2RlZmluZSBDT1BZX0ZST01fVVNFUihlcnJvcixkZXN0LHNyYyxzaXplKSBlcnJvciA9IGNvcHlfZnJvbV91c2VyKGRlc3Qsc3JjLHNpemUpID8gLUVGQVVMVCA6IDAKKyNkZWZpbmUgUFVUX1VTRVIoZXJyb3IsdmFsdWUsYWRkcikgZXJyb3IgPSBwdXRfdXNlcih2YWx1ZSxhZGRyKQorI2RlZmluZSBDT1BZX1RPX1VTRVIoZXJyb3IsZGVzdCxzcmMsc2l6ZSkgZXJyb3IgPSBjb3B5X3RvX3VzZXIoZGVzdCxzcmMsc2l6ZSkgPyAtRUZBVUxUIDogMAorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImxpbnV4L3N5bmNsaW5rLmgiCisKK3N0YXRpYyBNR1NMX1BBUkFNUyBkZWZhdWx0X3BhcmFtcyA9IHsKKwlNR1NMX01PREVfSERMQywJCQkvKiB1bnNpZ25lZCBsb25nIG1vZGUgKi8KKwkwLAkJCQkvKiB1bnNpZ25lZCBjaGFyIGxvb3BiYWNrOyAqLworCUhETENfRkxBR19VTkRFUlJVTl9BQk9SVDE1LAkvKiB1bnNpZ25lZCBzaG9ydCBmbGFnczsgKi8KKwlIRExDX0VOQ09ESU5HX05SWklfU1BBQ0UsCS8qIHVuc2lnbmVkIGNoYXIgZW5jb2Rpbmc7ICovCisJMCwJCQkJLyogdW5zaWduZWQgbG9uZyBjbG9ja19zcGVlZDsgKi8KKwkweGZmLAkJCQkvKiB1bnNpZ25lZCBjaGFyIGFkZHJfZmlsdGVyOyAqLworCUhETENfQ1JDXzE2X0NDSVRULAkJLyogdW5zaWduZWQgc2hvcnQgY3JjX3R5cGU7ICovCisJSERMQ19QUkVBTUJMRV9MRU5HVEhfOEJJVFMsCS8qIHVuc2lnbmVkIGNoYXIgcHJlYW1ibGVfbGVuZ3RoOyAqLworCUhETENfUFJFQU1CTEVfUEFUVEVSTl9OT05FLAkvKiB1bnNpZ25lZCBjaGFyIHByZWFtYmxlOyAqLworCTk2MDAsCQkJCS8qIHVuc2lnbmVkIGxvbmcgZGF0YV9yYXRlOyAqLworCTgsCQkJCS8qIHVuc2lnbmVkIGNoYXIgZGF0YV9iaXRzOyAqLworCTEsCQkJCS8qIHVuc2lnbmVkIGNoYXIgc3RvcF9iaXRzOyAqLworCUFTWU5DX1BBUklUWV9OT05FCQkvKiB1bnNpZ25lZCBjaGFyIHBhcml0eTsgKi8KK307CisKKy8qIHNpemUgaW4gYnl0ZXMgb2YgRE1BIGRhdGEgYnVmZmVycyAqLworI2RlZmluZSBTQ0FCVUZTSVpFIAkxMDI0CisjZGVmaW5lIFNDQV9NRU1fU0laRQkweDQwMDAwCisjZGVmaW5lIFNDQV9CQVNFX1NJWkUgICA1MTIKKyNkZWZpbmUgU0NBX1JFR19TSVpFICAgIDE2CisjZGVmaW5lIFNDQV9NQVhfUE9SVFMgICA0CisjZGVmaW5lIFNDQU1BWERFU0MgCTEyOAorCisjZGVmaW5lCUJVRkZFUkxJU1RTSVpFCTQwOTYKKworLyogU0NBLUkgc3R5bGUgRE1BIGJ1ZmZlciBkZXNjcmlwdG9yICovCit0eXBlZGVmIHN0cnVjdCBfU0NBREVTQworeworCXUxNgluZXh0OwkJLyogbG93ZXIgbDYgYml0cyBvZiBuZXh0IGRlc2NyaXB0b3IgYWRkciAqLworCXUxNglidWZfcHRyOwkvKiBsb3dlciAxNiBiaXRzIG9mIGJ1ZmZlciBhZGRyICovCisJdTgJYnVmX2Jhc2U7CS8qIHVwcGVyIDggYml0cyBvZiBidWZmZXIgYWRkciAqLworCXU4CXBhZDE7CisJdTE2CWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBidWZmZXIgKi8KKwl1OAlzdGF0dXM7CQkvKiBzdGF0dXMgb2YgYnVmZmVyICovCisJdTgJcGFkMjsKK30gU0NBREVTQywgKlBTQ0FERVNDOworCit0eXBlZGVmIHN0cnVjdCBfU0NBREVTQ19FWAoreworCS8qIGRldmljZSBkcml2ZXIgYm9va2tlZXBpbmcgc2VjdGlvbiAqLworCWNoYXIgCSp2aXJ0X2FkZHI7ICAgIAkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgZGF0YSBidWZmZXIgKi8KKwl1MTYJcGh5c19lbnRyeTsJLyogbG93ZXIgMTYtYml0cyBvZiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgZGVzY3JpcHRvciAqLworfSBTQ0FERVNDX0VYLCAqUFNDQURFU0NfRVg7CisKKy8qIFRoZSBxdWV1ZSBvZiBCSCBhY3Rpb25zIHRvIGJlIHBlcmZvcm1lZCAqLworCisjZGVmaW5lIEJIX1JFQ0VJVkUgIDEKKyNkZWZpbmUgQkhfVFJBTlNNSVQgMgorI2RlZmluZSBCSF9TVEFUVVMgICA0CisKKyNkZWZpbmUgSU9fUElOX1NIVVRET1dOX0xJTUlUIDEwMAorCisjZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKKworc3RydWN0CV9pbnB1dF9zaWduYWxfZXZlbnRzIHsKKwlpbnQJcmlfdXA7CisJaW50CXJpX2Rvd247CisJaW50CWRzcl91cDsKKwlpbnQJZHNyX2Rvd247CisJaW50CWRjZF91cDsKKwlpbnQJZGNkX2Rvd247CisJaW50CWN0c191cDsKKwlpbnQJY3RzX2Rvd247Cit9OworCisvKgorICogRGV2aWNlIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IF9zeW5jbGlua21wX2luZm8geworCXZvaWQgKmlmX3B0cjsJCQkJLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIgKHVzZWQgYnkgU1BQUCkgKi8KKwlpbnQJCQltYWdpYzsKKwlpbnQJCQlmbGFnczsKKwlpbnQJCQljb3VudDsJCS8qIGNvdW50IG9mIG9wZW5zICovCisJaW50CQkJbGluZTsKKwl1bnNpZ25lZCBzaG9ydAkJY2xvc2VfZGVsYXk7CisJdW5zaWduZWQgc2hvcnQJCWNsb3Npbmdfd2FpdDsJLyogdGltZSB0byB3YWl0IGJlZm9yZSBjbG9zaW5nICovCisKKwlzdHJ1Y3QgbWdzbF9pY291bnQJaWNvdW50OworCisJc3RydWN0IHR0eV9zdHJ1Y3QgCSp0dHk7CisJaW50CQkJdGltZW91dDsKKwlpbnQJCQl4X2NoYXI7CQkvKiB4b24veG9mZiBjaGFyYWN0ZXIgKi8KKwlpbnQJCQlibG9ja2VkX29wZW47CS8qICMgb2YgYmxvY2tlZCBvcGVucyAqLworCXUxNgkJCXJlYWRfc3RhdHVzX21hc2sxOyAgLyogYnJlYWsgZGV0ZWN0aW9uIChTUjEgaW5kaWNhdGlvbnMpICovCisJdTE2CQkJcmVhZF9zdGF0dXNfbWFzazI7ICAvKiBwYXJpdHkvZnJhbWluZy9vdmVydW4gKFNSMiBpbmRpY2F0aW9ucykgKi8KKwl1bnNpZ25lZCBjaGFyIAkJaWdub3JlX3N0YXR1c19tYXNrMTsgIC8qIGJyZWFrIGRldGVjdGlvbiAoU1IxIGluZGljYXRpb25zKSAqLworCXVuc2lnbmVkIGNoYXIJCWlnbm9yZV9zdGF0dXNfbWFzazI7ICAvKiBwYXJpdHkvZnJhbWluZy9vdmVydW4gKFNSMiBpbmRpY2F0aW9ucykgKi8KKwl1bnNpZ25lZCBjaGFyIAkJKnR4X2J1ZjsKKwlpbnQJCQl0eF9wdXQ7CisJaW50CQkJdHhfZ2V0OworCWludAkJCXR4X2NvdW50OworCisJd2FpdF9xdWV1ZV9oZWFkX3QJb3Blbl93YWl0OworCXdhaXRfcXVldWVfaGVhZF90CWNsb3NlX3dhaXQ7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdAlzdGF0dXNfZXZlbnRfd2FpdF9xOworCXdhaXRfcXVldWVfaGVhZF90CWV2ZW50X3dhaXRfcTsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0eF90aW1lcjsJLyogSERMQyB0cmFuc21pdCB0aW1lb3V0IHRpbWVyICovCisJc3RydWN0IF9zeW5jbGlua21wX2luZm8JKm5leHRfZGV2aWNlOwkvKiBkZXZpY2UgbGlzdCBsaW5rICovCisJc3RydWN0IHRpbWVyX2xpc3QJc3RhdHVzX3RpbWVyOwkvKiBpbnB1dCBzaWduYWwgc3RhdHVzIGNoZWNrIHRpbWVyICovCisKKwlzcGlubG9ja190IGxvY2s7CQkvKiBzcGlubG9jayBmb3Igc3luY2hyb25pemluZyB3aXRoIElTUiAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCB0YXNrOwkgCQkvKiB0YXNrIHN0cnVjdHVyZSBmb3Igc2NoZWR1bGluZyBiaCAqLworCisJdTMyIG1heF9mcmFtZV9zaXplOwkJCS8qIGFzIHNldCBieSBkZXZpY2UgY29uZmlnICovCisKKwl1MzIgcGVuZGluZ19iaDsKKworCWludCBiaF9ydW5uaW5nOwkJCQkvKiBQcm90ZWN0aW9uIGZyb20gbXVsdGlwbGUgKi8KKwlpbnQgaXNyX292ZXJmbG93OworCWludCBiaF9yZXF1ZXN0ZWQ7CisKKwlpbnQgZGNkX2Noa2NvdW50OwkJCS8qIGNoZWNrIGNvdW50cyB0byBwcmV2ZW50ICovCisJaW50IGN0c19jaGtjb3VudDsJCQkvKiB0b28gbWFueSBJUlFzIGlmIGEgc2lnbmFsICovCisJaW50IGRzcl9jaGtjb3VudDsJCQkvKiBpcyBmbG9hdGluZyAqLworCWludCByaV9jaGtjb3VudDsKKworCWNoYXIgKmJ1ZmZlcl9saXN0OwkJCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBSeCAmIFR4IGJ1ZmZlciBsaXN0cyAqLworCXVuc2lnbmVkIGxvbmcgYnVmZmVyX2xpc3RfcGh5czsKKworCXVuc2lnbmVkIGludCByeF9idWZfY291bnQ7CQkvKiBjb3VudCBvZiB0b3RhbCBhbGxvY2F0ZWQgUnggYnVmZmVycyAqLworCVNDQURFU0MgKnJ4X2J1Zl9saXN0OyAgIAkJLyogbGlzdCBvZiByZWNlaXZlIGJ1ZmZlciBlbnRyaWVzICovCisJU0NBREVTQ19FWCByeF9idWZfbGlzdF9leFtTQ0FNQVhERVNDXTsgLyogbGlzdCBvZiByZWNlaXZlIGJ1ZmZlciBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IGN1cnJlbnRfcnhfYnVmOworCisJdW5zaWduZWQgaW50IHR4X2J1Zl9jb3VudDsJCS8qIGNvdW50IG9mIHRvdGFsIGFsbG9jYXRlZCBUeCBidWZmZXJzICovCisJU0NBREVTQyAqdHhfYnVmX2xpc3Q7CQkvKiBsaXN0IG9mIHRyYW5zbWl0IGJ1ZmZlciBlbnRyaWVzICovCisJU0NBREVTQ19FWCB0eF9idWZfbGlzdF9leFtTQ0FNQVhERVNDXTsgLyogbGlzdCBvZiB0cmFuc21pdCBidWZmZXIgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBsYXN0X3R4X2J1ZjsKKworCXVuc2lnbmVkIGNoYXIgKnRtcF9yeF9idWY7CisJdW5zaWduZWQgaW50IHRtcF9yeF9idWZfY291bnQ7CisKKwlpbnQgcnhfZW5hYmxlZDsKKwlpbnQgcnhfb3ZlcmZsb3c7CisKKwlpbnQgdHhfZW5hYmxlZDsKKwlpbnQgdHhfYWN0aXZlOworCXUzMiBpZGxlX21vZGU7CisKKwl1bnNpZ25lZCBjaGFyIGllMF92YWx1ZTsKKwl1bnNpZ25lZCBjaGFyIGllMV92YWx1ZTsKKwl1bnNpZ25lZCBjaGFyIGllMl92YWx1ZTsKKwl1bnNpZ25lZCBjaGFyIGN0cmxyZWdfdmFsdWU7CisJdW5zaWduZWQgY2hhciBvbGRfc2lnbmFsczsKKworCWNoYXIgZGV2aWNlX25hbWVbMjVdOwkJCS8qIGRldmljZSBpbnN0YW5jZSBuYW1lICovCisKKwlpbnQgcG9ydF9jb3VudDsKKwlpbnQgYWRhcHRlcl9udW07CisJaW50IHBvcnRfbnVtOworCisJc3RydWN0IF9zeW5jbGlua21wX2luZm8gKnBvcnRfYXJyYXlbU0NBX01BWF9QT1JUU107CisKKwl1bnNpZ25lZCBpbnQgYnVzX3R5cGU7CQkJLyogZXhwYW5zaW9uIGJ1cyB0eXBlIChJU0EsRUlTQSxQQ0kpICovCisKKwl1bnNpZ25lZCBpbnQgaXJxX2xldmVsOwkJCS8qIGludGVycnVwdCBsZXZlbCAqLworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCWludCBpcnFfcmVxdWVzdGVkOwkJCS8qIG5vbnplcm8gaWYgSVJRIHJlcXVlc3RlZCAqLworCisJTUdTTF9QQVJBTVMgcGFyYW1zOwkJCS8qIGNvbW11bmljYXRpb25zIHBhcmFtZXRlcnMgKi8KKworCXVuc2lnbmVkIGNoYXIgc2VyaWFsX3NpZ25hbHM7CQkvKiBjdXJyZW50IHNlcmlhbCBzaWduYWwgc3RhdGVzICovCisKKwlpbnQgaXJxX29jY3VycmVkOwkJCS8qIGZvciBkaWFnbm9zdGljcyB1c2UgKi8KKwl1bnNpZ25lZCBpbnQgaW5pdF9lcnJvcjsJCS8qIEluaXRpYWxpemF0aW9uIHN0YXJ0dXAgZXJyb3IgKi8KKworCXUzMiBsYXN0X21lbV9hbGxvYzsKKwl1bnNpZ25lZCBjaGFyKiBtZW1vcnlfYmFzZTsJCS8qIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyAoUENJIG9ubHkpICovCisJdTMyIHBoeXNfbWVtb3J5X2Jhc2U7CisgICAgCWludCBzaGFyZWRfbWVtX3JlcXVlc3RlZDsKKworCXVuc2lnbmVkIGNoYXIqIHNjYV9iYXNlOwkJLyogSEQ2NDU3MCBTQ0EgTWVtb3J5IGFkZHJlc3MgKi8KKwl1MzIgcGh5c19zY2FfYmFzZTsKKwl1MzIgc2NhX29mZnNldDsKKwlpbnQgc2NhX2Jhc2VfcmVxdWVzdGVkOworCisJdW5zaWduZWQgY2hhciogbGNyX2Jhc2U7CQkvKiBsb2NhbCBjb25maWcgcmVnaXN0ZXJzIChQQ0kgb25seSkgKi8KKwl1MzIgcGh5c19sY3JfYmFzZTsKKwl1MzIgbGNyX29mZnNldDsKKwlpbnQgbGNyX21lbV9yZXF1ZXN0ZWQ7CisKKwl1bnNpZ25lZCBjaGFyKiBzdGF0Y3RybF9iYXNlOwkJLyogc3RhdHVzL2NvbnRyb2wgcmVnaXN0ZXIgbWVtb3J5ICovCisJdTMyIHBoeXNfc3RhdGN0cmxfYmFzZTsKKwl1MzIgc3RhdGN0cmxfb2Zmc2V0OworCWludCBzY2Ffc3RhdGN0cmxfcmVxdWVzdGVkOworCisJdTMyIG1pc2NfY3RybF92YWx1ZTsKKwljaGFyIGZsYWdfYnVmW01BWF9BU1lOQ19CVUZGRVJfU0laRV07CisJY2hhciBjaGFyX2J1ZltNQVhfQVNZTkNfQlVGRkVSX1NJWkVdOworCUJPT0xFQU4gZHJvcF9ydHNfb25fdHhfZG9uZTsKKworCXN0cnVjdAlfaW5wdXRfc2lnbmFsX2V2ZW50cwlpbnB1dF9zaWduYWxfZXZlbnRzOworCisJLyogU1BQUC9DaXNjbyBIRExDIGRldmljZSBwYXJ0cyAqLworCWludCBuZXRjb3VudDsKKwlpbnQgZG9zeW5jcHBwOworCXNwaW5sb2NrX3QgbmV0bG9jazsKKworI2lmZGVmIENPTkZJR19IRExDCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKyNlbmRpZgorCit9IFNMTVBfSU5GTzsKKworI2RlZmluZSBNR1NMX01BR0lDIDB4NTQwMQorCisvKgorICogZGVmaW5lIHNlcmlhbCBzaWduYWwgc3RhdHVzIGNoYW5nZSBtYWNyb3MKKyAqLworI2RlZmluZQlNSVNDU1RBVFVTX0RDRF9MQVRDSEVECShTZXJpYWxTaWduYWxfRENEPDw4KQkvKiBpbmRpY2F0ZXMgY2hhbmdlIGluIERDRCAqLworI2RlZmluZSBNSVNDU1RBVFVTX1JJX0xBVENIRUQJKFNlcmlhbFNpZ25hbF9SSTw8OCkJLyogaW5kaWNhdGVzIGNoYW5nZSBpbiBSSSAqLworI2RlZmluZSBNSVNDU1RBVFVTX0NUU19MQVRDSEVECShTZXJpYWxTaWduYWxfQ1RTPDw4KQkvKiBpbmRpY2F0ZXMgY2hhbmdlIGluIENUUyAqLworI2RlZmluZSBNSVNDU1RBVFVTX0RTUl9MQVRDSEVECShTZXJpYWxTaWduYWxfRFNSPDw4KQkvKiBjaGFuZ2UgaW4gRFNSICovCisKKy8qIENvbW1vbiBSZWdpc3RlciBtYWNyb3MgKi8KKyNkZWZpbmUgTFBSCTB4MDAKKyNkZWZpbmUgUEFCUjAJMHgwMgorI2RlZmluZSBQQUJSMQkweDAzCisjZGVmaW5lIFdDUkwJMHgwNAorI2RlZmluZSBXQ1JNCTB4MDUKKyNkZWZpbmUgV0NSSAkweDA2CisjZGVmaW5lIERQQ1IJMHgwOAorI2RlZmluZSBETUVSCTB4MDkKKyNkZWZpbmUgSVNSMAkweDEwCisjZGVmaW5lIElTUjEJMHgxMQorI2RlZmluZSBJU1IyCTB4MTIKKyNkZWZpbmUgSUVSMAkweDE0CisjZGVmaW5lIElFUjEJMHgxNQorI2RlZmluZSBJRVIyCTB4MTYKKyNkZWZpbmUgSVRDUgkweDE4CisjZGVmaW5lIElOVFZSIAkweDFhCisjZGVmaW5lIElNVlIJMHgxYworCisvKiBNU0NJIFJlZ2lzdGVyIG1hY3JvcyAqLworI2RlZmluZSBUUkIJMHgyMAorI2RlZmluZSBUUkJMCTB4MjAKKyNkZWZpbmUgVFJCSAkweDIxCisjZGVmaW5lIFNSMAkweDIyCisjZGVmaW5lIFNSMQkweDIzCisjZGVmaW5lIFNSMgkweDI0CisjZGVmaW5lIFNSMwkweDI1CisjZGVmaW5lIEZTVAkweDI2CisjZGVmaW5lIElFMAkweDI4CisjZGVmaW5lIElFMQkweDI5CisjZGVmaW5lIElFMgkweDJhCisjZGVmaW5lIEZJRQkweDJiCisjZGVmaW5lIENNRAkweDJjCisjZGVmaW5lIE1EMAkweDJlCisjZGVmaW5lIE1EMQkweDJmCisjZGVmaW5lIE1EMgkweDMwCisjZGVmaW5lIENUTAkweDMxCisjZGVmaW5lIFNBMAkweDMyCisjZGVmaW5lIFNBMQkweDMzCisjZGVmaW5lIElETAkweDM0CisjZGVmaW5lIFRNQwkweDM1CisjZGVmaW5lIFJYUwkweDM2CisjZGVmaW5lIFRYUwkweDM3CisjZGVmaW5lIFRSQzAJMHgzOAorI2RlZmluZSBUUkMxCTB4MzkKKyNkZWZpbmUgUlJDCTB4M2EKKyNkZWZpbmUgQ1NUMAkweDNjCisjZGVmaW5lIENTVDEJMHgzZAorCisvKiBUaW1lciBSZWdpc3RlciBNYWNyb3MgKi8KKyNkZWZpbmUgVENOVAkweDYwCisjZGVmaW5lIFRDTlRMCTB4NjAKKyNkZWZpbmUgVENOVEgJMHg2MQorI2RlZmluZSBUQ09OUgkweDYyCisjZGVmaW5lIFRDT05STAkweDYyCisjZGVmaW5lIFRDT05SSAkweDYzCisjZGVmaW5lIFRNQ1MJMHg2NAorI2RlZmluZSBURVBSCTB4NjUKKworLyogRE1BIENvbnRyb2xsZXIgUmVnaXN0ZXIgbWFjcm9zICovCisjZGVmaW5lIERBUkwJMHg4MAorI2RlZmluZSBEQVJICTB4ODEKKyNkZWZpbmUgREFSQgkweDgyCisjZGVmaW5lIEJBUgkweDgwCisjZGVmaW5lIEJBUkwJMHg4MAorI2RlZmluZSBCQVJICTB4ODEKKyNkZWZpbmUgQkFSQgkweDgyCisjZGVmaW5lIFNBUgkweDg0CisjZGVmaW5lIFNBUkwJMHg4NAorI2RlZmluZSBTQVJICTB4ODUKKyNkZWZpbmUgU0FSQgkweDg2CisjZGVmaW5lIENQQgkweDg2CisjZGVmaW5lIENEQQkweDg4CisjZGVmaW5lIENEQUwJMHg4OAorI2RlZmluZSBDREFICTB4ODkKKyNkZWZpbmUgRURBCTB4OGEKKyNkZWZpbmUgRURBTAkweDhhCisjZGVmaW5lIEVEQUgJMHg4YgorI2RlZmluZSBCRkwJMHg4YworI2RlZmluZSBCRkxMCTB4OGMKKyNkZWZpbmUgQkZMSAkweDhkCisjZGVmaW5lIEJDUgkweDhlCisjZGVmaW5lIEJDUkwJMHg4ZQorI2RlZmluZSBCQ1JICTB4OGYKKyNkZWZpbmUgRFNSCTB4OTAKKyNkZWZpbmUgRE1SCTB4OTEKKyNkZWZpbmUgRkNUCTB4OTMKKyNkZWZpbmUgRElSCTB4OTQKKyNkZWZpbmUgRENNRAkweDk1CisKKy8qIGNvbWJpbmUgd2l0aCB0aW1lciBvciBETUEgcmVnaXN0ZXIgYWRkcmVzcyAqLworI2RlZmluZSBUSU1FUjAJMHgwMAorI2RlZmluZSBUSU1FUjEJMHgwOAorI2RlZmluZSBUSU1FUjIJMHgxMAorI2RlZmluZSBUSU1FUjMJMHgxOAorI2RlZmluZSBSWERNQSAJMHgwMAorI2RlZmluZSBUWERNQSAJMHgyMAorCisvKiBTQ0EgQ29tbWFuZCBDb2RlcyAqLworI2RlZmluZSBOT09QCQkweDAwCisjZGVmaW5lIFRYUkVTRVQJCTB4MDEKKyNkZWZpbmUgVFhFTkFCTEUJMHgwMgorI2RlZmluZSBUWERJU0FCTEUJMHgwMworI2RlZmluZSBUWENSQ0lOSVQJMHgwNAorI2RlZmluZSBUWENSQ0VYQ0wJMHgwNQorI2RlZmluZSBUWEVPTQkJMHgwNgorI2RlZmluZSBUWEFCT1JUCQkweDA3CisjZGVmaW5lIE1QT04JCTB4MDgKKyNkZWZpbmUgVFhCVUZDTFIJMHgwOQorI2RlZmluZSBSWFJFU0VUCQkweDExCisjZGVmaW5lIFJYRU5BQkxFCTB4MTIKKyNkZWZpbmUgUlhESVNBQkxFCTB4MTMKKyNkZWZpbmUgUlhDUkNJTklUCTB4MTQKKyNkZWZpbmUgUlhSRUpFQ1QJMHgxNQorI2RlZmluZSBTRUFSQ0hNUAkweDE2CisjZGVmaW5lIFJYQ1JDRVhDTAkweDE3CisjZGVmaW5lIFJYQ1JDQ0FMQwkweDE4CisjZGVmaW5lIENIUkVTRVQJCTB4MjEKKyNkZWZpbmUgSFVOVAkJMHgzMQorCisvKiBETUEgY29tbWFuZCBjb2RlcyAqLworI2RlZmluZSBTV0FCT1JUCQkweDAxCisjZGVmaW5lIEZFSUNMRUFSCTB4MDIKKworLyogSUUwICovCisjZGVmaW5lIFRYSU5URSAJCUJJVDcKKyNkZWZpbmUgUlhJTlRFIAkJQklUNgorI2RlZmluZSBUWFJEWUUgCQlCSVQxCisjZGVmaW5lIFJYUkRZRSAJCUJJVDAKKworLyogSUUxICYgU1IxICovCisjZGVmaW5lIFVEUk4gICAJQklUNworI2RlZmluZSBJRExFICAgCUJJVDYKKyNkZWZpbmUgU1lOQ0QgIAlCSVQ0CisjZGVmaW5lIEZMR0QgICAJQklUNAorI2RlZmluZSBDQ1RTICAgCUJJVDMKKyNkZWZpbmUgQ0RDRCAgIAlCSVQyCisjZGVmaW5lIEJSS0QgICAJQklUMQorI2RlZmluZSBBQlREICAgCUJJVDEKKyNkZWZpbmUgR0FQRCAgIAlCSVQxCisjZGVmaW5lIEJSS0UgICAJQklUMAorI2RlZmluZSBJRExECUJJVDAKKworLyogSUUyICYgU1IyICovCisjZGVmaW5lIEVPTQlCSVQ3CisjZGVmaW5lIFBNUAlCSVQ2CisjZGVmaW5lIFNIUlQJQklUNgorI2RlZmluZSBQRQlCSVQ1CisjZGVmaW5lIEFCVAlCSVQ1CisjZGVmaW5lIEZSTUUJQklUNAorI2RlZmluZSBSQklUCUJJVDQKKyNkZWZpbmUgT1ZSTglCSVQzCisjZGVmaW5lIENSQ0UJQklUMgorCisKKy8qCisgKiBHbG9iYWwgbGlua2VkIGxpc3Qgb2YgU3luY0xpbmsgZGV2aWNlcworICovCitzdGF0aWMgU0xNUF9JTkZPICpzeW5jbGlua21wX2RldmljZV9saXN0ID0gTlVMTDsKK3N0YXRpYyBpbnQgc3luY2xpbmttcF9hZGFwdGVyX2NvdW50ID0gLTE7CitzdGF0aWMgaW50IHN5bmNsaW5rbXBfZGV2aWNlX2NvdW50ID0gMDsKKworLyoKKyAqIFNldCB0aGlzIHBhcmFtIHRvIG5vbi16ZXJvIHRvIGxvYWQgZWF4IHdpdGggdGhlCisgKiAudGV4dCBzZWN0aW9uIGFkZHJlc3MgYW5kIGJyZWFrcG9pbnQgb24gbW9kdWxlIGxvYWQuCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgdXNlIHdpdGggZ2RiIGFuZCBhZGQtc3ltYm9sLWZpbGUgY29tbWFuZC4KKyAqLworc3RhdGljIGludCBicmVha19vbl9sb2FkPTA7CisKKy8qCisgKiBEcml2ZXIgbWFqb3IgbnVtYmVyLCBkZWZhdWx0cyB0byB6ZXJvIHRvIGdldCBhdXRvCisgKiBhc3NpZ25lZCBtYWpvciBudW1iZXIuIE1heSBiZSBmb3JjZWQgYXMgbW9kdWxlIHBhcmFtZXRlci4KKyAqLworc3RhdGljIGludCB0dHltYWpvcj0wOworCisvKgorICogQXJyYXkgb2YgdXNlciBzcGVjaWZpZWQgb3B0aW9ucyBmb3IgSVNBIGFkYXB0ZXJzLgorICovCitzdGF0aWMgaW50IGRlYnVnX2xldmVsID0gMDsKK3N0YXRpYyBpbnQgbWF4ZnJhbWVbTUFYX0RFVklDRVNdID0gezAsfTsKK3N0YXRpYyBpbnQgZG9zeW5jcHBwW01BWF9ERVZJQ0VTXSA9IHswLH07CisKK21vZHVsZV9wYXJhbShicmVha19vbl9sb2FkLCBib29sLCAwKTsKK21vZHVsZV9wYXJhbSh0dHltYWpvciwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1Z19sZXZlbCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShtYXhmcmFtZSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShkb3N5bmNwcHAsIGludCwgTlVMTCwgMCk7CisKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9ICJTeW5jTGluayBNdWx0aVBvcnQgZHJpdmVyIjsKK3N0YXRpYyBjaGFyICpkcml2ZXJfdmVyc2lvbiA9ICIkUmV2aXNpb246IDQuMzQgJCI7CisKK3N0YXRpYyBpbnQgc3luY2xpbmttcF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHZvaWQgc3luY2xpbmttcF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3luY2xpbmttcF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX01JQ1JPR0FURSwgUENJX0RFVklDRV9JRF9NSUNST0dBVEVfU0NBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMCwgfSwgLyogdGVybWluYXRlIGxpc3QgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc3luY2xpbmttcF9wY2lfdGJsKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc3luY2xpbmttcF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJzeW5jbGlua21wIiwKKwkuaWRfdGFibGUJPSBzeW5jbGlua21wX3BjaV90YmwsCisJLnByb2JlCQk9IHN5bmNsaW5rbXBfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzeW5jbGlua21wX3JlbW92ZV9vbmUpLAorfTsKKworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnNlcmlhbF9kcml2ZXI7CisKKy8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGxlZnQgaW4geG1pdCBidWZmZXIgYmVmb3JlIHdlIGFzayBmb3IgbW9yZSAqLworI2RlZmluZSBXQUtFVVBfQ0hBUlMgMjU2CisKKworLyogdHR5IGNhbGxiYWNrcyAqLworCitzdGF0aWMgaW50ICBvcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCk7CitzdGF0aWMgdm9pZCBjbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApOworc3RhdGljIHZvaWQgaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKTsKKworc3RhdGljIGludCAgd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCk7CitzdGF0aWMgdm9pZCBzZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpOworc3RhdGljIHZvaWQgd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKK3N0YXRpYyBpbnQgIHdyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBmbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIHR4X2hvbGQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCB0eF9yZWxlYXNlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworCitzdGF0aWMgaW50ICBpb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCAgcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCAgY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOworc3RhdGljIHZvaWQgdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSk7CitzdGF0aWMgdm9pZCBzZXRfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKTsKKworI2lmZGVmIENPTkZJR19IRExDCisjZGVmaW5lIGRldl90b19wb3J0KEQpIChkZXZfdG9faGRsYyhEKS0+cHJpdikKK3N0YXRpYyB2b2lkIGhkbGNkZXZfdHhfZG9uZShTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgaGRsY2Rldl9yeChTTE1QX0lORk8gKmluZm8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworc3RhdGljIGludCAgaGRsY2Rldl9pbml0KFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBoZGxjZGV2X2V4aXQoU0xNUF9JTkZPICppbmZvKTsKKyNlbmRpZgorCisvKiBpb2N0bCBoYW5kbGVycyAqLworCitzdGF0aWMgaW50ICBnZXRfc3RhdHMoU0xNUF9JTkZPICppbmZvLCBzdHJ1Y3QgbWdzbF9pY291bnQgX191c2VyICp1c2VyX2ljb3VudCk7CitzdGF0aWMgaW50ICBnZXRfcGFyYW1zKFNMTVBfSU5GTyAqaW5mbywgTUdTTF9QQVJBTVMgX191c2VyICpwYXJhbXMpOworc3RhdGljIGludCAgc2V0X3BhcmFtcyhTTE1QX0lORk8gKmluZm8sIE1HU0xfUEFSQU1TIF9fdXNlciAqcGFyYW1zKTsKK3N0YXRpYyBpbnQgIGdldF90eGlkbGUoU0xNUF9JTkZPICppbmZvLCBpbnQgX191c2VyICppZGxlX21vZGUpOworc3RhdGljIGludCAgc2V0X3R4aWRsZShTTE1QX0lORk8gKmluZm8sIGludCBpZGxlX21vZGUpOworc3RhdGljIGludCAgdHhfZW5hYmxlKFNMTVBfSU5GTyAqaW5mbywgaW50IGVuYWJsZSk7CitzdGF0aWMgaW50ICB0eF9hYm9ydChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIGludCAgcnhfZW5hYmxlKFNMTVBfSU5GTyAqaW5mbywgaW50IGVuYWJsZSk7CitzdGF0aWMgaW50ICBtYXBfc3RhdHVzKGludCBzaWduYWxzKTsKK3N0YXRpYyBpbnQgIG1vZGVtX2lucHV0X3dhaXQoU0xNUF9JTkZPICppbmZvLGludCBhcmcpOworc3RhdGljIGludCAgd2FpdF9tZ3NsX2V2ZW50KFNMTVBfSU5GTyAqaW5mbywgaW50IF9fdXNlciAqbWFza19wdHIpOworc3RhdGljIGludCAgdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCAgdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKK3N0YXRpYyB2b2lkIHNldF9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpOworCitzdGF0aWMgdm9pZCBhZGRfZGV2aWNlKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBkZXZpY2VfaW5pdChpbnQgYWRhcHRlcl9udW0sIHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3N0YXRpYyBpbnQgIGNsYWltX3Jlc291cmNlcyhTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgcmVsZWFzZV9yZXNvdXJjZXMoU0xNUF9JTkZPICppbmZvKTsKKworc3RhdGljIGludCAgc3RhcnR1cChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIGludCAgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCxTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgc2h1dGRvd24oU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIHByb2dyYW1faHcoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGNoYW5nZV9wYXJhbXMoU0xNUF9JTkZPICppbmZvKTsKKworc3RhdGljIGludCAgaW5pdF9hZGFwdGVyKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgaW50ICByZWdpc3Rlcl90ZXN0KFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgaW50ICBpcnFfdGVzdChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIGludCAgbG9vcGJhY2tfdGVzdChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIGludCAgYWRhcHRlcl90ZXN0KFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgaW50ICBtZW1vcnlfdGVzdChTTE1QX0lORk8gKmluZm8pOworCitzdGF0aWMgdm9pZCByZXNldF9hZGFwdGVyKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCByZXNldF9wb3J0KFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBhc3luY19tb2RlKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBoZGxjX21vZGUoU0xNUF9JTkZPICppbmZvKTsKKworc3RhdGljIHZvaWQgcnhfc3RvcChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgcnhfc3RhcnQoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIHJ4X3Jlc2V0X2J1ZmZlcnMoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIHJ4X2ZyZWVfZnJhbWVfYnVmZmVycyhTTE1QX0lORk8gKmluZm8sIHVuc2lnbmVkIGludCBmaXJzdCwgdW5zaWduZWQgaW50IGxhc3QpOworc3RhdGljIGludCAgcnhfZ2V0X2ZyYW1lKFNMTVBfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyB2b2lkIHR4X3N0YXJ0KFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCB0eF9zdG9wKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCB0eF9sb2FkX2ZpZm8oU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIHR4X3NldF9pZGxlKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCB0eF9sb2FkX2RtYV9idWZmZXIoU0xNUF9JTkZPICppbmZvLCBjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBjb3VudCk7CisKK3N0YXRpYyB2b2lkIGdldF9zaWduYWxzKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBzZXRfc2lnbmFscyhTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgZW5hYmxlX2xvb3BiYWNrKFNMTVBfSU5GTyAqaW5mbywgaW50IGVuYWJsZSk7CitzdGF0aWMgdm9pZCBzZXRfcmF0ZShTTE1QX0lORk8gKmluZm8sIHUzMiBkYXRhX3JhdGUpOworCitzdGF0aWMgaW50ICBiaF9hY3Rpb24oU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGJoX2hhbmRsZXIodm9pZCogQ29udGV4dCk7CitzdGF0aWMgdm9pZCBiaF9yZWNlaXZlKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBiaF90cmFuc21pdChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgYmhfc3RhdHVzKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBpc3JfdGltZXIoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGlzcl9yeGludChTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgaXNyX3J4cmR5KFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBpc3JfdHhpbnQoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGlzcl90eHJkeShTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgaXNyX3J4ZG1hb2soU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGlzcl9yeGRtYWVycm9yKFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBpc3JfdHhkbWFvayhTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgaXNyX3R4ZG1hZXJyb3IoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGlzcl9pb19waW4oU0xNUF9JTkZPICppbmZvLCB1MTYgc3RhdHVzKTsKKworc3RhdGljIGludCAgYWxsb2NfZG1hX2J1ZnMoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGZyZWVfZG1hX2J1ZnMoU0xNUF9JTkZPICppbmZvKTsKK3N0YXRpYyBpbnQgIGFsbG9jX2J1Zl9saXN0KFNMTVBfSU5GTyAqaW5mbyk7CitzdGF0aWMgaW50ICBhbGxvY19mcmFtZV9idWZzKFNMTVBfSU5GTyAqaW5mbywgU0NBREVTQyAqbGlzdCwgU0NBREVTQ19FWCAqbGlzdF9leCxpbnQgY291bnQpOworc3RhdGljIGludCAgYWxsb2NfdG1wX3J4X2J1ZihTTE1QX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgZnJlZV90bXBfcnhfYnVmKFNMTVBfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyB2b2lkIGxvYWRfcGNpX21lbW9yeShTTE1QX0lORk8gKmluZm8sIGNoYXIqIGRlc3QsIGNvbnN0IGNoYXIqIHNyYywgdW5zaWduZWQgc2hvcnQgY291bnQpOworc3RhdGljIHZvaWQgdHJhY2VfYmxvY2soU0xNUF9JTkZPICppbmZvLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgY291bnQsIGludCB4bWl0KTsKK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBjb250ZXh0KTsKK3N0YXRpYyB2b2lkIHN0YXR1c190aW1lb3V0KHVuc2lnbmVkIGxvbmcgY29udGV4dCk7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlYWRfcmVnKFNMTVBfSU5GTyAqaW5mbywgdW5zaWduZWQgY2hhciBhZGRyKTsKK3N0YXRpYyB2b2lkIHdyaXRlX3JlZyhTTE1QX0lORk8gKmluZm8sIHVuc2lnbmVkIGNoYXIgYWRkciwgdW5zaWduZWQgY2hhciB2YWwpOworc3RhdGljIHUxNiByZWFkX3JlZzE2KFNMTVBfSU5GTyAqaW5mbywgdW5zaWduZWQgY2hhciBhZGRyKTsKK3N0YXRpYyB2b2lkIHdyaXRlX3JlZzE2KFNMTVBfSU5GTyAqaW5mbywgdW5zaWduZWQgY2hhciBhZGRyLCB1MTYgdmFsKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlYWRfc3RhdHVzX3JlZyhTTE1QX0lORk8gKiBpbmZvKTsKK3N0YXRpYyB2b2lkIHdyaXRlX2NvbnRyb2xfcmVnKFNMTVBfSU5GTyAqIGluZm8pOworCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJ4X2FjdGl2ZV9maWZvX2xldmVsID0gMTY7CS8vIHJ4IHJlcXVlc3QgRklGTyBhY3RpdmF0aW9uIGxldmVsIGluIGJ5dGVzCitzdGF0aWMgdW5zaWduZWQgY2hhciB0eF9hY3RpdmVfZmlmb19sZXZlbCA9IDE2OwkvLyB0eCByZXF1ZXN0IEZJRk8gYWN0aXZhdGlvbiBsZXZlbCBpbiBieXRlcworc3RhdGljIHVuc2lnbmVkIGNoYXIgdHhfbmVnYXRlX2ZpZm9fbGV2ZWwgPSAzMjsJLy8gdHggcmVxdWVzdCBGSUZPIG5lZ2F0aW9uIGxldmVsIGluIGJ5dGVzCisKK3N0YXRpYyB1MzIgbWlzY19jdHJsX3ZhbHVlID0gMHgwMDdlNDA0MDsKK3N0YXRpYyB1MzIgbGNyMV9icmRyX3ZhbHVlID0gMHgwMDgwMDAyOTsKKworc3RhdGljIHUzMiByZWFkX2FoZWFkX2NvdW50ID0gODsKKworLyogRFBDUiwgRE1BIFByaW9yaXR5IENvbnRyb2wKKyAqCisgKiAwNy4uMDUgIE5vdCB1c2VkLCBtdXN0IGJlIDAKKyAqIDA0ICAgICAgQlJDLCBidXMgcmVsZWFzZSBjb25kaXRpb246IDA9YWxsIHRyYW5zZmVycyBjb21wbGV0ZQorICogICAgICAgICAgICAgIDE9cmVsZWFzZSBhZnRlciAxIHhmZXIgb24gYWxsIGNoYW5uZWxzCisgKiAwMyAgICAgIENDQywgY2hhbm5lbCBjaGFuZ2UgY29uZGl0aW9uOiAwPWV2ZXJ5IGN5Y2xlCisgKiAgICAgICAgICAgICAgMT1hZnRlciBlYWNoIGNoYW5uZWwgY29tcGxldGVzIGFsbCB4ZmVycworICogMDIuLjAwICBQUjwyLi4wPiwgcHJpb3JpdHkgMTAwPXJvdW5kIHJvYmluCisgKgorICogMDAwMDAxMDAgPSAweDAwCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRtYV9wcmlvcml0eSA9IDB4MDQ7CisKKy8vIE51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIHNoYXJlZCBSQU0KKy8vIGluIGEgc2luZ2xlIHdyaXRlIG9wZXJhdGlvbgorc3RhdGljIHUzMiBzY2FfcGNpX2xvYWRfaW50ZXJ2YWwgPSA2NDsKKworLyoKKyAqIDFzdCBmdW5jdGlvbiBkZWZpbmVkIGluIC50ZXh0IHNlY3Rpb24uIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbgorICogaW5pdF9tb2R1bGUoKSBmb2xsb3dlZCBieSBhIGJyZWFrcG9pbnQgYWxsb3dzIGEgcmVtb3RlIGRlYnVnZ2VyCisgKiAoZ2RiKSB0byBnZXQgdGhlIC50ZXh0IGFkZHJlc3MgZm9yIHRoZSBhZGQtc3ltYm9sLWZpbGUgY29tbWFuZC4KKyAqIFRoaXMgYWxsb3dzIHJlbW90ZSBkZWJ1Z2dpbmcgb2YgZHluYW1pY2FsbHkgbG9hZGFibGUgbW9kdWxlcy4KKyAqLworc3RhdGljIHZvaWQqIHN5bmNsaW5rbXBfZ2V0X3RleHRfcHRyKHZvaWQpOworc3RhdGljIHZvaWQqIHN5bmNsaW5rbXBfZ2V0X3RleHRfcHRyKHZvaWQpIHtyZXR1cm4gc3luY2xpbmttcF9nZXRfdGV4dF9wdHI7fQorCitzdGF0aWMgaW5saW5lIGludCBzYW5pdHlfY2hlY2soU0xNUF9JTkZPICppbmZvLAorCQkJICAgICAgIGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCit7CisjaWZkZWYgU0FOSVRZX0NIRUNLCisJc3RhdGljIGNvbnN0IGNoYXIgKmJhZG1hZ2ljID0KKwkJIldhcm5pbmc6IGJhZCBtYWdpYyBudW1iZXIgZm9yIHN5bmNsaW5rbXBfc3RydWN0ICglcykgaW4gJXNcbiI7CisJc3RhdGljIGNvbnN0IGNoYXIgKmJhZGluZm8gPQorCQkiV2FybmluZzogbnVsbCBzeW5jbGlua21wX3N0cnVjdCBmb3IgKCVzKSBpbiAlc1xuIjsKKworCWlmICghaW5mbykgeworCQlwcmludGsoYmFkaW5mbywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoaW5mby0+bWFnaWMgIT0gTUdTTF9NQUdJQykgeworCQlwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisjZWxzZQorCWlmICghaW5mbykKKwkJcmV0dXJuIDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBsaW5lIGRpc2NpcGxpbmUgY2FsbGJhY2sgd3JhcHBlcnMKKyAqCisgKiBUaGUgd3JhcHBlcnMgbWFpbnRhaW4gbGluZSBkaXNjaXBsaW5lIHJlZmVyZW5jZXMKKyAqIHdoaWxlIGNhbGxpbmcgaW50byB0aGUgbGluZSBkaXNjaXBsaW5lLgorICoKKyAqIGxkaXNjX3JlY2VpdmVfYnVmICAtIHBhc3MgcmVjZWl2ZSBkYXRhIHRvIGxpbmUgZGlzY2lwbGluZQorICovCisKK3N0YXRpYyB2b2lkIGxkaXNjX3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkgICAgICBjb25zdCBfX3U4ICpkYXRhLCBjaGFyICpmbGFncywgaW50IGNvdW50KQoreworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCWlmICghdHR5KQorCQlyZXR1cm47CisJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaWYgKGxkKSB7CisJCWlmIChsZC0+cmVjZWl2ZV9idWYpCisJCQlsZC0+cmVjZWl2ZV9idWYodHR5LCBkYXRhLCBmbGFncywgY291bnQpOworCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCX0KK30KKworLyogdHR5IGNhbGxiYWNrcyAqLworCisvKiBDYWxsZWQgd2hlbiBhIHBvcnQgaXMgb3BlbmVkLiAgSW5pdCBhbmQgZW5hYmxlIHBvcnQuCisgKi8KK3N0YXRpYyBpbnQgb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlTTE1QX0lORk8gKmluZm87CisJaW50IHJldHZhbCwgbGluZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbGluZSA9IHR0eS0+aW5kZXg7CisJaWYgKChsaW5lIDwgMCkgfHwgKGxpbmUgPj0gc3luY2xpbmttcF9kZXZpY2VfY291bnQpKSB7CisJCXByaW50aygiJXMoJWQpOiBvcGVuIHdpdGggaW52YWxpZCBsaW5lICMlZC5cbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxsaW5lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaW5mbyA9IHN5bmNsaW5rbXBfZGV2aWNlX2xpc3Q7CisJd2hpbGUoaW5mbyAmJiBpbmZvLT5saW5lICE9IGxpbmUpCisJCWluZm8gPSBpbmZvLT5uZXh0X2RldmljZTsKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm9wZW4iKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCBpbmZvLT5pbml0X2Vycm9yICkgeworCQlwcmludGsoIiVzKCVkKTolcyBkZXZpY2UgaXMgbm90IGFsbG9jYXRlZCwgaW5pdCBlcnJvcj0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLGluZm8tPmluaXRfZXJyb3IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKKwlpbmZvLT50dHkgPSB0dHk7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgb3BlbigpLCBvbGQgcmVmIGNvdW50ID0gJWRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sdHR5LT5kcml2ZXItPm5hbWUsIGluZm8tPmNvdW50KTsKKworCS8qIElmIHBvcnQgaXMgY2xvc2luZywgc2lnbmFsIGNhbGxlciB0byB0cnkgYWdhaW4gKi8KKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCBpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpeworCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKQorCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCXJldHZhbCA9ICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSA/CisJCQktRUFHQUlOIDogLUVSRVNUQVJUU1lTKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJaWYgKGluZm8tPm5ldGNvdW50KSB7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlnb3RvIGNsZWFudXA7CisJfQorCWluZm8tPmNvdW50Kys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCisJaWYgKGluZm8tPmNvdW50ID09IDEpIHsKKwkJLyogMXN0IG9wZW4gb24gdGhpcyBkZXZpY2UsIGluaXQgaGFyZHdhcmUgKi8KKwkJcmV0dmFsID0gc3RhcnR1cChpbmZvKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlnb3RvIGNsZWFudXA7CisJfQorCisJcmV0dmFsID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgaW5mbyk7CisJaWYgKHJldHZhbCkgeworCQlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJCXByaW50aygiJXMoJWQpOiVzIGJsb2NrX3RpbF9yZWFkeSgpIHJldHVybmVkICVkXG4iLAorCQkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIHJldHZhbCk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgb3BlbigpIHN1Y2Nlc3NcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lKTsKKwlyZXR2YWwgPSAwOworCitjbGVhbnVwOgorCWlmIChyZXR2YWwpIHsKKwkJaWYgKHR0eS0+Y291bnQgPT0gMSkKKwkJCWluZm8tPnR0eSA9IE5VTEw7IC8qIHR0eSBsYXllciB3aWxsIHJlbGVhc2UgdHR5IHN0cnVjdCAqLworCQlpZihpbmZvLT5jb3VudCkKKwkJCWluZm8tPmNvdW50LS07CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogQ2FsbGVkIHdoZW4gcG9ydCBpcyBjbG9zZWQuIFdhaXQgZm9yIHJlbWFpbmluZyBkYXRhIHRvIGJlCisgKiBzZW50LiBEaXNhYmxlIHBvcnQgYW5kIGZyZWUgcmVzb3VyY2VzLgorICovCitzdGF0aWMgdm9pZCBjbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlTTE1QX0lORk8gKiBpbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImNsb3NlIikpCisJCXJldHVybjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyBjbG9zZSgpIGVudHJ5LCBjb3VudD0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPmNvdW50KTsKKworCWlmICghaW5mby0+Y291bnQpCisJCXJldHVybjsKKworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKGluZm8tPmNvdW50ICE9IDEpKSB7CisJCS8qCisJCSAqIHR0eS0+Y291bnQgaXMgMSBhbmQgdGhlIHR0eSBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4KKwkJICogaW5mby0+Y291bnQgc2hvdWxkIGJlIG9uZSBpbiB0aGlzIGNhc2UuCisJCSAqIGlmIGl0J3Mgbm90LCBjb3JyZWN0IGl0IHNvIHRoYXQgdGhlIHBvcnQgaXMgc2h1dGRvd24uCisJCSAqLworCQlwcmludGsoIiVzKCVkKTolcyBjbG9zZTogYmFkIHJlZmNvdW50OyB0dHktPmNvdW50IGlzIDEsICIKKwkJICAgICAgICJpbmZvLT5jb3VudCBpcyAlZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPmNvdW50KTsKKwkJaW5mby0+Y291bnQgPSAxOworCX0KKworCWluZm8tPmNvdW50LS07CisKKwkvKiBpZiBhdCBsZWFzdCBvbmUgb3BlbiByZW1haW5pbmcsIGxlYXZlIGhhcmR3YXJlIGFjdGl2ZSAqLworCWlmIChpbmZvLT5jb3VudCkKKwkJZ290byBjbGVhbnVwOworCisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKworCS8qIHNldCB0dHktPmNsb3NpbmcgdG8gbm90aWZ5IGxpbmUgZGlzY2lwbGluZSB0bworCSAqIG9ubHkgcHJvY2VzcyBYT04vWE9GRiBjaGFyYWN0ZXJzLiBPbmx5IHRoZSBOX1RUWQorCSAqIGRpc2NpcGxpbmUgYXBwZWFycyB0byB1c2UgdGhpcyAocHBwIGRvZXMgbm90KS4KKwkgKi8KKwl0dHktPmNsb3NpbmcgPSAxOworCisJLyogd2FpdCBmb3IgdHJhbnNtaXQgZGF0YSB0byBjbGVhciBhbGwgbGF5ZXJzICovCisKKwlpZiAoaW5mby0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKSB7CisJCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQkJcHJpbnRrKCIlcyglZCk6JXMgY2xvc2UoKSBjYWxsaW5nIHR0eV93YWl0X3VudGlsX3NlbnRcbiIsCisJCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+Y2xvc2luZ193YWl0KTsKKwl9CisKKyAJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpCisgCQl3YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT50aW1lb3V0KTsKKworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKworCXNodXRkb3duKGluZm8pOworCisJdHR5LT5jbG9zaW5nID0gMDsKKwlpbmZvLT50dHkgPSBOVUxMOworCisJaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgeworCQlpZiAoaW5mby0+Y2xvc2VfZGVsYXkpIHsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoaW5mby0+Y2xvc2VfZGVsYXkpKTsKKwkJfQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJfQorCisJaW5mby0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFfEFTWU5DX0NMT1NJTkcpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5jbG9zZV93YWl0KTsKKworY2xlYW51cDoKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgY2xvc2UoKSBleGl0LCBjb3VudD0lZFxuIiwgX19GSUxFX18sX19MSU5FX18sCisJCQl0dHktPmRyaXZlci0+bmFtZSwgaW5mby0+Y291bnQpOworfQorCisvKiBDYWxsZWQgYnkgdHR5X2hhbmd1cCgpIHdoZW4gYSBoYW5ndXAgaXMgc2lnbmFsZWQuCisgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNsb3NpbmcgYWxsIG9wZW4gZGVzY3JpcHRvcnMgZm9yIHRoZSBwb3J0LgorICovCitzdGF0aWMgdm9pZCBoYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlTTE1QX0lORk8gKmluZm8gPSAoU0xNUF9JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyBoYW5ndXAoKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiaGFuZ3VwIikpCisJCXJldHVybjsKKworCWZsdXNoX2J1ZmZlcih0dHkpOworCXNodXRkb3duKGluZm8pOworCisJaW5mby0+Y291bnQgPSAwOworCWluZm8tPmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOworCWluZm8tPnR0eSA9IE5VTEw7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9CisKKy8qIFNldCBuZXcgdGVybWlvcyBzZXR0aW5ncworICovCitzdGF0aWMgdm9pZCBzZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJU0xNUF9JTkZPICppbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyBzZXRfdGVybWlvcygpXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKKwkJCXR0eS0+ZHJpdmVyLT5uYW1lICk7CisKKwkvKiBqdXN0IHJldHVybiBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkICovCisJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCisJICAgICYmIChSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpCisJCT09IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpCisJICByZXR1cm47CisKKwljaGFuZ2VfcGFyYW1zKGluZm8pOworCisJLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCisJaWYgKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQgJiYKKwkgICAgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpIHsKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gfihTZXJpYWxTaWduYWxfUlRTICsgU2VyaWFsU2lnbmFsX0RUUik7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkgCXNldF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl9CisKKwkvKiBIYW5kbGUgdHJhbnNpdGlvbiBhd2F5IGZyb20gQjAgc3RhdHVzICovCisJaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYKKwkgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpIHsKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RUUjsKKyAJCWlmICghKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHx8CisgCQkgICAgIXRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSkgeworCQkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUzsKKyAJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCSAJc2V0X3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KKworCS8qIEhhbmRsZSB0dXJuaW5nIG9mZiBDUlRTQ1RTICovCisJaWYgKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUyAmJgorCSAgICAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCXR4X3JlbGVhc2UodHR5KTsKKwl9Cit9CisKKy8qIFNlbmQgYSBibG9jayBvZiBkYXRhCisgKgorICogQXJndW1lbnRzOgorICoKKyAqIAl0dHkJCXBvaW50ZXIgdG8gdHR5IGluZm9ybWF0aW9uIHN0cnVjdHVyZQorICogCWJ1ZgkJcG9pbnRlciB0byBidWZmZXIgY29udGFpbmluZyBzZW5kIGRhdGEKKyAqIAljb3VudAkJc2l6ZSBvZiBzZW5kIGRhdGEgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm4gVmFsdWU6CW51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4KKyAqLworc3RhdGljIGludCB3cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50CWMsIHJldCA9IDA7CisJU0xNUF9JTkZPICppbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyB3cml0ZSgpIGNvdW50PSVkXG4iLAorCQkgICAgICAgX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsY291bnQpOworCisJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJ3cml0ZSIpKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpIHsKKwkJaWYgKGNvdW50ID4gaW5mby0+bWF4X2ZyYW1lX3NpemUpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJaWYgKGluZm8tPnR4X2FjdGl2ZSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJaWYgKGluZm8tPnR4X2NvdW50KSB7CisJCQkvKiBzZW5kIGFjY3VtdWxhdGVkIGRhdGEgZnJvbSBzZW5kX2NoYXIoKSBjYWxscyAqLworCQkJLyogYXMgZnJhbWUgYW5kIHdhaXQgYmVmb3JlIGFjY2VwdGluZyBtb3JlIGRhdGEuICovCisJCQl0eF9sb2FkX2RtYV9idWZmZXIoaW5mbywgaW5mby0+dHhfYnVmLCBpbmZvLT50eF9jb3VudCk7CisJCQlnb3RvIHN0YXJ0OworCQl9CisJCXJldCA9IGluZm8tPnR4X2NvdW50ID0gY291bnQ7CisJCXR4X2xvYWRfZG1hX2J1ZmZlcihpbmZvLCBidWYsIGNvdW50KTsKKwkJZ290byBzdGFydDsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWMgPSBtaW5fdChpbnQsIGNvdW50LAorCQkJbWluKGluZm8tPm1heF9mcmFtZV9zaXplIC0gaW5mby0+dHhfY291bnQgLSAxLAorCQkJICAgIGluZm8tPm1heF9mcmFtZV9zaXplIC0gaW5mby0+dHhfcHV0KSk7CisJCWlmIChjIDw9IDApCisJCQlicmVhazsKKwkJCQorCQltZW1jcHkoaW5mby0+dHhfYnVmICsgaW5mby0+dHhfcHV0LCBidWYsIGMpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaW5mby0+dHhfcHV0ICs9IGM7CisJCWlmIChpbmZvLT50eF9wdXQgPj0gaW5mby0+bWF4X2ZyYW1lX3NpemUpCisJCQlpbmZvLT50eF9wdXQgLT0gaW5mby0+bWF4X2ZyYW1lX3NpemU7CisJCWluZm8tPnR4X2NvdW50ICs9IGM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJCWJ1ZiArPSBjOworCQljb3VudCAtPSBjOworCQlyZXQgKz0gYzsKKwl9CisKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpIHsKKwkJaWYgKGNvdW50KSB7CisJCQlyZXQgPSBpbmZvLT50eF9jb3VudCA9IDA7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJdHhfbG9hZF9kbWFfYnVmZmVyKGluZm8sIGluZm8tPnR4X2J1ZiwgaW5mby0+dHhfY291bnQpOworCX0KK3N0YXJ0OgorIAlpZiAoaW5mby0+dHhfY291bnQgJiYgIXR0eS0+c3RvcHBlZCAmJiAhdHR5LT5od19zdG9wcGVkKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaWYgKCFpbmZvLT50eF9hY3RpdmUpCisJCSAJdHhfc3RhcnQoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworIAl9CisKK2NsZWFudXA6CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50ayggIiVzKCVkKTolcyB3cml0ZSgpIHJldHVybmluZz0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyogQWRkIGEgY2hhcmFjdGVyIHRvIHRoZSB0cmFuc21pdCBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIHB1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJU0xNUF9JTkZPICppbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApIHsKKwkJcHJpbnRrKCAiJXMoJWQpOiVzIHB1dF9jaGFyKCVkKVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLGNoKTsKKwl9CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInB1dF9jaGFyIikpCisJCXJldHVybjsKKworCWlmICghdHR5IHx8ICFpbmZvLT50eF9idWYpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCWlmICggKGluZm8tPnBhcmFtcy5tb2RlICE9IE1HU0xfTU9ERV9IRExDKSB8fAorCSAgICAgIWluZm8tPnR4X2FjdGl2ZSApIHsKKworCQlpZiAoaW5mby0+dHhfY291bnQgPCBpbmZvLT5tYXhfZnJhbWVfc2l6ZSAtIDEpIHsKKwkJCWluZm8tPnR4X2J1ZltpbmZvLT50eF9wdXQrK10gPSBjaDsKKwkJCWlmIChpbmZvLT50eF9wdXQgPj0gaW5mby0+bWF4X2ZyYW1lX3NpemUpCisJCQkJaW5mby0+dHhfcHV0IC09IGluZm8tPm1heF9mcmFtZV9zaXplOworCQkJaW5mby0+dHhfY291bnQrKzsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworfQorCisvKiBTZW5kIGEgaGlnaC1wcmlvcml0eSBYT04vWE9GRiBjaGFyYWN0ZXIKKyAqLworc3RhdGljIHZvaWQgc2VuZF94Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKQoreworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgc2VuZF94Y2hhciglZClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCBjaCApOworCisJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJzZW5kX3hjaGFyIikpCisJCXJldHVybjsKKworCWluZm8tPnhfY2hhciA9IGNoOworCWlmIChjaCkgeworCQkvKiBNYWtlIHN1cmUgdHJhbnNtaXQgaW50ZXJydXB0cyBhcmUgb24gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlpZiAoIWluZm8tPnR4X2VuYWJsZWQpCisJCSAJdHhfc3RhcnQoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KK30KKworLyogV2FpdCB1bnRpbCB0aGUgdHJhbnNtaXR0ZXIgaXMgZW1wdHkuCisgKi8KK3N0YXRpYyB2b2lkIHdhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKK3sKKwlTTE1QX0lORk8gKiBpbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMsIGNoYXJfdGltZTsKKworCWlmICghaW5mbyApCisJCXJldHVybjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyB3YWl0X3VudGlsX3NlbnQoKSBlbnRyeVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAid2FpdF91bnRpbF9zZW50IikpCisJCXJldHVybjsKKworCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQorCQlnb3RvIGV4aXQ7CisKKwlvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworCisJLyogU2V0IGNoZWNrIGludGVydmFsIHRvIDEvNSBvZiBlc3RpbWF0ZWQgdGltZSB0bworCSAqIHNlbmQgYSBjaGFyYWN0ZXIsIGFuZCBtYWtlIGl0IGF0IGxlYXN0IDEuIFRoZSBjaGVjaworCSAqIGludGVydmFsIHNob3VsZCBhbHNvIGJlIGxlc3MgdGhhbiB0aGUgdGltZW91dC4KKwkgKiBOb3RlOiB1c2UgdGlnaHQgdGltaW5ncyBoZXJlIHRvIHNhdGlzZnkgdGhlIE5JU1QtUENUUy4KKwkgKi8KKworCWlmICggaW5mby0+cGFyYW1zLmRhdGFfcmF0ZSApIHsKKwkgICAgICAgCWNoYXJfdGltZSA9IGluZm8tPnRpbWVvdXQvKDMyICogNSk7CisJCWlmICghY2hhcl90aW1lKQorCQkJY2hhcl90aW1lKys7CisJfSBlbHNlCisJCWNoYXJfdGltZSA9IDE7CisKKwlpZiAodGltZW91dCkKKwkJY2hhcl90aW1lID0gbWluX3QodW5zaWduZWQgbG9uZywgY2hhcl90aW1lLCB0aW1lb3V0KTsKKworCWlmICggaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMgKSB7CisJCXdoaWxlIChpbmZvLT50eF9hY3RpdmUpIHsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hhcl90aW1lKSk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJYnJlYWs7CisJCQlpZiAodGltZW91dCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArIHRpbWVvdXQpKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLy9UT0RPOiBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHNpbWlsYXIgdG8gVVNDMTZDMzIKKwkJLy8gCVRYU1RBVFVTX0FMTF9TRU5UIHN0YXR1cworCQl3aGlsZSAoIGluZm8tPnR4X2FjdGl2ZSAmJiBpbmZvLT50eF9lbmFibGVkKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGNoYXJfdGltZSkpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWJyZWFrOworCQkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCQlicmVhazsKKwkJfQorCX0KKworZXhpdDoKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgd2FpdF91bnRpbF9zZW50KCkgZXhpdFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKK30KKworLyogUmV0dXJuIHRoZSBjb3VudCBvZiBmcmVlIGJ5dGVzIGluIHRyYW5zbWl0IGJ1ZmZlcgorICovCitzdGF0aWMgaW50IHdyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlTTE1QX0lORk8gKmluZm8gPSAoU0xNUF9JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJ3cml0ZV9yb29tIikpCisJCXJldHVybiAwOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCXJldCA9IChpbmZvLT50eF9hY3RpdmUpID8gMCA6IEhETENfTUFYX0ZSQU1FX1NJWkU7CisJfSBlbHNlIHsKKwkJcmV0ID0gaW5mby0+bWF4X2ZyYW1lX3NpemUgLSBpbmZvLT50eF9jb3VudCAtIDE7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0ID0gMDsKKwl9CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgd3JpdGVfcm9vbSgpPSVkXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGVuYWJsZSB0cmFuc21pdHRlciBhbmQgc2VuZCByZW1haW5pbmcgYnVmZmVyZWQgY2hhcmFjdGVycworICovCitzdGF0aWMgdm9pZCBmbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoICIlcyglZCk6JXMgZmx1c2hfY2hhcnMoKSBlbnRyeSB0eF9jb3VudD0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLGluZm8tPnR4X2NvdW50KTsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiZmx1c2hfY2hhcnMiKSkKKwkJcmV0dXJuOworCisJaWYgKGluZm8tPnR4X2NvdW50IDw9IDAgfHwgdHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCB8fAorCSAgICAhaW5mby0+dHhfYnVmKQorCQlyZXR1cm47CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoICIlcyglZCk6JXMgZmx1c2hfY2hhcnMoKSBlbnRyeSwgc3RhcnRpbmcgdHJhbnNtaXR0ZXJcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJaWYgKCFpbmZvLT50eF9hY3RpdmUpIHsKKwkJaWYgKCAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpICYmCisJCQlpbmZvLT50eF9jb3VudCApIHsKKwkJCS8qIG9wZXJhdGluZyBpbiBzeW5jaHJvbm91cyAoZnJhbWUgb3JpZW50ZWQpIG1vZGUgKi8KKwkJCS8qIGNvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIHR4X2J1ZiB0byAqLworCQkJLyogdHJhbnNtaXQgRE1BIGJ1ZmZlci4gKi8KKwkJCXR4X2xvYWRfZG1hX2J1ZmZlcihpbmZvLAorCQkJCSBpbmZvLT50eF9idWYsaW5mby0+dHhfY291bnQpOworCQl9CisJIAl0eF9zdGFydChpbmZvKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKK30KKworLyogRGlzY2FyZCBhbGwgZGF0YSBpbiB0aGUgc2VuZCBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJU0xNUF9JTkZPICppbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyBmbHVzaF9idWZmZXIoKSBlbnRyeVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiZmx1c2hfYnVmZmVyIikpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpbmZvLT50eF9jb3VudCA9IGluZm8tPnR4X3B1dCA9IGluZm8tPnR4X2dldCA9IDA7CisJZGVsX3RpbWVyKCZpbmZvLT50eF90aW1lcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJdHR5X3dha2V1cCh0dHkpOworfQorCisvKiB0aHJvdHRsZSAoc3RvcCkgdHJhbnNtaXR0ZXIKKyAqLworc3RhdGljIHZvaWQgdHhfaG9sZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInR4X2hvbGQiKSkKKwkJcmV0dXJuOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCIlcyglZCk6JXMgdHhfaG9sZCgpXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmIChpbmZvLT50eF9lbmFibGVkKQorCSAJdHhfc3RvcChpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKK30KKworLyogcmVsZWFzZSAoc3RhcnQpIHRyYW5zbWl0dGVyCisgKi8KK3N0YXRpYyB2b2lkIHR4X3JlbGVhc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlTTE1QX0lORk8gKmluZm8gPSAoU0xNUF9JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJ0eF9yZWxlYXNlIikpCisJCXJldHVybjsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50aygiJXMoJWQpOiVzIHR4X3JlbGVhc2UoKVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoIWluZm8tPnR4X2VuYWJsZWQpCisJIAl0eF9zdGFydChpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKK30KKworLyogU2VydmljZSBhbiBJT0NUTCByZXF1ZXN0CisgKgorICogQXJndW1lbnRzOgorICoKKyAqIAl0dHkJcG9pbnRlciB0byB0dHkgaW5zdGFuY2UgZGF0YQorICogCWZpbGUJcG9pbnRlciB0byBhc3NvY2lhdGVkIGZpbGUgb2JqZWN0IGZvciBkZXZpY2UKKyAqIAljbWQJSU9DVEwgY29tbWFuZCBjb2RlCisgKiAJYXJnCWNvbW1hbmQgYXJndW1lbnQvY29udGV4dAorICoKKyAqIFJldHVybiBWYWx1ZToJMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGlvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJU0xNUF9JTkZPICppbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IGVycm9yOworCXN0cnVjdCBtZ3NsX2ljb3VudCBjbm93OwkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLworCXN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IF9fdXNlciAqcF9jdXNlcjsJLyogdXNlciBzcGFjZSAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgaW9jdGwoKSBjbWQ9JTA4WFxuIiwgX19GSUxFX18sX19MSU5FX18sCisJCQlpbmZvLT5kZXZpY2VfbmFtZSwgY21kICk7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImlvY3RsIikpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCisJICAgIChjbWQgIT0gVElPQ01JV0FJVCkgJiYgKGNtZCAhPSBUSU9DR0lDT1VOVCkpIHsKKwkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQkgICAgcmV0dXJuIC1FSU87CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE1HU0xfSU9DR1BBUkFNUzoKKwkJcmV0dXJuIGdldF9wYXJhbXMoaW5mbywgYXJncCk7CisJY2FzZSBNR1NMX0lPQ1NQQVJBTVM6CisJCXJldHVybiBzZXRfcGFyYW1zKGluZm8sIGFyZ3ApOworCWNhc2UgTUdTTF9JT0NHVFhJRExFOgorCQlyZXR1cm4gZ2V0X3R4aWRsZShpbmZvLCBhcmdwKTsKKwljYXNlIE1HU0xfSU9DU1RYSURMRToKKwkJcmV0dXJuIHNldF90eGlkbGUoaW5mbywgKGludClhcmcpOworCWNhc2UgTUdTTF9JT0NUWEVOQUJMRToKKwkJcmV0dXJuIHR4X2VuYWJsZShpbmZvLCAoaW50KWFyZyk7CisJY2FzZSBNR1NMX0lPQ1JYRU5BQkxFOgorCQlyZXR1cm4gcnhfZW5hYmxlKGluZm8sIChpbnQpYXJnKTsKKwljYXNlIE1HU0xfSU9DVFhBQk9SVDoKKwkJcmV0dXJuIHR4X2Fib3J0KGluZm8pOworCWNhc2UgTUdTTF9JT0NHU1RBVFM6CisJCXJldHVybiBnZXRfc3RhdHMoaW5mbywgYXJncCk7CisJY2FzZSBNR1NMX0lPQ1dBSVRFVkVOVDoKKwkJcmV0dXJuIHdhaXRfbWdzbF9ldmVudChpbmZvLCBhcmdwKTsKKwljYXNlIE1HU0xfSU9DTE9PUFRYRE9ORToKKwkJcmV0dXJuIDA7IC8vIFRPRE86IE5vdCBzdXBwb3J0ZWQsIG5lZWQgdG8gZG9jdW1lbnQKKwkJLyogV2FpdCBmb3IgbW9kZW0gaW5wdXQgKERDRCxSSSxEU1IsQ1RTKSBjaGFuZ2UKKwkJICogYXMgc3BlY2lmaWVkIGJ5IG1hc2sgaW4gYXJnIChUSU9DTV9STkcvRFNSL0NEL0NUUykKKwkJICovCisJY2FzZSBUSU9DTUlXQUlUOgorCQlyZXR1cm4gbW9kZW1faW5wdXRfd2FpdChpbmZvLChpbnQpYXJnKTsKKwkJCisJCS8qCisJCSAqIEdldCBjb3VudGVyIG9mIGlucHV0IHNlcmlhbCBsaW5lIGludGVycnVwdHMgKERDRCxSSSxEU1IsQ1RTKQorCQkgKiBSZXR1cm46IHdyaXRlIGNvdW50ZXJzIHRvIHRoZSB1c2VyIHBhc3NlZCBjb3VudGVyIHN0cnVjdAorCQkgKiBOQjogYm90aCAxLT4wIGFuZCAwLT4xIHRyYW5zaXRpb25zIGFyZSBjb3VudGVkIGV4Y2VwdCBmb3IKKwkJICogICAgIFJJIHdoZXJlIG9ubHkgMC0+MSBpcyBjb3VudGVkLgorCQkgKi8KKwljYXNlIFRJT0NHSUNPVU5UOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlwX2N1c2VyID0gYXJncDsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5jdHMsICZwX2N1c2VyLT5jdHMpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5kc3IsICZwX2N1c2VyLT5kc3IpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5ybmcsICZwX2N1c2VyLT5ybmcpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5kY2QsICZwX2N1c2VyLT5kY2QpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5yeCwgJnBfY3VzZXItPnJ4KTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cudHgsICZwX2N1c2VyLT50eCk7CisJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQlQVVRfVVNFUihlcnJvcixjbm93LmZyYW1lLCAmcF9jdXNlci0+ZnJhbWUpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5vdmVycnVuLCAmcF9jdXNlci0+b3ZlcnJ1bik7CisJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQlQVVRfVVNFUihlcnJvcixjbm93LnBhcml0eSwgJnBfY3VzZXItPnBhcml0eSk7CisJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQlQVVRfVVNFUihlcnJvcixjbm93LmJyaywgJnBfY3VzZXItPmJyayk7CisJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQlQVVRfVVNFUihlcnJvcixjbm93LmJ1Zl9vdmVycnVuLCAmcF9jdXNlci0+YnVmX292ZXJydW4pOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAvcHJvYyBmcyByb3V0aW5lcy4uLi4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBsaW5lX2luZm8oY2hhciAqYnVmLCBTTE1QX0lORk8gKmluZm8pCit7CisJY2hhcglzdGF0X2J1ZlszMF07CisJaW50CXJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmV0ID0gc3ByaW50ZihidWYsICIlczogU0NBQmFzZT0lMDh4IE1lbT0lMDhYIFN0YXR1c0NvbnRyb2w9JTA4eCBMQ1I9JTA4WFxuIgorCQkgICAgICAgIlx0SVJRPSVkIE1heEZyYW1lU2l6ZT0ldVxuIiwKKwkJaW5mby0+ZGV2aWNlX25hbWUsCisJCWluZm8tPnBoeXNfc2NhX2Jhc2UsCisJCWluZm8tPnBoeXNfbWVtb3J5X2Jhc2UsCisJCWluZm8tPnBoeXNfc3RhdGN0cmxfYmFzZSwKKwkJaW5mby0+cGh5c19sY3JfYmFzZSwKKwkJaW5mby0+aXJxX2xldmVsLAorCQlpbmZvLT5tYXhfZnJhbWVfc2l6ZSApOworCisJLyogb3V0cHV0IGN1cnJlbnQgc2VyaWFsIHNpZ25hbCBzdGF0ZXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisgCWdldF9zaWduYWxzKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJc3RhdF9idWZbMF0gPSAwOworCXN0YXRfYnVmWzFdID0gMDsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUlRTKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8UlRTIik7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0NUUykKKwkJc3RyY2F0KHN0YXRfYnVmLCAifENUUyIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EVFIpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxEVFIiKTsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFNSKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8RFNSIik7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCkKKwkJc3RyY2F0KHN0YXRfYnVmLCAifENEIik7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JJKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8UkkiKTsKKworCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykgeworCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiXHRIRExDIHR4b2s6JWQgcnhvazolZCIsCisJCQkgICAgICBpbmZvLT5pY291bnQudHhvaywgaW5mby0+aWNvdW50LnJ4b2spOworCQlpZiAoaW5mby0+aWNvdW50LnR4dW5kZXIpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHR4dW5kZXI6JWQiLCBpbmZvLT5pY291bnQudHh1bmRlcik7CisJCWlmIChpbmZvLT5pY291bnQudHhhYm9ydCkKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgdHhhYm9ydDolZCIsIGluZm8tPmljb3VudC50eGFib3J0KTsKKwkJaWYgKGluZm8tPmljb3VudC5yeHNob3J0KQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiByeHNob3J0OiVkIiwgaW5mby0+aWNvdW50LnJ4c2hvcnQpOworCQlpZiAoaW5mby0+aWNvdW50LnJ4bG9uZykKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgcnhsb25nOiVkIiwgaW5mby0+aWNvdW50LnJ4bG9uZyk7CisJCWlmIChpbmZvLT5pY291bnQucnhvdmVyKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiByeG92ZXI6JWQiLCBpbmZvLT5pY291bnQucnhvdmVyKTsKKwkJaWYgKGluZm8tPmljb3VudC5yeGNyYykKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgcnhsb25nOiVkIiwgaW5mby0+aWNvdW50LnJ4Y3JjKTsKKwl9IGVsc2UgeworCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiXHRBU1lOQyB0eDolZCByeDolZCIsCisJCQkgICAgICBpbmZvLT5pY291bnQudHgsIGluZm8tPmljb3VudC5yeCk7CisJCWlmIChpbmZvLT5pY291bnQuZnJhbWUpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIGZlOiVkIiwgaW5mby0+aWNvdW50LmZyYW1lKTsKKwkJaWYgKGluZm8tPmljb3VudC5wYXJpdHkpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHBlOiVkIiwgaW5mby0+aWNvdW50LnBhcml0eSk7CisJCWlmIChpbmZvLT5pY291bnQuYnJrKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBicms6JWQiLCBpbmZvLT5pY291bnQuYnJrKTsKKwkJaWYgKGluZm8tPmljb3VudC5vdmVycnVuKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBvZTolZCIsIGluZm8tPmljb3VudC5vdmVycnVuKTsKKwl9CisKKwkvKiBBcHBlbmQgc2VyaWFsIHNpZ25hbCBzdGF0dXMgdG8gZW5kICovCisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiAlc1xuIiwgc3RhdF9idWYrMSk7CisKKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiXHR0eGFjdGl2ZT0lZCBiaF9yZXE9JWQgYmhfcnVuPSVkIHBlbmRpbmdfYmg9JXhcbiIsCisJIGluZm8tPnR4X2FjdGl2ZSxpbmZvLT5iaF9yZXF1ZXN0ZWQsaW5mby0+YmhfcnVubmluZywKKwkgaW5mby0+cGVuZGluZ19iaCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBDYWxsZWQgdG8gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgZGV2aWNlcworICovCitpbnQgcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCisJICAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IDAsIGw7CisJb2ZmX3QJYmVnaW4gPSAwOworCVNMTVBfSU5GTyAqaW5mbzsKKworCWxlbiArPSBzcHJpbnRmKHBhZ2UsICJzeW5jbGlua21wIGRyaXZlcjolc1xuIiwgZHJpdmVyX3ZlcnNpb24pOworCisJaW5mbyA9IHN5bmNsaW5rbXBfZGV2aWNlX2xpc3Q7CisJd2hpbGUoIGluZm8gKSB7CisJCWwgPSBsaW5lX2luZm8ocGFnZSArIGxlbiwgaW5mbyk7CisJCWxlbiArPSBsOworCQlpZiAobGVuK2JlZ2luID4gb2ZmK2NvdW50KQorCQkJZ290byBkb25lOworCQlpZiAobGVuK2JlZ2luIDwgb2ZmKSB7CisJCQliZWdpbiArPSBsZW47CisJCQlsZW4gPSAwOworCQl9CisJCWluZm8gPSBpbmZvLT5uZXh0X2RldmljZTsKKwl9CisKKwkqZW9mID0gMTsKK2RvbmU6CisJaWYgKG9mZiA+PSBsZW4rYmVnaW4pCisJCXJldHVybiAwOworCSpzdGFydCA9IHBhZ2UgKyAob2ZmLWJlZ2luKTsKKwlyZXR1cm4gKChjb3VudCA8IGJlZ2luK2xlbi1vZmYpID8gY291bnQgOiBiZWdpbitsZW4tb2ZmKTsKK30KKworLyogUmV0dXJuIHRoZSBjb3VudCBvZiBieXRlcyBpbiB0cmFuc21pdCBidWZmZXIKKyAqLworc3RhdGljIGludCBjaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlTTE1QX0lORk8gKmluZm8gPSAoU0xNUF9JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY2hhcnNfaW5fYnVmZmVyIikpCisJCXJldHVybiAwOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIGNoYXJzX2luX2J1ZmZlcigpPSVkXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+dHhfY291bnQpOworCisJcmV0dXJuIGluZm8tPnR4X2NvdW50OworfQorCisvKiBTaWduYWwgcmVtb3RlIGRldmljZSB0byB0aHJvdHRsZSBzZW5kIGRhdGEgKG91ciByZWNlaXZlIGRhdGEpCisgKi8KK3N0YXRpYyB2b2lkIHRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgdGhyb3R0bGUoKSBlbnRyeVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAidGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCisJaWYgKElfSVhPRkYodHR5KSkKKwkJc2VuZF94Y2hhcih0dHksIFNUT1BfQ0hBUih0dHkpKTsKKworIAlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfUlRTOworCSAJc2V0X3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KK30KKworLyogU2lnbmFsIHJlbW90ZSBkZXZpY2UgdG8gc3RvcCB0aHJvdHRsaW5nIHNlbmQgZGF0YSAob3VyIHJlY2VpdmUgZGF0YSkKKyAqLworc3RhdGljIHZvaWQgdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlTTE1QX0lORk8gKmluZm8gPSAoU0xNUF9JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHVudGhyb3R0bGUoKSBlbnRyeVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAidW50aHJvdHRsZSIpKQorCQlyZXR1cm47CisKKwlpZiAoSV9JWE9GRih0dHkpKSB7CisJCWlmIChpbmZvLT54X2NoYXIpCisJCQlpbmZvLT54X2NoYXIgPSAwOworCQllbHNlCisJCQlzZW5kX3hjaGFyKHR0eSwgU1RBUlRfQ0hBUih0dHkpKTsKKwl9CisKKyAJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTOworCSAJc2V0X3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KK30KKworLyogc2V0IG9yIGNsZWFyIHRyYW5zbWl0IGJyZWFrIGNvbmRpdGlvbgorICogYnJlYWtfc3RhdGUJLTE9c2V0IGJyZWFrIGNvbmRpdGlvbiwgMD1jbGVhcgorICovCitzdGF0aWMgdm9pZCBzZXRfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCXVuc2lnbmVkIGNoYXIgUmVnVmFsdWU7CisJU0xNUF9JTkZPICogaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgc2V0X2JyZWFrKCVkKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIGJyZWFrX3N0YXRlKTsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAic2V0X2JyZWFrIikpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlSZWdWYWx1ZSA9IHJlYWRfcmVnKGluZm8sIENUTCk7CisgCWlmIChicmVha19zdGF0ZSA9PSAtMSkKKwkJUmVnVmFsdWUgfD0gQklUMzsKKwllbHNlCisJCVJlZ1ZhbHVlICY9IH5CSVQzOworCXdyaXRlX3JlZyhpbmZvLCBDVEwsIFJlZ1ZhbHVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKK30KKworI2lmZGVmIENPTkZJR19IRExDCisKKy8qKgorICogY2FsbGVkIGJ5IGdlbmVyaWMgSERMQyBsYXllciB3aGVuIHByb3RvY29sIHNlbGVjdGVkIChQUFAsIGZyYW1lIHJlbGF5LCBldGMuKQorICogc2V0IGVuY29kaW5nIGFuZCBmcmFtZSBjaGVjayBzZXF1ZW5jZSAoRkNTKSBvcHRpb25zCisgKgorICogZGV2ICAgICAgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKiBlbmNvZGluZyAgc2VyaWFsIGVuY29kaW5nIHNldHRpbmcKKyAqIHBhcml0eSAgICBGQ1Mgc2V0dGluZworICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IGVuY29kaW5nLAorCQkJICB1bnNpZ25lZCBzaG9ydCBwYXJpdHkpCit7CisJU0xNUF9JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwl1bnNpZ25lZCBjaGFyICBuZXdfZW5jb2Rpbmc7CisJdW5zaWduZWQgc2hvcnQgbmV3X2NyY3R5cGU7CisKKwkvKiByZXR1cm4gZXJyb3IgaWYgVFRZIGludGVyZmFjZSBvcGVuICovCisJaWYgKGluZm8tPmNvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChlbmNvZGluZykKKwl7CisJY2FzZSBFTkNPRElOR19OUlo6ICAgICAgICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX05SWjsgYnJlYWs7CisJY2FzZSBFTkNPRElOR19OUlpJOiAgICAgICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX05SWklfU1BBQ0U7IGJyZWFrOworCWNhc2UgRU5DT0RJTkdfRk1fTUFSSzogICAgbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19CSVBIQVNFX01BUks7IGJyZWFrOworCWNhc2UgRU5DT0RJTkdfRk1fU1BBQ0U6ICAgbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19CSVBIQVNFX1NQQUNFOyBicmVhazsKKwljYXNlIEVOQ09ESU5HX01BTkNIRVNURVI6IG5ld19lbmNvZGluZyA9IEhETENfRU5DT0RJTkdfQklQSEFTRV9MRVZFTDsgYnJlYWs7CisJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChwYXJpdHkpCisJeworCWNhc2UgUEFSSVRZX05PTkU6ICAgICAgICAgICAgbmV3X2NyY3R5cGUgPSBIRExDX0NSQ19OT05FOyBicmVhazsKKwljYXNlIFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQ6IG5ld19jcmN0eXBlID0gSERMQ19DUkNfMTZfQ0NJVFQ7IGJyZWFrOworCWNhc2UgUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVDogbmV3X2NyY3R5cGUgPSBIRExDX0NSQ18zMl9DQ0lUVDsgYnJlYWs7CisJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW5mby0+cGFyYW1zLmVuY29kaW5nID0gbmV3X2VuY29kaW5nOworCWluZm8tPnBhcmFtcy5jcmNfdHlwZSA9IG5ld19jcmN0eXBlOzsKKworCS8qIGlmIG5ldHdvcmsgaW50ZXJmYWNlIHVwLCByZXByb2dyYW0gaGFyZHdhcmUgKi8KKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCXByb2dyYW1faHcoaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZ2VuZXJpYyBIRExDIGxheWVyIHRvIHNlbmQgZnJhbWUKKyAqCisgKiBza2IgIHNvY2tldCBidWZmZXIgY29udGFpbmluZyBIRExDIGZyYW1lCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJU0xNUF9JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoS0VSTl9JTkZPICIlczpoZGxjX3htaXQoJXMpXG4iLF9fRklMRV9fLGRldi0+bmFtZSk7CisKKwkvKiBzdG9wIHNlbmRpbmcgdW50aWwgdGhpcyBmcmFtZSBjb21wbGV0ZXMgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBjb3B5IGRhdGEgdG8gZGV2aWNlIGJ1ZmZlcnMgKi8KKwlpbmZvLT50eF9jb3VudCA9IHNrYi0+bGVuOworCXR4X2xvYWRfZG1hX2J1ZmZlcihpbmZvLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworCS8qIHVwZGF0ZSBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwlzdGF0cy0+dHhfcGFja2V0cysrOworCXN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCS8qIGRvbmUgd2l0aCBzb2NrZXQgYnVmZmVyLCBzbyBmcmVlIGl0ICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJLyogc2F2ZSBzdGFydCB0aW1lIGZvciB0cmFuc21pdCB0aW1lb3V0IGRldGVjdGlvbiAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogc3RhcnQgaGFyZHdhcmUgdHJhbnNtaXR0ZXIgaWYgbmVjZXNzYXJ5ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmICghaW5mby0+dHhfYWN0aXZlKQorCSAJdHhfc3RhcnQoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgbmV0d29yayBsYXllciB3aGVuIGludGVyZmFjZSBlbmFibGVkCisgKiBjbGFpbSByZXNvdXJjZXMgYW5kIGluaXRpYWxpemUgaGFyZHdhcmUKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJU0xNUF9JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzOmhkbGNkZXZfb3BlbiglcylcbiIsX19GSUxFX18sZGV2LT5uYW1lKTsKKworCS8qIGdlbmVyaWMgSERMQyBsYXllciBvcGVuIHByb2Nlc3NpbmcgKi8KKwlpZiAoKHJjID0gaGRsY19vcGVuKGRldikpKQorCQlyZXR1cm4gcmM7CisKKwkvKiBhcmJpdHJhdGUgYmV0d2VlbiBuZXR3b3JrIGFuZCB0dHkgb3BlbnMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT5jb3VudCAhPSAwIHx8IGluZm8tPm5ldGNvdW50ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGhkbGNfb3BlbiByZXR1cm5pbmcgYnVzeVxuIiwgZGV2LT5uYW1lKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpbmZvLT5uZXRjb3VudD0xOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKworCS8qIGNsYWltIHJlc291cmNlcyBhbmQgaW5pdCBhZGFwdGVyICovCisJaWYgKChyYyA9IHN0YXJ0dXAoaW5mbykpICE9IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwkJaW5mby0+bmV0Y291bnQ9MDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogYXNzZXJ0IERUUiBhbmQgUlRTLCBhcHBseSBoYXJkd2FyZSBzZXR0aW5ncyAqLworCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSOworCXByb2dyYW1faHcoaW5mbyk7CisKKwkvKiBlbmFibGUgbmV0d29yayBsYXllciB0cmFuc21pdCAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkvKiBpbmZvcm0gZ2VuZXJpYyBIRExDIGxheWVyIG9mIGN1cnJlbnQgRENEIHN0YXR1cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJZ2V0X3NpZ25hbHMoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWhkbGNfc2V0X2NhcnJpZXIoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENELCBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IG5ldHdvcmsgbGF5ZXIgd2hlbiBpbnRlcmZhY2UgaXMgZGlzYWJsZWQKKyAqIHNodXRkb3duIGhhcmR3YXJlIGFuZCByZWxlYXNlIHJlc291cmNlcworICoKKyAqIGRldiAgcG9pbnRlciB0byBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBoZGxjZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJU0xNUF9JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXM6aGRsY2Rldl9jbG9zZSglcylcbiIsX19GSUxFX18sZGV2LT5uYW1lKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIHNodXRkb3duIGFkYXB0ZXIgYW5kIHJlbGVhc2UgcmVzb3VyY2VzICovCisJc2h1dGRvd24oaW5mbyk7CisKKwloZGxjX2Nsb3NlKGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCWluZm8tPm5ldGNvdW50PTA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IG5ldHdvcmsgbGF5ZXIgdG8gcHJvY2VzcyBJT0NUTCBjYWxsIHRvIG5ldHdvcmsgZGV2aWNlCisgKgorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICogaWZyICBwb2ludGVyIHRvIG5ldHdvcmsgaW50ZXJmYWNlIHJlcXVlc3Qgc3RydWN0dXJlCisgKiBjbWQgIElPQ1RMIGNvbW1hbmQgY29kZQorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2Yoc3luY19zZXJpYWxfc2V0dGluZ3MpOworCXN5bmNfc2VyaWFsX3NldHRpbmdzIG5ld19saW5lOworCXN5bmNfc2VyaWFsX3NldHRpbmdzIF9fdXNlciAqbGluZSA9IGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LnN5bmM7CisJU0xNUF9JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlczpoZGxjZGV2X2lvY3RsKCVzKVxuIixfX0ZJTEVfXyxkZXYtPm5hbWUpOworCisJLyogcmV0dXJuIGVycm9yIGlmIFRUWSBpbnRlcmZhY2Ugb3BlbiAqLworCWlmIChpbmZvLT5jb3VudCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChjbWQgIT0gU0lPQ1dBTkRFVikKKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisKKwlzd2l0Y2goaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX0lGQUNFOiAvKiByZXR1cm4gY3VycmVudCBzeW5jX3NlcmlhbF9zZXR0aW5ncyAqLworCisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9TWU5DX1NFUklBTDsKKwkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPCBzaXplKSB7CisJCQlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZTsgLyogZGF0YSBzaXplIHdhbnRlZCAqLworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisKKwkJZmxhZ3MgPSBpbmZvLT5wYXJhbXMuZmxhZ3MgJiAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfUlhDX0RQTEwgfAorCQkJCQkgICAgICBIRExDX0ZMQUdfUlhDX0JSRyAgICB8IEhETENfRkxBR19SWENfVFhDUElOIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19UWENQSU4gfCBIRExDX0ZMQUdfVFhDX0RQTEwgfAorCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX0JSRyAgICB8IEhETENfRkxBR19UWENfUlhDUElOKTsKKworCQlzd2l0Y2ggKGZsYWdzKXsKKwkJY2FzZSAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1RYQ1BJTik6IG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19FWFQ7IGJyZWFrOworCQljYXNlIChIRExDX0ZMQUdfUlhDX0JSRyAgICB8IEhETENfRkxBR19UWENfQlJHKTogICAgbmV3X2xpbmUuY2xvY2tfdHlwZSA9IENMT0NLX0lOVDsgYnJlYWs7CisJCWNhc2UgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19CUkcpOiAgICBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfVFhJTlQ7IGJyZWFrOworCQljYXNlIChIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19UWENfUlhDUElOKTogbmV3X2xpbmUuY2xvY2tfdHlwZSA9IENMT0NLX1RYRlJPTVJYOyBicmVhazsKKwkJZGVmYXVsdDogbmV3X2xpbmUuY2xvY2tfdHlwZSA9IENMT0NLX0RFRkFVTFQ7CisJCX0KKworCQluZXdfbGluZS5jbG9ja19yYXRlID0gaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkOworCQluZXdfbGluZS5sb29wYmFjayAgID0gaW5mby0+cGFyYW1zLmxvb3BiYWNrID8gMTowOworCisJCWlmIChjb3B5X3RvX3VzZXIobGluZSwgJm5ld19saW5lLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSUZfSUZBQ0VfU1lOQ19TRVJJQUw6IC8qIHNldCBzeW5jX3NlcmlhbF9zZXR0aW5ncyAqLworCisJCWlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfbGluZSwgbGluZSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzd2l0Y2ggKG5ld19saW5lLmNsb2NrX3R5cGUpCisJCXsKKwkJY2FzZSBDTE9DS19FWFQ6ICAgICAgZmxhZ3MgPSBIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19UWENfVFhDUElOOyBicmVhazsKKwkJY2FzZSBDTE9DS19UWEZST01SWDogZmxhZ3MgPSBIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19UWENfUlhDUElOOyBicmVhazsKKwkJY2FzZSBDTE9DS19JTlQ6ICAgICAgZmxhZ3MgPSBIRExDX0ZMQUdfUlhDX0JSRyAgICB8IEhETENfRkxBR19UWENfQlJHOyAgICBicmVhazsKKwkJY2FzZSBDTE9DS19UWElOVDogICAgZmxhZ3MgPSBIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19UWENfQlJHOyAgICBicmVhazsKKwkJY2FzZSBDTE9DS19ERUZBVUxUOiAgZmxhZ3MgPSBpbmZvLT5wYXJhbXMuZmxhZ3MgJgorCQkJCQkgICAgIChIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19SWENfRFBMTCB8CisJCQkJCSAgICAgIEhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1JYQ19UWENQSU4gfAorCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX1RYQ1BJTiB8IEhETENfRkxBR19UWENfRFBMTCB8CisJCQkJCSAgICAgIEhETENfRkxBR19UWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19SWENQSU4pOyBicmVhazsKKwkJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAobmV3X2xpbmUubG9vcGJhY2sgIT0gMCAmJiBuZXdfbGluZS5sb29wYmFjayAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaW5mby0+cGFyYW1zLmZsYWdzICY9IH4oSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfUlhDX0RQTEwgfAorCQkJCQlIRExDX0ZMQUdfUlhDX0JSRyAgICB8IEhETENfRkxBR19SWENfVFhDUElOIHwKKwkJCQkJSERMQ19GTEFHX1RYQ19UWENQSU4gfCBIRExDX0ZMQUdfVFhDX0RQTEwgfAorCQkJCQlIRExDX0ZMQUdfVFhDX0JSRyAgICB8IEhETENfRkxBR19UWENfUlhDUElOKTsKKwkJaW5mby0+cGFyYW1zLmZsYWdzIHw9IGZsYWdzOworCisJCWluZm8tPnBhcmFtcy5sb29wYmFjayA9IG5ld19saW5lLmxvb3BiYWNrOworCisJCWlmIChmbGFncyAmIChIRExDX0ZMQUdfUlhDX0JSRyB8IEhETENfRkxBR19UWENfQlJHKSkKKwkJCWluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCA9IG5ld19saW5lLmNsb2NrX3JhdGU7CisJCWVsc2UKKwkJCWluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCA9IDA7CisKKwkJLyogaWYgbmV0d29yayBpbnRlcmZhY2UgdXAsIHJlcHJvZ3JhbSBoYXJkd2FyZSAqLworCQlpZiAoaW5mby0+bmV0Y291bnQpCisJCQlwcm9ncmFtX2h3KGluZm8pOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCX0KK30KKworLyoqCisgKiBjYWxsZWQgYnkgbmV0d29yayBsYXllciB3aGVuIHRyYW5zbWl0IHRpbWVvdXQgaXMgZGV0ZWN0ZWQKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGhkbGNkZXZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVNMTVBfSU5GTyAqaW5mbyA9IGRldl90b19wb3J0KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJoZGxjZGV2X3R4X3RpbWVvdXQoJXMpXG4iLGRldi0+bmFtZSk7CisKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisJc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzKys7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJdHhfc3RvcChpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZGV2aWNlIGRyaXZlciB3aGVuIHRyYW5zbWl0IGNvbXBsZXRlcworICogcmVlbmFibGUgbmV0d29yayBsYXllciB0cmFuc21pdCBpZiBzdG9wcGVkCisgKgorICogaW5mbyAgcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIHZvaWQgaGRsY2Rldl90eF9kb25lKFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChpbmZvLT5uZXRkZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKGluZm8tPm5ldGRldik7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGRldmljZSBkcml2ZXIgd2hlbiBmcmFtZSByZWNlaXZlZAorICogcGFzcyBmcmFtZSB0byBuZXR3b3JrIGxheWVyCisgKgorICogaW5mbyAgcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgaW5mb3JtYXRpb24KKyAqIGJ1ZiAgIHBvaW50ZXIgdG8gYnVmZmVyIGNvbnRpYW5pbmcgZnJhbWUgZGF0YQorICogc2l6ZSAgY291bnQgb2YgZGF0YSBieXRlcyBpbiBidWYKKyAqLworc3RhdGljIHZvaWQgaGRsY2Rldl9yeChTTE1QX0lORk8gKmluZm8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJoZGxjZGV2X3J4KCVzKVxuIixkZXYtPm5hbWUpOworCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGNhbid0IGFsbG9jIHNrYiwgZHJvcHBpbmcgcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KHNrYl9wdXQoc2tiLCBzaXplKSxidWYsc2l6ZSk7CisKKwlza2ItPnByb3RvY29sID0gaGRsY190eXBlX3RyYW5zKHNrYiwgaW5mby0+bmV0ZGV2KTsKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IHNpemU7CisKKwluZXRpZl9yeChza2IpOworCisJaW5mby0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZGV2aWNlIGRyaXZlciB3aGVuIGFkZGluZyBkZXZpY2UgaW5zdGFuY2UKKyAqIGRvIGdlbmVyaWMgSERMQyBpbml0aWFsaXphdGlvbgorICoKKyAqIGluZm8gIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGluZm9ybWF0aW9uCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9pbml0KFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpbnQgcmM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwloZGxjX2RldmljZSAqaGRsYzsKKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG5ldHdvcmsgYW5kIEhETEMgbGF5ZXIgb2JqZWN0cyAqLworCisJaWYgKCEoZGV2ID0gYWxsb2NfaGRsY2RldihpbmZvKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczpoZGxjIGRldmljZSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsX19GSUxFX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBmb3IgbmV0d29yayBsYXllciByZXBvcnRpbmcgcHVycG9zZXMgb25seSAqLworCWRldi0+bWVtX3N0YXJ0ID0gaW5mby0+cGh5c19zY2FfYmFzZTsKKwlkZXYtPm1lbV9lbmQgICA9IGluZm8tPnBoeXNfc2NhX2Jhc2UgKyBTQ0FfQkFTRV9TSVpFIC0gMTsKKwlkZXYtPmlycSAgICAgICA9IGluZm8tPmlycV9sZXZlbDsKKworCS8qIG5ldHdvcmsgbGF5ZXIgY2FsbGJhY2tzIGFuZCBzZXR0aW5ncyAqLworCWRldi0+ZG9faW9jdGwgICAgICAgPSBoZGxjZGV2X2lvY3RsOworCWRldi0+b3BlbiAgICAgICAgICAgPSBoZGxjZGV2X29wZW47CisJZGV2LT5zdG9wICAgICAgICAgICA9IGhkbGNkZXZfY2xvc2U7CisJZGV2LT50eF90aW1lb3V0ICAgICA9IGhkbGNkZXZfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gMTAqSFo7CisJZGV2LT50eF9xdWV1ZV9sZW4gICA9IDUwOworCisJLyogZ2VuZXJpYyBIRExDIGxheWVyIGNhbGxiYWNrcyBhbmQgc2V0dGluZ3MgKi8KKwloZGxjICAgICAgICAgPSBkZXZfdG9faGRsYyhkZXYpOworCWhkbGMtPmF0dGFjaCA9IGhkbGNkZXZfYXR0YWNoOworCWhkbGMtPnhtaXQgICA9IGhkbGNkZXZfeG1pdDsKKworCS8qIHJlZ2lzdGVyIG9iamVjdHMgd2l0aCBIRExDIGxheWVyICovCisJaWYgKChyYyA9IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldikpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOnVuYWJsZSB0byByZWdpc3RlciBoZGxjIGRldmljZVxuIixfX0ZJTEVfXyk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiByYzsKKwl9CisKKwlpbmZvLT5uZXRkZXYgPSBkZXY7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGRldmljZSBkcml2ZXIgd2hlbiByZW1vdmluZyBkZXZpY2UgaW5zdGFuY2UKKyAqIGRvIGdlbmVyaWMgSERMQyBjbGVhbnVwCisgKgorICogaW5mbyAgcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIHZvaWQgaGRsY2Rldl9leGl0KFNMTVBfSU5GTyAqaW5mbykKK3sKKwl1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKGluZm8tPm5ldGRldik7CisJZnJlZV9uZXRkZXYoaW5mby0+bmV0ZGV2KTsKKwlpbmZvLT5uZXRkZXYgPSBOVUxMOworfQorCisjZW5kaWYgLyogQ09ORklHX0hETEMgKi8KKworCisvKiBSZXR1cm4gbmV4dCBib3R0b20gaGFsZiBhY3Rpb24gdG8gcGVyZm9ybS4KKyAqIFJldHVybiBWYWx1ZToJQkggYWN0aW9uIGNvZGUgb3IgMCBpZiBub3RoaW5nIHRvIGRvLgorICovCitpbnQgYmhfYWN0aW9uKFNMTVBfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlpZiAoaW5mby0+cGVuZGluZ19iaCAmIEJIX1JFQ0VJVkUpIHsKKwkJaW5mby0+cGVuZGluZ19iaCAmPSB+QkhfUkVDRUlWRTsKKwkJcmMgPSBCSF9SRUNFSVZFOworCX0gZWxzZSBpZiAoaW5mby0+cGVuZGluZ19iaCAmIEJIX1RSQU5TTUlUKSB7CisJCWluZm8tPnBlbmRpbmdfYmggJj0gfkJIX1RSQU5TTUlUOworCQlyYyA9IEJIX1RSQU5TTUlUOworCX0gZWxzZSBpZiAoaW5mby0+cGVuZGluZ19iaCAmIEJIX1NUQVRVUykgeworCQlpbmZvLT5wZW5kaW5nX2JoICY9IH5CSF9TVEFUVVM7CisJCXJjID0gQkhfU1RBVFVTOworCX0KKworCWlmICghcmMpIHsKKwkJLyogTWFyayBCSCByb3V0aW5lIGFzIGNvbXBsZXRlICovCisJCWluZm8tPmJoX3J1bm5pbmcgICA9IDA7CisJCWluZm8tPmJoX3JlcXVlc3RlZCA9IDA7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFBlcmZvcm0gYm90dG9tIGhhbGYgcHJvY2Vzc2luZyBvZiB3b3JrIGl0ZW1zIHF1ZXVlZCBieSBJU1IuCisgKi8KK3ZvaWQgYmhfaGFuZGxlcih2b2lkKiBDb250ZXh0KQoreworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8qKUNvbnRleHQ7CisJaW50IGFjdGlvbjsKKworCWlmICghaW5mbykKKwkJcmV0dXJuOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCApCisJCXByaW50ayggIiVzKCVkKTolcyBiaF9oYW5kbGVyKCkgZW50cnlcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwlpbmZvLT5iaF9ydW5uaW5nID0gMTsKKworCXdoaWxlKChhY3Rpb24gPSBiaF9hY3Rpb24oaW5mbykpICE9IDApIHsKKworCQkvKiBQcm9jZXNzIHdvcmsgaXRlbSAqLworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0JIICkKKwkJCXByaW50ayggIiVzKCVkKTolcyBiaF9oYW5kbGVyKCkgd29yayBpdGVtIGFjdGlvbj0lZFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgYWN0aW9uKTsKKworCQlzd2l0Y2ggKGFjdGlvbikgeworCisJCWNhc2UgQkhfUkVDRUlWRToKKwkJCWJoX3JlY2VpdmUoaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBCSF9UUkFOU01JVDoKKwkJCWJoX3RyYW5zbWl0KGluZm8pOworCQkJYnJlYWs7CisJCWNhc2UgQkhfU1RBVFVTOgorCQkJYmhfc3RhdHVzKGluZm8pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiB1bmtub3duIHdvcmsgaXRlbSBJRCAqLworCQkJcHJpbnRrKCIlcyglZCk6JXMgVW5rbm93biB3b3JrIGl0ZW0gSUQ9JTA4WCFcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsYWN0aW9uKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCApCisJCXByaW50ayggIiVzKCVkKTolcyBiaF9oYW5kbGVyKCkgZXhpdFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKK30KKwordm9pZCBiaF9yZWNlaXZlKFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0JIICkKKwkJcHJpbnRrKCAiJXMoJWQpOiVzIGJoX3JlY2VpdmUoKVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKworCXdoaWxlKCByeF9nZXRfZnJhbWUoaW5mbykgKTsKK30KKwordm9pZCBiaF90cmFuc21pdChTTE1QX0lORk8gKmluZm8pCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkggKQorCQlwcmludGsoICIlcyglZCk6JXMgYmhfdHJhbnNtaXQoKSBlbnRyeVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKworCWlmICh0dHkpIHsKKwkJdHR5X3dha2V1cCh0dHkpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJfQorfQorCit2b2lkIGJoX3N0YXR1cyhTTE1QX0lORk8gKmluZm8pCit7CisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCApCisJCXByaW50ayggIiVzKCVkKTolcyBiaF9zdGF0dXMoKSBlbnRyeVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKworCWluZm8tPnJpX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5kc3JfY2hrY291bnQgPSAwOworCWluZm8tPmRjZF9jaGtjb3VudCA9IDA7CisJaW5mby0+Y3RzX2Noa2NvdW50ID0gMDsKK30KKwordm9pZCBpc3JfdGltZXIoU0xNUF9JTkZPICogaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIHRpbWVyID0gKGluZm8tPnBvcnRfbnVtICYgMSkgPyBUSU1FUjIgOiBUSU1FUjA7CisKKwkvKiBJRVIyPDcuLjQ+ID0gdGltZXI8My4uMD4gaW50ZXJydXB0IGVuYWJsZXMgKDA9ZGlzYWJsZWQpICovCisJd3JpdGVfcmVnKGluZm8sIElFUjIsIDApOworCisJLyogVE1DUywgVGltZXIgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIKKwkgKgorCSAqIDA3ICAgICAgQ01GLCBDb21wYXJlIG1hdGNoIGZsYWcgKHJlYWQgb25seSkgMT1tYXRjaAorCSAqIDA2ICAgICAgRUNNSSwgQ01GIEludGVycnVwdCBFbmFibGU6IDA9ZGlzYWJsZWQKKwkgKiAwNSAgICAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwNCAgICAgIFRNRSwgVGltZXIgRW5hYmxlCisJICogMDMuLjAwICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICoKKwkgKiAwMDAwIDAwMDAKKwkgKi8KKwl3cml0ZV9yZWcoaW5mbywgKHVuc2lnbmVkIGNoYXIpKHRpbWVyICsgVE1DUyksIDApOworCisJaW5mby0+aXJxX29jY3VycmVkID0gVFJVRTsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJcHJpbnRrKCIlcyglZCk6JXMgaXNyX3RpbWVyKClcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7Cit9CisKK3ZvaWQgaXNyX3J4aW50KFNMTVBfSU5GTyAqIGluZm8pCit7CisgCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CisgCXN0cnVjdAltZ3NsX2ljb3VudCAqaWNvdW50ID0gJmluZm8tPmljb3VudDsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IHJlYWRfcmVnKGluZm8sIFNSMSkgJiBpbmZvLT5pZTFfdmFsdWUgJiAoRkxHRCArIElETEQgKyBDRENEICsgQlJLRCk7CisJdW5zaWduZWQgY2hhciBzdGF0dXMyID0gcmVhZF9yZWcoaW5mbywgU1IyKSAmIGluZm8tPmllMl92YWx1ZSAmIE9WUk47CisKKwkvKiBjbGVhciBzdGF0dXMgYml0cyAqLworCWlmIChzdGF0dXMpCisJCXdyaXRlX3JlZyhpbmZvLCBTUjEsIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzMikKKwkJd3JpdGVfcmVnKGluZm8sIFNSMiwgc3RhdHVzMik7CisJCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQlwcmludGsoIiVzKCVkKTolcyBpc3JfcnhpbnQgc3RhdHVzPSUwMlggJTAyeFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHN0YXR1cyxzdGF0dXMyKTsKKworCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfQVNZTkMpIHsKKwkJaWYgKHN0YXR1cyAmIEJSS0QpIHsKKwkJCWljb3VudC0+YnJrKys7CisKKwkJCS8qIHByb2Nlc3MgYnJlYWsgZGV0ZWN0aW9uIGlmIHR0eSBjb250cm9sCisJCQkgKiBpcyBub3Qgc2V0IHRvIGlnbm9yZSBpdAorCQkJICovCisJCQlpZiAoIHR0eSApIHsKKwkJCQlpZiAoIShzdGF0dXMgJiBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sxKSkgeworCQkJCQlpZiAoaW5mby0+cmVhZF9zdGF0dXNfbWFzazEgJiBCUktEKSB7CisJCQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9CUkVBSzsKKwkJCQkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX1NBSykKKwkJCQkJCQlkb19TQUsodHR5KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwllbHNlIHsKKwkJaWYgKHN0YXR1cyAmIChGTEdEfElETEQpKSB7CisJCQlpZiAoc3RhdHVzICYgRkxHRCkKKwkJCQlpbmZvLT5pY291bnQuZXhpdGh1bnQrKzsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIElETEQpCisJCQkJaW5mby0+aWNvdW50LnJ4aWRsZSsrOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5ldmVudF93YWl0X3EpOworCQl9CisJfQorCisJaWYgKHN0YXR1cyAmIENEQ0QpIHsKKwkJLyogc2ltdWxhdGUgYSBjb21tb24gbW9kZW0gc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQKKwkJICogZm9yIG91ciBoYW5kbGVyCisJCSAqLworCQlnZXRfc2lnbmFscyggaW5mbyApOworCQlpc3JfaW9fcGluKGluZm8sCisJCQlNSVNDU1RBVFVTX0RDRF9MQVRDSEVEfChpbmZvLT5zZXJpYWxfc2lnbmFscyZTZXJpYWxTaWduYWxfRENEKSk7CisJfQorfQorCisvKgorICogaGFuZGxlIGFzeW5jIHJ4IGRhdGEgaW50ZXJydXB0cworICovCit2b2lkIGlzcl9yeHJkeShTTE1QX0lORk8gKiBpbmZvKQoreworCXUxNiBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBEYXRhQnl0ZTsKKyAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKyAJc3RydWN0CW1nc2xfaWNvdW50ICppY291bnQgPSAmaW5mby0+aWNvdW50OworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQlwcmludGsoIiVzKCVkKTolcyBpc3JfcnhyZHlcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwl3aGlsZSgoc3RhdHVzID0gcmVhZF9yZWcoaW5mbyxDU1QwKSkgJiBCSVQwKQorCXsKKwkJRGF0YUJ5dGUgPSByZWFkX3JlZyhpbmZvLFRSQik7CisKKwkJaWYgKCB0dHkgKSB7CisJCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpCisJCQkJY29udGludWU7CisKKwkJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gRGF0YUJ5dGU7CisJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IDA7CisJCX0KKworCQlpY291bnQtPnJ4Kys7CisKKwkJaWYgKCBzdGF0dXMgJiAoUEUgKyBGUk1FICsgT1ZSTikgKSB7CisJCQlwcmludGsoIiVzKCVkKTolcyByeGVycj0lMDRYXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHN0YXR1cyk7CisKKwkJCS8qIHVwZGF0ZSBlcnJvciBzdGF0aXN0aWNzICovCisJCQlpZiAoc3RhdHVzICYgUEUpCisJCQkJaWNvdW50LT5wYXJpdHkrKzsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIEZSTUUpCisJCQkJaWNvdW50LT5mcmFtZSsrOworCQkJZWxzZSBpZiAoc3RhdHVzICYgT1ZSTikKKwkJCQlpY291bnQtPm92ZXJydW4rKzsKKworCQkJLyogZGlzY2FyZCBjaGFyIGlmIHR0eSBjb250cm9sIGZsYWdzIHNheSBzbyAqLworCQkJaWYgKHN0YXR1cyAmIGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzazIpCisJCQkJY29udGludWU7CisKKwkJCXN0YXR1cyAmPSBpbmZvLT5yZWFkX3N0YXR1c19tYXNrMjsKKworCQkJaWYgKCB0dHkgKSB7CisJCQkJaWYgKHN0YXR1cyAmIFBFKQorCQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9QQVJJVFk7CisJCQkJZWxzZSBpZiAoc3RhdHVzICYgRlJNRSkKKwkJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJCQkJaWYgKHN0YXR1cyAmIE9WUk4pIHsKKwkJCQkJLyogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzCisJCQkJCSAqIHJlcG9ydGVkIGltbWVkaWF0ZWx5LCBhbmQgZG9lc24ndAorCQkJCQkgKiBhZmZlY3QgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCisJCQkJCSAqLworCQkJCQlpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgeworCQkJCQkJdHR5LT5mbGlwLmNvdW50Kys7CisJCQkJCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7CisJCQkJCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7CisJCQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9PVkVSUlVOOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CS8qIGVuZCBvZiBpZiAoZXJyb3IpICovCisKKwkJaWYgKCB0dHkgKSB7CisJCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7CisJCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7CisJCQl0dHktPmZsaXAuY291bnQrKzsKKwkJfQorCX0KKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkgeworCQlwcmludGsoIiVzKCVkKTolcyBpc3JfcnhyZHkoKSBmbGlwIGNvdW50PSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsCisJCQl0dHkgPyB0dHktPmZsaXAuY291bnQgOiAwKTsKKwkJcHJpbnRrKCIlcyglZCk6JXMgcng9JWQgYnJrPSVkIHBhcml0eT0lZCBmcmFtZT0lZCBvdmVycnVuPSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsCisJCQlpY291bnQtPnJ4LGljb3VudC0+YnJrLGljb3VudC0+cGFyaXR5LAorCQkJaWNvdW50LT5mcmFtZSxpY291bnQtPm92ZXJydW4pOworCX0KKworCWlmICggdHR5ICYmIHR0eS0+ZmxpcC5jb3VudCApCisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Cit9CisKK3N0YXRpYyB2b2lkIGlzcl90eGVvbShTTE1QX0lORk8gKiBpbmZvLCB1bnNpZ25lZCBjaGFyIHN0YXR1cykKK3sKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCXByaW50aygiJXMoJWQpOiVzIGlzcl90eGVvbSBzdGF0dXM9JTAyeFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHN0YXR1cyk7CisKKwl3cml0ZV9yZWcoaW5mbywgVFhETUEgKyBESVIsIDB4MDApOyAvKiBkaXNhYmxlIFR4IERNQSBJUlFzICovCisJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRFNSLCAweGMwKTsgLyogY2xlYXIgSVJRcyBhbmQgZGlzYWJsZSBETUEgKi8KKwl3cml0ZV9yZWcoaW5mbywgVFhETUEgKyBEQ01ELCBTV0FCT1JUKTsJLyogcmVzZXQvaW5pdCBETUEgY2hhbm5lbCAqLworCisJaWYgKHN0YXR1cyAmIFVEUk4pIHsKKwkJd3JpdGVfcmVnKGluZm8sIENNRCwgVFhSRVNFVCk7CisJCXdyaXRlX3JlZyhpbmZvLCBDTUQsIFRYRU5BQkxFKTsKKwl9IGVsc2UKKwkJd3JpdGVfcmVnKGluZm8sIENNRCwgVFhCVUZDTFIpOworCisJLyogZGlzYWJsZSBhbmQgY2xlYXIgdHggaW50ZXJydXB0cyAqLworCWluZm8tPmllMF92YWx1ZSAmPSB+VFhSRFlFOworCWluZm8tPmllMV92YWx1ZSAmPSB+KElETEUgKyBVRFJOKTsKKwl3cml0ZV9yZWcxNihpbmZvLCBJRTAsICh1bnNpZ25lZCBzaG9ydCkoKGluZm8tPmllMV92YWx1ZSA8PCA4KSArIGluZm8tPmllMF92YWx1ZSkpOworCXdyaXRlX3JlZyhpbmZvLCBTUjEsICh1bnNpZ25lZCBjaGFyKShVRFJOICsgSURMRSkpOworCisJaWYgKCBpbmZvLT50eF9hY3RpdmUgKSB7CisJCWlmIChpbmZvLT5wYXJhbXMubW9kZSAhPSBNR1NMX01PREVfQVNZTkMpIHsKKwkJCWlmIChzdGF0dXMgJiBVRFJOKQorCQkJCWluZm8tPmljb3VudC50eHVuZGVyKys7CisJCQllbHNlIGlmIChzdGF0dXMgJiBJRExFKQorCQkJCWluZm8tPmljb3VudC50eG9rKys7CisJCX0KKworCQlpbmZvLT50eF9hY3RpdmUgPSAwOworCQlpbmZvLT50eF9jb3VudCA9IGluZm8tPnR4X3B1dCA9IGluZm8tPnR4X2dldCA9IDA7CisKKwkJZGVsX3RpbWVyKCZpbmZvLT50eF90aW1lcik7CisKKwkJaWYgKGluZm8tPnBhcmFtcy5tb2RlICE9IE1HU0xfTU9ERV9BU1lOQyAmJiBpbmZvLT5kcm9wX3J0c19vbl90eF9kb25lICkgeworCQkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gflNlcmlhbFNpZ25hbF9SVFM7CisJCQlpbmZvLT5kcm9wX3J0c19vbl90eF9kb25lID0gMDsKKwkJCXNldF9zaWduYWxzKGluZm8pOworCQl9CisKKyNpZmRlZiBDT05GSUdfSERMQworCQlpZiAoaW5mby0+bmV0Y291bnQpCisJCQloZGxjZGV2X3R4X2RvbmUoaW5mbyk7CisJCWVsc2UKKyNlbmRpZgorCQl7CisJCQlpZiAoaW5mby0+dHR5ICYmIChpbmZvLT50dHktPnN0b3BwZWQgfHwgaW5mby0+dHR5LT5od19zdG9wcGVkKSkgeworCQkJCXR4X3N0b3AoaW5mbyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9UUkFOU01JVDsKKwkJfQorCX0KK30KKworCisvKgorICogaGFuZGxlIHR4IHN0YXR1cyBpbnRlcnJ1cHRzCisgKi8KK3ZvaWQgaXNyX3R4aW50KFNMTVBfSU5GTyAqIGluZm8pCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXMgPSByZWFkX3JlZyhpbmZvLCBTUjEpICYgaW5mby0+aWUxX3ZhbHVlICYgKFVEUk4gKyBJRExFICsgQ0NUUyk7CisKKwkvKiBjbGVhciBzdGF0dXMgYml0cyAqLworCXdyaXRlX3JlZyhpbmZvLCBTUjEsIHN0YXR1cyk7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCXByaW50aygiJXMoJWQpOiVzIGlzcl90eGludCBzdGF0dXM9JTAyeFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgKFVEUk4gKyBJRExFKSkKKwkJaXNyX3R4ZW9tKGluZm8sIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgQ0NUUykgeworCQkvKiBzaW11bGF0ZSBhIGNvbW1vbiBtb2RlbSBzdGF0dXMgY2hhbmdlIGludGVycnVwdAorCQkgKiBmb3Igb3VyIGhhbmRsZXIKKwkJICovCisJCWdldF9zaWduYWxzKCBpbmZvICk7CisJCWlzcl9pb19waW4oaW5mbywKKwkJCU1JU0NTVEFUVVNfQ1RTX0xBVENIRUR8KGluZm8tPnNlcmlhbF9zaWduYWxzJlNlcmlhbFNpZ25hbF9DVFMpKTsKKworCX0KK30KKworLyoKKyAqIGhhbmRsZSBhc3luYyB0eCBkYXRhIGludGVycnVwdHMKKyAqLwordm9pZCBpc3JfdHhyZHkoU0xNUF9JTkZPICogaW5mbykKK3sKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCXByaW50aygiJXMoJWQpOiVzIGlzcl90eHJkeSgpIHR4X2NvdW50PSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsaW5mby0+dHhfY291bnQpOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlICE9IE1HU0xfTU9ERV9BU1lOQykgeworCQkvKiBkaXNhYmxlIFRYUkRZIElSUSwgZW5hYmxlIElETEUgSVJRICovCisJCWluZm8tPmllMF92YWx1ZSAmPSB+VFhSRFlFOworCQlpbmZvLT5pZTFfdmFsdWUgfD0gSURMRTsKKwkJd3JpdGVfcmVnMTYoaW5mbywgSUUwLCAodW5zaWduZWQgc2hvcnQpKChpbmZvLT5pZTFfdmFsdWUgPDwgOCkgKyBpbmZvLT5pZTBfdmFsdWUpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbmZvLT50dHkgJiYgKGluZm8tPnR0eS0+c3RvcHBlZCB8fCBpbmZvLT50dHktPmh3X3N0b3BwZWQpKSB7CisJCXR4X3N0b3AoaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIGluZm8tPnR4X2NvdW50ICkKKwkJdHhfbG9hZF9maWZvKCBpbmZvICk7CisJZWxzZSB7CisJCWluZm8tPnR4X2FjdGl2ZSA9IDA7CisJCWluZm8tPmllMF92YWx1ZSAmPSB+VFhSRFlFOworCQl3cml0ZV9yZWcoaW5mbywgSUUwLCBpbmZvLT5pZTBfdmFsdWUpOworCX0KKworCWlmIChpbmZvLT50eF9jb3VudCA8IFdBS0VVUF9DSEFSUykKKwkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9UUkFOU01JVDsKK30KKwordm9pZCBpc3JfcnhkbWFvayhTTE1QX0lORk8gKiBpbmZvKQoreworCS8qIEJJVDcgPSBFT1QgKGVuZCBvZiB0cmFuc2ZlcikKKwkgKiBCSVQ2ID0gRU9NIChlbmQgb2YgbWVzc2FnZS9mcmFtZSkKKwkgKi8KKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IHJlYWRfcmVnKGluZm8sUlhETUEgKyBEU1IpICYgMHhjMDsKKworCS8qIGNsZWFyIElSUSAoQklUMCBtdXN0IGJlIDEgdG8gcHJldmVudCBjbGVhcmluZyBERSBiaXQpICovCisJd3JpdGVfcmVnKGluZm8sIFJYRE1BICsgRFNSLCAodW5zaWduZWQgY2hhcikoc3RhdHVzIHwgMSkpOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQlwcmludGsoIiVzKCVkKTolcyBpc3JfcnhkbWFvaygpLCBzdGF0dXM9JTAyeFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHN0YXR1cyk7CisKKwlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1JFQ0VJVkU7Cit9CisKK3ZvaWQgaXNyX3J4ZG1hZXJyb3IoU0xNUF9JTkZPICogaW5mbykKK3sKKwkvKiBCSVQ1ID0gQk9GIChidWZmZXIgb3ZlcmZsb3cpCisJICogQklUNCA9IENPRiAoY291bnRlciBvdmVyZmxvdykKKwkgKi8KKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IHJlYWRfcmVnKGluZm8sUlhETUEgKyBEU1IpICYgMHgzMDsKKworCS8qIGNsZWFyIElSUSAoQklUMCBtdXN0IGJlIDEgdG8gcHJldmVudCBjbGVhcmluZyBERSBiaXQpICovCisJd3JpdGVfcmVnKGluZm8sIFJYRE1BICsgRFNSLCAodW5zaWduZWQgY2hhcikoc3RhdHVzIHwgMSkpOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQlwcmludGsoIiVzKCVkKTolcyBpc3JfcnhkbWFlcnJvcigpLCBzdGF0dXM9JTAyeFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHN0YXR1cyk7CisKKwlpbmZvLT5yeF9vdmVyZmxvdyA9IFRSVUU7CisJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9SRUNFSVZFOworfQorCit2b2lkIGlzcl90eGRtYW9rKFNMTVBfSU5GTyAqIGluZm8pCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXNfcmVnMSA9IHJlYWRfcmVnKGluZm8sIFNSMSk7CisKKwl3cml0ZV9yZWcoaW5mbywgVFhETUEgKyBESVIsIDB4MDApOwkvKiBkaXNhYmxlIFR4IERNQSBJUlFzICovCisJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRFNSLCAweGMwKTsgLyogY2xlYXIgSVJRcyBhbmQgZGlzYWJsZSBETUEgKi8KKwl3cml0ZV9yZWcoaW5mbywgVFhETUEgKyBEQ01ELCBTV0FCT1JUKTsJLyogcmVzZXQvaW5pdCBETUEgY2hhbm5lbCAqLworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQlwcmludGsoIiVzKCVkKTolcyBpc3JfdHhkbWFvaygpLCBzdGF0dXM9JTAyeFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHN0YXR1c19yZWcxKTsKKworCS8qIHByb2dyYW0gVFhSRFkgYXMgRklGTyBlbXB0eSBmbGFnLCBlbmFibGUgVFhSRFkgSVJRICovCisJd3JpdGVfcmVnMTYoaW5mbywgVFJDMCwgMCk7CisJaW5mby0+aWUwX3ZhbHVlIHw9IFRYUkRZRTsKKwl3cml0ZV9yZWcoaW5mbywgSUUwLCBpbmZvLT5pZTBfdmFsdWUpOworfQorCit2b2lkIGlzcl90eGRtYWVycm9yKFNMTVBfSU5GTyAqIGluZm8pCit7CisJLyogQklUNSA9IEJPRiAoYnVmZmVyIG92ZXJmbG93KQorCSAqIEJJVDQgPSBDT0YgKGNvdW50ZXIgb3ZlcmZsb3cpCisJICovCisJdW5zaWduZWQgY2hhciBzdGF0dXMgPSByZWFkX3JlZyhpbmZvLFRYRE1BICsgRFNSKSAmIDB4MzA7CisKKwkvKiBjbGVhciBJUlEgKEJJVDAgbXVzdCBiZSAxIHRvIHByZXZlbnQgY2xlYXJpbmcgREUgYml0KSAqLworCXdyaXRlX3JlZyhpbmZvLCBUWERNQSArIERTUiwgKHVuc2lnbmVkIGNoYXIpKHN0YXR1cyB8IDEpKTsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJcHJpbnRrKCIlcyglZCk6JXMgaXNyX3R4ZG1hZXJyb3IoKSwgc3RhdHVzPSUwMnhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxzdGF0dXMpOworfQorCisvKiBoYW5kbGUgaW5wdXQgc2VyaWFsIHNpZ25hbCBjaGFuZ2VzCisgKi8KK3ZvaWQgaXNyX2lvX3BpbiggU0xNUF9JTkZPICppbmZvLCB1MTYgc3RhdHVzICkKK3sKKyAJc3RydWN0CW1nc2xfaWNvdW50ICppY291bnQ7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCXByaW50aygiJXMoJWQpOmlzcl9pb19waW4gc3RhdHVzPSUwNFhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIChNSVNDU1RBVFVTX0NUU19MQVRDSEVEIHwgTUlTQ1NUQVRVU19EQ0RfTEFUQ0hFRCB8CisJICAgICAgICAgICAgICBNSVNDU1RBVFVTX0RTUl9MQVRDSEVEIHwgTUlTQ1NUQVRVU19SSV9MQVRDSEVEKSApIHsKKwkJaWNvdW50ID0gJmluZm8tPmljb3VudDsKKwkJLyogdXBkYXRlIGlucHV0IGxpbmUgY291bnRlcnMgKi8KKwkJaWYgKHN0YXR1cyAmIE1JU0NTVEFUVVNfUklfTEFUQ0hFRCkgeworCQkJaWNvdW50LT5ybmcrKzsKKwkJCWlmICggc3RhdHVzICYgU2VyaWFsU2lnbmFsX1JJICkKKwkJCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLnJpX3VwKys7CisJCQllbHNlCisJCQkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5yaV9kb3duKys7CisJCX0KKwkJaWYgKHN0YXR1cyAmIE1JU0NTVEFUVVNfRFNSX0xBVENIRUQpIHsKKwkJCWljb3VudC0+ZHNyKys7CisJCQlpZiAoIHN0YXR1cyAmIFNlcmlhbFNpZ25hbF9EU1IgKQorCQkJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuZHNyX3VwKys7CisJCQllbHNlCisJCQkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kc3JfZG93bisrOworCQl9CisJCWlmIChzdGF0dXMgJiBNSVNDU1RBVFVTX0RDRF9MQVRDSEVEKSB7CisJCQlpZiAoKGluZm8tPmRjZF9jaGtjb3VudCkrKyA+PSBJT19QSU5fU0hVVERPV05fTElNSVQpIHsKKwkJCQlpbmZvLT5pZTFfdmFsdWUgJj0gfkNEQ0Q7CisJCQkJd3JpdGVfcmVnKGluZm8sIElFMSwgaW5mby0+aWUxX3ZhbHVlKTsKKwkJCX0KKwkJCWljb3VudC0+ZGNkKys7CisJCQlpZiAoc3RhdHVzICYgU2VyaWFsU2lnbmFsX0RDRCkgeworCQkJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuZGNkX3VwKys7CisJCQl9IGVsc2UKKwkJCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmRjZF9kb3duKys7CisjaWZkZWYgQ09ORklHX0hETEMKKwkJCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJCQloZGxjX3NldF9jYXJyaWVyKHN0YXR1cyAmIFNlcmlhbFNpZ25hbF9EQ0QsIGluZm8tPm5ldGRldik7CisjZW5kaWYKKwkJfQorCQlpZiAoc3RhdHVzICYgTUlTQ1NUQVRVU19DVFNfTEFUQ0hFRCkKKwkJeworCQkJaWYgKChpbmZvLT5jdHNfY2hrY291bnQpKysgPj0gSU9fUElOX1NIVVRET1dOX0xJTUlUKSB7CisJCQkJaW5mby0+aWUxX3ZhbHVlICY9IH5DQ1RTOworCQkJCXdyaXRlX3JlZyhpbmZvLCBJRTEsIGluZm8tPmllMV92YWx1ZSk7CisJCQl9CisJCQlpY291bnQtPmN0cysrOworCQkJaWYgKCBzdGF0dXMgJiBTZXJpYWxTaWduYWxfQ1RTICkKKwkJCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmN0c191cCsrOworCQkJZWxzZQorCQkJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuY3RzX2Rvd24rKzsKKwkJfQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisKKwkJaWYgKCAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgJiYKKwkJICAgICAoc3RhdHVzICYgTUlTQ1NUQVRVU19EQ0RfTEFUQ0hFRCkgKSB7CisJCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCQkJcHJpbnRrKCIlcyBDRCBub3cgJXMuLi4iLCBpbmZvLT5kZXZpY2VfbmFtZSwKKwkJCQkgICAgICAgKHN0YXR1cyAmIFNlcmlhbFNpZ25hbF9EQ0QpID8gIm9uIiA6ICJvZmYiKTsKKwkJCWlmIChzdGF0dXMgJiBTZXJpYWxTaWduYWxfRENEKQorCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKwkJCWVsc2UgeworCQkJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJCQkJcHJpbnRrKCJkb2luZyBzZXJpYWwgaGFuZ3VwLi4uIik7CisJCQkJaWYgKGluZm8tPnR0eSkKKwkJCQkJdHR5X2hhbmd1cChpbmZvLT50dHkpOworCQkJfQorCQl9CisKKwkJaWYgKCAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgJiYKKwkJICAgICAoc3RhdHVzICYgTUlTQ1NUQVRVU19DVFNfTEFUQ0hFRCkgKSB7CisJCQlpZiAoIGluZm8tPnR0eSApIHsKKwkJCQlpZiAoaW5mby0+dHR5LT5od19zdG9wcGVkKSB7CisJCQkJCWlmIChzdGF0dXMgJiBTZXJpYWxTaWduYWxfQ1RTKSB7CisJCQkJCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCQkJCQkJcHJpbnRrKCJDVFMgdHggc3RhcnQuLi4iKTsKKwkJCSAJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAwOworCQkJCQkJdHhfc3RhcnQoaW5mbyk7CisJCQkJCQlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1RSQU5TTUlUOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCEoc3RhdHVzICYgU2VyaWFsU2lnbmFsX0NUUykpIHsKKwkJCQkJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkKKwkJCQkJCQlwcmludGsoIkNUUyB0eCBzdG9wLi4uIik7CisJCQkgCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMTsKKwkJCQkJCXR4X3N0b3AoaW5mbyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1NUQVRVUzsKK30KKworLyogSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBlbnRyeSBwb2ludC4KKyAqCisgKiBBcmd1bWVudHM6CisgKiAJaXJxCQlpbnRlcnJ1cHQgbnVtYmVyIHRoYXQgY2F1c2VkIGludGVycnVwdAorICogCWRldl9pZAkJZGV2aWNlIElEIHN1cHBsaWVkIGR1cmluZyBpbnRlcnJ1cHQgcmVnaXN0cmF0aW9uCisgKiAJcmVncwkJaW50ZXJydXB0ZWQgcHJvY2Vzc29yIGNvbnRleHQKKyAqLworc3RhdGljIGlycXJldHVybl90IHN5bmNsaW5rbXBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJU0xNUF9JTkZPICogaW5mbzsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cywgc3RhdHVzMCwgc3RhdHVzMT0wOworCXVuc2lnbmVkIGNoYXIgZG1hc3RhdHVzLCBkbWFzdGF0dXMwLCBkbWFzdGF0dXMxPTA7CisJdW5zaWduZWQgY2hhciB0aW1lcnN0YXR1czAsIHRpbWVyc3RhdHVzMT0wOworCXVuc2lnbmVkIGNoYXIgc2hpZnQ7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgc2hvcnQgdG1wOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQlwcmludGsoIiVzKCVkKTogc3luY2xpbmttcF9pbnRlcnJ1cHQoJWQpZW50cnkuXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saXJxKTsKKworCWluZm8gPSAoU0xNUF9JTkZPICopZGV2X2lkOworCWlmICghaW5mbykKKwkJcmV0dXJuIElSUV9OT05FOworCisJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKKworCWZvcig7OykgeworCisJCS8qIGdldCBzdGF0dXMgZm9yIFNDQTAgKHBvcnRzIDAtMSkgKi8KKwkJdG1wID0gcmVhZF9yZWcxNihpbmZvLCBJU1IwKTsJLyogZ2V0IElTUjAgYW5kIElTUjEgaW4gb25lIHJlYWQgKi8KKwkJc3RhdHVzMCA9ICh1bnNpZ25lZCBjaGFyKXRtcDsKKwkJZG1hc3RhdHVzMCA9ICh1bnNpZ25lZCBjaGFyKSh0bXA+PjgpOworCQl0aW1lcnN0YXR1czAgPSByZWFkX3JlZyhpbmZvLCBJU1IyKTsKKworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCQlwcmludGsoIiVzKCVkKTolcyBzdGF0dXMwPSUwMngsIGRtYXN0YXR1czA9JTAyeCwgdGltZXJzdGF0dXMwPSUwMnhcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsCisJCQkJc3RhdHVzMCxkbWFzdGF0dXMwLHRpbWVyc3RhdHVzMCk7CisKKwkJaWYgKGluZm8tPnBvcnRfY291bnQgPT0gNCkgeworCQkJLyogZ2V0IHN0YXR1cyBmb3IgU0NBMSAocG9ydHMgMi0zKSAqLworCQkJdG1wID0gcmVhZF9yZWcxNihpbmZvLT5wb3J0X2FycmF5WzJdLCBJU1IwKTsKKwkJCXN0YXR1czEgPSAodW5zaWduZWQgY2hhcil0bXA7CisJCQlkbWFzdGF0dXMxID0gKHVuc2lnbmVkIGNoYXIpKHRtcD4+OCk7CisJCQl0aW1lcnN0YXR1czEgPSByZWFkX3JlZyhpbmZvLT5wb3J0X2FycmF5WzJdLCBJU1IyKTsKKworCQkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQkJCXByaW50aygiJXMoJWQpOiVzIHN0YXR1czE9JTAyeCwgZG1hc3RhdHVzMT0lMDJ4LCB0aW1lcnN0YXR1czE9JTAyeFxuIiwKKwkJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsCisJCQkJCXN0YXR1czEsZG1hc3RhdHVzMSx0aW1lcnN0YXR1czEpOworCQl9CisKKwkJaWYgKCFzdGF0dXMwICYmICFkbWFzdGF0dXMwICYmICF0aW1lcnN0YXR1czAgJiYKKwkJCSAhc3RhdHVzMSAmJiAhZG1hc3RhdHVzMSAmJiAhdGltZXJzdGF0dXMxKQorCQkJYnJlYWs7CisKKwkJZm9yKGk9MDsgaSA8IGluZm8tPnBvcnRfY291bnQgOyBpKyspIHsKKwkJCWlmIChpbmZvLT5wb3J0X2FycmF5W2ldID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQlpZiAoaSA8IDIpIHsKKwkJCQlzdGF0dXMgPSBzdGF0dXMwOworCQkJCWRtYXN0YXR1cyA9IGRtYXN0YXR1czA7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IHN0YXR1czE7CisJCQkJZG1hc3RhdHVzID0gZG1hc3RhdHVzMTsKKwkJCX0KKworCQkJc2hpZnQgPSBpICYgMSA/IDQgOjA7CisKKwkJCWlmIChzdGF0dXMgJiBCSVQwIDw8IHNoaWZ0KQorCQkJCWlzcl9yeHJkeShpbmZvLT5wb3J0X2FycmF5W2ldKTsKKwkJCWlmIChzdGF0dXMgJiBCSVQxIDw8IHNoaWZ0KQorCQkJCWlzcl90eHJkeShpbmZvLT5wb3J0X2FycmF5W2ldKTsKKwkJCWlmIChzdGF0dXMgJiBCSVQyIDw8IHNoaWZ0KQorCQkJCWlzcl9yeGludChpbmZvLT5wb3J0X2FycmF5W2ldKTsKKwkJCWlmIChzdGF0dXMgJiBCSVQzIDw8IHNoaWZ0KQorCQkJCWlzcl90eGludChpbmZvLT5wb3J0X2FycmF5W2ldKTsKKworCQkJaWYgKGRtYXN0YXR1cyAmIEJJVDAgPDwgc2hpZnQpCisJCQkJaXNyX3J4ZG1hZXJyb3IoaW5mby0+cG9ydF9hcnJheVtpXSk7CisJCQlpZiAoZG1hc3RhdHVzICYgQklUMSA8PCBzaGlmdCkKKwkJCQlpc3JfcnhkbWFvayhpbmZvLT5wb3J0X2FycmF5W2ldKTsKKwkJCWlmIChkbWFzdGF0dXMgJiBCSVQyIDw8IHNoaWZ0KQorCQkJCWlzcl90eGRtYWVycm9yKGluZm8tPnBvcnRfYXJyYXlbaV0pOworCQkJaWYgKGRtYXN0YXR1cyAmIEJJVDMgPDwgc2hpZnQpCisJCQkJaXNyX3R4ZG1hb2soaW5mby0+cG9ydF9hcnJheVtpXSk7CisJCX0KKworCQlpZiAodGltZXJzdGF0dXMwICYgKEJJVDUgfCBCSVQ0KSkKKwkJCWlzcl90aW1lcihpbmZvLT5wb3J0X2FycmF5WzBdKTsKKwkJaWYgKHRpbWVyc3RhdHVzMCAmIChCSVQ3IHwgQklUNikpCisJCQlpc3JfdGltZXIoaW5mby0+cG9ydF9hcnJheVsxXSk7CisJCWlmICh0aW1lcnN0YXR1czEgJiAoQklUNSB8IEJJVDQpKQorCQkJaXNyX3RpbWVyKGluZm8tPnBvcnRfYXJyYXlbMl0pOworCQlpZiAodGltZXJzdGF0dXMxICYgKEJJVDcgfCBCSVQ2KSkKKwkJCWlzcl90aW1lcihpbmZvLT5wb3J0X2FycmF5WzNdKTsKKwl9CisKKwlmb3IoaT0wOyBpIDwgaW5mby0+cG9ydF9jb3VudCA7IGkrKykgeworCQlTTE1QX0lORk8gKiBwb3J0ID0gaW5mby0+cG9ydF9hcnJheVtpXTsKKworCQkvKiBSZXF1ZXN0IGJvdHRvbSBoYWxmIHByb2Nlc3NpbmcgaWYgdGhlcmUncyBzb21ldGhpbmcKKwkJICogZm9yIGl0IHRvIGRvIGFuZCB0aGUgYmggaXMgbm90IGFscmVhZHkgcnVubmluZy4KKwkJICoKKwkJICogTm90ZTogc3RhcnR1cCBhZGFwdGVyIGRpYWdzIHJlcXVpcmUgaW50ZXJydXB0cy4KKwkJICogZG8gbm90IHJlcXVlc3QgYm90dG9tIGhhbGYgcHJvY2Vzc2luZyBpZiB0aGUKKwkJICogZGV2aWNlIGlzIG5vdCBvcGVuIGluIGEgbm9ybWFsIG1vZGUuCisJCSAqLworCQlpZiAoIHBvcnQgJiYgKHBvcnQtPmNvdW50IHx8IHBvcnQtPm5ldGNvdW50KSAmJgorCQkgICAgIHBvcnQtPnBlbmRpbmdfYmggJiYgIXBvcnQtPmJoX3J1bm5pbmcgJiYKKwkJICAgICAhcG9ydC0+YmhfcmVxdWVzdGVkICkgeworCQkJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKQorCQkJCXByaW50aygiJXMoJWQpOiVzIHF1ZXVlaW5nIGJoIHRhc2suXG4iLAorCQkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxwb3J0LT5kZXZpY2VfbmFtZSk7CisJCQlzY2hlZHVsZV93b3JrKCZwb3J0LT50YXNrKTsKKwkJCXBvcnQtPmJoX3JlcXVlc3RlZCA9IDE7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApCisJCXByaW50aygiJXMoJWQpOnN5bmNsaW5rbXBfaW50ZXJydXB0KCVkKWV4aXQuXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saXJxKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIEluaXRpYWxpemUgYW5kIHN0YXJ0IGRldmljZS4KKyAqLworc3RhdGljIGludCBzdGFydHVwKFNMTVBfSU5GTyAqIGluZm8pCit7CisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCIlcyglZCk6JXMgdHhfcmVsZWFzZXVwKClcbiIsX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpCisJCXJldHVybiAwOworCisJaWYgKCFpbmZvLT50eF9idWYpIHsKKwkJaW5mby0+dHhfYnVmID0gKHVuc2lnbmVkIGNoYXIgKilrbWFsbG9jKGluZm8tPm1heF9mcmFtZV9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpbmZvLT50eF9idWYpIHsKKwkJCXByaW50ayhLRVJOX0VSUiIlcyglZCk6JXMgY2FuJ3QgYWxsb2NhdGUgdHJhbnNtaXQgYnVmZmVyXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJaW5mby0+cGVuZGluZ19iaCA9IDA7CisKKwkvKiBwcm9ncmFtIGhhcmR3YXJlIGZvciBjdXJyZW50IHBhcmFtZXRlcnMgKi8KKwlyZXNldF9wb3J0KGluZm8pOworCisJY2hhbmdlX3BhcmFtcyhpbmZvKTsKKworCWluZm8tPnN0YXR1c190aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTApOworCWFkZF90aW1lcigmaW5mby0+c3RhdHVzX3RpbWVyKTsKKworCWlmIChpbmZvLT50dHkpCisJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKworCWluZm8tPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCBieSBjbG9zZSgpIGFuZCBoYW5ndXAoKSB0byBzaHV0ZG93biBoYXJkd2FyZQorICovCitzdGF0aWMgdm9pZCBzaHV0ZG93bihTTE1QX0lORk8gKiBpbmZvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJcmV0dXJuOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHN5bmNsaW5rbXBfc2h1dGRvd24oKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKworCS8qIGNsZWFyIHN0YXR1cyB3YWl0IHF1ZXVlIGJlY2F1c2Ugc3RhdHVzIGNoYW5nZXMgKi8KKwkvKiBjYW4ndCBoYXBwZW4gYWZ0ZXIgc2h1dHRpbmcgZG93biB0aGUgaGFyZHdhcmUgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKworCWRlbF90aW1lcigmaW5mby0+dHhfdGltZXIpOworCWRlbF90aW1lcigmaW5mby0+c3RhdHVzX3RpbWVyKTsKKworCWlmIChpbmZvLT50eF9idWYpIHsKKwkJa2ZyZWUoaW5mby0+dHhfYnVmKTsKKwkJaW5mby0+dHhfYnVmID0gTlVMTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZXNldF9wb3J0KGluZm8pOworCisgCWlmICghaW5mby0+dHR5IHx8IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSB7CisgCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+KFNlcmlhbFNpZ25hbF9EVFIgKyBTZXJpYWxTaWduYWxfUlRTKTsKKwkJc2V0X3NpZ25hbHMoaW5mbyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlpZiAoaW5mby0+dHR5KQorCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworfQorCitzdGF0aWMgdm9pZCBwcm9ncmFtX2h3KFNMTVBfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJcnhfc3RvcChpbmZvKTsKKwl0eF9zdG9wKGluZm8pOworCisJaW5mby0+dHhfY291bnQgPSBpbmZvLT50eF9wdXQgPSBpbmZvLT50eF9nZXQgPSAwOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDIHx8IGluZm8tPm5ldGNvdW50KQorCQloZGxjX21vZGUoaW5mbyk7CisJZWxzZQorCQlhc3luY19tb2RlKGluZm8pOworCisJc2V0X3NpZ25hbHMoaW5mbyk7CisKKwlpbmZvLT5kY2RfY2hrY291bnQgPSAwOworCWluZm8tPmN0c19jaGtjb3VudCA9IDA7CisJaW5mby0+cmlfY2hrY291bnQgPSAwOworCWluZm8tPmRzcl9jaGtjb3VudCA9IDA7CisKKwlpbmZvLT5pZTFfdmFsdWUgfD0gKENEQ0R8Q0NUUyk7CisJd3JpdGVfcmVnKGluZm8sIElFMSwgaW5mby0+aWUxX3ZhbHVlKTsKKworCWdldF9zaWduYWxzKGluZm8pOworCisJaWYgKGluZm8tPm5ldGNvdW50IHx8IChpbmZvLT50dHkgJiYgaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JFQUQpICkKKwkJcnhfc3RhcnQoaW5mbyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKK30KKworLyogUmVjb25maWd1cmUgYWRhcHRlciBiYXNlZCBvbiBuZXcgcGFyYW1ldGVycworICovCitzdGF0aWMgdm9pZCBjaGFuZ2VfcGFyYW1zKFNMTVBfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjZmxhZzsKKwlpbnQgYml0c19wZXJfY2hhcjsKKworCWlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpCisJCXJldHVybjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyBjaGFuZ2VfcGFyYW1zKClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwljZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCS8qIGlmIEIwIHJhdGUgKGhhbmd1cCkgc3BlY2lmaWVkIHRoZW4gbmVnYXRlIERUUiBhbmQgUlRTICovCisJLyogb3RoZXJ3aXNlIGFzc2VydCBEVFIgYW5kIFJUUyAqLworIAlpZiAoY2ZsYWcgJiBDQkFVRCkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CisJZWxzZQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+KFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSKTsKKworCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisKKwlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKKwkgICAgICBjYXNlIENTNTogaW5mby0+cGFyYW1zLmRhdGFfYml0cyA9IDU7IGJyZWFrOworCSAgICAgIGNhc2UgQ1M2OiBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzID0gNjsgYnJlYWs7CisJICAgICAgY2FzZSBDUzc6IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA3OyBicmVhazsKKwkgICAgICBjYXNlIENTODogaW5mby0+cGFyYW1zLmRhdGFfYml0cyA9IDg7IGJyZWFrOworCSAgICAgIC8qIE5ldmVyIGhhcHBlbnMsIGJ1dCBHQ0MgaXMgdG9vIGR1bWIgdG8gZmlndXJlIGl0IG91dCAqLworCSAgICAgIGRlZmF1bHQ6ICBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzID0gNzsgYnJlYWs7CisJICAgICAgfQorCisJaWYgKGNmbGFnICYgQ1NUT1BCKQorCQlpbmZvLT5wYXJhbXMuc3RvcF9iaXRzID0gMjsKKwllbHNlCisJCWluZm8tPnBhcmFtcy5zdG9wX2JpdHMgPSAxOworCisJaW5mby0+cGFyYW1zLnBhcml0eSA9IEFTWU5DX1BBUklUWV9OT05FOworCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQlpZiAoY2ZsYWcgJiBQQVJPREQpCisJCQlpbmZvLT5wYXJhbXMucGFyaXR5ID0gQVNZTkNfUEFSSVRZX09ERDsKKwkJZWxzZQorCQkJaW5mby0+cGFyYW1zLnBhcml0eSA9IEFTWU5DX1BBUklUWV9FVkVOOworI2lmZGVmIENNU1BBUgorCQlpZiAoY2ZsYWcgJiBDTVNQQVIpCisJCQlpbmZvLT5wYXJhbXMucGFyaXR5ID0gQVNZTkNfUEFSSVRZX1NQQUNFOworI2VuZGlmCisJfQorCisJLyogY2FsY3VsYXRlIG51bWJlciBvZiBqaWZmaWVzIHRvIHRyYW5zbWl0IGEgZnVsbAorCSAqIEZJRk8gKDMyIGJ5dGVzKSBhdCBzcGVjaWZpZWQgZGF0YSByYXRlCisJICovCisJYml0c19wZXJfY2hhciA9IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgKworCQkJaW5mby0+cGFyYW1zLnN0b3BfYml0cyArIDE7CisKKwkvKiBpZiBwb3J0IGRhdGEgcmF0ZSBpcyBzZXQgdG8gNDYwODAwIG9yIGxlc3MgdGhlbgorCSAqIGFsbG93IHR0eSBzZXR0aW5ncyB0byBvdmVycmlkZSwgb3RoZXJ3aXNlIGtlZXAgdGhlCisJICogY3VycmVudCBkYXRhIHJhdGUuCisJICovCisJaWYgKGluZm8tPnBhcmFtcy5kYXRhX3JhdGUgPD0gNDYwODAwKSB7CisJCWluZm8tPnBhcmFtcy5kYXRhX3JhdGUgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpOworCX0KKworCWlmICggaW5mby0+cGFyYW1zLmRhdGFfcmF0ZSApIHsKKwkJaW5mby0+dGltZW91dCA9ICgzMipIWipiaXRzX3Blcl9jaGFyKSAvCisJCQkJaW5mby0+cGFyYW1zLmRhdGFfcmF0ZTsKKwl9CisJaW5mby0+dGltZW91dCArPSBIWi81MDsJCS8qIEFkZCAuMDIgc2Vjb25kcyBvZiBzbG9wICovCisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKQorCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKKwllbHNlCisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKworCWlmIChjZmxhZyAmIENMT0NBTCkKKwkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworCWVsc2UKKwkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisKKwkvKiBwcm9jZXNzIHR0eSBpbnB1dCBjb250cm9sIGZsYWdzICovCisKKwlpbmZvLT5yZWFkX3N0YXR1c19tYXNrMiA9IE9WUk47CisJaWYgKElfSU5QQ0soaW5mby0+dHR5KSkKKwkJaW5mby0+cmVhZF9zdGF0dXNfbWFzazIgfD0gUEUgfCBGUk1FOworIAlpZiAoSV9CUktJTlQoaW5mby0+dHR5KSB8fCBJX1BBUk1SSyhpbmZvLT50dHkpKQorIAkJaW5mby0+cmVhZF9zdGF0dXNfbWFzazEgfD0gQlJLRDsKKwlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrMiB8PSBQRSB8IEZSTUU7CisJaWYgKElfSUdOQlJLKGluZm8tPnR0eSkpIHsKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrMSB8PSBCUktEOworCQkvKiBJZiBpZ25vcmluZyBwYXJpdHkgYW5kIGJyZWFrIGluZGljYXRvcnMsIGlnbm9yZQorCQkgKiBvdmVycnVucyB0b28uICAoRm9yIHJlYWwgcmF3IHN1cHBvcnQpLgorCQkgKi8KKwkJaWYgKElfSUdOUEFSKGluZm8tPnR0eSkpCisJCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2syIHw9IE9WUk47CisJfQorCisJcHJvZ3JhbV9odyhpbmZvKTsKK30KKworc3RhdGljIGludCBnZXRfc3RhdHMoU0xNUF9JTkZPICogaW5mbywgc3RydWN0IG1nc2xfaWNvdW50IF9fdXNlciAqdXNlcl9pY291bnQpCit7CisJaW50IGVycjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyBnZXRfcGFyYW1zKClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lKTsKKworCUNPUFlfVE9fVVNFUihlcnIsdXNlcl9pY291bnQsICZpbmZvLT5pY291bnQsIHNpemVvZihzdHJ1Y3QgbWdzbF9pY291bnQpKTsKKwlpZiAoZXJyKSB7CisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCQlwcmludGsoICIlcyglZCk6JXMgZ2V0X3N0YXRzKCkgdXNlciBidWZmZXIgY29weSBmYWlsZWRcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfcGFyYW1zKFNMTVBfSU5GTyAqIGluZm8sIE1HU0xfUEFSQU1TIF9fdXNlciAqdXNlcl9wYXJhbXMpCit7CisJaW50IGVycjsKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgZ2V0X3BhcmFtcygpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwlDT1BZX1RPX1VTRVIoZXJyLHVzZXJfcGFyYW1zLCAmaW5mby0+cGFyYW1zLCBzaXplb2YoTUdTTF9QQVJBTVMpKTsKKwlpZiAoZXJyKSB7CisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCQlwcmludGsoICIlcyglZCk6JXMgZ2V0X3BhcmFtcygpIHVzZXIgYnVmZmVyIGNvcHkgZmFpbGVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3BhcmFtcyhTTE1QX0lORk8gKiBpbmZvLCBNR1NMX1BBUkFNUyBfX3VzZXIgKm5ld19wYXJhbXMpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTUdTTF9QQVJBTVMgdG1wX3BhcmFtczsKKwlpbnQgZXJyOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHNldF9wYXJhbXNcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSApOworCUNPUFlfRlJPTV9VU0VSKGVyciwmdG1wX3BhcmFtcywgbmV3X3BhcmFtcywgc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJaWYgKGVycikgeworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQkJcHJpbnRrKCAiJXMoJWQpOiVzIHNldF9wYXJhbXMoKSB1c2VyIGJ1ZmZlciBjb3B5IGZhaWxlZFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwltZW1jcHkoJmluZm8tPnBhcmFtcywmdG1wX3BhcmFtcyxzaXplb2YoTUdTTF9QQVJBTVMpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworIAljaGFuZ2VfcGFyYW1zKGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3R4aWRsZShTTE1QX0lORk8gKiBpbmZvLCBpbnQgX191c2VyICppZGxlX21vZGUpCit7CisJaW50IGVycjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyBnZXRfdHhpZGxlKCk9JWRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pZGxlX21vZGUpOworCisJQ09QWV9UT19VU0VSKGVycixpZGxlX21vZGUsICZpbmZvLT5pZGxlX21vZGUsIHNpemVvZihpbnQpKTsKKwlpZiAoZXJyKSB7CisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCQlwcmludGsoICIlcyglZCk6JXMgZ2V0X3R4aWRsZSgpIHVzZXIgYnVmZmVyIGNvcHkgZmFpbGVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3R4aWRsZShTTE1QX0lORk8gKiBpbmZvLCBpbnQgaWRsZV9tb2RlKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHNldF90eGlkbGUoJWQpXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGlkbGVfbW9kZSApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWluZm8tPmlkbGVfbW9kZSA9IGlkbGVfbW9kZTsKKwl0eF9zZXRfaWRsZSggaW5mbyApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR4X2VuYWJsZShTTE1QX0lORk8gKiBpbmZvLCBpbnQgZW5hYmxlKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHR4X2VuYWJsZSglZClcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgZW5hYmxlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoIGVuYWJsZSApIHsKKwkJaWYgKCAhaW5mby0+dHhfZW5hYmxlZCApIHsKKwkJCXR4X3N0YXJ0KGluZm8pOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCBpbmZvLT50eF9lbmFibGVkICkKKwkJCXR4X3N0b3AoaW5mbyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKiBhYm9ydCBzZW5kIEhETEMgZnJhbWUKKyAqLworc3RhdGljIGludCB0eF9hYm9ydChTTE1QX0lORk8gKiBpbmZvKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHR4X2Fib3J0KClcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaWYgKCBpbmZvLT50eF9hY3RpdmUgJiYgaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMgKSB7CisJCWluZm8tPmllMV92YWx1ZSAmPSB+VURSTjsKKwkJaW5mby0+aWUxX3ZhbHVlIHw9IElETEU7CisJCXdyaXRlX3JlZyhpbmZvLCBJRTEsIGluZm8tPmllMV92YWx1ZSk7CS8qIGRpc2FibGUgdHggc3RhdHVzIGludGVycnVwdHMgKi8KKwkJd3JpdGVfcmVnKGluZm8sIFNSMSwgKHVuc2lnbmVkIGNoYXIpKElETEUgKyBVRFJOKSk7CS8qIGNsZWFyIHBlbmRpbmcgKi8KKworCQl3cml0ZV9yZWcoaW5mbywgVFhETUEgKyBEU1IsIDApOwkJLyogZGlzYWJsZSBETUEgY2hhbm5lbCAqLworCQl3cml0ZV9yZWcoaW5mbywgVFhETUEgKyBEQ01ELCBTV0FCT1JUKTsJLyogcmVzZXQvaW5pdCBETUEgY2hhbm5lbCAqLworCisgICAJCXdyaXRlX3JlZyhpbmZvLCBDTUQsIFRYQUJPUlQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByeF9lbmFibGUoU0xNUF9JTkZPICogaW5mbywgaW50IGVuYWJsZSkKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyByeF9lbmFibGUoJWQpXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsZW5hYmxlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoIGVuYWJsZSApIHsKKwkJaWYgKCAhaW5mby0+cnhfZW5hYmxlZCApCisJCQlyeF9zdGFydChpbmZvKTsKKwl9IGVsc2UgeworCQlpZiAoIGluZm8tPnJ4X2VuYWJsZWQgKQorCQkJcnhfc3RvcChpbmZvKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFwX3N0YXR1cyhpbnQgc2lnbmFscykKK3sKKwkvKiBNYXAgc3RhdHVzIGJpdHMgdG8gQVBJIGV2ZW50IGJpdHMgKi8KKworCXJldHVybiAoKHNpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFNSKSA/IE1nc2xFdmVudF9Ec3JBY3RpdmUgOiBNZ3NsRXZlbnRfRHNySW5hY3RpdmUpICsKKwkgICAgICAgKChzaWduYWxzICYgU2VyaWFsU2lnbmFsX0NUUykgPyBNZ3NsRXZlbnRfQ3RzQWN0aXZlIDogTWdzbEV2ZW50X0N0c0luYWN0aXZlKSArCisJICAgICAgICgoc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpID8gTWdzbEV2ZW50X0RjZEFjdGl2ZSA6IE1nc2xFdmVudF9EY2RJbmFjdGl2ZSkgKworCSAgICAgICAoKHNpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpICA/IE1nc2xFdmVudF9SaUFjdGl2ZSA6IE1nc2xFdmVudF9SaUluYWN0aXZlKTsKK30KKworLyogd2FpdCBmb3Igc3BlY2lmaWVkIGV2ZW50IHRvIG9jY3VyCisgKi8KK3N0YXRpYyBpbnQgd2FpdF9tZ3NsX2V2ZW50KFNMTVBfSU5GTyAqIGluZm8sIGludCBfX3VzZXIgKm1hc2tfcHRyKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzOworCWludCByYz0wOworCXN0cnVjdCBtZ3NsX2ljb3VudCBjcHJldiwgY25vdzsKKwlpbnQgZXZlbnRzOworCWludCBtYXNrOworCXN0cnVjdAlfaW5wdXRfc2lnbmFsX2V2ZW50cyBvbGRzaWdzLCBuZXdzaWdzOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJQ09QWV9GUk9NX1VTRVIocmMsJm1hc2ssIG1hc2tfcHRyLCBzaXplb2YoaW50KSk7CisJaWYgKHJjKSB7CisJCXJldHVybiAgLUVGQVVMVDsKKwl9CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgd2FpdF9tZ3NsX2V2ZW50KCVkKVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLG1hc2spOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJLyogcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHN0YXRlIG1hdGNoZXMgcmVxdWVzdGVkIGV2ZW50cyAqLworCWdldF9zaWduYWxzKGluZm8pOworCXMgPSBtYXBfc3RhdHVzKGluZm8tPnNlcmlhbF9zaWduYWxzKTsKKworCWV2ZW50cyA9IG1hc2sgJgorCQkoICgocyAmIFNlcmlhbFNpZ25hbF9EU1IpID8gTWdzbEV2ZW50X0RzckFjdGl2ZTpNZ3NsRXZlbnRfRHNySW5hY3RpdmUpICsKKyAJCSAgKChzICYgU2VyaWFsU2lnbmFsX0RDRCkgPyBNZ3NsRXZlbnRfRGNkQWN0aXZlOk1nc2xFdmVudF9EY2RJbmFjdGl2ZSkgKworCQkgICgocyAmIFNlcmlhbFNpZ25hbF9DVFMpID8gTWdzbEV2ZW50X0N0c0FjdGl2ZTpNZ3NsRXZlbnRfQ3RzSW5hY3RpdmUpICsKKwkJICAoKHMgJiBTZXJpYWxTaWduYWxfUkkpICA/IE1nc2xFdmVudF9SaUFjdGl2ZSA6TWdzbEV2ZW50X1JpSW5hY3RpdmUpICk7CisJaWYgKGV2ZW50cykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIHNhdmUgY3VycmVudCBpcnEgY291bnRzICovCisJY3ByZXYgPSBpbmZvLT5pY291bnQ7CisJb2xkc2lncyA9IGluZm8tPmlucHV0X3NpZ25hbF9ldmVudHM7CisKKwkvKiBlbmFibGUgaHVudCBhbmQgaWRsZSBpcnFzIGlmIG5lZWRlZCAqLworCWlmIChtYXNrICYgKE1nc2xFdmVudF9FeGl0SHVudE1vZGUrTWdzbEV2ZW50X0lkbGVSZWNlaXZlZCkpIHsKKwkJdW5zaWduZWQgY2hhciBvbGR2YWwgPSBpbmZvLT5pZTFfdmFsdWU7CisJCXVuc2lnbmVkIGNoYXIgbmV3dmFsID0gb2xkdmFsICsKKwkJCSAobWFzayAmIE1nc2xFdmVudF9FeGl0SHVudE1vZGUgPyBGTEdEOjApICsKKwkJCSAobWFzayAmIE1nc2xFdmVudF9JZGxlUmVjZWl2ZWQgPyBJRExEOjApOworCQlpZiAoIG9sZHZhbCAhPSBuZXd2YWwgKSB7CisJCQlpbmZvLT5pZTFfdmFsdWUgPSBuZXd2YWw7CisJCQl3cml0ZV9yZWcoaW5mbywgSUUxLCBpbmZvLT5pZTFfdmFsdWUpOworCQl9CisJfQorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+ZXZlbnRfd2FpdF9xLCAmd2FpdCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCWZvcig7OykgeworCQlzY2hlZHVsZSgpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJjID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBnZXQgY3VycmVudCBpcnEgY291bnRzICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJY25vdyA9IGluZm8tPmljb3VudDsKKwkJbmV3c2lncyA9IGluZm8tPmlucHV0X3NpZ25hbF9ldmVudHM7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJCS8qIGlmIG5vIGNoYW5nZSwgd2FpdCBhYm9ydGVkIGZvciBzb21lIHJlYXNvbiAqLworCQlpZiAobmV3c2lncy5kc3JfdXAgICA9PSBvbGRzaWdzLmRzcl91cCAgICYmCisJCSAgICBuZXdzaWdzLmRzcl9kb3duID09IG9sZHNpZ3MuZHNyX2Rvd24gJiYKKwkJICAgIG5ld3NpZ3MuZGNkX3VwICAgPT0gb2xkc2lncy5kY2RfdXAgICAmJgorCQkgICAgbmV3c2lncy5kY2RfZG93biA9PSBvbGRzaWdzLmRjZF9kb3duICYmCisJCSAgICBuZXdzaWdzLmN0c191cCAgID09IG9sZHNpZ3MuY3RzX3VwICAgJiYKKwkJICAgIG5ld3NpZ3MuY3RzX2Rvd24gPT0gb2xkc2lncy5jdHNfZG93biAmJgorCQkgICAgbmV3c2lncy5yaV91cCAgICA9PSBvbGRzaWdzLnJpX3VwICAgICYmCisJCSAgICBuZXdzaWdzLnJpX2Rvd24gID09IG9sZHNpZ3MucmlfZG93biAgJiYKKwkJICAgIGNub3cuZXhpdGh1bnQgICAgPT0gY3ByZXYuZXhpdGh1bnQgICAmJgorCQkgICAgY25vdy5yeGlkbGUgICAgICA9PSBjcHJldi5yeGlkbGUpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisKKwkJZXZlbnRzID0gbWFzayAmCisJCQkoIChuZXdzaWdzLmRzcl91cCAgICE9IG9sZHNpZ3MuZHNyX3VwICAgPyBNZ3NsRXZlbnRfRHNyQWN0aXZlOjApICAgKworCQkJICAobmV3c2lncy5kc3JfZG93biAhPSBvbGRzaWdzLmRzcl9kb3duID8gTWdzbEV2ZW50X0RzckluYWN0aXZlOjApICsKKwkJCSAgKG5ld3NpZ3MuZGNkX3VwICAgIT0gb2xkc2lncy5kY2RfdXAgICA/IE1nc2xFdmVudF9EY2RBY3RpdmU6MCkgICArCisJCQkgIChuZXdzaWdzLmRjZF9kb3duICE9IG9sZHNpZ3MuZGNkX2Rvd24gPyBNZ3NsRXZlbnRfRGNkSW5hY3RpdmU6MCkgKworCQkJICAobmV3c2lncy5jdHNfdXAgICAhPSBvbGRzaWdzLmN0c191cCAgID8gTWdzbEV2ZW50X0N0c0FjdGl2ZTowKSAgICsKKwkJCSAgKG5ld3NpZ3MuY3RzX2Rvd24gIT0gb2xkc2lncy5jdHNfZG93biA/IE1nc2xFdmVudF9DdHNJbmFjdGl2ZTowKSArCisJCQkgIChuZXdzaWdzLnJpX3VwICAgICE9IG9sZHNpZ3MucmlfdXAgICAgPyBNZ3NsRXZlbnRfUmlBY3RpdmU6MCkgICAgKworCQkJICAobmV3c2lncy5yaV9kb3duICAhPSBvbGRzaWdzLnJpX2Rvd24gID8gTWdzbEV2ZW50X1JpSW5hY3RpdmU6MCkgICsKKwkJCSAgKGNub3cuZXhpdGh1bnQgICAgIT0gY3ByZXYuZXhpdGh1bnQgICA/IE1nc2xFdmVudF9FeGl0SHVudE1vZGU6MCkgKworCQkJICAoY25vdy5yeGlkbGUgICAgICAhPSBjcHJldi5yeGlkbGUgICAgID8gTWdzbEV2ZW50X0lkbGVSZWNlaXZlZDowKSApOworCQlpZiAoZXZlbnRzKQorCQkJYnJlYWs7CisKKwkJY3ByZXYgPSBjbm93OworCQlvbGRzaWdzID0gbmV3c2lnczsKKwl9CisKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+ZXZlbnRfd2FpdF9xLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCisJaWYgKG1hc2sgJiAoTWdzbEV2ZW50X0V4aXRIdW50TW9kZSArIE1nc2xFdmVudF9JZGxlUmVjZWl2ZWQpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaWYgKCF3YWl0cXVldWVfYWN0aXZlKCZpbmZvLT5ldmVudF93YWl0X3EpKSB7CisJCQkvKiBkaXNhYmxlIGVuYWJsZSBleGl0IGh1bnQgbW9kZS9pZGxlIHJjdmQgSVJRcyAqLworCQkJaW5mby0+aWUxX3ZhbHVlICY9IH4oRkxHRHxJRExEKTsKKwkJCXdyaXRlX3JlZyhpbmZvLCBJRTEsIGluZm8tPmllMV92YWx1ZSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJfQorZXhpdDoKKwlpZiAoIHJjID09IDAgKQorCQlQVVRfVVNFUihyYywgZXZlbnRzLCBtYXNrX3B0cik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbW9kZW1faW5wdXRfd2FpdChTTE1QX0lORk8gKmluZm8saW50IGFyZykKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisJc3RydWN0IG1nc2xfaWNvdW50IGNwcmV2LCBjbm93OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJLyogc2F2ZSBjdXJyZW50IGlycSBjb3VudHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJY3ByZXYgPSBpbmZvLT5pY291bnQ7CisJYWRkX3dhaXRfcXVldWUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJZm9yKDs7KSB7CisJCXNjaGVkdWxlKCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmMgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGdldCBuZXcgaXJxIGNvdW50cyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJCS8qIGlmIG5vIGNoYW5nZSwgd2FpdCBhYm9ydGVkIGZvciBzb21lIHJlYXNvbiAqLworCQlpZiAoY25vdy5ybmcgPT0gY3ByZXYucm5nICYmIGNub3cuZHNyID09IGNwcmV2LmRzciAmJgorCQkgICAgY25vdy5kY2QgPT0gY3ByZXYuZGNkICYmIGNub3cuY3RzID09IGNwcmV2LmN0cykgeworCQkJcmMgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBjaGVjayBmb3IgY2hhbmdlIGluIGNhbGxlciBzcGVjaWZpZWQgbW9kZW0gaW5wdXQgKi8KKwkJaWYgKChhcmcgJiBUSU9DTV9STkcgJiYgY25vdy5ybmcgIT0gY3ByZXYucm5nKSB8fAorCQkgICAgKGFyZyAmIFRJT0NNX0RTUiAmJiBjbm93LmRzciAhPSBjcHJldi5kc3IpIHx8CisJCSAgICAoYXJnICYgVElPQ01fQ0QgICYmIGNub3cuZGNkICE9IGNwcmV2LmRjZCkgfHwKKwkJICAgIChhcmcgJiBUSU9DTV9DVFMgJiYgY25vdy5jdHMgIT0gY3ByZXYuY3RzKSkgeworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQljcHJldiA9IGNub3c7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHJldHVybiB0aGUgc3RhdGUgb2YgdGhlIHNlcmlhbCBjb250cm9sIGFuZCBzdGF0dXMgc2lnbmFscworICovCitzdGF0aWMgaW50IHRpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGludCByZXN1bHQ7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisgCWdldF9zaWduYWxzKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJcmVzdWx0ID0gKChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpID8gVElPQ01fUlRTOjApICsKKwkJKChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EVFIpID8gVElPQ01fRFRSOjApICsKKwkJKChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpID8gVElPQ01fQ0FSOjApICsKKwkJKChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SSSkgID8gVElPQ01fUk5HOjApICsKKwkJKChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EU1IpID8gVElPQ01fRFNSOjApICsKKwkJKChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9DVFMpID8gVElPQ01fQ1RTOjApOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOiVzIHRpb2NtZ2V0KCkgdmFsdWU9JTA4WFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIHJlc3VsdCApOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIHNldCBtb2RlbSBjb250cm9sIHNpZ25hbHMgKERUUi9SVFMpCisgKi8KK3N0YXRpYyBpbnQgdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJU0xNUF9JTkZPICppbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgdGlvY21zZXQoJXgsJXgpXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIHNldCwgY2xlYXIpOworCisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUzsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfRFRSOworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gflNlcmlhbFNpZ25hbF9SVFM7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+U2VyaWFsU2lnbmFsX0RUUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKyAJc2V0X3NpZ25hbHMoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qIEJsb2NrIHRoZSBjdXJyZW50IHByb2Nlc3MgdW50aWwgdGhlIHNwZWNpZmllZCBwb3J0IGlzIHJlYWR5IHRvIG9wZW4uCisgKi8KK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgU0xNUF9JTkZPICppbmZvKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludAkJcmV0dmFsOworCWludAkJZG9fY2xvY2FsID0gMCwgZXh0cmFfY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6JXMgYmxvY2tfdGlsX3JlYWR5KClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIHR0eS0+ZHJpdmVyLT5uYW1lICk7CisKKwlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgfHwgdHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpeworCQkvKiBub25ibG9jayBtb2RlIGlzIHNldCBvciBwb3J0IGlzIG5vdCBlbmFibGVkICovCisJCS8qIGp1c3QgdmVyaWZ5IHRoYXQgY2FsbG91dCBkZXZpY2UgaXMgbm90IGFjdGl2ZSAqLworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQlkb19jbG9jYWwgPSAxOworCisJLyogV2FpdCBmb3IgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZQorCSAqIGZyZWUgKGkuZS4sIG5vdCBpbiB1c2UgYnkgdGhlIGNhbGxvdXQpLiAgV2hpbGUgd2UgYXJlIGluCisJICogdGhpcyBsb29wLCBpbmZvLT5jb3VudCBpcyBkcm9wcGVkIGJ5IG9uZSwgc28gdGhhdAorCSAqIGNsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIFdlIHJlc3RvcmUgaXQgdXBvbgorCSAqIGV4aXQsIGVpdGhlciBub3JtYWwgb3IgYWJub3JtYWwuCisJICovCisKKwlyZXR2YWwgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyBibG9ja190aWxfcmVhZHkoKSBiZWZvcmUgYmxvY2ssIGNvdW50PSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCB0dHktPmRyaXZlci0+bmFtZSwgaW5mby0+Y291bnQgKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCWV4dHJhX2NvdW50ID0gMTsKKwkJaW5mby0+Y291bnQtLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWluZm8tPmJsb2NrZWRfb3BlbisrOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSOworCQkgCXNldF9zaWduYWxzKGluZm8pOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJCX0KKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8ICEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpeworCQkJcmV0dmFsID0gKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPworCQkJCQktRUFHQUlOIDogLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJIAlnZXRfc2lnbmFscyhpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKyAJCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKKyAJCSAgICAoZG9fY2xvY2FsIHx8IChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpKSApIHsKKyAJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJCXByaW50aygiJXMoJWQpOiVzIGJsb2NrX3RpbF9yZWFkeSgpIGNvdW50PSVkXG4iLAorCQkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgdHR5LT5kcml2ZXItPm5hbWUsIGluZm8tPmNvdW50ICk7CisKKwkJc2NoZWR1bGUoKTsKKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKworCWlmIChleHRyYV9jb3VudCkKKwkJaW5mby0+Y291bnQrKzsKKwlpbmZvLT5ibG9ja2VkX29wZW4tLTsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyBibG9ja190aWxfcmVhZHkoKSBhZnRlciwgY291bnQ9JWRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIHR0eS0+ZHJpdmVyLT5uYW1lLCBpbmZvLT5jb3VudCApOworCisJaWYgKCFyZXR2YWwpCisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgYWxsb2NfZG1hX2J1ZnMoU0xNUF9JTkZPICppbmZvKQoreworCXVuc2lnbmVkIHNob3J0IEJ1ZmZlcnNQZXJGcmFtZTsKKwl1bnNpZ25lZCBzaG9ydCBCdWZmZXJDb3VudDsKKworCS8vIEZvcmNlIGFsbG9jYXRpb24gdG8gc3RhcnQgYXQgNjRLIGJvdW5kYXJ5IGZvciBlYWNoIHBvcnQuCisJLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSAqYWxsKiBidWZmZXIgZGVzY3JpcHRvcnMgZm9yIGEgcG9ydAorCS8vICptdXN0KiBiZSBpbiB0aGUgc2FtZSA2NEsgYmxvY2suIEFsbCBkZXNjcmlwdG9ycyBvbiBhIHBvcnQKKwkvLyBzaGFyZSBhIGNvbW1vbiAnYmFzZScgYWRkcmVzcyAodXBwZXIgOCBiaXRzIG9mIDI0IGJpdHMpIHByb2dyYW1tZWQKKwkvLyBpbnRvIHRoZSBDQlAgcmVnaXN0ZXIuCisJaW5mby0+cG9ydF9hcnJheVswXS0+bGFzdF9tZW1fYWxsb2MgPSAoU0NBX01FTV9TSVpFLzQpICogaW5mby0+cG9ydF9udW07CisKKwkvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBETUEgYnVmZmVycyBuZWNlc3NhcnkgdG8gaG9sZCB0aGUgKi8KKwkvKiBsYXJnZXN0IGFsbG93YWJsZSBmcmFtZSBzaXplLiBOb3RlOiBJZiB0aGUgbWF4IGZyYW1lIHNpemUgaXMgKi8KKwkvKiBub3QgYW4gZXZlbiBtdWx0aXBsZSBvZiB0aGUgRE1BIGJ1ZmZlciBzaXplIHRoZW4gd2UgbmVlZCB0byAqLworCS8qIHJvdW5kIHRoZSBidWZmZXIgY291bnQgcGVyIGZyYW1lIHVwIG9uZS4gKi8KKworCUJ1ZmZlcnNQZXJGcmFtZSA9ICh1bnNpZ25lZCBzaG9ydCkoaW5mby0+bWF4X2ZyYW1lX3NpemUvU0NBQlVGU0laRSk7CisJaWYgKCBpbmZvLT5tYXhfZnJhbWVfc2l6ZSAlIFNDQUJVRlNJWkUgKQorCQlCdWZmZXJzUGVyRnJhbWUrKzsKKworCS8qIGNhbGN1bGF0ZSB0b3RhbCBudW1iZXIgb2YgZGF0YSBidWZmZXJzIChTQ0FCVUZTSVpFKSBwb3NzaWJsZQorCSAqIGluIG9uZSBwb3J0cyBtZW1vcnkgKFNDQV9NRU1fU0laRS80KSBhZnRlciBhbGxvY2F0aW5nIG1lbW9yeQorCSAqIGZvciB0aGUgZGVzY3JpcHRvciBsaXN0IChCVUZGRVJMSVNUU0laRSkuCisJICovCisJQnVmZmVyQ291bnQgPSAoU0NBX01FTV9TSVpFLzQgLSBCVUZGRVJMSVNUU0laRSkvU0NBQlVGU0laRTsKKworCS8qIGxpbWl0IG51bWJlciBvZiBidWZmZXJzIHRvIG1heGltdW0gYW1vdW50IG9mIGRlc2NyaXB0b3JzICovCisJaWYgKEJ1ZmZlckNvdW50ID4gQlVGRkVSTElTVFNJWkUvc2l6ZW9mKFNDQURFU0MpKQorCQlCdWZmZXJDb3VudCA9IEJVRkZFUkxJU1RTSVpFL3NpemVvZihTQ0FERVNDKTsKKworCS8qIHVzZSBlbm91Z2ggYnVmZmVycyB0byB0cmFuc21pdCBvbmUgbWF4IHNpemUgZnJhbWUgKi8KKwlpbmZvLT50eF9idWZfY291bnQgPSBCdWZmZXJzUGVyRnJhbWUgKyAxOworCisJLyogbmV2ZXIgdXNlIG1vcmUgdGhhbiBoYWxmIHRoZSBhdmFpbGFibGUgYnVmZmVycyBmb3IgdHJhbnNtaXQgKi8KKwlpZiAoaW5mby0+dHhfYnVmX2NvdW50ID4gKEJ1ZmZlckNvdW50LzIpKQorCQlpbmZvLT50eF9idWZfY291bnQgPSBCdWZmZXJDb3VudC8yOworCisJaWYgKGluZm8tPnR4X2J1Zl9jb3VudCA+IFNDQU1BWERFU0MpCisJCWluZm8tPnR4X2J1Zl9jb3VudCA9IFNDQU1BWERFU0M7CisKKwkvKiB1c2UgcmVtYWluaW5nIGJ1ZmZlcnMgZm9yIHJlY2VpdmUgKi8KKwlpbmZvLT5yeF9idWZfY291bnQgPSBCdWZmZXJDb3VudCAtIGluZm8tPnR4X2J1Zl9jb3VudDsKKworCWlmIChpbmZvLT5yeF9idWZfY291bnQgPiBTQ0FNQVhERVNDKQorCQlpbmZvLT5yeF9idWZfY291bnQgPSBTQ0FNQVhERVNDOworCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCIlcyglZCk6JXMgQWxsb2NhdGluZyAlZCBUWCBhbmQgJWQgUlggRE1BIGJ1ZmZlcnMuXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLAorCQkJaW5mby0+dHhfYnVmX2NvdW50LGluZm8tPnJ4X2J1Zl9jb3VudCk7CisKKwlpZiAoIGFsbG9jX2J1Zl9saXN0KCBpbmZvICkgPCAwIHx8CisJCWFsbG9jX2ZyYW1lX2J1ZnMoaW5mbywKKwkJICAJCQlpbmZvLT5yeF9idWZfbGlzdCwKKwkJICAJCQlpbmZvLT5yeF9idWZfbGlzdF9leCwKKwkJCQkJaW5mby0+cnhfYnVmX2NvdW50KSA8IDAgfHwKKwkJYWxsb2NfZnJhbWVfYnVmcyhpbmZvLAorCQkJCQlpbmZvLT50eF9idWZfbGlzdCwKKwkJCQkJaW5mby0+dHhfYnVmX2xpc3RfZXgsCisJCQkJCWluZm8tPnR4X2J1Zl9jb3VudCkgPCAwIHx8CisJCWFsbG9jX3RtcF9yeF9idWYoaW5mbykgPCAwICkgeworCQlwcmludGsoIiVzKCVkKTolcyBDYW4ndCBhbGxvY2F0ZSBETUEgYnVmZmVyIG1lbW9yeVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJ4X3Jlc2V0X2J1ZmZlcnMoIGluZm8gKTsKKworCXJldHVybiAwOworfQorCisvKiBBbGxvY2F0ZSBETUEgYnVmZmVycyBmb3IgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIGRlc2NyaXB0b3IgbGlzdHMuCisgKi8KK2ludCBhbGxvY19idWZfbGlzdChTTE1QX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBidWlsZCBsaXN0IGluIGFkYXB0ZXIgc2hhcmVkIG1lbW9yeSAqLworCWluZm8tPmJ1ZmZlcl9saXN0ID0gaW5mby0+bWVtb3J5X2Jhc2UgKyBpbmZvLT5wb3J0X2FycmF5WzBdLT5sYXN0X21lbV9hbGxvYzsKKwlpbmZvLT5idWZmZXJfbGlzdF9waHlzID0gaW5mby0+cG9ydF9hcnJheVswXS0+bGFzdF9tZW1fYWxsb2M7CisJaW5mby0+cG9ydF9hcnJheVswXS0+bGFzdF9tZW1fYWxsb2MgKz0gQlVGRkVSTElTVFNJWkU7CisKKwltZW1zZXQoaW5mby0+YnVmZmVyX2xpc3QsIDAsIEJVRkZFUkxJU1RTSVpFKTsKKworCS8qIFNhdmUgdmlydHVhbCBhZGRyZXNzIHBvaW50ZXJzIHRvIHRoZSByZWNlaXZlIGFuZCAqLworCS8qIHRyYW5zbWl0IGJ1ZmZlciBsaXN0cy4gKFJlY2VpdmUgMXN0KS4gVGhlc2UgcG9pbnRlcnMgd2lsbCAqLworCS8qIGJlIHVzZWQgYnkgdGhlIHByb2Nlc3NvciB0byBhY2Nlc3MgdGhlIGxpc3RzLiAqLworCWluZm8tPnJ4X2J1Zl9saXN0ID0gKFNDQURFU0MgKilpbmZvLT5idWZmZXJfbGlzdDsKKworCWluZm8tPnR4X2J1Zl9saXN0ID0gKFNDQURFU0MgKilpbmZvLT5idWZmZXJfbGlzdDsKKwlpbmZvLT50eF9idWZfbGlzdCArPSBpbmZvLT5yeF9idWZfY291bnQ7CisKKwkvKiBCdWlsZCBsaW5rcyBmb3IgY2lyY3VsYXIgYnVmZmVyIGVudHJ5IGxpc3RzICh0eCBhbmQgcngpCisJICoKKwkgKiBOb3RlOiBsaW5rcyBhcmUgcGh5c2ljYWwgYWRkcmVzc2VzIHJlYWQgYnkgdGhlIFNDQSBkZXZpY2UKKwkgKiB0byBkZXRlcm1pbmUgdGhlIG5leHQgYnVmZmVyIGVudHJ5IHRvIHVzZS4KKwkgKi8KKworCWZvciAoIGkgPSAwOyBpIDwgaW5mby0+cnhfYnVmX2NvdW50OyBpKysgKSB7CisJCS8qIGNhbGN1bGF0ZSBhbmQgc3RvcmUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGlzIGJ1ZmZlciBlbnRyeSAqLworCQlpbmZvLT5yeF9idWZfbGlzdF9leFtpXS5waHlzX2VudHJ5ID0KKwkJCWluZm8tPmJ1ZmZlcl9saXN0X3BoeXMgKyAoaSAqIHNpemVvZihTQ0FCVUZTSVpFKSk7CisKKwkJLyogY2FsY3VsYXRlIGFuZCBzdG9yZSBwaHlzaWNhbCBhZGRyZXNzIG9mICovCisJCS8qIG5leHQgZW50cnkgaW4gY2lydWxhciBsaXN0IG9mIGVudHJpZXMgKi8KKwkJaW5mby0+cnhfYnVmX2xpc3RbaV0ubmV4dCA9IGluZm8tPmJ1ZmZlcl9saXN0X3BoeXM7CisJCWlmICggaSA8IGluZm8tPnJ4X2J1Zl9jb3VudCAtIDEgKQorCQkJaW5mby0+cnhfYnVmX2xpc3RbaV0ubmV4dCArPSAoaSArIDEpICogc2l6ZW9mKFNDQURFU0MpOworCisJCWluZm8tPnJ4X2J1Zl9saXN0W2ldLmxlbmd0aCA9IFNDQUJVRlNJWkU7CisJfQorCisJZm9yICggaSA9IDA7IGkgPCBpbmZvLT50eF9idWZfY291bnQ7IGkrKyApIHsKKwkJLyogY2FsY3VsYXRlIGFuZCBzdG9yZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgYnVmZmVyIGVudHJ5ICovCisJCWluZm8tPnR4X2J1Zl9saXN0X2V4W2ldLnBoeXNfZW50cnkgPSBpbmZvLT5idWZmZXJfbGlzdF9waHlzICsKKwkJCSgoaW5mby0+cnhfYnVmX2NvdW50ICsgaSkgKiBzaXplb2YoU0NBREVTQykpOworCisJCS8qIGNhbGN1bGF0ZSBhbmQgc3RvcmUgcGh5c2ljYWwgYWRkcmVzcyBvZiAqLworCQkvKiBuZXh0IGVudHJ5IGluIGNpcnVsYXIgbGlzdCBvZiBlbnRyaWVzICovCisKKwkJaW5mby0+dHhfYnVmX2xpc3RbaV0ubmV4dCA9IGluZm8tPmJ1ZmZlcl9saXN0X3BoeXMgKworCQkJaW5mby0+cnhfYnVmX2NvdW50ICogc2l6ZW9mKFNDQURFU0MpOworCisJCWlmICggaSA8IGluZm8tPnR4X2J1Zl9jb3VudCAtIDEgKQorCQkJaW5mby0+dHhfYnVmX2xpc3RbaV0ubmV4dCArPSAoaSArIDEpICogc2l6ZW9mKFNDQURFU0MpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBBbGxvY2F0ZSB0aGUgZnJhbWUgRE1BIGJ1ZmZlcnMgdXNlZCBieSB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBsaXN0LgorICovCitpbnQgYWxsb2NfZnJhbWVfYnVmcyhTTE1QX0lORk8gKmluZm8sIFNDQURFU0MgKmJ1Zl9saXN0LFNDQURFU0NfRVggKmJ1Zl9saXN0X2V4LGludCBjb3VudCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHBoeXNfYWRkcjsKKworCWZvciAoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApIHsKKwkJYnVmX2xpc3RfZXhbaV0udmlydF9hZGRyID0gaW5mby0+bWVtb3J5X2Jhc2UgKyBpbmZvLT5wb3J0X2FycmF5WzBdLT5sYXN0X21lbV9hbGxvYzsKKwkJcGh5c19hZGRyID0gaW5mby0+cG9ydF9hcnJheVswXS0+bGFzdF9tZW1fYWxsb2M7CisJCWluZm8tPnBvcnRfYXJyYXlbMF0tPmxhc3RfbWVtX2FsbG9jICs9IFNDQUJVRlNJWkU7CisKKwkJYnVmX2xpc3RbaV0uYnVmX3B0ciAgPSAodW5zaWduZWQgc2hvcnQpcGh5c19hZGRyOworCQlidWZfbGlzdFtpXS5idWZfYmFzZSA9ICh1bnNpZ25lZCBjaGFyKShwaHlzX2FkZHIgPj4gMTYpOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGZyZWVfZG1hX2J1ZnMoU0xNUF9JTkZPICppbmZvKQoreworCWluZm8tPmJ1ZmZlcl9saXN0ID0gTlVMTDsKKwlpbmZvLT5yeF9idWZfbGlzdCA9IE5VTEw7CisJaW5mby0+dHhfYnVmX2xpc3QgPSBOVUxMOworfQorCisvKiBhbGxvY2F0ZSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgbWF4X2ZyYW1lX3NpemUuCisgKiBUaGlzIGJ1ZmZlciBpcyB1c2VkIHRvIHBhc3MgYW4gYXNzZW1ibGVkIGZyYW1lIHRvIHRoZSBsaW5lIGRpc2NpcGxpbmUuCisgKi8KK2ludCBhbGxvY190bXBfcnhfYnVmKFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpbmZvLT50bXBfcnhfYnVmID0ga21hbGxvYyhpbmZvLT5tYXhfZnJhbWVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8tPnRtcF9yeF9idWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZnJlZV90bXBfcnhfYnVmKFNMTVBfSU5GTyAqaW5mbykKK3sKKwlpZiAoaW5mby0+dG1wX3J4X2J1ZikKKwkJa2ZyZWUoaW5mby0+dG1wX3J4X2J1Zik7CisJaW5mby0+dG1wX3J4X2J1ZiA9IE5VTEw7Cit9CisKK2ludCBjbGFpbV9yZXNvdXJjZXMoU0xNUF9JTkZPICppbmZvKQoreworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oaW5mby0+cGh5c19tZW1vcnlfYmFzZSxTQ0FfTUVNX1NJWkUsInN5bmNsaW5rbXAiKSA9PSBOVUxMKSB7CisJCXByaW50ayggIiVzKCVkKTolcyBtZW0gYWRkciBjb25mbGljdCwgQWRkcj0lMDhYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnBoeXNfbWVtb3J5X2Jhc2UpOworCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19BZGRyZXNzQ29uZmxpY3Q7CisJCWdvdG8gZXJyb3V0OworCX0KKwllbHNlCisJCWluZm8tPnNoYXJlZF9tZW1fcmVxdWVzdGVkID0gMTsKKworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oaW5mby0+cGh5c19sY3JfYmFzZSArIGluZm8tPmxjcl9vZmZzZXQsMTI4LCJzeW5jbGlua21wIikgPT0gTlVMTCkgeworCQlwcmludGsoICIlcyglZCk6JXMgbGNyIG1lbSBhZGRyIGNvbmZsaWN0LCBBZGRyPSUwOFhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+cGh5c19sY3JfYmFzZSk7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0FkZHJlc3NDb25mbGljdDsKKwkJZ290byBlcnJvdXQ7CisJfQorCWVsc2UKKwkJaW5mby0+bGNyX21lbV9yZXF1ZXN0ZWQgPSAxOworCisJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihpbmZvLT5waHlzX3NjYV9iYXNlICsgaW5mby0+c2NhX29mZnNldCxTQ0FfQkFTRV9TSVpFLCJzeW5jbGlua21wIikgPT0gTlVMTCkgeworCQlwcmludGsoICIlcyglZCk6JXMgc2NhIG1lbSBhZGRyIGNvbmZsaWN0LCBBZGRyPSUwOFhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+cGh5c19zY2FfYmFzZSk7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0FkZHJlc3NDb25mbGljdDsKKwkJZ290byBlcnJvdXQ7CisJfQorCWVsc2UKKwkJaW5mby0+c2NhX2Jhc2VfcmVxdWVzdGVkID0gMTsKKworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oaW5mby0+cGh5c19zdGF0Y3RybF9iYXNlICsgaW5mby0+c3RhdGN0cmxfb2Zmc2V0LFNDQV9SRUdfU0laRSwic3luY2xpbmttcCIpID09IE5VTEwpIHsKKwkJcHJpbnRrKCAiJXMoJWQpOiVzIHN0YXQvY3RybCBtZW0gYWRkciBjb25mbGljdCwgQWRkcj0lMDhYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnBoeXNfc3RhdGN0cmxfYmFzZSk7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0FkZHJlc3NDb25mbGljdDsKKwkJZ290byBlcnJvdXQ7CisJfQorCWVsc2UKKwkJaW5mby0+c2NhX3N0YXRjdHJsX3JlcXVlc3RlZCA9IDE7CisKKwlpbmZvLT5tZW1vcnlfYmFzZSA9IGlvcmVtYXAoaW5mby0+cGh5c19tZW1vcnlfYmFzZSxTQ0FfTUVNX1NJWkUpOworCWlmICghaW5mby0+bWVtb3J5X2Jhc2UpIHsKKwkJcHJpbnRrKCAiJXMoJWQpOiVzIENhbnQgbWFwIHNoYXJlZCBtZW1vcnksIE1lbUFkZHI9JTA4WFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5waHlzX21lbW9yeV9iYXNlICk7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0NhbnRBc3NpZ25QY2lSZXNvdXJjZXM7CisJCWdvdG8gZXJyb3V0OworCX0KKworCWluZm8tPmxjcl9iYXNlID0gaW9yZW1hcChpbmZvLT5waHlzX2xjcl9iYXNlLFBBR0VfU0laRSk7CisJaWYgKCFpbmZvLT5sY3JfYmFzZSkgeworCQlwcmludGsoICIlcyglZCk6JXMgQ2FudCBtYXAgTENSIG1lbW9yeSwgTWVtQWRkcj0lMDhYXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnBoeXNfbGNyX2Jhc2UgKTsKKwkJaW5mby0+aW5pdF9lcnJvciA9IERpYWdTdGF0dXNfQ2FudEFzc2lnblBjaVJlc291cmNlczsKKwkJZ290byBlcnJvdXQ7CisJfQorCWluZm8tPmxjcl9iYXNlICs9IGluZm8tPmxjcl9vZmZzZXQ7CisKKwlpbmZvLT5zY2FfYmFzZSA9IGlvcmVtYXAoaW5mby0+cGh5c19zY2FfYmFzZSxQQUdFX1NJWkUpOworCWlmICghaW5mby0+c2NhX2Jhc2UpIHsKKwkJcHJpbnRrKCAiJXMoJWQpOiVzIENhbnQgbWFwIFNDQSBtZW1vcnksIE1lbUFkZHI9JTA4WFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5waHlzX3NjYV9iYXNlICk7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0NhbnRBc3NpZ25QY2lSZXNvdXJjZXM7CisJCWdvdG8gZXJyb3V0OworCX0KKwlpbmZvLT5zY2FfYmFzZSArPSBpbmZvLT5zY2Ffb2Zmc2V0OworCisJaW5mby0+c3RhdGN0cmxfYmFzZSA9IGlvcmVtYXAoaW5mby0+cGh5c19zdGF0Y3RybF9iYXNlLFBBR0VfU0laRSk7CisJaWYgKCFpbmZvLT5zdGF0Y3RybF9iYXNlKSB7CisJCXByaW50ayggIiVzKCVkKTolcyBDYW50IG1hcCBTQ0EgU3RhdHVzL0NvbnRyb2wgbWVtb3J5LCBNZW1BZGRyPSUwOFhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+cGh5c19zdGF0Y3RybF9iYXNlICk7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0NhbnRBc3NpZ25QY2lSZXNvdXJjZXM7CisJCWdvdG8gZXJyb3V0OworCX0KKwlpbmZvLT5zdGF0Y3RybF9iYXNlICs9IGluZm8tPnN0YXRjdHJsX29mZnNldDsKKworCWlmICggIW1lbW9yeV90ZXN0KGluZm8pICkgeworCQlwcmludGsoICIlcyglZCk6U2hhcmVkIE1lbW9yeSBUZXN0IGZhaWxlZCBmb3IgZGV2aWNlICVzIE1lbUFkZHI9JTA4WFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5waHlzX21lbW9yeV9iYXNlICk7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX01lbW9yeUVycm9yOworCQlnb3RvIGVycm91dDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3V0OgorCXJlbGVhc2VfcmVzb3VyY2VzKCBpbmZvICk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3ZvaWQgcmVsZWFzZV9yZXNvdXJjZXMoU0xNUF9JTkZPICppbmZvKQoreworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50ayggIiVzKCVkKTolcyByZWxlYXNlX3Jlc291cmNlcygpIGVudHJ5XG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUgKTsKKworCWlmICggaW5mby0+aXJxX3JlcXVlc3RlZCApIHsKKwkJZnJlZV9pcnEoaW5mby0+aXJxX2xldmVsLCBpbmZvKTsKKwkJaW5mby0+aXJxX3JlcXVlc3RlZCA9IDA7CisJfQorCisJaWYgKCBpbmZvLT5zaGFyZWRfbWVtX3JlcXVlc3RlZCApIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPnBoeXNfbWVtb3J5X2Jhc2UsU0NBX01FTV9TSVpFKTsKKwkJaW5mby0+c2hhcmVkX21lbV9yZXF1ZXN0ZWQgPSAwOworCX0KKwlpZiAoIGluZm8tPmxjcl9tZW1fcmVxdWVzdGVkICkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+cGh5c19sY3JfYmFzZSArIGluZm8tPmxjcl9vZmZzZXQsMTI4KTsKKwkJaW5mby0+bGNyX21lbV9yZXF1ZXN0ZWQgPSAwOworCX0KKwlpZiAoIGluZm8tPnNjYV9iYXNlX3JlcXVlc3RlZCApIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPnBoeXNfc2NhX2Jhc2UgKyBpbmZvLT5zY2Ffb2Zmc2V0LFNDQV9CQVNFX1NJWkUpOworCQlpbmZvLT5zY2FfYmFzZV9yZXF1ZXN0ZWQgPSAwOworCX0KKwlpZiAoIGluZm8tPnNjYV9zdGF0Y3RybF9yZXF1ZXN0ZWQgKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5waHlzX3N0YXRjdHJsX2Jhc2UgKyBpbmZvLT5zdGF0Y3RybF9vZmZzZXQsU0NBX1JFR19TSVpFKTsKKwkJaW5mby0+c2NhX3N0YXRjdHJsX3JlcXVlc3RlZCA9IDA7CisJfQorCisJaWYgKGluZm8tPm1lbW9yeV9iYXNlKXsKKwkJaW91bm1hcChpbmZvLT5tZW1vcnlfYmFzZSk7CisJCWluZm8tPm1lbW9yeV9iYXNlID0gTlVMTDsKKwl9CisKKwlpZiAoaW5mby0+c2NhX2Jhc2UpIHsKKwkJaW91bm1hcChpbmZvLT5zY2FfYmFzZSAtIGluZm8tPnNjYV9vZmZzZXQpOworCQlpbmZvLT5zY2FfYmFzZT1OVUxMOworCX0KKworCWlmIChpbmZvLT5zdGF0Y3RybF9iYXNlKSB7CisJCWlvdW5tYXAoaW5mby0+c3RhdGN0cmxfYmFzZSAtIGluZm8tPnN0YXRjdHJsX29mZnNldCk7CisJCWluZm8tPnN0YXRjdHJsX2Jhc2U9TlVMTDsKKwl9CisKKwlpZiAoaW5mby0+bGNyX2Jhc2UpeworCQlpb3VubWFwKGluZm8tPmxjcl9iYXNlIC0gaW5mby0+bGNyX29mZnNldCk7CisJCWluZm8tPmxjcl9iYXNlID0gTlVMTDsKKwl9CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoICIlcyglZCk6JXMgcmVsZWFzZV9yZXNvdXJjZXMoKSBleGl0XG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUgKTsKK30KKworLyogQWRkIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlIHRvIHRoZQorICogZ2xvYmFsIGxpbmtlZCBsaXN0IG9mIGRldmljZXMgYW5kIGluY3JlbWVudCB0aGUgZGV2aWNlIGNvdW50LgorICovCit2b2lkIGFkZF9kZXZpY2UoU0xNUF9JTkZPICppbmZvKQoreworCWluZm8tPm5leHRfZGV2aWNlID0gTlVMTDsKKwlpbmZvLT5saW5lID0gc3luY2xpbmttcF9kZXZpY2VfY291bnQ7CisJc3ByaW50ZihpbmZvLT5kZXZpY2VfbmFtZSwidHR5U0xNJWRwJWQiLGluZm8tPmFkYXB0ZXJfbnVtLGluZm8tPnBvcnRfbnVtKTsKKworCWlmIChpbmZvLT5saW5lIDwgTUFYX0RFVklDRVMpIHsKKwkJaWYgKG1heGZyYW1lW2luZm8tPmxpbmVdKQorCQkJaW5mby0+bWF4X2ZyYW1lX3NpemUgPSBtYXhmcmFtZVtpbmZvLT5saW5lXTsKKwkJaW5mby0+ZG9zeW5jcHBwID0gZG9zeW5jcHBwW2luZm8tPmxpbmVdOworCX0KKworCXN5bmNsaW5rbXBfZGV2aWNlX2NvdW50Kys7CisKKwlpZiAoICFzeW5jbGlua21wX2RldmljZV9saXN0ICkKKwkJc3luY2xpbmttcF9kZXZpY2VfbGlzdCA9IGluZm87CisJZWxzZSB7CisJCVNMTVBfSU5GTyAqY3VycmVudF9kZXYgPSBzeW5jbGlua21wX2RldmljZV9saXN0OworCQl3aGlsZSggY3VycmVudF9kZXYtPm5leHRfZGV2aWNlICkKKwkJCWN1cnJlbnRfZGV2ID0gY3VycmVudF9kZXYtPm5leHRfZGV2aWNlOworCQljdXJyZW50X2Rldi0+bmV4dF9kZXZpY2UgPSBpbmZvOworCX0KKworCWlmICggaW5mby0+bWF4X2ZyYW1lX3NpemUgPCA0MDk2ICkKKwkJaW5mby0+bWF4X2ZyYW1lX3NpemUgPSA0MDk2OworCWVsc2UgaWYgKCBpbmZvLT5tYXhfZnJhbWVfc2l6ZSA+IDY1NTM1ICkKKwkJaW5mby0+bWF4X2ZyYW1lX3NpemUgPSA2NTUzNTsKKworCXByaW50ayggIlN5bmNMaW5rIE11bHRpUG9ydCAlczogIgorCQkiTWVtPSglMDh4ICUwOFggJTA4eCAlMDhYKSBJUlE9JWQgTWF4RnJhbWVTaXplPSV1XG4iLAorCQlpbmZvLT5kZXZpY2VfbmFtZSwKKwkJaW5mby0+cGh5c19zY2FfYmFzZSwKKwkJaW5mby0+cGh5c19tZW1vcnlfYmFzZSwKKwkJaW5mby0+cGh5c19zdGF0Y3RybF9iYXNlLAorCQlpbmZvLT5waHlzX2xjcl9iYXNlLAorCQlpbmZvLT5pcnFfbGV2ZWwsCisJCWluZm8tPm1heF9mcmFtZV9zaXplICk7CisKKyNpZmRlZiBDT05GSUdfSERMQworCWhkbGNkZXZfaW5pdChpbmZvKTsKKyNlbmRpZgorfQorCisvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGRldmljZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CXBvaW50ZXIgdG8gU0xNUF9JTkZPIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBOVUxMCisgKi8KK3N0YXRpYyBTTE1QX0lORk8gKmFsbG9jX2RldihpbnQgYWRhcHRlcl9udW0sIGludCBwb3J0X251bSwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJU0xNUF9JTkZPICppbmZvOworCisJaW5mbyA9IChTTE1QX0lORk8gKilrbWFsbG9jKHNpemVvZihTTE1QX0lORk8pLAorCQkgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKCIlcyglZCkgRXJyb3IgY2FuJ3QgYWxsb2NhdGUgZGV2aWNlIGluc3RhbmNlIGRhdGEgZm9yIGFkYXB0ZXIgJWQsIHBvcnQgJWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXywgYWRhcHRlcl9udW0sIHBvcnRfbnVtKTsKKwl9IGVsc2UgeworCQltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKFNMTVBfSU5GTykpOworCQlpbmZvLT5tYWdpYyA9IE1HU0xfTUFHSUM7CisJCUlOSVRfV09SSygmaW5mby0+dGFzaywgYmhfaGFuZGxlciwgaW5mbyk7CisJCWluZm8tPm1heF9mcmFtZV9zaXplID0gNDA5NjsKKwkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOworCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSAzMCpIWjsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+b3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5ldmVudF93YWl0X3EpOworCQlzcGluX2xvY2tfaW5pdCgmaW5mby0+bmV0bG9jayk7CisJCW1lbWNweSgmaW5mby0+cGFyYW1zLCZkZWZhdWx0X3BhcmFtcyxzaXplb2YoTUdTTF9QQVJBTVMpKTsKKwkJaW5mby0+aWRsZV9tb2RlID0gSERMQ19UWElETEVfRkxBR1M7CisJCWluZm8tPmFkYXB0ZXJfbnVtID0gYWRhcHRlcl9udW07CisJCWluZm8tPnBvcnRfbnVtID0gcG9ydF9udW07CisKKwkJLyogQ29weSBjb25maWd1cmF0aW9uIGluZm8gdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEgKi8KKwkJaW5mby0+aXJxX2xldmVsID0gcGRldi0+aXJxOworCQlpbmZvLT5waHlzX2xjcl9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsMCk7CisJCWluZm8tPnBoeXNfc2NhX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwyKTsKKwkJaW5mby0+cGh5c19tZW1vcnlfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDMpOworCQlpbmZvLT5waHlzX3N0YXRjdHJsX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiw0KTsKKworCQkvKiBCZWNhdXNlIHZlcmVtYXAgb25seSB3b3JrcyBvbiBwYWdlIGJvdW5kYXJpZXMgd2UgbXVzdCBtYXAKKwkJICogYSBsYXJnZXIgYXJlYSB0aGFuIGlzIGFjdHVhbGx5IGltcGxlbWVudGVkIGZvciB0aGUgTENSCisJCSAqIG1lbW9yeSByYW5nZS4gV2UgbWFwIGEgZnVsbCBwYWdlIHN0YXJ0aW5nIGF0IHRoZSBwYWdlIGJvdW5kYXJ5LgorCQkgKi8KKwkJaW5mby0+bGNyX29mZnNldCAgICA9IGluZm8tPnBoeXNfbGNyX2Jhc2UgJiAoUEFHRV9TSVpFLTEpOworCQlpbmZvLT5waHlzX2xjcl9iYXNlICY9IH4oUEFHRV9TSVpFLTEpOworCisJCWluZm8tPnNjYV9vZmZzZXQgICAgPSBpbmZvLT5waHlzX3NjYV9iYXNlICYgKFBBR0VfU0laRS0xKTsKKwkJaW5mby0+cGh5c19zY2FfYmFzZSAmPSB+KFBBR0VfU0laRS0xKTsKKworCQlpbmZvLT5zdGF0Y3RybF9vZmZzZXQgICAgPSBpbmZvLT5waHlzX3N0YXRjdHJsX2Jhc2UgJiAoUEFHRV9TSVpFLTEpOworCQlpbmZvLT5waHlzX3N0YXRjdHJsX2Jhc2UgJj0gfihQQUdFX1NJWkUtMSk7CisKKwkJaW5mby0+YnVzX3R5cGUgPSBNR1NMX0JVU19UWVBFX1BDSTsKKwkJaW5mby0+aXJxX2ZsYWdzID0gU0FfU0hJUlE7CisKKwkJaW5pdF90aW1lcigmaW5mby0+dHhfdGltZXIpOworCQlpbmZvLT50eF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKKwkJaW5mby0+dHhfdGltZXIuZnVuY3Rpb24gPSB0eF90aW1lb3V0OworCisJCWluaXRfdGltZXIoJmluZm8tPnN0YXR1c190aW1lcik7CisJCWluZm8tPnN0YXR1c190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKKwkJaW5mby0+c3RhdHVzX3RpbWVyLmZ1bmN0aW9uID0gc3RhdHVzX3RpbWVvdXQ7CisKKwkJLyogU3RvcmUgdGhlIFBDSTkwNTAgbWlzYyBjb250cm9sIHJlZ2lzdGVyIHZhbHVlIGJlY2F1c2UgYSBmbGF3CisJCSAqIGluIHRoZSBQQ0k5MDUwIHByZXZlbnRzIExDUiByZWdpc3RlcnMgZnJvbSBiZWluZyByZWFkIGlmCisJCSAqIEJJT1MgYXNzaWducyBhbiBMQ1IgYmFzZSBhZGRyZXNzIHdpdGggYml0IDcgc2V0LgorCQkgKgorCQkgKiBPbmx5IHRoZSBtaXNjIGNvbnRyb2wgcmVnaXN0ZXIgaXMgYWNjZXNzZWQgZm9yIHdoaWNoIG9ubHkKKwkJICogd3JpdGUgYWNjZXNzIGlzIG5lZWRlZCwgc28gc2V0IGFuIGluaXRpYWwgdmFsdWUgYW5kIGNoYW5nZQorCQkgKiBiaXRzIHRvIHRoZSBkZXZpY2UgaW5zdGFuY2UgZGF0YSBhcyB3ZSB3cml0ZSB0aGUgdmFsdWUKKwkJICogdG8gdGhlIGFjdHVhbCBtaXNjIGNvbnRyb2wgcmVnaXN0ZXIuCisJCSAqLworCQlpbmZvLT5taXNjX2N0cmxfdmFsdWUgPSAweDA4N2U0NTQ2OworCisJCS8qIGluaXRpYWwgcG9ydCBzdGF0ZSBpcyB1bmtub3duIC0gaWYgc3RhcnR1cCBlcnJvcnMKKwkJICogb2NjdXIsIGluaXRfZXJyb3Igd2lsbCBiZSBzZXQgdG8gaW5kaWNhdGUgdGhlCisJCSAqIHByb2JsZW0uIE9uY2UgdGhlIHBvcnQgaXMgZnVsbHkgaW5pdGlhbGl6ZWQsCisJCSAqIHRoaXMgdmFsdWUgd2lsbCBiZSBzZXQgdG8gMCB0byBpbmRpY2F0ZSB0aGUKKwkJICogcG9ydCBpcyBhdmFpbGFibGUuCisJCSAqLworCQlpbmZvLT5pbml0X2Vycm9yID0gLTE7CisJfQorCisJcmV0dXJuIGluZm87Cit9CisKK3ZvaWQgZGV2aWNlX2luaXQoaW50IGFkYXB0ZXJfbnVtLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlTTE1QX0lORk8gKnBvcnRfYXJyYXlbU0NBX01BWF9QT1JUU107CisJaW50IHBvcnQ7CisKKwkvKiBhbGxvY2F0ZSBkZXZpY2UgaW5zdGFuY2VzIGZvciB1cCB0byBTQ0FfTUFYX1BPUlRTIGRldmljZXMgKi8KKwlmb3IgKCBwb3J0ID0gMDsgcG9ydCA8IFNDQV9NQVhfUE9SVFM7ICsrcG9ydCApIHsKKwkJcG9ydF9hcnJheVtwb3J0XSA9IGFsbG9jX2RldihhZGFwdGVyX251bSxwb3J0LHBkZXYpOworCQlpZiggcG9ydF9hcnJheVtwb3J0XSA9PSBOVUxMICkgeworCQkJZm9yICggLS1wb3J0OyBwb3J0ID49IDA7IC0tcG9ydCApCisJCQkJa2ZyZWUocG9ydF9hcnJheVtwb3J0XSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBnaXZlIGNvcHkgb2YgcG9ydF9hcnJheSB0byBhbGwgcG9ydHMgYW5kIGFkZCB0byBkZXZpY2UgbGlzdCAgKi8KKwlmb3IgKCBwb3J0ID0gMDsgcG9ydCA8IFNDQV9NQVhfUE9SVFM7ICsrcG9ydCApIHsKKwkJbWVtY3B5KHBvcnRfYXJyYXlbcG9ydF0tPnBvcnRfYXJyYXkscG9ydF9hcnJheSxzaXplb2YocG9ydF9hcnJheSkpOworCQlhZGRfZGV2aWNlKCBwb3J0X2FycmF5W3BvcnRdICk7CisJCXNwaW5fbG9ja19pbml0KCZwb3J0X2FycmF5W3BvcnRdLT5sb2NrKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhbmQgY2xhaW0gYWRhcHRlciByZXNvdXJjZXMgKi8KKwlpZiAoICFjbGFpbV9yZXNvdXJjZXMocG9ydF9hcnJheVswXSkgKSB7CisKKwkJYWxsb2NfZG1hX2J1ZnMocG9ydF9hcnJheVswXSk7CisKKwkJLyogY29weSByZXNvdXJjZSBpbmZvcm1hdGlvbiBmcm9tIGZpcnN0IHBvcnQgdG8gb3RoZXJzICovCisJCWZvciAoIHBvcnQgPSAxOyBwb3J0IDwgU0NBX01BWF9QT1JUUzsgKytwb3J0ICkgeworCQkJcG9ydF9hcnJheVtwb3J0XS0+bG9jayAgPSBwb3J0X2FycmF5WzBdLT5sb2NrOworCQkJcG9ydF9hcnJheVtwb3J0XS0+aXJxX2xldmVsICAgICA9IHBvcnRfYXJyYXlbMF0tPmlycV9sZXZlbDsKKwkJCXBvcnRfYXJyYXlbcG9ydF0tPm1lbW9yeV9iYXNlICAgPSBwb3J0X2FycmF5WzBdLT5tZW1vcnlfYmFzZTsKKwkJCXBvcnRfYXJyYXlbcG9ydF0tPnNjYV9iYXNlICAgICAgPSBwb3J0X2FycmF5WzBdLT5zY2FfYmFzZTsKKwkJCXBvcnRfYXJyYXlbcG9ydF0tPnN0YXRjdHJsX2Jhc2UgPSBwb3J0X2FycmF5WzBdLT5zdGF0Y3RybF9iYXNlOworCQkJcG9ydF9hcnJheVtwb3J0XS0+bGNyX2Jhc2UgICAgICA9IHBvcnRfYXJyYXlbMF0tPmxjcl9iYXNlOworCQkJYWxsb2NfZG1hX2J1ZnMocG9ydF9hcnJheVtwb3J0XSk7CisJCX0KKworCQlpZiAoIHJlcXVlc3RfaXJxKHBvcnRfYXJyYXlbMF0tPmlycV9sZXZlbCwKKwkJCQkJc3luY2xpbmttcF9pbnRlcnJ1cHQsCisJCQkJCXBvcnRfYXJyYXlbMF0tPmlycV9mbGFncywKKwkJCQkJcG9ydF9hcnJheVswXS0+ZGV2aWNlX25hbWUsCisJCQkJCXBvcnRfYXJyYXlbMF0pIDwgMCApIHsKKwkJCXByaW50ayggIiVzKCVkKTolcyBDYW50IHJlcXVlc3QgaW50ZXJydXB0LCBJUlE9JWRcbiIsCisJCQkJX19GSUxFX18sX19MSU5FX18sCisJCQkJcG9ydF9hcnJheVswXS0+ZGV2aWNlX25hbWUsCisJCQkJcG9ydF9hcnJheVswXS0+aXJxX2xldmVsICk7CisJCX0KKwkJZWxzZSB7CisJCQlwb3J0X2FycmF5WzBdLT5pcnFfcmVxdWVzdGVkID0gMTsKKwkJCWFkYXB0ZXJfdGVzdChwb3J0X2FycmF5WzBdKTsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBvcHMgPSB7CisJLm9wZW4gPSBvcGVuLAorCS5jbG9zZSA9IGNsb3NlLAorCS53cml0ZSA9IHdyaXRlLAorCS5wdXRfY2hhciA9IHB1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IGZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSBmbHVzaF9idWZmZXIsCisJLmlvY3RsID0gaW9jdGwsCisJLnRocm90dGxlID0gdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSB1bnRocm90dGxlLAorCS5zZW5kX3hjaGFyID0gc2VuZF94Y2hhciwKKwkuYnJlYWtfY3RsID0gc2V0X2JyZWFrLAorCS53YWl0X3VudGlsX3NlbnQgPSB3YWl0X3VudGlsX3NlbnQsCisgCS5yZWFkX3Byb2MgPSByZWFkX3Byb2MsCisJLnNldF90ZXJtaW9zID0gc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSB0eF9ob2xkLAorCS5zdGFydCA9IHR4X3JlbGVhc2UsCisJLmhhbmd1cCA9IGhhbmd1cCwKKwkudGlvY21nZXQgPSB0aW9jbWdldCwKKwkudGlvY21zZXQgPSB0aW9jbXNldCwKK307CisKK3N0YXRpYyB2b2lkIHN5bmNsaW5rbXBfY2xlYW51cCh2b2lkKQoreworCWludCByYzsKKwlTTE1QX0lORk8gKmluZm87CisJU0xNUF9JTkZPICp0bXA7CisKKwlwcmludGsoIlVubG9hZGluZyAlcyAlc1xuIiwgZHJpdmVyX25hbWUsIGRyaXZlcl92ZXJzaW9uKTsKKworCWlmIChzZXJpYWxfZHJpdmVyKSB7CisJCWlmICgocmMgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcikpKQorCQkJcHJpbnRrKCIlcyglZCkgZmFpbGVkIHRvIHVucmVnaXN0ZXIgdHR5IGRyaXZlciBlcnI9JWRcbiIsCisJCQkgICAgICAgX19GSUxFX18sX19MSU5FX18scmMpOworCQlwdXRfdHR5X2RyaXZlcihzZXJpYWxfZHJpdmVyKTsKKwl9CisKKwkvKiByZXNldCBkZXZpY2VzICovCisJaW5mbyA9IHN5bmNsaW5rbXBfZGV2aWNlX2xpc3Q7CisJd2hpbGUoaW5mbykgeworCQlyZXNldF9wb3J0KGluZm8pOworCQlpbmZvID0gaW5mby0+bmV4dF9kZXZpY2U7CisJfQorCisJLyogcmVsZWFzZSBkZXZpY2VzICovCisJaW5mbyA9IHN5bmNsaW5rbXBfZGV2aWNlX2xpc3Q7CisJd2hpbGUoaW5mbykgeworI2lmZGVmIENPTkZJR19IRExDCisJCWhkbGNkZXZfZXhpdChpbmZvKTsKKyNlbmRpZgorCQlmcmVlX2RtYV9idWZzKGluZm8pOworCQlmcmVlX3RtcF9yeF9idWYoaW5mbyk7CisJCWlmICggaW5mby0+cG9ydF9udW0gPT0gMCApIHsKKwkJCWlmIChpbmZvLT5zY2FfYmFzZSkKKwkJCQl3cml0ZV9yZWcoaW5mbywgTFBSLCAxKTsgLyogc2V0IGxvdyBwb3dlciBtb2RlICovCisJCQlyZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsKKwkJfQorCQl0bXAgPSBpbmZvOworCQlpbmZvID0gaW5mby0+bmV4dF9kZXZpY2U7CisJCWtmcmVlKHRtcCk7CisJfQorCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzeW5jbGlua21wX3BjaV9kcml2ZXIpOworfQorCisvKiBEcml2ZXIgaW5pdGlhbGl6YXRpb24gZW50cnkgcG9pbnQuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgc3luY2xpbmttcF9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJaWYgKGJyZWFrX29uX2xvYWQpIHsKKwkgCXN5bmNsaW5rbXBfZ2V0X3RleHRfcHRyKCk7CisgIAkJQlJFQUtQT0lOVCgpOworCX0KKworIAlwcmludGsoIiVzICVzXG4iLCBkcml2ZXJfbmFtZSwgZHJpdmVyX3ZlcnNpb24pOworCisJaWYgKChyYyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnN5bmNsaW5rbXBfcGNpX2RyaXZlcikpIDwgMCkgeworCQlwcmludGsoIiVzOmZhaWxlZCB0byByZWdpc3RlciBQQ0kgZHJpdmVyLCBlcnJvcj0lZFxuIixfX0ZJTEVfXyxyYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlzZXJpYWxfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcigxMjgpOworCWlmICghc2VyaWFsX2RyaXZlcikgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgKi8KKworCXNlcmlhbF9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJc2VyaWFsX2RyaXZlci0+ZHJpdmVyX25hbWUgPSAic3luY2xpbmttcCI7CisJc2VyaWFsX2RyaXZlci0+bmFtZSA9ICJ0dHlTTE0iOworCXNlcmlhbF9kcml2ZXItPm1ham9yID0gdHR5bWFqb3I7CisJc2VyaWFsX2RyaXZlci0+bWlub3Jfc3RhcnQgPSA2NDsKKwlzZXJpYWxfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlzZXJpYWxfZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCXNlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlzZXJpYWxfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9CisJCUI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlzZXJpYWxfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKHNlcmlhbF9kcml2ZXIsICZvcHMpOworCWlmICgocmMgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKHNlcmlhbF9kcml2ZXIpKSA8IDApIHsKKwkJcHJpbnRrKCIlcyglZCk6Q291bGRuJ3QgcmVnaXN0ZXIgc2VyaWFsIGRyaXZlclxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fKTsKKwkJcHV0X3R0eV9kcml2ZXIoc2VyaWFsX2RyaXZlcik7CisJCXNlcmlhbF9kcml2ZXIgPSBOVUxMOworCQlnb3RvIGVycm9yOworCX0KKworIAlwcmludGsoIiVzICVzLCB0dHkgbWFqb3IjJWRcbiIsCisJCWRyaXZlcl9uYW1lLCBkcml2ZXJfdmVyc2lvbiwKKwkJc2VyaWFsX2RyaXZlci0+bWFqb3IpOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXN5bmNsaW5rbXBfY2xlYW51cCgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHN5bmNsaW5rbXBfZXhpdCh2b2lkKQoreworCXN5bmNsaW5rbXBfY2xlYW51cCgpOworfQorCittb2R1bGVfaW5pdChzeW5jbGlua21wX2luaXQpOworbW9kdWxlX2V4aXQoc3luY2xpbmttcF9leGl0KTsKKworLyogU2V0IHRoZSBwb3J0IGZvciBpbnRlcm5hbCBsb29wYmFjayBtb2RlLgorICogVGhlIFR4Q0xLIGFuZCBSeENMSyBzaWduYWxzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgQlJHIGFuZAorICogdGhlIFR4RCBpcyBsb29wZWQgYmFjayB0byB0aGUgUnhEIGludGVybmFsbHkuCisgKi8KK3ZvaWQgZW5hYmxlX2xvb3BiYWNrKFNMTVBfSU5GTyAqaW5mbywgaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKSB7CisJCS8qIE1EMiAoTW9kZSBSZWdpc3RlciAyKQorCQkgKiAwMS4uMDAgIENOQ1Q8MS4uMD4gQ2hhbm5lbCBDb25uZWN0aW9uIDExPUxvY2FsIExvb3BiYWNrCisJCSAqLworCQl3cml0ZV9yZWcoaW5mbywgTUQyLCAodW5zaWduZWQgY2hhcikocmVhZF9yZWcoaW5mbywgTUQyKSB8IChCSVQxICsgQklUMCkpKTsKKworCQkvKiBkZWdhdGUgZXh0ZXJuYWwgVHhDIGNsb2NrIHNvdXJjZSAqLworCQlpbmZvLT5wb3J0X2FycmF5WzBdLT5jdHJscmVnX3ZhbHVlIHw9IChCSVQwIDw8IChpbmZvLT5wb3J0X251bSAqIDIpKTsKKwkJd3JpdGVfY29udHJvbF9yZWcoaW5mbyk7CisKKwkJLyogUlhTL1RYUyAoUngvVHggY2xvY2sgc291cmNlKQorCQkgKiAwNyAgICAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkJICogMDYuLjA0ICBDbG9jayBTb3VyY2UsIDEwMD1CUkcKKwkJICogMDMuLjAwICBDbG9jayBEaXZpc29yLCAwMDAwPTEKKwkJICovCisJCXdyaXRlX3JlZyhpbmZvLCBSWFMsIDB4NDApOworCQl3cml0ZV9yZWcoaW5mbywgVFhTLCAweDQwKTsKKworCX0gZWxzZSB7CisJCS8qIE1EMiAoTW9kZSBSZWdpc3RlciAyKQorCSAJICogMDEuLjAwICBDTkNUPDEuLjA+IENoYW5uZWwgY29ubmVjdGlvbiwgMD1ub3JtYWwKKwkJICovCisJCXdyaXRlX3JlZyhpbmZvLCBNRDIsICh1bnNpZ25lZCBjaGFyKShyZWFkX3JlZyhpbmZvLCBNRDIpICYgfihCSVQxICsgQklUMCkpKTsKKworCQkvKiBSWFMvVFhTIChSeC9UeCBjbG9jayBzb3VyY2UpCisJCSAqIDA3ICAgICAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCQkgKiAwNi4uMDQgIENsb2NrIFNvdXJjZSwgMDAwPVJ4Qy9UeEMgUGluCisJCSAqIDAzLi4wMCAgQ2xvY2sgRGl2aXNvciwgMDAwMD0xCisJCSAqLworCQl3cml0ZV9yZWcoaW5mbywgUlhTLCAweDAwKTsKKwkJd3JpdGVfcmVnKGluZm8sIFRYUywgMHgwMCk7CisJfQorCisJLyogc2V0IExpbmtTcGVlZCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBkZWZhdWx0IHRvIDJNYnBzICovCisJaWYgKGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCkKKwkJc2V0X3JhdGUoaW5mbywgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKTsKKwllbHNlCisJCXNldF9yYXRlKGluZm8sIDM2ODY0MDApOworfQorCisvKiBTZXQgdGhlIGJhdWQgcmF0ZSByZWdpc3RlciB0byB0aGUgZGVzaXJlZCBzcGVlZAorICoKKyAqCWRhdGFfcmF0ZQlkYXRhIHJhdGUgb2YgY2xvY2sgaW4gYml0cyBwZXIgc2Vjb25kCisgKgkJCUEgZGF0YSByYXRlIG9mIDAgZGlzYWJsZXMgdGhlIEFVWCBjbG9jay4KKyAqLwordm9pZCBzZXRfcmF0ZSggU0xNUF9JTkZPICppbmZvLCB1MzIgZGF0YV9yYXRlICkKK3sKKyAgICAgICAJdTMyIFRNQ1ZhbHVlOworICAgICAgIAl1bnNpZ25lZCBjaGFyIEJSVmFsdWU7CisJdTMyIERpdmlzb3I9MDsKKworCS8qIGZCUkcgPSBmQ0xLLyhUTUMgKiAyXkJSKQorCSAqLworCWlmIChkYXRhX3JhdGUgIT0gMCkgeworCQlEaXZpc29yID0gMTQ3NDU2MDAvZGF0YV9yYXRlOworCQlpZiAoIURpdmlzb3IpCisJCQlEaXZpc29yID0gMTsKKworCQlUTUNWYWx1ZSA9IERpdmlzb3I7CisKKwkJQlJWYWx1ZSA9IDA7CisJCWlmIChUTUNWYWx1ZSAhPSAxICYmIFRNQ1ZhbHVlICE9IDIpIHsKKwkJCS8qIEJSVmFsdWUgb2YgMCBwcm92aWRlcyA1MC81MCBkdXR5IGN5Y2xlICpvbmx5KiB3aGVuCisJCQkgKiBUTUNWYWx1ZSBpcyAxIG9yIDIuIEJSVmFsdWUgb2YgMSB0byA5IGFsd2F5cyBwcm92aWRlcworCQkJICogNTAvNTAgZHV0eSBjeWNsZS4KKwkJCSAqLworCQkJQlJWYWx1ZSA9IDE7CisJCQlUTUNWYWx1ZSA+Pj0gMTsKKwkJfQorCisJCS8qIHdoaWxlIFRNQ1ZhbHVlIGlzIHRvbyBiaWcgZm9yIFRNQyByZWdpc3RlciwgZGl2aWRlCisJCSAqIGJ5IDIgYW5kIGluY3JlbWVudCBCUiBleHBvbmVudC4KKwkJICovCisJCWZvcig7IFRNQ1ZhbHVlID4gMjU2ICYmIEJSVmFsdWUgPCAxMDsgQlJWYWx1ZSsrKQorCQkJVE1DVmFsdWUgPj49IDE7CisKKwkJd3JpdGVfcmVnKGluZm8sIFRYUywKKwkJCSh1bnNpZ25lZCBjaGFyKSgocmVhZF9yZWcoaW5mbywgVFhTKSAmIDB4ZjApIHwgQlJWYWx1ZSkpOworCQl3cml0ZV9yZWcoaW5mbywgUlhTLAorCQkJKHVuc2lnbmVkIGNoYXIpKChyZWFkX3JlZyhpbmZvLCBSWFMpICYgMHhmMCkgfCBCUlZhbHVlKSk7CisJCXdyaXRlX3JlZyhpbmZvLCBUTUMsICh1bnNpZ25lZCBjaGFyKVRNQ1ZhbHVlKTsKKwl9CisJZWxzZSB7CisJCXdyaXRlX3JlZyhpbmZvLCBUWFMsMCk7CisJCXdyaXRlX3JlZyhpbmZvLCBSWFMsMCk7CisJCXdyaXRlX3JlZyhpbmZvLCBUTUMsIDApOworCX0KK30KKworLyogRGlzYWJsZSByZWNlaXZlcgorICovCit2b2lkIHJ4X3N0b3AoU0xNUF9JTkZPICppbmZvKQoreworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCXByaW50aygiJXMoJWQpOiVzIHJ4X3N0b3AoKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKworCXdyaXRlX3JlZyhpbmZvLCBDTUQsIFJYUkVTRVQpOworCisJaW5mby0+aWUwX3ZhbHVlICY9IH5SWFJEWUU7CisJd3JpdGVfcmVnKGluZm8sIElFMCwgaW5mby0+aWUwX3ZhbHVlKTsJLyogZGlzYWJsZSBSeCBkYXRhIGludGVycnVwdHMgKi8KKworCXdyaXRlX3JlZyhpbmZvLCBSWERNQSArIERTUiwgMCk7CS8qIGRpc2FibGUgUnggRE1BICovCisJd3JpdGVfcmVnKGluZm8sIFJYRE1BICsgRENNRCwgU1dBQk9SVCk7CS8qIHJlc2V0L2luaXQgUnggRE1BICovCisJd3JpdGVfcmVnKGluZm8sIFJYRE1BICsgRElSLCAwKTsJLyogZGlzYWJsZSBSeCBETUEgaW50ZXJydXB0cyAqLworCisJaW5mby0+cnhfZW5hYmxlZCA9IDA7CisJaW5mby0+cnhfb3ZlcmZsb3cgPSAwOworfQorCisvKiBlbmFibGUgdGhlIHJlY2VpdmVyCisgKi8KK3ZvaWQgcnhfc3RhcnQoU0xNUF9JTkZPICppbmZvKQoreworCWludCBpOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKKwkJcHJpbnRrKCIlcyglZCk6JXMgcnhfc3RhcnQoKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKworCXdyaXRlX3JlZyhpbmZvLCBDTUQsIFJYUkVTRVQpOworCisJaWYgKCBpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyApIHsKKwkJLyogSERMQywgZGlzYWJlIElSUSBvbiByeGRhdGEgKi8KKwkJaW5mby0+aWUwX3ZhbHVlICY9IH5SWFJEWUU7CisJCXdyaXRlX3JlZyhpbmZvLCBJRTAsIGluZm8tPmllMF92YWx1ZSk7CisKKwkJLyogUmVzZXQgYWxsIFJ4IERNQSBidWZmZXJzIGFuZCBwcm9ncmFtIHJ4IGRtYSAqLworCQl3cml0ZV9yZWcoaW5mbywgUlhETUEgKyBEU1IsIDApOwkJLyogZGlzYWJsZSBSeCBETUEgKi8KKwkJd3JpdGVfcmVnKGluZm8sIFJYRE1BICsgRENNRCwgU1dBQk9SVCk7CS8qIHJlc2V0L2luaXQgUnggRE1BICovCisKKwkJZm9yIChpID0gMDsgaSA8IGluZm8tPnJ4X2J1Zl9jb3VudDsgaSsrKSB7CisJCQlpbmZvLT5yeF9idWZfbGlzdFtpXS5zdGF0dXMgPSAweGZmOworCisJCQkvLyB0aHJvdHRsZSB0byA0IHNoYXJlZCBtZW1vcnkgd3JpdGVzIGF0IGEgdGltZSB0byBwcmV2ZW50CisJCQkvLyBob2dnaW5nIGxvY2FsIGJ1cyAoa2VlcCBsYXRlbmN5IHRpbWUgZm9yIERNQSByZXF1ZXN0cyBsb3cpLgorCQkJaWYgKCEoaSAlIDQpKQorCQkJCXJlYWRfc3RhdHVzX3JlZyhpbmZvKTsKKwkJfQorCQlpbmZvLT5jdXJyZW50X3J4X2J1ZiA9IDA7CisKKwkJLyogc2V0IGN1cnJlbnQvMXN0IGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCQl3cml0ZV9yZWcxNihpbmZvLCBSWERNQSArIENEQSwKKwkJCWluZm8tPnJ4X2J1Zl9saXN0X2V4WzBdLnBoeXNfZW50cnkpOworCisJCS8qIHNldCBuZXcgbGFzdCByeCBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKwkJd3JpdGVfcmVnMTYoaW5mbywgUlhETUEgKyBFREEsCisJCQlpbmZvLT5yeF9idWZfbGlzdF9leFtpbmZvLT5yeF9idWZfY291bnQgLSAxXS5waHlzX2VudHJ5KTsKKworCQkvKiBzZXQgYnVmZmVyIGxlbmd0aCAoc2hhcmVkIGJ5IGFsbCByeCBkbWEgZGF0YSBidWZmZXJzKSAqLworCQl3cml0ZV9yZWcxNihpbmZvLCBSWERNQSArIEJGTCwgU0NBQlVGU0laRSk7CisKKwkJd3JpdGVfcmVnKGluZm8sIFJYRE1BICsgRElSLCAweDYwKTsJLyogZW5hYmxlIFJ4IERNQSBpbnRlcnJ1cHRzIChFT00vQk9GKSAqLworCQl3cml0ZV9yZWcoaW5mbywgUlhETUEgKyBEU1IsIDB4ZjIpOwkvKiBjbGVhciBSeCBETUEgSVJRcywgZW5hYmxlIFJ4IERNQSAqLworCX0gZWxzZSB7CisJCS8qIGFzeW5jLCBlbmFibGUgSVJRIG9uIHJ4ZGF0YSAqLworCQlpbmZvLT5pZTBfdmFsdWUgfD0gUlhSRFlFOworCQl3cml0ZV9yZWcoaW5mbywgSUUwLCBpbmZvLT5pZTBfdmFsdWUpOworCX0KKworCXdyaXRlX3JlZyhpbmZvLCBDTUQsIFJYRU5BQkxFKTsKKworCWluZm8tPnJ4X292ZXJmbG93ID0gRkFMU0U7CisJaW5mby0+cnhfZW5hYmxlZCA9IDE7Cit9CisKKy8qIEVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgYW5kIHNlbmQgYSB0cmFuc21pdCBmcmFtZSBpZgorICogb25lIGlzIGxvYWRlZCBpbiB0aGUgRE1BIGJ1ZmZlcnMuCisgKi8KK3ZvaWQgdHhfc3RhcnQoU0xNUF9JTkZPICppbmZvKQoreworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCXByaW50aygiJXMoJWQpOiVzIHR4X3N0YXJ0KCkgdHhfY291bnQ9JWRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLGluZm8tPnR4X2NvdW50ICk7CisKKwlpZiAoIWluZm8tPnR4X2VuYWJsZWQgKSB7CisJCXdyaXRlX3JlZyhpbmZvLCBDTUQsIFRYUkVTRVQpOworCQl3cml0ZV9yZWcoaW5mbywgQ01ELCBUWEVOQUJMRSk7CisJCWluZm8tPnR4X2VuYWJsZWQgPSBUUlVFOworCX0KKworCWlmICggaW5mby0+dHhfY291bnQgKSB7CisKKwkJLyogSWYgYXV0byBSVFMgZW5hYmxlZCBhbmQgUlRTIGlzIGluYWN0aXZlLCB0aGVuIGFzc2VydCAqLworCQkvKiBSVFMgYW5kIHNldCBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBkcml2ZXIgc2hvdWxkICovCisJCS8qIG5lZ2F0ZSBSVFMgd2hlbiB0aGUgdHJhbnNtaXNzaW9uIGNvbXBsZXRlcy4gKi8KKworCQlpbmZvLT5kcm9wX3J0c19vbl90eF9kb25lID0gMDsKKworCQlpZiAoaW5mby0+cGFyYW1zLm1vZGUgIT0gTUdTTF9NT0RFX0FTWU5DKSB7CisKKwkJCWlmICggaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0FVVE9fUlRTICkgeworCQkJCWdldF9zaWduYWxzKCBpbmZvICk7CisJCQkJaWYgKCAhKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykgKSB7CisJCQkJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFM7CisJCQkJCXNldF9zaWduYWxzKCBpbmZvICk7CisJCQkJCWluZm8tPmRyb3BfcnRzX29uX3R4X2RvbmUgPSAxOworCQkJCX0KKwkJCX0KKworCQkJd3JpdGVfcmVnMTYoaW5mbywgVFJDMCwKKwkJCQkodW5zaWduZWQgc2hvcnQpKCgodHhfbmVnYXRlX2ZpZm9fbGV2ZWwtMSk8PDgpICsgdHhfYWN0aXZlX2ZpZm9fbGV2ZWwpKTsKKworCQkJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRFNSLCAwKTsgCQkvKiBkaXNhYmxlIERNQSBjaGFubmVsICovCisJCQl3cml0ZV9yZWcoaW5mbywgVFhETUEgKyBEQ01ELCBTV0FCT1JUKTsJLyogcmVzZXQvaW5pdCBETUEgY2hhbm5lbCAqLworCQorCQkJLyogc2V0IFRYIENEQSAoY3VycmVudCBkZXNjcmlwdG9yIGFkZHJlc3MpICovCisJCQl3cml0ZV9yZWcxNihpbmZvLCBUWERNQSArIENEQSwKKwkJCQlpbmZvLT50eF9idWZfbGlzdF9leFswXS5waHlzX2VudHJ5KTsKKwkKKwkJCS8qIHNldCBUWCBFREEgKGxhc3QgZGVzY3JpcHRvciBhZGRyZXNzKSAqLworCQkJd3JpdGVfcmVnMTYoaW5mbywgVFhETUEgKyBFREEsCisJCQkJaW5mby0+dHhfYnVmX2xpc3RfZXhbaW5mby0+bGFzdF90eF9idWZdLnBoeXNfZW50cnkpOworCQorCQkJLyogZW5hYmxlIHVuZGVycnVuIElSUSAqLworCQkJaW5mby0+aWUxX3ZhbHVlICY9IH5JRExFOworCQkJaW5mby0+aWUxX3ZhbHVlIHw9IFVEUk47CisJCQl3cml0ZV9yZWcoaW5mbywgSUUxLCBpbmZvLT5pZTFfdmFsdWUpOworCQkJd3JpdGVfcmVnKGluZm8sIFNSMSwgKHVuc2lnbmVkIGNoYXIpKElETEUgKyBVRFJOKSk7CisJCisJCQl3cml0ZV9yZWcoaW5mbywgVFhETUEgKyBESVIsIDB4NDApOwkJLyogZW5hYmxlIFR4IERNQSBpbnRlcnJ1cHRzIChFT00pICovCisJCQl3cml0ZV9yZWcoaW5mbywgVFhETUEgKyBEU1IsIDB4ZjIpOwkJLyogY2xlYXIgVHggRE1BIElSUXMsIGVuYWJsZSBUeCBETUEgKi8KKwkKKwkJCWluZm8tPnR4X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDAwKTsKKwkJCWFkZF90aW1lcigmaW5mby0+dHhfdGltZXIpOworCQl9CisJCWVsc2UgeworCQkJdHhfbG9hZF9maWZvKGluZm8pOworCQkJLyogYXN5bmMsIGVuYWJsZSBJUlEgb24gdHhkYXRhICovCisJCQlpbmZvLT5pZTBfdmFsdWUgfD0gVFhSRFlFOworCQkJd3JpdGVfcmVnKGluZm8sIElFMCwgaW5mby0+aWUwX3ZhbHVlKTsKKwkJfQorCisJCWluZm8tPnR4X2FjdGl2ZSA9IDE7CisJfQorfQorCisvKiBzdG9wIHRoZSB0cmFuc21pdHRlciBhbmQgRE1BCisgKi8KK3ZvaWQgdHhfc3RvcCggU0xNUF9JTkZPICppbmZvICkKK3sKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTolcyB0eF9zdG9wKClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7CisKKwlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsKKworCXdyaXRlX3JlZyhpbmZvLCBUWERNQSArIERTUiwgMCk7CQkvKiBkaXNhYmxlIERNQSBjaGFubmVsICovCisJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRENNRCwgU1dBQk9SVCk7CS8qIHJlc2V0L2luaXQgRE1BIGNoYW5uZWwgKi8KKworCXdyaXRlX3JlZyhpbmZvLCBDTUQsIFRYUkVTRVQpOworCisJaW5mby0+aWUxX3ZhbHVlICY9IH4oVURSTiArIElETEUpOworCXdyaXRlX3JlZyhpbmZvLCBJRTEsIGluZm8tPmllMV92YWx1ZSk7CS8qIGRpc2FibGUgdHggc3RhdHVzIGludGVycnVwdHMgKi8KKwl3cml0ZV9yZWcoaW5mbywgU1IxLCAodW5zaWduZWQgY2hhcikoSURMRSArIFVEUk4pKTsJLyogY2xlYXIgcGVuZGluZyAqLworCisJaW5mby0+aWUwX3ZhbHVlICY9IH5UWFJEWUU7CisJd3JpdGVfcmVnKGluZm8sIElFMCwgaW5mby0+aWUwX3ZhbHVlKTsJLyogZGlzYWJsZSB0eCBkYXRhIGludGVycnVwdHMgKi8KKworCWluZm8tPnR4X2VuYWJsZWQgPSAwOworCWluZm8tPnR4X2FjdGl2ZSAgPSAwOworfQorCisvKiBGaWxsIHRoZSB0cmFuc21pdCBGSUZPIHVudGlsIHRoZSBGSUZPIGlzIGZ1bGwgb3IKKyAqIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0byBsb2FkLgorICovCit2b2lkIHR4X2xvYWRfZmlmbyhTTE1QX0lORk8gKmluZm8pCit7CisJdTggVHdvQnl0ZXNbMl07CisKKwkvKiBkbyBub3RoaW5nIGlzIG5vdyB0eCBkYXRhIGF2YWlsYWJsZSBhbmQgbm8gWE9OL1hPRkYgcGVuZGluZyAqLworCisJaWYgKCAhaW5mby0+dHhfY291bnQgJiYgIWluZm8tPnhfY2hhciApCisJCXJldHVybjsKKworCS8qIGxvYWQgdGhlIFRyYW5zbWl0IEZJRk8gdW50aWwgRklGT3MgZnVsbCBvciBhbGwgZGF0YSBzZW50ICovCisKKwl3aGlsZSggaW5mby0+dHhfY291bnQgJiYgKHJlYWRfcmVnKGluZm8sU1IwKSAmIEJJVDEpICkgeworCisJCS8qIHRoZXJlIGlzIG1vcmUgc3BhY2UgaW4gdGhlIHRyYW5zbWl0IEZJRk8gYW5kICovCisJCS8qIHRoZXJlIGlzIG1vcmUgZGF0YSBpbiB0cmFuc21pdCBidWZmZXIgKi8KKworCQlpZiAoIChpbmZvLT50eF9jb3VudCA+IDEpICYmICFpbmZvLT54X2NoYXIgKSB7CisgCQkJLyogd3JpdGUgMTYtYml0cyAqLworCQkJVHdvQnl0ZXNbMF0gPSBpbmZvLT50eF9idWZbaW5mby0+dHhfZ2V0KytdOworCQkJaWYgKGluZm8tPnR4X2dldCA+PSBpbmZvLT5tYXhfZnJhbWVfc2l6ZSkKKwkJCQlpbmZvLT50eF9nZXQgLT0gaW5mby0+bWF4X2ZyYW1lX3NpemU7CisJCQlUd29CeXRlc1sxXSA9IGluZm8tPnR4X2J1ZltpbmZvLT50eF9nZXQrK107CisJCQlpZiAoaW5mby0+dHhfZ2V0ID49IGluZm8tPm1heF9mcmFtZV9zaXplKQorCQkJCWluZm8tPnR4X2dldCAtPSBpbmZvLT5tYXhfZnJhbWVfc2l6ZTsKKworCQkJd3JpdGVfcmVnMTYoaW5mbywgVFJCLCAqKCh1MTYgKilUd29CeXRlcykpOworCisJCQlpbmZvLT50eF9jb3VudCAtPSAyOworCQkJaW5mby0+aWNvdW50LnR4ICs9IDI7CisJCX0gZWxzZSB7CisJCQkvKiBvbmx5IDEgYnl0ZSBsZWZ0IHRvIHRyYW5zbWl0IG9yIDEgRklGTyBzbG90IGxlZnQgKi8KKworCQkJaWYgKGluZm8tPnhfY2hhcikgeworCQkJCS8qIHRyYW5zbWl0IHBlbmRpbmcgaGlnaCBwcmlvcml0eSBjaGFyICovCisJCQkJd3JpdGVfcmVnKGluZm8sIFRSQiwgaW5mby0+eF9jaGFyKTsKKwkJCQlpbmZvLT54X2NoYXIgPSAwOworCQkJfSBlbHNlIHsKKwkJCQl3cml0ZV9yZWcoaW5mbywgVFJCLCBpbmZvLT50eF9idWZbaW5mby0+dHhfZ2V0KytdKTsKKwkJCQlpZiAoaW5mby0+dHhfZ2V0ID49IGluZm8tPm1heF9mcmFtZV9zaXplKQorCQkJCQlpbmZvLT50eF9nZXQgLT0gaW5mby0+bWF4X2ZyYW1lX3NpemU7CisJCQkJaW5mby0+dHhfY291bnQtLTsKKwkJCX0KKwkJCWluZm8tPmljb3VudC50eCsrOworCQl9CisJfQorfQorCisvKiBSZXNldCBhIHBvcnQgdG8gYSBrbm93biBzdGF0ZQorICovCit2b2lkIHJlc2V0X3BvcnQoU0xNUF9JTkZPICppbmZvKQoreworCWlmIChpbmZvLT5zY2FfYmFzZSkgeworCisJCXR4X3N0b3AoaW5mbyk7CisJCXJ4X3N0b3AoaW5mbyk7CisKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gfihTZXJpYWxTaWduYWxfRFRSICsgU2VyaWFsU2lnbmFsX1JUUyk7CisJCXNldF9zaWduYWxzKGluZm8pOworCisJCS8qIGRpc2FibGUgYWxsIHBvcnQgaW50ZXJydXB0cyAqLworCQlpbmZvLT5pZTBfdmFsdWUgPSAwOworCQlpbmZvLT5pZTFfdmFsdWUgPSAwOworCQlpbmZvLT5pZTJfdmFsdWUgPSAwOworCQl3cml0ZV9yZWcoaW5mbywgSUUwLCBpbmZvLT5pZTBfdmFsdWUpOworCQl3cml0ZV9yZWcoaW5mbywgSUUxLCBpbmZvLT5pZTFfdmFsdWUpOworCQl3cml0ZV9yZWcoaW5mbywgSUUyLCBpbmZvLT5pZTJfdmFsdWUpOworCisJCXdyaXRlX3JlZyhpbmZvLCBDTUQsIENIUkVTRVQpOworCX0KK30KKworLyogUmVzZXQgYWxsIHRoZSBwb3J0cyB0byBhIGtub3duIHN0YXRlLgorICovCit2b2lkIHJlc2V0X2FkYXB0ZXIoU0xNUF9JTkZPICppbmZvKQoreworCWludCBpOworCisJZm9yICggaT0wOyBpIDwgU0NBX01BWF9QT1JUUzsgKytpKSB7CisJCWlmIChpbmZvLT5wb3J0X2FycmF5W2ldKQorCQkJcmVzZXRfcG9ydChpbmZvLT5wb3J0X2FycmF5W2ldKTsKKwl9Cit9CisKKy8qIFByb2dyYW0gcG9ydCBmb3IgYXN5bmNocm9ub3VzIGNvbW11bmljYXRpb25zLgorICovCit2b2lkIGFzeW5jX21vZGUoU0xNUF9JTkZPICppbmZvKQoreworCisgIAl1bnNpZ25lZCBjaGFyIFJlZ1ZhbHVlOworCisJdHhfc3RvcChpbmZvKTsKKwlyeF9zdG9wKGluZm8pOworCisJLyogTUQwLCBNb2RlIFJlZ2lzdGVyIDAKKwkgKgorCSAqIDA3Li4wNSAgUFJDVEw8Mi4uMD4sIFByb3RvY29sIE1vZGUsIDAwMD1hc3luYworCSAqIDA0ICAgICAgQVVUTywgQXV0by1lbmFibGUgKFJUUy9DVFMvRENEKQorCSAqIDAzICAgICAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDAyICAgICAgQ1JDQ0MsIENSQyBDYWxjdWxhdGlvbiwgMD1kaXNhYmxlZAorCSAqIDAxLi4wMCAgU1RPUDwxLi4wPiBTdG9wIGJpdHMgKDAwPTEsMTA9MikKKwkgKgorCSAqIDAwMDAgMDAwMAorCSAqLworCVJlZ1ZhbHVlID0gMHgwMDsKKwlpZiAoaW5mby0+cGFyYW1zLnN0b3BfYml0cyAhPSAxKQorCQlSZWdWYWx1ZSB8PSBCSVQxOworCXdyaXRlX3JlZyhpbmZvLCBNRDAsIFJlZ1ZhbHVlKTsKKworCS8qIE1EMSwgTW9kZSBSZWdpc3RlciAxCisJICoKKwkgKiAwNy4uMDYgIEJSQVRFPDEuLjA+LCBiaXQgcmF0ZSwgMDA9MS8xIDAxPTEvMTYgMTA9MS8zMiAxMT0xLzY0CisJICogMDUuLjA0ICBUWENIUjwxLi4wPiwgdHggY2hhciBzaXplLCAwMD04IGJpdHMsMDE9NywxMD02LDExPTUKKwkgKiAwMy4uMDIgIFJYQ0hSPDEuLjA+LCByeCBjaGFyIHNpemUKKwkgKiAwMS4uMDAgIFBNUE08MS4uMD4sIFBhcml0eSBtb2RlLCAwMD1ub25lIDEwPWV2ZW4gMTE9b2RkCisJICoKKwkgKiAwMTAwIDAwMDAKKwkgKi8KKwlSZWdWYWx1ZSA9IDB4NDA7CisJc3dpdGNoIChpbmZvLT5wYXJhbXMuZGF0YV9iaXRzKSB7CisJY2FzZSA3OiBSZWdWYWx1ZSB8PSBCSVQ0ICsgQklUMjsgYnJlYWs7CisJY2FzZSA2OiBSZWdWYWx1ZSB8PSBCSVQ1ICsgQklUMzsgYnJlYWs7CisJY2FzZSA1OiBSZWdWYWx1ZSB8PSBCSVQ1ICsgQklUNCArIEJJVDMgKyBCSVQyOyBicmVhazsKKwl9CisJaWYgKGluZm8tPnBhcmFtcy5wYXJpdHkgIT0gQVNZTkNfUEFSSVRZX05PTkUpIHsKKwkJUmVnVmFsdWUgfD0gQklUMTsKKwkJaWYgKGluZm8tPnBhcmFtcy5wYXJpdHkgPT0gQVNZTkNfUEFSSVRZX09ERCkKKwkJCVJlZ1ZhbHVlIHw9IEJJVDA7CisJfQorCXdyaXRlX3JlZyhpbmZvLCBNRDEsIFJlZ1ZhbHVlKTsKKworCS8qIE1EMiwgTW9kZSBSZWdpc3RlciAyCisJICoKKwkgKiAwNy4uMDIgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwMS4uMDAgIENOQ1Q8MS4uMD4gQ2hhbm5lbCBjb25uZWN0aW9uLCAwPW5vcm1hbAorCSAqCisJICogMDAwMCAwMDAwCisJICovCisJUmVnVmFsdWUgPSAweDAwOworCXdyaXRlX3JlZyhpbmZvLCBNRDIsIFJlZ1ZhbHVlKTsKKworCS8qIFJYUywgUmVjZWl2ZSBjbG9jayBzb3VyY2UKKwkgKgorCSAqIDA3ICAgICAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDA2Li4wNCAgUlhDUzwyLi4wPiwgY2xvY2sgc291cmNlLCAwMDA9UnhDIFBpbiwgMTAwPUJSRywgMTEwPURQTEwKKwkgKiAwMy4uMDAgIFJYQlI8My4uMD4sIHJhdGUgZGl2aXNvciwgMDAwMD0xCisJICovCisJUmVnVmFsdWU9QklUNjsKKwl3cml0ZV9yZWcoaW5mbywgUlhTLCBSZWdWYWx1ZSk7CisKKwkvKiBUWFMsIFRyYW5zbWl0IGNsb2NrIHNvdXJjZQorCSAqCisJICogMDcgICAgICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICogMDYuLjA0ICBSWENTPDIuLjA+LCBjbG9jayBzb3VyY2UsIDAwMD1UeEMgUGluLCAxMDA9QlJHLCAxMTA9UmVjZWl2ZSBDbG9jaworCSAqIDAzLi4wMCAgUlhCUjwzLi4wPiwgcmF0ZSBkaXZpc29yLCAwMDAwPTEKKwkgKi8KKwlSZWdWYWx1ZT1CSVQ2OworCXdyaXRlX3JlZyhpbmZvLCBUWFMsIFJlZ1ZhbHVlKTsKKworCS8qIENvbnRyb2wgUmVnaXN0ZXIKKwkgKgorCSAqIDYsNCwyLDAgIENMS1NFTDwzLi4wPiwgMCA9IFRjQ0xLIGluLCAxID0gQXV4Y2xrIG91dAorCSAqLworCWluZm8tPnBvcnRfYXJyYXlbMF0tPmN0cmxyZWdfdmFsdWUgfD0gKEJJVDAgPDwgKGluZm8tPnBvcnRfbnVtICogMikpOworCXdyaXRlX2NvbnRyb2xfcmVnKGluZm8pOworCisJdHhfc2V0X2lkbGUoaW5mbyk7CisKKwkvKiBSUkMgUmVjZWl2ZSBSZWFkeSBDb250cm9sIDAKKwkgKgorCSAqIDA3Li4wNSAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDA0Li4wMCAgUlJDPDQuLjA+IFJ4IEZJRk8gdHJpZ2dlciBhY3RpdmUgMHgwMCA9IDEgYnl0ZQorCSAqLworCXdyaXRlX3JlZyhpbmZvLCBSUkMsIDB4MDApOworCisJLyogVFJDMCBUcmFuc21pdCBSZWFkeSBDb250cm9sIDAKKwkgKgorCSAqIDA3Li4wNSAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDA0Li4wMCAgVFJDPDQuLjA+IFR4IEZJRk8gdHJpZ2dlciBhY3RpdmUgMHgxMCA9IDE2IGJ5dGVzCisJICovCisJd3JpdGVfcmVnKGluZm8sIFRSQzAsIDB4MTApOworCisJLyogVFJDMSBUcmFuc21pdCBSZWFkeSBDb250cm9sIDEKKwkgKgorCSAqIDA3Li4wNSAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDA0Li4wMCAgVFJDPDQuLjA+IFR4IEZJRk8gdHJpZ2dlciBpbmFjdGl2ZSAweDFlID0gMzEgYnl0ZXMgKGZ1bGwtMSkKKwkgKi8KKwl3cml0ZV9yZWcoaW5mbywgVFJDMSwgMHgxZSk7CisKKwkvKiBDVEwsIE1TQ0kgY29udHJvbCByZWdpc3RlcgorCSAqCisJICogMDcuLjA2ICBSZXNlcnZlZCwgc2V0IHRvIDAKKwkgKiAwNSAgICAgIFVEUk5DLCB1bmRlcnJ1biBjb250cm9sLCAwPWFib3J0IDE9Q1JDK2ZsYWcgKEhETEMvQlNDKQorCSAqIDA0ICAgICAgSURMQywgaWRsZSBjb250cm9sLCAwPW1hcmsgMT1pZGxlIHJlZ2lzdGVyCisJICogMDMgICAgICBCUkssIGJyZWFrLCAwPW9mZiAxID1vbiAoYXN5bmMpCisJICogMDIgICAgICBTWU5DTEQsIHN5bmMgY2hhciBsb2FkIGVuYWJsZSAoQlNDKSAxPWVuYWJsZWQKKwkgKiAwMSAgICAgIEdPUCwgZ28gYWN0aXZlIG9uIHBvbGwgKExPT1AgbW9kZSkgMT1lbmFibGVkCisJICogMDAgICAgICBSVFMsIFJUUyBvdXRwdXQgY29udHJvbCwgMD1hY3RpdmUgMT1pbmFjdGl2ZQorCSAqCisJICogMDAwMSAwMDAxCisJICovCisJUmVnVmFsdWUgPSAweDEwOworCWlmICghKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykpCisJCVJlZ1ZhbHVlIHw9IDB4MDE7CisJd3JpdGVfcmVnKGluZm8sIENUTCwgUmVnVmFsdWUpOworCisJLyogZW5hYmxlIHN0YXR1cyBpbnRlcnJ1cHRzICovCisJaW5mby0+aWUwX3ZhbHVlIHw9IFRYSU5URSArIFJYSU5URTsKKwl3cml0ZV9yZWcoaW5mbywgSUUwLCBpbmZvLT5pZTBfdmFsdWUpOworCisJLyogZW5hYmxlIGJyZWFrIGRldGVjdCBpbnRlcnJ1cHQgKi8KKwlpbmZvLT5pZTFfdmFsdWUgPSBCUktEOworCXdyaXRlX3JlZyhpbmZvLCBJRTEsIGluZm8tPmllMV92YWx1ZSk7CisKKwkvKiBlbmFibGUgcnggb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKwlpbmZvLT5pZTJfdmFsdWUgPSBPVlJOOworCXdyaXRlX3JlZyhpbmZvLCBJRTIsIGluZm8tPmllMl92YWx1ZSk7CisKKwlzZXRfcmF0ZSggaW5mbywgaW5mby0+cGFyYW1zLmRhdGFfcmF0ZSAqIDE2ICk7CisKKwlpZiAoaW5mby0+cGFyYW1zLmxvb3BiYWNrKQorCQllbmFibGVfbG9vcGJhY2soaW5mbywxKTsKK30KKworLyogUHJvZ3JhbSB0aGUgU0NBIGZvciBIRExDIGNvbW11bmljYXRpb25zLgorICovCit2b2lkIGhkbGNfbW9kZShTTE1QX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciBSZWdWYWx1ZTsKKwl1MzIgRHBsbERpdmlzb3I7CisKKwkvLyBDYW4ndCB1c2UgRFBMTCBiZWNhdXNlIFNDQSBvdXRwdXRzIHJlY292ZXJlZCBjbG9jayBvbiBSeEMgd2hlbgorCS8vIERQTEwgbW9kZSBzZWxlY3RlZC4gVGhpcyBjYXVzZXMgb3V0cHV0IGNvbnRlbnRpb24gd2l0aCBSeEMgcmVjZWl2ZXIuCisJLy8gVXNlIG9mIERQTEwgd291bGQgcmVxdWlyZSBleHRlcm5hbCBoYXJkd2FyZSB0byBkaXNhYmxlIFJ4QyByZWNlaXZlcgorCS8vIHdoZW4gRFBMTCBtb2RlIHNlbGVjdGVkLgorCWluZm8tPnBhcmFtcy5mbGFncyAmPSB+KEhETENfRkxBR19UWENfRFBMTCArIEhETENfRkxBR19SWENfRFBMTCk7CisKKwkvKiBkaXNhYmxlIERNQSBpbnRlcnJ1cHRzICovCisJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgRElSLCAwKTsKKwl3cml0ZV9yZWcoaW5mbywgUlhETUEgKyBESVIsIDApOworCisJLyogTUQwLCBNb2RlIFJlZ2lzdGVyIDAKKwkgKgorCSAqIDA3Li4wNSAgUFJDVEw8Mi4uMD4sIFByb3RvY29sIE1vZGUsIDEwMD1IRExDCisJICogMDQgICAgICBBVVRPLCBBdXRvLWVuYWJsZSAoUlRTL0NUUy9EQ0QpCisJICogMDMgICAgICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICogMDIgICAgICBDUkNDQywgQ1JDIENhbGN1bGF0aW9uLCAxPWVuYWJsZWQKKwkgKiAwMSAgICAgIENSQzEsIENSQyBzZWxlY3Rpb24sIDA9Q1JDLTE2LDE9Q1JDLUNDSVRULTE2CisJICogMDAgICAgICBDUkMwLCBDUkMgaW5pdGlhbCB2YWx1ZSwgMSA9IGFsbCAxcworCSAqCisJICogMTAwMCAwMDAxCisJICovCisJUmVnVmFsdWUgPSAweDgxOworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfQVVUT19DVFMpCisJCVJlZ1ZhbHVlIHw9IEJJVDQ7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX0RDRCkKKwkJUmVnVmFsdWUgfD0gQklUNDsKKwlpZiAoaW5mby0+cGFyYW1zLmNyY190eXBlID09IEhETENfQ1JDXzE2X0NDSVRUKQorCQlSZWdWYWx1ZSB8PSBCSVQyICsgQklUMTsKKwl3cml0ZV9yZWcoaW5mbywgTUQwLCBSZWdWYWx1ZSk7CisKKwkvKiBNRDEsIE1vZGUgUmVnaXN0ZXIgMQorCSAqCisJICogMDcuLjA2ICBBRERSUzwxLi4wPiwgQWRkcmVzcyBkZXRlY3QsIDAwPW5vIGFkZHIgY2hlY2sKKwkgKiAwNS4uMDQgIFRYQ0hSPDEuLjA+LCB0eCBjaGFyIHNpemUsIDAwPTggYml0cworCSAqIDAzLi4wMiAgUlhDSFI8MS4uMD4sIHJ4IGNoYXIgc2l6ZSwgMDA9OCBiaXRzCisJICogMDEuLjAwICBQTVBNPDEuLjA+LCBQYXJpdHkgbW9kZSwgMDA9bm8gcGFyaXR5CisJICoKKwkgKiAwMDAwIDAwMDAKKwkgKi8KKwlSZWdWYWx1ZSA9IDB4MDA7CisJd3JpdGVfcmVnKGluZm8sIE1EMSwgUmVnVmFsdWUpOworCisJLyogTUQyLCBNb2RlIFJlZ2lzdGVyIDIKKwkgKgorCSAqIDA3ICAgICAgTlJaRk0sIDA9TlJaLCAxPUZNCisJICogMDYuLjA1ICBDT0RFPDEuLjA+IEVuY29kaW5nLCAwMD1OUloKKwkgKiAwNC4uMDMgIERSQVRFPDEuLjA+IERQTEwgRGl2aXNvciwgMDA9OAorCSAqIDAyICAgICAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDAxLi4wMCAgQ05DVDwxLi4wPiBDaGFubmVsIGNvbm5lY3Rpb24sIDA9bm9ybWFsCisJICoKKwkgKiAwMDAwIDAwMDAKKwkgKi8KKwlSZWdWYWx1ZSA9IDB4MDA7CisJc3dpdGNoKGluZm8tPnBhcmFtcy5lbmNvZGluZykgeworCWNhc2UgSERMQ19FTkNPRElOR19OUlpJOgkgIFJlZ1ZhbHVlIHw9IEJJVDU7IGJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19CSVBIQVNFX01BUks6ICBSZWdWYWx1ZSB8PSBCSVQ3ICsgQklUNTsgYnJlYWs7IC8qIGFrYSBGTTEgKi8KKwljYXNlIEhETENfRU5DT0RJTkdfQklQSEFTRV9TUEFDRTogUmVnVmFsdWUgfD0gQklUNyArIEJJVDY7IGJyZWFrOyAvKiBha2EgRk0wICovCisJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTEVWRUw6IFJlZ1ZhbHVlIHw9IEJJVDc7IGJyZWFrOyAJLyogYWthIE1hbmNoZXN0ZXIgKi8KKyNpZiAwCisJY2FzZSBIRExDX0VOQ09ESU5HX05SWkI6CSAgICAgICAJCQkJLyogbm90IHN1cHBvcnRlZCAqLworCWNhc2UgSERMQ19FTkNPRElOR19OUlpJX01BUks6ICAgICAgICAgIAkJCQkvKiBub3Qgc3VwcG9ydGVkICovCisJY2FzZSBIRExDX0VOQ09ESU5HX0RJRkZfQklQSEFTRV9MRVZFTDogCQkJCS8qIG5vdCBzdXBwb3J0ZWQgKi8KKyNlbmRpZgorCX0KKwlpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19EUExMX0RJVjE2ICkgeworCQlEcGxsRGl2aXNvciA9IDE2OworCQlSZWdWYWx1ZSB8PSBCSVQzOworCX0gZWxzZSBpZiAoIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19EUExMX0RJVjggKSB7CisJCURwbGxEaXZpc29yID0gODsKKwl9IGVsc2UgeworCQlEcGxsRGl2aXNvciA9IDMyOworCQlSZWdWYWx1ZSB8PSBCSVQ0OworCX0KKwl3cml0ZV9yZWcoaW5mbywgTUQyLCBSZWdWYWx1ZSk7CisKKworCS8qIFJYUywgUmVjZWl2ZSBjbG9jayBzb3VyY2UKKwkgKgorCSAqIDA3ICAgICAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDA2Li4wNCAgUlhDUzwyLi4wPiwgY2xvY2sgc291cmNlLCAwMDA9UnhDIFBpbiwgMTAwPUJSRywgMTEwPURQTEwKKwkgKiAwMy4uMDAgIFJYQlI8My4uMD4sIHJhdGUgZGl2aXNvciwgMDAwMD0xCisJICovCisJUmVnVmFsdWU9MDsKKwlpZiAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1JYQ19CUkcpCisJCVJlZ1ZhbHVlIHw9IEJJVDY7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19SWENfRFBMTCkKKwkJUmVnVmFsdWUgfD0gQklUNiArIEJJVDU7CisJd3JpdGVfcmVnKGluZm8sIFJYUywgUmVnVmFsdWUpOworCisJLyogVFhTLCBUcmFuc21pdCBjbG9jayBzb3VyY2UKKwkgKgorCSAqIDA3ICAgICAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDA2Li4wNCAgUlhDUzwyLi4wPiwgY2xvY2sgc291cmNlLCAwMDA9VHhDIFBpbiwgMTAwPUJSRywgMTEwPVJlY2VpdmUgQ2xvY2sKKwkgKiAwMy4uMDAgIFJYQlI8My4uMD4sIHJhdGUgZGl2aXNvciwgMDAwMD0xCisJICovCisJUmVnVmFsdWU9MDsKKwlpZiAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1RYQ19CUkcpCisJCVJlZ1ZhbHVlIHw9IEJJVDY7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19UWENfRFBMTCkKKwkJUmVnVmFsdWUgfD0gQklUNiArIEJJVDU7CisJd3JpdGVfcmVnKGluZm8sIFRYUywgUmVnVmFsdWUpOworCisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19SWENfRFBMTCkKKwkJc2V0X3JhdGUoaW5mbywgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkICogRHBsbERpdmlzb3IpOworCWVsc2UKKwkJc2V0X3JhdGUoaW5mbywgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKTsKKworCS8qIEdQREFUQSAoR2VuZXJhbCBQdXJwb3NlIEkvTyBEYXRhIFJlZ2lzdGVyKQorCSAqCisJICogNiw0LDIsMCAgQ0xLU0VMPDMuLjA+LCAwID0gVGNDTEsgaW4sIDEgPSBBdXhjbGsgb3V0CisJICovCisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19UWENfQlJHKQorCQlpbmZvLT5wb3J0X2FycmF5WzBdLT5jdHJscmVnX3ZhbHVlIHw9IChCSVQwIDw8IChpbmZvLT5wb3J0X251bSAqIDIpKTsKKwllbHNlCisJCWluZm8tPnBvcnRfYXJyYXlbMF0tPmN0cmxyZWdfdmFsdWUgJj0gfihCSVQwIDw8IChpbmZvLT5wb3J0X251bSAqIDIpKTsKKwl3cml0ZV9jb250cm9sX3JlZyhpbmZvKTsKKworCS8qIFJSQyBSZWNlaXZlIFJlYWR5IENvbnRyb2wgMAorCSAqCisJICogMDcuLjA1ICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICogMDQuLjAwICBSUkM8NC4uMD4gUnggRklGTyB0cmlnZ2VyIGFjdGl2ZQorCSAqLworCXdyaXRlX3JlZyhpbmZvLCBSUkMsIHJ4X2FjdGl2ZV9maWZvX2xldmVsKTsKKworCS8qIFRSQzAgVHJhbnNtaXQgUmVhZHkgQ29udHJvbCAwCisJICoKKwkgKiAwNy4uMDUgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwNC4uMDAgIFRSQzw0Li4wPiBUeCBGSUZPIHRyaWdnZXIgYWN0aXZlCisJICovCisJd3JpdGVfcmVnKGluZm8sIFRSQzAsIHR4X2FjdGl2ZV9maWZvX2xldmVsKTsKKworCS8qIFRSQzEgVHJhbnNtaXQgUmVhZHkgQ29udHJvbCAxCisJICoKKwkgKiAwNy4uMDUgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwNC4uMDAgIFRSQzw0Li4wPiBUeCBGSUZPIHRyaWdnZXIgaW5hY3RpdmUgMHgxZiA9IDMyIGJ5dGVzIChmdWxsKQorCSAqLworCXdyaXRlX3JlZyhpbmZvLCBUUkMxLCAodW5zaWduZWQgY2hhcikodHhfbmVnYXRlX2ZpZm9fbGV2ZWwgLSAxKSk7CisKKwkvKiBETVIsIERNQSBNb2RlIFJlZ2lzdGVyCisJICoKKwkgKiAwNy4uMDUgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwNCAgICAgIFRNT0QsIFRyYW5zZmVyIE1vZGU6IDE9Y2hhaW5lZC1ibG9jaworCSAqIDAzICAgICAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDAyICAgICAgTkYsIE51bWJlciBvZiBGcmFtZXM6IDE9bXVsdGktZnJhbWUKKwkgKiAwMSAgICAgIENOVEUsIEZyYW1lIEVuZCBJUlEgQ291bnRlciBlbmFibGU6IDA9ZGlzYWJsZWQKKwkgKiAwMCAgICAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKgorCSAqIDAwMDEgMDEwMAorCSAqLworCXdyaXRlX3JlZyhpbmZvLCBUWERNQSArIERNUiwgMHgxNCk7CisJd3JpdGVfcmVnKGluZm8sIFJYRE1BICsgRE1SLCAweDE0KTsKKworCS8qIFNldCBjaGFpbiBwb2ludGVyIGJhc2UgKHVwcGVyIDggYml0cyBvZiAyNCBiaXQgYWRkcikgKi8KKwl3cml0ZV9yZWcoaW5mbywgUlhETUEgKyBDUEIsCisJCSh1bnNpZ25lZCBjaGFyKShpbmZvLT5idWZmZXJfbGlzdF9waHlzID4+IDE2KSk7CisKKwkvKiBTZXQgY2hhaW4gcG9pbnRlciBiYXNlICh1cHBlciA4IGJpdHMgb2YgMjQgYml0IGFkZHIpICovCisJd3JpdGVfcmVnKGluZm8sIFRYRE1BICsgQ1BCLAorCQkodW5zaWduZWQgY2hhcikoaW5mby0+YnVmZmVyX2xpc3RfcGh5cyA+PiAxNikpOworCisJLyogZW5hYmxlIHN0YXR1cyBpbnRlcnJ1cHRzLiBvdGhlciBjb2RlIGVuYWJsZXMvZGlzYWJsZXMKKwkgKiB0aGUgaW5kaXZpZHVhbCBzb3VyY2VzIGZvciB0aGVzZSB0d28gaW50ZXJydXB0IGNsYXNzZXMuCisJICovCisJaW5mby0+aWUwX3ZhbHVlIHw9IFRYSU5URSArIFJYSU5URTsKKwl3cml0ZV9yZWcoaW5mbywgSUUwLCBpbmZvLT5pZTBfdmFsdWUpOworCisJLyogQ1RMLCBNU0NJIGNvbnRyb2wgcmVnaXN0ZXIKKwkgKgorCSAqIDA3Li4wNiAgUmVzZXJ2ZWQsIHNldCB0byAwCisJICogMDUgICAgICBVRFJOQywgdW5kZXJydW4gY29udHJvbCwgMD1hYm9ydCAxPUNSQytmbGFnIChIRExDL0JTQykKKwkgKiAwNCAgICAgIElETEMsIGlkbGUgY29udHJvbCwgMD1tYXJrIDE9aWRsZSByZWdpc3RlcgorCSAqIDAzICAgICAgQlJLLCBicmVhaywgMD1vZmYgMSA9b24gKGFzeW5jKQorCSAqIDAyICAgICAgU1lOQ0xELCBzeW5jIGNoYXIgbG9hZCBlbmFibGUgKEJTQykgMT1lbmFibGVkCisJICogMDEgICAgICBHT1AsIGdvIGFjdGl2ZSBvbiBwb2xsIChMT09QIG1vZGUpIDE9ZW5hYmxlZAorCSAqIDAwICAgICAgUlRTLCBSVFMgb3V0cHV0IGNvbnRyb2wsIDA9YWN0aXZlIDE9aW5hY3RpdmUKKwkgKgorCSAqIDAwMDEgMDAwMQorCSAqLworCVJlZ1ZhbHVlID0gMHgxMDsKKwlpZiAoIShpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpKQorCQlSZWdWYWx1ZSB8PSAweDAxOworCXdyaXRlX3JlZyhpbmZvLCBDVEwsIFJlZ1ZhbHVlKTsKKworCS8qIHByZWFtYmxlIG5vdCBzdXBwb3J0ZWQgISAqLworCisJdHhfc2V0X2lkbGUoaW5mbyk7CisJdHhfc3RvcChpbmZvKTsKKwlyeF9zdG9wKGluZm8pOworCisJc2V0X3JhdGUoaW5mbywgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKTsKKworCWlmIChpbmZvLT5wYXJhbXMubG9vcGJhY2spCisJCWVuYWJsZV9sb29wYmFjayhpbmZvLDEpOworfQorCisvKiBTZXQgdGhlIHRyYW5zbWl0IEhETEMgaWRsZSBtb2RlCisgKi8KK3ZvaWQgdHhfc2V0X2lkbGUoU0xNUF9JTkZPICppbmZvKQoreworCXVuc2lnbmVkIGNoYXIgUmVnVmFsdWUgPSAweGZmOworCisJLyogTWFwIEFQSSBpZGxlIG1vZGUgdG8gU0NBIHJlZ2lzdGVyIGJpdHMgKi8KKwlzd2l0Y2goaW5mby0+aWRsZV9tb2RlKSB7CisJY2FzZSBIRExDX1RYSURMRV9GTEFHUzoJCQlSZWdWYWx1ZSA9IDB4N2U7IGJyZWFrOworCWNhc2UgSERMQ19UWElETEVfQUxUX1pFUk9TX09ORVM6CVJlZ1ZhbHVlID0gMHhhYTsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9aRVJPUzoJCQlSZWdWYWx1ZSA9IDB4MDA7IGJyZWFrOworCWNhc2UgSERMQ19UWElETEVfT05FUzoJCQlSZWdWYWx1ZSA9IDB4ZmY7IGJyZWFrOworCWNhc2UgSERMQ19UWElETEVfQUxUX01BUktfU1BBQ0U6CVJlZ1ZhbHVlID0gMHhhYTsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9TUEFDRToJCQlSZWdWYWx1ZSA9IDB4MDA7IGJyZWFrOworCWNhc2UgSERMQ19UWElETEVfTUFSSzoJCQlSZWdWYWx1ZSA9IDB4ZmY7IGJyZWFrOworCX0KKworCXdyaXRlX3JlZyhpbmZvLCBJREwsIFJlZ1ZhbHVlKTsKK30KKworLyogUXVlcnkgdGhlIGFkYXB0ZXIgZm9yIHRoZSBzdGF0ZSBvZiB0aGUgVjI0IHN0YXR1cyAoaW5wdXQpIHNpZ25hbHMuCisgKi8KK3ZvaWQgZ2V0X3NpZ25hbHMoU0xNUF9JTkZPICppbmZvKQoreworCXUxNiBzdGF0dXMgPSByZWFkX3JlZyhpbmZvLCBTUjMpOworCXUxNiBncHN0YXR1cyA9IHJlYWRfc3RhdHVzX3JlZyhpbmZvKTsKKwl1MTYgdGVzdGJpdDsKKworCS8qIGNsZWFyIGFsbCBzZXJpYWwgc2lnbmFscyBleGNlcHQgRFRSIGFuZCBSVFMgKi8KKwlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSBTZXJpYWxTaWduYWxfRFRSICsgU2VyaWFsU2lnbmFsX1JUUzsKKworCS8qIHNldCBzZXJpYWwgc2lnbmFsIGJpdHMgdG8gcmVmbGVjdCBNSVNSICovCisKKwlpZiAoIShzdGF0dXMgJiBCSVQzKSkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0NUUzsKKworCWlmICggIShzdGF0dXMgJiBCSVQyKSkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RDRDsKKworCXRlc3RiaXQgPSBCSVQxIDw8IChpbmZvLT5wb3J0X251bSAqIDIpOyAvLyBQb3J0IDAuLjMgUkkgaXMgR1BEQVRBPDEsMyw1LDc+CisJaWYgKCEoZ3BzdGF0dXMgJiB0ZXN0Yml0KSkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JJOworCisJdGVzdGJpdCA9IEJJVDAgPDwgKGluZm8tPnBvcnRfbnVtICogMik7IC8vIFBvcnQgMC4uMyBEU1IgaXMgR1BEQVRBPDAsMiw0LDY+CisJaWYgKCEoZ3BzdGF0dXMgJiB0ZXN0Yml0KSkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RTUjsKK30KKworLyogU2V0IHRoZSBzdGF0ZSBvZiBEVFIgYW5kIFJUUyBiYXNlZCBvbiBjb250ZW50cyBvZgorICogc2VyaWFsX3NpZ25hbHMgbWVtYmVyIG9mIGRldmljZSBjb250ZXh0LgorICovCit2b2lkIHNldF9zaWduYWxzKFNMTVBfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIFJlZ1ZhbHVlOworCXUxNiBFbmFibGVCaXQ7CisKKwlSZWdWYWx1ZSA9IHJlYWRfcmVnKGluZm8sIENUTCk7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykKKwkJUmVnVmFsdWUgJj0gfkJJVDA7CisJZWxzZQorCQlSZWdWYWx1ZSB8PSBCSVQwOworCXdyaXRlX3JlZyhpbmZvLCBDVEwsIFJlZ1ZhbHVlKTsKKworCS8vIFBvcnQgMC4uMyBEVFIgaXMgY3RybCByZWcgPDEsMyw1LDc+CisJRW5hYmxlQml0ID0gQklUMSA8PCAoaW5mby0+cG9ydF9udW0qMik7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RUUikKKwkJaW5mby0+cG9ydF9hcnJheVswXS0+Y3RybHJlZ192YWx1ZSAmPSB+RW5hYmxlQml0OworCWVsc2UKKwkJaW5mby0+cG9ydF9hcnJheVswXS0+Y3RybHJlZ192YWx1ZSB8PSBFbmFibGVCaXQ7CisJd3JpdGVfY29udHJvbF9yZWcoaW5mbyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqLworLyogRE1BIEJ1ZmZlciBDb2RlICovCisvKioqKioqKioqKioqKioqKioqKi8KKworLyogU2V0IHRoZSBjb3VudCBmb3IgYWxsIHJlY2VpdmUgYnVmZmVycyB0byBTQ0FCVUZTSVpFCisgKiBhbmQgc2V0IHRoZSBjdXJyZW50IGJ1ZmZlciB0byB0aGUgZmlyc3QgYnVmZmVyLiBUaGlzIGVmZmVjdGl2ZWx5CisgKiBtYWtlcyBhbGwgYnVmZmVycyBmcmVlIGFuZCBkaXNjYXJkcyBhbnkgZGF0YSBpbiBidWZmZXJzLgorICovCit2b2lkIHJ4X3Jlc2V0X2J1ZmZlcnMoU0xNUF9JTkZPICppbmZvKQoreworCXJ4X2ZyZWVfZnJhbWVfYnVmZmVycyhpbmZvLCAwLCBpbmZvLT5yeF9idWZfY291bnQgLSAxKTsKK30KKworLyogRnJlZSB0aGUgYnVmZmVycyB1c2VkIGJ5IGEgcmVjZWl2ZWQgZnJhbWUKKyAqCisgKiBpbmZvICAgcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogZmlyc3QgIGluZGV4IG9mIDFzdCByZWNlaXZlIGJ1ZmZlciBvZiBmcmFtZQorICogbGFzdCAgIGluZGV4IG9mIGxhc3QgcmVjZWl2ZSBidWZmZXIgb2YgZnJhbWUKKyAqLwordm9pZCByeF9mcmVlX2ZyYW1lX2J1ZmZlcnMoU0xNUF9JTkZPICppbmZvLCB1bnNpZ25lZCBpbnQgZmlyc3QsIHVuc2lnbmVkIGludCBsYXN0KQoreworCWludCBkb25lID0gMDsKKworCXdoaWxlKCFkb25lKSB7CisJICAgICAgICAvKiByZXNldCBjdXJyZW50IGJ1ZmZlciBmb3IgcmV1c2UgKi8KKwkJaW5mby0+cnhfYnVmX2xpc3RbZmlyc3RdLnN0YXR1cyA9IDB4ZmY7CisKKwkgICAgICAgIGlmIChmaXJzdCA9PSBsYXN0KSB7CisJICAgICAgICAgICAgICAgIGRvbmUgPSAxOworCSAgICAgICAgICAgICAgICAvKiBzZXQgbmV3IGxhc3QgcnggZGVzY3JpcHRvciBhZGRyZXNzICovCisJCQl3cml0ZV9yZWcxNihpbmZvLCBSWERNQSArIEVEQSwgaW5mby0+cnhfYnVmX2xpc3RfZXhbZmlyc3RdLnBoeXNfZW50cnkpOworCSAgICAgICAgfQorCisJICAgICAgICBmaXJzdCsrOworCQlpZiAoZmlyc3QgPT0gaW5mby0+cnhfYnVmX2NvdW50KQorCQkJZmlyc3QgPSAwOworCX0KKworCS8qIHNldCBjdXJyZW50IGJ1ZmZlciB0byBuZXh0IGJ1ZmZlciBhZnRlciBsYXN0IGJ1ZmZlciBvZiBmcmFtZSAqLworCWluZm8tPmN1cnJlbnRfcnhfYnVmID0gZmlyc3Q7Cit9CisKKy8qIFJldHVybiBhIHJlY2VpdmVkIGZyYW1lIGZyb20gdGhlIHJlY2VpdmUgRE1BIGJ1ZmZlcnMuCisgKiBPbmx5IGZyYW1lcyByZWNlaXZlZCB3aXRob3V0IGVycm9ycyBhcmUgcmV0dXJuZWQuCisgKgorICogUmV0dXJuIFZhbHVlOgkxIGlmIGZyYW1lIHJldHVybmVkLCBvdGhlcndpc2UgMAorICovCitpbnQgcnhfZ2V0X2ZyYW1lKFNMTVBfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgU3RhcnRJbmRleCwgRW5kSW5kZXg7CS8qIGluZGV4IG9mIDFzdCBhbmQgbGFzdCBidWZmZXJzIG9mIFJ4IGZyYW1lICovCisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBmcmFtZXNpemUgPSAwOworCWludCBSZXR1cm5Db2RlID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CisJdW5zaWduZWQgY2hhciBhZGRyX2ZpZWxkID0gMHhmZjsKKyAgIAlTQ0FERVNDICpkZXNjOworCVNDQURFU0NfRVggKmRlc2NfZXg7CisKK0NoZWNrQWdhaW46CisJLyogYXNzdW1lIG5vIGZyYW1lIHJldHVybmVkLCBzZXQgemVybyBsZW5ndGggKi8KKwlmcmFtZXNpemUgPSAwOworCWFkZHJfZmllbGQgPSAweGZmOworCisJLyoKKwkgKiBjdXJyZW50X3J4X2J1ZiBwb2ludHMgdG8gdGhlIDFzdCBidWZmZXIgb2YgdGhlIG5leHQgYXZhaWxhYmxlCisJICogcmVjZWl2ZSBmcmFtZS4gVG8gZmluZCB0aGUgbGFzdCBidWZmZXIgb2YgdGhlIGZyYW1lIGxvb2sgZm9yCisJICogYSBub24temVybyBzdGF0dXMgZmllbGQgaW4gdGhlIGJ1ZmZlciBlbnRyaWVzLiAoVGhlIHN0YXR1cworCSAqIGZpZWxkIGlzIHNldCBieSB0aGUgMTZDMzIgYWZ0ZXIgY29tcGxldGluZyBhIHJlY2VpdmUgZnJhbWUuCisJICovCisJU3RhcnRJbmRleCA9IEVuZEluZGV4ID0gaW5mby0+Y3VycmVudF9yeF9idWY7CisKKwlmb3IgKCA7OyApIHsKKwkJZGVzYyA9ICZpbmZvLT5yeF9idWZfbGlzdFtFbmRJbmRleF07CisJCWRlc2NfZXggPSAmaW5mby0+cnhfYnVmX2xpc3RfZXhbRW5kSW5kZXhdOworCisJCWlmIChkZXNjLT5zdGF0dXMgPT0gMHhmZikKKwkJCWdvdG8gQ2xlYW51cDsJLyogY3VycmVudCBkZXNjIHN0aWxsIGluIHVzZSwgbm8gZnJhbWVzIGF2YWlsYWJsZSAqLworCisJCWlmIChmcmFtZXNpemUgPT0gMCAmJiBpbmZvLT5wYXJhbXMuYWRkcl9maWx0ZXIgIT0gMHhmZikKKwkJCWFkZHJfZmllbGQgPSBkZXNjX2V4LT52aXJ0X2FkZHJbMF07CisKKwkJZnJhbWVzaXplICs9IGRlc2MtPmxlbmd0aDsKKworCQkvKiBTdGF0dXMgIT0gMCBtZWFucyBsYXN0IGJ1ZmZlciBvZiBmcmFtZSAqLworCQlpZiAoZGVzYy0+c3RhdHVzKQorCQkJYnJlYWs7CisKKwkJRW5kSW5kZXgrKzsKKwkJaWYgKEVuZEluZGV4ID09IGluZm8tPnJ4X2J1Zl9jb3VudCkKKwkJCUVuZEluZGV4ID0gMDsKKworCQlpZiAoRW5kSW5kZXggPT0gaW5mby0+Y3VycmVudF9yeF9idWYpIHsKKwkJCS8qIGFsbCBidWZmZXJzIGhhdmUgYmVlbiAndXNlZCcgYnV0IG5vbmUgbWFyawkgICAqLworCQkJLyogdGhlIGVuZCBvZiBhIGZyYW1lLiBSZXNldCBidWZmZXJzIGFuZCByZWNlaXZlci4gKi8KKwkJCWlmICggaW5mby0+cnhfZW5hYmxlZCApeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJCQlyeF9zdGFydChpbmZvKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJCX0KKwkJCWdvdG8gQ2xlYW51cDsKKwkJfQorCisJfQorCisJLyogY2hlY2sgc3RhdHVzIG9mIHJlY2VpdmUgZnJhbWUgKi8KKworCS8qIGZyYW1lIHN0YXR1cyBpcyBieXRlIHN0b3JlZCBhZnRlciBmcmFtZSBkYXRhCisJICoKKwkgKiA3IEVPTSAoZW5kIG9mIG1zZyksIDEgPSBsYXN0IGJ1ZmZlciBvZiBmcmFtZQorCSAqIDYgU2hvcnQgRnJhbWUsIDEgPSBzaG9ydCBmcmFtZQorCSAqIDUgQWJvcnQsIDEgPSBmcmFtZSBhYm9ydGVkCisJICogNCBSZXNpZHVlLCAxID0gbGFzdCBieXRlIGlzIHBhcnRpYWwKKwkgKiAzIE92ZXJydW4sIDEgPSBvdmVycnVuIG9jY3VycmVkIGR1cmluZyBmcmFtZSByZWNlcHRpb24KKwkgKiAyIENSQywgICAgIDEgPSBDUkMgZXJyb3IgZGV0ZWN0ZWQKKwkgKgorCSAqLworCXN0YXR1cyA9IGRlc2MtPnN0YXR1czsKKworCS8qIGlnbm9yZSBDUkMgYml0IGlmIG5vdCB1c2luZyBDUkMgKGJpdCBpcyB1bmRlZmluZWQpICovCisJLyogTm90ZTpDUkMgaXMgbm90IHNhdmUgdG8gZGF0YSBidWZmZXIgKi8KKwlpZiAoaW5mby0+cGFyYW1zLmNyY190eXBlID09IEhETENfQ1JDX05PTkUpCisJCXN0YXR1cyAmPSB+QklUMjsKKworCWlmIChmcmFtZXNpemUgPT0gMCB8fAorCQkgKGFkZHJfZmllbGQgIT0gMHhmZiAmJiBhZGRyX2ZpZWxkICE9IGluZm8tPnBhcmFtcy5hZGRyX2ZpbHRlcikpIHsKKwkJLyogZGlzY2FyZCAwIGJ5dGUgZnJhbWVzLCB0aGlzIHNlZW1zIHRvIG9jY3VyIHNvbWV0aW1lCisJCSAqIHdoZW4gcmVtb3RlIGlzIGlkbGluZyBmbGFncy4KKwkJICovCisJCXJ4X2ZyZWVfZnJhbWVfYnVmZmVycyhpbmZvLCBTdGFydEluZGV4LCBFbmRJbmRleCk7CisJCWdvdG8gQ2hlY2tBZ2FpbjsKKwl9CisKKwlpZiAoZnJhbWVzaXplIDwgMikKKwkJc3RhdHVzIHw9IEJJVDY7CisKKwlpZiAoc3RhdHVzICYgKEJJVDYrQklUNStCSVQzK0JJVDIpKSB7CisJCS8qIHJlY2VpdmVkIGZyYW1lIGhhcyBlcnJvcnMsCisJCSAqIHVwZGF0ZSBjb3VudHMgYW5kIG1hcmsgZnJhbWUgc2l6ZSBhcyAwCisJCSAqLworCQlpZiAoc3RhdHVzICYgQklUNikKKwkJCWluZm8tPmljb3VudC5yeHNob3J0Kys7CisJCWVsc2UgaWYgKHN0YXR1cyAmIEJJVDUpCisJCQlpbmZvLT5pY291bnQucnhhYm9ydCsrOworCQllbHNlIGlmIChzdGF0dXMgJiBCSVQzKQorCQkJaW5mby0+aWNvdW50LnJ4b3ZlcisrOworCQllbHNlCisJCQlpbmZvLT5pY291bnQucnhjcmMrKzsKKworCQlmcmFtZXNpemUgPSAwOworI2lmZGVmIENPTkZJR19IRExDCisJCXsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoaW5mby0+bmV0ZGV2KTsKKwkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJfQorI2VuZGlmCisJfQorCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCApCisJCXByaW50aygiJXMoJWQpOiVzIHJ4X2dldF9mcmFtZSgpIHN0YXR1cz0lMDRYIHNpemU9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxzdGF0dXMsZnJhbWVzaXplKTsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfREFUQSApCisJCXRyYWNlX2Jsb2NrKGluZm8saW5mby0+cnhfYnVmX2xpc3RfZXhbU3RhcnRJbmRleF0udmlydF9hZGRyLAorCQkJbWluX3QoaW50LCBmcmFtZXNpemUsU0NBQlVGU0laRSksMCk7CisKKwlpZiAoZnJhbWVzaXplKSB7CisJCWlmIChmcmFtZXNpemUgPiBpbmZvLT5tYXhfZnJhbWVfc2l6ZSkKKwkJCWluZm8tPmljb3VudC5yeGxvbmcrKzsKKwkJZWxzZSB7CisJCQkvKiBjb3B5IGRtYSBidWZmZXIocykgdG8gY29udGlndW91cyBpbnRlcm1lZGlhdGUgYnVmZmVyICovCisJCQlpbnQgY29weV9jb3VudCA9IGZyYW1lc2l6ZTsKKwkJCWludCBpbmRleCA9IFN0YXJ0SW5kZXg7CisJCQl1bnNpZ25lZCBjaGFyICpwdG1wID0gaW5mby0+dG1wX3J4X2J1ZjsKKwkJCWluZm8tPnRtcF9yeF9idWZfY291bnQgPSBmcmFtZXNpemU7CisKKwkJCWluZm8tPmljb3VudC5yeG9rKys7CisKKwkJCXdoaWxlKGNvcHlfY291bnQpIHsKKwkJCQlpbnQgcGFydGlhbF9jb3VudCA9IG1pbihjb3B5X2NvdW50LFNDQUJVRlNJWkUpOworCQkJCW1lbWNweSggcHRtcCwKKwkJCQkJaW5mby0+cnhfYnVmX2xpc3RfZXhbaW5kZXhdLnZpcnRfYWRkciwKKwkJCQkJcGFydGlhbF9jb3VudCApOworCQkJCXB0bXAgKz0gcGFydGlhbF9jb3VudDsKKwkJCQljb3B5X2NvdW50IC09IHBhcnRpYWxfY291bnQ7CisKKwkJCQlpZiAoICsraW5kZXggPT0gaW5mby0+cnhfYnVmX2NvdW50ICkKKwkJCQkJaW5kZXggPSAwOworCQkJfQorCisjaWZkZWYgQ09ORklHX0hETEMKKwkJCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJCQloZGxjZGV2X3J4KGluZm8saW5mby0+dG1wX3J4X2J1ZixmcmFtZXNpemUpOworCQkJZWxzZQorI2VuZGlmCisJCQkJbGRpc2NfcmVjZWl2ZV9idWYodHR5LGluZm8tPnRtcF9yeF9idWYsCisJCQkJCQkgIGluZm8tPmZsYWdfYnVmLCBmcmFtZXNpemUpOworCQl9CisJfQorCS8qIEZyZWUgdGhlIGJ1ZmZlcnMgdXNlZCBieSB0aGlzIGZyYW1lLiAqLworCXJ4X2ZyZWVfZnJhbWVfYnVmZmVycyggaW5mbywgU3RhcnRJbmRleCwgRW5kSW5kZXggKTsKKworCVJldHVybkNvZGUgPSAxOworCitDbGVhbnVwOgorCWlmICggaW5mby0+cnhfZW5hYmxlZCAmJiBpbmZvLT5yeF9vdmVyZmxvdyApIHsKKwkJLyogUmVjZWl2ZXIgaXMgZW5hYmxlZCwgYnV0IG5lZWRzIHRvIHJlc3RhcnRlZCBkdWUgdG8KKwkJICogcnggYnVmZmVyIG92ZXJmbG93LiBJZiBidWZmZXJzIGFyZSBlbXB0eSwgcmVzdGFydCByZWNlaXZlci4KKwkJICovCisJCWlmIChpbmZvLT5yeF9idWZfbGlzdFtFbmRJbmRleF0uc3RhdHVzID09IDB4ZmYpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJCXJ4X3N0YXJ0KGluZm8pOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJCX0KKwl9CisKKwlyZXR1cm4gUmV0dXJuQ29kZTsKK30KKworLyogbG9hZCB0aGUgdHJhbnNtaXQgRE1BIGJ1ZmZlciB3aXRoIGRhdGEKKyAqLwordm9pZCB0eF9sb2FkX2RtYV9idWZmZXIoU0xNUF9JTkZPICppbmZvLCBjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBjb3B5X2NvdW50OworCXVuc2lnbmVkIGludCBpID0gMDsKKwlTQ0FERVNDICpkZXNjOworCVNDQURFU0NfRVggKmRlc2NfZXg7CisKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0RBVEEgKQorCQl0cmFjZV9ibG9jayhpbmZvLGJ1ZiwgbWluX3QoaW50LCBjb3VudCxTQ0FCVUZTSVpFKSwgMSk7CisKKwkvKiBDb3B5IHNvdXJjZSBidWZmZXIgdG8gb25lIG9yIG1vcmUgRE1BIGJ1ZmZlcnMsIHN0YXJ0aW5nIHdpdGgKKwkgKiB0aGUgZmlyc3QgdHJhbnNtaXQgZG1hIGJ1ZmZlci4KKwkgKi8KKwlmb3IoaT0wOzspCisJeworCQljb3B5X2NvdW50ID0gbWluX3QodW5zaWduZWQgc2hvcnQsY291bnQsU0NBQlVGU0laRSk7CisKKwkJZGVzYyA9ICZpbmZvLT50eF9idWZfbGlzdFtpXTsKKwkJZGVzY19leCA9ICZpbmZvLT50eF9idWZfbGlzdF9leFtpXTsKKworCQlsb2FkX3BjaV9tZW1vcnkoaW5mbywgZGVzY19leC0+dmlydF9hZGRyLGJ1Zixjb3B5X2NvdW50KTsKKworCQlkZXNjLT5sZW5ndGggPSBjb3B5X2NvdW50OworCQlkZXNjLT5zdGF0dXMgPSAwOworCisJCWJ1ZiArPSBjb3B5X2NvdW50OworCQljb3VudCAtPSBjb3B5X2NvdW50OworCisJCWlmICghY291bnQpCisJCQlicmVhazsKKworCQlpKys7CisJCWlmIChpID49IGluZm8tPnR4X2J1Zl9jb3VudCkKKwkJCWkgPSAwOworCX0KKworCWluZm8tPnR4X2J1Zl9saXN0W2ldLnN0YXR1cyA9IDB4ODE7CS8qIHNldCBFT00gYW5kIEVPVCBzdGF0dXMgKi8KKwlpbmZvLT5sYXN0X3R4X2J1ZiA9ICsraTsKK30KKworaW50IHJlZ2lzdGVyX3Rlc3QoU0xNUF9JTkZPICppbmZvKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHRlc3R2YWxbXSA9IHsweDAwLCAweGZmLCAweGFhLCAweDU1LCAweDY5LCAweDk2fTsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGNvdW50ID0gc2l6ZW9mKHRlc3R2YWwpL3NpemVvZih1bnNpZ25lZCBjaGFyKTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmMgPSBUUlVFOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmVzZXRfcG9ydChpbmZvKTsKKworCS8qIGFzc3VtZSBmYWlsdXJlICovCisJaW5mby0+aW5pdF9lcnJvciA9IERpYWdTdGF0dXNfQWRkcmVzc0ZhaWx1cmU7CisKKwkvKiBXcml0ZSBiaXQgcGF0dGVybnMgdG8gdmFyaW91cyByZWdpc3RlcnMgYnV0IGRvIGl0IG91dCBvZiAqLworCS8qIHN5bmMsIHRoZW4gcmVhZCBiYWNrIGFuZCB2ZXJpZnkgdmFsdWVzLiAqLworCisJZm9yIChpID0gMCA7IGkgPCBjb3VudCA7IGkrKykgeworCQl3cml0ZV9yZWcoaW5mbywgVE1DLCB0ZXN0dmFsW2ldKTsKKwkJd3JpdGVfcmVnKGluZm8sIElETCwgdGVzdHZhbFsoaSsxKSVjb3VudF0pOworCQl3cml0ZV9yZWcoaW5mbywgU0EwLCB0ZXN0dmFsWyhpKzIpJWNvdW50XSk7CisJCXdyaXRlX3JlZyhpbmZvLCBTQTEsIHRlc3R2YWxbKGkrMyklY291bnRdKTsKKworCQlpZiAoIChyZWFkX3JlZyhpbmZvLCBUTUMpICE9IHRlc3R2YWxbaV0pIHx8CisJCQkgIChyZWFkX3JlZyhpbmZvLCBJREwpICE9IHRlc3R2YWxbKGkrMSklY291bnRdKSB8fAorCQkJICAocmVhZF9yZWcoaW5mbywgU0EwKSAhPSB0ZXN0dmFsWyhpKzIpJWNvdW50XSkgfHwKKwkJCSAgKHJlYWRfcmVnKGluZm8sIFNBMSkgIT0gdGVzdHZhbFsoaSszKSVjb3VudF0pICkKKwkJeworCQkJcmMgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmVzZXRfcG9ydChpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworaW50IGlycV90ZXN0KFNMTVBfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXVuc2lnbmVkIGNoYXIgdGltZXIgPSAoaW5mby0+cG9ydF9udW0gJiAxKSA/IFRJTUVSMiA6IFRJTUVSMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXNldF9wb3J0KGluZm8pOworCisJLyogYXNzdW1lIGZhaWx1cmUgKi8KKwlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19JcnFGYWlsdXJlOworCWluZm8tPmlycV9vY2N1cnJlZCA9IEZBTFNFOworCisJLyogc2V0dXAgdGltZXIwIG9uIFNDQTAgdG8gaW50ZXJydXB0ICovCisKKwkvKiBJRVIyPDcuLjQ+ID0gdGltZXI8My4uMD4gaW50ZXJydXB0IGVuYWJsZXMgKDE9ZW5hYmxlZCkgKi8KKwl3cml0ZV9yZWcoaW5mbywgSUVSMiwgKHVuc2lnbmVkIGNoYXIpKChpbmZvLT5wb3J0X251bSAmIDEpID8gQklUNiA6IEJJVDQpKTsKKworCXdyaXRlX3JlZyhpbmZvLCAodW5zaWduZWQgY2hhcikodGltZXIgKyBURVBSKSwgMCk7CS8qIHRpbWVyIGV4cGFuZCBwcmVzY2FsZSAqLworCXdyaXRlX3JlZzE2KGluZm8sICh1bnNpZ25lZCBjaGFyKSh0aW1lciArIFRDT05SKSwgMSk7CS8qIHRpbWVyIGNvbnN0YW50ICovCisKKworCS8qIFRNQ1MsIFRpbWVyIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyCisJICoKKwkgKiAwNyAgICAgIENNRiwgQ29tcGFyZSBtYXRjaCBmbGFnIChyZWFkIG9ubHkpIDE9bWF0Y2gKKwkgKiAwNiAgICAgIEVDTUksIENNRiBJbnRlcnJ1cHQgRW5hYmxlOiAxPWVuYWJsZWQKKwkgKiAwNSAgICAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKiAwNCAgICAgIFRNRSwgVGltZXIgRW5hYmxlCisJICogMDMuLjAwICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICoKKwkgKiAwMTAxIDAwMDAKKwkgKi8KKwl3cml0ZV9yZWcoaW5mbywgKHVuc2lnbmVkIGNoYXIpKHRpbWVyICsgVE1DUyksIDB4NTApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwl0aW1lb3V0PTEwMDsKKwl3aGlsZSggdGltZW91dC0tICYmICFpbmZvLT5pcnFfb2NjdXJyZWQgKSB7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmVzZXRfcG9ydChpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXJldHVybiBpbmZvLT5pcnFfb2NjdXJyZWQ7Cit9CisKKy8qIGluaXRpYWxpemUgaW5kaXZpZHVhbCBTQ0EgZGV2aWNlICgyIHBvcnRzKQorICovCitzdGF0aWMgaW50IHNjYV9pbml0KFNMTVBfSU5GTyAqaW5mbykKK3sKKwkvKiBzZXQgd2FpdCBjb250cm9sbGVyIHRvIHNpbmdsZSBtZW0gcGFydGl0aW9uIChsb3cpLCBubyB3YWl0IHN0YXRlcyAqLworCXdyaXRlX3JlZyhpbmZvLCBQQUJSMCwgMCk7CS8qIHdhaXQgY29udHJvbGxlciBhZGRyIGJvdW5kYXJ5IDAgKi8KKwl3cml0ZV9yZWcoaW5mbywgUEFCUjEsIDApOwkvKiB3YWl0IGNvbnRyb2xsZXIgYWRkciBib3VuZGFyeSAxICovCisJd3JpdGVfcmVnKGluZm8sIFdDUkwsIDApOwkvKiB3YWl0IGNvbnRyb2xsZXIgbG93IHJhbmdlICovCisJd3JpdGVfcmVnKGluZm8sIFdDUk0sIDApOwkvKiB3YWl0IGNvbnRyb2xsZXIgbWlkIHJhbmdlICovCisJd3JpdGVfcmVnKGluZm8sIFdDUkgsIDApOwkvKiB3YWl0IGNvbnRyb2xsZXIgaGlnaCByYW5nZSAqLworCisJLyogRFBDUiwgRE1BIFByaW9yaXR5IENvbnRyb2wKKwkgKgorCSAqIDA3Li4wNSAgTm90IHVzZWQsIG11c3QgYmUgMAorCSAqIDA0ICAgICAgQlJDLCBidXMgcmVsZWFzZSBjb25kaXRpb246IDA9YWxsIHRyYW5zZmVycyBjb21wbGV0ZQorCSAqIDAzICAgICAgQ0NDLCBjaGFubmVsIGNoYW5nZSBjb25kaXRpb246IDA9ZXZlcnkgY3ljbGUKKwkgKiAwMi4uMDAgIFBSPDIuLjA+LCBwcmlvcml0eSAxMDA9cm91bmQgcm9iaW4KKwkgKgorCSAqIDAwMDAwMTAwID0gMHgwNAorCSAqLworCXdyaXRlX3JlZyhpbmZvLCBEUENSLCBkbWFfcHJpb3JpdHkpOworCisJLyogRE1BIE1hc3RlciBFbmFibGUsIEJJVDc6IDE9ZW5hYmxlIGFsbCBjaGFubmVscyAqLworCXdyaXRlX3JlZyhpbmZvLCBETUVSLCAweDgwKTsKKworCS8qIGVuYWJsZSBhbGwgaW50ZXJydXB0IGNsYXNzZXMgKi8KKwl3cml0ZV9yZWcoaW5mbywgSUVSMCwgMHhmZik7CS8qIFR4UkRZLFJ4UkRZLFR4SU5ULFJ4SU5UIChwb3J0cyAwLTEpICovCisJd3JpdGVfcmVnKGluZm8sIElFUjEsIDB4ZmYpOwkvKiBETUlCLERNSUEgKGNoYW5uZWxzIDAtMykgKi8KKwl3cml0ZV9yZWcoaW5mbywgSUVSMiwgMHhmMCk7CS8qIFRJUlEgKHRpbWVycyAwLTMpICovCisKKwkvKiBJVENSLCBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlcgorCSAqIDA3ICAgICAgSVBDLCBpbnRlcnJ1cHQgcHJpb3JpdHksIDA9TVNDSS0+RE1BCisJICogMDYuLjA1ICBJQUs8MS4uMD4sIEFja25vd2xlZGdlIGN5Y2xlLCAwMD1ub24tYWNrIGN5Y2xlCisJICogMDQgICAgICBWT1MsIFZlY3RvciBPdXRwdXQsIDA9dW5tb2RpZmllZCB2ZWN0b3IKKwkgKiAwMy4uMDAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKi8KKwl3cml0ZV9yZWcoaW5mbywgSVRDUiwgMCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyogaW5pdGlhbGl6ZSBhZGFwdGVyIGhhcmR3YXJlCisgKi8KK2ludCBpbml0X2FkYXB0ZXIoU0xNUF9JTkZPICppbmZvKQoreworCWludCBpOworCisJLyogU2V0IEJJVDMwIG9mIExvY2FsIENvbnRyb2wgUmVnIDB4NTAgdG8gcmVzZXQgU0NBICovCisJdm9sYXRpbGUgdTMyICpNaXNjQ3RybCA9ICh1MzIgKikoaW5mby0+bGNyX2Jhc2UgKyAweDUwKTsKKwl1MzIgcmVhZHZhbDsKKworCWluZm8tPm1pc2NfY3RybF92YWx1ZSB8PSBCSVQzMDsKKwkqTWlzY0N0cmwgPSBpbmZvLT5taXNjX2N0cmxfdmFsdWU7CisKKwkvKgorCSAqIEZvcmNlIGF0IGxlYXN0IDE3MG5zIGRlbGF5IGJlZm9yZSBjbGVhcmluZworCSAqIHJlc2V0IGJpdC4gRWFjaCByZWFkIGZyb20gTENSIHRha2VzIGF0IGxlYXN0CisJICogMzBucyBzbyAxMCB0aW1lcyBmb3IgMzAwbnMgdG8gYmUgc2FmZS4KKwkgKi8KKwlmb3IoaT0wO2k8MTA7aSsrKQorCQlyZWFkdmFsID0gKk1pc2NDdHJsOworCisJaW5mby0+bWlzY19jdHJsX3ZhbHVlICY9IH5CSVQzMDsKKwkqTWlzY0N0cmwgPSBpbmZvLT5taXNjX2N0cmxfdmFsdWU7CisKKwkvKiBpbml0IGNvbnRyb2wgcmVnIChhbGwgRFRScyBvZmYsIGFsbCBjbGtzZWw9aW5wdXQpICovCisJaW5mby0+Y3RybHJlZ192YWx1ZSA9IDB4YWE7CisJd3JpdGVfY29udHJvbF9yZWcoaW5mbyk7CisKKwl7CisJCXZvbGF0aWxlIHUzMiAqTENSMUJSRFIgPSAodTMyICopKGluZm8tPmxjcl9iYXNlICsgMHgyYyk7CisJCWxjcjFfYnJkcl92YWx1ZSAmPSB+KEJJVDUgKyBCSVQ0ICsgQklUMyk7CisKKwkJc3dpdGNoKHJlYWRfYWhlYWRfY291bnQpCisJCXsKKwkJY2FzZSAxNjoKKwkJCWxjcjFfYnJkcl92YWx1ZSB8PSBCSVQ1ICsgQklUNCArIEJJVDM7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJbGNyMV9icmRyX3ZhbHVlIHw9IEJJVDUgKyBCSVQ0OworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWxjcjFfYnJkcl92YWx1ZSB8PSBCSVQ1ICsgQklUMzsKKwkJCWJyZWFrOworCQljYXNlIDA6CisJCQlsY3IxX2JyZHJfdmFsdWUgfD0gQklUNTsKKwkJCWJyZWFrOworCQl9CisKKwkJKkxDUjFCUkRSID0gbGNyMV9icmRyX3ZhbHVlOworCQkqTWlzY0N0cmwgPSBtaXNjX2N0cmxfdmFsdWU7CisJfQorCisJc2NhX2luaXQoaW5mby0+cG9ydF9hcnJheVswXSk7CisJc2NhX2luaXQoaW5mby0+cG9ydF9hcnJheVsyXSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyogTG9vcGJhY2sgYW4gSERMQyBmcmFtZSB0byB0ZXN0IHRoZSBoYXJkd2FyZQorICogaW50ZXJydXB0IGFuZCBETUEgZnVuY3Rpb25zLgorICovCitpbnQgbG9vcGJhY2tfdGVzdChTTE1QX0lORk8gKmluZm8pCit7CisjZGVmaW5lIFRFU1RGUkFNRVNJWkUgMjAKKworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1MTYgY291bnQgPSBURVNURlJBTUVTSVpFOworCXVuc2lnbmVkIGNoYXIgYnVmW1RFU1RGUkFNRVNJWkVdOworCWludCByYyA9IEZBTFNFOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqb2xkdHR5ID0gaW5mby0+dHR5OworCXUzMiBzcGVlZCA9IGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZDsKKworCWluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCA9IDM2ODY0MDA7CisJaW5mby0+dHR5ID0gTlVMTDsKKworCS8qIGFzc3VtZSBmYWlsdXJlICovCisJaW5mby0+aW5pdF9lcnJvciA9IERpYWdTdGF0dXNfRG1hRmFpbHVyZTsKKworCS8qIGJ1aWxkIGFuZCBzZW5kIHRyYW5zbWl0IGZyYW1lICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgVEVTVEZSQU1FU0laRTsrK2NvdW50KQorCQlidWZbY291bnRdID0gKHVuc2lnbmVkIGNoYXIpY291bnQ7CisKKwltZW1zZXQoaW5mby0+dG1wX3J4X2J1ZiwwLFRFU1RGUkFNRVNJWkUpOworCisJLyogcHJvZ3JhbSBoYXJkd2FyZSBmb3IgSERMQyBhbmQgZW5hYmxlZCByZWNlaXZlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwloZGxjX21vZGUoaW5mbyk7CisJZW5hYmxlX2xvb3BiYWNrKGluZm8sMSk7CisgICAgICAgCXJ4X3N0YXJ0KGluZm8pOworCWluZm8tPnR4X2NvdW50ID0gY291bnQ7CisJdHhfbG9hZF9kbWFfYnVmZmVyKGluZm8sYnVmLGNvdW50KTsKKwl0eF9zdGFydChpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCS8qIHdhaXQgZm9yIHJlY2VpdmUgY29tcGxldGUgKi8KKwkvKiBTZXQgYSB0aW1lb3V0IGZvciB3YWl0aW5nIGZvciBpbnRlcnJ1cHQuICovCisJZm9yICggdGltZW91dCA9IDEwMDsgdGltZW91dDsgLS10aW1lb3V0ICkgeworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMCk7CisKKwkJaWYgKHJ4X2dldF9mcmFtZShpbmZvKSkgeworCQkJcmMgPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiB2ZXJpZnkgcmVjZWl2ZWQgZnJhbWUgbGVuZ3RoIGFuZCBjb250ZW50cyAqLworCWlmIChyYyA9PSBUUlVFICYmCisJCSggaW5mby0+dG1wX3J4X2J1Zl9jb3VudCAhPSBjb3VudCB8fAorCQkgIG1lbWNtcChidWYsIGluZm8tPnRtcF9yeF9idWYsY291bnQpKSkgeworCQlyYyA9IEZBTFNFOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXNldF9hZGFwdGVyKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkID0gc3BlZWQ7CisJaW5mby0+dHR5ID0gb2xkdHR5OworCisJcmV0dXJuIHJjOworfQorCisvKiBQZXJmb3JtIGRpYWdub3N0aWNzIG9uIGhhcmR3YXJlCisgKi8KK2ludCBhZGFwdGVyX3Rlc3QoIFNMTVBfSU5GTyAqaW5mbyApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQlwcmludGsoICIlcyglZCk6VGVzdGluZyBkZXZpY2UgJXNcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWluaXRfYWRhcHRlcihpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCWluZm8tPnBvcnRfYXJyYXlbMF0tPnBvcnRfY291bnQgPSAwOworCisJaWYgKCByZWdpc3Rlcl90ZXN0KGluZm8tPnBvcnRfYXJyYXlbMF0pICYmCisJCXJlZ2lzdGVyX3Rlc3QoaW5mby0+cG9ydF9hcnJheVsxXSkpIHsKKworCQlpbmZvLT5wb3J0X2FycmF5WzBdLT5wb3J0X2NvdW50ID0gMjsKKworCQlpZiAoIHJlZ2lzdGVyX3Rlc3QoaW5mby0+cG9ydF9hcnJheVsyXSkgJiYKKwkJCXJlZ2lzdGVyX3Rlc3QoaW5mby0+cG9ydF9hcnJheVszXSkgKQorCQkJaW5mby0+cG9ydF9hcnJheVswXS0+cG9ydF9jb3VudCArPSAyOworCX0KKwllbHNlIHsKKwkJcHJpbnRrKCAiJXMoJWQpOlJlZ2lzdGVyIHRlc3QgZmFpbHVyZSBmb3IgZGV2aWNlICVzIEFkZHI9JTA4bFhcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgKHVuc2lnbmVkIGxvbmcpKGluZm8tPnBoeXNfc2NhX2Jhc2UpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCAhaXJxX3Rlc3QoaW5mby0+cG9ydF9hcnJheVswXSkgfHwKKwkJIWlycV90ZXN0KGluZm8tPnBvcnRfYXJyYXlbMV0pIHx8CisJCSAoaW5mby0+cG9ydF9jb3VudCA9PSA0ICYmICFpcnFfdGVzdChpbmZvLT5wb3J0X2FycmF5WzJdKSkgfHwKKwkJIChpbmZvLT5wb3J0X2NvdW50ID09IDQgJiYgIWlycV90ZXN0KGluZm8tPnBvcnRfYXJyYXlbM10pKSkgeworCQlwcmludGsoICIlcyglZCk6SW50ZXJydXB0IHRlc3QgZmFpbHVyZSBmb3IgZGV2aWNlICVzIElSUT0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCAodW5zaWduZWQgc2hvcnQpKGluZm8tPmlycV9sZXZlbCkgKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFsb29wYmFja190ZXN0KGluZm8tPnBvcnRfYXJyYXlbMF0pIHx8CisJCSFsb29wYmFja190ZXN0KGluZm8tPnBvcnRfYXJyYXlbMV0pIHx8CisJCSAoaW5mby0+cG9ydF9jb3VudCA9PSA0ICYmICFsb29wYmFja190ZXN0KGluZm8tPnBvcnRfYXJyYXlbMl0pKSB8fAorCQkgKGluZm8tPnBvcnRfY291bnQgPT0gNCAmJiAhbG9vcGJhY2tfdGVzdChpbmZvLT5wb3J0X2FycmF5WzNdKSkpIHsKKwkJcHJpbnRrKCAiJXMoJWQpOkRNQSB0ZXN0IGZhaWx1cmUgZm9yIGRldmljZSAlc1xuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCAiJXMoJWQpOmRldmljZSAlcyBwYXNzZWQgZGlhZ25vc3RpY3NcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSApOworCisJaW5mby0+cG9ydF9hcnJheVswXS0+aW5pdF9lcnJvciA9IDA7CisJaW5mby0+cG9ydF9hcnJheVsxXS0+aW5pdF9lcnJvciA9IDA7CisJaWYgKCBpbmZvLT5wb3J0X2NvdW50ID4gMiApIHsKKwkJaW5mby0+cG9ydF9hcnJheVsyXS0+aW5pdF9lcnJvciA9IDA7CisJCWluZm8tPnBvcnRfYXJyYXlbM10tPmluaXRfZXJyb3IgPSAwOworCX0KKworCXJldHVybiAwOworfQorCisvKiBUZXN0IHRoZSBzaGFyZWQgbWVtb3J5IG9uIGEgUENJIGFkYXB0ZXIuCisgKi8KK2ludCBtZW1vcnlfdGVzdChTTE1QX0lORk8gKmluZm8pCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgdGVzdHZhbFtdID0geyAweDAsIDB4NTU1NTU1NTUsIDB4YWFhYWFhYWEsCisJCTB4NjY2NjY2NjYsIDB4OTk5OTk5OTksIDB4ZmZmZmZmZmYsIDB4MTIzNDU2NzggfTsKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gc2l6ZW9mKHRlc3R2YWwpL3NpemVvZih1bnNpZ25lZCBsb25nKTsKKwl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBsaW1pdCA9IFNDQV9NRU1fU0laRS9zaXplb2YodW5zaWduZWQgbG9uZyk7CisJdW5zaWduZWQgbG9uZyAqIGFkZHIgPSAodW5zaWduZWQgbG9uZyAqKWluZm8tPm1lbW9yeV9iYXNlOworCisJLyogVGVzdCBkYXRhIGxpbmVzIHdpdGggdGVzdCBwYXR0ZXJuIGF0IG9uZSBsb2NhdGlvbi4gKi8KKworCWZvciAoIGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrICkgeworCQkqYWRkciA9IHRlc3R2YWxbaV07CisJCWlmICggKmFkZHIgIT0gdGVzdHZhbFtpXSApCisJCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLyogVGVzdCBhZGRyZXNzIGxpbmVzIHdpdGggaW5jcmVtZW50aW5nIHBhdHRlcm4gb3ZlciAqLworCS8qIGVudGlyZSBhZGRyZXNzIHJhbmdlLiAqLworCisJZm9yICggaSA9IDAgOyBpIDwgbGltaXQgOyBpKysgKSB7CisJCSphZGRyID0gaSAqIDQ7CisJCWFkZHIrKzsKKwl9CisKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcgKilpbmZvLT5tZW1vcnlfYmFzZTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGxpbWl0IDsgaSsrICkgeworCQlpZiAoICphZGRyICE9IGkgKiA0ICkKKwkJCXJldHVybiBGQUxTRTsKKwkJYWRkcisrOworCX0KKworCW1lbXNldCggaW5mby0+bWVtb3J5X2Jhc2UsIDAsIFNDQV9NRU1fU0laRSApOworCXJldHVybiBUUlVFOworfQorCisvKiBMb2FkIGRhdGEgaW50byBQQ0kgYWRhcHRlciBzaGFyZWQgbWVtb3J5LgorICoKKyAqIFRoZSBQQ0k5MDUwIHJlbGVhc2VzIGNvbnRyb2wgb2YgdGhlIGxvY2FsIGJ1cworICogYWZ0ZXIgY29tcGxldGluZyB0aGUgY3VycmVudCByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbi4KKyAqCisgKiBXaGlsZSB0aGUgUENJOTA1MCB3cml0ZSBGSUZPIG5vdCBlbXB0eSwgdGhlCisgKiBQQ0k5MDUwIHRyZWF0cyBhbGwgb2YgdGhlIHdyaXRlcyBhcyBhIHNpbmdsZSB0cmFuc2FjdGlvbgorICogYW5kIGRvZXMgbm90IHJlbGVhc2UgdGhlIGJ1cy4gVGhpcyBjYXVzZXMgRE1BIGxhdGVuY3kgcHJvYmxlbXMKKyAqIGF0IGhpZ2ggc3BlZWRzIHdoZW4gY29weWluZyBsYXJnZSBkYXRhIGJsb2NrcyB0byB0aGUgc2hhcmVkIG1lbW9yeS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGJyZWFrcyBhIHdyaXRlIGludG8gbXVsdGlwbGUgdHJhbnNhdGlvbnMgYnkKKyAqIGludGVybGVhdmluZyBhIHJlYWQgd2hpY2ggZmx1c2hlcyB0aGUgd3JpdGUgRklGTyBhbmQgJ2NvbXBsZXRlcycKKyAqIHRoZSB3cml0ZSB0cmFuc2F0aW9uLiBUaGlzIGFsbG93cyBhbnkgcGVuZGluZyBETUEgcmVxdWVzdCB0byBnYWluIGNvbnRyb2wKKyAqIG9mIHRoZSBsb2NhbCBidXMgaW4gYSB0aW1lbHkgZmFzaW9uLgorICovCit2b2lkIGxvYWRfcGNpX21lbW9yeShTTE1QX0lORk8gKmluZm8sIGNoYXIqIGRlc3QsIGNvbnN0IGNoYXIqIHNyYywgdW5zaWduZWQgc2hvcnQgY291bnQpCit7CisJLyogQSBsb2FkIGludGVydmFsIG9mIDE2IGFsbG93cyBmb3IgNCAzMi1iaXQgd3JpdGVzIGF0ICovCisJLyogMTM2bnMgZWFjaCBmb3IgYSBtYXhpbXVtIGxhdGVuY3kgb2YgNTQybnMgb24gdGhlIGxvY2FsIGJ1cy4qLworCisJdW5zaWduZWQgc2hvcnQgaW50ZXJ2YWwgPSBjb3VudCAvIHNjYV9wY2lfbG9hZF9pbnRlcnZhbDsKKwl1bnNpZ25lZCBzaG9ydCBpOworCisJZm9yICggaSA9IDAgOyBpIDwgaW50ZXJ2YWwgOyBpKysgKQorCXsKKwkJbWVtY3B5KGRlc3QsIHNyYywgc2NhX3BjaV9sb2FkX2ludGVydmFsKTsKKwkJcmVhZF9zdGF0dXNfcmVnKGluZm8pOworCQlkZXN0ICs9IHNjYV9wY2lfbG9hZF9pbnRlcnZhbDsKKwkJc3JjICs9IHNjYV9wY2lfbG9hZF9pbnRlcnZhbDsKKwl9CisKKwltZW1jcHkoZGVzdCwgc3JjLCBjb3VudCAlIHNjYV9wY2lfbG9hZF9pbnRlcnZhbCk7Cit9CisKK3ZvaWQgdHJhY2VfYmxvY2soU0xNUF9JTkZPICppbmZvLGNvbnN0IGNoYXIqIGRhdGEsIGludCBjb3VudCwgaW50IHhtaXQpCit7CisJaW50IGk7CisJaW50IGxpbmVjb3VudDsKKwlpZiAoeG1pdCkKKwkJcHJpbnRrKCIlcyB0eCBkYXRhOlxuIixpbmZvLT5kZXZpY2VfbmFtZSk7CisJZWxzZQorCQlwcmludGsoIiVzIHJ4IGRhdGE6XG4iLGluZm8tPmRldmljZV9uYW1lKTsKKworCXdoaWxlKGNvdW50KSB7CisJCWlmIChjb3VudCA+IDE2KQorCQkJbGluZWNvdW50ID0gMTY7CisJCWVsc2UKKwkJCWxpbmVjb3VudCA9IGNvdW50OworCisJCWZvcihpPTA7aTxsaW5lY291bnQ7aSsrKQorCQkJcHJpbnRrKCIlMDJYICIsKHVuc2lnbmVkIGNoYXIpZGF0YVtpXSk7CisJCWZvcig7aTwxNztpKyspCisJCQlwcmludGsoIiAgICIpOworCQlmb3IoaT0wO2k8bGluZWNvdW50O2krKykgeworCQkJaWYgKGRhdGFbaV0+PTA0MCAmJiBkYXRhW2ldPD0wMTc2KQorCQkJCXByaW50aygiJWMiLGRhdGFbaV0pOworCQkJZWxzZQorCQkJCXByaW50aygiLiIpOworCQl9CisJCXByaW50aygiXG4iKTsKKworCQlkYXRhICArPSBsaW5lY291bnQ7CisJCWNvdW50IC09IGxpbmVjb3VudDsKKwl9Cit9CS8qIGVuZCBvZiB0cmFjZV9ibG9jaygpICovCisKKy8qIGNhbGxlZCB3aGVuIEhETEMgZnJhbWUgdGltZXMgb3V0CisgKiB1cGRhdGUgc3RhdHMgYW5kIGRvIHR4IGNvbXBsZXRpb24gcHJvY2Vzc2luZworICovCit2b2lkIHR4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCVNMTVBfSU5GTyAqaW5mbyA9IChTTE1QX0lORk8qKWNvbnRleHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCisJCXByaW50ayggIiVzKCVkKTolcyB0eF90aW1lb3V0KClcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJaWYoaW5mby0+dHhfYWN0aXZlICYmIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCWluZm8tPmljb3VudC50eHRpbWVvdXQrKzsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWluZm8tPnR4X2FjdGl2ZSA9IDA7CisJaW5mby0+dHhfY291bnQgPSBpbmZvLT50eF9wdXQgPSBpbmZvLT50eF9nZXQgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKyNpZmRlZiBDT05GSUdfSERMQworCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJaGRsY2Rldl90eF9kb25lKGluZm8pOworCWVsc2UKKyNlbmRpZgorCQliaF90cmFuc21pdChpbmZvKTsKK30KKworLyogY2FsbGVkIHRvIHBlcmlvZGljYWxseSBjaGVjayB0aGUgRFNSL1JJIG1vZGVtIHNpZ25hbCBpbnB1dCBzdGF0dXMKKyAqLwordm9pZCBzdGF0dXNfdGltZW91dCh1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdTE2IHN0YXR1cyA9IDA7CisJU0xNUF9JTkZPICppbmZvID0gKFNMTVBfSU5GTyopY29udGV4dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgZGVsdGE7CisKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlnZXRfc2lnbmFscyhpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCS8qIGNoZWNrIGZvciBEU1IvUkkgc3RhdGUgY2hhbmdlICovCisKKwlkZWx0YSA9IGluZm8tPm9sZF9zaWduYWxzIF4gaW5mby0+c2VyaWFsX3NpZ25hbHM7CisJaW5mby0+b2xkX3NpZ25hbHMgPSBpbmZvLT5zZXJpYWxfc2lnbmFsczsKKworCWlmIChkZWx0YSAmIFNlcmlhbFNpZ25hbF9EU1IpCisJCXN0YXR1cyB8PSBNSVNDU1RBVFVTX0RTUl9MQVRDSEVEfChpbmZvLT5zZXJpYWxfc2lnbmFscyZTZXJpYWxTaWduYWxfRFNSKTsKKworCWlmIChkZWx0YSAmIFNlcmlhbFNpZ25hbF9SSSkKKwkJc3RhdHVzIHw9IE1JU0NTVEFUVVNfUklfTEFUQ0hFRHwoaW5mby0+c2VyaWFsX3NpZ25hbHMmU2VyaWFsU2lnbmFsX1JJKTsKKworCWlmIChkZWx0YSAmIFNlcmlhbFNpZ25hbF9EQ0QpCisJCXN0YXR1cyB8PSBNSVNDU1RBVFVTX0RDRF9MQVRDSEVEfChpbmZvLT5zZXJpYWxfc2lnbmFscyZTZXJpYWxTaWduYWxfRENEKTsKKworCWlmIChkZWx0YSAmIFNlcmlhbFNpZ25hbF9DVFMpCisJCXN0YXR1cyB8PSBNSVNDU1RBVFVTX0NUU19MQVRDSEVEfChpbmZvLT5zZXJpYWxfc2lnbmFscyZTZXJpYWxTaWduYWxfQ1RTKTsKKworCWlmIChzdGF0dXMpCisJCWlzcl9pb19waW4oaW5mbyxzdGF0dXMpOworCisJaW5mby0+c3RhdHVzX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbmZvOworCWluZm8tPnN0YXR1c190aW1lci5mdW5jdGlvbiA9IHN0YXR1c190aW1lb3V0OworCWluZm8tPnN0YXR1c190aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTApOworCWFkZF90aW1lcigmaW5mby0+c3RhdHVzX3RpbWVyKTsKK30KKworCisvKiBSZWdpc3RlciBBY2Nlc3MgUm91dGluZXMgLQorICogQWxsIHJlZ2lzdGVycyBhcmUgbWVtb3J5IG1hcHBlZAorICovCisjZGVmaW5lIENBTENfUkVHQUREUigpIFwKKwl1bnNpZ25lZCBjaGFyICogUmVnQWRkciA9ICh1bnNpZ25lZCBjaGFyKikoaW5mby0+c2NhX2Jhc2UgKyBBZGRyKTsgXAorCWlmIChpbmZvLT5wb3J0X251bSA+IDEpIFwKKwkJUmVnQWRkciArPSAyNTY7CSAgICAJCS8qIHBvcnQgMC0xIFNDQTAsIDItMyBTQ0ExICovIFwKKwlpZiAoIGluZm8tPnBvcnRfbnVtICYgMSkgeyBcCisJCWlmIChBZGRyID4gMHg3ZikgXAorCQkJUmVnQWRkciArPSAweDQwOwkvKiBETUEgYWNjZXNzICovIFwKKwkJZWxzZSBpZiAoQWRkciA+IDB4MWYgJiYgQWRkciA8IDB4NjApIFwKKwkJCVJlZ0FkZHIgKz0gMHgyMDsJLyogTVNDSSBhY2Nlc3MgKi8gXAorCX0KKworCit1bnNpZ25lZCBjaGFyIHJlYWRfcmVnKFNMTVBfSU5GTyAqIGluZm8sIHVuc2lnbmVkIGNoYXIgQWRkcikKK3sKKwlDQUxDX1JFR0FERFIoKTsKKwlyZXR1cm4gKlJlZ0FkZHI7Cit9Cit2b2lkIHdyaXRlX3JlZyhTTE1QX0lORk8gKiBpbmZvLCB1bnNpZ25lZCBjaGFyIEFkZHIsIHVuc2lnbmVkIGNoYXIgVmFsdWUpCit7CisJQ0FMQ19SRUdBRERSKCk7CisJKlJlZ0FkZHIgPSBWYWx1ZTsKK30KKwordTE2IHJlYWRfcmVnMTYoU0xNUF9JTkZPICogaW5mbywgdW5zaWduZWQgY2hhciBBZGRyKQoreworCUNBTENfUkVHQUREUigpOworCXJldHVybiAqKCh1MTYgKilSZWdBZGRyKTsKK30KKwordm9pZCB3cml0ZV9yZWcxNihTTE1QX0lORk8gKiBpbmZvLCB1bnNpZ25lZCBjaGFyIEFkZHIsIHUxNiBWYWx1ZSkKK3sKKwlDQUxDX1JFR0FERFIoKTsKKwkqKCh1MTYgKilSZWdBZGRyKSA9IFZhbHVlOworfQorCit1bnNpZ25lZCBjaGFyIHJlYWRfc3RhdHVzX3JlZyhTTE1QX0lORk8gKiBpbmZvKQoreworCXVuc2lnbmVkIGNoYXIgKlJlZ0FkZHIgPSAodW5zaWduZWQgY2hhciAqKWluZm8tPnN0YXRjdHJsX2Jhc2U7CisJcmV0dXJuICpSZWdBZGRyOworfQorCit2b2lkIHdyaXRlX2NvbnRyb2xfcmVnKFNMTVBfSU5GTyAqIGluZm8pCit7CisJdW5zaWduZWQgY2hhciAqUmVnQWRkciA9ICh1bnNpZ25lZCBjaGFyICopaW5mby0+c3RhdGN0cmxfYmFzZTsKKwkqUmVnQWRkciA9IGluZm8tPnBvcnRfYXJyYXlbMF0tPmN0cmxyZWdfdmFsdWU7Cit9CisKKworc3RhdGljIGludCBfX2RldmluaXQgc3luY2xpbmttcF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXYpKSB7CisJCXByaW50aygiZXJyb3IgZW5hYmxpbmcgcGNpIGRldmljZSAlcFxuIiwgZGV2KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWRldmljZV9pbml0KCArK3N5bmNsaW5rbXBfYWRhcHRlcl9jb3VudCwgZGV2ICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzeW5jbGlua21wX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3lzcnEuYyBiL2RyaXZlcnMvY2hhci9zeXNycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OWY3Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc3lzcnEuYwpAQCAtMCwwICsxLDQzMiBAQAorLyogLSotIGxpbnV4LWMgLSotCisgKgorICoJJElkOiBzeXNycS5jLHYgMS4xNSAxOTk4LzA4LzIzIDE0OjU2OjQxIG1qIEV4cCAkCisgKgorICoJTGludXggTWFnaWMgU3lzdGVtIFJlcXVlc3QgS2V5IEhhY2tzCisgKgorICoJKGMpIDE5OTcgTWFydGluIE1hcmVzIDxtakBhdHJleS5rYXJsaW4ubWZmLmN1bmkuY3o+CisgKgliYXNlZCBvbiBpZGVhcyBieSBQYXZlbCBNYWNoZWsgPHBhdmVsQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej4KKyAqCisgKgkoYykgMjAwMCBDcnV0Y2hlciBEdW5uYXZhbnQgPGNydXRjaGVyK2tlcm5lbEBkYXRhc3RhY2tzLmNvbT4KKyAqCW92ZXJoYXVsZWQgdG8gdXNlIGtleSByZWdpc3RyYXRpb24KKyAqCWJhc2VkIHVwb24gZGlzY3VzaW9ucyBpbiBpcmM6Ly9pcmMub3BlbnByb2plY3RzLm5ldC8ja2VybmVsbmV3YmllcworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rYmRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4JCS8qIGZvciBmc3luY19iZGV2KCkgKi8KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisKKy8qIFdoZXRoZXIgd2UgcmVhY3Qgb24gc3lzcnEga2V5cyBvciBqdXN0IGlnbm9yZSB0aGVtICovCitpbnQgc3lzcnFfZW5hYmxlZCA9IDE7CisKKy8qIExvZ2xldmVsIHN5c3JxIGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIHN5c3JxX2hhbmRsZV9sb2dsZXZlbChpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncywKKwkJCQkgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAoreworCWludCBpOworCWkgPSBrZXkgLSAnMCc7CisJY29uc29sZV9sb2dsZXZlbCA9IDc7CisJcHJpbnRrKCJMb2dsZXZlbCBzZXQgdG8gJWRcbiIsIGkpOworCWNvbnNvbGVfbG9nbGV2ZWwgPSBpOworfQkKK3N0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX2xvZ2xldmVsX29wID0geworCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX2xvZ2xldmVsLAorCS5oZWxwX21zZwk9ICJsb2dsZXZlbDAtOCIsCisJLmFjdGlvbl9tc2cJPSAiQ2hhbmdpbmcgTG9nbGV2ZWwiLAorCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9MT0csCit9OworCisKKy8qIFNBSyBzeXNycSBoYW5kbGVyICovCisjaWZkZWYgQ09ORklHX1ZUCitzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfU0FLKGludCBrZXksIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzLAorCQkJICAgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwlpZiAodHR5KQorCQlkb19TQUsodHR5KTsKKwlyZXNldF92Yyh2Y19jb25zW2ZnX2NvbnNvbGVdLmQpOworfQorc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfU0FLX29wID0geworCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX1NBSywKKwkuaGVscF9tc2cJPSAic2FLIiwKKwkuYWN0aW9uX21zZwk9ICJTQUsiLAorCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9LRVlCT0FSRCwKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19WVAorLyogdW5yYXcgc3lzcnEgaGFuZGxlciAqLworc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX3VucmF3KGludCBrZXksIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzLAorCQkJICAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAoreworCXN0cnVjdCBrYmRfc3RydWN0ICprYmQgPSAma2JkX3RhYmxlW2ZnX2NvbnNvbGVdOworCisJaWYgKGtiZCkKKwkJa2JkLT5rYmRtb2RlID0gVkNfWExBVEU7Cit9CitzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV91bnJhd19vcCA9IHsKKwkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV91bnJhdywKKwkuaGVscF9tc2cJPSAidW5SYXciLAorCS5hY3Rpb25fbXNnCT0gIktleWJvYXJkIG1vZGUgc2V0IHRvIFhMQVRFIiwKKwkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfS0VZQk9BUkQsCit9OworI2VuZGlmIC8qIENPTkZJR19WVCAqLworCisvKiByZWJvb3Qgc3lzcnEgaGFuZGxlciAqLworc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX3JlYm9vdChpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncywKKwkJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJbWFjaGluZV9yZXN0YXJ0KE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9yZWJvb3Rfb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfcmVib290LAorCS5oZWxwX21zZwk9ICJyZUJvb3QiLAorCS5hY3Rpb25fbXNnCT0gIlJlc2V0dGluZyIsCisJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0JPT1QsCit9OworCitzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfc3luYyhpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncywKKwkJCSAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAoreworCWVtZXJnZW5jeV9zeW5jKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3N5bmNfb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc3luYywKKwkuaGVscF9tc2cJPSAiU3luYyIsCisJLmFjdGlvbl9tc2cJPSAiRW1lcmdlbmN5IFN5bmMiLAorCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9TWU5DLAorfTsKKworc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX21vdW50cm8oaW50IGtleSwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MsCisJCQkJIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAoreworCWVtZXJnZW5jeV9yZW1vdW50KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX21vdW50cm9fb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfbW91bnRybywKKwkuaGVscF9tc2cJPSAiVW5tb3VudCIsCisJLmFjdGlvbl9tc2cJPSAiRW1lcmdlbmN5IFJlbW91bnQgUi9PIiwKKwkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfUkVNT1VOVCwKK307CisKKy8qIEVORCBTWU5DIFNZU1JRIEhBTkRMRVJTIEJMT0NLICovCisKKworLyogU0hPVyBTWVNSUSBIQU5ETEVSUyBCTE9DSyAqLworCitzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfc2hvd3JlZ3MoaW50IGtleSwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MsCisJCQkJICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwlpZiAocHRfcmVncykKKwkJc2hvd19yZWdzKHB0X3JlZ3MpOworfQorc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfc2hvd3JlZ3Nfb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd3JlZ3MsCisJLmhlbHBfbXNnCT0gInNob3dQYyIsCisJLmFjdGlvbl9tc2cJPSAiU2hvdyBSZWdzIiwKKwkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfRFVNUCwKK307CisKKworc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX3Nob3dzdGF0ZShpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncywKKwkJCQkgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwlzaG93X3N0YXRlKCk7Cit9CitzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9zaG93c3RhdGVfb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd3N0YXRlLAorCS5oZWxwX21zZwk9ICJzaG93VGFza3MiLAorCS5hY3Rpb25fbXNnCT0gIlNob3cgU3RhdGUiLAorCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9EVU1QLAorfTsKKworCitzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfc2hvd21lbShpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncywKKwkJCQkgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkgCit7CisJc2hvd19tZW0oKTsKK30KK3N0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3Nob3dtZW1fb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd21lbSwKKwkuaGVscF9tc2cJPSAic2hvd01lbSIsCisJLmFjdGlvbl9tc2cJPSAiU2hvdyBNZW1vcnkiLAorCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9EVU1QLAorfTsKKworLyogU0hPVyBTWVNSUSBIQU5ETEVSUyBCTE9DSyAqLworCisKKy8qIFNJR05BTCBTWVNSUSBIQU5ETEVSUyBCTE9DSyAqLworCisvKiBzaWduYWwgc3lzcnEgaGVscGVyIGZ1bmN0aW9uCisgKiBTZW5kcyBhIHNpZ25hbCB0byBhbGwgdXNlciBwcm9jZXNzZXMgKi8KK3N0YXRpYyB2b2lkIHNlbmRfc2lnX2FsbChpbnQgc2lnKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKworCWZvcl9lYWNoX3Byb2Nlc3MocCkgeworCQlpZiAocC0+bW0gJiYgcC0+cGlkICE9IDEpCisJCQkvKiBOb3Qgc3dhcHBlciwgaW5pdCBub3Iga2VybmVsIHRocmVhZCAqLworCQkJZm9yY2Vfc2lnKHNpZywgcCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfdGVybShpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncywKKwkJCSAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAoreworCXNlbmRfc2lnX2FsbChTSUdURVJNKTsKKwljb25zb2xlX2xvZ2xldmVsID0gODsKK30KK3N0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3Rlcm1fb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfdGVybSwKKwkuaGVscF9tc2cJPSAidEVybSIsCisJLmFjdGlvbl9tc2cJPSAiVGVybWluYXRlIEFsbCBUYXNrcyIsCisJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NJR05BTCwKK307CisKK3N0YXRpYyB2b2lkIG1vb21fY2FsbGJhY2sodm9pZCAqaWdub3JlZCkKK3sKKwlvdXRfb2ZfbWVtb3J5KEdGUF9LRVJORUwpOworfQorCitzdGF0aWMgREVDTEFSRV9XT1JLKG1vb21fd29yaywgbW9vbV9jYWxsYmFjaywgTlVMTCk7CisKK3N0YXRpYyB2b2lkIHN5c3JxX2hhbmRsZV9tb29tKGludCBrZXksIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzLAorCQkJICAgICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzY2hlZHVsZV93b3JrKCZtb29tX3dvcmspOworfQorc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfbW9vbV9vcCA9IHsKKwkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV9tb29tLAorCS5oZWxwX21zZwk9ICJGdWxsIiwKKwkuYWN0aW9uX21zZwk9ICJNYW51YWwgT09NIGV4ZWN1dGlvbiIsCit9OworCitzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfa2lsbChpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncywKKwkJCSAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAoreworCXNlbmRfc2lnX2FsbChTSUdLSUxMKTsKKwljb25zb2xlX2xvZ2xldmVsID0gODsKK30KK3N0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX2tpbGxfb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfa2lsbCwKKwkuaGVscF9tc2cJPSAia0lsbCIsCisJLmFjdGlvbl9tc2cJPSAiS2lsbCBBbGwgVGFza3MiLAorCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9TSUdOQUwsCit9OworCisvKiBFTkQgU0lHTkFMIFNZU1JRIEhBTkRMRVJTIEJMT0NLICovCisKK3N0YXRpYyB2b2lkIHN5c3JxX2hhbmRsZV91bnJ0KGludCBrZXksIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzLAorCQkJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJbm9ybWFsaXplX3J0X3Rhc2tzKCk7Cit9CitzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV91bnJ0X29wID0geworCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3VucnQsCisJLmhlbHBfbXNnCT0gIk5pY2UiLAorCS5hY3Rpb25fbXNnCT0gIk5pY2UgQWxsIFJUIFRhc2tzIiwKKwkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfUlROSUNFLAorfTsKKworLyogS2V5IE9wZXJhdGlvbnMgdGFibGUgYW5kIGxvY2sgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3lzcnFfa2V5X3RhYmxlX2xvY2spOworI2RlZmluZSBTWVNSUV9LRVlfVEFCTEVfTEVOR1RIIDM2CitzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCAqc3lzcnFfa2V5X3RhYmxlW1NZU1JRX0tFWV9UQUJMRV9MRU5HVEhdID0geworLyogMCAqLwkmc3lzcnFfbG9nbGV2ZWxfb3AsCisvKiAxICovCSZzeXNycV9sb2dsZXZlbF9vcCwKKy8qIDIgKi8JJnN5c3JxX2xvZ2xldmVsX29wLAorLyogMyAqLwkmc3lzcnFfbG9nbGV2ZWxfb3AsCisvKiA0ICovCSZzeXNycV9sb2dsZXZlbF9vcCwKKy8qIDUgKi8JJnN5c3JxX2xvZ2xldmVsX29wLAorLyogNiAqLwkmc3lzcnFfbG9nbGV2ZWxfb3AsCisvKiA3ICovCSZzeXNycV9sb2dsZXZlbF9vcCwKKy8qIDggKi8JJnN5c3JxX2xvZ2xldmVsX29wLAorLyogOSAqLwkmc3lzcnFfbG9nbGV2ZWxfb3AsCisvKiBhICovCU5VTEwsIC8qIERvbid0IHVzZSBmb3Igc3lzdGVtIHByb3ZpZGVkIHN5c3JxcywKKwkJIGl0IGlzIGhhbmRsZWQgc3BlY2lhbGx5IG9uIHRoZSBzcGFyYworCQkgYW5kIHdpbGwgbmV2ZXIgYXJyaXZlICovCisvKiBiICovCSZzeXNycV9yZWJvb3Rfb3AsCisvKiBjICovIE5VTEwsCisvKiBkICovCU5VTEwsCisvKiBlICovCSZzeXNycV90ZXJtX29wLAorLyogZiAqLwkmc3lzcnFfbW9vbV9vcCwKKy8qIGcgKi8JTlVMTCwKKy8qIGggKi8JTlVMTCwKKy8qIGkgKi8JJnN5c3JxX2tpbGxfb3AsCisvKiBqICovCU5VTEwsCisjaWZkZWYgQ09ORklHX1ZUCisvKiBrICovCSZzeXNycV9TQUtfb3AsCisjZWxzZQorLyogayAqLwlOVUxMLAorI2VuZGlmCisvKiBsICovCU5VTEwsCisvKiBtICovCSZzeXNycV9zaG93bWVtX29wLAorLyogbiAqLwkmc3lzcnFfdW5ydF9vcCwKKy8qIG8gKi8JTlVMTCwgLyogVGhpcyB3aWxsIG9mdGVuIGJlIHJlZ2lzdGVyZWQKKwkJIGFzICdPZmYnIGF0IGluaXQgdGltZSAqLworLyogcCAqLwkmc3lzcnFfc2hvd3JlZ3Nfb3AsCisvKiBxICovCU5VTEwsCisjaWZkZWYgQ09ORklHX1ZUCisvKiByICovCSZzeXNycV91bnJhd19vcCwKKyNlbHNlCisvKiByICovIE5VTEwsCisjZW5kaWYKKy8qIHMgKi8JJnN5c3JxX3N5bmNfb3AsCisvKiB0ICovCSZzeXNycV9zaG93c3RhdGVfb3AsCisvKiB1ICovCSZzeXNycV9tb3VudHJvX29wLAorLyogdiAqLwlOVUxMLCAvKiBNYXkgYmUgYXNzaWduZWQgYXQgaW5pdCB0aW1lIGJ5IFNNUCBWT1lBR0VSICovCisvKiB3ICovCU5VTEwsCisvKiB4ICovCU5VTEwsCisvKiB5ICovCU5VTEwsCisvKiB6ICovCU5VTEwKK307CisKKy8qIGtleTJpbmRleCBjYWxjdWxhdGlvbiwgLTEgb24gaW52YWxpZCBpbmRleCAqLworc3RhdGljIGludCBzeXNycV9rZXlfdGFibGVfa2V5MmluZGV4KGludCBrZXkpIHsKKwlpbnQgcmV0dmFsOworCWlmICgoa2V5ID49ICcwJykgJiYgKGtleSA8PSAnOScpKSB7CisJCXJldHZhbCA9IGtleSAtICcwJzsKKwl9IGVsc2UgaWYgKChrZXkgPj0gJ2EnKSAmJiAoa2V5IDw9ICd6JykpIHsKKwkJcmV0dmFsID0ga2V5ICsgMTAgLSAnYSc7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gLTE7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBnZXQgYW5kIHB1dCBmdW5jdGlvbnMgZm9yIHRoZSB0YWJsZSwgZXhwb3NlZCB0byBtb2R1bGVzLgorICovCisKK3N0cnVjdCBzeXNycV9rZXlfb3AgKl9fc3lzcnFfZ2V0X2tleV9vcCAoaW50IGtleSkgeworICAgICAgICBzdHJ1Y3Qgc3lzcnFfa2V5X29wICpvcF9wOworICAgICAgICBpbnQgaTsKKwkKKwlpID0gc3lzcnFfa2V5X3RhYmxlX2tleTJpbmRleChrZXkpOworICAgICAgICBvcF9wID0gKGkgPT0gLTEpID8gTlVMTCA6IHN5c3JxX2tleV90YWJsZVtpXTsKKyAgICAgICAgcmV0dXJuIG9wX3A7Cit9CisKK3ZvaWQgX19zeXNycV9wdXRfa2V5X29wIChpbnQga2V5LCBzdHJ1Y3Qgc3lzcnFfa2V5X29wICpvcF9wKSB7CisgICAgICAgIGludCBpOworCisJaSA9IHN5c3JxX2tleV90YWJsZV9rZXkyaW5kZXgoa2V5KTsKKyAgICAgICAgaWYgKGkgIT0gLTEpCisgICAgICAgICAgICAgICAgc3lzcnFfa2V5X3RhYmxlW2ldID0gb3BfcDsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIG5vbi1sb2NraW5nIHZlcnNpb24gb2YgaGFuZGxlX3N5c3JxCisgKiBJdCBtdXN0L2NhbiBvbmx5IGJlIGNhbGxlZCBieSBzeXNycSBrZXkgaGFuZGxlcnMsCisgKiBhcyB0aGV5IGFyZSBpbnNpZGUgb2YgdGhlIGxvY2sKKyAqLworCit2b2lkIF9faGFuZGxlX3N5c3JxKGludCBrZXksIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgY2hlY2tfbWFzaykKK3sKKwlzdHJ1Y3Qgc3lzcnFfa2V5X29wICpvcF9wOworCWludCBvcmlnX2xvZ19sZXZlbDsKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5c3JxX2tleV90YWJsZV9sb2NrLCBmbGFncyk7CisJb3JpZ19sb2dfbGV2ZWwgPSBjb25zb2xlX2xvZ2xldmVsOworCWNvbnNvbGVfbG9nbGV2ZWwgPSA3OworCXByaW50ayhLRVJOX0lORk8gIlN5c1JxIDogIik7CisKKyAgICAgICAgb3BfcCA9IF9fc3lzcnFfZ2V0X2tleV9vcChrZXkpOworICAgICAgICBpZiAob3BfcCkgeworCQkvKiBTaG91bGQgd2UgY2hlY2sgZm9yIGVuYWJsZWQgb3BlcmF0aW9ucyAoL3Byb2Mvc3lzcnEtdHJpZ2dlciBzaG91bGQgbm90KQorCQkgKiBhbmQgaXMgdGhlIGludm9rZWQgb3BlcmF0aW9uIGVuYWJsZWQ/ICovCisJCWlmICghY2hlY2tfbWFzayB8fCBzeXNycV9lbmFibGVkID09IDEgfHwKKwkJICAgIChzeXNycV9lbmFibGVkICYgb3BfcC0+ZW5hYmxlX21hc2spKSB7CisJCQlwcmludGsgKCIlc1xuIiwgb3BfcC0+YWN0aW9uX21zZyk7CisJCQljb25zb2xlX2xvZ2xldmVsID0gb3JpZ19sb2dfbGV2ZWw7CisJCQlvcF9wLT5oYW5kbGVyKGtleSwgcHRfcmVncywgdHR5KTsKKwkJfQorCQllbHNlCisJCQlwcmludGsoIlRoaXMgc3lzcnEgb3BlcmF0aW9uIGlzIGRpc2FibGVkLlxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJIRUxQIDogIik7CisJCS8qIE9ubHkgcHJpbnQgdGhlIGhlbHAgbXNnIG9uY2UgcGVyIGhhbmRsZXIgKi8KKwkJZm9yIChpPTA7IGk8U1lTUlFfS0VZX1RBQkxFX0xFTkdUSDsgaSsrKSAKKwkJaWYgKHN5c3JxX2tleV90YWJsZVtpXSkgeworCQkJZm9yIChqPTA7IHN5c3JxX2tleV90YWJsZVtpXSAhPSBzeXNycV9rZXlfdGFibGVbal07IGorKyk7CisJCQlpZiAoaiA9PSBpKQorCQkJCXByaW50ayAoIiVzICIsIHN5c3JxX2tleV90YWJsZVtpXS0+aGVscF9tc2cpOworCQl9CisJCXByaW50ayAoIlxuIik7CisJCWNvbnNvbGVfbG9nbGV2ZWwgPSBvcmlnX2xvZ19sZXZlbDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3lzcnFfa2V5X3RhYmxlX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBrZXlib2FyZCBoYW5kbGVyIHdoZW4gU3lzUnEgaXMgcHJlc3NlZAorICogYW5kIGFueSBvdGhlciBrZXljb2RlIGFycml2ZXMuCisgKi8KKwordm9pZCBoYW5kbGVfc3lzcnEoaW50IGtleSwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaWYgKCFzeXNycV9lbmFibGVkKQorCQlyZXR1cm47CisJX19oYW5kbGVfc3lzcnEoa2V5LCBwdF9yZWdzLCB0dHksIDEpOworfQorCitpbnQgX19zeXNycV9zd2FwX2tleV9vcHMoaW50IGtleSwgc3RydWN0IHN5c3JxX2tleV9vcCAqaW5zZXJ0X29wX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeXNycV9rZXlfb3AgKnJlbW92ZV9vcF9wKSB7CisKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3lzcnFfa2V5X3RhYmxlX2xvY2ssIGZsYWdzKTsKKwlpZiAoX19zeXNycV9nZXRfa2V5X29wKGtleSkgPT0gcmVtb3ZlX29wX3ApIHsKKwkJX19zeXNycV9wdXRfa2V5X29wKGtleSwgaW5zZXJ0X29wX3ApOworCQlyZXR2YWwgPSAwOworCX0gZWxzZSB7CisJCXJldHZhbCA9IC0xOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeXNycV9rZXlfdGFibGVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IHJlZ2lzdGVyX3N5c3JxX2tleShpbnQga2V5LCBzdHJ1Y3Qgc3lzcnFfa2V5X29wICpvcF9wKQoreworCXJldHVybiBfX3N5c3JxX3N3YXBfa2V5X29wcyhrZXksIG9wX3AsIE5VTEwpOworfQorCitpbnQgdW5yZWdpc3Rlcl9zeXNycV9rZXkoaW50IGtleSwgc3RydWN0IHN5c3JxX2tleV9vcCAqb3BfcCkKK3sKKwlyZXR1cm4gX19zeXNycV9zd2FwX2tleV9vcHMoa2V5LCBOVUxMLCBvcF9wKTsKK30KKworRVhQT1JUX1NZTUJPTChoYW5kbGVfc3lzcnEpOworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9zeXNycV9rZXkpOworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3N5c3JxX2tleSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdGIwMjE5LmMgYi9kcml2ZXJzL2NoYXIvdGIwMjE5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxM2YyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci90YjAyMTkuYwpAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqICBEcml2ZXIgZm9yIFRBTkJBQyBUQjAyMTkgYmFzZSBib2FyZC4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcmVib290Lmg+CisKK01PRFVMRV9BVVRIT1IoIllvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRBTkJBQyBUQjAyMTkgYmFzZSBib2FyZCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBtYWpvcjsJLyogZGVmYXVsdCBpcyBkeW5hbWljIG1ham9yIGRldmljZSBudW1iZXIgKi8KK21vZHVsZV9wYXJhbShtYWpvciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWFqb3IsICJNYWpvciBkZXZpY2UgbnVtYmVyIik7CisKK3N0YXRpYyB2b2lkICgqb2xkX21hY2hpbmVfcmVzdGFydCkoY2hhciAqY29tbWFuZCk7CitzdGF0aWMgdm9pZCBfX2lvbWVtICp0YjAyMTlfYmFzZTsKK3N0YXRpYyBzcGlubG9ja190IHRiMDIxOV9sb2NrOworCisjZGVmaW5lIHRiMDIxOV9yZWFkKG9mZnNldCkJCXJlYWR3KHRiMDIxOV9iYXNlICsgKG9mZnNldCkpCisjZGVmaW5lIHRiMDIxOV93cml0ZShvZmZzZXQsIHZhbHVlKQl3cml0ZXcoKHZhbHVlKSwgdGIwMjE5X2Jhc2UgKyAob2Zmc2V0KSkKKworI2RlZmluZSBUQjAyMTlfU1RBUlQJMHgwYTAwMDAwMFVMCisjZGVmaW5lIFRCMDIxOV9TSVpFCTB4MjBVTAorCisjZGVmaW5lIFRCMDIxOV9MRUQJCQkweDAwCisjZGVmaW5lIFRCMDIxOV9HUElPX0lOUFVUCQkweDAyCisjZGVmaW5lIFRCMDIxOV9HUElPX09VVFBVVAkJMHgwNAorI2RlZmluZSBUQjAyMTlfRElQX1NXSVRDSAkJMHgwNgorI2RlZmluZSBUQjAyMTlfTUlTQwkJCTB4MDgKKyNkZWZpbmUgVEIwMjE5X1JFU0VUCQkJMHgwZQorI2RlZmluZSBUQjAyMTlfUENJX1NMT1QxX0lSUV9TVEFUVVMJMHgxMAorI2RlZmluZSBUQjAyMTlfUENJX1NMT1QyX0lSUV9TVEFUVVMJMHgxMgorI2RlZmluZSBUQjAyMTlfUENJX1NMT1QzX0lSUV9TVEFUVVMJMHgxNAorCit0eXBlZGVmIGVudW0geworCVRZUEVfTEVELAorCVRZUEVfR1BJT19PVVRQVVQsCit9IHRiMDIxOV90eXBlX3Q7CisKKy8qCisgKiBNaW5vciBkZXZpY2UgbnVtYmVyCisgKgkgMCA9IDcgc2VnbWVudCBMRUQKKyAqCisgKgkxNiA9IEdQSU8gSU4gMAorICoJMTcgPSBHUElPIElOIDEKKyAqCTE4ID0gR1BJTyBJTiAyCisgKgkxOSA9IEdQSU8gSU4gMworICoJMjAgPSBHUElPIElOIDQKKyAqCTIxID0gR1BJTyBJTiA1CisgKgkyMiA9IEdQSU8gSU4gNgorICoJMjMgPSBHUElPIElOIDcKKyAqCisgKgkzMiA9IEdQSU8gT1VUIDAKKyAqCTMzID0gR1BJTyBPVVQgMQorICoJMzQgPSBHUElPIE9VVCAyCisgKgkzNSA9IEdQSU8gT1VUIDMKKyAqCTM2ID0gR1BJTyBPVVQgNAorICoJMzcgPSBHUElPIE9VVCA1CisgKgkzOCA9IEdQSU8gT1VUIDYKKyAqCTM5ID0gR1BJTyBPVVQgNworICoKKyAqCTQ4ID0gRElQIHN3aXRjaCAxCisgKgk0OSA9IERJUCBzd2l0Y2ggMgorICoJNTAgPSBESVAgc3dpdGNoIDMKKyAqCTUxID0gRElQIHN3aXRjaCA0CisgKgk1MiA9IERJUCBzd2l0Y2ggNQorICoJNTMgPSBESVAgc3dpdGNoIDYKKyAqCTU0ID0gRElQIHN3aXRjaCA3CisgKgk1NSA9IERJUCBzd2l0Y2ggOAorICovCisKK3N0YXRpYyBpbmxpbmUgY2hhciBnZXRfbGVkKHZvaWQpCit7CisJcmV0dXJuIChjaGFyKXRiMDIxOV9yZWFkKFRCMDIxOV9MRUQpOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgZ2V0X2dwaW9faW5wdXRfcGluKHVuc2lnbmVkIGludCBwaW4pCit7CisJdWludDE2X3QgdmFsdWVzOworCisJdmFsdWVzID0gdGIwMjE5X3JlYWQoVEIwMjE5X0dQSU9fSU5QVVQpOworCWlmICh2YWx1ZXMgJiAoMSA8PCBwaW4pKQorCQlyZXR1cm4gJzEnOworCisJcmV0dXJuICcwJzsKK30KKworc3RhdGljIGlubGluZSBjaGFyIGdldF9ncGlvX291dHB1dF9waW4odW5zaWduZWQgaW50IHBpbikKK3sKKwl1aW50MTZfdCB2YWx1ZXM7CisKKwl2YWx1ZXMgPSB0YjAyMTlfcmVhZChUQjAyMTlfR1BJT19PVVRQVVQpOworCWlmICh2YWx1ZXMgJiAoMSA8PCBwaW4pKQorCQlyZXR1cm4gJzEnOworCisJcmV0dXJuICcwJzsKK30KKworc3RhdGljIGlubGluZSBjaGFyIGdldF9kaXBfc3dpdGNoKHVuc2lnbmVkIGludCBwaW4pCit7CisJdWludDE2X3QgdmFsdWVzOworCisJdmFsdWVzID0gdGIwMjE5X3JlYWQoVEIwMjE5X0RJUF9TV0lUQ0gpOworCWlmICh2YWx1ZXMgJiAoMSA8PCBwaW4pKQorCQlyZXR1cm4gJzEnOworCisJcmV0dXJuICcwJzsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2V0X2xlZChjaGFyIGNvbW1hbmQpCit7CisJdGIwMjE5X3dyaXRlKFRCMDIxOV9MRUQsIGNvbW1hbmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNldF9ncGlvX291dHB1dF9waW4odW5zaWduZWQgaW50IHBpbiwgY2hhciBjb21tYW5kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDE2X3QgdmFsdWU7CisKKwlpZiAoY29tbWFuZCAhPSAnMCcgJiYgY29tbWFuZCAhPSAnMScpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRiMDIxOV9sb2NrLCBmbGFncyk7CisJdmFsdWUgPSB0YjAyMTlfcmVhZChUQjAyMTlfR1BJT19PVVRQVVQpOworCWlmIChjb21tYW5kID09ICcwJykKKwkJdmFsdWUgJj0gfigxIDw8IHBpbik7CisJZWxzZQorCQl2YWx1ZSB8PSAxIDw8IHBpbjsKKwl0YjAyMTlfd3JpdGUoVEIwMjE5X0dQSU9fT1VUUFVULCB2YWx1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGIwMjE5X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBzc2l6ZV90IHRhbmJhY190YjAyMTlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgaW50IG1pbm9yOworCWNoYXIgdmFsdWU7CisKKwltaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3dpdGNoIChtaW5vcikgeworCWNhc2UgMDoKKwkJdmFsdWUgPSBnZXRfbGVkKCk7CisJCWJyZWFrOworCWNhc2UgMTYgLi4uIDIzOgorCQl2YWx1ZSA9IGdldF9ncGlvX2lucHV0X3BpbihtaW5vciAtIDE2KTsKKwkJYnJlYWs7CisJY2FzZSAzMiAuLi4gMzk6CisJCXZhbHVlID0gZ2V0X2dwaW9fb3V0cHV0X3BpbihtaW5vciAtIDMyKTsKKwkJYnJlYWs7CisJY2FzZSA0OCAuLi4gNTU6CisJCXZhbHVlID0gZ2V0X2RpcF9zd2l0Y2gobWlub3IgLSA0OCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUJBREY7CisJfQorCisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChwdXRfdXNlcih2YWx1ZSwgYnVmKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHNzaXplX3QgdGFuYmFjX3RiMDIxOV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3I7CisJdGIwMjE5X3R5cGVfdCB0eXBlOworCXNpemVfdCBpOworCWludCByZXR2YWwgPSAwOworCWNoYXIgYzsKKworCW1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzd2l0Y2ggKG1pbm9yKSB7CisJY2FzZSAwOgorCQl0eXBlID0gVFlQRV9MRUQ7CisJCWJyZWFrOworCWNhc2UgMzIgLi4uIDM5OgorCQl0eXBlID0gVFlQRV9HUElPX09VVFBVVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FQkFERjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKGdldF91c2VyKGMsIGRhdGEgKyBpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFRZUEVfTEVEOgorCQkJcmV0dmFsID0gc2V0X2xlZChjKTsKKwkJCWJyZWFrOworCQljYXNlIFRZUEVfR1BJT19PVVRQVVQ6CisJCQlyZXR2YWwgPSBzZXRfZ3Bpb19vdXRwdXRfcGluKG1pbm9yIC0gMzIsIGMpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IHRhbmJhY190YjAyMTlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3I7CisKKwltaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3dpdGNoIChtaW5vcikgeworCWNhc2UgMDoKKwljYXNlIDE2IC4uLiAyMzoKKwljYXNlIDMyIC4uLiAzOToKKwljYXNlIDQ4IC4uLiA1NToKKwkJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRUJBREY7Cit9CisKK3N0YXRpYyBpbnQgdGFuYmFjX3RiMDIxOV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0YjAyMTlfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJCT0gdGFuYmFjX3RiMDIxOV9yZWFkLAorCS53cml0ZQkJPSB0YW5iYWNfdGIwMjE5X3dyaXRlLAorCS5vcGVuCQk9IHRhbmJhY190YjAyMTlfb3BlbiwKKwkucmVsZWFzZQk9IHRhbmJhY190YjAyMTlfcmVsZWFzZSwKK307CisKK3N0YXRpYyB2b2lkIHRiMDIxOV9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpCit7CisJdGIwMjE5X3dyaXRlKFRCMDIxOV9SRVNFVCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdGIwMjE5X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihUQjAyMTlfU1RBUlQsIFRCMDIxOV9TSVpFLCAiVEIwMjE5IikgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXRiMDIxOV9iYXNlID0gaW9yZW1hcChUQjAyMTlfU1RBUlQsIFRCMDIxOV9TSVpFKTsKKwlpZiAodGIwMjE5X2Jhc2UgPT0gTlVMTCkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oVEIwMjE5X1NUQVJULCBUQjAyMTlfU0laRSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHZhbCA9IHJlZ2lzdGVyX2NocmRldihtYWpvciwgIlRCMDIxOSIsICZ0YjAyMTlfZm9wcyk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJaW91bm1hcCh0YjAyMTlfYmFzZSk7CisJCXRiMDIxOV9iYXNlID0gTlVMTDsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKFRCMDIxOV9TVEFSVCwgVEIwMjE5X1NJWkUpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXNwaW5fbG9ja19pbml0KCZ0YjAyMTlfbG9jayk7CisKKwlvbGRfbWFjaGluZV9yZXN0YXJ0ID0gX21hY2hpbmVfcmVzdGFydDsKKwlfbWFjaGluZV9yZXN0YXJ0ID0gdGIwMjE5X3Jlc3RhcnQ7CisKKwlpZiAobWFqb3IgPT0gMCkgeworCQltYWpvciA9IHJldHZhbDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVEIwMjE5OiBtYWpvciBudW1iZXIgJWRcbiIsIG1ham9yKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YjAyMTlfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlfbWFjaGluZV9yZXN0YXJ0ID0gb2xkX21hY2hpbmVfcmVzdGFydDsKKworCWlvdW5tYXAodGIwMjE5X2Jhc2UpOworCXRiMDIxOV9iYXNlID0gTlVMTDsKKworCXJlbGVhc2VfbWVtX3JlZ2lvbihUQjAyMTlfU1RBUlQsIFRCMDIxOV9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdGIwMjE5X3BsYXRmb3JtX2RldmljZTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHRiMDIxOV9kZXZpY2VfZHJpdmVyID0geworCS5uYW1lCQk9ICJUQjAyMTkiLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSB0YjAyMTlfcHJvYmUsCisJLnJlbW92ZQkJPSB0YjAyMTlfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgdGFuYmFjX3RiMDIxOV9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXRiMDIxOV9wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJUQjAyMTkiLCAtMSwgTlVMTCwgMCk7CisJaWYgKElTX0VSUih0YjAyMTlfcGxhdGZvcm1fZGV2aWNlKSkKKwkJcmV0dXJuIFBUUl9FUlIodGIwMjE5X3BsYXRmb3JtX2RldmljZSk7CisKKwlyZXR2YWwgPSBkcml2ZXJfcmVnaXN0ZXIoJnRiMDIxOV9kZXZpY2VfZHJpdmVyKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodGIwMjE5X3BsYXRmb3JtX2RldmljZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdGFuYmFjX3RiMDIxOV9leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnRiMDIxOV9kZXZpY2VfZHJpdmVyKTsKKworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHRiMDIxOV9wbGF0Zm9ybV9kZXZpY2UpOworfQorCittb2R1bGVfaW5pdCh0YW5iYWNfdGIwMjE5X2luaXQpOworbW9kdWxlX2V4aXQodGFuYmFjX3RiMDIxOV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90aXBhci5jIGIvZHJpdmVycy9jaGFyL3RpcGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1YmE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci90aXBhci5jCkBAIC0wLDAgKzEsNTY0IEBACisvKiBIZXkgRU1BQ1MgLSotIGxpbnV4LWMgLSotCisgKgorICogdGlwYXIgLSBsb3cgbGV2ZWwgZHJpdmVyIGZvciBoYW5kbGluZyBhIHBhcmFsbGVsIGxpbmsgY2FibGUgZGVzaWduZWQKKyAqIGZvciBUZXhhcyBJbnN0cnVtZW50cyBncmFwaGluZyBjYWxjdWxhdG9ycyAoaHR0cDovL2xwZy50aWNhbGMub3JnKS4KKyAqIEEgcGFydCBvZiB0aGUgVGlMUCBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAyLCBSb21haW4gTGlldmluIDxyb21zQGxwZy50aWNhbGMub3JnPgorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBWYXJpb3VzIGZpeGVzICYgY2xlYW4tdXAgZnJvbSB0aGUgTGludXggS2VybmVsIE1haWxpbmcgTGlzdAorICogKEFsYW4gQ294LCBSaWNoYXJkIEIuIEpvaG5zb24sIENocmlzdG9waCBIZWxsd2lnKS4KKyAqLworCisvKiBUaGlzIGRyaXZlciBzaG91bGQsIGluIHRoZW9yeSwgd29yayB3aXRoIGFueSBwYXJhbGxlbCBwb3J0IHRoYXQgaGFzIGFuCisgKiBhcHByb3ByaWF0ZSBsb3ctbGV2ZWwgZHJpdmVyOyBhbGwgSS9PIGlzIGRvbmUgdGhyb3VnaCB0aGUgcGFycG9ydAorICogYWJzdHJhY3Rpb24gbGF5ZXIuCisgKgorICogSWYgdGhpcyBkcml2ZXIgaXMgYnVpbHQgaW50byB0aGUga2VybmVsLCB5b3UgY2FuIGNvbmZpZ3VyZSBpdCB1c2luZyB0aGUKKyAqIGtlcm5lbCBjb21tYW5kLWxpbmUuICBGb3IgZXhhbXBsZToKKyAqCisgKiAgICAgIHRpcGFyPXRpbWVvdXQsZGVsYXkgICAgICAgKHNldCB0aW1lb3V0IGFuZCBkZWxheSkKKyAqCisgKiBJZiB0aGUgZHJpdmVyIGlzIGxvYWRlZCBhcyBhIG1vZHVsZSwgc2ltaWxhciBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZQorICogdXNpbmcgbW9kdWxlIHBhcmFtZXRlcnMuICBUaGUgZXF1aXZhbGVudCBvZiB0aGUgYWJvdmUgY29tbWFuZHMgd291bGQgYmU6CisgKgorICogICAgICAjIGluc21vZCB0aXBhciB0aW1lb3V0PTE1IGRlbGF5PTEwCisgKi8KKworLyogQ09NUEFUSUJJTElUWSBXSVRIIE9MRCBLRVJORUxTCisgKgorICogVXN1YWxseSwgcGFyYWxsZWwgY2FibGVzIHdlcmUgYm91bmQgdG8gcG9ydHMgYXQKKyAqIHBhcnRpY3VsYXIgSS9PIGFkZHJlc3NlcywgYXMgZm9sbG93czoKKyAqCisgKiAgICAgIHRpcGFyMCAgICAgICAgICAgICAweDM3OAorICogICAgICB0aXBhcjEgICAgICAgICAgICAgMHgyNzgKKyAqICAgICAgdGlwYXIyICAgICAgICAgICAgIDB4M2JjCisgKgorICoKKyAqIFRoaXMgZHJpdmVyLCBieSBkZWZhdWx0LCBiaW5kcyB0aXBhciBkZXZpY2VzIGFjY29yZGluZyB0byBwYXJwb3J0IGFuZAorICogdGhlIG1pbm9yIG51bWJlci4KKyAqCisgKi8KKyN1bmRlZiBERUJVRwkJCQkvKiBjaGFuZ2UgdG8gI2RlZmluZSB0byBnZXQgZGVidWdnaW5nCisJCQkJCSAqIG91dHB1dCAtIGZvciBwcl9kZWJ1ZygpICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CS8qIERldkZzIHN1cHBvcnQgKi8KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CQkvKiBPdXIgY29kZSBkZXBlbmQgb24gcGFycG9ydCAqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisvKgorICogVEkgZGVmaW5pdGlvbnMKKyAqLworI2luY2x1ZGUgPGxpbnV4L3RpY2FibGUuaD4KKworLyoKKyAqIFZlcnNpb24gSW5mb3JtYXRpb24KKyAqLworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMS4xOSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAgIlJvbWFpbiBMaWV2aW4gPHJvbXNAbHBnLnRpY2FsYy5vcmc+IgorI2RlZmluZSBEUklWRVJfREVTQyAgICAiRGV2aWNlIGRyaXZlciBmb3IgVEkvUEMgcGFyYWxsZWwgbGluayBjYWJsZXMiCisjZGVmaW5lIERSSVZFUl9MSUNFTlNFICJHUEwiCisKKyNkZWZpbmUgVkVSU0lPTih2ZXIscmVsLHNlcSkgKCgodmVyKTw8MTYpIHwgKChyZWwpPDw4KSB8IChzZXEpKQorCisvKiAtLS0tLSBnbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgdGlwYXJfc3RydWN0IHsKKwlzdHJ1Y3QgcGFyZGV2aWNlICpkZXY7CS8qIFBhcnBvcnQgZGV2aWNlIGVudHJ5ICovCit9OworCisjZGVmaW5lIFBQX05PIDMKK3N0YXRpYyBzdHJ1Y3QgdGlwYXJfc3RydWN0IHRhYmxlW1BQX05PXTsKKworc3RhdGljIGludCBkZWxheSA9IElPX0RFTEFZOwkvKiBpbnRlci1iaXQgZGVsYXkgaW4gbWljcm9zZWNvbmRzICovCitzdGF0aWMgaW50IHRpbWVvdXQgPSBUSU1BWFRJTUU7CS8qIHRpbWVvdXQgaW4gdGVudGggb2Ygc2Vjb25kcyAgICAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCB0cF9jb3VudDsJLyogdGlwYXIgY291bnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9wZW5lZDsJLyogb3BlbmVkIGRldmljZXMgKi8KKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKnRpcGFyX2NsYXNzOworCisvKiAtLS0gbWFjcm9zIGZvciBwYXJwb3J0IGFjY2VzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIHJfZHRyKHgpICAgICAgICAocGFycG9ydF9yZWFkX2RhdGEodGFibGVbKHgpXS5kZXYtPnBvcnQpKQorI2RlZmluZSByX3N0cih4KSAgICAgICAgKHBhcnBvcnRfcmVhZF9zdGF0dXModGFibGVbKHgpXS5kZXYtPnBvcnQpKQorI2RlZmluZSB3X2N0cih4LHkpICAgICAgKHBhcnBvcnRfd3JpdGVfY29udHJvbCh0YWJsZVsoeCldLmRldi0+cG9ydCwgKHkpKSkKKyNkZWZpbmUgd19kdHIoeCx5KSAgICAgIChwYXJwb3J0X3dyaXRlX2RhdGEodGFibGVbKHgpXS5kZXYtPnBvcnQsICh5KSkpCisKKy8qIC0tLSBzZXR0aW5nIHN0YXRlcyBvbiB0aGUgRC1idXMgd2l0aCB0aGUgcmlnaHQgdGltaW5nOiAtLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorb3V0Ynl0ZShpbnQgdmFsdWUsIGludCBtaW5vcikKK3sKKwl3X2R0cihtaW5vciwgdmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraW5ieXRlKGludCBtaW5vcikKK3sKKwlyZXR1cm4gKHJfc3RyKG1pbm9yKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraW5pdF90aV9wYXJhbGxlbChpbnQgbWlub3IpCit7CisJb3V0Ynl0ZSgzLCBtaW5vcik7Cit9CisKKy8qIC0tLS0tIGdsb2JhbCBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgU1RBUlQoeCkgeyB4ID0gamlmZmllcyArIChIWiAqIHRpbWVvdXQpIC8gMTA7IH0KKyNkZWZpbmUgV0FJVCh4KSAgeyBcCisgIGlmICh0aW1lX2JlZm9yZSgoeCksIGppZmZpZXMpKSByZXR1cm4gLTE7IFwKKyAgaWYgKG5lZWRfcmVzY2hlZCgpKSBzY2hlZHVsZSgpOyB9CisKKy8qIC0tLS0tIEQtYnVzIGJpdC1iYW5naW5nIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEQtYnVzIHByb3RvY29sICg0NWtiaXQvcyBtYXgpOgorICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICBfX19fX19fICAgICAgICBfX19fX198X19fX19fICAgIF9fX19fX19fX198X19fX19fX18gICAgX19fX19fX19fXworUmVkICA6ICAgICAgICBfX19fX19fXyAgICAgIHwgICAgICBfX19fICAgICAgICAgIHwgICAgICAgIF9fX18KKyAgICAgICBfICAgICAgICBfX19fX19fX19fX198X19fX19fX18gICAgICBfX19fX198X19fX19fX19fXyAgICAgICBfX19fXworV2hpdGU6ICBfX19fX19fXyAgICAgICAgICAgIHwgICAgICAgIF9fX19fXyAgICAgIHwgICAgICAgICAgX19fX19fXworKi8KKworLyogVHJ5IHRvIHRyYW5zbWl0IGEgYnl0ZSBvbiB0aGUgc3BlY2lmaWVkIHBvcnQgKC0xIGlmIGVycm9yKS4gKi8KK3N0YXRpYyBpbnQKK3B1dF90aV9wYXJhbGxlbChpbnQgbWlub3IsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgYml0OworCXVuc2lnbmVkIGxvbmcgbWF4OworCisJZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykgeworCQlpZiAoZGF0YSAmIDEpIHsKKwkJCW91dGJ5dGUoMiwgbWlub3IpOworCQkJU1RBUlQobWF4KTsKKwkJCWRvIHsKKwkJCQlXQUlUKG1heCk7CisJCQl9IHdoaWxlIChpbmJ5dGUobWlub3IpICYgMHgxMCk7CisKKwkJCW91dGJ5dGUoMywgbWlub3IpOworCQkJU1RBUlQobWF4KTsKKwkJCWRvIHsKKwkJCQlXQUlUKG1heCk7CisJCQl9IHdoaWxlICghKGluYnl0ZShtaW5vcikgJiAweDEwKSk7CisJCX0gZWxzZSB7CisJCQlvdXRieXRlKDEsIG1pbm9yKTsKKwkJCVNUQVJUKG1heCk7CisJCQlkbyB7CisJCQkJV0FJVChtYXgpOworCQkJfSB3aGlsZSAoaW5ieXRlKG1pbm9yKSAmIDB4MjApOworCisJCQlvdXRieXRlKDMsIG1pbm9yKTsKKwkJCVNUQVJUKG1heCk7CisJCQlkbyB7CisJCQkJV0FJVChtYXgpOworCQkJfSB3aGlsZSAoIShpbmJ5dGUobWlub3IpICYgMHgyMCkpOworCQl9CisKKwkJZGF0YSA+Pj0gMTsKKwkJdWRlbGF5KGRlbGF5KTsKKworCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQlzY2hlZHVsZSgpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlIGEgYnl0ZSBvbiB0aGUgc3BlY2lmaWVkIHBvcnQgb3IgLTEgaWYgZXJyb3IuICovCitzdGF0aWMgaW50CitnZXRfdGlfcGFyYWxsZWwoaW50IG1pbm9yKQoreworCXVuc2lnbmVkIGludCBiaXQ7CisJdW5zaWduZWQgY2hhciB2LCBkYXRhID0gMDsKKwl1bnNpZ25lZCBsb25nIG1heDsKKworCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyspIHsKKwkJU1RBUlQobWF4KTsKKwkJZG8geworCQkJV0FJVChtYXgpOworCQl9IHdoaWxlICgodiA9IGluYnl0ZShtaW5vcikgJiAweDMwKSA9PSAweDMwKTsKKworCQlpZiAodiA9PSAweDEwKSB7CisJCQlkYXRhID0gKGRhdGEgPj4gMSkgfCAweDgwOworCQkJb3V0Ynl0ZSgxLCBtaW5vcik7CisJCQlTVEFSVChtYXgpOworCQkJZG8geworCQkJCVdBSVQobWF4KTsKKwkJCX0gd2hpbGUgKCEoaW5ieXRlKG1pbm9yKSAmIDB4MjApKTsKKwkJCW91dGJ5dGUoMywgbWlub3IpOworCQl9IGVsc2UgeworCQkJZGF0YSA9IGRhdGEgPj4gMTsKKwkJCW91dGJ5dGUoMiwgbWlub3IpOworCQkJU1RBUlQobWF4KTsKKwkJCWRvIHsKKwkJCQlXQUlUKG1heCk7CisJCQl9IHdoaWxlICghKGluYnl0ZShtaW5vcikgJiAweDEwKSk7CisJCQlvdXRieXRlKDMsIG1pbm9yKTsKKwkJfQorCisJCXVkZWxheShkZWxheSk7CisJCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwkJCXNjaGVkdWxlKCk7CisJfQorCisJcmV0dXJuIChpbnQpIGRhdGE7Cit9CisKKy8qIFRyeSB0byBkZXRlY3QgYSBwYXJhbGxlbCBsaW5rIGNhYmxlIG9uIHRoZSBzcGVjaWZpZWQgcG9ydCAqLworc3RhdGljIGludAorcHJvYmVfdGlfcGFyYWxsZWwoaW50IG1pbm9yKQoreworCWludCBpOworCWludCBzZXFbXSA9IHsgMHgwMCwgMHgyMCwgMHgxMCwgMHgzMCB9OworCisJZm9yIChpID0gMzsgaSA+PSAwOyBpLS0pIHsKKwkJb3V0Ynl0ZSgzLCBtaW5vcik7CisJCW91dGJ5dGUoaSwgbWlub3IpOworCQl1ZGVsYXkoZGVsYXkpOworCQlwcl9kZWJ1ZygidGlwYXI6IFByb2JpbmcgLT4gJWk6IDB4JTAyeCAweCUwMnhcbiIsIGksCisJCQlkYXRhICYgMHgzMCwgc2VxW2ldKTsKKwkJaWYgKChpbmJ5dGUobWlub3IpICYgMHgzMCkgIT0gc2VxW2ldKSB7CisJCQlvdXRieXRlKDMsIG1pbm9yKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCW91dGJ5dGUoMywgbWlub3IpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLSBrZXJuZWwgbW9kdWxlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50Cit0aXBhcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSkgLSBUSVBBUl9NSU5PUjsKKworCWlmIChtaW5vciA+IHRwX2NvdW50IC0gMSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KG1pbm9yLCAmb3BlbmVkKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2sodGFibGVbbWlub3JdLmRldik7CisJaW5pdF90aV9wYXJhbGxlbChtaW5vcik7CisJcGFycG9ydF9yZWxlYXNlKHRhYmxlW21pbm9yXS5kZXYpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50Cit0aXBhcl9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpIC0gVElQQVJfTUlOT1I7CisKKwlpZiAobWlub3IgPiB0cF9jb3VudCAtIDEpCisJCXJldHVybiAtRU5YSU87CisKKwljbGVhcl9iaXQobWlub3IsICZvcGVuZWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit0aXBhcl93cml0ZSAoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJbG9mZl90ICogcHBvcykKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpIC0gVElQQVJfTUlOT1I7CisJc3NpemVfdCBuOworCisJcGFycG9ydF9jbGFpbV9vcl9ibG9jayh0YWJsZVttaW5vcl0uZGV2KTsKKworCWZvciAobiA9IDA7IG4gPCBjb3VudDsgbisrKSB7CisJCXVuc2lnbmVkIGNoYXIgYjsKKworCQlpZiAoZ2V0X3VzZXIoYiwgYnVmICsgbikpIHsKKwkJCW4gPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAocHV0X3RpX3BhcmFsbGVsKG1pbm9yLCBiKSA9PSAtMSkgeworCQkJaW5pdF90aV9wYXJhbGxlbChtaW5vcik7CisJCQluID0gLUVUSU1FRE9VVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorICAgICAgb3V0OgorCXBhcnBvcnRfcmVsZWFzZSh0YWJsZVttaW5vcl0uZGV2KTsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHNzaXplX3QKK3RpcGFyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlpbnQgYiA9IDA7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSAtIFRJUEFSX01JTk9SOworCXNzaXplX3QgcmV0dmFsID0gMDsKKwlzc2l6ZV90IG4gPSAwOworCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCisJcGFycG9ydF9jbGFpbV9vcl9ibG9jayh0YWJsZVttaW5vcl0uZGV2KTsKKworCXdoaWxlIChuIDwgY291bnQpIHsKKwkJYiA9IGdldF90aV9wYXJhbGxlbChtaW5vcik7CisJCWlmIChiID09IC0xKSB7CisJCQlpbml0X3RpX3BhcmFsbGVsKG1pbm9yKTsKKwkJCXJldHZhbCA9IC1FVElNRURPVVQ7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKKwkJCWlmIChwdXRfdXNlcihiLCBidWYgKyBuKSkgeworCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlyZXR2YWwgPSArK247CisJCX0KKworCQkvKiBOb24tYmxvY2tpbmcgbW9kZSA6IHRyeSBhZ2FpbiAhICovCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogU2lnbmFsIHBlbmRpbmcsIHRyeSBhZ2FpbiAhICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQlzY2hlZHVsZSgpOworCX0KKworICAgICAgb3V0OgorCXBhcnBvcnRfcmVsZWFzZSh0YWJsZVttaW5vcl0uZGV2KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50Cit0aXBhcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSU9DVExfVElQQVJfREVMQVk6CisJCWRlbGF5ID0gKGludClhcmc7ICAgIC8vZ2V0X3VzZXIoZGVsYXksICZhcmcpOworCQlicmVhazsKKwljYXNlIElPQ1RMX1RJUEFSX1RJTUVPVVQ6CisJCWlmIChhcmcgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAoaW50KWFyZzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSAtRUlOVkFMOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gLUVOT1RUWTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogLS0tLS0ga2VybmVsIG1vZHVsZSByZWdpc3RlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGlwYXJfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS5yZWFkID0gdGlwYXJfcmVhZCwKKwkud3JpdGUgPSB0aXBhcl93cml0ZSwKKwkuaW9jdGwgPSB0aXBhcl9pb2N0bCwKKwkub3BlbiA9IHRpcGFyX29wZW4sCisJLnJlbGVhc2UgPSB0aXBhcl9jbG9zZSwKK307CisKKy8qIC0tLSBpbml0aWFsaXNhdGlvbiBjb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBNT0RVTEUKKy8qICAgICAgWW91IG11c3Qgc2V0IHRoZXNlIC0gdGhlcmUgaXMgbm8gc2FuZSB3YXkgdG8gcHJvYmUgZm9yIHRoaXMgY2FibGUuCisgKiAgICAgIFlvdSBjYW4gdXNlICd0aXBhcj10aW1lb3V0LGRlbGF5JyB0byBzZXQgdGhlc2Ugbm93LiAqLworc3RhdGljIGludCBfX2luaXQKK3RpcGFyX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaW50c1syXTsKKworCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpZiAoaW50c1swXSA+IDApIHsKKwkJaWYgKGludHNbMV0gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBpbnRzWzFdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgInRpcGFyOiBiYWQgdGltZW91dCB2YWx1ZSAoMCksICIKKwkJCQkidXNpbmcgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkIik7CisJCWlmIChpbnRzWzBdID4gMSkgeworCQkJZGVsYXkgPSBpbnRzWzJdOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoKKyAqIFJlZ2lzdGVyIG91ciBtb2R1bGUgaW50byBwYXJwb3J0LgorICogUGFzcyBhbHNvIDIgY2FsbGJhY2tzIGZ1bmN0aW9ucyB0byBwYXJwb3J0OiBhIHByZS1lbXB0aXZlIGZ1bmN0aW9uIGFuZCBhbgorICogaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24gKHVudXNlZCkuCisgKiBEaXNwbGF5IGEgbWVzc2FnZSBzdWNoICJ0aXBhcjA6IHVzaW5nIHBhcnBvcnQwIChwb2xsaW5nKSIuCisgKi8KK3N0YXRpYyBpbnQKK3RpcGFyX3JlZ2lzdGVyKGludCBuciwgc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJaW50IGVyciA9IDA7CisKKwkvKiBSZWdpc3RlciBvdXIgbW9kdWxlIGludG8gcGFycG9ydCAqLworCXRhYmxlW25yXS5kZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwb3J0LCAidGlwYXIiLAorCQkJCQkJTlVMTCwgTlVMTCwgTlVMTCwgMCwKKwkJCQkJCSh2b2lkICopICZ0YWJsZVtucl0pOworCisJaWYgKHRhYmxlW25yXS5kZXYgPT0gTlVMTCkgeworCQllcnIgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh0aXBhcl9jbGFzcywgTUtERVYoVElQQVJfTUFKT1IsCisJCQlUSVBBUl9NSU5PUiArIG5yKSwgTlVMTCwgInBhciVkIiwgbnIpOworCS8qIFVzZSBkZXZmcywgdHJlZTogL2Rldi90aWNhYmxlcy9wYXIvWzAuLjJdICovCisJZXJyID0gZGV2ZnNfbWtfY2RldihNS0RFVihUSVBBUl9NQUpPUiwgVElQQVJfTUlOT1IgKyBuciksCisJCQlTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sCisJCQkidGljYWJsZXMvcGFyLyVkIiwgbnIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2NsYXNzOworCisJLyogRGlzcGxheSBpbmZvcm1hdGlvbnMgKi8KKwlwcl9pbmZvKCJ0aXBhciVkOiB1c2luZyAlcyAoJXMpXG4iLCBuciwgcG9ydC0+bmFtZSwgKHBvcnQtPmlycSA9PQorCQlQQVJQT1JUX0lSUV9OT05FKSA/ICJwb2xsaW5nIiA6ICJpbnRlcnJ1cHQtZHJpdmVuIik7CisKKwlpZiAocHJvYmVfdGlfcGFyYWxsZWwobnIpICE9IC0xKQorCQlwcl9pbmZvKCJ0aXBhciVkOiBsaW5rIGNhYmxlIGZvdW5kXG4iLCBucik7CisJZWxzZQorCQlwcl9pbmZvKCJ0aXBhciVkOiBsaW5rIGNhYmxlIG5vdCBmb3VuZFxuIiwgbnIpOworCisJZXJyID0gMDsKKwlnb3RvIG91dDsKKworb3V0X2NsYXNzOgorCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFRJUEFSX01BSk9SLCBUSVBBUl9NSU5PUiArIG5yKSk7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kodGlwYXJfY2xhc3MpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkCit0aXBhcl9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJaWYgKHRwX2NvdW50ID09IFBQX05PKSB7CisJCXByX2luZm8oInRpcGFyOiBpZ25vcmluZyBwYXJhbGxlbCBwb3J0IChtYXguICVkKVxuIiwgUFBfTk8pOworCQlyZXR1cm47CisJfQorCisJaWYgKCF0aXBhcl9yZWdpc3Rlcih0cF9jb3VudCwgcG9ydCkpCisJCXRwX2NvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkCit0aXBhcl9kZXRhY2goc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJLyogTm90aGluZyB0byBkbyAqLworfQorCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIHRpcGFyX2RyaXZlciA9IHsKKwkubmFtZSA9ICJ0aXBhciIsCisJLmF0dGFjaCA9IHRpcGFyX2F0dGFjaCwKKwkuZGV0YWNoID0gdGlwYXJfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK3RpcGFyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGVyciA9IDA7CisKKwlwcl9pbmZvKCJ0aXBhcjogcGFyYWxsZWwgbGluayBjYWJsZSBkcml2ZXIsIHZlcnNpb24gJXNcbiIsCisJCURSSVZFUl9WRVJTSU9OKTsKKworCWlmIChyZWdpc3Rlcl9jaHJkZXYoVElQQVJfTUFKT1IsICJ0aXBhciIsICZ0aXBhcl9mb3BzKSkgeworCQlwcmludGsoS0VSTl9FUlIgInRpcGFyOiB1bmFibGUgdG8gZ2V0IG1ham9yICVkXG4iLCBUSVBBUl9NQUpPUik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCS8qIFVzZSBkZXZmcyB3aXRoIHRyZWU6IC9kZXYvdGljYWJsZXMvcGFyL1swLi4yXSAqLworCWRldmZzX21rX2RpcigidGljYWJsZXMvcGFyIik7CisKKwl0aXBhcl9jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJ0aWNhYmxlcyIpOworCWlmIChJU19FUlIodGlwYXJfY2xhc3MpKSB7CisJCWVyciA9IFBUUl9FUlIodGlwYXJfY2xhc3MpOworCQlnb3RvIG91dF9jaHJkZXY7CisJfQorCWlmIChwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlcigmdGlwYXJfZHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgInRpcGFyOiB1bmFibGUgdG8gcmVnaXN0ZXIgd2l0aCBwYXJwb3J0XG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gMDsKKwlnb3RvIG91dDsKKworb3V0X2NocmRldjoKKwl1bnJlZ2lzdGVyX2NocmRldihUSVBBUl9NQUpPUiwgInRpcGFyIik7CitvdXQ6CisJcmV0dXJuIGVycjsJCit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAordGlwYXJfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIFVucmVnaXN0ZXJpbmcgbW9kdWxlICovCisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmdGlwYXJfZHJpdmVyKTsKKworCXVucmVnaXN0ZXJfY2hyZGV2KFRJUEFSX01BSk9SLCAidGlwYXIiKTsKKworCWZvciAoaSA9IDA7IGkgPCBQUF9OTzsgaSsrKSB7CisJCWlmICh0YWJsZVtpXS5kZXYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHRhYmxlW2ldLmRldik7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFRJUEFSX01BSk9SLCBpKSk7CisJCWRldmZzX3JlbW92ZSgidGljYWJsZXMvcGFyLyVkIiwgaSk7CisJfQorCWNsYXNzX3NpbXBsZV9kZXN0cm95KHRpcGFyX2NsYXNzKTsKKwlkZXZmc19yZW1vdmUoInRpY2FibGVzL3BhciIpOworCisJcHJfaW5mbygidGlwYXI6IG1vZHVsZSB1bmxvYWRlZFxuIik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitfX3NldHVwKCJ0aXBhcj0iLCB0aXBhcl9zZXR1cCk7Cittb2R1bGVfaW5pdCh0aXBhcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh0aXBhcl9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoRFJJVkVSX0xJQ0VOU0UpOworCittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgIlRpbWVvdXQgKGRlZmF1bHQ9MS41IHNlY29uZHMpIik7Cittb2R1bGVfcGFyYW0oZGVsYXksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlbGF5LCAiSW50ZXItYml0IGRlbGF5IChkZWZhdWx0PTEwIG1pY3Jvc2Vjb25kcykiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90b3NoaWJhLmMgYi9kcml2ZXJzL2NoYXIvdG9zaGliYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZTIxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdG9zaGliYS5jCkBAIC0wLDAgKzEsNTMyIEBACisvKiB0b3NoaWJhLmMgLS0gTGludXggZHJpdmVyIGZvciBhY2Nlc3NpbmcgdGhlIFNNTSBvbiBUb3NoaWJhIGxhcHRvcHMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMSAgSm9uYXRoYW4gQS4gQnV6emFyZCAoam9uYXRoYW5AYnV6emFyZC5vcmcudWspCisgKgorICogVmFsdWFibGUgYXNzaXN0YW5jZSBhbmQgcGF0Y2hlcyBmcm9tOgorICogICAgIFRvbSBNYXkgPHRvbUB5b3UtYmFzdGFyZHMuY29tPgorICogICAgIFJvYiBOYXBpZXIgPHJuYXBpZXJAZW1wbG95ZWVzLm9yZz4KKyAqCisgKiBGbiBzdGF0dXMgcG9ydCBudW1iZXJzIGZvciBtYWNoaW5lIElEJ3MgY291cnRlc3kgb2YKKyAqICAgICAweGZjMDI6IFNjb3R0IEVpc2VydCA8c2NvdHQuZUBza3ktZXllLmNvbT4KKyAqICAgICAweGZjMDQ6IFN0ZXZlIFZhbkRldmVuZGVyIDxzdGV2ZXZAZWZuLm9yZz4KKyAqICAgICAweGZjMDg6IEdhcnRoIEJlcnJ5IDxnYXJ0aEBpdHNicnVjZS5uZXQ+CisgKiAgICAgMHhmYzBhOiBFZ2JlcnQgRWljaCA8ZWljaEB4ZnJlZTg2Lm9yZz4KKyAqICAgICAweGZjMTA6IEFuZHJldyBMb2Z0aG91c2UgPEFuZHJldy5Mb2Z0aG91c2VAcm9iaW5zLmFmLm1pbD4KKyAqICAgICAweGZjMTE6IFNwZW5jZXIgT2xzb24gPHNvbHNvbkBub3ZlbGwuY29tPgorICogICAgIDB4ZmMxMzogQ2xhdWRpdXMgRnJhbmtld2l0eiA8a3J5cEBnbXguZGU+CisgKiAgICAgMHhmYzE1OiBUb20gTWF5IDx0b21AeW91LWJhc3RhcmRzLmNvbT4KKyAqICAgICAweGZjMTc6IERhdmUgS29ucmFkIDxrb25yYWRAeGVuaWEuaXQ+CisgKiAgICAgMHhmYzFhOiBHZW9yZ2UgQmV0em9zIDxiZXR6b3NAZW5nci5jb2xvc3RhdGUuZWR1PgorICogICAgIDB4ZmMxYjogTXVuZW1hc2EgV2FkYSA8bXVuZW1hc2FAam5vdmVsLmNvLmpwPgorICogICAgIDB4ZmMxZDogQXJ0aHVyIExpdSA8YXJtaWVAc2xhcC5taW5lLm51PgorICogICAgIDB4ZmM1YTogSmFjcXVlcyBMJ2hlbGdvdWFsYydoIDxsaGhAZnJlZS5mcj4KKyAqICAgICAweGZjZDE6IE1yLiBEYXZlIEtvbnJhZCA8a29ucmFkQHhlbmlhLml0PgorICoKKyAqIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HCisgKgorICogICBUaGlzIGNvZGUgaXMgY292ZXJlZCBieSB0aGUgR05VIEdQTCBhbmQgeW91IGFyZSBmcmVlIHRvIG1ha2UgYW55CisgKiAgIGNoYW5nZXMgeW91IHdpc2ggdG8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlLiBIb3dldmVyIHRoZQorICogICBjb2RlIGhhcyB0aGUgcG90ZW50aWFsIHRvIHJlbmRlciB5b3VyIGNvbXB1dGVyIGFuZC9vciBzb21lb25lIGVsc2UncworICogICB1bnVzYWJsZS4gUGxlYXNlIHByb2NlZWQgd2l0aCBjYXJlIHdoZW4gbW9kaWZ5aW5nIHRoZSBjb2RlLgorICoKKyAqIE5vdGU6IFVuZm9ydHVuYXRlbHkgdGhlIGxhcHRvcCBoYXJkd2FyZSBjYW4gY2xvc2UgdGhlIFN5c3RlbSBDb25maWd1cmF0aW9uCisgKiAgICAgICBJbnRlcmZhY2Ugb24gaXQncyBvd24gYWNjb3JkLiBJdCBpcyB0aGVyZWZvcmUgbmVjZXNzYXJ5IGZvciAqYWxsKgorICogICAgICAgcHJvZ3JhbXMgdXNpbmcgdGhpcyBkcml2ZXIgdG8gYmUgYXdhcmUgdGhhdCAqYW55KiBTQ0kgY2FsbCBjYW4gZmFpbCBhdAorICogICAgICAgKmFueSogdGltZS4gSXQgaXMgdXAgdG8gYW55IHByb2dyYW0gdG8gYmUgYXdhcmUgb2YgdGhpcyBldmVudHVhbGl0eQorICogICAgICAgYW5kIHRha2UgYXBwcm9wcmlhdGUgc3RlcHMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBpbmZvcm1hdGlvbiB1c2VkIHRvIHdyaXRlIHRoaXMgZHJpdmVyIGhhcyBiZWVuIG9idGFpbmVkIGJ5IHJldmVyc2UKKyAqIGVuZ2luZWVyaW5nIHRoZSBzb2Z0d2FyZSBzdXBwbGllZCBieSBUb3NoaWJhIGZvciB0aGVpciBwb3J0YWJsZSBjb21wdXRlcnMgaW4KKyAqIHN0cmljdCBhY2NvcmRhbmNlIHdpdGggdGhlIEV1cm9wZWFuIENvdW5jaWwgRGlyZWN0aXZlIDkyLzI1MC9FRUMgb24gdGhlIGxlZ2FsCisgKiBwcm90ZWN0aW9uIG9mIGNvbXB1dGVyIHByb2dyYW1zLCBhbmQgaXQncyBpbXBsZW1lbnRhdGlvbiBpbnRvIEVuZ2xpc2ggTGF3IGJ5CisgKiB0aGUgQ29weXJpZ2h0IChDb21wdXRlciBQcm9ncmFtcykgUmVndWxhdGlvbnMgMTk5MiAoUy5JLiAxOTkyIE5vLjMyMzMpLgorICoKKyAqLworCisjZGVmaW5lIFRPU0hfVkVSU0lPTiAiMS4xMSAyNi85LzIwMDEiCisjZGVmaW5lIFRPU0hfREVCVUcgMAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC90b3NoaWJhLmg+CisKKyNkZWZpbmUgVE9TSF9NSU5PUl9ERVYgMTgxCisKK3N0YXRpYyBpbnQgdG9zaF9pZCA9IDB4MDAwMDsKK3N0YXRpYyBpbnQgdG9zaF9iaW9zID0gMHgwMDAwOworc3RhdGljIGludCB0b3NoX2RhdGUgPSAweDAwMDA7CitzdGF0aWMgaW50IHRvc2hfc2NpID0gMHgwMDAwOworc3RhdGljIGludCB0b3NoX2ZhbiA9IDA7CisKK3N0YXRpYyBpbnQgdG9zaF9mbiA9IDA7CisKK21vZHVsZV9wYXJhbSh0b3NoX2ZuLCBpbnQsIDApOworCisKK3N0YXRpYyBpbnQgdG9zaF9pb2N0bChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LAorCXVuc2lnbmVkIGxvbmcpOworCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRvc2hfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCQk9IHRvc2hfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgdG9zaF9kZXZpY2UgPSB7CisJVE9TSF9NSU5PUl9ERVYsCisJInRvc2hpYmEiLAorCSZ0b3NoX2ZvcHMKK307CisKKy8qCisgKiBSZWFkIHRoZSBGbiBrZXkgc3RhdHVzCisgKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGludCB0b3NoX2ZuX3N0YXR1cyh2b2lkKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyIHNjYW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh0b3NoX2ZuIT0wKSB7CisJCXNjYW4gPSBpbmIodG9zaF9mbik7CisJfSBlbHNlIHsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlvdXRiKDB4OGUsIDB4ZTQpOworCQlzY2FuID0gaW5iKDB4ZTUpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCisgICAgICAgIHJldHVybiAoaW50KSBzY2FuOworfQorI2VuZGlmCisKKworLyoKKyAqIEZvciB0aGUgUG9ydGFnZSA2MTBDVCBhbmQgdGhlIFRlY3JhIDcwMENTLzcwMENEVCBlbXVsYXRlIHRoZSBIQ0kgZmFuIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyBpbnQgdG9zaF9lbXVsYXRlX2ZhbihTTU1SZWdpc3RlcnMgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBlYXgsZWN4LGZsYWdzOworCXVuc2lnbmVkIGNoYXIgYWw7CisKKwllYXggPSByZWdzLT5lYXggJiAweGZmMDA7CisJZWN4ID0gcmVncy0+ZWN4ICYgMHhmZmZmOworCisJLyogUG9ydGFnZSA2MTBDVCAqLworCisJaWYgKHRvc2hfaWQ9PTB4ZmNjYikgeworCQlpZiAoZWF4PT0weGZlMDApIHsKKwkJCS8qIGZhbiBzdGF0dXMgKi8KKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCW91dGIoMHhiZSwgMHhlNCk7CisJCQlhbCA9IGluYigweGU1KTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJlZ3MtPmVheCA9IDB4MDA7CisJCQlyZWdzLT5lY3ggPSAodW5zaWduZWQgaW50KSAoYWwgJiAweDAxKTsKKwkJfQorCQlpZiAoKGVheD09MHhmZjAwKSAmJiAoZWN4PT0weDAwMDApKSB7CisJCQkvKiBmYW4gb2ZmICovCisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlvdXRiKDB4YmUsIDB4ZTQpOworCQkJYWwgPSBpbmIoMHhlNSk7CisJCQlvdXRiKDB4YmUsIDB4ZTQpOworCQkJb3V0YiAoYWwgfCAweDAxLCAweGU1KTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJlZ3MtPmVheCA9IDB4MDA7CisJCQlyZWdzLT5lY3ggPSAweDAwOworCQl9CisJCWlmICgoZWF4PT0weGZmMDApICYmIChlY3g9PTB4MDAwMSkpIHsKKwkJCS8qIGZhbiBvbiAqLworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkJb3V0YigweGJlLCAweGU0KTsKKwkJCWFsID0gaW5iKDB4ZTUpOworCQkJb3V0YigweGJlLCAweGU0KTsKKwkJCW91dGIoYWwgJiAweGZlLCAweGU1KTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJlZ3MtPmVheCA9IDB4MDA7CisJCQlyZWdzLT5lY3ggPSAweDAxOworCQl9CisJfQorCisJLyogVGVjcmEgNzAwQ1MvQ0RUICovCisKKwlpZiAodG9zaF9pZD09MHhmY2NjKSB7CisJCWlmIChlYXg9PTB4ZmUwMCkgeworCQkJLyogZmFuIHN0YXR1cyAqLworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkJb3V0YigweGUwLCAweGU0KTsKKwkJCWFsID0gaW5iKDB4ZTUpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJcmVncy0+ZWF4ID0gMHgwMDsKKwkJCXJlZ3MtPmVjeCA9IGFsICYgMHgwMTsKKwkJfQorCQlpZiAoKGVheD09MHhmZjAwKSAmJiAoZWN4PT0weDAwMDApKSB7CisJCQkvKiBmYW4gb2ZmICovCisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlvdXRiKDB4ZTAsIDB4ZTQpOworCQkJYWwgPSBpbmIoMHhlNSk7CisJCQlvdXR3KDB4ZTAgfCAoKGFsICYgMHhmZSkgPDwgOCksIDB4ZTQpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJcmVncy0+ZWF4ID0gMHgwMDsKKwkJCXJlZ3MtPmVjeCA9IDB4MDA7CisJCX0KKwkJaWYgKChlYXg9PTB4ZmYwMCkgJiYgKGVjeD09MHgwMDAxKSkgeworCQkJLyogZmFuIG9uICovCisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlvdXRiKDB4ZTAsIDB4ZTQpOworCQkJYWwgPSBpbmIoMHhlNSk7CisJCQlvdXR3KDB4ZTAgfCAoKGFsIHwgMHgwMSkgPDwgOCksIDB4ZTQpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJcmVncy0+ZWF4ID0gMHgwMDsKKwkJCXJlZ3MtPmVjeCA9IDB4MDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogUHV0IHRoZSBsYXB0b3AgaW50byBTeXN0ZW0gTWFuYWdlbWVudCBNb2RlCisgKi8KK2ludCB0b3NoX3NtbShTTU1SZWdpc3RlcnMgKnJlZ3MpCit7CisJaW50IGVheDsKKworCWFzbSAoIiMgbG9hZCB0aGUgdmFsdWVzIGludG8gdGhlIHJlZ2lzdGVyc1xuXHQiIFwKKwkJInB1c2hsICUlZWF4XG5cdCIgXAorCQkibW92bCAwKCUlZWF4KSwlJWVkeFxuXHQiIFwKKwkJInB1c2ggJSVlZHhcblx0IiBcCisJCSJtb3ZsIDQoJSVlYXgpLCUlZWJ4XG5cdCIgXAorCQkibW92bCA4KCUlZWF4KSwlJWVjeFxuXHQiIFwKKwkJIm1vdmwgMTIoJSVlYXgpLCUlZWR4XG5cdCIgXAorCQkibW92bCAxNiglJWVheCksJSVlc2lcblx0IiBcCisJCSJtb3ZsIDIwKCUlZWF4KSwlJWVkaVxuXHQiIFwKKwkJInBvcGwgJSVlYXhcblx0IiBcCisJCSIjIGNhbGwgdGhlIFN5c3RlbSBNYW5hZ2VtZW50IG1vZGVcblx0IiBcCisJCSJpbmIgJDB4YjIsJSVhbFxuXHQiCisJCSIjIGZpbGwgb3V0IHRoZSBtZW1vcnkgd2l0aCB0aGUgdmFsdWVzIGluIHRoZSByZWdpc3RlcnNcblx0IiBcCisJCSJ4Y2hnbCAlJWVheCwoJSVlc3ApXG5cdCIKKwkJIm1vdmwgJSVlYngsNCglJWVheClcblx0IiBcCisJCSJtb3ZsICUlZWN4LDgoJSVlYXgpXG5cdCIgXAorCQkibW92bCAlJWVkeCwxMiglJWVheClcblx0IiBcCisJCSJtb3ZsICUlZXNpLDE2KCUlZWF4KVxuXHQiIFwKKwkJIm1vdmwgJSVlZGksMjAoJSVlYXgpXG5cdCIgXAorCQkicG9wbCAlJWVkeFxuXHQiIFwKKwkJIm1vdmwgJSVlZHgsMCglJWVheClcblx0IiBcCisJCSIjIHNldHVwIHRoZSByZXR1cm4gdmFsdWUgdG8gdGhlIGNhcnJ5IGZsYWdcblx0IiBcCisJCSJsYWhmXG5cdCIgXAorCQkic2hybCAkOCwlJWVheFxuXHQiIFwKKwkJImFuZGwgJDEsJSVlYXhcbiIgXAorCQk6ICI9YSIgKGVheCkKKwkJOiAiYSIgKHJlZ3MpCisJCTogIiVlYngiLCAiJWVjeCIsICIlZWR4IiwgIiVlc2kiLCAiJWVkaSIsICJtZW1vcnkiKTsKKworCXJldHVybiBlYXg7Cit9CisKKworc3RhdGljIGludCB0b3NoX2lvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlTTU1SZWdpc3RlcnMgcmVnczsKKwlTTU1SZWdpc3RlcnMgX191c2VyICphcmdwID0gKFNNTVJlZ2lzdGVycyBfX3VzZXIgKilhcmc7CisJdW5zaWduZWQgc2hvcnQgYXgsYng7CisJaW50IGVycjsKKworCWlmICghYXJncCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlZ3MsIGFyZ3AsIHNpemVvZihTTU1SZWdpc3RlcnMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFRPU0hfU01NOgorCQkJYXggPSByZWdzLmVheCAmIDB4ZmYwMDsKKwkJCWJ4ID0gcmVncy5lYnggJiAweGZmZmY7CisJCQkvKiBibG9jayBIQ0kgY2FsbHMgdG8gcmVhZC93cml0ZSBtZW1vcnkgJiBQQ0kgZGV2aWNlcyAqLworCQkJaWYgKCgoYXg9PTB4ZmYwMCkgfHwgKGF4PT0weGZlMDApKSAmJiAoYng+MHgwMDY5KSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJLyogZG8gd2UgbmVlZCB0byBlbXVsYXRlIHRoZSBmYW4gPyAqLworCQkJaWYgKHRvc2hfZmFuPT0xKSB7CisJCQkJaWYgKCgoYXg9PTB4ZjMwMCkgfHwgKGF4PT0weGY0MDApKSAmJiAoYng9PTB4MDAwNCkpIHsKKwkJCQkJZXJyID0gdG9zaF9lbXVsYXRlX2ZhbigmcmVncyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWVyciA9IHRvc2hfc21tKCZyZWdzKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnJlZ3MsIHNpemVvZihTTU1SZWdpc3RlcnMpKSkKKyAgICAgICAgCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIChlcnI9PTApID8gMDotRUlOVkFMOworfQorCisKKy8qCisgKiBQcmludCB0aGUgaW5mb3JtYXRpb24gZm9yIC9wcm9jL3Rvc2hpYmEKKyAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50IHRvc2hfZ2V0X2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IGZwb3MsIGludCBsZW5ndGgpCit7CisJY2hhciAqdGVtcDsKKwlpbnQga2V5OworCisJdGVtcCA9IGJ1ZmZlcjsKKwlrZXkgPSB0b3NoX2ZuX3N0YXR1cygpOworCisJLyogQXJndW1lbnRzCisJICAgICAwKSBMaW51eCBkcml2ZXIgdmVyc2lvbiAodGhpcyB3aWxsIGNoYW5nZSBpZiBmb3JtYXQgY2hhbmdlcykKKwkgICAgIDEpIE1hY2hpbmUgSUQKKwkgICAgIDIpIFNDSSB2ZXJzaW9uCisJICAgICAzKSBCSU9TIHZlcnNpb24gKG1ham9yLCBtaW5vcikKKwkgICAgIDQpIEJJT1MgZGF0ZSAoaW4gU0NJIGRhdGUgZm9ybWF0KQorCSAgICAgNSkgRm4gS2V5IHN0YXR1cworCSovCisKKwl0ZW1wICs9IHNwcmludGYodGVtcCwgIjEuMSAweCUwNHggJWQuJWQgJWQuJWQgMHglMDR4IDB4JTAyeFxuIiwKKwkJdG9zaF9pZCwKKwkJKHRvc2hfc2NpICYgMHhmZjAwKT4+OCwKKwkJdG9zaF9zY2kgJiAweGZmLAorCQkodG9zaF9iaW9zICYgMHhmZjAwKT4+OCwKKwkJdG9zaF9iaW9zICYgMHhmZiwKKwkJdG9zaF9kYXRlLAorCQlrZXkpOworCisJcmV0dXJuIHRlbXAtYnVmZmVyOworfQorI2VuZGlmCisKKworLyoKKyAqIERldGVybWluZSB3aGljaCBwb3J0IHRvIHVzZSBmb3IgdGhlIEZuIGtleSBzdGF0dXMKKyAqLworc3RhdGljIHZvaWQgdG9zaF9zZXRfZm5fcG9ydCh2b2lkKQoreworCXN3aXRjaCAodG9zaF9pZCkgeworCQljYXNlIDB4ZmMwMjogY2FzZSAweGZjMDQ6IGNhc2UgMHhmYzA5OiBjYXNlIDB4ZmMwYTogY2FzZSAweGZjMTA6CisJCWNhc2UgMHhmYzExOiBjYXNlIDB4ZmMxMzogY2FzZSAweGZjMTU6IGNhc2UgMHhmYzFhOiBjYXNlIDB4ZmMxYjoKKwkJY2FzZSAweGZjNWE6CisJCQl0b3NoX2ZuID0gMHg2MjsKKwkJCWJyZWFrOworCQljYXNlIDB4ZmMwODogY2FzZSAweGZjMTc6IGNhc2UgMHhmYzFkOiBjYXNlIDB4ZmNkMTogY2FzZSAweGZjZTA6CisJCWNhc2UgMHhmY2UyOgorCQkJdG9zaF9mbiA9IDB4Njg7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRvc2hfZm4gPSAweDAwOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCisKKy8qCisgKiBHZXQgdGhlIG1hY2hpbmUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIHRoZSBjdXJyZW50IG1vZGVsCisgKi8KK3N0YXRpYyBpbnQgdG9zaF9nZXRfbWFjaGluZV9pZCh2b2lkKQoreworCWludCBpZDsKKwlTTU1SZWdpc3RlcnMgcmVnczsKKwl1bnNpZ25lZCBzaG9ydCBieCxjeDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisKKwlpZCA9ICgweDEwMCooaW50KSBpc2FfcmVhZGIoMHhmZmZmZSkpKygoaW50KSBpc2FfcmVhZGIoMHhmZmZmYSkpOworCQorCS8qIGRvIHdlIGhhdmUgYSBTQ1RUYWJsZSBtYWNoaW5lIGlkZW50aWNhdGlvbiBudW1iZXIgb24gb3VyIGhhbmRzICovCisKKwlpZiAoaWQ9PTB4ZmMyZikgeworCisJCS8qIHN0YXJ0IGJ5IGdldHRpbmcgYSBwb2ludGVyIGludG8gdGhlIEJJT1MgKi8KKworCQlyZWdzLmVheCA9IDB4YzAwMDsKKwkJcmVncy5lYnggPSAweDAwMDA7CisJCXJlZ3MuZWN4ID0gMHgwMDAwOworCQl0b3NoX3NtbSgmcmVncyk7CisJCWJ4ID0gKHVuc2lnbmVkIHNob3J0KSAocmVncy5lYnggJiAweGZmZmYpOworCisJCS8qIEF0IHRoaXMgcG9pbnQgaW4gdGhlIFRvc2hpYmEgcm91dGluZXMgdW5kZXIgTVMgV2luZG93cworCQkgICB0aGUgYnggcmVnaXN0ZXIgaG9sZHMgMHhlNmY1LiBIb3dldmVyIG15IGNvZGUgaXMgcHJvZHVjaW5nCisJCSAgIGEgZGlmZmVyZW50IHZhbHVlISBGb3IgdGhlIHRpbWUgYmVpbmcgSSB3aWxsIGp1c3QgZnVkZ2UgdGhlCisJCSAgIHZhbHVlLiBUaGlzIGhhcyBiZWVuIHZlcmlmaWVkIG9uIGEgU2F0ZWxsaXRlIFBybyA0MzBDRFQsCisJCSAgIFRlY3JhIDc1MENEVCwgVGVjcmEgNzgwRFZEIGFuZCBTYXRlbGxpdGUgMzEwQ0RULiAqLworI2lmIFRPU0hfREVCVUcKKwkJcHJpbnRrKCJ0b3NoaWJhOiBkZWJ1Z2dpbmcgSUQgZWJ4PTB4JTA0eFxuIiwgcmVncy5lYngpOworI2VuZGlmCisJCWJ4ID0gMHhlNmY1OworCisJCS8qIG5vdyB0d2lkZGxlIHdpdGggb3VyIHBvaW50ZXIgYSBiaXQgKi8KKworCQlhZGRyZXNzID0gMHgwMDBmMDAwMCtieDsKKwkJY3ggPSBpc2FfcmVhZHcoYWRkcmVzcyk7CisJCWFkZHJlc3MgPSAweDAwMGYwMDA5K2J4K2N4OworCQljeCA9IGlzYV9yZWFkdyhhZGRyZXNzKTsKKwkJYWRkcmVzcyA9IDB4MDAwZjAwMGErY3g7CisJCWN4ID0gaXNhX3JlYWR3KGFkZHJlc3MpOworCisJCS8qIG5vdyBjb25zdHJ1Y3Qgb3VyIG1hY2hpbmUgaWRlbnRpZmljYXRpb24gbnVtYmVyICovCisKKwkJaWQgPSAoKGN4ICYgMHhmZik8PDgpKygoY3ggJiAweGZmMDApPj44KTsKKwl9CisKKwlyZXR1cm4gaWQ7Cit9CisKKworLyoKKyAqIFByb2JlIGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBUb3NoaWJhIGxhcHRvcAorICoKKyAqICAgcmV0dXJucyBhbmQgbm9uLXplcm8gaWYgdW5hYmxlIHRvIGRldGVjdCB0aGUgcHJlc2VuY2Ugb2YgYSBUb3NoaWJhCisgKiAgIGxhcHRvcCwgb3RoZXJ3aXNlIHplcm8gYW5kIGRldGVybWluZXMgdGhlIE1hY2hpbmUgSUQsIEJJT1MgdmVyc2lvbiBhbmQKKyAqICAgZGF0ZSwgYW5kIFNDSSB2ZXJzaW9uLgorICovCitzdGF0aWMgaW50IHRvc2hfcHJvYmUodm9pZCkKK3sKKwlpbnQgaSxtYWpvcixtaW5vcixkYXkseWVhcixtb250aCxmbGFnOworCXVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlWzddID0geyAweDU0LDB4NGYsMHg1MywweDQ4LDB4NDksMHg0MiwweDQxIH07CisJU01NUmVnaXN0ZXJzIHJlZ3M7CisKKwkvKiBleHRyYSBzYW5pdHkgY2hlY2sgZm9yIHRoZSBzdHJpbmcgIlRPU0hJQkEiIGluIHRoZSBCSU9TIGJlY2F1c2UKKwkgICBzb21lIG1hY2hpbmVzIHRoYXQgYXJlIG5vdCBUb3NoaWJhJ3MgcGFzcyB0aGUgbmV4dCB0ZXN0ICovCisKKwlmb3IgKGk9MDtpPDc7aSsrKSB7CisJCWlmIChpc2FfcmVhZGIoMHhmZTAxMCtpKSE9c2lnbmF0dXJlW2ldKSB7CisJCQlwcmludGsoInRvc2hpYmE6IG5vdCBhIHN1cHBvcnRlZCBUb3NoaWJhIGxhcHRvcFxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCS8qIGNhbGwgdGhlIFRvc2hpYmEgU0NJIHN1cHBvcnQgY2hlY2sgcm91dGluZSAqLworCQorCXJlZ3MuZWF4ID0gMHhmMGYwOworCXJlZ3MuZWJ4ID0gMHgwMDAwOworCXJlZ3MuZWN4ID0gMHgwMDAwOworCWZsYWcgPSB0b3NoX3NtbSgmcmVncyk7CisKKwkvKiBpZiB0aGlzIGlzIG5vdCBhIFRvc2hpYmEgbGFwdG9wIGNhcnJ5IGZsYWcgaXMgc2V0IGFuZCBhaD0weDg2ICovCisKKwlpZiAoKGZsYWc9PTEpIHx8ICgocmVncy5lYXggJiAweGZmMDApPT0weDg2MDApKSB7CisJCXByaW50aygidG9zaGliYTogbm90IGEgc3VwcG9ydGVkIFRvc2hpYmEgbGFwdG9wXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogaWYgd2UgZ2V0IHRoaXMgZmFyIHRoZW4gd2UgYXJlIHJ1bm5pbmcgb24gYSBUb3NoaWJhIChwcm9iYWJseSkhICovCisKKwl0b3NoX3NjaSA9IHJlZ3MuZWR4ICYgMHhmZmZmOworCQorCS8qIG5leHQgZ2V0IHRoZSBtYWNoaW5lIElEIG9mIHRoZSBjdXJyZW50IGxhcHRvcCAqLworCisJdG9zaF9pZCA9IHRvc2hfZ2V0X21hY2hpbmVfaWQoKTsKKworCS8qIGdldCB0aGUgQklPUyB2ZXJzaW9uICovCisKKwltYWpvciA9IGlzYV9yZWFkYigweGZlMDA5KS0nMCc7CisJbWlub3IgPSAoKGlzYV9yZWFkYigweGZlMDBiKS0nMCcpKjEwKSsoaXNhX3JlYWRiKDB4ZmUwMGMpLScwJyk7CisJdG9zaF9iaW9zID0gKG1ham9yKjB4MTAwKSttaW5vcjsKKworCS8qIGdldCB0aGUgQklPUyBkYXRlICovCisKKwlkYXkgPSAoKGlzYV9yZWFkYigweGZmZmY1KS0nMCcpKjEwKSsoaXNhX3JlYWRiKDB4ZmZmZjYpLScwJyk7CisJbW9udGggPSAoKGlzYV9yZWFkYigweGZmZmY4KS0nMCcpKjEwKSsoaXNhX3JlYWRiKDB4ZmZmZjkpLScwJyk7CisJeWVhciA9ICgoaXNhX3JlYWRiKDB4ZmZmZmIpLScwJykqMTApKyhpc2FfcmVhZGIoMHhmZmZmYyktJzAnKTsKKwl0b3NoX2RhdGUgPSAoKCh5ZWFyLTkwKSAmIDB4MWYpPDwxMCkgfCAoKG1vbnRoICYgMHhmKTw8NikKKwkJfCAoKGRheSAmIDB4MWYpPDwxKTsKKworCisJLyogaW4gdGhlb3J5IHdlIHNob3VsZCBjaGVjayB0aGUgcG9ydHMgd2UgYXJlIGdvaW5nIHRvIHVzZSBmb3IgdGhlCisJICAgZm4ga2V5IGRldGVjdGlvbiAoYW5kIHRoZSBmYW4gb24gdGhlIFBvcnRhZ2UgNjEwL1RlY3JhNzAwKSwgYW5kCisJICAgdGhlbiByZXF1ZXN0IHRoZW0gdG8gc3RvcCBvdGhlciBkcml2ZXJzIHVzaW5nIHRoZW0uIEhvd2V2ZXIgYXMKKwkgICB0aGUga2V5Ym9hcmQgZHJpdmVyIGdyYWJzIDB4NjAtMHg2ZiBhbmQgdGhlIHBpYyBkcml2ZXIgZ3JhYnMKKwkgICAweGEwLTB4YmYgd2UgY2FuJ3QuIFdlIGp1c3QgaGF2ZSB0byBsaXZlIGRhbmdlcm91c2x5IGFuZCB1c2UgdGhlCisJICAgcG9ydHMgYW55d2F5LCBvaCBib3khICovCisKKwkvKiBkbyB3ZSBuZWVkIHRvIGVtdWxhdGUgdGhlIGZhbj8gKi8KKworCWlmICgodG9zaF9pZD09MHhmY2NiKSB8fCAodG9zaF9pZD09MHhmY2NjKSkKKwkJdG9zaF9mYW4gPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2luaXQgdG9zaF9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKwkvKiBhcmUgd2UgcnVubmluZyBvbiBhIFRvc2hpYmEgbGFwdG9wICovCisKKwlpZiAodG9zaF9wcm9iZSgpIT0wKQorCQlyZXR1cm4gLUVJTzsKKworCXByaW50ayhLRVJOX0lORk8gIlRvc2hpYmEgU3lzdGVtIE1hbmFnbWVudCBNb2RlIGRyaXZlciB2IgorCQlUT1NIX1ZFUlNJT04iXG4iKTsKKworCS8qIHNldCB0aGUgcG9ydCB0byB1c2UgZm9yIEZuIHN0YXR1cyBpZiBub3Qgc3BlY2lmaWVkIGFzIGEgcGFyYW1ldGVyICovCisJaWYgKHRvc2hfZm49PTB4MDApCisJCXRvc2hfc2V0X2ZuX3BvcnQoKTsKKworCS8qIHJlZ2lzdGVyIHRoZSBkZXZpY2UgZmlsZSAqLworCXJldHZhbCA9IG1pc2NfcmVnaXN0ZXIoJnRvc2hfZGV2aWNlKTsKKwlpZihyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwkvKiByZWdpc3RlciB0aGUgcHJvYyBlbnRyeSAqLworCWlmKGNyZWF0ZV9wcm9jX2luZm9fZW50cnkoInRvc2hpYmEiLCAwLCBOVUxMLCB0b3NoX2dldF9pbmZvKSA9PSBOVUxMKXsKKwkJbWlzY19kZXJlZ2lzdGVyKCZ0b3NoX2RldmljZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiB0b3NoX2luaXQoKTsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCS8qIHJlbW92ZSB0aGUgcHJvYyBlbnRyeSAqLworCisJcmVtb3ZlX3Byb2NfZW50cnkoInRvc2hpYmEiLCBOVUxMKTsKKworCS8qIHVucmVnaXN0ZXIgdGhlIGRldmljZSBmaWxlICovCisKKwltaXNjX2RlcmVnaXN0ZXIoJnRvc2hfZGV2aWNlKTsKK30KKyNlbmRpZgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfUEFSTV9ERVNDKHRvc2hfZm4sICJVc2VyIHNwZWNpZmllZCBGbiBrZXkgZGV0ZWN0aW9uIHBvcnQiKTsKK01PRFVMRV9BVVRIT1IoIkpvbmF0aGFuIEJ1enphcmQgPGpvbmF0aGFuQGJ1enphcmQub3JnLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUb3NoaWJhIGxhcHRvcCBTTU0gZHJpdmVyIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgidG9zaGliYSIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvdHBtL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5Njk3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci90cG0vS2NvbmZpZwpAQCAtMCwwICsxLDM5IEBACisjCisjIFRQTSBkZXZpY2UgY29uZmlndXJhdGlvbgorIworCittZW51ICJUUE0gZGV2aWNlcyIKKworY29uZmlnIFRDR19UUE0KKwl0cmlzdGF0ZSAiVFBNIEhhcmR3YXJlIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgUENJCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBUUE0gc2VjdXJpdHkgY2hpcCBpbiB5b3VyIHN5c3RlbSwgd2hpY2gKKwkgIGltcGxlbWVudHMgdGhlIFRydXN0ZWQgQ29tcHV0aW5nIEdyb3VwJ3Mgc3BlY2lmaWNhdGlvbiwKKwkgIHNheSBZZXMgYW5kIGl0IHdpbGwgYmUgYWNjZXNzaWJsZSBmcm9tIHdpdGhpbiBMaW51eC4gIEZvcgorCSAgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGh0dHA6Ly93d3cudHJ1c3RlZGNvbXB1dGluZ2dyb3VwLm9yZz4uIAorCSAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRydXN0ZWQgU29mdHdhcmUgU3RhY2sgKFRTUyksIHRoZSAKKwkgIHVzZXJzcGFjZSBlbmFibGVtZW50IHBpZWNlIG9mIHRoZSBzcGVjaWZpY2F0aW9uLCBjYW4gYmUgCisJICBvYnRhaW5lZCBhdDogPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHJvdXNlcnM+LiAgVG8gCisJICBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOyB0aGUgbW9kdWxlIAorCSAgd2lsbCBiZSBjYWxsZWQgdHBtLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVENHX05TQworCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIFRQTSBJbnRlcmZhY2UiCisJZGVwZW5kcyBvbiBUQ0dfVFBNCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBUUE0gc2VjdXJpdHkgY2hpcCBmcm9tIE5hdGlvbmFsIFNlbWljb25kdXRvciAKKwkgIHNheSBZZXMgYW5kIGl0IHdpbGwgYmUgYWNjZXNzaWJsZSBmcm9tIHdpdGhpbiBMaW51eC4gIFRvIAorCSAgY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTsgdGhlIG1vZHVsZSAKKwkgIHdpbGwgYmUgY2FsbGVkIHRwbV9uc2MuCisKK2NvbmZpZyBUQ0dfQVRNRUwKKwl0cmlzdGF0ZSAiQXRtZWwgVFBNIEludGVyZmFjZSIKKwlkZXBlbmRzIG9uIFRDR19UUE0KKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIFRQTSBzZWN1cml0eSBjaGlwIGZyb20gQXRtZWwgc2F5IFllcyBhbmQgaXQgCisJICB3aWxsIGJlIGFjY2Vzc2libGUgZnJvbSB3aXRoaW4gTGludXguICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIAorCSAgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU7IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdHBtX2F0bWVsLgorCitlbmRtZW51CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvdHBtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNmQzZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdHBtL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGtlcm5lbCB0cG0gZGV2aWNlIGRyaXZlcnMuCisjCitvYmotJChDT05GSUdfVENHX1RQTSkgKz0gdHBtLm8KK29iai0kKENPTkZJR19UQ0dfTlNDKSArPSB0cG1fbnNjLm8KK29iai0kKENPTkZJR19UQ0dfQVRNRUwpICs9IHRwbV9hdG1lbC5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMTgyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jCkBAIC0wLDAgKzEsNjk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIEF1dGhvcnM6CisgKiBMZWVuZGVydCB2YW4gRG9vcm4gPGxlZW5kZXJ0QHdhdHNvbi5pYm0uY29tPgorICogRGF2ZSBTYWZmb3JkIDxzYWZmb3JkQHdhdHNvbi5pYm0uY29tPgorICogUmVpbmVyIFNhaWxlciA8c2FpbGVyQHdhdHNvbi5pYm0uY29tPgorICogS3lsZW5lIEhhbGwgPGtqaGFsbEB1cy5pYm0uY29tPgorICoKKyAqIE1haW50YWluZWQgYnk6IDx0cG1kZF9kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogRGV2aWNlIGRyaXZlciBmb3IgVENHL1RDUEEgVFBNICh0cnVzdGVkIHBsYXRmb3JtIG1vZHVsZSkuCisgKiBTcGVjaWZpY2F0aW9ucyBhdCB3d3cudHJ1c3RlZGNvbXB1dGluZ2dyb3VwLm9yZwkgCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICogCisgKiBOb3RlLCB0aGUgVFBNIGNoaXAgaXMgbm90IGludGVycnVwdCBkcml2ZW4gKG9ubHkgcG9sbGluZykKKyAqIGFuZCBjYW4gaGF2ZSB2ZXJ5IGxvbmcgdGltZW91dHMgKG1pbnV0ZXMhKS4gSGVuY2UgdGhlIHVudXN1YWwKKyAqIGNhbGxzIHRvIHNjaGVkdWxlX3RpbWVvdXQuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInRwbS5oIgorCisjZGVmaW5lCVRQTV9NSU5PUgkJCTIyNAkvKiBvZmZpY2lhbGx5IGFzc2lnbmVkICovCisKKyNkZWZpbmUJVFBNX0JVRlNJWkUJCQkyMDQ4CisKKy8qIFBDSSBjb25maWd1cmF0aW9uIGFkZHJlc3NlcyAqLworI2RlZmluZQlQQ0lfR0VOX1BNQ09OXzEJCQkweEEwCisjZGVmaW5lCVBDSV9HRU4xX0RFQwkJCTB4RTQKKyNkZWZpbmUJUENJX0xQQ19FTgkJCTB4RTYKKyNkZWZpbmUJUENJX0dFTjJfREVDCQkJMHhFQworCitzdGF0aWMgTElTVF9IRUFEKHRwbV9jaGlwX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhkcml2ZXJfbG9jayk7CitzdGF0aWMgaW50IGRldl9tYXNrWzMyXTsKKworc3RhdGljIHZvaWQgdXNlcl9yZWFkZXJfdGltZW91dCh1bnNpZ25lZCBsb25nIHB0cikKK3sKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSAoc3RydWN0IHRwbV9jaGlwICopIHB0cjsKKworCWRvd24oJmNoaXAtPmJ1ZmZlcl9tdXRleCk7CisJYXRvbWljX3NldCgmY2hpcC0+ZGF0YV9wZW5kaW5nLCAwKTsKKwltZW1zZXQoY2hpcC0+ZGF0YV9idWZmZXIsIDAsIFRQTV9CVUZTSVpFKTsKKwl1cCgmY2hpcC0+YnVmZmVyX211dGV4KTsKK30KKwordm9pZCB0cG1fdGltZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgcHRyKQoreworCWludCAqZXhwID0gKGludCAqKSBwdHI7CisJKmV4cCA9IDE7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHRwbV90aW1lX2V4cGlyZWQpOworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgTFBDIGJ1cyBhbmQgZW5hYmxlIHRoZSBUUE0gcG9ydHMKKyAqLworaW50IHRwbV9scGNfYnVzX2luaXQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHUxNiBiYXNlKQoreworCXUzMiBscGNlbmFibGUsIHRtcDsKKwlpbnQgaXNfbHBjbSA9IDA7CisKKwlzd2l0Y2ggKHBjaV9kZXYtPnZlbmRvcikgeworCWNhc2UgUENJX1ZFTkRPUl9JRF9JTlRFTDoKKwkJc3dpdGNoIChwY2lfZGV2LT5kZXZpY2UpIHsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTI6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzEyOgorCQkJaXNfbHBjbSA9IDE7CisJCQlicmVhazsKKwkJfQorCQkvKiBpbml0IElDSCAoZW5hYmxlIExQQykgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9HRU4xX0RFQywgJmxwY2VuYWJsZSk7CisJCWxwY2VuYWJsZSB8PSAweDIwMDAwMDAwOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9HRU4xX0RFQywgbHBjZW5hYmxlKTsKKworCQlpZiAoaXNfbHBjbSkgeworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9HRU4xX0RFQywKKwkJCQkJICAgICAgJmxwY2VuYWJsZSk7CisJCQlpZiAoKGxwY2VuYWJsZSAmIDB4MjAwMDAwMDApID09IDApIHsKKwkJCQlkZXZfZXJyKCZwY2lfZGV2LT5kZXYsCisJCQkJCSJjYW5ub3QgZW5hYmxlIExQQ1xuIik7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCX0KKworCQkvKiBpbml0aWFsaXplIFRQTSByZWdpc3RlcnMgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9HRU4yX0RFQywgJnRtcCk7CisKKwkJaWYgKCFpc19scGNtKQorCQkJdG1wID0gKHRtcCAmIDB4RkZGRjAwMDApIHwgKGJhc2UgJiAweEZGRjApOworCQllbHNlCisJCQl0bXAgPQorCQkJICAgICh0bXAgJiAweEZGRkYwMDAwKSB8IChiYXNlICYgMHhGRkYwKSB8CisJCQkgICAgMHgwMDAwMDAwMTsKKworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9HRU4yX0RFQywgdG1wKTsKKworCQlpZiAoaXNfbHBjbSkgeworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9HRU5fUE1DT05fMSwKKwkJCQkJICAgICAgJnRtcCk7CisJCQl0bXAgfD0gMHgwMDAwMDAwNDsJLyogZW5hYmxlIENMS1JVTiAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCBQQ0lfR0VOX1BNQ09OXzEsCisJCQkJCSAgICAgICB0bXApOworCQl9CisJCXRwbV93cml0ZV9pbmRleCgweDBELCAweDU1KTsJLyogdW5sb2NrIDRGICovCisJCXRwbV93cml0ZV9pbmRleCgweDBBLCAweDAwKTsJLyogaW50IGRpc2FibGUgKi8KKwkJdHBtX3dyaXRlX2luZGV4KDB4MDgsIGJhc2UpOwkvKiBiYXNlIGFkZHIgbG8gKi8KKwkJdHBtX3dyaXRlX2luZGV4KDB4MDksIChiYXNlICYgMHhGRjAwKSA+PiA4KTsJLyogYmFzZSBhZGRyIGhpICovCisJCXRwbV93cml0ZV9pbmRleCgweDBELCAweEFBKTsJLyogbG9jayA0RiAqLworCQlicmVhazsKKwljYXNlIFBDSV9WRU5ET1JfSURfQU1EOgorCQkvKiBub3RoaW5nIHlldCAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHBtX2xwY19idXNfaW5pdCk7CisKKy8qCisgKiBJbnRlcm5hbCBrZXJuZWwgaW50ZXJmYWNlIHRvIHRyYW5zbWl0IFRQTSBjb21tYW5kcworICovCitzdGF0aWMgc3NpemVfdCB0cG1fdHJhbnNtaXQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCBjb25zdCBjaGFyICpidWYsCisJCQkgICAgc2l6ZV90IGJ1ZnNpeikKK3sKKwlzc2l6ZV90IGxlbjsKKwl1MzIgY291bnQ7CisJX19iZTMyICpuYXRpdmVfc2l6ZTsKKworCW5hdGl2ZV9zaXplID0gKF9fZm9yY2UgX19iZTMyICopIChidWYgKyAyKTsKKwljb3VudCA9IGJlMzJfdG9fY3B1KCpuYXRpdmVfc2l6ZSk7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIC1FTk9EQVRBOworCWlmIChjb3VudCA+IGJ1ZnNpeikgeworCQlkZXZfZXJyKCZjaGlwLT5wY2lfZGV2LT5kZXYsCisJCQkiaW52YWxpZCBjb3VudCB2YWx1ZSAleCAleCBcbiIsIGNvdW50LCBidWZzaXopOworCQlyZXR1cm4gLUUyQklHOworCX0KKworCWRvd24oJmNoaXAtPnRwbV9tdXRleCk7CisKKwlpZiAoKGxlbiA9IGNoaXAtPnZlbmRvci0+c2VuZChjaGlwLCAodTggKikgYnVmLCBjb3VudCkpIDwgMCkgeworCQlkZXZfZXJyKCZjaGlwLT5wY2lfZGV2LT5kZXYsCisJCQkidHBtX3RyYW5zbWl0OiB0cG1fc2VuZDogZXJyb3IgJWRcbiIsIGxlbik7CisJCXJldHVybiBsZW47CisJfQorCisJZG93bigmY2hpcC0+dGltZXJfbWFuaXB1bGF0aW9uX211dGV4KTsKKwljaGlwLT50aW1lX2V4cGlyZWQgPSAwOworCWluaXRfdGltZXIoJmNoaXAtPmRldmljZV90aW1lcik7CisJY2hpcC0+ZGV2aWNlX3RpbWVyLmZ1bmN0aW9uID0gdHBtX3RpbWVfZXhwaXJlZDsKKwljaGlwLT5kZXZpY2VfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAyICogNjAgKiBIWjsKKwljaGlwLT5kZXZpY2VfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmY2hpcC0+dGltZV9leHBpcmVkOworCWFkZF90aW1lcigmY2hpcC0+ZGV2aWNlX3RpbWVyKTsKKwl1cCgmY2hpcC0+dGltZXJfbWFuaXB1bGF0aW9uX211dGV4KTsKKworCWRvIHsKKwkJdTggc3RhdHVzID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIDEpOworCQlpZiAoKHN0YXR1cyAmIGNoaXAtPnZlbmRvci0+cmVxX2NvbXBsZXRlX21hc2spID09CisJCSAgICBjaGlwLT52ZW5kb3ItPnJlcV9jb21wbGV0ZV92YWwpIHsKKwkJCWRvd24oJmNoaXAtPnRpbWVyX21hbmlwdWxhdGlvbl9tdXRleCk7CisJCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZjaGlwLT5kZXZpY2VfdGltZXIpOworCQkJdXAoJmNoaXAtPnRpbWVyX21hbmlwdWxhdGlvbl9tdXRleCk7CisJCQlnb3RvIG91dF9yZWN2OworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChUUE1fVElNRU9VVCk7CisJCXJtYigpOworCX0gd2hpbGUgKCFjaGlwLT50aW1lX2V4cGlyZWQpOworCisKKwljaGlwLT52ZW5kb3ItPmNhbmNlbChjaGlwKTsKKwlkZXZfZXJyKCZjaGlwLT5wY2lfZGV2LT5kZXYsICJUaW1lIGV4cGlyZWRcbiIpOworCXVwKCZjaGlwLT50cG1fbXV0ZXgpOworCXJldHVybiAtRUlPOworCitvdXRfcmVjdjoKKwlsZW4gPSBjaGlwLT52ZW5kb3ItPnJlY3YoY2hpcCwgKHU4ICopIGJ1ZiwgYnVmc2l6KTsKKwlpZiAobGVuIDwgMCkKKwkJZGV2X2VycigmY2hpcC0+cGNpX2Rldi0+ZGV2LAorCQkJInRwbV90cmFuc21pdDogdHBtX3JlY3Y6IGVycm9yICVkXG4iLCBsZW4pOworCXVwKCZjaGlwLT50cG1fbXV0ZXgpOworCXJldHVybiBsZW47Cit9CisKKyNkZWZpbmUgVFBNX0RJR0VTVF9TSVpFIDIwCisjZGVmaW5lIENBUF9QQ1JfUkVTVUxUX1NJWkUgMTgKK3N0YXRpYyB1OCBjYXBfcGNyW10gPSB7CisJMCwgMTkzLAkJCS8qIFRQTV9UQUdfUlFVX0NPTU1BTkQgKi8KKwkwLCAwLCAwLCAyMiwJCS8qIGxlbmd0aCAqLworCTAsIDAsIDAsIDEwMSwJCS8qIFRQTV9PUkRfR2V0Q2FwYWJpbGl0eSAqLworCTAsIDAsIDAsIDUsCisJMCwgMCwgMCwgNCwKKwkwLCAwLCAxLCAxCit9OworCisjZGVmaW5lIFJFQURfUENSX1JFU1VMVF9TSVpFIDMwCitzdGF0aWMgdTggcGNycmVhZFtdID0geworCTAsIDE5MywJCQkvKiBUUE1fVEFHX1JRVV9DT01NQU5EICovCisJMCwgMCwgMCwgMTQsCQkvKiBsZW5ndGggKi8KKwkwLCAwLCAwLCAyMSwJCS8qIFRQTV9PUkRfUGNyUmVhZCAqLworCTAsIDAsIDAsIDAJCS8qIFBDUiBpbmRleCAqLworfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19wY3JzKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXU4IGRhdGFbUkVBRF9QQ1JfUkVTVUxUX1NJWkVdOworCXNzaXplX3QgbGVuOworCWludCBpLCBqLCBpbmRleCwgbnVtX3BjcnM7CisJY2hhciAqc3RyID0gYnVmOworCisJc3RydWN0IHRwbV9jaGlwICpjaGlwID0KKwkgICAgcGNpX2dldF9kcnZkYXRhKGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwY2lfZGV2LCBkZXYpKTsKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW1lbWNweShkYXRhLCBjYXBfcGNyLCBzaXplb2YoY2FwX3BjcikpOworCWlmICgobGVuID0gdHBtX3RyYW5zbWl0KGNoaXAsIGRhdGEsIHNpemVvZihkYXRhKSkpCisJICAgIDwgQ0FQX1BDUl9SRVNVTFRfU0laRSkKKwkJcmV0dXJuIGxlbjsKKworCW51bV9wY3JzID0gYmUzMl90b19jcHUoKigoX19mb3JjZSBfX2JlMzIgKikgKGRhdGEgKyAxNCkpKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGNyczsgaSsrKSB7CisJCW1lbWNweShkYXRhLCBwY3JyZWFkLCBzaXplb2YocGNycmVhZCkpOworCQlpbmRleCA9IGNwdV90b19iZTMyKGkpOworCQltZW1jcHkoZGF0YSArIDEwLCAmaW5kZXgsIDQpOworCQlpZiAoKGxlbiA9IHRwbV90cmFuc21pdChjaGlwLCBkYXRhLCBzaXplb2YoZGF0YSkpKQorCQkgICAgPCBSRUFEX1BDUl9SRVNVTFRfU0laRSkKKwkJCXJldHVybiBsZW47CisJCXN0ciArPSBzcHJpbnRmKHN0ciwgIlBDUi0lMDJkOiAiLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IFRQTV9ESUdFU1RfU0laRTsgaisrKQorCQkJc3RyICs9IHNwcmludGYoc3RyLCAiJTAyWCAiLCAqKGRhdGEgKyAxMCArIGopKTsKKwkJc3RyICs9IHNwcmludGYoc3RyLCAiXG4iKTsKKwl9CisJcmV0dXJuIHN0ciAtIGJ1ZjsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHBjcnMsIFNfSVJVR08sIHNob3dfcGNycywgTlVMTCk7CisKKyNkZWZpbmUgIFJFQURfUFVCRUtfUkVTVUxUX1NJWkUgMzE0CitzdGF0aWMgdTggcmVhZHB1YmVrW10gPSB7CisJMCwgMTkzLAkJCS8qIFRQTV9UQUdfUlFVX0NPTU1BTkQgKi8KKwkwLCAwLCAwLCAzMCwJCS8qIGxlbmd0aCAqLworCTAsIDAsIDAsIDEyNCwJCS8qIFRQTV9PUkRfUmVhZFB1YmVrICovCit9OworCitzdGF0aWMgc3NpemVfdCBzaG93X3B1YmVrKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXU4IGRhdGFbUkVBRF9QVUJFS19SRVNVTFRfU0laRV07CisJc3NpemVfdCBsZW47CisJX19iZTMyICpuYXRpdmVfdmFsOworCWludCBpOworCWNoYXIgKnN0ciA9IGJ1ZjsKKworCXN0cnVjdCB0cG1fY2hpcCAqY2hpcCA9CisJICAgIHBjaV9nZXRfZHJ2ZGF0YShjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGNpX2RldiwgZGV2KSk7CisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltZW1jcHkoZGF0YSwgcmVhZHB1YmVrLCBzaXplb2YocmVhZHB1YmVrKSk7CisJbWVtc2V0KGRhdGEgKyBzaXplb2YocmVhZHB1YmVrKSwgMCwgMjApOwkvKiB6ZXJvIG5vbmNlICovCisKKwlpZiAoKGxlbiA9IHRwbV90cmFuc21pdChjaGlwLCBkYXRhLCBzaXplb2YoZGF0YSkpKSA8CisJICAgIFJFQURfUFVCRUtfUkVTVUxUX1NJWkUpCisJCXJldHVybiBsZW47CisKKwkvKiAKKwkgICBpZ25vcmUgaGVhZGVyIDEwIGJ5dGVzCisJICAgYWxnb3JpdGhtIDMyIGJpdHMgKDEgPT0gUlNBICkKKwkgICBlbmNzY2hlbWUgMTYgYml0cworCSAgIHNpZ3NjaGVtZSAxNiBiaXRzCisJICAgcGFyYW1ldGVycyAoUlNBIDEyLT5ieXRlczoga2V5Yml0LCAjcHJpbWVzLCBleHBiaXQpICAKKwkgICBrZXlsZW5ieXRlcyAzMiBiaXRzCisJICAgMjU2IGJ5dGUgbW9kdWx1cworCSAgIGlnbm9yZSBjaGVja3N1bSAyMCBieXRlcworCSAqLworCisJbmF0aXZlX3ZhbCA9IChfX2ZvcmNlIF9fYmUzMiAqKSAoZGF0YSArIDM0KTsKKworCXN0ciArPQorCSAgICBzcHJpbnRmKHN0ciwKKwkJICAgICJBbGdvcml0aG06ICUwMlggJTAyWCAlMDJYICUwMlhcbkVuY3NjaGVtZTogJTAyWCAlMDJYXG4iCisJCSAgICAiU2lnc2NoZW1lOiAlMDJYICUwMlhcblBhcmFtZXRlcnM6ICUwMlggJTAyWCAlMDJYICUwMlgiCisJCSAgICAiICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIgorCQkgICAgIk1vZHVsdXMgbGVuZ3RoOiAlZFxuTW9kdWx1czogXG4iLAorCQkgICAgZGF0YVsxMF0sIGRhdGFbMTFdLCBkYXRhWzEyXSwgZGF0YVsxM10sIGRhdGFbMTRdLAorCQkgICAgZGF0YVsxNV0sIGRhdGFbMTZdLCBkYXRhWzE3XSwgZGF0YVsyMl0sIGRhdGFbMjNdLAorCQkgICAgZGF0YVsyNF0sIGRhdGFbMjVdLCBkYXRhWzI2XSwgZGF0YVsyN10sIGRhdGFbMjhdLAorCQkgICAgZGF0YVsyOV0sIGRhdGFbMzBdLCBkYXRhWzMxXSwgZGF0YVszMl0sIGRhdGFbMzNdLAorCQkgICAgYmUzMl90b19jcHUoKm5hdGl2ZV92YWwpCisJICAgICk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJc3RyICs9IHNwcmludGYoc3RyLCAiJTAyWCAiLCBkYXRhW2kgKyAzOV0pOworCQlpZiAoKGkgKyAxKSAlIDE2ID09IDApCisJCQlzdHIgKz0gc3ByaW50ZihzdHIsICJcbiIpOworCX0KKwlyZXR1cm4gc3RyIC0gYnVmOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIocHViZWssIFNfSVJVR08sIHNob3dfcHViZWssIE5VTEwpOworCisjZGVmaW5lIENBUF9WRVJfUkVTVUxUX1NJWkUgMTgKK3N0YXRpYyB1OCBjYXBfdmVyc2lvbltdID0geworCTAsIDE5MywJCQkvKiBUUE1fVEFHX1JRVV9DT01NQU5EICovCisJMCwgMCwgMCwgMTgsCQkvKiBsZW5ndGggKi8KKwkwLCAwLCAwLCAxMDEsCQkvKiBUUE1fT1JEX0dldENhcGFiaWxpdHkgKi8KKwkwLCAwLCAwLCA2LAorCTAsIDAsIDAsIDAKK307CisKKyNkZWZpbmUgQ0FQX01BTlVGQUNUVVJFUl9SRVNVTFRfU0laRSAxOAorc3RhdGljIHU4IGNhcF9tYW51ZmFjdHVyZXJbXSA9IHsKKwkwLCAxOTMsCQkJLyogVFBNX1RBR19SUVVfQ09NTUFORCAqLworCTAsIDAsIDAsIDIyLAkJLyogbGVuZ3RoICovCisJMCwgMCwgMCwgMTAxLAkJLyogVFBNX09SRF9HZXRDYXBhYmlsaXR5ICovCisJMCwgMCwgMCwgNSwKKwkwLCAwLCAwLCA0LAorCTAsIDAsIDEsIDMKK307CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfY2FwcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwl1OCBkYXRhW1JFQURfUFVCRUtfUkVTVUxUX1NJWkVdOworCXNzaXplX3QgbGVuOworCWNoYXIgKnN0ciA9IGJ1ZjsKKworCXN0cnVjdCB0cG1fY2hpcCAqY2hpcCA9CisJICAgIHBjaV9nZXRfZHJ2ZGF0YShjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGNpX2RldiwgZGV2KSk7CisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltZW1jcHkoZGF0YSwgY2FwX21hbnVmYWN0dXJlciwgc2l6ZW9mKGNhcF9tYW51ZmFjdHVyZXIpKTsKKworCWlmICgobGVuID0gdHBtX3RyYW5zbWl0KGNoaXAsIGRhdGEsIHNpemVvZihkYXRhKSkpIDwKKwkgICAgQ0FQX01BTlVGQUNUVVJFUl9SRVNVTFRfU0laRSkKKwkJcmV0dXJuIGxlbjsKKworCXN0ciArPSBzcHJpbnRmKHN0ciwgIk1hbnVmYWN0dXJlcjogMHgleFxuIiwKKwkJICAgICAgIGJlMzJfdG9fY3B1KCooZGF0YSArIDE0KSkpOworCisJbWVtY3B5KGRhdGEsIGNhcF92ZXJzaW9uLCBzaXplb2YoY2FwX3ZlcnNpb24pKTsKKworCWlmICgobGVuID0gdHBtX3RyYW5zbWl0KGNoaXAsIGRhdGEsIHNpemVvZihkYXRhKSkpIDwKKwkgICAgQ0FQX1ZFUl9SRVNVTFRfU0laRSkKKwkJcmV0dXJuIGxlbjsKKworCXN0ciArPQorCSAgICBzcHJpbnRmKHN0ciwgIlRDRyB2ZXJzaW9uOiAlZC4lZFxuRmlybXdhcmUgdmVyc2lvbjogJWQuJWRcbiIsCisJCSAgICAoaW50KSBkYXRhWzE0XSwgKGludCkgZGF0YVsxNV0sIChpbnQpIGRhdGFbMTZdLAorCQkgICAgKGludCkgZGF0YVsxN10pOworCisJcmV0dXJuIHN0ciAtIGJ1ZjsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGNhcHMsIFNfSVJVR08sIHNob3dfY2FwcywgTlVMTCk7CisKKy8qCisgKiBEZXZpY2UgZmlsZSBzeXN0ZW0gaW50ZXJmYWNlIHRvIHRoZSBUUE0KKyAqLworaW50IHRwbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByYyA9IDAsIG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSBOVUxMLCAqcG9zOworCisJc3Bpbl9sb2NrKCZkcml2ZXJfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnRwbV9jaGlwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHBvcy0+dmVuZG9yLT5taXNjZGV2Lm1pbm9yID09IG1pbm9yKSB7CisJCQljaGlwID0gcG9zOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWlmIChjaGlwLT5udW1fb3BlbnMpIHsKKwkJZGV2X2RiZygmY2hpcC0+cGNpX2Rldi0+ZGV2LAorCQkJIkFub3RoZXIgcHJvY2VzcyBvd25zIHRoaXMgVFBNXG4iKTsKKwkJcmMgPSAtRUJVU1k7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwljaGlwLT5udW1fb3BlbnMrKzsKKwlwY2lfZGV2X2dldChjaGlwLT5wY2lfZGV2KTsKKworCXNwaW5fdW5sb2NrKCZkcml2ZXJfbG9jayk7CisKKwljaGlwLT5kYXRhX2J1ZmZlciA9IGttYWxsb2MoVFBNX0JVRlNJWkUgKiBzaXplb2YodTgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hpcC0+ZGF0YV9idWZmZXIgPT0gTlVMTCkgeworCQljaGlwLT5udW1fb3BlbnMtLTsKKwkJcGNpX2Rldl9wdXQoY2hpcC0+cGNpX2Rldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWF0b21pY19zZXQoJmNoaXAtPmRhdGFfcGVuZGluZywgMCk7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCXJldHVybiAwOworCitlcnJfb3V0OgorCXNwaW5fdW5sb2NrKCZkcml2ZXJfbG9jayk7CisJcmV0dXJuIHJjOworfQorCitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fb3Blbik7CisKK2ludCB0cG1fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKworCXNwaW5fbG9jaygmZHJpdmVyX2xvY2spOworCWNoaXAtPm51bV9vcGVucy0tOworCXNwaW5fdW5sb2NrKCZkcml2ZXJfbG9jayk7CisKKwlkb3duKCZjaGlwLT50aW1lcl9tYW5pcHVsYXRpb25fbXV0ZXgpOworCWlmICh0aW1lcl9wZW5kaW5nKCZjaGlwLT51c2VyX3JlYWRfdGltZXIpKQorCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZjaGlwLT51c2VyX3JlYWRfdGltZXIpOworCWVsc2UgaWYgKHRpbWVyX3BlbmRpbmcoJmNoaXAtPmRldmljZV90aW1lcikpCisJCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJmNoaXAtPmRldmljZV90aW1lcik7CisJdXAoJmNoaXAtPnRpbWVyX21hbmlwdWxhdGlvbl9tdXRleCk7CisKKwlrZnJlZShjaGlwLT5kYXRhX2J1ZmZlcik7CisJYXRvbWljX3NldCgmY2hpcC0+ZGF0YV9wZW5kaW5nLCAwKTsKKworCXBjaV9kZXZfcHV0KGNoaXAtPnBjaV9kZXYpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fcmVsZWFzZSk7CisKK3NzaXplX3QgdHBtX3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCisJCSAgc2l6ZV90IHNpemUsIGxvZmZfdCAqIG9mZikKK3sKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IGluX3NpemUgPSBzaXplLCBvdXRfc2l6ZTsKKworCS8qIGNhbm5vdCBwZXJmb3JtIGEgd3JpdGUgdW50aWwgdGhlIHJlYWQgaGFzIGNsZWFyZWQKKwkgICBlaXRoZXIgdmlhIHRwbV9yZWFkIG9yIGEgdXNlcl9yZWFkX3RpbWVyIHRpbWVvdXQgKi8KKwl3aGlsZSAoYXRvbWljX3JlYWQoJmNoaXAtPmRhdGFfcGVuZGluZykgIT0gMCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoVFBNX1RJTUVPVVQpOworCX0KKworCWRvd24oJmNoaXAtPmJ1ZmZlcl9tdXRleCk7CisKKwlpZiAoaW5fc2l6ZSA+IFRQTV9CVUZTSVpFKQorCQlpbl9zaXplID0gVFBNX0JVRlNJWkU7CisKKwlpZiAoY29weV9mcm9tX3VzZXIKKwkgICAgKGNoaXAtPmRhdGFfYnVmZmVyLCAodm9pZCBfX3VzZXIgKikgYnVmLCBpbl9zaXplKSkgeworCQl1cCgmY2hpcC0+YnVmZmVyX211dGV4KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogYXRvbWljIHRwbSBjb21tYW5kIHNlbmQgYW5kIHJlc3VsdCByZWNlaXZlICovCisJb3V0X3NpemUgPSB0cG1fdHJhbnNtaXQoY2hpcCwgY2hpcC0+ZGF0YV9idWZmZXIsIFRQTV9CVUZTSVpFKTsKKworCWF0b21pY19zZXQoJmNoaXAtPmRhdGFfcGVuZGluZywgb3V0X3NpemUpOworCXVwKCZjaGlwLT5idWZmZXJfbXV0ZXgpOworCisJLyogU2V0IGEgdGltZW91dCBieSB3aGljaCB0aGUgcmVhZGVyIG11c3QgY29tZSBjbGFpbSB0aGUgcmVzdWx0ICovCisJZG93bigmY2hpcC0+dGltZXJfbWFuaXB1bGF0aW9uX211dGV4KTsKKwlpbml0X3RpbWVyKCZjaGlwLT51c2VyX3JlYWRfdGltZXIpOworCWNoaXAtPnVzZXJfcmVhZF90aW1lci5mdW5jdGlvbiA9IHVzZXJfcmVhZGVyX3RpbWVvdXQ7CisJY2hpcC0+dXNlcl9yZWFkX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY2hpcDsKKwljaGlwLT51c2VyX3JlYWRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoNjAgKiBIWik7CisJYWRkX3RpbWVyKCZjaGlwLT51c2VyX3JlYWRfdGltZXIpOworCXVwKCZjaGlwLT50aW1lcl9tYW5pcHVsYXRpb25fbXV0ZXgpOworCisJcmV0dXJuIGluX3NpemU7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHRwbV93cml0ZSk7CisKK3NzaXplX3QgdHBtX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJIHNpemVfdCBzaXplLCBsb2ZmX3QgKiBvZmYpCit7CisJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXRfc2l6ZSA9IC1FTk9EQVRBOworCisJaWYgKGF0b21pY19yZWFkKCZjaGlwLT5kYXRhX3BlbmRpbmcpICE9IDApIHsJLyogUmVzdWx0IGF2YWlsYWJsZSAqLworCQlkb3duKCZjaGlwLT50aW1lcl9tYW5pcHVsYXRpb25fbXV0ZXgpOworCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZjaGlwLT51c2VyX3JlYWRfdGltZXIpOworCQl1cCgmY2hpcC0+dGltZXJfbWFuaXB1bGF0aW9uX211dGV4KTsKKworCQlkb3duKCZjaGlwLT5idWZmZXJfbXV0ZXgpOworCisJCXJldF9zaXplID0gYXRvbWljX3JlYWQoJmNoaXAtPmRhdGFfcGVuZGluZyk7CisJCWF0b21pY19zZXQoJmNoaXAtPmRhdGFfcGVuZGluZywgMCk7CisKKwkJaWYgKHJldF9zaXplID09IDApCS8qIHRpbWVvdXQganVzdCBvY2N1cnJlZCAqLworCQkJcmV0X3NpemUgPSAtRVRJTUU7CisJCWVsc2UgaWYgKHJldF9zaXplID4gMCkgewkvKiByZWxheSBkYXRhICovCisJCQlpZiAoc2l6ZSA8IHJldF9zaXplKQorCQkJCXJldF9zaXplID0gc2l6ZTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgYnVmLAorCQkJCQkgY2hpcC0+ZGF0YV9idWZmZXIsIHJldF9zaXplKSkgeworCQkJCXJldF9zaXplID0gLUVGQVVMVDsKKwkJCX0KKwkJfQorCQl1cCgmY2hpcC0+YnVmZmVyX211dGV4KTsKKwl9CisKKwlyZXR1cm4gcmV0X3NpemU7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHRwbV9yZWFkKTsKKwordm9pZCBfX2RldmV4aXQgdHBtX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBjaV9kZXYtPmRldiwgIk5vIGRldmljZSBkYXRhIGZvdW5kXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9jaygmZHJpdmVyX2xvY2spOworCisJbGlzdF9kZWwoJmNoaXAtPmxpc3QpOworCisJc3Bpbl91bmxvY2soJmRyaXZlcl9sb2NrKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKKwltaXNjX2RlcmVnaXN0ZXIoJmNoaXAtPnZlbmRvci0+bWlzY2Rldik7CisKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBjaV9kZXYtPmRldiwgJmRldl9hdHRyX3B1YmVrKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBjaV9kZXYtPmRldiwgJmRldl9hdHRyX3BjcnMpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGNpX2Rldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwcyk7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7CisKKwlkZXZfbWFza1tjaGlwLT5kZXZfbnVtIC8gMzJdICY9ICEoMSA8PCAoY2hpcC0+ZGV2X251bSAlIDMyKSk7CisKKwlrZnJlZShjaGlwKTsKKworCXBjaV9kZXZfcHV0KHBjaV9kZXYpOworfQorCitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fcmVtb3ZlKTsKKworc3RhdGljIHU4IHNhdmVzdGF0ZVtdID0geworCTAsIDE5MywJCQkvKiBUUE1fVEFHX1JRVV9DT01NQU5EICovCisJMCwgMCwgMCwgMTAsCQkvKiBibG9iIGxlbmd0aCAoaW4gYnl0ZXMpICovCisJMCwgMCwgMCwgMTUyCQkvKiBUUE1fT1JEX1NhdmVTdGF0ZSAqLworfTsKKworLyoKKyAqIFdlIGFyZSBhYm91dCB0byBzdXNwZW5kLiBTYXZlIHRoZSBUUE0gc3RhdGUKKyAqIHNvIHRoYXQgaXQgY2FuIGJlIHJlc3RvcmVkLgorICovCitpbnQgdHBtX3BtX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHUzMiBwbV9zdGF0ZSkKK3sKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl0cG1fdHJhbnNtaXQoY2hpcCwgc2F2ZXN0YXRlLCBzaXplb2Yoc2F2ZXN0YXRlKSk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHRwbV9wbV9zdXNwZW5kKTsKKworLyoKKyAqIFJlc3VtZSBmcm9tIGEgcG93ZXIgc2FmZS4gVGhlIEJJT1MgYWxyZWFkeSByZXN0b3JlZAorICogdGhlIFRQTSBzdGF0ZS4KKyAqLworaW50IHRwbV9wbV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzcGluX2xvY2soJmRyaXZlcl9sb2NrKTsKKwl0cG1fbHBjX2J1c19pbml0KHBjaV9kZXYsIGNoaXAtPnZlbmRvci0+YmFzZSk7CisJc3Bpbl91bmxvY2soJmRyaXZlcl9sb2NrKTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fcG1fcmVzdW1lKTsKKworLyoKKyAqIENhbGxlZCBmcm9tIHRwbV88c3BlY2lmaWM+LmMgcHJvYmUgZnVuY3Rpb24gb25seSBmb3IgZGV2aWNlcyAKKyAqIHRoZSBkcml2ZXIgaGFzIGRldGVybWluZWQgaXQgc2hvdWxkIGNsYWltLiAgUHJpb3IgdG8gY2FsbGluZworICogdGhpcyBmdW5jdGlvbiB0aGUgc3BlY2lmaWMgcHJvYmUgZnVuY3Rpb24gaGFzIGNhbGxlZCBwY2lfZW5hYmxlX2RldmljZQorICogdXBvbiBlcnJhbnQgZXhpdCBmcm9tIHRoaXMgZnVuY3Rpb24gc3BlY2lmaWMgcHJvYmUgZnVuY3Rpb24gc2hvdWxkIGNhbGwKKyAqIHBjaV9kaXNhYmxlX2RldmljZQorICovCitpbnQgdHBtX3JlZ2lzdGVyX2hhcmR3YXJlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAorCQkJICBzdHJ1Y3QgdHBtX3ZlbmRvcl9zcGVjaWZpYyAqZW50cnkpCit7CisJY2hhciBkZXZuYW1lWzddOworCXN0cnVjdCB0cG1fY2hpcCAqY2hpcDsKKwlpbnQgaSwgajsKKworCS8qIERyaXZlciBzcGVjaWZpYyBwZXItZGV2aWNlIGRhdGEgKi8KKwljaGlwID0ga21hbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChjaGlwLCAwLCBzaXplb2Yoc3RydWN0IHRwbV9jaGlwKSk7CisKKwlpbml0X01VVEVYKCZjaGlwLT5idWZmZXJfbXV0ZXgpOworCWluaXRfTVVURVgoJmNoaXAtPnRwbV9tdXRleCk7CisJaW5pdF9NVVRFWCgmY2hpcC0+dGltZXJfbWFuaXB1bGF0aW9uX211dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmY2hpcC0+bGlzdCk7CisKKwljaGlwLT52ZW5kb3IgPSBlbnRyeTsKKworCWNoaXAtPmRldl9udW0gPSAtMTsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJaWYgKChkZXZfbWFza1tpXSAmICgxIDw8IGopKSA9PSAwKSB7CisJCQkJY2hpcC0+ZGV2X251bSA9IGkgKiAzMiArIGo7CisJCQkJZGV2X21hc2tbaV0gfD0gMSA8PCBqOworCQkJCWdvdG8gZGV2X251bV9zZWFyY2hfY29tcGxldGU7CisJCQl9CisKK2Rldl9udW1fc2VhcmNoX2NvbXBsZXRlOgorCWlmIChjaGlwLT5kZXZfbnVtIDwgMCkgeworCQlkZXZfZXJyKCZwY2lfZGV2LT5kZXYsCisJCQkiTm8gYXZhaWxhYmxlIHRwbSBkZXZpY2UgbnVtYmVyc1xuIik7CisJCWtmcmVlKGNoaXApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgaWYgKGNoaXAtPmRldl9udW0gPT0gMCkKKwkJY2hpcC0+dmVuZG9yLT5taXNjZGV2Lm1pbm9yID0gVFBNX01JTk9SOworCWVsc2UKKwkJY2hpcC0+dmVuZG9yLT5taXNjZGV2Lm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SOworCisJc25wcmludGYoZGV2bmFtZSwgc2l6ZW9mKGRldm5hbWUpLCAiJXMlZCIsICJ0cG0iLCBjaGlwLT5kZXZfbnVtKTsKKwljaGlwLT52ZW5kb3ItPm1pc2NkZXYubmFtZSA9IGRldm5hbWU7CisKKwljaGlwLT52ZW5kb3ItPm1pc2NkZXYuZGV2ID0gJihwY2lfZGV2LT5kZXYpOworCWNoaXAtPnBjaV9kZXYgPSBwY2lfZGV2X2dldChwY2lfZGV2KTsKKworCWlmIChtaXNjX3JlZ2lzdGVyKCZjaGlwLT52ZW5kb3ItPm1pc2NkZXYpKSB7CisJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwKKwkJCSJ1bmFibGUgdG8gbWlzY19yZWdpc3RlciAlcywgbWlub3IgJWRcbiIsCisJCQljaGlwLT52ZW5kb3ItPm1pc2NkZXYubmFtZSwKKwkJCWNoaXAtPnZlbmRvci0+bWlzY2Rldi5taW5vcik7CisJCXBjaV9kZXZfcHV0KHBjaV9kZXYpOworCQlrZnJlZShjaGlwKTsKKwkJZGV2X21hc2tbaV0gJj0gISgxIDw8IGopOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgY2hpcCk7CisKKwlsaXN0X2FkZCgmY2hpcC0+bGlzdCwgJnRwbV9jaGlwX2xpc3QpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZwY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9wdWJlayk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZwY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9wY3JzKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJnBjaV9kZXYtPmRldiwgJmRldl9hdHRyX2NhcHMpOworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHRwbV9yZWdpc3Rlcl9oYXJkd2FyZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdHBtKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3RwbSh2b2lkKQoreworCit9CisKK21vZHVsZV9pbml0KGluaXRfdHBtKTsKK21vZHVsZV9leGl0KGNsZWFudXBfdHBtKTsKKworTU9EVUxFX0FVVEhPUigiTGVlbmRlcnQgdmFuIERvb3JuIChsZWVuZGVydEB3YXRzb24uaWJtLmNvbSkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVFBNIERyaXZlciIpOworTU9EVUxFX1ZFUlNJT04oIjIuMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0uaCBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1Y2Y1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBBdXRob3JzOgorICogTGVlbmRlcnQgdmFuIERvb3JuIDxsZWVuZGVydEB3YXRzb24uaWJtLmNvbT4KKyAqIERhdmUgU2FmZm9yZCA8c2FmZm9yZEB3YXRzb24uaWJtLmNvbT4KKyAqIFJlaW5lciBTYWlsZXIgPHNhaWxlckB3YXRzb24uaWJtLmNvbT4KKyAqIEt5bGVuZSBIYWxsIDxramhhbGxAdXMuaWJtLmNvbT4KKyAqCisgKiBNYWludGFpbmVkIGJ5OiA8dHBtZGRfZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIERldmljZSBkcml2ZXIgZm9yIFRDRy9UQ1BBIFRQTSAodHJ1c3RlZCBwbGF0Zm9ybSBtb2R1bGUpLgorICogU3BlY2lmaWNhdGlvbnMgYXQgd3d3LnRydXN0ZWRjb21wdXRpbmdncm91cC5vcmcJIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqIAorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisKKyNkZWZpbmUgVFBNX1RJTUVPVVQgbXNlY3NfdG9famlmZmllcyg1KQorCisvKiBUUE0gYWRkcmVzc2VzICovCisjZGVmaW5lCVRQTV9BRERSCQkJMHg0RQorI2RlZmluZQlUUE1fREFUQQkJCTB4NEYKKworc3RydWN0IHRwbV9jaGlwOworCitzdHJ1Y3QgdHBtX3ZlbmRvcl9zcGVjaWZpYyB7CisJdTggcmVxX2NvbXBsZXRlX21hc2s7CisJdTggcmVxX2NvbXBsZXRlX3ZhbDsKKwl1MTYgYmFzZTsJCS8qIFRQTSBiYXNlIGFkZHJlc3MgKi8KKworCWludCAoKnJlY3YpIChzdHJ1Y3QgdHBtX2NoaXAgKiwgdTggKiwgc2l6ZV90KTsKKwlpbnQgKCpzZW5kKSAoc3RydWN0IHRwbV9jaGlwICosIHU4ICosIHNpemVfdCk7CisJdm9pZCAoKmNhbmNlbCkgKHN0cnVjdCB0cG1fY2hpcCAqKTsKKwlzdHJ1Y3QgbWlzY2RldmljZSBtaXNjZGV2OworfTsKKworc3RydWN0IHRwbV9jaGlwIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsJLyogUENJIGRldmljZSBzdHVmZiAqLworCisJaW50IGRldl9udW07CQkvKiAvZGV2L3RwbSMgKi8KKwlpbnQgbnVtX29wZW5zOwkJLyogb25seSBvbmUgYWxsb3dlZCAqLworCWludCB0aW1lX2V4cGlyZWQ7CisKKwkvKiBEYXRhIHBhc3NlZCB0byBhbmQgZnJvbSB0aGUgdHBtIHZpYSB0aGUgcmVhZC93cml0ZSBjYWxscyAqLworCXU4ICpkYXRhX2J1ZmZlcjsKKwlhdG9taWNfdCBkYXRhX3BlbmRpbmc7CisJc3RydWN0IHNlbWFwaG9yZSBidWZmZXJfbXV0ZXg7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB1c2VyX3JlYWRfdGltZXI7CS8qIHVzZXIgbmVlZHMgdG8gY2xhaW0gcmVzdWx0ICovCisJc3RydWN0IHNlbWFwaG9yZSB0cG1fbXV0ZXg7CS8qIHRwbSBpcyBwcm9jZXNzaW5nICovCisJc3RydWN0IHRpbWVyX2xpc3QgZGV2aWNlX3RpbWVyOwkvKiB0cG0gaXMgcHJvY2Vzc2luZyAqLworCXN0cnVjdCBzZW1hcGhvcmUgdGltZXJfbWFuaXB1bGF0aW9uX211dGV4OworCisJc3RydWN0IHRwbV92ZW5kb3Jfc3BlY2lmaWMgKnZlbmRvcjsKKworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHRwbV9yZWFkX2luZGV4KGludCBpbmRleCkKK3sKKwlvdXRiKGluZGV4LCBUUE1fQUREUik7CisJcmV0dXJuIGluYihUUE1fREFUQSkgJiAweEZGOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHBtX3dyaXRlX2luZGV4KGludCBpbmRleCwgaW50IHZhbHVlKQoreworCW91dGIoaW5kZXgsIFRQTV9BRERSKTsKKwlvdXRiKHZhbHVlICYgMHhGRiwgVFBNX0RBVEEpOworfQorCitleHRlcm4gdm9pZCB0cG1fdGltZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIGludCB0cG1fbHBjX2J1c19pbml0KHN0cnVjdCBwY2lfZGV2ICosIHUxNik7CisKK2V4dGVybiBpbnQgdHBtX3JlZ2lzdGVyX2hhcmR3YXJlKHN0cnVjdCBwY2lfZGV2ICosCisJCQkJIHN0cnVjdCB0cG1fdmVuZG9yX3NwZWNpZmljICopOworZXh0ZXJuIGludCB0cG1fb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitleHRlcm4gaW50IHRwbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK2V4dGVybiBzc2l6ZV90IHRwbV93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsCisJCQkgbG9mZl90ICopOworZXh0ZXJuIHNzaXplX3QgdHBtX3JlYWQoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CitleHRlcm4gdm9pZCBfX2RldmV4aXQgdHBtX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqKTsKK2V4dGVybiBpbnQgdHBtX3BtX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKiwgdTMyKTsKK2V4dGVybiBpbnQgdHBtX3BtX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2F0bWVsLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9hdG1lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MzMzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9hdG1lbC5jCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIEF1dGhvcnM6CisgKiBMZWVuZGVydCB2YW4gRG9vcm4gPGxlZW5kZXJ0QHdhdHNvbi5pYm0uY29tPgorICogRGF2ZSBTYWZmb3JkIDxzYWZmb3JkQHdhdHNvbi5pYm0uY29tPgorICogUmVpbmVyIFNhaWxlciA8c2FpbGVyQHdhdHNvbi5pYm0uY29tPgorICogS3lsZW5lIEhhbGwgPGtqaGFsbEB1cy5pYm0uY29tPgorICoKKyAqIE1haW50YWluZWQgYnk6IDx0cG1kZF9kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogRGV2aWNlIGRyaXZlciBmb3IgVENHL1RDUEEgVFBNICh0cnVzdGVkIHBsYXRmb3JtIG1vZHVsZSkuCisgKiBTcGVjaWZpY2F0aW9ucyBhdCB3d3cudHJ1c3RlZGNvbXB1dGluZ2dyb3VwLm9yZwkgCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICogCisgKi8KKworI2luY2x1ZGUgInRwbS5oIgorCisvKiBBdG1lbCBkZWZpbml0aW9ucyAqLworI2RlZmluZQlUUE1fQVRNTF9CQVNFCQkJMHg0MDAKKworLyogd3JpdGUgc3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUJQVRNTF9TVEFUVVNfQUJPUlQJCTB4MDEKKyNkZWZpbmUJQVRNTF9TVEFUVVNfTEFTVEJZVEUJCTB4MDQKKworLyogcmVhZCBzdGF0dXMgYml0cyAqLworI2RlZmluZQlBVE1MX1NUQVRVU19CVVNZCQkweDAxCisjZGVmaW5lCUFUTUxfU1RBVFVTX0RBVEFfQVZBSUwJCTB4MDIKKyNkZWZpbmUJQVRNTF9TVEFUVVNfUkVXUklURQkJMHgwNAorCisKK3N0YXRpYyBpbnQgdHBtX2F0bWxfcmVjdihzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHU4ICogYnVmLCBzaXplX3QgY291bnQpCit7CisJdTggc3RhdHVzLCAqaGRyID0gYnVmOworCXUzMiBzaXplOworCWludCBpOworCV9fYmUzMiAqbmF0aXZlX3NpemU7CisKKwkvKiBzdGFydCByZWFkaW5nIGhlYWRlciAqLworCWlmIChjb3VudCA8IDYpCisJCXJldHVybiAtRUlPOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlzdGF0dXMgPSBpbmIoY2hpcC0+dmVuZG9yLT5iYXNlICsgMSk7CisJCWlmICgoc3RhdHVzICYgQVRNTF9TVEFUVVNfREFUQV9BVkFJTCkgPT0gMCkgeworCQkJZGV2X2VycigmY2hpcC0+cGNpX2Rldi0+ZGV2LAorCQkJCSJlcnJvciByZWFkaW5nIGhlYWRlclxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQkqYnVmKysgPSBpbmIoY2hpcC0+dmVuZG9yLT5iYXNlKTsKKwl9CisKKwkvKiBzaXplIG9mIHRoZSBkYXRhIHJlY2VpdmVkICovCisJbmF0aXZlX3NpemUgPSAoX19mb3JjZSBfX2JlMzIgKikgKGhkciArIDIpOworCXNpemUgPSBiZTMyX3RvX2NwdSgqbmF0aXZlX3NpemUpOworCisJaWYgKGNvdW50IDwgc2l6ZSkgeworCQlkZXZfZXJyKCZjaGlwLT5wY2lfZGV2LT5kZXYsCisJCQkiUmVjdiBzaXplKCVkKSBsZXNzIHRoYW4gYXZhaWxhYmxlIHNwYWNlXG4iLCBzaXplKTsKKwkJZm9yICg7IGkgPCBzaXplOyBpKyspIHsJLyogY2xlYXIgdGhlIHdhaXRpbmcgZGF0YSBhbnl3YXkgKi8KKwkJCXN0YXR1cyA9IGluYihjaGlwLT52ZW5kb3ItPmJhc2UgKyAxKTsKKwkJCWlmICgoc3RhdHVzICYgQVRNTF9TVEFUVVNfREFUQV9BVkFJTCkgPT0gMCkgeworCQkJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwKKwkJCQkJImVycm9yIHJlYWRpbmcgZGF0YVxuIik7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogcmVhZCBhbGwgdGhlIGRhdGEgYXZhaWxhYmxlICovCisJZm9yICg7IGkgPCBzaXplOyBpKyspIHsKKwkJc3RhdHVzID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIDEpOworCQlpZiAoKHN0YXR1cyAmIEFUTUxfU1RBVFVTX0RBVEFfQVZBSUwpID09IDApIHsKKwkJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwKKwkJCQkiZXJyb3IgcmVhZGluZyBkYXRhXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCSpidWYrKyA9IGluYihjaGlwLT52ZW5kb3ItPmJhc2UpOworCX0KKworCS8qIG1ha2Ugc3VyZSBkYXRhIGF2YWlsYWJsZSBpcyBnb25lICovCisJc3RhdHVzID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIDEpOworCWlmIChzdGF0dXMgJiBBVE1MX1NUQVRVU19EQVRBX0FWQUlMKSB7CisJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwgImRhdGEgYXZhaWxhYmxlIGlzIHN0dWNrXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgdHBtX2F0bWxfc2VuZChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHU4ICogYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IGk7CisKKwlkZXZfZGJnKCZjaGlwLT5wY2lfZGV2LT5kZXYsICJ0cG1fYXRtbF9zZW5kOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlkZXZfZGJnKCZjaGlwLT5wY2lfZGV2LT5kZXYsICIweCV4KCVkKSAiLCBidWZbaV0sIGJ1ZltpXSk7CisJCW91dGIoYnVmW2ldLCBjaGlwLT52ZW5kb3ItPmJhc2UpOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQgdHBtX2F0bWxfY2FuY2VsKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKK3sKKwlvdXRiKEFUTUxfU1RBVFVTX0FCT1JULCBjaGlwLT52ZW5kb3ItPmJhc2UgKyAxKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXRtZWxfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBub19sbHNlZWssCisJLm9wZW4gPSB0cG1fb3BlbiwKKwkucmVhZCA9IHRwbV9yZWFkLAorCS53cml0ZSA9IHRwbV93cml0ZSwKKwkucmVsZWFzZSA9IHRwbV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCB0cG1fdmVuZG9yX3NwZWNpZmljIHRwbV9hdG1lbCA9IHsKKwkucmVjdiA9IHRwbV9hdG1sX3JlY3YsCisJLnNlbmQgPSB0cG1fYXRtbF9zZW5kLAorCS5jYW5jZWwgPSB0cG1fYXRtbF9jYW5jZWwsCisJLnJlcV9jb21wbGV0ZV9tYXNrID0gQVRNTF9TVEFUVVNfQlVTWSB8IEFUTUxfU1RBVFVTX0RBVEFfQVZBSUwsCisJLnJlcV9jb21wbGV0ZV92YWwgPSBBVE1MX1NUQVRVU19EQVRBX0FWQUlMLAorCS5iYXNlID0gVFBNX0FUTUxfQkFTRSwKKwkubWlzY2RldiA9IHsgLmZvcHMgPSAmYXRtZWxfb3BzLCB9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgdHBtX2F0bWxfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXU4IHZlcnNpb25bNF07CisJaW50IHJjID0gMDsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAodHBtX2xwY19idXNfaW5pdChwY2lfZGV2LCBUUE1fQVRNTF9CQVNFKSkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwkvKiB2ZXJpZnkgdGhhdCBpdCBpcyBhbiBBdG1lbCBwYXJ0ICovCisJaWYgKHRwbV9yZWFkX2luZGV4KDQpICE9ICdBJyB8fCB0cG1fcmVhZF9pbmRleCg1KSAhPSAnVCcKKwkgICAgfHwgdHBtX3JlYWRfaW5kZXgoNikgIT0gJ00nIHx8IHRwbV9yZWFkX2luZGV4KDcpICE9ICdMJykgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwkvKiBxdWVyeSBjaGlwIGZvciBpdHMgdmVyc2lvbiBudW1iZXIgKi8KKwlpZiAoKHZlcnNpb25bMF0gPSB0cG1fcmVhZF9pbmRleCgweDAwKSkgIT0gMHhGRikgeworCQl2ZXJzaW9uWzFdID0gdHBtX3JlYWRfaW5kZXgoMHgwMSk7CisJCXZlcnNpb25bMl0gPSB0cG1fcmVhZF9pbmRleCgweDAyKTsKKwkJdmVyc2lvblszXSA9IHRwbV9yZWFkX2luZGV4KDB4MDMpOworCX0gZWxzZSB7CisJCWRldl9pbmZvKCZwY2lfZGV2LT5kZXYsICJ2ZXJzaW9uIHF1ZXJ5IGZhaWxlZFxuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWlmICgocmMgPSB0cG1fcmVnaXN0ZXJfaGFyZHdhcmUocGNpX2RldiwgJnRwbV9hdG1lbCkpIDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJZGV2X2luZm8oJnBjaV9kZXYtPmRldiwKKwkJICJBdG1lbCBUUE0gdmVyc2lvbiAlZC4lZC4lZC4lZFxuIiwgdmVyc2lvblswXSwgdmVyc2lvblsxXSwKKwkJIHZlcnNpb25bMl0sIHZlcnNpb25bM10pOworCisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0cG1fcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzApfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTIpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxREJfMCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8xMil9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFFQl8wKX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzgxMTFfTFBDKX0sCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRwbV9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGF0bWVsX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSAidHBtX2F0bWVsIiwKKwkuaWRfdGFibGUgPSB0cG1fcGNpX3RibCwKKwkucHJvYmUgPSB0cG1fYXRtbF9pbml0LAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh0cG1fcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IHRwbV9wbV9zdXNwZW5kLAorCS5yZXN1bWUgPSB0cG1fcG1fcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9hdG1lbCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhdG1lbF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfYXRtZWwodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmF0bWVsX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X2F0bWVsKTsKK21vZHVsZV9leGl0KGNsZWFudXBfYXRtZWwpOworCitNT0RVTEVfQVVUSE9SKCJMZWVuZGVydCB2YW4gRG9vcm4gKGxlZW5kZXJ0QHdhdHNvbi5pYm0uY29tKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUUE0gRHJpdmVyIik7CitNT0RVTEVfVkVSU0lPTigiMi4wIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9uc2MuYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX25zYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljY2U4MzNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fbnNjLmMKQEAgLTAsMCArMSwzNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSUJNIENvcnBvcmF0aW9uCisgKgorICogQXV0aG9yczoKKyAqIExlZW5kZXJ0IHZhbiBEb29ybiA8bGVlbmRlcnRAd2F0c29uLmlibS5jb20+CisgKiBEYXZlIFNhZmZvcmQgPHNhZmZvcmRAd2F0c29uLmlibS5jb20+CisgKiBSZWluZXIgU2FpbGVyIDxzYWlsZXJAd2F0c29uLmlibS5jb20+CisgKiBLeWxlbmUgSGFsbCA8a2poYWxsQHVzLmlibS5jb20+CisgKgorICogTWFpbnRhaW5lZCBieTogPHRwbWRkX2RldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBEZXZpY2UgZHJpdmVyIGZvciBUQ0cvVENQQSBUUE0gKHRydXN0ZWQgcGxhdGZvcm0gbW9kdWxlKS4KKyAqIFNwZWNpZmljYXRpb25zIGF0IHd3dy50cnVzdGVkY29tcHV0aW5nZ3JvdXAub3JnCSAKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UuCisgKiAKKyAqLworCisjaW5jbHVkZSAidHBtLmgiCisKKy8qIE5hdGlvbmFsIGRlZmluaXRpb25zICovCisjZGVmaW5lCVRQTV9OU0NfQkFTRQkJCTB4MzYwCisjZGVmaW5lCVRQTV9OU0NfSVJRCQkJMHgwNworCisjZGVmaW5lCU5TQ19MRE5fSU5ERVgJCQkweDA3CisjZGVmaW5lCU5TQ19TSURfSU5ERVgJCQkweDIwCisjZGVmaW5lCU5TQ19MRENfSU5ERVgJCQkweDMwCisjZGVmaW5lCU5TQ19ESU9fSU5ERVgJCQkweDYwCisjZGVmaW5lCU5TQ19DSU9fSU5ERVgJCQkweDYyCisjZGVmaW5lCU5TQ19JUlFfSU5ERVgJCQkweDcwCisjZGVmaW5lCU5TQ19JVFNfSU5ERVgJCQkweDcxCisKKyNkZWZpbmUJTlNDX1NUQVRVUwkJCTB4MDEKKyNkZWZpbmUJTlNDX0NPTU1BTkQJCQkweDAxCisjZGVmaW5lCU5TQ19EQVRBCQkJMHgwMAorCisvKiBzdGF0dXMgYml0cyAqLworI2RlZmluZQlOU0NfU1RBVFVTX09CRgkJCTB4MDEJLyogb3V0cHV0IGJ1ZmZlciBmdWxsICovCisjZGVmaW5lCU5TQ19TVEFUVVNfSUJGCQkJMHgwMgkvKiBpbnB1dCBidWZmZXIgZnVsbCAqLworI2RlZmluZQlOU0NfU1RBVFVTX0YwCQkJMHgwNAkvKiBGMCAqLworI2RlZmluZQlOU0NfU1RBVFVTX0EyCQkJMHgwOAkvKiBBMiAqLworI2RlZmluZQlOU0NfU1RBVFVTX1JEWQkJCTB4MTAJLyogcmVhZHkgdG8gcmVjZWl2ZSBjb21tYW5kICovCisjZGVmaW5lCU5TQ19TVEFUVVNfSUJSCQkJMHgyMAkvKiByZWFkeSB0byByZWNlaXZlIGRhdGEgKi8KKworLyogY29tbWFuZCBiaXRzICovCisjZGVmaW5lCU5TQ19DT01NQU5EX05PUk1BTAkJMHgwMQkvKiBub3JtYWwgbW9kZSAqLworI2RlZmluZQlOU0NfQ09NTUFORF9FT0MJCQkweDAzCisjZGVmaW5lCU5TQ19DT01NQU5EX0NBTkNFTAkJMHgyMgorCisvKgorICogV2FpdCBmb3IgYSBjZXJ0YWluIHN0YXR1cyB0byBhcHBlYXIKKyAqLworc3RhdGljIGludCB3YWl0X2Zvcl9zdGF0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTggbWFzaywgdTggdmFsLCB1OCAqIGRhdGEpCit7CisJaW50IGV4cGlyZWQgPSAwOworCXN0cnVjdCB0aW1lcl9saXN0IHN0YXR1c190aW1lciA9CisJICAgIFRJTUVSX0lOSVRJQUxJWkVSKHRwbV90aW1lX2V4cGlyZWQsIGppZmZpZXMgKyAxMCAqIEhaLAorCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpICZleHBpcmVkKTsKKworCS8qIHN0YXR1cyBpbW1lZGlhdGVseSBhdmFpbGFibGUgY2hlY2sgKi8KKwkqZGF0YSA9IGluYihjaGlwLT52ZW5kb3ItPmJhc2UgKyBOU0NfU1RBVFVTKTsKKwlpZiAoKCpkYXRhICYgbWFzaykgPT0gdmFsKQorCQlyZXR1cm4gMDsKKworCS8qIHdhaXQgZm9yIHN0YXR1cyAqLworCWFkZF90aW1lcigmc3RhdHVzX3RpbWVyKTsKKwlkbyB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChUUE1fVElNRU9VVCk7CisJCSpkYXRhID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIDEpOworCQlpZiAoKCpkYXRhICYgbWFzaykgPT0gdmFsKSB7CisJCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZzdGF0dXNfdGltZXIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJd2hpbGUgKCFleHBpcmVkKTsKKworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgbnNjX3dhaXRfZm9yX3JlYWR5KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKK3sKKwlpbnQgc3RhdHVzOworCWludCBleHBpcmVkID0gMDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzdGF0dXNfdGltZXIgPQorCSAgICBUSU1FUl9JTklUSUFMSVpFUih0cG1fdGltZV9leHBpcmVkLCBqaWZmaWVzICsgMTAwLAorCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpICZleHBpcmVkKTsKKworCS8qIHN0YXR1cyBpbW1lZGlhdGVseSBhdmFpbGFibGUgY2hlY2sgKi8KKwlzdGF0dXMgPSBpbmIoY2hpcC0+dmVuZG9yLT5iYXNlICsgTlNDX1NUQVRVUyk7CisJaWYgKHN0YXR1cyAmIE5TQ19TVEFUVVNfT0JGKQorCQlzdGF0dXMgPSBpbmIoY2hpcC0+dmVuZG9yLT5iYXNlICsgTlNDX0RBVEEpOworCWlmIChzdGF0dXMgJiBOU0NfU1RBVFVTX1JEWSkKKwkJcmV0dXJuIDA7CisKKwkvKiB3YWl0IGZvciBzdGF0dXMgKi8KKwlhZGRfdGltZXIoJnN0YXR1c190aW1lcik7CisJZG8geworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoVFBNX1RJTUVPVVQpOworCQlzdGF0dXMgPSBpbmIoY2hpcC0+dmVuZG9yLT5iYXNlICsgTlNDX1NUQVRVUyk7CisJCWlmIChzdGF0dXMgJiBOU0NfU1RBVFVTX09CRikKKwkJCXN0YXR1cyA9IGluYihjaGlwLT52ZW5kb3ItPmJhc2UgKyBOU0NfREFUQSk7CisJCWlmIChzdGF0dXMgJiBOU0NfU1RBVFVTX1JEWSkgeworCQkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmc3RhdHVzX3RpbWVyKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXdoaWxlICghZXhwaXJlZCk7CisKKwlkZXZfaW5mbygmY2hpcC0+cGNpX2Rldi0+ZGV2LCAid2FpdCBmb3IgcmVhZHkgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLUVCVVNZOworfQorCisKK3N0YXRpYyBpbnQgdHBtX25zY19yZWN2KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTggKiBidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1OCAqYnVmZmVyID0gYnVmOworCXU4IGRhdGEsICpwOworCXUzMiBzaXplOworCV9fYmUzMiAqbmF0aXZlX3NpemU7CisKKwlpZiAoY291bnQgPCA2KQorCQlyZXR1cm4gLUVJTzsKKworCWlmICh3YWl0X2Zvcl9zdGF0KGNoaXAsIE5TQ19TVEFUVVNfRjAsIE5TQ19TVEFUVVNfRjAsICZkYXRhKSA8IDApIHsKKwkJZGV2X2VycigmY2hpcC0+cGNpX2Rldi0+ZGV2LCAiRjAgdGltZW91dFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoKGRhdGEgPQorCSAgICAgaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIE5TQ19EQVRBKSkgIT0gTlNDX0NPTU1BTkRfTk9STUFMKSB7CisJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwgIm5vdCBpbiBub3JtYWwgbW9kZSAoMHgleClcbiIsCisJCQlkYXRhKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogcmVhZCB0aGUgd2hvbGUgcGFja2V0ICovCisJZm9yIChwID0gYnVmZmVyOyBwIDwgJmJ1ZmZlcltjb3VudF07IHArKykgeworCQlpZiAod2FpdF9mb3Jfc3RhdAorCQkgICAgKGNoaXAsIE5TQ19TVEFUVVNfT0JGLCBOU0NfU1RBVFVTX09CRiwgJmRhdGEpIDwgMCkgeworCQkJZGV2X2VycigmY2hpcC0+cGNpX2Rldi0+ZGV2LAorCQkJCSJPQkYgdGltZW91dCAod2hpbGUgcmVhZGluZyBkYXRhKVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAoZGF0YSAmIE5TQ19TVEFUVVNfRjApCisJCQlicmVhazsKKwkJKnAgPSBpbmIoY2hpcC0+dmVuZG9yLT5iYXNlICsgTlNDX0RBVEEpOworCX0KKworCWlmICgoZGF0YSAmIE5TQ19TVEFUVVNfRjApID09IDApIHsKKwkJZGV2X2VycigmY2hpcC0+cGNpX2Rldi0+ZGV2LCAiRjAgbm90IHNldFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoKGRhdGEgPSBpbmIoY2hpcC0+dmVuZG9yLT5iYXNlICsgTlNDX0RBVEEpKSAhPSBOU0NfQ09NTUFORF9FT0MpIHsKKwkJZGV2X2VycigmY2hpcC0+cGNpX2Rldi0+ZGV2LAorCQkJImV4cGVjdGVkIGVuZCBvZiBjb21tYW5kKDB4JXgpXG4iLCBkYXRhKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbmF0aXZlX3NpemUgPSAoX19mb3JjZSBfX2JlMzIgKikgKGJ1ZiArIDIpOworCXNpemUgPSBiZTMyX3RvX2NwdSgqbmF0aXZlX3NpemUpOworCisJaWYgKGNvdW50IDwgc2l6ZSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCB0cG1fbnNjX3NlbmQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCB1OCAqIGJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXU4IGRhdGE7CisJaW50IGk7CisKKwkvKgorCSAqIElmIHdlIGhpdCB0aGUgY2hpcCB3aXRoIGJhY2sgdG8gYmFjayBjb21tYW5kcyBpdCBsb2NrcyB1cAorCSAqIGFuZCBuZXZlciBzZXQgSUJGLiBIaXR0aW5nIGl0IHdpdGggdGhpcyAiaGFtbWVyIiBzZWVtcyB0bworCSAqIGZpeCBpdC4gTm90IHN1cmUgd2h5IHRoaXMgaXMgbmVlZGVkLCB3ZSBmb2xsb3dlZCB0aGUgZmxvdworCSAqIGNoYXJ0IGluIHRoZSBtYW51YWwgdG8gdGhlIGxldHRlci4KKwkgKi8KKwlvdXRiKE5TQ19DT01NQU5EX0NBTkNFTCwgY2hpcC0+dmVuZG9yLT5iYXNlICsgTlNDX0NPTU1BTkQpOworCisJaWYgKG5zY193YWl0X2Zvcl9yZWFkeShjaGlwKSAhPSAwKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICh3YWl0X2Zvcl9zdGF0KGNoaXAsIE5TQ19TVEFUVVNfSUJGLCAwLCAmZGF0YSkgPCAwKSB7CisJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwgIklCRiB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJb3V0YihOU0NfQ09NTUFORF9OT1JNQUwsIGNoaXAtPnZlbmRvci0+YmFzZSArIE5TQ19DT01NQU5EKTsKKwlpZiAod2FpdF9mb3Jfc3RhdChjaGlwLCBOU0NfU1RBVFVTX0lCUiwgTlNDX1NUQVRVU19JQlIsICZkYXRhKSA8IDApIHsKKwkJZGV2X2VycigmY2hpcC0+cGNpX2Rldi0+ZGV2LCAiSUJSIHRpbWVvdXRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAod2FpdF9mb3Jfc3RhdChjaGlwLCBOU0NfU1RBVFVTX0lCRiwgMCwgJmRhdGEpIDwgMCkgeworCQkJZGV2X2VycigmY2hpcC0+cGNpX2Rldi0+ZGV2LAorCQkJCSJJQkYgdGltZW91dCAod2hpbGUgd3JpdGluZyBkYXRhKVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlvdXRiKGJ1ZltpXSwgY2hpcC0+dmVuZG9yLT5iYXNlICsgTlNDX0RBVEEpOworCX0KKworCWlmICh3YWl0X2Zvcl9zdGF0KGNoaXAsIE5TQ19TVEFUVVNfSUJGLCAwLCAmZGF0YSkgPCAwKSB7CisJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwgIklCRiB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW91dGIoTlNDX0NPTU1BTkRfRU9DLCBjaGlwLT52ZW5kb3ItPmJhc2UgKyBOU0NfQ09NTUFORCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHRwbV9uc2NfY2FuY2VsKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKK3sKKwlvdXRiKE5TQ19DT01NQU5EX0NBTkNFTCwgY2hpcC0+dmVuZG9yLT5iYXNlICsgTlNDX0NPTU1BTkQpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBuc2Nfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBub19sbHNlZWssCisJLm9wZW4gPSB0cG1fb3BlbiwKKwkucmVhZCA9IHRwbV9yZWFkLAorCS53cml0ZSA9IHRwbV93cml0ZSwKKwkucmVsZWFzZSA9IHRwbV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCB0cG1fdmVuZG9yX3NwZWNpZmljIHRwbV9uc2MgPSB7CisJLnJlY3YgPSB0cG1fbnNjX3JlY3YsCisJLnNlbmQgPSB0cG1fbnNjX3NlbmQsCisJLmNhbmNlbCA9IHRwbV9uc2NfY2FuY2VsLAorCS5yZXFfY29tcGxldGVfbWFzayA9IE5TQ19TVEFUVVNfT0JGLAorCS5yZXFfY29tcGxldGVfdmFsID0gTlNDX1NUQVRVU19PQkYsCisJLmJhc2UgPSBUUE1fTlNDX0JBU0UsCisJLm1pc2NkZXYgPSB7IC5mb3BzID0gJm5zY19vcHMsIH0sCisJCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0cG1fbnNjX2luaXQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCWludCByYyA9IDA7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpCisJCXJldHVybiAtRUlPOworCisJaWYgKHRwbV9scGNfYnVzX2luaXQocGNpX2RldiwgVFBNX05TQ19CQVNFKSkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwkvKiB2ZXJpZnkgdGhhdCBpdCBpcyBhIE5hdGlvbmFsIHBhcnQgKFNJRCkgKi8KKwlpZiAodHBtX3JlYWRfaW5kZXgoTlNDX1NJRF9JTkRFWCkgIT0gMHhFRikgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlkZXZfZGJnKCZwY2lfZGV2LT5kZXYsICJOU0MgVFBNIGRldGVjdGVkXG4iKTsKKwlkZXZfZGJnKCZwY2lfZGV2LT5kZXYsCisJCSJOU0MgTEROIDB4JXgsIFNJRCAweCV4LCBTUklEIDB4JXhcbiIsCisJCXRwbV9yZWFkX2luZGV4KDB4MDcpLCB0cG1fcmVhZF9pbmRleCgweDIwKSwKKwkJdHBtX3JlYWRfaW5kZXgoMHgyNykpOworCWRldl9kYmcoJnBjaV9kZXYtPmRldiwKKwkJIk5TQyBTSU9DRjEgMHgleCBTSU9DRjUgMHgleCBTSU9DRjYgMHgleCBTSU9DRjggMHgleFxuIiwKKwkJdHBtX3JlYWRfaW5kZXgoMHgyMSksIHRwbV9yZWFkX2luZGV4KDB4MjUpLAorCQl0cG1fcmVhZF9pbmRleCgweDI2KSwgdHBtX3JlYWRfaW5kZXgoMHgyOCkpOworCWRldl9kYmcoJnBjaV9kZXYtPmRldiwgIk5TQyBJTyBCYXNlMCAweCV4XG4iLAorCQkodHBtX3JlYWRfaW5kZXgoMHg2MCkgPDwgOCkgfCB0cG1fcmVhZF9pbmRleCgweDYxKSk7CisJZGV2X2RiZygmcGNpX2Rldi0+ZGV2LCAiTlNDIElPIEJhc2UxIDB4JXhcbiIsCisJCSh0cG1fcmVhZF9pbmRleCgweDYyKSA8PCA4KSB8IHRwbV9yZWFkX2luZGV4KDB4NjMpKTsKKwlkZXZfZGJnKCZwY2lfZGV2LT5kZXYsICJOU0MgSW50ZXJydXB0IG51bWJlciBhbmQgd2FrZXVwIDB4JXhcbiIsCisJCXRwbV9yZWFkX2luZGV4KDB4NzApKTsKKwlkZXZfZGJnKCZwY2lfZGV2LT5kZXYsICJOU0MgSVJRIHR5cGUgc2VsZWN0IDB4JXhcbiIsCisJCXRwbV9yZWFkX2luZGV4KDB4NzEpKTsKKwlkZXZfZGJnKCZwY2lfZGV2LT5kZXYsCisJCSJOU0MgRE1BIGNoYW5uZWwgc2VsZWN0MCAweCV4LCBzZWxlY3QxIDB4JXhcbiIsCisJCXRwbV9yZWFkX2luZGV4KDB4NzQpLCB0cG1fcmVhZF9pbmRleCgweDc1KSk7CisJZGV2X2RiZygmcGNpX2Rldi0+ZGV2LAorCQkiTlNDIENvbmZpZyAiCisJCSIweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4XG4iLAorCQl0cG1fcmVhZF9pbmRleCgweEYwKSwgdHBtX3JlYWRfaW5kZXgoMHhGMSksCisJCXRwbV9yZWFkX2luZGV4KDB4RjIpLCB0cG1fcmVhZF9pbmRleCgweEYzKSwKKwkJdHBtX3JlYWRfaW5kZXgoMHhGNCksIHRwbV9yZWFkX2luZGV4KDB4RjUpLAorCQl0cG1fcmVhZF9pbmRleCgweEY2KSwgdHBtX3JlYWRfaW5kZXgoMHhGNyksCisJCXRwbV9yZWFkX2luZGV4KDB4RjgpLCB0cG1fcmVhZF9pbmRleCgweEY5KSk7CisKKwlkZXZfaW5mbygmcGNpX2Rldi0+ZGV2LAorCQkgIk5TQyBQQzIxMTAwIFRQTSByZXZpc2lvbiAlZFxuIiwKKwkJIHRwbV9yZWFkX2luZGV4KDB4MjcpICYgMHgxRik7CisKKwlpZiAodHBtX3JlYWRfaW5kZXgoTlNDX0xEQ19JTkRFWCkgPT0gMCkKKwkJZGV2X2luZm8oJnBjaV9kZXYtPmRldiwgIjogTlNDIFRQTSBub3QgYWN0aXZlXG4iKTsKKworCS8qIHNlbGVjdCBQTSBjaGFubmVsIDEgKi8KKwl0cG1fd3JpdGVfaW5kZXgoTlNDX0xETl9JTkRFWCwgMHgxMik7CisJdHBtX3JlYWRfaW5kZXgoTlNDX0xETl9JTkRFWCk7CisKKwkvKiBkaXNhYmxlIHRoZSBEUE0gbW9kdWxlICovCisJdHBtX3dyaXRlX2luZGV4KE5TQ19MRENfSU5ERVgsIDApOworCXRwbV9yZWFkX2luZGV4KE5TQ19MRENfSU5ERVgpOworCisJLyogc2V0IHRoZSBkYXRhIHJlZ2lzdGVyIGJhc2UgYWRkcmVzc2VzICovCisJdHBtX3dyaXRlX2luZGV4KE5TQ19ESU9fSU5ERVgsIFRQTV9OU0NfQkFTRSA+PiA4KTsKKwl0cG1fd3JpdGVfaW5kZXgoTlNDX0RJT19JTkRFWCArIDEsIFRQTV9OU0NfQkFTRSk7CisJdHBtX3JlYWRfaW5kZXgoTlNDX0RJT19JTkRFWCk7CisJdHBtX3JlYWRfaW5kZXgoTlNDX0RJT19JTkRFWCArIDEpOworCisJLyogc2V0IHRoZSBjb21tYW5kIHJlZ2lzdGVyIGJhc2UgYWRkcmVzc2VzICovCisJdHBtX3dyaXRlX2luZGV4KE5TQ19DSU9fSU5ERVgsIChUUE1fTlNDX0JBU0UgKyAxKSA+PiA4KTsKKwl0cG1fd3JpdGVfaW5kZXgoTlNDX0NJT19JTkRFWCArIDEsIChUUE1fTlNDX0JBU0UgKyAxKSk7CisJdHBtX3JlYWRfaW5kZXgoTlNDX0RJT19JTkRFWCk7CisJdHBtX3JlYWRfaW5kZXgoTlNDX0RJT19JTkRFWCArIDEpOworCisJLyogc2V0IHRoZSBpbnRlcnJ1cHQgbnVtYmVyIHRvIGJlIHVzZWQgZm9yIHRoZSBob3N0IGludGVyZmFjZSAqLworCXRwbV93cml0ZV9pbmRleChOU0NfSVJRX0lOREVYLCBUUE1fTlNDX0lSUSk7CisJdHBtX3dyaXRlX2luZGV4KE5TQ19JVFNfSU5ERVgsIDB4MDApOworCXRwbV9yZWFkX2luZGV4KE5TQ19JUlFfSU5ERVgpOworCisJLyogZW5hYmxlIHRoZSBEUE0gbW9kdWxlICovCisJdHBtX3dyaXRlX2luZGV4KE5TQ19MRENfSU5ERVgsIDB4MDEpOworCXRwbV9yZWFkX2luZGV4KE5TQ19MRENfSU5ERVgpOworCisJaWYgKChyYyA9IHRwbV9yZWdpc3Rlcl9oYXJkd2FyZShwY2lfZGV2LCAmdHBtX25zYykpIDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJcmV0dXJuIDA7CisKK291dF9lcnI6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRwbV9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfMCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV8xMil9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8wKX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzEyKX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUVCXzApfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfODExMV9MUEMpfSwKKwl7MCx9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdHBtX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbnNjX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSAidHBtX25zYyIsCisJLmlkX3RhYmxlID0gdHBtX3BjaV90YmwsCisJLnByb2JlID0gdHBtX25zY19pbml0LAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh0cG1fcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IHRwbV9wbV9zdXNwZW5kLAorCS5yZXN1bWUgPSB0cG1fcG1fcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9uc2Modm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbnNjX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9uc2Modm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm5zY19wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9uc2MpOworbW9kdWxlX2V4aXQoY2xlYW51cF9uc2MpOworCitNT0RVTEVfQVVUSE9SKCJMZWVuZGVydCB2YW4gRG9vcm4gKGxlZW5kZXJ0QHdhdHNvbi5pYm0uY29tKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUUE0gRHJpdmVyIik7CitNT0RVTEVfVkVSU0lPTigiMi4wIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlNWEzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwpAQCAtMCwwICsxLDI5ODAgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9jaGFyL3R0eV9pby5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisvKgorICogJ3R0eV9pby5jJyBnaXZlcyBhbiBvcnRob2dvbmFsIGZlZWxpbmcgdG8gdHR5J3MsIGJlIHRoZXkgY29uc29sZXMKKyAqIG9yIHJzLWNoYW5uZWxzLiBJdCBhbHNvIGltcGxlbWVudHMgZWNob2luZywgY29va2VkIG1vZGUgZXRjLgorICoKKyAqIEtpbGwtbGluZSB0aGFua3MgdG8gSm9obiBUIEtvaGwsIHdobyBhbHNvIGNvcnJlY3RlZCBWTUlOID0gVlRJTUUgPSAwLgorICoKKyAqIE1vZGlmaWVkIGJ5IFRoZW9kb3JlIFRzJ28sIDkvMTQvOTIsIHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlIHRoZQorICogdHR5X3N0cnVjdCBhbmQgdHR5X3F1ZXVlIHN0cnVjdHVyZXMuICBQcmV2aW91c2x5IHRoZXJlIHdhcyBhbiBhcnJheQorICogb2YgMjU2IHR0eV9zdHJ1Y3QncyB3aGljaCB3YXMgc3RhdGljYWxseSBhbGxvY2F0ZWQsIGFuZCB0aGUKKyAqIHR0eV9xdWV1ZSBzdHJ1Y3R1cmVzIHdlcmUgYWxsb2NhdGVkIGF0IGJvb3QgdGltZS4gIEJvdGggYXJlIG5vdworICogZHluYW1pY2FsbHkgYWxsb2NhdGVkIG9ubHkgd2hlbiB0aGUgdHR5IGlzIG9wZW4uCisgKgorICogQWxzbyByZXN0cnVjdHVyZWQgcm91dGluZXMgc28gdGhhdCB0aGVyZSBpcyBtb3JlIG9mIGEgc2VwYXJhdGlvbgorICogYmV0d2VlbiB0aGUgaGlnaC1sZXZlbCB0dHkgcm91dGluZXMgKHR0eV9pby5jIGFuZCB0dHlfaW9jdGwuYykgYW5kCisgKiB0aGUgbG93LWxldmVsIHR0eSByb3V0aW5lcyAoc2VyaWFsLmMsIHB0eS5jLCBjb25zb2xlLmMpLiAgVGhpcworICogbWFrZXMgZm9yIGNsZWFuZXIgYW5kIG1vcmUgY29tcGFjdCBjb2RlLiAgLVRZVCwgOS8xNy85MiAKKyAqCisgKiBNb2RpZmllZCBieSBGcmVkIE4uIHZhbiBLZW1wZW4sIDAxLzI5LzkzLCB0byBhZGQgbGluZSBkaXNjaXBsaW5lcworICogd2hpY2ggY2FuIGJlIGR5bmFtaWNhbGx5IGFjdGl2YXRlZCBhbmQgZGUtYWN0aXZhdGVkIGJ5IHRoZSBsaW5lCisgKiBkaXNjaXBsaW5lIGhhbmRsaW5nIG1vZHVsZXMgKGxpa2UgU0xJUCkuCisgKgorICogTk9URTogcGF5IG5vIGF0dGVudGlvbiB0byB0aGUgbGluZSBkaXNjaXBsaW5lIGNvZGUgKHlldCk7IGl0cworICogaW50ZXJmYWNlIGlzIHN0aWxsIHN1YmplY3QgdG8gY2hhbmdlIGluIHRoaXMgdmVyc2lvbi4uLgorICogLS0gVFlULCAxLzMxLzkyCisgKgorICogQWRkZWQgZnVuY3Rpb25hbGl0eSB0byB0aGUgT1BPU1QgdHR5IGhhbmRsaW5nLiAgTm8gZGVsYXlzLCBidXQgYWxsCisgKiBvdGhlciBiaXRzIHNob3VsZCBiZSB0aGVyZS4KKyAqCS0tIE5pY2sgSG9sbG93YXkgPGFsZmllQGRjcy53YXJ3aWNrLmFjLnVrPiwgMjd0aCBNYXkgMTk5My4KKyAqCisgKiBSZXdyb3RlIGNhbm9uaWNhbCBtb2RlIGFuZCBhZGRlZCBtb3JlIHRlcm1pb3MgZmxhZ3MuCisgKiAJLS0ganVsaWFuQHVodW5peC51aGNjLmhhd2FpaS5lZHUgKEouIENvd2xleSksIDEzSmFuOTQKKyAqCisgKiBSZW9yZ2FuaXplZCBGQVNZTkMgc3VwcG9ydCBzbyBtb3VzZSBjb2RlIGNhbiBzaGFyZSBpdC4KKyAqCS0tIGN0bUBhcmRpLmNvbSwgOVNlcDk1CisgKgorICogTmV3IFRJT0NMSU5VWCB2YXJpYW50cyBhZGRlZC4KKyAqCS0tIG1qQGszMzIuZmVsZC5jdnV0LmN6LCAxOS1Ob3YtOTUKKyAqIAorICogUmVzdHJpY3QgdnQgc3dpdGNoaW5nIHZpYSBpb2N0bCgpCisgKiAgICAgIC0tIGdyaWZAY3MudWNyLmVkdSwgNS1EZWMtOTUKKyAqCisgKiBNb3ZlIGNvbnNvbGUgYW5kIHZpcnR1YWwgdGVybWluYWwgY29kZSB0byBtb3JlIGFwcHJvcHJpYXRlIGZpbGVzLAorICogaW1wbGVtZW50IENPTkZJR19WVCBhbmQgZ2VuZXJhbGl6ZSBjb25zb2xlIGRldmljZSBpbnRlcmZhY2UuCisgKgktLSBNYXJrbyBLb2h0YWxhIDxNYXJrby5Lb2h0YWxhQGh1dC5maT4sIE1hcmNoIDk3CisgKgorICogUmV3cm90ZSBpbml0X2RldiBhbmQgcmVsZWFzZV9kZXYgdG8gZWxpbWluYXRlIHJhY2VzLgorICoJLS0gQmlsbCBIYXdlcyA8d2hhd2VzQHN0YXIubmV0PiwgSnVuZSA5NworICoKKyAqIEFkZGVkIGRldmZzIHN1cHBvcnQuCisgKiAgICAgIC0tIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PiwgMTMtSmFuLTE5OTgKKyAqCisgKiBBZGRlZCBzdXBwb3J0IGZvciBhIFVuaXg5OC1zdHlsZSBwdG14IGRldmljZS4KKyAqICAgICAgLS0gQy4gU2NvdHQgQW5hbmlhbiA8Y2FuYW5pYW5AYWx1bW5pLnByaW5jZXRvbi5lZHU+LCAxNC1KYW4tMTk5OAorICoKKyAqIFJlZHVjZWQgbWVtb3J5IHVzYWdlIGZvciBvbGRlciBBUk0gc3lzdGVtcworICogICAgICAtLSBSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPgorICoKKyAqIE1vdmUgZG9fU0FLKCkgaW50byBwcm9jZXNzIGNvbnRleHQuICBMZXNzIHN0YWNrIHVzZSBpbiBkZXZmcyBmdW5jdGlvbnMuCisgKiBhbGxvY190dHlfc3RydWN0KCkgYWx3YXlzIHVzZXMga21hbGxvYygpIC0tIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5ldT4gMTdNYXIwMQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvZGV2cHRzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgva2QuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8bGludXgva2JkX2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvc2VsZWN0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisKKyN1bmRlZiBUVFlfREVCVUdfSEFOR1VQCisKKyNkZWZpbmUgVFRZX1BBUkFOT0lBX0NIRUNLIDEKKyNkZWZpbmUgQ0hFQ0tfVFRZX0NPVU5UIDEKKworc3RydWN0IHRlcm1pb3MgdHR5X3N0ZF90ZXJtaW9zID0gewkvKiBmb3IgdGhlIGJlbmVmaXQgb2YgdHR5IGRyaXZlcnMgICovCisJLmNfaWZsYWcgPSBJQ1JOTCB8IElYT04sCisJLmNfb2ZsYWcgPSBPUE9TVCB8IE9OTENSLAorCS5jX2NmbGFnID0gQjM4NDAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCwKKwkuY19sZmxhZyA9IElTSUcgfCBJQ0FOT04gfCBFQ0hPIHwgRUNIT0UgfCBFQ0hPSyB8CisJCSAgIEVDSE9DVEwgfCBFQ0hPS0UgfCBJRVhURU4sCisJLmNfY2MgPSBJTklUX0NfQ0MKK307CisKK0VYUE9SVF9TWU1CT0wodHR5X3N0ZF90ZXJtaW9zKTsKKworLyogVGhpcyBsaXN0IGdldHMgcG9rZWQgYXQgYnkgcHJvY2ZzIGFuZCB2YXJpb3VzIGJpdHMgb2YgYm9vdCB1cCBjb2RlLiBUaGlzCisgICBjb3VsZCBkbyB3aXRoIHNvbWUgcmF0aW9uYWxpc2F0aW9uIHN1Y2ggYXMgcHVsbGluZyB0aGUgdHR5IHByb2MgZnVuY3Rpb24KKyAgIGludG8gdGhpcyBmaWxlICovCisgICAKK0xJU1RfSEVBRCh0dHlfZHJpdmVycyk7CQkJLyogbGlua2VkIGxpc3Qgb2YgdHR5IGRyaXZlcnMgKi8KKworLyogU2VtYXBob3JlIHRvIHByb3RlY3QgY3JlYXRpbmcgYW5kIHJlbGVhc2luZyBhIHR0eS4gVGhpcyBpcyBzaGFyZWQgd2l0aAorICAgdnQuYyBmb3IgZGVlcGx5IGRpc2d1c3RpbmcgaGFjayByZWFzb25zICovCitERUNMQVJFX01VVEVYKHR0eV9zZW0pOworCisjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCitleHRlcm4gc3RydWN0IHR0eV9kcml2ZXIgKnB0bV9kcml2ZXI7CS8qIFVuaXg5OCBwdHkgbWFzdGVyczsgZm9yIC9kZXYvcHRteCAqLworZXh0ZXJuIGludCBwdHlfbGltaXQ7CQkvKiBDb25maWcgbGltaXQgb24gVW5peDk4IHB0eXMgKi8KK3N0YXRpYyBERUZJTkVfSURSKGFsbG9jYXRlZF9wdHlzKTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKGFsbG9jYXRlZF9wdHlzX2xvY2spOworc3RhdGljIGludCBwdG14X29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworI2VuZGlmCisKK2V4dGVybiB2b2lkIGRpc2FibGVfZWFybHlfcHJpbnRrKHZvaWQpOworCitzdGF0aWMgdm9pZCBpbml0aWFsaXplX3R0eV9zdHJ1Y3Qoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CisKK3N0YXRpYyBzc2l6ZV90IHR0eV9yZWFkKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOworc3RhdGljIHNzaXplX3QgdHR5X3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOworc3NpemVfdCByZWRpcmVjdGVkX3R0eV93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHR5X3BvbGwoc3RydWN0IGZpbGUgKiwgcG9sbF90YWJsZSAqKTsKK3N0YXRpYyBpbnQgdHR5X29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCB0dHlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitpbnQgdHR5X2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCB0dHlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKiBmaWxwLCBpbnQgb24pOworZXh0ZXJuIHZvaWQgcnNfMzYwX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCByZWxlYXNlX21lbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgaWR4KTsKKworCitzdGF0aWMgc3RydWN0IHR0eV9zdHJ1Y3QgKmFsbG9jX3R0eV9zdHJ1Y3Qodm9pZCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCisJdHR5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHR0eV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAodHR5KQorCQltZW1zZXQodHR5LCAwLCBzaXplb2Yoc3RydWN0IHR0eV9zdHJ1Y3QpKTsKKwlyZXR1cm4gdHR5OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV90dHlfc3RydWN0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJa2ZyZWUodHR5LT53cml0ZV9idWYpOworCWtmcmVlKHR0eSk7Cit9CisKKyNkZWZpbmUgVFRZX05VTUJFUih0dHkpICgodHR5KS0+aW5kZXggKyAodHR5KS0+ZHJpdmVyLT5uYW1lX2Jhc2UpCisKK2NoYXIgKnR0eV9uYW1lKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgKmJ1ZikKK3sKKwlpZiAoIXR0eSkgLyogSG1tLiAgTlVMTCBwb2ludGVyLiAgVGhhdCdzIGZ1bi4gKi8KKwkJc3RyY3B5KGJ1ZiwgIk5VTEwgdHR5Iik7CisJZWxzZQorCQlzdHJjcHkoYnVmLCB0dHktPm5hbWUpOworCXJldHVybiBidWY7Cit9CisKK0VYUE9SVF9TWU1CT0wodHR5X25hbWUpOworCitpbmxpbmUgaW50IHR0eV9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgY29uc3QgY2hhciAqcm91dGluZSkKK3sKKyNpZmRlZiBUVFlfUEFSQU5PSUFfQ0hFQ0sKKwlpZiAoIXR0eSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkibnVsbCBUVFkgZm9yICglZDolZCkgaW4gJXNcbiIsCisJCQlpbWFqb3IoaW5vZGUpLCBpbWlub3IoaW5vZGUpLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICh0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiYmFkIG1hZ2ljIG51bWJlciBmb3IgdHR5IHN0cnVjdCAoJWQ6JWQpIGluICVzXG4iLAorCQkJaW1ham9yKGlub2RlKSwgaW1pbm9yKGlub2RlKSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX3R0eV9jb3VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworI2lmZGVmIENIRUNLX1RUWV9DT1VOVAorCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJaW50IGNvdW50ID0gMDsKKwkKKwlmaWxlX2xpc3RfbG9jaygpOworCWxpc3RfZm9yX2VhY2gocCwgJnR0eS0+dHR5X2ZpbGVzKSB7CisJCWNvdW50Kys7CisJfQorCWZpbGVfbGlzdF91bmxvY2soKTsKKwlpZiAodHR5LT5kcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSAmJgorCSAgICB0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9TTEFWRSAmJgorCSAgICB0dHktPmxpbmsgJiYgdHR5LT5saW5rLT5jb3VudCkKKwkJY291bnQrKzsKKwlpZiAodHR5LT5jb3VudCAhPSBjb3VudCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nOiBkZXYgKCVzKSB0dHktPmNvdW50KCVkKSAiCisJCQkJICAgICIhPSAjZmQncyglZCkgaW4gJXNcbiIsCisJCSAgICAgICB0dHktPm5hbWUsIHR0eS0+Y291bnQsIGNvdW50LCByb3V0aW5lKTsKKwkJcmV0dXJuIGNvdW50OworICAgICAgIH0JCisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVRoaXMgaXMgcHJvYmFibHkgb3ZlcmtpbGwgZm9yIHJlYWwgd29ybGQgcHJvY2Vzc29ycyBidXQKKyAqCXRoZXkgYXJlIG5vdCBvbiBob3QgcGF0aHMgc28gYSBsaXR0bGUgZGlzY2lwbGluZSB3b24ndCBkbyAKKyAqCWFueSBoYXJtLgorICovCisgCitzdGF0aWMgdm9pZCB0dHlfc2V0X3Rlcm1pb3NfbGRpc2Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IG51bSkKK3sKKwlkb3duKCZ0dHktPnRlcm1pb3Nfc2VtKTsKKwl0dHktPnRlcm1pb3MtPmNfbGluZSA9IG51bTsKKwl1cCgmdHR5LT50ZXJtaW9zX3NlbSk7Cit9CisKKy8qCisgKglUaGlzIGd1YXJkcyB0aGUgcmVmY291bnRlZCBsaW5lIGRpc2NpcGxpbmUgbGlzdHMuIFRoZSBsb2NrCisgKgltdXN0IGJlIHRha2VuIHdpdGggaXJxcyBvZmYgYmVjYXVzZSB0aGVyZSBhcmUgaGFuZ3VwIHBhdGgKKyAqCWNhbGxlcnMgd2hvIHdpbGwgZG8gbGRpc2MgbG9va3VwcyBhbmQgY2Fubm90IHNsZWVwLgorICovCisgCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHR0eV9sZGlzY19sb2NrKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh0dHlfbGRpc2Nfd2FpdCk7CitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYyB0dHlfbGRpc2NzW05SX0xESVNDU107CS8qIGxpbmUgZGlzYyBkaXNwYXRjaCB0YWJsZQkqLworCitpbnQgdHR5X3JlZ2lzdGVyX2xkaXNjKGludCBkaXNjLCBzdHJ1Y3QgdHR5X2xkaXNjICpuZXdfbGRpc2MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwkKKwlpZiAoZGlzYyA8IE5fVFRZIHx8IGRpc2MgPj0gTlJfTERJU0NTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwlpZiAobmV3X2xkaXNjKSB7CisJCXR0eV9sZGlzY3NbZGlzY10gPSAqbmV3X2xkaXNjOworCQl0dHlfbGRpc2NzW2Rpc2NdLm51bSA9IGRpc2M7CisJCXR0eV9sZGlzY3NbZGlzY10uZmxhZ3MgfD0gTERJU0NfRkxBR19ERUZJTkVEOworCQl0dHlfbGRpc2NzW2Rpc2NdLnJlZmNvdW50ID0gMDsKKwl9IGVsc2UgeworCQlpZih0dHlfbGRpc2NzW2Rpc2NdLnJlZmNvdW50KQorCQkJcmV0ID0gLUVCVVNZOworCQllbHNlCisJCQl0dHlfbGRpc2NzW2Rpc2NdLmZsYWdzICY9IH5MRElTQ19GTEFHX0RFRklORUQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJCisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTCh0dHlfcmVnaXN0ZXJfbGRpc2MpOworCitzdHJ1Y3QgdHR5X2xkaXNjICp0dHlfbGRpc2NfZ2V0KGludCBkaXNjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisKKwlpZiAoZGlzYyA8IE5fVFRZIHx8IGRpc2MgPj0gTlJfTERJU0NTKQorCQlyZXR1cm4gTlVMTDsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKworCWxkID0gJnR0eV9sZGlzY3NbZGlzY107CisJLyogQ2hlY2sgdGhlIGVudHJ5IGlzIGRlZmluZWQgKi8KKwlpZihsZC0+ZmxhZ3MgJiBMRElTQ19GTEFHX0RFRklORUQpCisJeworCQkvKiBJZiB0aGUgbW9kdWxlIGlzIGJlaW5nIHVubG9hZGVkIHdlIGNhbid0IHVzZSBpdCAqLworCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGxkLT5vd25lcikpCisJCSAgICAgICAJbGQgPSBOVUxMOworCQllbHNlIC8qIGxvY2sgaXQgKi8KKwkJCWxkLT5yZWZjb3VudCsrOworCX0KKwllbHNlCisJCWxkID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOworCXJldHVybiBsZDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHR5X2xkaXNjX2dldCk7CisKK3ZvaWQgdHR5X2xkaXNjX3B1dChpbnQgZGlzYykKK3sKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChkaXNjIDwgTl9UVFkgfHwgZGlzYyA+PSBOUl9MRElTQ1MpCisJCUJVRygpOworCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwlsZCA9ICZ0dHlfbGRpc2NzW2Rpc2NdOworCWlmKGxkLT5yZWZjb3VudCA9PSAwKQorCQlCVUcoKTsKKwlsZC0+cmVmY291bnQgLS07CisJbW9kdWxlX3B1dChsZC0+b3duZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7Cit9CisJCitFWFBPUlRfU1lNQk9MX0dQTCh0dHlfbGRpc2NfcHV0KTsKKworc3RhdGljIHZvaWQgdHR5X2xkaXNjX2Fzc2lnbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdHR5X2xkaXNjICpsZCkKK3sKKwl0dHktPmxkaXNjID0gKmxkOworCXR0eS0+bGRpc2MucmVmY291bnQgPSAwOworfQorCisvKioKKyAqCXR0eV9sZGlzY190cnkJCS0JaW50ZXJuYWwgaGVscGVyCisgKglAdHR5OiB0aGUgdHR5CisgKgorICoJTWFrZSBhIHNpbmdsZSBhdHRlbXB0IHRvIGdyYWIgYW5kIGJ1bXAgdGhlIHJlZmNvdW50IG9uCisgKgl0aGUgdHR5IGxkaXNjLiBSZXR1cm4gMCBvbiBmYWlsdXJlIG9yIDEgb24gc3VjY2Vzcy4gVGhpcyBpcworICoJdXNlZCB0byBpbXBsZW1lbnQgYm90aCB0aGUgd2FpdGluZyBhbmQgbm9uIHdhaXRpbmcgdmVyc2lvbnMKKyAqCW9mIHR0eV9sZGlzY19yZWYKKyAqLworCitzdGF0aWMgaW50IHR0eV9sZGlzY190cnkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCWludCByZXQgPSAwOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOworCWxkID0gJnR0eS0+bGRpc2M7CisJaWYodGVzdF9iaXQoVFRZX0xESVNDLCAmdHR5LT5mbGFncykpCisJeworCQlsZC0+cmVmY291bnQrKzsKKwkJcmV0ID0gMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCXR0eV9sZGlzY19yZWZfd2FpdAktCXdhaXQgZm9yIHRoZSB0dHkgbGRpc2MKKyAqCUB0dHk6IHR0eSBkZXZpY2UKKyAqCisgKglEZXJlZmVyZW5jZSB0aGUgbGluZSBkaXNjaXBsaW5lIGZvciB0aGUgdGVybWluYWwgYW5kIHRha2UgYSAKKyAqCXJlZmVyZW5jZSB0byBpdC4gSWYgdGhlIGxpbmUgZGlzY2lwbGluZSBpcyBpbiBmbHV4IHRoZW4gCisgKgl3YWl0IHBhdGllbnRseSB1bnRpbCBpdCBjaGFuZ2VzLgorICoKKyAqCU5vdGU6IE11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIGFuIElSUS90aW1lciBjb250ZXh0LiBUaGUgY2FsbGVyCisgKgltdXN0IGFsc28gYmUgY2FyZWZ1bCBub3QgdG8gaG9sZCBvdGhlciBsb2NrcyB0aGF0IHdpbGwgZGVhZGxvY2sKKyAqCWFnYWluc3QgYSBkaXNjaXBsaW5lIGNoYW5nZSwgc3VjaCBhcyBhbiBleGlzdGluZyBsZGlzYyByZWZlcmVuY2UKKyAqCSh3aGljaCB3ZSBjaGVjayBmb3IpCisgKi8KKyAKK3N0cnVjdCB0dHlfbGRpc2MgKnR0eV9sZGlzY19yZWZfd2FpdChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCS8qIHdhaXRfZXZlbnQgaXMgYSBtYWNybyAqLworCXdhaXRfZXZlbnQodHR5X2xkaXNjX3dhaXQsIHR0eV9sZGlzY190cnkodHR5KSk7CisJaWYodHR5LT5sZGlzYy5yZWZjb3VudCA9PSAwKQorCQlwcmludGsoS0VSTl9FUlIgInR0eV9sZGlzY19yZWZfd2FpdFxuIik7CisJcmV0dXJuICZ0dHktPmxkaXNjOworfQorCitFWFBPUlRfU1lNQk9MX0dQTCh0dHlfbGRpc2NfcmVmX3dhaXQpOworCisvKioKKyAqCXR0eV9sZGlzY19yZWYJCS0JZ2V0IHRoZSB0dHkgbGRpc2MKKyAqCUB0dHk6IHR0eSBkZXZpY2UKKyAqCisgKglEZXJlZmVyZW5jZSB0aGUgbGluZSBkaXNjaXBsaW5lIGZvciB0aGUgdGVybWluYWwgYW5kIHRha2UgYSAKKyAqCXJlZmVyZW5jZSB0byBpdC4gSWYgdGhlIGxpbmUgZGlzY2lwbGluZSBpcyBpbiBmbHV4IHRoZW4gCisgKglyZXR1cm4gTlVMTC4gQ2FuIGJlIGNhbGxlZCBmcm9tIElSUSBhbmQgdGltZXIgZnVuY3Rpb25zLgorICovCisgCitzdHJ1Y3QgdHR5X2xkaXNjICp0dHlfbGRpc2NfcmVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaWYodHR5X2xkaXNjX3RyeSh0dHkpKQorCQlyZXR1cm4gJnR0eS0+bGRpc2M7CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHR0eV9sZGlzY19yZWYpOworCisvKioKKyAqCXR0eV9sZGlzY19kZXJlZgkJLQlmcmVlIGEgdHR5IGxkaXNjIHJlZmVyZW5jZQorICoJQGxkOiByZWZlcmVuY2UgdG8gZnJlZSB1cAorICoKKyAqCVVuZG9lcyB0aGUgZWZmZWN0IG9mIHR0eV9sZGlzY19yZWYgb3IgdHR5X2xkaXNjX3JlZl93YWl0LiBNYXkKKyAqCWJlIGNhbGxlZCBpbiBJUlEgY29udGV4dC4KKyAqLworIAordm9pZCB0dHlfbGRpc2NfZGVyZWYoc3RydWN0IHR0eV9sZGlzYyAqbGQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmKGxkID09IE5VTEwpCisJCUJVRygpOworCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwlpZihsZC0+cmVmY291bnQgPT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJ0dHlfbGRpc2NfZGVyZWY6IG5vIHJlZmVyZW5jZXMuXG4iKTsKKwllbHNlCisJCWxkLT5yZWZjb3VudC0tOworCWlmKGxkLT5yZWZjb3VudCA9PSAwKQorCQl3YWtlX3VwKCZ0dHlfbGRpc2Nfd2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHR5X2xkaXNjX2RlcmVmKTsKKworLyoqCisgKgl0dHlfbGRpc2NfZW5hYmxlCS0JYWxsb3cgbGRpc2MgdXNlCisgKglAdHR5OiB0ZXJtaW5hbCB0byBhY3RpdmF0ZSBsZGlzYyBvbgorICoKKyAqCVNldCB0aGUgVFRZX0xESVNDIGZsYWcgd2hlbiB0aGUgbGluZSBkaXNjaXBsaW5lIGNhbiBiZSBjYWxsZWQKKyAqCWFnYWluLiBEbyBuZWNjZXNzYXJ5IHdha2V1cHMgZm9yIGV4aXN0aW5nIHNsZWVwZXJzLgorICoKKyAqCU5vdGU6IG5vYm9keSBzaG91bGQgc2V0IHRoaXMgYml0IGV4Y2VwdCB2aWEgdGhpcyBmdW5jdGlvbi4gQ2xlYXJpbmcKKyAqCWRpcmVjdGx5IGlzIGFsbG93ZWQuCisgKi8KKworc3RhdGljIHZvaWQgdHR5X2xkaXNjX2VuYWJsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXNldF9iaXQoVFRZX0xESVNDLCAmdHR5LT5mbGFncyk7CisJd2FrZV91cCgmdHR5X2xkaXNjX3dhaXQpOworfQorCQorLyoqCisgKgl0dHlfc2V0X2xkaXNjCQktCXNldCBsaW5lIGRpc2NpcGxpbmUKKyAqCUB0dHk6IHRoZSB0ZXJtaW5hbCB0byBzZXQKKyAqCUBsZGlzYzogdGhlIGxpbmUgZGlzY2lwbGluZQorICoKKyAqCVNldCB0aGUgZGlzY2lwbGluZSBvZiBhIHR0eSBsaW5lLiBNdXN0IGJlIGNhbGxlZCBmcm9tIGEgcHJvY2VzcworICoJY29udGV4dC4KKyAqLworIAorc3RhdGljIGludCB0dHlfc2V0X2xkaXNjKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBsZGlzYykKK3sKKwlpbnQJcmV0dmFsID0gMDsKKwlzdHJ1Y3QJdHR5X2xkaXNjIG9fbGRpc2M7CisJY2hhciBidWZbNjRdOworCWludCB3b3JrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisKKwlpZiAoKGxkaXNjIDwgTl9UVFkpIHx8IChsZGlzYyA+PSBOUl9MRElTQ1MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworcmVzdGFydDoKKworCWlmICh0dHktPmxkaXNjLm51bSA9PSBsZGlzYykKKwkJcmV0dXJuIDA7CS8qIFdlIGFyZSBhbHJlYWR5IGluIHRoZSBkZXNpcmVkIGRpc2NpcGxpbmUgKi8KKwkKKwlsZCA9IHR0eV9sZGlzY19nZXQobGRpc2MpOworCS8qIEVkdWFyZG8gQmxhbmNvIDxlamJzQGNzLmNzLmNvbS51eT4gKi8KKwkvKiBDeXJ1cyBEdXJnaW4gPGNpZGVyQHNwZWFrZWFzeS5vcmc+ICovCisJaWYgKGxkID09IE5VTEwpIHsKKwkJcmVxdWVzdF9tb2R1bGUoInR0eS1sZGlzYy0lZCIsIGxkaXNjKTsKKwkJbGQgPSB0dHlfbGRpc2NfZ2V0KGxkaXNjKTsKKwl9CisJaWYgKGxkID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJb19sZGlzYyA9IHR0eS0+bGRpc2M7CisKKwl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisKKwkvKgorCSAqCU1ha2Ugc3VyZSB3ZSBkb24ndCBjaGFuZ2Ugd2hpbGUgc29tZW9uZSBob2xkcyBhCisJICoJcmVmZXJlbmNlIHRvIHRoZSBsaW5lIGRpc2NpcGxpbmUuIFRoZSBUVFlfTERJU0MgYml0CisJICoJcHJldmVudHMgYW55b25lIHRha2luZyBhIHJlZmVyZW5jZSBvbmNlIGl0IGlzIGNsZWFyLgorCSAqCVdlIG5lZWQgdGhlIGxvY2sgdG8gYXZvaWQgcmFjaW5nIHJlZmVyZW5jZSB0YWtlcnMuCisJICovCisJIAorCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOworCWlmKHR0eS0+bGRpc2MucmVmY291bnQpCisJeworCQkvKiBGcmVlIHRoZSBuZXcgbGRpc2Mgd2UgZ3JhYmJlZC4gTXVzdCBkcm9wIHRoZSBsb2NrCisJCSAgIGZpcnN0LiAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOworCQl0dHlfbGRpc2NfcHV0KGxkaXNjKTsKKwkJLyoKKwkJICogVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyB3ZSBtYXkgYmUgYnVzeSwgaW5jbHVkaW5nCisJCSAqIHJhbmRvbSBtb21lbnRhcnkgSS9PIHRyYWZmaWMuIFdlIG11c3QgdGhlcmVmb3JlCisJCSAqIHJldHJ5LiBXZSBjb3VsZCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGJsb2NraW5nIG9wcworCQkgKiBhbmQgcmV0cmllcyBpZiB3ZSBtYWRlIHR0eV9sZGlzY193YWl0KCkgc21hcnRlci4gVGhhdAorCQkgKiBpcyB1cCBmb3IgZGlzY3Vzc2lvbi4KKwkJICovCisJCWlmKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0dHlfbGRpc2Nfd2FpdCwgdHR5LT5sZGlzYy5yZWZjb3VudCA9PSAwKSA8IDApCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwkJCQorCQlnb3RvIHJlc3RhcnQ7CisJfQorCWNsZWFyX2JpdChUVFlfTERJU0MsICZ0dHktPmZsYWdzKTsJCisJY2xlYXJfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOworCQorCS8qCisJICoJRnJvbSB0aGlzIHBvaW50IG9uIHdlIGtub3cgbm9ib2R5IGhhcyBhbiBsZGlzYworCSAqCXVzYWdlIHJlZmVyZW5jZSwgbm9yIGNhbiB0aGV5IG9idGFpbiBvbmUgdW50aWwKKwkgKgl3ZSBzYXkgc28gbGF0ZXIgb24uCisJICovCisJIAorCXdvcmsgPSBjYW5jZWxfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yayk7CisJLyoKKwkgKiBXYWl0IGZvciAtPmhhbmd1cF93b3JrIGFuZCAtPmZsaXAud29yayBoYW5kbGVycyB0byB0ZXJtaW5hdGUKKwkgKi8KKwkgCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwkvKiBTaHV0ZG93biB0aGUgY3VycmVudCBkaXNjaXBsaW5lLiAqLworCWlmICh0dHktPmxkaXNjLmNsb3NlKQorCQkodHR5LT5sZGlzYy5jbG9zZSkodHR5KTsKKworCS8qIE5vdyBzZXQgdXAgdGhlIG5ldyBsaW5lIGRpc2NpcGxpbmUuICovCisJdHR5X2xkaXNjX2Fzc2lnbih0dHksIGxkKTsKKwl0dHlfc2V0X3Rlcm1pb3NfbGRpc2ModHR5LCBsZGlzYyk7CisJaWYgKHR0eS0+bGRpc2Mub3BlbikKKwkJcmV0dmFsID0gKHR0eS0+bGRpc2Mub3BlbikodHR5KTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQl0dHlfbGRpc2NfcHV0KGxkaXNjKTsKKwkJLyogVGhlcmUgaXMgYW4gb3V0c3RhbmRpbmcgcmVmZXJlbmNlIGhlcmUgc28gdGhpcyBpcyBzYWZlICovCisJCXR0eV9sZGlzY19hc3NpZ24odHR5LCB0dHlfbGRpc2NfZ2V0KG9fbGRpc2MubnVtKSk7CisJCXR0eV9zZXRfdGVybWlvc19sZGlzYyh0dHksIHR0eS0+bGRpc2MubnVtKTsKKwkJaWYgKHR0eS0+bGRpc2Mub3BlbiAmJiAodHR5LT5sZGlzYy5vcGVuKHR0eSkgPCAwKSkgeworCQkJdHR5X2xkaXNjX3B1dChvX2xkaXNjLm51bSk7CisJCQkvKiBUaGlzIGRyaXZlciBpcyBhbHdheXMgcHJlc2VudCAqLworCQkJdHR5X2xkaXNjX2Fzc2lnbih0dHksIHR0eV9sZGlzY19nZXQoTl9UVFkpKTsKKwkJCXR0eV9zZXRfdGVybWlvc19sZGlzYyh0dHksIE5fVFRZKTsKKwkJCWlmICh0dHktPmxkaXNjLm9wZW4pIHsKKwkJCQlpbnQgciA9IHR0eS0+bGRpc2Mub3Blbih0dHkpOworCisJCQkJaWYgKHIgPCAwKQorCQkJCQlwYW5pYygiQ291bGRuJ3Qgb3BlbiBOX1RUWSBsZGlzYyBmb3IgIgorCQkJCQkgICAgICAiJXMgLS0tIGVycm9yICVkLiIsCisJCQkJCSAgICAgIHR0eV9uYW1lKHR0eSwgYnVmKSwgcik7CisJCQl9CisJCX0KKwl9CisJLyogQXQgdGhpcyBwb2ludCB3ZSBob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBuZXcgbGRpc2MgYW5kIGEKKwkgICBhIHJlZmVyZW5jZSB0byB0aGUgb2xkIGxkaXNjLiBJZiB3ZSBlbmRlZCB1cCBmbGlwcGluZyBiYWNrCisJICAgdG8gdGhlIGV4aXN0aW5nIGxkaXNjIHdlIGhhdmUgdHdvIHJlZmVyZW5jZXMgdG8gaXQgKi8KKwkKKwlpZiAodHR5LT5sZGlzYy5udW0gIT0gb19sZGlzYy5udW0gJiYgdHR5LT5kcml2ZXItPnNldF9sZGlzYykKKwkJdHR5LT5kcml2ZXItPnNldF9sZGlzYyh0dHkpOworCQkKKwl0dHlfbGRpc2NfcHV0KG9fbGRpc2MubnVtKTsKKwkKKwkvKgorCSAqCUFsbG93IGxkaXNjIHJlZmVyZW5jaW5nIHRvIG9jY3VyIGFzIHNvb24gYXMgdGhlIGRyaXZlcgorCSAqCWxkaXNjIGNhbGxiYWNrIGNvbXBsZXRlcy4KKwkgKi8KKwkgCisJdHR5X2xkaXNjX2VuYWJsZSh0dHkpOworCQorCS8qIFJlc3RhcnQgaXQgaW4gY2FzZSBubyBjaGFyYWN0ZXJzIGtpY2sgaXQgb2ZmLiBTYWZlIGlmCisJICAgYWxyZWFkeSBydW5uaW5nICovCisJaWYod29yaykKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSByZXR1cm5zIGEgdHR5IGRyaXZlciBzdHJ1Y3R1cmUsIGdpdmVuIGEgZGV2aWNlIG51bWJlcgorICovCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmdldF90dHlfZHJpdmVyKGRldl90IGRldmljZSwgaW50ICppbmRleCkKK3sKKwlzdHJ1Y3QgdHR5X2RyaXZlciAqcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnR0eV9kcml2ZXJzLCB0dHlfZHJpdmVycykgeworCQlkZXZfdCBiYXNlID0gTUtERVYocC0+bWFqb3IsIHAtPm1pbm9yX3N0YXJ0KTsKKwkJaWYgKGRldmljZSA8IGJhc2UgfHwgZGV2aWNlID49IGJhc2UgKyBwLT5udW0pCisJCQljb250aW51ZTsKKwkJKmluZGV4ID0gZGV2aWNlIC0gYmFzZTsKKwkJcmV0dXJuIHA7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogSWYgd2UgdHJ5IHRvIHdyaXRlIHRvLCBvciBzZXQgdGhlIHN0YXRlIG9mLCBhIHRlcm1pbmFsIGFuZCB3ZSdyZQorICogbm90IGluIHRoZSBmb3JlZ3JvdW5kLCBzZW5kIGEgU0lHVFRPVS4gIElmIHRoZSBzaWduYWwgaXMgYmxvY2tlZCBvcgorICogaWdub3JlZCwgZ28gYWhlYWQgYW5kIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi4gIChQT1NJWCA3LjIpCisgKi8KK2ludCB0dHlfY2hlY2tfY2hhbmdlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCWlmIChjdXJyZW50LT5zaWduYWwtPnR0eSAhPSB0dHkpCisJCXJldHVybiAwOworCWlmICh0dHktPnBncnAgPD0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0dHlfY2hlY2tfY2hhbmdlOiB0dHktPnBncnAgPD0gMCFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHByb2Nlc3NfZ3JvdXAoY3VycmVudCkgPT0gdHR5LT5wZ3JwKQorCQlyZXR1cm4gMDsKKwlpZiAoaXNfaWdub3JlZChTSUdUVE9VKSkKKwkJcmV0dXJuIDA7CisJaWYgKGlzX29ycGhhbmVkX3BncnAocHJvY2Vzc19ncm91cChjdXJyZW50KSkpCisJCXJldHVybiAtRUlPOworCSh2b2lkKSBraWxsX3BnKHByb2Nlc3NfZ3JvdXAoY3VycmVudCksIFNJR1RUT1UsIDEpOworCXJldHVybiAtRVJFU1RBUlRTWVM7Cit9CisKK0VYUE9SVF9TWU1CT0wodHR5X2NoZWNrX2NoYW5nZSk7CisKK3N0YXRpYyBzc2l6ZV90IGh1bmdfdXBfdHR5X3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgaHVuZ191cF90dHlfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIGhlbGQgLSBub25lIG5lZWRlZCA7KSAqLworc3RhdGljIHVuc2lnbmVkIGludCBodW5nX3VwX3R0eV9wb2xsKHN0cnVjdCBmaWxlICogZmlscCwgcG9sbF90YWJsZSAqIHdhaXQpCit7CisJcmV0dXJuIFBPTExJTiB8IFBPTExPVVQgfCBQT0xMRVJSIHwgUE9MTEhVUCB8IFBPTExSRE5PUk0gfCBQT0xMV1JOT1JNOworfQorCitzdGF0aWMgaW50IGh1bmdfdXBfdHR5X2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBjbWQgPT0gVElPQ1NQR1JQID8gLUVOT1RUWSA6IC1FSU87Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHR0eV9mb3BzID0geworCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHR0eV9yZWFkLAorCS53cml0ZQkJPSB0dHlfd3JpdGUsCisJLnBvbGwJCT0gdHR5X3BvbGwsCisJLmlvY3RsCQk9IHR0eV9pb2N0bCwKKwkub3BlbgkJPSB0dHlfb3BlbiwKKwkucmVsZWFzZQk9IHR0eV9yZWxlYXNlLAorCS5mYXN5bmMJCT0gdHR5X2Zhc3luYywKK307CisKKyNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHB0bXhfZm9wcyA9IHsKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSB0dHlfcmVhZCwKKwkud3JpdGUJCT0gdHR5X3dyaXRlLAorCS5wb2xsCQk9IHR0eV9wb2xsLAorCS5pb2N0bAkJPSB0dHlfaW9jdGwsCisJLm9wZW4JCT0gcHRteF9vcGVuLAorCS5yZWxlYXNlCT0gdHR5X3JlbGVhc2UsCisJLmZhc3luYwkJPSB0dHlfZmFzeW5jLAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb25zb2xlX2ZvcHMgPSB7CisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gdHR5X3JlYWQsCisJLndyaXRlCQk9IHJlZGlyZWN0ZWRfdHR5X3dyaXRlLAorCS5wb2xsCQk9IHR0eV9wb2xsLAorCS5pb2N0bAkJPSB0dHlfaW9jdGwsCisJLm9wZW4JCT0gdHR5X29wZW4sCisJLnJlbGVhc2UJPSB0dHlfcmVsZWFzZSwKKwkuZmFzeW5jCQk9IHR0eV9mYXN5bmMsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBodW5nX3VwX3R0eV9mb3BzID0geworCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGh1bmdfdXBfdHR5X3JlYWQsCisJLndyaXRlCQk9IGh1bmdfdXBfdHR5X3dyaXRlLAorCS5wb2xsCQk9IGh1bmdfdXBfdHR5X3BvbGwsCisJLmlvY3RsCQk9IGh1bmdfdXBfdHR5X2lvY3RsLAorCS5yZWxlYXNlCT0gdHR5X3JlbGVhc2UsCit9OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJlZGlyZWN0X2xvY2spOworc3RhdGljIHN0cnVjdCBmaWxlICpyZWRpcmVjdDsKKworLyoqCisgKgl0dHlfd2FrZXVwCS0JcmVxdWVzdCBtb3JlIGRhdGEKKyAqCUB0dHk6IHRlcm1pbmFsCisgKgorICoJSW50ZXJuYWwgYW5kIGV4dGVybmFsIGhlbHBlciBmb3Igd2FrZXVwcyBvZiB0dHkuIFRoaXMgZnVuY3Rpb24KKyAqCWluZm9ybXMgdGhlIGxpbmUgZGlzY2lwbGluZSBpZiBwcmVzZW50IHRoYXQgdGhlIGRyaXZlciBpcyByZWFkeQorICoJdG8gcmVjZWl2ZSBtb3JlIG91dHB1dCBkYXRhLgorICovCisgCit2b2lkIHR0eV93YWtldXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwkKKwlpZiAodGVzdF9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnR0eS0+ZmxhZ3MpKSB7CisJCWxkID0gdHR5X2xkaXNjX3JlZih0dHkpOworCQlpZihsZCkgeworCQkJaWYobGQtPndyaXRlX3dha2V1cCkKKwkJCQlsZC0+d3JpdGVfd2FrZXVwKHR0eSk7CisJCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCQl9CisJfQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHR5X3dha2V1cCk7CisKKy8qKgorICoJdHR5X2xkaXNjX2ZsdXNoCS0JZmx1c2ggbGluZSBkaXNjaXBsaW5lIHF1ZXVlCisgKglAdHR5OiB0dHkKKyAqCisgKglGbHVzaCB0aGUgbGluZSBkaXNjaXBsaW5lIHF1ZXVlIChpZiBhbnkpIGZvciB0aGlzIHR0eS4gSWYgdGhlcmUKKyAqCWlzIG5vIGxpbmUgZGlzY2lwbGluZSBhY3RpdmUgdGhpcyBpcyBhIG5vLW9wLgorICovCisgCit2b2lkIHR0eV9sZGlzY19mbHVzaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB0dHlfbGRpc2MgKmxkID0gdHR5X2xkaXNjX3JlZih0dHkpOworCWlmKGxkKSB7CisJCWlmKGxkLT5mbHVzaF9idWZmZXIpCisJCQlsZC0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJfQorfQorCitFWFBPUlRfU1lNQk9MX0dQTCh0dHlfbGRpc2NfZmx1c2gpOworCQorLyoKKyAqIFRoaXMgY2FuIGJlIGNhbGxlZCBieSB0aGUgImV2ZW50ZCIga2VybmVsIHRocmVhZC4gIFRoYXQgaXMgcHJvY2VzcyBzeW5jaHJvbm91cywKKyAqIGJ1dCBkb2Vzbid0IGhvbGQgYW55IGxvY2tzLCBzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBhcHByb3ByaWF0ZQorICogbG9ja3MgZm9yIHdoYXQgd2UncmUgZG9pbmcuLgorICovCitzdGF0aWMgdm9pZCBkb190dHlfaGFuZ3VwKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBkYXRhOworCXN0cnVjdCBmaWxlICogY29uc19maWxwID0gTlVMTDsKKwlzdHJ1Y3QgZmlsZSAqZmlscCwgKmYgPSBOVUxMOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwlpbnQgICAgY2xvc2Vjb3VudCA9IDAsIG47CisKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCisJLyogaW51c2VfZmlscHMgaXMgcHJvdGVjdGVkIGJ5IHRoZSBzaW5nbGUga2VybmVsIGxvY2sgKi8KKwlsb2NrX2tlcm5lbCgpOworCisJc3Bpbl9sb2NrKCZyZWRpcmVjdF9sb2NrKTsKKwlpZiAocmVkaXJlY3QgJiYgcmVkaXJlY3QtPnByaXZhdGVfZGF0YSA9PSB0dHkpIHsKKwkJZiA9IHJlZGlyZWN0OworCQlyZWRpcmVjdCA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrKCZyZWRpcmVjdF9sb2NrKTsKKwkKKwljaGVja190dHlfY291bnQodHR5LCAiZG9fdHR5X2hhbmd1cCIpOworCWZpbGVfbGlzdF9sb2NrKCk7CisJLyogVGhpcyBicmVha3MgZm9yIGZpbGUgaGFuZGxlcyBiZWluZyBzZW50IG92ZXIgQUZfVU5JWCBzb2NrZXRzID8gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpbHAsICZ0dHktPnR0eV9maWxlcywgZl9saXN0KSB7CisJCWlmIChmaWxwLT5mX29wLT53cml0ZSA9PSByZWRpcmVjdGVkX3R0eV93cml0ZSkKKwkJCWNvbnNfZmlscCA9IGZpbHA7CisJCWlmIChmaWxwLT5mX29wLT53cml0ZSAhPSB0dHlfd3JpdGUpCisJCQljb250aW51ZTsKKwkJY2xvc2Vjb3VudCsrOworCQl0dHlfZmFzeW5jKC0xLCBmaWxwLCAwKTsJLyogY2FuJ3QgYmxvY2sgKi8KKwkJZmlscC0+Zl9vcCA9ICZodW5nX3VwX3R0eV9mb3BzOworCX0KKwlmaWxlX2xpc3RfdW5sb2NrKCk7CisJCisJLyogRklYTUUhIFdoYXQgYXJlIHRoZSBsb2NraW5nIGlzc3VlcyBoZXJlPyBUaGlzIG1heSBtZSBvdmVyZG9pbmcgdGhpbmdzLi4KKwkgKiB0aGlzIHF1ZXN0aW9uIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IG5vdyB0aGF0IHdlJ3ZlIHJlbW92ZWQgdGhlIGlycWxvY2suICovCisKKwlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwlpZihsZCAhPSBOVUxMKQkvKiBXZSBtYXkgaGF2ZSBubyBsaW5lIGRpc2NpcGxpbmUgYXQgdGhpcyBwb2ludCAqLworCXsKKwkJaWYgKGxkLT5mbHVzaF9idWZmZXIpCisJCQlsZC0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCQlpZiAoKHRlc3RfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKSkgJiYKKwkJICAgIGxkLT53cml0ZV93YWtldXApCisJCQlsZC0+d3JpdGVfd2FrZXVwKHR0eSk7CisJCWlmIChsZC0+aGFuZ3VwKQorCQkJbGQtPmhhbmd1cCh0dHkpOworCX0KKworCS8qIEZJWE1FOiBPbmNlIHdlIHRydXN0IHRoZSBMRElTQyBjb2RlIGJldHRlciB3ZSBjYW4gd2FpdCBoZXJlIGZvcgorCSAgIGxkaXNjIGNvbXBsZXRpb24gYW5kIGZpeCB0aGUgZHJpdmVyIGNhbGwgcmFjZSAqLworCSAgIAorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cmVhZF93YWl0KTsKKworCS8qCisJICogU2h1dGRvd24gdGhlIGN1cnJlbnQgbGluZSBkaXNjaXBsaW5lLCBhbmQgcmVzZXQgaXQgdG8KKwkgKiBOX1RUWS4KKwkgKi8KKwlpZiAodHR5LT5kcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9SRVNFVF9URVJNSU9TKQorCXsKKwkJZG93bigmdHR5LT50ZXJtaW9zX3NlbSk7CisJCSp0dHktPnRlcm1pb3MgPSB0dHktPmRyaXZlci0+aW5pdF90ZXJtaW9zOworCQl1cCgmdHR5LT50ZXJtaW9zX3NlbSk7CisJfQorCQorCS8qIERlZmVyIGxkaXNjIHN3aXRjaCAqLworCS8qIHR0eV9kZWZlcnJlZF9sZGlzY19zd2l0Y2goTl9UVFkpOworCQorCSAgVGhpcyBzaG91bGQgZ2V0IGRvbmUgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwb3J0IGNsb3NlcyBhbmQKKwkgIHR0eV9yZWxlYXNlIGlzIGNhbGxlZCAqLworCQorCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJaWYgKHR0eS0+c2Vzc2lvbiA+IDApIHsKKwkJZG9fZWFjaF90YXNrX3BpZCh0dHktPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKSB7CisJCQlpZiAocC0+c2lnbmFsLT50dHkgPT0gdHR5KQorCQkJCXAtPnNpZ25hbC0+dHR5ID0gTlVMTDsKKwkJCWlmICghcC0+c2lnbmFsLT5sZWFkZXIpCisJCQkJY29udGludWU7CisJCQlzZW5kX2dyb3VwX3NpZ19pbmZvKFNJR0hVUCwgU0VORF9TSUdfUFJJViwgcCk7CisJCQlzZW5kX2dyb3VwX3NpZ19pbmZvKFNJR0NPTlQsIFNFTkRfU0lHX1BSSVYsIHApOworCQkJaWYgKHR0eS0+cGdycCA+IDApCisJCQkJcC0+c2lnbmFsLT50dHlfb2xkX3BncnAgPSB0dHktPnBncnA7CisJCX0gd2hpbGVfZWFjaF90YXNrX3BpZCh0dHktPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKTsKKwl9CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCisJdHR5LT5mbGFncyA9IDA7CisJdHR5LT5zZXNzaW9uID0gMDsKKwl0dHktPnBncnAgPSAtMTsKKwl0dHktPmN0cmxfc3RhdHVzID0gMDsKKwkvKgorCSAqCUlmIG9uZSBvZiB0aGUgZGV2aWNlcyBtYXRjaGVzIGEgY29uc29sZSBwb2ludGVyLCB3ZQorCSAqCWNhbm5vdCBqdXN0IGNhbGwgaGFuZ3VwKCkgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UKKwkgKgl0dHktPmNvdW50IGFuZCBzdGF0ZS0+Y291bnQgdG8gZ28gb3V0IG9mIHN5bmMuCisJICoJU28gd2UganVzdCBjYWxsIGNsb3NlKCkgdGhlIHJpZ2h0IG51bWJlciBvZiB0aW1lcy4KKwkgKi8KKwlpZiAoY29uc19maWxwKSB7CisJCWlmICh0dHktPmRyaXZlci0+Y2xvc2UpCisJCQlmb3IgKG4gPSAwOyBuIDwgY2xvc2Vjb3VudDsgbisrKQorCQkJCXR0eS0+ZHJpdmVyLT5jbG9zZSh0dHksIGNvbnNfZmlscCk7CisJfSBlbHNlIGlmICh0dHktPmRyaXZlci0+aGFuZ3VwKQorCQkodHR5LT5kcml2ZXItPmhhbmd1cCkodHR5KTsKKwkJCisJLyogV2UgZG9uJ3Qgd2FudCB0byBoYXZlIGRyaXZlci9sZGlzYyBpbnRlcmFjdGlvbnMgYmV5b25kCisJICAgdGhlIG9uZXMgd2UgZGlkIGhlcmUuIFRoZSBkcml2ZXIgbGF5ZXIgZXhwZWN0cyBubworCSAgIGNhbGxzIGFmdGVyIC0+aGFuZ3VwKCkgZnJvbSB0aGUgbGRpc2Mgc2lkZS4gSG93ZXZlciB3ZQorCSAgIGNhbid0IHlldCBndWFyYW50ZWUgYWxsIHRoYXQgKi8KKworCXNldF9iaXQoVFRZX0hVUFBFRCwgJnR0eS0+ZmxhZ3MpOworCWlmIChsZCkgeworCQl0dHlfbGRpc2NfZW5hYmxlKHR0eSk7CisJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlpZiAoZikKKwkJZnB1dChmKTsKK30KKwordm9pZCB0dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworI2lmZGVmIFRUWV9ERUJVR19IQU5HVVAKKwljaGFyCWJ1Zls2NF07CisJCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGhhbmd1cC4uLlxuIiwgdHR5X25hbWUodHR5LCBidWYpKTsKKyNlbmRpZgorCXNjaGVkdWxlX3dvcmsoJnR0eS0+aGFuZ3VwX3dvcmspOworfQorCitFWFBPUlRfU1lNQk9MKHR0eV9oYW5ndXApOworCit2b2lkIHR0eV92aGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworI2lmZGVmIFRUWV9ERUJVR19IQU5HVVAKKwljaGFyCWJ1Zls2NF07CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMgdmhhbmd1cC4uLlxuIiwgdHR5X25hbWUodHR5LCBidWYpKTsKKyNlbmRpZgorCWRvX3R0eV9oYW5ndXAoKHZvaWQgKikgdHR5KTsKK30KK0VYUE9SVF9TWU1CT0wodHR5X3ZoYW5ndXApOworCitpbnQgdHR5X2h1bmdfdXBfcChzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJcmV0dXJuIChmaWxwLT5mX29wID09ICZodW5nX3VwX3R0eV9mb3BzKTsKK30KKworRVhQT1JUX1NZTUJPTCh0dHlfaHVuZ191cF9wKTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdHlwaWNhbGx5IGNhbGxlZCBvbmx5IGJ5IHRoZSBzZXNzaW9uIGxlYWRlciwgd2hlbgorICogaXQgd2FudHMgdG8gZGlzYXNzb2NpYXRlIGl0c2VsZiBmcm9tIGl0cyBjb250cm9sbGluZyB0dHkuCisgKgorICogSXQgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CisgKiAJKDEpICBTZW5kcyBhIFNJR0hVUCBhbmQgU0lHQ09OVCB0byB0aGUgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwCisgKiAJKDIpICBDbGVhcnMgdGhlIHR0eSBmcm9tIGJlaW5nIGNvbnRyb2xsaW5nIHRoZSBzZXNzaW9uCisgKiAJKDMpICBDbGVhcnMgdGhlIGNvbnRyb2xsaW5nIHR0eSBmb3IgYWxsIHByb2Nlc3NlcyBpbiB0aGUKKyAqIAkJc2Vzc2lvbiBncm91cC4KKyAqCisgKiBUaGUgYXJndW1lbnQgb25fZXhpdCBpcyBzZXQgdG8gMSBpZiBjYWxsZWQgd2hlbiBhIHByb2Nlc3MgaXMKKyAqIGV4aXRpbmc7IGl0IGlzIDAgaWYgY2FsbGVkIGJ5IHRoZSBpb2N0bCBUSU9DTk9UVFkuCisgKi8KK3ZvaWQgZGlzYXNzb2NpYXRlX2N0dHkoaW50IG9uX2V4aXQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisJaW50IHR0eV9wZ3JwID0gLTE7CisKKwlsb2NrX2tlcm5lbCgpOworCisJZG93bigmdHR5X3NlbSk7CisJdHR5ID0gY3VycmVudC0+c2lnbmFsLT50dHk7CisJaWYgKHR0eSkgeworCQl0dHlfcGdycCA9IHR0eS0+cGdycDsKKwkJdXAoJnR0eV9zZW0pOworCQlpZiAob25fZXhpdCAmJiB0dHktPmRyaXZlci0+dHlwZSAhPSBUVFlfRFJJVkVSX1RZUEVfUFRZKQorCQkJdHR5X3ZoYW5ndXAodHR5KTsKKwl9IGVsc2UgeworCQlpZiAoY3VycmVudC0+c2lnbmFsLT50dHlfb2xkX3BncnApIHsKKwkJCWtpbGxfcGcoY3VycmVudC0+c2lnbmFsLT50dHlfb2xkX3BncnAsIFNJR0hVUCwgb25fZXhpdCk7CisJCQlraWxsX3BnKGN1cnJlbnQtPnNpZ25hbC0+dHR5X29sZF9wZ3JwLCBTSUdDT05ULCBvbl9leGl0KTsKKwkJfQorCQl1cCgmdHR5X3NlbSk7CisJCXVubG9ja19rZXJuZWwoKTsJCisJCXJldHVybjsKKwl9CisJaWYgKHR0eV9wZ3JwID4gMCkgeworCQlraWxsX3BnKHR0eV9wZ3JwLCBTSUdIVVAsIG9uX2V4aXQpOworCQlpZiAoIW9uX2V4aXQpCisJCQlraWxsX3BnKHR0eV9wZ3JwLCBTSUdDT05ULCBvbl9leGl0KTsKKwl9CisKKwkvKiBNdXN0IGxvY2sgY2hhbmdlcyB0byB0dHlfb2xkX3BncnAgKi8KKwlkb3duKCZ0dHlfc2VtKTsKKwljdXJyZW50LT5zaWduYWwtPnR0eV9vbGRfcGdycCA9IDA7CisJdHR5LT5zZXNzaW9uID0gMDsKKwl0dHktPnBncnAgPSAtMTsKKworCS8qIE5vdyBjbGVhciBzaWduYWwtPnR0eSB1bmRlciB0aGUgbG9jayAqLworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJZG9fZWFjaF90YXNrX3BpZChjdXJyZW50LT5zaWduYWwtPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKSB7CisJCXAtPnNpZ25hbC0+dHR5ID0gTlVMTDsKKwl9IHdoaWxlX2VhY2hfdGFza19waWQoY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uLCBQSURUWVBFX1NJRCwgcCk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCXVwKCZ0dHlfc2VtKTsKKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKK3ZvaWQgc3RvcF90dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAodHR5LT5zdG9wcGVkKQorCQlyZXR1cm47CisJdHR5LT5zdG9wcGVkID0gMTsKKwlpZiAodHR5LT5saW5rICYmIHR0eS0+bGluay0+cGFja2V0KSB7CisJCXR0eS0+Y3RybF9zdGF0dXMgJj0gflRJT0NQS1RfU1RBUlQ7CisJCXR0eS0+Y3RybF9zdGF0dXMgfD0gVElPQ1BLVF9TVE9QOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+bGluay0+cmVhZF93YWl0KTsKKwl9CisJaWYgKHR0eS0+ZHJpdmVyLT5zdG9wKQorCQkodHR5LT5kcml2ZXItPnN0b3ApKHR0eSk7Cit9CisKK0VYUE9SVF9TWU1CT0woc3RvcF90dHkpOworCit2b2lkIHN0YXJ0X3R0eShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICghdHR5LT5zdG9wcGVkIHx8IHR0eS0+Zmxvd19zdG9wcGVkKQorCQlyZXR1cm47CisJdHR5LT5zdG9wcGVkID0gMDsKKwlpZiAodHR5LT5saW5rICYmIHR0eS0+bGluay0+cGFja2V0KSB7CisJCXR0eS0+Y3RybF9zdGF0dXMgJj0gflRJT0NQS1RfU1RPUDsKKwkJdHR5LT5jdHJsX3N0YXR1cyB8PSBUSU9DUEtUX1NUQVJUOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+bGluay0+cmVhZF93YWl0KTsKKwl9CisJaWYgKHR0eS0+ZHJpdmVyLT5zdGFydCkKKwkJKHR0eS0+ZHJpdmVyLT5zdGFydCkodHR5KTsKKworCS8qIElmIHdlIGhhdmUgYSBydW5uaW5nIGxpbmUgZGlzY2lwbGluZSBpdCBtYXkgbmVlZCBraWNraW5nICovCisJdHR5X3dha2V1cCh0dHkpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKK30KKworRVhQT1JUX1NZTUJPTChzdGFydF90dHkpOworCitzdGF0aWMgc3NpemVfdCB0dHlfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsIAorCQkJbG9mZl90ICpwcG9zKQoreworCWludCBpOworCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisKKwl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgaW5vZGUsICJ0dHlfcmVhZCIpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoIXR0eSB8fCAodGVzdF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncykpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIFdlIHdhbnQgdG8gd2FpdCBmb3IgdGhlIGxpbmUgZGlzY2lwbGluZSB0byBzb3J0IG91dCBpbiB0aGlzCisJICAgc2l0dWF0aW9uICovCisJbGQgPSB0dHlfbGRpc2NfcmVmX3dhaXQodHR5KTsKKwlsb2NrX2tlcm5lbCgpOworCWlmIChsZC0+cmVhZCkKKwkJaSA9IChsZC0+cmVhZCkodHR5LGZpbGUsYnVmLGNvdW50KTsKKwllbHNlCisJCWkgPSAtRUlPOworCXR0eV9sZGlzY19kZXJlZihsZCk7CisJdW5sb2NrX2tlcm5lbCgpOworCWlmIChpID4gMCkKKwkJaW5vZGUtPmlfYXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCXJldHVybiBpOworfQorCisvKgorICogU3BsaXQgd3JpdGVzIHVwIGluIHNhbmUgYmxvY2tzaXplcyB0byBhdm9pZAorICogZGVuaWFsLW9mLXNlcnZpY2UgdHlwZSBhdHRhY2tzCisgKi8KK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBkb190dHlfd3JpdGUoCisJc3NpemVfdCAoKndyaXRlKShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHNpemVfdCksCisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwlzdHJ1Y3QgZmlsZSAqZmlsZSwKKwljb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCXNpemVfdCBjb3VudCkKK3sKKwlzc2l6ZV90IHJldCA9IDAsIHdyaXR0ZW4gPSAwOworCXVuc2lnbmVkIGludCBjaHVuazsKKwkKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0dHktPmF0b21pY193cml0ZSkpIHsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisKKwkvKgorCSAqIFdlIGNodW5rIHVwIHdyaXRlcyBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhpcworCSAqIHNpbXBsaWZpZXMgbG93LWxldmVsIGRyaXZlcnMgaW1tZW5zZWx5LCBzaW5jZSB0aGV5CisJICogZG9uJ3QgaGF2ZSBsb2NraW5nIGlzc3VlcyBhbmQgdXNlciBtb2RlIGFjY2Vzc2VzLgorCSAqCisJICogQnV0IGlmIFRUWV9OT19XUklURV9TUExJVCBpcyBzZXQsIHdlIHNob3VsZCB1c2UgYQorCSAqIGJpZyBjaHVuay1zaXplLi4KKwkgKgorCSAqIFRoZSBkZWZhdWx0IGNodW5rLXNpemUgaXMgMmtCLCBiZWNhdXNlIHRoZSBOVFRZCisJICogbGF5ZXIgaGFzIHByb2JsZW1zIHdpdGggYmlnZ2VyIGNodW5rcy4gSXQgd2lsbAorCSAqIGNsYWltIHRvIGJlIGFibGUgdG8gaGFuZGxlIG1vcmUgY2hhcmFjdGVycyB0aGFuCisJICogaXQgYWN0dWFsbHkgZG9lcy4KKwkgKi8KKwljaHVuayA9IDIwNDg7CisJaWYgKHRlc3RfYml0KFRUWV9OT19XUklURV9TUExJVCwgJnR0eS0+ZmxhZ3MpKQorCQljaHVuayA9IDY1NTM2OworCWlmIChjb3VudCA8IGNodW5rKQorCQljaHVuayA9IGNvdW50OworCisJLyogd3JpdGVfYnVmL3dyaXRlX2NudCBpcyBwcm90ZWN0ZWQgYnkgdGhlIGF0b21pY193cml0ZSBzZW1hcGhvcmUgKi8KKwlpZiAodHR5LT53cml0ZV9jbnQgPCBjaHVuaykgeworCQl1bnNpZ25lZCBjaGFyICpidWY7CisKKwkJaWYgKGNodW5rIDwgMTAyNCkKKwkJCWNodW5rID0gMTAyNDsKKworCQlidWYgPSBrbWFsbG9jKGNodW5rLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWYpIHsKKwkJCXVwKCZ0dHktPmF0b21pY193cml0ZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlrZnJlZSh0dHktPndyaXRlX2J1Zik7CisJCXR0eS0+d3JpdGVfY250ID0gY2h1bms7CisJCXR0eS0+d3JpdGVfYnVmID0gYnVmOworCX0KKworCS8qIERvIHRoZSB3cml0ZSAuLiAqLworCWZvciAoOzspIHsKKwkJc2l6ZV90IHNpemUgPSBjb3VudDsKKwkJaWYgKHNpemUgPiBjaHVuaykKKwkJCXNpemUgPSBjaHVuazsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHR0eS0+d3JpdGVfYnVmLCBidWYsIHNpemUpKQorCQkJYnJlYWs7CisJCWxvY2tfa2VybmVsKCk7CisJCXJldCA9IHdyaXRlKHR0eSwgZmlsZSwgdHR5LT53cml0ZV9idWYsIHNpemUpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCWlmIChyZXQgPD0gMCkKKwkJCWJyZWFrOworCQl3cml0dGVuICs9IHJldDsKKwkJYnVmICs9IHJldDsKKwkJY291bnQgLT0gcmV0OworCQlpZiAoIWNvdW50KQorCQkJYnJlYWs7CisJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlpZiAod3JpdHRlbikgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCWlub2RlLT5pX210aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwkJcmV0ID0gd3JpdHRlbjsKKwl9CisJdXAoJnR0eS0+YXRvbWljX3dyaXRlKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzc2l6ZV90IHR0eV93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsCisJCQkgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwkKKwl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGlub2RlLCAidHR5X3dyaXRlIikpCisJCXJldHVybiAtRUlPOworCWlmICghdHR5IHx8ICF0dHktPmRyaXZlci0+d3JpdGUgfHwgKHRlc3RfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpKSkKKwkJcmV0dXJuIC1FSU87CisKKwlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOwkJCisJaWYgKCFsZC0+d3JpdGUpCisJCXJldCA9IC1FSU87CisJZWxzZQorCQlyZXQgPSBkb190dHlfd3JpdGUobGQtPndyaXRlLCB0dHksIGZpbGUsIGJ1ZiwgY291bnQpOworCXR0eV9sZGlzY19kZXJlZihsZCk7CisJcmV0dXJuIHJldDsKK30KKworc3NpemVfdCByZWRpcmVjdGVkX3R0eV93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsCisJCQkgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBmaWxlICpwID0gTlVMTDsKKworCXNwaW5fbG9jaygmcmVkaXJlY3RfbG9jayk7CisJaWYgKHJlZGlyZWN0KSB7CisJCWdldF9maWxlKHJlZGlyZWN0KTsKKwkJcCA9IHJlZGlyZWN0OworCX0KKwlzcGluX3VubG9jaygmcmVkaXJlY3RfbG9jayk7CisKKwlpZiAocCkgeworCQlzc2l6ZV90IHJlczsKKwkJcmVzID0gdmZzX3dyaXRlKHAsIGJ1ZiwgY291bnQsICZwLT5mX3Bvcyk7CisJCWZwdXQocCk7CisJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIHR0eV93cml0ZShmaWxlLCBidWYsIGNvdW50LCBwcG9zKTsKK30KKworc3RhdGljIGNoYXIgcHR5Y2hhcltdID0gInBxcnN0dXZ3eHl6YWJjZGUiOworCitzdGF0aWMgaW5saW5lIHZvaWQgcHR5X2xpbmVfbmFtZShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCBpbnQgaW5kZXgsIGNoYXIgKnApCit7CisJaW50IGkgPSBpbmRleCArIGRyaXZlci0+bmFtZV9iYXNlOworCS8qIC0+bmFtZSBpcyBpbml0aWFsaXplZCB0byAidHR5cCIsIGJ1dCAidHR5IiBpcyBleHBlY3RlZCAqLworCXNwcmludGYocCwgIiVzJWMleCIsCisJCQlkcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfU0xBVkUgPyAidHR5IiA6IGRyaXZlci0+bmFtZSwKKwkJCXB0eWNoYXJbaSA+PiA0ICYgMHhmXSwgaSAmIDB4Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0dHlfbGluZV9uYW1lKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBpbmRleCwgY2hhciAqcCkKK3sKKwlzcHJpbnRmKHAsICIlcyVkIiwgZHJpdmVyLT5uYW1lLCBpbmRleCArIGRyaXZlci0+bmFtZV9iYXNlKTsKK30KKworLyoKKyAqIFdTSCAwNi8wOS85NzogUmV3cml0dGVuIHRvIHJlbW92ZSByYWNlcyBhbmQgcHJvcGVybHkgY2xlYW4gdXAgYWZ0ZXIgYQorICogZmFpbGVkIG9wZW4uICBUaGUgbmV3IGNvZGUgcHJvdGVjdHMgdGhlIG9wZW4gd2l0aCBhIHNlbWFwaG9yZSwgc28gaXQncworICogcmVhbGx5IHF1aXRlIHN0cmFpZ2h0Zm9yd2FyZC4gIFRoZSBzZW1hcGhvcmUgbG9ja2luZyBjYW4gcHJvYmFibHkgYmUKKyAqIHJlbGF4ZWQgZm9yIHRoZSAobW9zdCBjb21tb24pIGNhc2Ugb2YgcmVvcGVuaW5nIGEgdHR5LgorICovCitzdGF0aWMgaW50IGluaXRfZGV2KHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBpZHgsCisJc3RydWN0IHR0eV9zdHJ1Y3QgKipyZXRfdHR5KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHksICpvX3R0eTsKKwlzdHJ1Y3QgdGVybWlvcyAqdHAsICoqdHBfbG9jLCAqb190cCwgKipvX3RwX2xvYzsKKwlzdHJ1Y3QgdGVybWlvcyAqbHRwLCAqKmx0cF9sb2MsICpvX2x0cCwgKipvX2x0cF9sb2M7CisJaW50IHJldHZhbD0wOworCisJLyogY2hlY2sgd2hldGhlciB3ZSdyZSByZW9wZW5pbmcgYW4gZXhpc3RpbmcgdHR5ICovCisJaWYgKGRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pIHsKKwkJdHR5ID0gZGV2cHRzX2dldF90dHkoaWR4KTsKKwkJaWYgKHR0eSAmJiBkcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSKQorCQkJdHR5ID0gdHR5LT5saW5rOworCX0gZWxzZSB7CisJCXR0eSA9IGRyaXZlci0+dHR5c1tpZHhdOworCX0KKwlpZiAodHR5KSBnb3RvIGZhc3RfdHJhY2s7CisKKwkvKgorCSAqIEZpcnN0IHRpbWUgb3BlbiBpcyBjb21wbGV4LCBlc3BlY2lhbGx5IGZvciBQVFkgZGV2aWNlcy4KKwkgKiBUaGlzIGNvZGUgZ3VhcmFudGVlcyB0aGF0IGVpdGhlciBldmVyeXRoaW5nIHN1Y2NlZWRzIGFuZCB0aGUKKwkgKiBUVFkgaXMgcmVhZHkgZm9yIG9wZXJhdGlvbiwgb3IgZWxzZSB0aGUgdGFibGUgc2xvdHMgYXJlIHZhY2F0ZWQKKwkgKiBhbmQgdGhlIGFsbG9jYXRlZCBtZW1vcnkgcmVsZWFzZWQuICAoRXhjZXB0IHRoYXQgdGhlIHRlcm1pb3MgCisJICogYW5kIGxvY2tlZCB0ZXJtaW9zIG1heSBiZSByZXRhaW5lZC4pCisJICovCisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRyaXZlci0+b3duZXIpKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZW5kX2luaXQ7CisJfQorCisJb190dHkgPSBOVUxMOworCXRwID0gb190cCA9IE5VTEw7CisJbHRwID0gb19sdHAgPSBOVUxMOworCisJdHR5ID0gYWxsb2NfdHR5X3N0cnVjdCgpOworCWlmKCF0dHkpCisJCWdvdG8gZmFpbF9ub19tZW07CisJaW5pdGlhbGl6ZV90dHlfc3RydWN0KHR0eSk7CisJdHR5LT5kcml2ZXIgPSBkcml2ZXI7CisJdHR5LT5pbmRleCA9IGlkeDsKKwl0dHlfbGluZV9uYW1lKGRyaXZlciwgaWR4LCB0dHktPm5hbWUpOworCisJaWYgKGRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pIHsKKwkJdHBfbG9jID0gJnR0eS0+dGVybWlvczsKKwkJbHRwX2xvYyA9ICZ0dHktPnRlcm1pb3NfbG9ja2VkOworCX0gZWxzZSB7CisJCXRwX2xvYyA9ICZkcml2ZXItPnRlcm1pb3NbaWR4XTsKKwkJbHRwX2xvYyA9ICZkcml2ZXItPnRlcm1pb3NfbG9ja2VkW2lkeF07CisJfQorCisJaWYgKCEqdHBfbG9jKSB7CisJCXRwID0gKHN0cnVjdCB0ZXJtaW9zICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSwKKwkJCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIXRwKQorCQkJZ290byBmcmVlX21lbV9vdXQ7CisJCSp0cCA9IGRyaXZlci0+aW5pdF90ZXJtaW9zOworCX0KKworCWlmICghKmx0cF9sb2MpIHsKKwkJbHRwID0gKHN0cnVjdCB0ZXJtaW9zICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSwKKwkJCQkJCSBHRlBfS0VSTkVMKTsKKwkJaWYgKCFsdHApCisJCQlnb3RvIGZyZWVfbWVtX291dDsKKwkJbWVtc2V0KGx0cCwgMCwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSk7CisJfQorCisJaWYgKGRyaXZlci0+dHlwZSA9PSBUVFlfRFJJVkVSX1RZUEVfUFRZKSB7CisJCW9fdHR5ID0gYWxsb2NfdHR5X3N0cnVjdCgpOworCQlpZiAoIW9fdHR5KQorCQkJZ290byBmcmVlX21lbV9vdXQ7CisJCWluaXRpYWxpemVfdHR5X3N0cnVjdChvX3R0eSk7CisJCW9fdHR5LT5kcml2ZXIgPSBkcml2ZXItPm90aGVyOworCQlvX3R0eS0+aW5kZXggPSBpZHg7CisJCXR0eV9saW5lX25hbWUoZHJpdmVyLT5vdGhlciwgaWR4LCBvX3R0eS0+bmFtZSk7CisKKwkJaWYgKGRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pIHsKKwkJCW9fdHBfbG9jID0gJm9fdHR5LT50ZXJtaW9zOworCQkJb19sdHBfbG9jID0gJm9fdHR5LT50ZXJtaW9zX2xvY2tlZDsKKwkJfSBlbHNlIHsKKwkJCW9fdHBfbG9jID0gJmRyaXZlci0+b3RoZXItPnRlcm1pb3NbaWR4XTsKKwkJCW9fbHRwX2xvYyA9ICZkcml2ZXItPm90aGVyLT50ZXJtaW9zX2xvY2tlZFtpZHhdOworCQl9CisKKwkJaWYgKCEqb190cF9sb2MpIHsKKwkJCW9fdHAgPSAoc3RydWN0IHRlcm1pb3MgKikKKwkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGVybWlvcyksIEdGUF9LRVJORUwpOworCQkJaWYgKCFvX3RwKQorCQkJCWdvdG8gZnJlZV9tZW1fb3V0OworCQkJKm9fdHAgPSBkcml2ZXItPm90aGVyLT5pbml0X3Rlcm1pb3M7CisJCX0KKworCQlpZiAoISpvX2x0cF9sb2MpIHsKKwkJCW9fbHRwID0gKHN0cnVjdCB0ZXJtaW9zICopCisJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHRlcm1pb3MpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghb19sdHApCisJCQkJZ290byBmcmVlX21lbV9vdXQ7CisJCQltZW1zZXQob19sdHAsIDAsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpOworCQl9CisKKwkJLyoKKwkJICogRXZlcnl0aGluZyBhbGxvY2F0ZWQgLi4uIHNldCB1cCB0aGUgb190dHkgc3RydWN0dXJlLgorCQkgKi8KKwkJaWYgKCEoZHJpdmVyLT5vdGhlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pKSB7CisJCQlkcml2ZXItPm90aGVyLT50dHlzW2lkeF0gPSBvX3R0eTsKKwkJfQorCQlpZiAoISpvX3RwX2xvYykKKwkJCSpvX3RwX2xvYyA9IG9fdHA7CisJCWlmICghKm9fbHRwX2xvYykKKwkJCSpvX2x0cF9sb2MgPSBvX2x0cDsKKwkJb190dHktPnRlcm1pb3MgPSAqb190cF9sb2M7CisJCW9fdHR5LT50ZXJtaW9zX2xvY2tlZCA9ICpvX2x0cF9sb2M7CisJCWRyaXZlci0+b3RoZXItPnJlZmNvdW50Kys7CisJCWlmIChkcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSKQorCQkJb190dHktPmNvdW50Kys7CisKKwkJLyogRXN0YWJsaXNoIHRoZSBsaW5rcyBpbiBib3RoIGRpcmVjdGlvbnMgKi8KKwkJdHR5LT5saW5rICAgPSBvX3R0eTsKKwkJb190dHktPmxpbmsgPSB0dHk7CisJfQorCisJLyogCisJICogQWxsIHN0cnVjdHVyZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCwgc28gbm93IHdlIGluc3RhbGwgdGhlbS4KKwkgKiBGYWlsdXJlcyBhZnRlciB0aGlzIHBvaW50IHVzZSByZWxlYXNlX21lbSB0byBjbGVhbiB1cCwgc28gCisJICogdGhlcmUncyBubyBuZWVkIHRvIG51bGwgb3V0IHRoZSBsb2NhbCBwb2ludGVycy4KKwkgKi8KKwlpZiAoIShkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9ERVZQVFNfTUVNKSkgeworCQlkcml2ZXItPnR0eXNbaWR4XSA9IHR0eTsKKwl9CisJCisJaWYgKCEqdHBfbG9jKQorCQkqdHBfbG9jID0gdHA7CisJaWYgKCEqbHRwX2xvYykKKwkJKmx0cF9sb2MgPSBsdHA7CisJdHR5LT50ZXJtaW9zID0gKnRwX2xvYzsKKwl0dHktPnRlcm1pb3NfbG9ja2VkID0gKmx0cF9sb2M7CisJZHJpdmVyLT5yZWZjb3VudCsrOworCXR0eS0+Y291bnQrKzsKKworCS8qIAorCSAqIFN0cnVjdHVyZXMgYWxsIGluc3RhbGxlZCAuLi4gY2FsbCB0aGUgbGRpc2Mgb3BlbiByb3V0aW5lcy4KKwkgKiBJZiB3ZSBmYWlsIGhlcmUganVzdCBjYWxsIHJlbGVhc2VfbWVtIHRvIGNsZWFuIHVwLiAgTm8gbmVlZAorCSAqIHRvIGRlY3JlbWVudCB0aGUgdXNlIGNvdW50cywgYXMgcmVsZWFzZV9tZW0gZG9lc24ndCBjYXJlLgorCSAqLworCisJaWYgKHR0eS0+bGRpc2Mub3BlbikgeworCQlyZXR2YWwgPSAodHR5LT5sZGlzYy5vcGVuKSh0dHkpOworCQlpZiAocmV0dmFsKQorCQkJZ290byByZWxlYXNlX21lbV9vdXQ7CisJfQorCWlmIChvX3R0eSAmJiBvX3R0eS0+bGRpc2Mub3BlbikgeworCQlyZXR2YWwgPSAob190dHktPmxkaXNjLm9wZW4pKG9fdHR5KTsKKwkJaWYgKHJldHZhbCkgeworCQkJaWYgKHR0eS0+bGRpc2MuY2xvc2UpCisJCQkJKHR0eS0+bGRpc2MuY2xvc2UpKHR0eSk7CisJCQlnb3RvIHJlbGVhc2VfbWVtX291dDsKKwkJfQorCQl0dHlfbGRpc2NfZW5hYmxlKG9fdHR5KTsKKwl9CisJdHR5X2xkaXNjX2VuYWJsZSh0dHkpOworCWdvdG8gc3VjY2VzczsKKworCS8qCisJICogVGhpcyBmYXN0IG9wZW4gY2FuIGJlIHVzZWQgaWYgdGhlIHR0eSBpcyBhbHJlYWR5IG9wZW4uCisJICogTm8gbWVtb3J5IGlzIGFsbG9jYXRlZCwgYW5kIHRoZSBvbmx5IGZhaWx1cmVzIGFyZSBmcm9tCisJICogYXR0ZW1wdGluZyB0byBvcGVuIGEgY2xvc2luZyB0dHkgb3IgYXR0ZW1wdGluZyBtdWx0aXBsZQorCSAqIG9wZW5zIG9uIGEgcHR5IG1hc3Rlci4KKwkgKi8KK2Zhc3RfdHJhY2s6CisJaWYgKHRlc3RfYml0KFRUWV9DTE9TSU5HLCAmdHR5LT5mbGFncykpIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBlbmRfaW5pdDsKKwl9CisJaWYgKGRyaXZlci0+dHlwZSA9PSBUVFlfRFJJVkVSX1RZUEVfUFRZICYmCisJICAgIGRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpIHsKKwkJLyoKKwkJICogc3BlY2lhbCBjYXNlIGZvciBQVFkgbWFzdGVyczogb25seSBvbmUgb3BlbiBwZXJtaXR0ZWQsIAorCQkgKiBhbmQgdGhlIHNsYXZlIHNpZGUgb3BlbiBjb3VudCBpcyBpbmNyZW1lbnRlZCBhcyB3ZWxsLgorCQkgKi8KKwkJaWYgKHR0eS0+Y291bnQpIHsKKwkJCXJldHZhbCA9IC1FSU87CisJCQlnb3RvIGVuZF9pbml0OworCQl9CisJCXR0eS0+bGluay0+Y291bnQrKzsKKwl9CisJdHR5LT5jb3VudCsrOworCXR0eS0+ZHJpdmVyID0gZHJpdmVyOyAvKiBOLkIuIHdoeSBkbyB0aGlzIGV2ZXJ5IHRpbWU/PyAqLworCisJLyogRklYTUUgKi8KKwlpZighdGVzdF9iaXQoVFRZX0xESVNDLCAmdHR5LT5mbGFncykpCisJCXByaW50ayhLRVJOX0VSUiAiaW5pdF9kZXYgYnV0IG5vIGxkaXNjXG4iKTsKK3N1Y2Nlc3M6CisJKnJldF90dHkgPSB0dHk7CisJCisJLyogQWxsIHBhdGhzIGNvbWUgdGhyb3VnaCBoZXJlIHRvIHJlbGVhc2UgdGhlIHNlbWFwaG9yZSAqLworZW5kX2luaXQ6CisJcmV0dXJuIHJldHZhbDsKKworCS8qIFJlbGVhc2UgbG9jYWxseSBhbGxvY2F0ZWQgbWVtb3J5IC4uLiBub3RoaW5nIHBsYWNlZCBpbiBzbG90cyAqLworZnJlZV9tZW1fb3V0OgorCWlmIChvX3RwKQorCQlrZnJlZShvX3RwKTsKKwlpZiAob190dHkpCisJCWZyZWVfdHR5X3N0cnVjdChvX3R0eSk7CisJaWYgKGx0cCkKKwkJa2ZyZWUobHRwKTsKKwlpZiAodHApCisJCWtmcmVlKHRwKTsKKwlmcmVlX3R0eV9zdHJ1Y3QodHR5KTsKKworZmFpbF9ub19tZW06CisJbW9kdWxlX3B1dChkcml2ZXItPm93bmVyKTsKKwlyZXR2YWwgPSAtRU5PTUVNOworCWdvdG8gZW5kX2luaXQ7CisKKwkvKiBjYWxsIHRoZSB0dHkgcmVsZWFzZV9tZW0gcm91dGluZSB0byBjbGVhbiBvdXQgdGhpcyBzbG90ICovCityZWxlYXNlX21lbV9vdXQ6CisJcHJpbnRrKEtFUk5fSU5GTyAiaW5pdF9kZXY6IGxkaXNjIG9wZW4gZmFpbGVkLCAiCisJCQkgImNsZWFyaW5nIHNsb3QgJWRcbiIsIGlkeCk7CisJcmVsZWFzZV9tZW0odHR5LCBpZHgpOworCWdvdG8gZW5kX2luaXQ7Cit9CisKKy8qCisgKiBSZWxlYXNlcyBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGEgdHR5IHN0cnVjdHVyZSwgYW5kIGNsZWFycyBvdXQgdGhlCisgKiBkcml2ZXIgdGFibGUgc2xvdHMuCisgKi8KK3N0YXRpYyB2b2lkIHJlbGVhc2VfbWVtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBpZHgpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKm9fdHR5OworCXN0cnVjdCB0ZXJtaW9zICp0cDsKKwlpbnQgZGV2cHRzID0gdHR5LT5kcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9ERVZQVFNfTUVNOworCisJaWYgKChvX3R0eSA9IHR0eS0+bGluaykgIT0gTlVMTCkgeworCQlpZiAoIWRldnB0cykKKwkJCW9fdHR5LT5kcml2ZXItPnR0eXNbaWR4XSA9IE5VTEw7CisJCWlmIChvX3R0eS0+ZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUykgeworCQkJdHAgPSBvX3R0eS0+dGVybWlvczsKKwkJCWlmICghZGV2cHRzKQorCQkJCW9fdHR5LT5kcml2ZXItPnRlcm1pb3NbaWR4XSA9IE5VTEw7CisJCQlrZnJlZSh0cCk7CisKKwkJCXRwID0gb190dHktPnRlcm1pb3NfbG9ja2VkOworCQkJaWYgKCFkZXZwdHMpCisJCQkJb190dHktPmRyaXZlci0+dGVybWlvc19sb2NrZWRbaWR4XSA9IE5VTEw7CisJCQlrZnJlZSh0cCk7CisJCX0KKwkJb190dHktPm1hZ2ljID0gMDsKKwkJb190dHktPmRyaXZlci0+cmVmY291bnQtLTsKKwkJZmlsZV9saXN0X2xvY2soKTsKKwkJbGlzdF9kZWxfaW5pdCgmb190dHktPnR0eV9maWxlcyk7CisJCWZpbGVfbGlzdF91bmxvY2soKTsKKwkJZnJlZV90dHlfc3RydWN0KG9fdHR5KTsKKwl9CisKKwlpZiAoIWRldnB0cykKKwkJdHR5LT5kcml2ZXItPnR0eXNbaWR4XSA9IE5VTEw7CisJaWYgKHR0eS0+ZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUykgeworCQl0cCA9IHR0eS0+dGVybWlvczsKKwkJaWYgKCFkZXZwdHMpCisJCQl0dHktPmRyaXZlci0+dGVybWlvc1tpZHhdID0gTlVMTDsKKwkJa2ZyZWUodHApOworCisJCXRwID0gdHR5LT50ZXJtaW9zX2xvY2tlZDsKKwkJaWYgKCFkZXZwdHMpCisJCQl0dHktPmRyaXZlci0+dGVybWlvc19sb2NrZWRbaWR4XSA9IE5VTEw7CisJCWtmcmVlKHRwKTsKKwl9CisKKwl0dHktPm1hZ2ljID0gMDsKKwl0dHktPmRyaXZlci0+cmVmY291bnQtLTsKKwlmaWxlX2xpc3RfbG9jaygpOworCWxpc3RfZGVsX2luaXQoJnR0eS0+dHR5X2ZpbGVzKTsKKwlmaWxlX2xpc3RfdW5sb2NrKCk7CisJbW9kdWxlX3B1dCh0dHktPmRyaXZlci0+b3duZXIpOworCWZyZWVfdHR5X3N0cnVjdCh0dHkpOworfQorCisvKgorICogRXZlbiByZWxlYXNpbmcgdGhlIHR0eSBzdHJ1Y3R1cmVzIGlzIGEgdHJpY2t5IGJ1c2luZXNzLi4gV2UgaGF2ZQorICogdG8gYmUgdmVyeSBjYXJlZnVsIHRoYXQgdGhlIHN0cnVjdHVyZXMgYXJlIGFsbCByZWxlYXNlZCBhdCB0aGUKKyAqIHNhbWUgdGltZSwgYXMgaW50ZXJydXB0cyBtaWdodCBvdGhlcndpc2UgZ2V0IHRoZSB3cm9uZyBwb2ludGVycy4KKyAqCisgKiBXU0ggMDkvMDkvOTc6IHJld3JpdHRlbiB0byBhdm9pZCBzb21lIG5hc3R5IHJhY2UgY29uZGl0aW9ucyB0aGF0IGNvdWxkCisgKiBsZWFkIHRvIGRvdWJsZSBmcmVlcyBvciByZWxlYXNpbmcgbWVtb3J5IHN0aWxsIGluIHVzZS4KKyAqLworc3RhdGljIHZvaWQgcmVsZWFzZV9kZXYoc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHksICpvX3R0eTsKKwlpbnQJcHR5X21hc3RlciwgdHR5X2Nsb3NpbmcsIG9fdHR5X2Nsb3NpbmcsIGRvX3NsZWVwOworCWludAlkZXZwdHNfbWFzdGVyLCBkZXZwdHM7CisJaW50CWlkeDsKKwljaGFyCWJ1Zls2NF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxwLT5wcml2YXRlX2RhdGE7CisJaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCAicmVsZWFzZV9kZXYiKSkKKwkJcmV0dXJuOworCisJY2hlY2tfdHR5X2NvdW50KHR0eSwgInJlbGVhc2VfZGV2Iik7CisKKwl0dHlfZmFzeW5jKC0xLCBmaWxwLCAwKTsKKworCWlkeCA9IHR0eS0+aW5kZXg7CisJcHR5X21hc3RlciA9ICh0dHktPmRyaXZlci0+dHlwZSA9PSBUVFlfRFJJVkVSX1RZUEVfUFRZICYmCisJCSAgICAgIHR0eS0+ZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUik7CisJZGV2cHRzID0gKHR0eS0+ZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfREVWUFRTX01FTSkgIT0gMDsKKwlkZXZwdHNfbWFzdGVyID0gcHR5X21hc3RlciAmJiBkZXZwdHM7CisJb190dHkgPSB0dHktPmxpbms7CisKKyNpZmRlZiBUVFlfUEFSQU5PSUFfQ0hFQ0sKKwlpZiAoaWR4IDwgMCB8fCBpZHggPj0gdHR5LT5kcml2ZXItPm51bSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAicmVsZWFzZV9kZXY6IGJhZCBpZHggd2hlbiB0cnlpbmcgdG8gIgorCQkJCSAgImZyZWUgKCVzKVxuIiwgdHR5LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoISh0dHktPmRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pKSB7CisJCWlmICh0dHkgIT0gdHR5LT5kcml2ZXItPnR0eXNbaWR4XSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInJlbGVhc2VfZGV2OiBkcml2ZXIudGFibGVbJWRdIG5vdCB0dHkgIgorCQkJICAgICAgICJmb3IgKCVzKVxuIiwgaWR4LCB0dHktPm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJCWlmICh0dHktPnRlcm1pb3MgIT0gdHR5LT5kcml2ZXItPnRlcm1pb3NbaWR4XSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInJlbGVhc2VfZGV2OiBkcml2ZXIudGVybWlvc1slZF0gbm90IHRlcm1pb3MgIgorCQkJICAgICAgICJmb3IgKCVzKVxuIiwKKwkJCSAgICAgICBpZHgsIHR0eS0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHR0eS0+dGVybWlvc19sb2NrZWQgIT0gdHR5LT5kcml2ZXItPnRlcm1pb3NfbG9ja2VkW2lkeF0pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJyZWxlYXNlX2RldjogZHJpdmVyLnRlcm1pb3NfbG9ja2VkWyVkXSBub3QgIgorCQkJICAgICAgICJ0ZXJtaW9zX2xvY2tlZCBmb3IgKCVzKVxuIiwKKwkJCSAgICAgICBpZHgsIHR0eS0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYKKworI2lmZGVmIFRUWV9ERUJVR19IQU5HVVAKKwlwcmludGsoS0VSTl9ERUJVRyAicmVsZWFzZV9kZXYgb2YgJXMgKHR0eSBjb3VudD0lZCkuLi4iLAorCSAgICAgICB0dHlfbmFtZSh0dHksIGJ1ZiksIHR0eS0+Y291bnQpOworI2VuZGlmCisKKyNpZmRlZiBUVFlfUEFSQU5PSUFfQ0hFQ0sKKwlpZiAodHR5LT5kcml2ZXItPm90aGVyICYmCisJICAgICAhKHR0eS0+ZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfREVWUFRTX01FTSkpIHsKKwkJaWYgKG9fdHR5ICE9IHR0eS0+ZHJpdmVyLT5vdGhlci0+dHR5c1tpZHhdKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAicmVsZWFzZV9kZXY6IG90aGVyLT50YWJsZVslZF0gIgorCQkJCQkgICJub3Qgb190dHkgZm9yICglcylcbiIsCisJCQkgICAgICAgaWR4LCB0dHktPm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChvX3R0eS0+dGVybWlvcyAhPSB0dHktPmRyaXZlci0+b3RoZXItPnRlcm1pb3NbaWR4XSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInJlbGVhc2VfZGV2OiBvdGhlci0+dGVybWlvc1slZF0gIgorCQkJCQkgICJub3Qgb190ZXJtaW9zIGZvciAoJXMpXG4iLAorCQkJICAgICAgIGlkeCwgdHR5LT5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAob190dHktPnRlcm1pb3NfbG9ja2VkICE9IAorCQkgICAgICB0dHktPmRyaXZlci0+b3RoZXItPnRlcm1pb3NfbG9ja2VkW2lkeF0pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJyZWxlYXNlX2Rldjogb3RoZXItPnRlcm1pb3NfbG9ja2VkWyIKKwkJCQkJICAiJWRdIG5vdCBvX3Rlcm1pb3NfbG9ja2VkIGZvciAoJXMpXG4iLAorCQkJICAgICAgIGlkeCwgdHR5LT5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAob190dHktPmxpbmsgIT0gdHR5KSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAicmVsZWFzZV9kZXY6IGJhZCBwdHkgcG9pbnRlcnNcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorI2VuZGlmCisJaWYgKHR0eS0+ZHJpdmVyLT5jbG9zZSkKKwkJdHR5LT5kcml2ZXItPmNsb3NlKHR0eSwgZmlscCk7CisKKwkvKgorCSAqIFNhbml0eSBjaGVjazogaWYgdHR5LT5jb3VudCBpcyBnb2luZyB0byB6ZXJvLCB0aGVyZSBzaG91bGRuJ3QgYmUKKwkgKiBhbnkgd2FpdGVycyBvbiB0dHktPnJlYWRfd2FpdCBvciB0dHktPndyaXRlX3dhaXQuICBXZSB0ZXN0IHRoZQorCSAqIHdhaXQgcXVldWVzIGFuZCBraWNrIGV2ZXJ5b25lIG91dCBfYmVmb3JlXyBhY3R1YWxseSBzdGFydGluZyB0bworCSAqIGNsb3NlLiAgVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd29uJ3QgYmxvY2sgd2hpbGUgcmVsZWFzaW5nIHRoZSB0dHkKKwkgKiBzdHJ1Y3R1cmUuCisJICoKKwkgKiBUaGUgdGVzdCBmb3IgdGhlIG9fdHR5IGNsb3NpbmcgaXMgbmVjZXNzYXJ5LCBzaW5jZSB0aGUgbWFzdGVyIGFuZAorCSAqIHNsYXZlIHNpZGVzIG1heSBjbG9zZSBpbiBhbnkgb3JkZXIuICBJZiB0aGUgc2xhdmUgc2lkZSBjbG9zZXMgb3V0CisJICogZmlyc3QsIGl0cyBjb3VudCB3aWxsIGJlIG9uZSwgc2luY2UgdGhlIG1hc3RlciBzaWRlIGhvbGRzIGFuIG9wZW4uCisJICogVGh1cyB0aGlzIHRlc3Qgd291bGRuJ3QgYmUgdHJpZ2dlcmVkIGF0IHRoZSB0aW1lIHRoZSBzbGF2ZSBjbG9zZXMsCisJICogc28gd2UgZG8gaXQgbm93LgorCSAqCisJICogTm90ZSB0aGF0IGl0J3MgcG9zc2libGUgZm9yIHRoZSB0dHkgdG8gYmUgb3BlbmVkIGFnYWluIHdoaWxlIHdlJ3JlCisJICogZmx1c2hpbmcgb3V0IHdhaXRlcnMuICBCeSByZWNhbGN1bGF0aW5nIHRoZSBjbG9zaW5nIGZsYWdzIGJlZm9yZQorCSAqIGVhY2ggaXRlcmF0aW9uIHdlIGF2b2lkIGFueSBwcm9ibGVtcy4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQkvKiBHdWFyZCBhZ2FpbnN0IHJhY2VzIHdpdGggdHR5LT5jb3VudCBjaGFuZ2VzIGVsc2V3aGVyZSBhbmQKKwkJICAgb3BlbnMgb24gL2Rldi90dHkgKi8KKwkJICAgCisJCWRvd24oJnR0eV9zZW0pOworCQl0dHlfY2xvc2luZyA9IHR0eS0+Y291bnQgPD0gMTsKKwkJb190dHlfY2xvc2luZyA9IG9fdHR5ICYmCisJCQkob190dHktPmNvdW50IDw9IChwdHlfbWFzdGVyID8gMSA6IDApKTsKKwkJdXAoJnR0eV9zZW0pOworCQlkb19zbGVlcCA9IDA7CisKKwkJaWYgKHR0eV9jbG9zaW5nKSB7CisJCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdHR5LT5yZWFkX3dhaXQpKSB7CisJCQkJd2FrZV91cCgmdHR5LT5yZWFkX3dhaXQpOworCQkJCWRvX3NsZWVwKys7CisJCQl9CisJCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdHR5LT53cml0ZV93YWl0KSkgeworCQkJCXdha2VfdXAoJnR0eS0+d3JpdGVfd2FpdCk7CisJCQkJZG9fc2xlZXArKzsKKwkJCX0KKwkJfQorCQlpZiAob190dHlfY2xvc2luZykgeworCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJm9fdHR5LT5yZWFkX3dhaXQpKSB7CisJCQkJd2FrZV91cCgmb190dHktPnJlYWRfd2FpdCk7CisJCQkJZG9fc2xlZXArKzsKKwkJCX0KKwkJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZvX3R0eS0+d3JpdGVfd2FpdCkpIHsKKwkJCQl3YWtlX3VwKCZvX3R0eS0+d3JpdGVfd2FpdCk7CisJCQkJZG9fc2xlZXArKzsKKwkJCX0KKwkJfQorCQlpZiAoIWRvX3NsZWVwKQorCQkJYnJlYWs7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVsZWFzZV9kZXY6ICVzOiByZWFkL3dyaXRlIHdhaXQgcXVldWUgIgorCQkJCSAgICAiYWN0aXZlIVxuIiwgdHR5X25hbWUodHR5LCBidWYpKTsKKwkJc2NoZWR1bGUoKTsKKwl9CQorCisJLyoKKwkgKiBUaGUgY2xvc2luZyBmbGFncyBhcmUgbm93IGNvbnNpc3RlbnQgd2l0aCB0aGUgb3BlbiBjb3VudHMgb24gCisJICogYm90aCBzaWRlcywgYW5kIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgbGFzdCBvcGVyYXRpb24gdGhhdCBjb3VsZCAKKwkgKiBibG9jaywgc28gaXQncyBzYWZlIHRvIHByb2NlZWQgd2l0aCBjbG9zaW5nLgorCSAqLworCSAKKwlkb3duKCZ0dHlfc2VtKTsKKwlpZiAocHR5X21hc3RlcikgeworCQlpZiAoLS1vX3R0eS0+Y291bnQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZWxlYXNlX2RldjogYmFkIHB0eSBzbGF2ZSBjb3VudCAiCisJCQkJCSAgICAiKCVkKSBmb3IgJXNcbiIsCisJCQkgICAgICAgb190dHktPmNvdW50LCB0dHlfbmFtZShvX3R0eSwgYnVmKSk7CisJCQlvX3R0eS0+Y291bnQgPSAwOworCQl9CisJfQorCWlmICgtLXR0eS0+Y291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInJlbGVhc2VfZGV2OiBiYWQgdHR5LT5jb3VudCAoJWQpIGZvciAlc1xuIiwKKwkJICAgICAgIHR0eS0+Y291bnQsIHR0eV9uYW1lKHR0eSwgYnVmKSk7CisJCXR0eS0+Y291bnQgPSAwOworCX0KKwl1cCgmdHR5X3NlbSk7CisJCisJLyoKKwkgKiBXZSd2ZSBkZWNyZW1lbnRlZCB0dHktPmNvdW50LCBzbyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGlzIGZpbGUKKwkgKiBkZXNjcmlwdG9yIG9mZiB0aGUgdHR5LT50dHlfZmlsZXMgbGlzdDsgdGhpcyBzZXJ2ZXMgdHdvCisJICogcHVycG9zZXM6CisJICogIC0gY2hlY2tfdHR5X2NvdW50IHNlZXMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMKKwkgKiAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyB0dHkuCisJICogIC0gZG9fdHR5X2hhbmd1cCBubyBsb25nZXIgc2VlcyB0aGlzIGZpbGUgZGVzY3JpcHRvciBhcworCSAqICAgIHNvbWV0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGhhbmRsZWQgZm9yIGhhbmd1cHMuCisJICovCisJZmlsZV9raWxsKGZpbHApOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKKwkvKgorCSAqIFBlcmZvcm0gc29tZSBob3VzZWtlZXBpbmcgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgdG8gcmV0dXJuLgorCSAqCisJICogU2V0IHRoZSBUVFlfQ0xPU0lORyBmbGFnIGlmIHRoaXMgd2FzIHRoZSBsYXN0IG9wZW4uICBJbiB0aGUKKwkgKiBjYXNlIG9mIGEgcHR5IHdlIG1heSBoYXZlIHRvIHdhaXQgYXJvdW5kIGZvciB0aGUgb3RoZXIgc2lkZQorCSAqIHRvIGNsb3NlLCBhbmQgVFRZX0NMT1NJTkcgbWFrZXMgc3VyZSB3ZSBjYW4ndCBiZSByZW9wZW5lZC4KKwkgKi8KKwlpZih0dHlfY2xvc2luZykKKwkJc2V0X2JpdChUVFlfQ0xPU0lORywgJnR0eS0+ZmxhZ3MpOworCWlmKG9fdHR5X2Nsb3NpbmcpCisJCXNldF9iaXQoVFRZX0NMT1NJTkcsICZvX3R0eS0+ZmxhZ3MpOworCisJLyoKKwkgKiBJZiBfZWl0aGVyXyBzaWRlIGlzIGNsb3NpbmcsIG1ha2Ugc3VyZSB0aGVyZSBhcmVuJ3QgYW55CisJICogcHJvY2Vzc2VzIHRoYXQgc3RpbGwgdGhpbmsgdHR5IG9yIG9fdHR5IGlzIHRoZWlyIGNvbnRyb2xsaW5nCisJICogdHR5LgorCSAqLworCWlmICh0dHlfY2xvc2luZyB8fCBvX3R0eV9jbG9zaW5nKSB7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKworCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCQlkb19lYWNoX3Rhc2tfcGlkKHR0eS0+c2Vzc2lvbiwgUElEVFlQRV9TSUQsIHApIHsKKwkJCXAtPnNpZ25hbC0+dHR5ID0gTlVMTDsKKwkJfSB3aGlsZV9lYWNoX3Rhc2tfcGlkKHR0eS0+c2Vzc2lvbiwgUElEVFlQRV9TSUQsIHApOworCQlpZiAob190dHkpCisJCQlkb19lYWNoX3Rhc2tfcGlkKG9fdHR5LT5zZXNzaW9uLCBQSURUWVBFX1NJRCwgcCkgeworCQkJCXAtPnNpZ25hbC0+dHR5ID0gTlVMTDsKKwkJCX0gd2hpbGVfZWFjaF90YXNrX3BpZChvX3R0eS0+c2Vzc2lvbiwgUElEVFlQRV9TSUQsIHApOworCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJfQorCisJLyogY2hlY2sgd2hldGhlciBib3RoIHNpZGVzIGFyZSBjbG9zaW5nIC4uLiAqLworCWlmICghdHR5X2Nsb3NpbmcgfHwgKG9fdHR5ICYmICFvX3R0eV9jbG9zaW5nKSkKKwkJcmV0dXJuOworCQorI2lmZGVmIFRUWV9ERUJVR19IQU5HVVAKKwlwcmludGsoS0VSTl9ERUJVRyAiZnJlZWluZyB0dHkgc3RydWN0dXJlLi4uIik7CisjZW5kaWYKKwkvKgorCSAqIFByZXZlbnQgZmx1c2hfdG9fbGRpc2MoKSBmcm9tIHJlc2NoZWR1bGluZyB0aGUgd29yayBmb3IgbGF0ZXIuICBUaGVuCisJICoga2lsbCBhbnkgZGVsYXllZCB3b3JrLiBBcyB0aGlzIGlzIHRoZSBmaW5hbCBjbG9zZSBpdCBkb2VzIG5vdAorCSAqIHJhY2Ugd2l0aCB0aGUgc2V0X2xkaXNjIGNvZGUgcGF0aC4KKwkgKi8KKwljbGVhcl9iaXQoVFRZX0xESVNDLCAmdHR5LT5mbGFncyk7CisJY2xlYXJfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yayk7CisKKwkvKgorCSAqIFdhaXQgZm9yIC0+aGFuZ3VwX3dvcmsgYW5kIC0+ZmxpcC53b3JrIGhhbmRsZXJzIHRvIHRlcm1pbmF0ZQorCSAqLworCSAKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCQorCS8qCisJICogV2FpdCBmb3IgYW55IHNob3J0IHRlcm0gdXNlcnMgKHdlIGtub3cgdGhleSBhcmUganVzdCBkcml2ZXIKKwkgKiBzaWRlIHdhaXRlcnMgYXMgdGhlIGZpbGUgaXMgY2xvc2luZyBzbyB1c2VyIGNvdW50IG9uIHRoZSBmaWxlCisJICogc2lkZSBpcyB6ZXJvLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOworCXdoaWxlKHR0eS0+bGRpc2MucmVmY291bnQpCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOworCQl3YWl0X2V2ZW50KHR0eV9sZGlzY193YWl0LCB0dHktPmxkaXNjLnJlZmNvdW50ID09IDApOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIFNodXRkb3duIHRoZSBjdXJyZW50IGxpbmUgZGlzY2lwbGluZSwgYW5kIHJlc2V0IGl0IHRvIE5fVFRZLgorCSAqIE4uQi4gd2h5IHJlc2V0IGxkaXNjIHdoZW4gd2UncmUgcmVsZWFzaW5nIHRoZSBtZW1vcnk/PworCSAqCisJICogRklYTUU6IHRoaXMgTVVTVCBnZXQgZml4ZWQgZm9yIHRoZSBuZXcgcmVmbG9ja2luZworCSAqLworCWlmICh0dHktPmxkaXNjLmNsb3NlKQorCQkodHR5LT5sZGlzYy5jbG9zZSkodHR5KTsKKwl0dHlfbGRpc2NfcHV0KHR0eS0+bGRpc2MubnVtKTsKKwkKKwkvKgorCSAqCVN3aXRjaCB0aGUgbGluZSBkaXNjaXBsaW5lIGJhY2sKKwkgKi8KKwl0dHlfbGRpc2NfYXNzaWduKHR0eSwgdHR5X2xkaXNjX2dldChOX1RUWSkpOworCXR0eV9zZXRfdGVybWlvc19sZGlzYyh0dHksTl9UVFkpOyAKKwlpZiAob190dHkpIHsKKwkJLyogRklYTUU6IGNvdWxkIG9fdHR5IGJlIGluIHNldGxkaXNjIGhlcmUgPyAqLworCQljbGVhcl9iaXQoVFRZX0xESVNDLCAmb190dHktPmZsYWdzKTsKKwkJaWYgKG9fdHR5LT5sZGlzYy5jbG9zZSkKKwkJCShvX3R0eS0+bGRpc2MuY2xvc2UpKG9fdHR5KTsKKwkJdHR5X2xkaXNjX3B1dChvX3R0eS0+bGRpc2MubnVtKTsKKwkJdHR5X2xkaXNjX2Fzc2lnbihvX3R0eSwgdHR5X2xkaXNjX2dldChOX1RUWSkpOworCQl0dHlfc2V0X3Rlcm1pb3NfbGRpc2Mob190dHksTl9UVFkpOyAKKwl9CisJLyoKKwkgKiBUaGUgcmVsZWFzZV9tZW0gZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiB0aGUgZGV0YWlscyBvZiBjbGVhcmluZworCSAqIHRoZSBzbG90cyBhbmQgcHJlc2VydmluZyB0aGUgdGVybWlvcyBzdHJ1Y3R1cmUuCisJICovCisJcmVsZWFzZV9tZW0odHR5LCBpZHgpOworCisjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCisJLyogTWFrZSB0aGlzIHB0eSBudW1iZXIgYXZhaWxhYmxlIGZvciByZWFsbG9jYXRpb24gKi8KKwlpZiAoZGV2cHRzKSB7CisJCWRvd24oJmFsbG9jYXRlZF9wdHlzX2xvY2spOworCQlpZHJfcmVtb3ZlKCZhbGxvY2F0ZWRfcHR5cywgaWR4KTsKKwkJdXAoJmFsbG9jYXRlZF9wdHlzX2xvY2spOworCX0KKyNlbmRpZgorCit9CisKKy8qCisgKiB0dHlfb3BlbiBhbmQgdHR5X3JlbGVhc2Uga2VlcCB1cCB0aGUgdHR5IGNvdW50IHRoYXQgY29udGFpbnMgdGhlCisgKiBudW1iZXIgb2Ygb3BlbnMgZG9uZSBvbiBhIHR0eS4gV2UgY2Fubm90IHVzZSB0aGUgaW5vZGUtY291bnQsIGFzCisgKiBkaWZmZXJlbnQgaW5vZGVzIG1pZ2h0IHBvaW50IHRvIHRoZSBzYW1lIHR0eS4KKyAqCisgKiBPcGVuLWNvdW50aW5nIGlzIG5lZWRlZCBmb3IgcHR5IG1hc3RlcnMsIGFzIHdlbGwgYXMgZm9yIGtlZXBpbmcKKyAqIHRyYWNrIG9mIHNlcmlhbCBsaW5lczogRFRSIGlzIGRyb3BwZWQgd2hlbiB0aGUgbGFzdCBjbG9zZSBoYXBwZW5zLgorICogKFRoaXMgaXMgbm90IGRvbmUgc29sZWx5IHRocm91Z2ggdHR5LT5jb3VudCwgbm93LiAgLSBUZWQgMS8yNy85MikKKyAqCisgKiBUaGUgdGVybWlvcyBzdGF0ZSBvZiBhIHB0eSBpcyByZXNldCBvbiBmaXJzdCBvcGVuIHNvIHRoYXQKKyAqIHNldHRpbmdzIGRvbid0IHBlcnNpc3QgYWNyb3NzIHJldXNlLgorICovCitzdGF0aWMgaW50IHR0eV9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgbm9jdHR5LCByZXR2YWw7CisJc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcjsKKwlpbnQgaW5kZXg7CisJZGV2X3QgZGV2aWNlID0gaW5vZGUtPmlfcmRldjsKKwl1bnNpZ25lZCBzaG9ydCBzYXZlZF9mbGFncyA9IGZpbHAtPmZfZmxhZ3M7CisKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKKwkKK3JldHJ5X29wZW46CisJbm9jdHR5ID0gZmlscC0+Zl9mbGFncyAmIE9fTk9DVFRZOworCWluZGV4ICA9IC0xOworCXJldHZhbCA9IDA7CisJCisJZG93bigmdHR5X3NlbSk7CisKKwlpZiAoZGV2aWNlID09IE1LREVWKFRUWUFVWF9NQUpPUiwwKSkgeworCQlpZiAoIWN1cnJlbnQtPnNpZ25hbC0+dHR5KSB7CisJCQl1cCgmdHR5X3NlbSk7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCWRyaXZlciA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5LT5kcml2ZXI7CisJCWluZGV4ID0gY3VycmVudC0+c2lnbmFsLT50dHktPmluZGV4OworCQlmaWxwLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7IC8qIERvbid0IGxldCAvZGV2L3R0eSBibG9jayAqLworCQkvKiBub2N0dHkgPSAxOyAqLworCQlnb3RvIGdvdF9kcml2ZXI7CisJfQorI2lmZGVmIENPTkZJR19WVAorCWlmIChkZXZpY2UgPT0gTUtERVYoVFRZX01BSk9SLDApKSB7CisJCWV4dGVybiBzdHJ1Y3QgdHR5X2RyaXZlciAqY29uc29sZV9kcml2ZXI7CisJCWRyaXZlciA9IGNvbnNvbGVfZHJpdmVyOworCQlpbmRleCA9IGZnX2NvbnNvbGU7CisJCW5vY3R0eSA9IDE7CisJCWdvdG8gZ290X2RyaXZlcjsKKwl9CisjZW5kaWYKKwlpZiAoZGV2aWNlID09IE1LREVWKFRUWUFVWF9NQUpPUiwxKSkgeworCQlkcml2ZXIgPSBjb25zb2xlX2RldmljZSgmaW5kZXgpOworCQlpZiAoZHJpdmVyKSB7CisJCQkvKiBEb24ndCBsZXQgL2Rldi9jb25zb2xlIGJsb2NrICovCisJCQlmaWxwLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCQlub2N0dHkgPSAxOworCQkJZ290byBnb3RfZHJpdmVyOworCQl9CisJCXVwKCZ0dHlfc2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZHJpdmVyID0gZ2V0X3R0eV9kcml2ZXIoZGV2aWNlLCAmaW5kZXgpOworCWlmICghZHJpdmVyKSB7CisJCXVwKCZ0dHlfc2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorZ290X2RyaXZlcjoKKwlyZXR2YWwgPSBpbml0X2Rldihkcml2ZXIsIGluZGV4LCAmdHR5KTsKKwl1cCgmdHR5X3NlbSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IHR0eTsKKwlmaWxlX21vdmUoZmlscCwgJnR0eS0+dHR5X2ZpbGVzKTsKKwljaGVja190dHlfY291bnQodHR5LCAidHR5X29wZW4iKTsKKwlpZiAodHR5LT5kcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSAmJgorCSAgICB0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpCisJCW5vY3R0eSA9IDE7CisjaWZkZWYgVFRZX0RFQlVHX0hBTkdVUAorCXByaW50ayhLRVJOX0RFQlVHICJvcGVuaW5nICVzLi4uIiwgdHR5LT5uYW1lKTsKKyNlbmRpZgorCWlmICghcmV0dmFsKSB7CisJCWlmICh0dHktPmRyaXZlci0+b3BlbikKKwkJCXJldHZhbCA9IHR0eS0+ZHJpdmVyLT5vcGVuKHR0eSwgZmlscCk7CisJCWVsc2UKKwkJCXJldHZhbCA9IC1FTk9ERVY7CisJfQorCWZpbHAtPmZfZmxhZ3MgPSBzYXZlZF9mbGFnczsKKworCWlmICghcmV0dmFsICYmIHRlc3RfYml0KFRUWV9FWENMVVNJVkUsICZ0dHktPmZsYWdzKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dmFsID0gLUVCVVNZOworCisJaWYgKHJldHZhbCkgeworI2lmZGVmIFRUWV9ERUJVR19IQU5HVVAKKwkJcHJpbnRrKEtFUk5fREVCVUcgImVycm9yICVkIGluIG9wZW5pbmcgJXMuLi4iLCByZXR2YWwsCisJCSAgICAgICB0dHktPm5hbWUpOworI2VuZGlmCisJCXJlbGVhc2VfZGV2KGZpbHApOworCQlpZiAocmV0dmFsICE9IC1FUkVTVEFSVFNZUykKKwkJCXJldHVybiByZXR2YWw7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiByZXR2YWw7CisJCXNjaGVkdWxlKCk7CisJCS8qCisJCSAqIE5lZWQgdG8gcmVzZXQgZl9vcCBpbiBjYXNlIGEgaGFuZ3VwIGhhcHBlbmVkLgorCQkgKi8KKwkJaWYgKGZpbHAtPmZfb3AgPT0gJmh1bmdfdXBfdHR5X2ZvcHMpCisJCQlmaWxwLT5mX29wID0gJnR0eV9mb3BzOworCQlnb3RvIHJldHJ5X29wZW47CisJfQorCWlmICghbm9jdHR5ICYmCisJICAgIGN1cnJlbnQtPnNpZ25hbC0+bGVhZGVyICYmCisJICAgICFjdXJyZW50LT5zaWduYWwtPnR0eSAmJgorCSAgICB0dHktPnNlc3Npb24gPT0gMCkgeworCSAgICAJdGFza19sb2NrKGN1cnJlbnQpOworCQljdXJyZW50LT5zaWduYWwtPnR0eSA9IHR0eTsKKwkJdGFza191bmxvY2soY3VycmVudCk7CisJCWN1cnJlbnQtPnNpZ25hbC0+dHR5X29sZF9wZ3JwID0gMDsKKwkJdHR5LT5zZXNzaW9uID0gY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uOworCQl0dHktPnBncnAgPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19VTklYOThfUFRZUworc3RhdGljIGludCBwdG14X29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCByZXR2YWw7CisJaW50IGluZGV4OworCWludCBpZHJfcmV0OworCisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7CisKKwkvKiBmaW5kIGEgZGV2aWNlIHRoYXQgaXMgbm90IGluIHVzZS4gKi8KKwlkb3duKCZhbGxvY2F0ZWRfcHR5c19sb2NrKTsKKwlpZiAoIWlkcl9wcmVfZ2V0KCZhbGxvY2F0ZWRfcHR5cywgR0ZQX0tFUk5FTCkpIHsKKwkJdXAoJmFsbG9jYXRlZF9wdHlzX2xvY2spOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWRyX3JldCA9IGlkcl9nZXRfbmV3KCZhbGxvY2F0ZWRfcHR5cywgTlVMTCwgJmluZGV4KTsKKwlpZiAoaWRyX3JldCA8IDApIHsKKwkJdXAoJmFsbG9jYXRlZF9wdHlzX2xvY2spOworCQlpZiAoaWRyX3JldCA9PSAtRUFHQUlOKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoaW5kZXggPj0gcHR5X2xpbWl0KSB7CisJCWlkcl9yZW1vdmUoJmFsbG9jYXRlZF9wdHlzLCBpbmRleCk7CisJCXVwKCZhbGxvY2F0ZWRfcHR5c19sb2NrKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXVwKCZhbGxvY2F0ZWRfcHR5c19sb2NrKTsKKworCWRvd24oJnR0eV9zZW0pOworCXJldHZhbCA9IGluaXRfZGV2KHB0bV9kcml2ZXIsIGluZGV4LCAmdHR5KTsKKwl1cCgmdHR5X3NlbSk7CisJCisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisKKwlzZXRfYml0KFRUWV9QVFlfTE9DSywgJnR0eS0+ZmxhZ3MpOyAvKiBMT0NLIFRIRSBTTEFWRSAqLworCWZpbHAtPnByaXZhdGVfZGF0YSA9IHR0eTsKKwlmaWxlX21vdmUoZmlscCwgJnR0eS0+dHR5X2ZpbGVzKTsKKworCXJldHZhbCA9IC1FTk9NRU07CisJaWYgKGRldnB0c19wdHlfbmV3KHR0eS0+bGluaykpCisJCWdvdG8gb3V0MTsKKworCWNoZWNrX3R0eV9jb3VudCh0dHksICJ0dHlfb3BlbiIpOworCXJldHZhbCA9IHB0bV9kcml2ZXItPm9wZW4odHR5LCBmaWxwKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dXJuIDA7CitvdXQxOgorCXJlbGVhc2VfZGV2KGZpbHApOworb3V0OgorCWRvd24oJmFsbG9jYXRlZF9wdHlzX2xvY2spOworCWlkcl9yZW1vdmUoJmFsbG9jYXRlZF9wdHlzLCBpbmRleCk7CisJdXAoJmFsbG9jYXRlZF9wdHlzX2xvY2spOworCXJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworc3RhdGljIGludCB0dHlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCWxvY2tfa2VybmVsKCk7CisJcmVsZWFzZV9kZXYoZmlscCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCisvKiBObyBrZXJuZWwgbG9jayBoZWxkIC0gZmluZSAqLworc3RhdGljIHVuc2lnbmVkIGludCB0dHlfcG9sbChzdHJ1Y3QgZmlsZSAqIGZpbHAsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5OworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCWludCByZXQgPSAwOworCisJdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopZmlscC0+cHJpdmF0ZV9kYXRhOworCWlmICh0dHlfcGFyYW5vaWFfY2hlY2sodHR5LCBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSwgInR0eV9wb2xsIikpCisJCXJldHVybiAwOworCQkKKwlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOworCWlmIChsZC0+cG9sbCkKKwkJcmV0ID0gKGxkLT5wb2xsKSh0dHksIGZpbHAsIHdhaXQpOworCXR0eV9sZGlzY19kZXJlZihsZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0dHlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKiBmaWxwLCBpbnQgb24pCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHk7CisJaW50IHJldHZhbDsKKworCXR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgZmlscC0+Zl9kZW50cnktPmRfaW5vZGUsICJ0dHlfZmFzeW5jIikpCisJCXJldHVybiAwOworCQorCXJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCAmdHR5LT5mYXN5bmMpOworCWlmIChyZXR2YWwgPD0gMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmIChvbikgeworCQlpZiAoIXdhaXRxdWV1ZV9hY3RpdmUoJnR0eS0+cmVhZF93YWl0KSkKKwkJCXR0eS0+bWluaW11bV90b193YWtlID0gMTsKKwkJcmV0dmFsID0gZl9zZXRvd24oZmlscCwgKC10dHktPnBncnApID8gOiBjdXJyZW50LT5waWQsIDApOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9IGVsc2UgeworCQlpZiAoIXR0eS0+ZmFzeW5jICYmICF3YWl0cXVldWVfYWN0aXZlKCZ0dHktPnJlYWRfd2FpdCkpCisJCQl0dHktPm1pbmltdW1fdG9fd2FrZSA9IE5fVFRZX0JVRl9TSVpFOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aW9jc3RpKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgX191c2VyICpwKQoreworCWNoYXIgY2gsIG1ieiA9IDA7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisJCisJaWYgKChjdXJyZW50LT5zaWduYWwtPnR0eSAhPSB0dHkpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCWlmIChnZXRfdXNlcihjaCwgcCkpCisJCXJldHVybiAtRUZBVUxUOworCWxkID0gdHR5X2xkaXNjX3JlZl93YWl0KHR0eSk7CisJbGQtPnJlY2VpdmVfYnVmKHR0eSwgJmNoLCAmbWJ6LCAxKTsKKwl0dHlfbGRpc2NfZGVyZWYobGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpb2Nnd2luc3ooc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHdpbnNpemUgX191c2VyICogYXJnKQoreworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdHR5LT53aW5zaXplLCBzaXplb2YoKmFyZykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aW9jc3dpbnN6KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0dHlfc3RydWN0ICpyZWFsX3R0eSwKKwlzdHJ1Y3Qgd2luc2l6ZSBfX3VzZXIgKiBhcmcpCit7CisJc3RydWN0IHdpbnNpemUgdG1wX3dzOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXBfd3MsIGFyZywgc2l6ZW9mKCphcmcpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCFtZW1jbXAoJnRtcF93cywgJnR0eS0+d2luc2l6ZSwgc2l6ZW9mKCphcmcpKSkKKwkJcmV0dXJuIDA7CisjaWZkZWYgQ09ORklHX1ZUCisJaWYgKHR0eS0+ZHJpdmVyLT50eXBlID09IFRUWV9EUklWRVJfVFlQRV9DT05TT0xFKSB7CisJCWludCByYzsKKworCQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJCXJjID0gdmNfcmVzaXplKHR0eS0+ZHJpdmVyX2RhdGEsIHRtcF93cy53c19jb2wsIHRtcF93cy53c19yb3cpOworCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCWlmIChyYykKKwkJCXJldHVybiAtRU5YSU87CisJfQorI2VuZGlmCisJaWYgKHR0eS0+cGdycCA+IDApCisJCWtpbGxfcGcodHR5LT5wZ3JwLCBTSUdXSU5DSCwgMSk7CisJaWYgKChyZWFsX3R0eS0+cGdycCAhPSB0dHktPnBncnApICYmIChyZWFsX3R0eS0+cGdycCA+IDApKQorCQlraWxsX3BnKHJlYWxfdHR5LT5wZ3JwLCBTSUdXSU5DSCwgMSk7CisJdHR5LT53aW5zaXplID0gdG1wX3dzOworCXJlYWxfdHR5LT53aW5zaXplID0gdG1wX3dzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpb2Njb25zKHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoZmlsZS0+Zl9vcC0+d3JpdGUgPT0gcmVkaXJlY3RlZF90dHlfd3JpdGUpIHsKKwkJc3RydWN0IGZpbGUgKmY7CisJCXNwaW5fbG9jaygmcmVkaXJlY3RfbG9jayk7CisJCWYgPSByZWRpcmVjdDsKKwkJcmVkaXJlY3QgPSBOVUxMOworCQlzcGluX3VubG9jaygmcmVkaXJlY3RfbG9jayk7CisJCWlmIChmKQorCQkJZnB1dChmKTsKKwkJcmV0dXJuIDA7CisJfQorCXNwaW5fbG9jaygmcmVkaXJlY3RfbG9jayk7CisJaWYgKHJlZGlyZWN0KSB7CisJCXNwaW5fdW5sb2NrKCZyZWRpcmVjdF9sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJZ2V0X2ZpbGUoZmlsZSk7CisJcmVkaXJlY3QgPSBmaWxlOworCXNwaW5fdW5sb2NrKCZyZWRpcmVjdF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGZpb25iaW8oc3RydWN0IGZpbGUgKmZpbGUsIGludCBfX3VzZXIgKnApCit7CisJaW50IG5vbmJsb2NrOworCisJaWYgKGdldF91c2VyKG5vbmJsb2NrLCBwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobm9uYmxvY2spCisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwllbHNlCisJCWZpbGUtPmZfZmxhZ3MgJj0gfk9fTk9OQkxPQ0s7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGlvY3NjdHR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBhcmcpCit7CisJdGFza190ICpwOworCisJaWYgKGN1cnJlbnQtPnNpZ25hbC0+bGVhZGVyICYmCisJICAgIChjdXJyZW50LT5zaWduYWwtPnNlc3Npb24gPT0gdHR5LT5zZXNzaW9uKSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBUaGUgcHJvY2VzcyBtdXN0IGJlIGEgc2Vzc2lvbiBsZWFkZXIgYW5kCisJICogbm90IGhhdmUgYSBjb250cm9sbGluZyB0dHkgYWxyZWFkeS4KKwkgKi8KKwlpZiAoIWN1cnJlbnQtPnNpZ25hbC0+bGVhZGVyIHx8IGN1cnJlbnQtPnNpZ25hbC0+dHR5KQorCQlyZXR1cm4gLUVQRVJNOworCWlmICh0dHktPnNlc3Npb24gPiAwKSB7CisJCS8qCisJCSAqIFRoaXMgdHR5IGlzIGFscmVhZHkgdGhlIGNvbnRyb2xsaW5nCisJCSAqIHR0eSBmb3IgYW5vdGhlciBzZXNzaW9uIGdyb3VwIQorCQkgKi8KKwkJaWYgKChhcmcgPT0gMSkgJiYgY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQkJLyoKKwkJCSAqIFN0ZWFsIGl0IGF3YXkKKwkJCSAqLworCisJCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCQkJZG9fZWFjaF90YXNrX3BpZCh0dHktPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKSB7CisJCQkJcC0+c2lnbmFsLT50dHkgPSBOVUxMOworCQkJfSB3aGlsZV9lYWNoX3Rhc2tfcGlkKHR0eS0+c2Vzc2lvbiwgUElEVFlQRV9TSUQsIHApOworCQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQl9IGVsc2UKKwkJCXJldHVybiAtRVBFUk07CisJfQorCXRhc2tfbG9jayhjdXJyZW50KTsKKwljdXJyZW50LT5zaWduYWwtPnR0eSA9IHR0eTsKKwl0YXNrX3VubG9jayhjdXJyZW50KTsKKwljdXJyZW50LT5zaWduYWwtPnR0eV9vbGRfcGdycCA9IDA7CisJdHR5LT5zZXNzaW9uID0gY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uOworCXR0eS0+cGdycCA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGlvY2dwZ3JwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0dHlfc3RydWN0ICpyZWFsX3R0eSwgcGlkX3QgX191c2VyICpwKQoreworCS8qCisJICogKHR0eSA9PSByZWFsX3R0eSkgaXMgYSBjaGVhcCB3YXkgb2YKKwkgKiB0ZXN0aW5nIGlmIHRoZSB0dHkgaXMgTk9UIGEgbWFzdGVyIHB0eS4KKwkgKi8KKwlpZiAodHR5ID09IHJlYWxfdHR5ICYmIGN1cnJlbnQtPnNpZ25hbC0+dHR5ICE9IHJlYWxfdHR5KQorCQlyZXR1cm4gLUVOT1RUWTsKKwlyZXR1cm4gcHV0X3VzZXIocmVhbF90dHktPnBncnAsIHApOworfQorCitzdGF0aWMgaW50IHRpb2NzcGdycChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqcmVhbF90dHksIHBpZF90IF9fdXNlciAqcCkKK3sKKwlwaWRfdCBwZ3JwOworCWludCByZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHJlYWxfdHR5KTsKKworCWlmIChyZXR2YWwgPT0gLUVJTykKKwkJcmV0dXJuIC1FTk9UVFk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlpZiAoIWN1cnJlbnQtPnNpZ25hbC0+dHR5IHx8CisJICAgIChjdXJyZW50LT5zaWduYWwtPnR0eSAhPSByZWFsX3R0eSkgfHwKKwkgICAgKHJlYWxfdHR5LT5zZXNzaW9uICE9IGN1cnJlbnQtPnNpZ25hbC0+c2Vzc2lvbikpCisJCXJldHVybiAtRU5PVFRZOworCWlmIChnZXRfdXNlcihwZ3JwLCBwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHBncnAgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc2Vzc2lvbl9vZl9wZ3JwKHBncnApICE9IGN1cnJlbnQtPnNpZ25hbC0+c2Vzc2lvbikKKwkJcmV0dXJuIC1FUEVSTTsKKwlyZWFsX3R0eS0+cGdycCA9IHBncnA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGlvY2dzaWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHR0eV9zdHJ1Y3QgKnJlYWxfdHR5LCBwaWRfdCBfX3VzZXIgKnApCit7CisJLyoKKwkgKiAodHR5ID09IHJlYWxfdHR5KSBpcyBhIGNoZWFwIHdheSBvZgorCSAqIHRlc3RpbmcgaWYgdGhlIHR0eSBpcyBOT1QgYSBtYXN0ZXIgcHR5LgorCSovCisJaWYgKHR0eSA9PSByZWFsX3R0eSAmJiBjdXJyZW50LT5zaWduYWwtPnR0eSAhPSByZWFsX3R0eSkKKwkJcmV0dXJuIC1FTk9UVFk7CisJaWYgKHJlYWxfdHR5LT5zZXNzaW9uIDw9IDApCisJCXJldHVybiAtRU5PVFRZOworCXJldHVybiBwdXRfdXNlcihyZWFsX3R0eS0+c2Vzc2lvbiwgcCk7Cit9CisKK3N0YXRpYyBpbnQgdGlvY3NldGQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IF9fdXNlciAqcCkKK3sKKwlpbnQgbGRpc2M7CisKKwlpZiAoZ2V0X3VzZXIobGRpc2MsIHApKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gdHR5X3NldF9sZGlzYyh0dHksIGxkaXNjKTsKK30KKworc3RhdGljIGludCBzZW5kX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBkdXJhdGlvbikKK3sKKwl0dHktPmRyaXZlci0+YnJlYWtfY3RsKHR0eSwgLTEpOworCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChkdXJhdGlvbik7CisJfQorCXR0eS0+ZHJpdmVyLT5icmVha19jdGwodHR5LCAwKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRUlOVFI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3R0eV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IF9fdXNlciAqcCkKK3sKKwlpbnQgcmV0dmFsID0gLUVJTlZBTDsKKworCWlmICh0dHktPmRyaXZlci0+dGlvY21nZXQpIHsKKwkJcmV0dmFsID0gdHR5LT5kcml2ZXItPnRpb2NtZ2V0KHR0eSwgZmlsZSk7CisKKwkJaWYgKHJldHZhbCA+PSAwKQorCQkJcmV0dmFsID0gcHV0X3VzZXIocmV0dmFsLCBwKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAordHR5X3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgICAgdW5zaWduZWQgX191c2VyICpwKQoreworCWludCByZXR2YWwgPSAtRUlOVkFMOworCisJaWYgKHR0eS0+ZHJpdmVyLT50aW9jbXNldCkgeworCQl1bnNpZ25lZCBpbnQgc2V0LCBjbGVhciwgdmFsOworCisJCXJldHZhbCA9IGdldF91c2VyKHZhbCwgcCk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCisJCXNldCA9IGNsZWFyID0gMDsKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBUSU9DTUJJUzoKKwkJCXNldCA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIFRJT0NNQklDOgorCQkJY2xlYXIgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBUSU9DTVNFVDoKKwkJCXNldCA9IHZhbDsKKwkJCWNsZWFyID0gfnZhbDsKKwkJCWJyZWFrOworCQl9CisKKwkJc2V0ICY9IFRJT0NNX0RUUnxUSU9DTV9SVFN8VElPQ01fT1VUMXxUSU9DTV9PVVQyfFRJT0NNX0xPT1A7CisJCWNsZWFyICY9IFRJT0NNX0RUUnxUSU9DTV9SVFN8VElPQ01fT1VUMXxUSU9DTV9PVVQyfFRJT0NNX0xPT1A7CisKKwkJcmV0dmFsID0gdHR5LT5kcml2ZXItPnRpb2Ntc2V0KHR0eSwgZmlsZSwgc2V0LCBjbGVhcik7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBTcGxpdCB0aGlzIHVwLCBhcyBnY2MgY2FuIGNob2tlIG9uIGl0IG90aGVyd2lzZS4uCisgKi8KK2ludCB0dHlfaW9jdGwoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSwKKwkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCAqcmVhbF90dHk7CisJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwkKKwl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGlub2RlLCAidHR5X2lvY3RsIikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVhbF90dHkgPSB0dHk7CisJaWYgKHR0eS0+ZHJpdmVyLT50eXBlID09IFRUWV9EUklWRVJfVFlQRV9QVFkgJiYKKwkgICAgdHR5LT5kcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSKQorCQlyZWFsX3R0eSA9IHR0eS0+bGluazsKKworCS8qCisJICogQnJlYWsgaGFuZGxpbmcgYnkgZHJpdmVyCisJICovCisJaWYgKCF0dHktPmRyaXZlci0+YnJlYWtfY3RsKSB7CisJCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBUSU9DU0JSSzoKKwkJY2FzZSBUSU9DQ0JSSzoKKwkJCWlmICh0dHktPmRyaXZlci0+aW9jdGwpCisJCQkJcmV0dXJuIHR0eS0+ZHJpdmVyLT5pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQkJCisJCS8qIFRoZXNlIHR3byBpb2N0bCdzIGFsd2F5cyByZXR1cm4gc3VjY2VzczsgZXZlbiBpZiAqLworCQkvKiB0aGUgZHJpdmVyIGRvZXNuJ3Qgc3VwcG9ydCB0aGVtLiAqLworCQljYXNlIFRDU0JSSzoKKwkJY2FzZSBUQ1NCUktQOgorCQkJaWYgKCF0dHktPmRyaXZlci0+aW9jdGwpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR2YWwgPSB0dHktPmRyaXZlci0+aW9jdGwodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisJCQlpZiAocmV0dmFsID09IC1FTk9JT0NUTENNRCkKKwkJCQlyZXR2YWwgPSAwOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KKworCS8qCisJICogRmFjdG9yIG91dCBzb21lIGNvbW1vbiBwcmVwIHdvcmsKKwkgKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElPQ1NFVEQ6CisJY2FzZSBUSU9DU0JSSzoKKwljYXNlIFRJT0NDQlJLOgorCWNhc2UgVENTQlJLOgorCWNhc2UgVENTQlJLUDoJCQkKKwkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJaWYgKGNtZCAhPSBUSU9DQ0JSSykgeworCQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiAtRUlOVFI7CisJCX0KKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBUSU9DU1RJOgorCQkJcmV0dXJuIHRpb2NzdGkodHR5LCBwKTsKKwkJY2FzZSBUSU9DR1dJTlNaOgorCQkJcmV0dXJuIHRpb2Nnd2luc3oodHR5LCBwKTsKKwkJY2FzZSBUSU9DU1dJTlNaOgorCQkJcmV0dXJuIHRpb2Nzd2luc3oodHR5LCByZWFsX3R0eSwgcCk7CisJCWNhc2UgVElPQ0NPTlM6CisJCQlyZXR1cm4gcmVhbF90dHkhPXR0eSA/IC1FSU5WQUwgOiB0aW9jY29ucyhmaWxlKTsKKwkJY2FzZSBGSU9OQklPOgorCQkJcmV0dXJuIGZpb25iaW8oZmlsZSwgcCk7CisJCWNhc2UgVElPQ0VYQ0w6CisJCQlzZXRfYml0KFRUWV9FWENMVVNJVkUsICZ0dHktPmZsYWdzKTsKKwkJCXJldHVybiAwOworCQljYXNlIFRJT0NOWENMOgorCQkJY2xlYXJfYml0KFRUWV9FWENMVVNJVkUsICZ0dHktPmZsYWdzKTsKKwkJCXJldHVybiAwOworCQljYXNlIFRJT0NOT1RUWToKKwkJCWlmIChjdXJyZW50LT5zaWduYWwtPnR0eSAhPSB0dHkpCisJCQkJcmV0dXJuIC1FTk9UVFk7CisJCQlpZiAoY3VycmVudC0+c2lnbmFsLT5sZWFkZXIpCisJCQkJZGlzYXNzb2NpYXRlX2N0dHkoMCk7CisJCQl0YXNrX2xvY2soY3VycmVudCk7CisJCQljdXJyZW50LT5zaWduYWwtPnR0eSA9IE5VTEw7CisJCQl0YXNrX3VubG9jayhjdXJyZW50KTsKKwkJCXJldHVybiAwOworCQljYXNlIFRJT0NTQ1RUWToKKwkJCXJldHVybiB0aW9jc2N0dHkodHR5LCBhcmcpOworCQljYXNlIFRJT0NHUEdSUDoKKwkJCXJldHVybiB0aW9jZ3BncnAodHR5LCByZWFsX3R0eSwgcCk7CisJCWNhc2UgVElPQ1NQR1JQOgorCQkJcmV0dXJuIHRpb2NzcGdycCh0dHksIHJlYWxfdHR5LCBwKTsKKwkJY2FzZSBUSU9DR1NJRDoKKwkJCXJldHVybiB0aW9jZ3NpZCh0dHksIHJlYWxfdHR5LCBwKTsKKwkJY2FzZSBUSU9DR0VURDoKKwkJCS8qIEZJWE1FOiBjaGVjayB0aGlzIGlzIG9rICovCisJCQlyZXR1cm4gcHV0X3VzZXIodHR5LT5sZGlzYy5udW0sIChpbnQgX191c2VyICopcCk7CisJCWNhc2UgVElPQ1NFVEQ6CisJCQlyZXR1cm4gdGlvY3NldGQodHR5LCBwKTsKKyNpZmRlZiBDT05GSUdfVlQKKwkJY2FzZSBUSU9DTElOVVg6CisJCQlyZXR1cm4gdGlvY2xpbnV4KHR0eSwgYXJnKTsKKyNlbmRpZgorCQkvKgorCQkgKiBCcmVhayBoYW5kbGluZworCQkgKi8KKwkJY2FzZSBUSU9DU0JSSzoJLyogVHVybiBicmVhayBvbiwgdW5jb25kaXRpb25hbGx5ICovCisJCQl0dHktPmRyaXZlci0+YnJlYWtfY3RsKHR0eSwgLTEpOworCQkJcmV0dXJuIDA7CisJCQkKKwkJY2FzZSBUSU9DQ0JSSzoJLyogVHVybiBicmVhayBvZmYsIHVuY29uZGl0aW9uYWxseSAqLworCQkJdHR5LT5kcml2ZXItPmJyZWFrX2N0bCh0dHksIDApOworCQkJcmV0dXJuIDA7CisJCWNhc2UgVENTQlJLOiAgIC8qIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhayAqLworCQkJLyoKKwkJCSAqIFhYWCBpcyB0aGUgYWJvdmUgY29tbWVudCBjb3JyZWN0LCBvciB0aGUKKwkJCSAqIGNvZGUgYmVsb3cgY29ycmVjdD8gIElzIHRoaXMgaW9jdGwgdXNlZCBhdAorCQkJICogYWxsIGJ5IGFueW9uZT8KKwkJCSAqLworCQkJaWYgKCFhcmcpCisJCQkJcmV0dXJuIHNlbmRfYnJlYWsodHR5LCBIWi80KTsKKwkJCXJldHVybiAwOworCQljYXNlIFRDU0JSS1A6CS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8JCisJCQlyZXR1cm4gc2VuZF9icmVhayh0dHksIGFyZyA/IGFyZyooSFovMTApIDogSFovNCk7CisKKwkJY2FzZSBUSU9DTUdFVDoKKwkJCXJldHVybiB0dHlfdGlvY21nZXQodHR5LCBmaWxlLCBwKTsKKworCQljYXNlIFRJT0NNU0VUOgorCQljYXNlIFRJT0NNQklDOgorCQljYXNlIFRJT0NNQklTOgorCQkJcmV0dXJuIHR0eV90aW9jbXNldCh0dHksIGZpbGUsIGNtZCwgcCk7CisJfQorCWlmICh0dHktPmRyaXZlci0+aW9jdGwpIHsKKwkJcmV0dmFsID0gKHR0eS0+ZHJpdmVyLT5pb2N0bCkodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisJCWlmIChyZXR2YWwgIT0gLUVOT0lPQ1RMQ01EKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJbGQgPSB0dHlfbGRpc2NfcmVmX3dhaXQodHR5KTsKKwlyZXR2YWwgPSAtRUlOVkFMOworCWlmIChsZC0+aW9jdGwpIHsKKwkJcmV0dmFsID0gbGQtPmlvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlpZiAocmV0dmFsID09IC1FTk9JT0NUTENNRCkKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJfQorCXR0eV9sZGlzY19kZXJlZihsZCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKgorICogVGhpcyBpbXBsZW1lbnRzIHRoZSAiU2VjdXJlIEF0dGVudGlvbiBLZXkiIC0tLSAgdGhlIGlkZWEgaXMgdG8KKyAqIHByZXZlbnQgdHJvamFuIGhvcnNlcyBieSBraWxsaW5nIGFsbCBwcm9jZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAqIHR0eSB3aGVuIHRoZSB1c2VyIGhpdHMgdGhlICJTZWN1cmUgQXR0ZW50aW9uIEtleSIuICBSZXF1aXJlZCBmb3IKKyAqIHN1cGVyLXBhcmFub2lkIGFwcGxpY2F0aW9ucyAtLS0gc2VlIHRoZSBPcmFuZ2UgQm9vayBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBUaGlzIGNvZGUgY291bGQgYmUgbmljZXI7IGlkZWFsbHkgaXQgc2hvdWxkIHNlbmQgYSBIVVAsIHdhaXQgYSBmZXcKKyAqIHNlY29uZHMsIHRoZW4gc2VuZCBhIElOVCwgYW5kIHRoZW4gYSBLSUxMIHNpZ25hbC4gIEJ1dCB5b3UgdGhlbgorICogaGF2ZSB0byBjb29yZGluYXRlIHdpdGggdGhlIGluaXQgcHJvY2Vzcywgc2luY2UgYWxsIHByb2Nlc3NlcyBhc3NvY2lhdGVkCisgKiB3aXRoIHRoZSBjdXJyZW50IHR0eSBtdXN0IGJlIGRlYWQgYmVmb3JlIHRoZSBuZXcgZ2V0dHkgaXMgYWxsb3dlZAorICogdG8gc3Bhd24uCisgKgorICogTm93LCBpZiBpdCB3b3VsZCBiZSBjb3JyZWN0IDstLyBUaGUgY3VycmVudCBjb2RlIGhhcyBhIG5hc3R5IGhvbGUgLQorICogaXQgZG9lc24ndCBjYXRjaCBmaWxlcyBpbiBmbGlnaHQuIFdlIG1heSBzZW5kIHRoZSBkZXNjcmlwdG9yIHRvIG91cnNlbHZlcworICogdmlhIEFGX1VOSVggc29ja2V0LCBjbG9zZSBpdCBhbmQgbGF0ZXIgZmV0Y2ggZnJvbSBzb2NrZXQuIEZJWE1FLgorICoKKyAqIE5hc3R5IGJ1ZzogZG9fU0FLIGlzIGJlaW5nIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dC4gIFRoaXMgY2FuCisgKiBkZWFkbG9jay4gIFdlIHB1bnQgaXQgdXAgdG8gcHJvY2VzcyBjb250ZXh0LiAgQUtQTSAtIDE2TWFyMjAwMQorICovCitzdGF0aWMgdm9pZCBfX2RvX1NBSyh2b2lkICphcmcpCit7CisjaWZkZWYgVFRZX1NPRlRfU0FLCisJdHR5X2hhbmd1cCh0dHkpOworI2Vsc2UKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gYXJnOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwlpbnQgc2Vzc2lvbjsKKwlpbnQJCWk7CisJc3RydWN0IGZpbGUJKmZpbHA7CisJc3RydWN0IHR0eV9sZGlzYyAqZGlzYzsKKwkKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCXNlc3Npb24gID0gdHR5LT5zZXNzaW9uOworCQorCS8qIFdlIGRvbid0IHdhbnQgYW4gbGRpc2Mgc3dpdGNoIGR1cmluZyB0aGlzICovCisJZGlzYyA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwlpZiAoZGlzYyAmJiBkaXNjLT5mbHVzaF9idWZmZXIpCisJCWRpc2MtPmZsdXNoX2J1ZmZlcih0dHkpOworCXR0eV9sZGlzY19kZXJlZihkaXNjKTsKKworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlkb19lYWNoX3Rhc2tfcGlkKHNlc3Npb24sIFBJRFRZUEVfU0lELCBwKSB7CisJCWlmIChwLT5zaWduYWwtPnR0eSA9PSB0dHkgfHwgc2Vzc2lvbiA+IDApIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiU0FLOiBraWxsZWQgcHJvY2VzcyAlZCIKKwkJCSAgICAiICglcyk6IHAtPnNpZ25hbC0+c2Vzc2lvbj09dHR5LT5zZXNzaW9uXG4iLAorCQkJICAgIHAtPnBpZCwgcC0+Y29tbSk7CisJCQlzZW5kX3NpZyhTSUdLSUxMLCBwLCAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXRhc2tfbG9jayhwKTsKKwkJaWYgKHAtPmZpbGVzKSB7CisJCQlzcGluX2xvY2soJnAtPmZpbGVzLT5maWxlX2xvY2spOworCQkJZm9yIChpPTA7IGkgPCBwLT5maWxlcy0+bWF4X2ZkczsgaSsrKSB7CisJCQkJZmlscCA9IGZjaGVja19maWxlcyhwLT5maWxlcywgaSk7CisJCQkJaWYgKCFmaWxwKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoZmlscC0+Zl9vcC0+cmVhZCA9PSB0dHlfcmVhZCAmJgorCQkJCSAgICBmaWxwLT5wcml2YXRlX2RhdGEgPT0gdHR5KSB7CisJCQkJCXByaW50ayhLRVJOX05PVElDRSAiU0FLOiBraWxsZWQgcHJvY2VzcyAlZCIKKwkJCQkJICAgICIgKCVzKTogZmQjJWQgb3BlbmVkIHRvIHRoZSB0dHlcbiIsCisJCQkJCSAgICBwLT5waWQsIHAtPmNvbW0sIGkpOworCQkJCQlzZW5kX3NpZyhTSUdLSUxMLCBwLCAxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2soJnAtPmZpbGVzLT5maWxlX2xvY2spOworCQl9CisJCXRhc2tfdW5sb2NrKHApOworCX0gd2hpbGVfZWFjaF90YXNrX3BpZChzZXNzaW9uLCBQSURUWVBFX1NJRCwgcCk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworI2VuZGlmCit9CisKKy8qCisgKiBUaGUgdHEgaGFuZGxpbmcgaGVyZSBpcyBhIGxpdHRsZSByYWN5IC0gdHR5LT5TQUtfd29yayBtYXkgYWxyZWFkeSBiZSBxdWV1ZWQuCisgKiBGb3J0dW5hdGVseSB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5LCBiZWNhdXNlIGlmIC0+U0FLX3dvcmsgaXMgYWxyZWFkeSBxdWV1ZWQsCisgKiB0aGUgdmFsdWVzIHdoaWNoIHdlIHdyaXRlIHRvIGl0IHdpbGwgYmUgaWRlbnRpY2FsIHRvIHRoZSB2YWx1ZXMgd2hpY2ggaXQKKyAqIGFscmVhZHkgaGFzLiAtLWFrcG0KKyAqLwordm9pZCBkb19TQUsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCVBSRVBBUkVfV09SSygmdHR5LT5TQUtfd29yaywgX19kb19TQUssIHR0eSk7CisJc2NoZWR1bGVfd29yaygmdHR5LT5TQUtfd29yayk7Cit9CisKK0VYUE9SVF9TWU1CT0woZG9fU0FLKTsKKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgb3V0IG9mIHRoZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gZmx1c2ggZGF0YQorICogZnJvbSB0aGUgZmxpcCBidWZmZXIgdG8gdGhlIGxpbmUgZGlzY2lwbGluZS4gCisgKi8KKyAKK3N0YXRpYyB2b2lkIGZsdXNoX3RvX2xkaXNjKHZvaWQgKnByaXZhdGVfKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgcHJpdmF0ZV87CisJdW5zaWduZWQgY2hhcgkqY3A7CisJY2hhcgkJKmZwOworCWludAkJY291bnQ7CisJdW5zaWduZWQgbG9uZyAJZmxhZ3M7CisJc3RydWN0IHR0eV9sZGlzYyAqZGlzYzsKKworCWRpc2MgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaWYgKGRpc2MgPT0gTlVMTCkJLyogICFUVFlfTERJU0MgKi8KKwkJcmV0dXJuOworCisJaWYgKHRlc3RfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKSkgeworCQkvKgorCQkgKiBEbyBpdCBhZnRlciB0aGUgbmV4dCB0aW1lciB0aWNrOgorCQkgKi8KKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisJCWdvdG8gb3V0OworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwlpZiAodHR5LT5mbGlwLmJ1Zl9udW0pIHsKKwkJY3AgPSB0dHktPmZsaXAuY2hhcl9idWYgKyBUVFlfRkxJUEJVRl9TSVpFOworCQlmcCA9IHR0eS0+ZmxpcC5mbGFnX2J1ZiArIFRUWV9GTElQQlVGX1NJWkU7CisJCXR0eS0+ZmxpcC5idWZfbnVtID0gMDsKKwkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IHR0eS0+ZmxpcC5jaGFyX2J1ZjsKKwkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IHR0eS0+ZmxpcC5mbGFnX2J1ZjsKKwl9IGVsc2UgeworCQljcCA9IHR0eS0+ZmxpcC5jaGFyX2J1ZjsKKwkJZnAgPSB0dHktPmZsaXAuZmxhZ19idWY7CisJCXR0eS0+ZmxpcC5idWZfbnVtID0gMTsKKwkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IHR0eS0+ZmxpcC5jaGFyX2J1ZiArIFRUWV9GTElQQlVGX1NJWkU7CisJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSB0dHktPmZsaXAuZmxhZ19idWYgKyBUVFlfRkxJUEJVRl9TSVpFOworCX0KKwljb3VudCA9IHR0eS0+ZmxpcC5jb3VudDsKKwl0dHktPmZsaXAuY291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisKKwlkaXNjLT5yZWNlaXZlX2J1Zih0dHksIGNwLCBmcCwgY291bnQpOworb3V0OgorCXR0eV9sZGlzY19kZXJlZihkaXNjKTsKK30KKworLyoKKyAqIFJvdXRpbmUgd2hpY2ggcmV0dXJucyB0aGUgYmF1ZCByYXRlIG9mIHRoZSB0dHkKKyAqCisgKiBOb3RlIHRoYXQgdGhlIGJhdWRfdGFibGUgbmVlZHMgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlCisgKiBpbmNsdWRlL2FzbS90ZXJtYml0cy5oIGZpbGUuCisgKi8KK3N0YXRpYyBpbnQgYmF1ZF90YWJsZVtdID0geworCTAsIDUwLCA3NSwgMTEwLCAxMzQsIDE1MCwgMjAwLCAzMDAsIDYwMCwgMTIwMCwgMTgwMCwgMjQwMCwgNDgwMCwKKwk5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAsIDIzMDQwMCwgNDYwODAwLAorI2lmZGVmIF9fc3BhcmNfXworCTc2ODAwLCAxNTM2MDAsIDMwNzIwMCwgNjE0NDAwLCA5MjE2MDAKKyNlbHNlCisJNTAwMDAwLCA1NzYwMDAsIDkyMTYwMCwgMTAwMDAwMCwgMTE1MjAwMCwgMTUwMDAwMCwgMjAwMDAwMCwKKwkyNTAwMDAwLCAzMDAwMDAwLCAzNTAwMDAwLCA0MDAwMDAwCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgbl9iYXVkX3RhYmxlID0gQVJSQVlfU0laRShiYXVkX3RhYmxlKTsKKworLyoqCisgKgl0dHlfdGVybWlvc19iYXVkX3JhdGUKKyAqCUB0ZXJtaW9zOiB0ZXJtaW9zIHN0cnVjdHVyZQorICoKKyAqCUNvbnZlcnQgdGVybWlvcyBiYXVkIHJhdGUgZGF0YSBpbnRvIGEgc3BlZWQuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZAorICoJd2l0aCB0aGUgdGVybWlvcyBsb2NrIGhlbGQgaWYgdGhpcyB0ZXJtaW9zIGlzIGEgdGVybWluYWwgdGVybWlvcworICoJc3RydWN0dXJlLiBNYXkgY2hhbmdlIHRoZSB0ZXJtaW9zIGRhdGEuCisgKi8KKyAKK2ludCB0dHlfdGVybWlvc19iYXVkX3JhdGUoc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MpCit7CisJdW5zaWduZWQgaW50IGNiYXVkOworCQorCWNiYXVkID0gdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEOworCisJaWYgKGNiYXVkICYgQ0JBVURFWCkgeworCQljYmF1ZCAmPSB+Q0JBVURFWDsKKworCQlpZiAoY2JhdWQgPCAxIHx8IGNiYXVkICsgMTUgPiBuX2JhdWRfdGFibGUpCisJCQl0ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVREVYOworCQllbHNlCisJCQljYmF1ZCArPSAxNTsKKwl9CisJcmV0dXJuIGJhdWRfdGFibGVbY2JhdWRdOworfQorCitFWFBPUlRfU1lNQk9MKHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSk7CisKKy8qKgorICoJdHR5X2dldF9iYXVkX3JhdGUJLQlnZXQgdHR5IGJpdCByYXRlcworICoJQHR0eTogdHR5IHRvIHF1ZXJ5CisgKgorICoJUmV0dXJucyB0aGUgYmF1ZCByYXRlIGFzIGFuIGludGVnZXIgZm9yIHRoaXMgdGVybWluYWwuIFRoZQorICoJdGVybWlvcyBsb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyIGFuZCB0aGUgdGVybWluYWwgYml0CisgKglmbGFncyBtYXkgYmUgdXBkYXRlZC4KKyAqLworIAoraW50IHR0eV9nZXRfYmF1ZF9yYXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaW50IGJhdWQgPSB0dHlfdGVybWlvc19iYXVkX3JhdGUodHR5LT50ZXJtaW9zKTsKKworCWlmIChiYXVkID09IDM4NDAwICYmIHR0eS0+YWx0X3NwZWVkKSB7CisJCWlmICghdHR5LT53YXJuZWQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVzZSBvZiBzZXRzZXJpYWwvc2V0cm9ja2V0IHRvICIKKwkJCQkJICAgICJzZXQgU1BEXyogZmxhZ3MgaXMgZGVwcmVjYXRlZFxuIik7CisJCQl0dHktPndhcm5lZCA9IDE7CisJCX0KKwkJYmF1ZCA9IHR0eS0+YWx0X3NwZWVkOworCX0KKwkKKwlyZXR1cm4gYmF1ZDsKK30KKworRVhQT1JUX1NZTUJPTCh0dHlfZ2V0X2JhdWRfcmF0ZSk7CisKKy8qKgorICoJdHR5X2ZsaXBfYnVmZmVyX3B1c2gJLQl0ZXJtaW5hbAorICoJQHR0eTogdHR5IHRvIHB1c2gKKyAqCisgKglRdWV1ZSBhIHB1c2ggb2YgdGhlIHRlcm1pbmFsIGZsaXAgYnVmZmVycyB0byB0aGUgbGluZSBkaXNjaXBsaW5lLiBUaGlzCisgKglmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSBJUlEgY29udGV4dCBpZiB0dHktPmxvd19sYXRlbmN5IGlzIHNldC4KKyAqCisgKglJbiB0aGUgZXZlbnQgb2YgdGhlIHF1ZXVlIGJlaW5nIGJ1c3kgZm9yIGZsaXBwaW5nIHRoZSB3b3JrIHdpbGwgYmUKKyAqCWhlbGQgb2ZmIGFuZCByZXRyaWVkIGxhdGVyLgorICovCisKK3ZvaWQgdHR5X2ZsaXBfYnVmZmVyX3B1c2goc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAodHR5LT5sb3dfbGF0ZW5jeSkKKwkJZmx1c2hfdG9fbGRpc2MoKHZvaWQgKikgdHR5KTsKKwllbHNlCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworfQorCitFWFBPUlRfU1lNQk9MKHR0eV9mbGlwX2J1ZmZlcl9wdXNoKTsKKworLyoKKyAqIFRoaXMgc3Vicm91dGluZSBpbml0aWFsaXplcyBhIHR0eSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfdHR5X3N0cnVjdChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCW1lbXNldCh0dHksIDAsIHNpemVvZihzdHJ1Y3QgdHR5X3N0cnVjdCkpOworCXR0eS0+bWFnaWMgPSBUVFlfTUFHSUM7CisJdHR5X2xkaXNjX2Fzc2lnbih0dHksIHR0eV9sZGlzY19nZXQoTl9UVFkpKTsKKwl0dHktPnBncnAgPSAtMTsKKwl0dHktPm92ZXJydW5fdGltZSA9IGppZmZpZXM7CisJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IHR0eS0+ZmxpcC5jaGFyX2J1ZjsKKwl0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gdHR5LT5mbGlwLmZsYWdfYnVmOworCUlOSVRfV09SSygmdHR5LT5mbGlwLndvcmssIGZsdXNoX3RvX2xkaXNjLCB0dHkpOworCWluaXRfTVVURVgoJnR0eS0+ZmxpcC5wdHlfc2VtKTsKKwlpbml0X01VVEVYKCZ0dHktPnRlcm1pb3Nfc2VtKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0dHktPndyaXRlX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnR0eS0+cmVhZF93YWl0KTsKKwlJTklUX1dPUksoJnR0eS0+aGFuZ3VwX3dvcmssIGRvX3R0eV9oYW5ndXAsIHR0eSk7CisJc2VtYV9pbml0KCZ0dHktPmF0b21pY19yZWFkLCAxKTsKKwlzZW1hX2luaXQoJnR0eS0+YXRvbWljX3dyaXRlLCAxKTsKKwlzcGluX2xvY2tfaW5pdCgmdHR5LT5yZWFkX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZ0dHktPnR0eV9maWxlcyk7CisJSU5JVF9XT1JLKCZ0dHktPlNBS193b3JrLCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqIFRoZSBkZWZhdWx0IHB1dF9jaGFyIHJvdXRpbmUgaWYgdGhlIGRyaXZlciBkaWQgbm90IGRlZmluZSBvbmUuCisgKi8KK3N0YXRpYyB2b2lkIHR0eV9kZWZhdWx0X3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgJmNoLCAxKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKnR0eV9jbGFzczsKKworLyoqCisgKiB0dHlfcmVnaXN0ZXJfZGV2aWNlIC0gcmVnaXN0ZXIgYSB0dHkgZGV2aWNlCisgKiBAZHJpdmVyOiB0aGUgdHR5IGRyaXZlciB0aGF0IGRlc2NyaWJlcyB0aGUgdHR5IGRldmljZQorICogQGluZGV4OiB0aGUgaW5kZXggaW4gdGhlIHR0eSBkcml2ZXIgZm9yIHRoaXMgdHR5IGRldmljZQorICogQGRldmljZTogYSBzdHJ1Y3QgZGV2aWNlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHR5IGRldmljZS4KKyAqCVRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGlmIHRoZXJlIGlzIG5vIGtub3duIHN0cnVjdCBkZXZpY2UgZm9yIHRoaXMKKyAqCXR0eSBkZXZpY2UgaXQgY2FuIGJlIHNldCB0byBOVUxMIHNhZmVseS4KKyAqCisgKiBUaGlzIGNhbGwgaXMgcmVxdWlyZWQgdG8gYmUgbWFkZSB0byByZWdpc3RlciBhbiBpbmRpdmlkdWFsIHR0eSBkZXZpY2UgaWYKKyAqIHRoZSB0dHkgZHJpdmVyJ3MgZmxhZ3MgaGF2ZSB0aGUgVFRZX0RSSVZFUl9OT19ERVZGUyBiaXQgc2V0LiAgSWYgdGhhdAorICogYml0IGlzIG5vdCBzZXQsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQuCisgKi8KK3ZvaWQgdHR5X3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCB1bnNpZ25lZCBpbmRleCwKKwkJCSBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJY2hhciBuYW1lWzY0XTsKKwlkZXZfdCBkZXYgPSBNS0RFVihkcml2ZXItPm1ham9yLCBkcml2ZXItPm1pbm9yX3N0YXJ0KSArIGluZGV4OworCisJaWYgKGluZGV4ID49IGRyaXZlci0+bnVtKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQXR0ZW1wdCB0byByZWdpc3RlciBpbnZhbGlkIHR0eSBsaW5lIG51bWJlciAiCisJCSAgICAgICAiICglZCkuXG4iLCBpbmRleCk7CisJCXJldHVybjsKKwl9CisKKwlkZXZmc19ta19jZGV2KGRldiwgU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJIiVzJWQiLCBkcml2ZXItPmRldmZzX25hbWUsIGluZGV4ICsgZHJpdmVyLT5uYW1lX2Jhc2UpOworCisJaWYgKGRyaXZlci0+dHlwZSA9PSBUVFlfRFJJVkVSX1RZUEVfUFRZKQorCQlwdHlfbGluZV9uYW1lKGRyaXZlciwgaW5kZXgsIG5hbWUpOworCWVsc2UKKwkJdHR5X2xpbmVfbmFtZShkcml2ZXIsIGluZGV4LCBuYW1lKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh0dHlfY2xhc3MsIGRldiwgZGV2aWNlLCBuYW1lKTsKK30KKworLyoqCisgKiB0dHlfdW5yZWdpc3Rlcl9kZXZpY2UgLSB1bnJlZ2lzdGVyIGEgdHR5IGRldmljZQorICogQGRyaXZlcjogdGhlIHR0eSBkcml2ZXIgdGhhdCBkZXNjcmliZXMgdGhlIHR0eSBkZXZpY2UKKyAqIEBpbmRleDogdGhlIGluZGV4IGluIHRoZSB0dHkgZHJpdmVyIGZvciB0aGlzIHR0eSBkZXZpY2UKKyAqCisgKiBJZiBhIHR0eSBkZXZpY2UgaXMgcmVnaXN0ZXJlZCB3aXRoIGEgY2FsbCB0byB0dHlfcmVnaXN0ZXJfZGV2aWNlKCkgdGhlbgorICogdGhpcyBmdW5jdGlvbiBtdXN0IGJlIG1hZGUgd2hlbiB0aGUgdHR5IGRldmljZSBpcyBnb25lLgorICovCit2b2lkIHR0eV91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCB1bnNpZ25lZCBpbmRleCkKK3sKKwlkZXZmc19yZW1vdmUoIiVzJWQiLCBkcml2ZXItPmRldmZzX25hbWUsIGluZGV4ICsgZHJpdmVyLT5uYW1lX2Jhc2UpOworCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKGRyaXZlci0+bWFqb3IsIGRyaXZlci0+bWlub3Jfc3RhcnQpICsgaW5kZXgpOworfQorCitFWFBPUlRfU1lNQk9MKHR0eV9yZWdpc3Rlcl9kZXZpY2UpOworRVhQT1JUX1NZTUJPTCh0dHlfdW5yZWdpc3Rlcl9kZXZpY2UpOworCitzdHJ1Y3QgdHR5X2RyaXZlciAqYWxsb2NfdHR5X2RyaXZlcihpbnQgbGluZXMpCit7CisJc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcjsKKworCWRyaXZlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0dHlfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRyaXZlcikgeworCQltZW1zZXQoZHJpdmVyLCAwLCBzaXplb2Yoc3RydWN0IHR0eV9kcml2ZXIpKTsKKwkJZHJpdmVyLT5tYWdpYyA9IFRUWV9EUklWRVJfTUFHSUM7CisJCWRyaXZlci0+bnVtID0gbGluZXM7CisJCS8qIGxhdGVyIHdlJ2xsIG1vdmUgYWxsb2NhdGlvbiBvZiB0YWJsZXMgaGVyZSAqLworCX0KKwlyZXR1cm4gZHJpdmVyOworfQorCit2b2lkIHB1dF90dHlfZHJpdmVyKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIpCit7CisJa2ZyZWUoZHJpdmVyKTsKK30KKwordm9pZCB0dHlfc2V0X29wZXJhdGlvbnMoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgc3RydWN0IHR0eV9vcGVyYXRpb25zICpvcCkKK3sKKwlkcml2ZXItPm9wZW4gPSBvcC0+b3BlbjsKKwlkcml2ZXItPmNsb3NlID0gb3AtPmNsb3NlOworCWRyaXZlci0+d3JpdGUgPSBvcC0+d3JpdGU7CisJZHJpdmVyLT5wdXRfY2hhciA9IG9wLT5wdXRfY2hhcjsKKwlkcml2ZXItPmZsdXNoX2NoYXJzID0gb3AtPmZsdXNoX2NoYXJzOworCWRyaXZlci0+d3JpdGVfcm9vbSA9IG9wLT53cml0ZV9yb29tOworCWRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyID0gb3AtPmNoYXJzX2luX2J1ZmZlcjsKKwlkcml2ZXItPmlvY3RsID0gb3AtPmlvY3RsOworCWRyaXZlci0+c2V0X3Rlcm1pb3MgPSBvcC0+c2V0X3Rlcm1pb3M7CisJZHJpdmVyLT50aHJvdHRsZSA9IG9wLT50aHJvdHRsZTsKKwlkcml2ZXItPnVudGhyb3R0bGUgPSBvcC0+dW50aHJvdHRsZTsKKwlkcml2ZXItPnN0b3AgPSBvcC0+c3RvcDsKKwlkcml2ZXItPnN0YXJ0ID0gb3AtPnN0YXJ0OworCWRyaXZlci0+aGFuZ3VwID0gb3AtPmhhbmd1cDsKKwlkcml2ZXItPmJyZWFrX2N0bCA9IG9wLT5icmVha19jdGw7CisJZHJpdmVyLT5mbHVzaF9idWZmZXIgPSBvcC0+Zmx1c2hfYnVmZmVyOworCWRyaXZlci0+c2V0X2xkaXNjID0gb3AtPnNldF9sZGlzYzsKKwlkcml2ZXItPndhaXRfdW50aWxfc2VudCA9IG9wLT53YWl0X3VudGlsX3NlbnQ7CisJZHJpdmVyLT5zZW5kX3hjaGFyID0gb3AtPnNlbmRfeGNoYXI7CisJZHJpdmVyLT5yZWFkX3Byb2MgPSBvcC0+cmVhZF9wcm9jOworCWRyaXZlci0+d3JpdGVfcHJvYyA9IG9wLT53cml0ZV9wcm9jOworCWRyaXZlci0+dGlvY21nZXQgPSBvcC0+dGlvY21nZXQ7CisJZHJpdmVyLT50aW9jbXNldCA9IG9wLT50aW9jbXNldDsKK30KKworCitFWFBPUlRfU1lNQk9MKGFsbG9jX3R0eV9kcml2ZXIpOworRVhQT1JUX1NZTUJPTChwdXRfdHR5X2RyaXZlcik7CitFWFBPUlRfU1lNQk9MKHR0eV9zZXRfb3BlcmF0aW9ucyk7CisKKy8qCisgKiBDYWxsZWQgYnkgYSB0dHkgZHJpdmVyIHRvIHJlZ2lzdGVyIGl0c2VsZi4KKyAqLworaW50IHR0eV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcikKK3sKKwlpbnQgZXJyb3I7CisgICAgICAgIGludCBpOworCWRldl90IGRldjsKKwl2b2lkICoqcCA9IE5VTEw7CisKKwlpZiAoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfSU5TVEFMTEVEKQorCQlyZXR1cm4gMDsKKworCWlmICghKGRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pKSB7CisJCXAgPSBrbWFsbG9jKGRyaXZlci0+bnVtICogMyAqIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbXNldChwLCAwLCBkcml2ZXItPm51bSAqIDMgKiBzaXplb2Yodm9pZCAqKSk7CisJfQorCisJaWYgKCFkcml2ZXItPm1ham9yKSB7CisJCWVycm9yID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmZGV2LCBkcml2ZXItPm1pbm9yX3N0YXJ0LCBkcml2ZXItPm51bSwKKwkJCQkJCShjaGFyKilkcml2ZXItPm5hbWUpOworCQlpZiAoIWVycm9yKSB7CisJCQlkcml2ZXItPm1ham9yID0gTUFKT1IoZGV2KTsKKwkJCWRyaXZlci0+bWlub3Jfc3RhcnQgPSBNSU5PUihkZXYpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2ID0gTUtERVYoZHJpdmVyLT5tYWpvciwgZHJpdmVyLT5taW5vcl9zdGFydCk7CisJCWVycm9yID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXYsIGRyaXZlci0+bnVtLAorCQkJCQkJKGNoYXIqKWRyaXZlci0+bmFtZSk7CisJfQorCWlmIChlcnJvciA8IDApIHsKKwkJa2ZyZWUocCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlpZiAocCkgeworCQlkcml2ZXItPnR0eXMgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKiopcDsKKwkJZHJpdmVyLT50ZXJtaW9zID0gKHN0cnVjdCB0ZXJtaW9zICoqKShwICsgZHJpdmVyLT5udW0pOworCQlkcml2ZXItPnRlcm1pb3NfbG9ja2VkID0gKHN0cnVjdCB0ZXJtaW9zICoqKShwICsgZHJpdmVyLT5udW0gKiAyKTsKKwl9IGVsc2UgeworCQlkcml2ZXItPnR0eXMgPSBOVUxMOworCQlkcml2ZXItPnRlcm1pb3MgPSBOVUxMOworCQlkcml2ZXItPnRlcm1pb3NfbG9ja2VkID0gTlVMTDsKKwl9CisKKwljZGV2X2luaXQoJmRyaXZlci0+Y2RldiwgJnR0eV9mb3BzKTsKKwlkcml2ZXItPmNkZXYub3duZXIgPSBkcml2ZXItPm93bmVyOworCWVycm9yID0gY2Rldl9hZGQoJmRyaXZlci0+Y2RldiwgZGV2LCBkcml2ZXItPm51bSk7CisJaWYgKGVycm9yKSB7CisJCWNkZXZfZGVsKCZkcml2ZXItPmNkZXYpOworCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBkcml2ZXItPm51bSk7CisJCWRyaXZlci0+dHR5cyA9IE5VTEw7CisJCWRyaXZlci0+dGVybWlvcyA9IGRyaXZlci0+dGVybWlvc19sb2NrZWQgPSBOVUxMOworCQlrZnJlZShwKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWlmICghZHJpdmVyLT5wdXRfY2hhcikKKwkJZHJpdmVyLT5wdXRfY2hhciA9IHR0eV9kZWZhdWx0X3B1dF9jaGFyOworCQorCWxpc3RfYWRkKCZkcml2ZXItPnR0eV9kcml2ZXJzLCAmdHR5X2RyaXZlcnMpOworCQorCWlmICggIShkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9OT19ERVZGUykgKSB7CisJCWZvcihpID0gMDsgaSA8IGRyaXZlci0+bnVtOyBpKyspCisJCSAgICB0dHlfcmVnaXN0ZXJfZGV2aWNlKGRyaXZlciwgaSwgTlVMTCk7CisJfQorCXByb2NfdHR5X3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHR0eV9yZWdpc3Rlcl9kcml2ZXIpOworCisvKgorICogQ2FsbGVkIGJ5IGEgdHR5IGRyaXZlciB0byB1bnJlZ2lzdGVyIGl0c2VsZi4KKyAqLworaW50IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyKQoreworCWludCBpOworCXN0cnVjdCB0ZXJtaW9zICp0cDsKKwl2b2lkICpwOworCisJaWYgKGRyaXZlci0+cmVmY291bnQpCisJCXJldHVybiAtRUJVU1k7CisKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoZHJpdmVyLT5tYWpvciwgZHJpdmVyLT5taW5vcl9zdGFydCksCisJCQkJZHJpdmVyLT5udW0pOworCisJbGlzdF9kZWwoJmRyaXZlci0+dHR5X2RyaXZlcnMpOworCisJLyoKKwkgKiBGcmVlIHRoZSB0ZXJtaW9zIGFuZCB0ZXJtaW9zX2xvY2tlZCBzdHJ1Y3R1cmVzIGJlY2F1c2UKKwkgKiB3ZSBkb24ndCB3YW50IHRvIGdldCBtZW1vcnkgbGVha3Mgd2hlbiBtb2R1bGFyIHR0eQorCSAqIGRyaXZlcnMgYXJlIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBkcml2ZXItPm51bTsgaSsrKSB7CisJCXRwID0gZHJpdmVyLT50ZXJtaW9zW2ldOworCQlpZiAodHApIHsKKwkJCWRyaXZlci0+dGVybWlvc1tpXSA9IE5VTEw7CisJCQlrZnJlZSh0cCk7CisJCX0KKwkJdHAgPSBkcml2ZXItPnRlcm1pb3NfbG9ja2VkW2ldOworCQlpZiAodHApIHsKKwkJCWRyaXZlci0+dGVybWlvc19sb2NrZWRbaV0gPSBOVUxMOworCQkJa2ZyZWUodHApOworCQl9CisJCWlmICghKGRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX05PX0RFVkZTKSkKKwkJCXR0eV91bnJlZ2lzdGVyX2RldmljZShkcml2ZXIsIGkpOworCX0KKwlwID0gZHJpdmVyLT50dHlzOworCXByb2NfdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGRyaXZlcik7CisJZHJpdmVyLT50dHlzID0gTlVMTDsKKwlkcml2ZXItPnRlcm1pb3MgPSBkcml2ZXItPnRlcm1pb3NfbG9ja2VkID0gTlVMTDsKKwlrZnJlZShwKTsKKwljZGV2X2RlbCgmZHJpdmVyLT5jZGV2KTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh0dHlfdW5yZWdpc3Rlcl9kcml2ZXIpOworCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBjb25zb2xlIGRldmljZS4gVGhpcyBpcyBjYWxsZWQgKmVhcmx5Kiwgc28KKyAqIHdlIGNhbid0IG5lY2Vzc2FyaWx5IGRlcGVuZCBvbiBsb3RzIG9mIGtlcm5lbCBoZWxwIGhlcmUuCisgKiBKdXN0IGRvIHNvbWUgZWFybHkgaW5pdGlhbGl6YXRpb25zLCBhbmQgZG8gdGhlIGNvbXBsZXggc2V0dXAKKyAqIGxhdGVyLgorICovCit2b2lkIF9faW5pdCBjb25zb2xlX2luaXQodm9pZCkKK3sKKwlpbml0Y2FsbF90ICpjYWxsOworCisJLyogU2V0dXAgdGhlIGRlZmF1bHQgVFRZIGxpbmUgZGlzY2lwbGluZS4gKi8KKwkodm9pZCkgdHR5X3JlZ2lzdGVyX2xkaXNjKE5fVFRZLCAmdHR5X2xkaXNjX05fVFRZKTsKKworCS8qCisJICogc2V0IHVwIHRoZSBjb25zb2xlIGRldmljZSBzbyB0aGF0IGxhdGVyIGJvb3Qgc2VxdWVuY2VzIGNhbiAKKwkgKiBpbmZvcm0gYWJvdXQgcHJvYmxlbXMgZXRjLi4KKwkgKi8KKyNpZmRlZiBDT05GSUdfRUFSTFlfUFJJTlRLCisJZGlzYWJsZV9lYXJseV9wcmludGsoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfNjgzNjAKKyAJLyogVGhpcyBpcyBub3QgYSBjb25zb2xlIGluaXRjYWxsLiBJIGtub3cgbm90IHdoYXQgaXQncyBkb2luZyBoZXJlLgorCSAgIFNvIEkgaGF2ZW4ndCBtb3ZlZCBpdC4gZHdtdzIgKi8KKyAgICAgICAgcnNfMzYwX2luaXQoKTsKKyNlbmRpZgorCWNhbGwgPSBfX2Nvbl9pbml0Y2FsbF9zdGFydDsKKwl3aGlsZSAoY2FsbCA8IF9fY29uX2luaXRjYWxsX2VuZCkgeworCQkoKmNhbGwpKCk7CisJCWNhbGwrKzsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfVlQKK2V4dGVybiBpbnQgdnR5X2luaXQodm9pZCk7CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgdHR5X2NsYXNzX2luaXQodm9pZCkKK3sKKwl0dHlfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAidHR5Iik7CisJaWYgKElTX0VSUih0dHlfY2xhc3MpKQorCQlyZXR1cm4gUFRSX0VSUih0dHlfY2xhc3MpOworCXJldHVybiAwOworfQorCitwb3N0Y29yZV9pbml0Y2FsbCh0dHlfY2xhc3NfaW5pdCk7CisKKy8qIDMvMjAwNCBqbWM6IHdoeSBkbyB0aGVzZSBkZXZpY2VzIGV4aXN0PyAqLworCitzdGF0aWMgc3RydWN0IGNkZXYgdHR5X2NkZXYsIGNvbnNvbGVfY2RldjsKKyNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKK3N0YXRpYyBzdHJ1Y3QgY2RldiBwdG14X2NkZXY7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVlQKK3N0YXRpYyBzdHJ1Y3QgY2RldiB2YzBfY2RldjsKKyNlbmRpZgorCisvKgorICogT2ssIG5vdyB3ZSBjYW4gaW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgdHR5IGRldmljZXMgYW5kIGNhbiBjb3VudAorICogb24gbWVtb3J5IGFsbG9jYXRpb25zLCBpbnRlcnJ1cHRzIGV0Yy4uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHR0eV9pbml0KHZvaWQpCit7CisJY2Rldl9pbml0KCZ0dHlfY2RldiwgJnR0eV9mb3BzKTsKKwlpZiAoY2Rldl9hZGQoJnR0eV9jZGV2LCBNS0RFVihUVFlBVVhfTUFKT1IsIDApLCAxKSB8fAorCSAgICByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFRUWUFVWF9NQUpPUiwgMCksIDEsICIvZGV2L3R0eSIpIDwgMCkKKwkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIC9kZXYvdHR5IGRyaXZlclxuIik7CisJZGV2ZnNfbWtfY2RldihNS0RFVihUVFlBVVhfTUFKT1IsIDApLCBTX0lGQ0hSfFNfSVJVR098U19JV1VHTywgInR0eSIpOworCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHR0eV9jbGFzcywgTUtERVYoVFRZQVVYX01BSk9SLCAwKSwgTlVMTCwgInR0eSIpOworCisJY2Rldl9pbml0KCZjb25zb2xlX2NkZXYsICZjb25zb2xlX2ZvcHMpOworCWlmIChjZGV2X2FkZCgmY29uc29sZV9jZGV2LCBNS0RFVihUVFlBVVhfTUFKT1IsIDEpLCAxKSB8fAorCSAgICByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFRUWUFVWF9NQUpPUiwgMSksIDEsICIvZGV2L2NvbnNvbGUiKSA8IDApCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciAvZGV2L2NvbnNvbGUgZHJpdmVyXG4iKTsKKwlkZXZmc19ta19jZGV2KE1LREVWKFRUWUFVWF9NQUpPUiwgMSksIFNfSUZDSFJ8U19JUlVTUnxTX0lXVVNSLCAiY29uc29sZSIpOworCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHR0eV9jbGFzcywgTUtERVYoVFRZQVVYX01BSk9SLCAxKSwgTlVMTCwgImNvbnNvbGUiKTsKKworI2lmZGVmIENPTkZJR19VTklYOThfUFRZUworCWNkZXZfaW5pdCgmcHRteF9jZGV2LCAmcHRteF9mb3BzKTsKKwlpZiAoY2Rldl9hZGQoJnB0bXhfY2RldiwgTUtERVYoVFRZQVVYX01BSk9SLCAyKSwgMSkgfHwKKwkgICAgcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihUVFlBVVhfTUFKT1IsIDIpLCAxLCAiL2Rldi9wdG14IikgPCAwKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgL2Rldi9wdG14IGRyaXZlclxuIik7CisJZGV2ZnNfbWtfY2RldihNS0RFVihUVFlBVVhfTUFKT1IsIDIpLCBTX0lGQ0hSfFNfSVJVR098U19JV1VHTywgInB0bXgiKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh0dHlfY2xhc3MsIE1LREVWKFRUWUFVWF9NQUpPUiwgMiksIE5VTEwsICJwdG14Iik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19WVAorCWNkZXZfaW5pdCgmdmMwX2NkZXYsICZjb25zb2xlX2ZvcHMpOworCWlmIChjZGV2X2FkZCgmdmMwX2NkZXYsIE1LREVWKFRUWV9NQUpPUiwgMCksIDEpIHx8CisJICAgIHJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoVFRZX01BSk9SLCAwKSwgMSwgIi9kZXYvdmMvMCIpIDwgMCkKKwkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIC9kZXYvdHR5MCBkcml2ZXJcbiIpOworCWRldmZzX21rX2NkZXYoTUtERVYoVFRZX01BSk9SLCAwKSwgU19JRkNIUnxTX0lSVVNSfFNfSVdVU1IsICJ2Yy8wIik7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQodHR5X2NsYXNzLCBNS0RFVihUVFlfTUFKT1IsIDApLCBOVUxMLCAidHR5MCIpOworCisJdnR5X2luaXQoKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorbW9kdWxlX2luaXQodHR5X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NTk3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdHR5X2lvY3RsLmMKQEAgLTAsMCArMSw1NTEgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCAgTGludXMgVG9ydmFsZHMKKyAqCisgKiBNb2RpZmllZCBieSBGcmVkIE4uIHZhbiBLZW1wZW4sIDAxLzI5LzkzLCB0byBhZGQgbGluZSBkaXNjaXBsaW5lcworICogd2hpY2ggY2FuIGJlIGR5bmFtaWNhbGx5IGFjdGl2YXRlZCBhbmQgZGUtYWN0aXZhdGVkIGJ5IHRoZSBsaW5lCisgKiBkaXNjaXBsaW5lIGhhbmRsaW5nIG1vZHVsZXMgKGxpa2UgU0xJUCkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjdW5kZWYgVFRZX0RFQlVHX1dBSVRfVU5USUxfU0VOVAorCisjdW5kZWYJREVCVUcKKworLyoKKyAqIEludGVybmFsIGZsYWcgb3B0aW9ucyBmb3IgdGVybWlvcyBzZXR0aW5nIGJlaGF2aW9yCisgKi8KKyNkZWZpbmUgVEVSTUlPU19GTFVTSAkxCisjZGVmaW5lIFRFUk1JT1NfV0FJVAkyCisjZGVmaW5lIFRFUk1JT1NfVEVSTUlPCTQKKwordm9pZCB0dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBsb25nIHRpbWVvdXQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKyNpZmRlZiBUVFlfREVCVUdfV0FJVF9VTlRJTF9TRU5UCisJY2hhciBidWZbNjRdOworCQorCXByaW50ayhLRVJOX0RFQlVHICIlcyB3YWl0IHVudGlsIHNlbnQuLi5cbiIsIHR0eV9uYW1lKHR0eSwgYnVmKSk7CisjZW5kaWYKKwlpZiAoIXR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIpCisJCXJldHVybjsKKwlhZGRfd2FpdF9xdWV1ZSgmdHR5LT53cml0ZV93YWl0LCAmd2FpdCk7CisJaWYgKCF0aW1lb3V0KQorCQl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisJZG8geworI2lmZGVmIFRUWV9ERUJVR19XQUlUX1VOVElMX1NFTlQKKwkJcHJpbnRrKEtFUk5fREVCVUcgIndhaXRpbmcgJXMuLi4oJWQpXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZiksCisJCSAgICAgICB0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkpOworI2VuZGlmCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWdvdG8gc3RvcF93YWl0aW5nOworCQlpZiAoIXR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIodHR5KSkKKwkJCWJyZWFrOworCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwl9IHdoaWxlICh0aW1lb3V0KTsKKwlpZiAodHR5LT5kcml2ZXItPndhaXRfdW50aWxfc2VudCkKKwkJdHR5LT5kcml2ZXItPndhaXRfdW50aWxfc2VudCh0dHksIHRpbWVvdXQpOworc3RvcF93YWl0aW5nOgorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOworfQorCitFWFBPUlRfU1lNQk9MKHR0eV93YWl0X3VudGlsX3NlbnQpOworCitzdGF0aWMgdm9pZCB1bnNldF9sb2NrZWRfdGVybWlvcyhzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywKKwkJCQkgc3RydWN0IHRlcm1pb3MgKm9sZCwKKwkJCQkgc3RydWN0IHRlcm1pb3MgKmxvY2tlZCkKK3sKKwlpbnQJaTsKKwkKKyNkZWZpbmUgTk9TRVRfTUFTSyh4LHkseikgKHggPSAoKHgpICYgfih6KSkgfCAoKHkpICYgKHopKSkKKworCWlmICghbG9ja2VkKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmc/IT8gdGVybWlvc19sb2NrZWQgaXMgTlVMTC5cbiIpOworCQlyZXR1cm47CisJfQorCisJTk9TRVRfTUFTSyh0ZXJtaW9zLT5jX2lmbGFnLCBvbGQtPmNfaWZsYWcsIGxvY2tlZC0+Y19pZmxhZyk7CisJTk9TRVRfTUFTSyh0ZXJtaW9zLT5jX29mbGFnLCBvbGQtPmNfb2ZsYWcsIGxvY2tlZC0+Y19vZmxhZyk7CisJTk9TRVRfTUFTSyh0ZXJtaW9zLT5jX2NmbGFnLCBvbGQtPmNfY2ZsYWcsIGxvY2tlZC0+Y19jZmxhZyk7CisJTk9TRVRfTUFTSyh0ZXJtaW9zLT5jX2xmbGFnLCBvbGQtPmNfbGZsYWcsIGxvY2tlZC0+Y19sZmxhZyk7CisJdGVybWlvcy0+Y19saW5lID0gbG9ja2VkLT5jX2xpbmUgPyBvbGQtPmNfbGluZSA6IHRlcm1pb3MtPmNfbGluZTsKKwlmb3IgKGk9MDsgaSA8IE5DQ1M7IGkrKykKKwkJdGVybWlvcy0+Y19jY1tpXSA9IGxvY2tlZC0+Y19jY1tpXSA/CisJCQlvbGQtPmNfY2NbaV0gOiB0ZXJtaW9zLT5jX2NjW2ldOworfQorCitzdGF0aWMgdm9pZCBjaGFuZ2VfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IHRlcm1pb3MgKiBuZXdfdGVybWlvcykKK3sKKwlpbnQgY2Fub25fY2hhbmdlOworCXN0cnVjdCB0ZXJtaW9zIG9sZF90ZXJtaW9zID0gKnR0eS0+dGVybWlvczsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwkKKwkvKgorCSAqCVBlcmZvcm0gdGhlIGFjdHVhbCB0ZXJtaW9zIGludGVybmFsIGNoYW5nZXMgdW5kZXIgbG9jay4KKwkgKi8KKwkgCisKKwkvKiBGSVhNRTogd2UgbmVlZCB0byBkZWNpZGUgb24gc29tZSBsb2NraW5nL29yZGVyaW5nIHNlbWFudGljcworCSAgIGZvciB0aGUgc2V0X3Rlcm1pb3Mgbm90aWZpY2F0aW9uIGV2ZW50dWFsbHkgKi8KKwlkb3duKCZ0dHktPnRlcm1pb3Nfc2VtKTsKKworCSp0dHktPnRlcm1pb3MgPSAqbmV3X3Rlcm1pb3M7CisJdW5zZXRfbG9ja2VkX3Rlcm1pb3ModHR5LT50ZXJtaW9zLCAmb2xkX3Rlcm1pb3MsIHR0eS0+dGVybWlvc19sb2NrZWQpOworCWNhbm9uX2NoYW5nZSA9IChvbGRfdGVybWlvcy5jX2xmbGFnIF4gdHR5LT50ZXJtaW9zLT5jX2xmbGFnKSAmIElDQU5PTjsKKwlpZiAoY2Fub25fY2hhbmdlKSB7CisJCW1lbXNldCgmdHR5LT5yZWFkX2ZsYWdzLCAwLCBzaXplb2YgdHR5LT5yZWFkX2ZsYWdzKTsKKwkJdHR5LT5jYW5vbl9oZWFkID0gdHR5LT5yZWFkX3RhaWw7CisJCXR0eS0+Y2Fub25fZGF0YSA9IDA7CisJCXR0eS0+ZXJhc2luZyA9IDA7CisJfQorCQorCQorCWlmIChjYW5vbl9jaGFuZ2UgJiYgIUxfSUNBTk9OKHR0eSkgJiYgdHR5LT5yZWFkX2NudCkKKwkJLyogR2V0IGNoYXJhY3RlcnMgbGVmdCBvdmVyIGZyb20gY2Fub25pY2FsIG1vZGUuICovCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5yZWFkX3dhaXQpOworCisJLyogU2VlIGlmIHBhY2tldCBtb2RlIGNoYW5nZSBvZiBzdGF0ZS4gKi8KKworCWlmICh0dHktPmxpbmsgJiYgdHR5LT5saW5rLT5wYWNrZXQpIHsKKwkJaW50IG9sZF9mbG93ID0gKChvbGRfdGVybWlvcy5jX2lmbGFnICYgSVhPTikgJiYKKwkJCQkob2xkX3Rlcm1pb3MuY19jY1tWU1RPUF0gPT0gJ1wwMjMnKSAmJgorCQkJCShvbGRfdGVybWlvcy5jX2NjW1ZTVEFSVF0gPT0gJ1wwMjEnKSk7CisJCWludCBuZXdfZmxvdyA9IChJX0lYT04odHR5KSAmJgorCQkJCVNUT1BfQ0hBUih0dHkpID09ICdcMDIzJyAmJgorCQkJCVNUQVJUX0NIQVIodHR5KSA9PSAnXDAyMScpOworCQlpZiAob2xkX2Zsb3cgIT0gbmV3X2Zsb3cpIHsKKwkJCXR0eS0+Y3RybF9zdGF0dXMgJj0gfihUSU9DUEtUX0RPU1RPUCB8IFRJT0NQS1RfTk9TVE9QKTsKKwkJCWlmIChuZXdfZmxvdykKKwkJCQl0dHktPmN0cmxfc3RhdHVzIHw9IFRJT0NQS1RfRE9TVE9QOworCQkJZWxzZQorCQkJCXR0eS0+Y3RybF9zdGF0dXMgfD0gVElPQ1BLVF9OT1NUT1A7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+bGluay0+cmVhZF93YWl0KTsKKwkJfQorCX0KKwkgICAKKwlpZiAodHR5LT5kcml2ZXItPnNldF90ZXJtaW9zKQorCQkoKnR0eS0+ZHJpdmVyLT5zZXRfdGVybWlvcykodHR5LCAmb2xkX3Rlcm1pb3MpOworCisJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaWYgKGxkICE9IE5VTEwpIHsKKwkJaWYgKGxkLT5zZXRfdGVybWlvcykKKwkJCShsZC0+c2V0X3Rlcm1pb3MpKHR0eSwgJm9sZF90ZXJtaW9zKTsKKwkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwl9CisJdXAoJnR0eS0+dGVybWlvc19zZW0pOworfQorCitzdGF0aWMgaW50IHNldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCB2b2lkIF9fdXNlciAqYXJnLCBpbnQgb3B0KQoreworCXN0cnVjdCB0ZXJtaW9zIHRtcF90ZXJtaW9zOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCWludCByZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKG9wdCAmIFRFUk1JT1NfVEVSTUlPKSB7CisJCW1lbWNweSgmdG1wX3Rlcm1pb3MsIHR0eS0+dGVybWlvcywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSk7CisJCWlmICh1c2VyX3Rlcm1pb190b19rZXJuZWxfdGVybWlvcygmdG1wX3Rlcm1pb3MsCisJCQkJCQkoc3RydWN0IHRlcm1pbyBfX3VzZXIgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJaWYgKHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcygmdG1wX3Rlcm1pb3MsCisJCQkJCQkoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCWxkID0gdHR5X2xkaXNjX3JlZih0dHkpOworCQorCWlmIChsZCAhPSBOVUxMKSB7CisJCWlmICgob3B0ICYgVEVSTUlPU19GTFVTSCkgJiYgbGQtPmZsdXNoX2J1ZmZlcikKKwkJCWxkLT5mbHVzaF9idWZmZXIodHR5KTsKKwkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwl9CisJCisJaWYgKG9wdCAmIFRFUk1JT1NfV0FJVCkgeworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRUlOVFI7CisJfQorCisJY2hhbmdlX3Rlcm1pb3ModHR5LCAmdG1wX3Rlcm1pb3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF90ZXJtaW8oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCB0ZXJtaW8gX191c2VyICogdGVybWlvKQoreworCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pbyh0ZXJtaW8sIHR0eS0+dGVybWlvcykpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnFfY2Fub24oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJaW50IG5yLCBoZWFkLCB0YWlsOworCisJaWYgKCF0dHktPmNhbm9uX2RhdGEgfHwgIXR0eS0+cmVhZF9idWYpCisJCXJldHVybiAwOworCWhlYWQgPSB0dHktPmNhbm9uX2hlYWQ7CisJdGFpbCA9IHR0eS0+cmVhZF90YWlsOworCW5yID0gKGhlYWQgLSB0YWlsKSAmIChOX1RUWV9CVUZfU0laRS0xKTsKKwkvKiBTa2lwIEVPRi1jaGFycy4uICovCisJd2hpbGUgKGhlYWQgIT0gdGFpbCkgeworCQlpZiAodGVzdF9iaXQodGFpbCwgdHR5LT5yZWFkX2ZsYWdzKSAmJgorCQkgICAgdHR5LT5yZWFkX2J1Zlt0YWlsXSA9PSBfX0RJU0FCTEVEX0NIQVIpCisJCQluci0tOworCQl0YWlsID0gKHRhaWwrMSkgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CisJfQorCXJldHVybiBucjsKK30KKworI2lmZGVmIFRJT0NHRVRQCisvKgorICogVGhlc2UgYXJlIGRlcHJlY2F0ZWQsIGJ1dCB0aGVyZSBpcyBsaW1pdGVkIHN1cHBvcnQuLgorICoKKyAqIFRoZSAic2dfZmxhZ3MiIHRyYW5zbGF0aW9uIGlzIGEgam9rZS4uCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3NnZmxhZ3Moc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJaW50IGZsYWdzID0gMDsKKworCWlmICghKHR0eS0+dGVybWlvcy0+Y19sZmxhZyAmIElDQU5PTikpIHsKKwkJaWYgKHR0eS0+dGVybWlvcy0+Y19sZmxhZyAmIElTSUcpCisJCQlmbGFncyB8PSAweDAyOwkJLyogY2JyZWFrICovCisJCWVsc2UKKwkJCWZsYWdzIHw9IDB4MjA7CQkvKiByYXcgKi8KKwl9CisJaWYgKHR0eS0+dGVybWlvcy0+Y19sZmxhZyAmIEVDSE8pCisJCWZsYWdzIHw9IDB4MDg7CQkJLyogZWNobyAqLworCWlmICh0dHktPnRlcm1pb3MtPmNfb2ZsYWcgJiBPUE9TVCkKKwkJaWYgKHR0eS0+dGVybWlvcy0+Y19vZmxhZyAmIE9OTENSKQorCQkJZmxhZ3MgfD0gMHgxMDsJCS8qIGNybW9kICovCisJcmV0dXJuIGZsYWdzOworfQorCitzdGF0aWMgaW50IGdldF9zZ3R0eWIoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBzZ3R0eWIgX191c2VyICogc2d0dHliKQoreworCXN0cnVjdCBzZ3R0eWIgdG1wOworCisJZG93bigmdHR5LT50ZXJtaW9zX3NlbSk7CisJdG1wLnNnX2lzcGVlZCA9IDA7CisJdG1wLnNnX29zcGVlZCA9IDA7CisJdG1wLnNnX2VyYXNlID0gdHR5LT50ZXJtaW9zLT5jX2NjW1ZFUkFTRV07CisJdG1wLnNnX2tpbGwgPSB0dHktPnRlcm1pb3MtPmNfY2NbVktJTExdOworCXRtcC5zZ19mbGFncyA9IGdldF9zZ2ZsYWdzKHR0eSk7CisJdXAoJnR0eS0+dGVybWlvc19zZW0pOworCQorCXJldHVybiBjb3B5X3RvX3VzZXIoc2d0dHliLCAmdG1wLCBzaXplb2YodG1wKSkgPyAtRUZBVUxUIDogMDsKK30KKworc3RhdGljIHZvaWQgc2V0X3NnZmxhZ3Moc3RydWN0IHRlcm1pb3MgKiB0ZXJtaW9zLCBpbnQgZmxhZ3MpCit7CisJdGVybWlvcy0+Y19pZmxhZyA9IElDUk5MIHwgSVhPTjsKKwl0ZXJtaW9zLT5jX29mbGFnID0gMDsKKwl0ZXJtaW9zLT5jX2xmbGFnID0gSVNJRyB8IElDQU5PTjsKKwlpZiAoZmxhZ3MgJiAweDAyKSB7CS8qIGNicmVhayAqLworCQl0ZXJtaW9zLT5jX2lmbGFnID0gMDsKKwkJdGVybWlvcy0+Y19sZmxhZyAmPSB+SUNBTk9OOworCX0KKwlpZiAoZmxhZ3MgJiAweDA4KSB7CQkvKiBlY2hvICovCisJCXRlcm1pb3MtPmNfbGZsYWcgfD0gRUNITyB8IEVDSE9FIHwgRUNIT0sgfAorCQkJCSAgICBFQ0hPQ1RMIHwgRUNIT0tFIHwgSUVYVEVOOworCX0KKwlpZiAoZmxhZ3MgJiAweDEwKSB7CQkvKiBjcm1vZCAqLworCQl0ZXJtaW9zLT5jX29mbGFnIHw9IE9QT1NUIHwgT05MQ1I7CisJfQorCWlmIChmbGFncyAmIDB4MjApIHsJLyogcmF3ICovCisJCXRlcm1pb3MtPmNfaWZsYWcgPSAwOworCQl0ZXJtaW9zLT5jX2xmbGFnICY9IH4oSVNJRyB8IElDQU5PTik7CisJfQorCWlmICghKHRlcm1pb3MtPmNfbGZsYWcgJiBJQ0FOT04pKSB7CisJCXRlcm1pb3MtPmNfY2NbVk1JTl0gPSAxOworCQl0ZXJtaW9zLT5jX2NjW1ZUSU1FXSA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHNldF9zZ3R0eWIoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBzZ3R0eWIgX191c2VyICogc2d0dHliKQoreworCWludCByZXR2YWw7CisJc3RydWN0IHNndHR5YiB0bXA7CisJc3RydWN0IHRlcm1pb3MgdGVybWlvczsKKworCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCQorCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCBzZ3R0eWIsIHNpemVvZih0bXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZ0dHktPnRlcm1pb3Nfc2VtKTsJCQorCXRlcm1pb3MgPSAgKnR0eS0+dGVybWlvczsKKwl0ZXJtaW9zLmNfY2NbVkVSQVNFXSA9IHRtcC5zZ19lcmFzZTsKKwl0ZXJtaW9zLmNfY2NbVktJTExdID0gdG1wLnNnX2tpbGw7CisJc2V0X3NnZmxhZ3MoJnRlcm1pb3MsIHRtcC5zZ19mbGFncyk7CisJdXAoJnR0eS0+dGVybWlvc19zZW0pOworCWNoYW5nZV90ZXJtaW9zKHR0eSwgJnRlcm1pb3MpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBUSU9DR0VUQworc3RhdGljIGludCBnZXRfdGNoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgdGNoYXJzIF9fdXNlciAqIHRjaGFycykKK3sKKwlzdHJ1Y3QgdGNoYXJzIHRtcDsKKworCXRtcC50X2ludHJjID0gdHR5LT50ZXJtaW9zLT5jX2NjW1ZJTlRSXTsKKwl0bXAudF9xdWl0YyA9IHR0eS0+dGVybWlvcy0+Y19jY1tWUVVJVF07CisJdG1wLnRfc3RhcnRjID0gdHR5LT50ZXJtaW9zLT5jX2NjW1ZTVEFSVF07CisJdG1wLnRfc3RvcGMgPSB0dHktPnRlcm1pb3MtPmNfY2NbVlNUT1BdOworCXRtcC50X2VvZmMgPSB0dHktPnRlcm1pb3MtPmNfY2NbVkVPRl07CisJdG1wLnRfYnJrYyA9IHR0eS0+dGVybWlvcy0+Y19jY1tWRU9MMl07CS8qIHdoYXQgaXMgYnJrYyBhbnl3YXk/ICovCisJcmV0dXJuIGNvcHlfdG9fdXNlcih0Y2hhcnMsICZ0bXAsIHNpemVvZih0bXApKSA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IHNldF90Y2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCB0Y2hhcnMgX191c2VyICogdGNoYXJzKQoreworCXN0cnVjdCB0Y2hhcnMgdG1wOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHRjaGFycywgc2l6ZW9mKHRtcCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwl0dHktPnRlcm1pb3MtPmNfY2NbVklOVFJdID0gdG1wLnRfaW50cmM7CisJdHR5LT50ZXJtaW9zLT5jX2NjW1ZRVUlUXSA9IHRtcC50X3F1aXRjOworCXR0eS0+dGVybWlvcy0+Y19jY1tWU1RBUlRdID0gdG1wLnRfc3RhcnRjOworCXR0eS0+dGVybWlvcy0+Y19jY1tWU1RPUF0gPSB0bXAudF9zdG9wYzsKKwl0dHktPnRlcm1pb3MtPmNfY2NbVkVPRl0gPSB0bXAudF9lb2ZjOworCXR0eS0+dGVybWlvcy0+Y19jY1tWRU9MMl0gPSB0bXAudF9icmtjOwkvKiB3aGF0IGlzIGJya2MgYW55d2F5PyAqLworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBUSU9DR0xUQworc3RhdGljIGludCBnZXRfbHRjaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGx0Y2hhcnMgX191c2VyICogbHRjaGFycykKK3sKKwlzdHJ1Y3QgbHRjaGFycyB0bXA7CisKKwl0bXAudF9zdXNwYyA9IHR0eS0+dGVybWlvcy0+Y19jY1tWU1VTUF07CisJdG1wLnRfZHN1c3BjID0gdHR5LT50ZXJtaW9zLT5jX2NjW1ZTVVNQXTsJLyogd2hhdCBpcyBkc3VzcGMgYW55d2F5PyAqLworCXRtcC50X3Jwcm50YyA9IHR0eS0+dGVybWlvcy0+Y19jY1tWUkVQUklOVF07CisJdG1wLnRfZmx1c2hjID0gdHR5LT50ZXJtaW9zLT5jX2NjW1ZFT0wyXTsJLyogd2hhdCBpcyBmbHVzaGMgYW55d2F5PyAqLworCXRtcC50X3dlcmFzYyA9IHR0eS0+dGVybWlvcy0+Y19jY1tWV0VSQVNFXTsKKwl0bXAudF9sbmV4dGMgPSB0dHktPnRlcm1pb3MtPmNfY2NbVkxORVhUXTsKKwlyZXR1cm4gY29weV90b191c2VyKGx0Y2hhcnMsICZ0bXAsIHNpemVvZih0bXApKSA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IHNldF9sdGNoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgbHRjaGFycyBfX3VzZXIgKiBsdGNoYXJzKQoreworCXN0cnVjdCBsdGNoYXJzIHRtcDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCBsdGNoYXJzLCBzaXplb2YodG1wKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJdHR5LT50ZXJtaW9zLT5jX2NjW1ZTVVNQXSA9IHRtcC50X3N1c3BjOworCXR0eS0+dGVybWlvcy0+Y19jY1tWRU9MMl0gPSB0bXAudF9kc3VzcGM7CS8qIHdoYXQgaXMgZHN1c3BjIGFueXdheT8gKi8KKwl0dHktPnRlcm1pb3MtPmNfY2NbVlJFUFJJTlRdID0gdG1wLnRfcnBybnRjOworCXR0eS0+dGVybWlvcy0+Y19jY1tWRU9MMl0gPSB0bXAudF9mbHVzaGM7CS8qIHdoYXQgaXMgZmx1c2hjIGFueXdheT8gKi8KKwl0dHktPnRlcm1pb3MtPmNfY2NbVldFUkFTRV0gPSB0bXAudF93ZXJhc2M7CisJdHR5LT50ZXJtaW9zLT5jX2NjW1ZMTkVYVF0gPSB0bXAudF9sbmV4dGM7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqIFNlbmQgYSBoaWdoIHByaW9yaXR5IGNoYXJhY3RlciB0byB0aGUgdHR5LgorICovCitzdGF0aWMgdm9pZCBzZW5kX3ByaW9fY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKQoreworCWludAl3YXNfc3RvcHBlZCA9IHR0eS0+c3RvcHBlZDsKKworCWlmICh0dHktPmRyaXZlci0+c2VuZF94Y2hhcikgeworCQl0dHktPmRyaXZlci0+c2VuZF94Y2hhcih0dHksIGNoKTsKKwkJcmV0dXJuOworCX0KKwlpZiAod2FzX3N0b3BwZWQpCisJCXN0YXJ0X3R0eSh0dHkpOworCXR0eS0+ZHJpdmVyLT53cml0ZSh0dHksICZjaCwgMSk7CisJaWYgKHdhc19zdG9wcGVkKQorCQlzdG9wX3R0eSh0dHkpOworfQorCitpbnQgbl90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICogcmVhbF90dHk7CisJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKworCWlmICh0dHktPmRyaXZlci0+dHlwZSA9PSBUVFlfRFJJVkVSX1RZUEVfUFRZICYmCisJICAgIHR0eS0+ZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUikKKwkJcmVhbF90dHkgPSB0dHktPmxpbms7CisJZWxzZQorCQlyZWFsX3R0eSA9IHR0eTsKKworCXN3aXRjaCAoY21kKSB7CisjaWZkZWYgVElPQ0dFVFAKKwkJY2FzZSBUSU9DR0VUUDoKKwkJCXJldHVybiBnZXRfc2d0dHliKHJlYWxfdHR5LCAoc3RydWN0IHNndHR5YiBfX3VzZXIgKikgYXJnKTsKKwkJY2FzZSBUSU9DU0VUUDoKKwkJY2FzZSBUSU9DU0VUTjoKKwkJCXJldHVybiBzZXRfc2d0dHliKHJlYWxfdHR5LCAoc3RydWN0IHNndHR5YiBfX3VzZXIgKikgYXJnKTsKKyNlbmRpZgorI2lmZGVmIFRJT0NHRVRDCisJCWNhc2UgVElPQ0dFVEM6CisJCQlyZXR1cm4gZ2V0X3RjaGFycyhyZWFsX3R0eSwgcCk7CisJCWNhc2UgVElPQ1NFVEM6CisJCQlyZXR1cm4gc2V0X3RjaGFycyhyZWFsX3R0eSwgcCk7CisjZW5kaWYKKyNpZmRlZiBUSU9DR0xUQworCQljYXNlIFRJT0NHTFRDOgorCQkJcmV0dXJuIGdldF9sdGNoYXJzKHJlYWxfdHR5LCBwKTsKKwkJY2FzZSBUSU9DU0xUQzoKKwkJCXJldHVybiBzZXRfbHRjaGFycyhyZWFsX3R0eSwgcCk7CisjZW5kaWYKKwkJY2FzZSBUQ0dFVFM6CisJCQlpZiAoa2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKilhcmcsIHJlYWxfdHR5LT50ZXJtaW9zKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQljYXNlIFRDU0VUU0Y6CisJCQlyZXR1cm4gc2V0X3Rlcm1pb3MocmVhbF90dHksIHAsICBURVJNSU9TX0ZMVVNIIHwgVEVSTUlPU19XQUlUKTsKKwkJY2FzZSBUQ1NFVFNXOgorCQkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCBURVJNSU9TX1dBSVQpOworCQljYXNlIFRDU0VUUzoKKwkJCXJldHVybiBzZXRfdGVybWlvcyhyZWFsX3R0eSwgcCwgMCk7CisJCWNhc2UgVENHRVRBOgorCQkJcmV0dXJuIGdldF90ZXJtaW8ocmVhbF90dHksIHApOworCQljYXNlIFRDU0VUQUY6CisJCQlyZXR1cm4gc2V0X3Rlcm1pb3MocmVhbF90dHksIHAsIFRFUk1JT1NfRkxVU0ggfCBURVJNSU9TX1dBSVQgfCBURVJNSU9TX1RFUk1JTyk7CisJCWNhc2UgVENTRVRBVzoKKwkJCXJldHVybiBzZXRfdGVybWlvcyhyZWFsX3R0eSwgcCwgVEVSTUlPU19XQUlUIHwgVEVSTUlPU19URVJNSU8pOworCQljYXNlIFRDU0VUQToKKwkJCXJldHVybiBzZXRfdGVybWlvcyhyZWFsX3R0eSwgcCwgVEVSTUlPU19URVJNSU8pOworCQljYXNlIFRDWE9OQzoKKwkJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCXN3aXRjaCAoYXJnKSB7CisJCQljYXNlIFRDT09GRjoKKwkJCQlpZiAoIXR0eS0+Zmxvd19zdG9wcGVkKSB7CisJCQkJCXR0eS0+Zmxvd19zdG9wcGVkID0gMTsKKwkJCQkJc3RvcF90dHkodHR5KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRDT09OOgorCQkJCWlmICh0dHktPmZsb3dfc3RvcHBlZCkgeworCQkJCQl0dHktPmZsb3dfc3RvcHBlZCA9IDA7CisJCQkJCXN0YXJ0X3R0eSh0dHkpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVENJT0ZGOgorCQkJCWlmIChTVE9QX0NIQVIodHR5KSAhPSBfX0RJU0FCTEVEX0NIQVIpCisJCQkJCXNlbmRfcHJpb19jaGFyKHR0eSwgU1RPUF9DSEFSKHR0eSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBUQ0lPTjoKKwkJCQlpZiAoU1RBUlRfQ0hBUih0dHkpICE9IF9fRElTQUJMRURfQ0hBUikKKwkJCQkJc2VuZF9wcmlvX2NoYXIodHR5LCBTVEFSVF9DSEFSKHR0eSkpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXJldHVybiAwOworCQljYXNlIFRDRkxTSDoKKwkJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCQkKKwkJCWxkID0gdHR5X2xkaXNjX3JlZih0dHkpOworCQkJc3dpdGNoIChhcmcpIHsKKwkJCWNhc2UgVENJRkxVU0g6CisJCQkJaWYgKGxkLT5mbHVzaF9idWZmZXIpCisJCQkJCWxkLT5mbHVzaF9idWZmZXIodHR5KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVENJT0ZMVVNIOgorCQkJCWlmIChsZC0+Zmx1c2hfYnVmZmVyKQorCQkJCQlsZC0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQljYXNlIFRDT0ZMVVNIOgorCQkJCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQkJCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgVElPQ09VVFE6CisJCQlyZXR1cm4gcHV0X3VzZXIodHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlciA/CisJCQkJCXR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIodHR5KSA6IDAsCisJCQkJCShpbnQgX191c2VyICopIGFyZyk7CisJCWNhc2UgVElPQ0lOUToKKwkJCXJldHZhbCA9IHR0eS0+cmVhZF9jbnQ7CisJCQlpZiAoTF9JQ0FOT04odHR5KSkKKwkJCQlyZXR2YWwgPSBpbnFfY2Fub24odHR5KTsKKwkJCXJldHVybiBwdXRfdXNlcihyZXR2YWwsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGFyZyk7CisJCWNhc2UgVElPQ0dMQ0tUUk1JT1M6CisJCQlpZiAoa2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKilhcmcsIHJlYWxfdHR5LT50ZXJtaW9zX2xvY2tlZCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRJT0NTTENLVFJNSU9TOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlpZiAodXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKHJlYWxfdHR5LT50ZXJtaW9zX2xvY2tlZCwgKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKSBhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUSU9DUEtUOgorCQl7CisJCQlpbnQgcGt0bW9kZTsKKworCQkJaWYgKHR0eS0+ZHJpdmVyLT50eXBlICE9IFRUWV9EUklWRVJfVFlQRV9QVFkgfHwKKwkJCSAgICB0dHktPmRyaXZlci0+c3VidHlwZSAhPSBQVFlfVFlQRV9NQVNURVIpCisJCQkJcmV0dXJuIC1FTk9UVFk7CisJCQlpZiAoZ2V0X3VzZXIocGt0bW9kZSwgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChwa3Rtb2RlKSB7CisJCQkJaWYgKCF0dHktPnBhY2tldCkgeworCQkJCQl0dHktPnBhY2tldCA9IDE7CisJCQkJCXR0eS0+bGluay0+Y3RybF9zdGF0dXMgPSAwOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXR0eS0+cGFja2V0ID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVElPQ0dTT0ZUQ0FSOgorCQkJcmV0dXJuIHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwgKGludCBfX3VzZXIgKilhcmcpOworCQljYXNlIFRJT0NTU09GVENBUjoKKwkJCWlmIChnZXRfdXNlcihhcmcsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlkb3duKCZ0dHktPnRlcm1pb3Nfc2VtKTsKKwkJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9CisJCQkJKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8CisJCQkJIChhcmcgPyBDTE9DQUwgOiAwKSk7CisJCQl1cCgmdHR5LT50ZXJtaW9zX3NlbSk7CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCX0KK30KKworRVhQT1JUX1NZTUJPTChuX3R0eV9pb2N0bCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdmNfc2NyZWVuLmMgYi9kcml2ZXJzL2NoYXIvdmNfc2NyZWVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiZTQwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci92Y19zY3JlZW4uYwpAQCAtMCwwICsxLDUwOSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvY2hhci92Y19zY3JlZW4uYworICoKKyAqIFByb3ZpZGUgYWNjZXNzIHRvIHZpcnR1YWwgY29uc29sZSBtZW1vcnkuCisgKiAvZGV2L3ZjczA6IHRoZSBzY3JlZW4gYXMgaXQgaXMgYmVpbmcgdmlld2VkIHJpZ2h0IG5vdyAocG9zc2libHkgc2Nyb2xsZWQpCisgKiAvZGV2L3Zjc046IHRoZSBzY3JlZW4gb2YgL2Rldi90dHlOICgxIDw9IE4gPD0gNjMpCisgKiAgICAgICAgICAgIFttaW5vcjogTl0KKyAqCisgKiAvZGV2L3Zjc2FOOiBpZGVtLCBidXQgaW5jbHVkaW5nIGF0dHJpYnV0ZXMsIGFuZCBwcmVmaXhlZCB3aXRoCisgKgl0aGUgNCBieXRlcyBsaW5lcyxjb2x1bW5zLHgseSAoYXMgc2NyZWVuZHVtcCB1c2VkIHRvIGdpdmUpLgorICoJQXR0cmlidXRlL2NoYXJhY3RlciBwYWlyIGlzIGluIG5hdGl2ZSBlbmRpYW5pdHkuCisgKiAgICAgICAgICAgIFttaW5vcjogTisxMjhdCisgKgorICogVGhpcyByZXBsYWNlcyBzY3JlZW5kdW1wIGFuZCBwYXJ0IG9mIHNlbGVjdGlvbiwgc28gdGhhdCB0aGUgc3lzdGVtCisgKiBhZG1pbmlzdHJhdG9yIGNhbiBjb250cm9sIGFjY2VzcyB1c2luZyBmaWxlIHN5c3RlbSBwZXJtaXNzaW9ucy4KKyAqCisgKiBhZWJAY3dpLm5sIC0gZWZ0ZXIgRnJpZWRhcyBiZWdyYXZlbHNlIC0gOTUwMjExCisgKgorICogbWFjaGVrQGszMzIuZmVsZC5jdnV0LmN6IC0gbW9kaWZpZWQgbm90IHRvIHNlbmQgY2hhcmFjdGVycyB0byB3cm9uZyBjb25zb2xlCisgKgkgLSBmaXhlZCBzb21lIGZhdGFsIG9mZi1ieS1vbmUgYnVncyAoMC0tIG5vIGxvbmdlciA9PSAtMSAtPiBsb29waW5nIGFuZCBsb29waW5nIGFuZCBsb29waW5nLi4uKQorICoJIC0gbWFraW5nIGl0IHNob3J0ZXIgLSBzY3JfcmVhZHcgYXJlIG1hY3JvcyB3aGljaCBleHBhbmQgaW4gUFJFVFRZIGxvbmcgY29kZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvc2VsZWN0aW9uLmg+CisjaW5jbHVkZSA8bGludXgva2JkX2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyN1bmRlZiBhdHRyCisjdW5kZWYgb3JnCisjdW5kZWYgYWRkcgorI2RlZmluZSBIRUFERVJfU0laRQk0CisKK3N0YXRpYyBpbnQKK3Zjc19zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IHNpemU7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlpbnQgY3VycmNvbnMgPSBtaW5vciAmIDEyNzsKKwlzdHJ1Y3QgdmNfZGF0YSAqdmM7CisKKwlpZiAoY3VycmNvbnMgPT0gMCkKKwkJY3VycmNvbnMgPSBmZ19jb25zb2xlOworCWVsc2UKKwkJY3VycmNvbnMtLTsKKwlpZiAoIXZjX2NvbnNfYWxsb2NhdGVkKGN1cnJjb25zKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwl2YyA9IHZjX2NvbnNbY3VycmNvbnNdLmQ7CisKKwlzaXplID0gdmMtPnZjX3Jvd3MgKiB2Yy0+dmNfY29sczsKKworCWlmIChtaW5vciAmIDEyOCkKKwkJc2l6ZSA9IDIqc2l6ZSArIEhFQURFUl9TSVpFOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgbG9mZl90IHZjc19sc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJaW50IHNpemU7CisKKwlkb3duKCZjb25fYnVmX3NlbSk7CisJc2l6ZSA9IHZjc19zaXplKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzd2l0Y2ggKG9yaWcpIHsKKwkJZGVmYXVsdDoKKwkJCXVwKCZjb25fYnVmX3NlbSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSAyOgorCQkJb2Zmc2V0ICs9IHNpemU7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOworCQljYXNlIDA6CisJCQlicmVhazsKKwl9CisJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gc2l6ZSkgeworCQl1cCgmY29uX2J1Zl9zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZmlsZS0+Zl9wb3MgPSBvZmZzZXQ7CisJdXAoJmNvbl9idWZfc2VtKTsKKwlyZXR1cm4gZmlsZS0+Zl9wb3M7Cit9CisKKworc3RhdGljIHNzaXplX3QKK3Zjc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJdW5zaWduZWQgaW50IGN1cnJjb25zID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgdmNfZGF0YSAqdmM7CisJbG9uZyBwb3M7CisJbG9uZyB2aWV3ZWQsIGF0dHIsIHJlYWQ7CisJaW50IGNvbCwgbWF4Y29sOworCXVuc2lnbmVkIHNob3J0ICpvcmcgPSBOVUxMOworCXNzaXplX3QgcmV0OworCisJZG93bigmY29uX2J1Zl9zZW0pOworCisJcG9zID0gKnBwb3M7CisKKwkvKiBTZWxlY3QgdGhlIHByb3BlciBjdXJyZW50IGNvbnNvbGUgYW5kIHZlcmlmeQorCSAqIHNhbml0eSBvZiB0aGUgc2l0dWF0aW9uIHVuZGVyIHRoZSBjb25zb2xlIGxvY2suCisJICovCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCisJYXR0ciA9IChjdXJyY29ucyAmIDEyOCk7CisJY3VycmNvbnMgPSAoY3VycmNvbnMgJiAxMjcpOworCWlmIChjdXJyY29ucyA9PSAwKSB7CisJCWN1cnJjb25zID0gZmdfY29uc29sZTsKKwkJdmlld2VkID0gMTsKKwl9IGVsc2UgeworCQljdXJyY29ucy0tOworCQl2aWV3ZWQgPSAwOworCX0KKwlyZXQgPSAtRU5YSU87CisJaWYgKCF2Y19jb25zX2FsbG9jYXRlZChjdXJyY29ucykpCisJCWdvdG8gdW5sb2NrX291dDsKKwl2YyA9IHZjX2NvbnNbY3VycmNvbnNdLmQ7CisKKwlyZXQgPSAtRUlOVkFMOworCWlmIChwb3MgPCAwKQorCQlnb3RvIHVubG9ja19vdXQ7CisJcmVhZCA9IDA7CisJcmV0ID0gMDsKKwl3aGlsZSAoY291bnQpIHsKKwkJY2hhciAqY29uX2J1ZjAsICpjb25fYnVmX3N0YXJ0OworCQlsb25nIHRoaXNfcm91bmQsIHNpemU7CisJCXNzaXplX3Qgb3JpZ19jb3VudDsKKwkJbG9uZyBwID0gcG9zOworCisJCS8qIENoZWNrIHdoZXRoZXIgd2UgYXJlIGFib3ZlIHNpemUgZWFjaCByb3VuZCwKKwkJICogYXMgY29weV90b191c2VyIGF0IHRoZSBlbmQgb2YgdGhpcyBsb29wCisJCSAqIGNvdWxkIHNsZWVwLgorCQkgKi8KKwkJc2l6ZSA9IHZjc19zaXplKGlub2RlKTsKKwkJaWYgKHBvcyA+PSBzaXplKQorCQkJYnJlYWs7CisJCWlmIChjb3VudCA+IHNpemUgLSBwb3MpCisJCQljb3VudCA9IHNpemUgLSBwb3M7CisKKwkJdGhpc19yb3VuZCA9IGNvdW50OworCQlpZiAodGhpc19yb3VuZCA+IENPTl9CVUZfU0laRSkKKwkJCXRoaXNfcm91bmQgPSBDT05fQlVGX1NJWkU7CisKKwkJLyogUGVyZm9ybSB0aGUgd2hvbGUgcmVhZCBpbnRvIHRoZSBsb2NhbCBjb25fYnVmLgorCQkgKiBUaGVuIHdlIGNhbiBkcm9wIHRoZSBjb25zb2xlIHNwaW5sb2NrIGFuZCBzYWZlbHkKKwkJICogYXR0ZW1wdCB0byBtb3ZlIGl0IHRvIHVzZXJzcGFjZS4KKwkJICovCisKKwkJY29uX2J1Zl9zdGFydCA9IGNvbl9idWYwID0gY29uX2J1ZjsKKwkJb3JpZ19jb3VudCA9IHRoaXNfcm91bmQ7CisJCW1heGNvbCA9IHZjLT52Y19jb2xzOworCQlpZiAoIWF0dHIpIHsKKwkJCW9yZyA9IHNjcmVlbl9wb3ModmMsIHAsIHZpZXdlZCk7CisJCQljb2wgPSBwICUgbWF4Y29sOworCQkJcCArPSBtYXhjb2wgLSBjb2w7CisJCQl3aGlsZSAodGhpc19yb3VuZC0tID4gMCkgeworCQkJCSpjb25fYnVmMCsrID0gKHZjc19zY3JfcmVhZHcodmMsIG9yZysrKSAmIDB4ZmYpOworCQkJCWlmICgrK2NvbCA9PSBtYXhjb2wpIHsKKwkJCQkJb3JnID0gc2NyZWVuX3Bvcyh2YywgcCwgdmlld2VkKTsKKwkJCQkJY29sID0gMDsKKwkJCQkJcCArPSBtYXhjb2w7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHAgPCBIRUFERVJfU0laRSkgeworCQkJCXNpemVfdCB0bXBfY291bnQ7CisKKwkJCQljb25fYnVmMFswXSA9IChjaGFyKXZjLT52Y19yb3dzOworCQkJCWNvbl9idWYwWzFdID0gKGNoYXIpdmMtPnZjX2NvbHM7CisJCQkJZ2V0Y29uc3h5KHZjLCBjb25fYnVmMCArIDIpOworCisJCQkJY29uX2J1Zl9zdGFydCArPSBwOworCQkJCXRoaXNfcm91bmQgKz0gcDsKKwkJCQlpZiAodGhpc19yb3VuZCA+IENPTl9CVUZfU0laRSkgeworCQkJCQl0aGlzX3JvdW5kID0gQ09OX0JVRl9TSVpFOworCQkJCQlvcmlnX2NvdW50ID0gdGhpc19yb3VuZCAtIHA7CisJCQkJfQorCisJCQkJdG1wX2NvdW50ID0gSEVBREVSX1NJWkU7CisJCQkJaWYgKHRtcF9jb3VudCA+IHRoaXNfcm91bmQpCisJCQkJCXRtcF9jb3VudCA9IHRoaXNfcm91bmQ7CisKKwkJCQkvKiBBZHZhbmNlIHN0YXRlIHBvaW50ZXJzIGFuZCBtb3ZlIG9uLiAqLworCQkJCXRoaXNfcm91bmQgLT0gdG1wX2NvdW50OworCQkJCXAgPSBIRUFERVJfU0laRTsKKwkJCQljb25fYnVmMCA9IGNvbl9idWYgKyBIRUFERVJfU0laRTsKKwkJCQkvKiBJZiB0aGlzX3JvdW5kID49IDAsIHRoZW4gcCBpcyBldmVuLi4uICovCisJCQl9IGVsc2UgaWYgKHAgJiAxKSB7CisJCQkJLyogU2tpcCBmaXJzdCBieXRlIGZvciBvdXRwdXQgaWYgc3RhcnQgYWRkcmVzcyBpcyBvZGQKKwkJCQkgKiBVcGRhdGUgcmVnaW9uIHNpemVzIHVwL2Rvd24gZGVwZW5kaW5nIG9uIGZyZWUKKwkJCQkgKiBzcGFjZSBpbiBidWZmZXIuCisJCQkJICovCisJCQkJY29uX2J1Zl9zdGFydCsrOworCQkJCWlmICh0aGlzX3JvdW5kIDwgQ09OX0JVRl9TSVpFKQorCQkJCQl0aGlzX3JvdW5kKys7CisJCQkJZWxzZQorCQkJCQlvcmlnX2NvdW50LS07CisJCQl9CisJCQlpZiAodGhpc19yb3VuZCA+IDApIHsKKwkJCQl1bnNpZ25lZCBzaG9ydCAqdG1wX2J1ZiA9ICh1bnNpZ25lZCBzaG9ydCAqKWNvbl9idWYwOworCisJCQkJcCAtPSBIRUFERVJfU0laRTsKKwkJCQlwIC89IDI7CisJCQkJY29sID0gcCAlIG1heGNvbDsKKworCQkJCW9yZyA9IHNjcmVlbl9wb3ModmMsIHAsIHZpZXdlZCk7CisJCQkJcCArPSBtYXhjb2wgLSBjb2w7CisKKwkJCQkvKiBCdWZmZXIgaGFzIGV2ZW4gbGVuZ3RoLCBzbyB3ZSBjYW4gYWx3YXlzIGNvcHkKKwkJCQkgKiBjaGFyYWN0ZXIgKyBhdHRyaWJ1dGUuIFdlIGRvIG5vdCBjb3B5IGxhc3QgYnl0ZQorCQkJCSAqIHRvIHVzZXJzcGFjZSBpZiB0aGlzX3JvdW5kIGlzIG9kZC4KKwkJCQkgKi8KKwkJCQl0aGlzX3JvdW5kID0gKHRoaXNfcm91bmQgKyAxKSA+PiAxOworCisJCQkJd2hpbGUgKHRoaXNfcm91bmQpIHsKKwkJCQkJKnRtcF9idWYrKyA9IHZjc19zY3JfcmVhZHcodmMsIG9yZysrKTsKKwkJCQkJdGhpc19yb3VuZCAtLTsKKwkJCQkJaWYgKCsrY29sID09IG1heGNvbCkgeworCQkJCQkJb3JnID0gc2NyZWVuX3Bvcyh2YywgcCwgdmlld2VkKTsKKwkJCQkJCWNvbCA9IDA7CisJCQkJCQlwICs9IG1heGNvbDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIEZpbmFsbHksIHJlbGVhc2UgdGhlIGNvbnNvbGUgc2VtYXBob3JlIHdoaWxlIHdlIHB1c2gKKwkJICogYWxsIHRoZSBkYXRhIHRvIHVzZXJzcGFjZSBmcm9tIG91ciB0ZW1wb3JhcnkgYnVmZmVyLgorCQkgKgorCQkgKiBBS1BNOiBFdmVuIHRob3VnaCBpdCdzIGEgc2VtYXBob3JlLCB3ZSBzaG91bGQgZHJvcCBpdCBiZWNhdXNlCisJCSAqIHRoZSBwYWdlZmF1bHQgaGFuZGxpbmcgY29kZSBtYXkgd2FudCB0byBjYWxsIHByaW50aygpLgorCQkgKi8KKworCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCXJldCA9IGNvcHlfdG9fdXNlcihidWYsIGNvbl9idWZfc3RhcnQsIG9yaWdfY291bnQpOworCQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisKKwkJaWYgKHJldCkgeworCQkJcmVhZCArPSAob3JpZ19jb3VudCAtIHJldCk7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYnVmICs9IG9yaWdfY291bnQ7CisJCXBvcyArPSBvcmlnX2NvdW50OworCQlyZWFkICs9IG9yaWdfY291bnQ7CisJCWNvdW50IC09IG9yaWdfY291bnQ7CisJfQorCSpwcG9zICs9IHJlYWQ7CisJaWYgKHJlYWQpCisJCXJldCA9IHJlYWQ7Cit1bmxvY2tfb3V0OgorCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwl1cCgmY29uX2J1Zl9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit2Y3Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwl1bnNpZ25lZCBpbnQgY3VycmNvbnMgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCB2Y19kYXRhICp2YzsKKwlsb25nIHBvczsKKwlsb25nIHZpZXdlZCwgYXR0ciwgc2l6ZSwgd3JpdHRlbjsKKwljaGFyICpjb25fYnVmMDsKKwlpbnQgY29sLCBtYXhjb2w7CisJdTE2ICpvcmcwID0gTlVMTCwgKm9yZyA9IE5VTEw7CisJc2l6ZV90IHJldDsKKworCWRvd24oJmNvbl9idWZfc2VtKTsKKworCXBvcyA9ICpwcG9zOworCisJLyogU2VsZWN0IHRoZSBwcm9wZXIgY3VycmVudCBjb25zb2xlIGFuZCB2ZXJpZnkKKwkgKiBzYW5pdHkgb2YgdGhlIHNpdHVhdGlvbiB1bmRlciB0aGUgY29uc29sZSBsb2NrLgorCSAqLworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKworCWF0dHIgPSAoY3VycmNvbnMgJiAxMjgpOworCWN1cnJjb25zID0gKGN1cnJjb25zICYgMTI3KTsKKworCWlmIChjdXJyY29ucyA9PSAwKSB7CisJCWN1cnJjb25zID0gZmdfY29uc29sZTsKKwkJdmlld2VkID0gMTsKKwl9IGVsc2UgeworCQljdXJyY29ucy0tOworCQl2aWV3ZWQgPSAwOworCX0KKwlyZXQgPSAtRU5YSU87CisJaWYgKCF2Y19jb25zX2FsbG9jYXRlZChjdXJyY29ucykpCisJCWdvdG8gdW5sb2NrX291dDsKKwl2YyA9IHZjX2NvbnNbY3VycmNvbnNdLmQ7CisKKwlzaXplID0gdmNzX3NpemUoaW5vZGUpOworCXJldCA9IC1FSU5WQUw7CisJaWYgKHBvcyA8IDAgfHwgcG9zID4gc2l6ZSkKKwkJZ290byB1bmxvY2tfb3V0OworCWlmIChjb3VudCA+IHNpemUgLSBwb3MpCisJCWNvdW50ID0gc2l6ZSAtIHBvczsKKwl3cml0dGVuID0gMDsKKwl3aGlsZSAoY291bnQpIHsKKwkJbG9uZyB0aGlzX3JvdW5kID0gY291bnQ7CisJCXNpemVfdCBvcmlnX2NvdW50OworCQlsb25nIHA7CisKKwkJaWYgKHRoaXNfcm91bmQgPiBDT05fQlVGX1NJWkUpCisJCQl0aGlzX3JvdW5kID0gQ09OX0JVRl9TSVpFOworCisJCS8qIFRlbXBvcmFyaWx5IGRyb3AgdGhlIGNvbnNvbGUgbG9jayBzbyB0aGF0IHdlIGNhbiByZWFkCisJCSAqIGluIHRoZSB3cml0ZSBkYXRhIGZyb20gdXNlcnNwYWNlIHNhZmVseS4KKwkJICovCisJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwkJcmV0ID0gY29weV9mcm9tX3VzZXIoY29uX2J1ZiwgYnVmLCB0aGlzX3JvdW5kKTsKKwkJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCisJCWlmIChyZXQpIHsKKwkJCXRoaXNfcm91bmQgLT0gcmV0OworCQkJaWYgKCF0aGlzX3JvdW5kKSB7CisJCQkJLyogQWJvcnQgbG9vcCBpZiBubyBkYXRhIHdlcmUgY29waWVkLiBPdGhlcndpc2UKKwkJCQkgKiBmYWlsIHdpdGggLUVGQVVMVC4KKwkJCQkgKi8KKwkJCQlpZiAod3JpdHRlbikKKwkJCQkJYnJlYWs7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIHVubG9ja19vdXQ7CisJCQl9CisJCX0KKworCQkvKiBUaGUgdmNzX3NpemUgbWlnaHQgaGF2ZSBjaGFuZ2VkIHdoaWxlIHdlIHNsZXB0IHRvIGdyYWIKKwkJICogdGhlIHVzZXIgYnVmZmVyLCBzbyByZWNoZWNrLgorCQkgKiBSZXR1cm4gZGF0YSB3cml0dGVuIHVwIHRvIG5vdyBvbiBmYWlsdXJlLgorCQkgKi8KKwkJc2l6ZSA9IHZjc19zaXplKGlub2RlKTsKKwkJaWYgKHBvcyA+PSBzaXplKQorCQkJYnJlYWs7CisJCWlmICh0aGlzX3JvdW5kID4gc2l6ZSAtIHBvcykKKwkJCXRoaXNfcm91bmQgPSBzaXplIC0gcG9zOworCisJCS8qIE9LLCBub3cgYWN0dWFsbHkgcHVzaCB0aGUgd3JpdGUgdG8gdGhlIGNvbnNvbGUKKwkJICogdW5kZXIgdGhlIGxvY2sgdXNpbmcgdGhlIGxvY2FsIGtlcm5lbCBidWZmZXIuCisJCSAqLworCisJCWNvbl9idWYwID0gY29uX2J1ZjsKKwkJb3JpZ19jb3VudCA9IHRoaXNfcm91bmQ7CisJCW1heGNvbCA9IHZjLT52Y19jb2xzOworCQlwID0gcG9zOworCQlpZiAoIWF0dHIpIHsKKwkJCW9yZzAgPSBvcmcgPSBzY3JlZW5fcG9zKHZjLCBwLCB2aWV3ZWQpOworCQkJY29sID0gcCAlIG1heGNvbDsKKwkJCXAgKz0gbWF4Y29sIC0gY29sOworCisJCQl3aGlsZSAodGhpc19yb3VuZCA+IDApIHsKKwkJCQl1bnNpZ25lZCBjaGFyIGMgPSAqY29uX2J1ZjArKzsKKworCQkJCXRoaXNfcm91bmQtLTsKKwkJCQl2Y3Nfc2NyX3dyaXRldyh2YywKKwkJCQkJICAgICAgICh2Y3Nfc2NyX3JlYWR3KHZjLCBvcmcpICYgMHhmZjAwKSB8IGMsIG9yZyk7CisJCQkJb3JnKys7CisJCQkJaWYgKCsrY29sID09IG1heGNvbCkgeworCQkJCQlvcmcgPSBzY3JlZW5fcG9zKHZjLCBwLCB2aWV3ZWQpOworCQkJCQljb2wgPSAwOworCQkJCQlwICs9IG1heGNvbDsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocCA8IEhFQURFUl9TSVpFKSB7CisJCQkJY2hhciBoZWFkZXJbSEVBREVSX1NJWkVdOworCisJCQkJZ2V0Y29uc3h5KHZjLCBoZWFkZXIgKyAyKTsKKwkJCQl3aGlsZSAocCA8IEhFQURFUl9TSVpFICYmIHRoaXNfcm91bmQgPiAwKSB7CisJCQkJCXRoaXNfcm91bmQtLTsKKwkJCQkJaGVhZGVyW3ArK10gPSAqY29uX2J1ZjArKzsKKwkJCQl9CisJCQkJaWYgKCF2aWV3ZWQpCisJCQkJCXB1dGNvbnN4eSh2YywgaGVhZGVyICsgMik7CisJCQl9CisJCQlwIC09IEhFQURFUl9TSVpFOworCQkJY29sID0gKHAvMikgJSBtYXhjb2w7CisJCQlpZiAodGhpc19yb3VuZCA+IDApIHsKKwkJCQlvcmcwID0gb3JnID0gc2NyZWVuX3Bvcyh2YywgcC8yLCB2aWV3ZWQpOworCQkJCWlmICgocCAmIDEpICYmIHRoaXNfcm91bmQgPiAwKSB7CisJCQkJCWNoYXIgYzsKKworCQkJCQl0aGlzX3JvdW5kLS07CisJCQkJCWMgPSAqY29uX2J1ZjArKzsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJCQkJdmNzX3Njcl93cml0ZXcodmMsIGMgfAorCQkJCQkgICAgICh2Y3Nfc2NyX3JlYWR3KHZjLCBvcmcpICYgMHhmZjAwKSwgb3JnKTsKKyNlbHNlCisJCQkJCXZjc19zY3Jfd3JpdGV3KHZjLCAoYyA8PCA4KSB8CisJCQkJCSAgICAgKHZjc19zY3JfcmVhZHcodmMsIG9yZykgJiAweGZmKSwgb3JnKTsKKyNlbmRpZgorCQkJCQlvcmcrKzsKKwkJCQkJcCsrOworCQkJCQlpZiAoKytjb2wgPT0gbWF4Y29sKSB7CisJCQkJCQlvcmcgPSBzY3JlZW5fcG9zKHZjLCBwLzIsIHZpZXdlZCk7CisJCQkJCQljb2wgPSAwOworCQkJCQl9CisJCQkJfQorCQkJCXAgLz0gMjsKKwkJCQlwICs9IG1heGNvbCAtIGNvbDsKKwkJCX0KKwkJCXdoaWxlICh0aGlzX3JvdW5kID4gMSkgeworCQkJCXVuc2lnbmVkIHNob3J0IHc7CisKKwkJCQl3ID0gZ2V0X3VuYWxpZ25lZCgoKGNvbnN0IHVuc2lnbmVkIHNob3J0ICopY29uX2J1ZjApKTsKKwkJCQl2Y3Nfc2NyX3dyaXRldyh2Yywgdywgb3JnKyspOworCQkJCWNvbl9idWYwICs9IDI7CisJCQkJdGhpc19yb3VuZCAtPSAyOworCQkJCWlmICgrK2NvbCA9PSBtYXhjb2wpIHsKKwkJCQkJb3JnID0gc2NyZWVuX3Bvcyh2YywgcCwgdmlld2VkKTsKKwkJCQkJY29sID0gMDsKKwkJCQkJcCArPSBtYXhjb2w7CisJCQkJfQorCQkJfQorCQkJaWYgKHRoaXNfcm91bmQgPiAwKSB7CisJCQkJdW5zaWduZWQgY2hhciBjOworCisJCQkJYyA9ICpjb25fYnVmMCsrOworI2lmZGVmIF9fQklHX0VORElBTgorCQkJCXZjc19zY3Jfd3JpdGV3KHZjLCAodmNzX3Njcl9yZWFkdyh2Yywgb3JnKSAmIDB4ZmYpIHwgKGMgPDwgOCksIG9yZyk7CisjZWxzZQorCQkJCXZjc19zY3Jfd3JpdGV3KHZjLCAodmNzX3Njcl9yZWFkdyh2Yywgb3JnKSAmIDB4ZmYwMCkgfCBjLCBvcmcpOworI2VuZGlmCisJCQl9CisJCX0KKwkJY291bnQgLT0gb3JpZ19jb3VudDsKKwkJd3JpdHRlbiArPSBvcmlnX2NvdW50OworCQlidWYgKz0gb3JpZ19jb3VudDsKKwkJcG9zICs9IG9yaWdfY291bnQ7CisJCWlmIChvcmcwKQorCQkJdXBkYXRlX3JlZ2lvbih2YywgKHVuc2lnbmVkIGxvbmcpKG9yZzApLCBvcmcgLSBvcmcwKTsKKwl9CisJKnBwb3MgKz0gd3JpdHRlbjsKKwlyZXQgPSB3cml0dGVuOworCit1bmxvY2tfb3V0OgorCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKworCXVwKCZjb25fYnVmX3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Cit2Y3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwl1bnNpZ25lZCBpbnQgY3VycmNvbnMgPSBpbWlub3IoaW5vZGUpICYgMTI3OworCWlmKGN1cnJjb25zICYmICF2Y19jb25zX2FsbG9jYXRlZChjdXJyY29ucy0xKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmNzX2ZvcHMgPSB7CisJLmxsc2VlawkJPSB2Y3NfbHNlZWssCisJLnJlYWQJCT0gdmNzX3JlYWQsCisJLndyaXRlCQk9IHZjc193cml0ZSwKKwkub3BlbgkJPSB2Y3Nfb3BlbiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICp2Y19jbGFzczsKKwordm9pZCB2Y3NfbWFrZV9kZXZmcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWRldmZzX21rX2NkZXYoTUtERVYoVkNTX01BSk9SLCB0dHktPmluZGV4ICsgMSksCisJCQlTX0lGQ0hSfFNfSVJVU1J8U19JV1VTUiwKKwkJCSJ2Y2MvJXUiLCB0dHktPmluZGV4ICsgMSk7CisJZGV2ZnNfbWtfY2RldihNS0RFVihWQ1NfTUFKT1IsIHR0eS0+aW5kZXggKyAxMjkpLAorCQkJU19JRkNIUnxTX0lSVVNSfFNfSVdVU1IsCisJCQkidmNjL2EldSIsIHR0eS0+aW5kZXggKyAxKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh2Y19jbGFzcywgTUtERVYoVkNTX01BSk9SLCB0dHktPmluZGV4ICsgMSksIE5VTEwsICJ2Y3MldSIsIHR0eS0+aW5kZXggKyAxKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh2Y19jbGFzcywgTUtERVYoVkNTX01BSk9SLCB0dHktPmluZGV4ICsgMTI5KSwgTlVMTCwgInZjc2EldSIsIHR0eS0+aW5kZXggKyAxKTsKK30KK3ZvaWQgdmNzX3JlbW92ZV9kZXZmcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWRldmZzX3JlbW92ZSgidmNjLyV1IiwgdHR5LT5pbmRleCArIDEpOworCWRldmZzX3JlbW92ZSgidmNjL2EldSIsIHR0eS0+aW5kZXggKyAxKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihWQ1NfTUFKT1IsIHR0eS0+aW5kZXggKyAxKSk7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoVkNTX01BSk9SLCB0dHktPmluZGV4ICsgMTI5KSk7Cit9CisKK2ludCBfX2luaXQgdmNzX2luaXQodm9pZCkKK3sKKwlpZiAocmVnaXN0ZXJfY2hyZGV2KFZDU19NQUpPUiwgInZjcyIsICZ2Y3NfZm9wcykpCisJCXBhbmljKCJ1bmFibGUgdG8gZ2V0IG1ham9yICVkIGZvciB2Y3MgZGV2aWNlIiwgVkNTX01BSk9SKTsKKwl2Y19jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJ2YyIpOworCisJZGV2ZnNfbWtfY2RldihNS0RFVihWQ1NfTUFKT1IsIDApLCBTX0lGQ0hSfFNfSVJVU1J8U19JV1VTUiwgInZjYy8wIik7CisJZGV2ZnNfbWtfY2RldihNS0RFVihWQ1NfTUFKT1IsIDEyOCksIFNfSUZDSFJ8U19JUlVTUnxTX0lXVVNSLCAidmNjL2EwIik7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQodmNfY2xhc3MsIE1LREVWKFZDU19NQUpPUiwgMCksIE5VTEwsICJ2Y3MiKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh2Y19jbGFzcywgTUtERVYoVkNTX01BSk9SLCAxMjgpLCBOVUxMLCAidmNzYSIpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Zpb2NvbnMuYyBiL2RyaXZlcnMvY2hhci92aW9jb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmNWZiNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci92aW9jb25zLmMKQEAgLTAsMCArMSwxMTk1IEBACisvKiAtKi0gbGludXgtYyAtKi0KKyAqCisgKiAgZHJpdmVycy9jaGFyL3Zpb2NvbnMuYworICoKKyAqICBpU2VyaWVzIFZpcnR1YWwgVGVybWluYWwKKyAqCisgKiAgQXV0aG9yczogRGF2ZSBCb3V0Y2hlciA8Ym91dGNoZXJAdXMuaWJtLmNvbT4KKyAqICAgICAgICAgICBSeWFuIEFybm9sZCA8cnlhbmFybkB1cy5pYm0uY29tPgorICogICAgICAgICAgIENvbGluIERldmlsYmlzcyA8ZGV2aWxiaXNAdXMuaWJtLmNvbT4KKyAqICAgICAgICAgICBTdGVwaGVuIFJvdGh3ZWxsIDxzZnJAYXUxLmlibS5jb20+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueXUgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorI2luY2x1ZGUgPGxpbnV4L2tkLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgorCisjaW5jbHVkZSA8YXNtL2lTZXJpZXMvdmlvLmg+CisKKyNpbmNsdWRlIDxhc20vaVNlcmllcy9IdkxwRXZlbnQuaD4KKyNpbmNsdWRlIDxhc20vaVNlcmllcy9IdkNhbGxFdmVudC5oPgorI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0h2THBDb25maWcuaD4KKyNpbmNsdWRlIDxhc20vaVNlcmllcy9IdkNhbGwuaD4KKworI2lmZGVmIENPTkZJR19WVAorI2Vycm9yIFlvdSBtdXN0IHR1cm4gb2ZmIENPTkZJR19WVCB0byB1c2UgQ09ORklHX1ZJT0NPTlMKKyNlbmRpZgorCisjZGVmaW5lIFZJT1RUWV9NQUdJQyAoMHgwRENCKQorI2RlZmluZSBWVFRZX1BPUlRTIDEwCisKKyNkZWZpbmUgVklPQ09OU19LRVJOX1dBUk4JS0VSTl9XQVJOSU5HICJ2aW9jb25zOiAiCisjZGVmaW5lIFZJT0NPTlNfS0VSTl9JTkZPCUtFUk5fSU5GTyAidmlvY29uczogIgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNvbnNvbGVsb2NrKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY29uc29sZWxvZ2xvY2spOworCisjaWZkZWYgQ09ORklHX01BR0lDX1NZU1JRCitzdGF0aWMgaW50IHZpb19zeXNycV9wcmVzc2VkOworZXh0ZXJuIGludCBzeXNycV9lbmFibGVkOworI2VuZGlmCisKKy8qCisgKiBUaGUgc3RydWN0dXJlIG9mIHRoZSBldmVudHMgdGhhdCBmbG93IGJldHdlZW4gdXMgYW5kIE9TLzQwMC4gIFlvdSBjYW4ndAorICogbWVzcyB3aXRoIHRoaXMgdW5sZXNzIHRoZSBPUy80MDAgc2lkZSBjaGFuZ2VzIHRvbworICovCitzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQgeworCXN0cnVjdCBIdkxwRXZlbnQgZXZlbnQ7CisJdTMyIHJlc2VydmVkOworCXUxNiB2ZXJzaW9uOworCXUxNiBzdWJ0eXBlX3Jlc3VsdF9jb2RlOworCXU4IHZpcnR1YWxfZGV2aWNlOworCXU4IGxlbjsKKwl1OCBkYXRhW1ZJT0NIQVJfTUFYX0RBVEFdOworfTsKKworI2RlZmluZSBWSU9DSEFSX1dJTkRPVwkJMTAKKyNkZWZpbmUgVklPQ0hBUl9ISUdIV0FURVJNQVJLCTMKKworZW51bSB2aW9jaGFyc3VidHlwZSB7CisJdmlvY2hhcm9wZW4gPSAweDAwMDEsCisJdmlvY2hhcmNsb3NlID0gMHgwMDAyLAorCXZpb2NoYXJkYXRhID0gMHgwMDAzLAorCXZpb2NoYXJhY2sgPSAweDAwMDQsCisJdmlvY2hhcmNvbmZpZyA9IDB4MDAwNQorfTsKKworZW51bSB2aW9jaGFyX3JjIHsKKwl2aW9jaGFyX3JjX2VidXN5ID0gMQorfTsKKworI2RlZmluZSBWSU9DSEFSX05VTV9CVUYJCTE2CisKKy8qCisgKiBPdXIgcG9ydCBpbmZvcm1hdGlvbi4gIFdlIHN0b3JlIGEgcG9pbnRlciB0byBvbmUgZW50cnkgaW4gdGhlCisgKiB0dHlfZHJpdmVyX2RhdGEKKyAqLworc3RhdGljIHN0cnVjdCBwb3J0X2luZm8geworCWludCBtYWdpYzsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCUh2THBJbmRleCBscDsKKwl1OCB2Y29uczsKKwl1NjQgc2VxOwkvKiBzZXF1ZW5jZSBudW1iZXIgb2YgbGFzdCBIViBzZW5kICovCisJdTY0IGFjazsJLyogbGFzdCBhY2sgZnJvbSBIViAqLworLyoKKyAqIFdoZW4gd2UgZ2V0IHdyaXRlcyBmYXN0ZXIgdGhhbiB3ZSBjYW4gc2VuZCBpdCB0byB0aGUgcGFydGl0aW9uLAorICogYnVmZmVyIHRoZSBkYXRhIGhlcmUuIE5vdGUgdGhhdCB1c2VkIGlzIGEgYml0IG1hcCBvZiB1c2VkIGJ1ZmZlcnMuCisgKiBJdCBoYWQgYmV0dGVyIGhhdmUgZW5vdWdoIGJpdHMgdG8gaG9sZCBWSU9DSEFSX05VTV9CVUYgdGhlIGJpdG9wcyBhc3N1bWUKKyAqIGl0IGlzIGEgbXVsdGlwbGUgb2YgdW5zaWduZWQgbG9uZworICovCisJdW5zaWduZWQgbG9uZyB1c2VkOworCXU4ICpidWZmZXJbVklPQ0hBUl9OVU1fQlVGXTsKKwlpbnQgYnVmZmVyQnl0ZXNbVklPQ0hBUl9OVU1fQlVGXTsKKwlpbnQgY3VyYnVmOworCWludCBidWZmZXJPdmVyZmxvdzsKKwlpbnQgb3ZlcmZsb3dNZXNzYWdlOworfSBwb3J0X2luZm9bVlRUWV9QT1JUU107CisKKyNkZWZpbmUgdmlvY2hhcl9pc19jb25zb2xlKHBpKQkoKHBpKSA9PSAmcG9ydF9pbmZvWzBdKQorI2RlZmluZSB2aW9jaGFyX3BvcnQocGkpCSgocGkpIC0gJnBvcnRfaW5mb1swXSkKKworc3RhdGljIHZvaWQgaW5pdERhdGFFdmVudChzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQgKnZpb2NoYXIsIEh2THBJbmRleCBscCk7CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqdmlvdHR5X2RyaXZlcjsKKwordm9pZCBodmxvZyhjaGFyICpmbXQsIC4uLikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZhX2xpc3QgYXJnczsKKwlzdGF0aWMgY2hhciBidWZbMjU2XTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zb2xlbG9nbG9jaywgZmxhZ3MpOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJaSA9IHZzY25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDEsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCWJ1ZltpKytdID0gJ1xyJzsKKwlIdkNhbGxfd3JpdGVMb2dCdWZmZXIoYnVmLCBpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9nbG9jaywgZmxhZ3MpOworfQorCit2b2lkIGh2bG9nT3V0cHV0KGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGJlZ2luOworCWludCBpbmRleDsKKwlzdGF0aWMgY29uc3QgY2hhciBjciA9ICdccic7CisKKwliZWdpbiA9IDA7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNvbGVsb2dsb2NrLCBmbGFncyk7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKKwkJaWYgKGJ1ZltpbmRleF0gPT0gJ1xuJykgeworCQkJLyoKKwkJCSAqIFN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSBsYXN0ICdcbicgb3IgYXQgdGhlIHplcm90aAorCQkJICogYXJyYXkgcG9zaXRpb24gYW5kIG91dHB1dCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKwkJCSAqIGluY2x1ZGluZyB0aGUgbmV3bGluZS4KKwkJCSAqLworCQkJSHZDYWxsX3dyaXRlTG9nQnVmZmVyKCZidWZbYmVnaW5dLCBpbmRleCAtIGJlZ2luICsgMSk7CisJCQliZWdpbiA9IGluZGV4ICsgMTsKKwkJCUh2Q2FsbF93cml0ZUxvZ0J1ZmZlcigmY3IsIDEpOworCQl9CisJfQorCWlmICgoaW5kZXggLSBiZWdpbikgPiAwKQorCQlIdkNhbGxfd3JpdGVMb2dCdWZmZXIoJmJ1ZltiZWdpbl0sIGluZGV4IC0gYmVnaW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2dsb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBNYWtlIHN1cmUgd2UncmUgcG9pbnRpbmcgdG8gYSB2YWxpZCBwb3J0X2luZm8gc3RydWN0dXJlLiAgU2hhbWVsZXNzbHkKKyAqIHBsYWdlcml6ZWQgZnJvbSBzZXJpYWwuYworICovCitzdGF0aWMgaW5saW5lIGludCB2aW90dHlfcGFyYW5vaWFfY2hlY2soc3RydWN0IHBvcnRfaW5mbyAqcGksCisJCQkJCWNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmJhZF9waV9hZGRyID0gVklPQ09OU19LRVJOX1dBUk4KKwkJIndhcm5pbmc6IGJhZCBhZGRyZXNzIGZvciBwb3J0X2luZm8gc3RydWN0ICglcykgaW4gJXNcbiI7CisJc3RhdGljIGNvbnN0IGNoYXIgKmJhZG1hZ2ljID0gVklPQ09OU19LRVJOX1dBUk4KKwkJIndhcm5pbmc6IGJhZCBtYWdpYyBudW1iZXIgZm9yIHBvcnRfaW5mbyBzdHJ1Y3QgKCVzKSBpbiAlc1xuIjsKKworCWlmICgocGkgPCAmcG9ydF9pbmZvWzBdKSB8fCAodmlvY2hhcl9wb3J0KHBpKSA+IFZUVFlfUE9SVFMpKSB7CisJCXByaW50ayhiYWRfcGlfYWRkciwgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAocGktPm1hZ2ljICE9IFZJT1RUWV9NQUdJQykgeworCQlwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBZGQgZGF0YSB0byBvdXIgcGVuZGluZy1zZW5kIGJ1ZmZlcnMuICAKKyAqCisgKiBOT1RFOiBEb24ndCB1c2UgcHJpbnRrIGluIGhlcmUgYmVjYXVzZSBpdCBnZXRzIG5hc3RpbHkgcmVjdXJzaXZlLgorICogaHZsb2cgY2FuIGJlIHVzZWQgdG8gbG9nIHRvIHRoZSBoeXBlcnZpc29yIGJ1ZmZlcgorICovCitzdGF0aWMgaW50IGJ1ZmZlcl9hZGQoc3RydWN0IHBvcnRfaW5mbyAqcGksIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgYmxlZnQ7CisJc2l6ZV90IGN1cmxlbjsKKwljb25zdCBjaGFyICpjdXJidWY7CisJaW50IG5leHRidWY7CisKKwljdXJidWYgPSBidWY7CisJYmxlZnQgPSBsZW47CisJd2hpbGUgKGJsZWZ0ID4gMCkgeworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBubyBzcGFjZSBsZWZ0IGluIHRoZSBjdXJyZW50IGJ1ZmZlciwgd2UgaGF2ZQorCQkgKiBmaWxsZWQgZXZlcnl0aGluZyB1cCwgc28gcmV0dXJuLiAgSWYgd2UgZmlsbGVkIHRoZSBwcmV2aW91cworCQkgKiBidWZmZXIgd2Ugd291bGQgYWxyZWFkeSBoYXZlIG1vdmVkIHRvIHRoZSBuZXh0IG9uZS4KKwkJICovCisJCWlmIChwaS0+YnVmZmVyQnl0ZXNbcGktPmN1cmJ1Zl0gPT0gVklPQ0hBUl9NQVhfREFUQSkgeworCQkJaHZsb2cgKCJcblxydmlvY29uczogTm8gb3ZlcmZsb3cgYnVmZmVyIGF2YWlsYWJsZSBmb3IgbWVtY3B5KCkuXG4iKTsKKwkJCXBpLT5idWZmZXJPdmVyZmxvdysrOworCQkJcGktPm92ZXJmbG93TWVzc2FnZSA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFR1cm4gb24gdGhlICJ1c2VkIiBiaXQgZm9yIHRoaXMgYnVmZmVyLiAgSWYgaXQncyBhbHJlYWR5IG9uLAorCQkgKiB0aGF0J3MgZmluZS4KKwkJICovCisJCXNldF9iaXQocGktPmN1cmJ1ZiwgJnBpLT51c2VkKTsKKworCQkvKgorCQkgKiBTZWUgaWYgdGhpcyBidWZmZXIgaGFzIGJlZW4gYWxsb2NhdGVkLiAgSWYgbm90LCBhbGxvY2F0ZSBpdC4KKwkJICovCisJCWlmIChwaS0+YnVmZmVyW3BpLT5jdXJidWZdID09IE5VTEwpIHsKKwkJCXBpLT5idWZmZXJbcGktPmN1cmJ1Zl0gPQorCQkJICAgIGttYWxsb2MoVklPQ0hBUl9NQVhfREFUQSwgR0ZQX0FUT01JQyk7CisJCQlpZiAocGktPmJ1ZmZlcltwaS0+Y3VyYnVmXSA9PSBOVUxMKSB7CisJCQkJaHZsb2coIlxuXHJ2aW9jb25zOiBrbWFsbG9jIGZhaWxlZCBhbGxvY2F0aW5nIHNwYWNlcyBmb3IgYnVmZmVyICVkLiIsCisJCQkJCXBpLT5jdXJidWYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogRmlndXJlIG91dCBob3cgbXVjaCB3ZSBjYW4gY29weSBpbnRvIHRoaXMgYnVmZmVyLiAqLworCQlpZiAoYmxlZnQgPCAoVklPQ0hBUl9NQVhfREFUQSAtIHBpLT5idWZmZXJCeXRlc1twaS0+Y3VyYnVmXSkpCisJCQljdXJsZW4gPSBibGVmdDsKKwkJZWxzZQorCQkJY3VybGVuID0gVklPQ0hBUl9NQVhfREFUQSAtIHBpLT5idWZmZXJCeXRlc1twaS0+Y3VyYnVmXTsKKworCQkvKiBDb3B5IHRoZSBkYXRhIGludG8gdGhlIGJ1ZmZlci4gKi8KKwkJbWVtY3B5KHBpLT5idWZmZXJbcGktPmN1cmJ1Zl0gKyBwaS0+YnVmZmVyQnl0ZXNbcGktPmN1cmJ1Zl0sCisJCQkJY3VyYnVmLCBjdXJsZW4pOworCisJCXBpLT5idWZmZXJCeXRlc1twaS0+Y3VyYnVmXSArPSBjdXJsZW47CisJCWN1cmJ1ZiArPSBjdXJsZW47CisJCWJsZWZ0IC09IGN1cmxlbjsKKworCQkvKgorCQkgKiBOb3cgc2VlIGlmIHdlJ3ZlIGZpbGxlZCB0aGlzIGJ1ZmZlci4gIElmIG5vdCB0aGVuCisJCSAqIHdlJ2xsIHRyeSB0byB1c2UgaXQgYWdhaW4gbGF0ZXIuICBJZiB3ZSd2ZSBmaWxsZWQgaXQKKwkJICogdXAgdGhlbiB3ZSdsbCBhZHZhbmNlIHRoZSBjdXJidWYgdG8gdGhlIG5leHQgaW4gdGhlCisJCSAqIGNpcmN1bGFyIHF1ZXVlLgorCQkgKi8KKwkJaWYgKHBpLT5idWZmZXJCeXRlc1twaS0+Y3VyYnVmXSA9PSBWSU9DSEFSX01BWF9EQVRBKSB7CisJCQluZXh0YnVmID0gKHBpLT5jdXJidWYgKyAxKSAlIFZJT0NIQVJfTlVNX0JVRjsKKwkJCS8qCisJCQkgKiBNb3ZlIHRvIHRoZSBuZXh0IGJ1ZmZlciBpZiBpdCBoYXNuJ3QgYmVlbiB1c2VkIHlldAorCQkJICovCisJCQlpZiAodGVzdF9iaXQobmV4dGJ1ZiwgJnBpLT51c2VkKSA9PSAwKQorCQkJCXBpLT5jdXJidWYgPSBuZXh0YnVmOworCQl9CisJfQorCXJldHVybiBsZW4gLSBibGVmdDsKK30KKworLyoKKyAqIFNlbmQgcGVuZGluZyBkYXRhCisgKgorICogTk9URTogRG9uJ3QgdXNlIHByaW50ayBpbiBoZXJlIGJlY2F1c2UgaXQgZ2V0cyBuYXN0aWx5IHJlY3Vyc2l2ZS4KKyAqIGh2bG9nIGNhbiBiZSB1c2VkIHRvIGxvZyB0byB0aGUgaHlwZXJ2aXNvciBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgc2VuZF9idWZmZXJzKHN0cnVjdCBwb3J0X2luZm8gKnBpKQoreworCUh2THBFdmVudF9SYyBodnJjOworCWludCBuZXh0YnVmOworCXN0cnVjdCB2aW9jaGFybHBldmVudCAqdmlvY2hhcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisKKwl2aW9jaGFyID0gKHN0cnVjdCB2aW9jaGFybHBldmVudCAqKQorCSAgICB2aW9fZ2V0X2V2ZW50X2J1ZmZlcih2aW9tYWpvcnN1YnR5cGVfY2hhcmlvKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBnb3QgYSBidWZmZXIgKi8KKwlpZiAodmlvY2hhciA9PSBOVUxMKSB7CisJCWh2bG9nKCJcblxydmlvY29uczogQ2FuJ3QgZ2V0IHZpb2NoYXIgYnVmZmVyIGluIHNlbmRCdWZmZXJzKCkuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocGktPnVzZWQgPT0gMCkgeworCQlodmxvZygiXG5ccnZpb2NvbnM6IGluIHNlbmRidWZmZXJzKCksIGJ1dCBubyBidWZmZXJzIHVzZWQuXG4iKTsKKwkJdmlvX2ZyZWVfZXZlbnRfYnVmZmVyKHZpb21ham9yc3VidHlwZV9jaGFyaW8sIHZpb2NoYXIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBjdXJidWYgcG9pbnRzIHRvIHRoZSBidWZmZXIgd2UncmUgZmlsbGluZy4gIFdlIHdhbnQgdG8KKwkgKiBzdGFydCBzZW5kaW5nIEFGVEVSIHRoaXMgb25lLiAgCisJICovCisJbmV4dGJ1ZiA9IChwaS0+Y3VyYnVmICsgMSkgJSBWSU9DSEFSX05VTV9CVUY7CisKKwkvKgorCSAqIExvb3AgdW50aWwgd2UgZmluZCBhIGJ1ZmZlciB3aXRoIHRoZSB1c2VkIGJpdCBvbgorCSAqLworCXdoaWxlICh0ZXN0X2JpdChuZXh0YnVmLCAmcGktPnVzZWQpID09IDApCisJCW5leHRidWYgPSAobmV4dGJ1ZiArIDEpICUgVklPQ0hBUl9OVU1fQlVGOworCisJaW5pdERhdGFFdmVudCh2aW9jaGFyLCBwaS0+bHApOworCisJLyoKKwkgKiBXaGlsZSB3ZSBoYXZlIGJ1ZmZlcnMgd2l0aCBkYXRhLCBhbmQgb3VyIHNlbmQgd2luZG93CisJICogaXMgb3Blbiwgc2VuZCB0aGVtCisJICovCisJd2hpbGUgKCh0ZXN0X2JpdChuZXh0YnVmLCAmcGktPnVzZWQpKSAmJgorCSAgICAgICAoKHBpLT5zZXEgLSBwaS0+YWNrKSA8IFZJT0NIQVJfV0lORE9XKSkgeworCQl2aW9jaGFyLT5sZW4gPSBwaS0+YnVmZmVyQnl0ZXNbbmV4dGJ1Zl07CisJCXZpb2NoYXItPmV2ZW50LnhDb3JyZWxhdGlvblRva2VuID0gcGktPnNlcSsrOworCQl2aW9jaGFyLT5ldmVudC54U2l6ZU1pbnVzMSA9CisJCQlvZmZzZXRvZihzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQsIGRhdGEpICsgdmlvY2hhci0+bGVuOworCisJCW1lbWNweSh2aW9jaGFyLT5kYXRhLCBwaS0+YnVmZmVyW25leHRidWZdLCB2aW9jaGFyLT5sZW4pOworCisJCWh2cmMgPSBIdkNhbGxFdmVudF9zaWduYWxMcEV2ZW50KCZ2aW9jaGFyLT5ldmVudCk7CisJCWlmIChodnJjKSB7CisJCQkvKgorCQkJICogTVVTVCB1bmxvY2sgdGhlIHNwaW5sb2NrIGJlZm9yZSBkb2luZyBhIHByaW50aworCQkJICovCisJCQl2aW9fZnJlZV9ldmVudF9idWZmZXIodmlvbWFqb3JzdWJ0eXBlX2NoYXJpbywgdmlvY2hhcik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCisJCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4KKwkJCSAgICAgICAiZXJyb3Igc2VuZGluZyBldmVudCEgcmV0dXJuIGNvZGUgJWRcbiIsCisJCQkgICAgICAgKGludClodnJjKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqIGNsZWFyIHRoZSB1c2VkIGJpdCwgemVybyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluCisJCSAqIHRoaXMgYnVmZmVyLCBhbmQgbW92ZSB0byB0aGUgbmV4dCBidWZmZXIKKwkJICovCisJCWNsZWFyX2JpdChuZXh0YnVmLCAmcGktPnVzZWQpOworCQlwaS0+YnVmZmVyQnl0ZXNbbmV4dGJ1Zl0gPSAwOworCQluZXh0YnVmID0gKG5leHRidWYgKyAxKSAlIFZJT0NIQVJfTlVNX0JVRjsKKwl9CisKKwkvKgorCSAqIElmIHdlIGhhdmUgZW1wdGllZCBhbGwgdGhlIGJ1ZmZlcnMsIHN0YXJ0IGF0IDAgYWdhaW4uCisJICogdGhpcyB3aWxsIHJlLXVzZSBhbnkgYWxsb2NhdGVkIGJ1ZmZlcnMKKwkgKi8KKwlpZiAocGktPnVzZWQgPT0gMCkgeworCQlwaS0+Y3VyYnVmID0gMDsKKworCQlpZiAocGktPm92ZXJmbG93TWVzc2FnZSkKKwkJCXBpLT5vdmVyZmxvd01lc3NhZ2UgPSAwOworCisJCWlmIChwaS0+dHR5KSB7CisJCQl0dHlfd2FrZXVwKHBpLT50dHkpOworCQl9CisJfQorCisJdmlvX2ZyZWVfZXZlbnRfYnVmZmVyKHZpb21ham9yc3VidHlwZV9jaGFyaW8sIHZpb2NoYXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBPdXIgaW50ZXJuYWwgd3JpdGVyLiAgR2V0cyBjYWxsZWQgYm90aCBmcm9tIHRoZSBjb25zb2xlIGRldmljZSBhbmQKKyAqIHRoZSB0dHkgZGV2aWNlLiAgdGhlIHR0eSBwb2ludGVyIHdpbGwgYmUgTlVMTCBpZiBjYWxsZWQgZnJvbSB0aGUgY29uc29sZS4KKyAqIFJldHVybiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgIndyaXR0ZW4iLgorICoKKyAqIE5PVEU6IERvbid0IHVzZSBwcmludGsgaW4gaGVyZSBiZWNhdXNlIGl0IGdldHMgbmFzdGlseSByZWN1cnNpdmUuICBodmxvZworICogY2FuIGJlIHVzZWQgdG8gbG9nIHRvIHRoZSBoeXBlcnZpc29yIGJ1ZmZlcgorICovCitzdGF0aWMgaW50IGludGVybmFsX3dyaXRlKHN0cnVjdCBwb3J0X2luZm8gKnBpLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJSHZMcEV2ZW50X1JjIGh2cmM7CisJc2l6ZV90IGJsZWZ0OworCXNpemVfdCBjdXJsZW47CisJY29uc3QgY2hhciAqY3VyYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZpb2NoYXJscGV2ZW50ICp2aW9jaGFyOworCisJLyoKKwkgKiBXcml0ZSB0byB0aGUgaHZsb2cgb2YgaW5ib3VuZCBkYXRhIGFyZSBub3cgZG9uZSBwcmlvciB0bworCSAqIGNhbGxpbmcgaW50ZXJuYWxfd3JpdGUoKSBzaW5jZSBpbnRlcm5hbF93cml0ZSgpIGlzIG9ubHkgY2FsbGVkIGluCisJICogdGhlIGV2ZW50IHRoYXQgYW4gbHAgZXZlbnQgcGF0aCBpcyBhY3RpdmUsIHdoaWNoIGlzbid0IHRoZSBjYXNlIGZvcgorCSAqIGxvZ2dpbmcgYXR0ZW1wdHMgcHJpb3IgdG8gY29uc29sZSBpbml0aWFsaXphdGlvbi4KKwkgKgorCSAqIElmIHRoZXJlIGlzIGFscmVhZHkgZGF0YSBxdWV1ZWQgZm9yIHRoaXMgcG9ydCwgc2VuZCBpdCBwcmlvciB0bworCSAqIGF0dGVtcHRpbmcgdG8gc2VuZCBhbnkgbmV3IGRhdGEuCisJICovCisJaWYgKHBpLT51c2VkKQorCQlzZW5kX2J1ZmZlcnMocGkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisKKwl2aW9jaGFyID0gdmlvX2dldF9ldmVudF9idWZmZXIodmlvbWFqb3JzdWJ0eXBlX2NoYXJpbyk7CisJaWYgKHZpb2NoYXIgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCQlodmxvZygiXG5ccnZpb2NvbnM6IENhbid0IGdldCB2aW8gYnVmZmVyIGluIGludGVybmFsX3dyaXRlKCkuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlpbml0RGF0YUV2ZW50KHZpb2NoYXIsIHBpLT5scCk7CisKKwljdXJidWYgPSBidWY7CisJYmxlZnQgPSBsZW47CisKKwl3aGlsZSAoKGJsZWZ0ID4gMCkgJiYgKHBpLT51c2VkID09IDApICYmCisJICAgICAgICgocGktPnNlcSAtIHBpLT5hY2spIDwgVklPQ0hBUl9XSU5ET1cpKSB7CisJCWlmIChibGVmdCA+IFZJT0NIQVJfTUFYX0RBVEEpCisJCQljdXJsZW4gPSBWSU9DSEFSX01BWF9EQVRBOworCQllbHNlCisJCQljdXJsZW4gPSBibGVmdDsKKworCQl2aW9jaGFyLT5ldmVudC54Q29ycmVsYXRpb25Ub2tlbiA9IHBpLT5zZXErKzsKKwkJbWVtY3B5KHZpb2NoYXItPmRhdGEsIGN1cmJ1ZiwgY3VybGVuKTsKKwkJdmlvY2hhci0+bGVuID0gY3VybGVuOworCQl2aW9jaGFyLT5ldmVudC54U2l6ZU1pbnVzMSA9CisJCSAgICBvZmZzZXRvZihzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQsIGRhdGEpICsgY3VybGVuOworCisJCWh2cmMgPSBIdkNhbGxFdmVudF9zaWduYWxMcEV2ZW50KCZ2aW9jaGFyLT5ldmVudCk7CisJCWlmIChodnJjKSB7CisJCQlodmxvZygidmlvY29uczogZXJyb3Igc2VuZGluZyBldmVudCEgJWRcbiIsIChpbnQpaHZyYyk7CisJCQlnb3RvIG91dDsKKwkJfQorCQljdXJidWYgKz0gY3VybGVuOworCQlibGVmdCAtPSBjdXJsZW47CisJfQorCisJLyogSWYgd2UgZGlkbid0IHNlbmQgaXQgYWxsLCBidWZmZXIgYXMgbXVjaCBvZiBpdCBhcyB3ZSBjYW4uICovCisJaWYgKGJsZWZ0ID4gMCkKKwkJYmxlZnQgLT0gYnVmZmVyX2FkZChwaSwgY3VyYnVmLCBibGVmdCk7CitvdXQ6CisJdmlvX2ZyZWVfZXZlbnRfYnVmZmVyKHZpb21ham9yc3VidHlwZV9jaGFyaW8sIHZpb2NoYXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJcmV0dXJuIGxlbiAtIGJsZWZ0OworfQorCitzdGF0aWMgc3RydWN0IHBvcnRfaW5mbyAqZ2V0X3BvcnRfZGF0YShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBvcnRfaW5mbyAqcGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwlpZiAodHR5KSB7CisJCXBpID0gKHN0cnVjdCBwb3J0X2luZm8gKil0dHktPmRyaXZlcl9kYXRhOworCQlpZiAoIXBpIHx8IHZpb3R0eV9wYXJhbm9pYV9jaGVjayhwaSwgdHR5LT5uYW1lLAorCQkJCQkgICAgICJnZXRfcG9ydF9kYXRhIikpIHsKKwkJCXBpID0gTlVMTDsKKwkJfQorCX0gZWxzZQorCQkvKgorCQkgKiBJZiB0aGlzIGlzIHRoZSBjb25zb2xlIGRldmljZSwgdXNlIHRoZSBscCBmcm9tCisJCSAqIHRoZSBmaXJzdCBwb3J0IGVudHJ5CisJCSAqLworCQlwaSA9ICZwb3J0X2luZm9bMF07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcGk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBjb21tb24gZmllbGRzIGluIGEgY2hhckxwRXZlbnQKKyAqLworc3RhdGljIHZvaWQgaW5pdERhdGFFdmVudChzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQgKnZpb2NoYXIsIEh2THBJbmRleCBscCkKK3sKKwltZW1zZXQodmlvY2hhciwgMCwgc2l6ZW9mKHN0cnVjdCB2aW9jaGFybHBldmVudCkpOworCisJdmlvY2hhci0+ZXZlbnQueEZsYWdzLnhWYWxpZCA9IDE7CisJdmlvY2hhci0+ZXZlbnQueEZsYWdzLnhGdW5jdGlvbiA9IEh2THBFdmVudF9GdW5jdGlvbl9JbnQ7CisJdmlvY2hhci0+ZXZlbnQueEZsYWdzLnhBY2tJbmQgPSBIdkxwRXZlbnRfQWNrSW5kX05vQWNrOworCXZpb2NoYXItPmV2ZW50LnhGbGFncy54QWNrVHlwZSA9IEh2THBFdmVudF9BY2tUeXBlX0RlZmVycmVkQWNrOworCXZpb2NoYXItPmV2ZW50LnhUeXBlID0gSHZMcEV2ZW50X1R5cGVfVmlydHVhbElvOworCXZpb2NoYXItPmV2ZW50LnhTdWJ0eXBlID0gdmlvbWFqb3JzdWJ0eXBlX2NoYXJpbyB8IHZpb2NoYXJkYXRhOworCXZpb2NoYXItPmV2ZW50LnhTb3VyY2VMcCA9IEh2THBDb25maWdfZ2V0THBJbmRleCgpOworCXZpb2NoYXItPmV2ZW50LnhUYXJnZXRMcCA9IGxwOworCXZpb2NoYXItPmV2ZW50LnhTaXplTWludXMxID0gc2l6ZW9mKHN0cnVjdCB2aW9jaGFybHBldmVudCk7CisJdmlvY2hhci0+ZXZlbnQueFNvdXJjZUluc3RhbmNlSWQgPSB2aW9wYXRoX3NvdXJjZWluc3QobHApOworCXZpb2NoYXItPmV2ZW50LnhUYXJnZXRJbnN0YW5jZUlkID0gdmlvcGF0aF90YXJnZXRpbnN0KGxwKTsKK30KKworLyoKKyAqIGVhcmx5IGNvbnNvbGUgZGV2aWNlIHdyaXRlCisgKi8KK3N0YXRpYyB2b2lkIHZpb2NvbnNfd3JpdGVfZWFybHkoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBjb3VudCkKK3sKKwlodmxvZ091dHB1dChzLCBjb3VudCk7Cit9CisKKy8qCisgKiBjb25zb2xlIGRldmljZSB3cml0ZQorICovCitzdGF0aWMgdm9pZCB2aW9jb25zX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywgdW5zaWduZWQgY291bnQpCit7CisJaW50IGluZGV4OworCWludCBiZWdpbjsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaTsKKworCXN0YXRpYyBjb25zdCBjaGFyIGNyID0gJ1xyJzsKKworCS8qCisJICogQ2hlY2sgcG9ydCBkYXRhIGZpcnN0IGJlY2F1c2UgdGhlIHRhcmdldCBMUCBtaWdodCBiZSB2YWxpZCBidXQKKwkgKiBzaW1wbHkgbm90IGFjdGl2ZSwgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGh2bG9nIHRoZSBvdXRwdXQuCisJICovCisJcGkgPSBnZXRfcG9ydF9kYXRhKE5VTEwpOworCWlmIChwaSA9PSBOVUxMKSB7CisJCWh2bG9nKCJcblxydmlvY29uc193cml0ZTogdW5hYmxlIHRvIGdldCBwb3J0IGRhdGEuIik7CisJCXJldHVybjsKKwl9CisKKwlodmxvZ091dHB1dChzLCBjb3VudCk7CisKKwlpZiAoIXZpb3BhdGhfaXNhY3RpdmUocGktPmxwKSkKKwkJcmV0dXJuOworCisJLyogCisJICogQW55IG5ld2xpbmUgY2hhcmFjdGVyIGZvdW5kIHdpbGwgY2F1c2UgYQorCSAqIGNhcnJpYWdlIHJldHVybiBjaGFyYWN0ZXIgdG8gYmUgZW1pdHRlZCBhcyB3ZWxsLiAKKwkgKi8KKwliZWdpbiA9IDA7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKKwkJaWYgKHNbaW5kZXhdID09ICdcbicpIHsKKwkJCS8qIAorCQkJICogTmV3bGluZSBmb3VuZC4gUHJpbnQgZXZlcnl0aGluZyB1cCB0byBhbmQgCisJCQkgKiBpbmNsdWRpbmcgdGhlIG5ld2xpbmUKKwkJCSAqLworCQkJaW50ZXJuYWxfd3JpdGUocGksICZzW2JlZ2luXSwgaW5kZXggLSBiZWdpbiArIDEpOworCQkJYmVnaW4gPSBpbmRleCArIDE7CisJCQkvKiBFbWl0IGEgY2FycmlhZ2UgcmV0dXJuIGFzIHdlbGwgKi8KKwkJCWludGVybmFsX3dyaXRlKHBpLCAmY3IsIDEpOworCQl9CisJfQorCisJLyogSWYgYW55IGNoYXJhY3RlcnMgbGVmdCB0byB3cml0ZSwgd3JpdGUgdGhlbSBub3cgKi8KKwlpZiAoKGluZGV4IC0gYmVnaW4pID4gMCkKKwkJaW50ZXJuYWxfd3JpdGUocGksICZzW2JlZ2luXSwgaW5kZXggLSBiZWdpbik7Cit9CisKKy8qCisgKiBXb3JrIG91dCB0aGUgZGV2aWNlIGFzc29jaWF0ZSB3aXRoIHRoaXMgY29uc29sZQorICovCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnZpb2NvbnNfZGV2aWNlKHN0cnVjdCBjb25zb2xlICpjLCBpbnQgKmluZGV4KQoreworCSppbmRleCA9IGMtPmluZGV4OworCXJldHVybiB2aW90dHlfZHJpdmVyOworfQorCisvKgorICogY29uc29sZSBkZXZpY2UgSS9PIG1ldGhvZHMKKyAqLworc3RhdGljIHN0cnVjdCBjb25zb2xlIHZpb2NvbnNfZWFybHkgPSB7CisJLm5hbWUgPSAidmlvY29ucyIsCisJLndyaXRlID0gdmlvY29uc193cml0ZV9lYXJseSwKKwkuZmxhZ3MgPSBDT05fUFJJTlRCVUZGRVIsCisJLmluZGV4ID0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IGNvbnNvbGUgdmlvY29ucyA9IHsKKwkubmFtZSA9ICJ2aW9jb25zIiwKKwkud3JpdGUgPSB2aW9jb25zX3dyaXRlLAorCS5kZXZpY2UgPSB2aW9jb25zX2RldmljZSwKKwkuZmxhZ3MgPSBDT05fUFJJTlRCVUZGRVIsCisJLmluZGV4ID0gLTEsCit9OworCisvKgorICogVFRZIE9wZW4gbWV0aG9kCisgKi8KK3N0YXRpYyBpbnQgdmlvdHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaW50IHBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaTsKKworCXBvcnQgPSB0dHktPmluZGV4OworCisJaWYgKChwb3J0IDwgMCkgfHwgKHBvcnQgPj0gVlRUWV9QT1JUUykpCisJCXJldHVybiAtRU5PREVWOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisKKwlwaSA9ICZwb3J0X2luZm9bcG9ydF07CisJLyogSWYgc29tZSBvdGhlciBUVFkgaXMgYWxyZWFkeSBjb25uZWN0ZWQgaGVyZSwgcmVqZWN0IHRoZSBvcGVuICovCisJaWYgKChwaS0+dHR5KSAmJiAocGktPnR0eSAhPSB0dHkpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJCXByaW50ayhWSU9DT05TX0tFUk5fV0FSTgorCQkgICAgICAgImF0dGVtcHQgdG8gb3BlbiBkZXZpY2UgdHdpY2UgZnJvbSBkaWZmZXJlbnQgdHR5c1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXR0eS0+ZHJpdmVyX2RhdGEgPSBwaTsKKwlwaS0+dHR5ID0gdHR5OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRUWSBDbG9zZSBtZXRob2QKKyAqLworc3RhdGljIHZvaWQgdmlvdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBvcnRfaW5mbyAqcGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwlwaSA9IChzdHJ1Y3QgcG9ydF9pbmZvICopdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghcGkgfHwgdmlvdHR5X3BhcmFub2lhX2NoZWNrKHBpLCB0dHktPm5hbWUsICJ2aW90dHlfY2xvc2UiKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWlmICh0dHktPmNvdW50ID09IDEpCisJCXBpLT50dHkgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBUVFkgV3JpdGUgbWV0aG9kCisgKi8KK3N0YXRpYyBpbnQgdmlvdHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJaW50IGNvdW50KQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpOworCisJcGkgPSBnZXRfcG9ydF9kYXRhKHR0eSk7CisJaWYgKHBpID09IE5VTEwpIHsKKwkJaHZsb2coIlxuXHJ2aW90dHlfd3JpdGU6IG5vIHBvcnQgZGF0YS4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHZpb2NoYXJfaXNfY29uc29sZShwaSkpCisJCWh2bG9nT3V0cHV0KGJ1ZiwgY291bnQpOworCisJLyoKKwkgKiBJZiB0aGUgcGF0aCB0byB0aGlzIExQIGlzIGNsb3NlZCwgZG9uJ3QgYm90aGVyIGRvaW5nIGFueXRoaW5nIG1vcmUuCisJICoganVzdCBkdW1wIHRoZSBkYXRhIG9uIHRoZSBmbG9vciBhbmQgcmV0dXJuIGNvdW50LiAgRm9yIHNvbWUgcmVhc29uCisJICogc29tZSB1c2VyIGxldmVsIHByb2dyYW1zIHdpbGwgYXR0ZW1wdCB0byBwcm9iZSBhdmFpbGFibGUgdHR5J3MgYW5kCisJICogdGhleSdsbCBhdHRlbXB0IGEgdmlvdHR5X3dyaXRlIG9uIGFuIGludmFsaWQgcG9ydCB3aGljaCBtYXBzIHRvIGFuCisJICogaW52YWxpZCB0YXJnZXQgbHAuICBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gaWdub3JlIHRoZQorCSAqIHZpb3R0eV93cml0ZSBjYWxsIGFuZCwgc2luY2UgdGhlIHZpb3BhdGggaXNuJ3QgYWN0aXZlIHRvIHRoaXMKKwkgKiBwYXJ0aXRpb24sIHJldHVybiBjb3VudC4KKwkgKi8KKwlpZiAoIXZpb3BhdGhfaXNhY3RpdmUocGktPmxwKSkKKwkJcmV0dXJuIGNvdW50OworCisJcmV0dXJuIGludGVybmFsX3dyaXRlKHBpLCBidWYsIGNvdW50KTsKK30KKworLyoKKyAqIFRUWSBwdXRfY2hhciBtZXRob2QKKyAqLworc3RhdGljIHZvaWQgdmlvdHR5X3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGk7CisKKwlwaSA9IGdldF9wb3J0X2RhdGEodHR5KTsKKwlpZiAocGkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogVGhpcyB3aWxsIGFwcGVuZCAnXHInIGFzIHdlbGwgaWYgdGhlIGNoYXIgaXMgJ1xuJyAqLworCWlmICh2aW9jaGFyX2lzX2NvbnNvbGUocGkpKQorCQlodmxvZ091dHB1dCgmY2gsIDEpOworCisJaWYgKHZpb3BhdGhfaXNhY3RpdmUocGktPmxwKSkKKwkJaW50ZXJuYWxfd3JpdGUocGksICZjaCwgMSk7Cit9CisKKy8qCisgKiBUVFkgd3JpdGVfcm9vbSBtZXRob2QKKyAqLworc3RhdGljIGludCB2aW90dHlfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludCBpOworCWludCByb29tID0gMDsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJcGkgPSAoc3RydWN0IHBvcnRfaW5mbyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCFwaSB8fCB2aW90dHlfcGFyYW5vaWFfY2hlY2socGksIHR0eS0+bmFtZSwgInZpb3R0eV93cml0ZV9yb29tIikpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgbm8gYnVmZmVycyBhcmUgdXNlZCwgcmV0dXJuIHRoZSBtYXggc2l6ZS4gKi8KKwlpZiAocGktPnVzZWQgPT0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gVklPQ0hBUl9NQVhfREFUQSAqIFZJT0NIQVJfTlVNX0JVRjsKKwl9CisKKwkvKgorCSAqIFdlIHJldGFpbiB0aGUgc3BpbmxvY2sgYmVjYXVzZSB3ZSB3YW50IHRvIGdldCBhbiBhY2N1cmF0ZQorCSAqIGNvdW50IGFuZCBpdCBjYW4gY2hhbmdlIG9uIHVzIGJldHdlZW4gZWFjaCBvcGVyYXRpb24gaWYgd2UKKwkgKiBkb24ndCBob2xkIHRoZSBzcGlubG9jay4KKwkgKi8KKwlmb3IgKGkgPSAwOyAoKGkgPCBWSU9DSEFSX05VTV9CVUYpICYmIChyb29tIDwgVklPQ0hBUl9NQVhfREFUQSkpOyBpKyspCisJCXJvb20gKz0gKFZJT0NIQVJfTUFYX0RBVEEgLSBwaS0+YnVmZmVyQnl0ZXNbaV0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisKKwlpZiAocm9vbSA+IFZJT0NIQVJfTUFYX0RBVEEpCisJCXJvb20gPSBWSU9DSEFSX01BWF9EQVRBOworCXJldHVybiByb29tOworfQorCisvKgorICogVFRZIGNoYXJzX2luX2J1ZmZlciBtZXRob2QKKyAqLworc3RhdGljIGludCB2aW90dHlfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlvdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwkvKgorCSAqIHRoZSBpb2N0bHMgYmVsb3cgcmVhZC9zZXQgdGhlIGZsYWdzIHVzdWFsbHkgc2hvd24gaW4gdGhlIGxlZHMKKwkgKiBkb24ndCB1c2UgdGhlbSAtIHRoZXkgd2lsbCBnbyBhd2F5IHdpdGhvdXQgd2FybmluZworCSAqLworCWNhc2UgS0RHRVRMRUQ6CisJY2FzZSBLREdLQkxFRDoKKwkJcmV0dXJuIHB1dF91c2VyKDAsIChjaGFyICopYXJnKTsKKworCWNhc2UgS0RTS0JMRUQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBuX3R0eV9pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKK30KKworLyoKKyAqIEhhbmRsZSBhbiBvcGVuIGNoYXJMcEV2ZW50LiAgQ291bGQgYmUgZWl0aGVyIGludGVycnVwdCBvciBhY2sKKyAqLworc3RhdGljIHZvaWQgdmlvSGFuZGxlT3BlbkV2ZW50KHN0cnVjdCBIdkxwRXZlbnQgKmV2ZW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZpb2NoYXJscGV2ZW50ICpjZXZlbnQgPSAoc3RydWN0IHZpb2NoYXJscGV2ZW50ICopZXZlbnQ7CisJdTggcG9ydCA9IGNldmVudC0+dmlydHVhbF9kZXZpY2U7CisJc3RydWN0IHBvcnRfaW5mbyAqcGk7CisJaW50IHJlamVjdCA9IDA7CisKKwlpZiAoZXZlbnQtPnhGbGFncy54RnVuY3Rpb24gPT0gSHZMcEV2ZW50X0Z1bmN0aW9uX0FjaykgeworCQlpZiAocG9ydCA+PSBWVFRZX1BPUlRTKQorCQkJcmV0dXJuOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCQkvKiBHb3QgdGhlIGxvY2ssIGRvbid0IGNhdXNlIGNvbnNvbGUgb3V0cHV0ICovCisKKwkJcGkgPSAmcG9ydF9pbmZvW3BvcnRdOworCQlpZiAoZXZlbnQtPnhSYyA9PSBIdkxwRXZlbnRfUmNfR29vZCkgeworCQkJcGktPnNlcSA9IHBpLT5hY2sgPSAwOworCQkJLyoKKwkJCSAqIFRoaXMgbGluZSBhbGxvd3MgY29ubmVjdGlvbnMgZnJvbSB0aGUgcHJpbWFyeQorCQkJICogcGFydGl0aW9uIGJ1dCBvbmNlIG9uZSBpcyBjb25uZWN0ZWQgZnJvbSB0aGUKKwkJCSAqIHByaW1hcnkgcGFydGl0aW9uIG5vdGhpbmcgc2hvcnQgb2YgYSByZWJvb3QKKwkJCSAqIG9mIGxpbnV4IHdpbGwgYWxsb3cgYWNjZXNzIGZyb20gdGhlIGhvc3RpbmcKKwkJCSAqIHBhcnRpdGlvbiBhZ2FpbiB3aXRob3V0IGEgcmVxdWlyZWQgaVNlcmllcyBmaXguCisJCQkgKi8KKwkJCXBpLT5scCA9IGV2ZW50LT54VGFyZ2V0THA7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCQlpZiAoZXZlbnQtPnhSYyAhPSBIdkxwRXZlbnRfUmNfR29vZCkKKwkJCXByaW50ayhWSU9DT05TX0tFUk5fV0FSTgorCQkJICAgICAgICJoYW5kbGVfb3Blbl9ldmVudDogZXZlbnQtPnhSYyA9PSAoJWQpLlxuIiwKKwkJCSAgICAgICBldmVudC0+eFJjKTsKKworCQlpZiAoZXZlbnQtPnhDb3JyZWxhdGlvblRva2VuICE9IDApIHsKKwkJCWF0b21pY190ICphcHRyPSAoYXRvbWljX3QgKilldmVudC0+eENvcnJlbGF0aW9uVG9rZW47CisJCQlhdG9taWNfc2V0KGFwdHIsIDEpOworCQl9IGVsc2UKKwkJCXByaW50ayhWSU9DT05TX0tFUk5fV0FSTgorCQkJICAgICAgICJ3ZWlyZC4uLmdvdCBvcGVuIGFjayB3aXRob3V0IGF0b21pY1xuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBUaGlzIGhhZCBiZXR0ZXIgcmVxdWlyZSBhbiBhY2ssIG90aGVyd2lzZSBjb21wbGFpbiAqLworCWlmIChldmVudC0+eEZsYWdzLnhBY2tJbmQgIT0gSHZMcEV2ZW50X0Fja0luZF9Eb0FjaykgeworCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4gInZpb2NoYXJvcGVuIHdpdGhvdXQgYWNrIGJpdCFcbiIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJLyogR290IHRoZSBsb2NrLCBkb24ndCBjYXVzZSBjb25zb2xlIG91dHB1dCAqLworCisJLyogTWFrZSBzdXJlIHRoaXMgaXMgYSBnb29kIHZpcnR1YWwgdHR5ICovCisJaWYgKHBvcnQgPj0gVlRUWV9QT1JUUykgeworCQlldmVudC0+eFJjID0gSHZMcEV2ZW50X1JjX1N1YnR5cGVFcnJvcjsKKwkJY2V2ZW50LT5zdWJ0eXBlX3Jlc3VsdF9jb2RlID0gdmlvcmNfb3BlblJlamVjdGVkOworCQkvKgorCQkgKiBGbGFnIHN0YXRlIGhlcmUgc2luY2Ugd2UgY2FuJ3QgcHJpbnRrIHdoaWxlIGhvbGRpbmcKKwkJICogYSBzcGlubG9jay4KKwkJICovCisJCXJlamVjdCA9IDE7CisJfSBlbHNlIHsKKwkJcGkgPSAmcG9ydF9pbmZvW3BvcnRdOworCQlpZiAoKHBpLT5scCAhPSBIdkxwSW5kZXhJbnZhbGlkKSAmJgorCQkJCShwaS0+bHAgIT0gZXZlbnQtPnhTb3VyY2VMcCkpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGlzIGlzIHR0eSBpcyBhbHJlYWR5IGNvbm5lY3RlZCB0byBhIGRpZmZlcmVudAorCQkJICogcGFydGl0aW9uLCBmYWlsLgorCQkJICovCisJCQlldmVudC0+eFJjID0gSHZMcEV2ZW50X1JjX1N1YnR5cGVFcnJvcjsKKwkJCWNldmVudC0+c3VidHlwZV9yZXN1bHRfY29kZSA9IHZpb3JjX29wZW5SZWplY3RlZDsKKwkJCXJlamVjdCA9IDI7CisJCX0gZWxzZSB7CisJCQlwaS0+bHAgPSBldmVudC0+eFNvdXJjZUxwOworCQkJZXZlbnQtPnhSYyA9IEh2THBFdmVudF9SY19Hb29kOworCQkJY2V2ZW50LT5zdWJ0eXBlX3Jlc3VsdF9jb2RlID0gdmlvcmNfZ29vZDsKKwkJCXBpLT5zZXEgPSBwaS0+YWNrID0gMDsKKwkJCXJlamVjdCA9IDA7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCisJaWYgKHJlamVjdCA9PSAxKQorCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4gIm9wZW4gcmVqZWN0ZWQ6IGJhZCB2aXJ0dWFsIHR0eS5cbiIpOworCWVsc2UgaWYgKHJlamVjdCA9PSAyKQorCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4KKwkJCSJvcGVuIHJlamVjdGVkOiBjb25zb2xlIGluIGV4Y2x1c2l2ZSB1c2UgYnkgYW5vdGhlciBwYXJ0aXRpb24uXG4iKTsKKworCS8qIFJldHVybiB0aGUgYWNrbm93bGVkZ2VtZW50ICovCisJSHZDYWxsRXZlbnRfYWNrTHBFdmVudChldmVudCk7Cit9CisKKy8qCisgKiBIYW5kbGUgYSBjbG9zZSBjaGFyTHBFdmVudC4gIFRoaXMgc2hvdWxkIE9OTFkgYmUgYW4gSW50ZXJydXB0IGJlY2F1c2UgdGhlCisgKiB2aXJ0dWFsIGNvbnNvbGUgc2hvdWxkIG5ldmVyIGFjdHVhbGx5IGlzc3VlIGEgY2xvc2UgZXZlbnQgdG8gdGhlIGh5cGVydmlzb3IKKyAqIGJlY2F1c2UgdGhlIHZpcnR1YWwgY29uc29sZSBuZXZlciBnb2VzIGF3YXkuICBBIGNsb3NlIGV2ZW50IGNvbWluZyBmcm9tIHRoZQorICogaHlwZXJ2aXNvciBzaW1wbHkgbWVhbnMgdGhhdCB0aGVyZSBhcmUgbm8gY2xpZW50IGNvbnNvbGVzIGNvbm5lY3RlZCB0byB0aGUKKyAqIHZpcnR1YWwgY29uc29sZS4KKyAqCisgKiBSZWdhcmRsZXNzIG9mIHRoZSBudW1iZXIgb2YgY29ubmVjdGlvbnMgbWFzcXVlcmFkZWQgb24gdGhlIG90aGVyIHNpZGUgb2YKKyAqIHRoZSBoeXBlcnZpc29yIE9OTFkgT05FIGNsb3NlIGV2ZW50IHNob3VsZCBiZSBjYWxsZWQgdG8gYWNjb21wYW55IHRoZSBPTkUKKyAqIG9wZW4gZXZlbnQgdGhhdCBpcyBjYWxsZWQuICBUaGUgY2xvc2UgZXZlbnQgc2hvdWxkIE9OTFkgYmUgY2FsbGVkIHdoZW4gTk8KKyAqIE1PUkUgY29ubmVjdGlvbnMgKG1hc3F1ZXJhZGVkIG9yIG5vdCkgZXhpc3Qgb24gdGhlIG90aGVyIHNpZGUgb2YgdGhlCisgKiBoeXBlcnZpc29yLgorICovCitzdGF0aWMgdm9pZCB2aW9IYW5kbGVDbG9zZUV2ZW50KHN0cnVjdCBIdkxwRXZlbnQgKmV2ZW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZpb2NoYXJscGV2ZW50ICpjZXZlbnQgPSAoc3RydWN0IHZpb2NoYXJscGV2ZW50ICopZXZlbnQ7CisJdTggcG9ydCA9IGNldmVudC0+dmlydHVhbF9kZXZpY2U7CisKKwlpZiAoZXZlbnQtPnhGbGFncy54RnVuY3Rpb24gPT0gSHZMcEV2ZW50X0Z1bmN0aW9uX0ludCkgeworCQlpZiAocG9ydCA+PSBWVFRZX1BPUlRTKSB7CisJCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4KKwkJCQkJImNsb3NlIG1lc3NhZ2UgZnJvbSBpbnZhbGlkIHZpcnR1YWwgZGV2aWNlLlxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBGb3IgY2xvc2VzLCBqdXN0IG1hcmsgdGhlIGNvbnNvbGUgcGFydGl0aW9uIGludmFsaWQgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJCS8qIEdvdCB0aGUgbG9jaywgZG9uJ3QgY2F1c2UgY29uc29sZSBvdXRwdXQgKi8KKworCQlpZiAocG9ydF9pbmZvW3BvcnRdLmxwID09IGV2ZW50LT54U291cmNlTHApCisJCQlwb3J0X2luZm9bcG9ydF0ubHAgPSBIdkxwSW5kZXhJbnZhbGlkOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJCXByaW50ayhWSU9DT05TX0tFUk5fSU5GTyAiY2xvc2UgZnJvbSAlZFxuIiwgZXZlbnQtPnhTb3VyY2VMcCk7CisJfSBlbHNlCisJCXByaW50ayhWSU9DT05TX0tFUk5fV0FSTgorCQkJCSJnb3QgdW5leHBlY3RlZCBjbG9zZSBhY2tub3dsZWdlbWVudFxuIik7Cit9CisKKy8qCisgKiBIYW5kbGUgYSBjb25maWcgY2hhckxwRXZlbnQuICBDb3VsZCBiZSBlaXRoZXIgaW50ZXJydXB0IG9yIGFjaworICovCitzdGF0aWMgdm9pZCB2aW9IYW5kbGVDb25maWcoc3RydWN0IEh2THBFdmVudCAqZXZlbnQpCit7CisJc3RydWN0IHZpb2NoYXJscGV2ZW50ICpjZXZlbnQgPSAoc3RydWN0IHZpb2NoYXJscGV2ZW50ICopZXZlbnQ7CisKKwlIdkNhbGxfd3JpdGVMb2dCdWZmZXIoY2V2ZW50LT5kYXRhLCBjZXZlbnQtPmxlbik7CisKKwlpZiAoY2V2ZW50LT5kYXRhWzBdID09IDB4MDEpCisJCXByaW50ayhWSU9DT05TX0tFUk5fSU5GTyAid2luZG93IHJlc2l6ZWQgdG8gJWQ6ICVkOiAlZDogJWRcbiIsCisJCSAgICAgICBjZXZlbnQtPmRhdGFbMV0sIGNldmVudC0+ZGF0YVsyXSwKKwkJICAgICAgIGNldmVudC0+ZGF0YVszXSwgY2V2ZW50LT5kYXRhWzRdKTsKKwllbHNlCisJCXByaW50ayhWSU9DT05TX0tFUk5fV0FSTiAidW5rbm93biBjb25maWcgZXZlbnRcbiIpOworfQorCisvKgorICogSGFuZGxlIGEgZGF0YSBjaGFyTHBFdmVudC4gCisgKi8KK3N0YXRpYyB2b2lkIHZpb0hhbmRsZURhdGEoc3RydWN0IEh2THBFdmVudCAqZXZlbnQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2aW9jaGFybHBldmVudCAqY2V2ZW50ID0gKHN0cnVjdCB2aW9jaGFybHBldmVudCAqKWV2ZW50OworCXN0cnVjdCBwb3J0X2luZm8gKnBpOworCWludCBpbmRleDsKKwl1OCBwb3J0ID0gY2V2ZW50LT52aXJ0dWFsX2RldmljZTsKKworCWlmIChwb3J0ID49IFZUVFlfUE9SVFMpIHsKKwkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOICJkYXRhIG9uIGludmFsaWQgdmlydHVhbCBkZXZpY2UgJWRcbiIsCisJCQkJcG9ydCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEhvbGQgdGhlIHNwaW5sb2NrIHNvIHRoYXQgd2UgZG9uJ3QgdGFrZSBhbiBpbnRlcnJ1cHQgdGhhdAorCSAqIGNoYW5nZXMgdHR5IGJldHdlZW4gdGhlIHRpbWUgd2UgZmV0Y2ggdGhlIHBvcnRfaW5mbworCSAqIHBvaW50ZXIgYW5kIHRoZSB0aW1lIHdlIHBhcmFub2lhIGNoZWNrLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCXBpID0gJnBvcnRfaW5mb1twb3J0XTsKKworCS8qCisJICogQ2hhbmdlIDA1LzAxLzIwMDMgLSBSeWFuIEFybm9sZDogSWYgYSBwYXJ0aXRpb24gb3RoZXIgdGhhbgorCSAqIHRoZSBjdXJyZW50IGV4Y2x1c2l2ZSBwYXJ0aXRpb24gdHJpZXMgdG8gc2VuZCB1cyBkYXRhCisJICogZXZlbnRzIHRoZW4ganVzdCBkcm9wIHRoZW0gb24gdGhlIGZsb29yIGJlY2F1c2Ugd2UgZG9uJ3QKKwkgKiB3YW50IGhpcyBzdGlua2luZyBkYXRhLiAgSGUgaXNuJ3QgYXV0aG9yaXplZCB0byByZWNlaXZlCisJICogZGF0YSBiZWNhdXNlIGhlIHdhc24ndCB0aGUgZmlyc3Qgb25lIHRvIGdldCB0aGUgY29uc29sZSwKKwkgKiB0aGVyZWZvcmUgaGUgc2hvdWxkbid0IGJlIGFsbG93ZWQgdG8gc2VuZCBkYXRhIGVpdGhlci4KKwkgKiBUaGlzIHdpbGwgd29yayB3aXRob3V0IGFuIGlTZXJpZXMgZml4LgorCSAqLworCWlmIChwaS0+bHAgIT0gZXZlbnQtPnhTb3VyY2VMcCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJdHR5ID0gcGktPnR0eTsKKwlpZiAodHR5ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOICJubyB0dHkgZm9yIHZpcnR1YWwgZGV2aWNlICVkXG4iLAorCQkJCXBvcnQpOworCQlyZXR1cm47CisJfQorCisJaWYgKHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJCXByaW50ayhWSU9DT05TX0tFUk5fV0FSTiAidHR5IGJhZCBtYWdpY1xuIik7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEp1c3QgdG8gYmUgcGFyYW5vaWQsIG1ha2Ugc3VyZSB0aGUgdHR5IHBvaW50cyBiYWNrIHRvIHRoaXMgcG9ydAorCSAqLworCXBpID0gKHN0cnVjdCBwb3J0X2luZm8gKil0dHktPmRyaXZlcl9kYXRhOworCWlmICghcGkgfHwgdmlvdHR5X3BhcmFub2lhX2NoZWNrKHBpLCB0dHktPm5hbWUsICJ2aW9IYW5kbGVEYXRhIikpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc29sZWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBDaGFuZ2UgMDcvMjEvMjAwMyAtIFJ5YW4gQXJub2xkOiBmdW5jdGlvbmFsaXR5IGFkZGVkIHRvCisJICogc3VwcG9ydCBzeXNycSB1dGlsaXppbmcgXk8gYXMgdGhlIHN5c3JxIGtleS4gIFRoZSBzeXNycQorCSAqIGZ1bmN0aW9uYWxpdHkgd2lsbCBvbmx5IHdvcmsgaWYgYnVpbHQgaW50byB0aGUga2VybmVsIGFuZAorCSAqIHRoZW4gb25seSBpZiBzeXNycSBpcyBlbmFibGVkIHRocm91Z2ggdGhlIHByb2MgZmlsZXN5c3RlbS4KKwkgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjZXZlbnQtPmxlbjsgaW5kZXgrKykgeworI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQorCQlpZiAoc3lzcnFfZW5hYmxlZCkgeworCQkJLyogMHgwZiBpcyB0aGUgYXNjaWkgY2hhcmFjdGVyIGZvciBeTyAqLworCQkJaWYgKGNldmVudC0+ZGF0YVtpbmRleF0gPT0gJ1x4MGYnKSB7CisJCQkJdmlvX3N5c3JxX3ByZXNzZWQgPSAxOworCQkJCS8qCisJCQkJICogY29udGludWUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGFkZAorCQkJCSAqIHRoZSBzeXNycSBrZXkgaW50byB0aGUgZGF0YSBzdHJpbmcuCisJCQkJICovCisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKHZpb19zeXNycV9wcmVzc2VkKSB7CisJCQkJaGFuZGxlX3N5c3JxKGNldmVudC0+ZGF0YVtpbmRleF0sIE5VTEwsIHR0eSk7CisJCQkJdmlvX3N5c3JxX3ByZXNzZWQgPSAwOworCQkJCS8qCisJCQkJICogY29udGludWUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGFkZAorCQkJCSAqIHRoZSBzeXNycSBzZXF1ZW5jZSBpbnRvIHRoZSBkYXRhIHN0cmluZy4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCS8qCisJCSAqIFRoZSBzeXNycSBzZXF1ZW5jZSBpc24ndCBpbmNsdWRlZCBpbiB0aGlzIGNoZWNrIGlmCisJCSAqIHN5c3JxIGlzIGVuYWJsZWQgYW5kIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCBiZWNhdXNlCisJCSAqIHRoZSBzZXF1ZW5jZSB3aWxsIG5ldmVyIGdldCBpbnNlcnRlZCBpbnRvIHRoZSBidWZmZXIuCisJCSAqIERvbid0IGF0dGVtcHQgdG8gY29weSBtb3JlIGRhdGEgaW50byB0aGUgYnVmZmVyIHRoYW4gd2UKKwkJICogaGF2ZSByb29tIGZvciBiZWNhdXNlIGl0IHdvdWxkIGZhaWwgd2l0aG91dCBpbmRpY2F0aW9uLgorCQkgKi8KKwkJaWYgKCh0dHktPmZsaXAuY291bnQgKyAxKSA+IFRUWV9GTElQQlVGX1NJWkUpIHsKKwkJCXByaW50ayhWSU9DT05TX0tFUk5fV0FSTiAiaW5wdXQgYnVmZmVyIG92ZXJmbG93IVxuIik7CisJCQlicmVhazsKKwkJfQorCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNldmVudC0+ZGF0YVtpbmRleF0sIFRUWV9OT1JNQUwpOworCX0KKworCS8qIGlmIGNldmVudC0+bGVuID09IDAgdGhlbiBubyBkYXRhIHdhcyBhZGRlZCB0byB0aGUgYnVmZmVyIGFuZCBmbGlwLmNvdW50ID09IDAgKi8KKwlpZiAodHR5LT5mbGlwLmNvdW50KQorCQkvKiBUaGUgbmV4dCBjYWxsIHJlc2V0cyBmbGlwLmNvdW50IHdoZW4gdGhlIGRhdGEgaXMgZmx1c2hlZC4gKi8KKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworLyoKKyAqIEhhbmRsZSBhbiBhY2sgY2hhckxwRXZlbnQuIAorICovCitzdGF0aWMgdm9pZCB2aW9IYW5kbGVBY2soc3RydWN0IEh2THBFdmVudCAqZXZlbnQpCit7CisJc3RydWN0IHZpb2NoYXJscGV2ZW50ICpjZXZlbnQgPSAoc3RydWN0IHZpb2NoYXJscGV2ZW50ICopZXZlbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBwb3J0ID0gY2V2ZW50LT52aXJ0dWFsX2RldmljZTsKKworCWlmIChwb3J0ID49IFZUVFlfUE9SVFMpIHsKKwkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOICJkYXRhIG9uIGludmFsaWQgdmlydHVhbCBkZXZpY2VcbiIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNvbGVsb2NrLCBmbGFncyk7CisJcG9ydF9pbmZvW3BvcnRdLmFjayA9IGV2ZW50LT54Q29ycmVsYXRpb25Ub2tlbjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zb2xlbG9jaywgZmxhZ3MpOworCisJaWYgKHBvcnRfaW5mb1twb3J0XS51c2VkKQorCQlzZW5kX2J1ZmZlcnMoJnBvcnRfaW5mb1twb3J0XSk7Cit9CisKKy8qCisgKiBIYW5kbGUgY2hhckxwRXZlbnRzIGFuZCByb3V0ZSB0byB0aGUgYXBwcm9wcmlhdGUgcm91dGluZQorICovCitzdGF0aWMgdm9pZCB2aW9IYW5kbGVDaGFyRXZlbnQoc3RydWN0IEh2THBFdmVudCAqZXZlbnQpCit7CisJaW50IGNoYXJtaW5vcjsKKworCWlmIChldmVudCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwljaGFybWlub3IgPSBldmVudC0+eFN1YnR5cGUgJiBWSU9NSU5PUl9TVUJUWVBFX01BU0s7CisJc3dpdGNoIChjaGFybWlub3IpIHsKKwljYXNlIHZpb2NoYXJvcGVuOgorCQl2aW9IYW5kbGVPcGVuRXZlbnQoZXZlbnQpOworCQlicmVhazsKKwljYXNlIHZpb2NoYXJjbG9zZToKKwkJdmlvSGFuZGxlQ2xvc2VFdmVudChldmVudCk7CisJCWJyZWFrOworCWNhc2UgdmlvY2hhcmRhdGE6CisJCXZpb0hhbmRsZURhdGEoZXZlbnQpOworCQlicmVhazsKKwljYXNlIHZpb2NoYXJhY2s6CisJCXZpb0hhbmRsZUFjayhldmVudCk7CisJCWJyZWFrOworCWNhc2UgdmlvY2hhcmNvbmZpZzoKKwkJdmlvSGFuZGxlQ29uZmlnKGV2ZW50KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKChldmVudC0+eEZsYWdzLnhGdW5jdGlvbiA9PSBIdkxwRXZlbnRfRnVuY3Rpb25fSW50KSAmJgorCQkgICAgKGV2ZW50LT54RmxhZ3MueEFja0luZCA9PSBIdkxwRXZlbnRfQWNrSW5kX0RvQWNrKSkgeworCQkJZXZlbnQtPnhSYyA9IEh2THBFdmVudF9SY19JbnZhbGlkU3VidHlwZTsKKwkJCUh2Q2FsbEV2ZW50X2Fja0xwRXZlbnQoZXZlbnQpOworCQl9CisJfQorfQorCisvKgorICogU2VuZCBhbiBvcGVuIGV2ZW50CisgKi8KK3N0YXRpYyBpbnQgc2VuZF9vcGVuKEh2THBJbmRleCByZW1vdGVMcCwgdm9pZCAqc2VtKQoreworCXJldHVybiBIdkNhbGxFdmVudF9zaWduYWxMcEV2ZW50RmFzdChyZW1vdGVMcCwKKwkJCUh2THBFdmVudF9UeXBlX1ZpcnR1YWxJbywKKwkJCXZpb21ham9yc3VidHlwZV9jaGFyaW8gfCB2aW9jaGFyb3BlbiwKKwkJCUh2THBFdmVudF9BY2tJbmRfRG9BY2ssIEh2THBFdmVudF9BY2tUeXBlX0ltbWVkaWF0ZUFjaywKKwkJCXZpb3BhdGhfc291cmNlaW5zdChyZW1vdGVMcCksCisJCQl2aW9wYXRoX3RhcmdldGluc3QocmVtb3RlTHApLAorCQkJKHU2NCkodW5zaWduZWQgbG9uZylzZW0sIFZJT1ZFUlNJT04gPDwgMTYsCisJCQkwLCAwLCAwLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBzZXJpYWxfb3BzID0geworCS5vcGVuID0gdmlvdHR5X29wZW4sCisJLmNsb3NlID0gdmlvdHR5X2Nsb3NlLAorCS53cml0ZSA9IHZpb3R0eV93cml0ZSwKKwkucHV0X2NoYXIgPSB2aW90dHlfcHV0X2NoYXIsCisJLndyaXRlX3Jvb20gPSB2aW90dHlfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gdmlvdHR5X2NoYXJzX2luX2J1ZmZlciwKKwkuaW9jdGwgPSB2aW90dHlfaW9jdGwsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB2aW9jb25zX2luaXQyKHZvaWQpCit7CisJYXRvbWljX3Qgd2FpdF9mbGFnOworCWludCByYzsKKworCS8qICsyIGZvciBmdWRnZSAqLworCXJjID0gdmlvcGF0aF9vcGVuKEh2THBDb25maWdfZ2V0UHJpbWFyeUxwSW5kZXgoKSwKKwkJCXZpb21ham9yc3VidHlwZV9jaGFyaW8sIFZJT0NIQVJfV0lORE9XICsgMik7CisJaWYgKHJjKQorCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4gImVycm9yIG9wZW5pbmcgdG8gcHJpbWFyeSAlZFxuIiwgcmMpOworCisJaWYgKHZpb3BhdGhfaG9zdExwID09IEh2THBJbmRleEludmFsaWQpCisJCXZpb19zZXRfaG9zdGxwKCk7CisKKwkvKgorCSAqIEFuZCBpZiB0aGUgcHJpbWFyeSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGhvc3RpbmcgTFAsIG9wZW4gdG8gdGhlIAorCSAqIGhvc3RpbmcgbHAKKwkgKi8KKwlpZiAoKHZpb3BhdGhfaG9zdExwICE9IEh2THBJbmRleEludmFsaWQpICYmCisJICAgICh2aW9wYXRoX2hvc3RMcCAhPSBIdkxwQ29uZmlnX2dldFByaW1hcnlMcEluZGV4KCkpKSB7CisJCXByaW50ayhWSU9DT05TX0tFUk5fSU5GTyAib3BlbiBwYXRoIHRvIGhvc3RpbmcgKCVkKVxuIiwKKwkJCQl2aW9wYXRoX2hvc3RMcCk7CisJCXJjID0gdmlvcGF0aF9vcGVuKHZpb3BhdGhfaG9zdExwLCB2aW9tYWpvcnN1YnR5cGVfY2hhcmlvLAorCQkJCVZJT0NIQVJfV0lORE9XICsgMik7CS8qICsyIGZvciBmdWRnZSAqLworCQlpZiAocmMpCisJCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4KKwkJCQkiZXJyb3Igb3BlbmluZyB0byBwYXJ0aXRpb24gJWQ6ICVkXG4iLAorCQkJCXZpb3BhdGhfaG9zdExwLCByYyk7CisJfQorCisJaWYgKHZpb19zZXRIYW5kbGVyKHZpb21ham9yc3VidHlwZV9jaGFyaW8sIHZpb0hhbmRsZUNoYXJFdmVudCkgPCAwKQorCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4KKwkJCQkiZXJyb3Igc2V0aW5nIGhhbmRsZXIgZm9yIGNvbnNvbGUgZXZlbnRzIVxuIik7CisKKwkvKgorCSAqIEZpcnN0LCB0cnkgdG8gb3BlbiB0aGUgY29uc29sZSB0byB0aGUgaG9zdGluZyBscC4KKwkgKiBXYWl0IG9uIGEgc2VtYXBob3JlIGZvciB0aGUgcmVzcG9uc2UuCisJICovCisJYXRvbWljX3NldCgmd2FpdF9mbGFnLCAwKTsKKwlpZiAoKHZpb3BhdGhfaXNhY3RpdmUodmlvcGF0aF9ob3N0THApKSAmJgorCSAgICAoc2VuZF9vcGVuKHZpb3BhdGhfaG9zdExwLCAodm9pZCAqKSZ3YWl0X2ZsYWcpID09IDApKSB7CisJCXByaW50ayhWSU9DT05TX0tFUk5fSU5GTyAiaG9zdGluZyBwYXJ0aXRpb24gJWRcbiIsCisJCQl2aW9wYXRoX2hvc3RMcCk7CisJCXdoaWxlIChhdG9taWNfcmVhZCgmd2FpdF9mbGFnKSA9PSAwKQorCQkJbWIoKTsKKwkJYXRvbWljX3NldCgmd2FpdF9mbGFnLCAwKTsKKwl9CisKKwkvKgorCSAqIElmIHdlIGRvbid0IGhhdmUgYW4gYWN0aXZlIGNvbnNvbGUsIHRyeSB0aGUgcHJpbWFyeQorCSAqLworCWlmICgoIXZpb3BhdGhfaXNhY3RpdmUocG9ydF9pbmZvWzBdLmxwKSkgJiYKKwkgICAgKHZpb3BhdGhfaXNhY3RpdmUoSHZMcENvbmZpZ19nZXRQcmltYXJ5THBJbmRleCgpKSkgJiYKKwkgICAgKHNlbmRfb3BlbihIdkxwQ29uZmlnX2dldFByaW1hcnlMcEluZGV4KCksICh2b2lkICopJndhaXRfZmxhZykKKwkgICAgID09IDApKSB7CisJCXByaW50ayhWSU9DT05TX0tFUk5fSU5GTyAib3BlbmluZyBjb25zb2xlIHRvIHByaW1hcnkgcGFydGl0aW9uXG4iKTsKKwkJd2hpbGUgKGF0b21pY19yZWFkKCZ3YWl0X2ZsYWcpID09IDApCisJCQltYigpOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCisJdmlvdHR5X2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoVlRUWV9QT1JUUyk7CisJdmlvdHR5X2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwl2aW90dHlfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJ2aW9jb25zb2xlIjsKKwl2aW90dHlfZHJpdmVyLT5kZXZmc19uYW1lID0gInZjcy8iOworCXZpb3R0eV9kcml2ZXItPm5hbWUgPSAidHR5IjsKKwl2aW90dHlfZHJpdmVyLT5uYW1lX2Jhc2UgPSAxOworCXZpb3R0eV9kcml2ZXItPm1ham9yID0gVFRZX01BSk9SOworCXZpb3R0eV9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gMTsKKwl2aW90dHlfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX0NPTlNPTEU7CisJdmlvdHR5X2RyaXZlci0+c3VidHlwZSA9IDE7CisJdmlvdHR5X2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXZpb3R0eV9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUzsKKwl0dHlfc2V0X29wZXJhdGlvbnModmlvdHR5X2RyaXZlciwgJnNlcmlhbF9vcHMpOworCisJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIodmlvdHR5X2RyaXZlcikpIHsKKwkJcHJpbnRrKFZJT0NPTlNfS0VSTl9XQVJOICJjb3VsZG4ndCByZWdpc3RlciBjb25zb2xlIGRyaXZlclxuIik7CisJCXB1dF90dHlfZHJpdmVyKHZpb3R0eV9kcml2ZXIpOworCQl2aW90dHlfZHJpdmVyID0gTlVMTDsKKwl9CisKKwl1bnJlZ2lzdGVyX2NvbnNvbGUoJnZpb2NvbnNfZWFybHkpOworCXJlZ2lzdGVyX2NvbnNvbGUoJnZpb2NvbnMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHZpb2NvbnNfaW5pdCh2b2lkKQoreworCWludCBpOworCisJcHJpbnRrKFZJT0NPTlNfS0VSTl9JTkZPICJyZWdpc3RlcmluZyBjb25zb2xlXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgVlRUWV9QT1JUUzsgaSsrKSB7CisJCXBvcnRfaW5mb1tpXS5scCA9IEh2THBJbmRleEludmFsaWQ7CisJCXBvcnRfaW5mb1tpXS5tYWdpYyA9IFZJT1RUWV9NQUdJQzsKKwl9CisJSHZDYWxsX3NldExvZ0J1ZmZlckZvcm1hdEFuZENvZGVwYWdlKEh2Q2FsbF9Mb2dCdWZmZXJfQVNDSUksIDQzNyk7CisJcmVnaXN0ZXJfY29uc29sZSgmdmlvY29uc19lYXJseSk7CisJcmV0dXJuIDA7Cit9CisKK2NvbnNvbGVfaW5pdGNhbGwodmlvY29uc19pbml0KTsKK21vZHVsZV9pbml0KHZpb2NvbnNfaW5pdDIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Zpb3RhcGUuYyBiL2RyaXZlcnMvY2hhci92aW90YXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhM2NiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci92aW90YXBlLmMKQEAgLTAsMCArMSwxMTI5IEBACisvKiAtKi0gbGludXgtYyAtKi0KKyAqICBkcml2ZXJzL2NoYXIvdmlvdGFwZS5jCisgKgorICogIGlTZXJpZXMgVmlydHVhbCBUYXBlCisgKgorICogIEF1dGhvcnM6IERhdmUgQm91dGNoZXIgPGJvdXRjaGVyQHVzLmlibS5jb20+CisgKiAgICAgICAgICAgUnlhbiBBcm5vbGQgPHJ5YW5hcm5AdXMuaWJtLmNvbT4KKyAqICAgICAgICAgICBDb2xpbiBEZXZpbGJpc3MgPGRldmlsYmlzQHVzLmlibS5jb20+CisgKiAgICAgICAgICAgU3RlcGhlbiBSb3Rod2VsbCA8c2ZyQGF1MS5pYm0uY29tPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA0IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueXUgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBUaGlzIHJvdXRpbmUgcHJvdmlkZXMgYWNjZXNzIHRvIHRhcGUgZHJpdmVzIG93bmVkIGFuZCBtYW5hZ2VkIGJ5IGFuIE9TLzQwMAorICogcGFydGl0aW9uIHJ1bm5pbmcgb24gdGhlIHNhbWUgYm94IGFzIHRoaXMgTGludXggcGFydGl0aW9uLgorICoKKyAqIEFsbCB0YXBlIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBieSBzZW5kaW5nIG1lc3NhZ2VzIGJhY2sgYW5kIGZvcnRoIHRvCisgKiB0aGUgT1MvNDAwIHBhcnRpdGlvbi4gIFRoZSBmb3JtYXQgb2YgdGhlIG1lc3NhZ2VzIGlzIGRlZmluZWQgaW4KKyAqIGlTZXJpZXMvdmlvLmgKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tdGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCisjaW5jbHVkZSA8YXNtL3Zpby5oPgorI2luY2x1ZGUgPGFzbS9pU2VyaWVzL3Zpby5oPgorI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0h2THBFdmVudC5oPgorI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0h2Q2FsbEV2ZW50Lmg+CisjaW5jbHVkZSA8YXNtL2lTZXJpZXMvSHZMcENvbmZpZy5oPgorCisjZGVmaW5lIFZJT1RBUEVfVkVSU0lPTgkJIjEuMiIKKyNkZWZpbmUgVklPVEFQRV9NQVhSRVEJCTEKKworI2RlZmluZSBWSU9UQVBFX0tFUk5fV0FSTglLRVJOX1dBUk5JTkcgInZpb3RhcGU6ICIKKyNkZWZpbmUgVklPVEFQRV9LRVJOX0lORk8JS0VSTl9JTkZPICJ2aW90YXBlOiAiCisKK3N0YXRpYyBpbnQgdmlvdGFwZV9udW1kZXY7CisKKy8qCisgKiBUaGUgbWlub3IgbnVtYmVyIGZvbGxvd3MgdGhlIGNvbnZlbnRpb25zIG9mIHRoZSBTQ1NJIHRhcGUgZHJpdmVzLiAgVGhlCisgKiByZXdpbmQgYW5kIG1vZGUgYXJlIGVuY29kZWQgaW4gdGhlIG1pbm9yICMuICBXZSB1c2UgdGhpcyBzdHJ1Y3QgdG8gYnJlYWsKKyAqIHRoZW0gb3V0CisgKi8KK3N0cnVjdCB2aW90X2RldmluZm9fc3RydWN0IHsKKwlpbnQgZGV2bm87CisJaW50IG1vZGU7CisJaW50IHJld2luZDsKK307CisKKyNkZWZpbmUgVklPVEFQT1BfUkVTRVQgICAgICAgICAgMAorI2RlZmluZSBWSU9UQVBPUF9GU0YJICAgICAgICAxCisjZGVmaW5lIFZJT1RBUE9QX0JTRgkgICAgICAgIDIKKyNkZWZpbmUgVklPVEFQT1BfRlNSCSAgICAgICAgMworI2RlZmluZSBWSU9UQVBPUF9CU1IJICAgICAgICA0CisjZGVmaW5lIFZJT1RBUE9QX1dFT0YJICAgICAgICA1CisjZGVmaW5lIFZJT1RBUE9QX1JFVwkgICAgICAgIDYKKyNkZWZpbmUgVklPVEFQT1BfTk9QCSAgICAgICAgNworI2RlZmluZSBWSU9UQVBPUF9FT00JICAgICAgICA4CisjZGVmaW5lIFZJT1RBUE9QX0VSQVNFICAgICAgICAgIDkKKyNkZWZpbmUgVklPVEFQT1BfU0VUQkxLICAgICAgICAxMAorI2RlZmluZSBWSU9UQVBPUF9TRVRERU5TSVRZICAgIDExCisjZGVmaW5lIFZJT1RBUE9QX1NFVFBPUwkgICAgICAgMTIKKyNkZWZpbmUgVklPVEFQT1BfR0VUUE9TCSAgICAgICAxMworI2RlZmluZSBWSU9UQVBPUF9TRVRQQVJUICAgICAgIDE0CisjZGVmaW5lIFZJT1RBUE9QX1VOTE9BRCAgICAgICAgMTUKKworc3RydWN0IHZpb3RhcGVscGV2ZW50IHsKKwlzdHJ1Y3QgSHZMcEV2ZW50IGV2ZW50OworCXUzMiByZXNlcnZlZDsKKwl1MTYgdmVyc2lvbjsKKwl1MTYgc3ViX3R5cGVfcmVzdWx0OworCXUxNiB0YXBlOworCXUxNiBmbGFnczsKKwl1MzIgdG9rZW47CisJdTY0IGxlbjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1MzIgdGFwZV9vcDsKKwkJCXUzMiBjb3VudDsKKwkJfSBvcDsKKwkJc3RydWN0IHsKKwkJCXUzMiB0eXBlOworCQkJdTMyIHJlc2lkOworCQkJdTMyIGRzcmVnOworCQkJdTMyIGdzdGF0OworCQkJdTMyIGVycmVnOworCQkJdTMyIGZpbGVfbm87CisJCQl1MzIgYmxvY2tfbm87CisJCX0gZ2V0X3N0YXR1czsKKwkJc3RydWN0IHsKKwkJCXUzMiBibG9ja19ubzsKKwkJfSBnZXRfcG9zOworCX0gdTsKK307CisKK2VudW0gdmlvdGFwZXN1YnR5cGUgeworCXZpb3RhcGVvcGVuID0gMHgwMDAxLAorCXZpb3RhcGVjbG9zZSA9IDB4MDAwMiwKKwl2aW90YXBlcmVhZCA9IDB4MDAwMywKKwl2aW90YXBld3JpdGUgPSAweDAwMDQsCisJdmlvdGFwZWdldGluZm8gPSAweDAwMDUsCisJdmlvdGFwZW9wID0gMHgwMDA2LAorCXZpb3RhcGVnZXRwb3MgPSAweDAwMDcsCisJdmlvdGFwZXNldHBvcyA9IDB4MDAwOCwKKwl2aW90YXBlZ2V0c3RhdHVzID0gMHgwMDA5Cit9OworCitlbnVtIHZpb3RhcGVyYyB7CisJdmlvdGFwZV9JbnZhbGlkUmFuZ2UgPSAweDA2MDEsCisJdmlvdGFwZV9JbnZhbGlkVG9rZW4gPSAweDA2MDIsCisJdmlvdGFwZV9ETUFFcnJvciA9IDB4MDYwMywKKwl2aW90YXBlX1VzZUVycm9yID0gMHgwNjA0LAorCXZpb3RhcGVfUmVsZWFzZUVycm9yID0gMHgwNjA1LAorCXZpb3RhcGVfSW52YWxpZFRhcGUgPSAweDA2MDYsCisJdmlvdGFwZV9JbnZhbGlkT3AgPSAweDA2MDcsCisJdmlvdGFwZV9UYXBlRXJyID0gMHgwNjA4LAorCisJdmlvdGFwZV9BbGxvY1RpbWVkT3V0ID0gMHgwNjQwLAorCXZpb3RhcGVfQk9URW5jID0gMHgwNjQxLAorCXZpb3RhcGVfQmxhbmtUYXBlID0gMHgwNjQyLAorCXZpb3RhcGVfQnVmZmVyRW1wdHkgPSAweDA2NDMsCisJdmlvdGFwZV9DbGVhbkNhcnRGb3VuZCA9IDB4MDY0NCwKKwl2aW90YXBlX0NtZE5vdEFsbG93ZWQgPSAweDA2NDUsCisJdmlvdGFwZV9DbWROb3RTdXBwb3J0ZWQgPSAweDA2NDYsCisJdmlvdGFwZV9EYXRhQ2hlY2sgPSAweDA2NDcsCisJdmlvdGFwZV9EZWNvbXByZXNzRXJyID0gMHgwNjQ4LAorCXZpb3RhcGVfRGV2aWNlVGltZW91dCA9IDB4MDY0OSwKKwl2aW90YXBlX0RldmljZVVuYXZhaWwgPSAweDA2NGEsCisJdmlvdGFwZV9EZXZpY2VCdXN5ID0gMHgwNjRiLAorCXZpb3RhcGVfRW5kT2ZNZWRpYSA9IDB4MDY0YywKKwl2aW90YXBlX0VuZE9mVGFwZSA9IDB4MDY0ZCwKKwl2aW90YXBlX0VxdWlwQ2hlY2sgPSAweDA2NGUsCisJdmlvdGFwZV9JbnN1ZmZpY2llbnRScyA9IDB4MDY0ZiwKKwl2aW90YXBlX0ludmFsaWRMb2dCbGsgPSAweDA2NTAsCisJdmlvdGFwZV9MZW5ndGhFcnJvciA9IDB4MDY1MSwKKwl2aW90YXBlX0xpYkRvb3JPcGVuID0gMHgwNjUyLAorCXZpb3RhcGVfTG9hZEZhaWx1cmUgPSAweDA2NTMsCisJdmlvdGFwZV9Ob3RDYXBhYmxlID0gMHgwNjU0LAorCXZpb3RhcGVfTm90T3BlcmF0aW9uYWwgPSAweDA2NTUsCisJdmlvdGFwZV9Ob3RSZWFkeSA9IDB4MDY1NiwKKwl2aW90YXBlX09wQ2FuY2VsbGVkID0gMHgwNjU3LAorCXZpb3RhcGVfUGh5TGlua0VyciA9IDB4MDY1OCwKKwl2aW90YXBlX1JkeU5vdEJPVCA9IDB4MDY1OSwKKwl2aW90YXBlX1RhcGVNYXJrID0gMHgwNjVhLAorCXZpb3RhcGVfV3JpdGVQcm90ID0gMHgwNjViCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZpb19lcnJvcl9lbnRyeSB2aW90YXBlX2Vycl90YWJsZVtdID0geworCXsgdmlvdGFwZV9JbnZhbGlkUmFuZ2UsIEVJTywgIkludGVybmFsIGVycm9yIiB9LAorCXsgdmlvdGFwZV9JbnZhbGlkVG9rZW4sIEVJTywgIkludGVybmFsIGVycm9yIiB9LAorCXsgdmlvdGFwZV9ETUFFcnJvciwgRUlPLCAiRE1BIGVycm9yIiB9LAorCXsgdmlvdGFwZV9Vc2VFcnJvciwgRUlPLCAiSW50ZXJuYWwgZXJyb3IiIH0sCisJeyB2aW90YXBlX1JlbGVhc2VFcnJvciwgRUlPLCAiSW50ZXJuYWwgZXJyb3IiIH0sCisJeyB2aW90YXBlX0ludmFsaWRUYXBlLCBFSU8sICJJbnZhbGlkIHRhcGUgZGV2aWNlIiB9LAorCXsgdmlvdGFwZV9JbnZhbGlkT3AsIEVJTywgIkludmFsaWQgb3BlcmF0aW9uIiB9LAorCXsgdmlvdGFwZV9UYXBlRXJyLCBFSU8sICJUYXBlIGVycm9yIiB9LAorCXsgdmlvdGFwZV9BbGxvY1RpbWVkT3V0LCBFQlVTWSwgIkFsbG9jYXRlIHRpbWVkIG91dCIgfSwKKwl7IHZpb3RhcGVfQk9URW5jLCBFSU8sICJCZWdpbm5pbmcgb2YgdGFwZSBlbmNvdW50ZXJlZCIgfSwKKwl7IHZpb3RhcGVfQmxhbmtUYXBlLCBFSU8sICJCbGFuayB0YXBlIiB9LAorCXsgdmlvdGFwZV9CdWZmZXJFbXB0eSwgRUlPLCAiQnVmZmVyIGVtcHR5IiB9LAorCXsgdmlvdGFwZV9DbGVhbkNhcnRGb3VuZCwgRU5PTUVESVVNLCAiQ2xlYW5pbmcgY2FydHJpZGdlIGZvdW5kIiB9LAorCXsgdmlvdGFwZV9DbWROb3RBbGxvd2VkLCBFSU8sICJDb21tYW5kIG5vdCBhbGxvd2VkIiB9LAorCXsgdmlvdGFwZV9DbWROb3RTdXBwb3J0ZWQsIEVJTywgIkNvbW1hbmQgbm90IHN1cHBvcnRlZCIgfSwKKwl7IHZpb3RhcGVfRGF0YUNoZWNrLCBFSU8sICJEYXRhIGNoZWNrIiB9LAorCXsgdmlvdGFwZV9EZWNvbXByZXNzRXJyLCBFSU8sICJEZWNvbXByZXNzaW9uIGVycm9yIiB9LAorCXsgdmlvdGFwZV9EZXZpY2VUaW1lb3V0LCBFQlVTWSwgIkRldmljZSB0aW1lb3V0IiB9LAorCXsgdmlvdGFwZV9EZXZpY2VVbmF2YWlsLCBFSU8sICJEZXZpY2UgdW5hdmFpbGFibGUiIH0sCisJeyB2aW90YXBlX0RldmljZUJ1c3ksIEVCVVNZLCAiRGV2aWNlIGJ1c3kiIH0sCisJeyB2aW90YXBlX0VuZE9mTWVkaWEsIEVOT1NQQywgIkVuZCBvZiBtZWRpYSIgfSwKKwl7IHZpb3RhcGVfRW5kT2ZUYXBlLCBFTk9TUEMsICJFbmQgb2YgdGFwZSIgfSwKKwl7IHZpb3RhcGVfRXF1aXBDaGVjaywgRUlPLCAiRXF1aXBtZW50IGNoZWNrIiB9LAorCXsgdmlvdGFwZV9JbnN1ZmZpY2llbnRScywgRU9WRVJGTE9XLCAiSW5zdWZmaWNpZW50IHRhcGUgcmVzb3VyY2VzIiB9LAorCXsgdmlvdGFwZV9JbnZhbGlkTG9nQmxrLCBFSU8sICJJbnZhbGlkIGxvZ2ljYWwgYmxvY2sgbG9jYXRpb24iIH0sCisJeyB2aW90YXBlX0xlbmd0aEVycm9yLCBFT1ZFUkZMT1csICJMZW5ndGggZXJyb3IiIH0sCisJeyB2aW90YXBlX0xpYkRvb3JPcGVuLCBFQlVTWSwgIkRvb3Igb3BlbiIgfSwKKwl7IHZpb3RhcGVfTG9hZEZhaWx1cmUsIEVOT01FRElVTSwgIkxvYWQgZmFpbHVyZSIgfSwKKwl7IHZpb3RhcGVfTm90Q2FwYWJsZSwgRUlPLCAiTm90IGNhcGFibGUiIH0sCisJeyB2aW90YXBlX05vdE9wZXJhdGlvbmFsLCBFSU8sICJOb3Qgb3BlcmF0aW9uYWwiIH0sCisJeyB2aW90YXBlX05vdFJlYWR5LCBFSU8sICJOb3QgcmVhZHkiIH0sCisJeyB2aW90YXBlX09wQ2FuY2VsbGVkLCBFSU8sICJPcGVyYXRpb24gY2FuY2VsbGVkIiB9LAorCXsgdmlvdGFwZV9QaHlMaW5rRXJyLCBFSU8sICJQaHlzaWNhbCBsaW5rIGVycm9yIiB9LAorCXsgdmlvdGFwZV9SZHlOb3RCT1QsIEVJTywgIlJlYWR5IGJ1dCBub3QgYmVnaW5uaW5nIG9mIHRhcGUiIH0sCisJeyB2aW90YXBlX1RhcGVNYXJrLCBFSU8sICJUYXBlIG1hcmsiIH0sCisJeyB2aW90YXBlX1dyaXRlUHJvdCwgRVJPRlMsICJXcml0ZSBwcm90ZWN0aW9uIGVycm9yIiB9LAorCXsgMCwgMCwgTlVMTCB9LAorfTsKKworLyogTWF4aW11bSBudW1iZXIgb2YgdGFwZXMgd2Ugc3VwcG9ydCAqLworI2RlZmluZSBWSU9UQVBFX01BWF9UQVBFCUhWTUFYQVJDSElURUNURURWSVJUVUFMVEFQRVMKKyNkZWZpbmUgTUFYX1BBUlRJVElPTlMJCTQKKworLyogZGVmaW5lcyBmb3IgY3VycmVudCB0YXBlIHN0YXRlICovCisjZGVmaW5lIFZJT1RfSURMRQkJMAorI2RlZmluZSBWSU9UX1JFQURJTkcJCTEKKyNkZWZpbmUgVklPVF9XUklUSU5HCQkyCisKKy8qIE91ciBpbmZvIG9uIHRoZSB0YXBlcyAqLworc3RydWN0IHRhcGVfZGVzY3IgeworCWNoYXIgcnNyY25hbWVbMTBdOworCWNoYXIgdHlwZVs0XTsKKwljaGFyIG1vZGVsWzNdOworfTsKKworc3RhdGljIHN0cnVjdCB0YXBlX2Rlc2NyICp2aW90YXBlX3VuaXRpbmZvOworc3RhdGljIGRtYV9hZGRyX3QgdmlvdGFwZV91bml0aW5mb190b2tlbjsKKworc3RhdGljIHN0cnVjdCBtdGdldCB2aW9tdGdldFtWSU9UQVBFX01BWF9UQVBFXTsKKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKnRhcGVfY2xhc3M7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICp0YXBlX2RldmljZVtWSU9UQVBFX01BWF9UQVBFXTsKKworLyoKKyAqIG1haW50YWluIHRoZSBjdXJyZW50IHN0YXRlIG9mIGVhY2ggdGFwZSAoYW5kIHBhcnRpdGlvbikKKyAqIHNvIHRoYXQgd2Uga25vdyB3aGVuIHRvIHdyaXRlIEVPRiBtYXJrcy4KKyAqLworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhcgljdXJfcGFydDsKKwlpbnQJCWRldl9oYW5kbGU7CisJdW5zaWduZWQgY2hhcglwYXJ0X3N0YXRfcndpW01BWF9QQVJUSVRJT05TXTsKK30gc3RhdGVbVklPVEFQRV9NQVhfVEFQRV07CisKKy8qIFdlIHNpbmdsZS10aHJlYWQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIHJlcVNlbTsKKworLyoKKyAqIFdoZW4gd2Ugc2VuZCBhIHJlcXVlc3QsIHdlIHVzZSB0aGlzIHN0cnVjdCB0byBnZXQgdGhlIHJlc3BvbnNlIGJhY2sKKyAqIGZyb20gdGhlIGludGVycnVwdCBoYW5kbGVyCisgKi8KK3N0cnVjdCBvcF9zdHJ1Y3QgeworCXZvaWQJCQkqYnVmZmVyOworCWRtYV9hZGRyX3QJCWRtYWFkZHI7CisJc2l6ZV90CQkJY291bnQ7CisJaW50CQkJcmM7CisJaW50CQkJbm9uX2Jsb2NraW5nOworCXN0cnVjdCBjb21wbGV0aW9uCWNvbTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBvcF9zdHJ1Y3QJKm5leHQ7Cit9OworCitzdGF0aWMgc3BpbmxvY2tfdAlvcF9zdHJ1Y3RfbGlzdF9sb2NrOworc3RhdGljIHN0cnVjdCBvcF9zdHJ1Y3QJKm9wX3N0cnVjdF9saXN0OworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIHRvIHJlc29sdmUgaW50ZXJkZXBlbmRlbmNlICovCitzdGF0aWMgaW50IGNoZ19zdGF0ZShpbnQgaW5kZXgsIHVuc2lnbmVkIGNoYXIgbmV3X3N0YXRlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CisKKy8qIHByb2NmcyBzdXBwb3J0ICovCitzdGF0aWMgaW50IHByb2NfdmlvdGFwZV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlpbnQgaTsKKworCXNlcV9wcmludGYobSwgInZpb3RhcGUgZHJpdmVyIHZlcnNpb24gIiBWSU9UQVBFX1ZFUlNJT04gIlxuIik7CisJZm9yIChpID0gMDsgaSA8IHZpb3RhcGVfbnVtZGV2OyBpKyspIHsKKwkJc2VxX3ByaW50ZihtLCAidmlvdGFwZSBkZXZpY2UgJWQgaXMgaVNlcmllcyByZXNvdXJjZSAlMTAuMTBzIgorCQkJCSJ0eXBlICU0LjRzLCBtb2RlbCAlMy4zc1xuIiwKKwkJCQlpLCB2aW90YXBlX3VuaXRpbmZvW2ldLnJzcmNuYW1lLAorCQkJCXZpb3RhcGVfdW5pdGluZm9baV0udHlwZSwKKwkJCQl2aW90YXBlX3VuaXRpbmZvW2ldLm1vZGVsKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY192aW90YXBlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfdmlvdGFwZV9zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY192aW90YXBlX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gcHJvY192aW90YXBlX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKy8qIERlY29kZSB0aGUgZGV2aWNlIG1pbm9yIG51bWJlciBpbnRvIGl0cyBwYXJ0cyAqLwordm9pZCBnZXRfZGV2X2luZm8oc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCB2aW90X2RldmluZm9fc3RydWN0ICpkZXZpKQoreworCWRldmktPmRldm5vID0gaW1pbm9yKGlubykgJiAweDFGOworCWRldmktPm1vZGUgPSAoaW1pbm9yKGlubykgJiAweDYwKSA+PiA1OworCS8qIGlmIGJpdCBpcyBzZXQgaW4gdGhlIG1pbm9yLCBkbyBfbm90XyByZXdpbmQgYXV0b21hdGljYWxseSAqLworCWRldmktPnJld2luZCA9IChpbWlub3IoaW5vKSAmIDB4ODApID09IDA7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIG9ubHkgZnJvbSB0aGUgZXhpdCBhbmQgaW5pdCBwYXRocywgc28gbm8gbmVlZCBmb3IgbG9ja2luZyAqLworc3RhdGljIHZvaWQgY2xlYXJfb3Bfc3RydWN0X3Bvb2wodm9pZCkKK3sKKwl3aGlsZSAob3Bfc3RydWN0X2xpc3QpIHsKKwkJc3RydWN0IG9wX3N0cnVjdCAqdG9GcmVlID0gb3Bfc3RydWN0X2xpc3Q7CisJCW9wX3N0cnVjdF9saXN0ID0gb3Bfc3RydWN0X2xpc3QtPm5leHQ7CisJCWtmcmVlKHRvRnJlZSk7CisJfQorfQorCisvKiBMaWtld2lzZSwgdGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIHRoZSBpbml0IHBhdGggKi8KK3N0YXRpYyBpbnQgYWRkX29wX3N0cnVjdHMoaW50IHN0cnVjdHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3RydWN0czsgKytpKSB7CisJCXN0cnVjdCBvcF9zdHJ1Y3QgKm5ld19zdHJ1Y3QgPQorCQkJa21hbGxvYyhzaXplb2YoKm5ld19zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuZXdfc3RydWN0KSB7CisJCQljbGVhcl9vcF9zdHJ1Y3RfcG9vbCgpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbmV3X3N0cnVjdC0+bmV4dCA9IG9wX3N0cnVjdF9saXN0OworCQlvcF9zdHJ1Y3RfbGlzdCA9IG5ld19zdHJ1Y3Q7CisJfQorCXJldHVybiAwOworfQorCisvKiBBbGxvY2F0ZSBhbiBvcCBzdHJ1Y3R1cmUgZnJvbSBvdXIgcG9vbCAqLworc3RhdGljIHN0cnVjdCBvcF9zdHJ1Y3QgKmdldF9vcF9zdHJ1Y3Qodm9pZCkKK3sKKwlzdHJ1Y3Qgb3Bfc3RydWN0ICpyZXR2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvcF9zdHJ1Y3RfbGlzdF9sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gb3Bfc3RydWN0X2xpc3Q7CisJaWYgKHJldHZhbCkKKwkJb3Bfc3RydWN0X2xpc3QgPSByZXR2YWwtPm5leHQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3Bfc3RydWN0X2xpc3RfbG9jaywgZmxhZ3MpOworCWlmIChyZXR2YWwpIHsKKwkJbWVtc2V0KHJldHZhbCwgMCwgc2l6ZW9mKCpyZXR2YWwpKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZyZXR2YWwtPmNvbSk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogUmV0dXJuIGFuIG9wIHN0cnVjdHVyZSB0byBvdXIgcG9vbCAqLworc3RhdGljIHZvaWQgZnJlZV9vcF9zdHJ1Y3Qoc3RydWN0IG9wX3N0cnVjdCAqb3Bfc3RydWN0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3Bfc3RydWN0X2xpc3RfbG9jaywgZmxhZ3MpOworCW9wX3N0cnVjdC0+bmV4dCA9IG9wX3N0cnVjdF9saXN0OworCW9wX3N0cnVjdF9saXN0ID0gb3Bfc3RydWN0OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wX3N0cnVjdF9saXN0X2xvY2ssIGZsYWdzKTsKK30KKworLyogTWFwIG91ciB0YXBlIHJldHVybiBjb2RlcyB0byBlcnJubyB2YWx1ZXMgKi8KK2ludCB0YXBlX3JjX3RvX2Vycm5vKGludCB0YXBlX3JjLCBjaGFyICpvcGVyYXRpb24sIGludCB0YXBlbm8pCit7CisJY29uc3Qgc3RydWN0IHZpb19lcnJvcl9lbnRyeSAqZXJyOworCisJaWYgKHRhcGVfcmMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwllcnIgPSB2aW9fbG9va3VwX3JjKHZpb3RhcGVfZXJyX3RhYmxlLCB0YXBlX3JjKTsKKwlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gImVycm9yKCVzKSAweCUwNHggb24gRGV2aWNlICVkICglLTEwcyk6ICVzXG4iLAorCQkJb3BlcmF0aW9uLCB0YXBlX3JjLCB0YXBlbm8sCisJCQl2aW90YXBlX3VuaXRpbmZvW3RhcGVub10ucnNyY25hbWUsIGVyci0+bXNnKTsKKwlyZXR1cm4gLWVyci0+ZXJybm87Cit9CisKKy8qIEdldCBpbmZvIG9uIGFsbCB0YXBlcyBmcm9tIE9TLzQwMCAqLworc3RhdGljIGludCBnZXRfdmlvdGFwZV9pbmZvKHZvaWQpCit7CisJSHZMcEV2ZW50X1JjIGh2cmM7CisJaW50IGk7CisJc2l6ZV90IGxlbiA9IHNpemVvZigqdmlvdGFwZV91bml0aW5mbykgKiBWSU9UQVBFX01BWF9UQVBFOworCXN0cnVjdCBvcF9zdHJ1Y3QgKm9wID0gZ2V0X29wX3N0cnVjdCgpOworCisJaWYgKG9wID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdmlvdGFwZV91bml0aW5mbyA9IGRtYV9hbGxvY19jb2hlcmVudChpU2VyaWVzX3Zpb19kZXYsIGxlbiwKKwkJJnZpb3RhcGVfdW5pdGluZm9fdG9rZW4sIEdGUF9BVE9NSUMpOworCWlmICh2aW90YXBlX3VuaXRpbmZvID09IE5VTEwpIHsKKwkJZnJlZV9vcF9zdHJ1Y3Qob3ApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQodmlvdGFwZV91bml0aW5mbywgMCwgbGVuKTsKKworCWh2cmMgPSBIdkNhbGxFdmVudF9zaWduYWxMcEV2ZW50RmFzdCh2aW9wYXRoX2hvc3RMcCwKKwkJCUh2THBFdmVudF9UeXBlX1ZpcnR1YWxJbywKKwkJCXZpb21ham9yc3VidHlwZV90YXBlIHwgdmlvdGFwZWdldGluZm8sCisJCQlIdkxwRXZlbnRfQWNrSW5kX0RvQWNrLCBIdkxwRXZlbnRfQWNrVHlwZV9JbW1lZGlhdGVBY2ssCisJCQl2aW9wYXRoX3NvdXJjZWluc3QodmlvcGF0aF9ob3N0THApLAorCQkJdmlvcGF0aF90YXJnZXRpbnN0KHZpb3BhdGhfaG9zdExwKSwKKwkJCSh1NjQpICh1bnNpZ25lZCBsb25nKSBvcCwgVklPVkVSU0lPTiA8PCAxNiwKKwkJCXZpb3RhcGVfdW5pdGluZm9fdG9rZW4sIGxlbiwgMCwgMCk7CisJaWYgKGh2cmMgIT0gSHZMcEV2ZW50X1JjX0dvb2QpIHsKKwkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJodiBlcnJvciBvbiBvcCAlZFxuIiwKKwkJCQkoaW50KWh2cmMpOworCQlmcmVlX29wX3N0cnVjdChvcCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJm9wLT5jb20pOworCisJZnJlZV9vcF9zdHJ1Y3Qob3ApOworCisJZm9yIChpID0gMDsKKwkgICAgICgoaSA8IFZJT1RBUEVfTUFYX1RBUEUpICYmICh2aW90YXBlX3VuaXRpbmZvW2ldLnJzcmNuYW1lWzBdKSk7CisJICAgICBpKyspCisJCXZpb3RhcGVfbnVtZGV2Kys7CisJcmV0dXJuIDA7Cit9CisKKworLyogV3JpdGUgKi8KK3N0YXRpYyBzc2l6ZV90IHZpb3RhcF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJSHZMcEV2ZW50X1JjIGh2cmM7CisJdW5zaWduZWQgc2hvcnQgZmxhZ3MgPSBmaWxlLT5mX2ZsYWdzOworCWludCBub2Jsb2NrID0gKChmbGFncyAmIE9fTk9OQkxPQ0spICE9IDApOworCXNzaXplX3QgcmV0OworCXN0cnVjdCB2aW90X2RldmluZm9fc3RydWN0IGRldmk7CisJc3RydWN0IG9wX3N0cnVjdCAqb3AgPSBnZXRfb3Bfc3RydWN0KCk7CisKKwlpZiAob3AgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnZXRfZGV2X2luZm8oZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsICZkZXZpKTsKKworCS8qCisJICogV2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgY2FuIHNlbmQgYSByZXF1ZXN0LiAgV2UgdXNlCisJICogYSBzZW1hcGhvcmUgdG8ga2VlcCB0cmFjayBvZiAjIHJlcXVlc3RzIGluIHVzZS4gIElmCisJICogd2UgYXJlIG5vbi1ibG9ja2luZywgbWFrZSBzdXJlIHdlIGRvbid0IGJsb2NrIG9uIHRoZQorCSAqIHNlbWFwaG9yZQorCSAqLworCWlmIChub2Jsb2NrKSB7CisJCWlmIChkb3duX3RyeWxvY2soJnJlcVNlbSkpIHsKKwkJCXJldCA9IC1FV09VTERCTE9DSzsKKwkJCWdvdG8gZnJlZV9vcDsKKwkJfQorCX0gZWxzZQorCQlkb3duKCZyZXFTZW0pOworCisJLyogQWxsb2NhdGUgYSBETUEgYnVmZmVyICovCisJb3AtPmRldiA9IHRhcGVfZGV2aWNlW2RldmkuZGV2bm9dOworCW9wLT5idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQob3AtPmRldiwgY291bnQsICZvcC0+ZG1hYWRkciwKKwkJCUdGUF9BVE9NSUMpOworCisJaWYgKG9wLT5idWZmZXIgPT0gTlVMTCkgeworCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4KKwkJCQkiZXJyb3IgYWxsb2NhdGluZyBkbWEgYnVmZmVyIGZvciBsZW4gJWxkXG4iLAorCQkJCWNvdW50KTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byB1cF9zZW07CisJfQorCisJLyogQ29weSB0aGUgZGF0YSBpbnRvIHRoZSBidWZmZXIgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIob3AtPmJ1ZmZlciwgYnVmLCBjb3VudCkpIHsKKwkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJ0YXBlOiBlcnJvciBvbiBjb3B5IGZyb20gdXNlclxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZnJlZV9kbWE7CisJfQorCisJb3AtPm5vbl9ibG9ja2luZyA9IG5vYmxvY2s7CisJaW5pdF9jb21wbGV0aW9uKCZvcC0+Y29tKTsKKwlvcC0+Y291bnQgPSBjb3VudDsKKworCWh2cmMgPSBIdkNhbGxFdmVudF9zaWduYWxMcEV2ZW50RmFzdCh2aW9wYXRoX2hvc3RMcCwKKwkJCUh2THBFdmVudF9UeXBlX1ZpcnR1YWxJbywKKwkJCXZpb21ham9yc3VidHlwZV90YXBlIHwgdmlvdGFwZXdyaXRlLAorCQkJSHZMcEV2ZW50X0Fja0luZF9Eb0FjaywgSHZMcEV2ZW50X0Fja1R5cGVfSW1tZWRpYXRlQWNrLAorCQkJdmlvcGF0aF9zb3VyY2VpbnN0KHZpb3BhdGhfaG9zdExwKSwKKwkJCXZpb3BhdGhfdGFyZ2V0aW5zdCh2aW9wYXRoX2hvc3RMcCksCisJCQkodTY0KSh1bnNpZ25lZCBsb25nKW9wLCBWSU9WRVJTSU9OIDw8IDE2LAorCQkJKCh1NjQpZGV2aS5kZXZubyA8PCA0OCkgfCBvcC0+ZG1hYWRkciwgY291bnQsIDAsIDApOworCWlmIChodnJjICE9IEh2THBFdmVudF9SY19Hb29kKSB7CisJCXByaW50ayhWSU9UQVBFX0tFUk5fV0FSTiAiaHYgZXJyb3Igb24gb3AgJWRcbiIsCisJCQkJKGludClodnJjKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBmcmVlX2RtYTsKKwl9CisKKwlpZiAobm9ibG9jaykKKwkJcmV0dXJuIGNvdW50OworCisJd2FpdF9mb3JfY29tcGxldGlvbigmb3AtPmNvbSk7CisKKwlpZiAob3AtPnJjKQorCQlyZXQgPSB0YXBlX3JjX3RvX2Vycm5vKG9wLT5yYywgIndyaXRlIiwgZGV2aS5kZXZubyk7CisJZWxzZSB7CisJCWNoZ19zdGF0ZShkZXZpLmRldm5vLCBWSU9UX1dSSVRJTkcsIGZpbGUpOworCQlyZXQgPSBvcC0+Y291bnQ7CisJfQorCitmcmVlX2RtYToKKwlkbWFfZnJlZV9jb2hlcmVudChvcC0+ZGV2LCBjb3VudCwgb3AtPmJ1ZmZlciwgb3AtPmRtYWFkZHIpOwordXBfc2VtOgorCXVwKCZyZXFTZW0pOworZnJlZV9vcDoKKwlmcmVlX29wX3N0cnVjdChvcCk7CisJcmV0dXJuIHJldDsKK30KKworLyogcmVhZCAqLworc3RhdGljIHNzaXplX3QgdmlvdGFwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQlsb2ZmX3QgKnB0cikKK3sKKwlIdkxwRXZlbnRfUmMgaHZyYzsKKwl1bnNpZ25lZCBzaG9ydCBmbGFncyA9IGZpbGUtPmZfZmxhZ3M7CisJc3RydWN0IG9wX3N0cnVjdCAqb3AgPSBnZXRfb3Bfc3RydWN0KCk7CisJaW50IG5vYmxvY2sgPSAoKGZsYWdzICYgT19OT05CTE9DSykgIT0gMCk7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IHZpb3RfZGV2aW5mb19zdHJ1Y3QgZGV2aTsKKworCWlmIChvcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWdldF9kZXZfaW5mbyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgJmRldmkpOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBjYW4gc2VuZCBhIHJlcXVlc3QuICBXZSB1c2UKKwkgKiBhIHNlbWFwaG9yZSB0byBrZWVwIHRyYWNrIG9mICMgcmVxdWVzdHMgaW4gdXNlLiAgSWYKKwkgKiB3ZSBhcmUgbm9uLWJsb2NraW5nLCBtYWtlIHN1cmUgd2UgZG9uJ3QgYmxvY2sgb24gdGhlCisJICogc2VtYXBob3JlCisJICovCisJaWYgKG5vYmxvY2spIHsKKwkJaWYgKGRvd25fdHJ5bG9jaygmcmVxU2VtKSkgeworCQkJcmV0ID0gLUVXT1VMREJMT0NLOworCQkJZ290byBmcmVlX29wOworCQl9CisJfSBlbHNlCisJCWRvd24oJnJlcVNlbSk7CisKKwljaGdfc3RhdGUoZGV2aS5kZXZubywgVklPVF9SRUFESU5HLCBmaWxlKTsKKworCS8qIEFsbG9jYXRlIGEgRE1BIGJ1ZmZlciAqLworCW9wLT5kZXYgPSB0YXBlX2RldmljZVtkZXZpLmRldm5vXTsKKwlvcC0+YnVmZmVyID0gZG1hX2FsbG9jX2NvaGVyZW50KG9wLT5kZXYsIGNvdW50LCAmb3AtPmRtYWFkZHIsCisJCQlHRlBfQVRPTUlDKTsKKwlpZiAob3AtPmJ1ZmZlciA9PSBOVUxMKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gdXBfc2VtOworCX0KKworCW9wLT5jb3VudCA9IGNvdW50OworCWluaXRfY29tcGxldGlvbigmb3AtPmNvbSk7CisKKwlodnJjID0gSHZDYWxsRXZlbnRfc2lnbmFsTHBFdmVudEZhc3QodmlvcGF0aF9ob3N0THAsCisJCQlIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsSW8sCisJCQl2aW9tYWpvcnN1YnR5cGVfdGFwZSB8IHZpb3RhcGVyZWFkLAorCQkJSHZMcEV2ZW50X0Fja0luZF9Eb0FjaywgSHZMcEV2ZW50X0Fja1R5cGVfSW1tZWRpYXRlQWNrLAorCQkJdmlvcGF0aF9zb3VyY2VpbnN0KHZpb3BhdGhfaG9zdExwKSwKKwkJCXZpb3BhdGhfdGFyZ2V0aW5zdCh2aW9wYXRoX2hvc3RMcCksCisJCQkodTY0KSh1bnNpZ25lZCBsb25nKW9wLCBWSU9WRVJTSU9OIDw8IDE2LAorCQkJKCh1NjQpZGV2aS5kZXZubyA8PCA0OCkgfCBvcC0+ZG1hYWRkciwgY291bnQsIDAsIDApOworCWlmIChodnJjICE9IEh2THBFdmVudF9SY19Hb29kKSB7CisJCXByaW50ayhWSU9UQVBFX0tFUk5fV0FSTiAidGFwZSBodiBlcnJvciBvbiBvcCAlZFxuIiwKKwkJCQkoaW50KWh2cmMpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGZyZWVfZG1hOworCX0KKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJm9wLT5jb20pOworCisJaWYgKG9wLT5yYykKKwkJcmV0ID0gdGFwZV9yY190b19lcnJubyhvcC0+cmMsICJyZWFkIiwgZGV2aS5kZXZubyk7CisJZWxzZSB7CisJCXJldCA9IG9wLT5jb3VudDsKKwkJaWYgKHJldCAmJiBjb3B5X3RvX3VzZXIoYnVmLCBvcC0+YnVmZmVyLCByZXQpKSB7CisJCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gImVycm9yIG9uIGNvcHlfdG9fdXNlclxuIik7CisJCQlyZXQgPSAtRUZBVUxUOworCQl9CisJfQorCitmcmVlX2RtYToKKwlkbWFfZnJlZV9jb2hlcmVudChvcC0+ZGV2LCBjb3VudCwgb3AtPmJ1ZmZlciwgb3AtPmRtYWFkZHIpOwordXBfc2VtOgorCXVwKCZyZXFTZW0pOworZnJlZV9vcDoKKwlmcmVlX29wX3N0cnVjdChvcCk7CisJcmV0dXJuIHJldDsKK30KKworLyogaW9jdGwgKi8KK3N0YXRpYyBpbnQgdmlvdGFwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlIdkxwRXZlbnRfUmMgaHZyYzsKKwlpbnQgcmV0OworCXN0cnVjdCB2aW90X2RldmluZm9fc3RydWN0IGRldmk7CisJc3RydWN0IG10b3AgbXRjOworCXUzMiBteU9wOworCXN0cnVjdCBvcF9zdHJ1Y3QgKm9wID0gZ2V0X29wX3N0cnVjdCgpOworCisJaWYgKG9wID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZ2V0X2Rldl9pbmZvKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCAmZGV2aSk7CisKKwlkb3duKCZyZXFTZW0pOworCisJcmV0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNVElPQ1RPUDoKKwkJcmV0ID0gLUVGQVVMVDsKKwkJLyoKKwkJICogaW5vZGUgaXMgbnVsbCBpZiBhbmQgb25seSBpZiB3ZSAodGhlIGtlcm5lbCkKKwkJICogbWFkZSB0aGUgcmVxdWVzdAorCQkgKi8KKwkJaWYgKGlub2RlID09IE5VTEwpCisJCQltZW1jcHkoJm10YywgKHZvaWQgKikgYXJnLCBzaXplb2Yoc3RydWN0IG10b3ApKTsKKwkJZWxzZSBpZiAoY29weV9mcm9tX3VzZXIoKGNoYXIgKikmbXRjLCAoY2hhciAqKWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBtdG9wKSkpCisJCQlnb3RvIGZyZWVfb3A7CisKKwkJcmV0ID0gLUVJTzsKKwkJc3dpdGNoIChtdGMubXRfb3ApIHsKKwkJY2FzZSBNVFJFU0VUOgorCQkJbXlPcCA9IFZJT1RBUE9QX1JFU0VUOworCQkJYnJlYWs7CisJCWNhc2UgTVRGU0Y6CisJCQlteU9wID0gVklPVEFQT1BfRlNGOworCQkJYnJlYWs7CisJCWNhc2UgTVRCU0Y6CisJCQlteU9wID0gVklPVEFQT1BfQlNGOworCQkJYnJlYWs7CisJCWNhc2UgTVRGU1I6CisJCQlteU9wID0gVklPVEFQT1BfRlNSOworCQkJYnJlYWs7CisJCWNhc2UgTVRCU1I6CisJCQlteU9wID0gVklPVEFQT1BfQlNSOworCQkJYnJlYWs7CisJCWNhc2UgTVRXRU9GOgorCQkJbXlPcCA9IFZJT1RBUE9QX1dFT0Y7CisJCQlicmVhazsKKwkJY2FzZSBNVFJFVzoKKwkJCW15T3AgPSBWSU9UQVBPUF9SRVc7CisJCQlicmVhazsKKwkJY2FzZSBNVE5PUDoKKwkJCW15T3AgPSBWSU9UQVBPUF9OT1A7CisJCQlicmVhazsKKwkJY2FzZSBNVEVPTToKKwkJCW15T3AgPSBWSU9UQVBPUF9FT007CisJCQlicmVhazsKKwkJY2FzZSBNVEVSQVNFOgorCQkJbXlPcCA9IFZJT1RBUE9QX0VSQVNFOworCQkJYnJlYWs7CisJCWNhc2UgTVRTRVRCTEs6CisJCQlteU9wID0gVklPVEFQT1BfU0VUQkxLOworCQkJYnJlYWs7CisJCWNhc2UgTVRTRVRERU5TSVRZOgorCQkJbXlPcCA9IFZJT1RBUE9QX1NFVERFTlNJVFk7CisJCQlicmVhazsKKwkJY2FzZSBNVFRFTEw6CisJCQlteU9wID0gVklPVEFQT1BfR0VUUE9TOworCQkJYnJlYWs7CisJCWNhc2UgTVRTRUVLOgorCQkJbXlPcCA9IFZJT1RBUE9QX1NFVFBPUzsKKwkJCWJyZWFrOworCQljYXNlIE1UU0VUUEFSVDoKKwkJCW15T3AgPSBWSU9UQVBPUF9TRVRQQVJUOworCQkJYnJlYWs7CisJCWNhc2UgTVRPRkZMOgorCQkJbXlPcCA9IFZJT1RBUE9QX1VOTE9BRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJNVElPQ1RPUCBjYWxsZWQgIgorCQkJCQkid2l0aCBpbnZhbGlkIG9wIDB4JXhcbiIsIG10Yy5tdF9vcCk7CisJCQlnb3RvIGZyZWVfb3A7CisJCX0KKworCQkvKgorCQkgKiBpZiB3ZSBtb3ZlZCB0aGUgaGVhZCwgd2UgYXJlIG5vIGxvbmdlcgorCQkgKiByZWFkaW5nIG9yIHdyaXRpbmcKKwkJICovCisJCXN3aXRjaCAobXRjLm10X29wKSB7CisJCWNhc2UgTVRGU0Y6CisJCWNhc2UgTVRCU0Y6CisJCWNhc2UgTVRGU1I6CisJCWNhc2UgTVRCU1I6CisJCWNhc2UgTVRURUxMOgorCQljYXNlIE1UU0VFSzoKKwkJY2FzZSBNVFJFVzoKKwkJCWNoZ19zdGF0ZShkZXZpLmRldm5vLCBWSU9UX0lETEUsIGZpbGUpOworCQl9CisKKwkJaW5pdF9jb21wbGV0aW9uKCZvcC0+Y29tKTsKKwkJaHZyYyA9IEh2Q2FsbEV2ZW50X3NpZ25hbExwRXZlbnRGYXN0KHZpb3BhdGhfaG9zdExwLAorCQkJCUh2THBFdmVudF9UeXBlX1ZpcnR1YWxJbywKKwkJCQl2aW9tYWpvcnN1YnR5cGVfdGFwZSB8IHZpb3RhcGVvcCwKKwkJCQlIdkxwRXZlbnRfQWNrSW5kX0RvQWNrLAorCQkJCUh2THBFdmVudF9BY2tUeXBlX0ltbWVkaWF0ZUFjaywKKwkJCQl2aW9wYXRoX3NvdXJjZWluc3QodmlvcGF0aF9ob3N0THApLAorCQkJCXZpb3BhdGhfdGFyZ2V0aW5zdCh2aW9wYXRoX2hvc3RMcCksCisJCQkJKHU2NCkodW5zaWduZWQgbG9uZylvcCwKKwkJCQlWSU9WRVJTSU9OIDw8IDE2LAorCQkJCSgodTY0KWRldmkuZGV2bm8gPDwgNDgpLCAwLAorCQkJCSgoKHU2NClteU9wKSA8PCAzMikgfCBtdGMubXRfY291bnQsIDApOworCQlpZiAoaHZyYyAhPSBIdkxwRXZlbnRfUmNfR29vZCkgeworCQkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJodiBlcnJvciBvbiBvcCAlZFxuIiwKKwkJCQkJKGludClodnJjKTsKKwkJCWdvdG8gZnJlZV9vcDsKKwkJfQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZvcC0+Y29tKTsKKwkJcmV0ID0gdGFwZV9yY190b19lcnJubyhvcC0+cmMsICJ0YXBlIG9wZXJhdGlvbiIsIGRldmkuZGV2bm8pOworCQlnb3RvIGZyZWVfb3A7CisKKwljYXNlIE1USU9DR0VUOgorCQlyZXQgPSAtRUlPOworCQlpbml0X2NvbXBsZXRpb24oJm9wLT5jb20pOworCQlodnJjID0gSHZDYWxsRXZlbnRfc2lnbmFsTHBFdmVudEZhc3QodmlvcGF0aF9ob3N0THAsCisJCQkJSHZMcEV2ZW50X1R5cGVfVmlydHVhbElvLAorCQkJCXZpb21ham9yc3VidHlwZV90YXBlIHwgdmlvdGFwZWdldHN0YXR1cywKKwkJCQlIdkxwRXZlbnRfQWNrSW5kX0RvQWNrLAorCQkJCUh2THBFdmVudF9BY2tUeXBlX0ltbWVkaWF0ZUFjaywKKwkJCQl2aW9wYXRoX3NvdXJjZWluc3QodmlvcGF0aF9ob3N0THApLAorCQkJCXZpb3BhdGhfdGFyZ2V0aW5zdCh2aW9wYXRoX2hvc3RMcCksCisJCQkJKHU2NCkodW5zaWduZWQgbG9uZylvcCwgVklPVkVSU0lPTiA8PCAxNiwKKwkJCQkoKHU2NClkZXZpLmRldm5vIDw8IDQ4KSwgMCwgMCwgMCk7CisJCWlmIChodnJjICE9IEh2THBFdmVudF9SY19Hb29kKSB7CisJCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gImh2IGVycm9yIG9uIG9wICVkXG4iLAorCQkJCQkoaW50KWh2cmMpOworCQkJZ290byBmcmVlX29wOworCQl9CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJm9wLT5jb20pOworCisJCS8qIE9wZXJhdGlvbiBpcyBjb21wbGV0ZSAtIGdyYWIgdGhlIGVycm9yIGNvZGUgKi8KKwkJcmV0ID0gdGFwZV9yY190b19lcnJubyhvcC0+cmMsICJnZXQgc3RhdHVzIiwgZGV2aS5kZXZubyk7CisJCWZyZWVfb3Bfc3RydWN0KG9wKTsKKwkJdXAoJnJlcVNlbSk7CisKKwkJaWYgKChyZXQgPT0gMCkgJiYgY29weV90b191c2VyKCh2b2lkICopYXJnLAorCQkJCQkmdmlvbXRnZXRbZGV2aS5kZXZub10sCisJCQkJCXNpemVvZih2aW9tdGdldFswXSkpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJcmV0dXJuIHJldDsKKwljYXNlIE1USU9DUE9TOgorCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gIkdvdCBhbiAodW5zdXBwb3J0ZWQpIE1USU9DUE9TXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJnb3QgYW4gdW5zdXBwb3J0ZWQgaW9jdGwgMHglMHhcbiIsCisJCQkJY21kKTsKKwkJYnJlYWs7CisJfQorCitmcmVlX29wOgorCWZyZWVfb3Bfc3RydWN0KG9wKTsKKwl1cCgmcmVxU2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZpb3RhcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCUh2THBFdmVudF9SYyBodnJjOworCXN0cnVjdCB2aW90X2RldmluZm9fc3RydWN0IGRldmk7CisJaW50IHJldDsKKwlzdHJ1Y3Qgb3Bfc3RydWN0ICpvcCA9IGdldF9vcF9zdHJ1Y3QoKTsKKworCWlmIChvcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWdldF9kZXZfaW5mbyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgJmRldmkpOworCisJLyogTm90ZTogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBvbmUgbW9kZSEgKi8KKwlpZiAoKGRldmkuZGV2bm8gPj0gdmlvdGFwZV9udW1kZXYpIHx8IChkZXZpLm1vZGUpKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9vcDsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJm9wLT5jb20pOworCisJaHZyYyA9IEh2Q2FsbEV2ZW50X3NpZ25hbExwRXZlbnRGYXN0KHZpb3BhdGhfaG9zdExwLAorCQkJSHZMcEV2ZW50X1R5cGVfVmlydHVhbElvLAorCQkJdmlvbWFqb3JzdWJ0eXBlX3RhcGUgfCB2aW90YXBlb3BlbiwKKwkJCUh2THBFdmVudF9BY2tJbmRfRG9BY2ssIEh2THBFdmVudF9BY2tUeXBlX0ltbWVkaWF0ZUFjaywKKwkJCXZpb3BhdGhfc291cmNlaW5zdCh2aW9wYXRoX2hvc3RMcCksCisJCQl2aW9wYXRoX3RhcmdldGluc3QodmlvcGF0aF9ob3N0THApLAorCQkJKHU2NCkodW5zaWduZWQgbG9uZylvcCwgVklPVkVSU0lPTiA8PCAxNiwKKwkJCSgodTY0KWRldmkuZGV2bm8gPDwgNDgpLCAwLCAwLCAwKTsKKwlpZiAoaHZyYyAhPSAwKSB7CisJCXByaW50ayhWSU9UQVBFX0tFUk5fV0FSTiAiYmFkIHJjIG9uIHNpZ25hbExwRXZlbnQgJWRcbiIsCisJCQkJKGludCkgaHZyYyk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZnJlZV9vcDsKKwl9CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZvcC0+Y29tKTsKKwlyZXQgPSB0YXBlX3JjX3RvX2Vycm5vKG9wLT5yYywgIm9wZW4iLCBkZXZpLmRldm5vKTsKKworZnJlZV9vcDoKKwlmcmVlX29wX3N0cnVjdChvcCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHZpb3RhcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCUh2THBFdmVudF9SYyBodnJjOworCXN0cnVjdCB2aW90X2RldmluZm9fc3RydWN0IGRldmk7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG9wX3N0cnVjdCAqb3AgPSBnZXRfb3Bfc3RydWN0KCk7CisKKwlpZiAob3AgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaW5pdF9jb21wbGV0aW9uKCZvcC0+Y29tKTsKKworCWdldF9kZXZfaW5mbyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgJmRldmkpOworCisJaWYgKGRldmkuZGV2bm8gPj0gdmlvdGFwZV9udW1kZXYpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX29wOworCX0KKworCWNoZ19zdGF0ZShkZXZpLmRldm5vLCBWSU9UX0lETEUsIGZpbGUpOworCisJaWYgKGRldmkucmV3aW5kKSB7CisJCWh2cmMgPSBIdkNhbGxFdmVudF9zaWduYWxMcEV2ZW50RmFzdCh2aW9wYXRoX2hvc3RMcCwKKwkJCQlIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsSW8sCisJCQkJdmlvbWFqb3JzdWJ0eXBlX3RhcGUgfCB2aW90YXBlb3AsCisJCQkJSHZMcEV2ZW50X0Fja0luZF9Eb0FjaywKKwkJCQlIdkxwRXZlbnRfQWNrVHlwZV9JbW1lZGlhdGVBY2ssCisJCQkJdmlvcGF0aF9zb3VyY2VpbnN0KHZpb3BhdGhfaG9zdExwKSwKKwkJCQl2aW9wYXRoX3RhcmdldGluc3QodmlvcGF0aF9ob3N0THApLAorCQkJCSh1NjQpKHVuc2lnbmVkIGxvbmcpb3AsIFZJT1ZFUlNJT04gPDwgMTYsCisJCQkJKCh1NjQpZGV2aS5kZXZubyA8PCA0OCksIDAsCisJCQkJKCh1NjQpVklPVEFQT1BfUkVXKSA8PCAzMiwgMCk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJm9wLT5jb20pOworCisJCXRhcGVfcmNfdG9fZXJybm8ob3AtPnJjLCAicmV3aW5kIiwgZGV2aS5kZXZubyk7CisJfQorCisJaHZyYyA9IEh2Q2FsbEV2ZW50X3NpZ25hbExwRXZlbnRGYXN0KHZpb3BhdGhfaG9zdExwLAorCQkJSHZMcEV2ZW50X1R5cGVfVmlydHVhbElvLAorCQkJdmlvbWFqb3JzdWJ0eXBlX3RhcGUgfCB2aW90YXBlY2xvc2UsCisJCQlIdkxwRXZlbnRfQWNrSW5kX0RvQWNrLCBIdkxwRXZlbnRfQWNrVHlwZV9JbW1lZGlhdGVBY2ssCisJCQl2aW9wYXRoX3NvdXJjZWluc3QodmlvcGF0aF9ob3N0THApLAorCQkJdmlvcGF0aF90YXJnZXRpbnN0KHZpb3BhdGhfaG9zdExwKSwKKwkJCSh1NjQpKHVuc2lnbmVkIGxvbmcpb3AsIFZJT1ZFUlNJT04gPDwgMTYsCisJCQkoKHU2NClkZXZpLmRldm5vIDw8IDQ4KSwgMCwgMCwgMCk7CisJaWYgKGh2cmMgIT0gMCkgeworCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gImJhZCByYyBvbiBzaWduYWxMcEV2ZW50ICVkXG4iLAorCQkJCShpbnQpIGh2cmMpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGZyZWVfb3A7CisJfQorCisJd2FpdF9mb3JfY29tcGxldGlvbigmb3AtPmNvbSk7CisKKwlpZiAob3AtPnJjKQorCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gImNsb3NlIGZhaWxlZFxuIik7CisKK2ZyZWVfb3A6CisJZnJlZV9vcF9zdHJ1Y3Qob3ApOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmlvdGFwX2ZvcHMgPSB7CisJb3duZXI6IFRISVNfTU9EVUxFLAorCXJlYWQ6IHZpb3RhcF9yZWFkLAorCXdyaXRlOiB2aW90YXBfd3JpdGUsCisJaW9jdGw6IHZpb3RhcF9pb2N0bCwKKwlvcGVuOiB2aW90YXBfb3BlbiwKKwlyZWxlYXNlOiB2aW90YXBfcmVsZWFzZSwKK307CisKKy8qIEhhbmRsZSBpbnRlcnJ1cHQgZXZlbnRzIGZvciB0YXBlICovCitzdGF0aWMgdm9pZCB2aW9IYW5kbGVUYXBlRXZlbnQoc3RydWN0IEh2THBFdmVudCAqZXZlbnQpCit7CisJaW50IHRhcGVtaW5vcjsKKwlzdHJ1Y3Qgb3Bfc3RydWN0ICpvcDsKKwlzdHJ1Y3QgdmlvdGFwZWxwZXZlbnQgKnRldmVudCA9IChzdHJ1Y3QgdmlvdGFwZWxwZXZlbnQgKilldmVudDsKKworCWlmIChldmVudCA9PSBOVUxMKSB7CisJCS8qIE5vdGlmaWNhdGlvbiB0aGF0IGEgcGFydGl0aW9uIHdlbnQgYXdheSEgKi8KKwkJaWYgKCF2aW9wYXRoX2lzYWN0aXZlKHZpb3BhdGhfaG9zdExwKSkgeworCQkJLyogVE9ETyEgQ2xlYW4gdXAgKi8KKwkJfQorCQlyZXR1cm47CisJfQorCisJdGFwZW1pbm9yID0gZXZlbnQtPnhTdWJ0eXBlICYgVklPTUlOT1JfU1VCVFlQRV9NQVNLOworCW9wID0gKHN0cnVjdCBvcF9zdHJ1Y3QgKilldmVudC0+eENvcnJlbGF0aW9uVG9rZW47CisJc3dpdGNoICh0YXBlbWlub3IpIHsKKwljYXNlIHZpb3RhcGVnZXRpbmZvOgorCWNhc2UgdmlvdGFwZW9wZW46CisJY2FzZSB2aW90YXBlY2xvc2U6CisJCW9wLT5yYyA9IHRldmVudC0+c3ViX3R5cGVfcmVzdWx0OworCQljb21wbGV0ZSgmb3AtPmNvbSk7CisJCWJyZWFrOworCWNhc2UgdmlvdGFwZXJlYWQ6CisJCW9wLT5yYyA9IHRldmVudC0+c3ViX3R5cGVfcmVzdWx0OworCQlvcC0+Y291bnQgPSB0ZXZlbnQtPmxlbjsKKwkJY29tcGxldGUoJm9wLT5jb20pOworCQlicmVhazsKKwljYXNlIHZpb3RhcGV3cml0ZToKKwkJaWYgKG9wLT5ub25fYmxvY2tpbmcpIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KG9wLT5kZXYsIG9wLT5jb3VudCwKKwkJCQkJb3AtPmJ1ZmZlciwgb3AtPmRtYWFkZHIpOworCQkJZnJlZV9vcF9zdHJ1Y3Qob3ApOworCQkJdXAoJnJlcVNlbSk7CisJCX0gZWxzZSB7CisJCQlvcC0+cmMgPSB0ZXZlbnQtPnN1Yl90eXBlX3Jlc3VsdDsKKwkJCW9wLT5jb3VudCA9IHRldmVudC0+bGVuOworCQkJY29tcGxldGUoJm9wLT5jb20pOworCQl9CisJCWJyZWFrOworCWNhc2UgdmlvdGFwZW9wOgorCWNhc2UgdmlvdGFwZWdldHBvczoKKwljYXNlIHZpb3RhcGVzZXRwb3M6CisJY2FzZSB2aW90YXBlZ2V0c3RhdHVzOgorCQlpZiAob3ApIHsKKwkJCW9wLT5jb3VudCA9IHRldmVudC0+dS5vcC5jb3VudDsKKwkJCW9wLT5yYyA9IHRldmVudC0+c3ViX3R5cGVfcmVzdWx0OworCQkJaWYgKCFvcC0+bm9uX2Jsb2NraW5nKQorCQkJCWNvbXBsZXRlKCZvcC0+Y29tKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gIndlaXJkIGFja1xuIik7CisJfQorfQorCitzdGF0aWMgaW50IHZpb3RhcGVfcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwljaGFyIHRhcGVuYW1lWzMyXTsKKwlpbnQgaSA9IHZkZXYtPnVuaXRfYWRkcmVzczsKKwlpbnQgajsKKworCWlmIChpID49IHZpb3RhcGVfbnVtZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXRhcGVfZGV2aWNlW2ldID0gJnZkZXYtPmRldjsKKworCXN0YXRlW2ldLmN1cl9wYXJ0ID0gMDsKKwlmb3IgKGogPSAwOyBqIDwgTUFYX1BBUlRJVElPTlM7ICsraikKKwkJc3RhdGVbaV0ucGFydF9zdGF0X3J3aVtqXSA9IFZJT1RfSURMRTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh0YXBlX2NsYXNzLCBNS0RFVihWSU9UQVBFX01BSk9SLCBpKSwgTlVMTCwKKwkJCSJpc2VyaWVzIXZ0JWQiLCBpKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZCh0YXBlX2NsYXNzLCBNS0RFVihWSU9UQVBFX01BSk9SLCBpIHwgMHg4MCksCisJCQlOVUxMLCAiaXNlcmllcyFudnQlZCIsIGkpOworCWRldmZzX21rX2NkZXYoTUtERVYoVklPVEFQRV9NQUpPUiwgaSksIFNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCSJpc2VyaWVzL3Z0JWQiLCBpKTsKKwlkZXZmc19ta19jZGV2KE1LREVWKFZJT1RBUEVfTUFKT1IsIGkgfCAweDgwKSwKKwkJCVNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiwgImlzZXJpZXMvbnZ0JWQiLCBpKTsKKwlzcHJpbnRmKHRhcGVuYW1lLCAiaXNlcmllcy92dCVkIiwgaSk7CisJc3RhdGVbaV0uZGV2X2hhbmRsZSA9IGRldmZzX3JlZ2lzdGVyX3RhcGUodGFwZW5hbWUpOworCXByaW50ayhWSU9UQVBFX0tFUk5fSU5GTyAidGFwZSAlcyBpcyBpU2VyaWVzICIKKwkJCSJyZXNvdXJjZSAlMTAuMTBzIHR5cGUgJTQuNHMsIG1vZGVsICUzLjNzXG4iLAorCQkJdGFwZW5hbWUsIHZpb3RhcGVfdW5pdGluZm9baV0ucnNyY25hbWUsCisJCQl2aW90YXBlX3VuaXRpbmZvW2ldLnR5cGUsIHZpb3RhcGVfdW5pdGluZm9baV0ubW9kZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpb3RhcGVfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCWludCBpID0gdmRldi0+dW5pdF9hZGRyZXNzOworCisJZGV2ZnNfcmVtb3ZlKCJpc2VyaWVzL252dCVkIiwgaSk7CisJZGV2ZnNfcmVtb3ZlKCJpc2VyaWVzL3Z0JWQiLCBpKTsKKwlkZXZmc191bnJlZ2lzdGVyX3RhcGUoc3RhdGVbaV0uZGV2X2hhbmRsZSk7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoVklPVEFQRV9NQUpPUiwgaSB8IDB4ODApKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihWSU9UQVBFX01BSk9SLCBpKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdmlvdGFwZV9kZXZpY2VfdGFibGU6IFVzZWQgYnkgdmlvLmMgdG8gbWF0Y2ggZGV2aWNlcyB0aGF0IHdlCisgKiBzdXBwb3J0LgorICovCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgdmlvdGFwZV9kZXZpY2VfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsgInZpb3RhcGUiLCAiIiB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIHZpb3RhcGVfZGV2aWNlX3RhYmxlKTsKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciB2aW90YXBlX2RyaXZlciA9IHsKKwkubmFtZSA9ICJ2aW90YXBlIiwKKwkuaWRfdGFibGUgPSB2aW90YXBlX2RldmljZV90YWJsZSwKKwkucHJvYmUgPSB2aW90YXBlX3Byb2JlLAorCS5yZW1vdmUgPSB2aW90YXBlX3JlbW92ZQorfTsKKworCitpbnQgX19pbml0IHZpb3RhcF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmU7CisKKwlvcF9zdHJ1Y3RfbGlzdCA9IE5VTEw7CisJaWYgKChyZXQgPSBhZGRfb3Bfc3RydWN0cyhWSU9UQVBFX01BWFJFUSkpIDwgMCkgeworCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gImNvdWxkbid0IGFsbG9jYXRlIG9wIHN0cnVjdHNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlzcGluX2xvY2tfaW5pdCgmb3Bfc3RydWN0X2xpc3RfbG9jayk7CisKKwlzZW1hX2luaXQoJnJlcVNlbSwgVklPVEFQRV9NQVhSRVEpOworCisJaWYgKHZpb3BhdGhfaG9zdExwID09IEh2THBJbmRleEludmFsaWQpIHsKKwkJdmlvX3NldF9ob3N0bHAoKTsKKwkJaWYgKHZpb3BhdGhfaG9zdExwID09IEh2THBJbmRleEludmFsaWQpIHsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGNsZWFyX29wOworCQl9CisJfQorCisJcmV0ID0gdmlvcGF0aF9vcGVuKHZpb3BhdGhfaG9zdExwLCB2aW9tYWpvcnN1YnR5cGVfdGFwZSwKKwkJCVZJT1RBUEVfTUFYUkVRICsgMik7CisJaWYgKHJldCkgeworCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4KKwkJCQkiZXJyb3Igb24gdmlvcGF0aF9vcGVuIHRvIGhvc3RscCAlZFxuIiwgcmV0KTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBjbGVhcl9vcDsKKwl9CisKKwlwcmludGsoVklPVEFQRV9LRVJOX0lORk8gInZlcnMgIiBWSU9UQVBFX1ZFUlNJT04KKwkJCSIsIGhvc3RpbmcgcGFydGl0aW9uICVkXG4iLCB2aW9wYXRoX2hvc3RMcCk7CisKKwl2aW9fc2V0SGFuZGxlcih2aW9tYWpvcnN1YnR5cGVfdGFwZSwgdmlvSGFuZGxlVGFwZUV2ZW50KTsKKworCXJldCA9IHJlZ2lzdGVyX2NocmRldihWSU9UQVBFX01BSk9SLCAidmlvdGFwZSIsICZ2aW90YXBfZm9wcyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKFZJT1RBUEVfS0VSTl9XQVJOICJFcnJvciByZWdpc3RlcmluZyB2aW90YXBlIGRldmljZVxuIik7CisJCWdvdG8gY2xlYXJfaGFuZGxlcjsKKwl9CisKKwl0YXBlX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgInRhcGUiKTsKKwlpZiAoSVNfRVJSKHRhcGVfY2xhc3MpKSB7CisJCXByaW50ayhWSU9UQVBFX0tFUk5fV0FSTiAiVW5hYmxlIHRvIGFsbG9jYXQgY2xhc3NcbiIpOworCQlyZXQgPSBQVFJfRVJSKHRhcGVfY2xhc3MpOworCQlnb3RvIHVucmVnX2NocmRldjsKKwl9CisKKwlpZiAoKHJldCA9IGdldF92aW90YXBlX2luZm8oKSkgPCAwKSB7CisJCXByaW50ayhWSU9UQVBFX0tFUk5fV0FSTiAiVW5hYmxlIHRvIG9idGFpbiB2aXJ0dWFsIGRldmljZSBpbmZvcm1hdGlvbiIpOworCQlnb3RvIHVucmVnX2NsYXNzOworCX0KKworCXJldCA9IHZpb19yZWdpc3Rlcl9kcml2ZXIoJnZpb3RhcGVfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlnb3RvIHVucmVnX2NsYXNzOworCisJZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJpU2VyaWVzL3Zpb3RhcGUiLCBTX0lGUkVHfFNfSVJVR08sIE5VTEwpOworCWlmIChlKSB7CisJCWUtPm93bmVyID0gVEhJU19NT0RVTEU7CisJCWUtPnByb2NfZm9wcyA9ICZwcm9jX3Zpb3RhcGVfb3BlcmF0aW9uczsKKwl9CisKKwlyZXR1cm4gMDsKKwordW5yZWdfY2xhc3M6CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kodGFwZV9jbGFzcyk7Cit1bnJlZ19jaHJkZXY6CisJdW5yZWdpc3Rlcl9jaHJkZXYoVklPVEFQRV9NQUpPUiwgInZpb3RhcGUiKTsKK2NsZWFyX2hhbmRsZXI6CisJdmlvX2NsZWFySGFuZGxlcih2aW9tYWpvcnN1YnR5cGVfdGFwZSk7CisJdmlvcGF0aF9jbG9zZSh2aW9wYXRoX2hvc3RMcCwgdmlvbWFqb3JzdWJ0eXBlX3RhcGUsIFZJT1RBUEVfTUFYUkVRICsgMik7CitjbGVhcl9vcDoKKwljbGVhcl9vcF9zdHJ1Y3RfcG9vbCgpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEdpdmUgYSBuZXcgc3RhdGUgdG8gdGhlIHRhcGUgb2JqZWN0ICovCitzdGF0aWMgaW50IGNoZ19zdGF0ZShpbnQgaW5kZXgsIHVuc2lnbmVkIGNoYXIgbmV3X3N0YXRlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpjdXJfc3RhdGUgPQorCSAgICAmc3RhdGVbaW5kZXhdLnBhcnRfc3RhdF9yd2lbc3RhdGVbaW5kZXhdLmN1cl9wYXJ0XTsKKwlpbnQgcmMgPSAwOworCisJLyogaWYgdGhlIHNhbWUgc3RhdGUsIGRvbid0IGJvdGhlciAqLworCWlmICgqY3VyX3N0YXRlID09IG5ld19zdGF0ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiB3cml0ZSBhbiBFT0YgaWYgY2hhbmdpbmcgZnJvbSB3cml0aW5nIHRvIHNvbWUgb3RoZXIgc3RhdGUgKi8KKwlpZiAoKmN1cl9zdGF0ZSA9PSBWSU9UX1dSSVRJTkcpIHsKKwkJc3RydWN0IG10b3Agd3JpdGVfZW9mID0geyBNVFdFT0YsIDEgfTsKKworCQlyYyA9IHZpb3RhcF9pb2N0bChOVUxMLCBmaWxlLCBNVElPQ1RPUCwKKwkJCQkgICh1bnNpZ25lZCBsb25nKSZ3cml0ZV9lb2YpOworCX0KKwkqY3VyX3N0YXRlID0gbmV3X3N0YXRlOworCXJldHVybiByYzsKK30KKworLyogQ2xlYW51cCAqLworc3RhdGljIHZvaWQgX19leGl0IHZpb3RhcF9leGl0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJlbW92ZV9wcm9jX2VudHJ5KCJpU2VyaWVzL3Zpb3RhcGUiLCBOVUxMKTsKKwl2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnZpb3RhcGVfZHJpdmVyKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveSh0YXBlX2NsYXNzKTsKKwlyZXQgPSB1bnJlZ2lzdGVyX2NocmRldihWSU9UQVBFX01BSk9SLCAidmlvdGFwZSIpOworCWlmIChyZXQgPCAwKQorCQlwcmludGsoVklPVEFQRV9LRVJOX1dBUk4gIkVycm9yIHVucmVnaXN0ZXJpbmcgZGV2aWNlOiAlZFxuIiwKKwkJCQlyZXQpOworCWlmICh2aW90YXBlX3VuaXRpbmZvKQorCQlkbWFfZnJlZV9jb2hlcmVudChpU2VyaWVzX3Zpb19kZXYsCisJCQkJc2l6ZW9mKHZpb3RhcGVfdW5pdGluZm9bMF0pICogVklPVEFQRV9NQVhfVEFQRSwKKwkJCQl2aW90YXBlX3VuaXRpbmZvLCB2aW90YXBlX3VuaXRpbmZvX3Rva2VuKTsKKwl2aW9wYXRoX2Nsb3NlKHZpb3BhdGhfaG9zdExwLCB2aW9tYWpvcnN1YnR5cGVfdGFwZSwgVklPVEFQRV9NQVhSRVEgKyAyKTsKKwl2aW9fY2xlYXJIYW5kbGVyKHZpb21ham9yc3VidHlwZV90YXBlKTsKKwljbGVhcl9vcF9zdHJ1Y3RfcG9vbCgpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfaW5pdCh2aW90YXBfaW5pdCk7Cittb2R1bGVfZXhpdCh2aW90YXBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdm1lX3NjYy5jIGIvZHJpdmVycy9jaGFyL3ZtZV9zY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWJhODM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3ZtZV9zY2MuYwpAQCAtMCwwICsxLDEwNTYgQEAKKy8qCisgKiBkcml2ZXJzL2NoYXIvdm1lX3NjYy5jOiBNVk1FMTQ3LCBNVk1FMTYyLCBCVk1FNjAwMCBTQ0Mgc2VyaWFsIHBvcnRzCisgKiBpbXBsZW1lbnRhdGlvbi4KKyAqIENvcHlyaWdodCAxOTk5IFJpY2hhcmQgSGlyc3QgPHJpY2hhcmRAc2xlZXBpZS5kZW1vbi5jby51az4KKyAqCisgKiBCYXNlZCBvbiBhdGFyaV9TQ0MuYyB3aGljaCB3YXMKKyAqICAgQ29weXJpZ2h0IDE5OTQtOTUgUm9tYW4gSG9kZWsgPFJvbWFuLkhvZGVrQGluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorICogICBQYXJ0aWFsbHkgYmFzZWQgb24gUEMtTGludXggc2VyaWFsLmMgYnkgTGludXMgVG9ydmFsZHMgYW5kIFRoZW9kb3JlIFRzJ28KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKworI2lmZGVmIENPTkZJR19NVk1FMTQ3X1NDQworI2luY2x1ZGUgPGFzbS9tdm1lMTQ3aHcuaD4KKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVk1FMTYyX1NDQworI2luY2x1ZGUgPGFzbS9tdm1lMTZ4aHcuaD4KKyNlbmRpZgorI2lmZGVmIENPTkZJR19CVk1FNjAwMF9TQ0MKKyNpbmNsdWRlIDxhc20vYnZtZTYwMDBody5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9nZW5lcmljX3NlcmlhbC5oPgorI2luY2x1ZGUgInNjYy5oIgorCisKKyNkZWZpbmUgQ0hBTk5FTF9BCTAKKyNkZWZpbmUgQ0hBTk5FTF9CCTEKKworI2RlZmluZSBTQ0NfTUlOT1JfQkFTRQk2NAorCisvKiBTaGFkb3dzIGZvciBhbGwgU0NDIHdyaXRlIHJlZ2lzdGVycyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2NjX3NoYWRvd1syXVsxNl07CisKKy8qIExvY2F0aW9uIHRvIGFjY2VzcyBmb3IgU0NDIHJlZ2lzdGVyIGFjY2VzcyBkZWxheSAqLworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnNjY19kZWwgPSBOVUxMOworCisvKiBUbyBrZWVwIHRyYWNrIG9mIFNUQVRVU19SRUcgc3RhdGUgZm9yIGRldGVjdGlvbiBvZiBFeHQvU3RhdHVzIGludCBzb3VyY2UgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNjY19sYXN0X3N0YXR1c19yZWdbMl07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBzY2NfZGlzYWJsZV90eF9pbnRlcnJ1cHRzKHZvaWQgKiBwdHIpOworc3RhdGljIHZvaWQgc2NjX2VuYWJsZV90eF9pbnRlcnJ1cHRzKHZvaWQgKiBwdHIpOworc3RhdGljIHZvaWQgc2NjX2Rpc2FibGVfcnhfaW50ZXJydXB0cyh2b2lkICogcHRyKTsKK3N0YXRpYyB2b2lkIHNjY19lbmFibGVfcnhfaW50ZXJydXB0cyh2b2lkICogcHRyKTsKK3N0YXRpYyBpbnQgIHNjY19nZXRfQ0Qodm9pZCAqIHB0cik7CitzdGF0aWMgdm9pZCBzY2Nfc2h1dGRvd25fcG9ydCh2b2lkICogcHRyKTsKK3N0YXRpYyBpbnQgc2NjX3NldF9yZWFsX3Rlcm1pb3Modm9pZCAgKnB0cik7CitzdGF0aWMgdm9pZCBzY2NfaHVuZ3VwKHZvaWQgICpwdHIpOworc3RhdGljIHZvaWQgc2NjX2Nsb3NlKHZvaWQgICpwdHIpOworc3RhdGljIGludCBzY2NfY2hhcnNfaW5fYnVmZmVyKHZvaWQgKiBwdHIpOworc3RhdGljIGludCBzY2Nfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKK3N0YXRpYyBpbnQgc2NjX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZCBzY2NfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBzY2NfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY2NfdHhfaW50KGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NjX3J4X2ludChpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqZnApOworc3RhdGljIGlycXJldHVybl90IHNjY19zdGF0X2ludChpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqZnApOworc3RhdGljIGlycXJldHVybl90IHNjY19zcGNvbmRfaW50KGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgdm9pZCBzY2Nfc2V0c2lnbmFscyhzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQsIGludCBkdHIsIGludCBydHMpOworc3RhdGljIHZvaWQgc2NjX2JyZWFrX2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnNjY19kcml2ZXI7CisKK3N0cnVjdCBzY2NfcG9ydCBzY2NfcG9ydHNbMl07CisKK2ludCBzY2NfaW5pdGlhbGl6ZWQgPSAwOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW50ZXJmYWNlIGZyb20gZ2VuZXJpY19zZXJpYWwuYyBiYWNrIGhlcmUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IHJlYWxfZHJpdmVyIHNjY19yZWFsX2RyaXZlciA9IHsKKyAgICAgICAgc2NjX2Rpc2FibGVfdHhfaW50ZXJydXB0cywKKyAgICAgICAgc2NjX2VuYWJsZV90eF9pbnRlcnJ1cHRzLAorICAgICAgICBzY2NfZGlzYWJsZV9yeF9pbnRlcnJ1cHRzLAorICAgICAgICBzY2NfZW5hYmxlX3J4X2ludGVycnVwdHMsCisgICAgICAgIHNjY19nZXRfQ0QsCisgICAgICAgIHNjY19zaHV0ZG93bl9wb3J0LAorICAgICAgICBzY2Nfc2V0X3JlYWxfdGVybWlvcywKKyAgICAgICAgc2NjX2NoYXJzX2luX2J1ZmZlciwKKyAgICAgICAgc2NjX2Nsb3NlLAorICAgICAgICBzY2NfaHVuZ3VwLAorICAgICAgICBOVUxMCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgc2NjX29wcyA9IHsKKwkub3Blbgk9IHNjY19vcGVuLAorCS5jbG9zZSA9IGdzX2Nsb3NlLAorCS53cml0ZSA9IGdzX3dyaXRlLAorCS5wdXRfY2hhciA9IGdzX3B1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IGdzX2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gZ3Nfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gZ3NfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSBnc19mbHVzaF9idWZmZXIsCisJLmlvY3RsID0gc2NjX2lvY3RsLAorCS50aHJvdHRsZSA9IHNjY190aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IHNjY191bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IGdzX3NldF90ZXJtaW9zLAorCS5zdG9wID0gZ3Nfc3RvcCwKKwkuc3RhcnQgPSBnc19zdGFydCwKKwkuaGFuZ3VwID0gZ3NfaGFuZ3VwLAorCS5icmVha19jdGwgPSBzY2NfYnJlYWtfY3RsLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB2bWVfc2NjX2luaXQoKSBhbmQgc3VwcG9ydCBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzY2NfaW5pdF9kcml2ZXJzKHZvaWQpCit7CisJaW50IGVycm9yOworCisJc2NjX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoMik7CisJaWYgKCFzY2NfZHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzY2NfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXNjY19kcml2ZXItPmRyaXZlcl9uYW1lID0gInNjYyI7CisJc2NjX2RyaXZlci0+bmFtZSA9ICJ0dHlTIjsKKwlzY2NfZHJpdmVyLT5kZXZmc19uYW1lID0gInR0cy8iOworCXNjY19kcml2ZXItPm1ham9yID0gVFRZX01BSk9SOworCXNjY19kcml2ZXItPm1pbm9yX3N0YXJ0ID0gU0NDX01JTk9SX0JBU0U7CisJc2NjX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJc2NjX2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlzY2NfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJc2NjX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQorCSAgQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCXNjY19kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoc2NjX2RyaXZlciwgJnNjY19vcHMpOworCisJaWYgKChlcnJvciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoc2NjX2RyaXZlcikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2NjOiBDb3VsZG4ndCByZWdpc3RlciBzY2MgZHJpdmVyLCBlcnJvciA9ICVkXG4iLAorCQkgICAgICAgZXJyb3IpOworCQlwdXRfdHR5X2RyaXZlcihzY2NfZHJpdmVyKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogcG9ydHNbXSBhcnJheSBpcyBpbmRleGVkIGJ5IGxpbmUgbm8gKGkuZS4gWzBdIGZvciB0dHlTMCwgWzFdIGZvciB0dHlTMSkuCisgKi8KKworc3RhdGljIHZvaWQgc2NjX2luaXRfcG9ydHN0cnVjdHModm9pZCkKK3sKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXBvcnQgPSBzY2NfcG9ydHMgKyBpOworCQlwb3J0LT5ncy5tYWdpYyA9IFNDQ19NQUdJQzsKKwkJcG9ydC0+Z3MuY2xvc2VfZGVsYXkgPSBIWi8yOworCQlwb3J0LT5ncy5jbG9zaW5nX3dhaXQgPSAzMCAqIEhaOworCQlwb3J0LT5ncy5yZCA9ICZzY2NfcmVhbF9kcml2ZXI7CisjaWZkZWYgTkVXX1dSSVRFX0xPQ0tJTkcKKwkJcG9ydC0+Z3MucG9ydF93cml0ZV9zZW0gPSBNVVRFWDsKKyNlbmRpZgorCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5ncy5vcGVuX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5ncy5jbG9zZV93YWl0KTsKKwl9Cit9CisKKworI2lmZGVmIENPTkZJR19NVk1FMTQ3X1NDQworc3RhdGljIGludCBtdm1lMTQ3X3NjY19pbml0KHZvaWQpCit7CisJc3RydWN0IHNjY19wb3J0ICpwb3J0OworCisJcHJpbnRrKEtFUk5fSU5GTyAiU0NDOiBNVk1FMTQ3IFNlcmlhbCBEcml2ZXJcbiIpOworCS8qIEluaXQgY2hhbm5lbCBBICovCisJcG9ydCA9ICZzY2NfcG9ydHNbMF07CisJcG9ydC0+Y2hhbm5lbCA9IENIQU5ORUxfQTsKKwlwb3J0LT5jdHJscCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopTTE0N19TQ0NfQV9BRERSOworCXBvcnQtPmRhdGFwID0gcG9ydC0+Y3RybHAgKyAxOworCXBvcnQtPnBvcnRfYSA9ICZzY2NfcG9ydHNbMF07CisJcG9ydC0+cG9ydF9iID0gJnNjY19wb3J0c1sxXTsKKwlyZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ0NBX1RYLCBzY2NfdHhfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQSBUWCIsIHBvcnQpOworCXJlcXVlc3RfaXJxKE1WTUUxNDdfSVJRX1NDQ0FfU1RBVCwgc2NjX3N0YXRfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQSBzdGF0dXMiLCBwb3J0KTsKKwlyZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ0NBX1JYLCBzY2NfcnhfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQSBSWCIsIHBvcnQpOworCXJlcXVlc3RfaXJxKE1WTUUxNDdfSVJRX1NDQ0FfU1BDT05ELCBzY2Nfc3Bjb25kX2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUEgc3BlY2lhbCBjb25kIiwgcG9ydCk7CisJeworCQlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CisKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGZvciB0aGlzIGNoYW5uZWwgKi8KKwkJU0NDd3JpdGUoSU5UX0FORF9ETUFfUkVHLCAwKTsKKwkJLyogU2V0IHRoZSBpbnRlcnJ1cHQgdmVjdG9yICovCisJCVNDQ3dyaXRlKElOVF9WRUNUT1JfUkVHLCBNVk1FMTQ3X0lSUV9TQ0NfQkFTRSk7CisJCS8qIEludGVycnVwdCBwYXJhbWV0ZXJzOiB2ZWN0b3IgaW5jbHVkZXMgc3RhdHVzLCBzdGF0dXMgbG93ICovCisJCVNDQ3dyaXRlKE1BU1RFUl9JTlRfQ1RSTCwgTUlDX1ZFQ19JTkNMX1NUQVQpOworCQlTQ0Ntb2QoTUFTVEVSX0lOVF9DVFJMLCAweGZmLCBNSUNfTUFTVEVSX0lOVF9FTkFCKTsKKwl9CisKKwkvKiBJbml0IGNoYW5uZWwgQiAqLworCXBvcnQgPSAmc2NjX3BvcnRzWzFdOworCXBvcnQtPmNoYW5uZWwgPSBDSEFOTkVMX0I7CisJcG9ydC0+Y3RybHAgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKU0xNDdfU0NDX0JfQUREUjsKKwlwb3J0LT5kYXRhcCA9IHBvcnQtPmN0cmxwICsgMTsKKwlwb3J0LT5wb3J0X2EgPSAmc2NjX3BvcnRzWzBdOworCXBvcnQtPnBvcnRfYiA9ICZzY2NfcG9ydHNbMV07CisJcmVxdWVzdF9pcnEoTVZNRTE0N19JUlFfU0NDQl9UWCwgc2NjX3R4X2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUIgVFgiLCBwb3J0KTsKKwlyZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ0NCX1NUQVQsIHNjY19zdGF0X2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUIgc3RhdHVzIiwgcG9ydCk7CisJcmVxdWVzdF9pcnEoTVZNRTE0N19JUlFfU0NDQl9SWCwgc2NjX3J4X2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUIgUlgiLCBwb3J0KTsKKwlyZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ0NCX1NQQ09ORCwgc2NjX3NwY29uZF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1CIHNwZWNpYWwgY29uZCIsIHBvcnQpOworCXsKKwkJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBmb3IgdGhpcyBjaGFubmVsICovCisJCVNDQ3dyaXRlKElOVF9BTkRfRE1BX1JFRywgMCk7CisJfQorCisgICAgICAgIC8qIEVuc3VyZSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGluIHRoZSBQQ0MgY2hpcCAqLworICAgICAgICBtMTQ3X3BjYy0+c2VyaWFsX2NudHJsPVBDQ19MRVZFTF9TRVJJQUx8UENDX0lOVF9FTkFCOworCisJLyogSW5pdGlhbGlzZSB0aGUgdHR5IGRyaXZlciBzdHJ1Y3R1cmVzIGFuZCByZWdpc3RlciAqLworCXNjY19pbml0X3BvcnRzdHJ1Y3RzKCk7CisJc2NjX2luaXRfZHJpdmVycygpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX01WTUUxNjJfU0NDCitzdGF0aWMgaW50IG12bWUxNjJfc2NjX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQ7CisKKwlpZiAoIShtdm1lMTZ4X2NvbmZpZyAmIE1WTUUxNnhfQ09ORklHX0dPVF9TQ0NBKSkKKwkJcmV0dXJuICgtRU5PREVWKTsKKworCXByaW50ayhLRVJOX0lORk8gIlNDQzogTVZNRTE2MiBTZXJpYWwgRHJpdmVyXG4iKTsKKwkvKiBJbml0IGNoYW5uZWwgQSAqLworCXBvcnQgPSAmc2NjX3BvcnRzWzBdOworCXBvcnQtPmNoYW5uZWwgPSBDSEFOTkVMX0E7CisJcG9ydC0+Y3RybHAgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKU1WTUVfU0NDX0FfQUREUjsKKwlwb3J0LT5kYXRhcCA9IHBvcnQtPmN0cmxwICsgMjsKKwlwb3J0LT5wb3J0X2EgPSAmc2NjX3BvcnRzWzBdOworCXBvcnQtPnBvcnRfYiA9ICZzY2NfcG9ydHNbMV07CisJcmVxdWVzdF9pcnEoTVZNRTE2Ml9JUlFfU0NDQV9UWCwgc2NjX3R4X2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUEgVFgiLCBwb3J0KTsKKwlyZXF1ZXN0X2lycShNVk1FMTYyX0lSUV9TQ0NBX1NUQVQsIHNjY19zdGF0X2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUEgc3RhdHVzIiwgcG9ydCk7CisJcmVxdWVzdF9pcnEoTVZNRTE2Ml9JUlFfU0NDQV9SWCwgc2NjX3J4X2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUEgUlgiLCBwb3J0KTsKKwlyZXF1ZXN0X2lycShNVk1FMTYyX0lSUV9TQ0NBX1NQQ09ORCwgc2NjX3NwY29uZF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1BIHNwZWNpYWwgY29uZCIsIHBvcnQpOworCXsKKwkJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBmb3IgdGhpcyBjaGFubmVsICovCisJCVNDQ3dyaXRlKElOVF9BTkRfRE1BX1JFRywgMCk7CisJCS8qIFNldCB0aGUgaW50ZXJydXB0IHZlY3RvciAqLworCQlTQ0N3cml0ZShJTlRfVkVDVE9SX1JFRywgTVZNRTE2Ml9JUlFfU0NDX0JBU0UpOworCQkvKiBJbnRlcnJ1cHQgcGFyYW1ldGVyczogdmVjdG9yIGluY2x1ZGVzIHN0YXR1cywgc3RhdHVzIGxvdyAqLworCQlTQ0N3cml0ZShNQVNURVJfSU5UX0NUUkwsIE1JQ19WRUNfSU5DTF9TVEFUKTsKKwkJU0NDbW9kKE1BU1RFUl9JTlRfQ1RSTCwgMHhmZiwgTUlDX01BU1RFUl9JTlRfRU5BQik7CisJfQorCisJLyogSW5pdCBjaGFubmVsIEIgKi8KKwlwb3J0ID0gJnNjY19wb3J0c1sxXTsKKwlwb3J0LT5jaGFubmVsID0gQ0hBTk5FTF9COworCXBvcnQtPmN0cmxwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilNVk1FX1NDQ19CX0FERFI7CisJcG9ydC0+ZGF0YXAgPSBwb3J0LT5jdHJscCArIDI7CisJcG9ydC0+cG9ydF9hID0gJnNjY19wb3J0c1swXTsKKwlwb3J0LT5wb3J0X2IgPSAmc2NjX3BvcnRzWzFdOworCXJlcXVlc3RfaXJxKE1WTUUxNjJfSVJRX1NDQ0JfVFgsIHNjY190eF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1CIFRYIiwgcG9ydCk7CisJcmVxdWVzdF9pcnEoTVZNRTE2Ml9JUlFfU0NDQl9TVEFULCBzY2Nfc3RhdF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1CIHN0YXR1cyIsIHBvcnQpOworCXJlcXVlc3RfaXJxKE1WTUUxNjJfSVJRX1NDQ0JfUlgsIHNjY19yeF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1CIFJYIiwgcG9ydCk7CisJcmVxdWVzdF9pcnEoTVZNRTE2Ml9JUlFfU0NDQl9TUENPTkQsIHNjY19zcGNvbmRfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQiBzcGVjaWFsIGNvbmQiLCBwb3J0KTsKKworCXsKKwkJU0NDX0FDQ0VTU19JTklUKHBvcnQpOwkvKiBFaXRoZXIgY2hhbm5lbCB3aWxsIGRvICovCisKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGZvciB0aGlzIGNoYW5uZWwgKi8KKwkJU0NDd3JpdGUoSU5UX0FORF9ETUFfUkVHLCAwKTsKKwl9CisKKyAgICAgICAgLyogRW5zdXJlIGludGVycnVwdHMgYXJlIGVuYWJsZWQgaW4gdGhlIE1DMiBjaGlwICovCisgICAgICAgICoodm9sYXRpbGUgY2hhciAqKTB4ZmZmNDIwMWQgPSAweDE0OworCisJLyogSW5pdGlhbGlzZSB0aGUgdHR5IGRyaXZlciBzdHJ1Y3R1cmVzIGFuZCByZWdpc3RlciAqLworCXNjY19pbml0X3BvcnRzdHJ1Y3RzKCk7CisJc2NjX2luaXRfZHJpdmVycygpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX0JWTUU2MDAwX1NDQworc3RhdGljIGludCBidm1lNjAwMF9zY2NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydDsKKworCXByaW50ayhLRVJOX0lORk8gIlNDQzogQlZNRTYwMDAgU2VyaWFsIERyaXZlclxuIik7CisJLyogSW5pdCBjaGFubmVsIEEgKi8KKwlwb3J0ID0gJnNjY19wb3J0c1swXTsKKwlwb3J0LT5jaGFubmVsID0gQ0hBTk5FTF9BOworCXBvcnQtPmN0cmxwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilCVk1FX1NDQ19BX0FERFI7CisJcG9ydC0+ZGF0YXAgPSBwb3J0LT5jdHJscCArIDQ7CisJcG9ydC0+cG9ydF9hID0gJnNjY19wb3J0c1swXTsKKwlwb3J0LT5wb3J0X2IgPSAmc2NjX3BvcnRzWzFdOworCXJlcXVlc3RfaXJxKEJWTUVfSVJRX1NDQ0FfVFgsIHNjY190eF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1BIFRYIiwgcG9ydCk7CisJcmVxdWVzdF9pcnEoQlZNRV9JUlFfU0NDQV9TVEFULCBzY2Nfc3RhdF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1BIHN0YXR1cyIsIHBvcnQpOworCXJlcXVlc3RfaXJxKEJWTUVfSVJRX1NDQ0FfUlgsIHNjY19yeF9pbnQsIFNBX0lOVEVSUlVQVCwKKwkJICAgICAgICAgICAgIlNDQy1BIFJYIiwgcG9ydCk7CisJcmVxdWVzdF9pcnEoQlZNRV9JUlFfU0NDQV9TUENPTkQsIHNjY19zcGNvbmRfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQSBzcGVjaWFsIGNvbmQiLCBwb3J0KTsKKwl7CisJCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKKworCQkvKiBkaXNhYmxlIGludGVycnVwdHMgZm9yIHRoaXMgY2hhbm5lbCAqLworCQlTQ0N3cml0ZShJTlRfQU5EX0RNQV9SRUcsIDApOworCQkvKiBTZXQgdGhlIGludGVycnVwdCB2ZWN0b3IgKi8KKwkJU0NDd3JpdGUoSU5UX1ZFQ1RPUl9SRUcsIEJWTUVfSVJRX1NDQ19CQVNFKTsKKwkJLyogSW50ZXJydXB0IHBhcmFtZXRlcnM6IHZlY3RvciBpbmNsdWRlcyBzdGF0dXMsIHN0YXR1cyBsb3cgKi8KKwkJU0NDd3JpdGUoTUFTVEVSX0lOVF9DVFJMLCBNSUNfVkVDX0lOQ0xfU1RBVCk7CisJCVNDQ21vZChNQVNURVJfSU5UX0NUUkwsIDB4ZmYsIE1JQ19NQVNURVJfSU5UX0VOQUIpOworCX0KKworCS8qIEluaXQgY2hhbm5lbCBCICovCisJcG9ydCA9ICZzY2NfcG9ydHNbMV07CisJcG9ydC0+Y2hhbm5lbCA9IENIQU5ORUxfQjsKKwlwb3J0LT5jdHJscCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopQlZNRV9TQ0NfQl9BRERSOworCXBvcnQtPmRhdGFwID0gcG9ydC0+Y3RybHAgKyA0OworCXBvcnQtPnBvcnRfYSA9ICZzY2NfcG9ydHNbMF07CisJcG9ydC0+cG9ydF9iID0gJnNjY19wb3J0c1sxXTsKKwlyZXF1ZXN0X2lycShCVk1FX0lSUV9TQ0NCX1RYLCBzY2NfdHhfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQiBUWCIsIHBvcnQpOworCXJlcXVlc3RfaXJxKEJWTUVfSVJRX1NDQ0JfU1RBVCwgc2NjX3N0YXRfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQiBzdGF0dXMiLCBwb3J0KTsKKwlyZXF1ZXN0X2lycShCVk1FX0lSUV9TQ0NCX1JYLCBzY2NfcnhfaW50LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICJTQ0MtQiBSWCIsIHBvcnQpOworCXJlcXVlc3RfaXJxKEJWTUVfSVJRX1NDQ0JfU1BDT05ELCBzY2Nfc3Bjb25kX2ludCwgU0FfSU5URVJSVVBULAorCQkgICAgICAgICAgICAiU0NDLUIgc3BlY2lhbCBjb25kIiwgcG9ydCk7CisKKwl7CisJCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsJLyogRWl0aGVyIGNoYW5uZWwgd2lsbCBkbyAqLworCisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBmb3IgdGhpcyBjaGFubmVsICovCisJCVNDQ3dyaXRlKElOVF9BTkRfRE1BX1JFRywgMCk7CisJfQorCisJLyogSW5pdGlhbGlzZSB0aGUgdHR5IGRyaXZlciBzdHJ1Y3R1cmVzIGFuZCByZWdpc3RlciAqLworCXNjY19pbml0X3BvcnRzdHJ1Y3RzKCk7CisJc2NjX2luaXRfZHJpdmVycygpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IHZtZV9zY2NfaW5pdCh2b2lkKQoreworCWludCByZXMgPSAtRU5PREVWOworCisjaWZkZWYgQ09ORklHX01WTUUxNDdfU0NDCisJaWYgKE1BQ0hfSVNfTVZNRTE0NykKKwkJcmVzID0gbXZtZTE0N19zY2NfaW5pdCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01WTUUxNjJfU0NDCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkKKwkJcmVzID0gbXZtZTE2Ml9zY2NfaW5pdCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0JWTUU2MDAwX1NDQworCWlmIChNQUNIX0lTX0JWTUU2MDAwKQorCQlyZXMgPSBidm1lNjAwMF9zY2NfaW5pdCgpOworI2VuZGlmCisJcmV0dXJuIHJlczsKK30KKworbW9kdWxlX2luaXQodm1lX3NjY19pbml0KTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW50ZXJydXB0IGhhbmRsZXJzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlycXJldHVybl90IHNjY19yeF9pbnQoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworCXVuc2lnbmVkIGNoYXIJY2g7CisJc3RydWN0IHNjY19wb3J0ICpwb3J0ID0gZGF0YTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+Z3MudHR5OworCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKKworCWNoID0gU0NDcmVhZF9OQihSWF9EQVRBX1JFRyk7CisJaWYgKCF0dHkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NjX3J4X2ludCB3aXRoIE5VTEwgdHR5IVxuIik7CisJCVNDQ3dyaXRlX05CKENPTU1BTkRfUkVHLCBDUl9ISUdIRVNUX0lVU19SRVNFVCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJaWYgKHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpIHsKKwkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBjaDsKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSAwOworCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7CisJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKKwkJdHR5LT5mbGlwLmNvdW50Kys7CisJfQorCisJLyogQ2hlY2sgaWYgYW5vdGhlciBjaGFyYWN0ZXIgaXMgYWxyZWFkeSByZWFkeTsgaW4gdGhhdCBjYXNlLCB0aGUKKwkgKiBzcGNvbmRfaW50KCkgZnVuY3Rpb24gbXVzdCBiZSB1c2VkLCBiZWNhdXNlIHRoaXMgY2hhcmFjdGVyIG1heSBoYXZlIGFuCisJICogZXJyb3IgY29uZGl0aW9uIHRoYXQgaXNuJ3Qgc2lnbmFsbGVkIGJ5IHRoZSBpbnRlcnJ1cHQgdmVjdG9yIHVzZWQhCisJICovCisJaWYgKFNDQ3JlYWQoSU5UX1BFTkRJTkdfUkVHKSAmCisJICAgIChwb3J0LT5jaGFubmVsID09IENIQU5ORUxfQSA/IElQUl9BX1JYIDogSVBSX0JfUlgpKSB7CisJCXNjY19zcGNvbmRfaW50IChpcnEsIGRhdGEsIGZwKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCVNDQ3dyaXRlX05CKENPTU1BTkRfUkVHLCBDUl9ISUdIRVNUX0lVU19SRVNFVCk7CisKKwl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NjX3NwY29uZF9pbnQoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IGRhdGE7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPmdzLnR0eTsKKwl1bnNpZ25lZCBjaGFyCXN0YXQsIGNoLCBlcnI7CisJaW50CQlpbnRfcGVuZGluZ19tYXNrID0gcG9ydC0+Y2hhbm5lbCA9PSBDSEFOTkVMX0EgPworCQkJICAgICAgICAgICAgICAgICAgIElQUl9BX1JYIDogSVBSX0JfUlg7CisJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCQorCWlmICghdHR5KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjY19zcGNvbmRfaW50IHdpdGggTlVMTCB0dHkhXG4iKTsKKwkJU0NDd3JpdGUoQ09NTUFORF9SRUcsIENSX0VSUk9SX1JFU0VUKTsKKwkJU0NDd3JpdGVfTkIoQ09NTUFORF9SRUcsIENSX0hJR0hFU1RfSVVTX1JFU0VUKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlkbyB7CisJCXN0YXQgPSBTQ0NyZWFkKFNQQ09ORF9TVEFUVVNfUkVHKTsKKwkJY2ggPSBTQ0NyZWFkX05CKFJYX0RBVEFfUkVHKTsKKworCQlpZiAoc3RhdCAmIFNDU1JfUlhfT1ZFUlJVTikKKwkJCWVyciA9IFRUWV9PVkVSUlVOOworCQllbHNlIGlmIChzdGF0ICYgU0NTUl9QQVJJVFlfRVJSKQorCQkJZXJyID0gVFRZX1BBUklUWTsKKwkJZWxzZSBpZiAoc3RhdCAmIFNDU1JfQ1JDX0ZSQU1FX0VSUikKKwkJCWVyciA9IFRUWV9GUkFNRTsKKwkJZWxzZQorCQkJZXJyID0gMDsKKworCQlpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgeworCQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBjaDsKKwkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gZXJyOworCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOworCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOworCQkJdHR5LT5mbGlwLmNvdW50Kys7CisJCX0KKworCQkvKiArK1RlU2NoZTogKkFsbCogZXJyb3JzIGhhdmUgdG8gYmUgY2xlYXJlZCBtYW51YWxseSwKKwkJICogZWxzZSB0aGUgY29uZGl0aW9uIHBlcnNpc3RzIGZvciB0aGUgbmV4dCBjaGFycworCQkgKi8KKwkJaWYgKGVycikKKwkJICBTQ0N3cml0ZShDT01NQU5EX1JFRywgQ1JfRVJST1JfUkVTRVQpOworCisJfSB3aGlsZShTQ0NyZWFkKElOVF9QRU5ESU5HX1JFRykgJiBpbnRfcGVuZGluZ19tYXNrKTsKKworCVNDQ3dyaXRlX05CKENPTU1BTkRfUkVHLCBDUl9ISUdIRVNUX0lVU19SRVNFVCk7CisKKwl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NjX3R4X2ludChpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisJc3RydWN0IHNjY19wb3J0ICpwb3J0ID0gZGF0YTsKKwlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CisKKwlpZiAoIXBvcnQtPmdzLnR0eSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY2NfdHhfaW50IHdpdGggTlVMTCB0dHkhXG4iKTsKKwkJU0NDbW9kIChJTlRfQU5EX0RNQV9SRUcsIH5JRFJfVFhfSU5UX0VOQUIsIDApOworCQlTQ0N3cml0ZShDT01NQU5EX1JFRywgQ1JfVFhfUEVORElOR19SRVNFVCk7CisJCVNDQ3dyaXRlX05CKENPTU1BTkRfUkVHLCBDUl9ISUdIRVNUX0lVU19SRVNFVCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJd2hpbGUgKChTQ0NyZWFkX05CKFNUQVRVU19SRUcpICYgU1JfVFhfQlVGX0VNUFRZKSkgeworCQlpZiAocG9ydC0+eF9jaGFyKSB7CisJCQlTQ0N3cml0ZShUWF9EQVRBX1JFRywgcG9ydC0+eF9jaGFyKTsKKwkJCXBvcnQtPnhfY2hhciA9IDA7CisJCX0KKwkJZWxzZSBpZiAoKHBvcnQtPmdzLnhtaXRfY250IDw9IDApIHx8IHBvcnQtPmdzLnR0eS0+c3RvcHBlZCB8fAorCQkJCXBvcnQtPmdzLnR0eS0+aHdfc3RvcHBlZCkKKwkJCWJyZWFrOworCQllbHNlIHsKKwkJCVNDQ3dyaXRlKFRYX0RBVEFfUkVHLCBwb3J0LT5ncy54bWl0X2J1Zltwb3J0LT5ncy54bWl0X3RhaWwrK10pOworCQkJcG9ydC0+Z3MueG1pdF90YWlsID0gcG9ydC0+Z3MueG1pdF90YWlsICYgKFNFUklBTF9YTUlUX1NJWkUtMSk7CisJCQlpZiAoLS1wb3J0LT5ncy54bWl0X2NudCA8PSAwKQorCQkJCWJyZWFrOworCQl9CisJfQorCWlmICgocG9ydC0+Z3MueG1pdF9jbnQgPD0gMCkgfHwgcG9ydC0+Z3MudHR5LT5zdG9wcGVkIHx8CisJCQlwb3J0LT5ncy50dHktPmh3X3N0b3BwZWQpIHsKKwkJLyogZGlzYWJsZSB0eCBpbnRlcnJ1cHRzICovCisJCVNDQ21vZCAoSU5UX0FORF9ETUFfUkVHLCB+SURSX1RYX0lOVF9FTkFCLCAwKTsKKwkJU0NDd3JpdGUoQ09NTUFORF9SRUcsIENSX1RYX1BFTkRJTkdfUkVTRVQpOyAgIC8qIGRpc2FibGUgdHhfaW50IG9uIG5leHQgdHggdW5kZXJydW4/ICovCisJCXBvcnQtPmdzLmZsYWdzICY9IH5HU19UWF9JTlRFTjsKKwl9CisJaWYgKHBvcnQtPmdzLnR0eSAmJiBwb3J0LT5ncy54bWl0X2NudCA8PSBwb3J0LT5ncy53YWtldXBfY2hhcnMpCisJCXR0eV93YWtldXAocG9ydC0+Z3MudHR5KTsKKworCVNDQ3dyaXRlX05CKENPTU1BTkRfUkVHLCBDUl9ISUdIRVNUX0lVU19SRVNFVCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY2Nfc3RhdF9pbnQoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IGRhdGE7CisJdW5zaWduZWQgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWw7CisJdW5zaWduZWQgY2hhcglsYXN0X3NyLCBzciwgY2hhbmdlZDsKKwlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CisKKwlsYXN0X3NyID0gc2NjX2xhc3Rfc3RhdHVzX3JlZ1tjaGFubmVsXTsKKwlzciA9IHNjY19sYXN0X3N0YXR1c19yZWdbY2hhbm5lbF0gPSBTQ0NyZWFkX05CKFNUQVRVU19SRUcpOworCWNoYW5nZWQgPSBsYXN0X3NyIF4gc3I7CisKKwlpZiAoY2hhbmdlZCAmIFNSX0RDRCkgeworCQlwb3J0LT5jX2RjZCA9ICEhKHNyICYgU1JfRENEKTsKKwkJaWYgKCEocG9ydC0+Z3MuZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkpCisJCQk7CS8qIERvbid0IHJlcG9ydCBEQ0QgY2hhbmdlcyAqLworCQllbHNlIGlmIChwb3J0LT5jX2RjZCkgeworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5ncy5vcGVuX3dhaXQpOworCQl9CisJCWVsc2UgeworCQkJaWYgKHBvcnQtPmdzLnR0eSkKKwkJCQl0dHlfaGFuZ3VwIChwb3J0LT5ncy50dHkpOworCQl9CisJfQorCVNDQ3dyaXRlKENPTU1BTkRfUkVHLCBDUl9FWFRTVEFUX1JFU0VUKTsKKwlTQ0N3cml0ZV9OQihDT01NQU5EX1JFRywgQ1JfSElHSEVTVF9JVVNfUkVTRVQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZ2VuZXJpY19zZXJpYWwuYyBjYWxsYmFjayBmdW50aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNjY19kaXNhYmxlX3R4X2ludGVycnVwdHModm9pZCAqcHRyKQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IHB0cjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlTQ0Ntb2QoSU5UX0FORF9ETUFfUkVHLCB+SURSX1RYX0lOVF9FTkFCLCAwKTsKKwlwb3J0LT5ncy5mbGFncyAmPSB+R1NfVFhfSU5URU47CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIHNjY19lbmFibGVfdHhfaW50ZXJydXB0cyh2b2lkICpwdHIpCit7CisJc3RydWN0IHNjY19wb3J0ICpwb3J0ID0gcHRyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCVNDQ21vZChJTlRfQU5EX0RNQV9SRUcsIDB4ZmYsIElEUl9UWF9JTlRfRU5BQik7CisJLyogcmVzdGFydCB0aGUgdHJhbnNtaXR0ZXIgKi8KKwlzY2NfdHhfaW50ICgwLCBwb3J0LCAwKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgc2NjX2Rpc2FibGVfcnhfaW50ZXJydXB0cyh2b2lkICpwdHIpCit7CisJc3RydWN0IHNjY19wb3J0ICpwb3J0ID0gcHRyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCVNDQ21vZChJTlRfQU5EX0RNQV9SRUcsCisJICAgIH4oSURSX1JYX0lOVF9NQVNLfElEUl9QQVJFUlJfQVNfU1BDT05EfElEUl9FWFRTVEFUX0lOVF9FTkFCKSwgMCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIHNjY19lbmFibGVfcnhfaW50ZXJydXB0cyh2b2lkICpwdHIpCit7CisJc3RydWN0IHNjY19wb3J0ICpwb3J0ID0gcHRyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCVNDQ21vZChJTlRfQU5EX0RNQV9SRUcsIDB4ZmYsCisJCUlEUl9FWFRTVEFUX0lOVF9FTkFCfElEUl9QQVJFUlJfQVNfU1BDT05EfElEUl9SWF9JTlRfQUxMKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworc3RhdGljIGludCBzY2NfZ2V0X0NEKHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQgPSBwdHI7CisJdW5zaWduZWQgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWw7CisKKwlyZXR1cm4gISEoc2NjX2xhc3Rfc3RhdHVzX3JlZ1tjaGFubmVsXSAmIFNSX0RDRCk7Cit9CisKKworc3RhdGljIHZvaWQgc2NjX3NodXRkb3duX3BvcnQodm9pZCAqcHRyKQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IHB0cjsKKworCXBvcnQtPmdzLmZsYWdzICY9IH4gR1NfQUNUSVZFOworCWlmIChwb3J0LT5ncy50dHkgJiYgcG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpIHsKKwkJc2NjX3NldHNpZ25hbHMgKHBvcnQsIDAsIDApOworCX0KK30KKworCitzdGF0aWMgaW50IHNjY19zZXRfcmVhbF90ZXJtaW9zICh2b2lkICpwdHIpCit7CisJLyogdGhlIFNDQyBoYXMgY2hhciBzaXplcyA1LDcsNiw4IGluIHRoYXQgb3JkZXIhICovCisJc3RhdGljIGludCBjaHNpemVfbWFwWzRdID0geyAwLCAyLCAxLCAzIH07CisJdW5zaWduZWQgY2ZsYWcsIGJhdWQsIGNoc2l6ZSwgY2hhbm5lbCwgYnJndmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IHB0cjsKKwlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CisKKwlpZiAoIXBvcnQtPmdzLnR0eSB8fCAhcG9ydC0+Z3MudHR5LT50ZXJtaW9zKSByZXR1cm4gMDsKKworCWNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCisJaWYgKGNoYW5uZWwgPT0gQ0hBTk5FTF9BKQorCQlyZXR1cm4gMDsJCS8qIFNldHRpbmdzIGNvbnRyb2xsZWQgYnkgYm9vdCBQUk9NICovCisKKwljZmxhZyAgPSBwb3J0LT5ncy50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisJYmF1ZCA9IHBvcnQtPmdzLmJhdWQ7CisJY2hzaXplID0gKGNmbGFnICYgQ1NJWkUpID4+IDQ7CisKKwlpZiAoYmF1ZCA9PSAwKSB7CisJCS8qIHNwZWVkID09IDAgLT4gZHJvcCBEVFIgKi8KKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlTQ0Ntb2QoVFhfQ1RSTF9SRUcsIH5UQ1JfRFRSLCAwKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJZWxzZSBpZiAoKE1BQ0hfSVNfTVZNRTE2eCAmJiAoYmF1ZCA8IDUwIHx8IGJhdWQgPiAzODQwMCkpIHx8CisJCSAoTUFDSF9JU19NVk1FMTQ3ICYmIChiYXVkIDwgNTAgfHwgYmF1ZCA+IDE5MjAwKSkgfHwKKwkJIChNQUNIX0lTX0JWTUU2MDAwICYmKGJhdWQgPCA1MCB8fCBiYXVkID4gNzY4MDApKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIlNDQzogQmFkIHNwZWVkIHJlcXVlc3RlZCwgJWRcbiIsIGJhdWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY2ZsYWcgJiBDTE9DQUwpCisJCXBvcnQtPmdzLmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwllbHNlCisJCXBvcnQtPmdzLmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCisjaWZkZWYgQ09ORklHX01WTUUxNDdfU0NDCisJaWYgKE1BQ0hfSVNfTVZNRTE0NykKKwkJYnJndmFsID0gKE0xNDdfU0NDX1BDTEsgKyBiYXVkLzIpIC8gKDE2ICogMiAqIGJhdWQpIC0gMjsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVk1FMTYyX1NDQworCWlmIChNQUNIX0lTX01WTUUxNngpCisJCWJyZ3ZhbCA9IChNVk1FX1NDQ19QQ0xLICsgYmF1ZC8yKSAvICgxNiAqIDIgKiBiYXVkKSAtIDI7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlZNRTYwMDBfU0NDCisJaWYgKE1BQ0hfSVNfQlZNRTYwMDApCisJCWJyZ3ZhbCA9IChCVk1FX1NDQ19SVHhDICsgYmF1ZC8yKSAvICgxNiAqIDIgKiBiYXVkKSAtIDI7CisjZW5kaWYKKwkvKiBOb3cgd2UgaGF2ZSBhbGwgcGFyYW1ldGVycyBhbmQgY2FuIGdvIHRvIHNldCB0aGVtOiAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIHJlY2VpdmVyJ3MgY2hhcmFjdGVyIHNpemUgYW5kIGF1dG8tZW5hYmxlcyAqLworCVNDQ21vZChSWF9DVFJMX1JFRywgfihSQ1JfQ0hTSVpFX01BU0t8UkNSX0FVVE9fRU5BQl9NT0RFKSwKKwkJCShjaHNpemVfbWFwW2Noc2l6ZV0gPDwgNikgfAorCQkJKChjZmxhZyAmIENSVFNDVFMpID8gUkNSX0FVVE9fRU5BQl9NT0RFIDogMCkpOworCS8qIHBhcml0eSBhbmQgc3RvcCBiaXRzIChib3RoLCBUeCBhbmQgUngpLCBjbG9jayBtb2RlIG5ldmVyIGNoYW5nZXMgKi8KKwlTQ0Ntb2QgKEFVWDFfQ1RSTF9SRUcsCisJCX4oQTFDUl9QQVJJVFlfTUFTSyB8IEExQ1JfTU9ERV9NQVNLKSwKKwkJKChjZmxhZyAmIFBBUkVOQgorCQkgID8gKGNmbGFnICYgUEFST0REID8gQTFDUl9QQVJJVFlfT0REIDogQTFDUl9QQVJJVFlfRVZFTikKKwkJICA6IEExQ1JfUEFSSVRZX05PTkUpCisJCSB8IChjZmxhZyAmIENTVE9QQiA/IEExQ1JfTU9ERV9BU1lOQ18yIDogQTFDUl9NT0RFX0FTWU5DXzEpKSk7CisJLyogc2VuZGVyJ3MgY2hhcmFjdGVyIHNpemUsIHNldCBEVFIgZm9yIHZhbGlkIGJhdWQgcmF0ZSAqLworCVNDQ21vZChUWF9DVFJMX1JFRywgflRDUl9DSFNJWkVfTUFTSywgY2hzaXplX21hcFtjaHNpemVdIDw8IDUgfCBUQ1JfRFRSKTsKKwkvKiBjbG9jayBzb3VyY2VzIG5ldmVyIGNoYW5nZSAqLworCS8qIGRpc2FibGUgQlJHIGJlZm9yZSBjaGFuZ2luZyB0aGUgdmFsdWUgKi8KKwlTQ0Ntb2QoRFBMTF9DVFJMX1JFRywgfkRDUl9CUkdfRU5BQiwgMCk7CisJLyogQlJHIHZhbHVlICovCisJU0NDd3JpdGUoVElNRVJfTE9XX1JFRywgYnJndmFsICYgMHhmZik7CisJU0NDd3JpdGUoVElNRVJfSElHSF9SRUcsIChicmd2YWwgPj4gOCkgJiAweGZmKTsKKwkvKiBCUkcgZW5hYmxlLCBhbmQgY2xvY2sgc291cmNlIG5ldmVyIGNoYW5nZXMgKi8KKwlTQ0Ntb2QoRFBMTF9DVFJMX1JFRywgMHhmZiwgRENSX0JSR19FTkFCKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc2NjX2NoYXJzX2luX2J1ZmZlciAodm9pZCAqcHRyKQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IHB0cjsKKwlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CisKKwlyZXR1cm4gKFNDQ3JlYWQgKFNQQ09ORF9TVEFUVVNfUkVHKSAmIFNDU1JfQUxMX1NFTlQpID8gMCAgOiAxOworfQorCisKKy8qIENvbW1lbnQgdGFrZW4gZnJvbSBzeC5jICgyLjQuMCk6CisgICBJIGhhdmVuJ3QgdGhlIGZvZ2dpZXN0IHdoeSB0aGUgZGVjcmVtZW50IHVzZSBjb3VudCBoYXMgdG8gaGFwcGVuCisgICBoZXJlLiBUaGUgd2hvbGUgbGludXggc2VyaWFsIGRyaXZlcnMgc3R1ZmYgbmVlZHMgdG8gYmUgcmVkZXNpZ25lZC4KKyAgIE15IGd1ZXNzIGlzIHRoYXQgdGhpcyBpcyBhIGhhY2sgdG8gbWluaW1pemUgdGhlIGltcGFjdCBvZiBhIGJ1ZworICAgZWxzZXdoZXJlLiBUaGlua2luZyBhYm91dCBpdCBzb21lIG1vcmUuICh0cnkgaXQgc29tZXRpbWUpIFRyeQorICAgcnVubmluZyBtaW5pY29tIG9uIGEgc2VyaWFsIHBvcnQgdGhhdCBpcyBkcml2ZW4gYnkgYSBtb2R1bGFyaXplZAorICAgZHJpdmVyLiBIYXZlIHRoZSBtb2RlbSBoYW5ndXAuIFRoZW4gcmVtb3ZlIHRoZSBkcml2ZXIgbW9kdWxlLiBUaGVuCisgICBleGl0IG1pbmljb20uICBJIGV4cGVjdCBhbiAib29wcyIuICAtLSBSRVcgKi8KKworc3RhdGljIHZvaWQgc2NjX2h1bmd1cCh2b2lkICpwdHIpCit7CisJc2NjX2Rpc2FibGVfdHhfaW50ZXJydXB0cyhwdHIpOworCXNjY19kaXNhYmxlX3J4X2ludGVycnVwdHMocHRyKTsKK30KKworCitzdGF0aWMgdm9pZCBzY2NfY2xvc2Uodm9pZCAqcHRyKQoreworCXNjY19kaXNhYmxlX3R4X2ludGVycnVwdHMocHRyKTsKKwlzY2NfZGlzYWJsZV9yeF9pbnRlcnJ1cHRzKHB0cik7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEludGVybmFsIHN1cHBvcnQgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgc2NjX3NldHNpZ25hbHMoc3RydWN0IHNjY19wb3J0ICpwb3J0LCBpbnQgZHRyLCBpbnQgcnRzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB0OworCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl0ID0gU0NDcmVhZChUWF9DVFJMX1JFRyk7CisJaWYgKGR0ciA+PSAwKSB0ID0gZHRyPyAodCB8IFRDUl9EVFIpOiAodCAmIH5UQ1JfRFRSKTsKKwlpZiAocnRzID49IDApIHQgPSBydHM/ICh0IHwgVENSX1JUUyk6ICh0ICYgflRDUl9SVFMpOworCVNDQ3dyaXRlKFRYX0NUUkxfUkVHLCB0KTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgc2NjX3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKK3sKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQgPSAoc3RydWN0IHNjY19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKworCXBvcnQtPnhfY2hhciA9IGNoOworCWlmIChjaCkKKwkJc2NjX2VuYWJsZV90eF9pbnRlcnJ1cHRzKHBvcnQpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEcml2ZXIgZW50cnlwb2ludHMgcmVmZXJlbmNlZCBmcm9tIGFib3ZlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzY2Nfb3BlbiAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlpbnQgbGluZSA9IHR0eS0+aW5kZXg7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQgPSAmc2NjX3BvcnRzW2xpbmVdOworCWludCBpLCBjaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKKyNpZiBkZWZpbmVkKENPTkZJR19NVk1FMTYyX1NDQykgfHwgZGVmaW5lZChDT05GSUdfTVZNRTE0N19TQ0MpCisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCXVuc2lnbmVkIHJlZywgdmFsOworCX0gbXZtZV9pbml0X3RhYltdID0geworCQkvKiBWYWx1ZXMgZm9yIE1WTUUxNjIgYW5kIE1WTUUxNDcgKi8KKwkJLyogbm8gcGFyaXR5LCAxIHN0b3AgYml0LCBhc3luYywgMToxNiAqLworCQl7IEFVWDFfQ1RSTF9SRUcsIEExQ1JfUEFSSVRZX05PTkV8QTFDUl9NT0RFX0FTWU5DXzF8QTFDUl9DTEtNT0RFX3gxNiB9LAorCQkvKiBwYXJpdHkgZXJyb3IgaXMgc3BlY2lhbCBjb25kLCBpbnRzIGRpc2FibGVkLCBubyBETUEgKi8KKwkJeyBJTlRfQU5EX0RNQV9SRUcsIElEUl9QQVJFUlJfQVNfU1BDT05EIHwgSURSX1JYX0lOVF9ESVNBQiB9LAorCQkvKiBSeCA4IGJpdHMvY2hhciwgbm8gYXV0byBlbmFibGUsIFJ4IG9mZiAqLworCQl7IFJYX0NUUkxfUkVHLCBSQ1JfQ0hTSVpFXzggfSwKKwkJLyogRFRSIG9mZiwgVHggOCBiaXRzL2NoYXIsIFJUUyBvZmYsIFR4IG9mZiAqLworCQl7IFRYX0NUUkxfUkVHLCBUQ1JfQ0hTSVpFXzggfSwKKwkJLyogc3BlY2lhbCBmZWF0dXJlcyBvZmYgKi8KKwkJeyBBVVgyX0NUUkxfUkVHLCAwIH0sCisJCXsgQ0xLX0NUUkxfUkVHLCBDQ1JfUlhDTEtfQlJHIHwgQ0NSX1RYQ0xLX0JSRyB9LAorCQl7IERQTExfQ1RSTF9SRUcsIERDUl9CUkdfRU5BQiB8IERDUl9CUkdfVVNFX1BDTEsgfSwKKwkJLyogU3RhcnQgUnggKi8KKwkJeyBSWF9DVFJMX1JFRywgUkNSX1JYX0VOQUIgfCBSQ1JfQ0hTSVpFXzggfSwKKwkJLyogU3RhcnQgVHggKi8KKwkJeyBUWF9DVFJMX1JFRywgVENSX1RYX0VOQUIgfCBUQ1JfUlRTIHwgVENSX0RUUiB8IFRDUl9DSFNJWkVfOCB9LAorCQkvKiBFeHQvU3RhdCBpbnRzOiBEQ0Qgb25seSAqLworCQl7IElOVF9DVFJMX1JFRywgSUNSX0VOQUJfRENEX0lOVCB9LAorCQkvKiBSZXNldCBFeHQvU3RhdCBpbnRzICovCisJCXsgQ09NTUFORF9SRUcsIENSX0VYVFNUQVRfUkVTRVQgfSwKKwkJLyogLi4uYWdhaW4gKi8KKwkJeyBDT01NQU5EX1JFRywgQ1JfRVhUU1RBVF9SRVNFVCB9LAorCX07CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19CVk1FNjAwMF9TQ0MpCisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCXVuc2lnbmVkIHJlZywgdmFsOworCX0gYnZtZV9pbml0X3RhYltdID0geworCQkvKiBWYWx1ZXMgZm9yIEJWTUU2MDAwICovCisJCS8qIG5vIHBhcml0eSwgMSBzdG9wIGJpdCwgYXN5bmMsIDE6MTYgKi8KKwkJeyBBVVgxX0NUUkxfUkVHLCBBMUNSX1BBUklUWV9OT05FfEExQ1JfTU9ERV9BU1lOQ18xfEExQ1JfQ0xLTU9ERV94MTYgfSwKKwkJLyogcGFyaXR5IGVycm9yIGlzIHNwZWNpYWwgY29uZCwgaW50cyBkaXNhYmxlZCwgbm8gRE1BICovCisJCXsgSU5UX0FORF9ETUFfUkVHLCBJRFJfUEFSRVJSX0FTX1NQQ09ORCB8IElEUl9SWF9JTlRfRElTQUIgfSwKKwkJLyogUnggOCBiaXRzL2NoYXIsIG5vIGF1dG8gZW5hYmxlLCBSeCBvZmYgKi8KKwkJeyBSWF9DVFJMX1JFRywgUkNSX0NIU0laRV84IH0sCisJCS8qIERUUiBvZmYsIFR4IDggYml0cy9jaGFyLCBSVFMgb2ZmLCBUeCBvZmYgKi8KKwkJeyBUWF9DVFJMX1JFRywgVENSX0NIU0laRV84IH0sCisJCS8qIHNwZWNpYWwgZmVhdHVyZXMgb2ZmICovCisJCXsgQVVYMl9DVFJMX1JFRywgMCB9LAorCQl7IENMS19DVFJMX1JFRywgQ0NSX1JUeENfWFRBTCB8IENDUl9SWENMS19CUkcgfCBDQ1JfVFhDTEtfQlJHIH0sCisJCXsgRFBMTF9DVFJMX1JFRywgRENSX0JSR19FTkFCIH0sCisJCS8qIFN0YXJ0IFJ4ICovCisJCXsgUlhfQ1RSTF9SRUcsIFJDUl9SWF9FTkFCIHwgUkNSX0NIU0laRV84IH0sCisJCS8qIFN0YXJ0IFR4ICovCisJCXsgVFhfQ1RSTF9SRUcsIFRDUl9UWF9FTkFCIHwgVENSX1JUUyB8IFRDUl9EVFIgfCBUQ1JfQ0hTSVpFXzggfSwKKwkJLyogRXh0L1N0YXQgaW50czogRENEIG9ubHkgKi8KKwkJeyBJTlRfQ1RSTF9SRUcsIElDUl9FTkFCX0RDRF9JTlQgfSwKKwkJLyogUmVzZXQgRXh0L1N0YXQgaW50cyAqLworCQl7IENPTU1BTkRfUkVHLCBDUl9FWFRTVEFUX1JFU0VUIH0sCisJCS8qIC4uLmFnYWluICovCisJCXsgQ09NTUFORF9SRUcsIENSX0VYVFNUQVRfUkVTRVQgfSwKKwl9OworI2VuZGlmCisJaWYgKCEocG9ydC0+Z3MuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworI2lmIGRlZmluZWQoQ09ORklHX01WTUUxNDdfU0NDKSB8fCBkZWZpbmVkKENPTkZJR19NVk1FMTYyX1NDQykKKwkJaWYgKE1BQ0hfSVNfTVZNRTE0NyB8fCBNQUNIX0lTX01WTUUxNngpIHsKKwkJCWZvciAoaT0wOyBpPHNpemVvZihtdm1lX2luaXRfdGFiKS9zaXplb2YoKm12bWVfaW5pdF90YWIpOyArK2kpCisJCQkJU0NDd3JpdGUobXZtZV9pbml0X3RhYltpXS5yZWcsIG12bWVfaW5pdF90YWJbaV0udmFsKTsKKwkJfQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQlZNRTYwMDBfU0NDKQorCQlpZiAoTUFDSF9JU19CVk1FNjAwMCkgeworCQkJZm9yIChpPTA7IGk8c2l6ZW9mKGJ2bWVfaW5pdF90YWIpL3NpemVvZigqYnZtZV9pbml0X3RhYik7ICsraSkKKwkJCQlTQ0N3cml0ZShidm1lX2luaXRfdGFiW2ldLnJlZywgYnZtZV9pbml0X3RhYltpXS52YWwpOworCQl9CisjZW5kaWYKKworCQkvKiByZW1lbWJlciBzdGF0dXMgcmVnaXN0ZXIgZm9yIGRldGVjdGlvbiBvZiBEQ0QgYW5kIENUUyBjaGFuZ2VzICovCisJCXNjY19sYXN0X3N0YXR1c19yZWdbY2hhbm5lbF0gPSBTQ0NyZWFkKFNUQVRVU19SRUcpOworCisJCXBvcnQtPmNfZGNkID0gMDsJLyogUHJldmVudCBpbml0aWFsIDEtPjAgaW50ZXJydXB0ICovCisJCXNjY19zZXRzaWduYWxzIChwb3J0LCAxLDEpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCisJdHR5LT5kcml2ZXJfZGF0YSA9IHBvcnQ7CisJcG9ydC0+Z3MudHR5ID0gdHR5OworCXBvcnQtPmdzLmNvdW50Kys7CisJcmV0dmFsID0gZ3NfaW5pdF9wb3J0KCZwb3J0LT5ncyk7CisJaWYgKHJldHZhbCkgeworCQlwb3J0LT5ncy5jb3VudC0tOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlwb3J0LT5ncy5mbGFncyB8PSBHU19BQ1RJVkU7CisJcmV0dmFsID0gZ3NfYmxvY2tfdGlsX3JlYWR5KHBvcnQsIGZpbHApOworCisJaWYgKHJldHZhbCkgeworCQlwb3J0LT5ncy5jb3VudC0tOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXBvcnQtPmNfZGNkID0gc2NjX2dldF9DRCAocG9ydCk7CisKKwlzY2NfZW5hYmxlX3J4X2ludGVycnVwdHMocG9ydCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBzY2NfdGhyb3R0bGUgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc2NjX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJU0NDX0FDQ0VTU19JTklUKHBvcnQpOworCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlTQ0Ntb2QoVFhfQ1RSTF9SRUcsIH5UQ1JfUlRTLCAwKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKwlpZiAoSV9JWE9GRih0dHkpKQorCQlzY2Nfc2VuZF94Y2hhcih0dHksIFNUT1BfQ0hBUih0dHkpKTsKK30KKworCitzdGF0aWMgdm9pZCBzY2NfdW50aHJvdHRsZSAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHNjY19wb3J0ICpwb3J0ID0gKHN0cnVjdCBzY2NfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCVNDQ21vZChUWF9DVFJMX1JFRywgMHhmZiwgVENSX1JUUyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9CisJaWYgKElfSVhPRkYodHR5KSkKKwkJc2NjX3NlbmRfeGNoYXIodHR5LCBTVEFSVF9DSEFSKHR0eSkpOworfQorCisKK3N0YXRpYyBpbnQgc2NjX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisKKworc3RhdGljIHZvaWQgc2NjX2JyZWFrX2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCit7CisJc3RydWN0IHNjY19wb3J0ICpwb3J0ID0gKHN0cnVjdCBzY2NfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJU0NDbW9kKFRYX0NUUkxfUkVHLCB+VENSX1NFTkRfQlJFQUssIAorCQkJYnJlYWtfc3RhdGUgPyBUQ1JfU0VORF9CUkVBSyA6IDApOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2VyaWFsIGNvbnNvbGUgc3R1ZmYuLi4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIHNjY19kZWxheSgpIGRvIHsgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIgbm9wOyBub3AiKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgc2NjX2NoX3dyaXRlIChjaGFyIGNoKQoreworCXZvbGF0aWxlIGNoYXIgKnAgPSBOVUxMOworCQorI2lmZGVmIENPTkZJR19NVk1FMTQ3X1NDQworCWlmIChNQUNIX0lTX01WTUUxNDcpCisJCXAgPSAodm9sYXRpbGUgY2hhciAqKU0xNDdfU0NDX0FfQUREUjsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVk1FMTYyX1NDQworCWlmIChNQUNIX0lTX01WTUUxNngpCisJCXAgPSAodm9sYXRpbGUgY2hhciAqKU1WTUVfU0NDX0FfQUREUjsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CVk1FNjAwMF9TQ0MKKwlpZiAoTUFDSF9JU19CVk1FNjAwMCkKKwkJcCA9ICh2b2xhdGlsZSBjaGFyICopQlZNRV9TQ0NfQV9BRERSOworI2VuZGlmCisKKwlkbyB7CisJCXNjY19kZWxheSgpOworCX0KKwl3aGlsZSAoISgqcCAmIDQpKTsKKwlzY2NfZGVsYXkoKTsKKwkqcCA9IDg7CisJc2NjX2RlbGF5KCk7CisJKnAgPSBjaDsKK30KKworLyogVGhlIGNvbnNvbGUgbXVzdCBiZSBsb2NrZWQgd2hlbiB3ZSBnZXQgaGVyZS4gKi8KKworc3RhdGljIHZvaWQgc2NjX2NvbnNvbGVfd3JpdGUgKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJd2hpbGUgKGNvdW50LS0pCisJeworCQlpZiAoKnN0ciA9PSAnXG4nKQorCQkJc2NjX2NoX3dyaXRlICgnXHInKTsKKwkJc2NjX2NoX3dyaXRlICgqc3RyKyspOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2NjX2NvbnNvbGVfZGV2aWNlKHN0cnVjdCBjb25zb2xlICpjLCBpbnQgKmluZGV4KQoreworCSppbmRleCA9IGMtPmluZGV4OworCXJldHVybiBzY2NfZHJpdmVyOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHNjY19jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGNvbnNvbGUgc2VyY29ucyA9IHsKKwkubmFtZQkJPSAidHR5UyIsCisJLndyaXRlCQk9IHNjY19jb25zb2xlX3dyaXRlLAorCS5kZXZpY2UJCT0gc2NjX2NvbnNvbGVfZGV2aWNlLAorCS5zZXR1cAkJPSBzY2NfY29uc29sZV9zZXR1cCwKKwkuZmxhZ3MJCT0gQ09OX1BSSU5UQlVGRkVSLAorCS5pbmRleAkJPSAtMSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgdm1lX3NjY19jb25zb2xlX2luaXQodm9pZCkKK3sKKwlpZiAodm1lX2JyZHR5cGUgPT0gVk1FX1RZUEVfTVZNRTE0NyB8fAorCQkJdm1lX2JyZHR5cGUgPT0gVk1FX1RZUEVfTVZNRTE2MiB8fAorCQkJdm1lX2JyZHR5cGUgPT0gVk1FX1RZUEVfTVZNRTE3MiB8fAorCQkJdm1lX2JyZHR5cGUgPT0gVk1FX1RZUEVfQlZNRTQwMDAgfHwKKwkJCXZtZV9icmR0eXBlID09IFZNRV9UWVBFX0JWTUU2MDAwKQorCQlyZWdpc3Rlcl9jb25zb2xlKCZzZXJjb25zKTsKKwlyZXR1cm4gMDsKK30KK2NvbnNvbGVfaW5pdGNhbGwodm1lX3NjY19jb25zb2xlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZyNDF4eF9ydGMuYyBiL2RyaXZlcnMvY2hhci92cjQxeHhfcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZkYmU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci92cjQxeHhfcnRjLmMKQEAgLTAsMCArMSw3MDkgQEAKKy8qCisgKiAgRHJpdmVyIGZvciBORUMgVlI0MTAwIHNlcmllcyAgUmVhbCBUaW1lIENsb2NrIHVuaXQuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA1ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3ZyNDF4eC92cjQxeHguaD4KKworTU9EVUxFX0FVVEhPUigiWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTkVDIFZSNDEwMCBzZXJpZXMgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIFJUQzFfVFlQRTFfU1RBUlQJMHgwYjAwMDBjMFVMCisjZGVmaW5lIFJUQzFfVFlQRTFfRU5ECQkweDBiMDAwMGRmVUwKKyNkZWZpbmUgUlRDMl9UWVBFMV9TVEFSVAkweDBiMDAwMWMwVUwKKyNkZWZpbmUgUlRDMl9UWVBFMV9FTkQJCTB4MGIwMDAxZGZVTAorCisjZGVmaW5lIFJUQzFfVFlQRTJfU1RBUlQJMHgwZjAwMDEwMFVMCisjZGVmaW5lIFJUQzFfVFlQRTJfRU5ECQkweDBmMDAwMTFmVUwKKyNkZWZpbmUgUlRDMl9UWVBFMl9TVEFSVAkweDBmMDAwMTIwVUwKKyNkZWZpbmUgUlRDMl9UWVBFMl9FTkQJCTB4MGYwMDAxM2ZVTAorCisjZGVmaW5lIFJUQzFfU0laRQkJMHgyMAorI2RlZmluZSBSVEMyX1NJWkUJCTB4MjAKKworLyogUlRDIDEgcmVnaXN0ZXJzICovCisjZGVmaW5lIEVUSU1FTFJFRwkJMHgwMAorI2RlZmluZSBFVElNRU1SRUcJCTB4MDIKKyNkZWZpbmUgRVRJTUVIUkVHCQkweDA0CisvKiBSRlUgKi8KKyNkZWZpbmUgRUNNUExSRUcJCTB4MDgKKyNkZWZpbmUgRUNNUE1SRUcJCTB4MGEKKyNkZWZpbmUgRUNNUEhSRUcJCTB4MGMKKy8qIFJGVSAqLworI2RlZmluZSBSVENMMUxSRUcJCTB4MTAKKyNkZWZpbmUgUlRDTDFIUkVHCQkweDEyCisjZGVmaW5lIFJUQ0wxQ05UTFJFRwkJMHgxNAorI2RlZmluZSBSVENMMUNOVEhSRUcJCTB4MTYKKyNkZWZpbmUgUlRDTDJMUkVHCQkweDE4CisjZGVmaW5lIFJUQ0wySFJFRwkJMHgxYQorI2RlZmluZSBSVENMMkNOVExSRUcJCTB4MWMKKyNkZWZpbmUgUlRDTDJDTlRIUkVHCQkweDFlCisKKy8qIFJUQyAyIHJlZ2lzdGVycyAqLworI2RlZmluZSBUQ0xLTFJFRwkJMHgwMAorI2RlZmluZSBUQ0xLSFJFRwkJMHgwMgorI2RlZmluZSBUQ0xLQ05UTFJFRwkJMHgwNAorI2RlZmluZSBUQ0xLQ05USFJFRwkJMHgwNgorLyogUkZVICovCisjZGVmaW5lIFJUQ0lOVFJFRwkJMHgxZQorICNkZWZpbmUgVENMT0NLX0lOVAkJMHgwOAorICNkZWZpbmUgUlRDTE9ORzJfSU5UCQkweDA0CisgI2RlZmluZSBSVENMT05HMV9JTlQJCTB4MDIKKyAjZGVmaW5lIEVMQVBTRURUSU1FX0lOVAkweDAxCisKKyNkZWZpbmUgUlRDX0ZSRVFVRU5DWQkJMzI3NjgKKyNkZWZpbmUgTUFYX1BFUklPRElDX1JBVEUJNjU1MworI2RlZmluZSBNQVhfVVNFUl9QRVJJT0RJQ19SQVRFCTY0CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnJ0YzFfYmFzZTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnJ0YzJfYmFzZTsKKworI2RlZmluZSBydGMxX3JlYWQob2Zmc2V0KQkJcmVhZHcocnRjMV9iYXNlICsgKG9mZnNldCkpCisjZGVmaW5lIHJ0YzFfd3JpdGUob2Zmc2V0LCB2YWx1ZSkJd3JpdGV3KCh2YWx1ZSksIHJ0YzFfYmFzZSArIChvZmZzZXQpKQorCisjZGVmaW5lIHJ0YzJfcmVhZChvZmZzZXQpCQlyZWFkdyhydGMyX2Jhc2UgKyAob2Zmc2V0KSkKKyNkZWZpbmUgcnRjMl93cml0ZShvZmZzZXQsIHZhbHVlKQl3cml0ZXcoKHZhbHVlKSwgcnRjMl9iYXNlICsgKG9mZnNldCkpCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVwb2NoID0gMTk3MDsJLyogSmFuIDEgMTk3MCAwMDowMDowMCAqLworCitzdGF0aWMgc3BpbmxvY2tfdCBydGNfdGFza19sb2NrOworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IHJ0Y193YWl0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjX2lycV9kYXRhOworc3RhdGljIHN0cnVjdCBmYXN5bmNfc3RydWN0ICpydGNfYXN5bmNfcXVldWU7CitzdGF0aWMgcnRjX3Rhc2tfdCAqcnRjX2NhbGxiYWNrOworc3RhdGljIGNoYXIgcnRjX25hbWVbXSA9ICJSVEMiOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyaW9kaWNfZnJlcXVlbmN5Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyaW9kaWNfY291bnQ7CisKK3R5cGVkZWYgZW51bSB7CisJUlRDX1JFTEVBU0UsCisJUlRDX09QRU4sCit9IHJ0Y19zdGF0dXNfdDsKKworc3RhdGljIHJ0Y19zdGF0dXNfdCBydGNfc3RhdHVzOworCit0eXBlZGVmIGVudW0geworCUZVTkNUSU9OX1JUQ19JT0NUTCwKKwlGVU5DVElPTl9SVENfQ09OVFJPTCwKK30gcnRjX2NhbGxmcm9tX3Q7CisKK3N0cnVjdCByZXNvdXJjZSBydGNfcmVzb3VyY2VbMl0gPSB7CisJewkubmFtZQk9IHJ0Y19uYW1lLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwJfSwKKwl7CS5uYW1lCT0gcnRjX25hbWUsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAl9LAorfTsKKworI2RlZmluZSBSVENfTlVNX1JFU09VUkNFUwlzaXplb2YocnRjX3Jlc291cmNlKSAvIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX2VsYXBzZWRfc2Vjb25kKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9sb3csIGZpcnN0X21pZCwgZmlyc3RfaGlnaDsKKwl1bnNpZ25lZCBsb25nIHNlY29uZF9sb3csIHNlY29uZF9taWQsIHNlY29uZF9oaWdoOworCisJZG8geworCQlmaXJzdF9sb3cgPSBydGMxX3JlYWQoRVRJTUVMUkVHKTsKKwkJZmlyc3RfbWlkID0gcnRjMV9yZWFkKEVUSU1FTVJFRyk7CisJCWZpcnN0X2hpZ2ggPSBydGMxX3JlYWQoRVRJTUVIUkVHKTsKKwkJc2Vjb25kX2xvdyA9IHJ0YzFfcmVhZChFVElNRUxSRUcpOworCQlzZWNvbmRfbWlkID0gcnRjMV9yZWFkKEVUSU1FTVJFRyk7CisJCXNlY29uZF9oaWdoID0gcnRjMV9yZWFkKEVUSU1FSFJFRyk7CisJfSB3aGlsZSAoZmlyc3RfbG93ICE9IHNlY29uZF9sb3cgfHwgZmlyc3RfbWlkICE9IHNlY29uZF9taWQgfHwKKwkgICAgICAgICBmaXJzdF9oaWdoICE9IHNlY29uZF9oaWdoKTsKKworCXJldHVybiAoZmlyc3RfaGlnaCA8PCAxNykgfCAoZmlyc3RfbWlkIDw8IDEpIHwgKGZpcnN0X2xvdyA+PiAxNSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9lbGFwc2VkX3NlY29uZCh1bnNpZ25lZCBsb25nIHNlYykKK3sKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwlydGMxX3dyaXRlKEVUSU1FTFJFRywgKHVpbnQxNl90KShzZWMgPDwgMTUpKTsKKwlydGMxX3dyaXRlKEVUSU1FTVJFRywgKHVpbnQxNl90KShzZWMgPj4gMSkpOworCXJ0YzFfd3JpdGUoRVRJTUVIUkVHLCAodWludDE2X3QpKHNlYyA+PiAxNykpOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9hbGFybShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCit7CisJdW5zaWduZWQgbG9uZyBhbGFybV9zZWM7CisKKwlhbGFybV9zZWMgPSBta3RpbWUodGltZS0+dG1feWVhciArIDE5MDAsIHRpbWUtPnRtX21vbiArIDEsIHRpbWUtPnRtX21kYXksCisJICAgICAgICAgICAgICAgICAgIHRpbWUtPnRtX2hvdXIsIHRpbWUtPnRtX21pbiwgdGltZS0+dG1fc2VjKTsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCXJ0YzFfd3JpdGUoRUNNUExSRUcsICh1aW50MTZfdCkoYWxhcm1fc2VjIDw8IDE1KSk7CisJcnRjMV93cml0ZShFQ01QTVJFRywgKHVpbnQxNl90KShhbGFybV9zZWMgPj4gMSkpOworCXJ0YzFfd3JpdGUoRUNNUEhSRUcsICh1aW50MTZfdCkoYWxhcm1fc2VjID4+IDE3KSk7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9hbGFybShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCit7CisJdW5zaWduZWQgbG9uZyBsb3csIG1pZCwgaGlnaDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWxvdyA9IHJ0YzFfcmVhZChFQ01QTFJFRyk7CisJbWlkID0gcnRjMV9yZWFkKEVDTVBNUkVHKTsKKwloaWdoID0gcnRjMV9yZWFkKEVDTVBIUkVHKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJdG9fdG0oKGhpZ2ggPDwgMTcpIHwgKG1pZCA8PCAxKSB8IChsb3cgPj4gMTUpLCB0aW1lKTsKKwl0aW1lLT50bV95ZWFyIC09IDE5MDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCit7CisJdW5zaWduZWQgbG9uZyBlcG9jaF9zZWMsIGVsYXBzZWRfc2VjOworCisJZXBvY2hfc2VjID0gbWt0aW1lKGVwb2NoLCAxLCAxLCAwLCAwLCAwKTsKKwllbGFwc2VkX3NlYyA9IHJlYWRfZWxhcHNlZF9zZWNvbmQoKTsKKworCXRvX3RtKGVwb2NoX3NlYyArIGVsYXBzZWRfc2VjLCB0aW1lKTsKKwl0aW1lLT50bV95ZWFyIC09IDE5MDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF90aW1lKHN0cnVjdCBydGNfdGltZSAqdGltZSkKK3sKKwl1bnNpZ25lZCBsb25nIGVwb2NoX3NlYywgY3VycmVudF9zZWM7CisKKwllcG9jaF9zZWMgPSBta3RpbWUoZXBvY2gsIDEsIDEsIDAsIDAsIDApOworCWN1cnJlbnRfc2VjID0gbWt0aW1lKHRpbWUtPnRtX3llYXIgKyAxOTAwLCB0aW1lLT50bV9tb24gKyAxLCB0aW1lLT50bV9tZGF5LAorCSAgICAgICAgICAgICAgICAgICAgIHRpbWUtPnRtX2hvdXIsIHRpbWUtPnRtX21pbiwgdGltZS0+dG1fc2VjKTsKKworCXdyaXRlX2VsYXBzZWRfc2Vjb25kKGN1cnJlbnRfc2VjIC0gZXBvY2hfc2VjKTsKK30KKworc3RhdGljIHNzaXplX3QgcnRjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgaXJxX2RhdGE7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoY291bnQgIT0gc2l6ZW9mKHVuc2lnbmVkIGludCkgJiYgY291bnQgIT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFkZF93YWl0X3F1ZXVlKCZydGNfd2FpdCwgJndhaXQpOworCisJZG8geworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCQlpcnFfZGF0YSA9IHJ0Y19pcnFfZGF0YTsKKwkJcnRjX2lycV9kYXRhID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwkJaWYgKGlycV9kYXRhICE9IDApCisJCQlicmVhazsKKworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCWlmIChyZXR2YWwgPT0gMCkgeworCQlpZiAoY291bnQgPT0gc2l6ZW9mKHVuc2lnbmVkIGludCkpIHsKKwkJCXJldHZhbCA9IHB1dF91c2VyKGlycV9kYXRhLCAodW5zaWduZWQgaW50IF9fdXNlciAqKWJ1Zik7CisJCQlpZiAocmV0dmFsID09IDApCisJCQkJcmV0dmFsID0gc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJCX0gZWxzZSB7CisJCQlyZXR2YWwgPSBwdXRfdXNlcihpcnFfZGF0YSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYnVmKTsKKwkJCWlmIChyZXR2YWwgPT0gMCkKKwkJCQlyZXR2YWwgPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCX0KKworCX0KKworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcnRjX3dhaXQsICZ3YWl0KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnRjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqdGFibGUpCit7CisJcG9sbF93YWl0KGZpbGUsICZydGNfd2FpdCwgdGFibGUpOworCisJaWYgKHJ0Y19pcnFfZGF0YSAhPSAwKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0Y19kb19pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywgcnRjX2NhbGxmcm9tX3QgZnJvbSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgdGltZTsKKwl1bnNpZ25lZCBsb25nIGNvdW50OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT046CisJCWVuYWJsZV9pcnEoRUxBUFNFRFRJTUVfSVJRKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfQUlFX09GRjoKKwkJZGlzYWJsZV9pcnEoRUxBUFNFRFRJTUVfSVJRKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfUElFX09OOgorCQllbmFibGVfaXJxKFJUQ0xPTkcxX0lSUSk7CisJCWJyZWFrOworCWNhc2UgUlRDX1BJRV9PRkY6CisJCWRpc2FibGVfaXJxKFJUQ0xPTkcxX0lSUSk7CisJCWJyZWFrOworCWNhc2UgUlRDX0FMTV9TRVQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdGltZSwgKHN0cnVjdCBydGNfdGltZSBfX3VzZXIgKilhcmcsCisJCSAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzZXRfYWxhcm0oJnRpbWUpOworCQlicmVhazsKKwljYXNlIFJUQ19BTE1fUkVBRDoKKwkJbWVtc2V0KCZ0aW1lLCAwLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSk7CisJCXJlYWRfYWxhcm0oJnRpbWUpOworCQlicmVhazsKKwljYXNlIFJUQ19SRF9USU1FOgorCQltZW1zZXQoJnRpbWUsIDAsIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKTsKKwkJcmVhZF90aW1lKCZ0aW1lKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ0aW1lLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBSVENfU0VUX1RJTUU6CisJCWlmIChjYXBhYmxlKENBUF9TWVNfVElNRSkgPT0gMCkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdGltZSwgKHN0cnVjdCBydGNfdGltZSBfX3VzZXIgKilhcmcsCisJCSAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzZXRfdGltZSgmdGltZSk7CisJCWJyZWFrOworCWNhc2UgUlRDX0lSUVBfUkVBRDoKKwkJcmV0dXJuIHB1dF91c2VyKHBlcmlvZGljX2ZyZXF1ZW5jeSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfSVJRUF9TRVQ6CisJCWlmIChhcmcgPiBNQVhfUEVSSU9ESUNfUkFURSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChmcm9tID09IEZVTkNUSU9OX1JUQ19JT0NUTCAmJiBhcmcgPiBNQVhfVVNFUl9QRVJJT0RJQ19SQVRFICYmCisJCSAgICBjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpID09IDApCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlwZXJpb2RpY19mcmVxdWVuY3kgPSBhcmc7CisKKwkJY291bnQgPSBSVENfRlJFUVVFTkNZOworCQlkb19kaXYoY291bnQsIGFyZyk7CisKKwkJcGVyaW9kaWNfY291bnQgPSBjb3VudDsKKworCQlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwkJcnRjMV93cml0ZShSVENMMUxSRUcsIGNvdW50KTsKKwkJcnRjMV93cml0ZShSVENMMUhSRUcsIGNvdW50ID4+IDE2KTsKKworCQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfRVBPQ0hfUkVBRDoKKwkJcmV0dXJuIHB1dF91c2VyKGVwb2NoLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcpOworCWNhc2UgUlRDX0VQT0NIX1NFVDoKKwkJLyogRG9lc24ndCBzdXBwb3J0IGJlZm9yZSAxOTAwICovCisJCWlmIChhcmcgPCAxOTAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNhcGFibGUoQ0FQX1NZU19USU1FKSA9PSAwKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJZXBvY2ggPSBhcmc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0Y19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBydGNfZG9faW9jdGwoY21kLCBhcmcsIEZVTkNUSU9OX1JUQ19JT0NUTCk7Cit9CisKK3N0YXRpYyBpbnQgcnRjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCisJaWYgKHJ0Y19zdGF0dXMgPT0gUlRDX09QRU4pIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcnRjX3N0YXR1cyA9IFJUQ19PUEVOOworCXJ0Y19pcnFfZGF0YSA9IDA7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0Y19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChmaWxlLT5mX2ZsYWdzICYgRkFTWU5DKQorCQkodm9pZClmYXN5bmNfaGVscGVyKC0xLCBmaWxlLCAwLCAmcnRjX2FzeW5jX3F1ZXVlKTsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCXJ0YzFfd3JpdGUoRUNNUExSRUcsIDApOworCXJ0YzFfd3JpdGUoRUNNUE1SRUcsIDApOworCXJ0YzFfd3JpdGUoRUNNUEhSRUcsIDApOworCXJ0YzFfd3JpdGUoUlRDTDFMUkVHLCAwKTsKKwlydGMxX3dyaXRlKFJUQ0wxSFJFRywgMCk7CisKKwlydGNfc3RhdHVzID0gUlRDX1JFTEVBU0U7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWRpc2FibGVfaXJxKEVMQVBTRURUSU1FX0lSUSk7CisJZGlzYWJsZV9pcnEoUlRDTE9ORzFfSVJRKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0Y19mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG9uKQoreworCXJldHVybiBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJnJ0Y19hc3luY19xdWV1ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ0Y19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBydGNfcmVhZCwKKwkucG9sbAkJPSBydGNfcG9sbCwKKwkuaW9jdGwJCT0gcnRjX2lvY3RsLAorCS5vcGVuCQk9IHJ0Y19vcGVuLAorCS5yZWxlYXNlCT0gcnRjX3JlbGVhc2UsCisJLmZhc3luYwkJPSBydGNfZmFzeW5jLAorfTsKKworc3RhdGljIGlycXJldHVybl90IGVsYXBzZWR0aW1lX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNwaW5fbG9jaygmcnRjX2xvY2spOworCXJ0YzJfd3JpdGUoUlRDSU5UUkVHLCBFTEFQU0VEVElNRV9JTlQpOworCisJcnRjX2lycV9kYXRhICs9IDB4MTAwOworCXJ0Y19pcnFfZGF0YSAmPSB+MHhmZjsKKwlydGNfaXJxX2RhdGEgfD0gUlRDX0FGOworCXNwaW5fdW5sb2NrKCZydGNfbG9jayk7CisKKwlzcGluX2xvY2soJnJ0Y19sb2NrKTsKKwlpZiAocnRjX2NhbGxiYWNrKQorCQlydGNfY2FsbGJhY2stPmZ1bmMocnRjX2NhbGxiYWNrLT5wcml2YXRlX2RhdGEpOworCXNwaW5fdW5sb2NrKCZydGNfbG9jayk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJ0Y193YWl0KTsKKworCWtpbGxfZmFzeW5jKCZydGNfYXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHJ0Y2xvbmcxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgY291bnQgPSBwZXJpb2RpY19jb3VudDsKKworCXNwaW5fbG9jaygmcnRjX2xvY2spOworCXJ0YzJfd3JpdGUoUlRDSU5UUkVHLCBSVENMT05HMV9JTlQpOworCisJcnRjMV93cml0ZShSVENMMUxSRUcsIGNvdW50KTsKKwlydGMxX3dyaXRlKFJUQ0wxSFJFRywgY291bnQgPj4gMTYpOworCisJcnRjX2lycV9kYXRhICs9IDB4MTAwOworCXJ0Y19pcnFfZGF0YSAmPSB+MHhmZjsKKwlydGNfaXJxX2RhdGEgfD0gUlRDX1BGOworCXNwaW5fdW5sb2NrKCZydGNfbG9jayk7CisKKwlzcGluX2xvY2soJnJ0Y190YXNrX2xvY2spOworCWlmIChydGNfY2FsbGJhY2spCisJCXJ0Y19jYWxsYmFjay0+ZnVuYyhydGNfY2FsbGJhY2stPnByaXZhdGVfZGF0YSk7CisJc3Bpbl91bmxvY2soJnJ0Y190YXNrX2xvY2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZydGNfd2FpdCk7CisKKwlraWxsX2Zhc3luYygmcnRjX2FzeW5jX3F1ZXVlLCBTSUdJTywgUE9MTF9JTik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCBydGNfcmVnaXN0ZXIocnRjX3Rhc2tfdCAqdGFzaykKK3sKKwlpZiAodGFzayA9PSBOVUxMIHx8IHRhc2stPmZ1bmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJaWYgKHJ0Y19zdGF0dXMgPT0gUlRDX09QRU4pIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJc3Bpbl9sb2NrKCZydGNfdGFza19sb2NrKTsKKwlpZiAocnRjX2NhbGxiYWNrICE9IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2soJnJ0Y190YXNrX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJnJ0Y190YXNrX2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJ0Y19jYWxsYmFjayA9IHRhc2s7CisJc3Bpbl91bmxvY2soJnJ0Y190YXNrX2xvY2spOworCisJcnRjX3N0YXR1cyA9IFJUQ19PUEVOOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwocnRjX3JlZ2lzdGVyKTsKKworaW50IHJ0Y191bnJlZ2lzdGVyKHJ0Y190YXNrX3QgKnRhc2spCit7CisJc3Bpbl9sb2NrX2lycSgmcnRjX3Rhc2tfbG9jayk7CisJaWYgKHRhc2sgPT0gTlVMTCB8fCBydGNfY2FsbGJhY2sgIT0gdGFzaykgeworCQlzcGluX3VubG9ja19pcnEoJnJ0Y190YXNrX2xvY2spOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXNwaW5fbG9jaygmcnRjX2xvY2spOworCisJcnRjMV93cml0ZShFQ01QTFJFRywgMCk7CisJcnRjMV93cml0ZShFQ01QTVJFRywgMCk7CisJcnRjMV93cml0ZShFQ01QSFJFRywgMCk7CisJcnRjMV93cml0ZShSVENMMUxSRUcsIDApOworCXJ0YzFfd3JpdGUoUlRDTDFIUkVHLCAwKTsKKworCXJ0Y19zdGF0dXMgPSBSVENfUkVMRUFTRTsKKworCXNwaW5fdW5sb2NrKCZydGNfbG9jayk7CisKKwlydGNfY2FsbGJhY2sgPSBOVUxMOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfdGFza19sb2NrKTsKKworCWRpc2FibGVfaXJxKEVMQVBTRURUSU1FX0lSUSk7CisJZGlzYWJsZV9pcnEoUlRDTE9ORzFfSVJRKTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChydGNfdW5yZWdpc3Rlcik7CisKK2ludCBydGNfY29udHJvbChydGNfdGFza190ICp0YXNrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y190YXNrX2xvY2spOworCisJaWYgKHJ0Y19jYWxsYmFjayAhPSB0YXNrKQorCQlyZXR2YWwgPSAtRU5YSU87CisJZWxzZQorCQlydGNfZG9faW9jdGwoY21kLCBhcmcsIEZVTkNUSU9OX1JUQ19DT05UUk9MKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjX3Rhc2tfbG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChydGNfY29udHJvbCk7CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBydGNfbWlzY2RldmljZSA9IHsKKwkubWlub3IJPSBSVENfTUlOT1IsCisJLm5hbWUJPSBydGNfbmFtZSwKKwkuZm9wcwk9ICZydGNfZm9wcywKK307CisKK3N0YXRpYyBpbnQgcnRjX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXVuc2lnbmVkIGludCBpcnE7CisJaW50IHJldHZhbDsKKworCXBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlpZiAocGRldi0+bnVtX3Jlc291cmNlcyAhPSAyKQorCQlyZXR1cm4gLUVCVVNZOworCisJcnRjMV9iYXNlID0gaW9yZW1hcChwZGV2LT5yZXNvdXJjZVswXS5zdGFydCwgUlRDMV9TSVpFKTsKKwlpZiAocnRjMV9iYXNlID09IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisKKwlydGMyX2Jhc2UgPSBpb3JlbWFwKHBkZXYtPnJlc291cmNlWzFdLnN0YXJ0LCBSVEMyX1NJWkUpOworCWlmIChydGMyX2Jhc2UgPT0gTlVMTCkgeworCQlpb3VubWFwKHJ0YzFfYmFzZSk7CisJCXJ0YzFfYmFzZSA9IE5VTEw7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dmFsID0gbWlzY19yZWdpc3RlcigmcnRjX21pc2NkZXZpY2UpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWlvdW5tYXAocnRjMV9iYXNlKTsKKwkJaW91bm1hcChydGMyX2Jhc2UpOworCQlydGMxX2Jhc2UgPSBOVUxMOworCQlydGMyX2Jhc2UgPSBOVUxMOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCXJ0YzFfd3JpdGUoRUNNUExSRUcsIDApOworCXJ0YzFfd3JpdGUoRUNNUE1SRUcsIDApOworCXJ0YzFfd3JpdGUoRUNNUEhSRUcsIDApOworCXJ0YzFfd3JpdGUoUlRDTDFMUkVHLCAwKTsKKwlydGMxX3dyaXRlKFJUQ0wxSFJFRywgMCk7CisKKwlydGNfc3RhdHVzID0gUlRDX1JFTEVBU0U7CisJcnRjX2lycV9kYXRhID0gMDsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcnRjX3dhaXQpOworCisJaXJxID0gRUxBUFNFRFRJTUVfSVJROworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGlycSwgZWxhcHNlZHRpbWVfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsCisJICAgICAgICAgICAgICAgICAgICAgImVsYXBzZWRfdGltZSIsIE5VTEwpOworCWlmIChyZXR2YWwgPT0gMCkgeworCQlpcnEgPSBSVENMT05HMV9JUlE7CisJCXJldHZhbCA9IHJlcXVlc3RfaXJxKGlycSwgcnRjbG9uZzFfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsCisJCSAgICAgICAgICAgICAgICAgICAgICJydGNsb25nMSIsIE5VTEwpOworCX0KKworCWlmIChyZXR2YWwgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAicnRjOiBJUlElZCBpcyBidXN5XG4iLCBpcnEpOworCQlpZiAoaXJxID09IFJUQ0xPTkcxX0lSUSkKKwkJCWZyZWVfaXJxKEVMQVBTRURUSU1FX0lSUSwgTlVMTCk7CisJCWlvdW5tYXAocnRjMV9iYXNlKTsKKwkJaW91bm1hcChydGMyX2Jhc2UpOworCQlydGMxX2Jhc2UgPSBOVUxMOworCQlydGMyX2Jhc2UgPSBOVUxMOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWRpc2FibGVfaXJxKEVMQVBTRURUSU1FX0lSUSk7CisJZGlzYWJsZV9pcnEoUlRDTE9ORzFfSVJRKTsKKworCXNwaW5fbG9ja19pbml0KCZydGNfdGFza19sb2NrKTsKKworCXByaW50ayhLRVJOX0lORk8gInJ0YzogUmVhbCBUaW1lIENsb2NrIG9mIE5FQyBWUjQxMDAgc2VyaWVzXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0Y19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBtaXNjX2RlcmVnaXN0ZXIoJnJ0Y19taXNjZGV2aWNlKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWZyZWVfaXJxKEVMQVBTRURUSU1FX0lSUSwgTlVMTCk7CisJZnJlZV9pcnEoUlRDTE9ORzFfSVJRLCBOVUxMKTsKKwlpZiAocnRjMV9iYXNlICE9IE5VTEwpCisJCWlvdW5tYXAocnRjMV9iYXNlKTsKKwlpZiAocnRjMl9iYXNlICE9IE5VTEwpCisJCWlvdW5tYXAocnRjMl9iYXNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcnRjX3BsYXRmb3JtX2RldmljZTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHJ0Y19kZXZpY2VfZHJpdmVyID0geworCS5uYW1lCQk9IHJ0Y19uYW1lLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBydGNfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgdnI0MXh4X3J0Y19pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXN3aXRjaCAoY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlKSB7CisJY2FzZSBDUFVfVlI0MTExOgorCWNhc2UgQ1BVX1ZSNDEyMToKKwkJcnRjX3Jlc291cmNlWzBdLnN0YXJ0ID0gUlRDMV9UWVBFMV9TVEFSVDsKKwkJcnRjX3Jlc291cmNlWzBdLmVuZCA9IFJUQzFfVFlQRTFfRU5EOworCQlydGNfcmVzb3VyY2VbMV0uc3RhcnQgPSBSVEMyX1RZUEUxX1NUQVJUOworCQlydGNfcmVzb3VyY2VbMV0uZW5kID0gUlRDMl9UWVBFMV9FTkQ7CisJCWJyZWFrOworCWNhc2UgQ1BVX1ZSNDEyMjoKKwljYXNlIENQVV9WUjQxMzE6CisJY2FzZSBDUFVfVlI0MTMzOgorCQlydGNfcmVzb3VyY2VbMF0uc3RhcnQgPSBSVEMxX1RZUEUyX1NUQVJUOworCQlydGNfcmVzb3VyY2VbMF0uZW5kID0gUlRDMV9UWVBFMl9FTkQ7CisJCXJ0Y19yZXNvdXJjZVsxXS5zdGFydCA9IFJUQzJfVFlQRTJfU1RBUlQ7CisJCXJ0Y19yZXNvdXJjZVsxXS5lbmQgPSBSVEMyX1RZUEUyX0VORDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CisJCWJyZWFrOworCX0KKworCXJ0Y19wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJSVEMiLCAtMSwgcnRjX3Jlc291cmNlLCBSVENfTlVNX1JFU09VUkNFUyk7CisJaWYgKElTX0VSUihydGNfcGxhdGZvcm1fZGV2aWNlKSkKKwkJcmV0dXJuIFBUUl9FUlIocnRjX3BsYXRmb3JtX2RldmljZSk7CisKKwlyZXR2YWwgPSBkcml2ZXJfcmVnaXN0ZXIoJnJ0Y19kZXZpY2VfZHJpdmVyKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocnRjX3BsYXRmb3JtX2RldmljZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdnI0MXh4X3J0Y19leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnJ0Y19kZXZpY2VfZHJpdmVyKTsKKworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHJ0Y19wbGF0Zm9ybV9kZXZpY2UpOworfQorCittb2R1bGVfaW5pdCh2cjQxeHhfcnRjX2luaXQpOworbW9kdWxlX2V4aXQodnI0MXh4X3J0Y19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92dC5jIGIvZHJpdmVycy9jaGFyL3Z0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlZjFkZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci92dC5jCkBAIC0wLDAgKzEsMzI0MiBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2NoYXIvdnQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworLyoKKyAqIEhvcGVmdWxseSB0aGlzIHdpbGwgYmUgYSByYXRoZXIgY29tcGxldGUgVlQxMDIgaW1wbGVtZW50YXRpb24uCisgKgorICogQmVlcGluZyB0aGFua3MgdG8gSm9obiBUIEtvaGwuCisgKgorICogVmlydHVhbCBDb25zb2xlcywgU2NyZWVuIEJsYW5raW5nLCBTY3JlZW4gRHVtcGluZywgQ29sb3IsIEdyYXBoaWNzCisgKiAgIENoYXJzLCBhbmQgVlQxMDAgZW5oYW5jZW1lbnRzIGJ5IFBldGVyIE1hY0RvbmFsZC4KKyAqCisgKiBDb3B5IGFuZCBwYXN0ZSBmdW5jdGlvbiBieSBBbmRyZXcgSGF5bGV0dCwKKyAqICAgc29tZSBlbmhhbmNlbWVudHMgYnkgQWxlc3NhbmRybyBSdWJpbmkuCisgKgorICogQ29kZSB0byBjaGVjayBmb3IgZGlmZmVyZW50IHZpZGVvLWNhcmRzIG1vc3RseSBieSBHYWxlbiBIdW50LAorICogPGctaHVudEBlZS51dGFoLmVkdT4KKyAqCisgKiBSdWRpbWVudGFyeSBJU08gMTA2NDYvVW5pY29kZS9VVEYtOCBjaGFyYWN0ZXIgc2V0IHN1cHBvcnQgYnkKKyAqIE1hcmt1cyBLdWhuLCA8bXNrdWhuQGltbWQ0LmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPi4KKyAqCisgKiBEeW5hbWljIGFsbG9jYXRpb24gb2YgY29uc29sZXMsIGFlYkBjd2kubmwsIE1heSAxOTk0CisgKiBSZXNpemluZyBvZiBjb25zb2xlcywgYWViLCA5NDA5MjYKKyAqCisgKiBDb2RlIGZvciB4dGVybSBsaWtlIG1vdXNlIGNsaWNrIHJlcG9ydGluZyBieSBQZXRlciBPcmJhZWsgMjAtSnVsLTk0CisgKiA8cG9lQGRhaW1pLmFhdS5kaz4KKyAqCisgKiBVc2VyLWRlZmluZWQgYmVsbCBzb3VuZCwgbmV3IHNldHRlcm0gY29udHJvbCBzZXF1ZW5jZXMgYW5kIHByaW50aworICogcmVkaXJlY3Rpb24gYnkgTWFydGluIE1hcmVzIDxtakBrMzMyLmZlbGQuY3Z1dC5jej4gMTktTm92LTk1CisgKgorICogQVBNIHNjcmVlbmJsYW5rIGJ1ZyBmaXhlZCBUYWthc2hpIE1hbmFiZSA8bWFuYWJlQHJveS5kc2wudHV0aWNzLnR1dC5qcD4KKyAqCisgKiBNZXJnZSB3aXRoIHRoZSBhYnN0cmFjdCBjb25zb2xlIGRyaXZlciBieSBHZWVydCBVeXR0ZXJob2V2ZW4KKyAqIDxnZWVydEBsaW51eC1tNjhrLm9yZz4sIEphbiAxOTk3LgorICoKKyAqICAgT3JpZ2luYWwgbTY4ayBjb25zb2xlIGRyaXZlciBtb2RpZmljYXRpb25zIGJ5CisgKgorICogICAgIC0gQXJubyBHcmlmZmlvZW4gPGFybm9AdXNuLm5sPgorICogICAgIC0gRGF2aWQgQ2FydGVyIDxjYXJ0ZXJAY3MuYnJpcy5hYy51az4KKyAqIAorICogICBUaGUgYWJzdHJhY3QgY29uc29sZSBkcml2ZXIgcHJvdmlkZXMgYSBnZW5lcmljIGludGVyZmFjZSBmb3IgYSB0ZXh0CisgKiAgIGNvbnNvbGUuIEl0IHN1cHBvcnRzIFZHQSB0ZXh0IG1vZGUsIGZyYW1lIGJ1ZmZlciBiYXNlZCBncmFwaGljYWwgY29uc29sZXMKKyAqICAgYW5kIHNwZWNpYWwgZ3JhcGhpY3MgcHJvY2Vzc29ycyB0aGF0IGFyZSBvbmx5IGFjY2Vzc2libGUgdGhyb3VnaCBzb21lCisgKiAgIHJlZ2lzdGVycyAoZS5nLiBhIFRNUzM0MHgwIEdTUCkuCisgKgorICogICBUaGUgaW50ZXJmYWNlIHRvIHRoZSBoYXJkd2FyZSBpcyBzcGVjaWZpZWQgdXNpbmcgYSBzcGVjaWFsIHN0cnVjdHVyZQorICogICAoc3RydWN0IGNvbnN3KSB3aGljaCBjb250YWlucyBmdW5jdGlvbiBwb2ludGVycyB0byBjb25zb2xlIG9wZXJhdGlvbnMKKyAqICAgKHNlZSA8bGludXgvY29uc29sZS5oPiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCisgKgorICogU3VwcG9ydCBmb3IgY2hhbmdlYWJsZSBjdXJzb3Igc2hhcGUKKyAqIGJ5IFBhdmVsIE1hY2hlayA8cGF2ZWxAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6PiwgQXVndXN0IDE5OTcKKyAqCisgKiBQb3J0ZWQgdG8gaTM4NiBhbmQgY29uX3Njcm9sbGRlbHRhIGZpeGVkCisgKiBieSBFbW1hbnVlbCBNYXJ0eSA8Y29yZUBnZ2ktcHJvamVjdC5vcmc+LCBBcHJpbCAxOTk4CisgKgorICogUmVzdXJyZWN0ZWQgY2hhcmFjdGVyIGJ1ZmZlcnMgaW4gdmlkZW9yYW0gcGx1cyBsb3RzIG9mIG90aGVyIHRyaWNrZXJ5CisgKiBieSBNYXJ0aW4gTWFyZXMgPG1qQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej4sIEp1bHkgMTk5OAorICoKKyAqIFJlbW92ZWQgb2xkLXN0eWxlIHRpbWVycywgaW50cm9kdWNlZCBjb25zb2xlX3RpbWVyLCBtYWRlIHRpbWVyCisgKiBkZWxldGlvbiBTTVAtc2FmZS4gIDE3SnVuMDAsIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4KKyAqCisgKiBSZW1vdmVkIGNvbnNvbGVfbG9jaywgZW5hYmxlZCBpbnRlcnJ1cHRzIGFjcm9zcyBhbGwgY29uc29sZSBvcGVyYXRpb25zCisgKiAxMyBNYXJjaCAyMDAxLCBBbmRyZXcgTW9ydG9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbGVjdGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3Rpb2NsLmg+CisjaW5jbHVkZSA8bGludXgva2JkX2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9mb250Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworCitjb25zdCBzdHJ1Y3QgY29uc3cgKmNvbnN3aXRjaHA7CisKKy8qIEEgYml0bWFwIGZvciBjb2RlcyA8MzIuIEEgYml0IG9mIDEgaW5kaWNhdGVzIHRoYXQgdGhlIGNvZGUKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBiaXQgbnVtYmVyIGludm9rZXMgc29tZSBzcGVjaWFsIGFjdGlvbgorICogKHN1Y2ggYXMgY3Vyc29yIG1vdmVtZW50KSBhbmQgc2hvdWxkIG5vdCBiZSBkaXNwbGF5ZWQgYXMgYQorICogZ2x5cGggdW5sZXNzIHRoZSBkaXNwX2N0cmwgbW9kZSBpcyBleHBsaWNpdGx5IGVuYWJsZWQuCisgKi8KKyNkZWZpbmUgQ1RSTF9BQ1RJT04gMHgwZDAwZmY4MQorI2RlZmluZSBDVFJMX0FMV0FZUyAweDA4MDBmNTAxCS8qIENhbm5vdCBiZSBvdmVycmlkZGVuIGJ5IGRpc3BfY3RybCAqLworCisvKgorICogSGVyZSBpcyB0aGUgZGVmYXVsdCBiZWxsIHBhcmFtZXRlcnM6IDc1MEhaLCAxLzh0aCBvZiBhIHNlY29uZAorICovCisjZGVmaW5lIERFRkFVTFRfQkVMTF9QSVRDSAk3NTAKKyNkZWZpbmUgREVGQVVMVF9CRUxMX0RVUkFUSU9OCShIWi84KQorCitleHRlcm4gdm9pZCB2Y3NfbWFrZV9kZXZmcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiB2b2lkIHZjc19yZW1vdmVfZGV2ZnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CisKK2V4dGVybiB2b2lkIGNvbnNvbGVfbWFwX2luaXQodm9pZCk7CisjaWZkZWYgQ09ORklHX1BST01fQ09OU09MRQorZXh0ZXJuIHZvaWQgcHJvbV9jb25faW5pdCh2b2lkKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NREFfQ09OU09MRQorZXh0ZXJuIGludCBtZGFfY29uc29sZV9pbml0KHZvaWQpOworI2VuZGlmCisKK3N0cnVjdCB2YyB2Y19jb25zIFtNQVhfTlJfQ09OU09MRVNdOworCisjaWZuZGVmIFZUX1NJTkdMRV9EUklWRVIKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29uc3cgKmNvbl9kcml2ZXJfbWFwW01BWF9OUl9DT05TT0xFU107CisjZW5kaWYKKworc3RhdGljIGludCBjb25fb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyB2b2lkIHZjX2luaXQoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBpbnQgcm93cywKKwkJICAgIHVuc2lnbmVkIGludCBjb2xzLCBpbnQgZG9fY2xlYXIpOworc3RhdGljIHZvaWQgZ290b3h5KHN0cnVjdCB2Y19kYXRhICp2YywgaW50IG5ld194LCBpbnQgbmV3X3kpOworc3RhdGljIHZvaWQgc2F2ZV9jdXIoc3RydWN0IHZjX2RhdGEgKnZjKTsKK3N0YXRpYyB2b2lkIHJlc2V0X3Rlcm1pbmFsKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IGRvX2NsZWFyKTsKK3N0YXRpYyB2b2lkIGNvbl9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIHNldF92ZXNhX2JsYW5raW5nKGNoYXIgX191c2VyICpwKTsKK3N0YXRpYyB2b2lkIHNldF9jdXJzb3Ioc3RydWN0IHZjX2RhdGEgKnZjKTsKK3N0YXRpYyB2b2lkIGhpZGVfY3Vyc29yKHN0cnVjdCB2Y19kYXRhICp2Yyk7CitzdGF0aWMgdm9pZCBjb25zb2xlX2NhbGxiYWNrKHZvaWQgKmlnbm9yZWQpOworc3RhdGljIHZvaWQgYmxhbmtfc2NyZWVuX3QodW5zaWduZWQgbG9uZyBkdW1teSk7CitzdGF0aWMgdm9pZCBzZXRfcGFsZXR0ZShzdHJ1Y3QgdmNfZGF0YSAqdmMpOworCitzdGF0aWMgaW50IHByaW50YWJsZTsJCS8qIElzIGNvbnNvbGUgcmVhZHkgZm9yIHByaW50aW5nPyAqLworCisvKgorICogaWdub3JlX3Bva2U6IGRvbid0IHVuYmxhbmsgdGhlIHNjcmVlbiB3aGVuIHRoaW5ncyBhcmUgdHlwZWQuICBUaGlzIGlzCisgKiBtYWlubHkgZm9yIHRoZSBwcml2YWN5IG9mIGJyYWlsbGUgdGVybWluYWwgdXNlcnMuCisgKi8KK3N0YXRpYyBpbnQgaWdub3JlX3Bva2U7CisKK2ludCBkb19wb2tlX2JsYW5rZWRfY29uc29sZTsKK2ludCBjb25zb2xlX2JsYW5rZWQ7CisKK3N0YXRpYyBpbnQgdmVzYV9ibGFua19tb2RlOyAvKiAwOm5vbmUgMTpzdXNwZW5kViAyOnN1c3BlbmRIIDM6cG93ZXJkb3duICovCitzdGF0aWMgaW50IGJsYW5raW50ZXJ2YWwgPSAxMCo2MCpIWjsKK3N0YXRpYyBpbnQgdmVzYV9vZmZfaW50ZXJ2YWw7CisKK3N0YXRpYyBERUNMQVJFX1dPUksoY29uc29sZV93b3JrLCBjb25zb2xlX2NhbGxiYWNrLCBOVUxMKTsKKworLyoKKyAqIGZnX2NvbnNvbGUgaXMgdGhlIGN1cnJlbnQgdmlydHVhbCBjb25zb2xlLAorICogbGFzdF9jb25zb2xlIGlzIHRoZSBsYXN0IHVzZWQgb25lLAorICogd2FudF9jb25zb2xlIGlzIHRoZSBjb25zb2xlIHdlIHdhbnQgdG8gc3dpdGNoIHRvLAorICoga21zZ19yZWRpcmVjdCBpcyB0aGUgY29uc29sZSBmb3Iga2VybmVsIG1lc3NhZ2VzLAorICovCitpbnQgZmdfY29uc29sZTsKK2ludCBsYXN0X2NvbnNvbGU7CitpbnQgd2FudF9jb25zb2xlID0gLTE7CitpbnQga21zZ19yZWRpcmVjdDsKKworLyoKKyAqIEZvciBlYWNoIGV4aXN0aW5nIGRpc3BsYXksIHdlIGhhdmUgYSBwb2ludGVyIHRvIGNvbnNvbGUgY3VycmVudGx5IHZpc2libGUKKyAqIG9uIHRoYXQgZGlzcGxheSwgYWxsb3dpbmcgY29uc29sZXMgb3RoZXIgdGhhbiBmZ19jb25zb2xlIHRvIGJlIHJlZnJlc2hlZAorICogYXBwcm9wcmlhdGVseS4gVW5sZXNzIHRoZSBsb3ctbGV2ZWwgZHJpdmVyIHN1cHBsaWVzIGl0cyBvd24gZGlzcGxheV9mZworICogdmFyaWFibGUsIHdlIHVzZSB0aGlzIG9uZSBmb3IgdGhlICJtYXN0ZXIgZGlzcGxheSIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdmNfZGF0YSAqbWFzdGVyX2Rpc3BsYXlfZmc7CisKKy8qCisgKiBVbmZvcnR1bmF0ZWx5LCB3ZSBuZWVkIHRvIGRlbGF5IHR0eSBlY2hvIHdoZW4gd2UncmUgY3VycmVudGx5IHdyaXRpbmcgdG8gdGhlCisgKiBjb25zb2xlIHNpbmNlIHRoZSBjb2RlIGlzIChhbmQgYWx3YXlzIHdhcykgbm90IHJlLWVudHJhbnQsIHNvIHdlIHNjaGVkdWxlCisgKiBhbGwgZmxpcCByZXF1ZXN0cyB0byBwcm9jZXNzIGNvbnRleHQgd2l0aCBzY2hlZHVsZS10YXNrKCkgYW5kIHJ1biBpdCBmcm9tCisgKiBjb25zb2xlX2NhbGxiYWNrKCkuCisgKi8KKworLyoKKyAqIEZvciB0aGUgc2FtZSByZWFzb24sIHdlIGRlZmVyIHNjcm9sbGJhY2sgdG8gdGhlIGNvbnNvbGUgY2FsbGJhY2suCisgKi8KK3N0YXRpYyBpbnQgc2Nyb2xsYmFja19kZWx0YTsKKworLyoKKyAqIEhvb2sgc28gdGhhdCB0aGUgcG93ZXIgbWFuYWdlbWVudCByb3V0aW5lcyBjYW4gKHVuKWJsYW5rCisgKiB0aGUgY29uc29sZSBvbiBvdXIgYmVoYWxmLgorICovCitpbnQgKCpjb25zb2xlX2JsYW5rX2hvb2spKGludCk7CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBjb25zb2xlX3RpbWVyOworc3RhdGljIGludCBibGFua19zdGF0ZTsKK3N0YXRpYyBpbnQgYmxhbmtfdGltZXJfZXhwaXJlZDsKK2VudW0geworCWJsYW5rX29mZiA9IDAsCisJYmxhbmtfbm9ybWFsX3dhaXQsCisJYmxhbmtfdmVzYV93YWl0LAorfTsKKworLyoKKyAqCUxvdy1MZXZlbCBGdW5jdGlvbnMKKyAqLworCisjZGVmaW5lIElTX0ZHKHZjKQkoKHZjKS0+dmNfbnVtID09IGZnX2NvbnNvbGUpCisKKyNpZmRlZiBWVF9CVUZfVlJBTV9PTkxZCisjZGVmaW5lIERPX1VQREFURSh2YykJMAorI2Vsc2UKKyNkZWZpbmUgRE9fVVBEQVRFKHZjKQlDT05fSVNfVklTSUJMRSh2YykKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0ICpzY3JlZW5wb3Moc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgb2Zmc2V0LCBpbnQgdmlld2VkKQoreworCXVuc2lnbmVkIHNob3J0ICpwOworCQorCWlmICghdmlld2VkKQorCQlwID0gKHVuc2lnbmVkIHNob3J0ICopKHZjLT52Y19vcmlnaW4gKyBvZmZzZXQpOworCWVsc2UgaWYgKCF2Yy0+dmNfc3ctPmNvbl9zY3JlZW5fcG9zKQorCQlwID0gKHVuc2lnbmVkIHNob3J0ICopKHZjLT52Y192aXNpYmxlX29yaWdpbiArIG9mZnNldCk7CisJZWxzZQorCQlwID0gdmMtPnZjX3N3LT5jb25fc2NyZWVuX3Bvcyh2Yywgb2Zmc2V0KTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjcm9sbGRlbHRhKGludCBsaW5lcykKK3sKKwlzY3JvbGxiYWNrX2RlbHRhICs9IGxpbmVzOworCXNjaGVkdWxlX2NvbnNvbGVfY2FsbGJhY2soKTsKK30KKwordm9pZCBzY2hlZHVsZV9jb25zb2xlX2NhbGxiYWNrKHZvaWQpCit7CisJc2NoZWR1bGVfd29yaygmY29uc29sZV93b3JrKTsKK30KKworc3RhdGljIHZvaWQgc2NydXAoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IGIsIGludCBucikKK3sKKwl1bnNpZ25lZCBzaG9ydCAqZCwgKnM7CisKKwlpZiAodCtuciA+PSBiKQorCQluciA9IGIgLSB0IC0gMTsKKwlpZiAoYiA+IHZjLT52Y19yb3dzIHx8IHQgPj0gYiB8fCBuciA8IDEpCisJCXJldHVybjsKKwlpZiAoQ09OX0lTX1ZJU0lCTEUodmMpICYmIHZjLT52Y19zdy0+Y29uX3Njcm9sbCh2YywgdCwgYiwgU01fVVAsIG5yKSkKKwkJcmV0dXJuOworCWQgPSAodW5zaWduZWQgc2hvcnQgKikodmMtPnZjX29yaWdpbiArIHZjLT52Y19zaXplX3JvdyAqIHQpOworCXMgPSAodW5zaWduZWQgc2hvcnQgKikodmMtPnZjX29yaWdpbiArIHZjLT52Y19zaXplX3JvdyAqICh0ICsgbnIpKTsKKwlzY3JfbWVtbW92ZXcoZCwgcywgKGIgLSB0IC0gbnIpICogdmMtPnZjX3NpemVfcm93KTsKKwlzY3JfbWVtc2V0dyhkICsgKGIgLSB0IC0gbnIpICogdmMtPnZjX2NvbHMsIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLAorCQkgICAgdmMtPnZjX3NpemVfcm93ICogbnIpOworfQorCitzdGF0aWMgdm9pZCBzY3Jkb3duKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IHQsIHVuc2lnbmVkIGludCBiLCBpbnQgbnIpCit7CisJdW5zaWduZWQgc2hvcnQgKnM7CisJdW5zaWduZWQgaW50IHN0ZXA7CisKKwlpZiAodCtuciA+PSBiKQorCQluciA9IGIgLSB0IC0gMTsKKwlpZiAoYiA+IHZjLT52Y19yb3dzIHx8IHQgPj0gYiB8fCBuciA8IDEpCisJCXJldHVybjsKKwlpZiAoQ09OX0lTX1ZJU0lCTEUodmMpICYmIHZjLT52Y19zdy0+Y29uX3Njcm9sbCh2YywgdCwgYiwgU01fRE9XTiwgbnIpKQorCQlyZXR1cm47CisJcyA9ICh1bnNpZ25lZCBzaG9ydCAqKSh2Yy0+dmNfb3JpZ2luICsgdmMtPnZjX3NpemVfcm93ICogdCk7CisJc3RlcCA9IHZjLT52Y19jb2xzICogbnI7CisJc2NyX21lbW1vdmV3KHMgKyBzdGVwLCBzLCAoYiAtIHQgLSBucikgKiB2Yy0+dmNfc2l6ZV9yb3cpOworCXNjcl9tZW1zZXR3KHMsIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLCAyICogc3RlcCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3VwZGF0ZV9yZWdpb24oc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCBpbnQgY291bnQpCit7CisjaWZuZGVmIFZUX0JVRl9WUkFNX09OTFkKKwl1bnNpZ25lZCBpbnQgeHgsIHl5LCBvZmZzZXQ7CisJdTE2ICpwOworCisJcCA9ICh1MTYgKikgc3RhcnQ7CisJaWYgKCF2Yy0+dmNfc3ctPmNvbl9nZXR4eSkgeworCQlvZmZzZXQgPSAoc3RhcnQgLSB2Yy0+dmNfb3JpZ2luKSAvIDI7CisJCXh4ID0gb2Zmc2V0ICUgdmMtPnZjX2NvbHM7CisJCXl5ID0gb2Zmc2V0IC8gdmMtPnZjX2NvbHM7CisJfSBlbHNlIHsKKwkJaW50IG54eCwgbnl5OworCQlzdGFydCA9IHZjLT52Y19zdy0+Y29uX2dldHh5KHZjLCBzdGFydCwgJm54eCwgJm55eSk7CisJCXh4ID0gbnh4OyB5eSA9IG55eTsKKwl9CisJZm9yKDs7KSB7CisJCXUxNiBhdHRyaWIgPSBzY3JfcmVhZHcocCkgJiAweGZmMDA7CisJCWludCBzdGFydHggPSB4eDsKKwkJdTE2ICpxID0gcDsKKwkJd2hpbGUgKHh4IDwgdmMtPnZjX2NvbHMgJiYgY291bnQpIHsKKwkJCWlmIChhdHRyaWIgIT0gKHNjcl9yZWFkdyhwKSAmIDB4ZmYwMCkpIHsKKwkJCQlpZiAocCA+IHEpCisJCQkJCXZjLT52Y19zdy0+Y29uX3B1dGNzKHZjLCBxLCBwLXEsIHl5LCBzdGFydHgpOworCQkJCXN0YXJ0eCA9IHh4OworCQkJCXEgPSBwOworCQkJCWF0dHJpYiA9IHNjcl9yZWFkdyhwKSAmIDB4ZmYwMDsKKwkJCX0KKwkJCXArKzsKKwkJCXh4Kys7CisJCQljb3VudC0tOworCQl9CisJCWlmIChwID4gcSkKKwkJCXZjLT52Y19zdy0+Y29uX3B1dGNzKHZjLCBxLCBwLXEsIHl5LCBzdGFydHgpOworCQlpZiAoIWNvdW50KQorCQkJYnJlYWs7CisJCXh4ID0gMDsKKwkJeXkrKzsKKwkJaWYgKHZjLT52Y19zdy0+Y29uX2dldHh5KSB7CisJCQlwID0gKHUxNiAqKXN0YXJ0OworCQkJc3RhcnQgPSB2Yy0+dmNfc3ctPmNvbl9nZXR4eSh2Yywgc3RhcnQsIE5VTEwsIE5VTEwpOworCQl9CisJfQorI2VuZGlmCit9CisKK3ZvaWQgdXBkYXRlX3JlZ2lvbihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIGludCBjb3VudCkKK3sKKwlXQVJOX0NPTlNPTEVfVU5MT0NLRUQoKTsKKworCWlmIChET19VUERBVEUodmMpKSB7CisJCWhpZGVfY3Vyc29yKHZjKTsKKwkJZG9fdXBkYXRlX3JlZ2lvbih2Yywgc3RhcnQsIGNvdW50KTsKKwkJc2V0X2N1cnNvcih2Yyk7CisJfQorfQorCisvKiBTdHJ1Y3R1cmUgb2YgYXR0cmlidXRlcyBpcyBoYXJkd2FyZS1kZXBlbmRlbnQgKi8KKworc3RhdGljIHU4IGJ1aWxkX2F0dHIoc3RydWN0IHZjX2RhdGEgKnZjLCB1OCBfY29sb3IsIHU4IF9pbnRlbnNpdHksIHU4IF9ibGluaywgdTggX3VuZGVybGluZSwgdTggX3JldmVyc2UpCit7CisJaWYgKHZjLT52Y19zdy0+Y29uX2J1aWxkX2F0dHIpCisJCXJldHVybiB2Yy0+dmNfc3ctPmNvbl9idWlsZF9hdHRyKHZjLCBfY29sb3IsIF9pbnRlbnNpdHksIF9ibGluaywgX3VuZGVybGluZSwgX3JldmVyc2UpOworCisjaWZuZGVmIFZUX0JVRl9WUkFNX09OTFkKKy8qCisgKiArK3JvbWFuOiBJIGNvbXBsZXRlbHkgY2hhbmdlZCB0aGUgYXR0cmlidXRlIGZvcm1hdCBmb3IgbW9ub2Nocm9tZQorICogbW9kZSAoIWNhbl9kb19jb2xvcikuIFRoZSBmb3JtZXJseSB1c2VkIE1EQSAobW9ub2Nocm9tZSBkaXNwbGF5CisgKiBhZGFwdGVyKSBmb3JtYXQgZGlkbid0IGFsbG93IHRoZSBjb21iaW5hdGlvbiBvZiBjZXJ0YWluIGVmZmVjdHMuCisgKiBOb3cgdGhlIGF0dHJpYnV0ZSBpcyBqdXN0IGEgYml0IHZlY3RvcjoKKyAqICBCaXQgMC4uMTogaW50ZW5zaXR5ICgwLi4yKQorICogIEJpdCAyICAgOiB1bmRlcmxpbmUKKyAqICBCaXQgMyAgIDogcmV2ZXJzZQorICogIEJpdCA3ICAgOiBibGluaworICovCisJeworCXU4IGEgPSB2Yy0+dmNfY29sb3I7CisJaWYgKCF2Yy0+dmNfY2FuX2RvX2NvbG9yKQorCQlyZXR1cm4gX2ludGVuc2l0eSB8CisJCSAgICAgICAoX3VuZGVybGluZSA/IDQgOiAwKSB8CisJCSAgICAgICAoX3JldmVyc2UgPyA4IDogMCkgfAorCQkgICAgICAgKF9ibGluayA/IDB4ODAgOiAwKTsKKwlpZiAoX3VuZGVybGluZSkKKwkJYSA9IChhICYgMHhmMCkgfCB2Yy0+dmNfdWxjb2xvcjsKKwllbHNlIGlmIChfaW50ZW5zaXR5ID09IDApCisJCWEgPSAoYSAmIDB4ZjApIHwgdmMtPnZjX3VsY29sb3I7CisJaWYgKF9yZXZlcnNlKQorCQlhID0gKChhKSAmIDB4ODgpIHwgKCgoKGEpID4+IDQpIHwgKChhKSA8PCA0KSkgJiAweDc3KTsKKwlpZiAoX2JsaW5rKQorCQlhIF49IDB4ODA7CisJaWYgKF9pbnRlbnNpdHkgPT0gMikKKwkJYSBePSAweDA4OworCWlmICh2Yy0+dmNfaGlfZm9udF9tYXNrID09IDB4MTAwKQorCQlhIDw8PSAxOworCXJldHVybiBhOworCX0KKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2F0dHIoc3RydWN0IHZjX2RhdGEgKnZjKQoreworCXZjLT52Y19hdHRyID0gYnVpbGRfYXR0cih2YywgdmMtPnZjX2NvbG9yLCB2Yy0+dmNfaW50ZW5zaXR5LCB2Yy0+dmNfYmxpbmssIHZjLT52Y191bmRlcmxpbmUsIHZjLT52Y19yZXZlcnNlIF4gdmMtPnZjX2RlY3Njbm0pOworCXZjLT52Y192aWRlb19lcmFzZV9jaGFyID0gKGJ1aWxkX2F0dHIodmMsIHZjLT52Y19jb2xvciwgMSwgdmMtPnZjX2JsaW5rLCAwLCB2Yy0+dmNfZGVjc2NubSkgPDwgOCkgfCAnICc7Cit9CisKKy8qIE5vdGU6IGludmVydGluZyB0aGUgc2NyZWVuIHR3aWNlIHNob3VsZCByZXZlcnQgdG8gdGhlIG9yaWdpbmFsIHN0YXRlICovCit2b2lkIGludmVydF9zY3JlZW4oc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQsIGludCB2aWV3ZWQpCit7CisJdW5zaWduZWQgc2hvcnQgKnA7CisKKwlXQVJOX0NPTlNPTEVfVU5MT0NLRUQoKTsKKworCWNvdW50IC89IDI7CisJcCA9IHNjcmVlbnBvcyh2Yywgb2Zmc2V0LCB2aWV3ZWQpOworCWlmICh2Yy0+dmNfc3ctPmNvbl9pbnZlcnRfcmVnaW9uKQorCQl2Yy0+dmNfc3ctPmNvbl9pbnZlcnRfcmVnaW9uKHZjLCBwLCBjb3VudCk7CisjaWZuZGVmIFZUX0JVRl9WUkFNX09OTFkKKwllbHNlIHsKKwkJdTE2ICpxID0gcDsKKwkJaW50IGNudCA9IGNvdW50OworCQl1MTYgYTsKKworCQlpZiAoIXZjLT52Y19jYW5fZG9fY29sb3IpIHsKKwkJCXdoaWxlIChjbnQtLSkgeworCQkJICAgIGEgPSBzY3JfcmVhZHcocSk7CisJCQkgICAgYSBePSAweDA4MDA7CisJCQkgICAgc2NyX3dyaXRldyhhLCBxKTsKKwkJCSAgICBxKys7CisJCQl9CisJCX0gZWxzZSBpZiAodmMtPnZjX2hpX2ZvbnRfbWFzayA9PSAweDEwMCkgeworCQkJd2hpbGUgKGNudC0tKSB7CisJCQkJYSA9IHNjcl9yZWFkdyhxKTsKKwkJCQlhID0gKChhKSAmIDB4MTFmZikgfCAoKChhKSAmIDB4ZTAwMCkgPj4gNCkgfCAoKChhKSAmIDB4MGUwMCkgPDwgNCk7CisJCQkJc2NyX3dyaXRldyhhLCBxKTsKKwkJCQlxKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQl3aGlsZSAoY250LS0pIHsKKwkJCQlhID0gc2NyX3JlYWR3KHEpOworCQkJCWEgPSAoKGEpICYgMHg4OGZmKSB8ICgoKGEpICYgMHg3MDAwKSA+PiA0KSB8ICgoKGEpICYgMHgwNzAwKSA8PCA0KTsKKwkJCQlzY3Jfd3JpdGV3KGEsIHEpOworCQkJCXErKzsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCWlmIChET19VUERBVEUodmMpKQorCQlkb191cGRhdGVfcmVnaW9uKHZjLCAodW5zaWduZWQgbG9uZykgcCwgY291bnQpOworfQorCisvKiB1c2VkIGJ5IHNlbGVjdGlvbjogY29tcGxlbWVudCBwb2ludGVyIHBvc2l0aW9uICovCit2b2lkIGNvbXBsZW1lbnRfcG9zKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IG9mZnNldCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgKnA7CisJc3RhdGljIHVuc2lnbmVkIHNob3J0IG9sZDsKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgb2xkeCwgb2xkeTsKKworCVdBUk5fQ09OU09MRV9VTkxPQ0tFRCgpOworCisJaWYgKHApIHsKKwkJc2NyX3dyaXRldyhvbGQsIHApOworCQlpZiAoRE9fVVBEQVRFKHZjKSkKKwkJCXZjLT52Y19zdy0+Y29uX3B1dGModmMsIG9sZCwgb2xkeSwgb2xkeCk7CisJfQorCWlmIChvZmZzZXQgPT0gLTEpCisJCXAgPSBOVUxMOworCWVsc2UgeworCQl1bnNpZ25lZCBzaG9ydCBuZXc7CisJCXAgPSBzY3JlZW5wb3ModmMsIG9mZnNldCwgMSk7CisJCW9sZCA9IHNjcl9yZWFkdyhwKTsKKwkJbmV3ID0gb2xkIF4gdmMtPnZjX2NvbXBsZW1lbnRfbWFzazsKKwkJc2NyX3dyaXRldyhuZXcsIHApOworCQlpZiAoRE9fVVBEQVRFKHZjKSkgeworCQkJb2xkeCA9IChvZmZzZXQgPj4gMSkgJSB2Yy0+dmNfY29sczsKKwkJCW9sZHkgPSAob2Zmc2V0ID4+IDEpIC8gdmMtPnZjX2NvbHM7CisJCQl2Yy0+dmNfc3ctPmNvbl9wdXRjKHZjLCBuZXcsIG9sZHksIG9sZHgpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpbnNlcnRfY2hhcihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGludCBucikKK3sKKwl1bnNpZ25lZCBzaG9ydCAqcCwgKnEgPSAodW5zaWduZWQgc2hvcnQgKil2Yy0+dmNfcG9zOworCisJcCA9IHEgKyB2Yy0+dmNfY29scyAtIG5yIC0gdmMtPnZjX3g7CisJd2hpbGUgKC0tcCA+PSBxKQorCQlzY3Jfd3JpdGV3KHNjcl9yZWFkdyhwKSwgcCArIG5yKTsKKwlzY3JfbWVtc2V0dyhxLCB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwgbnIgKiAyKTsKKwl2Yy0+dmNfbmVlZF93cmFwID0gMDsKKwlpZiAoRE9fVVBEQVRFKHZjKSkgeworCQl1bnNpZ25lZCBzaG9ydCBvbGRhdHRyID0gdmMtPnZjX2F0dHI7CisJCXZjLT52Y19zdy0+Y29uX2Jtb3ZlKHZjLCB2Yy0+dmNfeSwgdmMtPnZjX3gsIHZjLT52Y195LCB2Yy0+dmNfeCArIG5yLCAxLAorCQkJCSAgICAgdmMtPnZjX2NvbHMgLSB2Yy0+dmNfeCAtIG5yKTsKKwkJdmMtPnZjX2F0dHIgPSB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciA+PiA4OworCQl3aGlsZSAobnItLSkKKwkJCXZjLT52Y19zdy0+Y29uX3B1dGModmMsIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLCB2Yy0+dmNfeSwgdmMtPnZjX3ggKyBucik7CisJCXZjLT52Y19hdHRyID0gb2xkYXR0cjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZV9jaGFyKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IG5yKQoreworCXVuc2lnbmVkIGludCBpID0gdmMtPnZjX3g7CisJdW5zaWduZWQgc2hvcnQgKnAgPSAodW5zaWduZWQgc2hvcnQgKil2Yy0+dmNfcG9zOworCisJd2hpbGUgKCsraSA8PSB2Yy0+dmNfY29scyAtIG5yKSB7CisJCXNjcl93cml0ZXcoc2NyX3JlYWR3KHArbnIpLCBwKTsKKwkJcCsrOworCX0KKwlzY3JfbWVtc2V0dyhwLCB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwgbnIgKiAyKTsKKwl2Yy0+dmNfbmVlZF93cmFwID0gMDsKKwlpZiAoRE9fVVBEQVRFKHZjKSkgeworCQl1bnNpZ25lZCBzaG9ydCBvbGRhdHRyID0gdmMtPnZjX2F0dHI7CisJCXZjLT52Y19zdy0+Y29uX2Jtb3ZlKHZjLCB2Yy0+dmNfeSwgdmMtPnZjX3ggKyBuciwgdmMtPnZjX3ksIHZjLT52Y194LCAxLAorCQkJCSAgICAgdmMtPnZjX2NvbHMgLSB2Yy0+dmNfeCAtIG5yKTsKKwkJdmMtPnZjX2F0dHIgPSB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciA+PiA4OworCQl3aGlsZSAobnItLSkKKwkJCXZjLT52Y19zdy0+Y29uX3B1dGModmMsIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLCB2Yy0+dmNfeSwKKwkJCQkgICAgIHZjLT52Y19jb2xzIC0gMSAtIG5yKTsKKwkJdmMtPnZjX2F0dHIgPSBvbGRhdHRyOworCX0KK30KKworc3RhdGljIGludCBzb2Z0Y3Vyc29yX29yaWdpbmFsOworCitzdGF0aWMgdm9pZCBhZGRfc29mdGN1cnNvcihzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJaW50IGkgPSBzY3JfcmVhZHcoKHUxNiAqKSB2Yy0+dmNfcG9zKTsKKwl1MzIgdHlwZSA9IHZjLT52Y19jdXJzb3JfdHlwZTsKKworCWlmICghICh0eXBlICYgMHgxMCkpIHJldHVybjsKKwlpZiAoc29mdGN1cnNvcl9vcmlnaW5hbCAhPSAtMSkgcmV0dXJuOworCXNvZnRjdXJzb3Jfb3JpZ2luYWwgPSBpOworCWkgfD0gKCh0eXBlID4+IDgpICYgMHhmZjAwICk7CisJaSBePSAoKHR5cGUpICYgMHhmZjAwICk7CisJaWYgKCh0eXBlICYgMHgyMCkgJiYgKChzb2Z0Y3Vyc29yX29yaWdpbmFsICYgMHg3MDAwKSA9PSAoaSAmIDB4NzAwMCkpKSBpIF49IDB4NzAwMDsKKwlpZiAoKHR5cGUgJiAweDQwKSAmJiAoKGkgJiAweDcwMCkgPT0gKChpICYgMHg3MDAwKSA+PiA0KSkpIGkgXj0gMHgwNzAwOworCXNjcl93cml0ZXcoaSwgKHUxNiAqKSB2Yy0+dmNfcG9zKTsKKwlpZiAoRE9fVVBEQVRFKHZjKSkKKwkJdmMtPnZjX3N3LT5jb25fcHV0Yyh2YywgaSwgdmMtPnZjX3ksIHZjLT52Y194KTsKK30KKworc3RhdGljIHZvaWQgaGlkZV9zb2Z0Y3Vyc29yKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwlpZiAoc29mdGN1cnNvcl9vcmlnaW5hbCAhPSAtMSkgeworCQlzY3Jfd3JpdGV3KHNvZnRjdXJzb3Jfb3JpZ2luYWwsICh1MTYgKil2Yy0+dmNfcG9zKTsKKwkJaWYgKERPX1VQREFURSh2YykpCisJCQl2Yy0+dmNfc3ctPmNvbl9wdXRjKHZjLCBzb2Z0Y3Vyc29yX29yaWdpbmFsLAorCQkJCQl2Yy0+dmNfeSwgdmMtPnZjX3gpOworCQlzb2Z0Y3Vyc29yX29yaWdpbmFsID0gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZCBoaWRlX2N1cnNvcihzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJaWYgKHZjID09IHNlbF9jb25zKQorCQljbGVhcl9zZWxlY3Rpb24oKTsKKwl2Yy0+dmNfc3ctPmNvbl9jdXJzb3IodmMsIENNX0VSQVNFKTsKKwloaWRlX3NvZnRjdXJzb3IodmMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfY3Vyc29yKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwlpZiAoIUlTX0ZHKHZjKSB8fCBjb25zb2xlX2JsYW5rZWQgfHwKKwkgICAgdmMtPnZjX21vZGUgPT0gS0RfR1JBUEhJQ1MpCisJCXJldHVybjsKKwlpZiAodmMtPnZjX2RlY2NtKSB7CisJCWlmICh2YyA9PSBzZWxfY29ucykKKwkJCWNsZWFyX3NlbGVjdGlvbigpOworCQlhZGRfc29mdGN1cnNvcih2Yyk7CisJCWlmICgodmMtPnZjX2N1cnNvcl90eXBlICYgMHgwZikgIT0gMSkKKwkJCXZjLT52Y19zdy0+Y29uX2N1cnNvcih2YywgQ01fRFJBVyk7CisJfSBlbHNlCisJCWhpZGVfY3Vyc29yKHZjKTsKK30KKworc3RhdGljIHZvaWQgc2V0X29yaWdpbihzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJV0FSTl9DT05TT0xFX1VOTE9DS0VEKCk7CisKKwlpZiAoIUNPTl9JU19WSVNJQkxFKHZjKSB8fAorCSAgICAhdmMtPnZjX3N3LT5jb25fc2V0X29yaWdpbiB8fAorCSAgICAhdmMtPnZjX3N3LT5jb25fc2V0X29yaWdpbih2YykpCisJCXZjLT52Y19vcmlnaW4gPSAodW5zaWduZWQgbG9uZyl2Yy0+dmNfc2NyZWVuYnVmOworCXZjLT52Y192aXNpYmxlX29yaWdpbiA9IHZjLT52Y19vcmlnaW47CisJdmMtPnZjX3Njcl9lbmQgPSB2Yy0+dmNfb3JpZ2luICsgdmMtPnZjX3NjcmVlbmJ1Zl9zaXplOworCXZjLT52Y19wb3MgPSB2Yy0+dmNfb3JpZ2luICsgdmMtPnZjX3NpemVfcm93ICogdmMtPnZjX3kgKyAyICogdmMtPnZjX3g7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX3NjcmVlbihzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJV0FSTl9DT05TT0xFX1VOTE9DS0VEKCk7CisKKwlpZiAodmMtPnZjX3N3LT5jb25fc2F2ZV9zY3JlZW4pCisJCXZjLT52Y19zdy0+Y29uX3NhdmVfc2NyZWVuKHZjKTsKK30KKworLyoKKyAqCVJlZHJhd2luZyBvZiBzY3JlZW4KKyAqLworCitzdGF0aWMgdm9pZCBjbGVhcl9idWZmZXJfYXR0cmlidXRlcyhzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJdW5zaWduZWQgc2hvcnQgKnAgPSAodW5zaWduZWQgc2hvcnQgKil2Yy0+dmNfb3JpZ2luOworCWludCBjb3VudCA9IHZjLT52Y19zY3JlZW5idWZfc2l6ZSAvIDI7CisJaW50IG1hc2sgPSB2Yy0+dmNfaGlfZm9udF9tYXNrIHwgMHhmZjsKKworCWZvciAoOyBjb3VudCA+IDA7IGNvdW50LS0sIHArKykgeworCQlzY3Jfd3JpdGV3KChzY3JfcmVhZHcocCkmbWFzaykgfCAodmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIgJiB+bWFzayksIHApOworCX0KK30KKwordm9pZCByZWRyYXdfc2NyZWVuKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IGlzX3N3aXRjaCkKK3sKKwlpbnQgcmVkcmF3ID0gMDsKKworCVdBUk5fQ09OU09MRV9VTkxPQ0tFRCgpOworCisJaWYgKCF2YykgeworCQkvKiBzdHJhbmdlIC4uLiAqLworCQkvKiBwcmludGsoInJlZHJhd19zY3JlZW46IHR0eSAlZCBub3QgYWxsb2NhdGVkID8/XG4iLCBuZXdfY29uc29sZSsxKTsgKi8KKwkJcmV0dXJuOworCX0KKworCWlmIChpc19zd2l0Y2gpIHsKKwkJc3RydWN0IHZjX2RhdGEgKm9sZF92YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKKwkJaWYgKG9sZF92YyA9PSB2YykKKwkJCXJldHVybjsKKwkJaWYgKCFDT05fSVNfVklTSUJMRSh2YykpCisJCQlyZWRyYXcgPSAxOworCQkqdmMtPnZjX2Rpc3BsYXlfZmcgPSB2YzsKKwkJZmdfY29uc29sZSA9IHZjLT52Y19udW07CisJCWhpZGVfY3Vyc29yKG9sZF92Yyk7CisJCWlmICghQ09OX0lTX1ZJU0lCTEUob2xkX3ZjKSkgeworCQkJc2F2ZV9zY3JlZW4ob2xkX3ZjKTsKKwkJCXNldF9vcmlnaW4ob2xkX3ZjKTsKKwkJfQorCX0gZWxzZSB7CisJCWhpZGVfY3Vyc29yKHZjKTsKKwkJcmVkcmF3ID0gMTsKKwl9CisKKwlpZiAocmVkcmF3KSB7CisJCWludCB1cGRhdGU7CisJCWludCBvbGRfd2FzX2NvbG9yID0gdmMtPnZjX2Nhbl9kb19jb2xvcjsKKworCQlzZXRfb3JpZ2luKHZjKTsKKwkJdXBkYXRlID0gdmMtPnZjX3N3LT5jb25fc3dpdGNoKHZjKTsKKwkJc2V0X3BhbGV0dGUodmMpOworCQkvKgorCQkgKiBJZiBjb25zb2xlIGNoYW5nZWQgZnJvbSBtb25vPC0+Y29sb3IsIHRoZSBiZXN0IHdlIGNhbiBkbworCQkgKiBpcyB0byBjbGVhciB0aGUgYnVmZmVyIGF0dHJpYnV0ZXMuIEFzIGl0IGN1cnJlbnRseSBzdGFuZHMsCisJCSAqIHJlYnVpbGRpbmcgbmV3IGF0dHJpYnV0ZXMgZnJvbSB0aGUgb2xkIGJ1ZmZlciBpcyBub3QgZG9hYmxlCisJCSAqIHdpdGhvdXQgb3Zlcmx5IGNvbXBsZXggY29kZS4KKwkJICovCisJCWlmIChvbGRfd2FzX2NvbG9yICE9IHZjLT52Y19jYW5fZG9fY29sb3IpIHsKKwkJCXVwZGF0ZV9hdHRyKHZjKTsKKwkJCWNsZWFyX2J1ZmZlcl9hdHRyaWJ1dGVzKHZjKTsKKwkJfQorCQlpZiAodXBkYXRlICYmIHZjLT52Y19tb2RlICE9IEtEX0dSQVBISUNTKQorCQkJZG9fdXBkYXRlX3JlZ2lvbih2YywgdmMtPnZjX29yaWdpbiwgdmMtPnZjX3NjcmVlbmJ1Zl9zaXplIC8gMik7CisJfQorCXNldF9jdXJzb3IodmMpOworCWlmIChpc19zd2l0Y2gpIHsKKwkJc2V0X2xlZHMoKTsKKwkJY29tcHV0ZV9zaGlmdHN0YXRlKCk7CisJfQorfQorCisvKgorICoJQWxsb2NhdGlvbiwgZnJlZWluZyBhbmQgcmVzaXppbmcgb2YgVlRzLgorICovCisKK2ludCB2Y19jb25zX2FsbG9jYXRlZCh1bnNpZ25lZCBpbnQgaSkKK3sKKwlyZXR1cm4gKGkgPCBNQVhfTlJfQ09OU09MRVMgJiYgdmNfY29uc1tpXS5kKTsKK30KKworc3RhdGljIHZvaWQgdmlzdWFsX2luaXQoc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgbnVtLCBpbnQgaW5pdCkKK3sKKwkvKiArK0dlZXJ0OiB2Yy0+dmNfc3ctPmNvbl9pbml0IGRldGVybWluZXMgY29uc29sZSBzaXplICovCisJaWYgKHZjLT52Y19zdykKKwkJbW9kdWxlX3B1dCh2Yy0+dmNfc3ctPm93bmVyKTsKKwl2Yy0+dmNfc3cgPSBjb25zd2l0Y2hwOworI2lmbmRlZiBWVF9TSU5HTEVfRFJJVkVSCisJaWYgKGNvbl9kcml2ZXJfbWFwW251bV0pCisJCXZjLT52Y19zdyA9IGNvbl9kcml2ZXJfbWFwW251bV07CisjZW5kaWYKKwlfX21vZHVsZV9nZXQodmMtPnZjX3N3LT5vd25lcik7CisJdmMtPnZjX251bSA9IG51bTsKKwl2Yy0+dmNfZGlzcGxheV9mZyA9ICZtYXN0ZXJfZGlzcGxheV9mZzsKKwl2Yy0+dmNfdW5pX3BhZ2VkaXJfbG9jID0gJnZjLT52Y191bmlfcGFnZWRpcjsKKwl2Yy0+dmNfdW5pX3BhZ2VkaXIgPSAwOworCXZjLT52Y19oaV9mb250X21hc2sgPSAwOworCXZjLT52Y19jb21wbGVtZW50X21hc2sgPSAwOworCXZjLT52Y19jYW5fZG9fY29sb3IgPSAwOworCXZjLT52Y19zdy0+Y29uX2luaXQodmMsIGluaXQpOworCWlmICghdmMtPnZjX2NvbXBsZW1lbnRfbWFzaykKKwkJdmMtPnZjX2NvbXBsZW1lbnRfbWFzayA9IHZjLT52Y19jYW5fZG9fY29sb3IgPyAweDc3MDAgOiAweDA4MDA7CisJdmMtPnZjX3NfY29tcGxlbWVudF9tYXNrID0gdmMtPnZjX2NvbXBsZW1lbnRfbWFzazsKKwl2Yy0+dmNfc2l6ZV9yb3cgPSB2Yy0+dmNfY29scyA8PCAxOworCXZjLT52Y19zY3JlZW5idWZfc2l6ZSA9IHZjLT52Y19yb3dzICogdmMtPnZjX3NpemVfcm93OworfQorCitpbnQgdmNfYWxsb2NhdGUodW5zaWduZWQgaW50IGN1cnJjb25zKQkvKiByZXR1cm4gMCBvbiBzdWNjZXNzICovCit7CisJV0FSTl9DT05TT0xFX1VOTE9DS0VEKCk7CisKKwlpZiAoY3VycmNvbnMgPj0gTUFYX05SX0NPTlNPTEVTKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghdmNfY29uc1tjdXJyY29uc10uZCkgeworCSAgICBzdHJ1Y3QgdmNfZGF0YSAqdmM7CisKKwkgICAgLyogcHJldmVudCB1c2VycyBmcm9tIHRha2luZyB0b28gbXVjaCBtZW1vcnkgKi8KKwkgICAgaWYgKGN1cnJjb25zID49IE1BWF9OUl9VU0VSX0NPTlNPTEVTICYmICFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQorCSAgICAgIHJldHVybiAtRVBFUk07CisKKwkgICAgLyogZHVlIHRvIHRoZSBncmFudWxhcml0eSBvZiBrbWFsbG9jLCB3ZSB3YXN0ZSBzb21lIG1lbW9yeSBoZXJlICovCisJICAgIC8qIHRoZSBhbGxvYyBpcyBkb25lIGluIHR3byBzdGVwcywgdG8gb3B0aW1pemUgdGhlIGNvbW1vbiBzaXR1YXRpb24KKwkgICAgICAgb2YgYSAyNXg4MCBjb25zb2xlIChzdHJ1Y3RzaXplPTIxNiwgc2NyZWVuYnVmX3NpemU9NDAwMCkgKi8KKwkgICAgLyogYWx0aG91Z2ggdGhlIG51bWJlcnMgYWJvdmUgYXJlIG5vdCB2YWxpZCBzaW5jZSBsb25nIGFnbywgdGhlCisJICAgICAgIHBvaW50IGlzIHN0aWxsIHVwLXRvLWRhdGUgYW5kIHRoZSBjb21tZW50IHN0aWxsIGhhcyBpdHMgdmFsdWUKKwkgICAgICAgZXZlbiBpZiBvbmx5IGFzIGEgaGlzdG9yaWNhbCBhcnRpZmFjdC4gIC0tbWosIEp1bHkgMTk5OCAqLworCSAgICB2YyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2Y19kYXRhKSwgR0ZQX0tFUk5FTCk7CisJICAgIGlmICghdmMpCisJCXJldHVybiAtRU5PTUVNOworCSAgICBtZW1zZXQodmMsIDAsIHNpemVvZigqdmMpKTsKKwkgICAgdmNfY29uc1tjdXJyY29uc10uZCA9IHZjOworCSAgICB2aXN1YWxfaW5pdCh2YywgY3VycmNvbnMsIDEpOworCSAgICBpZiAoISp2Yy0+dmNfdW5pX3BhZ2VkaXJfbG9jKQorCQljb25fc2V0X2RlZmF1bHRfdW5pbWFwKHZjKTsKKwkgICAgdmMtPnZjX3NjcmVlbmJ1ZiA9IGttYWxsb2ModmMtPnZjX3NjcmVlbmJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKwkgICAgaWYgKCF2Yy0+dmNfc2NyZWVuYnVmKSB7CisJCWtmcmVlKHZjKTsKKwkJdmNfY29uc1tjdXJyY29uc10uZCA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCSAgICB9CisJICAgIHZjLT52Y19rbWFsbG9jZWQgPSAxOworCSAgICB2Y19pbml0KHZjLCB2Yy0+dmNfcm93cywgdmMtPnZjX2NvbHMsIDEpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmVzaXplX3NjcmVlbihzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwkvKiBSZXNpemVzIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBkaXNwbGF5IGFkYXBhdGVyICovCisJaW50IGVyciA9IDA7CisKKwlpZiAodmMtPnZjX21vZGUgIT0gS0RfR1JBUEhJQ1MgJiYgdmMtPnZjX3N3LT5jb25fcmVzaXplKQorCQllcnIgPSB2Yy0+dmNfc3ctPmNvbl9yZXNpemUodmMsIHdpZHRoLCBoZWlnaHQpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDaGFuZ2UgIyBvZiByb3dzIGFuZCBjb2x1bW5zICgwIG1lYW5zIHVuY2hhbmdlZC90aGUgc2l6ZSBvZiBmZ19jb25zb2xlKQorICogW3RoaXMgaXMgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoIHNvbWUgdXNlciBwcm9ncmFtCisgKiBsaWtlIHJlc2l6ZSB0aGF0IGNoYW5nZXMgdGhlIGhhcmR3YXJlIHZpZGVvbW9kZV0KKyAqLworI2RlZmluZSBWQ19SRVNJWkVfTUFYQ09MICgzMjc2NykKKyNkZWZpbmUgVkNfUkVTSVpFX01BWFJPVyAoMzI3NjcpCitpbnQgdmNfcmVzaXplKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IGNvbHMsIHVuc2lnbmVkIGludCBsaW5lcykKK3sKKwl1bnNpZ25lZCBsb25nIG9sZF9vcmlnaW4sIG5ld19vcmlnaW4sIG5ld19zY3JfZW5kLCBybHRoLCBycmVtLCBlcnIgPSAwOworCXVuc2lnbmVkIGludCBvbGRfY29scywgb2xkX3Jvd3MsIG9sZF9yb3dfc2l6ZSwgb2xkX3NjcmVlbl9zaXplOworCXVuc2lnbmVkIGludCBuZXdfY29scywgbmV3X3Jvd3MsIG5ld19yb3dfc2l6ZSwgbmV3X3NjcmVlbl9zaXplOworCXVuc2lnbmVkIHNob3J0ICpuZXdzY3JlZW47CisKKwlXQVJOX0NPTlNPTEVfVU5MT0NLRUQoKTsKKworCWlmICghdmMpCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAoY29scyA+IFZDX1JFU0laRV9NQVhDT0wgfHwgbGluZXMgPiBWQ19SRVNJWkVfTUFYUk9XKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5ld19jb2xzID0gKGNvbHMgPyBjb2xzIDogdmMtPnZjX2NvbHMpOworCW5ld19yb3dzID0gKGxpbmVzID8gbGluZXMgOiB2Yy0+dmNfcm93cyk7CisJbmV3X3Jvd19zaXplID0gbmV3X2NvbHMgPDwgMTsKKwluZXdfc2NyZWVuX3NpemUgPSBuZXdfcm93X3NpemUgKiBuZXdfcm93czsKKworCWlmIChuZXdfY29scyA9PSB2Yy0+dmNfY29scyAmJiBuZXdfcm93cyA9PSB2Yy0+dmNfcm93cykKKwkJcmV0dXJuIDA7CisKKwluZXdzY3JlZW4gPSAodW5zaWduZWQgc2hvcnQgKikga21hbGxvYyhuZXdfc2NyZWVuX3NpemUsIEdGUF9VU0VSKTsKKwlpZiAoIW5ld3NjcmVlbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvbGRfcm93cyA9IHZjLT52Y19yb3dzOworCW9sZF9jb2xzID0gdmMtPnZjX2NvbHM7CisJb2xkX3Jvd19zaXplID0gdmMtPnZjX3NpemVfcm93OworCW9sZF9zY3JlZW5fc2l6ZSA9IHZjLT52Y19zY3JlZW5idWZfc2l6ZTsKKworCWVyciA9IHJlc2l6ZV9zY3JlZW4odmMsIG5ld19jb2xzLCBuZXdfcm93cyk7CisJaWYgKGVycikgeworCQlrZnJlZShuZXdzY3JlZW4pOworCQlyZXR1cm4gZXJyOworCX0KKworCXZjLT52Y19yb3dzID0gbmV3X3Jvd3M7CisJdmMtPnZjX2NvbHMgPSBuZXdfY29sczsKKwl2Yy0+dmNfc2l6ZV9yb3cgPSBuZXdfcm93X3NpemU7CisJdmMtPnZjX3NjcmVlbmJ1Zl9zaXplID0gbmV3X3NjcmVlbl9zaXplOworCisJcmx0aCA9IG1pbihvbGRfcm93X3NpemUsIG5ld19yb3dfc2l6ZSk7CisJcnJlbSA9IG5ld19yb3dfc2l6ZSAtIHJsdGg7CisJb2xkX29yaWdpbiA9IHZjLT52Y19vcmlnaW47CisJbmV3X29yaWdpbiA9IChsb25nKSBuZXdzY3JlZW47CisJbmV3X3Njcl9lbmQgPSBuZXdfb3JpZ2luICsgbmV3X3NjcmVlbl9zaXplOworCWlmIChuZXdfcm93cyA8IG9sZF9yb3dzKQorCQlvbGRfb3JpZ2luICs9IChvbGRfcm93cyAtIG5ld19yb3dzKSAqIG9sZF9yb3dfc2l6ZTsKKworCXVwZGF0ZV9hdHRyKHZjKTsKKworCXdoaWxlIChvbGRfb3JpZ2luIDwgdmMtPnZjX3Njcl9lbmQpIHsKKwkJc2NyX21lbWNweXcoKHVuc2lnbmVkIHNob3J0ICopIG5ld19vcmlnaW4sICh1bnNpZ25lZCBzaG9ydCAqKSBvbGRfb3JpZ2luLCBybHRoKTsKKwkJaWYgKHJyZW0pCisJCQlzY3JfbWVtc2V0dygodm9pZCAqKShuZXdfb3JpZ2luICsgcmx0aCksIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLCBycmVtKTsKKwkJb2xkX29yaWdpbiArPSBvbGRfcm93X3NpemU7CisJCW5ld19vcmlnaW4gKz0gbmV3X3Jvd19zaXplOworCX0KKwlpZiAobmV3X3Njcl9lbmQgPiBuZXdfb3JpZ2luKQorCQlzY3JfbWVtc2V0dygodm9pZCAqKW5ld19vcmlnaW4sIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLCBuZXdfc2NyX2VuZCAtIG5ld19vcmlnaW4pOworCWlmICh2Yy0+dmNfa21hbGxvY2VkKQorCQlrZnJlZSh2Yy0+dmNfc2NyZWVuYnVmKTsKKwl2Yy0+dmNfc2NyZWVuYnVmID0gbmV3c2NyZWVuOworCXZjLT52Y19rbWFsbG9jZWQgPSAxOworCXZjLT52Y19zY3JlZW5idWZfc2l6ZSA9IG5ld19zY3JlZW5fc2l6ZTsKKwlzZXRfb3JpZ2luKHZjKTsKKworCS8qIGRvIHBhcnQgb2YgYSByZXNldF90ZXJtaW5hbCgpICovCisJdmMtPnZjX3RvcCA9IDA7CisJdmMtPnZjX2JvdHRvbSA9IHZjLT52Y19yb3dzOworCWdvdG94eSh2YywgdmMtPnZjX3gsIHZjLT52Y195KTsKKwlzYXZlX2N1cih2Yyk7CisKKwlpZiAodmMtPnZjX3R0eSkgeworCQlzdHJ1Y3Qgd2luc2l6ZSB3cywgKmN3cyA9ICZ2Yy0+dmNfdHR5LT53aW5zaXplOworCisJCW1lbXNldCgmd3MsIDAsIHNpemVvZih3cykpOworCQl3cy53c19yb3cgPSB2Yy0+dmNfcm93czsKKwkJd3Mud3NfY29sID0gdmMtPnZjX2NvbHM7CisJCXdzLndzX3lwaXhlbCA9IHZjLT52Y19zY2FuX2xpbmVzOworCQlpZiAoKHdzLndzX3JvdyAhPSBjd3MtPndzX3JvdyB8fCB3cy53c19jb2wgIT0gY3dzLT53c19jb2wpICYmCisJCSAgICB2Yy0+dmNfdHR5LT5wZ3JwID4gMCkKKwkJCWtpbGxfcGcodmMtPnZjX3R0eS0+cGdycCwgU0lHV0lOQ0gsIDEpOworCQkqY3dzID0gd3M7CisJfQorCisJaWYgKENPTl9JU19WSVNJQkxFKHZjKSkKKwkJdXBkYXRlX3NjcmVlbih2Yyk7CisJcmV0dXJuIGVycjsKK30KKworCit2b2lkIHZjX2Rpc2FsbG9jYXRlKHVuc2lnbmVkIGludCBjdXJyY29ucykKK3sKKwlXQVJOX0NPTlNPTEVfVU5MT0NLRUQoKTsKKworCWlmICh2Y19jb25zX2FsbG9jYXRlZChjdXJyY29ucykpIHsKKwkJc3RydWN0IHZjX2RhdGEgKnZjID0gdmNfY29uc1tjdXJyY29uc10uZDsKKwkJdmMtPnZjX3N3LT5jb25fZGVpbml0KHZjKTsKKwkJaWYgKHZjLT52Y19rbWFsbG9jZWQpCisJCQlrZnJlZSh2Yy0+dmNfc2NyZWVuYnVmKTsKKwkJaWYgKGN1cnJjb25zID49IE1JTl9OUl9DT05TT0xFUykKKwkJCWtmcmVlKHZjKTsKKwkJdmNfY29uc1tjdXJyY29uc10uZCA9IE5VTEw7CisJfQorfQorCisvKgorICoJVlQxMDIgZW11bGF0b3IKKyAqLworCisjZGVmaW5lIHNldF9rYmQodmMsIHgpCXNldF92Y19rYmRfbW9kZShrYmRfdGFibGUgKyAodmMpLT52Y19udW0sICh4KSkKKyNkZWZpbmUgY2xyX2tiZCh2YywgeCkJY2xyX3ZjX2tiZF9tb2RlKGtiZF90YWJsZSArICh2YyktPnZjX251bSwgKHgpKQorI2RlZmluZSBpc19rYmQodmMsIHgpCXZjX2tiZF9tb2RlKGtiZF90YWJsZSArICh2YyktPnZjX251bSwgKHgpKQorCisjZGVmaW5lIGRlY2FybQkJVkNfUkVQRUFUCisjZGVmaW5lIGRlY2NrbQkJVkNfQ0tNT0RFCisjZGVmaW5lIGtiZGFwcGxpYwlWQ19BUFBMSUMKKyNkZWZpbmUgbG5tCQlWQ19DUkxGCisKKy8qCisgKiB0aGlzIGlzIHdoYXQgdGhlIHRlcm1pbmFsIGFuc3dlcnMgdG8gYSBFU0MtWiBvciBjc2kwYyBxdWVyeS4KKyAqLworI2RlZmluZSBWVDEwMElEICJcMDMzWz8xOzJjIgorI2RlZmluZSBWVDEwMklEICJcMDMzWz82YyIKKwordW5zaWduZWQgY2hhciBjb2xvcl90YWJsZVtdID0geyAwLCA0LCAyLCA2LCAxLCA1LCAzLCA3LAorCQkJCSAgICAgICA4LDEyLDEwLDE0LCA5LDEzLDExLDE1IH07CisKKy8qIHRoZSBkZWZhdWx0IGNvbG91ciB0YWJsZSwgZm9yIFZHQSsgY29sb3VyIHN5c3RlbXMgKi8KK2ludCBkZWZhdWx0X3JlZFtdID0gezB4MDAsMHhhYSwweDAwLDB4YWEsMHgwMCwweGFhLDB4MDAsMHhhYSwKKyAgICAweDU1LDB4ZmYsMHg1NSwweGZmLDB4NTUsMHhmZiwweDU1LDB4ZmZ9OworaW50IGRlZmF1bHRfZ3JuW10gPSB7MHgwMCwweDAwLDB4YWEsMHg1NSwweDAwLDB4MDAsMHhhYSwweGFhLAorICAgIDB4NTUsMHg1NSwweGZmLDB4ZmYsMHg1NSwweDU1LDB4ZmYsMHhmZn07CitpbnQgZGVmYXVsdF9ibHVbXSA9IHsweDAwLDB4MDAsMHgwMCwweDAwLDB4YWEsMHhhYSwweGFhLDB4YWEsCisgICAgMHg1NSwweDU1LDB4NTUsMHg1NSwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKworLyoKKyAqIGdvdG94eSgpIG11c3QgdmVyaWZ5IGFsbCBib3VuZGFyaWVzLCBiZWNhdXNlIHRoZSBhcmd1bWVudHMKKyAqIG1pZ2h0IGFsc28gYmUgbmVnYXRpdmUuIElmIHRoZSBnaXZlbiBwb3NpdGlvbiBpcyBvdXQgb2YKKyAqIGJvdW5kcywgdGhlIGN1cnNvciBpcyBwbGFjZWQgYXQgdGhlIG5lYXJlc3QgbWFyZ2luLgorICovCitzdGF0aWMgdm9pZCBnb3RveHkoc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgbmV3X3gsIGludCBuZXdfeSkKK3sKKwlpbnQgbWluX3ksIG1heF95OworCisJaWYgKG5ld194IDwgMCkKKwkJdmMtPnZjX3ggPSAwOworCWVsc2UgeworCQlpZiAobmV3X3ggPj0gdmMtPnZjX2NvbHMpCisJCQl2Yy0+dmNfeCA9IHZjLT52Y19jb2xzIC0gMTsKKwkJZWxzZQorCQkJdmMtPnZjX3ggPSBuZXdfeDsKKwl9CisKKyAJaWYgKHZjLT52Y19kZWNvbSkgeworCQltaW5feSA9IHZjLT52Y190b3A7CisJCW1heF95ID0gdmMtPnZjX2JvdHRvbTsKKwl9IGVsc2UgeworCQltaW5feSA9IDA7CisJCW1heF95ID0gdmMtPnZjX3Jvd3M7CisJfQorCWlmIChuZXdfeSA8IG1pbl95KQorCQl2Yy0+dmNfeSA9IG1pbl95OworCWVsc2UgaWYgKG5ld195ID49IG1heF95KQorCQl2Yy0+dmNfeSA9IG1heF95IC0gMTsKKwllbHNlCisJCXZjLT52Y195ID0gbmV3X3k7CisJdmMtPnZjX3BvcyA9IHZjLT52Y19vcmlnaW4gKyB2Yy0+dmNfeSAqIHZjLT52Y19zaXplX3JvdyArICh2Yy0+dmNfeDw8MSk7CisJdmMtPnZjX25lZWRfd3JhcCA9IDA7Cit9CisKKy8qIGZvciBhYnNvbHV0ZSB1c2VyIG1vdmVzLCB3aGVuIGRlY29tIGlzIHNldCAqLworc3RhdGljIHZvaWQgZ290b3hheShzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCBuZXdfeCwgaW50IG5ld195KQoreworCWdvdG94eSh2YywgbmV3X3gsIHZjLT52Y19kZWNvbSA/ICh2Yy0+dmNfdG9wICsgbmV3X3kpIDogbmV3X3kpOworfQorCit2b2lkIHNjcm9sbGJhY2soc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgbGluZXMpCit7CisJaWYgKCFsaW5lcykKKwkJbGluZXMgPSB2Yy0+dmNfcm93cyAvIDI7CisJc2Nyb2xsZGVsdGEoLWxpbmVzKTsKK30KKwordm9pZCBzY3JvbGxmcm9udChzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCBsaW5lcykKK3sKKwlpZiAoIWxpbmVzKQorCQlsaW5lcyA9IHZjLT52Y19yb3dzIC8gMjsKKwlzY3JvbGxkZWx0YShsaW5lcyk7Cit9CisKK3N0YXRpYyB2b2lkIGxmKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKyAgICAJLyogZG9uJ3Qgc2Nyb2xsIGlmIGFib3ZlIGJvdHRvbSBvZiBzY3JvbGxpbmcgcmVnaW9uLCBvcgorCSAqIGlmIGJlbG93IHNjcm9sbGluZyByZWdpb24KKwkgKi8KKyAgICAJaWYgKHZjLT52Y195ICsgMSA9PSB2Yy0+dmNfYm90dG9tKQorCQlzY3J1cCh2YywgdmMtPnZjX3RvcCwgdmMtPnZjX2JvdHRvbSwgMSk7CisJZWxzZSBpZiAodmMtPnZjX3kgPCB2Yy0+dmNfcm93cyAtIDEpIHsKKwkgICAgCXZjLT52Y195Kys7CisJCXZjLT52Y19wb3MgKz0gdmMtPnZjX3NpemVfcm93OworCX0KKwl2Yy0+dmNfbmVlZF93cmFwID0gMDsKK30KKworc3RhdGljIHZvaWQgcmkoc3RydWN0IHZjX2RhdGEgKnZjKQoreworICAgIAkvKiBkb24ndCBzY3JvbGwgaWYgYmVsb3cgdG9wIG9mIHNjcm9sbGluZyByZWdpb24sIG9yCisJICogaWYgYWJvdmUgc2Nyb2xsaW5nIHJlZ2lvbgorCSAqLworCWlmICh2Yy0+dmNfeSA9PSB2Yy0+dmNfdG9wKQorCQlzY3Jkb3duKHZjLCB2Yy0+dmNfdG9wLCB2Yy0+dmNfYm90dG9tLCAxKTsKKwllbHNlIGlmICh2Yy0+dmNfeSA+IDApIHsKKwkJdmMtPnZjX3ktLTsKKwkJdmMtPnZjX3BvcyAtPSB2Yy0+dmNfc2l6ZV9yb3c7CisJfQorCXZjLT52Y19uZWVkX3dyYXAgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3Ioc3RydWN0IHZjX2RhdGEgKnZjKQoreworCXZjLT52Y19wb3MgLT0gdmMtPnZjX3ggPDwgMTsKKwl2Yy0+dmNfbmVlZF93cmFwID0gdmMtPnZjX3ggPSAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnMoc3RydWN0IHZjX2RhdGEgKnZjKQoreworCWlmICh2Yy0+dmNfeCkgeworCQl2Yy0+dmNfcG9zIC09IDI7CisJCXZjLT52Y194LS07CisJCXZjLT52Y19uZWVkX3dyYXAgPSAwOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlbChzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJLyogaWdub3JlZCAqLworfQorCitzdGF0aWMgdm9pZCBjc2lfSihzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCB2cGFyKQoreworCXVuc2lnbmVkIGludCBjb3VudDsKKwl1bnNpZ25lZCBzaG9ydCAqIHN0YXJ0OworCisJc3dpdGNoICh2cGFyKSB7CisJCWNhc2UgMDoJLyogZXJhc2UgZnJvbSBjdXJzb3IgdG8gZW5kIG9mIGRpc3BsYXkgKi8KKwkJCWNvdW50ID0gKHZjLT52Y19zY3JfZW5kIC0gdmMtPnZjX3BvcykgPj4gMTsKKwkJCXN0YXJ0ID0gKHVuc2lnbmVkIHNob3J0ICopdmMtPnZjX3BvczsKKwkJCWlmIChET19VUERBVEUodmMpKSB7CisJCQkJLyogZG8gaW4gdHdvIHN0YWdlcyAqLworCQkJCXZjLT52Y19zdy0+Y29uX2NsZWFyKHZjLCB2Yy0+dmNfeSwgdmMtPnZjX3gsIDEsCisJCQkJCSAgICAgIHZjLT52Y19jb2xzIC0gdmMtPnZjX3gpOworCQkJCXZjLT52Y19zdy0+Y29uX2NsZWFyKHZjLCB2Yy0+dmNfeSArIDEsIDAsCisJCQkJCSAgICAgIHZjLT52Y19yb3dzIC0gdmMtPnZjX3kgLSAxLAorCQkJCQkgICAgICB2Yy0+dmNfY29scyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxOgkvKiBlcmFzZSBmcm9tIHN0YXJ0IHRvIGN1cnNvciAqLworCQkJY291bnQgPSAoKHZjLT52Y19wb3MgLSB2Yy0+dmNfb3JpZ2luKSA+PiAxKSArIDE7CisJCQlzdGFydCA9ICh1bnNpZ25lZCBzaG9ydCAqKXZjLT52Y19vcmlnaW47CisJCQlpZiAoRE9fVVBEQVRFKHZjKSkgeworCQkJCS8qIGRvIGluIHR3byBzdGFnZXMgKi8KKwkJCQl2Yy0+dmNfc3ctPmNvbl9jbGVhcih2YywgMCwgMCwgdmMtPnZjX3ksCisJCQkJCSAgICAgIHZjLT52Y19jb2xzKTsKKwkJCQl2Yy0+dmNfc3ctPmNvbl9jbGVhcih2YywgdmMtPnZjX3ksIDAsIDEsCisJCQkJCSAgICAgIHZjLT52Y194ICsgMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOiAvKiBlcmFzZSB3aG9sZSBkaXNwbGF5ICovCisJCQljb3VudCA9IHZjLT52Y19jb2xzICogdmMtPnZjX3Jvd3M7CisJCQlzdGFydCA9ICh1bnNpZ25lZCBzaG9ydCAqKXZjLT52Y19vcmlnaW47CisJCQlpZiAoRE9fVVBEQVRFKHZjKSkKKwkJCQl2Yy0+dmNfc3ctPmNvbl9jbGVhcih2YywgMCwgMCwKKwkJCQkJICAgICAgdmMtPnZjX3Jvd3MsCisJCQkJCSAgICAgIHZjLT52Y19jb2xzKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuOworCX0KKwlzY3JfbWVtc2V0dyhzdGFydCwgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsIDIgKiBjb3VudCk7CisJdmMtPnZjX25lZWRfd3JhcCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNzaV9LKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IHZwYXIpCit7CisJdW5zaWduZWQgaW50IGNvdW50OworCXVuc2lnbmVkIHNob3J0ICogc3RhcnQ7CisKKwlzd2l0Y2ggKHZwYXIpIHsKKwkJY2FzZSAwOgkvKiBlcmFzZSBmcm9tIGN1cnNvciB0byBlbmQgb2YgbGluZSAqLworCQkJY291bnQgPSB2Yy0+dmNfY29scyAtIHZjLT52Y194OworCQkJc3RhcnQgPSAodW5zaWduZWQgc2hvcnQgKil2Yy0+dmNfcG9zOworCQkJaWYgKERPX1VQREFURSh2YykpCisJCQkJdmMtPnZjX3N3LT5jb25fY2xlYXIodmMsIHZjLT52Y195LCB2Yy0+dmNfeCwgMSwKKwkJCQkJCSAgICAgdmMtPnZjX2NvbHMgLSB2Yy0+dmNfeCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgkvKiBlcmFzZSBmcm9tIHN0YXJ0IG9mIGxpbmUgdG8gY3Vyc29yICovCisJCQlzdGFydCA9ICh1bnNpZ25lZCBzaG9ydCAqKSh2Yy0+dmNfcG9zIC0gKHZjLT52Y194IDw8IDEpKTsKKwkJCWNvdW50ID0gdmMtPnZjX3ggKyAxOworCQkJaWYgKERPX1VQREFURSh2YykpCisJCQkJdmMtPnZjX3N3LT5jb25fY2xlYXIodmMsIHZjLT52Y195LCAwLCAxLAorCQkJCQkJICAgICB2Yy0+dmNfeCArIDEpOworCQkJYnJlYWs7CisJCWNhc2UgMjogLyogZXJhc2Ugd2hvbGUgbGluZSAqLworCQkJc3RhcnQgPSAodW5zaWduZWQgc2hvcnQgKikodmMtPnZjX3BvcyAtICh2Yy0+dmNfeCA8PCAxKSk7CisJCQljb3VudCA9IHZjLT52Y19jb2xzOworCQkJaWYgKERPX1VQREFURSh2YykpCisJCQkJdmMtPnZjX3N3LT5jb25fY2xlYXIodmMsIHZjLT52Y195LCAwLCAxLAorCQkJCQkgICAgICB2Yy0+dmNfY29scyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybjsKKwl9CisJc2NyX21lbXNldHcoc3RhcnQsIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLCAyICogY291bnQpOworCXZjLT52Y19uZWVkX3dyYXAgPSAwOworfQorCitzdGF0aWMgdm9pZCBjc2lfWChzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCB2cGFyKSAvKiBlcmFzZSB0aGUgZm9sbG93aW5nIHZwYXIgcG9zaXRpb25zICovCit7CQkJCQkgIC8qIG5vdCB2dDEwMD8gKi8KKwlpbnQgY291bnQ7CisKKwlpZiAoIXZwYXIpCisJCXZwYXIrKzsKKwljb3VudCA9ICh2cGFyID4gdmMtPnZjX2NvbHMgLSB2Yy0+dmNfeCkgPyAodmMtPnZjX2NvbHMgLSB2Yy0+dmNfeCkgOiB2cGFyOworCisJc2NyX21lbXNldHcoKHVuc2lnbmVkIHNob3J0ICopdmMtPnZjX3BvcywgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsIDIgKiBjb3VudCk7CisJaWYgKERPX1VQREFURSh2YykpCisJCXZjLT52Y19zdy0+Y29uX2NsZWFyKHZjLCB2Yy0+dmNfeSwgdmMtPnZjX3gsIDEsIGNvdW50KTsKKwl2Yy0+dmNfbmVlZF93cmFwID0gMDsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdF9hdHRyKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwl2Yy0+dmNfaW50ZW5zaXR5ID0gMTsKKwl2Yy0+dmNfdW5kZXJsaW5lID0gMDsKKwl2Yy0+dmNfcmV2ZXJzZSA9IDA7CisJdmMtPnZjX2JsaW5rID0gMDsKKwl2Yy0+dmNfY29sb3IgPSB2Yy0+dmNfZGVmX2NvbG9yOworfQorCisvKiBjb25zb2xlX3NlbSBpcyBoZWxkICovCitzdGF0aWMgdm9pZCBjc2lfbShzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IHZjLT52Y19ucGFyOyBpKyspCisJCXN3aXRjaCAodmMtPnZjX3BhcltpXSkgeworCQkJY2FzZSAwOgkvKiBhbGwgYXR0cmlidXRlcyBvZmYgKi8KKwkJCQlkZWZhdWx0X2F0dHIodmMpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXZjLT52Y19pbnRlbnNpdHkgPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXZjLT52Y19pbnRlbnNpdHkgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXZjLT52Y191bmRlcmxpbmUgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCXZjLT52Y19ibGluayA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDc6CisJCQkJdmMtPnZjX3JldmVyc2UgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAxMDogLyogQU5TSSBYMy42NC0xOTc5IChTQ08taXNoPykKKwkJCQkgICogU2VsZWN0IHByaW1hcnkgZm9udCwgZG9uJ3QgZGlzcGxheQorCQkJCSAgKiBjb250cm9sIGNoYXJzIGlmIGRlZmluZWQsIGRvbid0IHNldAorCQkJCSAgKiBiaXQgOCBvbiBvdXRwdXQuCisJCQkJICAqLworCQkJCXZjLT52Y190cmFuc2xhdGUgPSBzZXRfdHJhbnNsYXRlKHZjLT52Y19jaGFyc2V0ID09IDAKKwkJCQkJCT8gdmMtPnZjX0cwX2NoYXJzZXQKKwkJCQkJCTogdmMtPnZjX0cxX2NoYXJzZXQsIHZjKTsKKwkJCQl2Yy0+dmNfZGlzcF9jdHJsID0gMDsKKwkJCQl2Yy0+dmNfdG9nZ2xlX21ldGEgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSAxMTogLyogQU5TSSBYMy42NC0xOTc5IChTQ08taXNoPykKKwkJCQkgICogU2VsZWN0IGZpcnN0IGFsdGVybmF0ZSBmb250LCBsZXRzCisJCQkJICAqIGNoYXJzIDwgMzIgYmUgZGlzcGxheWVkIGFzIFJPTSBjaGFycy4KKwkJCQkgICovCisJCQkJdmMtPnZjX3RyYW5zbGF0ZSA9IHNldF90cmFuc2xhdGUoSUJNUENfTUFQLCB2Yyk7CisJCQkJdmMtPnZjX2Rpc3BfY3RybCA9IDE7CisJCQkJdmMtPnZjX3RvZ2dsZV9tZXRhID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTI6IC8qIEFOU0kgWDMuNjQtMTk3OSAoU0NPLWlzaD8pCisJCQkJICAqIFNlbGVjdCBzZWNvbmQgYWx0ZXJuYXRlIGZvbnQsIHRvZ2dsZQorCQkJCSAgKiBoaWdoIGJpdCBiZWZvcmUgZGlzcGxheWluZyBhcyBST00gY2hhci4KKwkJCQkgICovCisJCQkJdmMtPnZjX3RyYW5zbGF0ZSA9IHNldF90cmFuc2xhdGUoSUJNUENfTUFQLCB2Yyk7CisJCQkJdmMtPnZjX2Rpc3BfY3RybCA9IDE7CisJCQkJdmMtPnZjX3RvZ2dsZV9tZXRhID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjE6CisJCQljYXNlIDIyOgorCQkJCXZjLT52Y19pbnRlbnNpdHkgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAyNDoKKwkJCQl2Yy0+dmNfdW5kZXJsaW5lID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjU6CisJCQkJdmMtPnZjX2JsaW5rID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjc6CisJCQkJdmMtPnZjX3JldmVyc2UgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSAzODogLyogQU5TSSBYMy42NC0xOTc5IChTQ08taXNoPykKKwkJCQkgICogRW5hYmxlcyB1bmRlcnNjb3JlLCB3aGl0ZSBmb3JlZ3JvdW5kCisJCQkJICAqIHdpdGggd2hpdGUgdW5kZXJzY29yZSAoTGludXggLSB1c2UKKwkJCQkgICogZGVmYXVsdCBmb3JlZ3JvdW5kKS4KKwkJCQkgICovCisJCQkJdmMtPnZjX2NvbG9yID0gKHZjLT52Y19kZWZfY29sb3IgJiAweDBmKSB8ICh2Yy0+dmNfY29sb3IgJiAweGYwKTsKKwkJCQl2Yy0+dmNfdW5kZXJsaW5lID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzk6IC8qIEFOU0kgWDMuNjQtMTk3OSAoU0NPLWlzaD8pCisJCQkJICAqIERpc2FibGUgdW5kZXJsaW5lIG9wdGlvbi4KKwkJCQkgICogUmVzZXQgY29sb3VyIHRvIGRlZmF1bHQ/IEl0IGRpZCB0aGlzCisJCQkJICAqIGJlZm9yZS4uLgorCQkJCSAgKi8KKwkJCQl2Yy0+dmNfY29sb3IgPSAodmMtPnZjX2RlZl9jb2xvciAmIDB4MGYpIHwgKHZjLT52Y19jb2xvciAmIDB4ZjApOworCQkJCXZjLT52Y191bmRlcmxpbmUgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSA0OToKKwkJCQl2Yy0+dmNfY29sb3IgPSAodmMtPnZjX2RlZl9jb2xvciAmIDB4ZjApIHwgKHZjLT52Y19jb2xvciAmIDB4MGYpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZiAodmMtPnZjX3BhcltpXSA+PSAzMCAmJiB2Yy0+dmNfcGFyW2ldIDw9IDM3KQorCQkJCQl2Yy0+dmNfY29sb3IgPSBjb2xvcl90YWJsZVt2Yy0+dmNfcGFyW2ldIC0gMzBdCisJCQkJCQl8ICh2Yy0+dmNfY29sb3IgJiAweGYwKTsKKwkJCQllbHNlIGlmICh2Yy0+dmNfcGFyW2ldID49IDQwICYmIHZjLT52Y19wYXJbaV0gPD0gNDcpCisJCQkJCXZjLT52Y19jb2xvciA9IChjb2xvcl90YWJsZVt2Yy0+dmNfcGFyW2ldIC0gNDBdIDw8IDQpCisJCQkJCQl8ICh2Yy0+dmNfY29sb3IgJiAweDBmKTsKKwkJCQlicmVhazsKKwkJfQorCXVwZGF0ZV9hdHRyKHZjKTsKK30KKworc3RhdGljIHZvaWQgcmVzcG9uZF9zdHJpbmcoY29uc3QgY2hhciAqcCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwl3aGlsZSAoKnApIHsKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAqcCwgMCk7CisJCXArKzsKKwl9CisJY29uX3NjaGVkdWxlX2ZsaXAodHR5KTsKK30KKworc3RhdGljIHZvaWQgY3Vyc29yX3JlcG9ydChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJY2hhciBidWZbNDBdOworCisJc3ByaW50ZihidWYsICJcMDMzWyVkOyVkUiIsIHZjLT52Y195ICsgKHZjLT52Y19kZWNvbSA/IHZjLT52Y190b3AgKyAxIDogMSksIHZjLT52Y194ICsgMSk7CisJcmVzcG9uZF9zdHJpbmcoYnVmLCB0dHkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhdHVzX3JlcG9ydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJlc3BvbmRfc3RyaW5nKCJcMDMzWzBuIiwgdHR5KTsJLyogVGVybWluYWwgb2sgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc3BvbmRfSUQoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJcmVzcG9uZF9zdHJpbmcoVlQxMDJJRCwgdHR5KTsKK30KKwordm9pZCBtb3VzZV9yZXBvcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJ1dHQsIGludCBtcngsIGludCBtcnkpCit7CisJY2hhciBidWZbOF07CisKKwlzcHJpbnRmKGJ1ZiwgIlwwMzNbTSVjJWMlYyIsIChjaGFyKSgnICcgKyBidXR0KSwgKGNoYXIpKCchJyArIG1yeCksCisJCShjaGFyKSgnIScgKyBtcnkpKTsKKwlyZXNwb25kX3N0cmluZyhidWYsIHR0eSk7Cit9CisKKy8qIGludm9rZWQgdmlhIGlvY3RsKFRJT0NMSU5VWCkgYW5kIHRocm91Z2ggc2V0X3NlbGVjdGlvbiAqLworaW50IG1vdXNlX3JlcG9ydGluZyh2b2lkKQoreworCXJldHVybiB2Y19jb25zW2ZnX2NvbnNvbGVdLmQtPnZjX3JlcG9ydF9tb3VzZTsKK30KKworLyogY29uc29sZV9zZW0gaXMgaGVsZCAqLworc3RhdGljIHZvaWQgc2V0X21vZGUoc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgb25fb2ZmKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8PSB2Yy0+dmNfbnBhcjsgaSsrKQorCQlpZiAodmMtPnZjX3F1ZXMpIHsKKwkJCXN3aXRjaCh2Yy0+dmNfcGFyW2ldKSB7CS8qIERFQyBwcml2YXRlIG1vZGVzIHNldC9yZXNldCAqLworCQkJY2FzZSAxOgkJCS8qIEN1cnNvciBrZXlzIHNlbmQgXltPeC9eW1t4ICovCisJCQkJaWYgKG9uX29mZikKKwkJCQkJc2V0X2tiZCh2YywgZGVjY2ttKTsKKwkJCQllbHNlCisJCQkJCWNscl9rYmQodmMsIGRlY2NrbSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CS8qIDgwLzEzMiBtb2RlIHN3aXRjaCB1bmltcGxlbWVudGVkICovCisJCQkJdmMtPnZjX2RlY2NvbG0gPSBvbl9vZmY7CisjaWYgMAorCQkJCXZjX3Jlc2l6ZShkZWNjb2xtID8gMTMyIDogODAsIHZjLT52Y19yb3dzKTsKKwkJCQkvKiB0aGlzIGFsb25lIGRvZXMgbm90IHN1ZmZpY2U7IHNvbWUgdXNlciBtb2RlCisJCQkJICAgdXRpbGl0eSBoYXMgdG8gY2hhbmdlIHRoZSBoYXJkd2FyZSByZWdzICovCisjZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgNToJCQkvKiBJbnZlcnRlZCBzY3JlZW4gb24vb2ZmICovCisJCQkJaWYgKHZjLT52Y19kZWNzY25tICE9IG9uX29mZikgeworCQkJCQl2Yy0+dmNfZGVjc2NubSA9IG9uX29mZjsKKwkJCQkJaW52ZXJ0X3NjcmVlbih2YywgMCwgdmMtPnZjX3NjcmVlbmJ1Zl9zaXplLCAwKTsKKwkJCQkJdXBkYXRlX2F0dHIodmMpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNjoJCQkvKiBPcmlnaW4gcmVsYXRpdmUvYWJzb2x1dGUgKi8KKwkJCQl2Yy0+dmNfZGVjb20gPSBvbl9vZmY7CisJCQkJZ290b3hheSh2YywgMCwgMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDc6CQkJLyogQXV0b3dyYXAgb24vb2ZmICovCisJCQkJdmMtPnZjX2RlY2F3bSA9IG9uX29mZjsKKwkJCQlicmVhazsKKwkJCWNhc2UgODoJCQkvKiBBdXRvcmVwZWF0IG9uL29mZiAqLworCQkJCWlmIChvbl9vZmYpCisJCQkJCXNldF9rYmQodmMsIGRlY2FybSk7CisJCQkJZWxzZQorCQkJCQljbHJfa2JkKHZjLCBkZWNhcm0pOworCQkJCWJyZWFrOworCQkJY2FzZSA5OgorCQkJCXZjLT52Y19yZXBvcnRfbW91c2UgPSBvbl9vZmYgPyAxIDogMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjU6CQkvKiBDdXJzb3Igb24vb2ZmICovCisJCQkJdmMtPnZjX2RlY2NtID0gb25fb2ZmOworCQkJCWJyZWFrOworCQkJY2FzZSAxMDAwOgorCQkJCXZjLT52Y19yZXBvcnRfbW91c2UgPSBvbl9vZmYgPyAyIDogMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCh2Yy0+dmNfcGFyW2ldKSB7CS8qIEFOU0kgbW9kZXMgc2V0L3Jlc2V0ICovCisJCQljYXNlIDM6CQkJLyogTW9uaXRvciAoZGlzcGxheSBjdHJscykgKi8KKwkJCQl2Yy0+dmNfZGlzcF9jdHJsID0gb25fb2ZmOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgkJCS8qIEluc2VydCBNb2RlIG9uL29mZiAqLworCQkJCXZjLT52Y19kZWNpbSA9IG9uX29mZjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjA6CQkvKiBMZiwgRW50ZXIgPT0gQ3JMZi9MZiAqLworCQkJCWlmIChvbl9vZmYpCisJCQkJCXNldF9rYmQodmMsIGxubSk7CisJCQkJZWxzZQorCQkJCQljbHJfa2JkKHZjLCBsbm0pOworCQkJCWJyZWFrOworCQkJfQorCQl9Cit9CisKKy8qIGNvbnNvbGVfc2VtIGlzIGhlbGQgKi8KK3N0YXRpYyB2b2lkIHNldHRlcm1fY29tbWFuZChzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJc3dpdGNoKHZjLT52Y19wYXJbMF0pIHsKKwkJY2FzZSAxOgkvKiBzZXQgY29sb3IgZm9yIHVuZGVybGluZSBtb2RlICovCisJCQlpZiAodmMtPnZjX2Nhbl9kb19jb2xvciAmJgorCQkJCQl2Yy0+dmNfcGFyWzFdIDwgMTYpIHsKKwkJCQl2Yy0+dmNfdWxjb2xvciA9IGNvbG9yX3RhYmxlW3ZjLT52Y19wYXJbMV1dOworCQkJCWlmICh2Yy0+dmNfdW5kZXJsaW5lKQorCQkJCQl1cGRhdGVfYXR0cih2Yyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgkvKiBzZXQgY29sb3IgZm9yIGhhbGYgaW50ZW5zaXR5IG1vZGUgKi8KKwkJCWlmICh2Yy0+dmNfY2FuX2RvX2NvbG9yICYmCisJCQkJCXZjLT52Y19wYXJbMV0gPCAxNikgeworCQkJCXZjLT52Y19oYWxmY29sb3IgPSBjb2xvcl90YWJsZVt2Yy0+dmNfcGFyWzFdXTsKKwkJCQlpZiAodmMtPnZjX2ludGVuc2l0eSA9PSAwKQorCQkJCQl1cGRhdGVfYXR0cih2Yyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSA4OgkvKiBzdG9yZSBjb2xvcnMgYXMgZGVmYXVsdHMgKi8KKwkJCXZjLT52Y19kZWZfY29sb3IgPSB2Yy0+dmNfYXR0cjsKKwkJCWlmICh2Yy0+dmNfaGlfZm9udF9tYXNrID09IDB4MTAwKQorCQkJCXZjLT52Y19kZWZfY29sb3IgPj49IDE7CisJCQlkZWZhdWx0X2F0dHIodmMpOworCQkJdXBkYXRlX2F0dHIodmMpOworCQkJYnJlYWs7CisJCWNhc2UgOToJLyogc2V0IGJsYW5raW5nIGludGVydmFsICovCisJCQlibGFua2ludGVydmFsID0gKCh2Yy0+dmNfcGFyWzFdIDwgNjApID8gdmMtPnZjX3BhclsxXSA6IDYwKSAqIDYwICogSFo7CisJCQlwb2tlX2JsYW5rZWRfY29uc29sZSgpOworCQkJYnJlYWs7CisJCWNhc2UgMTA6IC8qIHNldCBiZWxsIGZyZXF1ZW5jeSBpbiBIeiAqLworCQkJaWYgKHZjLT52Y19ucGFyID49IDEpCisJCQkJdmMtPnZjX2JlbGxfcGl0Y2ggPSB2Yy0+dmNfcGFyWzFdOworCQkJZWxzZQorCQkJCXZjLT52Y19iZWxsX3BpdGNoID0gREVGQVVMVF9CRUxMX1BJVENIOworCQkJYnJlYWs7CisJCWNhc2UgMTE6IC8qIHNldCBiZWxsIGR1cmF0aW9uIGluIG1zZWMgKi8KKwkJCWlmICh2Yy0+dmNfbnBhciA+PSAxKQorCQkJCXZjLT52Y19iZWxsX2R1cmF0aW9uID0gKHZjLT52Y19wYXJbMV0gPCAyMDAwKSA/CisJCQkJCXZjLT52Y19wYXJbMV0gKiBIWiAvIDEwMDAgOiAwOworCQkJZWxzZQorCQkJCXZjLT52Y19iZWxsX2R1cmF0aW9uID0gREVGQVVMVF9CRUxMX0RVUkFUSU9OOworCQkJYnJlYWs7CisJCWNhc2UgMTI6IC8qIGJyaW5nIHNwZWNpZmllZCBjb25zb2xlIHRvIHRoZSBmcm9udCAqLworCQkJaWYgKHZjLT52Y19wYXJbMV0gPj0gMSAmJiB2Y19jb25zX2FsbG9jYXRlZCh2Yy0+dmNfcGFyWzFdIC0gMSkpCisJCQkJc2V0X2NvbnNvbGUodmMtPnZjX3BhclsxXSAtIDEpOworCQkJYnJlYWs7CisJCWNhc2UgMTM6IC8qIHVuYmxhbmsgdGhlIHNjcmVlbiAqLworCQkJcG9rZV9ibGFua2VkX2NvbnNvbGUoKTsKKwkJCWJyZWFrOworCQljYXNlIDE0OiAvKiBzZXQgdmVzYSBwb3dlcmRvd24gaW50ZXJ2YWwgKi8KKwkJCXZlc2Ffb2ZmX2ludGVydmFsID0gKCh2Yy0+dmNfcGFyWzFdIDwgNjApID8gdmMtPnZjX3BhclsxXSA6IDYwKSAqIDYwICogSFo7CisJCQlicmVhazsKKwkJY2FzZSAxNTogLyogYWN0aXZhdGUgdGhlIHByZXZpb3VzIGNvbnNvbGUgKi8KKwkJCXNldF9jb25zb2xlKGxhc3RfY29uc29sZSk7CisJCQlicmVhazsKKwl9Cit9CisKKy8qIGNvbnNvbGVfc2VtIGlzIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGNzaV9hdChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGludCBucikKK3sKKwlpZiAobnIgPiB2Yy0+dmNfY29scyAtIHZjLT52Y194KQorCQluciA9IHZjLT52Y19jb2xzIC0gdmMtPnZjX3g7CisJZWxzZSBpZiAoIW5yKQorCQluciA9IDE7CisJaW5zZXJ0X2NoYXIodmMsIG5yKTsKK30KKworLyogY29uc29sZV9zZW0gaXMgaGVsZCAqLworc3RhdGljIHZvaWQgY3NpX0woc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBpbnQgbnIpCit7CisJaWYgKG5yID4gdmMtPnZjX3Jvd3MgLSB2Yy0+dmNfeSkKKwkJbnIgPSB2Yy0+dmNfcm93cyAtIHZjLT52Y195OworCWVsc2UgaWYgKCFucikKKwkJbnIgPSAxOworCXNjcmRvd24odmMsIHZjLT52Y195LCB2Yy0+dmNfYm90dG9tLCBucik7CisJdmMtPnZjX25lZWRfd3JhcCA9IDA7Cit9CisKKy8qIGNvbnNvbGVfc2VtIGlzIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGNzaV9QKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IG5yKQoreworCWlmIChuciA+IHZjLT52Y19jb2xzIC0gdmMtPnZjX3gpCisJCW5yID0gdmMtPnZjX2NvbHMgLSB2Yy0+dmNfeDsKKwllbHNlIGlmICghbnIpCisJCW5yID0gMTsKKwlkZWxldGVfY2hhcih2YywgbnIpOworfQorCisvKiBjb25zb2xlX3NlbSBpcyBoZWxkICovCitzdGF0aWMgdm9pZCBjc2lfTShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGludCBucikKK3sKKwlpZiAobnIgPiB2Yy0+dmNfcm93cyAtIHZjLT52Y195KQorCQluciA9IHZjLT52Y19yb3dzIC0gdmMtPnZjX3k7CisJZWxzZSBpZiAoIW5yKQorCQlucj0xOworCXNjcnVwKHZjLCB2Yy0+dmNfeSwgdmMtPnZjX2JvdHRvbSwgbnIpOworCXZjLT52Y19uZWVkX3dyYXAgPSAwOworfQorCisvKiBjb25zb2xlX3NlbSBpcyBoZWxkIChleGNlcHQgdmlhIHZjX2luaXQtPnJlc2V0X3Rlcm1pbmFsICovCitzdGF0aWMgdm9pZCBzYXZlX2N1cihzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJdmMtPnZjX3NhdmVkX3gJCT0gdmMtPnZjX3g7CisJdmMtPnZjX3NhdmVkX3kJCT0gdmMtPnZjX3k7CisJdmMtPnZjX3NfaW50ZW5zaXR5CT0gdmMtPnZjX2ludGVuc2l0eTsKKwl2Yy0+dmNfc191bmRlcmxpbmUJPSB2Yy0+dmNfdW5kZXJsaW5lOworCXZjLT52Y19zX2JsaW5rCQk9IHZjLT52Y19ibGluazsKKwl2Yy0+dmNfc19yZXZlcnNlCT0gdmMtPnZjX3JldmVyc2U7CisJdmMtPnZjX3NfY2hhcnNldAk9IHZjLT52Y19jaGFyc2V0OworCXZjLT52Y19zX2NvbG9yCQk9IHZjLT52Y19jb2xvcjsKKwl2Yy0+dmNfc2F2ZWRfRzAJCT0gdmMtPnZjX0cwX2NoYXJzZXQ7CisJdmMtPnZjX3NhdmVkX0cxCQk9IHZjLT52Y19HMV9jaGFyc2V0OworfQorCisvKiBjb25zb2xlX3NlbSBpcyBoZWxkICovCitzdGF0aWMgdm9pZCByZXN0b3JlX2N1cihzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJZ290b3h5KHZjLCB2Yy0+dmNfc2F2ZWRfeCwgdmMtPnZjX3NhdmVkX3kpOworCXZjLT52Y19pbnRlbnNpdHkJPSB2Yy0+dmNfc19pbnRlbnNpdHk7CisJdmMtPnZjX3VuZGVybGluZQk9IHZjLT52Y19zX3VuZGVybGluZTsKKwl2Yy0+dmNfYmxpbmsJCT0gdmMtPnZjX3NfYmxpbms7CisJdmMtPnZjX3JldmVyc2UJCT0gdmMtPnZjX3NfcmV2ZXJzZTsKKwl2Yy0+dmNfY2hhcnNldAkJPSB2Yy0+dmNfc19jaGFyc2V0OworCXZjLT52Y19jb2xvcgkJPSB2Yy0+dmNfc19jb2xvcjsKKwl2Yy0+dmNfRzBfY2hhcnNldAk9IHZjLT52Y19zYXZlZF9HMDsKKwl2Yy0+dmNfRzFfY2hhcnNldAk9IHZjLT52Y19zYXZlZF9HMTsKKwl2Yy0+dmNfdHJhbnNsYXRlCT0gc2V0X3RyYW5zbGF0ZSh2Yy0+dmNfY2hhcnNldCA/IHZjLT52Y19HMV9jaGFyc2V0IDogdmMtPnZjX0cwX2NoYXJzZXQsIHZjKTsKKwl1cGRhdGVfYXR0cih2Yyk7CisJdmMtPnZjX25lZWRfd3JhcCA9IDA7Cit9CisKK2VudW0geyBFU25vcm1hbCwgRVNlc2MsIEVTc3F1YXJlLCBFU2dldHBhcnMsIEVTZ290cGFycywgRVNmdW5ja2V5LAorCUVTaGFzaCwgRVNzZXRHMCwgRVNzZXRHMSwgRVNwZXJjZW50LCBFU2lnbm9yZSwgRVNub25zdGQsCisJRVNwYWxldHRlIH07CisKKy8qIGNvbnNvbGVfc2VtIGlzIGhlbGQgKGV4Y2VwdCB2aWEgdmNfaW5pdCgpKSAqLworc3RhdGljIHZvaWQgcmVzZXRfdGVybWluYWwoc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgZG9fY2xlYXIpCit7CisJdmMtPnZjX3RvcAkJPSAwOworCXZjLT52Y19ib3R0b20JCT0gdmMtPnZjX3Jvd3M7CisJdmMtPnZjX3N0YXRlCQk9IEVTbm9ybWFsOworCXZjLT52Y19xdWVzCQk9IDA7CisJdmMtPnZjX3RyYW5zbGF0ZQk9IHNldF90cmFuc2xhdGUoTEFUMV9NQVAsIHZjKTsKKwl2Yy0+dmNfRzBfY2hhcnNldAk9IExBVDFfTUFQOworCXZjLT52Y19HMV9jaGFyc2V0CT0gR1JBRl9NQVA7CisJdmMtPnZjX2NoYXJzZXQJCT0gMDsKKwl2Yy0+dmNfbmVlZF93cmFwCT0gMDsKKwl2Yy0+dmNfcmVwb3J0X21vdXNlCT0gMDsKKwl2Yy0+dmNfdXRmCQk9IDA7CisJdmMtPnZjX3V0Zl9jb3VudAk9IDA7CisKKwl2Yy0+dmNfZGlzcF9jdHJsCT0gMDsKKwl2Yy0+dmNfdG9nZ2xlX21ldGEJPSAwOworCisJdmMtPnZjX2RlY3Njbm0JCT0gMDsKKwl2Yy0+dmNfZGVjb20JCT0gMDsKKwl2Yy0+dmNfZGVjYXdtCQk9IDE7CisJdmMtPnZjX2RlY2NtCQk9IDE7CisJdmMtPnZjX2RlY2ltCQk9IDA7CisKKwlzZXRfa2JkKHZjLCBkZWNhcm0pOworCWNscl9rYmQodmMsIGRlY2NrbSk7CisJY2xyX2tiZCh2Yywga2JkYXBwbGljKTsKKwljbHJfa2JkKHZjLCBsbm0pOworCWtiZF90YWJsZVt2Yy0+dmNfbnVtXS5sb2Nrc3RhdGUgPSAwOworCWtiZF90YWJsZVt2Yy0+dmNfbnVtXS5zbG9ja3N0YXRlID0gMDsKKwlrYmRfdGFibGVbdmMtPnZjX251bV0ubGVkbW9kZSA9IExFRF9TSE9XX0ZMQUdTOworCWtiZF90YWJsZVt2Yy0+dmNfbnVtXS5sZWRmbGFnc3RhdGUgPSBrYmRfdGFibGVbdmMtPnZjX251bV0uZGVmYXVsdF9sZWRmbGFnc3RhdGU7CisJLyogZG8gbm90IGRvIHNldF9sZWRzIGhlcmUgYmVjYXVzZSB0aGlzIGNhdXNlcyBhbiBlbmRsZXNzIHRhc2tsZXQgbG9vcAorCSAgIHdoZW4gdGhlIGtleWJvYXJkIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldCAqLworCisJdmMtPnZjX2N1cnNvcl90eXBlID0gQ1VSX0RFRkFVTFQ7CisJdmMtPnZjX2NvbXBsZW1lbnRfbWFzayA9IHZjLT52Y19zX2NvbXBsZW1lbnRfbWFzazsKKworCWRlZmF1bHRfYXR0cih2Yyk7CisJdXBkYXRlX2F0dHIodmMpOworCisJdmMtPnZjX3RhYl9zdG9wWzBdCT0gMHgwMTAxMDEwMDsKKwl2Yy0+dmNfdGFiX3N0b3BbMV0JPQorCXZjLT52Y190YWJfc3RvcFsyXQk9CisJdmMtPnZjX3RhYl9zdG9wWzNdCT0KKwl2Yy0+dmNfdGFiX3N0b3BbNF0JPSAweDAxMDEwMTAxOworCisJdmMtPnZjX2JlbGxfcGl0Y2ggPSBERUZBVUxUX0JFTExfUElUQ0g7CisJdmMtPnZjX2JlbGxfZHVyYXRpb24gPSBERUZBVUxUX0JFTExfRFVSQVRJT047CisKKwlnb3RveHkodmMsIDAsIDApOworCXNhdmVfY3VyKHZjKTsKKwlpZiAoZG9fY2xlYXIpCisJICAgIGNzaV9KKHZjLCAyKTsKK30KKworLyogY29uc29sZV9zZW0gaXMgaGVsZCAqLworc3RhdGljIHZvaWQgZG9fY29uX3Ryb2woc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHZjX2RhdGEgKnZjLCBpbnQgYykKK3sKKwkvKgorCSAqICBDb250cm9sIGNoYXJhY3RlcnMgY2FuIGJlIHVzZWQgaW4gdGhlIF9taWRkbGVfCisJICogIG9mIGFuIGVzY2FwZSBzZXF1ZW5jZS4KKwkgKi8KKwlzd2l0Y2ggKGMpIHsKKwljYXNlIDA6CisJCXJldHVybjsKKwljYXNlIDc6CisJCWlmICh2Yy0+dmNfYmVsbF9kdXJhdGlvbikKKwkJCWtkX21rc291bmQodmMtPnZjX2JlbGxfcGl0Y2gsIHZjLT52Y19iZWxsX2R1cmF0aW9uKTsKKwkJcmV0dXJuOworCWNhc2UgODoKKwkJYnModmMpOworCQlyZXR1cm47CisJY2FzZSA5OgorCQl2Yy0+dmNfcG9zIC09ICh2Yy0+dmNfeCA8PCAxKTsKKwkJd2hpbGUgKHZjLT52Y194IDwgdmMtPnZjX2NvbHMgLSAxKSB7CisJCQl2Yy0+dmNfeCsrOworCQkJaWYgKHZjLT52Y190YWJfc3RvcFt2Yy0+dmNfeCA+PiA1XSAmICgxIDw8ICh2Yy0+dmNfeCAmIDMxKSkpCisJCQkJYnJlYWs7CisJCX0KKwkJdmMtPnZjX3BvcyArPSAodmMtPnZjX3ggPDwgMSk7CisJCXJldHVybjsKKwljYXNlIDEwOiBjYXNlIDExOiBjYXNlIDEyOgorCQlsZih2Yyk7CisJCWlmICghaXNfa2JkKHZjLCBsbm0pKQorCQkJcmV0dXJuOworCWNhc2UgMTM6CisJCWNyKHZjKTsKKwkJcmV0dXJuOworCWNhc2UgMTQ6CisJCXZjLT52Y19jaGFyc2V0ID0gMTsKKwkJdmMtPnZjX3RyYW5zbGF0ZSA9IHNldF90cmFuc2xhdGUodmMtPnZjX0cxX2NoYXJzZXQsIHZjKTsKKwkJdmMtPnZjX2Rpc3BfY3RybCA9IDE7CisJCXJldHVybjsKKwljYXNlIDE1OgorCQl2Yy0+dmNfY2hhcnNldCA9IDA7CisJCXZjLT52Y190cmFuc2xhdGUgPSBzZXRfdHJhbnNsYXRlKHZjLT52Y19HMF9jaGFyc2V0LCB2Yyk7CisJCXZjLT52Y19kaXNwX2N0cmwgPSAwOworCQlyZXR1cm47CisJY2FzZSAyNDogY2FzZSAyNjoKKwkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CisJCXJldHVybjsKKwljYXNlIDI3OgorCQl2Yy0+dmNfc3RhdGUgPSBFU2VzYzsKKwkJcmV0dXJuOworCWNhc2UgMTI3OgorCQlkZWwodmMpOworCQlyZXR1cm47CisJY2FzZSAxMjgrMjc6CisJCXZjLT52Y19zdGF0ZSA9IEVTc3F1YXJlOworCQlyZXR1cm47CisJfQorCXN3aXRjaCh2Yy0+dmNfc3RhdGUpIHsKKwljYXNlIEVTZXNjOgorCQl2Yy0+dmNfc3RhdGUgPSBFU25vcm1hbDsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ1snOgorCQkJdmMtPnZjX3N0YXRlID0gRVNzcXVhcmU7CisJCQlyZXR1cm47CisJCWNhc2UgJ10nOgorCQkJdmMtPnZjX3N0YXRlID0gRVNub25zdGQ7CisJCQlyZXR1cm47CisJCWNhc2UgJyUnOgorCQkJdmMtPnZjX3N0YXRlID0gRVNwZXJjZW50OworCQkJcmV0dXJuOworCQljYXNlICdFJzoKKwkJCWNyKHZjKTsKKwkJCWxmKHZjKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnTSc6CisJCQlyaSh2Yyk7CisJCQlyZXR1cm47CisJCWNhc2UgJ0QnOgorCQkJbGYodmMpOworCQkJcmV0dXJuOworCQljYXNlICdIJzoKKwkJCXZjLT52Y190YWJfc3RvcFt2Yy0+dmNfeCA+PiA1XSB8PSAoMSA8PCAodmMtPnZjX3ggJiAzMSkpOworCQkJcmV0dXJuOworCQljYXNlICdaJzoKKwkJCXJlc3BvbmRfSUQodHR5KTsKKwkJCXJldHVybjsKKwkJY2FzZSAnNyc6CisJCQlzYXZlX2N1cih2Yyk7CisJCQlyZXR1cm47CisJCWNhc2UgJzgnOgorCQkJcmVzdG9yZV9jdXIodmMpOworCQkJcmV0dXJuOworCQljYXNlICcoJzoKKwkJCXZjLT52Y19zdGF0ZSA9IEVTc2V0RzA7CisJCQlyZXR1cm47CisJCWNhc2UgJyknOgorCQkJdmMtPnZjX3N0YXRlID0gRVNzZXRHMTsKKwkJCXJldHVybjsKKwkJY2FzZSAnIyc6CisJCQl2Yy0+dmNfc3RhdGUgPSBFU2hhc2g7CisJCQlyZXR1cm47CisJCWNhc2UgJ2MnOgorCQkJcmVzZXRfdGVybWluYWwodmMsIDEpOworCQkJcmV0dXJuOworCQljYXNlICc+JzogIC8qIE51bWVyaWMga2V5cGFkICovCisJCQljbHJfa2JkKHZjLCBrYmRhcHBsaWMpOworCQkJcmV0dXJuOworCQljYXNlICc9JzogIC8qIEFwcGwuIGtleXBhZCAqLworCQkJc2V0X2tiZCh2Yywga2JkYXBwbGljKTsKKwkJCXJldHVybjsKKwkJfQorCQlyZXR1cm47CisJY2FzZSBFU25vbnN0ZDoKKwkJaWYgKGM9PSdQJykgeyAgIC8qIHBhbGV0dGUgZXNjYXBlIHNlcXVlbmNlICovCisJCQlmb3IgKHZjLT52Y19ucGFyID0gMDsgdmMtPnZjX25wYXIgPCBOUEFSOyB2Yy0+dmNfbnBhcisrKQorCQkJCXZjLT52Y19wYXJbdmMtPnZjX25wYXJdID0gMDsKKwkJCXZjLT52Y19ucGFyID0gMDsKKwkJCXZjLT52Y19zdGF0ZSA9IEVTcGFsZXR0ZTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChjPT0nUicpIHsgICAvKiByZXNldCBwYWxldHRlICovCisJCQlyZXNldF9wYWxldHRlKHZjKTsKKwkJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOworCQl9IGVsc2UKKwkJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOworCQlyZXR1cm47CisJY2FzZSBFU3BhbGV0dGU6CisJCWlmICggKGM+PScwJyYmYzw9JzknKSB8fCAoYz49J0EnJiZjPD0nRicpIHx8IChjPj0nYScmJmM8PSdmJykgKSB7CisJCQl2Yy0+dmNfcGFyW3ZjLT52Y19ucGFyKytdID0gKGMgPiAnOScgPyAoYyAmIDB4REYpIC0gJ0EnICsgMTAgOiBjIC0gJzAnKTsKKwkJCWlmICh2Yy0+dmNfbnBhciA9PSA3KSB7CisJCQkJaW50IGkgPSB2Yy0+dmNfcGFyWzBdICogMywgaiA9IDE7CisJCQkJdmMtPnZjX3BhbGV0dGVbaV0gPSAxNiAqIHZjLT52Y19wYXJbaisrXTsKKwkJCQl2Yy0+dmNfcGFsZXR0ZVtpKytdICs9IHZjLT52Y19wYXJbaisrXTsKKwkJCQl2Yy0+dmNfcGFsZXR0ZVtpXSA9IDE2ICogdmMtPnZjX3BhcltqKytdOworCQkJCXZjLT52Y19wYWxldHRlW2krK10gKz0gdmMtPnZjX3BhcltqKytdOworCQkJCXZjLT52Y19wYWxldHRlW2ldID0gMTYgKiB2Yy0+dmNfcGFyW2orK107CisJCQkJdmMtPnZjX3BhbGV0dGVbaV0gKz0gdmMtPnZjX3BhcltqXTsKKwkJCQlzZXRfcGFsZXR0ZSh2Yyk7CisJCQkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CisJCQl9CisJCX0gZWxzZQorCQkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CisJCXJldHVybjsKKwljYXNlIEVTc3F1YXJlOgorCQlmb3IgKHZjLT52Y19ucGFyID0gMDsgdmMtPnZjX25wYXIgPCBOUEFSOyB2Yy0+dmNfbnBhcisrKQorCQkJdmMtPnZjX3Bhclt2Yy0+dmNfbnBhcl0gPSAwOworCQl2Yy0+dmNfbnBhciA9IDA7CisJCXZjLT52Y19zdGF0ZSA9IEVTZ2V0cGFyczsKKwkJaWYgKGMgPT0gJ1snKSB7IC8qIEZ1bmN0aW9uIGtleSAqLworCQkJdmMtPnZjX3N0YXRlPUVTZnVuY2tleTsKKwkJCXJldHVybjsKKwkJfQorCQl2Yy0+dmNfcXVlcyA9IChjID09ICc/Jyk7CisJCWlmICh2Yy0+dmNfcXVlcykKKwkJCXJldHVybjsKKwljYXNlIEVTZ2V0cGFyczoKKwkJaWYgKGMgPT0gJzsnICYmIHZjLT52Y19ucGFyIDwgTlBBUiAtIDEpIHsKKwkJCXZjLT52Y19ucGFyKys7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoYz49JzAnICYmIGM8PSc5JykgeworCQkJdmMtPnZjX3Bhclt2Yy0+dmNfbnBhcl0gKj0gMTA7CisJCQl2Yy0+dmNfcGFyW3ZjLT52Y19ucGFyXSArPSBjIC0gJzAnOworCQkJcmV0dXJuOworCQl9IGVsc2UKKwkJCXZjLT52Y19zdGF0ZSA9IEVTZ290cGFyczsKKwljYXNlIEVTZ290cGFyczoKKwkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CisJCXN3aXRjaChjKSB7CisJCWNhc2UgJ2gnOgorCQkJc2V0X21vZGUodmMsIDEpOworCQkJcmV0dXJuOworCQljYXNlICdsJzoKKwkJCXNldF9tb2RlKHZjLCAwKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnYyc6CisJCQlpZiAodmMtPnZjX3F1ZXMpIHsKKwkJCQlpZiAodmMtPnZjX3BhclswXSkKKwkJCQkJdmMtPnZjX2N1cnNvcl90eXBlID0gdmMtPnZjX3BhclswXSB8ICh2Yy0+dmNfcGFyWzFdIDw8IDgpIHwgKHZjLT52Y19wYXJbMl0gPDwgMTYpOworCQkJCWVsc2UKKwkJCQkJdmMtPnZjX2N1cnNvcl90eXBlID0gQ1VSX0RFRkFVTFQ7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJaWYgKHZjLT52Y19xdWVzKSB7CisJCQkJY2xlYXJfc2VsZWN0aW9uKCk7CisJCQkJaWYgKHZjLT52Y19wYXJbMF0pCisJCQkJCXZjLT52Y19jb21wbGVtZW50X21hc2sgPSB2Yy0+dmNfcGFyWzBdIDw8IDggfCB2Yy0+dmNfcGFyWzFdOworCQkJCWVsc2UKKwkJCQkJdmMtPnZjX2NvbXBsZW1lbnRfbWFzayA9IHZjLT52Y19zX2NvbXBsZW1lbnRfbWFzazsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlpZiAoIXZjLT52Y19xdWVzKSB7CisJCQkJaWYgKHZjLT52Y19wYXJbMF0gPT0gNSkKKwkJCQkJc3RhdHVzX3JlcG9ydCh0dHkpOworCQkJCWVsc2UgaWYgKHZjLT52Y19wYXJbMF0gPT0gNikKKwkJCQkJY3Vyc29yX3JlcG9ydCh2YywgdHR5KTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQlpZiAodmMtPnZjX3F1ZXMpIHsKKwkJCXZjLT52Y19xdWVzID0gMDsKKwkJCXJldHVybjsKKwkJfQorCQlzd2l0Y2goYykgeworCQljYXNlICdHJzogY2FzZSAnYCc6CisJCQlpZiAodmMtPnZjX3BhclswXSkKKwkJCQl2Yy0+dmNfcGFyWzBdLS07CisJCQlnb3RveHkodmMsIHZjLT52Y19wYXJbMF0sIHZjLT52Y195KTsKKwkJCXJldHVybjsKKwkJY2FzZSAnQSc6CisJCQlpZiAoIXZjLT52Y19wYXJbMF0pCisJCQkJdmMtPnZjX3BhclswXSsrOworCQkJZ290b3h5KHZjLCB2Yy0+dmNfeCwgdmMtPnZjX3kgLSB2Yy0+dmNfcGFyWzBdKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnQic6IGNhc2UgJ2UnOgorCQkJaWYgKCF2Yy0+dmNfcGFyWzBdKQorCQkJCXZjLT52Y19wYXJbMF0rKzsKKwkJCWdvdG94eSh2YywgdmMtPnZjX3gsIHZjLT52Y195ICsgdmMtPnZjX3BhclswXSk7CisJCQlyZXR1cm47CisJCWNhc2UgJ0MnOiBjYXNlICdhJzoKKwkJCWlmICghdmMtPnZjX3BhclswXSkKKwkJCQl2Yy0+dmNfcGFyWzBdKys7CisJCQlnb3RveHkodmMsIHZjLT52Y194ICsgdmMtPnZjX3BhclswXSwgdmMtPnZjX3kpOworCQkJcmV0dXJuOworCQljYXNlICdEJzoKKwkJCWlmICghdmMtPnZjX3BhclswXSkKKwkJCQl2Yy0+dmNfcGFyWzBdKys7CisJCQlnb3RveHkodmMsIHZjLT52Y194IC0gdmMtPnZjX3BhclswXSwgdmMtPnZjX3kpOworCQkJcmV0dXJuOworCQljYXNlICdFJzoKKwkJCWlmICghdmMtPnZjX3BhclswXSkKKwkJCQl2Yy0+dmNfcGFyWzBdKys7CisJCQlnb3RveHkodmMsIDAsIHZjLT52Y195ICsgdmMtPnZjX3BhclswXSk7CisJCQlyZXR1cm47CisJCWNhc2UgJ0YnOgorCQkJaWYgKCF2Yy0+dmNfcGFyWzBdKQorCQkJCXZjLT52Y19wYXJbMF0rKzsKKwkJCWdvdG94eSh2YywgMCwgdmMtPnZjX3kgLSB2Yy0+dmNfcGFyWzBdKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnZCc6CisJCQlpZiAodmMtPnZjX3BhclswXSkKKwkJCQl2Yy0+dmNfcGFyWzBdLS07CisJCQlnb3RveGF5KHZjLCB2Yy0+dmNfeCAsdmMtPnZjX3BhclswXSk7CisJCQlyZXR1cm47CisJCWNhc2UgJ0gnOiBjYXNlICdmJzoKKwkJCWlmICh2Yy0+dmNfcGFyWzBdKQorCQkJCXZjLT52Y19wYXJbMF0tLTsKKwkJCWlmICh2Yy0+dmNfcGFyWzFdKQorCQkJCXZjLT52Y19wYXJbMV0tLTsKKwkJCWdvdG94YXkodmMsIHZjLT52Y19wYXJbMV0sIHZjLT52Y19wYXJbMF0pOworCQkJcmV0dXJuOworCQljYXNlICdKJzoKKwkJCWNzaV9KKHZjLCB2Yy0+dmNfcGFyWzBdKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnSyc6CisJCQljc2lfSyh2YywgdmMtPnZjX3BhclswXSk7CisJCQlyZXR1cm47CisJCWNhc2UgJ0wnOgorCQkJY3NpX0wodmMsIHZjLT52Y19wYXJbMF0pOworCQkJcmV0dXJuOworCQljYXNlICdNJzoKKwkJCWNzaV9NKHZjLCB2Yy0+dmNfcGFyWzBdKTsKKwkJCXJldHVybjsKKwkJY2FzZSAnUCc6CisJCQljc2lfUCh2YywgdmMtPnZjX3BhclswXSk7CisJCQlyZXR1cm47CisJCWNhc2UgJ2MnOgorCQkJaWYgKCF2Yy0+dmNfcGFyWzBdKQorCQkJCXJlc3BvbmRfSUQodHR5KTsKKwkJCXJldHVybjsKKwkJY2FzZSAnZyc6CisJCQlpZiAoIXZjLT52Y19wYXJbMF0pCisJCQkJdmMtPnZjX3RhYl9zdG9wW3ZjLT52Y194ID4+IDVdICY9IH4oMSA8PCAodmMtPnZjX3ggJiAzMSkpOworCQkJZWxzZSBpZiAodmMtPnZjX3BhclswXSA9PSAzKSB7CisJCQkJdmMtPnZjX3RhYl9zdG9wWzBdID0KKwkJCQkJdmMtPnZjX3RhYl9zdG9wWzFdID0KKwkJCQkJdmMtPnZjX3RhYl9zdG9wWzJdID0KKwkJCQkJdmMtPnZjX3RhYl9zdG9wWzNdID0KKwkJCQkJdmMtPnZjX3RhYl9zdG9wWzRdID0gMDsKKwkJCX0KKwkJCXJldHVybjsKKwkJY2FzZSAnbSc6CisJCQljc2lfbSh2Yyk7CisJCQlyZXR1cm47CisJCWNhc2UgJ3EnOiAvKiBERUNMTCAtIGJ1dCBvbmx5IDMgbGVkcyAqLworCQkJLyogbWFwIDAsMSwyLDMgdG8gMCwxLDIsNCAqLworCQkJaWYgKHZjLT52Y19wYXJbMF0gPCA0KQorCQkJCXNldGxlZHN0YXRlKGtiZF90YWJsZSArIHZjLT52Y19udW0sCisJCQkJCSAgICAodmMtPnZjX3BhclswXSA8IDMpID8gdmMtPnZjX3BhclswXSA6IDQpOworCQkJcmV0dXJuOworCQljYXNlICdyJzoKKwkJCWlmICghdmMtPnZjX3BhclswXSkKKwkJCQl2Yy0+dmNfcGFyWzBdKys7CisJCQlpZiAoIXZjLT52Y19wYXJbMV0pCisJCQkJdmMtPnZjX3BhclsxXSA9IHZjLT52Y19yb3dzOworCQkJLyogTWluaW11bSBhbGxvd2VkIHJlZ2lvbiBpcyAyIGxpbmVzICovCisJCQlpZiAodmMtPnZjX3BhclswXSA8IHZjLT52Y19wYXJbMV0gJiYKKwkJCSAgICB2Yy0+dmNfcGFyWzFdIDw9IHZjLT52Y19yb3dzKSB7CisJCQkJdmMtPnZjX3RvcCA9IHZjLT52Y19wYXJbMF0gLSAxOworCQkJCXZjLT52Y19ib3R0b20gPSB2Yy0+dmNfcGFyWzFdOworCQkJCWdvdG94YXkodmMsIDAsIDApOworCQkJfQorCQkJcmV0dXJuOworCQljYXNlICdzJzoKKwkJCXNhdmVfY3VyKHZjKTsKKwkJCXJldHVybjsKKwkJY2FzZSAndSc6CisJCQlyZXN0b3JlX2N1cih2Yyk7CisJCQlyZXR1cm47CisJCWNhc2UgJ1gnOgorCQkJY3NpX1godmMsIHZjLT52Y19wYXJbMF0pOworCQkJcmV0dXJuOworCQljYXNlICdAJzoKKwkJCWNzaV9hdCh2YywgdmMtPnZjX3BhclswXSk7CisJCQlyZXR1cm47CisJCWNhc2UgJ10nOiAvKiBzZXR0ZXJtIGZ1bmN0aW9ucyAqLworCQkJc2V0dGVybV9jb21tYW5kKHZjKTsKKwkJCXJldHVybjsKKwkJfQorCQlyZXR1cm47CisJY2FzZSBFU3BlcmNlbnQ6CisJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnQCc6ICAvKiBkZWZpbmVkIGluIElTTyAyMDIyICovCisJCQl2Yy0+dmNfdXRmID0gMDsKKwkJCXJldHVybjsKKwkJY2FzZSAnRyc6ICAvKiBwcmVsaW0gb2ZmaWNpYWwgZXNjYXBlIGNvZGUgKi8KKwkJY2FzZSAnOCc6ICAvKiByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSAqLworCQkJdmMtPnZjX3V0ZiA9IDE7CisJCQlyZXR1cm47CisJCX0KKwkJcmV0dXJuOworCWNhc2UgRVNmdW5ja2V5OgorCQl2Yy0+dmNfc3RhdGUgPSBFU25vcm1hbDsKKwkJcmV0dXJuOworCWNhc2UgRVNoYXNoOgorCQl2Yy0+dmNfc3RhdGUgPSBFU25vcm1hbDsKKwkJaWYgKGMgPT0gJzgnKSB7CisJCQkvKiBERUMgc2NyZWVuIGFsaWdubWVudCB0ZXN0LiBrbHVkZ2UgOi0pICovCisJCQl2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciA9CisJCQkJKHZjLT52Y192aWRlb19lcmFzZV9jaGFyICYgMHhmZjAwKSB8ICdFJzsKKwkJCWNzaV9KKHZjLCAyKTsKKwkJCXZjLT52Y192aWRlb19lcmFzZV9jaGFyID0KKwkJCQkodmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIgJiAweGZmMDApIHwgJyAnOworCQkJZG9fdXBkYXRlX3JlZ2lvbih2YywgdmMtPnZjX29yaWdpbiwgdmMtPnZjX3NjcmVlbmJ1Zl9zaXplIC8gMik7CisJCX0KKwkJcmV0dXJuOworCWNhc2UgRVNzZXRHMDoKKwkJaWYgKGMgPT0gJzAnKQorCQkJdmMtPnZjX0cwX2NoYXJzZXQgPSBHUkFGX01BUDsKKwkJZWxzZSBpZiAoYyA9PSAnQicpCisJCQl2Yy0+dmNfRzBfY2hhcnNldCA9IExBVDFfTUFQOworCQllbHNlIGlmIChjID09ICdVJykKKwkJCXZjLT52Y19HMF9jaGFyc2V0ID0gSUJNUENfTUFQOworCQllbHNlIGlmIChjID09ICdLJykKKwkJCXZjLT52Y19HMF9jaGFyc2V0ID0gVVNFUl9NQVA7CisJCWlmICh2Yy0+dmNfY2hhcnNldCA9PSAwKQorCQkJdmMtPnZjX3RyYW5zbGF0ZSA9IHNldF90cmFuc2xhdGUodmMtPnZjX0cwX2NoYXJzZXQsIHZjKTsKKwkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CisJCXJldHVybjsKKwljYXNlIEVTc2V0RzE6CisJCWlmIChjID09ICcwJykKKwkJCXZjLT52Y19HMV9jaGFyc2V0ID0gR1JBRl9NQVA7CisJCWVsc2UgaWYgKGMgPT0gJ0InKQorCQkJdmMtPnZjX0cxX2NoYXJzZXQgPSBMQVQxX01BUDsKKwkJZWxzZSBpZiAoYyA9PSAnVScpCisJCQl2Yy0+dmNfRzFfY2hhcnNldCA9IElCTVBDX01BUDsKKwkJZWxzZSBpZiAoYyA9PSAnSycpCisJCQl2Yy0+dmNfRzFfY2hhcnNldCA9IFVTRVJfTUFQOworCQlpZiAodmMtPnZjX2NoYXJzZXQgPT0gMSkKKwkJCXZjLT52Y190cmFuc2xhdGUgPSBzZXRfdHJhbnNsYXRlKHZjLT52Y19HMV9jaGFyc2V0LCB2Yyk7CisJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CisJfQorfQorCisvKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIHRvIHByZXBhcmUgYSB0dHkgY29uc29sZSB3cml0ZQorICogc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGF2b2lkIHRvdWNoaW5nIHVzZXIgc3BhY2Ugd2hpbGUgaG9sZGluZyB0aGUKKyAqIGNvbnNvbGUgc3BpbmxvY2suICBJdCBpcyBhbGxvY2F0ZWQgaW4gY29uX2luaXQgYW5kIGlzIHNoYXJlZCBieQorICogdGhpcyBjb2RlIGFuZCB0aGUgdmNfc2NyZWVuIHJlYWQvd3JpdGUgdHR5IGNhbGxzLgorICoKKyAqIFdlIGhhdmUgdG8gYWxsb2NhdGUgdGhpcyBzdGF0aWNhbGx5IGluIHRoZSBrZXJuZWwgZGF0YSBzZWN0aW9uCisgKiBzaW5jZSBjb25zb2xlX2luaXQgKGFuZCB0aHVzIGNvbl9pbml0KSBhcmUgY2FsbGVkIGJlZm9yZSBhbnkKKyAqIGtlcm5lbCBtZW1vcnkgYWxsb2NhdGlvbiBpcyBhdmFpbGFibGUuCisgKi8KK2NoYXIgY29uX2J1ZltDT05fQlVGX1NJWkVdOworREVDTEFSRV9NVVRFWChjb25fYnVmX3NlbSk7CisKKy8qIGFjcXVpcmVzIGNvbnNvbGVfc2VtICovCitzdGF0aWMgaW50IGRvX2Nvbl93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKyNpZmRlZiBWVF9CVUZfVlJBTV9PTkxZCisjZGVmaW5lIEZMVVNIIGRvIHsgfSB3aGlsZSgwKTsKKyNlbHNlCisjZGVmaW5lIEZMVVNIIGlmIChkcmF3X3ggPj0gMCkgeyBcCisJdmMtPnZjX3N3LT5jb25fcHV0Y3ModmMsICh1MTYgKilkcmF3X2Zyb20sICh1MTYgKilkcmF3X3RvIC0gKHUxNiAqKWRyYXdfZnJvbSwgdmMtPnZjX3ksIGRyYXdfeCk7IFwKKwlkcmF3X3ggPSAtMTsgXAorCX0KKyNlbmRpZgorCisJaW50IGMsIHRjLCBvaywgbiA9IDAsIGRyYXdfeCA9IC0xOworCXVuc2lnbmVkIGludCBjdXJyY29uczsKKwl1bnNpZ25lZCBsb25nIGRyYXdfZnJvbSA9IDAsIGRyYXdfdG8gPSAwOworCXN0cnVjdCB2Y19kYXRhICp2YzsKKwl1MTYgaGltYXNrLCBjaGFybWFzazsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpvcmlnX2J1ZiA9IE5VTEw7CisJaW50IG9yaWdfY291bnQ7CisKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCXJldHVybiBjb3VudDsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJdmMgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICh2YyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAidnQ6IGFyZ2gsIGRyaXZlcl9kYXRhIGlzIE5VTEwgIVxuIik7CisJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY3VycmNvbnMgPSB2Yy0+dmNfbnVtOworCWlmICghdmNfY29uc19hbGxvY2F0ZWQoY3VycmNvbnMpKSB7CisJICAgIC8qIGNvdWxkIHRoaXMgaGFwcGVuPyAqLworCSAgICBzdGF0aWMgaW50IGVycm9yID0gMDsKKwkgICAgaWYgKCFlcnJvcikgeworCQllcnJvciA9IDE7CisJCXByaW50aygiY29uX3dyaXRlOiB0dHkgJWQgbm90IGFsbG9jYXRlZFxuIiwgY3VycmNvbnMrMSk7CisJICAgIH0KKwkgICAgcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCSAgICByZXR1cm4gMDsKKwl9CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCisJb3JpZ19idWYgPSBidWY7CisJb3JpZ19jb3VudCA9IGNvdW50OworCisJLyogQXQgdGhpcyBwb2ludCAnYnVmJyBpcyBndWFyYW50ZWVkIHRvIGJlIGEga2VybmVsIGJ1ZmZlcgorCSAqIGFuZCB0aGVyZWZvcmUgbm8gYWNjZXNzIHRvIHVzZXJzcGFjZSAoYW5kIHRoZXJlZm9yZSBzbGVlcGluZykKKwkgKiB3aWxsIGJlIG5lZWRlZC4gIFRoZSBjb25fYnVmX3NlbSBzZXJpYWxpemVzIGFsbCB0dHkgYmFzZWQKKwkgKiBjb25zb2xlIHJlbmRlcmluZyBhbmQgdmNzIHdyaXRlL3JlYWQgb3BlcmF0aW9ucy4gIFdlIGhvbGQKKwkgKiB0aGUgY29uc29sZSBzcGlubG9jayBkdXJpbmcgdGhlIGVudGlyZSB3cml0ZS4KKwkgKi8KKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKworCXZjID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAodmMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInZ0OiBhcmdoLCBkcml2ZXJfZGF0YSBfYmVjYW1lXyBOVUxMICFcbiIpOworCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCWdvdG8gb3V0OworCX0KKworCWhpbWFzayA9IHZjLT52Y19oaV9mb250X21hc2s7CisJY2hhcm1hc2sgPSBoaW1hc2sgPyAweDFmZiA6IDB4ZmY7CisKKwkvKiB1bmRyYXcgY3Vyc29yIGZpcnN0ICovCisJaWYgKElTX0ZHKHZjKSkKKwkJaGlkZV9jdXJzb3IodmMpOworCisJd2hpbGUgKCF0dHktPnN0b3BwZWQgJiYgY291bnQpIHsKKwkJaW50IG9yaWcgPSAqYnVmOworCQljID0gb3JpZzsKKwkJYnVmKys7CisJCW4rKzsKKwkJY291bnQtLTsKKworCQkvKiBEbyBubyB0cmFuc2xhdGlvbiBhdCBhbGwgaW4gY29udHJvbCBzdGF0ZXMgKi8KKwkJaWYgKHZjLT52Y19zdGF0ZSAhPSBFU25vcm1hbCkgeworCQkJdGMgPSBjOworCQl9IGVsc2UgaWYgKHZjLT52Y191dGYpIHsKKwkJICAgIC8qIENvbWJpbmUgVVRGLTggaW50byBVbmljb2RlICovCisJCSAgICAvKiBJbmNvbXBsZXRlIGNoYXJhY3RlcnMgc2lsZW50bHkgaWdub3JlZCAqLworCQkgICAgaWYoYyA+IDB4N2YpIHsKKwkJCWlmICh2Yy0+dmNfdXRmX2NvdW50ID4gMCAmJiAoYyAmIDB4YzApID09IDB4ODApIHsKKwkJCQl2Yy0+dmNfdXRmX2NoYXIgPSAodmMtPnZjX3V0Zl9jaGFyIDw8IDYpIHwgKGMgJiAweDNmKTsKKwkJCQl2Yy0+dmNfdXRmX2NvdW50LS07CisJCQkJaWYgKHZjLT52Y191dGZfY291bnQgPT0gMCkKKwkJCQkgICAgdGMgPSBjID0gdmMtPnZjX3V0Zl9jaGFyOworCQkJCWVsc2UgY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCWlmICgoYyAmIDB4ZTApID09IDB4YzApIHsKKwkJCQkgICAgdmMtPnZjX3V0Zl9jb3VudCA9IDE7CisJCQkJICAgIHZjLT52Y191dGZfY2hhciA9IChjICYgMHgxZik7CisJCQkJfSBlbHNlIGlmICgoYyAmIDB4ZjApID09IDB4ZTApIHsKKwkJCQkgICAgdmMtPnZjX3V0Zl9jb3VudCA9IDI7CisJCQkJICAgIHZjLT52Y191dGZfY2hhciA9IChjICYgMHgwZik7CisJCQkJfSBlbHNlIGlmICgoYyAmIDB4ZjgpID09IDB4ZjApIHsKKwkJCQkgICAgdmMtPnZjX3V0Zl9jb3VudCA9IDM7CisJCQkJICAgIHZjLT52Y191dGZfY2hhciA9IChjICYgMHgwNyk7CisJCQkJfSBlbHNlIGlmICgoYyAmIDB4ZmMpID09IDB4ZjgpIHsKKwkJCQkgICAgdmMtPnZjX3V0Zl9jb3VudCA9IDQ7CisJCQkJICAgIHZjLT52Y191dGZfY2hhciA9IChjICYgMHgwMyk7CisJCQkJfSBlbHNlIGlmICgoYyAmIDB4ZmUpID09IDB4ZmMpIHsKKwkJCQkgICAgdmMtPnZjX3V0Zl9jb3VudCA9IDU7CisJCQkJICAgIHZjLT52Y191dGZfY2hhciA9IChjICYgMHgwMSk7CisJCQkJfSBlbHNlCisJCQkJICAgIHZjLT52Y191dGZfY291bnQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJICAgICAgfQorCQkgICAgfSBlbHNlIHsKKwkJICAgICAgdGMgPSBjOworCQkgICAgICB2Yy0+dmNfdXRmX2NvdW50ID0gMDsKKwkJICAgIH0KKwkJfSBlbHNlIHsJLyogbm8gdXRmICovCisJCSAgdGMgPSB2Yy0+dmNfdHJhbnNsYXRlW3ZjLT52Y190b2dnbGVfbWV0YSA/IChjIHwgMHg4MCkgOiBjXTsKKwkJfQorCisgICAgICAgICAgICAgICAgLyogSWYgdGhlIG9yaWdpbmFsIGNvZGUgd2FzIGEgY29udHJvbCBjaGFyYWN0ZXIgd2UKKyAgICAgICAgICAgICAgICAgKiBvbmx5IGFsbG93IGEgZ2x5cGggdG8gYmUgZGlzcGxheWVkIGlmIHRoZSBjb2RlIGlzCisgICAgICAgICAgICAgICAgICogbm90IG5vcm1hbGx5IHVzZWQgKHN1Y2ggYXMgZm9yIGN1cnNvciBtb3ZlbWVudCkgb3IKKyAgICAgICAgICAgICAgICAgKiBpZiB0aGUgZGlzcF9jdHJsIG1vZGUgaGFzIGJlZW4gZXhwbGljaXRseSBlbmFibGVkLgorICAgICAgICAgICAgICAgICAqIENlcnRhaW4gY2hhcmFjdGVycyAoYXMgZ2l2ZW4gYnkgdGhlIENUUkxfQUxXQVlTCisgICAgICAgICAgICAgICAgICogYml0bWFwKSBhcmUgYWx3YXlzIGRpc3BsYXllZCBhcyBjb250cm9sIGNoYXJhY3RlcnMsCisgICAgICAgICAgICAgICAgICogYXMgdGhlIGNvbnNvbGUgd291bGQgYmUgcHJldHR5IHVzZWxlc3Mgd2l0aG91dAorICAgICAgICAgICAgICAgICAqIHRoZW07IHRvIGRpc3BsYXkgYW4gYXJiaXRyYXJ5IGZvbnQgcG9zaXRpb24gdXNlIHRoZQorICAgICAgICAgICAgICAgICAqIGRpcmVjdC10by1mb250IHpvbmUgaW4gVVRGLTggbW9kZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBvayA9IHRjICYmIChjID49IDMyIHx8CisJCQkgICAgKCF2Yy0+dmNfdXRmICYmICEoKCh2Yy0+dmNfZGlzcF9jdHJsID8gQ1RSTF9BTFdBWVMKKwkJCQkJCTogQ1RSTF9BQ1RJT04pID4+IGMpICYgMSkpKQorCQkJJiYgKGMgIT0gMTI3IHx8IHZjLT52Y19kaXNwX2N0cmwpCisJCQkmJiAoYyAhPSAxMjgrMjcpOworCisJCWlmICh2Yy0+dmNfc3RhdGUgPT0gRVNub3JtYWwgJiYgb2spIHsKKwkJCS8qIE5vdyB0cnkgdG8gZmluZCBvdXQgaG93IHRvIGRpc3BsYXkgaXQgKi8KKwkJCXRjID0gY29udl91bmlfdG9fcGModmMsIHRjKTsKKwkJCWlmICggdGMgPT0gLTQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIGdvdCAtNCAobm90IGZvdW5kKSB0aGVuIHNlZSBpZiB3ZSBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKFUrRkZGRCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMgPSBjb252X3VuaV90b19wYyh2YywgMHhmZmZkKTsKKworCQkJCS8qIE9uZSByZWFzb24gZm9yIHRoZSAtNCBjYW4gYmUgdGhhdCB3ZSBqdXN0CisJCQkJICAgZGlkIGEgY2xlYXJfdW5pbWFwKCk7CisJCQkJICAgdHJ5IGF0IGxlYXN0IHRvIHNob3cgc29tZXRoaW5nLiAqLworCQkJCWlmICh0YyA9PSAtNCkKKwkJCQkgICAgIHRjID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHRjID09IC0zICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWQgaGFzaCB0YWJsZSAtLSBob3BlIGZvciB0aGUgYmVzdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YyA9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQlpZiAodGMgJiB+Y2hhcm1hc2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBDb252ZXJzaW9uIGZhaWxlZCAqLworCisJCQlpZiAodmMtPnZjX25lZWRfd3JhcCB8fCB2Yy0+dmNfZGVjaW0pCisJCQkJRkxVU0gKKwkJCWlmICh2Yy0+dmNfbmVlZF93cmFwKSB7CisJCQkJY3IodmMpOworCQkJCWxmKHZjKTsKKwkJCX0KKwkJCWlmICh2Yy0+dmNfZGVjaW0pCisJCQkJaW5zZXJ0X2NoYXIodmMsIDEpOworCQkJc2NyX3dyaXRldyhoaW1hc2sgPworCQkJCSAgICAgKCh2Yy0+dmNfYXR0ciA8PCA4KSAmIH5oaW1hc2spICsgKCh0YyAmIDB4MTAwKSA/IGhpbWFzayA6IDApICsgKHRjICYgMHhmZikgOgorCQkJCSAgICAgKHZjLT52Y19hdHRyIDw8IDgpICsgdGMsCisJCQkJICAgKHUxNiAqKSB2Yy0+dmNfcG9zKTsKKwkJCWlmIChET19VUERBVEUodmMpICYmIGRyYXdfeCA8IDApIHsKKwkJCQlkcmF3X3ggPSB2Yy0+dmNfeDsKKwkJCQlkcmF3X2Zyb20gPSB2Yy0+dmNfcG9zOworCQkJfQorCQkJaWYgKHZjLT52Y194ID09IHZjLT52Y19jb2xzIC0gMSkgeworCQkJCXZjLT52Y19uZWVkX3dyYXAgPSB2Yy0+dmNfZGVjYXdtOworCQkJCWRyYXdfdG8gPSB2Yy0+dmNfcG9zICsgMjsKKwkJCX0gZWxzZSB7CisJCQkJdmMtPnZjX3grKzsKKwkJCQlkcmF3X3RvID0gKHZjLT52Y19wb3MgKz0gMik7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlGTFVTSAorCQlkb19jb25fdHJvbCh0dHksIHZjLCBvcmlnKTsKKwl9CisJRkxVU0gKKwljb25zb2xlX2NvbmRpdGlvbmFsX3NjaGVkdWxlKCk7CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCitvdXQ6CisJcmV0dXJuIG47CisjdW5kZWYgRkxVU0gKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGNvbnNvbGUgc3dpdGNoaW5nIGNhbGxiYWNrLgorICoKKyAqIERvaW5nIGNvbnNvbGUgc3dpdGNoaW5nIGluIGEgcHJvY2VzcyBjb250ZXh0IGFsbG93cworICogdXMgdG8gZG8gdGhlIHN3aXRjaGVzIGFzeW5jaHJvbm91c2x5IChuZWVkZWQgd2hlbiB3ZSB3YW50CisgKiB0byBzd2l0Y2ggZHVlIHRvIGEga2V5Ym9hcmQgaW50ZXJydXB0KS4gIFN5bmNocm9uaXphdGlvbgorICogd2l0aCBvdGhlciBjb25zb2xlIGNvZGUgYW5kIHByZXZlbnRpb24gb2YgcmUtZW50cmFuY3kgaXMKKyAqIGVuc3VyZWQgd2l0aCBjb25zb2xlX3NlbS4KKyAqLworc3RhdGljIHZvaWQgY29uc29sZV9jYWxsYmFjayh2b2lkICppZ25vcmVkKQoreworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKworCWlmICh3YW50X2NvbnNvbGUgPj0gMCkgeworCQlpZiAod2FudF9jb25zb2xlICE9IGZnX2NvbnNvbGUgJiYKKwkJICAgIHZjX2NvbnNfYWxsb2NhdGVkKHdhbnRfY29uc29sZSkpIHsKKwkJCWhpZGVfY3Vyc29yKHZjX2NvbnNbZmdfY29uc29sZV0uZCk7CisJCQljaGFuZ2VfY29uc29sZSh2Y19jb25zW3dhbnRfY29uc29sZV0uZCk7CisJCQkvKiB3ZSBvbmx5IGNoYW5nZWQgd2hlbiB0aGUgY29uc29sZSBoYWQgYWxyZWFkeQorCQkJICAgYmVlbiBhbGxvY2F0ZWQgLSBhIG5ldyBjb25zb2xlIGlzIG5vdCBjcmVhdGVkCisJCQkgICBpbiBhbiBpbnRlcnJ1cHQgcm91dGluZSAqLworCQl9CisJCXdhbnRfY29uc29sZSA9IC0xOworCX0KKwlpZiAoZG9fcG9rZV9ibGFua2VkX2NvbnNvbGUpIHsgLyogZG8gbm90IHVuYmxhbmsgZm9yIGEgTEVEIGNoYW5nZSAqLworCQlkb19wb2tlX2JsYW5rZWRfY29uc29sZSA9IDA7CisJCXBva2VfYmxhbmtlZF9jb25zb2xlKCk7CisJfQorCWlmIChzY3JvbGxiYWNrX2RlbHRhKSB7CisJCXN0cnVjdCB2Y19kYXRhICp2YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKKwkJY2xlYXJfc2VsZWN0aW9uKCk7CisJCWlmICh2Yy0+dmNfbW9kZSA9PSBLRF9URVhUKQorCQkJdmMtPnZjX3N3LT5jb25fc2Nyb2xsZGVsdGEodmMsIHNjcm9sbGJhY2tfZGVsdGEpOworCQlzY3JvbGxiYWNrX2RlbHRhID0gMDsKKwl9CisJaWYgKGJsYW5rX3RpbWVyX2V4cGlyZWQpIHsKKwkJZG9fYmxhbmtfc2NyZWVuKDApOworCQlibGFua190aW1lcl9leHBpcmVkID0gMDsKKwl9CisKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7Cit9CisKK3ZvaWQgc2V0X2NvbnNvbGUoaW50IG5yKQoreworCXdhbnRfY29uc29sZSA9IG5yOworCXNjaGVkdWxlX2NvbnNvbGVfY2FsbGJhY2soKTsKK30KKworc3RydWN0IHR0eV9kcml2ZXIgKmNvbnNvbGVfZHJpdmVyOworCisjaWZkZWYgQ09ORklHX1ZUX0NPTlNPTEUKKworLyoKKyAqCUNvbnNvbGUgb24gdmlydHVhbCB0ZXJtaW5hbAorICoKKyAqIFRoZSBjb25zb2xlIG11c3QgYmUgbG9ja2VkIHdoZW4gd2UgZ2V0IGhlcmUuCisgKi8KKworc3RhdGljIHZvaWQgdnRfY29uc29sZV9wcmludChzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKmIsIHVuc2lnbmVkIGNvdW50KQoreworCXN0cnVjdCB2Y19kYXRhICp2YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKKwl1bnNpZ25lZCBjaGFyIGM7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJpbnRpbmc7CisJY29uc3QgdXNob3J0ICpzdGFydDsKKwl1c2hvcnQgY250ID0gMDsKKwl1c2hvcnQgbXl4OworCisJLyogY29uc29sZSBidXN5IG9yIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgKi8KKwlpZiAoIXByaW50YWJsZSB8fCB0ZXN0X2FuZF9zZXRfYml0KDAsICZwcmludGluZykpCisJCXJldHVybjsKKworCWlmIChrbXNnX3JlZGlyZWN0ICYmIHZjX2NvbnNfYWxsb2NhdGVkKGttc2dfcmVkaXJlY3QgLSAxKSkKKwkJdmMgPSB2Y19jb25zW2ttc2dfcmVkaXJlY3QgLSAxXS5kOworCisJLyogcmVhZCBgeCcgb25seSBhZnRlciBzZXR0aW5nIGN1cnJjb25zIHByb3Blcmx5IChvdGhlcndpc2UKKwkgICB0aGUgYHgnIG1hY3JvIHdpbGwgcmVhZCB0aGUgeCBvZiB0aGUgZm9yZWdyb3VuZCBjb25zb2xlKS4gKi8KKwlteXggPSB2Yy0+dmNfeDsKKworCWlmICghdmNfY29uc19hbGxvY2F0ZWQoZmdfY29uc29sZSkpIHsKKwkJLyogaW1wb3NzaWJsZSAqLworCQkvKiBwcmludGsoInZ0X2NvbnNvbGVfcHJpbnQ6IHR0eSAlZCBub3QgYWxsb2NhdGVkID8/XG4iLCBjdXJyY29ucysxKTsgKi8KKwkJZ290byBxdWl0OworCX0KKworCWlmICh2Yy0+dmNfbW9kZSAhPSBLRF9URVhUKQorCQlnb3RvIHF1aXQ7CisKKwkvKiB1bmRyYXcgY3Vyc29yIGZpcnN0ICovCisJaWYgKElTX0ZHKHZjKSkKKwkJaGlkZV9jdXJzb3IodmMpOworCisJc3RhcnQgPSAodXNob3J0ICopdmMtPnZjX3BvczsKKworCS8qIENvbnRyaXZlZCBzdHJ1Y3R1cmUgdG8gdHJ5IHRvIGVtdWxhdGUgb3JpZ2luYWwgbmVlZF93cmFwIGJlaGF2aW91cgorCSAqIFByb2JsZW1zIGNhdXNlZCB3aGVuIHdlIGhhdmUgbmVlZF93cmFwIHNldCBvbiAnXG4nIGNoYXJhY3RlciAqLworCXdoaWxlIChjb3VudC0tKSB7CisJCWMgPSAqYisrOworCQlpZiAoYyA9PSAxMCB8fCBjID09IDEzIHx8IGMgPT0gOCB8fCB2Yy0+dmNfbmVlZF93cmFwKSB7CisJCQlpZiAoY250ID4gMCkgeworCQkJCWlmIChDT05fSVNfVklTSUJMRSh2YykpCisJCQkJCXZjLT52Y19zdy0+Y29uX3B1dGNzKHZjLCBzdGFydCwgY250LCB2Yy0+dmNfeSwgdmMtPnZjX3gpOworCQkJCXZjLT52Y194ICs9IGNudDsKKwkJCQlpZiAodmMtPnZjX25lZWRfd3JhcCkKKwkJCQkJdmMtPnZjX3gtLTsKKwkJCQljbnQgPSAwOworCQkJfQorCQkJaWYgKGMgPT0gOCkgewkJLyogYmFja3NwYWNlICovCisJCQkJYnModmMpOworCQkJCXN0YXJ0ID0gKHVzaG9ydCAqKXZjLT52Y19wb3M7CisJCQkJbXl4ID0gdmMtPnZjX3g7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoYyAhPSAxMykKKwkJCQlsZih2Yyk7CisJCQljcih2Yyk7CisJCQlzdGFydCA9ICh1c2hvcnQgKil2Yy0+dmNfcG9zOworCQkJbXl4ID0gdmMtPnZjX3g7CisJCQlpZiAoYyA9PSAxMCB8fCBjID09IDEzKQorCQkJCWNvbnRpbnVlOworCQl9CisJCXNjcl93cml0ZXcoKHZjLT52Y19hdHRyIDw8IDgpICsgYywgKHVuc2lnbmVkIHNob3J0ICopdmMtPnZjX3Bvcyk7CisJCWNudCsrOworCQlpZiAobXl4ID09IHZjLT52Y19jb2xzIC0gMSkgeworCQkJdmMtPnZjX25lZWRfd3JhcCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQl2Yy0+dmNfcG9zICs9IDI7CisJCW15eCsrOworCX0KKwlpZiAoY250ID4gMCkgeworCQlpZiAoQ09OX0lTX1ZJU0lCTEUodmMpKQorCQkJdmMtPnZjX3N3LT5jb25fcHV0Y3ModmMsIHN0YXJ0LCBjbnQsIHZjLT52Y195LCB2Yy0+dmNfeCk7CisJCXZjLT52Y194ICs9IGNudDsKKwkJaWYgKHZjLT52Y194ID09IHZjLT52Y19jb2xzKSB7CisJCQl2Yy0+dmNfeC0tOworCQkJdmMtPnZjX25lZWRfd3JhcCA9IDE7CisJCX0KKwl9CisJc2V0X2N1cnNvcih2Yyk7CisKK3F1aXQ6CisJY2xlYXJfYml0KDAsICZwcmludGluZyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqdnRfY29uc29sZV9kZXZpY2Uoc3RydWN0IGNvbnNvbGUgKmMsIGludCAqaW5kZXgpCit7CisJKmluZGV4ID0gYy0+aW5kZXggPyBjLT5pbmRleC0xIDogZmdfY29uc29sZTsKKwlyZXR1cm4gY29uc29sZV9kcml2ZXI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSB2dF9jb25zb2xlX2RyaXZlciA9IHsKKwkubmFtZQkJPSAidHR5IiwKKwkud3JpdGUJCT0gdnRfY29uc29sZV9wcmludCwKKwkuZGV2aWNlCQk9IHZ0X2NvbnNvbGVfZGV2aWNlLAorCS51bmJsYW5rCT0gdW5ibGFua19zY3JlZW4sCisJLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXgJCT0gLTEsCit9OworI2VuZGlmCisKKy8qCisgKglIYW5kbGluZyBvZiBMaW51eC1zcGVjaWZpYyBWQyBpb2N0bHMKKyAqLworCisvKgorICogR2VuZXJhbGx5IGEgYml0IHJhY3kgd2l0aCByZXNwZWN0IHRvIGNvbnNvbGVfc2VtKCkuCisgKgorICogVGhlcmUgYXJlIHNvbWUgZnVuY3Rpb25zIHdoaWNoIGRvbid0IG5lZWQgaXQuCisgKgorICogVGhlcmUgYXJlIHNvbWUgZnVuY3Rpb25zIHdoaWNoIGNhbiBzbGVlcCBmb3IgYXJiaXRyYXJ5IHBlcmlvZHMKKyAqIChwYXN0ZV9zZWxlY3Rpb24pIGJ1dCB3ZSBkb24ndCBuZWVkIHRoZSBsb2NrIHRoZXJlIGFueXdheS4KKyAqCisgKiBzZXRfc2VsZWN0aW9uIGhhcyBsb2NraW5nLCBhbmQgZGVmaW5pdGVseSBuZWVkcyBpdAorICovCisKK2ludCB0aW9jbGludXgoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY2hhciB0eXBlLCBkYXRhOworCWNoYXIgX191c2VyICpwID0gKGNoYXIgX191c2VyICopYXJnOworCWludCBsaW5lczsKKwlpbnQgcmV0OworCisJaWYgKHR0eS0+ZHJpdmVyLT50eXBlICE9IFRUWV9EUklWRVJfVFlQRV9DT05TT0xFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY3VycmVudC0+c2lnbmFsLT50dHkgIT0gdHR5ICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCWlmIChnZXRfdXNlcih0eXBlLCBwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKwlzd2l0Y2ggKHR5cGUpCisJeworCQljYXNlIFRJT0NMX1NFVFNFTDoKKwkJCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwkJCXJldCA9IHNldF9zZWxlY3Rpb24oKHN0cnVjdCB0aW9jbF9zZWxlY3Rpb24gX191c2VyICopKHArMSksIHR0eSk7CisJCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCQlicmVhazsKKwkJY2FzZSBUSU9DTF9QQVNURVNFTDoKKwkJCXJldCA9IHBhc3RlX3NlbGVjdGlvbih0dHkpOworCQkJYnJlYWs7CisJCWNhc2UgVElPQ0xfVU5CTEFOS1NDUkVFTjoKKwkJCXVuYmxhbmtfc2NyZWVuKCk7CisJCQlicmVhazsKKwkJY2FzZSBUSU9DTF9TRUxMT0FETFVUOgorCQkJcmV0ID0gc2VsX2xvYWRsdXQocCk7CisJCQlicmVhazsKKwkJY2FzZSBUSU9DTF9HRVRTSElGVFNUQVRFOgorCQkJCisJLyoKKwkgKiBNYWtlIGl0IHBvc3NpYmxlIHRvIHJlYWN0IHRvIFNoaWZ0K01vdXNlYnV0dG9uLgorCSAqIE5vdGUgdGhhdCAnc2hpZnRfc3RhdGUnIGlzIGFuIHVuZG9jdW1lbnRlZAorCSAqIGtlcm5lbC1pbnRlcm5hbCB2YXJpYWJsZTsgcHJvZ3JhbXMgbm90IGNsb3NlbHkKKwkgKiByZWxhdGVkIHRvIHRoZSBrZXJuZWwgc2hvdWxkIG5vdCB1c2UgdGhpcy4KKwkgKi8KKwkgCQlkYXRhID0gc2hpZnRfc3RhdGU7CisJCQlyZXQgPSBfX3B1dF91c2VyKGRhdGEsIHApOworCQkJYnJlYWs7CisJCWNhc2UgVElPQ0xfR0VUTU9VU0VSRVBPUlRJTkc6CisJCQlkYXRhID0gbW91c2VfcmVwb3J0aW5nKCk7CisJCQlyZXQgPSBfX3B1dF91c2VyKGRhdGEsIHApOworCQkJYnJlYWs7CisJCWNhc2UgVElPQ0xfU0VUVkVTQUJMQU5LOgorCQkJc2V0X3Zlc2FfYmxhbmtpbmcocCk7CisJCQlicmVhazsKKwkJY2FzZSBUSU9DTF9TRVRLTVNHUkVESVJFQ1Q6CisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJCQlyZXQgPSAtRVBFUk07CisJCQl9IGVsc2UgeworCQkJCWlmIChnZXRfdXNlcihkYXRhLCBwKzEpKQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWVsc2UKKwkJCQkJa21zZ19yZWRpcmVjdCA9IGRhdGE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSU9DTF9HRVRGR0NPTlNPTEU6CisJCQlyZXQgPSBmZ19jb25zb2xlOworCQkJYnJlYWs7CisJCWNhc2UgVElPQ0xfU0NST0xMQ09OU09MRToKKwkJCWlmIChnZXRfdXNlcihsaW5lcywgKHMzMiBfX3VzZXIgKikocCs0KSkpIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJfSBlbHNlIHsKKwkJCQlzY3JvbGxmcm9udCh2Y19jb25zW2ZnX2NvbnNvbGVdLmQsIGxpbmVzKTsKKwkJCQlyZXQgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElPQ0xfQkxBTktTQ1JFRU46CS8qIHVudGlsIGV4cGxpY2l0bHkgdW5ibGFua2VkLCBub3Qgb25seSBwb2tlZCAqLworCQkJaWdub3JlX3Bva2UgPSAxOworCQkJZG9fYmxhbmtfc2NyZWVuKDApOworCQkJYnJlYWs7CisJCWNhc2UgVElPQ0xfQkxBTktFRFNDUkVFTjoKKwkJCXJldCA9IGNvbnNvbGVfYmxhbmtlZDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogL2Rldi90dHlOIGhhbmRsaW5nCisgKi8KKworc3RhdGljIGludCBjb25fd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50CXJldHZhbDsKKworCXJldHZhbCA9IGRvX2Nvbl93cml0ZSh0dHksIGJ1ZiwgY291bnQpOworCWNvbl9mbHVzaF9jaGFycyh0dHkpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgY29uX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJaWYgKGluX2ludGVycnVwdCgpKQorCQlyZXR1cm47CS8qIG5fcjM5NjQgY2FsbHMgcHV0X2NoYXIoKSBmcm9tIGludGVycnVwdCBjb250ZXh0ICovCisJZG9fY29uX3dyaXRlKHR0eSwgJmNoLCAxKTsKK30KKworc3RhdGljIGludCBjb25fd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICh0dHktPnN0b3BwZWQpCisJCXJldHVybiAwOworCXJldHVybiA0MDk2OwkJLyogTm8gbGltaXQsIHJlYWxseTsgd2UncmUgbm90IGJ1ZmZlcmluZyAqLworfQorCitzdGF0aWMgaW50IGNvbl9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm4gMDsJCS8qIHdlJ3JlIG5vdCBidWZmZXJpbmcgKi8KK30KKworLyoKKyAqIGNvbl90aHJvdHRsZSBhbmQgY29uX3VudGhyb3R0bGUgYXJlIG9ubHkgdXNlZCBmb3IKKyAqIHBhc3RlX3NlbGVjdGlvbigpLCB3aGljaCBoYXMgdG8gc3R1ZmYgaW4gYSBsYXJnZSBudW1iZXIgb2YKKyAqIGNoYXJhY3RlcnMuLi4KKyAqLworc3RhdGljIHZvaWQgY29uX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7Cit9CisKK3N0YXRpYyB2b2lkIGNvbl91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHZjX2RhdGEgKnZjID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdmMtPnBhc3RlX3dhaXQpOworfQorCisvKgorICogVHVybiB0aGUgU2Nyb2xsLUxvY2sgTEVEIG9uIHdoZW4gdGhlIHR0eSBpcyBzdG9wcGVkCisgKi8KK3N0YXRpYyB2b2lkIGNvbl9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaW50IGNvbnNvbGVfbnVtOworCWlmICghdHR5KQorCQlyZXR1cm47CisJY29uc29sZV9udW0gPSB0dHktPmluZGV4OworCWlmICghdmNfY29uc19hbGxvY2F0ZWQoY29uc29sZV9udW0pKQorCQlyZXR1cm47CisJc2V0X3ZjX2tiZF9sZWQoa2JkX3RhYmxlICsgY29uc29sZV9udW0sIFZDX1NDUk9MTE9DSyk7CisJc2V0X2xlZHMoKTsKK30KKworLyoKKyAqIFR1cm4gdGhlIFNjcm9sbC1Mb2NrIExFRCBvZmYgd2hlbiB0aGUgY29uc29sZSBpcyBzdGFydGVkCisgKi8KK3N0YXRpYyB2b2lkIGNvbl9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludCBjb25zb2xlX251bTsKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCWNvbnNvbGVfbnVtID0gdHR5LT5pbmRleDsKKwlpZiAoIXZjX2NvbnNfYWxsb2NhdGVkKGNvbnNvbGVfbnVtKSkKKwkJcmV0dXJuOworCWNscl92Y19rYmRfbGVkKGtiZF90YWJsZSArIGNvbnNvbGVfbnVtLCBWQ19TQ1JPTExPQ0spOworCXNldF9sZWRzKCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbl9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB2Y19kYXRhICp2YzsKKworCWlmIChpbl9pbnRlcnJ1cHQoKSkJLyogZnJvbSBmbHVzaF90b19sZGlzYyAqLworCQlyZXR1cm47CisKKwkvKiBpZiB3ZSByYWNlIHdpdGggY29uX2Nsb3NlKCksIHZ0IG1heSBiZSBudWxsICovCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCXZjID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAodmMpCisJCXNldF9jdXJzb3IodmMpOworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIHRoZSBjb25zb2xlIHNjcmVlbiBtZW1vcnkuCisgKi8KK3N0YXRpYyBpbnQgY29uX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJdW5zaWduZWQgaW50IGN1cnJjb25zID0gdHR5LT5pbmRleDsKKwlpbnQgcmV0ID0gMDsKKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlpZiAodHR5LT5jb3VudCA9PSAxKSB7CisJCXJldCA9IHZjX2FsbG9jYXRlKGN1cnJjb25zKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlzdHJ1Y3QgdmNfZGF0YSAqdmMgPSB2Y19jb25zW2N1cnJjb25zXS5kOworCQkJdHR5LT5kcml2ZXJfZGF0YSA9IHZjOworCQkJdmMtPnZjX3R0eSA9IHR0eTsKKworCQkJaWYgKCF0dHktPndpbnNpemUud3Nfcm93ICYmICF0dHktPndpbnNpemUud3NfY29sKSB7CisJCQkJdHR5LT53aW5zaXplLndzX3JvdyA9IHZjX2NvbnNbY3VycmNvbnNdLmQtPnZjX3Jvd3M7CisJCQkJdHR5LT53aW5zaXplLndzX2NvbCA9IHZjX2NvbnNbY3VycmNvbnNdLmQtPnZjX2NvbHM7CisJCQl9CisJCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCQl2Y3NfbWFrZV9kZXZmcyh0dHkpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFdlIHRha2UgdHR5X3NlbSBpbiBoZXJlIHRvIHByZXZlbnQgYW5vdGhlciB0aHJlYWQgZnJvbSBjb21pbmcgaW4gdmlhIGluaXRfZGV2CisgKiBhbmQgdGFraW5nIGEgcmVmIGFnYWluc3QgdGhlIHR0eSB3aGlsZSB3ZSdyZSBpbiB0aGUgcHJvY2VzcyBvZiBmb3JnZXR0aW5nCisgKiBhYm91dCBpdCBhbmQgY2xlYW5pbmcgdGhpbmdzIHVwLgorICoKKyAqIFRoaXMgaXMgYmVjYXVzZSB2Y3NfcmVtb3ZlX2RldmZzKCkgY2FuIHNsZWVwIGFuZCB3aWxsIGRyb3AgdGhlIEJLTC4KKyAqLworc3RhdGljIHZvaWQgY29uX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWRvd24oJnR0eV9zZW0pOworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlpZiAodHR5ICYmIHR0eS0+Y291bnQgPT0gMSkgeworCQlzdHJ1Y3QgdmNfZGF0YSAqdmMgPSB0dHktPmRyaXZlcl9kYXRhOworCisJCWlmICh2YykKKwkJCXZjLT52Y190dHkgPSBOVUxMOworCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKKwkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQl2Y3NfcmVtb3ZlX2RldmZzKHR0eSk7CisJCXVwKCZ0dHlfc2VtKTsKKwkJLyoKKwkJICogdHR5X3NlbSBpcyByZWxlYXNlZCwgYnV0IHdlIHN0aWxsIGhvbGQgQktMLCBzbyB0aGVyZSBpcworCQkgKiBzdGlsbCBleGNsdXNpb24gYWdhaW5zdCBpbml0X2RldigpCisJCSAqLworCQlyZXR1cm47CisJfQorCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwl1cCgmdHR5X3NlbSk7Cit9CisKK3N0YXRpYyB2b2lkIHZjX2luaXQoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBpbnQgcm93cywKKwkJICAgIHVuc2lnbmVkIGludCBjb2xzLCBpbnQgZG9fY2xlYXIpCit7CisJaW50IGosIGsgOworCisJdmMtPnZjX2NvbHMgPSBjb2xzOworCXZjLT52Y19yb3dzID0gcm93czsKKwl2Yy0+dmNfc2l6ZV9yb3cgPSBjb2xzIDw8IDE7CisJdmMtPnZjX3NjcmVlbmJ1Zl9zaXplID0gdmMtPnZjX3Jvd3MgKiB2Yy0+dmNfc2l6ZV9yb3c7CisKKwlzZXRfb3JpZ2luKHZjKTsKKwl2Yy0+dmNfcG9zID0gdmMtPnZjX29yaWdpbjsKKwlyZXNldF92Yyh2Yyk7CisJZm9yIChqPWs9MDsgajwxNjsgaisrKSB7CisJCXZjLT52Y19wYWxldHRlW2srK10gPSBkZWZhdWx0X3JlZFtqXSA7CisJCXZjLT52Y19wYWxldHRlW2srK10gPSBkZWZhdWx0X2dybltqXSA7CisJCXZjLT52Y19wYWxldHRlW2srK10gPSBkZWZhdWx0X2JsdVtqXSA7CisJfQorCXZjLT52Y19kZWZfY29sb3IgICAgICAgPSAweDA3OyAgIC8qIHdoaXRlICovCisJdmMtPnZjX3VsY29sb3IJCT0gMHgwZjsgICAvKiBib2xkIHdoaXRlICovCisJdmMtPnZjX2hhbGZjb2xvciAgICAgICA9IDB4MDg7ICAgLyogZ3JleSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZjLT5wYXN0ZV93YWl0KTsKKwlyZXNldF90ZXJtaW5hbCh2YywgZG9fY2xlYXIpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGNvbnNvbGUgaW50ZXJydXB0cywgYW5kIGRvZXMgbm90aGluZworICogZWxzZS4gSWYgeW91IHdhbnQgdGhlIHNjcmVlbiB0byBjbGVhciwgY2FsbCB0dHlfd3JpdGUgd2l0aAorICogdGhlIGFwcHJvcHJpYXRlIGVzY2FwZS1zZXF1ZW5jZS4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBjb25faW5pdCh2b2lkKQoreworCWNvbnN0IGNoYXIgKmRpc3BsYXlfZGVzYyA9IE5VTEw7CisJc3RydWN0IHZjX2RhdGEgKnZjOworCXVuc2lnbmVkIGludCBjdXJyY29ucyA9IDA7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisKKwlpZiAoY29uc3dpdGNocCkKKwkJZGlzcGxheV9kZXNjID0gY29uc3dpdGNocC0+Y29uX3N0YXJ0dXAoKTsKKwlpZiAoIWRpc3BsYXlfZGVzYykgeworCQlmZ19jb25zb2xlID0gMDsKKwkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpbml0X3RpbWVyKCZjb25zb2xlX3RpbWVyKTsKKwljb25zb2xlX3RpbWVyLmZ1bmN0aW9uID0gYmxhbmtfc2NyZWVuX3Q7CisJaWYgKGJsYW5raW50ZXJ2YWwpIHsKKwkJYmxhbmtfc3RhdGUgPSBibGFua19ub3JtYWxfd2FpdDsKKwkJbW9kX3RpbWVyKCZjb25zb2xlX3RpbWVyLCBqaWZmaWVzICsgYmxhbmtpbnRlcnZhbCk7CisJfQorCisJLyoKKwkgKiBrbWFsbG9jIGlzIG5vdCBydW5uaW5nIHlldCAtIHdlIHVzZSB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuCisJICovCisJZm9yIChjdXJyY29ucyA9IDA7IGN1cnJjb25zIDwgTUlOX05SX0NPTlNPTEVTOyBjdXJyY29ucysrKSB7CisJCXZjX2NvbnNbY3VycmNvbnNdLmQgPSB2YyA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCB2Y19kYXRhKSk7CisJCXZpc3VhbF9pbml0KHZjLCBjdXJyY29ucywgMSk7CisJCXZjLT52Y19zY3JlZW5idWYgPSAodW5zaWduZWQgc2hvcnQgKilhbGxvY19ib290bWVtKHZjLT52Y19zY3JlZW5idWZfc2l6ZSk7CisJCXZjLT52Y19rbWFsbG9jZWQgPSAwOworCQl2Y19pbml0KHZjLCB2Yy0+dmNfcm93cywgdmMtPnZjX2NvbHMsCisJCQljdXJyY29ucyB8fCAhdmMtPnZjX3N3LT5jb25fc2F2ZV9zY3JlZW4pOworCX0KKwljdXJyY29ucyA9IGZnX2NvbnNvbGUgPSAwOworCW1hc3Rlcl9kaXNwbGF5X2ZnID0gdmMgPSB2Y19jb25zW2N1cnJjb25zXS5kOworCXNldF9vcmlnaW4odmMpOworCXNhdmVfc2NyZWVuKHZjKTsKKwlnb3RveHkodmMsIHZjLT52Y194LCB2Yy0+dmNfeSk7CisJY3NpX0oodmMsIDApOworCXVwZGF0ZV9zY3JlZW4odmMpOworCXByaW50aygiQ29uc29sZTogJXMgJXMgJWR4JWQiLAorCQl2Yy0+dmNfY2FuX2RvX2NvbG9yID8gImNvbG91ciIgOiAibW9ubyIsCisJCWRpc3BsYXlfZGVzYywgdmMtPnZjX2NvbHMsIHZjLT52Y19yb3dzKTsKKwlwcmludGFibGUgPSAxOworCXByaW50aygiXG4iKTsKKworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKworI2lmZGVmIENPTkZJR19WVF9DT05TT0xFCisJcmVnaXN0ZXJfY29uc29sZSgmdnRfY29uc29sZV9kcml2ZXIpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9Citjb25zb2xlX2luaXRjYWxsKGNvbl9pbml0KTsKKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBjb25fb3BzID0geworCS5vcGVuID0gY29uX29wZW4sCisJLmNsb3NlID0gY29uX2Nsb3NlLAorCS53cml0ZSA9IGNvbl93cml0ZSwKKwkud3JpdGVfcm9vbSA9IGNvbl93cml0ZV9yb29tLAorCS5wdXRfY2hhciA9IGNvbl9wdXRfY2hhciwKKwkuZmx1c2hfY2hhcnMgPSBjb25fZmx1c2hfY2hhcnMsCisJLmNoYXJzX2luX2J1ZmZlciA9IGNvbl9jaGFyc19pbl9idWZmZXIsCisJLmlvY3RsID0gdnRfaW9jdGwsCisJLnN0b3AgPSBjb25fc3RvcCwKKwkuc3RhcnQgPSBjb25fc3RhcnQsCisJLnRocm90dGxlID0gY29uX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gY29uX3VudGhyb3R0bGUsCit9OworCitpbnQgX19pbml0IHZ0eV9pbml0KHZvaWQpCit7CisJdmNzX2luaXQoKTsKKworCWNvbnNvbGVfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihNQVhfTlJfQ09OU09MRVMpOworCWlmICghY29uc29sZV9kcml2ZXIpCisJCXBhbmljKCJDb3VsZG4ndCBhbGxvY2F0ZSBjb25zb2xlIGRyaXZlclxuIik7CisJY29uc29sZV9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJY29uc29sZV9kcml2ZXItPmRldmZzX25hbWUgPSAidmMvIjsKKwljb25zb2xlX2RyaXZlci0+bmFtZSA9ICJ0dHkiOworCWNvbnNvbGVfZHJpdmVyLT5uYW1lX2Jhc2UgPSAxOworCWNvbnNvbGVfZHJpdmVyLT5tYWpvciA9IFRUWV9NQUpPUjsKKwljb25zb2xlX2RyaXZlci0+bWlub3Jfc3RhcnQgPSAxOworCWNvbnNvbGVfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX0NPTlNPTEU7CisJY29uc29sZV9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwljb25zb2xlX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXIHwgVFRZX0RSSVZFUl9SRVNFVF9URVJNSU9TOworCXR0eV9zZXRfb3BlcmF0aW9ucyhjb25zb2xlX2RyaXZlciwgJmNvbl9vcHMpOworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKGNvbnNvbGVfZHJpdmVyKSkKKwkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIGNvbnNvbGUgZHJpdmVyXG4iKTsKKworCWtiZF9pbml0KCk7CisJY29uc29sZV9tYXBfaW5pdCgpOworI2lmZGVmIENPTkZJR19QUk9NX0NPTlNPTEUKKwlwcm9tX2Nvbl9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTURBX0NPTlNPTEUKKwltZGFfY29uc29sZV9pbml0KCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworI2lmbmRlZiBWVF9TSU5HTEVfRFJJVkVSCisKKy8qCisgKglJZiB3ZSBzdXBwb3J0IG1vcmUgY29uc29sZSBkcml2ZXJzLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQKKyAqCXdoZW4gYSBkcml2ZXIgd2FudHMgdG8gdGFrZSBvdmVyIHNvbWUgZXhpc3RpbmcgY29uc29sZXMKKyAqCWFuZCBiZWNvbWUgZGVmYXVsdCBkcml2ZXIgZm9yIG5ld2x5IG9wZW5lZCBvbmVzLgorICovCisKK2ludCB0YWtlX292ZXJfY29uc29sZShjb25zdCBzdHJ1Y3QgY29uc3cgKmNzdywgaW50IGZpcnN0LCBpbnQgbGFzdCwgaW50IGRlZmx0KQoreworCWludCBpLCBqID0gLTE7CisJY29uc3QgY2hhciAqZGVzYzsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKworCW93bmVyID0gY3N3LT5vd25lcjsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KG93bmVyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisKKwlkZXNjID0gY3N3LT5jb25fc3RhcnR1cCgpOworCWlmICghZGVzYykgeworCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCW1vZHVsZV9wdXQob3duZXIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKGRlZmx0KSB7CisJCWlmIChjb25zd2l0Y2hwKQorCQkJbW9kdWxlX3B1dChjb25zd2l0Y2hwLT5vd25lcik7CisJCV9fbW9kdWxlX2dldChvd25lcik7CisJCWNvbnN3aXRjaHAgPSBjc3c7CisJfQorCisJZm9yIChpID0gZmlyc3Q7IGkgPD0gbGFzdDsgaSsrKSB7CisJCWludCBvbGRfd2FzX2NvbG9yOworCQlzdHJ1Y3QgdmNfZGF0YSAqdmMgPSB2Y19jb25zW2ldLmQ7CisKKwkJaWYgKGNvbl9kcml2ZXJfbWFwW2ldKQorCQkJbW9kdWxlX3B1dChjb25fZHJpdmVyX21hcFtpXS0+b3duZXIpOworCQlfX21vZHVsZV9nZXQob3duZXIpOworCQljb25fZHJpdmVyX21hcFtpXSA9IGNzdzsKKworCQlpZiAoIXZjIHx8ICF2Yy0+dmNfc3cpCisJCQljb250aW51ZTsKKworCQlqID0gaTsKKwkJaWYgKENPTl9JU19WSVNJQkxFKHZjKSkKKwkJCXNhdmVfc2NyZWVuKHZjKTsKKwkJb2xkX3dhc19jb2xvciA9IHZjLT52Y19jYW5fZG9fY29sb3I7CisJCXZjLT52Y19zdy0+Y29uX2RlaW5pdCh2Yyk7CisJCXZjLT52Y19vcmlnaW4gPSAodW5zaWduZWQgbG9uZyl2Yy0+dmNfc2NyZWVuYnVmOworCQl2Yy0+dmNfdmlzaWJsZV9vcmlnaW4gPSB2Yy0+dmNfb3JpZ2luOworCQl2Yy0+dmNfc2NyX2VuZCA9IHZjLT52Y19vcmlnaW4gKyB2Yy0+dmNfc2NyZWVuYnVmX3NpemU7CisJCXZjLT52Y19wb3MgPSB2Yy0+dmNfb3JpZ2luICsgdmMtPnZjX3NpemVfcm93ICogdmMtPnZjX3kgKyAyICogdmMtPnZjX3g7CisJCXZpc3VhbF9pbml0KHZjLCBpLCAwKTsKKwkJdXBkYXRlX2F0dHIodmMpOworCisJCS8qIElmIHRoZSBjb25zb2xlIGNoYW5nZWQgYmV0d2VlbiBtb25vIDwtPiBjb2xvciwgdGhlbgorCQkgKiB0aGUgYXR0cmlidXRlcyBpbiB0aGUgc2NyZWVuYnVmIHdpbGwgYmUgd3JvbmcuICBUaGUKKwkJICogZm9sbG93aW5nIHJlc2V0cyBhbGwgYXR0cmlidXRlcyB0byBzb21ldGhpbmcgc2FuZS4KKwkJICovCisJCWlmIChvbGRfd2FzX2NvbG9yICE9IHZjLT52Y19jYW5fZG9fY29sb3IpCisJCQljbGVhcl9idWZmZXJfYXR0cmlidXRlcyh2Yyk7CisKKwkJaWYgKENPTl9JU19WSVNJQkxFKHZjKSkKKwkJCXVwZGF0ZV9zY3JlZW4odmMpOworCX0KKwlwcmludGsoIkNvbnNvbGU6IHN3aXRjaGluZyAiKTsKKwlpZiAoIWRlZmx0KQorCQlwcmludGsoImNvbnNvbGVzICVkLSVkICIsIGZpcnN0KzEsIGxhc3QrMSk7CisJaWYgKGogPj0gMCkKKwkJcHJpbnRrKCJ0byAlcyAlcyAlZHglZFxuIiwKKwkJICAgICAgIHZjX2NvbnNbal0uZC0+dmNfY2FuX2RvX2NvbG9yID8gImNvbG91ciIgOiAibW9ubyIsCisJCSAgICAgICBkZXNjLCB2Y19jb25zW2pdLmQtPnZjX2NvbHMsIHZjX2NvbnNbal0uZC0+dmNfcm93cyk7CisJZWxzZQorCQlwcmludGsoInRvICVzXG4iLCBkZXNjKTsKKworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKworCW1vZHVsZV9wdXQob3duZXIpOworCXJldHVybiAwOworfQorCit2b2lkIGdpdmVfdXBfY29uc29sZShjb25zdCBzdHJ1Y3QgY29uc3cgKmNzdykKK3sKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKQorCQlpZiAoY29uX2RyaXZlcl9tYXBbaV0gPT0gY3N3KSB7CisJCQltb2R1bGVfcHV0KGNzdy0+b3duZXIpOworCQkJY29uX2RyaXZlcl9tYXBbaV0gPSBOVUxMOworCQl9Cit9CisKKyNlbmRpZgorCisvKgorICoJU2NyZWVuIGJsYW5raW5nCisgKi8KKworc3RhdGljIHZvaWQgc2V0X3Zlc2FfYmxhbmtpbmcoY2hhciBfX3VzZXIgKnApCit7CisgICAgdW5zaWduZWQgaW50IG1vZGU7CisgICAgZ2V0X3VzZXIobW9kZSwgcCArIDEpOworICAgIHZlc2FfYmxhbmtfbW9kZSA9IChtb2RlIDwgNCkgPyBtb2RlIDogMDsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IGEgdGltZXIgaGFuZGxlcgorICovCitzdGF0aWMgdm9pZCB2ZXNhX3Bvd2VyZG93bih2b2lkKQoreworICAgIHN0cnVjdCB2Y19kYXRhICpjID0gdmNfY29uc1tmZ19jb25zb2xlXS5kOworICAgIC8qCisgICAgICogIFBvd2VyIGRvd24gaWYgY3VycmVudGx5IHN1c3BlbmRlZCAoMSBvciAyKSwKKyAgICAgKiAgc3VzcGVuZCBpZiBjdXJyZW50bHkgYmxhbmtlZCAoMCksCisgICAgICogIGVsc2UgZG8gbm90aGluZyAoaS5lLiBhbHJlYWR5IHBvd2VyZWQgZG93biAoMykpLgorICAgICAqICBDYWxsZWQgb25seSBpZiBwb3dlcmRvd24gZmVhdHVyZXMgYXJlIGFsbG93ZWQuCisgICAgICovCisgICAgc3dpdGNoICh2ZXNhX2JsYW5rX21vZGUpIHsKKyAgICBjYXNlIFZFU0FfTk9fQkxBTktJTkc6CisJICAgIGMtPnZjX3N3LT5jb25fYmxhbmsoYywgVkVTQV9WU1lOQ19TVVNQRU5EKzEsIDApOworCSAgICBicmVhazsKKyAgICBjYXNlIFZFU0FfVlNZTkNfU1VTUEVORDoKKyAgICBjYXNlIFZFU0FfSFNZTkNfU1VTUEVORDoKKwkgICAgYy0+dmNfc3ctPmNvbl9ibGFuayhjLCBWRVNBX1BPV0VSRE9XTisxLCAwKTsKKwkgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGRvX2JsYW5rX3NjcmVlbihpbnQgZW50ZXJpbmdfZ2Z4KQoreworCXN0cnVjdCB2Y19kYXRhICp2YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKKwlpbnQgaTsKKworCVdBUk5fQ09OU09MRV9VTkxPQ0tFRCgpOworCisJaWYgKGNvbnNvbGVfYmxhbmtlZCkgeworCQlpZiAoYmxhbmtfc3RhdGUgPT0gYmxhbmtfdmVzYV93YWl0KSB7CisJCQlibGFua19zdGF0ZSA9IGJsYW5rX29mZjsKKwkJCXZlc2FfcG93ZXJkb3duKCk7CisKKwkJfQorCQlyZXR1cm47CisJfQorCWlmIChibGFua19zdGF0ZSAhPSBibGFua19ub3JtYWxfd2FpdCkKKwkJcmV0dXJuOworCWJsYW5rX3N0YXRlID0gYmxhbmtfb2ZmOworCisJLyogZW50ZXJpbmcgZ3JhcGhpY3MgbW9kZT8gKi8KKwlpZiAoZW50ZXJpbmdfZ2Z4KSB7CisJCWhpZGVfY3Vyc29yKHZjKTsKKwkJc2F2ZV9zY3JlZW4odmMpOworCQl2Yy0+dmNfc3ctPmNvbl9ibGFuayh2YywgLTEsIDEpOworCQljb25zb2xlX2JsYW5rZWQgPSBmZ19jb25zb2xlICsgMTsKKwkJc2V0X29yaWdpbih2Yyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBkb24ndCBibGFuayBncmFwaGljcyAqLworCWlmICh2Yy0+dmNfbW9kZSAhPSBLRF9URVhUKSB7CisJCWNvbnNvbGVfYmxhbmtlZCA9IGZnX2NvbnNvbGUgKyAxOworCQlyZXR1cm47CisJfQorCisJaGlkZV9jdXJzb3IodmMpOworCWRlbF90aW1lcl9zeW5jKCZjb25zb2xlX3RpbWVyKTsKKwlibGFua190aW1lcl9leHBpcmVkID0gMDsKKworCXNhdmVfc2NyZWVuKHZjKTsKKwkvKiBJbiBjYXNlIHdlIG5lZWQgdG8gcmVzZXQgb3JpZ2luLCBibGFua2luZyBob29rIHJldHVybnMgMSAqLworCWkgPSB2Yy0+dmNfc3ctPmNvbl9ibGFuayh2YywgMSwgMCk7CisJY29uc29sZV9ibGFua2VkID0gZmdfY29uc29sZSArIDE7CisJaWYgKGkpCisJCXNldF9vcmlnaW4odmMpOworCisJaWYgKGNvbnNvbGVfYmxhbmtfaG9vayAmJiBjb25zb2xlX2JsYW5rX2hvb2soMSkpCisJCXJldHVybjsKKworCWlmICh2ZXNhX29mZl9pbnRlcnZhbCkgeworCQlibGFua19zdGF0ZSA9IGJsYW5rX3Zlc2Ffd2FpdCwKKwkJbW9kX3RpbWVyKCZjb25zb2xlX3RpbWVyLCBqaWZmaWVzICsgdmVzYV9vZmZfaW50ZXJ2YWwpOworCX0KKworICAgIAlpZiAodmVzYV9ibGFua19tb2RlKQorCQl2Yy0+dmNfc3ctPmNvbl9ibGFuayh2YywgdmVzYV9ibGFua19tb2RlICsgMSwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKGRvX2JsYW5rX3NjcmVlbik7CisKKy8qCisgKiBDYWxsZWQgYnkgdGltZXIgYXMgd2VsbCBhcyBmcm9tIHZ0X2NvbnNvbGVfZHJpdmVyCisgKi8KK3ZvaWQgZG9fdW5ibGFua19zY3JlZW4oaW50IGxlYXZpbmdfZ2Z4KQoreworCXN0cnVjdCB2Y19kYXRhICp2YzsKKworCS8qIFRoaXMgc2hvdWxkIG5vdyBhbHdheXMgYmUgY2FsbGVkIGZyb20gYSAic2FuZSIgKHJlYWQ6IGNhbiBzY2hlZHVsZSkKKwkgKiBjb250ZXh0IGZvciB0aGUgc2FrZSBvZiB0aGUgbG93IGxldmVsIGRyaXZlcnMsIGV4Y2VwdCBpbiB0aGUgc3BlY2lhbAorCSAqIGNhc2Ugb2Ygb29wc19pbl9wcm9ncmVzcworCSAqLworCWlmICghb29wc19pbl9wcm9ncmVzcykKKwkJbWlnaHRfc2xlZXAoKTsKKworCVdBUk5fQ09OU09MRV9VTkxPQ0tFRCgpOworCisJaWdub3JlX3Bva2UgPSAwOworCWlmICghY29uc29sZV9ibGFua2VkKQorCQlyZXR1cm47CisJaWYgKCF2Y19jb25zX2FsbG9jYXRlZChmZ19jb25zb2xlKSkgeworCQkvKiBpbXBvc3NpYmxlICovCisJCXByaW50aygidW5ibGFua19zY3JlZW46IHR0eSAlZCBub3QgYWxsb2NhdGVkID8/XG4iLCBmZ19jb25zb2xlKzEpOworCQlyZXR1cm47CisJfQorCXZjID0gdmNfY29uc1tmZ19jb25zb2xlXS5kOworCWlmICh2Yy0+dmNfbW9kZSAhPSBLRF9URVhUKQorCQlyZXR1cm47IC8qIGJ1dCBsZWF2ZSBjb25zb2xlX2JsYW5rZWQgIT0gMCAqLworCisJaWYgKGJsYW5raW50ZXJ2YWwpIHsKKwkJbW9kX3RpbWVyKCZjb25zb2xlX3RpbWVyLCBqaWZmaWVzICsgYmxhbmtpbnRlcnZhbCk7CisJCWJsYW5rX3N0YXRlID0gYmxhbmtfbm9ybWFsX3dhaXQ7CisJfQorCisJY29uc29sZV9ibGFua2VkID0gMDsKKwlpZiAodmMtPnZjX3N3LT5jb25fYmxhbmsodmMsIDAsIGxlYXZpbmdfZ2Z4KSkKKwkJLyogTG93LWxldmVsIGRyaXZlciBjYW5ub3QgcmVzdG9yZSAtPiBkbyBpdCBvdXJzZWx2ZXMgKi8KKwkJdXBkYXRlX3NjcmVlbih2Yyk7CisJaWYgKGNvbnNvbGVfYmxhbmtfaG9vaykKKwkJY29uc29sZV9ibGFua19ob29rKDApOworCXNldF9wYWxldHRlKHZjKTsKKwlzZXRfY3Vyc29yKHZjKTsKK30KK0VYUE9SVF9TWU1CT0woZG9fdW5ibGFua19zY3JlZW4pOworCisvKgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIG91dHNpZGUgd29ybGQgdG8gY2F1c2UgYSBmb3JjZWQgdW5ibGFuaywgbW9zdGx5IGZvcgorICogb29wc2VzLiBDdXJyZW50bHksIEkganVzdCBjYWxsIGRvX3VuYmxhbmtfc2NyZWVuKDApLCBidXQgd2UgY291bGQgZXZlbnR1YWxseQorICogY2FsbCBpdCB3aXRoIDEgYXMgYW4gYXJndW1lbnQgYW5kIHNvIGZvcmNlIGEgbW9kZSByZXN0b3JlLi4uIHRoYXQgbWF5IGtpbGwKKyAqIFggb3IgYXQgbGVhc3QgZ2FyYmFnZSB0aGUgc2NyZWVuIGJ1dCB3b3VsZCBhbHNvIG1ha2UgdGhlIE9vcHMgdmlzaWJsZS4uLgorICovCit2b2lkIHVuYmxhbmtfc2NyZWVuKHZvaWQpCit7CisJZG9fdW5ibGFua19zY3JlZW4oMCk7Cit9CisKKy8qCisgKiBXZSBkZWZlciB0aGUgdGltZXIgYmxhbmtpbmcgdG8gd29yayBxdWV1ZSBzbyBpdCBjYW4gdGFrZSB0aGUgY29uc29sZSBzZW1hcGhvcmUKKyAqIChjb25zb2xlIG9wZXJhdGlvbnMgY2FuIHN0aWxsIGhhcHBlbiBhdCBpcnEgdGltZSwgYnV0IG9ubHkgZnJvbSBwcmludGsgd2hpY2gKKyAqIGhhcyB0aGUgY29uc29sZSBzZW1hcGhvcmUuIE5vdCBwZXJmZWN0IHlldCwgYnV0IGJldHRlciB0aGFuIG5vIGxvY2tpbmcKKyAqLworc3RhdGljIHZvaWQgYmxhbmtfc2NyZWVuX3QodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlibGFua190aW1lcl9leHBpcmVkID0gMTsKKwlzY2hlZHVsZV93b3JrKCZjb25zb2xlX3dvcmspOworfQorCit2b2lkIHBva2VfYmxhbmtlZF9jb25zb2xlKHZvaWQpCit7CisJV0FSTl9DT05TT0xFX1VOTE9DS0VEKCk7CisKKwkvKiBBZGQgdGhpcyBzbyB3ZSBxdWlja2x5IGNhdGNoIHdob2V2ZXIgbWlnaHQgY2FsbCB1cyBpbiBhIG5vbgorCSAqIHNhZmUgY29udGV4dC4gTm93YWRheXMsIHVuYmxhbmtfc2NyZWVuKCkgaXNuJ3QgdG8gYmUgY2FsbGVkIGluCisJICogYXRvbWljIGNvbnRleHRzIGFuZCBpcyBhbGxvd2VkIHRvIHNjaGVkdWxlICh3aXRoIHRoZSBzcGVjaWFsIGNhc2UKKwkgKiBvZiBvb3BzX2luX3Byb2dyZXNzLCBidXQgdGhhdCBpc24ndCBvZiBhbnkgY29uY2VybiBmb3IgdGhpcworCSAqIGZ1bmN0aW9uLiAtLUJlbkguCisJICovCisJbWlnaHRfc2xlZXAoKTsKKworCS8qIFRoaXMgaXNuJ3QgcGVyZmVjdGx5IHJhY2UgZnJlZSwgYnV0IGEgcmFjZSBoZXJlIHdvdWxkIGJlIG1vc3RseSBoYXJtbGVzcywKKwkgKiBhdCB3b3JzZSwgd2UnbGwgZG8gYSBzcHVycmlvdXMgYmxhbmsgYW5kIGl0J3MgdW5saWtlbHkKKwkgKi8KKwlkZWxfdGltZXIoJmNvbnNvbGVfdGltZXIpOworCWJsYW5rX3RpbWVyX2V4cGlyZWQgPSAwOworCisJaWYgKGlnbm9yZV9wb2tlIHx8ICF2Y19jb25zW2ZnX2NvbnNvbGVdLmQgfHwgdmNfY29uc1tmZ19jb25zb2xlXS5kLT52Y19tb2RlID09IEtEX0dSQVBISUNTKQorCQlyZXR1cm47CisJaWYgKGNvbnNvbGVfYmxhbmtlZCkKKwkJdW5ibGFua19zY3JlZW4oKTsKKwllbHNlIGlmIChibGFua2ludGVydmFsKSB7CisJCW1vZF90aW1lcigmY29uc29sZV90aW1lciwgamlmZmllcyArIGJsYW5raW50ZXJ2YWwpOworCQlibGFua19zdGF0ZSA9IGJsYW5rX25vcm1hbF93YWl0OworCX0KK30KKworLyoKKyAqCVBhbGV0dGVzCisgKi8KKworc3RhdGljIHZvaWQgc2V0X3BhbGV0dGUoc3RydWN0IHZjX2RhdGEgKnZjKQoreworCVdBUk5fQ09OU09MRV9VTkxPQ0tFRCgpOworCisJaWYgKHZjLT52Y19tb2RlICE9IEtEX0dSQVBISUNTKQorCQl2Yy0+dmNfc3ctPmNvbl9zZXRfcGFsZXR0ZSh2YywgY29sb3JfdGFibGUpOworfQorCitzdGF0aWMgaW50IHNldF9nZXRfY21hcCh1bnNpZ25lZCBjaGFyIF9fdXNlciAqYXJnLCBpbnQgc2V0KQoreworICAgIGludCBpLCBqLCBrOworCisgICAgV0FSTl9DT05TT0xFX1VOTE9DS0VEKCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwlpZiAoc2V0KSB7CisJICAgIGdldF91c2VyKGRlZmF1bHRfcmVkW2ldLCBhcmcrKyk7CisJICAgIGdldF91c2VyKGRlZmF1bHRfZ3JuW2ldLCBhcmcrKyk7CisJICAgIGdldF91c2VyKGRlZmF1bHRfYmx1W2ldLCBhcmcrKyk7CisJfSBlbHNlIHsKKwkgICAgcHV0X3VzZXIoZGVmYXVsdF9yZWRbaV0sIGFyZysrKTsKKwkgICAgcHV0X3VzZXIoZGVmYXVsdF9ncm5baV0sIGFyZysrKTsKKwkgICAgcHV0X3VzZXIoZGVmYXVsdF9ibHVbaV0sIGFyZysrKTsKKwl9CisgICAgaWYgKHNldCkgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OU09MRVM7IGkrKykKKwkgICAgaWYgKHZjX2NvbnNfYWxsb2NhdGVkKGkpKSB7CisJCWZvciAoaiA9IGsgPSAwOyBqIDwgMTY7IGorKykgeworCQkgICAgdmNfY29uc1tpXS5kLT52Y19wYWxldHRlW2srK10gPSBkZWZhdWx0X3JlZFtqXTsKKwkJICAgIHZjX2NvbnNbaV0uZC0+dmNfcGFsZXR0ZVtrKytdID0gZGVmYXVsdF9ncm5bal07CisJCSAgICB2Y19jb25zW2ldLmQtPnZjX3BhbGV0dGVbaysrXSA9IGRlZmF1bHRfYmx1W2pdOworCQl9CisJCXNldF9wYWxldHRlKHZjX2NvbnNbaV0uZCk7CisJICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb2FkIHBhbGV0dGUgaW50byB0aGUgREFDIHJlZ2lzdGVycy4gYXJnIHBvaW50cyB0byBhIGNvbG91cgorICogbWFwLCAzIGJ5dGVzIHBlciBjb2xvdXIsIDE2IGNvbG91cnMsIHJhbmdlIGZyb20gMCB0byAyNTUuCisgKi8KKworaW50IGNvbl9zZXRfY21hcCh1bnNpZ25lZCBjaGFyIF9fdXNlciAqYXJnKQoreworCWludCByYzsKKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlyYyA9IHNldF9nZXRfY21hcCAoYXJnLDEpOworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKworCXJldHVybiByYzsKK30KKworaW50IGNvbl9nZXRfY21hcCh1bnNpZ25lZCBjaGFyIF9fdXNlciAqYXJnKQoreworCWludCByYzsKKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlyYyA9IHNldF9nZXRfY21hcCAoYXJnLDApOworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKworCXJldHVybiByYzsKK30KKwordm9pZCByZXNldF9wYWxldHRlKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwlpbnQgaiwgazsKKwlmb3IgKGo9az0wOyBqPDE2OyBqKyspIHsKKwkJdmMtPnZjX3BhbGV0dGVbaysrXSA9IGRlZmF1bHRfcmVkW2pdOworCQl2Yy0+dmNfcGFsZXR0ZVtrKytdID0gZGVmYXVsdF9ncm5bal07CisJCXZjLT52Y19wYWxldHRlW2srK10gPSBkZWZhdWx0X2JsdVtqXTsKKwl9CisJc2V0X3BhbGV0dGUodmMpOworfQorCisvKgorICogIEZvbnQgc3dpdGNoaW5nCisgKgorICogIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgZm9udHMgdXAgdG8gMzIgcGl4ZWxzIHdpZGUsIGF0IGEgbWF4aW11bSBoZWlnaHQKKyAqICBvZiAzMiBwaXhlbHMuIFVzZXJzcGFjZSBmb250ZGF0YSBpcyBzdG9yZWQgd2l0aCAzMiBieXRlcyAoc2hvcnRzL2ludHMsIAorICogIGRlcGVuZGluZyBvbiB3aWR0aCkgcmVzZXJ2ZWQgZm9yIGVhY2ggY2hhcmFjdGVyIHdoaWNoIGlzIGtpbmRhIHdhc3R5LCBidXQgCisgKiAgdGhpcyBpcyBkb25lIGluIG9yZGVyIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgRUdBL1ZHQSBmb250cy4gSXQgCisgKiAgaXMgdXB0byB0aGUgYWN0dWFsIGxvdy1sZXZlbCBjb25zb2xlLWRyaXZlciBjb252ZXJ0IGRhdGEgaW50byBpdHMgZmF2b3JpdGUKKyAqICBmb3JtYXQgKG1heWJlIHdlIHNob3VsZCBhZGQgYSBgZm9udG9mZnNldCcgZmllbGQgdG8gdGhlIGBkaXNwbGF5JworICogIHN0cnVjdHVyZSBzbyB3ZSB3b24ndCBoYXZlIHRvIGNvbnZlcnQgdGhlIGZvbnRkYXRhIGFsbCB0aGUgdGltZS4KKyAqICAvSmVzCisgKi8KKworI2RlZmluZSBtYXhfZm9udF9zaXplIDY1NTM2CisKK3N0YXRpYyBpbnQgY29uX2ZvbnRfZ2V0KHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGNvbnNvbGVfZm9udF9vcCAqb3ApCit7CisJc3RydWN0IGNvbnNvbGVfZm9udCBmb250OworCWludCByYyA9IC1FSU5WQUw7CisJaW50IGM7CisKKwlpZiAodmMtPnZjX21vZGUgIT0gS0RfVEVYVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob3AtPmRhdGEpIHsKKwkJZm9udC5kYXRhID0ga21hbGxvYyhtYXhfZm9udF9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFmb250LmRhdGEpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UKKwkJZm9udC5kYXRhID0gTlVMTDsKKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlpZiAodmMtPnZjX3N3LT5jb25fZm9udF9nZXQpCisJCXJjID0gdmMtPnZjX3N3LT5jb25fZm9udF9nZXQodmMsICZmb250KTsKKwllbHNlCisJCXJjID0gLUVOT1NZUzsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJYyA9IChmb250LndpZHRoKzcpLzggKiAzMiAqIGZvbnQuY2hhcmNvdW50OworCQorCWlmIChvcC0+ZGF0YSAmJiBmb250LmNoYXJjb3VudCA+IG9wLT5jaGFyY291bnQpCisJCXJjID0gLUVOT1NQQzsKKwlpZiAoIShvcC0+ZmxhZ3MgJiBLRF9GT05UX0ZMQUdfT0xEKSkgeworCQlpZiAoZm9udC53aWR0aCA+IG9wLT53aWR0aCB8fCBmb250LmhlaWdodCA+IG9wLT5oZWlnaHQpIAorCQkJcmMgPSAtRU5PU1BDOworCX0gZWxzZSB7CisJCWlmIChmb250LndpZHRoICE9IDgpCisJCQlyYyA9IC1FSU87CisJCWVsc2UgaWYgKChvcC0+aGVpZ2h0ICYmIGZvbnQuaGVpZ2h0ID4gb3AtPmhlaWdodCkgfHwKKwkJCSBmb250LmhlaWdodCA+IDMyKQorCQkJcmMgPSAtRU5PU1BDOworCX0KKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJb3AtPmhlaWdodCA9IGZvbnQuaGVpZ2h0OworCW9wLT53aWR0aCA9IGZvbnQud2lkdGg7CisJb3AtPmNoYXJjb3VudCA9IGZvbnQuY2hhcmNvdW50OworCisJaWYgKG9wLT5kYXRhICYmIGNvcHlfdG9fdXNlcihvcC0+ZGF0YSwgZm9udC5kYXRhLCBjKSkKKwkJcmMgPSAtRUZBVUxUOworCitvdXQ6CisJa2ZyZWUoZm9udC5kYXRhKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY29uX2ZvbnRfc2V0KHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGNvbnNvbGVfZm9udF9vcCAqb3ApCit7CisJc3RydWN0IGNvbnNvbGVfZm9udCBmb250OworCWludCByYyA9IC1FSU5WQUw7CisJaW50IHNpemU7CisKKwlpZiAodmMtPnZjX21vZGUgIT0gS0RfVEVYVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFvcC0+ZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG9wLT5jaGFyY291bnQgPiA1MTIpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghb3AtPmhlaWdodCkgewkJLyogTmVlZCB0byBndWVzcyBmb250IGhlaWdodCBbY29tcGF0XSAqLworCQlpbnQgaCwgaTsKKwkJdTggX191c2VyICpjaGFybWFwID0gb3AtPmRhdGE7CisJCXU4IHRtcDsKKwkJCisJCS8qIElmIGZyb20gS0RGT05UT1AgaW9jdGwsIGRvbid0IGFsbG93IHRoaW5ncyB3aGljaCBjYW4gYmUgZG9uZSBpbiB1c2VybGFuZCwKKwkJICAgc28gdGhhdCB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGlzIHNvb24gKi8KKwkJaWYgKCEob3AtPmZsYWdzICYgS0RfRk9OVF9GTEFHX09MRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZm9yIChoID0gMzI7IGggPiAwOyBoLS0pCisJCQlmb3IgKGkgPSAwOyBpIDwgb3AtPmNoYXJjb3VudDsgaSsrKSB7CisJCQkJaWYgKGdldF91c2VyKHRtcCwgJmNoYXJtYXBbMzIqaStoLTFdKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKHRtcCkKKwkJCQkJZ290byBub256ZXJvOworCQkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwlub256ZXJvOgorCQlvcC0+aGVpZ2h0ID0gaDsKKwl9CisJaWYgKG9wLT53aWR0aCA8PSAwIHx8IG9wLT53aWR0aCA+IDMyIHx8IG9wLT5oZWlnaHQgPiAzMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJc2l6ZSA9IChvcC0+d2lkdGgrNykvOCAqIDMyICogb3AtPmNoYXJjb3VudDsKKwlpZiAoc2l6ZSA+IG1heF9mb250X3NpemUpCisJCXJldHVybiAtRU5PU1BDOworCWZvbnQuY2hhcmNvdW50ID0gb3AtPmNoYXJjb3VudDsKKwlmb250LmhlaWdodCA9IG9wLT5oZWlnaHQ7CisJZm9udC53aWR0aCA9IG9wLT53aWR0aDsKKwlmb250LmRhdGEgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghZm9udC5kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoY29weV9mcm9tX3VzZXIoZm9udC5kYXRhLCBvcC0+ZGF0YSwgc2l6ZSkpIHsKKwkJa2ZyZWUoZm9udC5kYXRhKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlpZiAodmMtPnZjX3N3LT5jb25fZm9udF9zZXQpCisJCXJjID0gdmMtPnZjX3N3LT5jb25fZm9udF9zZXQodmMsICZmb250LCBvcC0+ZmxhZ3MpOworCWVsc2UKKwkJcmMgPSAtRU5PU1lTOworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwlrZnJlZShmb250LmRhdGEpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjb25fZm9udF9kZWZhdWx0KHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGNvbnNvbGVfZm9udF9vcCAqb3ApCit7CisJc3RydWN0IGNvbnNvbGVfZm9udCBmb250ID0gey53aWR0aCA9IG9wLT53aWR0aCwgLmhlaWdodCA9IG9wLT5oZWlnaHR9OworCWNoYXIgbmFtZVtNQVhfRk9OVF9OQU1FXTsKKwljaGFyICpzID0gbmFtZTsKKwlpbnQgcmM7CisKKwlpZiAodmMtPnZjX21vZGUgIT0gS0RfVEVYVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIW9wLT5kYXRhKQorCQlzID0gTlVMTDsKKwllbHNlIGlmIChzdHJuY3B5X2Zyb21fdXNlcihuYW1lLCBvcC0+ZGF0YSwgTUFYX0ZPTlRfTkFNRSAtIDEpIDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZWxzZQorCQluYW1lW01BWF9GT05UX05BTUUgLSAxXSA9IDA7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJaWYgKHZjLT52Y19zdy0+Y29uX2ZvbnRfZGVmYXVsdCkKKwkJcmMgPSB2Yy0+dmNfc3ctPmNvbl9mb250X2RlZmF1bHQodmMsICZmb250LCBzKTsKKwllbHNlCisJCXJjID0gLUVOT1NZUzsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJaWYgKCFyYykgeworCQlvcC0+d2lkdGggPSBmb250LndpZHRoOworCQlvcC0+aGVpZ2h0ID0gZm9udC5oZWlnaHQ7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjb25fZm9udF9jb3B5KHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGNvbnNvbGVfZm9udF9vcCAqb3ApCit7CisJaW50IGNvbiA9IG9wLT5oZWlnaHQ7CisJaW50IHJjOworCisJaWYgKHZjLT52Y19tb2RlICE9IEtEX1RFWFQpCisJCXJldHVybiAtRUlOVkFMOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWlmICghdmMtPnZjX3N3LT5jb25fZm9udF9jb3B5KQorCQlyYyA9IC1FTk9TWVM7CisJZWxzZSBpZiAoY29uIDwgMCB8fCAhdmNfY29uc19hbGxvY2F0ZWQoY29uKSkKKwkJcmMgPSAtRU5PVFRZOworCWVsc2UgaWYgKGNvbiA9PSB2Yy0+dmNfbnVtKQkvKiBub3RoaW5nIHRvIGRvICovCisJCXJjID0gMDsKKwllbHNlCisJCXJjID0gdmMtPnZjX3N3LT5jb25fZm9udF9jb3B5KHZjLCBjb24pOworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjb25fZm9udF9vcChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBjb25zb2xlX2ZvbnRfb3AgKm9wKQoreworCXN3aXRjaCAob3AtPm9wKSB7CisJY2FzZSBLRF9GT05UX09QX1NFVDoKKwkJcmV0dXJuIGNvbl9mb250X3NldCh2Yywgb3ApOworCWNhc2UgS0RfRk9OVF9PUF9HRVQ6CisJCXJldHVybiBjb25fZm9udF9nZXQodmMsIG9wKTsKKwljYXNlIEtEX0ZPTlRfT1BfU0VUX0RFRkFVTFQ6CisJCXJldHVybiBjb25fZm9udF9kZWZhdWx0KHZjLCBvcCk7CisJY2FzZSBLRF9GT05UX09QX0NPUFk6CisJCXJldHVybiBjb25fZm9udF9jb3B5KHZjLCBvcCk7CisJfQorCXJldHVybiAtRU5PU1lTOworfQorCisvKgorICoJSW50ZXJmYWNlIGV4cG9ydGVkIHRvIHNlbGVjdGlvbiBhbmQgdmNzLgorICovCisKKy8qIHVzZWQgYnkgc2VsZWN0aW9uICovCit1MTYgc2NyZWVuX2dseXBoKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IG9mZnNldCkKK3sKKwl1MTYgdyA9IHNjcl9yZWFkdyhzY3JlZW5wb3ModmMsIG9mZnNldCwgMSkpOworCXUxNiBjID0gdyAmIDB4ZmY7CisKKwlpZiAodyAmIHZjLT52Y19oaV9mb250X21hc2spCisJCWMgfD0gMHgxMDA7CisJcmV0dXJuIGM7Cit9CisKKy8qIHVzZWQgYnkgdmNzIC0gbm90ZSB0aGUgd29yZCBvZmZzZXQgKi8KK3Vuc2lnbmVkIHNob3J0ICpzY3JlZW5fcG9zKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IHdfb2Zmc2V0LCBpbnQgdmlld2VkKQoreworCXJldHVybiBzY3JlZW5wb3ModmMsIDIgKiB3X29mZnNldCwgdmlld2VkKTsKK30KKwordm9pZCBnZXRjb25zeHkoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyICpwKQoreworCXBbMF0gPSB2Yy0+dmNfeDsKKwlwWzFdID0gdmMtPnZjX3k7Cit9CisKK3ZvaWQgcHV0Y29uc3h5KHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciAqcCkKK3sKKwlnb3RveHkodmMsIHBbMF0sIHBbMV0pOworCXNldF9jdXJzb3IodmMpOworfQorCit1MTYgdmNzX3Njcl9yZWFkdyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIGNvbnN0IHUxNiAqb3JnKQoreworCWlmICgodW5zaWduZWQgbG9uZylvcmcgPT0gdmMtPnZjX3BvcyAmJiBzb2Z0Y3Vyc29yX29yaWdpbmFsICE9IC0xKQorCQlyZXR1cm4gc29mdGN1cnNvcl9vcmlnaW5hbDsKKwlyZXR1cm4gc2NyX3JlYWR3KG9yZyk7Cit9CisKK3ZvaWQgdmNzX3Njcl93cml0ZXcoc3RydWN0IHZjX2RhdGEgKnZjLCB1MTYgdmFsLCB1MTYgKm9yZykKK3sKKwlzY3Jfd3JpdGV3KHZhbCwgb3JnKTsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpb3JnID09IHZjLT52Y19wb3MpIHsKKwkJc29mdGN1cnNvcl9vcmlnaW5hbCA9IC0xOworCQlhZGRfc29mdGN1cnNvcih2Yyk7CisJfQorfQorCisvKgorICoJVmlzaWJsZSBzeW1ib2xzIGZvciBtb2R1bGVzCisgKi8KKworRVhQT1JUX1NZTUJPTChjb2xvcl90YWJsZSk7CitFWFBPUlRfU1lNQk9MKGRlZmF1bHRfcmVkKTsKK0VYUE9SVF9TWU1CT0woZGVmYXVsdF9ncm4pOworRVhQT1JUX1NZTUJPTChkZWZhdWx0X2JsdSk7CitFWFBPUlRfU1lNQk9MKHVwZGF0ZV9yZWdpb24pOworRVhQT1JUX1NZTUJPTChyZWRyYXdfc2NyZWVuKTsKK0VYUE9SVF9TWU1CT0wodmNfcmVzaXplKTsKK0VYUE9SVF9TWU1CT0woZmdfY29uc29sZSk7CitFWFBPUlRfU1lNQk9MKGNvbnNvbGVfYmxhbmtfaG9vayk7CitFWFBPUlRfU1lNQk9MKGNvbnNvbGVfYmxhbmtlZCk7CitFWFBPUlRfU1lNQk9MKHZjX2NvbnMpOworI2lmbmRlZiBWVF9TSU5HTEVfRFJJVkVSCitFWFBPUlRfU1lNQk9MKHRha2Vfb3Zlcl9jb25zb2xlKTsKK0VYUE9SVF9TWU1CT0woZ2l2ZV91cF9jb25zb2xlKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Z0X2lvY3RsLmMgYi9kcml2ZXJzL2NoYXIvdnRfaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDM4NmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Z0X2lvY3RsLmMKQEAgLTAsMCArMSwxMjAxIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvY2hhci92dF9pb2N0bC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MiBvYnogdW5kZXIgdGhlIGxpbnV4IGNvcHlyaWdodAorICoKKyAqICBEeW5hbWljIGRpYWNyaXRpY2FsIGhhbmRsaW5nIC0gYWViQGN3aS5ubCAtIERlYyAxOTkzCisgKiAgRHluYW1pYyBrZXltYXAgYW5kIHN0cmluZyBhbGxvY2F0aW9uIC0gYWViQGN3aS5ubCAtIE1heSAxOTk0CisgKiAgUmVzdHJpY3QgVlQgc3dpdGNoaW5nIHZpYSBpb2N0bCgpIC0gZ3JpZkBjcy51Y3IuZWR1IC0gRGVjIDE5OTUKKyAqICBTb21lIGNvZGUgbW92ZWQgZm9yIGxlc3MgY29kZSBkdXBsaWNhdGlvbiAtIEFuZGkgS2xlZW4gLSBNYXIgMTk5NworICogIENoZWNrIHB1dC9nZXRfdXNlciwgY2xlYW51cHMgLSBhY21lQGNvbmVjdGl2YS5jb20uYnIgLSBKdW4gMjAwMQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2tkLmg+CisjaW5jbHVkZSA8bGludXgvdnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rYmRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9rYmRfZGlhY3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWxlY3Rpb24uaD4KKworc3RhdGljIGNoYXIgdnRfZG9udF9zd2l0Y2g7CitleHRlcm4gc3RydWN0IHR0eV9kcml2ZXIgKmNvbnNvbGVfZHJpdmVyOworCisjZGVmaW5lIFZUX0lTX0lOX1VTRShpKQkoY29uc29sZV9kcml2ZXItPnR0eXNbaV0gJiYgY29uc29sZV9kcml2ZXItPnR0eXNbaV0tPmNvdW50KQorI2RlZmluZSBWVF9CVVNZKGkpCShWVF9JU19JTl9VU0UoaSkgfHwgaSA9PSBmZ19jb25zb2xlIHx8IHZjX2NvbnNbaV0uZCA9PSBzZWxfY29ucykKKworLyoKKyAqIENvbnNvbGUgKHZ0IGFuZCBrZCkgcm91dGluZXMsIGFzIGRlZmluZWQgYnkgVVNMIFNWUjQgbWFudWFsLCBhbmQgYnkKKyAqIGV4cGVyaW1lbnRhdGlvbiBhbmQgc3R1ZHkgb2YgWDM4NiBTWVNWIGhhbmRsaW5nLgorICoKKyAqIE9uZSBwb2ludCBvZiBkaWZmZXJlbmNlOiBTWVNWIHZ0J3MgYXJlIC9kZXYvdnRYLCB3aGljaCBYID49IDAsIGFuZAorICogL2Rldi9jb25zb2xlIGlzIGEgc2VwYXJhdGUgdHR5cC4gVW5kZXIgTGludXgsIC9kZXYvdHR5MCBpcyAvZGV2L2NvbnNvbGUsCisgKiBhbmQgdGhlIHZjIHN0YXJ0IGF0IC9kZXYvdHR5WCwgWCA+PSAxLiBXZSBtYWludGFpbiB0aGF0IGhlcmUsIHNvIHdlIHdpbGwKKyAqIGFsd2F5cyB0cmVhdCBvdXIgc2V0IG9mIHZ0IGFzIG51bWJlcmVkIDEuLk1BWF9OUl9DT05TT0xFUyAoY29ycmVzcG9uZGluZyB0bworICogdHR5cyAwLi5NQVhfTlJfQ09OU09MRVMtMSkuIEV4cGxpY2l0bHkgbmFtaW5nIFZUIDAgaXMgaWxsZWdhbCwgYnV0IHVzaW5nCisgKiAvZGV2L3R0eTAgKGZnX2NvbnNvbGUpIGFzIGEgdGFyZ2V0IGlzIGxlZ2FsLCBzaW5jZSBhbiBpbXBsaWNpdCBhbGlhc2luZworICogdG8gdGhlIGN1cnJlbnQgY29uc29sZSBpcyBkb25lIGJ5IHRoZSBtYWluIGlvY3RsIGNvZGUuCisgKi8KKworI2lmZGVmIENPTkZJR19YODYKKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNvbXBsZXRlX2NoYW5nZV9jb25zb2xlKHN0cnVjdCB2Y19kYXRhICp2Yyk7CisKKy8qCisgKiB0aGVzZSBhcmUgdGhlIHZhbGlkIGkvbyBwb3J0cyB3ZSdyZSBhbGxvd2VkIHRvIGNoYW5nZS4gdGhleSBtYXAgYWxsIHRoZQorICogdmlkZW8gcG9ydHMKKyAqLworI2RlZmluZSBHUEZJUlNUIDB4M2I0CisjZGVmaW5lIEdQTEFTVCAweDNkZgorI2RlZmluZSBHUE5VTSAoR1BMQVNUIC0gR1BGSVJTVCArIDEpCisKKyNkZWZpbmUgaSAodG1wLmtiX2luZGV4KQorI2RlZmluZSBzICh0bXAua2JfdGFibGUpCisjZGVmaW5lIHYgKHRtcC5rYl92YWx1ZSkKK3N0YXRpYyBpbmxpbmUgaW50Citkb19rZHNrX2lvY3RsKGludCBjbWQsIHN0cnVjdCBrYmVudHJ5IF9fdXNlciAqdXNlcl9rYmUsIGludCBwZXJtLCBzdHJ1Y3Qga2JkX3N0cnVjdCAqa2JkKQoreworCXN0cnVjdCBrYmVudHJ5IHRtcDsKKwl1c2hvcnQgKmtleV9tYXAsIHZhbCwgb3Y7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlcl9rYmUsIHNpemVvZihzdHJ1Y3Qga2JlbnRyeSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBLREdLQkVOVDoKKwkJa2V5X21hcCA9IGtleV9tYXBzW3NdOworCQlpZiAoa2V5X21hcCkgeworCQkgICAgdmFsID0gVShrZXlfbWFwW2ldKTsKKwkJICAgIGlmIChrYmQtPmtiZG1vZGUgIT0gVkNfVU5JQ09ERSAmJiBLVFlQKHZhbCkgPj0gTlJfVFlQRVMpCisJCQl2YWwgPSBLX0hPTEU7CisJCX0gZWxzZQorCQkgICAgdmFsID0gKGkgPyBLX0hPTEUgOiBLX05PU1VDSE1BUCk7CisJCXJldHVybiBwdXRfdXNlcih2YWwsICZ1c2VyX2tiZS0+a2JfdmFsdWUpOworCWNhc2UgS0RTS0JFTlQ6CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmICghaSAmJiB2ID09IEtfTk9TVUNITUFQKSB7CisJCQkvKiBkaXNhbGxvY2F0ZSBtYXAgKi8KKwkJCWtleV9tYXAgPSBrZXlfbWFwc1tzXTsKKwkJCWlmIChzICYmIGtleV9tYXApIHsKKwkJCSAgICBrZXlfbWFwc1tzXSA9IE5VTEw7CisJCQkgICAgaWYgKGtleV9tYXBbMF0gPT0gVShLX0FMTE9DQVRFRCkpIHsKKwkJCQkJa2ZyZWUoa2V5X21hcCk7CisJCQkJCWtleW1hcF9jb3VudC0tOworCQkJICAgIH0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKEtUWVAodikgPCBOUl9UWVBFUykgeworCQkgICAgaWYgKEtWQUwodikgPiBtYXhfdmFsc1tLVFlQKHYpXSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlCisJCSAgICBpZiAoa2JkLT5rYmRtb2RlICE9IFZDX1VOSUNPREUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogKytHZWVydDogbm9uLVBDIGtleWJvYXJkcyBtYXkgZ2VuZXJhdGUga2V5Y29kZSB6ZXJvICovCisjaWYgIWRlZmluZWQoX19tYzY4MDAwX18pICYmICFkZWZpbmVkKF9fcG93ZXJwY19fKQorCQkvKiBhc3NpZ25tZW50IHRvIGVudHJ5IDAgb25seSB0ZXN0cyB2YWxpZGl0eSBvZiBhcmdzICovCisJCWlmICghaSkKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJaWYgKCEoa2V5X21hcCA9IGtleV9tYXBzW3NdKSkgeworCQkJaW50IGo7CisKKwkJCWlmIChrZXltYXBfY291bnQgPj0gTUFYX05SX09GX1VTRVJfS0VZTUFQUyAmJgorCQkJICAgICFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQorCQkJCXJldHVybiAtRVBFUk07CisKKwkJCWtleV9tYXAgPSAodXNob3J0ICopIGttYWxsb2Moc2l6ZW9mKHBsYWluX21hcCksCisJCQkJCQkgICAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFrZXlfbWFwKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJa2V5X21hcHNbc10gPSBrZXlfbWFwOworCQkJa2V5X21hcFswXSA9IFUoS19BTExPQ0FURUQpOworCQkJZm9yIChqID0gMTsgaiA8IE5SX0tFWVM7IGorKykKKwkJCQlrZXlfbWFwW2pdID0gVShLX0hPTEUpOworCQkJa2V5bWFwX2NvdW50Kys7CisJCX0KKwkJb3YgPSBVKGtleV9tYXBbaV0pOworCQlpZiAodiA9PSBvdikKKwkJCWJyZWFrOwkvKiBub3RoaW5nIHRvIGRvICovCisJCS8qCisJCSAqIEF0dGVudGlvbiBLZXkuCisJCSAqLworCQlpZiAoKChvdiA9PSBLX1NBSykgfHwgKHYgPT0gS19TQUspKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWtleV9tYXBbaV0gPSBVKHYpOworCQlpZiAoIXMgJiYgKEtUWVAob3YpID09IEtUX1NISUZUIHx8IEtUWVAodikgPT0gS1RfU0hJRlQpKQorCQkJY29tcHV0ZV9zaGlmdHN0YXRlKCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKyN1bmRlZiBpCisjdW5kZWYgcworI3VuZGVmIHYKKworc3RhdGljIGlubGluZSBpbnQgCitkb19rYmtleWNvZGVfaW9jdGwoaW50IGNtZCwgc3RydWN0IGtia2V5Y29kZSBfX3VzZXIgKnVzZXJfa2JrYywgaW50IHBlcm0pCit7CisJc3RydWN0IGtia2V5Y29kZSB0bXA7CisJaW50IGtjID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyX2tia2MsIHNpemVvZihzdHJ1Y3Qga2JrZXljb2RlKSkpCisJCXJldHVybiAtRUZBVUxUOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBLREdFVEtFWUNPREU6CisJCWtjID0gZ2V0a2V5Y29kZSh0bXAuc2NhbmNvZGUpOworCQlpZiAoa2MgPj0gMCkKKwkJCWtjID0gcHV0X3VzZXIoa2MsICZ1c2VyX2tia2MtPmtleWNvZGUpOworCQlicmVhazsKKwljYXNlIEtEU0VUS0VZQ09ERToKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJa2MgPSBzZXRrZXljb2RlKHRtcC5zY2FuY29kZSwgdG1wLmtleWNvZGUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGtjOworfQorCitzdGF0aWMgaW5saW5lIGludAorZG9fa2Rna2JfaW9jdGwoaW50IGNtZCwgc3RydWN0IGtic2VudHJ5IF9fdXNlciAqdXNlcl9rZGdrYiwgaW50IHBlcm0pCit7CisJc3RydWN0IGtic2VudHJ5ICprYnM7CisJY2hhciAqcDsKKwl1X2NoYXIgKnE7CisJdV9jaGFyIF9fdXNlciAqdXA7CisJaW50IHN6OworCWludCBkZWx0YTsKKwljaGFyICpmaXJzdF9mcmVlLCAqZmosICpmbnc7CisJaW50IGksIGosIGs7CisJaW50IHJldDsKKworCWticyA9IGttYWxsb2Moc2l6ZW9mKCprYnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWticykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHJldGVycjsKKwl9CisKKwkvKiB3ZSBtb3N0bHkgY29weSB0b28gbXVjaCBoZXJlICg1MTJieXRlcyksIGJ1dCB3aG8gY2FyZXMgOykgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoa2JzLCB1c2VyX2tkZ2tiLCBzaXplb2Yoc3RydWN0IGtic2VudHJ5KSkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byByZXRlcnI7CisJfQorCWticy0+a2Jfc3RyaW5nW3NpemVvZihrYnMtPmtiX3N0cmluZyktMV0gPSAnXDAnOworCWkgPSBrYnMtPmtiX2Z1bmM7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgS0RHS0JTRU5UOgorCQlzeiA9IHNpemVvZihrYnMtPmtiX3N0cmluZykgLSAxOyAvKiBzeiBzaG91bGQgaGF2ZSBiZWVuCisJCQkJCQkgIGEgc3RydWN0IG1lbWJlciAqLworCQl1cCA9IHVzZXJfa2Rna2ItPmtiX3N0cmluZzsKKwkJcCA9IGZ1bmNfdGFibGVbaV07CisJCWlmKHApCisJCQlmb3IgKCA7ICpwICYmIHN6OyBwKyssIHN6LS0pCisJCQkJaWYgKHB1dF91c2VyKCpwLCB1cCsrKSkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQlnb3RvIHJldGVycjsKKwkJCQl9CisJCWlmIChwdXRfdXNlcignXDAnLCB1cCkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIHJldGVycjsKKwkJfQorCQlrZnJlZShrYnMpOworCQlyZXR1cm4gKChwICYmICpwKSA/IC1FT1ZFUkZMT1cgOiAwKTsKKwljYXNlIEtEU0tCU0VOVDoKKwkJaWYgKCFwZXJtKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlnb3RvIHJldGVycjsKKwkJfQorCisJCXEgPSBmdW5jX3RhYmxlW2ldOworCQlmaXJzdF9mcmVlID0gZnVuY2J1ZnB0ciArIChmdW5jYnVmc2l6ZSAtIGZ1bmNidWZsZWZ0KTsKKwkJZm9yIChqID0gaSsxOyBqIDwgTUFYX05SX0ZVTkMgJiYgIWZ1bmNfdGFibGVbal07IGorKykgCisJCQk7CisJCWlmIChqIDwgTUFYX05SX0ZVTkMpCisJCQlmaiA9IGZ1bmNfdGFibGVbal07CisJCWVsc2UKKwkJCWZqID0gZmlyc3RfZnJlZTsKKworCQlkZWx0YSA9IChxID8gLXN0cmxlbihxKSA6IDEpICsgc3RybGVuKGticy0+a2Jfc3RyaW5nKTsKKwkJaWYgKGRlbHRhIDw9IGZ1bmNidWZsZWZ0KSB7IAkvKiBpdCBmaXRzIGluIGN1cnJlbnQgYnVmICovCisJCSAgICBpZiAoaiA8IE1BWF9OUl9GVU5DKSB7CisJCQltZW1tb3ZlKGZqICsgZGVsdGEsIGZqLCBmaXJzdF9mcmVlIC0gZmopOworCQkJZm9yIChrID0gajsgayA8IE1BWF9OUl9GVU5DOyBrKyspCisJCQkgICAgaWYgKGZ1bmNfdGFibGVba10pCisJCQkJZnVuY190YWJsZVtrXSArPSBkZWx0YTsKKwkJICAgIH0KKwkJICAgIGlmICghcSkKKwkJICAgICAgZnVuY190YWJsZVtpXSA9IGZqOworCQkgICAgZnVuY2J1ZmxlZnQgLT0gZGVsdGE7CisJCX0gZWxzZSB7CQkJLyogYWxsb2NhdGUgYSBsYXJnZXIgYnVmZmVyICovCisJCSAgICBzeiA9IDI1NjsKKwkJICAgIHdoaWxlIChzeiA8IGZ1bmNidWZzaXplIC0gZnVuY2J1ZmxlZnQgKyBkZWx0YSkKKwkJICAgICAgc3ogPDw9IDE7CisJCSAgICBmbncgPSAoY2hhciAqKSBrbWFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwkJICAgIGlmKCFmbncpIHsKKwkJICAgICAgcmV0ID0gLUVOT01FTTsKKwkJICAgICAgZ290byByZXRlcnI7CisJCSAgICB9CisKKwkJICAgIGlmICghcSkKKwkJICAgICAgZnVuY190YWJsZVtpXSA9IGZqOworCQkgICAgaWYgKGZqID4gZnVuY2J1ZnB0cikKKwkJCW1lbW1vdmUoZm53LCBmdW5jYnVmcHRyLCBmaiAtIGZ1bmNidWZwdHIpOworCQkgICAgZm9yIChrID0gMDsgayA8IGo7IGsrKykKKwkJICAgICAgaWYgKGZ1bmNfdGFibGVba10pCisJCQlmdW5jX3RhYmxlW2tdID0gZm53ICsgKGZ1bmNfdGFibGVba10gLSBmdW5jYnVmcHRyKTsKKworCQkgICAgaWYgKGZpcnN0X2ZyZWUgPiBmaikgeworCQkJbWVtbW92ZShmbncgKyAoZmogLSBmdW5jYnVmcHRyKSArIGRlbHRhLCBmaiwgZmlyc3RfZnJlZSAtIGZqKTsKKwkJCWZvciAoayA9IGo7IGsgPCBNQVhfTlJfRlVOQzsgaysrKQorCQkJICBpZiAoZnVuY190YWJsZVtrXSkKKwkJCSAgICBmdW5jX3RhYmxlW2tdID0gZm53ICsgKGZ1bmNfdGFibGVba10gLSBmdW5jYnVmcHRyKSArIGRlbHRhOworCQkgICAgfQorCQkgICAgaWYgKGZ1bmNidWZwdHIgIT0gZnVuY19idWYpCisJCSAgICAgIGtmcmVlKGZ1bmNidWZwdHIpOworCQkgICAgZnVuY2J1ZnB0ciA9IGZudzsKKwkJICAgIGZ1bmNidWZsZWZ0ID0gZnVuY2J1ZmxlZnQgLSBkZWx0YSArIHN6IC0gZnVuY2J1ZnNpemU7CisJCSAgICBmdW5jYnVmc2l6ZSA9IHN6OworCQl9CisJCXN0cmNweShmdW5jX3RhYmxlW2ldLCBrYnMtPmtiX3N0cmluZyk7CisJCWJyZWFrOworCX0KKwlyZXQgPSAwOworcmV0ZXJyOgorCWtmcmVlKGticyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgCitkb19mb250eF9pb2N0bChpbnQgY21kLCBzdHJ1Y3QgY29uc29sZWZvbnRkZXNjIF9fdXNlciAqdXNlcl9jZmQsIGludCBwZXJtLCBzdHJ1Y3QgY29uc29sZV9mb250X29wICpvcCkKK3sKKwlzdHJ1Y3QgY29uc29sZWZvbnRkZXNjIGNmZGFyZzsKKwlpbnQgaTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZkYXJnLCB1c2VyX2NmZCwgc2l6ZW9mKHN0cnVjdCBjb25zb2xlZm9udGRlc2MpKSkgCisJCXJldHVybiAtRUZBVUxUOworIAkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUElPX0ZPTlRYOgorCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlvcC0+b3AgPSBLRF9GT05UX09QX1NFVDsKKwkJb3AtPmZsYWdzID0gS0RfRk9OVF9GTEFHX09MRDsKKwkJb3AtPndpZHRoID0gODsKKwkJb3AtPmhlaWdodCA9IGNmZGFyZy5jaGFyaGVpZ2h0OworCQlvcC0+Y2hhcmNvdW50ID0gY2ZkYXJnLmNoYXJjb3VudDsKKwkJb3AtPmRhdGEgPSBjZmRhcmcuY2hhcmRhdGE7CisJCXJldHVybiBjb25fZm9udF9vcCh2Y19jb25zW2ZnX2NvbnNvbGVdLmQsIG9wKTsKKwljYXNlIEdJT19GT05UWDogeworCQlvcC0+b3AgPSBLRF9GT05UX09QX0dFVDsKKwkJb3AtPmZsYWdzID0gS0RfRk9OVF9GTEFHX09MRDsKKwkJb3AtPndpZHRoID0gODsKKwkJb3AtPmhlaWdodCA9IGNmZGFyZy5jaGFyaGVpZ2h0OworCQlvcC0+Y2hhcmNvdW50ID0gY2ZkYXJnLmNoYXJjb3VudDsKKwkJb3AtPmRhdGEgPSBjZmRhcmcuY2hhcmRhdGE7CisJCWkgPSBjb25fZm9udF9vcCh2Y19jb25zW2ZnX2NvbnNvbGVdLmQsIG9wKTsKKwkJaWYgKGkpCisJCQlyZXR1cm4gaTsKKwkJY2ZkYXJnLmNoYXJoZWlnaHQgPSBvcC0+aGVpZ2h0OworCQljZmRhcmcuY2hhcmNvdW50ID0gb3AtPmNoYXJjb3VudDsKKwkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2NmZCwgJmNmZGFyZywgc2l6ZW9mKHN0cnVjdCBjb25zb2xlZm9udGRlc2MpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgCitkb191bmltYXBfaW9jdGwoaW50IGNtZCwgc3RydWN0IHVuaW1hcGRlc2MgX191c2VyICp1c2VyX3VkLCBpbnQgcGVybSwgc3RydWN0IHZjX2RhdGEgKnZjKQoreworCXN0cnVjdCB1bmltYXBkZXNjIHRtcDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyX3VkLCBzaXplb2YgdG1wKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHRtcC5lbnRyaWVzKQorCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRtcC5lbnRyaWVzLAorCQkJCXRtcC5lbnRyeV9jdCpzaXplb2Yoc3RydWN0IHVuaXBhaXIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQSU9fVU5JTUFQOgorCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlyZXR1cm4gY29uX3NldF91bmltYXAodmMsIHRtcC5lbnRyeV9jdCwgdG1wLmVudHJpZXMpOworCWNhc2UgR0lPX1VOSU1BUDoKKwkJaWYgKCFwZXJtICYmIGZnX2NvbnNvbGUgIT0gdmMtPnZjX251bSkKKwkJCXJldHVybiAtRVBFUk07CisJCXJldHVybiBjb25fZ2V0X3VuaW1hcCh2YywgdG1wLmVudHJ5X2N0LCAmKHVzZXJfdWQtPmVudHJ5X2N0KSwgdG1wLmVudHJpZXMpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIGhhbmRsZSB0aGUgY29uc29sZS1zcGVjaWZpYyBpb2N0bCdzIGhlcmUuICBXZSBhbGxvdyB0aGUKKyAqIGNhcGFiaWxpdHkgdG8gbW9kaWZ5IGFueSBjb25zb2xlLCBub3QganVzdCB0aGUgZmdfY29uc29sZS4gCisgKi8KK2ludCB2dF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdmNfZGF0YSAqdmMgPSAoc3RydWN0IHZjX2RhdGEgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBjb25zb2xlX2ZvbnRfb3Agb3A7CS8qIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzIGhlcmUgKi8KKwlzdHJ1Y3Qga2JkX3N0cnVjdCAqIGtiZDsKKwl1bnNpZ25lZCBpbnQgY29uc29sZTsKKwl1bnNpZ25lZCBjaGFyIHVjdmFsOworCXZvaWQgX191c2VyICp1cCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgaSwgcGVybTsKKwkKKwljb25zb2xlID0gdmMtPnZjX251bTsKKworCWlmICghdmNfY29uc19hbGxvY2F0ZWQoY29uc29sZSkpIAkvKiBpbXBvc3NpYmxlPyAqLworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJLyoKKwkgKiBUbyBoYXZlIHBlcm1pc3Npb25zIHRvIGRvIG1vc3Qgb2YgdGhlIHZ0IGlvY3Rscywgd2UgZWl0aGVyIGhhdmUKKwkgKiB0byBiZSB0aGUgb3duZXIgb2YgdGhlIHR0eSwgb3IgaGF2ZSBDQVBfU1lTX1RUWV9DT05GSUcuCisJICovCisJcGVybSA9IDA7CisJaWYgKGN1cnJlbnQtPnNpZ25hbC0+dHR5ID09IHR0eSB8fCBjYXBhYmxlKENBUF9TWVNfVFRZX0NPTkZJRykpCisJCXBlcm0gPSAxOworIAorCWtiZCA9IGtiZF90YWJsZSArIGNvbnNvbGU7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEtJT0NTT1VORDoKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGFyZykKKwkJCWFyZyA9IDExOTMxODIgLyBhcmc7CisJCWtkX21rc291bmQoYXJnLCAwKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEtETUtUT05FOgorCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCXsKKwkJdW5zaWduZWQgaW50IHRpY2tzLCBjb3VudDsKKwkJCisJCS8qCisJCSAqIEdlbmVyYXRlIHRoZSB0b25lIGZvciB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIHRpY2tzLgorCQkgKiBJZiB0aGUgdGltZSBpcyB6ZXJvLCB0dXJuIG9mZiBzb3VuZCBvdXJzZWx2ZXMuCisJCSAqLworCQl0aWNrcyA9IEhaICogKChhcmcgPj4gMTYpICYgMHhmZmZmKSAvIDEwMDA7CisJCWNvdW50ID0gdGlja3MgPyAoYXJnICYgMHhmZmZmKSA6IDA7CisJCWlmIChjb3VudCkKKwkJCWNvdW50ID0gMTE5MzE4MiAvIGNvdW50OworCQlrZF9ta3NvdW5kKGNvdW50LCB0aWNrcyk7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgS0RHS0JUWVBFOgorCQkvKgorCQkgKiB0aGlzIGlzIG5haXZlLgorCQkgKi8KKwkJdWN2YWwgPSBLQl8xMDE7CisJCWdvdG8gc2V0Y2hhcjsKKworCQkvKgorCQkgKiBUaGVzZSBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgb24gYW55IG1hY2hpbmUgdGhhdCBpbXBsZW1lbnRzCisJCSAqIGlvcGVybSgpIGluIHVzZXIgbGV2ZWwgKHN1Y2ggYXMgQWxwaGEgUENzKSBvciBub3QgYXQgYWxsLgorCQkgKgorCQkgKiBYWFg6IHlvdSBzaG91bGQgbmV2ZXIgdXNlIHRoZXNlLCBqdXN0IGNhbGwgaW9wZXJtIGRpcmVjdGx5Li4KKwkJICovCisjaWZkZWYgQ09ORklHX1g4NgorCWNhc2UgS0RBRERJTzoKKwljYXNlIEtEREVMSU86CisJCS8qCisJCSAqIEtEQURESU8gYW5kIEtEREVMSU8gbWF5IGJlIGFibGUgdG8gYWRkIHBvcnRzIGJleW9uZCB3aGF0CisJCSAqIHdlIHJlamVjdCBoZXJlLCBidXQgdG8gYmUgc2FmZS4uLgorCQkgKi8KKwkJaWYgKGFyZyA8IEdQRklSU1QgfHwgYXJnID4gR1BMQVNUKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBzeXNfaW9wZXJtKGFyZywgMSwgKGNtZCA9PSBLREFERElPKSkgPyAtRU5YSU8gOiAwOworCisJY2FzZSBLREVOQUJJTzoKKwljYXNlIEtERElTQUJJTzoKKwkJcmV0dXJuIHN5c19pb3Blcm0oR1BGSVJTVCwgR1BOVU0sCisJCQkJICAoY21kID09IEtERU5BQklPKSkgPyAtRU5YSU8gOiAwOworI2VuZGlmCisKKwkvKiBMaW51eCBtNjhrL2kzODYgaW50ZXJmYWNlIGZvciBzZXR0aW5nIHRoZSBrZXlib2FyZCBkZWxheS9yZXBlYXQgcmF0ZSAqLworCQkKKwljYXNlIEtES0JEUkVQOgorCXsKKwkJc3RydWN0IGtiZF9yZXBlYXQga2JyZXA7CisJCWludCBlcnI7CisJCQorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19UVFlfQ09ORklHKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZrYnJlcCwgdXAsIHNpemVvZihzdHJ1Y3Qga2JkX3JlcGVhdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWVyciA9IGtiZF9yYXRlKCZrYnJlcCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlpZiAoY29weV90b191c2VyKHVwLCAma2JyZXAsIHNpemVvZihzdHJ1Y3Qga2JkX3JlcGVhdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgS0RTRVRNT0RFOgorCQkvKgorCQkgKiBjdXJyZW50bHksIHNldHRpbmcgdGhlIG1vZGUgZnJvbSBLRF9URVhUIHRvIEtEX0dSQVBISUNTCisJCSAqIGRvZXNuJ3QgZG8gYSB3aG9sZSBsb3QuIGknbSBub3Qgc3VyZSBpZiBpdCBzaG91bGQgZG8gYW55CisJCSAqIHJlc3RvcmF0aW9uIG9mIG1vZGVzIG9yIHdoYXQuLi4KKwkJICoKKwkJICogWFhYIEl0IHNob3VsZCBhdCBsZWFzdCBjYWxsIGludG8gdGhlIGRyaXZlciwgZmJkZXYncyBkZWZpbml0ZWx5CisJCSAqIG5lZWQgdG8gcmVzdG9yZSB0aGVpciBlbmdpbmUgc3RhdGUuIC0tQmVuSAorCQkgKi8KKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJc3dpdGNoIChhcmcpIHsKKwkJY2FzZSBLRF9HUkFQSElDUzoKKwkJCWJyZWFrOworCQljYXNlIEtEX1RFWFQwOgorCQljYXNlIEtEX1RFWFQxOgorCQkJYXJnID0gS0RfVEVYVDsKKwkJY2FzZSBLRF9URVhUOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAodmMtPnZjX21vZGUgPT0gKHVuc2lnbmVkIGNoYXIpIGFyZykKKwkJCXJldHVybiAwOworCQl2Yy0+dmNfbW9kZSA9ICh1bnNpZ25lZCBjaGFyKSBhcmc7CisJCWlmIChjb25zb2xlICE9IGZnX2NvbnNvbGUpCisJCQlyZXR1cm4gMDsKKwkJLyoKKwkJICogZXhwbGljaXRseSBibGFuay91bmJsYW5rIHRoZSBzY3JlZW4gaWYgc3dpdGNoaW5nIG1vZGVzCisJCSAqLworCQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJCWlmIChhcmcgPT0gS0RfVEVYVCkKKwkJCWRvX3VuYmxhbmtfc2NyZWVuKDEpOworCQllbHNlCisJCQlkb19ibGFua19zY3JlZW4oMSk7CisJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEtER0VUTU9ERToKKwkJdWN2YWwgPSB2Yy0+dmNfbW9kZTsKKwkJZ290byBzZXRpbnQ7CisKKwljYXNlIEtETUFQRElTUDoKKwljYXNlIEtEVU5NQVBESVNQOgorCQkvKgorCQkgKiB0aGVzZSB3b3JrIGxpa2UgYSBjb21iaW5hdGlvbiBvZiBtbWFwIGFuZCBLREVOQUJJTy4KKwkJICogdGhpcyBjb3VsZCBiZSBlYXNpbHkgZmluaXNoZWQuCisJCSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhc2UgS0RTS0JNT0RFOgorCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlzd2l0Y2goYXJnKSB7CisJCSAgY2FzZSBLX1JBVzoKKwkJCWtiZC0+a2JkbW9kZSA9IFZDX1JBVzsKKwkJCWJyZWFrOworCQkgIGNhc2UgS19NRURJVU1SQVc6CisJCQlrYmQtPmtiZG1vZGUgPSBWQ19NRURJVU1SQVc7CisJCQlicmVhazsKKwkJICBjYXNlIEtfWExBVEU6CisJCQlrYmQtPmtiZG1vZGUgPSBWQ19YTEFURTsKKwkJCWNvbXB1dGVfc2hpZnRzdGF0ZSgpOworCQkJYnJlYWs7CisJCSAgY2FzZSBLX1VOSUNPREU6CisJCQlrYmQtPmtiZG1vZGUgPSBWQ19VTklDT0RFOworCQkJY29tcHV0ZV9zaGlmdHN0YXRlKCk7CisJCQlicmVhazsKKwkJICBkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisJCXJldHVybiAwOworCisJY2FzZSBLREdLQk1PREU6CisJCXVjdmFsID0gKChrYmQtPmtiZG1vZGUgPT0gVkNfUkFXKSA/IEtfUkFXIDoKKwkJCQkgKGtiZC0+a2JkbW9kZSA9PSBWQ19NRURJVU1SQVcpID8gS19NRURJVU1SQVcgOgorCQkJCSAoa2JkLT5rYmRtb2RlID09IFZDX1VOSUNPREUpID8gS19VTklDT0RFIDoKKwkJCQkgS19YTEFURSk7CisJCWdvdG8gc2V0aW50OworCisJLyogdGhpcyBjb3VsZCBiZSBmb2xkZWQgaW50byBLRFNLQk1PREUsIGJ1dCBmb3IgY29tcGF0aWJpbGl0eQorCSAgIHJlYXNvbnMgaXQgaXMgbm90IHNvIGVhc3kgdG8gZm9sZCBLREdLQk1FVEEgaW50byBLREdLQk1PREUgKi8KKwljYXNlIEtEU0tCTUVUQToKKwkJc3dpdGNoKGFyZykgeworCQkgIGNhc2UgS19NRVRBQklUOgorCQkJY2xyX3ZjX2tiZF9tb2RlKGtiZCwgVkNfTUVUQSk7CisJCQlicmVhazsKKwkJICBjYXNlIEtfRVNDUFJFRklYOgorCQkJc2V0X3ZjX2tiZF9tb2RlKGtiZCwgVkNfTUVUQSk7CisJCQlicmVhazsKKwkJICBkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIEtER0tCTUVUQToKKwkJdWN2YWwgPSAodmNfa2JkX21vZGUoa2JkLCBWQ19NRVRBKSA/IEtfRVNDUFJFRklYIDogS19NRVRBQklUKTsKKwlzZXRpbnQ6CisJCXJldHVybiBwdXRfdXNlcih1Y3ZhbCwgKGludCBfX3VzZXIgKilhcmcpOyAKKworCWNhc2UgS0RHRVRLRVlDT0RFOgorCWNhc2UgS0RTRVRLRVlDT0RFOgorCQlpZighY2FwYWJsZShDQVBfU1lTX1RUWV9DT05GSUcpKQorCQkJcGVybT0wOworCQlyZXR1cm4gZG9fa2JrZXljb2RlX2lvY3RsKGNtZCwgdXAsIHBlcm0pOworCisJY2FzZSBLREdLQkVOVDoKKwljYXNlIEtEU0tCRU5UOgorCQlyZXR1cm4gZG9fa2Rza19pb2N0bChjbWQsIHVwLCBwZXJtLCBrYmQpOworCisJY2FzZSBLREdLQlNFTlQ6CisJY2FzZSBLRFNLQlNFTlQ6CisJCXJldHVybiBkb19rZGdrYl9pb2N0bChjbWQsIHVwLCBwZXJtKTsKKworCWNhc2UgS0RHS0JESUFDUjoKKwl7CisJCXN0cnVjdCBrYmRpYWNycyBfX3VzZXIgKmEgPSB1cDsKKworCQlpZiAocHV0X3VzZXIoYWNjZW50X3RhYmxlX3NpemUsICZhLT5rYl9jbnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChjb3B5X3RvX3VzZXIoYS0+a2JkaWFjciwgYWNjZW50X3RhYmxlLCBhY2NlbnRfdGFibGVfc2l6ZSpzaXplb2Yoc3RydWN0IGtiZGlhY3IpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIEtEU0tCRElBQ1I6CisJeworCQlzdHJ1Y3Qga2JkaWFjcnMgX191c2VyICphID0gdXA7CisJCXVuc2lnbmVkIGludCBjdDsKKworCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZ2V0X3VzZXIoY3QsJmEtPmtiX2NudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGN0ID49IE1BWF9ESUFDUikKKwkJCXJldHVybiAtRUlOVkFMOworCQlhY2NlbnRfdGFibGVfc2l6ZSA9IGN0OworCQlpZiAoY29weV9mcm9tX3VzZXIoYWNjZW50X3RhYmxlLCBhLT5rYmRpYWNyLCBjdCpzaXplb2Yoc3RydWN0IGtiZGlhY3IpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0aGUgaW9jdGxzIGJlbG93IHJlYWQvc2V0IHRoZSBmbGFncyB1c3VhbGx5IHNob3duIGluIHRoZSBsZWRzICovCisJLyogZG9uJ3QgdXNlIHRoZW0gLSB0aGV5IHdpbGwgZ28gYXdheSB3aXRob3V0IHdhcm5pbmcgKi8KKwljYXNlIEtER0tCTEVEOgorCQl1Y3ZhbCA9IGtiZC0+bGVkZmxhZ3N0YXRlIHwgKGtiZC0+ZGVmYXVsdF9sZWRmbGFnc3RhdGUgPDwgNCk7CisJCWdvdG8gc2V0Y2hhcjsKKworCWNhc2UgS0RTS0JMRUQ6CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChhcmcgJiB+MHg3NykKKwkJCXJldHVybiAtRUlOVkFMOworCQlrYmQtPmxlZGZsYWdzdGF0ZSA9IChhcmcgJiA3KTsKKwkJa2JkLT5kZWZhdWx0X2xlZGZsYWdzdGF0ZSA9ICgoYXJnID4+IDQpICYgNyk7CisJCXNldF9sZWRzKCk7CisJCXJldHVybiAwOworCisJLyogdGhlIGlvY3RscyBiZWxvdyBvbmx5IHNldCB0aGUgbGlnaHRzLCBub3QgdGhlIGZ1bmN0aW9ucyAqLworCS8qIGZvciB0aG9zZSwgc2VlIEtER0tCTEVEIGFuZCBLRFNLQkxFRCBhYm92ZSAqLworCWNhc2UgS0RHRVRMRUQ6CisJCXVjdmFsID0gZ2V0bGVkc3RhdGUoKTsKKwlzZXRjaGFyOgorCQlyZXR1cm4gcHV0X3VzZXIodWN2YWwsIChjaGFyIF9fdXNlciAqKWFyZyk7CisKKwljYXNlIEtEU0VUTEVEOgorCQlpZiAoIXBlcm0pCisJCSAgcmV0dXJuIC1FUEVSTTsKKwkJc2V0bGVkc3RhdGUoa2JkLCBhcmcpOworCQlyZXR1cm4gMDsKKworCS8qCisJICogQSBwcm9jZXNzIGNhbiBpbmRpY2F0ZSBpdHMgd2lsbGluZ25lc3MgdG8gYWNjZXB0IHNpZ25hbHMKKwkgKiBnZW5lcmF0ZWQgYnkgcHJlc3NpbmcgYW4gYXBwcm9wcmlhdGUga2V5IGNvbWJpbmF0aW9uLgorCSAqIFRodXMsIG9uZSBjYW4gaGF2ZSBhIGRhZW1vbiB0aGF0IGUuZy4gc3Bhd25zIGEgbmV3IGNvbnNvbGUKKwkgKiB1cG9uIGEga2V5cHJlc3MgYW5kIHRoZW4gY2hhbmdlcyB0byBpdC4KKwkgKiBTZWUgYWxzbyB0aGUga2JyZXF1ZXN0IGZpZWxkIG9mIGluaXR0YWIoNSkuCisJICovCisJY2FzZSBLRFNJR0FDQ0VQVDoKKwl7CisJCWV4dGVybiBpbnQgc3Bhd25waWQsIHNwYXduc2lnOworCQlpZiAoIXBlcm0gfHwgIWNhcGFibGUoQ0FQX0tJTEwpKQorCQkgIHJldHVybiAtRVBFUk07CisJCWlmIChhcmcgPCAxIHx8IGFyZyA+IF9OU0lHIHx8IGFyZyA9PSBTSUdLSUxMKQorCQkgIHJldHVybiAtRUlOVkFMOworCQlzcGF3bnBpZCA9IGN1cnJlbnQtPnBpZDsKKwkJc3Bhd25zaWcgPSBhcmc7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgVlRfU0VUTU9ERToKKwl7CisJCXN0cnVjdCB2dF9tb2RlIHRtcDsKKworCQlpZiAoIXBlcm0pCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXAsIHNpemVvZihzdHJ1Y3QgdnRfbW9kZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh0bXAubW9kZSAhPSBWVF9BVVRPICYmIHRtcC5tb2RlICE9IFZUX1BST0NFU1MpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCQl2Yy0+dnRfbW9kZSA9IHRtcDsKKwkJLyogdGhlIGZyc2lnIGlzIGlnbm9yZWQsIHNvIHdlIHNldCBpdCB0byAwICovCisJCXZjLT52dF9tb2RlLmZyc2lnID0gMDsKKwkJdmMtPnZ0X3BpZCA9IGN1cnJlbnQtPnBpZDsKKwkJLyogbm8gc3dpdGNoIGlzIHJlcXVpcmVkIC0tIHNhd0BzaGFkZS5tc3UucnUgKi8KKwkJdmMtPnZ0X25ld3Z0ID0gLTE7CisJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWVF9HRVRNT0RFOgorCXsKKwkJc3RydWN0IHZ0X21vZGUgdG1wOworCQlpbnQgcmM7CisKKwkJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCQltZW1jcHkoJnRtcCwgJnZjLT52dF9tb2RlLCBzaXplb2Yoc3RydWN0IHZ0X21vZGUpKTsKKwkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCisJCXJjID0gY29weV90b191c2VyKHVwLCAmdG1wLCBzaXplb2Yoc3RydWN0IHZ0X21vZGUpKTsKKwkJcmV0dXJuIHJjID8gLUVGQVVMVCA6IDA7CisJfQorCisJLyoKKwkgKiBSZXR1cm5zIGdsb2JhbCB2dCBzdGF0ZS4gTm90ZSB0aGF0IFZUIDAgaXMgYWx3YXlzIG9wZW4sIHNpbmNlCisJICogaXQncyBhbiBhbGlhcyBmb3IgdGhlIGN1cnJlbnQgVlQsIGFuZCBwZW9wbGUgY2FuJ3QgdXNlIGl0IGhlcmUuCisJICogV2UgY2Fubm90IHJldHVybiBzdGF0ZSBmb3IgbW9yZSB0aGFuIDE2IFZUcywgc2luY2Ugdl9zdGF0ZSBpcyBzaG9ydC4KKwkgKi8KKwljYXNlIFZUX0dFVFNUQVRFOgorCXsKKwkJc3RydWN0IHZ0X3N0YXQgX191c2VyICp2dHN0YXQgPSB1cDsKKwkJdW5zaWduZWQgc2hvcnQgc3RhdGUsIG1hc2s7CisKKwkJaWYgKHB1dF91c2VyKGZnX2NvbnNvbGUgKyAxLCAmdnRzdGF0LT52X2FjdGl2ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc3RhdGUgPSAxOwkvKiAvZGV2L3R0eTAgaXMgYWx3YXlzIG9wZW4gKi8KKwkJZm9yIChpID0gMCwgbWFzayA9IDI7IGkgPCBNQVhfTlJfQ09OU09MRVMgJiYgbWFzazsgKytpLCBtYXNrIDw8PSAxKQorCQkJaWYgKFZUX0lTX0lOX1VTRShpKSkKKwkJCQlzdGF0ZSB8PSBtYXNrOworCQlyZXR1cm4gcHV0X3VzZXIoc3RhdGUsICZ2dHN0YXQtPnZfc3RhdGUpOworCX0KKworCS8qCisJICogUmV0dXJucyB0aGUgZmlyc3QgYXZhaWxhYmxlIChub24tb3BlbmVkKSBjb25zb2xlLgorCSAqLworCWNhc2UgVlRfT1BFTlFSWToKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgKytpKQorCQkJaWYgKCEgVlRfSVNfSU5fVVNFKGkpKQorCQkJCWJyZWFrOworCQl1Y3ZhbCA9IGkgPCBNQVhfTlJfQ09OU09MRVMgPyAoaSsxKSA6IC0xOworCQlnb3RvIHNldGludDsJCSAKKworCS8qCisJICogaW9jdGwoZmQsIFZUX0FDVElWQVRFLCBudW0pIHdpbGwgY2F1c2UgdXMgdG8gc3dpdGNoIHRvIHZ0ICMgbnVtLAorCSAqIHdpdGggbnVtID49IDEgKHN3aXRjaGVzIHRvIHZ0IDAsIG91ciBjb25zb2xlLCBhcmUgbm90IGFsbG93ZWQsIGp1c3QKKwkgKiB0byBwcmVzZXJ2ZSBzYW5pdHkpLgorCSAqLworCWNhc2UgVlRfQUNUSVZBVEU6CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChhcmcgPT0gMCB8fCBhcmcgPiBNQVhfTlJfQ09OU09MRVMpCisJCQlyZXR1cm4gLUVOWElPOworCQlhcmctLTsKKwkJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCQlpID0gdmNfYWxsb2NhdGUoYXJnKTsKKwkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQlpZiAoaSkKKwkJCXJldHVybiBpOworCQlzZXRfY29uc29sZShhcmcpOworCQlyZXR1cm4gMDsKKworCS8qCisJICogd2FpdCB1bnRpbCB0aGUgc3BlY2lmaWVkIFZUIGhhcyBiZWVuIGFjdGl2YXRlZAorCSAqLworCWNhc2UgVlRfV0FJVEFDVElWRToKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGFyZyA9PSAwIHx8IGFyZyA+IE1BWF9OUl9DT05TT0xFUykKKwkJCXJldHVybiAtRU5YSU87CisJCXJldHVybiB2dF93YWl0YWN0aXZlKGFyZy0xKTsKKworCS8qCisJICogSWYgYSB2dCBpcyB1bmRlciBwcm9jZXNzIGNvbnRyb2wsIHRoZSBrZXJuZWwgd2lsbCBub3Qgc3dpdGNoIHRvIGl0CisJICogaW1tZWRpYXRlbHksIGJ1dCBwb3N0cG9uZSB0aGUgb3BlcmF0aW9uIHVudGlsIHRoZSBwcm9jZXNzIGNhbGxzIHRoaXMKKwkgKiBpb2N0bCwgYWxsb3dpbmcgdGhlIHN3aXRjaCB0byBjb21wbGV0ZS4KKwkgKgorCSAqIEFjY29yZGluZyB0byB0aGUgWCBzb3VyY2VzIHRoaXMgaXMgdGhlIGJlaGF2aW9yOgorCSAqCTA6CXBlbmRpbmcgc3dpdGNoLWZyb20gbm90IE9LCisJICoJMToJcGVuZGluZyBzd2l0Y2gtZnJvbSBPSworCSAqCTI6CWNvbXBsZXRlZCBzd2l0Y2gtdG8gT0sKKwkgKi8KKwljYXNlIFZUX1JFTERJU1A6CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmICh2Yy0+dnRfbW9kZS5tb2RlICE9IFZUX1BST0NFU1MpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKgorCQkgKiBTd2l0Y2hpbmctZnJvbSByZXNwb25zZQorCQkgKi8KKwkJaWYgKHZjLT52dF9uZXd2dCA+PSAwKSB7CisJCQlpZiAoYXJnID09IDApCisJCQkJLyoKKwkJCQkgKiBTd2l0Y2ggZGlzYWxsb3dlZCwgc28gZm9yZ2V0IHdlIHdlcmUgdHJ5aW5nCisJCQkJICogdG8gZG8gaXQuCisJCQkJICovCisJCQkJdmMtPnZ0X25ld3Z0ID0gLTE7CisKKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogVGhlIGN1cnJlbnQgdnQgaGFzIGJlZW4gcmVsZWFzZWQsIHNvCisJCQkJICogY29tcGxldGUgdGhlIHN3aXRjaC4KKwkJCQkgKi8KKwkJCQlpbnQgbmV3dnQ7CisJCQkJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCQkJCW5ld3Z0ID0gdmMtPnZ0X25ld3Z0OworCQkJCXZjLT52dF9uZXd2dCA9IC0xOworCQkJCWkgPSB2Y19hbGxvY2F0ZShuZXd2dCk7CisJCQkJaWYgKGkpIHsKKwkJCQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQkJCQlyZXR1cm4gaTsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBXaGVuIHdlIGFjdHVhbGx5IGRvIHRoZSBjb25zb2xlIHN3aXRjaCwKKwkJCQkgKiBtYWtlIHN1cmUgd2UgYXJlIGF0b21pYyB3aXRoIHJlc3BlY3QgdG8KKwkJCQkgKiBvdGhlciBjb25zb2xlIHN3aXRjaGVzLi4KKwkJCQkgKi8KKwkJCQljb21wbGV0ZV9jaGFuZ2VfY29uc29sZSh2Y19jb25zW25ld3Z0XS5kKTsKKwkJCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBTd2l0Y2hlZC10byByZXNwb25zZQorCQkgKi8KKwkJZWxzZQorCQl7CisJCQkvKgorCQkJICogSWYgaXQncyBqdXN0IGFuIEFDSywgaWdub3JlIGl0CisJCQkgKi8KKwkJCWlmIChhcmcgIT0gVlRfQUNLQUNRKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcmV0dXJuIDA7CisKKwkgLyoKKwkgICogRGlzYWxsb2NhdGUgbWVtb3J5IGFzc29jaWF0ZWQgdG8gVlQgKGJ1dCBsZWF2ZSBWVDEpCisJICAqLworCSBjYXNlIFZUX0RJU0FMTE9DQVRFOgorCQlpZiAoYXJnID4gTUFYX05SX0NPTlNPTEVTKQorCQkJcmV0dXJuIC1FTlhJTzsKKwkJaWYgKGFyZyA9PSAwKSB7CisJCSAgICAvKiBkaXNhbGxvY2F0ZSBhbGwgdW51c2VkIGNvbnNvbGVzLCBidXQgbGVhdmUgMCAqLworCQkJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCQkJZm9yIChpPTE7IGk8TUFYX05SX0NPTlNPTEVTOyBpKyspCisJCQkJaWYgKCEgVlRfQlVTWShpKSkKKwkJCQkJdmNfZGlzYWxsb2NhdGUoaSk7CisJCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCX0gZWxzZSB7CisJCQkvKiBkaXNhbGxvY2F0ZSBhIHNpbmdsZSBjb25zb2xlLCBpZiBwb3NzaWJsZSAqLworCQkJYXJnLS07CisJCQlpZiAoVlRfQlVTWShhcmcpKQorCQkJCXJldHVybiAtRUJVU1k7CisJCQlpZiAoYXJnKSB7CQkJICAgICAgLyogbGVhdmUgMCAqLworCQkJCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwkJCQl2Y19kaXNhbGxvY2F0ZShhcmcpOworCQkJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgVlRfUkVTSVpFOgorCXsKKwkJc3RydWN0IHZ0X3NpemVzIF9fdXNlciAqdnRzaXplcyA9IHVwOworCQl1c2hvcnQgbGwsY2M7CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChnZXRfdXNlcihsbCwgJnZ0c2l6ZXMtPnZfcm93cykgfHwKKwkJICAgIGdldF91c2VyKGNjLCAmdnRzaXplcy0+dl9jb2xzKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTlNPTEVTOyBpKyspIHsKKwkJCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwkJCXZjX3Jlc2l6ZSh2Y19jb25zW2ldLmQsIGNjLCBsbCk7CisJCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWVF9SRVNJWkVYOgorCXsKKwkJc3RydWN0IHZ0X2NvbnNpemUgX191c2VyICp2dGNvbnNpemUgPSB1cDsKKwkJdXNob3J0IGxsLGNjLHZsaW4sY2xpbix2Y29sLGNjb2w7CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB2dGNvbnNpemUsCisJCQkJc2l6ZW9mKHN0cnVjdCB2dF9jb25zaXplKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJX19nZXRfdXNlcihsbCwgJnZ0Y29uc2l6ZS0+dl9yb3dzKTsKKwkJX19nZXRfdXNlcihjYywgJnZ0Y29uc2l6ZS0+dl9jb2xzKTsKKwkJX19nZXRfdXNlcih2bGluLCAmdnRjb25zaXplLT52X3ZsaW4pOworCQlfX2dldF91c2VyKGNsaW4sICZ2dGNvbnNpemUtPnZfY2xpbik7CisJCV9fZ2V0X3VzZXIodmNvbCwgJnZ0Y29uc2l6ZS0+dl92Y29sKTsKKwkJX19nZXRfdXNlcihjY29sLCAmdnRjb25zaXplLT52X2Njb2wpOworCQl2bGluID0gdmxpbiA/IHZsaW4gOiB2Yy0+dmNfc2Nhbl9saW5lczsKKwkJaWYgKGNsaW4pIHsKKwkJCWlmIChsbCkgeworCQkJCWlmIChsbCAhPSB2bGluL2NsaW4pCisJCQkJCXJldHVybiAtRUlOVkFMOyAvKiBQYXJhbWV0ZXJzIGRvbid0IGFkZCB1cCAqLworCQkJfSBlbHNlIAorCQkJCWxsID0gdmxpbi9jbGluOworCQl9CisJCWlmICh2Y29sICYmIGNjb2wpIHsKKwkJCWlmIChjYykgeworCQkJCWlmIChjYyAhPSB2Y29sL2Njb2wpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlCisJCQkJY2MgPSB2Y29sL2Njb2w7CisJCX0KKworCQlpZiAoY2xpbiA+IDMyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSAgICAKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKSB7CisJCQlpZiAoIXZjX2NvbnNbaV0uZCkKKwkJCQljb250aW51ZTsKKwkJCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwkJCWlmICh2bGluKQorCQkJCXZjX2NvbnNbaV0uZC0+dmNfc2Nhbl9saW5lcyA9IHZsaW47CisJCQlpZiAoY2xpbikKKwkJCQl2Y19jb25zW2ldLmQtPnZjX2ZvbnQuaGVpZ2h0ID0gY2xpbjsKKwkJCXZjX3Jlc2l6ZSh2Y19jb25zW2ldLmQsIGNjLCBsbCk7CisJCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJCX0KKyAgCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFBJT19GT05UOiB7CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCW9wLm9wID0gS0RfRk9OVF9PUF9TRVQ7CisJCW9wLmZsYWdzID0gS0RfRk9OVF9GTEFHX09MRCB8IEtEX0ZPTlRfRkxBR19ET05UX1JFQ0FMQzsJLyogQ29tcGF0aWJpbGl0eSAqLworCQlvcC53aWR0aCA9IDg7CisJCW9wLmhlaWdodCA9IDA7CisJCW9wLmNoYXJjb3VudCA9IDI1NjsKKwkJb3AuZGF0YSA9IHVwOworCQlyZXR1cm4gY29uX2ZvbnRfb3AodmNfY29uc1tmZ19jb25zb2xlXS5kLCAmb3ApOworCX0KKworCWNhc2UgR0lPX0ZPTlQ6IHsKKwkJb3Aub3AgPSBLRF9GT05UX09QX0dFVDsKKwkJb3AuZmxhZ3MgPSBLRF9GT05UX0ZMQUdfT0xEOworCQlvcC53aWR0aCA9IDg7CisJCW9wLmhlaWdodCA9IDMyOworCQlvcC5jaGFyY291bnQgPSAyNTY7CisJCW9wLmRhdGEgPSB1cDsKKwkJcmV0dXJuIGNvbl9mb250X29wKHZjX2NvbnNbZmdfY29uc29sZV0uZCwgJm9wKTsKKwl9CisKKwljYXNlIFBJT19DTUFQOgorICAgICAgICAgICAgICAgIGlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbl9zZXRfY21hcCh1cCk7CisKKwljYXNlIEdJT19DTUFQOgorICAgICAgICAgICAgICAgIHJldHVybiBjb25fZ2V0X2NtYXAodXApOworCisJY2FzZSBQSU9fRk9OVFg6CisJY2FzZSBHSU9fRk9OVFg6CisJCXJldHVybiBkb19mb250eF9pb2N0bChjbWQsIHVwLCBwZXJtLCAmb3ApOworCisJY2FzZSBQSU9fRk9OVFJFU0VUOgorCXsKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKworI2lmZGVmIEJST0tFTl9HUkFQSElDU19QUk9HUkFNUworCQkvKiBXaXRoIEJST0tFTl9HUkFQSElDU19QUk9HUkFNUyBkZWZpbmVkLCB0aGUgZGVmYXVsdAorCQkgICBmb250IGlzIG5vdCBzYXZlZC4gKi8KKwkJcmV0dXJuIC1FTk9TWVM7CisjZWxzZQorCQl7CisJCW9wLm9wID0gS0RfRk9OVF9PUF9TRVRfREVGQVVMVDsKKwkJb3AuZGF0YSA9IE5VTEw7CisJCWkgPSBjb25fZm9udF9vcCh2Y19jb25zW2ZnX2NvbnNvbGVdLmQsICZvcCk7CisJCWlmIChpKQorCQkJcmV0dXJuIGk7CisJCWNvbl9zZXRfZGVmYXVsdF91bmltYXAodmNfY29uc1tmZ19jb25zb2xlXS5kKTsKKwkJcmV0dXJuIDA7CisJCX0KKyNlbmRpZgorCX0KKworCWNhc2UgS0RGT05UT1A6IHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZvcCwgdXAsIHNpemVvZihvcCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICghcGVybSAmJiBvcC5vcCAhPSBLRF9GT05UX09QX0dFVCkKKwkJCXJldHVybiAtRVBFUk07CisJCWkgPSBjb25fZm9udF9vcCh2YywgJm9wKTsKKwkJaWYgKGkpIHJldHVybiBpOworCQlpZiAoY29weV90b191c2VyKHVwLCAmb3AsIHNpemVvZihvcCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgUElPX1NDUk5NQVA6CisJCWlmICghcGVybSkKKwkJCXJldHVybiAtRVBFUk07CisJCXJldHVybiBjb25fc2V0X3RyYW5zX29sZCh1cCk7CisKKwljYXNlIEdJT19TQ1JOTUFQOgorCQlyZXR1cm4gY29uX2dldF90cmFuc19vbGQodXApOworCisJY2FzZSBQSU9fVU5JU0NSTk1BUDoKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0dXJuIGNvbl9zZXRfdHJhbnNfbmV3KHVwKTsKKworCWNhc2UgR0lPX1VOSVNDUk5NQVA6CisJCXJldHVybiBjb25fZ2V0X3RyYW5zX25ldyh1cCk7CisKKwljYXNlIFBJT19VTklNQVBDTFI6CisJICAgICAgeyBzdHJ1Y3QgdW5pbWFwaW5pdCB1aTsKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaSA9IGNvcHlfZnJvbV91c2VyKCZ1aSwgdXAsIHNpemVvZihzdHJ1Y3QgdW5pbWFwaW5pdCkpOworCQlpZiAoaSkgcmV0dXJuIC1FRkFVTFQ7CisJCWNvbl9jbGVhcl91bmltYXAodmMsICZ1aSk7CisJCXJldHVybiAwOworCSAgICAgIH0KKworCWNhc2UgUElPX1VOSU1BUDoKKwljYXNlIEdJT19VTklNQVA6CisJCXJldHVybiBkb191bmltYXBfaW9jdGwoY21kLCB1cCwgcGVybSwgdmMpOworCisJY2FzZSBWVF9MT0NLU1dJVENIOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19UVFlfQ09ORklHKSkKKwkJICAgcmV0dXJuIC1FUEVSTTsKKwkJdnRfZG9udF9zd2l0Y2ggPSAxOworCQlyZXR1cm4gMDsKKwljYXNlIFZUX1VOTE9DS1NXSVRDSDoKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVFRZX0NPTkZJRykpCisJCSAgIHJldHVybiAtRVBFUk07CisJCXZ0X2RvbnRfc3dpdGNoID0gMDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKKy8qCisgKiBTb21ldGltZXMgd2Ugd2FudCB0byB3YWl0IHVudGlsIGEgcGFydGljdWxhciBWVCBoYXMgYmVlbiBhY3RpdmF0ZWQuIFdlCisgKiBkbyBpdCBpbiBhIHZlcnkgc2ltcGxlIG1hbm5lci4gRXZlcnlib2R5IHdhaXRzIG9uIGEgc2luZ2xlIHF1ZXVlIGFuZAorICogZ2V0IHdva2VuIHVwIGF0IG9uY2UuIFRob3NlIHRoYXQgYXJlIHNhdGlzZmllZCBnbyBvbiB3aXRoIHRoZWlyIGJ1c2luZXNzLAorICogd2hpbGUgdGhvc2Ugbm90IHJlYWR5IGdvIGJhY2sgdG8gc2xlZXAuIFNlZW1zIG92ZXJraWxsIHRvIGFkZCBhIHdhaXQKKyAqIHRvIGVhY2ggdnQganVzdCBmb3IgdGhpcyAtIHVzdWFsbHkgdGhpcyBkb2VzIG5vdGhpbmchCisgKi8KK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh2dF9hY3RpdmF0ZV9xdWV1ZSk7CisKKy8qCisgKiBTbGVlcHMgdW50aWwgYSB2dCBpcyBhY3RpdmF0ZWQsIG9yIHRoZSB0YXNrIGlzIGludGVycnVwdGVkLiBSZXR1cm5zCisgKiAwIGlmIGFjdGl2YXRpb24sIC1FSU5UUiBpZiBpbnRlcnJ1cHRlZC4KKyAqLworaW50IHZ0X3dhaXRhY3RpdmUoaW50IHZ0KQoreworCWludCByZXR2YWw7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmdnRfYWN0aXZhdGVfcXVldWUsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXJldHZhbCA9IDA7CisJCWlmICh2dCA9PSBmZ19jb25zb2xlKQorCQkJYnJlYWs7CisJCXJldHZhbCA9IC1FSU5UUjsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlKCk7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZ2dF9hY3RpdmF0ZV9xdWV1ZSwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgdnRfd2FrZV93YWl0YWN0aXZlKCkgd2FrZV91cCgmdnRfYWN0aXZhdGVfcXVldWUpCisKK3ZvaWQgcmVzZXRfdmMoc3RydWN0IHZjX2RhdGEgKnZjKQoreworCXZjLT52Y19tb2RlID0gS0RfVEVYVDsKKwlrYmRfdGFibGVbdmMtPnZjX251bV0ua2JkbW9kZSA9IFZDX1hMQVRFOworCXZjLT52dF9tb2RlLm1vZGUgPSBWVF9BVVRPOworCXZjLT52dF9tb2RlLndhaXR2ID0gMDsKKwl2Yy0+dnRfbW9kZS5yZWxzaWcgPSAwOworCXZjLT52dF9tb2RlLmFjcXNpZyA9IDA7CisJdmMtPnZ0X21vZGUuZnJzaWcgPSAwOworCXZjLT52dF9waWQgPSAtMTsKKwl2Yy0+dnRfbmV3dnQgPSAtMTsKKwlpZiAoIWluX2ludGVycnVwdCgpKSAgICAvKiBWaWEga2V5Ym9hcmQuYzpTQUsoKSAtIGFrcG0gKi8KKwkJcmVzZXRfcGFsZXR0ZSh2Yyk7Cit9CisKKy8qCisgKiBQZXJmb3JtcyB0aGUgYmFjayBlbmQgb2YgYSB2dCBzd2l0Y2gKKyAqLworc3RhdGljIHZvaWQgY29tcGxldGVfY2hhbmdlX2NvbnNvbGUoc3RydWN0IHZjX2RhdGEgKnZjKQoreworCXVuc2lnbmVkIGNoYXIgb2xkX3ZjX21vZGU7CisKKwlsYXN0X2NvbnNvbGUgPSBmZ19jb25zb2xlOworCisJLyoKKwkgKiBJZiB3ZSdyZSBzd2l0Y2hpbmcsIHdlIGNvdWxkIGJlIGdvaW5nIGZyb20gS0RfR1JBUEhJQ1MgdG8KKwkgKiBLRF9URVhUIG1vZGUgb3IgdmljZSB2ZXJzYSwgd2hpY2ggbWVhbnMgd2UgbmVlZCB0byBibGFuayBvcgorCSAqIHVuYmxhbmsgdGhlIHNjcmVlbiBsYXRlci4KKwkgKi8KKwlvbGRfdmNfbW9kZSA9IHZjX2NvbnNbZmdfY29uc29sZV0uZC0+dmNfbW9kZTsKKwlzd2l0Y2hfc2NyZWVuKHZjKTsKKworCS8qCisJICogVGhpcyBjYW4ndCBhcHBlYXIgYmVsb3cgYSBzdWNjZXNzZnVsIGtpbGxfcHJvYygpLiAgSWYgaXQgZGlkLAorCSAqIHRoZW4gdGhlICpibGFua19zY3JlZW4gb3BlcmF0aW9uIGNvdWxkIG9jY3VyIHdoaWxlIFgsIGhhdmluZworCSAqIHJlY2VpdmVkIGFjcXNpZywgaXMgd2FraW5nIHVwIG9uIGFub3RoZXIgcHJvY2Vzc29yLiAgVGhpcworCSAqIGNvbmRpdGlvbiBjYW4gbGVhZCB0byBvdmVybGFwcGluZyBhY2Nlc3NlcyB0byB0aGUgVkdBIHJhbmdlCisJICogYW5kIHRoZSBmcmFtZWJ1ZmZlciAoY2F1c2luZyBzeXN0ZW0gbG9ja3VwcykuCisJICoKKwkgKiBUbyBhY2NvdW50IGZvciB0aGlzIHdlIGR1cGxpY2F0ZSB0aGlzIGNvZGUgYmVsb3cgb25seSBpZiB0aGUKKwkgKiBjb250cm9sbGluZyBwcm9jZXNzIGlzIGdvbmUgYW5kIHdlJ3ZlIGNhbGxlZCByZXNldF92Yy4KKwkgKi8KKwlpZiAob2xkX3ZjX21vZGUgIT0gdmMtPnZjX21vZGUpIHsKKwkJaWYgKHZjLT52Y19tb2RlID09IEtEX1RFWFQpCisJCQlkb191bmJsYW5rX3NjcmVlbigxKTsKKwkJZWxzZQorCQkJZG9fYmxhbmtfc2NyZWVuKDEpOworCX0KKworCS8qCisJICogSWYgdGhpcyBuZXcgY29uc29sZSBpcyB1bmRlciBwcm9jZXNzIGNvbnRyb2wsIHNlbmQgaXQgYSBzaWduYWwKKwkgKiB0ZWxsaW5nIGl0IHRoYXQgaXQgaGFzIGFjcXVpcmVkLiBBbHNvIGNoZWNrIGlmIGl0IGhhcyBkaWVkIGFuZAorCSAqIGNsZWFuIHVwIChzaW1pbGFyIHRvIGxvZ2ljIGVtcGxveWVkIGluIGNoYW5nZV9jb25zb2xlKCkpCisJICovCisJaWYgKHZjLT52dF9tb2RlLm1vZGUgPT0gVlRfUFJPQ0VTUykgeworCQkvKgorCQkgKiBTZW5kIHRoZSBzaWduYWwgYXMgcHJpdmlsZWdlZCAtIGtpbGxfcHJvYygpIHdpbGwKKwkJICogdGVsbCB1cyBpZiB0aGUgcHJvY2VzcyBoYXMgZ29uZSBvciBzb21ldGhpbmcgZWxzZQorCQkgKiBpcyBhd3J5CisJCSAqLworCQlpZiAoa2lsbF9wcm9jKHZjLT52dF9waWQsIHZjLT52dF9tb2RlLmFjcXNpZywgMSkgIT0gMCkgeworCQkvKgorCQkgKiBUaGUgY29udHJvbGxpbmcgcHJvY2VzcyBoYXMgZGllZCwgc28gd2UgcmV2ZXJ0IGJhY2sgdG8KKwkJICogbm9ybWFsIG9wZXJhdGlvbi4gSW4gdGhpcyBjYXNlLCB3ZSdsbCBhbHNvIGNoYW5nZSBiYWNrCisJCSAqIHRvIEtEX1RFWFQgbW9kZS4gSSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMgc3RyaWN0bHkgY29ycmVjdAorCQkgKiBidXQgaXQgc2F2ZXMgdGhlIGFnb255IHdoZW4gdGhlIFggc2VydmVyIGRpZXMgYW5kIHRoZSBzY3JlZW4KKwkJICogcmVtYWlucyBibGFua2VkIGR1ZSB0byBLRF9HUkFQSElDUyEgSXQgd291bGQgYmUgbmljZSB0byBkbworCQkgKiB0aGlzIG91dHNpZGUgb2YgVlRfUFJPQ0VTUyBidXQgdGhlcmUgaXMgbm8gc2luZ2xlIHByb2Nlc3MKKwkJICogdG8gYWNjb3VudCBmb3IgYW5kIHRyYWNraW5nIHR0eSBjb3VudCBtYXkgYmUgdW5kZXNpcmFibGUuCisJCSAqLworCQkJcmVzZXRfdmModmMpOworCisJCQlpZiAob2xkX3ZjX21vZGUgIT0gdmMtPnZjX21vZGUpIHsKKwkJCQlpZiAodmMtPnZjX21vZGUgPT0gS0RfVEVYVCkKKwkJCQkJZG9fdW5ibGFua19zY3JlZW4oMSk7CisJCQkJZWxzZQorCQkJCQlkb19ibGFua19zY3JlZW4oMSk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFdha2UgYW55b25lIHdhaXRpbmcgZm9yIHRoZWlyIFZUIHRvIGFjdGl2YXRlCisJICovCisJdnRfd2FrZV93YWl0YWN0aXZlKCk7CisJcmV0dXJuOworfQorCisvKgorICogUGVyZm9ybXMgdGhlIGZyb250LWVuZCBvZiBhIHZ0IHN3aXRjaAorICovCit2b2lkIGNoYW5nZV9jb25zb2xlKHN0cnVjdCB2Y19kYXRhICpuZXdfdmMpCit7CisJc3RydWN0IHZjX2RhdGEgKnZjOworCisJaWYgKCFuZXdfdmMgfHwgbmV3X3ZjLT52Y19udW0gPT0gZmdfY29uc29sZSB8fCB2dF9kb250X3N3aXRjaCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiB0aGlzIHZ0IGlzIGluIHByb2Nlc3MgbW9kZSwgdGhlbiB3ZSBuZWVkIHRvIGhhbmRzaGFrZSB3aXRoCisJICogdGhhdCBwcm9jZXNzIGJlZm9yZSBzd2l0Y2hpbmcuIEVzc2VudGlhbGx5LCB3ZSBzdG9yZSB3aGVyZSB0aGF0CisJICogdnQgd2FudHMgdG8gc3dpdGNoIHRvIGFuZCB3YWl0IGZvciBpdCB0byB0ZWxsIHVzIHdoZW4gaXQncyBkb25lCisJICogKHZpYSBWVF9SRUxESVNQIGlvY3RsKS4KKwkgKgorCSAqIFdlIGFsc28gY2hlY2sgdG8gc2VlIGlmIHRoZSBjb250cm9sbGluZyBwcm9jZXNzIHN0aWxsIGV4aXN0cy4KKwkgKiBJZiBpdCBkb2Vzbid0LCB3ZSByZXNldCB0aGlzIHZ0IHRvIGF1dG8gbW9kZSBhbmQgY29udGludWUuCisJICogVGhpcyBpcyBhIGNoZWFwIHdheSB0byB0cmFjayBwcm9jZXNzIGNvbnRyb2wuIFRoZSB3b3JzdCB0aGluZworCSAqIHRoYXQgY2FuIGhhcHBlbiBpczogd2Ugc2VuZCBhIHNpZ25hbCB0byBhIHByb2Nlc3MsIGl0IGRpZXMsIGFuZAorCSAqIHRoZSBzd2l0Y2ggZ2V0cyAibG9zdCIgd2FpdGluZyBmb3IgYSByZXNwb25zZTsgaG9wZWZ1bGx5LCB0aGUKKwkgKiB1c2VyIHdpbGwgdHJ5IGFnYWluLCB3ZSdsbCBkZXRlY3QgdGhlIHByb2Nlc3MgaXMgZ29uZSAodW5sZXNzCisJICogdGhlIHVzZXIgd2FpdHMganVzdCB0aGUgcmlnaHQgYW1vdW50IG9mIHRpbWUgOi0pIGFuZCByZXZlcnQgdGhlCisJICogdnQgdG8gYXV0byBjb250cm9sLgorCSAqLworCXZjID0gdmNfY29uc1tmZ19jb25zb2xlXS5kOworCWlmICh2Yy0+dnRfbW9kZS5tb2RlID09IFZUX1BST0NFU1MpIHsKKwkJLyoKKwkJICogU2VuZCB0aGUgc2lnbmFsIGFzIHByaXZpbGVnZWQgLSBraWxsX3Byb2MoKSB3aWxsCisJCSAqIHRlbGwgdXMgaWYgdGhlIHByb2Nlc3MgaGFzIGdvbmUgb3Igc29tZXRoaW5nIGVsc2UKKwkJICogaXMgYXdyeQorCQkgKi8KKwkJaWYgKGtpbGxfcHJvYyh2Yy0+dnRfcGlkLCB2Yy0+dnRfbW9kZS5yZWxzaWcsIDEpID09IDApIHsKKwkJCS8qCisJCQkgKiBJdCB3b3JrZWQuIE1hcmsgdGhlIHZ0IHRvIHN3aXRjaCB0byBhbmQKKwkJCSAqIHJldHVybi4gVGhlIHByb2Nlc3MgbmVlZHMgdG8gc2VuZCB1cyBhCisJCQkgKiBWVF9SRUxESVNQIGlvY3RsIHRvIGNvbXBsZXRlIHRoZSBzd2l0Y2guCisJCQkgKi8KKwkJCXZjLT52dF9uZXd2dCA9IG5ld192Yy0+dmNfbnVtOworCQkJcmV0dXJuOworCQl9CisKKwkJLyoKKwkJICogVGhlIGNvbnRyb2xsaW5nIHByb2Nlc3MgaGFzIGRpZWQsIHNvIHdlIHJldmVydCBiYWNrIHRvCisJCSAqIG5vcm1hbCBvcGVyYXRpb24uIEluIHRoaXMgY2FzZSwgd2UnbGwgYWxzbyBjaGFuZ2UgYmFjaworCQkgKiB0byBLRF9URVhUIG1vZGUuIEknbSBub3Qgc3VyZSBpZiB0aGlzIGlzIHN0cmljdGx5IGNvcnJlY3QKKwkJICogYnV0IGl0IHNhdmVzIHRoZSBhZ29ueSB3aGVuIHRoZSBYIHNlcnZlciBkaWVzIGFuZCB0aGUgc2NyZWVuCisJCSAqIHJlbWFpbnMgYmxhbmtlZCBkdWUgdG8gS0RfR1JBUEhJQ1MhIEl0IHdvdWxkIGJlIG5pY2UgdG8gZG8KKwkJICogdGhpcyBvdXRzaWRlIG9mIFZUX1BST0NFU1MgYnV0IHRoZXJlIGlzIG5vIHNpbmdsZSBwcm9jZXNzCisJCSAqIHRvIGFjY291bnQgZm9yIGFuZCB0cmFja2luZyB0dHkgY291bnQgbWF5IGJlIHVuZGVzaXJhYmxlLgorCQkgKi8KKwkJcmVzZXRfdmModmMpOworCisJCS8qCisJCSAqIEZhbGwgdGhyb3VnaCB0byBub3JtYWwgKFZUX0FVVE8pIGhhbmRsaW5nIG9mIHRoZSBzd2l0Y2guLi4KKwkJICovCisJfQorCisJLyoKKwkgKiBJZ25vcmUgYWxsIHN3aXRjaGVzIGluIEtEX0dSQVBISUNTK1ZUX0FVVE8gbW9kZQorCSAqLworCWlmICh2Yy0+dmNfbW9kZSA9PSBLRF9HUkFQSElDUykKKwkJcmV0dXJuOworCisJY29tcGxldGVfY2hhbmdlX2NvbnNvbGUobmV3X3ZjKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhMzFkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnCkBAIC0wLDAgKzEsNTQ5IEBACisjCisjIFdhdGNoZG9nIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIldhdGNoZG9nIENhcmRzIgorCitjb25maWcgV0FUQ0hET0cKKwlib29sICJXYXRjaGRvZyBUaW1lciBTdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBzYXkgWSBoZXJlIChhbmQgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9ucykgYW5kIGNyZWF0ZSBhCisJICBjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlIC9kZXYvd2F0Y2hkb2cgd2l0aCBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yCisJICBudW1iZXIgMTMwIHVzaW5nIG1rbm9kICgibWFuIG1rbm9kIiksIHlvdSB3aWxsIGdldCBhIHdhdGNoZG9nLCBpLmUuOgorCSAgc3Vic2VxdWVudGx5IG9wZW5pbmcgdGhlIGZpbGUgYW5kIHRoZW4gZmFpbGluZyB0byB3cml0ZSB0byBpdCBmb3IKKwkgIGxvbmdlciB0aGFuIDEgbWludXRlIHdpbGwgcmVzdWx0IGluIHJlYm9vdGluZyB0aGUgbWFjaGluZS4gVGhpcworCSAgY291bGQgYmUgdXNlZnVsIGZvciBhIG5ldHdvcmtlZCBtYWNoaW5lIHRoYXQgbmVlZHMgdG8gY29tZSBiYWNrCisJICBvbmxpbmUgYXMgZmFzdCBhcyBwb3NzaWJsZSBhZnRlciBhIGxvY2stdXAuIFRoZXJlJ3MgYm90aCBhIHdhdGNoZG9nCisJICBpbXBsZW1lbnRhdGlvbiBlbnRpcmVseSBpbiBzb2Z0d2FyZSAod2hpY2ggY2FuIHNvbWV0aW1lcyBmYWlsIHRvCisJICByZWJvb3QgdGhlIG1hY2hpbmUpIGFuZCBhIGRyaXZlciBmb3IgaGFyZHdhcmUgd2F0Y2hkb2cgYm9hcmRzLCB3aGljaAorCSAgYXJlIG1vcmUgcm9idXN0IGFuZCBjYW4gYWxzbyBrZWVwIHRyYWNrIG9mIHRoZSB0ZW1wZXJhdHVyZSBpbnNpZGUKKwkgIHlvdXIgY29tcHV0ZXIuIEZvciBkZXRhaWxzLCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vd2F0Y2hkb2cvd2F0Y2hkb2cudHh0PgorCSAgaW4gdGhlIGtlcm5lbCBzb3VyY2UuCisKKwkgIFRoZSB3YXRjaGRvZyBpcyB1c3VhbGx5IHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgd2F0Y2hkb2cgZGFlbW9uCisJICB3aGljaCBpcyBhdmFpbGFibGUgZnJvbQorCSAgPGZ0cDovL2liaWJsaW8ub3JnL3B1Yi9MaW51eC9zeXN0ZW0vZGFlbW9ucy93YXRjaGRvZy8+LiBUaGlzIGRhZW1vbiBjYW4KKwkgIGFsc28gbW9uaXRvciBORlMgY29ubmVjdGlvbnMgYW5kIGNhbiByZWJvb3QgdGhlIG1hY2hpbmUgd2hlbiB0aGUgcHJvY2VzcworCSAgdGFibGUgaXMgZnVsbC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFdBVENIRE9HX05PV0FZT1VUCisJYm9vbCAiRGlzYWJsZSB3YXRjaGRvZyBzaHV0ZG93biBvbiBjbG9zZSIKKwlkZXBlbmRzIG9uIFdBVENIRE9HCisJaGVscAorCSAgVGhlIGRlZmF1bHQgd2F0Y2hkb2cgYmVoYXZpb3VyICh3aGljaCB5b3UgZ2V0IGlmIHlvdSBzYXkgTiBoZXJlKSBpcworCSAgdG8gc3RvcCB0aGUgdGltZXIgaWYgdGhlIHByb2Nlc3MgbWFuYWdpbmcgaXQgY2xvc2VzIHRoZSBmaWxlCisJICAvZGV2L3dhdGNoZG9nLiBJdCdzIGFsd2F5cyByZW1vdGVseSBwb3NzaWJsZSB0aGF0IHRoaXMgcHJvY2VzcyBtaWdodAorCSAgZ2V0IGtpbGxlZC4gSWYgeW91IHNheSBZIGhlcmUsIHRoZSB3YXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlCisJICBpdCBoYXMgYmVlbiBzdGFydGVkLgorCisjCisjIEdlbmVyYWwgV2F0Y2hkb2cgZHJpdmVycworIworCitjb21tZW50ICJXYXRjaGRvZyBEZXZpY2UgRHJpdmVycyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HCisKKyMgQXJjaGl0ZWN0dXJlIEluZGVwZW5kYW50CisKK2NvbmZpZyBTT0ZUX1dBVENIRE9HCisJdHJpc3RhdGUgIlNvZnR3YXJlIHdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cKKwloZWxwCisJICBBIHNvZnR3YXJlIG1vbml0b3Jpbmcgd2F0Y2hkb2cuIFRoaXMgd2lsbCBmYWlsIHRvIHJlYm9vdCB5b3VyIHN5c3RlbQorCSAgZnJvbSBzb21lIHNpdHVhdGlvbnMgdGhhdCB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgd2lsbCByZWNvdmVyCisJICBmcm9tLiBFcXVhbGx5IGl0J3MgYSBsb3QgY2hlYXBlciB0byBpbnN0YWxsLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzb2Z0ZG9nLgorCisjIEFSTSBBcmNoaXRlY3R1cmUKKworY29uZmlnIDIxMjg1X1dBVENIRE9HCisJdHJpc3RhdGUgIkRDMjEyODUgd2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBGT09UQlJJREdFCisJaGVscAorCSAgVGhlIEludGVsIEZvb3RicmlkZ2UgY2hpcCBjb250YWlucyBhIGJ1aWx0aW4gd2F0Y2hkb2cgY2lyY3VpdC4gU2F5IFkKKwkgIGhlcmUgaWYgeW91IHdpc2ggdG8gdXNlIHRoaXMuIEFsdGVybmF0aXZlbHkgc2F5IE0gdG8gY29tcGlsZSB0aGUKKwkgIGRyaXZlciBhcyBhIG1vZHVsZSwgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2R0Mjg1LgorCisJICBUaGlzIGRyaXZlciBkb2VzIG5vdCB3b3JrIG9uIGFsbCBtYWNoaW5lcy4gSW4gcGFydGljdWxhciwgZWFybHkgQ0FUUworCSAgYm9hcmRzIGhhdmUgaGFyZHdhcmUgcHJvYmxlbXMgdGhhdCB3aWxsIGNhdXNlIHRoZSBtYWNoaW5lIHRvIHNpbXBseQorCSAgbG9jayB1cCBpZiB0aGUgd2F0Y2hkb2cgZmlyZXMuCisKKwkgICJJZiBpbiBkb3VidCwgbGVhdmUgaXQgb3V0IiAtIHNheSBOLgorCitjb25maWcgOTc3X1dBVENIRE9HCisJdHJpc3RhdGUgIk5ldFdpbmRlciBXQjgzQzk3NyB3YXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIEZPT1RCUklER0UgJiYgQVJDSF9ORVRXSU5ERVIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFdCOTc3IHdhdGNoZG9nIGluY2x1ZGVkIGluCisJICBOZXRXaW5kZXIgbWFjaGluZXMuIEFsdGVybmF0aXZlbHkgc2F5IE0gdG8gY29tcGlsZSB0aGUgZHJpdmVyIGFzCisJICBhIG1vZHVsZSwgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2R0OTc3LgorCisJICBOb3Qgc3VyZT8gSXQncyBzYWZlIHRvIHNheSBOLgorCitjb25maWcgSVhQNFhYX1dBVENIRE9HCisJdHJpc3RhdGUgIklYUDR4eCBXYXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIEFSQ0hfSVhQNFhYCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSB3YXRjaGRvZyB0aW1lcgorCSAgaW4gdGhlIEludGVsIElYUDR4eCBuZXR3b3JrIHByb2Nlc3NvcnMuIFRoaXMgZHJpdmVyIGNhbgorCSAgYmUgYnVpbHQgYXMgYSBtb2R1bGUgYnkgY2hvb3NpbmcgTS4gVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgaXhwNHh4X3dkdC4KKworCSAgTm90ZTogVGhlIGludGVybmFsIElYUDR4eCB3YXRjaGRvZyBkb2VzIGEgc29mdCBDUFUgcmVzZXQKKwkgIHdoaWNoIGRvZXNuJ3QgcmVzZXQgYW55IHBlcmlwaGVyYWxzLiBUaGVyZSBhcmUgY2lyY3Vtc3RhbmNlcworCSAgd2hlcmUgdGhlIHdhdGNoZG9nIHdpbGwgZmFpbCB0byByZXNldCB0aGUgYm9hcmQgY29ycmVjdGx5CisJICAoZS5nLiwgaWYgdGhlIGJvb3QgUk9NIGlzIGluIGFuIHVucmVhZGFibGUgc3RhdGUpLgorCisJICBTYXkgTiBpZiB5b3UgYXJlIHVuc3VyZS4KKworY29uZmlnIElYUDIwMDBfV0FUQ0hET0cKKwl0cmlzdGF0ZSAiSVhQMjAwMCBXYXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIEFSQ0hfSVhQMjAwMAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgd2F0Y2hkb2cgdGltZXIKKwkgIGluIHRoZSBJbnRlbCBJWFAyMDAwKDI0MDAsIDI4MDAsIDI4NTApIG5ldHdvcmsgcHJvY2Vzc29ycy4KKwkgIFRoaXMgZHJpdmVyIGNhbiBiZSBidWlsdCBhcyBhIG1vZHVsZSBieSBjaG9vc2luZyBNLiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpeHAyMDAwX3dkdC4KKworCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKK2NvbmZpZyBTM0MyNDEwX1dBVENIRE9HCisJdHJpc3RhdGUgIlMzQzI0MTAgV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBBUkNIX1MzQzI0MTAKKwloZWxwCisJICBXYXRjaGRvZyB0aW1lciBibG9jayBpbiB0aGUgU2Ftc3VuZyBTM0MyNDEwIGNoaXBzLiBUaGlzIHdpbGwKKwkgIHJlYm9vdCB0aGUgc3lzdGVtIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMgd2l0aCB0aGUgd2F0Y2hkb2cKKwkgIGVuYWJsZWQuCisKKwkgIFRoZSBkcml2ZXIgaXMgbGltaXRlZCBieSB0aGUgc3BlZWQgb2YgdGhlIHN5c3RlbSdzIFBDTEsKKwkgIHNpZ25hbCwgc28gd2l0aCByZWFzb25iYWx5IGZhc3Qgc3lzdGVtcyAoUENMSyBhcm91bmQgNTAtNjZNSHopCisJICB0aGVuIHdhdGNoZG9nIGludGVydmFscyBvZiBvdmVyIGFwcHJveGltYXRlbHkgMjBzZWNvbmRzIGFyZQorCSAgdW5hdmFpbGFibGUuCisKKwkgIFRoZSBkcml2ZXIgY2FuIGJlIGJ1aWx0IGFzIGEgbW9kdWxlIGJ5IGNob29zaW5nIE0sIGFuZCB3aWxsCisJICBiZSBjYWxsZWQgczNjMjQxMF93ZHQKKworY29uZmlnIFNBMTEwMF9XQVRDSERPRworCXRyaXN0YXRlICJTQTExMDAvUFhBMnh4IHdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgKCBBUkNIX1NBMTEwMCB8fCBBUkNIX1BYQSApCisJaGVscAorCSAgV2F0Y2hkb2cgdGltZXIgZW1iZWRkZWQgaW50byBTQTExeDAgYW5kIFBYQTJ4eCBjaGlwcy4gVGhpcyB3aWxsCisJICByZWJvb3QgeW91ciBzeXN0ZW0gd2hlbiB0aW1lb3V0IGlzIHJlYWNoZWQuCisKKwkgIE5PVEU6IG9uY2UgZW5hYmxlZCwgdGhpcyB0aW1lciBjYW5ub3QgYmUgZGlzYWJsZWQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNhMTEwMF93ZHQuCisKKyMgWDg2IChpMzg2ICsgaWE2NCArIHg4Nl82NCkgQXJjaGl0ZWN0dXJlCisKK2NvbmZpZyBBQ1FVSVJFX1dEVAorCXRyaXN0YXRlICJBY3F1aXJlIFNCQyBXYXRjaGRvZyBUaW1lciIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFg4NgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIG9uIFNpbmdsZSBCb2FyZAorCSAgQ29tcHV0ZXJzIHByb2R1Y2VkIGJ5IEFjcXVpcmUgSW5jIChhbmQgb3RoZXJzKS4gVGhpcyB3YXRjaGRvZworCSAgc2ltcGx5IHdhdGNoZXMgeW91ciBrZXJuZWwgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZnJlZXplLCBhbmQgaWYKKwkgIGl0IGRvZXMsIGl0IHJlYm9vdHMgeW91ciBjb21wdXRlciBhZnRlciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFjcXVpcmV3ZHQuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCisKK2NvbmZpZyBBRFZBTlRFQ0hfV0RUCisJdHJpc3RhdGUgIkFkdmFudGVjaCBTQkMgV2F0Y2hkb2cgVGltZXIiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwloZWxwCisJICBJZiB5b3UgYXJlIGNvbmZpZ3VyaW5nIGEgTGludXgga2VybmVsIGZvciB0aGUgQWR2YW50ZWNoIHNpbmdsZS1ib2FyZAorCSAgY29tcHV0ZXIsIHNheSBgWScgaGVyZSB0byBzdXBwb3J0IGl0cyBidWlsdC1pbiB3YXRjaGRvZyB0aW1lcgorCSAgZmVhdHVyZS4gTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgYXQKKwkgIDxodHRwOi8vd3d3LmFkdmFudGVjaC5jb20udHcvcHJvZHVjdHMvPgorCitjb25maWcgQUxJTTE1MzVfV0RUCisJdHJpc3RhdGUgIkFMaSBNMTUzNSBQTVUgV2F0Y2hkb2cgVGltZXIiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYgJiYgUENJCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgb24gdGhlIEFMaSBNMTUzNSBQTVUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFsaW0xNTM1X3dkdC4KKworCSAgTW9zdCBwZW9wbGUgd2lsbCBzYXkgTi4KKworY29uZmlnIEFMSU03MTAxX1dEVAorCXRyaXN0YXRlICJBTGkgTTcxMDEgUE1VIENvbXB1dGVyIFdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2ICYmIFBDSQorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIG9uIHRoZSBBTGkgTTcxMDEgUE1VCisJICBhcyB1c2VkIGluIHRoZSB4ODYgQ29iYWx0IHNlcnZlcnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFsaW03MTAxX3dkdC4KKworCSAgTW9zdCBwZW9wbGUgd2lsbCBzYXkgTi4KKworY29uZmlnIFNDNTIwX1dEVAorCXRyaXN0YXRlICJBTUQgRWxhbiBTQzUyMCBwcm9jZXNzb3IgV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwloZWxwCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBidWlsdCBpbiB0byB0aGUKKwkgIEFNRCAiRWxhbiIgU0M1MjAgbWljcm9jb21wdXRlciBjb21tb25seSB1c2VkIGluIGVtYmVkZGVkIHN5c3RlbXMuCisJICBUaGlzIHdhdGNoZG9nIHNpbXBseSB3YXRjaGVzIHlvdXIga2VybmVsIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0CisJICBmcmVlemUsIGFuZCBpZiBpdCBkb2VzLCBpdCByZWJvb3RzIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgYSBjZXJ0YWluCisJICBhbW91bnQgb2YgdGltZS4KKworCSAgWW91IGNhbiBjb21waWxlIHRoaXMgZHJpdmVyIGRpcmVjdGx5IGludG8gdGhlIGtlcm5lbCwgb3IgdXNlCisJICBpdCBhcyBhIG1vZHVsZS4gIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2M1MjBfd2R0LgorCitjb25maWcgRVVST1RFQ0hfV0RUCisJdHJpc3RhdGUgIkV1cm90ZWNoIENQVS0xMjIwLzE0MTAgV2F0Y2hkb2cgVGltZXIiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIHdhdGNoZG9nIHRpbWVyIG9uIHRoZSBFdXJvdGVjaCBDUFUtMTIyMCBhbmQKKwkgIENQVS0xNDEwIGNhcmRzLiAgVGhlc2UgYXJlIFBDLzEwNCBTQkNzLiBTcGVjIHNoZWV0cyBhbmQgcHJvZHVjdAorCSAgaW5mb3JtYXRpb24gYXJlIGF0IDxodHRwOi8vd3d3LmV1cm90ZWNoLml0Lz4uCisKK2NvbmZpZyBJQjcwMF9XRFQKKwl0cmlzdGF0ZSAiSUI3MDAgU0JDIFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgb24gdGhlIElCNzAwIFNpbmdsZQorCSAgQm9hcmQgQ29tcHV0ZXIgcHJvZHVjZWQgYnkgVE1DIFRlY2hub2xvZ3kgKHd3dy50bWMtdWsuY29tKS4gVGhpcyB3YXRjaGRvZworCSAgc2ltcGx5IHdhdGNoZXMgeW91ciBrZXJuZWwgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZnJlZXplLCBhbmQgaWYKKwkgIGl0IGRvZXMsIGl0IHJlYm9vdHMgeW91ciBjb21wdXRlciBhZnRlciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUuCisKKwkgIFRoaXMgZHJpdmVyIGlzIGxpa2UgdGhlIFdEVDUwMSBkcml2ZXIgYnV0IGZvciBzbGlnaHRseSBkaWZmZXJlbnQgaGFyZHdhcmUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGliNzAwd2R0LgorCisJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgorCitjb25maWcgV0FGRVJfV0RUCisJdHJpc3RhdGUgIklDUCBXYWZlciA1ODIzIFNpbmdsZSBCb2FyZCBDb21wdXRlciBXYXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFg4NgorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBvbiB0aGUgSUNQIFdhZmVyIDU4MjMKKwkgIFNpbmdsZSBCb2FyZCBDb21wdXRlciAoYW5kIHByb2JhYmx5IG90aGVyIHNpbWlsYXIgbW9kZWxzKS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgd2FmZXI1ODIzd2R0LgorCitjb25maWcgSThYWF9UQ08KKwl0cmlzdGF0ZSAiSW50ZWwgaTh4eCBUQ08gVGltZXIvV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiAoWDg2IHx8IElBNjQpICYmIFBDSQorCS0tLWhlbHAtLS0KKwkgIEhhcmR3YXJlIGRyaXZlciBmb3IgdGhlIFRDTyB0aW1lciBidWlsdCBpbnRvIHRoZSBJbnRlbCA4MjgwMQorCSAgSS9PIENvbnRyb2xsZXIgSHViIGZhbWlseS4gIFRoZSBUQ08gKFRvdGFsIENvc3Qgb2YgT3duZXJzaGlwKQorCSAgdGltZXIgaXMgYSB3YXRjaGRvZyB0aW1lciB0aGF0IHdpbGwgcmVib290IHRoZSBtYWNoaW5lIGFmdGVyCisJICBpdHMgc2Vjb25kIGV4cGlyYXRpb24uIFRoZSBleHBpcmF0aW9uIHRpbWUgY2FuIGJlIGNvbmZpZ3VyZWQKKwkgIHdpdGggdGhlICJoZWFydGJlYXQiIHBhcmFtZXRlci4KKworCSAgT24gc29tZSBtb3RoZXJib2FyZHMgdGhlIGRyaXZlciBtYXkgZmFpbCB0byByZXNldCB0aGUgY2hpcHNldCdzCisJICBOT19SRUJPT1QgZmxhZyB3aGljaCBwcmV2ZW50cyB0aGUgd2F0Y2hkb2cgZnJvbSByZWJvb3RpbmcgdGhlCisJICBtYWNoaW5lLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHlvdSB3aWxsIGdldCBhIGtlcm5lbCBtZXNzYWdlIGxpa2UKKwkgICJmYWlsZWQgdG8gcmVzZXQgTk9fUkVCT09UIGZsYWcsIHJlYm9vdCBkaXNhYmxlZCBieSBoYXJkd2FyZSIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGk4eHhfdGNvLgorCitjb25maWcgU0MxMjAwX1dEVAorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBDODczMDcvUEM5NzMwNyAoYWxhIFNDMTIwMCkgV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwloZWxwCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBDODczMDcvUEM5NzMwNyBoYXJkd2FyZQorCSAgd2F0Y2hkb2cgY2FyZHMgYXMgZm91bmQgb24gdGhlIFNDMTIwMC4gVGhpcyB3YXRjaGRvZyBpcyBtYWlubHkgdXNlZAorCSAgZm9yIHBvd2VyIG1hbmFnZW1lbnQgcHVycG9zZXMgYW5kIGNhbiBiZSB1c2VkIHRvIHBvd2VyIGRvd24gdGhlIGRldmljZQorCSAgZHVyaW5nIGluYWN0aXZpdHkgcGVyaW9kcyAoaW5jbHVkZXMgaW50ZXJydXB0IGFjdGl2aXR5IG1vbml0b3JpbmcpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYzEyMDB3ZHQuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCisKK2NvbmZpZyBTQ3gyMDBfV0RUCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgU0N4MjAwIFdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgU0N4MjAwICYmIFBDSQorCWhlbHAKKwkgIEVuYWJsZSB0aGUgYnVpbHQtaW4gd2F0Y2hkb2cgdGltZXIgc3VwcG9ydCBvbiB0aGUgTmF0aW9uYWwKKwkgIFNlbWljb25kdWN0b3IgU0N4MjAwIHByb2Nlc3NvcnMuCisKKwkgIElmIGNvbXBpbGVkIGFzIGEgbW9kdWxlLCBpdCB3aWxsIGJlIGNhbGxlZCBzY3gyMDBfd2R0LgorCitjb25maWcgNjBYWF9XRFQKKwl0cmlzdGF0ZSAiU0JDLTYwWFggV2F0Y2hkb2cgVGltZXIiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwloZWxwCisJICBUaGlzIGRyaXZlciBjYW4gYmUgdXNlZCB3aXRoIHRoZSB3YXRjaGRvZyB0aW1lciBmb3VuZCBvbiBzb21lCisJICBzaW5nbGUgYm9hcmQgY29tcHV0ZXJzLCBuYW1lbHkgdGhlIDYwMTAgUElJIGJhc2VkIGNvbXB1dGVyLgorCSAgSXQgbWF5IHdlbGwgd29yayB3aXRoIG90aGVyIGNhcmRzLiAgSXQgcmVhZHMgcG9ydCAweDQ0MyB0byBlbmFibGUKKwkgIGFuZCByZS1zZXQgdGhlIHdhdGNoZG9nIHRpbWVyLCBhbmQgcmVhZHMgcG9ydCAweDQ1IHRvIGRpc2FibGUKKwkgIHRoZSB3YXRjaGRvZy4gIElmIHlvdSBoYXZlIGEgY2FyZCB0aGF0IGJlaGF2ZSBpbiBzaW1pbGFyIHdheXMsCisJICB5b3UgY2FuIHByb2JhYmx5IG1ha2UgdGhpcyBkcml2ZXIgd29yayB3aXRoIHlvdXIgY2FyZCBhcyB3ZWxsLgorCisJICBZb3UgY2FuIGNvbXBpbGUgdGhpcyBkcml2ZXIgZGlyZWN0bHkgaW50byB0aGUga2VybmVsLCBvciB1c2UKKwkgIGl0IGFzIGEgbW9kdWxlLiAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYmM2MHh4d2R0LgorCitjb25maWcgQ1BVNV9XRFQKKwl0cmlzdGF0ZSAiU01BIENQVTUgV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwktLS1oZWxwLS0tCisJICBUQkQuCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjcHU1d2R0LgorCitjb25maWcgVzgzNjI3SEZfV0RUCisJdHJpc3RhdGUgIlc4MzYyN0hGIFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgb24gdGhlIFc4MzYyN0hGIGNoaXBzZXQKKwkgIGFzIHVzZWQgaW4gQWR2YW50ZWNoIFBDLTk1NzggYW5kIFR5YW4gUzI3MjEtNTMzIG1vdGhlcmJvYXJkcworCSAgKGFuZCBsaWtlbHkgb3RoZXJzKS4gIFRoaXMgd2F0Y2hkb2cgc2ltcGx5IHdhdGNoZXMgeW91ciBrZXJuZWwgdG8KKwkgIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGZyZWV6ZSwgYW5kIGlmIGl0IGRvZXMsIGl0IHJlYm9vdHMgeW91ciBjb21wdXRlcgorCSAgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3ODM2MjdoZl93ZHQuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCisKK2NvbmZpZyBXODM4NzdGX1dEVAorCXRyaXN0YXRlICJXODM4NzdGIChFTUFDUykgV2F0Y2hkb2cgVGltZXIiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBvbiB0aGUgVzgzODc3RiBjaGlwc2V0CisJICBhcyB1c2VkIGluIEVNQUNTIFBDLTEwNCBtb3RoZXJib2FyZHMgKGFuZCBsaWtlbHkgb3RoZXJzKS4gIFRoaXMKKwkgIHdhdGNoZG9nIHNpbXBseSB3YXRjaGVzIHlvdXIga2VybmVsIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGZyZWV6ZSwKKwkgIGFuZCBpZiBpdCBkb2VzLCBpdCByZWJvb3RzIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZgorCSAgdGltZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdzgzODc3Zl93ZHQuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCisKK2NvbmZpZyBNQUNIWl9XRFQKKwl0cmlzdGF0ZSAiWkYgTWFjaFogV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgYXJlIHVzaW5nIGEgWkYgTWljcm8gTWFjaFogcHJvY2Vzc29yLCBzYXkgWSBoZXJlLCBvdGhlcndpc2UKKwkgIE4uICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSB3YXRjaGRvZyB0aW1lciBidWlsdGluIG9uIHRoYXQKKwkgIHByb2Nlc3NvciB1c2luZyBaRi1Mb2dpYyBpbnRlcmZhY2UuICBUaGlzIHdhdGNoZG9nIHNpbXBseSB3YXRjaGVzCisJICB5b3VyIGtlcm5lbCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBmcmVlemUsIGFuZCBpZiBpdCBkb2VzLCBpdAorCSAgcmVib290cyB5b3VyIGNvbXB1dGVyIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWFjaHp3ZC4KKworIyBQb3dlclBDIEFyY2hpdGVjdHVyZQorCitjb25maWcgOHh4X1dEVAorCXRyaXN0YXRlICJNUEM4eHggV2F0Y2hkb2cgVGltZXIiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiA4eHgKKworIyBNSVBTIEFyY2hpdGVjdHVyZQorCitjb25maWcgSU5EWURPRworCXRyaXN0YXRlICJJbmR5L0kyIEhhcmR3YXJlIFdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgU0dJX0lQMjIKKwloZWxwCisJICBIYXJkd2FyZWRyaXZlciBmb3IgdGhlIEluZHkncy9JMidzIHdhdGNoZG9nLiBUaGlzIGlzIGEKKwkgIHdhdGNoZG9nIHRpbWVyIHRoYXQgd2lsbCByZWJvb3QgdGhlIG1hY2hpbmUgYWZ0ZXIgYSA2MCBzZWNvbmQKKwkgIHRpbWVyIGV4cGlyZWQgYW5kIG5vIHByb2Nlc3MgaGFzIHdyaXR0ZW4gdG8gL2Rldi93YXRjaGRvZyBkdXJpbmcKKwkgIHRoYXQgdGltZS4KKworIyBTMzkwIEFyY2hpdGVjdHVyZQorCitjb25maWcgWlZNX1dBVENIRE9HCisJdHJpc3RhdGUgInovVk0gV2F0Y2hkb2cgVGltZXIiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBBUkNIX1MzOTAKKwloZWxwCisJICBJQk0gcy8zOTAgYW5kIHpTZXJpZXMgbWFjaGluZXMgcnVubmluZyB1bmRlciB6L1ZNIDUuMSBvciBsYXRlcgorCSAgcHJvdmlkZSBhIHZpcnR1YWwgd2F0Y2hkb2cgdGltZXIgdG8gdGhlaXIgZ3Vlc3QgdGhhdCBjYXVzZSBhCisJICB1c2VyIGRlZmluZSBDb250cm9sIFByb2dyYW0gY29tbWFuZCB0byBiZSBleGVjdXRlZCBhZnRlciBhCisJICB0aW1lb3V0LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB2bXdhdGNoZG9nLgorCisjIFNVUEVSSCBBcmNoaXRlY3R1cmUKKworY29uZmlnIFNIX1dEVAorCXRyaXN0YXRlICJTdXBlckggV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBTVVBFUkgKKwloZWxwCisJICBUaGlzIGRyaXZlciBhZGRzIHdhdGNoZG9nIHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIHdhdGNoZG9nIGluIHRoZQorCSAgU3VwZXJIIHByb2Nlc3NvcnMuIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBwcm9jZXNzb3JzIGFuZCB3aXNoCisJICB0byBoYXZlIHdhdGNoZG9nIHN1cHBvcnQgZW5hYmxlZCwgc2F5IFksIG90aGVyd2lzZSBzYXkgTi4KKworCSAgQXMgYSBzaWRlIG5vdGUsIHNheWluZyBZIGhlcmUgd2lsbCBhdXRvbWF0aWNhbGx5IGJvb3N0IEhaIHRvIDEwMDAKKwkgIHNvIHRoYXQgdGhlIHRpbWVyIGhhcyBhIGNoYW5jZSB0byBjbGVhciB0aGUgb3ZlcmZsb3cgY291bnRlci4gT24KKwkgIHNsb3dlciBzeXN0ZW1zIChzdWNoIGFzIHRoZSBTSC0yIGFuZCBTSC0zKSB0aGlzIHdpbGwgbGlrZWx5IHlpZWxkCisJICBzb21lIHBlcmZvcm1hbmNlIGlzc3Vlcy4gQXMgc3VjaCwgdGhlIFdEVCBzaG91bGQgYmUgYXZvaWRlZCBoZXJlCisJICB1bmxlc3MgaXQgaXMgYWJzb2x1dGVseSBuZWNlc3NhcnkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNod2R0LgorCisjIFNQQVJDNjQgQXJjaGl0ZWN0dXJlCisKK2NvbmZpZyBXQVRDSERPR19DUDFYWFgKKwl0cmlzdGF0ZSAiQ1AxWFhYIEhhcmR3YXJlIFdhdGNoZG9nIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBTUEFSQzY0ICYmIFBDSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIHRpbWVycyBwcmVzZW50IG9uCisJICBTdW4gTWljcm9zeXN0ZW1zIENvbXBhY3RQQ0kgbW9kZWxzIENQMTQwMCBhbmQgQ1AxNTAwLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjcHdhdGNoZG9nLgorCisJICBJZiB5b3UgZG8gbm90IGhhdmUgYSBDb21wYWN0UENJIG1vZGVsIENQMTQwMCBvciBDUDE1MDAsIG9yCisJICBhbm90aGVyIFVsdHJhU1BBUkMtSUlpLWNFbmdpbmUgYm9hcmRzZXQgd2l0aCBoYXJkd2FyZSB3YXRjaGRvZywKKwkgIHlvdSBzaG91bGQgc2F5IE4gdG8gdGhpcyBvcHRpb24uCisKK2NvbmZpZyBXQVRDSERPR19SSU8KKwl0cmlzdGF0ZSAiUklPIEhhcmR3YXJlIFdhdGNoZG9nIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBTUEFSQzY0ICYmIFBDSQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgY2FwYWJpbGl0eSBvbiBTdW4gUklPCisJICBtYWNoaW5lcy4gIFRoZSB3YXRjaGRvZyB0aW1lb3V0IHBlcmlvZCBpcyBub3JtYWxseSBvbmUgbWludXRlIGJ1dAorCSAgY2FuIGJlIGNoYW5nZWQgd2l0aCBhIGJvb3QtdGltZSBwYXJhbWV0ZXIuCisKKyMKKyMgSVNBLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisKK2NvbW1lbnQgIklTQS1iYXNlZCBXYXRjaGRvZyBDYXJkcyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIElTQQorCitjb25maWcgUENXQVRDSERPRworCXRyaXN0YXRlICJCZXJrc2hpcmUgUHJvZHVjdHMgSVNBLVBDIFdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgSVNBCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgQmVya3NoaXJlIFByb2R1Y3RzIElTQS1QQyBXYXRjaGRvZyBjYXJkLgorCSAgVGhpcyBjYXJkIHNpbXBseSB3YXRjaGVzIHlvdXIga2VybmVsIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGZyZWV6ZSwKKwkgIGFuZCBpZiBpdCBkb2VzLCBpdCByZWJvb3RzIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZgorCSAgdGltZS4gVGhpcyBkcml2ZXIgaXMgbGlrZSB0aGUgV0RUNTAxIGRyaXZlciBidXQgZm9yIGRpZmZlcmVudAorCSAgaGFyZHdhcmUuIFBsZWFzZSByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vd2F0Y2hkb2cvcGN3ZC13YXRjaGRvZy50eHQ+LiBUaGUgUEMKKwkgIHdhdGNoZG9nIGNhcmRzIGNhbiBiZSBvcmRlcmVkIGZyb20gPGh0dHA6Ly93d3cuYmVya3Byb2QuY29tLz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBjd2QuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCisKK2NvbmZpZyBNSVhDT01XRAorCXRyaXN0YXRlICJNaXhjb20gV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBJU0EKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgTWl4Y29tIGhhcmR3YXJlIHdhdGNoZG9nIGNhcmRzLiAgVGhpcworCSAgd2F0Y2hkb2cgc2ltcGx5IHdhdGNoZXMgeW91ciBrZXJuZWwgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZnJlZXplLAorCSAgYW5kIGlmIGl0IGRvZXMsIGl0IHJlYm9vdHMgeW91ciBjb21wdXRlciBhZnRlciBhIGNlcnRhaW4gYW1vdW50IG9mCisJICB0aW1lLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtaXhjb213ZC4KKworCSAgTW9zdCBwZW9wbGUgd2lsbCBzYXkgTi4KKworY29uZmlnIFdEVAorCXRyaXN0YXRlICJXRFQgV2F0Y2hkb2cgdGltZXIiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBJU0EKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIFdEVDUwMFAgb3IgV0RUNTAxUCB3YXRjaGRvZyBib2FyZCwgc2F5IFkgaGVyZSwKKwkgIG90aGVyd2lzZSBOLiBJdCBpcyBub3QgcG9zc2libGUgdG8gcHJvYmUgZm9yIHRoaXMgYm9hcmQsIHdoaWNoIG1lYW5zCisJICB0aGF0IHlvdSBoYXZlIHRvIGluZm9ybSB0aGUga2VybmVsIGFib3V0IHRoZSBJTyBwb3J0IGFuZCBJUlEgdGhhdAorCSAgaXMgbmVlZGVkICh5b3UgY2FuIGRvIHRoaXMgdmlhIHRoZSBpbyBhbmQgaXJxIHBhcmFtZXRlcnMpCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdkdC4KKworY29uZmlnIFdEVF81MDEKKwlib29sICJXRFQ1MDEgZmVhdHVyZXMiCisJZGVwZW5kcyBvbiBXRFQKKwloZWxwCisJICBTYXlpbmcgWSBoZXJlIGFuZCBjcmVhdGluZyBhIGNoYXJhY3RlciBzcGVjaWFsIGZpbGUgL2Rldi90ZW1wZXJhdHVyZQorCSAgd2l0aCBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yIG51bWJlciAxMzEgKCJtYW4gbWtub2QiKSB3aWxsIGdpdmUKKwkgIHlvdSBhIHRoZXJtb21ldGVyIGluc2lkZSB5b3VyIGNvbXB1dGVyOiByZWFkaW5nIGZyb20KKwkgIC9kZXYvdGVtcGVyYXR1cmUgeWllbGRzIG9uZSBieXRlLCB0aGUgdGVtcGVyYXR1cmUgaW4gZGVncmVlcworCSAgRmFocmVuaGVpdC4gVGhpcyB3b3JrcyBvbmx5IGlmIHlvdSBoYXZlIGEgV0RUNTAxUCB3YXRjaGRvZyBib2FyZAorCSAgaW5zdGFsbGVkLgorCisJICBJZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIEZhbiBUYWNob21ldGVyIG9uIHRoZSBXRFQ1MDFQLCB0aGVuIHlvdQorCSAgY2FuIGRvIHRoaXMgdmlhIHRoZSB0YWNob21ldGVyIHBhcmFtZXRlci4gT25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEKKwkgIGZhbiB0YWNob21ldGVyIGFjdHVhbGx5IHNldCB1cC4KKworIworIyBQQ0ktYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKworY29tbWVudCAiUENJLWJhc2VkIFdhdGNoZG9nIENhcmRzIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgUENJCisKK2NvbmZpZyBQQ0lQQ1dBVENIRE9HCisJdHJpc3RhdGUgIkJlcmtzaGlyZSBQcm9kdWN0cyBQQ0ktUEMgV2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBCZXJrc2hpcmUgUHJvZHVjdHMgUENJLVBDIFdhdGNoZG9nIGNhcmQuCisJICBUaGlzIGNhcmQgc2ltcGx5IHdhdGNoZXMgeW91ciBrZXJuZWwgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZnJlZXplLAorCSAgYW5kIGlmIGl0IGRvZXMsIGl0IHJlYm9vdHMgeW91ciBjb21wdXRlciBhZnRlciBhIGNlcnRhaW4gYW1vdW50IG9mCisJICB0aW1lLiBUaGUgY2FyZCBjYW4gYWxzbyBtb25pdG9yIHRoZSBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBvZiB0aGUgUEMuCisJICBNb3JlIGluZm8gaXMgYXZhaWxhYmxlIGF0IDxodHRwOi8vd3d3LmJlcmtwcm9kLmNvbS9wY2lfcGNfd2F0Y2hkb2cuaHRtPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGN3ZF9wY2kuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCisKK2NvbmZpZyBXRFRQQ0kKKwl0cmlzdGF0ZSAiUENJLVdEVDUwMC81MDEgV2F0Y2hkb2cgdGltZXIiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIFBDSS1XRFQ1MDAvNTAxIHdhdGNoZG9nIGJvYXJkLCBzYXkgWSBoZXJlLCBvdGhlcndpc2UgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgd2R0X3BjaS4KKworY29uZmlnIFdEVF81MDFfUENJCisJYm9vbCAiUENJLVdEVDUwMSBmZWF0dXJlcyIKKwlkZXBlbmRzIG9uIFdEVFBDSQorCWhlbHAKKwkgIFNheWluZyBZIGhlcmUgYW5kIGNyZWF0aW5nIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3RlbXBlcmF0dXJlCisJICB3aXRoIG1ham9yIG51bWJlciAxMCBhbmQgbWlub3IgbnVtYmVyIDEzMSAoIm1hbiBta25vZCIpIHdpbGwgZ2l2ZQorCSAgeW91IGEgdGhlcm1vbWV0ZXIgaW5zaWRlIHlvdXIgY29tcHV0ZXI6IHJlYWRpbmcgZnJvbQorCSAgL2Rldi90ZW1wZXJhdHVyZSB5aWVsZHMgb25lIGJ5dGUsIHRoZSB0ZW1wZXJhdHVyZSBpbiBkZWdyZWVzCisJICBGYWhyZW5oZWl0LiBUaGlzIHdvcmtzIG9ubHkgaWYgeW91IGhhdmUgYSBQQ0ktV0RUNTAxIHdhdGNoZG9nIGJvYXJkCisJICBpbnN0YWxsZWQuCisKKwkgIElmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGUgRmFuIFRhY2hvbWV0ZXIgb24gdGhlIFBDSS1XRFQ1MDEsIHRoZW4geW91CisJICBjYW4gZG8gdGhpcyB2aWEgdGhlIHRhY2hvbWV0ZXIgcGFyYW1ldGVyLiBPbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYQorCSAgZmFuIHRhY2hvbWV0ZXIgYWN0dWFsbHkgc2V0IHVwLgorCisjCisjIFVTQi1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworCitjb21tZW50ICJVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBVU0IKKworY29uZmlnIFVTQlBDV0FUQ0hET0cKKwl0cmlzdGF0ZSAiQmVya3NoaXJlIFByb2R1Y3RzIFVTQi1QQyBXYXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFVTQgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIEJlcmtzaGlyZSBQcm9kdWN0cyBVU0ItUEMgV2F0Y2hkb2cgY2FyZC4KKwkgIFRoaXMgY2FyZCBzaW1wbHkgd2F0Y2hlcyB5b3VyIGtlcm5lbCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBmcmVlemUsCisJICBhbmQgaWYgaXQgZG9lcywgaXQgcmVib290cyB5b3VyIGNvbXB1dGVyIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YKKwkgIHRpbWUuIFRoZSBjYXJkIGNhbiBhbHNvIG1vbml0b3IgdGhlIGludGVybmFsIHRlbXBlcmF0dXJlIG9mIHRoZSBQQy4KKwkgIE1vcmUgaW5mbyBpcyBhdmFpbGFibGUgYXQgPGh0dHA6Ly93d3cuYmVya3Byb2QuY29tL3VzYl9wY193YXRjaGRvZy5odG0+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwY3dkX3VzYi4KKworCSAgTW9zdCBwZW9wbGUgd2lsbCBzYXkgTi4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZDI3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUKQEAgLTAsMCArMSw0MiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIFdhdGNoRG9nIGRldmljZSBkcml2ZXJzLgorIworCitvYmotJChDT05GSUdfUENXQVRDSERPRykgKz0gcGN3ZC5vCitvYmotJChDT05GSUdfQUNRVUlSRV9XRFQpICs9IGFjcXVpcmV3ZHQubworb2JqLSQoQ09ORklHX0FEVkFOVEVDSF9XRFQpICs9IGFkdmFudGVjaHdkdC5vCitvYmotJChDT05GSUdfSUI3MDBfV0RUKSArPSBpYjcwMHdkdC5vCitvYmotJChDT05GSUdfTUlYQ09NV0QpICs9IG1peGNvbXdkLm8KK29iai0kKENPTkZJR19TQ3gyMDBfV0RUKSArPSBzY3gyMDBfd2R0Lm8KK29iai0kKENPTkZJR182MFhYX1dEVCkgKz0gc2JjNjB4eHdkdC5vCitvYmotJChDT05GSUdfV0RUKSArPSB3ZHQubworb2JqLSQoQ09ORklHX1dEVFBDSSkgKz0gd2R0X3BjaS5vCitvYmotJChDT05GSUdfMjEyODVfV0FUQ0hET0cpICs9IHdkdDI4NS5vCitvYmotJChDT05GSUdfOTc3X1dBVENIRE9HKSArPSB3ZHQ5Nzcubworb2JqLSQoQ09ORklHX0k4WFhfVENPKSArPSBpOHh4X3Rjby5vCitvYmotJChDT05GSUdfTUFDSFpfV0RUKSArPSBtYWNoendkLm8KK29iai0kKENPTkZJR19TSF9XRFQpICs9IHNod2R0Lm8KK29iai0kKENPTkZJR19TM0MyNDEwX1dBVENIRE9HKSArPSBzM2MyNDEwX3dkdC5vCitvYmotJChDT05GSUdfU0ExMTAwX1dBVENIRE9HKSArPSBzYTExMDBfd2R0Lm8KK29iai0kKENPTkZJR19FVVJPVEVDSF9XRFQpICs9IGV1cm90ZWNod2R0Lm8KK29iai0kKENPTkZJR19XODM4NzdGX1dEVCkgKz0gdzgzODc3Zl93ZHQubworb2JqLSQoQ09ORklHX1c4MzYyN0hGX1dEVCkgKz0gdzgzNjI3aGZfd2R0Lm8KK29iai0kKENPTkZJR19TQzUyMF9XRFQpICs9IHNjNTIwX3dkdC5vCitvYmotJChDT05GSUdfQUxJTTcxMDFfV0RUKSArPSBhbGltNzEwMV93ZHQubworb2JqLSQoQ09ORklHX0FMSU0xNTM1X1dEVCkgKz0gYWxpbTE1MzVfd2R0Lm8KK29iai0kKENPTkZJR19TQzEyMDBfV0RUKSArPSBzYzEyMDB3ZHQubworb2JqLSQoQ09ORklHX1dBRkVSX1dEVCkgKz0gd2FmZXI1ODIzd2R0Lm8KK29iai0kKENPTkZJR19DUFU1X1dEVCkgKz0gY3B1NXdkdC5vCitvYmotJChDT05GSUdfSU5EWURPRykgKz0gaW5keWRvZy5vCitvYmotJChDT05GSUdfUENJUENXQVRDSERPRykgKz0gcGN3ZF9wY2kubworb2JqLSQoQ09ORklHX1VTQlBDV0FUQ0hET0cpICs9IHBjd2RfdXNiLm8KK29iai0kKENPTkZJR19JWFA0WFhfV0FUQ0hET0cpICs9IGl4cDR4eF93ZHQubworb2JqLSQoQ09ORklHX0lYUDIwMDBfV0FUQ0hET0cpICs9IGl4cDIwMDBfd2R0Lm8KK29iai0kKENPTkZJR184eHhfV0RUKSArPSBtcGM4eHhfd2R0Lm8KKworIyBPbmx5IG9uZSB3YXRjaGRvZyBjYW4gc3VjY2VlZC4gV2UgcHJvYmUgdGhlIGhhcmR3YXJlIHdhdGNoZG9nCisjIGRyaXZlcnMgZmlyc3QsIHRoZW4gdGhlIHNvZnRkb2cgZHJpdmVyLiAgVGhpcyBtZWFucyBpZiB5b3VyIGhhcmR3YXJlCisjIHdhdGNoZG9nIGRpZXMgb3IgaXMgJ2JvcnJvd2VkJyBmb3Igc29tZSByZWFzb24gdGhlIHNvZnR3YXJlIHdhdGNoZG9nCisjIHN0aWxsIGdpdmVzIHlvdSBzb21lIGNvdmVyLgorCitvYmotJChDT05GSUdfU09GVF9XQVRDSERPRykgKz0gc29mdGRvZy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYWNxdWlyZXdkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2FjcXVpcmV3ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjMwMjEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2FjcXVpcmV3ZHQuYwpAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqCUFjcXVpcmUgU2luZ2xlIEJvYXJkIENvbXB1dGVyIFdhdGNoZG9nIFRpbWVyIGRyaXZlcgorICoKKyAqICAgICAgQmFzZWQgb24gd2R0LmMuIE9yaWdpbmFsIGNvcHlyaWdodCBtZXNzYWdlczoKKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTYgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgkJCQlodHRwOi8vd3d3LnJlZGhhdC5jb20KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCU5laXRoZXIgQWxhbiBDb3ggbm9yIEN5bXJ1TmV0IEx0ZC4gYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCisgKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKKyAqCSJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTUgICAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiAgICAgIDE0LURlYy0yMDAxIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqICAgICAgICAgIEFkZGVkIG5vd2F5b3V0IG1vZHVsZSBvcHRpb24gdG8gb3ZlcnJpZGUgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCisgKiAgICAgICAgICBDYW4ndCBhZGQgdGltZW91dCAtIGRyaXZlciBkb2Vzbid0IGFsbG93IGNoYW5naW5nIHZhbHVlCisgKi8KKworLyoKKyAqCVRoZW9yeSBvZiBPcGVyYXRpb246CisgKgkJVGhlIFdhdGNoLURvZyBUaW1lciBpcyBwcm92aWRlZCB0byBlbnN1cmUgdGhhdCBzdGFuZGFsb25lCisgKgkJU3lzdGVtcyBjYW4gYWx3YXlzIHJlY292ZXIgZnJvbSBjYXRhc3Ryb3BoaWMgY29uZGl0aW9ucyB0aGF0CisgKgkJY2F1c2VkIHRoZSBDUFUgdG8gY3Jhc2guIFRoaXMgY29uZGl0aW9uIG1heSBoYXZlIG9jY3VyZWQgYnkKKyAqCQlleHRlcm5hbCBFTUkgb3IgYSBzb2Z0d2FyZSBidWcuIFdoZW4gdGhlIENQVSBzdG9wcyB3b3JraW5nCisgKgkJY29ycmVjdGx5LCBoYXJkd2FyZSBvbiB0aGUgYm9hcmQgd2lsbCBlaXRoZXIgcGVyZm9ybSBhIGhhcmR3YXJlCisgKgkJcmVzZXQgKGNvbGQgYm9vdCkgb3IgYSBub24tbWFza2FibGUgaW50ZXJydXB0IChOTUkpIHRvIGJyaW5nIHRoZQorICoJCXN5c3RlbSBiYWNrIHRvIGEga25vd24gc3RhdGUuCisgKgorICoJCVRoZSBXYXRjaC1Eb2cgVGltZXIgaXMgY29udHJvbGxlZCBieSB0d28gSS9PIFBvcnRzLgorICoJCSAgNDQzIGhleAktIFJlYWQJLSBFbmFibGUgb3IgcmVmcmVzaCB0aGUgV2F0Y2gtRG9nIFRpbWVyCisgKgkJICAwNDMgaGV4CS0gUmVhZAktIERpc2FibGUgdGhlIFdhdGNoLURvZyBUaW1lcgorICoKKyAqCQlUbyBlbmFibGUgdGhlIFdhdGNoLURvZyBUaW1lciwgYSByZWFkIGZyb20gSS9PIHBvcnQgNDQzaCBtdXN0CisgKgkJYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZW5hYmxlIGFuZCBhY3RpdmF0ZSB0aGUgY291bnRkb3duIHRpbWVyCisgKgkJd2hpY2ggd2lsbCBldmVudHVhbGx5IHRpbWUgb3V0IGFuZCBlaXRoZXIgcmVzZXQgdGhlIENQVSBvciBjYXVzZQorICoJCWFuIE5NSSBkZXBlbmRpbmcgb24gdGhlIHNldHRpbmcgb2YgYSBqdW1wZXIuIFRvIGVuc3VyZSB0aGF0IHRoaXMKKyAqCQlyZXNldCBjb25kaXRpb24gZG9lcyBub3Qgb2NjdXIsIHRoZSBXYXRjaC1Eb2cgVGltZXIgbXVzdCBiZQorICoJCXBlcmlvZGljYWxseSByZWZyZXNoZWQgYnkgcmVhZGluZyB0aGUgc2FtZSBJL08gcG9ydCA0NDNoLgorICoJCVRoZSBXYXRjaC1Eb2cgVGltZXIgaXMgZGlzYWJsZWQgYnkgcmVhZGluZyBJL08gcG9ydCAwNDNoLgorICoKKyAqCQlUaGUgV2F0Y2gtRG9nIFRpbWVyIFRpbWUtT3V0IFBlcmlvZCBpcyBzZXQgdmlhIGp1bXBlcnMuCisgKgkJSXQgY2FuIGJlIDEsIDIsIDEwLCAyMCwgMTEwIG9yIDIyMCBzZWNvbmRzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIFdBVENIRE9HX05BTUUgIkFjcXVpcmUgV0RUIgorI2RlZmluZSBQRlggV0FUQ0hET0dfTkFNRSAiOiAiCisjZGVmaW5lIFdBVENIRE9HX0hFQVJUQkVBVCAwCS8qIFRoZXJlIGlzIG5vIHdheSB0byBzZWUgd2hhdCB0aGUgY29ycmVjdCB0aW1lLW91dCBwZXJpb2QgaXMgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWNxX2lzX29wZW47CitzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CisKKy8qCisgKglZb3UgbXVzdCBzZXQgdGhlc2UgLSB0aGVyZSBpcyBubyBzYW5lIHdheSB0byBwcm9iZSBmb3IgdGhpcyBib2FyZC4KKyAqLworCitzdGF0aWMgaW50IHdkdF9zdG9wID0gMHg0MzsKK21vZHVsZV9wYXJhbSh3ZHRfc3RvcCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2R0X3N0b3AsICJBY3F1aXJlIFdEVCAnc3RvcCcgaW8gcG9ydCAoZGVmYXVsdCAweDQzKSIpOworCitzdGF0aWMgaW50IHdkdF9zdGFydCA9IDB4NDQzOworbW9kdWxlX3BhcmFtKHdkdF9zdGFydCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2R0X3N0YXJ0LCAiQWNxdWlyZSBXRFQgJ3N0YXJ0JyBpbyBwb3J0IChkZWZhdWx0IDB4NDQzKSIpOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworLyoKKyAqCUtlcm5lbCBtZXRob2RzLgorICovCisKK3N0YXRpYyB2b2lkIGFjcV9rZWVwYWxpdmUodm9pZCkKK3sKKwkvKiBXcml0ZSBhIHdhdGNoZG9nIHZhbHVlICovCisJaW5iX3Aod2R0X3N0YXJ0KTsKK30KKworc3RhdGljIHZvaWQgYWNxX3N0b3Aodm9pZCkKK3sKKwkvKiBUdXJuIHRoZSBjYXJkIG9mZiAqLworCWluYl9wKHdkdF9zdG9wKTsKK30KKworLyoKKyAqCS9kZXYvd2F0Y2hkb2cgaGFuZGxpbmcuCisgKi8KKworc3RhdGljIHNzaXplX3QgYWNxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwkvKiBTZWUgaWYgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgJ1YnIGFuZCByZWxvYWQgdGhlIHRpbWVyICovCisJaWYoY291bnQpIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qIG5vdGU6IGp1c3QgaW4gY2FzZSBzb21lb25lIHdyb3RlIHRoZSBtYWdpYyBjaGFyYWN0ZXIKKwkJCSAqIGZpdmUgbW9udGhzIGFnby4uLiAqLworCQkJZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJLyogc2NhbiB0byBzZWUgd2hldGhlciBvciBub3Qgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgKi8KKwkJCWZvciAoaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmICsgaSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKworCQkvKiBXZWxsLCBhbnlob3cgc29tZW9uZSB3cm90ZSB0byB1cywgd2Ugc2hvdWxkIHJldHVybiB0aGF0IGZhdm91ciAqLworCQlhY3Ffa2VlcGFsaXZlKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBhY3FfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0KKwl7CisJCS5vcHRpb25zID0gV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIkFjcXVpcmUgV0RUIiwKKwl9OworCisJc3dpdGNoKGNtZCkKKwl7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCSAgcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJICByZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkgIGFjcV9rZWVwYWxpdmUoKTsKKwkgIHJldHVybiAwOworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCSAgcmV0dXJuIHB1dF91c2VyKFdBVENIRE9HX0hFQVJUQkVBVCwgcCk7CisKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJeworCSAgICBpZiAoZ2V0X3VzZXIob3B0aW9ucywgcCkpCisJICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKwkgICAgaWYgKG9wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkKKwkgICAgeworCSAgICAgIGFjcV9zdG9wKCk7CisJICAgICAgcmV0dmFsID0gMDsKKwkgICAgfQorCisJICAgIGlmIChvcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkKKwkgICAgeworCSAgICAgIGFjcV9rZWVwYWxpdmUoKTsKKwkgICAgICByZXR2YWwgPSAwOworCSAgICB9CisKKwkgICAgcmV0dXJuIHJldHZhbDsKKwl9CisKKwlkZWZhdWx0OgorCSAgcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYWNxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmFjcV9pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChub3dheW91dCkKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKworCS8qIEFjdGl2YXRlICovCisJYWNxX2tlZXBhbGl2ZSgpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBhY3FfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgeworCQlhY3Ffc3RvcCgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJYWNxX2tlZXBhbGl2ZSgpOworCX0KKwljbGVhcl9iaXQoMCwgJmFjcV9pc19vcGVuKTsKKwlleHBlY3RfY2xvc2UgPSAwOworCXJldHVybiAwOworfQorCisvKgorICoJTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCisgKi8KKworc3RhdGljIGludCBhY3Ffbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwl2b2lkICp1bnVzZWQpCit7CisJaWYoY29kZT09U1lTX0RPV04gfHwgY29kZT09U1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCQlhY3Ffc3RvcCgpOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglLZXJuZWwgSW50ZXJmYWNlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gYWNxX3dyaXRlLAorCS5pb2N0bAkJPSBhY3FfaW9jdGwsCisJLm9wZW4JCT0gYWNxX29wZW4sCisJLnJlbGVhc2UJPSBhY3FfY2xvc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYWNxX21pc2NkZXY9Cit7CisJLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgPSAid2F0Y2hkb2ciLAorCS5mb3BzID0gJmFjcV9mb3BzLAorfTsKKworLyoKKyAqCVRoZSBXRFQgY2FyZCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bworICoJdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KKyAqLworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFjcV9ub3RpZmllciA9Cit7CisJLm5vdGlmaWVyX2NhbGwgPSBhY3Ffbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFjcV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXByaW50ayhLRVJOX0lORk8gIldEVCBkcml2ZXIgZm9yIEFjcXVpcmUgc2luZ2xlIGJvYXJkIGNvbXB1dGVyIGluaXRpYWxpc2luZy5cbiIpOworCisJaWYgKHdkdF9zdG9wICE9IHdkdF9zdGFydCkgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKHdkdF9zdG9wLCAxLCBXQVRDSERPR19OQU1FKSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCQl3ZHRfc3RvcCk7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHdkdF9zdGFydCwgMSwgV0FUQ0hET0dfTkFNRSkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCXdkdF9zdGFydCk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gdW5yZWdfc3RvcDsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmFjcV9ub3RpZmllcik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAorCQkJcmV0KTsKKwkJZ290byB1bnJlZ19yZWdpb25zOworCX0KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmFjcV9taXNjZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCWdvdG8gdW5yZWdfcmVib290OworCX0KKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIChub3dheW91dD0lZClcbiIsCisJCW5vd2F5b3V0KTsKKworCXJldHVybiAwOworCit1bnJlZ19yZWJvb3Q6CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmFjcV9ub3RpZmllcik7Cit1bnJlZ19yZWdpb25zOgorCXJlbGVhc2VfcmVnaW9uKHdkdF9zdGFydCwgMSk7Cit1bnJlZ19zdG9wOgorCWlmICh3ZHRfc3RvcCAhPSB3ZHRfc3RhcnQpCisJCXJlbGVhc2VfcmVnaW9uKHdkdF9zdG9wLCAxKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNxX2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmFjcV9taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmYWNxX25vdGlmaWVyKTsKKwlpZih3ZHRfc3RvcCAhPSB3ZHRfc3RhcnQpCisJCXJlbGVhc2VfcmVnaW9uKHdkdF9zdG9wLDEpOworCXJlbGVhc2VfcmVnaW9uKHdkdF9zdGFydCwxKTsKK30KKworbW9kdWxlX2luaXQoYWNxX2luaXQpOworbW9kdWxlX2V4aXQoYWNxX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBXb29kaG91c2UiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWNxdWlyZSBJbmMuIFNpbmdsZSBCb2FyZCBDb21wdXRlciBXYXRjaGRvZyBUaW1lciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hZHZhbnRlY2h3ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hZHZhbnRlY2h3ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTczYzgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2FkdmFudGVjaHdkdC5jCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICoJQWR2YW50ZWNoIFNpbmdsZSBCb2FyZCBDb21wdXRlciBXRFQgZHJpdmVyCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAwLTIwMDEgTWFyZWsgTWljaGFsa2lld2ljeiA8bWFyZWttQGxpbnV4Lm9yZy5wbD4KKyAqCisgKglCYXNlZCBvbiBhY3F1aXJld2R0LmMgd2hpY2ggaXMgYmFzZWQgb24gd2R0LmMuCisgKglPcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZXM6CisgKgorICoJKGMpIENvcHlyaWdodCAxOTk2IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoJCQkJaHR0cDovL3d3dy5yZWRoYXQuY29tCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQorICoJd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkCisgKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk1ICAgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICoJMTQtRGVjLTIwMDEgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICoJICAgIEFkZGVkIG5vd2F5b3V0IG1vZHVsZSBvcHRpb24gdG8gb3ZlcnJpZGUgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCisgKgorICoJMTYtT2N0LTIwMDIgUm9iIFJhZGV6IDxyb2JAb3NpbnZlc3Rvci5jb20+CisgKgkgICAgQ2xlYW4gdXAgaW9jdGxzLCBjbGVhbiB1cCBpbml0ICsgZXhpdCwgYWRkIGV4cGVjdCBjbG9zZSBzdXBwb3J0LAorICoJICAgIGFkZCB3ZHRfc3RhcnQgYW5kIHdkdF9zdG9wIGFzIHBhcmFtZXRlcnMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNkZWZpbmUgV0FUQ0hET0dfTkFNRSAiQWR2YW50ZWNoIFdEVCIKKyNkZWZpbmUgUEZYIFdBVENIRE9HX05BTUUgIjogIgorI2RlZmluZSBXQVRDSERPR19USU1FT1VUIDYwCQkvKiA2MCBzZWMgZGVmYXVsdCB0aW1lb3V0ICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFkdndkdF9pc19vcGVuOworc3RhdGljIGNoYXIgYWR2X2V4cGVjdF9jbG9zZTsKKworLyoKKyAqCVlvdSBtdXN0IHNldCB0aGVzZSAtIHRoZXJlIGlzIG5vIHNhbmUgd2F5IHRvIHByb2JlIGZvciB0aGlzIGJvYXJkLgorICoKKyAqCVRvIGVuYWJsZSBvciByZXN0YXJ0LCB3cml0ZSB0aGUgdGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzICgxIHRvIDYzKQorICoJdG8gSS9PIHBvcnQgd2R0X3N0YXJ0LiAgVG8gZGlzYWJsZSwgcmVhZCBJL08gcG9ydCB3ZHRfc3RvcC4KKyAqCUJvdGggYXJlIDB4NDQzIGZvciBtb3N0IGJvYXJkcyAodGVzdGVkIG9uIGEgUENBLTYyNzZWRS0wMEIxKSwgYnV0CisgKgljaGVjayB5b3VyIG1hbnVhbCAoYXQgbGVhc3QgdGhlIFBDQS02MTU5IHNlZW1zIHRvIGJlIGRpZmZlcmVudCAtCisgKgl0aGUgbWFudWFsIHNheXMgd2R0X3N0b3AgaXMgMHg0Mywgbm90IDB4NDQzKS4KKyAqCSgweDQzIGlzIGFsc28gYSB3cml0ZS1vbmx5IGNvbnRyb2wgcmVnaXN0ZXIgZm9yIHRoZSA4MjU0IHRpbWVyISkKKyAqLworCitzdGF0aWMgaW50IHdkdF9zdG9wID0gMHg0NDM7Cittb2R1bGVfcGFyYW0od2R0X3N0b3AsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdkdF9zdG9wLCAiQWR2YW50ZWNoIFdEVCAnc3RvcCcgaW8gcG9ydCAoZGVmYXVsdCAweDQ0MykiKTsKKworc3RhdGljIGludCB3ZHRfc3RhcnQgPSAweDQ0MzsKK21vZHVsZV9wYXJhbSh3ZHRfc3RhcnQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdkdF9zdGFydCwgIkFkdmFudGVjaCBXRFQgJ3N0YXJ0JyBpbyBwb3J0IChkZWZhdWx0IDB4NDQzKSIpOworCitzdGF0aWMgaW50IHRpbWVvdXQgPSBXQVRDSERPR19USU1FT1VUOwkvKiBpbiBzZWNvbmRzICovCittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcy4gMTw9IHRpbWVvdXQgPD02MywgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19USU1FT1VUKSAiLiIpOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworLyoKKyAqCUtlcm5lbCBtZXRob2RzLgorICovCisKK3N0YXRpYyB2b2lkCithZHZ3ZHRfcGluZyh2b2lkKQoreworCS8qIFdyaXRlIGEgd2F0Y2hkb2cgdmFsdWUgKi8KKwlvdXRiX3AodGltZW91dCwgd2R0X3N0YXJ0KTsKK30KKworc3RhdGljIHZvaWQKK2FkdndkdF9kaXNhYmxlKHZvaWQpCit7CisJaW5iX3Aod2R0X3N0b3ApOworfQorCitzdGF0aWMgc3NpemVfdAorYWR2d2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoY291bnQpIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWFkdl9leHBlY3RfY2xvc2UgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZitpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlhZHZfZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKwkJYWR2d2R0X3BpbmcoKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50CithZHZ3ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgbmV3X3RpbWVvdXQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcgfCBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPSAxLAorCQkuaWRlbnRpdHkgPSAiQWR2YW50ZWNoIFdEVCIsCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCSAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpKQorCSAgICByZXR1cm4gLUVGQVVMVDsKKwkgIGJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCSAgcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJICBhZHZ3ZHRfcGluZygpOworCSAgYnJlYWs7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJICBpZiAoZ2V0X3VzZXIobmV3X3RpbWVvdXQsIHApKQorCQkgIHJldHVybiAtRUZBVUxUOworCSAgaWYgKChuZXdfdGltZW91dCA8IDEpIHx8IChuZXdfdGltZW91dCA+IDYzKSkKKwkJICByZXR1cm4gLUVJTlZBTDsKKwkgIHRpbWVvdXQgPSBuZXdfdGltZW91dDsKKwkgIGFkdndkdF9waW5nKCk7CisJICAvKiBGYWxsICovCisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJICByZXR1cm4gcHV0X3VzZXIodGltZW91dCwgcCk7CisKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJeworCSAgaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwkgIGlmIChnZXRfdXNlcihvcHRpb25zLCBwKSkKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisKKwkgIGlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkgICAgYWR2d2R0X2Rpc2FibGUoKTsKKwkgICAgcmV0dmFsID0gMDsKKwkgIH0KKworCSAgaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJICAgIGFkdndkdF9waW5nKCk7CisJICAgIHJldHZhbCA9IDA7CisJICB9CisKKwkgIHJldHVybiByZXR2YWw7CisJfQorCisJZGVmYXVsdDoKKwkgIHJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CithZHZ3ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmYWR2d2R0X2lzX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCS8qCisJICoJQWN0aXZhdGUKKwkgKi8KKworCWFkdndkdF9waW5nKCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50CithZHZ3ZHRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGFkdl9leHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJYWR2d2R0X2Rpc2FibGUoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCWFkdndkdF9waW5nKCk7CisJfQorCWNsZWFyX2JpdCgwLCAmYWR2d2R0X2lzX29wZW4pOworCWFkdl9leHBlY3RfY2xvc2UgPSAwOworCXJldHVybiAwOworfQorCisvKgorICoJTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCisgKi8KKworc3RhdGljIGludAorYWR2d2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCQlhZHZ3ZHRfZGlzYWJsZSgpOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglLZXJuZWwgSW50ZXJmYWNlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFkdndkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gYWR2d2R0X3dyaXRlLAorCS5pb2N0bAkJPSBhZHZ3ZHRfaW9jdGwsCisJLm9wZW4JCT0gYWR2d2R0X29wZW4sCisJLnJlbGVhc2UJPSBhZHZ3ZHRfY2xvc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYWR2d2R0X21pc2NkZXYgPSB7CisJLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgPSAid2F0Y2hkb2ciLAorCS5mb3BzID0gJmFkdndkdF9mb3BzLAorfTsKKworLyoKKyAqCVRoZSBXRFQgbmVlZHMgdG8gbGVhcm4gYWJvdXQgc29mdCBzaHV0ZG93bnMgaW4gb3JkZXIgdG8KKyAqCXR1cm4gdGhlIHRpbWVib21iIHJlZ2lzdGVycyBvZmYuCisgKi8KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBhZHZ3ZHRfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBhZHZ3ZHRfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyBpbnQgX19pbml0CithZHZ3ZHRfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJXRFQgZHJpdmVyIGZvciBBZHZhbnRlY2ggc2luZ2xlIGJvYXJkIGNvbXB1dGVyIGluaXRpYWxpc2luZy5cbiIpOworCisJaWYgKHRpbWVvdXQgPCAxIHx8IHRpbWVvdXQgPiA2MykgeworCQl0aW1lb3V0ID0gV0FUQ0hET0dfVElNRU9VVDsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJ0aW1lb3V0IHZhbHVlIG11c3QgYmUgMTw9eDw9NjMsIHVzaW5nICVkXG4iLAorCQkJdGltZW91dCk7CisJfQorCisJaWYgKHdkdF9zdG9wICE9IHdkdF9zdGFydCkgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKHdkdF9zdG9wLCAxLCBXQVRDSERPR19OQU1FKSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCQl3ZHRfc3RvcCk7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHdkdF9zdGFydCwgMSwgV0FUQ0hET0dfTkFNRSkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCXdkdF9zdGFydCk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gdW5yZWdfc3RvcDsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmFkdndkdF9ub3RpZmllcik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAorCQkJcmV0KTsKKwkJZ290byB1bnJlZ19yZWdpb25zOworCX0KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmFkdndkdF9taXNjZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCWdvdG8gdW5yZWdfcmVib290OworCX0KKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIHRpbWVvdXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCisJCXRpbWVvdXQsIG5vd2F5b3V0KTsKKworb3V0OgorCXJldHVybiByZXQ7Cit1bnJlZ19yZWJvb3Q6CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmFkdndkdF9ub3RpZmllcik7Cit1bnJlZ19yZWdpb25zOgorCXJlbGVhc2VfcmVnaW9uKHdkdF9zdGFydCwgMSk7Cit1bnJlZ19zdG9wOgorCWlmICh3ZHRfc3RvcCAhPSB3ZHRfc3RhcnQpCisJCXJlbGVhc2VfcmVnaW9uKHdkdF9zdG9wLCAxKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgX19leGl0CithZHZ3ZHRfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmYWR2d2R0X21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZhZHZ3ZHRfbm90aWZpZXIpOworCWlmKHdkdF9zdG9wICE9IHdkdF9zdGFydCkKKwkJcmVsZWFzZV9yZWdpb24od2R0X3N0b3AsMSk7CisJcmVsZWFzZV9yZWdpb24od2R0X3N0YXJ0LDEpOworfQorCittb2R1bGVfaW5pdChhZHZ3ZHRfaW5pdCk7Cittb2R1bGVfZXhpdChhZHZ3ZHRfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmVrIE1pY2hhbGtpZXdpY3ogPG1hcmVrbUBsaW51eC5vcmcucGw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFkdmFudGVjaCBTaW5nbGUgQm9hcmQgQ29tcHV0ZXIgV0RUIGRyaXZlciIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2FsaW0xNTM1X3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2FsaW0xNTM1X3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZGNiZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYWxpbTE1MzVfd2R0LmMKQEAgLTAsMCArMSw0NjMgQEAKKy8qCisgKglXYXRjaGRvZyBmb3IgdGhlIDcxMDEgUE1VIHZlcnNpb24gZm91bmQgaW4gdGhlIEFMaSBNMTUzNSBjaGlwc2V0cworICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBXQVRDSERPR19OQU1FICJBTGlfTTE1MzUiCisjZGVmaW5lIFBGWCBXQVRDSERPR19OQU1FICI6ICIKKyNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCA2MAkvKiA2MCBzZWMgZGVmYXVsdCB0aW1lb3V0ICovCisKKy8qIGludGVybmFsIHZhcmlhYmxlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxpX2lzX29wZW47CitzdGF0aWMgY2hhciBhbGlfZXhwZWN0X3JlbGVhc2U7CitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmFsaV9wY2k7CitzdGF0aWMgdTMyIGFsaV90aW1lb3V0X2JpdHM7CS8qIHN0b3JlcyB0aGUgY29tcHV0ZWQgdGltZW91dCAqLworc3RhdGljIHNwaW5sb2NrX3QgYWxpX2xvY2s7CS8qIEd1YXJkcyB0aGUgaGFyZHdhcmUgKi8KKworLyogbW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7Cittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcy4gKDA8dGltZW91dDwxODAwMCwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19USU1FT1VUKSAiKSIpOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworLyoKKyAqCWFsaV9zdGFydAktCXN0YXJ0IHdhdGNoZG9nIGNvdW50ZG93bgorICoKKyAqCVN0YXJ0cyB0aGUgdGltZXIgcnVubmluZyBwcm92aWRpbmcgdGhlIHRpbWVyIGhhcyBhIGNvdW50ZXIKKyAqCWNvbmZpZ3VyYXRpb24gc2V0LgorICovCisKK3N0YXRpYyB2b2lkIGFsaV9zdGFydCh2b2lkKQoreworCXUzMiB2YWw7CisKKwlzcGluX2xvY2soJmFsaV9sb2NrKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhbGlfcGNpLCAweENDLCAmdmFsKTsKKwl2YWwgJj0gfjB4M0Y7CS8qIE1hc2sgY291bnQgKi8KKwl2YWwgfD0gKDE8PDI1KSB8IGFsaV90aW1lb3V0X2JpdHM7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhbGlfcGNpLCAweENDLCB2YWwpOworCisJc3Bpbl91bmxvY2soJmFsaV9sb2NrKTsKK30KKworLyoKKyAqCWFsaV9zdG9wCS0Jc3RvcCB0aGUgdGltZXIgY291bnRkb3duCisgKgorICoJU3RvcCB0aGUgQUxpIHdhdGNoZG9nIGNvdW50ZG93bgorICovCisKK3N0YXRpYyB2b2lkIGFsaV9zdG9wKHZvaWQpCit7CisJdTMyIHZhbDsKKworCXNwaW5fbG9jaygmYWxpX2xvY2spOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFsaV9wY2ksIDB4Q0MsICZ2YWwpOworCXZhbCAmPSB+MHgzRjsJLyogTWFzayBjb3VudCB0byB6ZXJvIChkaXNhYmxlZCkgKi8KKwl2YWwgJj0gfigxPDwyNSk7LyogYW5kIGZvciBzYWZldHkgbWFzayB0aGUgcmVzZXQgZW5hYmxlICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhbGlfcGNpLCAweENDLCB2YWwpOworCisJc3Bpbl91bmxvY2soJmFsaV9sb2NrKTsKK30KKworLyoKKyAqCWFsaV9rZWVwYWxpdmUJLQlzZW5kIGEga2VlcGFsaXZlIHRvIHRoZSB3YXRjaGRvZworICoKKyAqICAgICAgU2VuZCBhIGtlZXBhbGl2ZSB0byB0aGUgdGltZXIgKGFjdHVhbGx5IHdlIHJlc3RhcnQgdGhlIHRpbWVyKS4KKyAqLworCitzdGF0aWMgdm9pZCBhbGlfa2VlcGFsaXZlKHZvaWQpCit7CisJYWxpX3N0YXJ0KCk7Cit9CisKKy8qCisgKglhbGlfc2V0dGltZXIJLQljb21wdXRlIHRoZSB0aW1lciByZWxvYWQgdmFsdWUKKyAqCUB0OiB0aW1lIGluIHNlY29uZHMKKyAqCisgKglDb21wdXRlcyB0aGUgdGltZW91dCB2YWx1ZXMgbmVlZGVkCisgKi8KKworc3RhdGljIGludCBhbGlfc2V0dGltZXIoaW50IHQpCit7CisJaWYodCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYodCA8IDYwKQorCQlhbGlfdGltZW91dF9iaXRzID0gdHwoMTw8Nik7CisJZWxzZSBpZih0IDwgMzYwMCkKKwkJYWxpX3RpbWVvdXRfYml0cyA9ICh0LzYwKXwoMTw8Nyk7CisJZWxzZSBpZih0IDwgMTgwMDApCisJCWFsaV90aW1lb3V0X2JpdHMgPSAodC8zMDApfCgxPDw2KXwoMTw8Nyk7CisJZWxzZSByZXR1cm4gLUVJTlZBTDsKKworCXRpbWVvdXQgPSB0OworCXJldHVybiAwOworfQorCisvKgorICoJL2Rldi93YXRjaGRvZyBoYW5kbGluZworICovCisKKy8qCisgKglhbGlfd3JpdGUJLQl3cml0ZXMgdG8gQUxpIHdhdGNoZG9nCisgKglAZmlsZTogZmlsZSBmcm9tIFZGUworICoJQGRhdGE6IHVzZXIgYWRkcmVzcyBvZiBkYXRhCisgKglAbGVuOiBsZW5ndGggb2YgZGF0YQorICoJQHBwb3M6IHBvaW50ZXIgdG8gdGhlIGZpbGUgb2Zmc2V0CisgKgorICoJSGFuZGxlIGEgd3JpdGUgdG8gdGhlIEFMaSB3YXRjaGRvZy4gV3JpdGluZyB0byB0aGUgZmlsZSBwaW5ncworICoJdGhlIHdhdGNoZG9nIGFuZCByZXNldHMgaXQuIFdyaXRpbmcgdGhlIG1hZ2ljICdWJyBzZXF1ZW5jZSBhbGxvd3MKKyAqCXRoZSBuZXh0IGNsb3NlIHRvIHR1cm4gb2ZmIHRoZSB3YXRjaGRvZy4KKyAqLworCitzdGF0aWMgc3NpemVfdCBhbGlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAorCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICogcHBvcykKK3sKKwkvKiBTZWUgaWYgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgJ1YnIGFuZCByZWxvYWQgdGhlIHRpbWVyICovCisJaWYgKGxlbikgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogbm90ZToganVzdCBpbiBjYXNlIHNvbWVvbmUgd3JvdGUgdGhlIG1hZ2ljIGNoYXJhY3RlcgorCQkJICogZml2ZSBtb250aHMgYWdvLi4uICovCisJCQlhbGlfZXhwZWN0X3JlbGVhc2UgPSAwOworCisJCQkvKiBzY2FuIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCB3ZSBnb3QgdGhlIG1hZ2ljIGNoYXJhY3RlciAqLworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZihnZXRfdXNlcihjLCBkYXRhK2kpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWFsaV9leHBlY3RfcmVsZWFzZSA9IDQyOworCQkJfQorCQl9CisKKwkJLyogc29tZW9uZSB3cm90ZSB0byB1cywgd2Ugc2hvdWxkIHJlbG9hZCB0aGUgdGltZXIgKi8KKwkJYWxpX3N0YXJ0KCk7CisJfQorCXJldHVybiBsZW47Cit9CisKKy8qCisgKglhbGlfaW9jdGwJLQloYW5kbGUgd2F0Y2hkb2cgaW9jdGxzCisgKglAaW5vZGU6IFZGUyBpbm9kZQorICoJQGZpbGU6IFZGUyBmaWxlIHBvaW50ZXIKKyAqCUBjbWQ6IGlvY3RsIG51bWJlcgorICoJQGFyZzogYXJndW1lbnRzIHRvIHRoZSBpb2N0bAorICoKKyAqCUhhbmRsZSB0aGUgd2F0Y2hkb2cgaW9jdGxzIHN1cHBvcnRlZCBieSB0aGUgQUxpIGRyaXZlci4gUmVhbGx5CisgKgl3ZSB3YW50IGFuIGV4dGVuc2lvbiB0byBlbmFibGUgaXJxIGFjayBtb25pdG9yaW5nIGFuZCB0aGUgbGlrZQorICovCisKK3N0YXRpYyBpbnQgYWxpX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zID0JCVdESU9GX0tFRVBBTElWRVBJTkcgfAorCQkJCQlXRElPRl9TRVRUSU1FT1VUIHwKKwkJCQkJV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPQkwLAorCQkuaWRlbnRpdHkgPQkJIkFMaSBNMTUzNSBXYXRjaERvZyBUaW1lciIsCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LAorCQkJCXNpemVvZiAoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwkJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCQlhbGlfa2VlcGFsaXZlKCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCXsKKwkJCWludCBuZXdfb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKworCQkJaWYgKGdldF91c2VyIChuZXdfb3B0aW9ucywgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChuZXdfb3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQkJYWxpX3N0b3AoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlpZiAobmV3X29wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQkJYWxpX3N0YXJ0KCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCisJCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJeworCQkJaW50IG5ld190aW1lb3V0OworCisJCQlpZiAoZ2V0X3VzZXIobmV3X3RpbWVvdXQsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAoYWxpX3NldHRpbWVyKG5ld190aW1lb3V0KSkKKwkJCSAgICByZXR1cm4gLUVJTlZBTDsKKworCQkJYWxpX2tlZXBhbGl2ZSgpOworCQkJLyogRmFsbCAqLworCQl9CisKKwkJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQkJcmV0dXJuIHB1dF91c2VyKHRpbWVvdXQsIHApOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworLyoKKyAqCWFsaV9vcGVuCS0JaGFuZGxlIG9wZW4gb2YgYWxpIHdhdGNoZG9nCisgKglAaW5vZGU6IGlub2RlIGZyb20gVkZTCisgKglAZmlsZTogZmlsZSBmcm9tIFZGUworICoKKyAqCU9wZW4gdGhlIEFMaSB3YXRjaGRvZyBkZXZpY2UuIEVuc3VyZSBvbmx5IG9uZSBwZXJzb24gb3BlbnMgaXQKKyAqCWF0IGEgdGltZS4gQWxzbyBzdGFydCB0aGUgd2F0Y2hkb2cgcnVubmluZy4KKyAqLworCitzdGF0aWMgaW50IGFsaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIC9kZXYvd2F0Y2hkb2cgY2FuIG9ubHkgYmUgb3BlbmVkIG9uY2UgKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmYWxpX2lzX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogQWN0aXZhdGUgKi8KKwlhbGlfc3RhcnQoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKy8qCisgKglhbGlfcmVsZWFzZQktCWNsb3NlIGFuIEFMaSB3YXRjaGRvZworICoJQGlub2RlOiBpbm9kZSBmcm9tIFZGUworICoJQGZpbGU6IGZpbGUgZnJvbSBWRlMKKyAqCisgKglDbG9zZSB0aGUgQUxpIHdhdGNoZG9nIGRldmljZS4gQWN0dWFsIHNodXRkb3duIG9mIHRoZSB0aW1lcgorICoJb25seSBvY2N1cnMgaWYgdGhlIG1hZ2ljIHNlcXVlbmNlIGhhcyBiZWVuIHNldC4KKyAqLworCitzdGF0aWMgaW50IGFsaV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qCisJICogICAgICBTaHV0IG9mZiB0aGUgdGltZXIuCisJICovCisJaWYgKGFsaV9leHBlY3RfcmVsZWFzZSA9PSA0MikgeworCQlhbGlfc3RvcCgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJYWxpX2tlZXBhbGl2ZSgpOworCX0KKwljbGVhcl9iaXQoMCwgJmFsaV9pc19vcGVuKTsKKwlhbGlfZXhwZWN0X3JlbGVhc2UgPSAwOworCXJldHVybiAwOworfQorCisvKgorICoJYWxpX25vdGlmeV9zeXMJLQlTeXN0ZW0gZG93biBub3RpZmllcgorICoKKyAqCU5vdGlmaWVyIGZvciBzeXN0ZW0gZG93bgorICovCisKKworc3RhdGljIGludCBhbGlfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlPT1TWVNfRE9XTiB8fCBjb2RlPT1TWVNfSEFMVCkgeworCQkvKiBUdXJuIHRoZSBXRFQgb2ZmICovCisJCWFsaV9zdG9wKCk7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJRGF0YSBmb3IgUENJIGRyaXZlciBpbnRlcmZhY2UKKyAqCisgKglUaGlzIGRhdGEgb25seSBleGlzdHMgZm9yIGV4cG9ydGluZyB0aGUgc3VwcG9ydGVkCisgKglQQ0kgaWRzIHZpYSBNT0RVTEVfREVWSUNFX1RBQkxFLiAgV2UgZG8gbm90IGFjdHVhbGx5CisgKglyZWdpc3RlciBhIHBjaV9kcml2ZXIsIGJlY2F1c2Ugc29tZW9uZSBlbHNlIG1pZ2h0IG9uZSBkYXkKKyAqCXdhbnQgdG8gcmVnaXN0ZXIgYW5vdGhlciBkcml2ZXIgb24gdGhlIHNhbWUgUENJIGlkLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhbGlfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9BTCwgMTUzNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCXsgMCwgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWxpX3BjaV90YmwpOworCisvKgorICoJYWxpX2ZpbmRfd2F0Y2hkb2cJLQlmaW5kIGEgMTUzNSBhbmQgNzEwMQorICoKKyAqCVNjYW5zIHRoZSBQQ0kgaGFyZHdhcmUgZm9yIGEgMTUzNSBzZXJpZXMgYnJpZGdlIGFuZCBtYXRjaGluZyA3MTAxCisgKgl3YXRjaGRvZyBkZXZpY2UuIFRoaXMgbWF5IGJlIG92ZXJ0aWdodCBidXQgaXQgaXMgYmV0dGVyIHRvIGJlIHNhZmUKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBhbGlfZmluZF93YXRjaGRvZyh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXUzMiB3ZG9nOworCisJLyogQ2hlY2sgZm9yIGEgMTUzNSBzZXJpZXMgYnJpZGdlICovCisJcGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCAweDE1MzUsIE5VTEwpOworCWlmKHBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBDaGVjayBmb3IgdGhlIGEgNzEwMSBQTVUgKi8KKwlwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIDB4NzEwMSwgTlVMTCk7CisJaWYocGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLUVJTzsKKworCWFsaV9wY2kgPSBwZGV2OworCisJLyoKKwkgKglJbml0aWFsaXplIHRoZSB0aW1lciBiaXRzCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4Q0MsICZ3ZG9nKTsKKworCXdkb2cgJj0gfjB4M0Y7CQkvKiBUaW1lciBiaXRzICovCisJd2RvZyAmPSB+KCgxPDwyNyl8KDE8PDI2KXwoMTw8MjUpfCgxPDwyNCkpOwkvKiBJc3N1ZWQgZXZlbnRzICovCisJd2RvZyAmPSB+KCgxPDwxNil8KDE8PDEzKXwoMTw8MTIpfCgxPDwxMSl8KDE8PDEwKXwoMTw8OSkpOwkvKiBObyBtb25pdG9yIGJpdHMgKi8KKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHhDQywgd2RvZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUtlcm5lbCBJbnRlcmZhY2VzCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWxpX2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLmxsc2VlayA9CW5vX2xsc2VlaywKKwkud3JpdGUgPQlhbGlfd3JpdGUsCisJLmlvY3RsID0JYWxpX2lvY3RsLAorCS5vcGVuID0JCWFsaV9vcGVuLAorCS5yZWxlYXNlID0JYWxpX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYWxpX21pc2NkZXYgPSB7CisJLm1pbm9yID0JV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgPQkJIndhdGNoZG9nIiwKKwkuZm9wcyA9CQkmYWxpX2ZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFsaV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9CWFsaV9ub3RpZnlfc3lzLAorfTsKKworLyoKKyAqCXdhdGNoZG9nX2luaXQJLQltb2R1bGUgaW5pdGlhbGlzZXIKKyAqCisgKglTY2FuIGZvciBhIHN1aXRhYmxlIHdhdGNoZG9nIGFuZCBpZiBzbyBpbml0aWFsaXplIGl0LiBSZXR1cm4gYW4gZXJyb3IKKyAqCWlmIHdlIGNhbm5vdCwgdGhlIGVycm9yIGNhdXNlcyB0aGUgbW9kdWxlIHRvIHVubG9hZAorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2luaXQoJmFsaV9sb2NrKTsKKworCS8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBpcyB0aGVyZSAqLworCWlmIChhbGlfZmluZF93YXRjaGRvZygpICE9IDApIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogQ2hlY2sgdGhhdCB0aGUgdGltZW91dCB2YWx1ZSBpcyB3aXRoaW4gaXQncyByYW5nZSA7IGlmIG5vdCByZXNldCB0byB0aGUgZGVmYXVsdCAqLworCWlmICh0aW1lb3V0IDwgMSB8fCB0aW1lb3V0ID49IDE4MDAwKSB7CisJCXRpbWVvdXQgPSBXQVRDSERPR19USU1FT1VUOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAidGltZW91dCB2YWx1ZSBtdXN0IGJlIDA8dGltZW91dDwxODAwMCwgdXNpbmcgJWRcbiIsCisJCQl0aW1lb3V0KTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgdGhlIHdhdGNoZG9nJ3MgdGltZW91dCAqLworCWFsaV9zZXR0aW1lcih0aW1lb3V0KTsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmFsaV9taXNjZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZhbGlfbm90aWZpZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAorCQkJcmV0KTsKKwkJZ290byB1bnJlZ19taXNjZGV2OworCX0KKworCXByaW50ayhLRVJOX0lORk8gUEZYICJpbml0aWFsaXplZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKKwkJdGltZW91dCwgbm93YXlvdXQpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK3VucmVnX21pc2NkZXY6CisJbWlzY19kZXJlZ2lzdGVyKCZhbGlfbWlzY2Rldik7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKgl3YXRjaGRvZ19leGl0CS0JbW9kdWxlIGRlLWluaXRpYWxpc2VyCisgKgorICoJQ2FsbGVkIHdoaWxlIHVubG9hZGluZyBhIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgd2F0Y2hkb2cgbW9kdWxlLgorICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3YXRjaGRvZ19leGl0KHZvaWQpCit7CisJLyogU3RvcCB0aGUgdGltZXIgYmVmb3JlIHdlIGxlYXZlICovCisJYWxpX3N0b3AoKTsKKworCS8qIERlcmVnaXN0ZXIgKi8KKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmYWxpX25vdGlmaWVyKTsKKwltaXNjX2RlcmVnaXN0ZXIoJmFsaV9taXNjZGV2KTsKK30KKworbW9kdWxlX2luaXQod2F0Y2hkb2dfaW5pdCk7Cittb2R1bGVfZXhpdCh3YXRjaGRvZ19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQWxhbiBDb3giKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUxpIE0xNTM1IFBNVSBXYXRjaGRvZyBUaW1lciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hbGltNzEwMV93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hbGltNzEwMV93ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGMwOTFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2FsaW03MTAxX3dkdC5jCkBAIC0wLDAgKzEsNDIxIEBACisvKgorICoJQUxpIE03MTAxIFBNVSBDb21wdXRlciBXYXRjaGRvZyBUaW1lciBkcml2ZXIKKyAqCisgKglCYXNlZCBvbiB3ODM4NzdmX3dkdC5jIGJ5IFNjb3R0IEplbm5pbmdzIDxsaW51eGRyaXZlcnNAb3JvLm5ldD4KKyAqCWFuZCB0aGUgQ29iYWx0IGtlcm5lbCBXRFQgdGltZXIgZHJpdmVyIGJ5IFRpbSBIb2NraW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRob2NraW5AY29iYWx0bmV0LmNvbT4KKyAqCisgKgkoYykyMDAyIFN0ZXZlIEhpbGwgPHN0ZXZlQG5hdmFoby5jby51az4KKyAqCisgKiAgVGhpcyBXRFQgZHJpdmVyIGlzIGRpZmZlcmVudCBmcm9tIG1vc3Qgb3RoZXIgTGludXggV0RUCisgKiAgZHJpdmVycyBpbiB0aGF0IHRoZSBkcml2ZXIgd2lsbCBwaW5nIHRoZSB3YXRjaGRvZyBieSBpdHNlbGYsCisgKiAgYmVjYXVzZSB0aGlzIHBhcnRpY3VsYXIgV0RUIGhhcyBhIHZlcnkgc2hvcnQgdGltZW91dCAoMS42CisgKiAgc2Vjb25kcykgYW5kIGl0IHdvdWxkIGJlIGluc2FuZSB0byBjb3VudCBvbiBhbnkgdXNlcnNwYWNlCisgKiAgZGFlbW9uIGFsd2F5cyBnZXR0aW5nIHNjaGVkdWxlZCB3aXRoaW4gdGhhdCB0aW1lIGZyYW1lLgorICoKKyAqICBBZGRpdGlvbnM6CisgKiAgIEF1ZyAyMywgMjAwNCAtIEFkZGVkIHVzZV9ncGlvIG1vZHVsZSBwYXJhbWV0ZXIgZm9yIHVzZSBvbiByZXZpc2lvbiBhMWQgUE1VcworICogICAgICAgICAgICAgICAgICBmb3VuZCBvbiB2ZXJ5IG9sZCBjb2JhbHQgaGFyZHdhcmUuCisgKiAgICAgICAgICAgICAgICAgIC0tIE1pa2UgV2F5Y2hpc29uIDxtaWNoYWVsLndheWNoaXNvbkBzdW4uY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNkZWZpbmUgT1VSX05BTUUgImFsaW03MTAxX3dkdCIKKyNkZWZpbmUgUEZYIE9VUl9OQU1FICI6ICIKKworI2RlZmluZSBXRFRfRU5BQkxFIDB4OUMKKyNkZWZpbmUgV0RUX0RJU0FCTEUgMHg4QworCisjZGVmaW5lIEFMSV83MTAxX1dEVCAgICAweDkyCisjZGVmaW5lIEFMSV83MTAxX0dQSU8gICAweDdECisjZGVmaW5lIEFMSV83MTAxX0dQSU9fTyAweDdFCisjZGVmaW5lIEFMSV9XRFRfQVJNICAgICAweDAxCisKKy8qCisgKiBXZSdyZSBnb2luZyB0byB1c2UgYSAxIHNlY29uZCB0aW1lb3V0LgorICogSWYgd2UgcmVzZXQgdGhlIHdhdGNoZG9nIGV2ZXJ5IH4yNTBtcyB3ZSBzaG91bGQgYmUgc2FmZS4gICovCisKKyNkZWZpbmUgV0RUX0lOVEVSVkFMIChIWi80KzEpCisKKy8qCisgKiBXZSBtdXN0IG5vdCByZXF1aXJlIHRvbyBnb29kIHJlc3BvbnNlIGZyb20gdGhlIHVzZXJzcGFjZSBkYWVtb24uCisgKiBIZXJlIHdlIHJlcXVpcmUgdGhlIHVzZXJzcGFjZSBkYWVtb24gdG8gc2VuZCB1cyBhIGhlYXJ0YmVhdAorICogY2hhciB0byAvZGV2L3dhdGNoZG9nIGV2ZXJ5IDMwIHNlY29uZHMuCisgKi8KKworI2RlZmluZSBXQVRDSERPR19USU1FT1VUIDMwICAgICAgICAgICAgLyogMzAgc2VjIGRlZmF1bHQgdGltZW91dCAqLworc3RhdGljIGludCB0aW1lb3V0ID0gV0FUQ0hET0dfVElNRU9VVDsgLyogaW4gc2Vjb25kcywgd2lsbCBiZSBtdWx0aXBsaWVkIGJ5IEhaIHRvIGdldCBzZWNvbmRzIHRvIHdhaXQgZm9yIGEgcGluZyAqLworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMuICgxPD10aW1lb3V0PD0zNjAwLCBkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX1RJTUVPVVQpICIpIik7CisKK3N0YXRpYyBpbnQgdXNlX2dwaW8gPSAwOyAvKiBVc2UgdGhlIHBpYyAoZm9yIGExZCByZXZpc2lvbiBhbGltNzEwMSkgKi8KK21vZHVsZV9wYXJhbSh1c2VfZ3BpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX2dwaW8sICJVc2UgdGhlIGdwaW8gd2F0Y2hkb2cuICAocmVxdWlyZWQgYnkgb2xkIGNvYmFsdCBib2FyZHMpIik7CisKK3N0YXRpYyB2b2lkIHdkdF90aW1lcl9waW5nKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV4dF9oZWFydGJlYXQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfaXNfb3BlbjsKK3N0YXRpYyBjaGFyIHdkdF9leHBlY3RfY2xvc2U7CitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmFsaW03MTAxX3BtdTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qCisgKglXaGFjayB0aGUgZG9nCisgKi8KKworc3RhdGljIHZvaWQgd2R0X3RpbWVyX3BpbmcodW5zaWduZWQgbG9uZyBkYXRhKQoreworCS8qIElmIHdlIGdvdCBhIGhlYXJ0YmVhdCBwdWxzZSB3aXRoaW4gdGhlIFdEVF9VU19JTlRFUlZBTAorCSAqIHdlIGFncmVlIHRvIHBpbmcgdGhlIFdEVAorCSAqLworCWNoYXIJdG1wOworCisJaWYodGltZV9iZWZvcmUoamlmZmllcywgbmV4dF9oZWFydGJlYXQpKQorCXsKKwkJLyogUGluZyB0aGUgV0RUICh0aGlzIGlzIGFjdHVhbGx5IGEgZGlzYXJtL2FybSBzZXF1ZW5jZSkgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWxpbTcxMDFfcG11LCAweDkyLCAmdG1wKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFsaW03MTAxX3BtdSwgQUxJXzcxMDFfV0RULCAodG1wICYgfkFMSV9XRFRfQVJNKSk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShhbGltNzEwMV9wbXUsIEFMSV83MTAxX1dEVCwgKHRtcCB8IEFMSV9XRFRfQVJNKSk7CisJCWlmICh1c2VfZ3BpbykgeworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWxpbTcxMDFfcG11LCBBTElfNzEwMV9HUElPX08sICZ0bXApOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFsaW03MTAxX3BtdSwgQUxJXzcxMDFfR1BJT19PLCB0bXAKKwkJCQkJfCAweDIwKTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShhbGltNzEwMV9wbXUsIEFMSV83MTAxX0dQSU9fTywgdG1wCisJCQkJCSYgfjB4MjApOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkhlYXJ0YmVhdCBsb3N0ISBXaWxsIG5vdCBwaW5nIHRoZSB3YXRjaGRvZ1xuIik7CisJfQorCS8qIFJlLXNldCB0aGUgdGltZXIgaW50ZXJ2YWwgKi8KKwl0aW1lci5leHBpcmVzID0gamlmZmllcyArIFdEVF9JTlRFUlZBTDsKKwlhZGRfdGltZXIoJnRpbWVyKTsKK30KKworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMKKyAqLworCitzdGF0aWMgdm9pZCB3ZHRfY2hhbmdlKGludCB3cml0ZXZhbCkKK3sKKwljaGFyCXRtcDsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFsaW03MTAxX3BtdSwgQUxJXzcxMDFfV0RULCAmdG1wKTsKKwlpZiAod3JpdGV2YWwgPT0gV0RUX0VOQUJMRSkgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWxpbTcxMDFfcG11LCBBTElfNzEwMV9XRFQsICh0bXAgfCBBTElfV0RUX0FSTSkpOworCQlpZiAodXNlX2dwaW8pIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFsaW03MTAxX3BtdSwgQUxJXzcxMDFfR1BJT19PLCAmdG1wKTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShhbGltNzEwMV9wbXUsIEFMSV83MTAxX0dQSU9fTywgdG1wICYgfjB4MjApOworCQl9CisKKwl9IGVsc2UgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWxpbTcxMDFfcG11LCBBTElfNzEwMV9XRFQsICh0bXAgJiB+QUxJX1dEVF9BUk0pKTsKKwkJaWYgKHVzZV9ncGlvKSB7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShhbGltNzEwMV9wbXUsIEFMSV83MTAxX0dQSU9fTywgJnRtcCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWxpbTcxMDFfcG11LCBBTElfNzEwMV9HUElPX08sIHRtcCB8IDB4MjApOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCB3ZHRfc3RhcnR1cCh2b2lkKQoreworCW5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArICh0aW1lb3V0ICogSFopOworCisJLyogV2UgbXVzdCBlbmFibGUgYmVmb3JlIHdlIGtpY2sgb2ZmIHRoZSB0aW1lciBpbiBjYXNlIHRoZSB0aW1lcgorCSAgIG9jY3VycyBhcyB3ZSBwaW5nIGl0ICovCisKKwl3ZHRfY2hhbmdlKFdEVF9FTkFCTEUpOworCisJLyogU3RhcnQgdGhlIHRpbWVyICovCisJdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBXRFRfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZ0aW1lcik7CisKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJXYXRjaGRvZyB0aW1lciBpcyBub3cgZW5hYmxlZC5cbiIpOworfQorCitzdGF0aWMgdm9pZCB3ZHRfdHVybm9mZih2b2lkKQoreworCS8qIFN0b3AgdGhlIHRpbWVyICovCisJZGVsX3RpbWVyX3N5bmMoJnRpbWVyKTsKKwl3ZHRfY2hhbmdlKFdEVF9ESVNBQkxFKTsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiV2F0Y2hkb2cgdGltZXIgaXMgbm93IGRpc2FibGVkLi4uXG4iKTsKK30KKworc3RhdGljIHZvaWQgd2R0X2tlZXBhbGl2ZSh2b2lkKQoreworCS8qIHVzZXIgbGFuZCBwaW5nICovCisJbmV4dF9oZWFydGJlYXQgPSBqaWZmaWVzICsgKHRpbWVvdXQgKiBIWik7Cit9CisKKy8qCisgKiAvZGV2L3dhdGNoZG9nIGhhbmRsaW5nCisgKi8KKworc3RhdGljIHNzaXplX3QgZm9wX3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwkvKiBTZWUgaWYgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgJ1YnIGFuZCByZWxvYWQgdGhlIHRpbWVyICovCisJaWYoY291bnQpIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IG9mczsKKworCQkJLyogbm90ZToganVzdCBpbiBjYXNlIHNvbWVvbmUgd3JvdGUgdGhlIG1hZ2ljIGNoYXJhY3RlcgorCQkJICogZml2ZSBtb250aHMgYWdvLi4uICovCisJCQl3ZHRfZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJLyogbm93IHNjYW4gKi8KKwkJCWZvciAob2ZzID0gMDsgb2ZzICE9IGNvdW50OyBvZnMrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmK29mcykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJd2R0X2V4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCS8qIHNvbWVvbmUgd3JvdGUgdG8gdXMsIHdlIHNob3VsZCByZXN0YXJ0IHRpbWVyICovCisJCXdkdF9rZWVwYWxpdmUoKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGZvcF9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJLyogSnVzdCBpbiBjYXNlIHdlJ3JlIGFscmVhZHkgdGFsa2luZyB0byBzb21lb25lLi4uICovCisJaWYodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2R0X2lzX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCS8qIEdvb2QsIGZpcmUgdXAgdGhlIHNob3cgKi8KKwl3ZHRfc3RhcnR1cCgpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBmb3BfY2xvc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlpZih3ZHRfZXhwZWN0X2Nsb3NlID09IDQyKQorCQl3ZHRfdHVybm9mZigpOworCWVsc2UgeworCQkvKiB3aW06IHNob3VsZG4ndCB0aGVyZSBiZSBhOiBkZWxfdGltZXIoJnRpbWVyKTsgKi8KKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggImRldmljZSBmaWxlIGNsb3NlZCB1bmV4cGVjdGVkbHkuIFdpbGwgbm90IHN0b3AgdGhlIFdEVCFcbiIpOworCX0KKwljbGVhcl9iaXQoMCwgJndkdF9pc19vcGVuKTsKKwl3ZHRfZXhwZWN0X2Nsb3NlID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmb3BfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9CisJeworCQkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcgfCBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPSAxLAorCQkuaWRlbnRpdHkgPSAiQUxpTTcxMDEiLAorCX07CisKKwlzd2l0Y2goY21kKQorCXsKKwkJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpPy1FRkFVTFQ6MDsKKwkJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKwkJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCQl3ZHRfa2VlcGFsaXZlKCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQl7CisJCQlpbnQgbmV3X29wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwkJCWlmKGdldF91c2VyKG5ld19vcHRpb25zLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYobmV3X29wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJCXdkdF90dXJub2ZmKCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJaWYobmV3X29wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQkJd2R0X3N0YXJ0dXAoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJeworCQkJaW50IG5ld190aW1lb3V0OworCisJCQlpZihnZXRfdXNlcihuZXdfdGltZW91dCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmKG5ld190aW1lb3V0IDwgMSB8fCBuZXdfdGltZW91dCA+IDM2MDApIC8qIGFyYml0cmFyeSB1cHBlciBsaW1pdCAqLworCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl0aW1lb3V0ID0gbmV3X3RpbWVvdXQ7CisJCQl3ZHRfa2VlcGFsaXZlKCk7CisJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJfQorCQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCQlyZXR1cm4gcHV0X3VzZXIodGltZW91dCwgcCk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0X2ZvcHMgPSB7CisJLm93bmVyPQkJVEhJU19NT0RVTEUsCisJLmxsc2Vlaz0Jbm9fbGxzZWVrLAorCS53cml0ZT0JCWZvcF93cml0ZSwKKwkub3Blbj0JCWZvcF9vcGVuLAorCS5yZWxlYXNlPQlmb3BfY2xvc2UsCisJLmlvY3RsPQkJZm9wX2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdkdF9taXNjZGV2ID0geworCS5taW5vcj1XQVRDSERPR19NSU5PUiwKKwkubmFtZT0id2F0Y2hkb2ciLAorCS5mb3BzPSZ3ZHRfZm9wcywKK307CisKKy8qCisgKglOb3RpZmllciBmb3Igc3lzdGVtIGRvd24KKyAqLworCitzdGF0aWMgaW50IHdkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGU9PVNZU19ET1dOIHx8IGNvZGU9PVNZU19IQUxUKQorCQl3ZHRfdHVybm9mZigpOworCisJaWYgKGNvZGU9PVNZU19SRVNUQVJUKSB7CisJCS8qCisJCSAqIENvYmFsdCBkZXZpY2VzIGhhdmUgbm8gd2F5IG9mIHJlYm9vdGluZyB0aGVtc2VsdmVzIG90aGVyIHRoYW4KKwkJICogZ2V0dGluZyB0aGUgd2F0Y2hkb2cgdG8gcHVsbCByZXNldCwgc28gd2UgcmVzdGFydCB0aGUgd2F0Y2hkb2cgb24KKwkJICogcmVib290IHdpdGggbm8gaGVhcnRiZWF0CisJCSAqLworCQl3ZHRfY2hhbmdlKFdEVF9FTkFCTEUpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiV2F0Y2hkb2cgdGltZXIgaXMgbm93IGVuYWJsZWQgd2l0aCBubyBoZWFydGJlYXQgLSBzaG91bGQgcmVib290IGluIH4xIHNlY29uZC5cbiIpOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglUaGUgV0RUIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCisgKgl0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2R0X25vdGlmaWVyPQoreworCS5ub3RpZmllcl9jYWxsID0gd2R0X25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxpbTcxMDFfd2R0X3VubG9hZCh2b2lkKQoreworCXdkdF90dXJub2ZmKCk7CisJLyogRGVyZWdpc3RlciAqLworCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhbGltNzEwMV93ZHRfaW5pdCh2b2lkKQoreworCWludCByYyA9IC1FQlVTWTsKKwlzdHJ1Y3QgcGNpX2RldiAqYWxpMTU0M19zb3V0aDsKKwljaGFyIHRtcDsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJTdGV2ZSBIaWxsIDxzdGV2ZUBuYXZhaG8uY28udWs+LlxuIik7CisJYWxpbTcxMDFfcG11ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTcxMDEsTlVMTCk7CisJaWYgKCFhbGltNzEwMV9wbXUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkFMaSBNNzEwMSBQTVUgbm90IHByZXNlbnQgLSBXRFQgbm90IHNldFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogU2V0IHRoZSBXRFQgaW4gdGhlIFBNVSB0byAxIHNlY29uZCAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhbGltNzEwMV9wbXUsIEFMSV83MTAxX1dEVCwgMHgwMik7CisKKwlhbGkxNTQzX3NvdXRoID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIE5VTEwpOworCWlmICghYWxpMTU0M19zb3V0aCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQUxpIDE1NDMgU291dGgtQnJpZGdlIG5vdCBwcmVzZW50IC0gV0RUIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShhbGkxNTQzX3NvdXRoLCAweDVlLCAmdG1wKTsKKwlpZiAoKHRtcCAmIDB4MWUpID09IDB4MDApIHsKKwkJaWYgKCF1c2VfZ3BpbykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldGVjdGVkIG9sZCBhbGltNzEwMSByZXZpc2lvbiAnYTFkJy4gIElmIHRoaXMgaXMgYSBjb2JhbHQgYm9hcmQsIHNldCB0aGUgJ3VzZV9ncGlvJyBtb2R1bGUgcGFyYW1ldGVyLlxuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9IAorCQlub3dheW91dCA9IDE7CisJfSBlbHNlIGlmICgodG1wICYgMHgxZSkgIT0gMHgxMiAmJiAodG1wICYgMHgxZSkgIT0gMHgwMCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQUxpIDE1NDMgU291dGgtQnJpZGdlIGRvZXMgbm90IGhhdmUgdGhlIGNvcnJlY3QgcmV2aXNpb24gbnVtYmVyICg/Pz8xMDAxPykgLSBXRFQgbm90IHNldFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYodGltZW91dCA8IDEgfHwgdGltZW91dCA+IDM2MDApIC8qIGFyYml0cmFyeSB1cHBlciBsaW1pdCAqLworCXsKKwkJdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJ0aW1lb3V0IHZhbHVlIG11c3QgYmUgMTw9eDw9MzYwMCwgdXNpbmcgJWRcbiIsCisJCQl0aW1lb3V0KTsKKwl9CisKKwlpbml0X3RpbWVyKCZ0aW1lcik7CisJdGltZXIuZnVuY3Rpb24gPSB3ZHRfdGltZXJfcGluZzsKKwl0aW1lci5kYXRhID0gMTsKKworCXJjID0gbWlzY19yZWdpc3Rlcigmd2R0X21pc2NkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCXdkdF9taXNjZGV2Lm1pbm9yLCByYyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyYyA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJjKTsKKwkJZ290byBlcnJfb3V0X21pc2NkZXY7CisJfQorCisJaWYgKG5vd2F5b3V0KSB7CisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldEVCBkcml2ZXIgZm9yIEFMaSBNNzEwMSBpbml0aWFsaXNlZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKKwkJdGltZW91dCwgbm93YXlvdXQpOworCXJldHVybiAwOworCitlcnJfb3V0X21pc2NkZXY6CisJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CitlcnJfb3V0OgorCXJldHVybiByYzsKK30KKworbW9kdWxlX2luaXQoYWxpbTcxMDFfd2R0X2luaXQpOworbW9kdWxlX2V4aXQoYWxpbTcxMDFfd2R0X3VubG9hZCk7CisKK01PRFVMRV9BVVRIT1IoIlN0ZXZlIEhpbGwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUxpIE03MTAxIFBNVSBDb21wdXRlciBXYXRjaGRvZyBUaW1lciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9jcHU1d2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvY3B1NXdkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjVkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvY3B1NXdkdC5jCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogc21hIGNwdTUgd2F0Y2hkb2cgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEhlaWtvIFJvbnNkb3JmIDxoZXJvQGloZy51bmktZHVpc2J1cmcuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKworLyogYWRqdXN0YWJsZSBwYXJhbWV0ZXJzICovCisKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CitzdGF0aWMgaW50IHBvcnQgPSAweDkxOworc3RhdGljIGludCB0aWNrcyA9IDEwMDAwOworCisjZGVmaW5lIFBGWAkJCSJjcHU1d2R0OiAiCisKKyNkZWZpbmUgQ1BVNVdEVF9FWFRFTlQgICAgICAgICAgMHgwQQorCisjZGVmaW5lIENQVTVXRFRfU1RBVFVTX1JFRyAgICAgIDB4MDAKKyNkZWZpbmUgQ1BVNVdEVF9USU1FX0FfUkVHICAgICAgMHgwMgorI2RlZmluZSBDUFU1V0RUX1RJTUVfQl9SRUcgICAgICAweDAzCisjZGVmaW5lIENQVTVXRFRfTU9ERV9SRUcgICAgICAgIDB4MDQKKyNkZWZpbmUgQ1BVNVdEVF9UUklHR0VSX1JFRyAgICAgMHgwNworI2RlZmluZSBDUFU1V0RUX0VOQUJMRV9SRUcgICAgICAweDA4CisjZGVmaW5lIENQVTVXRFRfUkVTRVRfUkVHICAgICAgIDB4MDkKKworI2RlZmluZSBDUFU1V0RUX0lOVEVSVkFMCShIWi8xMCsxKQorCisvKiBzb21lIGRldmljZSBkYXRhICovCisKK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCBzZW1hcGhvcmUgc3RvcDsKKwl2b2xhdGlsZSBpbnQgcnVubmluZzsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl2b2xhdGlsZSBpbnQgcXVldWU7CisJaW50IGRlZmF1bHRfdGlja3M7CisJdW5zaWduZWQgbG9uZyBpbnVzZTsKK30gY3B1NXdkdF9kZXZpY2U7CisKKy8qIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZCBjcHU1d2R0X3RyaWdnZXIodW5zaWduZWQgbG9uZyB1bnVzZWQpCit7CisJaWYgKCB2ZXJib3NlID4gMiApCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAidHJpZ2dlciBhdCAlaSB0aWNrc1xuIiwgdGlja3MpOworCisJaWYoIGNwdTV3ZHRfZGV2aWNlLnJ1bm5pbmcgKQorCQl0aWNrcy0tOworCisJLyoga2VlcCB3YXRjaGRvZyBhbGl2ZSAqLworCW91dGIoMSwgcG9ydCArIENQVTVXRFRfVFJJR0dFUl9SRUcpOworCisJLyogcmVxdWV1ZT8/ICovCisJaWYoIGNwdTV3ZHRfZGV2aWNlLnF1ZXVlICYmIHRpY2tzICkgeworCQljcHU1d2R0X2RldmljZS50aW1lci5leHBpcmVzID0gamlmZmllcyArIENQVTVXRFRfSU5URVJWQUw7CisJCWFkZF90aW1lcigmY3B1NXdkdF9kZXZpY2UudGltZXIpOworCX0KKwllbHNlIHsKKwkJLyogdGlja3MgZG9lc24ndCBtYXR0ZXIgYW55d2F5ICovCisJCXVwKCZjcHU1d2R0X2RldmljZS5zdG9wKTsKKwl9CisKK30KKworc3RhdGljIHZvaWQgY3B1NXdkdF9yZXNldCh2b2lkKQoreworCXRpY2tzID0gY3B1NXdkdF9kZXZpY2UuZGVmYXVsdF90aWNrczsKKworCWlmICggdmVyYm9zZSApCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAicmVzZXQgKCVpIHRpY2tzKVxuIiwgKGludCkgdGlja3MpOworCit9CisKK3N0YXRpYyB2b2lkIGNwdTV3ZHRfc3RhcnQodm9pZCkKK3sKKwlpZiAoICFjcHU1d2R0X2RldmljZS5xdWV1ZSApIHsKKwkJY3B1NXdkdF9kZXZpY2UucXVldWUgPSAxOworCQlvdXRiKDAsIHBvcnQgKyBDUFU1V0RUX1RJTUVfQV9SRUcpOworCQlvdXRiKDAsIHBvcnQgKyBDUFU1V0RUX1RJTUVfQl9SRUcpOworCQlvdXRiKDEsIHBvcnQgKyBDUFU1V0RUX01PREVfUkVHKTsKKwkJb3V0YigwLCBwb3J0ICsgQ1BVNVdEVF9SRVNFVF9SRUcpOworCQlvdXRiKDAsIHBvcnQgKyBDUFU1V0RUX0VOQUJMRV9SRUcpOworCQljcHU1d2R0X2RldmljZS50aW1lci5leHBpcmVzID0gamlmZmllcyArIENQVTVXRFRfSU5URVJWQUw7CisJCWFkZF90aW1lcigmY3B1NXdkdF9kZXZpY2UudGltZXIpOworCX0KKwkvKiBpZiBwcm9jZXNzIGRpZXMsIGNvdW50ZXIgaXMgbm90IGRlY3JlbWVudGVkICovCisJY3B1NXdkdF9kZXZpY2UucnVubmluZysrOworfQorCitzdGF0aWMgaW50IGNwdTV3ZHRfc3RvcCh2b2lkKQoreworCWlmICggY3B1NXdkdF9kZXZpY2UucnVubmluZyApCisJCWNwdTV3ZHRfZGV2aWNlLnJ1bm5pbmcgPSAwOworCisJdGlja3MgPSBjcHU1d2R0X2RldmljZS5kZWZhdWx0X3RpY2tzOworCisJaWYgKCB2ZXJib3NlICkKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggInN0b3Agbm90IHBvc3NpYmxlXG4iKTsKKworCXJldHVybiAtRUlPOworfQorCisvKiBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgKi8KKworc3RhdGljIGludCBjcHU1d2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKCB0ZXN0X2FuZF9zZXRfYml0KDAsICZjcHU1d2R0X2RldmljZS5pbnVzZSkgKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGNwdTV3ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljbGVhcl9iaXQoMCwgJmNwdTV3ZHRfZGV2aWNlLmludXNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcHU1d2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0KKwl7CisJCS5vcHRpb25zID0gV0RJT0ZfQ0FSRFJFU0VULAorCQkuaWRlbnRpdHkgPSAiQ1BVNSBXRFQiLAorCX07CisKKwlzd2l0Y2goY21kKSB7CisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJY3B1NXdkdF9yZXNldCgpOworCQkJYnJlYWs7CisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQkJdmFsdWUgPSBpbmIocG9ydCArIENQVTVXRFRfU1RBVFVTX1JFRyk7CisJCQl2YWx1ZSA9ICh2YWx1ZSA+PiAyKSAmIDE7CisJCQlpZiAoIGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsdWUsIHNpemVvZihpbnQpKSApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQkJaWYgKCBjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LCBzaXplb2YoaWRlbnQpKSApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQkJaWYgKCBjb3B5X2Zyb21fdXNlcigmdmFsdWUsIGFyZ3AsIHNpemVvZihpbnQpKSApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzd2l0Y2godmFsdWUpIHsKKwkJCQljYXNlIFdESU9TX0VOQUJMRUNBUkQ6CisJCQkJCWNwdTV3ZHRfc3RhcnQoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBXRElPU19ESVNBQkxFQ0FSRDoKKwkJCQkJcmV0dXJuIGNwdTV3ZHRfc3RvcCgpOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisgICAgCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNwdTV3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWlmICggIWNvdW50ICkKKwkJcmV0dXJuIC1FSU87CisKKwljcHU1d2R0X3Jlc2V0KCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNwdTV3ZHRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IGNwdTV3ZHRfaW9jdGwsCisJLm9wZW4JCT0gY3B1NXdkdF9vcGVuLAorCS53cml0ZQkJPSBjcHU1d2R0X3dyaXRlLAorCS5yZWxlYXNlCT0gY3B1NXdkdF9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGNwdTV3ZHRfbWlzYyA9IHsKKwkubWlub3IJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJPSAmY3B1NXdkdF9mb3BzLAorfTsKKworLyogaW5pdC9leGl0IGZ1bmN0aW9uICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNwdTV3ZHRfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGVycjsKKworCWlmICggdmVyYm9zZSApCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAicG9ydD0weCV4LCB2ZXJib3NlPSVpXG4iLCBwb3J0LCB2ZXJib3NlKTsKKworCWlmICggKGVyciA9IG1pc2NfcmVnaXN0ZXIoJmNwdTV3ZHRfbWlzYykpIDwgMCApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibWlzY19yZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIG5vX21pc2M7CisJfQorCisJaWYgKCAhcmVxdWVzdF9yZWdpb24ocG9ydCwgQ1BVNVdEVF9FWFRFTlQsIFBGWCkgKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInJlcXVlc3RfcmVnaW9uIGZhaWxlZFxuIik7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBub19wb3J0OworCX0KKworCS8qIHdhdGNoZG9nIHJlYm9vdD8gKi8KKwl2YWwgPSBpbmIocG9ydCArIENQVTVXRFRfU1RBVFVTX1JFRyk7CisJdmFsID0gKHZhbCA+PiAyKSAmIDE7CisJaWYgKCAhdmFsICkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInNvcnJ5LCB3YXMgbXkgZmF1bHRcbiIpOworCisJaW5pdF9NVVRFWF9MT0NLRUQoJmNwdTV3ZHRfZGV2aWNlLnN0b3ApOworCWNwdTV3ZHRfZGV2aWNlLnF1ZXVlID0gMDsKKworCWNsZWFyX2JpdCgwLCAmY3B1NXdkdF9kZXZpY2UuaW51c2UpOworCisJaW5pdF90aW1lcigmY3B1NXdkdF9kZXZpY2UudGltZXIpOworCWNwdTV3ZHRfZGV2aWNlLnRpbWVyLmZ1bmN0aW9uID0gY3B1NXdkdF90cmlnZ2VyOworCWNwdTV3ZHRfZGV2aWNlLnRpbWVyLmRhdGEgPSAwOworCisJY3B1NXdkdF9kZXZpY2UuZGVmYXVsdF90aWNrcyA9IHRpY2tzOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImluaXQgc3VjY2Vzc1xuIik7CisKKwlyZXR1cm4gMDsKKworbm9fcG9ydDoKKwltaXNjX2RlcmVnaXN0ZXIoJmNwdTV3ZHRfbWlzYyk7Citub19taXNjOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNwdTV3ZHRfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY3B1NXdkdF9pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjcHU1d2R0X2V4aXQodm9pZCkKK3sKKwlpZiAoIGNwdTV3ZHRfZGV2aWNlLnF1ZXVlICkgeworCQljcHU1d2R0X2RldmljZS5xdWV1ZSA9IDA7CisJCWRvd24oJmNwdTV3ZHRfZGV2aWNlLnN0b3ApOworCX0KKworCW1pc2NfZGVyZWdpc3RlcigmY3B1NXdkdF9taXNjKTsKKworCXJlbGVhc2VfcmVnaW9uKHBvcnQsIENQVTVXRFRfRVhURU5UKTsKKworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY3B1NXdkdF9leGl0X21vZHVsZSh2b2lkKQoreworCWNwdTV3ZHRfZXhpdCgpOworfQorCisvKiBtb2R1bGUgZW50cnkgcG9pbnRzICovCisKK21vZHVsZV9pbml0KGNwdTV3ZHRfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoY3B1NXdkdF9leGl0X21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIkhlaWtvIFJvbnNkb3JmIDxoZXJvQGloZy51bmktZHVpc2J1cmcuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInNtYSBjcHU1IHdhdGNoZG9nIGRyaXZlciIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInNtYSBjcHU1IHdhdGNoZG9nIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CisKK21vZHVsZV9wYXJhbShwb3J0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwb3J0LCAiYmFzZSBhZGRyZXNzIG9mIHdhdGNoZG9nIGNhcmQsIGRlZmF1bHQgaXMgMHg5MSIpOworCittb2R1bGVfcGFyYW0odmVyYm9zZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmVyYm9zZSwgImJlIHZlcmJvc2UsIGRlZmF1bHQgaXMgMCAobm8pIik7CisKK21vZHVsZV9wYXJhbSh0aWNrcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGlja3MsICJjb3VudCBkb3duIHRpY2tzLCBkZWZhdWx0IGlzIDEwMDAwIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvZXVyb3RlY2h3ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9ldXJvdGVjaHdkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMGU1NTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvZXVyb3RlY2h3ZHQuYwpAQCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqCUV1cm90ZWNoIENQVS0xMjIwLzE0MTAgb24gYm9hcmQgV0RUIGRyaXZlcgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSBBc2NlbnNpdCA8c3VwcG9ydEBhc2NlbnNpdC5jb20+CisgKgkoYykgQ29weXJpZ2h0IDIwMDEgUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAYXNjZW5zaXQuY29tPgorICoJKGMpIENvcHlyaWdodCAyMDAyIFJvYiBSYWRleiA8cm9iQG9zaW52ZXN0b3IuY29tPgorICoKKyAqCUJhc2VkIG9uIHdkdC5jLgorICoJT3JpZ2luYWwgY29weXJpZ2h0IG1lc3NhZ2VzOgorICoKKyAqICAgICAgKGMpIENvcHlyaWdodCAxOTk2LTE5OTcgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cucmVkaGF0LmNvbQorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIE5laXRoZXIgQWxhbiBDb3ggbm9yIEN5bXJ1TmV0IEx0ZC4gYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCisgKiAgICAgIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZAorICogICAgICAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICogICAgICAoYykgQ29weXJpZ2h0IDE5OTUgICAgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4qCisgKi8KKworLyogQ2hhbmdlbG9nOgorICoKKyAqIDIwMDIvMDQvMjUgLSBSb2IgUmFkZXoKKyAqCWNsZWFuIHVwICNpbmNsdWRlcworICoJY2xlYW4gdXAgbG9ja2luZworICoJbWFrZSBfX3NldHVwIHBhcmFtIHVuaXF1ZQorICoJcHJvcGVyIG9wdGlvbnMgaW4gd2F0Y2hkb2dfaW5mbworICoJYWRkIFdESU9DX0dFVFNUQVRVUyBhbmQgV0RJT0NfU0VUT1BUSU9OUyBpb2N0bHMKKyAqCWFkZCBleHBlY3RfY2xvc2Ugc3VwcG9ydAorICoKKyAqIDIwMDEgLSBSb2RvbGZvIEdpb21ldHRpCisgKglJbml0aWFsIHJlbGVhc2UKKyAqCisgKiAyMDAyLjA1LjMwIC0gSm9lbCBCZWNrZXIgPGpvZWwuYmVja2VyQG9yYWNsZS5jb20+CisgKiAJQWRkZWQgTWF0dCBEb21zY2gncyBub3dheW91dCBtb2R1bGUgb3B0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBldXJ3ZHRfaXNfb3BlbjsKK3N0YXRpYyBpbnQgZXVyd2R0X3RpbWVvdXQ7CitzdGF0aWMgY2hhciBldXJfZXhwZWN0X2Nsb3NlOworCisvKgorICogWW91IG11c3Qgc2V0IHRoZXNlIC0gdGhlcmUgaXMgbm8gc2FuZSB3YXkgdG8gcHJvYmUgZm9yIHRoaXMgYm9hcmQuCisgKiBZb3UgY2FuIHVzZSBldXJ3ZHQ9eCx5IHRvIHNldCB0aGVzZSBub3cuCisgKi8KKworc3RhdGljIGludCBpbyA9IDB4M2YwOworc3RhdGljIGludCBpcnEgPSAxMDsKK3N0YXRpYyBjaGFyICpldiA9ICJpbnQiOworCisjZGVmaW5lIFdEVF9USU1FT1VUCQk2MCAgICAgICAgICAgICAgICAvKiAxIG1pbnV0ZSAqLworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworLyoKKyAqIFNvbWUgc3ltYm9saWMgbmFtZXMKKyAqLworCisjZGVmaW5lIFdEVF9DVFJMX1JFRwkJMHgzMAorI2RlZmluZSBXRFRfT1VUUElOX0NGRwkJMHhlMgorI2RlZmluZSBXRFRfRVZFTlRfSU5UCQkweDAwCisjZGVmaW5lIFdEVF9FVkVOVF9SRUJPT1QJMHgwOAorI2RlZmluZSBXRFRfVU5JVF9TRUwJCTB4ZjEKKyNkZWZpbmUgV0RUX1VOSVRfU0VDUwkJMHg4MAorI2RlZmluZSBXRFRfVElNRU9VVF9WQUwJCTB4ZjIKKyNkZWZpbmUgV0RUX1RJTUVSX0NGRwkJMHhmMworCisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJFdXJvdGVjaCBXRFQgaW8gcG9ydCAoZGVmYXVsdD0weDNmMCkiKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIkV1cm90ZWNoIFdEVCBpcnEgKGRlZmF1bHQ9MTApIik7Cittb2R1bGVfcGFyYW0oZXYsIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZXYsICJFdXJvdGVjaCBXRFQgZXZlbnQgdHlwZSAoZGVmYXVsdCBpcyBgaW50JykiKTsKKworCisvKgorICogUHJvZ3JhbW1pbmcgc3VwcG9ydAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBldXJ3ZHRfd3JpdGVfcmVnKHU4IGluZGV4LCB1OCBkYXRhKQoreworCW91dGIoaW5kZXgsIGlvKTsKKwlvdXRiKGRhdGEsIGlvKzEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXVyd2R0X2xvY2tfY2hpcCh2b2lkKQoreworCW91dGIoMHhhYSwgaW8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXVyd2R0X3VubG9ja19jaGlwKHZvaWQpCit7CisJb3V0YigweDU1LCBpbyk7CisJZXVyd2R0X3dyaXRlX3JlZygweDA3LCAweDA4KTsJLyogc2V0IHRoZSBsb2dpY2FsIGRldmljZSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXVyd2R0X3NldF90aW1lb3V0KGludCB0aW1lb3V0KQoreworCWV1cndkdF93cml0ZV9yZWcoV0RUX1RJTUVPVVRfVkFMLCAodTgpIHRpbWVvdXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXVyd2R0X2Rpc2FibGVfdGltZXIodm9pZCkKK3sKKwlldXJ3ZHRfc2V0X3RpbWVvdXQoMCk7Cit9CisKK3N0YXRpYyB2b2lkIGV1cndkdF9hY3RpdmF0ZV90aW1lcih2b2lkKQoreworCWV1cndkdF9kaXNhYmxlX3RpbWVyKCk7CisJZXVyd2R0X3dyaXRlX3JlZyhXRFRfQ1RSTF9SRUcsIDB4MDEpOwkvKiBhY3RpdmF0ZSB0aGUgV0RUICovCisJZXVyd2R0X3dyaXRlX3JlZyhXRFRfT1VUUElOX0NGRywgIXN0cmNtcCgiaW50IiwgZXYpID8gV0RUX0VWRU5UX0lOVCA6IFdEVF9FVkVOVF9SRUJPT1QpOworCisJLyogU2V0dGluZyBpbnRlcnJ1cHQgbGluZSAqLworCWlmIChpcnEgPT0gMiB8fCBpcnEgPiAxNSB8fCBpcnEgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiOiBpbnZhbGlkIGlycSBudW1iZXJcbiIpOworCQlpcnEgPSAwOwkvKiBpZiBpbnZhbGlkIHdlIGRpc2FibGUgaW50ZXJydXB0ICovCisJfQorCWlmIChpcnEgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiOiBpbnRlcnJ1cHQgZGlzYWJsZWRcbiIpOworCisJZXVyd2R0X3dyaXRlX3JlZyhXRFRfVElNRVJfQ0ZHLCBpcnE8PDQpOworCisJZXVyd2R0X3dyaXRlX3JlZyhXRFRfVU5JVF9TRUwsIFdEVF9VTklUX1NFQ1MpOwkvKiB3ZSB1c2Ugc2Vjb25kcyAqLworCWV1cndkdF9zZXRfdGltZW91dCgwKTsJLyogdGhlIGRlZmF1bHQgdGltZW91dCAqLworfQorCisKKy8qCisgKiBLZXJuZWwgbWV0aG9kcy4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgZXVyd2R0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByaW50ayhLRVJOX0NSSVQgInRpbWVvdXQgV0RUIHRpbWVvdXRcbiIpOworCisjaWZkZWYgT05MWV9URVNUSU5HCisJcHJpbnRrKEtFUk5fQ1JJVCAiV291bGQgUmVib290LlxuIik7CisjZWxzZQorCXByaW50ayhLRVJOX0NSSVQgIkluaXRpYXRpbmcgc3lzdGVtIHJlYm9vdC5cbiIpOworCW1hY2hpbmVfcmVzdGFydChOVUxMKTsKKyNlbmRpZgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKioKKyAqIGV1cndkdF9waW5nOgorICoKKyAqIFJlbG9hZCBjb3VudGVyIG9uZSB3aXRoIHRoZSB3YXRjaGRvZyB0aW1lb3V0LgorICovCisKK3N0YXRpYyB2b2lkIGV1cndkdF9waW5nKHZvaWQpCit7CisJLyogV3JpdGUgdGhlIHdhdGNoZG9nIGRlZmF1bHQgdmFsdWUgKi8KKwlldXJ3ZHRfc2V0X3RpbWVvdXQoZXVyd2R0X3RpbWVvdXQpOworfQorCisvKioKKyAqIGV1cndkdF93cml0ZToKKyAqIEBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgd2F0Y2hkb2cKKyAqIEBidWY6IGJ1ZmZlciB0byB3cml0ZSAodW51c2VkIGFzIGRhdGEgZG9lcyBub3QgbWF0dGVyIGhlcmUKKyAqIEBjb3VudDogY291bnQgb2YgYnl0ZXMKKyAqIEBwcG9zOiBwb2ludGVyIHRvIHRoZSBwb3NpdGlvbiB0byB3cml0ZS4gTm8gc2Vla3MgYWxsb3dlZAorICoKKyAqIEEgd3JpdGUgdG8gYSB3YXRjaGRvZyBkZXZpY2UgaXMgZGVmaW5lZCBhcyBhIGtlZXBhbGl2ZSBzaWduYWwuIEFueQorICogd3JpdGUgb2YgZGF0YSB3aWxsIGRvLCBhcyB3ZSB3ZSBkb24ndCBkZWZpbmUgY29udGVudCBtZWFuaW5nLgorICovCisKK3N0YXRpYyBzc2l6ZV90IGV1cndkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKK3NpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWlmIChjb3VudCkgCXsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWV1cl9leHBlY3RfY2xvc2UgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYoZ2V0X3VzZXIoYywgYnVmK2kpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV1cl9leHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQlldXJ3ZHRfcGluZygpOwkvKiB0aGUgZGVmYXVsdCB0aW1lb3V0ICovCisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIGV1cndkdF9pb2N0bDoKKyAqIEBpbm9kZTogaW5vZGUgb2YgdGhlIGRldmljZQorICogQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSBkZXZpY2UKKyAqIEBjbWQ6IHdhdGNoZG9nIGNvbW1hbmQKKyAqIEBhcmc6IGFyZ3VtZW50IHBvaW50ZXIKKyAqCisgKiBUaGUgd2F0Y2hkb2cgQVBJIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGZ1bmN0aW9ucyBmb3IgYWxsIHdhdGNoZG9ncworICogYWNjb3JkaW5nIHRvIHRoZWlyIGF2YWlsYWJsZSBmZWF0dXJlcy4KKyAqLworCitzdGF0aWMgaW50IGV1cndkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zCSAgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5CSAgPSAiV0RUIEV1cm90ZWNoIENQVS0xMjIwLzE0MTAiLAorCX07CisKKwlpbnQgdGltZTsKKwlpbnQgb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKworCXN3aXRjaChjbWQpIHsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCWV1cndkdF9waW5nKCk7CisJCXJldHVybiAwOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnRpbWUsIHAsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIFNhbml0eSBjaGVjayAqLworCQlpZiAodGltZSA8IDAgfHwgdGltZSA+IDI1NSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWV1cndkdF90aW1lb3V0ID0gdGltZTsKKwkJZXVyd2R0X3NldF90aW1lb3V0KHRpbWUpOworCQkvKiBGYWxsICovCisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldHVybiBwdXRfdXNlcihldXJ3ZHRfdGltZW91dCwgcCk7CisKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCWlmIChnZXRfdXNlcihvcHRpb25zLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAob3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQlldXJ3ZHRfZGlzYWJsZV90aW1lcigpOworCQkJcmV0dmFsID0gMDsKKwkJfQorCQlpZiAob3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCWV1cndkdF9hY3RpdmF0ZV90aW1lcigpOworCQkJZXVyd2R0X3BpbmcoKTsKKwkJCXJldHZhbCA9IDA7CisJCX0KKwkJcmV0dXJuIHJldHZhbDsKKwl9Cit9CisKKy8qKgorICogZXVyd2R0X29wZW46CisgKiBAaW5vZGU6IGlub2RlIG9mIGRldmljZQorICogQGZpbGU6IGZpbGUgaGFuZGxlIHRvIGRldmljZQorICoKKyAqIFRoZSBtaXNjIGRldmljZSBoYXMgYmVlbiBvcGVuZWQuIFRoZSB3YXRjaGRvZyBkZXZpY2UgaXMgc2luZ2xlCisgKiBvcGVuIGFuZCBvbiBvcGVuaW5nIHdlIGxvYWQgdGhlIGNvdW50ZXIuCisgKi8KKworc3RhdGljIGludCBldXJ3ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZXVyd2R0X2lzX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCWV1cndkdF90aW1lb3V0ID0gV0RUX1RJTUVPVVQ7CS8qIGluaXRpYWwgdGltZW91dCAqLworCS8qIEFjdGl2YXRlIHRoZSBXRFQgKi8KKwlldXJ3ZHRfYWN0aXZhdGVfdGltZXIoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKy8qKgorICogZXVyd2R0X3JlbGVhc2U6CisgKiBAaW5vZGU6IGlub2RlIHRvIGJvYXJkCisgKiBAZmlsZTogZmlsZSBoYW5kbGUgdG8gYm9hcmQKKyAqCisgKiBUaGUgd2F0Y2hkb2cgaGFzIGEgY29uZmlndXJhYmxlIEFQSS4gVGhlcmUgaXMgYSByZWxpZ2lvdXMgZGlzcHV0ZQorICogYmV0d2VlbiBwZW9wbGUgd2hvIHdhbnQgdGhlaXIgd2F0Y2hkb2cgdG8gYmUgYWJsZSB0byBzaHV0IGRvd24gYW5kCisgKiB0aG9zZSB3aG8gd2FudCB0byBiZSBzdXJlIGlmIHRoZSB3YXRjaGRvZyBtYW5hZ2VyIGRpZXMgdGhlIG1hY2hpbmUKKyAqIHJlYm9vdHMuIEluIHRoZSBmb3JtZXIgY2FzZSB3ZSBkaXNhYmxlIHRoZSBjb3VudGVycywgaW4gdGhlIGxhdHRlcgorICogY2FzZSB5b3UgaGF2ZSB0byBvcGVuIGl0IGFnYWluIHZlcnkgc29vbi4KKyAqLworCitzdGF0aWMgaW50IGV1cndkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChldXJfZXhwZWN0X2Nsb3NlID09IDQyKSB7CisJCWV1cndkdF9kaXNhYmxlX3RpbWVyKCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiZXVyd2R0OiBVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJZXVyd2R0X3BpbmcoKTsKKwl9CisJY2xlYXJfYml0KDAsICZldXJ3ZHRfaXNfb3Blbik7CisJZXVyX2V4cGVjdF9jbG9zZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZXVyd2R0X25vdGlmeV9zeXM6CisgKiBAdGhpczogb3VyIG5vdGlmaWVyIGJsb2NrCisgKiBAY29kZTogdGhlIGV2ZW50IGJlaW5nIHJlcG9ydGVkCisgKiBAdW51c2VkOiB1bnVzZWQKKyAqCisgKiBPdXIgbm90aWZpZXIgaXMgY2FsbGVkIG9uIHN5c3RlbSBzaHV0ZG93bnMuIFdlIHdhbnQgdG8gdHVybiB0aGUgY2FyZAorICogb2ZmIGF0IHJlYm9vdCBvdGhlcndpc2UgdGhlIG1hY2hpbmUgd2lsbCByZWJvb3QgYWdhaW4gZHVyaW5nIG1lbW9yeQorICogdGVzdCBvciB3b3JzZSB5ZXQgZHVyaW5nIHRoZSBmb2xsb3dpbmcgZnNjay4gVGhpcyB3b3VsZCBzdWNrLCBpbiBmYWN0CisgKiB0cnVzdCBtZSAtIGlmIGl0IGhhcHBlbnMgaXQgZG9lcyBzdWNrLgorICovCisKK3N0YXRpYyBpbnQgZXVyd2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgY2FyZCBvZmYgKi8KKwkJZXVyd2R0X2Rpc2FibGVfdGltZXIoKTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKiBLZXJuZWwgSW50ZXJmYWNlcworICovCisKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXVyd2R0X2ZvcHMgPSB7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmxsc2Vlawk9IG5vX2xsc2VlaywKKwkud3JpdGUJPSBldXJ3ZHRfd3JpdGUsCisJLmlvY3RsCT0gZXVyd2R0X2lvY3RsLAorCS5vcGVuCT0gZXVyd2R0X29wZW4sCisJLnJlbGVhc2UJPSBldXJ3ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBldXJ3ZHRfbWlzY2RldiA9IHsKKwkubWlub3IJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJPSAmZXVyd2R0X2ZvcHMsCit9OworCisvKgorICogVGhlIFdEVCBjYXJkIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCisgKiB0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZXVyd2R0X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gZXVyd2R0X25vdGlmeV9zeXMsCit9OworCisvKioKKyAqIGNsZWFudXBfbW9kdWxlOgorICoKKyAqIFVubG9hZCB0aGUgd2F0Y2hkb2cuIFlvdSBjYW5ub3QgZG8gdGhpcyB3aXRoIGFueSBmaWxlIGhhbmRsZXMgb3Blbi4KKyAqIElmIHlvdXIgd2F0Y2hkb2cgaXMgc2V0IHRvIGNvbnRpbnVlIHRpY2tpbmcgb24gY2xvc2UgYW5kIHlvdSB1bmxvYWQKKyAqIGl0LCB3ZWxsIGl0IGtlZXBzIHRpY2tpbmcuIFdlIHdvbid0IGdldCB0aGUgaW50ZXJydXB0IGJ1dCB0aGUgYm9hcmQKKyAqIHdpbGwgbm90IHRvdWNoIFBDIG1lbW9yeSBzbyBhbGwgaXMgZmluZS4gWW91IGp1c3QgaGF2ZSB0byBsb2FkIGEgbmV3CisgKiBtb2R1bGUgaW4gNjAgc2Vjb25kcyBvciByZWJvb3QuCisgKi8KKworc3RhdGljIHZvaWQgX19leGl0IGV1cndkdF9leGl0KHZvaWQpCit7CisJZXVyd2R0X2xvY2tfY2hpcCgpOworCisJbWlzY19kZXJlZ2lzdGVyKCZldXJ3ZHRfbWlzY2Rldik7CisKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmZXVyd2R0X25vdGlmaWVyKTsKKwlyZWxlYXNlX3JlZ2lvbihpbywgMik7CisJZnJlZV9pcnEoaXJxLCBOVUxMKTsKK30KKworLyoqCisgKiBldXJ3ZHRfaW5pdDoKKyAqCisgKiBTZXQgdXAgdGhlIFdEVCB3YXRjaGRvZyBib2FyZC4gQWZ0ZXIgZ3JhYmJpbmcgdGhlIHJlc291cmNlcworICogd2UgcmVxdWlyZSB3ZSBuZWVkIGFsc28gdG8gdW5sb2NrIHRoZSBkZXZpY2UuCisgKiBUaGUgb3BlbigpIGZ1bmN0aW9uIHdpbGwgYWN0dWFsbHkga2ljayB0aGUgYm9hcmQgb2ZmLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGV1cndkdF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmV1cndkdF9taXNjZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXVyd2R0OiBjYW4ndCBtaXNjX3JlZ2lzdGVyIG9uIG1pbm9yPSVkXG4iLAorCQlXQVRDSERPR19NSU5PUik7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgZXVyd2R0X2ludGVycnVwdCwgU0FfSU5URVJSVVBULCAiZXVyd2R0IiwgTlVMTCk7CisJaWYocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXVyd2R0OiBJUlEgJWQgaXMgbm90IGZyZWUuXG4iLCBpcnEpOworCQlnb3RvIG91dG1pc2M7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgMiwgImV1cndkdCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXVyd2R0OiBJTyAlWCBpcyBub3QgZnJlZS5cbiIsIGlvKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dGlycTsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmV1cndkdF9ub3RpZmllcik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImV1cndkdDogY2FuJ3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLCByZXQpOworCQlnb3RvIG91dHJlZzsKKwl9CisKKwlldXJ3ZHRfdW5sb2NrX2NoaXAoKTsKKworCXJldCA9IDA7CisJcHJpbnRrKEtFUk5fSU5GTyAiRXVyb3RlY2ggV0RUIGRyaXZlciAwLjAxIGF0ICVYIChJbnRlcnJ1cHQgJWQpIgorCQkiIC0gdGltZW91dCBldmVudDogJXNcbiIsCisJCWlvLCBpcnEsICghc3RyY21wKCJpbnQiLCBldikgPyAiaW50IiA6ICJyZWJvb3QiKSk7CisKK291dDoKKwlyZXR1cm4gcmV0OworCitvdXRyZWc6CisJcmVsZWFzZV9yZWdpb24oaW8sIDIpOworCitvdXRpcnE6CisJZnJlZV9pcnEoaXJxLCBOVUxMKTsKKworb3V0bWlzYzoKKwltaXNjX2RlcmVnaXN0ZXIoJmV1cndkdF9taXNjZGV2KTsKKwlnb3RvIG91dDsKK30KKworbW9kdWxlX2luaXQoZXVyd2R0X2luaXQpOworbW9kdWxlX2V4aXQoZXVyd2R0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSb2RvbGZvIEdpb21ldHRpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgRXVyb3RlY2ggQ1BVLTEyMjAvMTQxMCBvbiBib2FyZCB3YXRjaGRvZyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2k4eHhfdGNvLmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaTh4eF90Y28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzM3OTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2k4eHhfdGNvLmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKglpOHh4X3RjbyAwLjA3OglUQ08gdGltZXIgZHJpdmVyIGZvciBpOHh4IGNoaXBzZXRzCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAwIGtlcm5lbCBjb25jZXB0cyA8bmlsc0BrZXJuZWxjb25jZXB0cy5kZT4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgkJCQlodHRwOi8vd3d3Lmtlcm5lbGNvbmNlcHRzLmRlCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIGtlcm5lbCBjb25jZXB0cyBub3IgTmlscyBGYWVyYmVyIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQorICoJd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkCisgKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAwCWtlcm5lbCBjb25jZXB0cyA8bmlsc0BrZXJuZWxjb25jZXB0cy5kZT4KKyAqCQkJCWRldmVsb3BlZCBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmVudHJvIEFHLCBIYWFyL011bmljaCAoR2VybWFueSkKKyAqCisgKglUQ08gdGltZXIgZHJpdmVyIGZvciBpOHh4IGNoaXBzZXRzCisgKgliYXNlZCBvbiBzb2Z0ZG9nLmMgYnkgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKglUaGUgVENPIHRpbWVyIGlzIGltcGxlbWVudGVkIGluIHRoZSBmb2xsb3dpbmcgSS9PIGNvbnRyb2xsZXIgaHViczoKKyAqCShTZWUgdGhlIGludGVsIGRvY3VtZW50YXRpb24gb24gaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20uKQorICoJODI4MDFBQSAgKElDSCkgICAgOiBkb2N1bWVudCBudW1iZXIgMjkwNjU1LTAwMywgMjkwNjc3LTAxNCwKKyAqCTgyODAxQUIgIChJQ0hPKSAgIDogZG9jdW1lbnQgbnVtYmVyIDI5MDY1NS0wMDMsIDI5MDY3Ny0wMTQsCisgKgk4MjgwMUJBICAoSUNIMikgICA6IGRvY3VtZW50IG51bWJlciAyOTA2ODctMDAyLCAyOTgyNDItMDI3LAorICoJODI4MDFCQU0gKElDSDItTSkgOiBkb2N1bWVudCBudW1iZXIgMjkwNjg3LTAwMiwgMjk4MjQyLTAyNywKKyAqCTgyODAxQ0EgIChJQ0gzLVMpIDogZG9jdW1lbnQgbnVtYmVyIDI5MDczMy0wMDMsIDI5MDczOS0wMTMsCisgKgk4MjgwMUNBTSAoSUNIMy1NKSA6IGRvY3VtZW50IG51bWJlciAyOTA3MTYtMDAxLCAyOTA3MTgtMDA3LAorICoJODI4MDFEQiAgKElDSDQpICAgOiBkb2N1bWVudCBudW1iZXIgMjkwNzQ0LTAwMSwgMjkwNzQ1LTAyMCwKKyAqCTgyODAxREJNIChJQ0g0LU0pIDogZG9jdW1lbnQgbnVtYmVyIDI1MjMzNy0wMDEsIDI1MjY2My0wMDUsCisgKgk4MjgwMUUgICAoQy1JQ0gpICA6IGRvY3VtZW50IG51bWJlciAyNzM1OTktMDAxLCAyNzM2NDUtMDAyLAorICoJODI4MDFFQiAgKElDSDUpICAgOiBkb2N1bWVudCBudW1iZXIgMjUyNTE2LTAwMSwgMjUyNTE3LTAwMywKKyAqCTgyODAxRVIgIChJQ0g1UikgIDogZG9jdW1lbnQgbnVtYmVyIDI1MjUxNi0wMDEsIDI1MjUxNy0wMDMsCisgKgk4MjgwMUZCICAoSUNINikgICA6IGRvY3VtZW50IG51bWJlciAzMDE0NzMtMDAyLCAzMDE0NzQtMDA3LAorICoJODI4MDFGUiAgKElDSDZSKSAgOiBkb2N1bWVudCBudW1iZXIgMzAxNDczLTAwMiwgMzAxNDc0LTAwNywKKyAqCTgyODAxRkJNIChJQ0g2LU0pIDogZG9jdW1lbnQgbnVtYmVyIDMwMTQ3My0wMDIsIDMwMTQ3NC0wMDcsCisgKgk4MjgwMUZXICAoSUNINlcpICA6IGRvY3VtZW50IG51bWJlciAzMDE0NzMtMDAxLCAzMDE0NzQtMDA3LAorICoJODI4MDFGUlcgKElDSDZSVykgOiBkb2N1bWVudCBudW1iZXIgMzAxNDczLTAwMSwgMzAxNDc0LTAwNworICoKKyAqICAyMDAwMDcxMCBOaWxzIEZhZXJiZXIKKyAqCUluaXRpYWwgVmVyc2lvbiAwLjAxCisgKiAgMjAwMDA3MjggTmlscyBGYWVyYmVyCisgKgkwLjAyIEZpeCBmb3IgU01JX0VOLT5UQ09fRU4gYml0LCBzb21lIGNsZWFudXBzCisgKiAgMjAwMTEyMTQgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICoJMC4wMyBBZGRlZCBub3dheW91dCBtb2R1bGUgb3B0aW9uIHRvIG92ZXJyaWRlIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorICoJICAgICBEaWRuJ3QgYWRkIHRpbWVvdXQgb3B0aW9uIGFzIGk4MTBfbWFyZ2luIGFscmVhZHkgZXhpc3RzLgorICogIDIwMDIwMjI0IEpvZWwgQmVja2VyLCBXaW0gVmFuIFNlYnJvZWNrCisgKgkwLjA0IFN1cHBvcnQgZm9yIDgyODAxQ0EoTSkgY2hpcHNldCwgdGltZXIgbWFyZ2luIG5lZWRzIHRvIGJlID4gMywKKyAqCSAgICAgYWRkIHN1cHBvcnQgZm9yIFdESU9DX1NFVFRJTUVPVVQgYW5kIFdESU9DX0dFVFRJTUVPVVQuCisgKiAgMjAwMjA0MTIgUm9iIFJhZGV6IDxyb2JAb3NpbnZlc3Rvci5jb20+LCBXaW0gVmFuIFNlYnJvZWNrCisgKgkwLjA1IEZpeCBwb3NzaWJsZSB0aW1lcl9hbGl2ZSByYWNlLCBhZGQgZXhwZWN0IGNsb3NlIHN1cHBvcnQsCisgKgkgICAgIGNsZWFuIHVwIGlvY3RscyAoV0RJT0NfR0VUU1RBVFVTLCBXRElPQ19HRVRCT09UU1RBVFVTIGFuZAorICoJICAgICBXRElPQ19TRVRPUFRJT05TKSwgbWFkZSBpODEwdGNvX2dldGRldmljZSBfX2luaXQsCisgKgkgICAgIHJlbW92ZWQgYm9vdF9zdGF0dXMsIHJlbW92ZWQgdGNvX3RpbWVyX3JlYWQsCisgKgkgICAgIGFkZGVkIHN1cHBvcnQgZm9yIDgyODAxREIgYW5kIDgyODAxRSBjaGlwc2V0LAorICoJICAgICBhZGRlZCBzdXBwb3J0IGZvciA4MjgwMUVCIGFuZCA4MjgwRVIgY2hpcHNldCwKKyAqCSAgICAgZ2VuZXJhbCBjbGVhbnVwLgorICogIDIwMDMwOTIxIFdpbSBWYW4gU2Vicm9lY2sgPHdpbUBpZ3VhbmEuYmU+CisgKgkwLjA2IGNoYW5nZSBpODEwX21hcmdpbiB0byBoZWFydGJlYXQsIHVzZSBtb2R1bGVfcGFyYW0sCisgKgkgICAgIGFkZGVkIG5vdGlmeSBzeXN0ZW0gc3VwcG9ydCwgcmVuYW1lZCBtb2R1bGUgdG8gaTh4eF90Y28uCisgKiAgMjAwNTAxMjggV2ltIFZhbiBTZWJyb2VjayA8d2ltQGlndWFuYS5iZT4KKyAqCTAuMDcgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIElDSDQtTSwgSUNINiwgSUNINlIsIElDSDYtTSwgSUNINlcgYW5kIElDSDZSVworICoJICAgICBjaGlwc2V0cy4gQWxzbyBhZGRlZCBzdXBwb3J0IGZvciB0aGUgInVuZG9jdW1lbnRlZCIgSUNINyBjaGlwc2V0LgorICovCisKKy8qCisgKglJbmNsdWRlcywgZGVmaW5lcywgdmFyaWFibGVzLCBtb2R1bGUgcGFyYW1ldGVycywgLi4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgImk4eHhfdGNvLmgiCisKKy8qIE1vZHVsZSBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBUQ09fVkVSU0lPTiAiMC4wNyIKKyNkZWZpbmUgVENPX01PRFVMRV9OQU1FICJpOHh4IFRDTyB0aW1lciIKKyNkZWZpbmUgVENPX0RSSVZFUl9OQU1FICAgVENPX01PRFVMRV9OQU1FICIsIHYiIFRDT19WRVJTSU9OCisjZGVmaW5lIFBGWCBUQ09fTU9EVUxFX05BTUUgIjogIgorCisvKiBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgQUNQSUJBU0U7CitzdGF0aWMgc3BpbmxvY2tfdCB0Y29fbG9jazsJLyogR3VhcmRzIHRoZSBoYXJkd2FyZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfYWxpdmU7CitzdGF0aWMgY2hhciB0Y29fZXhwZWN0X2Nsb3NlOworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICppOHh4X3Rjb19wY2k7CisKKy8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFdBVENIRE9HX0hFQVJUQkVBVCAzMAkvKiAzMCBzZWMgZGVmYXVsdCBoZWFydGJlYXQgKDI8aGVhcnRiZWF0PDM5KSAqLworc3RhdGljIGludCBoZWFydGJlYXQgPSBXQVRDSERPR19IRUFSVEJFQVQ7ICAvKiBpbiBzZWNvbmRzICovCittb2R1bGVfcGFyYW0oaGVhcnRiZWF0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhoZWFydGJlYXQsICJXYXRjaGRvZyBoZWFydGJlYXQgaW4gc2Vjb25kcy4gKDI8aGVhcnRiZWF0PDM5LCBkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX0hFQVJUQkVBVCkgIikiKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qCisgKiBTb21lIFRDTyBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgc2Vjb25kc190b190aWNrcyhpbnQgc2Vjb25kcykKK3sKKwkvKiB0aGUgaW50ZXJuYWwgdGltZXIgaXMgc3RvcmVkIGFzIHRpY2tzIHdoaWNoIGRlY3JlbWVudAorCSAqIGV2ZXJ5IDAuNiBzZWNvbmRzICovCisJcmV0dXJuIChzZWNvbmRzICogMTApIC8gNjsKK30KKworc3RhdGljIGludCB0Y29fdGltZXJfc3RhcnQgKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlzcGluX2xvY2soJnRjb19sb2NrKTsKKwl2YWwgPSBpbmIgKFRDTzFfQ05UICsgMSk7CisJdmFsICY9IDB4Zjc7CisJb3V0YiAodmFsLCBUQ08xX0NOVCArIDEpOworCXZhbCA9IGluYiAoVENPMV9DTlQgKyAxKTsKKwlzcGluX3VubG9jaygmdGNvX2xvY2spOworCisJaWYgKHZhbCAmIDB4MDgpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0Y29fdGltZXJfc3RvcCAodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKworCXNwaW5fbG9jaygmdGNvX2xvY2spOworCXZhbCA9IGluYiAoVENPMV9DTlQgKyAxKTsKKwl2YWwgfD0gMHgwODsKKwlvdXRiICh2YWwsIFRDTzFfQ05UICsgMSk7CisJdmFsID0gaW5iIChUQ08xX0NOVCArIDEpOworCXNwaW5fdW5sb2NrKCZ0Y29fbG9jayk7CisKKwlpZiAoKHZhbCAmIDB4MDgpID09IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0Y29fdGltZXJfa2VlcGFsaXZlICh2b2lkKQoreworCXNwaW5fbG9jaygmdGNvX2xvY2spOworCW91dGIgKDB4MDEsIFRDTzFfUkxEKTsKKwlzcGluX3VubG9jaygmdGNvX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjb190aW1lcl9zZXRfaGVhcnRiZWF0IChpbnQgdCkKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwl1bnNpZ25lZCBjaGFyIHRtcnZhbDsKKworCXRtcnZhbCA9IHNlY29uZHNfdG9fdGlja3ModCk7CisJLyogZnJvbSB0aGUgc3BlY3M6ICovCisJLyogIlZhbHVlcyBvZiAwaC0zaCBhcmUgaWdub3JlZCBhbmQgc2hvdWxkIG5vdCBiZSBhdHRlbXB0ZWQiICovCisJaWYgKHRtcnZhbCA+IDB4M2YgfHwgdG1ydmFsIDwgMHgwNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBXcml0ZSBuZXcgaGVhcnRiZWF0IHRvIHdhdGNoZG9nICovCisJc3Bpbl9sb2NrKCZ0Y29fbG9jayk7CisJdmFsID0gaW5iIChUQ08xX1RNUik7CisJdmFsICY9IDB4YzA7CisJdmFsIHw9IHRtcnZhbDsKKwlvdXRiICh2YWwsIFRDTzFfVE1SKTsKKwl2YWwgPSBpbmIgKFRDTzFfVE1SKTsKKwlzcGluX3VubG9jaygmdGNvX2xvY2spOworCisJaWYgKCh2YWwgJiAweDNmKSAhPSB0bXJ2YWwpCisJCXJldHVybiAtRUlOVkFMOworCisJaGVhcnRiZWF0ID0gdDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCS9kZXYvd2F0Y2hkb2cgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgaW50IGk4eHhfdGNvX29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIC9kZXYvd2F0Y2hkb2cgY2FuIG9ubHkgYmUgb3BlbmVkIG9uY2UgKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmdGltZXJfYWxpdmUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyoKKwkgKiAgICAgIFJlbG9hZCBhbmQgYWN0aXZhdGUgdGltZXIKKwkgKi8KKwl0Y29fdGltZXJfa2VlcGFsaXZlICgpOworCXRjb190aW1lcl9zdGFydCAoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgaTh4eF90Y29fcmVsZWFzZSAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyoKKwkgKiAgICAgIFNodXQgb2ZmIHRoZSB0aW1lci4KKwkgKi8KKwlpZiAodGNvX2V4cGVjdF9jbG9zZSA9PSA0MikgeworCQl0Y29fdGltZXJfc3RvcCAoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCXRjb190aW1lcl9rZWVwYWxpdmUgKCk7CisJfQorCWNsZWFyX2JpdCgwLCAmdGltZXJfYWxpdmUpOworCXRjb19leHBlY3RfY2xvc2UgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBpOHh4X3Rjb193cml0ZSAoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAorCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICogcHBvcykKK3sKKwkvKiBTZWUgaWYgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgJ1YnIGFuZCByZWxvYWQgdGhlIHRpbWVyICovCisJaWYgKGxlbikgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogbm90ZToganVzdCBpbiBjYXNlIHNvbWVvbmUgd3JvdGUgdGhlIG1hZ2ljIGNoYXJhY3RlcgorCQkJICogZml2ZSBtb250aHMgYWdvLi4uICovCisJCQl0Y29fZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJLyogc2NhbiB0byBzZWUgd2hldGhlciBvciBub3Qgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgKi8KKwkJCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYoZ2V0X3VzZXIoYywgZGF0YStpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQl0Y29fZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKworCQkvKiBzb21lb25lIHdyb3RlIHRvIHVzLCB3ZSBzaG91bGQgcmVsb2FkIHRoZSB0aW1lciAqLworCQl0Y29fdGltZXJfa2VlcGFsaXZlICgpOworCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGk4eHhfdGNvX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG5ld19vcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOworCWludCBuZXdfaGVhcnRiZWF0OworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPQkJV0RJT0ZfU0VUVElNRU9VVCB8CisJCQkJCVdESU9GX0tFRVBBTElWRVBJTkcgfAorCQkJCQlXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9CTAsCisJCS5pZGVudGl0eSA9CQlUQ09fTU9EVUxFX05BTUUsCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LAorCQkJCXNpemVvZiAoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIgKDAsIHApOworCisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJdGNvX3RpbWVyX2tlZXBhbGl2ZSAoKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJeworCQkJaWYgKGdldF91c2VyIChuZXdfb3B0aW9ucywgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChuZXdfb3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQkJdGNvX3RpbWVyX3N0b3AgKCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJaWYgKG5ld19vcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJCXRjb190aW1lcl9rZWVwYWxpdmUgKCk7CisJCQkJdGNvX3RpbWVyX3N0YXJ0ICgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKworCQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCXsKKwkJCWlmIChnZXRfdXNlcihuZXdfaGVhcnRiZWF0LCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHRjb190aW1lcl9zZXRfaGVhcnRiZWF0KG5ld19oZWFydGJlYXQpKQorCQkJICAgIHJldHVybiAtRUlOVkFMOworCisJCQl0Y29fdGltZXJfa2VlcGFsaXZlICgpOworCQkJLyogRmFsbCAqLworCQl9CisKKwkJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQkJcmV0dXJuIHB1dF91c2VyKGhlYXJ0YmVhdCwgcCk7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorfQorCisvKgorICoJTm90aWZ5IHN5c3RlbQorICovCisKK3N0YXRpYyBpbnQgaTh4eF90Y29fbm90aWZ5X3N5cyAoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZT09U1lTX0RPV04gfHwgY29kZT09U1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCQl0Y29fdGltZXJfc3RvcCAoKTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglLZXJuZWwgSW50ZXJmYWNlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGk4eHhfdGNvX2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLmxsc2VlayA9CW5vX2xsc2VlaywKKwkud3JpdGUgPQlpOHh4X3Rjb193cml0ZSwKKwkuaW9jdGwgPQlpOHh4X3Rjb19pb2N0bCwKKwkub3BlbiA9CQlpOHh4X3Rjb19vcGVuLAorCS5yZWxlYXNlID0JaTh4eF90Y29fcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBpOHh4X3Rjb19taXNjZGV2ID0geworCS5taW5vciA9CVdBVENIRE9HX01JTk9SLAorCS5uYW1lID0JCSJ3YXRjaGRvZyIsCisJLmZvcHMgPQkJJmk4eHhfdGNvX2ZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGk4eHhfdGNvX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0JaTh4eF90Y29fbm90aWZ5X3N5cywKK307CisKKy8qCisgKiBEYXRhIGZvciBQQ0kgZHJpdmVyIGludGVyZmFjZQorICoKKyAqIFRoaXMgZGF0YSBvbmx5IGV4aXN0cyBmb3IgZXhwb3J0aW5nIHRoZSBzdXBwb3J0ZWQKKyAqIFBDSSBpZHMgdmlhIE1PRFVMRV9ERVZJQ0VfVEFCTEUuICBXZSBkbyBub3QgYWN0dWFsbHkKKyAqIHJlZ2lzdGVyIGEgcGNpX2RyaXZlciwgYmVjYXVzZSBzb21lb25lIGVsc2UgbWlnaHQgb25lIGRheQorICogd2FudCB0byByZWdpc3RlciBhbm90aGVyIGRyaXZlciBvbiB0aGUgc2FtZSBQQ0kgaWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpOHh4X3Rjb19wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUFfMCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl8wLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzAsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfMTAsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV8xMiwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8wLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzEyLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUVfMCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFFQl8wLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzAsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8yLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzAsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDAsIH0sCQkJLyogRW5kIG9mIGxpc3QgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIGk4eHhfdGNvX3BjaV90YmwpOworCisvKgorICoJSW5pdCAmIGV4aXQgcm91dGluZXMKKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBfX2luaXQgaTh4eF90Y29fZ2V0ZGV2aWNlICh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCXU4IHZhbDEsIHZhbDI7CisJdTE2IGJhZHI7CisJLyoKKwkgKiAgICAgIEZpbmQgdGhlIFBDSSBkZXZpY2UKKwkgKi8KKworCXdoaWxlICgoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKKwkJaWYgKHBjaV9tYXRjaF9kZXZpY2UoaTh4eF90Y29fcGNpX3RibCwgZGV2KSkgeworCQkJaTh4eF90Y29fcGNpID0gZGV2OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaTh4eF90Y29fcGNpKSB7CisJCS8qCisJCSAqICAgICAgRmluZCB0aGUgQUNQSSBiYXNlIEkvTyBhZGRyZXNzIHdoaWNoIGlzIHRoZSBiYXNlCisJCSAqICAgICAgZm9yIHRoZSBUQ08gcmVnaXN0ZXJzIChUQ09CQVNFPUFDUElCQVNFICsgMHg2MCkKKwkJICogICAgICBBQ1BJQkFTRSBpcyBiaXRzIFsxNTo3XSBmcm9tIDB4NDAtMHg0MworCQkgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGk4eHhfdGNvX3BjaSwgMHg0MCwgJnZhbDEpOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoaTh4eF90Y29fcGNpLCAweDQxLCAmdmFsMik7CisJCWJhZHIgPSAoKHZhbDIgPDwgMSkgfCAodmFsMSA+PiA3KSkgPDwgNzsKKwkJQUNQSUJBU0UgPSBiYWRyOworCQkvKiBTb21ldGhpbmcncyB3cm9uZyBoZXJlLCBBQ1BJQkFTRSBoYXMgdG8gYmUgc2V0ICovCisJCWlmIChiYWRyID09IDB4MDAwMSB8fCBiYWRyID09IDB4MDAwMCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBQRlggImZhaWxlZCB0byBnZXQgVENPQkFTRSBhZGRyZXNzXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qCisJCSAqIENoZWNrIGNoaXBzZXQncyBOT19SRUJPT1QgYml0CisJCSAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoaTh4eF90Y29fcGNpLCAweGQ0LCAmdmFsMSk7CisJCWlmICh2YWwxICYgMHgwMikgeworCQkJdmFsMSAmPSAweGZkOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChpOHh4X3Rjb19wY2ksIDB4ZDQsIHZhbDEpOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGk4eHhfdGNvX3BjaSwgMHhkNCwgJnZhbDEpOworCQkJaWYgKHZhbDEgJiAweDAyKSB7CisJCQkJcHJpbnRrIChLRVJOX0VSUiBQRlggImZhaWxlZCB0byByZXNldCBOT19SRUJPT1QgZmxhZywgcmVib290IGRpc2FibGVkIGJ5IGhhcmR3YXJlXG4iKTsKKwkJCQlyZXR1cm4gMDsJLyogQ2Fubm90IHJlc2V0IE5PX1JFQk9PVCBiaXQgKi8KKwkJCX0KKwkJfQorCQkvKiBTZXQgdGhlIFRDT19FTiBiaXQgaW4gU01JX0VOIHJlZ2lzdGVyICovCisJCWlmICghcmVxdWVzdF9yZWdpb24gKFNNSV9FTiArIDEsIDEsICJpOHh4IFRDTyIpKSB7CisJCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAorCQkJCVNNSV9FTiArIDEpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJdmFsMSA9IGluYiAoU01JX0VOICsgMSk7CisJCXZhbDEgJj0gMHhkZjsKKwkJb3V0YiAodmFsMSwgU01JX0VOICsgMSk7CisJCXJlbGVhc2VfcmVnaW9uIChTTUlfRU4gKyAxLCAxKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCB3YXRjaGRvZ19pbml0ICh2b2lkKQoreworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaW5pdCgmdGNvX2xvY2spOworCisJLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIGlzIHRoZXJlICovCisJaWYgKCFpOHh4X3Rjb19nZXRkZXZpY2UgKCkgfHwgaTh4eF90Y29fcGNpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbiAoVENPQkFTRSwgMHgxMCwgImk4eHggVENPIikpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCVRDT0JBU0UpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDbGVhciBvdXQgdGhlIChwcm9iYWJseSBvbGQpIHN0YXR1cyAqLworCW91dGIgKDAsIFRDTzFfU1RTKTsKKwlvdXRiICgzLCBUQ08yX1NUUyk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBoZWFydGJlYXQgdmFsdWUgaXMgd2l0aGluIGl0J3MgcmFuZ2UgOyBpZiBub3QgcmVzZXQgdG8gdGhlIGRlZmF1bHQgKi8KKwlpZiAodGNvX3RpbWVyX3NldF9oZWFydGJlYXQgKGhlYXJ0YmVhdCkpIHsKKwkJaGVhcnRiZWF0ID0gV0FUQ0hET0dfSEVBUlRCRUFUOworCQl0Y29fdGltZXJfc2V0X2hlYXJ0YmVhdCAoaGVhcnRiZWF0KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImhlYXJ0YmVhdCB2YWx1ZSBtdXN0IGJlIDI8aGVhcnRiZWF0PDM5LCB1c2luZyAlZFxuIiwKKwkJCWhlYXJ0YmVhdCk7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZpOHh4X3Rjb19ub3RpZmllcik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCisJCQlyZXQpOworCQlnb3RvIHVucmVnX3JlZ2lvbjsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZpOHh4X3Rjb19taXNjZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJZ290byB1bnJlZ19ub3RpZmllcjsKKwl9CisKKwl0Y29fdGltZXJfc3RvcCAoKTsKKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQgKDB4JTA0eCkuIGhlYXJ0YmVhdD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKKwkJVENPQkFTRSwgaGVhcnRiZWF0LCBub3dheW91dCk7CisKKwlyZXR1cm4gMDsKKwordW5yZWdfbm90aWZpZXI6CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmk4eHhfdGNvX25vdGlmaWVyKTsKK3VucmVnX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbiAoVENPQkFTRSwgMHgxMCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHdhdGNoZG9nX2NsZWFudXAgKHZvaWQpCit7CisJdTggdmFsOworCisJLyogU3RvcCB0aGUgdGltZXIgYmVmb3JlIHdlIGxlYXZlICovCisJaWYgKCFub3dheW91dCkKKwkJdGNvX3RpbWVyX3N0b3AgKCk7CisKKwkvKiBTZXQgdGhlIE5PX1JFQk9PVCBiaXQgdG8gcHJldmVudCBsYXRlciByZWJvb3RzLCBqdXN0IGZvciBzdXJlICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGk4eHhfdGNvX3BjaSwgMHhkNCwgJnZhbCk7CisJdmFsIHw9IDB4MDI7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChpOHh4X3Rjb19wY2ksIDB4ZDQsIHZhbCk7CisKKwkvKiBEZXJlZ2lzdGVyICovCisJbWlzY19kZXJlZ2lzdGVyICgmaTh4eF90Y29fbWlzY2Rldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmk4eHhfdGNvX25vdGlmaWVyKTsKKwlyZWxlYXNlX3JlZ2lvbiAoVENPQkFTRSwgMHgxMCk7Cit9CisKK21vZHVsZV9pbml0KHdhdGNoZG9nX2luaXQpOworbW9kdWxlX2V4aXQod2F0Y2hkb2dfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIk5pbHMgRmFlcmJlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUQ08gdGltZXIgZHJpdmVyIGZvciBpOHh4IGNoaXBzZXRzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaTh4eF90Y28uaCBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pOHh4X3Rjby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMTRlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaTh4eF90Y28uaApAQCAtMCwwICsxLDQyIEBACisvKgorICoJaTh4eF90Y286CVRDTyB0aW1lciBkcml2ZXIgZm9yIGk4eHggY2hpcHNldHMKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDAga2VybmVsIGNvbmNlcHRzIDxuaWxzQGtlcm5lbGNvbmNlcHRzLmRlPiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCQkJCWh0dHA6Ly93d3cua2VybmVsY29uY2VwdHMuZGUKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCU5laXRoZXIga2VybmVsIGNvbmNlcHRzIG5vciBOaWxzIEZhZXJiZXIgYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCisgKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKKyAqCSJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDAJa2VybmVsIGNvbmNlcHRzIDxuaWxzQGtlcm5lbGNvbmNlcHRzLmRlPgorICoJCQkJZGV2ZWxvcGVkIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKZW50cm8gQUcsIEhhYXIvTXVuaWNoIChHZXJtYW55KQorICoKKyAqCVRDTyB0aW1lciBkcml2ZXIgZm9yIGk4eHggY2hpcHNldHMKKyAqCWJhc2VkIG9uIHNvZnRkb2cuYyBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqCUZvciBoaXN0b3J5IGFuZCB0aGUgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgSS9PIENvbnRyb2xsZXIgSHViJ3MKKyAqCXNlZSBpOHh4X3Rjby5jCisgKi8KKworCisvKgorICogU29tZSBhZGRyZXNzIGRlZmluaXRpb25zIGZvciB0aGUgVENPCisgKi8KKworI2RlZmluZQlUQ09CQVNFCQlBQ1BJQkFTRSArIDB4NjAJLyogVENPIGJhc2UgYWRkcmVzcwkJKi8KKyNkZWZpbmUgVENPMV9STEQJVENPQkFTRSArIDB4MDAJLyogVENPIFRpbWVyIFJlbG9hZCBhbmQgQ3VycmVudCBWYWx1ZSAqLworI2RlZmluZSBUQ08xX1RNUglUQ09CQVNFICsgMHgwMQkvKiBUQ08gVGltZXIgSW5pdGlhbCBWYWx1ZQkqLworI2RlZmluZQlUQ08xX0RBVF9JTglUQ09CQVNFICsgMHgwMgkvKiBUQ08gRGF0YSBJbiBSZWdpc3RlcgkJKi8KKyNkZWZpbmUJVENPMV9EQVRfT1VUCVRDT0JBU0UgKyAweDAzCS8qIFRDTyBEYXRhIE91dCBSZWdpc3RlcgkqLworI2RlZmluZQlUQ08xX1NUUwlUQ09CQVNFICsgMHgwNAkvKiBUQ08xIFN0YXR1cyBSZWdpc3RlcgkJKi8KKyNkZWZpbmUJVENPMl9TVFMJVENPQkFTRSArIDB4MDYJLyogVENPMiBTdGF0dXMgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFRDTzFfQ05UCVRDT0JBU0UgKyAweDA4CS8qIFRDTzEgQ29udHJvbCBSZWdpc3RlcgkqLworI2RlZmluZSBUQ08yX0NOVAlUQ09CQVNFICsgMHgwYQkvKiBUQ08yIENvbnRyb2wgUmVnaXN0ZXIJKi8KKworI2RlZmluZQlTTUlfRU4JCUFDUElCQVNFICsgMHgzMAkvKiBTTUkgQ29udHJvbCBhbmQgRW5hYmxlIFJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaWI3MDB3ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pYjcwMHdkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NzRmMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaWI3MDB3ZHQuYwpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqCUlCNzAwIFNpbmdsZSBCb2FyZCBDb21wdXRlciBXRFQgZHJpdmVyCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAxIENoYXJsZXMgSG93ZXMgPGNob3dlc0B2c29sLm5ldD4KKyAqCisgKiAgICAgIEJhc2VkIG9uIGFkdmFudGVjaHdkdC5jIHdoaWNoIGlzIGJhc2VkIG9uIGFjcXVpcmV3ZHQuYyB3aGljaAorICogICAgICAgaXMgYmFzZWQgb24gd2R0LmMuCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAwLTIwMDEgTWFyZWsgTWljaGFsa2lld2ljeiA8bWFyZWttQGxpbnV4Lm9yZy5wbD4KKyAqCisgKglCYXNlZCBvbiBhY3F1aXJld2R0LmMgd2hpY2ggaXMgYmFzZWQgb24gd2R0LmMuCisgKglPcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZXM6CisgKgorICoJKGMpIENvcHlyaWdodCAxOTk2IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoJCQkJaHR0cDovL3d3dy5yZWRoYXQuY29tCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQorICoJd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkCisgKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk1ICAgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICogICAgICAxNC1EZWMtMjAwMSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAgICAgICAgICAgQWRkZWQgbm93YXlvdXQgbW9kdWxlIG9wdGlvbiB0byBvdmVycmlkZSBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKKyAqICAgICAgICAgICBBZGRlZCB0aW1lb3V0IG1vZHVsZSBvcHRpb24gdG8gb3ZlcnJpZGUgZGVmYXVsdAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpYndkdF9pc19vcGVuOworc3RhdGljIHNwaW5sb2NrX3QgaWJ3ZHRfbG9jazsKK3N0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKKworI2RlZmluZSBQRlggImliNzAwd2R0OiAiCisKKy8qCisgKgorICogV2F0Y2hkb2cgVGltZXIgQ29uZmlndXJhdGlvbgorICoKKyAqIFRoZSBmdW5jdGlvbiBvZiB0aGUgd2F0Y2hkb2cgdGltZXIgaXMgdG8gcmVzZXQgdGhlIHN5c3RlbQorICogYXV0b21hdGljYWxseSBhbmQgaXMgZGVmaW5lZCBhdCBJL08gcG9ydCAwNDQzSC4gIFRvIGVuYWJsZSB0aGUKKyAqIHdhdGNoZG9nIHRpbWVyIGFuZCBhbGxvdyB0aGUgc3lzdGVtIHRvIHJlc2V0LCB3cml0ZSBJL08gcG9ydCAwNDQzSC4KKyAqIFRvIGRpc2FibGUgdGhlIHRpbWVyLCB3cml0ZSBJL08gcG9ydCAwNDQxSCBmb3IgdGhlIHN5c3RlbSB0byBzdG9wIHRoZQorICogd2F0Y2hkb2cgZnVuY3Rpb24uICBUaGUgdGltZXIgaGFzIGEgdG9sZXJhbmNlIG9mIDIwJSBmb3IgaXRzCisgKiBpbnRlcnZhbHMuCisgKgorICogVGhlIGZvbGxvd2luZyBkZXNjcmliZXMgaG93IHRoZSB0aW1lciBzaG91bGQgYmUgcHJvZ3JhbW1lZC4KKyAqCisgKiBFbmFibGluZyBXYXRjaGRvZzoKKyAqIE1PViBBWCwwMDBGSCAoQ2hvb3NlIHRoZSB2YWx1ZXMgZnJvbSAwIHRvIEYpCisgKiBNT1YgRFgsMDQ0M0gKKyAqIE9VVCBEWCxBWAorICoKKyAqIERpc2FibGluZyBXYXRjaGRvZzoKKyAqIE1PViBBWCwwMDBGSCAoQW55IHZhbHVlIGlzIGZpbmUuKQorICogTU9WIERYLDA0NDFICisgKiBPVVQgRFgsQVgKKyAqCisgKiBXYXRjaGRvZyB0aW1lciBjb250cm9sIHRhYmxlOgorICogTGV2ZWwgICBWYWx1ZSAgVGltZS9zZWMgfCBMZXZlbCBWYWx1ZSBUaW1lL3NlYworICogICAxICAgICAgIEYgICAgICAgMCAgICAgfCAgIDkgICAgIDcgICAgICAxNgorICogICAyICAgICAgIEUgICAgICAgMiAgICAgfCAgIDEwICAgIDYgICAgICAxOAorICogICAzICAgICAgIEQgICAgICAgNCAgICAgfCAgIDExICAgIDUgICAgICAyMAorICogICA0ICAgICAgIEMgICAgICAgNiAgICAgfCAgIDEyICAgIDQgICAgICAyMgorICogICA1ICAgICAgIEIgICAgICAgOCAgICAgfCAgIDEzICAgIDMgICAgICAyNAorICogICA2ICAgICAgIEEgICAgICAgMTAgICAgfCAgIDE0ICAgIDIgICAgICAyNgorICogICA3ICAgICAgIDkgICAgICAgMTIgICAgfCAgIDE1ICAgIDEgICAgICAyOAorICogICA4ICAgICAgIDggICAgICAgMTQgICAgfCAgIDE2ICAgIDAgICAgICAzMAorICoKKyAqLworCitzdGF0aWMgaW50IHdkX3RpbWVzW10gPSB7CisJMzAsCS8qIDB4MCAqLworCTI4LAkvKiAweDEgKi8KKwkyNiwJLyogMHgyICovCisJMjQsCS8qIDB4MyAqLworCTIyLAkvKiAweDQgKi8KKwkyMCwJLyogMHg1ICovCisJMTgsCS8qIDB4NiAqLworCTE2LAkvKiAweDcgKi8KKwkxNCwJLyogMHg4ICovCisJMTIsCS8qIDB4OSAqLworCTEwLAkvKiAweEEgKi8KKwk4LAkvKiAweEIgKi8KKwk2LAkvKiAweEMgKi8KKwk0LAkvKiAweEQgKi8KKwkyLAkvKiAweEUgKi8KKwkwLAkvKiAweEYgKi8KK307CisKKyNkZWZpbmUgV0RUX1NUT1AgMHg0NDEKKyNkZWZpbmUgV0RUX1NUQVJUIDB4NDQzCisKKy8qIERlZmF1bHQgdGltZW91dCAqLworI2RlZmluZSBXRF9USU1PIDAJCS8qIDMwIHNlY29uZHMgKy8tIDIwJSwgZnJvbSB0YWJsZSAqLworCitzdGF0aWMgaW50IHdkX21hcmdpbiA9IFdEX1RJTU87CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCisKKy8qCisgKglLZXJuZWwgbWV0aG9kcy4KKyAqLworCitzdGF0aWMgdm9pZAoraWJ3ZHRfcGluZyh2b2lkKQoreworCS8qIFdyaXRlIGEgd2F0Y2hkb2cgdmFsdWUgKi8KKwlvdXRiX3Aod2RfbWFyZ2luLCBXRFRfU1RBUlQpOworfQorCitzdGF0aWMgc3NpemVfdAoraWJ3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWlmIChjb3VudCkgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogSW4gY2FzZSBpdCB3YXMgc2V0IGxvbmcgYWdvICovCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCWlid2R0X3BpbmcoKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50CitpYndkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBpLCBuZXdfbWFyZ2luOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcgfCBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPSAxLAorCQkuaWRlbnRpdHkgPSAiSUI3MDAgV0RUIiwKKwl9OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJICBpZiAoY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkpCisJICAgIHJldHVybiAtRUZBVUxUOworCSAgYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkgIHJldHVybiBwdXRfdXNlcigwLCBwKTsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCSAgaWJ3ZHRfcGluZygpOworCSAgYnJlYWs7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJICBpZiAoZ2V0X3VzZXIobmV3X21hcmdpbiwgcCkpCisJCSAgcmV0dXJuIC1FRkFVTFQ7CisJICBpZiAoKG5ld19tYXJnaW4gPCAwKSB8fCAobmV3X21hcmdpbiA+IDMwKSkKKwkJICByZXR1cm4gLUVJTlZBTDsKKwkgIGZvciAoaSA9IDB4MEY7IGkgPiAtMTsgaS0tKQorCQkgIGlmICh3ZF90aW1lc1tpXSA+IG5ld19tYXJnaW4pCisJCQkgIGJyZWFrOworCSAgd2RfbWFyZ2luID0gaTsKKwkgIGlid2R0X3BpbmcoKTsKKwkgIC8qIEZhbGwgKi8KKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkgIHJldHVybiBwdXRfdXNlcih3ZF90aW1lc1t3ZF9tYXJnaW5dLCBwKTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpYndkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXNwaW5fbG9jaygmaWJ3ZHRfbG9jayk7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmlid2R0X2lzX29wZW4pKSB7CisJCXNwaW5fdW5sb2NrKCZpYndkdF9sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKG5vd2F5b3V0KQorCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCisJLyogQWN0aXZhdGUgKi8KKwlpYndkdF9waW5nKCk7CisJc3Bpbl91bmxvY2soJmlid2R0X2xvY2spOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludAoraWJ3ZHRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3Bpbl9sb2NrKCZpYndkdF9sb2NrKTsKKwlpZiAoZXhwZWN0X2Nsb3NlID09IDQyKQorCQlvdXRiX3AoMCwgV0RUX1NUT1ApOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIldEVCBkZXZpY2UgY2xvc2VkIHVuZXhwZWN0ZWRseS4gIFdEVCB3aWxsIG5vdCBzdG9wIVxuIik7CisKKwljbGVhcl9iaXQoMCwgJmlid2R0X2lzX29wZW4pOworCWV4cGVjdF9jbG9zZSA9IDA7CisJc3Bpbl91bmxvY2soJmlid2R0X2xvY2spOworCXJldHVybiAwOworfQorCisvKgorICoJTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCisgKi8KKworc3RhdGljIGludAoraWJ3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwl2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkgeworCQkvKiBUdXJuIHRoZSBXRFQgb2ZmICovCisJCW91dGJfcCgwLCBXRFRfU1RPUCk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqCUtlcm5lbCBJbnRlcmZhY2VzCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaWJ3ZHRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IGlid2R0X3dyaXRlLAorCS5pb2N0bAkJPSBpYndkdF9pb2N0bCwKKwkub3BlbgkJPSBpYndkdF9vcGVuLAorCS5yZWxlYXNlCT0gaWJ3ZHRfY2xvc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgaWJ3ZHRfbWlzY2RldiA9IHsKKwkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9ICJ3YXRjaGRvZyIsCisJLmZvcHMgPSAmaWJ3ZHRfZm9wcywKK307CisKKy8qCisgKglUaGUgV0RUIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCisgKgl0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaWJ3ZHRfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBpYndkdF9ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaWJ3ZHRfaW5pdCh2b2lkKQoreworCWludCByZXM7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiV0RUIGRyaXZlciBmb3IgSUI3MDAgc2luZ2xlIGJvYXJkIGNvbXB1dGVyIGluaXRpYWxpc2luZy5cbiIpOworCisJc3Bpbl9sb2NrX2luaXQoJmlid2R0X2xvY2spOworCXJlcyA9IG1pc2NfcmVnaXN0ZXIoJmlid2R0X21pc2NkZXYpOworCWlmIChyZXMpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImZhaWxlZCB0byByZWdpc3RlciBtaXNjIGRldmljZVxuIik7CisJCWdvdG8gb3V0X25vbWlzYzsKKwl9CisKKyNpZiBXRFRfU1RBUlQgIT0gV0RUX1NUT1AKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKFdEVF9TVE9QLCAxLCAiSUI3MDAgV0RUIikpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIlNUT1AgbWV0aG9kIEkvTyAlWCBpcyBub3QgYXZhaWxhYmxlLlxuIiwgV0RUX1NUT1ApOworCQlyZXMgPSAtRUlPOworCQlnb3RvIG91dF9ub3N0b3ByZWc7CisJfQorI2VuZGlmCisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKFdEVF9TVEFSVCwgMSwgIklCNzAwIFdEVCIpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJTVEFSVCBtZXRob2QgSS9PICVYIGlzIG5vdCBhdmFpbGFibGUuXG4iLCBXRFRfU1RBUlQpOworCQlyZXMgPSAtRUlPOworCQlnb3RvIG91dF9ub3N0YXJ0cmVnOworCX0KKwlyZXMgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmlid2R0X25vdGlmaWVyKTsKKwlpZiAocmVzKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJGYWlsZWQgdG8gcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyLlxuIik7CisJCWdvdG8gb3V0X25vcmVib290OworCX0KKwlyZXR1cm4gMDsKKworb3V0X25vcmVib290OgorCXJlbGVhc2VfcmVnaW9uKFdEVF9TVEFSVCwgMSk7CitvdXRfbm9zdGFydHJlZzoKKyNpZiBXRFRfU1RBUlQgIT0gV0RUX1NUT1AKKwlyZWxlYXNlX3JlZ2lvbihXRFRfU1RPUCwgMSk7CisjZW5kaWYKK291dF9ub3N0b3ByZWc6CisJbWlzY19kZXJlZ2lzdGVyKCZpYndkdF9taXNjZGV2KTsKK291dF9ub21pc2M6CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitpYndkdF9leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZpYndkdF9taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmaWJ3ZHRfbm90aWZpZXIpOworI2lmIFdEVF9TVEFSVCAhPSBXRFRfU1RPUAorCXJlbGVhc2VfcmVnaW9uKFdEVF9TVE9QLDEpOworI2VuZGlmCisJcmVsZWFzZV9yZWdpb24oV0RUX1NUQVJULDEpOworfQorCittb2R1bGVfaW5pdChpYndkdF9pbml0KTsKK21vZHVsZV9leGl0KGlid2R0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJDaGFybGVzIEhvd2VzIDxjaG93ZXNAdnNvbC5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklCNzAwIFNCQyB3YXRjaGRvZyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKKworLyogZW5kIG9mIGliNzAwd2R0LmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pbmR5ZG9nLmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaW5keWRvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZjJjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaW5keWRvZy5jCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICoJSW5keURvZwkwLjMJQSBIYXJkd2FyZSBXYXRjaGRvZyBEZXZpY2UgZm9yIFNHSSBJUDIyCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAyIEd1aWRvIEd1ZW50aGVyIDxhZ3hAc2lneGNwdS5vcmc+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJYmFzZWQgb24gc29mdGRvZy5jIGJ5IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc2dpL21jLmg+CisKKyNkZWZpbmUgUEZYICJpbmR5ZG9nOiAiCitzdGF0aWMgaW50IGluZHlkb2dfYWxpdmU7CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKKyNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCAzMAkJLyogMzAgc2VjIGRlZmF1bHQgdGltZW91dCAqLworCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworc3RhdGljIHZvaWQgaW5keWRvZ19zdGFydCh2b2lkKQoreworCXUzMiBtY19jdHJsMCA9IHNnaW1jLT5jcHVjdHJsMDsKKworCW1jX2N0cmwwID0gc2dpbWMtPmNwdWN0cmwwIHwgU0dJTUNfQ0NUUkwwX1dET0c7CisJc2dpbWMtPmNwdWN0cmwwID0gbWNfY3RybDA7Cit9CisKK3N0YXRpYyB2b2lkIGluZHlkb2dfc3RvcCh2b2lkKQoreworCXUzMiBtY19jdHJsMCA9IHNnaW1jLT5jcHVjdHJsMDsKKworCW1jX2N0cmwwICY9IH5TR0lNQ19DQ1RSTDBfV0RPRzsKKwlzZ2ltYy0+Y3B1Y3RybDAgPSBtY19jdHJsMDsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJTdG9wcGVkIHdhdGNoZG9nIHRpbWVyLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGluZHlkb2dfcGluZyh2b2lkKQoreworCXNnaW1jLT53YXRjaGRvZ3QgPSAwOworfQorCisvKgorICoJQWxsb3cgb25seSBvbmUgcGVyc29uIHRvIGhvbGQgaXQgb3BlbgorICovCitzdGF0aWMgaW50IGluZHlkb2dfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoaW5keWRvZ19hbGl2ZSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChub3dheW91dCkKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKworCS8qIEFjdGl2YXRlIHRpbWVyICovCisJaW5keWRvZ19zdGFydCgpOworCWluZHlkb2dfcGluZygpOworCisJaW5keWRvZ19hbGl2ZSA9IDE7CisJcHJpbnRrKEtFUk5fSU5GTyAiU3RhcnRlZCB3YXRjaGRvZyB0aW1lci5cbiIpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGluZHlkb2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiBTaHV0IG9mZiB0aGUgdGltZXIuCisJICogTG9jayBpdCBpbiBpZiBpdCdzIGEgbW9kdWxlIGFuZCB3ZSBkZWZpbmVkIC4uLk5PV0FZT1VUICovCisJaWYgKCFub3dheW91dCkKKwkJaW5keWRvZ19zdG9wKCk7CQkvKiBUdXJuIHRoZSBXRFQgb2ZmICovCisKKwlpbmR5ZG9nX2FsaXZlID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBpbmR5ZG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJLyogUmVmcmVzaCB0aGUgdGltZXIuICovCisJaWYgKGxlbikgeworCQlpbmR5ZG9nX3BpbmcoKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBpbmR5ZG9nX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBvcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMJCT0gV0RJT0ZfS0VFUEFMSVZFUElORyB8CisJCQkJCSAgV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24JPSAwLAorCQkuaWRlbnRpdHkJCT0gIkhhcmR3YXJlIFdhdGNoZG9nIGZvciBTR0kgSVAyMiIsCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlpZiAoY29weV90b191c2VyKChzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyAqKWFyZywKKwkJCQkJICZpZGVudCwgc2l6ZW9mKGlkZW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcigwLChpbnQgKilhcmcpOworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCWluZHlkb2dfcGluZygpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJCXJldHVybiBwdXRfdXNlcihXQVRDSERPR19USU1FT1VULChpbnQgKilhcmcpOworCQljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCXsKKwkJCWlmIChnZXRfdXNlcihvcHRpb25zLCAoaW50ICopYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKG9wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJCWluZHlkb2dfc3RvcCgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCWlmIChvcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJCWluZHlkb2dfc3RhcnQoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGluZHlkb2dfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpCisJCWluZHlkb2dfc3RvcCgpOwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbmR5ZG9nX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBpbmR5ZG9nX3dyaXRlLAorCS5pb2N0bAkJPSBpbmR5ZG9nX2lvY3RsLAorCS5vcGVuCQk9IGluZHlkb2dfb3BlbiwKKwkucmVsZWFzZQk9IGluZHlkb2dfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBpbmR5ZG9nX21pc2NkZXYgPSB7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJCT0gJmluZHlkb2dfZm9wcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaW5keWRvZ19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGluZHlkb2dfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPQorCUtFUk5fSU5GTyBQRlggIkhhcmR3YXJlIFdhdGNoZG9nIFRpbWVyIGZvciBTR0kgSVAyMjogMC4zXG4iOworCitzdGF0aWMgaW50IF9faW5pdCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmaW5keWRvZ19ub3RpZmllcik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZpbmR5ZG9nX21pc2NkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmluZHlkb2dfbm90aWZpZXIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByaW50ayhiYW5uZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3YXRjaGRvZ19leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZpbmR5ZG9nX21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZpbmR5ZG9nX25vdGlmaWVyKTsKK30KKworbW9kdWxlX2luaXQod2F0Y2hkb2dfaW5pdCk7Cittb2R1bGVfZXhpdCh3YXRjaGRvZ19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiR3VpZG8gR3VlbnRoZXIgPGFneEBzaWd4Y3B1Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSGFyZHdhcmUgV2F0Y2hkb2cgRGV2aWNlIGZvciBTR0kgSVAyMiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDIwMDBfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaXhwMjAwMF93ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjY1OWQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDIwMDBfd2R0LmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBkcml2ZXJzL3dhdGNoZG9nL2l4cDIwMDBfd2R0LmMKKyAqCisgKiBXYXRjaGRvZyBkcml2ZXIgZm9yIEludGVsIElYUDIwMDAgbmV0d29yayBwcm9jZXNzb3JzCisgKgorICogQWRhcHRlZCBmcm9tIHRoZSBJWFA0eHggd2F0Y2hkb2cgZHJpdmVyIGJ5IExlbm5lcnQgQnV5dGVuaGVrLgorICogVGhlIG9yaWdpbmFsIHZlcnNpb24gY2FycmllcyB0aGVzZSBub3RpY2VzOgorICoKKyAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNCAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4KKyAqIEJhc2VkIG9uIHNhMTEwMCBkcml2ZXIsIENvcHlyaWdodCAoQykgMjAwMCBPbGVnIERyb2tpbiA8Z3JlZW5AY3JpbWVhLmVkdT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGVhcnRiZWF0ID0gNjA7CS8qIChzZWNzKSBEZWZhdWx0IGlzIDEgbWludXRlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfc3RhdHVzOworCisjZGVmaW5lCVdEVF9JTl9VU0UJCTAKKyNkZWZpbmUJV0RUX09LX1RPX0NMT1NFCQkxCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF90aWNrX3JhdGU7CisKK3N0YXRpYyB2b2lkCit3ZHRfZW5hYmxlKHZvaWQpCit7CisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9SRVNFVDAsICooSVhQMjAwMF9SRVNFVDApIHwgV0RUX1JFU0VUX0VOQUJMRSk7CisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9UV0RFLCBXRFRfRU5BQkxFKTsKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1Q0X0NMRCwgaGVhcnRiZWF0ICogd2R0X3RpY2tfcmF0ZSk7CisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9UNF9DVEwsIFRJTUVSX0RJVklERVJfMjU2IHwgVElNRVJfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQKK3dkdF9kaXNhYmxlKHZvaWQpCit7CisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9UNF9DVEwsIDApOworfQorCitzdGF0aWMgdm9pZAord2R0X2tlZXBhbGl2ZSh2b2lkKQoreworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfVDRfQ0xELCBoZWFydGJlYXQgKiB3ZHRfdGlja19yYXRlKTsKK30KKworc3RhdGljIGludAoraXhwMjAwMF93ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChXRFRfSU5fVVNFLCAmd2R0X3N0YXR1cykpCisJCXJldHVybiAtRUJVU1k7CisKKwljbGVhcl9iaXQoV0RUX09LX1RPX0NMT1NFLCAmd2R0X3N0YXR1cyk7CisKKwl3ZHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpeHAyMDAwX3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWNsZWFyX2JpdChXRFRfT0tfVE9fQ0xPU0UsICZ3ZHRfc3RhdHVzKTsKKworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKworCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJc2V0X2JpdChXRFRfT0tfVE9fQ0xPU0UsICZ3ZHRfc3RhdHVzKTsKKwkJCX0KKwkJfQorCQl3ZHRfa2VlcGFsaXZlKCk7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworCitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJLm9wdGlvbnMJPSBXRElPRl9NQUdJQ0NMT1NFIHwgV0RJT0ZfU0VUVElNRU9VVCB8CisJCQkJV0RJT0ZfS0VFUEFMSVZFUElORywKKwkuaWRlbnRpdHkJPSAiSVhQMjAwMCBXYXRjaGRvZyIsCit9OworCitzdGF0aWMgaW50CitpeHAyMDAwX3dkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQgPSAtRU5PSU9DVExDTUQ7CisJaW50IHRpbWU7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0ID0gY29weV90b191c2VyKChzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyAqKWFyZywgJmlkZW50LAorCQkJCSAgIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCXJldCA9IHB1dF91c2VyKDAsIChpbnQgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0ID0gcHV0X3VzZXIoMCwgKGludCAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlyZXQgPSBnZXRfdXNlcih0aW1lLCAoaW50ICopYXJnKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWlmICh0aW1lIDw9IDAgfHwgdGltZSA+IDYwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQloZWFydGJlYXQgPSB0aW1lOworCQl3ZHRfa2VlcGFsaXZlKCk7CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXQgPSBwdXRfdXNlcihoZWFydGJlYXQsIChpbnQgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3ZHRfZW5hYmxlKCk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2l4cDIwMDBfd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYml0KFdEVF9PS19UT19DTE9TRSwgJndkdF9zdGF0dXMpKSB7CisJCXdkdF9kaXNhYmxlKCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiV0FUQ0hET0c6IERldmljZSBjbG9zZWQgdW5leHBlY3RkbHkgLSAiCisJCQkJCSJ0aW1lciB3aWxsIG5vdCBzdG9wXG4iKTsKKwl9CisKKwljbGVhcl9iaXQoV0RUX0lOX1VTRSwgJndkdF9zdGF0dXMpOworCWNsZWFyX2JpdChXRFRfT0tfVE9fQ0xPU0UsICZ3ZHRfc3RhdHVzKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGl4cDIwMDBfd2R0X2ZvcHMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gaXhwMjAwMF93ZHRfd3JpdGUsCisJLmlvY3RsCQk9IGl4cDIwMDBfd2R0X2lvY3RsLAorCS5vcGVuCQk9IGl4cDIwMDBfd2R0X29wZW4sCisJLnJlbGVhc2UJPSBpeHAyMDAwX3dkdF9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGl4cDIwMDBfd2R0X21pc2NkZXYgPQoreworCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQkJPSAiSVhQMjAwMCBXYXRjaGRvZyIsCisJLmZvcHMJCT0gJml4cDIwMDBfd2R0X2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpeHAyMDAwX3dkdF9pbml0KHZvaWQpCit7CisJd2R0X3RpY2tfcmF0ZSA9ICgqSVhQMjAwMF9UMV9DTEQgKiBIWikvIDI1Njs7CisKKwlyZXR1cm4gbWlzY19yZWdpc3RlcigmaXhwMjAwMF93ZHRfbWlzY2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpeHAyMDAwX3dkdF9leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZpeHAyMDAwX3dkdF9taXNjZGV2KTsKK30KKworbW9kdWxlX2luaXQoaXhwMjAwMF93ZHRfaW5pdCk7Cittb2R1bGVfZXhpdChpeHAyMDAwX3dkdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldCI+KTsKK01PRFVMRV9ERVNDUklQVElPTigiSVhQMjAwMCBOZXR3b3JrIFByb2Nlc3NvciBXYXRjaGRvZyIpOworCittb2R1bGVfcGFyYW0oaGVhcnRiZWF0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhoZWFydGJlYXQsICJXYXRjaGRvZyBoZWFydGJlYXQgaW4gc2Vjb25kcyAoZGVmYXVsdCA2MHMpIik7CisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQiKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaXhwNHh4X3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDR4eF93ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjM5NmUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDR4eF93ZHQuYwpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIGRyaXZlcnMvd2F0Y2hkb2cvaXhwNHh4X3dkdC5jCisgKgorICogV2F0Y2hkb2cgZHJpdmVyIGZvciBJbnRlbCBJWFA0eHggbmV0d29yayBwcm9jZXNzb3JzCisgKgorICogQXV0aG9yOiBEZWVwYWsgU2F4ZW5hIDxkc2F4ZW5hQHBsZXhpdHkubmV0PgorICoKKyAqIENvcHlyaWdodCAyMDA0IChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLgorICogQmFzZWQgb24gc2ExMTAwIGRyaXZlciwgQ29weXJpZ2h0IChDKSAyMDAwIE9sZWcgRHJva2luIDxncmVlbkBjcmltZWEuZWR1PgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorc3RhdGljIGludCBoZWFydGJlYXQgPSA2MDsJLyogKHNlY3MpIERlZmF1bHQgaXMgMSBtaW51dGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9zdGF0dXM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBib290X3N0YXR1czsKKworI2RlZmluZSBXRFRfVElDS19SQVRFIChJWFA0WFhfUEVSSVBIRVJBTF9CVVNfQ0xPQ0sgKiAxMDAwMDAwVUwpCisKKyNkZWZpbmUJV0RUX0lOX1VTRQkJMAorI2RlZmluZQlXRFRfT0tfVE9fQ0xPU0UJCTEKKworc3RhdGljIHZvaWQKK3dkdF9lbmFibGUodm9pZCkKK3sKKwkqSVhQNFhYX09TV0sgPSBJWFA0WFhfV0RUX0tFWTsKKwkqSVhQNFhYX09TV0UgPSAwOworCSpJWFA0WFhfT1NXVCA9IFdEVF9USUNLX1JBVEUgKiBoZWFydGJlYXQ7CisJKklYUDRYWF9PU1dFID0gSVhQNFhYX1dEVF9DT1VOVF9FTkFCTEUgfCBJWFA0WFhfV0RUX1JFU0VUX0VOQUJMRTsKKwkqSVhQNFhYX09TV0sgPSAwOworfQorCitzdGF0aWMgdm9pZAord2R0X2Rpc2FibGUodm9pZCkKK3sKKwkqSVhQNFhYX09TV0sgPSBJWFA0WFhfV0RUX0tFWTsKKwkqSVhQNFhYX09TV0UgPSAwOworCSpJWFA0WFhfT1NXSyA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK2l4cDR4eF93ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChXRFRfSU5fVVNFLCAmd2R0X3N0YXR1cykpCisJCXJldHVybiAtRUJVU1k7CisKKwljbGVhcl9iaXQoV0RUX09LX1RPX0NMT1NFLCAmd2R0X3N0YXR1cyk7CisKKwl3ZHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpeHA0eHhfd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGxlbikgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJY2xlYXJfYml0KFdEVF9PS19UT19DTE9TRSwgJndkdF9zdGF0dXMpOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCQkJY2hhciBjOworCisJCQkJaWYgKGdldF91c2VyKGMsIGRhdGEgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlzZXRfYml0KFdEVF9PS19UT19DTE9TRSwgJndkdF9zdGF0dXMpOworCQkJfQorCQl9CisJCXdkdF9lbmFibGUoKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJLm9wdGlvbnMJPSBXRElPRl9DQVJEUkVTRVQgfCBXRElPRl9NQUdJQ0NMT1NFIHwKKwkJCSAgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX0tFRVBBTElWRVBJTkcsCisJLmlkZW50aXR5CT0gIklYUDR4eCBXYXRjaGRvZyIsCit9OworCisKK3N0YXRpYyBpbnQKK2l4cDR4eF93ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0ID0gLUVOT0lPQ1RMQ01EOworCWludCB0aW1lOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCXJldCA9IGNvcHlfdG9fdXNlcigoc3RydWN0IHdhdGNoZG9nX2luZm8gKilhcmcsICZpZGVudCwKKwkJCQkgICBzaXplb2YoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQlyZXQgPSBwdXRfdXNlcigwLCAoaW50ICopYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldCA9IHB1dF91c2VyKGJvb3Rfc3RhdHVzLCAoaW50ICopYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCXJldCA9IGdldF91c2VyKHRpbWUsIChpbnQgKilhcmcpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJaWYgKHRpbWUgPD0gMCB8fCB0aW1lID4gNjApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWhlYXJ0YmVhdCA9IHRpbWU7CisJCXdkdF9lbmFibGUoKTsKKwkJLyogRmFsbCB0aHJvdWdoICovCisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldCA9IHB1dF91c2VyKGhlYXJ0YmVhdCwgKGludCAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCXdkdF9lbmFibGUoKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2l4cDR4eF93ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAodGVzdF9iaXQoV0RUX09LX1RPX0NMT1NFLCAmd2R0X3N0YXR1cykpIHsKKwkJd2R0X2Rpc2FibGUoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUICJXQVRDSERPRzogRGV2aWNlIGNsb3NlZCB1bmV4cGVjdGRseSAtICIKKwkJCQkJInRpbWVyIHdpbGwgbm90IHN0b3BcbiIpOworCX0KKworCWNsZWFyX2JpdChXRFRfSU5fVVNFLCAmd2R0X3N0YXR1cyk7CisJY2xlYXJfYml0KFdEVF9PS19UT19DTE9TRSwgJndkdF9zdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXhwNHh4X3dkdF9mb3BzID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IGl4cDR4eF93ZHRfd3JpdGUsCisJLmlvY3RsCQk9IGl4cDR4eF93ZHRfaW9jdGwsCisJLm9wZW4JCT0gaXhwNHh4X3dkdF9vcGVuLAorCS5yZWxlYXNlCT0gaXhwNHh4X3dkdF9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGl4cDR4eF93ZHRfbWlzY2RldiA9Cit7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJJWFA0eHggV2F0Y2hkb2ciLAorCS5mb3BzCQk9ICZpeHA0eHhfd2R0X2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpeHA0eHhfd2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgcHJvY2Vzc29yX2lkOworCisJYXNtKCJtcmMgcDE1LCAwLCAlMCwgY3IwLCBjcjAsIDA7IiA6ICI9ciIocHJvY2Vzc29yX2lkKSA6KTsKKwlpZiAoIShwcm9jZXNzb3JfaWQgJiAweGYpKSB7CisJCXByaW50aygiSVhQNFhYWCBXYXRjaGRvZzogUmV2LiBBMCBDUFUgZGV0ZWN0ZWQgLSAiCisJCQkid2F0Y2hkb2cgZGlzYWJsZWRcbiIpOworCisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJml4cDR4eF93ZHRfbWlzY2Rldik7CisJaWYgKHJldCA9PSAwKQorCQlwcmludGsoIklYUDR4eCBXYXRjaGRvZyBUaW1lcjogaGVhcnRiZWF0ICVkIHNlY1xuIiwgaGVhcnRiZWF0KTsKKworCWJvb3Rfc3RhdHVzID0gKCpJWFA0WFhfT1NTVCAmIElYUDRYWF9PU1NUX1RJTUVSX1dBUk1fUkVTRVQpID8KKwkJCVdESU9GX0NBUkRSRVNFVCA6IDA7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXhwNHh4X3dkdF9leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZpeHA0eHhfd2R0X21pc2NkZXYpOworfQorCisKK21vZHVsZV9pbml0KGl4cDR4eF93ZHRfaW5pdCk7Cittb2R1bGVfZXhpdChpeHA0eHhfd2R0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJEZWVwYWsgU2F4ZW5hIDxkc2F4ZW5hQHBsZXhpdHkubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJWFA0eHggTmV0d29yayBQcm9jZXNzb3IgV2F0Y2hkb2ciKTsKKworbW9kdWxlX3BhcmFtKGhlYXJ0YmVhdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaGVhcnRiZWF0LCAiV2F0Y2hkb2cgaGVhcnRiZWF0IGluIHNlY29uZHMgKGRlZmF1bHQgNjBzKSIpOworCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL21hY2h6d2QuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9tYWNoendkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhMzk1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9tYWNoendkLmMKQEAgLTAsMCArMSw1MDEgQEAKKy8qCisgKiAgTWFjaFogWkYtTG9naWMgV2F0Y2hkb2cgVGltZXIgZHJpdmVyIGZvciBMaW51eAorICoKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhlIGF1dGhvciBkb2VzIE5PVCBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUgd2FycmFudHkgZm9yCisgKiAgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgIkFTLUlTIiBpbgorICogIHRoZSBob3BlIHRoYXQgaXQgbWF5IGJlIHVzZWZ1bCBmb3Igb3RoZXJzLgorICoKKyAqICBBdXRob3I6IEZlcm5hbmRvIEZ1Z2FudGkgPGZ1Z2FudGlAY29uZWN0aXZhLmNvbS5icj4KKyAqCisgKiAgQmFzZWQgb24gc2JjNjB4eHdkdC5jIGJ5IEpha29iIE9lc3RlcmdhYXJkCisgKgorICoKKyAqICBXZSBoYXZlIHR3byB0aW1lcnMgKHdkIzEsIHdkIzIpIGRyaXZlbiBieSBhIDMyIEtIeiBjbG9jayB3aXRoIHRoZQorICogIGZvbGxvd2luZyBwZXJpb2RzOgorICogICAgICB3ZCMxIC0gMiBzZWNvbmRzOworICogICAgICB3ZCMyIC0gNy4yIG1zOworICogIEFmdGVyIHRoZSBleHBpcmF0aW9uIG9mIHdkIzEsIGl0IGNhbiBnZW5lcmF0ZSBhIE5NSSwgU0NJLCBTTUksIG9yCisgKiAgYSBzeXN0ZW0gUkVTRVQgYW5kIGl0IHN0YXJ0cyB3ZCMyIHRoYXQgdW5jb25kaXRpb25hbHkgd2lsbCBSRVNFVAorICogIHRoZSBzeXN0ZW0gd2hlbiB0aGUgY291bnRlciByZWFjaGVzIHplcm8uCisgKgorICogIDE0LURlYy0yMDAxIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqICAgICAgQWRkZWQgbm93YXlvdXQgbW9kdWxlIG9wdGlvbiB0byBvdmVycmlkZSBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyogcG9ydHMgKi8KKyNkZWZpbmUgWkZfSU9CQVNFCTB4MjE4CisjZGVmaW5lIElOREVYCQkweDIxOAorI2RlZmluZSBEQVRBX0IJCTB4MjE5CisjZGVmaW5lIERBVEFfVwkJMHgyMUEKKyNkZWZpbmUgREFUQV9ECQkweDIxQQorCisvKiBpbmRleGVzICovCQkJLyogc2l6ZSAqLworI2RlZmluZSBaRkxfVkVSU0lPTgkweDAyCS8qIDE2ICAgKi8KKyNkZWZpbmUgQ09OVFJPTCAJMHgxMAkvKiAxNiAgICovCisjZGVmaW5lIFNUQVRVUwkJMHgxMgkvKiA4ICAgICovCisjZGVmaW5lIENPVU5URVJfMQkweDBDCS8qIDE2ICAgKi8KKyNkZWZpbmUgQ09VTlRFUl8yCTB4MEUJLyogOCAgICAqLworI2RlZmluZSBQVUxTRV9MRU4JMHgwRgkvKiA4ICAgICovCisKKy8qIGNvbnRyb2xzICovCisjZGVmaW5lIEVOQUJMRV9XRDEJMHgwMDAxCisjZGVmaW5lIEVOQUJMRV9XRDIJMHgwMDAyCisjZGVmaW5lIFJFU0VUX1dEMQkweDAwMTAKKyNkZWZpbmUgUkVTRVRfV0QyCTB4MDAyMAorI2RlZmluZSBHRU5fU0NJCQkweDAxMDAKKyNkZWZpbmUgR0VOX05NSQkJMHgwMjAwCisjZGVmaW5lIEdFTl9TTUkJCTB4MDQwMAorI2RlZmluZSBHRU5fUkVTRVQJMHgwODAwCisKKworLyogdXRpbGl0aWVzICovCisKKyNkZWZpbmUgV0QxCTAKKyNkZWZpbmUgV0QyCTEKKworI2RlZmluZSB6Zl93cml0ZXcocG9ydCwgZGF0YSkgIHsgb3V0Yihwb3J0LCBJTkRFWCk7IG91dHcoZGF0YSwgREFUQV9XKTsgfQorI2RlZmluZSB6Zl93cml0ZWIocG9ydCwgZGF0YSkgIHsgb3V0Yihwb3J0LCBJTkRFWCk7IG91dGIoZGF0YSwgREFUQV9CKTsgfQorI2RlZmluZSB6Zl9nZXRfWkZMX3ZlcnNpb24oKSAgIHpmX3JlYWR3KFpGTF9WRVJTSU9OKQorCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB6Zl9yZWFkdyh1bnNpZ25lZCBjaGFyIHBvcnQpCit7CisJb3V0Yihwb3J0LCBJTkRFWCk7CisJcmV0dXJuIGludyhEQVRBX1cpOworfQorCisKK01PRFVMRV9BVVRIT1IoIkZlcm5hbmRvIEZ1Z2FudGkgPGZ1Z2FudGlAY29uZWN0aXZhLmNvbS5icj4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWFjaFogWkYtTG9naWMgV2F0Y2hkb2cgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCisjZGVmaW5lIFBGWCAibWFjaHp3ZCIKKworc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIHpmX2luZm8gPSB7CisJLm9wdGlvbnMJCT0gV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX01BR0lDQ0xPU0UsCisJLmZpcm13YXJlX3ZlcnNpb24JPSAxLAorCS5pZGVudGl0eQkJPSAiWkYtTG9naWMgd2F0Y2hkb2ciLAorfTsKKworCisvKgorICogYWN0aW9uIHJlZmVycyB0byBhY3Rpb24gdGFrZW4gd2hlbiB3YXRjaGRvZyByZXNldHMKKyAqIDAgPSBHRU5fUkVTRVQKKyAqIDEgPSBHRU5fU01JCisgKiAyID0gR0VOX05NSQorICogMyA9IEdFTl9TQ0kKKyAqIGRlZmF1bHRzIHRvIEdFTl9SRVNFVCAoMCkKKyAqLworc3RhdGljIGludCBhY3Rpb24gPSAwOworbW9kdWxlX3BhcmFtKGFjdGlvbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWN0aW9uLCAiYWZ0ZXIgd2F0Y2hkb2cgcmVzZXRzLCBnZW5lcmF0ZTogMCA9IFJFU0VUKCopICAxID0gU01JICAyID0gTk1JICAzID0gU0NJIik7CisKK3N0YXRpYyBpbnQgemZfYWN0aW9uID0gR0VOX1JFU0VUOworc3RhdGljIHVuc2lnbmVkIGxvbmcgemZfaXNfb3BlbjsKK3N0YXRpYyBjaGFyIHpmX2V4cGVjdF9jbG9zZTsKK3N0YXRpYyBzcGlubG9ja190IHpmX2xvY2s7CitzdGF0aWMgc3BpbmxvY2tfdCB6Zl9wb3J0X2xvY2s7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgemZfdGltZXI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X2hlYXJ0YmVhdCA9IDA7CisKKworLyogdGltZW91dCBmb3IgdXNlciBsYW5kIGhlYXJ0IGJlYXQgKDEwIHNlY29uZHMpICovCisjZGVmaW5lIFpGX1VTRVJfVElNRU8gKEhaKjEwKQorCisvKiB0aW1lb3V0IGZvciBoYXJkd2FyZSB3YXRjaGRvZyAofjUwMG1zKSAqLworI2RlZmluZSBaRl9IV19USU1FTyAoSFovMikKKworLyogbnVtYmVyIG9mIHRpY2tzIG9uIFdEIzEgKGRyaXZlbiBieSBhIDMyS0h6IGNsb2NrLCAycykgKi8KKyNkZWZpbmUgWkZfQ1RJTUVPVVQgMHhmZmZmCisKKyNpZm5kZWYgWkZfREVCVUcKKyMJZGVmaW5lIGRwcmludGsoZm9ybWF0LCBhcmdzLi4uKQorI2Vsc2UKKyMJZGVmaW5lIGRwcmludGsoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBQRlggIjolczolZDogIiBmb3JtYXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18gLCAjIyBhcmdzKQorI2VuZGlmCisKKworc3RhdGljIGlubGluZSB2b2lkIHpmX3NldF9zdGF0dXModW5zaWduZWQgY2hhciBuZXcpCit7CisJemZfd3JpdGViKFNUQVRVUywgbmV3KTsKK30KKworCisvKiBDT05UUk9MIHJlZ2lzdGVyIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHpmX2dldF9jb250cm9sKHZvaWQpCit7CisJcmV0dXJuIHpmX3JlYWR3KENPTlRST0wpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgemZfc2V0X2NvbnRyb2wodW5zaWduZWQgc2hvcnQgbmV3KQoreworCXpmX3dyaXRldyhDT05UUk9MLCBuZXcpOworfQorCisKKy8qIFdEIz8gY291bnRlciBmdW5jdGlvbnMgKi8KKy8qCisgKglKdXN0IHNldCBjb3VudGVyIHZhbHVlCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHpmX3NldF90aW1lcih1bnNpZ25lZCBzaG9ydCBuZXcsIHVuc2lnbmVkIGNoYXIgbikKK3sKKwlzd2l0Y2gobil7CisJCWNhc2UgV0QxOgorCQkJemZfd3JpdGV3KENPVU5URVJfMSwgbmV3KTsKKwkJY2FzZSBXRDI6CisJCQl6Zl93cml0ZWIoQ09VTlRFUl8yLCBuZXcgPiAweGZmID8gMHhmZiA6IG5ldyk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJfQorfQorCisvKgorICogc3RvcCBoYXJkd2FyZSB0aW1lcgorICovCitzdGF0aWMgdm9pZCB6Zl90aW1lcl9vZmYodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3RybF9yZWcgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBzdG9wIGludGVybmFsIHBpbmcgKi8KKwlkZWxfdGltZXJfc3luYygmemZfdGltZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnpmX3BvcnRfbG9jaywgZmxhZ3MpOworCS8qIHN0b3Agd2F0Y2hkb2cgdGltZXIgKi8KKwljdHJsX3JlZyA9IHpmX2dldF9jb250cm9sKCk7CisJY3RybF9yZWcgfD0gKEVOQUJMRV9XRDF8RU5BQkxFX1dEMik7CS8qIGRpc2FibGUgd2QxIGFuZCB3ZDIgKi8KKwljdHJsX3JlZyAmPSB+KEVOQUJMRV9XRDF8RU5BQkxFX1dEMik7CisJemZfc2V0X2NvbnRyb2woY3RybF9yZWcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpmX3BvcnRfbG9jaywgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIjogV2F0Y2hkb2cgdGltZXIgaXMgbm93IGRpc2FibGVkXG4iKTsKK30KKworCisvKgorICogc3RhcnQgaGFyZHdhcmUgdGltZXIKKyAqLworc3RhdGljIHZvaWQgemZfdGltZXJfb24odm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3RybF9yZWcgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmemZfcG9ydF9sb2NrLCBmbGFncyk7CisKKwl6Zl93cml0ZWIoUFVMU0VfTEVOLCAweGZmKTsKKworCXpmX3NldF90aW1lcihaRl9DVElNRU9VVCwgV0QxKTsKKworCS8qIHVzZXIgbGFuZCBwaW5nICovCisJbmV4dF9oZWFydGJlYXQgPSBqaWZmaWVzICsgWkZfVVNFUl9USU1FTzsKKworCS8qIHN0YXJ0IHRoZSB0aW1lciBmb3IgaW50ZXJuYWwgcGluZyAqLworCXpmX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgWkZfSFdfVElNRU87CisKKwlhZGRfdGltZXIoJnpmX3RpbWVyKTsKKworCS8qIHN0YXJ0IHdhdGNoZG9nIHRpbWVyICovCisJY3RybF9yZWcgPSB6Zl9nZXRfY29udHJvbCgpOworCWN0cmxfcmVnIHw9IChFTkFCTEVfV0QxfHpmX2FjdGlvbik7CisJemZfc2V0X2NvbnRyb2woY3RybF9yZWcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpmX3BvcnRfbG9jaywgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIjogV2F0Y2hkb2cgdGltZXIgaXMgbm93IGVuYWJsZWRcbiIpOworfQorCisKK3N0YXRpYyB2b2lkIHpmX3BpbmcodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGludCBjdHJsX3JlZyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXpmX3dyaXRlYihDT1VOVEVSXzIsIDB4ZmYpOworCisJaWYodGltZV9iZWZvcmUoamlmZmllcywgbmV4dF9oZWFydGJlYXQpKXsKKworCQlkcHJpbnRrKCJ0aW1lX2JlZm9yZTogJWxkXG4iLCBuZXh0X2hlYXJ0YmVhdCAtIGppZmZpZXMpOworCisJCS8qCisJCSAqIHJlc2V0IGV2ZW50IGlzIGFjdGl2YXRlZCBieSB0cmFuc2l0aW9uIGZyb20gMCB0byAxIG9uCisJCSAqIFJFU0VUX1dEMSBiaXQgYW5kIHdlIGFzc3VtZSB0aGF0IGl0IGlzIGFscmVhZHkgemVyby4uLgorCQkgKi8KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmemZfcG9ydF9sb2NrLCBmbGFncyk7CisJCWN0cmxfcmVnID0gemZfZ2V0X2NvbnRyb2woKTsKKwkJY3RybF9yZWcgfD0gUkVTRVRfV0QxOworCQl6Zl9zZXRfY29udHJvbChjdHJsX3JlZyk7CisKKwkJLyogLi4uYW5kIG5vdGhpbmcgY2hhbmdlcyB1bnRpbCBoZXJlICovCisJCWN0cmxfcmVnICY9IH4oUkVTRVRfV0QxKTsKKwkJemZfc2V0X2NvbnRyb2woY3RybF9yZWcpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6Zl9wb3J0X2xvY2ssIGZsYWdzKTsKKworCQl6Zl90aW1lci5leHBpcmVzID0gamlmZmllcyArIFpGX0hXX1RJTUVPOworCQlhZGRfdGltZXIoJnpmX3RpbWVyKTsKKwl9ZWxzZXsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIjogSSB3aWxsIHJlc2V0IHlvdXIgbWFjaGluZVxuIik7CisJfQorfQorCitzdGF0aWMgc3NpemVfdCB6Zl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJCQkJCQlsb2ZmX3QgKnBwb3MpCit7CisJLyogU2VlIGlmIHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICovCisJaWYoY291bnQpeworCisJCS8qCisJCSAqIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGNsb3NlIGNvbmZpcm1hdGlvbgorCQkgKiBubyB3YXkgdG8gZGlzYWJsZSB3YXRjaGRvZyA7KQorCQkgKi8KKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IG9mczsKKworCQkJLyoKKwkJCSAqIG5vdGU6IGp1c3QgaW4gY2FzZSBzb21lb25lIHdyb3RlIHRoZSBtYWdpYyBjaGFyYWN0ZXIKKwkJCSAqIGZpdmUgbW9udGhzIGFnby4uLgorCQkJICovCisJCQl6Zl9leHBlY3RfY2xvc2UgPSAwOworCisJCQkvKiBub3cgc2NhbiAqLworCQkJZm9yIChvZnMgPSAwOyBvZnMgIT0gY291bnQ7IG9mcysrKXsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIG9mcykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJyl7CisJCQkJCXpmX2V4cGVjdF9jbG9zZSA9IDQyOworCQkJCQlkcHJpbnRrKCJ6Zl9leHBlY3RfY2xvc2UgPSA0MlxuIik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyoKKwkJICogV2VsbCwgYW55aG93IHNvbWVvbmUgd3JvdGUgdG8gdXMsCisJCSAqIHdlIHNob3VsZCByZXR1cm4gdGhhdCBmYXZvdXIKKwkJICovCisJCW5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArIFpGX1VTRVJfVElNRU87CisJCWRwcmludGsoInVzZXIgcGluZyBhdCAlbGRcbiIsIGppZmZpZXMpOworCisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHpmX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCXN3aXRjaChjbWQpeworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ6Zl9pbmZvLCBzaXplb2YoemZfaW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisKKwkJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwkJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCQl6Zl9waW5nKDApOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgemZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzcGluX2xvY2soJnpmX2xvY2spOworCWlmKHRlc3RfYW5kX3NldF9iaXQoMCwgJnpmX2lzX29wZW4pKSB7CisJCXNwaW5fdW5sb2NrKCZ6Zl9sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAobm93YXlvdXQpCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwlzcGluX3VubG9jaygmemZfbG9jayk7CisKKwl6Zl90aW1lcl9vbigpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHpmX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmKHpmX2V4cGVjdF9jbG9zZSA9PSA0Mil7CisJCXpmX3RpbWVyX29mZigpOworCX0gZWxzZSB7CisJCWRlbF90aW1lcigmemZfdGltZXIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICI6IGRldmljZSBmaWxlIGNsb3NlZCB1bmV4cGVjdGVkbHkuIFdpbGwgbm90IHN0b3AgdGhlIFdEVCFcbiIpOworCX0KKworCXNwaW5fbG9jaygmemZfbG9jayk7CisJY2xlYXJfYml0KDAsICZ6Zl9pc19vcGVuKTsKKwlzcGluX3VubG9jaygmemZfbG9jayk7CisKKwl6Zl9leHBlY3RfY2xvc2UgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBOb3RpZmllciBmb3Igc3lzdGVtIGRvd24KKyAqLworCitzdGF0aWMgaW50IHpmX25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJCQkJCQkJCXZvaWQgKnVudXNlZCkKK3sKKwlpZihjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpeworCQl6Zl90aW1lcl9vZmYoKTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKworCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHpmX2ZvcHMgPSB7CisJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAorCS53cml0ZSAgICAgICAgICA9IHpmX3dyaXRlLAorCS5pb2N0bCAgICAgICAgICA9IHpmX2lvY3RsLAorCS5vcGVuICAgICAgICAgICA9IHpmX29wZW4sCisJLnJlbGVhc2UgICAgICAgID0gemZfY2xvc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgemZfbWlzY2RldiA9IHsKKwkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9ICJ3YXRjaGRvZyIsCisJLmZvcHMgPSAmemZfZm9wcywKK307CisgCisKKy8qCisgKiBUaGUgZGV2aWNlIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCisgKiB0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgorICovCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHpmX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gemZfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB6Zl9zaG93X2FjdGlvbihpbnQgYWN0KQoreworCWNoYXIgKnN0cltdID0geyAiUkVTRVQiLCAiU01JIiwgIk5NSSIsICJTQ0kiIH07CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiOiBXYXRjaGRvZyB1c2luZyBhY3Rpb24gPSAlc1xuIiwgc3RyW2FjdF0pOworfQorCitzdGF0aWMgaW50IF9faW5pdCB6Zl9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICI6IE1hY2haIFpGLUxvZ2ljIFdhdGNoZG9nIGRyaXZlciBpbml0aWFsaXppbmcuXG4iKTsKKworCXJldCA9IHpmX2dldF9aRkxfdmVyc2lvbigpOworCXByaW50aygiJSN4XG4iLCByZXQpOworCWlmKCghcmV0KSB8fCAocmV0ICE9IDB4ZmZmZikpeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiOiBubyBaRi1Mb2dpYyBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmKChhY3Rpb24gPD0gMykgJiYgKGFjdGlvbiA+PSAwKSl7CisJCXpmX2FjdGlvbiA9IHpmX2FjdGlvbj4+YWN0aW9uOworCX0gZWxzZQorCQlhY3Rpb24gPSAwOworCisJemZfc2hvd19hY3Rpb24oYWN0aW9uKTsKKworCXNwaW5fbG9ja19pbml0KCZ6Zl9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmemZfcG9ydF9sb2NrKTsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnpmX21pc2NkZXYpOworCWlmIChyZXQpeworCQlwcmludGsoS0VSTl9FUlIgImNhbid0IG1pc2NfcmVnaXN0ZXIgb24gbWlub3I9JWRcbiIsCisJCQkJCQkJV0FUQ0hET0dfTUlOT1IpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZighcmVxdWVzdF9yZWdpb24oWkZfSU9CQVNFLCAzLCAiTWFjaFogWkZMIFdEVCIpKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgcmVzZXJ2ZSBJL08gcG9ydHMgYXQgJWRcbiIsCisJCQkJCQkJWkZfSU9CQVNFKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG5vX3JlZ2lvbjsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnpmX25vdGlmaWVyKTsKKwlpZihyZXQpeworCQlwcmludGsoS0VSTl9FUlIgImNhbid0IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCQkJCQkJCXJldCk7CisJCWdvdG8gbm9fcmVib290OworCX0KKworCXpmX3NldF9zdGF0dXMoMCk7CisJemZfc2V0X2NvbnRyb2woMCk7CisKKwkvKiB0aGlzIGlzIHRoZSB0aW1lciB0aGF0IHdpbGwgZG8gdGhlIGhhcmQgd29yayAqLworCWluaXRfdGltZXIoJnpmX3RpbWVyKTsKKwl6Zl90aW1lci5mdW5jdGlvbiA9IHpmX3Bpbmc7CisJemZfdGltZXIuZGF0YSA9IDA7CisKKwlyZXR1cm4gMDsKKworbm9fcmVib290OgorCXJlbGVhc2VfcmVnaW9uKFpGX0lPQkFTRSwgMyk7Citub19yZWdpb246CisJbWlzY19kZXJlZ2lzdGVyKCZ6Zl9taXNjZGV2KTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCB6Zl9leGl0KHZvaWQpCit7CisJemZfdGltZXJfb2ZmKCk7CisKKwltaXNjX2RlcmVnaXN0ZXIoJnpmX21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ6Zl9ub3RpZmllcik7CisJcmVsZWFzZV9yZWdpb24oWkZfSU9CQVNFLCAzKTsKK30KKworbW9kdWxlX2luaXQoemZfaW5pdCk7Cittb2R1bGVfZXhpdCh6Zl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9taXhjb213ZC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL21peGNvbXdkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0M2U0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9taXhjb213ZC5jCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogTWl4Q29tIFdhdGNoZG9nOiBBIFNpbXBsZSBIYXJkd2FyZSBXYXRjaGRvZyBEZXZpY2UKKyAqIEJhc2VkIG9uIFNvZnRkb2cgZHJpdmVyIGJ5IEFsYW4gQ294IGFuZCBQQyBXYXRjaGRvZyBkcml2ZXIgYnkgS2VuIEhvbGxpcworICoKKyAqIEF1dGhvcjogR2VyZ2VseSBNYWRhcmFzeiA8Z29yZ29AaXRjLmh1PgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBJVENvbnN1bHQtUHJvIENvLiA8aW5mb0BpdGMuaHU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBWZXJzaW9uIDAuMSAoOTkvMDQvMTUpOgorICoJCS0gZmlyc3QgdmVyc2lvbgorICoKKyAqIFZlcnNpb24gMC4yICg5OS8wNi8xNik6CisgKgkJLSBhZGRlZCBrZXJuZWwgdGltZXIgd2F0Y2hkb2cgcGluZyBhZnRlciBjbG9zZQorICoJCSAgc2luY2UgdGhlIGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgd2F0Y2hkb2cgc2h1dGRvd24KKyAqCisgKiBWZXJzaW9uIDAuMyAoOTkvMDYvMjEpOgorICoJCS0gYWRkZWQgV0RJT0NfR0VUU1RBVFVTIGFuZCBXRElPQ19HRVRTVVBQT1JUIGlvY3RsIGNhbGxzCisgKgorICogVmVyc2lvbiAwLjMuMSAoOTkvMDYvMjIpOgorICoJCS0gYWxsb3cgbW9kdWxlIHJlbW92YWwgd2hpbGUgaW50ZXJuYWwgdGltZXIgaXMgYWN0aXZlLAorICoJCSAgcHJpbnQgd2FybmluZyBhYm91dCBwcm9iYWJsZSByZXNldAorICoKKyAqIFZlcnNpb24gMC40ICg5OS8xMS8xNSk6CisgKgkJLSBzdXBwb3J0IGZvciBvbmUgbW9yZSB0eXBlIGJvYXJkCisgKgorICogVmVyc2lvbiAwLjUgKDIwMDEvMTIvMTQpIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqICAgICAgICAgICAgICAtIGFkZGVkIG5vd2F5b3V0IG1vZHVsZSBvcHRpb24gdG8gb3ZlcnJpZGUgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCisgKgorICovCisKKyNkZWZpbmUgVkVSU0lPTiAiMC41IgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyBpbnQgbWl4Y29td2RfaW9wb3J0c1tdID0geyAweDE4MCwgMHgyODAsIDB4MzgwLCAweDAwMCB9OworCisjZGVmaW5lIE1JWENPTV9XQVRDSERPR19PRkZTRVQgMHhjMTAKKyNkZWZpbmUgTUlYQ09NX0lEIDB4MTEKKyNkZWZpbmUgRkxBU0hDT01fV0FUQ0hET0dfT0ZGU0VUIDB4NAorI2RlZmluZSBGTEFTSENPTV9JRCAweDE4CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1peGNvbXdkX29wZW5lZDsgLyogbG9uZyByZXEnZCBmb3Igc2V0Yml0IC0tUlIgKi8KKworc3RhdGljIGludCB3YXRjaGRvZ19wb3J0Oworc3RhdGljIGludCBtaXhjb213ZF90aW1lcl9hbGl2ZTsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBtaXhjb213ZF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworc3RhdGljIHZvaWQgbWl4Y29td2RfcGluZyh2b2lkKQoreworCW91dGJfcCg1NSx3YXRjaGRvZ19wb3J0KTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG1peGNvbXdkX3RpbWVyZnVuKHVuc2lnbmVkIGxvbmcgZCkKK3sKKwltaXhjb213ZF9waW5nKCk7CisKKwltb2RfdGltZXIoJm1peGNvbXdkX3RpbWVyLGppZmZpZXMrIDUqSFopOworfQorCisvKgorICoJQWxsb3cgb25seSBvbmUgcGVyc29uIHRvIGhvbGQgaXQgb3BlbgorICovCisKK3N0YXRpYyBpbnQgbWl4Y29td2Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZih0ZXN0X2FuZF9zZXRfYml0KDAsJm1peGNvbXdkX29wZW5lZCkpIHsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJbWl4Y29td2RfcGluZygpOworCisJaWYgKG5vd2F5b3V0KSB7CisJCS8qCisJCSAqIGZvcHNfZ2V0KCkgY29kZSB2aWEgb3BlbigpIGhhcyBhbHJlYWR5IGRvbmUKKwkJICogYSB0cnlfbW9kdWxlX2dldCgpIHNvIGl0IGlzIHNhZmUgdG8gZG8gdGhlCisJCSAqIF9fbW9kdWxlX2dldCgpLgorCQkgKi8KKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwl9IGVsc2UgeworCQlpZihtaXhjb213ZF90aW1lcl9hbGl2ZSkgeworCQkJZGVsX3RpbWVyKCZtaXhjb213ZF90aW1lcik7CisJCQltaXhjb213ZF90aW1lcl9hbGl2ZT0wOworCQl9CisJfQorCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBtaXhjb213ZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJaWYobWl4Y29td2RfdGltZXJfYWxpdmUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibWl4Y29td2Q6IHJlbGVhc2UgY2FsbGVkIHdoaWxlIGludGVybmFsIHRpbWVyIGFsaXZlIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWluaXRfdGltZXIoJm1peGNvbXdkX3RpbWVyKTsKKwkJbWl4Y29td2RfdGltZXIuZXhwaXJlcz1qaWZmaWVzICsgNSAqIEhaOworCQltaXhjb213ZF90aW1lci5mdW5jdGlvbj1taXhjb213ZF90aW1lcmZ1bjsKKwkJbWl4Y29td2RfdGltZXIuZGF0YT0wOworCQltaXhjb213ZF90aW1lcl9hbGl2ZT0xOworCQlhZGRfdGltZXIoJm1peGNvbXdkX3RpbWVyKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUICJtaXhjb213ZDogV0RUIGRldmljZSBjbG9zZWQgdW5leHBlY3RlZGx5LiAgV0RUIHdpbGwgbm90IHN0b3AhXG4iKTsKKwl9CisKKwljbGVhcl9iaXQoMCwmbWl4Y29td2Rfb3BlbmVkKTsKKwlleHBlY3RfY2xvc2U9MDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3NpemVfdCBtaXhjb213ZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlpZihsZW4pCisJeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogSW4gY2FzZSBpdCB3YXMgc2V0IGxvbmcgYWdvICovCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKwkJbWl4Y29td2RfcGluZygpOworCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IG1peGNvbXdkX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCWludCBzdGF0dXM7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcgfCBXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJCS5pZGVudGl0eSA9ICJNaXhDT00gd2F0Y2hkb2ciLAorCX07CisKKwlzd2l0Y2goY21kKQorCXsKKwkJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCQlzdGF0dXM9bWl4Y29td2Rfb3BlbmVkOworCQkJaWYgKCFub3dheW91dCkgeworCQkJCXN0YXR1c3w9bWl4Y29td2RfdGltZXJfYWxpdmU7CisJCQl9CisJCQlpZiAoY29weV90b191c2VyKHAsICZzdGF0dXMsIHNpemVvZihpbnQpKSkgeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LCBzaXplb2YoaWRlbnQpKSkgeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJbWl4Y29td2RfcGluZygpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWl4Y29td2RfZm9wcz0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IG1peGNvbXdkX3dyaXRlLAorCS5pb2N0bAkJPSBtaXhjb213ZF9pb2N0bCwKKwkub3BlbgkJPSBtaXhjb213ZF9vcGVuLAorCS5yZWxlYXNlCT0gbWl4Y29td2RfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtaXhjb213ZF9taXNjZGV2PQoreworCS5taW5vcgk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCT0gIndhdGNoZG9nIiwKKwkuZm9wcwk9ICZtaXhjb213ZF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWl4Y29td2RfY2hlY2tjYXJkKGludCBwb3J0KQoreworCWludCBpZDsKKworCXBvcnQgKz0gTUlYQ09NX1dBVENIRE9HX09GRlNFVDsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHBvcnQsIDEsICJNaXhDT00gd2F0Y2hkb2ciKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpZD1pbmJfcChwb3J0KSAmIDB4M2Y7CisJaWYoaWQhPU1JWENPTV9JRCkgeworCQlyZWxlYXNlX3JlZ2lvbihwb3J0LCAxKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBwb3J0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBmbGFzaGNvbV9jaGVja2NhcmQoaW50IHBvcnQpCit7CisJaW50IGlkOworCisJcG9ydCArPSBGTEFTSENPTV9XQVRDSERPR19PRkZTRVQ7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwb3J0LCAxLCAiTWl4Q09NIHdhdGNoZG9nIikpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJaWQ9aW5iX3AocG9ydCk7CisgCWlmKGlkIT1GTEFTSENPTV9JRCkgeworCQlyZWxlYXNlX3JlZ2lvbihwb3J0LCAxKTsKKwkJcmV0dXJuIDA7CisJfQorIAlyZXR1cm4gcG9ydDsKKyB9CisKK3N0YXRpYyBpbnQgX19pbml0IG1peGNvbXdkX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCWludCBmb3VuZD0wOworCisJZm9yIChpID0gMDsgIWZvdW5kICYmIG1peGNvbXdkX2lvcG9ydHNbaV0gIT0gMDsgaSsrKSB7CisJCXdhdGNoZG9nX3BvcnQgPSBtaXhjb213ZF9jaGVja2NhcmQobWl4Y29td2RfaW9wb3J0c1tpXSk7CisJCWlmICh3YXRjaGRvZ19wb3J0KSB7CisJCQlmb3VuZCA9IDE7CisJCX0KKwl9CisKKwkvKiBUaGUgRmxhc2hDT00gY2FyZCBjYW4gYmUgc2V0IHVwIGF0IDB4MzAwIC0+IDB4Mzc4LCBpbiAweDgganVtcHMgKi8KKwlmb3IgKGkgPSAweDMwMDsgIWZvdW5kICYmIGkgPCAweDM4MDsgaSs9MHg4KSB7CisJCXdhdGNoZG9nX3BvcnQgPSBmbGFzaGNvbV9jaGVja2NhcmQoaSk7CisJCWlmICh3YXRjaGRvZ19wb3J0KSB7CisJCQlmb3VuZCA9IDE7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCXByaW50aygibWl4Y29td2Q6IE5vIGNhcmQgZGV0ZWN0ZWQsIG9yIHBvcnQgbm90IGF2YWlsYWJsZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZtaXhjb213ZF9taXNjZGV2KTsKKwlpZiAocmV0KQorCXsKKwkJcmVsZWFzZV9yZWdpb24od2F0Y2hkb2dfcG9ydCwgMSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiTWl4Q09NIHdhdGNoZG9nIGRyaXZlciB2JXMsIHdhdGNoZG9nIHBvcnQgYXQgMHglM3hcbiIsVkVSU0lPTix3YXRjaGRvZ19wb3J0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWl4Y29td2RfZXhpdCh2b2lkKQoreworCWlmICghbm93YXlvdXQpIHsKKwkJaWYobWl4Y29td2RfdGltZXJfYWxpdmUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1peGNvbXdkOiBJIHF1aXQgbm93LCBoYXJkd2FyZSB3aWxsIgorCQkJICAgICAgICIgcHJvYmFibHkgcmVib290IVxuIik7CisJCQlkZWxfdGltZXIoJm1peGNvbXdkX3RpbWVyKTsKKwkJCW1peGNvbXdkX3RpbWVyX2FsaXZlPTA7CisJCX0KKwl9CisJcmVsZWFzZV9yZWdpb24od2F0Y2hkb2dfcG9ydCwxKTsKKwltaXNjX2RlcmVnaXN0ZXIoJm1peGNvbXdkX21pc2NkZXYpOworfQorCittb2R1bGVfaW5pdChtaXhjb213ZF9pbml0KTsKK21vZHVsZV9leGl0KG1peGNvbXdkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJHZXJnZWx5IE1hZGFyYXN6IDxnb3Jnb0BpdGMuaHU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1peENvbSBXYXRjaGRvZyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9tcGM4eHhfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbXBjOHh4X3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZDYyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbXBjOHh4X3dkdC5jCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogbXBjOHh4X3dkdC5jIC0gTVBDOHh4IHdhdGNoZG9nIHVzZXJzcGFjZSBpbnRlcmZhY2UKKyAqCisgKiBBdXRob3I6IEZsb3JpYW4gU2NoaXJtZXIgPGpvbHRAdHV4Ym94Lm9yZz4KKyAqCisgKiAyMDAyIChjKSBGbG9yaWFuIFNjaGlybWVyIDxqb2x0QHR1eGJveC5vcmc+IFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxhc20vOHh4X2ltbWFwLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxzeXNsaWIvbTh4eF93ZHQuaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X29wZW5lZDsKK3N0YXRpYyBpbnQgd2R0X3N0YXR1czsKKworc3RhdGljIHZvaWQgbXBjOHh4X3dkdF9oYW5kbGVyX2Rpc2FibGUodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbWFwID0gKHZvbGF0aWxlIGltbWFwX3QgKilJTUFQX0FERFI7CisKKwlpbWFwLT5pbV9zaXQuc2l0X3Bpc2NyICY9IH4oUElTQ1JfUElFIHwgUElTQ1JfUFRFKTsKKworCXByaW50ayhLRVJOX05PVElDRSAibXBjOHh4X3dkdDoga2VlcC1hbGl2ZSBoYW5kbGVyIGRlYWN0aXZhdGVkXG4iKTsKK30KKworc3RhdGljIHZvaWQgbXBjOHh4X3dkdF9oYW5kbGVyX2VuYWJsZSh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltYXAgPSAodm9sYXRpbGUgaW1tYXBfdCAqKUlNQVBfQUREUjsKKworCWltYXAtPmltX3NpdC5zaXRfcGlzY3IgfD0gUElTQ1JfUElFIHwgUElTQ1JfUFRFOworCisJcHJpbnRrKEtFUk5fTk9USUNFICJtcGM4eHhfd2R0OiBrZWVwLWFsaXZlIGhhbmRsZXIgYWN0aXZhdGVkXG4iKTsKK30KKworc3RhdGljIGludCBtcGM4eHhfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJndkdF9vcGVuZWQpKQorCQlyZXR1cm4gLUVCVVNZOworCisJbTh4eF93ZHRfcmVzZXQoKTsKKwltcGM4eHhfd2R0X2hhbmRsZXJfZGlzYWJsZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBjOHh4X3dkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCW04eHhfd2R0X3Jlc2V0KCk7CisKKyNpZiAhZGVmaW5lZChDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpCisJbXBjOHh4X3dkdF9oYW5kbGVyX2VuYWJsZSgpOworI2VuZGlmCisKKwljbGVhcl9iaXQoMCwgJndkdF9vcGVuZWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1wYzh4eF93ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sCisJCQkJbG9mZl90ICogcHBvcykKK3sKKwlpZiAocHBvcyAhPSAmZmlsZS0+Zl9wb3MpCisJCXJldHVybiAtRVNQSVBFOworCisJaWYgKGxlbikKKwkJbTh4eF93ZHRfcmVzZXQoKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgbXBjOHh4X3dkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgdGltZW91dDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaW5mbyA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDAsCisJCS5pZGVudGl0eSA9ICJNUEM4eHggd2F0Y2hkb2ciLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCWlmIChwdXRfdXNlcih3ZHRfc3RhdHVzLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl3ZHRfc3RhdHVzICY9IH5XRElPRl9LRUVQQUxJVkVQSU5HOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUVEVNUDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJbTh4eF93ZHRfcmVzZXQoKTsKKwkJd2R0X3N0YXR1cyB8PSBXRElPRl9LRUVQQUxJVkVQSU5HOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQl0aW1lb3V0ID0gbTh4eF93ZHRfZ2V0X3RpbWVvdXQoKTsKKwkJaWYgKHB1dF91c2VyKHRpbWVvdXQsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbXBjOHh4X3dkdF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBub19sbHNlZWssCisJLndyaXRlID0gbXBjOHh4X3dkdF93cml0ZSwKKwkuaW9jdGwgPSBtcGM4eHhfd2R0X2lvY3RsLAorCS5vcGVuID0gbXBjOHh4X3dkdF9vcGVuLAorCS5yZWxlYXNlID0gbXBjOHh4X3dkdF9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIG1wYzh4eF93ZHRfbWlzY2RldiA9IHsKKwkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9ICJ3YXRjaGRvZyIsCisJLmZvcHMgPSAmbXBjOHh4X3dkdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXBjOHh4X3dkdF9pbml0KHZvaWQpCit7CisJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJm1wYzh4eF93ZHRfbWlzY2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtcGM4eHhfd2R0X2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJm1wYzh4eF93ZHRfbWlzY2Rldik7CisKKwltOHh4X3dkdF9yZXNldCgpOworCW1wYzh4eF93ZHRfaGFuZGxlcl9lbmFibGUoKTsKK30KKworbW9kdWxlX2luaXQobXBjOHh4X3dkdF9pbml0KTsKK21vZHVsZV9leGl0KG1wYzh4eF93ZHRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkZsb3JpYW4gU2NoaXJtZXIgPGpvbHRAdHV4Ym94Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTVBDOHh4IHdhdGNoZG9nIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Bjd2QuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9wY3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyZGNhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9wY3dkLmMKQEAgLTAsMCArMSw5MjYgQEAKKy8qCisgKiBQQyBXYXRjaGRvZyBEcml2ZXIKKyAqIGJ5IEtlbiBIb2xsaXMgKGtob2xsaXNAYml0Z2F0ZS5jb20pCisgKgorICogUGVybWlzc2lvbiBncmFudGVkIGZyb20gU2ltb24gTWFjaGVsbCAoNzMyNDQuMTI3MEBjb21wdXNlcnZlLmNvbSkKKyAqIFdyaXR0ZW4gZm9yIHRoZSBMaW51eCBLZXJuZWwsIGFuZCBHUExlZCBieSBLZW4gSG9sbGlzCisgKgorICogOTYwMTA3CUFkZGVkIHJlcXVlc3RfcmVnaW9uIHJvdXRpbmVzLCBtb2R1bGl6ZWQgdGhlIHdob2xlIHRoaW5nLgorICogOTYwMTA4CUZpeGVkIGVuZC1vZi1maWxlIHBvaW50ZXIgKFRoYW5rcyB0byBEYW4gSG9sbGlzKSwgYWRkZWQKKyAqCQlXRF9USU1FT1VUIGRlZmluZS4KKyAqIDk2MDIxNglBZGRlZCBlb2YgbWFya2VyIG9uIHRoZSBmaWxlLCBhbmQgY2hhbmdlZCB2ZXJib3NlIG1lc3NhZ2VzLgorICogOTYwNzE2CU1hZGUgZnVuY3Rpb25hbCBhbmQgY29zbWV0aWMgY2hhbmdlcyB0byB0aGUgc291cmNlIGZvcgorICoJCWluY2x1c2lvbiBpbiBMaW51eCAyLjAueCBrZXJuZWxzLCB0aGFua3MgdG8gQWxhbiBDb3guCisgKiA5NjA3MTcJUmVtb3ZlZCByZWFkL3NlZWsgcm91dGluZXMsIHJlcGxhY2VkIHdpdGggaW9jdGwuICBBbHNvLCBhZGRlZAorICoJCWNoZWNrX3JlZ2lvbiBjb21tYW5kIGR1ZSB0byBBbGFuJ3Mgc3VnZ2VzdGlvbi4KKyAqIDk2MDgyMQlNYWRlIGNoYW5nZXMgdG8gY29tcGlsZSBpbiBuZXdlciAyLjAueCBrZXJuZWxzLiAgQWRkZWQKKyAqCQkiY29sZCByZWJvb3Qgc2Vuc2UiIGVudHJ5LgorICogOTYwODI1CU1hZGUgYSBmZXcgY2hhbmdlcyB0byBjb2RlLCBkZWxldGVkIHNvbWUgZGVmaW5lcyBhbmQgbWFkZQorICoJCXR5cGVkZWZzIHRvIHJlcGxhY2UgdGhlbS4gIE1hZGUgaGVhcnRiZWF0IHJlc2V0IG9ubHkgYXZhaWxhYmxlCisgKgkJdmlhIGlvY3RsLCBhbmQgcmVtb3ZlZCB0aGUgd3JpdGUgcm91dGluZS4KKyAqIDk2MDgyOAlBZGRlZCBuZXcgaXRlbXMgZm9yIFBDIFdhdGNoZG9nIFJldi5DIGNhcmQuCisgKiA5NjA4MjkJQ2hhbmdlZCBhcm91bmQgYWxsIG9mIHRoZSBJT0NUTHMsIGFkZGVkIG5ldyBmZWF0dXJlcywKKyAqCQlhZGRlZCB3YXRjaGRvZyBkaXNhYmxlL3JlLWVuYWJsZSByb3V0aW5lcy4gIEFkZGVkIGZpcm13YXJlCisgKgkJdmVyc2lvbiByZXBvcnRpbmcuICBBZGRlZCByZWFkIHJvdXRpbmUgZm9yIHRlbXBlcmF0dXJlLgorICoJCVJlbW92ZWQgc29tZSBleHRyYSBkZWZpbmVzLCBhZGRlZCBhbiBhdXRvZGV0ZWN0IFJldmlzaW9uCisgKgkJcm91dGluZS4KKyAqIDk2MTAwNiAgICAgICBSZXZpc2VkIHNvbWUgZG9jdW1lbnRhdGlvbiwgZml4ZWQgc29tZSBjb3NtZXRpYyBidWdzLiAgTWFkZQorICogICAgICAgICAgICAgIGRyaXZlcnMgdG8gcGFuaWMgdGhlIHN5c3RlbSBpZiBpdCdzIG92ZXJoZWF0aW5nIGF0IGJvb3R1cC4KKyAqIDk2MTExOAlDaGFuZ2VkIHNvbWUgdmVyYmlhZ2Ugb24gc29tZSBvZiB0aGUgb3V0cHV0LCB0aWRpZWQgdXAKKyAqCQljb2RlIGJpdHMsIGFuZCBhZGRlZCBjb21wYXRpYmlsaXR5IHRvIDIuMS54LgorICogOTcwOTEyICAgICAgIEVuYWJsZWQgYm9hcmQgb24gb3BlbiBhbmQgZGlzYWJsZSBvbiBjbG9zZS4KKyAqIDk3MTEwNwlUb29rIGFjY291bnQgb2YgcmVjZW50IFZGUyBjaGFuZ2VzIChicm9rZSByZWFkKS4KKyAqIDk3MTIxMCAgICAgICBEaXNhYmxlIGJvYXJkIG9uIGluaXRpYWxpc2F0aW9uIGluIGNhc2UgYm9hcmQgYWxyZWFkeSB0aWNraW5nLgorICogOTcxMjIyICAgICAgIENoYW5nZWQgb3Blbi9jbG9zZSBmb3IgdGVtcGVyYXR1cmUgaGFuZGxpbmcKKyAqICAgICAgICAgICAgICBNaWNoYWVsIE1lc2tlcyA8bWVza2VzQGRlYmlhbi5vcmc+LgorICogOTgwMTEyICAgICAgIFVzZWQgbWlub3IgbnVtYmVycyBmcm9tIGluY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCisgKiA5OTA0MDMgICAgICAgQ2xlYXIgcmVzZXQgc3RhdHVzIGFmdGVyIHJlYWRpbmcgY29udHJvbCBzdGF0dXMgcmVnaXN0ZXIgaW4KKyAqICAgICAgICAgICAgICBwY3dkX3Nob3dwcmV2c3RhdGUoKS4gW01hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPl0KKyAqIDk5MDYwNQlNYWRlIGNoYW5nZXMgdG8gY29kZSB0byBzdXBwb3J0IEZpcm13YXJlIDEuMjJhLCBhZGRlZAorICoJCWZhaXJseSB1c2VsZXNzIHByb2MgZW50cnkuCisgKiA5OTA2MTAJcmVtb3ZlZCBzYWlkIHVzZWxlc3MgcHJvYyBjb2RlIGZvciB0aGUgbWVyZ2UgPGFsYW4+CisgKiAwMDA0MDMJUmVtb3ZlZCBsYXN0IHRyYWNlcyBvZiBwcm9jIGNvZGUuIDxkYXZlaj4KKyAqIDAxMTIxNAlBZGRlZCBub3dheW91dCBtb2R1bGUgb3B0aW9uIHRvIG92ZXJyaWRlIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAgICAgICAgICAgICAgQWRkZWQgdGltZW91dCBtb2R1bGUgb3B0aW9uIHRvIG92ZXJyaWRlIGRlZmF1bHQKKyAqLworCisvKgorICoJQSBiZWxscyBhbmQgd2hpc3RsZXMgZHJpdmVyIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cucGN3ZC5kZS8KKyAqCU1vcmUgaW5mbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5iZXJrcHJvZC5jb20vIG9yIGh0dHA6Ly93d3cucGN3YXRjaGRvZy5jb20vCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBXRF9WRVIgICAgICAgICAgICAgICAgICAiMS4xNiAoMDYvMTIvMjAwNCkiCisjZGVmaW5lIFBGWAkJCSJwY3dkOiAiCisKKy8qCisgKiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBQQ1dEX1JFVklTSU9OX0Igd2FzIHJlbW92ZWQgYmVjYXVzZSBBIGFuZCBCCisgKiBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgdHlwZXMgb2YgY2FyZCwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgQgorICogaGFzIHRlbXBlcmF0dXJlIHJlcG9ydGluZy4gIFNpbmNlIEkgZGlkbid0IHJlY2VpdmUgYSBSZXYuQiBjYXJkLAorICogdGhlIFJldi5CIGNhcmQgaXMgbm90IHN1cHBvcnRlZC4gIChJdCdzIGEgZ29vZCB0aGluZyB0b28sIGFzIHRoZXkKKyAqIGFyZSBubyBsb25nZXIgaW4gcHJvZHVjdGlvbi4pCisgKi8KKyNkZWZpbmUJUENXRF9SRVZJU0lPTl9BCQkxCisjZGVmaW5lCVBDV0RfUkVWSVNJT05fQwkJMgorCisvKgorICogVGhlc2UgYXJlIHRoZSBkZWZpbmVzIHRoYXQgZGVzY3JpYmUgdGhlIGNvbnRyb2wgc3RhdHVzIGJpdHMgZm9yIHRoZQorICogUEMgV2F0Y2hkb2cgY2FyZCwgcmV2aXNpb24gQS4KKyAqLworI2RlZmluZSBXRF9XRFJTVCAgICAgICAgICAgICAgICAweDAxCS8qIFByZXZpb3VzbHkgcmVzZXQgc3RhdGUgKi8KKyNkZWZpbmUgV0RfVDExMCAgICAgICAgICAgICAgICAgMHgwMgkvKiBUZW1wZXJhdHVyZSBvdmVyaGVhdCBzZW5zZSAqLworI2RlZmluZSBXRF9IUlRCVCAgICAgICAgICAgICAgICAweDA0CS8qIEhlYXJ0YmVhdCBzZW5zZSAqLworI2RlZmluZSBXRF9STFkyICAgICAgICAgICAgICAgICAweDA4CS8qIEV4dGVybmFsIHJlbGF5IHRyaWdnZXJlZCAqLworI2RlZmluZSBXRF9TUkxZMiAgICAgICAgICAgICAgICAweDgwCS8qIFNvZnR3YXJlIGV4dGVybmFsIHJlbGF5IHRyaWdnZXJlZCAqLworCisvKgorICogVGhlc2UgYXJlIHRoZSBkZWZpbmVzIHRoYXQgZGVzY3JpYmUgdGhlIGNvbnRyb2wgc3RhdHVzIGJpdHMgZm9yIHRoZQorICogUEMgV2F0Y2hkb2cgY2FyZCwgcmV2aXNpb24gQy4KKyAqLworI2RlZmluZSBXRF9SRVZDX1dUUlAgICAgICAgICAgICAweDAxCS8qIFdhdGNoZG9nIFRyaXAgc3RhdHVzICovCisjZGVmaW5lIFdEX1JFVkNfSFJCVCAgICAgICAgICAgIDB4MDIJLyogV2F0Y2hkb2cgSGVhcnRiZWF0ICovCisjZGVmaW5lIFdEX1JFVkNfVFRSUCAgICAgICAgICAgIDB4MDQJLyogVGVtcGVyYXR1cmUgVHJpcCBzdGF0dXMgKi8KKworLyogbWF4LiB0aW1lIHdlIGdpdmUgYW4gSVNBIHdhdGNoZG9nIGNhcmQgdG8gcHJvY2VzcyBhIGNvbW1hbmQgKi8KKy8qIDUwMG1zIGZvciBlYWNoIDQgYml0IHJlc3BvbnNlIChhY2NvcmRpbmcgdG8gc3BlYy4pICovCisjZGVmaW5lIElTQV9DT01NQU5EX1RJTUVPVVQgICAgIDEwMDAKKworLyogV2F0Y2hkb2cncyBpbnRlcm5hbCBjb21tYW5kcyAqLworI2RlZmluZSBDTURfSVNBX0lETEUgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQ01EX0lTQV9WRVJTSU9OX0lOVEVHRVIgICAgICAgICAweDAxCisjZGVmaW5lIENNRF9JU0FfVkVSU0lPTl9URU5USCAgICAgICAgICAgMHgwMgorI2RlZmluZSBDTURfSVNBX1ZFUlNJT05fSFVORFJFVEggICAgICAgIDB4MDMKKyNkZWZpbmUgQ01EX0lTQV9WRVJTSU9OX01JTk9SICAgICAgICAgICAweDA0CisjZGVmaW5lIENNRF9JU0FfU1dJVENIX1NFVFRJTkdTICAgICAgICAgMHgwNQorI2RlZmluZSBDTURfSVNBX0RFTEFZX1RJTUVfMlNFQ1MgICAgICAgIDB4MEEKKyNkZWZpbmUgQ01EX0lTQV9ERUxBWV9USU1FXzRTRUNTICAgICAgICAweDBCCisjZGVmaW5lIENNRF9JU0FfREVMQVlfVElNRV84U0VDUyAgICAgICAgMHgwQworCisvKgorICogV2UgYXJlIHVzaW5nIGFuIGtlcm5lbCB0aW1lciB0byBkbyB0aGUgcGluZ2luZyBvZiB0aGUgd2F0Y2hkb2cKKyAqIGV2ZXJ5IH41MDBtcy4gV2UgdHJ5IHRvIHNldCB0aGUgaW50ZXJuYWwgaGVhcnRiZWF0IG9mIHRoZQorICogd2F0Y2hkb2cgdG8gMiBtcy4KKyAqLworCisjZGVmaW5lIFdEVF9JTlRFUlZBTCAoSFovMisxKQorCisvKiBXZSBjYW4gb25seSB1c2UgMSBjYXJkIGR1ZSB0byB0aGUgL2Rldi93YXRjaGRvZyByZXN0cmljdGlvbiAqLworc3RhdGljIGludCBjYXJkc19mb3VuZDsKKworLyogaW50ZXJuYWwgdmFyaWFibGVzICovCitzdGF0aWMgYXRvbWljX3Qgb3Blbl9hbGxvd2VkID0gQVRPTUlDX0lOSVQoMSk7CitzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X2hlYXJ0YmVhdDsKK3N0YXRpYyBpbnQgdGVtcF9wYW5pYzsKK3N0YXRpYyBpbnQgcmV2aXNpb247CQkJLyogVGhlIGNhcmQncyByZXZpc2lvbiAqLworc3RhdGljIGludCBzdXBwb3J0c190ZW1wOwkJLyogV2V0aGVyIG9yIG5vdCB0aGUgY2FyZCBoYXMgYSB0ZW1wZXJhdHVyZSBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgY29tbWFuZF9tb2RlOwkJLyogV2V0aGVyIG9yIG5vdCB0aGUgY2FyZCBpcyBpbiBjb21tYW5kIG1vZGUgKi8KK3N0YXRpYyBpbnQgaW5pdGlhbF9zdGF0dXM7CQkvKiBUaGUgY2FyZCdzIGJvb3Qgc3RhdHVzICovCitzdGF0aWMgaW50IGN1cnJlbnRfcmVhZHBvcnQ7CQkvKiBUaGUgY2FyZHMgSS9PIGFkZHJlc3MgKi8KK3N0YXRpYyBzcGlubG9ja190IGlvX2xvY2s7CisKKy8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFdBVENIRE9HX0hFQVJUQkVBVCA2MAkJLyogNjAgc2VjIGRlZmF1bHQgaGVhcnRiZWF0ICovCitzdGF0aWMgaW50IGhlYXJ0YmVhdCA9IFdBVENIRE9HX0hFQVJUQkVBVDsKK21vZHVsZV9wYXJhbShoZWFydGJlYXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhlYXJ0YmVhdCwgIldhdGNoZG9nIGhlYXJ0YmVhdCBpbiBzZWNvbmRzLiAoMjw9aGVhcnRiZWF0PD03MjAwLCBkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX0hFQVJUQkVBVCkgIikiKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qCisgKglJbnRlcm5hbCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IHNlbmRfaXNhX2NvbW1hbmQoaW50IGNtZCkKK3sKKwlpbnQgaTsKKwlpbnQgY29udHJvbF9zdGF0dXM7CisJaW50IHBvcnQwLCBsYXN0X3BvcnQwOwkvKiBEb3VibGUgcmVhZCBmb3Igc3RhYmlsaXNpbmcgKi8KKworCS8qIFRoZSBXQ01EIGJpdCBtdXN0IGJlIDEgYW5kIHRoZSBjb21tYW5kIGlzIG9ubHkgNCBiaXRzIGluIHNpemUgKi8KKwljb250cm9sX3N0YXR1cyA9IChjbWQgJiAweDBGKSB8IDB4ODA7CisJb3V0Yl9wKGNvbnRyb2xfc3RhdHVzLCBjdXJyZW50X3JlYWRwb3J0ICsgMik7CisJdWRlbGF5KElTQV9DT01NQU5EX1RJTUVPVVQpOworCisJcG9ydDAgPSBpbmJfcChjdXJyZW50X3JlYWRwb3J0KTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU7ICsraSkgeworCQlsYXN0X3BvcnQwID0gcG9ydDA7CisJCXBvcnQwID0gaW5iX3AoY3VycmVudF9yZWFkcG9ydCk7CisKKwkJaWYgKHBvcnQwID09IGxhc3RfcG9ydDApCisJCQlicmVhazsJLyogRGF0YSBpcyBzdGFibGUgKi8KKworCQl1ZGVsYXkgKDI1MCk7CisJfQorCisJcmV0dXJuIHBvcnQwOworfQorCitzdGF0aWMgaW50IHNldF9jb21tYW5kX21vZGUodm9pZCkKK3sKKwlpbnQgaSwgZm91bmQ9MCwgY291bnQ9MDsKKworCS8qIFNldCB0aGUgY2FyZCBpbnRvIGNvbW1hbmQgbW9kZSAqLworCXNwaW5fbG9jaygmaW9fbG9jayk7CisJd2hpbGUgKCghZm91bmQpICYmIChjb3VudCA8IDMpKSB7CisJCWkgPSBzZW5kX2lzYV9jb21tYW5kKENNRF9JU0FfSURMRSk7CisKKwkJaWYgKGkgPT0gMHgwMCkKKwkJCWZvdW5kID0gMTsKKwkJZWxzZSBpZiAoaSA9PSAweEYzKSB7CisJCQkvKiBDYXJkIGRvZXMgbm90IGxpa2Ugd2hhdCB3ZSd2ZSBkb25lIHRvIGl0ICovCisJCQlvdXRiX3AoMHgwMCwgY3VycmVudF9yZWFkcG9ydCArIDIpOworCQkJdWRlbGF5KDEyMDApOwkvKiBTcGVjIHNheXMgd2FpdCAxbXMgKi8KKwkJCW91dGJfcCgweDAwLCBjdXJyZW50X3JlYWRwb3J0ICsgMik7CisJCQl1ZGVsYXkoSVNBX0NPTU1BTkRfVElNRU9VVCk7CisJCX0KKwkJY291bnQrKzsKKwl9CisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworCWNvbW1hbmRfbW9kZSA9IGZvdW5kOworCisJcmV0dXJuKGZvdW5kKTsKK30KKworc3RhdGljIHZvaWQgdW5zZXRfY29tbWFuZF9tb2RlKHZvaWQpCit7CisJLyogU2V0IHRoZSBjYXJkIGludG8gbm9ybWFsIG1vZGUgKi8KKwlzcGluX2xvY2soJmlvX2xvY2spOworCW91dGJfcCgweDAwLCBjdXJyZW50X3JlYWRwb3J0ICsgMik7CisJdWRlbGF5KElTQV9DT01NQU5EX1RJTUVPVVQpOworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKKworCWNvbW1hbmRfbW9kZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHBjd2RfdGltZXJfcGluZyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJaW50IHdkcnN0X3N0YXQ7CisKKwkvKiBJZiB3ZSBnb3QgYSBoZWFydGJlYXQgcHVsc2Ugd2l0aGluIHRoZSBXRFRfSU5URVJWQUwKKwkgKiB3ZSBhZ3JlZSB0byBwaW5nIHRoZSBXRFQgKi8KKwlpZih0aW1lX2JlZm9yZShqaWZmaWVzLCBuZXh0X2hlYXJ0YmVhdCkpIHsKKwkJLyogUGluZyB0aGUgd2F0Y2hkb2cgKi8KKwkJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKwkJaWYgKHJldmlzaW9uID09IFBDV0RfUkVWSVNJT05fQSkgeworCQkJLyogIFJldiBBIGNhcmRzIGFyZSByZXNldCBieSBzZXR0aW5nIHRoZSBXRF9XRFJTVCBiaXQgaW4gcmVnaXN0ZXIgMSAqLworCQkJd2Ryc3Rfc3RhdCA9IGluYl9wKGN1cnJlbnRfcmVhZHBvcnQpOworCQkJd2Ryc3Rfc3RhdCAmPSAweDBGOworCQkJd2Ryc3Rfc3RhdCB8PSBXRF9XRFJTVDsKKworCQkJb3V0Yl9wKHdkcnN0X3N0YXQsIGN1cnJlbnRfcmVhZHBvcnQgKyAxKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFJlLXRyaWdnZXIgd2F0Y2hkb2cgYnkgd3JpdGluZyB0byBwb3J0IDAgKi8KKwkJCW91dGJfcCgweDAwLCBjdXJyZW50X3JlYWRwb3J0KTsKKwkJfQorCisJCS8qIFJlLXNldCB0aGUgdGltZXIgaW50ZXJ2YWwgKi8KKwkJbW9kX3RpbWVyKCZ0aW1lciwgamlmZmllcyArIFdEVF9JTlRFUlZBTCk7CisKKwkJc3Bpbl91bmxvY2soJmlvX2xvY2spOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJIZWFydGJlYXQgbG9zdCEgV2lsbCBub3QgcGluZyB0aGUgd2F0Y2hkb2dcbiIpOworCX0KK30KKworc3RhdGljIGludCBwY3dkX3N0YXJ0KHZvaWQpCit7CisJaW50IHN0YXRfcmVnOworCisJbmV4dF9oZWFydGJlYXQgPSBqaWZmaWVzICsgKGhlYXJ0YmVhdCAqIEhaKTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciAqLworCW1vZF90aW1lcigmdGltZXIsIGppZmZpZXMgKyBXRFRfSU5URVJWQUwpOworCisJLyogRW5hYmxlIHRoZSBwb3J0ICovCisJaWYgKHJldmlzaW9uID09IFBDV0RfUkVWSVNJT05fQykgeworCQlzcGluX2xvY2soJmlvX2xvY2spOworCQlvdXRiX3AoMHgwMCwgY3VycmVudF9yZWFkcG9ydCArIDMpOworCQl1ZGVsYXkoSVNBX0NPTU1BTkRfVElNRU9VVCk7CisJCXN0YXRfcmVnID0gaW5iX3AoY3VycmVudF9yZWFkcG9ydCArIDIpOworCQlzcGluX3VubG9jaygmaW9fbG9jayk7CisJCWlmIChzdGF0X3JlZyAmIDB4MTApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJDb3VsZCBub3Qgc3RhcnQgd2F0Y2hkb2dcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGN3ZF9zdG9wKHZvaWQpCit7CisJaW50IHN0YXRfcmVnOworCisJLyogU3RvcCB0aGUgdGltZXIgKi8KKwlkZWxfdGltZXIoJnRpbWVyKTsKKworCS8qICBEaXNhYmxlIHRoZSBib2FyZCAgKi8KKwlpZiAocmV2aXNpb24gPT0gUENXRF9SRVZJU0lPTl9DKSB7CisJCXNwaW5fbG9jaygmaW9fbG9jayk7CisJCW91dGJfcCgweEE1LCBjdXJyZW50X3JlYWRwb3J0ICsgMyk7CisJCXVkZWxheShJU0FfQ09NTUFORF9USU1FT1VUKTsKKwkJb3V0Yl9wKDB4QTUsIGN1cnJlbnRfcmVhZHBvcnQgKyAzKTsKKwkJdWRlbGF5KElTQV9DT01NQU5EX1RJTUVPVVQpOworCQlzdGF0X3JlZyA9IGluYl9wKGN1cnJlbnRfcmVhZHBvcnQgKyAyKTsKKwkJc3Bpbl91bmxvY2soJmlvX2xvY2spOworCQlpZiAoKHN0YXRfcmVnICYgMHgxMCkgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkNvdWxkIG5vdCBzdG9wIHdhdGNoZG9nXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjd2Rfa2VlcGFsaXZlKHZvaWQpCit7CisJLyogdXNlciBsYW5kIHBpbmcgKi8KKwluZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyAoaGVhcnRiZWF0ICogSFopOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjd2Rfc2V0X2hlYXJ0YmVhdChpbnQgdCkKK3sKKwlpZiAoKHQgPCAyKSB8fCAodCA+IDcyMDApKSAvKiBhcmJpdHJhcnkgdXBwZXIgbGltaXQgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwloZWFydGJlYXQgPSB0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjd2RfZ2V0X3N0YXR1cyhpbnQgKnN0YXR1cykKK3sKKwlpbnQgY2FyZF9zdGF0dXM7CisKKwkqc3RhdHVzPTA7CisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKwlpZiAocmV2aXNpb24gPT0gUENXRF9SRVZJU0lPTl9BKQorCQkvKiBSZXYgQSBjYXJkcyByZXR1cm4gc3RhdHVzIGluZm9ybWF0aW9uIGZyb20KKwkJICogdGhlIGJhc2UgcmVnaXN0ZXIsIHdoaWNoIGlzIHVzZWQgZm9yIHRoZQorCQkgKiB0ZW1wZXJhdHVyZSBpbiBvdGhlciBjYXJkcy4gKi8KKwkJY2FyZF9zdGF0dXMgPSBpbmIoY3VycmVudF9yZWFkcG9ydCk7CisJZWxzZSB7CisJCS8qIFJldiBDIGNhcmRzIHJldHVybiBjYXJkIHN0YXR1cyBpbiB0aGUgYmFzZQorCQkgKiBhZGRyZXNzICsgMSByZWdpc3Rlci4gQW5kIHVzZSBkaWZmZXJlbnQgYml0cworCQkgKiB0byBpbmRpY2F0ZSBhIGNhcmQgaW5pdGlhdGVkIHJlc2V0LCBhbmQgYW4KKwkJICogb3Zlci10ZW1wZXJhdHVyZSBjb25kaXRpb24uIEFuZCB0aGUgcmVib290CisJCSAqIHN0YXR1cyBjYW4gYmUgcmVzZXQuICovCisJCWNhcmRfc3RhdHVzID0gaW5iKGN1cnJlbnRfcmVhZHBvcnQgKyAxKTsKKwl9CisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworCisJaWYgKHJldmlzaW9uID09IFBDV0RfUkVWSVNJT05fQSkgeworCQlpZiAoY2FyZF9zdGF0dXMgJiBXRF9XRFJTVCkKKwkJCSpzdGF0dXMgfD0gV0RJT0ZfQ0FSRFJFU0VUOworCisJCWlmIChjYXJkX3N0YXR1cyAmIFdEX1QxMTApIHsKKwkJCSpzdGF0dXMgfD0gV0RJT0ZfT1ZFUkhFQVQ7CisJCQlpZiAodGVtcF9wYW5pYykgeworCQkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVGVtcGVyYXR1cmUgb3ZlcmhlYXQgdHJpcCFcbiIpOworCQkJCW1hY2hpbmVfcG93ZXJfb2ZmKCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY2FyZF9zdGF0dXMgJiBXRF9SRVZDX1dUUlApCisJCQkqc3RhdHVzIHw9IFdESU9GX0NBUkRSRVNFVDsKKworCQlpZiAoY2FyZF9zdGF0dXMgJiBXRF9SRVZDX1RUUlApIHsKKwkJCSpzdGF0dXMgfD0gV0RJT0ZfT1ZFUkhFQVQ7CisJCQlpZiAodGVtcF9wYW5pYykgeworCQkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVGVtcGVyYXR1cmUgb3ZlcmhlYXQgdHJpcCFcbiIpOworCQkJCW1hY2hpbmVfcG93ZXJfb2ZmKCk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY3dkX2NsZWFyX3N0YXR1cyh2b2lkKQoreworCWlmIChyZXZpc2lvbiA9PSBQQ1dEX1JFVklTSU9OX0MpIHsKKwkJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKwkJb3V0Yl9wKDB4MDAsIGN1cnJlbnRfcmVhZHBvcnQgKyAxKTsgLyogY2xlYXIgcmVzZXQgc3RhdHVzICovCisJCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGN3ZF9nZXRfdGVtcGVyYXR1cmUoaW50ICp0ZW1wZXJhdHVyZSkKK3sKKwkvKiBjaGVjayB0aGF0IHBvcnQgMCBnaXZlcyB0ZW1wZXJhdHVyZSBpbmZvIGFuZCBubyBjb21tYW5kIHJlc3VsdHMgKi8KKwlpZiAoY29tbWFuZF9tb2RlKQorCQlyZXR1cm4gLTE7CisKKwkqdGVtcGVyYXR1cmUgPSAwOworCWlmICghc3VwcG9ydHNfdGVtcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIENvbnZlcnQgY2Vsc2l1cyB0byBmYWhyZW5oZWl0LCBzaW5jZSB0aGlzIHdhcworCSAqIHRoZSBkZWNpZGVkICdzdGFuZGFyZCcgZm9yIHRoaXMgcmV0dXJuIHZhbHVlLgorCSAqLworCXNwaW5fbG9jaygmaW9fbG9jayk7CisJKnRlbXBlcmF0dXJlID0gKChpbmIoY3VycmVudF9yZWFkcG9ydCkpICogOSAvIDUpICsgMzI7CisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgkvZGV2L3dhdGNoZG9nIGhhbmRsaW5nCisgKi8KKworc3RhdGljIGludCBwY3dkX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcnY7CisJaW50IHN0YXR1czsKKwlpbnQgdGVtcGVyYXR1cmU7CisJaW50IG5ld19oZWFydGJlYXQ7CisJaW50IF9fdXNlciAqYXJncCA9IChpbnQgX191c2VyICopYXJnOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPQkJV0RJT0ZfT1ZFUkhFQVQgfAorCQkJCQlXRElPRl9DQVJEUkVTRVQgfAorCQkJCQlXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCQkJV0RJT0ZfU0VUVElNRU9VVCB8CisJCQkJCVdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0JMSwKKwkJLmlkZW50aXR5ID0JCSJQQ1dEIiwKKwl9OworCisJc3dpdGNoKGNtZCkgeworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCXBjd2RfZ2V0X3N0YXR1cygmc3RhdHVzKTsKKwkJcmV0dXJuIHB1dF91c2VyKHN0YXR1cywgYXJncCk7CisKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldHVybiBwdXRfdXNlcihpbml0aWFsX3N0YXR1cywgYXJncCk7CisKKwljYXNlIFdESU9DX0dFVFRFTVA6CisJCWlmIChwY3dkX2dldF90ZW1wZXJhdHVyZSgmdGVtcGVyYXR1cmUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIHB1dF91c2VyKHRlbXBlcmF0dXJlLCBhcmdwKTsKKworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJaWYgKHJldmlzaW9uID09IFBDV0RfUkVWSVNJT05fQykKKwkJeworCQkJaWYoY29weV9mcm9tX3VzZXIoJnJ2LCBhcmdwLCBzaXplb2YoaW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChydiAmIFdESU9TX0RJU0FCTEVDQVJEKQorCQkJeworCQkJCXJldHVybiBwY3dkX3N0b3AoKTsKKwkJCX0KKworCQkJaWYgKHJ2ICYgV0RJT1NfRU5BQkxFQ0FSRCkKKwkJCXsKKwkJCQlyZXR1cm4gcGN3ZF9zdGFydCgpOworCQkJfQorCisJCQlpZiAocnYgJiBXRElPU19URU1QUEFOSUMpCisJCQl7CisJCQkJdGVtcF9wYW5pYyA9IDE7CisJCQl9CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJcGN3ZF9rZWVwYWxpdmUoKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWlmIChnZXRfdXNlcihuZXdfaGVhcnRiZWF0LCBhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChwY3dkX3NldF9oZWFydGJlYXQobmV3X2hlYXJ0YmVhdCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwY3dkX2tlZXBhbGl2ZSgpOworCQkvKiBGYWxsICovCisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldHVybiBwdXRfdXNlcihoZWFydGJlYXQsIGFyZ3ApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBwY3dkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLAorCQkJICBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGxlbikgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogSW4gY2FzZSBpdCB3YXMgc2V0IGxvbmcgYWdvICovCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCQkJY2hhciBjOworCisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCXBjd2Rfa2VlcGFsaXZlKCk7CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgcGN3ZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmb3Blbl9hbGxvd2VkKSApIHsKKwkJYXRvbWljX2luYyggJm9wZW5fYWxsb3dlZCApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChub3dheW91dCkKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKworCS8qIEFjdGl2YXRlICovCisJcGN3ZF9zdGFydCgpOworCXBjd2Rfa2VlcGFsaXZlKCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHBjd2RfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgeworCQlwY3dkX3N0b3AoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCXBjd2Rfa2VlcGFsaXZlKCk7CisJfQorCWV4cGVjdF9jbG9zZSA9IDA7CisJYXRvbWljX2luYyggJm9wZW5fYWxsb3dlZCApOworCXJldHVybiAwOworfQorCisvKgorICoJL2Rldi90ZW1wZXJhdHVyZSBoYW5kbGluZworICovCisKK3N0YXRpYyBzc2l6ZV90IHBjd2RfdGVtcF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkgbG9mZl90ICpwcG9zKQoreworCWludCB0ZW1wZXJhdHVyZTsKKworCWlmIChwY3dkX2dldF90ZW1wZXJhdHVyZSgmdGVtcGVyYXR1cmUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmdGVtcGVyYXR1cmUsIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBjd2RfdGVtcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICghc3VwcG9ydHNfdGVtcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgcGN3ZF90ZW1wX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCisvKgorICoJTm90aWZ5IHN5c3RlbQorICovCisKK3N0YXRpYyBpbnQgcGN3ZF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGU9PVNZU19ET1dOIHx8IGNvZGU9PVNZU19IQUxUKSB7CisJCS8qIFR1cm4gdGhlIFdEVCBvZmYgKi8KKwkJcGN3ZF9zdG9wKCk7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJS2VybmVsIEludGVyZmFjZXMKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwY3dkX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBwY3dkX3dyaXRlLAorCS5pb2N0bAkJPSBwY3dkX2lvY3RsLAorCS5vcGVuCQk9IHBjd2Rfb3BlbiwKKwkucmVsZWFzZQk9IHBjd2RfY2xvc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgcGN3ZF9taXNjZGV2ID0geworCS5taW5vciA9CVdBVENIRE9HX01JTk9SLAorCS5uYW1lID0JCSJ3YXRjaGRvZyIsCisJLmZvcHMgPQkJJnBjd2RfZm9wcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBjd2RfdGVtcF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBwY3dkX3RlbXBfcmVhZCwKKwkub3BlbgkJPSBwY3dkX3RlbXBfb3BlbiwKKwkucmVsZWFzZQk9IHBjd2RfdGVtcF9jbG9zZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB0ZW1wX21pc2NkZXYgPSB7CisJLm1pbm9yID0JVEVNUF9NSU5PUiwKKwkubmFtZSA9CQkidGVtcGVyYXR1cmUiLAorCS5mb3BzID0JCSZwY3dkX3RlbXBfZm9wcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGN3ZF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9CXBjd2Rfbm90aWZ5X3N5cywKK307CisKKy8qCisgKglJbml0ICYgZXhpdCByb3V0aW5lcworICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfc3VwcG9ydCh2b2lkKQoreworCWlmIChpbmIoY3VycmVudF9yZWFkcG9ydCkgIT0gMHhGMCkKKwkJc3VwcG9ydHNfdGVtcCA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9yZXZpc2lvbih2b2lkKQoreworCWludCByID0gUENXRF9SRVZJU0lPTl9DOworCisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKwkvKiBSRVYgQSBjYXJkcyB1c2Ugb25seSAyIGlvIHBvcnRzOyB0ZXN0CisJICogcHJlc3VtZXMgYSBmbG9hdGluZyBidXMgcmVhZHMgYXMgMHhmZi4gKi8KKwlpZiAoKGluYihjdXJyZW50X3JlYWRwb3J0ICsgMikgPT0gMHhGRikgfHwKKwkgICAgKGluYihjdXJyZW50X3JlYWRwb3J0ICsgMykgPT0gMHhGRikpCisJCXI9UENXRF9SRVZJU0lPTl9BOworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKmdldF9maXJtd2FyZSh2b2lkKQoreworCWludCBvbmUsIHRlbiwgaHVuZCwgbWlub3I7CisJY2hhciAqcmV0OworCisJcmV0ID0ga21hbGxvYyg2LCBHRlBfS0VSTkVMKTsKKwlpZihyZXQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoc2V0X2NvbW1hbmRfbW9kZSgpKSB7CisJCW9uZSA9IHNlbmRfaXNhX2NvbW1hbmQoQ01EX0lTQV9WRVJTSU9OX0lOVEVHRVIpOworCQl0ZW4gPSBzZW5kX2lzYV9jb21tYW5kKENNRF9JU0FfVkVSU0lPTl9URU5USCk7CisJCWh1bmQgPSBzZW5kX2lzYV9jb21tYW5kKENNRF9JU0FfVkVSU0lPTl9IVU5EUkVUSCk7CisJCW1pbm9yID0gc2VuZF9pc2FfY29tbWFuZChDTURfSVNBX1ZFUlNJT05fTUlOT1IpOworCQlzcHJpbnRmKHJldCwgIiVjLiVjJWMlYyIsIG9uZSwgdGVuLCBodW5kLCBtaW5vcik7CisJfQorCWVsc2UKKwkJc3ByaW50ZihyZXQsICJFUlJPUiIpOworCisJdW5zZXRfY29tbWFuZF9tb2RlKCk7CisJcmV0dXJuKHJldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9vcHRpb25fc3dpdGNoZXModm9pZCkKK3sKKwlpbnQgcnY9MDsKKworCWlmIChzZXRfY29tbWFuZF9tb2RlKCkpIHsKKwkJLyogR2V0IHN3aXRjaCBzZXR0aW5ncyAqLworCQlydiA9IHNlbmRfaXNhX2NvbW1hbmQoQ01EX0lTQV9TV0lUQ0hfU0VUVElOR1MpOworCX0KKworCXVuc2V0X2NvbW1hbmRfbW9kZSgpOworCXJldHVybihydik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjd2F0Y2hkb2dfaW5pdChpbnQgYmFzZV9hZGRyKQoreworCWludCByZXQ7CisJY2hhciAqZmlybXdhcmU7CisJaW50IG9wdGlvbl9zd2l0Y2hlczsKKworCWNhcmRzX2ZvdW5kKys7CisJaWYgKGNhcmRzX2ZvdW5kID09IDEpCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJ2JXMgS2VuIEhvbGxpcyAoa2VuamlAYml0Z2F0ZS5jb20pXG4iLCBXRF9WRVIpOworCisJaWYgKGNhcmRzX2ZvdW5kID4gMSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJUaGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIDEgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGJhc2VfYWRkciA9PSAweDAwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gSS9PLUFkZHJlc3MgZm9yIGNhcmQgZGV0ZWN0ZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJY3VycmVudF9yZWFkcG9ydCA9IGJhc2VfYWRkcjsKKworCS8qIENoZWNrIGNhcmQncyByZXZpc2lvbiAqLworCXJldmlzaW9uID0gZ2V0X3JldmlzaW9uKCk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGN1cnJlbnRfcmVhZHBvcnQsIChyZXZpc2lvbiA9PSBQQ1dEX1JFVklTSU9OX0EpID8gMiA6IDQsICJQQ1dEIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAorCQkJY3VycmVudF9yZWFkcG9ydCk7CisJCWN1cnJlbnRfcmVhZHBvcnQgPSAweDAwMDA7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIEluaXRpYWwgdmFyaWFibGVzICovCisJc3VwcG9ydHNfdGVtcCA9IDA7CisJdGVtcF9wYW5pYyA9IDA7CisJaW5pdGlhbF9zdGF0dXMgPSAweDAwMDA7CisKKwkvKiBnZXQgdGhlIGJvb3Rfc3RhdHVzICovCisJcGN3ZF9nZXRfc3RhdHVzKCZpbml0aWFsX3N0YXR1cyk7CisKKwkvKiBjbGVhciB0aGUgImNhcmQgY2F1c2VkIHJlYm9vdCIgZmxhZyAqLworCXBjd2RfY2xlYXJfc3RhdHVzKCk7CisKKwlpbml0X3RpbWVyKCZ0aW1lcik7CisJdGltZXIuZnVuY3Rpb24gPSBwY3dkX3RpbWVyX3Bpbmc7CisJdGltZXIuZGF0YSA9IDA7CisKKwkvKiAgRGlzYWJsZSB0aGUgYm9hcmQgICovCisJcGN3ZF9zdG9wKCk7CisKKwkvKiAgQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIGNhcmQgc3VwcG9ydHMgdGhlIHRlbXBlcmF0dXJlIGRldmljZSAqLworCWdldF9zdXBwb3J0KCk7CisKKwkvKiBHZXQgc29tZSBleHRyYSBpbmZvIGZyb20gdGhlIGhhcmR3YXJlIChpbiBjb21tYW5kL2RlYnVnL2RpYWcgbW9kZSkgKi8KKwlpZiAocmV2aXNpb24gPT0gUENXRF9SRVZJU0lPTl9BKQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiSVNBLVBDIFdhdGNoZG9nIChSRVYuQSkgZGV0ZWN0ZWQgYXQgcG9ydCAweCUwNHhcbiIsIGN1cnJlbnRfcmVhZHBvcnQpOworCWVsc2UgaWYgKHJldmlzaW9uID09IFBDV0RfUkVWSVNJT05fQykgeworCQlmaXJtd2FyZSA9IGdldF9maXJtd2FyZSgpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiSVNBLVBDIFdhdGNoZG9nIChSRVYuQykgZGV0ZWN0ZWQgYXQgcG9ydCAweCUwNHggKEZpcm13YXJlIHZlcnNpb246ICVzKVxuIiwKKwkJCWN1cnJlbnRfcmVhZHBvcnQsIGZpcm13YXJlKTsKKwkJa2ZyZWUoZmlybXdhcmUpOworCQlvcHRpb25fc3dpdGNoZXMgPSBnZXRfb3B0aW9uX3N3aXRjaGVzKCk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJPcHRpb24gc3dpdGNoZXMgKDB4JTAyeCk6IFRlbXBlcmF0dXJlIFJlc2V0IEVuYWJsZT0lcywgUG93ZXIgT24gRGVsYXk9JXNcbiIsCisJCQlvcHRpb25fc3dpdGNoZXMsCisJCQkoKG9wdGlvbl9zd2l0Y2hlcyAmIDB4MTApID8gIk9OIiA6ICJPRkYiKSwKKwkJCSgob3B0aW9uX3N3aXRjaGVzICYgMHgwOCkgPyAiT04iIDogIk9GRiIpKTsKKworCQkvKiBSZXByb2dyYW0gaW50ZXJuYWwgaGVhcnRiZWF0IHRvIDIgc2Vjb25kcyAqLworCQlpZiAoc2V0X2NvbW1hbmRfbW9kZSgpKSB7CisJCQlzZW5kX2lzYV9jb21tYW5kKENNRF9JU0FfREVMQVlfVElNRV8yU0VDUyk7CisJCQl1bnNldF9jb21tYW5kX21vZGUoKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNob3VsZCBORVZFUiBoYXBwZW4sIHVubGVzcyBnZXRfcmV2aXNpb24oKSBmYWlscy4gKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlVuYWJsZSB0byBnZXQgcmV2aXNpb25cbiIpOworCQlyZWxlYXNlX3JlZ2lvbihjdXJyZW50X3JlYWRwb3J0LCAocmV2aXNpb24gPT0gUENXRF9SRVZJU0lPTl9BKSA/IDIgOiA0KTsKKwkJY3VycmVudF9yZWFkcG9ydCA9IDB4MDAwMDsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChzdXBwb3J0c190ZW1wKQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiVGVtcGVyYXR1cmUgT3B0aW9uIERldGVjdGVkXG4iKTsKKworCWlmIChpbml0aWFsX3N0YXR1cyAmIFdESU9GX0NBUkRSRVNFVCkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlByZXZpb3VzIHJlYm9vdCB3YXMgY2F1c2VkIGJ5IHRoZSBjYXJkXG4iKTsKKworCWlmIChpbml0aWFsX3N0YXR1cyAmIFdESU9GX09WRVJIRUFUKSB7CisJCXByaW50ayhLRVJOX0VNRVJHIFBGWCAiQ2FyZCBzZW5zZXMgYSBDUFUgT3ZlcmhlYXQuIFBhbmlja2luZyFcbiIpOworCQlwcmludGsoS0VSTl9FTUVSRyBQRlggIkNQVSBPdmVyaGVhdFxuIik7CisJfQorCisJaWYgKGluaXRpYWxfc3RhdHVzID09IDApCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJObyBwcmV2aW91cyB0cmlwIGRldGVjdGVkIC0gQ29sZCBib290IG9yIHJlc2V0XG4iKTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGhlYXJ0YmVhdCB2YWx1ZSBpcyB3aXRoaW4gaXQncyByYW5nZSA7IGlmIG5vdCByZXNldCB0byB0aGUgZGVmYXVsdCAqLworICAgICAgICBpZiAocGN3ZF9zZXRfaGVhcnRiZWF0KGhlYXJ0YmVhdCkpIHsKKyAgICAgICAgICAgICAgICBwY3dkX3NldF9oZWFydGJlYXQoV0FUQ0hET0dfSEVBUlRCRUFUKTsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPIFBGWCAiaGVhcnRiZWF0IHZhbHVlIG11c3QgYmUgMjw9aGVhcnRiZWF0PD03MjAwLCB1c2luZyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdBVENIRE9HX0hFQVJUQkVBVCk7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwY3dkX25vdGlmaWVyKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCisJCQlyZXQpOworCQlyZWxlYXNlX3JlZ2lvbihjdXJyZW50X3JlYWRwb3J0LCAocmV2aXNpb24gPT0gUENXRF9SRVZJU0lPTl9BKSA/IDIgOiA0KTsKKwkJY3VycmVudF9yZWFkcG9ydCA9IDB4MDAwMDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoc3VwcG9ydHNfdGVtcCkgeworCQlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ0ZW1wX21pc2NkZXYpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCQlURU1QX01JTk9SLCByZXQpOworCQkJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBjd2Rfbm90aWZpZXIpOworCQkJcmVsZWFzZV9yZWdpb24oY3VycmVudF9yZWFkcG9ydCwgKHJldmlzaW9uID09IFBDV0RfUkVWSVNJT05fQSkgPyAyIDogNCk7CisJCQljdXJyZW50X3JlYWRwb3J0ID0gMHgwMDAwOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnBjd2RfbWlzY2Rldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQlpZiAoc3VwcG9ydHNfdGVtcCkKKwkJCW1pc2NfZGVyZWdpc3RlcigmdGVtcF9taXNjZGV2KTsKKwkJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBjd2Rfbm90aWZpZXIpOworCQlyZWxlYXNlX3JlZ2lvbihjdXJyZW50X3JlYWRwb3J0LCAocmV2aXNpb24gPT0gUENXRF9SRVZJU0lPTl9BKSA/IDIgOiA0KTsKKwkJY3VycmVudF9yZWFkcG9ydCA9IDB4MDAwMDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIGhlYXJ0YmVhdD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKKwkJaGVhcnRiZWF0LCBub3dheW91dCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHBjd2F0Y2hkb2dfZXhpdCh2b2lkKQoreworCS8qICBEaXNhYmxlIHRoZSBib2FyZCAgKi8KKwlpZiAoIW5vd2F5b3V0KQorCQlwY3dkX3N0b3AoKTsKKworCS8qIERlcmVnaXN0ZXIgKi8KKwltaXNjX2RlcmVnaXN0ZXIoJnBjd2RfbWlzY2Rldik7CisJaWYgKHN1cHBvcnRzX3RlbXApCisJCW1pc2NfZGVyZWdpc3RlcigmdGVtcF9taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGN3ZF9ub3RpZmllcik7CisJcmVsZWFzZV9yZWdpb24oY3VycmVudF9yZWFkcG9ydCwgKHJldmlzaW9uID09IFBDV0RfUkVWSVNJT05fQSkgPyAyIDogNCk7CisJY3VycmVudF9yZWFkcG9ydCA9IDB4MDAwMDsKK30KKworLyoKKyAqICBUaGUgSVNBIGNhcmRzIGhhdmUgYSBoZWFydGJlYXQgYml0IGluIG9uZSBvZiB0aGUgcmVnaXN0ZXJzLCB3aGljaAorICogIHJlZ2lzdGVyIGlzIGNhcmQgZGVwZW5kZW50LiAgVGhlIGhlYXJ0YmVhdCBiaXQgaXMgbW9uaXRvcmVkLCBhbmQgaWYKKyAqICBmb3VuZCwgaXMgY29uc2lkZXJlZCBwcm9vZiB0aGF0IGEgQmVya3NoaXJlIGNhcmQgaGFzIGJlZW4gZm91bmQuCisgKiAgVGhlIGluaXRpYWwgcmF0ZSBpcyBvbmNlIHBlciBzZWNvbmQgYXQgYm9hcmQgc3RhcnQgdXAsIHRoZW4gdHdpY2UKKyAqICBwZXIgc2Vjb25kIGZvciBub3JtYWwgb3BlcmF0aW9uLgorICovCitzdGF0aWMgaW50IF9faW5pdCBwY3dkX2NoZWNrY2FyZChpbnQgYmFzZV9hZGRyKQoreworCWludCBwb3J0MCwgbGFzdF9wb3J0MDsJLyogUmVnIDAsIGluIGNhc2UgaXQncyBSRVYgQSAqLworCWludCBwb3J0MSwgbGFzdF9wb3J0MTsJLyogUmVnaXN0ZXIgMSBmb3IgUkVWIEMgY2FyZHMgKi8KKwlpbnQgaTsKKwlpbnQgcmV0dmFsOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbiAoYmFzZV9hZGRyLCA0LCAiUENXRCIpKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiUG9ydCAweCUwNHggdW5hdmFpbGFibGVcbiIsIGJhc2VfYWRkcik7CisJCXJldHVybiAwOworCX0KKworCXJldHZhbCA9IDA7CisKKwlwb3J0MCA9IGluYl9wKGJhc2VfYWRkcik7CS8qIEZvciBSRVYgQSBib2FyZHMgKi8KKwlwb3J0MSA9IGluYl9wKGJhc2VfYWRkciArIDEpOwkvKiBGb3IgUkVWIEMgYm9hcmRzICovCisJaWYgKHBvcnQwICE9IDB4ZmYgfHwgcG9ydDEgIT0gMHhmZikgeworCQkvKiBOb3QgYW4gJ2ZmJyBmcm9tIGEgZmxvYXRpbmcgYnVzLCBzbyBtdXN0IGJlIGEgY2FyZCEgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCisJCQltc2xlZXAoNTAwKTsKKworCQkJbGFzdF9wb3J0MCA9IHBvcnQwOworCQkJbGFzdF9wb3J0MSA9IHBvcnQxOworCisJCQlwb3J0MCA9IGluYl9wKGJhc2VfYWRkcik7CisJCQlwb3J0MSA9IGluYl9wKGJhc2VfYWRkciArIDEpOworCisJCQkvKiBIYXMgZWl0aGVyIGhlYXJiZWF0IGJpdCBjaGFuZ2VkPyAgKi8KKwkJCWlmICgocG9ydDAgXiBsYXN0X3BvcnQwKSAmIFdEX0hSVEJUIHx8CisJCQkgICAgKHBvcnQxIF4gbGFzdF9wb3J0MSkgJiBXRF9SRVZDX0hSQlQpIHsKKwkJCQlyZXR2YWwgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJlbGVhc2VfcmVnaW9uIChiYXNlX2FkZHIsIDQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgYXV0by1wcm9iZSBhZGRyZXNzZXMgYXZhaWxhYmxlLgorICoKKyAqIFJldmlzaW9uIEEgb25seSB1c2VzIHBvcnRzIDB4MjcwIGFuZCAweDM3MC4gIFJldmlzaW9uIEMgaW50cm9kdWNlZCAweDM1MC4KKyAqIFJldmlzaW9uIEEgaGFzIGFuIGFkZHJlc3MgcmFuZ2Ugb2YgMiBhZGRyZXNzZXMsIHdoaWxlIFJldmlzaW9uIEMgaGFzIDQuCisgKi8KK3N0YXRpYyBpbnQgcGN3ZF9pb3BvcnRzW10gPSB7IDB4MjcwLCAweDM1MCwgMHgzNzAsIDB4MDAwIH07CisKK3N0YXRpYyBpbnQgX19pbml0IHBjd2RfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaSwgZm91bmQgPSAwOworCisJc3Bpbl9sb2NrX2luaXQoJmlvX2xvY2spOworCisJZm9yIChpID0gMDsgcGN3ZF9pb3BvcnRzW2ldICE9IDA7IGkrKykgeworCQlpZiAocGN3ZF9jaGVja2NhcmQocGN3ZF9pb3BvcnRzW2ldKSkgeworCQkJaWYgKCEocGN3YXRjaGRvZ19pbml0KHBjd2RfaW9wb3J0c1tpXSkpKQorCQkJCWZvdW5kKys7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiTm8gY2FyZCBkZXRlY3RlZCwgb3IgcG9ydCBub3QgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwY3dkX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaWYgKGN1cnJlbnRfcmVhZHBvcnQpCisJCXBjd2F0Y2hkb2dfZXhpdCgpOworCXJldHVybjsKK30KKworbW9kdWxlX2luaXQocGN3ZF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChwY3dkX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiS2VuIEhvbGxpcyA8a2VuamlAYml0Z2F0ZS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJlcmtzaGlyZSBJU0EtUEMgV2F0Y2hkb2cgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihURU1QX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9wY3dkX3BjaS5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Bjd2RfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlMDY2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9wY3dkX3BjaS5jCkBAIC0wLDAgKzEsNjc3IEBACisvKgorICoJQmVya3NoaXJlIFBDSS1QQyBXYXRjaGRvZyBDYXJkIERyaXZlcgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMyBXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPi4KKyAqCisgKglCYXNlZCBvbiBzb3VyY2UgY29kZSBvZiB0aGUgZm9sbG93aW5nIGF1dGhvcnM6CisgKgkgIEtlbiBIb2xsaXMgPGtlbmppQGJpdGdhdGUuY29tPiwKKyAqCSAgTGluZHNheSBIYXJyaXMgPGxpbmRzYXlAYmx1ZWd1bS5jb20+LAorICoJICBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwKKyAqCSAgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPiwKKyAqCSAgUm9iIFJhZGV6IDxyb2JAb3NpbnZlc3Rvci5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIFdpbSBWYW4gU2Vicm9lY2sgbm9yIElndWFuYSB2encuIGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqCXByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCisgKglwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKi8KKworLyoKKyAqCUEgYmVsbHMgYW5kIHdoaXN0bGVzIGRyaXZlciBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LnBjd2QuZGUvCisgKglNb3JlIGluZm8gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYmVya3Byb2QuY29tLyBvciBodHRwOi8vd3d3LnBjd2F0Y2hkb2cuY29tLworICovCisKKy8qCisgKglJbmNsdWRlcywgZGVmaW5lcywgdmFyaWFibGVzLCBtb2R1bGUgcGFyYW1ldGVycywgLi4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIE1vZHVsZSBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBXQVRDSERPR19WRVJTSU9OICIxLjAxIgorI2RlZmluZSBXQVRDSERPR19EQVRFICIxNSBNYXIgMjAwNSIKKyNkZWZpbmUgV0FUQ0hET0dfRFJJVkVSX05BTUUgIlBDSS1QQyBXYXRjaGRvZyIKKyNkZWZpbmUgV0FUQ0hET0dfTkFNRSAicGN3ZF9wY2kiCisjZGVmaW5lIFBGWCBXQVRDSERPR19OQU1FICI6ICIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gV0FUQ0hET0dfRFJJVkVSX05BTUUgIiBkcml2ZXIsIHYiIFdBVENIRE9HX1ZFUlNJT04gIiAoIiBXQVRDSERPR19EQVRFICIpXG4iCisKKy8qIFN0dWZmIGZvciB0aGUgUENJIElEJ3MgICovCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfUVVJQ0tMT0dJQworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1FVSUNLTE9HSUMgICAgMHgxMWUzCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1dBVENIRE9HX1BDSVBDV0QKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9XQVRDSERPR19QQ0lQQ1dEIDB4NTAzMAorI2VuZGlmCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRlZmluZXMgdGhhdCBkZXNjcmliZSB0aGUgY29udHJvbCBzdGF0dXMgYml0cyBmb3IgdGhlCisgKiBQQ0ktUEMgV2F0Y2hkb2cgY2FyZC4KKyAqLworI2RlZmluZSBXRF9QQ0lfV1RSUCAgICAgICAgICAgICAweDAxCS8qIFdhdGNoZG9nIFRyaXAgc3RhdHVzICovCisjZGVmaW5lIFdEX1BDSV9IUkJUICAgICAgICAgICAgIDB4MDIJLyogV2F0Y2hkb2cgSGVhcnRiZWF0ICovCisjZGVmaW5lIFdEX1BDSV9UVFJQICAgICAgICAgICAgIDB4MDQJLyogVGVtcGVyYXR1cmUgVHJpcCBzdGF0dXMgKi8KKworLyogYWNjb3JkaW5nIHRvIGRvY3VtZW50YXRpb24gbWF4LiB0aW1lIHRvIHByb2Nlc3MgYSBjb21tYW5kIGZvciB0aGUgcGNpCisgKiB3YXRjaGRvZyBjYXJkIGlzIDEwMCBtcywgc28gd2UgZ2l2ZSBpdCAxNTAgbXMgdG8gZG8gaXQncyBqb2IgKi8KKyNkZWZpbmUgUENJX0NPTU1BTkRfVElNRU9VVAkxNTAKKworLyogV2F0Y2hkb2cncyBpbnRlcm5hbCBjb21tYW5kcyAqLworI2RlZmluZSBDTURfR0VUX1NUQVRVUwkJCTB4MDQKKyNkZWZpbmUgQ01EX0dFVF9GSVJNV0FSRV9WRVJTSU9OCTB4MDgKKyNkZWZpbmUgQ01EX1JFQURfV0FUQ0hET0dfVElNRU9VVAkweDE4CisjZGVmaW5lIENNRF9XUklURV9XQVRDSERPR19USU1FT1VUCTB4MTkKKworLyogV2UgY2FuIG9ubHkgdXNlIDEgY2FyZCBkdWUgdG8gdGhlIC9kZXYvd2F0Y2hkb2cgcmVzdHJpY3Rpb24gKi8KK3N0YXRpYyBpbnQgY2FyZHNfZm91bmQ7CisKKy8qIGludGVybmFsIHZhcmlhYmxlcyAqLworc3RhdGljIGludCB0ZW1wX3BhbmljOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXNfYWN0aXZlOworc3RhdGljIGNoYXIgZXhwZWN0X3JlbGVhc2U7CitzdGF0aWMgc3RydWN0IHsKKwlpbnQgc3VwcG9ydHNfdGVtcDsJLyogV2V0aGVyIG9yIG5vdCB0aGUgY2FyZCBoYXMgYSB0ZW1wZXJhdHVyZSBkZXZpY2UgKi8KKwlpbnQgYm9vdF9zdGF0dXM7CS8qIFRoZSBjYXJkJ3MgYm9vdCBzdGF0dXMgKi8KKwl1bnNpZ25lZCBsb25nIGlvX2FkZHI7CS8qIFRoZSBjYXJkcyBJL08gYWRkcmVzcyAqLworCXNwaW5sb2NrX3QgaW9fbG9jazsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKK30gcGNpcGN3ZF9wcml2YXRlOworCisvKiBtb2R1bGUgcGFyYW1ldGVycyAqLworI2RlZmluZSBXQVRDSERPR19IRUFSVEJFQVQgMgkvKiAyIHNlYyBkZWZhdWx0IGhlYXJ0YmVhdCAqLworc3RhdGljIGludCBoZWFydGJlYXQgPSBXQVRDSERPR19IRUFSVEJFQVQ7Cittb2R1bGVfcGFyYW0oaGVhcnRiZWF0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhoZWFydGJlYXQsICJXYXRjaGRvZyBoZWFydGJlYXQgaW4gc2Vjb25kcy4gKDA8aGVhcnRiZWF0PDY1NTM2LCBkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX0hFQVJUQkVBVCkgIikiKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qCisgKglJbnRlcm5hbCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IHNlbmRfY29tbWFuZChpbnQgY21kLCBpbnQgKm1zYiwgaW50ICpsc2IpCit7CisJaW50IGdvdF9yZXNwb25zZSwgY291bnQ7CisKKwlzcGluX2xvY2soJnBjaXBjd2RfcHJpdmF0ZS5pb19sb2NrKTsKKwkvKiBJZiBhIGNvbW1hbmQgcmVxdWlyZXMgZGF0YSBpdCBzaG91bGQgYmUgd3JpdHRlbiBmaXJzdC4KKwkgKiBEYXRhIGZvciBjb21tYW5kcyB3aXRoIDggYml0cyBvZiBkYXRhIHNob3VsZCBiZSB3cml0dGVuIHRvIHBvcnQgNC4KKwkgKiBDb21tYW5kcyB3aXRoIDE2IGJpdHMgb2YgZGF0YSwgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgTFNCIHRvIHBvcnQgNAorCSAqIGFuZCBNU0IgdG8gcG9ydCA1LgorCSAqIEFmdGVyIHRoZSByZXF1aXJlZCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gdGhlbiB3cml0ZSB0aGUgY29tbWFuZCB0bworCSAqIHBvcnQgNi4gKi8KKwlvdXRiX3AoKmxzYiwgcGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyA0KTsKKwlvdXRiX3AoKm1zYiwgcGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyA1KTsKKwlvdXRiX3AoY21kLCBwY2lwY3dkX3ByaXZhdGUuaW9fYWRkciArIDYpOworCisJLyogd2FpdCB0aWxsIHRoZSBwY2kgY2FyZCBwcm9jZXNzZWQgdGhlIGNvbW1hbmQsIHNpZ25hbGVkIGJ5CisJICogdGhlIFdSU1AgYml0IGluIHBvcnQgMiBhbmQgZ2l2ZSBpdCBhIG1heC4gdGltZW91dCBvZgorCSAqIFBDSV9DT01NQU5EX1RJTUVPVVQgdG8gcHJvY2VzcyAqLworCWdvdF9yZXNwb25zZSA9IGluYl9wKHBjaXBjd2RfcHJpdmF0ZS5pb19hZGRyICsgMikgJiAweDQwOworCWZvciAoY291bnQgPSAwOyAoY291bnQgPCBQQ0lfQ09NTUFORF9USU1FT1VUKSAmJiAoIWdvdF9yZXNwb25zZSk7IGNvdW50KyspIHsKKwkJbWRlbGF5KDEpOworCQlnb3RfcmVzcG9uc2UgPSBpbmJfcChwY2lwY3dkX3ByaXZhdGUuaW9fYWRkciArIDIpICYgMHg0MDsKKwl9CisKKwlpZiAoZ290X3Jlc3BvbnNlKSB7CisJCS8qIHJlYWQgYmFjayByZXNwb25zZSAqLworCQkqbHNiID0gaW5iX3AocGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyA0KTsKKwkJKm1zYiA9IGluYl9wKHBjaXBjd2RfcHJpdmF0ZS5pb19hZGRyICsgNSk7CisKKwkJLyogY2xlYXIgV1JTUCBiaXQgKi8KKwkJaW5iX3AocGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyA2KTsKKwl9CisJc3Bpbl91bmxvY2soJnBjaXBjd2RfcHJpdmF0ZS5pb19sb2NrKTsKKworCXJldHVybiBnb3RfcmVzcG9uc2U7Cit9CisKK3N0YXRpYyBpbnQgcGNpcGN3ZF9zdGFydCh2b2lkKQoreworCWludCBzdGF0X3JlZzsKKworCXNwaW5fbG9jaygmcGNpcGN3ZF9wcml2YXRlLmlvX2xvY2spOworCW91dGJfcCgweDAwLCBwY2lwY3dkX3ByaXZhdGUuaW9fYWRkciArIDMpOworCXVkZWxheSgxMDAwKTsKKworCXN0YXRfcmVnID0gaW5iX3AocGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyAyKTsKKwlzcGluX3VubG9jaygmcGNpcGN3ZF9wcml2YXRlLmlvX2xvY2spOworCisJaWYgKHN0YXRfcmVnICYgMHgxMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYXJkIHRpbWVyIG5vdCBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjaXBjd2Rfc3RvcCh2b2lkKQoreworCWludCBzdGF0X3JlZzsKKworCXNwaW5fbG9jaygmcGNpcGN3ZF9wcml2YXRlLmlvX2xvY2spOworCW91dGJfcCgweEE1LCBwY2lwY3dkX3ByaXZhdGUuaW9fYWRkciArIDMpOworCXVkZWxheSgxMDAwKTsKKworCW91dGJfcCgweEE1LCBwY2lwY3dkX3ByaXZhdGUuaW9fYWRkciArIDMpOworCXVkZWxheSgxMDAwKTsKKworCXN0YXRfcmVnID0gaW5iX3AocGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyAyKTsKKwlzcGluX3VubG9jaygmcGNpcGN3ZF9wcml2YXRlLmlvX2xvY2spOworCisJaWYgKCEoc3RhdF9yZWcgJiAweDEwKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYXJkIGRpZCBub3QgYWNrbm93bGVkZ2UgZGlzYWJsZSBhdHRlbXB0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjaXBjd2Rfa2VlcGFsaXZlKHZvaWQpCit7CisJLyogUmUtdHJpZ2dlciB3YXRjaGRvZyBieSB3cml0aW5nIHRvIHBvcnQgMCAqLworCW91dGJfcCgweDQyLCBwY2lwY3dkX3ByaXZhdGUuaW9fYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNpcGN3ZF9zZXRfaGVhcnRiZWF0KGludCB0KQoreworCWludCB0X21zYiA9IHQgLyAyNTY7CisJaW50IHRfbHNiID0gdCAlIDI1NjsKKworCWlmICgodCA8IDB4MDAwMSkgfHwgKHQgPiAweEZGRkYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFdyaXRlIG5ldyBoZWFydGJlYXQgdG8gd2F0Y2hkb2cgKi8KKwlzZW5kX2NvbW1hbmQoQ01EX1dSSVRFX1dBVENIRE9HX1RJTUVPVVQsICZ0X21zYiwgJnRfbHNiKTsKKworCWhlYXJ0YmVhdCA9IHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNpcGN3ZF9nZXRfc3RhdHVzKGludCAqc3RhdHVzKQoreworCWludCBuZXdfc3RhdHVzOworCisJKnN0YXR1cz0wOworCW5ld19zdGF0dXMgPSBpbmJfcChwY2lwY3dkX3ByaXZhdGUuaW9fYWRkciArIDEpOworCWlmIChuZXdfc3RhdHVzICYgV0RfUENJX1dUUlApCisJCSpzdGF0dXMgfD0gV0RJT0ZfQ0FSRFJFU0VUOworCWlmIChuZXdfc3RhdHVzICYgV0RfUENJX1RUUlApIHsKKwkJKnN0YXR1cyB8PSBXRElPRl9PVkVSSEVBVDsKKwkJaWYgKHRlbXBfcGFuaWMpCisJCQlwYW5pYyhQRlggIlRlbXBlcmF0dXJlIG92ZXJoZWF0IHRyaXAhXG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2lwY3dkX2NsZWFyX3N0YXR1cyh2b2lkKQoreworCW91dGJfcCgweDAxLCBwY2lwY3dkX3ByaXZhdGUuaW9fYWRkciArIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjaXBjd2RfZ2V0X3RlbXBlcmF0dXJlKGludCAqdGVtcGVyYXR1cmUpCit7CisJKnRlbXBlcmF0dXJlID0gMDsKKwlpZiAoIXBjaXBjd2RfcHJpdmF0ZS5zdXBwb3J0c190ZW1wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogQ29udmVydCBjZWxzaXVzIHRvIGZhaHJlbmhlaXQsIHNpbmNlIHRoaXMgd2FzCisJICogdGhlIGRlY2lkZWQgJ3N0YW5kYXJkJyBmb3IgdGhpcyByZXR1cm4gdmFsdWUuCisJICovCisJKnRlbXBlcmF0dXJlID0gKChpbmJfcChwY2lwY3dkX3ByaXZhdGUuaW9fYWRkcikpICogOSAvIDUpICsgMzI7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCS9kZXYvd2F0Y2hkb2cgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgc3NpemVfdCBwY2lwY3dkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCSAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwkvKiBTZWUgaWYgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgJ1YnIGFuZCByZWxvYWQgdGhlIHRpbWVyICovCisJaWYgKGxlbikgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogbm90ZToganVzdCBpbiBjYXNlIHNvbWVvbmUgd3JvdGUgdGhlIG1hZ2ljIGNoYXJhY3RlcgorCQkJICogZml2ZSBtb250aHMgYWdvLi4uICovCisJCQlleHBlY3RfcmVsZWFzZSA9IDA7CisKKwkJCS8qIHNjYW4gdG8gc2VlIHdoZXRoZXIgb3Igbm90IHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICovCisJCQlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmKGdldF91c2VyKGMsIGRhdGEraSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJZXhwZWN0X3JlbGVhc2UgPSA0MjsKKwkJCX0KKwkJfQorCisJCS8qIHNvbWVvbmUgd3JvdGUgdG8gdXMsIHdlIHNob3VsZCByZWxvYWQgdGhlIHRpbWVyICovCisJCXBjaXBjd2Rfa2VlcGFsaXZlKCk7CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgcGNpcGN3ZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9CQlXRElPRl9PVkVSSEVBVCB8CisJCQkJCVdESU9GX0NBUkRSRVNFVCB8CisJCQkJCVdESU9GX0tFRVBBTElWRVBJTkcgfAorCQkJCQlXRElPRl9TRVRUSU1FT1VUIHwKKwkJCQkJV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPQkxLAorCQkuaWRlbnRpdHkgPQkJV0FUQ0hET0dfRFJJVkVSX05BTUUsCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LAorCQkJCXNpemVvZiAoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQl7CisJCQlpbnQgc3RhdHVzOworCisJCQlwY2lwY3dkX2dldF9zdGF0dXMoJnN0YXR1cyk7CisKKwkJCXJldHVybiBwdXRfdXNlcihzdGF0dXMsIHApOworCQl9CisKKwkJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyKHBjaXBjd2RfcHJpdmF0ZS5ib290X3N0YXR1cywgcCk7CisKKwkJY2FzZSBXRElPQ19HRVRURU1QOgorCQl7CisJCQlpbnQgdGVtcGVyYXR1cmU7CisKKwkJCWlmIChwY2lwY3dkX2dldF90ZW1wZXJhdHVyZSgmdGVtcGVyYXR1cmUpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXR1cm4gcHV0X3VzZXIodGVtcGVyYXR1cmUsIHApOworCQl9CisKKwkJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCQlwY2lwY3dkX2tlZXBhbGl2ZSgpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQl7CisJCQlpbnQgbmV3X29wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwkJCWlmIChnZXRfdXNlciAobmV3X29wdGlvbnMsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAobmV3X29wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJCXBjaXBjd2Rfc3RvcCgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCWlmIChuZXdfb3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCQlwY2lwY3dkX3N0YXJ0KCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJaWYgKG5ld19vcHRpb25zICYgV0RJT1NfVEVNUFBBTklDKSB7CisJCQkJdGVtcF9wYW5pYyA9IDE7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCisJCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJeworCQkJaW50IG5ld19oZWFydGJlYXQ7CisKKwkJCWlmIChnZXRfdXNlcihuZXdfaGVhcnRiZWF0LCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHBjaXBjd2Rfc2V0X2hlYXJ0YmVhdChuZXdfaGVhcnRiZWF0KSkKKwkJCSAgICByZXR1cm4gLUVJTlZBTDsKKworCQkJcGNpcGN3ZF9rZWVwYWxpdmUoKTsKKwkJCS8qIEZhbGwgKi8KKwkJfQorCisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJCXJldHVybiBwdXRfdXNlcihoZWFydGJlYXQsIHApOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RhdGljIGludCBwY2lwY3dkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogL2Rldi93YXRjaGRvZyBjYW4gb25seSBiZSBvcGVuZWQgb25jZSAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZpc19hY3RpdmUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogQWN0aXZhdGUgKi8KKwlwY2lwY3dkX3N0YXJ0KCk7CisJcGNpcGN3ZF9rZWVwYWxpdmUoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgcGNpcGN3ZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qCisJICogICAgICBTaHV0IG9mZiB0aGUgdGltZXIuCisJICovCisJaWYgKGV4cGVjdF9yZWxlYXNlID09IDQyKSB7CisJCXBjaXBjd2Rfc3RvcCgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJcGNpcGN3ZF9rZWVwYWxpdmUoKTsKKwl9CisJZXhwZWN0X3JlbGVhc2UgPSAwOworCWNsZWFyX2JpdCgwLCAmaXNfYWN0aXZlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCS9kZXYvdGVtcGVyYXR1cmUgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgc3NpemVfdCBwY2lwY3dkX3RlbXBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmRhdGEsCisJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCWludCB0ZW1wZXJhdHVyZTsKKworCWlmIChwY2lwY3dkX2dldF90ZW1wZXJhdHVyZSgmdGVtcGVyYXR1cmUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X3RvX3VzZXIgKGRhdGEsICZ0ZW1wZXJhdHVyZSwgMSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGNpcGN3ZF90ZW1wX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKCFwY2lwY3dkX3ByaXZhdGUuc3VwcG9ydHNfdGVtcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgcGNpcGN3ZF90ZW1wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglOb3RpZnkgc3lzdGVtCisgKi8KKworc3RhdGljIGludCBwY2lwY3dkX25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZT09U1lTX0RPV04gfHwgY29kZT09U1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCQlwY2lwY3dkX3N0b3AoKTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglLZXJuZWwgSW50ZXJmYWNlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBjaXBjd2RfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubGxzZWVrID0Jbm9fbGxzZWVrLAorCS53cml0ZSA9CXBjaXBjd2Rfd3JpdGUsCisJLmlvY3RsID0JcGNpcGN3ZF9pb2N0bCwKKwkub3BlbiA9CQlwY2lwY3dkX29wZW4sCisJLnJlbGVhc2UgPQlwY2lwY3dkX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgcGNpcGN3ZF9taXNjZGV2ID0geworCS5taW5vciA9CVdBVENIRE9HX01JTk9SLAorCS5uYW1lID0JCSJ3YXRjaGRvZyIsCisJLmZvcHMgPQkJJnBjaXBjd2RfZm9wcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBjaXBjd2RfdGVtcF9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5sbHNlZWsgPQlub19sbHNlZWssCisJLnJlYWQgPQkJcGNpcGN3ZF90ZW1wX3JlYWQsCisJLm9wZW4gPQkJcGNpcGN3ZF90ZW1wX29wZW4sCisJLnJlbGVhc2UgPQlwY2lwY3dkX3RlbXBfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBwY2lwY3dkX3RlbXBfbWlzY2RldiA9IHsKKwkubWlub3IgPQlURU1QX01JTk9SLAorCS5uYW1lID0JCSJ0ZW1wZXJhdHVyZSIsCisJLmZvcHMgPQkJJnBjaXBjd2RfdGVtcF9mb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwY2lwY3dkX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0JcGNpcGN3ZF9ub3RpZnlfc3lzLAorfTsKKworLyoKKyAqCUluaXQgJiBleGl0IHJvdXRpbmVzCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3RlbXBlcmF0dXJlX3N1cHBvcnQodm9pZCkKK3sKKwlpZiAoaW5iX3AocGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIpICE9IDB4RjApCisJCXBjaXBjd2RfcHJpdmF0ZS5zdXBwb3J0c190ZW1wID0gMTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcGNpcGN3ZF9jYXJkX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IHJldCA9IC1FSU87CisJaW50IGdvdF9md19yZXYsIGZ3X3Jldl9tYWpvciwgZndfcmV2X21pbm9yOworCWNoYXIgZndfdmVyX3N0clsyMF07CisJY2hhciBvcHRpb25fc3dpdGNoZXM7CisKKwljYXJkc19mb3VuZCsrOworCWlmIChjYXJkc19mb3VuZCA9PSAxKQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCBEUklWRVJfVkVSU0lPTik7CisKKwlpZiAoY2FyZHNfZm91bmQgPiAxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlRoaXMgZHJpdmVyIG9ubHkgc3VwcG9ydHMgMSBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm90IHBvc3NpYmxlIHRvIGVuYWJsZSBQQ0kgRGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSA9PSAweDAwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gSS9PLUFkZHJlc3MgZm9yIGNhcmQgZGV0ZWN0ZWRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJcGNpcGN3ZF9wcml2YXRlLnBkZXYgPSBwZGV2OworCXBjaXBjd2RfcHJpdmF0ZS5pb19hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgV0FUQ0hET0dfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAorCQkJKGludCkgcGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJLyogZ2V0IHRoZSBib290X3N0YXR1cyAqLworCXBjaXBjd2RfZ2V0X3N0YXR1cygmcGNpcGN3ZF9wcml2YXRlLmJvb3Rfc3RhdHVzKTsKKworCS8qIGNsZWFyIHRoZSAiY2FyZCBjYXVzZWQgcmVib290IiBmbGFnICovCisJcGNpcGN3ZF9jbGVhcl9zdGF0dXMoKTsKKworCS8qIGRpc2FibGUgY2FyZCAqLworCXBjaXBjd2Rfc3RvcCgpOworCisJLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIGNhcmQgc3VwcG9ydHMgdGhlIHRlbXBlcmF0dXJlIGRldmljZSAqLworCWNoZWNrX3RlbXBlcmF0dXJlX3N1cHBvcnQoKTsKKworCS8qIEdldCB0aGUgRmlybXdhcmUgVmVyc2lvbiAqLworCWdvdF9md19yZXYgPSBzZW5kX2NvbW1hbmQoQ01EX0dFVF9GSVJNV0FSRV9WRVJTSU9OLCAmZndfcmV2X21ham9yLCAmZndfcmV2X21pbm9yKTsKKwlpZiAoZ290X2Z3X3JldikgeworCQlzcHJpbnRmKGZ3X3Zlcl9zdHIsICIldS4lMDJ1IiwgZndfcmV2X21ham9yLCBmd19yZXZfbWlub3IpOworCX0gZWxzZSB7CisJCXNwcmludGYoZndfdmVyX3N0ciwgIjxjYXJkIG5vIGFuc3dlcj4iKTsKKwl9CisKKwkvKiBHZXQgc3dpdGNoIHNldHRpbmdzICovCisJb3B0aW9uX3N3aXRjaGVzID0gaW5iX3AocGNpcGN3ZF9wcml2YXRlLmlvX2FkZHIgKyAzKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJGb3VuZCBjYXJkIGF0IHBvcnQgMHglMDR4IChGaXJtd2FyZTogJXMpICVzIHRlbXAgb3B0aW9uXG4iLAorCQkoaW50KSBwY2lwY3dkX3ByaXZhdGUuaW9fYWRkciwgZndfdmVyX3N0ciwKKwkJKHBjaXBjd2RfcHJpdmF0ZS5zdXBwb3J0c190ZW1wID8gIndpdGgiIDogIndpdGhvdXQiKSk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiT3B0aW9uIHN3aXRjaGVzICgweCUwMngpOiBUZW1wZXJhdHVyZSBSZXNldCBFbmFibGU9JXMsIFBvd2VyIE9uIERlbGF5PSVzXG4iLAorCQlvcHRpb25fc3dpdGNoZXMsCisJCSgob3B0aW9uX3N3aXRjaGVzICYgMHgxMCkgPyAiT04iIDogIk9GRiIpLAorCQkoKG9wdGlvbl9zd2l0Y2hlcyAmIDB4MDgpID8gIk9OIiA6ICJPRkYiKSk7CisKKwlpZiAocGNpcGN3ZF9wcml2YXRlLmJvb3Rfc3RhdHVzICYgV0RJT0ZfQ0FSRFJFU0VUKQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUHJldmlvdXMgcmVzZXQgd2FzIGNhdXNlZCBieSB0aGUgV2F0Y2hkb2cgY2FyZFxuIik7CisKKwlpZiAocGNpcGN3ZF9wcml2YXRlLmJvb3Rfc3RhdHVzICYgV0RJT0ZfT1ZFUkhFQVQpCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJDYXJkIHNlbnNlZCBhIENQVSBPdmVyaGVhdFxuIik7CisKKwlpZiAocGNpcGN3ZF9wcml2YXRlLmJvb3Rfc3RhdHVzID09IDApCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJObyBwcmV2aW91cyB0cmlwIGRldGVjdGVkIC0gQ29sZCBib290IG9yIHJlc2V0XG4iKTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGhlYXJ0YmVhdCB2YWx1ZSBpcyB3aXRoaW4gaXQncyByYW5nZSA7IGlmIG5vdCByZXNldCB0byB0aGUgZGVmYXVsdCAqLworCWlmIChwY2lwY3dkX3NldF9oZWFydGJlYXQoaGVhcnRiZWF0KSkgeworCQlwY2lwY3dkX3NldF9oZWFydGJlYXQoV0FUQ0hET0dfSEVBUlRCRUFUKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImhlYXJ0YmVhdCB2YWx1ZSBtdXN0IGJlIDA8aGVhcnRiZWF0PDY1NTM2LCB1c2luZyAlZFxuIiwKKwkJCVdBVENIRE9HX0hFQVJUQkVBVCk7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwY2lwY3dkX25vdGlmaWVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gZXJyX291dF9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwlpZiAocGNpcGN3ZF9wcml2YXRlLnN1cHBvcnRzX3RlbXApIHsKKwkJcmV0ID0gbWlzY19yZWdpc3RlcigmcGNpcGN3ZF90ZW1wX21pc2NkZXYpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJCVRFTVBfTUlOT1IsIHJldCk7CisJCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9yZWJvb3Q7CisJCX0KKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZwY2lwY3dkX21pc2NkZXYpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQlnb3RvIGVycl9vdXRfbWlzY19kZXJlZ2lzdGVyOworCX0KKworCXByaW50ayhLRVJOX0lORk8gUEZYICJpbml0aWFsaXplZC4gaGVhcnRiZWF0PSVkIHNlYyAobm93YXlvdXQ9JWQpXG4iLAorCQloZWFydGJlYXQsIG5vd2F5b3V0KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X21pc2NfZGVyZWdpc3RlcjoKKwlpZiAocGNpcGN3ZF9wcml2YXRlLnN1cHBvcnRzX3RlbXApCisJCW1pc2NfZGVyZWdpc3RlcigmcGNpcGN3ZF90ZW1wX21pc2NkZXYpOworZXJyX291dF91bnJlZ2lzdGVyX3JlYm9vdDoKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGNpcGN3ZF9ub3RpZmllcik7CitlcnJfb3V0X3JlbGVhc2VfcmVnaW9uOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0X2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcGNpcGN3ZF9jYXJkX2V4aXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJLyogU3RvcCB0aGUgdGltZXIgYmVmb3JlIHdlIGxlYXZlICovCisJaWYgKCFub3dheW91dCkKKwkJcGNpcGN3ZF9zdG9wKCk7CisKKwkvKiBEZXJlZ2lzdGVyICovCisJbWlzY19kZXJlZ2lzdGVyKCZwY2lwY3dkX21pc2NkZXYpOworCWlmIChwY2lwY3dkX3ByaXZhdGUuc3VwcG9ydHNfdGVtcCkKKwkJbWlzY19kZXJlZ2lzdGVyKCZwY2lwY3dkX3RlbXBfbWlzY2Rldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBjaXBjd2Rfbm90aWZpZXIpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCWNhcmRzX2ZvdW5kLS07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lwY3dkX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfUVVJQ0tMT0dJQywgUENJX0RFVklDRV9JRF9XQVRDSERPR19QQ0lQQ1dELAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMCB9LAkJCS8qIEVuZCBvZiBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaXBjd2RfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwY2lwY3dkX2RyaXZlciA9IHsKKwkubmFtZQkJPSBXQVRDSERPR19OQU1FLAorCS5pZF90YWJsZQk9IHBjaXBjd2RfcGNpX3RibCwKKwkucHJvYmUJCT0gcGNpcGN3ZF9jYXJkX2luaXQsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwY2lwY3dkX2NhcmRfZXhpdCksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwY2lwY3dkX2luaXRfbW9kdWxlKHZvaWQpCit7CisJc3Bpbl9sb2NrX2luaXQgKCZwY2lwY3dkX3ByaXZhdGUuaW9fbG9jayk7CisKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcGNpcGN3ZF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGNpcGN3ZF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGNpcGN3ZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwY2lwY3dkX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHBjaXBjd2RfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCZXJrc2hpcmUgUENJLVBDIFdhdGNoZG9nIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOworTU9EVUxFX0FMSUFTX01JU0NERVYoVEVNUF9NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcGN3ZF91c2IuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9wY3dkX3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMjcyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcGN3ZF91c2IuYwpAQCAtMCwwICsxLDc5NiBAQAorLyoKKyAqCUJlcmtzaGlyZSBVU0ItUEMgV2F0Y2hkb2cgQ2FyZCBEcml2ZXIKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDQgV2ltIFZhbiBTZWJyb2VjayA8d2ltQGlndWFuYS5iZT4uCisgKgorICoJQmFzZWQgb24gc291cmNlIGNvZGUgb2YgdGhlIGZvbGxvd2luZyBhdXRob3JzOgorICoJICBLZW4gSG9sbGlzIDxrZW5qaUBiaXRnYXRlLmNvbT4sCisgKgkgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LAorICoJICBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+LAorICoJICBSb2IgUmFkZXogPHJvYkBvc2ludmVzdG9yLmNvbT4sCisgKgkgIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIFdpbSBWYW4gU2Vicm9lY2sgbm9yIElndWFuYSB2encuIGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqCXByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCisgKglwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoJVGhhbmtzIGFsc28gdG8gU2ltb24gTWFjaGVsbCBhdCBCZXJrc2hpcmUgUHJvZHVjdHMgSW5jLiBmb3IKKyAqCXByb3ZpZGluZyB0aGUgdGVzdCBoYXJkd2FyZS4gTW9yZSBpbmZvIGlzIGF2YWlsYWJsZSBhdAorICoJaHR0cDovL3d3dy5iZXJrcHJvZC5jb20vIG9yIGh0dHA6Ly93d3cucGN3YXRjaGRvZy5jb20vCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworCisjaWZkZWYgQ09ORklHX1VTQl9ERUJVRworCXN0YXRpYyBpbnQgZGVidWcgPSAxOworI2Vsc2UKKwlzdGF0aWMgaW50IGRlYnVnOworI2VuZGlmCisKKy8qIFVzZSBvdXIgb3duIGRiZyBtYWNybyAqLworI3VuZGVmIGRiZworI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHsgaWYgKGRlYnVnKSBwcmludGsoS0VSTl9ERUJVRyBQRlggZm9ybWF0ICJcbiIgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQorCisKKy8qIE1vZHVsZSBhbmQgVmVyc2lvbiBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMS4wMSIKKyNkZWZpbmUgRFJJVkVSX0RBVEUgIjE1IE1hciAyMDA1IgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIkJlcmtzaGlyZSBVU0ItUEMgV2F0Y2hkb2cgZHJpdmVyIgorI2RlZmluZSBEUklWRVJfTElDRU5TRSAiR1BMIgorI2RlZmluZSBEUklWRVJfTkFNRSAicGN3ZF91c2IiCisjZGVmaW5lIFBGWCBEUklWRVJfTkFNRSAiOiAiCisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoRFJJVkVSX0xJQ0VOU0UpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOworTU9EVUxFX0FMSUFTX01JU0NERVYoVEVNUF9NSU5PUik7CisKKy8qIE1vZHVsZSBQYXJhbWV0ZXJzICovCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgZW5hYmxlZCBvciBub3QiKTsKKworI2RlZmluZSBXQVRDSERPR19IRUFSVEJFQVQgMgkvKiAyIHNlYyBkZWZhdWx0IGhlYXJ0YmVhdCAqLworc3RhdGljIGludCBoZWFydGJlYXQgPSBXQVRDSERPR19IRUFSVEJFQVQ7Cittb2R1bGVfcGFyYW0oaGVhcnRiZWF0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhoZWFydGJlYXQsICJXYXRjaGRvZyBoZWFydGJlYXQgaW4gc2Vjb25kcy4gKDA8aGVhcnRiZWF0PDY1NTM2LCBkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX0hFQVJUQkVBVCkgIikiKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qIFRoZSB2ZW5kb3IgYW5kIHByb2R1Y3QgaWQncyBmb3IgdGhlIFVTQi1QQyBXYXRjaGRvZyBjYXJkICovCisjZGVmaW5lIFVTQl9QQ1dEX1ZFTkRPUl9JRAkweDBjOTgKKyNkZWZpbmUgVVNCX1BDV0RfUFJPRFVDVF9JRAkweDExNDAKKworLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYl9wY3dkX3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRShVU0JfUENXRF9WRU5ET1JfSUQsIFVTQl9QQ1dEX1BST0RVQ1RfSUQpIH0sCisJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgdXNiX3Bjd2RfdGFibGUpOworCisvKiBhY2NvcmRpbmcgdG8gZG9jdW1lbnRhdGlvbiBtYXguIHRpbWUgdG8gcHJvY2VzcyBhIGNvbW1hbmQgZm9yIHRoZSBVU0IKKyAqIHdhdGNoZG9nIGNhcmQgaXMgMTAwIG9yIDIwMCBtcywgc28gd2UgZ2l2ZSBpdCAyNTAgbXMgdG8gZG8gaXQncyBqb2IgKi8KKyNkZWZpbmUgVVNCX0NPTU1BTkRfVElNRU9VVAkyNTAKKworLyogV2F0Y2hkb2cncyBpbnRlcm5hbCBjb21tYW5kcyAqLworI2RlZmluZSBDTURfUkVBRF9URU1QCQkJMHgwMgkvKiBSZWFkIFRlbXBlcmF0dXJlOyBSZS10cmlnZ2VyIFdhdGNoZG9nICovCisjZGVmaW5lIENNRF9UUklHR0VSCQkJQ01EX1JFQURfVEVNUAorI2RlZmluZSBDTURfR0VUX1NUQVRVUwkJCTB4MDQJLyogR2V0IFN0YXR1cyBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBDTURfR0VUX0ZJUk1XQVJFX1ZFUlNJT04JMHgwOAkvKiBHZXQgRmlybXdhcmUgVmVyc2lvbiAqLworI2RlZmluZSBDTURfR0VUX0RJUF9TV0lUQ0hfU0VUVElOR1MJMHgwYwkvKiBHZXQgRGlwIFN3aXRjaCBTZXR0aW5ncyAqLworI2RlZmluZSBDTURfUkVBRF9XQVRDSERPR19USU1FT1VUCTB4MTgJLyogUmVhZCBDdXJyZW50IFdhdGNoZG9nIFRpbWUgKi8KKyNkZWZpbmUgQ01EX1dSSVRFX1dBVENIRE9HX1RJTUVPVVQJMHgxOQkvKiBXcml0ZSBDdXJyZW50IFdhdGNoZG9nIFRpbWUgKi8KKyNkZWZpbmUgQ01EX0VOQUJMRV9XQVRDSERPRwkJMHgzMAkvKiBFbmFibGUgLyBEaXNhYmxlIFdhdGNoZG9nICovCisjZGVmaW5lIENNRF9ESVNBQkxFX1dBVENIRE9HCQlDTURfRU5BQkxFX1dBVENIRE9HCisKKy8qIFNvbWUgZGVmaW5lcyB0aGF0IEkgbGlrZSB0byBiZSBzb21ld2hlcmUgZWxzZSBsaWtlIGluY2x1ZGUvbGludXgvdXNiX2hpZC5oICovCisjZGVmaW5lIEhJRF9SRVFfU0VUX1JFUE9SVAkJMHgwOQorI2RlZmluZSBISURfRFRfUkVQT1JUCQkJKFVTQl9UWVBFX0NMQVNTIHwgMHgwMikKKworLyogV2UgY2FuIG9ubHkgdXNlIDEgY2FyZCBkdWUgdG8gdGhlIC9kZXYvd2F0Y2hkb2cgcmVzdHJpY3Rpb24gKi8KK3N0YXRpYyBpbnQgY2FyZHNfZm91bmQ7CisKKy8qIHNvbWUgaW50ZXJuYWwgdmFyaWFibGVzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpc19hY3RpdmU7CitzdGF0aWMgY2hhciBleHBlY3RfcmVsZWFzZTsKKworLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIG91ciBkZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgKi8KK3N0cnVjdCB1c2JfcGN3ZF9wcml2YXRlIHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqCXVkZXY7CQkJLyogc2F2ZSBvZmYgdGhlIHVzYiBkZXZpY2UgcG9pbnRlciAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICoJaW50ZXJmYWNlOwkJLyogdGhlIGludGVyZmFjZSBmb3IgdGhpcyBkZXZpY2UgKi8KKworCXVuc2lnbmVkIGludAkJaW50ZXJmYWNlX251bWJlcjsJLyogdGhlIGludGVyZmFjZSBudW1iZXIgdXNlZCBmb3IgY21kJ3MgKi8KKworCXVuc2lnbmVkIGNoYXIgKgkJaW50cl9idWZmZXI7CQkvKiB0aGUgYnVmZmVyIHRvIGludHIgZGF0YSAqLworCWRtYV9hZGRyX3QJCWludHJfZG1hOwkJLyogdGhlIGRtYSBhZGRyZXNzIGZvciB0aGUgaW50ciBidWZmZXIgKi8KKwlzaXplX3QJCQlpbnRyX3NpemU7CQkvKiB0aGUgc2l6ZSBvZiB0aGUgaW50ciBidWZmZXIgKi8KKwlzdHJ1Y3QgdXJiICoJCWludHJfdXJiOwkJLyogdGhlIHVyYiB1c2VkIGZvciB0aGUgaW50ciBwaXBlICovCisKKwl1bnNpZ25lZCBjaGFyCQljbWRfY29tbWFuZDsJCS8qIFRoZSBjb21tYW5kIHRoYXQgaXMgcmVwb3J0ZWQgYmFjayAqLworCXVuc2lnbmVkIGNoYXIJCWNtZF9kYXRhX21zYjsJCS8qIFRoZSBkYXRhIE1TQiB0aGF0IGlzIHJlcG9ydGVkIGJhY2sgKi8KKwl1bnNpZ25lZCBjaGFyCQljbWRfZGF0YV9sc2I7CQkvKiBUaGUgZGF0YSBMU0IgdGhhdCBpcyByZXBvcnRlZCBiYWNrICovCisJYXRvbWljX3QJCWNtZF9yZWNlaXZlZDsJCS8qIHRydWUgaWYgd2UgcmVjZWl2ZWQgYSByZXBvcnQgYWZ0ZXIgYSBjb21tYW5kICovCisKKwlpbnQJCQlleGlzdHM7CQkJLyogV2V0aGVyIG9yIG5vdCB0aGUgZGV2aWNlIGV4aXN0cyAqLworCXN0cnVjdCBzZW1hcGhvcmUJc2VtOwkJCS8qIGxvY2tzIHRoaXMgc3RydWN0dXJlICovCit9Oworc3RhdGljIHN0cnVjdCB1c2JfcGN3ZF9wcml2YXRlICp1c2JfcGN3ZF9kZXZpY2U7CisKKy8qIHByZXZlbnQgcmFjZXMgYmV0d2VlbiBvcGVuKCkgYW5kIGRpc2Nvbm5lY3QoKSAqLworc3RhdGljIERFQ0xBUkVfTVVURVggKGRpc2Nvbm5lY3Rfc2VtKTsKKworLyogbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIGludCB1c2JfcGN3ZF9wcm9iZQkoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIHVzYl9wY3dkX2Rpc2Nvbm5lY3QJKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOworCisvKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiX3Bjd2RfZHJpdmVyID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCURSSVZFUl9OQU1FLAorCS5wcm9iZSA9CXVzYl9wY3dkX3Byb2JlLAorCS5kaXNjb25uZWN0ID0JdXNiX3Bjd2RfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPQl1c2JfcGN3ZF90YWJsZSwKK307CisKKworc3RhdGljIHZvaWQgdXNiX3Bjd2RfaW50cl9kb25lKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHVzYl9wY3dkX3ByaXZhdGUgKnVzYl9wY3dkID0gKHN0cnVjdCB1c2JfcGN3ZF9wcml2YXRlICopdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1c2JfcGN3ZC0+aW50cl9idWZmZXI7CisJaW50IHJldHZhbDsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CQkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgkvKiB1bmxpbmsgKi8KKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLworCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCXJldHVybjsKKwkvKiAtRVBJUEU6ICBzaG91bGQgY2xlYXIgdGhlIGhhbHQgKi8KKwlkZWZhdWx0OgkJLyogZXJyb3IgKi8KKwkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJZ290byByZXN1Ym1pdDsKKwl9CisKKwlkYmcoInJlY2VpdmVkIGZvbGxvd2luZyBkYXRhIGNtZD0weCUwMnggbXNiPTB4JTAyeCBsc2I9MHglMDJ4IiwKKwkJZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSk7CisKKwl1c2JfcGN3ZC0+Y21kX2NvbW1hbmQgID0gZGF0YVswXTsKKwl1c2JfcGN3ZC0+Y21kX2RhdGFfbXNiID0gZGF0YVsxXTsKKwl1c2JfcGN3ZC0+Y21kX2RhdGFfbHNiID0gZGF0YVsyXTsKKworCS8qIG5vdGlmeSBhbnlvbmUgd2FpdGluZyB0aGF0IHRoZSBjbWQgaGFzIGZpbmlzaGVkICovCisJYXRvbWljX3NldCAoJnVzYl9wY3dkLT5jbWRfcmVjZWl2ZWQsIDEpOworCityZXN1Ym1pdDoKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0dmFsKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW4ndCByZXN1Ym1pdCBpbnRyLCB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWRcbiIsCisJCQlyZXR2YWwpOworfQorCitzdGF0aWMgaW50IHVzYl9wY3dkX3NlbmRfY29tbWFuZChzdHJ1Y3QgdXNiX3Bjd2RfcHJpdmF0ZSAqdXNiX3Bjd2QsIHVuc2lnbmVkIGNoYXIgY21kLAorCXVuc2lnbmVkIGNoYXIgKm1zYiwgdW5zaWduZWQgY2hhciAqbHNiKQoreworCWludCBnb3RfcmVzcG9uc2UsIGNvdW50OworCXVuc2lnbmVkIGNoYXIgYnVmWzZdOworCisJLyogV2Ugd2lsbCBub3Qgc2VuZCBhbnkgY29tbWFuZHMgaWYgdGhlIFVTQiBQQ1dEIGRldmljZSBkb2VzIG5vdCBleGlzdCAqLworCWlmICgoIXVzYl9wY3dkKSB8fCAoIXVzYl9wY3dkLT5leGlzdHMpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBUaGUgVVNCIFBDIFdhdGNoZG9nIHVzZXMgYSA2IGJ5dGUgcmVwb3J0IGZvcm1hdC4gVGhlIGJvYXJkIGN1cnJlbnRseSB1c2VzCisJICogb25seSAzIG9mIHRoZSBzaXggYnl0ZXMgb2YgdGhlIHJlcG9ydC4gKi8KKwlidWZbMF0gPSBjbWQ7CQkJLyogQnl0ZSAwID0gQ01EICovCisJYnVmWzFdID0gKm1zYjsJCQkvKiBCeXRlIDEgPSBEYXRhIE1TQiAqLworCWJ1ZlsyXSA9ICpsc2I7CQkJLyogQnl0ZSAyID0gRGF0YSBMU0IgKi8KKwlidWZbM10gPSBidWZbNF0gPSBidWZbNV0gPSAwOwkvKiBBbGwgb3RoZXIgYnl0ZXMgbm90IHVzZWQgKi8KKworCWRiZygic2VuZGluZyBmb2xsb3dpbmcgZGF0YSBjbWQ9MHglMDJ4IG1zYj0weCUwMnggbHNiPTB4JTAyeCIsCisJCWJ1ZlswXSwgYnVmWzFdLCBidWZbMl0pOworCisJYXRvbWljX3NldCAoJnVzYl9wY3dkLT5jbWRfcmVjZWl2ZWQsIDApOworCisJaWYgKHVzYl9jb250cm9sX21zZyh1c2JfcGN3ZC0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKHVzYl9wY3dkLT51ZGV2LCAwKSwKKwkJCUhJRF9SRVFfU0VUX1JFUE9SVCwgSElEX0RUX1JFUE9SVCwKKwkJCTB4MDIwMCwgdXNiX3Bjd2QtPmludGVyZmFjZV9udW1iZXIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQlVU0JfQ09NTUFORF9USU1FT1VUKSAhPSBzaXplb2YoYnVmKSkgeworCQlkYmcoInVzYl9wY3dkX3NlbmRfY29tbWFuZDogZXJyb3IgaW4gdXNiX2NvbnRyb2xfbXNnIGZvciBjbWQgMHgleCAweCV4IDB4JXhcbiIsIGNtZCwgKm1zYiwgKmxzYik7CisJfQorCS8qIHdhaXQgdGlsbCB0aGUgdXNiIGNhcmQgcHJvY2Vzc2VkIHRoZSBjb21tYW5kLAorCSAqIHdpdGggYSBtYXguIHRpbWVvdXQgb2YgVVNCX0NPTU1BTkRfVElNRU9VVCAqLworCWdvdF9yZXNwb25zZSA9IDA7CisJZm9yIChjb3VudCA9IDA7IChjb3VudCA8IFVTQl9DT01NQU5EX1RJTUVPVVQpICYmICghZ290X3Jlc3BvbnNlKTsgY291bnQrKykgeworCQltZGVsYXkoMSk7CisJCWlmIChhdG9taWNfcmVhZCAoJnVzYl9wY3dkLT5jbWRfcmVjZWl2ZWQpKQorCQkJZ290X3Jlc3BvbnNlID0gMTsKKwl9CisKKwlpZiAoKGdvdF9yZXNwb25zZSkgJiYgKGNtZCA9PSB1c2JfcGN3ZC0+Y21kX2NvbW1hbmQpKSB7CisJCS8qIHJlYWQgYmFjayByZXNwb25zZSAqLworCQkqbXNiID0gdXNiX3Bjd2QtPmNtZF9kYXRhX21zYjsKKwkJKmxzYiA9IHVzYl9wY3dkLT5jbWRfZGF0YV9sc2I7CisJfQorCisJcmV0dXJuIGdvdF9yZXNwb25zZTsKK30KKworc3RhdGljIGludCB1c2JfcGN3ZF9zdGFydChzdHJ1Y3QgdXNiX3Bjd2RfcHJpdmF0ZSAqdXNiX3Bjd2QpCit7CisJdW5zaWduZWQgY2hhciBtc2IgPSAweDAwOworCXVuc2lnbmVkIGNoYXIgbHNiID0gMHgwMDsKKwlpbnQgcmV0dmFsOworCisJLyogRW5hYmxlIFdhdGNoZG9nICovCisJcmV0dmFsID0gdXNiX3Bjd2Rfc2VuZF9jb21tYW5kKHVzYl9wY3dkLCBDTURfRU5BQkxFX1dBVENIRE9HLCAmbXNiLCAmbHNiKTsKKworCWlmICgocmV0dmFsID09IDApIHx8IChsc2IgPT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FyZCBkaWQgbm90IGFja25vd2xlZGdlIGVuYWJsZSBhdHRlbXB0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYl9wY3dkX3N0b3Aoc3RydWN0IHVzYl9wY3dkX3ByaXZhdGUgKnVzYl9wY3dkKQoreworCXVuc2lnbmVkIGNoYXIgbXNiID0gMHhBNTsKKwl1bnNpZ25lZCBjaGFyIGxzYiA9IDB4QzM7CisJaW50IHJldHZhbDsKKworCS8qIERpc2FibGUgV2F0Y2hkb2cgKi8KKwlyZXR2YWwgPSB1c2JfcGN3ZF9zZW5kX2NvbW1hbmQodXNiX3Bjd2QsIENNRF9ESVNBQkxFX1dBVENIRE9HLCAmbXNiLCAmbHNiKTsKKworCWlmICgocmV0dmFsID09IDApIHx8IChsc2IgIT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FyZCBkaWQgbm90IGFja25vd2xlZGdlIGRpc2FibGUgYXR0ZW1wdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfcGN3ZF9rZWVwYWxpdmUoc3RydWN0IHVzYl9wY3dkX3ByaXZhdGUgKnVzYl9wY3dkKQoreworCXVuc2lnbmVkIGNoYXIgZHVtbXk7CisKKwkvKiBSZS10cmlnZ2VyIFdhdGNoZG9nICovCisJdXNiX3Bjd2Rfc2VuZF9jb21tYW5kKHVzYl9wY3dkLCBDTURfVFJJR0dFUiwgJmR1bW15LCAmZHVtbXkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX3Bjd2Rfc2V0X2hlYXJ0YmVhdChzdHJ1Y3QgdXNiX3Bjd2RfcHJpdmF0ZSAqdXNiX3Bjd2QsIGludCB0KQoreworCXVuc2lnbmVkIGNoYXIgbXNiID0gdCAvIDI1NjsKKwl1bnNpZ25lZCBjaGFyIGxzYiA9IHQgJSAyNTY7CisKKwlpZiAoKHQgPCAweDAwMDEpIHx8ICh0ID4gMHhGRkZGKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBXcml0ZSBuZXcgaGVhcnRiZWF0IHRvIHdhdGNoZG9nICovCisJdXNiX3Bjd2Rfc2VuZF9jb21tYW5kKHVzYl9wY3dkLCBDTURfV1JJVEVfV0FUQ0hET0dfVElNRU9VVCwgJm1zYiwgJmxzYik7CisKKwloZWFydGJlYXQgPSB0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYl9wY3dkX2dldF90ZW1wZXJhdHVyZShzdHJ1Y3QgdXNiX3Bjd2RfcHJpdmF0ZSAqdXNiX3Bjd2QsIGludCAqdGVtcGVyYXR1cmUpCit7CisJdW5zaWduZWQgY2hhciBtc2IsIGxzYjsKKworCXVzYl9wY3dkX3NlbmRfY29tbWFuZCh1c2JfcGN3ZCwgQ01EX1JFQURfVEVNUCwgJm1zYiwgJmxzYik7CisKKwkvKgorCSAqIENvbnZlcnQgY2Vsc2l1cyB0byBmYWhyZW5oZWl0LCBzaW5jZSB0aGlzIHdhcworCSAqIHRoZSBkZWNpZGVkICdzdGFuZGFyZCcgZm9yIHRoaXMgcmV0dXJuIHZhbHVlLgorCSAqLworCSp0ZW1wZXJhdHVyZSA9IChsc2IgKiA5IC8gNSkgKyAzMjsKKworCXJldHVybiAwOworfQorCisvKgorICoJL2Rldi93YXRjaGRvZyBoYW5kbGluZworICovCisKK3N0YXRpYyBzc2l6ZV90IHVzYl9wY3dkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCSAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwkvKiBTZWUgaWYgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgJ1YnIGFuZCByZWxvYWQgdGhlIHRpbWVyICovCisJaWYgKGxlbikgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogbm90ZToganVzdCBpbiBjYXNlIHNvbWVvbmUgd3JvdGUgdGhlIG1hZ2ljIGNoYXJhY3RlcgorCQkJICogZml2ZSBtb250aHMgYWdvLi4uICovCisJCQlleHBlY3RfcmVsZWFzZSA9IDA7CisKKwkJCS8qIHNjYW4gdG8gc2VlIHdoZXRoZXIgb3Igbm90IHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICovCisJCQlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmKGdldF91c2VyKGMsIGRhdGEraSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJZXhwZWN0X3JlbGVhc2UgPSA0MjsKKwkJCX0KKwkJfQorCisJCS8qIHNvbWVvbmUgd3JvdGUgdG8gdXMsIHdlIHNob3VsZCByZWxvYWQgdGhlIHRpbWVyICovCisJCXVzYl9wY3dkX2tlZXBhbGl2ZSh1c2JfcGN3ZF9kZXZpY2UpOworCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHVzYl9wY3dkX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zID0JCVdESU9GX0tFRVBBTElWRVBJTkcgfAorCQkJCQlXRElPRl9TRVRUSU1FT1VUIHwKKwkJCQkJV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPQkxLAorCQkuaWRlbnRpdHkgPQkJRFJJVkVSX05BTUUsCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LAorCQkJCXNpemVvZiAoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwkJY2FzZSBXRElPQ19HRVRURU1QOgorCQl7CisJCQlpbnQgdGVtcGVyYXR1cmU7CisKKwkJCWlmICh1c2JfcGN3ZF9nZXRfdGVtcGVyYXR1cmUodXNiX3Bjd2RfZGV2aWNlLCAmdGVtcGVyYXR1cmUpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXR1cm4gcHV0X3VzZXIodGVtcGVyYXR1cmUsIHApOworCQl9CisKKwkJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCQl1c2JfcGN3ZF9rZWVwYWxpdmUodXNiX3Bjd2RfZGV2aWNlKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJeworCQkJaW50IG5ld19vcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOworCisJCQlpZiAoZ2V0X3VzZXIgKG5ld19vcHRpb25zLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKG5ld19vcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCQl1c2JfcGN3ZF9zdG9wKHVzYl9wY3dkX2RldmljZSk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJaWYgKG5ld19vcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJCXVzYl9wY3dkX3N0YXJ0KHVzYl9wY3dkX2RldmljZSk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCisJCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJeworCQkJaW50IG5ld19oZWFydGJlYXQ7CisKKwkJCWlmIChnZXRfdXNlcihuZXdfaGVhcnRiZWF0LCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHVzYl9wY3dkX3NldF9oZWFydGJlYXQodXNiX3Bjd2RfZGV2aWNlLCBuZXdfaGVhcnRiZWF0KSkKKwkJCSAgICByZXR1cm4gLUVJTlZBTDsKKworCQkJdXNiX3Bjd2Rfa2VlcGFsaXZlKHVzYl9wY3dkX2RldmljZSk7CisJCQkvKiBGYWxsICovCisJCX0KKworCQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCQlyZXR1cm4gcHV0X3VzZXIoaGVhcnRiZWF0LCBwKTsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdXNiX3Bjd2Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiAvZGV2L3dhdGNoZG9nIGNhbiBvbmx5IGJlIG9wZW5lZCBvbmNlICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmlzX2FjdGl2ZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBBY3RpdmF0ZSAqLworCXVzYl9wY3dkX3N0YXJ0KHVzYl9wY3dkX2RldmljZSk7CisJdXNiX3Bjd2Rfa2VlcGFsaXZlKHVzYl9wY3dkX2RldmljZSk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHVzYl9wY3dkX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyoKKwkgKiAgICAgIFNodXQgb2ZmIHRoZSB0aW1lci4KKwkgKi8KKwlpZiAoZXhwZWN0X3JlbGVhc2UgPT0gNDIpIHsKKwkJdXNiX3Bjd2Rfc3RvcCh1c2JfcGN3ZF9kZXZpY2UpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJdXNiX3Bjd2Rfa2VlcGFsaXZlKHVzYl9wY3dkX2RldmljZSk7CisJfQorCWV4cGVjdF9yZWxlYXNlID0gMDsKKwljbGVhcl9iaXQoMCwgJmlzX2FjdGl2ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgkvZGV2L3RlbXBlcmF0dXJlIGhhbmRsaW5nCisgKi8KKworc3RhdGljIHNzaXplX3QgdXNiX3Bjd2RfdGVtcGVyYXR1cmVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmRhdGEsCisJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCWludCB0ZW1wZXJhdHVyZTsKKworCWlmICh1c2JfcGN3ZF9nZXRfdGVtcGVyYXR1cmUodXNiX3Bjd2RfZGV2aWNlLCAmdGVtcGVyYXR1cmUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJnRlbXBlcmF0dXJlLCAxKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1c2JfcGN3ZF90ZW1wZXJhdHVyZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCB1c2JfcGN3ZF90ZW1wZXJhdHVyZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCisvKgorICoJTm90aWZ5IHN5c3RlbQorICovCisKK3N0YXRpYyBpbnQgdXNiX3Bjd2Rfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlPT1TWVNfRE9XTiB8fCBjb2RlPT1TWVNfSEFMVCkgeworCQkvKiBUdXJuIHRoZSBXRFQgb2ZmICovCisJCXVzYl9wY3dkX3N0b3AodXNiX3Bjd2RfZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglLZXJuZWwgSW50ZXJmYWNlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzYl9wY3dkX2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLmxsc2VlayA9CW5vX2xsc2VlaywKKwkud3JpdGUgPQl1c2JfcGN3ZF93cml0ZSwKKwkuaW9jdGwgPQl1c2JfcGN3ZF9pb2N0bCwKKwkub3BlbiA9CQl1c2JfcGN3ZF9vcGVuLAorCS5yZWxlYXNlID0JdXNiX3Bjd2RfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB1c2JfcGN3ZF9taXNjZGV2ID0geworCS5taW5vciA9CVdBVENIRE9HX01JTk9SLAorCS5uYW1lID0JCSJ3YXRjaGRvZyIsCisJLmZvcHMgPQkJJnVzYl9wY3dkX2ZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2JfcGN3ZF90ZW1wZXJhdHVyZV9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5sbHNlZWsgPQlub19sbHNlZWssCisJLnJlYWQgPQkJdXNiX3Bjd2RfdGVtcGVyYXR1cmVfcmVhZCwKKwkub3BlbiA9CQl1c2JfcGN3ZF90ZW1wZXJhdHVyZV9vcGVuLAorCS5yZWxlYXNlID0JdXNiX3Bjd2RfdGVtcGVyYXR1cmVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB1c2JfcGN3ZF90ZW1wZXJhdHVyZV9taXNjZGV2ID0geworCS5taW5vciA9CVRFTVBfTUlOT1IsCisJLm5hbWUgPQkJInRlbXBlcmF0dXJlIiwKKwkuZm9wcyA9CQkmdXNiX3Bjd2RfdGVtcGVyYXR1cmVfZm9wcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdXNiX3Bjd2Rfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPQl1c2JfcGN3ZF9ub3RpZnlfc3lzLAorfTsKKworLyoqCisgKgl1c2JfcGN3ZF9kZWxldGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVzYl9wY3dkX2RlbGV0ZSAoc3RydWN0IHVzYl9wY3dkX3ByaXZhdGUgKnVzYl9wY3dkKQoreworCWlmICh1c2JfcGN3ZC0+aW50cl91cmIgIT0gTlVMTCkKKwkJdXNiX2ZyZWVfdXJiICh1c2JfcGN3ZC0+aW50cl91cmIpOworCWlmICh1c2JfcGN3ZC0+aW50cl9idWZmZXIgIT0gTlVMTCkKKwkJdXNiX2J1ZmZlcl9mcmVlKHVzYl9wY3dkLT51ZGV2LCB1c2JfcGN3ZC0+aW50cl9zaXplLAorCQkJCXVzYl9wY3dkLT5pbnRyX2J1ZmZlciwgdXNiX3Bjd2QtPmludHJfZG1hKTsKKwlrZnJlZSAodXNiX3Bjd2QpOworfQorCisvKioKKyAqCXVzYl9wY3dkX3Byb2JlCisgKgorICoJQ2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIGEgbmV3IGRldmljZSBpcyBjb25uZWN0ZWQgdGhhdCBpdCB0aGlua3MKKyAqCXRoaXMgZHJpdmVyIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4uCisgKi8KK3N0YXRpYyBpbnQgdXNiX3Bjd2RfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKwlzdHJ1Y3QgdXNiX3Bjd2RfcHJpdmF0ZSAqdXNiX3Bjd2QgPSBOVUxMOworCWludCBwaXBlLCBtYXhwOworCWludCByZXR2YWwgPSAtRU5PTUVNOworCWludCBnb3RfZndfcmV2OworCXVuc2lnbmVkIGNoYXIgZndfcmV2X21ham9yLCBmd19yZXZfbWlub3I7CisJY2hhciBmd192ZXJfc3RyWzIwXTsKKwl1bnNpZ25lZCBjaGFyIG9wdGlvbl9zd2l0Y2hlcywgZHVtbXk7CisKKwljYXJkc19mb3VuZCsrOworCWlmIChjYXJkc19mb3VuZCA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyAxIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGdldCB0aGUgYWN0aXZlIGludGVyZmFjZSBkZXNjcmlwdG9yICovCisJaWZhY2VfZGVzYyA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CisKKwkvKiBjaGVjayBvdXQgdGhhdCB3ZSBoYXZlIGEgSElEIGRldmljZSAqLworCWlmICghKGlmYWNlX2Rlc2MtPmRlc2MuYkludGVyZmFjZUNsYXNzID09IFVTQl9DTEFTU19ISUQpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlRoZSBkZXZpY2UgaXNuJ3QgYSBIdW1hbiBJbnRlcmZhY2UgRGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogY2hlY2sgb3V0IHRoZSBlbmRwb2ludDogaXQgaGFzIHRvIGJlIEludGVycnVwdCAmIElOICovCisJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbMF0uZGVzYzsKKworCWlmICghKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pICYmCisJICAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykKKwkJCQk9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpKSkgeworCQkvKiB3ZSBkaWRuJ3QgZmluZCBhIEludGVycnVwdCBlbmRwb2ludCB3aXRoIGRpcmVjdGlvbiBJTiAqLworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZG4ndCBmaW5kIGFuIElOVFIgJiBJTiBlbmRwb2ludFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGdldCBhIGhhbmRsZSB0byB0aGUgaW50ZXJydXB0IGRhdGEgcGlwZSAqLworCXBpcGUgPSB1c2JfcmN2aW50cGlwZSh1ZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7CisJbWF4cCA9IHVzYl9tYXhwYWNrZXQodWRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIGFuZCBpbml0aWFsaXplIGl0ICovCisJdXNiX3Bjd2QgPSBrbWFsbG9jIChzaXplb2Yoc3RydWN0IHVzYl9wY3dkX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAodXNiX3Bjd2QgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJbWVtc2V0ICh1c2JfcGN3ZCwgMHgwMCwgc2l6ZW9mICgqdXNiX3Bjd2QpKTsKKworCXVzYl9wY3dkX2RldmljZSA9IHVzYl9wY3dkOworCisJaW5pdF9NVVRFWCAoJnVzYl9wY3dkLT5zZW0pOworCXVzYl9wY3dkLT51ZGV2ID0gdWRldjsKKwl1c2JfcGN3ZC0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOworCXVzYl9wY3dkLT5pbnRlcmZhY2VfbnVtYmVyID0gaWZhY2VfZGVzYy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCXVzYl9wY3dkLT5pbnRyX3NpemUgPSAobGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSA+IDggPyBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpIDogOCk7CisKKwkvKiBzZXQgdXAgdGhlIG1lbW9yeSBidWZmZXIncyAqLworCWlmICghKHVzYl9wY3dkLT5pbnRyX2J1ZmZlciA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgdXNiX3Bjd2QtPmludHJfc2l6ZSwgU0xBQl9BVE9NSUMsICZ1c2JfcGN3ZC0+aW50cl9kbWEpKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBhbGxvY2F0ZSB0aGUgdXJiJ3MgKi8KKwl1c2JfcGN3ZC0+aW50cl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghdXNiX3Bjd2QtPmludHJfdXJiKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIk91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIGluaXRpYWxpc2UgdGhlIGludHIgdXJiJ3MgKi8KKwl1c2JfZmlsbF9pbnRfdXJiKHVzYl9wY3dkLT5pbnRyX3VyYiwgdWRldiwgcGlwZSwKKwkJCXVzYl9wY3dkLT5pbnRyX2J1ZmZlciwgdXNiX3Bjd2QtPmludHJfc2l6ZSwKKwkJCXVzYl9wY3dkX2ludHJfZG9uZSwgdXNiX3Bjd2QsIGVuZHBvaW50LT5iSW50ZXJ2YWwpOworCXVzYl9wY3dkLT5pbnRyX3VyYi0+dHJhbnNmZXJfZG1hID0gdXNiX3Bjd2QtPmludHJfZG1hOworCXVzYl9wY3dkLT5pbnRyX3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKwkvKiByZWdpc3RlciBvdXIgaW50ZXJydXB0IFVSQiB3aXRoIHRoZSBVU0Igc3lzdGVtICovCisJaWYgKHVzYl9zdWJtaXRfdXJiKHVzYl9wY3dkLT5pbnRyX3VyYiwgR0ZQX0tFUk5FTCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUHJvYmxlbSByZWdpc3RlcmluZyBpbnRlcnJ1cHQgVVJCXG4iKTsKKwkJcmV0dmFsID0gLUVJTzsgLyogZmFpbHVyZSAqLworCQlnb3RvIGVycm9yOworCX0KKworCS8qIFRoZSBkZXZpY2UgZXhpc3RzIGFuZCBjYW4gYmUgY29tbXVuaWNhdGVkIHdpdGggKi8KKwl1c2JfcGN3ZC0+ZXhpc3RzID0gMTsKKworCS8qIGRpc2FibGUgY2FyZCAqLworCXVzYl9wY3dkX3N0b3AodXNiX3Bjd2QpOworCisJLyogR2V0IHRoZSBGaXJtd2FyZSBWZXJzaW9uICovCisJZ290X2Z3X3JldiA9IHVzYl9wY3dkX3NlbmRfY29tbWFuZCh1c2JfcGN3ZCwgQ01EX0dFVF9GSVJNV0FSRV9WRVJTSU9OLCAmZndfcmV2X21ham9yLCAmZndfcmV2X21pbm9yKTsKKwlpZiAoZ290X2Z3X3JldikgeworCQlzcHJpbnRmKGZ3X3Zlcl9zdHIsICIldS4lMDJ1IiwgZndfcmV2X21ham9yLCBmd19yZXZfbWlub3IpOworCX0gZWxzZSB7CisJCXNwcmludGYoZndfdmVyX3N0ciwgIjxjYXJkIG5vIGFuc3dlcj4iKTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiRm91bmQgY2FyZCAoRmlybXdhcmU6ICVzKSB3aXRoIHRlbXAgb3B0aW9uXG4iLAorCQlmd192ZXJfc3RyKTsKKworCS8qIEdldCBzd2l0Y2ggc2V0dGluZ3MgKi8KKwl1c2JfcGN3ZF9zZW5kX2NvbW1hbmQodXNiX3Bjd2QsIENNRF9HRVRfRElQX1NXSVRDSF9TRVRUSU5HUywgJmR1bW15LCAmb3B0aW9uX3N3aXRjaGVzKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJPcHRpb24gc3dpdGNoZXMgKDB4JTAyeCk6IFRlbXBlcmF0dXJlIFJlc2V0IEVuYWJsZT0lcywgUG93ZXIgT24gRGVsYXk9JXNcbiIsCisJCW9wdGlvbl9zd2l0Y2hlcywKKwkJKChvcHRpb25fc3dpdGNoZXMgJiAweDEwKSA/ICJPTiIgOiAiT0ZGIiksCisJCSgob3B0aW9uX3N3aXRjaGVzICYgMHgwOCkgPyAiT04iIDogIk9GRiIpKTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGhlYXJ0YmVhdCB2YWx1ZSBpcyB3aXRoaW4gaXQncyByYW5nZSA7IGlmIG5vdCByZXNldCB0byB0aGUgZGVmYXVsdCAqLworCWlmICh1c2JfcGN3ZF9zZXRfaGVhcnRiZWF0KHVzYl9wY3dkLCBoZWFydGJlYXQpKSB7CisJCXVzYl9wY3dkX3NldF9oZWFydGJlYXQodXNiX3Bjd2QsIFdBVENIRE9HX0hFQVJUQkVBVCk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJoZWFydGJlYXQgdmFsdWUgbXVzdCBiZSAwPGhlYXJ0YmVhdDw2NTUzNiwgdXNpbmcgJWRcbiIsCisJCQlXQVRDSERPR19IRUFSVEJFQVQpOworCX0KKworCXJldHZhbCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmdXNiX3Bjd2Rfbm90aWZpZXIpOworCWlmIChyZXR2YWwgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAorCQkJcmV0dmFsKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR2YWwgPSBtaXNjX3JlZ2lzdGVyKCZ1c2JfcGN3ZF90ZW1wZXJhdHVyZV9taXNjZGV2KTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlURU1QX01JTk9SLCByZXR2YWwpOworCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9yZWJvb3Q7CisJfQorCisJcmV0dmFsID0gbWlzY19yZWdpc3RlcigmdXNiX3Bjd2RfbWlzY2Rldik7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldHZhbCk7CisJCWdvdG8gZXJyX291dF9taXNjX2RlcmVnaXN0ZXI7CisJfQorCisJLyogd2UgY2FuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm93LCBhcyBpdCBpcyByZWFkeSAqLworCXVzYl9zZXRfaW50ZmRhdGEgKGludGVyZmFjZSwgdXNiX3Bjd2QpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkLiBoZWFydGJlYXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCisJCWhlYXJ0YmVhdCwgbm93YXlvdXQpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfbWlzY19kZXJlZ2lzdGVyOgorCW1pc2NfZGVyZWdpc3RlcigmdXNiX3Bjd2RfdGVtcGVyYXR1cmVfbWlzY2Rldik7CitlcnJfb3V0X3VucmVnaXN0ZXJfcmVib290OgorCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ1c2JfcGN3ZF9ub3RpZmllcik7CitlcnJvcjoKKwl1c2JfcGN3ZF9kZWxldGUgKHVzYl9wY3dkKTsKKwl1c2JfcGN3ZF9kZXZpY2UgPSBOVUxMOworCXJldHVybiByZXR2YWw7Cit9CisKKworLyoqCisgKgl1c2JfcGN3ZF9kaXNjb25uZWN0CisgKgorICoJQ2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0uCisgKgorICoJVGhpcyByb3V0aW5lIGd1YXJhbnRlZXMgdGhhdCB0aGUgZHJpdmVyIHdpbGwgbm90IHN1Ym1pdCBhbnkgbW9yZSB1cmJzCisgKglieSBjbGVhcmluZyBkZXYtPnVkZXYuCisgKi8KK3N0YXRpYyB2b2lkIHVzYl9wY3dkX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlzdHJ1Y3QgdXNiX3Bjd2RfcHJpdmF0ZSAqdXNiX3Bjd2Q7CisKKwkvKiBwcmV2ZW50IHJhY2VzIHdpdGggb3BlbigpICovCisJZG93biAoJmRpc2Nvbm5lY3Rfc2VtKTsKKworCXVzYl9wY3dkID0gdXNiX2dldF9pbnRmZGF0YSAoaW50ZXJmYWNlKTsKKwl1c2Jfc2V0X2ludGZkYXRhIChpbnRlcmZhY2UsIE5VTEwpOworCisJZG93biAoJnVzYl9wY3dkLT5zZW0pOworCisJLyogU3RvcCB0aGUgdGltZXIgYmVmb3JlIHdlIGxlYXZlICovCisJaWYgKCFub3dheW91dCkKKwkJdXNiX3Bjd2Rfc3RvcCh1c2JfcGN3ZCk7CisKKwkvKiBXZSBzaG91bGQgbm93IHN0b3AgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBVU0IgUENXRCBkZXZpY2UgKi8KKwl1c2JfcGN3ZC0+ZXhpc3RzID0gMDsKKworCS8qIERlcmVnaXN0ZXIgKi8KKwltaXNjX2RlcmVnaXN0ZXIoJnVzYl9wY3dkX21pc2NkZXYpOworCW1pc2NfZGVyZWdpc3RlcigmdXNiX3Bjd2RfdGVtcGVyYXR1cmVfbWlzY2Rldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnVzYl9wY3dkX25vdGlmaWVyKTsKKworCXVwICgmdXNiX3Bjd2QtPnNlbSk7CisKKwkvKiBEZWxldGUgdGhlIFVTQiBQQ1dEIGRldmljZSAqLworCXVzYl9wY3dkX2RlbGV0ZSh1c2JfcGN3ZCk7CisKKwljYXJkc19mb3VuZC0tOworCisJdXAgKCZkaXNjb25uZWN0X3NlbSk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiVVNCIFBDIFdhdGNoZG9nIGRpc2Nvbm5lY3RlZFxuIik7Cit9CisKKworCisvKioKKyAqCXVzYl9wY3dkX2luaXQKKyAqLworc3RhdGljIGludCBfX2luaXQgdXNiX3Bjd2RfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisKKwkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZ1c2JfcGN3ZF9kcml2ZXIpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkXG4iLAorCQkgICAgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCBEUklWRVJfREVTQyAiIHYiIERSSVZFUl9WRVJTSU9OICIgKCIgRFJJVkVSX0RBVEUgIilcbiIpOworCXJldHVybiAwOworfQorCisKKy8qKgorICoJdXNiX3Bjd2RfZXhpdAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgdXNiX3Bjd2RfZXhpdCh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZ1c2JfcGN3ZF9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0ICh1c2JfcGN3ZF9pbml0KTsKK21vZHVsZV9leGl0ICh1c2JfcGN3ZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zM2MyNDEwX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY5OWQyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCkBAIC0wLDAgKzEsNTE2IEBACisvKiBsaW51eC9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MyNDEwIFdhdGNoZG9nIFRpbWVyIFN1cHBvcnQKKyAqCisgKiBCYXNlZCBvbiwgc29mdGRvZy5jIGJ5IEFsYW4gQ294LAorICogICAgIChjKSBDb3B5cmlnaHQgMTk5NiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiBDaGFuZ2Vsb2c6CisgKgkwNS1PY3QtMjAwNAlCSkQJQWRkZWQgc2VtYXBob3JlIGluaXQgdG8gc3RvcCBjcmFzaGVzIG9uIG9wZW4KKyAqCQkJCUZpeGVkIHRtcl9jb3VudCAvIHdkdF9jb3VudCBjb25mdXNpb24KKyAqCQkJCUFkZGVkIGNvbmZpZ3VyYWJsZSBkZWJ1ZworICoKKyAqCTExLUphbi0yMDA0CUJKRAlGaXhlZCBkaXZpZGUtYnktMiBpbiB0aW1lb3V0IGNvZGUKKyAqCisgKgkxMC1NYXItMjAwNQlMQ1ZSCUNoYW5nZWQgUzNDMjQxMF9WQSB0byBTM0MyNFhYX1ZBCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KKworI3VuZGVmIFMzQzI0WFhfVkFfV0FUQ0hET0cKKyNkZWZpbmUgUzNDMjRYWF9WQV9XQVRDSERPRyAoMCkKKworI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3Mtd2F0Y2hkb2cuaD4KKworI2RlZmluZSBQRlggInMzYzI0MTAtd2R0OiAiCisKKyNkZWZpbmUgQ09ORklHX1MzQzI0MTBfV0FUQ0hET0dfQVRCT09UCQkoMCkKKyNkZWZpbmUgQ09ORklHX1MzQzI0MTBfV0FUQ0hET0dfREVGQVVMVF9USU1FCSgxNSkKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworc3RhdGljIGludCB0bXJfbWFyZ2luCT0gQ09ORklHX1MzQzI0MTBfV0FUQ0hET0dfREVGQVVMVF9USU1FOworc3RhdGljIGludCB0bXJfYXRib290CT0gQ09ORklHX1MzQzI0MTBfV0FUQ0hET0dfQVRCT09UOworc3RhdGljIGludCBzb2Z0X25vYm9vdAk9IDA7CitzdGF0aWMgaW50IGRlYnVnCT0gMDsKKworbW9kdWxlX3BhcmFtKHRtcl9tYXJnaW4sICBpbnQsIDApOworbW9kdWxlX3BhcmFtKHRtcl9hdGJvb3QsICBpbnQsIDApOworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCAgICBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNvZnRfbm9ib290LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnLAkgIGludCwgMCk7CisKK01PRFVMRV9QQVJNX0RFU0ModG1yX21hcmdpbiwgIldhdGNoZG9nIHRtcl9tYXJnaW4gaW4gc2Vjb25kcy4gZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhDT05GSUdfUzNDMjQxMF9XQVRDSERPR19ERUZBVUxUX1RJTUUpICIpIik7CisKK01PRFVMRV9QQVJNX0RFU0ModG1yX2F0Ym9vdCwgIldhdGNoZG9nIGlzIHN0YXJ0ZWQgYXQgYm9vdCB0aW1lIGlmIHNldCB0byAxLCBkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKENPTkZJR19TM0MyNDEwX1dBVENIRE9HX0FUQk9PVCkpOworCitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworTU9EVUxFX1BBUk1fREVTQyhzb2Z0X25vYm9vdCwgIldhdGNoZG9nIGFjdGlvbiwgc2V0IHRvIDEgdG8gaWdub3JlIHJlYm9vdHMsIDAgdG8gcmVib290IChkZWZhdWx0IGRlcGVuZHMgb24gT05MWV9URVNUSU5HKSIpOworCitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiV2F0Y2hkb2cgZGVidWcsIHNldCB0byA+MSBmb3IgZGVidWcsIChkZWZhdWx0IDApIik7CisKKwordHlwZWRlZiBlbnVtIGNsb3NlX3N0YXRlIHsKKwlDTE9TRV9TVEFURV9OT1QsCisJQ0xPU0VfU1RBVEVfQUxMT1c9MHg0MDIxCit9IGNsb3NlX3N0YXRlX3Q7CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKG9wZW5fbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UJKndkdF9tZW07CitzdGF0aWMgc3RydWN0IHJlc291cmNlCSp3ZHRfaXJxOworc3RhdGljIHN0cnVjdCBjbGsJKndkdF9jbG9jazsKK3N0YXRpYyB2b2lkIF9faW9tZW0JKndkdF9iYXNlOworc3RhdGljIHVuc2lnbmVkIGludAkgd2R0X2NvdW50Oworc3RhdGljIGNsb3NlX3N0YXRlX3QJIGFsbG93X2Nsb3NlOworCisvKiB3YXRjaGRvZyBjb250cm9sIHJvdXRpbmVzICovCisKKyNkZWZpbmUgREJHKG1zZy4uLikgZG8geyBcCisJaWYgKGRlYnVnKSBcCisJCXByaW50ayhLRVJOX0lORk8gbXNnKTsgXAorCX0gd2hpbGUoMCkKKworLyogZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgczNjMjQxMHdkdF9rZWVwYWxpdmUodm9pZCkKK3sKKwl3cml0ZWwod2R0X2NvdW50LCB3ZHRfYmFzZSArIFMzQzI0MTBfV1RDTlQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0MTB3ZHRfc3RvcCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgd3Rjb247CisKKwl3dGNvbiA9IHJlYWRsKHdkdF9iYXNlICsgUzNDMjQxMF9XVENPTik7CisJd3Rjb24gJj0gfihTM0MyNDEwX1dUQ09OX0VOQUJMRSB8IFMzQzI0MTBfV1RDT05fUlNURU4pOworCXdyaXRlbCh3dGNvbiwgd2R0X2Jhc2UgKyBTM0MyNDEwX1dUQ09OKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0MTB3ZHRfc3RhcnQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHd0Y29uOworCisJczNjMjQxMHdkdF9zdG9wKCk7CisKKwl3dGNvbiA9IHJlYWRsKHdkdF9iYXNlICsgUzNDMjQxMF9XVENPTik7CisJd3Rjb24gfD0gUzNDMjQxMF9XVENPTl9FTkFCTEUgfCBTM0MyNDEwX1dUQ09OX0RJVjEyODsKKworCWlmIChzb2Z0X25vYm9vdCkgeworCQl3dGNvbiB8PSBTM0MyNDEwX1dUQ09OX0lOVEVOOworCQl3dGNvbiAmPSB+UzNDMjQxMF9XVENPTl9SU1RFTjsKKwl9IGVsc2UgeworCQl3dGNvbiAmPSB+UzNDMjQxMF9XVENPTl9JTlRFTjsKKwkJd3Rjb24gfD0gUzNDMjQxMF9XVENPTl9SU1RFTjsKKwl9CisKKwlEQkcoIiVzOiB3ZHRfY291bnQ9MHglMDh4LCB3dGNvbj0lMDhseFxuIiwKKwkgICAgX19GVU5DVElPTl9fLCB3ZHRfY291bnQsIHd0Y29uKTsKKworCXdyaXRlbCh3ZHRfY291bnQsIHdkdF9iYXNlICsgUzNDMjQxMF9XVERBVCk7CisJd3JpdGVsKHdkdF9jb3VudCwgd2R0X2Jhc2UgKyBTM0MyNDEwX1dUQ05UKTsKKwl3cml0ZWwod3Rjb24sIHdkdF9iYXNlICsgUzNDMjQxMF9XVENPTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNDEwd2R0X3NldF9oZWFydGJlYXQoaW50IHRpbWVvdXQpCit7CisJdW5zaWduZWQgaW50IGZyZXEgPSBjbGtfZ2V0X3JhdGUod2R0X2Nsb2NrKTsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IGRpdmlzb3IgPSAxOworCXVuc2lnbmVkIGxvbmcgd3Rjb247CisKKwlpZiAodGltZW91dCA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJZnJlcSAvPSAxMjg7CisJY291bnQgPSB0aW1lb3V0ICogZnJlcTsKKworCURCRygiJXM6IGNvdW50PSVkLCB0aW1lb3V0PSVkLCBmcmVxPSVkXG4iLAorCSAgICBfX0ZVTkNUSU9OX18sIGNvdW50LCB0aW1lb3V0LCBmcmVxKTsKKworCS8qIGlmIHRoZSBjb3VudCBpcyBiaWdnZXIgdGhhbiB0aGUgd2F0Y2hkb2cgcmVnaXN0ZXIsCisJICAgdGhlbiB3b3JrIG91dCB3aGF0IHdlIG5lZWQgdG8gZG8gKGFuZCBpZikgd2UgY2FuCisJICAgYWN0dWFsbHkgbWFrZSB0aGlzIHZhbHVlCisJKi8KKworCWlmIChjb3VudCA+PSAweDEwMDAwKSB7CisJCWZvciAoZGl2aXNvciA9IDE7IGRpdmlzb3IgPD0gMHgxMDA7IGRpdmlzb3IrKykgeworCQkJaWYgKChjb3VudCAvIGRpdmlzb3IpIDwgMHgxMDAwMCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmICgoY291bnQgLyBkaXZpc29yKSA+PSAweDEwMDAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0aW1lb3V0ICVkIHRvbyBiaWdcbiIsIHRpbWVvdXQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwl0bXJfbWFyZ2luID0gdGltZW91dDsKKworCURCRygiJXM6IHRpbWVvdXQ9JWQsIGRpdmlzb3I9JWQsIGNvdW50PSVkICglMDh4KVxuIiwKKwkgICAgX19GVU5DVElPTl9fLCB0aW1lb3V0LCBkaXZpc29yLCBjb3VudCwgY291bnQvZGl2aXNvcik7CisKKwljb3VudCAvPSBkaXZpc29yOworCXdkdF9jb3VudCA9IGNvdW50OworCisJLyogdXBkYXRlIHRoZSBwcmUtc2NhbGVyICovCisJd3Rjb24gPSByZWFkbCh3ZHRfYmFzZSArIFMzQzI0MTBfV1RDT04pOworCXd0Y29uICY9IH5TM0MyNDEwX1dUQ09OX1BSRVNDQUxFX01BU0s7CisJd3Rjb24gfD0gUzNDMjQxMF9XVENPTl9QUkVTQ0FMRShkaXZpc29yLTEpOworCisJd3JpdGVsKGNvdW50LCB3ZHRfYmFzZSArIFMzQzI0MTBfV1REQVQpOworCXdyaXRlbCh3dGNvbiwgd2R0X2Jhc2UgKyBTM0MyNDEwX1dUQ09OKTsKKworCXJldHVybiAwOworfQorCisvKgorICoJL2Rldi93YXRjaGRvZyBoYW5kbGluZworICovCisKK3N0YXRpYyBpbnQgczNjMjQxMHdkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmKGRvd25fdHJ5bG9jaygmb3Blbl9sb2NrKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChub3dheW91dCkgeworCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCX0gZWxzZSB7CisJCWFsbG93X2Nsb3NlID0gQ0xPU0VfU1RBVEVfQUxMT1c7CisJfQorCisJLyogc3RhcnQgdGhlIHRpbWVyICovCisJczNjMjQxMHdkdF9zdGFydCgpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBzM2MyNDEwd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyoKKwkgKglTaHV0IG9mZiB0aGUgdGltZXIuCisJICogCUxvY2sgaXQgaW4gaWYgaXQncyBhIG1vZHVsZSBhbmQgd2Ugc2V0IG5vd2F5b3V0CisJICovCisJaWYgKGFsbG93X2Nsb3NlID09IENMT1NFX1NUQVRFX0FMTE9XKSB7CisJCXMzYzI0MTB3ZHRfc3RvcCgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJczNjMjQxMHdkdF9rZWVwYWxpdmUoKTsKKwl9CisKKwlhbGxvd19jbG9zZSA9IENMT1NFX1NUQVRFX05PVDsKKwl1cCgmb3Blbl9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgczNjMjQxMHdkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsCisJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCS8qCisJICoJUmVmcmVzaCB0aGUgdGltZXIuCisJICovCisJaWYobGVuKSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQkvKiBJbiBjYXNlIGl0IHdhcyBzZXQgbG9uZyBhZ28gKi8KKwkJCWFsbG93X2Nsb3NlID0gQ0xPU0VfU1RBVEVfTk9UOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCQkJY2hhciBjOworCisJCQkJaWYgKGdldF91c2VyKGMsIGRhdGEgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlhbGxvd19jbG9zZSA9IENMT1NFX1NUQVRFX0FMTE9XOworCQkJfQorCQl9CisKKwkJczNjMjQxMHdkdF9rZWVwYWxpdmUoKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworI2RlZmluZSBPUFRJT05TIFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfTUFHSUNDTE9TRQorCitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gczNjMjQxMF93ZHRfaWRlbnQgPSB7CisJLm9wdGlvbnMgICAgICAgICAgPSAgICAgT1BUSU9OUywKKwkuZmlybXdhcmVfdmVyc2lvbiA9CTAsCisJLmlkZW50aXR5ICAgICAgICAgPQkiUzNDMjQxMCBXYXRjaGRvZyIsCit9OworCisKK3N0YXRpYyBpbnQgczNjMjQxMHdkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlpbnQgbmV3X21hcmdpbjsKKworCXN3aXRjaCAoY21kKSB7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJnMzYzI0MTBfd2R0X2lkZW50LAorCQkJCXNpemVvZihzM2MyNDEwX3dkdF9pZGVudCkpID8gLUVGQVVMVCA6IDA7CisKKwkJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCXMzYzI0MTB3ZHRfa2VlcGFsaXZlKCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCQlpZiAoZ2V0X3VzZXIobmV3X21hcmdpbiwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChzM2MyNDEwd2R0X3NldF9oZWFydGJlYXQobmV3X21hcmdpbikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXMzYzI0MTB3ZHRfa2VlcGFsaXZlKCk7CisJCQlyZXR1cm4gcHV0X3VzZXIodG1yX21hcmdpbiwgcCk7CisKKwkJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQkJcmV0dXJuIHB1dF91c2VyKHRtcl9tYXJnaW4sIHApOworCX0KK30KKworLyoKKyAqCU5vdGlmaWVyIGZvciBzeXN0ZW0gZG93bgorICovCisKK3N0YXRpYyBpbnQgczNjMjQxMHdkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCQkJICAgICAgdm9pZCAqdW51c2VkKQoreworCWlmKGNvZGU9PVNZU19ET1dOIHx8IGNvZGU9PVNZU19IQUxUKSB7CisJCS8qIFR1cm4gdGhlIFdEVCBvZmYgKi8KKwkJczNjMjQxMHdkdF9zdG9wKCk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoga2VybmVsIGludGVyZmFjZSAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzM2MyNDEwd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBzM2MyNDEwd2R0X3dyaXRlLAorCS5pb2N0bAkJPSBzM2MyNDEwd2R0X2lvY3RsLAorCS5vcGVuCQk9IHMzYzI0MTB3ZHRfb3BlbiwKKwkucmVsZWFzZQk9IHMzYzI0MTB3ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBzM2MyNDEwd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJCT0gJnMzYzI0MTB3ZHRfZm9wcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgczNjMjQxMHdkdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbAk9IHMzYzI0MTB3ZHRfbm90aWZ5X3N5cywKK307CisKKy8qIGludGVycnVwdCBoYW5kbGVyIGNvZGUgKi8KKworc3RhdGljIGlycXJldHVybl90IHMzYzI0MTB3ZHRfaXJxKGludCBpcnFubywgdm9pZCAqcGFyYW0sCisJCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiV2F0Y2hkb2cgdGltZXIgZXhwaXJlZCFcbiIpOworCisJczNjMjQxMHdkdF9rZWVwYWxpdmUoKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisvKiBkZXZpY2UgaW50ZXJmYWNlICovCisKK3N0YXRpYyBpbnQgczNjMjQxMHdkdF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBzdGFydGVkID0gMDsKKwlpbnQgcmV0OworCWludCBzaXplOworCisJREJHKCIlczogcHJvYmU9JXAsIGRldmljZT0lcFxuIiwgX19GVU5DVElPTl9fLCBwZGV2LCBkZXYpOworCisJLyogZ2V0IHRoZSBtZW1vcnkgcmVnaW9uIGZvciB0aGUgd2F0Y2hkb2cgdGltZXIgKi8KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJmYWlsZWQgdG8gZ2V0IG1lbW9yeSByZWdpb24gcmVzb3VjZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXNpemUgPSAocmVzLT5lbmQtcmVzLT5zdGFydCkrMTsKKwl3ZHRfbWVtID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHNpemUsIHBkZXYtPm5hbWUpOworCWlmICh3ZHRfbWVtID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImZhaWxlZCB0byBnZXQgbWVtb3J5IHJlZ2lvblxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXdkdF9iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBzaXplKTsKKwlpZiAod2R0X2Jhc2UgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZmFpbGVkIHRvIGlvcmVtYXAoKSByZWdpb25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlEQkcoInByb2JlOiBtYXBwZWQgd2R0X2Jhc2U9JXBcbiIsIHdkdF9iYXNlKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJmYWlsZWQgdG8gZ2V0IGlycSByZXNvdXJjZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKHJlcy0+c3RhcnQsIHMzYzI0MTB3ZHRfaXJxLCAwLCBwZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZmFpbGVkIHRvIGluc3RhbGwgaXJxICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJd2R0X2Nsb2NrID0gY2xrX2dldChkZXYsICJ3YXRjaGRvZyIpOworCWlmICh3ZHRfY2xvY2sgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZmFpbGVkIHRvIGZpbmQgd2F0Y2hkb2cgY2xvY2sgc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2xrX3VzZSh3ZHRfY2xvY2spOworCWNsa19lbmFibGUod2R0X2Nsb2NrKTsKKworCS8qIHNlZSBpZiB3ZSBjYW4gYWN0dWFsbHkgc2V0IHRoZSByZXF1ZXN0ZWQgdGltZXIgbWFyZ2luLCBhbmQgaWYKKwkgKiBub3QsIHRyeSB0aGUgZGVmYXVsdCB2YWx1ZSAqLworCisJaWYgKHMzYzI0MTB3ZHRfc2V0X2hlYXJ0YmVhdCh0bXJfbWFyZ2luKSkgeworCQlzdGFydGVkID0gczNjMjQxMHdkdF9zZXRfaGVhcnRiZWF0KENPTkZJR19TM0MyNDEwX1dBVENIRE9HX0RFRkFVTFRfVElNRSk7CisKKwkJaWYgKHN0YXJ0ZWQgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInRtcl9tYXJnaW4gdmFsdWUgb3V0IG9mIHJhbmdlLCBkZWZhdWx0ICVkIHVzZWRcbiIsCisJCQkgICAgICAgQ09ORklHX1MzQzI0MTBfV0FUQ0hET0dfREVGQVVMVF9USU1FKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJkZWZhdWx0IHRpbWVyIHZhbHVlIGlzIG91dCBvZiByYW5nZSwgY2Fubm90IHN0YXJ0XG4iKTsKKwkJfQorCX0KKworCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmczNjMjQxMHdkdF9ub3RpZmllcik7CisJaWYgKHJldCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoJWQpXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZzM2MyNDEwd2R0X21pc2NkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkICglZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnMzYzI0MTB3ZHRfbm90aWZpZXIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICh0bXJfYXRib290ICYmIHN0YXJ0ZWQgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiU3RhcnRpbmcgV2F0Y2hkb2cgVGltZXJcbiIpOworCQlzM2MyNDEwd2R0X3N0YXJ0KCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjMjQxMHdkdF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmICh3ZHRfbWVtICE9IE5VTEwpIHsKKwkJcmVsZWFzZV9yZXNvdXJjZSh3ZHRfbWVtKTsKKwkJa2ZyZWUod2R0X21lbSk7CisJCXdkdF9tZW0gPSBOVUxMOworCX0KKworCWlmICh3ZHRfaXJxICE9IE5VTEwpIHsKKwkJZnJlZV9pcnEod2R0X2lycS0+c3RhcnQsIGRldik7CisJCXdkdF9pcnEgPSBOVUxMOworCX0KKworCWlmICh3ZHRfY2xvY2sgIT0gTlVMTCkgeworCQljbGtfZGlzYWJsZSh3ZHRfY2xvY2spOworCQljbGtfdW51c2Uod2R0X2Nsb2NrKTsKKwkJY2xrX3B1dCh3ZHRfY2xvY2spOworCQl3ZHRfY2xvY2sgPSBOVUxMOworCX0KKworCW1pc2NfZGVyZWdpc3RlcigmczNjMjQxMHdkdF9taXNjZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHMzYzI0MTB3ZHRfZHJpdmVyID0geworCS5uYW1lCQk9ICJzM2MyNDEwLXdkdCIsCisJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlCQk9IHMzYzI0MTB3ZHRfcHJvYmUsCisJLnJlbW92ZQkJPSBzM2MyNDEwd2R0X3JlbW92ZSwKK307CisKKworCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICJTM0MyNDEwIFdhdGNoZG9nIFRpbWVyLCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3NcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKwlwcmludGsoYmFubmVyKTsKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZzM2MyNDEwd2R0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3YXRjaGRvZ19leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0MTB3ZHRfZHJpdmVyKTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmczNjMjQxMHdkdF9ub3RpZmllcik7Cit9CisKK21vZHVsZV9pbml0KHdhdGNoZG9nX2luaXQpOworbW9kdWxlX2V4aXQod2F0Y2hkb2dfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUzNDMjQxMCBXYXRjaGRvZyBEZXZpY2UgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2ExMTAwX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NhMTEwMF93ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGU4ZjdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NhMTEwMF93ZHQuYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqCVdhdGNoZG9nIGRyaXZlciBmb3IgdGhlIFNBMTF4MC9QWEEyeHgKKyAqCisgKiAgICAgIChjKSBDb3B5cmlnaHQgMjAwMCBPbGVnIERyb2tpbiA8Z3JlZW5AY3JpbWVhLmVkdT4KKyAqICAgICAgICAgIEJhc2VkIG9uIFNvZnREb2cgZHJpdmVyIGJ5IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIE9sZWcgRHJva2luIG5vciBpWGNlbGVyYXRvci5jb20gYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCisgKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKKyAqCSJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDAgICAgICAgICAgIE9sZWcgRHJva2luIDxncmVlbkBjcmltZWEuZWR1PgorICoKKyAqICAgICAgMjcvMTEvMjAwMCBJbml0aWFsIHJlbGVhc2UKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2lmZGVmIENPTkZJR19BUkNIX1BYQQorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIE9TQ1JfRlJFUQkJQ0xPQ0tfVElDS19SQVRFCisjZGVmaW5lIFNBMTEwMF9DTE9TRV9NQUdJQwkoMHg1YWZjNDQ1MykKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2ExMTAwd2R0X3VzZXJzOworc3RhdGljIGludCBleHBlY3RfY2xvc2U7CitzdGF0aWMgaW50IHByZV9tYXJnaW47CitzdGF0aWMgaW50IGJvb3Rfc3RhdHVzOworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworLyoKKyAqCUFsbG93IG9ubHkgb25lIHBlcnNvbiB0byBob2xkIGl0IG9wZW4KKyAqLworc3RhdGljIGludCBzYTExMDBkb2dfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgxLCZzYTExMDB3ZHRfdXNlcnMpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogQWN0aXZhdGUgU0ExMTAwIFdhdGNoZG9nIHRpbWVyICovCisJT1NNUjMgPSBPU0NSICsgcHJlX21hcmdpbjsKKwlPU1NSID0gT1NTUl9NMzsKKwlPV0VSID0gT1dFUl9XTUU7CisJT0lFUiB8PSBPSUVSX0UzOworCXJldHVybiAwOworfQorCisvKgorICoJU2h1dCBvZmYgdGhlIHRpbWVyLgorICogCUxvY2sgaXQgaW4gaWYgaXQncyBhIG1vZHVsZSBhbmQgd2UgZGVmaW5lZCAuLi5OT1dBWU9VVAorICoJT2RkbHksIHRoZSB3YXRjaGRvZyBjYW4gb25seSBiZSBlbmFibGVkLCBidXQgd2UgY2FuIHR1cm4gb2ZmCisgKgl0aGUgaW50ZXJydXB0LCB3aGljaCBhcHBlYXJzIHRvIHByZXZlbnQgdGhlIHdhdGNoZG9nIHRpbWluZyBvdXQuCisgKi8KK3N0YXRpYyBpbnQgc2ExMTAwZG9nX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJT1NNUjMgPSBPU0NSICsgcHJlX21hcmdpbjsKKworCWlmIChleHBlY3RfY2xvc2UgPT0gU0ExMTAwX0NMT1NFX01BR0lDKSB7CisJCU9JRVIgJj0gfk9JRVJfRTM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiV0FUQ0hET0c6IFdEVCBkZXZpY2UgY2xvc2VkIHVuZXhwZWN0ZWRseS4gIFdEVCB3aWxsIG5vdCBzdG9wIVxuIik7CisJfQorCisJY2xlYXJfYml0KDEsICZzYTExMDB3ZHRfdXNlcnMpOworCWV4cGVjdF9jbG9zZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc2ExMTAwZG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGxlbikgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKworCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJZXhwZWN0X2Nsb3NlID0gU0ExMTAwX0NMT1NFX01BR0lDOworCQkJfQorCQl9CisJCS8qIFJlZnJlc2ggT1NNUjMgdGltZXIuICovCisJCU9TTVIzID0gT1NDUiArIHByZV9tYXJnaW47CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCS5vcHRpb25zCT0gV0RJT0ZfQ0FSRFJFU0VUIHwgV0RJT0ZfTUFHSUNDTE9TRSB8CisJCQkgIFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9LRUVQQUxJVkVQSU5HLAorCS5pZGVudGl0eQk9ICJTQTExMDAgV2F0Y2hkb2ciLAorfTsKKworc3RhdGljIGludCBzYTExMDBkb2dfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldCA9IC1FTk9JT0NUTENNRDsKKwlpbnQgdGltZTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHN0cnVjdCB3YXRjaGRvZ19pbmZvICopYXJnLCAmaWRlbnQsCisJCQkJICAgc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJcmV0ID0gcHV0X3VzZXIoMCwgKGludCAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXQgPSBwdXRfdXNlcihib290X3N0YXR1cywgKGludCAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlyZXQgPSBnZXRfdXNlcih0aW1lLCAoaW50ICopYXJnKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWlmICh0aW1lIDw9IDAgfHwgdGltZSA+IDI1NSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJlX21hcmdpbiA9IE9TQ1JfRlJFUSAqIHRpbWU7CisJCU9TTVIzID0gT1NDUiArIHByZV9tYXJnaW47CisJCS8qZmFsbCB0aHJvdWdoKi8KKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJcmV0ID0gcHV0X3VzZXIocHJlX21hcmdpbiAvIE9TQ1JfRlJFUSwgKGludCAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCU9TTVIzID0gT1NDUiArIHByZV9tYXJnaW47CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzYTExMDBkb2dfZm9wcyA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBzYTExMDBkb2dfd3JpdGUsCisJLmlvY3RsCQk9IHNhMTEwMGRvZ19pb2N0bCwKKwkub3BlbgkJPSBzYTExMDBkb2dfb3BlbiwKKwkucmVsZWFzZQk9IHNhMTEwMGRvZ19yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHNhMTEwMGRvZ19taXNjZGV2ID0KK3sKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJCT0gIlNBMTEwMC9QWEEyeHggd2F0Y2hkb2ciLAorCS5mb3BzCQk9ICZzYTExMDBkb2dfZm9wcywKK307CisKK3N0YXRpYyBpbnQgbWFyZ2luIF9faW5pdGRhdGEgPSA2MDsJCS8qIChzZWNzKSBEZWZhdWx0IGlzIDEgbWludXRlICovCisKK3N0YXRpYyBpbnQgX19pbml0IHNhMTEwMGRvZ19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCS8qCisJICogUmVhZCB0aGUgcmVzZXQgc3RhdHVzLCBhbmQgc2F2ZSBpdCBmb3IgbGF0ZXIuICBJZgorCSAqIHdlIHN1c3BlbmQsIFJDU1Igd2lsbCBiZSBjbGVhcmVkLCBhbmQgdGhlIHdhdGNoZG9nCisJICogcmVzZXQgcmVhc29uIHdpbGwgYmUgbG9zdC4KKwkgKi8KKwlib290X3N0YXR1cyA9IChSQ1NSICYgUkNTUl9XRFIpID8gV0RJT0ZfQ0FSRFJFU0VUIDogMDsKKwlwcmVfbWFyZ2luID0gT1NDUl9GUkVRICogbWFyZ2luOworCisJcmV0ID0gbWlzY19yZWdpc3Rlcigmc2ExMTAwZG9nX21pc2NkZXYpOworCWlmIChyZXQgPT0gMCkKKwkJcHJpbnRrKCJTQTExMDAvUFhBMnh4IFdhdGNoZG9nIFRpbWVyOiB0aW1lciBtYXJnaW4gJWQgc2VjXG4iLAorCQkgICAgICAgbWFyZ2luKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzYTExMDBkb2dfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3Rlcigmc2ExMTAwZG9nX21pc2NkZXYpOworfQorCittb2R1bGVfaW5pdChzYTExMDBkb2dfaW5pdCk7Cittb2R1bGVfZXhpdChzYTExMDBkb2dfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk9sZWcgRHJva2luIDxncmVlbkBjcmltZWEuZWR1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQTExMDAvUFhBMnh4IFdhdGNoZG9nIik7CisKK21vZHVsZV9wYXJhbShtYXJnaW4sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1hcmdpbiwgIldhdGNoZG9nIG1hcmdpbiBpbiBzZWNvbmRzIChkZWZhdWx0IDYwcykiKTsKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2JjNjB4eHdkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NiYzYweHh3ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2RlOTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NiYzYweHh3ZHQuYwpAQCAtMCwwICsxLDQxMyBAQAorLyoKKyAqCTYweHggU2luZ2xlIEJvYXJkIENvbXB1dGVyIFdhdGNoZG9nIFRpbWVyIGRyaXZlciBmb3IgTGludXggMi4yLngKKyAqCisgKiAgICAgIEJhc2VkIG9uIGFjcXVpcmV3ZHQuYyBieSBBbGFuIENveC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBhdXRob3IgZG9lcyBOT1QgYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlIHdhcnJhbnR5IGZvcgorICoJYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgIkFTLUlTIiBpbgorICoJdGhlIGhvcGUgdGhhdCBpdCBtYXkgYmUgdXNlZnVsIGZvciBvdGhlcnMuCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAwICAgIEpha29iIE9lc3RlcmdhYXJkIDxqYWtvYkB1bnRob3VnaHQubmV0PgorICoKKyAqICAgICAgICAgICAxMi80IC0gMjAwMCAgICAgIFtJbml0aWFsIHJldmlzaW9uXQorICogICAgICAgICAgIDI1LzQgLSAyMDAwICAgICAgQWRkZWQgL2Rldi93YXRjaGRvZyBzdXBwb3J0CisgKiAgICAgICAgICAgMDkvNSAtIDIwMDEgICAgICBbc21qQG9yby5uZXRdIGZpeGVkIGZvcF93cml0ZSB0byAicmV0dXJuIDEiIG9uIHN1Y2Nlc3MKKyAqICAgICAgICAgICAxMi80IC0gMjAwMiAgICAgIFtyb2JAb3NpbnZlc3Rvci5jb21dIGVsaW1pbmF0ZSBmb3BfcmVhZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4IHBvc3NpYmxlIHdkdF9pc19vcGVuIHJhY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlIGxvY2tfa2VybmVsL3VubG9ja19rZXJuZWwgcGFpcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIEtFUk5fKiB0byBwcmludGsncworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290IHJpZCBvZiBleHRyYW5lb3VzIGNvbW1lbnRzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHdhdGNoZG9nX2luZm8gdG8gY29ycmVjdGx5IHJlZmxlY3Qgd2hhdCB0aGUgZHJpdmVyIG9mZmVycworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgV0RJT0NfR0VUU1RBVFVTLCBXRElPQ19HRVRCT09UU1RBVFVTLCBXRElPQ19TRVRUSU1FT1VULAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RJT0NfR0VUVElNRU9VVCwgYW5kIFdESU9DX1NFVE9QVElPTlMgaW9jdGxzCisgKiAgICAgICAgICAgMDkvOCAtIDIwMDMgICAgICBbd2ltQGlndWFuYS5iZV0gY2xlYW51cCBvZiB0cmFpbGluZyBzcGFjZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSBtb2R1bGVfcGFyYW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZGUgdGltZW91dCAodGhlIGVtdWxhdGVkIGhlYXJ0YmVhdCkgYSBtb2R1bGVfcGFyYW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZGUgdGhlIGtlZXBhbGl2ZSBwaW5nIGFuIGludGVybmFsIHN1YnJvdXRpbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZGUgd2R0X3N0b3AgYW5kIHdkdF9zdGFydCBtb2R1bGUgcGFyYW1zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBleHRyYSBwcmludGsncyBmb3Igc3RhcnR1cCBwcm9ibGVtcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgTU9EVUxFX0FVVEhPUiBhbmQgTU9EVUxFX0RFU0NSSVBUSU9OIGluZm8KKyAqCisgKgorICogIFRoaXMgV0RUIGRyaXZlciBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgTGludXggV0RUCisgKiAgZHJpdmVycyBpbiB0aGUgZm9sbG93aW5nIHdheXM6CisgKiAgKikgIFRoZSBkcml2ZXIgd2lsbCBwaW5nIHRoZSB3YXRjaGRvZyBieSBpdHNlbGYsIGJlY2F1c2UgdGhpcworICogICAgICBwYXJ0aWN1bGFyIFdEVCBoYXMgYSB2ZXJ5IHNob3J0IHRpbWVvdXQgKG9uZSBzZWNvbmQpIGFuZCBpdAorICogICAgICB3b3VsZCBiZSBpbnNhbmUgdG8gY291bnQgb24gYW55IHVzZXJzcGFjZSBkYWVtb24gYWx3YXlzCisgKiAgICAgIGdldHRpbmcgc2NoZWR1bGVkIHdpdGhpbiB0aGF0IHRpbWUgZnJhbWUuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIE9VUl9OQU1FICJzYmM2MHh4d2R0IgorI2RlZmluZSBQRlggT1VSX05BTUUgIjogIgorCisvKgorICogWW91IG11c3Qgc2V0IHRoZXNlIC0gVGhlIGRyaXZlciBjYW5ub3QgcHJvYmUgZm9yIHRoZSBzZXR0aW5ncworICovCisKK3N0YXRpYyBpbnQgd2R0X3N0b3AgPSAweDQ1OworbW9kdWxlX3BhcmFtKHdkdF9zdG9wLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh3ZHRfc3RvcCwgIlNCQzYweHggV0RUICdzdG9wJyBpbyBwb3J0IChkZWZhdWx0IDB4NDUpIik7CisKK3N0YXRpYyBpbnQgd2R0X3N0YXJ0ID0gMHg0NDM7Cittb2R1bGVfcGFyYW0od2R0X3N0YXJ0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh3ZHRfc3RhcnQsICJTQkM2MHh4IFdEVCAnc3RhcnQnIGlvIHBvcnQgKGRlZmF1bHQgMHg0NDMpIik7CisKKy8qCisgKiBUaGUgNjB4eCBib2FyZCBjYW4gdXNlIHdhdGNoZG9nIHRpbWVvdXQgdmFsdWVzIGZyb20gb25lIHNlY29uZAorICogdG8gc2V2ZXJhbCBtaW51dGVzLiAgVGhlIGRlZmF1bHQgaXMgb25lIHNlY29uZCwgc28gaWYgd2UgcmVzZXQKKyAqIHRoZSB3YXRjaGRvZyBldmVyeSB+MjUwbXMgd2Ugc2hvdWxkIGJlIHNhZmUuCisgKi8KKworI2RlZmluZSBXRFRfSU5URVJWQUwgKEhaLzQrMSkKKworLyoKKyAqIFdlIG11c3Qgbm90IHJlcXVpcmUgdG9vIGdvb2QgcmVzcG9uc2UgZnJvbSB0aGUgdXNlcnNwYWNlIGRhZW1vbi4KKyAqIEhlcmUgd2UgcmVxdWlyZSB0aGUgdXNlcnNwYWNlIGRhZW1vbiB0byBzZW5kIHVzIGEgaGVhcnRiZWF0CisgKiBjaGFyIHRvIC9kZXYvd2F0Y2hkb2cgZXZlcnkgMzAgc2Vjb25kcy4KKyAqIElmIHRoZSBkYWVtb24gcHVsc2VzIHVzIGV2ZXJ5IDI1IHNlY29uZHMsIHdlIGNhbiBzdGlsbCBhZmZvcmQKKyAqIGEgNSBzZWNvbmQgc2NoZWR1bGluZyBkZWxheSBvbiB0aGUgKGhpZ2ggcHJpb3JpdHkpIGRhZW1vbi4gVGhhdAorICogc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIGEgYm94IHVuZGVyIGFueSBsb2FkLgorICovCisKKyNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCAzMAkJLyogMzAgc2VjIGRlZmF1bHQgdGltZW91dCAqLworc3RhdGljIGludCB0aW1lb3V0ID0gV0FUQ0hET0dfVElNRU9VVDsJLyogaW4gc2Vjb25kcywgd2lsbCBiZSBtdWx0aXBsaWVkIGJ5IEhaIHRvIGdldCBzZWNvbmRzIHRvIHdhaXQgZm9yIGEgcGluZyAqLworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMuICgxPD10aW1lb3V0PD0zNjAwLCBkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX1RJTUVPVVQpICIpIik7CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCitzdGF0aWMgdm9pZCB3ZHRfdGltZXJfcGluZyh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5leHRfaGVhcnRiZWF0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CitzdGF0aWMgY2hhciB3ZHRfZXhwZWN0X2Nsb3NlOworCisvKgorICoJV2hhY2sgdGhlIGRvZworICovCisKK3N0YXRpYyB2b2lkIHdkdF90aW1lcl9waW5nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwkvKiBJZiB3ZSBnb3QgYSBoZWFydGJlYXQgcHVsc2Ugd2l0aGluIHRoZSBXRFRfVVNfSU5URVJWQUwKKwkgKiB3ZSBhZ3JlZSB0byBwaW5nIHRoZSBXRFQKKwkgKi8KKwlpZih0aW1lX2JlZm9yZShqaWZmaWVzLCBuZXh0X2hlYXJ0YmVhdCkpCisJeworCQkvKiBQaW5nIHRoZSBXRFQgYnkgcmVhZGluZyBmcm9tIHdkdF9zdGFydCAqLworCQlpbmJfcCh3ZHRfc3RhcnQpOworCQkvKiBSZS1zZXQgdGhlIHRpbWVyIGludGVydmFsICovCisJCXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgV0RUX0lOVEVSVkFMOworCQlhZGRfdGltZXIoJnRpbWVyKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiSGVhcnRiZWF0IGxvc3QhIFdpbGwgbm90IHBpbmcgdGhlIHdhdGNoZG9nXG4iKTsKKwl9Cit9CisKKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzCisgKi8KKworc3RhdGljIHZvaWQgd2R0X3N0YXJ0dXAodm9pZCkKK3sKKwluZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyAodGltZW91dCAqIEhaKTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciAqLworCXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgV0RUX0lOVEVSVkFMOworCWFkZF90aW1lcigmdGltZXIpOworCXByaW50ayhLRVJOX0lORk8gUEZYICJXYXRjaGRvZyB0aW1lciBpcyBub3cgZW5hYmxlZC5cbiIpOworfQorCitzdGF0aWMgdm9pZCB3ZHRfdHVybm9mZih2b2lkKQoreworCS8qIFN0b3AgdGhlIHRpbWVyICovCisJZGVsX3RpbWVyKCZ0aW1lcik7CisJaW5iX3Aod2R0X3N0b3ApOworCXByaW50ayhLRVJOX0lORk8gUEZYICJXYXRjaGRvZyB0aW1lciBpcyBub3cgZGlzYWJsZWQuLi5cbiIpOworfQorCitzdGF0aWMgdm9pZCB3ZHRfa2VlcGFsaXZlKHZvaWQpCit7CisJLyogdXNlciBsYW5kIHBpbmcgKi8KKwluZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyAodGltZW91dCAqIEhaKTsKK30KKworLyoKKyAqIC9kZXYvd2F0Y2hkb2cgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgc3NpemVfdCBmb3Bfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCS8qIFNlZSBpZiB3ZSBnb3QgdGhlIG1hZ2ljIGNoYXJhY3RlciAnVicgYW5kIHJlbG9hZCB0aGUgdGltZXIgKi8KKwlpZihjb3VudCkKKwl7CisJCWlmICghbm93YXlvdXQpCisJCXsKKwkJCXNpemVfdCBvZnM7CisKKwkJCS8qIG5vdGU6IGp1c3QgaW4gY2FzZSBzb21lb25lIHdyb3RlIHRoZSBtYWdpYyBjaGFyYWN0ZXIKKwkJCSAqIGZpdmUgbW9udGhzIGFnby4uLiAqLworCQkJd2R0X2V4cGVjdF9jbG9zZSA9IDA7CisKKwkJCS8qIHNjYW4gdG8gc2VlIHdoZXRoZXIgb3Igbm90IHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICovCisJCQlmb3Iob2ZzID0gMDsgb2ZzICE9IGNvdW50OyBvZnMrKykKKwkJCXsKKwkJCQljaGFyIGM7CisJCQkJaWYoZ2V0X3VzZXIoYywgYnVmK29mcykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmKGMgPT0gJ1YnKQorCQkJCQl3ZHRfZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKworCQkvKiBXZWxsLCBhbnlob3cgc29tZW9uZSB3cm90ZSB0byB1cywgd2Ugc2hvdWxkIHJldHVybiB0aGF0IGZhdm91ciAqLworCQl3ZHRfa2VlcGFsaXZlKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBmb3Bfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCisJLyogSnVzdCBpbiBjYXNlIHdlJ3JlIGFscmVhZHkgdGFsa2luZyB0byBzb21lb25lLi4uICovCisJaWYodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2R0X2lzX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKG5vd2F5b3V0KQorCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCisJLyogR29vZCwgZmlyZSB1cCB0aGUgc2hvdyAqLworCXdkdF9zdGFydHVwKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZm9wX2Nsb3NlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJaWYod2R0X2V4cGVjdF9jbG9zZSA9PSA0MikKKwkJd2R0X3R1cm5vZmYoKTsKKwllbHNlIHsKKwkJZGVsX3RpbWVyKCZ0aW1lcik7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJkZXZpY2UgZmlsZSBjbG9zZWQgdW5leHBlY3RlZGx5LiBXaWxsIG5vdCBzdG9wIHRoZSBXRFQhXG4iKTsKKwl9CisJY2xlYXJfYml0KDAsICZ3ZHRfaXNfb3Blbik7CisJd2R0X2V4cGVjdF9jbG9zZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZm9wX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudD0KKwl7CisJCS5vcHRpb25zID0gV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJCS5pZGVudGl0eSA9ICJTQkM2MHh4IiwKKwl9OworCisJc3dpdGNoKGNtZCkKKwl7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSk/LUVGQVVMVDowOworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCXdkdF9rZWVwYWxpdmUoKTsKKwkJCXJldHVybiAwOworCQljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCXsKKwkJCWludCBuZXdfb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKworCQkJaWYoZ2V0X3VzZXIobmV3X29wdGlvbnMsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZihuZXdfb3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQkJd2R0X3R1cm5vZmYoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlpZihuZXdfb3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCQl3ZHRfc3RhcnR1cCgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQl7CisJCQlpbnQgbmV3X3RpbWVvdXQ7CisKKwkJCWlmKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYobmV3X3RpbWVvdXQgPCAxIHx8IG5ld190aW1lb3V0ID4gMzYwMCkgLyogYXJiaXRyYXJ5IHVwcGVyIGxpbWl0ICovCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXRpbWVvdXQgPSBuZXdfdGltZW91dDsKKwkJCXdkdF9rZWVwYWxpdmUoKTsKKwkJCS8qIEZhbGwgdGhyb3VnaCAqLworCQl9CisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0LCBwKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gZm9wX3dyaXRlLAorCS5vcGVuCQk9IGZvcF9vcGVuLAorCS5yZWxlYXNlCT0gZm9wX2Nsb3NlLAorCS5pb2N0bAkJPSBmb3BfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgPSAid2F0Y2hkb2ciLAorCS5mb3BzID0gJndkdF9mb3BzLAorfTsKKworLyoKKyAqCU5vdGlmaWVyIGZvciBzeXN0ZW0gZG93bgorICovCisKK3N0YXRpYyBpbnQgd2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJdm9pZCAqdW51c2VkKQoreworCWlmKGNvZGU9PVNZU19ET1dOIHx8IGNvZGU9PVNZU19IQUxUKQorCQl3ZHRfdHVybm9mZigpOworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqCVRoZSBXRFQgbmVlZHMgdG8gbGVhcm4gYWJvdXQgc29mdCBzaHV0ZG93bnMgaW4gb3JkZXIgdG8KKyAqCXR1cm4gdGhlIHRpbWVib21iIHJlZ2lzdGVycyBvZmYuCisgKi8KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3ZHRfbm90aWZpZXI9Cit7CisJLm5vdGlmaWVyX2NhbGwgPSB3ZHRfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzYmM2MHh4d2R0X3VubG9hZCh2b2lkKQoreworCXdkdF90dXJub2ZmKCk7CisKKwkvKiBEZXJlZ2lzdGVyICovCisJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CisKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwlpZiAoKHdkdF9zdG9wICE9IDB4NDUpICYmICh3ZHRfc3RvcCAhPSB3ZHRfc3RhcnQpKQorCQlyZWxlYXNlX3JlZ2lvbih3ZHRfc3RvcCwxKTsKKwlyZWxlYXNlX3JlZ2lvbih3ZHRfc3RhcnQsMSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNiYzYweHh3ZHRfaW5pdCh2b2lkKQoreworCWludCByYyA9IC1FQlVTWTsKKworCWlmKHRpbWVvdXQgPCAxIHx8IHRpbWVvdXQgPiAzNjAwKSAvKiBhcmJpdHJhcnkgdXBwZXIgbGltaXQgKi8KKwl7CisJCXRpbWVvdXQgPSBXQVRDSERPR19USU1FT1VUOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAidGltZW91dCB2YWx1ZSBtdXN0IGJlIDE8PXg8PTM2MDAsIHVzaW5nICVkXG4iLAorCQkJdGltZW91dCk7CisgCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24od2R0X3N0YXJ0LCAxLCAiU0JDIDYwWFggV0RUIikpCisJeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCisJCQl3ZHRfc3RhcnQpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBXZSBjYW5ub3QgcmVzZXJ2ZSAweDQ1IC0gdGhlIGtlcm5lbCBhbHJlYWR5IGhhcyEgKi8KKwlpZiAoKHdkdF9zdG9wICE9IDB4NDUpICYmICh3ZHRfc3RvcCAhPSB3ZHRfc3RhcnQpKQorCXsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbih3ZHRfc3RvcCwgMSwgIlNCQyA2MFhYIFdEVCIpKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCisJCQkJd2R0X3N0b3ApOworCQkJcmMgPSAtRUlPOworCQkJZ290byBlcnJfb3V0X3JlZ2lvbjE7CisJCX0KKwl9CisKKwlpbml0X3RpbWVyKCZ0aW1lcik7CisJdGltZXIuZnVuY3Rpb24gPSB3ZHRfdGltZXJfcGluZzsKKwl0aW1lci5kYXRhID0gMDsKKworCXJjID0gbWlzY19yZWdpc3Rlcigmd2R0X21pc2NkZXYpOworCWlmIChyYykKKwl7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJd2R0X21pc2NkZXYubWlub3IsIHJjKTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbjI7CisJfQorCisJcmMgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJaWYgKHJjKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJjKTsKKwkJZ290byBlcnJfb3V0X21pc2NkZXY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldEVCBkcml2ZXIgZm9yIDYwWFggc2luZ2xlIGJvYXJkIGNvbXB1dGVyIGluaXRpYWxpc2VkLiB0aW1lb3V0PSVkIHNlYyAobm93YXlvdXQ9JWQpXG4iLAorCQl0aW1lb3V0LCBub3dheW91dCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9taXNjZGV2OgorCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOworZXJyX291dF9yZWdpb24yOgorCWlmICgod2R0X3N0b3AgIT0gMHg0NSkgJiYgKHdkdF9zdG9wICE9IHdkdF9zdGFydCkpCisJCXJlbGVhc2VfcmVnaW9uKHdkdF9zdG9wLDEpOworZXJyX291dF9yZWdpb24xOgorCXJlbGVhc2VfcmVnaW9uKHdkdF9zdGFydCwxKTsKK2Vycl9vdXQ6CisJcmV0dXJuIHJjOworfQorCittb2R1bGVfaW5pdChzYmM2MHh4d2R0X2luaXQpOworbW9kdWxlX2V4aXQoc2JjNjB4eHdkdF91bmxvYWQpOworCitNT0RVTEVfQVVUSE9SKCJKYWtvYiBPZXN0ZXJnYWFyZCA8amFrb2JAdW50aG91Z2h0Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiNjB4eCBTaW5nbGUgQm9hcmQgQ29tcHV0ZXIgV2F0Y2hkb2cgVGltZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2MxMjAwd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2MxMjAwd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0MDFlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zYzEyMDB3ZHQuYwpAQCAtMCwwICsxLDQ2NyBAQAorLyoKKyAqCU5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzMwNy9QQzk3MzA3IChhbGEgU0MxMjAwKSBXRFQgZHJpdmVyCisgKgkoYykgQ29weXJpZ2h0IDIwMDIgWndhbmUgTXdhaWthbWJvIDx6d2FuZUBjb21tZmlyZXNlcnZpY2VzLmNvbT4sCisgKgkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKglCYXNlZCBvbiB3ZHQuYyBhbmQgd2R0OTc3LmMgYnkgQWxhbiBDb3ggYW5kIFdvb2R5IFN1d2Fsc2tpIHJlc3BlY3RpdmVseS4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBhdXRob3Iocykgb2YgdGhpcyBzb2Z0d2FyZSBzaGFsbCBub3QgYmUgaGVsZCBsaWFibGUgZm9yIGRhbWFnZXMKKyAqCW9mIGFueSBuYXR1cmUgcmVzdWx0aW5nIGR1ZSB0byB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuIFRoaXMKKyAqCXNvZnR3YXJlIGlzIHByb3ZpZGVkIEFTLUlTIHdpdGggbm8gd2FycmFudGllcy4KKyAqCisgKglDaGFuZ2Vsb2c6CisgKgkyMDAyMDIyMCBad2FuZSBNd2Fpa2FtYm8JQ29kZSBiYXNlZCBvbiBkYXRhc2hlZXQsIG5vIGhhcmR3YXJlLgorICoJMjAwMjAyMjEgWndhbmUgTXdhaWthbWJvCUNsZWFudXBzIGFzIHN1Z2dlc3RlZCBieSBKZWZmIEdhcnppayBhbmQgQWxhbiBDb3guCisgKgkyMDAyMDIyMiBad2FuZSBNd2Fpa2FtYm8JQWRkZWQgcHJvYmluZy4KKyAqCTIwMDIwMjI1IFp3YW5lIE13YWlrYW1ibwlBZGRlZCBJU0FQTlAgc3VwcG9ydC4KKyAqCTIwMDIwNDEyIFJvYiBSYWRlegkJQnJva2Ugb3V0IHN0YXJ0L3N0b3AgZnVuY3Rpb25zCisgKgkJIDxyb2JAb3NpbnZlc3Rvci5jb20+CVJldHVybiBwcm9wZXIgc3RhdHVzIGluc3RlYWQgb2YgdGVtcGVyYXR1cmUgd2FybmluZworICoJCQkJCUFkZCBXRElPQ19HRVRCT09UU1RBVFVTIGFuZCBXRElPQ19TRVRPUFRJT05TIGlvY3RscworICoJCQkJCUZpeCBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKKyAqCTIwMDIwNTMwIEpvZWwgQmVja2VyCQlBZGQgTWF0dCBEb21zY2gncyBub3dheW91dCBtb2R1bGUgb3B0aW9uCisgKgkyMDAzMDExNiBBZGFtIEJlbGF5CQlVcGRhdGVkIHRvIHRoZSBsYXRlc3QgcG5wIGNvZGUKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbnAuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgU0MxMjAwX01PRFVMRV9WRVIJImJ1aWxkIDIwMDIwMzAzIgorI2RlZmluZSBTQzEyMDBfTU9EVUxFX05BTUUJInNjMTIwMHdkdCIKKyNkZWZpbmUgUEZYCQkJU0MxMjAwX01PRFVMRV9OQU1FICI6ICIKKworI2RlZmluZQlNQVhfVElNRU9VVAkyNTUJLyogMjU1IG1pbnV0ZXMgKi8KKyNkZWZpbmUgUE1JUgkJKGlvKQkvKiBQb3dlciBNYW5hZ2VtZW50IEluZGV4IFJlZ2lzdGVyICovCisjZGVmaW5lIFBNRFIJCShpbysxKQkvKiBQb3dlciBNYW5hZ2VtZW50IERhdGEgUmVnaXN0ZXIgKi8KKworLyogRGF0YSBSZWdpc3RlciBpbmRleGVzICovCisjZGVmaW5lIEZFUjEJCTB4MDAJLyogRnVuY3Rpb24gZW5hYmxlIHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRkVSMgkJMHgwMQkvKiBGdW5jdGlvbiBlbmFibGUgcmVnaXN0ZXIgMiAqLworI2RlZmluZSBQTUMxCQkweDAyCS8qIFBvd2VyIE1hbmFnZW1lbnQgQ3RybCAxICovCisjZGVmaW5lIFBNQzIJCTB4MDMJLyogUG93ZXIgTWFuYWdlbWVudCBDdHJsIDIgKi8KKyNkZWZpbmUgUE1DMwkJMHgwNAkvKiBQb3dlciBNYW5hZ2VtZW50IEN0cmwgMyAqLworI2RlZmluZSBXRFRPCQkweDA1CS8qIFdhdGNoZG9nIHRpbWVvdXQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJV0RDRgkJMHgwNgkvKiBXYXRjaGRvZyBjb25maWcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgV0RTVAkJMHgwNwkvKiBXYXRjaGRvZyBzdGF0dXMgcmVnaXN0ZXIgKi8KKworLyogV0RDRiBiaXRmaWVsZHMgLSB3aGljaCBkZXZpY2VzIGFzc2VydCBXRE8gKi8KKyNkZWZpbmUgS0JDX0lSUQkJMHgwMQkvKiBLZXlib2FyZCBDb250cm9sbGVyICovCisjZGVmaW5lIE1TRV9JUlEJCTB4MDIJLyogTW91c2UgKi8KKyNkZWZpbmUgVUFSVDFfSVJRCTB4MDMJLyogU2VyaWFsMCAqLworI2RlZmluZSBVQVJUMl9JUlEJMHgwNAkvKiBTZXJpYWwxICovCisvKiA1IC03IGFyZSByZXNlcnZlZCAqLworCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPIFBGWCBTQzEyMDBfTU9EVUxFX1ZFUjsKK3N0YXRpYyBpbnQgdGltZW91dCA9IDE7CitzdGF0aWMgaW50IGlvID0gLTE7CitzdGF0aWMgaW50IGlvX2xlbiA9IDI7CQkvKiBmb3Igbm9uIHBsdWcgYW5kIHBsYXkgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOworc3RhdGljIHNwaW5sb2NrX3Qgc2MxMjAwd2R0X2xvY2s7CS8qIGlvIHBvcnQgYWNjZXNzIHNlcmlhbGlzYXRpb24gKi8KKworI2lmIGRlZmluZWQgQ09ORklHX1BOUAorc3RhdGljIGludCBpc2FwbnAgPSAxOworc3RhdGljIHN0cnVjdCBwbnBfZGV2ICp3ZHRfZGV2OworCittb2R1bGVfcGFyYW0oaXNhcG5wLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpc2FwbnAsICJXaGVuIHNldCB0byAwIGRyaXZlciBJU0EgUG5QIHN1cHBvcnQgd2lsbCBiZSBkaXNhYmxlZCIpOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJpbyBwb3J0Iik7Cittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgInJhbmdlIGlzIDAtMjU1IG1pbnV0ZXMsIGRlZmF1bHQgaXMgMSIpOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworCisKKy8qIFJlYWQgZnJvbSBEYXRhIFJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2MxMjAwd2R0X3JlYWRfZGF0YSh1bnNpZ25lZCBjaGFyIGluZGV4LCB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCXNwaW5fbG9jaygmc2MxMjAwd2R0X2xvY2spOworCW91dGJfcChpbmRleCwgUE1JUik7CisJKmRhdGEgPSBpbmIoUE1EUik7CisJc3Bpbl91bmxvY2soJnNjMTIwMHdkdF9sb2NrKTsKK30KKworCisvKiBXcml0ZSB0byBEYXRhIFJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2MxMjAwd2R0X3dyaXRlX2RhdGEodW5zaWduZWQgY2hhciBpbmRleCwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXNwaW5fbG9jaygmc2MxMjAwd2R0X2xvY2spOworCW91dGJfcChpbmRleCwgUE1JUik7CisJb3V0YihkYXRhLCBQTURSKTsKKwlzcGluX3VubG9jaygmc2MxMjAwd2R0X2xvY2spOworfQorCisKK3N0YXRpYyB2b2lkIHNjMTIwMHdkdF9zdGFydCh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgcmVnOworCisJc2MxMjAwd2R0X3JlYWRfZGF0YShXRENGLCAmcmVnKTsKKwkvKiBhc3NlcnQgV0RPIHdoZW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgaW50ZXJydXB0cyBhcmUgdHJpZ2dlcmVkIHRvbyAqLworCXJlZyB8PSAoS0JDX0lSUSB8IE1TRV9JUlEgfCBVQVJUMV9JUlEgfCBVQVJUMl9JUlEpOworCXNjMTIwMHdkdF93cml0ZV9kYXRhKFdEQ0YsIHJlZyk7CisJLyogc2V0IHRoZSB0aW1lb3V0IGFuZCBnZXQgdGhlIGJhbGwgcm9sbGluZyAqLworCXNjMTIwMHdkdF93cml0ZV9kYXRhKFdEVE8sIHRpbWVvdXQpOworfQorCisKK3N0YXRpYyB2b2lkIHNjMTIwMHdkdF9zdG9wKHZvaWQpCit7CisJc2MxMjAwd2R0X3dyaXRlX2RhdGEoV0RUTywgMCk7Cit9CisKKworLyogVGhpcyByZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIFdETyBzaWduYWwsIGluYWN0aXZlIGhpZ2guICovCitzdGF0aWMgaW5saW5lIGludCBzYzEyMDB3ZHRfc3RhdHVzKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciByZXQ7CisKKwlzYzEyMDB3ZHRfcmVhZF9kYXRhKFdEU1QsICZyZXQpOworCS8qIElmIHRoZSBiaXQgaXMgaW5hY3RpdmUsIHRoZSB3YXRjaGRvZyBpcyBlbmFibGVkLCBzbyByZXR1cm4KKwkgKiBLRUVQQUxJVkVQSU5HIHdoaWNoIGlzIGEgYml0IG9mIGEga2x1ZGdlIGJlY2F1c2UgdGhlcmUncyBub3RoaW5nCisJICogZWxzZSBmb3IgZW5hYmxlZC9kaXNhYmxlZCBzdGF0dXMKKwkgKi8KKwlyZXR1cm4gKHJldCAmIDB4MDEpID8gMCA6IFdESU9GX0tFRVBBTElWRVBJTkc7CS8qIGJpdHMgMSAtIDcgYXJlIHVuZGVmaW5lZCAqLworfQorCisKK3N0YXRpYyBpbnQgc2MxMjAwd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CisKKwkvKiBhbGxvdyBvbmUgYXQgYSB0aW1lICovCisJaWYgKGRvd25fdHJ5bG9jaygmb3Blbl9zZW0pKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHRpbWVvdXQgPiBNQVhfVElNRU9VVCkKKwkJdGltZW91dCA9IE1BWF9USU1FT1VUOworCisJc2MxMjAwd2R0X3N0YXJ0KCk7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldhdGNoZG9nIGVuYWJsZWQsIHRpbWVvdXQgPSAlZCBtaW4ocykiLCB0aW1lb3V0KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc2MxMjAwd2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgbmV3X3RpbWVvdXQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcgfCBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPSAwLAorCQkuaWRlbnRpdHkgPSAiUEM4NzMwNy9QQzk3MzA3IiwKKwl9OworCisJc3dpdGNoIChjbWQpIHsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CS8qIEtlZXAgUGF2ZWwgTWFjaGVrIGFtdXNlZCA7KSAqLworCisJCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LCBzaXplb2YgaWRlbnQpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoc2MxMjAwd2R0X3N0YXR1cygpLCBwKTsKKworCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwkJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCQlzYzEyMDB3ZHRfd3JpdGVfZGF0YShXRFRPLCB0aW1lb3V0KTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJCWlmIChnZXRfdXNlcihuZXdfdGltZW91dCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCS8qIHRoZSBBUEkgc3RhdGVzIHRoaXMgaXMgZ2l2ZW4gaW4gc2VjcyAqLworCQkJbmV3X3RpbWVvdXQgLz0gNjA7CisJCQlpZiAobmV3X3RpbWVvdXQgPCAwIHx8IG5ld190aW1lb3V0ID4gTUFYX1RJTUVPVVQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXRpbWVvdXQgPSBuZXdfdGltZW91dDsKKwkJCXNjMTIwMHdkdF93cml0ZV9kYXRhKFdEVE8sIHRpbWVvdXQpOworCQkJLyogZmFsbCB0aHJvdWdoIGFuZCByZXR1cm4gdGhlIG5ldyB0aW1lb3V0ICovCisKKwkJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQkJcmV0dXJuIHB1dF91c2VyKHRpbWVvdXQgKiA2MCwgcCk7CisKKwkJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQl7CisJCQlpbnQgb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKworCQkJaWYgKGdldF91c2VyKG9wdGlvbnMsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAob3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQkJc2MxMjAwd2R0X3N0b3AoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlpZiAob3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCQlzYzEyMDB3ZHRfc3RhcnQoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQorfQorCisKK3N0YXRpYyBpbnQgc2MxMjAwd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgeworCQlzYzEyMDB3ZHRfc3RvcCgpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiV2F0Y2hkb2cgZGlzYWJsZWRcbiIpOworCX0gZWxzZSB7CisJCXNjMTIwMHdkdF93cml0ZV9kYXRhKFdEVE8sIHRpbWVvdXQpOworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSEsIHRpbWVvdXQgPSAlZCBtaW4ocylcbiIsIHRpbWVvdXQpOworCX0KKwl1cCgmb3Blbl9zZW0pOworCWV4cGVjdF9jbG9zZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3NpemVfdCBzYzEyMDB3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGxlbikgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKworCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhK2kpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisKKwkJc2MxMjAwd2R0X3dyaXRlX2RhdGEoV0RUTywgdGltZW91dCk7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzYzEyMDB3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpCisJCXNjMTIwMHdkdF9zdG9wKCk7CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzYzEyMDB3ZHRfbm90aWZpZXIgPQoreworCS5ub3RpZmllcl9jYWxsID0Jc2MxMjAwd2R0X25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzYzEyMDB3ZHRfZm9wcyA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBzYzEyMDB3ZHRfd3JpdGUsCisJLmlvY3RsCQk9IHNjMTIwMHdkdF9pb2N0bCwKKwkub3BlbgkJPSBzYzEyMDB3ZHRfb3BlbiwKKwkucmVsZWFzZQk9IHNjMTIwMHdkdF9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHNjMTIwMHdkdF9taXNjZGV2ID0KK3sKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJCT0gIndhdGNoZG9nIiwKKwkuZm9wcwkJPSAmc2MxMjAwd2R0X2ZvcHMsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IHNjMTIwMHdkdF9wcm9iZSh2b2lkKQoreworCS8qIFRoZSBwcm9iZSB3b3JrcyBieSByZWFkaW5nIHRoZSBQTUMzIHJlZ2lzdGVyJ3MgZGVmYXVsdCB2YWx1ZSBvZiAweDBlCisJICogdGhlcmUgaXMgb25lIGNhdmVhdCwgaWYgdGhlIGRldmljZSBkaXNhYmxlcyB0aGUgcGFyYWxsZWwgcG9ydCBvciBhbnkKKwkgKiBvZiB0aGUgVUFSVHMgd2Ugd29uJ3QgYmUgYWJsZSB0byBkZXRlY3QgaXQuCisJICogTmIuIFRoaXMgY291bGQgYmUgZG9uZSB3aXRoIGFjY3VyYWN5IGJ5IHJlYWRpbmcgdGhlIFNJRCByZWdpc3RlcnMsIGJ1dAorCSAqIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRob3NlIGlvIHJlZ2lvbnMuCisJICovCisKKwl1bnNpZ25lZCBjaGFyIHJlZzsKKworCXNjMTIwMHdkdF9yZWFkX2RhdGEoUE1DMywgJnJlZyk7CisJcmVnICY9IDB4MGY7CQkJCS8qIHdlIGRvbid0IHdhbnQgdGhlIFVBUlQgYnVzeSBiaXRzICovCisJcmV0dXJuIChyZWcgPT0gMHgwZSkgPyAwIDogLUVOT0RFVjsKK30KKworCisjaWYgZGVmaW5lZCBDT05GSUdfUE5QCisKK3N0YXRpYyBzdHJ1Y3QgcG5wX2RldmljZV9pZCBzY2wyMDB3ZHRfcG5wX2RldmljZXNbXSA9IHsKKwkvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBDODczMDcvUEM5NzMwNyB3YXRjaGRvZyBjb21wb25lbnQgKi8KKwl7LmlkID0gIk5TQzA4MDAiLCAuZHJpdmVyX2RhdGEgPSAwfSwKKwl7LmlkID0gIiJ9LAorfTsKKworc3RhdGljIGludCBzY2wyMDB3ZHRfcG5wX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICogZGV2LCBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCAqZGV2X2lkKQoreworCS8qIHRoaXMgZHJpdmVyIG9ubHkgc3VwcG9ydHMgb25lIGNhcmQgYXQgYSB0aW1lICovCisJaWYgKHdkdF9kZXYgfHwgIWlzYXBucCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXdkdF9kZXYgPSBkZXY7CisJaW8gPSBwbnBfcG9ydF9zdGFydCh3ZHRfZGV2LCAwKTsKKwlpb19sZW4gPSBwbnBfcG9ydF9sZW4od2R0X2RldiwgMCk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCBpb19sZW4sIFNDMTIwMF9NT0RVTEVfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHJlZ2lzdGVyIElPIHBvcnQgJSN4XG4iLCBpbyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAic2NsMjAwd2R0OiBQblAgZGV2aWNlIGZvdW5kIGF0IGlvIHBvcnQgJSN4LyVkXG4iLCBpbywgaW9fbGVuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2NsMjAwd2R0X3BucF9yZW1vdmUoc3RydWN0IHBucF9kZXYgKiBkZXYpCit7CisJaWYgKHdkdF9kZXYpeworCQlyZWxlYXNlX3JlZ2lvbihpbywgaW9fbGVuKTsKKwkJd2R0X2RldiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgc2NsMjAwd2R0X3BucF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInNjbDIwMHdkdCIsCisJLmlkX3RhYmxlCT0gc2NsMjAwd2R0X3BucF9kZXZpY2VzLAorCS5wcm9iZQkJPSBzY2wyMDB3ZHRfcG5wX3Byb2JlLAorCS5yZW1vdmUJCT0gc2NsMjAwd2R0X3BucF9yZW1vdmUsCit9OworCisjZW5kaWYgLyogQ09ORklHX1BOUCAqLworCisKK3N0YXRpYyBpbnQgX19pbml0IHNjMTIwMHdkdF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXByaW50ayhiYW5uZXIpOworCisJc3Bpbl9sb2NrX2luaXQoJnNjMTIwMHdkdF9sb2NrKTsKKwlzZW1hX2luaXQoJm9wZW5fc2VtLCAxKTsKKworI2lmIGRlZmluZWQgQ09ORklHX1BOUAorCWlmIChpc2FwbnApIHsKKwkJcmV0ID0gcG5wX3JlZ2lzdGVyX2RyaXZlcigmc2NsMjAwd2R0X3BucF9kcml2ZXIpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfY2xlYW47CisJfQorI2VuZGlmCisKKwlpZiAoaW8gPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW8gcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfY2xlYW47CisJfQorCisjaWYgZGVmaW5lZCBDT05GSUdfUE5QCisJLyogbm93IHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhbiBJTyBwb3J0IGFuZCB3ZSBoYXZlbid0IGRldGVjdGVkCisJICogYW55IGRldmljZXMsIGRpc2FibGUgcG5wIHN1cHBvcnQgKi8KKwlpc2FwbnAgPSAwOworCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmc2NsMjAwd2R0X3BucF9kcml2ZXIpOworI2VuZGlmCisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCBpb19sZW4sIFNDMTIwMF9NT0RVTEVfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHJlZ2lzdGVyIElPIHBvcnQgJSN4XG4iLCBpbyk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXRfY2xlYW47CisJfQorCisJcmV0ID0gc2MxMjAwd2R0X3Byb2JlKCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfaW87CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnNjMTIwMHdkdF9ub3RpZmllcik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIGVyciA9ICVkXG4iLCByZXQpOworCQlnb3RvIG91dF9pbzsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZzYzEyMDB3ZHRfbWlzY2Rldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vciAlZFxuIiwgV0FUQ0hET0dfTUlOT1IpOworCQlnb3RvIG91dF9yYnQ7CisJfQorCisJLyogcmV0ID0gMCAqLworCitvdXRfY2xlYW46CisJcmV0dXJuIHJldDsKKworb3V0X3JidDoKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmc2MxMjAwd2R0X25vdGlmaWVyKTsKKworb3V0X2lvOgorCXJlbGVhc2VfcmVnaW9uKGlvLCBpb19sZW4pOworCisJZ290byBvdXRfY2xlYW47Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHNjMTIwMHdkdF9leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZzYzEyMDB3ZHRfbWlzY2Rldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnNjMTIwMHdkdF9ub3RpZmllcik7CisKKyNpZiBkZWZpbmVkIENPTkZJR19QTlAKKwlpZihpc2FwbnApCisJCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmc2NsMjAwd2R0X3BucF9kcml2ZXIpOworCWVsc2UKKyNlbmRpZgorCXJlbGVhc2VfcmVnaW9uKGlvLCBpb19sZW4pOworfQorCittb2R1bGVfaW5pdChzYzEyMDB3ZHRfaW5pdCk7Cittb2R1bGVfZXhpdChzYzEyMDB3ZHRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlp3YW5lIE13YWlrYW1ibyA8endhbmVAY29tbWZpcmVzZXJ2aWNlcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzA3L1BDOTczMDcgd2F0Y2hkb2cgY29tcG9uZW50Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2M1MjBfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2M1MjBfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkMTQzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zYzUyMF93ZHQuYwpAQCAtMCwwICsxLDQ0NyBAQAorLyoKKyAqCUFNRCBFbGFuIFNDNTIwIHByb2Nlc3NvciBXYXRjaGRvZyBUaW1lciBkcml2ZXIKKyAqCisgKiAgICAgIEJhc2VkIG9uIGFjcXVpcmV3ZHQuYyBieSBBbGFuIENveCwKKyAqICAgICAgICAgICBhbmQgc2JjNjB4eHdkdC5jIGJ5IEpha29iIE9lc3RlcmdhYXJkIDxqYWtvYkB1bnRob3VnaHQubmV0PgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGF1dGhvcnMgZG8gTk9UIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZSB3YXJyYW50eSBmb3IKKyAqCWFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJBUy1JUyIgaW4KKyAqICAgICAgdGhlIGhvcGUgdGhhdCBpdCBtYXkgYmUgdXNlZnVsIGZvciBvdGhlcnMuCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAxICAgIFNjb3R0IEplbm5pbmdzIDxsaW51eGRyaXZlcnNAb3JvLm5ldD4KKyAqICAgICAgICAgICA5LzI3IC0gMjAwMSAgICAgIFtJbml0aWFsIHJlbGVhc2VdCisgKgorICoJQWRkaXRpb25hbCBmaXhlcyBBbGFuIENveAorICoJLQlGaXhlZCBmb3JtYXR0aW5nCisgKgktCVJlbW92ZWQgZGVidWcgcHJpbnRrcworICoJLQlGaXhlZCBTTVAgYnVpbHQga2VybmVsIGRlYWRsb2NrCisgKgktCVN3aXRjaGVkIHRvIHByaXZhdGUgbG9ja3Mgbm90IGxvY2tfa2VybmVsCisgKgktCVVzZWQgaW9yZW1hcC93cml0ZXcvcmVhZHcKKyAqCS0JQWRkZWQgTk9XQVlPVVQgc3VwcG9ydAorICoJNC8xMiAtIDIwMDIgQ2hhbmdlcyBieSBSb2IgUmFkZXogPHJvYkBvc2ludmVzdG9yLmNvbT4KKyAqCS0JQ2hhbmdlIGNvbW1lbnRzCisgKgktCUVsaW1pbmF0ZSBmb3BfbGxzZWVrCisgKgktCUNoYW5nZSBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgc2VtYW50aWNzCisgKgktCUFkZCBLRVJOXyogdGFncyB0byBwcmludGtzCisgKgktCWZpeCBwb3NzaWJsZSB3ZHRfaXNfb3BlbiByYWNlCisgKgktCVJlcG9ydCBwcm9wZXIgY2FwYWJpbGl0aWVzIGluIHdhdGNoZG9nX2luZm8KKyAqCS0JQWRkIFdESU9DX3tHRVRTVEFUVVMsIEdFVEJPT1RTVEFUVVMsIFNFVFRJTUVPVVQsCisgKgkJR0VUVElNRU9VVCwgU0VUT1BUSU9OU30gaW9jdGxzCisgKgkwOS84IC0gMjAwMyBDaGFuZ2VzIGJ5IFdpbSBWYW4gU2Vicm9lY2sgPHdpbUBpZ3VhbmEuYmU+CisgKgktCWNsZWFudXAgb2YgdHJhaWxpbmcgc3BhY2VzCisgKgktCWFkZGVkIGV4dHJhIHByaW50aydzIGZvciBzdGFydHVwIHByb2JsZW1zCisgKgktCXVzZSBtb2R1bGVfcGFyYW0KKyAqCS0JbWFkZSB0aW1lb3V0ICh0aGUgZW11bGF0ZWQgaGVhcnRiZWF0KSBhIG1vZHVsZV9wYXJhbQorICoJLQltYWRlIHRoZSBrZWVwYWxpdmUgcGluZyBhbiBpbnRlcm5hbCBzdWJyb3V0aW5lCisgKgkzLzI3IC0gMjAwNCBDaGFuZ2VzIGJ5IFNlYW4gWW91bmcgPHNlYW5AbWVzcy5vcmc+CisgKgktCXNldCBNTUNSX0JBU0UgdG8gMHhmZmZlZjAwMAorICoJLQlDQkFSIGRvZXMgbm90IG5lZWQgdG8gYmUgcmVhZAorICoJLQlyZW1vdmVkIGRlYnVnZ2luZyBwcmludGtzCisgKgorICogIFRoaXMgV0RUIGRyaXZlciBpcyBkaWZmZXJlbnQgZnJvbSBtb3N0IG90aGVyIExpbnV4IFdEVAorICogIGRyaXZlcnMgaW4gdGhhdCB0aGUgZHJpdmVyIHdpbGwgcGluZyB0aGUgd2F0Y2hkb2cgYnkgaXRzZWxmLAorICogIGJlY2F1c2UgdGhpcyBwYXJ0aWN1bGFyIFdEVCBoYXMgYSB2ZXJ5IHNob3J0IHRpbWVvdXQgKDEuNgorICogIHNlY29uZHMpIGFuZCBpdCB3b3VsZCBiZSBpbnNhbmUgdG8gY291bnQgb24gYW55IHVzZXJzcGFjZQorICogIGRhZW1vbiBhbHdheXMgZ2V0dGluZyBzY2hlZHVsZWQgd2l0aGluIHRoYXQgdGltZSBmcmFtZS4KKyAqCisgKiAgVGhpcyBkcml2ZXIgdXNlcyBtZW1vcnkgbWFwcGVkIElPLCBhbmQgc3BpbmxvY2suCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBPVVJfTkFNRSAic2M1MjBfd2R0IgorI2RlZmluZSBQRlggT1VSX05BTUUgIjogIgorCisvKgorICogVGhlIEFNRCBFbGFuIFNDNTIwIHRpbWVvdXQgdmFsdWUgaXMgNDkydXMgdGltZXMgYSBwb3dlciBvZiAyICgwLTcpCisgKgorICogICAwOiA0OTJ1cyAgICAyOiAxLjAxcyAgICA0OiA0LjAzcyAgIDY6IDE2LjIycworICogICAxOiA1MDNtcyAgICAzOiAyLjAxcyAgICA1OiA4LjA1cyAgIDc6IDMyLjIxcworICoKKyAqIFdlIHdpbGwgcHJvZ3JhbSB0aGUgU0M1MjAgd2F0Y2hkb2cgZm9yIGEgdGltZW91dCBvZiAyLjAxcy4KKyAqIElmIHdlIHJlc2V0IHRoZSB3YXRjaGRvZyBldmVyeSB+MjUwbXMgd2Ugc2hvdWxkIGJlIHNhZmUuCisgKi8KKworI2RlZmluZSBXRFRfSU5URVJWQUwgKEhaLzQrMSkKKworLyoKKyAqIFdlIG11c3Qgbm90IHJlcXVpcmUgdG9vIGdvb2QgcmVzcG9uc2UgZnJvbSB0aGUgdXNlcnNwYWNlIGRhZW1vbi4KKyAqIEhlcmUgd2UgcmVxdWlyZSB0aGUgdXNlcnNwYWNlIGRhZW1vbiB0byBzZW5kIHVzIGEgaGVhcnRiZWF0CisgKiBjaGFyIHRvIC9kZXYvd2F0Y2hkb2cgZXZlcnkgMzAgc2Vjb25kcy4KKyAqLworCisjZGVmaW5lIFdBVENIRE9HX1RJTUVPVVQgMzAJCS8qIDMwIHNlYyBkZWZhdWx0IHRpbWVvdXQgKi8KK3N0YXRpYyBpbnQgdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7CS8qIGluIHNlY29uZHMsIHdpbGwgYmUgbXVsdGlwbGllZCBieSBIWiB0byBnZXQgc2Vjb25kcyB0byB3YWl0IGZvciBhIHBpbmcgKi8KK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzLiAoMTw9dGltZW91dDw9MzYwMCwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19USU1FT1VUKSAiKSIpOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworLyoKKyAqIEFNRCBFbGFuIFNDNTIwIC0gV2F0Y2hkb2cgVGltZXIgUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgTU1DUl9CQVNFCTB4ZmZmZWYwMDAJLyogVGhlIGRlZmF1bHQgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIE9GRlNfV0RUTVJDVEwJMHhDQjAJLyogV2F0Y2hkb2cgVGltZXIgQ29udHJvbCBSZWdpc3RlciAqLworCisvKiBXRFQgQ29udHJvbCBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgV0RUX0VYUF9TRUxfMDEJMHgwMDAxCS8qIFswMV0gVGltZS1vdXQgPSA0OTYgdXMgKHdpdGggMzMgTWh6IGNsaykuICovCisjZGVmaW5lIFdEVF9FWFBfU0VMXzAyCTB4MDAwMgkvKiBbMDJdIFRpbWUtb3V0ID0gNTA4IG1zICh3aXRoIDMzIE1oeiBjbGspLiAqLworI2RlZmluZSBXRFRfRVhQX1NFTF8wMwkweDAwMDQJLyogWzAzXSBUaW1lLW91dCA9IDEuMDIgcyAod2l0aCAzMyBNaHogY2xrKS4gKi8KKyNkZWZpbmUgV0RUX0VYUF9TRUxfMDQJMHgwMDA4CS8qIFswNF0gVGltZS1vdXQgPSAyLjAzIHMgKHdpdGggMzMgTWh6IGNsaykuICovCisjZGVmaW5lIFdEVF9FWFBfU0VMXzA1CTB4MDAxMAkvKiBbMDVdIFRpbWUtb3V0ID0gNC4wNyBzICh3aXRoIDMzIE1oeiBjbGspLiAqLworI2RlZmluZSBXRFRfRVhQX1NFTF8wNgkweDAwMjAJLyogWzA2XSBUaW1lLW91dCA9IDguMTMgcyAod2l0aCAzMyBNaHogY2xrKS4gKi8KKyNkZWZpbmUgV0RUX0VYUF9TRUxfMDcJMHgwMDQwCS8qIFswN10gVGltZS1vdXQgPSAxNi4yN3MgKHdpdGggMzMgTWh6IGNsaykuICovCisjZGVmaW5lIFdEVF9FWFBfU0VMXzA4CTB4MDA4MAkvKiBbMDhdIFRpbWUtb3V0ID0gMzIuNTRzICh3aXRoIDMzIE1oeiBjbGspLiAqLworI2RlZmluZSBXRFRfSVJRX0ZMRwkweDEwMDAJLyogWzEyXSBJbnRlcnJ1cHQgUmVxdWVzdCBGbGFnICovCisjZGVmaW5lIFdEVF9XUlNUX0VOQgkweDQwMDAJLyogWzE0XSBXYXRjaGRvZyBUaW1lciBSZXNldCBFbmFibGUgKi8KKyNkZWZpbmUgV0RUX0VOQgkJMHg4MDAwCS8qIFsxNV0gV2F0Y2hkb2cgVGltZXIgRW5hYmxlICovCisKK3N0YXRpYyBfX3UxNiBfX2lvbWVtICp3ZHRtcmN0bDsKKworc3RhdGljIHZvaWQgd2R0X3RpbWVyX3BpbmcodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X2hlYXJ0YmVhdDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9pc19vcGVuOworc3RhdGljIGNoYXIgd2R0X2V4cGVjdF9jbG9zZTsKK3N0YXRpYyBzcGlubG9ja190IHdkdF9zcGlubG9jazsKKworLyoKKyAqCVdoYWNrIHRoZSBkb2cKKyAqLworCitzdGF0aWMgdm9pZCB3ZHRfdGltZXJfcGluZyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJLyogSWYgd2UgZ290IGEgaGVhcnRiZWF0IHB1bHNlIHdpdGhpbiB0aGUgV0RUX1VTX0lOVEVSVkFMCisJICogd2UgYWdyZWUgdG8gcGluZyB0aGUgV0RUCisJICovCisJaWYodGltZV9iZWZvcmUoamlmZmllcywgbmV4dF9oZWFydGJlYXQpKQorCXsKKwkJLyogUGluZyB0aGUgV0RUICovCisJCXNwaW5fbG9jaygmd2R0X3NwaW5sb2NrKTsKKwkJd3JpdGV3KDB4QUFBQSwgd2R0bXJjdGwpOworCQl3cml0ZXcoMHg1NTU1LCB3ZHRtcmN0bCk7CisJCXNwaW5fdW5sb2NrKCZ3ZHRfc3BpbmxvY2spOworCisJCS8qIFJlLXNldCB0aGUgdGltZXIgaW50ZXJ2YWwgKi8KKwkJdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBXRFRfSU5URVJWQUw7CisJCWFkZF90aW1lcigmdGltZXIpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJIZWFydGJlYXQgbG9zdCEgV2lsbCBub3QgcGluZyB0aGUgd2F0Y2hkb2dcbiIpOworCX0KK30KKworLyoKKyAqCVV0aWxpdHkgcm91dGluZXMKKyAqLworCitzdGF0aWMgdm9pZCB3ZHRfY29uZmlnKGludCB3cml0ZXZhbCkKK3sKKwlfX3UxNiBkdW1teTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogYnV5IHNvbWUgdGltZSAocGluZykgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2R0X3NwaW5sb2NrLCBmbGFncyk7CisJZHVtbXk9cmVhZHcod2R0bXJjdGwpOwkvKiBlbnN1cmUgd3JpdGUgc3luY2hyb25pemF0aW9uICovCisJd3JpdGV3KDB4QUFBQSwgd2R0bXJjdGwpOworCXdyaXRldygweDU1NTUsIHdkdG1yY3RsKTsKKwkvKiB1bmxvY2sgV0RUID0gbWFrZSBXRFQgY29uZmlndXJhdGlvbiByZWdpc3RlciB3cml0YWJsZSBvbmUgdGltZSAqLworCXdyaXRldygweDMzMzMsIHdkdG1yY3RsKTsKKwl3cml0ZXcoMHhDQ0NDLCB3ZHRtcmN0bCk7CisJLyogd3JpdGUgV0RUIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKwl3cml0ZXcod3JpdGV2YWwsIHdkdG1yY3RsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3ZHRfc3BpbmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB3ZHRfc3RhcnR1cCh2b2lkKQoreworCW5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArICh0aW1lb3V0ICogSFopOworCisJLyogU3RhcnQgdGhlIHRpbWVyICovCisJdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBXRFRfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZ0aW1lcik7CisKKwkvKiBTdGFydCB0aGUgd2F0Y2hkb2cgKi8KKwl3ZHRfY29uZmlnKFdEVF9FTkIgfCBXRFRfV1JTVF9FTkIgfCBXRFRfRVhQX1NFTF8wNCk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiV2F0Y2hkb2cgdGltZXIgaXMgbm93IGVuYWJsZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZHRfdHVybm9mZih2b2lkKQoreworCS8qIFN0b3AgdGhlIHRpbWVyICovCisJZGVsX3RpbWVyKCZ0aW1lcik7CisKKwkvKiBTdG9wIHRoZSB3YXRjaGRvZyAqLworCXdkdF9jb25maWcoMCk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiV2F0Y2hkb2cgdGltZXIgaXMgbm93IGRpc2FibGVkLi4uXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZHRfa2VlcGFsaXZlKHZvaWQpCit7CisJLyogdXNlciBsYW5kIHBpbmcgKi8KKwluZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyAodGltZW91dCAqIEhaKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZHRfc2V0X2hlYXJ0YmVhdChpbnQgdCkKK3sKKwlpZiAoKHQgPCAxKSB8fCAodCA+IDM2MDApKQkvKiBhcmJpdHJhcnkgdXBwZXIgbGltaXQgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0aW1lb3V0ID0gdDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCS9kZXYvd2F0Y2hkb2cgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgc3NpemVfdCBmb3Bfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCS8qIFNlZSBpZiB3ZSBnb3QgdGhlIG1hZ2ljIGNoYXJhY3RlciAnVicgYW5kIHJlbG9hZCB0aGUgdGltZXIgKi8KKwlpZihjb3VudCkgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3Qgb2ZzOworCisJCQkvKiBub3RlOiBqdXN0IGluIGNhc2Ugc29tZW9uZSB3cm90ZSB0aGUgbWFnaWMgY2hhcmFjdGVyCisJCQkgKiBmaXZlIG1vbnRocyBhZ28uLi4gKi8KKwkJCXdkdF9leHBlY3RfY2xvc2UgPSAwOworCisJCQkvKiBub3cgc2NhbiAqLworCQkJZm9yKG9mcyA9IDA7IG9mcyAhPSBjb3VudDsgb2ZzKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIG9mcykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmKGMgPT0gJ1YnKQorCQkJCQl3ZHRfZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKworCQkvKiBXZWxsLCBhbnlob3cgc29tZW9uZSB3cm90ZSB0byB1cywgd2Ugc2hvdWxkIHJldHVybiB0aGF0IGZhdm91ciAqLworCQl3ZHRfa2VlcGFsaXZlKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBmb3Bfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCisJLyogSnVzdCBpbiBjYXNlIHdlJ3JlIGFscmVhZHkgdGFsa2luZyB0byBzb21lb25lLi4uICovCisJaWYodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2R0X2lzX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCWlmIChub3dheW91dCkKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKworCS8qIEdvb2QsIGZpcmUgdXAgdGhlIHNob3cgKi8KKwl3ZHRfc3RhcnR1cCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZvcF9jbG9zZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCWlmKHdkdF9leHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJd2R0X3R1cm5vZmYoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCXdkdF9rZWVwYWxpdmUoKTsKKwl9CisJY2xlYXJfYml0KDAsICZ3ZHRfaXNfb3Blbik7CisJd2R0X2V4cGVjdF9jbG9zZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZm9wX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIlNDNTIwIiwKKwl9OworCisJc3dpdGNoKGNtZCkKKwl7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSk/LUVGQVVMVDowOworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCXdkdF9rZWVwYWxpdmUoKTsKKwkJCXJldHVybiAwOworCQljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCXsKKwkJCWludCBuZXdfb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKworCQkJaWYoZ2V0X3VzZXIobmV3X29wdGlvbnMsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZihuZXdfb3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQkJd2R0X3R1cm5vZmYoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlpZihuZXdfb3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCQl3ZHRfc3RhcnR1cCgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQl7CisJCQlpbnQgbmV3X3RpbWVvdXQ7CisKKwkJCWlmKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYod2R0X3NldF9oZWFydGJlYXQobmV3X3RpbWVvdXQpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl3ZHRfa2VlcGFsaXZlKCk7CisJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJfQorCQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCQlyZXR1cm4gcHV0X3VzZXIodGltZW91dCwgcCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3ZHRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IGZvcF93cml0ZSwKKwkub3BlbgkJPSBmb3Bfb3BlbiwKKwkucmVsZWFzZQk9IGZvcF9jbG9zZSwKKwkuaW9jdGwJCT0gZm9wX2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdkdF9taXNjZGV2ID0geworCS5taW5vcgk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCT0gIndhdGNoZG9nIiwKKwkuZm9wcwk9ICZ3ZHRfZm9wcywKK307CisKKy8qCisgKglOb3RpZmllciBmb3Igc3lzdGVtIGRvd24KKyAqLworCitzdGF0aWMgaW50IHdkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCXZvaWQgKnVudXNlZCkKK3sKKwlpZihjb2RlPT1TWVNfRE9XTiB8fCBjb2RlPT1TWVNfSEFMVCkKKwkJd2R0X3R1cm5vZmYoKTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglUaGUgV0RUIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCisgKgl0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2R0X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gd2R0X25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgdm9pZCBfX2V4aXQgc2M1MjBfd2R0X3VubG9hZCh2b2lkKQoreworCWlmICghbm93YXlvdXQpCisJCXdkdF90dXJub2ZmKCk7CisKKwkvKiBEZXJlZ2lzdGVyICovCisJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJaW91bm1hcCh3ZHRtcmN0bCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNjNTIwX3dkdF9pbml0KHZvaWQpCit7CisJaW50IHJjID0gLUVCVVNZOworCisJc3Bpbl9sb2NrX2luaXQoJndkdF9zcGlubG9jayk7CisKKwlpbml0X3RpbWVyKCZ0aW1lcik7CisJdGltZXIuZnVuY3Rpb24gPSB3ZHRfdGltZXJfcGluZzsKKwl0aW1lci5kYXRhID0gMDsKKworCS8qIENoZWNrIHRoYXQgdGhlIHRpbWVvdXQgdmFsdWUgaXMgd2l0aGluIGl0J3MgcmFuZ2UgOyBpZiBub3QgcmVzZXQgdG8gdGhlIGRlZmF1bHQgKi8KKwlpZiAod2R0X3NldF9oZWFydGJlYXQodGltZW91dCkpIHsKKwkJd2R0X3NldF9oZWFydGJlYXQoV0FUQ0hET0dfVElNRU9VVCk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJ0aW1lb3V0IHZhbHVlIG11c3QgYmUgMTw9dGltZW91dDw9MzYwMCwgdXNpbmcgJWRcbiIsCisJCQlXQVRDSERPR19USU1FT1VUKTsKKwl9CisKKwl3ZHRtcmN0bCA9IGlvcmVtYXAoKHVuc2lnbmVkIGxvbmcpKE1NQ1JfQkFTRSArIE9GRlNfV0RUTVJDVEwpLCAyKTsKKwlpZiAoIXdkdG1yY3RsKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byByZW1hcCBtZW1vcnlcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWdpb24yOworCX0KKworCXJjID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAorCQkJcmMpOworCQlnb3RvIGVycl9vdXRfaW9yZW1hcDsKKwl9CisKKwlyYyA9IG1pc2NfcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmMpOworCQlnb3RvIGVycl9vdXRfbm90aWZpZXI7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldEVCBkcml2ZXIgZm9yIFNDNTIwIGluaXRpYWxpc2VkLiB0aW1lb3V0PSVkIHNlYyAobm93YXlvdXQ9JWQpXG4iLAorCQl0aW1lb3V0LG5vd2F5b3V0KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X25vdGlmaWVyOgorCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworZXJyX291dF9pb3JlbWFwOgorCWlvdW5tYXAod2R0bXJjdGwpOworZXJyX291dF9yZWdpb24yOgorCXJldHVybiByYzsKK30KKworbW9kdWxlX2luaXQoc2M1MjBfd2R0X2luaXQpOworbW9kdWxlX2V4aXQoc2M1MjBfd2R0X3VubG9hZCk7CisKK01PRFVMRV9BVVRIT1IoIlNjb3R0IGFuZCBCaWxsIEplbm5pbmdzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3Igd2F0Y2hkb2cgdGltZXIgaW4gQU1EIFwiRWxhblwiIFNDNTIwIHVQcm9jZXNzb3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zY3gyMDBfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2N4MjAwX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Njk2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2N4MjAwX3dkdC5jCkBAIC0wLDAgKzEsMjc0IEBACisvKiBkcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2N4MjAwX3dkdC5jCisKKyAgIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgU0N4MjAwIFdhdGNoZG9nIHN1cHBvcnQKKworICAgQ29weXJpZ2h0IChjKSAyMDAxLDIwMDIgQ2hyaXN0ZXIgV2VpbmlnZWwgPHdpbmdlbEBuYW5vLXN5c3RlbS5jb20+CisKKyAgIFNvbWUgY29kZSB0YWtlbiBmcm9tOgorICAgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzA3L1BDOTczMDcgKGFsYSBTQzEyMDApIFdEVCBkcml2ZXIKKyAgIChjKSBDb3B5cmlnaHQgMjAwMiBad2FuZSBNd2Fpa2FtYm8gPHp3YW5lQGNvbW1maXJlc2VydmljZXMuY29tPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgYXV0aG9yKHMpIG9mIHRoaXMgc29mdHdhcmUgc2hhbGwgbm90IGJlIGhlbGQgbGlhYmxlIGZvciBkYW1hZ2VzCisgICBvZiBhbnkgbmF0dXJlIHJlc3VsdGluZyBkdWUgdG8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzCisgICBzb2Z0d2FyZSBpcyBwcm92aWRlZCBBUy1JUyB3aXRoIG5vIHdhcnJhbnRpZXMuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2N4MjAwLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIE5BTUUgInNjeDIwMF93ZHQiCisKK01PRFVMRV9BVVRIT1IoIkNocmlzdGVyIFdlaW5pZ2VsIDx3aW5nZWxAbmFuby1zeXN0ZW0uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOYXRTZW1pIFNDeDIwMCBXYXRjaGRvZyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKKworI2lmbmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKKyNkZWZpbmUgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIDAKKyNlbmRpZgorCitzdGF0aWMgaW50IG1hcmdpbiA9IDYwOwkJLyogaW4gc2Vjb25kcyAqLworbW9kdWxlX3BhcmFtKG1hcmdpbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWFyZ2luLCAiV2F0Y2hkb2cgbWFyZ2luIGluIHNlY29uZHMiKTsKKworc3RhdGljIGludCBub3dheW91dCA9IENPTkZJR19XQVRDSERPR19OT1dBWU9VVDsKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJEaXNhYmxlIHdhdGNoZG9nIHNodXRkb3duIG9uIGNsb3NlIik7CisKK3N0YXRpYyB1MTYgd2R0b19yZXN0YXJ0Oworc3RhdGljIHN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW1hcGhvcmU7CitzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CisKKy8qIEJpdHMgb2YgdGhlIFdEQ05GRyByZWdpc3RlciAqLworI2RlZmluZSBXX0VOQUJMRSAweDAwZmEJCS8qIEVuYWJsZSB3YXRjaGRvZyAqLworI2RlZmluZSBXX0RJU0FCTEUgMHgwMDAwCS8qIERpc2FibGUgd2F0Y2hkb2cgKi8KKworLyogVGhlIHNjYWxpbmcgZmFjdG9yIGZvciB0aGUgdGltZXIsIHRoaXMgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgV19FTkFCTEUgKi8KKyNkZWZpbmUgV19TQ0FMRSAoMzI3NjgvMTAyNCkKKworc3RhdGljIHZvaWQgc2N4MjAwX3dkdF9waW5nKHZvaWQpCit7CisJb3V0dyh3ZHRvX3Jlc3RhcnQsIHNjeDIwMF9jYl9iYXNlICsgU0N4MjAwX1dEVF9XRFRPKTsKK30KKworc3RhdGljIHZvaWQgc2N4MjAwX3dkdF91cGRhdGVfbWFyZ2luKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBOQU1FICI6IHRpbWVyIG1hcmdpbiAlZCBzZWNvbmRzXG4iLCBtYXJnaW4pOworCXdkdG9fcmVzdGFydCA9IG1hcmdpbiAqIFdfU0NBTEU7Cit9CisKK3N0YXRpYyB2b2lkIHNjeDIwMF93ZHRfZW5hYmxlKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgTkFNRSAiOiBlbmFibGluZyB3YXRjaGRvZyB0aW1lciwgd2R0b19yZXN0YXJ0ID0gJWRcbiIsCisJICAgICAgIHdkdG9fcmVzdGFydCk7CisKKwlvdXR3KDAsIHNjeDIwMF9jYl9iYXNlICsgU0N4MjAwX1dEVF9XRFRPKTsKKwlvdXRiKFNDeDIwMF9XRFRfV0RTVFNfV0RPVkYsIHNjeDIwMF9jYl9iYXNlICsgU0N4MjAwX1dEVF9XRFNUUyk7CisJb3V0dyhXX0VOQUJMRSwgc2N4MjAwX2NiX2Jhc2UgKyBTQ3gyMDBfV0RUX1dEQ05GRyk7CisKKwlzY3gyMDBfd2R0X3BpbmcoKTsKK30KKworc3RhdGljIHZvaWQgc2N4MjAwX3dkdF9kaXNhYmxlKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgTkFNRSAiOiBkaXNhYmxpbmcgd2F0Y2hkb2cgdGltZXJcbiIpOworCisJb3V0dygwLCBzY3gyMDBfY2JfYmFzZSArIFNDeDIwMF9XRFRfV0RUTyk7CisJb3V0YihTQ3gyMDBfV0RUX1dEU1RTX1dET1ZGLCBzY3gyMDBfY2JfYmFzZSArIFNDeDIwMF9XRFRfV0RTVFMpOworCW91dHcoV19ESVNBQkxFLCBzY3gyMDBfY2JfYmFzZSArIFNDeDIwMF9XRFRfV0RDTkZHKTsKK30KKworc3RhdGljIGludCBzY3gyMDBfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogb25seSBhbGxvdyBvbmUgYXQgYSB0aW1lICovCisJaWYgKGRvd25fdHJ5bG9jaygmb3Blbl9zZW1hcGhvcmUpKQorCQlyZXR1cm4gLUVCVVNZOworCXNjeDIwMF93ZHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgc2N4MjAwX3dkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgIT0gNDIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBOQU1FICI6IHdhdGNoZG9nIGRldmljZSBjbG9zZWQgdW5leHBlY3RlZGx5LCB3aWxsIG5vdCBkaXNhYmxlIHRoZSB3YXRjaGRvZyB0aW1lclxuIik7CisJfSBlbHNlIGlmICghbm93YXlvdXQpIHsKKwkJc2N4MjAwX3dkdF9kaXNhYmxlKCk7CisJfQorCWV4cGVjdF9jbG9zZSA9IDA7CisJdXAoJm9wZW5fc2VtYXBob3JlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjeDIwMF93ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGUgPT0gU1lTX0hBTFQgfHwgY29kZSA9PSBTWVNfUE9XRVJfT0ZGKQorCQlpZiAoIW5vd2F5b3V0KQorCQkJc2N4MjAwX3dkdF9kaXNhYmxlKCk7CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2N4MjAwX3dkdF9ub3RpZmllciA9Cit7CisJLm5vdGlmaWVyX2NhbGwgPSBzY3gyMDBfd2R0X25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgc3NpemVfdCBzY3gyMDBfd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCQkgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwkvKiBjaGVjayBmb3IgYSBtYWdpYyBjbG9zZSBjaGFyYWN0ZXIgKi8KKwlpZiAobGVuKQorCXsKKwkJc2l6ZV90IGk7CisKKwkJc2N4MjAwX3dkdF9waW5nKCk7CisKKwkJZXhwZWN0X2Nsb3NlID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCQljaGFyIGM7CisJCQlpZiAoZ2V0X3VzZXIoYywgZGF0YStpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChjID09ICdWJykKKwkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJfQorCisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2N4MjAwX3dkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5pZGVudGl0eSA9ICJOYXRTZW1pIFNDeDIwMCBXYXRjaGRvZyIsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLm9wdGlvbnMgPSAoV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX0tFRVBBTElWRVBJTkcpLAorCX07CisJaW50IG5ld19tYXJnaW47CisKKwlzd2l0Y2ggKGNtZCkgeworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LCBzaXplb2YoaWRlbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCWlmIChwdXRfdXNlcigwLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJc2N4MjAwX3dkdF9waW5nKCk7CisJCXJldHVybiAwOworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJaWYgKGdldF91c2VyKG5ld19tYXJnaW4sIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChuZXdfbWFyZ2luIDwgMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQltYXJnaW4gPSBuZXdfbWFyZ2luOworCQlzY3gyMDBfd2R0X3VwZGF0ZV9tYXJnaW4oKTsKKwkJc2N4MjAwX3dkdF9waW5nKCk7CisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlpZiAocHV0X3VzZXIobWFyZ2luLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNjeDIwMF93ZHRfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkgPSBub19sbHNlZWssCisJLndyaXRlICAgPSBzY3gyMDBfd2R0X3dyaXRlLAorCS5pb2N0bCAgID0gc2N4MjAwX3dkdF9pb2N0bCwKKwkub3BlbiAgICA9IHNjeDIwMF93ZHRfb3BlbiwKKwkucmVsZWFzZSA9IHNjeDIwMF93ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBzY3gyMDBfd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgID0gTkFNRSwKKwkuZm9wcyAgPSAmc2N4MjAwX3dkdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2N4MjAwX3dkdF9pbml0KHZvaWQpCit7CisJaW50IHI7CisKKwlwcmludGsoS0VSTl9ERUJVRyBOQU1FICI6IE5hdFNlbWkgU0N4MjAwIFdhdGNoZG9nIERyaXZlclxuIik7CisKKwkvKiBjaGVjayB0aGF0IHdlIGhhdmUgZm91bmQgdGhlIGNvbmZpZ3VyYXRpb24gYmxvY2sgKi8KKwlpZiAoIXNjeDIwMF9jYl9wcmVzZW50KCkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzY3gyMDBfY2JfYmFzZSArIFNDeDIwMF9XRFRfT0ZGU0VULAorCQkJICAgIFNDeDIwMF9XRFRfU0laRSwKKwkJCSAgICAiTmF0U2VtaSBTQ3gyMDAgV2F0Y2hkb2ciKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIE5BTUUgIjogd2F0Y2hkb2cgSS9PIHJlZ2lvbiBidXN5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzY3gyMDBfd2R0X3VwZGF0ZV9tYXJnaW4oKTsKKwlzY3gyMDBfd2R0X2Rpc2FibGUoKTsKKworCXNlbWFfaW5pdCgmb3Blbl9zZW1hcGhvcmUsIDEpOworCisJciA9IG1pc2NfcmVnaXN0ZXIoJnNjeDIwMF93ZHRfbWlzY2Rldik7CisJaWYgKHIpIHsKKwkJcmVsZWFzZV9yZWdpb24oc2N4MjAwX2NiX2Jhc2UgKyBTQ3gyMDBfV0RUX09GRlNFVCwKKwkJCQlTQ3gyMDBfV0RUX1NJWkUpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzY3gyMDBfd2R0X25vdGlmaWVyKTsKKwlpZiAocikgeworCQlwcmludGsoS0VSTl9FUlIgTkFNRSAiOiB1bmFibGUgdG8gcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIik7CisJCW1pc2NfZGVyZWdpc3Rlcigmc2N4MjAwX3dkdF9taXNjZGV2KTsKKwkJcmVsZWFzZV9yZWdpb24oc2N4MjAwX2NiX2Jhc2UgKyBTQ3gyMDBfV0RUX09GRlNFVCwKKwkJCQlTQ3gyMDBfV0RUX1NJWkUpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNjeDIwMF93ZHRfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzY3gyMDBfd2R0X25vdGlmaWVyKTsKKwltaXNjX2RlcmVnaXN0ZXIoJnNjeDIwMF93ZHRfbWlzY2Rldik7CisJcmVsZWFzZV9yZWdpb24oc2N4MjAwX2NiX2Jhc2UgKyBTQ3gyMDBfV0RUX09GRlNFVCwKKwkJICAgICAgIFNDeDIwMF9XRFRfU0laRSk7Cit9CisKK21vZHVsZV9pbml0KHNjeDIwMF93ZHRfaW5pdCk7Cittb2R1bGVfZXhpdChzY3gyMDBfd2R0X2NsZWFudXApOworCisvKgorICAgIExvY2FsIHZhcmlhYmxlczoKKyAgICAgICAgY29tcGlsZS1jb21tYW5kOiAibWFrZSAtayAtQyAuLi8uLiBTVUJESVJTPWRyaXZlcnMvY2hhciBtb2R1bGVzIgorICAgICAgICBjLWJhc2ljLW9mZnNldDogOAorICAgIEVuZDoKKyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2h3ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zaHdkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzkyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2h3ZHQuYwpAQCAtMCwwICsxLDQ1MiBAQAorLyoKKyAqIGRyaXZlcnMvY2hhci93YXRjaGRvZy9zaHdkdC5jCisgKgorICogV2F0Y2hkb2cgZHJpdmVyIGZvciBpbnRlZ3JhdGVkIHdhdGNoZG9nIGluIHRoZSBTdXBlckggcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMgUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIDE0LURlYy0yMDAxIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqICAgICBBZGRlZCBub3dheW91dCBtb2R1bGUgb3B0aW9uIHRvIG92ZXJyaWRlIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorICoKKyAqIDE5LUFwci0yMDAyIFJvYiBSYWRleiA8cm9iQG9zaW52ZXN0b3IuY29tPgorICogICAgIEFkZGVkIGV4cGVjdCBjbG9zZSBzdXBwb3J0LCBtYWRlIGVtdWxhdGVkIHRpbWVvdXQgcnVudGltZSBjaGFuZ2VhYmxlCisgKiAgICAgZ2VuZXJhbCBjbGVhbnVwcywgYWRkIHNvbWUgaW9jdGxzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3dhdGNoZG9nLmg+CisKKyNkZWZpbmUgUEZYICJzaHdkdDogIgorCisvKgorICogRGVmYXVsdCBjbG9jayBkaXZpc2lvbiByYXRpbyBpcyA1LjI1IG1zZWNzLiBGb3IgYW4gYWRkaXRpb25hbCB0YWJsZSBvZgorICogdmFsdWVzLCBjb25zdWx0IHRoZSBhc20tc2gvd2F0Y2hkb2cuaC4gT3ZlcmxvYWQgdGhpcyBhdCBtb2R1bGUgbG9hZAorICogdGltZS4KKyAqCisgKiBJbiBvcmRlciBmb3IgdGhpcyB0byB3b3JrIHJlbGlhYmx5IHdlIG5lZWQgdG8gaGF2ZSBIWiBzZXQgdG8gMTAwMCBvcgorICogc29tZXRoaW5nIHF1aXRlIGhpZ2hlciB0aGFuIDEwMCAob3Igd2UgbmVlZCBhIHByb3BlciBoaWdoLXJlcyB0aW1lcgorICogaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIGRlYWwgd2l0aCB0aGlzIHByb3Blcmx5KSwgb3RoZXJ3aXNlIHRoZSAxMG1zCisgKiByZXNvbHV0aW9uIG9mIGEgamlmZnkgaXMgZW5vdWdoIHRvIHRyaWdnZXIgdGhlIG92ZXJmbG93LiBGb3IgdGhpbmdzIGxpa2UKKyAqIHRoZSBTSC00IGFuZCBTSC01LCB0aGlzIGlzbid0IG5lY2Vzc2FyaWx5IHRoYXQgYmlnIG9mIGEgcHJvYmxlbSwgdGhvdWdoCisgKiBmb3IgdGhlIFNILTIgYW5kIFNILTMsIHRoaXMgaXNuJ3QgcmVjb21tZW5kZWQgdW5sZXNzIHRoZSBXRFQgaXMgYWJzb2x1dGVseQorICogbmVjc3NhcnkuCisgKgorICogQXMgYSByZXN1bHQgb2YgdGhpcyB0aW1pbmcgcHJvYmxlbSwgdGhlIG9ubHkgbW9kZXMgdGhhdCBhcmUgcGFydGljdWxhcmx5CisgKiBmZWFzaWJsZSBhcmUgdGhlIDQwOTYgYW5kIHRoZSAyMDQ4IGRpdmlzb3JzLCB3aGljaCB5ZWlsZCA1LjI1IGFuZCAyLjYybXMKKyAqIG92ZXJmbG93IHBlcmlvZHMgcmVzcGVjdGl2ZWx5LgorICoKKyAqIEFsc28sIHNpbmNlIHdlIGNhbid0IHJlYWxseSBleHBlY3QgdXNlcnNwYWNlIHRvIGJlIHJlc3BvbnNpdmUgZW5vdWdoCisgKiBiZWZvcmUgdGhlIG92ZXJmbG93IGhhcHBlbnMsIHdlIG1haW50YWluIHR3byBzZXBlcmF0ZSB0aW1lcnMgLi4gT25lIGluCisgKiB0aGUga2VybmVsIGZvciBjbGVhcmluZyBvdXQgV09WRiBldmVyeSAybXMgb3Igc28gKGFnYWluLCB0aGlzIGRlcGVuZHMgb24KKyAqIEhaID09IDEwMDApLCBhbmQgYW5vdGhlciBmb3IgbW9uaXRvcmluZyB1c2Vyc3BhY2Ugd3JpdGVzIHRvIHRoZSBXRFQgZGV2aWNlLgorICoKKyAqIEFzIHN1Y2gsIHdlIGN1cnJlbnRseSB1c2UgYSBjb25maWd1cmFibGUgaGVhcnRiZWF0IGludGVydmFsIHdoaWNoIGRlZmF1bHRzCisgKiB0byAzMHMuIEluIHRoaXMgY2FzZSwgdGhlIHVzZXJzcGFjZSBkYWVtb24gaXMgb25seSByZXNwb25zaWJsZSBmb3IgcGVyaW9kaWMKKyAqIHdyaXRlcyB0byB0aGUgZGV2aWNlIGJlZm9yZSB0aGUgbmV4dCBoZWFydGJlYXQgaXMgc2NoZWR1bGVkLiBJZiB0aGUgZGFlbW9uCisgKiBtaXNzZXMgaXRzIGRlYWRsaW5lLCB0aGUga2VybmVsIHRpbWVyIHdpbGwgYWxsb3cgdGhlIFdEVCB0byBvdmVyZmxvdy4KKyAqLworc3RhdGljIGludCBjbG9ja19kaXZpc2lvbl9yYXRpbyA9IFdUQ1NSX0NLU180MDk2OworCisjZGVmaW5lIG5leHRfcGluZ19wZXJpb2QoY2tzKQltc2Vjc190b19qaWZmaWVzKGNrcyAtIDQpCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNod2R0X2lzX29wZW47CitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gc2hfd2R0X2luZm87CitzdGF0aWMgY2hhciBzaHdkdF9leHBlY3RfY2xvc2U7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X2hlYXJ0YmVhdDsKKworI2RlZmluZSBXQVRDSERPR19IRUFSVEJFQVQgMzAJCQkvKiAzMCBzZWMgZGVmYXVsdCBoZWFydGJlYXQgKi8KK3N0YXRpYyBpbnQgaGVhcnRiZWF0ID0gV0FUQ0hET0dfSEVBUlRCRUFUOwkvKiBpbiBzZWNvbmRzICovCisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKKy8qKgorICogCXNoX3dkdF9zdGFydCAtIFN0YXJ0IHRoZSBXYXRjaGRvZworICoKKyAqIAlTdGFydHMgdGhlIHdhdGNoZG9nLgorICovCitzdGF0aWMgdm9pZCBzaF93ZHRfc3RhcnQodm9pZCkKK3sKKwlfX3U4IGNzcjsKKworCW5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArIChoZWFydGJlYXQgKiBIWik7CisJbW9kX3RpbWVyKCZ0aW1lciwgbmV4dF9waW5nX3BlcmlvZChjbG9ja19kaXZpc2lvbl9yYXRpbykpOworCisJY3NyID0gc2hfd2R0X3JlYWRfY3NyKCk7CisJY3NyIHw9IFdUQ1NSX1dUIHwgY2xvY2tfZGl2aXNpb25fcmF0aW87CisJc2hfd2R0X3dyaXRlX2Nzcihjc3IpOworCisJc2hfd2R0X3dyaXRlX2NudCgwKTsKKworCS8qCisJICogVGhlc2UgcHJvY2Vzc29ycyBoYXZlIGEgYml0IG9mIGFuIGluY29uc2lzdGVudCBpbml0aWFsaXphdGlvbgorCSAqIHByb2Nlc3MuLiBzdGFydGluZyB3aXRoIFNILTMsIFJTVFMgd2FzIG1vdmVkIHRvIFdUQ1NSLCBhbmQgdGhlCisJICogUlNUQ1NSIHJlZ2lzdGVyIHdhcyByZW1vdmVkLgorCSAqCisJICogT24gdGhlIFNILTIgaG93ZXZlciwgaW4gYWRkaXRpb24gd2l0aCBiaXRzIGJlaW5nIGluIGRpZmZlcmVudAorCSAqIGxvY2F0aW9ucywgd2UgbXVzdCBkZWFsIHdpdGggUlNUQ1NSIG91dHJpZ2h0Li4KKwkgKi8KKwljc3IgPSBzaF93ZHRfcmVhZF9jc3IoKTsKKwljc3IgfD0gV1RDU1JfVE1FOworCWNzciAmPSB+V1RDU1JfUlNUUzsKKwlzaF93ZHRfd3JpdGVfY3NyKGNzcik7CisKKyNpZmRlZiBDT05GSUdfQ1BVX1NIMgorCS8qCisJICogV2hvZXZlciBjYW1lIHVwIHdpdGggdGhlIFJTVENTUiBzZW1hbnRpY3MgbXVzdCd2ZSBiZWVuIHNtb2tpbmcKKwkgKiBzb21lIG9mIHRoZSBnb29kIHN0dWZmLCBzaW5jZSBpbiBhZGRpdGlvbiB0byB0aGUgV1RDU1IvV1RDTlQgd3JpdGUKKwkgKiBicmFpbi1kYW1hZ2UsIGl0J3MgbWFuYWdlZCB0byBmdWNrIHRoaW5ncyB1cCBvbmUgc3RlcCBmdXJ0aGVyLi4KKwkgKgorCSAqIElmIHdlIG5lZWQgdG8gY2xlYXIgdGhlIFdPVkYgYml0LCB0aGUgdXBwZXIgYnl0ZSBoYXMgdG8gYmUgMHhhNS4uCisJICogYnV0IGlmIHdlIHdhbnQgdG8gdG91Y2ggUlNURSBvciBSU1RTLCB0aGUgdXBwZXIgYnl0ZSBoYXMgdG8gYmUKKwkgKiAweDVhLi4KKwkgKi8KKwljc3IgPSBzaF93ZHRfcmVhZF9yc3Rjc3IoKTsKKwljc3IgJj0gflJTVENTUl9SU1RTOworCXNoX3dkdF93cml0ZV9yc3Rjc3IoY3NyKTsKKyNlbmRpZgorfQorCisvKioKKyAqIAlzaF93ZHRfc3RvcCAtIFN0b3AgdGhlIFdhdGNoZG9nCisgKgorICogCVN0b3BzIHRoZSB3YXRjaGRvZy4KKyAqLworc3RhdGljIHZvaWQgc2hfd2R0X3N0b3Aodm9pZCkKK3sKKwlfX3U4IGNzcjsKKworCWRlbF90aW1lcigmdGltZXIpOworCisJY3NyID0gc2hfd2R0X3JlYWRfY3NyKCk7CisJY3NyICY9IH5XVENTUl9UTUU7CisJc2hfd2R0X3dyaXRlX2Nzcihjc3IpOworfQorCisvKioKKyAqIAlzaF93ZHRfa2VlcGFsaXZlIC0gS2VlcCB0aGUgVXNlcnNwYWNlIFdhdGNoZG9nIEFsaXZlCisgKgorICogCVRoZSBVc2Vyc3BhY2Ugd2F0Y2hkb2cgZ290IGEgS2VlcEFsaXZlOiBzY2hlZHVsZSB0aGUgbmV4dCBoZWFydGJlYXQuCisgKi8KK3N0YXRpYyB2b2lkIHNoX3dkdF9rZWVwYWxpdmUodm9pZCkKK3sKKwluZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyAoaGVhcnRiZWF0ICogSFopOworfQorCisvKioKKyAqIAlzaF93ZHRfc2V0X2hlYXJ0YmVhdCAtIFNldCB0aGUgVXNlcnNwYWNlIFdhdGNoZG9nIGhlYXJ0YmVhdAorICoKKyAqIAlTZXQgdGhlIFVzZXJzcGFjZSBXYXRjaGRvZyBoZWFydGJlYXQKKyAqLworc3RhdGljIGludCBzaF93ZHRfc2V0X2hlYXJ0YmVhdChpbnQgdCkKK3sKKwlpZiAoKHQgPCAxKSB8fCAodCA+IDM2MDApKSAvKiBhcmJpdHJhcnkgdXBwZXIgbGltaXQgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwloZWFydGJlYXQgPSB0OworCXJldHVybiAwOworfQorCisvKioKKyAqIAlzaF93ZHRfcGluZyAtIFBpbmcgdGhlIFdhdGNoZG9nCisgKgorICoJQGRhdGE6IFVudXNlZAorICoKKyAqIAlDbGVhcnMgb3ZlcmZsb3cgYml0LCByZXNldHMgdGltZXIgY291bnRlci4KKyAqLworc3RhdGljIHZvaWQgc2hfd2R0X3BpbmcodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBuZXh0X2hlYXJ0YmVhdCkpIHsKKwkJX191OCBjc3I7CisKKwkJY3NyID0gc2hfd2R0X3JlYWRfY3NyKCk7CisJCWNzciAmPSB+V1RDU1JfSU9WRjsKKwkJc2hfd2R0X3dyaXRlX2Nzcihjc3IpOworCisJCXNoX3dkdF93cml0ZV9jbnQoMCk7CisKKwkJbW9kX3RpbWVyKCZ0aW1lciwgbmV4dF9waW5nX3BlcmlvZChjbG9ja19kaXZpc2lvbl9yYXRpbykpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJIZWFydGJlYXQgbG9zdCEgV2lsbCBub3QgcGluZyB0aGUgd2F0Y2hkb2dcbiIpOworCX0KK30KKworLyoqCisgKiAJc2hfd2R0X29wZW4gLSBPcGVuIHRoZSBEZXZpY2UKKyAqCisgKiAJQGlub2RlOiBpbm9kZSBvZiBkZXZpY2UKKyAqIAlAZmlsZTogZmlsZSBoYW5kbGUgb2YgZGV2aWNlCisgKgorICogCVdhdGNoZG9nIGRldmljZSBpcyBvcGVuZWQgYW5kIHN0YXJ0ZWQuCisgKi8KK3N0YXRpYyBpbnQgc2hfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnNod2R0X2lzX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCWlmIChub3dheW91dCkKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKworCXNoX3dkdF9zdGFydCgpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisvKioKKyAqIAlzaF93ZHRfY2xvc2UgLSBDbG9zZSB0aGUgRGV2aWNlCisgKgorICogCUBpbm9kZTogaW5vZGUgb2YgZGV2aWNlCisgKiAJQGZpbGU6IGZpbGUgaGFuZGxlIG9mIGRldmljZQorICoKKyAqIAlXYXRjaGRvZyBkZXZpY2UgaXMgY2xvc2VkIGFuZCBzdG9wcGVkLgorICovCitzdGF0aWMgaW50IHNoX3dkdF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoc2h3ZHRfZXhwZWN0X2Nsb3NlID09IDQyKSB7CisJCXNoX3dkdF9zdG9wKCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOworCQlzaF93ZHRfa2VlcGFsaXZlKCk7CisJfQorCisJY2xlYXJfYml0KDAsICZzaHdkdF9pc19vcGVuKTsKKwlzaHdkdF9leHBlY3RfY2xvc2UgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogCXNoX3dkdF93cml0ZSAtIFdyaXRlIHRvIERldmljZQorICoKKyAqIAlAZmlsZTogZmlsZSBoYW5kbGUgb2YgZGV2aWNlCisgKiAJQGJ1ZjogYnVmZmVyIHRvIHdyaXRlCisgKiAJQGNvdW50OiBsZW5ndGggb2YgYnVmZmVyCisgKiAJQHBwb3M6IG9mZnNldAorICoKKyAqIAlQaW5ncyB0aGUgd2F0Y2hkb2cgb24gd3JpdGUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNoX3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWlmIChjb3VudCkgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJc2h3ZHRfZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlzaHdkdF9leHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQlzaF93ZHRfa2VlcGFsaXZlKCk7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIAlzaF93ZHRfaW9jdGwgLSBRdWVyeSBEZXZpY2UKKyAqCisgKiAJQGlub2RlOiBpbm9kZSBvZiBkZXZpY2UKKyAqIAlAZmlsZTogZmlsZSBoYW5kbGUgb2YgZGV2aWNlCisgKiAJQGNtZDogd2F0Y2hkb2cgY29tbWFuZAorICogCUBhcmc6IGFyZ3VtZW50CisgKgorICogCVF1ZXJ5IGJhc2ljIGluZm9ybWF0aW9uIGZyb20gdGhlIGRldmljZSBvciBwaW5nIGl0LCBhcyBvdXRsaW5lZCBieSB0aGUKKyAqIAl3YXRjaGRvZyBBUEkuCisgKi8KK3N0YXRpYyBpbnQgc2hfd2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG5ld19oZWFydGJlYXQ7CisJaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKChzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyAqKWFyZywKKwkJCQkJICAmc2hfd2R0X2luZm8sCisJCQkJCSAgc2l6ZW9mKHNoX3dkdF9pbmZvKSkgPyAtRUZBVUxUIDogMDsKKwkJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcigwLCAoaW50ICopYXJnKTsKKwkJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCQlzaF93ZHRfa2VlcGFsaXZlKCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQkJaWYgKGdldF91c2VyKG5ld19oZWFydGJlYXQsIChpbnQgKilhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAoc2hfd2R0X3NldF9oZWFydGJlYXQobmV3X2hlYXJ0YmVhdCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXNoX3dkdF9rZWVwYWxpdmUoKTsKKwkJCS8qIEZhbGwgKi8KKwkJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQkJcmV0dXJuIHB1dF91c2VyKGhlYXJ0YmVhdCwgKGludCAqKWFyZyk7CisJCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJCWlmIChnZXRfdXNlcihvcHRpb25zLCAoaW50ICopYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKG9wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJCXNoX3dkdF9zdG9wKCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQkJc2hfd2R0X3N0YXJ0KCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJcmV0dXJuIHJldHZhbDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogCXNoX3dkdF9ub3RpZnlfc3lzIC0gTm90aWZpZXIgSGFuZGxlcgorICoKKyAqIAlAdGhpczogbm90aWZpZXIgYmxvY2sKKyAqIAlAY29kZTogbm90aWZpZXIgZXZlbnQKKyAqIAlAdW51c2VkOiB1bnVzZWQKKyAqCisgKiAJSGFuZGxlcyBzcGVjaWZpYyBldmVudHMsIHN1Y2ggYXMgdHVybmluZyBvZmYgdGhlIHdhdGNoZG9nIGR1cmluZyBhCisgKiAJc2h1dGRvd24gZXZlbnQuCisgKi8KK3N0YXRpYyBpbnQgc2hfd2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKSB7CisJCXNoX3dkdF9zdG9wKCk7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzaF93ZHRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IHNoX3dkdF93cml0ZSwKKwkuaW9jdGwJCT0gc2hfd2R0X2lvY3RsLAorCS5vcGVuCQk9IHNoX3dkdF9vcGVuLAorCS5yZWxlYXNlCT0gc2hfd2R0X2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIHNoX3dkdF9pbmZvID0geworCS5vcHRpb25zCQk9IFdESU9GX0tFRVBBTElWRVBJTkcgfCBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfTUFHSUNDTE9TRSwKKwkuZmlybXdhcmVfdmVyc2lvbgk9IDEsCisJLmlkZW50aXR5CQk9ICJTSCBXRFQiLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzaF93ZHRfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwJCT0gc2hfd2R0X25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugc2hfd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJCT0gJnNoX3dkdF9mb3BzLAorfTsKKworLyoqCisgKiAJc2hfd2R0X2luaXQgLSBJbml0aWFsaXplIG1vZHVsZQorICoKKyAqIAlSZWdpc3RlcnMgdGhlIGRldmljZSBhbmQgbm90aWZpZXIgaGFuZGxlci4gQWN0dWFsIGRldmljZQorICogCWluaXRpYWxpemF0aW9uIGlzIGhhbmRsZWQgYnkgc2hfd2R0X29wZW4oKS4KKyAqLworc3RhdGljIGludCBfX2luaXQgc2hfd2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlpZiAoKGNsb2NrX2RpdmlzaW9uX3JhdGlvIDwgMHg1KSB8fCAoY2xvY2tfZGl2aXNpb25fcmF0aW8gPiAweDcpKSB7CisJCWNsb2NrX2RpdmlzaW9uX3JhdGlvID0gV1RDU1JfQ0tTXzQwOTY7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJjbG9ja19kaXZpc2lvbl9yYXRpbyB2YWx1ZSBtdXN0IGJlIDB4NTw9eDw9MHg3LCB1c2luZyAlZFxuIiwKKwkJCWNsb2NrX2RpdmlzaW9uX3JhdGlvKTsKKwl9CisKKwlpZiAoc2hfd2R0X3NldF9oZWFydGJlYXQoaGVhcnRiZWF0KSkKKwl7CisJCWhlYXJ0YmVhdCA9IFdBVENIRE9HX0hFQVJUQkVBVDsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImhlYXJ0YmVhdCB2YWx1ZSBtdXN0IGJlIDE8PXg8PTM2MDAsIHVzaW5nICVkXG4iLAorCQkJaGVhcnRiZWF0KTsKKwl9CisKKwlpbml0X3RpbWVyKCZ0aW1lcik7CisJdGltZXIuZnVuY3Rpb24gPSBzaF93ZHRfcGluZzsKKwl0aW1lci5kYXRhID0gMDsKKworCXJjID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzaF93ZHRfbm90aWZpZXIpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gbWlzY19yZWdpc3Rlcigmc2hfd2R0X21pc2NkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJc2hfd2R0X21pc2NkZXYubWlub3IsIHJjKTsKKwkJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnNoX3dkdF9ub3RpZmllcik7CisJCXJldHVybiByYzsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIGhlYXJ0YmVhdD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKKwkJaGVhcnRiZWF0LCBub3dheW91dCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAJc2hfd2R0X2V4aXQgLSBEZWluaXRpYWxpemUgbW9kdWxlCisgKgorICogCVVucmVnaXN0ZXJzIHRoZSBkZXZpY2UgYW5kIG5vdGlmaWVyIGhhbmRsZXIuIEFjdHVhbCBkZXZpY2UKKyAqIAlkZWluaXRpYWxpemF0aW9uIGlzIGhhbmRsZWQgYnkgc2hfd2R0X2Nsb3NlKCkuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBzaF93ZHRfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3Rlcigmc2hfd2R0X21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzaF93ZHRfbm90aWZpZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlckggd2F0Y2hkb2cgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CisKK21vZHVsZV9wYXJhbShjbG9ja19kaXZpc2lvbl9yYXRpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY2xvY2tfZGl2aXNpb25fcmF0aW8sICJDbG9jayBkaXZpc2lvbiByYXRpby4gVmFsaWQgcmFuZ2VzIGFyZSBmcm9tIDB4NSAoMS4zMW1zKSB0byAweDcgKDUuMjVtcykuIERlZmF1bHRzIHRvIDB4Ny4iKTsKKworbW9kdWxlX3BhcmFtKGhlYXJ0YmVhdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaGVhcnRiZWF0LCAiV2F0Y2hkb2cgaGVhcnRiZWF0IGluIHNlY29uZHMuICgxPD1oZWFydGJlYXQ8PTM2MDAsIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfSEVBUlRCRUFUKSAiKSIpOworCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworbW9kdWxlX2luaXQoc2hfd2R0X2luaXQpOworbW9kdWxlX2V4aXQoc2hfd2R0X2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc29mdGRvZy5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NvZnRkb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTc5MDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NvZnRkb2cuYwpAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqCVNvZnREb2cJMC4wNzoJQSBTb2Z0d2FyZSBXYXRjaGRvZyBEZXZpY2UKKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTYgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgkJCQlodHRwOi8vd3d3LnJlZGhhdC5jb20KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCU5laXRoZXIgQWxhbiBDb3ggbm9yIEN5bXJ1TmV0IEx0ZC4gYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCisgKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKKyAqCSJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTUgICAgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KKyAqCisgKglTb2Z0d2FyZSBvbmx5IHdhdGNoZG9nIGRyaXZlci4gVW5saWtlIGl0cyBiaWcgYnJvdGhlciB0aGUgV0RUNTAxUAorICoJZHJpdmVyIHRoaXMgd29uJ3QgYWx3YXlzIHJlY292ZXIgYSBmYWlsZWQgbWFjaGluZS4KKyAqCisgKiAgMDMvOTY6IEFuZ2VsbyBIYXJpdHNpcyA8YWhAZG9jLmljLmFjLnVrPiA6CisgKglNb2R1bGFyaXNlZC4KKyAqCUFkZGVkIHNvZnRfbWFyZ2luOyB1c2UgdXBvbiBpbnNtb2QgdG8gY2hhbmdlIHRoZSB0aW1lciBkZWxheS4KKyAqCU5COiB1c2VzIHNhbWUgbWlub3IgYXMgd2R0IChXQVRDSERPR19NSU5PUik7IHdlIGNvdWxkIHVzZSBzZXBhcmF0ZQorICoJICAgIG1pbm9ycy4KKyAqCisgKiAgMTk5ODA5MTEgQWxhbiBDb3gKKyAqCU1hZGUgU01QIHNhZmUgZm9yIDIuMy54CisgKgorICogIDIwMDExMTI3IEpvZWwgQmVja2VyIChqbGJlY0BldmlscGxhbi5vcmc+CisgKglBZGRlZCBzb2Z0X25vYm9vdDsgQWxsb3dzIHRlc3RpbmcgdGhlIHNvZnRkb2cgdHJpZ2dlciB3aXRob3V0CisgKglyZXF1aXJpbmcgYSByZWNvbXBpbGUuCisgKglBZGRlZCBXRElPQ19HRVRUSU1FT1VUIGFuZCBXRElPQ19TRVRUSU1PVVQuCisgKgorICogIDIwMDIwNTMwIEpvZWwgQmVja2VyIDxqb2VsLmJlY2tlckBvcmFjbGUuY29tPgorICogIAlBZGRlZCBNYXR0IERvbXNjaCdzIG5vd2F5b3V0IG1vZHVsZSBvcHRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBQRlggIlNvZnREb2c6ICIKKworI2RlZmluZSBUSU1FUl9NQVJHSU4JNjAJCS8qIERlZmF1bHQgaXMgNjAgc2Vjb25kcyAqLworc3RhdGljIGludCBzb2Z0X21hcmdpbiA9IFRJTUVSX01BUkdJTjsJLyogaW4gc2Vjb25kcyAqLworbW9kdWxlX3BhcmFtKHNvZnRfbWFyZ2luLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzb2Z0X21hcmdpbiwgIldhdGNoZG9nIHNvZnRfbWFyZ2luIGluIHNlY29uZHMuICgwPHNvZnRfbWFyZ2luPDY1NTM2LCBkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFRJTUVSX01BUkdJTikgIikiKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKyNpZmRlZiBPTkxZX1RFU1RJTkcKK3N0YXRpYyBpbnQgc29mdF9ub2Jvb3QgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgc29mdF9ub2Jvb3QgPSAwOworI2VuZGlmICAvKiBPTkxZX1RFU1RJTkcgKi8KKworbW9kdWxlX3BhcmFtKHNvZnRfbm9ib290LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzb2Z0X25vYm9vdCwgIlNvZnRkb2cgYWN0aW9uLCBzZXQgdG8gMSB0byBpZ25vcmUgcmVib290cywgMCB0byByZWJvb3QgKGRlZmF1bHQgZGVwZW5kcyBvbiBPTkxZX1RFU1RJTkcpIik7CisKKy8qCisgKglPdXIgdGltZXIKKyAqLworCitzdGF0aWMgdm9pZCB3YXRjaGRvZ19maXJlKHVuc2lnbmVkIGxvbmcpOworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGlja3RvY2sgPQorCQlUSU1FUl9JTklUSUFMSVpFUih3YXRjaGRvZ19maXJlLCAwLCAwKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX2FsaXZlOworc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOworCisKKy8qCisgKglJZiB0aGUgdGltZXIgZXhwaXJlcy4uCisgKi8KKworc3RhdGljIHZvaWQgd2F0Y2hkb2dfZmlyZSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJaWYgKHNvZnRfbm9ib290KQorCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVHJpZ2dlcmVkIC0gUmVib290IGlnbm9yZWQuXG4iKTsKKwllbHNlCisJeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiSW5pdGlhdGluZyBzeXN0ZW0gcmVib290LlxuIik7CisJCW1hY2hpbmVfcmVzdGFydChOVUxMKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlJlYm9vdCBkaWRuJ3QgPz8/Pz9cbiIpOworCX0KK30KKworLyoKKyAqCVNvZnRkb2cgb3BlcmF0aW9ucworICovCisKK3N0YXRpYyBpbnQgc29mdGRvZ19rZWVwYWxpdmUodm9pZCkKK3sKKwltb2RfdGltZXIoJndhdGNoZG9nX3RpY2t0b2NrLCBqaWZmaWVzKyhzb2Z0X21hcmdpbipIWikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvZnRkb2dfc3RvcCh2b2lkKQoreworCWRlbF90aW1lcigmd2F0Y2hkb2dfdGlja3RvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvZnRkb2dfc2V0X2hlYXJ0YmVhdChpbnQgdCkKK3sKKwlpZiAoKHQgPCAweDAwMDEpIHx8ICh0ID4gMHhGRkZGKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzb2Z0X21hcmdpbiA9IHQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgkvZGV2L3dhdGNoZG9nIGhhbmRsaW5nCisgKi8KKworc3RhdGljIGludCBzb2Z0ZG9nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYodGVzdF9hbmRfc2V0X2JpdCgwLCAmdGltZXJfYWxpdmUpKQorCQlyZXR1cm4gLUVCVVNZOworCWlmIChub3dheW91dCkKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwkvKgorCSAqCUFjdGl2YXRlIHRpbWVyCisJICovCisJc29mdGRvZ19rZWVwYWxpdmUoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgc29mdGRvZ19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qCisJICoJU2h1dCBvZmYgdGhlIHRpbWVyLgorCSAqIAlMb2NrIGl0IGluIGlmIGl0J3MgYSBtb2R1bGUgYW5kIHdlIHNldCBub3dheW91dAorCSAqLworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJc29mdGRvZ19zdG9wKCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOworCQlzb2Z0ZG9nX2tlZXBhbGl2ZSgpOworCX0KKwljbGVhcl9iaXQoMCwgJnRpbWVyX2FsaXZlKTsKKwlleHBlY3RfY2xvc2UgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBzb2Z0ZG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCS8qCisJICoJUmVmcmVzaCB0aGUgdGltZXIuCisJICovCisJaWYobGVuKSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQkvKiBJbiBjYXNlIGl0IHdhcyBzZXQgbG9uZyBhZ28gKi8KKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKKwkJCQljaGFyIGM7CisKKwkJCQlpZiAoZ2V0X3VzZXIoYywgZGF0YSArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCXNvZnRkb2dfa2VlcGFsaXZlKCk7CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgc29mdGRvZ19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlpbnQgbmV3X21hcmdpbjsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zID0JCVdESU9GX1NFVFRJTUVPVVQgfAorCQkJCQlXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCQkJV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPQkwLAorCQkuaWRlbnRpdHkgPQkJIlNvZnR3YXJlIFdhdGNoZG9nIiwKKwl9OworCXN3aXRjaCAoY21kKSB7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZpZGVudCwKKwkJCQlzaXplb2YoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCXNvZnRkb2dfa2VlcGFsaXZlKCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQkJaWYgKGdldF91c2VyKG5ld19tYXJnaW4sIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHNvZnRkb2dfc2V0X2hlYXJ0YmVhdChuZXdfbWFyZ2luKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXNvZnRkb2dfa2VlcGFsaXZlKCk7CisJCQkvKiBGYWxsICovCisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJCXJldHVybiBwdXRfdXNlcihzb2Z0X21hcmdpbiwgcCk7CisJfQorfQorCisvKgorICoJTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCisgKi8KKworc3RhdGljIGludCBzb2Z0ZG9nX25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJdm9pZCAqdW51c2VkKQoreworCWlmKGNvZGU9PVNZU19ET1dOIHx8IGNvZGU9PVNZU19IQUxUKSB7CisJCS8qIFR1cm4gdGhlIFdEVCBvZmYgKi8KKwkJc29mdGRvZ19zdG9wKCk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqCUtlcm5lbCBJbnRlcmZhY2VzCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc29mdGRvZ19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gc29mdGRvZ193cml0ZSwKKwkuaW9jdGwJCT0gc29mdGRvZ19pb2N0bCwKKwkub3BlbgkJPSBzb2Z0ZG9nX29wZW4sCisJLnJlbGVhc2UJPSBzb2Z0ZG9nX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugc29mdGRvZ19taXNjZGV2ID0geworCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQkJPSAid2F0Y2hkb2ciLAorCS5mb3BzCQk9ICZzb2Z0ZG9nX2ZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNvZnRkb2dfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwJPSBzb2Z0ZG9nX25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICJTb2Z0d2FyZSBXYXRjaGRvZyBUaW1lcjogMC4wNyBpbml0aWFsaXplZC4gc29mdF9ub2Jvb3Q9JWQgc29mdF9tYXJnaW49JWQgc2VjIChub3dheW91dD0gJWQpXG4iOworCitzdGF0aWMgaW50IF9faW5pdCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCS8qIENoZWNrIHRoYXQgdGhlIHNvZnRfbWFyZ2luIHZhbHVlIGlzIHdpdGhpbiBpdCdzIHJhbmdlIDsgaWYgbm90IHJlc2V0IHRvIHRoZSBkZWZhdWx0ICovCisJaWYgKHNvZnRkb2dfc2V0X2hlYXJ0YmVhdChzb2Z0X21hcmdpbikpIHsKKwkJc29mdGRvZ19zZXRfaGVhcnRiZWF0KFRJTUVSX01BUkdJTik7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJzb2Z0X21hcmdpbiB2YWx1ZSBtdXN0IGJlIDA8c29mdF9tYXJnaW48NjU1MzYsIHVzaW5nICVkXG4iLAorCQkJVElNRVJfTUFSR0lOKTsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnNvZnRkb2dfbm90aWZpZXIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnNvZnRkb2dfbWlzY2Rldik7CisJaWYgKHJldCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnNvZnRkb2dfbm90aWZpZXIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByaW50ayhiYW5uZXIsIHNvZnRfbm9ib290LCBzb2Z0X21hcmdpbiwgbm93YXlvdXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3YXRjaGRvZ19leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZzb2Z0ZG9nX21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzb2Z0ZG9nX25vdGlmaWVyKTsKK30KKworbW9kdWxlX2luaXQod2F0Y2hkb2dfaW5pdCk7Cittb2R1bGVfZXhpdCh3YXRjaGRvZ19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQWxhbiBDb3giKTsKK01PRFVMRV9ERVNDUklQVElPTigiU29mdHdhcmUgV2F0Y2hkb2cgRGV2aWNlIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4MzYyN2hmX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4MzYyN2hmX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2M5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKgl3ODM2MjdoZiBXRFQgZHJpdmVyCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAzIFDhZHJhaWcgQnJhZHkgPFBAZHJhaWdCcmFkeS5jb20+CisgKgorICoJQmFzZWQgb24gYWR2YW50ZWNod2R0LmMgd2hpY2ggaXMgYmFzZWQgb24gd2R0LmMuCisgKglPcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZXM6CisgKgorICoJKGMpIENvcHlyaWdodCAyMDAwLTIwMDEgTWFyZWsgTWljaGFsa2lld2ljeiA8bWFyZWttQGxpbnV4Lm9yZy5wbD4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTYgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgkJCQlodHRwOi8vd3d3LnJlZGhhdC5jb20KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCU5laXRoZXIgQWxhbiBDb3ggbm9yIEN5bXJ1TmV0IEx0ZC4gYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCisgKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKKyAqCSJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTUgICAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBXQVRDSERPR19OQU1FICJ3ODM2MjdoZiBXRFQiCisjZGVmaW5lIFBGWCBXQVRDSERPR19OQU1FICI6ICIKKyNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCA2MAkJLyogNjAgc2VjIGRlZmF1bHQgdGltZW91dCAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfaXNfb3BlbjsKK3N0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKKworLyogWW91IG11c3Qgc2V0IHRoaXMgLSB0aGVyZSBpcyBubyBzYW5lIHdheSB0byBwcm9iZSBmb3IgdGhpcyBib2FyZC4gKi8KK3N0YXRpYyBpbnQgd2R0X2lvID0gMHgyRTsKK21vZHVsZV9wYXJhbSh3ZHRfaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdkdF9pbywgInc4MzYyN2hmIFdEVCBpbyBwb3J0IChkZWZhdWx0IDB4MkUpIik7CisKK3N0YXRpYyBpbnQgdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7CS8qIGluIHNlY29uZHMgKi8KK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzLiAxPD0gdGltZW91dCA8PTYzLCBkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX1RJTUVPVVQpICIuIik7CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCisvKgorICoJS2VybmVsIG1ldGhvZHMuCisgKi8KKworI2RlZmluZSBXRFRfRUZFUiAod2R0X2lvKzApICAgLyogRXh0ZW5kZWQgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVycyAqLworI2RlZmluZSBXRFRfRUZJUiAod2R0X2lvKzApICAgLyogRXh0ZW5kZWQgRnVuY3Rpb24gSW5kZXggUmVnaXN0ZXIgKHNhbWUgYXMgRUZFUikgKi8KKyNkZWZpbmUgV0RUX0VGRFIgKFdEVF9FRklSKzEpIC8qIEV4dGVuZGVkIEZ1bmN0aW9uIERhdGEgUmVnaXN0ZXIgKi8KKworc3RhdGljIHZvaWQKK3c4MzYyN2hmX3NlbGVjdF93ZF9yZWdpc3Rlcih2b2lkKQoreworCW91dGJfcCgweDg3LCBXRFRfRUZFUik7IC8qIEVudGVyIGV4dGVuZGVkIGZ1bmN0aW9uIG1vZGUgKi8KKwlvdXRiX3AoMHg4NywgV0RUX0VGRVIpOyAvKiBBZ2FpbiBhY2NvcmRpbmcgdG8gbWFudWFsICovCisKKwlvdXRiX3AoMHgwNywgV0RUX0VGRVIpOyAvKiBwb2ludCB0byBsb2dpY2FsIGRldmljZSBudW1iZXIgcmVnICovCisJb3V0Yl9wKDB4MDgsIFdEVF9FRkRSKTsgLyogc2VsZWN0IGxvZ2ljYWwgZGV2aWNlIDggKEdQSU8yKSAqLworCW91dGJfcCgweDMwLCBXRFRfRUZFUik7IC8qIHNlbGVjdCBDUjMwICovCisJb3V0Yl9wKDB4MDEsIFdEVF9FRkRSKTsgLyogc2V0IGJpdCAwIHRvIGFjdGl2YXRlIEdQSU8yICovCit9CisKK3N0YXRpYyB2b2lkCit3ODM2MjdoZl91bnNlbGVjdF93ZF9yZWdpc3Rlcih2b2lkKQoreworCW91dGJfcCgweEFBLCBXRFRfRUZFUik7IC8qIExlYXZlIGV4dGVuZGVkIGZ1bmN0aW9uIG1vZGUgKi8KK30KKworLyogdHlhbiBtb3RoZXJib2FyZHMgc2VlbSB0byBzZXQgRjUgdG8gMHg0QyA/CisgKiBTbyBleHBsaWNpdGx5IGluaXQgdG8gYXBwcm9wcmlhdGUgdmFsdWUuICovCitzdGF0aWMgdm9pZAordzgzNjI3aGZfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgdDsKKworCXc4MzYyN2hmX3NlbGVjdF93ZF9yZWdpc3RlcigpOworCisJb3V0Yl9wKDB4RjUsIFdEVF9FRkVSKTsgLyogU2VsZWN0IENSRjUgKi8KKwl0PWluYl9wKFdEVF9FRkRSKTsgICAgICAvKiByZWFkIENSRjUgKi8KKwl0Jj1+MHgwQzsgICAgICAgICAgICAgICAvKiBzZXQgc2Vjb25kIG1vZGUgJiBkaXNhYmxlIGtleWJvYXJkIHR1cm5pbmcgb2ZmIHdhdGNoZG9nICovCisJb3V0Yl9wKHQsIFdEVF9FRkRSKTsgICAgLyogV3JpdGUgYmFjayB0byBDUkY1ICovCisKKwl3ODM2MjdoZl91bnNlbGVjdF93ZF9yZWdpc3RlcigpOworfQorCitzdGF0aWMgdm9pZAord2R0X2N0cmwoaW50IHRpbWVvdXQpCit7CisJdzgzNjI3aGZfc2VsZWN0X3dkX3JlZ2lzdGVyKCk7CisKKwlvdXRiX3AoMHhGNiwgV0RUX0VGRVIpOyAgICAvKiBTZWxlY3QgQ1JGNiAqLworCW91dGJfcCh0aW1lb3V0LCBXRFRfRUZEUik7IC8qIFdyaXRlIFRpbWVvdXQgY291bnRlciB0byBDUkY2ICovCisKKwl3ODM2MjdoZl91bnNlbGVjdF93ZF9yZWdpc3RlcigpOworfQorCitzdGF0aWMgaW50Cit3ZHRfcGluZyh2b2lkKQoreworCXdkdF9jdHJsKHRpbWVvdXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3ZHRfZGlzYWJsZSh2b2lkKQoreworCXdkdF9jdHJsKDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3ZHRfc2V0X2hlYXJ0YmVhdChpbnQgdCkKK3sKKwlpZiAoKHQgPCAxKSB8fCAodCA+IDYzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0aW1lb3V0ID0gdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGNvdW50KSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZitpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQl3ZHRfcGluZygpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCWludCBuZXdfdGltZW91dDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zID0gV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJCS5pZGVudGl0eSA9ICJXODM2MjdIRiBXRFQiLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LCBzaXplb2YoaWRlbnQpKSkKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisJICBicmVhazsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkgIHJldHVybiBwdXRfdXNlcigwLCBwKTsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCSAgd2R0X3BpbmcoKTsKKwkgIGJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCSAgaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKKwkJICByZXR1cm4gLUVGQVVMVDsKKwkgIGlmICh3ZHRfc2V0X2hlYXJ0YmVhdChuZXdfdGltZW91dCkpCisJCSAgcmV0dXJuIC1FSU5WQUw7CisJICB3ZHRfcGluZygpOworCSAgLyogRmFsbCAqLworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCSAgcmV0dXJuIHB1dF91c2VyKHRpbWVvdXQsIHApOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCXsKKwkgIGludCBvcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOworCisJICBpZiAoZ2V0X3VzZXIob3B0aW9ucywgcCkpCisJICAgIHJldHVybiAtRUZBVUxUOworCisJICBpZiAob3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJICAgIHdkdF9kaXNhYmxlKCk7CisJICAgIHJldHZhbCA9IDA7CisJICB9CisKKwkgIGlmIChvcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCSAgICB3ZHRfcGluZygpOworCSAgICByZXR2YWwgPSAwOworCSAgfQorCisJICByZXR1cm4gcmV0dmFsOworCX0KKworCWRlZmF1bHQ6CisJICByZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAord2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJndkdF9pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwkvKgorCSAqCUFjdGl2YXRlCisJICovCisKKwl3ZHRfcGluZygpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludAord2R0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJd2R0X2Rpc2FibGUoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCXdkdF9waW5nKCk7CisJfQorCWV4cGVjdF9jbG9zZSA9IDA7CisJY2xlYXJfYml0KDAsICZ3ZHRfaXNfb3Blbik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglOb3RpZmllciBmb3Igc3lzdGVtIGRvd24KKyAqLworCitzdGF0aWMgaW50Cit3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwl2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkgeworCQkvKiBUdXJuIHRoZSBXRFQgb2ZmICovCisJCXdkdF9kaXNhYmxlKCk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqCUtlcm5lbCBJbnRlcmZhY2VzCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSB3ZHRfd3JpdGUsCisJLmlvY3RsCQk9IHdkdF9pb2N0bCwKKwkub3BlbgkJPSB3ZHRfb3BlbiwKKwkucmVsZWFzZQk9IHdkdF9jbG9zZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3ZHRfbWlzY2RldiA9IHsKKwkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9ICJ3YXRjaGRvZyIsCisJLmZvcHMgPSAmd2R0X2ZvcHMsCit9OworCisvKgorICoJVGhlIFdEVCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bworICoJdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KKyAqLworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHdkdF9ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK3dkdF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXByaW50ayhLRVJOX0lORk8gIldEVCBkcml2ZXIgZm9yIHRoZSBXaW5ib25kKFRNKSBXODM2MjdIRiBTdXBlciBJL08gY2hpcCBpbml0aWFsaXNpbmcuXG4iKTsKKworCWlmICh3ZHRfc2V0X2hlYXJ0YmVhdCh0aW1lb3V0KSkgeworCQl3ZHRfc2V0X2hlYXJ0YmVhdChXQVRDSERPR19USU1FT1VUKTsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJ0aW1lb3V0IHZhbHVlIG11c3QgYmUgMTw9dGltZW91dDw9NjMsIHVzaW5nICVkXG4iLAorCQkJV0FUQ0hET0dfVElNRU9VVCk7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbih3ZHRfaW8sIDEsIFdBVENIRE9HX05BTUUpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCisJCQl3ZHRfaW8pOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwl3ODM2MjdoZl9pbml0KCk7CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAorCQkJcmV0KTsKKwkJZ290byB1bnJlZ19yZWdpb25zOworCX0KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCWdvdG8gdW5yZWdfcmVib290OworCX0KKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIHRpbWVvdXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCisJCXRpbWVvdXQsIG5vd2F5b3V0KTsKKworb3V0OgorCXJldHVybiByZXQ7Cit1bnJlZ19yZWJvb3Q6CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7Cit1bnJlZ19yZWdpb25zOgorCXJlbGVhc2VfcmVnaW9uKHdkdF9pbywgMSk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAord2R0X2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwlyZWxlYXNlX3JlZ2lvbih3ZHRfaW8sMSk7Cit9CisKK21vZHVsZV9pbml0KHdkdF9pbml0KTsKK21vZHVsZV9leGl0KHdkdF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUOFkcmFpZyBCcmFkeSA8UEBkcmFpZ0JyYWR5LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigidzM4NjI3aGYgV0RUIGRyaXZlciIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4Mzg3N2Zfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzODc3Zl93ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2NiZDRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4Mzg3N2Zfd2R0LmMKQEAgLTAsMCArMSw0MjYgQEAKKy8qCisgKglXODM4NzdGIENvbXB1dGVyIFdhdGNoZG9nIFRpbWVyIGRyaXZlcgorICoKKyAqICAgICAgQmFzZWQgb24gYWNxdWlyZXdkdC5jIGJ5IEFsYW4gQ294LAorICogICAgICAgICAgIGFuZCBzYmM2MHh4d2R0LmMgYnkgSmFrb2IgT2VzdGVyZ2FhcmQgPGpha29iQHVudGhvdWdodC5uZXQ+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgYXV0aG9ycyBkbyBOT1QgYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlIHdhcnJhbnR5IGZvcgorICoJYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgIkFTLUlTIiBpbgorICogICAgICB0aGUgaG9wZSB0aGF0IGl0IG1heSBiZSB1c2VmdWwgZm9yIG90aGVycy4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDEgICAgU2NvdHQgSmVubmluZ3MgPGxpbnV4ZHJpdmVyc0Bvcm8ubmV0PgorICoKKyAqICAgICAgICAgICA0LzE5IC0gMjAwMSAgICAgIFtJbml0aWFsIHJldmlzaW9uXQorICogICAgICAgICAgIDkvMjcgLSAyMDAxICAgICAgQWRkZWQgc3BpbmxvY2tpbmcKKyAqICAgICAgICAgICA0LzEyIC0gMjAwMiAgICAgIFtyb2JAb3NpbnZlc3Rvci5jb21dIEVsaW1pbmF0ZSBleHRyYSBjb21tZW50cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxpbWluYXRlIGZvcF9yZWFkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGltaW5hdGUgZXh0cmEgc3Bpbl91bmxvY2sKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEtFUk5fKiB0YWdzIHRvIHByaW50a3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4IHBvc3NpYmxlIHdkdF9pc19vcGVuIHJhY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgd2F0Y2hkb2dfaW5mbyB0byBjb3JyZWN0bHkgcmVmbGVjdCB3aGF0IHRoZSBkcml2ZXIgb2ZmZXJzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBXRElPQ19HRVRTVEFUVVMsIFdESU9DX0dFVEJPT1RTVEFUVVMsIFdESU9DX1NFVFRJTUVPVVQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElPQ19HRVRUSU1FT1VULCBhbmQgV0RJT0NfU0VUT1BUSU9OUyBpb2N0bHMKKyAqICAgICAgICAgICAwOS84IC0gMjAwMyAgICAgIFt3aW1AaWd1YW5hLmJlXSBjbGVhbnVwIG9mIHRyYWlsaW5nIHNwYWNlcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgZXh0cmEgcHJpbnRrJ3MgZm9yIHN0YXJ0dXAgcHJvYmxlbXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSBtb2R1bGVfcGFyYW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZGUgdGltZW91dCAodGhlIGVtdWxhdGVkIGhlYXJ0YmVhdCkgYSBtb2R1bGVfcGFyYW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZGUgdGhlIGtlZXBhbGl2ZSBwaW5nIGFuIGludGVybmFsIHN1YnJvdXRpbmUKKyAqCisgKiAgVGhpcyBXRFQgZHJpdmVyIGlzIGRpZmZlcmVudCBmcm9tIG1vc3Qgb3RoZXIgTGludXggV0RUCisgKiAgZHJpdmVycyBpbiB0aGF0IHRoZSBkcml2ZXIgd2lsbCBwaW5nIHRoZSB3YXRjaGRvZyBieSBpdHNlbGYsCisgKiAgYmVjYXVzZSB0aGlzIHBhcnRpY3VsYXIgV0RUIGhhcyBhIHZlcnkgc2hvcnQgdGltZW91dCAoMS42CisgKiAgc2Vjb25kcykgYW5kIGl0IHdvdWxkIGJlIGluc2FuZSB0byBjb3VudCBvbiBhbnkgdXNlcnNwYWNlCisgKiAgZGFlbW9uIGFsd2F5cyBnZXR0aW5nIHNjaGVkdWxlZCB3aXRoaW4gdGhhdCB0aW1lIGZyYW1lLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBPVVJfTkFNRSAidzgzODc3Zl93ZHQiCisjZGVmaW5lIFBGWCBPVVJfTkFNRSAiOiAiCisKKyNkZWZpbmUgRU5BQkxFX1c4Mzg3N0ZfUE9SVCAweDNGMAorI2RlZmluZSBFTkFCTEVfVzgzODc3RiAweDg3CisjZGVmaW5lIERJU0FCTEVfVzgzODc3RiAweEFBCisjZGVmaW5lIFdEVF9QSU5HIDB4NDQzCisjZGVmaW5lIFdEVF9SRUdJU1RFUiAweDE0CisjZGVmaW5lIFdEVF9FTkFCTEUgMHg5QworI2RlZmluZSBXRFRfRElTQUJMRSAweDhDCisKKy8qCisgKiBUaGUgVzgzODc3RiBzZWVtcyB0byBiZSBmaXhlZCBhdCAxLjZzIHRpbWVvdXQgKGF0IGxlYXN0IG9uIHRoZQorICogRU1BQ1MgUEMtMTA0IGJvYXJkIEknbSB1c2luZykuIElmIHdlIHJlc2V0IHRoZSB3YXRjaGRvZyBldmVyeQorICogfjI1MG1zIHdlIHNob3VsZCBiZSBzYWZlLiAgKi8KKworI2RlZmluZSBXRFRfSU5URVJWQUwgKEhaLzQrMSkKKworLyoKKyAqIFdlIG11c3Qgbm90IHJlcXVpcmUgdG9vIGdvb2QgcmVzcG9uc2UgZnJvbSB0aGUgdXNlcnNwYWNlIGRhZW1vbi4KKyAqIEhlcmUgd2UgcmVxdWlyZSB0aGUgdXNlcnNwYWNlIGRhZW1vbiB0byBzZW5kIHVzIGEgaGVhcnRiZWF0CisgKiBjaGFyIHRvIC9kZXYvd2F0Y2hkb2cgZXZlcnkgMzAgc2Vjb25kcy4KKyAqLworCisjZGVmaW5lIFdBVENIRE9HX1RJTUVPVVQgMzAgICAgICAgICAgICAvKiAzMCBzZWMgZGVmYXVsdCB0aW1lb3V0ICovCitzdGF0aWMgaW50IHRpbWVvdXQgPSBXQVRDSERPR19USU1FT1VUOyAvKiBpbiBzZWNvbmRzLCB3aWxsIGJlIG11bHRpcGxpZWQgYnkgSFogdG8gZ2V0IHNlY29uZHMgdG8gd2FpdCBmb3IgYSBwaW5nICovCittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcy4gKDE8PXRpbWVvdXQ8PTM2MDAsIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfVElNRU9VVCkgIikiKTsKKworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworc3RhdGljIHZvaWQgd2R0X3RpbWVyX3BpbmcodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X2hlYXJ0YmVhdDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9pc19vcGVuOworc3RhdGljIGNoYXIgd2R0X2V4cGVjdF9jbG9zZTsKK3N0YXRpYyBzcGlubG9ja190IHdkdF9zcGlubG9jazsKKworLyoKKyAqCVdoYWNrIHRoZSBkb2cKKyAqLworCitzdGF0aWMgdm9pZCB3ZHRfdGltZXJfcGluZyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJLyogSWYgd2UgZ290IGEgaGVhcnRiZWF0IHB1bHNlIHdpdGhpbiB0aGUgV0RUX1VTX0lOVEVSVkFMCisJICogd2UgYWdyZWUgdG8gcGluZyB0aGUgV0RUCisJICovCisJaWYodGltZV9iZWZvcmUoamlmZmllcywgbmV4dF9oZWFydGJlYXQpKQorCXsKKwkJLyogUGluZyB0aGUgV0RUICovCisJCXNwaW5fbG9jaygmd2R0X3NwaW5sb2NrKTsKKworCQkvKiBQaW5nIHRoZSBXRFQgYnkgcmVhZGluZyBmcm9tIFdEVF9QSU5HICovCisJCWluYl9wKFdEVF9QSU5HKTsKKworCQkvKiBSZS1zZXQgdGhlIHRpbWVyIGludGVydmFsICovCisJCXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgV0RUX0lOVEVSVkFMOworCQlhZGRfdGltZXIoJnRpbWVyKTsKKworCQlzcGluX3VubG9jaygmd2R0X3NwaW5sb2NrKTsKKworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJIZWFydGJlYXQgbG9zdCEgV2lsbCBub3QgcGluZyB0aGUgd2F0Y2hkb2dcbiIpOworCX0KK30KKworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMKKyAqLworCitzdGF0aWMgdm9pZCB3ZHRfY2hhbmdlKGludCB3cml0ZXZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZ3ZHRfc3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIGJ1eSBzb21lIHRpbWUgKi8KKwlpbmJfcChXRFRfUElORyk7CisKKwkvKiBtYWtlIFc4Mzg3N0YgYXZhaWxhYmxlICovCisJb3V0Yl9wKEVOQUJMRV9XODM4NzdGLCAgRU5BQkxFX1c4Mzg3N0ZfUE9SVCk7CisJb3V0Yl9wKEVOQUJMRV9XODM4NzdGLCAgRU5BQkxFX1c4Mzg3N0ZfUE9SVCk7CisKKwkvKiBlbmFibGUgd2F0Y2hkb2cgKi8KKwlvdXRiX3AoV0RUX1JFR0lTVEVSLCAgICBFTkFCTEVfVzgzODc3Rl9QT1JUKTsKKwlvdXRiX3Aod3JpdGV2YWwsICAgICAgICBFTkFCTEVfVzgzODc3Rl9QT1JUKzEpOworCisJLyogbG9jayB0aGUgVzgzODdGRiBhd2F5ICovCisJb3V0Yl9wKERJU0FCTEVfVzgzODc3RiwgRU5BQkxFX1c4Mzg3N0ZfUE9SVCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3ZHRfc3BpbmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgd2R0X3N0YXJ0dXAodm9pZCkKK3sKKwluZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyAodGltZW91dCAqIEhaKTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciAqLworCXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgV0RUX0lOVEVSVkFMOworCWFkZF90aW1lcigmdGltZXIpOworCisJd2R0X2NoYW5nZShXRFRfRU5BQkxFKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJXYXRjaGRvZyB0aW1lciBpcyBub3cgZW5hYmxlZC5cbiIpOworfQorCitzdGF0aWMgdm9pZCB3ZHRfdHVybm9mZih2b2lkKQoreworCS8qIFN0b3AgdGhlIHRpbWVyICovCisJZGVsX3RpbWVyKCZ0aW1lcik7CisKKwl3ZHRfY2hhbmdlKFdEVF9ESVNBQkxFKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJXYXRjaGRvZyB0aW1lciBpcyBub3cgZGlzYWJsZWQuLi5cbiIpOworfQorCitzdGF0aWMgdm9pZCB3ZHRfa2VlcGFsaXZlKHZvaWQpCit7CisJLyogdXNlciBsYW5kIHBpbmcgKi8KKwluZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyAodGltZW91dCAqIEhaKTsKK30KKworLyoKKyAqIC9kZXYvd2F0Y2hkb2cgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgc3NpemVfdCBmb3Bfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCS8qIFNlZSBpZiB3ZSBnb3QgdGhlIG1hZ2ljIGNoYXJhY3RlciAnVicgYW5kIHJlbG9hZCB0aGUgdGltZXIgKi8KKwlpZihjb3VudCkKKwl7CisJCWlmICghbm93YXlvdXQpCisJCXsKKwkJCXNpemVfdCBvZnM7CisKKwkJCS8qIG5vdGU6IGp1c3QgaW4gY2FzZSBzb21lb25lIHdyb3RlIHRoZSBtYWdpYyBjaGFyYWN0ZXIKKwkJCSAqIGZpdmUgbW9udGhzIGFnby4uLiAqLworCQkJd2R0X2V4cGVjdF9jbG9zZSA9IDA7CisKKwkJCS8qIHNjYW4gdG8gc2VlIHdoZXRoZXIgb3Igbm90IHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICovCisJCQlmb3Iob2ZzID0gMDsgb2ZzICE9IGNvdW50OyBvZnMrKykKKwkJCXsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIG9mcykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJd2R0X2V4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisKKwkJLyogc29tZW9uZSB3cm90ZSB0byB1cywgd2Ugc2hvdWxkIHJlc3RhcnQgdGltZXIgKi8KKwkJd2R0X2tlZXBhbGl2ZSgpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZm9wX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwkvKiBKdXN0IGluIGNhc2Ugd2UncmUgYWxyZWFkeSB0YWxraW5nIHRvIHNvbWVvbmUuLi4gKi8KKwlpZih0ZXN0X2FuZF9zZXRfYml0KDAsICZ3ZHRfaXNfb3BlbikpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBHb29kLCBmaXJlIHVwIHRoZSBzaG93ICovCisJd2R0X3N0YXJ0dXAoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgZm9wX2Nsb3NlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJaWYod2R0X2V4cGVjdF9jbG9zZSA9PSA0MikKKwkJd2R0X3R1cm5vZmYoKTsKKwllbHNlIHsKKwkJZGVsX3RpbWVyKCZ0aW1lcik7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJkZXZpY2UgZmlsZSBjbG9zZWQgdW5leHBlY3RlZGx5LiBXaWxsIG5vdCBzdG9wIHRoZSBXRFQhXG4iKTsKKwl9CisJY2xlYXJfYml0KDAsICZ3ZHRfaXNfb3Blbik7CisJd2R0X2V4cGVjdF9jbG9zZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZm9wX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudD0KKwl7CisJCS5vcHRpb25zID0gV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJCS5pZGVudGl0eSA9ICJXODM4NzdGIiwKKwl9OworCisJc3dpdGNoKGNtZCkKKwl7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSk/LUVGQVVMVDowOworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCXdkdF9rZWVwYWxpdmUoKTsKKwkJCXJldHVybiAwOworCQljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCXsKKwkJCWludCBuZXdfb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKworCQkJaWYoZ2V0X3VzZXIobmV3X29wdGlvbnMsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZihuZXdfb3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQkJd2R0X3R1cm5vZmYoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlpZihuZXdfb3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCQl3ZHRfc3RhcnR1cCgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQl7CisJCQlpbnQgbmV3X3RpbWVvdXQ7CisKKwkJCWlmKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYobmV3X3RpbWVvdXQgPCAxIHx8IG5ld190aW1lb3V0ID4gMzYwMCkgLyogYXJiaXRyYXJ5IHVwcGVyIGxpbWl0ICovCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXRpbWVvdXQgPSBuZXdfdGltZW91dDsKKwkJCXdkdF9rZWVwYWxpdmUoKTsKKwkJCS8qIEZhbGwgdGhyb3VnaCAqLworCQl9CisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0LCBwKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gZm9wX3dyaXRlLAorCS5vcGVuCQk9IGZvcF9vcGVuLAorCS5yZWxlYXNlCT0gZm9wX2Nsb3NlLAorCS5pb2N0bAkJPSBmb3BfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJPSAid2F0Y2hkb2ciLAorCS5mb3BzCT0gJndkdF9mb3BzLAorfTsKKworLyoKKyAqCU5vdGlmaWVyIGZvciBzeXN0ZW0gZG93bgorICovCisKK3N0YXRpYyBpbnQgd2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJdm9pZCAqdW51c2VkKQoreworCWlmKGNvZGU9PVNZU19ET1dOIHx8IGNvZGU9PVNZU19IQUxUKQorCQl3ZHRfdHVybm9mZigpOworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqCVRoZSBXRFQgbmVlZHMgdG8gbGVhcm4gYWJvdXQgc29mdCBzaHV0ZG93bnMgaW4gb3JkZXIgdG8KKyAqCXR1cm4gdGhlIHRpbWVib21iIHJlZ2lzdGVycyBvZmYuCisgKi8KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3ZHRfbm90aWZpZXI9Cit7CisJLm5vdGlmaWVyX2NhbGwgPSB3ZHRfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3ODM4NzdmX3dkdF91bmxvYWQodm9pZCkKK3sKKwl3ZHRfdHVybm9mZigpOworCisJLyogRGVyZWdpc3RlciAqLworCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOworCisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJcmVsZWFzZV9yZWdpb24oV0RUX1BJTkcsMSk7CisJcmVsZWFzZV9yZWdpb24oRU5BQkxFX1c4Mzg3N0ZfUE9SVCwyKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdzgzODc3Zl93ZHRfaW5pdCh2b2lkKQoreworCWludCByYyA9IC1FQlVTWTsKKworCXNwaW5fbG9ja19pbml0KCZ3ZHRfc3BpbmxvY2spOworCisJaWYodGltZW91dCA8IDEgfHwgdGltZW91dCA+IDM2MDApIC8qIGFyYml0cmFyeSB1cHBlciBsaW1pdCAqLworCXsKKwkJdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJ0aW1lb3V0IHZhbHVlIG11c3QgYmUgMTw9eDw9MzYwMCwgdXNpbmcgJWRcbiIsCisJCQl0aW1lb3V0KTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKEVOQUJMRV9XODM4NzdGX1BPUlQsIDIsICJXODM4NzdGIFdEVCIpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAorCQkJRU5BQkxFX1c4Mzg3N0ZfUE9SVCk7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oV0RUX1BJTkcsIDEsICJXODM4N0ZGIFdEVCIpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAorCQkJV0RUX1BJTkcpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyX291dF9yZWdpb24xOworCX0KKworCWluaXRfdGltZXIoJnRpbWVyKTsKKwl0aW1lci5mdW5jdGlvbiA9IHdkdF90aW1lcl9waW5nOworCXRpbWVyLmRhdGEgPSAwOworCisJcmMgPSBtaXNjX3JlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CisJaWYgKHJjKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQl3ZHRfbWlzY2Rldi5taW5vciwgcmMpOworCQlnb3RvIGVycl9vdXRfcmVnaW9uMjsKKwl9CisKKwlyYyA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwlpZiAocmMpCisJeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAorCQkJcmMpOworCQlnb3RvIGVycl9vdXRfbWlzY2RldjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiV0RUIGRyaXZlciBmb3IgVzgzODc3RiBpbml0aWFsaXNlZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKKwkJdGltZW91dCwgbm93YXlvdXQpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfbWlzY2RldjoKKwltaXNjX2RlcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKK2Vycl9vdXRfcmVnaW9uMjoKKwlyZWxlYXNlX3JlZ2lvbihXRFRfUElORywxKTsKK2Vycl9vdXRfcmVnaW9uMToKKwlyZWxlYXNlX3JlZ2lvbihFTkFCTEVfVzgzODc3Rl9QT1JULDIpOworZXJyX291dDoKKwlyZXR1cm4gcmM7Cit9CisKK21vZHVsZV9pbml0KHc4Mzg3N2Zfd2R0X2luaXQpOworbW9kdWxlX2V4aXQodzgzODc3Zl93ZHRfdW5sb2FkKTsKKworTU9EVUxFX0FVVEhPUigiU2NvdHQgYW5kIEJpbGwgSmVubmluZ3MiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB3YXRjaGRvZyB0aW1lciBpbiB3ODM4NzdmIGNoaXAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy93YWZlcjU4MjN3ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy93YWZlcjU4MjN3ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmIwYmVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dhZmVyNTgyM3dkdC5jCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICoJSUNQIFdhZmVyIDU4MjMgU2luZ2xlIEJvYXJkIENvbXB1dGVyIFdEVCBkcml2ZXIKKyAqICAgICAgaHR0cDovL3d3dy5pY3BhbWVyaWNhLmNvbS93YWZlcl81ODIzLnBocAorICogICAgICBNYXkgYWxzbyB3b3JrIG9uIG90aGVyIHNpbWlsYXIgbW9kZWxzCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAyIEp1c3RpbiBDb3JtYWNrIDxqdXN0aW5Ac3RyZWV0LXZpc2lvbi5jb20+CisgKgorICogICAgICBSZWxlYXNlIDAuMDIKKyAqCisgKglCYXNlZCBvbiBhZHZhbnRlY2h3ZHQuYyB3aGljaCBpcyBiYXNlZCBvbiB3ZHQuYy4KKyAqCU9yaWdpbmFsIGNvcHlyaWdodCBtZXNzYWdlczoKKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTYtMTk5NyBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCQkJCWh0dHA6Ly93d3cucmVkaGF0LmNvbQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBBbGFuIENveCBub3IgQ3ltcnVOZXQgTHRkLiBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUKKyAqCXdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZAorICoJIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5NSAgICBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBXQVRDSERPR19OQU1FICJXYWZlciA1ODIzIFdEVCIKKyNkZWZpbmUgUEZYIFdBVENIRE9HX05BTUUgIjogIgorI2RlZmluZSBXRF9USU1PIDYwCQkJLyogNjAgc2VjIGRlZmF1bHQgdGltZW91dCAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3YWZ3ZHRfaXNfb3BlbjsKK3N0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKK3N0YXRpYyBzcGlubG9ja190IHdhZndkdF9sb2NrOworCisvKgorICoJWW91IG11c3Qgc2V0IHRoZXNlIC0gdGhlcmUgaXMgbm8gc2FuZSB3YXkgdG8gcHJvYmUgZm9yIHRoaXMgYm9hcmQuCisgKgorICogICAgICBUbyBlbmFibGUsIHdyaXRlIHRoZSB0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMgKDEgdG8gMjU1KSB0byBJL08KKyAqICAgICAgcG9ydCBXRFRfU1RBUlQsIHRoZW4gcmVhZCB0aGUgcG9ydCB0byBzdGFydCB0aGUgd2F0Y2hkb2cuIFRvIHBhdAorICogICAgICB0aGUgZG9nLCByZWFkIHBvcnQgV0RUX1NUT1AgdG8gc3RvcCB0aGUgdGltZXIsIHRoZW4gcmVhZCBXRFRfU1RBUlQKKyAqICAgICAgdG8gcmVzdGFydCBpdCBhZ2Fpbi4KKyAqLworCitzdGF0aWMgaW50IHdkdF9zdG9wID0gMHg4NDM7CitzdGF0aWMgaW50IHdkdF9zdGFydCA9IDB4NDQzOworCitzdGF0aWMgaW50IHRpbWVvdXQgPSBXRF9USU1POyAgLyogaW4gc2Vjb25kcyAqLworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMuIDE8PSB0aW1lb3V0IDw9MjU1LCBkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdEX1RJTU8pICIuIik7CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCitzdGF0aWMgdm9pZCB3YWZ3ZHRfcGluZyh2b2lkKQoreworCS8qIHBhdCB3YXRjaGRvZyAqLworCXNwaW5fbG9jaygmd2Fmd2R0X2xvY2spOworCWluYl9wKHdkdF9zdG9wKTsKKwlpbmJfcCh3ZHRfc3RhcnQpOworCXNwaW5fdW5sb2NrKCZ3YWZ3ZHRfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHdhZndkdF9zdGFydCh2b2lkKQoreworCS8qIHN0YXJ0IHVwIHdhdGNoZG9nICovCisJb3V0Yl9wKHRpbWVvdXQsIHdkdF9zdGFydCk7CisJaW5iX3Aod2R0X3N0YXJ0KTsKK30KKworc3RhdGljIHZvaWQKK3dhZndkdF9zdG9wKHZvaWQpCit7CisJLyogc3RvcCB3YXRjaGRvZyAqLworCWluYl9wKHdkdF9zdG9wKTsKK30KKworc3RhdGljIHNzaXplX3Qgd2Fmd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJLyogU2VlIGlmIHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICdWJyBhbmQgcmVsb2FkIHRoZSB0aW1lciAqLworCWlmIChjb3VudCkgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogSW4gY2FzZSBpdCB3YXMgc2V0IGxvbmcgYWdvICovCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisJCQkvKiBzY2FuIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCB3ZSBnb3QgdGhlIG1hZ2ljIGNoYXJhY3RlciAqLworCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQkvKiBXZWxsLCBhbnlob3cgc29tZW9uZSB3cm90ZSB0byB1cywgd2Ugc2hvdWxkIHJldHVybiB0aGF0IGZhdm91ciAqLworCQl3YWZ3ZHRfcGluZygpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgd2Fmd2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG5ld190aW1lb3V0OworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIldhZmVyIDU4MjMgV0RUIiwKKwl9OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LCBzaXplb2YgKGlkZW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3YWZ3ZHRfcGluZygpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKG5ld190aW1lb3V0IDwgMSkgfHwgKG5ld190aW1lb3V0ID4gMjU1KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl0aW1lb3V0ID0gbmV3X3RpbWVvdXQ7CisJCXdhZndkdF9zdG9wKCk7CisJCXdhZndkdF9zdGFydCgpOworCQkvKiBGYWxsICovCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXR1cm4gcHV0X3VzZXIodGltZW91dCwgcCk7CisKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJeworCQlpbnQgb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKworCQlpZiAoZ2V0X3VzZXIob3B0aW9ucywgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAob3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQl3YWZ3ZHRfc3RhcnQoKTsKKwkJCXJldHZhbCA9IDA7CisJCX0KKworCQlpZiAob3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCXdhZndkdF9zdG9wKCk7CisJCQlyZXR2YWwgPSAwOworCQl9CisKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YWZ3ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2Fmd2R0X2lzX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyoKKwkgKiAgICAgIEFjdGl2YXRlCisJICovCisJd2Fmd2R0X3N0YXJ0KCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50Cit3YWZ3ZHRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgeworCQl3YWZ3ZHRfc3RvcCgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJXRFQgZGV2aWNlIGNsb3NlZCB1bmV4cGVjdGVkbHkuICBXRFQgd2lsbCBub3Qgc3RvcCFcbiIpOworCQl3YWZ3ZHRfcGluZygpOworCX0KKwljbGVhcl9iaXQoMCwgJndhZndkdF9pc19vcGVuKTsKKwlleHBlY3RfY2xvc2UgPSAwOworCXJldHVybiAwOworfQorCisvKgorICoJTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCisgKi8KKworc3RhdGljIGludCB3YWZ3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCQl3YWZ3ZHRfc3RvcCgpOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglLZXJuZWwgSW50ZXJmYWNlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdhZndkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gd2Fmd2R0X3dyaXRlLAorCS5pb2N0bAkJPSB3YWZ3ZHRfaW9jdGwsCisJLm9wZW4JCT0gd2Fmd2R0X29wZW4sCisJLnJlbGVhc2UJPSB3YWZ3ZHRfY2xvc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2Fmd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJPSAid2F0Y2hkb2ciLAorCS5mb3BzCT0gJndhZndkdF9mb3BzLAorfTsKKworLyoKKyAqCVRoZSBXRFQgbmVlZHMgdG8gbGVhcm4gYWJvdXQgc29mdCBzaHV0ZG93bnMgaW4gb3JkZXIgdG8KKyAqCXR1cm4gdGhlIHRpbWVib21iIHJlZ2lzdGVycyBvZmYuCisgKi8KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3YWZ3ZHRfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB3YWZ3ZHRfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHdhZndkdF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXByaW50ayhLRVJOX0lORk8gIldEVCBkcml2ZXIgZm9yIFdhZmVyIDU4MjMgc2luZ2xlIGJvYXJkIGNvbXB1dGVyIGluaXRpYWxpc2luZy5cbiIpOworCisJc3Bpbl9sb2NrX2luaXQoJndhZndkdF9sb2NrKTsKKworCWlmICh0aW1lb3V0IDwgMSB8fCB0aW1lb3V0ID4gMjU1KSB7CisJCXRpbWVvdXQgPSBXRF9USU1POworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggInRpbWVvdXQgdmFsdWUgbXVzdCBiZSAxPD14PD0yNTUsIHVzaW5nICVkXG4iLAorCQkJdGltZW91dCk7CisJfQorCisJaWYgKHdkdF9zdG9wICE9IHdkdF9zdGFydCkgeworCQlpZighcmVxdWVzdF9yZWdpb24od2R0X3N0b3AsIDEsICJXYWZlciA1ODIzIFdEVCIpKSB7CisJCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAorCQkJd2R0X3N0b3ApOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlpZighcmVxdWVzdF9yZWdpb24od2R0X3N0YXJ0LCAxLCAiV2FmZXIgNTgyMyBXRFQiKSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAorCQkJd2R0X3N0YXJ0KTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcjI7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3YWZ3ZHRfbm90aWZpZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gZXJyb3IzOworCX0KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJndhZndkdF9taXNjZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCWdvdG8gZXJyb3I0OworCX0KKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIHRpbWVvdXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCisJCXRpbWVvdXQsIG5vd2F5b3V0KTsKKworCXJldHVybiByZXQ7CitlcnJvcjQ6CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndhZndkdF9ub3RpZmllcik7CitlcnJvcjM6CisJcmVsZWFzZV9yZWdpb24od2R0X3N0YXJ0LCAxKTsKK2Vycm9yMjoKKwlpZiAod2R0X3N0b3AgIT0gd2R0X3N0YXJ0KQorCQlyZWxlYXNlX3JlZ2lvbih3ZHRfc3RvcCwgMSk7CitlcnJvcjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd2Fmd2R0X2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJndhZndkdF9taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2Fmd2R0X25vdGlmaWVyKTsKKwlpZih3ZHRfc3RvcCAhPSB3ZHRfc3RhcnQpCisJCXJlbGVhc2VfcmVnaW9uKHdkdF9zdG9wLCAxKTsKKwlyZWxlYXNlX3JlZ2lvbih3ZHRfc3RhcnQsIDEpOworfQorCittb2R1bGVfaW5pdCh3YWZ3ZHRfaW5pdCk7Cittb2R1bGVfZXhpdCh3YWZ3ZHRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkp1c3RpbiBDb3JtYWNrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklDUCBXYWZlciA1ODIzIFNpbmdsZSBCb2FyZCBDb21wdXRlciBXRFQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CisKKy8qIGVuZCBvZiB3YWZlcjU4MjN3ZHQuYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dkNTAxcC5oIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dkNTAxcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZTYwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvd2Q1MDFwLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqCUluZHVzdHJpYWwgQ29tcHV0ZXIgU291cmNlIFdEVDUwMC81MDEgZHJpdmVyCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk1CUN5bXJ1TkVUIEx0ZAorICoJCQkJSW5ub3ZhdGlvbiBDZW50cmUKKyAqCQkJCVNpbmdsZXRvbiBQYXJrCisgKgkJCQlTd2Fuc2VhCisgKgkJCQlXYWxlcworICoJCQkJVUsKKyAqCQkJCVNBMiA4UFAKKyAqCisgKglodHRwOi8vd3d3LmN5bXJ1Lm5ldAorICoKKyAqCVRoaXMgZHJpdmVyIGlzIHByb3ZpZGVkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkCisgKgloZXJlaW4gYnkgcmVmZXJlbmNlLiBUaGUgZHJpdmVyIGlzIHByb3ZpZGVkIHdpdGhvdXQgd2FycmFudHkgb3IgCisgKglzdXBwb3J0LgorICoKKyAqCVJlbGVhc2UgMC4wNC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjZGVmaW5lIFdEVF9DT1VOVDAJCShpbyswKQorI2RlZmluZSBXRFRfQ09VTlQxCQkoaW8rMSkKKyNkZWZpbmUgV0RUX0NPVU5UMgkJKGlvKzIpCisjZGVmaW5lIFdEVF9DUgkJCShpbyszKQorI2RlZmluZSBXRFRfU1IJCQkoaW8rNCkJLyogU3RhcnQgYnV6emVyIG9uIFBDSSB3cml0ZSAqLworI2RlZmluZSBXRFRfUlQJCQkoaW8rNSkJLyogU3RvcCBidXp6ZXIgb24gUENJIHdyaXRlICovCisjZGVmaW5lIFdEVF9CVVpaRVIJCShpbys2KQkvKiBQQ0kgb25seTogcmQ9ZGlzYWJsZSwgd3I9ZW5hYmxlICovCisjZGVmaW5lIFdEVF9EQwkJCShpbys3KQorCisvKiBUaGUgZm9sbG93aW5nIGFyZSBvbmx5IG9uIHRoZSBQQ0kgY2FyZCwgdGhleSdyZSBvdXRzaWRlIG9mIEkvTyBzcGFjZSBvbgorICogdGhlIElTQSBjYXJkOiAqLworI2RlZmluZSBXRFRfQ0xPQ0sJCShpbysxMikJLyogQ09VTlQyOiByZD0xNi42N01Ieiwgd3I9Mi4wODMzTUh6ICovCisvKiBpbnZlcnRlZCBvcHRvIGlzb2xhdGVkIHJlc2V0IG91dHB1dDogKi8KKyNkZWZpbmUgV0RUX09QVE9OT1RSU1QJCShpbysxMykJLyogd3I9ZW5hYmxlLCByZD1kaXNhYmxlICovCisvKiBvcHRvIGlzb2xhdGVkIHJlc2V0IG91dHB1dDogKi8KKyNkZWZpbmUgV0RUX09QVE9SU1QJCShpbysxNCkJLyogd3I9ZW5hYmxlLCByZD1kaXNhYmxlICovCisvKiBwcm9ncmFtbWFibGUgb3V0cHV0czogKi8KKyNkZWZpbmUgV0RUX1BST0dPVVQJCShpbysxNSkJLyogd3I9ZW5hYmxlLCByZD1kaXNhYmxlICovCisKKwkJCQkJCQkJLyogRkFOIDUwMSA1MDAgKi8KKyNkZWZpbmUgV0RDX1NSX1dDQ1IJCTEJLyogQWN0aXZlIGxvdyAqLwkvKiAgWCAgIFggICBYICAqLworI2RlZmluZSBXRENfU1JfVEdPT0QJCTIJCQkJLyogIFggICBYICAgLSAgKi8KKyNkZWZpbmUgV0RDX1NSX0lTT0kwCQk0CQkJCS8qICBYICAgWCAgIFggICovCisjZGVmaW5lIFdEQ19TUl9JU0lJMQkJOAkJCQkvKiAgWCAgIFggICBYICAqLworI2RlZmluZSBXRENfU1JfRkFOR09PRAkJMTYJCQkJLyogIFggICAtICAgLSAgKi8KKyNkZWZpbmUgV0RDX1NSX1BTVU9WRVIJCTMyCS8qIEFjdGl2ZSBsb3cgKi8JLyogIFggICBYICAgLSAgKi8KKyNkZWZpbmUgV0RDX1NSX1BTVVVORFIJCTY0CS8qIEFjdGl2ZSBsb3cgKi8JLyogIFggICBYICAgLSAgKi8KKyNkZWZpbmUgV0RDX1NSX0lSUQkJMTI4CS8qIEFjdGl2ZSBsb3cgKi8JLyogIFggICBYICAgWCAgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ODRhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvd2R0LmMKQEAgLTAsMCArMSw2NDcgQEAKKy8qCisgKglJbmR1c3RyaWFsIENvbXB1dGVyIFNvdXJjZSBXRFQ1MDAvNTAxIGRyaXZlcgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5Ni0xOTk3IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoJCQkJaHR0cDovL3d3dy5yZWRoYXQuY29tCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQorICoJd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkCisgKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk1ICAgIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CisgKgorICoJUmVsZWFzZSAwLjEwLgorICoKKyAqCUZpeGVzCisgKgkJRGF2ZSBHcmVnb3JpY2gJOglNb2R1bGFyaXNhdGlvbiBhbmQgbWlub3IgYnVncworICoJCUFsYW4gQ294CToJQWRkZWQgdGhlIHdhdGNoZG9nIGlvY3RsKCkgc3R1ZmYKKyAqCQlBbGFuIENveAk6CUZpeGVkIHRoZSByZWJvb3QgcHJvYmxlbSAoYXMgbm90ZWQgYnkKKyAqCQkJCQlNYXR0IENyb2NrZXIpLgorICoJCUFsYW4gQ294CToJQWRkZWQgd2R0PSBib290IG9wdGlvbgorICoJCUFsYW4gQ294CToJQ2xlYW5lZCB1cCBjb3B5L3VzZXIgc3R1ZmYKKyAqCQlUaW0gSG9ja2luCToJQWRkZWQgaW5zbW9kIHBhcmFtZXRlcnMsIGNvbW1lbnQgY2xlYW51cAorICoJCQkJCVBhcmFtZXRlcml6ZWQgdGltZW91dAorICoJCVRpZ3JhbiBBaXZhemlhbgk6CVJlc3RydWN0dXJlZCB3ZHRfaW5pdCgpIHRvIGhhbmRsZSBmYWlsdXJlcworICoJCUpvZWwgQmVja2VyCToJQWRkZWQgV0RJT0NfR0VUL1NFVFRJTUVPVVQKKyAqCQlNYXR0IERvbXNjaAk6CUFkZGVkIG5vd2F5b3V0IG1vZHVsZSBvcHRpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlICJ3ZDUwMXAuaCIKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CitzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CisKKy8qCisgKglNb2R1bGUgcGFyYW1ldGVycworICovCisKKyNkZWZpbmUgV0RfVElNTyA2MAkJCS8qIERlZmF1bHQgaGVhcnRiZWF0ID0gNjAgc2Vjb25kcyAqLworCitzdGF0aWMgaW50IGhlYXJ0YmVhdCA9IFdEX1RJTU87CitzdGF0aWMgaW50IHdkX2hlYXJ0YmVhdDsKK21vZHVsZV9wYXJhbShoZWFydGJlYXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhlYXJ0YmVhdCwgIldhdGNoZG9nIGhlYXJ0YmVhdCBpbiBzZWNvbmRzLiAoMDxoZWFydGJlYXQ8NjU1MzYsIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0RfVElNTykgIikiKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qIFlvdSBtdXN0IHNldCB0aGVzZSAtIHRoZXJlIGlzIG5vIHNhbmUgd2F5IHRvIHByb2JlIGZvciB0aGlzIGJvYXJkLiAqLworc3RhdGljIGludCBpbz0weDI0MDsKK3N0YXRpYyBpbnQgaXJxPTExOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiV0RUIGlvIHBvcnQgKGRlZmF1bHQ9MHgyNDApIik7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJXRFQgaXJxIChkZWZhdWx0PTExKSIpOworCisjaWZkZWYgQ09ORklHX1dEVF81MDEKKy8qIFN1cHBvcnQgZm9yIHRoZSBGYW4gVGFjaG9tZXRlciBvbiB0aGUgV0RUNTAxLVAgKi8KK3N0YXRpYyBpbnQgdGFjaG9tZXRlcjsKKworbW9kdWxlX3BhcmFtKHRhY2hvbWV0ZXIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRhY2hvbWV0ZXIsICJXRFQ1MDEtUCBGYW4gVGFjaG9tZXRlciBzdXBwb3J0ICgwPWRpc2FibGUsIGRlZmF1bHQ9MCkiKTsKKyNlbmRpZiAvKiBDT05GSUdfV0RUXzUwMSAqLworCisvKgorICoJUHJvZ3JhbW1pbmcgc3VwcG9ydAorICovCisKK3N0YXRpYyB2b2lkIHdkdF9jdHJfbW9kZShpbnQgY3RyLCBpbnQgbW9kZSkKK3sKKwljdHI8PD02OworCWN0cnw9MHgzMDsKKwljdHJ8PShtb2RlPDwxKTsKKwlvdXRiX3AoY3RyLCBXRFRfQ1IpOworfQorCitzdGF0aWMgdm9pZCB3ZHRfY3RyX2xvYWQoaW50IGN0ciwgaW50IHZhbCkKK3sKKwlvdXRiX3AodmFsJjB4RkYsIFdEVF9DT1VOVDArY3RyKTsKKwlvdXRiX3AodmFsPj44LCBXRFRfQ09VTlQwK2N0cik7Cit9CisKKy8qKgorICoJd2R0X3N0YXJ0OgorICoKKyAqCVN0YXJ0IHRoZSB3YXRjaGRvZyBkcml2ZXIuCisgKi8KKworc3RhdGljIGludCB3ZHRfc3RhcnQodm9pZCkKK3sKKwlpbmJfcChXRFRfREMpOwkJCS8qIERpc2FibGUgd2F0Y2hkb2cgKi8KKwl3ZHRfY3RyX21vZGUoMCwzKTsJCS8qIFByb2dyYW0gQ1RSMCBmb3IgTW9kZSAzOiBTcXVhcmUgV2F2ZSBHZW5lcmF0b3IgKi8KKwl3ZHRfY3RyX21vZGUoMSwyKTsJCS8qIFByb2dyYW0gQ1RSMSBmb3IgTW9kZSAyOiBSYXRlIEdlbmVyYXRvciAqLworCXdkdF9jdHJfbW9kZSgyLDApOwkJLyogUHJvZ3JhbSBDVFIyIGZvciBNb2RlIDA6IFB1bHNlIG9uIFRlcm1pbmFsIENvdW50ICovCisJd2R0X2N0cl9sb2FkKDAsIDg5NDgpOwkJLyogQ291bnQgYXQgMTAwSHogKi8KKwl3ZHRfY3RyX2xvYWQoMSx3ZF9oZWFydGJlYXQpOwkvKiBIZWFydGJlYXQgKi8KKwl3ZHRfY3RyX2xvYWQoMiw2NTUzNSk7CQkvKiBMZW5ndGggb2YgcmVzZXQgcHVsc2UgKi8KKwlvdXRiX3AoMCwgV0RUX0RDKTsJCS8qIEVuYWJsZSB3YXRjaGRvZyAqLworCXJldHVybiAwOworfQorCisvKioKKyAqCXdkdF9zdG9wOgorICoKKyAqCVN0b3AgdGhlIHdhdGNoZG9nIGRyaXZlci4KKyAqLworCitzdGF0aWMgaW50IHdkdF9zdG9wICh2b2lkKQoreworCS8qIFR1cm4gdGhlIGNhcmQgb2ZmICovCisJaW5iX3AoV0RUX0RDKTsJCQkvKiBEaXNhYmxlIHdhdGNoZG9nICovCisJd2R0X2N0cl9sb2FkKDIsMCk7CQkvKiAwIGxlbmd0aCByZXNldCBwdWxzZXMgbm93ICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJd2R0X3Bpbmc6CisgKgorICoJUmVsb2FkIGNvdW50ZXIgb25lIHdpdGggdGhlIHdhdGNoZG9nIGhlYXJ0YmVhdC4gV2UgZG9uJ3QgYm90aGVyIHJlbG9hZGluZworICoJdGhlIGNhc2NhZGUgY291bnRlci4KKyAqLworCitzdGF0aWMgaW50IHdkdF9waW5nKHZvaWQpCit7CisJLyogV3JpdGUgYSB3YXRjaGRvZyB2YWx1ZSAqLworCWluYl9wKFdEVF9EQyk7CQkJLyogRGlzYWJsZSB3YXRjaGRvZyAqLworCXdkdF9jdHJfbW9kZSgxLDIpOwkJLyogUmUtUHJvZ3JhbSBDVFIxIGZvciBNb2RlIDI6IFJhdGUgR2VuZXJhdG9yICovCisJd2R0X2N0cl9sb2FkKDEsd2RfaGVhcnRiZWF0KTsJLyogSGVhcnRiZWF0ICovCisJb3V0Yl9wKDAsIFdEVF9EQyk7CQkvKiBFbmFibGUgd2F0Y2hkb2cgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl3ZHRfc2V0X2hlYXJ0YmVhdDoKKyAqCUB0OgkJdGhlIG5ldyBoZWFydGJlYXQgdmFsdWUgdGhhdCBuZWVkcyB0byBiZSBzZXQuCisgKgorICoJU2V0IGEgbmV3IGhlYXJ0YmVhdCB2YWx1ZSBmb3IgdGhlIHdhdGNoZG9nIGRldmljZS4gSWYgdGhlIGhlYXJ0YmVhdCB2YWx1ZSBpcworICoJaW5jb3JyZWN0IHdlIGtlZXAgdGhlIG9sZCB2YWx1ZSBhbmQgcmV0dXJuIC1FSU5WQUwuIElmIHN1Y2Nlc3NmdWxsIHdlCisgKglyZXR1cm4gMC4KKyAqLworc3RhdGljIGludCB3ZHRfc2V0X2hlYXJ0YmVhdChpbnQgdCkKK3sKKwlpZiAoKHQgPCAxKSB8fCAodCA+IDY1NTM1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwloZWFydGJlYXQgPSB0OworCXdkX2hlYXJ0YmVhdCA9IHQgKiAxMDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJd2R0X2dldF9zdGF0dXM6CisgKglAc3RhdHVzOgkJdGhlIG5ldyBzdGF0dXMuCisgKgorICoJRXh0cmFjdCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGZyb20gYSBXRFQgd2F0Y2hkb2cgZGV2aWNlLiBUaGVyZSBhcmUKKyAqCXNldmVyYWwgYm9hcmQgdmFyaWFudHMgc28gd2UgaGF2ZSB0byBrbm93IHdoaWNoIGJpdHMgYXJlIHZhbGlkLiBTb21lCisgKgliaXRzIGRlZmF1bHQgdG8gb25lIGFuZCBzb21lIHRvIHplcm8gaW4gb3JkZXIgdG8gYmUgbWF4aW1hbGx5IHBhaW5mdWwuCisgKgorICoJd2UgdGhlbiBtYXAgdGhlIGJpdHMgb250byB0aGUgc3RhdHVzIGlvY3RsIGZsYWdzLgorICovCisKK3N0YXRpYyBpbnQgd2R0X2dldF9zdGF0dXMoaW50ICpzdGF0dXMpCit7CisJdW5zaWduZWQgY2hhciBuZXdfc3RhdHVzPWluYl9wKFdEVF9TUik7CisKKwkqc3RhdHVzPTA7CisJaWYgKG5ld19zdGF0dXMgJiBXRENfU1JfSVNPSTApCisJCSpzdGF0dXMgfD0gV0RJT0ZfRVhURVJOMTsKKwlpZiAobmV3X3N0YXR1cyAmIFdEQ19TUl9JU0lJMSkKKwkJKnN0YXR1cyB8PSBXRElPRl9FWFRFUk4yOworI2lmZGVmIENPTkZJR19XRFRfNTAxCisJaWYgKCEobmV3X3N0YXR1cyAmIFdEQ19TUl9UR09PRCkpCisJCSpzdGF0dXMgfD0gV0RJT0ZfT1ZFUkhFQVQ7CisJaWYgKCEobmV3X3N0YXR1cyAmIFdEQ19TUl9QU1VPVkVSKSkKKwkJKnN0YXR1cyB8PSBXRElPRl9QT1dFUk9WRVI7CisJaWYgKCEobmV3X3N0YXR1cyAmIFdEQ19TUl9QU1VVTkRSKSkKKwkJKnN0YXR1cyB8PSBXRElPRl9QT1dFUlVOREVSOworCWlmICh0YWNob21ldGVyKSB7CisJCWlmICghKG5ld19zdGF0dXMgJiBXRENfU1JfRkFOR09PRCkpCisJCQkqc3RhdHVzIHw9IFdESU9GX0ZBTkZBVUxUOworCX0KKyNlbmRpZiAvKiBDT05GSUdfV0RUXzUwMSAqLworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1dEVF81MDEKKy8qKgorICoJd2R0X2dldF90ZW1wZXJhdHVyZToKKyAqCisgKglSZXBvcnRzIHRoZSB0ZW1wZXJhdHVyZSBpbiBkZWdyZWVzIEZhaHJlbmhlaXQuIFRoZSBBUEkgaXMgaW4KKyAqCWZhcmVuaGVpdC4gSXQgd2FzIGRlc2lnbmVkIGJ5IGFuIGltcGVyaWFsIG1lYXN1cmVtZW50IGx1ZGRpdGUuCisgKi8KKworc3RhdGljIGludCB3ZHRfZ2V0X3RlbXBlcmF0dXJlKGludCAqdGVtcGVyYXR1cmUpCit7CisJdW5zaWduZWQgc2hvcnQgYz1pbmJfcChXRFRfUlQpOworCisJKnRlbXBlcmF0dXJlID0gKGMgKiAxMSAvIDE1KSArIDc7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDEgKi8KKworLyoqCisgKgl3ZHRfaW50ZXJydXB0OgorICoJQGlycToJCUludGVycnVwdCBudW1iZXIKKyAqCUBkZXZfaWQ6CVVudXNlZCBhcyB3ZSBkb24ndCBhbGxvdyBtdWx0aXBsZSBkZXZpY2VzLgorICoJQHJlZ3M6CQlVbnVzZWQuCisgKgorICoJSGFuZGxlIGFuIGludGVycnVwdCBmcm9tIHRoZSBib2FyZC4gVGhlc2UgYXJlIHJhaXNlZCB3aGVuIHRoZSBzdGF0dXMKKyAqCW1hcCBjaGFuZ2VzIGluIHdoYXQgdGhlIGJvYXJkIGNvbnNpZGVycyBhbiBpbnRlcmVzdGluZyB3YXkuIFRoYXQgbWVhbnMKKyAqCWEgZmFpbHVyZSBjb25kaXRpb24gb2NjdXJyaW5nLgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3ZHRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyoKKwkgKglSZWFkIHRoZSBzdGF0dXMgcmVnaXN0ZXIgc2VlIHdoYXQgaXMgdXAgYW5kCisJICoJdGhlbiBwcmludGsgaXQuCisJICovCisJdW5zaWduZWQgY2hhciBzdGF0dXM9aW5iX3AoV0RUX1NSKTsKKworCXByaW50ayhLRVJOX0NSSVQgIldEVCBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisKKyNpZmRlZiBDT05GSUdfV0RUXzUwMQorCWlmICghKHN0YXR1cyAmIFdEQ19TUl9UR09PRCkpCisJCXByaW50ayhLRVJOX0NSSVQgIk92ZXJoZWF0IGFsYXJtLiglZClcbiIsaW5iX3AoV0RUX1JUKSk7CisJaWYgKCEoc3RhdHVzICYgV0RDX1NSX1BTVU9WRVIpKQorCQlwcmludGsoS0VSTl9DUklUICJQU1Ugb3ZlciB2b2x0YWdlLlxuIik7CisJaWYgKCEoc3RhdHVzICYgV0RDX1NSX1BTVVVORFIpKQorCQlwcmludGsoS0VSTl9DUklUICJQU1UgdW5kZXIgdm9sdGFnZS5cbiIpOworCWlmICh0YWNob21ldGVyKSB7CisJCWlmICghKHN0YXR1cyAmIFdEQ19TUl9GQU5HT09EKSkKKwkJCXByaW50ayhLRVJOX0NSSVQgIlBvc3NpYmxlIGZhbiBmYXVsdC5cbiIpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfV0RUXzUwMSAqLworCWlmICghKHN0YXR1cyAmIFdEQ19TUl9XQ0NSKSkKKyNpZmRlZiBTT0ZUV0FSRV9SRUJPT1QKKyNpZmRlZiBPTkxZX1RFU1RJTkcKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiV291bGQgUmVib290LlxuIik7CisjZWxzZQorCQlwcmludGsoS0VSTl9DUklUICJJbml0aWF0aW5nIHN5c3RlbSByZWJvb3QuXG4iKTsKKwkJbWFjaGluZV9yZXN0YXJ0KE5VTEwpOworI2VuZGlmCisjZWxzZQorCQlwcmludGsoS0VSTl9DUklUICJSZXNldCBpbiA1bXMuXG4iKTsKKyNlbmRpZgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKioKKyAqCXdkdF93cml0ZToKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgd2F0Y2hkb2cKKyAqCUBidWY6IGJ1ZmZlciB0byB3cml0ZSAodW51c2VkIGFzIGRhdGEgZG9lcyBub3QgbWF0dGVyIGhlcmUKKyAqCUBjb3VudDogY291bnQgb2YgYnl0ZXMKKyAqCUBwcG9zOiBwb2ludGVyIHRvIHRoZSBwb3NpdGlvbiB0byB3cml0ZS4gTm8gc2Vla3MgYWxsb3dlZAorICoKKyAqCUEgd3JpdGUgdG8gYSB3YXRjaGRvZyBkZXZpY2UgaXMgZGVmaW5lZCBhcyBhIGtlZXBhbGl2ZSBzaWduYWwuIEFueQorICoJd3JpdGUgb2YgZGF0YSB3aWxsIGRvLCBhcyB3ZSB3ZSBkb24ndCBkZWZpbmUgY29udGVudCBtZWFuaW5nLgorICovCisKK3N0YXRpYyBzc2l6ZV90IHdkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYoY291bnQpIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qIEluIGNhc2UgaXQgd2FzIHNldCBsb25nIGFnbyAqLworCQkJZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQl3ZHRfcGluZygpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICoJd2R0X2lvY3RsOgorICoJQGlub2RlOiBpbm9kZSBvZiB0aGUgZGV2aWNlCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIGRldmljZQorICoJQGNtZDogd2F0Y2hkb2cgY29tbWFuZAorICoJQGFyZzogYXJndW1lbnQgcG9pbnRlcgorICoKKyAqCVRoZSB3YXRjaGRvZyBBUEkgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgZnVuY3Rpb25zIGZvciBhbGwgd2F0Y2hkb2dzCisgKglhY2NvcmRpbmcgdG8gdGhlaXIgYXZhaWxhYmxlIGZlYXR1cmVzLiBXZSBvbmx5IGFjdHVhbGx5IHVzZWZ1bGx5IHN1cHBvcnQKKyAqCXF1ZXJ5aW5nIGNhcGFiaWxpdGllcyBhbmQgY3VycmVudCBzdGF0dXMuCisgKi8KKworc3RhdGljIGludCB3ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJaW50IG5ld19oZWFydGJlYXQ7CisJaW50IHN0YXR1czsKKworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPQkJV0RJT0ZfU0VUVElNRU9VVHwKKwkJCQkJV0RJT0ZfTUFHSUNDTE9TRXwKKwkJCQkJV0RJT0ZfS0VFUEFMSVZFUElORywKKwkJLmZpcm13YXJlX3ZlcnNpb24gPQkxLAorCQkuaWRlbnRpdHkgPQkJIldEVDUwMC81MDEiLAorCX07CisKKwkvKiBBZGQgb3B0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGNhcmQgd2UgaGF2ZSAqLworCWlkZW50Lm9wdGlvbnMgfD0gKFdESU9GX0VYVEVSTjF8V0RJT0ZfRVhURVJOMik7CisjaWZkZWYgQ09ORklHX1dEVF81MDEKKwlpZGVudC5vcHRpb25zIHw9IChXRElPRl9PVkVSSEVBVHxXRElPRl9QT1dFUlVOREVSfFdESU9GX1BPV0VST1ZFUik7CisJaWYgKHRhY2hvbWV0ZXIpCisJCWlkZW50Lm9wdGlvbnMgfD0gV0RJT0ZfRkFORkFVTFQ7CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDEgKi8KKworCXN3aXRjaChjbWQpCisJeworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpPy1FRkFVTFQ6MDsKKworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJCXdkdF9nZXRfc3RhdHVzKCZzdGF0dXMpOworCQkJcmV0dXJuIHB1dF91c2VyKHN0YXR1cywgcCk7CisJCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKwkJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCQl3ZHRfcGluZygpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJCWlmIChnZXRfdXNlcihuZXdfaGVhcnRiZWF0LCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KG5ld19oZWFydGJlYXQpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl3ZHRfcGluZygpOworCQkJLyogRmFsbCAqLworCQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCQlyZXR1cm4gcHV0X3VzZXIoaGVhcnRiZWF0LCBwKTsKKwl9Cit9CisKKy8qKgorICoJd2R0X29wZW46CisgKglAaW5vZGU6IGlub2RlIG9mIGRldmljZQorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIGRldmljZQorICoKKyAqCVRoZSB3YXRjaGRvZyBkZXZpY2UgaGFzIGJlZW4gb3BlbmVkLiBUaGUgd2F0Y2hkb2cgZGV2aWNlIGlzIHNpbmdsZQorICoJb3BlbiBhbmQgb24gb3BlbmluZyB3ZSBsb2FkIHRoZSBjb3VudGVycy4gQ291bnRlciB6ZXJvIGlzIGEgMTAwSHoKKyAqCWNhc2NhZGUsIGludG8gY291bnRlciAxIHdoaWNoIGRvd25jb3VudHMgdG8gcmVib290LiBXaGVuIHRoZSBjb3VudGVyCisgKgl0cmlnZ2VycyBjb3VudGVyIDIgZG93bmNvdW50cyB0aGUgbGVuZ3RoIG9mIHRoZSByZXNldCBwdWxzZSB3aGljaAorICoJc2V0IHNldCB0byBiZSBhcyBsb25nIGFzIHBvc3NpYmxlLgorICovCisKK3N0YXRpYyBpbnQgd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2R0X2lzX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCS8qCisJICoJQWN0aXZhdGUKKwkgKi8KKwl3ZHRfc3RhcnQoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKy8qKgorICoJd2R0X3JlbGVhc2U6CisgKglAaW5vZGU6IGlub2RlIHRvIGJvYXJkCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gYm9hcmQKKyAqCisgKglUaGUgd2F0Y2hkb2cgaGFzIGEgY29uZmlndXJhYmxlIEFQSS4gVGhlcmUgaXMgYSByZWxpZ2lvdXMgZGlzcHV0ZQorICoJYmV0d2VlbiBwZW9wbGUgd2hvIHdhbnQgdGhlaXIgd2F0Y2hkb2cgdG8gYmUgYWJsZSB0byBzaHV0IGRvd24gYW5kCisgKgl0aG9zZSB3aG8gd2FudCB0byBiZSBzdXJlIGlmIHRoZSB3YXRjaGRvZyBtYW5hZ2VyIGRpZXMgdGhlIG1hY2hpbmUKKyAqCXJlYm9vdHMuIEluIHRoZSBmb3JtZXIgY2FzZSB3ZSBkaXNhYmxlIHRoZSBjb3VudGVycywgaW4gdGhlIGxhdHRlcgorICoJY2FzZSB5b3UgaGF2ZSB0byBvcGVuIGl0IGFnYWluIHZlcnkgc29vbi4KKyAqLworCitzdGF0aWMgaW50IHdkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJd2R0X3N0b3AoKTsKKwkJY2xlYXJfYml0KDAsICZ3ZHRfaXNfb3Blbik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAid2R0OiBXRFQgZGV2aWNlIGNsb3NlZCB1bmV4cGVjdGVkbHkuICBXRFQgd2lsbCBub3Qgc3RvcCFcbiIpOworCQl3ZHRfcGluZygpOworCX0KKwlleHBlY3RfY2xvc2UgPSAwOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1dEVF81MDEKKy8qKgorICoJd2R0X3RlbXBfcmVhZDoKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgd2F0Y2hkb2cgYm9hcmQKKyAqCUBidWY6IGJ1ZmZlciB0byB3cml0ZSAxIGJ5dGUgaW50bworICoJQGNvdW50OiBsZW5ndGggb2YgYnVmZmVyCisgKglAcHRyOiBvZmZzZXQgKG5vIHNlZWsgYWxsb3dlZCkKKyAqCisgKglUZW1wX3JlYWQgcmVwb3J0cyB0aGUgdGVtcGVyYXR1cmUgaW4gZGVncmVlcyBGYWhyZW5oZWl0LiBUaGUgQVBJIGlzIGluCisgKglmYXJlbmhlaXQuIEl0IHdhcyBkZXNpZ25lZCBieSBhbiBpbXBlcmlhbCBtZWFzdXJlbWVudCBsdWRkaXRlLgorICovCisKK3N0YXRpYyBzc2l6ZV90IHdkdF90ZW1wX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwdHIpCit7CisJaW50IHRlbXBlcmF0dXJlOworCisJaWYgKHdkdF9nZXRfdGVtcGVyYXR1cmUoJnRlbXBlcmF0dXJlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV90b191c2VyIChidWYsICZ0ZW1wZXJhdHVyZSwgMSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJd2R0X3RlbXBfb3BlbjoKKyAqCUBpbm9kZTogaW5vZGUgb2YgZGV2aWNlCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gZGV2aWNlCisgKgorICoJVGhlIHRlbXBlcmF0dXJlIGRldmljZSBoYXMgYmVlbiBvcGVuZWQuCisgKi8KKworc3RhdGljIGludCB3ZHRfdGVtcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworLyoqCisgKgl3ZHRfdGVtcF9yZWxlYXNlOgorICoJQGlub2RlOiBpbm9kZSB0byBib2FyZAorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIGJvYXJkCisgKgorICoJVGhlIHRlbXBlcmF0dXJlIGRldmljZSBoYXMgYmVlbiBjbG9zZWQuCisgKi8KKworc3RhdGljIGludCB3ZHRfdGVtcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxICovCisKKy8qKgorICoJbm90aWZ5X3N5czoKKyAqCUB0aGlzOiBvdXIgbm90aWZpZXIgYmxvY2sKKyAqCUBjb2RlOiB0aGUgZXZlbnQgYmVpbmcgcmVwb3J0ZWQKKyAqCUB1bnVzZWQ6IHVudXNlZAorICoKKyAqCU91ciBub3RpZmllciBpcyBjYWxsZWQgb24gc3lzdGVtIHNodXRkb3ducy4gV2Ugd2FudCB0byB0dXJuIHRoZSBjYXJkCisgKglvZmYgYXQgcmVib290IG90aGVyd2lzZSB0aGUgbWFjaGluZSB3aWxsIHJlYm9vdCBhZ2FpbiBkdXJpbmcgbWVtb3J5CisgKgl0ZXN0IG9yIHdvcnNlIHlldCBkdXJpbmcgdGhlIGZvbGxvd2luZyBmc2NrLiBUaGlzIHdvdWxkIHN1Y2ssIGluIGZhY3QKKyAqCXRydXN0IG1lIC0gaWYgaXQgaGFwcGVucyBpdCBkb2VzIHN1Y2suCisgKi8KKworc3RhdGljIGludCB3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwl2b2lkICp1bnVzZWQpCit7CisJaWYoY29kZT09U1lTX0RPV04gfHwgY29kZT09U1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgY2FyZCBvZmYgKi8KKwkJd2R0X3N0b3AoKTsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICoJS2VybmVsIEludGVyZmFjZXMKKyAqLworCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gd2R0X3dyaXRlLAorCS5pb2N0bAkJPSB3ZHRfaW9jdGwsCisJLm9wZW4JCT0gd2R0X29wZW4sCisJLnJlbGVhc2UJPSB3ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3ZHRfbWlzY2RldiA9IHsKKwkubWlub3IJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJPSAmd2R0X2ZvcHMsCit9OworCisjaWZkZWYgQ09ORklHX1dEVF81MDEKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF90ZW1wX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHdkdF90ZW1wX3JlYWQsCisJLm9wZW4JCT0gd2R0X3RlbXBfb3BlbiwKKwkucmVsZWFzZQk9IHdkdF90ZW1wX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgdGVtcF9taXNjZGV2ID0geworCS5taW5vcgk9IFRFTVBfTUlOT1IsCisJLm5hbWUJPSAidGVtcGVyYXR1cmUiLAorCS5mb3BzCT0gJndkdF90ZW1wX2ZvcHMsCit9OworI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxICovCisKKy8qCisgKglUaGUgV0RUIGNhcmQgbmVlZHMgdG8gbGVhcm4gYWJvdXQgc29mdCBzaHV0ZG93bnMgaW4gb3JkZXIgdG8KKyAqCXR1cm4gdGhlIHRpbWVib21iIHJlZ2lzdGVycyBvZmYuCisgKi8KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3ZHRfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB3ZHRfbm90aWZ5X3N5cywKK307CisKKy8qKgorICoJY2xlYW51cF9tb2R1bGU6CisgKgorICoJVW5sb2FkIHRoZSB3YXRjaGRvZy4gWW91IGNhbm5vdCBkbyB0aGlzIHdpdGggYW55IGZpbGUgaGFuZGxlcyBvcGVuLgorICoJSWYgeW91ciB3YXRjaGRvZyBpcyBzZXQgdG8gY29udGludWUgdGlja2luZyBvbiBjbG9zZSBhbmQgeW91IHVubG9hZAorICoJaXQsIHdlbGwgaXQga2VlcHMgdGlja2luZy4gV2Ugd29uJ3QgZ2V0IHRoZSBpbnRlcnJ1cHQgYnV0IHRoZSBib2FyZAorICoJd2lsbCBub3QgdG91Y2ggUEMgbWVtb3J5IHNvIGFsbCBpcyBmaW5lLiBZb3UganVzdCBoYXZlIHRvIGxvYWQgYSBuZXcKKyAqCW1vZHVsZSBpbiA2MCBzZWNvbmRzIG9yIHJlYm9vdC4KKyAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgd2R0X2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKKyNpZmRlZiBDT05GSUdfV0RUXzUwMQorCW1pc2NfZGVyZWdpc3RlcigmdGVtcF9taXNjZGV2KTsKKyNlbmRpZiAvKiBDT05GSUdfV0RUXzUwMSAqLworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCWZyZWVfaXJxKGlycSwgTlVMTCk7CisJcmVsZWFzZV9yZWdpb24oaW8sOCk7Cit9CisKKy8qKgorICogCXdkdF9pbml0OgorICoKKyAqCVNldCB1cCB0aGUgV0RUIHdhdGNoZG9nIGJvYXJkLiBBbGwgd2UgaGF2ZSB0byBkbyBpcyBncmFiIHRoZQorICoJcmVzb3VyY2VzIHdlIHJlcXVpcmUgYW5kIGJpdGNoIGlmIGFueW9uZSBiZWF0IHVzIHRvIHRoZW0uCisgKglUaGUgb3BlbigpIGZ1bmN0aW9uIHdpbGwgYWN0dWFsbHkga2ljayB0aGUgYm9hcmQgb2ZmLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHdkdF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCS8qIENoZWNrIHRoYXQgdGhlIGhlYXJ0YmVhdCB2YWx1ZSBpcyB3aXRoaW4gaXQncyByYW5nZSA7IGlmIG5vdCByZXNldCB0byB0aGUgZGVmYXVsdCAqLworCWlmICh3ZHRfc2V0X2hlYXJ0YmVhdChoZWFydGJlYXQpKSB7CisJCXdkdF9zZXRfaGVhcnRiZWF0KFdEX1RJTU8pOworCQlwcmludGsoS0VSTl9JTkZPICJ3ZHQ6IGhlYXJ0YmVhdCB2YWx1ZSBtdXN0IGJlIDA8aGVhcnRiZWF0PDY1NTM2LCB1c2luZyAlZFxuIiwKKwkJCVdEX1RJTU8pOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIDgsICJ3ZHQ1MDFwIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3ZHQ6IEkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwgaW8pOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgd2R0X2ludGVycnVwdCwgU0FfSU5URVJSVVBULCAid2R0NTAxcCIsIE5VTEwpOworCWlmKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIndkdDogSVJRICVkIGlzIG5vdCBmcmVlLlxuIiwgaXJxKTsKKwkJZ290byBvdXRyZWc7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCWlmKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIndkdDogY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwgcmV0KTsKKwkJZ290byBvdXRpcnE7CisJfQorCisjaWZkZWYgQ09ORklHX1dEVF81MDEKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ0ZW1wX21pc2NkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3ZHQ6IGNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJVEVNUF9NSU5PUiwgcmV0KTsKKwkJZ290byBvdXRyYnQ7CisJfQorI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxICovCisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIndkdDogY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCisJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJZ290byBvdXRtaXNjOworCX0KKworCXJldCA9IDA7CisJcHJpbnRrKEtFUk5fSU5GTyAiV0RUNTAwLzUwMS1QIGRyaXZlciAwLjEwIGF0IDB4JTA0eCAoSW50ZXJydXB0ICVkKS4gaGVhcnRiZWF0PSVkIHNlYyAobm93YXlvdXQ9JWQpXG4iLAorCQlpbywgaXJxLCBoZWFydGJlYXQsIG5vd2F5b3V0KTsKKyNpZmRlZiBDT05GSUdfV0RUXzUwMQorCXByaW50ayhLRVJOX0lORk8gIndkdDogRmFuIFRhY2hvbWV0ZXIgaXMgJXNcbiIsICh0YWNob21ldGVyID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIikpOworI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxICovCisKK291dDoKKwlyZXR1cm4gcmV0OworCitvdXRtaXNjOgorI2lmZGVmIENPTkZJR19XRFRfNTAxCisJbWlzY19kZXJlZ2lzdGVyKCZ0ZW1wX21pc2NkZXYpOworb3V0cmJ0OgorI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxICovCisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CitvdXRpcnE6CisJZnJlZV9pcnEoaXJxLCBOVUxMKTsKK291dHJlZzoKKwlyZWxlYXNlX3JlZ2lvbihpbyw4KTsKKwlnb3RvIG91dDsKK30KKworbW9kdWxlX2luaXQod2R0X2luaXQpOworbW9kdWxlX2V4aXQod2R0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIElTQSBJQ1Mgd2F0Y2hkb2cgY2FyZHMgKFdEVDUwMC81MDEpIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihURU1QX01JTk9SKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ZHQyODUuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ZHQyODUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjgyNWExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dkdDI4NS5jCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICoJSW50ZWwgMjEyODUgd2F0Y2hkb2cgZHJpdmVyCisgKglDb3B5cmlnaHQgKGMpIFBoaWwgQmx1bmRlbGwgPHBiQG5leHVzLmNvLnVrPiwgMTk5OAorICoKKyAqCWJhc2VkIG9uCisgKgorICoJU29mdERvZwkwLjA1OglBIFNvZnR3YXJlIFdhdGNoZG9nIERldmljZQorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5NiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWMyMTI4NS5oPgorCisvKgorICogRGVmaW5lIHRoaXMgdG8gc3RvcCB0aGUgd2F0Y2hkb2cgYWN0dWFsbHkgcmVib290aW5nIHRoZSBtYWNoaW5lLgorICovCisjdW5kZWYgT05MWV9URVNUSU5HCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc29mdF9tYXJnaW4gPSA2MDsJCS8qIGluIHNlY29uZHMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVsb2FkOworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfYWxpdmU7CisKKyNpZmRlZiBPTkxZX1RFU1RJTkcKKy8qCisgKglJZiB0aGUgdGltZXIgZXhwaXJlcy4uCisgKi8KK3N0YXRpYyB2b2lkIHdhdGNoZG9nX2ZpcmUoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmludGsoS0VSTl9DUklUICJXYXRjaGRvZzogV291bGQgUmVib290LlxuIik7CisJKkNTUl9USU1FUjRfQ05UTCA9IDA7CisJKkNTUl9USU1FUjRfQ0xSID0gMDsKK30KKyNlbmRpZgorCisvKgorICoJUmVmcmVzaCB0aGUgdGltZXIuCisgKi8KK3N0YXRpYyB2b2lkIHdhdGNoZG9nX3Bpbmcodm9pZCkKK3sKKwkqQ1NSX1RJTUVSNF9MT0FEID0gcmVsb2FkOworfQorCisvKgorICoJQWxsb3cgb25seSBvbmUgcGVyc29uIHRvIGhvbGQgaXQgb3BlbgorICovCitzdGF0aWMgaW50IHdhdGNoZG9nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldDsKKworCWlmICgqQ1NSX1NBMTEwX0NOVEwgJiAoMSA8PCAxMykpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgxLCAmdGltZXJfYWxpdmUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmVsb2FkID0gc29mdF9tYXJnaW4gKiAobWVtX2ZjbGtfMjEyODUgLyAyNTYpOworCisJKkNTUl9USU1FUjRfQ0xSID0gMDsKKwl3YXRjaGRvZ19waW5nKCk7CisJKkNTUl9USU1FUjRfQ05UTCA9IFRJTUVSX0NOVExfRU5BQkxFIHwgVElNRVJfQ05UTF9BVVRPUkVMT0FECisJCXwgVElNRVJfQ05UTF9ESVYyNTY7CisKKyNpZmRlZiBPTkxZX1RFU1RJTkcKKwlyZXQgPSByZXF1ZXN0X2lycShJUlFfVElNRVI0LCB3YXRjaGRvZ19maXJlLCAwLCAid2F0Y2hkb2ciLCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCSpDU1JfVElNRVI0X0NOVEwgPSAwOworCQljbGVhcl9iaXQoMSwgJnRpbWVyX2FsaXZlKTsKKwl9CisjZWxzZQorCS8qCisJICogU2V0dGluZyB0aGlzIGJpdCBpcyBpcnJldmVyc2libGU7IG9uY2UgZW5hYmxlZCwgdGhlcmUgaXMKKwkgKiBubyB3YXkgdG8gZGlzYWJsZSB0aGUgd2F0Y2hkb2cuCisJICovCisJKkNTUl9TQTExMF9DTlRMIHw9IDEgPDwgMTM7CisKKwlyZXQgPSAwOworI2VuZGlmCisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqCVNodXQgb2ZmIHRoZSB0aW1lci4KKyAqCU5vdGU6IGlmIHdlIHJlYWxseSBoYXZlIGVuYWJsZWQgdGhlIHdhdGNoZG9nLCB0aGVyZQorICoJaXMgbm8gd2F5IHRvIHR1cm4gb2ZmLgorICovCitzdGF0aWMgaW50IHdhdGNoZG9nX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisjaWZkZWYgT05MWV9URVNUSU5HCisJZnJlZV9pcnEoSVJRX1RJTUVSNCwgTlVMTCk7CisJY2xlYXJfYml0KDEsICZ0aW1lcl9hbGl2ZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK3dhdGNoZG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJLyoKKwkgKglSZWZyZXNoIHRoZSB0aW1lci4KKwkgKi8KKwlpZiAobGVuKQorCQl3YXRjaGRvZ19waW5nKCk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJLm9wdGlvbnMJPSBXRElPRl9TRVRUSU1FT1VULAorCS5pZGVudGl0eQk9ICJGb290YnJpZGdlIFdhdGNoZG9nIiwKK307CisKK3N0YXRpYyBpbnQKK3dhdGNoZG9nX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBpbnQgbmV3X21hcmdpbjsKKwlpbnQgcmV0ID0gLUVOT0lPQ1RMQ01EOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0ID0gMDsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmlkZW50LCBzaXplb2YoaWRlbnQpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXQgPSBwdXRfdXNlcigwLChpbnQgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3YXRjaGRvZ19waW5nKCk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlyZXQgPSBnZXRfdXNlcihuZXdfbWFyZ2luLCAoaW50ICopYXJnKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCS8qIEFyYml0cmFyeSwgY2FuJ3QgZmluZCB0aGUgY2FyZCdzIGxpbWl0cyAqLworCQlpZiAobmV3X21hcmdpbiA8IDAgfHwgbmV3X21hcmdpbiA+IDYwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlzb2Z0X21hcmdpbiA9IG5ld19tYXJnaW47CisJCXJlbG9hZCA9IHNvZnRfbWFyZ2luICogKG1lbV9mY2xrXzIxMjg1IC8gMjU2KTsKKwkJd2F0Y2hkb2dfcGluZygpOworCQkvKiBGYWxsICovCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXQgPSBwdXRfdXNlcihzb2Z0X21hcmdpbiwgKGludCAqKWFyZyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3YXRjaGRvZ19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gd2F0Y2hkb2dfd3JpdGUsCisJLmlvY3RsCQk9IHdhdGNoZG9nX2lvY3RsLAorCS5vcGVuCQk9IHdhdGNoZG9nX29wZW4sCisJLnJlbGVhc2UJPSB3YXRjaGRvZ19yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdhdGNoZG9nX21pc2NkZXYgPSB7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJCT0gJndhdGNoZG9nX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBmb290YnJpZGdlX3dhdGNoZG9nX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKG1hY2hpbmVfaXNfbmV0d2luZGVyKCkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dmFsID0gbWlzY19yZWdpc3Rlcigmd2F0Y2hkb2dfbWlzY2Rldik7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlwcmludGsoIkZvb3RicmlkZ2UgV2F0Y2hkb2cgVGltZXI6IDAuMDEsIHRpbWVyIG1hcmdpbjogJWQgc2VjXG4iLAorCSAgICAgICBzb2Z0X21hcmdpbik7CisKKwlpZiAobWFjaGluZV9pc19jYXRzKCkpCisJCXByaW50aygiV2FybmluZzogV2F0Y2hkb2cgcmVzZXQgbWF5IG5vdCB3b3JrIG9uIHRoaXMgbWFjaGluZS5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZm9vdGJyaWRnZV93YXRjaGRvZ19leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZ3YXRjaGRvZ19taXNjZGV2KTsKK30KKworTU9EVUxFX0FVVEhPUigiUGhpbCBCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZvb3RicmlkZ2Ugd2F0Y2hkb2cgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CisKK21vZHVsZV9wYXJhbShzb2Z0X21hcmdpbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc29mdF9tYXJnaW4sIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcyIpOworCittb2R1bGVfaW5pdChmb290YnJpZGdlX3dhdGNoZG9nX2luaXQpOworbW9kdWxlX2V4aXQoZm9vdGJyaWRnZV93YXRjaGRvZ19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ZHQ5NzcuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ZHQ5NzcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzJlOWIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dkdDk3Ny5jCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICoJV2R0OTc3CTAuMDM6CUEgV2F0Y2hkb2cgRGV2aWNlIGZvciBOZXR3aW5kZXIgVzgzOTc3QUYgY2hpcAorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5OCBSZWJlbC5jb20gKFdvb2R5IFN1d2Fsc2tpIDx3b29keUBuZXR3aW5kZXIub3JnPikKKyAqCisgKgkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIDE0LURlYy0yMDAxIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqICAgICAgICAgICBBZGRlZCBub3dheW91dCBtb2R1bGUgb3B0aW9uIHRvIG92ZXJyaWRlIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorICoJMTktRGVjLTIwMDEgV29vZHkgU3V3YWxza2k6IE5ldHdpbmRlciBmaXhlcywgaW9jdGwgaW50ZXJmYWNlCisgKgkwNi1KYW4tMjAwMiBXb29keSBTdXdhbHNraTogRm9yIGNvbXBhdGliaWxpdHksIGNvbnZlcnQgYWxsIHRpbWVvdXRzCisgKgkJCQkgICAgZnJvbSBtaW51dGVzIHRvIHNlY29uZHMuCisgKiAgICAgIDA3LUp1bC0yMDAzIERhbmllbGUgQmVsbHVjY2k6IEF1ZGl0IHJldHVybiBjb2RlIG9mIG1pc2NfcmVnaXN0ZXIgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnd3YXRjaGRvZ19pbml0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgUEZYICJXZHQ5Nzc6ICIKKyNkZWZpbmUgV0FUQ0hET0dfTUlOT1IJMTMwCisKKyNkZWZpbmUJREVGQVVMVF9USU1FT1VUCTYwCQkJLyogZGVmYXVsdCB0aW1lb3V0IGluIHNlY29uZHMgKi8KKworc3RhdGljCWludCB0aW1lb3V0ID0gREVGQVVMVF9USU1FT1VUOworc3RhdGljCWludCB0aW1lb3V0TTsJCQkJLyogdGltZW91dCBpbiBtaW51dGVzICovCitzdGF0aWMJdW5zaWduZWQgbG9uZyB0aW1lcl9hbGl2ZTsKK3N0YXRpYwlpbnQgdGVzdG1vZGU7CitzdGF0aWMJY2hhciBleHBlY3RfY2xvc2U7CisKK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCJXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMgKDYwLi4xNTMwMCksIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9USU1FT1VUKSAiKSIpOworbW9kdWxlX3BhcmFtKHRlc3Rtb2RlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0ZXN0bW9kZSwiV2F0Y2hkb2cgdGVzdG1vZGUgKDEgPSBubyByZWJvb3QpLCBkZWZhdWx0PTAiKTsKKworI2lmZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorc3RhdGljIGludCBub3dheW91dCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3dheW91dCA9IDA7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qCisgKiBTdGFydCB0aGUgd2F0Y2hkb2cKKyAqLworCitzdGF0aWMgaW50IHdkdDk3N19zdGFydCh2b2lkKQoreworCS8qIHVubG9jayB0aGUgU3VwZXJJTyBjaGlwICovCisJb3V0YigweDg3LDB4MzcwKTsKKwlvdXRiKDB4ODcsMHgzNzApOworCisJLyogc2VsZWN0IGRldmljZSBBdXgyIChkZXZpY2U9OCkgYW5kIHNldCB3YXRjaGRvZyByZWdzIEYyLCBGMyBhbmQgRjQKKwkgKiBGMiBoYXMgdGhlIHRpbWVvdXQgaW4gbWludXRlcworCSAqIEYzIGNvdWxkIGJlIHNldCB0byB0aGUgUE9XRVIgTEVEIGJsaW5rICh3aXRoIEdQMTcgc2V0IHRvIFBvd2VyTGVkKQorCSAqICAgYXQgdGltZW91dCwgYW5kIHRvIHJlc2V0IHRpbWVyIG9uIGtiZC9tb3VzZSBhY3Rpdml0eSAobm90IGltcGwuKQorCSAqIEY0IGlzIHVzZWQgdG8ganVzdCBjbGVhciB0aGUgVElNRU9VVCdlZCBzdGF0ZSAoYml0IDApCisJICovCisJb3V0YigweDA3LDB4MzcwKTsKKwlvdXRiKDB4MDgsMHgzNzEpOworCW91dGIoMHhGMiwweDM3MCk7CisJb3V0Yih0aW1lb3V0TSwweDM3MSk7CisJb3V0YigweEYzLDB4MzcwKTsKKwlvdXRiKDB4MDAsMHgzNzEpOwkvKiBhbm90aGVyIHNldHRpbmcgaXMgMEUgZm9yIGtiZC9tb3VzZS9MRUQgKi8KKwlvdXRiKDB4RjQsMHgzNzApOworCW91dGIoMHgwMCwweDM3MSk7CisKKwkvKiBhdCBsYXN0IHNlbGVjdCBkZXZpY2UgQXV4MSAoZGV2PTcpIGFuZCBzZXQgR1AxNiBhcyBhIHdhdGNoZG9nIG91dHB1dCAqLworCS8qIGluIHRlc3QgbW9kZSB3YXRjaCB0aGUgYml0IDEgb24gRjQgdG8gaW5kaWNhdGUgInRyaWdnZXJlZCIgKi8KKwlpZiAoIXRlc3Rtb2RlKQorCXsKKwkJb3V0YigweDA3LDB4MzcwKTsKKwkJb3V0YigweDA3LDB4MzcxKTsKKwkJb3V0YigweEU2LDB4MzcwKTsKKwkJb3V0YigweDA4LDB4MzcxKTsKKwl9CisKKwkvKiBsb2NrIHRoZSBTdXBlcklPIGNoaXAgKi8KKwlvdXRiKDB4QUEsMHgzNzApOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImFjdGl2YXRlZC5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdG9wIHRoZSB3YXRjaGRvZworICovCisKK3N0YXRpYyBpbnQgd2R0OTc3X3N0b3Aodm9pZCkKK3sKKwkvKiB1bmxvY2sgdGhlIFN1cGVySU8gY2hpcCAqLworCW91dGIoMHg4NywweDM3MCk7CisJb3V0YigweDg3LDB4MzcwKTsKKworCS8qIHNlbGVjdCBkZXZpY2UgQXV4MiAoZGV2aWNlPTgpIGFuZCBzZXQgd2F0Y2hkb2cgcmVncyBGMixGMyBhbmQgRjQKKwkqIEYzIGlzIHJlc2V0IHRvIGl0cyBkZWZhdWx0IHN0YXRlCisJKiBGNCBjYW4gY2xlYXIgdGhlIFRJTUVPVVQnZWQgc3RhdGUgKGJpdCAwKSAtIGJhY2sgdG8gZGVmYXVsdAorCSogV2UgY2FuIG5vdCB1c2UgR1AxNyBhcyBhIFBvd2VyTGVkLCBhcyB3ZSB1c2UgaXRzIHVzYWdlIGFzIGEgUmVkTGVkCisJKi8KKwlvdXRiKDB4MDcsMHgzNzApOworCW91dGIoMHgwOCwweDM3MSk7CisJb3V0YigweEYyLDB4MzcwKTsKKwlvdXRiKDB4RkYsMHgzNzEpOworCW91dGIoMHhGMywweDM3MCk7CisJb3V0YigweDAwLDB4MzcxKTsKKwlvdXRiKDB4RjQsMHgzNzApOworCW91dGIoMHgwMCwweDM3MSk7CisJb3V0YigweEYyLDB4MzcwKTsKKwlvdXRiKDB4MDAsMHgzNzEpOworCisJLyogYXQgbGFzdCBzZWxlY3QgZGV2aWNlIEF1eDEgKGRldj03KSBhbmQgc2V0IEdQMTYgYXMgYSB3YXRjaGRvZyBvdXRwdXQgKi8KKwlvdXRiKDB4MDcsMHgzNzApOworCW91dGIoMHgwNywweDM3MSk7CisJb3V0YigweEU2LDB4MzcwKTsKKwlvdXRiKDB4MDgsMHgzNzEpOworCisJLyogbG9jayB0aGUgU3VwZXJJTyBjaGlwICovCisJb3V0YigweEFBLDB4MzcwKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJzaHV0ZG93bi5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZW5kIGEga2VlcGFsaXZlIHBpbmcgdG8gdGhlIHdhdGNoZG9nCisgKiBUaGlzIGlzIGRvbmUgYnkgc2ltcGx5IHJlLXdyaXRpbmcgdGhlIHRpbWVvdXQgdG8gcmVnLiAweEYyCisgKi8KKworc3RhdGljIGludCB3ZHQ5Nzdfa2VlcGFsaXZlKHZvaWQpCit7CisJLyogdW5sb2NrIHRoZSBTdXBlcklPIGNoaXAgKi8KKwlvdXRiKDB4ODcsMHgzNzApOworCW91dGIoMHg4NywweDM3MCk7CisKKwkvKiBzZWxlY3QgZGV2aWNlIEF1eDIgKGRldmljZT04KSBhbmQga2lja3Mgd2F0Y2hkb2cgcmVnIEYyICovCisJLyogRjIgaGFzIHRoZSB0aW1lb3V0IGluIG1pbnV0ZXMgKi8KKwlvdXRiKDB4MDcsMHgzNzApOworCW91dGIoMHgwOCwweDM3MSk7CisJb3V0YigweEYyLDB4MzcwKTsKKwlvdXRiKHRpbWVvdXRNLDB4MzcxKTsKKworCS8qIGxvY2sgdGhlIFN1cGVySU8gY2hpcCAqLworCW91dGIoMHhBQSwweDM3MCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB0aGUgd2F0Y2hkb2cgdGltZW91dCB2YWx1ZQorICovCisKK3N0YXRpYyBpbnQgd2R0OTc3X3NldF90aW1lb3V0KGludCB0KQoreworCWludCB0bXJ2YWw7CisKKwkvKiBjb252ZXJ0IHNlY29uZHMgdG8gbWludXRlcywgcm91bmRpbmcgdXAgKi8KKwl0bXJ2YWwgPSAodCArIDU5KSAvIDYwOworCisJaWYgKG1hY2hpbmVfaXNfbmV0d2luZGVyKCkpIHsKKwkJLyogd2UgaGF2ZSBhIGh3IGJ1ZyBzb21ld2hlcmUsIHNvIGVhY2ggOTc3IG1pbnV0ZSBpcyBhY3R1YWxseSBvbmx5IDMwc2VjCisJCSAqICB0aGlzIGxpbWl0cyB0aGUgbWF4IHRpbWVvdXQgdG8gaGFsZiBvZiBkZXZpY2UgbWF4IG9mIDI1NSBtaW51dGVzLi4uCisJCSAqLworCQl0bXJ2YWwgKz0gdG1ydmFsOworCX0KKworCWlmICgodG1ydmFsIDwgMSkgfHwgKHRtcnZhbCA+IDI1NSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogdGltZW91dCBpcyB0aGUgdGltZW91dCBpbiBzZWNvbmRzLCB0aW1lb3V0TSBpcyB0aGUgdGltZW91dCBpbiBtaW51dGVzKSAqLworCXRpbWVvdXQgPSB0OworCXRpbWVvdXRNID0gdG1ydmFsOworCXJldHVybiAwOworfQorCisvKgorICogR2V0IHRoZSB3YXRjaGRvZyBzdGF0dXMKKyAqLworCitzdGF0aWMgaW50IHdkdDk3N19nZXRfc3RhdHVzKGludCAqc3RhdHVzKQoreworCWludCBuZXdfc3RhdHVzOworCisJKnN0YXR1cz0wOworCisJLyogdW5sb2NrIHRoZSBTdXBlcklPIGNoaXAgKi8KKwlvdXRiKDB4ODcsMHgzNzApOworCW91dGIoMHg4NywweDM3MCk7CisKKwkvKiBzZWxlY3QgZGV2aWNlIEF1eDIgKGRldmljZT04KSBhbmQgcmVhZCB3YXRjaGRvZyByZWcgRjQgKi8KKwlvdXRiKDB4MDcsMHgzNzApOworCW91dGIoMHgwOCwweDM3MSk7CisJb3V0YigweEY0LDB4MzcwKTsKKwluZXdfc3RhdHVzID0gaW5iKDB4MzcxKTsKKworCS8qIGxvY2sgdGhlIFN1cGVySU8gY2hpcCAqLworCW91dGIoMHhBQSwweDM3MCk7CisKKwlpZiAobmV3X3N0YXR1cyAmIDEpCisJCSpzdGF0dXMgfD0gV0RJT0ZfQ0FSRFJFU0VUOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCS9kZXYvd2F0Y2hkb2cgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgaW50IHdkdDk3N19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIElmIHRoZSB3YXRjaGRvZyBpcyBhbGl2ZSB3ZSBkb24ndCBuZWVkIHRvIHN0YXJ0IGl0IGFnYWluICovCisJaWYoIHRlc3RfYW5kX3NldF9iaXQoMCwmdGltZXJfYWxpdmUpICkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChub3dheW91dCkKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKworCXdkdDk3N19zdGFydCgpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCB3ZHQ5NzdfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKgorCSAqCVNodXQgb2ZmIHRoZSB0aW1lci4KKwkgKiAJTG9jayBpdCBpbiBpZiBpdCdzIGEgbW9kdWxlIGFuZCB3ZSBzZXQgbm93YXlvdXQKKwkgKi8KKwlpZiAoZXhwZWN0X2Nsb3NlID09IDQyKQorCXsKKwkJd2R0OTc3X3N0b3AoKTsKKwkJY2xlYXJfYml0KDAsJnRpbWVyX2FsaXZlKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCXdkdDk3N19rZWVwYWxpdmUoKTsKKwl9CisJZXhwZWN0X2Nsb3NlID0gMDsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogICAgICB3ZHQ5Nzdfd3JpdGU6CisgKiAgICAgIEBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgd2F0Y2hkb2cKKyAqICAgICAgQGJ1ZjogYnVmZmVyIHRvIHdyaXRlICh1bnVzZWQgYXMgZGF0YSBkb2VzIG5vdCBtYXR0ZXIgaGVyZQorICogICAgICBAY291bnQ6IGNvdW50IG9mIGJ5dGVzCisgKiAgICAgIEBwcG9zOiBwb2ludGVyIHRvIHRoZSBwb3NpdGlvbiB0byB3cml0ZS4gTm8gc2Vla3MgYWxsb3dlZAorICoKKyAqICAgICAgQSB3cml0ZSB0byBhIHdhdGNoZG9nIGRldmljZSBpcyBkZWZpbmVkIGFzIGEga2VlcGFsaXZlIHNpZ25hbC4gQW55CisgKiAgICAgIHdyaXRlIG9mIGRhdGEgd2lsbCBkbywgYXMgd2Ugd2UgZG9uJ3QgZGVmaW5lIGNvbnRlbnQgbWVhbmluZy4KKyAqLworCitzdGF0aWMgc3NpemVfdCB3ZHQ5Nzdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGNvdW50KSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQkvKiBJbiBjYXNlIGl0IHdhcyBzZXQgbG9uZyBhZ28gKi8KKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmICsgaSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKworCQl3ZHQ5Nzdfa2VlcGFsaXZlKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqICAgICAgd2R0OTc3X2lvY3RsOgorICogICAgICBAaW5vZGU6IGlub2RlIG9mIHRoZSBkZXZpY2UKKyAqICAgICAgQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSBkZXZpY2UKKyAqICAgICAgQGNtZDogd2F0Y2hkb2cgY29tbWFuZAorICogICAgICBAYXJnOiBhcmd1bWVudCBwb2ludGVyCisgKgorICogICAgICBUaGUgd2F0Y2hkb2cgQVBJIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGZ1bmN0aW9ucyBmb3IgYWxsIHdhdGNoZG9ncworICogICAgICBhY2NvcmRpbmcgdG8gdGhlaXIgYXZhaWxhYmxlIGZlYXR1cmVzLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkub3B0aW9ucyA9CQlXRElPRl9TRVRUSU1FT1VUIHwKKwkJCQlXRElPRl9NQUdJQ0NMT1NFIHwKKwkJCQlXRElPRl9LRUVQQUxJVkVQSU5HLAorCS5maXJtd2FyZV92ZXJzaW9uID0JMSwKKwkuaWRlbnRpdHkgPQkJIldpbmJvbmQgODM5NzciLAorfTsKKworc3RhdGljIGludCB3ZHQ5NzdfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHN0YXR1czsKKwlpbnQgbmV3X29wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisJaW50IG5ld190aW1lb3V0OworCXVuaW9uIHsKKwkJc3RydWN0IHdhdGNoZG9nX2luZm8gX191c2VyICppZGVudDsKKwkJaW50IF9fdXNlciAqaTsKKwl9IHVhcmc7CisKKwl1YXJnLmkgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCXN3aXRjaChjbWQpCisJeworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCXJldHVybiBjb3B5X3RvX3VzZXIodWFyZy5pZGVudCwgJmlkZW50LAorCQkJc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQl3ZHQ5NzdfZ2V0X3N0YXR1cygmc3RhdHVzKTsKKwkJcmV0dXJuIHB1dF91c2VyKHN0YXR1cywgdWFyZy5pKTsKKworCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsIHVhcmcuaSk7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJd2R0OTc3X2tlZXBhbGl2ZSgpOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJaWYgKGdldF91c2VyIChuZXdfb3B0aW9ucywgdWFyZy5pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChuZXdfb3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQl3ZHQ5Nzdfc3RvcCgpOworCQkJcmV0dmFsID0gMDsKKwkJfQorCisJCWlmIChuZXdfb3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCXdkdDk3N19zdGFydCgpOworCQkJcmV0dmFsID0gMDsKKwkJfQorCisJCXJldHVybiByZXR2YWw7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWlmIChnZXRfdXNlcihuZXdfdGltZW91dCwgdWFyZy5pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmICh3ZHQ5Nzdfc2V0X3RpbWVvdXQobmV3X3RpbWVvdXQpKQorCQkgICAgcmV0dXJuIC1FSU5WQUw7CisKKwkJd2R0OTc3X2tlZXBhbGl2ZSgpOworCQkvKiBGYWxsICovCisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0LCB1YXJnLmkpOworCisJfQorfQorCitzdGF0aWMgaW50IHdkdDk3N19ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCXZvaWQgKnVudXNlZCkKK3sKKwlpZihjb2RlPT1TWVNfRE9XTiB8fCBjb2RlPT1TWVNfSEFMVCkKKwkJd2R0OTc3X3N0b3AoKTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdDk3N19mb3BzPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gd2R0OTc3X3dyaXRlLAorCS5pb2N0bAkJPSB3ZHQ5NzdfaW9jdGwsCisJLm9wZW4JCT0gd2R0OTc3X29wZW4sCisJLnJlbGVhc2UJPSB3ZHQ5NzdfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3ZHQ5NzdfbWlzY2Rldj0KK3sKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJCT0gIndhdGNoZG9nIiwKKwkuZm9wcwkJPSAmd2R0OTc3X2ZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdDk3N19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHdkdDk3N19ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbnd3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKwlpZiAoIW1hY2hpbmVfaXNfbmV0d2luZGVyKCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogQ2hlY2sgdGhhdCB0aGUgdGltZW91dCB2YWx1ZSBpcyB3aXRoaW4gaXQncyByYW5nZSA7IGlmIG5vdCByZXNldCB0byB0aGUgZGVmYXVsdCAqLworCWlmICh3ZHQ5Nzdfc2V0X3RpbWVvdXQodGltZW91dCkpIHsKKwkJd2R0OTc3X3NldF90aW1lb3V0KERFRkFVTFRfVElNRU9VVCk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJ0aW1lb3V0IHZhbHVlIG11c3QgYmUgNjA8dGltZW91dDwxNTMwMCwgdXNpbmcgJWRcbiIsCisJCQlERUZBVUxUX1RJTUVPVVQpOworCX0KKworCXJldHZhbCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0OTc3X25vdGlmaWVyKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCisJCQlyZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXJldHZhbCA9IG1pc2NfcmVnaXN0ZXIoJndkdDk3N19taXNjZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldHZhbCk7CisJCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHQ5Nzdfbm90aWZpZXIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXByaW50ayhLRVJOX0lORk8gUEZYICJpbml0aWFsaXplZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkLCB0ZXN0bW9kZSA9ICVpKVxuIiwKKwkJdGltZW91dCwgbm93YXlvdXQsIHRlc3Rtb2RlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbnd3YXRjaGRvZ19leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZ3ZHQ5NzdfbWlzY2Rldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdDk3N19ub3RpZmllcik7Cit9CisKK21vZHVsZV9pbml0KG53d2F0Y2hkb2dfaW5pdCk7Cittb2R1bGVfZXhpdChud3dhdGNoZG9nX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJXb29keSBTdXdhbHNraSA8d29vZHlAbmV0d2luZGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVzgzOTc3QUYgV2F0Y2hkb2cgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvd2R0X3BjaS5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dkdF9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjUxZGVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dkdF9wY2kuYwpAQCAtMCwwICsxLDc2MyBAQAorLyoKKyAqCUluZHVzdHJpYWwgQ29tcHV0ZXIgU291cmNlIFBDSS1XRFQ1MDAvNTAxIGRyaXZlcgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5Ni0xOTk3IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoJCQkJaHR0cDovL3d3dy5yZWRoYXQuY29tCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQorICoJd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkCisgKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk1ICAgIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CisgKgorICoJUmVsZWFzZSAwLjEwLgorICoKKyAqCUZpeGVzCisgKgkJRGF2ZSBHcmVnb3JpY2gJOglNb2R1bGFyaXNhdGlvbiBhbmQgbWlub3IgYnVncworICoJCUFsYW4gQ294CToJQWRkZWQgdGhlIHdhdGNoZG9nIGlvY3RsKCkgc3R1ZmYKKyAqCQlBbGFuIENveAk6CUZpeGVkIHRoZSByZWJvb3QgcHJvYmxlbSAoYXMgbm90ZWQgYnkKKyAqCQkJCQlNYXR0IENyb2NrZXIpLgorICoJCUFsYW4gQ294CToJQWRkZWQgd2R0PSBib290IG9wdGlvbgorICoJCUFsYW4gQ294CToJQ2xlYW5lZCB1cCBjb3B5L3VzZXIgc3R1ZmYKKyAqCQlUaW0gSG9ja2luCToJQWRkZWQgaW5zbW9kIHBhcmFtZXRlcnMsIGNvbW1lbnQgY2xlYW51cAorICoJCQkJCVBhcmFtZXRlcml6ZWQgdGltZW91dAorICoJCUpQIE5vbGxtYW5uCToJQWRkZWQgc3VwcG9ydCBmb3IgUENJIHdkdDUwMXAKKyAqCQlBbGFuIENveAk6CVNwbGl0IElTQSBhbmQgUENJIGNhcmRzIGludG8gdHdvIGRyaXZlcnMKKyAqCQlKZWZmIEdhcnppawk6CVBDSSBjbGVhbnVwcworICoJCVRpZ3JhbiBBaXZhemlhbgk6CVJlc3RydWN0dXJlZCB3ZHRwY2lfaW5pdF9vbmUoKSB0byBoYW5kbGUgZmFpbHVyZXMKKyAqCQlKb2VsIEJlY2tlciAJOglBZGRlZCBXRElPQ19HRVQvU0VUVElNRU9VVAorICoJCVp3YW5lIE13YWlrYW1ibwk6CU1hZ2ljIGNoYXIgY2xvc2luZywgbG9ja2luZyBjaGFuZ2VzLCBjbGVhbnVwcworICoJCU1hdHQgRG9tc2NoCToJbm93YXlvdXQgbW9kdWxlIG9wdGlvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIFdEVF9JU19QQ0kKKyNpbmNsdWRlICJ3ZDUwMXAuaCIKKworI2RlZmluZSBQRlggIndkdF9wY2k6ICIKKworLyoKKyAqIFVudGlsIEFjY2VzcyBJL08gZ2V0cyB0aGVpciBhcHBsaWNhdGlvbiBmb3IgYSBQQ0kgdmVuZG9yIElEIGFwcHJvdmVkLAorICogSSBkb24ndCB0aGluayB0aGF0IGl0J3MgYXBwcm9wcmlhdGUgdG8gbW92ZSB0aGVzZSBjb25zdGFudHMgaW50byB0aGUKKyAqIHJlZ3VsYXIgcGNpX2lkcy5oIGZpbGUuIC0tIEpQTiAyMDAwLzAxLzE4CisgKi8KKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0FDQ0VTU0lPCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUNDRVNTSU8gMHg0OTRmCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9XREdfQ1NNCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfV0RHX0NTTSAweDIyYzAKKyNlbmRpZgorCisvKiBXZSBjYW4gb25seSB1c2UgMSBjYXJkIGR1ZSB0byB0aGUgL2Rldi93YXRjaGRvZyByZXN0cmljdGlvbiAqLworc3RhdGljIGludCBkZXZfY291bnQ7CisKK3N0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworc3RhdGljIHNwaW5sb2NrX3Qgd2R0cGNpX2xvY2s7CitzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CisKK3N0YXRpYyBpbnQgaW87CitzdGF0aWMgaW50IGlycTsKKworLyogRGVmYXVsdCB0aW1lb3V0ICovCisjZGVmaW5lIFdEX1RJTU8gNjAJCQkvKiBEZWZhdWx0IGhlYXJ0YmVhdCA9IDYwIHNlY29uZHMgKi8KKworc3RhdGljIGludCBoZWFydGJlYXQgPSBXRF9USU1POworc3RhdGljIGludCB3ZF9oZWFydGJlYXQ7Cittb2R1bGVfcGFyYW0oaGVhcnRiZWF0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhoZWFydGJlYXQsICJXYXRjaGRvZyBoZWFydGJlYXQgaW4gc2Vjb25kcy4gKDA8aGVhcnRiZWF0PDY1NTM2LCBkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdEX1RJTU8pICIpIik7CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSAwOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworCisjaWZkZWYgQ09ORklHX1dEVF81MDFfUENJCisvKiBTdXBwb3J0IGZvciB0aGUgRmFuIFRhY2hvbWV0ZXIgb24gdGhlIFBDSS1XRFQ1MDEgKi8KK3N0YXRpYyBpbnQgdGFjaG9tZXRlcjsKKworbW9kdWxlX3BhcmFtKHRhY2hvbWV0ZXIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRhY2hvbWV0ZXIsICJQQ0ktV0RUNTAxIEZhbiBUYWNob21ldGVyIHN1cHBvcnQgKDA9ZGlzYWJsZSwgZGVmYXVsdD0wKSIpOworI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxX1BDSSAqLworCisvKgorICoJUHJvZ3JhbW1pbmcgc3VwcG9ydAorICovCisKK3N0YXRpYyB2b2lkIHdkdHBjaV9jdHJfbW9kZShpbnQgY3RyLCBpbnQgbW9kZSkKK3sKKwljdHI8PD02OworCWN0cnw9MHgzMDsKKwljdHJ8PShtb2RlPDwxKTsKKwlvdXRiX3AoY3RyLCBXRFRfQ1IpOworfQorCitzdGF0aWMgdm9pZCB3ZHRwY2lfY3RyX2xvYWQoaW50IGN0ciwgaW50IHZhbCkKK3sKKwlvdXRiX3AodmFsJjB4RkYsIFdEVF9DT1VOVDArY3RyKTsKKwlvdXRiX3AodmFsPj44LCBXRFRfQ09VTlQwK2N0cik7Cit9CisKKy8qKgorICoJd2R0cGNpX3N0YXJ0OgorICoKKyAqCVN0YXJ0IHRoZSB3YXRjaGRvZyBkcml2ZXIuCisgKi8KKworc3RhdGljIGludCB3ZHRwY2lfc3RhcnQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndkdHBjaV9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqICJwZXQiIHRoZSB3YXRjaGRvZywgYXMgQWNjZXNzIHNheXMuCisJICogVGhpcyByZXNldHMgdGhlIGNsb2NrIG91dHB1dHMuCisJICovCisJaW5iX3AoV0RUX0RDKTsJCQkvKiBEaXNhYmxlIHdhdGNoZG9nICovCisJd2R0cGNpX2N0cl9tb2RlKDIsMCk7CQkvKiBQcm9ncmFtIENUUjIgZm9yIE1vZGUgMDogUHVsc2Ugb24gVGVybWluYWwgQ291bnQgKi8KKwlvdXRiX3AoMCwgV0RUX0RDKTsJCS8qIEVuYWJsZSB3YXRjaGRvZyAqLworCisJaW5iX3AoV0RUX0RDKTsJCQkvKiBEaXNhYmxlIHdhdGNoZG9nICovCisJb3V0Yl9wKDAsIFdEVF9DTE9DSyk7CQkvKiAyLjA4MzNNSHogY2xvY2sgKi8KKwlpbmJfcChXRFRfQlVaWkVSKTsJCS8qIGRpc2FibGUgKi8KKwlpbmJfcChXRFRfT1BUT05PVFJTVCk7CQkvKiBkaXNhYmxlICovCisJaW5iX3AoV0RUX09QVE9SU1QpOwkJLyogZGlzYWJsZSAqLworCWluYl9wKFdEVF9QUk9HT1VUKTsJCS8qIGRpc2FibGUgKi8KKwl3ZHRwY2lfY3RyX21vZGUoMCwzKTsJCS8qIFByb2dyYW0gQ1RSMCBmb3IgTW9kZSAzOiBTcXVhcmUgV2F2ZSBHZW5lcmF0b3IgKi8KKwl3ZHRwY2lfY3RyX21vZGUoMSwyKTsJCS8qIFByb2dyYW0gQ1RSMSBmb3IgTW9kZSAyOiBSYXRlIEdlbmVyYXRvciAqLworCXdkdHBjaV9jdHJfbW9kZSgyLDEpOwkJLyogUHJvZ3JhbSBDVFIyIGZvciBNb2RlIDE6IFJldHJpZ2dlcmFibGUgT25lLVNob3QgKi8KKwl3ZHRwY2lfY3RyX2xvYWQoMCwyMDgzMyk7CS8qIGNvdW50IGF0IDEwMEh6ICovCisJd2R0cGNpX2N0cl9sb2FkKDEsd2RfaGVhcnRiZWF0KTsvKiBIZWFydGJlYXQgKi8KKwkvKiBETyBOT1QgTE9BRCBDVFIyIG9uIFBDSSBjYXJkISAtLSBKUE4gKi8KKwlvdXRiX3AoMCwgV0RUX0RDKTsJCS8qIEVuYWJsZSB3YXRjaGRvZyAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2R0cGNpX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl3ZHRwY2lfc3RvcDoKKyAqCisgKglTdG9wIHRoZSB3YXRjaGRvZyBkcml2ZXIuCisgKi8KKworc3RhdGljIGludCB3ZHRwY2lfc3RvcCAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogVHVybiB0aGUgY2FyZCBvZmYgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2R0cGNpX2xvY2ssIGZsYWdzKTsKKwlpbmJfcChXRFRfREMpOwkJCS8qIERpc2FibGUgd2F0Y2hkb2cgKi8KKwl3ZHRwY2lfY3RyX2xvYWQoMiwwKTsJCS8qIDAgbGVuZ3RoIHJlc2V0IHB1bHNlcyBub3cgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3ZHRwY2lfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXdkdHBjaV9waW5nOgorICoKKyAqCVJlbG9hZCBjb3VudGVyIG9uZSB3aXRoIHRoZSB3YXRjaGRvZyBoZWFydGJlYXQuIFdlIGRvbid0IGJvdGhlciByZWxvYWRpbmcKKyAqCXRoZSBjYXNjYWRlIGNvdW50ZXIuCisgKi8KKworc3RhdGljIGludCB3ZHRwY2lfcGluZyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBXcml0ZSBhIHdhdGNoZG9nIHZhbHVlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJndkdHBjaV9sb2NrLCBmbGFncyk7CisJaW5iX3AoV0RUX0RDKTsJCQkvKiBEaXNhYmxlIHdhdGNoZG9nICovCisJd2R0cGNpX2N0cl9tb2RlKDEsMik7CQkvKiBSZS1Qcm9ncmFtIENUUjEgZm9yIE1vZGUgMjogUmF0ZSBHZW5lcmF0b3IgKi8KKwl3ZHRwY2lfY3RyX2xvYWQoMSx3ZF9oZWFydGJlYXQpOy8qIEhlYXJ0YmVhdCAqLworCW91dGJfcCgwLCBXRFRfREMpOwkJLyogRW5hYmxlIHdhdGNoZG9nICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2R0cGNpX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl3ZHRwY2lfc2V0X2hlYXJ0YmVhdDoKKyAqCUB0OgkJdGhlIG5ldyBoZWFydGJlYXQgdmFsdWUgdGhhdCBuZWVkcyB0byBiZSBzZXQuCisgKgorICoJU2V0IGEgbmV3IGhlYXJ0YmVhdCB2YWx1ZSBmb3IgdGhlIHdhdGNoZG9nIGRldmljZS4gSWYgdGhlIGhlYXJ0YmVhdCB2YWx1ZSBpcworICoJaW5jb3JyZWN0IHdlIGtlZXAgdGhlIG9sZCB2YWx1ZSBhbmQgcmV0dXJuIC1FSU5WQUwuIElmIHN1Y2Nlc3NmdWxsIHdlCisgKglyZXR1cm4gMC4KKyAqLworc3RhdGljIGludCB3ZHRwY2lfc2V0X2hlYXJ0YmVhdChpbnQgdCkKK3sKKwkvKiBBcmJpdHJhcnksIGNhbid0IGZpbmQgdGhlIGNhcmQncyBsaW1pdHMgKi8KKwlpZiAoKHQgPCAxKSB8fCAodCA+IDY1NTM1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwloZWFydGJlYXQgPSB0OworCXdkX2hlYXJ0YmVhdCA9IHQgKiAxMDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJd2R0cGNpX2dldF9zdGF0dXM6CisgKglAc3RhdHVzOgkJdGhlIG5ldyBzdGF0dXMuCisgKgorICoJRXh0cmFjdCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGZyb20gYSBXRFQgd2F0Y2hkb2cgZGV2aWNlLiBUaGVyZSBhcmUKKyAqCXNldmVyYWwgYm9hcmQgdmFyaWFudHMgc28gd2UgaGF2ZSB0byBrbm93IHdoaWNoIGJpdHMgYXJlIHZhbGlkLiBTb21lCisgKgliaXRzIGRlZmF1bHQgdG8gb25lIGFuZCBzb21lIHRvIHplcm8gaW4gb3JkZXIgdG8gYmUgbWF4aW1hbGx5IHBhaW5mdWwuCisgKgorICoJd2UgdGhlbiBtYXAgdGhlIGJpdHMgb250byB0aGUgc3RhdHVzIGlvY3RsIGZsYWdzLgorICovCisKK3N0YXRpYyBpbnQgd2R0cGNpX2dldF9zdGF0dXMoaW50ICpzdGF0dXMpCit7CisJdW5zaWduZWQgY2hhciBuZXdfc3RhdHVzPWluYl9wKFdEVF9TUik7CisKKwkqc3RhdHVzPTA7CisJaWYgKG5ld19zdGF0dXMgJiBXRENfU1JfSVNPSTApCisJCSpzdGF0dXMgfD0gV0RJT0ZfRVhURVJOMTsKKwlpZiAobmV3X3N0YXR1cyAmIFdEQ19TUl9JU0lJMSkKKwkJKnN0YXR1cyB8PSBXRElPRl9FWFRFUk4yOworI2lmZGVmIENPTkZJR19XRFRfNTAxX1BDSQorCWlmICghKG5ld19zdGF0dXMgJiBXRENfU1JfVEdPT0QpKQorCQkqc3RhdHVzIHw9IFdESU9GX09WRVJIRUFUOworCWlmICghKG5ld19zdGF0dXMgJiBXRENfU1JfUFNVT1ZFUikpCisJCSpzdGF0dXMgfD0gV0RJT0ZfUE9XRVJPVkVSOworCWlmICghKG5ld19zdGF0dXMgJiBXRENfU1JfUFNVVU5EUikpCisJCSpzdGF0dXMgfD0gV0RJT0ZfUE9XRVJVTkRFUjsKKwlpZiAodGFjaG9tZXRlcikgeworCQlpZiAoIShuZXdfc3RhdHVzICYgV0RDX1NSX0ZBTkdPT0QpKQorCQkJKnN0YXR1cyB8PSBXRElPRl9GQU5GQVVMVDsKKwl9CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDFfUENJICovCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfV0RUXzUwMV9QQ0kKKy8qKgorICoJd2R0cGNpX2dldF90ZW1wZXJhdHVyZToKKyAqCisgKglSZXBvcnRzIHRoZSB0ZW1wZXJhdHVyZSBpbiBkZWdyZWVzIEZhaHJlbmhlaXQuIFRoZSBBUEkgaXMgaW4KKyAqCWZhcmVuaGVpdC4gSXQgd2FzIGRlc2lnbmVkIGJ5IGFuIGltcGVyaWFsIG1lYXN1cmVtZW50IGx1ZGRpdGUuCisgKi8KKworc3RhdGljIGludCB3ZHRwY2lfZ2V0X3RlbXBlcmF0dXJlKGludCAqdGVtcGVyYXR1cmUpCit7CisJdW5zaWduZWQgc2hvcnQgYz1pbmJfcChXRFRfUlQpOworCisJKnRlbXBlcmF0dXJlID0gKGMgKiAxMSAvIDE1KSArIDc7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDFfUENJICovCisKKy8qKgorICoJd2R0cGNpX2ludGVycnVwdDoKKyAqCUBpcnE6CQlJbnRlcnJ1cHQgbnVtYmVyCisgKglAZGV2X2lkOglVbnVzZWQgYXMgd2UgZG9uJ3QgYWxsb3cgbXVsdGlwbGUgZGV2aWNlcy4KKyAqCUByZWdzOgkJVW51c2VkLgorICoKKyAqCUhhbmRsZSBhbiBpbnRlcnJ1cHQgZnJvbSB0aGUgYm9hcmQuIFRoZXNlIGFyZSByYWlzZWQgd2hlbiB0aGUgc3RhdHVzCisgKgltYXAgY2hhbmdlcyBpbiB3aGF0IHRoZSBib2FyZCBjb25zaWRlcnMgYW4gaW50ZXJlc3Rpbmcgd2F5LiBUaGF0IG1lYW5zCisgKglhIGZhaWx1cmUgY29uZGl0aW9uIG9jY3VycmluZy4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2R0cGNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qCisJICoJUmVhZCB0aGUgc3RhdHVzIHJlZ2lzdGVyIHNlZSB3aGF0IGlzIHVwIGFuZAorCSAqCXRoZW4gcHJpbnRrIGl0LgorCSAqLworCXVuc2lnbmVkIGNoYXIgc3RhdHVzPWluYl9wKFdEVF9TUik7CisKKwlwcmludGsoS0VSTl9DUklUIFBGWCAic3RhdHVzICVkXG4iLCBzdGF0dXMpOworCisjaWZkZWYgQ09ORklHX1dEVF81MDFfUENJCisJaWYgKCEoc3RhdHVzICYgV0RDX1NSX1RHT09EKSkKKyAJCXByaW50ayhLRVJOX0NSSVQgUEZYICJPdmVyaGVhdCBhbGFybS4oJWQpXG4iLGluYl9wKFdEVF9SVCkpOworCWlmICghKHN0YXR1cyAmIFdEQ19TUl9QU1VPVkVSKSkKKyAJCXByaW50ayhLRVJOX0NSSVQgUEZYICJQU1Ugb3ZlciB2b2x0YWdlLlxuIik7CisJaWYgKCEoc3RhdHVzICYgV0RDX1NSX1BTVVVORFIpKQorIAkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlBTVSB1bmRlciB2b2x0YWdlLlxuIik7CisJaWYgKHRhY2hvbWV0ZXIpIHsKKwkJaWYgKCEoc3RhdHVzICYgV0RDX1NSX0ZBTkdPT0QpKQorCQkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlBvc3NpYmxlIGZhbiBmYXVsdC5cbiIpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfV0RUXzUwMV9QQ0kgKi8KKwlpZiAoIShzdGF0dXMmV0RDX1NSX1dDQ1IpKQorI2lmZGVmIFNPRlRXQVJFX1JFQk9PVAorI2lmZGVmIE9OTFlfVEVTVElORworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiV291bGQgUmVib290LlxuIik7CisjZWxzZQorCQlwcmludGsoS0VSTl9DUklUIFBGWCAiSW5pdGlhdGluZyBzeXN0ZW0gcmVib290LlxuIik7CisJCW1hY2hpbmVfcmVzdGFydChOVUxMKTsKKyNlbmRpZgorI2Vsc2UKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlJlc2V0IGluIDVtcy5cbiIpOworI2VuZGlmCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qKgorICoJd2R0cGNpX3dyaXRlOgorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSB3YXRjaGRvZworICoJQGJ1ZjogYnVmZmVyIHRvIHdyaXRlICh1bnVzZWQgYXMgZGF0YSBkb2VzIG5vdCBtYXR0ZXIgaGVyZQorICoJQGNvdW50OiBjb3VudCBvZiBieXRlcworICoJQHBwb3M6IHBvaW50ZXIgdG8gdGhlIHBvc2l0aW9uIHRvIHdyaXRlLiBObyBzZWVrcyBhbGxvd2VkCisgKgorICoJQSB3cml0ZSB0byBhIHdhdGNoZG9nIGRldmljZSBpcyBkZWZpbmVkIGFzIGEga2VlcGFsaXZlIHNpZ25hbC4gQW55CisgKgl3cml0ZSBvZiBkYXRhIHdpbGwgZG8sIGFzIHdlIHdlIGRvbid0IGRlZmluZSBjb250ZW50IG1lYW5pbmcuCisgKi8KKworc3RhdGljIHNzaXplX3Qgd2R0cGNpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoY291bnQpIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZihnZXRfdXNlcihjLCBidWYraSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKwkJd2R0cGNpX3BpbmcoKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICoJd2R0cGNpX2lvY3RsOgorICoJQGlub2RlOiBpbm9kZSBvZiB0aGUgZGV2aWNlCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIGRldmljZQorICoJQGNtZDogd2F0Y2hkb2cgY29tbWFuZAorICoJQGFyZzogYXJndW1lbnQgcG9pbnRlcgorICoKKyAqCVRoZSB3YXRjaGRvZyBBUEkgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgZnVuY3Rpb25zIGZvciBhbGwgd2F0Y2hkb2dzCisgKglhY2NvcmRpbmcgdG8gdGhlaXIgYXZhaWxhYmxlIGZlYXR1cmVzLiBXZSBvbmx5IGFjdHVhbGx5IHVzZWZ1bGx5IHN1cHBvcnQKKyAqCXF1ZXJ5aW5nIGNhcGFiaWxpdGllcyBhbmQgY3VycmVudCBzdGF0dXMuCisgKi8KKworc3RhdGljIGludCB3ZHRwY2lfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG5ld19oZWFydGJlYXQ7CisJaW50IHN0YXR1czsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPQkJV0RJT0ZfU0VUVElNRU9VVHwKKwkJCQkJV0RJT0ZfTUFHSUNDTE9TRXwKKwkJCQkJV0RJT0ZfS0VFUEFMSVZFUElORywKKwkJLmZpcm13YXJlX3ZlcnNpb24gPQkxLAorCQkuaWRlbnRpdHkgPQkJIlBDSS1XRFQ1MDAvNTAxIiwKKwl9OworCisJLyogQWRkIG9wdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBjYXJkIHdlIGhhdmUgKi8KKwlpZGVudC5vcHRpb25zIHw9IChXRElPRl9FWFRFUk4xfFdESU9GX0VYVEVSTjIpOworI2lmZGVmIENPTkZJR19XRFRfNTAxX1BDSQorCWlkZW50Lm9wdGlvbnMgfD0gKFdESU9GX09WRVJIRUFUfFdESU9GX1BPV0VSVU5ERVJ8V0RJT0ZfUE9XRVJPVkVSKTsKKwlpZiAodGFjaG9tZXRlcikKKwkJaWRlbnQub3B0aW9ucyB8PSBXRElPRl9GQU5GQVVMVDsKKyNlbmRpZiAvKiBDT05GSUdfV0RUXzUwMV9QQ0kgKi8KKworCXN3aXRjaChjbWQpCisJeworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpPy1FRkFVTFQ6MDsKKworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJCXdkdHBjaV9nZXRfc3RhdHVzKCZzdGF0dXMpOworCQkJcmV0dXJuIHB1dF91c2VyKHN0YXR1cywgcCk7CisJCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKwkJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCQl3ZHRwY2lfcGluZygpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJCWlmIChnZXRfdXNlcihuZXdfaGVhcnRiZWF0LCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHdkdHBjaV9zZXRfaGVhcnRiZWF0KG5ld19oZWFydGJlYXQpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl3ZHRwY2lfcGluZygpOworCQkJLyogRmFsbCAqLworCQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCQlyZXR1cm4gcHV0X3VzZXIoaGVhcnRiZWF0LCBwKTsKKwl9Cit9CisKKy8qKgorICoJd2R0cGNpX29wZW46CisgKglAaW5vZGU6IGlub2RlIG9mIGRldmljZQorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIGRldmljZQorICoKKyAqCVRoZSB3YXRjaGRvZyBkZXZpY2UgaGFzIGJlZW4gb3BlbmVkLiBUaGUgd2F0Y2hkb2cgZGV2aWNlIGlzIHNpbmdsZQorICoJb3BlbiBhbmQgb24gb3BlbmluZyB3ZSBsb2FkIHRoZSBjb3VudGVycy4gQ291bnRlciB6ZXJvIGlzIGEgMTAwSHoKKyAqCWNhc2NhZGUsIGludG8gY291bnRlciAxIHdoaWNoIGRvd25jb3VudHMgdG8gcmVib290LiBXaGVuIHRoZSBjb3VudGVyCisgKgl0cmlnZ2VycyBjb3VudGVyIDIgZG93bmNvdW50cyB0aGUgbGVuZ3RoIG9mIHRoZSByZXNldCBwdWxzZSB3aGljaAorICoJc2V0IHNldCB0byBiZSBhcyBsb25nIGFzIHBvc3NpYmxlLgorICovCisKK3N0YXRpYyBpbnQgd2R0cGNpX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGRvd25fdHJ5bG9jaygmb3Blbl9zZW0pKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKG5vd2F5b3V0KSB7CisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJfQorCS8qCisJICoJQWN0aXZhdGUKKwkgKi8KKwl3ZHRwY2lfc3RhcnQoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKy8qKgorICoJd2R0cGNpX3JlbGVhc2U6CisgKglAaW5vZGU6IGlub2RlIHRvIGJvYXJkCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gYm9hcmQKKyAqCisgKglUaGUgd2F0Y2hkb2cgaGFzIGEgY29uZmlndXJhYmxlIEFQSS4gVGhlcmUgaXMgYSByZWxpZ2lvdXMgZGlzcHV0ZQorICoJYmV0d2VlbiBwZW9wbGUgd2hvIHdhbnQgdGhlaXIgd2F0Y2hkb2cgdG8gYmUgYWJsZSB0byBzaHV0IGRvd24gYW5kCisgKgl0aG9zZSB3aG8gd2FudCB0byBiZSBzdXJlIGlmIHRoZSB3YXRjaGRvZyBtYW5hZ2VyIGRpZXMgdGhlIG1hY2hpbmUKKyAqCXJlYm9vdHMuIEluIHRoZSBmb3JtZXIgY2FzZSB3ZSBkaXNhYmxlIHRoZSBjb3VudGVycywgaW4gdGhlIGxhdHRlcgorICoJY2FzZSB5b3UgaGF2ZSB0byBvcGVuIGl0IGFnYWluIHZlcnkgc29vbi4KKyAqLworCitzdGF0aWMgaW50IHdkdHBjaV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJd2R0cGNpX3N0b3AoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHRpbWVyISIpOworCQl3ZHRwY2lfcGluZygpOworCX0KKwlleHBlY3RfY2xvc2UgPSAwOworCXVwKCZvcGVuX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfV0RUXzUwMV9QQ0kKKy8qKgorICoJd2R0cGNpX3RlbXBfcmVhZDoKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgd2F0Y2hkb2cgYm9hcmQKKyAqCUBidWY6IGJ1ZmZlciB0byB3cml0ZSAxIGJ5dGUgaW50bworICoJQGNvdW50OiBsZW5ndGggb2YgYnVmZmVyCisgKglAcHRyOiBvZmZzZXQgKG5vIHNlZWsgYWxsb3dlZCkKKyAqCisgKglSZWFkIHJlcG9ydHMgdGhlIHRlbXBlcmF0dXJlIGluIGRlZ3JlZXMgRmFocmVuaGVpdC4gVGhlIEFQSSBpcyBpbgorICoJZmFocmVuaGVpdC4gSXQgd2FzIGRlc2lnbmVkIGJ5IGFuIGltcGVyaWFsIG1lYXN1cmVtZW50IGx1ZGRpdGUuCisgKi8KKworc3RhdGljIHNzaXplX3Qgd2R0cGNpX3RlbXBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnB0cikKK3sKKwlpbnQgdGVtcGVyYXR1cmU7CisKKwlpZiAod2R0cGNpX2dldF90ZW1wZXJhdHVyZSgmdGVtcGVyYXR1cmUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X3RvX3VzZXIgKGJ1ZiwgJnRlbXBlcmF0dXJlLCAxKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKgl3ZHRwY2lfdGVtcF9vcGVuOgorICoJQGlub2RlOiBpbm9kZSBvZiBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byBkZXZpY2UKKyAqCisgKglUaGUgdGVtcGVyYXR1cmUgZGV2aWNlIGhhcyBiZWVuIG9wZW5lZC4KKyAqLworCitzdGF0aWMgaW50IHdkdHBjaV90ZW1wX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisvKioKKyAqCXdkdHBjaV90ZW1wX3JlbGVhc2U6CisgKglAaW5vZGU6IGlub2RlIHRvIGJvYXJkCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gYm9hcmQKKyAqCisgKglUaGUgdGVtcGVyYXR1cmUgZGV2aWNlIGhhcyBiZWVuIGNsb3NlZC4KKyAqLworCitzdGF0aWMgaW50IHdkdHBjaV90ZW1wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDFfUENJICovCisKKy8qKgorICoJbm90aWZ5X3N5czoKKyAqCUB0aGlzOiBvdXIgbm90aWZpZXIgYmxvY2sKKyAqCUBjb2RlOiB0aGUgZXZlbnQgYmVpbmcgcmVwb3J0ZWQKKyAqCUB1bnVzZWQ6IHVudXNlZAorICoKKyAqCU91ciBub3RpZmllciBpcyBjYWxsZWQgb24gc3lzdGVtIHNodXRkb3ducy4gV2Ugd2FudCB0byB0dXJuIHRoZSBjYXJkCisgKglvZmYgYXQgcmVib290IG90aGVyd2lzZSB0aGUgbWFjaGluZSB3aWxsIHJlYm9vdCBhZ2FpbiBkdXJpbmcgbWVtb3J5CisgKgl0ZXN0IG9yIHdvcnNlIHlldCBkdXJpbmcgdGhlIGZvbGxvd2luZyBmc2NrLiBUaGlzIHdvdWxkIHN1Y2ssIGluIGZhY3QKKyAqCXRydXN0IG1lIC0gaWYgaXQgaGFwcGVucyBpdCBkb2VzIHN1Y2suCisgKi8KKworc3RhdGljIGludCB3ZHRwY2lfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwl2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGU9PVNZU19ET1dOIHx8IGNvZGU9PVNZU19IQUxUKSB7CisJCS8qIFR1cm4gdGhlIGNhcmQgb2ZmICovCisJCXdkdHBjaV9zdG9wKCk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqCUtlcm5lbCBJbnRlcmZhY2VzCisgKi8KKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3ZHRwY2lfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IHdkdHBjaV93cml0ZSwKKwkuaW9jdGwJCT0gd2R0cGNpX2lvY3RsLAorCS5vcGVuCQk9IHdkdHBjaV9vcGVuLAorCS5yZWxlYXNlCT0gd2R0cGNpX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2R0cGNpX21pc2NkZXYgPSB7CisJLm1pbm9yCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJPSAid2F0Y2hkb2ciLAorCS5mb3BzCT0gJndkdHBjaV9mb3BzLAorfTsKKworI2lmZGVmIENPTkZJR19XRFRfNTAxX1BDSQorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0cGNpX3RlbXBfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gd2R0cGNpX3RlbXBfcmVhZCwKKwkub3BlbgkJPSB3ZHRwY2lfdGVtcF9vcGVuLAorCS5yZWxlYXNlCT0gd2R0cGNpX3RlbXBfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB0ZW1wX21pc2NkZXYgPSB7CisJLm1pbm9yCT0gVEVNUF9NSU5PUiwKKwkubmFtZQk9ICJ0ZW1wZXJhdHVyZSIsCisJLmZvcHMJPSAmd2R0cGNpX3RlbXBfZm9wcywKK307CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDFfUENJICovCisKKy8qCisgKglUaGUgV0RUIGNhcmQgbmVlZHMgdG8gbGVhcm4gYWJvdXQgc29mdCBzaHV0ZG93bnMgaW4gb3JkZXIgdG8KKyAqCXR1cm4gdGhlIHRpbWVib21iIHJlZ2lzdGVycyBvZmYuCisgKi8KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3ZHRwY2lfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB3ZHRwY2lfbm90aWZ5X3N5cywKK307CisKKworc3RhdGljIGludCBfX2RldmluaXQgd2R0cGNpX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IHJldCA9IC1FSU87CisKKwlkZXZfY291bnQrKzsKKwlpZiAoZGV2X2NvdW50ID4gMSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAidGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyAxIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChwY2lfZW5hYmxlX2RldmljZSAoZGV2KSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiTm90IHBvc3NpYmxlIHRvIGVuYWJsZSBQQ0kgRGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHBjaV9yZXNvdXJjZV9zdGFydCAoZGV2LCAyKSA9PSAweDAwMDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIk5vIEkvTy1BZGRyZXNzIGZvciBjYXJkIGRldGVjdGVkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfcGNpOworCX0KKworCXNlbWFfaW5pdCgmb3Blbl9zZW0sIDEpOworCXNwaW5fbG9ja19pbml0KCZ3ZHRwY2lfbG9jayk7CisKKwlpcnEgPSBkZXYtPmlycTsKKwlpbyA9IHBjaV9yZXNvdXJjZV9zdGFydCAoZGV2LCAyKTsKKworCWlmIChyZXF1ZXN0X3JlZ2lvbiAoaW8sIDE2LCAid2R0X3BjaSIpID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwgaW8pOworCQlnb3RvIG91dF9wY2k7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxIChpcnEsIHdkdHBjaV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorCQkJICJ3ZHRfcGNpIiwgJndkdHBjaV9taXNjZGV2KSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiSVJRICVkIGlzIG5vdCBmcmVlXG4iLCBpcnEpOworCQlnb3RvIG91dF9yZWc7CisJfQorCisJcHJpbnRrICgiUENJLVdEVDUwMC81MDEgKFBDSS1XREctQ1NNKSBkcml2ZXIgMC4xMCBhdCAweCUwNHggKEludGVycnVwdCAlZClcbiIsCisJCWlvLCBpcnEpOworCisJLyogQ2hlY2sgdGhhdCB0aGUgaGVhcnRiZWF0IHZhbHVlIGlzIHdpdGhpbiBpdCdzIHJhbmdlIDsgaWYgbm90IHJlc2V0IHRvIHRoZSBkZWZhdWx0ICovCisJaWYgKHdkdHBjaV9zZXRfaGVhcnRiZWF0KGhlYXJ0YmVhdCkpIHsKKwkJd2R0cGNpX3NldF9oZWFydGJlYXQoV0RfVElNTyk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJoZWFydGJlYXQgdmFsdWUgbXVzdCBiZSAwPGhlYXJ0YmVhdDw2NTUzNiwgdXNpbmcgJWRcbiIsCisJCQlXRF9USU1PKTsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIgKCZ3ZHRwY2lfbm90aWZpZXIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsIHJldCk7CisJCWdvdG8gb3V0X2lycTsKKwl9CisKKyNpZmRlZiBDT05GSUdfV0RUXzUwMV9QQ0kKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyICgmdGVtcF9taXNjZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCVRFTVBfTUlOT1IsIHJldCk7CisJCWdvdG8gb3V0X3JidDsKKwl9CisjZW5kaWYgLyogQ09ORklHX1dEVF81MDFfUENJICovCisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyICgmd2R0cGNpX21pc2NkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCWdvdG8gb3V0X21pc2M7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkLiBoZWFydGJlYXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCisJCWhlYXJ0YmVhdCwgbm93YXlvdXQpOworI2lmZGVmIENPTkZJR19XRFRfNTAxX1BDSQorCXByaW50ayhLRVJOX0lORk8gIndkdDogRmFuIFRhY2hvbWV0ZXIgaXMgJXNcbiIsICh0YWNob21ldGVyID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIikpOworI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxX1BDSSAqLworCisJcmV0ID0gMDsKK291dDoKKwlyZXR1cm4gcmV0OworCitvdXRfbWlzYzoKKyNpZmRlZiBDT05GSUdfV0RUXzUwMV9QQ0kKKwltaXNjX2RlcmVnaXN0ZXIoJnRlbXBfbWlzY2Rldik7CitvdXRfcmJ0OgorI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxX1BDSSAqLworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRwY2lfbm90aWZpZXIpOworb3V0X2lycToKKwlmcmVlX2lycShpcnEsICZ3ZHRwY2lfbWlzY2Rldik7CitvdXRfcmVnOgorCXJlbGVhc2VfcmVnaW9uIChpbywgMTYpOworb3V0X3BjaToKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwlnb3RvIG91dDsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgd2R0cGNpX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCS8qIGhlcmUgd2UgYXNzdW1lIG9ubHkgb25lIGRldmljZSB3aWxsIGV2ZXIgaGF2ZQorCSAqIGJlZW4gcGlja2VkIHVwIGFuZCByZWdpc3RlcmVkIGJ5IHByb2JlIGZ1bmN0aW9uICovCisJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRwY2lfbWlzY2Rldik7CisjaWZkZWYgQ09ORklHX1dEVF81MDFfUENJCisJbWlzY19kZXJlZ2lzdGVyKCZ0ZW1wX21pc2NkZXYpOworI2VuZGlmIC8qIENPTkZJR19XRFRfNTAxX1BDSSAqLworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRwY2lfbm90aWZpZXIpOworCWZyZWVfaXJxKGlycSwgJndkdHBjaV9taXNjZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihpbywgMTYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlkZXZfY291bnQtLTsKK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgd2R0cGNpX3BjaV90YmxbXSA9IHsKKwl7CisJCS52ZW5kb3IJICAgPSBQQ0lfVkVORE9SX0lEX0FDQ0VTU0lPLAorCQkuZGV2aWNlCSAgID0gUENJX0RFVklDRV9JRF9XREdfQ1NNLAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJfSwKKwl7IDAsIH0sIC8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHdkdHBjaV9wY2lfdGJsKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgd2R0cGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAid2R0X3BjaSIsCisJLmlkX3RhYmxlCT0gd2R0cGNpX3BjaV90YmwsCisJLnByb2JlCQk9IHdkdHBjaV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdkdHBjaV9yZW1vdmVfb25lKSwKK307CisKKworLyoqCisgKgl3ZHRwY2lfY2xlYW51cDoKKyAqCisgKglVbmxvYWQgdGhlIHdhdGNoZG9nLiBZb3UgY2Fubm90IGRvIHRoaXMgd2l0aCBhbnkgZmlsZSBoYW5kbGVzIG9wZW4uCisgKglJZiB5b3VyIHdhdGNoZG9nIGlzIHNldCB0byBjb250aW51ZSB0aWNraW5nIG9uIGNsb3NlIGFuZCB5b3UgdW5sb2FkCisgKglpdCwgd2VsbCBpdCBrZWVwcyB0aWNraW5nLiBXZSB3b24ndCBnZXQgdGhlIGludGVycnVwdCBidXQgdGhlIGJvYXJkCisgKgl3aWxsIG5vdCB0b3VjaCBQQyBtZW1vcnkgc28gYWxsIGlzIGZpbmUuIFlvdSBqdXN0IGhhdmUgdG8gbG9hZCBhIG5ldworICoJbW9kdWxlIGluIHh4IHNlY29uZHMgb3IgcmVib290LgorICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3ZHRwY2lfY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJndkdHBjaV9kcml2ZXIpOworfQorCisKKy8qKgorICogCXdkdHBjaV9pbml0OgorICoKKyAqCVNldCB1cCB0aGUgV0RUIHdhdGNoZG9nIGJvYXJkLiBBbGwgd2UgaGF2ZSB0byBkbyBpcyBncmFiIHRoZQorICoJcmVzb3VyY2VzIHdlIHJlcXVpcmUgYW5kIGJpdGNoIGlmIGFueW9uZSBiZWF0IHVzIHRvIHRoZW0uCisgKglUaGUgb3BlbigpIGZ1bmN0aW9uIHdpbGwgYWN0dWFsbHkga2ljayB0aGUgYm9hcmQgb2ZmLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHdkdHBjaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIgKCZ3ZHRwY2lfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdCh3ZHRwY2lfaW5pdCk7Cittb2R1bGVfZXhpdCh3ZHRwY2lfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIkpQIE5vbGxtYW5uLCBBbGFuIENveCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHRoZSBJQ1MgUENJLVdEVDUwMC81MDEgd2F0Y2hkb2cgY2FyZHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFRFTVBfTUlOT1IpOwo=